ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmVlZjgKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsNTYgQEAKKy0tLQorTGFuZ3VhZ2U6ICAgICAgICBDcHAKKyMgQmFzZWRPblN0eWxlOiAgTExWTQorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC0yCitDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDIKK0FsaWduRXNjYXBlZE5ld2xpbmVzTGVmdDogZmFsc2UKK0FsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQorQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IGZhbHNlCitBbGxvd1Nob3J0QmxvY2tzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lOiBmYWxzZQorQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0Fsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnM6IHRydWUKK0Fsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogdHJ1ZQorQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnM6IHRydWUKK0JyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9yczogdHJ1ZQorQnJlYWtDb25zdHJ1Y3RvckluaXRpYWxpemVyc0JlZm9yZUNvbW1hOiBmYWxzZQorQmluUGFja1BhcmFtZXRlcnM6IGZhbHNlCitDb2x1bW5MaW1pdDogICAgIDEwMAorQ29uc3RydWN0b3JJbml0aWFsaXplckFsbE9uT25lTGluZU9yT25lUGVyTGluZTogdHJ1ZQorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luZGVudENhc2VMYWJlbHM6IGZhbHNlCitJbmRlbnRXcmFwcGVkRnVuY3Rpb25OYW1lczogZmFsc2UKK0luZGVudEZ1bmN0aW9uRGVjbGFyYXRpb25BZnRlclR5cGU6IGZhbHNlCitNYXhFbXB0eUxpbmVzVG9LZWVwOiAxCitLZWVwRW1wdHlMaW5lc0F0VGhlU3RhcnRPZkJsb2NrczogdHJ1ZQorTmFtZXNwYWNlSW5kZW50YXRpb246IE5vbmUKK09iakNTcGFjZUFmdGVyUHJvcGVydHk6IGZhbHNlCitPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q6IHRydWUKK1BlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlcjogMTkwCitQZW5hbHR5QnJlYWtDb21tZW50OiAzMDAKK1BlbmFsdHlCcmVha1N0cmluZzogMTAwMDAKK1BlbmFsdHlCcmVha0ZpcnN0TGVzc0xlc3M6IDEyMAorUGVuYWx0eUV4Y2Vzc0NoYXJhY3RlcjogMTAwMDAwMAorUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmU6IDEyMDAKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1NwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM6IDEKK0NwcDExQnJhY2VkTGlzdFN0eWxlOiB0cnVlCitTdGFuZGFyZDogICAgICAgIEF1dG8KK0luZGVudFdpZHRoOiAgICAgMgorVGFiV2lkdGg6ICAgICAgICA0CitVc2VUYWI6ICAgICAgICAgIE5ldmVyCitCcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCitTcGFjZXNJblBhcmVudGhlc2VzOiBmYWxzZQorU3BhY2VzSW5BbmdsZXM6ICBmYWxzZQorU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM6IGZhbHNlCitTcGFjZXNJbkNTdHlsZUNhc3RQYXJlbnRoZXNlczogZmFsc2UKK1NwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHM6IHRydWUKK1NwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9yczogdHJ1ZQorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDQKK0NvbW1lbnRQcmFnbWFzOiAgJ14gSVdZVSBwcmFnbWE6JworRm9yRWFjaE1hY3JvczogICBbIGZvcmVhY2gsIFFfRk9SRUFDSCwgQk9PU1RfRk9SRUFDSCBdCitTcGFjZUJlZm9yZVBhcmVuczogQ29udHJvbFN0YXRlbWVudHMKK0Rpc2FibGVGb3JtYXQ6ICAgZmFsc2UKKy4uLgorCmRpZmYgLS1naXQgYS8uZG9ja2VyaWdub3JlIGIvLmRvY2tlcmlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJlY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvLmRvY2tlcmlnbm9yZQpAQCAtMCwwICsxIEBACisuZ2l0LwpkaWZmIC0tZ2l0IGEvLmVkaXRvcmNvbmZpZyBiLy5lZGl0b3Jjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYxMTc2MgotLS0gL2Rldi9udWxsCisrKyBiLy5lZGl0b3Jjb25maWcKQEAgLTAsMCArMSwxMTIgQEAKKyMKKyMjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyMKKyMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKyMjCisjCisKKyMgRWRpdG9yQ29uZmlnOiBodHRwOi8vZWRpdG9yY29uZmlnLm9yZworIyBzZWUgZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKKworcm9vdCA9IHRydWUKKworWypdCitlbmRfb2ZfbGluZSA9IGxmCitjaGFyc2V0ID0gdXRmLTgKK3RyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWUKK2luc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZQorCisjIEFjdGlvblNjcmlwdAorIyBbKi5hc10KKworIyBDCisjIFsqLmNdCisKKyMgQysrCitbKi5jcHBdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgQy1TaGFycAorIyBbKi5jc10KKworIyBECisjIFsqLmRdCisKKyMgRXJsYW5nCisjIFsqLmVybF0KKworIyBHby1sYW5nCitbKi5nb10KK2luZGVudF9zdHlsZSA9IHRhYgoraW5kZW50X3NpemUgPSA4CisKKyMgQyBoZWFkZXIgZmlsZXMKKyMgWyouaF0KKworIyBIYXNrZWxsCisjIFsqLmhzXQorCisjIEhheGUKKyMgWyouaHhdCisKKyMgSmF2YQorIyBbKi5qYXZhXQorCisjIEphdmFzY3JpcHQKK1sqLmpzXQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgorCisjIEpTT04KK1sqLmpzb25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgTHVhCisjIFsqLmx1YV0KKworWyoubWFya2Rvd25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworWyoubWRdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworIyBPQ2FtbAorIyBbKi5tbF0KKworIyBEZWxwaGkgUGFzY2FsCisjIFsqLnBhc10KKworIyBQSFAKKyMgWyoucGhwXQorCisjIFBlcmwKKyMgWyoucG1dCisKKyMgUHl0aG9uCisjIFsqLnB5XQorCisjIFJ1YnkKKyMgWyoucmJdCisKKyMgVHlwZXNjcmlwdAorIyBbKi50c10KKworIyBYTUwKKyMgWyoueG1sXQpkaWZmIC0tZ2l0IGEvLmVzbGludGlnbm9yZSBiLy5lc2xpbnRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMmRiYQotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRpZ25vcmUKQEAgLTAsMCArMSw5IEBACisjIFRPRE86IFVzZSBlc2xpbnQgb24ganMgbGliIGFuZCBnZW5lcmF0ZWQgY29kZQorCisjIElnbm9yZSBsaWIvanMgZm9yIG5vdywgd2hpY2ggdXNlcyBqc2hpbnQgY3VycmVudGx5CitsaWIvanMvKgorIyBJZ25vcmUgYWxsIGdlbmVyYXRlZCBjb2RlIGZvciBub3cKKyoqL2dlbi0qCisKKyMgRG9uJ3QgbGludCBuZXN0ZWQgbm9kZV9tb2R1bGVzCisqKi9ub2RlX21vZHVsZXMKZGlmZiAtLWdpdCBhLy5lc2xpbnRyYy5qc29uIGIvLmVzbGludHJjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhZTgyMAotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRyYy5qc29uCkBAIC0wLDAgKzEsMjQgQEAKK3sKKyAgImVudiI6IHsKKyAgICAiZXM2IjogdHJ1ZSwKKyAgICAibm9kZSI6IHRydWUKKyAgfSwKKyAgImV4dGVuZHMiOiBbCisgICAgImVzbGludDpyZWNvbW1lbmRlZCIsCisgICAgInBsdWdpbjpwcmV0dGllci9yZWNvbW1lbmRlZCIKKyAgXSwKKyAgInBhcnNlck9wdGlvbnMiOiB7CisgICAgImVjbWFWZXJzaW9uIjogMjAxNworICB9LAorICAicnVsZXMiOiB7CisgICAgIm5vLWNvbnNvbGUiOiAib2ZmIiwKKyAgICAibm8tdmFyIjogImVycm9yIiwKKyAgICAicHJlZmVyLWNvbnN0IjogImVycm9yIiwKKyAgICAibm8tY29uc3RhbnQtY29uZGl0aW9uIjogWworICAgICAgImVycm9yIiwKKyAgICAgIHsKKyAgICAgICAgImNoZWNrTG9vcHMiOiBmYWxzZQorICAgICAgfQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvLmdpdGF0dHJpYnV0ZXMgYi8uZ2l0YXR0cmlidXRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZhNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGF0dHJpYnV0ZXMKQEAgLTAsMCArMSBAQAorKiB0ZXh0PWF1dG8KZGlmZiAtLWdpdCBhLy5naXRodWIvc3RhbGUueW1sIGIvLmdpdGh1Yi9zdGFsZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNGFmYgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvc3RhbGUueW1sCkBAIC0wLDAgKzEsNTkgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgcHJvYm90LXN0YWxlIC0gaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9zdGFsZQorCisjIE51bWJlciBvZiBkYXlzIG9mIGluYWN0aXZpdHkgYmVmb3JlIGFuIElzc3VlIG9yIFB1bGwgUmVxdWVzdCBiZWNvbWVzIHN0YWxlCitkYXlzVW50aWxTdGFsZTogNjAKKworIyBOdW1iZXIgb2YgZGF5cyBvZiBpbmFjdGl2aXR5IGJlZm9yZSBhbiBJc3N1ZSBvciBQdWxsIFJlcXVlc3Qgd2l0aCB0aGUgc3RhbGUgbGFiZWwgaXMgY2xvc2VkLgorIyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZS4gSWYgZGlzYWJsZWQsIGlzc3VlcyBzdGlsbCBuZWVkIHRvIGJlIGNsb3NlZCBtYW51YWxseSwgYnV0IHdpbGwgcmVtYWluIG1hcmtlZCBhcyBzdGFsZS4KK2RheXNVbnRpbENsb3NlOiA3CisKKyMgSXNzdWVzIG9yIFB1bGwgUmVxdWVzdHMgd2l0aCB0aGVzZSBsYWJlbHMgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHN0YWxlLiBTZXQgdG8gYFtdYCB0byBkaXNhYmxlCitleGVtcHRMYWJlbHM6CisgIC0gRG8gTm90IE1lcmdlCisgIC0gYmxvY2tlZAorICAtIHBpbm5lZAorICAtIHNlY3VyaXR5CisgIC0gIltTdGF0dXNdIE1heWJlIExhdGVyIgorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBwcm9qZWN0IChkZWZhdWx0cyB0byBmYWxzZSkKK2V4ZW1wdFByb2plY3RzOiBmYWxzZQorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBtaWxlc3RvbmUgKGRlZmF1bHRzIHRvIGZhbHNlKQorZXhlbXB0TWlsZXN0b25lczogZmFsc2UKKworIyBMYWJlbCB0byB1c2Ugd2hlbiBtYXJraW5nIGFzIHN0YWxlCitzdGFsZUxhYmVsOiB3b250Zml4CisKKyMgQ29tbWVudCB0byBwb3N0IHdoZW4gbWFya2luZyBhcyBzdGFsZS4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZQorbWFya0NvbW1lbnQ6ID4KKyAgVGhpcyBpc3N1ZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBzdGFsZSBiZWNhdXNlIGl0IGhhcyBub3QgaGFkCisgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaW4gNyBkYXlzIGlmIG5vIGZ1cnRoZXIgYWN0aXZpdHkgb2NjdXJzLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiByZW1vdmluZyB0aGUgc3RhbGUgbGFiZWwuCit1bm1hcmtDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaXMgbm8gbG9uZ2VyIHN0YWxlLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiBjbG9zaW5nIGEgc3RhbGUgSXNzdWUgb3IgUHVsbCBSZXF1ZXN0LgorY2xvc2VDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbG9zZWQgZHVlIHRvIGluYWN0aXZpdHkuCisgIFRoYW5rIHlvdSBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIExpbWl0IHRoZSBudW1iZXIgb2YgYWN0aW9ucyBwZXIgaG91ciwgZnJvbSAxLTMwLiBEZWZhdWx0IGlzIDMwCitsaW1pdFBlclJ1bjogMzAKKworIyBMaW1pdCB0byBvbmx5IGBpc3N1ZXNgIG9yIGBwdWxsc2AKKyMgb25seTogaXNzdWVzCisKKyMgT3B0aW9uYWxseSwgc3BlY2lmeSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGp1c3QgJ2lzc3Vlcycgb3IgJ3B1bGxzJzoKKyMgcHVsbHM6CisjICAgZGF5c1VudGlsU3RhbGU6IDMwCisjICAgbWFya0NvbW1lbnQ6ID4KKyMgICAgIFRoaXMgcHVsbCByZXF1ZXN0IGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHN0YWxlIGJlY2F1c2UgaXQgaGFzIG5vdCBoYWQKKyMgICAgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaWYgbm8gZnVydGhlciBhY3Rpdml0eSBvY2N1cnMuIFRoYW5rIHlvdQorIyAgICAgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBpc3N1ZXM6CisjICAgZXhlbXB0TGFiZWxzOgorIyAgICAgLSBjb25maXJtZWQKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGMwZjI5MzAuLmIzYTU5MjAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw4OSArMSwzOTYgQEAKLS9NYWtlZmlsZQotL01ha2VmaWxlLmluCi0vYWNsb2NhbC5tNAotL2F1dG9tNHRlLmNhY2hlCisjIGdlbmVyaWMgaWdub3JlcworKi5sYQorKi5sbworKi5vCisqLmRlcHMKKyouZGlyc3RhbXAKKyoubGlicworKi5sb2cKKyoudHJzCisqLnN1bworKi5weWMKKyouY2FjaGUKKyoudXNlcgorKi5pcGNoCisqLnNkZgorKi5qYXIKKyouZXhlCisqLmRsbAorKl9SZVNoYXJwZXIqCisqLm9wZW5zZGYKKyouc3dwCisqLmhpCisqfgordGFncworCisuKnByb2plY3QKKy5jbGFzc3BhdGgKKy5kdWIKKy5zZXR0aW5ncworLmNoZWNrc3R5bGUKK2p1bml0Ki5wcm9wZXJ0aWVzCisuaWRlYQorKi5pbWwKKyouaXByCisqLml3cworZ2VuLSoKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorYWNsb2NhbC5tNAorYWNpbmNsdWRlLm00CithcGFjaGUtdGhyaWZ0LXRlc3QtbGlicmFyeQorYXV0b200dGUuY2FjaGUKK2NtYWtlLSoKK2R1Yi5zZWxlY3Rpb25zLmpzb24KK2xpYmFwYWNoZS10aHJpZnQuYQorbm9kZV9tb2R1bGVzCitjb21waWxlCit0ZXN0LWRyaXZlcgorZXJsX2NyYXNoLmR1bXAKK3Byb2plY3QubG9jay5qc29uCisKKy5zb25hcgorLkRTX1N0b3JlCisuc3ZuCisudmFncmFudAorLnZzY29kZQorLnZzCisKKy9hY2xvY2FsL2xpYnRvb2wubTQKKy9hY2xvY2FsL2x0Ki5tNAogL2F1dG9zY2FuLmxvZwotL2NvbXBpbGVyL2NwcC8uZGVwcwotL2NvbXBpbGVyL2NwcC9NYWtlZmlsZQotL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5pbgorL2F1dG9zY2FuLSoubG9nCisvY21ha2VfKgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5kYgorL2NvbXBpbGVyL2NwcC9jb21waWxlci5WQy5WQy5vcGVuZGIKKy9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuY3BwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oCisvY29tcGlsZXIvY3BwL3Rlc3QvKnRlc3QKKy9jb21waWxlci9jcHAvdGVzdC90aHJpZnQtZ2VuLSoKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnQtYm9vdHN0cmFwCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL2dlbi5zdGFtcAorL2NvbXBpbGVyL2NwcC9EZWJ1ZworL2NvbXBpbGVyL2NwcC9SZWxlYXNlCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbGlicGFyc2UuYQorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwuY2MKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5LmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS5oaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvdmVyc2lvbi5oCiAvY29tcGlsZXIvY3BwL3RocmlmdAotL2NvbXBpbGVyL2NwcC8qLm8KIC9jb21waWxlci9jcHAvdGhyaWZ0bC5jYwogL2NvbXBpbGVyL2NwcC90aHJpZnR5LmNjCisvY29tcGlsZXIvY3BwL2xleC55eXRocmlmdGwuY2MKIC9jb21waWxlci9jcHAvdGhyaWZ0eS5oCi0vY29tcGlsZXIvY3BwL3ZlcnNpb24uaAorL2NvbXBpbGVyL2NwcC90aHJpZnR5LmhoCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oCiAvY29uZmlnLioKIC9jb25maWd1cmUKIC9jb25maWd1cmUubGluZW5vCiAvY29uZmlndXJlLnNjYW4KKy9jb250cmliLy52YWdyYW50LworL2NvbnRyaWIvZmIzMDMvY29uZmlnLmNhY2hlCisvY29udHJpYi9mYjMwMy9jb25maWcubG9nCisvY29udHJpYi9mYjMwMy9jb25maWcuc3RhdHVzCisvY29udHJpYi9mYjMwMy9jb25maWd1cmUKKy9jb250cmliL2ZiMzAzL2NwcC9saWJmYjMwMy5hCisvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLworL2NvbnRyaWIvZmIzMDMvcHkvYnVpbGQvCisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va1NlcnZpY2UtcmVtb3RlCisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va1NlcnZpY2UucHkKKy9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL19faW5pdF9fLnB5CisvY29udHJpYi9mYjMwMy9weS9mYjMwMy9jb25zdGFudHMucHkKKy9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL3R0eXBlcy5weQogL2RlcGNvbXAKLS9pZi9NYWtlZmlsZQotL2lmL01ha2VmaWxlLmluCiAvaW5zdGFsbC1zaAotL2xpYi9NYWtlZmlsZQotL2xpYi9NYWtlZmlsZS5pbgotL2xpYi9lcmwvZWJpbgotL2xpYi9jcHAvLmRlcHMKLS9saWIvY3BwLy5saWJzCi0vbGliL2NwcC9NYWtlZmlsZQotL2xpYi9jcHAvTWFrZWZpbGUuaW4KKy9saWIvY2wvYmFja3BvcnQtdXBkYXRlLnppcAorL2xpYi9jbC9saWIKKy9saWIvY2wvcnVuLXRlc3RzCisvbGliL2NsL3F1aWNrbGlzcC5saXNwCisvbGliL2NsL2V4dGVybmFscy8KKy9saWIvY2wvcnVuLXRlc3RzCisvbGliL2NsL3F1aWNrbGlzcC8KKy9saWIvY3BwL0RlYnVnLworL2xpYi9jcHAvRGVidWctbXQvCisvbGliL2NwcC9SZWxlYXNlLworL2xpYi9jcHAvUmVsZWFzZS1tdC8KKy9saWIvY3BwL3NyYy90aHJpZnQvcXQvbW9jX1RRVGNwU2VydmVyLmNwcAorL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9tb2NfX1RRVGNwU2VydmVyLmNwcAorL2xpYi9jcHAvc3JjL3RocmlmdC9jb25maWcuaAorL2xpYi9jcHAvc3JjL3RocmlmdC9zdGFtcC1oMgorL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsKKy9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xzVGVzdAorL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdAorL2xpYi9jcHAvdGVzdC9EZW5zZVByb3RvVGVzdAorL2xpYi9jcHAvdGVzdC9FbnVtVGVzdAorL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0CisvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0CisvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdAorL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QKKy9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdAorL2xpYi9jcHAvdGVzdC9SZWZsZWN0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QKKy9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdAorL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QKKy9saWIvY3BwL3Rlc3QvVEludGVycnVwdFRlc3QKKy9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdAorL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QKKy9saWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdAorL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0CisvbGliL2NwcC90ZXN0L1VuaXRUZXN0cworL2xpYi9jcHAvdGVzdC9abGliVGVzdAorL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QKKy9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3lfdGVzdAorL2xpYi9jcHAvdGVzdC9saW5rX3Rlc3QKKy9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yX3Rlc3QKKy9saWIvY3BwL3Rlc3QvdGVzdHMueG1sCiAvbGliL2NwcC9jb25jdXJyZW5jeV90ZXN0Ci0vbGliL2NwcC8qLm8KLS9saWIvY3BwLyoubGEKLS9saWIvY3BwLyoubG8KIC9saWIvY3BwLyoucGMKLS9saWIvY3NoYXJwL01ha2VmaWxlCi0vbGliL2NzaGFycC9NYWtlZmlsZS5pbgorL2xpYi9jcHAveDY0L0RlYnVnLworL2xpYi9jcHAveDY0L0RlYnVnLW10LworL2xpYi9jcHAveDY0L1JlbGVhc2UKKy9saWIvY3BwL3g2NC9SZWxlYXNlLW10CisvbGliL2NfZ2xpYi8qLmdjZGEKKy9saWIvY19nbGliLyouZ2NubworL2xpYi9jX2dsaWIvKi5sb1QKKy9saWIvY19nbGliL3NyYy90aHJpZnQvY29uZmlnLmgKKy9saWIvY19nbGliL3NyYy90aHJpZnQvc3RhbXAtaDMKKy9saWIvY19nbGliL3Rlc3QvKi5nY25vCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLnNoCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3R3cmFwcGVyLXRlc3QqCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbgorL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wKKy9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQKKy9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QKKy9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8KKy9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQKKy9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlcgorL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIKKy9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uCisvbGliL2NfZ2xpYi90aHJpZnRjLnBjCisvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjCisvbGliL2NzaGFycC8qKi9iaW4vCisvbGliL2NzaGFycC8qKi9vYmovCisvbGliL2NzaGFycC9zcmMvcGFja2FnZXMKKy9saWIvZC90ZXN0LyoucGVtCisvbGliL2QvbGlidGhyaWZ0ZCouYQorL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdAorL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdAorL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsKKy9saWIvZC90ZXN0L3N0cmVzc190ZXN0X3NlcnZlcgorL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50CisvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIKKy9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0CisvbGliL2QvdW5pdHRlc3QvCisvbGliL2RhcnQvY292ZXJhZ2UKKy9saWIvZGFydC8qKi8ucGFja2FnZXMKKy9saWIvZGFydC8qKi9wYWNrYWdlcworL2xpYi9kYXJ0LyoqLy5wdWIvCisvbGliL2RhcnQvKiovcHVic3BlYy5sb2NrCisvbGliL2RlbHBoaS90ZXN0L3NraXAvKi5yZXF1ZXN0CisvbGliL2RlbHBoaS90ZXN0L3NraXAvKi5yZXNwb25zZQorL2xpYi9kZWxwaGkvKiovKi5pZGVudGNhY2hlCisvbGliL2RlbHBoaS8qKi8qLmxvY2FsCisvbGliL2RlbHBoaS8qKi8qLmRjdQorL2xpYi9kZWxwaGkvKiovKi4yMDA3CisvbGliL2RlbHBoaS8qKi8qLmRwcm9qCisvbGliL2RlbHBoaS8qKi9jb2RlZ2VuLyouYmF0CisvbGliL2VybC8uZXVuaXQKKy9saWIvZXJsLy5nZW5lcmF0ZWQKKy9saWIvZXJsLy5yZWJhci8KKy9saWIvZXJsL2RlcHMvCisvbGliL2VybC9lYmluCisvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMKKy9saWIvZXJsL3Rlc3QvKi5iZWFtCisvbGliL2VybC90ZXN0LyouaHJsCisvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGhvdXQudGhyaWZ0CisvbGliL2hheGUvdGVzdC9iaW4KKy9saWIvaGF4ZS90ZXN0L2RhdGEudG1wCiAvbGliL2hzL2Rpc3QKLS9saWIvamF2YS9NYWtlZmlsZQotL2xpYi9qYXZhL01ha2VmaWxlLmluCisvbGliL2phdmEvLmdyYWRsZQorL2xpYi9qYXZhL2FuZHJvaWQvLmdyYWRsZQogL2xpYi9qYXZhL2J1aWxkCi0vbGliL2phdmEvZ2VuLWphdmEKLS9saWIvamF2YS9nZW4tamF2YWJlYW4KLS9saWIvamF2YS9saWJ0aHJpZnQuamFyCisvbGliL2phdmEvdGFyZ2V0CisvbGliL2pzL2Rpc3QKKy9saWIvanMvZG9jCisvbGliL2pzL3Rlc3QvYnVpbGQKKy9saWIvbmV0Y29yZS8qKi9iaW4KKy9saWIvbmV0Y29yZS8qKi9vYmoKKy9saWIvbm9kZWpzL2NvdmVyYWdlCisvbGliL25vZGVqcy9ub2RlX21vZHVsZXMvCiAvbGliL3BlcmwvTUFOSUZFU1QKLS9saWIvcGVybC9NYWtlZmlsZQotL2xpYi9wZXJsL01ha2VmaWxlLmluCisvbGliL3BlcmwvTVlNRVRBLmpzb24KKy9saWIvcGVybC9NWU1FVEEueW1sCiAvbGliL3BlcmwvTWFrZWZpbGUtcGVybC5tawogL2xpYi9wZXJsL2JsaWIKIC9saWIvcGVybC9wbV90b19ibGliCi0vbGliL3BlcmwvdGVzdC9NYWtlZmlsZQotL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuaW4KLS9saWIvcGVybC90ZXN0L2dlbi1wZXJsCi0vbGliL3B5L01ha2VmaWxlCi0vbGliL3B5L01ha2VmaWxlLmluCiAvbGliL3B5L2J1aWxkCi0vbGliL3JiL01ha2VmaWxlCi0vbGliL3JiL01ha2VmaWxlLmluCisvbGliL3B5L3RocmlmdC5lZ2ctaW5mby8KKy9saWIvcmIvR2VtZmlsZS5sb2NrCisvbGliL3JiL2RlYnVnX3Byb3RvX3Rlc3QKKy9saWIvcmIvLmNvbmZpZworL2xpYi9yYi9leHQvY29uZnRlc3QuZFNZTS8KKy9saWIvcmIvZXh0L21rbWYubG9nCisvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmJ1bmRsZQorL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5zbworL2xpYi9yYi90ZXN0LworL2xpYi9yYi90aHJpZnQtKi5nZW0KKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL01ha2VmaWxlLioKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2J1aWxkLworL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLioKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZQorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlLmFjCisvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUuaW4KKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2luc3RhbGwtc2gKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2xpYnRvb2wKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2x0bWFpbi5zaAorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbWlzc2luZworL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbWtpbnN0YWxsZGlycworL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbW9kdWxlcy8KKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wubG8KKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3J1bi10ZXN0cy5waHAKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5sYQorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvdG1wLXBocC5pbmkKKy9saWIvcGhwL3NyYy9wYWNrYWdlcy8KKy9saWIvcGhwL3Rlc3QvVEVTVC0qLnhtbAorL2xpYi9waHAvdGVzdC9wYWNrYWdlcy8KKy9saWIvcHkvZGlzdC8KKy9saWIvZXJsL2xvZ3MvCisvbGliL2dvL3BrZworL2xpYi9nby9zcmMKKy9saWIvZ28vdGVzdC9nb3BhdGgvCisvbGliL2dvL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKy9saWIvcnMvdGFyZ2V0LworL2xpYi9ycy9DYXJnby5sb2NrCisvbGliL3JzL3Rlc3QvQ2FyZ28ubG9jaworL2xpYi9ycy90ZXN0L3RhcmdldC8KKy9saWIvcnMvdGVzdC9iaW4vCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2Vfb25lLnJzCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2VfdHdvLnJzCisvbGliL3JzL3Rlc3Qvc3JjL21pZGxheWVyLnJzCisvbGliL3JzL3Rlc3Qvc3JjL3JlY3Vyc2l2ZS5ycworL2xpYi9ycy90ZXN0L3NyYy91bHRpbWF0ZS5ycworL2xpYi9ycy8qLmltbAorL2xpYi9ycy8qKi8qLmltbAorL2xpYi9zd2lmdC8uYnVpbGQKIC9saWJ0b29sCiAvbHRtYWluLnNoCiAvbWlzc2luZworL25vZGVfbW9kdWxlcy8KKy92ZW5kb3IvCisvY29tcG9zZXIubG9jawogL3N0YW1wLWgxCi0vdGVzdC8uZGVwcwotL3Rlc3QvLmxpYnMKLS90ZXN0LyoubwotL3Rlc3QvKi5sYQotL3Rlc3QvKi5sbwotL3Rlc3QvQmVuY2htYXJrCi0vdGVzdC9EZWJ1Z1Byb3RvVGVzdAotL3Rlc3QvSlNPTlByb3RvVGVzdAotL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdAotL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdAotL3Rlc3QvVW5pdFRlc3RzCi0vdGVzdC9NYWtlZmlsZQotL3Rlc3QvTWFrZWZpbGUuaW4KLS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0Ci0vdGVzdC9SZWZsZWN0aW9uVGVzdAotL3Rlc3QvZ2VuLWNwcAotL3Rlc3QvamF2YS9NYWtlZmlsZQotL3Rlc3QvamF2YS9NYWtlZmlsZS5hbQotL3Rlc3QvamF2YS9NYWtlZmlsZS5pbgotL3Rlc3QvamF2YS9idWlsZAotL3Rlc3QvamF2YS9nZW4tamF2YQotL3Rlc3QvamF2YS90aHJpZnR0ZXN0LmphcgotL3Rlc3QvcHkvTWFrZWZpbGUKLS90ZXN0L3B5L01ha2VmaWxlLmluCi0vdGVzdC9weS9nZW4tcHkKLS90ZXN0L3JiL01ha2VmaWxlCi0vdGVzdC9yYi9NYWtlZmlsZS5pbgorL3Rlc3QvZmVhdHVyZXMvcmVzdWx0cy5qc29uCisvdGVzdC9yZXN1bHRzLmpzb24KKy90ZXN0L2NfZ2xpYi90ZXN0X2NsaWVudAorL3Rlc3QvY19nbGliL3Rlc3Rfc2VydmVyCisvdGVzdC9jbC9UZXN0U2VydmVyCisvdGVzdC9jbC9UZXN0Q2xpZW50CisvdGVzdC9jcHAvU3RyZXNzVGVzdAorL3Rlc3QvY3BwL1N0cmVzc1Rlc3ROb25CbG9ja2luZworL3Rlc3QvY3BwL1Rlc3RDbGllbnQKKy90ZXN0L2NwcC9UZXN0U2VydmVyCisvdGVzdC9jc2hhcnAvb2JqCisvdGVzdC9jc2hhcnAvYmluCisvdGVzdC9kYXJ0LyoqLy5wYWNrYWdlcworL3Rlc3QvZGFydC8qKi9wYWNrYWdlcworL3Rlc3QvZGFydC8qKi8ucHViLworL3Rlc3QvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy90ZXN0L2xvZy8KKy90ZXN0L3Rlc3QubG9nCisvdGVzdC9lcmwvLmdlbmVyYXRlZAorL3Rlc3QvZXJsLy5yZWJhcgorL3Rlc3QvZXJsL2ViaW4KKy90ZXN0L2dvL2Jpbi8KKy90ZXN0L2dvL1RocmlmdFRlc3QudGhyaWZ0CisvdGVzdC9nby9nb3BhdGgKKy90ZXN0L2dvL3BrZy8KKy90ZXN0L2dvL3NyYy9jb2RlLmdvb2dsZS5jb20vCisvdGVzdC9nby9zcmMvY29tbW9uL21vY2tfaGFuZGxlci5nbworL3Rlc3QvZ28vc3JjL2dpdGh1Yi5jb20vZ29sYW5nLworL3Rlc3QvZ28vc3JjL2dvbGFuZy5vcmcvCisvdGVzdC9nby9zcmMvZ2VuLworL3Rlc3QvZ28vc3JjL3RocmlmdAorL3Rlc3QvaGF4ZS9iaW4KKy90ZXN0L2hzL1Rlc3RDbGllbnQKKy90ZXN0L2hzL1Rlc3RTZXJ2ZXIKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KKy90ZXN0L3B5LnR3aXN0ZWQvX3RyaWFsX3RlbXAvCisvdGVzdC9yYi9HZW1maWxlLmxvY2sKKy90ZXN0L25ldGNvcmUvKiovYmluCisvdGVzdC9uZXRjb3JlLyoqL29iagorL3Rlc3QvbmV0Y29yZS9UaHJpZnQKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KKy90ZXN0L3JzL0NhcmdvLmxvY2sKKy90ZXN0L3JzL3NyYy90aHJpZnRfdGVzdC5ycworL3Rlc3QvcnMvYmluLworL3Rlc3QvcnMvdGFyZ2V0LworL3Rlc3QvcnMvKi5pbWwKKy90ZXN0L3JzLyoqLyouaW1sCisvbGliL2NsL2JhY2twb3J0LXVwZGF0ZS56aXAKKy9saWIvY2wvbGliCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLmxpc3AKKy90dXRvcmlhbC9jbC9leHRlcm5hbHMvCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLworL3R1dG9yaWFsL2NsL1R1dG9yaWFsQ2xpZW50CisvdHV0b3JpYWwvY2wvVHV0b3JpYWxTZXJ2ZXIKKy90dXRvcmlhbC9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvdHV0b3JpYWwvY2wvbGliLworL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5mYXNsCisvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24uZmFzbAorL3R1dG9yaWFsL2NwcC9UdXRvcmlhbENsaWVudAorL3R1dG9yaWFsL2NwcC9UdXRvcmlhbFNlcnZlcgorL3R1dG9yaWFsL2NfZ2xpYi90dXRvcmlhbF9jbGllbnQKKy90dXRvcmlhbC9jX2dsaWIvdHV0b3JpYWxfc2VydmVyCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9vYmoKKy90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL2JpbgorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvb2JqCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9iaW4KKy90dXRvcmlhbC9kL2FzeW5jX2NsaWVudAorL3R1dG9yaWFsL2QvY2xpZW50CisvdHV0b3JpYWwvZC9zZXJ2ZXIKKy90dXRvcmlhbC9kYXJ0LyoqLy5wYWNrYWdlcworL3R1dG9yaWFsL2RhcnQvKiovcGFja2FnZXMKKy90dXRvcmlhbC9kYXJ0LyoqLy5wdWIvCisvdHV0b3JpYWwvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5kc2sKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLnR2c2NvbmZpZworL3R1dG9yaWFsL2RlbHBoaS8qKi9kY3UKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLmlkZW50Y2FjaGUKKy90dXRvcmlhbC9nby9nb3BhdGgKKy90dXRvcmlhbC9nby9nby10dXRvcmlhbAorL3R1dG9yaWFsL2dvL2NhbGN1bGF0b3ItcmVtb3RlCisvdHV0b3JpYWwvZ28vc3JjL3NoYXJlZAorL3R1dG9yaWFsL2dvL3NyYy90dXRvcmlhbAorL3R1dG9yaWFsL2dvL3NyYy9naXQuYXBhY2hlLm9yZworL3R1dG9yaWFsL2dvL3NyYy9nb2xhbmcub3JnCisvdHV0b3JpYWwvaGF4ZS9iaW4KKy90dXRvcmlhbC9ocy9kaXN0LworL3R1dG9yaWFsL2phdmEvYnVpbGQvCisvdHV0b3JpYWwvanMvYnVpbGQvCisvdHV0b3JpYWwvbmV0Y29yZS8qKi9iaW4KKy90dXRvcmlhbC9uZXRjb3JlLyoqL29iagorL3R1dG9yaWFsL25ldGNvcmUvVGhyaWZ0CisvdHV0b3JpYWwvcnMvKi5pbWwKKy90dXRvcmlhbC9ycy9zcmMvc2hhcmVkLnJzCisvdHV0b3JpYWwvcnMvc3JjL3R1dG9yaWFsLnJzCisvdHV0b3JpYWwvcnMvYmluCisvdHV0b3JpYWwvcnMvdGFyZ2V0CisvdHV0b3JpYWwvcnMvQ2FyZ28ubG9jawogL3lsd3JhcAorCmRpZmYgLS1naXQgYS8ucnVzdGZtdC50b21sIGIvLnJ1c3RmbXQudG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E1YWZkCi0tLSAvZGV2L251bGwKKysrIGIvLnJ1c3RmbXQudG9tbApAQCAtMCwwICsxLDY0IEBACittYXhfd2lkdGggPSAxMDAKK2hhcmRfdGFicyA9IGZhbHNlCit0YWJfc3BhY2VzID0gNAorbmV3bGluZV9zdHlsZSA9ICJBdXRvIgordXNlX3NtYWxsX2hldXJpc3RpY3MgPSAiRGVmYXVsdCIKK2luZGVudF9zdHlsZSA9ICJCbG9jayIKK3dyYXBfY29tbWVudHMgPSBmYWxzZQorZm9ybWF0X2RvY19jb21tZW50cyA9IGZhbHNlCitjb21tZW50X3dpZHRoID0gODAKK25vcm1hbGl6ZV9jb21tZW50cyA9IGZhbHNlCitub3JtYWxpemVfZG9jX2F0dHJpYnV0ZXMgPSBmYWxzZQorbGljZW5zZV90ZW1wbGF0ZV9wYXRoID0gIiIKK2Zvcm1hdF9zdHJpbmdzID0gZmFsc2UKK2Zvcm1hdF9tYWNyb19tYXRjaGVycyA9IGZhbHNlCitmb3JtYXRfbWFjcm9fYm9kaWVzID0gdHJ1ZQorZW1wdHlfaXRlbV9zaW5nbGVfbGluZSA9IHRydWUKK3N0cnVjdF9saXRfc2luZ2xlX2xpbmUgPSB0cnVlCitmbl9zaW5nbGVfbGluZSA9IGZhbHNlCit3aGVyZV9zaW5nbGVfbGluZSA9IGZhbHNlCitpbXBvcnRzX2luZGVudCA9ICJCbG9jayIKK2ltcG9ydHNfbGF5b3V0ID0gIk1peGVkIgorbWVyZ2VfaW1wb3J0cyA9IGZhbHNlCityZW9yZGVyX2ltcG9ydHMgPSB0cnVlCityZW9yZGVyX21vZHVsZXMgPSB0cnVlCityZW9yZGVyX2ltcGxfaXRlbXMgPSBmYWxzZQordHlwZV9wdW5jdHVhdGlvbl9kZW5zaXR5ID0gIldpZGUiCitzcGFjZV9iZWZvcmVfY29sb24gPSBmYWxzZQorc3BhY2VfYWZ0ZXJfY29sb24gPSB0cnVlCitzcGFjZXNfYXJvdW5kX3JhbmdlcyA9IGZhbHNlCitiaW5vcF9zZXBhcmF0b3IgPSAiRnJvbnQiCityZW1vdmVfbmVzdGVkX3BhcmVucyA9IHRydWUKK2NvbWJpbmVfY29udHJvbF9leHByID0gdHJ1ZQorb3ZlcmZsb3dfZGVsaW1pdGVkX2V4cHIgPSBmYWxzZQorc3RydWN0X2ZpZWxkX2FsaWduX3RocmVzaG9sZCA9IDAKK2VudW1fZGlzY3JpbV9hbGlnbl90aHJlc2hvbGQgPSAwCittYXRjaF9hcm1fYmxvY2tzID0gdHJ1ZQorZm9yY2VfbXVsdGlsaW5lX2Jsb2NrcyA9IGZhbHNlCitmbl9hcmdzX2RlbnNpdHkgPSAiVGFsbCIKK2JyYWNlX3N0eWxlID0gIlNhbWVMaW5lV2hlcmUiCitjb250cm9sX2JyYWNlX3N0eWxlID0gIkFsd2F5c1NhbWVMaW5lIgordHJhaWxpbmdfc2VtaWNvbG9uID0gdHJ1ZQordHJhaWxpbmdfY29tbWEgPSAiVmVydGljYWwiCittYXRjaF9ibG9ja190cmFpbGluZ19jb21tYSA9IGZhbHNlCitibGFua19saW5lc191cHBlcl9ib3VuZCA9IDEKK2JsYW5rX2xpbmVzX2xvd2VyX2JvdW5kID0gMAorZWRpdGlvbiA9ICIyMDE1IgorbWVyZ2VfZGVyaXZlcyA9IHRydWUKK3VzZV90cnlfc2hvcnRoYW5kID0gZmFsc2UKK3VzZV9maWVsZF9pbml0X3Nob3J0aGFuZCA9IGZhbHNlCitmb3JjZV9leHBsaWNpdF9hYmkgPSB0cnVlCitjb25kZW5zZV93aWxkY2FyZF9zdWZmaXhlcyA9IGZhbHNlCitjb2xvciA9ICJBdXRvIgorcmVxdWlyZWRfdmVyc2lvbiA9ICIxLjAuMCIKK3Vuc3RhYmxlX2ZlYXR1cmVzID0gZmFsc2UKK2Rpc2FibGVfYWxsX2Zvcm1hdHRpbmcgPSBmYWxzZQorc2tpcF9jaGlsZHJlbiA9IGZhbHNlCitoaWRlX3BhcnNlX2Vycm9ycyA9IGZhbHNlCitlcnJvcl9vbl9saW5lX292ZXJmbG93ID0gZmFsc2UKK2Vycm9yX29uX3VuZm9ybWF0dGVkID0gZmFsc2UKK3JlcG9ydF90b2RvID0gIk5ldmVyIgorcmVwb3J0X2ZpeG1lID0gIk5ldmVyIgoraWdub3JlID0gW10KK2VtaXRfbW9kZSA9ICJGaWxlcyIKK21ha2VfYmFja3VwID0gZmFsc2UKZGlmZiAtLWdpdCBhLy50cmF2aXMueW1sIGIvLnRyYXZpcy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3YjVkNQotLS0gL2Rldi9udWxsCisrKyBiLy50cmF2aXMueW1sCkBAIC0wLDAgKzEsMTczIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBidWlsZCBBcGFjaGUgVGhyaWZ0IG9uIFRyYXZpcyBDSSAtIGh0dHBzOi8vdHJhdmlzLWNpLm9yZy8KKworIworIyBEb2NrZXIgSW50ZWdyYXRpb24KKyMgc2VlOiBidWlsZC9kb2NrZXIvUkVBRE1FLm1kCisjIAorCitzdWRvOiByZXF1aXJlZAorZGlzdDogdHJ1c3R5CitsYW5ndWFnZTogY3BwCisKK3NlcnZpY2VzOgorICAtIGRvY2tlcgorCitpbnN0YWxsOgorICAtIGlmIFtbIGB1bmFtZWAgPT0gIkxpbnV4IiBdXTsgdGhlbiBidWlsZC9kb2NrZXIvcmVmcmVzaC5zaDsgZmkKKworc3RhZ2VzOgorICAtIGRvY2tlciAgICAjIGRvY2tlciBpbWFnZXMKKyAgLSB0aHJpZnQgICAgIyB0aHJpZnQgYnVpbGQgam9icworCitlbnY6CisgIGdsb2JhbDoKKyAgICAtIFNDUklQVD0iY21ha2Uuc2giCisgICAgLSBCVUlMRF9BUkc9IiIKKyAgICAtIEJVSUxEX0VOVj0iLWUgQ0M9Z2NjIC1lIENYWD1nKysgLWUgVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWT00IgorICAgIC0gRElTVFJPPXVidW50dS1iaW9uaWMKKyAgICAtIEJVSUxEX0xJQlM9IkNQUCBDX0dMSUIgSEFTS0VMTCBKQVZBIFBZVEhPTiBURVNUSU5HIFRVVE9SSUFMUyIgICMgb25seSBtZWFuaW5nZnVsIGZvciBDTWFrZSBidWlsZHMKKyAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT10ZXN0CisgICAgIyBET0NLRVJfUkVQTyAodGhpcyB3b3JrcyBmb3IgYWxsIGJ1aWxkcyBhcyBhIHNvdXJjZSBmb3IgZG9ja2VyIGltYWdlcyAtIHlvdSBjYW4gb3ZlcnJpZGUgZm9yIGZvcmsgYnVpbGRzIGluIHlvdXIgVHJhdmlzIHNldHRpbmdzKQorICAgIC0gRE9DS0VSX1JFUE89InRocmlmdC90aHJpZnQtYnVpbGQiCisgICAgIyBET0NLRVJfVVNFUiAocHJvdmlkZSBpbiB5b3VyIFRyYXZpcyBzZXR0aW5ncyBpZiB5b3Ugd2FudCB0byBidWlsZCBhbmQgdXBkYXRlIGRvY2tlciBpbWFnZXMgb25jZSwgaW5zdGVhZCBvZiBvbiBldmVyeSBqb2IpCisgICAgIyBET0NLRVJfUEFTUyAoc2FtZSkKKworam9iczoKKyAgaW5jbHVkZToKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT0gc3RhZ2U6IGRvY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLSBzdGFnZTogZG9ja2VyCisgICAgICBzY3JpcHQ6IHRydWUKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkRvY2tlciBCdWlsZCB1YnVudHUteGVuaWFsIDE2LjA0IExUUyIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT1kb2NrZXIKKyAgICAtIHNjcmlwdDogdHJ1ZQorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRG9ja2VyIEJ1aWxkIHVidW50dS1iaW9uaWMgMTguMDQgTFRTIgorICAgICAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgICAgIC0gVFJBVklTX0JVSUxEX1NUQUdFPWRvY2tlcgorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09IHN0YWdlOiB0aHJpZnQgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNyb3NzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYXBhY2hlL3RocmlmdCBvZmZpY2lhbCBQUiBidWlsZHMgY2FuIGV4Y2VlZCA1MCBtaW51dGVzIHBlciBqb2Igc28gY29tYmluZSBhbGwgY3Jvc3MgdGVzdHMKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgaWY6IHJlcG8gPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisKKyAgICAjIGZvcmsgYmFzZWQgUFIgYnVpbGRzIGNhbm5vdCBleGNlZWQgNTAgbWludXRlcyBwZXIgam9iCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChCaW5hcnkgUHJvdG9jb2wpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGJpbmFyeSknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChIZWFkZXIsIEpTT04gUHJvdG9jb2xzKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhoZWFkZXJ8anNvbiknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChDb21wYWN0IGFuZCBNdWx0aXBsZXhlZCBQcm90b2NvbHMpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGNvbXBhY3R8bXVsdGlwbGV4ZWQpJyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogc2NhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBRQSBqb2JzIGZvciBjb2RlIGFuYWx5dGljcyBhbmQgbWV0cmljcworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJTdGF0aWMgQ29kZSBBbmFseXNpcyIKKyAgICAgICAgLSBTQ1JJUFQ9InNjYS5zaCIKKworICAgICMgQyBhbmQgQysrIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAjIEEgYmluYXJ5IGNyYXNoZXMgaWYgdW5kZWZpbmVkIGJlaGF2aW9yIG9jY3VycyBhbmQgcHJvZHVjZXMgYSBzdGFjayB0cmFjZS4KKyAgICAjIHB5dGhvbiBpcyBkaXNhYmxlZCwgc2VlOiBUSFJJRlQtNDM2MAorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJVQlNhbiIKKyAgICAgICAgLSBTQ1JJUFQ9InVic2FuLnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcHkzIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBhdXRvdG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRPRE86IFJlbW92ZSB0aGVtIG9uY2UgbWlncmF0ZWQgdG8gQ01ha2UKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQXV0b3Rvb2xzIChVYnVudHUgQmlvbmljKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImF1dG90b29scy5zaCIKKworICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJBdXRvdG9vbHMgKFVidW50dSBYZW5pYWwpIgorICAgICAgICAtIERJU1RSTz11YnVudHUteGVuaWFsCisgICAgICAgIC0gU0NSSVBUPSJhdXRvdG9vbHMuc2giCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNtYWtlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDTWFrZSIKKworICAgICMgQysrIHNwZWNpZmljIG9wdGlvbnM6IGNvbXBpbGVyIHBsdWctaW4sIHRocmVhZGluZyBtb2RlbAorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDKysgKFN0ZCBUaHJlYWQpIGFuZCBQbHVnaW4iCisgICAgICAgIC0gU0NSSVBUPSJjbWFrZS5zaCIKKyAgICAgICAgLSBCVUlMRF9MSUJTPSJDUFAgVEVTVElORyBUVVRPUklBTFMiCisgICAgICAgIC0gQlVJTERfQVJHPSItRFdJVEhfUExVR0lOPU9OIC1EV0lUSF9TVERUSFJFQURTPU9OIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfSEFTS0VMTD1PRkYiCisgICAgICAgIC0gQlVJTERfRU5WPSItZSBDQz1jbGFuZyAtZSBDWFg9Y2xhbmcrKyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogZGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9Im1ha2UgZGlzdCIKKyAgICAgICAgLSBTQ1JJUFQ9Im1ha2UtZGlzdC5zaCIKKworICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJEZWJpYW4gUGFja2FnZXMiCisgICAgICAgIC0gU0NSSVBUPSJkcGtnLnNoIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjb3Zlcml0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFdlIGJ1aWxkIHRoZSBjb3Zlcml0eSBzY2FuIGJ1aWxkIG9uY2UgbW9udGhseSB1c2luZyBhIHRyYXZpcyBjcm9uIGpvYgorICAgIC0gaWY6IChlbnYoQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwpIElTIHByZXNlbnQpIEFORCAoYnJhbmNoIElOIChtYXN0ZXIpKSBBTkQgKHR5cGUgSU4gKGNyb24pKQorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDb3Zlcml0eSBTY2FuIgorICAgICAgICAtIFNDUklQVD0iY292c2Nhbi5zaCIKKyAgICAgCisKKyAgIyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IG9zeCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAjIGRpc2FibGVkIGR1ZSB0byB0aGUgdGltZSBkZWxheXMgaXQgaW1wb3NlcyBvbiBidWlsZCBqb2JzCisgICMgLSBvczogb3N4CisgICMgICBvc3hfaW1hZ2U6IHhjb2RlOQorICAjICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKKwpkaWZmIC0tZ2l0IGEvQXBhY2hlVGhyaWZ0Lm51c3BlYyBiL0FwYWNoZVRocmlmdC5udXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlZDJjNgotLS0gL2Rldi9udWxsCisrKyBiL0FwYWNoZVRocmlmdC5udXNwZWMKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIEluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgYSBudWdldCBwYWNrYWdlOgorCisgIDEuIE9wZW4gVGhyaWZ0LnNsbiBpbiBsaWJcY3NoYXJwXHNyYyBhbmQgYnVpbGQgdGhlIHJlbGVhc2UgdmVyc2lvbgorICAgICBvZiB0aGUgIlRocmlmdCIgYW5kICJUaHJpZnQuNDUiIHByb2plY3RzLgorICAyLiBPcGVuIFRocmlmdC5zbG4gaW4gbGliXG5ldGNvcmUgYW5kIGJ1aWxkIHRoZSByZWxlYXNlIHZlcnNpb24gb2YKKyAgICAgdGhlICJUaHJpZnQiIHByb2plY3QuCisgIDMuIG51Z2V0IHNldEFwaUtleSA8eW91ci1hcGkta2V5PgorICAzLiBudWdldCBwYWNrIEFwYWNoZVRocmlmdC5udXNwZWMgLVN5bWJvbHMgLVN5bWJvbFBhY2thZ2VGb3JtYXQgc251cGtnCisgIDQuIG51Z2V0IHB1c2ggQXBhY2hlVGhyaWZ0LjEuMC4wLm51cGtnIC1Tb3VyY2UgaHR0cHM6Ly9hcGkubnVnZXQub3JnL3YzL2luZGV4Lmpzb24KKyAgLS0+CisKKzxwYWNrYWdlIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3BhY2thZ2luZy8yMDEzLzA1L251c3BlYy54c2QiPgorICA8bWV0YWRhdGE+CisgICAgPGlkPkFwYWNoZVRocmlmdDwvaWQ+CisgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgICAgPHRpdGxlPkFwYWNoZSBUaHJpZnQgMS4wLjA8L3RpdGxlPgorICAgIDxhdXRob3JzPkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVyczwvYXV0aG9ycz4KKyAgICA8b3duZXJzPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vd25lcnM+CisgICAgPGxpY2Vuc2UgdHlwZT0iZXhwcmVzc2lvbiI+QXBhY2hlLTIuMDwvbGljZW5zZT4KKyAgICA8cHJvamVjdFVybD5odHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvPC9wcm9qZWN0VXJsPgorICAgIDxyZXF1aXJlTGljZW5zZUFjY2VwdGFuY2U+dHJ1ZTwvcmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPgorICAgIDxzdW1tYXJ5PkFwYWNoZSBUaHJpZnQgLk5FVCBMaWJyYXJ5PC9zdW1tYXJ5PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIENvbnRhaW5zIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gbGliL2NzaGFycCBmb3IgbmV0MzUgYW5kIG5ldDQ1IGZyYW1ld29ya3MsIAorICAgICAgYW5kIGZyb20gbGliL25ldGNvcmUgZm9yIG5ldHN0YW5kYXJkMi4wIGZyYW1ld29yayBkZXZlbG9wbWVudC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxyZXBvc2l0b3J5IHR5cGU9IkdpdEh1YiIgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIgYnJhbmNoPSJyZWxlYXNlLzEuMC4wIiAvPgorICAgIDx0YWdzPkFwYWNoZSBUaHJpZnQgUlBDPC90YWdzPgorICA8L21ldGFkYXRhPgorICA8ZmlsZXM+CisgICAgPGZpbGUgc3JjPSJsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQuKiIgdGFyZ2V0PSJsaWJcbmV0MzUiIC8+CisgICAgPGZpbGUgc3JjPSJsaWJcY3NoYXJwXHNyY1xiaW5cUmVsZWFzZVxUaHJpZnQ0NS4qIiB0YXJnZXQ9ImxpYlxuZXQ0NSIgLz4KKyAgICA8ZmlsZSBzcmM9ImxpYlxuZXRjb3JlXFRocmlmdFxiaW5cUmVsZWFzZVxuZXRzdGFuZGFyZDIuMFwqLioiIHRhcmdldD0ibGliXG5ldHN0YW5kYXJkMi4wIiAvPgorICA8L2ZpbGVzPgorPC9wYWNrYWdlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCmluZGV4IGU0ZDgxOTMuLjI0NGYwZGEgMTAwNjQ0Ci0tLSBhL0NIQU5HRVMKKysrIGIvQ0hBTkdFUwpAQCAtMSw3ICsxLDI4OTEgQEAKLVRocmlmdCBDaGFuZ2Vsb2cKK0FwYWNoZSBUaHJpZnQgQ2hhbmdlbG9nCiAKLVZlcnNpb24gMC4xLjAgUkMxIC8gVW5yZWxlYXNlZAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RocmlmdCAwLjEyLjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBOZXcgTGFuZ3VhZ2VzCisgICAgKiBDb21tb24gTElTUCAoY2wpCisgICAgKiBTd2lmdAorICAgICogVHlwZXNjcmlwdCAobm9kZXRzKQogCisjIyBEZXByZWNhdGVkIExhbmd1YWdlcworICAgICogQ29jb2EKKworIyMgQnJlYWtpbmcgQ2hhbmdlcyAoc2luY2UgMC4xMS4wKQorICAgICogW1RIUklGVC00NTI5XSAtIFJ1c3QgZW51bSB2YXJpYW50cyBhcmUgbm93IGNhbWVsLWNhc2VkIGluc3RlYWQgb2YgdXBwZXJjYXNlZCB0byBjb25mb3JtIHRvIFJ1c3QgbmFtaW5nIGNvbnZlbnRpb25zCisgICAgKiBbVEhSSUZULTQ0NDhdIC0gU3VwcG9ydCBmb3IgZ29sYW5nIDEuNiBhbmQgZWFybGllciBoYXMgYmVlbiBkcm9wcGVkLgorICAgICogW1RIUklGVC00NDc0XSAtIFBIUCBub3cgdXNlcyB0aGUgUFNSLTQgbG9hZGVyIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBjbGFzcyBtYXBzLgorICAgICogW1RIUklGVC00NTMyXSAtIG1ldGhvZCBzaWduYXR1cmVzIGNoYW5nZWQgaW4gdGhlIGNvbXBpbGVyJ3MgdF9vb3BfZ2VuZXJhdG9yLgorICAgICogW1RIUklGVC00NjQ4XSAtIFRoZSBDIChHTGliKSBjb21waWxlcidzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgaGFzIGJlZW4gaW1wcm92ZWQuCisKKyMjIEtub3duIElzc3VlcyAoQmxvY2tlciBvciBDcml0aWNhbCkKKyAgICAqIFtUSFJJRlQtNDAzN10gLSBidWlsZDogdXNlIGEgc2luZ2xlIGJ1aWxkIHN5c3RlbSBmb3IgdGhyaWZ0CisgICAgKiBbVEhSSUZULTQxMTldIC0gYnVpbGQ6IGJvb3RzdHJhcC5zaCBpcyBtaXNzaW5nIGZyb20gc291cmNlIHRhcmJhbGwKKyAgICAqIFtUSFJJRlQtMzI4OV0gLSBjc2hhcnA6IHNvY2tldCBleGhhdXN0aW9uIGluIGNzaGFycCBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMDI5XSAtIGNvY29hOiBHZXR0ZXJzIGZvciBmaWVsZHMgZGVmaW5lZCB3aXRoIHVwcGVyY2FzZSBuYW1lcyBkbyBub3Qgd29yaworICAgICogW1RIUklGVC0zMzI1XSAtIGNvY29hOiBFeHRlbmRlZCBzZXJ2aWNlcyBhcmVuJ3Qgc3ViY2xhc3NlcyBpbiBnZW5lcmF0ZWQgQ29jb2EKKyAgICAqIFtUSFJJRlQtNDExNl0gLSBjb2NvYTogVGhyaWZ0IGRlLWNhcGl0YWxpemVzIHRoZSBuYW1lIG9mIElzU2V0IHByb3BlcnR5IGluIENvY29hCisgICAgKiBbVEhSSUZULTM4NzddIC0gY3BwOiB0aGUgaHR0cCBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3RhbmRhcmQ7IGludGVyb3Agd2l0aCBvdGhlciBsYW5ndWFnZXMgaXMgc3BvdHR5IGF0IGJlc3QKKyAgICAqIFtUSFJJRlQtNDE4MF0gLSBjcHA6IEltcG9zc2libGUgdG8gYnVpbGQgVGhyaWZ0IEMrKyBsaWJyYXJ5IGZvciBBbmRyb2lkIChOREspCisgICAgKiBbVEhSSUZULTQzODRdIC0gY3BwOiBVc2luZyBtdWx0aXBsZSBhc3luYyBzZXJ2aWNlcyBzaW11bHRhbmVvdXNseSBpcyBub3QgdGhyZWFkLXNhZmUKKyAgICAqIFtUSFJJRlQtMzEwOF0gLSBoYXNrZWxsOiBEZWZhdWx0ZWQgc3RydWN0IHBhcmFtZXRlcnMgb24gYSBzZXJ2aWNlIGdlbmVyYXRlcyBpbnZhbGlkIEhhc2tlbGwKKyAgICAqIFtUSFJJRlQtMzk5MF0gLSBub2RlanM6IEV4Y2VwdGlvbiBzd2FsbG93ZWQgYnkgZGVzZXJpYWxpemF0aW9uIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTQyMTRdIC0gbm9kZWpzOiBtYXA8aTY0LHZhbHVlPiBrZXkgdHJlYXRlZCBhcyBoZXggdmFsdWUgaW4gSmF2YVNjcmlwdAorICAgICogW1RIUklGVC00NjAyXSAtIG5vZGVqczogRVJST1IgaW4gLi9ub2RlX21vZHVsZXMvdGhyaWZ0L2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzIE1vZHVsZSBub3QgZm91bmQ6IEVycm9yOiBDYW4ndCByZXNvbHZlICdjaGlsZF9wcm9jZXNzJworICAgICogW1RIUklGVC00NjM5XSAtIG5vZGVqczogU2VxdWVuY2UgbnVtYmVyaW5nIGZvciBtdWx0aXBsZXhlZCBwcm90b2NvbCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMTMxMF0gLSBwaHA6IHNlcXVlbmNlIGFuZCByZWNvbm5lY3Rpb24gbWFuYWdlbWVudCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMTUzOF0gLSBwaHA6IEVycm9yIGR1cmluZyBkZXNlcmlhbGl6YXRpb24gaW50NjQgb24gMzItYml0IGFyY2hpdGVjdHVyZQorICAgICogW1RIUklGVC0xNTgwXSAtIHBocDogdGhyaWZ0IHR5cGUgaTY0IGphdmEgdG8gcGhwIHNlcmlhbGl6ZS9kZXNlcmVhbGl6ZSBub3Qgd29ya2luZworICAgICogW1RIUklGVC0xOTUwXSAtIHBocDogUEhQIGdldHMgc3R1Y2sgaW4gaW5maW5pdGUgbG9vcAorICAgICogW1RIUklGVC0yOTU0XSAtIHB5dGhvbjogc2VuZGluZyBpbnQgb3IgZmxvYXQgaW4gYSBkb3VibGUgZmllbGQgYnJlYWtzIHRoZSBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTQwODBdIC0gcHl0aG9uOiB1bml4IHNvY2tldHMgY2FuIGdldCBzdHVjayBmb3JldmVyCisgICAgKiBbVEhSSUZULTQyODFdIC0gcHl0aG9uOiBnZW5lcmF0ZWQgY29kZSBpcyBvdXQgb2Ygb3JkZXIgYW5kIGNhdXNlcyBsb2FkIGlzc3VlcworICAgICogW1RIUklGVC00Njc3XSAtIHB5MzogVW5pY29kZURlY2lkZUVycm9yIGluIFB5dGhvbjMKKworIyMgQnVpbGQgUHJvY2VzcworICAgICogW1RIUklGVC00MDY3XSAtIFdpbmRvd3MgdGhyaWZ0IGNvbXBpbGVyIGRpc3RyaWJ1dGVkIG9uIHRoZSBhcGFjaGUgd2ViIHNpdGUgaGFzIHJ1bnRpbWUgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTQzMDhdIC0gRCBsYW5ndWFnZSBkb2NrZXIgaW1hZ2VzIG5lZWQgZGVtaW9zIGZvciBsaWJldmVudCBhbmQgb3BlbnNzbCBmaXhlZCB0byByZS1lbmFibGUgbWFrZSBjcm9zcyBvbiBkbGFuZworICAgICogW1RIUklGVC00NTc5XSAtIFVzZSBVYnVudHUgQmlvbmljICgxOC4wNCBMVFMpIGZvciBDSSBidWlsZHMgaW5zdGVhZCBvZiBBcnRmdWwgKDE3LjEwKQorICAgICogW1RIUklGVC00NTA4XSAtIERlZmluZSBDSSBvcGVyYXRpbmcgc3lzdGVtIGNvdmVyYWdlIHJ1bGVzIGZvciB0aGUgcHJvamVjdCBhbmQgKGhvcGVmdWxseSkgc2ltcGxpZnkgQ0kgYSBsaXR0bGUgbW9yZQorICAgICogW1RIUklGVC00Mzk3XSAtIHVidW50dSBpbnN0YWxsIGluc3RydWN0aW9ucyBicm9rZW4gb24gMTYuMDQKKyAgICAqIFtUSFJJRlQtNDU0NV0gLSBBcHB2ZXlvciBidWlsZHMgYXJlIGZhaWxpbmcgZHVlIHRvIGEgaGFza2VsbCAvIGNhYmFsIHVwZGF0ZSBpbiBjaG9jb2xhdGV5CisgICAgKiBbVEhSSUZULTQ0NTJdIC0gb3B0aW1pemUgRG9ja2VyZmlsZSAob25seSBvbmV0aW1lIGFwdC1nZXQgdXBkYXRlKQorICAgICogW1RIUklGVC00NDQwXSAtIHJtIGBidWlsZC9kb2NrZXIvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlLm9yaWdgCisgICAgKiBbVEhSSUZULTQzNTJdIC0gVWJ1bnR1IEFydGZ1bCBkb2Vzbid0IGFwcGVhciB0byBiZSBjb21wYXRpYmxlIHdpdGggVGhyaWZ0IGFuZCBIYXhlIDMuNC4yCisgICAgKiBbVEhSSUZULTQ2NjZdIC0gRExhbmcgQ2xpZW50IFBvb2wgVGVzdCBmYWlscyBzcG9yYWRpY2FsbHkKKyAgICAqIFtUSFJJRlQtNDY3Nl0gLSBDTCB0dXRvcmlhbCBidWlsZCBmYWlscyBzcG9yYWRpY2FsbHkKKyAgICAqIFtUSFJJRlQtNDQ1Nl0gLSBNYWtlIGhheGVsaWIgZG93bmxvYWQgcXVpZXQgc28gaXQgZG9lc24ndCBibG93IHVwIHRoZSBidWlsZCBsb2cKKyAgICAqIFtUSFJJRlQtNDYwNV0gLSBib290c3RyYXAuc2ggZmFpbHMgaWYgYXV0b21ha2U9MS4xNi4xCisKKyMjIGNfZ2xpYgorICAgICogW1RIUklGVC00NjQ4XSAtIFRoZSBDIChHTGliKSBjb21waWxlcidzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgaGFzIGJlZW4gaW1wcm92ZWQuCisgICAgKiBbVEhSSUZULTQ2MjJdIC0gZ2xpYkMgY29tcGlsYXRpb24gaXNzdWUKKyAgICAqIFtUSFJJRlQtNDY3MV0gLSBjIGdsaWIgaXMgdW5hYmxlIHRvIGhhbmRsZSBjbGllbnQgY2xvc2UgdW5leHBlY3RlZGx5CisKKyMjIGNsIChuZXcgbGFuZ3VhZ2Ugc3VwcG9ydCBpbiAwLjEyLjApCisgICAgKiBbVEhSSUZULTgyXSAtIENvbW1vbiBMaXNwIHN1cHBvcnQKKworIyMgY3NoYXJwCisgICAgKiBbVEhSSUZULTQ1NThdIC0gcmVzZXJ2ZWQgQ3NoYXJwIGtleXdvcmRzIGFyZSBub3QgZXNjYXBlZCBpbiBzb21lIGNhc2VzCisgICAgKiBbVEhSSUZULTQ2MzddIC0gQyMgYXN5bmMgbW9kZSBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgd2l0aCBpbmhlcml0ZWQgc2VydmljZXMKKyAgICAqIFtUSFJJRlQtNDY3Ml0gLSBJQXN5bmNSZXN1bHQgc3R5bGUgbWV0aG9kcyBub3QgYmVpbmcgc3VwcG9ydGVkIGJ5IGNlcnRhaW4gdHJhbnNwb3J0cyBsZWFkcyB0byBpc3N1ZXMgaW4gbWl4ZWQgSVN5bmMvSUFzeW5jIHVzZSBjYXNlcworICAgICogW1RIUklGVC00NTM5XSAtIEFsbG93IFRCdWZmZXJlZFRyYW5zcG9ydCB0byBiZSB1c2VkIGFzIGJhc2UgY2xhc3MKKyAgICAqIFtUSFJJRlQtNDUzNV0gLSBYTUwgZG9jczsgY29kZSBjbGVhbnVwICh0YWJzLT5zcGFjZXM7IFN0cmluZy0+c3RyaW5nKQorICAgICogW1RIUklGVC00NDkyXSAtIHByb3RlY3RlZCBFeGNlcHRpb25UeXBlIHR5cGUgbWVtYmVyIG9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBjYW5ub3QgYmUgYWNjZXNzZWQKKyAgICAqIFtUSFJJRlQtNDQ0Nl0gLSBKU09OUHJvdG9jb2wgQmFzZTY0IEVuY29kaW5nIFRyaW1zIFBhZGRpbmcKKyAgICAqIFtUSFJJRlQtNDQ1NV0gLSBNaXNzaW5nIGRpc3Bvc2UgY2FsbHMgaW4gVGhyZWFkZWRTZXJ2ZXIgJiBUaHJlYWRwb29sU2VydmVyCisgICAgKiBbVEhSSUZULTQ2MDldIC0ga2VlcCBJbm5lckV4Y2VwdGlvbiB3aGVyZXZlciBhcHByb3ByaWF0ZQorICAgICogW1RIUklGVC00NjczXSAtIElBc3luY1Jlc3VsdCBub3Qgc3VwcG9ydGVkIGJ5IGxheWVyZWQgdHJhbnNwb3J0cyAoYnVmZmVyZWQvZnJhbWVkKQorCisjIyBjcHAKKyAgICAqIFtUSFJJRlQtNDQ3Nl0gLSBUeXBlY2FzdGluZyBwcm9ibGVtIG9uIGxpc3QgaXRlbXMKKyAgICAqIFtUSFJJRlQtNDQ2NV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgdGhyb3dpbmcgVEhSSUZUIExPR0dFUjogVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogVEhSSUZUX0VBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKQorICAgICogW1RIUklGVC00NjgwXSAtIFRCdWZmZXJUcmFuc3BvcnRzLmggZG9lcyBub3QgY29tcGlsZSB1bmRlciBWaXN1YWwgU3R1ZGlvIDIwMTcKKyAgICAqIFtUSFJJRlQtNDYxOF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY3Jhc2ggYmVjYXVzZSBvZiBsaW1pdGF0aW9uIG9mIHNlbGVjdCgpCisgICAgKiBbVEhSSUZULTQ2MjBdIC0gVFpsaWJUcmFuc3BvcnQuY3BwIGRvZXNuJ3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgemxpYiBmbHVzaCBtYXJrZXIgaW4gdGhlIGJ1ZmZlci4KKyAgICAqIFtUSFJJRlQtNDU3MV0gLSBaZXJvTVEgY29udHJpYiBsaWJyYXJ5IG5lZWRzIGEgcmVmcmVzaAorICAgICogW1RIUklGVC00NTU5XSAtIFRTU0xTZXJ2ZXJTb2NrZXQgaW5jb3JyZWN0bHkgcHJpbnRzIGVycm9ycworICAgICogW1RIUklGVC00NTc4XSAtIE1vdmUgYFRBc3luY1Byb3RvY29sUHJvY2Vzc29yYCBpbnRvIG1haW4gdGhyaWZ0IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDQxOF0gLSBldmh0dHBfY29ubmVjdGlvbl9uZXcgaXMgZGVwcmVjYXRlZDsgdXNlIGV2aHR0cF9jb25uZWN0aW9uX2Jhc2VfbmV3CisKKyMjIGNvbXBpbGVyCisgICAgKiBbVEhSSUZULTQ2NDRdIC0gQ29tcGlsZXIgY2Fubm90IGJlIGNvbXBpbGVkIG9uIG1hY09TKG1heWJlIGFsc28gb24gb3RoZXIgcGxhdGZvcm1zIHdpdGggY2xhbmcpCisgICAgKiBbVEhSSUZULTQ1MzFdIC0gVGhyaWZ0IGdlbmVyYXRlcyB3cm9uZyBQeXRob24gY29kZSBmb3IgaW1tdXRhYmxlIHN0cnVjdHVyZXMgd2l0aCBvcHRpb25hbCBtZW1iZXJzCisgICAgKiBbVEhSSUZULTQ1MTNdIC0gdGhyaWZ0IGdlbmVyYXRlZCBjb2RlIGlzIG5vdCBzdGFibGUgZm9yIGNvbnN0YW50cworICAgICogW1RIUklGVC00NTMyXSAtIEF2b2lkIHVwZGF0aW5nIFRocmlmdCBjb21waWxlciBnZW5lcmF0ZWQgY29kZSBpZiB0aGUgb3V0cHV0IGhhcyBub3QgY2hhbmdlZAorICAgICogW1RIUklGVC00NDAwXSAtIFZpc3VhbCBTdHVkaW8gQ29tcGlsZXIgcHJvamVjdCBzaG91bGQgbGluayBydW50aW1lIHN0YXRpY2FsbHkgaW4gcmVsZWFzZSBidWlsZHMKKyAgICAqIFtUSFJJRlQtNDM5OV0gLSBwbHVnaW4udGhyaWZ0IHRfY29uc3RfdmFsdWUgaXMgbm90IHVzZWQgYXMgYSB1bmlvbiBpbiBDKysgY29kZSAtLSBmaXggdGhpcworICAgICogW1RIUklGVC00NDk2XSAtIERlYWxpbmcgd2l0aCBsYW5ndWFnZSBrZXl3b3JkcyBpbiBUaHJpZnQgKGUuZy4gc2VydmljZSBtZXRob2QgbmFtZXMpCisgICAgKiBbVEhSSUZULTQzOTNdIC0gcmVwZWF0ZWQgcnVucyBvZiBjb21waWxlciBwcm9kdWNlIGRpZmZlcmVudCBiaW5hcnkgb3V0cHV0IGF0IHBsdWdpbiBpbnRlcmZhY2UKKworIyMgZGxhbmcKKyAgICAqIFtUSFJJRlQtNDQ3OF0gLSBUaHJpZnQgd2lsbCBub3QgYnVpbGQgd2l0aCBkbGFuZyAyLjA3OCBvciBsYXRlcgorICAgICogW1RIUklGVC00NTAzXSAtIGRsYW5nIHNlcnZlcnMgbG9nRXJyb3Igb24gbm9ybWFsIGNsaWVudCBkaXNjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTQzMDhdIC0gRCBsYW5ndWFnZSBkb2NrZXIgaW1hZ2VzIG5lZWQgZGVtaW9zIGZvciBsaWJldmVudCBhbmQgb3BlbnNzbCBmaXhlZCB0byByZS1lbmFibGUgbWFrZSBjcm9zcyBvbiBkbGFuZworCisjIyBkYXJ0CisgICAgKiBbVEhSSUZULTQ2NDZdIC0gRWZmZWN0aXZlIERhcnQgYW5kIEV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtNDQzOV0gLSBTaG91bGRuJ3QgZG93bmxvYWQgZGFydC5kZWIgZGlyZWN0bHkuCisKKyMjIGRlbHBoaQorICAgICogW1RIUklGVC00NTYyXSAtIENhbGxpbmcgd3JvbmcgZXhjZXB0aW9uIENUT1IgbGVhZHMgdG8gImNhbGwgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIgaW5zdGVhZCBvZiB0aGUgcmVhbCBleGNlcHRpb24gYmVpbmcgdGhyb3duCisgICAgKiBbVEhSSUZULTQ1NTRdIC0gdW5jb21waWxlYWJsZSBjb2RlIHdpdGggbWVtYmVyIG5hbWVzIHRoYXQgYXJlIGFsc28gdHlwZXMgdW5kZXIgc3BlY2lmaWMgY29uZGl0aW9ucworICAgICogW1RIUklGVC00NDIyXSAtIEFkZCBBc3luYyBpbXBsZW1lbnRhdGlvbiB2aWEgSUZ1dHVyZQorICAgICogW1RIUklGVC00NDg1XSAtIFBvc3NpYmxlIGludmFsaWQgcHRyIEFWIHdpdGggb3ZlcmxhcHBlZCByZWFkL3dyaXRlIG9uIHBpcGVzCisgICAgKiBbVEhSSUZULTQ1NDldIC0gVGhyaWZ0IGV4Y2VwdGlvbnMgc2hvdWxkIGRlcml2ZSBmcm9tIFRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDU0MF0gLSBidWZmZXJlZCB0cmFuc3BvcnQgYnJva2VuIHdoZW4gdHJ5aW5nIHRvIHJlLW9wZW4gYSBmb3JtZXJseSBjbG9zZWQgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQ0NzNdIC0gTW92ZSBUaHJpZnQuQ29uc29sZS5wYXMgb3V0IG9mIHRoZSBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTQ0OTBdIC0gQWxsb3cgYSBkZWZhdWx0IHNlcnZpY2UgYXMgZmFsbGJhY2sgZm9yIG11bHRpcGxleCBwcm9jZXNzb3JzIGNvbm5lY3RlZCBieSBvbGQgY2xpZW50cworICAgICogW1RIUklGVC00NDU0XSAtIExhcmdlIHdyaXRlcy9yZWFkcyBtYXkgY2F1c2UgcmFuZ2UgY2hlY2sgZXJyb3JzIGluIGRlYnVnIG1vZGUKKyAgICAqIFtUSFJJRlQtNDQ2MV0gLSBDb21waWxlciBkaXJlY3RpdmUgc2hvdWxkIG1hdGNoIERlbHBoaSBYRTQKKyAgICAqIFtUSFJJRlQtNDQ2Ml0gLSBGaXJzdCBsaW5lIGluIENvbnNvbGUgZHVwbGljYXRlZAorICAgICogW1RIUklGVC00NjQyXSAtIEZQVSBjdHJsIHdvcmQgc2V0dGluZ3MgbWF5IGNhdXNlIGFuIHVuZXhwZWN0ZWQgImRlbm9ybWFsaXplZCIgZXJyb3IKKyAgICAqIFtUSFJJRlQtNDU4OV0gLSBIVFRQIGNsaWVudCB0aW1lb3V0cyBhcmUgYSkgaW5jb21wbGV0ZSBhbmQgYikgbm90IHVzZWQgYXQgYWxsCisgICAgKiBbVEhSSUZULTQ1OTBdIC0gcnVubmluZyB0aGUgdGVzdCBjbGllbnQgdXNpbmcgSFRUUCB0cmFuc3BvcnQgbGVhZHMgdG8gIkNvSW5pdGlhbGl6ZSBub3QgY2FsbGVkIgorCisjIyBlcmxhbmcKKyAgICAqIFtUSFJJRlQtNDQ5N10gLSBFcmxhbmcgcmVjb3JkcyBzaG91bGQgdXNlIG1hcCgpIGZvciBtYXAgdHlwZQorICAgICogW1RIUklGVC00NDk1XSAtIEVybGFuZyByZWNvcmRzIHNob3VsZCBhbGxvdyAndW5kZWZpbmVkJyBmb3Igbm9uLXJlcXVpcmVkIGZpZWxkcworICAgICogW1RIUklGVC00NTgwXSAtIEZpeCBlcmxhbmcgdHV0b3JpYWwgdW5wYWNrIG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtNDU4Ml0gLSBVYnVudHUgWGVuaWFsIGVybGFuZyAxOC4zICJtYWtlIGNoZWNrIiBmYWlscworCisjIyBnb2xhbmcKKyAgICAqIFtUSFJJRlQtNDQ0OF0gLSBTdXBwb3J0IGZvciBnb2xhbmcgMS42IGFuZCBlYXJsaWVyIGhhcyBiZWVuIGRyb3BwZWQuCisgICAgKiBbVEhSSUZULTQyNTNdIC0gR28gZ2VuZXJhdG9yIGFzc2lnbnMgc3RyaW5ncyB0byBmaWVsZCBpbiBjb25zdCBpbnN0ZWFkIG9mIHBvaW50ZXJzLgorICAgICogW1RIUklGVC00NTczXSAtIFVuaW9ucyBGaWVsZCBDb3VudCBEb2VzIE5vdCBDb25zaWRlciBCaW5hcnkKKyAgICAqIFtUSFJJRlQtNDQ0N10gLSBHb2xhbmc6IFBhbmljIG9uIHAuYy5DYWxsIHdoZW4gdXNpbmcgZGVwcmVjYXRlZCBpbml0aWFsaXplcnMKKyAgICAqIFtUSFJJRlQtNDY1MF0gLSBSZXF1aXJlZCBmaWVsZCBpbmNvcnJlY3RseSBtYXJrZWQgYXMgc2V0IHdoZW4gZmllbGRUeXBlIGRvZXMgbm90IG1hdGNoCisgICAgKiBbVEhSSUZULTQ0ODZdIC0gR29sYW5nOiAtcmVtb3RlLmdvIGNsaWVudCBjbGVhbnVwCisgICAgKiBbVEhSSUZULTQ1MzddIC0gVFNpbXBsZVNlcnZlciBjYW4gZXhpdCBBY2NlcHQgbG9vcCB3aXRoIGxvY2sgc3RpbGwgYWNxdWlyZWQKKyAgICAqIFtUSFJJRlQtNDUxNl0gLSBBZGQgc3VwcG9ydCBmb3IgZ28gMS4xMAorICAgICogW1RIUklGVC00NDIxXSAtIGdvbGFuZyB0ZXN0cyByZWx5IG9uIGdvbW9jaywgd2hpY2ggaGFzIGNoYW5nZSBiZWhhdmlvdXIsIGNhdXNpbmcgdGVzdHMgdG8gZmFpbAorICAgICogW1RIUklGVC00NjI2XSAtIENvbW11bmljYXRpb24gY3Jhc2ggd2hlbiB1c2luZyBiaW5hcnkvY29tcGFjdCBwcm90b2NvbCBhbmQgemxpYiB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDY1OV0gLSBnb2xhbmcgcmFjZSBkZXRlY3RlZCB3aGVuIGNsb3NpbmcgbGlzdGVuZXIgc29ja2V0CisKKyMjIGhhc2tlbGwKKyAgICAqIFtUSFJJRlQtNDYzNF0gLSBIYXNrZWxsIGJ1aWxkcyB3aXRoIG9sZGVyIGNhYmFsIGNhbm5vdCByZWNvbmNpbGUgY29tcGxleCB2ZXJzaW9uIHJlcXVpcmVtZW50cworCisjIyBqYXZhCisgICAgKiBbVEhSSUZULTQyNTldIC0gVGhyaWZ0IGRvZXMgbm90IGNvbXBpbGUgZHVlIHRvIEFudCBNYXZlbiB0YXNrIGVycm9ycworICAgICogW1RIUklGVC0xNDE4XSAtIENvbXBpbGluZyBUaHJpZnQgZnJvbSBzb3VyY2U6IENsYXNzIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvbmRpdGlvblRhc2sgZG9lc24ndCBzdXBwb3J0IHRoZSBuZXN0ZWQgInR5cGVmb3VuZCIgZWxlbWVudAorICAgICogW1RIUklGVC00NTMwXSAtIHByb3Bvc2FsOiBhZGQgbnVsbGFiaWxpdHkgYW5ub3RhdGlvbnMgdG8gZ2VuZXJhdGVkIEphdmEgY29kZQorICAgICogW1RIUklGVC00NjE0XSAtIEdlbmVyYXRlIG1pc3NpbmcgQE51bGxhYmxlIGFubm90YXRpb25zIGZvciBKYXZhIGl0ZXJhdG9yIGdldHRlcnMKKyAgICAqIFtUSFJJRlQtNDU1NV0gLSBHZXR0ZXIgb2YgYmluYXJ5IGZpZWxkIGluIEphdmEgY3JlYXRlcyB1bm5lY2Vzc2FyeSBjb3B5CisgICAgKiBbVEhSSUZULTM5ODNdIC0gbGlidGhyaWZ0IGlzIGRlcGxveWVkIG9uIGNlbnRyYWwgd2l0aCBwb20gcGFja2FnaW5nIGluc3RlYWQgb2YgamFyCisgICAgKiBbVEhSSUZULTQyOTRdIC0gSmF2YSBDb25maWd1cmUgRmFpbHMgZm9yIEFudCA+PSAxLjEwCisgICAgKiBbVEhSSUZULTQxNzhdIC0gSmF2YSBsaWJyYXJpZXMgbWlzc2luZyBmcm9tIHBhY2thZ2Ugd2hlbiB1c2luZyBjbWFrZQorICAgICogW1RIUklGVC00MTIwXSAtIHBvbSBmaWxlcyBhcmUgbm90IGdlbmVyYXRlZCBvciBwcm92aWRlZCBpbiB0aGUgYnVpbGQKKyAgICAqIFtUSFJJRlQtMTUwN10gLSBNYXZlbiBjYW4ndCBkb3dubG9hZCByZXNvdXJjZSBmcm9tIGNlbnRyYWwgd2hlbiBiZWhpbmQgYSBwcm94eSBhbmQgd29uJ3QgdXNlIGxvY2FsIHJlcG9zaXRvcnkKKyAgICAqIFtUSFJJRlQtNDU1Nl0gLSBPcHRpb25hbCByZXRocm93IG9mIHVuaGFuZGxlZCBleGNlcHRpb25zIGluIGphdmEgcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTQzMzddIC0gQWJsZSB0byBzZXQga2V5U3RvcmUgYW5kIHRydXN0U3RvcmUgYXMgSW5wdXRTdHJlYW0gaW4gdGhlIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzCisgICAgKiBbVEhSSUZULTQ1NjZdIC0gUGFzcyBtZXNzYWdlIG9mIHVuaGFuZGxlZCBleGNlcHRpb24gdG8gb3B0aW9uYWwgcmV0aHJvdy4KKyAgICAqIFtUSFJJRlQtNDUwNl0gLSBSZW1vdmUgYXNzZXJ0aW9uIGluIEphdmEgU0FTTCBjb2RlIHRoYXQgd291bGQgYmUgaWdub3JlZCBpbiByZWxlYXNlIGJ1aWxkcworICAgICogW1RIUklGVC00NDcwXSAtIEluY2x1ZGUgcG9wdWxhciBJREUgZmlsZSB0ZW1wbGF0ZXMgdG8gZ2l0aWdub3JlCisgICAgKiBbVEhSSUZULTQ0MjldIC0gTWFrZSBUVGhyZWFkUG9vbFNlcnZlci5leGVjdXRvclNlcnZpY2VfIGF2YWlsYWJsZSBpbiBpbmhlcml0ZWQgY2xhc3NlcyBhbmQgcmVmYWN0b3IgbWV0aG9kcyB0byBiZSBhYmxlIGN1c3RvbWl6YXRpb24KKyAgICAqIFtUSFJJRlQtMzc2OV0gLSBGaXggbG9naWMgb2YgVEhSSUZULTIyNjgKKyAgICAqIFtUSFJJRlQtNDQ5NF0gLSBJbmNyZWFzZSBKYXZhIFNvY2tldCBCdWZmZXIgU2l6ZQorICAgICogW1RIUklGVC00NDk5XSAtIFJlbW92ZSBNYWdpYyBOdW1iZXIgSW4gVEZJbGVUcmFuc3BvcnQKKworIyMganMKKyAgICAqIFtUSFJJRlQtNDQwNl0gLSBKYXZhU2NyaXB0OiBVc2UgbW9kZXJuIFByb21pc2UgaW1wbGVtZW50YXRpb25zCisgICAgKiBbVEhSSUZULTQ2MjVdIC0gbGV0IC8gY29uc3QgdmFyaWFibGUgZGVjb3JhdG9ycyBmb3IgZXM2IGNvbXBpbGVyCisgICAgKiBbVEhSSUZULTQ2NTNdIC0gRVM2IENsYXNzZXMKKyAgICAqIFtUSFJJRlQtNDU5Ml0gLSBKUzogcmVhZEkzMiBwZXJmb3JtYW5jZSBvbiBsYXJnZSBhcnJheXMgaXMgdmVyeSBwb29yIGluIENocm9tZQorICAgICogW1RIUklGVC00NTA5XSAtIGpzIGFuZCBub2RlanMgbGlicmFyaWVzIG5lZWQgdG8gYmUgcmVmcmVzaGVkIHdpdGggY3VycmVudCBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtNDQwM10gLSB0aHJpZnQuanM6IEluY29ycmVjdCB1c2FnZSBvZiAndGhpcycgaW4gVFdlYlNvY2tldFRyYW5zcG9ydC5fX29uT3BlbgorICAgICogW1RIUklGVC00NDM2XSAtIERlc2VyaWFsaXphdGlvbiBvZiBuZXN0ZWQgbGlzdCBkaXNjYXJkcyBjb250ZW50CisgICAgKiBbVEhSSUZULTQ0MzddIC0gSlMgV2ViU29ja2V0IGNsaWVudCBjYWxsYmFja3MgaW52b2tlZCB0d2ljZSBvbiBwYXJhbGxlbCByZXF1ZXN0cworICAgICogW1RIUklGVC00Njc5XSAtIER1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgaW4gbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKKyAgICAqIFtUSFJJRlQtNDU1MV0gLSBBZGQgcHJldHRpZXIgZm9yIGNvbnNpc3RlbnQgSlMgY29kZSBmb3JtYXR0aW5nCisKKyMjIGx1YQorICAgICogW1RIUklGVC00NTkxXSAtIGx1YSBjbGllbnQgdXNlcyB0d28gd3JpdGUoKSBjYWxscyBwZXIgZnJhbWVkIG1lc3NhZ2Ugc2VuZAorICAgICogW1RIUklGVC0zODYzXSAtIENhbid0ICJtYWtlIGluc3RhbGwiIEx1YSBMaWJyYXJ5CisKKyMjIG5ldGNvcmUKKyAgICAqIFtUSFJJRlQtNDUyNF0gLSAuTkVUIENvcmUgU2VydmVyIGRvZXNuJ3QgY2xvc2UgcHJvcGVybHkgd2hlbiBjYW5jZWxsZWQKKyAgICAqIFtUSFJJRlQtNDQzNF0gLSBVcGRhdGUgLk5FVCBDb3JlIGNvbXBvbmVudHMsIGFkZCB0ZXN0cyBmb3IgLk5ldCBDb3JlIGxpYnJhcnkgYW5kIC5OZXQgQ29yZSBjb21waWxlciwgZml4IGJ1Z3MgYW5kIGJ1aWxkIHByb2Nlc3MKKyAgICAqIFtUSFJJRlQtNDQ0Nl0gLSBKU09OUHJvdG9jb2wgQmFzZTY0IEVuY29kaW5nIFRyaW1zIFBhZGRpbmcKKworIyMgbm9kZS5qcworICAgICogW1RIUklGVC00MjI1XSAtIEVycm9yIGhhbmRsaW5nIG1hbGZvcm1lZCBhcmd1bWVudHMgbGVha3MgbWVtb3J5LCBjb3JydXB0cyB0cmFuc3BvcnQgYnVmZmVycyBjYXVzaW5nIG5leHQgUlBDIHRvIGZhaWwKKyAgICAqIFtUSFJJRlQtMzk1MF0gLSBNZW1vcnkgbGVhayB3aGlsZSBjYWxsaW5nIG9uZXdheSBtZXRob2QKKyAgICAqIFtUSFJJRlQtMzE0M10gLSBhZGQgdHlwZXNjcmlwdCBkaXJlY3Rvcnkgc3VwcG9ydAorICAgICogW1RIUklGVC00NTY0XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBjYW4gbGVhdmUgY29ycnVwdCBkYXRhIGluIHRoZSBidWZmZXIKKyAgICAqIFtUSFJJRlQtNDY0N10gLSBOb2RlLmpzIEZpbGVzZXJ2ZXIgd2Vicm9vdCBwYXRoCisgICAgKiBbVEhSSUZULTQ0ODldIC0gVW5peCBkb21haW4gc29ja2V0IHN1cHBvcnQgZm9yIE5vZGVKUyBjbGllbnQKKyAgICAqIFtUSFJJRlQtNDQ0M10gLSBub2RlLmpzIGpzb25fcHJvdG9jb2wgdGhyb3dzIGVycm9yIGluIHNraXAgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtNDYwNF0gLSBOb2RlSlM6IEV4cG9zZSBJbnQ2NCBmcm9tIGJyb3dzZXIuanMgZm9yIGNvbnN1bXB0aW9uIGJ5IGJyb3dzZXIKKyAgICAqIFtUSFJJRlQtNDQ4MF0gLSBOb2RlSlMgd2FybmluZyBvbiBiaW5hcnlfcHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kIHdoZW4gc2VxaWQgPSAwCisKKyMjIHBlcmwKKyAgICAqIFtUSFJJRlQtNDM4Ml0gLSBSZXBsYWNlIHRoZSB1c2Ugb2YgUGVybCBJbmRpcmVjdCBPYmplY3QgU3ludGF4IGNhbGxzIHRvIG5ldygpCisgICAgKiBbVEhSSUZULTQ0NzFdIC0gVGhyaWZ0IENQQU4gcmVsZWFzZSBpcyBtaXNzaW5nIE1ha2VmaWxlLlBMIGFuZCB0aGUgY2xpZW50cyBhcmUgdW5hYmxlIHRvIGJ1aWxkIHRoZSBtb2R1bGUKKyAgICAqIFtUSFJJRlQtNDQxNl0gLSBQZXJsIENQQU4gUGFja2FnaW5nIEltcHJvdmVtZW50cworCisjIyBwaHAKKyAgICAqIFtUSFJJRlQtNDQ3NF0gLSBQSFAgZ2VuZXJhdG9yIHVzZSBQU1ItNCBkZWZhdWx0CisgICAgKiBbVEhSSUZULTQ0NjNdIC0gUEhQIGdlbmVyYXRlZCBjb2RlIG1hdGNoIFBTUi0yCisgICAgKiBbVEhSSUZULTQzNzNdIC0gRXh0ZW5kaW5nIFRocmlmdCBjbGFzcyByZXN1bHRzIGluICJBdHRlbXB0IHNlcmlhbGl6ZSBmcm9tIG5vbi1UaHJpZnQgb2JqZWN0IgorICAgICogW1RIUklGVC00MzU0XSAtIFRTb2NrZXQgYmxvY2sgb24gcmVhZAorICAgICogW1RIUklGVC00NDIzXSAtIG1pZ3JhdGUgcGhwIGxpYnJhcnkgdG8gcHNyLTQKKyAgICAqIFtUSFJJRlQtNDY1Nl0gLSBpbmZpbml0ZSBsb29wIGluIGxhdGVzdCBQSFAgbGlicmFyeQorICAgICogW1RIUklGVC00NDc3XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBtdXN0IGhhdmUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDQ3NV0gLSBsaWIvcGhwL3Rlc3Qgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIFBTUi0yCisgICAgKiBbVEhSSUZULTQ0OThdIC0gYWRkIHBocGNzIGJhY2sKKyAgICAqIFtUSFJJRlQtNDQ2MF0gLSBwaHAgbGlicmFyeSB1c2UgUFNSLTIKKyAgICAqIFtUSFJJRlQtNDY0MV0gLSBUQ3VybENsaWVudCBkb2Vzbid0IGNoZWNrIGZvciBIVFRQIHN0YXR1cyBjb2RlCisgICAgKiBbVEhSSUZULTQ2NDVdIC0gVEN1cmxDbGllbnQ6IHNob3cgYWN0dWFsIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aHJvd2luZyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQ2NzRdIC0gQWRkIHN0cmVhbSBjb250ZXh0IHN1cHBvcnQgaW50byBQSFAvVEh0dHBDbGllbnQKKyAgICAqIFtUSFJJRlQtNDQ1OV0gLSByZWR1Y2UgcGhwIGxpYnJhcnkgZGlyZWN0b3J5IGRlcHRoCisKKyMjIHB5dGhvbgorICAgICogW1RIUklGVC00NjcwXSAtIFR3aXN0ZWQsIHNsb3RzLCBhbmQgdm9pZCBtZXRob2QgZmFpbHMgd2l0aCAib2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3N1Y2Nlc3MnIgorICAgICogW1RIUklGVC00NDY0XSAtIFBvdGVudGlhbGx5IHNlcnZlci1jcmFzaGluZyB0eXBvIGluIFB5dGhvbiBUTm9uYmxvY2tpbmdTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtNDU0OF0gLSBTdXBwb3J0aW5nIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHByb3RvY29sIHdoZW4gdXNpbmcgVE11bHRpcGxleGVkUHJvY2Vzc29yIGluIFB5dGhvbgorICAgICogW1RIUklGVC00NTc3XSAtIE91dGRhdGVkIGNpcGhlciBzdHJpbmcgaW4gcHl0aG9uIHVuaXQgdGVzdAorICAgICogW1RIUklGVC00NTA1XSAtIHB5dGhvbiBidWlsZCBvbiBWYWdyYW50IFdpbmRvd3MgYm94ZXMgZmFpbHMKKyAgICAqIFtUSFJJRlQtNDYyMV0gLSBUSGVhZGVyIGZvciBQeXRob24KKyAgICAqIFtUSFJJRlQtNDY2OF0gLSBtYWtlIHNvY2tldCBiYWNrbG9nIGNvbmZpZ3VyYWJsZSBmb3IgcHl0aG9uCisgICAgKiBbVEhSSUZULTQ1NjFdIC0gUHl0aG9uOiBjbGVhbnVwIHNvY2tldCB0aW1lb3V0IHNldHRpbmdzCisKKyMjIHJ1YnkKKyAgICAqIFtUSFJJRlQtNDI4OV0gLSBUaHJpZnQgUlNwZWMgdGVzdCBzdWl0ZSBmYWlscyB3aXRoIFJ1YnkgMi40LnggZHVlIHRvIEZpeG51bSBkZXByZWNhdGlvbgorICAgICogW1RIUklGVC00MzQyXSAtIFN1cHBvcnQgcnVieSByc3BlYyAzCisgICAgKiBbVEhSSUZULTQ1MjVdIC0gQWRkIHNzbCBzb2NrZXQgb3B0aW9uIHRvIHJ1YnkgY3Jvc3MgdGVzdHMKKyAgICAqIFtUSFJJRlQtNDQ1MF0gLSBBZGQgc2VlayBzdXBwb3J0IHRvIFRDb21wYWN0SW5wdXRQcm90b2NvbCBpbiBSdXN0CisgICAgKiBbVEhSSUZULTQ2MzFdIC0gQ29kZWdlbiBDcmVhdGVzIEludmFsaWQgUnVieSBmb3IgUmVjdXJzaXZlIFN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDQ3Ml0gLSBGaXggdGhlIGdlbnNwZWMgZm9yIHJ1Ynkgc28gaXQgZG9lcyBub3QgY29tcGxhaW4gYWJvdXQgYW4gaW52YWxpZCBsaWNlbnNlCisKKyMjIHJ1c3QKKyAgICAqIFtUSFJJRlQtNDY2Ml0gLSBSdXN0IGNvbnN0IHN0cmluZyBjYWxscyBmdW5jdGlvbiBhdCBjb21waWxlIHRpbWUKKyAgICAqIFtUSFJJRlQtNDY2MV0gLSBSdXN0IGVudW0gbmFtZSB3cm9uZyBjYXNlIGluIGdlbmVyYXRlZCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQ2MTddIC0gQXZvaWQgZ2VuZXJhdGluZyBjb25mbGljdGluZyBzdHJ1Y3QgbmFtZXMgaW4gUnVzdCBjb2RlCisgICAgKiBbVEhSSUZULTQ1MjldIC0gUnVzdCBnZW5lcmF0aW9uIHNob3VsZCBpbmNsdWRlICMhW2FsbG93KG5vbl9zbmFrZV9jYXNlKV0gb3IgZm9yY2UgY29uZm9ybSB0byBSdXN0IHN0eWxlIGd1aWRlbGluZXMKKyAgICAqIFtUSFJJRlQtNDM5MF0gLSBSdXN0IGJpbmFyeSBwcm90b2NvbCBhbmQgYnVmZmVyZWQgdHJhbnNwb3J0IGNhbm5vdCBoYW5kbGUgd3JpdGVzIGFib3ZlIDQwOTYgYnl0ZXMKKyAgICAqIFtUSFJJRlQtNDQxOV0gLSBSdXN0IGZyYW1lZCB0cmFuc3BvcnQgY2Fubm90IGhhbmRsZSB3cml0ZXMgYWJvdmUgNDA5NiBieXRlcworICAgICogW1RIUklGVC00NjU4XSAtIFJ1c3QncyBUQmluYXJ5SW5wdXRQcm90b2NvbCBmYWlscyB3aGVuIHN0cmljdCBpcyBmYWxzZQorICAgICogW1RIUklGVC00MTg3XSAtIERhcnQgLT4gUnVzdCBGcmFtZWQgY3Jvc3MgdGVzdHMgZmFpbAorICAgICogW1RIUklGVC00NjY0XSAtIFJ1c3QgY2Fubm90IGNyZWF0ZSBSZWFkSGFsZi9Xcml0ZUhhbGYgdG8gaW1wbGVtZW50IGN1c3RvbSB0cmFucG9ydHMKKyAgICAqIFtUSFJJRlQtNDY2NV0gLSBLZWVwIFJ1c3QgbGlicmFyeSB1cC10by1kYXRlIG9uIGNyYXRlcy5pbworCisjIyBzd2lmdCAobmV3IGxhbmd1YWdlIHN1cHBvcnQgaW4gMC4xMi4wKQorICAgICogW1RIUklGVC0zNzczXSAtIFN3aWZ0IExpYnJhcnkKKworIyMgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC00NTE1XSAtIEdyYWNlZnVsbHkgc2h1dGRvd24gY3Jvc3MtdGVzdCBzZXJ2ZXJzIHRvIGZ1bGx5IHRlc3QgdGVhcmRvd24KKyAgICAqIFtUSFJJRlQtNDA4NV0gLSBBZGQgLk5FVCBDb3JlIHRvIHRoZSBtYWtlIGNyb3NzIHN0YW5kYXJkIHRlc3Qgc3VpdGUKKyAgICAqIFtUSFJJRlQtNDM1OF0gLSBBZGQgdW5peCBkb21haW4gc29ja2V0cyBpbiBydWJ5IHRvIGNyb3NzIHRlc3QgLSBjb2RlIGV4aXN0cworCisjIyB0eXBlc2NyaXB0IChuZXcgbGFuZ3VhZ2Ugc3VwcG9ydCBpbiAwLjEyLjApCisgICAgKiBbVEhSSUZULTMxNDNdIC0gYWRkIHR5cGVzY3JpcHQgZGlyZWN0b3J5IHN1cHBvcnQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RocmlmdCAwLjExLjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0yNzMzXSAtIEVybGFuZyBjb2Rpbmcgc3RhbmRhcmRzCisgICAgKiBbVEhSSUZULTI3NDBdIC0gUGVybCBjb2Rpbmcgc3RhbmRhcmRzCisgICAgKiBbVEhSSUZULTM2MTBdIC0gU3RyZWFtbGluZSBleGNlcHRpb24gaGFuZGxpbmcgaW4gUHl0aG9uIHNlcnZlciBoYW5kbGVyCisgICAgKiBbVEhSSUZULTM2ODZdIC0gSmF2YSBwcm9jZXNzb3Igc2hvdWxkIHJlcG9ydCBpbnRlcm5hbCBlcnJvciBvbiB1bmNhdWdodCBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDA0OV0gLSBTa2lwKCkgc2hvdWxkIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEgb24gdW5rbm93biBkYXRhIHR5cGVzCisgICAgKiBbVEhSSUZULTQwNTNdIC0gU2tpcCgpIHNob3VsZCB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBIG9uIHVua25vd24gZGF0YSB0eXBlcworICAgICogW1RIUklGVC00MTM2XSAtIEFsaWduIGlzX2JpbmFyeSgpIG1ldGhvZCB3aXRoIGlzX3N0cmluZygpIHRvIHNpbXBsaWZ5IHRob3NlIGNoZWNrcworICAgICogW1RIUklGVC00MTM3XSAtIEZpeCByZW1haW5pbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGludmFsaWQgdnB0ciBjYXN0cyBpbiBUaHJpZnQgQ29tcGlsZXIKKyAgICAqIFtUSFJJRlQtNDEzOF0gLSBGaXggcmVtYWluaW5nIHVuZGVmaW5lZCBiZWhhdmlvciBpbnZhbGlkIHZwdHIgY2FzdHMgaW4gQysrIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDI5Nl0gLSBGaXggVWJ1bnR1IFhlbmlhbCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIHB5dGhvbiBsYW5ndWFnZQorICAgICogW1RIUklGVC00Mjk4XSAtIEZpeCBVYnVudHUgWGVuaWFsIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgZ28gMS42IGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTQyOTldIC0gRml4IFVidW50dSBYZW5pYWwgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBEIGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTQzMDBdIC0gRml4IG1ha2UgY3Jvc3MgaW4gVWJ1bnR1IFhlbmlhbCBkb2NrZXIgZW52aXJvbm1lbnQsIG9uY2UgYWxsIGxhbmd1YWdlIHN1cHBvcnQgaXNzdWVzIGFyZSBmaXhlZAorICAgICogW1RIUklGVC00MzAyXSAtIEZpeCBVYnVudHUgWGVuaWFsIG1ha2UgY3Jvc3MgdGVzdGluZyBmb3IgbHVhIGFuZCBwaHA3CisgICAgKiBbVEhSSUZULTQzOThdIC0gVXBkYXRlIEVYVFJBX0RJU1QgZm9yICJtYWtlIGRpc3QiCisKKyMjIEJ1ZworICAgICogW1RIUklGVC0zODFdIC0gRmFpbCBmYXN0IGlmIGNvbmZpZ3VyZSBkZXRlY3RzIEMrKyBwcm9ibGVtcworICAgICogW1RIUklGVC0xNjc3XSAtIE1pbkdXIHN1cHBvcnQgYnJva2VuCisgICAgKiBbVEhSSUZULTE4MDVdIC0gVGhyaWZ0IHNob3VsZCBub3Qgc3dhbGxvdyBBTEwgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0yMDI2XSAtIEZpeCBUQ29tcGFjdFByb3RvY29sIDY0IGJpdCBidWlsZHMKKyAgICAqIFtUSFJJRlQtMjY0Ml0gLSBSZWN1cnNpdmUgc3RydWN0cyBkb24ndCB3b3JrIGluIHB5dGhvbgorICAgICogW1RIUklGVC0yODg5XSAtIHN0YWJsZSByZWxlYXNlIDAuOS4yLCBlcmxhbmcgdHV0b3JpYWwgYnJva2VuCisgICAgKiBbVEhSSUZULTI5MTNdIC0gUnVieSBTZXJ2ZXIgVGhyaWZ0OjpUaHJlYWRQb29sU2VydmVyIHNob3VsZCBzZXJ2ZSBpbnNpZGUgYSB0aHJlYWQKKyAgICAqIFtUSFJJRlQtMjk5OF0gLSBOb2RlLmpzOiBNaXNzaW5nIGhlYWRlciBmcm9tIGh0dHAgcmVxdWVzdAorICAgICogW1RIUklGVC0zMDAwXSAtIC5ORVQgaW1wbGVtZW50YXRpb24gaGFzIHRyb3VibGUgd2l0aCBtaXhlZCBJUCBtb2RlcworICAgICogW1RIUklGVC0zMjgxXSAtIFRyYXZpcyBDSSBidWlsZCBwYXNzZWQgYnV0IHRoZSBsb2cgc2F5cyBCVUlMRCBGQUlMRUQKKyAgICAqIFtUSFJJRlQtMzM1OF0gLSBNYWtlZmlsZToxMzYyOiAqKiogbWlzc2luZyBzZXBhcmF0b3IuIFN0b3AuCisgICAgKiBbVEhSSUZULTM2MDBdIC0gTWFrZSBUVHdpc3RlZCBzZXJ2ZXIgc2VuZCBleGNlcHRpb24gb24gdW5leHBlY3RlZCBoYW5kbGVyIGVycm9yCisgICAgKiBbVEhSSUZULTM2MDJdIC0gTWFrZSBUb3JuYWRvIHNlcnZlciBzZW5kIGV4Y2VwdGlvbiBvbiB1bmV4cGVjdGVkIGhhbmRsZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzY1N10gLSBEIFRGaWxlV3JpdGVyVHJhbnNwb3J0IGNsb3NlIHNob3VsZCB1c2Ugbm9uLXByaW9yaXR5IHNlbmQKKyAgICAqIFtUSFJJRlQtMzcwMF0gLSBHbyBNYXAgaGFzIHdyb25nIGRlZmF1bHQgdmFsdWUgd2hlbiBvcHRpb25hbAorICAgICogW1RIUklGVC0zNzAzXSAtIFVuaW9ucyBGaWVsZCBDb3VudCBEb2VzIE5vdCBDb25zaWRlciBNYXAvU2V0L0xpc3QgRmllbGRzCisgICAgKiBbVEhSSUZULTM3MzBdIC0gc2VydmVyIGxvZyBlcnJvciB0d2ljZQorICAgICogW1RIUklGVC0zNzc4XSAtIGdvIGNsaWVudCBjYW4gbm90IHBhc3MgbWV0aG9kIHBhcmFtZXRlciB0byBzZXJ2ZXIgb2Ygb3RoZXIgbGFuZ3VhZ2UgaWYgbm8gZmllbGRfaWQgaXMgZ2l2ZW4KKyAgICAqIFtUSFJJRlQtMzc4NF0gLSB0aHJpZnQtbWF2ZW4tcGx1Z2luIGdlbmVyYXRlcyBpbnZhbGlkIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIElETCBpbiBkZXBlbmRlbmN5IEpBUnMKKyAgICAqIFtUSFJJRlQtMzgwMV0gLSBOb2RlIFRocmlmdCBjbGllbnQgdGhyb3dzIGV4Y2VwdGlvbiB3aXRoIG11bHRpcGxleGVyIGFuZCByZXNwb25zZXMgdGhhdCBhcmUgYmlnZ2VyIHRoYW4gYSBzaW5nbGUgYnVmZmVyCisgICAgKiBbVEhSSUZULTM4MjFdIC0gVE1lbW9yeUJ1ZmZlciBidWZmZXIgbWF5IG92ZXJmbG93IHdoZW4gcmVzaXppbmcKKyAgICAqIFtUSFJJRlQtMzgzMl0gLSBUaHJpZnQgdmVyc2lvbiAwLjkuMyBleGFtcGxlIG9uIFdpbmRvd3MsIFZpc3VhbCBTdHVkaW8sIGxpbmtpbmcgZXJyb3JzIGR1cmluZyBjb21waWxpbmcKKyAgICAqIFtUSFJJRlQtMzg0N10gLSB0aHJpZnQvY29uZmlnLmggaW5jbHVkZXMgYSAjZGVmaW5lIGZvciBWRVJTSU9OIHdoaWNoIHdpbGwgbGlrZWx5IGNvbmZsaWN0IHdpdGggZXhpc3RpbmcgdXNlciBlbnZpcm9ubWVudCBvciBjb2RlCisgICAgKiBbVEhSSUZULTM4NzNdIC0gRml4IHZhcmlvdXMgYnVpbGQgd2FybmluZ3Mgd2hlbiB1c2luZyBWaXN1YWwgU3R1ZGlvCisgICAgKiBbVEhSSUZULTM4OTFdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNvbmZpZ3VyZWQgd2l0aCBtb3JlIHRoYW4gb25lIElPIHRocmVhZHMgZG9lcyBub3QgYWx3YXlzIHJldHVybiBmcm9tIHNlcnZlKCkgdXBvbiBzdG9wKCkKKyAgICAqIFtUSFJJRlQtMzg5Ml0gLSBUaHJpZnQgdXNlcyBUTFMgU05JIGV4dGVuc2lvbiBwcm92aWRlZCBieSBPcGVuU1NMIGxpYnJhcnkuIE9sZGVyIHZlcnNpb24gb2YgT3BlblNTTCg8IDAuOS44ZikgbWF5IGNyZWF0ZSBwcm9ibGVtIGJlY2F1c2UgdGhleSBkbyBub3Qgc3VwcG9ydCAnU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKCknLgorICAgICogW1RIUklGVC0zODk1XSAtIEJ1aWxkIGZhaWxzIHVzaW5nIEphdmEgMS44IHdpdGggQW50IDwgMS45CisgICAgKiBbVEhSSUZULTM4OTZdIC0gbWFwPHN0cmluZyxzdHJpbmc+IGRhdGEgd2l0aCBudW1iZXIgc3RyaW5nIGtleSBjYW5ub3QgYWNjZXNzIHRoYXQgZGVzZXJpYWxpemVkIGJ5IHBocCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzkzOF0gLSBQeXRob24gVE5vbmJsb2NraW5nU2VydmVyIGRvZXMgbm90IHdvcmsgd2l0aCBTU0wKKyAgICAqIFtUSFJJRlQtMzk0NF0gLSBUU1NMU29ja2V0IGhhcyBkZWFkIGNvZGUgaW4gY2hlY2tIYW5kc2hha2UKKyAgICAqIFtUSFJJRlQtMzk0Nl0gLSBKYXZhIDEuNSBjb21wYXRpYmlsaXR5IGJyb2tlbiBmb3IgYmluYXJ5IGZpZWxkcyAoamF2YTUgb3B0aW9uKQorICAgICogW1RIUklGVC0zOTYwXSAtIEluaGVyaXRlZCBzZXJ2aWNlcyBpbiBMdWEgZ2VuZXJhdG9yIGFyZSBub3QgbmFtZWQgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM5NjJdIC0gQW50IGJ1aWxkLnhtbCBicm9rZW4gb24gV2luZG93cyBmb3IgSmF2YSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM5NjNdIC0gVGhyaWZ0LmNhYmFsIGZpbGVuYW1lIGRvZXMgbm90IG1hdGNoIG1vZHVsZSBuYW1lCisgICAgKiBbVEhSSUZULTM5NjddIC0gZ29iamVjdC9ncGFyYW0uaDoxNjY6MzM6IHdhcm5pbmc6IGVudW1lcmF0b3IgdmFsdWUgZm9yIOKAmEdfUEFSQU1fREVQUkVDQVRFROKAmSBpcyBub3QgYW4gaW50ZWdlciBjb25zdGFudCBleHByZXNzaW9uCisgICAgKiBbVEhSSUZULTM5NjhdIC0gRGVzZXJpYWxpemluZyBlbXB0eSBzdHJpbmcvYmluYXJ5IGZpZWxkcworICAgICogW1RIUklGVC0zOTc0XSAtIFVzaW5nIGNsYW5nLTMuOCBhbmQgVGhyZWFkU2FuaXRpemVyIG9uIHRoZSBjb25jdXJyZW5jeV90ZXN0IGNsYWltcyBiYWQgUFRocmVhZCBiZWhhdmlvcgorICAgICogW1RIUklGVC0zOTg0XSAtIFBIUDcgZXh0ZW5zaW9uIGNhdXNlcyBzZWdmYXVsdAorICAgICogW1RIUklGVC00MDA4XSAtIGJyb2tlbiBjaSBkdWUgdG8gdXBzdHJlYW0gZGVwZW5kZW5jeSB2ZXJzaW9uaW5nIGJyZWFrCisgICAgKiBbVEhSSUZULTQwMDldIC0gVXNlIEBpbXBsZW1lbnRlciBpbnN0ZWFkIG9mIGltcGxlbWVudHMgaW4gVFR3aXN0ZWQucHkKKyAgICAqIFtUSFJJRlQtNDAxMF0gLSBRLmZjYWxsIG1lc3NpbmcgdXAgd2l0aCAqdGhpcyogcG9pbnRlciBpbnNpZGUgY2FsbGVkIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTQwMTFdIC0gU2V0cyBvZiBUaHJpZnQgc3RydWN0cyBnZW5lcmF0ZSBHbyBjb2RlIHRoYXQgY2FuJ3QgYmUgc2VyaWFsaXplZCB0byBKU09OCisgICAgKiBbVEhSSUZULTQwMTJdIC0gUHl0aG9uIFR3aXN0ZWQgaW1wbGVtZW50YXRpb24gdXNlcyBpbXBsZW1lbnRzLCBub3QgY29tcGF0aWJsZSB3aXRoIFB5MworICAgICogW1RIUklGVC00MDE0XSAtIGFsaWduIEMjIG1ldGEgZGF0YSBpbiBBc3NlbWJseUluZm8uY3MKKyAgICAqIFtUSFJJRlQtNDAxNV0gLSBGaXggd3JvbmdseSBzcGVsbGVkICJUaGlyZnQicworICAgICogW1RIUklGVC00MDE2XSAtIHRlc3RJbnNhbml0eSgpIGltcGwgZG9lcyBub3QgY29uZm9ybSB0byB0ZXN0IHNwZWMgaW4gVGhyaWZ0VGVzdC50aHJpZnQKKyAgICAqIFtUSFJJRlQtNDAyM10gLSBTa2lwIHVuZXhwZWN0ZWQgZmllbGQgdHlwZXMgb24gcmVhZC93cml0ZQorICAgICogW1RIUklGVC00MDI0XSAtIFNraXAoKSBzaG91bGQgdGhyb3cgb24gdW5rbm93biBkYXRhIHR5cGVzCisgICAgKiBbVEhSSUZULTQwMjZdIC0gVFNTTFNvY2tldCBkb2Vzbid0IHdvcmsgd2l0aCBQeXRob24gPCAyLjcuOQorICAgICogW1RIUklGVC00MDI5XSAtIEFjY2VsZXJhdGVkIHByb3RvY29scyBkbyBub3QgYnVpbGQgZnJvbSB0aHJpZnQtcHkgMC4xMC4wIG9uIFB5UEkKKyAgICAqIFtUSFJJRlQtNDAzMV0gLSBHbyBwbHVnaW4gZ2VuZXJhdGVzIGludmFsaWQgY29kZSBmb3IgbGlzdHMgb2YgdHlwZWRlZidlZCBidWlsdC1pbiB0eXBlcworICAgICogW1RIUklGVC00MDMzXSAtIERlZmF1bHQgYnVpbGQgV0lUSF9QTFVHSU49T04gZm9yIGFsbCBidWlsZHMgcmVzdWx0cyBpbiBwYWNrYWdpbmcgZXJyb3JzCisgICAgKiBbVEhSSUZULTQwMzRdIC0gQ01ha2UgZG9lc24ndCB3b3JrIHRvIGJ1aWxkIGNvbXBpbGVyIG9uIE1hY09TCisgICAgKiBbVEhSSUZULTQwMzZdIC0gQWRkIC5ORVQgQ29yZSBlbnZpcm9ubWVudC9idWlsZCBzdXBwb3J0IHRvIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAqIFtUSFJJRlQtNDAzOF0gLSBzb2NrZXQgY2hlY2s6IGNoZWNraW5nIGFuIHVuc2lnbmVkIG51bWJlciBhZ2FpbnN0ID49IDAgbmV2ZXIgZmFpbHMKKyAgICAqIFtUSFJJRlQtNDA0Ml0gLSBFeHRyYWN0aW9uRXJyb3Igd2hlbiB1c2luZyBhY2NlbGVyYXRlZCB0aHJpZnQgaW4gYSBtdWx0aXByb2Nlc3MgdGVzdAorICAgICogW1RIUklGVC00MDQzXSAtIHRocmlmdCBwZXJsIGRlYmlhbiBwYWNrYWdlIGlzIHBsYWNpbmcgZmlsZXMgaW4gdGhlIHdyb25nIHBsYWNlCisgICAgKiBbVEhSSUZULTQwNDRdIC0gQnVpbGQgam9iIDE3IGZhaWxpbmcgb24gZXZlcnkgcHVsbCByZXF1ZXN0OyBoc3BlYyBjb3JlIChoYXNrZWxsKSAyLjQgaXNzdWUKKyAgICAqIFtUSFJJRlQtNDA0Nl0gLSBNaW5HVyB3aXRoIGdjYyA2LjIgZG9lcyBub3QgY29tcGlsZSBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTQwNjBdIC0gVGhyaWZ0IHByaW50VG8gb3N0cmVhbSBvdmVybG9hZCBtZWNoYW5pc20gYnJlYWtzIGRvd24gd2hlbiB0eXBlcyBhcmUgbmVzdGVkCisgICAgKiBbVEhSSUZULTQwNjJdIC0gUmVtb3ZlIGRlYnVnIHByaW50IGZyb20gVFNlcnZpY2VDbGllbnQKKyAgICAqIFtUSFJJRlQtNDA2NV0gLSBEb2N1bWVudCBQZXJsIEZvcmtpbmdTZXJ2ZXIgc2lnbmFsIHJlc3RyaWN0aW9uIGltcG9zZWQgYnkgVEhSSUZULTM4NDggYW5kIHJlbW92ZSB1bm5lY2Vzc2FyeSBjb2RlCisgICAgKiBbVEhSSUZULTQwNjhdIC0gQSBjb2RlIGNvbW1lbnQgaW4gSmF2YSBTZXJ2ZXJTb2NrZXQgaXMgd3JvbmcgYXJvdW5kIGFjY2VwdCgpCisgICAgKiBbVEhSSUZULTQwNzNdIC0gZW51bSBmaWxlcyBhcmUgc3RpbGwgYmVpbmcgZ2VuZXJhdGVkIHdpdGggdW51c2VkIGltcG9ydHMKKyAgICAqIFtUSFJJRlQtNDA3Nl0gLSBBcHB2ZXlvciBidWlsZHMgZmFpbGluZyBiZWNhdXNlIGFudCAxLjkuOCB3YXMgcmVtb3ZlZCBmcm9tIGFwYWNoZSBzZXJ2ZXJzCisgICAgKiBbVEhSSUZULTQwNzddIC0gQUlfQUREUkNPTkZJRyByZWRlZmluZWQgYWZ0ZXIgcmVjZW50IGNoYW5nZSB0byBQbGF0Zm9ybVNvY2tldCBoZWFkZXIKKyAgICAqIFtUSFJJRlQtNDA3OV0gLSBHZW5lcmF0ZWQgcGVybCBjb2RlIHRoYXQgcmV0dXJucyBzdHJ1Y3R1cmVzIGZyb20gaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGlzIG1pc3NpbmcgYSBuZWNlc3NhcnkgdXNlIGNsYXVzZQorICAgICogW1RIUklGVC00MDg3XSAtIFNwdXJpb3VzIGV4Y2VwdGlvbiBkZXN0cm95aW5nIFRUaHJlYWRlZFNlcnZlciBiZWNhdXNlIG9mIGluY29ycmVjdCBqb2luKCkgY2FsbAorICAgICogW1RIUklGVC00MTAyXSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBwZXJmb3JtYW5jZSBpc3N1ZSBzaW5jZSAwLjEwLjAKKyAgICAqIFtUSFJJRlQtNDEwNl0gLSBjb25jdXJyZW5jeV90ZXN0IGZhaWxzIHJhbmRvbWx5CisgICAgKiBbVEhSSUZULTQxMDhdIC0gY19nbGliIHRocmlmdCBzc2wgaGFzIG11bHRpcGxlIGJ1Z3MgYW5kIGRlcHJlY2F0ZWQgZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTQxMDldIC0gQ29uZmlndXJlIFNjcmlwdCB1c2VzIHN0cmluZyBjb21wYXJpc29uIGZvciB2ZXJzaW9ucworICAgICogW1RIUklGVC00MTI5XSAtIEMrKyBUTm9uYmxvY2tpbmdTZXJ2ZXIgZmQgbGVhayB3aGVuIGZhaWxpbmcgdG8gZGlzcGF0Y2ggbmV3IGNvbm5lY3Rpb25zCisgICAgKiBbVEhSSUZULTQxMzFdIC0gSmF2YXNjcmlwdCB3aXRoIFdlYlNvY2tldCBoYW5kbGVzIG9uZXdheSBtZXRob2RzIHdyb25nCisgICAgKiBbVEhSSUZULTQxMzRdIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzCisgICAgKiBbVEhSSUZULTQxNDBdIC0gVXNlIG9mIG5vbi10aHJlYWQtc2FmZSBmdW5jdGlvbiBnbXRpbWUoKQorICAgICogW1RIUklGVC00MTQxXSAtIEluc3RhbGxhdGlvbiBvZiBoYXhlIGluIGRvY2tlciBmaWxlcyByZWZlcnMgdG8gYSByZWRpcmVjdCBsaW5rIGFuZCBmYWlscworICAgICogW1RIUklGVC00MTQ3XSAtIFJ1c3Q6IHByb3RvY29sIHNob3VsZCBhY2NlcHQgdHJhbnNwb3J0cyB3aXRoIG5vbi1zdGF0aWMgbGlmZXRpbWUKKyAgICAqIFtUSFJJRlQtNDE0OF0gLSBbbWF2ZW4tdGhyaWZ0LXBsdWdpbl0gY29tcGlsZSBlcnJvciB3aGlsZSBpbXBvcnQgYSB0aHJpZnQgaW4gZGVwZW5kZW5jeSBqYXIgZmlsZS4KKyAgICAqIFtUSFJJRlQtNDE0OV0gLSBTeXN0ZW0ub3V0IHBvbGx1dGVzIGxvZyBmaWxlcyAKKyAgICAqIFtUSFJJRlQtNDE1NF0gLSBQSFAgY2xvc2UoKSBvZiBhIFRTb2NrZXQgbmVlZHMgdG8gY2xvc2UgYW55IHR5cGUgb2Ygc29ja2V0CisgICAgKiBbVEhSSUZULTQxNThdIC0gbWlub3IgaXNzdWUgaW4gUkVBRE1FLU1TWVMyLm1kCisgICAgKiBbVEhSSUZULTQxNTldIC0gQnVpbGRpbmcgdGVzdHMgZmFpbHMgb24gTVNZUzIgKE1pbkdXNjQpIGR1ZSB0byBhIChzbWFsbD8pIGxpbmtlciBlcnJvcgorICAgICogW1RIUklGVC00MTYwXSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgZml4IHVzZSBvZiBjbG9zZWQvZnJlZWQgY29ubmVjdGlvbnMKKyAgICAqIFtUSFJJRlQtNDE2MV0gLSBUTm9uQmxvY2tpbmcgc2VydmVyIHVzaW5nIHVuaW5pdGlhbGl6ZWQgZXZlbnQgaW4gZXJyb3IgcGF0aHMKKyAgICAqIFtUSFJJRlQtNDE2Ml0gLSBUTm9uQmxvY2tpbmcgaGFuZGxpbmcgb2YgVFNvY2tldHMgaW4gZXJyb3Igc3RhdGUgaXMgaW5jb3JyZWN0IGFmdGVyIGZkIGlzIGNsb3NlZAorICAgICogW1RIUklGVC00MTY0XSAtIENvcmUgaW4gVFNTTFNvY2tldCBjbGVhbnVwT3BlblNTTCB3aGVuIGRlc3Ryb3lpbmcgYSBtdXRleCB1c2VkIGJ5IG9wZW5zc2wKKyAgICAqIFtUSFJJRlQtNDE2NV0gLSBDKysgYnVpbGQgaGFzIG1hbnkgd2FybmluZ3MgdW5kZXIgYysrMDMgZHVlIHRvIHJlY2VudCBjaGFuZ2VzLCBjbWFrZSBuZWVkcyBiZXR0ZXIgcGxhdGZvcm0taW5kZXBlbmRlbnQgbGFuZ3VhZ2UgbGV2ZWwgY29udHJvbAorICAgICogW1RIUklGVC00MTY2XSAtIFJlY2VudCBmaXggdG8gcmVtb3ZlIGJvb3N0OjpsZXhpY2FsX2Nhc3QgdXNhZ2UgYnJva2UgVlMyMDEwCisgICAgKiBbVEhSSUZULTQxNjddIC0gTWlzc2luZyBjb21waWxlIGZsYWcKKyAgICAqIFtUSFJJRlQtNDE3MF0gLSBTdXBwb3J0IGx1YSA1LjEgb3IgZWFybGllciBwcm9wZXJseSBmb3Igb2JqZWN0IGxlbmd0aCBkZXRlcm1pbmF0aW9uCisgICAgKiBbVEhSSUZULTQxNzJdIC0gbm9kZS5qcyB0dXRvcmlhbCBjbGllbnQgZG9lcyBub3QgaW1wb3J0IGFzc2VydCwgY29ubmVjdGlvbiBpc3N1ZXMgYXJlIG5vdCBoYW5kbGVkIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTQxNzddIC0gSmF2YSBjb21waWxlciBwcm9kdWNlcyBkZWVwIGNvcHkgY29uc3RydWN0b3IgdGhhdCBjb3VsZCBtYWtlIHNoYWxsb3cgY29weSBpbnN0ZWFkCisgICAgKiBbVEhSSUZULTQxODRdIC0gQnVpbGRpbmcgb24gQXBwdmV5b3I6IGludmFsaWQgZXNjYXBlIHNlcXVlbmNlIFxMCisgICAgKiBbVEhSSUZULTQxODVdIC0gZmIzMDMgY291bnRlciBlbmNvZGluZyBmaXgKKyAgICAqIFtUSFJJRlQtNDE4OV0gLSBGcmFtZWQvYnVmZmVyZWQgdHJhbnNwb3J0IERpc3Bvc2UoKSBkb2VzIG5vdCBkaXNwb3NlIHRoZSBuZXN0ZWQgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQxOTNdIC0gTG93ZXIgdGhlIGRlZmF1bHQgbWF4UmVhZEJ1ZmZlckJ5dGVzIGZvciBub24tYmxvY2tpbmcgc2VydmVycworICAgICogW1RIUklGVC00MTk1XSAtIENvbXBpbGF0aW9uIHRvIEdPIHByb2R1Y2VzIGJyb2tlbiBjb2RlCisgICAgKiBbVEhSSUZULTQxOTZdIC0gQ2Fubm90IGdlbmVyYXRlIHJlY3Vyc2l2ZSBSdXN0IHR5cGVzCisgICAgKiBbVEhSSUZULTQyMDRdIC0gdHlwbyBpbiBjb21wYWN0IHNwZWMKKyAgICAqIFtUSFJJRlQtNDIwNl0gLSBTdHJpbmdzIGluIGNvbnRhaW5lciBmaWVsZHMgYXJlIG5vdCBkZWNvZGVkIHByb3Blcmx5IHdpdGggcHk6ZHluYW1pYyBhbmQgcHk6dXRmOHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtNDIwOF0gLSBDIyBOYW1lZFBpcGVzU2VydmVyIG5vdCByZWFsbHkgd29ya2luZyBpbiBzb21lIHNjZW5hcmlvcworICAgICogW1RIUklGVC00MjExXSAtIEZpeCBHRXJyb3IgZ2xpYiBtYW5hZ2VtZW50IHVuZGVyIFRocmlmdAorICAgICogW1RIUklGVC00MjEyXSAtIGNfZ2xpYiBmbHVzaCB0cmllcyB0byBjbG9zZSBTU0wgZXZlbiBpZiBzb2NrZXQgaXMgaW52YWxpZAorICAgICogW1RIUklGVC00MjEzXSAtIFRyYXZpcyBidWlsZCBmYWlscyBhdCBjdXJsIC1zU0wgaHR0cHM6Ly93d3cubnBtanMuY29tL2luc3RhbGwuc2ggfCBzaAorICAgICogW1RIUklGVC00MjE1XSAtIEdvbGFuZyBUVHJhbnNwb3J0RmFjdG9yeSBQYXR0ZXJuIFNxdWVsY2hlcyBFcnJvcnMKKyAgICAqIFtUSFJJRlQtNDIxNl0gLSBHb2xhbmcgSHR0cCBDbGllbnRzIERvIE5vdCBSZXNwZWN0IFVzZXIgT3B0aW9ucworICAgICogW1RIUklGVC00MjE4XSAtIFNldCBUQ1BfTk9ERUxBWSBmb3IgUEhQIGNsaWVudCBzb2NrZXQKKyAgICAqIFtUSFJJRlQtNDIxOV0gLSBHb2xhbmcgSFRUUCBjbGllbnRzIGNyZWF0ZWQgd2l0aCBOaWwgYnVmZmVyCisgICAgKiBbVEhSSUZULTQyMzFdIC0gVEpTT05Qcm90b2NvbCB0aHJvd3MgdW5leHBlY3RlZCBub24tVGhyaWZ0LWV4Y2VwdGlvbiBvbiBudWxsIHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtNDIzMl0gLSAuL2NvbmZpZ3VyZSBkb2VzIGJhZCBhbnQgdmVyc2lvbiBjaGVjaworICAgICogW1RIUklGVC00MjM0XSAtIFRyYXZpcyBidWlsZCBmYWlscyBjcm9zcyBsYW5ndWFnZSB0ZXN0cyB3aXRoICJVbnN1cHBvcnRlZCBzZWN1cml0eSBwcm90b2NvbCB0eXBlIgorICAgICogW1RIUklGVC00MjM3XSAtIEdvIFRTZXJ2ZXJTb2NrZXQgUmFjZSBDb25kaXRpb25zCisgICAgKiBbVEhSSUZULTQyNDBdIC0gR28gVFNpbXBsZVNlcnZlciBkb2VzIG5vdCBjbG9zZSBwcm9wZXJseQorICAgICogW1RIUklGVC00MjQzXSAtIEdvIFRTaW1wbGVTZXJ2ZXIgcmFjZSBvbiB3YWl0IGluIFN0b3AoKSBtZXRob2QKKyAgICAqIFtUSFJJRlQtNDI0NV0gLSBHb2xhbmcgVEZyYW1lZFRyYW5zcG9ydCdzIHdyaXRlQnVmZmVyIGluY3JlYXNlcyBpZiB3cml0ZXMgdG8gdHJhbnNwb3J0IGZhaWxlZAorICAgICogW1RIUklGVC00MjQ2XSAtIFNlcXVlbmNlIG51bWJlciBtaXNtYXRjaCBvbiBtdWx0aXBsZXhlZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTQyNDddIC0gQ29tcGlsZSBmYWlscyB3aXRoIG9wZW5zc2wgMS4xCisgICAgKiBbVEhSSUZULTQyNDhdIC0gQ29tcGlsZSBmYWlscyAtIHN0cm5jcHksIG1lbWNtcCwgbWVtc2V0IG5vdCBkZWNsYXJlZCBpbiBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcAorICAgICogW1RIUklGVC00MjUxXSAtIEphdmEgRXBvbGwgU2VsZWN0b3IgQnVnCisgICAgKiBbVEhSSUZULTQyNTddIC0gVHlwZXNjcmlwdCBhc3luYyBjYWxsYmFja3MgZG8gbm90IHByb3ZpZGUgdGhlIGNvcnJlY3QgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDI1OF0gLSBCb29zdC9zdGQgdGhyZWFkIHdyYXBwaW5nIGZhdWx0aW5lc3MKKyAgICAqIFtUSFJJRlQtNDI2MF0gLSBHbyBjb250ZXh0IGdlbmVyYXRpb24gaXNzdWUuIENvbnRleHQgaXMgcGFyYW1ldGVyIGluIEludGVyZmFjZSBub3QgaW4gaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtNDI2MV0gLSBHbyBjb250ZXh0IGdlbmVyYXRpb24gaXNzdWU6IGJyZWFraW5nIGNoYW5nZSBpbiBnZW5lcmF0ZWQgY29kZSByZWdhcmRpbmcgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiBpbnRlcmZhY2UKKyAgICAqIFtUSFJJRlQtNDI2Ml0gLSBJbnZhbGlkIGJpbmRpbmcgdG8gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCgpIHdpdGggNjQtYml0IHRhcmdldHMKKyAgICAqIFtUSFJJRlQtNDI2M10gLSBGaXggdXNlIGFmdGVyIGZyZWUgYnVnIGZvciB0aHJvd24gZXhjZXB0aW9ucworICAgICogW1RIUklGVC00MjY2XSAtIEVybGFuZyBsaWJyYXJ5IHRocm93cyBkdXJpbmcgc2tpcHBpbmcgZmllbGRzIG9mIGNvbXBvc2l0ZSB0eXBlIChtYXBzLCBsaXN0cywgc3RydWN0cywgc2V0cykKKyAgICAqIFtUSFJJRlQtNDI2OF0gLSBFcmxhbmcgbGlicmFyeSBlbWl0cyBkZWJ1Z2dpbmcgb3V0cHV0IGluIHRyYW5zcG9ydCBsYXllcgorICAgICogW1RIUklGVC00MjczXSAtIGVybGFuZzpub3cvMDogRGVwcmVjYXRlZCBCSUYuIAorICAgICogW1RIUklGVC00Mjc0XSAtIFB5dGhvbiBmZWF0dXJlIHRlc3RzIGZvciBTU0wvVExTIGZhaWxpbmcKKyAgICAqIFtUSFJJRlQtNDI3OV0gLSBXcm9uZyBwYXRoIGluIGluY2x1ZGUgZGlyZWN0aXZlIGluIGdlbmVyYXRlZCBUaHJpZnQgc291cmNlcworICAgICogW1RIUklGVC00MjgzXSAtIFROYW1lZFBpcGVTZXJ2ZXIgcmFjZSBjb25kaXRpb24gaW4gaW50ZXJydXB0CisgICAgKiBbVEhSSUZULTQyODRdIC0gRmlsZSBjb250YWlucyBhIE5CU1A6IGxpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCisgICAgKiBbVEhSSUZULTQyOTBdIC0gQyMgbnVsbGFibGUgb3B0aW9uIGdlbmVyYXRlcyBpbnZhbGlkIGNvZGUgZm9yIG5vbi1yZXF1aXJlZCBlbnVtIGZpZWxkIHdpdGggZGVmYXVsdCB2YWx1ZQorICAgICogW1RIUklGVC00MjkyXSAtIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKCkgaXMgbm90IGltcGxlbWVudGVkCisgICAgKiBbVEhSSUZULTQzMDddIC0gTWFrZSBzc2wtb3BlbiB0aW1lb3V0IGVmZmVjdGl2ZSBpbiBnb2xhbmcgY2xpZW50CisgICAgKiBbVEhSSUZULTQzMTJdIC0gRXJsYW5nIGNsaWVudCBjYW5ub3QgY29ubmVjdCB0byBQeXRob24gc2VydmVyOiBleGNlcHRpb24gZXJyb3I6IGVjb25ucmVmdXNlZAorICAgICogW1RIUklGVC00MzEzXSAtIFByb2dyYW0gY29kZSBvZiB0aGUgRXJsYW5nIHR1dG9yaWFsIGZpbGVzIGNvbnRhaW4gc3ludGF4IGVycm9ycworICAgICogW1RIUklGVC00MzE2XSAtIFRCeXRlQnVmZmVyLmphdmEgd2lsbCByZWFkIHRvbyBtdWNoIGRhdGEgaWYgYSBwcmV2aW91cyByZWFkIHJldHVybnMgZmV3ZXIgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQKKyAgICAqIFtUSFJJRlQtNDMxOV0gLSBjb21tYW5kIGxpbmUgc3dpdGNoIGZvciAiZXZodHRwIiBpbmNvcnJlY3RseSByZXNvbHZlZCB0byBhbm9uIHBpcGVzCisgICAgKiBbVEhSSUZULTQzMjNdIC0gcmFuZ2UgY2hlY2sgZXJyb3JzIG9yIE5QRSBpbiBlZGdlIGNhc2VzCisgICAgKiBbVEhSSUZULTQzMjRdIC0gZmllbGQgbmFtZXMgY2FuIGNvbmZsaWN0IHdpdGggbG9jYWwgdmFycyBpbiBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC00MzI4XSAtIFRyYXZpcyBDSSBidWlsZHMgYXJlIHRpbWluZyBvdXQgKGpvYiAxKSBhbmQgaGF4ZSBidWlsZHMgYXJlIGZhaWxpbmcgc2luY2UgOS8xMQorICAgICogW1RIUklGVC00MzI5XSAtIGNfZ2xpYiBEb2Vzbid0IGhhdmUgYSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtNDMzMV0gLSBDKys6IFRTU0xTb2NrZXRzIGJ1ZyBpbiBoYW5kbGluZyBodWdlIG1lc3NhZ2VzLCBidWcgaW4gaGFuZGxpbmcgcG9sbGluZworICAgICogW1RIUklGVC00MzMyXSAtIEJpbmFyeSBwcm90b2NvbCBoYXMgbWVtb3J5IGxlYWtzCisgICAgKiBbVEhSSUZULTQzMzRdIC0gUGVybCBpbmRlbnRhdGlvbiBpbmNvcnJlY3Qgd2hlbiBkZWZhdWx0aW5nIGZpZWxkIGF0dHJpYnV0ZSB0byBhIHN0cnVjdAorICAgICogW1RIUklGVC00MzM5XSAtIFRocmlmdCBGcmFtZWQgVHJhbnNwb3J0IGluIEVybGFuZyBjcmFzaGVzIHNlcnZlciB3aGVuIGNsaWVudCBkaXNjb25uZWN0cworICAgICogW1RIUklGVC00MzQwXSAtIEVybGFuZyBmaXggYSBjcmFzaCBvbiBjbGllbnQgY2xvc2UKKyAgICAqIFtUSFJJRlQtNDM1NV0gLSBKYXZhc2NyaXB0IGluZGVudGF0aW9uIGluY29ycmVjdCB3aGVuIGRlZmF1bHRpbmcgZmllbGQgYXR0cmlidXRlIHRvIGEgc3RydWN0CisgICAgKiBbVEhSSUZULTQzNTZdIC0gdGhyaWZ0X3Byb3RvY29sIGNhbGwgVHJhbnNwb3J0IGNhdXNlIFNlZ21lbnRhdGlvbiBmYXVsdAorICAgICogW1RIUklGVC00MzU5XSAtIEhheGUgY29tcGlsZXIgbG9va3MgbGlrZSBpdCBpcyBwcm9kdWNpbmcgaW5jb3JyZWN0IGNvZGUgZm9yIG1hcCBvciBzZXQga2V5IHRoYXQgaXMgYmluYXJ5IHR5cGUKKyAgICAqIFtUSFJJRlQtNDM2Ml0gLSBNaXNzaW5nIHNpemUtY2hlY2sgY2FuIGxlYWQgdG8gaHVnZSBtZW1vcnkgYWxsb2NhdGlvbgorICAgICogW1RIUklGVC00MzY0XSAtIFdlYnNpdGUgY29udHJpYnV0aW5nIGd1aWRlIGVycm9uZW91c2x5IHJlY29tbWVuZHMgc3VibWl0dGluZyBwYXRjaGVzIGluIEpJUkEKKyAgICAqIFtUSFJJRlQtNDM2NV0gLSBQZXJsIGdlbmVyYXRlZCBjb2RlIHVzZXMgaW5kaXJlY3Qgb2JqZWN0IHN5bnRheCwgd2hpY2ggb2NjYXNpb25hbGx5IGNhdXNlcyBjb21waWxhdGlvbiBlcnJvcnMuCisgICAgKiBbVEhSSUZULTQzNjddIC0gcHl0aG9uIFRQcm9jZXNzb3IucHJvY2VzcyBpcyBtaXNzaW5nICJzZWxmIgorICAgICogW1RIUklGVC00MzcwXSAtIFVidW50dSBBcnRmdWwgY3BwY2hlY2sgYW5kIGZsYWtlOCBhcmUgbW9yZSBzdHJpbmdlbnQgYW5kIGNhdXNpbmcgU0NBIGJ1aWxkIGpvYiBmYWlsdXJlcworICAgICogW1RIUklGVC00MzcyXSAtIFBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIAorICAgICogW1RIUklGVC00Mzc0XSAtIGNhbm5vdCBsb2FkIHRocmlmdF9wcm90b2NvbCBkdWUgdG8gdW5kZWZpbmVkIHN5bWJvbDogX1pUVk4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQorICAgICogW1RIUklGVC00Mzc1XSAtIFRNZW1vcnkgdGhyb3cgYmFkX2FsbG9jIGR1ZSB0byBjb3VudGVyIG92ZXJmbG93CisgICAgKiBbVEhSSUZULTQzNzZdIC0gQ292ZXJpdHkgaGlnaCBpbXBhY3QgaXNzdWUgcmVzb2x1dGlvbgorICAgICogW1RIUklGVC00Mzc3XSAtIGhheGUuIHNvY2tldCBoYW5kbGVzIGxlYWsgaW4gVFNpbXBsZVNlcnZlcgorICAgICogW1RIUklGVC00MzgxXSAtIFdyb25nIGlzc2V0IGJpdGZpZWxkIHZhbHVlIGFmdGVyIHRyYW5zbWlzc2lvbgorICAgICogW1RIUklGVC00Mzg1XSAtIEdvIHJlbW90ZSBjbGllbnQgLXUgZmxhZyBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtNDM5Ml0gLSBjb21waWxlci8uLi4uL3BsdWdpbi50aHJpZnQgc3RydWN0cyBtaXMtb3JkZXJlZCBibG93cyB1cCBvY2FtbCBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtNDM5NV0gLSBVbmFibGUgdG8gYnVpbGQgaW4gdGhlIHVidW50dS14ZW5pYWwgZG9ja2VyIGltYWdlOiBjbGFwIDIuMjggcmVxdWlyZXMgUnVzdCAxLjIwCisgICAgKiBbVEhSSUZULTQzOTZdIC0gaW5jb25zaXN0ZW50IChvciBwbGFpbiB3cm9uZykgdmVyc2lvbiBudW1iZXJzIGluIG1hc3Rlci90cnVuayAKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC00MTU3XSAtIG91dGRhdGVkIHJlYWRtZSBhYm91dCBIYXhlIGluc3RhbGxhdGlvbiBvbiBMaW51eAorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xMDVdIC0gbWFrZSBhIHRocmlmdF9zcGVjIGZvciBhIHN0cnVjdHVyZXMgd2l0aCBuZWdhdGl2ZSB0YWdzCisgICAgKiBbVEhSSUZULTI4MV0gLSBDb2NvYSBsaWJyYXJ5IGNvZGUgbmVlZHMgY29tbWVudHMsIGJhZGx5CisgICAgKiBbVEhSSUZULTc3NV0gLSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgZm9yIFBlcmwKKyAgICAqIFtUSFJJRlQtMjIyMV0gLSBHZW5lcmF0ZSBjKysgY29kZSB3aXRoIHN0ZDo6c2hhcmVkX3B0ciBpbnN0ZWFkIG9mIGJvb3N0OjpzaGFyZWRfcHRyLgorICAgICogW1RIUklGVC0yMzY0XSAtIE9DYW1sOiBVc2UgT2FzaXMgZXhjbHVzaXZlbHkgZm9yIGJ1aWxkIHByb2Nlc3MKKyAgICAqIFtUSFJJRlQtMjUwNF0gLSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3Igc2hvdWxkIGFsbG93IHJlZ2lzdGVyaW5nIGRlZmF1bHQgcHJvY2Vzc29yIGNhbGxlZCBpZiBubyBzZXJ2aWNlIG5hbWUgaXMgcHJlc2VudAorICAgICogW1RIUklGVC0zMjA3XSAtIEVuYWJsZSBidWlsZCB3aXRoIE9wZW5TU0wgMS4xLjAgc2VyaWVzCisgICAgKiBbVEhSSUZULTMyNzJdIC0gUGVybCBTU0wgQXV0aGVudGljYXRpb24gU3VwcG9ydAorICAgICogW1RIUklGVC0zMzU3XSAtIEdlbmVyYXRlIEVudW1TZXQvRW51bU1hcCB3aGVyZSBlbGVtZW50cy9rZXlzIGFyZSBlbnVtcworICAgICogW1RIUklGVC0zMzY5XSAtIEltcGxlbWVudCBTU0wvVExTIHN1cHBvcnQgb24gQyB3aXRoIGNfZ2xpYgorICAgICogW1RIUklGVC0zNDY3XSAtIEdvIE1hcHMgZm9yIFRocmlmdCBTZXRzIFNob3VsZCBIYXZlIFZhbHVlcyBvZiBUeXBlIHN0cnVjdHt9IAorICAgICogW1RIUklGVC0zNTgwXSAtIFRIZWFkZXIgZm9yIEhhc2tlbGwKKyAgICAqIFtUSFJJRlQtMzYyN10gLSBNaXNzaW5nIGJhc2ljIGNvZGUgc3R5bGUgY29uc2lzdGVuY3kgb2YgSmF2YVNjcmlwdC4KKyAgICAqIFtUSFJJRlQtMzcwNl0gLSBUaGVyZSdzIG5vIHN1cHBvcnQgZm9yIE11bHRpcGxleGVkIHByb3RvY29sIG9uIGNfZ2xpYiBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM3NjZdIC0gQWRkIGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB0byBUWmxpYlRyYW5zcG9ydAorICAgICogW1RIUklGVC0zNzc2XSAtIEdvIGNvZGUgZnJvbSBtdWx0aXBsZSB0aHJpZnQgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMzgyM10gLSBFc2NhcGUgZG9jdW1lbnRhdGlvbiB3aGlsZSBnZW5lcmF0aW5nIG5vbiBlc2NhcGVkIGRvY3VtZXRhdGlvbgorICAgICogW1RIUklGVC0zODU0XSAtIGFsbG93IHVzZXJzIHRvIGNsZWFyIHJlYWQgYnVmZmVycworICAgICogW1RIUklGVC0zODU5XSAtIFVuaXggRG9tYWluIFNvY2tldCBTdXBwb3J0IGluIE9iamVjdGl2ZS1DCisgICAgKiBbVEhSSUZULTM5MjFdIC0gQysrIGNvZGUgc2hvdWxkIHByaW50IGVudW1zIGFzIHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtMzkyNl0gLSBUaGVyZSBzaG91bGQgYmUgYW4gZXJyb3IgZW1pdHRlZCB3aGVuIGh0dHAgc3RhdHVzIGNvZGUgaXMgbm90IDIwMCAKKyAgICAqIFtUSFJJRlQtNDAwN10gLSBNaWNyby1vcHRpbWl6YXRpb24gb2YgVFRyYW5zcG9ydC5weQorICAgICogW1RIUklGVC00MDQwXSAtIEFkZCByZWFsIGNhdXNlIG9mIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCBlcnJvciB0byBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDA2NF0gLSBVcGRhdGUgbm9kZSBsaWJyYXJ5IGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC00MDY5XSAtIEFsbCBwZXJsIHBhY2thZ2VzIHNob3VsZCBoYXZlIHByb3BlciBuYW1lc3BhY2UsIHZlcnNpb24gc3ludGF4LCBhbmQgdXNlIHByb3BlciB0aHJpZnQgZXhjZXB0aW9ucworICAgICogW1RIUklGVC00MDcxXSAtIENvbnNvbGlkYXRlIHRoZSBUcmF2aXMgQ0kgam9icyB3aGVyZSBwb3NzaWJsZSB0byBwdXQgbGVzcyBzdHJlc3Mgb24gdGhlIEFwYWNoZSBGb3VuZGF0aW9uJ3MgYWxsb2NhdGlvbiBvZiBDSSBidWlsZCBzbGF2ZXMKKyAgICAqIFtUSFJJRlQtNDA3Ml0gLSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIHNlbmQgY3VzdG9tIGhlYWRlcnMgaW4gVEN1cmxDbGllbnQKKyAgICAqIFtUSFJJRlQtNDA3NV0gLSBCZXR0ZXIgTWluR1cgc3VwcG9ydCBmb3IgaGVhZGVycy1vbmx5IGJvb3N0ICh3aXRob3V0IHRocmVhZCBsaWJyYXJ5KQorICAgICogW1RIUklGVC00MDgxXSAtIFByb3ZpZGUgYSBNaW5HVyA2NC1iaXQgQXBwdmV5b3IgQ0kgYnVpbGQgZm9yIGJldHRlciBwdWxsIHJlcXVlc3QgdmFsaWRhdGlvbgorICAgICogW1RIUklGVC00MDg0XSAtIEltcHJvdmUgU1NMIHNlY3VyaXR5IGluIHRocmlmdCBieSBhZGRpbmcgYSBtYWtlIGNyb3NzIGNsaWVudCB0aGF0IGNoZWNrcyB0byBtYWtlIHN1cmUgU1NMdjMgcHJvdG9jb2wgY2Fubm90IGJlIG5lZ290aWF0ZWQKKyAgICAqIFtUSFJJRlQtNDA5NV0gLSBBZGQgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgdG8gVHJhdmlzIENJIGZvciBtYWtlIGNyb3NzCisgICAgKiBbVEhSSUZULTQwOTldIC0gQXV0by1kZXJpdmUgSGFzaCBmb3IgZ2VuZXJhdGVkIFJ1c3Qgc3RydWN0cworICAgICogW1RIUklGVC00MTEwXSAtIFRoZSBkZWJpYW4gYnVpbGQgZmlsZXMgZG8gbm90IHByb2R1Y2UgYSAiLWRiZyIgcGFja2FnZSBmb3IgZGVidWcgc3ltYm9scyBvZiBsaWJ0aHJpZnQwCisgICAgKiBbVEhSSUZULTQxMTRdIC0gU3BhY2UgYWZ0ZXIgJy8vLycgaW4gZG9jIGNvbW1lbnRzCisgICAgKiBbVEhSSUZULTQxMjZdIC0gVmFsaWRhdGUgb2JqZWN0cyBpbiBwaHAgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTQxMzBdIC0gRW5zdXJlIEFwYWNoZSBIdHRwIGNvbm5lY3Rpb24gaXMgcmVsZWFzZWQgYmFjayB0byBwb29sIGFmdGVyIHVzZQorICAgICogW1RIUklGVC00MTUxXSAtIFRocmlmdCBNdXRleCBDb250ZW50aW9uIFByb2ZpbGluZyAocHRocmVhZHMpIHNob3VsZCBiZSBkaXNhYmxlZCBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTQxNzZdIC0gSW1wbGVtZW50IGEgdGhyZWFkZWQgYW5kIHRocmVhZHBvb2wgc2VydmVyIHR5cGUgZm9yIFJ1c3QKKyAgICAqIFtUSFJJRlQtNDE4M10gLSBOYW1lZCBwaXBlIGNsaWVudCBibG9ja3MgZm9yZXZlciBvbiBPcGVuKCkgd2hlbiB0aGVyZSBpcyBubyBzZXJ2ZXIgYXQgdGhlIG90aGVyIGVuZAorICAgICogW1RIUklGVC00MTkwXSAtIGltcHJvdmUgQyMgVFRocmVhZFBvb2xTZXJ2ZXIgZGVmYXVsdHMKKyAgICAqIFtUSFJJRlQtNDE5N10gLSBJbXBsZW1lbnQgdHJhbnNwYXJlbnQgZ3ppcCBjb21wcmVzc2lvbiBmb3IgSFRUUCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDE5OF0gLSBSdWJ5IHNob3VsZCBsb2cgVGhyaWZ0IGludGVybmFsIGVycm9ycyB0byBnbG9iYWwgbG9nZ2VyCisgICAgKiBbVEhSSUZULTQyMDNdIC0gdGhyaWZ0IHNlcnZlciBzdG9wIGdyYWNlZnVsbHkKKyAgICAqIFtUSFJJRlQtNDIwNV0gLSBjX2dsaWIgaXMgbm90IGxpbmtpbmcgYWdhaW5zdCBnbGliICsgZ29iamVjdAorICAgICogW1RIUklGVC00MjA5XSAtIHdhcm5pbmcgQ1MwNDE0IGluIFRbVExTXVNlcnZlclNvY2tldC5jcworICAgICogW1RIUklGVC00MjEwXSAtIGluY2x1ZGUgVGhyaWZ0LjQ1LmNzcHJvaiBpbnRvIENJIHJ1bnMgCisgICAgKiBbVEhSSUZULTQyMTddIC0gSHR0cENsaWVudCBzaG91bGQgc3VwcG9ydCBnemlwIGFuZCBkZWZsYXRlCisgICAgKiBbVEhSSUZULTQyMjJdIC0gU3VwcG9ydCBVbml4IERvbWFpbiBTb2NrZXRzIGluIEdvbGFuZyBUU2VydmVyU29ja2V0CisgICAgKiBbVEhSSUZULTQyMzNdIC0gTWFrZSBUSHNIYVNlcnZlci5pbnZva2VyIGF2YWlsYWJsZSAoZ2V0IG1ldGhvZCBvbmx5KSBpbiBpbmhlcml0ZWQgY2xhc3NlcworICAgICogW1RIUklGVC00MjM2XSAtIFN1cHBvcnQgY29udGV4dCBpbiBnbyBnZW5lcmF0ZWQgY29kZS4KKyAgICAqIFtUSFJJRlQtNDIzOF0gLSBKU09OIGdlbmVyYXRvcjogbWFrZSBhbm5vdGF0aW9uLWF3YXJlCisgICAgKiBbVEhSSUZULTQyNjldIC0gRG9uJ3QgYXBwZW5kICcuJyB0byBFcmxhbmcgbmFtZXNwYWNlIGlmIGl0IGVuZHMgaW4gJ18nLgorICAgICogW1RIUklGVC00MjcwXSAtIEdlbmVyYXRlIEVybGFuZyBtYXBwaW5nIGZ1bmN0aW9ucyBmb3IgY29uc3QgbWFwcyBhbmQgbGlzdHMKKyAgICAqIFtUSFJJRlQtNDI3NV0gLSBBZGQgc3VwcG9ydCBmb3Igem9wZS5pbnRlcmZhY2Ugb25seSwgYXBhcnQgZnJvbSB0d2lzdGVkIHN1cHBvcnQuCisgICAgKiBbVEhSSUZULTQyODVdIC0gUHVsbCBnZW5lcmF0ZWQgc2VuZC9yZWN2IGludG8gbGlicmFyeSB0byBhbGxvdyBiZWhhdmlvdXIgdG8gYmUgY3VzdG9taXNlZAorICAgICogW1RIUklGVC00Mjg3XSAtIEFkZCBjKysgY29tcGlsZXIgIm5vX3NrZWxldG9uIiBmbGFnIG9wdGlvbgorICAgICogW1RIUklGVC00Mjg4XSAtIEltcGxlbWVudCBsb2dnaW5nIGxldmVscyBwcm9wZXJseSBmb3Igbm9kZS5qcworICAgICogW1RIUklGVC00Mjk1XSAtIFJlZnJlc2ggdGhlIERvY2tlciBpbWFnZSBmaWxlIHN1aXRlIGZvciBVYnVudHUsIERlYmlhbiwgYW5kIENlbnRPUworICAgICogW1RIUklGVC00MzA1XSAtIEVtaXQgZGRvYyBmb3IgZ2VuZXJhdGVkIGl0ZW1zCisgICAgKiBbVEhSSUZULTQzMDZdIC0gVGhyaWZ0IGltcG9ydHMgbm90IHJlcGxpY2F0ZWQgdG8gRCBzZXJ2aWNlIG91dHB1dAorICAgICogW1RIUklGVC00MzE1XSAtIEFkZCBkZWZhdWx0IG1lc3NhZ2UgZm9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICAgICogW1RIUklGVC00MzE4XSAtIERlbHBoaSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtNDMyNV0gLSBTaW1wbGlmeSBhdXRvbWFrZSBjcm9zcyBjb21waWxhdGlvbiBieSByZWx5aW5nIG9uIG9uZSBnbG9iYWwgVEhSSUZUIGNvbXBpbGVyIHBhdGgKKyAgICAqIFtUSFJJRlQtNDMyN10gLSBJbXByb3ZlIFRpbWVyTWFuYWdlciBBUEkgdG8gYWxsb3cgcmVtb3Zpbmcgc3BlY2lmaWMgdGFzaworICAgICogW1RIUklGVC00MzMwXSAtIEFsbG93IHVudXNlZCBjcmF0ZXMgaW4gUnVzdCBmaWxlcworICAgICogW1RIUklGVC00MzMzXSAtIEVybGFuZyB0dXRvcmlhbCBleGFtcGxlcyBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgcG9ydCAoOTk5OSkKKyAgICAqIFtUSFJJRlQtNDM0M10gLSBDaGFuZ2UgQ0kgYnVpbGRzIHRvIHVzZSBub2RlLmpzIDgueCBMVFMgb25jZSBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtNDM0NV0gLSBDcmVhdGUgYSBkb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgdGhhdCB1c2VzIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCBsYW5ndWFnZSBsZXZlbHMKKyAgICAqIFtUSFJJRlQtNDM0Nl0gLSBBbGxvdyBabGliIHRyYW5zcG9ydCBmYWN0b3J5IHRvIHdyYXAgb3RoZXIgdHJhbnNwb3J0cworICAgICogW1RIUklGVC00MzQ4XSAtIFBlcmwgSFRUUCBDbGllbnQgY3VzdG9tIEhUVFAgaGVhZGVycworICAgICogW1RIUklGVC00MzUwXSAtIFVwZGF0ZSBuZXRjb3JlIGJ1aWxkIGZvciBkb3RuZXQgMi4wIHNkayBhbmQgbWFrZSBjcm9zcyB2YWxpZGF0aW9uCisgICAgKiBbVEhSSUZULTQzNTFdIC0gVXNlIFRyYXZpcyBDSSBCdWlsZCBTdGFnZXMgdG8gb3B0aW1pemUgdGhlIENJIGJ1aWxkCisgICAgKiBbVEhSSUZULTQzNTNdIC0gY2Fubm90IHJlYWQgdmlhIHRocmlmdF9wcm90b2NvbCBhdCBzZXJ2ZXIgc2lkZQorICAgICogW1RIUklGVC00Mzc4XSAtIGFkZCBzZXQgc3RvcFRpbWVvdXRVbml0IG1ldGhvZCB0byBUVGhyZWFkUG9vbFNlcnZlcgorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC03NTBdIC0gQysrIENvbXBpbGVyIFZpcnR1YWwgRnVuY3Rpb24gT3B0aW9uCisgICAgKiBbVEhSSUZULTI5NDVdIC0gSW1wbGVtZW50IHN1cHBvcnQgZm9yIFJ1c3QgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtMzg1N10gLSB0aHJpZnQganM6bm9kZSBjb21wbGllciBzdXBwb3J0IGFuIG9iamVjdCBhcyBwYXJhbWV0ZXIgbm90IGFuIGluc3RhbmNlIG9mIHN0cnVjdAorICAgICogW1RIUklGVC0zOTMzXSAtIFBvcnQgb2ZmaWNpYWwgQyMgLk5FVCBsaWJyYXJ5IGZvciBUaHJpZnQgdG8gQyMgLk5FVCBDb3JlIGxpYmFyeQorICAgICogW1RIUklGVC00MDM5XSAtIFVwZGF0ZSBvZiBBcGFjaGUgVGhyaWZ0IC5OZXQgQ29yZSBsaWIgCisgICAgKiBbVEhSSUZULTQxMTNdIC0gUHJvdmlkZSBhIGJ1ZmZlciB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZyBpbiBtZW1vcnkgYnl0ZSBzdHJlYW0KKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMjk1Nl0gLSBhdXRvY29uZiAtIHBvc3NpYmx5IHVuZGVmaW5lZCBtYWNybyAtIEFDX1BST0dfQklTT04KKyAgICAqIFtUSFJJRlQtNDIyM10gLSBBZGQgc3VwcG9ydCB0byB0aGUgaXNTZXJ2aW5nKCkgbWV0aG9kIGZvciB0aGUgQysrIGxpYnJhcnkKKworIyMgVGFzaworICAgICogW1RIUklGVC0zNjIyXSAtIEZpeCBkZXByZWNhdGVkIHVzZXMgb2Ygc3RkOjphdXRvX3B0cgorICAgICogW1RIUklGVC00MDI4XSAtIFBsZWFzZSByZW1vdmUgU3lzdGVtLm91dC5mb3JtYXQgZnJvbSB0aGUgc291cmNlIGNvZGUKKyAgICAqIFtUSFJJRlQtNDE4Nl0gLSBCdWlsZCBhbmQgdGVzdCBydXN0IGNsaWVudCBpbiBUcmF2aXMKKworIyMgVGVzdAorICAgICogW1RIUklGVC00MjY0XSAtIFBIUCAtIFN1cHBvcnQgYm90aCBzaGFyZWQgJiBzdGF0aWMgbGlua2luZyBvZiBzb2NrZXRzIGxpYnJhcnkKKworIyMgV2lzaAorICAgICogW1RIUklGVC00MzQ0XSAtIERlZmluZSBhbmQgbWFpbnRhaW4gdGhlIG1pbmltdW0gbGFuZ3VhZ2UgbGV2ZWwgZm9yIGFsbCBsYW5ndWFnZXMgaW4gb25lIHBsYWNlCisKKwkKK1RocmlmdCAwLjEwLjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTg0MF0gLSBUaHJpZnQgR2VuZXJhdGVkIENvZGUgQ2F1c2VzIEdsb2JhbCBWYXJpYWJsZSBMZWFrcworICAgICogW1RIUklGVC0xODI4XSAtIG1vY19UUVRjcFNlcnZlci5jcHAgd2FzIHJlbW92ZWQgZnJvbSBzb3VyY2UgdHJlZSBidXQgaXMgaW4gdGhyaWZ0LTAuOS4wLnRhci5negorICAgICogW1RIUklGVC0xNzkwXSAtIGNvY29hOiBEdXBsaWNhdGUgaW50ZXJmYWNlIGRlZmluaXRpb24gZXJyb3IKKyAgICAqIFtUSFJJRlQtMTc3Nl0gLSBUUGlwZVNlcnZlciBzaG91bGQgaW1wbGVtZW50ICJsaXN0ZW4iLCBzbyB0aGF0IFRTZXJ2ZXJFdmVudEhhbmRsZXIgcHJlU2VydmUgd2lsbCB3b3JrIHJpZ2h0CisgICAgKiBbVEhSSUZULTEzNTFdIC0gQ29tcGlsZXIgZG9lcyBub3QgY2FyZSBhYm91dCBiaW5hcnkgc3RyaW5ncworICAgICogW1RIUklGVC0xMjI5XSAtIFB5dGhvbiBmYXN0YmluYXJ5LmMgY2FuIG5vdCBoYW5kbGUgdW5pY29kZSBhcyBnZW5lcmF0ZWQgcHl0aG9uIGNvZGUKKyAgICAqIFtUSFJJRlQtNzQ5XSAtIEMrKyBUQnVmZmVyZWRUcmFuc3BvcnRzIGRvIG5vdCBmbHVzaCB0aGVpciBidWZmZXJzIG9uIGRlbGV0ZQorICAgICogW1RIUklGVC03NDddIC0gQysrIFRTb2NrZXQtPmNsb3NlIGNhbGxzIHNodXRkb3duIGJyZWFraW5nIGZvcmtlZCBwYXJlbnQgcHJvY2VzcworICAgICogW1RIUklGVC03MzJdIC0gc2VydmVyIGV4aXRzIGFibm9ybWFsbHkgd2hlbiBjbGllbnQgY2FsbHMgc2VuZF94eHggZnVuY3Rpb24gd2l0aG91dCBjYWxsaW5nIHJlY3ZfeHh4IGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTM5NDJdIC0gVFNTTFNvY2tldCBkb2VzIG5vdCBob25vciBzZW5kIGFuZCByZWNlaXZlIHRpbWVvdXRzCisgICAgKiBbVEhSSUZULTM5NDFdIC0gV2luWFAgdmVyc2lvbiBvZiB0aHJpZnRfcG9sbCgpIHJlbGllcyBvbiB1bmRlZmluZWQgYmVoYXZpb3IgYnkgcGFzc2luZyBhIGRlc3RydWN0ZWQgdmFyaWFibGUgdG8gc2VsZWN0KCkKKyAgICAqIFtUSFJJRlQtMzk0MF0gLSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZSBmb3IgY29tcGlsZXIgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTM5NDNdIC0gQ292ZXJpdHkgU2NhbiBpZGVudGlmaWVkIHNvbWUgaGlnaCBzZXZlcml0eSBkZWZlY3RzCisgICAgKiBbVEhSSUZULTM5MjldIC0gUEhQICJuc2dsb2JhbCIgT3B0aW9uIFJlc3VsdHMgaW4gU3ludGF4IEVycm9yIGluIEdlbmVyYXRlZCBDb2RlIChUcmFpbGluZyBCYWNrc2xhc2gpCisgICAgKiBbVEhSSUZULTM5MzZdIC0gQ2Fubm90IGNvbXBpbGUgMC4xMC4wIGRldmVsb3BtZW50IHRpcCB3aXRoIFZTMjAxMyBhbmQgZWFybGllciAoc25wcmludGYsIHVpbnQzMl90KQorICAgICogW1RIUklGVC0zOTM1XSAtIEluY29ycmVjdCBza2lwcGluZyBvZiBtYXAgYW5kIHNldAorICAgICogW1RIUklGVC0zOTIwXSAtIFJ1Ynk6IEVuc3VyaW5nIHRoYXQgSFRUUCBmYWlsdXJlcyB3aWxsIGNsZWFyIHRoZSBodHRwIHRyYW5zcG9ydCBvdXRidWYgdmFyCisgICAgKiBbVEhSSUZULTM5MTldIC0gQyMgVFRMU1NlcnZlclNvY2tldCBkb2VzIG5vdCB1c2UgY2xpZW50VGltZW91dAorICAgICogW1RIUklGVC0zOTE3XSAtIENoZWNrIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgbW9kdWxlIHZlcnNpb24KKyAgICAqIFtUSFJJRlQtMzkwOV0gLSBGaXggY19nbGliIHN0YXRpYyBsaWIgQ01ha2UgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzkwNF0gLSBUeXBvIGluIG5vZGUgdHV0b3JpYWwgbGVhZHMgdG8gd3JvbmcgdHJhbnNwb3J0IGJlaW5nIHVzZWQKKyAgICAqIFtUSFJJRlQtMzg0OF0gLSBBcyBhbiBpbXBsZW1lbnRlciBvZiBhIHBlcmwgc29ja2V0IHNlcnZlciwgSSBkbyBub3Qgd2FudCB0byBoYXZlIHRvIHJlbWVtYmVyIHRvIGlnbm9yZSBTSUdDSExEIGZvciBpdCB0byB3b3JrIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTM4NDRdIC0gdGhyaWZ0X3Byb3RvY29sIGNhbm5vdCBjb21waWxlIGluIDcuMC43CisgICAgKiBbVEhSSUZULTM4NDNdIC0gaW50ZWdlciBpc3N1ZXMgd2l0aCBIYXhlIFBIUCB0YXJnZXRzIGNhdXNlIFppZ1phZyBlbmNvZGluZyB0byBmYWlsCisgICAgKiBbVEhSSUZULTM4NDJdIC0gRGFydCBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgZm9yIGEgY29uc3Qgc3RydWN0CisgICAgKiBbVEhSSUZULTM4NDFdIC0gZGFydCBjb21wYWN0IHByb3RvY29sIGluY29ycmVjdGx5IHNlcmlhbGl6ZXMvZGVzZXJpYWxpemVkIGRvdWJsZXMKKyAgICAqIFtUSFJJRlQtMzcwOF0gLSBOYW1lRXJyb3I6IGdsb2JhbCBuYW1lICdUUHJvdG9jb2wnIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTM3MDRdIC0gIlRDb25uZWN0ZWRDbGllbnQgZGllZDogQ291bGQgbm90IHJlZmlsbCBidWZmZXIiIG1lc3NhZ2Ugc2hvd24gd2hlbiB1c2luZyBIVFRQIFNlcnZlcgorICAgICogW1RIUklGVC0zNjc4XSAtIEZpeCBqYXZhZG9jIGVycm9ycyBvbiBKREsgOAorICAgICogW1RIUklGVC0zMDE0XSAtIEFwcFZleW9yIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjk5NF0gLSBOb2RlLmpzIFRKU09OUHJvdG9jb2wgY2Fubm90IGJlIHVzZWQgZm9yIG9iamVjdCBzZXJpYWxpemF0aW9uLgorICAgICogW1RIUklGVC0yOTc0XSAtIHdyaXRlVG9QYXJjZWwgdGhyb3dzIE5QRSBmb3Igb3B0aW9uYWwgZW51bSBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjk0OF0gLSBQeXRob24gVEpTT05Qcm90b2NvbCBkb2Vzbid0IGhhbmRsZSBzdHJ1Y3RzIHdpdGggYmluYXJ5IGZpZWxkcyBjb250YWluaW5nIGludmFsaWQgdW5pY29kZS4KKyAgICAqIFtUSFJJRlQtMjg0NV0gLSBDaGlsZFNlcnZpY2UuUGxvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgICAgKiBbVEhSSUZULTMyNzZdIC0gQmluYXJ5IGRhdGEgZG9lcyBub3QgZGVjb2RlIGNvcnJlY3RseSB1c2luZyB0aGUgVEpTT05Qcm90b2NvbCB3aGVuIHRoZSBiYXNlNjQgZW5jb2RlZCBkYXRhIGlzIHBhZGRlZC4KKyAgICAqIFtUSFJJRlQtMzI1M10gLSBVc2luZyBsYXRlc3QgdmVyc2lvbiBvZiBEIGdpdmVzIGRlcHJlY2F0aW9uIG5vdGljZXMKKyAgICAqIFtUSFJJRlQtMjg4M10gLSBUVHdpc3RlZC5weSwgZHVyaW5nIENvbm5lY3Rpb25Mb3N0IHByb2Nlc3Npbmc6IGV4Y2VwdGlvbnMuUnVudGltZUVycm9yOiBkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uCisgICAgKiBbVEhSSUZULTIwMTldIC0gV3JpdGluZyBvbiBhIGRpc2Nvbm5lY3RlZCBzb2NrZXQgb24gTWFjIGNhdXNlcyBTSUcgUElQRQorICAgICogW1RIUklGVC0yMDIwXSAtIFRocmlmdCBsaWJyYXJ5IGhhcyBzb21lIGVtcHR5IGZpbGVzIHRoYXQgaGF2ZW4ndCByZWFsbHkgYmVlbiBkZWxldGVkCisgICAgKiBbVEhSSUZULTIwNDldIC0gR28gY29tcGlsZXIgZG9lc24ndCBidWlsZCBvbiBuYXRpdmUgV2luZG93cworICAgICogW1RIUklGVC0yMDI0XSAtIFRTZXJ2ZXIuY3BwIHdhcm5zIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYWJvdXQgdHJ1bmNhdGluZyBhbiBybGltX3QgaW50byBhbiBpbnQKKyAgICAqIFtUSFJJRlQtMjAyM10gLSBnZXR0aW1lb2ZkYXkgaW1wbGVtZW50YXRpb24gb24gV2luZG93cyBlcnJvcnMgd2hlbiBubyB0aW1lIHpvbmUgaXMgcGFzc2VkIGluLgorICAgICogW1RIUklGVC0yMDIyXSAtIENvQiBhbmQgZGVuc2UgY29kZSBnZW5lcmF0aW9uIHN0aWxsIHVzZXMgVFIxIGJpbmQsIGV2ZW4gdGhvdWdoIHRoYXQgZG9lc24ndCB3b3JrIHdpdGggY2xhbmcKKyAgICAqIFtUSFJJRlQtMjAyN10gLSBNaW5vciA2NC1iaXQgYW5kIE5PTUlOTUFYIGlzc3VlcyBpbiBDKysgbGlicmFyeQorICAgICogW1RIUklGVC0yMTU2XSAtIFRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGlzIHRocm93aW5nIGV4Y2VwdGlvbnMgd2l0aCBtaXNsZWFkaW5nIGluZm9ybWF0aW9uCisgICAgKiBbVEhSSUZULTIxNTRdIC0gTWlzc2luZyA8b3BlcmF0b3IgYm9keQorICAgICogW1RIUklGVC0yMTQ4XSAtIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQgaW1wb3J0cyBsb2c0agorICAgICogW1RIUklGVC0yMTAzXSAtIFtweXRob25dIFN1cHBvcnQgZm9yIFNTTCBjZXJ0aWZpY2F0ZXMgd2l0aCBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWVzCisgICAgKiBbVEhSSUZULTE5MzFdIC0gU2VuZGluZyBhIGZyYW1lIHNpemUgb2YgemVybyB0byBhIFROb25ibG9ja2luZ1NlcnZlciBjYXVzZXMgYW4gYXNzZXJ0aW9uIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMTc1MV0gLSBkZWZpbml0aW9uIG9mIGluY3JlYXNlX21heF9mZHMgZG9lc24ndCBjb21waWxlIHdoZW4gSEFWRV9TWVNfUkVTT1VSQ0VfSCBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0xNTIyXSAtIFRTZXJ2ZXJTb2NrZXQgcG90ZW50aWFsIG1lbW9yeSBsZWFrIHdpdGggYWRkcmluZm8gKnJlczAKKyAgICAqIFtUSFJJRlQtMTU0N10gLSBQcm9ibGVtcyBidWlsZGluZyBhZ2FpbnN0IHN0YXRpYyBsaWJldmVudAorICAgICogW1RIUklGVC0xNTQ1XSAtIEdlbmVyYXRlZCBqYXZhc2NyaXB0IGNvZGUgdXNlcyAiZm9yIGluIiBmb3IgbG9vcGluZyBvdmVyIGFycmF5cworICAgICogW1RIUklGVC0xNDg3XSAtIE5hbWVzcGFjZSBwcm9ibGVtLCBjb21waWxlIGZhaWxzIG9uIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTE0NzJdIC0gQ29uZmlndXJhdGlvbiBjb25mbGljdHMgd2l0aCBib29zdCBwbGF0Zm9ybSBpbmNsdWRlIGhlYWRlcgorICAgICogW1RIUklGVC02XSAtIFRocmlmdCBsaWJyYXJpZXMgYW5kIGNvbXBpbGVyIGxhY2sgdmVyc2lvbiBudW1iZXIKKyAgICAqIFtUSFJJRlQtMTY4MF0gLSBtYWtlIGluc3RhbGwgcmVxdWlyZXMgR05VIG1ha2UKKyAgICAqIFtUSFJJRlQtMzg2OV0gLSBEYXJ0IFR1dG9yaWFsIGJ1aWxkIGZhaWxzIHdpdGggRXJyb3IgNjUgYXQgInB1YiBnZXQiCisgICAgKiBbVEhSSUZULTM4NjFdIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgdGltaW5nIG91dCAtIEMrK1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgYXBwZWFycyB0byBiZSBoYW5naW5nCisgICAgKiBbVEhSSUZULTM4NTVdIC0gSW4gdGhlIGdvIHNpbXBsZSBzZXJ2ZXIsIGlmIFN0b3AoKSBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaXQgaGFuZ3MKKyAgICAqIFtUSFJJRlQtMzg4NV0gLSBQSFA6IEVycm9yIHdoZW4gcmVhZEk2NCBpbiBUQ29tcGFjdFByb3RvY29sCisgICAgKiBbVEhSSUZULTM4ODNdIC0gR28gVGVzdEFsbENvbm5lY3Rpb24gY2FuIGZhaWwgd2l0aCBwb3J0IDkwOTAgY29sbGlzaW9uCisgICAgKiBbVEhSSUZULTM4ODRdIC0gRml4IEVybGFuZyBjb21wYWN0IHByb3RvY29sIGRvdWJsZSBlbmRpYW5lc3MgYW5kIGJvb2xlYW4gbGlzdAorICAgICogW1RIUklGVC0zODgwXSAtIEVybGFuZyBDb21wYWN0IHByb3RvY29sIC0gYm9vbGVhbiB2YWx1ZXMgaW52ZXJ0ZWQKKyAgICAqIFtUSFJJRlQtMzg3OV0gLSBVbmRlZmluZWQgZXZhbHVhdGlvbiBvcmRlciBjYXVzZXMgaW5jb3JyZWN0IHByb2Nlc3NpbmcgaW4gdGhlIEMrKyBsaWJyYXJ5IEpTT04gcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzg1MV0gLSBHb2xhbmcgdGhyaWZ0IGNvbnRpbnVhbGx5IGFkZHMgdGhlIHgvdGhyaWZ0IGNvbnRlbnQgdHlwZSAKKyAgICAqIFtUSFJJRlQtMzg1MF0gLSBBbGwgYXBhY2hlIGJ1aWxkcyBhcmUgZmFpbGluZyB3aGVuIGluaXRpYXRlZCBmcm9tIGEgZ2l0aHViIHB1bGwgcmVxdWVzdAorICAgICogW1RIUklGVC0zODM3XSAtIFRoaWZ0IDAuOS4zIGNhbid0IGJlIGJ1aWxkIHdpdGggUXVpY2tDaGVjayAyLjguMiBhbmQgdW5vcmRlcmVkLWNvbnRhaW5lcnMgMC4yLjYKKyAgICAqIFtUSFJJRlQtMzgzMV0gLSBidWlsZCBvZiB0ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAgZmFpbHMgd2l0aCBuZXdlciBnY2Mgb24gcGxhdGZvcm1zIHdpdGggdW5zaWduZWQgY2hhciBkdWUgdG8gbmFycm93aW5nIGNvbnZlcnNpb25zCisgICAgKiBbVEhSSUZULTM4MjddIC0gcGhwIENvbXBhY3RQcm90b2NvbCByZWFkSTY0IGZ1bmN0aW9uIGhhcyBidWcsIHdoZW4gdmFsdWUgaGFzIDMyYml0IH42NGJpdCwgRXhhbXBsZe+8mnZhbHVlPTE0NjE1NjM0NTcwMDAgCisgICAgKiBbVEhSSUZULTM4MjVdIC0gSmF2YXNjcmlwdCB0ZXN0IGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zODE0XSAtIEZpeCBjb250ZW50aW9uIGluIFROb25ibG9ja2luZ1NlcnZlclRlc3QKKyAgICAqIFtUSFJJRlQtMzc5M10gLSBBcHB2ZXlvciBidWlsZHMgcmVmZXJlbmNlIGFuIGFudCB2ZXJzaW9uIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZXJlCisgICAgKiBbVEhSSUZULTM3ODZdIC0gTm9kZS5qcyBUTFMgZW1pdHMgJ2Nvbm5lY3QnIGJlZm9yZSBjb25uZWN0aW9uIGlzIHJlYWR5CisgICAgKiBbVEhSSUZULTM3ODBdIC0gRml4IGRhcnQgaW50NjQgdXNhZ2Ugd2hlbiBjb21waWxlZCB0byBqcworICAgICogW1RIUklGVC0zNzg5XSAtIE5vZGUuanMgbGFja3MgYWJpbGl0eSB0byBkZXN0cm95IGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtMzc5Nl0gLSBUaGVyZSdzIG5vIC0tZGJnIGZvciBkaF9zdHJpcCwgbWF5YmUgc29tZW9uZSBoYXMgbWlzdGFrZW4gdGhpcyBmb3IgLS1kYmctcGFja2FnZS4KKyAgICAqIFtUSFJJRlQtMzc5NV0gLSBHZW5lcmF0ZWQgaGFzaFZhbHVlIG1ldGhvZCBpbiBTd2lmdCB3aWxsIG92ZXJmbG93CisgICAgKiBbVEhSSUZULTM3OTBdIC0gRml4IERlbHBoaSBuYW1lZCBwaXBlIGNsaWVudCB0byB1c2UgdGltZW91dCBldmVuIHdoZW4gcGlwZSBkb2Vzbid0IHlldCBleGlzdAorICAgICogW1RIUklGVC0zNzg3XSAtIE5vZGUuanMgQ29ubmVjdGlvbiBvYmplY3QgZG9lc24ndCBoYW5kbGUgZXJyb3JzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zNzkxXSAtIERlbHBoaSBwaXBlIGNsaWVudCBtYXkgZmFpbCBldmVuIGluIGEgbm9uLWVycm9yIGNvbmRpdGlvbgorICAgICogW1RIUklGVC0zNzcxXSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBnZXRzIGluIGludmFsaWQgc3RhdGUgb24gcmVhZC93cml0ZSBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMzc2NF0gLSBQSFAgIm1ha2UgaW5zdGFsbCIgZG9lcyBub3QgaW5zdGFsbCBUTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgbm9yIFRTaW1wbGVKU09OUHJvdG9jb2wucGhwCisgICAgKiBbVEhSSUZULTM3NjhdIC0gVFRocmVhZGVkU2VydmVyIG1heSBjcmFzaCBpZiBpdCBpcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgcmV0dXJucyBmcm9tIHNlcnZlKCk7IFRUaHJlYWRlZFNlcnZlciBkaXNjb25uZWN0cyBjbGllbnRzCisgICAgKiBbVEhSSUZULTM3NjVdIC0gbWVtb3J5IGxlYWsgaW4gcHl0aG9uIGNvbXBhY3QgcHJvdG9jb2wgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTM3NThdIC0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpnZXRUeXBlIGFuZCBUUHJvdG9jb2xFeGNlcHRpb246OmdldFR5cGUgc2hvdWxkIGJlIGNvbnN0CisgICAgKiBbVEhSSUZULTM3NjNdIC0gRml4IHNlcmlhbGl6YXRpb24gb2YgaTY0IGxhcmdlciB0aGFuIDJeNTMgZm9yIGJyb3dzZXJpZnkKKyAgICAqIFtUSFJJRlQtMzc1OV0gLSByZXF1aXJlZCBmaWVsZHMgdGhhdCBhcmUgbmlsIGFyZSBzaWxlbnRseSBpZ25vcmVkIG9uIHdyaXRlCisgICAgKiBbVEhSSUZULTM3NTNdIC0gVFNlcnZlckZyYW1ld29yazo6c3RvcCBtYXkgZmFpbCB0byBpbnRlcnJ1cHQgY29ubmVjdGVkIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzc1NV0gLSBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcgaGl0cyBhc3NlcnQgaW4gaXNwcmludCBvbiBXaW5kb3dzIHdpdGggZGVidWcgQ1JUCisgICAgKiBbVEhSSUZULTM3NTFdIC0gQ29tcGlsZXIgYWxsb3dzIGZpZWxkIGlkcyB0aGF0IGFyZSB0b28gbGFyZ2UgZm9yIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTM3NDhdIC0gTm9kZS5qcyBEZXNlcmlhbGl6YXRpb24gb2YgbGlzdHMgb2YgbGlzdHMgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTM3NjBdIC0gRml4IGluc3RhbGwgcGF0aHMgZXRjIG9mIGRlYmlhbiBwYWNrYWdlcyBmb3IgcHkgYW5kIHBlcmwKKyAgICAqIFtUSFJJRlQtMzc1N10gLSBGaXggdmFyaW91cyBidWlsZCB3YXJuaW5ncyBvbiBXaW5kb3dzIHdpdGggVlMyMDE1IGNvbXBpbGVyCisgICAgKiBbVEhSSUZULTM3NTBdIC0gTlNDb3B5aW5nIGNvcHlXaXRoWm9uZTogaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY2hlY2sgaXNTZXQKKyAgICAqIFtUSFJJRlQtMzc0N10gLSBEdXBsaWNhdGUgbm9kZS5qcyBidWlsZCBvbiBUcmF2aXMtQ0kKKyAgICAqIFtUSFJJRlQtMzc0NF0gLSBUaGUgcHJlY2lzaW9uIHNob3VsZCBiZSAxNyAoMTYgYml0cyBuZWVkIGFmdGVyIGRvdCkgYWZ0ZXIgZG90IGZvciBkb3VibGUgdHlwZS4KKyAgICAqIFtUSFJJRlQtMzc0MV0gLSBoYXhlIHRlc3QgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTM3MzldIC0gRGVwcmVjYXRpb24gd2FybmluZyBpbiBjb2RlZ2VuL2Jhc2UuZAorICAgICogW1RIUklGVC0zNzM1XSAtIEpTT04gcHJvdG9jb2wgbGVmdCBpbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtMzczNF0gLSBUbyBjb21wYXJlIHR3byBzdHJpbmcgYXMgbG93ZXJjYXNlLgorICAgICogW1RIUklGVC0zNzQzXSAtIEphdmEgSlNPTiBwcm90b2NvbCBsZWZ0IGluIGluY29ycmVjdCBzdGF0ZSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucworICAgICogW1RIUklGVC0zNzMxXSAtIFBlcmwgbXVsdGlwbGV4IHRlc3QgaXMgZmxha3kKKyAgICAqIFtUSFJJRlQtMzcyOV0gLSBSZXN0cmljdCByYWtlIHZlcnNpb24KKyAgICAqIFtUSFJJRlQtMzcyN10gLSBJbmNvcnJlY3QgcmVxdWlyZSBwYXRocyBpbiBOb2RlLmpzIHR1dG9yaWFsCisgICAgKiBbVEhSSUZULTM3MjNdIC0gRml4IEx1YSBpbmNsdWRlIHBhdGgKKyAgICAqIFtUSFJJRlQtMzcyMl0gLSBGaXggY2VydCBwYXRoIGluIEMrKyBjcm9zcyB0ZXN0cyBmb3Igbm9uLUxpbnV4IHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTM3MjZdIC0gRml4IGluY29ycmVjdCBjb25kaXRpb25hbCBpbiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKKyAgICAqIFtUSFJJRlQtMzcyNV0gLSBTa2lwIGEgZmxha3kgY3Jvc3MgdGVzdCBlbnRyeSAoZC1kYXJ0IGNvbXBhY3QgZnJhbWVkLWlwKQorICAgICogW1RIUklGVC0zNzI0XSAtIEZpeCBpbmNvcnJlY3QgdGltZXZhbCBjb252ZXJzaW9uIGluIGxpYmV2ZW50LmQKKyAgICAqIFtUSFJJRlQtMzcyMV0gLSBDTE9ORSAtIHdoeSBub3QgYWRkIHVuaWNvZGUgc3RyaW5ncyBzdXBwb3J0IHRvIHB5dGhvbiBkaXJlY3RseT8KKyAgICAqIFtUSFJJRlQtMzcyMF0gLSBUVGNwU29ja2V0U3RyZWFtSW1wbC5SZWFkKCkgcmV0dXJucyAwIGlmIG5vdCBhbGwgcmVxdWVzdGVkIGJ5dGVzIGNvdWxkIGJlIHJlYWQKKyAgICAqIFtUSFJJRlQtMzcxOV0gLSBEYXJ0IGdlbmVyYXRvciBzaG91bGQgdXNlIGxvd2VyQ2FtZWxDYXNlIGZvciBzZXJ2aWNlIG5hbWVzCisgICAgKiBbVEhSSUZULTM5MDJdIC0gVFNvY2tldC5vcGVuIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zOTAxXSAtIFRGcmFtZWRUcmFuc3BvcnQub3BlbiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzg5M10gLSBDb21tYW5kIGluamVjdGlvbiBpbiBmb3JtYXRfZ29fb3V0cHV0CisgICAgKiBbVEhSSUZULTM4MDddIC0gU3dpZnQgY29tcGlsZXIgZG9lcyBub3QgZXNjYXBlIHJlc2VydmVkIHdvcmRzCisgICAgKiBbVEhSSUZULTM3OThdIC0gVEh0dHBDbGllbnQgZG9lcyBub3QgdXNlIHByb3h5IGZyb20gaHR0cF9wcm94eSwgaHR0cHNfcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgKiBbVEhSSUZULTM4MDldIC0gd3JvbmcvdW51c2VkIEJJTkFSWSB0eXBlIGNvZGUKKyAgICAqIFtUSFJJRlQtMzgwNl0gLSBTd2lmdCBnZW5lcmF0b3IgZG9lcyBub3QgaGFuZGxlIHNlbGYtcmVmZXJyaW5nIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMzgwNV0gLSBHb2xhbmcgc2VydmVyIHN1c2NlcHRpYmxlIHRvIG1lbW9yeSBzcGlrZSBmcm9tIG1hbGZvcm1lZCBtZXNzYWdlCisgICAgKiBbVEhSSUZULTM3OTddIC0gR2VuZXJhdGVkIERlbHBoaSBwcm9jZXNzb3Igc2hvdWxkbid0IGVycm9yIG91dCBvbiB0aW1lZCBvdXQgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0zODEzXSAtIEFwcHZleW9yIGJ1aWxkcyByZWZlcmVuY2UgYW4gb3BlbnNzbCB2ZXJzaW9uIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZXJlCisgICAgKiBbVEhSSUZULTM2NThdIC0gTWlzc2luZyBmaWxlIGluIFRIUklGVC0zNTk5CisgICAgKiBbVEhSSUZULTM2NDldIC0gUHl0aG9uIFRTYXNsQ2xpZW50VHJhbnNwb3J0IGluaXRpYWxpemVzIFRUcmFuc3BvcnRFeGNlcHRpb24gaW5jb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzY1MF0gLSBpbmNvcnJlY3QgdW5pb24gc2VyaWFsaXphdGlvbiAKKyAgICAqIFtUSFJJRlQtMzcxM10gLSBsaWIvZC90ZXN0L3RocmlmdF90ZXN0X3J1bm5lci5zaCBpcyBmbGFreSBvbiBKZW5raW5zCisgICAgKiBbVEhSSUZULTM2NjhdIC0gcmFuZ2UgY2hlY2sgZXJyb3IgaW4gY29tcGFjdCBwcm90b2NvbAorICAgICogW1RIUklGVC0zNjYzXSAtIENNYWtlIGNwcCB0ZXN0IGZhaWxzIHRvIGJ1aWxkIG9uIHN5c3RlbSB3aXRob3V0IHpsaWIKKyAgICAqIFtUSFJJRlQtMzcxMl0gLSBUVG9ybmFkb1NlcnZlciBjYW5ub3QgaGFuZGxlIElQdjYgYWRkcmVzcworICAgICogW1RIUklGVC0zNzEwXSAtIERhcnQgZ2VuZXJhdG9yIGRvZXMgbm90IGNhbWVsIGNhc2UgQ29uc3RhbnRzIGNsYXNzIG5hbWVzCisgICAgKiBbVEhSSUZULTM2OTddIC0gRGFydCBnZW5lcmF0b3IgZG9lcyBub3QgbmFtZSBpbXBvcnRzCisgICAgKiBbVEhSSUZULTM2OTBdIC0gV29yayBhcm91bmQgZG9ja2VyIGltYWdlIGJ1aWxkIGZhaWx1cmVzIG9uIFRyYXZpcy1DSQorICAgICogW1RIUklGVC0zNjg5XSAtIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50IHN0YXJ0IGZhaWxlZCB3aGVuIHNlcnZlciBpcyBub3QgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM2OTVdIC0gRml4IEQgdGVzdCBzY3JpcHRzCisgICAgKiBbVEhSSUZULTM2NzVdIC0gVW5pb24gaXMgbm90IHNlcmlhbGl6ZWQgY29ycmVjdGx5IGJ5IFRocmlmdCBDIEdsaWIKKyAgICAqIFtUSFJJRlQtMzY3M10gLSBBUEkgZmFpbHMgd2l0aCBzdGQ6OmV4Y2VwdGlvbiBhZnRlciBhIHRpbWVvdXQgb2NjdXJlZCBpbiBlYXJsaWVyIGFueSBBUEkgY2FsbAorICAgICogW1RIUklGVC0zNzA5XSAtIENvbW1lbnQgc3ludGF4IGNhbiBwcm9kdWNlIGJyb2tlbiBjb2RlCisgICAgKiBbVEhSSUZULTM3MDVdIC0gR28gbWFwIGhhcyBpbmNvcnJlY3QgdHlwZXMgd2hlbiB1c2VkIHdpdGggZm9yd2FyZC1kZWZpbmVkIHR5cGVzCisgICAgKiBbVEhSSUZULTM3MDJdIC0gRml4IGNyb3NzIHRlc3RzIGZvciBEYXJ0IGNvbXBhY3QgcHJvdG9jb2wgKDMgZmFpbGluZykKKyAgICAqIFtUSFJJRlQtMzY4M10gLSBCYWRZaWVsZEVycm9yIGluIHRocmlmdCBweTp0b3JuYWRvIHNlcnZlcgorICAgICogW1RIUklGVC0zNjgyXSAtIERvIG5vdCByZXVzZSByZWZ1c2VkIHNvY2tldHMgaW4gdGVzdCBzY3JpcHRzCisgICAgKiBbVEhSSUZULTM2ODFdIC0gRml4IERhcnQgdHV0b3JpYWwgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY4MF0gLSBKYXZhIGFzeW5jIHByb2Nlc3NvciBmYWlscyB0byBub3RpZnkgZXJyb3JzIHRvIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzcxNF0gLSBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uIGlzIG5vdCBkZWZpbmVkIGluIGpzL3NyYy90aHJpZnQuanMKKyAgICAqIFtUSFJJRlQtMzY4OF0gLSBGaXggc29ja2V0IGJpbmQgZmFpbHVyZSBkZXRlY3Rpb24gb2YgY3Jvc3MgdGVzdAorICAgICogW1RIUklGVC0zNjQxXSAtIFJ1YnkgY2xpZW50IHNob3VsZCB0cnkgdG8gY29ubmVjdCB0byBldmVyeSByZXN1bHQgb2YgZ2V0YWRkcmluZm8KKyAgICAqIFtUSFJJRlQtMzYzNV0gLSBEIHRyYW5zcG9ydF90ZXN0IGlzIGZsYWt5IG9uIEplbmtpbnMgYW5kIFRyYXZpcworICAgICogW1RIUklGVC0zNjE4XSAtIFB5dGhvbiBUU1NMU29ja2V0IGRlcHJlY2F0aW9uIG1lc3NhZ2Ugc2hvdWxkIHByaW50IGNhbGxlcidzIGxvY2F0aW9uCisgICAgKiBbVEhSSUZULTMxNDVdIC0gSlNPTiBwcm90b2NvbCBkb2VzIG5vdCBoYW5kbGUgYm9vbCBhbmQgZW1wdHkgY29udGFpbmVycyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzE1OF0gLSBUQmFzZTxULEY+I2RlZXBDb3B5IHNob3VsZCByZXR1cm4gVAorICAgICogW1RIUklGVC0zMTU3XSAtIFRCYXNlIHNpZ25hdHVyZSBzaG91bGQgYmUgVEJhc2U8VCBleHRlbmRzIFRCYXNlPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+CisgICAgKiBbVEhSSUZULTMxNTZdIC0gTm9kZSBUTFM6IHNlcnZlciBleGVjdXRlcyBwcm9jZXNzaW5nIGxvZ2ljIHR3byBmdWxsIHRpbWVzCisgICAgKiBbVEhSSUZULTMxNTRdIC0gdHV0b3JpYWwvcHkudG9ybmFkbyB0aHJvdyBFT0YgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMwNjNdIC0gQysrIGJ1aWxkIC1XdW51c2VkLXBhcmFtZXRlciB3YXJuaW5ncyBvbiBwcm9jZXNzb3JfdGVzdCwgVHJhbnNwb3J0VGVzdAorICAgICogW1RIUklGVC0zMDU2XSAtIEFkZCBzdHJpbmcvY29sbGVjdGlvbiBsZW5ndGggbGltaXRzIGZvciBQeXRob24gcHJvdG9jb2wgcmVhZGVycworICAgICogW1RIUklGVC0zMjM3XSAtIEZpeCBUTmFtZWRQaXBlU2VydmVyOjpjcmVhdGVOYW1lZFBpcGUgbWVtb3J5IGxlYWsKKyAgICAqIFtUSFJJRlQtMzIzM10gLSBGaXggQysrIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlciB3b3JrZXIgam9pbgorICAgICogW1RIUklGVC0zMjMyXSAtIENhbm5vdCBkZXNlcmlhbGl6ZSBqc29uIG1lc3NhZ2VzIGNyZWF0ZWQgd2l0aCBmaWVsZE5hbWVzQXNTdHJpbmcgCisgICAgKiBbVEhSSUZULTMyMDZdIC0gRml4IFZpc3VhbCBTdHVkaW8gYnVpbGQgZmFpbHVyZSBkdWUgJ3B0aHJlYWRfc2VsZic6IGlkZW50aWZpZXIgbm90IGZvdW5kCisgICAgKiBbVEhSSUZULTMyMDBdIC0gSlMgYW5kIG5vZGVqcyBkbyBub3QgZW5jb2RlIEpTT04gcHJvdG9jb2wgYmluYXJ5IGZpZWxkcyBhcyBiYXNlNjQKKyAgICAqIFtUSFJJRlQtMzE5OV0gLSBFeGNlcHRpb24gZmllbGQgaGFzIGJhc2ljIG1ldGFkYXRhCisgICAgKiBbVEhSSUZULTMxODJdIC0gVEZyYW1lZFRyYW5zcG9ydCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlIGFmdGVyIGZyYW1lIHNpemUgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTI1MzZdIC0gbmV3IFRTb2NrZXQsIHVuaW5pdGlhbGlzZWQgdmFsdWUgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQKKyAgICAqIFtUSFJJRlQtMjUyN10gLSBBcGFjaGUgVGhyaWZ0IElETCBDb21waWxlciBjb2RlIGdlbmVyYXRlZCBmb3IgTm9kZS5qcyBzaG91bGQgYmUganNoaW50IGNsZWFuCisgICAgKiBbVEhSSUZULTI1MTldIC0gInByb2Nlc3NvciIgY2xhc3MgaXMgbm90IGJlaW5nIGdlbmVyYXRlZAorICAgICogW1RIUklGVC0yNDMxXSAtIFRGaWxlVHJhbnNwb3J0VGVzdCBmYWlscyB3aXRoICJjaGVjayBkZWx0YSA8IFhYWCBmYWlsZWQiCisgICAgKiBbVEhSSUZULTI3MDhdIC0gRXJsYW5nIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydCAib25ld2F5IiBtZXNzYWdlIHR5cGUKKyAgICAqIFtUSFJJRlQtMzM3N10gLSBEZWVwIGNvcHkgaXMgYWN0dWFsbHkgc2hhbGxvdyB3aGVuIHVzaW5nIHR5cGVkZWYgbWVtYmVycworICAgICogW1RIUklGVC0zMzc2XSAtIEMjIGFuZCBQeXRob24gSlNPTiBwcm90b2NvbCBkb3VibGUgdmFsdWVzIGxvc2UgcHJlY2lzaW9uCisgICAgKiBbVEhSSUZULTMzNzNdIC0gVmFyaW91cyBmaXhlcyBmb3IgY3Jvc3MgdGVzdCBzZXJ2ZXJzIGFuZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTMzNzBdIC0gZXJybm8gZXh0ZXJuIHZhcmlhYmxlIHJlZGVmaW5lZC4gTm90IGNvbXBpbGluZyBmb3IgQW5kcm9pZAorICAgICogW1RIUklGVC0zMzc5XSAtICBQb3RlbnRpYWwgb3V0IG9mIHJhbmdlIHBhbmljIGluIEdvIEpTT04gcHJvdG9jb2xzCisgICAgKiBbVEhSSUZULTMzNzFdIC0gQWJzdHJhY3QgbmFtZXNwYWNlIFVuaXggZG9tYWluIHNvY2tldHMgYnJva2VuIGluIEMrKworICAgICogW1RIUklGVC0zMzgwXSAtIG5vZGVqczogMC45LjIgLT4gMC45LjMgdXBncmFkZSBicmVha3MgUHJvdG9jb2wgYW5kIFRyYW5zcG9ydCByZXF1aXJlcworICAgICogW1RIUklGVC0zMzY3XSAtIEZpeCBiYWQgbGlua3MgdG8gY29kaW5nX3N0YW5kYXJkcy5tZCAjNjM0IAorICAgICogW1RIUklGVC0zNDAxXSAtIE5lc3RlZCBjb2xsZWN0aW9ucyBlbWl0IE9iamVjdGl2ZS1DIGNvZGUgdGhhdCBjYW5ub3QgY29tcGlsZQorICAgICogW1RIUklGVC0zNDAzXSAtIEpTT04gU3RyaW5nIHJlYWRlciBkb2Vzbid0IHJlY29nbml6ZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzCisgICAgKiBbVEhSSUZULTMzNjJdIC0gbWFrZSBjaGVjayBmYWlscyBmb3IgQysrIGF0IHRoZSBTZWN1cml0eVRlc3QKKyAgICAqIFtUSFJJRlQtMzM5NV0gLSBDb2NvYSBjb21waWxlciBwcm9kdWNlcyBjb3JydXB0IGNvZGUgd2hlbiBib3hpbmcgZW51bXMgaW5zaWRlIG1hcC4KKyAgICAqIFtUSFJJRlQtMzM5NF0gLSBjb21waWxlciBnZW5lcmF0ZXMgdW5jb21waWxhYmxlIGNvZGUKKyAgICAqIFtUSFJJRlQtMzM4OF0gLSBoYXNoIGRvZXNuJ3Qgd29yayBvbiBzZXQvbGlzdAorICAgICogW1RIUklGVC0zMzkxXSAtIFdyb25nIGJvb2wgZm9ybWF0dGluZyBpbiB0ZXN0IHNlcnZlcgorICAgICogW1RIUklGVC0zMzkwXSAtIFRUb3JuYWRvIHNlcnZlciBkb2Vzbid0IGhhbmRsZSBjbG9zZWQgY29ubmVjdGlvbnMgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtMzM4Ml0gLSBUQmFzZSBjbGFzcyBmb3IgQysrIExpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzM5Ml0gLSBKYXZhIFRabGliVHJhbnNwb3J0IGRvZXMgbm90IGNsb3NlIGl0cyB3cmFwcGVyIHN0cmVhbXMgdXBvbiBjbG9zZSgpCisgICAgKiBbVEhSSUZULTMzODNdIC0gaTY0IHJlbGF0ZWQgd2FybmluZ3MgCisgICAgKiBbVEhSSUZULTMzODZdIC0gbWlzYy4gd2FybmluZ3Mgd2l0aCBtYWtlIGNoZWNrCisgICAgKiBbVEhSSUZULTMzODVdIC0gd2FybmluZzogZm9ybWF0IOKAmCVsdeKAmSBleHBlY3RzIOKAmGxvbmcgdW5zaWduZWQgaW504oCZLCBidXQgaGFzIHR5cGUg4oCYc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj46OnNpemVfdHlwZSB7YWthIHVuc2lnbmVkIGludH0KKyAgICAqIFtUSFJJRlQtMzM1NV0gLSBucG0gV0FSTiBwYWNrYWdlLmpzb24gdGhyaWZ0QDEuMC4wLWRldiBObyBsaWNlbnNlIGZpZWxkLgorICAgICogW1RIUklGVC0zMzYwXSAtIEltcHJvdmUgY3Jvc3MgdGVzdCBzZXJ2ZXJzIGFuZCBjbGllbnRzIGZ1cnRoZXIKKyAgICAqIFtUSFJJRlQtMzM1OV0gLSBCaW5hcnkgZmllbGQgaW5jb21wYXRpYmlsaXRpZXMKKyAgICAqIFtUSFJJRlQtMzM1NF0gLSBGaXggd29yZC1leHRyYWN0aW9uIHN1YnN0ciBidWcgaW4gaW5pdGlhbGlzbSBjb2RlCisgICAgKiBbVEhSSUZULTMzNTBdIC0gUHl0aG9uIEpTT04gcHJvdG9jb2wgZG9lcyBub3QgZW5jb2RlIGJpbmFyeSBhcyBCYXNlNjQKKyAgICAqIFtUSFJJRlQtMzU3N10gLSBhc3NlcnRpb24gZmFpbGVkIGF0IGxpbmUgNTEyIG9mIHRlc3Rjb250YWluZXJ0ZXN0LmMKKyAgICAqIFtUSFJJRlQtMzU3Nl0gLSBCb29zdCB0ZXN0IC0tbG9nX2Zvcm1hdCBhcmcgZG9lcyBub3QgYWNjZXB0IGxvd2VyY2FzZQorICAgICogW1RIUklGVC0zNTc1XSAtIEdvIGNvbXBpbGVyIHRyaWVzIHRvIHVzZSB1bmV4cG9ydGVkIGxpYnJhcnkgbWV0aG9kcyB3aGVuIHVzaW5nIHJlYWRfd3JpdGVfcHJpdmF0ZQorICAgICogW1RIUklGVC0zNTc0XSAtIENvY29hIGdlbmVyYXRvciBtYWtlcyB1bmNvbXBpbGFibGUgaW1wb3J0cworICAgICogW1RIUklGVC0zNTcwXSAtIFJlbW92ZSBkdXBsaWNhdGUgaW5zdGFuY2VzIHRoYXQgYXJlIGFkZGVkIGJ5IHVwc3RyZWFtCisgICAgKiBbVEhSSUZULTM1NzFdIC0gTWFrZSBmZWF0dXJlIHRlc3QgcmVzdWx0IGJyb3dzYWJsZQorICAgICogW1RIUklGVC0zNTY5XSAtIGNfZ2xpYiBwcm90b2NvbHMgZG8gbm90IGNoZWNrIG51bWJlciBvZiBieXRlcyByZWFkIGJ5IHRyYW5zcG9ydAorICAgICogW1RIUklGVC0zNTY4XSAtIFRIZWFkZXIgc2VydmVyIGNyYXNoZXMgb24gcmVhZFNsb3cKKyAgICAqIFtUSFJJRlQtMzU2N10gLSBHTGliLUdPYmplY3QtQ1JJVElDQUwgKio6IGdfb2JqZWN0X3VucmVmOiBhc3NlcnRpb24gJ0dfSVNfT0JKRUNUIChvYmplY3QpJyBmYWlsZWQKKyAgICAqIFtUSFJJRlQtMzU2Nl0gLSBDKysvUXQ6IFRRVGNwU2VydmVyVGVzdDo6dGVzdF9jb21tdW5pY2F0ZSgpIGlzIG5ldmVyIGV4ZWN1dGVkCisgICAgKiBbVEhSSUZULTM1NjRdIC0gQysrL1F0OiBwb3RlbnRpYWwgY29yZSBkdW1wIGluIFRRVGNwU2VydmVyIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBUQXN5bmNQcm9jZXNzb3I6OnByb2Nlc3MoKQorICAgICogW1RIUklGVC0zNTU4XSAtIHR5cG9zIGluIGNfZ2xpYiB0ZXN0cworICAgICogW1RIUklGVC0zNTU5XSAtIEZpeCBhd2t3YXJkIGV4dHJhIHNlbWktY29sb25zIHdpdGggQ29jb2EgY29udGFpbmVyIGxpdGVyYWxzCisgICAgKiBbVEhSSUZULTM1NTVdIC0gJ2NvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGhvbm9yIC0td2l0aC1vcGVuc3NsPTxwYXRoPiBmb3IgbGliY3J5cHRvIGZvciBCTl9pbml0CisgICAgKiBbVEhSSUZULTM1NTRdIC0gQ29uc3RhbnQgZGVjbHMgbWF5IGxlYWQgdG8gIkVycm9yOiBpbnRlcm5hbCBlcnJvcjogcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgYWxyZWFkeSBhY3RpdmUgZm9yIGRpZmZlcmVudCBzdHJ1Y3QiCisgICAgKiBbVEhSSUZULTM1NTJdIC0gZ2xpYl9jIE1lbW9yeSBMZWFrCisgICAgKiBbVEhSSUZULTM1NTFdIC0gVGhyaWZ0IHBlcmwgbGlicmFyeSBtaXNzaW5nIHBhY2thZ2UgZGVjbGFyYXRpb24KKyAgICAqIFtUSFJJRlQtMzU0OV0gLSBFeGNlcHRpb25zIGFyZSBub3QgcHJvcGVybHkgc3RyaW5naWZpZWQgaW4gUGVybCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM1NDZdIC0gTm9kZUpTIGNvZGUgc2hvdWxkIG5vdCBiZSBuYW1lc3BhY2VkIChhbmQgaXMgY3VycmVudGx5IG5vdCBzdHJpY3QtbW9kZSBjb21wbGlhbnQpCisgICAgKiBbVEhSSUZULTM1NDVdIC0gQ29udGFpbmVyIHR5cGUgbGl0ZXJhbHMgZG8gbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMzUzOF0gLSBSZW1vdmUgVW5ib3VuZE1ldGhvZFR5cGUgaW4gVFByb3RvY29sRGVjb3JhdG9yCisgICAgKiBbVEhSSUZULTM1MzZdIC0gRXJyb3IgJ2NoYXInIGRvZXMgbm90IGNvbnRhaW4gYSBkZWZpbml0aW9uIGZvciAnSXNMb3dTdXJyb2dhdGUnIGZvciBXUDcgdGFyZ2V0CisgICAgKiBbVEhSSUZULTM1MzRdIC0gTGluayBlcnJvciB3aGVuIGJ1aWxkaW5nIHdpdGggUXQ1CisgICAgKiBbVEhSSUZULTM1MzNdIC0gQ2FuIG5vdCBzZW5kIG5pbCBwb2ludGVyIGFzIHNlcnZpY2UgbWV0aG9kIGFyZ3VtZW50CisgICAgKiBbVEhSSUZULTM1MDddIC0gVEh0dHBDbGllbnQgZG9lcyBub3QgdXNlIHByb3h5IGZyb20gaHR0cF9wcm94eSwgaHR0cHNfcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgKiBbVEhSSUZULTM1MDJdIC0gQysrIFRTZXJ2ZXJTb2NrZXQgcGFzc2VzIHNtYWxsIGJ1ZmZlciB0byBnZXRzb2NrbmFtZQorICAgICogW1RIUklGVC0zNTAxXSAtIEZvcndhcmQgc2xhc2ggaW4gY29tbWVudCBjYXVzZXMgY29tcGlsZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzQ5OF0gLSBDKysgbGlicmFyeSBhc3N1bWVzIG9wdGlvbmFsIGZ1bmN0aW9uIHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSBpcyBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzQ5N10gLSBCdWlsZCBmYWlscyB3aXRoICJpbnZhbGlkIHVzZSBvZiBpbmNvbXBsZXRlIHR5cGUiCisgICAgKiBbVEhSSUZULTM0OTZdIC0gQysrOiBDb2Igc3R5bGUgY2xpZW50IGZhaWxzIHdoZW4gc2VuZGluZyBhIGNvbnNlY3V0aXZlIHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMzQ5M10gLSBsaWJ0aHJpZnQgZG9lcyBub3QgY29tcGlsZSBvbiB3aW5kb3dzIHVzaW5nIHZpc3VhbCBzdHVkaW8KKyAgICAqIFtUSFJJRlQtMzQ4OF0gLSB3YXJuaW5nOiB1bnVzZWQgdmFyaWFibGUgJ3Byb2dyYW0nCisgICAgKiBbVEhSSUZULTM0ODldIC0gd2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uIGZyb20gc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKicgWy1Xd3JpdGUtc3RyaW5nc10KKyAgICAqIFtUSFJJRlQtMzQ4N10gLSBGdWxsIHN1cHBvcnQgZm9yIG5ld2VyIERlbHBoaSB2ZXJzaW9ucworICAgICogW1RIUklGVC0zNTI4XSAtIEZpeCB3YXJuaW5ncyBpbiB0aHJpZnQubGwKKyAgICAqIFtUSFJJRlQtMzUyN10gLSAtZ2VuIHB5OmR5bmFtaWMsdXRmOHN0cmluZ3MgaWdub3JlcyB1dGY4c3RyaW5ncyBvcHRpb24KKyAgICAqIFtUSFJJRlQtMzUyNl0gLSBDb2RlIGdlbmVyYXRlZCBieSBweTp1dGY4c3RyaW5ncyBkb2VzIG5vdCB3b3JrIGZvciBQeXRob24zCisgICAgKiBbVEhSSUZULTM1MjRdIC0gZGNjMzIgd2FybmluZyAiVzEwMDAgU3ltYm9sICdJc0xvd1N1cnJvZ2F0ZScgaXMgZGVwcmVjYXRlZDogJ1VzZSBUQ2hhckhlbHBlciciIGluIFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcworICAgICogW1RIUklGVC0zNTI1XSAtIHB5OmR5bmFtaWMgZmFpbHMgdG8gaGFuZGxlIGJpbmFyeSBsaXN0L3NldC9tYXAgZWxlbWVudAorICAgICogW1RIUklGVC0zNTIxXSAtIFRTaW1wbGVKU09OUHJvdG9jb2xUZXN0IGlzIG5vdCBkZXRlcm1pbmlzdGljIChmYWlscyB3aGVuIHJ1biBvbiBKREsgOCkKKyAgICAqIFtUSFJJRlQtMzUyMF0gLSBEYXJ0IFRTb2NrZXQgb25FcnJvciBzdHJlYW0gc2hvdWxkIGJlIHR5cGVkIGFzIE9iamVjdAorICAgICogW1RIUklGVC0zNTE5XSAtIGZhc3RiaW5hcnkgZG9lcyBub3Qgd29yayB3aXRoIC1nZW4gcHk6dXRmOHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtMzUxOF0gLSBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvIGZpbGVzIHdlcmUgbWlzc2luZyBmb3IgVmlzdWFsIFN0dWRpbworICAgICogW1RIUklGVC0zNTEyXSAtIGNfZ2xpYjogQnVpbGQgZmFpbHMgZHVlIHRvIG1pc3NpbmcgZmVhdHVyZXMuaAorICAgICogW1RIUklGVC0zNDgzXSAtIEluY29ycmVjdCBlbXB0eSBiaW5hcnkgaGFuZGxpbmcgaW50cm9kdWNlZCBieSBUSFJJRlQtMzM1OQorICAgICogW1RIUklGVC0zNDc5XSAtIE9uZXdheSBjYWxscyBzaG91bGQgbm90IHJldHVybiBleGNlcHRpb25zIHRvIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzQ3OF0gLSBSZXN0b3JlIGRyb3BwZWQgbWV0aG9kIHRvIFRIc0hhU2VydmVyLmphdmEKKyAgICAqIFtUSFJJRlQtMzQ3N10gLSBQYXJzZXIgZmFpbHMgb24gZW51bSBpdGVtIHRoYXQgc3RhcnRzIHdpdGggJ0UnIGxldHRlciBhbmQgY29udGludWVzIHdpdGggbnVtYmVyIAorICAgICogW1RIUklGVC0zNDc2XSAtIE1pc3NpbmcgaW5jbHVkZSBpbiAuL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKKyAgICAqIFtUSFJJRlQtMzQ3NF0gLSBEb2NrZXI6IHRocmlmdC1jb21waWxlcgorICAgICogW1RIUklGVC0zNDczXSAtIFdoZW4gIm9wdGlvbmFsJyBpcyB1c2VkIHdpdGggYSBzdHJ1Y3QgbWVtYmVyLCBDKysgc2VydmVyIHNlZW1zIHRvIG5vdCByZXR1cm4gaXQgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM0NjhdIC0gRGFydCBUU29ja2V0VHJhbnNwb3J0IG9uRXJyb3IgaGFuZGxlciBpcyB0b28gcmVzdHJpY3RpdmUKKyAgICAqIFtUSFJJRlQtMzQ1MV0gLSB0aHJpZnRfcHJvdG9jb2wgUEhQIGV4dGVuc2lvbiBtaXNzaW5nIGNvbmZpZy5tNCBmaWxlCisgICAgKiBbVEhSSUZULTM0NTZdIC0gcm91bmRpbmcgaXNzdWUgaW4gc3RhdGljIGFzc2VydAorICAgICogW1RIUklGVC0zNDU1XSAtIHN0cnVjdCB3cml0ZSBtZXRob2QncyByZXR1cm4gdmFsdWUgaXMgaW5jb3JyZWN0CisgICAgKiBbVEhSSUZULTM0NTRdIC0gUHl0aG9uIFRvcm5hZG8gdHV0b3JpYWwgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTM0NjNdIC0gSmF2YSBjYW4ndCBiZSBkaXNhYmxlZCBpbiBDTWFrZSBidWlsZAorICAgICogW1RIUklGVC0zNDUwXSAtIE5QRSB3aGVuIHVzaW5nIFNTTAorICAgICogW1RIUklGVC0zNDQ5XSAtIFRCYXNlQXN5bmNQcm9jZXNzb3IgZmIucmVzcG9uc2VSZWFkeSgpIG5ldmVyIGNhbGxlZCBmb3Igb25ld2F5IGZ1bmN0aW9ucworICAgICogW1RIUklGVC0zNDcxXSAtIERhcnQgZ2VuZXJhdG9yIGRvZXMgbm90IGhhbmRsZSB1cHBlcmNhc2UgYXJndW1lbnQgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzQ3MF0gLSBTcG9yYWRpYyB0aW1lb3V0cyB3aXRoIHBpcGVzCisgICAgKiBbVEhSSUZULTM0NjVdIC0gR28gQ29kZSBXaXRoIENvbXBsZXggQ29uc3QgSW5pdGlhbGl6ZXIgQ29tcGlsYXRpb24gRGVwZW5kcyBPbiBTdHJ1Y3QgT3JkZXIKKyAgICAqIFtUSFJJRlQtMzQ2NF0gLSBGaXggc2V2ZXJhbCBkZWZlY3RzIGluIGNfZ2xpYiBjb2RlIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNDYyXSAtIENvY29hIGdlbmVyYXRlcyBJbmNvcnJlY3QgI2ltcG9ydCBoZWFkZXIgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzQ1M10gLSByZW1vdmUgcmF0X2V4Y2x1ZGUKKyAgICAqIFtUSFJJRlQtMzQxOF0gLSBVc2Ugb2YgY2lwaGVycyBpbiBzc2wud3JhcF9zb2NrZXQoKSBicmVha3MgcHl0aG9uIDIuNiBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTM0MTddIC0gIm5hbWVzcGFjZSB4c2QiIGlzIG5vdCByZWFsbHkgd29ya2luZworICAgICogW1RIUklGVC0zNDEzXSAtIFRocmlmdCBjb2RlIGdlbmVyYXRpb24gYnVnIGluIEdvIHdoZW4gZXh0ZW5kaW5nIHNlcnZpY2UKKyAgICAqIFtUSFJJRlQtMzQyMF0gLSBDKys6IFRTU0xTb2NrZXRzIGFyZSBub3QgaW50ZXJydXB0YWJsZQorICAgICogW1RIUklGVC0zNDE1XSAtIGluY2x1ZGUgdW5pc3RkLmggY29uZGl0aW9uYWxseQorICAgICogW1RIUklGVC0zNDE0XSAtICNpbmNsdWRlIDxwd2QuaD4gaW4gVEhlYWRlclRyYW5zcG9ydC5oIGJyZWFrcyB3aW5kb3dzIGJ1aWxkCisgICAgKiBbVEhSSUZULTM0MTFdIC0gR28gZ2VuZXJhdGVzIHJlbW90ZXMgd2l0aCB3cm9uZyBwYWNrYWdlIHF1YWxpZmllcnMgd2hlbiBpbmNsdWRpbmcKKyAgICAqIFtUSFJJRlQtMzQzMF0gLSBHbyBUSHR0cENsaWVudCBkb2VzIG5vdCByZWFkIEhUVFAgcmVzcG9uc2UgYm9keSB0byBjb21wbGV0aW9uIHdoZW4gY2xvc2luZworICAgICogW1RIUklGVC0zNDIzXSAtIEZpcnN0IGNhbGwgdG8gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0IGZhaWxzIHRvIGRpc3BhdGNoIGNvcnJlY3QgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtMzQyMl0gLSBHbyBUU2VydmVyU29ja2V0IGRvZXNuJ3QgY2xvc2Ugb24gSW50ZXJydXB0CisgICAgKiBbVEhSSUZULTM0MjFdIC0gcmViYXIgYXMgZGVwZW5kZW5jeSBpbnN0ZWFkIG9mIGJ1bmRsaW5nICh3YXM6ICByZWJhciBmYWlscyBpZiBQV0QgY29udGFpbnMgVW5pY29kZSkKKyAgICAqIFtUSFJJRlQtMzQyOF0gLSBHbyB0ZXN0IGZhaWxzIHdoZW4gcnVubmluZyBtYWtlIGNoZWNrCisgICAgKiBbVEhSSUZULTM0NDVdIC0gVGhyb3dhYmxlIG1lc3NhZ2VzIGFyZSBoaWRkZW4gZnJvbSBKVk0gc3RhY2sgdHJhY2Ugb3V0cHV0CisgICAgKiBbVEhSSUZULTM0NDNdIC0gVGhyaWZ0IGluY2x1ZGUgY2FuIGdlbmVyYXRlIHVuY29tcGlsYWJsZSBjb2RlCisgICAgKiBbVEhSSUZULTM0NDRdIC0gTGFyZ2UgNjQgYml0IEludGVnZXIgZG9lcyBub3QgcHJlc2VydmUgdmFsdWUgdGhyb3VnaCBOb2RlLmpzIEpTT05Qcm90b2NvbCAKKyAgICAqIFtUSFJJRlQtMzQzNl0gLSBtaXNjLiBjcm9zcyB0ZXN0IGlzc3VlcyB3aXRoIFVURi04IHBhdGggbmFtZXMKKyAgICAqIFtUSFJJRlQtMzQzNV0gLSBQdXQgZ2VuZXJhdGVkIEphdmEgY29kZSBmb3IgZnVsbGNhbWVsIHRlc3RzIGluIGEgc2VwYXJhdGUgcGFja2FnZS9uYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMzQzM10gLSBEb3VibGVzIGFyZW4ndCBpbnRlcnByZXRlZCBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzQzN10gLSBNaW5ndy13NjQgYnVpbGQgZmFpbAorICAgICogW1RIUklGVC0zNDM0XSAtIERhcnQgZ2VuZXJhdG9yIHByb2R1Y2VzIGVtcHR5IG5hbWUgaW4gcHVic3BlYy55YW1sIGZvciBpbmNsdWRlcyB3aXRob3V0IG5hbWVzcGFjZXMKKyAgICAqIFtUSFJJRlQtMzQwOF0gLSBKU09OIGdlbmVyYXRvciBlbWl0cyBpbmNvcnJlY3QgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzQwNl0gLSBDb2NvYSBjbGllbnQgc2hvdWxkIG5vdCBzY2hlZHVsZSBzdHJlYW1zIG9uIG1haW4gcnVubG9vcAorICAgICogW1RIUklGVC0zNDA0XSAtIEpTT04gU3RyaW5nIHJlYWRlciBkb2Vzbid0IHJlY29nbml6ZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIKKyAgICAqIFtUSFJJRlQtMzYzNl0gLSBEb3VibGUgcHJlY2lzaW9uIGlzIG5vdCBmdWxseSBwcmVzZXJ2ZWQgaW4gQysrIFRKU09OUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzYzMl0gLSBjX2dsaWIgdGVzdHNlcmlhbGl6YXRpb24gZmFpbHMgd2l0aCBnbGliIGFzc2VydGlvbgorICAgICogW1RIUklGVC0zNjE5XSAtIFVzaW5nIFRocmlmdCAwLjkuMyB3aXRoIGdvb2dsZXRlc3Qgb24gTGludXggZ2NjIDQuOSAvIEMrKzExCisgICAgKiBbVEhSSUZULTM2MTddIC0gQ01ha2UgZG9lcyBub3QgYnVpbGQgZ3YveG1sIGdlbmVyYXRvcnMKKyAgICAqIFtUSFJJRlQtMzYxNV0gLSBGaXggUHl0aG9uIFNTTCBjbGllbnQgcmVzb3VyY2UgbGVhayBvbiBjb25uZWN0aW9uIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMzYxNl0gLSBsaWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weSBpcyBmbGFreQorICAgICogW1RIUklGVC0zNjQzXSAtIFBlcmwgU1NMIHNlcnZlciBjcnVzaGVzIGlmIGEgY2xpZW50IGRpc2Nvbm5lY3Qgd2l0aG91dCBoYW5kc2hha2UKKyAgICAqIFtUSFJJRlQtMzYzOV0gLSBDIyBUaHJpZnQgbGlicmFyeSBmb3JjZXMgVExTIDEuMCwgdGh3YXJ0aW5nIFRMUyAxLjIgdXNhZ2UKKyAgICAqIFtUSFJJRlQtMzYzM10gLSBUcmF2aXMgIkMgQysrIC0gR0NDIiBidWlsZCB3YXMgdXNpbmcgY2xhbmcKKyAgICAqIFtUSFJJRlQtMzYzNF0gLSBGaXggUHl0aG9uIFRTb2NrZXQgcmVzb3VyY2UgbGVhayBvbiBjb25uZWN0aW9uIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMzYzMF0gLSBEZWJpYW4vVWJ1bnR1IGluc3RhbGwgZG9jcyBuZWVkIGFuIHVwZGF0ZQorICAgICogW1RIUklGVC0zNjI5XSAtIFBhcnNlciBzZXRzIGV4aXRjb2RlIG9uIGVycm9ycywgYnV0IGdlbmVyYXRvciBkb2VzIG5vdAorICAgICogW1RIUklGVC0zNjA4XSAtIGxpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QgaXMgZmxha3kgaW4gamVua2lucyBUaHJpZnQtcHJlY29tbWl0IGJ1aWxkLgorICAgICogW1RIUklGVC0zNjAxXSAtIEJldHRlciBjb25mb3JtYW5jZSB0byBQRVA4IGZvciBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0zNTk5XSAtIFZhbGlkYXRlIGNsaWVudCBJUCBhZGRyZXNzIGFnYWluc3QgY2VydCdzIFN1YmplY3RBbHROYW1lCisgICAgKiBbVEhSSUZULTM1OThdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGRvZXNuJ3QgaW5zdGFudGlhdGUgY2xpZW50IGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtMzU5N10gLSBgbWFrZSBjaGVja2AgaGFuZ3MgaW4gZ28gdGVzdHMKKyAgICAqIFtUSFJJRlQtMzU4OV0gLSBEYXJ0IGdlbmVyYXRvciB1c2VzIHdyb25nIG5hbWUgaW4gY29uc3RydWN0b3IgZm9yIHVwcGVyY2FzZSBhcmd1bWVudHMgd2l0aCBkZWZhdWx0cworICAgICogW1RIUklGVC0zNTg4XSAtIFVzaW5nIFR5cGVTY3JpcHQgd2l0aCAtLW5vSW1wbGljaXRBbnkgZmFpbHMKKyAgICAqIFtUSFJJRlQtMzU4NF0gLSBib29sZWFuIGZhbHNlIHZhbHVlIGNhbm5vdCBiZSB0cmFuc2ZlcnJlZAorICAgICogW1RIUklGVC0zNTc4XSAtIE1ha2UgVEhlYWRlclRyYW5zcG9ydCBkZXRlY3QgVENvbXBhY3QgZnJhbWVkIGFuZCB1bmZyYW1lZAorICAgICogW1RIUklGVC0zMzIzXSAtIFB5dGhvbiBsaWJyYXJ5IGRvZXMgbm90IGhhbmRsZSBlc2NhcGVkIGZvcndhcmQgc2xhc2ggKCIvIikgaW4gSlNPTgorICAgICogW1RIUklGVC0zMzIyXSAtIENNYWtlIGdlbmVyYXRlZCAibWFrZSBjaGVjayIgZmFpbGVzIG9uIHB5dGhvbl90ZXN0CisgICAgKiBbVEhSSUZULTMzMjFdIC0gVGhyaWZ0IGNhbid0IGJlIGFkZGVkIGFzIGEgc3ViZGlyZWN0b3J5IG9mIGFub3RoZXIgQ01ha2UtYmFzZWQgcHJvamVjdAorICAgICogW1RIUklGVC0zMzE0XSAtIERvdHMgaW4gZmlsZSBuYW1lcyBvZiBpbmNsdWRlcyBjYXVzZXMgZG90cyBpbiBqYXZhc2NyaXB0IHZhcmlhYmxlIG5hbWVzCisgICAgKiBbVEhSSUZULTMzMDddIC0gU2VnZmF1bHQgaW4gUnVieSBzZXJpYWxpemVyCisgICAgKiBbVEhSSUZULTMzMDldIC0gTWlzc2luZyBUQ29uc3RhbnQucGhwIGluIC9saWIvcGhwL01ha2VmaWxlLmFtCisgICAgKiBbVEhSSUZULTM4MTBdIC0gdW5yZXNvbHZlZCBleHRlcm5hbCBzeW1ib2wgcHVibGljOiB2aXJ0dWFsIHZvaWQgX19jZGVjbCBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSh2b2lkKQorICAgICogW1RIUklGVC0zNzM2XSAtIEMrKyBsaWJyYXJ5IGJ1aWxkIGZhaWxzIGlmIE9wZW5TU0wgZG9lcyBub3Qgc3VycnBvdCBTU0x2MworICAgICogW1RIUklGVC0zODc4XSAtIENvbXBpbGUgZXJyb3IgaW4gVFNTTFNvY2tldC5jcHAgd2l0aCBuZXcgT3BlblNTTCBbQ1JZUFRPX251bV9sb2Nrc10KKyAgICAqIFtUSFJJRlQtMzk0OV0gLSBtaXNzaW5nIG1ha2UgZGlzdCBlbnRyeSBmb3IgY29tcGlsZXIvY3BwL3Rlc3QKKyAgICAqIFtUSFJJRlQtNDQ5XSAtIFRoZSB3aXJlIGZvcm1hdCBvZiB0aGUgSlNPTiBQcm90b2NvbCBtYXkgbm90IGFsd2F5cyBiZSB2YWxpZCBKU09OIGlmIGl0IGNvbnRhaW5zIG5vbi1VVEY4IGVuY29kZWQgc3RyaW5ncworICAgICogW1RIUklGVC0xNjJdIC0gVGhyaWZ0IHN0cnVjdHVyZXMgYXJlIHVuaGFzaGFibGUsIHByZXZlbnRpbmcgdGhlbSBmcm9tIGJlaW5nIHVzZWQgYXMgc2V0IGVsZW1lbnRzCisgICAgKiBbVEhSSUZULTM5NjFdIC0gVENvbm5lY3RlZENsaWVudCBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudCBpZiBhbiBleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBvY2N1cmVzLgorICAgICogW1RIUklGVC0zODgxXSAtIFRyYXZpcyBDSSBidWlsZHMgYXJlIGZhaWxpbmcgZHVlIHRvIGRvY2tlciBmYWlsdXJlcyAodGhyZWUgcmV0cmllcywgYW5kIGdpdmVzIHVwKQorICAgICogW1RIUklGVC0zOTM3XSAtIENhbm5vdCBjb21waWxlIDAuMTAuMCBkZXZlbG9wbWVudCB0aXAgd2l0aCBnY2MtNC42LngKKyAgICAqIFtUSFJJRlQtMzk2NF0gLSBVbnN1cHBvcnRlZCBtZWNoYW5pc20gdHlwZSA/Pz8/PyBkdWUgdG8gZGVwZW5kZW5jeSBvbiBkZWZhdWx0IE9TLWRlcGVuZGVudCBjaGFyc2V0CisgICAgKiBbVEhSSUZULTMwMzhdIC0gVXNlIG9mIHZvbGF0aWxlIGluIGNwcCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTMzMDFdIC0gSmF2YSBnZW5lcmF0ZWQgY29kZSB1c2VzIGltcG9ydHMgdGhhdCBjYW4gbGVhZCB0byBjbGFzcyBuYW1lIGNvbGxpc2lvbnMgd2l0aCBJREwgZGVmaW5lZCB0eXBlcworICAgICogW1RIUklGVC0zMzQ4XSAtIFBIUCBUQ29tcGFjdFByb3RvY29sIGJvb2wmaW50NjQgcmVhZHZhbHVlIGJ1ZworICAgICogW1RIUklGVC0zOTU1XSAtIFRUaHJlYWRlZFNlcnZlciBNZW1vcnkgTGVhaworICAgICogW1RIUklGVC0zODI5XSAtIFRocmlmdCBkb2VzIG5vdCBpbnN0YWxsIFB5dGhvbiBMaWJyYXJpZXMgaWYgVHdpc3RlZCBpcyBub3QgaW5zdGFsbGVkCisgICAgKiBbVEhSSUZULTM5MzJdIC0gQysrIFRocmVhZE1hbmFnZXIgaGFzIGEgcmFyZSB0ZXJtaW5hdGlvbiByYWNlCisgICAgKiBbVEhSSUZULTM4MjhdIC0gY21ha2UgZmFpbHMgd2hlbiBCb29zdF9JTkNMVURFX0RJUlMgKGFuZCBvdGhlciB2YXJpYWJsZXMgcGFzc2VkIHRvIGluY2x1ZGVfZGlyZWN0b3JpZXMoKSkgaXMgZW1wdHkgCisgICAgKiBbVEhSSUZULTM5NThdIC0gQ01ha2UgV0lUSF9NVCBvcHRpb24gZm9yIHdpbmRvd3Mgc3RhdGljIHJ1bnRpbWUgbGlua2luZyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjbWFrZSBidWlsZCB0eXBlIFJlbFdpdGhEZWJJbmZvCisgICAgKiBbVEhSSUZULTM5NTddIC0gVENvbm5lY3RlZENsaWVudCBkb2VzIG5vdCBkaXNjb25uZWN0IGZyb20gY2xpZW50cyB3aGVuIHRoZWlyIHRpbWVvdXQgaXMgcmVhY2hlZC4KKyAgICAqIFtUSFJJRlQtMzk1M10gLSBUU1NMU29ja2V0OjpjbG9zZSBzaG91bGQgaGFuZGxlIGV4Y2VwdGlvbnMgZnJvbSB3YWl0Rm9yRXZlbnQgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYnkgdGhlIGRlc3RydWN0b3IuCisgICAgKiBbVEhSSUZULTM5NzddIC0gUEhQIGV4dGVuc2lvbiBjcmVhdGVzIHVuZGVmaW5lZCB2YWx1ZXMgd2hlbiBkZXNlcmlhbGl6aW5nIHNldHMKKyAgICAqIFtUSFJJRlQtMzk0N10gLSBzb2NrYWRkciB0eXBlIGlzbid0IGFsd2F5cyBsYXJnZSBlbm91Z2ggZm9yIHRoZSByZXR1cm4gb2YgZ2V0c29ja25hbWUKKyAgICAqIFtUSFJJRlQtMjc1NV0gLSBUaHJlYWRTYW5pdGl6ZXIgcmVwb3J0cyBkYXRhIHJhY2UgaW4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkV29ya2VyCisgICAgKiBbVEhSSUZULTM5NDhdIC0gZXJybm8gaXMgbm90IHRoZSBjb3JyZWN0IG1ldGhvZCBvZiBnZXR0aW5nIHRoZSBlcnJvciBpbiB3aW5kb3dzCisgICAgKiBbVEhSSUZULTQwMDhdIC0gYnJva2VuIGNpIGR1ZSB0byB1cHN0cmVhbSBkZXBlbmRlbmN5IHZlcnNpb25pbmcgYnJlYWsKKyAgICAqIFtUSFJJRlQtMzk5OV0gLSBGaXggRGViaWFuICYgVWJ1bnR1IHBhY2thZ2UgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTM4ODZdIC0gUEhQIGNyb3NzIHRlc3QgY2xpZW50IHJldHVybnMgMCBldmVuIHdoZW4gZmFpbGluZworICAgICogW1RIUklGVC0zOTk3XSAtIGJ1aWxkaW5nIHRocmlmdCBsaWJzIGRvZXMgbm90IHN1cHBvcnQgbmV3IG9wZW5zc2wKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zODY3XSAtIFNwZWNpZnkgQmluYXJ5UHJvdG9jb2wgYW5kIENvbXBhY3RQcm90b2NvbAorCisjIyBFcGljCisgICAgKiBbVEhSSUZULTMwNDldIC0gQXMgYW4gaU9TIGRldmVsb3BlciwgSSB3YW50IGEgZ2VuZXJhdG9yIGFuZCBsaWJyYXJ5IHRoYXQgcHJvZHVjZXMgU3dpZnQgY29kZQorICAgICogW1RIUklGVC0yMzM2XSAtIFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xODY3XSAtIFB5dGhvbiBjbGllbnQvc2VydmVyIHNob3VsZCBzdXBwb3J0IGNsaWVudC1zaWRlIGNlcnRpZmljYXRlcy4KKyAgICAqIFtUSFJJRlQtMTMxM10gLSBjX2dsaWIgY29tcGFjdCBzdXBwb3J0CisgICAgKiBbVEhSSUZULTEzODVdIC0gbWFrZSBpbnN0YWxsIGRvZXNuJ3QgaW5zdGFsbCBqYXZhIGxpYnJhcnkgaW4gdGhlIHNldHRlZCBmb2xkZXIKKyAgICAqIFtUSFJJRlQtMTQzN10gLSBVcGRhdGUgUlBNIHNwZWMKKyAgICAqIFtUSFJJRlQtODQ3XSAtIFRlc3QgRnJhbWV3b3JrIGhhcm1vbml6YXRpb24gYWNyb3NzIGFsbCBsYW5ndWFnZXMKKyAgICAqIFtUSFJJRlQtODE5XSAtIGFkZCBFbnVtZXJhdGlvbiBmb3IgcHJvdG9jb2wsIHRyYW5zcG9ydCBhbmQgc2VydmVyIHR5cGVzCisgICAgKiBbVEhSSUZULTM5MjddIC0gRW1pdCBhbiBlcnJvciBpbnN0ZWFkIG9mIHRocm93IGFuIGVycm9yIGluIHRoZSBhc3luYyBjYWxsYmFjaworICAgICogW1RIUklGVC0zOTMxXSAtIFRTaW1wbGVTZXJ2ZXI6IElmIHByb2Nlc3MgcmVxdWVzdCBlbmNvdW50ZXIgVU5LTk9XTl9NRVRIT0QsIGRvbid0IGNsb3NlIHRyYW5zcG9ydC4KKyAgICAqIFtUSFJJRlQtMzkzNF0gLSBBdXRvbWF0aWNhbGx5IHJlc29sdmUgT3BlblNTTCBiaW5hcnkgdmVyc2lvbiBvbiBXaW5kb3dzIENJCisgICAgKiBbVEhSSUZULTM5MThdIC0gUnVuIHN1YnNldCBvZiBtYWtlIGNyb3NzCisgICAgKiBbVEhSSUZULTM5MDhdIC0gUmVtb3ZlIHJlZHVuZGFudCBkZXBlbmRlbmNpZXMgZnJvbSBEb2NrZXJmaWxlCisgICAgKiBbVEhSSUZULTM5MDddIC0gU2tpcCBEb2NrZXIgaW1hZ2UgYnVpbGQgb24gQ0kgd2hlbiB1bmNoYW5nZWQKKyAgICAqIFtUSFJJRlQtMzg2OF0gLSBKYXZhIHN0cnVjdCBlcXVhbHMgc2hvdWxkIGRvIGlkZW50aXR5IGNoZWNrIGJlZm9yZSBmaWVsZCBjb21wYXJpc29uCisgICAgKiBbVEhSSUZULTM4NDldIC0gUG9ydCBHbyBzZXJpYWxpemVyIGFuZCBkZXNlcmlhbGl6ZXIgdG8gZGFydAorICAgICogW1RIUklGVC0yOTg5XSAtIENvbXBsZXRlIENNYWtlIGJ1aWxkIGZvciBBcGFjaGUgVGhyaWZ0CisgICAgKiBbVEhSSUZULTI5ODBdIC0gVGhyaWZ0TWVtb3J5QnVmZmVyIGRvZXNuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIG9wdGlvbiB0byB0YWtlIGFuIGV4aXN0aW5nIGJ1ZmZlcgorICAgICogW1RIUklGVC0yODU2XSAtIHJlZmFjdG9yIGVybGFuZyBiYXNpYyB0cmFuc3BvcnRzIGFuZCB1bmlmeSBpbnRlcmZhY2VzCisgICAgKiBbVEhSSUZULTI4NzddIC0gT3B0aW1pemUgZ2VuZXJhdGVkIGhhc2hDb2RlCisgICAgKiBbVEhSSUZULTI4NjldIC0gSlNPTjogcnVuIHNjaGVtYSB2YWxpZGF0aW9uIGZyb20gdGVzdHMKKyAgICAqIFtUSFJJRlQtMzExMl0gLSBbSmF2YV0gQXN5bmNNZXRob2RDYWxsYmFjayBzaG91bGQgYmUgdHlwZWQgaW4gZ2VuZXJhdGVkIEFzeW5jSWZhY2UKKyAgICAqIFtUSFJJRlQtMzI2M10gLSBQSFAganNvblNlcmlhbGl6ZSgpIHNob3VsZCBjYXN0IHNjYWxhciB0eXBlcworICAgICogW1RIUklGVC0yOTA1XSAtIENvY29hIGNvbXBpbGVyIHNob3VsZCBoYXZlIG9wdGlvbiB0byBwcm9kdWNlICJtb2Rlcm4iIE9iamVjdGl2ZS1DCisgICAgKiBbVEhSSUZULTI4MjFdIC0gRW5hYmxlIHRoZSB1c2Ugb2YgY3VzdG9tIEhUVFAtSGVhZGVyIGluIHRoZSBUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjA5M10gLSBhZGRlZCB0aGUgYWJpbGl0eSB0byBzZXQgY29tcHJlc3Npb24gbGV2ZWwgaW4gQysrIHpsaWIgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIwODldIC0gQ29tcGlsZXIgaWdub3JlcyBkdXBsaWNhdGUgdHlwZW5hbWVzCisgICAgKiBbVEhSSUZULTIwNTZdIC0gTW92ZWQgYWxsICNpbmNsdWRlIGNvbmZpZy5oIHN0YXRlbWVudHMgdG8gI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KKyAgICAqIFtUSFJJRlQtMjAzMV0gLSBNYWtlIFNPX0tFRVBBTElWRSBjb25maWd1cmFibGUgZm9yIEMrKyBsaWIKKyAgICAqIFtUSFJJRlQtMjAyMV0gLSBJbXByb3ZlIGxhcmdlIGJpbmFyeSBwcm90b2NvbCBzdHJpbmcgcGVyZm9ybWFuY2UKKyAgICAqIFtUSFJJRlQtMjAyOF0gLSBDbGVhbnVwIHRocmVhZGluZyBoZWFkZXJzIC8gbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTIwMTRdIC0gQ2hhbmdlIEMrKyBsaWIgaW5jbHVkZXMgdG8gdXNlIDxuYW1lc3BhY2UvPiBzdHlsZSB0aHJvdWdob3V0CisgICAgKiBbVEhSSUZULTIzMTJdIC0gdHJhdmlzLnltbDogYnVpbGQgZXZlcnl0aGluZworICAgICogW1RIUklGVC0xOTE1XSAtIE11bHRpcGxleGluZyBTZXJ2aWNlcworICAgICogW1RIUklGVC0xNzM2XSAtIFZpc3VhbCBTdHVkaW8gdG9wIGxldmVsIHByb2plY3QgZmlsZXMgd2l0aGluIG1zdmMKKyAgICAqIFtUSFJJRlQtMTczNV0gLSBpbnRlZ3JhdGUgdHV0b3JpYWwgaW50byByZWd1bGFyIGJ1aWxkCisgICAgKiBbVEhSSUZULTE1MzNdIC0gTWFrZSBUVHJhbnNwb3J0IHNob3VsZCBiZSBDbG9zZWFibGUKKyAgICAqIFtUSFJJRlQtMzVdIC0gTW92ZSBsYW5ndWFnZSB0ZXN0cyBpbnRvIHRoZWlyIGFwcHJvcHJpYXRlIGxpYnJhcnkgZGlyZWN0b3J5CisgICAgKiBbVEhSSUZULTEwNzldIC0gU3VwcG9ydCBpNjQgaW4gQVMzCisgICAgKiBbVEhSSUZULTExMDhdIC0gU1NMIHN1cHBvcnQgZm9yIHRoZSBSdWJ5IGxpYnJhcnkgCisgICAgKiBbVEhSSUZULTM4NTZdIC0gdXBkYXRlIGRlYmlhbiBwYWNrYWdlIGRlZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMzgzM10gLSBoYXhlIGh0dHAgc2VydmVyIGltcGxlbWVudGF0aW9uIChieSBlbWJlZGluZyBpbnRvIHBocCB3ZWIgc2VydmVyKQorICAgICogW1RIUklGVC0zODM5XSAtIFBlcmZvcm1hbmNlIGlzc3VlIHdpdGggYmlnIG1lc3NhZ2UgZGVzZXJpYWxpemF0aW9uIHVzaW5nIHBocCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzgyMF0gLSBFcmxhbmc6IERldGVjdCBPVFAgPj0gMTggdG8gdXNlIG5ldyB0aW1lIGNvcnJlY3Rpb24KKyAgICAqIFtUSFJJRlQtMzgxNl0gLSBSZWR1Y2UgZG9ja2VyIGJ1aWxkIGR1cmF0aW9uIG9uIFRyYXZpcy1DSQorICAgICogW1RIUklGVC0zODE1XSAtIFB1dCBhcHB2ZXlvciBkZXBlbmRlbmN5IHZlcnNpb25zIHRvIG9uZSBwbGFjZQorICAgICogW1RIUklGVC0zNzg4XSAtIENvbXBhdGliaWxpdHkgaW1wcm92ZW1lbnRzIGFuZCBXaW42NCBzdXBwb3J0CisgICAgKiBbVEhSSUZULTM3OTJdIC0gVGltZW91dHMgZm9yIGFub255bW91cyBwaXBlcyBzaG91bGQgYmUgY29uZmlndXJhYmxlCisgICAgKiBbVEhSSUZULTM3OTRdIC0gU3BsaXQgRGVscGhpIGFwcGxpY2F0aW9uLCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0IGV4Y2VwdGlvbiBzdWJ0eXBlcyBpbnRvIHNlcGFyYXRlIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMzc3NF0gLSBUaGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGhhdmUgZXhjZXB0aW9uX25hbWVzIG1ldGEgaW5mbworICAgICogW1RIUklGVC0zNzYyXSAtIEZpeCBidWlsZCB3YXJuaW5ncyBmb3IgZGVwcmVjYXRlZCBUaHJpZnQgImJ5dGUiIGZpZWxkcworICAgICogW1RIUklGVC0zNzU2XSAtIEltcHJvdmUgcmVxdWlyZWRuZXNzIGRvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzc2MV0gLSBBZGQgZGViaWFuIHBhY2thZ2UgZm9yIFB5dGhvbjMKKyAgICAqIFtUSFJJRlQtMzc0Ml0gLSBoYXhlIHBocCBjbGkgc3VwcG9ydAorICAgICogW1RIUklGVC0zNzMzXSAtIFNvY2tldCB0aW1lb3V0IGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0zNzI4XSAtIGh0dHAgdHJhbnNwb3J0IGZvciB0aHJpZnQtbHVhCisgICAgKiBbVEhSSUZULTM5MDVdIC0gRGFydCBjb21waWxlciBkb2VzIG5vdCBpbml0aWFsaXplIGJvb2wsIGludCwgYW5kIGRvdWJsZSBwcm9wZXJ0aWVzCisgICAgKiBbVEhSSUZULTM5MTFdIC0gTG9vc2VuIFJ1YnkgZGV2IGRlcGVuZGVuY3kgdmVyc2lvbiByZXF1aXJlbWVudHMKKyAgICAqIFtUSFJJRlQtMzkwNl0gLSBSdW4gQyMgdGVzdHMgd2l0aCBtYWtlIGNoZWNrCisgICAgKiBbVEhSSUZULTM5MDBdIC0gQWRkIFB5dGhvbiBTU0wgZmxhZ3MKKyAgICAqIFtUSFJJRlQtMzg5N10gLSBQcm92aWRlIG1lYW5pbmdmdWwgZXhjZXB0aW9uIHR5cGUgYmFzZWQgb24gV2ViRXhjZXB0aW9uU3RhdHVzIGluIGNhc2Ugb2YgdGltZW91dAorICAgICogW1RIUklGVC0zODA4XSAtIE1pc3NpbmcgYERPVUJMRWAgaW4gdGhyaWZ0IHR5cGUgZW51bWVyYXRpb24KKyAgICAqIFtUSFJJRlQtMzgwM10gLSBSZW1vdmUgImZpbGUiIGF0dHJpYnV0ZSBmcm9tIFhNTCBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzY2MF0gLSBBZGQgVjQgbWFwcGVkIGFkZHJlc3MgdG8gdGVzdCBjbGllbnQgY2VydCdzIGFsdG5hbWUKKyAgICAqIFtUSFJJRlQtMzY2MV0gLSBVc2UgaHR0cHMgdG8gZG93bmxvYWQgbWVjayBpbiBlcmxhbmcgdGVzdCBidWlsZAorICAgICogW1RIUklGVC0zNjU5XSAtIENoZWNrIGNvbmZpZ3VyZSByZXN1bHQgb2YgQ01ha2Ugb24gQ0kKKyAgICAqIFtUSFJJRlQtMzY2N10gLSBBZGQgVExTIFNOSSBzdXBwb3J0IHRvIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzY1MV0gLSBNYWtlIGJhY2twb3J0cy5tYXRjaF9ob3N0bmFtZSBhbmQgaXBhZGRyZXNzIG9wdGlvbmFsCisgICAgKiBbVEhSSUZULTM2NjZdIC0gQnVpbGQgRCB0dXRvcmlhbCBhcyBwYXJ0IG9mIEF1dG90b29scyBidWlsZAorICAgICogW1RIUklGVC0zNjY1XSAtIEFkZCBEIGxpYmV2ZW50IGFuZCBPcGVuU1NMIHRvIGRvY2tlciBpbWFnZXMKKyAgICAqIFtUSFJJRlQtMzY2NF0gLSBSZW1vdmUgbWQ1LmMKKyAgICAqIFtUSFJJRlQtMzY2Ml0gLSBBZGQgSGFza2VsbCB0byBkZWJpYW4gZG9ja2VyIGltYWdlCisgICAgKiBbVEhSSUZULTM3MTFdIC0gQWRkIEQgdG8gY3Jvc3MgbGFuZ3VhZ2UgdGVzdAorICAgICogW1RIUklGVC0zNjkxXSAtIFJ1biBmbGFrZTggUHl0aG9uIHN0eWxlIGNoZWNrIG9uIFRyYXZpcy1DSQorICAgICogW1RIUklGVC0zNjkyXSAtIChSZSllbmFibGUgQXBwdmV5b3IgQysrIGFuZCBQeXRob24gYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY3N10gLSBJbXByb3ZlIENNYWtlIEphdmEgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzY3OV0gLSBBZGQgc3Rkb3V0IGxvZyB0byB0ZXN0QmluYXJ5IGluIEphdmEgdGVzdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzcxOF0gLSBSZWR1Y2Ugc2l6ZSBvZiBkb2NrZXIgaW1hZ2UgZm9yIGJ1aWxkIGVudmlyb25tZW50CisgICAgKiBbVEhSSUZULTM2OThdIC0gW1RyYXZpcy1DSV0gSW50cm9kdWNlIHJldHJ5IHRvIGFwdCBjb21tYW5kcworICAgICogW1RIUklGVC0zMTI3XSAtIHN3aXRjaCAtcmVjdXJzZSB0byAtLXJlY3Vyc2UgYW5kIHJlc2VydmUgLXIKKyAgICAqIFtUSFJJRlQtMzA4N10gLSBQYXNzIG9uIGVycm9ycyBsaWtlICJjb25uZWN0aW9uIGNsb3NlZCIKKyAgICAqIFtUSFJJRlQtMzI0MF0gLSBUaHJpZnQgUHl0aG9uIGNsaWVudCBzaG91bGQgc3VwcG9ydCBzdWJqZWN0QWx0TmFtZSBhbmQgd2lsZGNhcmQgY2VydHMgaW4gVFNTTFNvY2tldAorICAgICogW1RIUklGVC0zMjEzXSAtIG1ha2UgY3Jvc3Mgc2hvdWxkIGluZGljYXRlIHdoZW4gaXQgc2tpcHMgYSBrbm93biBmYWlsaW5nIHRlc3QKKyAgICAqIFtUSFJJRlQtMzIwOF0gLSBGaXggVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBidWlsZCBmYWlsdXJlIGR1ZSB0byBtaXNzaW5nIHNvdXJjZQorICAgICogW1RIUklGVC0zMTg2XSAtIEFkZCBUU2VydmVySFRUUCB0byBHbyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIzNDJdIC0gQWRkIF9fRklMRV9fIGFuZCBfX0xJTkVfXyB0byBUaHJpZnQgQysrIGV4Y3BldGlvbnMKKyAgICAqIFtUSFJJRlQtMzM3Ml0gLSBBZGQgZGFydCBnZW5lcmF0b3IgdG8gVmlzdWFsIFN0dWRpbyBwcm9qZWN0CisgICAgKiBbVEhSSUZULTMzNjZdIC0gVGhyaWZ0VGVzdCB0byBpbXBsZW1lbnQgc3RhbmRhcmQgcmV0dXJuIHZhbHVlcyAKKyAgICAqIFtUSFJJRlQtMzQwMl0gLSBQcm92aWRlIGEgcGVybCBVbml4IFNvY2tldCBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMzYxXSAtIEltcHJvdmUgQyMgbGlicmFyeQorICAgICogW1RIUklGVC0zMzkzXSAtIEludHJvZHVjZSBpOCB0byBwcm92aWRlIGNvbnNpc3RlbnQgc2V0IG9mIFRocmlmdCBJREwgaW50ZWdlciB0eXBlcworICAgICogW1RIUklGVC0zMzM5XSAtIFN1cHBvcnQgZm9yIGRhdGFiYXNlL3NxbAorICAgICogW1RIUklGVC0zNTY1XSAtIEMrKzogVFtBc3luY11Qcm9jZXNzb3I6OmdldEV2ZW50SGFuZGxlcigpIHNob3VsZCBiZSBkZWNsYXJlZCBhcyBjb25zdCBtZW1iZXIgZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTM1NjNdIC0gQysrL1F0OiByZW1vdmVkIHVzYWdlIG9mIG1hY3JvIFFUX1BSRVBFTkRfTkFNRVNQQUNFIGFzIGl0IGlzbid0IGNvbnNlcXVlbnRseSB1c2VkIGZvciBhbGwgcmVmZXJlbmNlcyB0byBRdCB0eXBlcy4KKyAgICAqIFtUSFJJRlQtMzU2Ml0gLSBSZW1vdmVkIHVudXNlZCBUQXN5bmNQcm9jZXNzb3I6OmdldEFzeW5jU2VydmVyKCkKKyAgICAqIFtUSFJJRlQtMzU2MV0gLSBDKysvUXQ6IG1ha2UgdXNlIG9mIFFfRElTQUJMRV9DT1BZKCkgdG8gZ2V0IHJpZCBvZiBjb3B5IGN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICAqIFtUSFJJRlQtMzU1Nl0gLSBjX2dsaWIgZmlsZSBkZXNjcmlwdG9yIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0zNTQ0XSAtIE1ha2UgY3Jvc3MgdGVzdCBmYWlsIHdoZW4gc2VydmVyIHByb2Nlc3MgZGllZCB1bmV4cGVjdGVkbHkKKyAgICAqIFtUSFJJRlQtMzU0MF0gLSBNYWtlIHB5dGhvbiB0dXRvcmlhbCBtb3JlIGluIGxpbmUgd2l0aCBQRVA4CisgICAgKiBbVEhSSUZULTM1MzVdIC0gRGFydCBnZW5lcmF0b3IgYXJndW1lbnQgdG8gcHJvZHVjZSBhIGZpbGUgc3RydWN0dXJlIHVzYWJsZSBpbiBwYXJlbnQgbGlicmFyeQorICAgICogW1RIUklGVC0zNTA1XSAtIEVuaGFuY2UgUHl0aG9uIFRTU0xTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzUwNl0gLSBFbGltaW5hdGUgb2xkIHN0eWxlIGNsYXNzZXMgZnJvbSBsaWJyYXJ5IGNvZGUKKyAgICAqIFtUSFJJRlQtMzUwM10gLSBFbmFibGUgcHk6dXRmOHN0cmluZyBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTM0OTldIC0gQWRkIHBhY2thZ2VfcHJlZml4IHRvIHB5dGhvbiBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzQ5NV0gLSBNaW5vciBlbmhhbmNlbWVudHMgYW5kIGZpeGVzIGZvciBjcm9zcyB0ZXN0CisgICAgKiBbVEhSSUZULTM0ODZdIC0gSmF2YSBnZW5lcmF0ZWQgYGdldEZpZWxkVmFsdWVgIGlzIGluY29tcGF0aWJsZSB3aXRoIGBzZXRGaWVsZFZhbHVlYCBmb3IgYmluYXJ5IHZhbHVlcy4KKyAgICAqIFtUSFJJRlQtMzQ4NF0gLSBDb25zb2xpZGF0ZSB0ZW1wb3JhcnkgYnVmZmVycyBpbiBKYXZhJ3MgVENvbXBhY3RQcm90b2NvbAorICAgICogW1RIUklGVC0zNTE2XSAtIEFkZCBmZWF0dXJlIHRlc3QgZm9yIFRIZWFkZXIgVEJpbmFyeVByb3RvY29sIGludGVyb3AKKyAgICAqIFtUSFJJRlQtMzUxNV0gLSBQeXRob24gMi42IGNvbXBhdGliaWxpdHkgYW5kIHRlc3Qgb24gQ0kKKyAgICAqIFtUSFJJRlQtMzUxNF0gLSBQSFAgNyBjb21wYXRpYmxlIHZlcnNpb24gb2YgYmluYXJ5IHByb3RvY29sCisgICAgKiBbVEhSSUZULTM0NjldIC0gRG9ja2VyOiBEZWJpYW4gc3VwcG9ydAorICAgICogW1RIUklGVC0zNDE2XSAtIFJldGlyZSBvbGQgInh4eF9uYW1lc3BhY2UiIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBJREwKKyAgICAqIFtUSFJJRlQtMzQyNl0gLSBBbGlnbiBhdXRvZ2VuIGNvbW1lbnQgaW4gWFNECisgICAgKiBbVEhSSUZULTM0MjRdIC0gQWRkIENNYWtlIGFuZHJvaWQgYnVpbGQgb3B0aW9uCisgICAgKiBbVEhSSUZULTM0MzldIC0gUnVuIG1ha2UgY3Jvc3MgdXNpbmcgUHl0aG9uMyB3aGVuIGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zNDQwXSAtIFB5dGhvbiBtYWtlIGNoZWNrIHRha2VzIHRvbyBtdWNoIHRpbWUKKyAgICAqIFtUSFJJRlQtMzQ0MV0gLSBTdGFiaWxpemUgVHJhdmlzLUNJIGJ1aWxkcworICAgICogW1RIUklGVC0zNDMxXSAtIEF2b2lkICJzY2hlbWVzIiBIYXNoTWFwIGxvb2t1cHMgZHVyaW5nIHN0cnVjdCByZWFkcy93cml0ZXMKKyAgICAqIFtUSFJJRlQtMzQzMl0gLSBBZGQgYSBUQnl0ZUJ1ZmZlciB0cmFuc3BvcnQgdG8gdGhlIEphdmEgbGlicmFyeQorICAgICogW1RIUklGVC0zNDM4XSAtIEVuYWJsZSBweTpuZXdfc3R5bGUgYnkgZGVmYXVsdAorICAgICogW1RIUklGVC0zNDA1XSAtIEdvIFRIdHRwQ2xpZW50IG1pc3VzZXMgaHR0cC5DbGllbnQgb2JqZWN0cworICAgICogW1RIUklGVC0zNjE0XSAtIEltcHJvdmUgbG9nZ2luZyBvZiB0ZXN0X3NzbHNvY2tldC5weQorICAgICogW1RIUklGVC0zNjQ3XSAtIEZpeCBwaHAgZXh0ZW5zaW9uIGJ1aWxkIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTM2NDJdIC0gU3BlZWQgdXAgY3Jvc3MgdGVzdCBydW5uZXIKKyAgICAqIFtUSFJJRlQtMzYzN10gLSBJbXBsZW1lbnQgY29tcGFjdCBwcm90b2NvbCBmb3IgZGFydAorICAgICogW1RIUklGVC0zNjEzXSAtIFBvcnQgUHl0aG9uIEMgZXh0ZW5zaW9uIHRvIFB5dGhvbiAzCisgICAgKiBbVEhSSUZULTM2MTJdIC0gQWRkIFB5dGhvbiBDIGV4dGVuc2lvbiBmb3IgY29tcGFjdCBwcm90b2NvbAorICAgICogW1RIUklGVC0zNjExXSAtIEFkZCAtLXJlZ2V4IGZpbHRlciB0byBjcm9zcyB0ZXN0IHJ1bm5lcgorICAgICogW1RIUklGVC0zNjMxXSAtIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEx1YQorICAgICogW1RIUklGVC0zNjA5XSAtIFJlbW92ZSBvciByZXBsYWNlIFRlc3RQb3J0Rml4dHVyZS5oCisgICAgKiBbVEhSSUZULTM2MDVdIC0gSGF2ZSB0aGUgY29tcGlsZXIgY29tcGxhaW4gYWJvdXQgaW52YWxpZCBhcmd1bWVudHMgYW5kIG9wdGlvbnMKKyAgICAqIFtUSFJJRlQtMzU5Nl0gLSBCZXR0ZXIgY29uZm9ybWFuY2UgdG8gUEVQOAorICAgICogW1RIUklGVC0zNTg1XSAtIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIEx1YQorICAgICogW1RIUklGVC0zNTgyXSAtIEVybGFuZyBsaWJyYXJpZXMgc2hvdWxkIGhhdmUgc2VydmljZSBtZXRhZGF0YQorICAgICogW1RIUklGVC0zNTc5XSAtIEludHJvZHVjZSByZXRyeSB0byBtYWtlIGNyb3NzCisgICAgKiBbVEhSSUZULTMzMDZdIC0gSmF2YTogVEJpbmFyeVByb3RvY29sOiBVc2UgMSB0ZW1wIGJ1ZmZlciBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgOAorICAgICogW1RIUklGVC0zOTEwXSAtIERvIG5vdCBpbnZva2UgcGlwIGFzIHBhcnQgb2YgYnVpbGQgcHJvY2VzcworICAgICogW1RIUklGVC0xODU3XSAtIFB5dGhvbiAzLlggU3VwcG9ydAorICAgICogW1RIUklGVC0xOTQ0XSAtIEJpbmRpbmcgdG8gemVybyBwb3J0CisgICAgKiBbVEhSSUZULTM5NTRdIC0gRW5hYmxlIHRoZSB1c2FnZSBvZiBzdHJ1Y3RzIGNhbGxlZCAiT2JqZWN0IiBpbiBKYXZhCisgICAgKiBbVEhSSUZULTM5ODFdIC0gRW5hYmxlIGFuYWx5emVyIHN0cm9uZyBtb2RlIGluIERhcnQgbGlicmFyeQorICAgICogW1RIUklGVC0zOTk4XSAtIERvY3VtZW50IGFiaWxpdHkgdG8gYWRkIGN1c3RvbSB0YWdzIHRvIHRocmlmdCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQwMDZdIC0gQWRkIGEgcmVtb3ZlRXZlbnRMaXN0ZW5lciBtZXRob2Qgb24gVFNvY2tldAorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC02NDBdIC0gU3VwcG9ydCBkZXByZWNhdGlvbgorICAgICogW1RIUklGVC05NDhdIC0gU1NMIHNvY2tldCBzdXBwb3J0IGZvciBQSFAKKyAgICAqIFtUSFJJRlQtNzY0XSAtIGFkZCBTdXBwb3J0IGZvciBWYWxhIGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTMwNDZdIC0gQWxsb3cgUFNSNCBjbGFzcyBsb2FkaW5nIGZvciBnZW5lcmF0ZWQgY2xhc3NlcyAoUEhQKQorICAgICogW1RIUklGVC0yMTEzXSAtIEVybGFuZyBTU0wgU29ja2V0IFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTQ4Ml0gLSBVbml4IGRvbWFpbiBzb2NrZXQgc3VwcG9ydCB1bmRlciBQSFAKKyAgICAqIFtUSFJJRlQtNTE5XSAtIFN1cHBvcnQgY29sbGVjdGlvbnMgb2YgdHlwZXMgd2l0aG91dCBoYXZpbmcgdG8gZXhwbGljaXRseSBkZWZpbmUgaXQKKyAgICAqIFtUSFJJRlQtNDY4XSAtIFJhY2sgTWlkZGxld2FyZSBBcHBsaWNhdGlvbiBmb3IgUmFpbHMKKyAgICAqIFtUSFJJRlQtMTcwOF0gLSBBZGQgZXZlbnQgaGFuZGxlcnMgZm9yIHByb2Nlc3NvciBldmVudHMKKyAgICAqIFtUSFJJRlQtMzgzNF0gLSBFcmxhbmcgbmFtZXNwYWNpbmcgYW5kIGV4Y2VwdGlvbiBtZXRhZGF0YQorICAgICogW1RIUklGVC0yNTEwXSAtIEltcGxlbWVudCBUTm9uYmxvY2tpbmdTZXJ2ZXIncyBhYmlsaXR5IHRvIGxpc3RlbiBvbiB1bml4IGRvbWFpbiBzb2NrZXRzCisgICAgKiBbVEhSSUZULTMzOTddIC0gSW1wbGVtZW50IFRQcm9jZXNzb3JGYWN0b3J5IGluIEMjIHRvIGVuYWJsZSBwZXItY2xpZW50IHByb2Nlc3NvcnMKKyAgICAqIFtUSFJJRlQtMzUyM10gLSBYTUwgR2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTM1MTBdIC0gQWRkIEh0dHBUYXNrQXN5bmNIYW5kbGVyIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMzMThdIC0gUEhQOiBTaW1wbGVKU09OUHJvdG9jb2wgSW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzI5OV0gLSBEYXJ0IGxhbmd1YWdlIGJpbmRpbmdzIGluIFRocmlmdAorICAgICogW1RIUklGVC0yODM1XSAtIEFkZCBwb3NzaWJpbGl0eSB0byBkaXN0cmlidXRlIGdlbmVyYXRvcnMgc2VwYXJhdGVseSBmcm9tIHRocmlmdCBjb3JlLCBhbmQgbG9hZCB0aGVtIGR5bmFtaWNhbGx5CisgICAgKiBbVEhSSUZULTE4NF0gLSBBZGQgT1NHaSBNYW5pZmVzdCBoZWFkZXJzIHRvIHRoZSBsaWJ0aHJpZnQgamF2YSBsaWJyYXJ5IHRvIGJlIGFibGUgdG8gdXNlIFRocmlmdCBpbiB0aGUgT1NHaSBydW50aW1lCisgICAgKiBbVEhSSUZULTE0MV0gLSBJZiBhIHJlcXVpcmVkIGZpZWxkIGlzIG5vdCBwcmVzZW50IG9uIHNlcmlhbGl6YXRpb24sIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xODkxXSAtIEFkZCBXaW5kb3dzIEFMUEMgdHJhbnNwb3J0IHdoaWNoIGlzIHJpZ2h0IGNvdW50ZXJwYXJ0IG9mIFVuaXggZG9tYWluIHNvY2tldHMKKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMTgwOF0gLSBUaGUgVGhyaWZ0IHN0cnVjdCBzaG91bGQgYmUgY29uc2lkZXJlZCBzZWxmLWNvbnRhaW5lZD8KKyAgICAqIFtUSFJJRlQtMjg5NV0gLSBUdXRvcmlhbCBjcHAKKyAgICAqIFtUSFJJRlQtMzg2MF0gLSBFbGVwaGFudC1iaXJkIGFwcGxpY2F0aW9uIFRlc3QgZmFpbHMgZm9yIFRocmlmdAorICAgICogW1RIUklGVC0zODExXSAtIEhUVFBTIFN1cHBvcnQgZm9yIEMrKyBhcHBsaWNhdGlvbnMKKyAgICAqIFtUSFJJRlQtMzUwOV0gLSAibWFrZSBjaGVjayIgZXJyb3IKKworIyMgU3RvcnkKKyAgICAqIFtUSFJJRlQtMzQ1Ml0gLSAudHJhdmlzLnltbDogTWlncmF0aW5nIGZyb20gbGVnYWN5IHRvIGNvbnRhaW5lci1iYXNlZCBpbmZyYXN0cnVjdHVyZQorCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xODExXSAtIHJ1YnkgdHV0b3JpYWwgYXMgcGFydCBvZiB0aGUgcmVndWxhciBidWlsZAorICAgICogW1RIUklGVC0yNzc5XSAtIFBIUCBUSlNPTlByb3RvY29sIGVuY29kZSB1bmljb2RlIGludG8gVUNTLTRMRSB3aGljaCBjYW4ndCBiZSBwYXJzZWQgYnkgb3RoZXIgbGFuZ3VhZ2UgYmluZGluZ3MKKyAgICAqIFtUSFJJRlQtMjExMF0gLSBFcmxhbmc6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTM4NTJdIC0gQSBUcmF2aXMtQ0kgam9iIGZhaWxzIHdpdGggIndyaXRlIGVycm9yIgorICAgICogW1RIUklGVC0zNzQwXSAtIEZpeCBoYXhlbGliLmpzb24gY2xhc3NwYXRoIAorICAgICogW1RIUklGVC0zNjUzXSAtIGluY29ycmVjdCB1bmlvbiBzZXJpYWxpemF0aW9uCisgICAgKiBbVEhSSUZULTM2NTJdIC0gaW5jb3JyZWN0IHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWxzCisgICAgKiBbVEhSSUZULTM2NTVdIC0gaW5jb3JyZWN0IHVuaW9uIHNlcmlhbGl6YXRpb24KKyAgICAqIFtUSFJJRlQtMzY1NF0gLSBpbmNvcnJlY3Qgc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbHMKKyAgICAqIFtUSFJJRlQtMzY1Nl0gLSBpbmNvcnJlY3Qgc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbHMKKyAgICAqIFtUSFJJRlQtMzY5OV0gLSBGaXggaW50ZWdlciBsaW1pdCBzeW1ib2wgaW5jbHVkZXMgaW4gUHl0aG9uIEMgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTM2OTNdIC0gRml4IGluY2x1ZGUgaXNzdWUgaW4gQysrIFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0IG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMzY5NF0gLSBbV2luZG93c10gRGlzYWJsZSB0ZXN0cyBvZiBhIGZldyBzZXJ2ZXJzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAqIFtUSFJJRlQtMzY5Nl0gLSBJbnN0YWxsIHBpcCB0byBDZW50T1MgRG9ja2VyIGltYWdlcyB0byBmaXggUHl0aG9uIGJ1aWxkcworICAgICogW1RIUklGVC0zNjM4XSAtIEZpeCBoYXhlbGliLmpzb24KKyAgICAqIFtUSFJJRlQtMzI1MV0gLSBBZGQgaHR0cCB0cmFuc3BvcnQgZm9yIHNlcnZlciB0byBHbyBsaWIKKyAgICAqIFtUSFJJRlQtMjQyNF0gLSBSZWN1cnNpdmUgVHlwZXMKKyAgICAqIFtUSFJJRlQtMjQyM10gLSBUSGVhZGVyCisgICAgKiBbVEhSSUZULTI0MTNdIC0gUHl0aG9uOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQwOV0gLSBKYXZhOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQxMl0gLSBEOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQxMV0gLSBDKys6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDEwXSAtIEphdmFNZTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI2NjhdIC0gVGVzdFN1aXRlOiBkZXRhaWxlZCByZXN1bHQgb24gcGFzc2VkIHRlc3RzIGJ5IGZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMjY1OV0gLSBweXRob24gVGVzdCBTZXJ2ZXIgZmFpbHMgd2hlbiB0aHJvd2luZyBURXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMzOThdIC0gQWRkIENNYWtlIGJ1aWxkICBmb3IgSGFza2VsbCBsaWJyYXJ5IGFuZCB0ZXN0cworICAgICogW1RIUklGVC0zMzk2XSAtIERBUlQ6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0zMzY0XSAtICAgRml4IHJ1YnkgYmluYXJ5IGZpZWxkIGVuY29kaW5nIGluIFRKU09OUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzM4MV0gLSBGaXggZm9yIG1pc2MuIGNvZGVnZW4gaXNzdWVzIHdpdGggVEhSSUZULTI5MDUKKyAgICAqIFtUSFJJRlQtMzU3M10gLSBObyBydWxlIHRvIG1ha2UgdGFyZ2V0IGAuLi8uLi8uLi90ZXN0L2NfZ2xpYi9zcmMvLmRlcHMvdGVzdHRocmlmdHRlc3QtdGhyaWZ0X3Rlc3RfaGFuZGxlci5QbycuCisgICAgKiBbVEhSSUZULTM1NzJdIC0gIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IgorICAgICogW1RIUklGVC0zNTQyXSAtIEFkZCBsZW5ndGggbGltaXQgc3VwcG9ydCB0byBKYXZhIHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTM1MzddIC0gUmVtb3ZlIHRoZSAobm93IG9ic29sZXRlKSBjc2hhcnA6YXN5bmNjdHAgZmxhZyAKKyAgICAqIFtUSFJJRlQtMzUzMl0gLSBBZGQgY29uZmlndXJhYmxlIHN0cmluZyBhbmQgY29udGFpbmVyIHJlYWQgc2l6ZSBsaW1pdCB0byBQeXRob24gcHJvdG9jb2xzCisgICAgKiBbVEhSSUZULTM1MzFdIC0gQ3JlYXRlIGNyb3NzIGxhbmcgZmVhdHVyZSB0ZXN0IGZvciBzdHJpbmcgYW5kIGNvbnRhaW5lciByZWFkIGxlbmd0aCBsaW1pdAorICAgICogW1RIUklGVC0zNDgyXSAtIEhhc2tlbGwgSlNPTiBwcm90b2NvbCBkb2VzIG5vdCBlbmNvZGUgYmluYXJ5IGZpZWxkIGFzIEJhc2U2NAorICAgICogW1RIUklGVC0zNDI1XSAtIE1pbm9yIGZpeGVzICsgc2ltcGxpZmljYXRpb24gZm9yIENlbnRPUyBEb2NrZXJmaWxlCisgICAgKiBbVEhSSUZULTM0NDJdIC0gUnVuIENNYWtlIHRlc3RzIG9uIEFwcHZleW9yCisgICAgKiBbVEhSSUZULTM0MDldIC0gTm9kZUpTIGJpbmFyeSBmaWVsZCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMzYyMV0gLSBGaXggbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworICAgICogW1RIUklGVC0zNjI4XSAtIEZpeCBsaWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworICAgICogW1RIUklGVC0zNjI1XSAtIEtpbGwgdW51c2VkICNpbmNsdWRlICJUZXN0UG9ydEZpeHR1cmUuaCIgaW4gbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcC4KKyAgICAqIFtUSFJJRlQtMzY0Nl0gLSBGaXggUHl0aG9uIGV4dGVuc2lvbiBidWlsZCB3YXJuaW5ncworICAgICogW1RIUklGVC0zNjI2XSAtIEZpeCBsaWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMuCisgICAgKiBbVEhSSUZULTM2MjRdIC0gRml4IGxpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cworICAgICogW1RIUklGVC0zNjIzXSAtIEZpeCBGaXggY3BwL2xpYi90ZXN0L1RTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM1OTJdIC0gQWRkIGJhc2ljIHRlc3QgY2xpZW50CisgICAgKiBbVEhSSUZULTM5ODBdIC0gYWRkIFRFeHRlbmRlZEJpbmFyeVByb3RvY29sLmphdmEKKworIyMgVGFzaworICAgICogW1RIUklGVC0xODAxXSAtIFN5bmMgdXAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGNvZGVzIGFjcm9zcyBsYW5ndWFnZXMgYW5kIHRocmlmdCBpbXBsZW1lbnRhdGlvbnMKKyAgICAqIFtUSFJJRlQtMTI1OV0gLSBBdXRvbWF0ZSB2ZXJzaW9uaW5nIAorCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTM0MDBdIC0gQWRkIEVybGFuZyB0byBjcm9zcyB0ZXN0CisgICAgKiBbVEhSSUZULTM1MDRdIC0gRml4IEZhc3RiaW5hcnlUZXN0LnB5CisKKyMjIFdpc2gKKyAgICAqIFtUSFJJRlQtMzkyM10gLSBNYXliZSByZW1vdmUgQWVyZW8gZnJvbSB0aGUgIlBvd2VyZWQgYnkiIGxpc3QKKyAgICAqIFtUSFJJRlQtMjE0OV0gLSBBZGQgYW4gb3B0aW9uIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBvcGVyYXRvcnMKKworCisKK1RocmlmdCAwLjkuMworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0yNDQxXSAtIENhbm5vdCBzaHV0ZG93biBUVGhyZWFkZWRTZXJ2ZXIgd2hlbiBjbGllbnRzIGFyZSBzdGlsbCBjb25uZWN0ZWQKKyAgICAqIFtUSFJJRlQtMjQ2NV0gLSBUQmluYXJ5UHJvdG9jb2xUIGJyZWFrcyBpZiBjb3BpZWQvbW92ZWQKKyAgICAqIFtUSFJJRlQtMjQ3NF0gLSB0aHJpZnQuaCBjYXVzZXMgYSBjb21waWxlIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMjU0MF0gLSBSdW5uaW5nIGNvbmZpZ3VyZSBmcm9tIG91dHNpZGUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgZmFpbHMKKyAgICAqIFtUSFJJRlQtMjU5OF0gLSBBZGQgY2hlY2sgZm9yIG1pbmltdW0gR28gdmVyc2lvbiB0byBjb25maWd1cmUuYWMKKyAgICAqIFtUSFJJRlQtMjY0N10gLSBjb21waWxlci1oczogZG9uJ3QgZGVjYXBpdGFsaXplIGZpZWxkIG5hbWVzLCBkbyBkZWNhcGl0YWxpemUgYXJndW1lbnQgYmluZGluZ3MKKyAgICAqIFtUSFJJRlQtMjc3M10gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciAnb25ld2F5JyBtZXRob2RzIGlzIGluY29ycmVjdC4KKyAgICAqIFtUSFJJRlQtMjc4OV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgbGVha3Mgc29ja2V0IEZEJ3MgdW5kZXIgbG9hZAorICAgICogW1RIUklGVC0yNjgyXSAtIFRUaHJlYWRlZFNlcnZlciBsZWFrcyBwZXItdGhyZWFkIG1lbW9yeQorICAgICogW1RIUklGVC0yNjc0XSAtIEphdmFTY3JpcHQ6IGRlY2xhcmUgQWNjZXB0OiBhbmQgQ29udGVudC1UeXBlOiBpbiByZXF1ZXN0CisgICAgKiBbVEhSSUZULTMwNzhdIC0gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0J3MgbG9nZ2VyIGlzIG5vdCBuYW1lZCBhZnRlciBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzA3N10gLSBDKysgVEZpbGVUcmFuc3BvcnQgaWdub3JlcyByZXR1cm4gY29kZSBmcm9tIGZ0cnVuY2F0ZQorICAgICogW1RIUklGVC0zMDY3XSAtIEMrKyBjcHBjaGVjayBwZXJmb3JtYW5jZSByZWxhdGVkIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTMwNjZdIC0gQysrIFREZW5zZVByb3RvY29sIGFzc2VydCBtb2RpZmllcyBpbnN0ZWFkIG9mIGNoZWNrcworICAgICogW1RIUklGVC0zMDcxXSAtIGJvb3RzdHJhcC5zaCBvbiBVYnVudHUgMTIuMDQgKFByZWNpc2UpIGF1dG9tYWtlIGVycm9yCisgICAgKiBbVEhSSUZULTMwNjldIC0gQysrIFRTZXJ2ZXJTb2NrZXQgbGVha3Mgc29ja2V0IG9uIGZjbnRsIGdldCBvciBzZXQgZmxhZ3MgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzA3OV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQncyBsb2dnZXIgaXMgbm90IG5hbWVkIGFmdGVyIFROb25ibG9ja2luZ1NlcnZlclNvY2tldAorICAgICogW1RIUklGVC0zMDgwXSAtIEMrKyBUTm9uYmxvY2tpbmdTZXJ2ZXIgY29ubmVjdGlvbiBsZWFrIHdoaWxlIGFjY2VwdCBodWdlIG51bWJlciBjb25uZWN0aW9ucy4KKyAgICAqIFtUSFJJRlQtMzA4Nl0gLSBDKysgVmFsZ3JpbmQgRXJyb3IgQ2xlYW51cAorICAgICogW1RIUklGVC0zMDg1XSAtIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50IG5ldmVyIHRyeSB0byByZWNvbm5lY3QKKyAgICAqIFtUSFJJRlQtMzEyM10gLSBNaXNzaW5nIGluY2x1ZGUgaW4gY29tcGlsZXIvY3BwL3NyYy9tYWluLmggYnJlYWtzIGJ1aWxkIGluIHNvbWUgZW52aXJvbm1lbnRzCisgICAgKiBbVEhSSUZULTMxMjVdIC0gRml4IHRoZSBsaXN0IG9mIGV4cG9ydGVkIGhlYWRlcnMgaW4gYXV0b21ha2UgaW5wdXQKKyAgICAqIFtUSFJJRlQtMzEyNl0gLSBQSFAgSlNPTiBzZXJpYWxpemVyIGNvbnZlcnRzIGVtcHR5IG9yIGludC1pbmRleGVkIG1hcHMgdG8gbGlzdHMKKyAgICAqIFtUSFJJRlQtMzEzMl0gLSBQcm9wZXJseSBmb3JtYXQgZGF0ZSBpbiBKYXZhIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMKKyAgICAqIFtUSFJJRlQtMzEzN10gLSBUcmF2aXMgYnVpbGQgaGFuZ3MgYWZ0ZXIgZmFpbHVyZQorICAgICogW1RIUklGVC0zMTM4XSAtICJtYWtlIGNoZWNrIiBwYXJhbGxlbCBleGVjdXRpb24gaXMgdW5kZXJtaW5pc3RpYworICAgICogW1RIUklGVC0zMTM5XSAtIEpTIGxpYnJhcnkgdGVzdCBpcyBmbGFreQorICAgICogW1RIUklGVC0zMTQwXSAtIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaXMgdGhyb3duIGJ5IEphdmFTY3JpcHQgdGVzdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzEyNF0gLSBTb21lIHNpZ25lZC91bnNpZ25lZCB3YXJuaW5ncyB3aGlsZSBidWlsZGluZyBjb21waWxlcgorICAgICogW1RIUklGVC0zMTI4XSAtIEdvIGdlbmVyYXRlZCBjb2RlIHByb2R1Y2VzIG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHNlcnZpY2VzCisgICAgKiBbVEhSSUZULTMxNDZdIC0gR3JhcGh2aXogZ2VuZXJhdGVzIGZ1bmN0aW9uIG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHNlcnZpY2VzCisgICAgKiBbVEhSSUZULTMxNDddIC0gU2VnZmF1bHQgd2hpbGUgcmVjZWl2aW5nIGRhdGEKKyAgICAqIFtUSFJJRlQtMzE0OF0gLSBNYXJrZG93biBsaW5rcyB0byBjb2Rpbmdfc3RhbmRhcmRzIGFyZSBkZWFkCisgICAgKiBbVEhSSUZULTMwOTBdIC0gY21ha2UgYnVpbGQgaXMgYnJva2VuIG9uIE1hY09TWAorICAgICogW1RIUklGVC0zMDk3XSAtIGNtYWtlIHRhcmdldHMgdW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBvcHRpb25hbCBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMzA5NF0gLSBtYXN0ZXIgYXMgb2YgMjAxNS1BUFItMTMgZmFpbHMgLURCT09TVF9USFJFQURTIGNtYWtlIGJ1aWxkCisgICAgKiBbVEhSSUZULTMwOTldIC0gY21ha2UgYnVpbGQgaXMgYnJva2VuIG9uIEZyZWVCU0QKKyAgICAqIFtUSFJJRlQtMzA4OV0gLSBBc3NpZ25pbmcgZGVmYXVsdCBFTlVNIHZhbHVlcyByZXN1bHRzIGluIG5vbi1jb21waWxhYmxlIGphdmEgY29kZSBpZiBqYXZhIG5hbWVzcGFjZSBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0zMDkzXSAtIG1pbmd3IGNvbXBpbGUgZml4ZXMgZm9yIGMrKyBsaWJyYXJ5IDAuOS4yCisgICAgKiBbVEhSSUZULTMwOThdIC0gVGhyaWZ0IGRvZXMgbm90IHByZXR0eSBwcmludCBiaW5hcnkgdHlwZWRlZnMgdGhlIHdheSBpdCBkb2VzIGJpbmFyeSBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMzA5MV0gLSBjX2dsaWIgc2VydmljZSBtZXRob2Qgc2hvdWxkIHJldHVybiByZXN1bHQgZnJvbSBoYW5kbGVyIG1ldGhvZAorICAgICogW1RIUklGVC0zMDg4XSAtIFRUaHJlYWRQb29sU2VydmVyIHdpdGggU2FzbCBhdXRoIG1heSBsZWFrIENMT1NFX1dBSVQgc29ja2V0CisgICAgKiBbVEhSSUZULTMxMDldIC0gQ3Jvc3MgdGVzdCBsb2cgZmlsZSBjYW5ub3QgYmUgYnJvd3NlZCB3aGVuIHNlcnZlZCBpbiBIVFRQIHNlcnZlcgorICAgICogW1RIUklGVC0zMTEzXSAtIG00IEMrKzExIG1hY3JvIGlzc3VlCisgICAgKiBbVEhSSUZULTMxMDVdIC0gQysrIGxpYnRocmlmdG5iIGxpYnJhcnkgb24gV2luZG93cyBidWlsZCBmYWlsdXJlCisgICAgKiBbVEhSSUZULTMxMTVdIC0gVW5jb21waWxlYWJsZSBjb2RlIGR1ZSB0byBuYW1lIGNvbGxpc2lvbiB3aXRoIHByZWRlZmluZWQgdXNlZCB0eXBlcworICAgICogW1RIUklGVC0zMTE3XSAtIEphdmEgVFNTTFRyYW5zcG9ydEZhY3RvcnkgY2FuJ3QgbG9hZCBjZXJ0aWZpY2F0ZXMgd2l0aGluIEpBUiBhcmNoaXZlCisgICAgKiBbVEhSSUZULTMxMDJdIC0gY291bGQgbm90IG1ha2UgY2hlY2sgZm9yIEdvIExpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzEyMF0gLSBNaW5vciBzcGVsbGluZyBlcnJvcnMgYW5kIGFuIG91dGRhdGVkIFVSTAorICAgICogW1RIUklGVC0zMTIxXSAtIExpYnJ0IGRvZXMgbm90IGV4aXN0IG9uIE9TIFgKKyAgICAqIFtUSFJJRlQtMzE1Ml0gLSBDb21waWxlciBlcnJvciBvbiBNYWMgT1NYIChtaXNzaW5nICNpbmNsdWRlIDxjc3RkbGliPikKKyAgICAqIFtUSFJJRlQtMzE2Ml0gLSBtYWtlIGZhaWxzIGZvciBkbWQgMi4wNjcKKyAgICAqIFtUSFJJRlQtMzE2NF0gLSBUaHJpZnQgQysrIGxpYnJhcnkgU1NMIHNvY2tldCBieSBkZWZhdWx0IGFsbG93cyBmb3IgdW5zZWN1cmUgU1NMdjMgbmVnb3RpYXRpb24KKyAgICAqIFtUSFJJRlQtMzE2OF0gLSBGaXggTWF2ZW4gUE9NCisgICAgKiBbVEhSSUZULTMxNzBdIC0gSW5pdGlhbGlzbSBjb2RlIGluIHRoZSBHbyBjb21waWxlciBjYXVzZXMgY2hhb3MKKyAgICAqIFtUSFJJRlQtMzE2OV0gLSBEbyBub3QgZXhwb3J0IHRocmlmdC5UZXN0U3RydWN0IGFuZCB0aHJpZnQuVGVzdEVudW0gaW4gdGhyaWZ0IEdvIGxpYnJhcnkgCisgICAgKiBbVEhSSUZULTMxOTFdIC0gUGVybCBjb21waWxlciBkb2VzIG5vdCBhZGQgc3VwcG9ydCBmb3IgdW5leHBlY3RlZCBleGNlcHRpb24gaGFuZGxpbmcKKyAgICAqIFtUSFJJRlQtMzE3OF0gLSBnbGliIEMgZG9lcyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0zMTg5XSAtIFBlcmwgU2VydmVyU29ja2V0IHNob3VsZCBhbGxvdyBhIHNwZWNpZmljIGludGVyZmFjZSB0byBiZSBsaXN0ZW5lZCB0bworICAgICogW1RIUklGVC0zMjUyXSAtIE1pc3NpbmcgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIGluIGNwcCBNYWtlZmlsZSwgc28gZG9lc24ndCBpbnN0YWxsCisgICAgKiBbVEhSSUZULTMyNTVdIC0gVGhyaWZ0IGdlbmVyYXRvciBkb2Vzbid0IGV4Y2x1ZGUgJ3BhY2thZ2UnIGtleXdvcmQgZm9yIHRocmlmdCBwcm9wZXJ0eSBuYW1lcyBicmVha2luZyBqYXZhIGJ1aWxkcworICAgICogW1RIUklGVC0zMjYwXSAtIG11bHRpcGxlIHdhcm5pbmdzIGluIGNfZ2xpYiB0dXRvcmlhbAorICAgICogW1RIUklGVC0zMjU2XSAtIFNvbWUgRCB0ZXN0IHRpbWluZ3MgYXJlIHRvbyBhZ2dyZXNzaXZlIGZvciBzbG93IG1hY2hpbmVzCisgICAgKiBbVEhSSUZULTMyNTddIC0gd2FybmluZzogZXh0cmEgdG9rZW5zIGF0IGVuZCBvZiAjZW5kaWYgZGlyZWN0aXZlCisgICAgKiBbVEhSSUZULTMxODRdIC0gVGhyaWZ0IEdvIGxlYXZlcyBmaWxlIGRlc2NyaXB0b3JzIG9wZW4KKyAgICAqIFtUSFJJRlQtMzIwM10gLSBET0FQIC0gcGxlYXNlIGZpeCAiT2NhbWwiID0+ICJPQ2FtbCIKKyAgICAqIFtUSFJJRlQtMzIxMF0gLSAodW5jb21waWxlYWJsZSkgY29kZSBnZW5lcmF0ZWQgZm9yIHNlcnZlciBldmVudHMgd2hpbGUgYXJlIGV2ZW50cyBub3QgZW5hYmxlZAorICAgICogW1RIUklGVC0zMjE1XSAtIFRKU09OUHJvdG9jb2wgJyhjKyspIHVzZXMgInRocm93IG5ldyIgdG8gdGhyb3cgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mICJ0aHJvdyIKKyAgICAqIFtUSFJJRlQtMzIwMl0gLSBBbGxvdyBIU0hBU2VydmVyIHRvIGNvbmZpZ3VyZSBtaW4gYW5kIG1heCB3b3JrZXIgdGhyZWFkcyBzZXBhcmF0ZWx5LgorICAgICogW1RIUklGVC0zMjA1XSAtIFRDb21wYWN0UHJvdG9jb2wgcmV0dXJuIGEgd3JvbmcgZXJyb3Igd2hlbiB0aGUgaW8uRU9GIGhhcHBlbnMKKyAgICAqIFtUSFJJRlQtMzIwOV0gLSBMR1BMIG1lbnRpb25lZCBpbiBsaWNlbnNlIGZpbGUKKyAgICAqIFtUSFJJRlQtMzE5N10gLSBrZWVwQWxpdmVUaW1lIGlzIGhhcmQgY29kZWQgYXMgNjAgc2VjIGluIFRUaHJlYWRQb29sU2VydmVyCisgICAgKiBbVEhSSUZULTMxOTZdIC0gTWlzc3BlbGxpbmcgaW4gbHVhIFRCaW5hcnlQcm90b2NvbCAoc3RpcmN0V3JpdGUgPT4gc3RyaWN0V3JpdGUpCisgICAgKiBbVEhSSUZULTMxOThdIC0gQWxsb3cgY29uc3RydWN0aW9uIG9mIFRUcmFuc3BvcnRGYWN0b3J5IHdpdGggYSBzcGVjaWZpZWQgbWF4TGVuZ3RoCisgICAgKiBbVEhSSUZULTMxOTJdIC0gR28gaW1wb3J0IHBhdGhzIGNoYW5nZWQgaW4gMS40LCBhbmQgZXhwaXJlZCBKdW5lIDEKKyAgICAqIFtUSFJJRlQtMzI3MV0gLSBDb3VsZCBub3QgZmluZCBvciBsb2FkIG1haW4gY2xhc3MgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YSBvbiBzb21lIG5vbi1lbmdsaXNoIHN5c3RlbXMKKyAgICAqIFtUSFJJRlQtMzI3M10gLSBjX2dsaWI6IEdlbmVyYXRlZCBjb2RlIHRyaWVzIHRvIGNvbnZlcnQgYmV0d2VlbiBmdW5jdGlvbiBhbmQgdm9pZCBwb2ludGVycworICAgICogW1RIUklGVC0zMjY0XSAtIEZpeCBFcmxhbmcgMTYgbmFtZXNwYWNlZCB0eXBlcworICAgICogW1RIUklGVC0zMjcwXSAtIHJldXNpbmcgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiBjYXVzZSBkaXJ0eSBUU29ja2V0CisgICAgKiBbVEhSSUZULTMyNjddIC0gY19nbGliOiAiQ3JpdGljYWwiIGZhaWx1cmUgZHVyaW5nIHVuaXQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzI3N10gLSBUSHR0cENsaWVudCBsZWFrcyBjb25uZWN0aW9ucyBpZiBpdCdzIHVzZWQgZm9yIG11bHRpcGxlIHJlcXVlc3RzCisgICAgKiBbVEhSSUZULTMyNzhdIC0gTm9kZUpTOiBGaXggZXhjZXB0aW9uIHN0YWNrIHRyYWNlcyBhbmQgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzI3OV0gLSBGaXggYSBidWcgaW4gcmV0cnlfbWF4X2RlbGF5IChOb2RlSlMpCisgICAgKiBbVEhSSUZULTMyODBdIC0gSW5pdGlhbGl6ZSByZXRyeSB2YXJpYWJsZXMgb24gY29uc3RydWN0aW9uCisgICAgKiBbVEhSSUZULTMyODNdIC0gY19nbGliOiBUdXRvcmlhbCBzZXJ2ZXIgYWx3YXlzIGV4aXRzIHdpdGggd2FybmluZworICAgICogW1RIUklGVC0zMjg0XSAtIGNfZ2xpYjogRW1wdHkgc2VydmljZSBwcm9kdWNlcyB1bnVzZWQtdmFyaWFibGUgd2FybmluZworICAgICogW1RIUklGVC0xOTI1XSAtIGNfZ2xpYiBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTE4NDldIC0gYWZ0ZXIgdHJhbnNwb3J0LT5vcGVuKCkgb3BlbnMgaXNPcGVuIHJldHVybnMgdHJ1ZSBhbmQgbmV4dCBvcGVuKCkgZ29lcyB0aHJ1IHdoZW4gaXQgc2hhbGwgbm90CisgICAgKiBbVEhSSUZULTE4NjZdIC0gamF2YSBjb21waWxlciBnZW5lcmF0ZXMgbm9uLWNvbXBpbGluZyBjb2RlIHdpdGggY29uc3QncyBkZWZpbmVkIGluIGEgdGhyaWZ0IHdoZW4gbmFtZSBpbmNsdWRlcyBub24taWRlbnRpZmllciBjaGFycworICAgICogW1RIUklGVC0xOTM4XSAtIEZ1bmN0aW9uUnVubmVyLmggLS0gdXNlcyB3cm9uZyBwYXRoIGZvciBUaHJlYWQuaCB3aGVuIGluc3RhbGxlZAorICAgICogW1RIUklGVC0xODQ0XSAtIFBhc3N3b3JkIHN0cmluZyBub3QgY2xlYXJlZAorICAgICogW1RIUklGVC0yMDA0XSAtIFRocmlmdDo6VW5pb24gdmlvbGF0ZXMgOj09IG1ldGhvZCBjb250cmFjdCBhbmQgY3Jhc2hlcworICAgICogW1RIUklGVC0yMDczXSAtIFRocmlmdCBDKysgVEh0dHBDbGllbnQgZXJyb3I6IGNhbm5vdCByZWZpbGwgYnVmZmVyCisgICAgKiBbVEhSSUZULTIxMjddIC0gQXV0b2NvbmYgc2NyaXB0aW5nIGRvZXMgbm90IHByb3Blcmx5IGFjY291bnQgZm9yIGNyb3NzLWNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMjE4MF0gLSBJbnRlZ2VyIHR5cGVzIGlzc3VlcyBpbiBDb2NvYSBsaWIgb24gQVJNNjQKKyAgICAqIFtUSFJJRlQtMjE4OV0gLSBHbyBuZWVkcyAiaXNzZXQiIHRvIGZ1bGx5IHN1cHBvcnQgInVuaW9uIiB0eXBlIChhbmQgb3B0aW9uYWxzKQorICAgICogW1RIUklGVC0yMTkyXSAtIGF1dG90b29scyBvbiBSZWRoYXQgYmFzZWQgc3lzdGVtcworICAgICogW1RIUklGVC0yNTQ2XSAtIGNyb3NzIGxhbmd1YWdlIHRlc3RzIGZhaWxzIGF0ICdUZXN0TXVsdGlFeGNlcHRpb24nIHdoZW4gdXNpbmcgbm9kZWpzIHNlcnZlcgorICAgICogW1RIUklGVC0yNTQ3XSAtIG5vZGVqcyBzZXJ2ZXJzIGFuZCBjbGllbnRzIGZhaWxzIHRvIGNvbm5lY3Qgd2l0aCBjcHAgdXNpbmcgY29tcGFjdCBwcm90b2NvbAorICAgICogW1RIUklGVC0yNTQ4XSAtIE5vZGVqcyBzZXJ2ZXJzIGFuZCBjbGllbnRzIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgd2l0aCAgLXNzbAorICAgICogW1RIUklGVC0xNDcxXSAtIHRvU3RyaW5nKCkgZG9lcyBub3QgcHJpbnQgQnl0ZUJ1ZmZlciB2YWx1ZXMgd2hlbiBuZXN0ZWQgaW4gYSBMaXN0CisgICAgKiBbVEhSSUZULTEyMDFdIC0gZ2V0YWRkcmluZm8gcmVzb3VyY2UgbGVhaworICAgICogW1RIUklGVC02MTVdIC0gVFRocmVhZFBvb2xTZXJ2ZXIgZG9lc24ndCBjYWxsIHRhc2tfZG9uZSBhZnRlciBwdWxsaW5nIHRhc2tzIGZyb20gaXQncyBjbGllbnRzIHF1ZXVlCisgICAgKiBbVEhSSUZULTE2Ml0gLSBUaHJpZnQgc3RydWN0dXJlcyBhcmUgdW5oYXNoYWJsZSwgcHJldmVudGluZyB0aGVtIGZyb20gYmVpbmcgdXNlZCBhcyBzZXQgZWxlbWVudHMKKyAgICAqIFtUSFJJRlQtODEwXSAtIENyYXNoZWQgY2xpZW50IG9uIFRTb2NrZXQ6OmNsb3NlIHVuZGVyIGxvYWRzCisgICAgKiBbVEhSSUZULTU1N10gLSBjaGFyc2V0IHByb2JsZW0gd2l0aCBmaWxlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0CisgICAgKiBbVEhSSUZULTIzM10gLSBJREwgZG9lc24ndCBzdXBwb3J0IG5lZ2F0aXZlIGhleCBsaXRlcmFscworICAgICogW1RIUklGVC0xNjQ5XSAtIGNvbnRyaWIvemVyb21xIGRvZXMgbm90IGJ1aWxkIGluIDAuOC4wCisgICAgKiBbVEhSSUZULTE2NDJdIC0gTWlzY2FsY3VsYXRpb24gbGVhZCB0byB0aHJvdyB1bmV4cGVjdGVkICJUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQiKG9yIGNhbGxlZCAiRUFHQUlOICh0aW1lZCBvdXQpIikgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTE1ODddIC0gVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQgZXJyb3IKKyAgICAqIFtUSFJJRlQtMTI0OF0gLSBwb2ludGVyIHN1YnRyYWN0aW9uIGluIFRNZW1vcnlCdWZmZXIgcmVsaWVzIG9uIHVuZGVmaW5lZCBiZWhhdmlvcgorICAgICogW1RIUklGVC0xNzc0XSAtIFNhc2wgVHJhbnNwb3J0IGNsaWVudCB3b3VsZCBoYW5nIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3Qgbm9uLXNhc2wgdHJhbnNwb3J0IHNlcnZlcgorICAgICogW1RIUklGVC0xNzU0XSAtIFJhbmdlRXJyb3IgaW4gYnVmZmVyIGhhbmRsaW5nCisgICAgKiBbVEhSSUZULTE2MThdIC0gc3RhdGljIHN0cnVjdE1hcCBpbiBGaWVsZE1ldGFEYXRhIGlzIG5vdCB0aHJlYWQgc2FmZSBhbmQgY2FuIGxlYWQgdG8gZGVhZGxvY2tzCisgICAgKiBbVEhSSUZULTIzMzVdIC0gdGhyaWZ0IGluY29tcGF0aWJpbGl0eSB3aXRoIHB5OnRvcm5hZG8gYXMgc2VydmVyLCBqYXZhIGFzIGNsaWVudAorICAgICogW1RIUklGVC0yODAzXSAtIFRDUF9ERUZFUl9BQ0NFUFQgbm90IHN1cHBvcnRlZCB3aXRoIGRvbWFpbiBzb2NrZXRzCisgICAgKiBbVEhSSUZULTI3OTldIC0gQnVpbGQgUHJvYmxlbShzKTogbGQ6IGxpYnJhcnkgbm90IGZvdW5kIGZvciAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgICAqIFtUSFJJRlQtMjgwMV0gLSBDKysgdGVzdCBzdWl0ZSBjb21waWxhdGlvbiB3YXJuaW5ncworICAgICogW1RIUklGVC0yODAyXSAtIEMrKyB0dXRvcmlhbCBjb21waWxhdGlvbiB3YXJuaW5ncworICAgICogW1RIUklGVC0yNzk1XSAtIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wuYzogJ2RlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcycKKyAgICAqIFtUSFJJRlQtMjgxN10gLSBUU2ltcGxlSlNPTlByb3RvY29sIHJlYWRzIGJleW9uZCBlbmQgb2YgbWVzc2FnZQorICAgICogW1RIUklGVC0yODI2XSAtIGh0bWw6c3RhbmRhbG9uZSBzb21ldGltZXMgaWdub3JlZAorICAgICogW1RIUklGVC0yODI5XSAtIFN1cHBvcnQgaGF4ZWxpYiBpbnN0YWxsYXRpb24gdmlhIGdpdGh1YgorICAgICogW1RIUklGVC0yODI4XSAtIHNsaWdodGx5IHdyb25nIGhlbHAgc2NyZWVuIGluZGVudAorICAgICogW1RIUklGVC0yODMxXSAtIFJlbW92ZXMgZGVhZCBjb2RlIGluIHdlYl9zZXJ2ZXIuanMgaW50cm9kdWNlZCBpbiBUSFJJRlQtMjgxOQorICAgICogW1RIUklGVC0yODIzXSAtIEFsbCBKUy10ZXN0cyBhcmUgZmFpbGluZyB3aGVuIHJ1biB3aXRoIGdydW50IHRlc3QKKyAgICAqIFtUSFJJRlQtMjgyN10gLSBUaHJpZnQgMC45LjIgZmFpbHMgdG8gY29tcGlsZSBvbiBZb3NlbWl0ZSBkdWUgdG8gdHIxL2Z1bmN0aW9uYWwgaW5jbHVkZSBpbiBQcm9jZXNzb3JUZXN0LmNwcAorICAgICogW1RIUklGVC0yODQzXSAtIEF1dG9tYWtlIGNvbmZpZ3VyZS5hYyBoYXMgcG9zc2libGUgdHlwbyByZWxhdGVkIHRvIEphdmEKKyAgICAqIFtUSFJJRlQtMjgxM10gLSBtdWx0aXBsZSBoYXhlIGxpYnJhcnkgZml4ZXMvaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTI4MjVdIC0gU3VwcGx5aW5nIHVuaWNvZGUgdG8gcHl0aG9uIFRocmlmdCBjbGllbnQgY2FuIGNhdXNlIG5leHQgcmVxdWVzdCBhcmd1bWVudHMgdG8gZ2V0IG92ZXJ3cml0dGVuCisgICAgKiBbVEhSSUZULTI4NDBdIC0gQ2FiYWwgZmlsZSBwb2ludHMgdG8gTElDRU5TRSBmaWxlIG91dHNpZGUgdGhlIHBhdGggb2YgdGhlIEhhc2tlbGwgcHJvamVjdC4KKyAgICAqIFtUSFJJRlQtMjgxOF0gLSBUcmFpbGluZyBjb21tYXMgaW4gYXJyYXkKKyAgICAqIFtUSFJJRlQtMjgzMF0gLSBDbGVhbiB1cCBhbnQgd2FybmluZ3MgaW4gdHV0b3JpYWwgZGlyCisgICAgKiBbVEhSSUZULTI4NDJdIC0gRXJsYW5nIHRocmlmdCBjbGllbnQgaGFzIGluZmluaXRlIHRpbWVvdXQKKyAgICAqIFtUSFJJRlQtMjgxMF0gLSBEbyBub3QgbGVhdmUgdGhlIHVuZGVybHlpbmcgU2VydmVyU29ja2V0IG9wZW4gaWYgY29uc3RydWN0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQgZmFpbHMKKyAgICAqIFtUSFJJRlQtMjgxMl0gLSBHbyBzZXJ2ZXIgYWRkaW5nIHJlZHVuZGFudCBidWZmZXJpbmcgbGF5ZXIKKyAgICAqIFtUSFJJRlQtMjgzOV0gLSBURnJhbWVkVHJhbnNwb3J0IHJlYWQgYnVnCisgICAgKiBbVEhSSUZULTI4NDRdIC0gTm9kZWpzIHN1cHBvcnQgYnJva2VuIHdoZW4gcnVubmluZyB1bmRlciBCcm93c2VyaWZ5CisgICAgKiBbVEhSSUZULTI4MTRdIC0gYXJncy9yZXN1bHQgY2xhc3NlcyBub3QgZm91bmQgd2hlbiBubyBuYW1lc3BhY2UgaXMgc2V0CisgICAgKiBbVEhSSUZULTI4NDddIC0gZnVuY3Rpb24gSWZWYWx1ZSgpIGlzIGEgZHVwbGljYXRlIG9mIFN5c3RlbS5TdHJVdGlscy5JZlRoZW4KKyAgICAqIFtUSFJJRlQtMjg0OF0gLSBjZXJ0YWluIERlbHBoaSB0ZXN0cyBkbyBub3QgYnVpbGQgaWYgVHlwZVJlZ2lzdHJ5IGlzIHVzZWQKKyAgICAqIFtUSFJJRlQtMjg1NF0gLSBHbyBTdHJ1Y3Qgd3JpdGVyIGFuZCByZWFkZXIgbG9vc2VzIGltcG9ydGFudCBlcnJvciBpbmZvcm1hdGlvbgorICAgICogW1RIUklGVC0yODU4XSAtIEVuYWJsZSBoZWFkZXIgZmllbGQgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCBpbiBUSHR0cFNlcnZlcgorICAgICogW1RIUklGVC0yODU3XSAtIEMjIGdlbmVyYXRvciBjcmVhdGVzIHVuY29tcGlsYWJsZSBjb2RlIGZvciBzdHJ1Y3QgY29uc3RhbnRzCisgICAgKiBbVEhSSUZULTI4NjBdIC0gRGVscGhpIHNlcnZlciBjbG9zZXMgY29ubmVjdGlvbiBvbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMjg2OF0gLSBFbmhhbmNlIGVycm9yIGhhbmRsaW5nIGluIHRoZSBHbyBjbGllbnQgCisgICAgKiBbVEhSSUZULTI4NzldIC0gVE1lbW9yeUJ1ZmZlcjogdXNpbmcgbHVhIHN0cmluZyBpbiB3cm9uZyB3YXkKKyAgICAqIFtUSFJJRlQtMjg1MV0gLSBSZW1vdmUgc3RyYW5nZSBwdWJsaWMgUGVlaygpIGZyb20gR28gdHJhbnNwb3J0cworICAgICogW1RIUklGVC0yODUyXSAtIEJldHRlciBPcGVuL0lzT3Blbi9DbG9zZSBiZWhhdmlvciBmb3IgU3RyZWFtVHJhbnNwb3J0LgorICAgICogW1RIUklGVC0yODcxXSAtIE1pc3Npbmcgc2VtaWNvbG9uIGluIHRocmlmdC5qcworICAgICogW1RIUklGVC0yODcyXSAtIFRocmVhZE1hbmFnZXIgZGVhZGxvY2sgZm9yIHRhc2sgZXhwaXJhdGlvbgorICAgICogW1RIUklGVC0yODgxXSAtIEhhbmRsZSBlcnJvcnMgZnJvbSBBY2NlcHQoKSBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMjg0OV0gLSBTcGVsbCBlcnJvcnMgcmVwb3J0ZWQgYnkgY29kZXNwZWxsIHRvb2wKKyAgICAqIFtUSFJJRlQtMjg3MF0gLSBDKysgVEpTT05Qcm90b2NvbCB1c2luZyBsb2NhbGUgZGVwZW5kZW50IGZvcm1hdHRpbmcKKyAgICAqIFtUSFJJRlQtMjg4Ml0gLSBMdWEgR2VuZXJhdG9yOiB1c2luZyBzdHJpbmcubGVuIGZ1bnRpb24gdG8gZ2V0IHN0cnVjdChtYXAsbGlzdCxzZXQpIHNpemUKKyAgICAqIFtUSFJJRlQtMjg2NF0gLSBKU09OIGdlbmVyYXRvciBtaXNzaW5nIGZyb20gVmlzdWFsIFN0dWRpbyBidWlsZCBwcm9qZWN0IAorICAgICogW1RIUklGVC0yODc4XSAtIEdvIHZhbGlkYXRpb24gc3VwcG9ydCBvZiByZXF1aXJlZCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjg3M10gLSBUUGlwZSBhbmQgVFBpcGVTZXJ2ZXIgZG9uJ3QgY29tcGlsZSBvbiBXaW5kb3dzIHdpdGggVU5JQ09ERSBlbmFibGVkCisgICAgKiBbVEhSSUZULTI4ODhdIC0gaW1wb3J0IG9mIDxsaW1pdHM+IGlzIG1pc3NpbmcgaW4gSlNPTiBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMjkwMF0gLSBQeXRob24gVEh0dHBDbGllbnQgZG9lcyBub3QgcmVzZXQgc29ja2V0IHRpbWVvdXQgb24gZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTI5MDddIC0gJ250b2hsbCcgbWFjcm8gcmVkZWZpbmVkCisgICAgKiBbVEhSSUZULTI4ODRdIC0gTWFwIGRvZXMgbm90IHNlcmlhbGl6ZSBjb3JyZWN0bHkgZm9yIEpTT04gcHJvdG9jb2wgaW4gR28gbGlicmFyeQorICAgICogW1RIUklGVC0yODg3XSAtIC0td2l0aC1vcGVuc3NsIGNvbmZpZ3VyZSBmbGFnIGlzIGlnbm9yZWQKKyAgICAqIFtUSFJJRlQtMjg5NF0gLSBQSFAganNvbiBzZXJpYWxpemVyIHNraXBzIG1hcHMgd2l0aCBpbnQvYm9vbCBrZXlzCisgICAgKiBbVEhSSUZULTI5MDRdIC0ganNvbl9wcm90b2NvbF90ZXN0LmdvIGZhaWxzCisgICAgKiBbVEhSSUZULTI5MDZdIC0gbGlicmFyeSBub3QgZm91bmQgZm9yIC1sOmxpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAgICogW1RIUklGVC0yODkwXSAtIGJpbmFyeSBkYXRhIG1heSBsb3NlIGJ5dGVzIHdpdGggSlNPTiB0cmFuc3BvcnQgdW5kZXIgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcworICAgICogW1RIUklGVC0yODkxXSAtIGJpbmFyeSBkYXRhIG1heSBjYXVzZSBhIGZhaWx1cmUgd2l0aCBKU09OIHRyYW5zcG9ydCB1bmRlciBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzCisgICAgKiBbVEhSSUZULTI5MDFdIC0gRml4IGZvciBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBmdW5jdGlvbnMgKyBpbmRlbnRhdGlvbiBvZiBKYXZhU2NyaXB0IG1hcHMKKyAgICAqIFtUSFJJRlQtMjkxNl0gLSBtYWtlIGNoZWNrIGZhaWxzIGZvciBEIGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTI5MThdIC0gUmFjZSBjb25kaXRpb24gaW4gUHl0aG9uIFRQcm9jZXNzUG9vbFNlcnZlciB0ZXN0CisgICAgKiBbVEhSSUZULTI5MjBdIC0gRXJsYW5nIFRocmlmdCB0ZXN0IHVzZXMgd3JvbmcgSURMIGZpbGUKKyAgICAqIFtUSFJJRlQtMjkyMl0gLSAkVFJJQUwgaXMgdXNlZCB3aXRoIFB5dGhvbiB0ZXN0cyBidXQgbm90IHRlc3RlZCBhY2NvcmRpbmdseQorICAgICogW1RIUklGVC0yOTEyXSAtIEF1dG90b29sIGJ1aWxkIGZvciBDKysgUXQgbGlicmFyeSBpcyBpbnZhbGlkCisgICAgKiBbVEhSSUZULTI5MTRdIC0gZXhwbGljaXQgZGVwZW5kZW5jeSB0byBMdWE1LjIgZmFpbHMgb24gc29tZSBzeXN0ZW1zCisgICAgKiBbVEhSSUZULTI5MTBdIC0gbGliZXZlbnQgaXMgbm90IHJlYWxseSBvcHRpb25hbAorICAgICogW1RIUklGVC0yOTExXSAtIGZpeCBjKysgdmVyc2lvbiB6ZXJvbXEgdHJhbnNwb3J0LCB0aGUgb2xkIHZlcnNpb24gY2Fubm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMjkxNV0gLSBMdWEgZ2VuZXJhdG9yIG1pc3NpbmcgZnJvbSBWaXN1YWwgU3R1ZGlvIGJ1aWxkIHByb2plY3QKKyAgICAqIFtUSFJJRlQtMjkxN10gLSAibWFrZSBjbGVhbiIgYnJlYWtzIHRlc3QvY19nbGliCisgICAgKiBbVEhSSUZULTI5MTldIC0gSGF4ZSB0ZXN0IHNlcnZlciB0aW1lb3V0IHRvbyBsYXJnZQorICAgICogW1RIUklGVC0yOTIzXSAtIEphdmFTY3JpcHQgY2xpZW50IGFzc3VtZXMgYSBtZXNzYWdlIGJlaW5nIHdyaXR0ZW4KKyAgICAqIFtUSFJJRlQtMjkyNF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY3Jhc2hlcyB3aGVuIHVzZXItcHJvdmlkZWQgZXZlbnRfYmFzZSBpcyB1c2VkCisgICAgKiBbVEhSSUZULTI5MjVdIC0gQ01ha2UgYnVpbGQgZG9lcyBub3Qgd29yayB3aXRoIE9wZW5TU0wgbm9yIGFueXRoaW5nIGluc3RhbGxlZCBpbiBub24tc3lzdGVtIGxvY2F0aW9uCisgICAgKiBbVEhSSUZULTI5MzFdIC0gQWNjZXNzIHRvIHVuZGVjbGFyZWQgc3RhdGljIHByb3BlcnR5OiBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOjokVEJJTkFSWVBST1RPQ09MQUNDRUxFUkFURUQKKyAgICAqIFtUSFJJRlQtMjg5M10gLSBDTWFrZSBidWlsZCBmYWlscyB3aXRoIGJvb3N0IHRocmVhZCBvciBzdGQgdGhyZWFkCisgICAgKiBbVEhSSUZULTI5MDJdIC0gR2VuZXJhdGVkIGNfZ2xpYiBjb2RlIGRvZXMgbm90IGNvbXBpbGUgd2l0aCBjbGFuZworICAgICogW1RIUklGVC0yOTAzXSAtIFF0NCBsaWJyYXJ5IGJ1aWx0IHdpdGggQ01ha2UgZG9lcyBub3Qgd29yaworICAgICogW1RIUklGVC0yOTQyXSAtIENTaGFycCBnZW5lcmF0ZSBpbnZhbGlkIGNvZGUgZm9yIHByb3BlcnR5IG5hbWVkIHJlYWQgb3Igd3JpdGUKKyAgICAqIFtUSFJJRlQtMjkzMl0gLSBOb2RlLmpzIFRocmlmdCBjb25uZWN0aW9uIGxpYnJhcmllcyB0aHJvdyBFeGNlcHRpb25zIGludG8gZXZlbnQgZW1pdHRlcgorICAgICogW1RIUklGVC0yOTMzXSAtIHYwLjkuMjogZG91YmxlcyBlbmNvZGVkIGluIG5vZGUgd2l0aCBjb21wYWN0IHByb3RvY29sIGNhbm5vdCBiZSBkZWNvZGVkIGJ5IHB5dGhvbgorICAgICogW1RIUklGVC0yOTM0XSAtIGNyZWF0ZVNlcnZlciBzaWduYXR1cmUgbWlzbWF0Y2gKKyAgICAqIFtUSFJJRlQtMjk4MV0gLSBJREwgd2l0aCBubyBuYW1lc3BhY2UgcHJvZHVjZXMgdW5wYXJzYWJsZSBQSFAKKyAgICAqIFtUSFJJRlQtMjk5OV0gLSBBZGRpdGlvbiBvZiAuZ2l0YXR0cmlidXRlcyB0ZXh0IGF1dG8gaW4gVEhSSUZULTI3MjQgY2F1c2VzIG1vZGlmaWVkIGZpbGVzIG9uIGNoZWNrb3V0CisgICAgKiBbVEhSSUZULTI5NDldIC0gdHlwbyBpbiBjb21waWxlci9jcHAvUkVBRE1FLm1kCisgICAgKiBbVEhSSUZULTI5NTddIC0gd2FybmluZzogc291cmNlIGZpbGUgJXMgaXMgaW4gYSBzdWJkaXJlY3RvcnksIGJ1dCBvcHRpb24gJ3N1YmRpci1vYmplY3RzJyBpcyBkaXNhYmxlZAorICAgICogW1RIUklGVC0yOTUzXSAtIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgaXMgbm90IFN0b3AoKWFibGUKKyAgICAqIFtUSFJJRlQtMjk2Ml0gLSBEb2NrZXIgVGhyaWZ0IGVudiBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcKKyAgICAqIFtUSFJJRlQtMjk3MV0gLSBDKysgdGVzdCBhbmQgdHV0b3JpYWwgcGFyYWxsZWwgYnVpbGQgaXMgdW5zdGFibGUKKyAgICAqIFtUSFJJRlQtMjk3Ml0gLSBNaXNzaW5nIGJhY2tzbGFzaCBpbiBsaWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMjk1MV0gLSBGaXggRXJsYW5nIG5hbWUgY29uZmxpY3QgdGVzdAorICAgICogW1RIUklGVC0yOTU1XSAtIFVzaW5nIGxpc3Qgb2YgdHlwZWRlZnMgZG9lcyBub3QgY29tcGlsZSBvbiBHbworICAgICogW1RIUklGVC0yOTYwXSAtIG5hbWVzcGFjZSByZWdyZXNzaW9uIGZvciBSdWJ5CisgICAgKiBbVEhSSUZULTI5NTldIC0gbm9kZWpzOiBmaXggYmluYXJ5IHVuaXQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMjk2Nl0gLSBub2RlanM6IEZpeCBiYWQgcmVmZXJlbmNlcyB0byBUUHJvdG9jb2xFeGNlcHRpb24gYW5kIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUKKyAgICAqIFtUSFJJRlQtMjk3MF0gLSBncnVudC1qc2RvYyBmYWlscyBkdWUgdG8gZGVwZW5kZW5jeSBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMzAwMV0gLSBDIyBFcXVhbHMgZmFpbHMgZm9yIGJpbmFyeSBmaWVsZHMgKGJ5dGVbXSkKKyAgICAqIFtUSFJJRlQtMzAwM10gLSBNaXNzaW5nIExJQ0VOU0UgZmlsZSBwcmV2ZW50cyBwYWNrYWdlIGZyb20gYmVpbmcgaW5zdGFsbGVkCisgICAgKiBbVEhSSUZULTMwMDhdIC0gTm9kZS5qcyBzZXJ2ZXIgZG9lcyBub3QgZnVsbHkgc3VwcG9ydCBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzAwN10gLSBUcmF2aXMgYnVpbGQgaXMgYnJva2VuIGJlY2F1c2Ugb2YgZGlyZWN0b3J5IGNvbmZsaWN0CisgICAgKiBbVEhSSUZULTMwMDldIC0gVFNTTFNvY2tldCBkb2VzIG5vdCB1c2UgdGhlIGNvcnJlY3QgaG9zdG5hbWUgKGJyZWFrcyBjZXJ0aWZpY2F0ZSBjaGVja3MpCisgICAgKiBbVEhSSUZULTMwMTFdIC0gQyMgdGVzdCBzZXJ2ZXIgdGVzdEV4Y2VwdGlvbigpIG5vdCBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gc3BlY3MKKyAgICAqIFtUSFJJRlQtMzAxMl0gLSBUaW1pbmcgcHJvYmxlbXMgaW4gTmFtZWRQaXBlIGltcGxlbWVudGF0aW9uIGR1ZSB0byB1bm5lY2Vzc2FyeSBvcGVuL2Nsb3NlCisgICAgKiBbVEhSSUZULTMwMTldIC0gR29sYW5nIGdlbmVyYXRvciBtaXNzaW5nIGRvY3N0cmluZyBmb3Igc3RydWN0cworICAgICogW1RIUklGVC0zMDIxXSAtIFNlcnZpY2UgcmVtb3RlIHRvb2wgZG9lcyBub3QgaW1wb3J0IHN0dWIgcGFja2FnZSB3aXRoIHBhY2thZ2UgcHJlZml4CisgICAgKiBbVEhSSUZULTMwMjZdIC0gVE11bHRpcGxleGVkUHJvY2Vzc29yIGRvZXMgbm90IGhhdmUgYSBjb25zdHJ1Y3RvcgorICAgICogW1RIUklGVC0zMDI4XSAtIFJlZ3Jlc3Npb24gY2F1c2VkIGJ5IFRIUklGVC0yMTgwCisgICAgKiBbVEhSSUZULTMwMTddIC0gb3JkZXIgb2YgbWFwIGtleS92YWx1ZSB0eXBlcyBpbmNvcnJlY3QgZm9yIG9uZSBDVE9SCisgICAgKiBbVEhSSUZULTMwMjBdIC0gQ2Fubm90IGNvbXBpbGUgdGhyaWZ0IGFzIEMrKzAzCisgICAgKiBbVEhSSUZULTMwMjRdIC0gVXNlci1BZ2VudCAiQmF0dGxlTmV0IiB1c2VkIGluIHNvbWUgVGhyaWZ0IGxpYnJhcnkgZmlsZXMKKyAgICAqIFtUSFJJRlQtMzA0N10gLSBVbmV2ZW4gY2FsbHMgdG8gaW5kZW50X3VwIGFuZCBpbmRlbnRfZG93biBpbiBDb2NvYSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzA0OF0gLSBOb2RlSlMgZGVjb2Rpbmcgb2YgSTY0IGlzIGluY29uc2lzdGVudCBhY3Jvc3MgcHJvdG9jb2xzCisgICAgKiBbVEhSSUZULTMwNDNdIC0gZ28gY29tcGlsZXIgZ2VuZXJhdG9yIHVzZXMgbm9uIEMrKzk4IGNvZGUKKyAgICAqIFtUSFJJRlQtMzA0NF0gLSBEb2NrZXIgUkVBRE1FLm1kIHBhdGhzIHRvIERvY2tlcmZpbGVzIGFyZSBpbmNvcnJlY3QKKyAgICAqIFtUSFJJRlQtMzA0MF0gLSBib3dlci5qc29uIHdyb25nICJtYWluIiBwYXRoCisgICAgKiBbVEhSSUZULTMwNTFdIC0gR28gVGhyaWZ0IGdlbmVyYXRvciBjcmVhdGVzIGJhZCBnbyBjb2RlCisgICAgKiBbVEhSSUZULTMwNTddIC0gSmF2YSBjb21waWxlciBidWlsZCBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzA2MV0gLSBDKysgVFNTTFNvY2tldCBzaHV0ZG93biBkZWxheS92dWxuZXJhYmlsaXR5CisgICAgKiBbVEhSSUZULTMwNjJdIC0gQysrIFRTZXJ2ZXJTb2NrZXQgaW52YWxpZCBwb3J0IG51bWJlciAob3ZlciA5OTk5OTkpIGNhdXNlcyBzdGFjayBjb3JydXB0aW9uCisgICAgKiBbVEhSSUZULTMwNjVdIC0gVXBkYXRlIGxpYnRocmlmdCBkZXBlbmRlbmNpZXMgKHNsZjRqLCBodHRwY29yZSwgaHR0cGNsaWVudCkKKyAgICAqIFtUSFJJRlQtMzI0NF0gLSBUeXBlU2NyaXB0OiBmaXggbmFtZXNwYWNlIG9mIGluY2x1ZGVkIHR5cGVzCisgICAgKiBbVEhSSUZULTMyNDZdIC0gUmVkdWNlIHRoZSBudW1iZXIgb2YgdHJpdmlhbCB3YXJuaW5ncyBpbiBXaW5kb3dzIEMrKyBDTWFrZSBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzIyNF0gLSBGaXggVE5hbWVkUGlwZVNlcnZlciB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIG9uIGFjY2VwdAorICAgICogW1RIUklGVC0zMjMwXSAtIFB5dGhvbiBjb21waWxlciBnZW5lcmF0ZXMgd3JvbmcgY29kZSBpZiB0aGVyZSBpcyBmdW5jdGlvbiB0aHJvd2luZyBhIHR5cGVkZWYgb2YgZXhjZXB0aW9uIHdpdGggYW5vdGhlciBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMzIzNl0gLSBNYXhTa2lwRGVwdGggbmV2ZXIgY2hlY2tlZAorICAgICogW1RIUklGVC0zMjM5XSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAorICAgICogW1RIUklGVC0zMjQxXSAtIGZhdGFsIGVycm9yOiBydW50aW1lOiBjYW5ub3QgbWFwIHBhZ2VzIGluIGFyZW5hIGFkZHJlc3Mgc3BhY2UKKyAgICAqIFtUSFJJRlQtMzI0Ml0gLSBPU0dpIEltcG9ydC1QYWNrYWdlIGRpcmVjdGl2ZSBpcyBtaXNzaW5nIHRoZSBBcGFjaGUgSFRUUCBwYWNrYWdlcworICAgICogW1RIUklGVC0zMjM0XSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAorICAgICogW1RIUklGVC0zMjIyXSAtIFR5cGVTY3JpcHQ6IEdlbmVyYXRlZCBFbnVtcyBhcmUgcXVvdGVkCisgICAgKiBbVEhSSUZULTMyMjldIC0gdW5leHBlY3RlZCBUaW1lb3V0IGV4Y2VwdGlvbiB3aGVuIGRlc2lyZWQgYnl0ZXMgYXJlIG9ubHkgcGFydGlhbGx5IGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zMjMxXSAtIENQUDogTGltaXQgcmVjdXJzaW9uIGRlcHRoIHRvIDY0CisgICAgKiBbVEhSSUZULTMyMzVdIC0gTGltaXQgcmVjdXJzaW9uIGRlcHRoCisgICAgKiBbVEhSSUZULTMxNzVdIC0gZmFzdGJpbmFyeS5jIHB5dGhvbiBkZXNlcmlhbGl6ZSBjYW4gY2F1c2UgaHVnZSBhbGxvY2F0aW9ucyBmcm9tIGdhcmJhZ2UKKyAgICAqIFtUSFJJRlQtMzE3Nl0gLSBVbmlvbiBpbmNvcnJlY3RseSBpbXBsZW1lbnRzID09CisgICAgKiBbVEhSSUZULTMxNzddIC0gRmFpbHMgdG8gcnVuIHJha2UgdGVzdAorICAgICogW1RIUklGVC0zMTgwXSAtIGx1YSBwbHVnaW46IGZyYW1lZCB0cmFuc3BvcnQgZG8gbm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMzE3OV0gLSBsdWEgcGx1Z2luIGNhbnQgY29ubmVjdCB0byByZW1vdGUgc2VydmVyIGJlY2F1c2UgZnVuY3Rpb24gbF9zb2NrZXRfY3JlYXRlX2FuZF9jb25uZWN0IGFsd2F5cyBiaW5kIHNvY2tldCB0byBsb2NhbGhvc3QKKyAgICAqIFtUSFJJRlQtMzI0OF0gLSBUeXBlU2NyaXB0OiBhZGRpdGlvbmFsIGNvbW1hIGluIG1ldGhvZCBzaWduYXR1cmUgd2l0aG91dCBwYXJhbWV0ZXJzCisgICAgKiBbVEhSSUZULTMzMDJdIC0gR28gSlNPTiBwcm90b2NvbCBzaG91bGQgZW5jb2RlIFRocmlmdCBieXRlIHR5cGUgYXMgc2lnbmVkIGludGVnZXIgc3RyaW5nCisgICAgKiBbVEhSSUZULTMyOTddIC0gY19nbGliOiBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGlzIG5vdCBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMzI5NF0gLSBUWmxpYlRyYW5zcG9ydCBmb3IgSmF2YSBkb2VzIG5vdCB3cml0ZSBkYXRhIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zMjk2XSAtIEdvIGNyb3NzIHRlc3QgZG9lcyBub3QgY29uZm9ybSB0byBzcGVjCisgICAgKiBbVEhSSUZULTMyOTVdIC0gQyMgbGlicmFyeSBkb2VzIG5vdCBidWlsZCBvbiBNb25vIDQuMC4yLjUgb3IgbGF0ZXIKKyAgICAqIFtUSFJJRlQtMzI5M10gLSBKYXZhU2NyaXB0OiBudWxsIHZhbHVlcyB0dXJuIGludG8gZW1wdHkgc3RydWN0cyBpbiBjb25zdHJ1Y3RvcgorICAgICogW1RIUklGVC0zMzEwXSAtIGxpYi9lcmwvUkVBRE1FLm1kIGhhcyBpbmNvcnJlY3QgZm9ybWF0dGluZworICAgICogW1RIUklGVC0zMzE5XSAtIENTaGFycCB0dXRvcmlhbCB3aWxsIG5vdCBidWlsZCB1c2luZyB0aGUgKi5zbG4KKyAgICAqIFtUSFJJRlQtMzMzNV0gLSBSdWJ5IHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcHJvY2Vzc29yIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zMzM4XSAtIFN0cmF5IHVuZGVyc2NvcmUgaW4gZ2VuZXJhdGVkIGdvIHdoZW4gc2VydmljZSBuYW1lIHN0YXJ0cyB3aXRoICJOZXciCisgICAgKiBbVEhSSUZULTMzMjRdIC0gVXBkYXRlIEdvIERvY3MgZm9yIHB1bGxpbmcgYWxsIHBhY2thZ2VzCisgICAgKiBbVEhSSUZULTMzNDVdIC0gQ2xpZW50cyBibG9ja2VkIGluZGVmaW5pdGVseSB3aGVuIGEgamF2YS5sYW5nLkVycm9yIGlzIHRocm93bgorICAgICogW1RIUklGVC0zMzMyXSAtIG1ha2UgZGlzdCBmYWlscyBvbiBjbGVhbiBidWlsZAorICAgICogW1RIUklGVC0zMzI2XSAtIFRlc3RzIGRvIG5vdCBjb21waWxlIHVuZGVyICpCU0QKKyAgICAqIFtUSFJJRlQtMzMzNF0gLSBNYXJrZG93biBub3RhdGlvbiBvZiBwcm90b2NvbCBzcGVjIGlzIG1hbGZvcm1lZAorICAgICogW1RIUklGVC0zMzMxXSAtIHdhcm5pbmc6IMOi4oKsy5xldHlwZcOi4oKs4oSiIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorICAgICogW1RIUklGVC0zMzQ5XSAtIFB5dGhvbiBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHByb2Nlc3NvciBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzM0M10gLSBGaXggaGFza2VsbCBSRUFETUUKKyAgICAqIFtUSFJJRlQtMzM0MF0gLSBQeXRob246IGVuYWJsZSBqc29uIHRlc3RzIGFnYWluCisgICAgKiBbVEhSSUZULTMzMTFdIC0gVG9wIGxldmVsIFJFQURNRS5tZCBoYXMgaW5jb3JyZWN0IGZvcm1tYXRpbmcKKyAgICAqIFtUSFJJRlQtMjkzNl0gLSBNaW5vciBtZW1vcnkgbGVhayBpbiBTU0wKKyAgICAqIFtUSFJJRlQtMzI5MF0gLSBVc2luZyBmcm9tIGluIHZhcmlhYmxlIG5hbWVzIGNhdXNlcyB0aGUgZ2VuZXJhdGVkIFB5dGhvbiBjb2RlIHRvIGhhdmUgZXJyb3JzCisgICAgKiBbVEhSSUZULTMyMjVdIC0gRml4IFRQaXBlU2VydmVyIHVucHJlZGljdGFibGUgYmVoYXZpb3Igb24gaW50ZXJydXB0KCkKKyAgICAqIFtUSFJJRlQtMzM1NF0gLSBGaXggd29yZC1leHRyYWN0aW9uIHN1YnN0ciBidWcgaW4gaW5pdGlhbGlzbSBjb2RlCisgICAgKiBbVEhSSUZULTIwMDZdIC0gVEJpbmFyeVByb3RvY29sIG1lc3NhZ2UgaGVhZGVyIGNhbGwgbmFtZSBsZW5ndGggaXMgbm90IHZhbGlkYXRlZCBhbmQgY2FuIGJlIHVzZWQgdG8gY29yZSB0aGUgc2VydmVyCisgICAgKiBbVEhSSUZULTMzMjldIC0gQysrIGxpYnJhcnkgdW5pdCB0ZXN0cyBkb24ndCBjb21waWxlIGFnYWluc3QgdGhlIG5ldyBib29zdC0xLjU5IHVuaXQgdGVzdCBmcmFtZXdvcmsKKyAgICAqIFtUSFJJRlQtMjYzMF0gLSB3aW5kb3dzNyA2NGJpdCBwYy4gaXB2NCBhbmQgaXB2NiBwYy5jYW4ndCB1c2UKKyAgICAqIFtUSFJJRlQtMzMzNl0gLSBUaHJpZnQgZ2VuZXJhdGVkIHN0cmVhbWluZyBvcGVyYXRvcnMgYWRkZWQgaW4gMC45LjIgY2Fubm90IGJlIG92ZXJyaWRkZW4KKyAgICAqIFtUSFJJRlQtMjY4MV0gLSBDb3JlIG9mIHVud2luZF9jbGVhbnVwCisgICAgKiBbVEhSSUZULTMzMTddIC0gY3BwIG5hbWVzcGFjZSBvcmcuYXBhY2hlIGlzc3VlIGFwcGVhcnMgaW4gMC45CisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzI4Nl0gLSBBcGFjaGUgQW50IGlzIGEgbmVjZXNzYXJ5IGRlcGVuZGVuY3kKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMjI3XSAtIEJ5dGVbXSBpbiBjb2xsZWN0aW9ucyBhcmVuJ3QgcHJldHR5IHByaW50ZWQgbGlrZSByZWd1bGFyIGJpbmFyeSBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjc0NF0gLSBWYWdyYW50ZmlsZSBmb3IgQ2VudG9zIDYuNQorICAgICogW1RIUklGVC0yNjQ0XSAtIEhheGUgc3VwcG9ydAorICAgICogW1RIUklGVC0yNzU2XSAtIHJlZ2lzdGVyIE1lZGlhIFR5cGUgQCBJQU5BCisgICAgKiBbVEhSSUZULTMwNzZdIC0gQ29tcGF0aWJpbGl0eSB3aXRoIEhheGUgMy4yLjAKKyAgICAqIFtUSFJJRlQtMzA4MV0gLSBDKysgQ29uc29saWRhdGUgY2xpZW50IHByb2Nlc3NpbmcgbG9vcHMgaW4gVFNlcnZlcnMKKyAgICAqIFtUSFJJRlQtMzA4M10gLSBDKysgQ29uc29saWRhdGUgc2VydmVyIHByb2Nlc3NpbmcgbG9vcHMgaW4gVFNpbXBsZVNlcnZlciwgVFRocmVhZGVkU2VydmVyLCBUVGhyZWFkUG9vbFNlcnZlcgorICAgICogW1RIUklGVC0zMDg0XSAtIEMrKyBhZGQgY29uY3VycmVudCBjbGllbnQgbGltaXQgdG8gdGhyZWFkZWQgc2VydmVycworICAgICogW1RIUklGVC0zMDc0XSAtICAgICBBZGQgY29tcGlsZXIvY3BwL2xleC55eXRocmlmdGwuY2MgdG8gZ2l0aWdub3JlLgorICAgICogW1RIUklGVC0zMTM0XSAtIFJlbW92ZSB1c2Ugb2YgZGVwcmVjYXRlZCAicGhhbnRvbS5hcmdzIgorICAgICogW1RIUklGVC0zMTMzXSAtIEFsbG93ICJtYWtlIGNyb3NzIiBhbmQgIm1ha2UgcHJlY3Jvc3MiIHRvIHJ1biB3aXRob3V0IGJ1aWxkaW5nIGFsbCBsYW5ndWFnZXMKKyAgICAqIFtUSFJJRlQtMzE0Ml0gLSBNYWtlIEphdmFTY3JpcHQgdXNlIGRvd25sb2FkZWQgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTMxNDFdIC0gSW1wcm92ZSBsb2dnaW5nIG9mIEphdmFTY3JpcHQgdGVzdAorICAgICogW1RIUklGVC0zMTQ0XSAtIFByb3Bvc2FsOiBtYWtlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlbnVtcyBpbiBnZW5lcmF0ZWQgZ28gY29kZSBsZXNzIHZlcmJvc2UKKyAgICAqIFtUSFJJRlQtMzEzMF0gLSBSZW1vdmUgdGhlIGxhc3QgdmVzdGlnZXMgb2YgVEhSSUZUX09WRVJMT0FEX0lGIGZyb20gVEhSSUZULTEzMTYKKyAgICAqIFtUSFJJRlQtMzEzMV0gLSBDb25zb2xpZGF0ZSBzdWdnZXN0ZWQgaW1wb3J0IHBhdGggZm9yIGdvIHRocmlmdCBsaWJyYXJ5IHRvIGdpdC5hcGFjaGUub3JnIGluIGRvY3MgYW5kIGNvZGUKKyAgICAqIFtUSFJJRlQtMzA5Ml0gLSBHZW5lcmF0ZWQgSGFza2VsbCB0eXBlcyBzaG91bGQgZGVyaXZlIEdlbmVyaWMKKyAgICAqIFtUSFJJRlQtMzExMF0gLSAgUHJpbnQgZXJyb3IgbG9nIGFmdGVyIGNyb3NzIHRlc3QgZmFpbHVyZXMgb24gVHJhdmlzCisgICAgKiBbVEhSSUZULTMxMTRdIC0gVXNpbmcgbG9jYWwgdGVtcCB2YXJpYWJsZXMgdG8gbm90IHBvbGx1dGUgdGhlIGdsb2JhbCB0YWJsZQorICAgICogW1RIUklGVC0zMTA2XSAtIENNYWtlIHN1bW1hcnkgc2hvdWxkIGdpdmUgbW9yZSBpbmZvcm1hdGlvbiB3aHkgYSBsaWJyYXJ5IGlzIHNldCB0byBvZmYKKyAgICAqIFtUSFJJRlQtMzExOV0gLSBKYXZhJ3MgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgaGFzIGluZGlzdGluZ3Vpc2hhYmxlIGxvZyBtZXNzYWdlcyBpbiBydW4oKQorICAgICogW1RIUklGVC0zMTIyXSAtIEphdmFzY3JpcHQgc3RydWN0IGNvbnN0cnVjdG9yIHNob3VsZCBwcm9wZXJseSBpbml0aWFsaXplIHN0cnVjdCBhbmQgY29udGFpbmVyIG1lbWJlcnMgZnJvbSBwbGFpbiBqcyBhcmd1bWVudHMKKyAgICAqIFtUSFJJRlQtMzE1MV0gLSBGaXggbGlua3MgdG8gZ2l0LXdpcCogLSBzaG91bGQgYmUgZ2l0LmFwYWNoZS5vcmcKKyAgICAqIFtUSFJJRlQtMzE2N10gLSBXaW5kb3dzIGJ1aWxkIGZyb20gc291cmNlIGluc3RydWN0aW9ucyBuZWVkIHRvIGJlIHJldmlzZWQKKyAgICAqIFtUSFJJRlQtMzE1NV0gLSBtb3ZlIGNvbnRyaWIvbWluZ3czMi10b29sY2hhaW4uY21ha2UgdG8gYnVpbGQvY21ha2UvCisgICAgKiBbVEhSSUZULTMxNjBdIC0gTWFrZSBnZW5lcmF0ZWQgZ28gZW51bXMgaW1wbGVtZW50IFRleHRNYXJzaGFsbGVyIGFuZCBUZXh0VW5tYXJzaGFsbGVyIGludGVyZmFjZXMKKyAgICAqIFtUSFJJRlQtMzE1MF0gLSBBZGQgYW4gb3B0aW9uIHRvIHRocmlmdCBnbyBnZW5lcmF0b3IgdG8gbWFrZSBSZWFkIGFuZCBXcml0ZSBtZXRob2RzIHByaXZhdGUKKyAgICAqIFtUSFJJRlQtMzE0OV0gLSBNYWtlIFJlYWRGaWVsZE4gbWV0aG9kcyBpbiBnZW5lcmF0ZWQgR28gY29kZSBwcml2YXRlCisgICAgKiBbVEhSSUZULTMxNzJdIC0gQWRkIHR1dG9yaWFsIHRvIFRocmlmdCB3ZWIgc2l0ZQorICAgICogW1RIUklGVC0zMjE0XSAtIEFkZCBFcmxhbmcgb3B0aW9uIGZvciB1c2luZyBtYXBzIGluc3RlYWQgb2YgZGljdHMKKyAgICAqIFtUSFJJRlQtMzIwMV0gLSBDYXB0dXJlIGdpdGh1YiB0ZXN0IGFydGlmYWN0cyBmb3IgZmFpbGVkIGJ1aWxkcworICAgICogW1RIUklGVC0zMjY2XSAtIGNfZ2xpYjogTXVsdGlwbGUgY29tcGlsZXIgd2FybmluZ3MgYnVpbGRpbmcgdW5pdCB0ZXN0cworICAgICogW1RIUklGVC0zMjg1XSAtIGNfZ2xpYjogQnVpbGQgbGlicmFyeSB3aXRoIGFsbCB3YXJuaW5ncyBlbmFibGVkLCBubyB3YXJuaW5ncyBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMTk1NF0gLSBBbGxvdyBmb3IgYSBzZXBhcmF0ZSBjb25uZWN0aW9uIHRpbWVvdXQgdmFsdWUgCisgICAgKiBbVEhSSUZULTIwOThdIC0gQWRkIHN1cHBvcnQgZm9yIFF0NSsKKyAgICAqIFtUSFJJRlQtMjE5OV0gLSBSZW1vdmUgRGVuc2UgcHJvdG9jb2wgKHdhczogbW92ZSB0byBDb250cmliKQorICAgICogW1RIUklGVC00MDZdIC0gQysrIFRlc3Qgc3VpdGUgY2xlYW51cAorICAgICogW1RIUklGVC05MDJdIC0gc29ja2V0IGFuZCBjb25uZWN0IHRpbWVvdXQgaW4gVFNvY2tldCBzaG91bGQgYmUgZGlzdGluZ3Vpc2hlZAorICAgICogW1RIUklGVC0zODhdIC0gVXNlIGEgc2VwYXJhdGUgd2lyZSBmb3JtYXQgZm9yIGFzeW5jIGNhbGxzCisgICAgKiBbVEhSSUZULTcyN10gLSBzdXBwb3J0IG5hdGl2ZSBDKysgbGFuZ3VhZ2Ugc3BlY2lmaWMgZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMTc4NF0gLSBwZXAtMzExMCBjb21wbGlhbmNlIGZvciBleGNlcHRpb24gaGFuZGxpbmcgCisgICAgKiBbVEhSSUZULTEwMjVdIC0gQysrIFNlcnZlclNvY2tldCBzaG91bGQgaW5oZXJpdCBmcm9tIFNvY2tldCB3aXRoIHRoZSBuZWNlc3NhcnkgQ3RvciB0byBsaXN0ZW4gb24gY29ubmVjdGlvbnMgZnJvbSBhIHNwZWNpZmljIGhvc3QKKyAgICAqIFtUSFJJRlQtMjI2OV0gLSBDYW4gZGVwbG95IGxpYnRocmlmdC1zb3VyY2UuamFyIHRvIG1hdmVuIGNlbnRlciByZXBvc2l0b3J5CisgICAgKiBbVEhSSUZULTI4MDRdIC0gUHVsbCBhbiBpbnRlcmZhY2Ugb3V0IG9mIFRCYXNlQXN5bmNQcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtMjgwNl0gLSBtb3JlIHdoaXRlc3BhY2UgZml4dXBzCisgICAgKiBbVEhSSUZULTI4MTFdIC0gTWFrZSByZW1vdGUgc29ja2V0IGFkZHJlc3MgYWNjZXNzaWJsZQorICAgICogW1RIUklGVC0yODA5XSAtIC5naXRpZ25vcmUgdXBkYXRlIGZvciBjb21waWxlcidzIHZpc3VhbCBwcm9qZWN0CisgICAgKiBbVEhSSUZULTI4NDZdIC0gRXhwb3NlIGNpcGhlcnMgcGFyYW1ldGVyIGZyb20gc3NsLndyYXBfc29ja2V0KCkKKyAgICAqIFtUSFJJRlQtMjg1OV0gLSBKU09OIGdlbmVyYXRvcjogb3V0cHV0IGNvbXBsZXRlIGRlc2NyaXB0b3JzCisgICAgKiBbVEhSSUZULTI4NjFdIC0gYWRkIGJ1ZmZlcmVkIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yODY1XSAtIFRlc3QgY2FzZSBmb3IgR286IFNlcUlkIG91dCBvZiBzZXF1ZW5jZQorICAgICogW1RIUklGVC0yODY2XSAtIEdvIGdlbmVyYXRvciBzb3VyY2UgY29kZSBpcyBoYXJkIHRvIHJlYWQgYW5kIG1haW50YWluCisgICAgKiBbVEhSSUZULTI4ODBdIC0gUmVhZCB0aGUgbmV0d29yayBhZGRyZXNzIGZyb20gdGhlIGxpc3RlbmVyIGlmIGF2YWlsYWJsZS4KKyAgICAqIFtUSFJJRlQtMjg3NV0gLSBUeXBvIGluIFREZW5zZVByb3RvY29sLmggY29tbWVudAorICAgICogW1RIUklGVC0yODc0XSAtIFRCaW5hcnlQcm90b2NvbCAgbWVtYmVyIHZhcmlhYmxlICJzdHJpbmdfYnVmXyIgaXMgbmV2ZXIgdXNlZC4KKyAgICAqIFtUSFJJRlQtMjg1NV0gLSBNb3ZlIGNvbnRyaWJ1dGluZy5tZCB0byB0aGUgcm9vdCBvZiB0aGUgcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0yODYyXSAtIEVuYWJsZSBSVFRJIGFuZC9vciBidWlsZCBtYWNyb3MgZm9yIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTI4NzZdIC0gIEFkZCB0ZXN0IGZvciBUSFJJRlQtMjUyNiBBc3NpZ25tZW50IG9wZXJhdG9ycyBhbmQgY29weSBjb25zdHJ1Y3RvcnMgaW4gYysrIGRvbid0IGNvcHkgdGhlIF9faXNzZXQgc3RydWN0CisgICAgKiBbVEhSSUZULTI4OTddIC0gR2VuZXJhdGUgLWlzRXF1YWw6IGFuZCAtaGFzaCBtZXRob2RzCisgICAgKiBbVEhSSUZULTI5MDldIC0gSW1wcm92ZSB0cmF2aXMgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjkyMV0gLSBNYWtlIEVybGFuZyBpbXBsIHJlYWR5IGZvciBPVFAgMTggcmVsZWFzZSAoZGljdC8wIGFuZCBzZXQvMCBhcmUgZGVwcmVjYXRlZCkKKyAgICAqIFtUSFJJRlQtMjkyOF0gLSBSZW5hbWUgdGhlIGVybGFuZyB0ZXN0X3NlcnZlciBtb2R1bGUKKyAgICAqIFtUSFJJRlQtMjk0MF0gLSBBbGxvdyBpbnN0YWxsaW5nIFRocmlmdCBmcm9tIGdpdCBhcyBOUE0gbW9kdWxlIGJ5IHByb3ZpZGluZyBwYWNrYWdlLmpzb24gaW4gdG9wIGxldmVsIGRpcmVjdG9yeQorICAgICogW1RIUklGVC0yOTM3XSAtIEFsbG93IHNldHRpbmcgYSBtYXhpbXVtIGZyYW1lIHNpemUgaW4gVEZyYW1lZFRyYW5zcG9ydAorICAgICogW1RIUklGVC0yOTc2XSAtIG5vZGVqczogeGhyIGFuZCB3ZWJzb2NrZXQgc3VwcG9ydCBmb3IgYnJvd3NlcmlmeQorICAgICogW1RIUklGVC0yOTk2XSAtIFRlc3QgZm9yIEhheGUgMy4xLjMgb3IgYmV0dGVyIAorICAgICogW1RIUklGVC0yOTY5XSAtIG5vZGVqczogRFJZIHVwIGxpYnJhcnkgdGVzdHMKKyAgICAqIFtUSFJJRlQtMjk3M10gLSBVcGRhdGUgSGF4ZSBsaWIgcmVhZG1lIHJlZ2FyZGluZyBIYXhlIDMuMS4zCisgICAgKiBbVEhSSUZULTI5NTJdIC0gSW1wcm92ZSBoYW5kbGluZyBvZiBTZXJ2ZXIuU3RvcCgpIAorICAgICogW1RIUklGVC0yOTY0XSAtIG5vZGVqczogbW92ZSBwcm90b2NvbHMgYW5kIHRyYW5zcG9ydHMgaW50byBzZXBhcmF0ZSBmaWxlcworICAgICogW1RIUklGVC0yOTYzXSAtIG5vZGVqcyAtIGFkZCB0ZXN0IGNvdmVyYWdlCisgICAgKiBbVEhSSUZULTMwMDZdIC0gQXR0YWNoICdvbWl0ZW1wdHknIGpzb24gdGFnIGZvciBvcHRpb25hbCBmaWVsZHMgaW4gR28KKyAgICAqIFtUSFJJRlQtMzAyN10gLSBHbyBjb21waWxlciBkb2VzIG5vdCBlbnN1cmUgY29tbW9uIGluaXRpYWxpc21zIGhhdmUgY29uc2lzdGVudCBjYXNlCisgICAgKiBbVEhSSUZULTMwMzBdIC0gVFRocmVhZGVkU2VydmVyOiBQcm9wZXJ0eSBmb3IgbnVtYmVyIG9mIGNsaWVudFRocmVhZHMKKyAgICAqIFtUSFJJRlQtMzAyM10gLSBHbyBjb21waWxlciBpcyBhIGxpdHRsZSBvdmVybHkgY29uc2VydmF0aXZlIHdpdGggbmFtZXMgb2YgYXR0cmlidXRlcworICAgICogW1RIUklGVC0zMDE4XSAtIENvbXBhY3QgcHJvdG9jb2wgZm9yIERlbHBoaQorICAgICogW1RIUklGVC0zMDI1XSAtIENoYW5nZSBwdXJlIEludCBjb25zdGFudHMgaW50byBAZW51bXMgKHdoZXJlIHBvc3NpYmxlKQorICAgICogW1RIUklGVC0zMDMxXSAtIG1pZ3JhdGUgInNob3VsZFN0b3AiIGZsYWcgdG8gVFNlcnZlcgorICAgICogW1RIUklGVC0zMDIyXSAtIENvbXBhY3QgcHJvdG9jb2wgZm9yIEhheGUKKyAgICAqIFtUSFJJRlQtMzA0MV0gLSBHZW5lcmF0ZSBhc3luY2hyb25vdXMgY2xpZW50cyBmb3IgQ29jb2EKKyAgICAqIFtUSFJJRlQtMzA1M10gLSBQZXJsIFNTTCBTb2NrZXQgU3VwcG9ydCAoRW5jcnlwdGlvbikKKyAgICAqIFtUSFJJRlQtMzI0N10gLSBHZW5lcmF0ZSBhIEMrKyB0aHJlYWQtc2FmZSBjbGllbnQKKyAgICAqIFtUSFJJRlQtMzIxN10gLSBQcm92aWRlIGEgbGl0dGxlIGVuZGlhbiB2YXJpYW50IG9mIHRoZSBiaW5hcnkgcHJvdG9jb2wgaW4gQysrCisgICAgKiBbVEhSSUZULTMyMjNdIC0gVHlwZVNjcmlwdDogQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgRW51bSBNYXBzCisgICAgKiBbVEhSSUZULTMyMjBdIC0gT3B0aW9uIHRvIHN1cHByZXNzIEBHZW5lcmF0ZWQgQW5ub3RhdGlvbiBlbnRpcmVseQorICAgICogW1RIUklGVC0zMzAwXSAtIFJlaW1wbGVtZW50IFRabGliVHJhbnNwb3J0IGluIEphdmEgdXNpbmcgc3RyZWFtcworICAgICogW1RIUklGVC0zMjg4XSAtIGNfZ2xpYjogQnVpbGQgdW5pdCB0ZXN0cyB3aXRoIGFsbCB3YXJuaW5ncyBlbmFibGVkLCBubyB3YXJuaW5ncyBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMzM0N10gLSBJbXByb3ZlIGNyb3NzIHRlc3Qgc2VydmVycyBhbmQgY2xpZW50cworICAgICogW1RIUklGVC0zMzQyXSAtIEltcHJvdmUgcnVieSBjcm9zcyB0ZXN0IGNsaWVudCBhbmQgc2VydmVyIGNvbXBhdGliaWxpdHkKKyAgICAqIFtUSFJJRlQtMjI5Nl0gLSBBZGQgQysrIEJhc2UgY2xhc3MgZm9yIHNlcnZpY2UKKyAgICAqIFtUSFJJRlQtMzMzN10gLSBBZGQgdGVzdEJvb2wgbWV0aG9kIHRvIGNyb3NzIHRlc3RzCisgICAgKiBbVEhSSUZULTMzMDNdIC0gRGlzYWJsZSBjb25jdXJyZW50IGNhYmFsIGpvYnMgb24gVHJhdmlzIHRvIGF2b2lkIEdIQyBjcmFzaAorICAgICogW1RIUklGVC0yNjIzXSAtIERvY2tlciBjb250YWluZXIgZm9yIFRocmlmdAorICAgICogW1RIUklGVC0zMjk4XSAtIHRocmlmdCBlbmRpYW4gY29udmVydGVycyBtYXkgY29uZmxpY3Qgd2l0aCBvdGhlciBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMTU1OV0gLSBQcm92aWRlIG1lbW9yeSBwb29sIGZvciBUQmluYXJ5UHJvdG9jb2wgdG8gZWxpbWluYXRlIG1lbW9yeSBmcmFnbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTQyNF0gLSBTdGVhbCBQcm90b2NvbEJ1ZmZlcnMnIFZhckludCBpbXBsZW1lbnRhdGlvbiBmb3IgQysrCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTMwNzBdIC0gQWRkIGFiaWxpdHkgdG8gc2V0IHRoZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sKKyAgICAqIFtUSFJJRlQtMTkwOV0gLSBKYXZhOiBBZGQgY29tcGlsZXIgZmxhZyB0byB1c2UgdGhlICJvcHRpb24gcGF0dGVybiIgZm9yIG9wdGlvbmFsIGZpZWxkcworICAgICogW1RIUklGVC0yMDk5XSAtIFN0b3AgVFRocmVhZFBvb2xTZXJ2ZXIgd2l0aCBhbGl2ZSBjb25uZWN0aW9ucy4KKyAgICAqIFtUSFJJRlQtMTIzXSAtIGltcGxlbWVudCBUWmxpYlRyYW5zcG9ydCBpbiBKYXZhCisgICAgKiBbVEhSSUZULTIzNjhdIC0gTmV3IG9wdGlvbjogcmV1c2Utb2JqZWN0cyBmb3IgSmF2YSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMjgzNl0gLSBPcHRpb25hbGx5IGdlbmVyYXRlIEMrKzExIE1vdmVDb25zdHJ1Y3RpYmxlIHR5cGVzCisgICAgKiBbVEhSSUZULTI4MjRdIC0gRmxhZyB0byBkaXNhYmxlIGh0bWwgZXNjYXBpbmcgZG9jdGV4dAorICAgICogW1RIUklGVC0yODE5XSAtIEFkZCBXZWJzU29ja2V0IGNsaWVudCB0byBub2RlLmpzCisgICAgKiBbVEhSSUZULTMwNTBdIC0gQ2xpZW50IGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIGZvciBub24taHR0cCBUTFMgaW4gQyMKKyAgICAqIFtUSFJJRlQtMzI5Ml0gLSBJbXBsZW1lbnQgVFpsaWJUcmFuc3BvcnQgaW4gR28KKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMjU4M10gLSBUaHJpZnQgb24geFBDIHRhcmdldCAoU3BlZWRHb2F0KQorICAgICogW1RIUklGVC0yNTkyXSAtIHRocmlmdCBzZXJ2ZXIgdXNpbmcgY19nbGliCisgICAgKiBbVEhSSUZULTI4MzJdIC0gY19nbGliOiBIYW5kbGUgc3RyaW5nIGxpc3RzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zMTM2XSAtIHRocmlmdCBpbnN0YWxsYXRpb24gcHJvYmxlbSBvbiBtYWMKKyAgICAqIFtUSFJJRlQtMzM0Nl0gLSBjX2dsaWI6IFR1dG9yaWFscyBleGFtcGxlIGNyYXNoZXMgc2F5aW5nIENhbGN1bGF0b3IucGluZyBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBGQUxTRSBidXQgZGlkIG5vdCBzZXQgYW4gZXJyb3IKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMjU3OF0gLSBNb3ZpbmcgJ21ha2UgY3Jvc3MnIGZyb20gdGVzdC5zaCB0byB0ZXN0LnB5CisgICAgKiBbVEhSSUZULTI3MzRdIC0gR28gY29kaW5nIHN0YW5kYXJkcworICAgICogW1RIUklGVC0yNzQ4XSAtIEFkZCBWYWdyYW50ZmlsZSBmb3IgQ2VudG9zIDYuNQorICAgICogW1RIUklGVC0yNzUzXSAtIE1pc2MuIEhheGUgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTI2NDBdIC0gQ29tcGFjdCBQcm90b2NvbCBpbiBDb2NvYQorICAgICogW1RIUklGVC0zMjYyXSAtIHdhcm5pbmc6IG92ZXJmbG93IGluIGltcGxpY2l0IGNvbnN0YW50IGNvbnZlcnNpb24gaW4gRGVuc2VQcm90b1Rlc3QuY3BwCisgICAgKiBbVEhSSUZULTMxOTRdIC0gQ2FuJ3QgYnVpbGQgd2l0aCBnbyBlbmFibGVkLiAgZ29tb2NrIFNDQyBwYXRoIGluY29ycmVjdC4KKyAgICAqIFtUSFJJRlQtMzI3NV0gLSBjX2dsaWIgdHV0b3JpYWwgd2FybmluZ3MgaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMTEyNV0gLSBNdWx0aXBsZXhpbmcgc3VwcG9ydCBmb3IgdGhlIFJ1YnkgTGlicmFyeQorICAgICogW1RIUklGVC0yODA3XSAtIFBIUCBDb2RlIFN0eWxlCisgICAgKiBbVEhSSUZULTI4NDFdIC0gQWRkIGNvbXByZWhlbnNpdmUgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSB3aG9sZSBHbyBzdGFjaworICAgICogW1RIUklGVC0yODE1XSAtIEhheGU6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTI4ODZdIC0gSW50ZWdyYXRlIGJpbmFyeSB0eXBlIGluIHN0YW5kYXJkIFRocmlmdCBjcm9zcyB0ZXN0CisgICAgKiBbVEhSSUZULTI5NDZdIC0gRW5oYW5jZSB1c2FiaWxpdHkgb2YgY3Jvc3MgdGVzdCBmcmFtZXdvcmsKKyAgICAqIFtUSFJJRlQtMjk2N10gLSBBZGQgLmVkaXRvcmNvbmZpZyB0byByb290CisgICAgKiBbVEhSSUZULTMwMzNdIC0gUGVybDogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzE3NF0gLSBJbml0aWFsaXNtIGNvZGUgaW4gdGhlIEdvIGNvbXBpbGVyIGRvZXNuJ3QgY2hlY2sgZmlyc3Qgd29yZAorICAgICogW1RIUklGVC0zMTkzXSAtIE9wdGlvbiB0byBzdXByZXNzIGRhdGUgdmFsdWUgaW4gQEdlbmVyYXRlZCBhbm5vdGF0aW9uCisgICAgKiBbVEhSSUZULTMzMDVdIC0gTWlzc2luZyBkaXN0IGZpbGVzIGZvciAwLjkuMyByZWxlYXNlIGNhbmRpZGF0ZQorICAgICogW1RIUklGVC0zMzQxXSAtIEFkZCB0ZXN0Qm9vbCBtZXRob2RzCisgICAgKiBbVEhSSUZULTMzMDhdIC0gRml4IGJyb2tlbiB0ZXN0IGNhc2VzIGZvciAwLjkuMyByZWxlYXNlIGNhbmRpZGF0ZQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTI4MzRdIC0gUmVtb3ZlIHNlbWktY29sb25zIGZyb20gcHl0aG9uIGNvZGUgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTI4NTNdIC0gQWRqdXN0IGNvbW1lbnRzIG5vdCBhcHBseWluZyBhbnltb3JlIGFmdGVyIFRIUklGVC0yODUyCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtMzIxMV0gLSBBZGQgbWFrZSBjcm9zcyBzdXBwb3J0IGZvciBwaHAgVENvbXBhY3RQcm90b2NvbAorCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTI4MzhdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNhbiBiaW5kIHRvIHBvcnQgMCAoaS5lLiwgZ2V0IGFuIE9TLWFzc2lnbmVkIHBvcnQpIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBwb3J0IG51bWJlcgorCisKKworVGhyaWZ0IDAuOS4yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTI3OTNdIC0gR28gY29tcGlsZXIgcHJvZHVjZXMgdW5jb21waWxhYmxlIGNvZGUKKyAgICAqIFtUSFJJRlQtMTQ4MV0gLSBVbml4IGRvbWFpbiBzb2NrZXRzIGluIEMrKyBkbyBub3Qgc3VwcG9ydCB0aGUgYWJzdHJhY3QgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTE0NTVdIC0gVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJpbmcgY2FzdHMgZnJvbSBzaXplX3QgdG8gdWludDMyX3QsIHdoaWNoIGlzIG5vdCBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMKKyAgICAqIFtUSFJJRlQtMTU3OV0gLSBQSFAgRXh0ZW50aW9uIC0gZnVuY3Rpb24gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IG5vdCB3b3JraW5nIGZyb20gVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplCisgICAgKiBbVEhSSUZULTE1ODRdIC0gRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wgb24gc2luZ2xlLWNvcmUgbWFjaGluZXMKKyAgICAqIFtUSFJJRlQtMTYxNF0gLSBUaHJpZnQgYnVpbGQgZnJvbSBzdm4gcmVwbyBzb3VyY2VzIGZhaWxzIHdpdGggYXV0b21ha2UtMS4xMgorICAgICogW1RIUklGVC0xMDQ3XSAtIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIHRyZWF0cyBhcmcgYXMgc3RyaW5nIHdpdGhvdXQgY2hlY2ssIHNlZ2ZhdWx0cyBpZiB5b3UgcGFzcyBub24tc3RyaW5nCisgICAgKiBbVEhSSUZULTE2MzldIC0gSmF2YS9QeXRob246IFNlcmlhbGl6YXRpb24vRGVzZXJpYWxpemF0aW9uIG9mIGRvdWJsZSB0eXBlIHVzaW5nIENvbXBhY3RQcm90b2NvbAorICAgICogW1RIUklGVC0xNjQ3XSAtIE5vZGVKUyBCdWZmZXJlZFRyYW5zcG9ydCBkb2VzIG5vdCB3b3JrIGJleW9uZCB0aGUgaGVsbG8td29ybGQgZXhhbXBsZQorICAgICogW1RIUklGVC0yMTMwXSAtIFRocmlmdCdzIEQgbGlicmFyeS90ZXN0OiBwYXJ0cyBvZiAibWFrZSBjaGVjayIgY29kZSBkbyBub3QgY29tcGlsZSB3aXRoIHJlY2VudCBkbWQtMi4wNjIgdGhyb3VnaCBkbWQtMi4wNjRhbHBoYQorICAgICogW1RIUklGVC0yMTQwXSAtIEVycm9yIGNvbXBpbGluZyBjcHAgdHV0b3JpYWxzCisgICAgKiBbVEhSSUZULTIxMzldIC0gTVNWQyAyMDEyIEVycm9yIC0gQ2Fubm90IGNvbXBpbGUgZHVlIHRvIEJvb3N0VGhyZWFkRmFjdG9yeQorICAgICogW1RIUklGVC0yMTM4XSAtIHBrZ2NvbmZpZyBmaWxlIGNyZWF0ZWQgd2l0aCB3cm9uZyBpbmNsdWRlIHBhdGgKKyAgICAqIFtUSFJJRlQtMjE2MF0gLSBXYXJuaW5nIGluIHRocmlmdC5oIHdoZW4gY29tcGlsaW5nIHdpdGggLVd1bnVzZWQgYW5kIE5ERUJVRworICAgICogW1RIUklGVC0yMTU4XSAtIENvbXBhY3QsIEpTT04sIGFuZCBTaW1wbGVKU09OIHByb3RvY29scyBhcmUgbm90IHdvcmtpbmcgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTIxNjddIC0gbm9kZWpzIGxpYiB0aHJvd3MgZXJyb3IgaWYgb3B0aW9ucyBhcmd1bWVudCBpc24ndCBwYXNzZWQKKyAgICAqIFtUSFJJRlQtMjI4OF0gLSBHbyBpbXBsIG9mIFRocmlmdCBKU09OIHByb3RvY29sIHdyb25nbHkgd3JpdGVzL2V4cGVjdHMgdHJ1ZS9mYWxzZSBmb3IgYm9vbHMKKyAgICAqIFtUSFJJRlQtMjE0N10gLSBUaHJpZnQgSURMIGdyYW1tYXIgYWxsb3dzIGZvciBkb3R0ZWQgaWRlbnRpZmllciBuYW1lcworICAgICogW1RIUklGVC0yMTQ1XSAtIFJhY2sgYW5kIFRoaW4gYXJlIG5vdCBqdXN0IGRldmVsb3BtZW50IGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC0yMjY3XSAtIFNob3VsZCBiZSBhYmxlIHRvIGNob29zZSBzb2NrZXQgZmFtaWx5IGluIFB5dGhvbiBUU29ja2V0CisgICAgKiBbVEhSSUZULTIyNzZdIC0gamF2YSBwYXRoIGluIHNwZWMgZmlsZSBuZWVkcyB1cGRhdGluZworICAgICogW1RIUklGVC0yMjgxXSAtIEdlbmVyYXRlZCBzZW5kL3JlY3YgY29kZSBpZ25vcmVzIGVycm9ycyByZXR1cm5lZCBieSB0aGUgdW5kZXJseWluZyBwcm90b2NvbAorICAgICogW1RIUklGVC0yMjgwXSAtIFRKU09OUHJvdG9jb2wuRmx1c2goKSBkb2VzIG5vdCByZWFsbHkgZmx1c2ggdGhlIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMjc0XSAtIFROb25ibG9ja2luZ1NlcnZlciBhbmQgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgZG8gbm90IGNsb3NlIHRoZWlyIGNoYW5uZWwgc2VsZWN0b3JzIG9uIGV4aXQgYW5kIGxlYWsgZmlsZSBkZXNjcmlwdG9ycworICAgICogW1RIUklGVC0yMjY1XSAtIHBocCBsaWJyYXJ5IGRvZXNuJ3QgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjIzMl0gLSBJc1NldCogYnJva2VuIGluIEdvCisgICAgKiBbVEhSSUZULTIyNDZdIC0gVW5zZXQgZW51bSB2YWx1ZSBpcyBwcmludGVkIGJ5IFRvU3RyaW5nKCkKKyAgICAqIFtUSFJJRlQtMjI0MF0gLSB0aHJpZnQudmltIChjb250cmliKSBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlICd1bmlvbicKKyAgICAqIFtUSFJJRlQtMjI0M10gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgaW4gdGhyaWZ0IGNyYXNoZXMgd2hlbiBURnJhbWVkVHJhbnNwb3J0IG9wZW5zCisgICAgKiBbVEhSSUZULTIyMzBdIC0gQ2Fubm90IEJ1aWxkIG9uIFJIRUwvQ2VudG9zL0FtYXpvbiBMaW51eCA2LngKKyAgICAqIFtUSFJJRlQtMjI0N10gLSBHbyBnZW5lcmF0b3IgZG9lc24ndCBkZWFsIHdlbGwgd2l0aCBtYXAga2V5cyBvZiB0eXBlIGJpbmFyeQorICAgICogW1RIUklGVC0yMjUzXSAtIFB5dGhvbiBUb3JuYWRvIFRUb3JuYWRvU2VydmVyIGJhc2UgY2xhc3MgY2hhbmdlCisgICAgKiBbVEhSSUZULTIyNjFdIC0gamF2YTogZXJyb3I6IHVubWFwcGFibGUgY2hhcmFjdGVyIGZvciBlbmNvZGluZyBBU0NJSQorICAgICogW1RIUklGVC0yMjU5XSAtIEMjOiB1bmV4cGVjdGVkIG51bGwgbG9nRGVsZWdhdGUoKSBwb2ludGVyIGNhdXNlcyBBViBpbiBUU2VydmVyLnNlcnZlKCkKKyAgICAqIFtUSFJJRlQtMjIyNV0gLSBTU0xDb250ZXh0IGRlc3Ryb3kgYmVmb3JlIGNsZWFudXBPcGVuU1NMCisgICAgKiBbVEhSSUZULTIyMjRdIC0gVFNTTFNvY2tldC5oIGFuZCBUU1NMU2VydmVyU29ja2V0Lmggc2hvdWxkIHVzZSB0aGUgcGxhdGZyb21zb2NrZXQgdG9vCisgICAgKiBbVEhSSUZULTIyMjldIC0gdGhyaWZ0IGZhaWxlZCB0byBidWlsZCBvbiBPU1ggMTAuOSBHTQorICAgICogW1RIUklGVC0yMjI3XSAtIFRocmlmdCBjb21waWxlciBnZW5lcmF0ZXMgc3B1cmlvdXMgd2FybmluZ3Mgd2l0aCBYbGludAorICAgICogW1RIUklGVC0yMjE5XSAtIFRocmlmdCBnZW0gZmFpbHMgdG8gYnVpbGQgb24gT1MgWCBNYXZlcmlja3Mgd2l0aCAxLjkuMyBydWJpZXMKKyAgICAqIFtUSFJJRlQtMjIyNl0gLSBUU2VydmVyU29ja2V0IC0ga2VlcEFsaXZlIHdyb25nIGluaXRpYWxpemF0aW9uIG9yZGVyCisgICAgKiBbVEhSSUZULTIyODVdIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgSmF2YSBkb2Vzbid0IGFsbG93IGEgc2xhc2ggKC8pIHRvIGJlIGVzY2FwZWQgKFwvKQorICAgICogW1RIUklGVC0yMjE2XSAtIEV4dHJhbmVvdXMgc2VtaWNvbG9uIGluIFRQcm90b2NvbFV0aWwuaCBtYWtlcyBjbGFuZyBtYWQKKyAgICAqIFtUSFJJRlQtMjIxNV0gLSBHZW5lcmF0ZWQgSFRNTC9HcmFwaHZpeiBsaXN0cyByZWZlcmVuY2VkIGVudW0gaWRlbnRpZmllcnMgYXMgVU5LTk9XTi4KKyAgICAqIFtUSFJJRlQtMjIxMV0gLSBFeGNlcHRpb24gY29uc3RydWN0b3IgZG9lcyBub3QgY29udGFpbiBuYW1lc3BhY2UgcHJlZml4LgorICAgICogW1RIUklGVC0yMjEwXSAtIGxpYi9qYXZhIFRTaW1wbGVKU09OUHJvdG9jb2wgY2FuIGVtaXQgaW52YWxpZCBKU09OCisgICAgKiBbVEhSSUZULTIyMDldIC0gUnVieSBnZW5lcmF0b3IgLS0gcGxlYXNlIG5hbWVzcGFjZSBjbGFzc2VzCisgICAgKiBbVEhSSUZULTIyMDJdIC0gRGVscGhpIFRTZXJ2ZXJJbXBsLkRlZmF1bHRMb2dEZWxlZ2F0ZSBtYXkgc3RvcCB0aGUgc2VydmVyIHdpdGggSS9PLUVycm9yIDEwNQorICAgICogW1RIUklGVC0yMjAxXSAtIFRlcm5hcnkgb3BlcmF0b3IgcmV0dXJucyBkaWZmZXJlbnQgdHlwZXMgKGJ1aWxkIGVycm9yIGZvciBzb21lIGNvbXBpbGVycykKKyAgICAqIFtUSFJJRlQtMjIwMF0gLSBuZXN0ZWQgc3RydWN0cyBjYXVzZSBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHRvIHNsb3cgZG93biBhdCBleGNlc3NpdmUgQ1BVIGxvYWQKKyAgICAqIFtUSFJJRlQtMjE5N10gLSBmaXggamFyIG91dHB1dCBkaXJlY3RvcnkgaW4gcnBtIHNwZWMgZmlsZQorICAgICogW1RIUklGVC0yMTk2XSAtIEZpeCBpbnZhbGlkIGRlcGVuZGVuY3kgaW4gTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMjE5NF0gLSBOb2RlOiBOb3QgYWN0dWFsbHkgcHJlcGVuZGluZyByZXNpZHVhbCBkYXRhIGluIFRGcmFtZWRUcmFuc3BvcnQucmVjZWl2ZXIKKyAgICAqIFtUSFJJRlQtMjE5M10gLSBKYXZhIGNvZGUgZ2VuZXJhdG9yIGVtaXRzIHNwdXJpb3VzIHNlbWljb2xvbiB3aGVuIGRlZXAgY29weWluZyBiaW5hcnkgZGF0YQorICAgICogW1RIUklGVC0yMTkxXSAtIEZpeCBjaGFycCBKU09OUHJvdG9jb2wuUmVhZEpTT05Eb3VibGUgKHNwZWNpZnkgSW52YXJpYW50Q3VsdHVyZSkKKyAgICAqIFtUSFJJRlQtMjIxNF0gLSBTeXN0ZW0gaGVhZGVyIHN5cy9wYXJhbS5oIGlzIGluY2x1ZGVkIGluc2lkZSB0aGUgVGhyaWZ0IG5hbWVzcGFjZQorICAgICogW1RIUklGVC0yMTc4XSAtIFRocmlmdCBnZW5lcmF0b3IgcmV0dXJucyBlcnJvciBleGl0IGNvZGUgb24gLS12ZXJzaW9uCisgICAgKiBbVEhSSUZULTIxNzFdIC0gTm9kZUpTIGltcGxlbWVudGF0aW9uIGhhcyBleHRyZW1lbHkgbG93IHRlc3QgY292ZXJhZ2UKKyAgICAqIFtUSFJJRlQtMjE4M10gLSBnZW0gaW5zdGFsbCBmYWlscyBvbiB6c2gKKyAgICAqIFtUSFJJRlQtMjE4Ml0gLSBzZWdmYXVsdCBpbiByZWdyZXNzaW9uIHRlc3RzIChHQyBidWcgaW4gcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUpCisgICAgKiBbVEhSSUZULTIxODFdIC0gb25ld2F5IGNhbGxzIGRvbid0IHdvcmsgaW4gTm9kZUpTCisgICAgKiBbVEhSSUZULTIxNjldIC0gSmF2YU1FIFRocmlmdCBMaWJyYXJ5IGNhdXNlcyAiamF2YS5pby5JT0V4Y2VwdGlvbjogTm8gUmVzcG9uc2UgRW50cmllcyBBdmFpbGFibGUiIGFmdGVyIHVzaW5nIHRoZSBUaHJpZnQgY2xpZW50IGZvciBzb21lIHRpbWUKKyAgICAqIFtUSFJJRlQtMjE2OF0gLSBOb2RlLmpzIGFwcGVhcnMgYnJva2VuIChhdCBsZWFzdCwgZXhhbXBsZXMgZG9uJ3Qgd29yayBhcyBpbnRlbmRlZCkKKyAgICAqIFtUSFJJRlQtMjI5M10gLSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5jcmVhdGVTU0xDb250ZXh0KCkgbGVhdmVzIGZpbGVzIG9wZW4KKyAgICAqIFtUSFJJRlQtMjI3OV0gLSBUU2VyaWFsaXplciBvbmx5IHJldHVybnMgdGhlIGZpcnN0IDEwMjQgYnl0ZXMgc2VyaWFsaXplZAorICAgICogW1RIUklGVC0yMjc4XSAtIEJ1ZmZlcmVkIHRyYW5zcG9ydCBkb2Vzbid0IHN1cHBvcnQgd3JpdGVzID4gYnVmZmVyIHNpemUKKyAgICAqIFtUSFJJRlQtMjI3NV0gLSBGaXggbWVtb3J5IGxlYWsgaW4gZ29sYW5nIGNvbXBhY3RfcHJvdG9jb2wuCisgICAgKiBbVEhSSUZULTIyODJdIC0gSW5jb3JlY3QgY29kZSBnZW5lcmF0ZWQgZm9yIHNvbWUgdHlwZWRlZnMKKyAgICAqIFtUSFJJRlQtMjAwOV0gLSBHbyByZWRlY2xhcmF0aW9uIGVycm9yCisgICAgKiBbVEhSSUZULTE5NjRdIC0gJ0lzc2V0JyBjYXVzZXMgcHJvYmxlbXMgd2l0aCBDIy8uTkVUIHNlcmlhbGl6ZXJzCisgICAgKiBbVEhSSUZULTIwMjZdIC0gRml4IFRDb21wYWN0UHJvdG9jb2wgNjQgYml0IGJ1aWxkcworICAgICogW1RIUklGVC0yMTA4XSAtIEZpeCBUQXN5bmNDbGllbnRNYW5hZ2VyIHRpbWVvdXQgcmFjZQorICAgICogW1RIUklGVC0yMDY4XSAtIE11bHRpcGxlIGNhbGxzIGZyb20gc2FtZSBjb25uZWN0aW9uIGFyZSBub3QgcHJvY2Vzc2VkIGluIG5vZGUKKyAgICAqIFtUSFJJRlQtMTc1MF0gLSBNYWtlIGNvbXBpbGVyIGJ1aWxkIGNsZWFubHkgdW5kZXIgdmlzdWFsIHN0dWRpbyAxMAorICAgICogW1RIUklGVC0xNzU1XSAtIENvbW1lbnQgcGFyc2luZyBidWcKKyAgICAqIFtUSFJJRlQtMTc3MV0gLSAibWFrZSBjaGVjayIgZmFpbHMgb24geDY0IGZvciBsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgICAqIFtUSFJJRlQtMTg0MV0gLSBOb2RlSlMgVGhyaWZ0IGluY29ycmVjdGx5IHBhcnNlcyBub24tVVRGOC1zdHJpbmcgdHlwZXMKKyAgICAqIFtUSFJJRlQtMTkwOF0gLSBVc2luZyBwaHAgdGhyaWZ0X3Byb3RvY29sIGFjY2VsZXJhdGVkIHRyYW5zZmVyIGNhdXNlcyBjb3JlIGR1bXAKKyAgICAqIFtUSFJJRlQtMTg5Ml0gLSBTb2NrZXQgdGltZW91dHMgYXJlIGRlY2xhcmVkIGluIG1pbGxpLXNlY29uZHMsIGJ1dCBhcmUgYWN0dWFsbHkgc2V0IGluIG1pY3JvLXNlY29uZHMKKyAgICAqIFtUSFJJRlQtMjMwM10gLSBUQnVmZmVycmVkVHJhbnNwb3J0IG5vdCBwcm9wZXJseSBjbG9zaW5nIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIzMTNdIC0gbm9kZWpzIHNlcnZlciBjcmFzaCBhZnRlciBwcm9jZXNzaW5nIHRoZSBmaXJzdCByZXF1ZXN0IHdoZW4gdXNpbmcgTXVsdGlwbGV4ZWRQcm9jZXNzb3IvRnJhbWVkQnVmZmVyL0JpbmFyeVByb3RvY29sCisgICAgKiBbVEhSSUZULTIzMTFdIC0gR286IGludmFsaWQgY29kZSBnZW5lcmF0ZWQgd2hlbiBleGNlcHRpb24gbmFtZSBpcyBhIGdvIGtleXdvcmQKKyAgICAqIFtUSFJJRlQtMjMwOF0gLSBub2RlOiBUSlNPTlByb3RvY29sIHBhcnNlIGVycm9yIHdoZW4gcmVhZGluZyBmcm9tIGJ1ZmZlcmVkIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMjMxNl0gLSBjY3A6IFRGaWxlVHJhbnNwb3J0VGVzdAorICAgICogW1RIUklGVC0yMzUyXSAtIG1zdmMgZmFpbGVkIHRvIGNvbXBpbGUgdGhyaWZ0IHRlc3RzCisgICAgKiBbVEhSSUZULTIzMzddIC0gR29sYW5nIGRvZXMgbm90IHJlcG9ydCBUSU1FRF9PVVQgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0yMzQwXSAtIEdlbmVyYXRlZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2VuZCByZXNwb25zZSB0eXBlIEVYQ0VQVElPTiBvbiB0aGUgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTl9NRVRIT0QgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTIzNTRdIC0gQ29ubmVjdGlvbiBlcnJvcnMgY2FuIGxlYWQgdG8gY2FzZV9jbGF1c2UgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0yMzM5XSAtIFVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiB0aHJpZnQgYyMgZHJpdmVyCisgICAgKiBbVEhSSUZULTIzNTZdIC0gYysrIHRocmlmdCBjbGllbnQgbm90IHdvcmtpbmcgd2l0aCBzc2wgKFNTTF9jb25uZWN0IGhhbmdzKQorICAgICogW1RIUklGVC0yMzMxXSAtIE1pc3NpbmcgY2FsbCB0byBSZWFkU3RydWN0QmVnaW4oKSBpbiBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZCgpCisgICAgKiBbVEhSSUZULTIzMjNdIC0gVW5jb21waWxlYWJsZSBEZWxwaGkgY29kZSBnZW5lcmF0ZWQgZm9yIHR5cGVkZWYnZCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTIzMjJdIC0gQ29ycmVjdGx5IHNob3cgdGhlIG51bWJlciBvZiB0aW1lcyBFeGVjdXRvclNlcnZpY2UgKGphdmEpIGhhcyByZWplY3RlZCB0aGUgY2xpZW50LgorICAgICogW1RIUklGVC0yMzg5XSAtIG5hbWVzcGFjZXMgaGFuZGxlZCB3cm9uZ2x5IGluIGFjcmlvbnNjcmlwdCAzLjAgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjM4OF0gLSBHb0xhbmcgLSBGaXggZGF0YSByYWNlcyBpbiBzaW1wbGVfc2VydmVyIGFuZCBzZXJ2ZXJfc29ja2V0CisgICAgKiBbVEhSSUZULTIzODZdIC0gVGhyaWZ0IHJlZnVzZXMgdG8gbGluayB5eWxleAorICAgICogW1RIUklGVC0yMzc1XSAtIEV4Y2Vzc2l2ZSA8YnI+J3MgaW4gZ2VuZXJhdGVkIEhUTUwKKyAgICAqIFtUSFJJRlQtMjM3M10gLSB3YXJuaW5nIENTMDQxNCBpbiBUSHR0cENsaWVudC5jczogcHJpdmF0ZSBmaWVsZCAnVGhyaWZ0LlRyYW5zcG9ydC5USHR0cENsaWVudC5jb25uZWN0aW9uJyBhc3NpZ25lZCBidXQgbmV2ZXIgdXNlZAorICAgICogW1RIUklGVC0yMzcyXSAtIHRocmlmdC9qc29uX3Byb3RvY29sLmdvOjE2MDogZnVuY3Rpb24gZW5kcyB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudAorICAgICogW1RIUklGVC0yMzcxXSAtIHJ1YnkgYnVuZGxlciB2ZXJzaW9uIGZhaWxzIG9uIH4xLjMuMSwgcmVtb3ZlIGFuZCB0YWtlIGxhdGVzdCBhdmFpbAorICAgICogW1RIUklGVC0yMzcwXSAtIENvbXBpbGVyIFNFR0ZBVUxUcyBnZW5lcmF0aW5nIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgY29tcGxleCBzdHJ1Y3JlCisgICAgKiBbVEhSSUZULTIzODRdIC0gQmluYXJ5IG1hcCBrZXlzIHByb2R1Y2UgdW5jb21waWxhYmxlIGNvZGUgaW4gZ28KKyAgICAqIFtUSFJJRlQtMjM4MF0gLSB1bnJlYWNoYWJsZSBjb2RlIChDSUQgMTE3NDU0NiwgQ0lEIDExNzQ2NzkpCisgICAgKiBbVEhSSUZULTIzNzhdIC0gc2VydmljZSBtZXRob2QgYXJndW1lbnRzIG9mIGJpbmFyeSB0eXBlIGxlYWQgdG8gdW5jb21waWxlYWJsZSBHbyBjb2RlCisgICAgKiBbVEhSSUZULTIzNjNdIC0gSXNzdWUgd2l0aCBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgU3VjY2VzcyByZXR1cm5lZCBmcm9tIExvZ2luIHVzaW5nIFRocmlmdCBQcm94eSBhbmQgTm9kZUpTCisgICAgKiBbVEhSSUZULTIzNTldIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGRvZXNuJ3QgY2xlYXIgaXQncyBidWZmZXIgb24gYSBmYWlsZWQgZmx1c2ggY2FsbAorICAgICogW1RIUklGVC0yNDI4XSAtIFB5dGhvbiAzIHNldHVwLnB5IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjM2N10gLSBCdWlsZCBmYWlsdXJlOiBzdGRsaWIgYW5kIGJvb3N0IGJvdGggZGVmaW5lIHVpbnQ2NF90CisgICAgKiBbVEhSSUZULTIzNjVdIC0gQyMgZGVjb2RlcyB0b28gbWFueSBiaW5hcnkgYnl0ZXMgZnJvbSBKU09OCisgICAgKiBbVEhSSUZULTI0MDJdIC0gYnl0ZSBjb3VudCBvZiBGcmFtZUJ1ZmZlciBpbiBBV0FJVElOR19DTE9TRSBzdGF0ZSBpcyBub3Qgc3VidHJhY3RlZCBmcm9tIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZAorICAgICogW1RIUklGVC0yMzk2XSAtIEJ1aWxkIEVycm9yIG9uIE1hY09TWAorICAgICogW1RIUklGVC0yMzk1XSAtIHRocmlmdCBSdWJ5IGdlbSByZXF1aXJlcyBkZXZlbG9wbWVudCBkZXBlbmRlbmN5ICd0aGluJyByZWdhcmRsZXNzIG9mIGVudmlyb25tZW50CisgICAgKiBbVEhSSUZULTI0MTRdIC0gY19nbGliIGZpeCBzZXZlcmFsIGJ1Zy4KKyAgICAqIFtUSFJJRlQtMjQyMF0gLSBHbyBhcmd1bWVudCBwYXJzZXIgZm9yIG1ldGhvZHMgd2l0aG91dCBhcmd1bWVudHMgZG9lcyBub3Qgc2tpcCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjQzOV0gLSBCdWcgaW4gVFByb3RvY29sRGVjb3JhdG9yIENsYXNzIGNhdXNlcyBwYXJzaW5nIGVycm9ycworICAgICogW1RIUklGVC0yNDE5XSAtIGdvbGFuZyAtIEZpeCBmbXQuRXJyb3JmIGluIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTI0MThdIC0gR28gaGFuZGxlciBmdW5jdGlvbiBwYW5pY3Mgb24gaW50ZXJuYWwgZXJyb3IKKyAgICAqIFtUSFJJRlQtMjQwNV0gLSBOb2RlLmpzIE11bHRpcGxleGVyIHRlc3RzIGZhaWwgKHNpbGVudGx5KQorICAgICogW1RIUklGVC0yNTgxXSAtIFRGRFRyYW5zcG9ydCBkZXN0cnVjdG9yIHNob3VsZCBub3QgdGhyb3cKKyAgICAqIFtUSFJJRlQtMjU3NV0gLSBUaHJpZnQgaW5jbHVkZXMgc2lnaW5mb190IHdpdGhpbiBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTI1NzddIC0gVEZpbGVUcmFuc3BvcnQgIG1pc3N1c2Ugb2YgY2xvc2Vzb2NrZXQgb24gd2luZG93cyBwbGF0Zm9ybQorICAgICogW1RIUklGVC0yNTc2XSAtIEltcGxlbWVudCBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLnNraXAgbWV0aG9kIGluIEphdmFTY3JpcHQgbGlicmFyeQorICAgICogW1RIUklGVC0yNTg4XSAtIFRocmlmdCBjb21waWxlciBpcyBub3QgYnVpbGRhYmxlIGluIFZpc3VhbCBTdHVkaW8gMjAxMAorICAgICogW1RIUklGVC0yNTk0XSAtIEpTIENvbXBpbGVyOiBTaW5nbGUgcXVvdGVzIGFyZSBub3QgYmVpbmcgZXNjYXBlZCBpbiBjb25zdGFudHMuCisgICAgKiBbVEhSSUZULTI1OTFdIC0gVEZyYW1lZFRyYW5zcG9ydCBkb2VzIG5vdCBoYW5kbGUgcGF5bG9hZHMgc3BsaXQgYWNyb3NzIHBhY2tldHMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTI1OTldIC0gVW5jb21waWxlYWJsZSBEZWxwaGkgY29kZSBkdWUgdG8gbmFtaW5nIGNvbmZsaWN0cyB3aXRoIElETAorICAgICogW1RIUklGVC0yNTkwXSAtIEMrKyBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGRvZXNuJ3QgaW5jbHVkZSBNdWx0aXBsZXhpbmcgc3VwcG9ydAorICAgICogW1RIUklGVC0yNTk1XSAtIE5vZGUuanM6IEZpeCBnbG9iYWwgbGVha3MgYW5kIGNvcHktcGFzdGUgZXJyb3JzCisgICAgKiBbVEhSSUZULTI1NjVdIC0gYXV0b2NvbmYgZmFpbHMgdG8gZmluZCBtaW5ndy1nKysgY3Jvc3MgY29tcGlsZXIgb24gdHJhdmlzIENJCisgICAgKiBbVEhSSUZULTI1NTVdIC0gZXhjZXNzaXZlICJ1bnVzZWQgZmllbGQiIGNvbW1lbnRzCisgICAgKiBbVEhSSUZULTI1NTRdIC0gZG91YmxlIGluaXRpYWxpemF0aW9uIGluIGdlbmVyYXRlZCBSZWFkKCkgbWV0aG9kCisgICAgKiBbVEhSSUZULTI1NTFdIC0gT3V0T2ZNZW1vcnlFcnJvciAidW5hYmxlIHRvIGNyZWF0ZSBuZXcgbmF0aXZlIHRocmVhZCIga2lsbHMgc2VydmUgdGhyZWFkCisgICAgKiBbVEhSSUZULTI1NDNdIC0gR2VuZXJhdGVkIGVudW0gdHlwZSBpbiBoYXNrZWxsIHNob3VsZCBiZSBxdWFsaWZpZWQKKyAgICAqIFtUSFJJRlQtMjU2MF0gLSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdG9yIHRyaWVzIHRvIGNvbmNhdCBpbnRzIHdpdGggc3RyaW5ncyB1c2luZyArCisgICAgKiBbVEhSSUZULTI1NTldIC0gQ2VudG9zIDYuNSB1bmFibGUgdG8gIm1ha2UiIHdpdGggVGhyaWZ0IDAuOS4xCisgICAgKiBbVEhSSUZULTI1MjZdIC0gQXNzaWdubWVudCBvcGVyYXRvcnMgYW5kIGNvcHkgY29uc3RydWN0b3JzIGluIGMrKyBkb24ndCBjb3B5IHRoZSBfX2lzc2V0IHN0cnVjdAorICAgICogW1RIUklGVC0yNDU0XSAtIGNfZ2xpYjogVGhlcmUgaXMgbm8gZ2V0aG9zdGJ5bmFtZV9yKCkgaW4gc29tZSBPUy4KKyAgICAqIFtUSFJJRlQtMjQ1MV0gLSBEbyBub3QgdXNlIHBvaW50ZXJzIGZvciBvcHRpb25hbCBmaWVsZHMgd2l0aCBkZWZhdWx0cy4gRG8gbm90IHdyaXRlIHN1Y2ggZmllbGRzIGlmIGl0cyB2YWx1ZSBzZXQgdG8gZGVmYXVsdC4gQWxzbywgZG8gbm90IHVzZSBwb2ludGVycyBmb3IgYW55IG9wdGlvbmFsIGZpZWxkcyBtYXBwZWQgdG8gZ28gbWFwIG9yIHNsaWNlLiBnZW5lcmF0ZSBHZXQgYWNjZXNzb3JzCisgICAgKiBbVEhSSUZULTI0NTBdIC0gaW5jbHVkZSBIb3dUb0NvbnRyaWJ1dGUgaW4gdGhlIHNyYyByZXBvCisgICAgKiBbVEhSSUZULTI0NDhdIC0gdGhyaWZ0L3Rlc3QvdGVzdC5zaCBoYXMgaW5jb3JyZWN0IE5vZGUuanMgdGVzdCBwYXRoCisgICAgKiBbVEhSSUZULTI0NjBdIC0gdW5vcGVuZWQgc29ja2V0IGZkIG11c3QgYmUgbGVzcyB0aGFuIHplcm8uCisgICAgKiBbVEhSSUZULTI0NTldIC0gLS12ZXJzaW9uIHNob3VsZCBub3QgZXhpdCAxCisgICAgKiBbVEhSSUZULTI0NjhdIC0gVGltZXN0YW1wIGhhbmRsaW5nCisgICAgKiBbVEhSSUZULTI0NjddIC0gVW5hYmxlIHRvIGJ1aWxkIGNvbnRyaWIvZmIzMDMgb24gT1NYIDEwLjkuMgorICAgICogW1RIUklGVC0yNDY2XSAtIEltcHJvcGVyIGVycm9yIGhhbmRsaW5nIGZvciBTU0wvVExTIGNvbm5lY3Rpb25zIHRoYXQgZG9uJ3QgY29tcGxldGUgYSBoYW5kc2hha2UKKyAgICAqIFtUSFJJRlQtMjQ2M10gLSB0ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weSBmYWlscyBzb21ldGltZXMKKyAgICAqIFtUSFJJRlQtMjQ1OF0gLSBHZW5lcmF0ZWQgZ29sYW5nIHNlcnZlciBjb2RlIGZvciAib25ld2F5IiBtZXRob2RzIGlzIGluY29ycmVjdAorICAgICogW1RIUklGVC0yNDU2XSAtIFRIdHRwQ2xpZW50IGZhaWxzIHdoZW4gdXNpbmcgYXN5bmMgc3VwcG9ydCBvdXRzaWRlIFNpbHZlcmxpZ2h0CisgICAgKiBbVEhSSUZULTI1MjRdIC0gVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGlzIG1pc3NpbmcgVFRocmVhZGVkU2VydmVyIGZpbGVzCisgICAgKiBbVEhSSUZULTI1MjNdIC0gVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGlzIG1pc3NpbmcgT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjUyMF0gLSBjcHA6Y29iX3N0eWxlIGdlbmVyYXRlcyBpbmNvcnJlY3QgLnRjYyBmaWxlCisgICAgKiBbVEhSSUZULTI1MDhdIC0gVW5jb21waWxlYWJsZSBDIyBjb2RlIGR1ZSB0byBsYW5ndWFnZSBrZXl3b3JkcyBpbiBJREwKKyAgICAqIFtUSFJJRlQtMjUwNl0gLSBVcGRhdGUgVFByb3RvY29sRXhjZXB0aW9uIGVycm9yIGNvZGVzIHRvIGJlIHVzZWQgY29uc2lzdGVudGx5IHRocm91Z2hvdXQgdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjUwNV0gLSBnbzogc3RydWN0IHNob3VsZCBhbHdheXMgYmUgYSBwb2ludGVyIHRvIGF2b2lkIGNvcHlpbmcgb2YgcG90ZW50aWFsbHkgc2l6ZS11bmJvdW5kZWQgc3RydWN0cworICAgICogW1RIUklGVC0yNTE1XSAtIFRMUyBNZXRob2QgZXJyb3IgZHVyaW5nIG1ha2UKKyAgICAqIFtUSFJJRlQtMjUwM10gLSBDKys6IEZpeCBuYW1lIGNvbGxpc2lvbiB3aGVuIGEgc3RydWN0IGhhcyBhIG1lbWJlciBuYW1lZCAidmFsIgorICAgICogW1RIUklGVC0yNDc3XSAtIHRocmlmdCAtLWhlbHAgdGV4dCB3aXRoIG1pc3BsYWNlZCBjb21tYQorICAgICogW1RIUklGVC0yNDkyXSAtIHRlc3QvY3BwIGRvZXMgbm90IGNvbXBpbGUgb24gbWFjCisgICAgKiBbVEhSSUZULTI1MDBdIC0gc2VuZGluZyByYW5kb20gZGF0YSBjcmFzaGVzIHRocmlmdChnb2xhbmcpIHNlcnZpY2UKKyAgICAqIFtUSFJJRlQtMjQ3NV0gLSBjX2dsaWI6IGJ1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSBmdW5jdGlvbiByZXR1cm4gYWx3YXlzIFRSVUUuCisgICAgKiBbVEhSSUZULTI0OTVdIC0gSmF2YVNjcmlwdC9Ob2RlIHN0cmluZyBjb25zdGFudHMgbGFjayBwcm9wZXIgZXNjYXBpbmcKKyAgICAqIFtUSFJJRlQtMjQ5MV0gLSB1bmFibGUgdG8gaW1wb3J0IGdlbmVyYXRlZCBUaHJpZnRUZXN0IHNlcnZpY2UKKyAgICAqIFtUSFJJRlQtMjQ5MF0gLSBjX2dsaWI6IGlmIGZhaWwgdG8gcmVhZCBhIGV4Y2VwdGlvbiBmcm9tIHNlcnZlciwgY2xpZW50IG1heSBiZSBvY2N1cnJlZCBkb3VibGUgZnJlZQorICAgICogW1RIUklGVC0yNDcwXSAtIFRIdHRwSGFuZGxlciBzd2FsbG93cyBleGNlcHRpb25zIGZyb20gcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTI1MzNdIC0gQm9vc3QgdmVyc2lvbiBpbiByZXF1aXJlbWVudHMgc2hvdWxkIGJlIHVwZGF0ZWQKKyAgICAqIFtUSFJJRlQtMjUzMl0gLSBKYXZhIHZlcnNpb24gaW4gaW5zdGFsbGF0aW9uIHJlcXVpcmVtZW50cyBzaG91bGQgYmUgdXBkYXRlZAorICAgICogW1RIUklGVC0yNTI5XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBzcGxpdCAgVGNwIGRhdGEgYnVnIGluIG5vZGVKcworICAgICogW1RIUklGVC0yNTM3XSAtIFBhdGggZm9yICJnbyBnZXQiIGRvZXMgbm90IHdvcmsgKHB1bGwgcmVxdWVzdCAxMTUpCisgICAgKiBbVEhSSUZULTI0NDNdIC0gTm9kZSBmYWlscyBjcm9zcyBsYW5nIHRlc3RzCisgICAgKiBbVEhSSUZULTI0MzddIC0gQXV0aG9yIGZpZWxkcyBpbiBQeXRob24gc2V0dXAucHkgbXVzdCBiZSBzdHJpbmdzIG5vdCBsaXN0cy4KKyAgICAqIFtUSFJJRlQtMjQzNV0gLSBKYXZhIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBzdHJ1Y3QgbWVtYmVyIG5hbWVzIHRoYXQgYXJlIGlkZW50aWNhbCB0byBhbiBleGlzdGluZyBlbnVtIG9yIHN0cnVjdCB0eXBlCisgICAgKiBbVEhSSUZULTI0MzRdIC0gTWlzc2luZyBuYW1lc3BhY2UgaW1wb3J0IGZvciBwaHAgVE11bHRpcGxleGVkUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTI0MzJdIC0gRmxha3kgcGFyYWxsZWwgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjQzMF0gLSBDcmFzaCBkdXJpbmcgVFRocmVhZFBvb2xTZXJ2ZXIgc2h1dGRvd24KKyAgICAqIFtUSFJJRlQtNjY3XSAtIFBlcmlvZCBzaG91bGQgbm90IGJlIGFsbG93ZWQgaW4gaWRlbnRpZmllciBuYW1lcworICAgICogW1RIUklGVC0xMjEyXSAtIE1lbWJlcnMgY2FwaXRhbCBjYXNlIGNvbmZsaWN0CisgICAgKiBbVEhSSUZULTI1ODRdIC0gRXJyb3IgaGFuZGxlciBub3QgbGlzdGVuZWQgb24gamF2YXNjcmlwdCBjbGllbnQKKyAgICAqIFtUSFJJRlQtMjI5NF0gLSBJbmNvcnJlY3QgTWFrZWZpbGUgZ2VuZXJhdGlvbgorICAgICogW1RIUklGVC0yNjAxXSAtIEZpeCB2YWdyYW50IHRvIHdvcmsgYWdhaW4gZm9yIGJ1aWxkcyBhZ2FpbgorICAgICogW1RIUklGVC0yMDkyXSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgc2hvdWxkIHJlbGVhc2UgaGFuZGxlciBhcyBzb29uIGFzIGNvbm5lY3Rpb24gY2xvc2VzCisgICAgKiBbVEhSSUZULTI1NTddIC0gQ1MwNTQyIG1lbWJlciBuYW1lcyBjYW5ub3QgYmUgdGhlIHNhbWUgYXMgdGhlaXIgZW5jbG9zaW5nIHR5cGUKKyAgICAqIFtUSFJJRlQtMjYwNV0gLSBUU29ja2V0IHdhcm5pbmcgb24gZ2NjIDQuOC4zCisgICAgKiBbVEhSSUZULTI2MDddIC0gVGhyZWFkTWFuYWdlci5jcHAgd2FybmluZyBvbiBjbGFuZysrIDMuNAorICAgICogW1RIUklGVC0xOTk4XSAtIFRDb21wYWN0UHJvdG9jb2wudGNjIC0gb25lIG1vcmUgd2FybmluZyBvbiBWaXN1YWwgMjAxMAorICAgICogW1RIUklGVC0yNjEwXSAtIE1TVkMgd2FybmluZyBpbiBUU29ja2V0LmNwcAorICAgICogW1RIUklGVC0yNjE0XSAtIFROb25ibG9ja2luZ1NlcnZlci5jcHAgd2FybmluZ3Mgb24gTVNWQworICAgICogW1RIUklGVC0yNjA4XSAtIFROb25ibG9ja2luZ1NlcnZlci5jcHAgd2FybmluZ3Mgb24gY2xhbmcgMy40CisgICAgKiBbVEhSSUZULTI2MDZdIC0gVGhyZWFkTWFuYWdlci5oIHdhcm5pbmcgaW4gY2xhbmcrKyAzLjQKKyAgICAqIFtUSFJJRlQtMjYwOV0gLSBURmlsZVRyYW5zcG9ydC5oIHVudXNlZCBmaWVsZCB3YXJuaW5nIChjbGFuZyAzLjQpCisgICAgKiBbVEhSSUZULTI0MTZdIC0gQ2Fubm90IHVzZSBUQ29tcGFjdFByb3RvY29sIHdpdGggTVNWQworICAgICogW1RIUklGVC0xODAzXSAtIFJ1YnkgVGhyaWZ0IDAuOS4wIHRyaWVzIHRvIGVuY29kZSBVVUlEIHRvIFVURjggYW5kIGNyYXNoZXMKKyAgICAqIFtUSFJJRlQtMjM4NV0gLSBQcm9ibGVtIHdpdGggZ2V0aG9zdGJ5bmFtZTIgZHVyaW5nIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMjI2Ml0gLSB0aHJpZnQgc2VydmVyICdNdXRhdGVSb3cnIG9wZXJhdGlvbiBnaXZlcyBubyBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MgLyBmYWlsdXJlCisgICAgKiBbVEhSSUZULTIwNDhdIC0gUHJlZmVyIGJvb2xlYW4gY29udGV4dCB0byBudWxscHRyX3QgY29udmVyc2lvbgorICAgICogW1RIUklGVC0yNTI4XSAtIFRocmlmdCBFcmxhbmcgTGlicmFyeTogTXVsdGlwbGUgdGhyaWZ0IGFwcGxpY2F0aW9ucyBpbiBvbmUgYnVuZGxlCisgICAgKiBbVEhSSUZULTE5OTldIC0gd2FybmluZyBvbiBnY2MgNC43IHdoaWxlIGNvbXBpbGluZyBCb29zdE11dGV4LmNwcAorICAgICogW1RIUklGVC0yMTA0XSAtIFN0cnVjdHMgbG9zZSBiaW5hcnkgZGF0YSB3aGVuIHRyYW5zZmVycmVkIGZyb20gc2VydmVyIHRvIGNsaWVudCBpbiBKYXZhCisgICAgKiBbVEhSSUZULTIxODRdIC0gdW5kZWZpbmVkIG1ldGhvZCByc3BlY192ZXJpZnkgZm9yIFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIzNTFdIC0gUEhQIFRDb21wYWN0UHJvdG9jb2wgaGFzIGZhaWxzIHRvIGRlY29kZSBtZXNzYWdlcworICAgICogW1RIUklGVC0yMDE2XSAtIFJlc291cmNlIExlYWsgaW4gdGhyaWZ0IHN0cnVjdCB1bmRlciBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaAorICAgICogW1RIUklGVC0yMjczXSAtIFBsZWFzZSBkZWxldGUgb2xkIHJlbGVhc2VzIGZyb20gbWlycm9yaW5nIHN5c3RlbQorICAgICogW1RIUklGVC0yMjcwXSAtIEZhdWx0eSBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyaW5nIGF0IGJ1aWxkIG9yIGRvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjIwM10gLSBUZXN0cyBrZWVwaW5nIGZhaWxpbmcgb24gSmVua2lucyBhbmQgVHJhdmlzIENJCisgICAgKiBbVEhSSUZULTIzOTldIC0gdGhyaWZ0LmVsOiByZWNvZ25pemUgIi8vIi1zdHlsZSBjb21tZW50cyBpbiBlbWFjcyB0aHJpZnQtbW9kZQorICAgICogW1RIUklGVC0yNTgyXSAtICJGaWxlVHJhbnNwb3J0IGVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gdHJ5aW5nIHRvIHVzZSBKYXZhJ3MgVEZpbGVUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMTY4Ml0gLSBNdWx0aXBsZSB0aHJlYWQgY2FsbGluZyBhIFNlcnZpY2UgZnVuY3Rpb24gdW5zYWZlbHkgY2F1c2VzIG1lc3NhZ2UgY29ycnVwdGlvbiBhbmQgdGVybWluYXRlcyB3aXRoIEJyb2tlbiBQaXBlCisgICAgKiBbVEhSSUZULTIzNTddIC0gcmVjdXJzZSBvcHRpb24gaGFzIG5vIGVmZmVjdCB3aGVuIGdlbmVyYXRpbmcgcGhwCisgICAgKiBbVEhSSUZULTIyNDhdIC0gR28gZ2VuZXJhdG9yIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGggbWFwIGtleXMgb2YgdHlwZSBiaW5hcnkKKyAgICAqIFtUSFJJRlQtMjQyNl0gLSBjbGFyaWZ5IElQIHJpZ2h0cyBhbmQgY29udHJpYnV0aW9ucyBmcm9tIGZidGhyaWZ0CisgICAgKiBbVEhSSUZULTIwNDFdIC0gVE5vbmJsb2NraW5nIHNlcnZlciBjb21waWxhdGlvbiBvbiB3aW5kb3dzIChBUklUSE1FVElDX1JJR0hUX1NISUZUKQorICAgICogW1RIUklGVC0yNDAwXSAtIHRocmlmdC5lbDogcmVjb2duaXplICIvLyItc3R5bGUgY29tbWVudHMgaW4gZW1hY3MgdGhyaWZ0LW1vZGUKKyAgICAqIFtUSFJJRlQtMTcxN10gLSBGaXggZGViIGJ1aWxkIGluIGplbmtpbnMKKyAgICAqIFtUSFJJRlQtMjI2Nl0gLSBUaHJlYWRNYW5hZ2VyLmg6MjQ6MTA6IGZhdGFsIGVycm9yOiAndHIxL2Z1bmN0aW9uYWwnIGZpbGUgbm90IGZvdW5kIG9uIE1hYyAxMC45IChNYXZlcmlja3MpCisgICAgKiBbVEhSSUZULTEzMDBdIC0gVGVzdCBmYWlsdXJlcyB3aXRoIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikKKyAgICAqIFtUSFJJRlQtMjQ4N10gLSBUdXRvcmlhbCByZXF1aXJlcyB0d28gSURMIGZpbGVzIGJ1dCBvbmx5IG9uZSBpcyBsaW5rZWQgZnJvbSB0aGUgVGhyaWZ0IHdlYiBzaXRlCisgICAgKiBbVEhSSUZULTIzMjldIC0gbWlzc2luZyByZWxlYXNlIHRhZ3Mgd2l0aGluIGdpdAorICAgICogW1RIUklGVC0yMzA2XSAtIGNvbmN1cmVudCBjbGllbnQgY2FsbHMgd2l0aCBub2RlanMKKyAgICAqIFtUSFJJRlQtMjIyMl0gLSBydWJ5IGdlbSBjYW5ub3QgYmUgY29tcGlsZWQgb24gT1MgWCBtYXZlcmlja3MKKyAgICAqIFtUSFJJRlQtMjM4MV0gLSBjb2RlIHdoaWNoIGdlbmVyYXRlZCBieSB0aHJpZnQyL2hiYXNlLnRocmlmdCBjb21waWxlIGVycm9yCisgICAgKiBbVEhSSUZULTIzOTBdIC0gbm8gY2xvc2UgZXZlbnQgd2hlbiBjb25uZWN0aW9uIGxvc3QKKyAgICAqIFtUSFJJRlQtMjE0Nl0gLSBVbmFibGUgdG8gcGFzcyBtdWx0aXBsZSAiLS1nZW4iIG9wdGlvbnMgdG8gdGhlIHRocmlmdCBjb21waWxlcgorICAgICogW1RIUklGVC0yNDM4XSAtIFVuZXhwZWN0ZWQgcmVhZEZpZWxkRW5kIGNhbGwgY2F1c2VzIEpTT04gUGFyc2luZyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjQ5OF0gLSBFcnJvciBtZXNzYWdlICJJbnZhbGlkIG1ldGhvZCBuYW1lIiB3aGlsZSB0cnlpbmcgdG8gY2FsbCBIQmFzZSBUaHJpZnQgQVBJCisgICAgKiBbVEhSSUZULTg0MV0gLSBCdWlsZCBjcnVmdAorICAgICogW1RIUklGVC0yNTcwXSAtIFdyb25nIFVSTCBnaXZlbiBpbiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZGV2ZWxvcGVycworICAgICogW1RIUklGVC0yNjA0XSAtIEZpeCBkZWJpYW4gcGFja2FnaW5nCisgICAgKiBbVEhSSUZULTI2MThdIC0gVW5pZ25vcmUgL2FjbG9jYWwgZmlsZXMgcmVxdWlyZWQgZm9yIGJ1aWxkCisgICAgKiBbVEhSSUZULTI1NjJdIC0gLi9jb25maWd1cmUgY3JlYXRlIE1ha2VGaWxlIGluIGxpYi9kIHdpdGggZXJyb3JzCisgICAgKiBbVEhSSUZULTI1OTNdIC0gVW5hYmxlIHRvIGJ1aWxkIHRocmlmdCBvbiB1YnVudHUtMTIuMDQgKFByZWNpc2UpCisgICAgKiBbVEhSSUZULTI0NjFdIC0gQ2FuJ3QgaW5zdGFsbCB0aHJpZnQtMC44LjAgb24gT1MgWCAxMC45LjIKKyAgICAqIFtUSFJJRlQtMjYwMl0gLSBGaXggbWlzc2luZyBkaXN0IGZpbGVzCisgICAgKiBbVEhSSUZULTI2MjBdIC0gRml4IHB5dGhvbiBwYWNrYWdpbmcKKyAgICAqIFtUSFJJRlQtMjU0NV0gLSBUZXN0IENQUCBmYWlscyB0byBidWlsZCAocG9zc2libHkgdHlwbykKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yMTU1XSAtIEFkZGluZyBvbmUgbGluZXIgZ3VpZGUgdG8gcmVuYW1lIHRoZSB2ZXJzaW9uLmguaW4gYW5kIHJlbmFtZSB0aHJpZnR5LmNjLmgKKyAgICAqIFtUSFJJRlQtMTk5MV0gLSBBZGQgZXhjZXB0aW9ucyB0byBleGFtcGxlcworICAgICogW1RIUklGVC0yMzM0XSAtIGFkZCBhIHR1dG9yaWFsIGZvciBub2RlIEpTCisgICAgKiBbVEhSSUZULTIzOTJdIC0gQWN0aW9uc2NyaXB0IHR1dG9yaWFsCisgICAgKiBbVEhSSUZULTIzODNdIC0gY29udHJpYjogc2FtcGxlIGZvciBjb25uZWN0aW5nIFRocmlmdCB3aXRoIFJlYnVzCisgICAgKiBbVEhSSUZULTIzODJdIC0gY29udHJpYjogc2FtcGxlIGZvciBjb25uZWN0aW5nIFRocmlmdCB3aXRoIFNUT01QCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE0NTddIC0gQ2FwYWNpdHkgb2YgVGZyYW1lZFRyYW5zcG9ydCB3cml0ZSBidWZmZXIgaXMgbmV2ZXIgcmVzZXQKKyAgICAqIFtUSFJJRlQtMTEzNV0gLSBOb2RlLmpzIHR1dG9yaWFsCisgICAgKiBbVEhSSUZULTEzNzFdIC0gU29ja2V0IHRpbWVvdXRzIChTT19SQ1ZUSU1FTyBhbmQgU09fU05EVElNRU8pIG5vdCBzdXBwb3J0ZWQgb24gU29sYXJpcworICAgICogW1RIUklGVC0yMTQyXSAtIE1pbm9yIHR3ZWFrcyB0byB0aHJpZnQuZWwgZm9yIGJldHRlciBlbWFjcyBwYWNrYWdlIGNvbXBhdGliaWxpdHkKKyAgICAqIFtUSFJJRlQtMjI2OF0gLSBNb2RpZnkgVFNhc2xUcmFuc3BvcnQgdG8gaWdub3JlIFRDUCBoZWFsdGggY2hlY2tzIGZyb20gbG9hZGJhbGFuY2VycworICAgICogW1RIUklGVC0yMjY0XSAtIEdpdEh1YiBwYWdlIGluY29ycmVjdGx5IHN0YXRlcyB0aGF0IFRocmlmdCBpcyBzdGlsbCBpbmN1YmF0aW5nCisgICAgKiBbVEhSSUZULTIyNjNdIC0gQWx3YXlzIGdlbmVyYXRlIGdvb2QgaGFzaENvZGUgZm9yIEphdmEKKyAgICAqIFtUSFJJRlQtMjIzM10gLSBKYXZhIGNvbXBpbGVyIHNob3VsZCBkZWZlbnNpdmVseSBjb3B5IGl0cyBiaW5hcnkgaW5wdXRzCisgICAgKiBbVEhSSUZULTIyMzldIC0gQWRkcmVzcyBGaW5kQnVncyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjI0OV0gLSBBZGQgU01QIEJ1aWxkIG9wdGlvbiB0byB0aHJpZnQuc3BlYyAoYW5kIHRocmVlIGNvbmZpZyBkZWZpbmVzKQorICAgICogW1RIUklGVC0yMjU0XSAtIEV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGJ5IEdvIGNvbXBpbGVyIHNob3VsZCBpbXBsZW1lbnQgZXJyb3IgaW50ZXJmYWNlCisgICAgKiBbVEhSSUZULTIyNjBdIC0gVGhyaWZ0IGltcG9zZXMgdW5uZWVkZWQgZGVwZW5kZW5jeSBvbiBjb21tb25zLWxhbmczCisgICAgKiBbVEhSSUZULTIyNThdIC0gQWRkIFRMUyB2MS4xLzEuMiBzdXBwb3J0IHRvIFRTU0xTb2NrZXQuY3BwCisgICAgKiBbVEhSSUZULTIyMDVdIC0gTm9kZS5qcyBUZXN0IFNlcnZlciB0byBzdXBwb3J0IHRlc3QuanMgSmF2YVNjcmlwdCBCcm93c2VyIHRlc3QgYW5kIHN1bmRyeSBmaXhlcworICAgICogW1RIUklGVC0yMjA0XSAtIFNTTCBjbGllbnQgZm9yIHRoZSBjb2NvYSBjbGllbnQKKyAgICAqIFtUSFJJRlQtMjE3Ml0gLSBKYXZhIGNvbXBpbGVyIGFsbG9jYXRlcyBvcHRpb25hbHMgYXJyYXkgZm9yIGV2ZXJ5IHN0cnVjdCB3aXRoIGFuIG9wdGlvbmFsIGZpZWxkCisgICAgKiBbVEhSSUZULTIxODVdIC0gdXNlIGNhYmFsIGluc3RlYWQgb2YgcnVuaGFza2VsbCBpbiBoYXNrZWxsIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMTkyNl0gLSBQSFAgQ29uc3RhbnQgR2VuZXJhdGlvbiBSZWZhY3RvcmluZworICAgICogW1RIUklGVC0yMDI5XSAtIFBvcnQgQysrIHRlc3RzIHRvIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMjA1NF0gLSBUU2ltcGxlRmlsZVRyYW5zcG9ydCAtIEphdmEgTGliIGhhcyBubyBzdHJhaWdodCBmb3J3YXJkIFRUcmFuc3BvcnQgYmFzZWQgZmlsZSB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjA0MF0gLSAidW5pbml0aWFsaXplZCB2YXJpYWJsZSIgd2FybmluZ3Mgb24gTVNWQy93aW5kb3dzCisgICAgKiBbVEhSSUZULTIwMzRdIC0gR2l2ZSBkZXZlbG9wZXJzJyBDKysgY29kZSBkaXJlY3QgYWNjZXNzIHRvIHNvY2tldCBGRHMgb24gc2VydmVyIHNpZGUKKyAgICAqIFtUSFJJRlQtMjA5NV0gLSBVc2UgcHJpbnQgZnVuY3Rpb24gZm9yIFB5dGhvbiAzIGNvbXBhdGlibGl0eQorICAgICogW1RIUklGVC0xODY4XSAtIE1ha2UgdGhlIFRQQyBiYWNrbG9nIGNvbmZpZ3VyYWJsZSBpbiB0aGUgSmF2YSBzZXJ2ZXJzCisgICAgKiBbVEhSSUZULTE4MTNdIC0gQWRkIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbiB0byBnZW5lcmF0ZWQgY2xhc3NlcworICAgICogW1RIUklGVC0xODE1XSAtIENvZGUgZ2VuZXJhdG9ycyBsaW5lIGJ1ZmZlciBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMjMwNV0gLSBURnJhbWVkVHJhbnNwb3J0IGVtcHR5IGNvbnN0cnVjdG9yIHNob3VsZCBwcm9iYWJseSBiZSBwcml2YXRlCisgICAgKiBbVEhSSUZULTIzMDRdIC0gTW92ZSBjbGllbnQgYXNzaWdubWVudHMgZnJvbSBjb25zdHJ1dG9yIGluIG1ldGhvZAorICAgICogW1RIUklGVC0yMzA5XSAtIFJ1YnkgKGdlbSkgJiBQSFAgUlBNIHN1YnBhY2thZ2VzCisgICAgKiBbVEhSSUZULTIzMThdIC0gcGVybDogZGVwZW5kZW5jeSBDbGFzczo6QWNjZXNzb3Igbm90IGNoZWNrZWQKKyAgICAqIFtUSFJJRlQtMjMxN10gLSBleGNsdWRlIHR1dG9yaWFsIGZyb20gYnVpbGQKKyAgICAqIFtUSFJJRlQtMjMyMF0gLSBQcm9ncmFtIGxldmVsIGRvY3RleHQgZG9lcyBub3QgZ2V0IGF0dGFjaGVkIGJ5IHBhcnNlcgorICAgICogW1RIUklGVC0yMzQ5XSAtIEdvbGFuZyAtIGltcHJvdmUgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMjM0OF0gLSBQSFAgR2VuZXJhdG9yOiBhZGQgYXJyYXkgdHlwZWhpbnQgdG8gZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTIzNDRdIC0gY29uZmlndXJlLmFjOiBjb21waWxlci1vbmx5IG9wdGlvbgorICAgICogW1RIUklGVC0yMzQzXSAtIEdvbGFuZyAtIFJldHVybiBhIHNpbmdsZSBlcnJvciBmb3IgYWxsIGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiBtdWx0aXBsZSByZXR1cm4gdmFsdWVzCisgICAgKiBbVEhSSUZULTIzNDFdIC0gRW5hYmxlIGdlbmVyYXRpb24gb2YgRGVscGhpIFhNTERvYyBjb21tZW50cyAoYS5rLmEuICJIZWxwIEluc2lnaHQiKQorICAgICogW1RIUklGVC0yMzU1XSAtIEFkZCBTU0wgYW5kIFdlYiBTb2NrZXQgU3VwcG9ydCB0byBOb2RlIGFuZCBKYXZhU2NyaXB0CisgICAgKiBbVEhSSUZULTIzNTBdIC0gQWRkIGFzeW5jIGNhbGxzIHRvIG5vcm1hbCBKYXZhU2NyaXB0CisgICAgKiBbVEhSSUZULTIzMzBdIC0gR2VuZXJhdGUgUEhQRG9jIGNvbW1lbnRzCisgICAgKiBbVEhSSUZULTIzMzJdIC0gUlBNQlVJTEQ6IHJ1biBib290c3RyYXAgKGlmIG5lZWRlZCkKKyAgICAqIFtUSFJJRlQtMjM5MV0gLSBzaW1wbGUgc29ja2V0IHRyYW5zcG9ydCBmb3IgYWN0aW9uc2NyaXB0IDMuMAorICAgICogW1RIUklGVC0yMzc2XSAtIG5vZGVqczogYWxsb3cgUHJvbWlzZSBzdHlsZSBjYWxscyBmb3IgY2xpZW50IGFuZCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjM2OV0gLSBBZGQgc3NsIHN1cHBvcnQgZm9yIG5vZGVqcyBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yNDAxXSAtIEhhc2tlbGwgdHV0b3JpYWwgY29tcGlsZXMKKyAgICAqIFtUSFJJRlQtMjQxN10gLSBDIyBVbmlvbiBjbGFzc2VzIGFyZSBub3QgcGFydGlhbAorICAgICogW1RIUklGVC0yNDE1XSAtIE5hbWVkIHBpcGVzIHNlcnZlciBwZXJmb3JtYW5jZSAmIG1lc3NhZ2UgbW9kZQorICAgICogW1RIUklGVC0yNDA0XSAtIGVtaXQgd2FybmluZyBvbiAodHlwaWNhbGx5IGluZWZmaWNpZW50KSBsaXN0PGJ5dGU+CisgICAgKiBbVEhSSUZULTIzOThdIC0gSW1wcm92ZSBOb2RlIFNlcnZlciBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTIzOTddIC0gQWRkIENPUlMgYW5kIENTUCBzdXBwb3J0IGZvciBKYXZhU2NyaXB0IGFuZCBOb2RlLmpzIGxpYnJhcmllcworICAgICogW1RIUklGVC0yNDA3XSAtIHVzZSBtYXJrZG93biAocmVuYW1lIFJFQURNRSA9PiBSRUFETUUubWQpCisgICAgKiBbVEhSSUZULTIzMDBdIC0gRCBjb25maWd1cmUgaW5mbyBvdXRwdXQgc2hvdWxkIGZvbGxvdyBzYW1lIGZvcm1hdCBhcyBvdGhlciBsYW5ndWFnZXMKKyAgICAqIFtUSFJJRlQtMjU3OV0gLSBXaW5kb3dzIENFIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjU3NF0gLSBDb21waWxlciBvcHRpb24gdG8gZ2VuZXJhdGUgbmFtZXNwYWNlIGRpcmVjdG9yaWVzIGZvciBSdWJ5CisgICAgKiBbVEhSSUZULTI1NzFdIC0gU2ltcGxpZnkgY3Jvc3MgY29tcGlsYXRpb24gdXNpbmcgQ01ha2UKKyAgICAqIFtUSFJJRlQtMjU2OV0gLSBJbnRyb2R1Y2UgZmlsZSB0byBzcGVjaWZ5IHRoaXJkIHBhcnR5IGxpYnJhcnkgbG9jYXRpb25zIG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMjU2OF0gLSBJbXBsZW1lbnQgb3duIGNlcnRpZmljYXRlIGhhbmRsZXIKKyAgICAqIFtUSFJJRlQtMjU1Ml0gLSBlbGltaW5hdGUgd2FybmluZyBmcm9tIGNvbmZpZ3VyZS5hYworICAgICogW1RIUklGVC0yNTQ5XSAtIEdlbmVyYXRlIGpzb24gdGFnIGZvciBzdHJ1Y3QgbWVtYmVycy4gdXNlIGdvLnRhZyBhbm5vdGF0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGdlbmVyYXRlZCB0YWcuCisgICAgKiBbVEhSSUZULTI1NDRdIC0gQWRkIHN1cHBvcnQgZm9yIHNvY2tldCB0cmFuc3BvcnQgZm9yIGMjIGxpYnJhcnkgd2hlbiB1c2luZyBXaW5kb3dzIFBob25lIHByb2plY3RzCisgICAgKiBbVEhSSUZULTI0NTNdIC0gaGFza2VsbCB0dXRvcmlhbDogZml4IHVwIGRpdmlzaW9uIGJ5IDAgZXhhbXBsZQorICAgICogW1RIUklGVC0yNDQ5XSAtIEVuaGFuY2UgdHlwZWRlZiBzdHJ1Y3R1cmUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmb3J3YXJkcyBhbmQgcmVhbCB0eXBlZGVmcworICAgICogW1RIUklGVC0yNDQ2XSAtIFRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUgc2VydmVyIHN0cmVhbSBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjQ1NV0gLSBBbGxvdyBjbGllbnQgY2VydGlmaWNhdGVzIHRvIGJlIHVzZWQgd2l0aCBUSHR0cENsaWVudAorICAgICogW1RIUklGVC0yNTExXSAtIE5vZGUuanMgbmVlZHMgdGhlIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQ5M10gLSBOb2RlLmpzIGxpYiBuZWVkcyBIVFRQIGNsaWVudAorICAgICogW1RIUklGVC0yNTAyXSAtIE9wdGltaXplIGdvIGltcGxlbWVudGF0aW9ucyBvZiBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2xzIGZvciBzcGVlZAorICAgICogW1RIUklGVC0yNDk0XSAtIEFkZCBlbnVtIHRvU3RyaW5nIGhlbHBlciBmdW5jdGlvbiBpbiBjX2dsaWIKKyAgICAqIFtUSFJJRlQtMjQ3MV0gLSBNYWtlIGNwcC5yZWYgYW5ub3RhdGlvbiBsYW5ndWFnZSBhZ25vc3RpYworICAgICogW1RIUklGVC0yNDk3XSAtIHNlcnZlciBhbmQgY2xpZW50IGZvciB0ZXN0L2dvLCBhbHNvIHNldmVyYWwgZml4ZXMgYW5kIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0yNTM1XSAtIFRKU09OUHJvdG9jb2wgd2hlbiBzZXJpYWxpemVkIHlpZWxkcyBURmllbGQgaWRzIHJhdGhlciB0aGFuIG5hbWVzCisgICAgKiBbVEhSSUZULTIyMjBdIC0gQWRkIGEgbmV3IHN0cnVjdCBzdHJ1Y3R2PworICAgICogW1RIUklGVC0xMzUyXSAtIFRocmlmdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtOTg5XSAtIFB1c2ggYm9vc3QgbTQgbWFjcm9zIHVwc3RyZWFtCisgICAgKiBbVEhSSUZULTEzNDldIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHByaW50IG91dHMKKyAgICAqIFtUSFJJRlQtMjQ5Nl0gLSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdGVzdC9nbywgYWxzbyBzZXZlcmFsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMTExNF0gLSBNYXZlbiBwdWJsaXNoIHNob3VsZG4ndCByZXF1aXJlIHBhc3N3b3JkcyBoYXJkY29kZWQgaW4gc2V0dGluZ3MueG1sCisgICAgKiBbVEhSSUZULTIwNDNdIC0gdmlzdWFsIDIwMTAgd2FybmluZ3MgLSB1bnJlYWNoYWJsZSBjb2RlCisgICAgKiBbVEhSSUZULTE2ODNdIC0gSW1wbGVtZW50IGFsdGVybmF0aXZlcyB0byBKYXZhc2NyaXB0IENsaWVudCBzaWRlIFRyYW5zcG9ydCBwcm90b2NvbCwganVzdCBhcyBOUEFQSSBhbmQgV2ViU29ja2V0LgorICAgICogW1RIUklGVC0xNzQ2XSAtIHByb3ZpZGUgYSBTUERYIGZpbGUKKyAgICAqIFtUSFJJRlQtMTc3Ml0gLSBTZXJpYWxpemF0aW9uIGRvZXMgbm90IGNoZWNrIHR5cGVzIG9mIGVtYmVkZGVkIHN0cnVjdHVyZXMuCisgICAgKiBbVEhSSUZULTIzODddIC0gbm9kZWpzOiBleHRlcm5hbCBpbXBvcnRzIHNob3VsZCBiZSBjZW50cmFsaXplZCBpbiBpbmRleC5qcworICAgICogW1RIUklGVC0yMDM3XSAtIE1vcmUgZ2VuZXJhbCBtYWNybyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTEwMTJdIC0gVHJhbnNwb3J0IGZvciBEYXRhSW5wdXQgRGF0YU91dHB1dCBpbnRlcmZhY2UKKyAgICAqIFtUSFJJRlQtMjI1Nl0gLSBVc2luZyBjKysxMS9jKysweCBzdGQgbGlicmFyeSAgcmVwbGFjZSBib29zdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIyNTBdIC0gSlNPTiBhbmQgTWVtb3J5QnVmZmVyIGZvciBKYXZhTUUKKyAgICAqIFtUSFJJRlQtMjExNF0gLSBQeXRob24gU2VydmljZSBSZW1vdGUgU1NMIE9wdGlvbgorICAgICogW1RIUklGVC0xNzE5XSAtIFNBU0wgY2xpZW50IHN1cHBvcnQgZm9yIFB5dGhvbgorICAgICogW1RIUklGVC0xODk0XSAtIFRocmlmdCBtdWx0aS10aHJlYWRlZCBhc3luYyBKYXZhIFNlcnZlciB1c2luZyBKYXZhIDcgQXN5bmNocm9ub3VzQ2hhbm5lbEdyb3VwCisgICAgKiBbVEhSSUZULTE4OTNdIC0gSFRUUC9KU09OIHNlcnZlci9jbGllbnQgZm9yIG5vZGUganMKKyAgICAqIFtUSFJJRlQtMjM0N10gLSBDIyBUTFMgVHJhbnNwb3J0IGJhc2VkIG9uIFRIUklGVC0xODEKKyAgICAqIFtUSFJJRlQtMjM3N10gLSBBbGxvdyBhZGRpdGlvbiBvZiBjdXN0b20gSFRUUCBIZWFkZXJzIHRvIGFuIEhUVFAgVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTI0MDhdIC0gTmFtZWQgUGlwZSBUcmFuc3BvcnQgT3B0aW9uIGZvciBDIworICAgICogW1RIUklGVC0yNTcyXSAtIEFkZCBzdHJpbmcvY29sbGVjdGlvbiBsZW5ndGggbGltaXQgY2hlY2tzIChmcm9tIEMrKykgdG8gamF2YSBwcm90b2NvbCByZWFkZXJzCisgICAgKiBbVEhSSUZULTI0NjldIC0gImphdmE6ZnVsbGNhbWVsIiBvcHRpb24gdG8gYXV0b21hdGljYWxseSBjYW1lbC1jYXNlIHVuZGVyc2NvcmVkIGF0dHJpYnV0ZSBuYW1lcworICAgICogW1RIUklGVC03OTVdIC0gSW1wb3J0aW5nIHNlcnZpY2UgZnVuY3Rpb25zIChzaW11bGF0aW9uIG11bHRpcGxlIGluaGVyaXRhbmNlKQorICAgICogW1RIUklGVC0yMTY0XSAtIEFkZCBhIEdldC9Qb3N0IEh0dHAgU2VydmVyIHRvIE5vZGUgYWxvbmcgd2l0aCBleGFtcGxlcworICAgICogW1RIUklGVC0yMjU1XSAtIGFkZCBQYXJlbnQgQ2xhc3MgZm9yIGdlbmVyYXRlZCBTdHJ1Y3QgY2xhc3MKKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMjUzOV0gLSBUc29ja2V0LmNwcCBhZGRyaW5mbyBhaV9mbGFncyA9IEFJX0FERFJDT05GSUcKKyAgICAqIFtUSFJJRlQtMjQ0MF0gLSBob3cgdG8gY29ubmVjdCBhczMgdG8gamF2YSBieSB0aHJpZnQgLAorICAgICogW1RIUklGVC0yMzc5XSAtIE1lbW1vcnkgbGVha2luZyB3aGlsZSB1c2luZyBtdWx0aXRocmVhZGluZyBpbiBDKysgc2VydmVyLgorICAgICogW1RIUklGVC0yMjc3XSAtIFRocmlmdDogaW5zdGFsbGluZyBmYjMwMyBlcnJvcgorICAgICogW1RIUklGVC0yNTY3XSAtIENzaGFycCBzbG93ID8KKyAgICAqIFtUSFJJRlQtMjU3M10gLSB0aHJpZnQgMC45LjIgcmVsZWFzZQorCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC05ODFdIC0gY29jb2E6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjEzMl0gLSBHbzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjI5OV0gLSBUSnNvblByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBSdWJ5IGRvZXMgbm90IGFsbG93IGZvciBib3RoIHBvc3NpYmxlIHNsYXNoIChzb2xpZHVzKSBlbmNvZGluZ3MKKyAgICAqIFtUSFJJRlQtMjI5OF0gLSBUSnNvblByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBDIyBkb2VzIG5vdCBhbGxvdyBmb3IgYm90aCBwb3NzaWJsZSBzbGFzaCAoc29saWR1cykgZW5jb2RpbmdzCisgICAgKiBbVEhSSUZULTIyOTddIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgRGVscGhpIGRvZXMgbm90IGFsbG93IGZvciBib3RoIHBvc3NpYmxlIHNsYXNoIChzb2xpZHVzKSBlbmNvZGluZ3MKKyAgICAqIFtUSFJJRlQtMjI3MV0gLSBKYXZhU2NyaXB0OiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMjI1MV0gLSBnbyB0ZXN0IGZvciBjb21wYWN0IHByb3RvY29sIGlzIG5vdCBydW5uaW5nCisgICAgKiBbVEhSSUZULTIxOTVdIC0gRGVscGhpOiBBZGQgZXZlbnQgaGFuZGxlcnMgZm9yIHNlcnZlciBhbmQgcHJvY2Vzc2luZyBldmVudHMKKyAgICAqIFtUSFJJRlQtMjE3Nl0gLSBUU2ltcGxlSlNPTlByb3RvY29sLlJlYWRGaWVsZEJlZ2luKCkgZG9lcyBub3QgcmV0dXJuIGZpZWxkIHR5cGUgYW5kIElECisgICAgKiBbVEhSSUZULTIxNzVdIC0gV3JvbmcgZmllbGQgdHlwZSBzZXQgZm9yIGJpbmFyeQorICAgICogW1RIUklGVC0yMTc0XSAtIERlc2VyaWFsaXppbmcgSlNPTiBmYWlscyBpbiBzcGVjaWZpYyBjYXNlcworICAgICogW1RIUklGVC0yMDUzXSAtIE5vZGVKUzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTE5MTRdIC0gUHl0aG9uOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0xODEwXSAtIGFkZCBydWJ5IHRvIHRlc3QvdGVzdC5zaAorICAgICogW1RIUklGVC0yMzEwXSAtIFBIUDogQ2xpZW50LXNpZGUgc3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTIzNDZdIC0gQyM6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yMzQ1XSAtIERlbHBoaTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTIzMzhdIC0gRmlyc3QgZG9jdGV4dCB3cm9uZ2x5IGludGVycHJldGVkIGFzIHByb2dyYW0gZG9jdGV4dCBpbiBzb21lIGNhc2VzCisgICAgKiBbVEhSSUZULTIzMjVdIC0gU1NMIHRlc3QgY2VydGlmaWNhdGVzCisgICAgKiBbVEhSSUZULTIzNThdIC0gQysrOiBhZGQgY29tcGFjdCBwcm90b2NvbCB0byBjcm9zcyBsYW5ndWFnZSB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTI0MjVdIC0gUEhQOiBTZXJ2ZXItc2lkZSBzdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMjQyMV0gLSBUcmVlL1JlY3Vyc2l2ZSBzdHJ1Y3Qgc3VwcG9ydCBpbiB0aHJpZnQKKyAgICAqIFtUSFJJRlQtMjI5MF0gLSBVcGRhdGUgR28gdHV0b3JpYWwgdG8gYWxpZ24gd2l0aCBUSFJJRlQtMjIzMgorICAgICogW1RIUklGVC0yNTU4XSAtIENTaGFycCBjb21waWxlciBnZW5lcmF0b3IgdHJpZXMgdG8gY29uY2F0IGludHMgd2l0aCBzdHJpbmdzIHVzaW5nICsKKyAgICAqIFtUSFJJRlQtMjUwN10gLSBBZGRpdGlvbmFsIExVQSBUUHJvdG9jb2xFeGNlcHRpb24gZXJyb3IgY29kZSBuZWVkZWQ/CisgICAgKiBbVEhSSUZULTI0OTldIC0gQ29tcGlsZXI6IGFsbG93IGFubm90YXRpb25zIHdpdGhvdXQgIj0gdmFsdWUiCisgICAgKiBbVEhSSUZULTI1MzRdIC0gQ3Jvc3MgbGFuZ3VhZ2UgdGVzdCByZXN1bHRzIHNob3VsZCByZWNvcmRlZCB0byBhIHN0YXR1cy5tZCBvciBzdGF0dXMuaHRtbCBmaWxlIGF1dG9tYXRpY2FsbHkKKyAgICAqIFtUSFJJRlQtNjZdIC0gSmF2YTogQWxsb3cgbXVsdGlwbGV4aW5nIG11bHRpcGxlIHNlcnZpY2VzIG92ZXIgYSBzaW5nbGUgVENQIGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtMTY4MV0gLSBBZGQgTHVhIFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTcyN10gLSBSdWJ5LTEuOTogZGF0YSBsb3NzOiAiYmluYXJ5IiBmaWVsZHMgYXJlIHJlLWVuY29kZWQKKyAgICAqIFtUSFJJRlQtMTcyNl0gLSBSdWJ5LTEuOTogImJpbmFyeSIgZmllbGRzIGFyZSByZXByZXNlbnRlZCBieSBzdHJpbmcgd2hvc2UgZW5jb2RpbmcgaXMgIlVURi04IgorICAgICogW1RIUklGVC05ODhdIC0gcGVybDogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeSB2aWEgY29uZmlndXJlCisgICAgKiBbVEhSSUZULTMzNF0gLSBDb21wYWN0IFByb3RvY29sIGZvciBQSFAKKyAgICAqIFtUSFJJRlQtMjQ0NF0gLSBwdWxsIHJlcXVlc3QgODg6IHRocmlmdDogY2xlYW4gdXAgZW51bSB2YWx1ZSBhc3NpZ25tZW50CisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMjIyM10gLSBTcGFtIGxpbmtzIG9uIHdpa2kKKyAgICAqIFtUSFJJRlQtMjU2Nl0gLSBQbGVhc2UgY3JlYXRlIGEgRE9BUCBmaWxlIGZvciB5b3VyIFRMUAorICAgICogW1RIUklGVC0yMjM3XSAtIFVwZGF0ZSBhcmNoaXZlIHRvIGNvbnRhaW4gYWxsIHZlcnNpb25zCisgICAgKiBbVEhSSUZULTk2Ml0gLSBUdXRvcmlhbCBwYWdlIG9uIG91ciB3ZWJzaXRlIGlzIHJlYWxseSB1bmhlbHBmdWwKKworIyMgVGVzdAorICAgICogW1RIUklGVC0yMzI3XSAtIG5vZGVqczogbm9kZWpzIHRlc3Qgc3VpdGUgc2hvdWxkIGJlIGJ1bmRsZWQgd2l0aCB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC0yNDQ1XSAtIFRIUklGVC0yMzg0IChjb2RlIGdlbmVyYXRpb24gZm9yIGdvIG1hcHMgd2l0aCBiaW5hcnkga2V5cykgc2hvdWxkIGJlIHRlc3RlZAorICAgICogW1RIUklGVC0yNTAxXSAtIEMjIFRoZSB0ZXN0IHBhcmFtZXRlcnMgZnJvbSB0aGUgVGVzdFNlcnZlciBhbmQgVGVzdENsaWVudCBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy90ZXN0LworCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTIxOTBdIC0gQWRkIHRoZSBKYXZhU2NyaXB0IHRocmlmdC5qcyBsaWIgdG8gdGhlIEJvd2VyIHJlZ2lzdHJ5CisgICAgKiBbVEhSSUZULTIwNzZdIC0gYm9vc3Q6Om9wdGlvbmFsIGluc3RlYWQgb2YgX19pc3NldAorCisKKworVGhyaWZ0IDAuOS4xCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTE0NDBdIC0gZGViaWFuIHBhY2thZ2luZzogbWlub3ItaXNoIHBvbGljeSBwcm9ibGVtcworICAgICogW1RIUklGVC0xNDAyXSAtIEdlbmVyYXRlZCBZX3R5cGVzLmpzIGRvZXMgbm90IHJlcXVpcmUoKSBYX3R5cGVzLmpzIHdoZW4gYW4gaW5jbHVkZSBpbiB0aGUgSURMIGZpbGUgd2FzIHVzZWQKKyAgICAqIFtUSFJJRlQtMTU1MV0gLSAyIHRocmlmdCBmaWxlIGRlZmluZSBvbmx5IHN0cnVjdCAobm8gc2VydmljZSksIG9uZSBpbmNsdWRlIGFub3RoZXIsIHRoZSBnZW4gbm9kZWpzIGZpbGUgZGlkbid0IGhhdmUgInJlcXVpcmVzIiBhdCB0aGUgdG9wCisgICAgKiBbVEhSSUZULTEyNjRdIC0gVFNvY2tldENsaWVudCBpcyBxdWVyaWVkIGJ5IHJ1biBsb29wIGFmdGVyIGRlYWxsb2NhdGlvbiBpbiBDb2NvYQorICAgICogW1RIUklGVC0xNjAwXSAtIFRocmlmdCBHbyBDb21waWxlciBhbmQgTGlicmFyeSBvdXQgb2YgZGF0ZSB3aXRoIEdvIDEgUmVsZWFzZS4KKyAgICAqIFtUSFJJRlQtMTYwM10gLSBUaHJpZnQgSURMIGFsbG93cyBmb3IgbXVsdGlwbGUgZXhjZXB0aW9ucywgYXJncyBvciBzdHJ1Y3QgbWVtYmVyIG5hbWVzIHRvIGJlIHRoZSBzYW1lCisgICAgKiBbVEhSSUZULTEwNjJdIC0gUHJvYmxlbXMgd2l0aCBweXRob24gdHV0b3JpYWxzCisgICAgKiBbVEhSSUZULTg2NF0gLSBkZWZhdWx0IHZhbHVlIGZhaWxzIGlmIGlkZW50aWZpZXIgaXMgYSBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtOTMwXSAtIFJ1YnkgYW5kIEhhc2tlbGwgYmluZGluZ3MgZG9uJ3QgcHJvcGVybHkgc3VwcG9ydCBERVNURElSIChtYWtlcyBwYWNrYWdpbmcgcGFpbmZ1bCkKKyAgICAqIFtUSFJJRlQtODIwXSAtIFRoZSByZWFkTGVuZ3RoIGF0dHJpYnV0ZSBvZiBUQmluYXJ5UHJvdG9jb2wgaXMgdXNlZCBhcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSBhbmQgaXMgZGVjcmVtZW50ZWQgb24gZWFjaCBjYWxsIG9mIGNoZWNrUmVhZExlbmd0aAorICAgICogW1RIUklGVC0xNjQwXSAtIE5vbmUgb2YgdGhlIHR1dG9yaWFscyBsaW5rZWQgb24gdGhlIHdlYnNpdGUgY29udGFpbiBjb250ZW50CisgICAgKiBbVEhSSUZULTE2MzddIC0gTlBNIHJlZ2lzdHJ5IGRvZXMgbm90IGluY2x1ZGUgdmVyc2lvbiAwLjgKKyAgICAqIFtUSFJJRlQtMTY0OF0gLSBOb2RlSlMgY2xpZW50cyBhbHdheXMgcmVjZWl2ZSAwIGZvciAnZG91YmxlJyB2YWx1ZXMuCisgICAgKiBbVEhSSUZULTE2NjBdIC0gUHl0aG9uIFRocmlmdCBsaWJyYXJ5IGNhbiBiZSBpbnN0YWxsZWQgd2l0aCBwaXAgYnV0IG5vdCBlYXN5X2luc3RhbGwKKyAgICAqIFtUSFJJRlQtMTY1N10gLSBDaHJvbWUgYnJvd3NlciBzZW5kaW5nIE9QVElPTlMgbWV0aG9kIGJlZm9yZSBQT1NUIGluIHhtbEh0dHBSZXF1ZXN0CisgICAgKiBbVEhSSUZULTIxMThdIC0gQ2VydGlmaWNhdGUgZXJyb3IgaGFuZGxpbmcgc3RpbGwgaW5jb3JyZWN0CisgICAgKiBbVEhSSUZULTIxMzddIC0gUnVieSB0ZXN0IGxpYiBmYWlscyBqZW5raW5zIGJ1aWxkICM4NjQKKyAgICAqIFtUSFJJRlQtMjEzNl0gLSBWYWdyYW50IGJ1aWxkIG5vdCBjb21waWxpbmcgamF2YSwgcnVieSwgcGhwLCBnbyBsaWJzIGR1ZSB0byBtaXNzaW5nIGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC0yMTM1XSAtIEdPIGxpYiBsZWF2ZXMgYmVoaW5kIHRlc3QgZmlsZXMgdGhhdCBhcmUgYXV0byBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMjEzNF0gLSBtaW5ndy1jcm9zcy1jb21waWxlIHNjcmlwdCBmYWlsaW5nIHdpdGggc3RyaXAgZXJyb3JzCisgICAgKiBbVEhSSUZULTIxMzNdIC0gamF2YSBUZXN0VEJpbmFyeVByb3RvY29sLmphdmEgdGVzdCBmYWlsaW5nCisgICAgKiBbVEhSSUZULTIxMjZdIC0gbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1NURCogZmlsZXMgbWlzc2luZyBmcm9tIERJU1QKKyAgICAqIFtUSFJJRlQtMjEyNV0gLSBkZWJpYW4gbWlzc2luZyBmcm9tIERJU1QKKyAgICAqIFtUSFJJRlQtMjEyNF0gLSAubywgLnNvLCAubGEsIC5kZXBzLCAubGlicywgZ2VuLSogZmlsZXMgbGVmdCB0dXRvcmlhbHMsIHRlc3QgYW5kIGxpYi9jcHAgd2hlbiBtYWtpbmcgRElTVAorICAgICogW1RIUklGVC0yMTIzXSAtIEdPIGxpYiBtaXNzaW5nIGZpbGVzIGluIERJU1QgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjEyMV0gLSBDb21waWxhdGlvbiBidWcgZm9yIE5vZGUuanMKKyAgICAqIFtUSFJJRlQtMjEyOV0gLSBwaHAgZXh0IG1pc3NpbmcgZnJvbSBkaXN0CisgICAgKiBbVEhSSUZULTIxMjhdIC0gbGliIEdPIHRlc3RzIGZhaWwgd2l0aCBmdW5jdCBlbmRzIHdpdGhvdXQgYSByZXR1cm4gc3RhdGVtZW50CisgICAgKiBbVEhSSUZULTIyODZdIC0gRmFpbGVkIHRvIGNvbXBpbGUgVGhyaWZ0MC45LjEgd2l0aCBib29zdDEuNTUgYnkgVlMyMDEwIGlmIHNlbGVjdCBEZWJ1Zy1tdCZ4NjQgbW9kZS4KKyAgICAqIFtUSFJJRlQtMTk3M10gLSBUQ29tcGFjdFByb3RvY29sIGluIEMjIGxpYiBkb2VzIG5vdCBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIG5lZ2F0aXZlIGludDMyIGFuZCBpbnQ2NCBudW1iZXIgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTE5OTJdIC0gY2FzdHMgaW4gVENvbXBhY3RQcm90b2NvbC50Y2MgY2F1c2luZyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIiB3YXJuaW5ncyBmcm9tIGdjYworICAgICogW1RIUklGVC0xOTMwXSAtIEMjIGdlbmVyYXRlcyB1bnNpZ25lZCBieXRlIGZvciBUaHJpZnQgImJ5dGUiIHR5cGUKKyAgICAqIFtUSFJJRlQtMTkyOV0gLSBVcGRhdGUgd2Vic2l0ZSB0byB1c2UgTWlycm9ycyBmb3IgZG93bmxvYWRzCisgICAgKiBbVEhSSUZULTE5MjhdIC0gUmFjZSBtYXkgc3RpbGwgZXhpc3QgaW4gVEZpbGVUcmFuc3BvcnQ6OmZsdXNoKCkKKyAgICAqIFtUSFJJRlQtMTkzNF0gLSBUYWJzIGluIEV4YW1wbGUgc2VjdGlvbiBvbiBtYWluIHBhZ2UgYXJlIG5vdCB3b3JraW5nCisgICAgKiBbVEhSSUZULTE5MzNdIC0gRGVscGhpIGdlbmVyYXRvciBjcmFzaGVzIHdoZW4gYSB0eXBlZGVmIHJlZmVyZW5jZXMgYW5vdGhlciB0eXBlZGVmIGZyb20gYW4gaW5jbHVkZWQgZmlsZQorICAgICogW1RIUklGVC0xOTQyXSAtIEJpbmFyeSBhY2NlbGVyYXRlZCBjcHAgZXh0ZW5zaW9uIGRvZXMgbm90IHVzZSBUaHJpZnQgbmFtZXNwYWNlcyBmb3IgRXhjZXB0aW9ucworICAgICogW1RIUklGVC0xOTU5XSAtIEMjOiBBZGQgVW5pb24gVE1lbW9yeUJ1ZmZlciBzdXBwb3J0CisgICAgKiBbVEhSSUZULTE5NThdIC0gQyM6IFVzZSBzdGF0aWMgT2JqZWN0LkVxdWFscyBpbnN0ZWFkIG9mIC5FcXVhbHMoKSBjYWxscyBpbiBlcXVhbHMKKyAgICAqIFtUSFJJRlQtMTk1N10gLSBOb2RlSlMgVEZyYW1lZFRyYW5zcG9ydCBhbmQgVEJ1ZmZlcmVkVHJhbnNwb3J0IHJlYWQgYnl0ZXMgYXMgdW5zaWduZWQKKyAgICAqIFtUSFJJRlQtMTk1NV0gLSBVbmlvbiBUeXBlIHdyaXRlciBnZW5lcmF0ZWQgaW4gQyMgZG9lcyBub3QgV3JpdGVTdHJ1Y3RCZWdpbgorICAgICogW1RIUklGVC0xOTUyXSAtIFRyYXZpcyBDSQorICAgICogW1RIUklGVC0xOTQ5XSAtIFdQNyBidWlsZCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMTk0M10gLSBkb2NzdHJpbmdzIGZvciBlbnVtIHZhbHVlcyBhcmUgaWdub3JlZAorICAgICogW1RIUklGVC0yMDcwXSAtIEltcHJvcGVyIGBIZXhDaGFyJyBhbmQgJ0hleFZhbCcgaW1wbGVtZW50YXRpb24gaW4gVEpTT05Qcm90b2NvbC5jcworICAgICogW1RIUklGVC0yMDE3XSAtIFJlc291cmNlIExlYWsgaW4gdGhyaWZ0IHN0cnVjdCB1bmRlciBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCisgICAgKiBbVEhSSUZULTIwMzJdIC0gQyMgY2xpZW50IGxlYWtzIHNvY2tldHMvaGFuZGxlcworICAgICogW1RIUklGVC0xOTk2XSAtIEphdmFNRSBDb25zdGFudHMgZ2VuZXJhdGlvbiBpcyBicm9rZW4gLyBpbmNvbnNpc3RlbnQgd2l0aCByZWd1bGFyIEphdmEgZ2VuZXJhdGlvbgorICAgICogW1RIUklGVC0yMDAyXSAtIEhhc2tlbGw6IFRlc3QgdXNlIERhdGEuTWF5YmUgaW5zdGVhZCBvZiBNYXliZQorICAgICogW1RIUklGVC0yMDUxXSAtIFZhZ3JhbnQgZmFpbHMgdG8gYnVpbGQgZXJsYW5nCisgICAgKiBbVEhSSUZULTIwNTBdIC0gVmFncmFudCBDIyBsaWIgY29tcGlsZSBmYWlscyB3aXRoIFRFeGNlcHRpb24gbWlzc2luZworICAgICogW1RIUklGVC0xOTc4XSAtIFJ1Ynk6IFRocmlmdCBzaG91bGQgYWxsb3cgZm9yIHRoZSBTU0wgdmVyaWZ5IG1vZGUgdG8gYmUgc2V0CisgICAgKiBbVEhSSUZULTE5ODRdIC0gbmFtZXNwYWNlIGNvbGxpc2lvbiBpbiBweXRob24gYmluZGluZ3MKKyAgICAqIFtUSFJJRlQtMTk4OF0gLSBXaGVuIHRyeWluZyB0byBidWlsZCBhIGRlYmlhbiBwYWNrYWdlIGl0IGZhaWxzIGFzIHRoZSBmaWxlIE5FV1MgZG9lc24ndCBleGlzdAorICAgICogW1RIUklGVC0xOTc1XSAtIFRCaW5hcnlQcm90b2NvbCBDaGVja0xlbmd0aCBjYW4ndCBiZSB1c2VkIGZvciBhIGNsaWVudAorICAgICogW1RIUklGVC0xOTk1XSAtICcuJyBhbGxvd2VkIGF0IGVuZCBvZiBpZGVudGlmaWVyIGdlbmVyYXRlcyBub24tY29tcGlsYWJsZSBjb2RlCisgICAgKiBbVEhSSUZULTIxMTJdIC0gRXJyb3IgaW4gR28gZ2VuZXJhdG9yIHdoZW4gdXNpbmcgdHlwZWRlZnMgaW4gbWFwIGtleXMKKyAgICAqIFtUSFJJRlQtMjA4OF0gLSBUeXBvcyBpbiBUaHJpZnQgY29tcGlsZXIgaGVscCB0ZXh0CisgICAgKiBbVEhSSUZULTIwODBdIC0gQyMgbXVsdGlwbGV4IHByb2Nlc3NvciBkb2VzIG5vdCBjYXRjaCBJT0V4Y2VwdGlvbgorICAgICogW1RIUklGVC0yMDgyXSAtIEV4ZWN1dGluZyAiZ21ha2UgY2xlYW4iIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0yMTAyXSAtIGNvbnN0YW50cyBhcmUgbm90IHJlZmVyZW5jaW5nIHRvIGNvcnJlY3QgdHlwZSB3aGVuIGluY2x1ZGVkIGZyb20gYW5vdGhlciB0aHJpZnQgZmlsZQorICAgICogW1RIUklGVC0yMTAwXSAtIHR5cGVkZWZzIGFyZSBub3QgY29ycmVjdGx5IHJlZmVyZW5jZWQgd2hlbiBpbmNsdWRpbmcgZnJvbSBvdGhlciB0aHJpZnQgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjA2Nl0gLSAnbWFrZSBpbnN0YWxsJyBkb2VzIG5vdCBpbnN0YWxsIHR3byBoZWFkZXJzIHJlcXVpcmVkIGZvciBDKysgYmluZGluZ3MKKyAgICAqIFtUSFJJRlQtMjA2NV0gLSBOb3QgdmFsaWQgY29uc3RhbnRzIGZpbGVuYW1lIGluIEphdmEKKyAgICAqIFtUSFJJRlQtMjA0N10gLSBUaHJpZnQuUHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCwgaW50VG9aaWdaYWcgZGF0YSBsb3N0IChUQ29tcGFjdFByb3RvY29sLmNzKQorICAgICogW1RIUklGVC0yMDM2XSAtIFRocmlmdCBnZW0gd2FybnMgYWJvdXQgY2xhc3MgdmFyaWFibGUgYWNjZXNzIGZyb20gdG9wIGxldmVsCisgICAgKiBbVEhSSUZULTIwNTddIC0gVmFncmFudCBmYWlscyBvbiBwaHAgdGVzdHMKKyAgICAqIFtUSFJJRlQtMjEwNV0gLSBHZW5lcmF0ZWQgY29kZSBmb3IgZGVmYXVsdCB2YWx1ZXMgb2YgY29sbGVjdGlvbnMgaWdub3JlcyB0X2ZpZWxkOjpUX1JFUVVJUkVECisgICAgKiBbVEhSSUZULTIwOTFdIC0gVW5uZWNlc3NhcnkgJ2ZyaWVuZCcgZGVjbGFyYXRpb24gY2F1c2VzIHdhcm5pbmcgaW4gVFdpbnNvY2tTaW5nbGV0b24KKyAgICAqIFtUSFJJRlQtMjA5MF0gLSBHbyBnZW5lcmF0b3IsIGZpeCBpbmNsdWRpbmcgb2Ygb3RoZXIgdGhyaWZ0IGZpbGVzCisgICAgKiBbVEhSSUZULTIxMDZdIC0gRml4IHN1cHBvcnQgZm9yIG5hbWVzcGFjZXMgaW4gR08gZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTE3ODNdIC0gQyMgZG9lc24ndCBoYW5kbGUgcmVxdWlyZWQgZmllbGRzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0xNzgyXSAtIGFzeW5jIG9ubHkgZGVmaW5lZCBpbiBzaWx2ZXJsaWdodAorICAgICogW1RIUklGVC0xNzc5XSAtIE1pc3NpbmcgcHJvY2Vzc19YWFhYIG1ldGhvZCBpbiBnZW5lcmF0ZWQgVFByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsICdvbmV3YXknIHNlcnZpY2UgZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTE2OTJdIC0gU09fUkVVU0VBRERSIGFsbG93cyBmb3Igc29ja2V0IGhpamFja2luZyBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTE3MjBdIC0gSlJ1YnkgdGltZXMgb3V0IG9uIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbgorICAgICogW1RIUklGVC0xNzEzXSAtIE5hbWVkIGFuZCBBbm9ueW1vdXMgUGlwZSB0cmFuc3BvcnQgKERlbHBoaSkKKyAgICAqIFtUSFJJRlQtMTY5OV0gLSBOYXRpdmUgVW5pb24jcmVhZCBoYXMgZXh0cmEgcmVhZF9maWVsZF9lbmQgY2FsbAorICAgICogW1RIUklGVC0xNzQ5XSAtIFB5dGhvbiBUU1NMU29ja2V0IGVycm9yIGhhbmRsaW5nIG9ic2N1cmVzIGFjdHVhbCBlcnJvcgorICAgICogW1RIUklGVC0xNzQ4XSAtIEd1YXJkIGFuZCBSV0d1YXJkIG1hY3JvcyBkZWZpbmVkIGluIGdsb2JhbCBuYW1lc3BhY2UKKyAgICAqIFtUSFJJRlQtMTczNF0gLSBGcm9udCB3ZWJwYWdlIGlzIHN0aWxsIGFkdmVydGlzaW5nIHYwLjggYXMgY3VycmVudCByZWxlYXNlCisgICAgKiBbVEhSSUZULTE3MjldIC0gQyBnbGliIHJlZmFjdG9yIGxlZnQgZW1wdHkgZm9sZGVycyBpbiBzdm4KKyAgICAqIFtUSFJJRlQtMTc2N10gLSB1bmlvbnMgY2FuJ3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMgKERlbHBoaSkKKyAgICAqIFtUSFJJRlQtMTc2NV0gLSBJbmNvcnJlY3QgZXJyb3IgbWVzc2FnZSBwcmludGVkIGZvciBudWxsIG9yIG5lZ2F0aXZlIGtleXMKKyAgICAqIFtUSFJJRlQtMTc3OF0gLSBDb25maWd1cmUgcmVxdWlyZXMgbWFudWFsIGludGVydmVudGlvbiBkdWUgdG8gdGFyIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMTc3N10gLSBUUGlwZVNlcnZlciBpcyBVTlNUT1BQQUJMRQorICAgICogW1RIUklGVC0xNzUzXSAtIE11bHRpcGxlIEMrKyBXaW5kb3dzLCBPU1gsIGFuZCBpT1MgcG9ydGFiaWxpdHkgaXNzdWVzCisgICAgKiBbVEhSSUZULTE3NTZdIC0gJ21ha2UgLWogOCcgZmFpbHMgd2l0aCAidW50ZXJtaW5hdGVkICNpZmRlZiIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMTc3M10gLSBQeXRob24gbGlicmFyeSBzaG91bGQgcnVuIG9uIHB5dGhvbiAyLjQKKyAgICAqIFtUSFJJRlQtMTc2OV0gLSB1bmlvbnMgY2FuJ3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMgKEMrKykKKyAgICAqIFtUSFJJRlQtMTc2OF0gLSB1bmlvbnMgY2FuJ3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMgKENvbXBpbGVyKQorICAgICogW1RIUklGVC0xNjY2XSAtIGh0b25sbCB1c2FnZSBpbiBUQmluYXJ5UHJvdG9jb2wudGNjIGdlbmVyYXRlcyB3YXJuaW5nIHdpdGggTVNWQzIwMTAKKyAgICAqIFtUSFJJRlQtMTkxOV0gLSBsaWJ0aHJpZnQgZGVwZW5kcyBvbiBodHRwY29yZS00LjEuMyAoZGlyZWN0bHkpIGFuZCBodHRwY29yZS00LjEuNCAodHJhbnNpdGl2ZWx5KQorICAgICogW1RIUklGVC0xODY0XSAtIGltcGxlbWVudCBldmVudCBoYW5kbGVyIGZvciBub24tYmxvY2tpbmcgc2VydmVyCisgICAgKiBbVEhSSUZULTE4NTldIC0gR2VuZXJhdGVkIGVycm9yIGMrKyBjb2RlIHdpdGggLW91dCBhbmQgaW5jbHVkZV9wcmVmaXggcGFyYW0KKyAgICAqIFtUSFJJRlQtMTg2OV0gLSBUVGhyZWFkUG9vbFNlcnZlciAoamF2YSkgZGllcyB3aGVuIHRocmVhZHBvb2wgaXMgY29uc3VtZWQKKyAgICAqIFtUSFJJRlQtMTg0Ml0gLSBNZW1vcnkgbGVhayB3aXRoIFBpcGVzCisgICAgKiBbVEhSSUZULTE4MzhdIC0gQ2FuJ3QgYnVpbGQgY29tcGlsZXIgb24gT1MgWCBiZWNhdXNlIG9mIG1pc3NpbmcgdGhyaWZ0eS5oCisgICAgKiBbVEhSSUZULTE4NDZdIC0gUmVzdG9yZSBzb2NrZXQuaCBoZWFkZXIgdG8gc3VwcG9ydCBidWlsZHMgd2l0aCBBbmRyb2lkIE5ESworICAgICogW1RIUklGVC0xODUwXSAtIG1ha2UgY2hlY2sgaGFuZ3Mgb24gVFNvY2tldCB0ZXN0cyBpbiBUcmFuc3BvcnRUZXN0LmNwcAorICAgICogW1RIUklGVC0xODczXSAtIEJpbmFyeSBwcm90b2NvbCBmYWN0b3J5IGlnbm9yZXMgc3RydWN0IHJlYWQvd3JpdGUgZmxhZ3MKKyAgICAqIFtUSFJJRlQtMTg3Ml0gLSBpc3N1ZXMgd2l0aCBUQnVmZmVyZWRUcmFuc3BvcnQgYnVmZmVyCisgICAgKiBbVEhSSUZULTE5MDRdIC0gSW5jb3JyZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIGZvciB0eXBlZGVmcyB3aGljaCB1c2UgaW5jbHVkZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMTkwM10gLSBQSFAgbmFtZXNwYWNlcyBjYXVzZSBiaW5hcnkgcHJvdG9jb2xzIHRvIG5vdCBiZSB1c2VkCisgICAgKiBbVEhSSUZULTE4OTVdIC0gRGVscGhpOiByZXNlcnZlZCB2YXJpYWJsZSBuYW1lICJyZXN1bHQiIG5vdCBkZXRlY3RlZCBwcm9wZXJseQorICAgICogW1RIUklGVC0xODgxXSAtIFROb25ibG9ja2luZ1NlcnZlciBkb2VzIG5vdCByZWxlYXNlIG9wZW4gY29ubmVjdGlvbnMgb3IgdGhyZWFkcyBvbiBzaHV0ZG93bgorICAgICogW1RIUklGVC0xODg4XSAtIEphdmEgVGhyaWZ0IGNsaWVudCBjYW4ndCBjb25uZWN0IHRvIFB5dGhvbiBUaHJpZnQgc2VydmVyIG9uIHNhbWUgaG9zdAorICAgICogW1RIUklGVC0xODMxXSAtIEJ1ZyBpbiBsaXN0IGRlc2VyaWFsaXplcgorICAgICogW1RIUklGVC0xODI0XSAtIG1hbnkgY29tcGlsZSB3YXJuaW5nLCBiZWNhc2UgVGhyZWFkLmggaW5jbHVkZXMgY29uZmlnLmgKKyAgICAqIFtUSFJJRlQtMTgyM10gLSBNaXNzaW5nIHBhcmVudGhlc2lzIGJyZWFrcyAiSVNfLi4uIiBtYWNybyBpbiBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0xODA2XSAtIFB5dGhvbiBnZW5lcmF0aW9uIGFsd2F5cyB0cnVuY2F0ZXMgX19pbml0X18ucHkgZmlsZXMKKyAgICAqIFtUSFJJRlQtMTc5NV0gLSBSYWNlIGNvbmRpdGlvbiBpbiBUVGhyZWFkZWRTZXJ2ZXJQb29sIGphdmEgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMTc5NF0gLSBDIyBhc3luY2N0cCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMTgwNF0gLSBCaW5hcnkrY29tcGFjdCBwcm90b2NvbCBzaW5nbGUgYnl0ZSBlcnJvciBpbiBSdWJ5IGxpYnJhcnkgKEFSTSBhcmNoaXRlY3R1cmUpOiBjYXVzZWQgYnkgZGlmZmVyZW50IGNoYXIgc2lnbmVkbmVzcworICAgICogW1RIUklGVC0xODAwXSAtIERvY3VtZW50YXRpb24gdGV4dCBub3QgYWx3YXlzIGVzY2FwZWQgY29ycmVjdGx5IHdoZW4gcmVuZGVyZWQgdG8gSFRNTAorICAgICogW1RIUklGVC0xNzg4XSAtIEMjOiBDb25zdGFudHMgc3RhdGljIGNvbnN0cnVjdG9yIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMTgxNl0gLSBOZWVkICJyZXF1aXJlIiBpbmNsdWRlZCB0aHJpZnQgZmlsZXMgaW4gInh4eF90eXBlcy5qcyIKKyAgICAqIFtUSFJJRlQtMTkwN10gLSBDb21waWxpbmcgbmFtZXNwYWNlIGFuZCBzdWItbmFtZXNwYWNlIGRpcmVjdGl2ZXMgZm9yIHVucmVjb2duaXplZCBnZW5lcmF0b3JzIHNob3VsZCBvbmx5IGJlIGEgd2FybmluZworICAgICogW1RIUklGVC0xOTEzXSAtIHNraXBwaW5nIHVua25vd24gZmllbGRzIGluIGphdmEgdW5pb25zCisgICAgKiBbVEhSSUZULTI1NTNdIC0gQysrIGxpbmtlciBlcnJvciAtIHRyYW5zcG9ydC9UU29ja2V0CisgICAgKiBbVEhSSUZULTI3NF0gLSBUb3dhcmRzIGEgd29ya2luZyByZWxlYXNlL3ZlcnNpb25pbmcgcHJvY2VzcworCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTE5NzFdIC0gW0dyYXBodml6XSBBZGRzIHR1dG9yaWFsL2dlbmVyYWwgZGVzY3JpcHRpb24gZG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yMDAxXSAtIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8gRXhhbXBsZSAiQysrIFNlcnZlciIgdGFiIGlzIGJyb2tlbgorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xNTc0XSAtIEFwYWNoZSBwcm9qZWN0IGJyYW5kaW5nIHJlcXVpcmVtZW50czogRE9BUCBmaWxlIFtQQVRDSF0KKyAgICAqIFtUSFJJRlQtMTM0N10gLSBVbmlmeSB0aGUgZXhjZXB0aW9ucyByZXR1cm5lZCBpbiBnZW5lcmF0ZWQgR28gY29kZQorICAgICogW1RIUklGVC0xMzUzXSAtIFN3aXRjaCB0byBwZXJmb3JtYW5jZSBicmFuY2gsIGdldCByaWQgb2YgQmluYXJ5UGFyc2VyCisgICAgKiBbVEhSSUZULTE2MjldIC0gUnVieSAxLjkgQ29tcGF0aWJpbGl0eSBkdXJpbmcgVGhyaWZ0IGNvbmZpZ3VyZSwgbWFrZSwgaW5zdGFsbAorICAgICogW1RIUklGVC05OTFdIC0gUmVmYWN0b3IgSGFza2VsbCBjb2RlIGFuZCBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtOTkwXSAtIFNhbmlmeSBnZXR0aW1lb2ZkYXkgdXNhZ2UgY29kZWJhc2Utd2lkZQorICAgICogW1RIUklGVC03OTFdIC0gTGV0IEMrKyBUU2ltcGxlU2VydmVyIGJlIGRyaXZlbiBieSBhbiBleHRlcm5hbCBtYWluIGxvb3AKKyAgICAqIFtUSFJJRlQtMjExN10gLSBDb2NvYSBUQmluYXJ5UHJvdG9jb2wgc3RyaWN0V3JpdGUgc2hvdWxkIGJlIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtMjAxNF0gLSBDaGFuZ2UgQysrIGxpYiBpbmNsdWRlcyB0byB1c2UgPG5hbWVzcGFjZS8+IHN0eWxlIHRocm91Z2hvdXQKKyAgICAqIFtUSFJJRlQtMTk3Ml0gLSBBZGQgc3VwcG9ydCBmb3IgYXN5bmMgcHJvY2Vzc29ycworICAgICogW1RIUklGVC0xOTcwXSAtIFtHcmFwaHZpel0gQWRkcyBvcHRpb24gdG8gcmVuZGVyIGV4Y2VwdGlvbnMgcmVsYXRpb25zaGlwcworICAgICogW1RIUklGVC0xOTY2XSAtIFN1cHBvcnQgZGlmZmVyZW50IGZpbGVzIGZvciBTU0wgY2VydGlmaWNhdGVzIGFuZCBrZXlzCisgICAgKiBbVEhSSUZULTE5NjVdIC0gQWRkcyBHcmFwaHZpeiAoZ3JhcGggZGVzY3JpcHRpb24gbGFuZ3VhZ2UpIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0xOTU2XSAtIFN3aXRjaCB0byBBcGFjaGUgQ29tbW9ucyBMYW5nIDMKKyAgICAqIFtUSFJJRlQtMTk2Ml0gLSBNdWx0aXBsZXggcHJvY2Vzc29yIHNob3VsZCBzZW5kIGFueSBUQXBwbGljYXRpb25FeGNlcHRpb24gYmFjayB0byBjbGllbnQKKyAgICAqIFtUSFJJRlQtMTk2MF0gLSBtYWluKCkgZGVjbGFyZXMgMjIgdW51c2VkIGdlbiBib29scworICAgICogW1RIUklGVC0xOTUxXSAtIGxpYnRocmlmdC5qYXIgaGFzIHNvdXJjZSBmaWxlcyBpbiBpdAorICAgICogW1RIUklGVC0xOTk3XSAtIEFkZCBhY2NlcHQgYmFja2xvZyBjb25maWd1cmF0aW9uIG1ldGhvZCB0byAgVFNlcnZlclNvY2tldAorICAgICogW1RIUklGVC0yMDAzXSAtIERlcHJlY2F0ZSBzZW51bQorICAgICogW1RIUklGVC0yMDUyXSAtIFZhZ3JhbnQgbWFjaGluZSBpbWFnZSBkZWZhdWx0cyB0byBvbmx5IDM4NE1CIG9mIFJBTQorICAgICogW1RIUklGVC0xOTgwXSAtIE1vZGVybml6ZSBHbyB0b29saW5nLCBmaXggZ28gY2xpZW50IGxpYmFyeS4KKyAgICAqIFtUSFJJRlQtMTk3N10gLSBDIyBjb21waWxlciBzaG91bGQgZ2VuZXJhdGUgY29uc3RhbnQgZmlsZXMgcHJlZml4ZWQgd2l0aCB0aHJpZnQgZmlsZSBuYW1lCisgICAgKiBbVEhSSUZULTE5ODVdIC0gYWRkIGEgVmFncmFudGZpbGUgdG8gYnVpbGQgYW5kIHRlc3QgQXBhY2hlIFRocmlmdCBmdWxseSByZXByb2R1Y2FibGUKKyAgICAqIFtUSFJJRlQtMTk5NF0gLSBEZXByZWNhdGUgc2xpc3QKKyAgICAqIFtUSFJJRlQtMTk5M10gLSBGYWN0b3J5IHRvIGNyZWF0ZSBpbnN0YW5jZXMgZnJvbSBrbm93biAoZ2VuZXJhdGVkKSBpbnRlcmZhY2UgdHlwZXMgd2l0aCBEZWxwaGkKKyAgICAqIFtUSFJJRlQtMjA4MV0gLSBTcGVjaWZpZWQgdGltZW91dCBzaG91bGQgYmUgdXNlZCBpbiBUU29ja2V0Lk9wZW4oKQorICAgICogW1RIUklGVC0yMDg0XSAtIERlbHBoaTogQWJpbGl0eSB0byBjcmVhdGUgZW50aXR5IFRocmlmdC1nZW5lcmF0ZWQgaW5zdGFuY2VzIGJhc2VkIG9uIFR5cGVJbmZvCisgICAgKiBbVEhSSUZULTIwODNdIC0gSW1wcm92ZSB0aGUgZ28gbGliOiBidWZmZXJlZCBUcmFuc3BvcnQsIHNhdmUgbWVtb3J5IGFsbG9jYXRpb24sIGhhbmRsZSBjb25jdXJyZW50IHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMjEwOV0gLSBTZWN1cmUgY29ubmVjdGlvbnMgc2hvdWxkIGJlIHN1cHBvcnRlZCBpbiBHbworICAgICogW1RIUklGVC0yMTA3XSAtIG1pbm9yIEdvIGdlbmVyYXRvciBmaXhlcworICAgICogW1RIUklGVC0xNjk1XSAtIGFsbG93IHdhcm5pbmctZnJlZSBjb21waWxhdGlvbiBpbiBWUyAyMDEyIGFuZCBHTlUgNC42CisgICAgKiBbVEhSSUZULTE3MzVdIC0gaW50ZWdyYXRlIHR1dG9yaWFsIGludG8gcmVndWxhciBidWlsZAorICAgICogW1RIUklGVC0xNzE2XSAtIG1heCBhbGxvd2VkIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMKKyAgICAqIFtUSFJJRlQtMTcxNV0gLSBBbGxvdyBleGNsdWRpbmcgcHl0aG9uIHBhcnRzIHdoZW4gYnVpbGRpbmcgY29udHJpYi9mYjMwMworICAgICogW1RIUklGVC0xNzMzXSAtIEZpeCBSUE0gYnVpbGQgaXNzdWVzIG9uIFJIRUw2L09MNiBzeXN0ZW1zCisgICAgKiBbVEhSSUZULTE3MjhdIC0gVXBncmFkYXRpb24gb2YgaHR0cGNvbXBvbmVudHMKKyAgICAqIFtUSFJJRlQtMTg3Nl0gLSBVc2UgZW51bSBuYW1lcyBpbnN0ZWFkIG9mIGNhc3RlZCBpbnRlZ2VycyBpbiBhc3NpZ25tZW50cworICAgICogW1RIUklGVC0xODc0XSAtIHRpbWVvdXQgZm9yIHRoZSBzZXJ2ZXItc2lkZSBlbmQgb2YgYSBuYW1lZCBwaXBlCisgICAgKiBbVEhSSUZULTE4OTddIC0gU3VwcG9ydCB2YWxpZGF0aW9uIG9mIHJlcXVpcmVkIGZpZWxkcworICAgICogW1RIUklGVC0xODk2XSAtIEFkZCBUQmFzZSBwcm90b2NvbCBmb3IgQ29jb2EKKyAgICAqIFtUSFJJRlQtMTg4MF0gLSBNYWtlIG5hbWVkIHBpcGVzIHNlcnZlciB3b3JrIGFzeW5jaHJvbm91c2x5IChvdmVybGFwcGVkKSB0byBhbGxvdyBmb3IgY2xlYW4gc2VydmVyIHN0b3BzCisgICAgKiBbVEhSSUZULTE4NzhdIC0gQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBzZW5kIGN1c3RvbSBoZWFkZXJzCisgICAgKiBbVEhSSUZULTE4ODJdIC0gVXNlIHNpbmdsZSBpbmNsdWRlCisgICAgKiBbVEhSSUZULTE3OTNdIC0gQyM6IFVzZSBzdGF0aWMgcmVhZCBpbnN0ZWFkIG9mIGluc3RhbmNlIHJlYWQKKyAgICAqIFtUSFJJRlQtMTc5OV0gLSBPcHRpb24gdG8gZ2VuZXJhdGUgSFRNTCBpbiAic3RhbmRhbG9uZSBtb2RlIgorICAgICogW1RIUklGVC0xODE1XSAtIENvZGUgZ2VuZXJhdG9ycyBsaW5lIGJ1ZmZlciBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMTg5MF0gLSBDKys6IE1ha2UgbmFtZWQgcGlwZXMgc2VydmVyIHdvcmsgYXN5bmNocm9ub3VzbHkKKyAgICAqIFtUSFJJRlQtNDc0XSAtIEdlbmVyYXRpbmcgUnVieSBvbiBSYWlscyBmcmllbmRseSBjb2RlCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTgwMV0gLSBQcm92aWRlIGFuIGludGVyYWN0aXZlIHNoZWxsIChpcmIpIHdoZW4gZ2VuZXJhdGluZyBydWJ5IGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTIyOTJdIC0gQW5kcm9pZCBMaWJyYXJ5IFByb2plY3QKKyAgICAqIFtUSFJJRlQtMjAxMl0gLSBNb2Rlcm5pemluZyBHbworICAgICogW1RIUklGVC0xOTY5XSAtIEMjOiBUZXN0cyBub3QgcHJvcGVybHkgbGlua2VkIGZyb20gdGhlIHNvbHV0aW9uCisgICAgKiBbVEhSSUZULTE3ODVdIC0gQyM6IEFkZCBUTWVtb3J5QnVmZmVyIHNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyCisgICAgKiBbVEhSSUZULTE3ODBdIC0gQWRkIG9wdGlvbiB0byBnZW5lcmF0ZSBudWxsYWJsZSB2YWx1ZXMKKyAgICAqIFtUSFJJRlQtMTc4Nl0gLSBDIyBVbmlvbiBUeXBpbmcKKyAgICAqIFtUSFJJRlQtNTkxXSAtIE1ha2UgdGhlIEMrKyBydW50aW1lIGxpYnJhcnkgYmUgY29tcGF0aWJsZSB3aXRoIFdpbmRvd3MgYW5kIFZpc3VhbCBTdHVkaW8KKyAgICAqIFtUSFJJRlQtNTE0XSAtIEFkZCBvcHRpb24gdG8gY29uZmlndXJlIGNvbXBpbGVyIG91dHB1dCBkaXJlY3RvcnkKKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMTc2NF0gLSBob3cgdG8gZ2V0IHRoZSBjb250ZXh0IG9mIGNsaWVudCB3aGVuIG9uIGEgcnBjIGNhbGwgaW4gc2VydmVyIHNpZGU/CisgICAgKiBbVEhSSUZULTE3OTFdIC0gdGhyaWZ0J3MgbmFtZXNwYWNlIGRpcmVjdGl2ZSB3aGVuIGdlbmVyYXRpbmcgaGFza2VsbCBjb2RlCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTE1OTRdIC0gSmF2YSB0ZXN0IGNsaWVudHMgc2hvdWxkIGhhdmUgYSByZXR1cm4gY29kZXMgdGhhdCByZWZsZWN0IHdoZXRoZXIgaXQgc3VjY2VlZHMgb3Igbm90LgorICAgICogW1RIUklGVC0xNTk1XSAtIEphdmEgdGVzdCBzZXJ2ZXIgc2hvdWxkIGZvbGxvdyB0aGUgZG9jdW1lbnRlZCBiZWhhdmlvciBhcyBvZiBUSFJJRlQtMTU5MAorICAgICogW1RIUklGVC05ODZdIC0gc3Q6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtOTg1XSAtIHBocDogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC05ODRdIC0gb2NhbWw6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMTkyNF0gLSBEZWxwaGk6IEluY29uc2lzdGVuY3kgaW4gc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTkyMl0gLSBDIzogSW5jb25zaXN0ZW5jeSBpbiBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFsIGZpZWxkcworICAgICogW1RIUklGVC0xOTYxXSAtIEMjIHRlc3RzIHNob3VsZCBiZSBpbiBsaWIvY3NoYXJwL3Rlc3QvLi4uCisgICAgKiBbVEhSSUZULTE4MjJdIC0gUEhQIHVuaXQgdGVzdCBkb2VzIG5vdCB3b3JrCisgICAgKiBbVEhSSUZULTE5MDJdIC0gQysrOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0xOTAxXSAtIEMjOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0xODk5XSAtIERlbHBoaTogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtNTYzXSAtIFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisKKworCitUaHJpZnQgMC45CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTE0MzhdIC0gbGliL2NwcC9zcmMvd2luZG93cy9jb25maWcuaCBzaG91bGQgcmVhZCB2ZXJzaW9uIGZyb20gY29uZmlndXJlLmFjIHJhdGhlciB0aGFuIGEgI2RlZmluZQorICAgICogW1RIUklGVC0xNDQ2XSAtIENvbXBpbGUgZXJyb3Igd2l0aCBEZWxwaGkgMjAwOSBpbiBjb25zdGFudCBpbml0aWFsaXplcgorICAgICogW1RIUklGVC0xNDUwXSAtIFByb2JsZW1zIGJ1aWxkaW5nIHRocmlmdCAwLjguMCBmb3IgUHl0aG9uIGFuZCBSdWJ5CisgICAgKiBbVEhSSUZULTE0NDldIC0gUnVieSBjbGllbnQgZG9lcyBub3Qgd29yayBvbiBzb2xhcmlzICg/KQorICAgICogW1RIUklGVC0xNDQ3XSAtIE51bGxwb2ludGVyRXhjZXB0aW9uIGluIFByb2Nlc3NGdW5jdGlvbi5jbGFzcyA6aW4gIm9uZXdheSIgbWV0aG9kCisgICAgKiBbVEhSSUZULTE0MzNdIC0gVFNlcnZlclNvY2tldCBmaXggZm9yIE1TVkMKKyAgICAqIFtUSFJJRlQtMTQyOV0gLSBUaGUgbm9uYmxvY2tpbmcgc2VydmVycyBpcyBzdXBwb3NlZCB0byB1c2UgVHJhbnNwb3J0RmFjdG9yeSB0byByZWFkIHRoZSBkYXRhCisgICAgKiBbVEhSSUZULTE0MjddIC0gUEhQIGxpYnJhcnkgdXNlcyBub24tbXVsdGlieXRlIHNhZmUgZnVuY3Rpb25zIHdpdGggbWJzdHJpbmcgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKKyAgICAqIFtUSFJJRlQtMTQyMV0gLSBEZWJpYW4gUGFja2FnZXMgY2FuIG5vdCBiZSBidWlsdAorICAgICogW1RIUklGVC0xMzk0XSAtIFRyZWF0bWVudCBvZiBvcHRpb25hbCBmaWVsZHMgaXMgbm90IGNvbnNpc3RlbnQgYmV0d2VlbiBDKysgYW5kIEphdmEKKyAgICAqIFtUSFJJRlQtMTUxMV0gLSBTZXJ2ZXIgd2l0aCBvbmV3YXkgc3VwcG9ydCAoIEpBVkEgKQorICAgICogW1RIUklGVC0xNDk2XSAtIFBIUCBjb21waWxlciBub3QgbmFtZXNwYWNpbmcgZW51bXMKKyAgICAqIFtUSFJJRlQtMTQ5NV0gLSBQSFAgVGVzdENsaWVudCBmYXRhbHMgb24gbWlzc2luZyBjbGFzcworICAgICogW1RIUklGVC0xNTA4XSAtIFRTZXJ2ZXJTb2NrZXQgZG9lcyBub3QgYWxsb3cgZm9yIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIElQIGFkZHJlc3MgdG8gYmluZCB0bworICAgICogW1RIUklGVC0xNTA0XSAtIENvY29hIEdlbmVyYXRvciBzaG91bGQgdXNlIGxvY2FsIGZpbGUgaW1wb3J0cyBmb3IgYmFzZSBUaHJpZnQgaGVhZGVycworICAgICogW1RIUklGVC0xNTEyXSAtIFRocmlmdCBzb2NrZXQgc3VwcG9ydCBmb3IgV2luZG93cyBYUAorICAgICogW1RIUklGVC0xNTAyXSAtIFRTaW1wbGVTZXJ2ZXI6OnNlcnZlKCk6IERvIG5vdCBwcmludCBvdXQgZXJyb3IgbWVzc2FnZSBpZiBzZXJ2ZXIgd2FzIHN0b3BwZWQuCisgICAgKiBbVEhSSUZULTE1MDFdIC0gUEhQIG9sZCBuYW1lc3BhY2VzIG5vdCBnZW5lcmF0ZWQgZm9yIGVudW1zCisgICAgKiBbVEhSSUZULTE0ODNdIC0gamF2YSBjb21waWxlciBkb2VzIG5vdCBnZW5lcmF0ZSB0eXBlIHBhcmFtZXRlcnMgZm9yIHNlcnZpY2VzIGluIGV4dGVuZGVkIGNsYXVzZXMKKyAgICAqIFtUSFJJRlQtMTQ3OV0gLSBDb21waWxlZCBQSFAgcHJvY2VzcyBmdW5jdGlvbnMgbWlzc2luZyB3cml0ZU1lc3NhZ2VFbmQoKQorICAgICogW1RIUklGVC0xNDkyXSAtIGVuYWJsaW5nIGNfZ2xpYiByZW5kZXIgdGhyaWZ0IHVudXNhYmxlIChldmVuIGZvciBDKysgY29kZSkKKyAgICAqIFtUSFJJRlQtMTQ5MV0gLSBVbmluaXRpYWxpemUgcHJvY2Vzc29yRmFjdG9yeV8gbWVtYmVyIGluIFRTZXJ2ZXIuaAorICAgICogW1RIUklGVC0xNDc1XSAtIEluY29tcGxldGUgcmVjb3JkcyBnZW5lcmF0aW9uIGZvciBFcmxhbmcKKyAgICAqIFtUSFJJRlQtMTQ4Nl0gLSBKYXZhc2NyaXB0IG1hbnVhbCB0ZXN0c2VydmVyIG5vdCByZXR1cm5pbmcgY29udGVudCB0eXBlcworICAgICogW1RIUklGVC0xNDg4XSAtIHNyYy9jb25jdXJyZW5jeS9UaHJlYWQuaDo5MTo1ODogZXJyb3I6IGludmFsaWQgY29udmVyc2lvbiBmcm9tICdwdGhyZWFkX3Qge2FrYSBfb3BhcXVlX3B0aHJlYWRfdCp9JyB0byAnYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ6OmlkX3Qge2FrYSBsb25nIGxvbmcgdW5zaWduZWQgaW50fScgWy1mcGVybWlzc2l2ZV0KKyAgICAqIFtUSFJJRlQtMTQ5MF0gLSBXaW5kb3dzLXNwZWNpZmljIGhlYWRlciBmaWxlcyAtIGZpeGVzICYgdHdlYWtzCisgICAgKiBbVEhSSUZULTE1MjZdIC0gVW5pb24gVHVwbGVTY2hlbWVGYWN0b3J5IHJldHVybnMgU3RhbmRhcmRTY2hlbWVzCisgICAgKiBbVEhSSUZULTE1MjddIC0gR2VuZXJhdGVkIGltcGxlbWVudGF0aW9uIG9mIHR1cGxlUmVhZFN0cnVjdCBpbiB1bmlvbnMgcmV0dXJuIG51bGwgd2hlbiB0aGUgc2V0ZmllbGQgaXMgdW5yZWNvZ25pemVkCisgICAgKiBbVEhSSUZULTE1MjRdIC0gVE5vbkJsb2NraW5nU2VydmVyIGRvZXMgbm90IGNvbXBpbGUgaW4gVmlzdWFsIFN0dWRpbyAyMDEwCisgICAgKiBbVEhSSUZULTE1MjldIC0gVHVwbGVQcm90b2NvbCBjYW4gdW5pbnRlbnRpb25hbGx5IGluY2x1ZGUgYW4gZXh0cmEgYnl0ZSBpbiBiaXQgdmVjdG9ycyB3aGVuIG51bWJlciBvZiBvcHRpb25hbCBmaWVsZHMgaXMgYW4gaW50ZWdyYWwgb2YgOAorICAgICogW1RIUklGVC0xNDczXSAtIEpTT04gY29udGV4dCBzdGFjayBtYXkgYmUgbGVmdCBpbiBhbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtMTQ1Nl0gLSBTeXN0ZW0uTmV0Lkh0dHBXZWJSZXF1ZXN0JyBkb2VzIG5vdCBjb250YWluIGEgZGVmaW5pdGlvbiBmb3IgJ1Byb3h5JworICAgICogW1RIUklGVC0xNDY4XSAtIE1lbW9yeSBsZWFrIGluIFRTYXNsU2VydmVyVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTE0NjFdIC0gUmVjZW50IFROb25ibG9ja2luZ1NlcnZlciBjaGFuZ2VzIGJyb2tlIC0tZW5hYmxlLWJvb3N0dGhyZWFkcz15ZXMsIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMTQ2MF0gLSB3aHkgbm90IGFkZCB1bmljb2RlIHN0cmluZ3Mgc3VwcG9ydCB0byBweXRob24gZGlyZWN0bHk/CisgICAgKiBbVEhSSUZULTE0NjRdIC0gQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5GcmFtZUJ1ZmZlciBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgYWNjZXNzb3IgY2hhbmdlZCBmcm9tIHB1YmxpYyB0byBwcml2YXRlCisgICAgKiBbVEhSSUZULTE0NjddIC0gUG9zc2libGUgQVYgd2l0aCBlbXB0eSBzdHJpbmdzIHdoZW4gdXNpbmcgSlNPTiBwcm90b2NvbAorICAgICogW1RIUklGVC0xNTIzXSAtIGNsaWVudFRpbWVvdXQgbm90IHdvcmtlZCBhcyBleHBlY3RlZCBpbiBUU2VydmVyU29ja2V0IGNyZWF0ZWQgYnkgVFNTTFRyYW5zcG9ydEZhY3RvcnkKKyAgICAqIFtUSFJJRlQtMTUzN10gLSBURnJhbWVkVHJhbnNwb3J0IGlzc3VlcworICAgICogW1RIUklGVC0xNTE5XSAtIFRoaXJmdCBCdWlsZCBGYWlsdXJlIHJlZmVyZW5jaW5nIHJiX2ludGVybjIgc3ltYm9sCisgICAgKiBbVEhSSUZULTE1MThdIC0gR2VuZXJhdGVkIEMrKyBjb2RlIG9ubHkgc2VuZHMgdGhlIGZpcnN0IG9wdGlvbmFsIGZpZWxkIGluIHRoZSB3cml0ZSgpIGZ1bmN0aW9uIGZvciBhIHN0cnVjdC4KKyAgICAqIFtUSFJJRlQtMTUxNV0gLSBOYW1lRXJyb3I6IGdsb2JhbCBuYW1lICdUQXBwbGljYXRpb25FeGNlcHRpb24nIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTE1NTRdIC0gSW5oZXJpdGVkIHNlcnZpY2UgbWV0aG9kcyBhcmUgbm90IHJlc29sdmVkIGluIGRlcml2ZWQgc2VydmljZSBpbXBsZW1lbnRhdGlvbnMKKyAgICAqIFtUSFJJRlQtMTU1M10gLSB0aHJpZnQgbm9kZWpzIHNlcnZpY2Ugc2lkZSBjYW4ndCByZWFkIG1hcCBzdHJ1Y3R1cmUsIGtleSBhcyBlbnVtLCB2YWx1ZSBhcyBPYmplY3QKKyAgICAqIFtUSFJJRlQtMTU3NV0gLSBUeXBvIGluIHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCisgICAgKiBbVEhSSUZULTEzMjddIC0gRml4IFNwZWMgU3VpdGUgdW5kZXIgUnVieS0xLjguNyAod29ya3MgZm9yIE1SSSBSdWJ5LTEuOS4yKQorICAgICogW1RIUklGVC0xMzI2XSAtIG9uIHNvbWUgcGxhdGZvcm1zLCAjaW5jbHVkZSA8c3RkaW50Lmg+IGlzIG5lY2Vzc2FyeSB0byBiZSBpbmNsdWRlZCBpbiBUaHJpZnQuaAorICAgICogW1RIUklGVC0xMTU5XSAtIFRIdHRwQ2xpZW50LT5GbHVzaCgpIGlzc3VlIChjb25uZWN0aW9uIHRocnUgcHJveHkpCisgICAgKiBbVEhSSUZULTEyNzddIC0gTm9kZS5qcyBzZXJpYWxpemVzIGZhbHNlIGJvb2xlYW5zIGFzIG51bGwKKyAgICAqIFtUSFJJRlQtMTIyNF0gLSBDYW5ub3QgaW5zZXJ0IFVURi04IHRleHQKKyAgICAqIFtUSFJJRlQtMTI2N10gLSBOb2RlLmpzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuCisgICAgKiBbVEhSSUZULTEzMzhdIC0gRG8gbm90IHVzZSBhbiB1bnBhdGNoZWQgYXV0b2NvbmYgMi42NSB0byBnZW5lcmF0ZSByZWxlYXNlIHRhcmJhbGwKKyAgICAqIFtUSFJJRlQtMTEyOF0gLSBNQUMgT1MgWDogdGhyaWZ0LmggaW5jb21wYXRpYmlsaXR5IHdpdGggVGhyaWZ0LmgKKyAgICAqIFtUSFJJRlQtMTYzMV0gLSBGaXggQysrIHNlcnZlciBjb25zdHJ1Y3RvciB0eXBvcworICAgICogW1RIUklGVC0xNjAyXSAtIFBIUCBDIEV4dGVuc2lvbiBpcyBub3QgQ29tcGF0aWJsZSB3aXRoIFBIUCA1LjQKKyAgICAqIFtUSFJJRlQtMTYxMF0gLSBJV2ViUHJveHkgbm90IGF2YWlsYWJsZSBvbiBXUDcgcGxhdGZvcm0KKyAgICAqIFtUSFJJRlQtMTYwNl0gLSBSYWNlIGNvbmRpdGlvbiBpbiBCb29zdFRocmVhZEZhY3RvcnkuY3BwCisgICAgKiBbVEhSSUZULTE2MDRdIC0gUHl0aG9uIGV4Y2VwdGlvbiBoYW5kZWxpbmcgZm9yIGNoYW5nZXMgZnJvbSBQRVAgMzExMAorICAgICogW1RIUklGVC0xNjA3XSAtIEluY29ycmVjdCBmaWxlIG1vZGVzIGZvciBzZXZlcmFsIHNvdXJjZSBmaWxlcworICAgICogW1RIUklGVC0xNTgzXSAtIGNfZ2xpYiBsZWFrcyBtZW1vcnkKKyAgICAqIFtUSFJJRlQtMTU4Ml0gLSBCYWQgaW5jbHVkZXMgb2YgbmVzdGVkIHRocmlmdCBmaWxlcyBpbiBjX2dsaWIKKyAgICAqIFtUSFJJRlQtMTU3OF0gLSBDX0dMaWIgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0xNTk3XSAtIFRKU09OUHJvdG9jb2wucGhwIGlzIG1pc3NpbmcgZnJvbSBNYWtlZmlsZS5hbQorICAgICogW1RIUklGVC0xNTkxXSAtIEVuYWJsZSBUQ1BfTk9ERUxBWSBmb3IgcnVieSBnZW0KKyAgICAqIFtUSFJJRlQtMTYyNF0gLSBJc3NldCBHZW5lcmF0ZWQgZGlmZmVyZW50bHkgb24gZGlmZmVyZW50IHBsYXRmb3JtcworICAgICogW1RIUklGVC0xNjIyXSAtIEluY29ycmVjdCBzaXplIHJldHVybmVkIG9uIHJlYWQKKyAgICAqIFtUSFJJRlQtMTYyMV0gLSBNZW1vcnkgbGVha3MKKyAgICAqIFtUSFJJRlQtMTYxMl0gLSBCYXNlNjQgZW5jb2RpbmcgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTE2MjddIC0gY29tcGlsZXIgYnVpbHQgdXNpbmcgY29tcGlsZXJzLnZjeHByb2ogY2Fubm90IGJlIHVzZWQgdG8gYnVpbGQgc29tZSB0ZXN0IC50aHJpZnQgZmlsZXMKKyAgICAqIFtUSFJJRlQtMTU3MV0gLSBVcGRhdGUgUnVieSBIVFRQIHRyYW5zcG9ydCBmb3IgcmVjZW50IFJ1YnkgdmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtMTAyM10gLSBUaHJpZnQgZW5jb2RpbmcgIChVVEYtOCkgaXNzdWUgd2l0aCBSdWJ5IDEuOS4yCisgICAgKiBbVEhSSUZULTEwOTBdIC0gRG9jdW1lbnQgdGhlIGdlbmVyYXRpb24gb2YgYSBmaWxlIGNhbGxlZCAiQ29uc3RhbnRzLmphdmEiCisgICAgKiBbVEhSSUZULTEwODJdIC0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQgc29tZXRpbWVzIGNhbGxzIGNsb3NlKCkgb24gYW4gdW5kZWZpbmVkIHZhbHVlCisgICAgKiBbVEhSSUZULTk1Nl0gLSBQeXRob24gbW9kdWxlJ3MgdmVyc2lvbiBtZXRhLWRhdGEgc2hvdWxkIGJlIHVwZGF0ZWQKKyAgICAqIFtUSFJJRlQtOTczXSAtIENvY29hIGxpYnJhcnkgd29uJ3QgY29tcGlsZSB1c2luZyBjbGFuZworICAgICogW1RIUklGVC0xNjMyXSAtIHJ1Ynk6IGRhdGEgY29ycnVwdGlvbiBpbiB0aHJpZnRfbmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIE1lbW9yeUJ1ZmZlclRyYW5zcG9ydAorICAgICogW1RIUklGVC0xNjY1XSAtIFRCaW5hcnlQcm90b2NvbDogZXhjZWVkZWQgbWVzc2FnZSBsZW5ndGggcmFpc2VzIGdlbmVyaWMgVEV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xNjY0XSAtIFJlZmVyZW5jZSB0byBub24tZXhpc3RpbmcgdmFyaWFibGUgaW4gYnVpbGQgc2NyaXB0CisgICAgKiBbVEhSSUZULTE2NjNdIC0gSmF2YSBUaHJpZnQgc2VydmVyIGlzIG5vdCB0aHJvd2luZyBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTE2NjJdIC0gInJlbW92ZU9iamVjdDoiIHNob3VsZCBiZSAicmVtb3ZlT2JzZXJ2ZXI6IiBpbiBbLVRTb2NrZXRTZXJ2ZXIgZGVhbGxvY10/CisgICAgKiBbVEhSSUZULTE2NDNdIC0gRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrIGluIFRCaW5hcnlQcm90b2NvbC5yZWFkU3RyaW5nCisgICAgKiBbVEhSSUZULTE2NzRdIC0gVXBkYXRlIFRocmlmdCBEIGxpYnJhcnkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIDIuMDYwCisgICAgKiBbVEhSSUZULTE2NzNdIC0gUnVieSBjb21waWxlIGZsYWdzIGZvciBleHRlbnNpb24gZm9yIG11bHRpIGFyY2ggYnVpbGRzIChvcyB4KQorICAgICogW1RIUklGVC0xNjU1XSAtIENvbmZpZ3VyZSBzdGlsbCB0cnlpbmcgdG8gdXNlIHRocmlmdF9nZW5lcmF0b3JzIGluIG91dHB1dAorICAgICogW1RIUklGVC0xNjU0XSAtIGNfZ2xpYiB0aHJpZnRfc29ja2V0X3JlYWQoKSByZXR1cm5zIGNvcnJ1cHRlZCBkYXRhCisgICAgKiBbVEhSSUZULTE2NTNdIC0gVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgbGVha3MgQ0xPU0VfV0FJVCBzb2NrZXRzCisgICAgKiBbVEhSSUZULTE2NThdIC0gSmF2YSB0aHJpZnQgc2VydmVyIGlzIG5vdCB0aHJvd2luZyBUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTY1Nl0gLSBTZXR0aW5nIHByb3BlciBoZWFkZXJzIGluIFRIdHRwU2VydmVyLmNwcCBzbyB0aGF0ICJDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyIgb24ganMgY2xpZW50IGNhbiB3b3JrLgorICAgICogW1RIUklGVC0xNjUyXSAtIFRTYXNsVHJhbnNwb3J0IGRvZXMgbm90IGxvZyB0aGUgZXJyb3Igd2hlbiBrZXJiZXJvcyBhdXRoIGZhaWxzCisgICAgKiBbVEhSSUZULTIyNzJdIC0gQ0xPTkUgLSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2sgaW4gVEJpbmFyeVByb3RvY29sLnJlYWRTdHJpbmcKKyAgICAqIFtUSFJJRlQtMjA4Nl0gLSBJbnZhbGlkIGdlbmVyYXRlZCBjb2RlIGZvciBOb2RlLkpTIHdoZW4gdXNpbmcgbmFtZXNwYWNlcworICAgICogW1RIUklGVC0xNjg2XSAtIHRfcGhwX2dlbmVyYXRvci5jYyB1c2VzICJhbmQiIGluc3RlYWQgb2YgIiYmIiwgYW5kIGNhdXNlcyBjb21waWxlciBlcnJvcnMgd2l0aCBWaXN1YWwgU3R1ZGlvCisgICAgKiBbVEhSSUZULTE2OTNdIC0gbGlidGhyaWZ0IGhhcyBkZXBlbmRlbmN5IG9uIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgaHR0cGNvcmUKKyAgICAqIFtUSFJJRlQtMTY4OV0gLSBkb24ndCBleGl0KC0xKSBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTY3OV0gLSBOb2RlSlM6IHByb3RvY29sIHJlYWRTdHJpbmcoKSBzaG91bGQgdHJlYXQgc3RyaW5nIGFzIHV0ZjgsIG5vdCBiaW5hcnkKKyAgICAqIFtUSFJJRlQtMTcyMV0gLSBEaXN0IGJyb2tlbiBkdWUgdG8gMC44LjAgdG8gMC45LjAgY2hhbmdlcworICAgICogW1RIUklGVC0xNzEwXSAtIE1pbm9yIGlzc3VlcyBpbiB0ZXN0IGNhc2UgY29kZQorICAgICogW1RIUklGVC0xNzA5XSAtIFdhcm5pbmcgIkJpdHdpc2Utb3Igb3BlcmF0b3IgdXNlZCBvbiBhIHNpZ24tZXh0ZW5kZWQgb3BlcmFuZDsgY29uc2lkZXIgY2FzdGluZyB0byBhIHNtYWxsZXIgdW5zaWduZWQgdHlwZSBmaXJzdCIgaW4gVEJpbmFyeVByb3RvY29sLmNzIGF0IFJlYWRJbnQ2NCgpCisgICAgKiBbVEhSSUZULTE3MDddIC0gW3J1YnldIEFkanVzdCBzZXJ2ZXJfc3BlYy5yYiBmb3IgUlNwZWMgMi4xMS54IGFuZCBSdWJ5IDEuOS4zCisgICAgKiBbVEhSSUZULTE2NzFdIC0gQ29jb2EgY29kZSBnZW5lcmF0b3IgZG9lcyBub3QgcHV0IGtleXdvcmRzIGludG8gZ2VuZXJhdGVkIG1ldGhvZCBjYWxscworICAgICogW1RIUklGVC0xNjcwXSAtIEluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIGEgVGhyaWZ0IGludGVyZmFjZQorICAgICogW1RIUklGVC0xNjY5XSAtIE5hbWVFcnJvcjogZ2xvYmFsIG5hbWUgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicgaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMTY2OF0gLSBDb21waWxlIGVycm9yIGluIGNvbnRyaWIvZmIzMDMsIHRocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICAgICogW1RIUklGVC0xODQ1XSAtIEZpeCBjb21waWxlciB3YXJuaW5nIGNhdXNlZCBieSBpbXBsaWNpdCBzdHJpbmcgY29udmVyc2lvbiB3aXRoIFhjb2RlIDQuNgorICAgICogW1RIUklGVC0zMDRdIC0gQnVpbGRpbmcgdGhlIFB5dGhvbiBsaWJyYXJ5IHJlcXVpcmVzIGRldmVsb3BtZW50IGhlYWRlcnMKKyAgICAqIFtUSFJJRlQtMzY5XSAtIHNldHMgYW5kIG1hcHMgYnJlYWsgZXF1YWxpdHkKKyAgICAqIFtUSFJJRlQtNTU2XSAtIFJ1YnkgY29tcGlsZXIgZG9lcyBub3QgY29ycmVjdGx5IHJlZmVycmVkIHRvIHRvcC1sZXZlbCBtb2R1bGVzIHdoZW4gYSBzdWJtb2R1bGUgbWFza3MgdGhlIHRvcC1sZXZlbCBuYW1lCisgICAgKiBbVEhSSUZULTQ4MV0gLSBpbmRlbnRhdGlvbiBvZiBydWJ5IGNsYXNzZXMgaXMgb2ZmIGJ5IGEgZmV3CisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE0OThdIC0gQWxsb3cgVFRocmVhZGVkUG9vbFNlcnZlci5BcmdzIHRvIHBhc3MgYSBFeGVjdXRvclNlcnZpY2UKKyAgICAqIFtUSFJJRlQtMTQ0NF0gLSBGdW5jdGlvblJ1bm5lciAtIGFkZCBzeW50YWN0aWMgc3VnYXIgdG8gY3JlYXRlIHNoYXJlZF9wdHJzCisgICAgKiBbVEhSSUZULTE0NDNdIC0gZGVmaW5lIGEgVFByb2Nlc3NvciBoZWxwZXIgY2xhc3MgdG8gaW1wbGVtZW50IHByb2Nlc3MoKQorICAgICogW1RIUklGVC0xNDQxXSAtIEdlbmVyYXRlIGNvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycyBmb3IgZXhjZXB0aW9uIGNsYXNzIHRvIGxldCBpdCB1cGRhdGUgbWVzc2FnZSBwcm9wZXJ0eSBhdXRvbWF0aWNhbGx5LgorICAgICogW1RIUklGVC0xNTIwXSAtIEVtYmVkIHZlcnNpb24gbnVtYmVyIGluIGVybGFuZyAuYXBwIGZpbGUKKyAgICAqIFtUSFJJRlQtMTQ4MF0gLSBweXRob246IHJlbW92ZSB0YWJzLCBhZGp1c3Qgd2hpdGVzcGFjZSBhbmQgYWRkcmVzcyBQRVA4IHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTE0ODVdIC0gUGVyZm9ybWFuY2U6IHBhc3MgbGFyZ2UgYW5kL29yIHJlZmNvdW50ZWQgYXJndW1lbnRzIGFzICJjb25zdCIKKyAgICAqIFtUSFJJRlQtMTQ4NF0gLSBJbnRyb2R1Y2UgcGhwdW5pdCB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTE1MzJdIC0gVGhlIHR5cGUgc3BlY2lmaWNhdGlvbnMgaW4gdGhlIGdlbmVyYXRlZCBFcmxhbmcgY29kZSBzaG91bGQgaW5jbHVkZSAidW5kZWZpbmVkIiB3aGVyZSBpdCdzIHVzZWQgYXMgYSBkZWZhdWx0IHZhbHVlCisgICAgKiBbVEhSSUZULTE1MzRdIC0gUmVxdWlyZWQgZmllbGRzIGluIHRoZSBEZWxwaGkgY29kZSBnZW5lcmF0b3IuCisgICAgKiBbVEhSSUZULTE0NjldIC0gSmF2YSBpc3NldCBzcGFjZSBvcHRpbWl6YXRpb24KKyAgICAqIFtUSFJJRlQtMTQ2NV0gLSBWaXNpYmlsaXR5IG9mIG1ldGhvZHMgaW4gZ2VuZXJhdGVkIGphdmEgY29kZQorICAgICogW1RIUklGVC0xNDUzXSAtIERvbid0IGNoYW5nZSB0eXBlcyBvZiBhcmd1bWVudHMgd2hlbiBzZXJpYWxpemluZyB3aXRoIHRocmlmdCBwaHAgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTE0NTJdIC0gZ2VuZXJhdGUgYSBzd2FwKCkgbWV0aG9kIGZvciBhbGwgZ2VuZXJhdGVkIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMTQ1MV0gLSBGcmFtZWRUcmFuc3BvcnQ6IFByZXZlbnQgaW5maW5pdGUgbG9vcCB3aGVuIHdyaXRpbmcKKyAgICAqIFtUSFJJRlQtMTUyMV0gLSBUd28gcGF0Y2hlcyBmb3IgbW9yZSBQZXJmb3JtYW5jZQorICAgICogW1RIUklGVC0xNTU1XSAtIERlbHBoaSB2ZXJzaW9uIG9mIHRoZSB0dXRvcmlhbCBjb2RlCisgICAgKiBbVEhSSUZULTE1MzVdIC0gV2h5IHRocmlmdCBkb24ndCB1c2Ugd3JhcHBlZCBjbGFzcyBmb3Igb3B0aW9uYWwgZmllbGRzID8KKyAgICAqIFtUSFJJRlQtMTIwNF0gLSBSdWJ5IGF1dG9nZW5lcmF0ZWQgZmlsZXMgc2hvdWxkIHJlcXVpcmUgJ3RocmlmdCcgZ2VtCisgICAgKiBbVEhSSUZULTEzNDRdIC0gVXNpbmcgdGhlIGh0dHBjIG1vZHVsZSBkaXJlY3RseSByYXRoZXIgdGhhbiB0aGUgZGVwcmVjYXRlZCBodHRwIGxheWVyCisgICAgKiBbVEhSSUZULTEzNDNdIC0gbm9fYXV0b19pbXBvcnQgbWluLzIgdG8gYXZvaWQgY29tcGlsZSB3YXJuaW5nCisgICAgKiBbVEhSSUZULTEzNDBdIC0gQWRkIHN1cHBvcnQgb2YgQVJDIHRvIE9iamVjdGl2ZS1DCisgICAgKiBbVEhSSUZULTE2MTFdIC0gSW1wcm92ZWQgY29kZSBnZW5lcmF0aW9uIGZvciB0eXBlZGVmcworICAgICogW1RIUklGVC0xNTkzXSAtIFBhc3Mgb24gZXJyb3JzIGxpa2UgImNvbm5lY3Rpb24gY2xvc2VkIiB0byB0aGUgaGFuZGxlciBtb2R1bGUKKyAgICAqIFtUSFJJRlQtMTYxNV0gLSBQSFAgTmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTE1NjddIC0gVGhyaWZ0L2NwcDogQWxsb3cgYWx0ZXJuYXRlIGNsYXNzZXMgdG8gYmUgdXNlZCBmb3IKKyAgICAqIFtUSFJJRlQtMTA3Ml0gLSBNaXNzaW5nIC0gKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvciBpbiBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oCisgICAgKiBbVEhSSUZULTE2NTBdIC0gW3J1YnldIFVwZGF0ZSBjbGVhbiBpdGVtcyBhbmQgc3ZuOmlnbm9yZSBlbnRyaWVzIGZvciBPUyBYIGFydGlmYWN0cworICAgICogW1RIUklGVC0xNjYxXSAtIFtQQVRDSF0gQWRkIC0td2l0aC1xdDQgY29uZmlndXJlIG9wdGlvbgorICAgICogW1RIUklGVC0xNjc1XSAtIERvIHdlIGhhdmUgYW55IHBsYW4gdG8gc3VwcG9ydCBzY2FsYT8KKyAgICAqIFtUSFJJRlQtMTY0NV0gLSBSZXBsYWNlIE9iamVjdCN0ZWUgd2l0aCBtb3JlIGNvbnZlbnRpb25hbCBPYmplY3QjdGFwIGluIHNwZWNzCisgICAgKiBbVEhSSUZULTE2NDRdIC0gVXBncmFkZSBSU3BlYyB0byAyLjEwLnggYW5kIHJlZmFjdG9yIHNwZWNzIGFzIG5lZWRlZAorICAgICogW1RIUklGVC0xNjcyXSAtIE1vbm9Ub3VjaCAoYW5kIE1vbm8gZm9yIEFuZHJvaWQpIGNvbXBhdGliaWxpdHkKKyAgICAqIFtUSFJJRlQtMTcwMl0gLSBhIHRocmlmdCBtYW51YWwKKyAgICAqIFtUSFJJRlQtMTY5NF0gLSBSZS1FbmFibGUgc2VyaWFsaXphdGlvbiBmb3IgV1A3IFNpbHZlcmxpZ2h0CisgICAgKiBbVEhSSUZULTE2OTFdIC0gU2VyaWFsaXplci9kZXNlcmlhbGl6ZXIgc3VwcG9ydCBmb3IgRGVscGhpCisgICAgKiBbVEhSSUZULTE2ODhdIC0gVXBkYXRlIElETCBwYWdlIG1hcmt1cAorICAgICogW1RIUklGVC0xNzI1XSAtIFR1dG9yaWFsIHdlYiBwYWdlcyBmb3IgRGVscGhpIGFuZCBDIworICAgICogW1RIUklGVC0xNzE0XSAtIFtydWJ5XSBFeHBsaWNpdGx5IGFkZCBDV0QgdG8gUnVieSB0ZXN0X3N1aXRlcy5yYgorICAgICogW1RIUklGVC0zMTddIC0gSXNzdWVzIHdpdGggSmF2YSBzdHJ1Y3QgdmFsaWRhdGlvbgorICAgICogW1RIUklGVC0xNjRdIC0gQnVpbGQgd2ViIHR1dG9yaWFsIG9uIEluY3ViYXRvciB3ZWIgc2l0ZQorICAgICogW1RIUklGVC01NDFdIC0gQ29jb2EgY29kZSBnZW5lcmF0b3IgZG9lc24ndCBwdXQga2V5d29yZHMgYmVmb3JlIGFsbCBhcmd1bWVudHMuCisgICAgKiBbVEhSSUZULTY4MV0gLSBUaGUgSFRNTCBnZW5lcmF0b3IgZG9lcyBub3QgaGFuZGxlIEphdmFEb2Mgc3R5bGUgY29tbWVudHMgdmVyeSB3ZWxsCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTE1MDBdIC0gRCBwcm9ncmFtbWluZyBsYW5ndWFnZSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTE1MTBdIC0gVGhlcmUgc2hvdWxkIGJlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKc29uUHJvdG9jb2wgZm9yIHJ1YnkKKyAgICAqIFtUSFJJRlQtMTExNV0gLSBweXRob24gVEJhc2UgY2xhc3MgZm9yIGR5bmFtaWMgKGRlKXNlcmlhbGl6YXRpb24sIGFuZCBfX3Nsb3RzX18gb3B0aW9uIGZvciBtZW1vcnkgc2F2aW5ncworICAgICogW1RIUklGVC0xOTUzXSAtIHN1cHBvcnQgZm9yIGFzcC5uZXQgbXZjIDMKKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMTIzNV0gLSBIb3cgY291bGQgSSB1c2UgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5IHdpdGhUTm9uQmxvY2tpbmdTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTM2OF0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgdXNhZ2UKKyAgICAqIFtUSFJJRlQtMTA2MV0gLSBSZWFkIGFuIGludmFsaWQgZnJhbWUgc2l6ZSBvZiAwLiBBcmUgeW91IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQgb24gdGhlIGNsaWVudCBzaWRlPworICAgICogW1RIUklGVC00OTFdIC0gUmlwcGluZyByYXcgcHRocmVhZHMgb3V0IG9mIFRGaWxlVHJhbnNwb3J0IGFuZCBhc3NvY2lhdGVkIHRlc3QgaXNzdWVzCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTE1OTZdIC0gRGVscGhpOiBUZXN0IGNsaWVudHMgc2hvdWxkIGhhdmUgYSByZXR1cm4gY29kZXMgdGhhdCByZWZsZWN0IHdoZXRoZXIgdGhleSBzdWNjZWVkZWQgb3Igbm90CisgICAgKiBbVEhSSUZULTk4Ml0gLSBqYXZhbWU6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMTcyMl0gLSBDIyBXUDcgQXNzZW1ibHkgYWRkaXRpb24gYmVha3MgbW9ubyBidWlsZAorICAgICogW1RIUklGVC0zMzZdIC0gQ29tcGFjdCBQcm90b2NvbCBpbiBDIworCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTE2MTNdIC0gQWRkIGNvZGUgYmFjayBpbnRvIGVtcHR5IHNvdXJjZSBmaWxlIFRvU3RyaW5nVGVzdC5qYXZhCisgICAgKiBbVEhSSUZULTE3MThdIC0gSW5jb3JyZWN0IGNoZWNrIGluIFRGaWxlVHJhbnNwb3J0VGVzdAorCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTE0NjNdIC0gRGVjb3VwbGUgVGhyaWZ0IElETCBmcm9tIGdlbmVyYXRvcnMKKyAgICAqIFtUSFJJRlQtMTQ2Nl0gLSBQcm9wZXIgRG9jdW1lbnRhdGlvbiBmb3IgVGhyaWZ0IEMgR2xpYgorICAgICogW1RIUklGVC0xNTM5XSAtIEJ1aWxkIGFuZCBkaXN0cmlidXRlIHRoZSBmYjMwMyBweXRob24gbGlicmFyaWVzIGFsb25nIHdpdGggdGhyaWZ0CisgICAgKiBbVEhSSUZULTE2ODVdIC0gUGxlYXNlIGFkZCAiYWVyZW8uY29tIiB0byAiUG93ZXJlZCBieSBBcGFjaGUgVGhyaWZ0IiBsaXN0IGluIGFib3V0IHBhZ2UKKyAgICAqIFtUSFJJRlQtMzMwXSAtIFRQcm9jZXNzb3IgLSBhZGRpdGlvbmFsIG1ldGhvZCB0byBjYWxsZWQgd2hlbiBjb25uZWN0aW9uIGlzIGJyb2tlbgorCisKKworVGhyaWZ0IDAuOAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xNDM2XSAtIHBpcCBpbnN0YWxsIHRocmlmdCBmYWlscyBvbiBXaW5kb3dzIHdpdGggIlVuYWJsZSB0byBmaW5kIHZjdmFyc2FsbC5iYXQiCisgICAgKiBbVEhSSUZULTE0MzJdIC0gSmF2YXNjcmlwdCBzdHJ1Y3QgY29uc3RhbnRzIGRlY2xhcmVkIGluIHRoZSBzYW1lIGZpbGUgYXMgdGhlaXIgc3RydWN0IGRlZmluaXRpb24gd2lsbCBjYXVzZSBhbiBlcnJvcgorICAgICogW1RIUklGVC0xNDI4XSAtIHNoYXJlZC50aHJmdCBkb2VzIG5vdCBpbmNsdWRlIG5hbWVzcGFjZSBmb3IgcGhwLCBzbyB0aHJpZnQgY29tcGlsZXIgZ2VuZXJhdGUgaW5jb3JyZWN0IG5hbWUKKyAgICAqIFtUSFJJRlQtMTQyNl0gLSBEaXN0IHBhY2thZ2UgbWlzc2luZyBmaWxlcyBmb3IgcmVsZWFzZSAwLjgKKyAgICAqIFtUSFJJRlQtMTQyNV0gLSBUaGUgTm9kZSBwYWNrYWdlIGlzIGluY29tcGF0aWJsZSB3aXRoIGxhdGVzdCBub2RlICgwLjYpICYgbnBtICgxLjAuMjcpCisgICAgKiBbVEhSSUZULTE0MTZdIC0gUHl0aG9uIFVuaXQgdGVzdCBpcyBicm9rZW4gb24gY2kKKyAgICAqIFtUSFJJRlQtMTQxOV0gLSBBYnN0cmFjdE5vbkJsb2NraW5nU2VydmVyIGRvZXMgbm90IGNhdGNoIGVycm9ycyB3aGVuIGludm9raW5nIHRoZSBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtMTQyNF0gLSBSdWJ5IHNwZWNzIGZhaWwgd2hlbiBydW4gd2l0aCByYWtlCisgICAgKiBbVEhSSUZULTE0MjBdIC0gTm9uYmxvY2tpbmcgYW5kIEhzSGEgc2VydmVyIHNob3VsZCBtYWtlIHN1cmUgdG8gY2xvc2UgYWxsIHRoZWlyIHNvY2tldCBjb25uZWN0aW9ucyB3aGVuIHRoZSBzZWxlY3RvciBleGl0cworICAgICogW1RIUklGVC0xNDEzXSAtIEdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHJlYWQgTWFwRW5kIC8gTGlzdEVuZCAvIFNldEVuZAorICAgICogW1RIUklGVC0xNDA5XSAtIE5hbWUgY29uZmxpY3QgY2hlY2sgZG9lcyBub3Qgd29yayBwcm9wZXJseSBmb3IgZXhjZXB0aW9uIG9iamVjdChEZWxwaGkpLgorICAgICogW1RIUklGVC0xNDA4XSAtIERlbHBoaSBUZXN0IFNlcnZlcjogRXhjZXB0aW9uIHRlc3QgY2FzZSBmYWlscyBkdWUgdG8gbmFtaW5nIGNvbmZsaWN0IHdpdGggZS5tZXNzYWdlCisgICAgKiBbVEhSSUZULTE0MDddIC0gVHlwbyBpbiBQeXRob24gc29ja2V0IHNlcnZlciBjYXVzZXMgVGhyaWZ0IHRvIGZhaWwgd2hlbiB3ZSBlbmFibGUgYSBnbG9iYWwgc29ja2V0IHRpbW91dAorICAgICogW1RIUklGVC0xMzk3XSAtIENJIHNlcnZlciBmYWlscyBkdXJpbmcgYnVpbGQgZHVlIHRvIHVudXNlZCBwYXJhbWV0ZXJzIGluIGRlbHBoaSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMTQwNF0gLSBEZWxwaGkgY29tcGlsZXIgZ2VuZXJhdGVzIHN0cnVjdCByZWFkZXIgY29kZSB3aXRoIHByb2JsZW0uCisgICAgKiBbVEhSSUZULTE0MDBdIC0gUnVieSBuYXRpdmUgZXh0ZW5zaW9uIGFib3J0cyB3aXRoIF9fc3RhY2tfY2hrX2ZhaWwgaW4gT1NYCisgICAgKiBbVEhSSUZULTEzOTldIC0gT25lIG9mIHRoZSBUU2VydmVySW1wbC5DcmVhdGUgQ1RPUnMgbGFja3MgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMTM5MF0gLSBEZWJpYW4gcGFja2FnZXMgYnVpbGQgZml4IGZvciBTcXVlZXplIChidWlsZCBmcm9tIHRoZSBvZmZpY2lhbCAgMC43LjAgdGFyYmFsbCkKKyAgICAqIFtUSFJJRlQtMTM5M10gLSBUVHJhbnNwb3J0RXhjZXB0aW9uJ3MgdGhyb3duIGZyb20gVEh0dHBDbGllbnQgY29udGFpbiBzdXBlcmZsdW91cyBzbGFzaGVzIGluIHRoZSBFeGNlcHRpb24gbWVzc2FnZQorICAgICogW1RIUklGVC0xMzkyXSAtIEVuYWJsaW5nIGJvdGggbmFtZXNwYWNlcyBhbmQgYXV0b2xvYWRpbmcgaW4gZ2VuZXJhdGVkIFBIUCBjb2RlIHdvbid0IHdvcmsuCisgICAgKiBbVEhSSUZULTE0MDZdIC0gQnVpbGQgZXJyb3IgYWZ0ZXIgYXBwbHlpbmcgVEhSSUZULTEzOTUKKyAgICAqIFtUSFJJRlQtMTQwNV0gLSBEZWxwaGkgY29tcGlsZXIgZG9lcyBub3QgZ2VuZXJhdGVzIGNvbnRhaW5lciBzZXJpYWxpemVyIHByb3Blcmx5LgorICAgICogW1RIUklGVC0xNDExXSAtIGphdmEgZ2VuZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgdHlwZSBwYXJhbWV0ZXIgZm9yIFRCYXNlUHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTE0NzNdIC0gSlNPTiBjb250ZXh0IHN0YWNrIG1heSBiZSBsZWZ0IGluIGFuIGluY29ycmVjdCBzdGF0ZSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucworICAgICogW1RIUklGVC0xMzMxXSAtIFJ1YnkgbGlicmFyeSBkZXNlcmlhbGl6ZXMgYW4gZW1wdHkgbWFwIHRvIG5pbAorICAgICogW1RIUklGVC0xMzMwXSAtIFBIUCBOYW1lc3BhY2VzIG5vIGxvbmdlciBnZW5lcmF0ZWQKKyAgICAqIFtUSFJJRlQtMTMyOF0gLSBUQmFzZUhlbHBlci50b1N0cmluZyguLi4pIGFwcGVuZHMgQnl0ZUJ1ZmZlciBkYXRhIG91dHNpZGUgb2YgdmFsaWQgYnVmZmVyIHJhbmdlCisgICAgKiBbVEhSSUZULTEzMjJdIC0gT0NhbWwgbGliIGZhaWwgdG8gY29tcGlsZTogVGhyaWZ0Lm1sIGxpbmUgMzA1LCBpbnQgdnMgaW50MzIgbWlzbWF0Y2gKKyAgICAqIFtUSFJJRlQtMTE0M10gLSBCdWlsZCBkb2Vzbid0IGRldGVjdCBjb3JyZWN0IGFyY2hpdGVjdHVyZSB0eXBlIG9uIDY0Yml0IG9zeAorICAgICogW1RIUklGVC0xMjA1XSAtIHBvcnQgc2VydmVyIHVuZHVseSBmcmFnaWxlIHdpdGggYXJiaXRyYXJ5IGlucHV0CisgICAgKiBbVEhSSUZULTEyNzldIC0gdHlwZSBzZXQgaXMgaGFuZGxlZCBpbmNvcnJlY3RseSB3aGVuIHdyaXRpbmcgb2JqZWN0CisgICAgKiBbVEhSSUZULTEyOThdIC0gU3RhbmRhcmQgc2NoZW1lIGRvZXNuJ3QgcmVhZCBvciB3cml0ZSBtZXRhZGF0YSBhbG9uZyB3aXRoIGZpZWxkIHZhbHVlcworICAgICogW1RIUklGVC0xMjY1XSAtIEMrKyBjb250YWluZXIgZGVzZXJpYWxpemUKKyAgICAqIFtUSFJJRlQtMTI2M10gLSBwdWJsaXNoIHJ1YnkgY2xpZW50IHRvIHJ1YnlnZW1zCisgICAgKiBbVEhSSUZULTEzODRdIC0gSmF2YSBoZWxwIG1lbnUgbWlzc2luZyBuZXdsaW5lIG5lYXIgamF2YW1lIGZsYWcKKyAgICAqIFtUSFJJRlQtMTM4Ml0gLSBCdW5kbGUgaW5zdGFsbCBkb2Vzbm90IHdvcmsgYmVjYXVzZSB0aHJpZnQgY3Jhc2hlcworICAgICogW1RIUklGVC0xMzgxXSAtIFRocmlmdCBDKysgbGlicyBoYXZlIGluY29ycmVjdGx5IHZlcnNpb25lZCBuYW1lcworICAgICogW1RIUklGVC0xMzUwXSAtIEdvIGxpYnJhcnkgY29kZSBkb2VzIG5vdCBidWlsZCBhcyBvZiByNjAgKG1vc3QgcmVjZW50IHJlbGVhc2UpCisgICAgKiBbVEhSSUZULTEzNjVdIC0gVHVwbGVQcm90b2NvbCN3cml0ZUJpdFNldCB1bmludGVudGlvbmFsbHkgd3JpdGVzIGEgdmFyaWFibGUgbGVuZ3RoIGJ5dGUgYXJyYXkKKyAgICAqIFtUSFJJRlQtMTM1OV0gLSAtLWdlbi1jb2IgY3BwOmNvYl9zdHlsZSBkb2VzIG5vdCBjb21waWxlIGFueW1vcmUKKyAgICAqIFtUSFJJRlQtMTMxOV0gLSBNaXNtYXRjaCBiZXR3ZWVuIGhvdyBhIHVuaW9uIHJlYWRzIGFuZCB3cml0ZXMgYSBjb250YWluZXIKKyAgICAqIFtUSFJJRlQtMTMwOV0gLSBsaWJmYjMwMy0wLjcuMC5qYXIgbWlzc2luZyBpbiBtYXZlbiByZXBvc2l0b3J5CisgICAgKiBbVEhSSUZULTEyMzhdIC0gVGhyaWZ0IEpTIGNsaWVudCBjYW5ub3QgcmVhZCBtYXAgb2Ygc3RydWN0dXJlcworICAgICogW1RIUklGVC0xMjU0XSAtIENvZGUgY2FuJ3QgYmUgY29tcGlsZWQgYWdhaW5zdCBhIHJlZ3VsYXIgSlJFOiBPYmplY3QuY2xvbmUoKSBvdmVycmlkZSBoYXMgYSBkaWZmZXJlbnQgcmV0dXJuIHR5cGUKKyAgICAqIFtUSFJJRlQtMTM2N10gLSBNYWMgT1NYIGJ1aWxkIGZhaWxzIHdpdGggIm5vIHN1Y2ggZmlsZSB0byBsb2FkIC0tIHNwZWMvcmFrZS9zcGVjdGFzayIKKyAgICAqIFtUSFJJRlQtMTM1NV0gLSBSdW5uaW5nIG1ha2UgaW4gbGliL3JiIGRvZXNuJ3QgYnVpbGQgdGhlIG5hdGl2ZSBleHRlbnNpb25zCisgICAgKiBbVEhSSUZULTEzNzBdIC0gRGViaWFuIHBhY2thZ2luZyBzaG91bGQgQnVpbGQtRGVwZW5kIG9uIGxpYmdsaWIyLjAtZGV2CisgICAgKiBbVEhSSUZULTEzNDJdIC0gQ29tcGlsYXRpb24gcHJvYmxlbSBvbiBXaW5kb3dzIG9mIGZhc3RiaW5hcnkuYworICAgICogW1RIUklGVC0xMzQxXSAtIFRQcm90b2NvbC5oIGVuZGlhbiBkZXRlY3Rpb24gd3Jvbmcgd2l0aCBib29zdAorICAgICogW1RIUklGVC0xNTgzXSAtIGNfZ2xpYiBsZWFrcyBtZW1vcnkKKyAgICAqIFtUSFJJRlQtMTU4Ml0gLSBCYWQgaW5jbHVkZXMgb2YgbmVzdGVkIHRocmlmdCBmaWxlcyBpbiBjX2dsaWIKKyAgICAqIFtUSFJJRlQtMTU3OF0gLSBDX0dMaWIgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0xMDI3XSAtICdtYWtlIC1qIDE2JyBmYWlscyB3aXRoICJ1bnRlcm1pbmF0ZWQgI2lmZGVmIiBlcnJvcgorICAgICogW1RIUklGVC0xMTIxXSAtIEphdmEgc2VydmVyIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gaW4gMC42CisgICAgKiBbVEhSSUZULTg1N10gLSB0ZXN0cyBydW4gYnkgIm1ha2UgaW5zdGFsbCIgZmFpbCBpZiBnZW5lcmF0b3JzIGFyZSBkaXNhYmxlZAorICAgICogW1RIUklGVC0zODBdIC0gVXNlIHNldHVwdG9vbHMgZm9yIHB5dGhvbiBidWlsZAorCisjIyBEZXBlbmRlbmN5IHVwZ3JhZGUKKyAgICAqIFtUSFJJRlQtMTI1N10gLSB0aHJpZnQncyBkZXBlbmRlbmN5IHNjb3BlIG9uIGphdmF4LnNlcnZsZXQ6c2VydmxldC1hcGkgc2hvdWxkIGJlICdwcm92aWRlZCcKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTQ0NV0gLSBtaW5vciBDKysgZ2VuZXJhdG9yIHZhcmlhYmxlIGNsZWFudXAKKyAgICAqIFtUSFJJRlQtMTQzNV0gLSBtYWtlIFRFeGNlcHRpb24uTWVzc2FnZSBwcm9wZXJ0eSBjb25mb3JtYW50IHRvIHRoZSB1c3VhbCBleHBlY3RhdGlvbnMKKyAgICAqIFtUSFJJRlQtMTQzMV0gLSBSZW5hbWUgJ3N5cycgbW9kdWxlIHRvICd1dGlsJworICAgICogW1RIUklGVC0xMzk2XSAtIERlcGhpIGdlbmVyYXRvciBoYXMgZGVwZW5kYWN5IG9uIGJvb3N0IDEuNDIgbGF0ZXIuCisgICAgKiBbVEhSSUZULTEzOTVdIC0gUGF0Y2ggdG8gcHJldmVudCB3YXJuaW5ncyBmb3IgaW50ZWdlciB0eXBlcyBpbiBzb21lIGNhc2VzCisgICAgKiBbVEhSSUZULTEyNzVdIC0gIHRocmlmdDogYWx3YXlzIHByZWZpeCBuYW1lc3BhY2VzIHdpdGggIiA6OiIKKyAgICAqIFtUSFJJRlQtMTI3NF0gLSAgdGhyaWZ0OiBmYWlsIGNvbXBpbGF0aW9uIGlmIGFuIHVuZXhwZWN0ZWQgdG9rZW4gaXMKKyAgICAqIFtUSFJJRlQtMTI3MV0gLSAgdGhyaWZ0OiBmaXggbWlzc2luZyBuYW1lc3BhY2UgaW4gZ2VuZXJhdGVkIGxvY2FsCisgICAgKiBbVEhSSUZULTEyNzBdIC0gIHRocmlmdDogYWRkIC0tYWxsb3ctbmVnLWtleXMgYXJndW1lbnQgdG8gYWxsb3cKKyAgICAqIFtUSFJJRlQtMTM0NV0gLSBBbGxvdyBidWlsZGluZyB3aXRob3V0IHRlc3RzCisgICAgKiBbVEhSSUZULTEyODZdIC0gTW9kZXJuaXplIHRoZSBUaHJpZnQgUnVieSBMaWJyYXJ5IERldiBFbnZpcm9ubWVudAorICAgICogW1RIUklGVC0xMjg0XSAtICB0aHJpZnQ6IGZpeCBwcm9jZXNzb3IgaW5oZXJpdGFuY2UKKyAgICAqIFtUSFJJRlQtMTI4M10gLSAgdGhyaWZ0OiB3cmFwIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbigpIHRvIDgwCisgICAgKiBbVEhSSUZULTEyODJdIC0gVXBncmFkZSBodHRwY2xpZW50IHRvIDQuMS4yIChmcm9tIDQuMC4xKQorICAgICogW1RIUklGVC0xMjgxXSAtICBhZGQgQGdlbmVyYXRlZCB0byB0aGUgZG9jYmxvY2sKKyAgICAqIFtUSFJJRlQtMTI4MF0gLSAgVGhyaWZ0OiBJbXByb3ZlIE1vbml0b3IgZXhjZXB0aW9uLWZyZWUgaW50ZXJmYWNlcworICAgICogW1RIUklGVC0xMjc4XSAtIGphdmFkb2Mgd2FybmluZ3MgLSBjb21waWxhdGlvbgorICAgICogW1RIUklGVC0xMjI3XSAtIEVybGFuZyBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgSlNPTiBwcm90b2NvbAorICAgICogW1RIUklGVC0xMjk1XSAtIER1cGxpY2F0ZSBpbmNsdWRlIGluIFRTb2NrZXQuY3BwCisgICAgKiBbVEhSSUZULTEyOTRdIC0gIHRocmlmdDogZml4IGxvZyBtZXNzYWdlIHR5cG9zIGluIFRTaW1wbGVTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTI5M10gLSAgdGhyaWZ0OiBpbXByb3ZlIGhhbmRsaW5nIG9mIGV4Y2VwdGlvbnMgdGhyb3duIGJ5CisgICAgKiBbVEhSSUZULTEyOTJdIC0gIHRocmlmdDogc2lsZW5jZSBsb2cgc3BldyBmcm9tIFRUaHJlYWRlZFNlcnZlcgorICAgICogW1RIUklGVC0xMjg4XSAtICBBbGxvdyB0eXBlZGVmZWQgZXhjZXB0aW9ucyBpbiB0aHJvd3MgY2xhdXNlcworICAgICogW1RIUklGVC0xMjkwXSAtICB0aHJpZnQ6IFROb25ibG9ja2luZ1NlcnZlcjogY2xlYW4gdXAgc3RhdGUgaW4gdGhlCisgICAgKiBbVEhSSUZULTEyODddIC0gIHRocmlmdDogc3RhcnQgcmVmYWN0b3Jpbmcgc29tZSBvZiB0aGUgQysrIHByb2Nlc3NvcgorICAgICogW1RIUklGVC0xMjg5XSAtICB0aHJpZnQ6IGltcGxlbWVudCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnN0b3AoKQorICAgICogW1RIUklGVC0xMzA1XSAtICB0aHJpZnQ6IG1ha2UgVENvbm5lY3Rpb24gYSBwcml2YXRlIGlubmVyIGNsYXNzIG9mCisgICAgKiBbVEhSSUZULTEzMDRdIC0gIFROb25ibG9ja2luZ1NlcnZlcjogcGFzcyBpbiB0aGUgY29ubmVjdGlvbiBjb250ZXh0IHRvCisgICAgKiBbVEhSSUZULTEzMDJdIC0gIHRocmlmdDogcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHNlbmQoKSB0aW1lcyBvdXQgaW4KKyAgICAqIFtUSFJJRlQtMTMwMV0gLSAgdGhyaWZ0OiBjb25zb2xpZGF0ZSBjb21tb24gY29kZSBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTM3N10gLSBhYm9ydCBQSFAgZGVzZXJpYWxpemF0aW9uIG9uIHVua25vd24gZmllbGQgdHlwZQorICAgICogW1RIUklGVC0xMzc5XSAtIGZpeCB1bmluaXRpYWxpemVkIGVudW0gdmFsdWVzIGluIHRocmlmdCBDKysgb2JqZWN0cworICAgICogW1RIUklGVC0xMzc2XSAtIE1ha2UgcG9ydCBzcGVjaWZpY2F0aW9uIG9wdGlvbiBpbiB0aHJpZnQgcmVtb3RlCisgICAgKiBbVEhSSUZULTEzNzVdIC0gZml4ZWQgYSBoZXggY2hhciBjb252ZXJzaW9uIGJ1ZyBpbiBUSlNPTlByb3RvY29sCisgICAgKiBbVEhSSUZULTEzNzNdIC0gRml4IHVzZXItZGVmaW5lZCBleGNlcHRpb24gZ2VuZXJhdGlvbiBpbiB0aHJpZnQgKHB5dGhvbikKKyAgICAqIFtUSFJJRlQtMTM2MV0gLSBPcHRpb25hbCByZXBsYWNlbWVudCBvZiBwdGhyZWFkIGJ5IGJvb3N0Ojp0aHJlYWQKKyAgICAqIFtUSFJJRlQtMTMyMF0gLSBDb25zaXN0ZW5jeSBvZiBjb25maWd1cmUgZ2VuZXJhdGVkIGNvbmZpZy5oCisgICAgKiBbVEhSSUZULTEzMTddIC0gIFJlbW92ZSBjb3B5IGNvbnN0cnVjdGliaWxpdHkgZnJvbQorICAgICogW1RIUklGVC0xMzE2XSAtICB0aHJpZnQ6IHVwZGF0ZSBzZXJ2ZXIgY2xhc3NlcyB0byBhY2NlcHQKKyAgICAqIFtUSFJJRlQtMTMxNV0gLSAgdGhyaWZ0OiBnZW5lcmF0ZSBzZXJ2ZXIgaW50ZXJmYWNlIGZhY3RvcnkgY2xhc3NlcworICAgICogW1RIUklGVC0xMzE0XSAtICB0aHJpZnQ6IGFkZCBUUHJvY2Vzc29yRmFjdG9yeQorICAgICogW1RIUklGVC0xMzM1XSAtICBBZGQgYWNjZXB0IHRpbWVvdXQgdG8gVFNlcnZlclNvY2tldAorICAgICogW1RIUklGVC0xMzM0XSAtICBBZGQgbW9yZSBpbmZvIHRvIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xMzMzXSAtICBNYWtlIFJXR3VhcmQgbm90IGNvcHlhYmxlCisgICAgKiBbVEhSSUZULTEzMzJdIC0gVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgY2xhc3MgdXNlcyBoYXJkIGNvZGVkIHZhbHVlIGtleU1hbmFnZXJUeXBlOiBTdW5YNTA5CisgICAgKiBbVEhSSUZULTEyNTFdIC0gR2VuZXJhdGVkIGphdmEgY29kZSBzaG91bGQgaW5kaWNhdGUgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZCBhbmQgd2hpY2ggYXJlIG9wdGlvbmFsCisgICAgKiBbVEhSSUZULTEzODddIC0gQnVpbGQgTVNWQyBsaWJyYXJpZXMgd2l0aCBCb29zdCBUaHJlYWRzIGluc3RlYWQgb2YgUHRocmVhZHMKKyAgICAqIFtUSFJJRlQtMTMzOV0gLSBFeHRlbmQgVHVwbGUgUHJvdG9jb2wgdG8gVFVuaW9ucworICAgICogW1RIUklGVC0xMDMxXSAtIFBhdGNoIHRvIGNvbXBpbGUgVGhyaWZ0IGZvciB2YysrIDkuMCBhbmQgMTAuMAorICAgICogW1RIUklGVC0xMTMwXSAtIEFkZCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHN5bWJvbGljIGRlZmF1bHQgdmFsdWUgZm9yIG9wdGlvbmFsIGJvb2xlYW4KKyAgICAqIFtUSFJJRlQtMTEyM10gLSBQYXRjaCB0byBjb21waWxlIFRocmlmdCBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAKKyAgICAqIFtUSFJJRlQtMzg2XSAtIE1ha2UgaXQgcG9zc2libGUgdG8gYnVpbGQgdGhlIFB5dGhvbiBsaWJyYXJ5IHdpdGhvdXQgdGhlIGV4dGVuc2lvbgorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0xNDAxXSAtIEpTT04tcHJvdG9jb2wgZm9yIERlbHBoaSBYRSBMaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMTE2N10gLSBKYXZhIG5vbmJsb2NraW5nIHNlcnZlciB3aXRoIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGZvciBzZWxlY3QgYW5kIGhhbmRsaW5nIElPCisgICAgKiBbVEhSSUZULTEzNjZdIC0gRGVscGhpIGdlbmVyYXRvciwgbGlyYnJhcnkgYW5kIHVuaXQgdGVzdC4KKyAgICAqIFtUSFJJRlQtMTM1NF0gLSBBZGQgcmFrZSB0YXNrIHRvIGJ1aWxkIGp1c3QgdGhlIGdlbSBmaWxlCisgICAgKiBbVEhSSUZULTc2OV0gLSBQbHVnZ2FibGUgU2VyaWFsaXplcnMKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTQxNV0gLSBkZWxwaGk6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMTM5MV0gLSBJbXByb3ZlZCBEZWxwaGkgWEUgdGVzdCBjYXNlcworCisKKworVGhyaWZ0IDAuNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xMTQwXSAtIEZyYW1lZCBUcmFuc3BvcnQgQ2xpZW50IHVzaW5nIEMgKEdsaWIpIExpYnJhcnkgaGFuZ3Mgd2hlbiBjb25uZWN0aW5nIHRvIFJ1YnkgU2VydmVyCisgICAgKiBbVEhSSUZULTExNTRdIC0gSHR0cENsaWVudCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBjb25uZWN0aW9uIGNsb3NlIHBhcmFtZXRlcgorICAgICogW1RIUklGVC0xMTUzXSAtIEh0dHBDbGllbnQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY29ubmVjdGlvbiBjbG9zZSBwYXJhbWV0ZXIKKyAgICAqIFtUSFJJRlQtMTE0OV0gLSBOb25ibG9ja2luZyBzZXJ2ZXIgZmFpbHMgd2hlbiBjbGllbnQgY29ubmVjdGlvbiBpcyByZXNldAorICAgICogW1RIUklGVC0xMTQ2XSAtIEFuZHJvaWQgSW5jb21wYXRpYmlsaXR5IDogaW4gQW5kcm9pZCA8IDIuMyBqYXZhLmlvLklPRXhjZXB0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBmb3IgVGhyb3dhYmxlIHBhcmFtZXRlciBpbiBjb25zdHJ1Y3RvcgorICAgICogW1RIUklGVC0xMTMzXSAtIEphdmEgYW5kIEphdmFTY3JpcHQgdHV0b3JpYWwgaXMgYnJva2VuIHNpbmNlIHdlIGhhdmUgSmF2YSBtYXZlbiBkZXBsb3ltZW50CisgICAgKiBbVEhSSUZULTExMzJdIC0gRGVzZXJpYWxpemF0aW9uIGVycm9yIGluIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBDIworICAgICogW1RIUklGVC0xMTMxXSAtIEMjIEpTT04gUHJvdG9jb2wgaXMgdW5hYmxlIHRvIGRlY29kZSBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gc3RyaW5nCisgICAgKiBbVEhSSUZULTEyMDhdIC0gcHl0aG9uIFRDb21wYWN0UHJvdG9jb2wucHkgd3JpdGVCb29sIGFuZCByZWFkQm9vbCBub3QgZm9sbG93IHRoZSBjb21wYWN0LXByb3RvLXNwZWMtMi50eHQgc3BlYyBmb3IgQ09OVEFJTkVSX1dSSVRFLCBDT05UQUlORVJfUkVBRAorICAgICogW1RIUklGVC0xMjAwXSAtIEpTIGNvbXBpbGVyIGdlbmVyYXRlcyBjb2RlIHRoYXQgY2xvYmJlcnMgZXhpc3RpbmcgbmFtZXNwYWNlcworICAgICogW1RIUklGVC0xMTgzXSAtIFB1cmUtcnVieSBDb21wYWN0UHJvdG9jb2wgcmFpc2VzIEFyZ3VtZW50RXJyb3Igd2hlbiBkZXNlcmlhbGl6aW5nIHVuZGVyIFJ1YnkgMS45CisgICAgKiBbVEhSSUZULTExODJdIC0gTmF0aXZlIGRlc2VyaWFsaXplciBzZWdmYXVsdHMgb24gaW5jb3JyZWN0IGxpc3QgZWxlbWVudCB0eXBlCisgICAgKiBbVEhSSUZULTExODFdIC0gQVMzIGNvbXBpbGVyIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSBmb3Igc2V0dGluZyBkZWZhdWx0IHZhbHVlcyBpbiBjb25zdHJ1Y3RvcgorICAgICogW1RIUklGVC0xMjM0XSAtIHRocmlmdCAtLWhlbHAgaXMgbWlzc2luZyBkb2Mgb24gcHk6dXRmOHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtMTE4MF0gLSBBUzMgY29tcGlsZXIgZ2VuZXJhdGVzIHVuY29tcGlsYWJsZSBjb2RlIGZvciBiaW5hcnkgdHlwZXMuCisgICAgKiBbVEhSSUZULTExOTRdIC0gSmF2YSBsaWIgZG9lcyBub3QgaW5zdGFsbCBhcnRpZmFjdHMgdG8gbG9jYWwgZGlyIGNvcnJlY3RseQorICAgICogW1RIUklGVC0xMTkzXSAtIFBvdGVudGlhbCBpbmZpbml0ZSBsb29wIGluIG5vbmJsb2NraW5nX3NlcnZlcgorICAgICogW1RIUklGVC0xMTkyXSAtIFR5cG86IFRQcm90b2NvbC5oIHRlc3RzIGZvciBIQVZFX1NZU19QQVJBTV9IXworICAgICogW1RIUklGVC0xMTkwXSAtIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCBpbiBUTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBzaG91bGQgYmUgQXRvbWljTG9uZyB0byBmaXggRkQgbGVha2FnZSBhbmQgZ2VuZXJhbCBzZXJ2ZXIgbWFsZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtMTE4N10gLSBub25ibG9ja2luZ19zZXJ2ZXIgc2h1dGRvd24gcmFjZSB1bmRlciBSdWJ5IDEuOQorICAgICogW1RIUklGVC0xMTc4XSAtIEphdmE6IFRCYXNlIHNpZ25hdHVyZSBzaG91bGQgYmUgVCBleHRlbmRzIFRCYXNlPD8sPz4KKyAgICAqIFtUSFJJRlQtMTE2NF0gLSBTZWdtZW50YXRpb24gZmF1bHQgb24gTlVMTCBwb2ludGVyIGluIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdAorICAgICogW1RIUklGVC0xMTcxXSAtIFBlcmwgd3JpdGUvcmVhZERvdWJsZSBhc3N1bWVzIGxpdHRsZS1lbmRpYW4gcGxhdGZvcm0KKyAgICAqIFtUSFJJRlQtMTIyMl0gLSBVbmhhbmRsZWQgZXhjZXB0aW9uIGZvciBURXZodHRwU2VydmVyIHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMTIyMF0gLSBUUHJvY2Vzc29yOjpwcm9jZXNzIG5ldmVyIHJldHVybnMgZmFsc2UKKyAgICAqIFtUSFJJRlQtMTI4NV0gLSBTdGFibGUgMC43LjAgV2luZG93cyBjb21waWxlciBleGUgYXZhaWxhYmxlIG9uIHRoZSB3ZWJzaWRlIGlzIG5vdCB0aGUgZ29vZCBvbmUKKyAgICAqIFtUSFJJRlQtMTIxOF0gLSBjX2dsaWIgdXNlcyB3cm9uZyBuYW1lIGluIHBrZy1jb25maWcKKyAgICAqIFtUSFJJRlQtMTIxNV0gLSBVbmRlZmluZWQgcHJvcGVydHkgVGhpcmZ0IGluIGxpYi9qcy90aHJpZnQuanMKKyAgICAqIFtUSFJJRlQtMTIxMV0gLSBXaGVuIHVzaW5nIFRIdHRwQ2xpZW50LCBub24gMjAwIHJlc3BvbnNlcyBsZWF2ZSB0aGUgY29ubmVjdGlvbiBvcGVuCisgICAgKiBbVEhSSUZULTEyMjhdIC0gVGhlIHBocCBhY2NlbGVyYXRvciBtb2R1bGUgY2FsbHMgZmx1c2ggaW5jb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMTMwOF0gLSBsaWJmYjMwMy0wLjcuMC5qYXIgbWlzc2luZyBpbiBtYXZlbiByZXBvc2l0b3J5CisgICAgKiBbVEhSSUZULTEyNTVdIC0gTWlzbWF0Y2ggb2YgbWV0aG9kIG5hbWUgYmV0d2VlbiBKYXZhTUUncyBsaWIgYW5kIGdlbmVyYXRlZCBjb2RlIChjb21wYXJlVG8vY29tcGFyZU9iamVjdHMpCisgICAgKiBbVEhSSUZULTEyNTNdIC0gQ29kZSBnZW5lcmF0ZWQgZm9yIG1hcHMgaXMgbm90IGNvbXBpbGluZworICAgICogW1RIUklGVC0xMjUyXSAtIFNlZ2ZhdWx0IGluIFJ1YnkgZGVzZXJpYWxpemVyCisgICAgKiBbVEhSSUZULTEwOTRdIC0gYnVnIGluIFRDb21wYWN0UHJvdG8gcHl0aG9uIHJlYWRNZXNzYWdlRW5kIG1ldGhvZCBhbmQgdXBkYXRlZCB0ZXN0IGNhc2VzCisgICAgKiBbVEhSSUZULTEwOTNdIC0gc2V2ZXJhbCBidWdzIGluIHB5dGhvbiBUQ29tcGFjdFByb3RvY29sCisgICAgKiBbVEhSSUZULTEwOTJdIC0gZ2VuZXJhdGVkIHZhbGlkYXRlKCkgbWV0aG9kIGhhcyB3cm9uZyBpbmRlbnRhdGlvbgorICAgICogW1RIUklGVC0xMDExXSAtIEVycm9yIGdlbmVyYXRpbmcgcGFja2FnZSBpbXBvcnRzIHdoZW4gdXNpbmcgY2xhc3NlcyBmcm9tIG90aGVyIHBhY2thZ2VzCisgICAgKiBbVEhSSUZULTEwNTBdIC0gRGVjbGFyaW5nIGFuIGFyZ3VtZW50IG5hbWVkICJtYW5hZ2VyIiB0byBhIHNlcnZpY2UgbWV0aG9kIHByb2R1Y2VzIGNvZGUgdGhhdCBmYWlscyBjb21waWxlIGR1ZSB0byBuYW1lIGNvbmZsaWN0cyB3aXRoIHByb3RlY3RlZCBpdmFycyBpbiBUQXN5bmNDbGllbnQKKyAgICAqIFtUSFJJRlQtMTA3NF0gLSAua2V5c3RvcmUgYW5kIC50cnVzdHN0b3JlIGFyZSBtaXNzaW5nIGZyb20gdGhlIDAuNi4wIGRpc3RyaWJ1dGlvbgorICAgICogW1RIUklGVC0xMDY3XSAtIFRvbnMgb2YgYnVncyBpbiBwaHAgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMTA2NV0gLSBVbmV4cGVjdGVkIGV4Y2VwdGlvbnMgbm90IHByb3BlciBoYW5kbGVkIG9uIEpTCisgICAgKiBbVEhSSUZULTEwNzZdIC0gRXJsYW5nIFRocmlmdCBzb2NrZXQgc2VydmVyIGhhcyBhIGJ1ZyB0aGF0IGNhdXNlcyBqYXZhIHRocmlmdCBjbGllbnQgb2YgZnJhbWVkIGJpbmFyeSBjbGllbnQgdG8gdGhyb3cgIm91dCBvZiBzZXF1ZW5jZSIgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTEwNTddIC0gY2FzdHMgaW4gVEJpbmFyeVByb3RvY29sLnRjYyBjYXVzaW5nICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiIHdhcm5pbmdzIGZyb20gZ2NjCisgICAgKiBbVEhSSUZULTEwNTVdIC0gY3NoYXJwIFRTZXJ2ZXJTb2NrZXQgYW5kIFRTb2NrZXQgZG8gbm90IGRpc2FibGUgTmFnbGUgdmlhIFNvY2tldC5Ob0RlbGF5ID0gdHJ1ZSBsaWtlIGNwcCBhbmQgamF2YSBkbworICAgICogW1RIUklGVC0xMDU0XSAtIGV4cGxpY2l0IGNhbGwgdG8gUEtHX1BST0dfUEtHX0NPTkZJRyBpcyBtaXNzaW5nIGFuZCBmaXJzdCB1c2Ugb2YgUEtHX0NIRUNLX01PRFVMRVMgbWF5IG5vdCBoYXBwZW4sIGNhdXNlcyBtb25vIGRldGVjdGlvbiB0byBmYWlsCisgICAgKiBbVEhSSUZULTExMTddIC0gSmF2YVNjcmlwdCBVbml0IFRlc3QgZG9lcyBub3Qgd29yayBhbnltb3JlIGJlY2F1c2UgbGlidGhyaWZ0Ki5qYXIgd2hlcmUgbW92ZWQgYnkgTWF2ZW4gRGVwbG95bWVudAorICAgICogW1RIUklGVC0xMTExXSAtIFRoZSBIVE1MIGdlbmVyYXRvciBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHN0cmluZyBhbmQgYmluYXJ5IHR5cGVzCisgICAgKiBbVEhSSUZULTEwMzJdIC0gIm1ha2UgZGlzdCIgZmFpbHMgZHVlIHRvIGNfZ2xpYiBwcm9ibGVtCisgICAgKiBbVEhSSUZULTEwMzZdIC0gQXV0by1nZW5lcmF0ZWQgQysrIGNvZGUgZmFpbHMgdG8gY29tcGlsZSB3aXRoICItV2Vycm9yIC1XZXh0cmEgLVdhbGwiIGcrKyBjb21waWxlciBmbGFncworICAgICogW1RIUklGVC0xMDQxXSAtIFREZXNlcmlhbGl6ZXIgaG9sZHMgb250byBhIHJlZmVyZW5jZSBvZiB0aGUgYXJyYXkgaXQgcmVhZHMgYWZ0ZXIgaXQgaXMgZG9uZSBkZXNlcmlhbGl6aW5nCisgICAgKiBbVEhSSUZULTExMDZdIC0gQysrIGNvZGUgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCAmIFRBc3luY0J1ZmZlclByb2Nlc3Nvci5oIGRvbnQgaGF2ZSB2aXJ0dWFsIGZ1bmN0aW9ucyBidXQgbm8gdmlydHVhbCBkZXN0cnVjdG9yLiBDYXVzZXMgd2FybmluZ3Mgb24gLVdhbGwKKyAgICAqIFtUSFJJRlQtMTEwNV0gLSBPQ2FtbCBnZW5lcmF0b3IgZG9lcyBub3QgcHJlZml4IG1ldGhvZHMgb2YgaW5jbHVkZWQgc3RydWN0cyB3aXRoIHRoZWlyIHR5cGUKKyAgICAqIFtUSFJJRlQtMTEwNF0gLSBJTlNUQUxMRElSUyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gY29uZmlndXJlIHNjcmlwdAorICAgICogW1RIUklGVC0xMTAyXSAtIHR5cG8gaW4gY29uZmlndXJlLmFjOiAiPT0iIG9wZXJhdG9yIGluICd0ZXN0JyAoaW5zdGVhZCBvZiInPSIpCisgICAgKiBbVEhSSUZULTExMDFdIC0gYnl0ZWJ1ZmZlciBsZW5ndGggY2FsY3VsYXRpb24gaW4gVEJpbmFyeVByb3RvY29sIHdyaXRlQmluYXJ5CisgICAgKiBbVEhSSUZULTEwOThdIC0gVW5kZWZpbmVkIHByb3BlcnRpZXMgaW4gVEJpbmFyeVByb3RvY29sRmFjdG9yeQorICAgICogW1RIUklGVC0xMDgxXSAtIFBIUCB0ZXN0cyBicm9rZW4gYW5kIHNvbWV3aGF0IGluY29tcGxldGUKKyAgICAqIFtUSFJJRlQtMTA4MF0gLSBlcmxhbmcgdGVzdCdzICdtYWtlJyBmYWlscyBvbiBNYWMgT1NYCisgICAgKiBbVEhSSUZULTEwNzhdIC0gVGhyaWZ0VGVzdC50aHJpZnQgZ2VuZXJhdGVzIGludmFsaWQgUEhQIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMTEyMF0gLSBwcm90by5Xcml0ZUxpc3RFbmQgYmVpbmcgY2FsbGVkIGluIHRoZSB3cm9uZyBwbGFjZQorICAgICogW1RIUklGVC0xMTE5XSAtIFRKU09OUHJvdG9jb2wgZmFpbHMgdG8gVVRGOCBkZWNvZGUgc3RyaW5ncworICAgICogW1RIUklGVC04NjddIC0gUEhQIGFjY2VsZXJhdG9yIG1vZHVsZSdzIG91dHB1dCB0cmFuc3BvcnQgaXMgaW5jb21wYXRpYmxlIHdpdGggVEZyYW1lZFRyYW5zcG9ydAorICAgICogW1RIUklGVC04MjZdIC0gUEhQIFRTb2NrZXQgV3JpdGUgVGltZW91dAorICAgICogW1RIUklGVC04MzVdIC0gQmFkIEFTMyBzeW50YXggaW4gY29uc3RydWN0b3JzIHRoYXQgc2V0IGRlZmF1bHQgdmFsdWVzCisgICAgKiBbVEhSSUZULTc4OF0gLSB0aHJpZnRfcHJvdG9jb2wuc286IG11bHRpZ2V0L211bHRpZ2V0X3NsaWNlIGRvZXMgbm90IGhhbmRsZSBtb3JlIHRoYW4gMTcga2V5cyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMTI1XSAtIE9DYW1sIGxpYnJhcmllcyBkb24ndCBjb21waWxlIHdpdGggMzItYml0IG9jYW1sCisgICAgKiBbVEhSSUZULTM0Ml0gLSBQSFA6IGNhbid0IGhhdmUgc2V0cyBvZiBjb21wbGV4IHR5cGVzCisgICAgKiBbVEhSSUZULTczMV0gLSBjb25maWd1cmUgZG9lc24ndCBjaGVjayBmb3IgYW50ID49IDEuNworICAgICogW1RIUklGVC02OTBdIC0gVXBkYXRlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBjb2RlcworICAgICogW1RIUklGVC02MzhdIC0gQnVmZmVyZWRUcmFuc3BvcnQgKyBDIGV4dGVuc2lvbnMgYmxvY2sgdW50aWwgcmVjdiB0aW1lb3V0IGlzIHJlYWNoZWQgb24gbGFzdCBmcmVhZCBjYWxsCisKKyMjIERlcGVuZGVuY3kgdXBncmFkZQorICAgICogW1RIUklGVC0xMTc3XSAtIFVwZGF0ZSB0aHJpZnQgdG8gcmVmbGVjdCBjaGFuZ2VzIGluIEdvJ3MgbmV0d29ya2luZyBsaWJyYXJpZXMKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTE1NV0gLSBSZW1vdmUgbG9nNGogZGVwZW5kZW5jeSBmcm9tIGphdmEgY2xpZW50CisgICAgKiBbVEhSSUZULTExNTFdIC0gUHJvZHVjZSBtb3JlIGluZm9ybWF0aXZlIHJ1bnRpbWUgZXJyb3IgaW4gY2FzZSBvZiBzY2hlbWEgYW5kIGRhdGEgbWlzbWF0Y2ggZHVyaW5nIHNlcmlhbGl6YXRpb24KKyAgICAqIFtUSFJJRlQtMTIwN10gLSBTdXBwb3J0IERFU1RESVIgb24gIm1ha2UgaW5zdGFsbCIgb2YgcnVieSBsaWJzCisgICAgKiBbVEhSSUZULTExOTldIC0gVW5pb24gc3RydWN0cyBzaG91bGQgaGF2ZSBnZW5lcmF0ZWQgbWV0aG9kcyB0byB0ZXN0IHdoZXRoZXIgYSBzcGVjaWZpYyBmaWVsZCBpcyBjdXJyZW50bHkgc2V0CisgICAgKiBbVEhSSUZULTEyMzNdIC0gUmVtb3ZlIHVudXNlZCBpbmNsdWRlIGluIGdlbmVyYXRlZCBDKysgY29kZQorICAgICogW1RIUklGVC0xMTg5XSAtIFJ1YnkgZGVzZXJpYWxpemVyIHNwZWVkIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0xMTcwXSAtIFRocmlmdCBHZW5lcmF0ZWQgQ29kZSBhbmQgSmF2YSA1CisgICAgKiBbVEhSSUZULTExNzRdIC0gUHVibGlzaCBhczMgY2xpZW50IGltcGxlbWVudGF0aW9uIHZpYSBNYXZlbiBmb3IgdXNlIGJ5IGZsZXgtbW9qb3MgdXNlcnMKKyAgICAqIFtUSFJJRlQtMTIyNV0gLSBUQ29tcGFjdFByb3RvY29sIGZvciBQSFAKKyAgICAqIFtUSFJJRlQtMTIyMV0gLSBSZW1vdmUgU2ltcGxlQ2FsbGJhY2suaAorICAgICogW1RIUklGVC0xMjE3XSAtIFVzZSBldnV0aWxfc29ja2V0cGFpciBpbnN0ZWFkIG9mIHBpcGUgKFdpbmRvd3MgcG9ydCkKKyAgICAqIFtUSFJJRlQtMTIxNl0gLSBidWlsZCBKYXZhIExpYnJhcnkgYmVoaW5kIGEgcHJveHkKKyAgICAqIFtUSFJJRlQtMTIzMV0gLSBSZW1vdmUgYm9ndXMgaW5jbHVkZQorICAgICogW1RIUklGVC0xMjEzXSAtIE1lbWJ1ZmZlciBzaG91bGQgcHJvdmlkZSBhIHdheSB0byBnZXQgYmFjayB0aGUgYnVmZmVyCisgICAgKiBbVEhSSUZULTEyMzddIC0gSmF2YSBmYjMwMyBtaXNzaW5nIHNvbWUgbWV0aG9kcworICAgICogW1RIUklGVC0xMDYzXSAtIEZpeCBFcmxhbmcgVHV0b3JpYWwgRmlsZXMKKyAgICAqIFtUSFJJRlQtMTA1M10gLSBNYWtlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzIGF2YWlsYWJsZSBmb3IgYWxsIHNvY2tldCByZWxhdGVkIHRyYW5zcG9ydHMKKyAgICAqIFtUSFJJRlQtMTEwOV0gLSBEZXBsb3kgZmIzMDMgYWxvbmcgc2lkZSBsaWJ0aHJpZnQgdG8gbWF2ZW4gcmVwbworICAgICogW1RIUklGVC0xMTA3XSAtIGltcHJvdmVtZW50IGZvciBjb21waWxlci1nZW5lcmF0ZWQgcHl0aG9uIGZvciAnTm9uZScgb2JqZWN0IGNvbXBhcmlzb25zCisgICAgKiBbVEhSSUZULTEwNjldIC0gQWRkIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gcHJldmVudCB0aHJpZnQgZnJvbSBpbnNlcnRpbmcgZ2VuLSogZGlyZWN0b3JpZXMKKyAgICAqIFtUSFJJRlQtMTA0OV0gLSBBbGxvdyBmb3IgVFNlcnZlclNvY2tldCBweXRob24gbGlicmFyeSB0byBiaW5kIHRvIGEgc3BlY2lmaWMgaG9zdAorICAgICogW1RIUklGVC0xMTI2XSAtIEV4dGVuZGluZyBzdHJ1Y3RfaW5mbyBmb3IgZXJsYW5nIGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTExMDBdIC0gcHl0aG9uIFRTU0xTb2NrZXQgaW1wcm92ZW1lbnRzLCBpbmNsdWRpbmcgY2VydGlmaWNhdGUgdmFsaWRhdGlvbgorICAgICogW1RIUklGVC05OTRdIC0gRG9uJ3QgdHJ5IHRvIGludm9rZSBwaHBpemUgaWYgd2UgZG9uJ3QgaGF2ZSBpdAorICAgICogW1RIUklGVC05OTNdIC0gU29tZSBpbXByb3ZlbWVudHMgaW4gQysrIHN0dWJzIGZvciBvbmV3YXkgb3BlcmF0aW9ucworICAgICogW1RIUklGVC05OTddIC0gVXNpbmcgdmFsdWVPZiBmb3IgYmFzZSB0eXBlcyBpbiBnZXRGaWVsZFZhbHVlCisgICAgKiBbVEhSSUZULTQxOF0gLSBEb24ndCBkbyBydW50aW1lIHNvcnRpbmcgb2Ygc3RydWN0IGZpZWxkcworICAgICogW1RIUklGVC0xNTFdIC0gVFNTTFNlcnZlclNvY2tldCBhbmQgVFNTTFNvY2tldCBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yN10gLSBHZW5lcmF0ZWQgZXJsYW5nIHR5cGVzIGRvbid0IGNvbnRhaW4gZGVmYXVsdCB2YWx1ZXMgZm9yIHJlY29yZHMKKyAgICAqIFtUSFJJRlQtMTEzXSAtIHRvLXN0cmluZyBtZXRob2RzIHNob3VsZCBvbWl0IG9wdGlvbmFsIG51bGwgZmllbGRzIGZyb20gb3V0cHV0CisgICAgKiBbVEhSSUZULTM2M10gLSBNYXZlbiBEZXBsb3kKKyAgICAqIFtUSFJJRlQtNDQ3XSAtIE1ha2UgYW4gYWJzdHJhY3QgYmFzZSBDbGllbnQgY2xhc3Mgc28gd2UgY2FuIGdlbmVyYXRlIGxlc3MgY29kZQorICAgICogW1RIUklGVC02MjddIC0gc2hvdWxkIGMrKyBoYXZlIHNldHRlcnMgZm9yIG9wdGlvbmFsIGZpZWxkcz8KKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMTIzNl0gLSBFcmxhbmcgUmVjb25uZWN0aW5nIFRocmlmdCBDbGllbnQKKyAgICAqIFtUSFJJRlQtMTAyMV0gLSBGcmFtZWQgdHJhbnNwb3J0IHN1cHBvcnQgZm9yIE9DYW1sCisgICAgKiBbVEhSSUZULTEwNjhdIC0gUHl0aG9uIFNTTCBTb2NrZXQgU3VwcG9ydAorICAgICogW1RIUklGVC0xMTAzXSAtIFRabGliVHJhbnNwb3J0IGZvciBweXRob24sIGEgemxpYiBjb21wcmVzc2VkIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0xMDgzXSAtIFByZWZvcmtpbmcgcHl0aG9uIHByb2Nlc3MgcG9vbCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtOTk5XSAtIEFkZCBURm9ya2luZ1NlcnZlcgorCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xMTUyXSAtIEF0dHJpYnV0ZXMgZnJvbSBwcml2YXRlIHRvIHByb3RlY3RlZAorICAgICogW1RIUklGVC0xMDM4XSAtIEdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yIHN0cnVjdHVyZXMgY29udGFpbmluZyBiaW5hcnkgZmllbGRzIChvciBjb2xsZWN0aW9ucyB0aGVyZW9mKSBhcmUgbm90IHNlcmlhbGl6YWJsZSAoaW4gdGhlIEphdmEgc2Vuc2UpIGV2ZW4gdGhvdWdoIHRoZXkgaW1wbGVtZW50IGphdmEuaW8uU2VyaWFsaXphYmxlCisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtODkyXSAtIFJlZmFjdG9yIGVybGFuZyBidWlsZCBzeXN0ZW0gd2l0aCByZWJhcgorCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTYyNV0gLSBBZGQgc3VwcG9ydCBmb3IgJ0dvJworCisKKworVGhyaWZ0IDAuNi4xCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTExMzNdIC0gSmF2YSBhbmQgSmF2YVNjcmlwdCB0dXRvcmlhbCBpcyBicm9rZW4gc2luY2Ugd2UgaGF2ZSBKYXZhIG1hdmVuIGRlcGxveW1lbnQKKyAgICAqIFtUSFJJRlQtMTEzMV0gLSBDIyBKU09OIFByb3RvY29sIGlzIHVuYWJsZSB0byBkZWNvZGUgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIHN0cmluZworICAgICogW1RIUklGVC0xMDc0XSAtIC5rZXlzdG9yZSBhbmQgLnRydXN0c3RvcmUgYXJlIG1pc3NpbmcgZnJvbSB0aGUgMC42LjAgZGlzdHJpYnV0aW9uCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTExMDldIC0gRGVwbG95IGZiMzAzIGFsb25nIHNpZGUgbGlidGhyaWZ0IHRvIG1hdmVuIHJlcG8KKyAgICAqIFtUSFJJRlQtMzYzXSAtIE1hdmVuIERlcGxveQorCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0xMjA2XSAtIGRpZCB0aGUgVEhSSUZUIDAuNi4xIG1lcmdlIFRIUklGVC01NjMgPworCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xMTYzXSAtIEhvdyBjYW4gaSB1c2UgbXVsdGkgc2VydmljZSBpbiBvbmUgcHJvZ3JhbT8KKworIyMgVGFzaworICAgICogW1RIUklGVC0xMTEyXSAtIEFwcGx5IFRIUklGVC0zNjMgdG8gMC42IGJyYW5jaAorICAgICogW1RIUklGVC0xMTEzXSAtIEFwcGx5IFRIUklGVC0xMDc0IHRvIDAuNiBicmFuY2gKKworCisKK1RocmlmdCAwLjYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTAyMF0gLSBPQ2FtbCBjb21waWxlciBnZW5lcmF0ZXMgaW52YWxpZCBPQ2FtbAorICAgICogW1RIUklGVC0xMDE1XSAtIFRVbmlvbiBkb2VzIG5vdCBoYW5kbGUgQnl0ZUJ1ZmZlciBpbiB0b1N0cmluZworICAgICogW1RIUklGVC0xMDEzXSAtIGdlbmVyYXRlZCBqYXZhIGNvZGUgbWF5IGhhdmUgbmFtZSBjbGFzaGVzIHdpdGggdGhyaWZ0IGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMTAwOV0gLSBUVW5pb24gZG9lcyBub3QgY29ycmVjdGx5IGRlZXAgY29weSBhIEJ5dGVCdWZmZXIKKyAgICAqIFtUSFJJRlQtMTAzMl0gLSAibWFrZSBkaXN0IiBmYWlscyBkdWUgdG8gY19nbGliIHByb2JsZW0KKyAgICAqIFtUSFJJRlQtODY4XSAtIFJlZmVyZW5jaW5nIGNvbnN0YW50IHZhbHVlcyBkb2Vzbid0IHdvcmsgd2l0aCB3aXRoIHR5cGVkZWYgdHlwZXMKKyAgICAqIFtUSFJJRlQtOTcxXSAtIGphdmEgbW9kdWxlIGNhbid0IGJlIGNvbXBpbGVkIHdpdGhvdXQgaXZ5IGFuZCBuZXR3b3JrIGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtOTcwXSAtIFVuZGVyIGhlYXZ5IGxvYWQsIFRIdHRwQ2xpZW50IG1heSBmYWlsIHdpdGggInRvbyBtYW55IG9wZW4gZmlsZXMiCisgICAgKiBbVEhSSUZULTk2OV0gLSBKYXZhIFR1dG9yaWFsIGJyb2tlbiwgbW92ZSBDYWxjdWxhdG9ySGFuZGxlciB0byBhIHNlcGFyYXRlIGZpbGUKKyAgICAqIFtUSFJJRlQtODA3XSAtIEphdmFTY3JpcHQ6IEluaXRpYWxpemF0aW9uIG9mIEJhc2UgVHlwZXMgd2l0aCAwIGluc3RlYWQgb2YgbnVsbAorICAgICogW1RIUklGVC05NTVdIC0gVGhyaWZ0IGNvbXBpbGVyIGZvciBXaW5kb3dzIHVzZXMgbG93ZXJjYXNlIG5hbWVzIGFuZCBkaXJlY3RvcmllcyB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBjb21waWxpbmcgb24gb3RoZXIgcGxhdGZvcm1zCisgICAgKiBbVEhSSUZULTk5Ml0gLSBOYW1pbmcgY29udmVudGlvbiBpbiBDIyBjb25zdHJ1Y3RvciBpcyBub3QgY29uc2lzdGVudCB3aXRoIG90aGVyIGZpZWxkcyBjYXVzZXMgY29tcGlsZSBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMTAwOF0gLSBieXRlW10gYWNjZXNzb3JzIHRocm93IE5QRSBvbiB1bnNldCBmaWVsZAorICAgICogW1RIUklGVC0xMDA2XSAtIEltcG9zc2libGUgdG8gY29ycmVjdGx5IHF1YWxpZnkgYW4gZW51bSBjb25zdGFudCBpbiBhbiBleHRlcm5hbCB0aHJpZnQgZmlsZQorICAgICogW1RIUklGVC05NTBdIC0gSGFza2VsbCBiaW5kaW5ncyB0cmVhdCAnYnl0ZScgYXMgdW5zaWduZWQgOC1iaXQgaW50IChEYXRhLldvcmQuV29yZDgpLCBqYXZhL2NwcCBhcyBzaWduZWQgKGJ5dGUvaW50OF90KS4KKyAgICAqIFtUSFJJRlQtOTc1XSAtIGxpYi9jX2dsaWIvUkVBRE1FIGlzIG1pc3NpbmcgPT4gYnJlYWtzIG1ha2UgZGlzdAorICAgICogW1RIUklGVC05NDRdIC0gU3VwcG9ydCBhbGwgdmVyc2lvbi00cyBvZiBiYXNlCisgICAgKiBbVEhSSUZULTkzOV0gLSBvcHRpb25hbCBiaW5hcnkgZmllbGRzIHRocm93IE5QRSBvbiBkZWZhdWx0IGJ5dGVbXSBnZXR0ZXJzCisgICAgKiBbVEhSSUZULTkzNV0gLSBQSFAgRXh0ZW5zaW9uIGFib3J0cyB0aGUgYnVpbGQgaWYgcGhwLWNvbmZpZyBpcyBub3QgaW5zdGFsbGVkCisgICAgKiBbVEhSSUZULTkzM10gLSBIYXNrZWxsJ3MgVGhyaWZ0LmNhYmFsIGhhcyB3YXJuaW5ncworICAgICogW1RIUklGVC05MzJdIC0gSGFza2VsbCB0ZXN0cyBuZWVkIHRvIGJlIHJ1biB0aHJvdWdoICdtYWtlIGNoZWNrJyAoYW5kIHByb2JhYmx5ICdjYWJhbCBjaGVjaycpIHRvbworICAgICogW1RIUklGVC05MDRdIC0gQyMgVFNvY2tldCBzaG91bGQgZGlzYWJsZSBuYWdsZSBhbmQgbGluZ2VyCisgICAgKiBbVEhSSUZULTk0MV0gLSBNYWtlIFBIUCBDIEV4dGVuc2lvbiB1c2UgdGhlIGRlZmluZWQgUHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW4gZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtOTQwXSAtICdtYWtlIGNoZWNrJyBmYWlscyBpZiBib29zdCBpcyBub3QgaW4gdGhlIHN0ZCBpbmNsdWRlIGFuZCBsaW5rIHBhdGhzCisgICAgKiBbVEhSSUZULTkyNF0gLSBGaXggZ2VuZXJhdGVkIHBocCBzdHJ1Y3R1cmUgY29uc3RhbnRzCisgICAgKiBbVEhSSUZULTk3OV0gLSBydWJ5IGJpbmRpbmdzIHVzZWQgdG8gd29yayBvbiBqcnVieQorICAgICogW1RIUklGVC05NzddIC0gSGV4IENvbnZlcnNpb24gQnVnIGluIEMrKyBUSlNPTlByb3RvY29sCisgICAgKiBbVEhSSUZULTM0N10gLSBQSFAgVFNvY2tldCBUaW1lb3V0IElzc3VlcworICAgICogW1RIUklGVC01MTddIC0gVEV4Y2VwdGlvbnMgdGhyb3duIGJ5IHNlcnZlciByZXN1bHQgaW4gY3J5cHRpYyBlcnJvciBtZXNzYWdlIG9uIGNsaWVudCAtIFRyaWVkIHRvIHJlYWQgNCBieXRlcywgYnV0IG9ubHkgZ290IDAgYnl0ZXMKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTAyNF0gLSBBZGQgUHl0aG9uIFR3aXN0ZWQgZXhhbXBsZSB0byB0aGUgVHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtOTU4XSAtIENoYW5nZSBhY2Nlc3Ntb2RpZmVyIG9uIHRyYW5zXyBmaWVsZCBpbiB0aGUgRnJhbWVCdWZmZXIgY2xhc3MgdG8gcHVibGljLgorICAgICogW1RIUklGVC05NTddIC0gVEhzSGFTZXJ2ZXI6IENoYW5nZSBhY2Nlc3MgbW9kaWZpZXIgb2YgdGhlIGludm9rZXIgZmllbGQuCisgICAgKiBbVEhSSUZULTEwMDJdIC0gQ29kZVN0eWxlOiB0X2NfZ2xpYl9nZW5lcmF0b3IuY2MKKyAgICAqIFtUSFJJRlQtMTAwNV0gLSBHaXZlIHVuaW9ucyBieXRlW10gc2lnbmF0dXJlIG1ldGhvZHMgdG8gZ28gYWxvbmcgd2l0aCB0aGVpciBCeXRlQnVmZmVyIGNvdW50ZXJwYXJ0cworICAgICogW1RIUklGVC05NTFdIC0gQWRkIGEgbmV3IGlzU2VydmluZygpIG1ldGhvZCB0byBUU2VydmVyCisgICAgKiBbVEhSSUZULTk0M10gLSBTaWxseSByZWFkbWUgdHlwbyBmaXguCisgICAgKiBbVEhSSUZULTk2MV0gLSBKYXZhU2NyaXB0IFRlc3RTdWl0ZSB1c2luZyBhbnQvaXZ5IGFuZCBKYXZhJ3MgU2VydmVyVGVzdEJhc2UgSGFuZGxlcgorICAgICogW1RIUklGVC05NjBdIC0gYWRkIFRlc3RTZXJ2ZXIsIFRlc3ROb25ibG9ja2luZ1NlcnZlciBhbmQgVGVzdENsaWVudCBhZ2FpbgorICAgICogW1RIUklGVC05NDldIC0gTW9kaWZ5IHRoZSBURW51bSBpbnRlcmZhY2Ugc28gaXQgZGVmaW5lcyBhIG1ldGhvZCBzaW1pbGFyIHRvIGZpbmRCeVZhbHVlCisgICAgKiBbVEhSSUZULTk0Nl0gLSBBdWdtZW50IEZpZWxkVmFsdWVNZXRhRGF0YSBzbyBpdCBkaWZmZXJlbnRpYXRlcyAnc3RyaW5nJyBhbmQgJ2JpbmFyeScgZmllbGRzLgorICAgICogW1RIUklGVC05MDNdIC0gY3VzdG9tIFRocmVhZEZhY3RvcnkgaW4gVEhzSGFTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtOTEzXSAtIFRlc3QgQ2FzZSBmb3IgVXJsIGVuY29kZWQgc3RyaW5ncyArIHNpbXBsZSBlbmhhbmNlbWVudCB0byBsaWIvanMvdGVzdC9SdW5UZXN0U2VydmVyLnNoCisgICAgKiBbVEhSSUZULTkyNl0gLSBNaXNjZWxsYW5lb3VzIEMrKyBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtOTI5XSAtIEltcHJvdmVtZW50cyB0byB0aGUgQysrIHRlc3Qgc3VpdGUKKyAgICAqIFtUSFJJRlQtODkzXSAtIGFkZCBKYXZhU2NyaXB0IHRvIHRoZSB0dXRvcmlhbCBleGFtcGxlcworICAgICogW1RIUklGVC0xMDAzXSAtIFBvbGlzaGluZyBjX2dsaWIgY29kZQorICAgICogW1RIUklGVC03MV0gLSBEZWJpYW4gcGFja2FnaW5nIGZvciB0aHJpZnQKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMTAzM10gLSBOb2RlLmpzIGxhbmd1YWdlIHRhcmdldAorICAgICogW1RIUklGVC05NDddIC0gUHJvdmlkZSBhIGhlbHBlciBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSBUUHJvdG9jb2wgdXNlZCB0byBzZXJpYWxpemUgc29tZSBkYXRhLgorICAgICogW1RIUklGVC05MjhdIC0gTWFrZSBtb3JlIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGluIEMrKyBzZXJ2ZXJzCisgICAgKiBbVEhSSUZULTkyMl0gLSBUZW1wbGF0aXplZCBbZGVdc2VyaWFsaXphdGlvbiBjb2RlIGZvciBDKysKKyAgICAqIFtUSFJJRlQtOTIzXSAtIEV2ZW50LWRyaXZlbiBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0IGZvciBDKysKKyAgICAqIFtUSFJJRlQtOTI1XSAtIFByb3ZpZGUgbmFtZTwtPnZhbHVlIG1hcCBmb3IgZW51bXMgaW4gQysrCisgICAgKiBbVEhSSUZULTkyN10gLSBBZGQgb3B0aW9uIHRvIG1vZGlmeSB0aGUgUEhQIGluY2x1ZGUgcGF0aAorICAgICogW1RIUklGVC0zNzddIC0gVEZpbGVUcmFuc3BvcnQgcG9ydCBpbiBKYXZhCisgICAgKiBbVEhSSUZULTEwNl0gLSBUU1NMU2VydmVyU29ja2V0CisgICAgKiBbVEhSSUZULTU4Ml0gLSBDIGltcGxlbWVudGF0aW9uIG9mIFRocmlmdAorICAgICogW1RIUklGVC03NDVdIC0gTWFrZSBpdCBlYXNpZXIgdG8gaW5zdGFudGlhdGUgc2VydmVycworCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xMDM4XSAtIEdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yIHN0cnVjdHVyZXMgY29udGFpbmluZyBiaW5hcnkgZmllbGRzIChvciBjb2xsZWN0aW9ucyB0aGVyZW9mKSBhcmUgbm90IHNlcmlhbGl6YWJsZSAoaW4gdGhlIEphdmEgc2Vuc2UpIGV2ZW4gdGhvdWdoIHRoZXkgaW1wbGVtZW50IGphdmEuaW8uU2VyaWFsaXphYmxlCisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtODYyXSAtIEFzeW5jIGNsaWVudCBpc3N1ZXMgLyBpbXByb3ZlbWVudHMKKworIyMgVGVzdAorICAgICogW1RIUklGVC01ODFdIC0gQWRkIGEgdGVzdHN1aXRlIGZvciB0eFRocmlmdCAoVHdpc3RlZCkKKworCisKK1RocmlmdCAwLjUuMCAtIEluY3ViYXRpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUSFJJRlQtNTA1ICAgQnVpbGQgICAgICAgICAgICAgICAgTWFrZSBjb25maWd1cmUgZ2l2ZSBhIHN1bW1hcnkgb2YgdGhlIGVuYWJsZWQgY29tcG9uZW50cyAoRGF2aWQgUmVpc3MpCitUSFJJRlQtNTA2ICAgQnVpbGQgICAgICAgICAgICAgICAgQWxsb3cgVGhyaWZ0IHRvIGJlIGJ1aWx0IHdpdGhvdXQgdGhlIEMrKyBsaWJyYXJ5IChEYXZpZCBSZWlzcykKK1RIUklGVC04NDQgICBCdWlsZCAgICAgICAgICAgICAgICBCdWlsZCBSZXF1aXJlbWVudHMgc3RhdGUgYXV0b2NvbmYgMi41OSsgaXMgcmVxdWlyZWQsIGJ1dCAyLjYwKyBpcyBuZWVkZWQgKEhhcmxhbiBMaWViZXJtYW4tQmVyZykKK1RIUklGVC04NTAgICBCdWlsZCAgICAgICAgICAgICAgICBQZXJsIHJ1bnRpbWUgcmVxdWlyZXMgQml0OjpWZWN0b3Igd2hpY2ggbWF5IG5vdCBiZSBpbnN0YWxsZWQgYnkgZGVmYXVsdCwgYnV0IGNvbmZpZ3VyZSBkb2VzIG5vdCBmYWlsIChNaWNoYWVsIEx1bSkKK1RIUklGVC04NTQgICBCdWlsZCAgICAgICAgICAgICAgICBQcm92aWRlIGNvbmZpZ3VyZSBvcHRpb24gYW5kIG1ha2UgcnVsZXMgdG8gYnVpbGQvaW5zdGFsbCBwaHAgZXh0ZW5zaW9uIChBbnRob255IE1vbGluYXJvKQorVEhSSUZULTg1OCAgIEJ1aWxkICAgICAgICAgICAgICAgIEhhdmUgYm9vdHN0cmFwLnNoIGNoZWNrIGZvciBhIHN1aXRhYmxlIGF1dG9jb25mIHZlcnNpb24gYmVmb3JlIHJ1bm5pbmcgKERhdmlkIFJlaXNzKQorVEhSSUZULTg3MSAgIEJ1aWxkICAgICAgICAgICAgICAgIFRocmlmdCBjb21waWxlciBmb3IgV0luZG93cyAoYmluYXJ5IGRpc3RyaWJ1dGlvbikgKERhdmlkIFJlaXNzKQorVEhSSUZULTMyMyAgIEMjICAgICAgICAgICAgICAgICAgIFRKU09OUHJvdG9jb2wgKFJvZ2VyIE1laWVyKQorVEhSSUZULTYzNCAgIEMjICAgICAgICAgICAgICAgICAgIEMjIENvbXBpbGVyIEdlbmVyYXRlcyBJbmNvcnJlY3QgQ29kZSBGb3IgRmllbGRzIHdoaWNoIGJlZ2luIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciAoSm9uIFMgQWtodGFyKQorVEhSSUZULTg4MSAgIEMjICAgICAgICAgICAgICAgICAgIGFkZCBjc2hhcnAgdG8gdGhlIHR1dG9yaWFsIChSb2dlciBNZWllcikKK1RIUklGVC04NTYgICBDKysgICAgICAgICAgICAgICAgICBCdWlsZGluZyBjcHAgbGlicmFyeSBmYWlscyBvbiBPUyBYIHdpdGggbWFsbG9jIGFuZCBmcmVlIG5vdCBiZWluZyBkZWNsYXJlZCBpbiBzY29wZSAoSmFtZXMgQ2xhcmtlKQorVEhSSUZULTg2NSAgIEMrKyAgICAgICAgICAgICAgICAgIEMrKyBjb21waWxlciBidWlsZCBkZXBlbmRzIG9uIGxpYmZsIGV2ZW4gd2hlbiBmbGV4L2xleCBub3QgZGV0ZWN0ZWQgKERhdmlkIFJlaXNzKQorVEhSSUZULTkwMCAgIEMrKyAgICAgICAgICAgICAgICAgIFVuaXggZG9tYWluIHNvY2tldCAoUm9nZXIgTWVpZXIpCitUSFJJRlQtOTIwICAgQysrICAgICAgICAgICAgICAgICAgQysrIFRlc3QgYW5kIFR1dG9yaWFsIGRvZXMgbm90IGNvbXBpbGUgYW55bW9yZSBkdWUgdG8gdGhlIGNoYW5nZSB3aXRoaW4gRW51bSBoYW5kbGluZyAoUm9nZXIgTWVpZXIpCitUSFJJRlQtNTY3ICAgQysrICAgICAgICAgICAgICAgICAgQ2FuJ3QgaW1tZWRpYXRlbHkgc3RvcCBhIFRTaW1wbGVTZXJ2ZXIgdGhyZWFkIHRoYXQgaXMgaWRsZSAoUnVzaCBNYW5iZXJ0KQorVEhSSUZULTc1NiAgIEMrKyAgICAgICAgICAgICAgICAgIEV4cG9zaW5nIFRTb2NrZXQoaW50KSBjb25zdHJ1Y3RvciB0byBwdWJsaWMgKFJhamF0IEdvZWwpCitUSFJJRlQtNzk4ICAgQysrICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyIGxlYWtzIHJlc291cmNlcyB3aGVuIGRlc3Ryb3llZCAoRGF2aWQgUmVpc3MpCitUSFJJRlQtODEyICAgQysrLCBQeXRob24gICAgICAgICAgRGVtbyBvZiBUaHJpZnQgb3ZlciBaZXJvTVEgKERhdmlkIFJlaXNzKQorVEhSSUZULTYyOSAgIENvY29hICAgICAgICAgICAgICAgIFVudXNlZCBGaWVsZCBJbiBUU29ja2V0U2VydmVyIEFwcGVhcnMgVG8gQnJlYWsgaVBob25lIEJ1aWxkIChKb24gUyBBa2h0YXIpCitUSFJJRlQtODM4ICAgQ29jb2EgICAgICAgICAgICAgICAgR2VuZXJhdGVkIENvY29hIGNsYXNzZXMgaGF2ZSB1c2VsZXNzIEBkeW5hbWljIGRlY2xhcmF0aW9ucyAoS2V2aW4gQmFsbGFyZCkKK1RIUklGVC04MDUgICBDb2NvYSAgICAgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBwcm9jZXNzX1hYWFggbWV0aG9kcyBmb3Igb25ld2F5IG1ldGhvZHMgKEJyYWQgVGF5bG9yKQorVEhSSUZULTUwNyAgIENvbXBpbGVyICAgICAgICAgICAgIFJlbW92ZSB0aGUgY29tcGlsZXIncyBkZXBlbmRlbmN5IG9uIEJvb3N0IChEYXZpZCBSZWlzcykKK1RIUklGVC04OTUgICBDb21waWxlciAoR2VuZXJhbCkgICBUaHJpZnQgY29tcGlsZXIgZG9lcyBub3QgYWxsb3cgdHdvIGRpZmZlcmVudCBlbnVtZXJhdGlvbnMgdG8gaGF2ZSB0aGUgc2FtZSBrZXkgbmFtZSBmb3Igb25lIG9mIHRoZSBlbnVtIHZhbHVlcyAoRGF2aWQgUmVpc3MpCitUSFJJRlQtODUyICAgQ29tcGlsZXIgKEdlbmVyYWwpICAgTWlzc2luZyBuZXdsaW5lIGNhdXNlcyBtYW55IGNvbXBpbGVyIHdhcm5pbmdzIChBbnRob255IE1vbGluYXJvKQorVEhSSUZULTg3NyAgIENvbXBpbGVyIChHZW5lcmFsKSAgIHNtYWxsdGFsayBuYW1lc3BhY2UgZG9lc24ndCB3b3JrIChCcnVjZSBMb3dla2FtcCkKK1RIUklGVC04OTcgICBDb21waWxlciAoR2VuZXJhbCkgICBEb24ndCBhbGxvdyB1bnF1YWxpZmllZCBjb25zdGFudCBhY2Nlc3MgdG8gZW51bSB2YWx1ZXMgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtOSAgICAgQ29tcGlsZXIgKEdlbmVyYWwpICAgQWRkIGEgZGVmYXVsdCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gZm9yIGFsbCBsYW5ndWFnZXMgKERhdmlkIFJlaXNzKQorVEhSSUZULTU5OSAgIEVybGFuZyAgICAgICAgICAgICAgIERvbid0IHVzZSB1bm5lY2Vzc2FyeSBwcm9jZXNzZXMgaW4gdGhlIEVybGFuZyB0cmFuc3BvcnRzIGFuZCBjbGllbnRzIChEYXZpZCBSZWlzcykKK1RIUklGVC02NDYgICBFcmxhbmcgICAgICAgICAgICAgICBFcmxhbmcgbGlicmFyeSBpcyBtaXNzaW5nIGluc3RhbGwgdGFyZ2V0IChEYXZpZCBSZWlzcykKK1RIUklGVC02OTggICBFcmxhbmcgICAgICAgICAgICAgICBHZW5lcmF0ZWQgbW9kdWxlIGxpc3Qgc2hvdWxkIGNvbnRhaW4gYXRvbXMsIG5vdCBzdHJpbmdzIChBbnRob255IE1vbGluYXJvKQorVEhSSUZULTg2NiAgIEVybGFuZyAgICAgICAgICAgICAgIHRlcm0oKSBpbiBzcGVjIGRlZmluaXRpb25zIHNlZW1zIHRvIG5vdCB3b3JrIGluIGVybGFuZyBSMTIgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtODg2ICAgRXJsYW5nICAgICAgICAgICAgICAgRGlhbHl6ZXIgd2FybmluZyAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC03ODUgICBFcmxhbmcgICAgICAgICAgICAgICBGcmFtZWQgdHJhbnNwb3J0IHNlcnZlciBwcm9ibGVtcyAoQW50aG9ueSBNb2xpbmFybykKK1RIUklGVC04ODQgICBIVE1MICAgICAgICAgICAgICAgICBIVE1MIEdlbmVyYXRvcjogYWRkIEtleSBhdHRyaWJ1dGUgdG8gdGhlIERhdGEgVHlwZXMgVGFibGVzIChSb2dlciBNZWllcikKK1RIUklGVC02NTIgICBIYXNrZWxsICAgICAgICAgICAgICBHZW5lcmF0ZWQgZmllbGQgbmFtZSBmb3Igc3RydXQgaXMgbm90IGNhcGl0YWxpemVkIGNvcnJlY3RseSAoQ2hyaXN0aWFuIExhdm9pZSkKK1RIUklGVC03NDMgICBIYXNrZWxsICAgICAgICAgICAgICBjb21waWxlIGVycm9yIHdpdGggR0hDIDYuMTIuMSAoQ2hyaXN0aWFuIExhdm9pZSkKK1RIUklGVC05MDEgICBIYXNrZWxsICAgICAgICAgICAgICBBbGxvdyB0aGUgYmluZGluZ3MgdG8gY29tcGlsZSB3aXRob3V0IC1mZ2xhc2dvdy1leHRzIGFuZCB3aXRoIC1XYWxsIC1XZXJyb3IgKENocmlzdGlhbiBMYXZvaWUpCitUSFJJRlQtOTA1ICAgSGFza2VsbCAgICAgICAgICAgICAgTWFrZSBoYXNrZWxsIHRocmlmdCBiaW5kaW5ncyB1c2UgYXV0b21ha2UgdG8gY29tcGlsZSBhbmQgaW5zdGFsbCAoQ2hyaXN0aWFuIExhdm9pZSkKK1RIUklGVC05MDYgICBIYXNrZWxsICAgICAgICAgICAgICBJbXByb3ZlIHR5cGUgbWFwcGluZ3MgKENocmlzdGlhbiBMYXZvaWUpCitUSFJJRlQtOTE0ICAgSGFza2VsbCAgICAgICAgICAgICAgTWFrZSBoYXNrZWxsIGJpbmRpbmdzICdlYXNpbHknIGNvbXBpbGFibGUgKENocmlzdGlhbiBMYXZvaWUpCitUSFJJRlQtOTE4ICAgSGFza2VsbCAgICAgICAgICAgICAgTWFrZSBoYXNrZWxsIHRlc3RzIHJ1biBhZ2FpbiAoQ2hyaXN0aWFuIExhdm9pZSkKK1RIUklGVC05MTkgICBIYXNrZWxsICAgICAgICAgICAgICBVcGRhdGUgSGFza2VsbCBiaW5kaW5ncyBSRUFETUUgKENocmlzdGlhbiBMYXZvaWUpCitUSFJJRlQtNzg3ICAgSGFza2VsbCAgICAgICAgICAgICAgRW51bXMgYXJlIG5vdCByZWFkIGNvcnJlY3RseSAoQ2hyaXN0aWFuIExhdm9pZSkKK1RIUklGVC0yNTAgICBKYXZhICAgICAgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgYXMgYSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZm9yIFRTZXJ2ZXIgKEVkIENlYXNlcikKK1RIUklGVC02OTMgICBKYXZhICAgICAgICAgICAgICAgICBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVkIGphdmEgY29kZSB0aGF0IHRocm93cyBjb21waWxlciB3YXJuaW5ncyBhYm91dCBkZXByZWNhdGVkIG1ldGhvZHMuIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTg0MyAgIEphdmEgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NvY2tldCBjb25uZWN0cyB3aXRob3V0IGEgdGltZW91dCAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04NDUgICBKYXZhICAgICAgICAgICAgICAgICBhc3luYyBjbGllbnQgZG9lcyBub3QgcmVzcGVjdCB0aW1lb3V0IChOaW5nIExpYW5nKQorVEhSSUZULTg3MCAgIEphdmEgICAgICAgICAgICAgICAgIEphdmEgY29uc3RhbnRzIGRvbid0IGdldCBKYXZhZG9jIGNvbW1lbnRzIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTg3MyAgIEphdmEgICAgICAgICAgICAgICAgIEphdmEgdGVzdHMgZmFpbCBkdWUgdG8gVG9vIG1hbnkgb3BlbiBmaWxlcyAoVG9kZCBMaXBjb24pCitUSFJJRlQtODc2ICAgSmF2YSAgICAgICAgICAgICAgICAgQWRkIFNBU0wgc3VwcG9ydCAoQWFyb24gVC4gTXllcnMpCitUSFJJRlQtODc5ICAgSmF2YSAgICAgICAgICAgICAgICAgUmVtb3ZlIEBPdmVycmlkZSBmcm9tIFRVbmlvbi5jbGVhciAoRGF2ZSBFbmdiZXJnKQorVEhSSUZULTg4MiAgIEphdmEgICAgICAgICAgICAgICAgIGRlZXAgY29weSBvZiBiaW5hcnkgZmllbGRzIGRvZXMgbm90IGNvcHkgQnl0ZUJ1ZmZlciBjaGFyYWN0ZXJpc3RpY3MgKGFycmF5T2Zmc2V0LCBwb3NpdGlvbikgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODg4ICAgSmF2YSAgICAgICAgICAgICAgICAgYXN5bmMgY2xpZW50IHNob3VsZCBhbHNvIGhhdmUgbm9uYmxvY2tpbmcgY29ubmVjdCAoRXJpYyBKZW5zZW4pCitUSFJJRlQtODkwICAgSmF2YSAgICAgICAgICAgICAgICAgSmF2YSB0dXRvcmlhbCBkb2Vzbid0IHdvcmsgKFRvZGQgTGlwY29uKQorVEhSSUZULTg5NCAgIEphdmEgICAgICAgICAgICAgICAgIE1ha2UgZGVmYXVsdCBhY2Nlc3NvcnMgZm9yIGJpbmFyeSBmaWVsZHMgcmV0dXJuIGJ5dGVbXTsgcHJvdmlkZSBuZXcgYWNjZXNzb3JzIHRvIGdldCBCeXRlQnVmZmVyIHZlcnNpb24gKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODk2ICAgSmF2YSAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU29ja2V0LmlzT3BlbigpIHJldHVybnMgdHJ1ZSBldmVuIGFmdGVyIGNsb3NlKCkgKEVyaWMgSmVuc2VuKQorVEhSSUZULTkwNyAgIEphdmEgICAgICAgICAgICAgICAgIGxpYmZiMzAzIGRvZXNuJ3QgY29tcGlsZSBpbiAwLjQuMCAoVG9kZCBMaXBjb24pCitUSFJJRlQtOTEyICAgSmF2YSAgICAgICAgICAgICAgICAgSW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMgdG8gU0FTTCBpbXBsZW1lbnRhdGlvbiAoVG9kZCBMaXBjb24pCitUSFJJRlQtOTE3ICAgSmF2YSAgICAgICAgICAgICAgICAgVEhzSGFTZXJ2ZXIgc2hvdWxkIG5vdCBhY2NlcHQgYW4gRXhlY3V0b3JTZXJ2aWNlIHdpdGhvdXQgY2F0Y2hpbmcgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gKEVkIENlYXNlcikKK1RIUklGVC05MzEgICBKYXZhICAgICAgICAgICAgICAgICBVc2UgbG9nNGogZm9yIEphdmEgdGVzdHMgKFRvZGQgTGlwY29uKQorVEhSSUZULTg4MCAgIEphdmFNRSAgICAgICAgICAgICAgIEphdmFNRSBjb2RlIGdlbmVyYXRvciBhbmQgcnVudGltZSBsaWJyYXJ5IChEYXZlIEVuZ2JlcmcpCitUSFJJRlQtODQ2ICAgSmF2YVNjcmlwdCAgICAgICAgICAgSmF2YVNjcmlwdCBUZXN0IEZyYW13b3JrOiBleHRlbmRlZCBUZXN0Y2FzZXMgKFJvZ2VyIE1laWVyKQorVEhSSUZULTg4NSAgIEphdmFTY3JpcHQgICAgICAgICAgIFVybCBlbmNvZGVkIHN0cmluZ3MgbmV2ZXIgZ2V0IGRlY29kZWQ/IEhvdyBkbyB3ZSBmaXggdGhpcz8gKFQgSmFrZSBMdWNpYW5pKQorVEhSSUZULTkxMSAgIEphdmFTY3JpcHQgICAgICAgICAgIChKYXZhU2NyaXB0IGNvbXBpbGVyKSBDb25zdCBzdHJ1Y3RzLCBtYXBzLCBzZXRzLCBhbmQgbGlzdHMgZ2VuZXJhdGUgYSB0cmFpbGluZyBjb21tYSAoVCBKYWtlIEx1Y2lhbmkpCitUSFJJRlQtODYwICAgT0NhbWwgICAgICAgICAgICAgICAgY29weSBtZXRob2QgYW5kIHJlc2V0IG1ldGhvZCAoTGV2IFdhbGtpbikKK1RIUklGVC02ODIgICBQSFAgICAgICAgICAgICAgICAgICBQSFAgZXh0ZW5zaW9uIGRvZXNuJ3QgY29tcGlsZSBvbiBNYWMgT1MgWCAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04NTEgICBQSFAgICAgICAgICAgICAgICAgICBwaHAgZXh0ZW5zaW9uIGZhaWxzIHRvIGNvbXBpbGUgb24gY2VudG9zIDUueCAoVG9kZCBMaXBjb24pCitUSFJJRlQtODQwICAgUGVybCAgICAgICAgICAgICAgICAgUGVybCBwcm90b2NvbCBoYW5kbGVyIGNvdWxkIGJlIG1vcmUgcm9idXN0IGFnYWluc3QgdW5yZWNvZ25pc2VkIHR5cGVzIChDb25yYWQgSHVnaGVzKQorVEhSSUZULTc1OCAgIFBlcmwgICAgICAgICAgICAgICAgIGluY29ycmVjdCBkZWZlcmVuY2UgaW4gZXhjZXB0aW9uIGhhbmRsaW5nIChZYW5uIEtlcmhlcnZlKQorVEhSSUZULTI1NyAgIFB5dGhvbiAgICAgICAgICAgICAgIFN1cHBvcnQgdmFsaWRhdGlvbiBvZiByZXF1aXJlZCBmaWVsZHMgKEVzdGV2ZSBGZXJuYW5kZXopCitUSFJJRlQtMzM1ICAgUHl0aG9uICAgICAgICAgICAgICAgQ29tcGFjdCBQcm90b2NvbCBmb3IgUHl0aG9uIChEYXZpZCBSZWlzcykKK1RIUklGVC01OTYgICBQeXRob24gICAgICAgICAgICAgICBNYWtlIFB5dGhvbidzIFRCdWZmZXJlZFRyYW5zcG9ydCB1c2UgYSBjb25maWd1cmFibGUgaW5wdXQgYnVmZmVyIChEYXZpZCBSZWlzcykKK1RIUklGVC01OTcgICBQeXRob24gICAgICAgICAgICAgICBQeXRob24gVEh0dHBTZXJ2ZXIgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIChEYXZpZCBSZWlzcykKK1RIUklGVC01OTggICBQeXRob24gICAgICAgICAgICAgICBBbGxvdyBQeXRob24ncyB0aHJlYWRpbmcgc2VydmVycyB0byB1c2UgZGFlbW9uIHRocmVhZHMgKERhdmlkIFJlaXNzKQorVEhSSUZULTY2NiAgIFB5dGhvbiAgICAgICAgICAgICAgIEFsbG93IHRoZSBoYW5kbGVyIHRvIG92ZXJyaWRlIEhUVFAgcmVzcG9uc2VzIGluIFRIdHRwU2VydmVyIChEYXZpZCBSZWlzcykKK1RIUklGVC02NzMgICBQeXRob24gICAgICAgICAgICAgICBHZW5lcmF0ZWQgUHl0aG9uIGNvZGUgaGFzIHdoaXRlc3BhY2UgaXNzdWVzIChJYW4gRXVyZSkKK1RIUklGVC03MjEgICBQeXRob24gICAgICAgICAgICAgICBUSHR0cENsaWVudCBpZ25vcmVzIHVybCBwYXJhbWV0ZXJzIChUaG9tYXMgS2hvKQorVEhSSUZULTgyNCAgIFB5dGhvbiAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5fX3N0cl9fKCkgcmVmZXJzIHRvIGNsYXNzIGNvbnN0YW50cyBhcyBnbG9iYWxzIChQZXRlciBTY2h1bGxlcikKK1RIUklGVC04NTUgICBQeXRob24gICAgICAgICAgICAgICBJbmNsdWRlIG9wdGltaXplZCBjb21waWxlZCBweXRob24gb2JqZWN0cyBpbiBpbnN0YWxsIChBbnRob255IE1vbGluYXJvKQorVEhSSUZULTg1OSAgIFB5dGhvbiAgICAgICAgICAgICAgIEFsbG93IHB5OnR3aXN0ZWQgdG8gYmUgZ2VuZXJhdGVkIGluIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBweSAoQnJ1Y2UgTG93ZWthbXApCitUSFJJRlQtODY5ICAgUHl0aG9uICAgICAgICAgICAgICAgVFNvY2tldC5weSBvbiBNYWMgKGFuZCBGcmVlQlNEKSBkb2Vzbid0IGhhbmRsZSBFQ09OTlJFU0VUIGZyb20gcmVjdigpIChTdGV2ZW4gS25pZ2h0KQorVEhSSUZULTg3NSAgIFB5dGhvbiAgICAgICAgICAgICAgIEluY2x1ZGUgcHl0aG9uIHNldHVwLmNmZyBpbiBkaXN0IChBbnRob255IE1vbGluYXJvKQorVEhSSUZULTYxMCAgIFJ1YnkgICAgICAgICAgICAgICAgIGJpbmFyeV9wcm90b2NvbC5yYiBzZWdmYXVsdHMgW2xpbmUgODZdIChVbmFzc2lnbmVkKQorVEhSSUZULTg5OSAgIFJ1YnkgICAgICAgICAgICAgICAgIFJ1YnkgcmVhZCB0aW1lb3V0cyBjYW4gc29tZXRpbWVzIGJlIDJ4IHdoYXQgdGhleSBzaG91bGQgYmUgKFJ5YW4gS2luZykKK1RIUklGVC05MDkgICBSdWJ5ICAgICAgICAgICAgICAgICBhbGxvdyBibG9jayBhcmd1bWVudCB0byBzdHJ1Y3QgY29uc3RydWN0b3IgKE1pY2hhZWwgU3RvY2t0b24pCitUSFJJRlQtNDU2ICAgVGVzdCBTdWl0ZSAgICAgICAgICAgQmFkIElQIGFkZHJlc3Mgc3RyaW5nIGluIHRlc3QvY3BwL3NyYy9tYWluLmNwcCAoUnVzaCBNYW5iZXJ0KQorCisKK1RocmlmdCAwLjQuMCAtIEluY3ViYXRpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUSFJJRlQtNjUwICAgQnVpbGQgICAgICAgIE1ha2UgQ2hlY2sgZmFpbHMgb24gQ2VudG9zL09TWCB3aXRoIDAuMi4wIHRhcmJhbGwgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtNzcwICAgQnVpbGQgICAgICAgIEdldCAnbWFrZSBkaXN0JyB0byB3b3JrIHdpdGhvdXQgZmlyc3QgY29tcGlsaW5nIHNvdXJjZSBjb2RlIChBbnRob255IE1vbGluYXJvKQorVEhSSUZULTE2MCAgIEMjICAgICAgICAgICBDcmVhdGVkIFRIdHRwVHJhbnNwb3J0IGZvciB0aGUgQyMgbGlicmFyeSBiYXNlZCBvbiBXZWJIdHRwUmVxdWVzdCAoTWljaGFlbCBHcmVlbmUpCitUSFJJRlQtODM0ICAgQyMgICAgICAgICAgIFRIdHRwQ2xpZW50IHJlc2VuZHMgY29udGVudHMgb2YgbWVzc2FnZSBhZnRlciB0cmFuc3BvcnQgZXJyb3JzIChBbmF0b2x5IEZheW5nZWxlcmluKQorVEhSSUZULTI0NyAgIEMrKyAgICAgICAgICBUSHR0cFNlcnZlciBUcmFuc3BvcnQgKFVuYXNzaWduZWQpCitUSFJJRlQtNjc2ICAgQysrICAgICAgICAgIENoYW5nZSBDKysgY29kZSBnZW5lcmF0b3Igc28gdGhhdCBnZW5lcmF0ZWQgY2xhc3NlcyBjYW4gYmUgd3JhcHBlZCB3aXRoIFNXSUcgKFVuYXNzaWduZWQpCitUSFJJRlQtNTcwICAgQ29tcGlsZXIgICAgIFRocmlmdCBjb21waWxlciBkb2VzIG5vdCBlcnJvciB3aGVuIGR1cGxpY2F0ZSBtZXRob2QgbmFtZXMgYXJlIHByZXNlbnQgKEJydWNlIFNpbXBzb24pCitUSFJJRlQtODA4ICAgQ29tcGlsZXIgICAgIFNlZ2ZhdWx0IHdoZW4gY29uc3RhbnQgZGVjbGFyYXRpb24gcmVmZXJlbmNlcyBhIHN0cnVjdCBmaWVsZCB0aGF0IGRvZXNuJ3QgZXhpc3QgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtNjQ2ICAgRXJsYW5nICAgICAgIEVybGFuZyBsaWJyYXJ5IGlzIG1pc3NpbmcgaW5zdGFsbCB0YXJnZXQgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtNTQ0ICAgR2VuZXJhbCAgICAgIG11bHRpcGxlIGVudW1zIHdpdGggdGhlIHNhbWUga2V5IGdlbmVyYXRlIGludmFsaWQgY29kZSAoQmVuIFRhaXRlbGJhdW0pCitUSFJJRlQtNDM0ICAgR2VuZXJhbCAgICAgIHJ1YnkgY29tcGlsZXIgc2hvdWxkIHdhcm4gd2hlbiBhIHJlc2VydmVkIHdvcmQgaXMgdXNlZCAoTWljaGFlbCBTdG9ja3RvbikKK1RIUklGVC03OTkgICBHZW5lcmFsICAgICAgRmlsZXMgbWlzc2luZyBwcm9wZXIgQXBhY2hlIGxpY2Vuc2UgaGVhZGVyIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTgzMiAgIEhUTUwgICAgICAgICBIVE1MIGdlbmVyYXRvciBzaG93cyB1bnNwZWNpZmllZCBzdHJ1Y3QgZmllbGRzIGFzICdyZXF1aXJlZCcgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtMjI2ICAgSmF2YSAgICAgICAgIENvbGxlY3Rpb25zIHdpdGggYmluYXJ5IGtleXMgb3IgdmFsdWVzIGJyZWFrIGVxdWFscygpIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTQ4NCAgIEphdmEgICAgICAgICBBYmlsaXR5IHRvIHVzZSBhIHNsaWNlIG9mIGEgYnVmZmVyIGluc3RlYWQgb2YgYSBkaXJlY3QgYnl0ZVtdIGZvciBiaW5hcnkgZmllbGRzIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTcxNCAgIEphdmEgICAgICAgICBtYXhXb3JrZXJUaHJlYWRzIHBhcmFtZXRlciB0byBUSHNIYVNlcnZlciBoYXMgbm8gZWZmZWN0IChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTc1MSAgIEphdmEgICAgICAgICBBZGQgY2xlYXIoKSBtZXRob2QgdG8gVEJhc2UgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtNzY1ICAgSmF2YSAgICAgICAgIEltcHJvdmVkIHN0cmluZyBlbmNvZGluZyBhbmQgZGVjb2RpbmcgcGVyZm9ybWFuY2UgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtNzY4ICAgSmF2YSAgICAgICAgIEFzeW5jIGNsaWVudCBmb3IgSmF2YSAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC03NzQgICBKYXZhICAgICAgICAgVERlc2VyaWFsaXplciBzaG91bGQgcHJvdmlkZSBhIHBhcnRpYWxEZXNlcmlhbGl6ZSBtZXRob2QgZm9yIHByaW1pdGl2ZSB0eXBlcyAoUGlvdHIgS296aWtvd3NraSkKK1RIUklGVC03ODMgICBKYXZhICAgICAgICAgLmVxdWFscyBqYXZhIG1ldGhvZCBpcyBicm9rZW4gb24gc3RydWN0cyBjb250YWluaW5nIGJpbmFyeS10eXBlIGZpZWxkcyAoVW5hc3NpZ25lZCkKK1RIUklGVC04MDQgICBKYXZhICAgICAgICAgQ29tcGFyZVRvIGlzIGJyb2tlbiBmb3IgdW5pb25zIHNldCB0byBtYXAsIHNldCwgb3IgbGlzdCAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04MTQgICBKYXZhICAgICAgICAgSW5jbHVkZSBhIFRTZXJ2bGV0IGluIHRoZSBzdGFuZGFyZCBUaHJpZnQgZGlzdHJpYnV0aW9uIChNYXRoaWFzIEhlcmJlcnRzKQorVEhSSUZULTgxOCAgIEphdmEgICAgICAgICBBc3luYyBjbGllbnQgZG9lc24ndCBzZW5kIG1ldGhvZCBhcmdzIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTgzMCAgIEphdmEgICAgICAgICBTd2l0Y2ggYmluYXJ5IGZpZWxkIGltcGxlbWVudGF0aW9uIGZyb20gYnl0ZVtdIHRvIEJ5dGVCdWZmZXIgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODMxICAgSmF2YSAgICAgICAgIEZyYW1lZFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldXNlcyBpdHMgYnVmZmVycyAoQnJ5YW4gRHV4YnVyeSkKK1RIUklGVC04MzMgICBKYXZhICAgICAgICAgYnVpbGQueG1sIGluIGxpYi9qYXZhIGlzIG1pc3NpbmcgYSBjbGFzc3BhdGhyZWYgYXR0cmlidXRlIGZvciB0aGUgamF2YWRvYyB0YXNrIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTgzNiAgIEphdmEgICAgICAgICBSYWNlIGNvbmRpdGlvbiBjYXVzZXMgQ2FuY2VsbGVkS2V5RXhjZXB0aW9uIGluIFRBc3luY0NsaWVudE1hbmFnZXIgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODQyICAgSmF2YSAgICAgICAgIFVwZ3JhZGUgdG8gY3VycmVudCB2ZXJzaW9uIG9mIGNvbW1vbnMtbGFuZyAoMi41IGluc3RlYWQgb2YgMi40KSBhbmQvb3IgY2hhbmdlIGRlcGVuZGVuY3kgaW4gaXZ5LnhtbCB0byBub3QgYmUgZXhhY3QgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODE1ICAgSmF2YVNjcmlwdCAgIERlc2VyaWFsaXphdGlvbiBvZiBsaXN0cyBpcyBjcml0aWNhbGx5IGJyb2tlbi4gKFQgSmFrZSBMdWNpYW5pKQorVEhSSUZULTgyNyAgIE9DYW1sICAgICAgICBPQ2FtbCBnZW5lcmF0b3IgdG8gdGFrZSBkZWZhdWx0IHZhbHVlcyBpbnRvIGFjY291bnQgKExldiBXYWxraW4pCitUSFJJRlQtNjQ3ICAgUEhQICAgICAgICAgIFBIUCBsaWJyYXJ5IGlzIG1pc3NpbmcgaW5zdGFsbCB0YXJnZXQgKEFudGhvbnkgTW9saW5hcm8pCitUSFJJRlQtNjgyICAgUEhQICAgICAgICAgIFBIUCBleHRlbnNpb24gZG9lc24ndCBjb21waWxlIG9uIE1hYyBPUyBYIChCcnlhbiBEdXhidXJ5KQorVEhSSUZULTcxOCAgIFBIUCAgICAgICAgICBUaHJpZnQgUEhQIGxpYnJhcnkgaW5jbHVkZXMgY2xvc2luZyB0YWdzIGFuZCBleHRyYW5lb3VzIHdoaXRlc3BhY2UgKE5pY2hvbGFzIFRlbGZvcmQpCitUSFJJRlQtNzc4ICAgUEhQICAgICAgICAgIFBIUCBzb2NrZXQgbGlzdGVuaW5nIHNlcnZlciAoTmljayBKb25lcykKK1RIUklGVC03ODAgICBQSFAgICAgICAgICAgUEhQIGV4dGVuc2lvbiBzb21ldGltZXMgY2F1c2VzIGFuIGFib3J0IHdpdGggdHdvIGV4Y2VwdGlvbnMgYXQgdGhlIHNhbWUgdGltZSAoRGF2aWQgUmVpc3MpCitUSFJJRlQtODM3ICAgUEhQICAgICAgICAgIFBIUCBhY2NlbGVyYXRvciBidWcgZm9yIHdyaXRlcyA+IDhrIChUaG9tYXMgS2hvKQorVEhSSUZULTc4MiAgIFBlcmwgICAgICAgICBQZXJsIGNvZGUgZm9yIHdyaXRpbmcgY29udGFpbmVycyBkb2Vzbid0IGNvdW50IGxlbmd0aCBvZiB3cml0ZSpCZWdpbiBvciB3cml0ZSpFbmQgKENvbnJhZCBIdWdoZXMpCitUSFJJRlQtMzk1ICAgUHl0aG9uICAgICAgIFB5dGhvbiBsaWJyYXJ5ICsgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCB1bmljb2RlIHN0cmluZ3MgKFVuYXNzaWduZWQpCitUSFJJRlQtMTMzICAgUnVieSAgICAgICAgICduYW1lc3BhY2UgcnVieScgc2hvdWxkIGVycm9yIG91dCwgb3IgYmUgYW4gYWxpYXMgdG8gJ25hbWVzcGFjZSByYicgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtNjY0ICAgUnVieSAgICAgICAgIFJ1YnkgZXh0ZW5zaW9uIGZhaWxzIHRvIGJ1aWxkIHdpdGggUnVieSAxLjkuMSAoUmFqZXNoIE1hbGVwYXRpKQorVEhSSUZULTY5OSAgIFJ1YnkgICAgICAgICBFeGNpc2UgdW51c2VkICJuYXRpdmUgcHJvdG9jb2wgbWV0aG9kIHRhYmxlIiBzdHVmZiBmcm9tIHRocmlmdF9uYXRpdmUgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtNzY3ICAgUnVieSAgICAgICAgIHJ1YnkgY29tcGlsZXIgZG9lcyBub3Qga2VlcCBjb21tZW50cyBmb3IgZW51bSB2YWx1ZXMgKEJyeWFuIER1eGJ1cnkpCitUSFJJRlQtODExICAgUnVieSAgICAgICAgIGh0dHBfY2xpZW50X3RyYW5zcG9ydC5yYjogYWxsb3cgY3VzdG9tIGh0dHAgaGVhZGVycyAoVG9ueSBLYW1lbmljaykKK1RIUklGVC00NTkgICBSdWJ5ICAgICAgICAgUnVieSBpbnN0YWxsYXRpb24gYWx3YXlzIHRyaWVzIHRvIHdyaXRlIHRvIC9MaWJyYXJ5L1J1Ynkvc2l0ZSAoTWF0dGhpZXUgSW1iZXJ0KQorCisKK1RocmlmdCAwLjEuMCAtIEluY3ViYXRpbmcgKG5vdCByZWxlYXNlZCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb21wYXRpYmlsaXR5IEJyZWFraW5nIENoYW5nZXM6CiAgIEMrKzoKICAgICAqIEl0J3MgcXVpdGUgcG9zc2libGUgdGhhdCByZWdlbmVyYXRpbmcgY29kZSBhbmQgcmVidWlsZGluZyB3aWxsIGJlCkBAIC0xOCw4ICsyOTAyLDcgQEAKICAgRXJsYW5nOgogICAgICogR2VuZXJhdGVkIGNvZGUgd2lsbCBoYXZlIHRvIGJlIHJlZ2VuZXJhdGVkLCBhbmQgdGhlIG5ldyBjb2RlIHdpbGwKICAgICAgIGhhdmUgdG8gYmUgZGVwbG95ZWQgYXRvbWljYWxseSB3aXRoIHRoZSBuZXcgbGlicmFyeSBjb2RlIFtUSFJJRlQtMTM2XQotICAKLSAgCisKIE5ldyBGZWF0dXJlcyBhbmQgQnVnIEZpeGVzOgogICBDKys6CiAgICAgKiBTdXBwb3J0IGZvciBUQ29tcGFjdFByb3RvY29sIFtUSFJJRlQtMzMzXQpkaWZmIC0tZ2l0IGEvQ01ha2VMaXN0cy50eHQgYi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU3YTY2Ci0tLSAvZGV2L251bGwKKysrIGIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMy4xKQorCisjIENNYWtlIDMuMSBzdXBwb3J0cyBDKysgc3RhbmRhcmRzIHNlbGVjdGlvbiB3aXRoIENNQUtFX0NYWF9TVEFOREFSRAorIyBJZiB5b3UgbmVlZCBDTWFrZSAzLjErIGZvciBVYnVudHUgMTQuMDQsIHRyeQorIyAgIGh0dHBzOi8vbGF1bmNocGFkLm5ldC9+Z2VvcmdlLWVkaXNvbjU1LythcmNoaXZlL3VidW50dS9jbWFrZS0zLngKKyMgSWYgeW91IG5lZWQgQ01ha2UgMy4xKyBmb3IgZGViaWFuICJqZXNzaWUiLCBnZXQgaXQgZnJvbSBqZXNzaWUtYmFja3BvcnRzCisjIE90aGVyd2lzZQorIyAgIGh0dHA6Ly9jbWFrZS5vcmcKKworcHJvamVjdCgiQXBhY2hlIFRocmlmdCIpCisKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9NT0RVTEVfUEFUSH0iICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYnVpbGQvY21ha2UiKQorCisjIFRPRE86IGFkZCBgZ2l0IHJldi1wYXJzZSAtLXNob3J0IEhFQURgCisjIFJlYWQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgQXV0b2NvbmYgZmlsZQorZmlsZSAoU1RSSU5HUyAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbmZpZ3VyZS5hYyIgQ09ORklHVVJFX0FDIFJFR0VYICJBQ19JTklUXFwoLipcXCkiICkKKworIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHVzZWQgaW4gdGhlIHZlcnNpb24uaC5pbiBmaWxlCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiQUNfSU5JVFxcKFxcWy4qXFxdLCBcXFsoWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rKC1kZXYpPylcXF1cXCkiICJcXDEiIFBBQ0tBR0VfVkVSU0lPTiAke0NPTkZJR1VSRV9BQ30pCittZXNzYWdlKFNUQVRVUyAiUGFyc2VkIFRocmlmdCBwYWNrYWdlIHZlcnNpb246ICR7UEFDS0FHRV9WRVJTSU9OfSIpCisKKyMgVGhlc2UgYXJlIGludGVybmFsIHRvIENNYWtlCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiKFswLTldK1xcLlswLTldK1xcLlswLTldKykoLWRldik/IiAiXFwxIiB0aHJpZnRfVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0pCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiKFswLTldKylcXC5bMC05XStcXC5bMC05XSsiICJcXDEiIHRocmlmdF9WRVJTSU9OX01BSk9SICR7dGhyaWZ0X1ZFUlNJT059KQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlswLTldK1xcLihbMC05XSkrXFwuWzAtOV0rIiAiXFwxIiB0aHJpZnRfVkVSU0lPTl9NSU5PUiAke3RocmlmdF9WRVJTSU9OfSkKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJbMC05XStcXC5bMC05XStcXC4oWzAtOV0rKSIgIlxcMSIgdGhyaWZ0X1ZFUlNJT05fUEFUQ0ggJHt0aHJpZnRfVkVSU0lPTn0pCittZXNzYWdlKFNUQVRVUyAiUGFyc2VkIFRocmlmdCB2ZXJzaW9uOiAke3RocmlmdF9WRVJTSU9OfSAoJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0uJHt0aHJpZnRfVkVSU0lPTl9NSU5PUn0uJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0pIikKKworIyBTb21lIGRlZmF1bHQgc2V0dGluZ3MKK2luY2x1ZGUoRGVmaW5lQ01ha2VEZWZhdWx0cykKKworIyBCdWlsZCB0aW1lIG9wdGlvbnMgYXJlIGRlZmluZWQgaGVyZQoraW5jbHVkZShEZWZpbmVPcHRpb25zKQoraW5jbHVkZShEZWZpbmVJbnN0YWxsYXRpb25QYXRocykKKworIyBCYXNlZCBvbiB0aGUgb3B0aW9ucyBzZXQgc29tZSBwbGF0Zm9ybSBzcGVjaWZpY3MKK2luY2x1ZGUoRGVmaW5lUGxhdGZvcm1TcGVjaWZjKQorCisjIEdlbmVyYXRlIHRoZSBjb25maWcuaCBmaWxlCitpbmNsdWRlKENvbmZpZ3VyZUNoZWNrcykKKworIyBQYWNrYWdlIGl0CitpbmNsdWRlKENQYWNrQ29uZmlnKQorCisKK2ZpbmRfcGFja2FnZShUaHJlYWRzKQorCitpbmNsdWRlKENUZXN0KQoraWYoQlVJTERfVEVTVElORykKKyAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkaW5nIHdpdGggdW5pdHRlc3RzIikKKworICBlbmFibGVfdGVzdGluZygpCisgICMgRGVmaW5lICJtYWtlIGNoZWNrIiBhcyBhbGlhcyBmb3IgIm1ha2UgdGVzdCIKKyAgYWRkX2N1c3RvbV90YXJnZXQoY2hlY2sgQ09NTUFORCBjdGVzdCkKK2Vsc2UgKCkKKyAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkaW5nIHdpdGhvdXQgdGVzdHMiKQorZW5kaWYgKCkKKworaWYoQlVJTERfQ09NUElMRVIpCisgICAgaWYoTk9UIEVYSVNUUyAke1RIUklGVF9DT01QSUxFUn0pCisgICAgICAgIHNldChUSFJJRlRfQ09NUElMRVIgJDxUQVJHRVRfRklMRTp0aHJpZnQtY29tcGlsZXI+KQorICAgIGVuZGlmKCkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb21waWxlci9jcHApCitlbHNlaWYoRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICBhZGRfZXhlY3V0YWJsZSh0aHJpZnQtY29tcGlsZXIgSU1QT1JURUQpCisgICAgc2V0X3Byb3BlcnR5KFRBUkdFVCB0aHJpZnQtY29tcGlsZXIgUFJPUEVSVFkgSU1QT1JURURfTE9DQVRJT04gJHtUSFJJRlRfQ09NUElMRVJ9KQorZW5kaWYoKQorCitpZihCVUlMRF9DUFApCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2NwcCkKKyAgICBpZihCVUlMRF9UVVRPUklBTFMpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3R1dG9yaWFsL2NwcCkKKyAgICBlbmRpZigpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgaWYoV0lUSF9MSUJFVkVOVCBBTkQgV0lUSF9aTElCIEFORCBXSVRIX09QRU5TU0wpCisgICAgICAgICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L2NwcCkKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBtZXNzYWdlKFdBUk5JTkcgImxpYmV2ZW50IGFuZC9vciBaTElCIGFuZC9vciBPcGVuU1NMIG5vdCBmb3VuZCBvciBkaXNhYmxlZDsgd2lsbCBub3QgYnVpbGQgc29tZSB0ZXN0cyIpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCitlbmRpZigpCisKK2lmKEJVSUxEX0NfR0xJQikKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvY19nbGliKQorZW5kaWYoKQorCitpZihCVUlMRF9KQVZBKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9qYXZhKQorZW5kaWYoKQorCitpZihCVUlMRF9QWVRIT04pCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL3B5KQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvcHkpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitpZihCVUlMRF9IQVNLRUxMKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9ocykKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L2hzKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworUFJJTlRfQ09ORklHX1NVTU1BUlkoKQpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWQ3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwxMTYgQEAKKyMgSG93IHRvIENvbnRyaWJ1dGUgIworCitUaGFuayB5b3UgZm9yIHlvdXIgaW50ZXJlc3QgaW4gY29udHJpYnV0aW5nIHRvIHRoZSBBcGFjaGUgVGhyaWZ0IHByb2plY3QhICBJbmZvcm1hdGlvbiBvbiB3aHkgYW5kIGhvdyB0byBjb250cmlidXRlIGlzIGF2YWlsYWJsZSBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgd2ViIHNpdGUuIEluIHBhcnRpY3VsYXIsIHdlIHJlY29tbWVuZCB0aGUgZm9sbG93aW5nIHRvIGJlY29tZSBhY3F1YWludGVkIHdpdGggQXBhY2hlIENvbnRyaWJ1dGlvbnM6CisKKyAqIFtDb250cmlidXRvcnMgVGVjaCBHdWlkZV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9jb250cmlidXRvcnMpCisgKiBbR2V0IGludm9sdmVkIV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vZ2V0aW52b2x2ZWQuaHRtbCkKKyAqIFtMZWdhbCBhc3BlY3RzIG9uIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucyAoUGF0Y2hlcyldKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sI2NvbnRyaWJ1dGlvbnMpCisKKyMjIEdpdEh1YiBwdWxsIHJlcXVlc3RzICMjCisKK1RoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2Qgb2Ygc3VibWl0dGluZyBjaGFuZ2VzLiAgV2hlbiB5b3Ugc3VibWl0IGEgcHVsbCByZXF1ZXN0IHRocm91Z2ggZ2l0aHViLAoraXQgYWN0aXZhdGVzIHRoZSBjb250aW51b3VzIGludGVncmF0aW9uIChDSSkgYnVpbGQgc3lzdGVtcyBhdCBBcHB2ZXlvciBhbmQgVHJhdmlzIHRvIGJ1aWxkIHlvdXIgY2hhbmdlc3hpCitvbiBhIHZhcmlldHkgb2YgTGludXggYW5kIFdpbmRvd3MgY29uZmlndXJhdGlvbnMgYW5kIHJ1biBhbGwgdGhlIHRlc3Qgc3VpdGVzLiAgRm9sbG93IHRoZXNlIHJlcXVpcmVtZW50cyAKK2ZvciBhIHN1Y2Nlc3NmdWwgcHVsbCByZXF1ZXN0OgorCisgMS4gQWxsIGNvZGUgY2hhbmdlcyByZXF1aXJlIGFuIFtBcGFjaGUgSmlyYSBUSFJJRlQgSXNzdWVdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpIHRpY2tldC4KKworIDEuIEFsbCBwdWxsIHJlcXVlc3RzIHNob3VsZCBjb250YWluIGEgc2luZ2xlIGNvbW1pdCBwZXIgaXNzdWUsIG9yIHdlIHdpbGwgYXNrIHlvdSB0byBzcXVhc2ggaXQuCisgMS4gVGhlIHB1bGwgcmVxdWVzdCB0aXRsZSBtdXN0IGJlZ2luIHdpdGggdGhlIEppcmEgVEhSSUZUIHRpY2tldCBpZGVudGlmaWVyLCBmb3IgZXhhbXBsZToKKworICAgICAgICBUSFJJRlQtOTk5OTogYW4gZXhhbXBsZSBwdWxsIHJlcXVlc3QgdGl0bGUKKyAgICAgICAgCisgMS4gQ29tbWl0IG1lc3NhZ2VzIG11c3QgZm9sbG93IHRoaXMgcGF0dGVybiBmb3IgY29kZSBjaGFuZ2VzIChkZXZpYXRpb25zIHdpbGwgbm90IGJlIG1lcmdlZCk6CisgICAgICAgIAorICAgICAgICBUSFJJRlQtOTk5OTogW3N1bW1hcnkgb2YgZml4LCBvbmUgbGluZSBpZiBwb3NzaWJsZV0KKyAgICAgICAgQ2xpZW50OiBbbGFuZ3VhZ2UocykgYWZmZWN0ZWQsIGNvbW1hIHNlcGFyYXRlZCwgdXNlIGxpYi8gZGlyZWN0b3J5IG5hbWVzIHBsZWFzZV0KKworSW5zdHJ1Y3Rpb25zOgorCisgMS4gQ3JlYXRlIGEgZm9yayBpbiB5b3VyIEdpdEh1YiBhY2NvdW50IG9mIGh0dHA6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQKKyAxLiBDbG9uZSB0aGUgZm9yayB0byB5b3VyIGRldmVsb3BtZW50IHN5c3RlbS4KKyAxLiBDcmVhdGUgYSBicmFuY2ggZm9yIHlvdXIgY2hhbmdlcyAoYmVzdCBwcmFjdGljZSBpcyBpc3N1ZSBhcyBicmFuY2ggbmFtZSwgZS5nLiBUSFJJRlQtOTk5OSkuCisgMS4gTW9kaWZ5IHRoZSBzb3VyY2UgdG8gaW5jbHVkZSB0aGUgaW1wcm92ZW1lbnQvYnVnZml4LCBhbmQ6CisKKyAgICAqIFJlbWVtYmVyIHRvIHByb3ZpZGUgKnRlc3RzKiBmb3IgYWxsIHN1Ym1pdHRlZCBjaGFuZ2VzIQorICAgICogVXNlIHRlc3QtZHJpdmVuIGRldmVsb3BtZW50IChUREQpOiBhZGQgYSB0ZXN0IHRoYXQgd2lsbCBpc29sYXRlIHRoZSBidWcgKmJlZm9yZSogYXBwbHlpbmcgdGhlIGNoYW5nZSB0aGF0IGZpeGVzIGl0LgorICAgICogVmVyaWZ5IHRoYXQgeW91IGZvbGxvdyBbVGhyaWZ0IENvZGluZyBTdGFuZGFyZHNdKC9kb2NzL2NvZGluZ19zdGFuZGFyZHMpICh5b3UgY2FuIHJ1biAnbWFrZSBzdHlsZScsIHdoaWNoIGVuc3VyZXMgcHJvcGVyIGZvcm1hdCBmb3Igc29tZSBsYW5ndWFnZXMpLgorICAgICogWypvcHRpb25hbCpdIFZlcmlmeSB0aGF0IHlvdXIgY2hhbmdlIHdvcmtzIG9uIG90aGVyIHBsYXRmb3JtcyBieSBhZGRpbmcgYSBHaXRIdWIgc2VydmljZSBob29rIHRvIFtUcmF2aXMgQ0ldKGh0dHA6Ly9kb2NzLnRyYXZpcy1jaS5jb20vdXNlci9nZXR0aW5nLXN0YXJ0ZWQvI1N0ZXAtb25lJTNBLVNpZ24taW4pIGFuZCBbQXBwVmV5b3JdKGh0dHA6Ly93d3cuYXBwdmV5b3IuY29tL2RvY3MpLiAgWW91IGNhbiB1c2UgdGhpcyB0ZWNobmlxdWUgdG8gcnVuIHRoZSBUaHJpZnQgQ0kgam9icyBpbiB5b3VyIGFjY291bnQgdG8gY2hlY2sgeW91ciBjaGFuZ2VzIGJlZm9yZSB0aGV5IGFyZSBtYWRlIHB1YmxpYy4gIEV2ZXJ5IEdpdEh1YiBwdWxsIHJlcXVlc3QgaW50byBUaHJpZnQgd2lsbCBydW4gdGhlIGZ1bGwgQ0kgYnVpbGQgYW5kIHRlc3Qgc3VpdGUgb24geW91ciBjaGFuZ2VzLgorCisgMS4gU3F1YXNoIHlvdXIgY2hhbmdlcyB0byBhIHNpbmdsZSBjb21taXQuICBUaGlzIG1haW50YWlucyBjbGVhbiBjaGFuZ2UgaGlzdG9yeS4KKyAxLiBDb21taXQgYW5kIHB1c2ggY2hhbmdlcyB0byB5b3VyIGJyYW5jaCAocGxlYXNlIHVzZSBpc3N1ZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBhcyBjb21taXQgdGl0bGUsIGUuZy4gIlRIUklGVC05OTk5OiBtYWtlIGl0IHBlcmZlY3QiKSwgd2l0aCB0aGUgYWZmZWN0ZWQgbGFuZ3VhZ2VzIG9uIHRoZSBuZXh0IGxpbmUgb2YgdGhlIGRlc2NyaXB0aW9uLgorIDEuIFVzZSBHaXRIdWIgdG8gY3JlYXRlIGEgcHVsbCByZXF1ZXN0IGdvaW5nIGZyb20geW91ciBicmFuY2ggdG8gYXBhY2hlOm1hc3Rlci4gIEVuc3VyZSB0aGF0IHRoZSBKaXJhIHRpY2tldCBudW1iZXIgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGl0bGUgb2YgeW91ciBwdWxsIHJlcXVlc3QsIHNhbWUgYXMgdGhlIGNvbW1pdCB0aXRsZS4KKyAxLiBXYWl0IGZvciBvdGhlciBjb250cmlidXRvcnMgb3IgY29tbWl0dGVycyB0byByZXZpZXcgeW91ciBuZXcgYWRkaXRpb24sIGFuZCBmb3IgYSBDSSBidWlsZCB0byBjb21wbGV0ZS4KKyAxLiBXYWl0IGZvciBhIGNvbW1pdHRlciB0byBjb21taXQgeW91ciBwYXRjaC4gIFlvdSBjYW4gbnVkZ2UgdGhlIGNvbW1pdHRlcnMgaWYgbmVjZXNzYXJ5IGJ5IHNlbmRpbmcgYSBtZXNzYWdlIHRvIHRoZSBbQXBhY2hlIFRocmlmdCBtYWlsaW5nIGxpc3RdKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbWFpbGluZykuCisKKyMjIElmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZSBwcm9qZWN0IGxvY2FsbHkgIyMKKworRm9yIFdpbmRvd3Mgc3lzdGVtcywgc2VlIG91ciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gdGhlIFtDTWFrZSBSRUFETUVdKC9idWlsZC9jbWFrZS9SRUFETUUubWQpLgorCitGb3IgV2luZG93cyBOYXRpdmUgQysrIGJ1aWxkcywgc2VlIG91ciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gdGhlIFtXaW5DUFAgUkVBRE1FXSgvYnVpbGQvd2luY3BwL1JFQURNRS5tZCkuCisKK0ZvciB1bml4IHN5c3RlbXMsIHNlZSBvdXIgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBbRG9ja2VyIFJFQURNRV0oL2J1aWxkL2RvY2tlci9SRUFETUUubWQpLgorCisjIyBJZiB5b3Ugd2FudCB0byByZXZpZXcgb3BlbiBpc3N1ZXMuLi4gIyMKKworIDEuIFJldmlldyB0aGUgW0dpdEh1YiBQdWxsIFJlcXVlc3QgQmFja2xvZ10oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvcHVsbHMpLiAgQ29kZSByZXZpZXdzIGFyZSBvcGVuIHRvIGFsbC4KKyAyLiBSZXZpZXcgdGhlIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpLiAgWW91IGNhbiBzZWFyY2ggZm9yIHRpY2tldHMgcmVsYXRpbmcgdG8gbGFuZ3VhZ2VzIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBvciBjdXJyZW50bHkgdXNpbmcgd2l0aCB0aHJpZnQsIGZvciBleGFtcGxlIGEgSmlyYSBzZWFyY2ggKElzc3VlcyAtPiBTZWFyY2ggRm9yIElzc3VlcykgcXVlcnkgb2YgYGBwcm9qZWN0ID0gVEhSSUZUIEFORCBjb21wb25lbnQgaW4gKCJFcmxhbmcgLSBMaWJyYXJ5IikgYW5kIHN0YXR1cyBub3QgaW4gKHJlc29sdmVkLCBjbG9zZWQpYGAgd2lsbCBsb2NhdGUgYWxsIHRoZSBvcGVuIEVybGFuZyBMaWJyYXJ5IGlzc3Vlcy4KKworIyMgSWYgeW91IGRpc2NvdmVyZWQgYSBkZWZlY3QuLi4gIyMKKworIDEuIENoZWNrIHRvIHNlZSBpZiB0aGUgaXNzdWUgaXMgYWxyZWFkeSBpbiB0aGUgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkuCisgMS4gSWYgbm90LCBjcmVhdGUgYSB0aWNrZXQgZGVzY3JpYmluZyB0aGUgY2hhbmdlIHlvdSdyZSBwcm9wb3NpbmcgaW4gdGhlIEppcmEgaXNzdWUgdHJhY2tlci4KKyAxLiBDb250cmlidXRlIHlvdXIgY29kZSBjaGFuZ2VzIHVzaW5nIHRoZSBHaXRIdWIgcHVsbCByZXF1ZXN0IG1ldGhvZDoKKworIyMgQ29udHJpYnV0aW5nIHZpYSBQYXRjaCAjIworCitTb21lIGNoYW5nZXMgZG8gbm90IHJlcXVpcmUgYSBidWlsZCwgZm9yIGV4YW1wbGUgaW4gZG9jdW1lbnRhdGlvbi4gIEZvciBjaGFuZ2VzIHRoYXQgYXJlIG5vdCBjb2RlIG9yIGJ1aWxkIHJlbGF0ZWQsIHlvdSBjYW4gc3VibWl0IGEgcGF0Y2ggb24gSmlyYSBmb3IgcmV2aWV3LiAgVG8gY3JlYXRlIGEgcGF0Y2ggZnJvbSBjaGFuZ2VzIGluIHlvdXIgbG9jYWwgZGlyZWN0b3J5OgorCisgICAgZ2l0IGRpZmYgPiAuLi9USFJJRlQtTk5OTi5wYXRjaAorCit0aGVuIHdhaXQgZm9yIGNvbnRyaWJ1dG9ycyBvciBjb21taXR0ZXJzIHRvIHJldmlldyB5b3VyIGNoYW5nZXMsIGFuZCB0aGVuIGZvciBhIGNvbW1pdHRlciB0byBhcHBseSB5b3VyIHBhdGNoLgorCisjIyBHaXRIdWIgcmVjaXBlcyBmb3IgUHVsbCBSZXF1ZXN0cyAjIworCitTb21ldGltZXMgY29tbW1pdHRlcnMgbWF5IGFzayB5b3UgdG8gdGFrZSBhY3Rpb25zIGluIHlvdXIgcHVsbCByZXF1ZXN0cy4gIEhlcmUgYXJlIHNvbWUgcmVjaXBlcyB0aGF0IHdpbGwgaGVscCB5b3UgYWNjb21wbGlzaCB0aG9zZSByZXF1ZXN0cy4gIFRoZXNlIGV4YW1wbGVzIGFzc3VtZSB5b3UgYXJlIHdvcmtpbmcgb24gSmlyYSBpc3N1ZSBUSFJJRlQtOTk5OS4gIFlvdSBzaG91bGQgYWxzbyBiZSBmYW1pbGlhciB3aXRoIHRoZSBbdXBzdHJlYW1dKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL3N5bmNpbmctYS1mb3JrLykgcmVwb3NpdG9yeSBjb25jZXB0LgorCisjIyMgU3F1YXNoIHlvdXIgY2hhbmdlcyAjIyMKKworSWYgeW91IGhhdmUgbm90IHN1Ym1pdHRlZCBhIHB1bGwgcmVxdWVzdCB5ZXQsIG9yIGlmIHlvdSBoYXZlIG5vdCB5ZXQgcmViYXNlZCB5b3VyIGV4aXN0aW5nIHB1bGwgcmVxdWVzdCwgeW91IGNhbiBzcXVhc2ggYWxsIHlvdXIgY29tbWl0cyBkb3duIHRvIGEgc2luZ2xlIGNvbW1pdC4gIFRoaXMgbWFrZXMgbGlmZSBlYXNpZXIgZm9yIHRoZSBjb21taXR0ZXJzLiAgSWYgeW91ciBwdWxsIHJlcXVlc3Qgb24gR2l0SHViIGhhcyBtb3JlIHRoYW4gb25lIGNvbW1pdCwgeW91IHNob3VsZCBkbyB0aGlzLgorCisxLiBVc2UgdGhlIGNvbW1hbmQgYGBnaXQgbG9nYGAgdG8gaWRlbnRpZnkgaG93IG1hbnkgY29tbWl0cyB5b3UgbWFkZSBzaW5jZSB5b3UgYmVnYW4uCisyLiBVc2UgdGhlIGNvbW1hbmQgYGBnaXQgcmViYXNlIC1pIEhFQUR+TmBgIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBjb21taXRzLgorMy4gTGVhdmUgInB1bGwiIGluIHRoZSBmaXJzdCBsaW5lLgorNC4gQ2hhbmdlIGFsbCBvdGhlciBsaW5lcyBmcm9tICJwdWxsIiB0byAiZml4dXAiLgorNS4gQWxsIHlvdXIgY2hhbmdlcyBhcmUgbm93IGluIGEgc2luZ2xlIGNvbW1pdC4KKworSWYgeW91IGFscmVhZHkgaGF2ZSBhIHB1bGwgcmVxdWVzdCBvdXRzdGFuZGluZywgeW91IHdpbGwgbmVlZCB0byBkbyBhICJmb3JjZSBwdXNoIiB0byBvdmVyd3JpdGUgaXQgc2luY2UgeW91IGNoYW5nZWQgeW91ciBjb21taXQgaGlzdG9yeToKKworICAgIGdpdCBwdXNoIC11IG9yaWdpbiBUSFJJRlQtOTk5OSAtLWZvcmNlCisKK0EgbW9yZSBkZXRhaWxlZCB3YWxrdGhyb3VnaCBvZiBhIHNxdWFzaCBjYW4gYmUgZm91bmQgYXQgW0dpdCBSZWFkeV0oaHR0cDovL2dpdHJlYWR5LmNvbS9hZHZhbmNlZC8yMDA5LzAyLzEwL3NxdWFzaGluZy1jb21taXRzLXdpdGgtcmViYXNlLmh0bWwpLgorCisjIyMgUmViYXNlIHlvdXIgcHVsbCByZXF1ZXN0ICMjIworCitJZiB5b3VyIHB1bGwgcmVxdWVzdCBoYXMgYSBjb25mbGljdCB3aXRoIG1hc3RlciwgaXQgbmVlZHMgdG8gYmUgcmViYXNlZDoKKworICAgIGdpdCBjaGVja291dCBUSFJJRlQtOTk5OQorICAgIGdpdCByZWJhc2UgdXBzdHJlYW0gbWFzdGVyCisgICAgICAocmVzb2x2ZSBhbnkgY29uZmxpY3RzLCBtYWtlIHN1cmUgaXQgYnVpbGRzKQorICAgIGdpdCBwdXNoIC11IG9yaWdpbiBUSFJJRlQtOTk5OSAtLWZvcmNlCisKKyMjIyBGaXggYSBiYWQgbWVyZ2UgIyMjCisKK0lmIHlvdXIgcHVsbCByZXF1ZXN0IGNvbnRhaW5zIGNvbW1pdHMgdGhhdCBhcmUgbm90IHlvdXJzLCB0aGVuIHlvdSBzaG91bGQgdXNlIHRoZSBmb2xsb3dpbmcgdGVjaG5pcXVlIHRvIGZpeCB0aGUgYmFkIG1lcmdlIGluIHlvdXIgYnJhbmNoOgorCisgICAgZ2l0IGNoZWNrb3V0IG1hc3RlcgorICAgIGdpdCBwdWxsIHVwc3RyZWFtIG1hc3RlcgorICAgIGdpdCBjaGVja291dCAtYiBUSFJJRlQtOTk5OS10YWtlLTIKKyAgICBnaXQgY2hlcnJ5LXBpY2sgLi4uCisgICAgICAgIChwaWNrIG9ubHkgeW91ciBjb21taXRzIGZyb20geW91ciBvcmlnaW5hbCBwdWxsIHJlcXVlc3QgaW4gYXNjZW5kaW5nIGNocm9ub2xvZ2ljYWwgb3JkZXIpCisgICAgc3F1YXNoIHlvdXIgY2hhbmdlcyB0byBhIHNpbmdsZSBjb21taXQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSAoc2VlIGFib3ZlKQorICAgIGdpdCBwdXNoIC11IG9yaWdpbiBUSFJJRlQtOTk5OS10YWtlLTI6VEhSSUZULTk5OTkKKworVGhpcyBwcm9jZWR1cmUgd2lsbCBhcHBseSBvbmx5IHlvdXIgY29tbWl0cyBpbiBvcmRlciB0byB0aGUgY3VycmVudCBtYXN0ZXIsIHRoZW4geW91IHdpbGwgc3F1YXNoIHRoZW0gdG8gYSBzaW5nbGUgY29tbWl0LCBhbmQgdGhlbiB5b3UgZm9yY2UgcHVzaCB5b3VyIGxvY2FsIFRIUklGVC05OTk5LXRha2UtMiBpbnRvIHJlbW90ZSBUSFJJRlQtOTk5OSB3aGljaCByZXByZXNlbnRzIHlvdXIgcHVsbCByZXF1ZXN0LCByZXBsYWNpbmcgYWxsIHRoZSBjb21taXRzIHdpdGggdGhlIG5ldyBvbmUuCisKKyAKZGlmZiAtLWdpdCBhL0NPTlRSSUJVVE9SUyBiL0NPTlRSSUJVVE9SUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ5NTRmOC4uMDAwMDAwMAotLS0gYS9DT05UUklCVVRPUlMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1DaGFkIFdhbHRlcnMgPGNoYWRAcG93ZXJzZXQuY29tPgotLVRKU09OUHJvdG9jb2wgZm9yIEMrKyBhbmQgSmF2YQotCi1OaXRheSA8bml0YXlqQGdtYWlsLmNvbT4KLS1TdXBwb3J0IGZvciAibWFrZSBjaGVjayIKLQotV2lsbGlhbSBNb3JnYW4gPHdAYWRhcC50dj4KLS1NaXNjZWxsYW5lb3VzIFJ1YnkgaW1wcm92ZW1lbnRzCi0KLUJlbiBNYXVyZXIgPGJtYXVyZXJAYW5kcmV3LmNtdS5lZHU+Ci0tUmVzdHJ1Y3R1cmluZyB0aGUgd2F5IEF1dG9jb25mIGlzIHVzZWQKLQotUGF0cmljayBDb2xsaXNvbiA8cGF0cmlja0Bjb2xsaXNvbi5pZT4KLS1TbWFsbHRhbGsgYmluZGluZ3MKLQotRGF2ZSBTaW1wc29uIDxkYXZlQHBvd2Vyc2V0LmNvbT4KLS1CZXR0ZXIgc3VwcG9ydCBmb3IgY29ubmVjdGlvbiB0cmFja2luZyBpbiB0aGUgQysrIHNlcnZlcgotLU1pc2NlbGxhbmVvdXMgZml4ZXMKLQotSWdvciBBZmFuYXN5ZXYgPGFmYW5AZXZlcm5vdGUuY29tPgotLVBlcmwgSHR0cENsaWVudCBhbmQgYnVnZml4ZXMKLQotVG9kZCBCZXJtYW4gPHRiZXJtYW5AaW1lZW0uY29tPgotLU1pbkdXIHBvcnQgb2YgdGhlIGNvbXBpbGVyCi0tQyMgYmluZGluZ3MKLS1NUyBidWlsZCB0YXNrCi0KLS0tLS0tLS0tLS0tLS0tLS0KLVJlbGVhc2UgMjAwNzA5MTcKLS0tLS0tLS0tLS0tLS0tLS0KLQotRGF2ZSBFbmdiZXJnIDxlbmdiZXJnQGdtYWlsLmNvbT4KLS1KYXZhQmVhbi9KYXZhRG9jIGVuaGFuY2VtZW50cwotCi1BbmRyZXcgTWNHZWFjaGllIDxnZWVjaG9yYW1hQGdtYWlsLmNvbT4KLS1Db2NvYS9PYmplY3RpdmUtQyBzdXBwb3J0Ci0KLUJlbiBNYXVyZXIgPGJtYXVyZXJAYW5kcmV3LmNtdS5lZHU+Ci0tUHl0aG9uIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cywgZmFzdGJpbmFyeSBzdXBwb3J0Ci0KLUFuZHJldyBMdXRvbWlyc2tpIDxhbmR5QGx1dG8udXM+Ci0tQWRkZWQgb3B0aW9uYWwvcmVxdWlyZWQga2V5d29yZHMgZm9yIEMrKyBvYmplY3RzCi0tQWRkZWQgY29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIEMrKyBzdHJ1Y3RzCi0KLUpvaGFuIE9za2Fyc3NvbiA8am9oYW5Ab2tzYXJzc29uLm51PgotLUphdmEgZmluZGJ1Z3MgY29tcGxpYW5jZSBmaXhlcwotCi1QYXVsIFNhYWIgPHBzQHBvd2Vyc2V0LmNvbT4KLS1JUHY2IHN1cHBvcnQgZm9yIFRTb2NrZXQgaW4gQysrL1B5dGhvbgotCi1LZXZpbiBDbGFyayA8a2V2aW5AcG93ZXJzZXQuY29tPgotLVNpZ25pZmljYW50IG92ZXJoYXVsIG9mIFJ1YnkgY29kZSBnZW5lcmF0aW9uIGFuZCBzZXJ2ZXJzCi0KLVNpbW9uIEZvcm1hbiA8c2Zvcm1hbkBnbWFpbC5jb20+Ci0tVFByb2Nlc3NvckZhY3RvcnkgYWJzdHJhY3Rpb24gZm9yIEphdmEgc2VydmVycwotCi1KYWtlIEx1Y2lhbmkgPGpha2Vyc0BnbWFpbC5jb20+Ci0tUGVybCBjb2RlIGdlbmVyYXRpb24sIGxpYnJhcmllcywgdGVzdCBjb2RlCi0KLURhdmlkIFJlaXNzIDxkcmVpc3NAc3RhbmZvcmQuZWR1PgotLXN0cmluZ3MuaCBpbmNsdWRlIGZpeCBmb3IgYnplcm8KLS1lbmRpYW5uZXNzIGZpeGVzIG9uIFRCaW5hcnlQcm90b2NvbCBkb3VibGUgc2VyaWFsaXphdGlvbgotLWltcHJvdmVkIG50b2hsbCxodG9ubGwgaW1wbGVtZW50YXRpb24KLQotRGFuIExpIDxkdG9AZGV2LmphdmEubmV0PgotLUphdmEgVGVzdFNlcnZlciBhbmQgVHV0b3JpYWwgRml4ZXMKLQotS2V2aW4gS28gPGtldmluLnMua29AZ21haWwuY29tPgotLUZpeCBmb3IgdW5uZWNlc3Nhcnkgc3RkOjpzdHJpbmcgY29weSBjb25zdHJ1Y3Rpb24gaW4gUHJvdG9jb2wvRXhjZXB0aW9uCi0KLVBhdWwgUXVlcm5hIDxwcXVlcm5hQGFwYWNoZS5vcmc+Ci0tQXV0b2NvbmYgZXJyb3IgbWVzc2FnZSBmaXggZm9yIGxpYmV2ZW50IGRldGVjdGlvbgotLWNsb2NrX2dldHRpbWUgaW1wbGVtZW50YXRpb24gZm9yIE9TWAotCi0tLS0tLS0tLS0tLS0tLS0tCi1SZWxlYXNlIDIwMDcwNDAxCi0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9ESVNDTEFJTUVSIGIvRElTQ0xBSU1FUgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3ZTdlYS4uMDAwMDAwMAotLS0gYS9ESVNDTEFJTUVSCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1BcGFjaGUgVGhyaWZ0IGlzIGFuIGVmZm9ydCB1bmRlcmdvaW5nIGluY3ViYXRpb24gYXQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpLCAKLXNwb25zb3JlZCBieSB0aGUgSW5jdWJhdG9yIFBNQy4gSW5jdWJhdGlvbiBpcyByZXF1aXJlZCBvZiBhbGwgbmV3bHkgYWNjZXB0ZWQgcHJvamVjdHMgCi11bnRpbCBhIGZ1cnRoZXIgcmV2aWV3IGluZGljYXRlcyB0aGF0IHRoZSBpbmZyYXN0cnVjdHVyZSwgY29tbXVuaWNhdGlvbnMsIGFuZCBkZWNpc2lvbiAKLW1ha2luZyBwcm9jZXNzIGhhdmUgc3RhYmlsaXplZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3VjY2Vzc2Z1bCBBU0YgcHJvamVjdHMuCi1XaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcyBub3QgbmVjZXNzYXJpbHkgYSByZWZsZWN0aW9uIG9mIHRoZSBjb21wbGV0ZW5lc3Mgb3Igc3RhYmlsaXR5IAotb2YgdGhlIGNvZGUsIGl0IGRvZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJvamVjdCBoYXMgeWV0IHRvIGJlIGZ1bGx5IGVuZG9yc2VkIGJ5IHRoZSBBU0YuCmRpZmYgLS1naXQgYS9MQU5HVUFHRVMubWQgYi9MQU5HVUFHRVMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhM2NmNQotLS0gL2Rldi9udWxsCisrKyBiL0xBTkdVQUdFUy5tZApAQCAtMCwwICsxLDM1NSBAQAorIyBBcGFjaGUgVGhyaWZ0IExhbmd1YWdlIFN1cHBvcnQgIworCitMYXN0IE1vZGlmaWVkOiAyMDE4LTEyLTE3CisKK0d1aWRhbmNlIEZvcjogMC4xMi4wIG9yIGxhdGVyCisKK1RocmlmdCBzdXBwb3J0cyBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcyBhbmQgaGFzIGFuIGltcHJlc3NpdmUgdGVzdCBzdWl0ZSB0aGF0IGV4ZXJjaXNlcyBtb3N0IG9mIHRoZSBsYW5ndWFnZXMsIHByb3RvY29scywgYW5kIHRyYW5zcG9ydHMgdGhhdCByZXByZXNlbnRzIGEgbWF0cml4IG9mIHRob3VzYW5kcyBvZiBwb3NzaWJsZSBjb21iaW5hdGlvbnMuICBFYWNoIGxhbmd1YWdlIHR5cGljYWxseSBoYXMgYSBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gYXMgd2VsbCBhcyBzdXBwb3J0IGxpYnJhcmllcyAtIHNvbWUgbWFuZGF0b3J5IGFuZCBzb21lIG9wdGlvbmFsLiAgQWxsIG9mIHRoaXMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYmVsb3cgdG8gaGVscCB5b3UgYXNzZXNzIHdoZXRoZXIgeW91IGNhbiB1c2UgQXBhY2hlIFRocmlmdCB3aXRoIHlvdXIgcHJvamVjdC4gIE9idmlvdXNseSB0aGlzIGlzIGEgY29tcGxleCBtYXRyaXggdG8gbWFpbnRhaW4gYW5kIG1heSBub3QgYmUgY29ycmVjdCBpbiBhbGwgY2FzZXMgLSBpZiB5b3Ugc3BvdCBhbiBlcnJvciBwbGVhc2UgaW5mb3JtIHRoZSBkZXZlbG9wZXJzIHVzaW5nIHRoZSBtYWlsaW5nIGxpc3QuCisKK0FwYWNoZSBUaHJpZnQgaGFzIGEgY2hvaWNlIG9mIHR3byBidWlsZCBzeXN0ZW1zLiAgVGhlIGBhdXRvY29uZmAgYnVpbGQgc3lzdGVtIGlzIHRoZSBtb3N0IGNvbXBsZXRlIGJ1aWxkIGFuZCBpcyB1c2VkIHRvIGJ1aWxkIGFsbCBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLiAgVGhlIGBjbWFrZWAgYnVpbGQgc3lzdGVtIGhhcyBiZWVuIGRlc2lnbmF0ZWQgYnkgdGhlIHByb2plY3QgdG8gcmVwbGFjZSBgYXV0b2NvbmZgIGhvd2V2ZXIgdGhpcyB0cmFuc2l0aW9uIHdpbGwgdGFrZSBxdWl0ZSBzb21lIHRpbWUgdG8gY29tcGxldGUuCisKK1RoZSBMYW5ndWFnZS9MaWJyYXJ5IExldmVscyBpbmRpY2F0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2ZXJzaW9ucyB0aGF0IGFyZSB1c2VkIGluIHRoZSBbY29udGludW91cyBpbnRlZ3JhdGlvbiBlbnZpcm9ubWVudHNdKGJ1aWxkL2RvY2tlci9SRUFETUUubWQpIChBcHB2ZXlvciwgVHJhdmlzKSBmb3IgQXBhY2hlIFRocmlmdC4gIE90aGVyIGxhbmd1YWdlIGxldmVscyBtYXkgYmUgc3VwcG9ydGVkIGZvciBlYWNoIGxhbmd1YWdlLCBob3dldmVyIHRlc3RlZCBsZXNzIHRob3JvdWdobHk7IGNoZWNrIHRoZSBSRUFETUUgZmlsZSBpbnNpZGUgZWFjaCBsaWIgZGlyZWN0b3J5IGZvciBhZGRpdGlvbmFsIGRldGFpbHMuICBOb3RlIHRoYXQgd2hpbGUgYSBsYW5ndWFnZSBtYXkgY29udGFpbiBzdXBwb3J0IGZvciBwcm90b2NvbHMsIHRyYW5zcG9ydHMsIGFuZCBzZXJ2ZXJzLCB0aGUgZXh0ZW50IHRvIHdoaWNoIGVhY2ggaXMgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgYnVpbGQgcHJvY2VzcyB2YXJpZXMuICBUaGUgZGVmaW5pdGl2ZSBpbnRlZ3JhdGlvbiB0ZXN0IGZvciB0aGUgcHJvamVjdCBpcyBjYWxsZWQgdGhlICJjcm9zcyIgdGVzdCB3aGljaCBleGVjdXRlcyBhIHRlc3QgbWF0cml4IHdpdGggY2xpZW50cyBhbmQgc2VydmVycyBjb21tdW5pY2F0aW5nIGFjcm9zcyBsYW5ndWFnZXMuCisKKzx0YWJsZSBzdHlsZT0iZm9udC1zaXplOiA2MCU7IHBhZGRpbmc6IDFweDsiPgorPHRoZWFkPgorPHRyPgorPHRoIHJvd3NwYW49Mj5MYW5ndWFnZTwvdGg+Cis8dGggcm93c3Bhbj0yIGFsaWduPWNlbnRlcj5TaW5jZTwvdGg+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5CdWlsZCBTeXN0ZW1zPC90aD4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkxhbmcvTGliIExldmVscyAoVGVzdGVkKTwvdGg+Cis8dGggY29sc3Bhbj02IGFsaWduPWNlbnRlcj5Mb3ctTGV2ZWwgVHJhbnNwb3J0czwvdGg+Cis8dGggY29sc3Bhbj0zIGFsaWduPWNlbnRlcj5UcmFuc3BvcnQgV3JhcHBlcnM8L3RoPgorPHRoIGNvbHNwYW49NCBhbGlnbj1jZW50ZXI+UHJvdG9jb2xzPC90aD4KKzx0aCBjb2xzcGFuPTUgYWxpZ249Y2VudGVyPlNlcnZlcnM8L3RoPgorPHRoIHJvd3NwYW49Mj5PcGVuIElzc3VlczwvdGg+Cis8L3RyPgorPHRyPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGg+YXV0b2NvbmY8L3RoPjx0aD5jbWFrZTwvdGg+Cis8IS0tIExhbmcvTGliIExldmVscyAtLS0tLS0tPjx0aD5NaW48L3RoPjx0aD5NYXg8L3RoPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGg+PGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5peF9kb21haW5fc29ja2V0Ij5Eb21haW48L2E+PC90aD48dGg+Jm5ic3A7RmlsZSZuYnNwOzwvdGg+PHRoPk1lbW9yeTwvdGg+PHRoPiZuYnNwO1BpcGUmbmJzcDs8L3RoPjx0aD5Tb2NrZXQ8L3RoPjx0aD4mbmJzcDtUTFMmbmJzcDs8L3RoPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGg+RnJhbWVkPC90aD48dGg+Jm5ic3A7aHR0cCZuYnNwOzwvdGg+PHRoPiZuYnNwO3psaWImbmJzcDs8L3RoPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQiPkJpbmFyeTwvYT48L3RoPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQiPkNvbXBhY3Q8L2E+PC90aD48dGg+Jm5ic3A7SlNPTiZuYnNwOzwvdGg+PHRoPk11bHRpcGxleDwvdGg+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0aD5Gb3JraW5nPC90aD48dGg+Tm9uYmxvY2tpbmc8L3RoPjx0aD5TaW1wbGU8L3RoPjx0aD5UaHJlYWRlZDwvdGg+PHRoPlRocmVhZFBvb2w8L3RoPgorPC90cj4KKzwvdGhlYWQ+Cis8dGJvZHk+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2FzMy9SRUFETUUubWQiPkFjdGlvblNjcmlwdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj5BY3Rpb25TY3JpcHQgMzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzNzIyIj5BY3Rpb25TY3JpcHQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NfZ2xpYi9SRUFETUUubWQiPkMgKGdsaWIpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjYuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi40OC4yPC90ZD48dGQ+Mi41Ni4wPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM4NTQiPkMgKGdsaWIpPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jcHAvUkVBRE1FLm1kIj5DKys8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+QysrOTg8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxMyI+QysrPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jc2hhcnAvUkVBRE1FLm1kIj5DIzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPi5ORVQmbmJzcDszLjUgLyBtb25vJm5ic3A7My4yLjguMDwvdGQ+PHRkPi5ORVQmbmJzcDs0LjYuMSAvIG1vbm8mbmJzcDs0LjYuMi43PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzNjIiPkMjICguTkVUKTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvY29jb2EvUkVBRE1FLm1kIj5Db2NvYTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzOTgiPkNvY29hPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jbC9SRUFETUUubWQiPkNvbW1vbiBMaXNwPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjEyLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPlNCQ0wgMS40LjU8L3RkPjx0ZD5TQkNMIDEuNC4xNTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtODIiPkNvbW1vbiBMaXNwPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9kL1JFQURNRS5tZCI+RGxhbmc8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOS4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjA3NS4xPC90ZD48dGQ+Mi4wODMuMjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE3OTA0Ij5EPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9kYXJ0L1JFQURNRS5tZCI+RGFydDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMC4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjIyLjE8L3RkPjx0ZD4xLjI0LjM8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMyODAwNiI+RGFydDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvZGVscGhpL1JFQURNRS5tZCI+RGVscGhpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjguMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MjAxMDwvdGQ+PHRkPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNjYwMSI+RGVscGhpPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9uZXRjb3JlL1JFQURNRS5tZCI+Lk5FVCBDb3JlPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjExLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMS40PC90ZD48dGQ+Mi4yLjEwMTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzMxMTc2Ij4uTkVUIENvcmU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2VybC9SRUFETUUubWQiPkVybGFuZzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjE4LjM8L3RkPjx0ZD4yMC4wLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjM5MCI+RXJsYW5nPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9nby9SRUFETUUubWQiPkdvPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjcuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS43LjY8L3RkPjx0ZD4xLjExLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNDMwNyI+R288L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2hzL1JFQURNRS5tZCI+SGFza2VsbDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC41LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjcuMTAuMzwvdGQ+PHRkPjguMC4yPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTI3MDQiPkhhc2tlbGw8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2hheGUvUkVBRE1FLm1kIj5IYXhlPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMzwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+My4yLjE8L3RkPjx0ZD4zLjQuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzI0MzQ3Ij5IYXhlPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9qYXZhL1JFQURNRS5tZCI+SmF2YSAoU0UpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS44LjBfMTUxPC90ZD48dGQ+MS44LjBfMTkxPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTQiPkphdmEgU0U8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2phdmFtZS9SRUFETUUubWQiPkphdmEgKE1FKTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC41LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM3NTkiPkphdmEgTUU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2pzL1JFQURNRS5tZCI+SmF2YXNjcmlwdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM0MTgiPkphdmFzY3JpcHQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2x1YS9SRUFETUUubWQiPkx1YTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC45LjI8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjUuMS41PC90ZD48dGQ+NS4yLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMyMjY1OSI+THVhPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9ub2RlanMvUkVBRE1FLm1kIj5ub2RlLmpzPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjYuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ni54PC90ZD48dGQ+OC54PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTQzMjAiPm5vZGUuanM8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL25vZGV0cy9SRUFETUUubWQiPm5vZGUudHM8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+My4xLjY8L3RkPjx0ZD48L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwcmVzb2x1dGlvbiUyMCUzRCUyMFVucmVzb2x2ZWQlMjBhbmQlMjBDb21wb25lbnQlMjBpbiUyMCglMjJUeXBlU2NyaXB0JTIwLSUyMExpYnJhcnklMjIpJTIwT1JERVIlMjBCWSUyMHByaW9yaXR5JTIwREVTQyUyQyUyMHVwZGF0ZWQlMjBERVNDIj5ub2RlLnRzPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9vY2FtbC9SRUFETUUubWQiPk9DYW1sPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPjQuMDQuMDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzNjYwIj5PQ2FtbDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcGVybC9SRUFETUUubWQiPlBlcmw8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD41LjIyLjE8L3RkPjx0ZD41LjI2LjE8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxMiI+UGVybDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcGhwL1JFQURNRS5tZCI+UEhQPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ny4wLjIyPC90ZD48dGQ+Ny4yLjEwPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTI0MzEiPlBIUDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcHkvUkVBRE1FLm1kIj5QeXRob248L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjcuMTIsIDMuNS4yPC90ZD48dGQ+Mi43LjE1cmMxLCAzLjYuNzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzE1Ij5QeXRob248L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3JiL1JFQURNRS5tZCI+UnVieTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMy4xcDExMjwvdGQ+PHRkPjIuNS4xcDU3PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTYiPlJ1Ynk8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3JzL1JFQURNRS5tZCI+UnVzdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMS4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjE3LjA8L3RkPjx0ZD4xLjMwLjA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMzMTQyMCI+UnVzdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvc3QvUkVBRE1FLm1kIj5TbWFsbHRhbGs8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+dW5rbm93bjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzODYxIj5TbWFsbHRhbGs8L2E+PC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPHRmb290PgorPHRyPgorPHRoIHJvd3NwYW49Mj5MYW5ndWFnZTwvdGg+Cis8dGggcm93c3Bhbj0yIGFsaWduPWNlbnRlcj5TaW5jZTwvdGg+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0aD5hdXRvY29uZjwvdGg+PHRoPmNtYWtlPC90aD4KKzwhLS0gTGFuZy9MaWIgTGV2ZWxzIC0tLS0tLS0+PHRoPk1pbjwvdGg+PHRoPk1heDwvdGg+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0aD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml4X2RvbWFpbl9zb2NrZXQiPkRvbWFpbjwvYT48L3RoPjwvdGg+PHRoPiZuYnNwO0ZpbGUmbmJzcDs8L3RoPjx0aD5NZW1vcnk8L3RoPjx0aD4mbmJzcDtQaXBlJm5ic3A7PC90aD48dGg+U29ja2V0PC90aD48dGg+Jm5ic3A7VExTJm5ic3A7PC90aD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRoPkZyYW1lZDwvdGg+PHRoPiZuYnNwO2h0dHAmbmJzcDs8L3RoPjx0aD4mbmJzcDt6bGliJm5ic3A7PC90aD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRoPjxhIGhyZWY9ImRvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kIj5CaW5hcnk8L2E+PC90aD48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kIj5Db21wYWN0PC9hPjwvdGg+PHRoPiZuYnNwO0pTT04mbmJzcDs8L3RoPjx0aD5NdWx0aXBsZXg8L3RoPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGg+Rm9ya2luZzwvdGg+PHRoPk5vbmJsb2NraW5nPC90aD48dGg+U2ltcGxlPC90aD48dGg+VGhyZWFkZWQ8L3RoPjx0aD5UaHJlYWRQb29sPC90aD4KKzx0aCByb3dzcGFuPTI+T3BlbiBJc3N1ZXM8L3RoPgorPC90cj4KKzx0cj4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkJ1aWxkIFN5c3RlbXM8L3RoPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+TGFuZy9MaWIgTGV2ZWxzIChUZXN0ZWQpPC90aD4KKzx0aCBjb2xzcGFuPTYgYWxpZ249Y2VudGVyPkxvdy1MZXZlbCBUcmFuc3BvcnRzPC90aD4KKzx0aCBjb2xzcGFuPTMgYWxpZ249Y2VudGVyPlRyYW5zcG9ydCBXcmFwcGVyczwvdGg+Cis8dGggY29sc3Bhbj00IGFsaWduPWNlbnRlcj5Qcm90b2NvbHM8L3RoPgorPHRoIGNvbHNwYW49NSBhbGlnbj1jZW50ZXI+U2VydmVyczwvdGg+Cis8L3RyPgorPC90Zm9vdD4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCA5MGI3MGMyLi4zYjZkN2Q3IDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTIxMCw4MiArMjEwLDEyIEBACiBjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6Ci0gIGxpYi9lcmwvYnVpbGQvYmVhbXZlcgotICBsaWIvZXJsL2J1aWxkL2J1aWxkdGFyZ2V0cy5tawotICBsaWIvZXJsL2J1aWxkL2NvbG9ycy5tawotICBsaWIvZXJsL2J1aWxkL2RvY3MubWsKLSAgbGliL2VybC9idWlsZC9taW1lLnR5cGVzCi0gIGxpYi9lcmwvYnVpbGQvb3RwLm1rCi0gIGxpYi9lcmwvYnVpbGQvb3RwX3N1YmRpci5tawotICBsaWIvZXJsL2J1aWxkL3Jhd190ZXN0Lm1rCi0gIGxpYi9lcmwvc3JjL01ha2VmaWxlCitQb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6CisKKyAgbGliL2VybC9zcmMvTWFrZWZpbGUuYW0KIAogUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KIAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZvbGxvd2luZyBmaWxlcyBjb250YWluIHNvbWUgcG9ydGlvbnMgb2YgY29kZSBjb250cmlidXRlZCB1bmRlcgotdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlIChzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQpLCBhbmQgcmVsaWNlbnNlZAotdW5kZXIgdGhlIEFwYWNoZSAyLjAgTGljZW5zZToKLQotICBjb21waWxlci9jcHAvTWFrZWZpbGUuYW0KLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL21haW4uY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKLSAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAotICBjb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKLSAgbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKLSAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgotICBsaWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCi0gIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKLSAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKLSAgbGliL3JiL2xpYi90aHJpZnQucmIKLSAgbGliL3N0L1JFQURNRQotICBsaWIvc3QvdGhyaWZ0LnN0Ci0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCi0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ci0gIHRlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgogCkBAIC0yOTYsMzYgKzIyNiwxNCBAQAogIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9yIHRoZSBjb21waWxlci9jcHAvc3JjL21kNS5bY2hdIGNvbXBvbmVudHM6CitGb3IgdGhlIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzOgogCiAvKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAganNvbl9wYXJzZS5qcworICAgIDIwMTUtMDUtMDIKKyAgICBQdWJsaWMgRG9tYWluLgorICAgIE5PIFdBUlJBTlRZIEVYUFJFU1NFRCBPUiBJTVBMSUVELiBVU0UgQVQgWU9VUiBPV04gUklTSy4KIAotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGxpYi9yYi9zZXR1cC5yYjogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2ksCi1saWIvb2NhbWwvT0NhbWxNYWtlZmlsZSBhbmQgbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlIGNvbXBvbmVudHM6Ci0gICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDcgIE1hcmt1cyBNb3R0bAotCi1MaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAyLjEKLShzZWUgZG9jL2xncGwtMi4xLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlKQorKi8KKyhCeSBEb3VnbGFzIENyb2NrZm9yZCA8ZG91Z2xhc0Bjcm9ja2ZvcmQuY29tPikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjk2NDhhMC4uNTExNDUyZAotLS0gYS9NYWtlZmlsZS5hbQorKysgYi9NYWtlZmlsZS5hbQpAQCAtMTksMTAgKzE5LDExNyBAQAogCiBBQ0xPQ0FMX0FNRkxBR1MgPSAtSSAuL2FjbG9jYWwKIAotU1VCRElSUyA9IGNvbXBpbGVyL2NwcCBsaWIgdGVzdAoraWYgV0lUSF9QTFVHSU4KKyMgVG8gZW5hYmxlIGJvb3RzdHJhcCwgYnVpbGQgb3JkZXIgaXMgbGliL2NwcCAtPiBjb21waWxlciAtPiBvdGhlcnMKK1NVQkRJUlMgPSBsaWIvY3BwIGNvbXBpbGVyL2NwcCBsaWIKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gbGliL2NwcC90ZXN0CitlbmRpZgorZWxzZQorU1VCRElSUyA9IGNvbXBpbGVyL2NwcCBsaWIKK2VuZGlmCisKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworaWYgV0lUSF9UVVRPUklBTAorU1VCRElSUyArPSB0dXRvcmlhbAorZW5kaWYKIAogZGlzdC1ob29rOgotCWZpbmQgJChkaXN0ZGlyKSAtbmFtZSAnLlthLXpBLVowLTldKicgfCB4YXJncyBybSAtcmYKKwlmaW5kICQoZGlzdGRpcikgLXR5cGUgZiBcKCAtaW5hbWUgIi5EU19TdG9yZSIgLW9yIC1pbmFtZSAiLl8qIiAtb3IgLWluYW1lICIuZ2l0aWdub3JlIiBcKSB8IHhhcmdzIHJtIC1yZgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiLmRlcHMiIC1vciAtaW5hbWUgIi5saWJzIiBcKSB8IHhhcmdzIHJtIC1yZgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiLnN2biIgLW9yIC1pbmFtZSAiLmdpdCIgXCkgfCB4YXJncyBybSAtcmYKIAotRVhUUkFfRElTVCA9IGJvb3RzdHJhcC5zaCBjbGVhbnVwLnNoIGRvYyB0dXRvcmlhbCBjb250cmliIFwKLSAgICAgICAgICAgICBDT05UUklCVVRPUlMgTElDRU5TRSBDSEFOR0VTIERJU0NMQUlNRVIgTk9USUNFCitwcmludC12ZXJzaW9uOgorCUBlY2hvICQoUEFDS0FHRV9WRVJTSU9OKQorCisuUEhPTlk6IHByZWNyb3NzIGNyb3NzCitwcmVjcm9zcy0lOiBhbGwKKwkkKE1BS0UpIC1DICQqIHByZWNyb3NzCitwcmVjcm9zczogYWxsIHByZWNyb3NzLXRlc3QgcHJlY3Jvc3MtbGliCisKK2VtcHR5IDo9CitzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQorY29tbWEgOj0gLAorCitDUk9TU19MQU5HUyA9IEBNQVlCRV9DUFBAIEBNQVlCRV9DX0dMSUJAIEBNQVlCRV9DTEAgQE1BWUJFX0RAIEBNQVlCRV9KQVZBQCBATUFZQkVfQ1NIQVJQQCBATUFZQkVfUFlUSE9OQCBATUFZQkVfUFkzQCBATUFZQkVfUlVCWUAgQE1BWUJFX0hBU0tFTExAIEBNQVlCRV9QRVJMQCBATUFZQkVfUEhQQCBATUFZQkVfR09AIEBNQVlCRV9OT0RFSlNAIEBNQVlCRV9EQVJUQCBATUFZQkVfRVJMQU5HQCBATUFZQkVfTFVBQCBATUFZQkVfUlNAIEBNQVlCRV9ET1RORVRDT1JFQCBATUFZQkVfTk9ERVRTQAorQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEID0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKENST1NTX0xBTkdTKSkKKworaWYgV0lUSF9QWTMKK0NST1NTX1BZPSQoUFlUSE9OMykKK2Vsc2UKK0NST1NTX1BZPSQoUFlUSE9OKQorZW5kaWYKKworaWYgV0lUSF9QWVRIT04KK2Nyb3NzZmVhdHVyZTogcHJlY3Jvc3MKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgLS1yZXRyeS1jb3VudCA1IC0tZmVhdHVyZXMgLiogLS1za2lwLWtub3duLWZhaWx1cmVzIC0tc2VydmVyICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKQorZWxzZQorIyBmZWF0dXJlIHRlc3QgbmVlZHMgcHl0aG9uIGJ1aWxkCitjcm9zc2ZlYXR1cmU6CitlbmRpZgorCitjcm9zcy0lOiBwcmVjcm9zcyBjcm9zc2ZlYXR1cmUKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgLS1yZXRyeS1jb3VudCA1IC0tc2tpcC1rbm93bi1mYWlsdXJlcyAtLXNlcnZlciAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkgLS1jbGllbnQgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpIC0tcmVnZXggIiQqIgorCitjcm9zczogY3Jvc3MtLioKKworVElNRVMgPSAxIDIgMworZmFpbDogcHJlY3Jvc3MKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgfHwgdHJ1ZQorCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1vdmVyd3JpdGUKKwkkKGZvcmVhY2ggdmFyLCQoVElNRVMpLHRlc3QvdGVzdC5weSAtcyB8fCB0cnVlO3Rlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1tZXJnZTspCisKK2NvZGVzcGVsbF9za2lwX2ZpbGVzID0gXAorCSouamFyIFwKKwkqLmNsYXNzIFwKKwkqLnNvIFwKKwkqLmEgXAorCSoubGEgXAorCSoubyBcCisJKi5wMTIgXAorCSpPQ2FtbE1ha2VmaWxlIFwKKwkua2V5c3RvcmUgXAorCS50cnVzdHN0b3JlIFwKKwlDSEFOR0VTIFwKKwljb25maWcuc3ViIFwKKwljb25maWd1cmUgXAorCWRlcGNvbXAgXAorCWxpYnRvb2wubTQgXAorCW91dHB1dC4qIFwKKwlyZWJhciBcCisJdGhyaWZ0CisKK3NraXBwZWRfZmlsZXMgPSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoY29kZXNwZWxsX3NraXBfZmlsZXMpKQorCitzdHlsZS1sb2NhbDoKKwljb2Rlc3BlbGwgLS13cml0ZS1jaGFuZ2VzIC0tc2tpcD0kKHNraXBwZWRfZmlsZXMpIC0tZGlzYWJsZS1jb2xvcnMKKworRVhUUkFfRElTVCA9IFwKKwkuY2xhbmctZm9ybWF0IFwKKwkuZWRpdG9yY29uZmlnIFwKKwkudHJhdmlzLnltbCBcCisJLnJ1c3RmbXQudG9tbCBcCisJLmRvY2tlcmlnbm9yZSBcCisJYXBwdmV5b3IueW1sIFwKKwlib3dlci5qc29uIFwKKwlidWlsZCBcCisJYm9vdHN0cmFwLnNoIFwKKwljbGVhbnVwLnNoIFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJY29tcG9zZXIuanNvbiBcCisJY29udHJpYiBcCisJQ09OVFJJQlVUSU5HLm1kIFwKKwlkZWJpYW4gXAorCWRvYyBcCisJZG9hcC5yZGYgXAorCXBhY2thZ2UuanNvbiBcCisJc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzIFwKKwlMQU5HVUFHRVMubWQgXAorCUxJQ0VOU0UgXAorCUNIQU5HRVMgXAorCU5PVElDRSBcCisJUkVBRE1FLm1kIFwKKwlUaHJpZnQucG9kc3BlYwpkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNjlmNjEuLjAwMDAwMDAKLS0tIGEvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLVJlbGVhc2UgTm90ZXMgZm9yIFRocmlmdCAyMDA4MDQxMQotCi0uZXF1YWxzIGFuZCAuaGFzaENvZGUoKSBmb3IgSmF2YSBzY3R1cmN0cyAoZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLUltcHJvdm1lbnRzIHRvIHRoZSBDKysgVFNvY2tldFBvb2wgKGRldmVsb3BlZCBieSBha2hpbCkuCi0KLVBIUCAoZGUpc2VyaWFsaXphdGlvbiBleHRlbnNpb24gKGRldmVsb3BlZCBieSBkd2VhdGhlcmZvcmQpLgotCi1BZGQgZmIzMDMgdG8gY29udHJpYiAoZGV2ZWxvcGVkIGJ5IEZhY2Vib29rKS4KLQotVEpTT05Qcm90b2NvbCBmb3IgQysrIGFuZCBKYXZhIChjb250cmlidXRlZCBieSBDaGFkIFdhbHRlcnMgb2YgUG93ZXJzZXQpLgotCi1TdXBwb3J0IGZvciAibWFrZSBjaGVjayIgYW5kIGJldHRlciB0ZXN0cyAoY29udHJpYnV0ZWQgYnkgTml0YXkpLgotCi1TbWFsbHRhbGsgc3VwcG9ydCAoY29udHJpYnV0ZWQgYnkgUGF0cmljayBDb2xsaXNvbikuCi0KLURhdmUgU2ltcHNvbiA8ZGF2ZUBwb3dlcnNldC5jb20+Ci1CZXR0ZXIgc3VwcG9ydCBmb3IgY29ubmVjdGlvbiB0cmFja2luZyBpbiB0aGUgQysrIHNlcnZlciAoY29udHJpYnV0ZWQgYnkKLURhdmUgU2ltcHNvbiBvZiBQb3dlcnNldCkuCi0KLVBlcmwgSHR0cENsaWVudCAoY29udHJpYnV0ZWQgYnkgSWdvciBBZmFuYXN5ZXYgb2YgRXZlcm5vdGUpLgotCi1DIyBzdXBwb3J0IChjb250cmlidXRlZCBieSBUb2RkIEJlcm1hbiBvZiBpbWVlbSkuCi0KLU1pbkdXIHBvcnQgb2YgdGhlIGNvbXBpbGVyIChjb250cmlidXRlZCBieSBUb2RkIEJlcm1hbiBvZiBpbWVlbSkuCi0KLVRvbnMgb2Ygc21hbGwgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMuCi0KLQotUmVsZWFzZSBOb3RlcyBmb3IgVGhyaWZ0IDIwMDcwOTE3Ci0KLVRCaW5hcnlQcm90b2NvbCBub3cgaW5jbHVkZXMgYSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbiBtZXNzYWdlZC4KLVRoaXMgaXMgYSBub24tYmFja3dhcmRzLWNvbXBhdGlibGUgY2hhbmdlLiAgUGxlYXNlIHNlZSB0aGUKLVRCaW5hcnlQcm90b2NvbCBjb25zdHJ1Y3RvciBmb3Igc3RyaWN0UmVhZF8gYW5kIHN0cmljdFdyaXRlXy4KLQotQWRkIGJpbmFyeSB0eXBlIHRvIHN1cHBvcnQgbm9uLXRleHQgInN0cmluZ3MiIGluIEphdmEuCi0KLVRTb2NrZXRQb29sIGZvciBDKysgKGRldmVsb3BlZCBieSBqc29iZWwpLgotCi1TeW50YXggaGlnaGxpZ2h0aW5nIGZvciB2aW0gYW5kIGVtYWNzIChkZXZlbG9wZWQgYnkgaHpoYW8gYW5kIG1hcnRpbikuCi0KLVBlcmwgc3VwcG9ydCAoY29udHJpYnV0ZWQgYnkgSmFrZSBMdWNpYW5pKS4KLQotRXJsYW5nIHN1cHBvcnQgKGRldmVsb3BlZCBieSBjcGlybykuCi0KLVJ1YnkgQVBJIG92ZXJoYXVsIChjb250cmlidXRlZCBieSBLZXZpbiBDbGFyayBvZiBQb3dlcnNldCkuCi0KLUlQdjYgc3VwcG9ydCBpbiBDKysgYW5kIFB5dGhvbiAoY29udHJpYnV0ZWQgYnkgUGF1bCBTYWFiIG9mIFBvd2Vyc2V0KS4KLQotUmVhZC9Xcml0ZSBsb2NrcyAoZGV2ZWxvcGVkIGJ5IGJveikuCi0KLU9DYW1sIHN1cHBvcnQgKGRldmVsb3BlZCBieSBpcHJvY3RvcikuCi0KLUh1bWFuLXJlYWRhYmxlIHN0cmluZ3MgZnJvbSBUaHJpZnQgc3RydWN0dXJlcyBpbiBDKysgKGRldmVsb3BlZCBieSBkcmVpc3MpLgotCi1IYXNrZWxsIHN1cHBvcnQgKGRldmVsb3BlZCBieSBpcHJvY3RvcikuCi0KLVN1cHBvcnQgZm9yIG9wdGlvbmFsIGZpZWxkcyBpbiBDKysgKGNvbnRyaWJ1dGVkIGJ5IEFuZHkgTHV0b21pcnNreSkuCi0KLVN1cHBvcnQgZm9yIG9wZXJhdG9yPT0gZm9yIFRocmlmdCBzdHJ1Y3R1cmVzIChjb250cmlidXRlZCBieSBBbmR5IEx1dG9taXJza3kpLgotCi1QeXRob24vQyBtb2R1bGUgZm9yIGZhc3QgKGRlKXNlcmlhbGl6YXRpb24gKGNvbnRyaWJ1dGVkIGJ5IEJlbiBNYXVyZXIpLgotCi1MaW1pdGVkIHJlZmxlY3Rpb24gZm9yIEMrKyBzZXJ2aWNlcyAoZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLVB5dGhvbiBsaWJyYXJ5IGluc3RhbGxhdGlvbiBkZWZhdWx0cyB0byAvdXNyLCBvdmVycmlkZSB3aXRoIFBZX1BSRUZJWC4KLQotU3VwcG9ydCBmb3IgSmF2YWJlYW4tc3R5bGUgSmF2YSBjbGFzc2VzIChjb250cmlidXRlZCBieSBEYXZlIEVuZ2JlcmcpLgotCi1URGVuc2VQcm90b2NvbCBmb3IgQysrIChleHBlcmltZW50YWwgd2F5IHRvIHNocmluayBzdHJ1Y3R1cmVzKQotKGRldmVsb3BlZCBieSBkcmVpc3MpLgotCi1Db2NvYS9PYmplY3RpdmUgQyBzdXBwb3J0IChjb250cmlidXRlZCBieSBBbmRyZXcgTWNHZWFjaGllKS4KLQotVGhyaWZ0IG5vdyBidWlsZHMgd2l0aG91dCBsaWJldmVudC4KLQotVFpsaWJUcmFuc3BvcnQgZm9yIEMrKyAoY29tcHJlc3Mgc2VyaWFsaXplZCBzdHJ1Y3R1cmVzKSAoZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLVRvbnMgb2Ygc21hbGwgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMuCmRpZmYgLS1naXQgYS9OT1RJQ0UgYi9OT1RJQ0UKaW5kZXggMWVjNjNkYy4uOTAyZGM4ZCAxMDA2NDQKLS0tIGEvTk9USUNFCisrKyBiL05PVElDRQpAQCAtMSw2ICsxLDUgQEAKIEFwYWNoZSBUaHJpZnQKLUNvcHlyaWdodCAyMDA4LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorQ29weXJpZ2h0IDIwMDYtMjAxNyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAKIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmOGFmNC4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotQXBhY2hlIFRocmlmdCAoYW4gQXBhY2hlIEluY3ViYXRvciBwcm9qZWN0KQotCi1MYXN0IE1vZGlmaWVkOiAyMDA5LUphbi0zMAotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1JbnRyb2R1Y3Rpb24KLT09PT09PT09PT09PQotCi1UaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbgotYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIFRocmlmdCBwcm92aWRlcyBjbGVhbgotYWJzdHJhY3Rpb25zIGZvciBkYXRhIHRyYW5zcG9ydCwgZGF0YSBzZXJpYWxpemF0aW9uLCBhbmQgYXBwbGljYXRpb24KLWxldmVsIHByb2Nlc3NpbmcuIFRoZSBjb2RlIGdlbmVyYXRpb24gc3lzdGVtIHRha2VzIGEgc2ltcGxlIGRlZmluaXRpb24KLWxhbmd1YWdlIGFzIGl0cyBpbnB1dCBhbmQgZ2VuZXJhdGVzIGNvZGUgYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcyB0aGF0Ci11c2VzIHRoZSBhYnN0cmFjdGVkIHN0YWNrIHRvIGJ1aWxkIGludGVyb3BlcmFibGUgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuCi0KLVRocmlmdCBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gc3VwcG9ydCBub24tYXRvbWljIHZlcnNpb24gY2hhbmdlcwotYWNyb3NzIGNsaWVudCBhbmQgc2VydmVyIGNvZGUuCi0KLUZvciBtb3JlIGRldGFpbHMgb24gVGhyaWZ0J3MgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiwgdGFrZSBhIGdhbmRlciBhdAotdGhlIFRocmlmdCB3aGl0ZXBhcGVyIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIG9yIGF0IHRoZSBSRUFETUUgZmlsZXMKLWluIHlvdXIgcGFydGljdWxhciBzdWJkaXJlY3Rvcnkgb2YgaW50ZXJlc3QuCi0KLUhlaXJhcmNoeQotPT09PT09PT09Ci0KLXRocmlmdC8KLQotICBjb21waWxlci8KLSAgICBDb250YWlucyB0aGUgVGhyaWZ0IGNvbXBpbGVyLCBpbXBsZW1lbnRlZCBpbiBDKysuCi0KLSAgbGliLwotICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgc29mdHdhcmUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiwgc3ViZGl2aWRlZCBieQotICAgIGxhbmd1YWdlIG9mIGltcGxlbWVudGF0aW9uLgotCi0gICAgY3BwLwotICAgIGphdmEvCi0gICAgcGhwLwotICAgIHB5LwotICAgIHJiLwotCi0gIHRlc3QvCi0KLSAgICBDb250YWlucyBzYW1wbGUgVGhyaWZ0IGZpbGVzIGFuZCB0ZXN0IGNvZGUgYWNyb3NzIHRoZSB0YXJnZXQgcHJvZ3JhbW1pbmcKLSAgICBsYW5ndWFnZXMuCi0KLSAgdHV0b3JpYWwvCi0KLSAgICBDb250YWlucyBhIGJhc2ljIHR1dG9yaWFsIHRoYXQgd2lsbCB0ZWFjaCB5b3UgaG93IHRvIGRldmVsb3Agc29mdHdhcmUKLSAgICB1c2luZyBUaHJpZnQuCi0KLVJlcXVpcmVtZW50cwotPT09PT09PT09PT09Ci0KLVNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRSZXF1aXJlbWVudHMgZm9yCi1hbiB1cC10by1kYXRlIGxpc3Qgb2YgYnVpbGQgcmVxdWlyZW1lbnRzLgotCi1SZXNvdXJjZXMKLT09PT09PT09PQotCi1Nb3JlIGluZm9ybWF0aW9uIGFib3V0IFRocmlmdCBjYW4gYmUgb2J0YWluZWQgb24gdGhlIFRocmlmdCB3ZWJwYWdlIGF0OgotCi0gICAgIGh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy90aHJpZnQKLQotQWNrbm93bGVkZ21lbnRzCi09PT09PT09PT09PT09PT0KLQotVGhyaWZ0IHdhcyBpbnNwaXJlZCBieSBwaWxsYXIsIGEgbGlnaHR3ZWlnaHQgUlBDIHRvb2wgd3JpdHRlbiBieSBBZGFtIEQnQW5nZWxvLAotYW5kIGFsc28gYnkgR29vZ2xlJ3MgcHJvdG9jb2wgYnVmZmVycy4KLQotSW5zdGFsbGF0aW9uCi09PT09PT09PT09PT0KLQotSWYgeW91IGFyZSBidWlsZGluZyBmcm9tIHRoZSBmaXJzdCB0aW1lIG91dCBvZiB0aGUgc291cmNlIHJlcG9zaXRvcnksIHlvdSB3aWxsCi1uZWVkIHRvIGdlbmVyYXRlIHRoZSBjb25maWd1cmUgc2NyaXB0cy4gIChUaGlzIGlzIG5vdCBuZWNlc3NhcnkgaWYgeW91Ci1kb3dubG9hZGVkIGEgdGFyYmFsbC4pICBGcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBkbzoKLQotCS4vYm9vdHN0cmFwLnNoCi0KLU9uY2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGFyZSBnZW5lcmF0ZWQsIHRocmlmdCBjYW4gYmUgY29uZmlndXJlZC4KLUZyb20gdGhlIHRvcCBkaXJlY3RvcnksIGRvOgotCi0JLi9jb25maWd1cmUKLQotWW91IG1heSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBib29zdCBmaWxlcyBleHBsaWNpdGx5LgotSWYgeW91IGluc3RhbGxlZCBib29zdCBpbiAvdXNyL2xvY2FsLCB5b3Ugd291bGQgcnVuIGNvbmZpZ3VyZSBhcyBmb2xsb3dzOgotCi0JLi9jb25maWd1cmUgLS13aXRoLWJvb3N0PS91c3IvbG9jYWwKLQotTm90ZSB0aGF0IGJ5IGRlZmF1bHQgdGhlIHRocmlmdCBDKysgbGlicmFyeSBpcyB0eXBpY2FsbHkgYnVpbHQgd2l0aCBkZWJ1Z2dpbmcKLXN5bWJvbHMgaW5jbHVkZWQuIElmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSB0aGVzZSBvcHRpb25zIHlvdSBzaG91bGQgdXNlIHRoZQotQ1hYRkxBR1Mgb3B0aW9uIGluIGNvbmZpZ3VyZSwgYXMgc3VjaDoKLQotICAgICAgICAuL2NvbmZpZ3VyZSBDWFhGTEFHUz0nLWcgLU8yJwotICAgICAgICAuL2NvbmZpZ3VyZSBDRkxBR1M9Jy1nIC1PMicKLSAgICAgICAgLi9jb25maWd1cmUgQ1BQRkxBR1M9Jy1EREVCVUdfTVlfRkVBVFVSRScKLQotUnVuIC4vY29uZmlndXJlIC0taGVscCB0byBzZWUgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zCi0KLVBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoZSBQeXRob24gbGlicmFyeSB3aWxsIGlnbm9yZSB0aGUgLS1wcmVmaXggb3B0aW9uCi1hbmQganVzdCBpbnN0YWxsIHdoZXJldmVyIFB5dGhvbidzIGRpc3R1dGlscyBwdXRzIGl0ICh1c3VhbGx5IGFsb25nCi10aGUgbGluZXMgb2YgL3Vzci9saWIvcHl0aG9uWC5ZL3NpdGUtcGFja2FnZXMvKS4gIElmIHlvdSBuZWVkIHRvIGNvbnRyb2wKLXdoZXJlIHRoZSBQeXRob24gbW9kdWxlcyBhcmUgaW5zdGFsbGVkLCBzZXQgdGhlIFBZX1BSRUZJWCB2YXJpYWJsZS4KLShERVNURElSIGlzIHJlc3BlY3RlZCBmb3IgUHl0aG9uIGFuZCBDKysuKQotCi1NYWtlIHRocmlmdDoKLQotCW1ha2UKLQotRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgYmVjb21lIHN1cGVydXNlciBhbmQgZG86Ci0KLQltYWtlIGluc3RhbGwKLQotTm90ZSB0aGF0IHNvbWUgbGFuZ3VhZ2UgcGFja2FnZXMgbXVzdCBiZSBpbnN0YWxsZWQgbWFudWFsbHkgdXNpbmcgYnVpbGQgdG9vbHMKLWJldHRlciBzdWl0ZWQgdG8gdGhvc2UgbGFuZ3VhZ2VzIChhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIHRoaXMgYXBwbGllcwotdG8gSmF2YSwgUnVieSwgUEhQKS4KLQotTG9vayBmb3IgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBsaWIvPGxhbmd1YWdlPi8gZm9sZGVyIGZvciBtb3JlIGRldGFpbHMgb24gdGhlCi1pbnN0YWxsYXRpb24gb2YgZWFjaCBsYW5ndWFnZSBsaWJyYXJ5IHBhY2thZ2UuCmRpZmYgLS1naXQgYS9SRUFETUUubWQgYi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5ZTZlMQotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS5tZApAQCAtMCwwICsxLDE5MiBAQAorQXBhY2hlIFRocmlmdAorPT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PQorCitUaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbgorYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBwb2ludC10by1wb2ludCBSUEMuIFRocmlmdCBwcm92aWRlcyAKK2NsZWFuIGFic3RyYWN0aW9ucyBmb3IgZGF0YSB0cmFuc3BvcnQsIGRhdGEgc2VyaWFsaXphdGlvbiwgYW5kIGFwcGxpY2F0aW9uCitsZXZlbCBwcm9jZXNzaW5nLiBUaGUgY29kZSBnZW5lcmF0aW9uIHN5c3RlbSB0YWtlcyBhIHNpbXBsZSBkZWZpbml0aW9uCitsYW5ndWFnZSBhcyBpbnB1dCBhbmQgZ2VuZXJhdGVzIGNvZGUgYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcyB0aGF0Cit1c2VzIHRoZSBhYnN0cmFjdGVkIHN0YWNrIHRvIGJ1aWxkIGludGVyb3BlcmFibGUgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuCisKKyFbQXBhY2hlIFRocmlmdCBMYXllcmVkIEFyY2hpdGVjdHVyZV0oZG9jL2ltYWdlcy90aHJpZnQtbGF5ZXJzLnBuZykKKworVGhyaWZ0IG1ha2VzIGl0IGVhc3kgZm9yIHByb2dyYW1zIHdyaXR0ZW4gaW4gZGlmZmVyZW50IHByb2dyYW1taW5nCitsYW5ndWFnZXMgdG8gc2hhcmUgZGF0YSBhbmQgY2FsbCByZW1vdGUgcHJvY2VkdXJlcy4gIFdpdGggc3VwcG9ydCAKK2ZvciBbMjUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzXShMQU5HVUFHRVMubWQpLCBjaGFuY2VzIGFyZSBUaHJpZnQgCitzdXBwb3J0cyB0aGUgbGFuZ3VhZ2VzIHRoYXQgeW91IGN1cnJlbnRseSB1c2UuCisKK1RocmlmdCBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gc3VwcG9ydCBub24tYXRvbWljIHZlcnNpb24gY2hhbmdlcworYWNyb3NzIGNsaWVudCBhbmQgc2VydmVyIGNvZGUuCisKK0ZvciBtb3JlIGRldGFpbHMgb24gVGhyaWZ0J3MgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiwgc2VlIHRoZSBUaHJpZnQKK3doaXRlcGFwZXIgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24sIG9yIGF0IHRoZSBSRUFETUUubWQgZmlsZQoraW4geW91ciBwYXJ0aWN1bGFyIHN1YmRpcmVjdG9yeSBvZiBpbnRlcmVzdC4KKworU3RhdHVzCis9PT09PT0KKworfCBCcmFuY2ggfCBUcmF2aXMgfCBBcHB2ZXlvciB8IENvdmVyaXR5IFNjYW4gfCBjb2RlY292LmlvIHwgV2Vic2l0ZSB8Cit8IDotLS0tLSB8IDotLS0tLSB8IDotLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0gfCA6LS0tLS0tIHwKK3wgW2BtYXN0ZXJgXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC90cmVlL21hc3RlcikgfCBbIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9hcGFjaGUvdGhyaWZ0LnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2FwYWNoZS90aHJpZnQpIHwgWyFbQnVpbGQgc3RhdHVzXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9hcGkvcHJvamVjdHMvc3RhdHVzL2dpdGh1Yi9hcGFjaGUvdGhyaWZ0P2JyYW5jaD1tYXN0ZXImc3ZnPXRydWUpXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L0FwYWNoZVNvZnR3YXJlRm91bmRhdGlvbi90aHJpZnQvaGlzdG9yeSkgfCBbIVtDb3Zlcml0eSBTY2FuIEJ1aWxkIFN0YXR1c10oaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9wcm9qZWN0cy8xMzQ1L2JhZGdlLnN2ZyldKGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vcHJvamVjdHMvdGhyaWZ0KSB8IHwgWyFbV2Vic2l0ZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9vZmZpY2lhbC13ZWJzaXRlLWJyaWdodGdyZWVuLnN2ZyldKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvKSB8CisKK1JlbGVhc2VzCis9PT09PT09PQorCitUaHJpZnQgZG9lcyBub3QgbWFpbnRhaW4gYSBzcGVjaWZpYyByZWxlYXNlIGNhbGVuZGFyIGF0IHRoaXMgdGltZS4gIAorCitXZSBzdHJpdmUgdG8gcmVsZWFzZSB0d2ljZSB5ZWFybHkuICBEb3dubG9hZCB0aGUgW2N1cnJlbnQgcmVsZWFzZV0oaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2Rvd25sb2FkKS4KKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworUHJvamVjdCBIaWVyYXJjaHkKKz09PT09PT09PT09PT09PT09CisKK3RocmlmdC8KKworICBjb21waWxlci8KKworICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgY29tcGlsZXIsIGltcGxlbWVudGVkIGluIEMrKy4KKworICBsaWIvCisKKyAgICBDb250YWlucyB0aGUgVGhyaWZ0IHNvZnR3YXJlIGxpYnJhcnkgaW1wbGVtZW50YXRpb24sIHN1YmRpdmlkZWQgYnkKKyAgICBsYW5ndWFnZSBvZiBpbXBsZW1lbnRhdGlvbi4KKworICAgIGNwcC8KKyAgICBnby8KKyAgICBqYXZhLworICAgIHBocC8KKyAgICBweS8KKyAgICByYi8KKyAgICAuLi4KKworICB0ZXN0LworCisgICAgQ29udGFpbnMgc2FtcGxlIFRocmlmdCBmaWxlcyBhbmQgdGVzdCBjb2RlIGFjcm9zcyB0aGUgdGFyZ2V0IHByb2dyYW1taW5nCisgICAgbGFuZ3VhZ2VzLgorCisgIHR1dG9yaWFsLworCisgICAgQ29udGFpbnMgYSBiYXNpYyB0dXRvcmlhbCB0aGF0IHdpbGwgdGVhY2ggeW91IGhvdyB0byBkZXZlbG9wIHNvZnR3YXJlCisgICAgdXNpbmcgVGhyaWZ0LgorCitEZXZlbG9wbWVudAorPT09PT09PT09PT0KKworVG8gYnVpbGQgdGhlIHNhbWUgd2F5IFRyYXZpcyBDSSBidWlsZHMgdGhlIHByb2plY3QgeW91IHNob3VsZCB1c2UgZG9ja2VyLgorV2UgaGF2ZSBbY29tcHJlaGVuc2l2ZSBidWlsZGluZyBpbnN0cnVjdGlvbnMgZm9yIGRvY2tlcl0oYnVpbGQvZG9ja2VyL1JFQURNRS5tZCkuCisKK1JlcXVpcmVtZW50cworPT09PT09PT09PT09CisKK1NlZSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG9jcy9pbnN0YWxsIGZvciBhIGxpc3Qgb2YgYnVpbGQgcmVxdWlyZW1lbnRzIChtYXkgYmUgc3RhbGUpLiAgQWx0ZXJuYXRpdmVseSBzZWUgdGhlIGRvY2tlciBidWlsZCBlbnZpcm9ubWVudHMgZm9yIGEgbGlzdCBvZiBwcmVyZXF1aXNpdGVzLgorCitSZXNvdXJjZXMKKz09PT09PT09PQorCitNb3JlIGluZm9ybWF0aW9uIGFib3V0IFRocmlmdCBjYW4gYmUgb2J0YWluZWQgb24gdGhlIFRocmlmdCB3ZWJwYWdlIGF0OgorCisgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitBY2tub3dsZWRnbWVudHMKKz09PT09PT09PT09PT09PQorCitUaHJpZnQgd2FzIGluc3BpcmVkIGJ5IHBpbGxhciwgYSBsaWdodHdlaWdodCBSUEMgdG9vbCB3cml0dGVuIGJ5IEFkYW0gRCdBbmdlbG8sCithbmQgYWxzbyBieSBHb29nbGUncyBwcm90b2NvbCBidWZmZXJzLgorCitJbnN0YWxsYXRpb24KKz09PT09PT09PT09PQorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gdGhlIGZpcnN0IHRpbWUgb3V0IG9mIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSwgeW91IHdpbGwKK25lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzLiAgKFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB5b3UKK2Rvd25sb2FkZWQgYSB0YXJiYWxsLikgIEZyb20gdGhlIHRvcCBkaXJlY3RvcnksIGRvOgorCisgICAgLi9ib290c3RyYXAuc2gKKworT25jZSB0aGUgY29uZmlndXJlIHNjcmlwdHMgYXJlIGdlbmVyYXRlZCwgdGhyaWZ0IGNhbiBiZSBjb25maWd1cmVkLgorRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86CisKKyAgICAuL2NvbmZpZ3VyZQorCitZb3UgbWF5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIGJvb3N0IGZpbGVzIGV4cGxpY2l0bHkuCitJZiB5b3UgaW5zdGFsbGVkIGJvb3N0IGluIC91c3IvbG9jYWwsIHlvdSB3b3VsZCBydW4gY29uZmlndXJlIGFzIGZvbGxvd3M6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbAorCitOb3RlIHRoYXQgYnkgZGVmYXVsdCB0aGUgdGhyaWZ0IEMrKyBsaWJyYXJ5IGlzIHR5cGljYWxseSBidWlsdCB3aXRoIGRlYnVnZ2luZworc3ltYm9scyBpbmNsdWRlZC4gSWYgeW91IHdhbnQgdG8gY3VzdG9taXplIHRoZXNlIG9wdGlvbnMgeW91IHNob3VsZCB1c2UgdGhlCitDWFhGTEFHUyBvcHRpb24gaW4gY29uZmlndXJlLCBhcyBzdWNoOgorCisgICAgLi9jb25maWd1cmUgQ1hYRkxBR1M9Jy1nIC1PMicKKyAgICAuL2NvbmZpZ3VyZSBDRkxBR1M9Jy1nIC1PMicKKyAgICAuL2NvbmZpZ3VyZSBDUFBGTEFHUz0nLURERUJVR19NWV9GRUFUVVJFJworCitUbyBlbmFibGUgZ2NvdiByZXF1aXJlZCBvcHRpb25zIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSBlbmFibGUgdGhlbToKKworICAgIC4vY29uZmlndXJlICAtLWVuYWJsZS1jb3ZlcmFnZQorCitSdW4gLi9jb25maWd1cmUgLS1oZWxwIHRvIHNlZSBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMKKworUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIFB5dGhvbiBsaWJyYXJ5IHdpbGwgaWdub3JlIHRoZSAtLXByZWZpeCBvcHRpb24KK2FuZCBqdXN0IGluc3RhbGwgd2hlcmV2ZXIgUHl0aG9uJ3MgZGlzdHV0aWxzIHB1dHMgaXQgKHVzdWFsbHkgYWxvbmcKK3RoZSBsaW5lcyBvZiAvdXNyL2xpYi9weXRob25YLlkvc2l0ZS1wYWNrYWdlcy8pLiAgSWYgeW91IG5lZWQgdG8gY29udHJvbAord2hlcmUgdGhlIFB5dGhvbiBtb2R1bGVzIGFyZSBpbnN0YWxsZWQsIHNldCB0aGUgUFlfUFJFRklYIHZhcmlhYmxlLgorKERFU1RESVIgaXMgcmVzcGVjdGVkIGZvciBQeXRob24gYW5kIEMrKy4pCisKK01ha2UgdGhyaWZ0OgorCisJbWFrZQorCitGcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBiZWNvbWUgc3VwZXJ1c2VyIGFuZCBkbzoKKworCW1ha2UgaW5zdGFsbAorCitOb3RlIHRoYXQgc29tZSBsYW5ndWFnZSBwYWNrYWdlcyBtdXN0IGJlIGluc3RhbGxlZCBtYW51YWxseSB1c2luZyBidWlsZCB0b29scworYmV0dGVyIHN1aXRlZCB0byB0aG9zZSBsYW5ndWFnZXMgKGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgdGhpcyBhcHBsaWVzCit0byBKYXZhLCBSdWJ5LCBQSFApLgorCitMb29rIGZvciB0aGUgUkVBRE1FLm1kIGZpbGUgaW4gdGhlIGxpYi88bGFuZ3VhZ2U+LyBmb2xkZXIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKK2luc3RhbGxhdGlvbiBvZiBlYWNoIGxhbmd1YWdlIGxpYnJhcnkgcGFja2FnZS4KKworVGVzdGluZworPT09PT09PQorCitUaGVyZSBhcmUgYSBsYXJnZSBudW1iZXIgb2YgY2xpZW50IGxpYnJhcnkgdGVzdHMgdGhhdCBjYW4gYWxsIGJlIHJ1bgorZnJvbSB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKworICAgICAgICAgIG1ha2UgLWsgY2hlY2sKKworVGhpcyB3aWxsIG1ha2UgYWxsIG9mIHRoZSBsaWJyYXJpZXMgKGFzIG5lY2Vzc2FyeSksIGFuZCBydW4gdGhyb3VnaAordGhlIHVuaXQgdGVzdHMgZGVmaW5lZCBpbiBlYWNoIG9mIHRoZSBjbGllbnQgbGlicmFyaWVzLiBJZiBhIHNpbmdsZQorbGFuZ3VhZ2UgZmFpbHMsIHRoZSBtYWtlIGNoZWNrIHdpbGwgY29udGludWUgb24gYW5kIHByb3ZpZGUgYSBzeW5vcHNpcworYXQgdGhlIGVuZC4KKworVG8gcnVuIHRoZSBjcm9zcy1sYW5ndWFnZSB0ZXN0IHN1aXRlLCBwbGVhc2UgcnVuOgorCisgICAgICAgICAgbWFrZSBjcm9zcworCitUaGlzIHdpbGwgcnVuIGEgc2V0IG9mIHRlc3RzIHRoYXQgdXNlIGRpZmZlcmVudCBsYW5ndWFnZSBjbGllbnRzIGFuZAorc2VydmVycy4KKworCmRpZmYgLS1naXQgYS9UaHJpZnQtc3dpZnQzLnBvZHNwZWMgYi9UaHJpZnQtc3dpZnQzLnBvZHNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2YzAwYgotLS0gL2Rldi9udWxsCisrKyBiL1RocmlmdC1zd2lmdDMucG9kc3BlYwpAQCAtMCwwICsxLDE2IEBACitQb2Q6OlNwZWMubmV3IGRvIHxzfAorICBzLm5hbWUgICAgICAgICAgPSAiVGhyaWZ0LXN3aWZ0MyIKKyAgcy52ZXJzaW9uICAgICAgID0gIjEuMC4wIgorICBzLnN1bW1hcnkgICAgICAgPSAiQXBhY2hlIFRocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuIGFzc29jaWF0ZWQgY29kZSBnZW5lcmF0aW9uIG1lY2hhbmlzbSBmb3IgUlBDLiIKKyAgcy5kZXNjcmlwdGlvbiAgID0gPDwtREVTQworVGhlIEFwYWNoZSBUaHJpZnQgc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc29mdHdhcmUgZnJhbWV3b3JrIGZvciBuZXR3b3JrZWQgc2VydmljZXMgZGV2ZWxvcG1lbnQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcy4KKyAgICAgICAgICAgICAgICAgICAgREVTQworICBzLmhvbWVwYWdlICAgICAgPSAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICBzLmxpY2Vuc2UgICAgICAgPSB7IDp0eXBlID0+ICdBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAnLCA6dXJsID0+ICdodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wJyB9CisgIHMuYXV0aG9yICAgICAgICA9IHsgIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyIgPT4gImRldkB0aHJpZnQuYXBhY2hlLm9yZyIgfQorICBzLmlvcy5kZXBsb3ltZW50X3RhcmdldCA9ICc5LjAnCisgIHMub3N4LmRlcGxveW1lbnRfdGFyZ2V0ID0gJzEwLjEwJworICBzLnJlcXVpcmVzX2FyYyAgPSB0cnVlCisgIHMuc291cmNlICAgICAgICA9IHsgOmdpdCA9PiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IiwgOnRhZyA9PiAidjEuMC4wIiB9CisgIHMuc291cmNlX2ZpbGVzICA9ICJsaWIvc3dpZnQvU291cmNlcy8qLnN3aWZ0IgorZW5kCmRpZmYgLS1naXQgYS9UaHJpZnQucG9kc3BlYyBiL1RocmlmdC5wb2RzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDZlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9UaHJpZnQucG9kc3BlYwpAQCAtMCwwICsxLDE4IEBACitQb2Q6OlNwZWMubmV3IGRvIHxzfAorICBzLm5hbWUgICAgICAgICAgPSAiVGhyaWZ0IgorICBzLnZlcnNpb24gICAgICAgPSAiMS4wLjAiCisgIHMuc3VtbWFyeSAgICAgICA9ICJBcGFjaGUgVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4gYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIgorICBzLmRlc2NyaXB0aW9uICAgPSA8PC1ERVNDCitUaGUgQXBhY2hlIFRocmlmdCBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIG5ldHdvcmtlZCBzZXJ2aWNlcyBkZXZlbG9wbWVudCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorICAgICAgICAgICAgICAgICAgICBERVNDCisgIHMuaG9tZXBhZ2UgICAgICA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCisgIHMubGljZW5zZSAgICAgICA9IHsgOnR5cGUgPT4gJ0FwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcsIDp1cmwgPT4gJ2h0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnIH0KKyAgcy5hdXRob3IgICAgICAgID0geyAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiA9PiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiB9CisgIHMucmVxdWlyZXNfYXJjICA9IHRydWUKKyAgcy5pb3MuZGVwbG95bWVudF90YXJnZXQgPSAnNy4wJworICBzLm9zeC5kZXBsb3ltZW50X3RhcmdldCA9ICcxMC44JworICBzLmlvcy5mcmFtZXdvcmsgPSAnQ0ZOZXR3b3JrJworICBzLm9zeC5mcmFtZXdvcmsgPSAnQ29yZVNlcnZpY2VzJworICBzLnNvdXJjZSAgICAgICAgPSB7IDpnaXQgPT4gImh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIsIDp0YWcgPT4gInYxLjAuMCIgfQorICBzLnNvdXJjZV9maWxlcyAgPSAnbGliL2NvY29hL3NyYy8qKi8qLntoLG0sc3dpZnR9JworZW5kCmRpZmYgLS1naXQgYS9hY2xvY2FsL2FjX3Byb2dfYmlzb24ubTQgYi9hY2xvY2FsL2FjX3Byb2dfYmlzb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxMTk4YgotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNApAQCAtMCwwICsxLDU0IEBACitkbmwKK2RubCBDaGVjayBCaXNvbiB2ZXJzaW9uCitkbmwgQUNfUFJPR19CSVNPTihbTUlOX1ZFUlNJT049Mi40XSkKK2RubAorZG5sIFdpbGwgZGVmaW5lIEJJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT04gaWYgQXV0b21ha2UgaXMgPCAxLjExCitkbmwgZm9yIHVzZSB3aXRoIC5oIGluY2x1ZGVzLgorZG5sCisKK0FDX0RFRlVOKFtBQ19QUk9HX0JJU09OXSwgWworaWYgdGVzdCAieCQxIiA9ICJ4IiA7IHRoZW4KKyAgYmlzb25fcmVxdWlyZWRfdmVyc2lvbj0iMi40IgorZWxzZQorICBiaXNvbl9yZXF1aXJlZF92ZXJzaW9uPSIkMSIKK2ZpCisKK0FDX0NIRUNLX1BST0coaGF2ZV9wcm9nX2Jpc29uLCBbYmlzb25dLCBbeWVzXSxbbm9dKQorCitBQ19ERUZJTkVfVU5RVU9URUQoW0JJU09OX1ZFUlNJT05dLCBbMC4wXSwgW0Jpc29uIHZlcnNpb24gaWYgYmlzb24gaXMgbm90IGF2YWlsYWJsZV0pCisKKyNEbyBub3QgdXNlICouaCBleHRlbnNpb24gZm9yIHBhcnNlciBoZWFkZXIgZmlsZXMsIHVzZSBuZXdlciAqLmhoCitiaXNvbl91c2VfcGFyc2VyX2hfZXh0ZW5zaW9uPWZhbHNlCisKK2lmIHRlc3QgIiRoYXZlX3Byb2dfYmlzb24iID0gInllcyIgOyB0aGVuCisgIEFDX01TR19DSEVDS0lORyhbZm9yIGJpc29uIHZlcnNpb24gPj0gJGJpc29uX3JlcXVpcmVkX3ZlcnNpb25dKQorICBiaXNvbl92ZXJzaW9uPWBiaXNvbiAtLXZlcnNpb24gfCBoZWFkIC1uIDEgfCBjdXQgJy1kICcgLWYgNGAKKyAgQUNfREVGSU5FX1VOUVVPVEVEKFtCSVNPTl9WRVJTSU9OXSwgWyRiaXNvbl92ZXJzaW9uXSwgW0RlZmluZXMgYmlzb24gdmVyc2lvbl0pCisgIGlmIHRlc3QgIiRiaXNvbl92ZXJzaW9uIiBcPCAiJGJpc29uX3JlcXVpcmVkX3ZlcnNpb24iIDsgdGhlbgorICAgIEJJU09OPToKKyAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgQUNfTVNHX0VSUk9SKFtCaXNvbiB2ZXJzaW9uICRiaXNvbl9yZXF1aXJlZF92ZXJzaW9uIG9yIGhpZ2hlciBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIV0pCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgIEJJU09OPWJpc29uCisgICAgQUNfU1VCU1QoQklTT04pCisKKyAgICAjVmVyaWZ5IGF1dG9tYWtlIHZlcnNpb24gMS4xMSBoZWFkZXJzIGZvciB5eSBmaWxlcyBhcmUgLmgsID4gMS4xMiB1c2VzIC5oaAorICAgIGF1dG9tYWtlX3ZlcnNpb249YGF1dG9tYWtlIC0tdmVyc2lvbiB8IGhlYWQgLW4gMSB8IGN1dCAnLWQgJyAtZiA0YAorICAgIEFDX0RFRklORV9VTlFVT1RFRChbQVVUT01BS0VfVkVSU0lPTl0sIFskYXV0b21ha2VfdmVyc2lvbl0sIFtEZWZpbmVzIGF1dG9tYWtlIHZlcnNpb25dKQorCisgICAgaWYgdGVzdCAiJGF1dG9tYWtlX3ZlcnNpb24iIFw8ICIxLjEyIiA7IHRoZW4KKyAgICAgICNVc2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlCisgICAgICBiaXNvbl91c2VfcGFyc2VyX2hfZXh0ZW5zaW9uPXRydWUKKyAgICAgIGVjaG8gIkF1dG9tYWtlIHZlcnNpb24gPCAxLjEyIgorICAgICAgQUNfREVGSU5FKFtCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OXSwgWzFdLCBbVXNlICouaCBleHRlbnNpb24gZm9yIHBhcnNlciBoZWFkZXIgZmlsZV0pCisgICAgZmkKKyAgZmkKK2Vsc2UKKyAgQklTT049OgorICBBQ19NU0dfUkVTVUxUKFtOT10pCitmaQorCitBTV9DT05ESVRJT05BTChbQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTl0sIFt0ZXN0IHgkYmlzb25fdXNlX3BhcnNlcl9oX2V4dGVuc2lvbiA9IHh0cnVlXSkKK0FDX1NVQlNUKEJJU09OKQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBiL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNAppbmRleCBlNTZiYjczLi5kNTQwMzk1IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQKKysrIGIvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00CkBAIC0xLDE3ICsxLDE5IEBACi0jIyMjIyBodHRwOi8vYXV0b2NvbmYtYXJjaGl2ZS5jcnlwLnRvL2F4X2Jvb3N0X2Jhc2UuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfYm9vc3RfYmFzZS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIwogIyBTWU5PUFNJUwogIwotIyAgIEFYX0JPT1NUX0JBU0UoW01JTklNVU0tVkVSU0lPTl0pCisjICAgQVhfQk9PU1RfQkFTRShbTUlOSU1VTS1WRVJTSU9OXSwgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKICMKICMgREVTQ1JJUFRJT04KICMKICMgICBUZXN0IGZvciB0aGUgQm9vc3QgQysrIGxpYnJhcmllcyBvZiBhIHBhcnRpY3VsYXIgdmVyc2lvbiAob3IgbmV3ZXIpCiAjCi0jICAgSWYgbm8gcGF0aCB0byB0aGUgaW5zdGFsbGVkIGJvb3N0IGxpYnJhcnkgaXMgZ2l2ZW4gdGhlIG1hY3JvCi0jICAgc2VhcmNocyB1bmRlciAvdXNyLCAvdXNyL2xvY2FsLCAvb3B0IGFuZCAvb3B0L2xvY2FsIGFuZCBldmFsdWF0ZXMKLSMgICB0aGUgJEJPT1NUX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuIEZ1cnRoZXIgZG9jdW1lbnRhdGlvbiBpcwotIyAgIGF2YWlsYWJsZSBhdCA8aHR0cDovL3JhbmRzcHJpbmdlci5kZS9ib29zdC9pbmRleC5odG1sPi4KKyMgICBJZiBubyBwYXRoIHRvIHRoZSBpbnN0YWxsZWQgYm9vc3QgbGlicmFyeSBpcyBnaXZlbiB0aGUgbWFjcm8gc2VhcmNocworIyAgIHVuZGVyIC91c3IsIC91c3IvbG9jYWwsIC9vcHQgYW5kIC9vcHQvbG9jYWwgYW5kIGV2YWx1YXRlcyB0aGUKKyMgICAkQk9PU1RfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRnVydGhlciBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhdAorIyAgIDxodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0L2luZGV4Lmh0bWw+LgogIwogIyAgIFRoaXMgbWFjcm8gY2FsbHM6CiAjCkBAIC0yMSwxNzggKzIzLDI3OSBAQAogIwogIyAgICAgSEFWRV9CT09TVAogIwotIyBMQVNUIE1PRElGSUNBVElPTgorIyBMSUNFTlNFCiAjCi0jICAgMjAwNy0wNy0yOAorIyAgIENvcHlyaWdodCAoYykgMjAwOCBUaG9tYXMgUG9yc2NoYmVyZyA8dGhvbWFzQHJhbmRzcHJpbmdlci5kZT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgUGV0ZXIgQWRvbHBocwogIwotIyBDT1BZTEVGVAotIwotIyAgIENvcHlyaWdodCAoYykgMjAwNyBUaG9tYXMgUG9yc2NoYmVyZyA8dGhvbWFzQHJhbmRzcHJpbmdlci5kZT4KLSMKLSMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQKLSMgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQKLSMgICB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgNDUKKworIyBleGFtcGxlIGJvb3N0IHByb2dyYW0gKG5lZWQgdG8gcGFzcyB2ZXJzaW9uKQorbTRfZGVmaW5lKFtfQVhfQk9PU1RfQkFTRV9QUk9HUkFNXSwKKyAgICAgICAgICBbQUNfTEFOR19QUk9HUkFNKFtbCisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CitdXSxbWworKHZvaWQpICgodm9pZClzaXplb2YoY2hhclsxIC0gMiohISgoQk9PU1RfVkVSU0lPTikgPCAoJDEpKV0pKTsKK11dKV0pCiAKIEFDX0RFRlVOKFtBWF9CT09TVF9CQVNFXSwKIFsKIEFDX0FSR19XSVRIKFtib29zdF0sCi0JQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdEA8OkA9RElSQDo+QF0sIFt1c2UgYm9vc3QgKGRlZmF1bHQgaXMgeWVzKSAtIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgdGhlIHJvb3QgZGlyZWN0b3J5IGZvciBib29zdCAob3B0aW9uYWwpXSksCi0JWwotICAgIGlmIHRlc3QgIiR3aXRodmFsIiA9ICJubyI7IHRoZW4KLQkJd2FudF9ib29zdD0ibm8iCi0gICAgZWxpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIjsgdGhlbgotICAgICAgICB3YW50X2Jvb3N0PSJ5ZXMiCi0gICAgICAgIGFjX2Jvb3N0X3BhdGg9IiIKLSAgICBlbHNlCi0JICAgIHdhbnRfYm9vc3Q9InllcyIKLSAgICAgICAgYWNfYm9vc3RfcGF0aD0iJHdpdGh2YWwiCi0JZmkKKyAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtYm9vc3RAPDpAPUFSR0A6PkBdLAorICAgIFt1c2UgQm9vc3QgbGlicmFyeSBmcm9tIGEgc3RhbmRhcmQgbG9jYXRpb24gKEFSRz15ZXMpLAorICAgICBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gKEFSRz08cGF0aD4pLAorICAgICBvciBkaXNhYmxlIGl0IChBUkc9bm8pCisgICAgIEA8OkBBUkc9eWVzQDo+QCBdKV0sCisgICAgWworICAgICBBU19DQVNFKFskd2l0aHZhbF0sCisgICAgICAgW25vXSxbd2FudF9ib29zdD0ibm8iO19BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGg9IiJdLAorICAgICAgIFt5ZXNdLFt3YW50X2Jvb3N0PSJ5ZXMiO19BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGg9IiJdLAorICAgICAgIFt3YW50X2Jvb3N0PSJ5ZXMiO19BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGg9IiR3aXRodmFsIl0pCiAgICAgXSwKICAgICBbd2FudF9ib29zdD0ieWVzIl0pCiAKLWlmIHRlc3QgIngkd2FudF9ib29zdCIgPSAieHllcyI7IHRoZW4KLQlib29zdF9saWJfdmVyc2lvbl9yZXE9aWZlbHNlKFskMV0sICwxLjIwLjAsJDEpCi0JYm9vc3RfbGliX3ZlcnNpb25fcmVxX3Nob3J0ZW49YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKLQlib29zdF9saWJfdmVyc2lvbl9yZXFfbWFqb3I9YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdcKFtbMC05XV0qXCknYAotCWJvb3N0X2xpYl92ZXJzaW9uX3JlcV9taW5vcj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1tbMC05XV0qXC5cKFtbMC05XV0qXCknYAotCWJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3I9YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdbWzAtOV1dKlwuW1swLTldXSpcLlwoW1swLTldXSpcKSdgCi0JaWYgdGVzdCAieCRib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yIiA9ICJ4IiA7IHRoZW4KLQkJYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vcj0iMCIKLSAgICAJZmkKLQlXQU5UX0JPT1NUX1ZFUlNJT049YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9tYWpvciBcKiAxMDAwMDAgXCsgICRib29zdF9saWJfdmVyc2lvbl9yZXFfbWlub3IgXCogMTAwIFwrICRib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yYAotCUFDX01TR19DSEVDS0lORyhmb3IgYm9vc3RsaWIgPj0gJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSkKLQlzdWNjZWVkZWQ9bm8KIAotCWRubCBmaXJzdCB3ZSBjaGVjayB0aGUgc3lzdGVtIGxvY2F0aW9uIGZvciBib29zdCBsaWJyYXJpZXMKLQlkbmwgdGhpcyBsb2NhdGlvbiBpc3QgY2hvc2VuIGlmIGJvb3N0IGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHdpdGggdGhlIC0tbGF5b3V0PXN5c3RlbSBvcHRpb24KLQlkbmwgb3IgaWYgeW91IGluc3RhbGwgYm9vc3Qgd2l0aCBSUE0KLQlpZiB0ZXN0ICIkYWNfYm9vc3RfcGF0aCIgIT0gIiI7IHRoZW4KLQkJQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfcGF0aC9saWIiCi0JCUJPT1NUX0NQUEZMQUdTPSItSSRhY19ib29zdF9wYXRoL2luY2x1ZGUiCi0JZWxzZQotCQlmb3IgYWNfYm9vc3RfcGF0aF90bXAgaW4gL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCA7IGRvCi0JCQlpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiOyB0aGVuCi0JCQkJQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfcGF0aF90bXAvbGliIgotCQkJCUJPT1NUX0NQUEZMQUdTPSItSSRhY19ib29zdF9wYXRoX3RtcC9pbmNsdWRlIgotCQkJCWJyZWFrOwotCQkJZmkKLQkJZG9uZQotCWZpCitBQ19BUkdfV0lUSChbYm9vc3QtbGliZGlyXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtYm9vc3QtbGliZGlyPUxJQl9ESVJdLAorICAgIFtGb3JjZSBnaXZlbiBkaXJlY3RvcnkgZm9yIGJvb3N0IGxpYnJhcmllcy4KKyAgICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVycmlkZSBsaWJyYXJ5IHBhdGggZGV0ZWN0aW9uLAorICAgICBzbyB1c2UgdGhpcyBwYXJhbWV0ZXIgb25seSBpZiBkZWZhdWx0IGxpYnJhcnkgZGV0ZWN0aW9uIGZhaWxzCisgICAgIGFuZCB5b3Uga25vdyBleGFjdGx5IHdoZXJlIHlvdXIgYm9vc3QgbGlicmFyaWVzIGFyZSBsb2NhdGVkLl0pXSwKKyAgWworICAgQVNfSUYoW3Rlc3QgLWQgIiR3aXRodmFsIl0sCisgICAgICAgICBbX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGg9IiR3aXRodmFsIl0sCisgICAgW0FDX01TR19FUlJPUihbLS13aXRoLWJvb3N0LWxpYmRpciBleHBlY3RlZCBkaXJlY3RvcnkgbmFtZV0pXSkKKyAgXSwKKyAgW19BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoPSIiXSkKIAotCUNQUEZMQUdTX1NBVkVEPSIkQ1BQRkxBR1MiCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCi0JZXhwb3J0IENQUEZMQUdTCitCT09TVF9MREZMQUdTPSIiCitCT09TVF9DUFBGTEFHUz0iIgorQVNfSUYoW3Rlc3QgIngkd2FudF9ib29zdCIgPSAieHllcyJdLAorICAgICAgW19BWF9CT09TVF9CQVNFX1JVTkRFVEVDVChbJDFdLFskMl0sWyQzXSldKQorQUNfU1VCU1QoQk9PU1RfQ1BQRkxBR1MpCitBQ19TVUJTVChCT09TVF9MREZMQUdTKQorXSkKIAotCUxERkxBR1NfU0FWRUQ9IiRMREZMQUdTIgotCUxERkxBR1M9IiRMREZMQUdTICRCT09TVF9MREZMQUdTIgotCWV4cG9ydCBMREZMQUdTCiAKLQlBQ19MQU5HX1BVU0goQysrKQotICAgICAJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotCUAlOkBpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLQldXSwgW1sKLQkjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0JLy8gRXZlcnl0aGluZyBpcyBva2F5Ci0JI2Vsc2UKLQkjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLQkjZW5kaWYKLQldXSldLFsKKyMgY29udmVydCBhIHZlcnNpb24gc3RyaW5nIGluICQyIHRvIG51bWVyaWMgYW5kIGFmZmVjdCB0byBwb2x5bW9ycGhpYyB2YXIgJDEKK0FDX0RFRlVOKFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OXSxbCisgIEFTX0lGKFt0ZXN0ICJ4JDIiID0gIngiXSxbX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXE9IjEuMjAuMCJdLFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcT0iJDIiXSkKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc2hvcnRlbj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdcKFtbMC05XV0qXCknYAorICBBU19JRihbdGVzdCAieCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9tYWpvciIgPSAieCJdLAorICAgICAgICBbQUNfTVNHX0VSUk9SKFtZb3Ugc2hvdWxkIGF0IGxlYXN0IHNwZWNpZnkgbGliYm9vc3QgbWFqb3IgdmVyc2lvbl0pXSkKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWlub3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1tbMC05XV0qXC5cKFtbMC05XV0qXCknYAorICBBU19JRihbdGVzdCAieCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vciIgPSAieCJdLAorICAgICAgICBbX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWlub3I9IjAiXSkKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdbWzAtOV1dKlwuW1swLTldXSpcLlwoW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJYJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3N1Yl9taW5vciIgPSAiWCJdLAorICAgICAgICBbX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yPSIwIl0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fUkVUPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9tYWpvciBcKiAxMDAwMDAgXCsgICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vciBcKiAxMDAgXCsgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3N1Yl9taW5vcmAKKyAgQVNfVkFSX1NFVCgkMSwkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9SRVQpCitdKQorCitkbmwgUnVuIHRoZSBkZXRlY3Rpb24gb2YgYm9vc3Qgc2hvdWxkIGJlIHJ1biBvbmx5IGlmICR3YW50X2Jvb3N0CitBQ19ERUZVTihbX0FYX0JPT1NUX0JBU0VfUlVOREVURUNUXSxbCisgICAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTihXQU5UX0JPT1NUX1ZFUlNJT04sWyQxXSkKKyAgICBzdWNjZWVkZWQ9bm8KKworCisgICAgQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorICAgIGRubCBPbiA2NC1iaXQgc3lzdGVtcyBjaGVjayBmb3Igc3lzdGVtIGxpYnJhcmllcyBpbiBib3RoIGxpYjY0IGFuZCBsaWIuCisgICAgZG5sIFRoZSBmb3JtZXIgaXMgc3BlY2lmaWVkIGJ5IEZIUywgYnV0IGUuZy4gRGViaWFuIGRvZXMgbm90IGFkaGVyZSB0bworICAgIGRubCB0aGlzIChhcyBpdCByaXNlcyBwcm9ibGVtcyBmb3IgZ2VuZXJpYyBtdWx0aS1hcmNoIHN1cHBvcnQpLgorICAgIGRubCBUaGUgbGFzdCBlbnRyeSBpbiB0aGUgbGlzdCBpcyBjaG9zZW4gYnkgZGVmYXVsdCB3aGVuIG5vIGxpYnJhcmllcworICAgIGRubCBhcmUgZm91bmQsIGUuZy4gd2hlbiBvbmx5IGhlYWRlci1vbmx5IGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIQorICAgIEFTX0NBU0UoWyR7aG9zdF9jcHV9XSwKKyAgICAgIFt4ODZfNjRdLFtsaWJzdWJkaXJzPSJsaWI2NCBsaWJ4MzIgbGliIGxpYjY0Il0sCisgICAgICBbcHBjNjR8cG93ZXJwYzY0fHMzOTB4fHNwYXJjNjR8YWFyY2g2NHxwcGM2NGxlfHBvd2VycGM2NGxlfHJpc2N2NjRdLFtsaWJzdWJkaXJzPSJsaWI2NCBsaWIgbGliNjQiXSwKKyAgICAgIFtsaWJzdWJkaXJzPSJsaWIiXQorICAgICkKKworICAgIGRubCBhbGxvdyBmb3IgcmVhbCBtdWx0aS1hcmNoIHBhdGhzIGUuZy4gL3Vzci9saWIveDg2XzY0LWxpbnV4LWdudS4gR2l2ZQorICAgIGRubCB0aGVtIHByaW9yaXR5IG92ZXIgdGhlIG90aGVyIHBhdGhzIHNpbmNlLCBpZiBsaWJzIGFyZSBmb3VuZCB0aGVyZSwgdGhleQorICAgIGRubCBhcmUgYWxtb3N0IGFzc3VyZWRseSB0aGUgb25lcyBkZXNpcmVkLgorICAgIEFTX0NBU0UoWyR7aG9zdF9jcHV9XSwKKyAgICAgIFtpPzg2XSxbbXVsdGlhcmNoX2xpYnN1YmRpcj0ibGliL2kzODYtJHtob3N0X29zfSJdLAorICAgICAgW211bHRpYXJjaF9saWJzdWJkaXI9ImxpYi8ke2hvc3RfY3B1fS0ke2hvc3Rfb3N9Il0KKyAgICApCisKKyAgICBkbmwgZmlyc3Qgd2UgY2hlY2sgdGhlIHN5c3RlbSBsb2NhdGlvbiBmb3IgYm9vc3QgbGlicmFyaWVzCisgICAgZG5sIHRoaXMgbG9jYXRpb24gaXN0IGNob3NlbiBpZiBib29zdCBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCB3aXRoIHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uCisgICAgZG5sIG9yIGlmIHlvdSBpbnN0YWxsIGJvb3N0IHdpdGggUlBNCisgICAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgIT0gIngiXSxbCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGJvb3N0bGliID49ICQxICgkV0FOVF9CT09TVF9WRVJTSU9OKSBpbmNsdWRlcyBpbiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSJdKQorICAgICAgICAgQVNfSUYoW3Rlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiXSxbCisgICAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiCisgICAgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCBpbiAkbXVsdGlhcmNoX2xpYnN1YmRpciAkbGlic3ViZGlyczsgZG8KKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTikgbGliIHBhdGggaW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCJdKQorICAgICAgICAgICAgICAgIEFTX0lGKFt0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCIgXSxbCisgICAgICAgICAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgXSwKKyAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSkKKyAgICAgICAgICAgZG9uZV0sWworICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICAgXSxbCisgICAgICAgIGlmIHRlc3QgWCIkY3Jvc3NfY29tcGlsaW5nIiA9IFh5ZXM7IHRoZW4KKyAgICAgICAgICAgIHNlYXJjaF9saWJzdWJkaXJzPSRtdWx0aWFyY2hfbGlic3ViZGlyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlYXJjaF9saWJzdWJkaXJzPSIkbXVsdGlhcmNoX2xpYnN1YmRpciAkbGlic3ViZGlycyIKKyAgICAgICAgZmkKKyAgICAgICAgZm9yIF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbworICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRzZWFyY2hfbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyIgorICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC9pbmNsdWRlIgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgIF0pCisKKyAgICBkbmwgb3ZlcndyaXRlIGxkIGZsYWdzIGlmIHdlIGhhdmUgcmVxdWlyZWQgc3BlY2lhbCBkaXJlY3Rvcnkgd2l0aAorICAgIGRubCAtLXdpdGgtYm9vc3QtbGliZGlyIHBhcmFtZXRlcgorICAgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiAhPSAieCJdLAorICAgICAgICAgIFtCT09TVF9MREZMQUdTPSItTCRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCJdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYm9vc3RsaWIgPj0gJDEgKCRXQU5UX0JPT1NUX1ZFUlNJT04pXSkKKyAgICBDUFBGTEFHU19TQVZFRD0iJENQUEZMQUdTIgorICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgorICAgIGV4cG9ydCBDUFBGTEFHUworCisgICAgTERGTEFHU19TQVZFRD0iJExERkxBR1MiCisgICAgTERGTEFHUz0iJExERkxBR1MgJEJPT1NUX0xERkxBR1MiCisgICAgZXhwb3J0IExERkxBR1MKKworICAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKKyAgICBBQ19MQU5HX1BVU0goQysrKQorICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTSgkV0FOVF9CT09TVF9WRVJTSU9OKV0sWwogICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKLQlzdWNjZWVkZWQ9eWVzCi0JZm91bmRfc3lzdGVtPXllcwotICAgICAgIAldLFsKLSAgICAgICAJXSkKLQlBQ19MQU5HX1BPUChbQysrXSkKKyAgICBzdWNjZWVkZWQ9eWVzCisgICAgZm91bmRfc3lzdGVtPXllcworICAgICAgICBdLFsKKyAgICAgICAgXSkKKyAgICBBQ19MQU5HX1BPUChbQysrXSkKIAogCiAKLQlkbmwgaWYgd2UgZm91bmQgbm8gYm9vc3Qgd2l0aCBzeXN0ZW0gbGF5b3V0IHdlIHNlYXJjaCBmb3IgYm9vc3QgbGlicmFyaWVzCi0JZG5sIGJ1aWx0IGFuZCBpbnN0YWxsZWQgd2l0aG91dCB0aGUgLS1sYXlvdXQ9c3lzdGVtIG9wdGlvbiBvciBmb3IgYSBzdGFnZWQobm90IGluc3RhbGxlZCkgdmVyc2lvbgotCWlmIHRlc3QgIngkc3VjY2VlZGVkIiAhPSAieHllcyI7IHRoZW4KLQkJX3ZlcnNpb249MAotCQlpZiB0ZXN0ICIkYWNfYm9vc3RfcGF0aCIgIT0gIiI7IHRoZW4KLSAgICAgICAgICAgICAgIAkJQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfcGF0aC9saWIiCi0JCQlpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGgiOyB0aGVuCi0JCQkJZm9yIGkgaW4gYGxzIC1kICRhY19ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCi0JCQkJCV92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkYWNfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKLQkJCQkJVl9DSEVDSz1gZXhwciAkX3ZlcnNpb25fdG1wIFw+ICRfdmVyc2lvbmAKLQkJCQkJaWYgdGVzdCAiJFZfQ0hFQ0siID0gIjEiIDsgdGhlbgotCQkJCQkJX3ZlcnNpb249JF92ZXJzaW9uX3RtcAotCQkJCQlmaQotCQkJCQlWRVJTSU9OX1VOREVSU0NPUkU9YGVjaG8gJF92ZXJzaW9uIHwgc2VkICdzL1wuL18vJ2AKLQkJCQkJQk9PU1RfQ1BQRkxBR1M9Ii1JJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0kVkVSU0lPTl9VTkRFUlNDT1JFIgotCQkJCWRvbmUKLQkJCWZpCi0JCWVsc2UKLQkJCWZvciBhY19ib29zdF9wYXRoIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbwotCQkJCWlmIHRlc3QgLWQgIiRhY19ib29zdF9wYXRoIiAmJiB0ZXN0IC1yICIkYWNfYm9vc3RfcGF0aCI7IHRoZW4KLQkJCQkJZm9yIGkgaW4gYGxzIC1kICRhY19ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCi0JCQkJCQlfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJGFjX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCi0JCQkJCQlWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAotCQkJCQkJaWYgdGVzdCAiJFZfQ0hFQ0siID0gIjEiIDsgdGhlbgotCQkJCQkJCV92ZXJzaW9uPSRfdmVyc2lvbl90bXAKLQkgICAgICAgICAgICAgICAJCQkJCWJlc3RfcGF0aD0kYWNfYm9vc3RfcGF0aAotCQkJCQkJZmkKLQkJCQkJZG9uZQotCQkJCWZpCi0JCQlkb25lCi0KLQkJCVZFUlNJT05fVU5ERVJTQ09SRT1gZWNobyAkX3ZlcnNpb24gfCBzZWQgJ3MvXC4vXy8nYAotCQkJQk9PU1RfQ1BQRkxBR1M9Ii1JJGJlc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCi0JCQlCT09TVF9MREZMQUdTPSItTCRiZXN0X3BhdGgvbGliIgotCi0JICAgIAkJaWYgdGVzdCAieCRCT09TVF9ST09UIiAhPSAieCI7IHRoZW4KLQkJCQlpZiB0ZXN0IC1kICIkQk9PU1RfUk9PVCIgJiYgdGVzdCAtciAiJEJPT1NUX1JPT1QiICYmIHRlc3QgLWQgIiRCT09TVF9ST09UL3N0YWdlL2xpYiIgJiYgdGVzdCAtciAiJEJPT1NUX1JPT1Qvc3RhZ2UvbGliIjsgdGhlbgotCQkJCQl2ZXJzaW9uX2Rpcj1gZXhwciAvLyRCT09TVF9ST09UIDogJy4qL1woLipcKSdgCi0JCQkJCXN0YWdlX3ZlcnNpb249YGVjaG8gJHZlcnNpb25fZGlyIHwgc2VkICdzL2Jvb3N0Xy8vJyB8IHNlZCAncy9fLy4vZydgCi0JCQkgICAgICAgIAlzdGFnZV92ZXJzaW9uX3Nob3J0ZW49YGV4cHIgJHN0YWdlX3ZlcnNpb24gOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCi0JCQkJCVZfQ0hFQ0s9YGV4cHIgJHN0YWdlX3ZlcnNpb25fc2hvcnRlbiBcPlw9ICRfdmVyc2lvbmAKLQkJCQkgICAgICAgIGlmIHRlc3QgIiRWX0NIRUNLIiA9ICIxIiA7IHRoZW4KLQkJCQkJCUFDX01TR19OT1RJQ0UoV2Ugd2lsbCB1c2UgYSBzdGFnZWQgYm9vc3QgbGlicmFyeSBmcm9tICRCT09TVF9ST09UKQotCQkJCQkJQk9PU1RfQ1BQRkxBR1M9Ii1JJEJPT1NUX1JPT1QiCi0JCQkJCQlCT09TVF9MREZMQUdTPSItTCRCT09TVF9ST09UL3N0YWdlL2xpYiIKLQkJCQkJZmkKLQkJCQlmaQotCSAgICAJCWZpCi0JCWZpCi0KLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCi0JCWV4cG9ydCBDUFBGTEFHUwotCQlMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKLQkJZXhwb3J0IExERkxBR1MKLQotCQlBQ19MQU5HX1BVU0goQysrKQotCSAgICAgCUFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKLQkJQCU6QGluY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgotCQldXSwgW1sKLQkJI2lmIEJPT1NUX1ZFUlNJT04gPj0gJFdBTlRfQk9PU1RfVkVSU0lPTgotCQkvLyBFdmVyeXRoaW5nIGlzIG9rYXkKLQkJI2Vsc2UKLQkJIyAgZXJyb3IgQm9vc3QgdmVyc2lvbiBpcyB0b28gb2xkCi0JCSNlbmRpZgotCQldXSldLFsKLSAgICAgICAgCUFDX01TR19SRVNVTFQoeWVzKQotCQlzdWNjZWVkZWQ9eWVzCi0JCWZvdW5kX3N5c3RlbT15ZXMKLSAgICAgICAJCV0sWwotCSAgICAgICAJXSkKLQkJQUNfTEFOR19QT1AoW0MrK10pCi0JZmkKLQotCWlmIHRlc3QgIiRzdWNjZWVkZWQiICE9ICJ5ZXMiIDsgdGhlbgotCQlpZiB0ZXN0ICIkX3ZlcnNpb24iID0gIjAiIDsgdGhlbgotCQkJQUNfTVNHX0VSUk9SKFtbV2UgY291bGQgbm90IGRldGVjdCB0aGUgYm9vc3QgbGlicmFyaWVzICh2ZXJzaW9uICRib29zdF9saWJfdmVyc2lvbl9yZXFfc2hvcnRlbiBvciBoaWdoZXIpLiBJZiB5b3UgaGF2ZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IChzdGlsbCBub3QgaW5zdGFsbGVkKSBwbGVhc2Ugc3BlY2lmeSBcJEJPT1NUX1JPT1QgaW4geW91ciBlbnZpcm9ubWVudCBhbmQgZG8gbm90IGdpdmUgYSBQQVRIIHRvIC0td2l0aC1ib29zdCBvcHRpb24uICBJZiB5b3UgYXJlIHN1cmUgeW91IGhhdmUgYm9vc3QgaW5zdGFsbGVkLCB0aGVuIGNoZWNrIHlvdXIgdmVyc2lvbiBudW1iZXIgbG9va2luZyBpbiA8Ym9vc3QvdmVyc2lvbi5ocHA+LiBTZWUgaHR0cDovL3JhbmRzcHJpbmdlci5kZS9ib29zdCBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLl1dKQotCQllbHNlCi0JCQlBQ19NU0dfTk9USUNFKFtZb3VyIGJvb3N0IGxpYnJhcmllcyBzZWVtcyB0byBvbGQgKHZlcnNpb24gJF92ZXJzaW9uKS5dKQotCQlmaQotCWVsc2UKLQkJQUNfU1VCU1QoQk9PU1RfQ1BQRkxBR1MpCi0JCUFDX1NVQlNUKEJPT1NUX0xERkxBR1MpCi0JCUFDX0RFRklORShIQVZFX0JPT1NULCxbZGVmaW5lIGlmIHRoZSBCb29zdCBsaWJyYXJ5IGlzIGF2YWlsYWJsZV0pCi0JZmkKLQorICAgIGRubCBpZiB3ZSBmb3VuZCBubyBib29zdCB3aXRoIHN5c3RlbSBsYXlvdXQgd2Ugc2VhcmNoIGZvciBib29zdCBsaWJyYXJpZXMKKyAgICBkbmwgYnVpbHQgYW5kIGluc3RhbGxlZCB3aXRob3V0IHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uIG9yIGZvciBhIHN0YWdlZChub3QgaW5zdGFsbGVkKSB2ZXJzaW9uCisgICAgaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIiA7IHRoZW4KICAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHU19TQVZFRCIKLSAgICAgICAJTERGTEFHUz0iJExERkxBR1NfU0FWRUQiCi1maQorICAgICAgICBMREZMQUdTPSIkTERGTEFHU19TQVZFRCIKKyAgICAgICAgQk9PU1RfQ1BQRkxBR1M9CisgICAgICAgIGlmIHRlc3QgLXogIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgOyB0aGVuCisgICAgICAgICAgICBCT09TVF9MREZMQUdTPQorICAgICAgICBmaQorICAgICAgICBfdmVyc2lvbj0wCisgICAgICAgIGlmIHRlc3QgLW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiBgbHMgLWQgJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KKyAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAorICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JFZfQ0hFQ0siID0gIngxIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uPSRfdmVyc2lvbl90bXAKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCisgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKKyAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgZG5sIGlmIG5vdGhpbmcgZm91bmQgc2VhcmNoIGZvciBsYXlvdXQgdXNlZCBpbiBXaW5kb3dzIGRpc3RyaWJ1dGlvbnMKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkQk9PU1RfQ1BQRkxBR1MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2Jvb3N0IiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9ib29zdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG5sIGlmIHdlIGZvdW5kIHNvbWV0aGluZyBhbmQgQk9PU1RfTERGTEFHUyB3YXMgdW5zZXQgYmVmb3JlCisgICAgICAgICAgICAgICAgZG5sIChiZWNhdXNlICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiID0gIiIpLCBzZXQgaXQgaGVyZS4KKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkQk9PU1RfQ1BQRkxBR1MiICYmIHRlc3QgLXogIiRCT09TVF9MREZMQUdTIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kbGlic3ViZGlyIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgIT0gInh5ZXMiIDsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbworICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRWX0NIRUNLIiA9ICJ4MSIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uPSRfdmVyc2lvbl90bXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9wYXRoPSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgICAgICBWRVJTSU9OX1VOREVSU0NPUkU9YGVjaG8gJF92ZXJzaW9uIHwgc2VkICdzL1wuL18vJ2AKKyAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYmVzdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkYmVzdF9wYXRoLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKKyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRiZXN0X3BhdGgvJGxpYnN1YmRpciIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEJPT1NUX1JPT1QiIDsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBsaWJzdWJkaXIgaW4gJGxpYnN1YmRpcnMgOyBkbworICAgICAgICAgICAgICAgICAgICBpZiBscyAiJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkQk9PU1RfUk9PVCIgJiYgdGVzdCAtciAiJEJPT1NUX1JPT1QiICYmIHRlc3QgLWQgIiRCT09TVF9ST09UL3N0YWdlLyRsaWJzdWJkaXIiICYmIHRlc3QgLXIgIiRCT09TVF9ST09UL3N0YWdlLyRsaWJzdWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fZGlyPWBleHByIC8vJEJPT1NUX1JPT1QgOiAnLiovXCguKlwpJ2AKKyAgICAgICAgICAgICAgICAgICAgc3RhZ2VfdmVyc2lvbj1gZWNobyAkdmVyc2lvbl9kaXIgfCBzZWQgJ3MvYm9vc3RfLy8nIHwgc2VkICdzL18vLi9nJ2AKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlX3ZlcnNpb25fc2hvcnRlbj1gZXhwciAkc3RhZ2VfdmVyc2lvbiA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKKyAgICAgICAgICAgICAgICAgICAgVl9DSEVDSz1gZXhwciAkc3RhZ2VfdmVyc2lvbl9zaG9ydGVuIFw+XD0gJF92ZXJzaW9uYAorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JFZfQ0hFQ0siID0gIngxIiAmJiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgQUNfTVNHX05PVElDRShXZSB3aWxsIHVzZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IGZyb20gJEJPT1NUX1JPT1QpCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkQk9PU1RfUk9PVCIKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKKyAgICAgICAgZXhwb3J0IENQUEZMQUdTCisgICAgICAgIExERkxBR1M9IiRMREZMQUdTICRCT09TVF9MREZMQUdTIgorICAgICAgICBleHBvcnQgTERGTEFHUworCisgICAgICAgIEFDX0xBTkdfUFVTSChDKyspCisgICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTSgkV0FOVF9CT09TVF9WRVJTSU9OKV0sWworICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgIHN1Y2NlZWRlZD15ZXMKKyAgICAgICAgZm91bmRfc3lzdGVtPXllcworICAgICAgICAgICAgXSxbCisgICAgICAgICAgICBdKQorICAgICAgICBBQ19MQU5HX1BPUChbQysrXSkKKyAgICBmaQorCisgICAgaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIiA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieCRfdmVyc2lvbiIgPSAieDAiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX05PVElDRShbW1dlIGNvdWxkIG5vdCBkZXRlY3QgdGhlIGJvb3N0IGxpYnJhcmllcyAodmVyc2lvbiAkMSBvciBoaWdoZXIpLiBJZiB5b3UgaGF2ZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IChzdGlsbCBub3QgaW5zdGFsbGVkKSBwbGVhc2Ugc3BlY2lmeSBcJEJPT1NUX1JPT1QgaW4geW91ciBlbnZpcm9ubWVudCBhbmQgZG8gbm90IGdpdmUgYSBQQVRIIHRvIC0td2l0aC1ib29zdCBvcHRpb24uICBJZiB5b3UgYXJlIHN1cmUgeW91IGhhdmUgYm9vc3QgaW5zdGFsbGVkLCB0aGVuIGNoZWNrIHlvdXIgdmVyc2lvbiBudW1iZXIgbG9va2luZyBpbiA8Ym9vc3QvdmVyc2lvbi5ocHA+LiBTZWUgaHR0cDovL3JhbmRzcHJpbmdlci5kZS9ib29zdCBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLl1dKQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFtZb3VyIGJvb3N0IGxpYnJhcmllcyBzZWVtcyB0byBvbGQgKHZlcnNpb24gJF92ZXJzaW9uKS5dKQorICAgICAgICBmaQorICAgICAgICAjIGV4ZWN1dGUgQUNUSU9OLUlGLU5PVC1GT1VORCAoaWYgcHJlc2VudCk6CisgICAgICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCisgICAgZWxzZQorICAgICAgICBBQ19ERUZJTkUoSEFWRV9CT09TVCwsW2RlZmluZSBpZiB0aGUgQm9vc3QgbGlicmFyeSBpcyBhdmFpbGFibGVdKQorICAgICAgICAjIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EIChpZiBwcmVzZW50KToKKyAgICAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKKyAgICBmaQorCisgICAgQ1BQRkxBR1M9IiRDUFBGTEFHU19TQVZFRCIKKyAgICBMREZMQUdTPSIkTERGTEFHU19TQVZFRCIKIAogXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNCBiL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGU0OGNiCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00CkBAIC0wLDAgKzEsMTI0IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NoZWNrX29wZW5zc2wuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DSEVDS19PUEVOU1NMKFthY3Rpb24taWYtZm91bmRbLCBhY3Rpb24taWYtbm90LWZvdW5kXV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgTG9vayBmb3IgT3BlblNTTCBpbiBhIG51bWJlciBvZiBkZWZhdWx0IHNwb3RzLCBvciBpbiBhIHVzZXItc2VsZWN0ZWQKKyMgICBzcG90ICh2aWEgLS13aXRoLW9wZW5zc2wpLiAgU2V0cworIworIyAgICAgT1BFTlNTTF9JTkNMVURFUyB0byB0aGUgaW5jbHVkZSBkaXJlY3RpdmVzIHJlcXVpcmVkCisjICAgICBPUEVOU1NMX0xJQlMgdG8gdGhlIC1sIGRpcmVjdGl2ZXMgcmVxdWlyZWQKKyMgICAgIE9QRU5TU0xfTERGTEFHUyB0byB0aGUgLUwgb3IgLVIgZmxhZ3MgcmVxdWlyZWQKKyMKKyMgICBhbmQgY2FsbHMgQUNUSU9OLUlGLUZPVU5EIG9yIEFDVElPTi1JRi1OT1QtRk9VTkQgYXBwcm9wcmlhdGVseQorIworIyAgIFRoaXMgbWFjcm8gc2V0cyBPUEVOU1NMX0lOQ0xVREVTIHN1Y2ggdGhhdCBzb3VyY2UgZmlsZXMgc2hvdWxkIHVzZSB0aGUKKyMgICBvcGVuc3NsLyBkaXJlY3RvcnkgaW4gaW5jbHVkZSBkaXJlY3RpdmVzOgorIworIyAgICAgI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA5LDIwMTAgWm1hbmRhIEluYy4gPGh0dHA6Ly93d3cuem1hbmRhLmNvbS8+CisjICAgQ29weXJpZ2h0IChjKSAyMDA5LDIwMTAgRHVzdGluIEouIE1pdGNoZWxsIDxkdXN0aW5Aem1hbmRhLmNvbT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTAKKworQVVfQUxJQVMoW0NIRUNLX1NTTF0sIFtBWF9DSEVDS19PUEVOU1NMXSkKK0FDX0RFRlVOKFtBWF9DSEVDS19PUEVOU1NMXSwgWworICAgIGZvdW5kPWZhbHNlCisgICAgQUNfQVJHX1dJVEgoW29wZW5zc2xdLAorICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1vcGVuc3NsPURJUl0sCisgICAgICAgICAgICBbcm9vdCBvZiB0aGUgT3BlblNTTCBkaXJlY3RvcnldKV0sCisgICAgICAgIFsKKyAgICAgICAgICAgIGNhc2UgIiR3aXRodmFsIiBpbgorICAgICAgICAgICAgIiIgfCB5IHwgeWUgfCB5ZXMgfCBuIHwgbm8pCisgICAgICAgICAgICBBQ19NU0dfRVJST1IoW0ludmFsaWQgLS13aXRoLW9wZW5zc2wgdmFsdWVdKQorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikgc3NsZGlycz0iJHdpdGh2YWwiCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgIF0sIFsKKyAgICAgICAgICAgICMgaWYgcGtnLWNvbmZpZyBpcyBpbnN0YWxsZWQgYW5kIG9wZW5zc2wgaGFzIGluc3RhbGxlZCBhIC5wYyBmaWxlLAorICAgICAgICAgICAgIyB0aGVuIHVzZSB0aGF0IGluZm9ybWF0aW9uIGFuZCBkb24ndCBzZWFyY2ggc3NsZGlycworICAgICAgICAgICAgQUNfQ0hFQ0tfVE9PTChbUEtHX0NPTkZJR10sIFtwa2ctY29uZmlnXSkKKyAgICAgICAgICAgIGlmIHRlc3QgeCIkUEtHX0NPTkZJRyIgIT0geCIiOyB0aGVuCisgICAgICAgICAgICAgICAgT1BFTlNTTF9MREZMQUdTPWAkUEtHX0NPTkZJRyBvcGVuc3NsIC0tbGlicy1vbmx5LUwgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgaWYgdGVzdCAkPyA9IDA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9MSUJTPWAkUEtHX0NPTkZJRyBvcGVuc3NsIC0tbGlicy1vbmx5LWwgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIE9QRU5TU0xfSU5DTFVERVM9YCRQS0dfQ09ORklHIG9wZW5zc2wgLS1jZmxhZ3Mtb25seS1JIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBmb3VuZD10cnVlCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICMgbm8gc3VjaCBsdWNrOyB1c2Ugc29tZSBkZWZhdWx0IHNzbGRpcnMKKyAgICAgICAgICAgIGlmICEgJGZvdW5kOyB0aGVuCisgICAgICAgICAgICAgICAgc3NsZGlycz0iL3Vzci9sb2NhbC9zc2wgL3Vzci9saWIvc3NsIC91c3Ivc3NsIC91c3IvcGtnIC91c3IvbG9jYWwgL3VzciIKKyAgICAgICAgICAgIGZpCisgICAgICAgIF0KKyAgICAgICAgKQorCisKKyAgICAjIG5vdGUgdGhhdCB3ZSAjaW5jbHVkZSA8b3BlbnNzbC9mb28uaD4sIHNvIHRoZSBPcGVuU1NMIGhlYWRlcnMgaGF2ZSB0byBiZSBpbgorICAgICMgYW4gJ29wZW5zc2wnIHN1YmRpcmVjdG9yeQorCisgICAgaWYgISAkZm91bmQ7IHRoZW4KKyAgICAgICAgT1BFTlNTTF9JTkNMVURFUz0KKyAgICAgICAgZm9yIHNzbGRpciBpbiAkc3NsZGlyczsgZG8KKyAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIG9wZW5zc2wvc3NsLmggaW4gJHNzbGRpcl0pCisgICAgICAgICAgICBpZiB0ZXN0IC1mICIkc3NsZGlyL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCI7IHRoZW4KKyAgICAgICAgICAgICAgICBPUEVOU1NMX0lOQ0xVREVTPSItSSRzc2xkaXIvaW5jbHVkZSIKKyAgICAgICAgICAgICAgICBPUEVOU1NMX0xERkxBR1M9Ii1MJHNzbGRpci9saWIiCisgICAgICAgICAgICAgICAgT1BFTlNTTF9MSUJTPSItbHNzbCAtbGNyeXB0byIKKyAgICAgICAgICAgICAgICBmb3VuZD10cnVlCisgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKworICAgICAgICAjIGlmIHRoZSBmaWxlIHdhc24ndCBmb3VuZCwgd2VsbCwgZ28gYWhlYWQgYW5kIHRyeSB0aGUgbGluayBhbnl3YXkgLS0gbWF5YmUKKyAgICAgICAgIyBpdCB3aWxsIGp1c3Qgd29yayEKKyAgICBmaQorCisgICAgIyB0cnkgdGhlIHByZXByb2Nlc3NvciBhbmQgbGlua2VyIHdpdGggb3VyIG5ldyBmbGFncywKKyAgICAjIGJlaW5nIGNhcmVmdWwgbm90IHRvIHBvbGx1dGUgdGhlIGdsb2JhbCBMSUJTLCBMREZMQUdTLCBhbmQgQ1BQRkxBR1MKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBjb21waWxpbmcgYW5kIGxpbmtpbmcgYWdhaW5zdCBPcGVuU1NMIHdvcmtzXSkKKyAgICBlY2hvICJUcnlpbmcgbGluayB3aXRoIE9QRU5TU0xfTERGTEFHUz0kT1BFTlNTTF9MREZMQUdTOyIgXAorICAgICAgICAiT1BFTlNTTF9MSUJTPSRPUEVOU1NMX0xJQlM7IE9QRU5TU0xfSU5DTFVERVM9JE9QRU5TU0xfSU5DTFVERVMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKworICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICBzYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgTERGTEFHUz0iJExERkxBR1MgJE9QRU5TU0xfTERGTEFHUyIKKyAgICBMSUJTPSIkT1BFTlNTTF9MSUJTICRMSUJTIgorICAgIENQUEZMQUdTPSIkT1BFTlNTTF9JTkNMVURFUyAkQ1BQRkxBR1MiCisgICAgQUNfTElOS19JRkVMU0UoCisgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPl0sIFtTU0xfbmV3KE5VTEwpXSldLAorICAgICAgICBbCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgJDEKKyAgICAgICAgXSwgWworICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgJDIKKyAgICAgICAgXSkKKyAgICBDUFBGTEFHUz0iJHNhdmVfQ1BQRkxBR1MiCisgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICBMSUJTPSIkc2F2ZV9MSUJTIgorCisgICAgQUNfU1VCU1QoW09QRU5TU0xfSU5DTFVERVNdKQorICAgIEFDX1NVQlNUKFtPUEVOU1NMX0xJQlNdKQorICAgIEFDX1NVQlNUKFtPUEVOU1NMX0xERkxBR1NdKQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY29tcGFyZV92ZXJzaW9uLm00IGIvYWNsb2NhbC9heF9jb21wYXJlX3ZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4ZTIwOAotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfY29tcGFyZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsMTc3IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY29tcGFyZV92ZXJzaW9uLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ09NUEFSRV9WRVJTSU9OKFZFUlNJT05fQSwgT1AsIFZFUlNJT05fQiwgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgVGhpcyBtYWNybyBjb21wYXJlcyB0d28gdmVyc2lvbiBzdHJpbmdzLiBEdWUgdG8gdGhlIHZhcmlvdXMgbnVtYmVyIG9mCisjICAgbWlub3ItdmVyc2lvbiBudW1iZXJzIHRoYXQgY2FuIGV4aXN0LCBhbmQgdGhlIGZhY3QgdGhhdCBzdHJpbmcKKyMgICBjb21wYXJpc29ucyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBudW1lcmljIGNvbXBhcmlzb25zLCB0aGlzIGlzIG5vdAorIyAgIG5lY2Vzc2FyaWx5IHRyaXZpYWwgdG8gZG8gaW4gYSBhdXRvY29uZiBzY3JpcHQuIFRoaXMgbWFjcm8gbWFrZXMgZG9pbmcKKyMgICB0aGVzZSBjb21wYXJpc29ucyBlYXN5LgorIworIyAgIFRoZSBzaXggYmFzaWMgY29tcGFyaXNvbnMgYXJlIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyBjaGVja2luZyBlcXVhbGl0eQorIyAgIGxpbWl0ZWQgdG8gYSBjZXJ0YWluIG51bWJlciBvZiBtaW5vci12ZXJzaW9uIGxldmVscy4KKyMKKyMgICBUaGUgb3BlcmF0b3IgT1AgZGV0ZXJtaW5lcyB3aGF0IHR5cGUgb2YgY29tcGFyaXNvbiB0byBkbywgYW5kIGNhbiBiZSBvbmUKKyMgICBvZjoKKyMKKyMgICAgZXEgIC0gZXF1YWwgKHRlc3QgQSA9PSBCKQorIyAgICBuZSAgLSBub3QgZXF1YWwgKHRlc3QgQSAhPSBCKQorIyAgICBsZSAgLSBsZXNzIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA8PSBCKQorIyAgICBnZSAgLSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA+PSBCKQorIyAgICBsdCAgLSBsZXNzIHRoYW4gKHRlc3QgQSA8IEIpCisjICAgIGd0ICAtIGdyZWF0ZXIgdGhhbiAodGVzdCBBID4gQikKKyMKKyMgICBBZGRpdGlvbmFsbHksIHRoZSBlcSBhbmQgbmUgb3BlcmF0b3IgY2FuIGhhdmUgYSBudW1iZXIgYWZ0ZXIgaXQgdG8gbGltaXQKKyMgICB0aGUgdGVzdCB0byB0aGF0IG51bWJlciBvZiBtaW5vciB2ZXJzaW9ucy4KKyMKKyMgICAgZXEwIC0gZXF1YWwgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uCisjICAgIG5lMCAtIG5vdCBlcXVhbCB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24KKyMgICAgZXFOIC0gZXF1YWwgdXAgdG8gTiBzdWItdmVyc2lvbiBsZXZlbHMKKyMgICAgbmVOIC0gbm90IGVxdWFsIHVwIHRvIE4gc3ViLXZlcnNpb24gbGV2ZWxzCisjCisjICAgV2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1UUlVFIGFyZSBydW4sCisjICAgb3RoZXJ3aXNlIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgZW52aXJvbm1lbnQKKyMgICB2YXJpYWJsZSAnYXhfY29tcGFyZV92ZXJzaW9uJyBpcyBhbHdheXMgc2V0IHRvIGVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJworIyAgIGFzIHdlbGwuCisjCisjICAgRXhhbXBsZXM6CisjCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2x0XSxbMy4xNS44XSkKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2x0XSxbMy4xNS44XSkKKyMKKyMgICB3b3VsZCBib3RoIGJlIHRydWUuCisjCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxXSxbMy4xNS44XSkKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2d0XSxbMy4xNS44XSkKKyMKKyMgICB3b3VsZCBib3RoIGJlIGZhbHNlLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcTJdLFszLjE1LjhdKQorIworIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0d28gbWlub3IgdmVyc2lvbnMuCisjCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxMF0sWzMuMTVdKQorIworIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0aGUgbGVzc2VyIG51bWJlciBvZiBtaW5vcgorIyAgIHZlcnNpb25zIG9mIHRoZSB0d28gdmFsdWVzLgorIworIyAgIE5vdGU6IFRoZSBjaGFyYWN0ZXJzIHRoYXQgc2VwYXJhdGUgdGhlIHZlcnNpb24gbnVtYmVycyBkbyBub3QgbWF0dGVyLiBBbgorIyAgIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB2ZXJzaW9uIDAuIE9QIGlzIGV2YWx1YXRlZCBieSBhdXRvY29uZiwgbm90CisjICAgY29uZmlndXJlLCBzbyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgYSB2YXJpYWJsZS4KKyMKKyMgICBUaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gYWNrbm93bGVkZ2UgR3VpZG8gRHJhaGVpbSB3aG9zZSBhZHZpY2UgYWJvdXQKKyMgICB0aGUgbTRfY2FzZSBhbmQgbTRfaWZ2YWxuIGZ1bmN0aW9ucyBtYWtlIHRoaXMgbWFjcm8gb25seSBpbmNsdWRlIHRoZQorIyAgIHBvcnRpb25zIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHRoZSBzcGVjaWZpYyBjb21wYXJpc29uIHNwZWNpZmllZCBieSB0aGUKKyMgICBPUCBhcmd1bWVudCBpbiB0aGUgZmluYWwgY29uZmlndXJlIHNjcmlwdC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBUaW0gVG9vbGFuIDx0b29sYW5AZWxlLnVyaS5lZHU+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDEyCisKK2RubCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitBQ19ERUZVTihbQVhfQ09NUEFSRV9WRVJTSU9OXSwgWworICBBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pCisKKyAgIyBVc2VkIHRvIGluZGljYXRlIHRydWUgb3IgZmFsc2UgY29uZGl0aW9uCisgIGF4X2NvbXBhcmVfdmVyc2lvbj1mYWxzZQorCisgICMgQ29udmVydCB0aGUgdHdvIHZlcnNpb24gc3RyaW5ncyB0byBiZSBjb21wYXJlZCBpbnRvIGEgZm9ybWF0IHRoYXQKKyAgIyBhbGxvd3MgYSBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uICBUaGUgZW5kIHJlc3VsdCBpcyB0aGF0IGEgdmVyc2lvbgorICAjIHN0cmluZyBvZiB0aGUgZm9ybSAxLjEyLjUtcjYxNyB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgZm9ybQorICAjIDAwMDEwMDEyMDAwNTA2MTcuICBJbiBvdGhlciB3b3JkcywgZWFjaCBudW1iZXIgaXMgemVybyBwYWRkZWQgdG8gZm91cgorICAjIGRpZ2l0cywgYW5kIG5vbiBkaWdpdHMgYXJlIHJlbW92ZWQuCisgIEFTX1ZBUl9QVVNIREVGKFtBXSxbYXhfY29tcGFyZV92ZXJzaW9uX0FdKQorICBBPWBlY2hvICIkMSIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAorCisgIEFTX1ZBUl9QVVNIREVGKFtCXSxbYXhfY29tcGFyZV92ZXJzaW9uX0JdKQorICBCPWBlY2hvICIkMyIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAorCisgIGRubCAjIEluIHRoZSBjYXNlIG9mIGxlLCBnZSwgbHQsIGFuZCBndCwgdGhlIHN0cmluZ3MgYXJlIHNvcnRlZCBhcyBuZWNlc3NhcnkKKyAgZG5sICMgdGhlbiB0aGUgZmlyc3QgbGluZSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCisgIGRubCAjIFRoZSBzZWQgcmlnaHQgYWZ0ZXIgdGhlIGVjaG8gaXMgdG8gcmVtb3ZlIGFueSBpbmRlbnRlZCB3aGl0ZSBzcGFjZS4KKyAgbTRfY2FzZShtNF90b2xvd2VyKCQyKSwKKyAgW2x0XSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS9mYWxzZS87cy94JHtCfS90cnVlLzsxcSJgCisgIF0sCisgIFtndF0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgfCBzZWQgInMveCR7QX0vZmFsc2UvO3MveCR7Qn0vdHJ1ZS87MXEiYAorICBdLAorICBbbGVdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IHwgc2VkICJzL3gke0F9L3RydWUvO3MveCR7Qn0vZmFsc2UvOzFxImAKKyAgXSwKKyAgW2dlXSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS90cnVlLztzL3gke0J9L2ZhbHNlLzsxcSJgCisgIF0sWworICAgIGRubCBTcGxpdCB0aGUgb3BlcmF0b3IgZnJvbSB0aGUgc3VidmVyc2lvbiBjb3VudCBpZiBwcmVzZW50LgorICAgIG00X2JtYXRjaChtNF9zdWJzdHIoJDIsMiksCisgICAgWzBdLFsKKyAgICAgICMgQSBjb3VudCBvZiB6ZXJvIG1lYW5zIHVzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24uCisgICAgICAjIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gQSBhbmQgQi4KKyAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQT1gZWNobyAiJEEiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKKyAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQj1gZWNobyAiJEIiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKKworICAgICAgIyBTZXQgQSB0byBubyBtb3JlIHRoYW4gQidzIGxlbmd0aCBhbmQgQiB0byBubyBtb3JlIHRoYW4gQSdzIGxlbmd0aC4KKyAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0JcfVwpLiovXDEvImAKKyAgICAgIEI9YGVjaG8gIiRCIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0FcfVwpLiovXDEvImAKKyAgICBdLAorICAgIFtbMC05XStdLFsKKyAgICAgICMgQSBjb3VudCBncmVhdGVyIHRoYW4gemVybyBtZWFucyB1c2Ugb25seSB0aGF0IG1hbnkgc3VidmVyc2lvbnMKKyAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKFwoW1swLTldXVx7NFx9XClce200X3N1YnN0cigkMiwyKVx9XCkuKi9cMS8iYAorICAgICAgQj1gZWNobyAiJEIiIHwgc2VkICJzL1woXChbWzAtOV1dXHs0XH1cKVx7bTRfc3Vic3RyKCQyLDIpXH1cKS4qL1wxLyJgCisgICAgXSwKKyAgICBbLitdLFsKKyAgICAgIEFDX1dBUk5JTkcoCisgICAgICAgIFtpbGxlZ2FsIE9QIG51bWVyaWMgcGFyYW1ldGVyOiAkMl0pCisgICAgXSxbXSkKKworICAgICMgUGFkIHplcm9zIGF0IGVuZCBvZiBudW1iZXJzIHRvIG1ha2Ugc2FtZSBsZW5ndGguCisgICAgYXhfY29tcGFyZV92ZXJzaW9uX3RtcF9BPSIkQWBlY2hvICRCIHwgc2VkICdzLy4vMC9nJ2AiCisgICAgQj0iJEJgZWNobyAkQSB8IHNlZCAncy8uLzAvZydgIgorICAgIEE9IiRheF9jb21wYXJlX3ZlcnNpb25fdG1wX0EiCisKKyAgICAjIENoZWNrIGZvciBlcXVhbGl0eSBvciBpbmVxdWFsaXR5IGFzIG5lY2Vzc2FyeS4KKyAgICBtNF9jYXNlKG00X3RvbG93ZXIobTRfc3Vic3RyKCQyLDAsMikpLAorICAgIFtlcV0sWworICAgICAgdGVzdCAieCRBIiA9ICJ4JEIiICYmIGF4X2NvbXBhcmVfdmVyc2lvbj10cnVlCisgICAgXSwKKyAgICBbbmVdLFsKKyAgICAgIHRlc3QgIngkQSIgIT0gIngkQiIgJiYgYXhfY29tcGFyZV92ZXJzaW9uPXRydWUKKyAgICBdLFsKKyAgICAgIEFDX1dBUk5JTkcoW2lsbGVnYWwgT1AgcGFyYW1ldGVyOiAkMl0pCisgICAgXSkKKyAgXSkKKworICBBU19WQVJfUE9QREVGKFtBXSlkbmwKKyAgQVNfVkFSX1BPUERFRihbQl0pZG5sCisKKyAgZG5sICMgRXhlY3V0ZSBBQ1RJT04tSUYtVFJVRSAvIEFDVElPTi1JRi1GQUxTRS4KKyAgaWYgdGVzdCAiJGF4X2NvbXBhcmVfdmVyc2lvbiIgPSAidHJ1ZSIgOyB0aGVuCisgICAgbTRfaWZ2YWxuKFskNF0sWyQ0XSxbOl0pZG5sCisgICAgbTRfaWZ2YWxuKFskNV0sW2Vsc2UgJDVdKWRubAorICBmaQorXSkgZG5sIEFYX0NPTVBBUkVfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHgubTQgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTllYWVkCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHgubTQKQEAgLTAsMCArMSw5NDggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYKFZFUlNJT04sIFtleHR8bm9leHRdLCBbbWFuZGF0b3J5fG9wdGlvbmFsXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBDaGVjayBmb3IgYmFzZWxpbmUgbGFuZ3VhZ2UgY292ZXJhZ2UgaW4gdGhlIGNvbXBpbGVyIGZvciB0aGUgc3BlY2lmaWVkCisjICAgdmVyc2lvbiBvZiB0aGUgQysrIHN0YW5kYXJkLiAgSWYgbmVjZXNzYXJ5LCBhZGQgc3dpdGNoZXMgdG8gQ1hYIGFuZAorIyAgIENYWENQUCB0byBlbmFibGUgc3VwcG9ydC4gIFZFUlNJT04gbWF5IGJlICcxMScgKGZvciB0aGUgQysrMTEgc3RhbmRhcmQpCisjICAgb3IgJzE0JyAoZm9yIHRoZSBDKysxNCBzdGFuZGFyZCkuCisjCisjICAgVGhlIHNlY29uZCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkLCBpbmRpY2F0ZXMgd2hldGhlciB5b3UgaW5zaXN0IG9uIGFuCisjICAgZXh0ZW5kZWQgbW9kZSAoZS5nLiAtc3RkPWdudSsrMTEpIG9yIGEgc3RyaWN0IGNvbmZvcm1hbmNlIG1vZGUgKGUuZy4KKyMgICAtc3RkPWMrKzExKS4gIElmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCB5b3UgZ2V0IHdoYXRldmVyIHdvcmtzLCB3aXRoCisjICAgcHJlZmVyZW5jZSBmb3IgYW4gZXh0ZW5kZWQgbW9kZS4KKyMKKyMgICBUaGUgdGhpcmQgYXJndW1lbnQsIGlmIHNwZWNpZmllZCAnbWFuZGF0b3J5JyBvciBpZiBsZWZ0IHVuc3BlY2lmaWVkLAorIyAgIGluZGljYXRlcyB0aGF0IGJhc2VsaW5lIHN1cHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgQysrIHN0YW5kYXJkIGlzCisjICAgcmVxdWlyZWQgYW5kIHRoYXQgdGhlIG1hY3JvIHNob3VsZCBlcnJvciBvdXQgaWYgbm8gbW9kZSB3aXRoIHRoYXQKKyMgICBzdXBwb3J0IGlzIGZvdW5kLiAgSWYgc3BlY2lmaWVkICdvcHRpb25hbCcsIHRoZW4gY29uZmlndXJhdGlvbiBwcm9jZWVkcworIyAgIHJlZ2FyZGxlc3MsIGFmdGVyIGRlZmluaW5nIEhBVkVfQ1hYJHtWRVJTSU9OfSBpZiBhbmQgb25seSBpZiBhCisjICAgc3VwcG9ydGluZyBtb2RlIGlzIGZvdW5kLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMiBaYWNrIFdlaW5iZXJnIDx6YWNrd0BwYW5peC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEzIFJveSBTdG9nbmVyIDxyb3lzdGduckBpY2VzLnV0ZXhhcy5lZHU+CisjICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE1IEdvb2dsZSBJbmMuOyBjb250cmlidXRlZCBieSBBbGV4ZXkgU29rb2xvdiA8c29rb2xvdkBnb29nbGUuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBQYXVsIE5vcm1hbiA8cGVub3JtYW5AbWFjLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgTW9yaXR6IEtsYW1tbGVyIDxtb3JpdHpAa2xhbW1sZXIuZXU+CisjICAgQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IEtyemVzaW1pciBOb3dhayA8cWRsYWN6QGdtYWlsLmNvbT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDEwCisKK2RubCAgVGhpcyBtYWNybyBpcyBiYXNlZCBvbiB0aGUgY29kZSBmcm9tIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEgbWFjcm8KK2RubCAgKHNlcmlhbCB2ZXJzaW9uIG51bWJlciAxMykuCisKK0FDX0RFRlVOKFtBWF9DWFhfQ09NUElMRV9TVERDWFhdLCBbZG5sCisgIG00X2lmKFskMV0sIFsxMV0sIFtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXM9IjExIDB4Il0sCisgICAgICAgIFskMV0sIFsxNF0sIFtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXM9IjE0IDF5Il0sCisgICAgICAgIFskMV0sIFsxN10sIFtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXM9IjE3IDF6Il0sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBmaXJzdCBhcmd1bWVudCBgJDEnIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF0pXSlkbmwKKyAgbTRfaWYoWyQyXSwgW10sIFtdLAorICAgICAgICBbJDJdLCBbZXh0XSwgW10sCisgICAgICAgIFskMl0sIFtub2V4dF0sIFtdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgc2Vjb25kIGFyZ3VtZW50IGAkMicgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSldKWRubAorICBtNF9pZihbJDNdLCBbXSwgW2F4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkPXRydWVdLAorICAgICAgICBbJDNdLCBbbWFuZGF0b3J5XSwgW2F4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkPXRydWVdLAorICAgICAgICBbJDNdLCBbb3B0aW9uYWxdLCBbYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQ9ZmFsc2VdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgdGhpcmQgYXJndW1lbnQgYCQzJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhdKV0pCisgIEFDX0xBTkdfUFVTSChbQysrXSlkbmwKKyAgYWNfc3VjY2Vzcz1ubworCisgIG00X2lmKFskMl0sIFtub2V4dF0sIFtdLCBbZG5sCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgZm9yIGFsdGVybmF0aXZlIGluICR7YXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzfTsgZG8KKyAgICAgIHN3aXRjaD0iLXN0ZD1nbnUrKyR7YWx0ZXJuYXRpdmV9IgorICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eCQxXyRzd2l0Y2hdKQorICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKyQxIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKKyAgICAgICAgW2FjX3NhdmVfQ1hYPSIkQ1hYIgorICAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfJDFdKV0sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgIENYWD0iJGFjX3NhdmVfQ1hYIl0pCisgICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgorICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgaWYgdGVzdCAtbiAiJENYWENQUCIgOyB0aGVuCisgICAgICAgICAgQ1hYQ1BQPSIkQ1hYQ1BQICRzd2l0Y2giCisgICAgICAgIGZpCisgICAgICAgIGFjX3N1Y2Nlc3M9eWVzCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmldKQorCisgIG00X2lmKFskMl0sIFtleHRdLCBbXSwgW2RubAorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIGRubCBIUCdzIGFDQyBuZWVkcyArc3RkPWMrKzExIGFjY29yZGluZyB0bzoKKyAgICBkbmwgaHR0cDovL2gyMTAwNy53d3cyLmhwLmNvbS9wb3J0YWwvZG93bmxvYWQvZmlsZXMvdW5wcm90L2FDeHgvUERGX1JlbGVhc2VfTm90ZXMvNzY5MTQ5LTAwMS5wZGYKKyAgICBkbmwgQ3JheSdzIGNyYXlDQyBuZWVkcyAiLWggc3RkPWMrKzExIgorICAgIGZvciBhbHRlcm5hdGl2ZSBpbiAke2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlc307IGRvCisgICAgICBmb3Igc3dpdGNoIGluIC1zdGQ9YysrJHthbHRlcm5hdGl2ZX0gK3N0ZD1jKyske2FsdGVybmF0aXZlfSAiLWggc3RkPWMrKyR7YWx0ZXJuYXRpdmV9IjsgZG8KKyAgICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eCQxXyRzd2l0Y2hdKQorICAgICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrJDEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgICAgW2FjX3NhdmVfQ1hYPSIkQ1hYIgorICAgICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XyQxXSldLAorICAgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCisgICAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQorICAgICAgICAgICBDWFg9IiRhY19zYXZlX0NYWCJdKQorICAgICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgorICAgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRDWFhDUFAiIDsgdGhlbgorICAgICAgICAgICAgQ1hYQ1BQPSIkQ1hYQ1BQICRzd2l0Y2giCisgICAgICAgICAgZmkKKyAgICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHh5ZXM7IHRoZW4KKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaV0pCisgIEFDX0xBTkdfUE9QKFtDKytdKQorICBpZiB0ZXN0IHgkYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQgPSB4dHJ1ZTsgdGhlbgorICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgICBBQ19NU0dfRVJST1IoWyoqKiBBIGNvbXBpbGVyIHdpdGggc3VwcG9ydCBmb3IgQysrJDEgbGFuZ3VhZ2UgZmVhdHVyZXMgaXMgcmVxdWlyZWQuXSkKKyAgICBmaQorICBmaQorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIEhBVkVfQ1hYJDE9MAorICAgIEFDX01TR19OT1RJQ0UoW05vIGNvbXBpbGVyIHdpdGggQysrJDEgc3VwcG9ydCB3YXMgZm91bmRdKQorICBlbHNlCisgICAgSEFWRV9DWFgkMT0xCisgICAgQUNfREVGSU5FKEhBVkVfQ1hYJDEsMSwKKyAgICAgICAgICAgICAgW2RlZmluZSBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgYmFzaWMgQysrJDEgc3ludGF4XSkKKyAgZmkKKyAgQUNfU1VCU1QoSEFWRV9DWFgkMSkKK10pCisKKworZG5sICBUZXN0IGJvZHkgZm9yIGNoZWNraW5nIEMrKzExIHN1cHBvcnQKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XzExXSwKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTEKKykKKworCitkbmwgIFRlc3QgYm9keSBmb3IgY2hlY2tpbmcgQysrMTQgc3VwcG9ydAorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfMTRdLAorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xMQorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xNAorKQorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfMTddLAorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xMQorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xNAorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xNworKQorCitkbmwgIFRlc3RzIGZvciBuZXcgZmVhdHVyZXMgaW4gQysrMTEKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xMV0sIFtbCisKKy8vIElmIHRoZSBjb21waWxlciBhZG1pdHMgdGhhdCBpdCBpcyBub3QgcmVhZHkgZm9yIEMrKzExLCB3aHkgdG9ydHVyZSBpdD8KKy8vIEhvcGVmdWxseSwgdGhpcyB3aWxsIHNwZWVkIHVwIHRoZSB0ZXN0LgorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysgY29tcGlsZXIiCisKKyNlbGlmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrMTEgY29tcGlsZXIiCisKKyNlbHNlCisKK25hbWVzcGFjZSBjeHgxMQoreworCisgIG5hbWVzcGFjZSB0ZXN0X3N0YXRpY19hc3NlcnQKKyAgeworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNoZWNrCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50KSA8PSBzaXplb2YoVCksICJub3QgYmlnIGVub3VnaCIpOworICAgIH07CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2ZpbmFsX292ZXJyaWRlCisgIHsKKworICAgIHN0cnVjdCBCYXNlCisgICAgeworICAgICAgdmlydHVhbCB2b2lkIGYoKSB7fQorICAgIH07CisKKyAgICBzdHJ1Y3QgRGVyaXZlZCA6IHB1YmxpYyBCYXNlCisgICAgeworICAgICAgdmlydHVhbCB2b2lkIGYoKSBvdmVycmlkZSB7fQorICAgIH07CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2RvdWJsZV9yaWdodF9hbmdsZV9icmFja2V0cworICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgorICAgIHN0cnVjdCBjaGVjayB7fTsKKworICAgIHR5cGVkZWYgY2hlY2s8dm9pZD4gc2luZ2xlX3R5cGU7CisgICAgdHlwZWRlZiBjaGVjazxjaGVjazx2b2lkPj4gZG91YmxlX3R5cGU7CisgICAgdHlwZWRlZiBjaGVjazxjaGVjazxjaGVjazx2b2lkPj4+IHRyaXBsZV90eXBlOworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8Y2hlY2s8Y2hlY2s8dm9pZD4+Pj4gcXVhZHJ1cGxlX3R5cGU7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2RlY2x0eXBlCisgIHsKKworICAgIGludAorICAgIGYoKQorICAgIHsKKyAgICAgIGludCBhID0gMTsKKyAgICAgIGRlY2x0eXBlKGEpIGIgPSAyOworICAgICAgcmV0dXJuIGEgKyBiOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdHlwZV9kZWR1Y3Rpb24KKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIgPgorICAgIHN0cnVjdCBpc19zYW1lCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgaXNfc2FtZTxULCBUPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIgPgorICAgIGF1dG8KKyAgICBhZGQoVDEgYTEsIFQyIGEyKSAtPiBkZWNsdHlwZShhMSArIGEyKQorICAgIHsKKyAgICAgIHJldHVybiBhMSArIGEyOworICAgIH0KKworICAgIGludAorICAgIHRlc3QoY29uc3QgaW50IGMsIHZvbGF0aWxlIGludCB2KQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKDApPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoYyk+Ojp2YWx1ZSA9PSBmYWxzZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUodik+Ojp2YWx1ZSA9PSBmYWxzZSwgIiIpOworICAgICAgYXV0byBhYyA9IGM7CisgICAgICBhdXRvIGF2ID0gdjsKKyAgICAgIGF1dG8gc3VtaSA9IGFjICsgYXYgKyAneCc7CisgICAgICBhdXRvIHN1bWYgPSBhYyArIGF2ICsgMS4wOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoYWMpPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoYXYpPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoc3VtaSk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShzdW1mKT46OnZhbHVlID09IGZhbHNlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShhZGQoYywgdikpPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgcmV0dXJuIChzdW1mID4gMC4wKSA/IHN1bWkgOiBhZGQoYywgdik7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9ub2V4Y2VwdAorICB7CisKKyAgICBpbnQgZigpIHsgcmV0dXJuIDA7IH0KKyAgICBpbnQgZygpIG5vZXhjZXB0IHsgcmV0dXJuIDA7IH0KKworICAgIHN0YXRpY19hc3NlcnQobm9leGNlcHQoZigpKSA9PSBmYWxzZSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQobm9leGNlcHQoZygpKSA9PSB0cnVlLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2NvbnN0ZXhwcgorICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIENoYXJUID4KKyAgICB1bnNpZ25lZCBsb25nIGNvbnN0ZXhwcgorICAgIHN0cmxlbl9jX3IoY29uc3QgQ2hhclQgKmNvbnN0IHMsIGNvbnN0IHVuc2lnbmVkIGxvbmcgYWNjKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHJldHVybiAqcyA/IHN0cmxlbl9jX3IocyArIDEsIGFjYyArIDEpIDogYWNjOworICAgIH0KKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgQ2hhclQgPgorICAgIHVuc2lnbmVkIGxvbmcgY29uc3RleHByCisgICAgc3RybGVuX2MoY29uc3QgQ2hhclQgKmNvbnN0IHMpIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuIHN0cmxlbl9jX3IocywgMFVMKTsKKyAgICB9CisKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCIiKSA9PSAwVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCIxIikgPT0gMVVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiZXhhbXBsZSIpID09IDdVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoImFub3RoZXJcMGV4YW1wbGUiKSA9PSA3VUwsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfcnZhbHVlX3JlZmVyZW5jZXMKKyAgeworCisgICAgdGVtcGxhdGUgPCBpbnQgTiA+CisgICAgc3RydWN0IGFuc3dlcgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IHZhbHVlID0gTjsKKyAgICB9OworCisgICAgYW5zd2VyPDE+IGYoaW50JikgICAgICAgeyByZXR1cm4gYW5zd2VyPDE+KCk7IH0KKyAgICBhbnN3ZXI8Mj4gZihjb25zdCBpbnQmKSB7IHJldHVybiBhbnN3ZXI8Mj4oKTsgfQorICAgIGFuc3dlcjwzPiBmKGludCYmKSAgICAgIHsgcmV0dXJuIGFuc3dlcjwzPigpOyB9CisKKyAgICB2b2lkCisgICAgdGVzdCgpCisgICAgeworICAgICAgaW50IGkgPSAwOworICAgICAgY29uc3QgaW50IGMgPSAwOworICAgICAgc3RhdGljX2Fzc2VydChkZWNsdHlwZShmKGkpKTo6dmFsdWUgPT0gMSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChkZWNsdHlwZShmKGMpKTo6dmFsdWUgPT0gMiwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChkZWNsdHlwZShmKDApKTo6dmFsdWUgPT0gMywgIiIpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdW5pZm9ybV9pbml0aWFsaXphdGlvbgorICB7CisKKyAgICBzdHJ1Y3QgdGVzdAorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgemVybyB7fTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgb25lIHsxfTsKKyAgICB9OworCisgICAgc3RhdGljX2Fzc2VydCh0ZXN0Ojp6ZXJvID09IDAsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHRlc3Q6Om9uZSA9PSAxLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2xhbWJkYXMKKyAgeworCisgICAgdm9pZAorICAgIHRlc3QxKCkKKyAgICB7CisgICAgICBhdXRvIGxhbWJkYTEgPSBbXSgpe307CisgICAgICBhdXRvIGxhbWJkYTIgPSBsYW1iZGExOworICAgICAgbGFtYmRhMSgpOworICAgICAgbGFtYmRhMigpOworICAgIH0KKworICAgIGludAorICAgIHRlc3QyKCkKKyAgICB7CisgICAgICBhdXRvIGEgPSBbXShpbnQgaSwgaW50IGopeyByZXR1cm4gaSArIGo7IH0oMSwgMik7CisgICAgICBhdXRvIGIgPSBbXSgpIC0+IGludCB7IHJldHVybiAnMCc7IH0oKTsKKyAgICAgIGF1dG8gYyA9IFs9XSgpeyByZXR1cm4gYSArIGI7IH0oKTsKKyAgICAgIGF1dG8gZCA9IFsmXSgpeyByZXR1cm4gYzsgfSgpOworICAgICAgYXV0byBlID0gW2EsICZiXShpbnQgeCkgbXV0YWJsZSB7CisgICAgICAgIGNvbnN0IGF1dG8gaWRlbnRpdHkgPSBbXShpbnQgeSl7IHJldHVybiB5OyB9OworICAgICAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBhOyArK2kpCisgICAgICAgICAgYSArPSBiLS07CisgICAgICAgIHJldHVybiB4ICsgaWRlbnRpdHkoYSArIGIpOworICAgICAgfSgwKTsKKyAgICAgIHJldHVybiBhICsgYiArIGMgKyBkICsgZTsKKyAgICB9CisKKyAgICBpbnQKKyAgICB0ZXN0MygpCisgICAgeworICAgICAgY29uc3QgYXV0byBudWxsYXJ5ID0gW10oKXsgcmV0dXJuIDA7IH07CisgICAgICBjb25zdCBhdXRvIHVuYXJ5ID0gW10oaW50IHgpeyByZXR1cm4geDsgfTsKKyAgICAgIHVzaW5nIG51bGxhcnlfdCA9IGRlY2x0eXBlKG51bGxhcnkpOworICAgICAgdXNpbmcgdW5hcnlfdCA9IGRlY2x0eXBlKHVuYXJ5KTsKKyAgICAgIGNvbnN0IGF1dG8gaGlnaGVyMXN0ID0gW10obnVsbGFyeV90IGYpeyByZXR1cm4gZigpOyB9OworICAgICAgY29uc3QgYXV0byBoaWdoZXIybmQgPSBbdW5hcnldKG51bGxhcnlfdCBmMSl7CisgICAgICAgIHJldHVybiBbdW5hcnksIGYxXSh1bmFyeV90IGYyKXsgcmV0dXJuIGYyKHVuYXJ5KGYxKCkpKTsgfTsKKyAgICAgIH07CisgICAgICByZXR1cm4gaGlnaGVyMXN0KG51bGxhcnkpICsgaGlnaGVyMm5kKG51bGxhcnkpKHVuYXJ5KTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3ZhcmlhZGljX3RlbXBsYXRlcworICB7CisKKyAgICB0ZW1wbGF0ZSA8aW50Li4uPgorICAgIHN0cnVjdCBzdW07CisKKyAgICB0ZW1wbGF0ZSA8aW50IE4wLCBpbnQuLi4gTjF0b04+CisgICAgc3RydWN0IHN1bTxOMCwgTjF0b04uLi4+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gTjAgKyBzdW08TjF0b04uLi4+Ojp2YWx1ZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPD4KKyAgICBzdHJ1Y3Qgc3VtPD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSAwOworICAgIH07CisKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTw+Ojp2YWx1ZSA9PSAwLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08MT46OnZhbHVlID09IDEsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwyMz46OnZhbHVlID09IDIzLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08MSwgMj46OnZhbHVlID09IDMsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTw1LCA1LCAxMT46OnZhbHVlID09IDIxLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08MiwgMywgNSwgNywgMTEsIDEzPjo6dmFsdWUgPT0gNDEsICIiKTsKKworICB9CisKKyAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMzcyODE4NC90ZW1wbGF0ZS1hbGlhc2VzLWFuZC1zZmluYWUKKyAgLy8gQ2xhbmcgMy4xIGZhaWxzIHdpdGggaGVhZGVycyBvZiBsaWJzdGQrKyA0LjguMyB3aGVuIHVzaW5nIHN0ZDo6ZnVuY3Rpb24KKyAgLy8gYmVjYXVzZSBvZiB0aGlzLgorICBuYW1lc3BhY2UgdGVzdF90ZW1wbGF0ZV9hbGlhc19zZmluYWUKKyAgeworCisgICAgc3RydWN0IGZvbyB7fTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdXNpbmcgbWVtYmVyID0gdHlwZW5hbWUgVDo6bWVtYmVyX3R5cGU7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHZvaWQgZnVuYyguLi4pIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHZvaWQgZnVuYyhtZW1iZXI8VD4qKSB7fQorCisgICAgdm9pZCB0ZXN0KCk7CisKKyAgICB2b2lkIHRlc3QoKSB7IGZ1bmM8Zm9vPigwKTsgfQorCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGN4eDExCisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCitdXSkKKworCitkbmwgIFRlc3RzIGZvciBuZXcgZmVhdHVyZXMgaW4gQysrMTQKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xNF0sIFtbCisKKy8vIElmIHRoZSBjb21waWxlciBhZG1pdHMgdGhhdCBpdCBpcyBub3QgcmVhZHkgZm9yIEMrKzE0LCB3aHkgdG9ydHVyZSBpdD8KKy8vIEhvcGVmdWxseSwgdGhpcyB3aWxsIHNwZWVkIHVwIHRoZSB0ZXN0LgorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysgY29tcGlsZXIiCisKKyNlbGlmIF9fY3BsdXNwbHVzIDwgMjAxNDAyTAorCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrMTQgY29tcGlsZXIiCisKKyNlbHNlCisKK25hbWVzcGFjZSBjeHgxNAoreworCisgIG5hbWVzcGFjZSB0ZXN0X3BvbHltb3JwaGljX2xhbWJkYXMKKyAgeworCisgICAgaW50CisgICAgdGVzdCgpCisgICAgeworICAgICAgY29uc3QgYXV0byBsYW1iZGEgPSBbXShhdXRvJiYuLi4gYXJncyl7CisgICAgICAgIGNvbnN0IGF1dG8gaXN0aW55ID0gW10oYXV0byB4KXsKKyAgICAgICAgICByZXR1cm4gKHNpemVvZih4KSA9PSAxVUwpID8gMSA6IDA7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IGludCBhcmV0aW55W10gPSB7IGlzdGlueShhcmdzKS4uLiB9OworICAgICAgICByZXR1cm4gYXJldGlueVswXTsKKyAgICAgIH07CisgICAgICByZXR1cm4gbGFtYmRhKDEsIDFMLCAxLjBmLCAnMScpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfYmluYXJ5X2xpdGVyYWxzCisgIHsKKworICAgIGNvbnN0ZXhwciBhdXRvIGl2aWkgPSAwYjAwMDAwMDAwMDAxMDEwMTA7CisgICAgc3RhdGljX2Fzc2VydChpdmlpID09IDQyLCAid3JvbmcgdmFsdWUiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZ2VuZXJhbGl6ZWRfY29uc3RleHByCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgQ2hhclQgPgorICAgIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nCisgICAgc3RybGVuX2MoY29uc3QgQ2hhclQgKmNvbnN0IHMpIG5vZXhjZXB0CisgICAgeworICAgICAgYXV0byBsZW5ndGggPSAwVUw7CisgICAgICBmb3IgKGF1dG8gcCA9IHM7ICpwOyArK3ApCisgICAgICAgICsrbGVuZ3RoOworICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICB9CisKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCIiKSA9PSAwVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJ4IikgPT0gMVVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygidGVzdCIpID09IDRVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoImFub3RoZXJcMHRlc3QiKSA9PSA3VUwsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfbGFtYmRhX2luaXRfY2FwdHVyZQorICB7CisKKyAgICBpbnQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBhdXRvIHggPSAwOworICAgICAgY29uc3QgYXV0byBsYW1iZGExID0gW2EgPSB4XShpbnQgYil7IHJldHVybiBhICsgYjsgfTsKKyAgICAgIGNvbnN0IGF1dG8gbGFtYmRhMiA9IFthID0gbGFtYmRhMSh4KV0oKXsgcmV0dXJuIGE7IH07CisgICAgICByZXR1cm4gbGFtYmRhMigpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZGlnaXRfc2VwYXJhdG9ycworICB7CisKKyAgICBjb25zdGV4cHIgYXV0byB0ZW5fbWlsbGlvbiA9IDEwMCcwMDAnMDAwOworICAgIHN0YXRpY19hc3NlcnQodGVuX21pbGxpb24gPT0gMTAwMDAwMDAwLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3JldHVybl90eXBlX2RlZHVjdGlvbgorICB7CisKKyAgICBhdXRvIGYoaW50JiB4KSB7IHJldHVybiB4OyB9CisgICAgZGVjbHR5cGUoYXV0bykgZyhpbnQmIHgpIHsgcmV0dXJuIHg7IH0KKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyID4KKyAgICBzdHJ1Y3QgaXNfc2FtZQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IGZhbHNlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgorICAgIHN0cnVjdCBpc19zYW1lPFQsIFQ+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gdHJ1ZTsKKyAgICB9OworCisgICAgaW50CisgICAgdGVzdCgpCisgICAgeworICAgICAgYXV0byB4ID0gMDsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGYoeCkpPjo6dmFsdWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQmLCBkZWNsdHlwZShnKHgpKT46OnZhbHVlLCAiIik7CisgICAgICByZXR1cm4geDsKKyAgICB9CisKKyAgfQorCit9ICAvLyBuYW1lc3BhY2UgY3h4MTQKKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cyA+PSAyMDE0MDJMCisKK11dKQorCisKK2RubCAgVGVzdHMgZm9yIG5ldyBmZWF0dXJlcyBpbiBDKysxNworCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE3XSwgW1sKKworLy8gSWYgdGhlIGNvbXBpbGVyIGFkbWl0cyB0aGF0IGl0IGlzIG5vdCByZWFkeSBmb3IgQysrMTcsIHdoeSB0b3J0dXJlIGl0PworLy8gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgc3BlZWQgdXAgdGhlIHRlc3QuCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKyBjb21waWxlciIKKworI2VsaWYgX19jcGx1c3BsdXMgPCAyMDE3MDNMCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysxNyBjb21waWxlciIKKworI2Vsc2UKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGN4eDE3Cit7CisKKyAgbmFtZXNwYWNlIHRlc3RfY29uc3RleHByX2xhbWJkYXMKKyAgeworCisgICAgY29uc3RleHByIGludCBmb28gPSBbXSgpe3JldHVybiA0Mjt9KCk7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0OjpuZXN0ZWRfbmFtZXNwYWNlOjpkZWZpbml0aW9ucworICB7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2ZvbGRfZXhwcmVzc2lvbgorICB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgorICAgIGludCBtdWx0aXBseShBcmdzLi4uIGFyZ3MpCisgICAgeworICAgICAgcmV0dXJuIChhcmdzICogLi4uICogMSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KKyAgICBib29sIGFsbChBcmdzLi4uIGFyZ3MpCisgICAgeworICAgICAgcmV0dXJuIChhcmdzICYmIC4uLik7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9leHRlbmRlZF9zdGF0aWNfYXNzZXJ0CisgIHsKKworICAgIHN0YXRpY19hc3NlcnQgKHRydWUpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9hdXRvX2JyYWNlX2luaXRfbGlzdAorICB7CisKKyAgICBhdXRvIGZvbyA9IHs1fTsKKyAgICBhdXRvIGJhciB7NX07CisKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxzdGQ6OmluaXRpYWxpemVyX2xpc3Q8aW50PiwgZGVjbHR5cGUoZm9vKT46OnZhbHVlKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxpbnQsIGRlY2x0eXBlKGJhcik+Ojp2YWx1ZSk7CisgIH0KKworICBuYW1lc3BhY2UgdGVzdF90eXBlbmFtZV9pbl90ZW1wbGF0ZV90ZW1wbGF0ZV9wYXJhbWV0ZXIKKyAgeworCisgICAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IHR5cGVuYW1lIFg+IHN0cnVjdCBEOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9mYWxsdGhyb3VnaF9ub2Rpc2NhcmRfbWF5YmVfdW51c2VkX2F0dHJpYnV0ZXMKKyAgeworCisgICAgaW50IGYxKCkKKyAgICB7CisgICAgICByZXR1cm4gNDI7CisgICAgfQorCisgICAgW1tub2Rpc2NhcmRdXSBpbnQgZjIoKQorICAgIHsKKyAgICAgIFtbbWF5YmVfdW51c2VkXV0gYXV0byB1bnVzZWQgPSBmMSgpOworCisgICAgICBzd2l0Y2ggKGYxKCkpCisgICAgICB7CisgICAgICBjYXNlIDE3OgorICAgICAgICBmMSgpOworICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICBjYXNlIDQyOgorICAgICAgICBmMSgpOworICAgICAgfQorICAgICAgcmV0dXJuIGYxKCk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9leHRlbmRlZF9hZ2dyZWdhdGVfaW5pdGlhbGl6YXRpb24KKyAgeworCisgICAgc3RydWN0IGJhc2UxCisgICAgeworICAgICAgaW50IGIxLCBiMiA9IDQyOworICAgIH07CisKKyAgICBzdHJ1Y3QgYmFzZTIKKyAgICB7CisgICAgICBiYXNlMigpIHsKKyAgICAgICAgYjMgPSA0MjsKKyAgICAgIH0KKyAgICAgIGludCBiMzsKKyAgICB9OworCisgICAgc3RydWN0IGRlcml2ZWQgOiBiYXNlMSwgYmFzZTIKKyAgICB7CisgICAgICAgIGludCBkOworICAgIH07CisKKyAgICBkZXJpdmVkIGQxIHt7MSwgMn0sIHt9LCA0fTsgIC8vIGZ1bGwgaW5pdGlhbGl6YXRpb24KKyAgICBkZXJpdmVkIGQyIHt7fSwge30sIDR9OyAgICAgIC8vIHZhbHVlLWluaXRpYWxpemVkIGJhc2VzCisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2dlbmVyYWxfcmFuZ2VfYmFzZWRfZm9yX2xvb3AKKyAgeworCisgICAgc3RydWN0IGl0ZXIKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgaW50JiBvcGVyYXRvciogKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IGludCYgb3BlcmF0b3IqICgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorCisgICAgICBpdGVyJiBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgKytpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgfTsKKworICAgIHN0cnVjdCBzZW50aW5lbAorICAgIHsKKyAgICAgIGludCBpOworICAgIH07CisKKyAgICBib29sIG9wZXJhdG9yPT0gKGNvbnN0IGl0ZXImIGksIGNvbnN0IHNlbnRpbmVsJiBzKQorICAgIHsKKyAgICAgIHJldHVybiBpLmkgPT0gcy5pOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgaXRlciYgaSwgY29uc3Qgc2VudGluZWwmIHMpCisgICAgeworICAgICAgcmV0dXJuICEoaSA9PSBzKTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgcmFuZ2UKKyAgICB7CisgICAgICBpdGVyIGJlZ2luKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHswfTsKKyAgICAgIH0KKworICAgICAgc2VudGluZWwgZW5kKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHs1fTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdm9pZCBmKCkKKyAgICB7CisgICAgICByYW5nZSByIHt9OworCisgICAgICBmb3IgKGF1dG8gaSA6IHIpCisgICAgICB7CisgICAgICAgIFtbbWF5YmVfdW51c2VkXV0gYXV0byB2ID0gaTsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2xhbWJkYV9jYXB0dXJlX2FzdGVyaXNrX3RoaXNfYnlfdmFsdWUKKyAgeworCisgICAgc3RydWN0IHQKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBmb28oKQorICAgICAgeworICAgICAgICByZXR1cm4gWyp0aGlzXSgpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfSgpOworICAgICAgfQorICAgIH07CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2VudW1fY2xhc3NfY29uc3RydWN0aW9uCisgIHsKKworICAgIGVudW0gY2xhc3MgYnl0ZSA6IHVuc2lnbmVkIGNoYXIKKyAgICB7fTsKKworICAgIGJ5dGUgZm9vIHs0Mn07CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2NvbnN0ZXhwcl9pZgorICB7CisKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBjb25kPgorICAgIGludCBmICgpCisgICAgeworICAgICAgaWYgY29uc3RleHByKGNvbmQpCisgICAgICB7CisgICAgICAgIHJldHVybiAxMzsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIDQyOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfc2VsZWN0aW9uX3N0YXRlbWVudF93aXRoX2luaXRpYWxpemVyCisgIHsKKworICAgIGludCBmKCkKKyAgICB7CisgICAgICByZXR1cm4gMTM7CisgICAgfQorCisgICAgaW50IGYyKCkKKyAgICB7CisgICAgICBpZiAoYXV0byBpID0gZigpOyBpID4gMCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoYXV0byBpID0gZigpOyBpICsgNCkKKyAgICAgIHsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgIHJldHVybiAyOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3RlbXBsYXRlX2FyZ3VtZW50X2RlZHVjdGlvbl9mb3JfY2xhc3NfdGVtcGxhdGVzCisgIHsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IHBhaXIKKyAgICB7CisgICAgICBwYWlyIChUMSBwMSwgVDIgcDIpCisgICAgICAgIDogbTEge3AxfSwKKyAgICAgICAgICBtMiB7cDJ9CisgICAgICB7fQorCisgICAgICBUMSBtMTsKKyAgICAgIFQyIG0yOworICAgIH07CisKKyAgICB2b2lkIGYoKQorICAgIHsKKyAgICAgIFtbbWF5YmVfdW51c2VkXV0gYXV0byBwID0gcGFpcnsxMywgNDJ1fTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X25vbl90eXBlX2F1dG9fdGVtcGxhdGVfcGFyYW1ldGVycworICB7CisKKyAgICB0ZW1wbGF0ZSA8YXV0byBuPgorICAgIHN0cnVjdCBCCisgICAge307CisKKyAgICBCPDU+IGIxOworICAgIEI8J2EnPiBiMjsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfc3RydWN0dXJlZF9iaW5kaW5ncworICB7CisKKyAgICBpbnQgYXJyWzJdID0geyAxLCAyIH07CisgICAgc3RkOjpwYWlyPGludCwgaW50PiBwciA9IHsgMSwgMiB9OworCisgICAgYXV0byBmMSgpIC0+IGludCgmKVsyXQorICAgIHsKKyAgICAgIHJldHVybiBhcnI7CisgICAgfQorCisgICAgYXV0byBmMigpIC0+IHN0ZDo6cGFpcjxpbnQsIGludD4mCisgICAgeworICAgICAgcmV0dXJuIHByOworICAgIH0KKworICAgIHN0cnVjdCBTCisgICAgeworICAgICAgaW50IHgxIDogMjsKKyAgICAgIHZvbGF0aWxlIGRvdWJsZSB5MTsKKyAgICB9OworCisgICAgUyBmMygpCisgICAgeworICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIGF1dG8gWyB4MSwgeTEgXSA9IGYxKCk7CisgICAgYXV0byYgWyB4cjEsIHlyMSBdID0gZjEoKTsKKyAgICBhdXRvIFsgeDIsIHkyIF0gPSBmMigpOworICAgIGF1dG8mIFsgeHIyLCB5cjIgXSA9IGYyKCk7CisgICAgY29uc3QgYXV0byBbIHgzLCB5MyBdID0gZjMoKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZXhjZXB0aW9uX3NwZWNfdHlwZV9zeXN0ZW0KKyAgeworCisgICAgc3RydWN0IEdvb2Qge307CisgICAgc3RydWN0IEJhZCB7fTsKKworICAgIHZvaWQgZzEoKSBub2V4Y2VwdDsKKyAgICB2b2lkIGcyKCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEJhZAorICAgIGYoVCosIFQqKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBHb29kCisgICAgZihUMSosIFQyKik7CisKKyAgICBzdGF0aWNfYXNzZXJ0IChzdGQ6OmlzX3NhbWVfdjxHb29kLCBkZWNsdHlwZShmKGcxLCBnMikpPik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2lubGluZV92YXJpYWJsZXMKKyAgeworCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBmKFQpCisgICAge30KKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUIGcoVCkKKyAgICB7CisgICAgICByZXR1cm4gVHt9OworICAgIH0KKworICAgIHRlbXBsYXRlPD4gaW5saW5lIHZvaWQgZjw+KGludCkKKyAgICB7fQorCisgICAgdGVtcGxhdGU8PiBpbnQgZzw+KGludCkKKyAgICB7CisgICAgICByZXR1cm4gNTsKKyAgICB9CisKKyAgfQorCit9ICAvLyBuYW1lc3BhY2UgY3h4MTcKKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cyA8IDIwMTcwM0wKKworXV0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNCBiL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MzNmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApAQCAtMCwwICsxLDM5IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW2V4dHxub2V4dF0sIFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIGZvciBiYXNlbGluZSBsYW5ndWFnZSBjb3ZlcmFnZSBpbiB0aGUgY29tcGlsZXIgZm9yIHRoZSBDKysxMQorIyAgIHN0YW5kYXJkOyBpZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFggYW5kIENYWENQUCB0byBlbmFibGUKKyMgICBzdXBwb3J0LgorIworIyAgIFRoaXMgbWFjcm8gaXMgYSBjb252ZW5pZW5jZSBhbGlhcyBmb3IgY2FsbGluZyB0aGUgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYCisjICAgbWFjcm8gd2l0aCB0aGUgdmVyc2lvbiBzZXQgdG8gQysrMTEuICBUaGUgdHdvIG9wdGlvbmFsIGFyZ3VtZW50cyBhcmUKKyMgICBmb3J3YXJkZWQgbGl0ZXJhbGx5IGFzIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZ3VtZW50IHJlc3BlY3RpdmVseS4KKyMgICBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYIG1hY3JvIGZvcgorIyAgIG1vcmUgaW5mb3JtYXRpb24uICBJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBtYWNybywgeW91IGFsc28gbmVlZCB0bworIyAgIGRvd25sb2FkIHRoZSBheF9jeHhfY29tcGlsZV9zdGRjeHgubTQgZmlsZS4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIgWmFjayBXZWluYmVyZyA8emFja3dAcGFuaXguY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMyBSb3kgU3RvZ25lciA8cm95c3RnbnJAaWNlcy51dGV4YXMuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSBHb29nbGUgSW5jLjsgY29udHJpYnV0ZWQgYnkgQWxleGV5IFNva29sb3YgPHNva29sb3ZAZ29vZ2xlLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUGF1bCBOb3JtYW4gPHBlbm9ybWFuQG1hYy5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IE1vcml0eiBLbGFtbWxlciA8bW9yaXR6QGtsYW1tbGVyLmV1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxOAorCitBWF9SRVFVSVJFX0RFRklORUQoW0FYX0NYWF9DT01QSUxFX1NURENYWF0pCitBQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSwgW0FYX0NYWF9DT01QSUxFX1NURENYWChbMTFdLCBbJDFdLCBbJDJdKV0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2RtZC5tNCBiL2FjbG9jYWwvYXhfZG1kLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjg0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2RtZC5tNApAQCAtMCwwICsxLDEwNyBAQAorZG5sIEBzeW5vcHNpcyBBWF9ETUQKK2RubAorZG5sIFRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIERNRC1jb21wYXRpYmxlIEQyIGNvbXBpbGVyLCBhbmQgKG9wdGlvbmFsbHkpCitkbmwgc3BlY2lmaWVkIG1vZHVsZXMgb24gdGhlIGltcG9ydCBwYXRoLgorZG5sCitkbmwgSWYgIkRNRCIgaXMgZGVmaW5lZCBpbiB0aGUgZW52aXJvbm1lbnQsIHRoYXQgd2lsbCBiZSB0aGUgb25seQorZG5sIGRtZCBjb21tYW5kIHRlc3RlZC4gT3RoZXJ3aXNlLCBhIGhhcmQtY29kZWQgbGlzdCB3aWxsIGJlIHVzZWQuCitkbmwKK2RubCBBZnRlciBBWF9ETUQgcnVucywgdGhlIHNoZWxsIHZhcmlhYmxlcyAic3VjY2VzcyIgYW5kICJheF9kbWQiIGFyZSBzZXQgdG8KK2RubCAieWVzIiBvciAibm8iLCBhbmQgIkRNRCIgaXMgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kLiBGdXJ0aGVybW9yZSwKK2RubCAiZG1kX29wdGxpbmsiIHdpbGwgYmUgc2V0IHRvICJ5ZXMiIG9yICJubyIgZGVwZW5kaW5nIG9uIHdoZXRoZXIgT1BUTElOSyBpcworZG5sIHVzZWQgYXMgdGhlIGxpbmtlciAoRE1EL1dpbmRvd3MpLCBhbmQgImRtZF9vZl9kaXJzZXAiIHdpbGwgYmUgc2V0IHRvIHRoZQorZG5sIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdXNlIHdoZW4gcGFzc2luZyAtb2YgdG8gRE1EIChPUFRMSU5LIHJlcXVpcmVzIGEKK2RubCBiYWNrc2xhc2gpLgorZG5sCitkbmwgQVhfQ0hFQ0tfRF9NT0RVTEUgbXVzdCBiZSBydW4gYWZ0ZXIgQVhfRE1ELiBJdCB0ZXN0cyBmb3IgdGhlIHByZXNlbmNlIG9mIGEKK2RubCBtb2R1bGUgaW4gdGhlIGltcG9ydCBwYXRoIG9mIHRoZSBjaG9zZW4gY29tcGlsZXIsIGFuZCBzZXRzIHRoZSBzaGVsbAorZG5sIHZhcmlhYmxlICJzdWNjZXNzIiB0byAieWVzIiBvciAibm8iLgorZG5sCitkbmwgQGNhdGVnb3J5IEQKK2RubCBAdmVyc2lvbiAyMDExLTA1LTMxCitkbmwgQGxpY2Vuc2UgQWxsUGVybWlzc2l2ZQorZG5sCitkbmwgQ29weXJpZ2h0IChDKSAyMDA5IERhdmlkIFJlaXNzCitkbmwgQ29weXJpZ2h0IChDKSAyMDExIERhdmlkIE5hZGxpbmdlcgorZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCitkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Citkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCisKK0FDX0RFRlVOKFtBWF9ETURdLAorICAgICAgICAgWworICAgICAgICAgIGRubCBIYXJkLWNvZGVkIGRlZmF1bHQgY29tbWFuZHMgdG8gdGVzdC4KKyAgICAgICAgICBETURfUFJPR1M9ImRtZCxnZG1kLGxkbWQiCisKKyAgICAgICAgICBkbmwgQWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZS4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkRE1EIiA7IHRoZW4KKyAgICAgICAgICAgIERNRF9QUk9HUz0iJERNRCIKKyAgICAgICAgICBmaQorCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBETUQpCisKKyAgICAgICAgICAjIHN0ZC5hbGdvcml0aG0gYXMgYSBxdWljayB3YXkgdG8gY2hlY2sgZm9yIEQyL1Bob2Jvcy4KKyAgICAgICAgICBlY2hvICJpbXBvcnQgc3RkLmFsZ29yaXRobTsgdm9pZCBtYWluKCkge30iID4gY29uZmlndGVzdF9heF9kbWQuZAorICAgICAgICAgIHN1Y2Nlc3M9bm8KKyAgICAgICAgICBvSUZTPSIkSUZTIgorCisgICAgICAgICAgSUZTPSIsIgorICAgICAgICAgIGZvciBETUQgaW4gJERNRF9QUk9HUyA7IGRvCisgICAgICAgICAgICBJRlM9IiRvSUZTIgorCisgICAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJERNRCBjb25maWd0ZXN0X2F4X2RtZC5kXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICAgIGlmICRETUQgY29uZmlndGVzdF9heF9kbWQuZCA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCisgICAgICAgICAgICAgIHN1Y2Nlc3M9eWVzCisgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKworICAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzIiAhPSAieWVzIiA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICBETUQ9IiIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICBmaQorCisgICAgICAgICAgYXhfZG1kPSIkc3VjY2VzcyIKKworICAgICAgICAgICMgVGVzdCB3aGV0aGVyIE9QVExJTksgaXMgdXNlZCBieSB0cnlpbmcgaWYgRE1EIGFjY2VwdHMgLUwvPyB3aXRob3V0CisgICAgICAgICAgIyBlcnJvcmluZyBvdXQuCisgICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiID09ICJ5ZXMiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgRE1EIHVzZXMgT1BUTElOSykKKyAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXOKAnSRETUQgLUwvPyBjb25maWd0ZXN0X2F4X2RtZC5kXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICAgIGlmICRETUQgLUwvPyBjb25maWd0ZXN0X2F4X2RtZC5kID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KKyAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgICAgIGRtZF9vcHRsaW5rPSJ5ZXMiCisKKyAgICAgICAgICAgICAgIyBUaGlzIGFjdHVhbGx5IHByb2R1Y2VzIGRvdWJsZSBzbGFzaGVzIGluIHRoZSBmaW5hbCBjb25maWd1cmUKKyAgICAgICAgICAgICAgIyBvdXRwdXQsIGJ1dCBhdCBsZWFzdCBpdCB3b3Jrcy4KKyAgICAgICAgICAgICAgZG1kX29mX2RpcnNlcD0iXFxcXCIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgICAgZG1kX29wdGxpbms9Im5vIgorICAgICAgICAgICAgICBkbWRfb2ZfZGlyc2VwPSIvIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorCisgICAgICAgICAgcm0gLWYgY29uZmlndGVzdF9heF9kbWQqCisgICAgICAgICBdKQorCisKK0FDX0RFRlVOKFtBWF9DSEVDS19EX01PRFVMRV0sCisgICAgICAgICBbCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBEIG1vZHVsZSBbJDFdKQorCisgICAgICAgICAgZWNobyAiaW1wb3J0ICQxOyB2b2lkIG1haW4oKSB7fSIgPiBjb25maWd0ZXN0X2F4X2RtZC5kCisKKyAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJERNRCBjb25maWd0ZXN0X2F4X2RtZC5kXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgICAgICAgICBpZiAkRE1EIC1jIGNvbmZpZ3Rlc3RfYXhfZG1kLmQgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgICBzdWNjZXNzPXllcworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgICAgICBzdWNjZXNzPW5vCisgICAgICAgICAgZmkKKworICAgICAgICAgIHJtIC1mIGNvbmZpZ3Rlc3RfYXhfZG1kKgorICAgICAgICAgXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQgYi9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CmluZGV4IDAzYWIwOGUuLjAyMDM5NjAgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKKysrIGIvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNApAQCAtNyw3ICs3LDcgQEAKIGRubCBqYXZhIGNvbW1hbmQgdGVzdGVkLiAgT3RoZXJ3aXNlLCBhIGhhcmQtY29kZWQgbGlzdCB3aWxsIGJlIHVzZWQuCiBkbmwgU2ltaWxhcmx5IGZvciAiSkFWQUMiLgogZG5sCi1kbmwgQVhfSkFWQUNfQU5EX0pBVkEgZG9lcyBub3QgY3VycmVubHkgc3VwcG9ydCB0ZXN0aW5nIGZvciBhIHBhcnRpY3VsYXIKK2RubCBBWF9KQVZBQ19BTkRfSkFWQSBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCB0ZXN0aW5nIGZvciBhIHBhcnRpY3VsYXIKIGRubCBKYXZhIHZlcnNpb24sIHRlc3RpbmcgZm9yIG9ubHkgb25lIG9mICJqYXZhIiBhbmQgImphdmFjIiwgb3IKIGRubCBjb21waWxpbmcgb3IgcnVubmluZyB1c2VyLXByb3ZpZGVkIEphdmEgY29kZS4KIGRubApAQCAtNTcsNiArNTcsMTAgQEAKICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgXCIkSkFWQUMgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQKICAgICAgICAgICAgIGlmICRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmEgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgogCisgICAgICAgICAgICAgICMgcHJldmVudCAkSkFWQSBWTSBpc3N1ZXMgd2l0aCBVVEYtOCBwYXRoIG5hbWVzIChUSFJJRlQtMzI3MSkKKyAgICAgICAgICAgICAgb0xDX0FMTD0iJExDX0FMTCIKKyAgICAgICAgICAgICAgTENfQUxMPSIiCisKICAgICAgICAgICAgICAgSUZTPSIsIgogICAgICAgICAgICAgICBmb3IgSkFWQSBpbiAkSkFWQV9QUk9HUyA7IGRvCiAgICAgICAgICAgICAgICAgSUZTPSIkb0lGUyIKQEAgLTY5LDYgKzczLDEwIEBACiAKICAgICAgICAgICAgICAgZG9uZQogCisgICAgICAgICAgICAgICMgcmVzdG9yZSBMQ19BTEwKKyAgICAgICAgICAgICAgTENfQUxMPSIkb0xDX0FMTCIKKyAgICAgICAgICAgICAgb0xDX0FMTD0iIgorCiAgICAgICAgICAgICBmaQogCiAgICAgICAgICAgZG9uZQpAQCAtMTA1LDMgKzExMywxNyBAQAogCiAgICAgICAgICAgcm0gLWYgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuY2xhc3MKICAgICAgICAgICBdKQorCisKK0FDX0RFRlVOKFtBWF9DSEVDS19BTlRfVkVSU0lPTl0sCisgICAgICAgICBbCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBhbnQgdmVyc2lvbiA+ICQyKQorICAgICAgICAgIEFOVF9WQUxJRD1gZXhwciAieCQocHJpbnRmICIkMlxuJCgkMSAtdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKnZlcnNpb24gXChAPDpAMC05XC5AOj5AKlwpLiovXDEvcCcpIiB8IHNvcnQgLXQgJy4nIC1rIDEsMSAtayAyLDIgLWsgMywzIC1nIHwgc2VkIC1uIDFwKSIgPSAieCQyImAKKyAgICAgICAgICBpZiB0ZXN0ICJ4JEFOVF9WQUxJRCIgPSAieDEiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIEFOVD0iIgorICAgICAgICAgIGZpCisgICAgICAgICAgXSkKKwpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9saWJfZXZlbnQubTQgYi9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNAppbmRleCA1NmFlZmNjLi5kNGRjZGM5IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNAorKysgYi9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNApAQCAtNzUsMTIgKzc1LDE0IEBACiAgICAgICAgICAgQUNfTEFOR19QVVNIKFtDXSkKICAgICAgICAgICBkbmwgVGhpcyBjYW4gYmUgY2hhbmdlZCB0byBBQ19MSU5LX0lGRUxTRSBpZiB5b3UgYXJlIGNyb3NzLWNvbXBpbGluZywKICAgICAgICAgICBkbmwgYnV0IHRoZW4gdGhlIHZlcnNpb24gY2Fubm90IGJlIGNoZWNrZWQuCi0gICAgICAgICAgQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwogICAgICAgICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICAgICAgICAgICAjaW5jbHVkZSA8ZXZlbnQuaD4KICAgICAgICAgICBdXSwgW1sKICAgICAgICAgICBjb25zdCBjaGFyKiBsaWJfdmVyc2lvbiA9IGV2ZW50X2dldF92ZXJzaW9uKCk7CiAgICAgICAgICAgY29uc3QgY2hhciogd250X3ZlcnNpb24gPSAiJFdBTlRfTElCRVZFTlRfVkVSU0lPTiI7CisgICAgICAgICAgaW50IGxpYl9kaWdpdHM7CisgICAgICAgICAgaW50IHdudF9kaWdpdHM7CiAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB3YW50IHZlcnNpb24uICBXZSBoYXZlIGl0LiAqLwogICAgICAgICAgICAgaWYgKCp3bnRfdmVyc2lvbiA9PSAnXDAnIHx8ICp3bnRfdmVyc2lvbiA9PSAnLScpIHsKQEAgLTkzLDEzICs5NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogSW4gdGhlIDEuNCB2ZXJzaW9uIG51bWJlcmluZyBzdHlsZSwgaWYgdGhlcmUgYXJlIG1vcmUgZGlnaXRzICovCiAgICAgICAgICAgICAvKiBpbiBvbmUgdmVyc2lvbiB0aGFuIHRoZSBvdGhlciwgdGhhdCBvbmUgaXMgaGlnaGVyLiAqLwotICAgICAgICAgICAgaW50IGxpYl9kaWdpdHM7CiAgICAgICAgICAgICBmb3IgKGxpYl9kaWdpdHMgPSAwOwogICAgICAgICAgICAgICAgIGxpYl92ZXJzaW9uW2xpYl9kaWdpdHNdID49ICcwJyAmJgogICAgICAgICAgICAgICAgIGxpYl92ZXJzaW9uW2xpYl9kaWdpdHNdIDw9ICc5JzsKICAgICAgICAgICAgICAgICBsaWJfZGlnaXRzKyspCiAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGludCB3bnRfZGlnaXRzOwogICAgICAgICAgICAgZm9yICh3bnRfZGlnaXRzID0gMDsKICAgICAgICAgICAgICAgICB3bnRfdmVyc2lvblt3bnRfZGlnaXRzXSA+PSAnMCcgJiYKICAgICAgICAgICAgICAgICB3bnRfdmVyc2lvblt3bnRfZGlnaXRzXSA8PSAnOSc7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAogICAgICAgICAgIGRubCBBbGxvdyBzZWFyY2ggcGF0aCB0byBiZSBvdmVycmlkZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgICAgICAgQUNfQVJHX1dJVEgoW2xpYmV2ZW50XSwKLSAgICAgICAgICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLWxpYmV2ZW50QDw6QD1ESVJAOj5AXSwgW3VzZSBsaWJldmVudCAoZGVmYXVsdCBpcyB5ZXMpIC0gaXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgcm9vdCBkaXJlY3RvcnkgZm9yIGxpYmV2ZW50XSksCisgICAgICAgICAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1saWJldmVudEA8OkA9RElSQDo+QF0sIFt1c2UgbGliZXZlbnQgW2RlZmF1bHQ9eWVzXS4gT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSByb290IHByZWZpeCBkaXIgd2hlcmUgbGliZXZlbnQgaXMgaW5zdGFsbGVkXSksCiAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyI7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50X2xpYmV2ZW50PSJubyIKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGF4X2xpYmV2ZW50X3BhdGgiOyB0aGVuCiAgICAgICAgICAgICAgIEFYX0xJQl9FVkVOVF9ET19DSEVDSwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBmb3IgYXhfbGliZXZlbnRfcGF0aCBpbiAiIiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIC9vcHQvbGliZXZlbnQgIiRMSUJFVkVOVF9ST09UIiA7IGRvCisgICAgICAgICAgICAgIGZvciBheF9saWJldmVudF9wYXRoIGluICIiICRsdF9zeXNyb290L3VzciAkbHRfc3lzcm9vdC91c3IvbG9jYWwgJGx0X3N5c3Jvb3Qvb3B0ICRsdF9zeXNyb290L29wdC9sb2NhbCAkbHRfc3lzcm9vdC9vcHQvbGliZXZlbnQgIiRMSUJFVkVOVF9ST09UIiA7IGRvCiAgICAgICAgICAgICAgICAgQVhfTElCX0VWRU5UX0RPX0NIRUNLCiAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiID0gInllcyI7IHRoZW4KICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9saWJfemxpYi5tNCBiL2FjbG9jYWwvYXhfbGliX3psaWIubTQKaW5kZXggOGMxMGFiNC4uYmRiOWUxMSAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9saWJfemxpYi5tNAorKysgYi9hY2xvY2FsL2F4X2xpYl96bGliLm00CkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgIyAgIChkZWZpbmVkIGluIHRoZSBsaWJyYXJ5KS4KICAgICAgICAgICBBQ19MQU5HX1BVU0goW0NdKQogICAgICAgICAgIGRubCBUaGlzIGNhbiBiZSBjaGFuZ2VkIHRvIEFDX0xJTktfSUZFTFNFIGlmIHlvdSBhcmUgY3Jvc3MtY29tcGlsaW5nLgotICAgICAgICAgIEFDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworICAgICAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKICAgICAgICAgICAjaW5jbHVkZSA8emxpYi5oPgogICAgICAgICAgICNpZiBaTElCX1ZFUk5VTSA+PSAweCRXQU5UX1pMSUJfVkVSU0lPTgogICAgICAgICAgICNlbHNlCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2x1YS5tNCBiL2FjbG9jYWwvYXhfbHVhLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjAxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2x1YS5tNApAQCAtMCwwICsxLDY2NCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2x1YS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfTFVBWyhbTUlOSU1VTS1WRVJTSU9OXSwgW1RPTy1CSUctVkVSU0lPTl0sIFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pXQorIyAgIEFYX0xVQV9IRUFERVJTWyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKV0KKyMgICBBWF9MVUFfTElCU1soW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSldCisjICAgQVhfTFVBX1JFQURMSU5FWyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKV0KKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBEZXRlY3QgYSBMdWEgaW50ZXJwcmV0ZXIsIG9wdGlvbmFsbHkgc3BlY2lmeWluZyBhIG1pbmltdW0gYW5kIG1heGltdW0KKyMgICB2ZXJzaW9uIG51bWJlci4gU2V0IHVwIGltcG9ydGFudCBMdWEgcGF0aHMsIHN1Y2ggYXMgdGhlIGRpcmVjdG9yaWVzIGluCisjICAgd2hpY2ggdG8gaW5zdGFsbCBzY3JpcHRzIGFuZCBtb2R1bGVzIChzaGFyZWQgbGlicmFyaWVzKS4KKyMKKyMgICBBbHNvIGRldGVjdCBMdWEgaGVhZGVycyBhbmQgbGlicmFyaWVzLiBUaGUgTHVhIHZlcnNpb24gY29udGFpbmVkIGluIHRoZQorIyAgIGhlYWRlciBpcyBjaGVja2VkIHRvIG1hdGNoIHRoZSBMdWEgaW50ZXJwcmV0ZXIgdmVyc2lvbiBleGFjdGx5LiBXaGVuCisjICAgc2VhcmNoaW5nIGZvciBMdWEgbGlicmFyaWVzLCB0aGUgdmVyc2lvbiBudW1iZXIgaXMgdXNlZCBhcyBhIHN1ZmZpeC4KKyMgICBUaGlzIGlzIGRvbmUgd2l0aCB0aGUgZ29hbCBvZiBzdXBwb3J0aW5nIG11bHRpcGxlIEx1YSBpbnN0YWxscyAoNS4xLAorIyAgIDUuMiwgYW5kIDUuMyBzaWRlLWJ5LXNpZGUpLgorIworIyAgIEEgbm90ZSBvbiBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnM6IFRoaXMgZmlsZSBoYXMgYmVlbgorIyAgIG1vc3RseSByZXdyaXR0ZW4gZm9yIHNlcmlhbCAxOC4gTW9zdCBkZXZlbG9wZXJzIHNob3VsZCBiZSBhYmxlIHRvIHVzZQorIyAgIHRoZXNlIG1hY3JvcyB3aXRob3V0IG5lZWRpbmcgdG8gbW9kaWZ5IGNvbmZpZ3VyZS5hYy4gQ2FyZSBoYXMgYmVlbiB0YWtlbgorIyAgIHRvIHByZXNlcnZlIGVhY2ggbWFjcm8ncyBiZWhhdmlvciwgYnV0IHRoZXJlIGFyZSBzb21lIGRpZmZlcmVuY2VzOgorIworIyAgIDEpIEFYX1dJVEhfTFVBIGlzIGRlcHJlY2F0ZWQ7IGl0IG5vdyBleHBhbmRzIHRvIHRoZSBleGFjdCBzYW1lIHRoaW5nIGFzCisjICAgQVhfUFJPR19MVUEgd2l0aCBubyBhcmd1bWVudHMuCisjCisjICAgMikgQVhfTFVBX0hFQURFUlMgbm93IGNoZWNrcyB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciBkZWZpbmVkIGluIGx1YS5oCisjICAgbWF0Y2hlcyB0aGUgaW50ZXJwcmV0ZXIgdmVyc2lvbi4gQVhfTFVBX0hFQURFUlNfVkVSU0lPTiBpcyB0aGVyZWZvcmUKKyMgICB1bm5lY2Vzc2FyeSwgc28gaXQgaXMgZGVwcmVjYXRlZCBhbmQgZG9lcyBub3QgZXhwYW5kIHRvIGFueXRoaW5nLgorIworIyAgIDMpIFRoZSBjb25maWd1cmUgZmxhZyAtLXdpdGgtbHVhLXN1ZmZpeCBubyBsb25nZXIgZXhpc3RzOyB0aGUgdXNlcgorIyAgIHNob3VsZCBpbnN0ZWFkIHNwZWNpZnkgdGhlIExVQSBwcmVjaW91cyB2YXJpYWJsZSBvbiB0aGUgY29tbWFuZCBsaW5lLgorIyAgIFNlZSB0aGUgQVhfUFJPR19MVUEgZGVzY3JpcHRpb24gZm9yIGRldGFpbHMuCisjCisjICAgUGxlYXNlIHJlYWQgdGhlIG1hY3JvIGRlc2NyaXB0aW9ucyBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMKKyMgICBUaGlzIGZpbGUgd2FzIGluc3BpcmVkIGJ5IEFuZHJldyBEYWxrZSdzIGFuZCBKYW1lcyBIZW5zdHJpZGdlJ3MKKyMgICBweXRob24ubTQgYW5kIFRvbSBQYXluZSdzLCBNYXR0aGlldSBNb3kncywgYW5kIFJldWJlbiBUaG9tYXMncyBheF9sdWEubTQKKyMgICAoc2VyaWFsIDE3KS4gQmFzaWNhbGx5LCB0aGlzIGZpbGUgaXMgYSBtYXNoLXVwIG9mIHRob3NlIHR3byBmaWxlcy4gSQorIyAgIGxpa2UgdG8gdGhpbmsgaXQgY29tYmluZXMgdGhlIGJlc3Qgb2YgdGhlIHR3byEKKyMKKyMgICBBWF9QUk9HX0xVQTogU2VhcmNoIGZvciB0aGUgTHVhIGludGVycHJldGVyLCBhbmQgc2V0IHVwIGltcG9ydGFudCBMdWEKKyMgICBwYXRocy4gQWRkcyBwcmVjaW91cyB2YXJpYWJsZSBMVUEsIHdoaWNoIG1heSBjb250YWluIHRoZSBwYXRoIG9mIHRoZSBMdWEKKyMgICBpbnRlcnByZXRlci4gSWYgTFVBIGlzIGJsYW5rLCB0aGUgdXNlcidzIHBhdGggaXMgc2VhcmNoZWQgZm9yIGFuCisjICAgc3VpdGFibGUgaW50ZXJwcmV0ZXIuCisjCisjICAgSWYgTUlOSU1VTS1WRVJTSU9OIGlzIHN1cHBsaWVkLCB0aGVuIG9ubHkgTHVhIGludGVycHJldGVycyB3aXRoIGEKKyMgICB2ZXJzaW9uIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIE1JTklNVU0tVkVSU0lPTiB3aWxsIGJlIGFjY2VwdGVkLiBJZgorIyAgIFRPTy1CSUctVkVSU0lPTiBpcyBhbHNvIHN1cHBsaWVkLCB0aGVuIG9ubHkgTHVhIGludGVycHJldGVycyB3aXRoIGEKKyMgICB2ZXJzaW9uIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIE1JTklNVU0tVkVSU0lPTiBhbmQgbGVzcyB0aGFuCisjICAgVE9PLUJJRy1WRVJTSU9OIHdpbGwgYmUgYWNjZXB0ZWQuCisjCisjICAgVGhlIEx1YSB2ZXJzaW9uIG51bWJlciwgTFVBX1ZFUlNJT04sIGlzIGZvdW5kIGZyb20gdGhlIGludGVycHJldGVyLCBhbmQKKyMgICBzdWJzdGl0dXRlZC4gTFVBX1BMQVRGT1JNIGlzIGFsc28gZm91bmQsIGJ1dCBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAobm8KKyMgICBzdGFuZGFyZCByZXByZXNlbnRhdGlvbikuCisjCisjICAgRmluYWxseSwgdGhlIG1hY3JvIGZpbmRzIGZvdXIgcGF0aHM6CisjCisjICAgICBsdWFkaXIgICAgICAgICAgICAgRGlyZWN0b3J5IHRvIGluc3RhbGwgTHVhIHNjcmlwdHMuCisjICAgICBwa2dsdWFkaXIgICAgICAgICAgJGx1YWRpci8kUEFDS0FHRQorIyAgICAgbHVhZXhlY2RpciAgICAgICAgIERpcmVjdG9yeSB0byBpbnN0YWxsIEx1YSBtb2R1bGVzLgorIyAgICAgcGtnbHVhZXhlY2RpciAgICAgICRsdWFleGVjZGlyLyRQQUNLQUdFCisjCisjICAgVGhlc2UgcGF0aHMgYXJlIGZvdW5kIGJhc2VkIG9uICRwcmVmaXgsICRleGVjX3ByZWZpeCwgTHVhJ3MKKyMgICBwYWNrYWdlLnBhdGgsIGFuZCBwYWNrYWdlLmNwYXRoLiBUaGUgZmlyc3QgcGF0aCBvZiBwYWNrYWdlLnBhdGgKKyMgICBiZWdpbm5pbmcgd2l0aCAkcHJlZml4IGlzIHNlbGVjdGVkIGFzIGx1YWRpci4gVGhlIGZpcnN0IHBhdGggb2YKKyMgICBwYWNrYWdlLmNwYXRoIGJlZ2lubmluZyB3aXRoICRleGVjX3ByZWZpeCBpcyB1c2VkIGFzIGx1YWV4ZWNkaXIuIFRoaXMKKyMgICBzaG91bGQgd29yayBvbiBhbGwgcmVhc29uYWJsZSBMdWEgaW5zdGFsbGF0aW9ucy4gSWYgYSBwYXRoIGNhbm5vdCBiZQorIyAgIGRldGVybWluZWQsIGEgZGVmYXVsdCBwYXRoIGlzIHVzZWQuIE9mIGNvdXJzZSwgdGhlIHVzZXIgY2FuIG92ZXJyaWRlCisjICAgdGhlc2UgbGF0ZXIgd2hlbiBpbnZva2luZyBtYWtlLgorIworIyAgICAgbHVhZGlyICAgICAgICAgICAgIERlZmF1bHQ6ICRwcmVmaXgvc2hhcmUvbHVhLyRMVUFfVkVSU0lPTgorIyAgICAgbHVhZXhlY2RpciAgICAgICAgIERlZmF1bHQ6ICRleGVjX3ByZWZpeC9saWIvbHVhLyRMVUFfVkVSU0lPTgorIworIyAgIFRoZXNlIGRpcmVjdG9yaWVzIGNhbiBiZSB1c2VkIGJ5IEF1dG9tYWtlIGFzIGluc3RhbGwgZGVzdGluYXRpb25zLiBUaGUKKyMgICB2YXJpYWJsZSBuYW1lIG1pbnVzICdkaXInIG5lZWRzIHRvIGJlIHVzZWQgYXMgYSBwcmVmaXggdG8gdGhlCisjICAgYXBwcm9wcmlhdGUgQXV0b21ha2UgcHJpbWFyeSwgZS5nLiBsdWFfU0NSSVBTIG9yIGx1YWV4ZWNfTElCUkFSSUVTLgorIworIyAgIElmIGFuIGFjY2VwdGFibGUgTHVhIGludGVycHJldGVyIGlzIGZvdW5kLCB0aGVuIEFDVElPTi1JRi1GT1VORCBpcworIyAgIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgcHJlZm9ybWVkLiBJZiBBQ1RJT04tSUYtTk9ULQorIyAgIEZPVU5EIGlzIGJsYW5rLCB0aGVuIGl0IHdpbGwgZGVmYXVsdCB0byBwcmludGluZyBhbiBlcnJvci4gVG8gcHJldmVudAorIyAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBnaXZlICc6JyBhcyBhbiBhY3Rpb24uCisjCisjICAgQVhfTFVBX0hFQURFUlM6IFNlYXJjaCBmb3IgTHVhIGhlYWRlcnMuIFJlcXVpcmVzIHRoYXQgQVhfUFJPR19MVUEgYmUKKyMgICBleHBhbmRlZCBiZWZvcmUgdGhpcyBtYWNyby4gQWRkcyBwcmVjaW91cyB2YXJpYWJsZSBMVUFfSU5DTFVERSwgd2hpY2gKKyMgICBtYXkgY29udGFpbiBMdWEgc3BlY2lmaWMgaW5jbHVkZSBmbGFncywgZS5nLiAtSS91c3IvaW5jbHVkZS9sdWE1LjEuIElmCisjICAgTFVBX0lOQ0xVREUgaXMgYmxhbmssIHRoZW4gdGhpcyBtYWNybyB3aWxsIGF0dGVtcHQgdG8gZmluZCBzdWl0YWJsZQorIyAgIGZsYWdzLgorIworIyAgIExVQV9JTkNMVURFIGNhbiBiZSB1c2VkIGJ5IEF1dG9tYWtlIHRvIGNvbXBpbGUgTHVhIG1vZHVsZXMgb3IKKyMgICBleGVjdXRhYmxlcyB3aXRoIGVtYmVkZGVkIGludGVycHJldGVycy4gVGhlICpfQ1BQRkxBR1MgdmFyaWFibGVzIHNob3VsZAorIyAgIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZSwgZS5nLiBteXByb2dfQ1BQRkxBR1MgPSAkKExVQV9JTkNMVURFKS4KKyMKKyMgICBUaGlzIG1hY3JvIHNlYXJjaGVzIGZvciB0aGUgaGVhZGVyIGx1YS5oIChhbmQgb3RoZXJzKS4gVGhlIHNlYXJjaCBpcworIyAgIHBlcmZvcm1lZCB3aXRoIGEgY29tYmluYXRpb24gb2YgQ1BQRkxBR1MsIENQQVRILCBldGMsIGFuZCBMVUFfSU5DTFVERS4KKyMgICBJZiB0aGUgc2VhcmNoIGlzIHVuc3VjY2Vzc2Z1bCwgdGhlbiBzb21lIGNvbW1vbiBkaXJlY3RvcmllcyBhcmUgdHJpZWQuCisjICAgSWYgdGhlIGhlYWRlcnMgYXJlIHRoZW4gZm91bmQsIHRoZW4gTFVBX0lOQ0xVREUgaXMgc2V0IGFjY29yZGluZ2x5LgorIworIyAgIFRoZSBwYXRocyBhdXRvbWF0aWNhbGx5IHNlYXJjaGVkIGFyZToKKyMKKyMgICAgICogL3Vzci9pbmNsdWRlL2x1YVguWQorIyAgICAgKiAvdXNyL2luY2x1ZGUvbHVhL1guWQorIyAgICAgKiAvdXNyL2luY2x1ZGUvbHVhWFkKKyMgICAgICogL3Vzci9sb2NhbC9pbmNsdWRlL2x1YVguWQorIyAgICAgKiAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhLVguWQorIyAgICAgKiAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhL1guWQorIyAgICAgKiAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhWFkKKyMKKyMgICAoV2hlcmUgWC5ZIGlzIHRoZSBMdWEgdmVyc2lvbiBudW1iZXIsIGUuZy4gNS4xLikKKyMKKyMgICBUaGUgTHVhIHZlcnNpb24gbnVtYmVyIGZvdW5kIGluIHRoZSBoZWFkZXJzIGlzIGFsd2F5cyBjaGVja2VkIHRvIG1hdGNoCisjICAgdGhlIEx1YSBpbnRlcnByZXRlcidzIHZlcnNpb24gbnVtYmVyLiBMdWEgaGVhZGVycyB3aXRoIG1pc21hdGNoZWQKKyMgICB2ZXJzaW9uIG51bWJlcnMgYXJlIG5vdCBhY2NlcHRlZC4KKyMKKyMgICBJZiBoZWFkZXJzIGFyZSBmb3VuZCwgdGhlbiBBQ1RJT04tSUYtRk9VTkQgaXMgcGVyZm9ybWVkLCBvdGhlcndpc2UKKyMgICBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIHBlcmZvcm1lZC4gSWYgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBibGFuaywgdGhlbgorIyAgIGl0IHdpbGwgZGVmYXVsdCB0byBwcmludGluZyBhbiBlcnJvci4gVG8gcHJldmVudCB0aGUgZGVmYXVsdCBiZWhhdmlvciwKKyMgICBzZXQgdGhlIGFjdGlvbiB0byAnOicuCisjCisjICAgQVhfTFVBX0xJQlM6IFNlYXJjaCBmb3IgTHVhIGxpYnJhcmllcy4gUmVxdWlyZXMgdGhhdCBBWF9QUk9HX0xVQSBiZQorIyAgIGV4cGFuZGVkIGJlZm9yZSB0aGlzIG1hY3JvLiBBZGRzIHByZWNpb3VzIHZhcmlhYmxlIExVQV9MSUIsIHdoaWNoIG1heQorIyAgIGNvbnRhaW4gTHVhIHNwZWNpZmljIGxpbmtlciBmbGFncywgZS5nLiAtbGx1YTUuMS4gSWYgTFVBX0xJQiBpcyBibGFuaywKKyMgICB0aGVuIHRoaXMgbWFjcm8gd2lsbCBhdHRlbXB0IHRvIGZpbmQgc3VpdGFibGUgZmxhZ3MuCisjCisjICAgTFVBX0xJQiBjYW4gYmUgdXNlZCBieSBBdXRvbWFrZSB0byBsaW5rIEx1YSBtb2R1bGVzIG9yIGV4ZWN1dGFibGVzIHdpdGgKKyMgICBlbWJlZGRlZCBpbnRlcnByZXRlcnMuIFRoZSAqX0xJQkFERCBhbmQgKl9MREFERCB2YXJpYWJsZXMgc2hvdWxkIGJlIHVzZWQKKyMgICBmb3IgdGhpcyBwdXJwb3NlLCBlLmcuIG15bW9kX0xJQkFERCA9ICQoTFVBX0xJQikuCisjCisjICAgVGhpcyBtYWNybyBzZWFyY2hlcyBmb3IgdGhlIEx1YSBsaWJyYXJ5LiBNb3JlIHRlY2huaWNhbGx5LCBpdCBzZWFyY2hlcworIyAgIGZvciBhIGxpYnJhcnkgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gbHVhX2xvYWQuIFRoZSBzZWFyY2ggaXMgcGVyZm9ybWVkCisjICAgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIExJQlMsIExJQlJBUllfUEFUSCwgYW5kIExVQV9MSUIuCisjCisjICAgSWYgdGhlIHNlYXJjaCBkZXRlcm1pbmVzIHRoYXQgc29tZSBsaW5rZXIgZmxhZ3MgYXJlIG1pc3NpbmcsIHRoZW4gdGhvc2UKKyMgICBmbGFncyB3aWxsIGJlIGFkZGVkIHRvIExVQV9MSUIuCisjCisjICAgSWYgbGlicmFyaWVzIGFyZSBmb3VuZCwgdGhlbiBBQ1RJT04tSUYtRk9VTkQgaXMgcGVyZm9ybWVkLCBvdGhlcndpc2UKKyMgICBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIHBlcmZvcm1lZC4gSWYgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBibGFuaywgdGhlbgorIyAgIGl0IHdpbGwgZGVmYXVsdCB0byBwcmludGluZyBhbiBlcnJvci4gVG8gcHJldmVudCB0aGUgZGVmYXVsdCBiZWhhdmlvciwKKyMgICBzZXQgdGhlIGFjdGlvbiB0byAnOicuCisjCisjICAgQVhfTFVBX1JFQURMSU5FOiBTZWFyY2ggZm9yIHJlYWRsaW5lIGhlYWRlcnMgYW5kIGxpYnJhcmllcy4gUmVxdWlyZXMgdGhlCisjICAgQVhfTElCX1JFQURMSU5FIG1hY3JvLCB3aGljaCBpcyBwcm92aWRlZCBieSBheF9saWJfcmVhZGxpbmUubTQgZnJvbSB0aGUKKyMgICBBdXRvY29uZiBBcmNoaXZlLgorIworIyAgIElmIGEgcmVhZGxpbmUgY29tcGF0aWJsZSBsaWJyYXJ5IGlzIGZvdW5kLCB0aGVuIEFDVElPTi1JRi1GT1VORCBpcworIyAgIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgcGVyZm9ybWVkLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE1IFJldWJlbiBUaG9tYXMgPHJydEBzYzNkLm9yZz4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTQgVGltIFBlcmtpbnMgPHRwcms3N0BnbWFpbC5jb20+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgcmVzcGVjdGl2ZSBBdXRvY29uZiBNYWNybydzIGNvcHlyaWdodCBvd25lcgorIyAgIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSB0aGUgY29uZmlndXJlCisjICAgc2NyaXB0cyB0aGF0IGFyZSB0aGUgb3V0cHV0IG9mIEF1dG9jb25mIHdoZW4gcHJvY2Vzc2luZyB0aGUgTWFjcm8uIFlvdQorIyAgIG5lZWQgbm90IGZvbGxvdyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHdoZW4gdXNpbmcKKyMgICBvciBkaXN0cmlidXRpbmcgc3VjaCBzY3JpcHRzLCBldmVuIHRob3VnaCBwb3J0aW9ucyBvZiB0aGUgdGV4dCBvZiB0aGUKKyMgICBNYWNybyBhcHBlYXIgaW4gdGhlbS4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGRvZXMgZ292ZXJuCisjICAgYWxsIG90aGVyIHVzZSBvZiB0aGUgbWF0ZXJpYWwgdGhhdCBjb25zdGl0dXRlcyB0aGUgQXV0b2NvbmYgTWFjcm8uCisjCisjICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIGFwcGxpZXMgdG8gdmVyc2lvbnMgb2YgdGhlIEF1dG9jb25mCisjICAgTWFjcm8gcmVsZWFzZWQgYnkgdGhlIEF1dG9jb25mIEFyY2hpdmUuIFdoZW4geW91IG1ha2UgYW5kIGRpc3RyaWJ1dGUgYQorIyAgIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEF1dG9jb25mIE1hY3JvLCB5b3UgbWF5IGV4dGVuZCB0aGlzIHNwZWNpYWwKKyMgICBleGNlcHRpb24gdG8gdGhlIEdQTCB0byBhcHBseSB0byB5b3VyIG1vZGlmaWVkIHZlcnNpb24gYXMgd2VsbC4KKworI3NlcmlhbCA0MAorCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEFYX1BST0dfTFVBKFtNSU5JTVVNLVZFUlNJT05dLCBbVE9PLUJJRy1WRVJTSU9OXSwKK2RubCAgICAgICAgICAgICBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtBWF9QUk9HX0xVQV0sCitbCisgIGRubCBDaGVjayBmb3IgcmVxdWlyZWQgdG9vbHMuCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfR1JFUF0pCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfU0VEXSkKKworICBkbmwgTWFrZSBMVUEgYSBwcmVjaW91cyB2YXJpYWJsZS4KKyAgQUNfQVJHX1ZBUihbTFVBXSwgW1RoZSBMdWEgaW50ZXJwcmV0ZXIsIGUuZy4gL3Vzci9iaW4vbHVhNS4xXSkKKworICBkbmwgRmluZCBhIEx1YSBpbnRlcnByZXRlci4KKyAgbTRfZGVmaW5lX2RlZmF1bHQoW19BWF9MVUFfSU5URVJQUkVURVJfTElTVF0sCisgICAgW2x1YSBsdWE1LjMgbHVhNTMgbHVhNS4yIGx1YTUyIGx1YTUuMSBsdWE1MSBsdWE1MF0pCisKKyAgbTRfaWYoWyQxXSwgW10sCisgIFsgZG5sIE5vIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLiBGaW5kIGFueSBMdWEgaW50ZXJwcmV0ZXIuCisgICAgQVNfSUYoW3Rlc3QgIngkTFVBIiA9ICd4J10sCisgICAgICBbQUNfUEFUSF9QUk9HUyhbTFVBXSwgW19BWF9MVUFfSU5URVJQUkVURVJfTElTVF0sIFs6XSldKQorICAgIGF4X2Rpc3BsYXlfTFVBPSdsdWEnCisKKyAgICBBU19JRihbdGVzdCAieCRMVUEiICE9ICd4OiddLAorICAgICAgWyBkbmwgQXQgbGVhc3QgY2hlY2sgaWYgdGhpcyBpcyBhIEx1YSBpbnRlcnByZXRlci4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiAkTFVBIGlzIGEgTHVhIGludGVycHJldGVyXSkKKyAgICAgICAgX0FYX0xVQV9DSEtfSVNfSU5UUlAoWyRMVUFdLAorICAgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgICBBQ19NU0dfRVJST1IoW25vdCBhIEx1YSBpbnRlcnByZXRlcl0pCisgICAgICAgICAgXSkKKyAgICAgIF0pCisgIF0sCisgIFsgZG5sIEEgdmVyc2lvbiBjaGVjayBpcyBuZWVkZWQuCisgICAgQVNfSUYoW3Rlc3QgIngkTFVBIiAhPSAneCddLAorICAgIFsgZG5sIENoZWNrIGlmIHRoaXMgaXMgYSBMdWEgaW50ZXJwcmV0ZXIuCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmICRMVUEgaXMgYSBMdWEgaW50ZXJwcmV0ZXJdKQorICAgICAgX0FYX0xVQV9DSEtfSVNfSU5UUlAoWyRMVUFdLAorICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgICAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICBBQ19NU0dfRVJST1IoW25vdCBhIEx1YSBpbnRlcnByZXRlcl0pCisgICAgICAgIF0pCisgICAgICBkbmwgQ2hlY2sgdGhlIHZlcnNpb24uCisgICAgICBtNF9pZihbJDJdLCBbXSwKKyAgICAgICAgW19heF9jaGVja190ZXh0PSJ3aGV0aGVyICRMVUEgdmVyc2lvbiA+PSAkMSJdLAorICAgICAgICBbX2F4X2NoZWNrX3RleHQ9IndoZXRoZXIgJExVQSB2ZXJzaW9uID49ICQxLCA8ICQyIl0pCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoWyRfYXhfY2hlY2tfdGV4dF0pCisgICAgICBfQVhfTFVBX0NIS19WRVIoWyRMVUFdLCBbJDFdLCBbJDJdLAorICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgICAgICBbIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICBBQ19NU0dfRVJST1IoW3ZlcnNpb24gaXMgb3V0IG9mIHJhbmdlIGZvciBzcGVjaWZpZWQgTFVBXSldKQorICAgICAgYXhfZGlzcGxheV9MVUE9JExVQQorICAgIF0sCisgICAgWyBkbmwgVHJ5IGVhY2ggaW50ZXJwcmV0ZXIgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBzYXRpc2ZpZXMgVkVSU0lPTi4KKyAgICAgIG00X2lmKFskMl0sIFtdLAorICAgICAgICBbX2F4X2NoZWNrX3RleHQ9ImZvciBhIEx1YSBpbnRlcnByZXRlciB3aXRoIHZlcnNpb24gPj0gJDEiXSwKKyAgICAgICAgW19heF9jaGVja190ZXh0PSJmb3IgYSBMdWEgaW50ZXJwcmV0ZXIgd2l0aCB2ZXJzaW9uID49ICQxLCA8ICQyIl0pCisgICAgICBBQ19DQUNIRV9DSEVDSyhbJF9heF9jaGVja190ZXh0XSwKKyAgICAgICAgW2F4X2N2X3BhdGhsZXNzX0xVQV0sCisgICAgICAgIFsgZm9yIGF4X2N2X3BhdGhsZXNzX0xVQSBpbiBfQVhfTFVBX0lOVEVSUFJFVEVSX0xJU1Qgbm9uZTsgZG8KKyAgICAgICAgICAgIHRlc3QgIngkYXhfY3ZfcGF0aGxlc3NfTFVBIiA9ICd4bm9uZScgJiYgYnJlYWsKKyAgICAgICAgICAgIF9BWF9MVUFfQ0hLX0lTX0lOVFJQKFskYXhfY3ZfcGF0aGxlc3NfTFVBXSwgW10sIFtjb250aW51ZV0pCisgICAgICAgICAgICBfQVhfTFVBX0NIS19WRVIoWyRheF9jdl9wYXRobGVzc19MVUFdLCBbJDFdLCBbJDJdLCBbYnJlYWtdKQorICAgICAgICAgIGRvbmUKKyAgICAgICAgXSkKKyAgICAgIGRubCBTZXQgJExVQSB0byB0aGUgYWJzb2x1dGUgcGF0aCBvZiAkYXhfY3ZfcGF0aGxlc3NfTFVBLgorICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfY3ZfcGF0aGxlc3NfTFVBIiA9ICd4bm9uZSddLAorICAgICAgICBbTFVBPSc6J10sCisgICAgICAgIFtBQ19QQVRIX1BST0coW0xVQV0sIFskYXhfY3ZfcGF0aGxlc3NfTFVBXSldKQorICAgICAgYXhfZGlzcGxheV9MVUE9JGF4X2N2X3BhdGhsZXNzX0xVQQorICAgIF0pCisgIF0pCisKKyAgQVNfSUYoW3Rlc3QgIngkTFVBIiA9ICd4OiddLAorICBbIGRubCBSdW4gYW55IHVzZXItc3BlY2lmaWVkIGFjdGlvbiwgb3IgYWJvcnQuCisgICAgbTRfZGVmYXVsdChbJDRdLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBzdWl0YWJsZSBMdWEgaW50ZXJwcmV0ZXJdKV0pCisgIF0sCisgIFsgZG5sIFF1ZXJ5IEx1YSBmb3IgaXRzIHZlcnNpb24gbnVtYmVyLgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGF4X2Rpc3BsYXlfTFVBIHZlcnNpb25dLAorICAgICAgW2F4X2N2X2x1YV92ZXJzaW9uXSwKKyAgICAgIFsgZG5sIEdldCB0aGUgaW50ZXJwcmV0ZXIgdmVyc2lvbiBpbiBYLlkgZm9ybWF0LiBUaGlzIHNob3VsZCB3b3JrIGZvcgorICAgICAgICBkbmwgaW50ZXJwcmV0ZXJzIHZlcnNpb24gNS4wIGFuZCBiZXlvbmQuCisgICAgICAgIGF4X2N2X2x1YV92ZXJzaW9uPVtgJExVQSAtZSAnCisgICAgICAgICAgLS0gcmV0dXJuIGEgdmVyc2lvbiBudW1iZXIgaW4gWC5ZIGZvcm1hdAorICAgICAgICAgIGxvY2FsIF8sIF8sIHZlciA9IHN0cmluZy5maW5kKF9WRVJTSU9OLCAiXkx1YSAoJWQrJS4lZCspIikKKyAgICAgICAgICBwcmludCh2ZXIpJ2BdCisgICAgICBdKQorICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2N2X2x1YV92ZXJzaW9uIiA9ICd4J10sCisgICAgICBbQUNfTVNHX0VSUk9SKFtpbnZhbGlkIEx1YSB2ZXJzaW9uIG51bWJlcl0pXSkKKyAgICBBQ19TVUJTVChbTFVBX1ZFUlNJT05dLCBbJGF4X2N2X2x1YV92ZXJzaW9uXSkKKyAgICBBQ19TVUJTVChbTFVBX1NIT1JUX1ZFUlNJT05dLCBbYGVjaG8gIiRMVUFfVkVSU0lPTiIgfCAkU0VEICdzfFwufHwnYF0pCisKKyAgICBkbmwgVGhlIGZvbGxvd2luZyBjaGVjayBpcyBub3Qgc3VwcG9ydGVkOgorICAgIGRubCBBdCB0aW1lcyAobGlrZSB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMpIHlvdSBtYXkgd2FudCB0byBrbm93CisgICAgZG5sIHdoaWNoIE9TIHBsYXRmb3JtIEx1YSB0aGlua3MgdGhpcyBpcy4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRheF9kaXNwbGF5X0xVQSBwbGF0Zm9ybV0sCisgICAgICBbYXhfY3ZfbHVhX3BsYXRmb3JtXSwKKyAgICAgIFtheF9jdl9sdWFfcGxhdGZvcm09W2AkTFVBIC1lICdwcmludCgidW5rbm93biIpJ2BdXSkKKyAgICBBQ19TVUJTVChbTFVBX1BMQVRGT1JNXSwgWyRheF9jdl9sdWFfcGxhdGZvcm1dKQorCisgICAgZG5sIFVzZSB0aGUgdmFsdWVzIG9mICRwcmVmaXggYW5kICRleGVjX3ByZWZpeCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICBkbmwgdmFsdWVzIG9mIExVQV9QUkVGSVggYW5kIExVQV9FWEVDX1BSRUZJWC4gVGhlc2UgYXJlIG1hZGUgZGlzdGluY3QKKyAgICBkbmwgdmFyaWFibGVzIHNvIHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gaWYgbmVlZCBiZS4gSG93ZXZlciwgdGhlIGdlbmVyYWwKKyAgICBkbmwgY29uc2Vuc3VzIGlzIHRoYXQgeW91IHNob3VsZG4ndCBuZWVkIHRoaXMgYWJpbGl0eS4KKyAgICBBQ19TVUJTVChbTFVBX1BSRUZJWF0sIFsnJHtwcmVmaXh9J10pCisgICAgQUNfU1VCU1QoW0xVQV9FWEVDX1BSRUZJWF0sIFsnJHtleGVjX3ByZWZpeH0nXSkKKworICAgIGRubCBMdWEgcHJvdmlkZXMgbm8gd2F5IHRvIHF1ZXJ5IHRoZSBzY3JpcHQgZGlyZWN0b3J5LCBhbmQgaW5zdGVhZAorICAgIGRubCBwcm92aWRlcyBMVUFfUEFUSC4gSG93ZXZlciwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSBhIHNhZmUgZWR1Y2F0ZWQKKyAgICBkbmwgZ3Vlc3MuIElmIHRoZSBidWlsdC1pbiBzZWFyY2ggcGF0aCBjb250YWlucyBhIGRpcmVjdG9yeSB3aGljaCBpcworICAgIGRubCBwcmVmaXhlZCBieSAkcHJlZml4LCB0aGVuIHdlIGNhbiBzdG9yZSBzY3JpcHRzIHRoZXJlLiBUaGUgZmlyc3QKKyAgICBkbmwgbWF0Y2hpbmcgcGF0aCB3aWxsIGJlIHVzZWQuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYXhfZGlzcGxheV9MVUEgc2NyaXB0IGRpcmVjdG9yeV0sCisgICAgICBbYXhfY3ZfbHVhX2x1YWRpcl0sCisgICAgICBbIEFTX0lGKFt0ZXN0ICJ4JHByZWZpeCIgPSAneE5PTkUnXSwKKyAgICAgICAgICBbYXhfbHVhX3ByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXhdLAorICAgICAgICAgIFtheF9sdWFfcHJlZml4PSRwcmVmaXhdKQorCisgICAgICAgIGRubCBJbml0aWFsaXplIHRvIHRoZSBkZWZhdWx0IHBhdGguCisgICAgICAgIGF4X2N2X2x1YV9sdWFkaXI9IiRMVUFfUFJFRklYL3NoYXJlL2x1YS8kTFVBX1ZFUlNJT04iCisKKyAgICAgICAgZG5sIFRyeSB0byBmaW5kIGEgcGF0aCB3aXRoIHRoZSBwcmVmaXguCisgICAgICAgIF9BWF9MVUFfRk5EX1BSRlhfUFRIKFskTFVBXSwgWyRheF9sdWFfcHJlZml4XSwgW3NjcmlwdF0pCisgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2x1YV9wcmVmaXhlZF9wYXRoIiAhPSAneCddLAorICAgICAgICBbIGRubCBGaXggdGhlIHByZWZpeC4KKyAgICAgICAgICBfYXhfc3RyaXBfcHJlZml4PWBlY2hvICIkYXhfbHVhX3ByZWZpeCIgfCAkU0VEICdzfC58LnxnJ2AKKyAgICAgICAgICBheF9jdl9sdWFfbHVhZGlyPWBlY2hvICIkYXhfbHVhX3ByZWZpeGVkX3BhdGgiIHwgXAorICAgICAgICAgICAgJFNFRCAic3xeJF9heF9zdHJpcF9wcmVmaXh8JExVQV9QUkVGSVh8ImAKKyAgICAgICAgXSkKKyAgICAgIF0pCisgICAgQUNfU1VCU1QoW2x1YWRpcl0sIFskYXhfY3ZfbHVhX2x1YWRpcl0pCisgICAgQUNfU1VCU1QoW3BrZ2x1YWRpcl0sIFtcJHtsdWFkaXJ9LyRQQUNLQUdFXSkKKworICAgIGRubCBMdWEgcHJvdmlkZXMgbm8gd2F5IHRvIHF1ZXJ5IHRoZSBtb2R1bGUgZGlyZWN0b3J5LCBhbmQgaW5zdGVhZAorICAgIGRubCBwcm92aWRlcyBMVUFfUEFUSC4gSG93ZXZlciwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSBhIHNhZmUgZWR1Y2F0ZWQKKyAgICBkbmwgZ3Vlc3MuIElmIHRoZSBidWlsdC1pbiBzZWFyY2ggcGF0aCBjb250YWlucyBhIGRpcmVjdG9yeSB3aGljaCBpcworICAgIGRubCBwcmVmaXhlZCBieSAkZXhlY19wcmVmaXgsIHRoZW4gd2UgY2FuIHN0b3JlIG1vZHVsZXMgdGhlcmUuIFRoZSBmaXJzdAorICAgIGRubCBtYXRjaGluZyBwYXRoIHdpbGwgYmUgdXNlZC4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRheF9kaXNwbGF5X0xVQSBtb2R1bGUgZGlyZWN0b3J5XSwKKyAgICAgIFtheF9jdl9sdWFfbHVhZXhlY2Rpcl0sCisgICAgICBbIEFTX0lGKFt0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9ICd4Tk9ORSddLAorICAgICAgICAgIFtheF9sdWFfZXhlY19wcmVmaXg9JGF4X2x1YV9wcmVmaXhdLAorICAgICAgICAgIFtheF9sdWFfZXhlY19wcmVmaXg9JGV4ZWNfcHJlZml4XSkKKworICAgICAgICBkbmwgSW5pdGlhbGl6ZSB0byB0aGUgZGVmYXVsdCBwYXRoLgorICAgICAgICBheF9jdl9sdWFfbHVhZXhlY2Rpcj0iJExVQV9FWEVDX1BSRUZJWC9saWIvbHVhLyRMVUFfVkVSU0lPTiIKKworICAgICAgICBkbmwgVHJ5IHRvIGZpbmQgYSBwYXRoIHdpdGggdGhlIHByZWZpeC4KKyAgICAgICAgX0FYX0xVQV9GTkRfUFJGWF9QVEgoWyRMVUFdLAorICAgICAgICAgIFskYXhfbHVhX2V4ZWNfcHJlZml4XSwgW21vZHVsZV0pCisgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2x1YV9wcmVmaXhlZF9wYXRoIiAhPSAneCddLAorICAgICAgICBbIGRubCBGaXggdGhlIHByZWZpeC4KKyAgICAgICAgICBfYXhfc3RyaXBfcHJlZml4PWBlY2hvICIkYXhfbHVhX2V4ZWNfcHJlZml4IiB8ICRTRUQgJ3N8LnwufGcnYAorICAgICAgICAgIGF4X2N2X2x1YV9sdWFleGVjZGlyPWBlY2hvICIkYXhfbHVhX3ByZWZpeGVkX3BhdGgiIHwgXAorICAgICAgICAgICAgJFNFRCAic3xeJF9heF9zdHJpcF9wcmVmaXh8JExVQV9FWEVDX1BSRUZJWHwiYAorICAgICAgICBdKQorICAgICAgXSkKKyAgICBBQ19TVUJTVChbbHVhZXhlY2Rpcl0sIFskYXhfY3ZfbHVhX2x1YWV4ZWNkaXJdKQorICAgIEFDX1NVQlNUKFtwa2dsdWFleGVjZGlyXSwgW1wke2x1YWV4ZWNkaXJ9LyRQQUNLQUdFXSkKKworICAgIGRubCBSdW4gYW55IHVzZXIgc3BlY2lmaWVkIGFjdGlvbi4KKyAgICAkMworICBdKQorXSkKKworZG5sIEFYX1dJVEhfTFVBIGlzIG5vdyB0aGUgc2FtZSB0aGluZyBhcyBBWF9QUk9HX0xVQS4KK0FDX0RFRlVOKFtBWF9XSVRIX0xVQV0sCitbCisgIEFDX01TR19XQVJOKFtbJDAgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBBWF9QUk9HX0xVQSBpbnN0ZWFkXV0pCisgIEFYX1BST0dfTFVBCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgX0FYX0xVQV9DSEtfSVNfSU5UUlAoUFJPRywgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW19BWF9MVUFfQ0hLX0lTX0lOVFJQXSwKK1sKKyAgZG5sIEEgbWluaW1hbCBMdWEgZmFjdG9yaWFsIHRvIHByb3ZlIHRoaXMgaXMgYW4gaW50ZXJwcmV0ZXIuIFRoaXMgc2hvdWxkIHdvcmsKKyAgZG5sIGZvciBMdWEgaW50ZXJwcmV0ZXJzIHZlcnNpb24gNS4wIGFuZCBiZXlvbmQuCisgIF9heF9sdWFfZmFjdG9yaWFsPVtgJDEgMj4vZGV2L251bGwgLWUgJworICAgIC0tIGEgc2ltcGxlIGZhY3RvcmlhbAorICAgIGZ1bmN0aW9uIGZhY3QgKG4pCisgICAgICBpZiBuID09IDAgdGhlbgorICAgICAgICByZXR1cm4gMQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gbiAqIGZhY3Qobi0xKQorICAgICAgZW5kCisgICAgZW5kCisgICAgcHJpbnQoImZhY3QoNSkgaXMgIiAuLiBmYWN0KDUpKSdgXQorICBBU19JRihbdGVzdCAiJF9heF9sdWFfZmFjdG9yaWFsIiA9ICdmYWN0KDUpIGlzIDEyMCddLAorICAgIFskMl0sIFskM10pCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgX0FYX0xVQV9DSEtfVkVSKFBST0csIE1JTklNVU0tVkVSU0lPTiwgW1RPTy1CSUctVkVSU0lPTl0sCitkbmwgICAgICAgICAgICAgICAgIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtfQVhfTFVBX0NIS19WRVJdLAorWworICBkbmwgQ2hlY2sgdGhhdCB0aGUgTHVhIHZlcnNpb24gaXMgd2l0aGluIHRoZSBib3VuZHMuIE9ubHkgdGhlIG1ham9yIGFuZCBtaW5vcgorICBkbmwgdmVyc2lvbiBudW1iZXJzIGFyZSBjb25zaWRlcmVkLiBUaGlzIHNob3VsZCB3b3JrIGZvciBMdWEgaW50ZXJwcmV0ZXJzCisgIGRubCB2ZXJzaW9uIDUuMCBhbmQgYmV5b25kLgorICBfYXhfbHVhX2dvb2RfdmVyc2lvbj1bYCQxIC1lICcKKyAgICAtLSBhIHNjcmlwdCB0byBjb21wYXJlIHZlcnNpb25zCisgICAgZnVuY3Rpb24gdmVyc3RyMm51bSh2ZXJzdHIpCisgICAgICBsb2NhbCBfLCBfLCBtYWpvcnZlciwgbWlub3J2ZXIgPSBzdHJpbmcuZmluZCh2ZXJzdHIsICJeKCVkKyklLiglZCspIikKKyAgICAgIGlmIG1ham9ydmVyIGFuZCBtaW5vcnZlciB0aGVuCisgICAgICAgIHJldHVybiB0b251bWJlcihtYWpvcnZlcikgKiAxMDAgKyB0b251bWJlcihtaW5vcnZlcikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGxvY2FsIG1pbnZlciA9IHZlcnN0cjJudW0oIiQyIikKKyAgICBsb2NhbCBfLCBfLCB0cmltdmVyID0gc3RyaW5nLmZpbmQoX1ZFUlNJT04sICJeTHVhICguKikiKQorICAgIGxvY2FsIHZlciA9IHZlcnN0cjJudW0odHJpbXZlcikKKyAgICBsb2NhbCBtYXh2ZXIgPSB2ZXJzdHIybnVtKCIkMyIpIG9yIDFlOQorICAgIGlmIG1pbnZlciA8PSB2ZXIgYW5kIHZlciA8IG1heHZlciB0aGVuCisgICAgICBwcmludCgieWVzIikKKyAgICBlbHNlCisgICAgICBwcmludCgibm8iKQorICAgIGVuZCdgXQorICAgIEFTX0lGKFt0ZXN0ICJ4JF9heF9sdWFfZ29vZF92ZXJzaW9uIiA9ICJ4eWVzIl0sCisgICAgICBbJDRdLCBbJDVdKQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIF9BWF9MVUFfRk5EX1BSRlhfUFRIKFBST0csIFBSRUZJWCwgU0NSSVBULU9SLU1PRFVMRS1ESVIpCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW19BWF9MVUFfRk5EX1BSRlhfUFRIXSwKK1sKKyAgZG5sIEdldCB0aGUgc2NyaXB0IG9yIG1vZHVsZSBkaXJlY3RvcnkgYnkgcXVlcnlpbmcgdGhlIEx1YSBpbnRlcnByZXRlciwKKyAgZG5sIGZpbHRlcmluZyBvbiB0aGUgZ2l2ZW4gcHJlZml4LCBhbmQgc2VsZWN0aW5nIHRoZSBzaGFsbG93ZXN0IHBhdGguIElmIG5vCisgIGRubCBwYXRoIGlzIGZvdW5kIG1hdGNoaW5nIHRoZSBwcmVmaXgsIHRoZSByZXN1bHQgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuCisgIGRubCBUaGUgdGhpcmQgYXJndW1lbnQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBzZWFyY2gsIGl0IGNhbiBiZSAnc2NyaXB0JyBvcgorICBkbmwgJ21vZHVsZScuIFN1cHBseWluZyAnc2NyaXB0JyB3aWxsIHBlcmZvcm0gdGhlIHNlYXJjaCB3aXRoIHBhY2thZ2UucGF0aAorICBkbmwgYW5kIExVQV9QQVRILCBhbmQgc3VwcGx5aW5nICdtb2R1bGUnIHdpbGwgc2VhcmNoIHdpdGggcGFja2FnZS5jcGF0aCBhbmQKKyAgZG5sIExVQV9DUEFUSC4gVGhpcyBpcyBkb25lIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTHVhIDUuMC4KKworICBheF9sdWFfcHJlZml4ZWRfcGF0aD1bYCQxIC1lICcKKyAgICAtLSBnZXQgdGhlIHBhdGggYmFzZWQgb24gc2VhcmNoIHR5cGUKKyAgICBsb2NhbCBzZWFyY2h0eXBlID0gIiQzIgorICAgIGxvY2FsIHBhdGhzID0gIiIKKyAgICBpZiBzZWFyY2h0eXBlID09ICJzY3JpcHQiIHRoZW4KKyAgICAgIHBhdGhzID0gKHBhY2thZ2UgYW5kIHBhY2thZ2UucGF0aCkgb3IgTFVBX1BBVEgKKyAgICBlbHNlaWYgc2VhcmNodHlwZSA9PSAibW9kdWxlIiB0aGVuCisgICAgICBwYXRocyA9IChwYWNrYWdlIGFuZCBwYWNrYWdlLmNwYXRoKSBvciBMVUFfQ1BBVEgKKyAgICBlbmQKKyAgICAtLSBzZWFyY2ggZm9yIHRoZSBwcmVmaXgKKyAgICBsb2NhbCBwcmVmaXggPSAiJyQyJyIKKyAgICBsb2NhbCBtaW5wYXRoID0gIiIKKyAgICBsb2NhbCBtaW5kZXB0aCA9IDFlOQorICAgIHN0cmluZy5nc3ViKHBhdGhzLCAiKEA8OkBeO0A6PkArKSIsCisgICAgICBmdW5jdGlvbiAocGF0aCkKKyAgICAgICAgcGF0aCA9IHN0cmluZy5nc3ViKHBhdGgsICIlPy4qJCIsICIiKQorICAgICAgICBwYXRoID0gc3RyaW5nLmdzdWIocGF0aCwgIi9APDpAXi9AOj5AKiQiLCAiIikKKyAgICAgICAgaWYgc3RyaW5nLmZpbmQocGF0aCwgcHJlZml4KSB0aGVuCisgICAgICAgICAgbG9jYWwgZGVwdGggPSBzdHJpbmcubGVuKHN0cmluZy5nc3ViKHBhdGgsICJAPDpAXi9AOj5AIiwgIiIpKQorICAgICAgICAgIGlmIGRlcHRoIDwgbWluZGVwdGggdGhlbgorICAgICAgICAgICAgbWlucGF0aCA9IHBhdGgKKyAgICAgICAgICAgIG1pbmRlcHRoID0gZGVwdGgKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQpCisgICAgcHJpbnQobWlucGF0aCknYF0KK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBBWF9MVUFfSEVBREVSUyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtBWF9MVUFfSEVBREVSU10sCitbCisgIGRubCBDaGVjayBmb3IgTFVBX1ZFUlNJT04uCisgIEFDX01TR19DSEVDS0lORyhbaWYgTFVBX1ZFUlNJT04gaXMgZGVmaW5lZF0pCisgIEFTX0lGKFt0ZXN0ICJ4JExVQV9WRVJTSU9OIiAhPSAneCddLAorICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBjaGVjayBMdWEgaGVhZGVycyB3aXRob3V0IGtub3dpbmcgTFVBX1ZFUlNJT05dKQorICAgIF0pCisKKyAgZG5sIE1ha2UgTFVBX0lOQ0xVREUgYSBwcmVjaW91cyB2YXJpYWJsZS4KKyAgQUNfQVJHX1ZBUihbTFVBX0lOQ0xVREVdLCBbVGhlIEx1YSBpbmNsdWRlcywgZS5nLiAtSS91c3IvaW5jbHVkZS9sdWE1LjFdKQorCisgIGRubCBTb21lIGRlZmF1bHQgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLgorICBMVUFfU0hPUlRfVkVSU0lPTj1gZWNobyAiJExVQV9WRVJTSU9OIiB8ICRTRUQgJ3N8XC58fCdgCisgIG00X2RlZmluZV9kZWZhdWx0KFtfQVhfTFVBX0lOQ0xVREVfTElTVF0sCisgICAgWyAvdXNyL2luY2x1ZGUvbHVhJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvaW5jbHVkZS9sdWEtJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvaW5jbHVkZS9sdWEvJExVQV9WRVJTSU9OIFwKKyAgICAgIC91c3IvaW5jbHVkZS9sdWEkTFVBX1NIT1JUX1ZFUlNJT04gXAorICAgICAgL3Vzci9sb2NhbC9pbmNsdWRlL2x1YSRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhLSRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhLyRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2xvY2FsL2luY2x1ZGUvbHVhJExVQV9TSE9SVF9WRVJTSU9OIFwKKyAgICBdKQorCisgIGRubCBUcnkgdG8gZmluZCB0aGUgaGVhZGVycy4KKyAgX2F4X2x1YV9zYXZlZF9jcHBmbGFncz0kQ1BQRkxBR1MKKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkTFVBX0lOQ0xVREUiCisgIEFDX0NIRUNLX0hFQURFUlMoW2x1YS5oIGx1YWxpYi5oIGxhdXhsaWIuaCBsdWFjb25mLmhdKQorICBDUFBGTEFHUz0kX2F4X2x1YV9zYXZlZF9jcHBmbGFncworCisgIGRubCBUcnkgc29tZSBvdGhlciBkaXJlY3RvcmllcyBpZiBMVUFfSU5DTFVERSB3YXMgbm90IHNldC4KKyAgQVNfSUYoW3Rlc3QgIngkTFVBX0lOQ0xVREUiID0gJ3gnICYmCisgICAgICAgICB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sdWFfaCIgIT0gJ3h5ZXMnXSwKKyAgICBbIGRubCBUcnkgc29tZSBjb21tb24gaW5jbHVkZSBwYXRocy4KKyAgICAgIGZvciBfYXhfaW5jbHVkZV9wYXRoIGluIF9BWF9MVUFfSU5DTFVERV9MSVNUOyBkbworICAgICAgICB0ZXN0ICEgLWQgIiRfYXhfaW5jbHVkZV9wYXRoIiAmJiBjb250aW51ZQorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIEx1YSBoZWFkZXJzIGluXSkKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbJF9heF9pbmNsdWRlX3BhdGhdKQorCisgICAgICAgIEFTX1VOU0VUKFthY19jdl9oZWFkZXJfbHVhX2hdKQorICAgICAgICBBU19VTlNFVChbYWNfY3ZfaGVhZGVyX2x1YWxpYl9oXSkKKyAgICAgICAgQVNfVU5TRVQoW2FjX2N2X2hlYWRlcl9sYXV4bGliX2hdKQorICAgICAgICBBU19VTlNFVChbYWNfY3ZfaGVhZGVyX2x1YWNvbmZfaF0pCisKKyAgICAgICAgX2F4X2x1YV9zYXZlZF9jcHBmbGFncz0kQ1BQRkxBR1MKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtSSRfYXhfaW5jbHVkZV9wYXRoIgorICAgICAgICBBQ19DSEVDS19IRUFERVJTKFtsdWEuaCBsdWFsaWIuaCBsYXV4bGliLmggbHVhY29uZi5oXSkKKyAgICAgICAgQ1BQRkxBR1M9JF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3MKKworICAgICAgICBBU19JRihbdGVzdCAieCRhY19jdl9oZWFkZXJfbHVhX2giID0gJ3h5ZXMnXSwKKyAgICAgICAgICBbIExVQV9JTkNMVURFPSItSSRfYXhfaW5jbHVkZV9wYXRoIgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICBdKQorICAgICAgZG9uZQorICAgIF0pCisKKyAgQVNfSUYoW3Rlc3QgIngkYWNfY3ZfaGVhZGVyX2x1YV9oIiA9ICd4eWVzJ10sCisgICAgWyBkbmwgTWFrZSBhIHByb2dyYW0gdG8gcHJpbnQgTFVBX1ZFUlNJT04gZGVmaW5lZCBpbiB0aGUgaGVhZGVyLgorICAgICAgZG5sIFRPRE8gSXQgd291bGQgYmUgcmVhbGx5IG5pY2UgaWYgd2UgY291bGQgZG8gdGhpcyB3aXRob3V0IGNvbXBpbGluZyBhCisgICAgICBkbmwgcHJvZ3JhbSwgdGhlbiBpdCB3b3VsZCB3b3JrIHdoZW4gY3Jvc3MgY29tcGlsaW5nLiBCdXQgSSdtIG5vdCBzdXJlIGhvdworICAgICAgZG5sIHRvIGRvIHRoaXMgcmVsaWFibHkuIEZvciBub3csIGFzc3VtZSB2ZXJzaW9ucyBtYXRjaCB3aGVuIGNyb3NzIGNvbXBpbGluZy4KKworICAgICAgQVNfSUYoW3Rlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiAhPSAneHllcyddLAorICAgICAgICBbIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTHVhIGhlYWRlciB2ZXJzaW9uXSwKKyAgICAgICAgICAgIFtheF9jdl9sdWFfaGVhZGVyX3ZlcnNpb25dLAorICAgICAgICAgICAgWyBfYXhfbHVhX3NhdmVkX2NwcGZsYWdzPSRDUFBGTEFHUworICAgICAgICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRMVUFfSU5DTFVERSIKKyAgICAgICAgICAgICAgQUNfUlVOX0lGRUxTRSgKKyAgICAgICAgICAgICAgICBbIEFDX0xBTkdfU09VUkNFKFtbCisjaW5jbHVkZSA8bHVhLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCit7CisgIGlmKGFyZ2MgPiAxKSBwcmludGYoIiVzIiwgTFVBX1ZFUlNJT04pOworICBleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CitdXSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIFsgYXhfY3ZfbHVhX2hlYWRlcl92ZXJzaW9uPWAuL2NvbmZ0ZXN0JEVYRUVYVCBwIHwgXAorICAgICAgICAgICAgICAgICAgICAkU0VEIC1uICJzfF5MdWEgXChAPDpAMC05QDo+QFx7MSxcfVwuQDw6QDAtOUA6PkBcezEsXH1cKS5cezAsXH18XDF8cCJgCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbYXhfY3ZfbHVhX2hlYWRlcl92ZXJzaW9uPSd1bmtub3duJ10pCisgICAgICAgICAgICAgIENQUEZMQUdTPSRfYXhfbHVhX3NhdmVkX2NwcGZsYWdzCisgICAgICAgICAgICBdKQorCisgICAgICAgICAgZG5sIENvbXBhcmUgdGhpcyB0byB0aGUgcHJldmlvdXNseSBmb3VuZCBMVUFfVkVSU0lPTi4KKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIEx1YSBoZWFkZXIgdmVyc2lvbiBtYXRjaGVzICRMVUFfVkVSU0lPTl0pCisgICAgICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfY3ZfbHVhX2hlYWRlcl92ZXJzaW9uIiA9ICJ4JExVQV9WRVJTSU9OIl0sCisgICAgICAgICAgICBbIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgICAgIGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoPSd5ZXMnCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgICAgIGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoPSdubycKKyAgICAgICAgICAgIF0pCisgICAgICAgIF0sCisgICAgICAgIFsgQUNfTVNHX1dBUk4oW2Nyb3NzIGNvbXBpbGluZyBzbyBhc3N1bWluZyBoZWFkZXIgdmVyc2lvbiBudW1iZXIgbWF0Y2hlc10pCisgICAgICAgICAgYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2g9J3llcycKKyAgICAgICAgXSkKKyAgICBdKQorCisgIGRubCBXYXMgTFVBX0lOQ0xVREUgc3BlY2lmaWVkPworICBBU19JRihbdGVzdCAieCRheF9oZWFkZXJfdmVyc2lvbl9tYXRjaCIgIT0gJ3h5ZXMnICYmCisgICAgICAgICB0ZXN0ICJ4JExVQV9JTkNMVURFIiAhPSAneCddLAorICAgIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIGhlYWRlcnMgZm9yIHNwZWNpZmllZCBMVUFfSU5DTFVERV0pXSkKKworICBkbmwgVGVzdCB0aGUgZmluYWwgcmVzdWx0IGFuZCBydW4gdXNlciBjb2RlLgorICBBU19JRihbdGVzdCAieCRheF9oZWFkZXJfdmVyc2lvbl9tYXRjaCIgPSAneHllcyddLCBbJDFdLAorICAgIFttNF9kZWZhdWx0KFskMl0sIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIEx1YSBpbmNsdWRlc10pXSldKQorXSkKKworZG5sIEFYX0xVQV9IRUFERVJTX1ZFUlNJT04gbm8gbG9uZ2VyIGV4aXN0cywgdXNlIEFYX0xVQV9IRUFERVJTLgorQUNfREVGVU4oW0FYX0xVQV9IRUFERVJTX1ZFUlNJT05dLAorWworICBBQ19NU0dfV0FSTihbWyQwIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgQVhfTFVBX0hFQURFUlMgaW5zdGVhZF1dKQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEFYX0xVQV9MSUJTKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQUNfREVGVU4oW0FYX0xVQV9MSUJTXSwKK1sKKyAgZG5sIFRPRE8gU2hvdWxkIHRoaXMgbWFjcm8gYWxzbyBjaGVjayB2YXJpb3VzIC1MIGZsYWdzPworCisgIGRubCBDaGVjayBmb3IgTFVBX1ZFUlNJT04uCisgIEFDX01TR19DSEVDS0lORyhbaWYgTFVBX1ZFUlNJT04gaXMgZGVmaW5lZF0pCisgIEFTX0lGKFt0ZXN0ICJ4JExVQV9WRVJTSU9OIiAhPSAneCddLAorICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBjaGVjayBMdWEgbGlicyB3aXRob3V0IGtub3dpbmcgTFVBX1ZFUlNJT05dKQorICAgIF0pCisKKyAgZG5sIE1ha2UgTFVBX0xJQiBhIHByZWNpb3VzIHZhcmlhYmxlLgorICBBQ19BUkdfVkFSKFtMVUFfTElCXSwgW1RoZSBMdWEgbGlicmFyeSwgZS5nLiAtbGx1YTUuMV0pCisKKyAgQVNfSUYoW3Rlc3QgIngkTFVBX0xJQiIgIT0gJ3gnXSwKKyAgWyBkbmwgQ2hlY2sgdGhhdCBMVUFfTElCUyB3b3Jrcy4KKyAgICBfYXhfbHVhX3NhdmVkX2xpYnM9JExJQlMKKyAgICBMSUJTPSIkTElCUyAkTFVBX0xJQiIKKyAgICBBQ19TRUFSQ0hfTElCUyhbbHVhX2xvYWRdLCBbXSwKKyAgICAgIFtfYXhfZm91bmRfbHVhX2xpYnM9J3llcyddLAorICAgICAgW19heF9mb3VuZF9sdWFfbGlicz0nbm8nXSkKKyAgICBMSUJTPSRfYXhfbHVhX3NhdmVkX2xpYnMKKworICAgIGRubCBDaGVjayB0aGUgcmVzdWx0LgorICAgIEFTX0lGKFt0ZXN0ICJ4JF9heF9mb3VuZF9sdWFfbGlicyIgIT0gJ3h5ZXMnXSwKKyAgICAgIFtBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIGxpYnMgZm9yIHNwZWNpZmllZCBMVUFfTElCXSldKQorICBdLAorICBbIGRubCBGaXJzdCBzZWFyY2ggZm9yIGV4dHJhIGxpYnMuCisgICAgX2F4X2x1YV9leHRyYV9saWJzPScnCisKKyAgICBfYXhfbHVhX3NhdmVkX2xpYnM9JExJQlMKKyAgICBMSUJTPSIkTElCUyAkTFVBX0xJQiIKKyAgICBBQ19TRUFSQ0hfTElCUyhbZXhwXSwgW21dKQorICAgIEFDX1NFQVJDSF9MSUJTKFtkbG9wZW5dLCBbZGxdKQorICAgIExJQlM9JF9heF9sdWFfc2F2ZWRfbGlicworCisgICAgQVNfSUYoW3Rlc3QgIngkYWNfY3Zfc2VhcmNoX2V4cCIgIT0gJ3hubycgJiYKKyAgICAgICAgICAgdGVzdCAieCRhY19jdl9zZWFyY2hfZXhwIiAhPSAneG5vbmUgcmVxdWlyZWQnXSwKKyAgICAgIFtfYXhfbHVhX2V4dHJhX2xpYnM9IiRfYXhfbHVhX2V4dHJhX2xpYnMgJGFjX2N2X3NlYXJjaF9leHAiXSkKKworICAgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9kbG9wZW4iICE9ICd4bm8nICYmCisgICAgICAgICAgIHRlc3QgIngkYWNfY3Zfc2VhcmNoX2Rsb3BlbiIgIT0gJ3hub25lIHJlcXVpcmVkJ10sCisgICAgICBbX2F4X2x1YV9leHRyYV9saWJzPSIkX2F4X2x1YV9leHRyYV9saWJzICRhY19jdl9zZWFyY2hfZGxvcGVuIl0pCisKKyAgICBkbmwgVHJ5IHRvIGZpbmQgdGhlIEx1YSBsaWJzLgorICAgIF9heF9sdWFfc2F2ZWRfbGlicz0kTElCUworICAgIExJQlM9IiRMSUJTICRMVUFfTElCIgorICAgIEFDX1NFQVJDSF9MSUJTKFtsdWFfbG9hZF0sCisgICAgICBbIGx1YSRMVUFfVkVSU0lPTiBcCisgICAgICAgIGx1YSRMVUFfU0hPUlRfVkVSU0lPTiBcCisgICAgICAgIGx1YS0kTFVBX1ZFUlNJT04gXAorICAgICAgICBsdWEtJExVQV9TSE9SVF9WRVJTSU9OIFwKKyAgICAgICAgbHVhIFwKKyAgICAgIF0sCisgICAgICBbX2F4X2ZvdW5kX2x1YV9saWJzPSd5ZXMnXSwKKyAgICAgIFtfYXhfZm91bmRfbHVhX2xpYnM9J25vJ10sCisgICAgICBbJF9heF9sdWFfZXh0cmFfbGlic10pCisgICAgTElCUz0kX2F4X2x1YV9zYXZlZF9saWJzCisKKyAgICBBU19JRihbdGVzdCAieCRhY19jdl9zZWFyY2hfbHVhX2xvYWQiICE9ICd4bm8nICYmCisgICAgICAgICAgIHRlc3QgIngkYWNfY3Zfc2VhcmNoX2x1YV9sb2FkIiAhPSAneG5vbmUgcmVxdWlyZWQnXSwKKyAgICAgIFtMVUFfTElCPSIkYWNfY3Zfc2VhcmNoX2x1YV9sb2FkICRfYXhfbHVhX2V4dHJhX2xpYnMiXSkKKyAgXSkKKworICBkbmwgVGVzdCB0aGUgcmVzdWx0IGFuZCBydW4gdXNlciBjb2RlLgorICBBU19JRihbdGVzdCAieCRfYXhfZm91bmRfbHVhX2xpYnMiID0gJ3h5ZXMnXSwgWyQxXSwKKyAgICBbbTRfZGVmYXVsdChbJDJdLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBMdWEgbGlic10pXSldKQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIEFYX0xVQV9SRUFETElORShbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtBWF9MVUFfUkVBRExJTkVdLAorWworICBBWF9MSUJfUkVBRExJTkUKKyAgQVNfSUYoW3Rlc3QgIngkYWNfY3ZfaGVhZGVyX3JlYWRsaW5lX3JlYWRsaW5lX2giICE9ICd4JyAmJgorICAgICAgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfcmVhZGxpbmVfaGlzdG9yeV9oIiAhPSAneCddLAorICAgIFsgTFVBX0xJQlNfQ0ZMQUdTPSItRExVQV9VU0VfUkVBRExJTkUgJExVQV9MSUJTX0NGTEFHUyIKKyAgICAgICQxCisgICAgXSwKKyAgICBbJDJdKQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzc0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsNjEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFtWRVJTSU9OXSxbQUNUSU9OLUlGLVRSVUVdLFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIE1ha2VzIHN1cmUgdGhhdCAuTkVUIENvcmUgc3VwcG9ydHMgdGhlIHZlcnNpb24gaW5kaWNhdGVkLiBJZiB0cnVlIHRoZQorIyAgIHNoZWxsIGNvbW1hbmRzIGluIEFDVElPTi1JRi1UUlVFIGFyZSBleGVjdXRlZC4gSWYgbm90IHRoZSBzaGVsbCBjb21tYW5kcworIyAgIGluIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgJGRvdG5ldGNvcmVfdmVyc2lvbiB2YXJpYWJsZSB3aWxsIGJlCisjICAgZmlsbGVkIHdpdGggdGhlIGRldGVjdGVkIHZlcnNpb24uCisjCisjICAgVGhpcyBtYWNybyB1c2VzIHRoZSAkRE9UTkVUQ09SRSB2YXJpYWJsZSB0byBwZXJmb3JtIHRoZSBjaGVjay4gSWYKKyMgICAkRE9UTkVUQ09SRSBpcyBub3Qgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtYWNybywgdGhlIG1hY3JvIHdpbGwgZmFpbC4KKyMKKyMgICBFeGFtcGxlOgorIworIyAgICAgQUNfUEFUSF9QUk9HKFtET1RORVRDT1JFXSxbZG90bmV0XSkKKyMgICAgIEFDX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFsxLjAuMl0sWyAuLi4gXSxbIC4uLiBdKQorIworIyAgIFNlYXJjaGVzIGZvciAuTkVUIENvcmUsIHRoZW4gY2hlY2tzIGlmIGF0IGxlYXN0IHZlcnNpb24gMS4wLjIgaXMKKyMgICBwcmVzZW50LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE2IEplbnMgR2V5ZXIgPGplbnNnQGFwYWNoZS5vcmc+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDIKKworQUNfREVGVU4oW0FYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OXSxbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorCisgICAgQVNfSUYoW3Rlc3QgLW4gIiRET1RORVRDT1JFIl0sWworICAgICAgICBheF9kb3RuZXRjb3JlX3ZlcnNpb249IiQxIgorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIC5ORVQgQ29yZSB2ZXJzaW9uXSkKKyAgICAgICAgZG90bmV0Y29yZV92ZXJzaW9uPWAkRE9UTkVUQ09SRSAtLXZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChAPDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXClcKC4qXCkvXDEvJ2AKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkZG90bmV0Y29yZV92ZXJzaW9uKQorCisJICAgIEFDX1NVQlNUKFtET1RORVRDT1JFX1ZFUlNJT05dLFskZG90bmV0Y29yZV92ZXJzaW9uXSkKKworICAgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9kb3RuZXRjb3JlX3ZlcnNpb25dLFtsZV0sWyRkb3RuZXRjb3JlX3ZlcnNpb25dLFsKKwkgICAgOgorICAgICAgICAgICAgJDIKKyAgICAgICAgXSxbCisJICAgIDoKKyAgICAgICAgICAgICQzCisgICAgICAgIF0pCisgICAgXSxbCisgICAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCAuTkVUIENvcmVdKQorICAgICAgICAkMworICAgIF0pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfcHJvZ19oYXhlX3ZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhY2M2NwotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfcHJvZ19oYXhlX3ZlcnNpb24ubTQKQEAgLTAsMCArMSw2MCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19oYXhlX3ZlcnNpb24uaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9QUk9HX0hBWEVfVkVSU0lPTihbVkVSU0lPTl0sW0FDVElPTi1JRi1UUlVFXSxbQUNUSU9OLUlGLUZBTFNFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBNYWtlcyBzdXJlIHRoYXQgaGF4ZSBzdXBwb3J0cyB0aGUgdmVyc2lvbiBpbmRpY2F0ZWQuIElmIHRydWUgdGhlIHNoZWxsCisjICAgY29tbWFuZHMgaW4gQUNUSU9OLUlGLVRSVUUgYXJlIGV4ZWN1dGVkLiBJZiBub3QgdGhlIHNoZWxsIGNvbW1hbmRzIGluCisjICAgQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIFRoZSAkSEFYRV9WRVJTSU9OIHZhcmlhYmxlIHdpbGwgYmUgZmlsbGVkIHdpdGgKKyMgICB0aGUgZGV0ZWN0ZWQgdmVyc2lvbi4KKyMKKyMgICBUaGlzIG1hY3JvIHVzZXMgdGhlICRIQVhFIHZhcmlhYmxlIHRvIHBlcmZvcm0gdGhlIGNoZWNrLiBJZiAkSEFYRSBpcyBub3QKKyMgICBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIG1hY3JvLCB0aGUgbWFjcm8gd2lsbCBmYWlsLgorIworIyAgIEV4YW1wbGU6CisjCisjICAgICBBQ19QQVRIX1BST0coW0hBWEVdLFtoYXhlXSkKKyMgICAgIEFDX1BST0dfSEFYRV9WRVJTSU9OKFszLjEuM10sWyAuLi4gXSxbIC4uLiBdKQorIworIyAgIFNlYXJjaGVzIGZvciBIYXhlLCB0aGVuIGNoZWNrcyBpZiBhdCBsZWFzdCB2ZXJzaW9uIDMuMS4zIGlzIHByZXNlbnQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgSmVucyBHZXllciA8amVuc2dAYXBhY2hlLm9yZz4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMgorCitBQ19ERUZVTihbQVhfUFJPR19IQVhFX1ZFUlNJT05dLFsKKyAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pCisKKyAgICBBU19JRihbdGVzdCAtbiAiJEhBWEUiXSxbCisgICAgICAgIGF4X2hheGVfdmVyc2lvbj0iJDEiCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaGF4ZSB2ZXJzaW9uXSkKKyAgICAgICAgaGF4ZV92ZXJzaW9uPWAkSEFYRSAtdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9eLiogXCggQDw6QDAtOUA6PkAqXC5APDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwpIC4qL1wxLydgCisgICAgICAgIEFDX01TR19SRVNVTFQoJGhheGVfdmVyc2lvbikKKworCSAgICBBQ19TVUJTVChbSEFYRV9WRVJTSU9OXSxbJGhheGVfdmVyc2lvbl0pCisKKyAgICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskYXhfaGF4ZV92ZXJzaW9uXSxbbGVdLFskaGF4ZV92ZXJzaW9uXSxbCisJICAgIDoKKyAgICAgICAgICAgICQyCisgICAgICAgIF0sWworCSAgICA6CisgICAgICAgICAgICAkMworICAgICAgICBdKQorICAgIF0sWworICAgICAgICBBQ19NU0dfV0FSTihbY291bGQgbm90IGZpbmQgSGF4ZV0pCisgICAgICAgICQzCisgICAgXSkKK10pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00IGIvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGIzMjMwCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNApAQCAtMCwwICsxLDc3IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX3BlcmxfbW9kdWxlcy5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfUEVSTF9NT0RVTEVTKFtNT0RVTEVTXSwgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gcGVybCBtb2R1bGVzIGFyZSBhdmFpbGFibGUuIElmIHRydWUgdGhlIHNoZWxsCisjICAgY29tbWFuZHMgaW4gQUNUSU9OLUlGLVRSVUUgYXJlIGV4ZWN1dGVkLiBJZiBub3QgdGhlIHNoZWxsIGNvbW1hbmRzIGluCisjICAgQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIE5vdGUgaWYgJFBFUkwgaXMgbm90IHNldCAoZm9yIGV4YW1wbGUgYnkKKyMgICBjYWxsaW5nIEFDX0NIRUNLX1BST0csIG9yIEFDX1BBVEhfUFJPRyksIEFDX0NIRUNLX1BST0coUEVSTCwgcGVybCwgcGVybCkKKyMgICB3aWxsIGJlIHJ1bi4KKyMKKyMgICBNT0RVTEVTIGlzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIG5hbWVzLiBUbyBjaGVjayBmb3IgYQorIyAgIG1pbmltdW0gdmVyc2lvbiBvZiBhIG1vZHVsZSwgYXBwZW5kIHRoZSB2ZXJzaW9uIG51bWJlciB0byB0aGUgbW9kdWxlCisjICAgbmFtZSwgc2VwYXJhdGVkIGJ5IGFuIGVxdWFscyBzaWduLgorIworIyAgIEV4YW1wbGU6CisjCisjICAgICBBWF9QUk9HX1BFUkxfTU9EVUxFUyggVGV4dDo6V3JhcCBOZXQ6OkxEQVA9MS4wLjMsICwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19NU0dfV0FSTihOZWVkIHNvbWUgUGVybCBtb2R1bGVzKQorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA5IERlYW4gUG92ZXkgPHBvdmV5QHdlZGdldGFpbC5jb20+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDgKKworQVVfQUxJQVMoW0FDX1BST0dfUEVSTF9NT0RVTEVTXSwgW0FYX1BST0dfUEVSTF9NT0RVTEVTXSkKK0FDX0RFRlVOKFtBWF9QUk9HX1BFUkxfTU9EVUxFU10sW2RubAorCittNF9kZWZpbmUoW2F4X3BlcmxfbW9kdWxlc10pCittNF9mb3JlYWNoKFtheF9wZXJsX21vZHVsZV0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDFdKSksCisJICBbCisJICAgbTRfYXBwZW5kKFtheF9wZXJsX21vZHVsZXNdLAorCQkgICAgIFsnXW00X2JwYXRzdWJzdChheF9wZXJsX21vZHVsZSw9LFsgXSlbJyBdKQorICAgICAgICAgIF0pCisKKyMgTWFrZSBzdXJlIHdlIGhhdmUgcGVybAoraWYgdGVzdCAteiAiJFBFUkwiOyB0aGVuCitBQ19DSEVDS19QUk9HKFBFUkwscGVybCxwZXJsKQorZmkKKworaWYgdGVzdCAieCRQRVJMIiAhPSB4OyB0aGVuCisgIGF4X3BlcmxfbW9kdWxlc19mYWlsZWQ9MAorICBmb3IgYXhfcGVybF9tb2R1bGUgaW4gYXhfcGVybF9tb2R1bGVzOyBkbworICAgIEFDX01TR19DSEVDS0lORyhmb3IgcGVybCBtb2R1bGUgJGF4X3BlcmxfbW9kdWxlKQorCisgICAgIyBXb3VsZCBiZSBuaWNlIHRvIGxvZyByZXN1bHQgaGVyZSwgYnV0IGNhbid0IHJlbHkgb24gYXV0b2NvbmYgaW50ZXJuYWxzCisgICAgJFBFUkwgLWUgInVzZSAkYXhfcGVybF9tb2R1bGU7IGV4aXQiID4gL2Rldi9udWxsIDI+JjEKKyAgICBpZiB0ZXN0ICQ/IC1uZSAwOyB0aGVuCisgICAgICBBQ19NU0dfUkVTVUxUKG5vKTsKKyAgICAgIGF4X3BlcmxfbW9kdWxlc19mYWlsZWQ9MQorICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChvayk7CisgICAgZmkKKyAgZG9uZQorCisgICMgUnVuIG9wdGlvbmFsIHNoZWxsIGNvbW1hbmRzCisgIGlmIHRlc3QgIiRheF9wZXJsX21vZHVsZXNfZmFpbGVkIiA9IDA7IHRoZW4KKyAgICA6CisgICAgJDIKKyAgZWxzZQorICAgIDoKKyAgICAkMworICBmaQorZWxzZQorICBBQ19NU0dfV0FSTihjb3VsZCBub3QgZmluZCBwZXJsKQorZmldKWRubApkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9zaWduZWRfcmlnaHRfc2hpZnQubTQgYi9hY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNAppbmRleCAwMTk1MjMzLi45YzNjZWI3IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNAorKysgYi9hY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgICAgQUNfREVGSU5FKFtMT0dJQ0FMX1JJR0hUX1NISUZUXSwgMiwgW1Bvc3NpYmxlIHZhbHVlIGZvciBTSUdORURfUklHSFRfU0hJRlRfSVNdKQogICAgICAgICAgIEFDX0RFRklORShbVU5LTk9XTl9SSUdIVF9TSElGVF0sIDMsIFtQb3NzaWJsZSB2YWx1ZSBmb3IgU0lHTkVEX1JJR0hUX1NISUZUX0lTXSkKIAotICAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzX2FyaXRobWV0aWMiID0gInllcyIgJiYgdGVzdCAiJHN1Y2Nlc3NfbG9naWNhIiA9ICJ5ZXMiIDsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzX2FyaXRobWV0aWMiID0gInllcyIgJiYgdGVzdCAiJHN1Y2Nlc3NfbG9naWNhbCIgPSAieWVzIiA7IHRoZW4KICAgICAgICAgICAgIEFDX01TR19FUlJPUigiUmlnaHQgc2hpZnQgYXBwZWFycyB0byBiZSBib3RoIGFyaXRobWV0aWMgYW5kIGxvZ2ljYWwhIikKICAgICAgICAgICBlbGlmIHRlc3QgIiRzdWNjZXNzX2FyaXRobWV0aWMiID0gInllcyIgOyB0aGVuCiAgICAgICAgICAgICBheF9zaWduZWRfcmlnaHRfc2hpZnQ9YXJpdGhtZXRpYwpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF90aHJpZnRfaW50ZXJuYWwubTQgYi9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNAppbmRleCA5NzliZWM2Li44YzBlM2NiIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNAorKysgYi9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNApAQCAtMTUsMTggKzE1LDYgQEAKIGRubCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQKIGRubCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCiAKLUFDX0RFRlVOKFtBWF9USFJJRlRfR0VOXSwKLSAgICAgICAgIFsKLSAgICAgICAgICBBQ19BUkdfRU5BQkxFKFtnZW4tJDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWdlbi0kMV0sIFtlbmFibGUgdGhlICQyIGNvbXBpbGVyIEA8OkBkZWZhdWx0PSQzQDo+QF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgW2F4X3RocmlmdF9nZW5fJDE9IiRlbmFibGV2YWwiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFtheF90aHJpZnRfZ2VuXyQxPSQzXQotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgIGRubCBJJ2QgbGlrZSB0byBydW4gdGhlIEFNX0NPTkRJVElPTkFMIGhlcmUsIGJ1dCBhdXRvbWFrZSBsaWtlcwotICAgICAgICAgIGRubCBhbGwgQU1fQ09ORElUSU9OQUxzIHRvIGJlIG5pY2UgYW5kIGV4cGxpY2l0IGluIGNvbmZpZ3VyZS5hYy4KLSAgICAgICAgICBkbmwgQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fJDFdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fJDEiID0gInllcyJdKQotICAgICAgICAgXSkKLQogQUNfREVGVU4oW0FYX1RIUklGVF9MSUJdLAogICAgICAgICAgWwogICAgICAgICAgIEFDX0FSR19XSVRIKCQxLApAQCAtMzQsNiArMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIFt3aXRoXyQxPSIkd2l0aHZhbCJdLAogICAgICAgICAgICAgICAgICAgICAgIFt3aXRoXyQxPSQzXQogICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICBoYXZlXyQxPW5vCiAgICAgICAgICAgZG5sIFdoYXQgd2UgZG8gaGVyZSBpcyBnb2luZyB0byB2YXJ5IGZyb20gbGlicmFyeSB0byBsaWJyYXJ5LAogICAgICAgICAgIGRubCBzbyB3ZSBjYW4ndCByZWFsbHkgZ2VuZXJhbGl6ZSAoeWV0ISkuCiAgICAgICAgICBdKQpkaWZmIC0tZ2l0IGEvYXBwdmV5b3IueW1sIGIvYXBwdmV5b3IueW1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwMjE0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcHB2ZXlvci55bWwKQEAgLTAsMCArMSwxMTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIGJ1aWxkIEFwYWNoZSBUaHJpZnQgb24gQXBwVmV5b3IgLSBodHRwczovL2NpLmFwcHZleW9yLmNvbQorCit2ZXJzaW9uOiAnMS4wLjAue2J1aWxkfScKKworc2hhbGxvd19jbG9uZTogdHJ1ZQorCitvczoKKyAgLSBWaXN1YWwgU3R1ZGlvIDIwMTcKKworbWF0cml4OgorICBhbGxvd19mYWlsdXJlczoKKyAgICAgIC0gUFJPRklMRTogQ1lHV0lOCisgIGZhc3RfZmluaXNoOiB0cnVlCisKK2Vudmlyb25tZW50OgorICBtYXRyaXg6CisgICAtIFBST0ZJTEU6IE1TVkMyMDE3CisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsZWFzZQorICAgICBCT09TVF9WRVJTSU9OOiAxLjY1LjEKKyAgICAgTElCRVZFTlRfVkVSU0lPTjogMi4xLjgKKyAgICAgUFlUSE9OX1ZFUlNJT046IDMuNgorICAgICBRVF9WRVJTSU9OOiA1LjEwCisgICAgIFpMSUJfVkVSU0lPTjogMS4yLjExCisgICAgIERJU0FCTEVEX1RFU1RTOiBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcKKworICAgLSBQUk9GSUxFOiBNU1ZDMjAxMworICAgICBQTEFURk9STTogeDg2CisgICAgIENPTkZJR1VSQVRJT046IFJlbGVhc2UKKyAgICAgQk9PU1RfVkVSU0lPTjogMS41OC4wCisgICAgIExJQkVWRU5UX1ZFUlNJT046IDIuMC4yMgorICAgICBQWVRIT05fVkVSU0lPTjogMy41CisgICAgIFFUX1ZFUlNJT046IDUuOAorICAgICBaTElCX1ZFUlNJT046IDEuMi44CisgICAgIERJU0FCTEVEX1RFU1RTOiBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcKKyAgICAgQVBQVkVZT1JfQlVJTERfV09SS0VSX0lNQUdFOiBWaXN1YWwgU3R1ZGlvIDIwMTUKKworICAgLSBQUk9GSUxFOiBNSU5HVworICAgICBQTEFURk9STTogeDY0CisgICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisgICAgIERJU0FCTEVEX1RFU1RTOiBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcKKworICAgLSBQUk9GSUxFOiBDWUdXSU4KKyAgICAgUExBVEZPUk06IHg4NgorICAgICBDT05GSUdVUkFUSU9OOiBSZWxXaXRoRGViSW5mbworICAgICBESVNBQkxFRF9URVNUUzogKFpsaWJUZXN0fE9wZW5TU0xNYW51YWxJbml0VGVzdHxUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0fFN0cmVzc1Rlc3ROb25CbG9ja2luZykKKworIyAgLSBQUk9GSUxFOiBDWUdXSU4KKyMgICAgUExBVEZPUk06IHg2NAorIyAgICBDT05GSUdVUkFUSU9OOiBSZWxXaXRoRGViSW5mbworIyAgICBESVNBQkxFRF9URVNUUzogKFpsaWJUZXN0fE9wZW5TU0xNYW51YWxJbml0VGVzdHxUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0fFN0cmVzc1Rlc3ROb25CbG9ja2luZykKKworaW5zdGFsbDoKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItaW5zdGFsbC5iYXQKKyAgLSByZWZyZXNoZW52CisKK2J1aWxkX3NjcmlwdDoKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItYnVpbGQuYmF0CisKK3Rlc3Rfc2NyaXB0OgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci10ZXN0LmJhdAorCisKKyMgYXJ0aWZhY3QgY2FwdHVyZSBkaXNhYmxlZCBhcyBpdCBtaWdodCBpbmNyZWFzZSBzZXJ2aWNlIGNvc3QgZm9yIGxpdHRsZSBnYWluOgorIworIyBhcnRpZmFjdHM6CisjICAtIHBhdGg6IGxvY2FsLXRocmlmdC1pbnN0CisjICAgIG5hbWU6IGNtYWtlIGluc3RhbGxlZCBjb250ZW50CisjICAgIHR5cGU6IHppcAorIworIyAgLSBwYXRoOiBsb2NhbC10aHJpZnQtYnVpbGRcVGVzdGluZworIyAgICBuYW1lOiBjdGVzdCBvdXRwdXQKKyMgICAgdHlwZTogemlwCisKKyMgUkRQIHN1cHBvcnQ6IHVzZSBvbmUgb3IgdGhlIG90aGVyLi4uCisjCisjIGVuYWJsZXMgUkRQIGZvciBlYWNoIGJ1aWxkIGpvYiBzbyB5b3UgY2FuIGluc3BlY3QgdGhlIGVudmlyb25tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGpvYjoKKyMgaW5pdDoKKyMgIC0gcHM6IGlleCAoKG5ldy1vYmplY3QgbmV0LndlYmNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcHB2ZXlvci9jaS9tYXN0ZXIvc2NyaXB0cy9lbmFibGUtcmRwLnBzMScpKQorIworIyBlbmFibGVzIFJEUCBhdCB0aGUgZW5kIG9mIHRoZSBidWlsZCBqb2Igc28geW91IGNhbiBsb2dpbiBhbmQgcmUtcnVuCisjIGNvbW1hbmRzIHRvIHNlZSB3aHkgc29tZXRoaW5nIGZhaWxlZC4uLgorI29uX2ZpbmlzaDoKKyMgIC0gcHM6ICRibG9ja1JkcCA9ICR0cnVlOyBpZXggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBwdmV5b3IvY2kvbWFzdGVyL3NjcmlwdHMvZW5hYmxlLXJkcC5wczEnKSkKKyMKKyMgYWxzbyBuZWVkOgorIyBlbnZpcm9ubWVudDoKKyMgICBBUFBWRVlPUl9SRFBfUEFTU1dPUkQ6IHRocjFGVDIzNDUkeHl6WgpkaWZmIC0tZ2l0IGEvYm9vdHN0cmFwLnNoIGIvYm9vdHN0cmFwLnNoCmluZGV4IDc0ZWNkYjguLjI0NTJlZWEgMTAwNzU1Ci0tLSBhL2Jvb3RzdHJhcC5zaAorKysgYi9ib290c3RyYXAuc2gKQEAgLTIwLDE2ICsyMCw0MiBAQAogIwogCiAuL2NsZWFudXAuc2gKLQotYXV0b3NjYW4gfHwgZXhpdCAxCi1hY2xvY2FsIC1JIC4vYWNsb2NhbCB8fCBleGl0IDEKLWF1dG9oZWFkZXIgfHwgZXhpdCAxCi0KLWlmIGxpYnRvb2xpemUgLS12ZXJzaW9uIDEgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgotICBsaWJ0b29saXplIC0tY29weSAtLWF1dG9tYWtlIHx8IGV4aXQgMQotZWxpZiBnbGlidG9vbGl6ZSAtLXZlcnNpb24gMSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0gIGdsaWJ0b29saXplIC0tY29weSAtLWF1dG9tYWtlIHx8IGV4aXQgMQoraWYgdGVzdCAtZCBsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sIDsgdGhlbgorICAgIGlmIHBocGl6ZSAtdiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDsgdGhlbgorICAgICAgICAoY2QgbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbCAmJiBwaHBpemUpCisgICAgZmkKIGZpCiAKK3NldCAtZQorCisjIGxpYnRvb2xpemUgaXMgY2FsbGVkICJnbGlidG9vbGl6ZSIgb24gT1NYLgoraWYgbGlidG9vbGl6ZSAtLXZlcnNpb24gMSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgIExJQlRPT0xJWkU9bGlidG9vbGl6ZQorZWxpZiBnbGlidG9vbGl6ZSAtLXZlcnNpb24gMSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgIExJQlRPT0xJWkU9Z2xpYnRvb2xpemUKK2Vsc2UKKyAgZWNobyA+JjIgIkNvdWxkbid0IGZpbmQgbGlidG9vbGl6ZSEiCisgIGV4aXQgMQorZmkKKworZm9ybWF0X3ZlcnNpb24gKCkgeworICAgIHByaW50ZiAiJTAzZCUwM2QlMDNkJTAzZCIgJChlY2hvICQxIHwgdHIgJy4nICcgJyk7Cit9CisKKyMgd2UgcmVxdWlyZSBhdXRvbWFrZSAxLjEzIG9yIGxhdGVyCisjIGNoZWNrIG11c3QgaGFwcGVuIGV4dGVybmFsbHkgZHVlIHRvIHVzZSBvZiBuZXdlciBtYWNybworQVVUT01BS0VfVkVSU0lPTj1gYXV0b21ha2UgLS12ZXJzaW9uIHwgZ3JlcCBhdXRvbWFrZSB8IGVncmVwIC1vICcoWzAtOV17MSx9XC4pK1swLTldezEsfSdgCitpZiAgWyAkKGZvcm1hdF92ZXJzaW9uICRBVVRPTUFLRV9WRVJTSU9OKSAtbHQgJChmb3JtYXRfdmVyc2lvbiAxLjEzKSBdOyB0aGVuCisgIGVjaG8gPiYyICJhdXRvbWFrZSB2ZXJzaW9uICRBVVRPTUFLRV9WRVJTSU9OIGlzIHRvbyBvbGQgKG5lZWQgMS4xMyBvciBsYXRlcikiCisgIGV4aXQgMQorZmkKKworc2V0IC1lCithdXRvc2NhbgorJExJQlRPT0xJWkUgLS1jb3B5IC0tYXV0b21ha2UKK2FjbG9jYWwgLUkgLi9hY2xvY2FsCithdXRvaGVhZGVyCitzZWQgJy91bmRlZiBWRVJTSU9OL2QnIGNvbmZpZy5oaW4gPiBjb25maWcuaGluMgorbXYgY29uZmlnLmhpbjIgY29uZmlnLmhpbgogYXV0b2NvbmYKLWF1dG9tYWtlIC1hYyAtLWFkZC1taXNzaW5nIC0tZm9yZWlnbiB8fCBleGl0IDEKK2F1dG9tYWtlIC0tY29weSAtLWFkZC1taXNzaW5nIC0tZm9yZWlnbgpkaWZmIC0tZ2l0IGEvYm93ZXIuanNvbiBiL2Jvd2VyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzYjhjYgotLS0gL2Rldi9udWxsCisrKyBiL2Jvd2VyLmpzb24KQEAgLTAsMCArMSwxNSBAQAoreworICAibmFtZSI6ICJ0aHJpZnQiLAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLAorICAiYXV0aG9ycyI6IFsKKyAgICAiQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIKKyAgXSwKKyAgImRlc2NyaXB0aW9uIjogIkFwYWNoZSBUaHJpZnQiLAorICAibWFpbiI6ICJsaWIvanMvc3JjL3RocmlmdC5qcyIsCisgICJrZXl3b3JkcyI6IFsKKyAgICAidGhyaWZ0IgorICBdLAorICAibGljZW5zZSI6ICJBcGFjaGUgdjIiLAorICAiaWdub3JlIjogW10KK30KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyNjIyMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsMzYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBDTUFLRUFSR1M9XgorICAtRyclR0VORVJBVE9SJScgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lSU5TVERJUiUgXgorICAtRENNQUtFX0NYWF9FWFRFTlNJT05TPU9OIF4KKyAgLURDTUFLRV9DWFhfRkxBR1M9Ii1EX0dOVV9TT1VSQ0UiIF4KKyAgLURDTUFLRV9DWFhfU1RBTkRBUkQ9MTEgXgorICAtRFdJVEhfUFlUSE9OPU9GRiBeCisgIC1EV0lUSF9TSEFSRURfTElCPU9GRiBeCisgIC1EV0lUSF9TVEFUSUNfTElCPU9OIF4KKyAgLURXSVRIX1NURFRIUkVBRFM9T04KKworQEVDSE8gT04KKyVCQVNIJSAtbGMgIm1rZGlyIC1wICVCVUlMRERJUiUgJiYgY2QgJUJVSUxERElSJSAmJiBjbWFrZS5leGUgJVNSQ0RJUiUgJUNNQUtFQVJHUyUgJiYgY21ha2UgLS1idWlsZCAuIC0tY29uZmlnICVDT05GSUdVUkFUSU9OJSAtLXRhcmdldCBpbnN0YWxsIiB8fCBFWElUIC9CCitARUNITyBPRkYKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWluc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGI3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWluc3RhbGwuYmF0CkBAIC0wLDAgKzEsMzQgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBBcHB2ZXlvciBpbnN0YWxsIHNjcmlwdCBmb3IgQ1lHV0lOCis6OiBJbnN0YWxscyB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkIGZvciBhIGNtYWtlIGJ1aWxkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjoKKzo6IEluc3RhbGwgYXB0LWN5ZyBmb3IgcGFja2FnZSBtYW5hZ2VtZW50Cis6OgorCislQkFTSCUgLWxjICJ3Z2V0IHJhd2dpdC5jb20vdHJhbnNjb2RlLW9wZW4vYXB0LWN5Zy9tYXN0ZXIvYXB0LWN5ZyAmJiBpbnN0YWxsIGFwdC1jeWcgL2JpbiAmJiBybSAtZiBhcHQtY3lnIiB8fCBFWElUIC9CCislQkFTSCUgLWxjICJhcHQtY3lnIHVwZGF0ZSIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAiYXB0LWN5ZyBpbnN0YWxsIGJpc29uIGNtYWtlIGZsZXggZ2NjLWcrKyBsaWJib29zdC1kZXZlbCBsaWJldmVudC1kZXZlbCBtYWtlIG9wZW5zc2wtZGV2ZWwgemxpYi1kZXZlbCIKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjdmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjEgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorCislQkFTSCUgLWxjICJjZCAlQlVJTERESVIlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyVESVNBQkxFRF9URVNUUyUnIiB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWJ1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzN2E5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWJ1aWxkLmJhdApAQCAtMCwwICsxLDM2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9idWlsZC5iYXQgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitTRVQgQ01BS0VBUkdTPV4KKyAgLUcnJUdFTkVSQVRPUiUnIF4KKyAgLURDTUFLRV9CVUlMRF9UWVBFPSVDT05GSUdVUkFUSU9OJSBeCisgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JUlOU1RESVIlIF4KKyAgLURDTUFLRV9NQUtFX1BST0dSQU09L21pbmd3JU5PUk1fUExBVEZPUk0lL2Jpbi9taW5ndzMyLW1ha2UgXgorICAtRENNQUtFX0NfQ09NUElMRVI9L21pbmd3JU5PUk1fUExBVEZPUk0lL2Jpbi9nY2MuZXhlIF4KKyAgLURDTUFLRV9DWFhfQ09NUElMRVI9L21pbmd3JU5PUk1fUExBVEZPUk0lL2Jpbi9nKysuZXhlIF4KKyAgLURPUEVOU1NMX1JPT1RfRElSPS9taW5ndyVOT1JNX1BMQVRGT1JNJSBeCisgIC1EV0lUSF9QWVRIT049T0ZGIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04KKworQEVDSE8gT04KKyVCQVNIJSAtbGMgIm1rZGlyIC1wICVCVUlMRERJUiUgJiYgY2QgJUJVSUxERElSJSAmJiBjbWFrZS5leGUgJVNSQ0RJUiUgJUNNQUtFQVJHUyUgJiYgY21ha2UgLS1idWlsZCAuIC0tY29uZmlnICVDT05GSUdVUkFUSU9OJSAtLXRhcmdldCBpbnN0YWxsIiB8fCBFWElUIC9CCitARUNITyBPRkYKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWluc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjliMDUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLWluc3RhbGwuYmF0CkBAIC0wLDAgKzEsNDUgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBBcHB2ZXlvciBpbnN0YWxsIHNjcmlwdCBmb3IgTUlOR1cgb24gTVNZUzIKKzo6IEluc3RhbGxzIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQgZm9yIGEgY21ha2UgYnVpbGQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitTRVQgUEFDS0FHRVM9XgorICAtLW5lZWRlZCAtUyBiaXNvbiBmbGV4IG1ha2UgXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtYm9vc3QgXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtY21ha2UgXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtbGliZXZlbnQgXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtb3BlbnNzbCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS10b29sY2hhaW4gXgorICBtaW5ndy13NjQtJU1JTkdXUExBVCUtemxpYgorCis6Om1pbmd3LXc2NC0lTUlOR1dQTEFUJS1xdDUgOiBXQVkgdG9vIGxhcmdlICgxR0IgZG93bmxvYWQhKSAtIHRlc3RlZCBpbiBjeWd3aW4gYnVpbGRzIGFueXdheQorCis6OiBSZW1vdmUgb2xkIHBhY2thZ2VzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IHRvIGF2b2lkIGFuIGVycm9yCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLS1yZW1vdmUgbGliY2F0Z2V0cyBjYXRnZXRzIHx8IHRydWUiIHx8IEVYSVQgL0IKKworOjogVXBncmFkZSB0aGluZ3MKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtU3l1ICVJR05PUkUlIiAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TdSAlSUdOT1JFJSIgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gJVBBQ0tBR0VTJSIgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTljMWZmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDIyIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorCislQkFTSCUgLWxjICJjZCAlQlVJTERESVIlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyVESVNBQkxFRF9URVNUUyUnIiB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWJ1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjkyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWJ1aWxkLmJhdApAQCAtMCwwICsxLDQ3IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9idWlsZC5iYXQgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorTUtESVIgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDRCAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworQEVDSE8gT04KKyAgY21ha2UgIiVTUkNESVIlIiBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKwktREJJU09OX0VYRUNVVEFCTEU9QzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxsaWJcd2luZmxleGJpc29uM1x0b29sc1x3aW5fYmlzb24uZXhlIF4KKyAgICAtREJPT1NUX1JPT1Q9IiVCT09TVF9ST09UJSIgXgorICAgIC1EQk9PU1RfTElCUkFSWURJUj0iJUJPT1NUX0xJQlJBUllESVIlIiBeCisgICAgLURDTUFLRV9CVUlMRF9UWVBFPSIlQ09ORklHVVJBVElPTiUiIF4KKyAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSIlSU5TVERJUiUiIF4KKwktREZMRVhfRVhFQ1VUQUJMRT1DOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGxpYlx3aW5mbGV4Ymlzb24zXHRvb2xzXHdpbl9mbGV4LmV4ZSBeCisgICAgLURJTlRUWVBFU19ST09UPSIlV0lOM1AlXG1zaW50dHlwZXMiIF4KKyAgICAtRExJQkVWRU5UX1JPT1Q9IiVXSU4zUCVcbGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZSIgXgorICAgIC1ET1BFTlNTTF9ST09UX0RJUj0iJU9QRU5TU0xfUk9PVCUiIF4KKyAgICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9GRiBeCisgICAgLURaTElCX0xJQlJBUlk9IiVXSU4zUCVcemxpYi1pbnN0XGxpYlx6bGliJVpMSUJfTElCX1NVRkZJWCUubGliIiBeCisgICAgLURaTElCX1JPT1Q9IiVXSU4zUCVcemxpYi1pbnN0IiBeCisgICAgLURXSVRIX1BZVEhPTj0lV0lUSF9QWVRIT04lIF4KKyAgICAtRFdJVEhfJVRIUkVBRE1PREVMJVRIUkVBRFM9T04gXgorICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiBeCisgICAgLURXSVRIX1NUQVRJQ19MSUI9T04gICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgorCitjbWFrZSAtLWJ1aWxkIC4gXgorICAtLWNvbmZpZyAiJUNPTkZJR1VSQVRJT04lIiBeCisgIC0tdGFyZ2V0IElOU1RBTEwgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWluc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzNkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLWluc3RhbGwuYmF0CkBAIC0wLDAgKzEsNTkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBBcHB2ZXlvciBpbnN0YWxsIHNjcmlwdCBmb3IgTVNWQworOjogSW5zdGFsbHMgKG9yIGJ1aWxkcykgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK01LRElSICIlV0lOM1AlIiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworY2hvY28gZmVhdHVyZSBlbmFibGUgLW4gYWxsb3dHbG9iYWxDb25maXJtYXRpb24gfHwgRVhJVCAvQgorCis6OiBUaGluZ3MgdG8gaW5zdGFsbCB3aGVuIE5PVCBydW5uaW5nIGluIGFwcHZleW9yOgorSUYgIiVBUFBWRVlPUl9CVUlMRF9JRCUiID09ICIiICgKKyAgICBjdXAgLXkgY2hvY29sYXRleSAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyAgICBjaW5zdCAteSBjdXJsICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyAgICBjaW5zdCAteSA3emlwICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyAgICBjaW5zdCAteSBweXRob24zICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyAgICBjaW5zdCAteSBvcGVuc3NsLmxpZ2h0ICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKykKKworY2luc3QgLXkgamRrOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY2luc3QgLXkgd2luZmxleGJpc29uMyAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiB6bGliIC0gbm90IGF2YWlsYWJsZSB0aHJvdWdoIGNob2NvbGF0ZXkKK0NEICIlQVBQVkVZT1JfU0NSSVBUUyUiICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK2NhbGwgYnVpbGQtemxpYi5iYXQgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogbGliZXZlbnQgLSBub3QgYXZhaWxhYmxlIHRocm91Z2ggY2hvY29sYXRleQorQ0QgIiVBUFBWRVlPUl9TQ1JJUFRTJSIgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY2FsbCBidWlsZC1saWJldmVudC5iYXQgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBweXRob24gcGFja2FnZXMgKGNvcnJlY3QgcGF0aCB0byBwaXAgc2V0IGluIGNsX3NldGVudi5iYXQpCitwaXAuZXhlIF4KKyAgICBpbnN0YWxsIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgXgorICAgICAgICAgICAgaXBhZGRyZXNzIF4KKyAgICAgICAgICAgIHNpeCBeCisgICAgICAgICAgICB0b3JuYWRvIF4KKyAgICAgICAgICAgIHR3aXN0ZWQgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworY2luc3QgLXkgZ2hjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5NDU3OQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwzMiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT04KK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK0RJUiBDOlxsaWJyYXJpZXMKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV81OV8wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjBfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzYyXzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82M18wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjRfMAorCis6OiBBZGQgZGlyZWN0b3JpZXMgdG8gdGhlIHBhdGggdG8gZmluZCBETExzIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBzbyB0ZXN0cyBydW4gcHJvcGVybHkhCitTRVQgUEFUSD0lQk9PU1RfTElCUkFSWURJUjovPVwlOyVPUEVOU1NMX1JPT1QlXGJpbjslV0lOM1AlXHpsaWItaW5zdFxiaW47JVBBVEglCisKK2N0ZXN0IC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAiKCVESVNBQkxFRF9URVNUUyUpIiB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWJ1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDE3MjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWJ1aWxkLmJhdApAQCAtMCwwICsxLDQ4IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9idWlsZC5iYXQgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitTRVQgQkFTSD1DOlxtc3lzNjRcdXNyXGJpblxiYXNoCitTRVQgQ01BS0U9L2MvbXN5czY0L21pbmd3NjQvYmluL2NtYWtlLmV4ZQorCitARUNITyBPTgorU0VUIENNQUtFQVJHUz0tR1wiJUdFTkVSQVRPUiVcIiBeCisgIC1EQm9vc3RfREVCVUc9T04gXgorICAtREJvb3N0X05BTUVTUEFDRT1saWJib29zdCBeCisgIC1EQk9PU1RfSU5DTFVERURJUj0lQk9PU1RfSU5DTFVERURJUiUgXgorICAtREJPT1NUX0xJQlJBUllESVI9JUJPT1NUX0xJQlJBUllESVIlIF4KKyAgLURDTUFLRV9CVUlMRF9UWVBFPSVDT05GSUdVUkFUSU9OJSBeCisgIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MuZXhlIF4KKyAgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrLmV4ZSBeCisgIC1EQ01BS0VfTUFLRV9QUk9HUkFNPW1ha2UuZXhlIF4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lSU5TVERJUl9NU1lTJSBeCisgIC1ETElCRVZFTlRfUk9PVD0lTElCRVZFTlRfUk9PVCUgXgorICAtRE9QRU5TU0xfTElCUkFSSUVTPSVPUEVOU1NMX0xJQlJBUklFUyUgXgorICAtRE9QRU5TU0xfUk9PVF9ESVI9JU9QRU5TU0xfUk9PVCUgXgorICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9OIF4KKyAgLURXSVRIX0JPT1NUX1NUQVRJQz1PTiBeCisgIC1EV0lUSF9KQVZBPU9GRiBeCisgIC1EV0lUSF9MSUJFVkVOVD1PTiBeCisgIC1EV0lUSF9QWVRIT049JVdJVEhfUFlUSE9OJSBeCisgIC1EV0lUSF9TSEFSRURfTElCPU9GRiBeCisgIC1EV0lUSF9TVEFUSUNfTElCPU9OCisKKyVCQVNIJSAtbGMgIm1rZGlyICVCVUlMRERJUl9NU1lTJSAmJiBjZCAlQlVJTERESVJfTVNZUyUgJiYgJUNNQUtFJSAlU1JDRElSX01TWVMlICVDTUFLRUFSR1MlICYmICVDTUFLRSUgLS1idWlsZCAuIC0tY29uZmlnICVDT05GSUdVUkFUSU9OJSAtLXRhcmdldCBpbnN0YWxsIiB8fCBFWElUIC9CCitARUNITyBPRkYKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWluc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MThkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLWluc3RhbGwuYmF0CkBAIC0wLDAgKzEsNDggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6Cis6OiBBcHB2ZXlvciBpbnN0YWxsIHNjcmlwdCBmb3IgTVNZUworOjogSW5zdGFsbHMgKG9yIGJ1aWxkcykgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IFdlJ3JlIGdvaW5nIHRvIGtlZXAgYm9vc3QgYXQgYSB2ZXJzaW9uIGNtYWtlIHVuZGVyc3RhbmRzCitTRVQgQk9PU1RQS0c9bWluZ3ctdzY0LXg4Nl82NC1ib29zdC0xLjY0LjAtMy1hbnkucGtnLnRhci54egorU0VUIElHTk9SRT0tLWlnbm9yZSBtaW5ndy13NjQteDg2XzY0LWJvb3N0CisKK1NFVCBQQUNLQUdFUz1eCisgIC0tbmVlZGVkIC1TIGJpc29uIGZsZXggbWFrZSBeCisgIG1pbmd3LXc2NC14ODZfNjQtY21ha2UgXgorICBtaW5ndy13NjQteDg2XzY0LWxpYmV2ZW50IF4KKyAgbWluZ3ctdzY0LXg4Nl82NC1vcGVuc3NsIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC10b29sY2hhaW4gXgorICBtaW5ndy13NjQteDg2XzY0LXpsaWIKKworJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TeXUgJUlHTk9SRSUiIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtU3UgJUlHTk9SRSUiICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gJVBBQ0tBR0VTJSIgICAgfHwgRVhJVCAvQgorCis6OiBJbnN0YWxsIGEgc2xpZ2h0bHkgb2xkZXIgYm9vc3QgKDEuNjQuMCkgYXMgY21ha2UgMy4xMAorOjogZG9lcyBub3QgaGF2ZSBidWlsdC1pbiBkZXBlbmRlbmNpZXMgZm9yIGJvb3N0IDEuNjYuMCB5ZXQKKzo6IC0tIHRoaXMgY3V0cyBkb3duIG9uIGJ1aWxkIHdhcm5pbmcgb3V0cHV0IC0tCislQkFTSCUgLWxjICJ3Z2V0IGh0dHA6Ly9yZXBvLm1zeXMyLm9yZy9taW5ndy94ODZfNjQvJUJPT1NUUEtHJSAmJiBwYWNtYW4gLS1ub2NvbmZpcm0gLS1uZWVkZWQgLVUgJUJPT1NUUEtHJSAmJiBybSAlQk9PU1RQS0clIiB8fCBFWElUIC9CCisKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzdlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NU1lTLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCitDRCAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiByYW5kb21seSBmYWlscyBvbiBtaW5ndzsgc2VlIEppcmEgVEhSSUZULTQxMDYKK1NFVCBESVNBQkxFRF9URVNUUz1jb25jdXJyZW5jeV90ZXN0CisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUl9NU1lTJSAmJiBjdGVzdC5leGUgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICcoJURJU0FCTEVEX1RFU1RTJSknIiB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9SRUFETUUubWQgYi9idWlsZC9hcHB2ZXlvci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyYWEzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZApAQCAtMCwwICsxLDM0IEBACis8IS0tLQorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEFwcHZleW9yIEJ1aWxkCisKK0FwcHZleW9yIGlzIGNhcGFibGUgb2YgYnVpbGRpbmcgTVNWQyAyMDEwIHRocm91Z2ggMjAxNSBhcyB3ZWxsIGFzCitoYXZpbmcgdGhlIGxhdGVzdCBNU1lTMi9NaW5HVyA2NC1iaXQgZW52aXJvbm1lbnQuICBJdCBoYXMgbWFueSB2ZXJzaW9ucworb2YgYm9vc3QgYW5kIHB5dGhvbiBpbnN0YWxsZWQgYXMgd2VsbC4gIFNlZSB3aGF0IGFwcHZleW9yIGhhcworW2luc3RhbGxlZCBvbiBidWlsZCB3b3JrZXJzXShodHRwczovL3d3dy5hcHB2ZXlvci5jb20vZG9jcy9pbnN0YWxsZWQtc29mdHdhcmUvKS4KKworV2UgcnVuIGEgbWF0cml4IGJ1aWxkIG9uIEFwcHZleW9yIGFuZCBidWlsZCB0aGUgZm9sbG93aW5nIGNvbWJpbmF0aW9uczoKKworKiBNaW5HVyB4NjQgKGdjYyA2LjMuMCkKKyogTVNWQyAyMDEwIHg4NiwgYW4gb2xkZXIgYm9vc3QsIGFuIG9sZGVyIHB5dGhvbgorKiBNU1ZDIDIwMTUgeDg2L3g2NCwgdGhlIGxhdGVzdCBib29zdCwgdGhlIGxhdGVzdCBweXRob24KKyogTVNZUzIgeDY0IChnY2MgNi4zLjApIC0gdGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MKKworVGhlIEFwcHZleW9yIHNjcmlwdCB0YWtlcyB0aGUgZmlyc3QgZm91ciBsZXR0ZXJzIGZyb20gdGhlIFBST0ZJTEUgc3BlY2lmaWVkIGluCit0aGUgZW52aXJvbm1lbnQgc3RhbnphIGFuZCBydW5zIHRoZXNlIHNjcmlwdHMgaW4gb3JkZXI6CisKKz8/Pz8tYXBwdmV5b3ItaW5zdGFsbC5iYXQgd2lsbCBpbnN0YWxsIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBhbmQgc2V0IHVwIHRoZSBlbnZpcm9ubWVudAorPz8/Py1hcHB2ZXlvci1idWlsZC5iYXQgd2lsbCBidWlsZCB3aXRoIGNtYWtlCis/Pz8/LWFwcHZleW9yLXRlc3QuYmF0IHdpbGwgcnVuIGN0ZXN0CmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9idWlsZC1saWJldmVudC5iYXQgYi9idWlsZC9hcHB2ZXlvci9idWlsZC1saWJldmVudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiNjM1YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdApAQCAtMCwwICsxLDM3IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBVUkxGSUxFPWxpYmV2ZW50LSVMSUJFVkVOVF9WRVJTSU9OJS1zdGFibGUudGFyLmd6CitTRVQgVVJMPWh0dHBzOi8vZ2l0aHViLmNvbS9saWJldmVudC9saWJldmVudC9yZWxlYXNlcy9kb3dubG9hZC9yZWxlYXNlLSVMSUJFVkVOVF9WRVJTSU9OJS1zdGFibGUvJVVSTEZJTEUlCisKKzo6IERvd25sb2FkIC0gc3VwcG9ydCBydW5uaW5nIGEgbG9jYWwgYnVpbGQgb3IgYSBidWlsZCBpbiBhcHB2ZXlvcgorQ0QgIiVXSU4zUCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJVVSTCUiCispIEVMU0UgKAorICAgIGFwcHZleW9yIERvd25sb2FkRmlsZSAiJVVSTCUiCispCis3eiB4ICIlVVJMRklMRSUiIC1zbyB8IDd6IHggLXNpIC10dGFyID4gbnVsICAgICAgfHwgRVhJVCAvQgorQ0QgImxpYmV2ZW50LSVMSUJFVkVOVF9WRVJTSU9OJS1zdGFibGUiICAgICAgICAgIHx8IEVYSVQgL0IKK25tYWtlIC1mIE1ha2VmaWxlLm5tYWtlIHN0YXRpY19saWJzICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IGluIGxpYmV2ZW50IDIuMCB0aGVyZSBpcyBubyBubWFrZSBzdWJkaXJlY3RvcnkgaW4gV0lOMzItQ29kZSwgYnV0IGluIDIuMSB0aGVyZSBpcworbWtkaXIgbGliICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK21vdmUgKi5saWIgbGliXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCittb3ZlIFdJTjMyLUNvZGVcZXZlbnQyXCogaW5jbHVkZVxldmVudDJcICAgICAgICAgfHwgbW92ZSBXSU4zMi1Db2RlXG5tYWtlXGV2ZW50MlwqIGluY2x1ZGVcZXZlbnQyXCB8fCBFWElUIC9CCittb3ZlICouaCBpbmNsdWRlXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitFTkRMT0NBTApkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvYnVpbGQtemxpYi5iYXQgYi9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTk1NzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtemxpYi5iYXQKQEAgLTAsMCArMSw1NiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitTRVQgUEFDS0FHRT16bGliLSVaTElCX1ZFUlNJT04lCitTRVQgQlVJTERESVI9JVdJTjNQJVx6bGliLWJ1aWxkCitTRVQgSU5TVERJUj0lV0lOM1AlXHpsaWItaW5zdAorU0VUIFNSQ0RJUj0lV0lOM1AlXCVQQUNLQUdFJQorU0VUIFVSTEZJTEU9JVBBQ0tBR0UlLnRhci5negorCis6OiBUaGlzIGFsbG93cyB1cyB0byB0b2xlcmF0ZSB3aGVuIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgYXJjaGl2ZWQKK1NFVCBVUkw9aHR0cDovL3psaWIubmV0LyVVUkxGSUxFJQorU0VUIEZVUkw9aHR0cDovL3psaWIubmV0L2Zvc3NpbHMvJVVSTEZJTEUlCisKKzo6IERvd25sb2FkIC0gc3VwcG9ydCBydW5uaW5nIGEgbG9jYWwgYnVpbGQgb3IgYSBidWlsZCBpbiBhcHB2ZXlvcgorQ0QgIiVXSU4zUCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitJRiAiJUFQUFZFWU9SX0JVSUxEX0lEJSIgPT0gIiIgKAorICAgIGN1cmwgLUwgLWYgLW8gIiVVUkxGSUxFJSIgIiVVUkwlIgorICAgIElGIEVSUk9STEVWRUwgMSAoCisgICAgICAgIGN1cmwgLUwgLWYgLW8gIiVVUkxGSUxFJSIgIiVGVVJMJSIKKyAgICApCispIEVMU0UgKAorICAgIGFwcHZleW9yIERvd25sb2FkRmlsZSAiJVVSTCUiCisgICAgSUYgRVJST1JMRVZFTCAxICgKKyAgICAgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlRlVSTCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgICkKKykKKzd6IHggIiVVUkxGSUxFJSIgLXNvIHwgN3ogeCAtc2kgLXR0YXIgPiBudWwgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBHZW5lcmF0ZQorTUtESVIgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDRCAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK2NtYWtlICIlU1JDRElSJSIgXgorICAgICAgLUciTk1ha2UgTWFrZWZpbGVzIiBeCisgICAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSIlSU5TVERJUiUiIF4KKyAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT0iJUNPTkZJR1VSQVRJT04lIiAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBCdWlsZAorbm1ha2UgL2ZNYWtlZmlsZSBpbnN0YWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitJRiAiJUNPTkZJR1VSQVRJT04lIiA9PSAiRGVidWciICgKKyAgICBDT1BZICIlQlVJTERESVIlXHpsaWJkLnBkYiIgIiVJTlNURElSJVxiaW5cIiAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorKQorCitFTkRMT0NBTApkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2FwYWNoZV90aHJpZnQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2FwYWNoZV90aHJpZnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjJhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQKQEAgLTAsMCArMSwyNCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUFwYWNoZSUyMFRocmlmdAorCitFQ0hPLworRUNITyAgICBfX18gICAgICAgICAgICAgICAgIF9fICAgICAgICAgX19fX19fX18gICAgICAgXyBfX19fXworRUNITyAgIC8gXyB8IF9fXyAgX19fIF9fX19fLyAvICBfX18gICAvXyAgX18vIC8gIF9fX18oXykgXy8gL18KK0VDSE8gIC8gX18gfC8gXyBcLyBfIGAvIF9fLyBfIFwvIC1fKSAgIC8gLyAvIF8gXC8gX18vIC8gXy8gX18vCitFQ0hPIC9fLyB8Xy8gLl9fL1xfLF8vXF9fL18vL18vXF9fLyAgIC9fLyAvXy8vXy9fLyAvXy9fLyBcX18vCitFQ0hPICAgICAgL18vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyNzJmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9idWlsZC5iYXQKQEAgLTAsMCArMSwyMyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUJ1aWxkCisKK0VDSE8vCitFQ0hPICAgIF9fXyAgICAgICBfIF9fICAgX18KK0VDSE8gICAvIF8gKV9fIF9fKF8pIC9fXy8gLworRUNITyAgLyBfICAvIC8vIC8gLyAvIF8gIC8gICAgIEBAQCBCVUlMRAorRUNITyAvX19fXy9cXyxfL18vXy9cXyxfLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9pbnN0YWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGUzZGEyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0CkBAIC0wLDAgKzEsMjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1JbnN0YWxsCisKK0VDSE8vCitFQ0hPICAgIF9fX18gICAgICAgICBfXyAgICAgICBfX19fCitFQ0hPICAgLyAgXy9fXyAgX19fIC8gL19fX18gXy8gLyAvCitFQ0hPICBfLyAvLyBfIFwoXy1ePC8gX18vIF8gXC8gLyAvICAgICBAQEAgSU5TVEFMTAorRUNITyAvX19fL18vL18vX19fL1xfXy9cXyxfL18vXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlMmQxMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdApAQCAtMCwwICsxLDIzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9VGVzdAorCitFQ0hPLworRUNITyAgX19fX19fICAgICAgICBfXworRUNITyAvXyAgX18vX18gX19fIC8gL18KK0VDSE8gIC8gLyAvIC1fXnxfLV48LyBfXy8gICAgIEBAQCBURVNUCitFQ0hPIC9fLyAgXF9fL19fXy9cX18vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Y29tcGlsZXIuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Y29tcGlsZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2ZmYzUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQKQEAgLTAsMCArMSw2MyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbi4KKzo6IFNldCB0aGUgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjogICBnY2MgICA9IE1pbkdXIC8gTVNZUzIgYW5kIGdjYyB0b29sY2hhaW4KKzo6ICAgdmMxMDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTAKKzo6ICAgdmMxMTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTIKKzo6ICAgdmMxMjAgPSBWaXN1YWwgU3R1ZGlvIDIwMTMKKzo6ICAgdmMxNDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTUKKzo6ICAgdmMxNDEgPSBWaXN1YWwgU3R1ZGlvIDIwMTcKKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBDT01QSUxFUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQ09NUElMRVIgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQ09NUElMRVIKKyAgRVhJVCAvQiAwCispCisKK0lGIE5PVCAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1ZDIiAoCisgIFNFVCBDT01QSUxFUj1nY2MKKykgRUxTRSAoCisgIENBTEwgOkNIRUNLIDE2CisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxMDApCisgIENBTEwgOkNIRUNLIDE3CisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxMTApCisgIENBTEwgOkNIRUNLIDE4CisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxMjApCisgIENBTEwgOkNIRUNLIDE5LjAKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzE0MCkKKyAgQ0FMTCA6Q0hFQ0sgMTkuMQorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTQxKQorKQorCitJRiBOT1QgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjb21waWxlciBlZGl0aW9uCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gZGV0ZWN0ZWQgY29tcGlsZXIgZWRpdGlvbiAgICAlQ09NUElMRVIlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUiID4gbnVsCitFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0ZW52LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzMzNjZkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0ZW52LmJhdApAQCAtMCwwICsxLDEyMSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCisKK0lGICIlUFJPRklMRSUiID09ICJNU1ZDMjAxMiIgKAorICBDQUxMICJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDExLjBcVkNcdmN2YXJzYWxsLmJhdCIgJVBMQVRGT1JNJQorKSBFTFNFIElGICIlUFJPRklMRSUiID09ICJNU1ZDMjAxMyIgKAorICBDQUxMICJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDEyLjBcVkNcdmN2YXJzYWxsLmJhdCIgJVBMQVRGT1JNJQorKSBFTFNFIElGICIlUFJPRklMRSUiID09ICJNU1ZDMjAxNSIgKAorICBDQUxMICJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDE0LjBcVkNcdmN2YXJzYWxsLmJhdCIgJVBMQVRGT1JNJQorKSBFTFNFIElGICIlUFJPRklMRSUiID09ICJNU1ZDMjAxNyIgKAorICBDQUxMIDpTRVRVUE5FV0VSTVNWQyAgICB8fCBFWElUIC9CCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1JTkdXIiAoCisgIFJFTSBTdXBwb3J0ZWQsIG5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlLgorKSBFTFNFIElGICIlUFJPRklMRSUiID09ICJDWUdXSU4iICgKKyAgUkVNIFN1cHBvcnRlZCwgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuCispIEVMU0UgKAorICBFQ0hPIFVuc3VwcG9ydGVkIFBST0ZJTEU9JVBST0ZJTEUlIG9yIFBMQVRGT1JNPSVQTEFURk9STSUKKyAgRVhJVCAvQiAxCispCisKK0NBTEwgY2xfc2V0Y29tcGlsZXIuYmF0ICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRnZW5lcmF0b3IuYmF0ICB8fCBFWElUIC9CCisKK1NFVCBBUFBWRVlPUl9TQ1JJUFRTPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXGJ1aWxkXGFwcHZleW9yCitTRVQgQlVJTERESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcLi5cYnVpbGRcJVBST0ZJTEUlXCVQTEFURk9STSUKK1NFVCBJTlNURElSPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXC4uXGJ1aWxkXCVQUk9GSUxFJVwlUExBVEZPUk0lCitTRVQgU1JDRElSPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisKKzo6IFBMQVRGT1JNIGlzIHg2NCBvciB4ODYKKzo6IE5PUk1fUExBVEZPUk0gaXMgNjQgb3IgMzIKK1NFVCBOT1JNX1BMQVRGT1JNPSVQTEFURk9STTp+LTIsMiUKK0lGICIlTk9STV9QTEFURk9STSUiID09ICI4NiIgKFNFVCBOT1JNX1BMQVRGT1JNPTMyKQorCitJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1ZDIiAoCisKKyAgOjogRmluZEJvb3N0IG5lZWRzIGZvcndhcmQgc2xhc2hlcyBzbyBjbWFrZSBkb2Vzbid0IHNlZSBzb21ldGhpbmcgYXMgYW4gZXNjYXBlZCBjaGFyYWN0ZXIKKyAgU0VUIEJPT1NUX1JPT1Q9QzovTGlicmFyaWVzL2Jvb3N0XyVCT09TVF9WRVJTSU9OOi49XyUKKyAgU0VUIEJPT1NUX0xJQlJBUllESVI9IUJPT1NUX1JPT1QhL2xpYiVOT1JNX1BMQVRGT1JNJS1tc3ZjLSVDT01QSUxFUjp+LTMsMiUuJUNPTVBJTEVSOn4tMSwxJQorICBTRVQgT1BFTlNTTF9ST09UPUM6XE9wZW5TU0wtV2luJU5PUk1fUExBVEZPUk0lCisgIFNFVCBXSU4zUD0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVx0aGlyZHBhcnR5CisKKyAgU0VUIFRIUkVBRE1PREVMPVNURAorCisgIElGICIlUFlUSE9OX1ZFUlNJT04lIiA9PSAiIiAoCisgICAgU0VUIFdJVEhfUFlUSE9OPU9GRgorICApIEVMU0UgKAorICAgIFNFVCBXSVRIX1BZVEhPTj1PTgorICAgIElGIC9pICIlUExBVEZPUk0lIiA9PSAieDY0IiBTRVQgUFRFWFQ9LXg2NAorICAgIFNFVCBQQVRIPUM6XFB5dGhvbiVQWVRIT05fVkVSU0lPTjouPSUhUFRFWFQhXHNjcmlwdHM7QzpcUHl0aG9uJVBZVEhPTl9WRVJTSU9OOi49JSFQVEVYVCE7IVBBVEghCisgICkKKyAgSUYgIiVDT05GSUdVUkFUSU9OJSIgPT0gIkRlYnVnIiAoU0VUIFpMSUJfTElCX1NVRkZJWD1kKQorCisgIElGIE5PVCAiJVFUX1ZFUlNJT04lIiA9PSAiIiAoCisgICAgSUYgL2kgIiVQTEFURk9STSUiID09ICJ4NjQiIFNFVCBRVEVYVD1fNjQKKyAgICBTRVQgUEFUSD1DOlxRdFwlUVRfVkVSU0lPTiVcJVBST0ZJTEUlIVFURVhUIVxiaW47IVBBVEghCisgICkKKworKSBFTFNFIElGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1JTkciICgKKworICA6OiBQTEFURk9STSA9IHg4NiBtZWFucyBNSU5HV1BMQVQgaTY4NgorICA6OiBQTEFURk9STSA9IHg2NCBtZWFucyBNSU5HV1BMQVQgeDg2XzY0CisgIFNFVCBNSU5HV1BMQVQ9eDg2XzY0CisgIElGICIlUExBVEZPUk0lIiA9PSAieDg2IiAoU0VUIE1JTkdXUExBVD1pNjg2KQorCisgIFNFVCBCQVNIPUM6XG1zeXM2NFx1c3JcYmluXGJhc2guZXhlCisgICFCQVNIISAtbGMgInNlZCAtaSAnL2V4cG9ydCBQQVRIPVwvbWluZ3czMlwvYmluL2QnIH4vLmJhc2hfcHJvZmlsZSAmJiBzZWQgLWkgJy9leHBvcnQgUEFUSD1cL21pbmd3NjRcL2Jpbi9kJyB+Ly5iYXNoX3Byb2ZpbGUgJiYgZWNobyAnZXhwb3J0IFBBVEg9L21pbmd3JU5PUk1fUExBVEZPUk0lL2JpbjokUEFUSCcgPj4gfi8uYmFzaF9wcm9maWxlIiB8fCBFWElUIC9CCisKKyAgU0VUIEJVSUxERElSPSVCVUlMRERJUjpcPS8lCisgIFNFVCBCVUlMRERJUj0vYyFCVUlMRERJUjp+MiEKKyAgU0VUIElOU1RESVI9JUlOU1RESVI6XD0vJQorICBTRVQgSU5TVERJUj0vYyFJTlNURElSOn4yIQorICBTRVQgU1JDRElSPSVTUkNESVI6XD0vJQorICBTRVQgU1JDRElSPS9jIVNSQ0RJUjp+MiEKKworKSBFTFNFIElGICIlUFJPRklMRTp+MCw0JSIgPT0gIkNZR1ciICgKKworICBTRVQgQ1lHV0lOUk9PVD1DOlxjeWd3aW4KKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgQ1lHV0lOUk9PVD0hQ1lHV0lOUk9PVCE2NCkKKworICBTRVQgQkFTSD0hQ1lHV0lOUk9PVCFcYmluXGJhc2guZXhlCisgIFNFVCBTRVRVUD0hQ1lHV0lOUk9PVCFcc2V0dXAteDg2CisgIElGICIlUExBVEZPUk0lIiA9PSAieDY0IiAoU0VUIFNFVFVQPSFTRVRVUCFfNjQpCisgIFNFVCBTRVRVUD0hU0VUVVAhLmV4ZQorCisgIFNFVCBCVUlMRERJUj0lQlVJTERESVI6XD0vJQorICBTRVQgQlVJTERESVI9L2N5Z2RyaXZlL2MhQlVJTERESVI6fjIhCisgIFNFVCBJTlNURElSPSVJTlNURElSOlw9LyUKKyAgU0VUIElOU1RESVJfQ1lHPS9jeWdkcml2ZS9jIUlOU1RESVI6fjIhCisgIFNFVCBTUkNESVI9JVNSQ0RJUjpcPS8lCisgIFNFVCBTUkNESVI9L2N5Z2RyaXZlL2MhU1JDRElSOn4yIQorCispCisKK0dPVE8gOkVPRgorCis6U0VUVVBORVdFUk1TVkMKKyAgRk9SIC9GICJVU0VCQUNLUSBUT0tFTlM9KiIgJSVpIElOIChgY2FsbCAiJVByb2dyYW1GaWxlcyh4ODYpJVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpb1xJbnN0YWxsZXJcdnN3aGVyZS5leGUiIC12ZXJzaW9uICJbMTUuMCwxNi4wKSIgLXByb3BlcnR5IGluc3RhbGxhdGlvblBhdGhgKSBETyAoCisgICAgSUYgIiVNU1ZDUk9PVCUiID09ICIiIChTRVQgTVNWQ1JPT1Q9JSVpKQorICApCisgIFNFVCBNU1ZDUExBVD14ODYKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgTVNWQ1BMQVQ9YW1kNjQpCisKKyAgU0VUIENVUlJFTlRESVI9JUNEJQorICBDQUxMICIhTVNWQ1JPT1QhXENvbW1vbjdcVG9vbHNcVnNEZXZDbWQuYmF0IiAtYXJjaD0hTVNWQ1BMQVQhIHx8IEVYSVQgL0IKKyAgQ0QgJUNVUlJFTlRESVIlCisgIEVYSVQgL0IKKworOkVPRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGdlbmVyYXRvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViNmZmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGdlbmVyYXRvci5iYXQKQEAgLTAsMCArMSw3OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbiBhbmQgdGhlbgorOjogc2V0IHRoZSBHRU5FUkFUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjoKKzo6ICBWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNyBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTUgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTIgMjAxMyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEzIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDExIDIwMTIgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMiBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMCAyMDEwIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTAgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJJQTY0Ii4KKzo6ICBNaW5HVyBNYWtlZmlsZXMgICAgICAgICAgICAgID0gR2VuZXJhdGVzIG1ha2VmaWxlcyBmb3IgTWluR1cKKzo6ICBNU1lTIE1ha2VmaWxlcyAgICAgICAgICAgICAgID0gR2VuZXJhdGVzIG1ha2VmaWxlcyBmb3IgTVNZUworOjogIFVuaXggTWFrZWZpbGVzICAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBDWUdXSU4KKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgR0VORVJBVE9SIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBHRU5FUkFUT1IgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgR0VORVJBVE9SCisgIEVYSVQgL0IgMAorKQorCisKK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1JTkciICgKKyAgU0VUIEdFTkVSQVRPUj1NaW5HVyBNYWtlZmlsZXMKKworKSBFTFNFIElGICIlUFJPRklMRTp+MCw0JSIgPT0gIkNZR1ciICgKKyAgU0VUIEdFTkVSQVRPUj1Vbml4IE1ha2VmaWxlcworCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNZUyIgKAorICBTRVQgR0VORVJBVE9SPU1TWVMgTWFrZWZpbGVzCispIEVMU0UgKAorICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIEdFTkFSQ0g9IFdpbjY0CisgIENBTEwgOkNIRUNLIDE2CisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMCAyMDEwIUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE3CisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMSAyMDEyIUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE4CisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMiAyMDEzIUdFTkFSQ0ghCisgIENBTEwgOkNIRUNLIDE5LjAKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE0IDIwMTUhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTkuMQorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTUgMjAxNyFHRU5BUkNIIQorKQorCitJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgKAorICBFQ0hPIFtlcnJvcl0gdW5hYmxlIHRvIGRldGVybWluZSB0aGUgQ01ha2UgZ2VuZXJhdG9yIHRvIHVzZQorICBFWElUIC9CIDEKKykKKworRUNITyBbaW5mbyBdIHVzaW5nIENNYWtlIGdlbmVyYXRvciAgICAgICAgJUdFTkVSQVRPUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJSIgPiBudWwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3Nob3dlbnYuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwYTQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3Nob3dlbnYuYmF0CkBAIC0wLDAgKzEsNjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0VDSE8vCitFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKK0VDSE8gVmVyc2lvbnMKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyBib29zdCAgICAgICAgICAgICAgICAgPSAlQk9PU1RfVkVSU0lPTiUKK0VDSE8gbGliZXZlbnQgICAgICAgICAgICAgID0gJUxJQkVWRU5UX1ZFUlNJT04lCitFQ0hPIHB5dGhvbiAgICAgICAgICAgICAgICA9ICVQWVRIT05fVkVSU0lPTiUKK0VDSE8gcXQgICAgICAgICAgICAgICAgICAgID0gJVFUX1ZFUlNJT04lCitFQ0hPIHpsaWIgICAgICAgICAgICAgICAgICA9ICVaTElCX1ZFUlNJT04lCitFQ0hPLworKQorRUNITyBBcHB2ZXlvciBWYXJpYWJsZXMKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyBBUFBWRVlPUl9CVUlMRF9GT0xERVIgPSAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorRUNITyBDT05GSUdVUkFUSU9OICAgICAgICAgPSAlQ09ORklHVVJBVElPTiUKK0VDSE8gUExBVEZPUk0gICAgICAgICAgICAgID0gJVBMQVRGT1JNJQorRUNITyBQUk9GSUxFICAgICAgICAgICAgICAgPSAlUFJPRklMRSUKK0VDSE8vCitFQ0hPIE91ciBWYXJpYWJsZXMKK0VDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUNITyBBUFBWRVlPUl9TQ1JJUFRTICAgICAgPSAlQVBQVkVZT1JfU0NSSVBUUyUKK0VDSE8gQkFTSCAgICAgICAgICAgICAgICAgID0gJUJBU0glCitFQ0hPIEJPT1NUX1JPT1QgICAgICAgICAgICA9ICVCT09TVF9ST09UJQorRUNITyBCT09TVF9JTkNMVURFRElSICAgICAgPSAlQk9PU1RfSU5DTFVERURJUiUKK0VDSE8gQk9PU1RfTElCUkFSWURJUiAgICAgID0gJUJPT1NUX0xJQlJBUllESVIlCitFQ0hPIEJVSUxERElSICAgICAgICAgICAgICA9ICVCVUlMRERJUiUKK0VDSE8gQ09NUElMRVIgICAgICAgICAgICAgID0gJUNPTVBJTEVSJQorRUNITyBHRU5FUkFUT1IgICAgICAgICAgICAgPSAlR0VORVJBVE9SJQorRUNITyBJTlNURElSICAgICAgICAgICAgICAgPSAlSU5TVERJUiUKK0VDSE8gSkFWQV9IT01FICAgICAgICAgICAgID0gJUpBVkFfSE9NRSUKK0VDSE8gT1BFTlNTTF9ST09UICAgICAgICAgID0gJU9QRU5TU0xfUk9PVCUKK0VDSE8gU0VUVVAgICAgICAgICAgICAgICAgID0gJVNFVFVQJQorRUNITyBTUkNESVIgICAgICAgICAgICAgICAgPSAlU1JDRElSJQorRUNITyBXSU4zUCAgICAgICAgICAgICAgICAgPSAlV0lOM1AlCitFQ0hPIFdJVEhfUFlUSE9OICAgICAgICAgICA9ICVXSVRIX1BZVEhPTiUKK0VDSE8gWkxJQl9TVEFUSUNfU1VGRklYICAgID0gJVpMSUJfU1RBVElDX1NVRkZJWCUKK0lGIE5PVCAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1ZDIiAoCisgIEVDSE8vCisgIEVDSE8gVU5JWHkgUEFUSAorICBFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgJUJBU0glIC1sYyAiZWNobyAkUEFUSCIKKykKK0VDSE8vCitFQ0hPIFdpbmRvd3MgUEFUSAorRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPICVQQVRIJQorRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3Ivc2ltdWxhdGUtYXBwdmV5b3IuYmF0IGIvYnVpbGQvYXBwdmV5b3Ivc2ltdWxhdGUtYXBwdmV5b3IuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzRmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQKQEAgLTAsMCArMSwzNSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEhlbHBzIGJ1aWxkIHRocmlmdCBieSBwcmV0ZW5kaW5nIHRvIGJlIGFwcHZleW9yCis6OiBVc2FnZToKKzo6ICAgY2QgYnVpbGRcYXBwdmV5b3IKKzo6ICAgc2ltdWxhdGUtYXBwdmV5b3IuYmF0IFtEZWJ1Z3xSZWxlYXNlXSBbeDg2fHg2NF0gW0NZR1dJTnxNSU5HV3xNU1ZDMjAxP10KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitTRVQgQVBQVkVZT1JfQlVJTERfRk9MREVSPSV+ZHAwLi5cLi4KK1NFVCBDT05GSUdVUkFUSU9OPSUxCitTRVQgUExBVEZPUk09JTIKK1NFVCBQUk9GSUxFPSUzCisKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLWluc3RhbGwuYmF0IHx8IEVYSVQgL0IKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLWJ1aWxkLmJhdCAgIHx8IEVYSVQgL0IKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLXRlc3QuYmF0CmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9DUGFja0NvbmZpZy5jbWFrZSBiL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzFiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9DUGFja0NvbmZpZy5jbWFrZQpAQCAtMCwwICsxLDY4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjVE9ETzogU2hvdWxkIHdlIGJ1bmRsZSBzeXN0ZW0gbGlicmFyaWVzIGZvciBETExzPworI2luY2x1ZGUoSW5zdGFsbFJlcXVpcmVkU3lzdGVtTGlicmFyaWVzKQorCisjIEZvciBoZWxwIHRha2UgYSBsb29rIGF0OgorIyBodHRwOi8vd3d3LmNtYWtlLm9yZy9XaWtpL0NNYWtlOkNQYWNrQ29uZmlndXJhdGlvbgorCisjIyMgZ2VuZXJhbCBzZXR0aW5ncworc2V0KENQQUNLX1BBQ0tBR0VfTkFNRSAidGhyaWZ0IikKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT04gIiR7UEFDS0FHRV9WRVJTSU9OfSIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9ERVNDUklQVElPTl9TVU1NQVJZICJBcGFjaGUgVGhyaWZ0IikKK3NldChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9SRUFETUUubWQiKQorc2V0KENQQUNLX1JFU09VUkNFX0ZJTEVfTElDRU5TRSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0xJQ0VOU0UiKQorc2V0KENQQUNLX1BBQ0tBR0VfVkVORE9SICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9DT05UQUNUICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciKQorc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfSIpCitzZXQoQ1BBQ0tfU1lTVEVNX05BTUUgIiR7Q01BS0VfU1lTVEVNX05BTUV9IikKKworIyMjIHZlcnNpb25zCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01BSk9SICR7dGhyaWZ0X1ZFUlNJT05fTUFKT1J9KQorc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9NSU5PUiAke3RocmlmdF9WRVJTSU9OX01JTk9SfSkKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT05fUEFUQ0ggJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0pCisKKyMjIyBzb3VyY2UgZ2VuZXJhdG9yCitzZXQoQ1BBQ0tfU09VUkNFX0dFTkVSQVRPUiAiVEdaIikKK3NldChDUEFDS19TT1VSQ0VfSUdOT1JFX0ZJTEVTICJ+JDtbLl1zd3AkOy9bLl1zdm4vOy9bLl1naXQvOy5naXRpZ25vcmU7L2J1aWxkLzt0YWdzO2NzY29wZS4qIikKK3NldChDUEFDS19TT1VSQ0VfUEFDS0FHRV9GSUxFX05BTUUgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfS0ke0NQQUNLX1BBQ0tBR0VfVkVSU0lPTn0iKQorCisjIyMgemlwIGdlbmVyYXRvcgorc2V0KENQQUNLX0dFTkVSQVRPUiAiWklQIikKK3NldChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICJ0aHJpZnQiKQorCisKK2lmKENNQUtFX1NZU1RFTV9OQU1FIFNUUkVRVUFMICJXaW5kb3dzIikKKyAgICBzZXQoQ1BBQ0tfR0VORVJBVE9SICJOU0lTIikKKyAgICBzZXQoQ1BBQ0tfTlNJU19IRUxQX0xJTksgImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIpCisgICAgc2V0KENQQUNLX05TSVNfTUVOVV9MSU5LUworICAgICAgICAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiAiQXBhY2hlIFRocmlmdCAtIFdlYiBTaXRlIgorICAgICAgICAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiICJBcGFjaGUgVGhyaWZ0IC0gSXNzdWVzIikKKyAgICBzZXQoQ1BBQ0tfTlNJU19DT05UQUNUICR7Q1BBQ0tfUEFDS0FHRV9DT05UQUNUfSkKKyAgICBzZXQoQ1BBQ0tfTlNJU19NT0RJRllfUEFUSCAiT04iKQorICAgIHNldChDUEFDS19QQUNLQUdFX0lOU1RBTExfRElSRUNUT1JZICIke0NQQUNLX1BBQ0tBR0VfTkFNRX0iKQorZWxzZSgpCisgICAgc2V0KENQQUNLX0dFTkVSQVRPUiAiREVCIiApCisgICAgc2V0KENQQUNLX0RFQklBTl9QQUNLQUdFX01BSU5UQUlORVIgJHtDUEFDS19QQUNLQUdFX0NPTlRBQ1R9KQorZW5kaWYoKQorCisKK2luY2x1ZGUoQ1BhY2spCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UgYi9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3YmZlMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQpAQCAtMCwwICsxLDc5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlcykKK2luY2x1ZGUoQ2hlY2tTeW1ib2xFeGlzdHMpCisKK2lmIChJbnR0eXBlc19GT1VORCkKKyAgIyBUaGlzIGFsbG93cyB0aGUgaW50dHlwZXMuaCBhbmQgc3RkaW50LmggY2hlY2tzIHRvIHN1Y2NlZWQgb24gcGxhdGZvcm1zIHRoYXQKKyAgIyBkbyBub3QgbmF0aXZlbHkgcHJvdmlkZSB0aGVyZS4KKyAgc2V0IChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0lOVFRZUEVTX0lOQ0xVREVfRElSU30pCitlbmRpZiAoKQorCitjaGVja19pbmNsdWRlX2ZpbGUoYXJwYS9pbmV0LmggSEFWRV9BUlBBX0lORVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShmY250bC5oIEhBVkVfRkNOVExfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShnZXRvcHQuaCBIQVZFX0dFVE9QVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGludHR5cGVzLmggSEFWRV9JTlRUWVBFU19IKQorY2hlY2tfaW5jbHVkZV9maWxlKG5ldGRiLmggSEFWRV9ORVREQl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKG5ldGluZXQvaW4uaCBIQVZFX05FVElORVRfSU5fSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzaWduYWwuaCBIQVZFX1NJR05BTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0ZGludC5oIEhBVkVfU1RESU5UX0gpCitjaGVja19pbmNsdWRlX2ZpbGUodW5pc3RkLmggSEFWRV9VTklTVERfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShwdGhyZWFkLmggSEFWRV9QVEhSRUFEX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL2lvY3RsLmggSEFWRV9TWVNfSU9DVExfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvcGFyYW0uaCBIQVZFX1NZU19QQVJBTV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9yZXNvdXJjZS5oIEhBVkVfU1lTX1JFU09VUkNFX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3NvY2tldC5oIEhBVkVfU1lTX1NPQ0tFVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zdGF0LmggSEFWRV9TWVNfU1RBVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy90aW1lLmggSEFWRV9TWVNfVElNRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy91bi5oIEhBVkVfU1lTX1VOX0gpCitjaGVja19pbmNsdWRlX2ZpbGUocG9sbC5oIEhBVkVfUE9MTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9wb2xsLmggSEFWRV9TWVNfUE9MTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zZWxlY3QuaCBIQVZFX1NZU19TRUxFQ1RfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzY2hlZC5oIEhBVkVfU0NIRURfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdHJpbmcuaCBIQVZFX1NUUklOR19IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0cmluZ3MuaCBIQVZFX1NUUklOR1NfSCkKKworY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGdldGhvc3RieW5hbWUgSEFWRV9HRVRIT1NUQllOQU1FKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGdldGhvc3RieW5hbWVfciBIQVZFX0dFVEhPU1RCWU5BTUVfUikKK2NoZWNrX2Z1bmN0aW9uX2V4aXN0cyhzdHJlcnJvcl9yIEhBVkVfU1RSRVJST1JfUikKK2NoZWNrX2Z1bmN0aW9uX2V4aXN0cyhzY2hlZF9nZXRfcHJpb3JpdHlfbWF4IEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01BWCkKK2NoZWNrX2Z1bmN0aW9uX2V4aXN0cyhzY2hlZF9nZXRfcHJpb3JpdHlfbWluIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01JTikKKworaW5jbHVkZShDaGVja0NTb3VyY2VDb21waWxlcykKK2luY2x1ZGUoQ2hlY2tDWFhTb3VyY2VDb21waWxlcykKKworY2hlY2tfY3h4X3NvdXJjZV9jb21waWxlcygKKyAgIgorICAjaW5jbHVkZSA8c3RyaW5nLmg+CisgIGludCBtYWluKCl7Y2hhciBiO2NoYXIgKmEgPSBzdHJlcnJvcl9yKDAsICZiLCAwKTsgcmV0dXJuKDApO30KKyAgIgorICBTVFJFUlJPUl9SX0NIQVJfUCkKKworCitzZXQoUEFDS0FHRSAke1BBQ0tBR0VfTkFNRX0pCitzZXQoUEFDS0FHRV9TVFJJTkcgIiR7UEFDS0FHRV9OQU1FfSAke1BBQ0tBR0VfVkVSU0lPTn0iKQorc2V0KFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0pCisKKyMgZ2VuZXJhdGUgYSBjb25maWcuaCBmaWxlCitjb25maWd1cmVfZmlsZSgiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9jb25maWcuaCIpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzI1NWUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZQpAQCAtMCwwICsxLDkwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjIEFsd2F5cyBpbmNsdWRlIHNyY2RpciBhbmQgYnVpbGRkaXIgaW4gaW5jbHVkZSBwYXRoCisjIFRoaXMgc2F2ZXMgdHlwaW5nICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZfSBpbgorIyBhYm91dCBldmVyeSBzdWJkaXIKKyMgc2luY2UgY21ha2UgMi40LjAKK3NldChDTUFLRV9JTkNMVURFX0NVUlJFTlRfRElSIE9OKQorCisjIFB1dCB0aGUgaW5jbHVkZSBkaXJzIHdoaWNoIGFyZSBpbiB0aGUgc291cmNlIG9yIGJ1aWxkIHRyZWUKKyMgYmVmb3JlIGFsbCBvdGhlciBpbmNsdWRlIGRpcnMsIHNvIHRoZSBoZWFkZXJzIGluIHRoZSBzb3VyY2VzCisjIGFyZSBwcmVmZXJyZWQgb3ZlciB0aGUgYWxyZWFkeSBpbnN0YWxsZWQgb25lcworIyBzaW5jZSBjbWFrZSAyLjQuMQorc2V0KENNQUtFX0lOQ0xVREVfRElSRUNUT1JJRVNfUFJPSkVDVF9CRUZPUkUgT04pCisKKyMgVXNlIGNvbG9yZWQgb3V0cHV0CisjIHNpbmNlIGNtYWtlIDIuNC4wCitzZXQoQ01BS0VfQ09MT1JfTUFLRUZJTEUgT04pCisKKyMgRGVmaW5lIHRoZSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIGxpYnJhcmllcyBoZXJlCitzZXQoR0VORVJJQ19MSUJfVkVSU0lPTiAiMS4wLjAiKQorc2V0KEdFTkVSSUNfTElCX1NPVkVSU0lPTiAiMCIpCisKKyMgU2V0IHRoZSBkZWZhdWx0IGJ1aWxkIHR5cGUgdG8gcmVsZWFzZSB3aXRoIGRlYnVnIGluZm8KK2lmIChOT1QgQ01BS0VfQlVJTERfVFlQRSkKKyAgc2V0KENNQUtFX0JVSUxEX1RZUEUgUmVsV2l0aERlYkluZm8KKyAgICBDQUNIRSBTVFJJTkcKKyAgICAgICJDaG9vc2UgdGhlIHR5cGUgb2YgYnVpbGQsIG9wdGlvbnMgYXJlOiBOb25lIERlYnVnIFJlbGVhc2UgUmVsV2l0aERlYkluZm8gTWluU2l6ZVJlbC4iCisgICkKK2VuZGlmIChOT1QgQ01BS0VfQlVJTERfVFlQRSkKKworIyBDcmVhdGUgdGhlIGNvbXBpbGUgY29tbWFuZCBkYXRhYmFzZSBmb3IgY2xhbmcgYnkgZGVmYXVsdAorc2V0KENNQUtFX0VYUE9SVF9DT01QSUxFX0NPTU1BTkRTIE9OKQorCisjIFB1dCB0aGUgbGlicmFyaWVzIGFuZCBiaW5hcmllcyB0aGF0IGdldCBidWlsdCBpbnRvIGRpcmVjdG9yaWVzIGF0IHRoZQorIyB0b3Agb2YgdGhlIGJ1aWxkIHRyZWUgcmF0aGVyIHRoYW4gaW4gaGFyZC10by1maW5kIGxlYWYKKyMgZGlyZWN0b3JpZXMuIFRoaXMgc2ltcGxpZmllcyBtYW51YWwgdGVzdGluZyBhbmQgdGhlIHVzZSBvZiB0aGUgYnVpbGQKKyMgdHJlZSByYXRoZXIgdGhhbiBpbnN0YWxsZWQgdGhyaWZ0IGxpYnJhcmllcy4KK3NldChDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9saWIpCitzZXQoQ01BS0VfQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0vbGliKQorc2V0KENNQUtFX1JVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2JpbikKKworIworIyAicnBhdGgiIHN1cHBvcnQuCisjIFNlZSBodHRwOi8vd3d3Lml0ay5vcmcvV2lraS9pbmRleC5waHA/dGl0bGU9Q01ha2VfUlBBVEhfaGFuZGxpbmcKKyMKKyMgT24gTWFjT1NYLCBmb3Igc2hhcmVkIGxpYnJhcmllcywgZW5hYmxlIHJwYXRoIHN1cHBvcnQuCitzZXQoQ01BS0VfTUFDT1NYX1JQQVRIIFRSVUUpCisjCisjIE9uIGFueSBPUywgZm9yIGV4ZWN1dGFibGVzLCBhbGxvdyBsaW5raW5nIHdpdGggc2hhcmVkIGxpYnJhcmllcyBpbiBub24tc3lzdGVtCisjIGxvY2F0aW9ucyBhbmQgcnVubmluZyB0aGUgZXhlY3V0YWJsZXMgd2l0aG91dCBMRF9QUkVMT0FEIG9yIHNpbWlsYXIuCisjIFRoaXMgcmVxdWlyZXMgdGhlIGxpYnJhcnkgdG8gYmUgYnVpbHQgd2l0aCBycGF0aCBzdXBwb3J0Lgorc2V0KENNQUtFX0lOU1RBTExfUlBBVEhfVVNFX0xJTktfUEFUSCBUUlVFKQorCisjCisjIEMrKyBMYW5ndWFnZSBMZXZlbCBEZWZhdWx0cyAtIHRoaXMgZGVwZW5kcyBvbiB0aGUgY29tcGlsZXIgY2FwYWJpbGl0aWVzCisjCitpZiAoTk9UIERFRklORUQgQ01BS0VfQ1hYX1NUQU5EQVJEKQorICBzZXQoQ01BS0VfQ1hYX1NUQU5EQVJEIDExKSAjIEMrKzExCisgIG1lc3NhZ2UoU1RBVFVTICJTZXR0aW5nIEMrKzExIGFzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIGxldmVsLiIpCisgIG1lc3NhZ2UoU1RBVFVTICJUbyBzcGVjaWZ5IGEgZGlmZmVyZW50IEMrKyBsYW5ndWFnZSBsZXZlbCwgc2V0IENNQUtFX0NYWF9TVEFOREFSRCIpCitlbmRpZigpCisKK2lmIChDTUFLRV9DWFhfU1RBTkRBUkQgRVFVQUwgOTgpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIm9ubHkgQysrMTEgb3IgYWJvdmUgQysrIHN0YW5kYXJkIGlzIHN1cHBvcnRlZCIpCitlbHNlaWYgKENNQUtFX0NYWF9TVEFOREFSRCBFUVVBTCAxMSkKKyAgIyBzaG91bGQgbm90IGZhbGxiYWNrIHRvIEMrKzk4CisgIHNldChDTUFLRV9DWFhfU1RBTkRBUkRfUkVRVUlSRUQgT04pCitlbmRpZigpCisKK2lmIChOT1QgREVGSU5FRCBDTUFLRV9DWFhfRVhURU5TSU9OUykKKyAgc2V0KENNQUtFX0NYWF9FWFRFTlNJT05TIE9GRikgICAgICAgICMgdXNlIHN0YW5kYXJkcyBjb21wbGlhbnQgbGFuZ3VhZ2UgbGV2ZWwgZm9yIHBvcnRhYmlsaXR5CitlbmRpZigpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVJbnN0YWxsYXRpb25QYXRocy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMmYwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVJbnN0YWxsYXRpb25QYXRocy5jbWFrZQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjIERlZmluZSB0aGUgZGVmYXVsdCBpbnN0YWxsIHBhdGhzCitzZXQoQklOX0lOU1RBTExfRElSICJiaW4iIENBQ0hFIFBBVEggIlRoZSBiaW5hcnkgaW5zdGFsbCBkaXIgKGRlZmF1bHQ6IGJpbikiKQorc2V0KExJQl9JTlNUQUxMX0RJUiAibGliJHtMSUJfU1VGRklYfSIgQ0FDSEUgUEFUSCAiVGhlIGxpYnJhcnkgaW5zdGFsbCBkaXIgKGRlZmF1bHQ6IGxpYiR7TElCX1NVRkZJWH0pIikKK3NldChJTkNMVURFX0lOU1RBTExfRElSICJpbmNsdWRlIiBDQUNIRSBQQVRIICJUaGUgbGlicmFyeSBpbnN0YWxsIGRpciAoZGVmYXVsdDogaW5jbHVkZSkiKQorc2V0KENNQUtFX0lOU1RBTExfRElSICJjbWFrZSIgQ0FDSEUgUEFUSCAiVGhlIHN1YmRpcmVjdG9yeSB0byBpbnN0YWxsIGNtYWtlIGNvbmZpZyBmaWxlcyAoZGVmYXVsdDogY21ha2UpIikKK3NldChET0NfSU5TVEFMTF9ESVIgInNoYXJlL2RvYyIgQ0FDSEUgUEFUSCAiVGhlIHN1YmRpcmVjdG9yeSB0byBpbnN0YWxsIGRvY3VtZW50YXRpb24gZmlsZXMgKGRlZmF1bHQ6IHNoYXJlL2RvYykiKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmZjUzYwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UKQEAgLTAsMCArMSwyMDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK2luY2x1ZGUoQ01ha2VEZXBlbmRlbnRPcHRpb24pCisKK3NldChUSFJJRlRfQ09NUElMRVIgIiIgQ0FDSEUgRklMRVBBVEggIkV4dGVybmFsIFRocmlmdCBjb21waWxlciB0byB1c2UgZHVyaW5nIGJ1aWxkIikKKworIyBBZGRpdGlvbmFsIGNvbXBvbmVudHMKK29wdGlvbihCVUlMRF9DT01QSUxFUiAiQnVpbGQgVGhyaWZ0IGNvbXBpbGVyIiBPTikKKworaWYoQlVJTERfQ09NUElMRVIgT1IgRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICBzZXQoSEFWRV9DT01QSUxFUiBPTikKK2VuZGlmKCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfVEVTVElORyAiQnVpbGQgd2l0aCB1bml0IHRlc3RzIiBPTiAiSEFWRV9DT01QSUxFUiIgT0ZGKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9FWEFNUExFUyAiQnVpbGQgZXhhbXBsZXMiIE9OICJIQVZFX0NPTVBJTEVSIiBPRkYpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX1RVVE9SSUFMUyAiQnVpbGQgVGhyaWZ0IHR1dG9yaWFscyIgT04gIkhBVkVfQ09NUElMRVIiIE9GRikKK29wdGlvbihCVUlMRF9MSUJSQVJJRVMgIkJ1aWxkIFRocmlmdCBsaWJyYXJpZXMiIE9OKQorCisjIExpYnJhcmllcyB0byBidWlsZAorCisjIEVhY2ggbGFuZ3VhZ2UgbGlicmFyeSBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCB1c2luZyB0aGUgV0lUSF88TEFORz4gZmxhZy4KKyMgQnkgZGVmYXVsdCBDTWFrZSBjaGVja3MgaWYgdGhlIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBmb3IgYSBsYW5ndWFnZSBhcmUgcHJlc2VudAorIyBhbmQgZW5hYmxlcyB0aGUgbGlicmFyeSBpZiBhbGwgYXJlIGZvdW5kLiBUaGlzIG1lYW5zIHRoZSBkZWZhdWx0IGlzIHRvIGJ1aWxkIGFzCisjIG11Y2ggYXMgcG9zc2libGUgYnV0IGxlYXZpbmcgb3V0IGxpYnJhcmllcyBpZiB0aGVpciBkZXBlbmRlbmNpZXMgYXJlIG5vdCBtZXQuCisKK29wdGlvbihXSVRIX0JPT1NUX1NUQVRJQyAiQnVpbGQgd2l0aCBCb29zdCBzdGF0aWMgbGluayBsaWJyYXJ5IiBPRkYpCitzZXQoQm9vc3RfVVNFX1NUQVRJQ19MSUJTICR7V0lUSF9CT09TVF9TVEFUSUN9KQoraWYgKE5PVCBXSVRIX0JPT1NUX1NUQVRJQykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURCT09TVF9BTExfRFlOX0xJTkspCisgICAgYWRkX2RlZmluaXRpb25zKC1EQk9PU1RfVEVTVF9EWU5fTElOSykKK2VuZGlmKCkKKworIyBDKysKK29wdGlvbihXSVRIX0NQUCAiQnVpbGQgQysrIFRocmlmdCBsaWJyYXJ5IiBPTikKK2lmKFdJVEhfQ1BQKQorICAgIGZpbmRfcGFja2FnZShCb29zdCAxLjUzIFFVSUVUKQorICAgICMgTk9URTogQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgQysrIHNwZWNpZmljLAorICAgICMgYnV0IGluIGZ1dHVyZSBvdGhlciBsaWJyYXJpZXMgbWlnaHQgcmV1c2UgdGhlbS4KKyAgICAjIFNvIHRoZXkgYXJlIG5vdCBkZXBlbmRlbnQgb24gV0lUSF9DUFAgYnV0IHNldHRpbmcgdGhlbSB3aXRob3V0IFdJVEhfQ1BQIGN1cnJlbnRseQorICAgICMgaGFzIG5vIGVmZmVjdC4KKyAgICBpZihaTElCX0xJQlJBUlkpCisgICAgICAgICMgRmluZFpMSUIuY21ha2UgZG9lcyBub3Qgbm9ybWFsaXplIHBhdGggc28gd2UgbmVlZCB0byBkbyBpdCBvdXJzZWx2ZXMuCisgICAgICAgIGZpbGUoVE9fQ01BS0VfUEFUSCAke1pMSUJfTElCUkFSWX0gWkxJQl9MSUJSQVJZKQorICAgIGVuZGlmKCkKKyAgICBmaW5kX3BhY2thZ2UoWkxJQiBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfWkxJQiAiQnVpbGQgd2l0aCBaTElCIHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkxJQl9GT1VORCIgT0ZGKQorICAgIGZpbmRfcGFja2FnZShMaWJldmVudCBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfTElCRVZFTlQgIkJ1aWxkIHdpdGggbGliZXZlbnQgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaWJldmVudF9GT1VORCIgT0ZGKQorICAgIGZpbmRfcGFja2FnZShRdDQgUVVJRVQgQ09NUE9ORU5UUyBRdENvcmUgUXROZXR3b3JrKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9RVDQgIkJ1aWxkIHdpdGggUXQ0IHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUVQ0X0ZPVU5EIiBPRkYpCisgICAgZmluZF9wYWNrYWdlKFF0NSBRVUlFVCBDT01QT05FTlRTIENvcmUgTmV0d29yaykKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUVQ1ICJCdWlsZCB3aXRoIFF0NSBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF0NV9GT1VORCIgT0ZGKQorICAgIGlmKCR7V0lUSF9RVDR9IEFORCAke1dJVEhfUVQ1fSBBTkQgJHtDTUFLRV9NQUpPUl9WRVJTSU9OfSBMRVNTIDMpCisgICAgICAjIGNtYWtlIDwgMy4wLjAgY2F1c2VzIGNvbmZsaWN0IHdoZW4gYnVpbGRpbmcgYm90aCBRdDQgYW5kIFF0NQorICAgICAgc2V0KFdJVEhfUVQ0IE9GRikKKyAgICBlbmRpZigpCisgICAgZmluZF9wYWNrYWdlKE9wZW5TU0wgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX09QRU5TU0wgIkJ1aWxkIHdpdGggT3BlblNTTCBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9QRU5TU0xfRk9VTkQiIE9GRikKKyAgICBvcHRpb24oV0lUSF9TVERUSFJFQURTICJCdWlsZCB3aXRoIEMrKyBzdGQ6OnRocmVhZCBzdXBwb3J0IiBPTikKK2VuZGlmKCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfQ1BQICJCdWlsZCBDKysgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0NQUDtCb29zdF9GT1VORCIgT0ZGKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1BMVUdJTiAiQnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQiIE9GRgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfQ09NUElMRVI7QlVJTERfQ1BQIiBPRkYpCisKKyMgQyBHTGliCitvcHRpb24oV0lUSF9DX0dMSUIgIkJ1aWxkIEMgKEdMaWIpIFRocmlmdCBsaWJyYXJ5IiBPTikKK2lmKFdJVEhfQ19HTElCKQorICAgIGZpbmRfcGFja2FnZShHTElCIFFVSUVUIENPTVBPTkVOVFMgZ29iamVjdCkKK2VuZGlmKCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfQ19HTElCICJCdWlsZCBDIChHTGliKSBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfQ19HTElCO0dMSUJfRk9VTkQiIE9GRikKKworaWYoQlVJTERfQ1BQKQorICAgIHNldChib29zdF9jb21wb25lbnRzKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGxpc3QoQVBQRU5EIGJvb3N0X2NvbXBvbmVudHMgc3lzdGVtIHRocmVhZCkKKyAgICBlbmRpZigpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgbGlzdChBUFBFTkQgYm9vc3RfY29tcG9uZW50cyB1bml0X3Rlc3RfZnJhbWV3b3JrIGZpbGVzeXN0ZW0gY2hyb25vIHByb2dyYW1fb3B0aW9ucykKKyAgICBlbmRpZigpCisgICAgaWYoYm9vc3RfY29tcG9uZW50cykKKyAgICAgICAgZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMgUkVRVUlSRUQgQ09NUE9ORU5UUyAke2Jvb3N0X2NvbXBvbmVudHN9KQorICAgIGVuZGlmKCkKK2Vsc2VpZihCVUlMRF9DX0dMSUIgQU5EIEJVSUxEX1RFU1RJTkcpCisgICAgZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMgUkVRVUlSRUQpCitlbmRpZigpCisKKyMgSmF2YQorb3B0aW9uKFdJVEhfSkFWQSAiQnVpbGQgSmF2YSBUaHJpZnQgbGlicmFyeSIgT04pCitpZihBTkRST0lEKQorICAgIGZpbmRfcGFja2FnZShHcmFkbGUgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9KQVZBICJCdWlsZCBKYXZhIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfSkFWQTtHUkFETEVfRk9VTkQiIE9GRikKK2Vsc2UoKQorICAgIGZpbmRfcGFja2FnZShHcmFkbGV3IFFVSUVUKQorICAgIGZpbmRfcGFja2FnZShKYXZhIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfSkFWQSAiQnVpbGQgSmF2YSBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0pBVkE7SkFWQV9GT1VORDtHUkFETEVXX0ZPVU5EIiBPRkYpCitlbmRpZigpCisKKyMgUHl0aG9uCitvcHRpb24oV0lUSF9QWVRIT04gIkJ1aWxkIFB5dGhvbiBUaHJpZnQgbGlicmFyeSIgT04pCitmaW5kX3BhY2thZ2UoUHl0aG9uSW50ZXJwIFFVSUVUKSAjIGZvciBQeXRob24gZXhlY3V0YWJsZQorZmluZF9wYWNrYWdlKFB5dGhvbkxpYnMgUVVJRVQpICMgZm9yIFB5dGhvbi5oCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX1BZVEhPTiAiQnVpbGQgUHl0aG9uIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9QWVRIT047UFlUSE9OTElCU19GT1VORCIgT0ZGKQorCisjIEhhc2tlbGwKK29wdGlvbihXSVRIX0hBU0tFTEwgIkJ1aWxkIEhhc2tlbGwgVGhyaWZ0IGxpYnJhcnkiIE9OKQorZmluZF9wYWNrYWdlKEdIQyBRVUlFVCkKK2ZpbmRfcGFja2FnZShDYWJhbCBRVUlFVCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfSEFTS0VMTCAiQnVpbGQgR0hDIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9IQVNLRUxMO0dIQ19GT1VORDtDQUJBTF9GT1VORCIgT0ZGKQorCisjIENvbW1vbiBsaWJyYXJ5IG9wdGlvbnMKK29wdGlvbihXSVRIX1NIQVJFRF9MSUIgIkJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIE9OKQorb3B0aW9uKFdJVEhfU1RBVElDX0xJQiAiQnVpbGQgc3RhdGljIGxpYnJhcmllcyIgT04pCitpZiAoTk9UIFdJVEhfU0hBUkVEX0xJQiBBTkQgTk9UIFdJVEhfU1RBVElDX0xJQikKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgYnVpbGQgd2l0aCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIG91dHB1dHMgZGlzYWJsZWQhIikKK2VuZGlmKCkKKworI05PVEU6IEMrKyBjb21waWxlciBvcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBsaWIvY3BwL0NNYWtlTGlzdHMudHh0CisKKyMgVmlzdWFsIFN0dWRpbyBvbmx5IG9wdGlvbnMKK2lmKE1TVkMpCitvcHRpb24oV0lUSF9NVCAiQnVpbGQgdXNpbmcgTVQgaW5zdGVhZCBvZiBNRCAoTVNWQyBvbmx5KSIgT0ZGKQorZW5kaWYoTVNWQykKKworbWFjcm8oTUVTU0FHRV9ERVAgZmxhZyBzdW1tYXJ5KQoraWYoTk9UICR7ZmxhZ30pCisgIG1lc3NhZ2UoU1RBVFVTICIgICAtICR7c3VtbWFyeX0iKQorZW5kaWYoKQorZW5kbWFjcm8oTUVTU0FHRV9ERVAgZmxhZyBzdW1tYXJ5KQorCittYWNybyhQUklOVF9DT05GSUdfU1VNTUFSWSkKK21lc3NhZ2UoU1RBVFVTICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKK21lc3NhZ2UoU1RBVFVTICJUaHJpZnQgdmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aHJpZnRfVkVSU0lPTn0gKCR7dGhyaWZ0X1ZFUlNJT05fTUFKT1J9LiR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9LiR7dGhyaWZ0X1ZFUlNJT05fUEFUQ0h9KSIpCittZXNzYWdlKFNUQVRVUyAiVGhyaWZ0IHBhY2thZ2UgdmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICR7UEFDS0FHRV9WRVJTSU9OfSIpCittZXNzYWdlKFNUQVRVUyAiQnVpbGQgY29uZmlndXJhdGlvbiBTdW1tYXJ5IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFRocmlmdCBjb21waWxlcjogICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9DT01QSUxFUn0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQ6ICAgICAgICAgICAgICAke1dJVEhfUExVR0lOfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIHVuaXQgdGVzdHM6ICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfVEVTVElOR30iKQorTUVTU0FHRV9ERVAoSEFWRV9DT01QSUxFUiAiRGlzYWJsZWQgYmVjYXVzZSBCVUlMRF9USFJJRlQ9T0ZGIGFuZCBubyB2YWxpZCBUSFJJRlRfQ09NUElMRVIgaXMgZ2l2ZW4iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgZXhhbXBsZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0VYQU1QTEVTfSIpCitNRVNTQUdFX0RFUChIQVZFX0NPTVBJTEVSICJEaXNhYmxlZCBiZWNhdXNlIEJVSUxEX1RIUklGVD1PRkYgYW5kIG5vIHZhbGlkIFRIUklGVF9DT01QSUxFUiBpcyBnaXZlbiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBUaHJpZnQgbGlicmFyaWVzOiAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfTElCUkFSSUVTfSIpCittZXNzYWdlKFNUQVRVUyAiIExhbmd1YWdlIGxpYnJhcmllczoiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgQysrIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NQUH0iKQorTUVTU0FHRV9ERVAoV0lUSF9DUFAgIkRpc2FibGVkIGJ5IFdJVEhfQ1BQPU9GRiIpCitNRVNTQUdFX0RFUChCb29zdF9GT1VORCAiQm9vc3QgaGVhZGVycyBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTICIgICAgQysrIExhbmd1YWdlIExldmVsOiAgICAgICAgICAgICAgICAgICAgICAgJHtDWFhfTEFOR1VBR0VfTEVWRUx9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIEMgKEdMaWIpIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9DX0dMSUJ9IikKK01FU1NBR0VfREVQKFdJVEhfQ19HTElCICJEaXNhYmxlZCBieSBXSVRIX0NfR0xJQj1PRkYiKQorTUVTU0FHRV9ERVAoR0xJQl9GT1VORCAiR0xpYiBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIEphdmEgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9KQVZBfSIpCitNRVNTQUdFX0RFUChXSVRIX0pBVkEgIkRpc2FibGVkIGJ5IFdJVEhfSkFWQT1PRkYiKQoraWYoQU5EUk9JRCkKKyAgICBNRVNTQUdFX0RFUChHUkFETEVfRk9VTkQgIkdyYWRsZSBtaXNzaW5nIikKK2Vsc2UoKQorICAgIE1FU1NBR0VfREVQKEpBVkFfRk9VTkQgIkphdmEgUnVudGltZSBtaXNzaW5nIikKKyAgICBNRVNTQUdFX0RFUChHUkFETEVXX0ZPVU5EICJHcmFkbGUgV3JhcHBlciBtaXNzaW5nIikKK2VuZGlmKCkKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFB5dGhvbiBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9QWVRIT059IikKK01FU1NBR0VfREVQKFdJVEhfUFlUSE9OICJEaXNhYmxlZCBieSBXSVRIX1BZVEhPTj1PRkYiKQorTUVTU0FHRV9ERVAoUFlUSE9OTElCU19GT1VORCAiUHl0aG9uIGxpYnJhcmllcyBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIEhhc2tlbGwgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9IQVNLRUxMfSIpCitNRVNTQUdFX0RFUChXSVRIX0hBU0tFTEwgIkRpc2FibGVkIGJ5IFdJVEhfSEFTS0VMTD1PRkYiKQorTUVTU0FHRV9ERVAoR0hDX0ZPVU5EICJHSEMgbWlzc2luZyIpCitNRVNTQUdFX0RFUChDQUJBTF9GT1VORCAiQ2FiYWwgbWlzc2luZyIpCittZXNzYWdlKFNUQVRVUyAiIExpYnJhcnkgZmVhdHVyZXM6IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1NIQVJFRF9MSUJ9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1NUQVRJQ19MSUJ9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggQm9vc3Qgc3RhdGljIGxpbmsgbGlicmFyeTogICAgICAgJHtXSVRIX0JPT1NUX1NUQVRJQ30iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydDogICAgICAgICAke1dJVEhfU1REVEhSRUFEU30iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBsaWJldmVudCBzdXBwb3J0OiAgICAgICAgICAgICAgICAke1dJVEhfTElCRVZFTlR9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggT3BlblNTTCBzdXBwb3J0OiAgICAgICAgICAgICAgICAgJHtXSVRIX09QRU5TU0x9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggUXQ0IHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1FUNH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBRdDUgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICAke1dJVEhfUVQ1fSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFpMSUIgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICR7V0lUSF9aTElCfSIpCittZXNzYWdlKFNUQVRVUyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCitlbmRtYWNybyhQUklOVF9DT05GSUdfU1VNTUFSWSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjExMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlCkBAIC0wLDAgKzEsMTE4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBVbmNvbW1lbnQgdGhpcyB0byBzaG93IHNvbWUgYmFzaWMgY21ha2UgdmFyaWFibGVzIGFib3V0IHBsYXRmb3JtcworIyBpbmNsdWRlIChOZXdQbGF0Zm9ybURlYnVnKQorCisjIFZpc3VhbCBTdHVkaW8gc3BlY2lmaWMgb3B0aW9ucworaWYoTVNWQykKKyAgICAjRm9yIHZpc3VhbCBzdHVkaW8gdGhlIGxpYnJhcnkgbmFtaW5nIGlzIGFzIGZvbGxvd2luZzoKKyAgICAjIER5bmFtaWMgbGlicmFyaWVzOgorICAgICMgIC0gdGhyaWZ0LmRsbCAgZm9yIHJlbGVhc2UgbGlicmFyeQorICAgICMgIC0gdGhyaWZ0ZC5kbGwgZm9yIGRlYnVnIGxpYnJhcnkKKyAgICAjCisgICAgIyBTdGF0aWMgbGlicmFyaWVzOgorICAgICMgIC0gdGhyaWZ0bWQubGliIGZvciAvTUQgcmVsZWFzZSBidWlsZAorICAgICMgIC0gdGhyaWZ0bXQubGliIGZvciAvTVQgcmVsZWFzZSBidWlsZAorICAgICMKKyAgICAjICAtIHRocmlmdG1kZC5saWIgZm9yIC9NRCBkZWJ1ZyBidWlsZAorICAgICMgIC0gdGhyaWZ0bXRkLmxpYiBmb3IgL01UIGRlYnVnIGJ1aWxkCisgICAgIworICAgICMgdGhlIHNhbWUgaG9sZHMgZm9yIG90aGVyIGxpYnJhcmllcyBsaWtlIGxpYnRocmlmdHogZXRjLgorCisgICAgIyBGb3IgRGVidWcgYnVpbGQgdHlwZXMsIGFwcGVuZCBhICJkIiB0byB0aGUgbGlicmFyeSBuYW1lcy4KKyAgICBzZXQoQ01BS0VfREVCVUdfUE9TVEZJWCAiZCIgQ0FDSEUgU1RSSU5HICJTZXQgZGVidWcgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICBzZXQoQ01BS0VfUkVMRUFTRV9QT1NURklYICIiIENBQ0hFIFNUUklORyAiU2V0IHJlbGVhc2UgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICBzZXQoQ01BS0VfUkVMV0lUSERFQklORk9fUE9TVEZJWCAiIiBDQUNIRSBTVFJJTkcgIlNldCByZWxlYXNlIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisKKyAgICAjIEJ1aWxkIHVzaW5nIC9NVCBvcHRpb24gaW5zdGVhZCBvZiAvTUQgaWYgdGhlIFdJVEhfTVQgb3B0aW9ucyBpcyBzZXQKKyAgICBpZihXSVRIX01UKQorICAgICAgICBzZXQoQ29tcGlsZXJGbGFncworICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHUworICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19ERUJVRworICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19SRUxFQVNFCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPCisgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHUworICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfREVCVUcKKyAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPCisgICAgICAgICAgICAgICAgKQorICAgICAgICBmb3JlYWNoKENvbXBpbGVyRmxhZyAke0NvbXBpbGVyRmxhZ3N9KQorICAgICAgICAgIHN0cmluZyhSRVBMQUNFICIvTUQiICIvTVQiICR7Q29tcGlsZXJGbGFnfSAiJHske0NvbXBpbGVyRmxhZ319IikKKyAgICAgICAgZW5kZm9yZWFjaCgpCisgICAgICAgIHNldChTVEFUSUNfUE9TVEZJWCAibXQiIENBQ0hFIFNUUklORyAiU2V0IHN0YXRpYyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIGVsc2UoV0lUSF9NVCkKKyAgICAgICAgc2V0KFNUQVRJQ19QT1NURklYICJtZCIgQ0FDSEUgU1RSSU5HICJTZXQgc3RhdGljIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisgICAgZW5kaWYoV0lUSF9NVCkKKworICAgICMgRGlzYWJsZSBib29zdCBhdXRvIGxpbmtpbmcgcHJhZ21hcyAtIGNtYWtlIGluY2x1ZGVzIHRoZSByaWdodCBmaWxlcworICAgIGFkZF9kZWZpbml0aW9ucygiLURCT09TVF9BTExfTk9fTElCIikKKworICAgICMgV2luZG93cyBidWlsZCBkb2VzIG5vdCBrbm93IGhvdyB0byBtYWtlIGEgc2hhcmVkIGxpYnJhcnkgeWV0CisgICAgIyBhcyB0aGVyZSBhcmUgbm8gX19kZWNsc3BlYyhkbGxleHBvcnQpIG9yIGV4cG9ydHMgZmlsZXMgaW4gdGhlIHByb2plY3QuCisgICAgaWYgKFdJVEhfU0hBUkVEX0xJQikKKyAgICAgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJXaW5kb3dzIGJ1aWxkIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcnkgb3V0cHV0IHlldCwgcGxlYXNlIHNldCAtRFdJVEhfU0hBUkVEX0xJQj1vZmYiKQorICAgIGVuZGlmKCkKKworICAgIGFkZF9kZWZpbml0aW9ucygiL01QIikgIyBwYXJhbGxlbCBidWlsZAorICAgIGFkZF9kZWZpbml0aW9ucygiL1czIikgIyB3YXJuaW5nIGxldmVsIDMKKworICAgICMgVlMyMDEwIGRvZXMgbm90IHByb3ZpZGUgaW50dHlwZXMgd2hpY2ggd2UgbmVlZCBmb3IgIlBSSWQ2NCIgdXNlZCBpbiBtYW55IHBsYWNlcworICAgIGZpbmRfcGFja2FnZShJbnR0eXBlcykKKyAgICBpZiAoSW50dHlwZXNfRk9VTkQpCisgICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7SU5UVFlQRVNfSU5DTFVERV9ESVJTfSkKKyAgICAgICMgT3BlblNTTCBjb25mbGljdHMgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiBQUklkNjQgdW5sZXNzIGl0IGlzIGRlZmluZWQgZmlyc3QKKyAgICAgIGFkZF9kZWZpbml0aW9ucygiL0ZJaW50dHlwZXMuaCIpCisgICAgZW5kaWYgKCkKK2Vsc2VpZihVTklYKQorICBmaW5kX3Byb2dyYW0oIE1FTU9SWUNIRUNLX0NPTU1BTkQgdmFsZ3JpbmQgKQorICBzZXQoIE1FTU9SWUNIRUNLX0NPTU1BTkRfT1BUSU9OUyAiLS1nZW4tc3VwcHJlc3Npb25zPWFsbCAtLWxlYWstY2hlY2s9ZnVsbCIgKQorICBzZXQoIE1FTU9SWUNIRUNLX1NVUFBSRVNTSU9OU19GSUxFICIke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC92YWxncmluZC5zdXBwcmVzcyIgKQorZW5kaWYoKQorCithZGRfZGVmaW5pdGlvbnMoIi1EX19TVERDX0ZPUk1BVF9NQUNST1MiKQorYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19MSU1JVF9NQUNST1MiKQorCisjIFdJVEhfKlRIUkVBRFMgc2VsZWN0cyB3aGljaCB0aHJlYWRpbmcgbGlicmFyeSB0byB1c2UKK2lmKFdJVEhfU1REVEhSRUFEUykKKyAgYWRkX2RlZmluaXRpb25zKCItRFVTRV9TVERfVEhSRUFEPTEiKQorZW5kaWYoKQorCisjIEMrKyBMYW5ndWFnZSBMZXZlbAorc2V0KENYWF9MQU5HVUFHRV9MRVZFTCAiQysrJHtDTUFLRV9DWFhfU1RBTkRBUkR9IikKK2lmIChDTUFLRV9DWFhfU1RBTkRBUkRfUkVRVUlSRUQpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW2NvbXBpbGVyIG11c3Qgc3VwcG9ydCBpdF0iKQorZWxzZSgpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW2ZhbGxiYWNrIHRvIGVhcmxpZXIgaWYgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBpdF0iKQorZW5kaWYoKQoraWYgKENNQUtFX0NYWF9FWFRFTlNJT05TKQorICBzdHJpbmcoQ09OQ0FUIENYWF9MQU5HVUFHRV9MRVZFTCAiJHtDWFhfTEFOR1VBR0VfTEVWRUx9IFt3aXRoIGNvbXBpbGVyLXNwZWNpZmljIGV4dGVuc2lvbnNdIikKK2VuZGlmKCkKKworaWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBNQVRDSEVTICJDbGFuZyIpCisgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtV25vLWRlcHJlY2F0ZWQtcmVnaXN0ZXIiKQorZW5kaWYoKQorCisjIEJ1aWxkaW5nIFdJVEhfUExVR0lOIHJlcXVpcmVzIGJvb3N0IG1lbW9yeSBvcGVyYXRpb25zLCBmb3Igbm93LCBhbmQgZ2NjID49IDQuOAoraWYgKFdJVEhfUExVR0lOKQorICBpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIE1BVENIRVMgIkdOVSIgQU5EIENNQUtFX0NYWF9DT01QSUxFUl9WRVJTSU9OIFZFUlNJT05fTEVTUyAiNC44IikKKyAgICBtZXNzYWdlKFNFTkRfRVJST1IgIlRocmlmdCBjb21waWxlciBwbHVnLWluIHN1cHBvcnQgaXMgbm90IHBvc3NpYmxlIHdpdGggb2xkZXIgZ2NjICggPCA0LjggKSBjb21waWxlciIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRBbnQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwMzcxZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRBbnQuY21ha2UKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgQU5UX0ZPVU5EIC0gc3lzdGVtIGhhcyBBbnQKKyMgIEFudF9FWEVDVVRBQkxFIC0gdGhlIEFudCBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBBTlRfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEFudF9FWEVDVVRBQkxFIE5BTUVTIGFudCBQQVRIUyAkRU5We0FOVF9IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoQW50IERFRkFVTFRfTVNHIEFudF9FWEVDVVRBQkxFKQorbWFya19hc19hZHZhbmNlZChBbnRfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRDYWJhbC5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRDYWJhbC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQzMzdiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZENhYmFsLmNtYWtlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIENhYmFsX0ZPVU5EIC0gc3lzdGVtIGhhcyBDYWJhbAorIyAgQ2FiYWwgLSB0aGUgQ2FiYWwgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0FCQUxfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKENBQkFMIE5BTUVTIGNhYmFsIFBBVEhTICRFTlZ7SE9NRX0vLmNhYmFsL2JpbiAkRU5We0NBQkFMX0hPTUV9L2JpbikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhDQUJBTCBERUZBVUxUX01TRyBDQUJBTCkKK21hcmtfYXNfYWR2YW5jZWQoQ0FCQUwpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdIQy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODczODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdIQy5jbWFrZQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBHSENfRk9VTkQgLSBzeXN0ZW0gaGFzIEdIQworIyAgR0hDIC0gdGhlIEdIQyBleGVjdXRhYmxlCisjICBSVU5fSEFTS0VMTF9GT1VORCAtIHN5c3RlbSBoYXMgcnVuaGFza2VsbAorIyAgUlVOX0hBU0tFTEwgLSB0aGUgcnVuaGFza2VsbCBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHSENfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdIQyBOQU1FUyBnaGMgUEFUSFMgJEVOVntHSENfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdIQyBERUZBVUxUX01TRyBHSEMpCittYXJrX2FzX2FkdmFuY2VkKEdIQykKKworZmluZF9wcm9ncmFtKFJVTl9IQVNLRUxMIE5BTUVTIHJ1bmhhc2tlbGwgUEFUSFMgJEVOVntHSENfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFJVTl9IQVNLRUxMIERFRkFVTFRfTVNHIFJVTl9IQVNLRUxMKQorbWFya19hc19hZHZhbmNlZChSVU5fSEFTS0VMTCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHTElCLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdMSUIuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiZTQzMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRHTElCLmNtYWtlCkBAIC0wLDAgKzEsMTIyIEBACisjIC0gVHJ5IHRvIGZpbmQgR2xpYiBhbmQgaXRzIGNvbXBvbmVudHMgKGdpbywgZ29iamVjdCBldGMpCisjIE9uY2UgZG9uZSwgdGhpcyB3aWxsIGRlZmluZQorIworIyAgR0xJQl9GT1VORCAtIHN5c3RlbSBoYXMgR2xpYgorIyAgR0xJQl9JTkNMVURFX0RJUlMgLSB0aGUgR2xpYiBpbmNsdWRlIGRpcmVjdG9yaWVzCisjICBHTElCX0xJQlJBUklFUyAtIGxpbmsgdGhlc2UgdG8gdXNlIEdsaWIKKyMKKyMgT3B0aW9uYWxseSwgdGhlIENPTVBPTkVOVFMga2V5d29yZCBjYW4gYmUgcGFzc2VkIHRvIGZpbmRfcGFja2FnZSgpCisjIGFuZCBHbGliIGNvbXBvbmVudHMgY2FuIGJlIGxvb2tlZCBmb3IuICBDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcKKyMgY29tcG9uZW50cyBjYW4gYmUgdXNlZCwgYW5kIHRoZXkgZGVmaW5lIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGlmCisjIGZvdW5kOgorIworIyAgZ2lvOiAgICAgICAgICAgICBHTElCX0dJT19MSUJSQVJJRVMKKyMgIGdvYmplY3Q6ICAgICAgICAgR0xJQl9HT0JKRUNUX0xJQlJBUklFUworIyAgZ21vZHVsZTogICAgICAgICBHTElCX0dNT0RVTEVfTElCUkFSSUVTCisjICBndGhyZWFkOiAgICAgICAgIEdMSUJfR1RIUkVBRF9MSUJSQVJJRVMKKyMKKyMgTm90ZSB0aGF0IHRoZSByZXNwZWN0aXZlIF9JTkNMVURFX0RJUiB2YXJpYWJsZXMgYXJlIG5vdCBzZXQsIHNpbmNlCisjIGFsbCBoZWFkZXJzIGFyZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgR0xJQl9JTkNMVURFX0RJUlMuCisjCisjIENvcHlyaWdodCAoQykgMjAxMiBSYXBoYWVsIEt1Ym8gZGEgQ29zdGEgPHJha3Vjb0B3ZWJraXQub3JnPgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVIgQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUworIyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIElUUworIyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKKyMgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisjIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisjIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ZpbmRfcGFja2FnZShQa2dDb25maWcpCitwa2dfY2hlY2tfbW9kdWxlcyhQQ19HTElCIFFVSUVUIGdsaWItMi4wKQorCitmaW5kX2xpYnJhcnkoR0xJQl9MSUJSQVJJRVMKKyAgICBOQU1FUyBnbGliLTIuMAorICAgIEhJTlRTICR7UENfR0xJQl9MSUJESVJ9CisgICAgICAgICAgJHtQQ19HTElCX0xJQlJBUllfRElSU30KKykKKworIyBGaWxlcyBpbiBnbGliJ3MgbWFpbiBpbmNsdWRlIHBhdGggbWF5IGluY2x1ZGUgZ2xpYmNvbmZpZy5oLCB3aGljaCwKKyMgZm9yIHNvbWUgb2RkIHJlYXNvbiwgaXMgbm9ybWFsbHkgaW4gJExJQkRJUi9nbGliLTIuMC9pbmNsdWRlLgorZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChfR0xJQl9MSUJSQVJZX0RJUiAke0dMSUJfTElCUkFSSUVTfSBQQVRIKQorZmluZF9wYXRoKEdMSUJDT05GSUdfSU5DTFVERV9ESVIKKyAgICBOQU1FUyBnbGliY29uZmlnLmgKKyAgICBISU5UUyAke1BDX0xJQkRJUn0gJHtQQ19MSUJSQVJZX0RJUlN9ICR7X0dMSUJfTElCUkFSWV9ESVJ9CisgICAgICAgICAgJHtQQ19HTElCX0lOQ0xVREVESVJ9ICR7UENfR0xJQl9JTkNMVURFX0RJUlN9CisgICAgUEFUSF9TVUZGSVhFUyBnbGliLTIuMC9pbmNsdWRlCispCisKK2ZpbmRfcGF0aChHTElCX0lOQ0xVREVfRElSCisgICAgTkFNRVMgZ2xpYi5oCisgICAgSElOVFMgJHtQQ19HTElCX0lOQ0xVREVESVJ9CisgICAgICAgICAgJHtQQ19HTElCX0lOQ0xVREVfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGdsaWItMi4wCispCisKK3NldChHTElCX0lOQ0xVREVfRElSUyAke0dMSUJfSU5DTFVERV9ESVJ9ICR7R0xJQkNPTkZJR19JTkNMVURFX0RJUn0pCisKK2lmKEdMSUJDT05GSUdfSU5DTFVERV9ESVIpCisgICAgIyBWZXJzaW9uIGRldGVjdGlvbgorICAgIGZpbGUoUkVBRCAiJHtHTElCQ09ORklHX0lOQ0xVREVfRElSfS9nbGliY29uZmlnLmgiIEdMSUJDT05GSUdfSF9DT05URU5UUykKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIiNkZWZpbmUgR0xJQl9NQUpPUl9WRVJTSU9OIChbMC05XSspIiBfZHVtbXkgIiR7R0xJQkNPTkZJR19IX0NPTlRFTlRTfSIpCisgICAgc2V0KEdMSUJfVkVSU0lPTl9NQUpPUiAiJHtDTUFLRV9NQVRDSF8xfSIpCisgICAgc3RyaW5nKFJFR0VYIE1BVENIICIjZGVmaW5lIEdMSUJfTUlOT1JfVkVSU0lPTiAoWzAtOV0rKSIgX2R1bW15ICIke0dMSUJDT05GSUdfSF9DT05URU5UU30iKQorICAgIHNldChHTElCX1ZFUlNJT05fTUlOT1IgIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiI2RlZmluZSBHTElCX01JQ1JPX1ZFUlNJT04gKFswLTldKykiIF9kdW1teSAiJHtHTElCQ09ORklHX0hfQ09OVEVOVFN9IikKKyAgICBzZXQoR0xJQl9WRVJTSU9OX01JQ1JPICIke0NNQUtFX01BVENIXzF9IikKKyAgICBzZXQoR0xJQl9WRVJTSU9OICIke0dMSUJfVkVSU0lPTl9NQUpPUn0uJHtHTElCX1ZFUlNJT05fTUlOT1J9LiR7R0xJQl9WRVJTSU9OX01JQ1JPfSIpCitlbmRpZigpCisKKyMgQWRkaXRpb25hbCBHbGliIGNvbXBvbmVudHMuICBXZSBvbmx5IGxvb2sgZm9yIGxpYnJhcmllcywgYXMgbm90IGFsbCBvZiB0aGVtCisjIGhhdmUgY29ycmVzcG9uZGluZyBoZWFkZXJzIGFuZCBhbGwgaGVhZGVycyBhcmUgaW5zdGFsbGVkIGFsb25nc2lkZSB0aGUgbWFpbgorIyBnbGliIG9uZXMuCitmb3JlYWNoIChfY29tcG9uZW50ICR7R0xJQl9GSU5EX0NPTVBPTkVOVFN9KQorICAgIGlmICgke19jb21wb25lbnR9IFNUUkVRVUFMICJnaW8iKQorICAgICAgICBmaW5kX2xpYnJhcnkoR0xJQl9HSU9fTElCUkFSSUVTIE5BTUVTIGdpby0yLjAgSElOVFMgJHtfR0xJQl9MSUJSQVJZX0RJUn0pCisgICAgICAgIHNldChBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlMgJHtBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlN9IEdMSUJfR0lPX0xJQlJBUklFUykKKyAgICBlbHNlaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImdvYmplY3QiKQorICAgICAgICBmaW5kX2xpYnJhcnkoR0xJQl9HT0JKRUNUX0xJQlJBUklFUyBOQU1FUyBnb2JqZWN0LTIuMCBISU5UUyAke19HTElCX0xJQlJBUllfRElSfSkKKyAgICAgICAgc2V0KEFERElUSU9OQUxfUkVRVUlSRURfVkFSUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30gR0xJQl9HT0JKRUNUX0xJQlJBUklFUykKKyAgICBlbHNlaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImdtb2R1bGUiKQorICAgICAgICBmaW5kX2xpYnJhcnkoR0xJQl9HTU9EVUxFX0xJQlJBUklFUyBOQU1FUyBnbW9kdWxlLTIuMCBISU5UUyAke19HTElCX0xJQlJBUllfRElSfSkKKyAgICAgICAgc2V0KEFERElUSU9OQUxfUkVRVUlSRURfVkFSUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30gR0xJQl9HTU9EVUxFX0xJQlJBUklFUykKKyAgICBlbHNlaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImd0aHJlYWQiKQorICAgICAgICBmaW5kX2xpYnJhcnkoR0xJQl9HVEhSRUFEX0xJQlJBUklFUyBOQU1FUyBndGhyZWFkLTIuMCBISU5UUyAke19HTElCX0xJQlJBUllfRElSfSkKKyAgICAgICAgc2V0KEFERElUSU9OQUxfUkVRVUlSRURfVkFSUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30gR0xJQl9HVEhSRUFEX0xJQlJBUklFUykKKyAgICBlbHNlaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImdpby11bml4IikKKyAgICAgICAgIyBnaW8tdW5peCBpcyBjb21waWxlZCBhcyBwYXJ0IG9mIHRoZSBnaW8gbGlicmFyeSwgYnV0IHRoZSBpbmNsdWRlIHBhdGhzCisgICAgICAgICMgYXJlIHNlcGFyYXRlIGZyb20gdGhlIHNoYXJlZCBnbGliIG9uZXMuIFNpbmNlIHRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZAorICAgICAgICAjIGJ5IFdlYktpdEdUSysgd2UgZG9uJ3QgZ28gdG8gZXh0cmFvcmRpbmFyeSBtZWFzdXJlcyBiZXlvbmQgcGtnLWNvbmZpZy4KKyAgICAgICAgcGtnX2NoZWNrX21vZHVsZXMoR0lPX1VOSVggUVVJRVQgZ2lvLXVuaXgtMi4wKQorICAgIGVuZGlmICgpCitlbmRmb3JlYWNoICgpCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCitGSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoR0xJQiBSRVFVSVJFRF9WQVJTIEdMSUJfSU5DTFVERV9ESVJTIEdMSUJfTElCUkFSSUVTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSU0lPTl9WQVIgICBHTElCX1ZFUlNJT04pCisKK21hcmtfYXNfYWR2YW5jZWQoCisgICAgR0xJQkNPTkZJR19JTkNMVURFX0RJUgorICAgIEdMSUJfR0lPX0xJQlJBUklFUworICAgIEdMSUJfR0lPX1VOSVhfTElCUkFSSUVTCisgICAgR0xJQl9HTU9EVUxFX0xJQlJBUklFUworICAgIEdMSUJfR09CSkVDVF9MSUJSQVJJRVMKKyAgICBHTElCX0dUSFJFQURfTElCUkFSSUVTCisgICAgR0xJQl9JTkNMVURFX0RJUgorICAgIEdMSUJfSU5DTFVERV9ESVJTCisgICAgR0xJQl9MSUJSQVJJRVMKKykKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDVkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxlLmNtYWtlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdSQURMRV9GT1VORCAtIHN5c3RlbSBoYXMgR3JhZGxlCisjICBHUkFETEVfRVhFQ1VUQUJMRSAtIHRoZSBHcmFkbGUgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQU5UX0hPTUUgaWYgaXQgaXMgc2V0CisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShHUkFETEVfRVhFQ1VUQUJMRSBOQU1FUyBncmFkbGUgUEFUSFMgJEVOVntHUkFETEVfSE9NRX0vYmluIE5PX0NNQUtFX0ZJTkRfUk9PVF9QQVRIKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdyYWRsZSBERUZBVUxUX01TRyBHUkFETEVfRVhFQ1VUQUJMRSkKK21hcmtfYXNfYWR2YW5jZWQoR1JBRExFX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YmI5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBHUkFETEVXX0ZPVU5EIC0gc3lzdGVtIGhhcyBHcmFkbGV3CisjICBHUkFETEVXX0VYRUNVVEFCTEUgLSB0aGUgR3JhZGxldyBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBsb2NhdGlvbiBDTUFLRV9TT1VSQ0VfRElSL2xpYi9qYXZhCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShHUkFETEVXX0VYRUNVVEFCTEUgZ3JhZGxldyBQQVRIUyAke0NNQUtFX1NPVVJDRV9ESVJ9L2xpYi9qYXZhIE5PX0RFRkFVTFRfUEFUSCBOT19DTUFLRV9GSU5EX1JPT1RfUEFUSCkKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhHcmFkbGV3IERFRkFVTFRfTVNHIEdSQURMRVdfRVhFQ1VUQUJMRSkKK21hcmtfYXNfYWR2YW5jZWQoR1JBRExFV19FWEVDVVRBQkxFKQorCisjIEJ1Z2d5IGZpbmRfcHJvZ3JhbSBjYW5ub3QgZmluZCBncmFkbGV3LmJhdCB3aGVuIGdyYWRsZXcgaXMgYXQgdGhlIHNhbWUgcGF0aAorIyBhbmQgZXZlbiBidWdnaWVyIGN0ZXN0IHdpbGwgbm90IGV4ZWN1dGUgZ3JhZGxldy5iYXQgd2hlbiBncmFkbGV3IGlzIGdpdmVuLgoraWYoQ01BS0VfSE9TVF9XSU4zMikKKyAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKC4rZ3JhZGxldykkIiAiXFwxLmJhdCIgR1JBRExFV19FWEVDVVRBQkxFICR7R1JBRExFV19FWEVDVVRBQkxFfSkKK2VuZGlmKENNQUtFX0hPU1RfV0lOMzIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2MWY3OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBmaW5kIG1zaW50dHlwZXMgb24gY29tcGlsZXJzIHRoYXQgZG9uJ3QgcHJvdmlkZSBpdCwgZm9yIGV4YW1wbGUKKyMgICBWUzIwMTAKKworIyBVc2FnZTogCisjIFByb3ZpZGUgSU5UVFlQRVNfUk9PVCBpZiB5b3UgbmVlZCBpdAorIyBSZXN1bHQ6IElOVFRZUEVTX0lOQ0xVREVfRElSUywgd2hlcmUgdG8gZmluZCBpbnR0eXBlcy5oCisjIFJlc3VsdDogSW50dHlwZXNfRk9VTkQsIElmIGZhbHNlLCBpbnR0eXBlcy5oIHdhcyBub3QgZm91bmQKKworZmluZF9wYXRoKElOVFRZUEVTX0lOQ0xVREVfRElSUyBpbnR0eXBlcy5oIEhJTlRTICR7SU5UVFlQRVNfUk9PVH0pCitpZiAoSU5UVFlQRVNfSU5DTFVERV9ESVJTKQorICBzZXQoSW50dHlwZXNfRk9VTkQgVFJVRSkKK2Vsc2UgKCkKKyAgc2V0KEludHR5cGVzX0ZPVU5EIEZBTFNFKQorICBpZiAoSW50dHlwZXNfRklORF9SRVFVSVJFRCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDb3VsZCBOT1QgZmluZCBpbnR0eXBlcy5oIikKKyAgZW5kaWYgKCkKKyAgbWVzc2FnZShTVEFUVVMgImludHR5cGVzLmggTk9UIGZvdW5kIikKK2VuZGlmICgpCisKK21hcmtfYXNfYWR2YW5jZWQoCisgIElOVFRZUEVTX0lOQ0xVREVfRElSUworKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNmEwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UKQEAgLTAsMCArMSw0NSBAQAorIyBmaW5kIExpYkV2ZW50CisjIGFuIGV2ZW50IG5vdGlmaWNhdGlvbiBsaWJyYXJ5IChodHRwOi8vbGliZXZlbnQub3JnLykKKyMKKyMgVXNhZ2U6IAorIyBMSUJFVkVOVF9JTkNMVURFX0RJUlMsIHdoZXJlIHRvIGZpbmQgTGliRXZlbnQgaGVhZGVycworIyBMSUJFVkVOVF9MSUJSQVJJRVMsIExpYkV2ZW50IGxpYnJhcmllcworIyBMaWJldmVudF9GT1VORCwgSWYgZmFsc2UsIGRvIG5vdCB0cnkgdG8gdXNlIGxpYmV2ZW50CisKK3NldChMSUJFVkVOVF9ST09UIENBQ0hFIFBBVEggIlJvb3QgZGlyZWN0b3J5IG9mIGxpYmV2ZW50IGluc3RhbGxhdGlvbiIpCitzZXQoTGliRXZlbnRfRVhUUkFfUFJFRklYRVMgL3Vzci9sb2NhbCAvb3B0L2xvY2FsICIkRU5We0hPTUV9IiAke0xJQkVWRU5UX1JPT1R9KQorZm9yZWFjaChwcmVmaXggJHtMaWJFdmVudF9FWFRSQV9QUkVGSVhFU30pCisgIGxpc3QoQVBQRU5EIExpYkV2ZW50X0lOQ0xVREVfUEFUSFMgIiR7cHJlZml4fS9pbmNsdWRlIikKKyAgbGlzdChBUFBFTkQgTGliRXZlbnRfTElCUkFSSUVTX1BBVEhTICIke3ByZWZpeH0vbGliIikKK2VuZGZvcmVhY2goKQorCisjIExvb2tpbmcgZm9yICJldmVudC5oIiB3aWxsIGZpbmQgdGhlIFBsYXRmb3JtIFNESyBpbmNsdWRlIGRpciBvbiB3aW5kb3dzCisjIHNvIHdlIGFsc28gbG9vayBmb3IgYSBwZWVyIGhlYWRlciBsaWtlIGV2aHR0cC5oIHRvIGdldCB0aGUgcmlnaHQgcGF0aAorZmluZF9wYXRoKExJQkVWRU5UX0lOQ0xVREVfRElSUyBldmh0dHAuaCBldmVudC5oIFBBVEhTICR7TGliRXZlbnRfSU5DTFVERV9QQVRIU30pCisKKyMgImxpYiIgcHJlZml4IGlzIG5lZWRlZCBvbiBXaW5kb3dzIGluIHNvbWUgY2FzZXMKKyMgbmV3ZXIgdmVyc2lvbnMgb2YgbGliZXZlbnQgdXNlIHRocmVlIGxpYnJhcmllcworZmluZF9saWJyYXJ5KExJQkVWRU5UX0xJQlJBUklFUyBOQU1FUyBldmVudCBldmVudF9jb3JlIGV2ZW50X2V4dHJhIGxpYmV2ZW50IFBBVEhTICR7TGliRXZlbnRfTElCUkFSSUVTX1BBVEhTfSkKKworaWYgKExJQkVWRU5UX0xJQlJBUklFUyBBTkQgTElCRVZFTlRfSU5DTFVERV9ESVJTKQorICBzZXQoTGliZXZlbnRfRk9VTkQgVFJVRSkKKyAgc2V0KExJQkVWRU5UX0xJQlJBUklFUyAke0xJQkVWRU5UX0xJQlJBUklFU30pCitlbHNlICgpCisgIHNldChMaWJldmVudF9GT1VORCBGQUxTRSkKK2VuZGlmICgpCisKK2lmIChMaWJldmVudF9GT1VORCkKKyAgaWYgKE5PVCBMaWJldmVudF9GSU5EX1FVSUVUTFkpCisgICAgbWVzc2FnZShTVEFUVVMgIkZvdW5kIGxpYmV2ZW50OiAke0xJQkVWRU5UX0xJQlJBUklFU30iKQorICBlbmRpZiAoKQorZWxzZSAoKQorICBpZiAoTGliRXZlbnRfRklORF9SRVFVSVJFRCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDb3VsZCBOT1QgZmluZCBsaWJldmVudC4iKQorICBlbmRpZiAoKQorICBtZXNzYWdlKFNUQVRVUyAibGliZXZlbnQgTk9UIGZvdW5kLiIpCitlbmRpZiAoKQorCittYXJrX2FzX2FkdmFuY2VkKAorICAgIExJQkVWRU5UX0xJQlJBUklFUworICAgIExJQkVWRU5UX0lOQ0xVREVfRElSUworICApCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRkMzAyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpAQCAtMCwwICsxLDQ0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBGb3IgZGVidWdnaW5nIG5ldyBwbGF0Zm9ybXMsIGp1c3QgdG8gc2VlIHdoYXQgc29tZSBlbnZpcm9ubWVudCBmbGFncyBhcmUuLi4KKyMKK21hY3JvKFNIT1dGTEFHIGZsYWcpCisgIG1lc3NhZ2UoU1RBVFVTICIke2ZsYWd9ID0gJHske2ZsYWd9fSIpCitlbmRtYWNybyhTSE9XRkxBRykKKworc2V0KE5FV1BMQVRGT1JNREVCVUcgT04pCisKK2lmKE5FV1BMQVRGT1JNREVCVUcpCisgIFNIT1dGTEFHKCJBUFBMRSIpCisgIFNIT1dGTEFHKCJCT1JMQU5EIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NfQ09NUElMRVJfSUQiKQorICBTSE9XRkxBRygiQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCIpCisgIFNIT1dGTEFHKCJDWUdXSU4iKQorICBTSE9XRkxBRygiTUlOR1ciKQorICBTSE9XRkxBRygiTVNWQyIpCisgIFNIT1dGTEFHKCJNU1ZDX1ZFUlNJT04iKQorICBTSE9XRkxBRygiTVNZUyIpCisgIFNIT1dGTEFHKCJVTklYIikKKyAgU0hPV0ZMQUcoIldBVENPTSIpCisgIFNIT1dGTEFHKCJXSU4zMiIpCitlbmRpZihORVdQTEFURk9STURFQlVHKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kIGIvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2FkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQKQEAgLTAsMCArMSw2MyBAQAorPCEtLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBCdWlsZGluZyB0aHJpZnQgb24gV2luZG93cyAoTWluR1c2NC9NU1lTMikKKworVGhyaWZ0IHVzZXMgY21ha2UgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgdGhlIHByb2plY3Qgb24gbXVsdGlwbGUgcGxhdGZvcm1zLCBob3dldmVyIHRvIGJ1aWxkIGEgZnVsbHkgZnVuY3Rpb25hbCBhbmQgcHJvZHVjdGlvbiByZWFkeSB0aHJpZnQgb24gV2luZG93cyByZXF1aXJlcyBhIG51bWJlciBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYmUgb2J0YWluZWQuICBPbmNlIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBhcmUgcmVhZHksIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBvcHRpb25zIG11c3QgYmUgcGFzc2VkIHRvIGNtYWtlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IGVudmlyb25tZW50LgorCis+IE5vdGU6IGxpYmV2ZW50IGFuZCBsaWJldmVudC1kZXZlbCBkbyBub3Qgd29yayB3aXRoIHRoaXMgdG9vbGNoYWluIGFzIHRoZXkgZG8gbm90IHByb3Blcmx5IGRldGVjdCBtaW5ndzY0IGFuZCBleHBlY3Qgc29tZSBoZWFkZXJzIHRvIGV4aXN0IHRoYXQgZG8gbm90LCBzbyB0aGUgbm9uLWJsb2NraW5nIHNlcnZlciBpcyBub3QgY3VycmVudGx5IGJ1aWx0IGludG8gdGhpcyBzb2x1dGlvbi4KKworIyMgTVNZUzIKKworRG93bmxvYWQgYW5kIGZ1bGx5IHVwZ3JhZGUgbXN5czIgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgYXQ6CisKKyAgICBodHRwczovL21zeXMyLmdpdGh1Yi5pby8KKworSW5zdGFsbCB0aGUgbmVjZXNzYXJ5IHRvb2xjaGFpbiBpdGVtcyBmb3IgQysrOgorCisgICAgJCBwYWNtYW4gLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIG1pbmd3LXc2NC14ODZfNjQtb3BlbnNzbCBcCisgICAgICAgICAgICAgICAgbWluZ3ctdzY0LXg4Nl82NC1ib29zdCBtaW5ndy13NjQteDg2XzY0LWNtYWtlIFwKKyAgICAgICAgICAgICAgICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBtaW5ndy13NjQteDg2XzY0LXpsaWIKKworVXBkYXRlIHlvdXIgbXN5czIgYmFzaCBwYXRoIHRvIGluY2x1ZGUgL21pbmd3NjQvYmluIGJ5IGFkZGluZyBhIGxpbmUgdG8geW91ciB+Ly5iYXNoX3Byb2ZpbGVzIHVzaW5nIHRoaXMgY29tbWFuZDoKKworICAgIGVjaG8gImV4cG9ydCBQQVRIPS9taW5ndzY0L2JpbjpcJFBBVEgiID4+IH4vLmJhc2hfcHJvZmlsZQorCitBZnRlciB0aGF0LCBjbG9zZSB5b3VyIHNoZWxsIGFuZCBvcGVuIGEgbmV3IG9uZS4KKworVXNlIGNtYWtlIHRvIGNyZWF0ZSBhIE1pbkdXIG1ha2VmaWxlLCBvdXQgb2YgdHJlZSAoYXNzdW1lcyB5b3UgYXJlIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHRocmlmdCBzb3VyY2UgdHJlZSk6CisKKyAgICBta2RpciAuLi90aHJpZnQtYnVpbGQKKyAgICBjZCAuLi90aHJpZnQtYnVpbGQKKyAgICBjbWFrZSAtRyJNaW5HVyBNYWtlZmlsZXMiIC1EQ01BS0VfTUFLRV9QUk9HUkFNPS9taW5ndzY0L2Jpbi9taW5ndzMyLW1ha2UgXAorICAgICAgIC1EQ01BS0VfQ19DT01QSUxFUj14ODZfNjQtdzY0LW1pbmd3MzItZ2NjLmV4ZSBcCisgICAgICAgLURDTUFLRV9DWFhfQ09NUElMRVI9eDg2XzY0LXc2NC1taW5ndzMyLWcrKy5leGUgXAorICAgICAgIC1EV0lUSF9MSUJFVkVOVD1PRkYgXAorICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiAtRFdJVEhfU1RBVElDX0xJQj1PTiBcCisgICAgICAgLURXSVRIX0pBVkE9T0ZGIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9QRVJMPU9GRiBcCisgICAgICAgLi4vdGhyaWZ0CisKK0J1aWxkIHRocmlmdCAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjbWFrZSAtLWJ1aWxkIC4KKworUnVuIHRoZSB0ZXN0cyAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjdGVzdAorCis+IElmIHlvdSBydW4gaW50byBpc3N1ZXMsIGNoZWNrIEFwYWNoZSBKaXJhIFRIUklGVC00MDQ2IGZvciBwYXRjaGVzIHJlbGF0aW5nIHRvIE1pbkdXNjQvTVNZUzIgYnVpbGRzLgorCisjIyBUZXN0ZWQgV2l0aAorCittc3lzMiA2NC1iaXQgMjAxNi0xMC0yNiBkaXN0cmlidXRpb24KZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL1JFQURNRS5tZCBiL2J1aWxkL2NtYWtlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWMxMjhiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjAgQEAKKyMgQXBhY2hlIFRocmlmdCAtIENNYWtlIGJ1aWxkCisKKyMjIEdvYWwKK0V4dGVuZCBBcGFjaGUgVGhyaWZ0J3MgKm1ha2UgY3Jvc3MqIGFwcHJvYWNoIHRvIHRoZSBidWlsZCBzeXN0ZW0uCisKK0R1ZSB0byBncm93aW5nIHRoZSBmaWVsZCBvZiBvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnQsIGEgcHJvcGVyIGV4ZWN1dGFibGUKK2FuZCBsaWJyYXJ5IGRldGVjdGlvbiBtZWNoYW5pc20gcnVubmluZyBvbiBhcyBtdWNoIHBsYXRmb3JtcyBhcyBwb3NzaWJsZQorYmVjb21lcyByZXF1aXJlZC4gVGhlIG90aGVyIGFzcGVjdCB0byBzaW1wbGlmeSB0aGUgcmVsZWFzZSBwcm9jZXNzIGFuZAorcGFja2FnZSBnZW5lcmF0aW9uIHByb2Nlc3MuCisKK0FzIG5pY2Ugc2lkZSBiZW5lZml0IG9mIENNYWtlIGlzIHRoZSBnZW5lcmF0aW9uIG9mIGRldmVsb3BtZW50IGVudmlyb25tZW50CitzcGVjaWZpYyBzb3VsdGlvbiBmaWxlcy4gPT4gTm8gc29sdXRpb24gZmlsZXMgd2l0aGluIHNvdXJjZSB0cmVlLgorCisKKyMjIFVzYWdlCitqdXN0IGRvIHRoaXM6CisKKyAgICBta2RpciBjbWFrZS1idWlsZCAmJiBjZCBjbWFrZS1idWlsZAorICAgIGNtYWtlIC4uCisKK2lmIHlvdSB1c2UgYSBzcGVjaWZpYyB0b29sY2hhaW4gcGFzcyBpdCB0byBjbWFrZSwgdGhlIHNhbWUgZm9yIG9wdGlvbnM6CisKKyAgICBjbWFrZSAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC4uCisgICAgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWNsYW5nLTMuNSAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrLTMuNSAuLgorICAgIGNtYWtlIC1EVEhSSUZUX0NPTVBJTEVSX0hTPU9GRiAuLgorICAgIGNtYWtlIC1EV0lUSF9aTElCPU9OIC4uCisKK29yIG9uIFdpbmRvd3MKKworICAgIGNtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgV2luNjQiIFwKKyAgICAtREJPT1NUX1JPT1Q9QzovM3JkcGFydHkvYm9vc3RfMV81OF8wIFwKKyAgICAtRFpMSUJfUk9PVD1DOi8zcmRwYXJ0eS96bGliMTI4LWRsbCBcCisgICAgLURXSVRIX1NIQVJFRF9MSUI9b2ZmIC4uCisKK2FuZCBvcGVuIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB5b3UgbGlrZSB3aXRoIHRoZSBzb2x1dGlvbiBvciBkbyB0aGlzOgorCisgICAgbWFrZQorICAgIG1ha2UgY2hlY2sKKyAgICBtYWtlIGNyb3NzCisgICAgbWFrZSBkaXN0CisKK3RvIGdlbmVyYXRlIGFuIGluc3RhbGxlciBhbmQgZGlzdHJpYnV0aW9uIHBhY2thZ2UgZG8gdGhpczoKKworICAgIGNwYWNrCisKKyMjIFRPRE8KKyogZ2l0IGhhc2ggb3IgdGFnIGJhc2VkIHZlcnNpb25pbmcgZGVwZW5kaW5nIG9uIHNvdXJjZSBzdGF0ZQorKiBidWlsZCB0dXRvcmlhbAorKiBidWlsZCB0ZXN0CisqIHdpdGgvd2l0aG91dCBsYW5ndWFnZSBsaWIvPGxhbmc+LworKiBlbmFibGUvZGlzYWJsZQorKiBtYWtlIGNyb3NzCisqIG1ha2UgZGlzdCAoY3JlYXRlIGFuIGFsaWFzIHRvIG1ha2UgcGFja2FnZV9zb3VyY2UpCisqIG1ha2UgZG9jCisqIGNwYWNrIChDKysgYW5kIG1ha2UgZGlzdCBvbmx5ID8pCisgICogdGhyaWZ0LWNvbXBpbGVyCisgICogbGlidGhyaWZ0CisgICogdHV0b3JpYWwKKyAgKiB0ZXN0CisqIG1lcmdlIGludG8gL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvVGhyaWZ0TWFjcm9zLmNtYWtlIGIvYnVpbGQvY21ha2UvVGhyaWZ0TWFjcm9zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzdmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UKQEAgLTAsMCArMSwxMDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK3NldChDTUFLRV9ERUJVR19QT1NURklYICJkIiBDQUNIRSBTVFJJTkcgIlNldCBkZWJ1ZyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorCisKK21hY3JvKEFERF9MSUJSQVJZX1RIUklGVCBuYW1lKQorCitpZihXSVRIX1NIQVJFRF9MSUIpCisgICAgYWRkX2xpYnJhcnkoJHtuYW1lfSBTSEFSRUQgJHtBUkdOfSkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfSBQUk9QRVJUSUVTCisgICAgICAgIE9VVFBVVF9OQU1FICR7bmFtZX0KKyAgICAgICAgVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfQorICAgICAgICBTT1ZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0gKQorICAgICNzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfSBQUk9QRVJUSUVTIFBVQkxJQ19IRUFERVIgIiR7dGhyaWZ0Y3BwX0hFQURFUlN9IikKKyAgICBpbnN0YWxsKFRBUkdFVFMgJHtuYW1lfQorICAgICAgICBSVU5USU1FIERFU1RJTkFUSU9OICIke0JJTl9JTlNUQUxMX0RJUn0iCisgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gIiR7TElCX0lOU1RBTExfRElSfSIKKyAgICAgICAgQVJDSElWRSBERVNUSU5BVElPTiAiJHtMSUJfSU5TVEFMTF9ESVJ9IgorICAgICAgICBQVUJMSUNfSEVBREVSIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IikKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIGFkZF9saWJyYXJ5KCR7bmFtZX1fc3RhdGljIFNUQVRJQyAke0FSR059KQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9X3N0YXRpYyBQUk9QRVJUSUVTCisgICAgICAgIE9VVFBVVF9OQU1FICR7bmFtZX0ke1NUQVRJQ19QT1NURklYfQorICAgICAgICBWRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgIFNPVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfSApCisgICAgaW5zdGFsbChUQVJHRVRTICR7bmFtZX1fc3RhdGljCisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gIiR7QklOX0lOU1RBTExfRElSfSIKKyAgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiAiJHtMSUJfSU5TVEFMTF9ESVJ9IgorICAgICAgICBBUkNISVZFIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCisgICAgICAgIFBVQkxJQ19IRUFERVIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iKQorZW5kaWYoKQorCitlbmRtYWNybyhBRERfTElCUkFSWV9USFJJRlQpCisKKworbWFjcm8oVEFSR0VUX0lOQ0xVREVfRElSRUNUT1JJRVNfVEhSSUZUIG5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfaW5jbHVkZV9kaXJlY3Rvcmllcygke25hbWV9ICR7QVJHTn0pCitlbmRpZigpCisKK2lmKFdJVEhfU1RBVElDX0xJQikKKyAgICB0YXJnZXRfaW5jbHVkZV9kaXJlY3Rvcmllcygke25hbWV9X3N0YXRpYyAke0FSR059KQorZW5kaWYoKQorCitlbmRtYWNybyhUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQpCisKKworbWFjcm8oVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCBuYW1lKQorCitpZihXSVRIX1NIQVJFRF9MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX0gJHtBUkdOfSkKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9X3N0YXRpYyAke0FSR059KQorZW5kaWYoKQorCitlbmRtYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKQorCisKK21hY3JvKExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSB0YXJnZXQgbGlibmFtZSkKKworaWYgKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9ICR7bGlibmFtZX0pCitlbHNlaWYgKFdJVEhfU1RBVElDX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9ICR7bGlibmFtZX1fc3RhdGljKQorZWxzZSgpCisgICAgbWVzc2FnZShGQVRBTCAiTm90IGxpbmtpbmcgd2l0aCBzaGFyZWQgb3Igc3RhdGljIGxpYnJhcmllcz8iKQorZW5kaWYoKQorCitlbmRtYWNybyhMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkpCisKKworbWFjcm8oVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZIHRhcmdldCBsaWJuYW1lKQorCitpZihXSVRIX1NIQVJFRF9MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0fSAke0FSR059ICR7bGlibmFtZX0pCitlbmRpZigpCisKK2lmKFdJVEhfU1RBVElDX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9X3N0YXRpYyAke0FSR059ICR7bGlibmFtZX1fc3RhdGljKQorZW5kaWYoKQorCitlbmRtYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9hbmRyb2lkLXRvb2xjaGFpbi5jbWFrZSBiL2J1aWxkL2NtYWtlL2FuZHJvaWQtdG9vbGNoYWluLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjNkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9hbmRyb2lkLXRvb2xjaGFpbi5jbWFrZQpAQCAtMCwwICsxLDI2IEBACitzZXQoQU5EUk9JRF9OREsgIi9vcHQvYW5kcm9pZC1uZGsiIENBQ0hFKQorc2V0KEFORFJPSURfUExBVEZPUk0gImFuZHJvaWQtMTUiIENBQ0hFKQorc2V0KEFORFJPSURfQVJDSCAiYXJjaC1hcm0iIENBQ0hFKQorc2V0KEFORFJPSURfVE9PTF9BUkNIICJhbmRyb2lkLWFybSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9DUFUgImFybWVhYmktdjdhIiBDQUNIRSkKK3NldChBTkRST0lEX0dDQ19WRVJTSU9OIDQuOSBDQUNIRSkKK3NldChIT1NUX0FSQ0ggbGludXgteDg2XzY0IENBQ0hFKQorCitzZXQoQ01BS0VfU1lTVEVNX05BTUUgQW5kcm9pZCkKK3NldChBTkRST0lEX1NZU1JPT1QgIiR7QU5EUk9JRF9OREt9L3BsYXRmb3Jtcy8ke0FORFJPSURfUExBVEZPUk19LyR7QU5EUk9JRF9BUkNIfSIpCitzZXQoQU5EUk9JRF9UUklQTEVUIGFybS1saW51eC1hbmRyb2lkZWFiaSkKK3NldChBTkRST0lEX1NUTCAiJHtBTkRST0lEX05ES30vc291cmNlcy9jeHgtc3RsL2dudS1saWJzdGQrKy8ke0FORFJPSURfR0NDX1ZFUlNJT059IikKKworc2V0KF9DT01QSUxFUl9ST09UICR7QU5EUk9JRF9OREt9L3ByZWJ1aWx0LyR7QU5EUk9JRF9UUklQTEVUfS0ke0FORFJPSURfR0NDX1ZFUlNJT059L3ByZWJ1aWx0LyR7SE9TVF9BUkNIfSkKK3NldChDTUFLRV9DX0NPTVBJTEVSICR7X0NPTVBJTEVSX1JPT1R9L2Jpbi8ke0FORFJPSURfVFJJUExFVH0tZ2NjKQorc2V0KENNQUtFX0NYQ1hfQ09NUElMRVIgJHtfQ09NUElMRVJfUk9PVH0vYmluLyR7QU5EUk9JRF9UUklQTEVUfS1nKyspCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICAgJHtBTkRST0lEX1NUTH0vaW5jbHVkZQorICAgICR7QU5EUk9JRF9TVEx9L2xpYnMvJHtBTkRST0lEX0NQVX0vaW5jbHVkZSkKKworc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIICR7QU5EUk9JRF9TWVNST09UfSkKKworc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfUFJPR1JBTSBORVZFUikKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0xJQlJBUlkgT05MWSkKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREUgT05MWSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluIGIvYnVpbGQvY21ha2UvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwYWU0NgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIGNvbmZpZy5oIGdlbmVyYXRlZCBieSBDTWFrZSBmcm9tIGNvbmZpZy5oLmluICovCisKKyNpZm5kZWYgQ09ORklHX0gKKyNkZWZpbmUgQ09ORklHX0gKKworCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFICIke1BBQ0tBR0V9IgorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJHtQQUNLQUdFX0JVR1JFUE9SVH0iCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX05BTUUgIiR7UEFDS0FHRV9OQU1FfSIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJHtQQUNLQUdFX1RBUk5BTUV9IgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfVVJMICIke1BBQ0tBR0VfVVJMfSIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIke1BBQ0tBR0VfVkVSU0lPTn0iCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiR7UEFDS0FHRV9TVFJJTkd9IgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogREVGSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbmUgaWYgdGhlIEFJX0FERFJDT05GSUcgc3ltYm9sIGlzIHVuYXZhaWxhYmxlICovCisjY21ha2VkZWZpbmUgQUlfQUREUkNPTkZJRyAwCisKKy8qIFBvc3NpYmxlIHZhbHVlIGZvciBTSUdORURfUklHSFRfU0hJRlRfSVMgKi8KKy8qIFRPRE86IFRoaXMgaXMganVzdCBzZXQgdG8gMSBmb3IgdGhlIG1vbWVudAorICAgcG9ydCB0aGUgbWFjcm8gYWNsb2NhbC9heF9zaWduZWRfcmlnaHRfc2hpZnQubTQgdG8gQ01ha2UgdG8gbWFrZSB0aGlzIHdvcmsgKi8KKyNkZWZpbmUgQVJJVEhNRVRJQ19SSUdIVF9TSElGVCAxCisKKy8qIEluZGljYXRlcyB0aGUgZWZmZWN0IG9mIHRoZSByaWdodCBzaGlmdCBvcGVyYXRvciBvbiBuZWdhdGl2ZSBzaWduZWQKKyAgIGludGVnZXJzICovCisvKiBUT0RPOiBUaGlzIGlzIGp1c3Qgc2V0IHRvIDEgZm9yIHRoZSBtb21lbnQgKi8KKyNkZWZpbmUgU0lHTkVEX1JJR0hUX1NISUZUX0lTIDEKKworLyogVXNlICouaCBleHRlbnNpb24gZm9yIHBhcnNlciBoZWFkZXIgZmlsZSAqLworLyogVE9ETzogVGhpcyBtaWdodCBub3cgYmUgbmVjZXNzYXJ5IGFueW1vcmUgYXMgaXQgaXMgc2V0IG9ubHkgZm9yIGF1dG9tYWtlIDwgMS4xMQorICAgc2VlOiBhY2xvY2FsL2FjX3Byb2dfYmlzb24ubTQgKi8KKyNjbWFrZWRlZmluZSBCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OIDEKKworLyogcmVwbGFjZXMgUE9TSVggcHRocmVhZCBieSBzdGQ6OnRocmVhZCAqLworI2NtYWtlZGVmaW5lIFVTRV9TVERfVEhSRUFEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKi4gKi8KKyNjbWFrZWRlZmluZSBTVFJFUlJPUl9SX0NIQVJfUCAxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEhFQURFUiBGSUxFUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFycGEvaW5ldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0FSUEFfSU5FVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0ZDTlRMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0ZGIuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVREQl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1VOSVNURF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwdGhyZWFkLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUFRIUkVBRF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaW9jdGwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfSU9DVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19SRVNPVVJDRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2V0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NPQ0tFVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91bi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19VTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUE9MTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19QT0xMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zZWxlY3QuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU0VMRUNUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2NoZWQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TQ0hFRF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0YnluYW1lJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RieW5hbWVfcicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1IgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yX3InIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RSRVJST1JfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2NoZWRfZ2V0X3ByaW9yaXR5X21heCcgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUFYIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzY2hlZF9nZXRfcHJpb3JpdHlfbWluJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NSU4gMQorCisKKy8qIERlZmluZSB0byAxIGlmIHN0cmVycm9yX3IgcmV0dXJucyBjaGFyICouICovCisjY21ha2VkZWZpbmUgU1RSRVJST1JfUl9DSEFSX1AgMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIGIvYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0YzBlYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlCkBAIC0wLDAgKzEsMjQgQEAKKyMgQ01ha2UgbWluZ3czMiBjcm9zcyBjb21waWxlIHRvb2xjaGFpbiBmaWxlCisKKyMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBvcGVyYXRpbmcgc3lzdGVtCitTRVQoQ01BS0VfU1lTVEVNX05BTUUgV2luZG93cykKKworIyB3aGljaCBjb21waWxlcnMgdG8gdXNlIGZvciBDIGFuZCBDKysKK1NFVChDTUFLRV9DX0NPTVBJTEVSIGk1ODYtbWluZ3czMm1zdmMtZ2NjKQorU0VUKENNQUtFX0NYWF9DT01QSUxFUiBpNTg2LW1pbmd3MzJtc3ZjLWcrKykKK1NFVChDTUFLRV9SQ19DT01QSUxFUiBpNTg2LW1pbmd3MzJtc3ZjLXdpbmRyZXMpCisKKyMgaGVyZSBpcyB0aGUgdGFyZ2V0IGVudmlyb25tZW50IGxvY2F0ZWQKK1NFVChDTUFLRV9GSU5EX1JPT1RfUEFUSCAvdXNyL2k1ODYtbWluZ3czMm1zdmMpCisKKyMgYWRqdXN0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgRklORF9YWFgoKSBjb21tYW5kczoKKyMgc2VhcmNoIGhlYWRlcnMgYW5kIGxpYnJhcmllcyBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50LCBzZWFyY2gKKyMgcHJvZ3JhbXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX1BST0dSQU0gTkVWRVIpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9MSUJSQVJZIE9OTFkpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9JTkNMVURFIE9OTFkpCisKK3NldChCVUlMRF9TSEFSRURfTElCUyBPRkYpCitTRVQoQ01BS0VfRVhFX0xJTktFUl9GTEFHUyAiLXN0YXRpYyIpCitzZXQoQ01BS0VfQ19GTEFHUyAke0NNQUtFX0NfRkxBR1N9ICItc3RhdGljLWxpYmdjYyIpCitzZXQoQ01BS0VfQ1hYX0ZMQUdTICR7Q01BS0VfQ1hYX0ZMQUdTfSAiLXN0YXRpYy1saWJzdGRjKysiKQpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL1JFQURNRS5tZCBiL2J1aWxkL2RvY2tlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2ZDY5MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9SRUFETUUubWQKQEAgLTAsMCArMSwxOTggQEAKKyMgRG9ja2VyIEludGVncmF0aW9uICMKKworRHVlIHRvIHRoZSBsYXJnZSBudW1iZXIgb2YgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSBBcGFjaGUgVGhyaWZ0LAorZG9ja2VyIGNvbnRhaW5lcnMgYXJlIHVzZWQgdG8gYnVpbGQgYW5kIHRlc3QgdGhlIHByb2plY3Qgb24gYQordmFyaWV0eSBvZiBwbGF0Zm9ybXMgdG8gcHJvdmlkZSBtYXhpbXVtIHRlc3QgY292ZXJhZ2UuCisKKyMjIEFwcHZleW9yIEludGVncmF0aW9uICMjCisKK0F0IHRoaXMgdGltZSB0aGUgQXBwdmV5b3Igc2NyaXB0cyBkbyBub3QgdXNlIGRvY2tlciBjb250YWluZXJzLgorT25jZSBNaWNyb3NvZnQgc3VwcG9ydHMgVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scyBydW5uaW5nIGluc2lkZQorbmFubyBjb250YWluZXJzIChpbnN0ZWFkIG9mIENvcmUsIHdoaWNoIGlzIGh1Z2UpIHRoZW4gd2Ugd2lsbAorY29uc2lkZXIgdXNpbmcgY29udGFpbmVycyBmb3IgdGhlIFdpbmRvd3MgYnVpbGRzIGFzIHdlbGwuCisKKyMjIFRyYXZpcyBDSSBJbnRlZ3JhdGlvbiAjIworCitUaGUgVHJhdmlzIENJIHNjcmlwdHMgdXNlIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZAorbG9naWMgdG8gZGV0ZXJtaW5lIHRoZWlyIGJlaGF2aW9yOgorCisjIyMgRW52aXJvbm1lbnQgVmFyaWFibGVzICMjIworCit8IFZhcmlhYmxlIHwgRGVmYXVsdCB8IFVzYWdlIHwKK3wgLS0tLS0tLS0gfCAtLS0tLSB8IC0tLS0tLS0gfAorfCBgRElTVFJPYCB8IGB1YnVudHUtYmlvbmljYCB8IFNldCBieSB2YXJpb3VzIGJ1aWxkIGpvYnMgaW4gYC50cmF2aXMueW1sYCB0byBydW4gYnVpbGRzIGluIGRpZmZlcmVudCBjb250YWluZXJzLiAgTm90IGludGVuZGVkIHRvIGJlIHNldCBleHRlcm5hbGx5LnwKK3wgYERPQ0tFUl9SRVBPYCB8IGB0aHJpZnQvdGhyaWZ0LWJ1aWxkYCB8IFRoZSBuYW1lIG9mIHRoZSBEb2NrZXIgSHViIHJlcG9zaXRvcnkgdG8gb2J0YWluIGFuZCBzdG9yZSBkb2NrZXIgaW1hZ2VzLiB8Cit8IGBET0NLRVJfVVNFUmAgfCBgPG5vbmU+YCB8IFRoZSBEb2NrZXIgSHViIGFjY291bnQgbmFtZSBjb250YWluaW5nIHRoZSByZXBvc2l0b3J5LiB8Cit8IGBET0NLRVJfUEFTU2AgfCBgPG5vbmU+YCB8IFRoZSBEb2NrZXIgSHViIGFjY291bnQgcGFzc3dvcmQgdG8gdXNlIHdoZW4gcHVzaGluZyBuZXcgdGFncy4gfAorCitGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgZG9ja2VyIGltYWdlIHRoYXQgaXMgdXNlZCBpbiBidWlsZHMgaWYgbm8gb3ZlcnJpZGVzIGFyZSBzcGVjaWZpZWQgd291bGQgYmU6IGB0aHJpZnQvdGhyaWZ0LWJ1aWxkOnVidW50dS1iaW9uaWNgCisKKyMjIyBGb3JrcyAjIyMKKworSWYgeW91IGhhdmUgZm9ya2VkIHRoZSBBcGFjaGUgVGhyaWZ0IHJlcG9zaXRvcnkgYW5kIHlvdSB3b3VsZCBsaWtlCit0byB1c2UgeW91ciBvd24gRG9ja2VyIEh1YiBhY2NvdW50IHRvIHN0b3JlIHRocmlmdCBidWlsZCBpbWFnZXMsCit5b3UgY2FuIHVzZSB0aGUgVHJhdmlzIENJIHdlYiBpbnRlcmZhY2UgdG8gc2V0IHRoZSBgRE9DS0VSX1VTRVJgLAorYERPQ0tFUl9QQVNTYCwgYW5kIGBET0NLRVJfUkVQT2AgdmFyaWFibGVzIGluIGEgc2VjdXJlIG1hbm5lci4KK1lvdXIgZm9yayBidWlsZHMgd2lsbCB0aGVuIHB1bGwsIHB1c2gsIGFuZCB0YWcgdGhlIGRvY2tlciBpbWFnZXMKK2luIHlvdXIgYWNjb3VudC4KKworIyMjIExvZ2ljICMjIworCitUaGUgVHJhdmlzIENJIGJ1aWxkIHJ1bnMgaW4gdHdvIHBoYXNlcyAtIGZpcnN0IHRoZSBkb2NrZXIgaW1hZ2VzIGFyZSByZWJ1aWx0Citmb3IgZWFjaCBvZiB0aGUgc3VwcG9ydGVkIGNvbnRhaW5lcnMgaWYgdGhleSBkbyBub3QgbWF0Y2ggdGhlIERvY2tlcmZpbGUgdGhhdAord2FzIHVzZWQgdG8gYnVpbGQgdGhlIG1vc3QgcmVjZW50IHRhZy4gIElmIGEgYERPQ0tFUl9QQVNTYCBlbnZpcm9ubWVudAordmFyaWFibGUgaXMgc3BlY2lmaWVkLCB0aGUgZG9ja2VyIHN0YWdlIGJ1aWxkcyB3aWxsIGF0dGVtcHQgdG8gbG9nIGludG8KK0RvY2tlciBIdWIgYW5kIHB1c2ggdGhlIHJlc3VsdGluZyB0YWdzLgorCisjIyBTdXBwb3J0ZWQgQ29udGFpbmVycyAjIworCitUaGUgVHJhdmlzIENJIChjb250aW51b3VzIGludGVncmF0aW9uKSBidWlsZHMgdXNlIHRoZSBVYnVudHUgQmlvbmljCisoMTguMDQgTFRTKSBhbmQgWGVuaWFsICgxNi4wNCBMVFMpIGltYWdlcyB0byBtYXhpbWl6ZSBsYW5ndWFnZSBsZXZlbAorY292ZXJhZ2UuCisKKyMjIyBVYnVudHUgIyMjCisKKyogYmlvbmljIChzdGFibGUsIGN1cnJlbnQpCisqIGFydGZ1bCAocHJldmlvdXMgc3RhYmxlKQorKiB4ZW5pYWwgKGxlZ2FjeSkKKworIyMgVW5zdXBwb3J0ZWQgQ29udGFpbmVycyAjIworCitUaGVzZSBjb250YWluZXJzIG1heSBiZSBpbiB2YXJpb3VzIHN0YXRlcywgYW5kIG1heSBub3QgYnVpbGQgZXZlcnl0aGluZy4KK1RoZXkgY2FuIGJlIGZvdW5kIGluIHRoZSBgb2xkL2Agc3ViZGlyZWN0b3J5LgorCisjIyMgQ2VudE9TICMjIworKiA3LjMKKyAgKiBtYWtlIGNoZWNrIGluIGxpYi9weSBtYXkgaGFuZyBpbiB0ZXN0X3NzbHNvY2tldCAtIHJvb3QgY2F1c2UgdW5rbm93bgorCisjIyMgRGViaWFuICMjIworCisqIGplc3NpZQorKiBzdHJldGNoCisgICogbWFrZSBjaGVjayBpbiBsaWIvY3BwIGZhaWxzIGR1ZSB0byBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYzEwL3RpY2tldC8xMjUwNworCisjIyBCdWlsZGluZyBsaWtlIFRyYXZpcyBDSSBkb2VzLCBsb2NhbGx5ICMjCisKK1dlIHJlY29tbWVuZCB5b3UgYnVpbGQgbG9jYWxseSB0aGUgc2FtZSB3YXkgVHJhdmlzIENJIGRvZXMsIHNvIHRoYXQgd2hlbiB5b3UKK3N1Ym1pdCB5b3VyIHB1bGwgcmVxdWVzdCB5b3Ugd2lsbCBydW4gaW50byBmZXdlciBzdXJwcmlzZXMuICBUbyBtYWtlIGl0IGEKK2xpdHRsZSBlYXNpZXIsIHB1dCB0aGUgZm9sbG93aW5nIGludG8geW91ciBgfi8uYmFzaF9hbGlhc2VzYCBmaWxlOgorCisgICAgIyBLaWxsIGFsbCBydW5uaW5nIGNvbnRhaW5lcnMuCisgICAgYWxpYXMgZG9ja2Vya2lsbGFsbD0nZG9ja2VyIGtpbGwgJChkb2NrZXIgcHMgLXEpJworCisgICAgIyBEZWxldGUgYWxsIHN0b3BwZWQgY29udGFpbmVycy4KKyAgICBhbGlhcyBkb2NrZXJjbGVhbmM9J3ByaW50ZiAiXG4+Pj4gRGVsZXRpbmcgc3RvcHBlZCBjb250YWluZXJzXG5cbiIgJiYgZG9ja2VyIHJtICQoZG9ja2VyIHBzIC1hIC1xKScKKworICAgICMgRGVsZXRlIGFsbCB1bnRhZ2dlZCBpbWFnZXMuCisgICAgYWxpYXMgZG9ja2VyY2xlYW5pPSdwcmludGYgIlxuPj4+IERlbGV0aW5nIHVudGFnZ2VkIGltYWdlc1xuXG4iICYmIGRvY2tlciBybWkgJChkb2NrZXIgaW1hZ2VzIC1xIC1mIGRhbmdsaW5nPXRydWUpJworCisgICAgIyBEZWxldGUgYWxsIHN0b3BwZWQgY29udGFpbmVycyBhbmQgdW50YWdnZWQgaW1hZ2VzLgorICAgIGFsaWFzIGRvY2tlcmNsZWFuPSdkb2NrZXJjbGVhbmMgfHwgdHJ1ZSAmJiBkb2NrZXJjbGVhbmknCisKKyAgICAjIEJ1aWxkIGEgdGhyaWZ0IGRvY2tlciBpbWFnZSAocnVuIGZyb20gdG9wIGxldmVsIG9mIGdpdCByZXBvKTogYXJndW1lbnQgIzEgaXMgaW1hZ2UgdHlwZSAodWJ1bnR1LCBjZW50b3MsIGV0YykuCisgICAgZnVuY3Rpb24gZG9ja2VyYnVpbGQKKyAgICB7CisgICAgICBkb2NrZXIgYnVpbGQgLXQgJDEgYnVpbGQvZG9ja2VyLyQxCisgICAgfQorCisgICAgIyBSdW4gYSB0aHJpZnQgZG9ja2VyIGltYWdlOiBhcmd1bWVudCAjMSBpcyBpbWFnZSB0eXBlICh1YnVudHUsIGNlbnRvcywgZXRjKS4KKyAgICBmdW5jdGlvbiBkb2NrZXJydW4KKyAgICB7CisgICAgICBkb2NrZXIgcnVuIC12ICQocHdkKTovdGhyaWZ0L3NyYyAtaXQgJDEgL2Jpbi9iYXNoCisgICAgfQorCitUaGVuLCB0byBwdWxsIGRvd24gdGhlIGN1cnJlbnQgaW1hZ2UgYmVpbmcgdXNlZCB0byBidWlsZCAodGhlIHNhbWUgd2F5CitUcmF2aXMgQ0kgZG9lcyBpdCkgLSBpZiBpdCBpcyBvdXQgb2YgZGF0ZSBpbiBhbnkgd2F5IGl0IHdpbGwgYnVpbGQgYQorbmV3IG9uZSBmb3IgeW91OgorCisgICAgdGhyaWZ0JCBET0NLRVJfUkVQTz10aHJpZnQvdGhyaWZ0LWJ1aWxkIERJU1RSTz11YnVudHUtYmlvbmljIGJ1aWxkL2RvY2tlci9yZWZyZXNoLnNoCisKK1RvIHJ1biBhbGwgdW5pdCB0ZXN0cyAoanVzdCBsaWtlIFRyYXZpcyBDSSBkb2VzKToKKworICAgIHRocmlmdCQgZG9ja2VycnVuIHVidW50dS1iaW9uaWMKKyAgICByb290QDhjYWY1NmIwY2U3YjovdGhyaWZ0L3NyYyMgYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCisKK1RvIHJ1biB0aGUgY3Jvc3MgdGVzdHMgKGp1c3QgbGlrZSBUcmF2aXMgQ0kgZG9lcyk6CisKKyAgICB0aHJpZnQkIGRvY2tlcnJ1biB1YnVudHUtYmlvbmljCisgICAgcm9vdEA4Y2FmNTZiMGNlN2I6L3RocmlmdC9zcmMjIGJ1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKKworV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSB3YW50IHRvIGNsZWFuIHVwIG9jY2FzaW9uYWxseSBzbyB0aGF0IGRvY2tlciBpc24ndCB1c2luZyBsb3RzIG9mIGV4dHJhIGRpc2sgc3BhY2U6CisKKyAgICB0aHJpZnQkIGRvY2tlcmNsZWFuCisKK1lvdSBuZWVkIHRvIHJ1biB0aGUgZG9ja2VyIGNvbW1hbmRzIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGxvY2FsIGNsb25lIG9mIHRoZQordGhyaWZ0IGdpdCByZXBvc2l0b3J5IGZvciB0aGVtIHRvIHdvcmsuCisKK1doZW4geW91IGFyZSBkb25lIGluIHRoZSByb290IGRvY2tlciBzaGVsbCB5b3UgY2FuIGBleGl0YCB0byBnbyBiYWNrIHRvCit5b3VyIHVzZXIgaG9zdCBzaGVsbC4gIE9uY2UgdGhlIHVuaXQgdGVzdHMgYW5kIGNyb3NzIHRlc3QgcGFzc2VzIGxvY2FsbHksCitzdWJtaXQgdGhlIGNoYW5nZXMsIGFuZCBpZiBkZXNpcmVkIHNxdWFzaCB0aGUgcHVsbCByZXF1ZXN0IHRvIG9uZSBjb21taXQKK3RvIG1ha2UgaXQgZWFzaWVyIHRvIG1lcmdlICh0aGUgY29tbWl0dGVycyBjYW4gc3F1YXNoIGF0IGNvbW1pdCB0aW1lIG5vdwordGhhdCBHaXRIdWIgaXMgdGhlIG1hc3RlciByZXBvc2l0b3J5KS4gIE5vdyB5b3UgYXJlIGJ1aWxkaW5nIGxpa2UgVHJhdmlzIENJIGRvZXMhCisKKyMjIFJhdyBDb21tYW5kcyBmb3IgQnVpbGRpbmcgd2l0aCBEb2NrZXIgIyMKKworSWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUgc2FtZSBzY3JpcHRzIFRyYXZpcyBDSSBkb2VzLCB5b3UgY2FuIGRvIGl0IG1hbnVhbGx5OgorCitCdWlsZCB0aGUgaW1hZ2U6CisKKyAgICB0aHJpZnQkIGRvY2tlciBidWlsZCAtdCB0aHJpZnQgYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMKKworT3BlbiBhIGNvbW1hbmQgcHJvbXB0IGluIHRoZSBpbWFnZToKKworICAgIHRocmlmdCQgZG9ja2VyIHJ1biAtdiAkKHB3ZCk6L3RocmlmdC9zcmMgLWl0IHRocmlmdCAvYmluL2Jhc2gKKworIyMgQ29yZSBUb29sIFZlcnNpb25zIHBlciBEb2NrZXJmaWxlICMjCisKK0xhc3QgdXBkYXRlZDogT2N0b2JlciAxLCAyMDE3CisKK3wgVG9vbCAgICAgIHwgdWJ1bnR1LXhlbmlhbCB8IHVidW50dS1iaW9uaWMgfCBOb3RlcyB8Cit8IDotLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0gfAorfCBhbnQgICAgICAgfCAxLjkuNiAgICAgICAgIHwgMS4xMC4zICAgICAgICB8ICAgICAgIHwKK3wgYXV0b2NvbmYgIHwgMi42OSAgICAgICAgICB8IDIuNjkgICAgICAgICAgfCAgICAgICB8Cit8IGF1dG9tYWtlICB8IDEuMTUgICAgICAgICAgfCAxLjE1LjEgICAgICAgIHwgICAgICAgfAorfCBiaXNvbiAgICAgfCAzLjAuNCAgICAgICAgIHwgMy4wLjQgICAgICAgICB8ICAgICAgIHwKK3wgYm9vc3QgICAgIHwgMS41OC4wICAgICAgICB8IDEuNjUuMSAgICAgICAgfCAgICAgICB8Cit8IGNtYWtlICAgICB8IDMuNS4xICAgICAgICAgfCAzLjEwLjIgICAgICAgIHwgICAgICAgfAorfCBjcHBjaGVjayAgfCAxLjcyICAgICAgICAgIHwgMS44MiAgICAgICAgICB8ICAgICAgIHwKK3wgZmxleCAgICAgIHwgMi42LjAgICAgICAgICB8IDIuNi40ICAgICAgICAgfCAgICAgICB8Cit8IGxpYmM2ICAgICB8IDIuMjMgICAgICAgICAgfCAyLjI3ICAgICAgICAgIHwgZ2xpYmMgfAorfCBsaWJldmVudCAgfCAyLjAuMjEgICAgICAgIHwgMi4xLjggICAgICAgICB8ICAgICAgIHwKK3wgbGlic3RkYysrIHwgNS40LjAgICAgICAgICB8IDcuMy4wICAgICAgICAgfCAgICAgICB8Cit8IG1ha2UgICAgICB8IDQuMSAgICAgICAgICAgfCA0LjEgICAgICAgICAgIHwgICAgICAgfAorfCBvcGVuc3NsICAgfCAxLjAuMmcgICAgICAgIHwgMS4xLjBnICAgICAgICB8ICAgICAgIHwKK3wgcXQ1ICAgICAgIHwgNS41LjEgICAgICAgICB8IDUuOS41ICAgICAgICAgfCAgICAgICB8CisKKyMjIENvbXBpbGVyL0xhbmd1YWdlIFZlcnNpb25zIHBlciBEb2NrZXJmaWxlICMjCisKK3wgTGFuZ3VhZ2UgIHwgdWJ1bnR1LXhlbmlhbCB8IHVidW50dS1iaW9uaWMgfCBOb3RlcyB8Cit8IDotLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0gfAorfCBhcyBvZiAgICAgfCBNYXIgMDYsIDIwMTggIHwgSmFuIDQsIDIwMTkgICB8ICAgICAgIHwKK3wgYXMzICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBDKysgZ2NjICAgfCA1LjQuMCAgICAgICAgIHwgNy4zLjAgICAgICAgICB8ICAgICAgIHwKK3wgQysrIGNsYW5nIHwgMy44ICAgICAgICAgICB8IDYuMCAgICAgICAgICAgfCAgICAgICB8Cit8IEMjIChtb25vKSB8IDQuMi4xLjAgICAgICAgfCA0LjYuMi43ICAgICAgIHwgICAgICAgfAorfCBjX2dsaWIgICAgfCAyLjQ4LjIgICAgICAgIHwgMi41Ni4wICAgICAgICB8ICAgICAgIHwKK3wgY2wgKHNiY2wpIHwgICAgICAgICAgICAgICB8IDEuNC4xNSAgICAgICAgfCAgICAgICB8Cit8IGNvY29hICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgZCAgICAgICAgIHwgMi4wNzUuMSAgICAgICB8IDIuMDgzLjEgICAgICAgfCAgICAgICB8Cit8IGRhcnQgICAgICB8IDEuMjIuMSAgICAgICAgfCAxLjI0LjMgICAgICAgIHwgICAgICAgfAorfCBkZWxwaGkgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IGRvdG5ldCAgICB8IDIuMS40ICAgICAgICAgfCAyLjIuMTAxICAgICAgIHwgICAgICAgfAorfCBlcmxhbmcgICAgfCAxOC4zICAgICAgICAgIHwgMjAuMi4yICAgICAgICB8ICAgICAgIHwKK3wgZ28gICAgICAgIHwgMS43LjYgICAgICAgICB8IDEuMTEuNCAgICAgICAgfCAgICAgICB8Cit8IGhhc2tlbGwgICB8IDcuMTAuMyAgICAgICAgfCA4LjAuMiAgICAgICAgIHwgICAgICAgfAorfCBoYXhlICAgICAgfCAzLjIuMSAgICAgICAgIHwgMy40LjQgICAgICAgICB8IFRIUklGVC00MzUyOiBhdm9pZCAzLjQuMiB8Cit8IGphdmEgICAgICB8IDEuOC4wXzE1MSAgICAgfCAxLjguMF8xOTEgICAgIHwgICAgICAgfAorfCBqcyAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IFVuc3VyZSBob3cgdG8gbG9vayBmb3IgdmVyc2lvbiBpbmZvPyB8Cit8IGx1YSAgICAgICB8IDUuMi40ICAgICAgICAgfCA1LjIuNCAgICAgICAgIHwgTHVhIDUuMzogc2VlIFRIUklGVC00Mzg2IHwKK3wgbm9kZWpzICAgIHwgNi4xMy4wICAgICAgICB8IDguMTUuMCAgICAgICAgfCAgICAgICB8Cit8IG9jYW1sICAgICB8ICAgICAgICAgICAgICAgfCA0LjA1LjAgICAgICAgIHwgVEhSSUZULTQ1MTc6IG9jYW1sIDQuMDIuMyBvbiB4ZW5pYWwgYXBwZWFycyBicm9rZW4gfAorfCBwZXJsICAgICAgfCA1LjIyLjEgICAgICAgIHwgNS4yNi4xICAgICAgICB8ICAgICAgIHwKK3wgcGhwICAgICAgIHwgNy4wLjIyICAgICAgICB8IDcuMi4xMCAgICAgICAgfCAgICAgICB8Cit8IHB5dGhvbiAgICB8IDIuNy4xMiAgICAgICAgfCAyLjcuMTVyYzEgICAgIHwgICAgICAgfAorfCBweXRob24zICAgfCAzLjUuMiAgICAgICAgIHwgMy42LjcgICAgICAgICB8ICAgICAgIHwKK3wgcnVieSAgICAgIHwgMi4zLjFwMTEyICAgICB8IDIuNS4xcDU3ICAgICAgfCAgICAgICB8Cit8IHJ1c3QgICAgICB8IDEuMTcuMCAgICAgICAgfCAxLjMwLjAgICAgICAgIHwgICAgICAgfAorfCBzbWFsbHRhbGsgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IHN3aWZ0ICAgICB8ICAgICAgICAgICAgICAgfCA0LjIuMSAgICAgICAgIHwgICAgICAgfApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvVmFncmFudGZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhYzZlNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvVmFncmFudGZpbGUKQEAgLTAsMCArMSw1OSBAQAorIyAtKi0gbW9kZTogcnVieSAtKi0KKyMgdmk6IHNldCBmdD1ydWJ5IDoKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBCYXNlIHN5c3RlbSBib290c3RyYXAgc2NyaXB0CiskYm9vdHN0cmFwX3NjcmlwdCA9IDw8X19CT09UU1RSQVBfXworZWNobyAiUHJvdmlzaW9uaW5nIGRlZmF1bHRzIgorCitzdWRvIGFwdC1nZXQgdXBkYXRlIC15CitzdWRvIGFwdC1nZXQgdXBncmFkZSAteQorCisjIEluc3RhbGwgZGVmYXVsdCBwYWNrYWdlcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgYnVpbGQtZXNzZW50aWFsIGN1cmwgZ2l0CisKKyMgSW5zdGFsbCBsYXRlc3QgRG9ja2VyIHZlcnNpb24KK3N1ZG8gY3VybCAtc1NMIGh0dHBzOi8vZ2V0LmRvY2tlci5pby9ncGcgfCBzdWRvIGFwdC1rZXkgYWRkIC0KK3N1ZG8gZWNobyAiZGViIGh0dHA6Ly9nZXQuZG9ja2VyLmlvL3VidW50dSBkb2NrZXIgbWFpbiIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb2NrZXIubGlzdAorc3VkbyBhcHQtZ2V0IHVwZGF0ZSAteQorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgbGludXgtaW1hZ2UtZXh0cmEtYHVuYW1lIC1yYCBhdWZzLXRvb2xzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBseGMtZG9ja2VyCisKK2VjaG8gIkZpbmlzaGVkIHByb3Zpc2lvbmluZyBkZWZhdWx0cyIKK19fQk9PVFNUUkFQX18KKworVmFncmFudC5jb25maWd1cmUoIjIiKSBkbyB8Y29uZmlnfAorICBjb25maWcudm0uYm94ID0gInRydXN0eTY0IgorICBjb25maWcudm0uYm94X3VybCA9ICJodHRwczovL2Nsb3VkLWltYWdlcy51YnVudHUuY29tL3ZhZ3JhbnQvdHJ1c3R5L2N1cnJlbnQvdHJ1c3R5LXNlcnZlci1jbG91ZGltZy1hbWQ2NC12YWdyYW50LWRpc2sxLmJveCIKKyAgY29uZmlnLnNzaC5mb3J3YXJkX2FnZW50ID0gdHJ1ZQorCisgIGNvbmZpZy52bS5wcm92aWRlciA6dmlydHVhbGJveCBkbyB8dmJveHwKKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMTAyNCJdCisgICAgdmJveC5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tY3B1cyIsICIyIl0KKyAgZW5kCisKKyAgIyBTZXR1cCB0aGUgZGVmYXVsdCBib290c3RyYXAgc2NyaXB0IGZvciBvdXIgdWJ1bnR1IGJhc2UgYm94IGltYWdlCisgIGNvbmZpZy52bS5wcm92aXNpb24gInNoZWxsIiwgaW5saW5lOiAkYm9vdHN0cmFwX3NjcmlwdAorCisgICMgU2V0dXAgdGhlIGN1c3RvbSBkb2NrZXIgaW1hZ2UgZnJvbSBvdXIgVWJ1bnR1IERvY2tlcmZpbGUKKyAgY29uZmlnLnZtLnByb3Zpc2lvbiAiZG9ja2VyIiBkbyB8ZHwKKyAgICBkLmJ1aWxkX2ltYWdlICIvdmFncmFudC91YnVudHUiLCBhcmdzOiAiLXQgdGhyaWZ0IgorICBlbmQKKworICAjIFNldHVwIHRoZSBjdXN0b20gZG9ja2VyIGltYWdlIGZyb20gb3VyIENlbnRvcyBEb2NrZXJmaWxlCisgICNjb25maWcudm0ucHJvdmlzaW9uICJkb2NrZXIiIGRvIHxkfAorICAjICBkLmJ1aWxkX2ltYWdlICIvdmFncmFudC9jZW50b3MiLCBhcmdzOiAiLXQgdGhyaWZ0LWNlbnRvcyIKKyAgI2VuZAorCitlbmQKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvY2VudG9zLTcuMy9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9jZW50b3MtNy4zL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2YmJhYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvY2VudG9zLTcuMy9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMTk5IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIENlbnRPUworIworIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6CisjICAtIGRvdG5ldCAod2lsbCB1cGRhdGUgdG8gMi4wLjAgc2VwYXJhdGVseSkKKyMgIC0gaGF4ZSAobm90IGluIGNlbnRvcykKKworRlJPTSBjZW50b3M6Ny4zLjE2MTEKK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorCitSVU4geXVtIGluc3RhbGwgLXkgZXBlbC1yZWxlYXNlCisKKyMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBhdXRvY29uZiBcCisgICAgICBiaXNvbiBcCisgICAgICBiaXNvbi1kZXZlbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbGFuZy1hbmFseXplciBcCisgICAgICBjbWFrZTMgXAorICAgICAgY3VybCBcCisgICAgICBmbGV4IFwKKyAgICAgIGdjYyBcCisgICAgICBnY2MtYysrIFwKKyAgICAgIGdkYiBcCisgICAgICBnaXQgXAorICAgICAgbGlidG9vbCBcCisgICAgICBtNCBcCisgICAgICBtYWtlIFwKKyAgICAgIHRhciBcCisgICAgICB1bnppcCBcCisgICAgICB2YWxncmluZCBcCisgICAgICB3Z2V0ICYmIFwKKyAgICAgIGxuIC1zIC91c3IvYmluL2NtYWtlMyAvdXNyL2Jpbi9jbWFrZSAmJiBcCisgICAgICBsbiAtcyAvdXNyL2Jpbi9jcGFjazMgL3Vzci9iaW4vY3BhY2sgJiYgXAorICAgICAgbG4gLXMgL3Vzci9iaW4vY3Rlc3QzIC91c3IvYmluL2N0ZXN0CisKKyMgQysrIGRlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGJvb3N0LWRldmVsLXN0YXRpYyBcCisgICAgICB6bGliLWRldmVsIFwKKyAgICAgIG9wZW5zc2wtZGV2ZWwgXAorICAgICAgbGliZXZlbnQtZGV2ZWwgJiYgXAorICAgIGNkIC91c3IvbGliNjQgJiYgXAorICAgIGxuIC1zIGxpYmJvb3N0X3RocmVhZC1tdC5hIGxpYmJvb3N0X3RocmVhZC5hCisKKyMgQyMgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgbW9uby1jb3JlIFwKKyAgICAgIG1vbm8tZGV2ZWwgXAorICAgICAgbW9uby13ZWItZGV2ZWwgXAorICAgICAgbW9uby1leHRyYXMKKworIyBEIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8yLjA3Ni4wL2RtZC0yLjA3Ni4wLTAuZmVkb3JhLng4Nl82NC5ycG0geGRnLXV0aWxzCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyIG9wZW5zc2wtbWFzdGVyCisKKyMgRGFydAorUlVOIGNkIC91c3IvbG9jYWwgJiYgXAorICAgIHdnZXQgLXEgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2RhcnQtYXJjaGl2ZS9jaGFubmVscy9zdGFibGUvcmVsZWFzZS8xLjI0LjIvc2RrL2RhcnRzZGstbGludXgteDY0LXJlbGVhc2UuemlwICYmIFwKKyAgICB1bnppcCAtcSBkYXJ0c2RrLWxpbnV4LXg2NC1yZWxlYXNlLnppcCAmJiBcCisgICAgcm0gZGFydHNkay1saW51eC14NjQtcmVsZWFzZS56aXAKK0VOViBQQVRIIC91c3IvbG9jYWwvZGFydC1zZGsvYmluOiRQQVRICisKKyMgRXJsYW5nIERlcGVuZGVuY2llcworUlVOIGN1cmwgLXNTTCBodHRwOi8vcGFja2FnZXMuZXJsYW5nLXNvbHV0aW9ucy5jb20vcnBtL2NlbnRvcy9lcmxhbmdfc29sdXRpb25zLnJlcG8gLW8gL2V0Yy95dW0ucmVwb3MuZC9lcmxhbmdfc29sdXRpb25zLnJlcG8gJiYgXAorICAgIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGVybGFuZy1rZXJuZWwgXAorICAgICAgZXJsYW5nLWVydHMgXAorICAgICAgZXJsYW5nLXN0ZGxpYiBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLXJlYmFyIFwKKyAgICAgIGVybGFuZy10b29scworCisjIEdMaWJDIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IGdsaWIyLWRldmVsCisKKyMgR28gRGVwZW5kZW5jaWVzCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjkubGludXgtYW1kNjQudGFyLmd6IHwgdGFyIC1DIC91c3IvbG9jYWwvIC14egorRU5WIFBBVEggL3Vzci9sb2NhbC9nby9iaW46JFBBVEgKKworIyBIYXNrZWxsIERlcGVuZGVuY2llcworUlVOIHl1bSAteSBpbnN0YWxsIGhhc2tlbGwtcGxhdGZvcm0KKworIyBIYXhlIERlcGVuZGVuY2llcworIyBOb3QgaW4gZGViaWFuL3N0cmV0Y2gKKworIyBKYXZhIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGFudCBcCisgICAgICBqdW5pdCBcCisgICAgICBhbnQtanVuaXQgXAorICAgICAgamF2YS0xLjguMC1vcGVuamRrLWRldmVsCisKKyMgTHVhIERlcGVuZGVuY2llcworIyBMdWEgaW4gZXBlbCBpcyB0b28gb2xkICg1LjEuNCwgbmVlZCA1LjIpIHNvIHdlIGdldCB0aGUgbGF0ZXN0CitSVU4geXVtIGluc3RhbGwgLXkgcmVhZGxpbmUtZGV2ZWwgJiYgXAorICAgIHdnZXQgLXEgaHR0cDovL3d3dy5sdWEub3JnL2Z0cC9sdWEtNS4zLjQudGFyLmd6ICYmIFwKKyAgICB0YXIgeHpmIGx1YS01LjMuNC50YXIuZ3ogJiYgXAorICAgIGNkIGx1YS01LjMuNCAmJiBcCisgICAgc2VkIC1pICdzL0NGTEFHUz0gL0NGTEFHUz0gLWZQSUMgL2cnIHNyYy9NYWtlZmlsZSAmJiBcCisgICAgbWFrZSBsaW51eCAmJiBcCisgICAgbWFrZSBpbnN0YWxsICYmIFwKKyAgICBjZCAuLiAmJiBcCisgICAgcm0gLXJmIGx1YS01KgorCisjIE1pbkdXIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG1pbmd3MzItYmludXRpbHMgXAorICAgICAgbWluZ3czMi1jcnQgXAorICAgICAgbWluZ3czMi1uc2lzCisKKyMgTm9kZS5qcyBEZXBlbmRlbmNpZXMKKyMgV29yayBhcm91bmQgZXBlbCBpc3N1ZSB3aGVyZSB0aGV5IHJlbW92ZWQgaHR0cC1wYXJzZXIgdGhhdCBub2RlanMgZGVwZW5kcyBvbiEKK1JVTiB5dW0gLXkgaW5zdGFsbCBodHRwczovL29wZW5zb3VyY2UuZW5kYS5ldS9wYWNrYWdlcy9odHRwLXBhcnNlci0yLjcuMS0zLmVsNy54ODZfNjQucnBtCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgbm9kZWpzIFwKKyAgICAgIG5wbQorCisjIE9jYW1sIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9jYW1sLW9jYW1sZG9jICYmIFwKKyAgICB3Z2V0IC1xIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vb2NhbWwvb3BhbS9tYXN0ZXIvc2hlbGwvb3BhbV9pbnN0YWxsZXIuc2ggLU8gLSB8IHNoIC1zIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcyAmJiBcCisgICAgZWNobyAnLiAvcm9vdC8ub3BhbS9vcGFtLWluaXQvaW5pdC5zaCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZScgPj4gfi8uYmFzaHJjCisKKyMgUGVybCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBwZXJsIFwKKyAgICAgIHBlcmwtdmVyc2lvbiBcCisgICAgICBwZXJsLUJpdC1WZWN0b3IgXAorICAgICAgcGVybC1DbGFzcy1BY2Nlc3NvciBcCisgICAgICBwZXJsLUV4dFV0aWxzLU1ha2VNYWtlciBcCisgICAgICBwZXJsLVRlc3QtU2ltcGxlIFwKKyAgICAgIHBlcmwtSU8tU29ja2V0LVNTTCBcCisgICAgICBwZXJsLU5ldC1TU0xlYXkgXAorICAgICAgcGVybC1DcnlwdC1TU0xlYXkKKworIyBQSFAgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcGhwIFwKKyAgICAgIHBocC1kZXZlbCBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocC1waHB1bml0LVBIUFVuaXQgXAorICAgICAgYnppcDIKKworIyBQeXRob24gRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcHl0aG9uIFwKKyAgICAgIHB5dGhvbi1kZXZlbCBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjM0IFwKKyAgICAgIHB5dGhvbjM0LWRldmVsIFwKKyAgICAgIHB5dGhvbjM0LXBpcCBcCisgICAgICBweXRob24zNC1zZXR1cHRvb2xzCitSVU4gcGlwMiBpbnN0YWxsIC0tdXBncmFkZSBwaXAKK1JVTiBwaXAyIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaXBhZGRyZXNzIHNldHVwdG9vbHMgc2l4IHRvcm5hZG8gdG9ybmFkby10ZXN0aW5nIHR3aXN0ZWQgdmlydHVhbGVudiB6b3BlLWludGVyZmFjZQorUlVOIHBpcDMgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwCitSVU4gcGlwMyBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlwYWRkcmVzcyBzZXR1cHRvb2xzIHNpeCB0b3JuYWRvIHRvcm5hZG8tdGVzdGluZyB0d2lzdGVkIHZpcnR1YWxlbnYgem9wZS1pbnRlcmZhY2UKKworIyBSdWJ5IERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXZlbCBcCisgICAgICBydWJ5Z2VtcyAmJiBcCisgICAgZ2VtIGluc3RhbGwgYnVuZGxlciByYWtlCisKKyMgUnVzdAorUlVOIGN1cmwgaHR0cHM6Ly9zaC5ydXN0dXAucnMgLXNTZiB8IHNoIC1zIC0tIC15IC0tZGVmYXVsdC10b29sY2hhaW4gMS4xNy4wCitFTlYgUEFUSCAvcm9vdC8uY2FyZ28vYmluOiRQQVRICisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3RtcC8qICYmIFwKKyAgICB5dW0gY2xlYW4gYWxsCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tamVzc2llL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1qZXNzaWUvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmM3NGZjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tamVzc2llL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyMDQgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgRGViaWFuCisjCisjIEtub3duIG1pc3NpbmcgY2xpZW50IGxpYnJhcmllczoKKyMgIC0gZG90bmV0Y29yZQorIyAgLSBydXN0CisKK0ZST00gYnVpbGRwYWNrLWRlcHM6amVzc2llLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CisKK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyBBZGQgYXB0IHNvdXJjZXMKKyMgamVzc2llLWJhY2twb3J0cyBmb3IgY21ha2UgYW5kIHNvbWUgcnVieSBiaXRzCitSVU4gZWNobyAiZGViIGh0dHA6Ly9mdHAuZGViaWFuLm9yZy9kZWJpYW4gamVzc2llLWJhY2twb3J0cyBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2plc3NpZS1iYWNrcG9ydHMubGlzdAorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAmJiBcCisgICAgc2VkIC1pIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgLWUgJ3MvaHR0cHM6L2h0dHA6L2cnCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBwa2ctY29uZmlnICYmIFwKKyAgICBhcHQtZ2V0IC10IGplc3NpZS1iYWNrcG9ydHMgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBjbWFrZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWRldiBcCisgICAgICBsaWJib29zdC1maWxlc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC1wcm9ncmFtLW9wdGlvbnMtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtdGVzdC1kZXYgXAorICAgICAgbGliYm9vc3QtdGhyZWFkLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstNy1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtcGlwCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgLXQgamVzc2llLWJhY2twb3J0cyBpbnN0YWxsIC15IHJ1YnktYnVuZGxlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA1IFwKKyAgICAgIHBocDUtZGV2IFwKKyAgICAgIHBocDUtY2xpIFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgcGhwdW5pdCBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2IFwKKyAgICAgIGxpYm5la28wCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcyBcCisgICAgICBub2RlanMtZGV2IFwKKyAgICAgIG5vZGVqcy1sZWdhY3kgXAorICAgICAgbnBtCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQ1NoYXJwIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbCBcCisgICAgICBtb25vLWRldmVsCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHhkZy11dGlscyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydCBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldiBcCitgIyBNaW5HVyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1pbmd3MzIgXAorICAgICAgbWluZ3czMi1iaW51dGlscyBcCitgIyAgICAgIG1pbmd3MzItcnVudGltZWAgXAorICAgICAgbnNpcyBcCitgIyBDbGVhbiB1cGAgXAorICAgICYmIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKKyMgUnVieQorUlVOIGdlbSBpbnN0YWxsIGJ1bmRsZXIgLS1uby1yaSAtLW5vLXJkb2MKKworIyBQeXRob24gb3B0aW9uYWwgZGVwZW5kZW5jaWVzCitSVU4gcGlwMiBpbnN0YWxsIC1VIGlwYWRkcmVzcyBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KK1JVTiBwaXAzIGluc3RhbGwgLVUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCisKKyMgR28KK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dvbGFuZy9nbzEuNC4zLmxpbnV4LWFtZDY0LnRhci5neiB8IHRhciAtQyAvdXNyL2xvY2FsLyAteHoKK0VOViBQQVRIIC91c3IvbG9jYWwvZ28vYmluOiRQQVRICisKKyMgSGF4ZQorUlVOIG1rZGlyIC1wIC91c3IvbGliL2hheGUgJiYgXAorICAgIHdnZXQgLU8gLSBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9yZWxlYXNlcy9kb3dubG9hZC8zLjIuMS9oYXhlLTMuMi4xLWxpbnV4NjQudGFyLmd6IHwgXAorICAgIHRhciAtQyAvdXNyL2xpYi9oYXhlIC0tc3RyaXAtY29tcG9uZW50cz0xIC14eiAmJiBcCisgICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlIC91c3IvYmluL2hheGUgJiYgXAorICAgIGxuIC1zIC91c3IvbGliL2hheGUvaGF4ZWxpYiAvdXNyL2Jpbi9oYXhlbGliICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2xpYi9oYXhlL2xpYiAgJiYgXAorICAgIGNobW9kIC1SIDc3NyAvdXNyL2xpYi9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAvdXNyL2xpYi9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwCisKKyMgRAorUlVOIGN1cmwgLXNTTCBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvMi4wNzAuMC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAtbyAvdG1wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViICYmIFwKKyAgICBkcGtnIC1pIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAorICAgIHJtIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciBvcGVuc3NsLW1hc3RlciAmJiBcCisgICAgZWNobyAnZ2NjIC1XbCwtLW5vLWFzLW5lZWRlZCAkKicgPiAvdXNyL2xvY2FsL2Jpbi9nY2MtZG1kICYmIFwKKyAgICBjaG1vZCA3NTUgL3Vzci9sb2NhbC9iaW4vZ2NjLWRtZCAmJiBcCisgICAgZWNobyAnQ0M9L3Vzci9sb2NhbC9iaW4vZ2NjLWRtZCcgPj4gL2V0Yy9kbWQuY29uZgorCisjIERhcnQKK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKKyMgT0NhbWwKK1JVTiBlY2hvICdkZWIgaHR0cDovL3BwYS5sYXVuY2hwYWQubmV0L2F2c20vcHBhL3VidW50dSB0cnVzdHkgbWFpbicgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9hdnNtLW9mZmljaWFsLW9jYW1sLmxpc3QgJiYgXAorICAgIGdwZyAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3YgNjE3MDdCMDkgJiYgXAorICAgIGdwZyAtLWV4cG9ydCAtLWFybW9yIDYxNzA3QjA5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSBvY2FtbCBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgJiYgXAorICAgIG9wYW0gaW5zdGFsbCBvYXNpcworCisjIEZvcmNlIHV0ZjggbG9jYWxlIHRvIHN1Y2Nlc3NmdWxseSBidWlsZCBIYXNrZWxsIHRmLXJhbmRvbQorRU5WIExDX0FMTCBDLlVURi04CisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tc3RyZXRjaC9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tc3RyZXRjaC9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwM2VlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyMzEgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgRGViaWFuIFN0cmV0Y2gKKyMKKyMgS25vd24gaXNzdWVzOgorIyAtIGQ6IGRlaW1vcyBmb3IgbGliZXZlbnQgYW5kIG9wZW5zc2wgZGlzYWJsZWQgLSBidWlsZCBlcnJvcnMKKyMgLSBkb3RuZXRjb3JlLCBiZWNhdXNlIG5ldGNvcmUgaXMgZm9yIDEuMC4wLXByZXZpZXcgYW5kIDIuMC4wIGlzIG91dAorIyAtIHJ1c3Q6IGNhcmdvIG5vdCBpbiBkZWJpYW4gcmVwbyAtIHBlcmhhcHMgbm90IG5lZWRlZD8KKworRlJPTSBidWlsZHBhY2stZGVwczpzdHJldGNoLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CisKK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBhcHQgYXB0LXRyYW5zcG9ydC1odHRwcyBjdXJsIHdnZXQgYXB0LXV0aWxzCisKKyMgRAorUlVOIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QgJiYgXAorICAgIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgLXkgLS1hbGxvdy11bmF1dGhlbnRpY2F0ZWQgaW5zdGFsbCAtLXJlaW5zdGFsbCBkLWFwdC1rZXlyaW5nCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0ICYmIFwKKyAgICBzZWQgLWkgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAtZSAncy9odHRwczovaHR0cDovZycKKworIyBkb3RuZXQgKGNvcmUpIDIuMC4wIC0gcHJvamVjdCBpc24ndCByZWFkeSBmb3IgdGhpcyB5ZXQ6CisjIFJVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyMgICAgIGVjaG8gImRlYiBbYXJjaD1hbWQ2NF0gaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL3JlcG9zL21pY3Jvc29mdC11YnVudHUteGVuaWFsLXByb2QgeGVuaWFsIG1haW4iID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG90bmV0ZGV2Lmxpc3QKKworIyBub2RlLmpzICh0aGlzIHN0ZXAgcnVucyBhcHQtZ2V0IHVwZGF0ZSBpbnRlcm5hbGx5KQorUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL3NldHVwXzgueCB8IGJhc2gKKworCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KKworCisjIyMgbGFuZ3VhZ2VzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAorICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC10ZXN0LWRldiBcCisgICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG1kLWJpbiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICB4ZGctdXRpbHMKKyMgbGliZXZlbnQgZGVpbW9zIGRpc2FibGVkIC0gYnVpbGQgZXJyb3JzCisjIFJVTiBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisjICAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyMgICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyMgICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorIyAgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlcgorIyBvcGVuc3NsIGRlaW1vcyBkb2Vzbid0IHdvcmsgd2l0aCBvcGVuc3NsLTEuMS4wIC0gZGlzYWJsaW5nIGl0IGZvciBub3c6CisjIFJVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorIyAgICAgbXYgb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisjICAgICBtdiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorIyAgICAgcm0gLXJmIG9wZW5zc2wtbWFzdGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQKK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKKyMgcHJvamVjdCBpc24ndCByZWFkeSBmb3IgdGhpcyBxdWl0ZSB5ZXQ6CisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgZG90bmV0LXNkay0yLjAuMAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBnb2xhbmcgKGdvKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdvbGFuZy1nbworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYKK1JVTiBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIHNhbWUgZm9yIGRlYmlhbiBzdHJldGNoCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyBzbyBzdGljayB3aXRoIDUuMiBoZXJlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDcuMCBcCisgICAgICBwaHA3LjAtY2xpIFwKKyAgICAgIHBocDcuMC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBwaHB1bml0CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tYmFja3BvcnRzLnNzbC1tYXRjaC1ob3N0bmFtZSBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorUlVOIGdlbSBpbnN0YWxsIGJ1bmRsZXIgLS1uby1yaSAtLW5vLXJkb2MKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVzdGMKKworIyBVcGRhdGUgYW55dGhpbmcgZWxzZSBsZWZ0IGhhbmdpbmcKK1JVTiBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteQorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTRkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI0NCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgVHJ1c3R5CisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgVHJ1c3R5IHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAyLjA3MC4wCisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDEuMjAuMQorIyAtIGRvdG5ldGNvcmUsIGRpc2FibGVkIGJlY2F1c2UgbmV0Y29yZSBpcyBmb3IgMS4wLjAtcHJldmlldyBhbmQgMi4wLjAgaXMgb3V0CisjIC0gaGF4ZSwgZGlzYWJsZWQgYmVjYXVzZSB0aGUgZGlzdHJvIGNvbWVzIHdpdGggMy4wLjAgYW5kIGl0IGNvcmVzIHdoaWxlIGluc3RhbGxpbmcKKyMgLSBub2RlLmpzLCBkaXNhYmxlZCBiZWNhdXNlIGl0IGlzIGF0IDAuMTAuMCBpbiB0aGUgZGlzdHJvIHdoaWNoIGlzIHRvbyBvbGQgKG5lZWQgNCspCisjIC0gb2NhbWwsIGRpc2FibGVkIGJlY2F1c2UgaXQgZmFpbHMgdG8gaW5zdGFsbCBwcm9wZXJseQorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOnRydXN0eS1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZGlybW5nciBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgRAorUlVOIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEVCQ0Y5NzVFNUJBMjRENUUgJiYgXAorICAgICAgICB3Z2V0IGh0dHA6Ly9tYXN0ZXIuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvZC1hcHQvZmlsZXMvZC1hcHQubGlzdCAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kLWFwdC5saXN0ICYmIFwKKyAgICAgICAgd2dldCAtcU8gLSBodHRwczovL2RsYW5nLm9yZy9kLWtleXJpbmcuZ3BnIHwgYXB0LWtleSBhZGQgLQorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tMy44L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWFsbC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkbWQtYmluPTIuMDcwLjItMCBcCisgICAgICBsaWJwaG9ib3MyLWRldj0yLjA3MC4yLTAgXAorICAgICAgZHViIFwKKyAgICAgIGRmbXQgXAorICAgICAgZHNjYW5uZXIgXAorICAgICAgeGRnLXV0aWxzCitSVU4gbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBvcGVuc3NsLW1hc3RlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PTEuMjAuMS0xCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworIyBnb2xhbmcKK0VOViBHT0xBTkdfVkVSU0lPTiAxLjcuNgorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgYWQ1ODA4YmY0MmIwMTRjMjJkZDc2NDY0NThmNjMxMzg1MDAzMDQ5ZGVkMGJiNmFmMmVmYzdmMWY3OWZhMjllYQorUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICBybSBnb2xhbmcudGFyLmd6CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKKyMgZGlzYWJsZWQgYmVjYXVzZSBpdCBjb3JlcyB3aGlsZSBpbnN0YWxsaW5nCisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBoYXhlIFwKKyMgICAgICAgbmVrbyBcCisjICAgICAgIG5la28tZGV2ICYmIFwKKyMgICAgIGhheGVsaWIgc2V0dXAgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisjICAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAgMy4yLjEwMgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstNy1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjEgXAorICAgICAgbHVhNS4xLWRldgorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgaXMgdG9vIG9sZAorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgbm9kZWpzIFwKKyMgICAgICAgbnBtCisKKyMgZGlzYWJsZWQgYmVjYXVzZSBpdCBmYWlscyB0byBpbnN0YWxsIHByb3Blcmx5CisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgb2NhbWwgXAorIyAgICAgICBvcGFtICYmIFwKKyMgICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisjICAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDUgXAorICAgICAgcGhwNS1jbGkgXAorICAgICAgcGhwNS1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyAmJiBcCisgICAgICB3Z2V0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2luc3RhbGxlciAtTyAtIC1xIHwgcGhwIC0tIC0tcXVpZXQgLS1pbnN0YWxsLWRpcj0vdXNyL2xvY2FsL2Jpbi8gLS1maWxlbmFtZT1jb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXBpcCBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgICBwaXAgaW5zdGFsbCAtVSBpcGFkZHJlc3MgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvICYmIFwKKyAgICBwaXAzIGluc3RhbGwgLVUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCisjIGluc3RhbGxpbmcgdG9ybmFkbyBieSBwaXAvcGlwMyBpbnN0ZWFkIG9mIGRlYmlhbiBwYWNrYWdlCisjIGlmIHdlIGluc3RhbGwgdGhlIGRlYmlhbiBwYWNrYWdlLCB0aGUgYnVpbGQgZmFpbHMgaW4gcHkyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFN0YXRpYyBDb2RlIEFuYWx5c2lzIGRlcGVuZGVuY2llc2AgXAorICAgICAgY3BwY2hlY2sgXAorICAgICAgc2xvY2NvdW50ICYmIFwKKyAgICBwaXAgaW5zdGFsbCBmbGFrZTgKKworIyBJbnN0YWxsIEJvdW5jeUNhc3RsZSBwcm92aWRlciB0byBmaXggSmF2YSBidWlsZHMgaXNzdWVzIHdpdGggSkRLIDcKKyMgQnVpbGRzIGFjY2Vzc2luZyByZXBvdGUgcmVwb3NpdG9yaWVzIGZhaWwgYXMgc2VlbiBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vdHJhdmlzLWNpL3RyYXZpcy1jaS9pc3N1ZXMvODUwMworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBCb3VuY3lDYXN0bGUgSkNFIFByb3ZpZGVyIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYmNwcm92LWphdmEgJiYgXAorICAgIGxuIC1zIC91c3Ivc2hhcmUvamF2YS9iY3Byb3YuamFyIC91c3IvbGliL2p2bS9qYXZhLTctb3Blbmpkay1hbWQ2NC9qcmUvbGliL2V4dC9iY3Byb3YuamFyICYmIFwKKyAgICBhd2sgLUYgLiAtdiBPRlM9LiAnQkVHSU57bj0yfS9ec2VjdXJpdHlcLnByb3ZpZGVyLyB7c3BsaXQoJDMsIHBvc0FuZEVxdWFscywgIj0iKTskMz1uKysiPSJwb3NBbmRFcXVhbHNbMl07cHJpbnQ7bmV4dH0gMScgL2V0Yy9qYXZhLTctb3Blbmpkay9zZWN1cml0eS9qYXZhLnNlY3VyaXR5ID4gL3RtcC9qYXZhLnNlY3VyaXR5ICYmIFwKKyAgZWNobyAic2VjdXJpdHkucHJvdmlkZXIuMT1vcmcuYm91bmN5Y2FzdGxlLmpjZS5wcm92aWRlci5Cb3VuY3lDYXN0bGVQcm92aWRlciIgPj4gL3RtcC9qYXZhLnNlY3VyaXR5ICYmIFwKKyAgbXYgL3RtcC9qYXZhLnNlY3VyaXR5IC9ldGMvamF2YS03LW9wZW5qZGsvc2VjdXJpdHkvamF2YS5zZWN1cml0eQorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvcmVmcmVzaC5zaCBiL2J1aWxkL2RvY2tlci9yZWZyZXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA4Y2JjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvcmVmcmVzaC5zaApAQCAtMCwwICsxLDgyIEBACisjIS9iaW4vYmFzaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgVGhlIGJ1aWxkIGhhcyB0d28gc3RhZ2VzOiAiZG9ja2VyIiBhbmQgInRlc3QiCisjIFRoZSAiZG9ja2VyIiBzdGFnZSBpcyBtZWFudCB0byByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2VzCisjICAgaWYgbmVlZGVkLiAgSWYgd2UgY2Fubm90IHB1c2ggdGhhdCByZXN1bHQgaG93ZXZlciB0aGVuCisjICAgdGhlcmUgaXMgbm8gcmVhc29uIHRvIGRvIGFueXRoaW5nLgorIyBUaGUgInRlc3QiIHN0YWdlIGlzIGFuIGFjdHVhbCB0ZXN0IGpvYi4gIEV2ZW4gaWYgdGhlIGRvY2tlcgorIyAgIGltYWdlIGRvZXNuJ3QgbWF0Y2ggd2hhdCdzIGluIHRoZSByZXBvLCB3ZSBzdGlsbCBidWlsZAorIyAgIHRoZSBpbWFnZSBzbyB0aGUgYnVpbGQgam9iIGNhbiBydW4gcHJvcGVybHkuCisjCisKK3NldCAtZQorCitTQ1JJUFRfRElSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCitET0NLRVJfVEFHPSRET0NLRVJfUkVQTzokRElTVFJPCisKK2Z1bmN0aW9uIGRvY2tlcmZpbGVfY2hhbmdlZCB7CisgICMgaW1hZ2UgbWF5IG5vdCBleGlzdCB5ZXQsIHNvIHdlIGhhdmUgdG8gbGV0IGl0IGZhaWwgc2lsZW50bHk6CisgIGRvY2tlciBwdWxsICRET0NLRVJfVEFHIHx8IHRydWUKKyAgZG9ja2VyIHJ1biAkRE9DS0VSX1RBRyBiYXNoIC1jICdjZCAuLiAmJiBzaGE1MTJzdW0gRG9ja2VyZmlsZScgPiAuRG9ja2VyZmlsZS5zaGE1MTIKKyAgc2hhNTEyc3VtIC1jIC5Eb2NrZXJmaWxlLnNoYTUxMgorfQorCisjCisjIElmIHRoaXMgYnVpbGQgaGFzIG5vIERPQ0tFUl9QQVNTIGFuZCBpdCBpcyBpbiB0aGUgZG9ja2VyIHN0YWdlCisjIHRoZW4gdGhlcmUncyBubyByZWFzb24gdG8gZG8gYW55IHByb2Nlc3NpbmcgYmVjYXVzZSB3ZSBjYW5ub3QKKyMgcHVzaCB0aGUgcmVzdWx0IGlmIHRoZSBEb2NrZXJmaWxlIGNoYW5nZWQuICAKKyMKKworaWYgW1sgIiRUUkFWSVNfQlVJTERfU1RBR0UiID09ICJkb2NrZXIiIF1dICYmIFtbIC16ICIkRE9DS0VSX1BBU1MiIF1dOyB0aGVuCisgIGVjaG8gRGV0ZWN0ZWQgZG9ja2VyIHN0YWdlIGJ1aWxkIGFuZCBubyBkZWZpbmVkIERPQ0tFUl9QQVNTLCB0aGlzIGJ1aWxkIGpvYiB3aWxsIGJlIHNraXBwZWQuCisgIGVjaG8gU3Vic2VxdWVudCBqb2JzIGluIHRoZSB0ZXN0IHN0YWdlIG1heSBlYWNoIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZS4KKyAgZXhpdCAwCitmaQorCisKK3B1c2hkICR7U0NSSVBUX0RJUn0vJERJU1RSTworaWYgZG9ja2VyZmlsZV9jaGFuZ2VkOyB0aGVuCisgIGVjaG8gRG9ja2VyZmlsZSBoYXMgbm90IGNoYW5nZWQuICBObyBuZWVkIHRvIHJlYnVpbGQuCisgIGV4aXQgMAorZWxzZQorICBlY2hvIERvY2tlcmZpbGUgaGFzIGNoYW5nZWQuCitmaQorcG9wZAorCisjCisjIERvY2tlcmZpbGUgaGFzIGNoYW5nZWQgLSByZWJ1aWxkIGl0IGZvciB0aGUgY3VycmVudCBidWlsZCBqb2IuCisjIElmIGl0IGlzIGEgImRvY2tlciIgc3RhZ2UgYnVpbGQgdGhlbiB3ZSB3YW50IHRvIHB1c2ggaXQgYmFjaworIyB0byB0aGUgRE9DS0VSX1JFUE8uICBJZiBpdCBpcyBhICJ0ZXN0IiBzdGFnZSBidWlsZCB0aGVuIHdlIGRvCisjIG5vdC4gIElmIG5vYm9keSBkZWZpbmVkIGEgRE9DS0VSX1BBU1MgdGhlbiBpdCBkb2Vzbid0IG1hdHRlci4KKyMKKworZWNobyBSZWJ1aWxkaW5nIGRvY2tlciBpbWFnZSAkRElTVFJPCitkb2NrZXIgYnVpbGQgLS10YWcgJERPQ0tFUl9UQUcgYnVpbGQvZG9ja2VyLyRESVNUUk8KKworaWYgW1sgIiRUUkFWSVNfQlVJTERfU1RBR0UiID09ICJkb2NrZXIiIF1dICYmIFtbICEgLXogIiRET0NLRVJfVVNFUiIgXV0gJiYgW1sgISAteiAiJERPQ0tFUl9QQVNTIiBdXTsgdGhlbiAKKyAgZWNobyBQdXNoaW5nIGRvY2tlciBpbWFnZSAkRE9DS0VSX1RBRworICBkb2NrZXIgbG9naW4gLXUgJERPQ0tFUl9VU0VSIC1wICRET0NLRVJfUEFTUworICBkb2NrZXIgcHVzaCAkRE9DS0VSX1RBRworZWxzZQorICBlY2hvIE5vdCBwdXNoaW5nIGRvY2tlciBpbWFnZTogZWl0aGVyIG5vdCBhIGRvY2tlciBzdGFnZSBidWlsZCBqb2IsIG9yIG9uZSBvZiBET0NLRVJfVVNFUiBvciBET0NLRVJfUEFTUyBpcyB1bmRlZmluZWQuCitmaQorCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvcnVuLnNoIGIvYnVpbGQvZG9ja2VyL3J1bi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZmUxOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3J1bi5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vYmFzaAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NldCAtZQorCitTQ1JJUFRfRElSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCitET0NLRVJfVEFHPSRET0NLRVJfUkVQTzokRElTVFJPCisKK3ByaW50ZW52IHwgc29ydAorCitkb2NrZXIgcnVuIC0tbmV0PWhvc3QgLWUgQlVJTERfTElCUz0iJEJVSUxEX0xJQlMiICRCVUlMRF9FTlYgLXYgJChwd2QpOi90aHJpZnQvc3JjIFwKKwktaXQgJERPQ0tFUl9UQUcgYnVpbGQvZG9ja2VyL3NjcmlwdHMvJFNDUklQVCAkQlVJTERfQVJHCisKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Mzg4ZjcyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCkBAIC0wLDAgKzEsNiBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKKy4vYm9vdHN0cmFwLnNoCisuL2NvbmZpZ3VyZSAkKgorbWFrZSBjaGVjayAtajMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NjMzExZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCitDTUFLRV9GTEFHUz0kKgorTUFLRVBST0c9bWFrZQorCitpZiBuaW5qYSAtLXZlcnNpb24gID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBNQUtFUFJPRz1uaW5qYQorICBDTUFLRV9GTEFHUz0iLUdOaW5qYSAkQ01BS0VfRkxBR1MiCitmaQorCitta2RpciAtcCBjbWFrZV9idWlsZCAmJiBjZCBjbWFrZV9idWlsZAorY21ha2UgJENNQUtFX0ZMQUdTIC4uCitmb3IgTElCIGluICRCVUlMRF9MSUJTOyBkbworICBpZiAhIGdyZXAgIl5CVUlMRF8ke0xJQn06Qk9PTD1PTiQiIENNYWtlQ2FjaGUudHh0IDsgdGhlbgorICAgIGVjaG8gImZhaWxlZCB0byBjb25maWd1cmUgJExJQiIKKyAgICBleGl0IDEKKyAgZmkKK2RvbmUKKyRNQUtFUFJPRyAtajMKK2NwYWNrCitjdGVzdCAtVlYgLUUgIihweXRob25fdGVzdCkiCisjIGRpc2FibGVkIGNtYWtlIHB5dGhvbl90ZXN0IGZvciBub3cgc2luY2UgaXQgZmFpbHMgaW4gdHJhdmlzIHVuZGVyIGNlbnRvcwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NvdnNjYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2IzZjI4MwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NvdnNjYW4uc2gKQEAgLTAsMCArMSw1MCBAQAorIworIyBDb3Zlcml0eSBTY2FuIFRyYXZpcyBidWlsZCBzY3JpcHQKKyMgVG8gcnVuIHRoaXMgaW50ZXJhY3RpdmVseSwgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgeW91cnNlbGYsCisjIGFuZCBydW4gdGhpcyBpbnNpZGUgYSBkb2NrZXIgY29udGFpbmVyLgorIworIyBDb21tYW5kLUxpbmUgQXJndW1lbnRzCisjCisjIC0tc2tpcGRvd25sb2FkICAgdG8gc2tpcCByZS1kb3dubG9hZGluZyB0aGUgQ292ZXJpdHkgU2NhbiBidWlsZCBwYWNrYWdlIChsYXJnZSkKKyMKKyMgRW52aXJvbm1lbnQgVmFyaWFibGVzIChyZXF1aXJlZCkKKyMKKyMgQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwgIC0gZW1haWwgYWRkcmVzcyB0byBub3RpZnkKKyMgQ09WRVJJVFlfU0NBTl9UT0tFTiAgICAgICAgICAgICAgIC0gdGhlIENvdmVyaXR5IFNjYW4gdG9rZW4gKHNob3VsZCBiZSBzZWN1cmUpCisjCisjIEVudmlyb25tZW50IFZhcmlhYmxlcyAoZGVmYXVsdGVkKQorIworIyBDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQgICAgICAgLSBkZWZhdWx0cyB0byAiYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoIgorIyBDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OICAgICAgICAgLSBkZWZhdWx0cyB0byBUUkFWSVNfQlJBTkNIIG9yICJtYXN0ZXIiIGlmIGVtcHR5CisjIENPVkVSSVRZX1NDQU5fUFJPSkVDVCAgICAgICAgICAgICAtIGRlZmF1bHRzIHRvICJ0aHJpZnQiCisKK3NldCAtZXgKKworQ09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5EPSR7Q09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5EOi1idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2h9CitDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OPSR7Q09WRVJJVFlfU0NBTl9ERVNDUklQVElPTjotJHtUUkFWSVNfQlJBTkNIOi1tYXN0ZXJ9fQorQ09WRVJJVFlfU0NBTl9QUk9KRUNUPSR7Q09WRVJJVFlfU0NBTl9QUk9KRUNUOi10aHJpZnR9CisKKyMgZG93bmxvYWQgdGhlIGNvdmVyaXR5IHNjYW4gcGFja2FnZQorCitwdXNoZCAvdG1wCitpZiBbWyAiJDEiICE9ICItLXNraXBkb3dubG9hZCIgXV07IHRoZW4KKyAgcm0gLXJmIGNvdmVyaXR5X3Rvb2wudGd6IGNvdi1hbmFseXNpcyoKKyAgd2dldCBodHRwczovL3NjYW4uY292ZXJpdHkuY29tL2Rvd25sb2FkL2xpbnV4NjQgLS1wb3N0LWRhdGEgInRva2VuPSRDT1ZFUklUWV9TQ0FOX1RPS0VOJnByb2plY3Q9JENPVkVSSVRZX1NDQU5fUFJPSkVDVCIgLU8gY292ZXJpdHlfdG9vbC50Z3oKKyAgdGFyIHh6ZiBjb3Zlcml0eV90b29sLnRnegorZmkKK0NPVkJJTj0kKGVjaG8gJChwd2QpL2Nvdi1hbmFseXNpcyovYmluKQorZXhwb3J0IFBBVEg9JENPVkJJTjokUEFUSAorcG9wZAorCisjIGJ1aWxkIHRoZSBwcm9qZWN0IHdpdGggY292ZXJpdHkgc2NhbgorCitybSAtcmYgY292LWludC8KK2Nvdi1idWlsZCAtLWRpciBjb3YtaW50ICRDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQKK3RhciBjSmYgY292LWludC50YXIueHogY292LWludC8KK2N1cmwgLS1mb3JtIHRva2VuPSIkQ09WRVJJVFlfU0NBTl9UT0tFTiIgXAorICAgICAtLWZvcm0gZW1haWw9IiRDT1ZFUklUWV9TQ0FOX05PVElGSUNBVElPTl9FTUFJTCIgXAorICAgICAtLWZvcm0gZmlsZT1AY292LWludC50YXIueHogXAorICAgICAtLWZvcm0gdmVyc2lvbj0iJChnaXQgZGVzY3JpYmUgLS10YWdzKSIgXAorICAgICAtLWZvcm0gZGVzY3JpcHRpb249IiRDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OIiBcCisgICAgIGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vYnVpbGRzP3Byb2plY3Q9IiRDT1ZFUklUWV9TQ0FOX1BST0pFQ1QiCisKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jcm9zcy10ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzNTgxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jcm9zcy10ZXN0LnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCisuL2Jvb3RzdHJhcC5zaAorLi9jb25maWd1cmUgLS1lbmFibGUtdHV0b3JpYWw9bm8KK21ha2UgLWozIHByZWNyb3NzCisKK3NldCArZQorbWFrZSBjcm9zcyQxCisKK1JFVD0kPworaWYgWyAkUkVUIC1uZSAwIF07IHRoZW4KKyAgY2F0IHRlc3QvbG9nL3VuZXhwZWN0ZWRfZmFpbHVyZXMubG9nCitmaQorCitleGl0ICRSRVQKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9kcGtnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiYTBjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9kcGtnLnNoCkBAIC0wLDAgKzEsNSBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKK2Rwa2ctYnVpbGRwYWNrYWdlIC10YyAtdXMgLXVjCitscyAtYWwgLi4KZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL21ha2UtZGlzdC5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL21ha2UtZGlzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YTM2ODFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoCkBAIC0wLDAgKzEsOSBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKKy4vYm9vdHN0cmFwLnNoCisuL2NvbmZpZ3VyZSAkKgorbWFrZSBkaXN0Cit0YXIgeHZmIHRocmlmdC0qLnRhci5negorY2QgdGhyaWZ0LSoKKy4vYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2gKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL3NjYS5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3NjYS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNmQ1ODI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoCkBAIC0wLDAgKzEsNjYgQEAKKyMhL2Jpbi9iYXNoCitzZXQgLWV2CisKKyMKKyMgR2VuZXJhdGUgdGhyaWZ0IGZpbGVzIHNvIHRoZSBzdGF0aWMgY29kZSBhbmFseXNpcyBpbmNsdWRlcyBhbiBhbmFseXNpcworIyBvZiB0aGUgZmlsZXMgdGhlIHRocmlmdCBjb21waWxlciBzcGl0cyBvdXQuICBJZiBydW5uaW5nIGludGVyYWN0aXZlbHkKKyMgc2V0IHRoZSBOT0JVSUxEIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNraXAgdGhlIGJvb3QvY29uZmlnL21ha2UgcGhhc2UuCisjCisKK2lmIFtbIC16ICIkTk9CVUlMRCIgXV07IHRoZW4KKyAgLi9ib290c3RyYXAuc2gKKyAgLi9jb25maWd1cmUgLS1lbmFibGUtdHV0b3JpYWw9bm8KKyAgbWFrZSAtajMgcHJlY3Jvc3MKK2ZpCisKKyMKKyMgQy9DKysgc3RhdGljIGNvZGUgYW5hbHlzaXMgd2l0aCBjcHBjaGVjaworIyBhZGQgLS1lcnJvci1leGl0Y29kZT0xIHRvIC0tZW5hYmxlPWFsbCBhcyBzb29uIGFzIGV2ZXJ5dGhpbmcgaXMgZml4ZWQKKyMKKyMgUHl0aG9uIGNvZGUgc3R5bGUgY2hlY2sgd2l0aCBmbGFrZTgKKyMKKyMgc2VhcmNoIGZvciBUT0RPIGV0YyB3aXRoaW4gc291cmNlIHRyZWUKKyMgc29tZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjb2RlIGJhc2UKKyMgc29tZSBpbmZvIGFib3V0IHRoZSBidWlsZCBtYWNoaW5lCisKKyMgQ29tcGlsZXIgY3BwY2hlY2sgKEFsbCkKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGNvbXBpbGVyL2NwcC9zcmMKKworIyBDKysgY3BwY2hlY2sgKEFsbCkKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGxpYi9jcHAvc3JjIGxpYi9jcHAvdGVzdCB0ZXN0L2NwcCB0dXRvcmlhbC9jcHAKKworIyBDIEdsaWIgY3BwY2hlY2sgKEFsbCkKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGxpYi9jX2dsaWIvc3JjIGxpYi9jX2dsaWIvdGVzdCB0ZXN0L2NfZ2xpYi9zcmMgdHV0b3JpYWwvY19nbGliCisKKyMgU2lsZW50IGVycm9yIGNoZWNrcworIyBTZWUgVEhSSUZULTQzNzEgOiBmbGV4IGdlbmVyYXRlZCBjb2RlIHRyaWdnZXJzICJwb3NzaWJsZSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UiIGluIHl5X2luaXRfYnVmZmVyCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1zdXBwcmVzcz0iKjp0aHJpZnQvdGhyaWZ0bC5jYyIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBjb21waWxlci9jcHAvc3JjCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBsaWIvY3BwL3NyYyBsaWIvY3BwL3Rlc3QgdGVzdC9jcHAgdHV0b3JpYWwvY3BwCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBsaWIvY19nbGliL3NyYyBsaWIvY19nbGliL3Rlc3QgdGVzdC9jX2dsaWIvc3JjIHR1dG9yaWFsL2NfZ2xpYgorCisjIFB5dGhvbiBjb2RlIHN0eWxlCitmbGFrZTggLS1pZ25vcmU9VzUwNCxFNTAxIGxpYi9weQorZmxha2U4IC0tZXhjbHVkZT10dXRvcmlhbC9weS9idWlsZCB0dXRvcmlhbC9weQorIyBUSFJJRlQtNDM3MSA6IGdlbmVyYXRlZCBmaWxlcyBhcmUgZXhjbHVkZWQgYmVjYXVzZSB0aGV5IGhhdmVuJ3QgYmVlbiBzY3J1YmJlZCB5ZXQKK2ZsYWtlOCAtLWlnbm9yZT1FNTAxIC0tZXhjbHVkZT0iKi9nZW4tcHkqLyoiLHRlc3QvcHkvYnVpbGQgdGVzdC9weQorZmxha2U4IHRlc3QvcHkudHdpc3RlZAorZmxha2U4IHRlc3QvcHkudG9ybmFkbworZmxha2U4IC0taWdub3JlPUU1MDEgdGVzdC90ZXN0LnB5CitmbGFrZTggLS1pZ25vcmU9RTUwMSxFNzIyIHRlc3QvY3Jvc3NydW5uZXIKK2ZsYWtlOCB0ZXN0L2ZlYXR1cmVzCisKKyMgUEhQIGNvZGUgc3R5bGUKK2NvbXBvc2VyIGluc3RhbGwgLS1xdWlldAorLi92ZW5kb3IvYmluL3BocGNzCisKKyMgVE9ETyBldGMKK2VjaG8gRklYTUVzOiBgZ3JlcCAtciBGSVhNRSAqIHwgd2MgLWxgCitlY2hvICBIQUNLczogYGdyZXAgLXIgSEFDSyAqIHwgd2MgLWxgCitlY2hvICBUT0RPczogYGdyZXAgLXIgVE9ETyAqIHwgd2MgLWxgCisKKyMgTG9DCitzbG9jY291bnQgLgorCisjIFN5c3RlbSBJbmZvCitkcGtnIC1sCit1bmFtZSAtYQpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvdWJzYW4uc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy91YnNhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NTBkYmEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvdWJzYW4uc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL3NoCisKK3NldCAtZQorCisjIFdyYXBzIGF1dG90b29scy5zaCwgYnV0IGVhY2ggYmluYXJ5IGNyYXNoZXMgaWYgaXQgZXhoaWJpdHMgdW5kZWZpbmVkIGJlaGF2aW9yLiAKKyMgU2V0IHRoZSB1bmRlZmluZWQgYmVoYXZpb3IgZmxhZ3MuIFRoaXMgY3Jhc2hlcyBvbiBhbGwgdW5kZWZpbmVkIGJlaGF2aW9yIGV4Y2VwdCBmb3IKKyMgdW5kZWZpbmVkIGNhc3RpbmcsIGFrYSAidnB0ciIuCisjIFRPRE86IGZpeCB1bmRlZmluZWQgdnB0ciBiZWhhdmlvciBhbmQgdHVybiB0aGlzIG9wdGlvbiBiYWNrIG9uLgorCitleHBvcnQgQ0ZMQUdTPSItZnNhbml0aXplPXVuZGVmaW5lZCAtZm5vLXNhbml0aXplLXJlY292ZXI9dW5kZWZpbmVkIC1PMCAtZ2dkYjMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIiCitleHBvcnQgQ1hYRkxBR1M9IiR7Q0ZMQUdTfSIKK2V4cG9ydCBMREZMQUdTPSItbHVic2FuIgorZXhwb3J0IFVCU0FOX09QVElPTlM9cHJpbnRfc3RhY2t0cmFjZT0xCisKKyMKKyMgd29yayBhcm91bmQgaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMxMC90aWNrZXQvMTE2MzIgaWYgcHJlc2VudAorIworCitzZWQgLWkgJ3MvLCBzdHJlYW1fdChyZGJ1ZigpKSAvLCBzdHJlYW1fdChwYmFzZV90eXBlOjptZW1iZXIuZ2V0KCkpL2cnIC91c3IvaW5jbHVkZS9ib29zdC9mb3JtYXQvYWx0X3NzdHJlYW0uaHBwCisKKyMgbGx2bS1zeW1ib2xpemVyIG11c3QgYmUgb24gUEFUSCB0byBnZXQgYSBzdGFjayB0cmFjZSBvbiBlcnJvcgorCitDTEFOR19QQVRIPSIkKG1rdGVtcCAtZCkiCit0cmFwICJybSAtcmYgJHtDTEFOR19QQVRIfSIgRVhJVAorbG4gLXMgIiQod2hlcmVpcyBsbHZtLXN5bWJvbGl6ZXItNC4wICB8IHJldiB8IGN1dCAtZCAnICcgLWYgMSB8IHJldikiIFwKKyAgIiR7Q0xBTkdfUEFUSH0vbGx2bS1zeW1ib2xpemVyIgorZXhwb3J0IFBBVEg9IiR7Q0xBTkdfUEFUSH06JHtQQVRIfSIKK2xsdm0tc3ltYm9saXplciAtdmVyc2lvbgorCitidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2ggJCoKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTg0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjcwIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBBcnRmdWwKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBBcnRmdWwgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gY3BwOiBzdG9jayBib29zdCAxLjYyIGluIGFydGZ1bCBoYXMgYSBuYXN0eSBidWcgc28gd2UgdXNlIHN0b2NrIGJvb3N0IDEuNjMKKyMgLSBkOiBkbWQgZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUuIFBpbm5lZCB0byBsYXN0IDEueCByZWxlYXNlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gaGF4ZTogdmVyc2lvbiAzLjQuMiB0aGF0IGNvbWVzIHdpdGggVWJ1bnR1IGNvcmVzIGluIG91ciBDSSBidWlsZAorIyAtIGdvOiBhcnRmdWwgY29tZXMgd2l0aCAxLjksIHdlIHdhbnQgdGhlIGxhdGVzdCAoc3VwcG9ydGVkKQorIyAtIG5vZGVqczogd2FudCB2OCwgYXJ0ZnVsIGNvbWVzIHdpdGggdjYKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczphcnRmdWwtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykgLSBpZiB3ZSBldmVyIHdhbnQgYSBsYXRlciB2ZXJzaW9uCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CitFTlYgREFSVF9WRVJTSU9OIDEuMjQuMy0xCisKKyMgZG90bmV0IChuZXRjb3JlKQorUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIGVjaG8gImRlYiBbYXJjaD1hbWQ2NF0gaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL3JlcG9zL21pY3Jvc29mdC11YnVudHUtYXJ0ZnVsLXByb2QgYXJ0ZnVsIG1haW4iID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG90bmV0ZGV2Lmxpc3QKKworIyBoYXhlIChodHRwczovL2hheGUub3JnL2Rvd25sb2FkL2xpbnV4LykKK1JVTiBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOmhheGUvcmVsZWFzZXMgLXkKKworIyBub2RlLmpzCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UuZ3BnLmtleSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGVjaG8gImRlYiBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlXzgueCBhcnRmdWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0CisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworIyBib29zdC0xLjYyIGhhcyBhIHRlcnJpYmxlIGJ1ZyBpbiBib29zdDo6dGVzdCwgc2VlIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzEyNTA3CitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0MS42My1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIFNCQ0xfVkVSU0lPTiAxLjQuNQorUlVOIFwKK2AjIENvbW1vbiBMaXNwIChzYmNsKSBkZXBlbmRlbmNpZXNgIFwKKyAgICBjdXJsIC0tdmVyc2lvbiAmJiBcCisgICAgY3VybCAtTyAtSiAtTCBodHRwczovL2tlbnQuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2JjbC9zYmNsLyR7U0JDTF9WRVJTSU9OfS9zYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIHRhciB4amYgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyICYmIFwKKyAgICBjZCBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXggJiYgXAorICAgIC4vaW5zdGFsbC5zaCAmJiBcCisgICAgc2JjbCAtLXZlcnNpb24gJiYgXAorICAgIHJtIC1yZiBzYmNsKgorCitFTlYgRF9WRVJTSU9OICAgICAyLjA4MC4wCitFTlYgRE1EX0RFQiAgICAgICBkbWRfMi4wODAuMC0wX2FtZDY0LmRlYgorUlVOIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgd2dldCAtcSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvJHtEX1ZFUlNJT059LyR7RE1EX0RFQn0gJiYgXAorICAgIGRwa2cgLS1pbnN0YWxsICR7RE1EX0RFQn0gJiYgXAorICAgIHJtIC1mICR7RE1EX0RFQn0gJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBvcGVuc3NsLW1hc3RlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGAjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PSREQVJUX1ZFUlNJT04KK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkb3RuZXQtc2RrLTIuMS40CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuMTAKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGI1YTY0MzM1ZjE0OTAyNzdiNTg1ODMyZDFmNmM3ZjhjNmMxMTIwNmNiYTVjZDNmNzcxZGNiODdiOThhZDFhMzMKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICAgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgICAgICAgICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwIDI+JjEgPiAvZGV2L251bGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMhCisjIG5lZWQgdG8gdXBkYXRlIG91ciBsdWFzb2NrZXQgY29kZSwgbHVhIGRvZXNuJ3QgaGF2ZSBsdWFMX29wZW5saWIgYW55IG1vcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtY2xpIFwKKyAgICAgIHBocC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSAmJiBcCisgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbjMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFN0YXRpYyBDb2RlIEFuYWx5c2lzIGRlcGVuZGVuY2llc2AgXAorICAgICAgY3BwY2hlY2sgXAorICAgICAgc2xvY2NvdW50ICYmIFwKKyAgICBwaXAgaW5zdGFsbCBmbGFrZTgKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci91YnVudHUtYmlvbmljL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjOTlhOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci91YnVudHUtYmlvbmljL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNzkgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IEJpb25pYworIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IEJpb25pYyBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBjbDogd2FudCBsYXRlc3QKKyMgLSBkOiBkbWQgZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUuIFBpbm5lZCB0byBsYXN0IDEueCByZWxlYXNlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZ286IHdhbnQgbGF0ZXN0CisjIC0gbm9kZWpzOiB3YW50IHY4LCBiaW9uaWMgY29tZXMgd2l0aCB2NgorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOmJpb25pYy1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZGlybW5nciBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgY3NoYXJwIChtb25vKSAtIGlmIHdlIGV2ZXIgd2FudCBhIGxhdGVyIHZlcnNpb24KKyMgUlVOIGVjaG8gImRlYiBodHRwOi8vZG93bmxvYWQubW9uby1wcm9qZWN0LmNvbS9yZXBvL2RlYmlhbiB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbW9uby5saXN0ICYmIFwKKyMgICAgIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEE2QTE5QjM4RDNEODMxRUYKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKK0VOViBEQVJUX1ZFUlNJT04gMS4yNC4zLTEKKworIyBkb3RuZXQgKG5ldGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgd2dldCAtcSAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9taWNyb3NvZnQtcHJvZC5saXN0IGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9jb25maWcvdWJ1bnR1LzE4LjA0L3Byb2QubGlzdCAmJiBcCisgICAgY2hvd24gcm9vdDpyb290IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgY2hvd24gcm9vdDpyb290IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21pY3Jvc29mdC1wcm9kLmxpc3QKKworIyBub2RlLmpzCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UuZ3BnLmtleSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGVjaG8gImRlYiBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlXzgueCBiaW9uaWMgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0CisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTYuMC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIFNCQ0xfVkVSU0lPTiAxLjQuMTUKK1JVTiBcCitgIyBDb21tb24gTGlzcCAoc2JjbCkgZGVwZW5kZW5jaWVzYCBcCisgICAgY3VybCAtLXZlcnNpb24gJiYgXAorICAgIGN1cmwgLW8gc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyIC1KIC1MIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3NiY2wvZmlsZXMvc2JjbC8ke1NCQ0xfVkVSU0lPTn0vc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyL2Rvd25sb2FkP3VzZV9taXJyb3I9bWFuYWdlZHdheSMgJiYgXAorICAgIHRhciB4amYgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyICYmIFwKKyAgICBjZCBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXggJiYgXAorICAgIC4vaW5zdGFsbC5zaCAmJiBcCisgICAgc2JjbCAtLXZlcnNpb24gJiYgXAorICAgIGNkIC4uICYmIFwKKyAgICBybSAtcmYgc2JjbCoKKworRU5WIERfVkVSU0lPTiAgICAgMi4wODMuMQorRU5WIERNRF9ERUIgICAgICAgZG1kXzIuMDgzLjEtMF9hbWQ2NC5kZWIKK1JVTiBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgIHdnZXQgLXEgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LyR7RF9WRVJTSU9OfS8ke0RNRF9ERUJ9ICYmIFwKKyAgICBkcGtnIC0taW5zdGFsbCAke0RNRF9ERUJ9ICYmIFwKKyAgICBybSAtZiAke0RNRF9ERUJ9ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgZ2l0IGNsb25lIC1iICd2Mi4wLjIrMi4wLjE2JyBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQuZ2l0IGRlaW1vcy1saWJldmVudC0yLjAgJiYgXAorICAgIG12IGRlaW1vcy1saWJldmVudC0yLjAvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgZGVpbW9zLWxpYmV2ZW50LTIuMC9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBkZWltb3MtbGliZXZlbnQtMi4wICYmIFwKKyAgICBnaXQgY2xvbmUgLWIgJ3YyLjAuMCsxLjEuMGgnIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsLmdpdCBkZWltb3Mtb3BlbnNzbC0xLjEuMGggJiYgXAorICAgIG12IGRlaW1vcy1vcGVuc3NsLTEuMS4waC9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBkZWltb3Mtb3BlbnNzbC0xLjEuMGgvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgZGVpbW9zLW9wZW5zc2wtMS4xLjBoCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4yCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuMTEuNAorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgZmIyNmMzMGU2YTA0YWQ5MzdiYmM2NTdhMWI1YmJhOTJmODAwOTZhZjFlOGVlNmRhNjQzMGMwNDVhOGRiM2E1YgorUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgICAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICAgICAgICAgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICBybSBnb2xhbmcudGFyLmd6CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMj4mMSA+IC9kZXYvbnVsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4gJiYgXAorICAgIHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1zZXQgamF2YSAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQvanJlL2Jpbi9qYXZhCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMhCisjIG5lZWQgdG8gdXBkYXRlIG91ciBsdWFzb2NrZXQgY29kZSwgbHVhIGRvZXNuJ3QgaGF2ZSBsdWFMX29wZW5saWIgYW55IG1vcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtY2xpIFwKKyAgICAgIHBocC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSAmJiBcCisgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbjMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCisjIFN3aWZ0IG9uIExpbnV4IGZvciBjcm9zcyB0ZXN0cworUlVOIGNkIC8gJiYgXAorICAgIHdnZXQgLS1xdWlldCBodHRwczovL3N3aWZ0Lm9yZy9idWlsZHMvc3dpZnQtNC4yLjEtcmVsZWFzZS91YnVudHUxODA0L3N3aWZ0LTQuMi4xLVJFTEVBU0Uvc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogJiYgXAorICAgIHRhciB4ZiBzd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAtLXN0cmlwLWNvbXBvbmVudHM9MSAmJiBcCisgICAgcm0gc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogJiYgXAorICAgIHN3aWZ0IC0tdmVyc2lvbgorCisjIGNwcGNoZWNrLTEuODIgaGFzIGEgbmFzdHkgY3BwIHBhcnNlciBidWcsIHNvIHdlJ3JlIHVzaW5nIHNvbWV0aGluZyBuZXdlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4ICYmIFwKKyAgICB3Z2V0IC1xICJodHRwczovL2xhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvY3BwY2hlY2svMS44My0yLytidWlsZC8xNDg3NDcwMy8rZmlsZXMvY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYiIgJiYgXAorICAgIGRwa2cgLWkgY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYiAmJiBcCisgICAgcm0gY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYgorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzcyYjRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI3MSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgWGVuaWFsCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgWGVuaWFsIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAyLjA3NS4xIGZvciBjb3ZlcmFnZQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAxLjIyLjEgZm9yIGNvdmVyYWdlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZ286IFhlbmlhbCBjb21lcyB3aXRoIDEuNiwgYnV0IHdlIG5lZWQgMS43IG9yIGxhdGVyCisjIC0gbm9kZWpzOiBYZW5pYWwgY29tZXMgd2l0aCA0LjIuNiB3aGljaCBleGl0cyBMVFMgQXByaWwgMjAxOCwgc28gd2UncmUgaW5zdGFsbGluZyA2LngKKyMgLSBvY2FtbDogY2F1c2VzIHN0YWNrIG92ZXJmbG93IGVycm9yLCBqdXN0IHN0YXJ0ZWQgTWFyY2ggMjAxOCBub3Qgc3VyZSB3aHkKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczp4ZW5pYWwtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBjc2hhcnAgKG1vbm8pCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRAorUlVOIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEVCQ0Y5NzVFNUJBMjRENUUgJiYgXAorICAgIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QgJiYgXAorICAgIHdnZXQgLXFPIC0gaHR0cHM6Ly9kbGFuZy5vcmcvZC1rZXlyaW5nLmdwZyB8IGFwdC1rZXkgYWRkIC0KKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKK0VOViBEQVJUX1ZFUlNJT04gMS4yMi4xLTEKKworIyBkb3RuZXQgKGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS14ZW5pYWwtcHJvZCB4ZW5pYWwgbWFpbiIgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfNi54IHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tMy44L2JpbjokUEFUSAorCisjIyMgbGFuZ3VhZ2VzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAorICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC10ZXN0LWRldiBcCisgICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIERfVkVSU0lPTiAyLjA3NS4xLTAKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1hbGxvdy11bmF1dGhlbnRpY2F0ZWQgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW49JERfVkVSU0lPTiBcCisgICAgICBsaWJwaG9ib3MyLWRldj0kRF9WRVJTSU9OIFwKKyAgICAgIGR1Yj0xLjYuMC0wIFwKKyAgICAgIGRmbXQgXAorICAgICAgZHNjYW5uZXIgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgeGRnLXV0aWxzCitSVU4gbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvdjEuMS42KzEuMC4xZy50YXIuZ3ogfCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtMS4xLjYtMS4wLjFnL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtMS4xLjYtMS4wLjFnL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtMS4xLjYtMS4wLjFnCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4xLjQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS43LjYKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGFkNTgwOGJmNDJiMDE0YzIyZGQ3NjQ2NDU4ZjYzMTM4NTAwMzA0OWRlZDBiYjZhZjJlZmM3ZjFmNzlmYTI5ZWEKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgcm0gZ29sYW5nLnRhci5negorCisjIGR1ZSB0byBhIGJ1ZyBpbiBjYWJhbCBpbiB4ZW5pYWwgKGNhYmFsLWluc3RhbGwgcGFja2FnZSkgd2UgcHVsbCBpbiBhbm90aGVyOgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjICYmIFwKKyAgICBjZCAvdG1wICYmIFwKKyAgICB3Z2V0IC1xIGh0dHBzOi8vd3d3Lmhhc2tlbGwub3JnL2NhYmFsL3JlbGVhc2UvY2FiYWwtaW5zdGFsbC0xLjI0LjAuMi9jYWJhbC1pbnN0YWxsLTEuMjQuMC4yLXg4Nl82NC11bmtub3duLWxpbnV4LnRhci5neiAmJiBcCisgICAgdGFyIHh6ZiBjYWJhbC1pbnN0YWxsLTEuMjQuMC4yLXg4Nl82NC11bmtub3duLWxpbnV4LnRhci5neiAmJiBcCisgICAgZmluZCBkaXN0LW5ld3N0eWxlLyAtdHlwZSBmIC1uYW1lIGNhYmFsIC1leGVjIG12IHt9IC91c3IvYmluIFw7ICYmIFwKKyAgICBybSAtcmYgL3RtcC9jYWJhbCogJiYgXAorICAgIGNhYmFsIC0tdmVyc2lvbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgXAorICAgICAgbGlibmVrbzAgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwIDMuNC42NCAyPiYxID4gL2Rldi9udWxsCisjIG5vdGU6IGh4Y3BwIDMuNC4xODUgKGxhdGVzdCkgbm8gbG9uZ2VyIHNoaXBzIHN0YXRpYyBsaWJyYXJpZXMsIGFuZCBjYXVzZWQgYSBidWlsZCBmYWlsdXJlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIHNvIHN0aWNrIHdpdGggNS4yIGhlcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMSBcCisgICAgICBsaWJhdGstYnJpZGdlMi4wLTAgXAorICAgICAgbGliZ3RrLTMtMAorCisjIFRIUklGVC00NTE3OiBjYXVzZXMgc3RhY2sgb3ZlcmZsb3dzOyB2ZXJzaW9uIHRvbyBvbGQ7IHNraXAgb2NhbWwgaW4geGVuaWFsCisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgb2NhbWwgXAorIyAgICAgICBvcGFtICYmIFwKKyMgICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisjICAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDcuMCBcCisgICAgICBwaHA3LjAtY2xpIFwKKyAgICAgIHBocDcuMC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWJhY2twb3J0cy5zc2wtbWF0Y2gtaG9zdG5hbWUgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBET1RORVRfQ0xJX1RFTEVNRVRSWV9PUFRPVVQgMQorRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9maXhjaGFuZ2VzLnNoIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzU3YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApAQCAtMCwwICsxLDM5IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgZml4Y2hhbmdlcyB3aWxsIHRha2UgYSBmaWxlIGFzIGlucHV0IGFuZCBsb29rIGZvciB0ZXh0IG1hdGNoaW5nCisjIHRoZSBwYXR0ZXJuIFtUSFJJRlQtbm5ubl0gKHRoZSBudW1iZXIgb2YgZGlnaXRzIGlzIG5vdCBpbXBvcnRhbnQpCisjIHdoaWNoIGlzIG5vdCBhIG1hcmtkb3duIGxpbmssIGFuZCBjaGFuZ2UgaXQgdG8gYmUgYSBtYXJrZG93biBsaW5rLgorIyBUaGUgdG9vbCB3cml0ZXMgdG8gc3Rkb3V0IHNvIHlvdSBjYW4gcmVkaXJlY3QgaXQgdG8gYSB0ZW1wb3JhcnkKKyMgZmlsZSBhbmQgdGhlbiBjb21wYXJlIGFnYWluc3QgdGhlIG9yaWdpbmFsIGZpbGUgYmVmb3JlIHJlcGxhY2luZworIyBpdC4KKyMKKyMgVGhpcyB0b29sIHdhcyBkZXZlbG9wZWQgYWZ0ZXIgdGhlIDAuMTIuMCByZWxlYXNlIHRvIGFzc2lzdCB3aXRoCisjIGdlbmVyYXRpb24gb2YgQ0hBTkdFUy5tZCBjb250ZW50LgorIworCit3aGlsZSBJRlM9JycgcmVhZCAtciBsaW5lIHx8IFtbIC1uICIkbGluZSIgXV07IGRvCisgICAgaWYgW1sgIiRsaW5lIiA9fiBeKC4qKVxbKFRIUklGVC1bWzpkaWdpdDpdXSspXF1bXlwoXSguKikkIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIiR7QkFTSF9SRU1BVENIWzFdfVske0JBU0hfUkVNQVRDSFsyXX1dKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvJHtCQVNIX1JFTUFUQ0hbMl19KSAke0JBU0hfUkVNQVRDSFszXX0iCisgICAgZWxzZQorICAgICAgICBlY2hvICIkbGluZSIKKyAgICBmaQorZG9uZSA8ICIkMSIKZGlmZiAtLWdpdCBhL2J1aWxkL3ZlcmFsaWduLnNoIGIvYnVpbGQvdmVyYWxpZ24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjE3NDRiNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3ZlcmFsaWduLnNoCkBAIC0wLDAgKzEsMzEzIEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBUaGUgdmVyYWxpZ24gc2NyaXB0IHNldHMgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb25zIGluIGFsbCBvZgorIyB0aGUgcGFja2FnZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBhbGwgb2YgdGhlIHN1cHBvcnRlZAorIyBsYW5ndWFnZXMuICBJdCBpcyB1c2VkIHRvIHByZXBhcmUgYSByZWxlYXNlIG9yIG1vdmUgbWFzdGVyCisjIGZvcndhcmQgdG8gdGhlIG5leHQgYW50aWNpcGF0ZWQgdmVyc2lvbi4KKyMKKyMgVVNBR0UKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdXNhZ2U6IHZlcmFsaWduLnNoIDxvbGRWZXJzaW9uPiA8bmV3VmVyc2lvbj4KKyMKKyMgRVhBTVBMRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAkIC4vdmVyYWxpZ24uc2ggMC4xMi4wIDEuMC4wCisjICQgLi92ZXJhbGlnbi5zaCAxLjAuMCAxLjEuMAorIworIyBJTVBPUlRBTlQgVVNBR0UgTk9URQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIERSWVJVTiB0byBoYXZlIHRoZSBzY3JpcHQKKyMgcHJpbnQgb3V0IGFsbCBtYXRjaGVzIHRvIHRoZSBvbGRWZXJzaW9uIGhpbGlnaHRlZCBzbyB0aGF0CisjIHlvdSBjYW4gdmVyaWZ5IGl0IHdpbGwgY2hhbmdlIHRoZSByaWdodCB0aGluZ3MuCisjCisKK2RlY2xhcmUgLUEgRklMRVMKKworIyBUaGVzZSBmaWxlcyByZXF1aXJlIGEgbWFudWFsIHRvdWNoOgorRklMRVNbQ0hBTkdFUy5tZF09bWFudWFsCitGSUxFU1tkZWJpYW4vY2hhbmdlbG9nXT1tYW51YWwKK0ZJTEVTW2RvYXAucmRmXT1tYW51YWwKKworIyBUaGVzZSBmaWxlcyBjYW4gYmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5OgorRklMRVNbQXBhY2hlVGhyaWZ0Lm51c3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbVGhyaWZ0LXN3aWZ0My5wb2RzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tUaHJpZnQucG9kc3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbYXBwdmV5b3IueW1sXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tib3dlci5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZV09c2ltcGxlUmVwbGFjZQorRklMRVNbY29uZmlndXJlLmFjXT1jb25maWd1cmVSZXBsYWNlCitGSUxFU1tjb250cmliL3RocmlmdC5zcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY29jb2Evc3JjL1RocmlmdC5oXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvZGFydC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1tsaWIvZGVscGhpL3NyYy9UaHJpZnQucGFzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyY109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2hheGUvaGF4ZWxpYi5qc29uXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvaHMvdGhyaWZ0LmNhYmFsXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvamF2YS9ncmFkbGUucHJvcGVydGllc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2pzL3BhY2thZ2UuanNvbl09anNvblJlcGxhY2UKK0ZJTEVTW2xpYi9qcy9zcmMvdGhyaWZ0LmpzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbHVhL1RocmlmdC5sdWFdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvb2NhbWwvX29hc2lzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcGVybC9saWIvVGhyaWZ0LnBtXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcHkvc2V0dXAucHldPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9yYi90aHJpZnQuZ2Vtc3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3JzL0NhcmdvLnRvbWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9zdC9wYWNrYWdlLnhtbF09c2ltcGxlUmVwbGFjZQorRklMRVNbcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyY109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sXT1wdWJzcGVjUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9vY2FtbC9fb2FzaXNdPXNpbXBsZVJlcGxhY2UKKworaWYgWyAhIC1mICJDSEFOR0VTIiBdOyB0aGVuCisgICAgPiYyIGVjaG8gImVycm9yOiBydW4gdmVyYWxpZ24uc2ggd2hpbGUgaW4gdGhlIHRocmlmdCByb290IGRpcmVjdG9yeSIKKyAgICBleGl0IDEKK2ZpCisKK2lmIFsgJCMgLW5lIDIgXTsgdGhlbgorICAgID4mMiBlY2hvICJ1c2FnZTogdmVyYWxpZ24uc2ggPG9sZFZlcnNpb24+IDxuZXdWZXJzaW9uPiIKKyAgICBleGl0IDEKK2ZpCisKK2pxIC0tdmVyc2lvbiAxPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICAgPiYyIGVjaG8gImVycm9yOiB0aGUgJ2pxJyBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQiCisgICAgZXhpdCAxCitmaQorCisjCisjIHZhbGlkYXRlVmVyc2lvbjogY2hlY2sgdGhhdCBhIHZlcnNpb24gbWF0Y2hlcyB0aGUgbWFqb3IubWlub3IucGF0Y2gKKyMgICBmb3JtYXQgd2hpY2ggaXMgdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3Igc3VwcG9ydGVkIGJ5IGFsbAorIyAgIHByb2plY3Qgc3lzdGVtcy4KKyMgXHBhcmFtICQxIHRoZSB2ZXJzaW9uCisjIFxyZXR1cm5zIDAgaWYgdGhlIHZlcnNpb24gaXMgY29tcGxpYW50CisjCitmdW5jdGlvbiB2YWxpZGF0ZVZlcnNpb24KK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCB2YWxpZAorICAgIHZhbGlkPSQoZWNobyAiJDEiIHwgc2VkICcvXltbOmRpZ2l0Ol1dXCtcLltbOmRpZ2l0Ol1dXCtcLltbOmRpZ2l0Ol1dXCskLyF7cTIyfScpCisgICAgcmVzdWx0PSQ/CisgICAgaWYgWyAkcmVzdWx0IC1lcSAyMiBdOyB0aGVuCisgICAgICAgID4mMiBlY2hvICJlcnJvcjogdmVyc2lvbiAnJDEnIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVkIG1ham9yLm1pbm9yLnBhdGNoIGZvcm1hdCIKKyAgICAgICAgcmV0dXJuICR7cmVzdWx0fQorICAgIGZpCit9CisKK09MRFZFUlNJT049JDEKK05FV1ZFUlNJT049JDIKK3ZhbGlkYXRlVmVyc2lvbiAiJHtPTERWRVJTSU9OfSIgfHwgZXhpdCAkPwordmFsaWRhdGVWZXJzaW9uICIke05FV1ZFUlNJT059IiB8fCBleGl0ICQ/CisKKyMKKyMgZXNjYXBlVmVyc2lvbjogZXNjYXBlIHRoZSB2ZXJzaW9uIGZvciB1c2UgYXMgYSBzZWQgc2VhcmNoCisjIFxwYXJhbSAkMSB0aGUgdmVyc2lvbiB0byBlc2NhcGUKKyMgXG91dHB1dCB0aGUgZXNjYXBlZCBzdHJpbmcKKyMgXHJldHVybnMgMAorIyBcZXhhbXBsZSBWRVJTRUFSQ0g9JChlc2NhcGVWZXJzaW9uICJbMS4wLjBdIik7IGVjaG8gJFZFUlNFQVJDSDsgPT4gIlxbMVwuMFwuMFxdIgorIworZnVuY3Rpb24gZXNjYXBlVmVyc2lvbgoreworICAgIGVjaG8gIiQoZWNobyAkMSB8IHNlZCAncy9cLi9cXC4vZycgfCBzZWQgJ3MvXFsvXFxcWy9nJyB8IHNlZCAncy9cXS9cXFxdL2cnKSIKK30KKworIyBTZXQgdXAgdmVyYm9zZSBoaWxpZ2h0aW5nIGlmIHJ1bm5pbmcgaW50ZXJhY3RpdmUKK2lmIFsgIiQodHB1dCBjb2xvcnMpIiAtbmUgMCBdOyB0aGVuCisgICAgcmV2ZXJzZT0kKHRwdXQgcmV2KQorICAgIHJlZD0kKHRwdXQgc2V0YWYgMSkKKyAgICBncmVlbj0kKHRwdXQgc2V0YWYgMikKKyAgICB5ZWxsb3c9JCh0cHV0IHNldGFmIDMpCisgICAgbm9ybWFsPSQodHB1dCBzZ3IwKQorZmkKKworZGVjbGFyZSAtQSBNQU5VQUwKKworIworIyBtYW51YWw6IG5vdGUgdGhhdCB1cGRhdGUgb2Ygc2FpZCBmaWxlIGlzIG1hbnVhbAorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAKKyMKK2Z1bmN0aW9uIG1hbnVhbAoreworICAgIE1BTlVBTFsiJDEiXT0iIgorICAgIHJldHVybiAwCit9CisKKyMKKyMgY29uZmlndXJlUmVwbGFjZTogcmVwbGFjZSB0aGUgQUNfSU5JVCBmaWVsZCBpbiBjb25maWd1cmUuYWMKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24gY29uZmlndXJlUmVwbGFjZQoreworICAgIHJlcGxhY2UgIiQxIiAiW3RocmlmdF0sIFske09MRFZFUlNJT059XSIgIlt0aHJpZnRdLCBbJHtORVdWRVJTSU9OfV0iCit9CisKKyMKKyMganNvblJlcGxhY2U6IHJlcGxhY2UgYSBzcGVjaWZpYyB2ZXJzaW9uIGZpZWxkIGluIGEgSlNPTiBmaWxlCisjICAgbXVzdCBiZSBhIHRvcCBsZXZlbCAidmVyc2lvbiIgZmllbGQgaW4gdGhlIGpzb24gc3RydWN0dXJlCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCisKK2Z1bmN0aW9uIGpzb25SZXBsYWNlCit7CisgICAgbG9jYWwgcmVzdWx0CisgICAgbG9jYWwgb3V0cHV0CisgICAgaWYgWyAhIC16ICIkRFJZUlVOIiBdOyB0aGVuCisgICAgICAgIG91dHB1dD0kKGpxIC1lICIudmVyc2lvbiIgIiQxIikKKyAgICBlbHNlCisgICAgICAgIG91dHB1dD0kKGpxIC1lICIudmVyc2lvbiA9IFwiJHtORVdWRVJTSU9OfVwiIiAiJDEiID4gdG1wLiQkLmpzb24gJiYgbXYgdG1wLiQkLmpzb24gIiQxIikKKyAgICBmaQorICAgIHJlc3VsdD0kPworICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtyZWR9RVJST1Ike25vcm1hbH06IHZlcnNpb24gdGFnIG5vdCBmb3VuZCIgIiQxIiAiJGNvdW50IgorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAxCisgICAgZWxpZiBbICEgLXogIiREUllSVU4iIF07IHRoZW4KKyAgICAgICAgb3V0cHV0PSR7b3V0cHV0JVwifQorICAgICAgICBvdXRwdXQ9JHtvdXRwdXQjXCJ9CisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCBNQVRDSEVTOiAgIHZlcnNpb246IFwiJHtyZXZlcnNlfSR7Z3JlZW59JHtvdXRwdXR9JHtub3JtYWx9XCIiICIkMSIgMQorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAwCisgICAgZmkKKyAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtncmVlbn1PSyR7bm9ybWFsfSIgIiQxIiAxCisgICAgZWNobworICAgIHJldHVybiAwCit9CisKKyMKKyMgcHVic3BlY1JlcGxhY2U6IHJlcGxhY2UgYSBzcGVjaWZpYyB2ZXJzaW9uIGZpZWxkIGluIGEgWUFNTCBmaWxlCisjICAgbXVzdCBiZSBhIHRvcCBsZXZlbCAidmVyc2lvbiIgZmllbGQgaW4gdGhlIHlhbWwgc3RydWN0dXJlCisjICAgZGlkIG5vdCBmaW5kIGEgcGFja2FnZSB0aGF0IHByZXNlcnZlcyBjb21tZW50cyBzbyB0aGlzIGlzCisjICAgc29tZXdoYXQgYnJhaW4tZGVhZCwgYnV0IGl0IGdldHMgdGhlIGpvYiBkb25lCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCisKK2Z1bmN0aW9uIHB1YnNwZWNSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICJ2ZXJzaW9uOiAke09MRFZFUlNJT059IiAidmVyc2lvbjogJHtORVdWRVJTSU9OfSIKK30KKworIworIyByZXBsYWNlOiByZXBsYWNlIG9jY3VycmVuY2VzIG9mIG9uZSBzdHJpbmcgd2l0aCBhbm90aGVyCisjICAgICB0aGUgZmlsZSBzcGVjaWZpZWQgbXVzdCBjb250YWluIHRoZSBvbGQgc3RyaW5nIGF0IGxlYXN0IG9uY2UKKyMgICAgIGluIG9yZGVyIHRvIGJlIHN1Y2Nlc3NmdWwuCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHBhcmFtICQyIHRoZSAib2xkIiBzdHJpbmcgdG8gYmUgcmVwbGFjZWQKKyMgXHBhcmFtICQzIHRoZSAibmV3IiBzdHJpaW5nIHRvIHJlcGxhY2UgaXQgd2l0aAorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKK2Z1bmN0aW9uIHJlcGxhY2UKK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCBvdXRwdXQKKyAgICBsb2NhbCBvbGRTdHJpbmc9IiQyIgorICAgIGxvY2FsIG5ld1N0cmluZz0iJDMiCisgICAgbG9jYWwgb2xkUmVnZXg9JChlc2NhcGVWZXJzaW9uICIke29sZFN0cmluZ30iKQorICAgIGxvY2FsIGNvdW50PSQoZ3JlcCAtRWMgIiR7b2xkUmVnZXh9IiAiJDEiKQorICAgIGxvY2FsIHZlcmJvc2UKKyAgICBpZiBbICRjb3VudCAtZXEgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1OT1QgRk9VTkQke25vcm1hbH06ICR7b2xkU3RyaW5nfSIgIiQxIiAwCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIFsgISAteiAiJERSWVJVTiIgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgTUFUQ0hFUzoiICIkMSIgIiRjb3VudCIKKyAgICAgICAgZWNobworICAgICAgICB3aGlsZSByZWFkIC1yIGxpbmU7IGRvCisgICAgICAgICAgICBlY2hvICIgPiAkKGVjaG8gIiRsaW5lIiB8IHNlZCAicy8ke29sZFJlZ2V4fS8ke3JldmVyc2V9JHtncmVlbn0ke29sZFN0cmluZ30ke25vcm1hbH0vZyIpIgorICAgICAgICBkb25lIDwgPChncmVwIC1FICIke29sZFJlZ2V4fSIgIiQxIikKKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIG91dHB1dD0kKHNlZCAtaSAicy8ke29sZFJlZ2V4fS8ke25ld1N0cmluZ30vZyIgIiQxIikKKyAgICByZXN1bHQ9JD8KKyAgICBpZiBbICRyZXN1bHQgLW5lIDAgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtyZWR9RVJST1Ike25vcm1hbH06ICVzIiAiJDEiICIkY291bnQiICIkb3V0cHV0IgorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAxCisgICAgZmkKKyAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtncmVlbn1PSyR7bm9ybWFsfSIgIiQxIiAiJGNvdW50IgorICAgIGVjaG8KKyAgICByZXR1cm4gMAorfQorCisjCisjIHNpbXBsZVJlcGxhY2U6IHJlcGxhY2Ugb2NjdXJyZW5jZXMgb2YgJHtPTERWRVJTSU9OfSB3aXRoICR7TkVXVkVSU0lPTn0KKyMgICAgIHRoZSBmaWxlIHNwZWNpZmllZCBtdXN0IGNvbnRhaW4gT0xEVkVSU0lPTiBhdCBsZWFzdCBvbmNlCisjICAgICBpbiBvcmRlciB0byBiZSBzdWNjZXNzZnVsLgorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxwYXJhbSAkMiB0aGUgIm9sZCIgc3RyaW5nIHRvIGJlIHJlcGxhY2VkCisjIFxwYXJhbSAkMyB0aGUgIm5ldyIgc3RyaWluZyB0byByZXBsYWNlIGl0IHdpdGgKKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCitmdW5jdGlvbiBzaW1wbGVSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICIke09MRFZFUlNJT059IiAiJHtORVdWRVJTSU9OfSIKK30KKworZWNobyAiIgorZWNobyAiQXBhY2hlIFRocmlmdCBWZXJzaW9uIEFsaWdubWVudCBUb29sIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiIgorZWNobyAiUHJldmlvdXMgVmVyc2lvbjogJHtPTERWRVJTSU9OfSIKK2VjaG8gIiAgICAgTmV3IFZlcnNpb246ICR7TkVXVkVSU0lPTn0iCitlY2hvICIiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIkZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvdW50IHwgU3RhdHVzICAgICAgICAgICAgICAgIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisKK2ZvciBmaWxlIGluICQoZWNobyAiJHshRklMRVNbQF19IiB8IHNvcnQpOyBkbworICAgICR7RklMRVNbJGZpbGVdfSAkZmlsZSB8fCBleGl0ICQ/Citkb25lCisKK2VjaG8KK2VjaG8gIkZpbGVzIHRoYXQgbXVzdCBiZSBtb2RpZmllZCBtYW51YWxseToiCitlY2hvCitmb3IgbWFudSBpbiAkKGVjaG8gIiR7IU1BTlVBTFtAXX0iIHwgc29ydCk7IGRvCisgICAgZWNobyAiID4gJHt5ZWxsb3d9JHttYW51fSR7bm9ybWFsfSIKK2RvbmUKKworZXhpdCAwCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvUkVBRE1FLm1kIGIvYnVpbGQvd2luY3BwL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjMxNzgwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL1JFQURNRS5tZApAQCAtMCwwICsxLDIxOSBAQAorPCEtLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBCdWlsZGluZyB0aHJpZnQgb24gV2luZG93cyAoTmF0aXZlKQorCitUaHJpZnQgdXNlcyBjbWFrZSB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCB0aGUgcHJvamVjdCBvbiBtdWx0aXBsZSBwbGF0Zm9ybXMsIGhvd2V2ZXIgdG8gYnVpbGQgYSBmdWxseSBmdW5jdGlvbmFsIGFuZCBwcm9kdWN0aW9uIHJlYWR5IHRocmlmdCBvbiBXaW5kb3dzIHJlcXVpcmVzIGEgbnVtYmVyIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byBiZSBvYnRhaW5lZCBvciBidWlsdC4gIE9uY2UgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFyZSByZWFkeSwgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMgbXVzdCBiZSBwYXNzZWQgdG8gY21ha2UgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQuCisKKyMjIFN1bW1hcnkKKworVGhlc2UgaW5zdHJ1Y3Rpb25zIHdpbGwgaGVscCB5b3UgYnVpbGQgdGhyaWZ0IGZvciB3aW5kb3dzIHVzaW5nIFZpc3VhbAorU3R1ZGlvIDIwMTAgb3IgbGF0ZXIuICBUaGUgY29udHJpYnV0ZWQgYmF0Y2ggZmlsZXMgd2lsbCBoZWxwIHlvdSBidWlsZAordGhlIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBuZWVkZWQgZm9yIGNvbXBsZXRlIHRocmlmdCBmdW5jdGlvbmFsaXR5IGFzCit3ZWxsIGFzIHRocmlmdCBpdHNlbGYuCisKK1RoZXNlIGluc3RydWN0aW9ucyBmb2xsb3cgYSBkaXJlY3RvcnkgbGF5b3V0IHRoYXQgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICAgd29ya3NwYWNlXAorICAgICAgYnVpbGRcICAgICAgIC0gdGhpcyBpcyB3aGVyZSB0aGUgb3V0LW9mLXRyZWUgdGhyaWZ0IGNtYWtlIGJ1aWxkcyBhcmUgZ2VuZXJhdGVkCisgICAgICBkaXN0XCAgICAgICAgLSB0aGlzIGlzIHdoZXJlIHRoZSB0aHJpZnQgYnVpbGQgcmVzdWx0cyBlbmQgdXAKKyAgICAgIHRoaXJkcGFydHlcICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IGJpbmFyaWVzIGFuZCBsaWJyYXJpZXMgbGl2ZQorICAgICAgICBidWlsZFwgICAgICAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBvdXQtb2YtdHJlZSBidWlsZHMgYXJlIGdlbmVyYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAoZXhjZXB0IGZvciBvcGVuc3NsLCB3aGljaCBvbmx5IGJ1aWxkcyBpbi10cmVlKQorICAgICAgICBkaXN0XCAgICAgICAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBkaXN0cmlidXRpb25zIGVuZCB1cAorICAgICAgICBzcmNcICAgICAgICAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBzb3VyY2UgcHJvamVjdHMgbGl2ZQorICAgICAgc2NyaXB0c1wgICAgIC0gYmF0Y2ggZmlsZXMgdXNlZCB0byBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBidWlsZHMKKyAgICAgIHRocmlmdFwgICAgICAtIHRoaXMgaXMgd2hlcmUgdGhlIHRocmlmdCBzb3VyY2UgcHJvamVjdCBsaXZlcworCitDcmVhdGUgYSAid29ya3NwYWNlIiBkaXJlY3Rvcnkgc29tZXdoZXJlIG9uIHlvdXIgc3lzdGVtIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoaXMKK2RpcmVjdG9yeSB0byB0aGVyZSwgdGhlbiBjbG9uZSBvciB1bnBhY2sgdGhyaWZ0IGludG8gYHdvcmtzcGFjZVx0aHJpZnRgLgorCisjIyBUaGlyZCBQYXJ0eSBMaWJyYXJpZXMKKworQmF0Y2ggc2NyaXB0cyBhcmUgcHJvdmlkZWQgdG8gYnVpbGQgc29tZSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMuICBZb3UgbXVzdCBkb3dubG9hZCB0aGVtIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGRpcmVjdG9yeSBub3RlZCBmb3IgZWFjaC4gIFlvdSBjYW4gdXNlIGRpZmZlcmVudCB2ZXJzaW9ucyBpZiB5b3UgcHJlZmVyOyB0aGVzZSBpbnN0cnVjdGlvbnMgd2VyZSBtYWRlIHdpdGggdGhlIHZlcnNpb25zIGxpc3RlZC4gIAorCis+IFRJUDogVG8gbW9kaWZ5IHRoZSB2ZXJzaW9ucyB1c2VkIGluIHRoZSBiYXRjaCBzY3JpcHRzLCBsb29rIGluIHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQuCisKK0J1aWxkIHRoZW0gaW4gdGhlIG9yZGVyIGxpc3RlZCB0byBzYXRpc2Z5IHRoZWlyIGRlcGVuZGVuY2llcy4KKworIyMjIHdpbmZsZXhiaXNvbgorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vZmlsZXMvd2luX2ZsZXhfYmlzb24tbGF0ZXN0LnppcC9kb3dubG9hZAorICAgICAgIHZlcnNpb246ICJsYXRlc3QiCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb24KKworVGhpcyBwYWNrYWdlIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBjb21waWxlci4gIFRoaXMgdGhpcmQgcGFydHkgcGFja2FnZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGJ1aWx0IGFzIGl0IGlzIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiB0aGUgImJpc29uIiBhbmQgImZsZXgiIHRvb2xzIG5vcm1hbGx5IGZvdW5kIG9uIFVuaXggYm94ZXMuCisKKz4gVElQOiBJZiB5b3UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBidWlsZGluZyB0aGUgY29tcGlsZXIsIHlvdSBjYW4gc2tpcCB0aGUgcmVtYWluaW5nIHRoaXJkIHBhcnR5IGxpYnJhcmllcy4KKworIyMjIHpsaWIKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cDovL3psaWIubmV0LworICAgICAgIHZlcnNpb246IDEuMi45CisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXHpsaWItMS4yLjkKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLXpsaWIuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKyAKKyMjIyBvcGVuc3NsCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnLworICAgICAgIHZlcnNpb246IDEuMS4wYworICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XHNyY1xvcGVuc3NsLTEuMS4wYworICAgIGRlcGVuZHMtb246IHpsaWIKKworSWYgeW91IGFyZSB1c2luZyBvcGVuc3NsLTEuMS4wIG9yIGxhdGVyLCB0aGV5IGNoYW5nZWQgc3RhdGljIGJ1aWxkcyB0byB1c2UgTWljcm9zb2Z0IFN0YXRpYyBSVEwgZm9yIHJlbGVhc2UgYnVpbGRzLiAgemxpYiBieSBkZWZhdWx0IHVzZXMgYSBkeW5hbWljIHJ1bnRpbWUsIGFzIGRvZXMgbGliZXZlbnQuICBFZGl0IHRoZSBmaWxlIENvbmZpZ3VyYXRpb25zLzEwLW1haW4uY29uZiBhbmQgcmVwbGFjZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgIlZDLW5vQ0UtY29tbW9uIiB3aXRoIHdoYXQgYXBwZWFycyBiZWxvdyB0byBtYWtlIG9wZW5zc2wgYnVpbGQgd2l0aCBkeW5hbWljIHJ1bnRpbWUgaW5zdGVhZDoKKworICAgICJWQy1ub0NFLWNvbW1vbiIgPT4geworICAgICAgICBpbmhlcml0X2Zyb20gICAgID0+IFsgIlZDLWNvbW1vbiIgXSwKKyAgICAgICAgdGVtcGxhdGUgICAgICAgICA9PiAxLAorICAgICAgICBjZmxhZ3MgICAgICAgICAgID0+IGFkZChwaWNrZXIoZGVmYXVsdCA9PiAiLURVTklDT0RFIC1EX1VOSUNPREUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcgICA9PiAiL01EZCAvT2QgLURERUJVRyAtRF9ERUJVRyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0+ICIvTUQgL08yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSwKKyAgICAgICAgYmluX2NmbGFncyAgICAgICA9PiBhZGQocGlja2VyKGRlYnVnICAgPT4gIi9NRGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9PiAiL01EIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSksCisgICAgICAgIGJpbl9sZmxhZ3MgICAgICAgPT4gYWRkKCIvc3Vic3lzdGVtOmNvbnNvbGUgL29wdDpyZWYiKSwKKyAgICAgICAgZXhfbGlicyAgICAgICAgICA9PiBhZGQoc3ViIHsKKyAgICAgICAgICAgIG15IEBleF9saWJzID0gKCk7CisgICAgICAgICAgICBwdXNoIEBleF9saWJzLCAnd3MyXzMyLmxpYicgdW5sZXNzICRkaXNhYmxlZHtzb2NrfTsKKyAgICAgICAgICAgIHB1c2ggQGV4X2xpYnMsICdnZGkzMi5saWIgYWR2YXBpMzIubGliIGNyeXB0MzIubGliIHVzZXIzMi5saWInOworICAgICAgICAgICAgcmV0dXJuIGpvaW4oIiAiLCBAZXhfbGlicyk7CisgICAgICAgIH0pLAorICAgIH0sCisKK1RvIGJ1aWxkLCBvcGVuIHRoZSBhcHByb3ByaWF0ZSBWaXN1YWwgU3R1ZGlvIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biAKK3RoZSBidWlsZC1vcGVuc3NsLmJhdCBzY3JpcHQgaW4gdGhpcmRwYXJ0eVxzcmMuCisKKyMjIyBsaWJldmVudAorCisgICAgICAgIHNvdXJjZTogZ2l0CisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL25tYXRoZXdzb24vTGliZXZlbnQuZ2l0CisgICAgICAgICAgIHVzZTogY29tbWl0IDM4MjFjY2ExYTYzN2Y0ZGE0MDk5YzkzNDNlNzMyNmRhMDBmNjk4MWMgb3IgbGF0ZXIKKyAgICAgICAgICBkYXRlOiBGcmkgRGVjIDIzIDE2OjE5OjM1IDIwMTYgKzA4MDAgb3IgbGF0ZXIKKyAgICAgICB2ZXJzaW9uOiBjb3JyZXNwb25kcyB0byAyLjEuN3JjICsgcGF0Y2hlcworICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XHNyY1xsaWJldmVudC0yLjEuN3JjMgorICAgIGRlcGVuZHMtb246IG9wZW5zc2wsIHpsaWIKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLWxpYmV2ZW50LmJhdCBzY3JpcHQgaW4gdGhpcmRwYXJ0eVxzcmMuCisKKyMjIyBtc2ludHR5cGVzCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL2FyY2hpdmUvcC9tc2ludHR5cGVzL2Rvd25sb2FkcworICAgICAgIHZlcnNpb246IDI2CisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdFxtc2ludHR5cGVzCisKKz4gVElQOiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBWaXN1YWwgU3R1ZGlvIDIwMTAsIHdoaWNoIGRpZCBub3QgaW5jbHVkZSBhbiA8aW50dHlwZXMuaD4gaGVhZGVyLgorCitUaGlzIHRoaXJkIHBhcnR5IHBhY2thZ2UgZG9lcyBub3QgbmVlZCB0byBiZSBidWlsdCBhcyBpdCBpcyBhIGRpc3RyaWJ1dGlvbiBvZiBoZWFkZXIgZmlsZXMuCisKKyMjIyBib29zdAorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwOi8vYm9vc3QudGVla3M5OS5jb20vCisgICAgICAgdmVyc2lvbjogMV82Ml8wCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdFxib29zdF8xXzYyXzAKKworVGhlIHByZS1idWlsdCBiaW5hcnkgdmVyc2lvbnMgb2YgYm9vc3QgY29tZSBpbiBzZWxmLXVucGFja2luZyBleGVjdXRhYmxlcy4gIFJ1biBlYWNoIG9mIHRoZSBvbmVzIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBhbmQgcG9pbnQgdGhlbSBhdCB0aGUgc2FtZSB0aGlyZHBhcnR5IGRpc3QgZGlyZWN0b3J5LgorCisjIyBCdWlsZGluZyBhIFByb2R1Y3Rpb24gdGhyaWZ0IENvbXBpbGVyCisKKyMjIyBQcmVyZXF1aXNpdGVzCisKKyogQ01ha2UtMi44LjEyLjIgb3IgbGF0ZXIKKyogVmlzdWFsIFN0dWRpbyAyMDEwIG9yIGxhdGVyCisqIHRocmlmdCBzb3VyY2UgcGxhY2VkIGludG8gd29ya3NwYWNlXHRocmlmdAorKiB3aW5mbGV4Ymlzb24gcGxhY2VkIGludG8gd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdAorCisjIyMgSW5zdHJ1Y3Rpb25zCisKK0J5IGZvbGxvd2luZyB0aGVzZSBpbnN0cnVjdGlvbnMgeW91IHdpbGwgZW5kIHVwIHdpdGggYSByZWxlYXNlIG1vZGUgdGhyaWZ0IGNvbXBpbGVyIHRoYXQgaXMgc3VpdGFibGUgZm9yIGRpc3RyaWJ1dGlvbiBhcyBpdCBoYXMgbm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLiAgCisKKzEuIE9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQuCisyLiBgY2Qgd29ya3NwYWNlYAorMy4gYGJ1aWxkLXRocmlmdC1jb21waWxlci5iYXRgCisKK1RoZSBiYXRjaCBmaWxlIHVzZXMgQ01ha2UgdG8gZ2VuZXJhdGUgYW4gb3V0LW9mLXRyZWUgYnVpbGQgZGlyZWN0b3J5IGluIGB3b3Jrc3BhY2VcYnVpbGRgIGFuZCB0aGVuIGJ1aWxkcyB0aGUgY29tcGlsZXIuICBUaGUgcmVzdWx0aW5nIGB0aHJpZnQuZXhlYCBwcm9ncmFtIGlzIHBsYWNlZCBpbnRvIGB3b3Jrc3BhY2VcZGlzdGAgaW4gYSBwYXRoIHRoYXQgZGVwZW5kcyBvbiB5b3VyIGNvbXBpbGVyIHZlcnNpb24gYW5kIHBsYXRmb3JtLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgYSBWaXN1YWwgU3R1ZGlvIDIwMTAgeDY0IENvbW1hbmQgUHJvbXB0LCB0aGUgY29tcGlsZXIgd2lsbCBiZSBwbGFjZWQgaW50byBgd29ya3NwYWNlXGRpc3RcdGhyaWZ0LWNvbXBpbGVyLWRldlx2YzEwMFx4NjRcUmVsZWFzZVx0aHJpZnQuZXhlYAorCisjIyMjIERldGFpbHMKKworVGhpcyBzZWN0aW9uIGlzIGZvciB0aG9zZSB3aG8gYXJlIGN1cmlvdXMgYWJvdXQgdGhlIENNYWtlIG9wdGlvbnMgdXNlZCBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4KKworQ01ha2UgdGFrZXMgdGhlIHNvdXJjZSB0cmVlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgdXNlcyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBmb3IgY29uZmlndXJhdGlvbi4gIFRoZSBiYXRjaCBmaWxlIGBidWlsZC10aHJpZnQtY29tcGlsZXJgIGVzc2VudGlhbGx5IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgICBDOlw+IENEIHdvcmtzcGFjZVxidWlsZAorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gIkM6XFByb2dyYW0gRmlsZXNcQ01ha2VcYmluXGNtYWtlLmV4ZSIgLi5cdGhyaWZ0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAtREJJU09OX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1ERkxFWF9FWEVDVVRBQkxFPS4uXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9NVD1PTgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLUciTk1ha2UgTWFrZWZpbGVzIgorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gTk1BS0UgL0ZNYWtlZmlsZSB0aHJpZnQtY29tcGlsZXIKKworV0lUSF9NVCBjb250cm9scyB0aGUgZHluYW1pYyBvciBzdGF0aWMgcnVudGltZSBsaWJyYXJ5IHNlbGVjdGlvbi4gIFRvIGJ1aWxkIGEgcHJvZHVjdGlvbiBjb21waWxlciwgdGhlIHRocmlmdCBwcm9qZWN0IHJlY29tbWVuZHMgdXNpbmcgdGhlIHN0YXRpYyBydW50aW1lIGxpYnJhcnkgdG8gbWFrZSB0aGUgZXhlY3V0YWJsZSBwb3J0YWJsZS4gIFRoZSBiYXRjaCBmaWxlIHNldHMgdGhpcy4KKworWW91IGNhbiBidWlsZCBhIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlIGJ5IGZvbGxvd2luZyB0aGUgZXhhbXBsZSBidXQgc3Vic3RpdHV0aW5nIGEgZGlmZmVyZW50IGdlbmVyYXRvciBmb3IgdGhlICItRyIgb3B0aW9uLiAgUnVuIGBjbWFrZS5leGUgLS1oZWxwYCBmb3IgYSBsaXN0IG9mIGdlbmVyYXRvcnMuICBUeXBpY2FsbHksIHRoaXMgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgb24gV2luZG93cyAob21pdCAiV2luNjQiIHRvIGJ1aWxkIDMyLWJpdCBpbnN0ZWFkKToKKworKiAiVmlzdWFsIFN0dWRpbyAxMCAyMDEwIFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxMSAyMDEyIFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxNSAyMDE3IFdpbjY0IgorCitGb3IgZXhhbXBsZSB5b3UgY2FuIGJ1aWxkIHVzaW5nIGEgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUgYnkgZG9pbmc6CisKKyAgICBDOlw+IENEIHdvcmtzcGFjZVxidWlsZAorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gIkM6XFByb2dyYW0gRmlsZXNcQ01ha2VcYmluXGNtYWtlLmV4ZSIgLi5cdGhyaWZ0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAtREJJU09OX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1ERkxFWF9FWEVDVVRBQkxFPS4uXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9NVD1PTgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLUciVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFdpbjY0IgorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gTVNCVUlMRCAiQXBhY2hlIFRocmlmdC5zbG4iIC9wOkNvbmZpZ3VyYXRpb249UmVsZWFzZSAvcDpQbGF0Zm9ybT14NjQgL3Q6dGhyaWZ0LWNvbXBpbGVyCisKK1lvdSBjYW4gYWxzbyBkb3VibGUtY2xpY2sgb24gdGhlIHNvbHV0aW9uIGZpbGUgdG8gYnJpbmcgaXQgdXAgaW4gVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQgb3IgZGVidWcgaW50ZXJhY3RpdmVseSBmcm9tIHRoZXJlLgorCisjIyBCdWlsZGluZyB0aGUgdGhyaWZ0IEMrKyBSdW4tVGltZSBMaWJyYXJ5CisKK1RoZXNlIGluc3RydWN0aW9ucyBhcmUgc2ltaWxhciB0byB0aGUgY29tcGlsZXIgYnVpbGQgaG93ZXZlciB0aGVyZSBhcmUgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgb24gdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIGJ1aWxkIGEgZmVhdHVyZS1jb21wbGV0ZSBydW50aW1lLiAgVGhlIHJlc3VsdGluZyBzdGF0aWMgbGluayBsaWJyYXJ5IGZvciB0aHJpZnQgdXNlcyBhIGR5bmFtaWMgTWljcm9zb2Z0IHJ1bnRpbWUuCisKKzEuIE9wZW4gdGhlIGRlc2lyZWQgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdC4KKzIuIGBjZCB3b3Jrc3BhY2VgCiszLiBgYnVpbGQtdGhyaWZ0LmJhdGAKKworVGhyaWZ0IGRlcGVuZHMgb24gYm9vc3QsIGxpYmV2ZW50LCBvcGVuc3NsLCBhbmQgemxpYiBpbiBvcmRlciB0byBidWlsZCB3aXRoIGFsbCBzZXJ2ZXIgYW5kIHRyYW5zcG9ydCB0eXBlcy4gIFRvIHVzZSBsYXRlciB2ZXJzaW9ucyBvZiBib29zdCBsaWtlIDEuNjIgeW91IHdpbGwgbmVlZCBhIHJlY2VudCB2ZXJzaW9uIG9mIGNtYWtlIChhdCBsZWFzdCAzLjcpLgorCitUaGUgYnVpbGQtdGhyaWZ0IHNjcmlwdCBoYXMgb3B0aW9ucyB0byBidWlsZCBkZWJ1ZyBvciByZWxlYXNlIGFuZCB0byBvcHRpb25hbGx5IGRpc2FibGUgYW55IG9mIHRoZSBnZW5lcmF0aW9uIChjbWFrZSksIGJ1aWxkLCBvciB0ZXN0IHBoYXNlcy4gIEJ5IGRlZmF1bHQsIHRoZSBiYXRjaCBmaWxlIHdpbGwgZ2VuZXJhdGUgYW4gb3V0LW9mLXRyZWUgYnVpbGQgZGlyZWN0b3J5IGluc2lkZSBgd29ya3NwYWNlXGJ1aWxkYCwgdGhlbiBwZXJmb3JtIGEgcmVsZWFzZSBidWlsZCwgdGhlbiBydW4gdGhlIHVuaXQgdGVzdHMuICBUaGUgYmF0Y2ggZmlsZSBhY2NlcHRzIHNvbWUgb3B0aW9uIGZsYWdzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yOgorCisgICAgOjogRmxhZ3MgeW91IGNhbiB1c2UgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3I6CisgICAgOjoKKyAgICA6OiAgIC9ERUJVRyAgICAgICAgICAgIC0gaWYgYnVpbGRpbmcsIHBlcmZvcm0gYSBkZWJ1ZyBidWlsZCBpbnN0ZWFkCisgICAgOjogICAvTk9HRU5FUkFURSAgICAgICAtIHNraXAgY21ha2UgZ2VuZXJhdGlvbiAtIHVzZWZ1bCBpZiB5b3UKKyAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZCBhIHNvbHV0aW9uIGFuZCBqdXN0CisgICAgOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gYnVpbGQKKyAgICA6OiAgIC9OT0JVSUxEICAgICAgICAgIC0gc2tpcCBjbWFrZSBidWlsZCAtIHVzZWZ1bCBpZiB5b3UganVzdAorICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGdlbmVyYXRlIGEgc29sdXRpb24KKyAgICA6OiAgIC9OT1RFU1QgICAgICAgICAgIC0gc2tpcCBjdGVzdCBleGVjdXRpb24KKworRm9yIGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgdGhlIGNtYWtlIGVudmlyb25tZW50IHdpdGhvdXQgYnVpbGRpbmcgb3IgcnVubmluZyB0ZXN0czoKKworICAgIEM6XHdvcmtzcGFjZT4gYnVpbGQtdGhyaWZ0LmJhdCAvTk9CVUlMRCAvTk9URVNUCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdCBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjQyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDc5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogUHJvZHVjZXMgYSBwcm9kdWN0aW9uIHRocmlmdCBjb21waWxlciBzdWl0YWJsZSBmb3IgcmVkaXN0cmlidXRpb24uCis6OiBUaGUgY29tcGlsZXIgaXMgbGlua2VkIHRvIHJ1bnRpbWUgc3RhdGljYWxseSBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eS4KKzo6IEFzc3VtZXMgdGhlIHRoaXJkcGFydHkgZmlsZXMgZm9yICJ3aW5mbGV4Ymlzb24iIGhhdmUgYmVlbiBwbGFjZWQKKzo6IGFjY29yZGluZyB0byB0aGUgUkVBRE1FLm1kIGluc3RydWN0aW9ucy4KKzo6Cis6OiBPcGVuIGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBvZiB5b3VyIGNob29zaW5nIGFuZCB0aGVuCis6OiBydW4gdGhpcyBzY3JpcHQuICAKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXRocmlmdAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049ZGV2CitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDB0aGlyZHBhcnR5CisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBHRU5FUkFUT1IgZm9yIENNYWtlIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGdlbmVyYXRvci5iYXQgfHwgRVhJVCAvQgorCitJRiBOT1QgREVGSU5FRCBCVUlMRFRZUEUgKAorICBTRVQgQlVJTERUWVBFPVJlbGVhc2UKKykKKworICBTRVQgQlVJTERESVI9JX5kcDBidWlsZFwlUEFDS0FHRV9OQU1FJS1jb21waWxlclwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXAorICBTRVQgT1VURElSPSV+ZHAwZGlzdFwlUEFDS0FHRV9OQU1FJS1jb21waWxlci0lUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVwKKyAgU0VUIEJPT1NUX0xJQkRJUj1saWIlQVJDSDp+LTIsMiUtbXN2Yy0lQ09NUElMRVI6fi0zLDIlLjAKKyAgSUYgIiVCVUlMRFRZUEUlIiA9PSAiRGVidWciIChTRVQgWkxJQl9TVEFUSUNfU1VGRklYPWQpCisKKyAgRUNITy8KKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8gICAgIENvbmZpZ3VyYXRpb246ICVQQUNLQUdFX05BTUUlICVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiVCVUlMRFRZUEUlICIlR0VORVJBVE9SJSIKK0lGIERFRklORUQgQ09NUElMRVJPTkxZICgKKyAgRUNITyAgICAgICAgICAgICAgICAgICAgQ09NUElMRVIgT05MWQorKQorICBFQ0hPICAgQnVpbGQgRGlyZWN0b3J5OiAlQlVJTERESVIlCisgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICVPVVRESVIlCisgIEVDSE8gIFNvdXJjZSBEaXJlY3Rvcnk6ICVTT1VSQ0VESVIlCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPLworCisgIE1LRElSICIlQlVJTERESVIlIgorICBDRCAiJUJVSUxERElSJSIgfHwgRVhJVCAvQgorCisgIENNQUtFLkVYRSAlfmRwMHRocmlmdCBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKyAgICAtREJJU09OX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQ01BS0VfQlVJTERfVFlQRT0lQlVJTERUWVBFJSBeCisgICAgLURGTEVYX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9mbGV4LmV4ZSBeCisgICAgLURXSVRIX01UPU9OIF4KKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgfHwgRVhJVCAvQgorCisgIENEICVCVUlMRERJUiUKKworICBDTUFLRS5FWEUgLS1idWlsZCAuIC0tY29uZmlnICVCVUlMRFRZUEUlIC0tdGFyZ2V0IHRocmlmdC1jb21waWxlciB8fCBFWElUIC9CCisgIFhDT1BZIC9GIC9ZICVCVUlMRERJUiVcYmluXCVCVUlMRFRZUEUlXHRocmlmdC5leGUgJU9VVERJUiUKKworRU5ETE9DQUwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQuYmF0IGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2N2FjZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQuYmF0CkBAIC0wLDAgKzEsMTYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogR2VuZXJhdGVzIGEgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBmb3IgdGhyaWZ0IGFuZCB0aGVuIGJ1aWxkcyBpdC4KKzo6IEFzc3VtZXMgdGhpcmQgcGFydHkgbGlicmFyaWVzIGhhdmUgYmVlbiBidWlsdCBvciBwbGFjZWQgYWxyZWFkeS4KKzo6Cis6OiBPcGVuIGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBvZiB5b3VyIGNob29zaW5nIGFuZCB0aGVuCis6OiBydW4gdGhpcyBzY3JpcHQuICAKKzo6Cis6OiBOb3JtYWxseSB0aGUgc2NyaXB0IHdpbGwgcnVuIGNtYWtlIHRvIGdlbmVyYXRlIGEgc29sdXRpb24sIHRoZW4KKzo6IHBlcmZvcm0gYSBidWlsZCwgdGhlbiBydW4gdGVzdHMgb24gdGhlIGNvbXBsZXRlIHRocmlmdCBsaWJyYXJ5Cis6OiBpbiByZWxlYXNlIG1vZGUuCis6OgorOjogRmxhZ3MgeW91IGNhbiB1c2UgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3I6Cis6OgorOjogICAvREVCVUcgICAgICAgICAgICAtIGRlYnVnIGluc3RlYWQgb2YgcmVsZWFzZQorOjogICAvSURFICAgICAgICAgICAgICAtIGxhdW5jaCBWaXN1YWwgU3R1ZGlvIHdpdGggYSBwYXRoIHNldAorOjogICAgICAgICAgICAgICAgICAgICAgIHVwIGNvcnJlY3RseSB0byBydW4gdGVzdHMgaW5zdGVhZCBvZgorOjogICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgYW55IG90aGVyIGFjdGlvbnMsIGkuZS4KKzo6ICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWVzIHNldHRpbmcgdGhlIG5leHQgdGhyZWUgZmxhZ3MKKzo6ICAgL05PR0VORVJBVEUgICAgICAgLSBza2lwIGNtYWtlIGdlbmVyYXRpb24gLSB1c2VmdWwgaWYgeW91Cis6OiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZCBhIHNvbHV0aW9uIGFuZCBqdXN0Cis6OiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBidWlsZAorOjogICAvTk9CVUlMRCAgICAgICAgICAtIHNraXAgY21ha2UgYnVpbGQgLSB1c2VmdWwgaWYgeW91IGp1c3QKKzo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGdlbmVyYXRlIGEgc29sdXRpb24KKzo6ICAgL05PVEVTVCAgICAgICAgICAgLSBza2lwIGN0ZXN0IGV4ZWN1dGlvbgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT10aHJpZnQKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPWRldgorSUYgTk9UIERFRklORUQgU09VUkNFX0RJUiAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwdGhpcmRwYXJ0eQorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgR0VORVJBVE9SIGZvciBDTWFrZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRnZW5lcmF0b3IuYmF0IHx8IEVYSVQgL0IKKworOjogRGVmYXVsdHMKKworSUYgTk9UIERFRklORUQgQlVJTERUWVBFIFNFVCBCVUlMRFRZUEU9UmVsZWFzZQorU0VUIE9QVF9JREU9MAorU0VUIE9QVF9CVUlMRD0xCitTRVQgT1BUX0dFTkVSQVRFPTEKK1NFVCBPUFRfVEVTVD0xCisKKzo6IEFwcGx5IEZsYWdzCisKK0lGIC9JICIlMSIgPT0gIi9ERUJVRyIgICAgICAgIFNFVCBCVUlMRFRZUEU9RGVidWcKK0lGIC9JICIlMiIgPT0gIi9ERUJVRyIgICAgICAgIFNFVCBCVUlMRFRZUEU9RGVidWcKK0lGIC9JICIlMyIgPT0gIi9ERUJVRyIgICAgICAgIFNFVCBCVUlMRFRZUEU9RGVidWcKK0lGIC9JICIlMSIgPT0gIi9JREUiICAgICAgICAgIFNFVCBPUFRfSURFPTEKK0lGIC9JICIlMiIgPT0gIi9JREUiICAgICAgICAgIFNFVCBPUFRfSURFPTEKK0lGIC9JICIlMyIgPT0gIi9JREUiICAgICAgICAgIFNFVCBPUFRfSURFPTEKK0lGIC9JICIlMSIgPT0gIi9OT0JVSUxEIiAgICAgIFNFVCBPUFRfQlVJTEQ9MAorSUYgL0kgIiUyIiA9PSAiL05PQlVJTEQiICAgICAgU0VUIE9QVF9CVUlMRD0wCitJRiAvSSAiJTMiID09ICIvTk9CVUlMRCIgICAgICBTRVQgT1BUX0JVSUxEPTAKK0lGIC9JICIlMSIgPT0gIi9OT0dFTkVSQVRFIiAgIFNFVCBPUFRfR0VORVJBVEU9MAorSUYgL0kgIiUyIiA9PSAiL05PR0VORVJBVEUiICAgU0VUIE9QVF9HRU5FUkFURT0wCitJRiAvSSAiJTMiID09ICIvTk9HRU5FUkFURSIgICBTRVQgT1BUX0dFTkVSQVRFPTAKK0lGIC9JICIlMSIgPT0gIi9OT1RFU1QiICAgICAgIFNFVCBPUFRfVEVTVD0wCitJRiAvSSAiJTIiID09ICIvTk9URVNUIiAgICAgICBTRVQgT1BUX1RFU1Q9MAorSUYgL0kgIiUzIiA9PSAiL05PVEVTVCIgICAgICAgU0VUIE9QVF9URVNUPTAKKworSUYgJU9QVF9JREUlID09IDEgKAorICBTRVQgT1BUX0dFTkVSQVRFPTAKKyAgU0VUIE9QVF9CVUlMRD0wCisgIFNFVCBPUFRfVEVTVD0wCispCisKKyAgU0VUIEJVSUxERElSPSV+ZHAwYnVpbGRcJVBBQ0tBR0VfTkFNRSVcJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcCisgIFNFVCBPVVRESVI9JX5kcDBkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXAorICBTRVQgQk9PU1RfTElCRElSPWxpYiVBUkNIOn4tMiwyJS1tc3ZjLSVDT01QSUxFUjp+LTMsMiUuMAorICBJRiAiJUJVSUxEVFlQRSUiID09ICJEZWJ1ZyIgKFNFVCBaTElCX1NUQVRJQ19TVUZGSVg9ZCkKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgQ29uZmlndXJhdGlvbjogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6JUJVSUxEVFlQRSUgIiVHRU5FUkFUT1IlIgorSUYgREVGSU5FRCBDT01QSUxFUk9OTFkgKAorICBFQ0hPICAgICAgICAgICAgICAgICAgICBDT01QSUxFUiBPTkxZCispCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICVCVUlMRERJUiUKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogJU9VVERJUiUKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKK0lGICVPUFRfSURFJSA9PSAxICgKKworICBDQUxMIDpTRVRSVU5QQVRIIHx8IEVYSVQgL0IKKyAgQ0FMTCBERVZFTlYgIiFCVUlMRERJUiFBcGFjaGUgVGhyaWZ0LnNsbiIgfHwgRVhJVCAvQgorICBFWElUIC9CCisgIAorKQorCisgIE1LRElSICIlQlVJTERESVIlIgorICBDRCAiJUJVSUxERElSJSIgfHwgRVhJVCAvQgorCitJRiAlT1BUX0dFTkVSQVRFJSA9PSAxICgKKworICBDTUFLRS5FWEUgJX5kcDB0aHJpZnQgXgorICAgIC1HIiVHRU5FUkFUT1IlIiBeCisgICAgLURCSVNPTl9FWEVDVVRBQkxFPSVXSU4zUF9ST09UJVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlIF4KKyAgICAtREJPT1NUX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcYm9vc3RfJVRQX0JPT1NUX1ZFUlNJT04lIF4KKyAgICAtREJPT1NUX0xJQlJBUllESVI9JVdJTjNQX1JPT1QlXGRpc3RcYm9vc3RfJVRQX0JPT1NUX1ZFUlNJT04lXCVCT09TVF9MSUJESVIlIF4KKyAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVPVVRESVIlIF4KKyAgICAtRENNQUtFX0JVSUxEX1RZUEU9JUJVSUxEVFlQRSUgXgorICAgIC1ERkxFWF9FWEVDVVRBQkxFPSVXSU4zUF9ST09UJVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUgXgorICAgIC1ESU5UVFlQRVNfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxtc2ludHR5cGVzIF4KKyAgICAtRExJQkVWRU5UX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcbGliZXZlbnQtJVRQX0xJQkVWRU5UX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlIF4KKyAgICAtRE9QRU5TU0xfUk9PVF9ESVI9JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVxkeW5hbWljIF4KKyAgICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9GRiBeCisgICAgLURaTElCX0xJQlJBUlk9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVxsaWJcemxpYiVaTElCX0xJQl9TVUZGSVglLmxpYiBeCisgICAgLURaTElCX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJSBeCisgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgICAtRFdJVEhfU1RBVElDX0xJQj1PTiB8fCBFWElUIC9CCisKKykKKworSUYgJU9QVF9CVUlMRCUgPT0gMSAoCisKKyAgQ0QgJUJVSUxERElSJQorICBDTUFLRS5FWEUgLS1idWlsZCAuIC0tY29uZmlnICVCVUlMRFRZUEUlIC0tdGFyZ2V0IElOU1RBTEwgfHwgRVhJVCAvQgorCispCisKK0lGICVPUFRfVEVTVCUgPT0gMSAoCisKKyAgQ0FMTCA6U0VUUlVOUEFUSCB8fCBFWElUIC9CCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgUlVOX1RFU1RTIHx8IEVYSVQgL0IKKyAgCispCisKKzpTRVRSVU5QQVRICisgIFNFVCBQQVRIPSFQQVRIITslV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiVcJUJPT1NUX0xJQkRJUiUKKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XG9wZW5zc2wtJVRQX09QRU5TU0xfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSVcZHluYW1pY1xiaW4KKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcYmluCisgIEVYSVQgL0IKKworRU5ETE9DQUwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGFyY2guYmF0IGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3MGExZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGFyY2guYmF0CkBAIC0wLDAgKzEsNDcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGFyY2hpdGVjdHVyZSB3ZSdyZSBidWlsZGluZyBmb3IuCis6OiBTZXQgdGhlIEFSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjogICB3aW4zMgorOjogICB4NjQKKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIEFSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIEFSQ0ggY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIEFSQ0ggKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQVJDSAorICBFWElUIC9CIDAKKykKKworQ0FMTCA6Q0hFQ0sgeDY0CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoU0VUIEFSQ0g9eDY0KSBFTFNFIChTRVQgQVJDSD13aW4zMikKKworSUYgTk9UIERFRklORUQgQVJDSCAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gZGV0ZWN0ZWQgdGFyZ2V0IGFyY2hpdGVjdHVyZSAlQVJDSCUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiIgZm9yICUxJSIgPiBudWwKK0VYSVQgL0IgJUVSUk9STEVWRUwlCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRjb21waWxlci5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRjb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwNWQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDU4IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluLgorOjogU2V0IHRoZSBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIHZjMTAwID0gVmlzdWFsIFN0dWRpbyAyMDEwCis6OiAgIHZjMTEwID0gVmlzdWFsIFN0dWRpbyAyMDEyCis6OiAgIHZjMTIwID0gVmlzdWFsIFN0dWRpbyAyMDEzCis6OiAgIHZjMTQwID0gVmlzdWFsIFN0dWRpbyAyMDE1Cis6OiAgIHZjMTUwID0gVmlzdWFsIFN0dWRpbyAyMDE3Cis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgQ09NUElMRVIgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIENPTVBJTEVSCisgIEVYSVQgL0IgMAorKQorCitDQUxMIDpDSEVDSyAxNgorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzEwMCkKK0NBTEwgOkNIRUNLIDE3CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTEwKQorQ0FMTCA6Q0hFQ0sgMTgKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxMjApCitDQUxMIDpDSEVDSyAxOS4wMAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzE0MCkKK0NBTEwgOkNIRUNLIDE5LjEwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTUwKQorCitJRiBOT1QgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjb21waWxlciBlZGl0aW9uCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gZGV0ZWN0ZWQgY29tcGlsZXIgZWRpdGlvbiAgICAlQ09NUElMRVIlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUuIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRnZW5lcmF0b3IuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTI3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRnZW5lcmF0b3IuYmF0CkBAIC0wLDAgKzEsNjkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGNvbXBpbGVyIGVkaXRpb24gd2UncmUgYnVpbGRpbmcgaW4gYW5kIHRoZW4gCis6OiBzZXQgdGhlIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OgorOjogIFZpc3VhbCBTdHVkaW8gMTUgMjAxNyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE3IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNSBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTMgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTEgMjAxMiBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEyIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMCBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIklBNjQiLgorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBHRU5FUkFUT1IgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorOjogUmVxdWlyZXMgY2xfc2V0YXJjaC5iYXQgdG8gaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIHRoZSBBUkNIIGVudmlyb25tZW50Cis6OiB2YXJpYWJsZSB0byBiZSBzZXQuCis6OgorCitJRiAiJUFSQ0glIiA9PSAieDY0IiAoU0VUIEdFTkFSQ0g9IFdpbjY0KQorCitJRiBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBHRU5FUkFUT1IKKyAgRVhJVCAvQiAwCispCisKK0NBTEwgOkNIRUNLIDE2CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMCAyMDEwJUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTcKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDExIDIwMTIlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxOAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTIgMjAxMyVHRU5BUkNIJSkKK0NBTEwgOkNIRUNLIDE5LjAwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNCAyMDE1JUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTkuMTAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE1IDIwMTclR0VOQVJDSCUpCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBDTWFrZSBnZW5lcmF0b3IgdG8gdXNlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gdXNpbmcgQ01ha2UgZ2VuZXJhdG9yICAgICAgICAlR0VORVJBVE9SJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElLiIgPiBudWwKK0VYSVQgL0IgJUVSUk9STEVWRUwlCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvc2NyaXB0cy90cHZlcnNpb25zLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGM4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvc2NyaXB0cy90cHZlcnNpb25zLmJhdApAQCAtMCwwICsxLDI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogU2V0IHRoZSB2ZXJzaW9ucyBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gdXNlLgorOjoKKworSUYgTk9UIERFRklORUQgVFBfQk9PU1RfVkVSU0lPTiAgICBTRVQgVFBfQk9PU1RfVkVSU0lPTj0xXzYyXzAKK0lGIE5PVCBERUZJTkVEIFRQX0xJQkVWRU5UX1ZFUlNJT04gU0VUIFRQX0xJQkVWRU5UX1ZFUlNJT049Mi4xLjdyYzIKK0lGIE5PVCBERUZJTkVEIFRQX09QRU5TU0xfVkVSU0lPTiAgU0VUIFRQX09QRU5TU0xfVkVSU0lPTj0xLjEuMGMKK0lGIE5PVCBERUZJTkVEIFRQX1pMSUJfVkVSU0lPTiAgICAgU0VUIFRQX1pMSUJfVkVSU0lPTj0xLjIuOQorCitFWElUIC9CIDAKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtbGliZXZlbnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjUwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtbGliZXZlbnQuYmF0CkBAIC0wLDAgKzEsODYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBCdWlsZCBzY3JpcHQgZm9yIGxpYmV2ZW50IG9uIHdpbmRvd3MKKzo6IFVzZSBsaWJldmVudCBtYXN0ZXIgZnJvbSBnaXRodWIgd2hpY2ggaGFzIGNtYWtlIGludGVncmF0aW9uCis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyCis6OgorOjogQ3JlYXRlcyBhIHN0YXRpYyBsaW5rIGxpYnJhcnkuCis6OiBMaW5rcyBhZ2FpbnN0IE9wZW5TU0wgYW5kIHpsaWIgc3RhdGljYWxseS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCAuLlwuLlxzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworOjogdXNlICJidWlsZC1saWJldmVudC5iYXQgL3llcyIgdG8gc2tpcCB0aGUgcXVlc3Rpb24gcGFydAorSUYgL0kgIiUxIiA9PSAiL1lFUyIgICAgICAgICAgIFNFVCBOT0FTSz0xCisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAgICAgICBTRVQgR0VORVJBVE9SPU5NYWtlIE1ha2VmaWxlcworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9bGliZXZlbnQKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPSVUUF9MSUJFVkVOVF9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFRElSICAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworRk9SICUlWCBJTiAoCisgIERlYnVnIAorICBSZWxlYXNlCispIERPICgKKyAgU0VUIEJVSUxEVFlQRT0lJVgKKyAgU0VUIEJVSUxERElSPSVXSU4zUF9ST09UJVxidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIQorICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisKKyAgSUYgIiFCVUlMRFRZUEUhIiA9PSAiRGVidWciIChTRVQgWkxJQl9MSUJfU1VGRklYPWQpCisKKyAgU0VUIENNQUtFX0RFRlM9XgorICAgLURFVkVOVF9fRElTQUJMRV9TQU1QTEVTPU9OIF4KKyAgIC1ERVZFTlRfX0RJU0FCTEVfVEVTVFM9T04gXgorICAgLURPUEVOU1NMX1VTRV9TVEFUSUNfTElCUz1PRkYgXgorICAgLURPUEVOU1NMX1JPT1RfRElSPSVXSU4zUF9ST09UJVxkaXN0XG9wZW5zc2wtJVRQX09QRU5TU0xfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIUJVSUxEVFlQRSFcZHluYW1pYyBeCisgICAtRFpMSUJfTElCUkFSWT0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXGxpYlx6bGliIVpMSUJfTElCX1NVRkZJWCEubGliIF4KKyAgIC1EWkxJQl9ST09UPSVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCUKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgdiVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiFCVUlMRFRZUEUhICIlR0VORVJBVE9SJSIKKyAgRUNITyBDTWFrZSBEZWZpbml0aW9uczogIUNNQUtFX0RFRlMhCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICFCVUlMRERJUiEKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogIU9VVERJUiEKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgIENIT0lDRSAvTSAiRG8geW91IHdhbnQgdG8gYnVpbGQgdGhpcyBjb25maWd1cmF0aW9uPyAiIC9jIFlOCisgICAgSUYgIUVSUk9STEVWRUwhIE5FUSAxIChFWElUIC9CICFFUlJPUkxFVkVMISkKKyAgKQorICAKKyAgTUtESVIgIiFCVUlMRERJUiEiCisgIENEICIhQlVJTERESVIhIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFIC1HIiVHRU5FUkFUT1IlIiAtRENNQUtFX0lOU1RBTExfUFJFRklYPSFPVVRESVIhIC1EQ01BS0VfQlVJTERfVFlQRT0hQlVJTERUWVBFISAhQ01BS0VfREVGUyEgIiVTT1VSQ0VESVIlIiB8fCBFWElUIC9CCisgIE5NQUtFIC9mTWFrZWZpbGUgaW5zdGFsbCB8fCBFWElUIC9CCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtb3BlbnNzbC5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtb3BlbnNzbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyNzBmMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdApAQCAtMCwwICsxLDEwNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3Igb3BlbnNzbCBvbiB3aW5kb3dzCis6OiBvcGVuc3NsIHVzZXMgYW4gaW4tdHJlZSBidWlsZCBzbyB5b3UgaGF2ZSB0byBjbGVhbiBiZXR3ZWVuIGVhY2ggb25lCis6OgorOjogVXNlcyB0aGUgZW52aXJvbm1lbnQgc2V0IHVwIGJ5IGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBzaG9ydGN1dAorOjogdG8gdGFyZ2V0IGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIGFuZCBjb21waWxlcgorOjoKKzo6IElmIHlvdSB1c2UgTGF2YXNvZnQgQWQtQXdhcmUsIGRpc2FibGUgaXQgZm9yIHRoaXMgYnVpbGQuICBJdCBibG9ja3MgdGhlIGNyZWF0aW9uCis6OiBvZiBhbnkgZmlsZSBuYW1lZCAiY2xpZW50aGVsbG90ZXN0LmV4ZSIgZm9yIHdoYXRldmVyIHJlYXNvbiwgd2hpY2ggYnJlYWtzIHRoZSBidWlsZC4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCAuLlwuLlxzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworOjogdXNlICJidWlsZC1vcGVuc3NsLmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9b3BlbnNzbAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049JVRQX09QRU5TU0xfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFNPVVJDRURJUiAgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMC4uCisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKK0lGICIlQVJDSCUiID09ICJ4NjQiICgKKyAgU0VUIFRPRE89ZGVidWctVkMtV0lONjRBIFZDLVdJTjY0QQorKSBFTFNFICgKKyAgU0VUIFRPRE89ZGVidWctVkMtV0lOMzIgVkMtV0lOMzIKKykKKworRk9SICUlWCBJTiAoICFUT0RPISApIERPICgKKyAgU0VUIEJVSUxEVFlQRT0lJVgKKyAgRk9SICUlWSBJTiAoCisgICAgbnQKKyAgICBudGRsbAorICApIERPICgKKyAgICBTRVQgTElCVFlQRT0lJVkKKworICAgIElGICIhQlVJTERUWVBFOn4wLDYhIiA9PSAiZGVidWctIiAoCisgICAgICBTRVQgT1VUQlVJTERUWVBFPWRlYnVnCisgICAgICBTRVQgWkxJQkxJQlNVRkZJWD1kCisgICAgKSBFTFNFICgKKyAgICAgIFNFVCBPVVRCVUlMRFRZUEU9cmVsZWFzZQorICAgICAgU0VUIFpMSUJMSUJTVUZGSVg9CisgICAgKQorCisgICAgSUYgIiFMSUJUWVBFISIgPT0gIm50ZGxsIiAoCisgICAgICBTRVQgQlVJTERfT1BUSU9OUz1zaGFyZWQKKyAgICAgIFNFVCBPVVRMSUJUWVBFPWR5bmFtaWMKKyAgICAgIFNFVCBaTElCTElCPXpsaWIhWkxJQkxJQlNVRkZJWCEKKyAgICAgIFNFVCBaTElCT1BUPXpsaWItZHluYW1pYworICAgICkgRUxTRSAoCisgICAgICBTRVQgQlVJTERfT1BUSU9OUz1uby1zaGFyZWQKKyAgICAgIFNFVCBPVVRMSUJUWVBFPXN0YXRpYworICAgICAgU0VUIFpMSUJMSUI9emxpYnN0YXRpYyFaTElCTElCU1VGRklYIS5saWIKKyAgICAgIFNFVCBaTElCT1BUPXpsaWIKKyAgICApCisKKyAgICBTRVQgTElCPSV+ZHAwLi5cZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCFDT01QSUxFUiFcIUFSQ0ghXGxpYjshTElCIQorICAgIFNFVCBCVUlMRF9PUFRJT05TPSFCVUlMRF9PUFRJT05TISBuby1hc20gbm8tdW5pdC10ZXN0ICFaTElCT1BUISAtLW9wZW5zc2xkaXI9c3NsIC0td2l0aC16bGliLWluY2x1ZGU9JX5kcDAuLlxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcIUNPTVBJTEVSIVwhQVJDSCFcaW5jbHVkZSAtLXdpdGgtemxpYi1saWI9IVpMSUJMSUIhCisgICAgU0VUIE9VVERJUj0lV0lOM1BfUk9PVCVcZGlzdFwlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhT1VUQlVJTERUWVBFIVwhT1VUTElCVFlQRSEKKworICAgIEVDSE8vCisgICAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6IU9VVEJVSUxEVFlQRSE6IU9VVExJQlRZUEUhIFshQlVJTERUWVBFIV0KKyAgICBFQ0hPIENvbmZpZ3VyZSBPcHRpb25zOiAhQlVJTERfT1BUSU9OUyEKKyAgICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICAgIEVDSE8gIFNvdXJjZSBEaXJlY3Rvcnk6ICVTT1VSQ0VESVIlCisgICAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRUNITy8KKworICAgIElGIE5PVCBERUZJTkVEIE5PQVNLICgKKyAgICAgIENIT0lDRSAvTSAiRG8geW91IHdhbnQgdG8gYnVpbGQgdGhpcyBjb25maWd1cmF0aW9uPyAiIC9jIFlOCisgICAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICAgICkKKworICAgIENEICVTT1VSQ0VESVIlIHx8IEVYSVQgL0IKKyAgICBwZXJsIENvbmZpZ3VyZSAhQlVJTERUWVBFISAtLXByZWZpeD0iIU9VVERJUiEiICFCVUlMRF9PUFRJT05TISB8fCBFWElUIC9CCisgICAgTk1BS0UgL0ZNYWtlZmlsZSBpbnN0YWxsX3N3IHx8IEVYSVQgL0IKKyAgICBOTUFLRSAvRk1ha2VmaWxlIGNsZWFuIHx8IEVYSVQgL0IKKyAgKQorKQorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLXpsaWIuYmF0IGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLXpsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjcyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQKQEAgLTAsMCArMSw3NSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3IgemxpYiBvbiB3aW5kb3dzLgorOjogVXNlcyB0aGUgZW52aXJvbm1lbnQgc2V0IHVwIGJ5IGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBzaG9ydGN1dAorOjogdG8gdGFyZ2V0IGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIGFuZCBjb21waWxlci4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCAuLlwuLlxzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworOjogdXNlICJidWlsZC16bGliLmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICAgICAgIFNFVCBHRU5FUkFUT1I9Tk1ha2UgTWFrZWZpbGVzCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT16bGliCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj0lVFBfWkxJQl9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFX0RJUiAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworRk9SICUlWCBJTiAoCisgIERlYnVnIAorICBSZWxlYXNlCispIERPICgKKyAgU0VUIEJVSUxEVFlQRT0lJVgKKyAgU0VUIEJVSUxERElSPSVXSU4zUF9ST09UJVxidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIQorICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glCisKKyAgRUNITy8KKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8gICAgICAgICAgQnVpbGRpbmc6ICVQQUNLQUdFX05BTUUlIHYlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTohQlVJTERUWVBFISAiJUdFTkVSQVRPUiUiCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICFCVUlMRERJUiEKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogIU9VVERJUiEKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgIENIT0lDRSAvTSAiRG8geW91IHdhbnQgdG8gYnVpbGQgdGhpcyBjb25maWd1cmF0aW9uPyAiIC9jIFlOCisgICAgSUYgIUVSUk9STEVWRUwhIE5FUSAxIChFWElUIC9CICFFUlJPUkxFVkVMISkKKyAgKQorCisgIE1LRElSICIhQlVJTERESVIhIgorICBDRCAiIUJVSUxERElSISIgfHwgRVhJVCAvQgorCisgIENNQUtFLkVYRSAtRyIlR0VORVJBVE9SJSIgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0hT1VURElSISAtRENNQUtFX0JVSUxEX1RZUEU9IUJVSUxEVFlQRSEgIiVTT1VSQ0VESVIlIiB8fCBFWElUIC9CCisgIE5NQUtFIC9mTWFrZWZpbGUgaW5zdGFsbCB8fCBFWElUIC9CCisKKyAgSUYgIiFCVUlMRFRZUEUhIiA9PSAiRGVidWciICgKKyAgICBDT1BZICIhQlVJTERESVIhXHpsaWJkLnBkYiIgIiFPVVRESVIhXGJpblwiIHx8IEVYSVQgL0IKKyAgKQorKQorCitFTkRMT0NBTApkaWZmIC0tZ2l0IGEvY2xlYW51cC5zaCBiL2NsZWFudXAuc2gKaW5kZXggMGVhNTViYi4uZjExMDcyMSAxMDA3NTUKLS0tIGEvY2xlYW51cC5zaAorKysgYi9jbGVhbnVwLnNoCkBAIC0zMiw2ICszMiwxMSBAQAogTWFrZWZpbGUgXAogTWFrZWZpbGUuaW4gXAogTWFrZWZpbGUub3JpZyBcCithY2xvY2FsL2xpYnRvb2wubTQgXAorYWNsb2NhbC9sdG9wdGlvbnMubTQgXAorYWNsb2NhbC9sdHN1Z2FyLm00IFwKK2FjbG9jYWwvbHR2ZXJzaW9uLm00IFwKK2FjbG9jYWwvbHR+b2Jzb2xldGUubTQgXAogYWNsb2NhbC5tNCBcCiBhdXRvbTR0ZS5jYWNoZSBcCiBhdXRvc2Nhbi5sb2cgXApAQCAtNTUsNCArNjAsMzAgQEAKIG1pc3NpbmcgXAogeWx3cmFwIFwKIGlmL2dlbi0qIFwKLXRlc3QvZ2VuLSoKK3Rlc3QvZ2VuLSogXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC8uZGVwcyBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL01ha2VmaWxlIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvTWFrZWZpbGUuZnJhZ21lbnRzIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvTWFrZWZpbGUuZ2xvYmFsIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvTWFrZWZpbGUub2JqZWN0cyBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2FjaW5jbHVkZS5tNCBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2FjbG9jYWwubTQgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9hdXRvbTR0ZS5jYWNoZSBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2J1aWxkIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLmd1ZXNzIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLmggXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcuaC5pbiBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5sb2cgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubmljZSBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5zdGF0dXMgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcuc3ViIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlLmluIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvaW5jbHVkZSBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2luc3RhbGwtc2ggXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9saWJ0b29sIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbHRtYWluLnNoIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbWlzc2luZyBcCitsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL21raW5zdGFsbGRpcnMgXAorbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9tb2R1bGVzIFwKK2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcnVuLXRlc3RzLnBocApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL0NNYWtlTGlzdHMudHh0IGIvY29tcGlsZXIvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZjc5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMjEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4xMikKKworY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdmVyc2lvbi5oLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdmVyc2lvbi5oKQoraWYoTVNWQykKKyAgICAjIFRoZSB3aW5mbGV4Ymlzb24gZ2VuZXJhdG9yIG91dHB1dHMgc29tZSBtYWNyb3MgdGhhdCBjb25mbGljdCB3aXRoIHRoZSBWaXN1YWwgU3R1ZGlvIDIwMTAgY29weSBvZiBzdGRpbnQuaAorICAgICMgVGhpcyBtaWdodCBiZSBmaXhlZCBpbiBsYXRlciB2ZXJzaW9ucyBvZiBWaXN1YWwgU3R1ZGlvLCBidXQgYW4gZWFzeSBzb2x1dGlvbiBpcyB0byBpbmNsdWRlIHN0ZGludC5oIGZpcnN0CisgICAgaWYoSEFWRV9TVERJTlRfSCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EX19TVERDX0ZPUk1BVF9NQUNST1MpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRF9fU1REQ19MSU1JVF9NQUNST1MpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygvRkkic3RkaW50LmgiKQorICAgIGVuZGlmKEhBVkVfU1RESU5UX0gpCitlbmRpZigpCisKK2ZpbmRfcGFja2FnZShGTEVYIFJFUVVJUkVEKQorZmluZF9wYWNrYWdlKEJJU09OIFJFUVVJUkVEKQorCisjIGNyZWF0ZSBkaXJlY3RvcnkgZm9yIHRocmlmdHkgYW5kIHRocmlmdGwKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC8pCisKKyMgQ3JlYXRlIGZsZXggYW5kIGJpc29uIGZpbGVzIGFuZCBidWlsZCB0aGUgbGliIHBhcnNlIHN0YXRpYyBsaWJyYXJ5CitCSVNPTl9UQVJHRVQodGhyaWZ0eSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnR5Lnl5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYykKK0ZMRVhfVEFSR0VUKHRocmlmdGwgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0bC5sbCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdGwuY2MpCitBRERfRkxFWF9CSVNPTl9ERVBFTkRFTkNZKHRocmlmdGwgdGhyaWZ0eSkKKworc2V0KHBhcnNlX1NPVVJDRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdGwuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuaGgKKykKKworYWRkX2xpYnJhcnkocGFyc2UgU1RBVElDICR7cGFyc2VfU09VUkNFU30pCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgY29tcGlsZXIKK3NldChjb21waWxlcl9jb3JlCisgICAgc3JjL3RocmlmdC9jb21tb24uY2MKKyAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKKyAgICBzcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgKKykKKworc2V0KHRocmlmdC1jb21waWxlcl9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9tYWluLmNjCisgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorKQorCitzZXQodGhyaWZ0X2NvbXBpbGVyX0xBTkdTCispCisKKyMgVGhpcyBtYWNybyBhZGRzIGFuIG9wdGlvbiBUSFJJRlRfQ09NUElMRVJfJHtOQU1FfQorIyB0aGF0IGFsbG93cyBlbmFibGluZyBvciBkaXNhYmxpbmcgY2VydGFpbiBsYW5ndWFnZXMKK21hY3JvKFRIUklGVF9BRERfQ09NUElMRVIgbmFtZSBkZXNjcmlwdGlvbiBpbml0aWFsKQorICAgIHN0cmluZyhUT1VQUEVSICJUSFJJRlRfQ09NUElMRVJfJHtuYW1lfSIgZW5hYmxlcikKKyAgICBzZXQoc3JjICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfJHtuYW1lfV9nZW5lcmF0b3IuY2MiKQorICAgIG9wdGlvbigke2VuYWJsZXJ9ICR7ZGVzY3JpcHRpb259ICR7aW5pdGlhbH0pCisgICAgaWYoJHtlbmFibGVyfSkKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMgJHtzcmN9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnRfY29tcGlsZXJfTEFOR1MgJHtuYW1lfSkKKyAgICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgVGhlIGZvbGxvd2luZyBjb21waWxlciBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorVEhSSUZUX0FERF9DT01QSUxFUihjX2dsaWIgICJFbmFibGUgY29tcGlsZXIgZm9yIEMgd2l0aCBHbGliIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoY3BwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDKysiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEiICAgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGFzMyAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQWN0aW9uU2NyaXB0IDMiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihkYXJ0ICAgICJFbmFibGUgY29tcGlsZXIgZm9yIERhcnQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihoYXhlICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhheGUiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihjc2hhcnAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMjIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihweSAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFB5dGhvbiAyLjAiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihyYiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1YnkiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihwZXJsICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBlcmwiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihwaHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBIUCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGVybCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRXJsYW5nIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoY29jb2EgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBPYmplY3RpdmUtQyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHN3aWZ0ICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgU3dpZnQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihzdCAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFNtYWxsdGFsayIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKG9jYW1sICAgIkVuYWJsZSBjb21waWxlciBmb3IgT0NhbWwiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihocyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhhc2tlbGwiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUih4c2QgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhTRCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGh0bWwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSFRNTCBEb2N1bWVudGF0aW9uIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoanMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhU2NyaXB0IiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoanNvbiAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKU09OIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoamF2YW1lICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhIE1FIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZGVscGhpICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEZWxwaGkiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihnbyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdvIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZCAgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIobHVhICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBMdWEiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihndiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdyYXBoVml6IiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocnMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdXN0IiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoeG1sICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBYTUwiIE9OKQorCisjIFRocmlmdCBpcyBsb29raW5nIGZvciBpbmNsdWRlIGZpbGVzIGluIHRoZSBzcmMgZGlyZWN0b3J5CisjIHdlIGFsc28gYWRkIHRoZSBjdXJyZW50IGJpbmFyeSBkaXJlY3RvcnkgZm9yIGdlbmVyYXRlZCBmaWxlcworaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gc3JjKQorCitpZihOT1QgREVGSU5FRCBXSVRIX1BMVUdJTiBPUiBOT1QgJHtXSVRIX1BMVUdJTn0pCisgICAgbGlzdChBUFBFTkQgdGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMgJHtjb21waWxlcl9jb3JlfSkKK2VuZGlmKCkKKworYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWNvbXBpbGVyICR7dGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVN9KQorCitpZigke1dJVEhfUExVR0lOfSkKKyAgICBhZGRfZXhlY3V0YWJsZSh0aHJpZnQtYm9vdHN0cmFwICR7Y29tcGlsZXJfY29yZX0KKyAgICAgICAgc3JjL3RocmlmdC9tYWluLmNjCisgICAgICAgIHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKKyAgICApCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRocmlmdC1ib290c3RyYXAgcGFyc2UpCisKKyAgICBzZXQoUExVR0lOX0dFTl9TT1VSQ0VTCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5jcHAKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5oCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCisgICAgKQorCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbikKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7UExVR0lOX0dFTl9TT1VSQ0VTfQorICAgICAgICBERVBFTkRTIHRocmlmdC1ib290c3RyYXAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdAorICAgICAgICBDT01NQU5EIHRocmlmdC1ib290c3RyYXAgLWdlbiBjcHAKKyAgICAgICAgLW91dCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbgorICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdAorICAgICkKKworICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vbGliL2NwcC9zcmMpCisKKyAgICBpbmNsdWRlKFRocmlmdE1hY3JvcykKKyAgICBBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0YworICAgICAgICAke2NvbXBpbGVyX2NvcmV9CisgICAgICAgICR7UExVR0lOX0dFTl9TT1VSQ0VTfQorICAgICAgICBzcmMvdGhyaWZ0L2xvZ2dpbmcuY2MKKyAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYworICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MKKyAgICApCisgICAgVEFSR0VUX0lOQ0xVREVfRElSRUNUT1JJRVNfVEhSSUZUKHRocmlmdGMgUFVCTElDICR7Qm9vc3RfSU5DTFVERV9ESVJTfSkKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0YyB0aHJpZnQgUFVCTElDKQorICAgIHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKHRocmlmdC1jb21waWxlciBQVUJMSUMgVEhSSUZUX0VOQUJMRV9QTFVHSU4pCisgICAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdC1jb21waWxlciB0aHJpZnRjKQorZW5kaWYoKQorCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0LWNvbXBpbGVyIFBST1BFUlRJRVMgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZIGJpbi8pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0LWNvbXBpbGVyIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgdGhyaWZ0KQorCit0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWNvbXBpbGVyIHBhcnNlKQorCitpbnN0YWxsKFRBUkdFVFMgdGhyaWZ0LWNvbXBpbGVyIERFU1RJTkFUSU9OIGJpbikKKworaWYoJHtXSVRIX1BMVUdJTn0pCisgICMgSW5zdGFsbCB0aGUgaGVhZGVycworICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9jb21tb24uaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dsb2JhbHMuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2xvZ2dpbmcuaCIKKyAgICAgICJzcmMvdGhyaWZ0L21haW4uaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BsYXRmb3JtLmgiCisgICAgICAiJHtDTUFLRV9CSU5BUllfRElSfS9jb21waWxlci9jcHAvdGhyaWZ0L3ZlcnNpb24uaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdCIpCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC9hdWRpdCIpCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgorICAgICAgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIgorICAgICAgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQvZ2VuZXJhdGUiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9saXN0LmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X21hcC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC9wYXJzZSIpCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgiCisgICAgICAic3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQvcGx1Z2luIikKK2lmKE1TVkMpCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQvd2luZG93cyIpCitlbmRpZigpCitlbmRpZigpCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtIGIvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCmluZGV4IDg5MmI5YTAuLjBiOGVmMmUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQorKysgYi9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0KQEAgLTIxLDEwMCArMjEsMTg3IEBACiAjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCiAjIGRldGFpbHMuCiAKLUFNX1lGTEFHUyA9IC1kCi1CVUlMVF9TT1VSQ0VTID0KK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCisjIE5vdGUgb24gd2h5IHdlIGhhdmUgc3JjL3RocmlmdCBhbmQgc3JjL3RocmlmdC9wbHVnaW4gZGlyZWN0b3JpZXM6CisjIFNpbmNlIEF1dG9tYWtlIHN1cHBvcnRzIG9ubHkgb25lIHNldCBvZiBCVUlMVF9TT1VSQ0VTIHBlciBmaWxlIGFuZCBkb2VzIG5vdCBhbGxvdworIyBTVUJESVJTIGJ1aWx0IGJlZm9yZSBCVUlMVF9TT1VSQ0VTLCB3ZSBlbmQgdXAgc2VwYXJhdGUgTWFrZWZpbGUuYW0gZm9yIGVhY2ggc291cmNlCisjIGNvZGUgZ2VuZXJhdGlvbiwgaS5lLiBsZXgteWFjYyBhbmQgVGhyaWZ0LCB0byBhY2hpZXZlIHN0YWJsZSBwYXJhbGxlbCBtYWtlLgorCitTVUJESVJTID0gc3JjIHNyYy90aHJpZnQvcGx1Z2luIC4KK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKIAogYmluX1BST0dSQU1TID0gdGhyaWZ0CiAKIHRocmlmdF9PQkpESVIgPSBvYmoKIAotdGhyaWZ0X1NPVVJDRVMgPSBzcmMvdGhyaWZ0eS55eSBcCi0gICAgICAgICAgICAgICAgIHNyYy90aHJpZnRsLmxsIFwKLSAgICAgICAgICAgICAgICAgc3JjL21haW4uY2MgXAotICAgICAgICAgICAgICAgICBzcmMvbWQ1LmMgXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICBzcmMvZ2xvYmFscy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL21haW4uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wbGF0Zm9ybS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL21kNS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZG9jLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF90eXBlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9iYXNlX3R5cGUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2VudW0uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2VudW1fdmFsdWUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3R5cGVkZWYuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2NvbnRhaW5lci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfbGlzdC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc2V0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9tYXAuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3N0cnVjdC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZmllbGQuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3NlcnZpY2UuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2Z1bmN0aW9uLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9wcm9ncmFtLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zY29wZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfY29uc3QuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmggXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaAorcGx1Z2luX2dlbiA9IHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuY3BwIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmggXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCiAKLWlmIFRIUklGVF9HRU5fY3BwCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9qYXZhCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fYXMzCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9jc2hhcnAKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX3B5Ci10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX3JiCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX3BlcmwKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9waHAKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKLWVuZGlmCi1pZiBUSFJJRlRfR0VOX2VybAotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fY29jb2EKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fc3QKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fb2NhbWwKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5faHMKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5feHNkCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCi1lbmRpZgotaWYgVEhSSUZUX0dFTl9odG1sCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwotZW5kaWYKLWlmIFRIUklGVF9HRU5fanMKLXRocmlmdF9TT1VSQ0VTICs9IHNyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYworY29tcGlsZXJfY29yZSA9ICBzcmMvdGhyaWZ0L2NvbW1vbi5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb21tb24uY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nbG9iYWxzLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsYXRmb3JtLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2xvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIAorCit0aHJpZnRfU09VUkNFUyA9IHNyYy90aHJpZnQvbWFpbi5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9tYWluLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCisKKyMgU3BlY2lmaWMgY2xpZW50IGdlbmVyYXRvciBzb3VyY2UKK3RocmlmdF9TT1VSQ0VTICs9IHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9zd2lmdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jbF9nZW5lcmF0b3IuY2MKKwordGhyaWZ0X0NQUEZMQUdTID0gLUkkKHNyY2Rpcikvc3JjCit0aHJpZnRfQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtV2Vycm9yCit0aHJpZnRfTERBREQgPSBATEVYTElCQCBzcmMvdGhyaWZ0L2xpYnBhcnNlLmEKKworaWYgIVdJVEhfUExVR0lOCit0aHJpZnRfU09VUkNFUyArPSAkKGNvbXBpbGVyX2NvcmUpCitlbHNlCisKK2xpYl9MVExJQlJBUklFUyA9IGxpYnRocmlmdGMubGEKKwordGhyaWZ0X0NQUEZMQUdTICs9IC1EVEhSSUZUX0VOQUJMRV9QTFVHSU49MQordGhyaWZ0X0xEQUREICs9IGxpYnRocmlmdGMubGEKKworbm9kaXN0X2xpYnRocmlmdGNfbGFfU09VUkNFUyA9ICQocGx1Z2luX2dlbikKK2xpYnRocmlmdGNfbGFfU09VUkNFUyA9ICQoY29tcGlsZXJfY29yZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9sb2dnaW5nLmNjCisKKworbGlidGhyaWZ0Y19sYV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpL3NyYyAtSXNyYyAtSSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL3NyYyAtRFRIUklGVF9FTkFCTEVfUExVR0lOPTEKK2xpYnRocmlmdGNfbGFfQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworbGlidGhyaWZ0Y19sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdAoraW5jbHVkZV90aHJpZnRfSEVBREVSUyA9IHNyYy90aHJpZnQvY29tbW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2xvYmFscy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2xvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9tYWluLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGxhdGZvcm0uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC92ZXJzaW9uLmgKKworaW5jbHVkZV9hdWRpdGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3dpbmRvd3MKK2luY2x1ZGVfYXVkaXRfSEVBREVSUyA9IHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCisKK2luY2x1ZGVfZ2VuZXJhdGVkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9nZW5lcmF0ZQoraW5jbHVkZV9nZW5lcmF0ZV9IRUFERVJTID0gc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIAorCitpbmNsdWRlX3BhcnNlZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcGFyc2UKK2luY2x1ZGVfcGFyc2VfSEVBREVSUyA9IHNyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgKKworaW5jbHVkZV9wbHVnaW5kaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wbHVnaW4KK2luY2x1ZGVfcGx1Z2luX0hFQURFUlMgPSBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaAorCitpbmNsdWRlX3dpbmRvd3NkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS93aW5kb3dzCitpbmNsdWRlX3dpbmRvd3NfSEVBREVSUyA9IHNyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAogZW5kaWYKIAotdGhyaWZ0X0NYWEZMQUdTID0gLVdhbGwgLUkkKHNyY2Rpcikvc3JjICQoQk9PU1RfQ1BQRkxBR1MpCi10aHJpZnRfTERGTEFHUyA9IC1XYWxsICQoQk9PU1RfTERGTEFHUykKK1dJTkRPV1NfRElTVCA9IFwKKyAgICAgICAgICAgICBjb21waWxlci5zbG4gXAorICAgICAgICAgICAgIGNvbXBpbGVyLnZjeHByb2ogXAorICAgICAgICAgICAgIGNvbXBpbGVyLnZjeHByb2ouZmlsdGVycwogCi10aHJpZnRfTERBREQgPSBATEVYTElCQAotCi1FWFRSQV9ESVNUID0gUkVBRE1FCitFWFRSQV9ESVNUID0gXAorICAgICAgICAgICAgIGNvZGluZ19zdGFuZGFyZHMubWQgXAorICAgICAgICAgICAgIFJFQURNRS5tZCBcCisgICAgICAgICAgICAgQ01ha2VMaXN0cy50eHQgXAorICAgICAgICAgICAgIHRlc3QgXAorICAgICAgICAgICAgICQoV0lORE9XU19ESVNUKQogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSB0aHJpZnRsLmNjIHRocmlmdHkuY2MgdGhyaWZ0eS5oIHZlcnNpb24uaAorCSQoUk0pIHZlcnNpb24uaCAkKHBsdWdpbl9nZW4pCiAKLXNyYy9tYWluLmNjOiB2ZXJzaW9uLmgKK3NyYy90aHJpZnQvbWFpbi5jYzogc3JjL3RocmlmdC92ZXJzaW9uLmgKKworc3R5bGUtbG9jYWw6CisgICQoQ1BQU1RZTEVfQ01EKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL1JFQURNRSBiL2NvbXBpbGVyL2NwcC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTAwYTguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLVRocmlmdCBDb2RlIENvbXBpbGVyCi0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVRocmlmdCBDb2RlIENvbXBpbGVyCi09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGNvbXBpbGVyIHRha2VzIHRocmlmdCBmaWxlcyBhcyBpbnB1dCBhbmQgZ2VuZXJhdGVzIG91dHB1dCBjb2RlIGFjcm9zcwotdmFyaW91cyBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIFRvIGJ1aWxkIGFuZCBpbnN0YWxsIGl0LCBkbyB0aGlzOgotCi0gIC4vYm9vdHN0cmFwLnNoCi0gIC4vY29uZmlndXJlCi0gIG1ha2UKLSAgc3VkbyBtYWtlIGluc3RhbGwKLQotSXQgcmVxdWlyZXMgc29tZSBmb3JtIG9mIExFWCBhbmQgWUFDQyB0byBiZSBpbnN0YWxsZWQsIHdoaWNoIHNob3VsZCBiZQotcGlja2VkIHVwIGJ5IGF1dG9jb25mLgotCi1Ob3QgbXVjaCBlbHNlIHRvIHJlcG9ydCBoZXJlLiBZb3UnbGwgaGF2ZSB0byBsb29rIGF0IHRoZSBjb2RlIHRvIGdldCB5b3VyCi1xdWVzdGlvbnMgYW5zd2VyZWQuIE9yIGp1c3QgcnVuIHRoZSBleGVjdXRhYmxlIGFmdGVyIHlvdSBidWlsZCBhbmQgdGFrZQotYSBsb29rIGF0IHRoZSB1c2FnZSBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL1JFQURNRS5tZCBiL2NvbXBpbGVyL2NwcC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlYWM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9SRUFETUUubWQKQEAgLTAsMCArMSwxNzUgQEAKKyMgQnVpbGQgVGhyaWZ0IElETCBjb21waWxlciB1c2luZyBDTWFrZQorCis8IS0tIFRPQyAtLT4KKworLSBbQnVpbGQgVGhyaWZ0IElETCBjb21waWxlciB1c2luZyBDTWFrZV0oI2J1aWxkLXRocmlmdC1pZGwtY29tcGlsZXItdXNpbmctY21ha2UpCisgICAgLSBbQnVpbGQgb24gVW5peC1saWtlIFN5c3RlbV0oI2J1aWxkLW9uLXVuaXgtbGlrZS1zeXN0ZW0pCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXNdKCNwcmVyZXF1aXNpdGVzKQorICAgICAgICAtIFtCdWlsZCB1c2luZyBDTWFrZV0oI2J1aWxkLXVzaW5nLWNtYWtlKQorICAgICAgICAgICAgLSBbQnVpbGQgd2l0aCBFY2xpcHNlIElERV0oI2J1aWxkLXdpdGgtZWNsaXBzZS1pZGUpCisgICAgICAgICAgICAtIFtCdWlsZCB3aXRoIFhDb2RlIElERSBpbiBNYWNPU10oI2J1aWxkLXdpdGgteGNvZGUtaWRlLWluLW1hY29zKQorICAgICAgICAgICAgLSBbVXNhZ2Ugb2Ygb3RoZXIgSURFc10oI3VzYWdlLW9mLW90aGVyLWlkZXMpCisgICAgLSBbQnVpbGQgb24gV2luZG93c10oI2J1aWxkLW9uLXdpbmRvd3MpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXNdKCNwcmVyZXF1aXNpdGVzLTEpCisgICAgICAgIC0gW0J1aWxkIHVzaW5nIEdpdCBCYXNoXSgjYnVpbGQtdXNpbmctZ2l0LWJhc2gpCisgICAgICAgIC0gW1VzaW5nIFZpc3VhbCBTdHVkaW8gYW5kIFdpbiBmbGV4LWJpc29uXSgjdXNpbmctdmlzdWFsLXN0dWRpby1hbmQtd2luLWZsZXgtYmlzb24pCisgICAgICAgIC0gW0Nyb3NzIGNvbXBpbGUgdXNpbmcgbWluZ3czMiBhbmQgZ2VuZXJhdGUgYSBXaW5kb3dzIEluc3RhbGxlciB3aXRoIENQYWNrXSgjY3Jvc3MtY29tcGlsZS11c2luZy1taW5ndzMyLWFuZC1nZW5lcmF0ZS1hLXdpbmRvd3MtaW5zdGFsbGVyLXdpdGgtY3BhY2spCistIFtPdGhlciBjYXNlc10oI290aGVyLWNhc2VzKQorICAgIC0gW0J1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3Mgd2l0aG91dCBDTWFrZV0oI2J1aWxkaW5nLXRoZS10aHJpZnQtaWRsLWNvbXBpbGVyLWluLXdpbmRvd3Mtd2l0aG91dC1jbWFrZSkKKy0gW1VuaXQgdGVzdHMgZm9yIGNvbXBpbGVyXSgjdW5pdC10ZXN0cy1mb3ItY29tcGlsZXIpCisgICAgLSBbVXNpbmcgYm9vc3QgdGVzdF0oI3VzaW5nLWJvb3N0LXRlc3QpCisgICAgLSBbVXNpbmcgQ2F0Y2ggQysrIHRlc3QgbGlicmFyeV0oI3VzaW5nLWNhdGNoLWMtdGVzdC1saWJyYXJ5KQorLSBbSGF2ZSBhIEhhcHB5IGZyZWUgdGltZSBhbmQgaG9saWRheXNdKCNoYXZlLWEtaGFwcHktZnJlZS10aW1lLWFuZC1ob2xpZGF5cykKKworPCEtLSAvVE9DIC0tPgorCisjIyBCdWlsZCBvbiBVbml4LWxpa2UgU3lzdGVtCisKKyMjIyBQcmVyZXF1aXNpdGVzCistIEluc3RhbGwgQ01ha2UKKy0gSW5zdGFsbCBmbGV4IGFuZCBiaXNvbgorCisjIyMgQnVpbGQgdXNpbmcgQ01ha2UKKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBVc2UgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB1c2luZyBjbWFrZToKKworYGBgCitta2RpciBjbWFrZS1idWlsZCAmJiBjZCBjbWFrZS1idWlsZAorY21ha2UgLi4KK21ha2UKK2BgYAorCisjIyMjIEJ1aWxkIHdpdGggRWNsaXBzZSBJREUKKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBVc2UgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB1c2luZyBjbWFrZToKKworYGBgCitta2RpciBjbWFrZS1lYyAmJiBjZCBjbWFrZS1lYworY21ha2UgLUcgIkVjbGlwc2UgQ0RUNCAtIFVuaXggTWFrZWZpbGVzIiAuLgorbWFrZQorYGBgCisKK05vdyBvcGVuIHRoZSBmb2xkZXIgY21ha2UtZWMgdXNpbmcgZWNsaXBzZS4KKworIyMjIyBCdWlsZCB3aXRoIFhDb2RlIElERSBpbiBNYWNPUworCistIEluc3RhbGwvdXBkYXRlIGZsZXgsIGJpc29uIGFuZCBjbWFrZSB3aXRoIGJyZXcKKworYGBgCiticmV3IGluc3RhbGwgY21ha2UKK2JyZXcgaW5zdGFsbCBiaXNvbgorYGBgCisKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gUnVuIGNvbW1hbmRzIGluIGNvbW1hbmQgbGluZToKKworYGBgCitta2RpciBjbWFrZS1idWlsZCAmJiBjZCBjbWFrZS1idWlsZAorY21ha2UgLUcgIlhjb2RlIiAtRFdJVEhfUExVR0lOPU9GRiAuLgorY21ha2UgLS1idWlsZCAuCitgYGAKKworIyMjIyBVc2FnZSBvZiBvdGhlciBJREVzCisKK1BsZWFzZSBjaGVjayBsaXN0IG9mIHN1cHBvcnRlZCBJREUgCisKK2BgYAorY21ha2UgLS1oZWxwCitgYGAKKworIyMgQnVpbGQgb24gV2luZG93cworCisjIyMgUHJlcmVxdWlzaXRlcworLSBJbnN0YWxsIENNYWtlIC0gaHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvCistIEluIGNhc2UgaWYgeW91IHdhbnQgdG8gYnVpbGQgd2l0aG91dCBHaXQgQmFzaCAtIGluc3RhbGwgd2luZmxleGJpc29uIC0gaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZmxleGJpc29uLworLSBJbiBjYXNlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHdpdGggVmlzdWFsIFN0dWRpbyAtIGluc3RhbGwgVmlzdWFsIFN0dWRpbyAKKyAgLSBCZXR0ZXIgdG8gdXNlIHRoZSBsYXRlc3Qgc3RhYmxlIFZpc3VhbCBTdHVkaW8gQ29tbXVuaXR5IEVkaXRpb24gLSBodHRwczovL3d3dy52aXN1YWxzdHVkaW8uY29tL3ZzL3doYXRzbmV3LyAoZW5zdXJlIHRoYXQgeW91IGluc3RhbGxlZCB3b3JrbG9hZCAiRGVza3RvcCBEZXZlbG9wbWVudCB3aXRoIEMrKyIgZm9yIFZTMjAxNykgLSBNaWNyb3NvZnQgYWRkZWQgc29tZSBzdXBwb3J0IGZvciBDTWFrZSBhbmQgaW1wcm92aW5nIGl0IGluIFZpc3VhbCBTdHVkaW8KKworIyMjIEJ1aWxkIHVzaW5nIEdpdCBCYXNoCisKK0dpdCBCYXNoIHByb3ZpZGVzIGZsZXggYW5kIGJpc29uCisKKy0gR28gdG8gKip0aHJpZnRcY29tcGlsZXJcY3BwKioKKy0gVXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdXNpbmcgY21ha2U6CisKK2BgYAorbWtkaXIgY21ha2UtdnMgJiYgY2QgY21ha2UtdnMKK2NtYWtlIC1EV0lUSF9TSEFSRURfTElCPW9mZiAuLgorY21ha2UgLS1idWlsZCAuCitgYGAKKworIyMjIFVzaW5nIFZpc3VhbCBTdHVkaW8gYW5kIFdpbiBmbGV4LWJpc29uCisKKy0gR2VuZXJhdGUgYSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZm9yIHZlcnNpb24gb2YgVmlzdWFsIFN0dWRpbyB3aGljaCB5b3UgaGF2ZSAoKipjbWFrZSAtLWhlbHAqKiBjYW4gc2hvdyBsaXN0IG9mIHN1cHBvcnRhYmxlIFZTIHZlcnNpb25zKToKKy0gUnVuIGNvbW1hbmRzIGluIGNvbW1hbmQgbGluZToKK2BgYAorbWtkaXIgY21ha2UtdnMKK2NkIGNtYWtlLXZzCitjbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxNSAyMDE3IiAtRFdJVEhfUExVR0lOPU9GRiAuLgorYGBgCistIE5vdyBvcGVuIHRoZSBmb2xkZXIgY21ha2UtdnMgdXNpbmcgVmlzdWFsIFN0dWRpby4KKworIyMjIENyb3NzIGNvbXBpbGUgdXNpbmcgbWluZ3czMiBhbmQgZ2VuZXJhdGUgYSBXaW5kb3dzIEluc3RhbGxlciB3aXRoIENQYWNrCisKK2BgYAorbWtkaXIgY21ha2UtbWluZ3czMiAmJiBjZCBjbWFrZS1taW5ndzMyCitjbWFrZSAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC1EQlVJTERfQ09NUElMRVI9T04gLURCVUlMRF9MSUJSQVJJRVM9T0ZGIC1EQlVJTERfVEVTVElORz1PRkYgLURCVUlMRF9FWEFNUExFUz1PRkYgLi4KK2NwYWNrCitgYGAKKworIyBPdGhlciBjYXNlcworCisjIyBCdWlsZGluZyB0aGUgVGhyaWZ0IElETCBjb21waWxlciBpbiBXaW5kb3dzIHdpdGhvdXQgQ01ha2UKKworSWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIENNYWtlIHlvdSBjYW4gdXNlIHRoZSBhbHJlYWR5IGF2YWlsYWJsZSBWaXN1YWwgU3R1ZGlvIDIwMTAgc29sdXRpb24uCisKK1RoZSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgY29udGFpbnMgcHJlLWJ1aWxkIGNvbW1hbmRzIHRvIGdlbmVyYXRlIHRoZSB0aHJpZnRsLmNjLCB0aHJpZnR5LmNjIGFuZCB0aHJpZnR5LmhoIGZpbGVzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYnVpbGQgdGhlIGNvbXBpbGVyLiAKKworVGhlc2UgZGVwZW5kIG9uIGJpc29uLCBmbGV4IGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgdG8gd29yayBwcm9wZXJseS4KKworRG93bmxvYWQgZmxleCAmIGJpc29uIGFzIGRlc2NyaWJlZCBhYm92ZS4gCisKK1BsYWNlIHRoZXNlIGJpbmFyaWVzIHNvbWV3aGVyZSBpbiB0aGUgcGF0aCBhbmQgcmVuYW1lIHdpbl9mbGV4LmV4ZSBhbmQgd2luX2Jpc29uLmV4ZSB0byBmbGV4LmV4ZSBhbmQgYmlzb24uZXhlIHJlc3BlY3RpdmVseS4KKworSWYgdGhpcyBkb2Vzbid0IHdvcmsgb24gYSBzeXN0ZW0sIHRyeSB0aGVzZSBtYW51YWwgcHJlLWJ1aWxkIHN0ZXBzLgorCitPcGVuIGNvbXBpbGVyLnNsbiBhbmQgcmVtb3ZlIHRoZSBQcmUtYnVpbGQgY29tbWFuZHMgdW5kZXIgdGhlIHByb2plY3QnczogUHJvcGVydGllcyAtPiBCdWlsZCBFdmVudHMgLT4gUHJlLUJ1aWxkIEV2ZW50cy4KKworRnJvbSBhIGNvbW1hbmQgcHJvbXB0OgorYGBgCitjZCB0aHJpZnQvY29tcGlsZXIvY3BwCitmbGV4IC1vIHNyY1x0aHJpZnRcdGhyaWZ0bC5jYyBzcmNcdGhyaWZ0XHRocmlmdGwubGwKK2BgYAorSW4gdGhlIGdlbmVyYXRlZCB0aHJpZnRsLmNjLCBjb21tZW50IG91dCAjaW5jbHVkZSA8dW5pc3RkLmg+CisKK1BsYWNlIGEgY29weSBvZiBiaXNvbi5zaW1wbGUgaW4gdGhyaWZ0L2NvbXBpbGVyL2NwcAorYGBgCitiaXNvbiAteSAtbyAic3JjL3RocmlmdC90aHJpZnR5LmNjIiAtLWRlZmluZXMgc3JjL3RocmlmdC90aHJpZnR5Lnl5Cittb3ZlIHNyY1x0aHJpZnRcdGhyaWZ0eS5jYy5oaCAgc3JjXHRocmlmdFx0aHJpZnR5LmhoCitgYGAKKworQmlzb24gbWlnaHQgZ2VuZXJhdGUgdGhlIHlhY2MgaGVhZGVyIGZpbGUgInRocmlmdHkuY2MuaCIgd2l0aCBqdXN0IG9uZSBoICIuaCIgZXh0ZW5zaW9uOyBpbiB0aGlzIGNhc2UgeW91J2xsIGhhdmUgdG8gcmVuYW1lIHRvICJ0aHJpZnR5LmgiLgorCitgYGAKK21vdmUgc3JjXHRocmlmdFx2ZXJzaW9uLmguaW4gc3JjXHRocmlmdFx2ZXJzaW9uLmgKK2BgYAorCitEb3dubG9hZCBpbnR0eXBlcy5oIGZyb20gdGhlIGludGVyd2VicyBhbmQgcGxhY2UgaXQgaW4gYW4gaW5jbHVkZSBwYXRoCitsb2NhdGlvbiAoZS5nLiB0aHJpZnQvY29tcGlsZXIvY3BwL3NyYykuCisKK0J1aWxkIHRoZSBjb21waWxlciBpbiBWaXN1YWwgU3R1ZGlvLgorCisjIFVuaXQgdGVzdHMgZm9yIGNvbXBpbGVyCisKKyMjIFVzaW5nIGJvb3N0IHRlc3QKKy0gcGxzIGNoZWNrICoqdGVzdCoqIGZvbGRlcgorCisjIyBVc2luZyBDYXRjaCBDKysgdGVzdCBsaWJyYXJ5CisKK0FkZGVkIGdlbmVyaWMgd2F5IHRvIGNvdmVyIGNvZGUgYnkgdGVzdHMgZm9yIG1hbnkgbGFuZ3VhZ2VzICh5b3UganVzdCBuZWVkIHRvIG1ha2UgYSBjb3JyZWN0IGhlYWRlciBmaWxlIGZvciBnZW5lcmF0b3IgZm9yIHlvdXIgbGFuZ3VhZ2UgLSBleGFtcGxlIGluICoqbmV0Y29yZSoqIGltcGxlbWVudGF0aW9uKQorCistIHBscyBjaGVjayAqKnRlc3RzKiogZm9sZGVyCisKKyMgSGF2ZSBhIEhhcHB5IGZyZWUgdGltZSBhbmQgaG9saWRheXMgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQgYi9jb21waWxlci9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTA4OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw0IEBACisjIyBDb21waWxlciBDb2RpbmcgU3RhbmRhcmRzCisKKyAqIFdoZW4gbWFraW5nIHNtYWxsIGNoYW5nZSAvIGJ1Z2ZpeCAtIGZvbGxvdyBzdHlsZSBhcyBzZWVuIGluIG5lYXJieSBjb2RlLgorICogV2hlbiBtYWtpbmcgbWFqb3IgcmVmYWN0b3IgYW5kIC8gb3IgYWRkaW5nIG5ldyBmZWF0dXJlIC0gZm9sbG93IHN0eWxlIGZvciBDKysgbGlicmFyeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci5zbG4gYi9jb21waWxlci9jcHAvY29tcGlsZXIuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTYxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvY29tcGlsZXIuc2xuCkBAIC0wLDAgKzEsMjAgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImNvbXBpbGVyIiwgImNvbXBpbGVyLnZjeHByb2oiLCAiezg5OTc1QTFBLUY3OTktNDU1Ni05OEI4LTY0RTMwQUIzOUE5MH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXs4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7ODk5NzVBMUEtRjc5OS00NTU2LTk4QjgtNjRFMzBBQjM5QTkwfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezg5OTc1QTFBLUY3OTktNDU1Ni05OEI4LTY0RTMwQUIzOUE5MH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyOGI1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qCkBAIC0wLDAgKzEsMjUwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXVkaXRcdF9hdWRpdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb21tb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nZW5lcmF0b3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9vb3BfZ2VuZXJhdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaHRtbF9nZW5lcmF0b3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2xvYmFscy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxtYWluLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfYmFzZV90eXBlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfY29uc3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9jb25zdF92YWx1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2NvbnRhaW5lci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2RvYy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2VudW0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9lbnVtX3ZhbHVlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZmllbGQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9mdW5jdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2xpc3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9tYXAuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9wcm9ncmFtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc2NvcGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9zZXJ2aWNlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc3RydWN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfdHlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGVkZWYuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGxhdGZvcm0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0eS5oaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdmVyc2lvbi5oIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXVkaXRcdF9hdWRpdC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbW1vbi5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NvY29hX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jcHBfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NzaGFycF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfbmV0Y29yZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY19nbGliX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kYXJ0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2VybF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dvX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9ndl9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaGF4ZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaHNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2phdmFtZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfamF2YV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfanNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2pzb25fZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2x1YV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfb2NhbWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BlcmxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BocF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcHlfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9yc19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3N3aWZ0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF94bWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3hzZF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XG1haW4uY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHBhcnNlLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGVkZWYuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdGwuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkuY2MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0bC5sbCIgLz4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkueXkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPns4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9PC9Qcm9qZWN0R3VpZD4KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+CisgICAgPFJvb3ROYW1lc3BhY2U+Y29tcGlsZXI8L1Jvb3ROYW1lc3BhY2U+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcd2luZG93c1w7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICAgIDxUYXJnZXROYW1lPnRocmlmdDwvVGFyZ2V0TmFtZT4KKyAgICA8RXhlY3V0YWJsZVBhdGg+JChFeGVjdXRhYmxlUGF0aCk7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxHaXRcYmluPC9FeGVjdXRhYmxlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgorICAgIDxMaW5rSW5jcmVtZW50YWw+dHJ1ZTwvTGlua0luY3JlbWVudGFsPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcd2luZG93c1w7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICAgIDxUYXJnZXROYW1lPnRocmlmdDwvVGFyZ2V0TmFtZT4KKyAgICA8RXhlY3V0YWJsZVBhdGg+JChFeGVjdXRhYmxlUGF0aCk7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxHaXRcYmluPC9FeGVjdXRhYmxlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x3aW5kb3dzXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPFRhcmdldE5hbWU+dGhyaWZ0PC9UYXJnZXROYW1lPgorICAgIDxFeGVjdXRhYmxlUGF0aD4kKEV4ZWN1dGFibGVQYXRoKTtDOlxQcm9ncmFtIEZpbGVzICh4ODYpXEdpdFxiaW48L0V4ZWN1dGFibGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x3aW5kb3dzXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPFRhcmdldE5hbWU+dGhyaWZ0PC9UYXJnZXROYW1lPgorICAgIDxFeGVjdXRhYmxlUGF0aD4kKEV4ZWN1dGFibGVQYXRoKTtDOlxQcm9ncmFtIEZpbGVzICh4ODYpXEdpdFxiaW48L0V4ZWN1dGFibGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TUlOR1c7WVlfTk9fVU5JU1REX0g7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcY29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQ3BwPC9Db21waWxlQXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgICA8UHJlQnVpbGRFdmVudD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TUlOR1c7WVlfTk9fVU5JU1REX0g7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcY29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQ3BwPC9Db21waWxlQXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgICA8UHJlQnVpbGRFdmVudD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TUlOR1c7WVlfTk9fVU5JU1REX0g7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcY29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQ3BwPC9Db21waWxlQXM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgICA8UHJlQnVpbGRFdmVudD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgICA8Q29tbWFuZD5mbGV4IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0bC5jYyIgc3JjL3RocmlmdC90aHJpZnRsLmxsICZhbXA7JmFtcDsgYmlzb24gLXkgLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyY1xcdGhyaWZ0XFx0aHJpZnR5LmhoIiBzcmMvdGhyaWZ0L3RocmlmdHkueXk8L0NvbW1hbmQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ouZmlsdGVycyBiL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2ODY1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSwxOTkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcYXVkaXRcdF9hdWRpdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmgiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfb29wX2dlbmVyYXRvci5oIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmgiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdsb2JhbHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xtYWluLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9iYXNlX3R5cGUuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9jb25zdC5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2NvbnN0X3ZhbHVlLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfY29udGFpbmVyLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZG9jLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZW51bS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2VudW1fdmFsdWUuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9maWVsZC5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2Z1bmN0aW9uLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfbGlzdC5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X21hcC5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3Byb2dyYW0uaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zY29wZS5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3NlcnZpY2UuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zZXQuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zdHJ1Y3QuaCI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF90eXBlLmgiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZWRlZi5oIj4KKyAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwbGF0Zm9ybS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdHkuaGgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcd2luZG93c1xjb25maWcuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x3aW5kb3dzXHZlcnNpb24uaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJ3aW5kb3dzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnthZTlkMGExNS01N2FlLTRmMDEtODdhNC04MWY3OTAyNDliODN9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0icGFyc2UiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezVkZjAxNmJiLTU5MWItNDIwYS1hNTM1LTQzMzBkOTE4N2ZiZn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJnZW5lcmF0ZSI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YjVjNjI2YWYtYWZhNS00MzNjLThlMTAtZWU3MzQ1MzNjYjY4fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcYXVkaXRcdF9hdWRpdC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2FzM19nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY29jb2FfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NwcF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY3NoYXJwX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RhcnRfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RlbHBoaV9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZXJsX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ29fZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2d2X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9oYXhlX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9oc19nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaHRtbF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfamF2YW1lX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qYXZhX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qc19nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfb2NhbWxfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3BlcmxfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3BocF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcHlfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9yc19nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3N3aWZ0X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF94c2RfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3htbF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXG1haW4uY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNccGFyc2VccGFyc2UuY2MiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdGwuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3R5cGVkZWYuY2MiPgorICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfanNvbl9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfbHVhX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRsLmxsIiAvPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnR5Lnl5IiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMmM1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworQU1fWUZMQUdTID0gLWQKKworQlVJTFRfU09VUkNFUyA9IHRocmlmdC90aHJpZnR5LmNjCisKK25vaW5zdF9MSUJSQVJJRVMgPSB0aHJpZnQvbGlicGFyc2UuYQorCit0aHJpZnRfbGlicGFyc2VfYV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpCit0aHJpZnRfbGlicGFyc2VfYV9DWFhGTEFHUyA9IC1XYWxsIC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkCisKK3RocmlmdF9saWJwYXJzZV9hX1NPVVJDRVMgPSB0aHJpZnQvdGhyaWZ0eS55eSBcCisgICAgICAgICAgICAgICAgICAgICB0aHJpZnQvdGhyaWZ0bC5sbAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSB0aHJpZnQvdGhyaWZ0bC5jYyB0aHJpZnQvdGhyaWZ0eS5jYyB0aHJpZnQvdGhyaWZ0eS5oIHRocmlmdC90aHJpZnR5LmhoCisKK2lmIFdJVEhfUExVR0lOCitub2luc3RfUFJPR1JBTVMgPSB0aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcAorCit0aHJpZnRfdGhyaWZ0X2Jvb3RzdHJhcF9TT1VSQ0VTID0gXAorICAgICAgICAgICAgICAgICB0aHJpZnQvY29tbW9uLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvY29tbW9uLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9hdWRpdC90X2F1ZGl0LmNwcCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dsb2JhbHMuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wbGF0Zm9ybS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2xvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2RvYy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9lbnVtLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9zZXQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9maWVsZC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9jb25zdC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS9wYXJzZS5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC93aW5kb3dzL2NvbmZpZy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3ZlcnNpb24uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvbWFpbi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L21haW4uY2MKKworbWFpbi5jYzogdmVyc2lvbi5oCisKK3RocmlmdF90aHJpZnRfYm9vdHN0cmFwX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK3RocmlmdF90aHJpZnRfYm9vdHN0cmFwX0xEQUREID0gQExFWExJQkAgdGhyaWZ0L2xpYnBhcnNlLmEKK2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ZiYjUxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogQVMzIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9hczNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2FzM19nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIAotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJiaW5kYWJsZSIpOwotICAgIGJpbmRhYmxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICAKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1hczMiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaW5fY2xhc3M9ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgLy9yZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOwotICB2b2lkIGdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgLy9yZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKLSAgCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICAKLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiAgICAgdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGFzM19wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGFzM190eXBlX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSwgYm9vbCBpbl9pbml0PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJpbmcoKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0gIAotICBib29sIGJpbmRhYmxlXzsJCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0gIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0KLSAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAoZGlyLnNpemUoKSA+IDApIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgcGFja2FnZV9kaXJfID0gc3ViZGlyOwotfQotCi0vKioKLSAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQotICoKLSAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM19wYWNrYWdlKCkgewotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIiAiOwotICB9Ci0gIHJldHVybiAiIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgYXMzIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQXMzIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdHlwZV9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7XG4iICsKLSAgICAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7XG5cbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoKSArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcblxuIjsKLX0KLQotLyoqCi0gKiBOb3RoaW5nIGluIEFzMwotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEFzMywgc2luY2UgaXQgZG9lcwotICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCi0gKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7fQotCi0vKioKLSAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0ZW51bS0+Z2V0X25hbWUoKSkrIi5hcyI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAotICBmX2VudW0gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGFzM19wYWNrYWdlKCkgPDwgZW5kbDsKLSAgCi0gIHNjb3BlX3VwKGZfZW51bSk7Ci0gIC8vIEFkZCBhczMgaW1wb3J0cwotICBmX2VudW0gPDwgc3RyaW5nKCkgKwotICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNldDsiIDw8IGVuZGwgPDwKLSAgImltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5OyIgPDwgZW5kbDsKLSAgCi0gIGluZGVudChmX2VudW0pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGludCB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotCi0gICAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAgICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiOmludCA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KLSAgZl9lbnVtIDw8IGVuZGw7Ci0gIAotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBWQUxJRF9WQUxVRVM6U2V0ID0gbmV3IFNldCgiOwotICBpbmRlbnRfdXAoKTsKLSAgYm9vbCBmaXJzdFZhbHVlID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvLyBwb3B1bGF0ZSBzZXQKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBmaXJzdFZhbHVlID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfZW51bSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMVUVTX1RPX05BTUVTOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKLQotICBzY29wZV91cChmX2VudW0pOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGluZGVudChmX2VudW0pIDw8ICJWQUxVRVNfVE9fTkFNRVNbIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIl0gPSBcIiIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9lbnVtIDw8IGVuZGw7Ci0gIAotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgY2xhc3MKLSAgCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIHBhY2thZ2UKLSAgCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiL0NvbnN0YW50cy5hcyI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfY29uc3RzKTsKLSAgZl9jb25zdHMgPDwgZW5kbDsKLSAgCi0gIGZfY29uc3RzIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLQotIAotICAKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfY29uc3RzKTsKLSAgZl9jb25zdHMuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgCi0gIGluZGVudChvdXQpOwotICBpZiAoIWRlZnZhbCkgewotICAgIG91dCA8PAotICAgIChpbl9zdGF0aWMgPyAidmFyICIgOiAicHVibGljIHN0YXRpYyBjb25zdCAiKTsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOwotICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8ICh0eXBlLT5pc19saXN0KCkgPyAicHVzaCIgOiAiYWRkIikgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0gIAotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0gIAotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCi0gKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9hczNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLQotLyoqCi0gKiBBczMgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodHN0cnVjdC0+Z2V0X25hbWUoKSkrIi5hcyI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICBhczNfcGFja2FnZSgpOwotICAKLSAgc2NvcGVfdXAoZl9zdHJ1Y3QpOwotICBmX3N0cnVjdCA8PCBlbmRsOwotICAKLSAgZl9zdHJ1Y3QgPDwKLSAgICBhczNfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgCi0gIGlmIChiaW5kYWJsZV8gJiYgISBpc19leGNlcHRpb24pIHsKLSAgICBmX3N0cnVjdCA8PCAiaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudDsiIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7IiA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBteC5ldmVudHMuUHJvcGVydHlDaGFuZ2VFdmVudDsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbik7Ci0gIAotICBzY29wZV9kb3duKGZfc3RydWN0KTsgLy8gZW5kIG9mIHBhY2thZ2UKLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBBczMgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKLSAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAotICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KLSAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwotICBib29sIGJpbmRhYmxlID0gISBpc19leGNlcHRpb24gJiYgISBpbl9jbGFzcyAmJiBiaW5kYWJsZV87Ci0KLSAgaW5kZW50KG91dCkgPDwgKGluX2NsYXNzID8gIiIgOiAicHVibGljICIpIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8Ci0gICAgICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXJyb3IgIjsKLSAgfQotICBlbHNlIGlmIChiaW5kYWJsZSkgewotICAgIG91dCA8PCAiZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgIjsKLSAgfQotICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInByaXZhdGUgc3RhdGljIGNvbnN0IFNUUlVDVF9ERVNDOlRTdHJ1Y3QgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKLQotICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1hczMsIHByaXZhdGUgZm9yIC1hczNiZWFuCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHJpdmF0ZSBzdGF0aWMgY29uc3QgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICJfRklFTERfREVTQzpURmllbGQgPSBuZXcgVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsICptX2l0ZXIpOwotICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI6aW50ID0gIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICAKLSAgb3V0IDw8IGVuZGw7Ci0gIAotICAvLyBJbm5lciBJc3NldCBjbGFzcwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSl7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAgICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6Qm9vbGVhbiA9IGZhbHNlOyIgPDwgIGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgfQotICAKLSAgb3V0IDw8IGVuZGw7Ci0gIAotICBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOwotICAKLSAgLy8gU3RhdGljIGluaXRpYWxpemVyIHRvIHBvcHVsYXRlIGdsb2JhbCBjbGFzcyB0byBzdHJ1Y3QgbWV0YWRhdGEgbWFwCi0gIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgbWV0YURhdGFNYXApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8Ci0gICJwdWJsaWMgZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaWYgKGlzX3Jlc3VsdCkgewotICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QsIGJpbmRhYmxlKTsKLSAgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGZpZWxkOlRGaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInN3aXRjaCAoZmllbGQuaWQpIiA8PCBlbmRsOwotCi0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAKLSAgICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKLSAgICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoIV9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICAgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBhczMgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM192YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KXsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7ICAKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gICAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgICBpZiAodHlwZS0+aXNfZW51bSgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKHR5cGUpIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikpeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlRoZSBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiJyBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgaW52YWxpZCB2YWx1ZSBcIiArICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gCi0gIH0gIAotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAotICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCi0gKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQotICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOwotICAgIH0KLQotICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07Ci0KLSAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotCi0gIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElEOmludCwgdmFsdWU6Kik6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOwotCi0gIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOwotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGdldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJRDppbnQpOiogeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLQotICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKLSAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXNTZXQoZmllbGRJRDppbnQpOkJvb2xlYW4geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEFzMyBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKLSAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotICAgICAgICAKLSAgICAvLyBTaW1wbGUgZ2V0dGVyCi0gICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldCAiIDw8IGZpZWxkX25hbWUgPDwgIigpOiIgPDwKLSAgICAgIHR5cGVfbmFtZSh0eXBlKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIAotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOwotICAgIHN0ZDo6c3RyaW5nIHByb3BOYW1lID0gdG1wKCJ0aHJpZnRQcm9wZXJ0eUNoYW5nZSIpOwotICAgIGlmIChiaW5kYWJsZSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIltCaW5kYWJsZShldmVudD1cIiIgPDwgcHJvcE5hbWUgPDwgIlwiKV0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZQotICAgICAgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PAotICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOwotICAgIAotICAgIGlmIChiaW5kYWJsZSkgewotICAgICAgLy8gV2UgaGF2ZSB0byB1c2UgYSBjdXN0b20gZXZlbnQgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQsIGJlY2F1c2UgaWYgeW91IHVzZSB0aGUgZGVmYXVsdCwKLSAgICAgIC8vIHRoZSBzZXR0ZXIgb25seSBnZXRzIGNhbGxlZCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgLSB0aGlzIG1lYW5zIGNhbGxpbmcgZm9vLnNldEludFZhbHVlKDApCi0gICAgICAvLyB3aWxsIG5vdCBjYXVzZSBmb28uaXNJbnRWYWx1ZVNldCgpIHRvIHJldHVybiB0cnVlIHNpbmNlIHRoZSB2YWx1ZSBvZiBmb28uX2ludFZhbHVlIHdhc24ndCBjaGFuZ2VkCi0gICAgICAvLyBzbyB0aGUgc2V0dGVyIHdhcyBuZXZlciBjYWxsZWQuCi0gICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCIiIDw8IHByb3BOYW1lIDw8ICJcIikpOyIgPDwgZW5kbDsKLSAgICAgIAotICAgICAgLy8gSG93ZXZlciwgaWYgeW91IGp1c3QgdXNlIGEgY3VzdG9tIGV2ZW50LCB0aGVuIGNvbGxlY3Rpb25zIHdvbid0IGJlIGFibGUgdG8gZGV0ZWN0IHdoZW4gZWxlbWVudHMKLSAgICAgIC8vIGluIHRoZSBjb2xsZWN0aW9ucyBoYXZlIGNoYW5nZWQgc2luY2UgdGhleSBsaXN0ZWQgZm9yIFByb3BlcnR5Q2hhbmdlRXZlbnRzLiAgU28sIHdlIGRpc3BhdGNoIGJvdGguCi0gICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50LlBST1BFUlRZX0NIQU5HRSkpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIAotICAgIC8vIFVuc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIAotICAgIC8vIGlzU2V0IG1ldGhvZAotICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk6Qm9vbGVhbiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpIHsKLSAgLy8gSWYgaXQncyBiaW5kYWJsZSwgaXQgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgc28gdG9TdHJpbmcgaXMgYW4gb3ZlcnJpZGUuCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGJpbmRhYmxlID8gIm92ZXJyaWRlICIgOiAiIikgPDwgImZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgcmV0OlN0cmluZyA9IG5ldyBTdHJpbmcoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaXJzdDpCb29sZWFuID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHJldCArPSAgXCIsIFwiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInJldCArPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCI7IiA8PCBlbmRsOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJudWxsXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU6U3RyaW5nID0gIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyI8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9ICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIiAoXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIilcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0ICs9IFwiKVwiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KLSAqIGZpZWxkTmFtZSBtYXBwaW5nCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IEZpZWxkTWV0YURhdGEgbWFwcGluZ3MKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgbWV0YURhdGFNYXA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIC8vIFBvcHVsYXRlIG1hcAotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7Ci0KLSAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCi0gICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOwotICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOwotICAgICAgfQotCi0gICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgb3V0ICA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotfQotCi0vKiogCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGFzMyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKLSAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKLSAqLwotc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZXRfYXMzX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQgICA6IHJldHVybiAgICAgICJUVHlwZS5WT0lEIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyA6IHJldHVybiAgICAiVFR5cGUuU1RSSU5HIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0wgICA6IHJldHVybiAgICAgICJUVHlwZS5CT09MIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEUgICA6IHJldHVybiAgICAgICJUVHlwZS5CWVRFIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTE2IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMiAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTMyIjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NCAgICA6IHJldHVybiAgICAgICAiVFR5cGUuSTY0IjsgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSA6IHJldHVybiAgICAiVFR5cGUuRE9VQkxFIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDogdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkpewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSl7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAgIAotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7IAotICAgIH0gZWxzZXsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2FzM190eXBlX3N0cmluZyh0eXBlKTsKLSAgfQotICBvdXQgPDwgIikiOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2UgaW50ZXJmYWNlIGZpbGUKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyIuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICAgIGFzM190eXBlX2ltcG9ydHMoKSA8PAotICAgIGFzM190aHJpZnRfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIAotICAvLyBOb3cgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24vY2xpZW50IGZpbGUKLSAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIkltcGwuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIAotICBmX3NlcnZpY2VfIDw8Ci0gIGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICBhczNfdHlwZV9pbXBvcnRzKCkgPDwKLSAgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIAotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIAotICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgCi0gIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKLSAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIlByb2Nlc3Nvci5hcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLSAgCi0gIGZfc2VydmljZV8gPDwKLSAgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8Ci0gIGFzM190eXBlX2ltcG9ydHMoKSA8PAotICBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgCi0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7Ci0gIAotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICAKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICAgIAotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kczsKLSAgfQotCi0gIGdlbmVyYXRlX2FzM19kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCBleHRlbmRzX2lmYWNlIDw8Ci0gICAgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PAotICAgICAgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJbXBsIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiIGltcGxlbWVudHMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiIDw8ICIoaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2w9bnVsbCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHZhciBpcHJvdF86VFByb3RvY29sOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgdmFyIG9wcm90XzpUUHJvdG9jb2w7IiAgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgc2VxaWRfOmludDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXRQcm90b2NvbCgpOlRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uIGdldE91dHB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotCi0gICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICAKLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5DQUxMLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YXIgYXJnczoiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgIAotICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKGZ1bmN0aW9uKGVycm9yOkVycm9yKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChlcnJvciAhPSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZXJyb3IpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgbXNnOlRNZXNzYWdlID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gVEFwcGxpY2F0aW9uRXJyb3IucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcih4KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA6IiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcyhyZXN1bHQuc3VjY2Vzcyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChlOlRFcnJvcikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIAotICAgICAgCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAifSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBFeHRlbmRzIHN0dWZmCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcihpZmFjZToiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIlBST0NFU1NfTUFQW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpZmFjZV86IiAgPDwgc2VydmljZV9uYW1lXyA8PCAiOyIgPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBjb25zdCBQUk9DRVNTX01BUDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBzdHJpbmcgb3ZlcnJpZGUgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAgIG92ZXJyaWRlID0gIm92ZXJyaWRlICI7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IG92ZXJyaWRlIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbCk6Qm9vbGVhbiIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICBpbmRlbnQoKSA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/Ci0gIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKLSAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/Ci0gIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGZuOkZ1bmN0aW9uID0gUFJPQ0VTU19NQVBbbXNnLm5hbWVdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZuLmNhbGwodGhpcyxtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGNsYXNzCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCk6RnVuY3Rpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicmV0dXJuIGZ1bmN0aW9uKHNlcWlkOmludCwgaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2wpOnZvaWQiCi0gICAgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgYXJnczoiPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdDoiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJMT0dHRVIuZXJyb3IoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdGgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLklOVEVSTkFMX0VSUk9SLCBcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIC8vIENsb3NlIGNsYXNzCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGNsYXNzCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBvYmo7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG9iaiA9IHRtcCgiX21hcCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgiX3NldCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9saXN0Iik7Ci0gIH0KLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUTWFwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUU2V0ID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VExpc3QgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkKLSAgICA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCi0gICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKLSAgICA8PCAiKCIKLSAgICA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yICh2YXIgIiA8PCBpIDw8ICI6aW50ID0gMDsgIiA8PAotICAgIGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIgPDwgIjsgIiA8PAotICAgICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7Ci0gICAgc3RyaW5nIGNvdW50ZXIgPSB0bXAoIl9zaXplQ291bnRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBjb3VudGVyIDw8ICI6aW50ID0gMDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IGNvdW50ZXIgPDwgKyIrKzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgY291bnRlciA8PCAiKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLmxlbmd0aCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIudG9BcnJheSgpKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIjsKLSAgfQotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgQXMzIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/Ci0gKiBAcmV0dXJuIEFzMyB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0KSB7Ci0gIC8vIEluIEFzMyB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaW50IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIkRpY3Rpb25hcnkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiU2V0IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJBcnJheSI7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgQXMzIGNvbnRhaW5lcj8KLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gImJ5dGVbXSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiU3RyaW5nIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gIkJvb2xlYW4iOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHRocm93ICJpNjQgaXMgbm90IHlldCBzdXBwb3J0ZWQgaW4gYXMzIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJOdW1iZXIiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgewotICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9ICJ2YXIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotICBpZiAoISB0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgewotICAgICAgYXJndW1lbnRzICs9ICIsICI7Ci0gICAgfQotICAgIGFyZ3VtZW50cyArPSAib25FcnJvcjpGdW5jdGlvbiwgb25TdWNjZXNzOkZ1bmN0aW9uIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIik6dm9pZCI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpewotICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIGNvbnN0YW50X25hbWU7Ci0KLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0gIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7Ci0gICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7Ci0KLSAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKLSAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOwotICAgIH0KLSAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKLSAgfQotCi0gIHJldHVybiBjb25zdGFudF9uYW1lOwotfQotCi0vKioKLSAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiLyoqXG4iLAotICAgICAgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwKLSAgICAgICIgKi9cbiIpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBBczNEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIvKipcbiIsCi0gICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgewotICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpICsgIi4iOwotICB9Ci0gIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihhczMsICJBUzMiLAotIiAgICBiaW5kYWJsZTogICAgICAgICAgQWRkIFtiaW5kYWJsZV0gbWV0YWRhdGEgdG8gYWxsIHRoZSBzdHJ1Y3QgY2xhc3Nlcy5cbiIKLSk7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyNGI1Mi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBPYmplY3RpdmUtQyBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KLSAqLwotY2xhc3MgdF9jb2NvYV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfY29jb2FfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICAKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibG9nX3VuZXhwZWN0ZWQiKTsKLSAgICBsb2dfdW5leHBlY3RlZF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7ICAgIAotICAgIAotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNvY29hIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbmVyaXplX2l0PWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbiAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2UgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24gKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZE5hbWU9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGlzdE5hbWUpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBjb2NvYV9wcmVmaXgoKTsKLSAgc3RkOjpzdHJpbmcgY29jb2FfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBjb2NvYV90aHJpZnRfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWY9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZHluYW1pY19wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGNvbnRhaW5lcml6ZSh0X3R5cGUgKiB0dHlwZSwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLSAgc3RkOjpzdHJpbmcgZGVjb250YWluZXJpemUodF9maWVsZCAqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4KLSAgICAgIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cmluZygpOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeF87Ci0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9pbXBsXzsKLQotICBib29sIGxvZ191bmV4cGVjdGVkXzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBjb2NvYV9wcmVmaXhfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNvY29hIik7Ci0KLSAgLy8gd2UgaGF2ZSBhIC5oIGhlYWRlciBmaWxlLi4uCi0gIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gcHJvZ3JhbV9uYW1lXysiLmgiOwotICBzdHJpbmcgZl9oZWFkZXJfZnVsbG5hbWUgPSBnZXRfb3V0X2RpcigpK2ZfaGVhZGVyX25hbWU7Ci0gIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX2Z1bGxuYW1lLmNfc3RyKCkpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgZW5kbDsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBjb2NvYV9pbXBvcnRzKCkgPDwKLSAgICBjb2NvYV90aHJpZnRfaW1wb3J0cygpOwotCi0gIC8vIC4uLmFuZCBhIC5tIGltcGxlbWVudGF0aW9uIGZpbGUKLSAgc3RyaW5nIGZfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyIubSI7Ci0gIGZfaW1wbF8ub3BlbihmX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICBmX2ltcGxfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBlbmRsOwotCi0gIGZfaW1wbF8gPDwKLSAgICBjb2NvYV9pbXBvcnRzKCkgPDwKLSAgICBjb2NvYV90aHJpZnRfaW1wb3J0cygpIDw8Ci0gICAgIiNpbXBvcnQgXCIiIDw8IGZfaGVhZGVyX25hbWUgPDwgIlwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBDb2NvYSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIENvY29hIGxpYnJhcmllcwotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICAiI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+XG4iICsKLSAgICAiXG4iOwotfQotCi0vKioKLSAqIFByaW50cyB0aHJpZnQgcnVudGltZSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQgcnVudGltZQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX3RocmlmdF9pbXBvcnRzKCkgewotICBzdHJpbmcgcmVzdWx0ID0gc3RyaW5nKCkgKwotICAgICIjaW1wb3J0IDxUUHJvdG9jb2wuaD5cbiIgKwotICAgICIjaW1wb3J0IDxUQXBwbGljYXRpb25FeGNlcHRpb24uaD5cbiIgKwotICAgICIjaW1wb3J0IDxUUHJvdG9jb2xVdGlsLmg+XG4iICsKLSAgICAiI2ltcG9ydCA8VFByb2Nlc3Nvci5oPlxuIiArCi0gICAgIlxuIjsKLQotICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgcmVzdWx0ICs9ICIjaW1wb3J0IFwiIiArIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpICsgIi5oXCIiICsgIlxuIjsKLSAgfQotICByZXN1bHQgKz0gIlxuIjsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogRmluaXNoIHVwIGdlbmVyYXRpb24uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpCi17Ci0gIC8vIHN0aWNrIG91ciBjb25zdGFudHMgZGVjbGFyYXRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciBmaWxlCi0gIC8vIHNpbmNlIHRoZXkgcmVmZXIgdG8gdGhpbmdzIHdlIGFyZSBkZWZpbmluZy4KLSAgZl9oZWFkZXJfIDw8IGNvbnN0YW50c19kZWNsYXJhdGlvbnNfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gb2JqZWN0aXZlLWMKLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gT2JqZWN0aXZlLUMsIHRoaXMgaXMKLSAqIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nIHRoZQotICogZW51bSBrZXl3b3JkIGluIE9iamVjdGl2ZS1DLiAgRm9yIG5hbWVzcGFjZSBwdXJwb3NlcywgdGhlIG5hbWUgb2YKLSAqIHRoZSBlbnVtIHBsdXMgYW4gdW5kZXJzY29yZSBpcyBwcmVmaXhlZCBvbnRvIGVhY2ggZWxlbWVudC4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZW51bSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuICBQcmltaXRpdmUgdmFsdWVzCi0gKiBjb3VsZCBoYXZlIGJlZW4gcGxhY2VkIG91dHNpZGUgdGhpcyBjbGFzcywgYnV0IEkganVzdCBwdXQKLSAqIGV2ZXJ5dGhpbmcgaW4gZm9yIGNvbnNpc3RlbmN5LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29uc3RfaW50ZXJmYWNlOwotICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMiOwotCi0gIGNvbnN0X2ludGVyZmFjZSA8PCAiQGludGVyZmFjZSAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8ICIgOiBOU09iamVjdCAiOwotICBzY29wZV91cChjb25zdF9pbnRlcmZhY2UpOwotICBzY29wZV9kb3duKGNvbnN0X2ludGVyZmFjZSk7Ci0KLSAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBkZWZpbmVkLgotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGNvbnN0X2ludGVyZmFjZSA8PAotICAgICAgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGNvbnN0X2ludGVyZmFjZSA8PCAiQGVuZCI7Ci0KLSAgLy8gdGhpcyBnZXRzIHNwaXQgaW50byB0aGUgaGVhZGVyIGZpbGUgaW4gOjpjbG9zZV9nZW5lcmF0b3IKLSAgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPSBjb25zdF9pbnRlcmZhY2Uuc3RyKCk7Ci0KLSAgLy8gc3RhdGljIHZhcmlhYmxlcyBpbiB0aGUgLm0gaG9sZCBhbGwgY29uc3RhbnQgdmFsdWVzCi0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfaW1wbF8gPDwKLSAgICAgICJzdGF0aWMgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZTsKLSAgICBpZiAoIXR5cGUtPmlzX2NvbnRhaW5lcigpICYmICF0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgZl9pbXBsXyA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9pbXBsXyA8PCBlbmRsOwotCi0gIGZfaW1wbF8gPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8IGVuZGw7Ci0KLSAgLy8gaW5pdGlhbGl6ZSBjb21wbGV4IGNvbnN0YW50cyB3aGVuIHRoZSBjbGFzcyBpcyBsb2FkZWQKLSAgZl9pbXBsXyA8PCAiKyAodm9pZCkgaW5pdGlhbGl6ZSAiOwotICBzY29wZV91cChmX2ltcGxfKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmdldF90eXBlKCktPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgICBmX2ltcGxfIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBzY29wZV9kb3duKGZfaW1wbF8pOwotCi0gIC8vIGdldHRlciBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgZl9pbXBsXyA8PAotICAgICAgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZTsKLSAgICBzY29wZV91cChmX2ltcGxfKTsKLSAgICBpbmRlbnQoZl9pbXBsXykgPDwgInJldHVybiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfaW1wbF8pOwotICB9Ci0KLSAgZl9pbXBsXyA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCi0gKiB3aXRoIHByb3RlY3RlZCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGdldHRlcnMgYW5kIHNldHRlcnMuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHN0cnVjdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBOU0V4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0eGNlcHRpb24sIHRydWUpOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGEgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgOiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIk5TRXhjZXB0aW9uICI7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJOU09iamVjdCAiOwotICB9Ci0gIG91dCA8PCAiPE5TQ29kaW5nPiAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gbWVtYmVycyBhcmUgcHJvdGVjdGVkLiAgdGhpcyBpcyByZWR1bmRhbnQsIGJ1dCBleHBsaWNpdC4KLSAgLy8gIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICJAcHJvdGVjdGVkOiIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAvLyBtZW1iZXIgdmFyaWFsYmVzCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIpIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgLy8gaXNzZXQgZmllbGRzCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIkJPT0wgX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0OyIgPDwgIGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBwcm9wZXJ0aWVzCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgIiNpZiBUQVJHRVRfT1NfSVBIT05FIHx8IChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNSkiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlcikgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8ICIjZW5kaWYiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGluaXRpYWxpemVyIGZvciBhbGwgZmllbGRzCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOwotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICAvLyByZWFkIGFuZCB3cml0ZQotICBvdXQgPDwgIi0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGUgc2lnbmF0dXJlIGZvciBpbml0aWFsaXplciBvZiBzdHJ1Y3Qgd2l0aCBhIHBhcmFtZXRlciBmb3IKLSAqIGVhY2ggZmllbGQuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGluZGVudChvdXQpIDw8ICItIChpZCkgaW5pdFdpdGgiOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICkgewotICAgIGlmIChtX2l0ZXIgPT0gbWVtYmVycy5iZWdpbigpKSB7Ci0gICAgICBvdXQgPDwgY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIjogKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PAotICAgICAgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICsrbV9pdGVyOwotICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgewotICAgICAgb3V0IDw8ICIgIjsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIGdldHRlciBhbmQgc2V0dGVyIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGZpZWxkcywgcGx1cyBhbgotICogSXNTZXQgZ2V0dGVyLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfZGVjbGFyYXRpb25zKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwgZGVjYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItICh2b2lkKSBzZXQiIDw8IGNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIjogKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBpbml0V2l0aENvZGVyIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3Qgc28gaXQncyBjb21wYXRpYmxlIHdpdGgKLSAqIHRoZSBOU0NvZGluZyBwcm90b2NvbAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgCi17Ci0gIGluZGVudChvdXQpIDw8ICItIChpZCkgaW5pdFdpdGhDb2RlcjogKE5TQ29kZXIgKikgZGVjb2RlciIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0V2l0aENvZGVyOiBkZWNvZGVyXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChbZGVjb2RlciBjb250YWluc1ZhbHVlRm9yS2V5OiBAXCIiPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IlwiXSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIAotICAgIHsKLSAgICAgIG91dCA8PCAiW1tkZWNvZGVyIGRlY29kZU9iamVjdEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSByZXRhaW5dOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAodC0+aXNfZW51bSgpKSAKLSAgICB7Ci0gICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdCktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKQotICAgICAgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVCb29sRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludDMyRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQ2NEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlRG91YmxlRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogICAgCi0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBkZWNvZGUgdGhyaWZ0IHR5cGU6ICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIAotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBlbmNvZGVXaXRoQ29kZXIgbWV0aG9kIGZvciB0aGlzIHN0cnVjdCBzbyBpdCdzIGNvbXBhdGlibGUgd2l0aAotICogdGhlIE5TQ29kaW5nIHByb3RvY29sCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSAKLXsKLSAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIGVuY29kZVdpdGhDb2RlcjogKE5TQ29kZXIgKikgZW5jb2RlciIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGVuY29kZVdpdGhDb2RlcjogZW5jb2Rlcl07IiA8PCBlbmRsOwotICB9Ci0gIAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfXyI8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwiX2lzc2V0KSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIC8vb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSAKLSAgICB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZU9iamVjdDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgCi0gICAgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHQpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlQm9vbDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQzMjogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50NjQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZURvdWJsZTogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6ICAgIAotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogZG9uJ3Qga25vdyBob3cgdG8gZW5jb2RlIHRocmlmdCB0eXBlOiAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIAotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGUgc3RydWN0IGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGV4Y2VwdGlvbnMgbmVlZCB0byBjYWxsIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uIE5TRXhjZXB0aW9uCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGlkKSBpbml0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3N1cGVyIGluaXRXaXRoTmFtZTogQFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiByZWFzb246IEBcInVua25vd25cIiB1c2VySW5mbzogbmlsXTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvLyBAZHluYW1pYyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMKLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwgIiNpZiBUQVJHRVRfT1NfSVBIT05FIHx8IChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNSkiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGR5bmFtaWNfcHJvcGVydHkoKm1faXRlcikgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8ICIjZW5kaWYiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGluaXRpYWxpemVyIHdpdGggYWxsIGZpZWxkcyBhcyBwYXJhbXMKLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG91dCwgdHN0cnVjdCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc2VsZiBpbml0XTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgICAgb3V0IDw8ICJbIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiByZXRhaW5dOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0gIAotICAvLyBpbml0V2l0aENvZGVyIGZvciBOU0NvZGluZwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIC8vIGVuY29kZVdpdGhDb2RlciBmb3IgTlNDb2RpbmcKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7ICAKLQotICAvLyBkZWFsbG9jCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICItICh2b2lkKSBkZWFsbG9jIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZGVhbGxvY107IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIC8vIHRoZSByZXN0IG9mIHRoZSBtZXRob2RzCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9pbXBsZW1lbnRhdGlvbnMob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICAiLSAodm9pZCkgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKLSAgaW5kZW50KG91dCkgPDwgIk5TU3RyaW5nICogZmllbGROYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImludCBmaWVsZFR5cGU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaW50IGZpZWxkSUQ7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTF07IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW2luUHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAmZmllbGROYW1lIHR5cGU6ICZmaWVsZFR5cGUgZmllbGRJRDogJmZpZWxkSURdOyIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RPUCkgeyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3dpdGNoIChmaWVsZElEKSIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoZmllbGRUeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiZmllbGRWYWx1ZSIpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCBjYWxsX2ZpZWxkX3NldHRlcigqZl9pdGVyLCAiZmllbGRWYWx1ZSIpIDw8IGVuZGw7Ci0gICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gYWxsb2NhdGVkIGZpZWxkLCByZWxlYXNlIGl0IHNpbmNlIHRoZSBzdHJ1Y3QKLSAgICAgICAgLy8gaXMgbm93IHJldGFpbmluZyBpdAotICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgICAgLy8gZGVzZXJpYWxpemVkIHN0cmluZ3MgYXJlIGF1dG9yZWxlYXNlLCBzbyBkb24ndCByZWxlYXNlIHRoZW0KLSAgICAgICAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3N0cmluZygpKSkgewotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgIltmaWVsZFZhbHVlIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbDsKLSAgICAgICAgaWYgKGxvZ191bmV4cGVjdGVkXykgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogZmllbGQgSUQgJWkgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlaS4gIFNraXBwaW5nLlwiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBmaWVsZElELCBmaWVsZFR5cGUpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgICBpZiAobG9nX3VuZXhwZWN0ZWRfKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogdW5leHBlY3RlZCBmaWVsZCBJRCAlaSB3aXRoIHR5cGUgJWkuICBTa2lwcGluZy5cIiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZmllbGRJRCwgZmllbGRUeXBlKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltpblByb3RvY29sIHJlYWRGaWVsZEVuZF07IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVhZFN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IG5hbWUgPDwgIlwiXTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoX18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfXyIrKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwgd2hpY2gKLSAqIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZQotICogc2V0LCBhbmQgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICAiKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfXyIrKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIGZvciBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QuCi0gKiBnZXR0ZXIsIHNldHRlciwgaXNzZXQgZ2V0dGVyLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGZpZWxkX25hbWU7Ci0gICAgY2FwX25hbWVbMF0gPSB0b3VwcGVyKGNhcF9uYW1lWzBdKTsKLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIjsKLSAgICBvdXQgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFtbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZXRhaW5dIGF1dG9yZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgc2V0IiA8PCBjYXBfbmFtZSA8PCAiOiAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwKLSAgICAgICIpICIgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkX25hbWUgPDwgIiByZXRhaW5dOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQgPSBZRVM7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIElzU2V0Ci0gICAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpICIgPDwgZmllbGRfbmFtZSA8PCAiSXNTZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFVuc2V0dGVyIC0gZG8gd2UgbmVlZCB0aGlzPwotICAgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSB1bnNldCIgPDwgY2FwX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmVsZWFzZV07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuaWw7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIl9pc3NldCA9IE5POyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBkZXNjcmlwdGlvbiBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJOU011dGFibGVTdHJpbmcgKiBtcyA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogQFwiIiA8PAotICAgIHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIl07IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCJdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiwiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRGb3JtYXQ6IEBcIiIgPDwgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0dHlwZSkgPDwgIlwiLCBfXyIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIilcIl07IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogbXNdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIE9iamVjdGl2ZS1DIHRoaXMgY29uc2lzdHMgb2YgYQotICogcHJvdG9jb2wgZGVmaW5pdGlvbiwgYSBjbGllbnQgaW50ZXJmYWNlIGFuZCBhIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHMsIGZhbHNlLCBmYWxzZSk7ICAKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKLX0KLQotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICByZXR1cm4gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAotICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRmdW5jdGlvbikpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIHJlc3VsdCBzdHJ1Y3QKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7ICAKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAcHJvdG9jb2wgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgPE5TT2JqZWN0PiIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8Ci0gICAgICAiICAvLyB0aHJvd3MgIjsKLSAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpICsgIiwgIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJURXhjZXB0aW9uIiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCA6IE5TT2JqZWN0IDwiIDw8Ci0gICAgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPiAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPFRQcm90b2NvbD4gaW5Qcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2w7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoSW5Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRoZSBUUHJvY2VzcyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCi0gKiBzZXJ2aWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciA6IE5TT2JqZWN0IDxUUHJvY2Vzc29yPiAiOwotICAKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8Ij4gbVNlcnZpY2U7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRGljdGlvbmFyeSAqIG1NZXRob2RNYXA7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIAotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjogKGlkIDwiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOwotICBvdXQgPDwgIi0gKGlkPCI8PGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCIgPDwgZW5kbDsKLQotICAvLyBpbml0aWFsaXplcnMKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbCIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3NlbGYgaW5pdFdpdGhJblByb3RvY29sOiBwcm90b2NvbCBvdXRQcm90b2NvbDogcHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgYW5JblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGFuT3V0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpblByb3RvY29sID0gW2FuSW5Qcm90b2NvbCByZXRhaW5dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXRQcm90b2NvbCA9IFthbk91dFByb3RvY29sIHJldGFpbl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBkZWFsbG9jCi0gIG91dCA8PCAiLSAodm9pZCkgZGVhbGxvYyIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZGVhbGxvY107IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiIDw8Ci0gICAgICAiIHR5cGU6IFRNZXNzYWdlVHlwZV9DQUxMIiA8PAotICAgICAgIiBzZXF1ZW5jZUlEOiAwXTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGFyZ3NuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBmaWVsZE5hbWUgPDwgIiAhPSBuaWwpIjsKLSAgICAgICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIH0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZpZWxkTmFtZSA8PCAiXCIiCi0gICAgICAgICIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAgICIgZmllbGRJRDogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZsZF9pdGVyLCBmaWVsZE5hbWUpOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2hdOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IE1lc3NhZ2UgdmFsaWRhdGlvbiBoZXJlLCB3YXMgdGhlIHNlcWlkIGV0YyBvaz8KLQotICAgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpbnQgbXNnVHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogbmlsIHR5cGU6ICZtc2dUeXBlIHNlcXVlbmNlSUQ6IE5VTExdOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZ1R5cGUgPT0gVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24gKiB4ID0gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBAdGhyb3cgeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEZJWE1FIC0gY291bGQgb3B0aW1pemUgaGVyZSB0byByZWR1Y2UgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IG9iamVjdHMuCi0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUoKmZfaXRlcik7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgY29jb2FfcHJlZml4XyA8PCByZXN1bHRuYW1lIDw8ICIgKiByZXN1bHQgPSBbW1siIDw8IGNvY29hX3ByZWZpeF8gPDwKLSAgICAgICAgcmVzdWx0bmFtZSA8PCAiIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIltyZXN1bHQgcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKFtyZXN1bHQgc3VjY2Vzc0lzU2V0XSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBbcmVzdWx0IHN1Y2Nlc3NdOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKFtyZXN1bHQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0XSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIEB0aHJvdyBbcmVzdWx0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIkB0aHJvdyBbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhUeXBlOiBUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiXTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltzZWxmIHNlbmRfIiA8PCBmdW5uYW1lOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIltzZWxmIHJlY3ZfIiA8PCBmdW5uYW1lIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGltcGxlbWVudGF0aW9uLiAgSW4gb3RoZXIgd29yZHMgdGhlIGFjdHVhbCBUUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uCi0gKiBmb3IgdGhlIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIAotICAvLyBpbml0aWFsaXplcgotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghc2VsZikgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWw7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAibVNlcnZpY2UgPSBbc2VydmljZSByZXRhaW5dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJtTWV0aG9kTWFwID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnldIHJldGFpbl07IiA8PCBlbmRsOwotICAKLSAgLy8gZ2VuZXJhdGUgbWV0aG9kIG1hcCBmb3Igcm91dGluZyBpbmNvbWluZyBjYWxscwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiU0VMIHMgPSBAc2VsZWN0b3IocHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIl93aXRoU2VxdWVuY2VJRDppblByb3RvY29sOm91dFByb3RvY29sOik7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNNZXRob2RTaWduYXR1cmUgKiBzaWcgPSBbc2VsZiBtZXRob2RTaWduYXR1cmVGb3JTZWxlY3Rvcjogc107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6IHNpZ107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2ludm9jYXRpb24gc2V0U2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHJldGFpbkFyZ3VtZW50c107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW21NZXRob2RNYXAgc2V0VmFsdWU6IGludm9jYXRpb24gZm9yS2V5OiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIAotICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJ3NlcnZpY2UnIG1ldGhvZCB3aGljaCByZXR1cm5zIHRoZSBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gIC8vIHByb2Nlc3NvcgotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpZDwiPDxjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gW1ttU2VydmljZSByZXRhaW5dIGF1dG9yZWxlYXNlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUUHJvY2VzcyBtZXRob2QsIHdoaWNoIGRpc3BhdGNoZXMgdGhlIGluY29taW5nIGNhbGwgdXNpbmcgdGhlIG1ldGhvZCBtYXAKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2wiIDw8ZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNTdHJpbmcgKiBtZXNzYWdlTmFtZTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpbnQgbWVzc2FnZVR5cGU7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaW50IHNlcUlEOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAmbWVzc2FnZU5hbWUiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJm1lc3NhZ2VUeXBlIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6ICZzZXFJRF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFttTWV0aG9kTWFwIHZhbHVlRm9yS2V5OiBtZXNzYWdlTmFtZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKGludm9jYXRpb24gPT0gbmlsKSB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogVFR5cGVfU1RSVUNUIG9uUHJvdG9jb2w6IGluUHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICogeCA9IFtUQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uV2l0aFR5cGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOX01FVEhPRCByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnJUAnXCIsIG1lc3NhZ2VOYW1lXV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogbWVzc2FnZU5hbWUiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBUTWVzc2FnZVR5cGVfRVhDRVBUSU9OIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxSURdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW3ggd3JpdGU6IG91dFByb3RvY29sXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBZRVM7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIC8vIE5TSW52b2NhdGlvbiBkb2VzIG5vdCBjb25mb3JtIHRvIE5TQ29weWluZyBwcm90b2NvbCIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TSW52b2NhdGlvbiAqIGkgPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiBbaW52b2NhdGlvbiBtZXRob2RTaWduYXR1cmVdXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRTZWxlY3RvcjogW2ludm9jYXRpb24gc2VsZWN0b3JdXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJnNlcUlEIGF0SW5kZXg6IDJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmaW5Qcm90b2NvbCBhdEluZGV4OiAzXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJm91dFByb3RvY29sIGF0SW5kZXg6IDRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldFRhcmdldDogc2VsZl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgaW52b2tlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gWUVTOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgLy8gZ2VuZXJhdGUgYSBwcm9jZXNzX1hYWFggbWV0aG9kIGZvciBlYWNoIHNlcnZpY2UgZnVuY3Rpb24sIHdoaWNoIHJlYWRzIGFyZ3MsIGNhbGxzIHRoZSBzZXJ2aWNlLCBhbmQgd3JpdGVzIHJlc3VsdHMKLSAgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICJfd2l0aFNlcXVlbmNlSUQ6IChpbnQzMl90KSBzZXFJRCBpblByb3RvY29sOiAoaWQ8VFByb3RvY29sPikgaW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkPFRQcm90b2NvbD4pIG91dFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgc3RyaW5nIGFyZ3N0eXBlID0gY29jb2FfcHJlZml4XyArIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKCpmX2l0ZXIpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhcmdzdHlwZSA8PCAiICogYXJncyA9IFtbIiA8PCBhcmdzdHlwZSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbYXJncyByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICAgIAotICAgIHN0cmluZyByZXN1bHR0eXBlID0gY29jb2FfcHJlZml4XyArIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUoKmZfaXRlcik7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdHR5cGUgPDwgIiAqIHJlc3VsdCA9IFtbIiA8PCByZXN1bHR0eXBlIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKLQotICAgIC8vIG1ha2UgdGhlIGNhbGwgdG8gdGhlIGFjdHVhbCBzZXJ2aWNlIG9iamVjdAotICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgIltyZXN1bHQgc2V0U3VjY2VzczogIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJbbVNlcnZpY2UgIiA8PCBmdW5uYW1lOwotICAgIC8vIHN1cHBseWluZyBhcmd1bWVudHMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBvdXQgPDwgIjogW2FyZ3MgIiA8PCBmaWVsZE5hbWUgPDwgIl0iOwotICAgIH0KLSAgICBvdXQgPDwgIl0iOwotICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIG91dCA8PCAiXSI7Ci0gICAgfQotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICAKLSAgICAvLyB3cml0ZSBvdXQgdGhlIHJlc3VsdAotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVE1lc3NhZ2VUeXBlX1JFUExZIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbcmVzdWx0IHdyaXRlOiBvdXRQcm90b2NvbF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbcmVzdWx0IHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlthcmdzIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICAKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgCi0gIC8vIGRlYWxsb2MKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAodm9pZCkgZGVhbGxvYyIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbbVNlcnZpY2UgcmVsZWFzZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIlttTWV0aG9kTWFwIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZGVhbGxvY107IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgdmFyaWFibGUgbmFtZSBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZE5hbWUgPDwgIiA9IFtpblByb3RvY29sICI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeV07IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmddOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2xdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTZdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0XTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGVdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBPYmplY3RpdmUtQyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMl07IjsKLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGFsbG9jYXRlcyB0aGUgc3RydWN0IGFuZCBpbnZva2VzIHJlYWQ6Ci0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8IGZpZWxkTmFtZSA8PCAiID0gW1siIDw8Ci0gICAgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHJlYWQ6IGluUHJvdG9jb2xdOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiW2luUHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogTlVMTCB2YWx1ZVR5cGU6IE5VTEwgc2l6ZTogJiIgPDwKLSAgICAgIHNpemUgPDwgIl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVEaWN0aW9uYXJ5ICogIiA8PCBmaWVsZE5hbWUgPDwKLSAgICAgICIgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJbaW5Qcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlU2V0ICogIiA8PCBmaWVsZE5hbWUgPDwKLSAgICAgICIgPSBbW05TTXV0YWJsZVNldCBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJbaW5Qcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZUFycmF5ICogIiA8PCBmaWVsZE5hbWUgPDwKLSAgICAgICIgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICB9Ci0gIC8vIEZJWE1FIC0gdGhlIGNvZGUgYWJvdmUgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIGVsZW1lbnQgdHlwZXMgb2YKLSAgLy8gdGhlIGNvbnRhaW5lcnMgYmVpbmcgcmVhZCBtYXRjaCB0aGUgZWxlbWVudCB0eXBlcyBvZiB0aGUKLSAgLy8gY29udGFpbmVycyB3ZSBhcmUgcmVhZGluZyBpbnRvLiAgRG9lcyB0aGF0IG1hdHRlcj8KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PAotICAgIGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyAiIDw8Ci0gICAgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgZmllbGROYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBmaWVsZE5hbWUpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGZpZWxkTmFtZSk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRNYXBFbmRdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZFNldEVuZF07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZExpc3RFbmRdOyIgPDwgZW5kbDsKLSAgfQotCi19Ci0KLQotLyoqCi0gKiBUYWtlIGEgdmFyaWFibGUgb2YgYSBnaXZlbiB0eXBlIGFuZCB3cmFwIGl0IGluIGNvZGUgdG8gbWFrZSBpdAotICogc3VpdGFibGUgZm9yIHB1dHRpbmcgaW50byBhIGNvbnRhaW5lciwgaWYgbmVjZXNzYXJ5LiAgQmFzaWNhbGx5LAotICogd3JhcCBzY2FsZXIgcHJpbWl0aXZlcyBpbiBOU051bWJlciBvYmplY3RzLgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvbnRhaW5lcml6ZSh0X3R5cGUgKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpCi17Ci0gIC8vIEZJWE1FIC0gb3B0aW1pemUgaGVyZSB0byBhdm9pZCBhdXRvcmVsZWFzZSBwb29sPwotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhJbnQ6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNhbid0IGNvbnRhaW5lcml6ZSB2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoQm9vbDogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoVW5zaWduZWRDaGFyOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aFNob3J0OiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aExvbmc6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoTG9uZ0xvbmc6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoRG91YmxlOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBkbyBub3RoaW5nCi0gIHJldHVybiBmaWVsZE5hbWU7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfdHlwZSoga2V5VHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOwotICB0X3R5cGUqIHZhbFR5cGUgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKLSAgdF9maWVsZCBma2V5KGtleVR5cGUsIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh2YWxUeXBlLCB2YWwpOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksIGtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiWyIgPDwgZmllbGROYW1lIDw8ICIgc2V0T2JqZWN0OiAiIDw8IGNvbnRhaW5lcml6ZSh2YWxUeXBlLCB2YWwpIDw8Ci0gICAgIiBmb3JLZXk6ICIgPDwgY29udGFpbmVyaXplKGtleVR5cGUsIGtleSkgPDwgIl07IiA8PCBlbmRsOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKGtleVR5cGUpKSB7Ci0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZShrZXlUeXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKGtleVR5cGUsIGtleSkgPDwgIiByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodmFsVHlwZSkpIHsKLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKHZhbFR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUodmFsVHlwZSwgdmFsKSA8PCAiIHJlbGVhc2VdOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X3R5cGUqIHR5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIHRfZmllbGQgZmVsZW0odHlwZSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgLy8gZGVzZXJpYWxpemVkIHN0cmluZ3MgYXJlIGF1dG9yZWxlYXNlLCBzbyBkb24ndCByZWxlYXNlIHRoZW0KLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKHR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIiByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF90eXBlKiB0eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKLSAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiWyIgPDwgZmllbGROYW1lIDw8ICIgYWRkT2JqZWN0OiAiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKHR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIiByZWxlYXNlXTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgdG8gb2YgdGhlIHZhcmlhYmxlIGhvbGRpbmcgdGhlIGZpZWxkCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sICI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIGZpZWxkTmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnk6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZzogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2w6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZTogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NDogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZTogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemUgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIHN0cnVjdAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIGNvbnRhaW5lcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOiAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiB2YWx1ZVR5cGU6ICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiIHNpemU6IFsiIDw8Ci0gICAgICBmaWVsZE5hbWUgPDwgIiBjb3VudF1dOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgc2l6ZTogWyIgPDwKLSAgICAgIGZpZWxkTmFtZSA8PCAiIGNvdW50XV07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTogIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiBzaXplOiBbIiA8PAotICAgICAgZmllbGROYW1lIDw8ICIgY291bnRdXTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgc3RyaW5nIGtleTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGtleSA9IHRtcCgia2V5Iik7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIga2V5RW51bWVyYXRvcl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKCgiIDw8IGtleSA8PCAiID0gWyIgPDwgaXRlciA8PCAiIG5leHRPYmplY3RdKSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAga2V5ID0gdG1wKCJvYmoiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNFbnVtZXJhdG9yICogIiA8PCBpdGVyIDw8ICIgPSBbIiA8PCBmaWVsZE5hbWUgPDwgIiBvYmplY3RFbnVtZXJhdG9yXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAga2V5ID0gdG1wKCJpIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoIiA8PCBrZXkgPDwgIiA9IDA7ICIgPDwga2V5IDw8ICIgPCBbIiA8PCBmaWVsZE5hbWUgPDwgIiBjb3VudF07ICIgPDwga2V5IDw8ICIrKykiIDw8IGVuZGw7Ci0gIH0KLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGtleSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiW291dFByb3RvY29sIHdyaXRlTWFwRW5kXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVTZXRFbmRdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVMaXN0RW5kXTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBHaXZlbiBhIGZpZWxkIHZhcmlhYmxlIG5hbWUsIHdyYXAgaXQgaW4gY29kZSB0aGF0IGNvbnZlcnRzIGl0IHRvIGEKLSAqIHByaW1pdGl2ZSB0eXBlLCBpZiBuZWNlc3NhcnkuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjb250YWluZXJpemUodF9maWVsZCAqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkKLXsKLSAgdF90eXBlICogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgaW50VmFsdWVdIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY2FuJ3QgZGVjb250YWluZXJpemUgdm9pZCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgYm9vbFZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgdW5zaWduZWRDaGFyVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIHNob3J0VmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGxvbmdWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgbG9uZ0xvbmdWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgZG91YmxlVmFsdWVdIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gZG8gbm90aGluZwotICByZXR1cm4gZmllbGROYW1lOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwTmFtZSkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgZGVjb250YWluZXJpemUoJmtmaWVsZCwga2V5KSk7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiWyIgKyBtYXBOYW1lICsgIiBvYmplY3RGb3JLZXk6ICIgKyBrZXkgKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCBkZWNvbnRhaW5lcml6ZSgmdmZpZWxkLCB2ZmllbGQuZ2V0X25hbWUoKSkpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50TmFtZSkgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnROYW1lKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgZGVjb250YWluZXJpemUoJmVmaWVsZCwgZWxlbWVudE5hbWUpKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0TmFtZSkgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiWyIgKyBsaXN0TmFtZSArICIgb2JqZWN0QXRJbmRleDogIiArIGluZGV4ICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgZGVjb250YWluZXJpemUoJmVmaWVsZCwgZWZpZWxkLmdldF9uYW1lKCkpKTsKLX0KLQotCi0vKioKLSAqIFJldHVybnMgYW4gT2JqZWN0aXZlLUMgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNsYXNzX3JlZiBEbyB3ZSB3YW50IGEgQ2xhc3MgcmVmZXJlbmNlIGlzdGVhZCBvZiBhIHR5cGUgcmVmZXJlbmNlPwotICogQHJldHVybiBKYXZhIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWYpIHsKLSAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gY29jb2FfcHJlZml4XyArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIHJlc3VsdDsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpbnQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJlc3VsdCA9ICJOU0RpY3Rpb25hcnkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJlc3VsdCA9ICJOU1NldCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJlc3VsdCA9ICJOU0FycmF5IjsKLSAgfSBlbHNlIHsKLSAgICAvLyBDaGVjayBmb3IgcHJlZml4Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0gIT0gTlVMTCkgewotICAgICAgcmVzdWx0ID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKSArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWNsYXNzX3JlZikgewotICAgIHJlc3VsdCArPSAiICoiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgT2JqZWN0aXZlLUMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJOU0RhdGEgKiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiTlNTdHJpbmcgKiI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJCT09MIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAidWludDhfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiJpbnQxNl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQzMl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuImludDY0X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gImRvdWJsZSI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvYmplY3RpdmUtYyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotCi0vKioKLSAqIFNwaXQgb3V0IGNvZGUgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNwZWNpZmllZCBjb25zdGFudCB2YWx1ZS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUoc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbmVyaXplX2l0KSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgIkBcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gIllFUyIgOiAiTk8iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRXaXRoIjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIHJlbmRlciA8PCBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIHJlbmRlciA8PCAiXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHNBbmRLZXlzOiAiOwotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kLCB0cnVlKTsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgdmFsIDw8ICIsICIgPDwga2V5OwotICAgIH0KLSAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmVuZGVyIDw8ICJbW05TQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKLSAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOwotICAgIH0KLSAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNTZXQgYWxsb2NdIGluaXRXaXRoT2JqZWN0czogIjsKLSAgICB0X3R5cGUgKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiLCAiOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7Ci0gICAgfQotICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiZG9uJ3Qga25vdyBob3cgdG8gcmVuZGVyIGNvbnN0YW50IGZvciB0eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmIChjb250YWluZXJpemVfaXQpIHsKLSAgICByZXR1cm4gY29udGFpbmVyaXplKHR5cGUsIHJlbmRlci5zdHIoKSk7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZC4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCkgewotICByZXR1cm4gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiIF9fIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI7IjsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBPYmplY3RpdmUtQyAyLjAgcHJvcGVydHkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gZGVjbGFyZSBhIHByb3BlcnR5IGZvcgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0gIHJlbmRlciA8PCAiQHByb3BlcnR5IChub25hdG9taWMsICI7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodGZpZWxkLT5nZXRfdHlwZSgpKSkKLSAgICByZW5kZXIgPDwgInJldGFpbiwgIjsKLSAgCi0gIHJlbmRlciA8PCAiZ2V0dGVyPSIgPDwgZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwKLSAgICAiLCBzZXR0ZXI9c2V0IiA8PCBjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiOikgIiA8PAotICAgIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiOwotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogQWRkIEBkeW5hbWljIGRlY2xhcmF0aW9uIGZvciBhbiBPYmplY3RpdmUtQyAyLjAgcHJvcGVydHkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgZm9yIHdoaWNoIHRvIGRlY2xhcmUgYSBkeW5hbWljIHByb3BlcnR5Ci0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZHluYW1pY19wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgcmV0dXJuICJAZHluYW1pYyAiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9Ci0gICAgIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIpICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoqCi0gKiBSZW5kZXJzIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgdHlwZXMgYW5kIG5hbWVzLCBzdWl0YWJsZSBmb3IgYW4KLSAqIG9iamVjdGl2ZS1jIHBhcmFtZXRlciBsaXN0Ci0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAiOiAoIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIikgIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gT2JqZWN0aXZlLUMgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZV9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZV9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZV9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZV9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZV9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGVfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGVfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGVfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLS8qKgotICogUmV0dXJucyBhIGZvcm1hdCBzdHJpbmcgc3BlY2lmaWVyIGZvciB0aGUgc3VwcGxpZWQgcGFyc2UgdHlwZS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiXFxcIiVAXFxcIiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICIlaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICIlaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIiVoaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIiVpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiJXFpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiJWYiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIiVpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiJUAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiJUAiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBmb3JtYXRfc3RyaW5nX2Zvcl90eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNhbGwgdG8gYSBmaWVsZCdzIHNldHRlci4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIEZpZWxkIHRoZSBzZXR0ZXIgaXMgYmVpbmcgY2FsbGVkIG9uCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgdG8gcGFzcyB0byBzZXR0ZXIKLSAqLwotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNhbGxfZmllbGRfc2V0dGVyKHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIGZpZWxkTmFtZSkgewotICByZXR1cm4gIltzZWxmIHNldCIgKyBjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiOiAiICsgZmllbGROYW1lICsgIl07IjsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNvY29hLCAiQ29jb2EiLAotIiAgICBsb2dfdW5leHBlY3RlZDogIExvZyBldmVyeSB0aW1lIGFuIHVuZXhwZWN0ZWQgZmllbGQgSUQgb3IgdHlwZSBpcyBlbmNvdW50ZXJlZC5cbiIKLSk7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkzMWRhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzAwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogQysrIGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGlzIGxlZ2l0aW1hY3kgaW5jYXJuYXRlLgotICoKLSAqLwotY2xhc3MgdF9jcHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2NwcF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImRlbnNlIik7Ci0gICAgZ2VuX2RlbnNlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJpbmNsdWRlX3ByZWZpeCIpOwotICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jcHAiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICAgIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotICB9Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICAgIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLSAgfQotICB2b2lkIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbj1mYWxzZSwgYm9vbCBwb2ludGVycz1mYWxzZSwgYm9vbCByZWFkPXRydWUsIGJvb2wgd3JpdGU9dHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2ZpbmdlcnByaW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZGVmaW5pdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3JlYWRlciAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnM9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlciAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycz1mYWxzZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9udWxsICAgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVzaF9iYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeChzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9vcGVuKHN0ZDo6c3RyaW5nIG5zKTsKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Nsb3NlKHN0ZDo6c3RyaW5nIG5zKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZj1mYWxzZSwgYm9vbCBhcmc9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBwb2ludGVyPWZhbHNlLCBib29sIGNvbnN0YW50PWZhbHNlLCBib29sIHJlZmVyZW5jZT1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBuYW1lX3BhcmFtcz10cnVlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcz10cnVlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBsb2NhbF9yZWZsZWN0aW9uX25hbWUoY29uc3QgY2hhciosIHRfdHlwZSogdHR5cGUsIGJvb2wgZXh0ZXJuYWw9ZmFsc2UpOwotCi0gIC8vIFRoZXNlIGhhbmRsZXMgY2hlY2tpbmcgZ2VuX2RlbnNlXyBhbmQgY2hlY2tpbmcgZm9yIGR1cGxpY2F0ZXMuCi0gIHZvaWQgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIGJvb2wgaXNfZGVmaW5pdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbl9wb2ludGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSk7Ci0KLSAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4KLSAgICAgIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykpOwotICB9Ci0KLSAgdm9pZCBzZXRfdXNlX2luY2x1ZGVfcHJlZml4KGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4KSB7Ci0gICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IHVzZV9pbmNsdWRlX3ByZWZpeDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluY2x1ZGUgcHJlZml4IHRvIHVzZSBmb3IgYSBmaWxlIGdlbmVyYXRlZCBieSBwcm9ncmFtLCBvciB0aGUKLSAgICogZW1wdHkgc3RyaW5nIGlmIG5vIGluY2x1ZGUgcHJlZml4IHNob3VsZCBiZSB1c2VkLgotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0X2luY2x1ZGVfcHJlZml4KGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFRydWUgaWZmIHdlIHNob3VsZCBnZW5lcmF0ZSBsb2NhbCByZWZsZWN0aW9uIG1ldGFkYXRhIGZvciBURGVuc2VQcm90b2NvbC4KLSAgICovCi0gIGJvb2wgZ2VuX2RlbnNlXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIHVzZSBhIHBhdGggcHJlZml4IGluIG91ciAjaW5jbHVkZSBzdGF0ZW1lbnRzIGZvciBvdGhlcgotICAgKiB0aHJpZnQtZ2VuZXJhdGVkIGhlYWRlciBmaWxlcy4KLSAgICovCi0gIGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4XzsKLQotICAvKioKLSAgICogU3RyaW5ncyBmb3IgbmFtZXNwYWNlLCBjb21wdXRlZCBvbmNlIHVwIGZyb250IHRoZW4gdXNlZCBkaXJlY3RseQotICAgKi8KLQotICBzdGQ6OnN0cmluZyBuc19vcGVuXzsKLSAgc3RkOjpzdHJpbmcgbnNfY2xvc2VfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMsIHN0b3JlZCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgdGhlbSBhcyBwYXJhbWV0ZXJzIHRvIGV2ZXJ5Ci0gICAqIGZ1bmN0aW9uLgotICAgKi8KLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfaW1wbF87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWFkZXJfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgLyoqCi0gICAqIFdoZW4gZ2VuZXJhdGluZyBsb2NhbCByZWZsZWN0aW9ucywgbWFrZSBzdXJlIHdlIGRvbid0IGdlbmVyYXRlIGR1cGxpY2F0ZXMuCi0gICAqLwotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gcmVmbGVjdGVkX2ZpbmdlcnByaW50c187Ci19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMuaCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX3R5cGVzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLmNwcCI7Ci0gIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIFN0YXJ0IGlmbmRlZgotICBmX3R5cGVzXyA8PAotICAgICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJbmNsdWRlIGJhc2UgdHlwZXMKLSAgZl90eXBlc18gPDwKLSAgICAiI2luY2x1ZGUgPFRocmlmdC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8VEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2wuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PAotICAgICAgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvLyBJbmNsdWRlIGN1c3RvbSBoZWFkZXJzCi0gIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjcHBfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NwcF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNwcF9pbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGlmIChjcHBfaW5jbHVkZXNbaV1bMF0gPT0gJzwnKSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiI2luY2x1ZGUgIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiNpbmNsdWRlIFwiIiA8PCBjcHBfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBmX3R5cGVzXyA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSB0aGUgdHlwZXMgZmlsZQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgbG9jYWwgcmVmbGVjdGlvbiBtZXRhZGF0YSwgd2UgbmVlZCB0byBpbmNsdWRlCi0gIC8vIHRoZSBkZWZpbml0aW9uIG9mIFR5cGVTcGVjLgotICBpZiAoZ2VuX2RlbnNlXykgewotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICIjaW5jbHVkZSA8VFJlZmxlY3Rpb25Mb2NhbC5oPiIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIC8vIE9wZW4gbmFtZXNwYWNlCi0gIG5zX29wZW5fID0gbmFtZXNwYWNlX29wZW4ocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLSAgbnNfY2xvc2VfID0gbmFtZXNwYWNlX2Nsb3NlKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0KLSAgZl90eXBlc18gPDwKLSAgICBuc19vcGVuXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSBvdXRwdXQgZmlsZXMuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIG5hbWVzcGFjZQotICBmX3R5cGVzXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGlmbmRlZgotICBmX3R5cGVzXyA8PAotICAgICIjZW5kaWYiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2Ugb3V0cHV0IGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl90eXBlc19pbXBsXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIEMrKwotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiAiIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gQysrLCB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lCi0gKiBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUgZW51bSBrZXl3b3JkIGluIEMrKy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAiZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfdHlwZXNfIDw8Ci0gICAgICAgICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgZW5kbCA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihmX3R5cGVzXywgdGVudW0sIGZhbHNlKTsKLSAgZ2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihmX3R5cGVzX2ltcGxfLCB0ZW51bSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLmgiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl9jb25zdGFudHMuY3BwIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHNfaW1wbDsKLSAgZl9jb25zdHNfaW1wbC5vcGVuKGZfY29uc3RzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9jb25zdHNfaW1wbCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIFN0YXJ0IGlmbmRlZgotICBmX2NvbnN0cyA8PAotICAgICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBuc19vcGVuXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX2NvbnN0c19pbXBsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX2NvbnN0YW50cy5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9jb25zdHMgPDwKLSAgICAiY2xhc3MgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbCA8PAotICAgICIgICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzKCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgZl9jb25zdHMgPDwKLSAgICAgIGluZGVudCgpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2NvbnN0cyA8PAotICAgICJ9OyIgPDwgZW5kbDsKLQotICBmX2NvbnN0c19pbXBsIDw8Ci0gICAgImNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHM6OiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHNfaW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0c19pbXBsKSA8PAotICAgICJ9IiA8PCBlbmRsOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgZW5kbCA8PAotICAgICJleHRlcm4gY29uc3QgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgZ18iIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIjZW5kaWYiIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PAotICAgIGVuZGwgPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuX19pc3NldC4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoc3RkOjptYWtlX3BhaXIoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXNoX2JhY2soIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5pbnNlcnQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHByaW50X2NvbnN0X3ZhbHVlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi0vKioKLSAqCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkxMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKLSAqIHdpdGggZGF0YSBtZW1iZXJzIGFuZCBhIHJlYWQvd3JpdGUoKSBmdW5jdGlvbiwgcGx1cyBhIG1pcnJvcmluZyBpc3NldAotICogaW5uZXIgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jcHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZ2VuZXJhdGVfc3RydWN0X2ZpbmdlcnByaW50KGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIHRydWUpOwotICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc19pbXBsXywgdHN0cnVjdCwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb25fcG9pbnRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBXcml0ZXMgdGhlIHN0cnVjdCBkZWZpbml0aW9uIGludG8gdGhlIGhlYWRlciBmaWxlCi0gKgotICogQHBhcmFtIG91dCBPdXRwdXQgc3RyZWFtCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGV4dGVuZHMgPSAiIDogcHVibGljIDo6YXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24iOwotICB9Ci0KLSAgLy8gT3BlbiBzdHJ1Y3QgZGVmCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBQdXQgdGhlIGZpbmdlcnByaW50IHVwIHRvcCBmb3IgYWxsIHRvIHNlZS4KLSAgZ2VuZXJhdGVfc3RydWN0X2ZpbmdlcnByaW50KG91dCwgdHN0cnVjdCwgZmFsc2UpOwotCi0gIC8vIEdldCBtZW1iZXJzCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKCFwb2ludGVycykgewotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkiOwotCi0gICAgYm9vbCBpbml0X2N0b3IgPSBmYWxzZTsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICBzdHJpbmcgZHZhbDsKLSAgICAgICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOwotICAgICAgICB9Ci0gICAgICAgIGR2YWwgKz0gdC0+aXNfc3RyaW5nKCkgPyAiXCJcIiIgOiAiMCI7Ci0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpbml0X2N0b3IpIHsKLSAgICAgICAgICBpbml0X2N0b3IgPSB0cnVlOwotICAgICAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBXaGVuIGV2ZXJ5dGhpbmcgZWxzZSBpbiBUaHJpZnQgaXMgcGVyZmVjdCwKLSAgICAvLyBkbyBtb3JlIG9mIHRoZXNlIGluIHRoZSBpbml0aWFsaXplciBsaXN0LgotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLQotICAgICAgaWYgKCF0LT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB0aHJvdygpIHt9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBQb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlJ3MgcmVmbGVjdGlvbiBsb2NhbCB0eXBlc3BlYy4KLSAgaWYgKGdlbl9kZW5zZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInN0YXRpYyA6OmFwYWNoZTo6dGhyaWZ0OjpyZWZsZWN0aW9uOjpsb2NhbDo6VHlwZVNwZWMqIGxvY2FsX3JlZmxlY3Rpb247IiA8PAotICAgICAgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRGVjbGFyZSBhbGwgZmllbGRzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgcG9pbnRlcnMgJiYgISgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSwgIXJlYWQpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBJc3NldCBzdHJ1Y3QgaGFzIGJvb2xlYW4gZmllbGRzLCBidXQgb25seSBmb3Igbm9uLXJlcXVpcmVkIGZpZWxkcy4KLSAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICB9Ci0KLSAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgewotICAgIG91dCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInN0cnVjdCBfX2lzc2V0IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJfX2lzc2V0KCkgOiAiOwotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGZhbHNlKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGZhbHNlKSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG91dCA8PCAiIHt9IiA8PCBlbmRsOwotCi0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAgICJib29sICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSBfX2lzc2V0OyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIGlmICghcG9pbnRlcnMpIHsKLSAgICAvLyBHZW5lcmF0ZSBhbiBlcXVhbGl0eSB0ZXN0aW5nIG9wZXJhdG9yLiAgTWFrZSBpdCBpbmxpbmUgc2luY2UgdGhlIGNvbXBpbGVyCi0gICAgLy8gd2lsbCBkbyBhIGJldHRlciBqb2IgdGhhbiB3ZSB3b3VsZCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5saW5lIGl0LgotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICYgIiA8PAotICAgICAgKG1lbWJlcnMuc2l6ZSgpID4gMCA/ICJyaHMiIDogIi8qIHJocyAqLyIpIDw8ICIpIGNvbnN0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICghKCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIT0gcmhzLl9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImVsc2UgaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAmJiAhKCIKLSAgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yICE9IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmcmhzKSBjb25zdCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gISgqdGhpcyA9PSByaHMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxlc3MtdGhhbiBvcGVyYXRvci4gIFRoaXMgbXVzdCBiZQotICAgIC8vIGltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgaWYgdGhleSB3aXNoIHRvIHVzZSBpdC4gIChUaGV5Ci0gICAgLy8gd2lsbCBnZXQgYSBsaW5rIGVycm9yIGlmIHRoZXkgdHJ5IHRvIHVzZSBpdCB3aXRob3V0IGFuIGltcGxlbWVudGF0aW9uLikKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yIDwgKGNvbnN0ICIKLSAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICkgY29uc3Q7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKHJlYWQpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCByZWFkKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsiIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKHdyaXRlKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3Qgd3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0OyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBmaW5nZXJwcmludCBvZiBhIHN0cnVjdCB0byBlaXRoZXIgdGhlIGhlYWRlciBvciBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIHN0cmluZyBzdGF0LCBuc3BhY2UsIGNvbW1lbnQ7Ci0gIGlmIChpc19kZWZpbml0aW9uKSB7Ci0gICAgc3RhdCA9ICIiOwotICAgIG5zcGFjZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiOjoiOwotICAgIGNvbW1lbnQgPSAiICI7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdCA9ICJzdGF0aWMgIjsKLSAgICBuc3BhY2UgPSAiIjsKLSAgICBjb21tZW50ID0gIjsgLy8gIjsKLSAgfQotCi0gIGlmICh0c3RydWN0LT5oYXNfZmluZ2VycHJpbnQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgc3RhdCA8PCAiY29uc3QgY2hhciogIiA8PCBuc3BhY2UKLSAgICAgICAgPDwgImFzY2lpX2ZpbmdlcnByaW50IiA8PCBjb21tZW50IDw8ICI9IFwiIiA8PAotICAgICAgICB0c3RydWN0LT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKSA8PCAiXCI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBzdGF0IDw8ICJjb25zdCB1aW50OF90ICIgPDwgbnNwYWNlIDw8Ci0gICAgICAgICJiaW5hcnlfZmluZ2VycHJpbnRbIiA8PCB0X3R5cGU6OmZpbmdlcnByaW50X2xlbiA8PCAiXSIgPDwgY29tbWVudCA8PCAiPSB7IjsKLSAgICBjb25zdCBjaGFyKiBjb21tYSA9ICIiOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdF90eXBlOjpmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgb3V0IDw8IGNvbW1hIDw8ICIweCIgPDwgdF9zdHJ1Y3Q6OmJ5dGVfdG9faGV4KHRzdHJ1Y3QtPmdldF9iaW5hcnlfZmluZ2VycHJpbnQoKVtpXSk7Ci0gICAgICBjb21tYSA9ICIsIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBsb2NhbCByZWZsZWN0aW9uIG9mIGEgdHlwZSAoZWl0aGVyIGRlY2xhcmF0aW9uIG9yIGRlZmluaXRpb24pLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIGlmICghZ2VuX2RlbnNlXykgewotICAgIHJldHVybjsKLSAgfQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBhc3NlcnQodHR5cGUtPmhhc19maW5nZXJwcmludCgpKTsKLSAgc3RyaW5nIGtleSA9IHR0eXBlLT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKSArIChpc19kZWZpbml0aW9uID8gIi1kZWZuIiA6ICItZGVjbCIpOwotICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSBnZW5lcmF0ZWQgdGhpcyBmaW5nZXJwcmludC4gIElmIHdlIGFscmVhZHkgZGlkLCBiYWlsIG91dC4KLSAgaWYgKCFyZWZsZWN0ZWRfZmluZ2VycHJpbnRzXy5pbnNlcnQoa2V5KS5zZWNvbmQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gTGV0IGVhY2ggcHJvZ3JhbSBoYW5kbGUgaXRzIG93biBzdHJ1Y3R1cmVzLgotICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCAmJiB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIERvIGRlcGVuZGVuY2llcy4KLSAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgaXNfZGVmaW5pdGlvbik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgLy8gSGFja3kgaGFja3kuICBGb3IgZWZmaWNpZW5jeSBhbmQgY29udmVuaWVuY2UsIHdlIG5lZWQgYSBkdW1teSAiVF9TVE9QIgotICAgIC8vIHR5cGUgYXQgdGhlIGVuZCBvZiBvdXIgdHlwZXNwZWMgYXJyYXkuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubwotICAgIC8vIFRfU1RPUCB0eXBlLCBzbyB3ZSB1c2UgdGhlIGdsb2JhbCB2b2lkIHR5cGUsIGFuZCBzcGVjaWFsIGNhc2UgaXQgd2hlbgotICAgIC8vIGdlbmVyYXRpbmcgaXRzIHR5cGVzcGVjLgotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9ICgodF9zdHJ1Y3QqKXR0eXBlKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKiptX2l0ZXIpLmdldF90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICAgIH0KLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgZ190eXBlX3ZvaWQsIGlzX2RlZmluaXRpb24pOwotCi0gICAgLy8gRm9yIGRlZmluaXRpb25zIG9mIHN0cnVjdHVyZXMsIGRvIHRoZSBhcnJheXMgb2YgbWV0YXMgYW5kIGZpZWxkIHNwZWNzIGFsc28uCi0gICAgaWYgKGlzX2RlZmluaXRpb24pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OkZpZWxkTWV0YSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoIm1ldGFzIiwgdHR5cGUpIDw8IltdID0geyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAieyAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwKLSAgICAgICAgICAoKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpID8gInRydWUiIDogImZhbHNlIikgPDwKLSAgICAgICAgICAiIH0sIiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gWmVybyBmb3IgdGhlIFRfU1RPUCBtYXJrZXIuCi0gICAgICBpbmRlbnQob3V0KSA8PCAieyAwLCBmYWxzZSB9IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInNwZWNzIiwgdHR5cGUpIDw8IltdID0geyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJiIgPDwKLSAgICAgICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICImIiA8PAotICAgICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgZ190eXBlX3ZvaWQpIDw8ICIsIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLy8gIiA8PCB0dHlwZS0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IChpc19kZWZpbml0aW9uID8gIiIgOiAiZXh0ZXJuICIpIDw8Ci0gICAgICAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjIiA8PCBlbmRsIDw8Ci0gICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgdHR5cGUpIDw8Ci0gICAgICAoaXNfZGVmaW5pdGlvbiA/ICIoIiA6ICI7IikgPDwgZW5kbDsKLQotICBpZiAoIWlzX2RlZmluaXRpb24pIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX3RvX2VudW0odHR5cGUpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiOjpiaW5hcnlfZmluZ2VycHJpbnQsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoIm1ldGFzIiwgdHR5cGUpIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInNwZWNzIiwgdHR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIk5VTEwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiYiIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJOVUxMIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gIH0KLQotICBvdXQgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBXcml0ZXMgdGhlIHN0cnVjdHVyZSdzIHN0YXRpYyBwb2ludGVyIHRvIGl0cyBsb2NhbCByZWZsZWN0aW9uIHR5cGVzcGVjCi0gKiBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbl9wb2ludGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSkgewotICBpZiAoIWdlbl9kZW5zZV8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiAiIDw8Ci0gICAgICB0dHlwZS0+Z2V0X25hbWUoKSA8PCAiOjpsb2NhbF9yZWZsZWN0aW9uID0gIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgJiIgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsIHR0eXBlKSA8PCAiOyIgPDwKLSAgICBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogTWFrZXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2VuIGEgc3RydWN0IHJlYWRlci4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpyZWFkKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImludDE2X3QgZmlkOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEJlZ2luKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb247IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgYXJlbid0IGluIF9faXNzZXQsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbS4KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoZnR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqaXNzZXRfcHJlZml4ID0KLSAgICAgICAgICAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgPyAidGhpcy0+X19pc3NldC4iIDogImlzc2V0XyI7Ci0KLSNpZiAwCi0gICAgICAgIC8vIFRoaXMgY29kZSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGZpZWxkIGlzIGVuY291bnRlcmVkIHR3aWNlLgotICAgICAgICAvLyBXZSd2ZSBkZWNpZGVkIHRvIGxlYXZlIGl0IG91dCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLSAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBHZW5lcmF0ZSB0aGlzIGNvZGUgYW5kICJpZiIgaXQgb3V0IHRvIG1ha2UgaXQgZWFzaWVyCi0gICAgICAgIC8vIGZvciBwZW9wbGUgcmVjb21waWxpbmcgdGhyaWZ0IHRvIGluY2x1ZGUgaXQuCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgICAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGlzc2V0X3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAvLyBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBhbiBvcHRpb24gd2hlbiB0aHJpZnQgc3RydWN0cwotICAgICAgICAgIC8vIGhhdmUgYSBjb21tb24gYmFzZSBjbGFzcy4KLSAgICAgICAgICAvLyBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVGhyb3cgaWYgYW55IHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KLSAgLy8gV2UgZG8gdGhpcyBhZnRlciByZWFkaW5nIHRoZSBzdHJ1Y3QgZW5kIHNvIHRoYXQKLSAgLy8gdGhlcmUgbWlnaHQgcG9zc2libHkgYmUgYSBjaGFuY2Ugb2YgY29udGludWluZy4KLSAgb3V0IDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgJyknIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp3cml0ZSg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMtPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAnfScgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIFN0cnVjdCB3cml0ZXIgZm9yIHJlc3VsdCBvZiBhIGZ1bmN0aW9uLCB3aGljaCBjYW4gaGF2ZSBvbmx5IG9uZSBvZiBpdHMKLSAqIGZpZWxkcyBzZXQgYW5kIGRvZXMgYSBjb25kaXRpb25hbCBpZiBlbHNlIGxvb2sgdXAgaW50byB0aGUgX19pc3NldCBmaWVsZAotICogb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSByZXN1bHQgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp3cml0ZSg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PAotICAgICAgICAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigiIDw8Ci0gICAgICAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGlmIChwb2ludGVycykgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0gICAgfQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlcwotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkrc3ZjbmFtZSsiLmgiOwotICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlciBmaWxlIGluY2x1ZGVzCi0gIGZfaGVhZGVyXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICAiI2lmbmRlZiAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPFRQcm9jZXNzb3IuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PAotICAgICJfdHlwZXMuaFwiIiA8PCBlbmRsOwotCi0gIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihleHRlbmRzX3NlcnZpY2UtPmdldF9wcm9ncmFtKCkpKSA8PAotICAgICAgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIuaFwiIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcwotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIi5jcHAiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PAotICAgIGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb21wb25lbnRzCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0c2VydmljZSk7Ci0KLSAgLy8gQ2xvc2UgdGhlIG5hbWVzcGFjZQotICBmX3NlcnZpY2VfIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBmX2hlYWRlcl8gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfaGVhZGVyXyA8PAotICAgICIjZW5kaWYiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgdGhlIGZpbGVzCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZl9oZWFkZXJfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4gQmFzaWNhbGx5LCB0aGlzIGdlbmVyYXRlcyB0eXBlcwotICogZm9yIGFsbCB0aGUgYXJndW1lbnRzIGFuZCByZXN1bHRzIHRvIGZ1bmN0aW9ucy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZV9vcmlnID0gdHMtPmdldF9uYW1lKCk7Ci0KLSAgICB0cy0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihmX3NlcnZpY2VfLCB0cyk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3NlcnZpY2VfLCB0cyk7Ci0gICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wYXJncyIpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfaGVhZGVyXywgdHMsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3NlcnZpY2VfLCB0cywgdHJ1ZSk7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWVfb3JpZyk7Ci0KLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgOiB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArICJJZiI7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYiIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYoKSB7fSIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBudWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9udWxsKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiAsIHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgIk51bGwiOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk51bGwgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk51bGwoKSB7fSIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIsIGZhbHNlKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIGlmIChyZXR1cm50eXBlLT5pc192b2lkKCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGlzX2NvbXBsZXhfdHlwZShyZXR1cm50eXBlKSkgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBfcmV0dXJuOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgbXVsdGlmYWNlLCB3aGljaCBpcyBhIHNpbmdsZSBzZXJ2ZXIgdGhhdCBqdXN0IHRha2VzIGEgc2V0Ci0gKiBvZiBvYmplY3RzIGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGFuZCBjYWxscyB0aGVtIGFsbCwgcmV0dXJuaW5nIHRoZQotICogdmFsdWUgb2YgdGhlIGxhc3Qgb25lIHRvIGJlIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBtdWx0aXNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX211bHRpZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfbXVsdGlmYWNlID0gIiwgcHVibGljICIgKyBleHRlbmRzICsgIk11bHRpZmFjZSI7Ci0gIH0KLQotICBzdHJpbmcgbGlzdF90eXBlID0gc3RyaW5nKCJzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjwiKSArIHNlcnZpY2VfbmFtZV8gKyAiSWY+ID4iOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX2hlYWRlcl8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UgOiAiIDw8Ci0gICAgInZpcnR1YWwgcHVibGljICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYiIDw8Ci0gICAgZXh0ZW5kc19tdWx0aWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlKCIgPDwgbGlzdF90eXBlIDw8ICImIGlmYWNlcykgOiBpZmFjZXNfKGlmYWNlcykgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPCIgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+OjppdGVyYXRvciBpdGVyOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZm9yIChpdGVyID0gaWZhY2VzLmJlZ2luKCk7IGl0ZXIgIT0gaWZhY2VzLmVuZCgpOyArK2l0ZXIpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgIiA8PCBleHRlbmRzIDw8ICJNdWx0aWZhY2U6OmFkZCgqaXRlcik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlKCkge30iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gUHJvdGVjdGVkIGRhdGEgbWVtYmVycwotICBmX2hlYWRlcl8gPDwKLSAgICAiIHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCBsaXN0X3R5cGUgPDwgIiBpZmFjZXNfOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY+IGlmYWNlKSB7IiA8PCBlbmRsOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICJNdWx0aWZhY2U6OmFkZChpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmYWNlc18ucHVzaF9iYWNrKGlmYWNlKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotCi0gICAgc3RyaW5nIGNhbGwgPSBzdHJpbmcoImlmYWNlc19baV0tPiIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgY2FsbCArPSAiX3JldHVybiI7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLSAgICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNhbGwgKz0gIiwgIjsKLSAgICAgIH0KLSAgICAgIGNhbGwgKz0gKCphX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBjYWxsICs9ICIpIjsKLQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCBzeiA9IGlmYWNlc18uc2l6ZSgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzejsgKytpKSB7IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoaSA9PSBzeiAtIDEpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgICAiIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAiIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgICAiIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiwgcHVibGljICIgKyBleHRlbmRzICsgIkNsaWVudCI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50IDogIiA8PAotICAgICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PAotICAgIGV4dGVuZHNfY2xpZW50IDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50KGJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90KSA6IiA8PCBlbmRsOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3QpLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90KSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8gPSBwcm90LmdldCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3RfID0gcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICJDbGllbnQocHJvdCwgcHJvdCkge30iIDw8IGVuZGw7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQoYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlwcm90LCBib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3Byb3QpIDoiIDw8IGVuZGw7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHBpcHJvdF8oaXByb3QpLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcG9wcm90XyhvcHJvdCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gaXByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBvcHJvdF8gPSBvcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICJDbGllbnQoaXByb3QsIG9wcm90KSB7fSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGdldHRlcnMgZm9yIHRoZSBwcm90b2NvbHMuCi0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gZ2V0SW5wdXRQcm90b2NvbCgpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcGlwcm90XzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldE91dHB1dFByb3RvY29sKCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwb3Byb3RfOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAiIHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdF87IiAgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdF87IiAgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90XzsiICA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIHN0cmluZyBzY29wZSA9IHNlcnZpY2VfbmFtZV8gKyAiQ2xpZW50OjoiOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc2NvcGUpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoX3JldHVybik7IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiByZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgc2NvcGUpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBGdW5jdGlvbiBhcmd1bWVudHMgYW5kIHJlc3VsdHMKLSAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiOwotICAgIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3ByZXN1bHQiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImludDMyX3QgY3NlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMLCBjc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICYiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBHZW5lcmF0ZSByZWN2IGZ1bmN0aW9uIG9ubHkgaWYgbm90IGFuIG9uZXdheSBmdW5jdGlvbgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgc2NvcGUpIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4OyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgIT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFkpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZm5hbWUuY29tcGFyZShcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikgIT0gMCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8tPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbig6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OldST05HX01FVEhPRF9OQU1FKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgJiYKLSAgICAgICAgICAhaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgdF9maWVsZCByZXR1cm5maWVsZCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICJfcmV0dXJuIik7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCkgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gJl9yZXR1cm47IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IGxvb2sgZm9yIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIF9yZXR1cm4gcG9pbnRlciBoYXMgbm93IGJlZW4gZmlsbGVkIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBfcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIGFyZSBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciA6ICIgPDwKLSAgICAidmlydHVhbCBwdWJsaWMgOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvciIgPDwKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgLy8gUHJvdGVjdGVkIGRhdGEgbWVtYmVycwotICBmX2hlYWRlcl8gPDwKLSAgICAiIHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZj4gaWZhY2VfOyIgPDwgZW5kbDsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgYm9vbCBwcm9jZXNzX2ZuKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gUHJvY2VzcyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwcml2YXRlOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdm9pZCAoIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3I6OiopKGludDMyX3QsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKik+IHByb2Nlc3NNYXBfOyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PAotICAgICAgInZvaWQgcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGludDMyX3Qgc2VxaWQsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIHN0cmluZyBkZWNsYXJlX21hcCA9ICIiOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGRlY2xhcmVfbWFwICs9IGluZGVudCgpOwotICAgIGRlY2xhcmVfbWFwICs9ICJwcm9jZXNzTWFwX1tcIiI7Ci0gICAgZGVjbGFyZV9tYXAgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGRlY2xhcmVfbWFwICs9ICJcIl0gPSAmIjsKLSAgICBkZWNsYXJlX21hcCArPSBzZXJ2aWNlX25hbWVfOwotICAgIGRlY2xhcmVfbWFwICs9ICJQcm9jZXNzb3I6OnByb2Nlc3NfIjsKLSAgICBkZWNsYXJlX21hcCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZGVjbGFyZV9tYXAgKz0gIjtcbiI7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX2hlYWRlcl8gPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZj4gaWZhY2UpIDoiIDw8IGVuZGw7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmYWNlXyhpZmFjZSkgeyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiUHJvY2Vzc29yKGlmYWNlKSwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmYWNlXyhpZmFjZSkgeyIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBkZWNsYXJlX21hcCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90LCBib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IoKSB7fSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgImJvb2wgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3I6OnByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdCwgYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QgPSBwaXByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90ID0gcG9wcm90LmdldCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCBzZXFpZDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlICE9IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfT05FV0FZKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QtPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geCg6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oZm5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcHJvY2Vzc19mbihpcHJvdCwgb3Byb3QsIGZuYW1lLCBzZXFpZCk7IiA8PAotICAgIGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImJvb2wgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3I6OnByb2Nlc3NfZm4oOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEhPVDogbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgbWFwCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAic3RkOjptYXA8c3RkOjpzdHJpbmcsIHZvaWQgKCIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yOjoqKShpbnQzMl90LCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCopPjo6aXRlcmF0b3IgcGZuOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwZm4gPSBwcm9jZXNzTWFwXy5maW5kKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHBmbiA9PSBwcm9jZXNzTWFwXy5lbmQoKSkgeyIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrZm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKGZuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGV4dGVuZHMgPDwgIlByb2Nlc3Nvcjo6cHJvY2Vzc19mbihpcHJvdCwgb3Byb3QsIGZuYW1lLCBzZXFpZCk7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZCkpKHNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihmX3NlcnZpY2VfLCAmcmVzdWx0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIoZl9zZXJ2aWNlXywgJnJlc3VsdCk7Ci0KLSAgcmVzdWx0LnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0Iik7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfaGVhZGVyXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihmX3NlcnZpY2VfLCAmcmVzdWx0LCB0cnVlKTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yOjoiIDw8Ci0gICAgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiKGludDMyX3Qgc2VxaWQsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBmdW5jdGlvbnMgd2l0aCBleGNlcHRpb25zCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGlmIChpc19jb21wbGV4X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGZfc2VydmljZV8gPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihyZXN1bHQuc3VjY2VzcyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgfQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICYiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2tlbGV0b24gZmlsZSBvZiBhIHNlcnZlcgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKLQotICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgc3RyaW5nIGZfc2tlbGV0b25fbmFtZSA9IGdldF9vdXRfZGlyKCkrc3ZjbmFtZSsiX3NlcnZlci5za2VsZXRvbi5jcHAiOwotCi0gIHN0cmluZyBucyA9IG5hbWVzcGFjZV9wcmVmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLQotICBvZnN0cmVhbSBmX3NrZWxldG9uOwotICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbl9uYW1lLmNfc3RyKCkpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgIi8vIFRoaXMgYXV0b2dlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIGhvdyB0byBidWlsZCBhIHNlcnZlci4iIDw8IGVuZGwgPDwKLSAgICAiLy8gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIgZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQuIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHNlcnZlci9UU2ltcGxlU2VydmVyLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDsiIDw8IGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6c2VydmVyOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAidXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpZiAoIW5zLmVtcHR5KCkpIHsKLSAgICBmX3NrZWxldG9uIDw8Ci0gICAgICAidXNpbmcgbmFtZXNwYWNlICIgPDwgc3RyaW5nKG5zLCAwLCBucy5zaXplKCktMikgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBmX3NrZWxldG9uIDw8Ci0gICAgImNsYXNzICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlciA6IHZpcnR1YWwgcHVibGljICIgPDwgc3ZjbmFtZSA8PCAiSWYgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICBpbmRlbnQoKSA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIC8vIFlvdXIgaW5pdGlhbGl6YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2tlbGV0b24gPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIC8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwcmludGYoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXFxuXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgImludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICBpbmRlbnQoKSA8PCAiaW50IHBvcnQgPSA5MDkwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPCIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcj4gaGFuZGxlcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlcikpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNlcnZlci5zZXJ2ZSgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gQ2xvc2UgdGhlIGZpbGVzCi0gIGZfc2tlbGV0b24uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT4iOwotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8ICJyZWFkSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIHJlYWRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyB0ID0gdG1wKCJlY2FzdCIpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImludDMyX3QgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEkzMigiIDw8IHQgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCi0gKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKLSAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCi0gKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7Ci0gIGJvb2wgdXNlX3B1c2ggPSB0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmNsZWFyKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGt0eXBlIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgdnR5cGUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZE1hcEJlZ2luKCIgPDwKLSAgICAgICAgICAgICAgICAgICBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZFNldEJlZ2luKCIgPDwKLSAgICAgICAgICAgICAgICAgICBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBldHlwZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LT5yZWFkTGlzdEJlZ2luKCIgPDwKLSAgICAgIGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCF1c2VfcHVzaCkgewotICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucmVzaXplKCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIHVzZV9wdXNoLCBpKTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiID0gIiA8PAotICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuaW5zZXJ0KCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfcHVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4KSB7Ci0gIGlmICh1c2VfcHVzaCkgewotICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0gICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2hfYmFjaygiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgcHJlZml4ICsgIlsiICsgaW5kZXggKyAiXSIpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLSAgfQotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgd3JpdGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKChpbnQzMl90KSIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIjo6Y29uc3RfaXRlcmF0b3IgIiA8PCBpdGVyIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCAgPDwgIi5iZWdpbigpOyAiIDw8IGl0ZXIgPDwgIiAhPSAiIDw8IHByZWZpeCA8PCAiLmVuZCgpOyArKyIgPDwgaXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIH0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlciArICItPmZpcnN0Iik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICItPnNlY29uZCIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCAiKCoiICsgaXRlciArICIpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiKCoiICsgaXRlciArICIpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBNYWtlcyBhIDo6IHByZWZpeCBmb3IgYSBuYW1lc3BhY2UKLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVwc2FjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9wcmVmaXgoc3RyaW5nIG5zKSB7Ci0gIGlmIChucy5zaXplKCkgPT0gMCkgewotICAgIHJldHVybiAiIjsKLSAgfQotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKLSAgICByZXN1bHQgKz0gIjo6IjsKLSAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gbnMgKyAiOjoiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogT3BlbnMgbmFtZXNwYWNlLgotICoKLSAqIEBwYXJhbSBucyBUaGUgbmFtZXBzYWNlLCB3LyBwZXJpb2RzIGluIGl0Ci0gKiBAcmV0dXJuIE5hbWVzcGFjZXMKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX29wZW4oc3RyaW5nIG5zKSB7Ci0gIGlmIChucy5zaXplKCkgPT0gMCkgewotICAgIHJldHVybiAiIjsKLSAgfQotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIHN0cmluZyBzZXBhcmF0b3IgPSAiIjsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmVzdWx0ICs9IHNlcGFyYXRvcjsKLSAgICByZXN1bHQgKz0gIm5hbWVzcGFjZSAiOwotICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKLSAgICByZXN1bHQgKz0gIiB7IjsKLSAgICBzZXBhcmF0b3IgPSAiICI7Ci0gICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICB9Ci0gIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9IHNlcGFyYXRvciArICJuYW1lc3BhY2UgIiArIG5zICsgIiB7IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENsb3NlcyBuYW1lc3BhY2UuCi0gKgotICogQHBhcmFtIG5zIFRoZSBuYW1lcHNhY2UsIHcvIHBlcmlvZHMgaW4gaXQKLSAqIEByZXR1cm4gTmFtZXNwYWNlcwotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2VfY2xvc2Uoc3RyaW5nIG5zKSB7Ci0gIGlmIChucy5zaXplKCkgPT0gMCkgewotICAgIHJldHVybiAiIjsKLSAgfQotICBzdHJpbmcgcmVzdWx0ID0gIn0iOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXN1bHQgKz0gIn0iOwotICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgfQotICByZXN1bHQgKz0gIiAvLyBuYW1lc3BhY2UiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJldHVybnMgYSBDKysgdHlwZSBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgdHlwZSBuYW1lLCBpLmUuIHN0ZDo6c2V0PHR5cGU+Ci0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgYXJnKSB7Ci0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgYm5hbWUgPSBiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpOwotICAgIGlmICghYXJnKSB7Ci0gICAgICByZXR1cm4gYm5hbWU7Ci0gICAgfQotCi0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lICsgIiYiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZTsKLSAgICB9Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgYSBjdXN0b20gb3ZlcmxvYWRlZCBDKysgbmFtZQotICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgc3RyaW5nIGNuYW1lOwotCi0gICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKSB0dHlwZTsKLSAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKLSAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKikgdHR5cGU7Ci0gICAgICBjbmFtZSA9ICJzdGQ6Om1hcDwiICsKLSAgICAgICAgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpbl90eXBlZGVmKSArICIsICIgKwotICAgICAgICB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICAgIGNuYW1lID0gInN0ZDo6c2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopIHR0eXBlOwotICAgICAgY25hbWUgPSAic3RkOjp2ZWN0b3I8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7Ci0gICAgfQotCi0gICAgaWYgKGFyZykgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWUgKyAiJiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBjbmFtZTsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgY2xhc3NfcHJlZml4OwotICBpZiAoaW5fdHlwZWRlZiAmJiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSkgewotICAgIGNsYXNzX3ByZWZpeCA9ICJjbGFzcyAiOwotICB9Ci0KLSAgLy8gQ2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgbmFtZXNwYWNlZAotICBzdHJpbmcgcG5hbWU7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBwbmFtZSA9Ci0gICAgICBjbGFzc19wcmVmaXggKwotICAgICAgbmFtZXNwYWNlX3ByZWZpeChwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSkgKwotICAgICAgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcG5hbWUgPSBjbGFzc19wcmVmaXggKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmIChhcmcpIHsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWUgKyAiJiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcG5hbWU7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHJldHVybiBFeHBsaWNpdCBDKysgdHlwZSwgaS5lLiAiaW50MzJfdCIKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgewotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICByZXR1cm4gInN0ZDo6c3RyaW5nIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAiYm9vbCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gImludDhfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAiaW50MTZfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAiaW50MzJfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAiaW50NjRfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZG91YmxlIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHJldHVybiBGaWVsZCBkZWNsYXJhdGlvbiwgaS5lLiBpbnQgeCA9IDA7Ci0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgcG9pbnRlciwgYm9vbCBjb25zdGFudCwgYm9vbCByZWZlcmVuY2UpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgaWYgKGNvbnN0YW50KSB7Ci0gICAgcmVzdWx0ICs9ICJjb25zdCAiOwotICB9Ci0gIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHBvaW50ZXIpIHsKLSAgICByZXN1bHQgKz0gIioiOwotICB9Ci0gIGlmIChyZWZlcmVuY2UpIHsKLSAgICByZXN1bHQgKz0gIiYiOwotICB9Ci0gIHJlc3VsdCArPSAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gXCJcIiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR5cGUpICsgIikwIjsKLSAgICB9Ci0gIH0KLSAgaWYgKCFyZWZlcmVuY2UpIHsKLSAgICByZXN1bHQgKz0gIjsiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcykgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICB0X3N0cnVjdCogYXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLQotICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgewotICAgIGJvb2wgZW1wdHkgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICAgIHJldHVybgotICAgICAgInZvaWQgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgICAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgKG5hbWVfcGFyYW1zID8gIiYgX3JldHVybiIgOiAiJiAvKiBfcmV0dXJuICovIikgKwotICAgICAgKGVtcHR5ID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMpKSkgKyAiKSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuCi0gICAgICB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAgICIoIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMpICsgIikiOwotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIG5hbWVfcGFyYW1zKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKwotICAgICAgKG5hbWVfcGFyYW1zID8gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDogIi8qICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiICovIik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKgotICogQHBhcmFtIHR5cGUgVGhyaWZ0IFR5cGUKLSAqIEByZXR1cm4gU3RyaW5nIG9mIEMrKyBjb2RlIHRvIGRlZmluaXRpb24gb2YgdGhhdCB0eXBlIGNvbnN0YW50Ci0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHN5bWJvbCBuYW1lIG9mIHRoZSBsb2NhbCByZWZsZWN0aW9uIG9mIGEgdHlwZS4KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bG9jYWxfcmVmbGVjdGlvbl9uYW1lKGNvbnN0IGNoYXIqIHByZWZpeCwgdF90eXBlKiB0dHlwZSwgYm9vbCBleHRlcm5hbCkgewotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gIC8vIFdlIGhhdmUgdG8gdXNlIHRoZSBwcm9ncmFtIG5hbWUgYXMgcGFydCBvZiB0aGUgaWRlbnRpZmllciBiZWNhdXNlCi0gIC8vIGlmIHR3byB0aHJpZnQgInByb2dyYW1zIiBhcmUgY29tcGlsZWQgaW50byBvbmUgYWN0dWFsIHByb2dyYW0KLSAgLy8geW91IHdvdWxkIGdldCBhIHN5bWJvbCBjb2xsaXNvbiBpZiB0aGV5IGJvdGggZGVmaW5lZCBsaXN0PGkzMj4uCi0gIC8vIHRybG8gPSBUaHJpZnQgUmVmbGVjdGlvbiBMT2NhbC4KLSAgc3RyaW5nIHByb2c7Ci0gIHN0cmluZyBuYW1lOwotICBzdHJpbmcgbnNwYWNlOwotCi0gIC8vIFRPRE8oZHJlaXNzKTogV291bGQgaXQgYmUgYmV0dGVyIHRvIHByZWdlbmVyYXRlIHRoZSBiYXNlIHR5cGVzCi0gIC8vICAgICAgICAgICAgICAgYW5kIHB1dCB0aGVtIGluIFRocmlmdC57aCxjcHB9ID8KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcHJvZyA9IHByb2dyYW1fLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIGFzc2VydCh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBOVUxMKTsKLSAgICBwcm9nID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCk7Ci0gICAgbmFtZSA9IHR0eXBlLT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBwcm9nID0gcHJvZ3JhbV8tPmdldF9uYW1lKCk7Ci0gICAgbmFtZSA9IHR0eXBlLT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKTsKLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKTsKLSAgICBhc3NlcnQodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCk7Ci0gICAgcHJvZyA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotICBpZiAoZXh0ZXJuYWwgJiYKLSAgICAgIHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IE5VTEwgJiYKLSAgICAgIHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSB7Ci0gICAgbnNwYWNlID0gbmFtZXNwYWNlX3ByZWZpeCh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotICB9Ci0KLSAgcmV0dXJuIG5zcGFjZSArICJ0cmxvXyIgKyBwcmVmaXggKyAiXyIgKyBwcm9nICsgIl8iICsgbmFtZTsKLX0KLQotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6Z2V0X2luY2x1ZGVfcHJlZml4KGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgewotICBzdHJpbmcgaW5jbHVkZV9wcmVmaXggPSBwcm9ncmFtLmdldF9pbmNsdWRlX3ByZWZpeCgpOwotICBpZiAoIXVzZV9pbmNsdWRlX3ByZWZpeF8gfHwKLSAgICAgIChpbmNsdWRlX3ByZWZpeC5zaXplKCkgPiAwICYmIGluY2x1ZGVfcHJlZml4WzBdID09ICcvJykpIHsKLSAgICAvLyBpZiBmbGFnIGlzIHR1cm5lZCBvZmYgb3IgdGhpcyBpcyBhYnNvbHV0ZSBwYXRoLCByZXR1cm4gZW1wdHkgcHJlZml4Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKLSAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9wcmVmaXgucmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmV0dXJuIGluY2x1ZGVfcHJlZml4LnN1YnN0cigwLCBsYXN0X3NsYXNoKSArICIvIiArIG91dF9kaXJfYmFzZV8gKyAiLyI7Ci0gIH0KLQotICByZXR1cm4gIiI7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihjcHAsICJDKysiLAotIiAgICBkZW5zZTogICAgICAgICAgIEdlbmVyYXRlIHR5cGUgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkZW5zZSBwcm90b2NvbC5cbiIKLSIgICAgaW5jbHVkZV9wcmVmaXg6ICBVc2UgZnVsbCBpbmNsdWRlIHBhdGhzIGluIGdlbmVyYXRlZCBmaWxlcy5cbiIKLSk7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmRiZjE4Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotY2xhc3MgdF9jc2hhcnBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvcgotewotICBwdWJsaWM6Ci0gICAgdF9jc2hhcnBfZ2VuZXJhdG9yKAotICAgICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gICAgewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY3NoYXJwIjsKLSAgICB9Ci0gICAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICAgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9lbnVtICh0X2VudW0qIHRlbnVtKTsKLSAgICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMpOwotICAgIGJvb2wgcHJpbnRfY29uc3RfdmFsdWUgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsPWZhbHNlLCBib29sIG5lZWR0eXBlPWZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgICB2b2lkIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0gICAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaW5fY2xhc3M9ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiBsaXN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIsIHN0ZDo6c3RyaW5nIG1hcCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAgIHZvaWQgc3RhcnRfY3NoYXJwX25hbWVzcGFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0KTsKLSAgICB2b2lkIGVuZF9jc2hhcnBfbmFtZXNwYWNlIChzdGQ6Om9mc3RyZWFtJiBvdXQpOwotCi0gICAgc3RkOjpzdHJpbmcgY3NoYXJwX3R5cGVfdXNpbmdzKCk7Ci0gICAgc3RkOjpzdHJpbmcgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKLQotICAgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvdW50YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gICAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCk7Ci0KLSAgICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgICB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWVfOwotICAgIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKLX07Ci0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7Ci0KLSAgc3RyaW5nIGRpciA9IG5hbWVzcGFjZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob2ZzdHJlYW0mIG91dCkgewotICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICAibmFtZXNwYWNlICIgPDwgbmFtZXNwYWNlX25hbWVfIDw8ICJcbiI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZW5kX2NzaGFycF9uYW1lc3BhY2Uob2ZzdHJlYW0mIG91dCkgewotICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90eXBlX3VzaW5ncygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsKLSAgICAidXNpbmcgU3lzdGVtO1xuIiArCi0gICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIgKwotICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIgKwotICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIgKwotICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iICsKLSAgICAidXNpbmcgVGhyaWZ0O1xuIiArCi0gICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90aHJpZnRfdXNpbmdzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKwotICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2w7XG4iICsKLSAgICAidXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDtcbiI7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7IH0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHt9Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8rIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSsiLmNzIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICBmX2VudW0gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9lbnVtKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PAotICAgICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJcbiI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpCi0gIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIGluZGVudChmX2VudW0pIDw8Ci0gICAgICAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7Ci0KLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpewotICAgIHJldHVybjsKLSAgfQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi9Db25zdGFudHMuY3MiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBlbmRsOwotCi0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9jb25zdHMpOwotCi0gIGluZGVudChmX2NvbnN0cykgPDwKLSAgICAicHVibGljIGNsYXNzIENvbnN0YW50cyIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9jb25zdHMpOwotCi0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IGZhbHNlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksIGZhbHNlKSkgewotICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmIChuZWVkX3N0YXRpY19jb25zdHJ1Y3RvcikgewotICAgIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKGZfY29uc3RzLCBjb25zdHMpOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX2NvbnN0cyk7Ci0gIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKLSAgZl9jb25zdHMuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQotewotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdIiA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgQ29uc3RhbnRzKCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vL2l0IHNlZW1zIGxpa2UgYWxsIHRoYXQgbWV0aG9kcyB0aGF0IGNhbGwgdGhpcyBhcmUgdXNpbmcgaW5fc3RhdGljIHRvIGJlIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0IHdvdWxkIGltcGx5Ci1ib29sIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsLCBib29sIG5lZWR0eXBlKSB7Ci0gIGluZGVudChvdXQpOwotICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7Ci0gIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKSB7Ci0gICAgb3V0IDw8Ci0gICAgICAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyAiKSA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7Ci0gICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOwotICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGRlZnZhbCAmJiAhdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSkgewotICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgfQotCi0gIHJldHVybiBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb247Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0YmFzZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5jcyI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotCi0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwKLSAgICBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpOwotCi0gIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLQotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtICZvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpbl9jbGFzcywgYm9vbCBpc19yZXN1bHQpIHsKLQotICBpZiAoIWluX2NsYXNzKSB7Ci0gICAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShvdXQpOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsKLSAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwotIAotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJFeGNlcHRpb24sICI7Ci0gIH0KLSAgb3V0IDw8ICJUQmFzZSI7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSkgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlKTsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAicHVibGljIGJvb2wgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBpZiAoIWluX2NsYXNzKQotICB7Ci0gICAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljIHZvaWQgUmVhZCAoVFByb3RvY29sIGlwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkgeyAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInRoaXMuX19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZGVmYXVsdDogIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKF9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJmaWVsZC5OYW1lID0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICIgZWxzZSBpZiAiOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgIih0aGlzLl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOwotCi0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNiLkFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IFwiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJzYi5BcHBlbmQoXCIsIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogXCIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBpZiAodHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAic2IuQXBwZW5kKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIj09IG51bGwgPyBcIjxudWxsPlwiIDogIjw8ICJ0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAic2IuQXBwZW5kKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInNiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4gc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGNzaGFycF90eXBlX3VzaW5ncygpIDw8Ci0gICAgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKLQotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfc2VydmljZV8pOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSA6IHRoaXMocHJvdCwgcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIjsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIgOiBiYXNlKGlwcm90LCBvcHJvdCkiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIGlwcm90XzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIG9wcm90XzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgSW5wdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImdldCB7IHJldHVybiBpcHJvdF87IH0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgT3V0cHV0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gb3Byb3RfOyB9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkNhbGwsIHNlcWlkXykpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3MuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3RfLlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2cuVHlwZSA9PSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRocm93IHg7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LlJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCAqeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLQotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3IsICI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzIFByb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBQcm9jZXNzb3IoSWZhY2UgaWZhY2UpIiA7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpZmFjZSkiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2VzczsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgdm9pZCBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwcml2YXRlIElmYWNlIGlmYWNlXzsiIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBuZXcgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgfQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8ICBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgVFR5cGUuU3RydWN0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyBtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQotICB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0ICp4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyB2b2lkICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpKTsgIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB3aGlsZSh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIG5hbWUgPDwgIiA9ICI7Ci0KLSAgICBpZiAodHlwZS0+aXNfZW51bSgpKQotICAgIHsKLSAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnkoKTsiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKTsiOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAiUmVhZEkxNigpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAiUmVhZEkzMigpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAiUmVhZEk2NCgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRiYXNlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5SZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBvYmo7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG9iaiA9IHRtcCgiX21hcCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgiX3NldCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9saXN0Iik7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDxlbmRsOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yKCBpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuQ291bnQiIDw8ICI7ICIgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotCi0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHRydWUpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgICBzd2l0Y2godGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dCA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0YmFzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJXcml0ZUkzMigoaW50KSIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LldyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LldyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8Ci0gICAgICAiIGluICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLktleXMpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgaW4gIiA8PAotICAgICAgcHJlZml4IDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiBpbiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIikiOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlciwgc3RyaW5nIG1hcCkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYykgewotICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZ2V0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0LiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCkgewotICAgIHN0cmluZyBuYW1lICh0ZmllbGQtPmdldF9uYW1lKCkpOwotICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotICAgIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgewotICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCAqdG1hcCA9ICh0X21hcCopIHR0eXBlOwotICAgIHJldHVybiAiRGljdGlvbmFyeTwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArCi0gICAgICAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdHNldCA9ICh0X3NldCopIHR0eXBlOwotICAgIHJldHVybiAiVEhhc2hTZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopIHR0eXBlOwotICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOwotICB9Ci0KLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBucyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOwotICAgIGlmICghbnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIG5zICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gInZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgewotICAgICAgICByZXR1cm4gImJ5dGVbXSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgICB9Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImJ5dGUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJzaG9ydCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImxvbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJkb3VibGUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdGJhc2UtPmdldF9iYXNlKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgewotICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7Ci0gICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKTAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuQm9vbCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuQnl0ZSI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTWFwIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU2V0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY3NoYXJwLCAiQyMiLCAiIik7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDAwM2FiLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBFcmxhbmcgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2VybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9lcmxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBwcm9ncmFtX25hbWVfWzBdID0gdG9sb3dlcihwcm9ncmFtX25hbWVfWzBdKTsKLSAgICBzZXJ2aWNlX25hbWVfWzBdID0gdG9sb3dlcihzZXJ2aWNlX25hbWVfWzBdKTsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1lcmwiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6b3N0cmVhbSYgaHJsX291dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyAgICAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGVybF9hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgZXJsX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLQotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV90eXBlX3Rlcm0odF90eXBlKiB0dHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cyk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHVuY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgewotICAgIGluWzBdID0gdG9sb3dlcihpblswXSk7Ci0gICAgcmV0dXJuIGluOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBhZGQgZnVuY3Rpb24gdG8gZXhwb3J0IGxpc3QKLSAgICovCi0KLSAgdm9pZCBleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICB2b2lkIGV4cG9ydF9zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7Ci0KLSAgdm9pZCBleHBvcnRfdHlwZXNfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICB2b2lkIGV4cG9ydF90eXBlc19zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7Ci0KLSAgLyoqCi0gICAqIHdyaXRlIG91dCBoZWFkZXJzIGFuZCBmb290ZXJzIGZvciBocmwgZmlsZXMKLSAgICovCi0KLSAgdm9pZCBocmxfaGVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBocmxfZm9vdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgICogc3R1ZmYgdG8gc3BpdCBvdXQgYXQgdGhlIHRvcCBvZiBnZW5lcmF0ZWQgZmlsZXMKLSAgICovCi0KLSAgYm9vbCBleHBvcnRfbGluZXNfZmlyc3RfOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXhwb3J0X2xpbmVzXzsKLQotICBib29sIGV4cG9ydF90eXBlc19saW5lc19maXJzdF87Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfdHlwZXNfbGluZXNfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfZmlsZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19ocmxfZmlsZV87Ci0KLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9maWxlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfaHJsXzsKLQotfTsKLQotCi0vKioKLSAqIFVJIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIHNldHVwIGV4cG9ydCBsaW5lcwotICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKLSAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IHRydWU7Ci0KLSAgLy8gdHlwZXMgZmlsZXMKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLmVybCI7Ci0gIHN0cmluZyBmX3R5cGVzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMuaHJsIjsKLQotICBmX3R5cGVzX2ZpbGVfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBmX3R5cGVzX2hybF9maWxlXy5vcGVuKGZfdHlwZXNfaHJsX25hbWUuY19zdHIoKSk7Ci0KLSAgaHJsX2hlYWRlcihmX3R5cGVzX2hybF9maWxlXywgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMiKTsKLQotICBmX3R5cGVzX2ZpbGVfIDw8Ci0gICAgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICAiLW1vZHVsZSgiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcykuIiA8PCBlbmRsIDw8Ci0gICAgZXJsX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGZfdHlwZXNfZmlsZV8gPDwKLSAgICAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3R5cGVzX2hybF9maWxlXyA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIC8vIGNvbnN0cyBmaWxlCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLmhybCI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9jb25zdHNfIDw8Ci0gICAgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBlcmxfaW1wb3J0cygpIDw8IGVuZGwgPDwKLSAgICAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBCb2lsZXJwbGF0ZSBhdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBoZWFkZXIgZmlsZXMKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9oZWFkZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgewotICBvdXQgPDwgIi1pZm5kZWYoXyIgPDwgbmFtZSA8PCAiX2luY2x1ZGVkKS4iIDw8IGVuZGwgPDwKLSAgICAiLWRlZmluZShfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQsIHllYWgpLiIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9mb290ZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgewotICBvdXQgPDwgIi1lbmRpZi4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiLWluY2x1ZGUoXCIiICsgdW5jYXBpdGFsaXplKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfdHlwZXMuaHJsXCIpLlxuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZXJsX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIiUlXG4iKSArCi0gICAgIiUlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAiJSVcbiIgKwotICAgICIlJSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiJSVcbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9pbXBvcnRzKCkgewotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm8iLCAxKTsKLQotICBmX3R5cGVzX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF90eXBlc19saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbDsKLSAgZl90eXBlc19maWxlXyA8PCBmX3R5cGVzXy5zdHIoKTsKLSAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm8oJ2kgYW0gYSBkdW1teSBzdHJ1Y3QnKSAtPiB1bmRlZmluZWQuIiA8PCBlbmRsOwotCi0gIGhybF9mb290ZXIoZl90eXBlc19ocmxfZmlsZV8sIHN0cmluZygiQk9HVVMiKSk7Ci0KLSAgZl90eXBlc19maWxlXy5jbG9zZSgpOwotICBmX3R5cGVzX2hybF9maWxlXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBubyBvcAotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLQotICBpbnQgdmFsdWUgPSAtMTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotCi0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmX3R5cGVzX2hybF9maWxlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIi1kZWZpbmUoIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfIiA8PCBuYW1lIDw8ICIsICIgPDwgdmFsdWUgPDwgIikuIjw8IGVuZGw7Ci0gIH0KLQotICBmX3R5cGVzX2hybF9maWxlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICItZGVmaW5lKCIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiXyIgPDwgbmFtZSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikuIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICIjIiA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICJ7IjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBvdXQgPDwgIiA9ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgb3V0IDw8ICJkaWN0OmZyb21fbGlzdChbIjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0PWZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiKCIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpICA8PCAiLCIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCAiXSkiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgInNldHM6ZnJvbV9saXN0KFsiOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgICAgb3V0IDw8ICIoIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8ICIsdHJ1ZSkiOwotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgIlsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9lcmxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdAotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgZl90eXBlc19ocmxfZmlsZV8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGhybF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpCi17Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiUlIHN0cnVjdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSAgICAgPDwgIiUgLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7IjsKLSAgICBpbmRlbnQoaHJsX291dCkgPDwgICAiLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7IjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0ICAgICA8PCAiLCAiOwotICAgICAgICBocmxfb3V0IDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnN0cmluZyBuYW1lID0gdW5jYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgICAgIDw8IG5hbWU7Ci0gICAgICBocmxfb3V0IDw8IG5hbWU7Ci0gICAgfQotICAgIG91dCAgICAgPDwgIn0pLiIgPDwgZW5kbDsKLSAgICBocmxfb3V0IDw8ICJ9KS4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7IC8vIG5vIG1lbWJlcnM7IGV4cGxpY2l0IGNvbW1lbnQKLSAgICBpbmRlbnQob3V0KSAgICAgPDwgIiUgLXJlY29yZCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCB7fSkuIiA8PCBlbmRsOwotICAgIGluZGVudChocmxfb3V0KSA8PCAgICItcmVjb3JkKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIHt9KS4iIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgaHJsX291dCA8PCBlbmRsOwotCi0KLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotCi0gIGluZGVudChvdXQpIDw8ICJzdHJ1Y3RfaW5mbygnIiA8PCBuYW1lIDw8ICInKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGdlbmVyYXRlX3R5cGVfdGVybSh0c3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gc29tZWhvdyB0aGlzIHBvaW50IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBhbmQgaXQncyBub3QgZG93bmNhc2VkIHlldAotICAvLyAuLi5hd2Vzb21lCi0gIHNlcnZpY2VfbmFtZV9bMF0gPSB0b2xvd2VyKHNlcnZpY2VfbmFtZV9bMF0pOwotCi0gIHN0cmluZyBmX3NlcnZpY2VfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpK3NlcnZpY2VfbmFtZV8rIl90aHJpZnQuaHJsIjsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyJfdGhyaWZ0LmVybCI7Ci0gIGZfc2VydmljZV9maWxlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICBmX3NlcnZpY2VfaHJsXy5vcGVuKGZfc2VydmljZV9ocmxfbmFtZS5jX3N0cigpKTsKLQotICAvLyBSZXNldCBzZXJ2aWNlIHRleHQgYWdncmVnYXRpbmcgc3RyZWFtIHN0cmVhbXMKLSAgZl9zZXJ2aWNlXy5zdHIoIiIpOwotICBleHBvcnRfbGluZXNfLnN0cigiIik7Ci0gIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwotCi0gIGhybF9oZWFkZXIoZl9zZXJ2aWNlX2hybF8sIHNlcnZpY2VfbmFtZV8pOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlX2hybF8gPDwgIi1pbmNsdWRlKFwiIiA8PAotICAgICAgdW5jYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiX3RocmlmdC5ocmxcIikuICUgaW5oZXJpdCAiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfaHJsXyA8PAotICAgICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7IC8vIGNwaXJvOiBOZXcgRXJsYW5nIE9yZGVyCi0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotCi0gIC8vIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8Ci0gICAgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICAiLW1vZHVsZSgiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl90aHJpZnQpLiIgPDwgZW5kbCA8PAotICAgICItYmVoYXZpb3VyKHRocmlmdF9zZXJ2aWNlKS4iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgIGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCB1bmNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8ICJfdGhyaWZ0LmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGZfc2VydmljZV8uc3RyKCk7Ci0KLSAgaHJsX2Zvb3RlcihmX3NlcnZpY2VfaHJsXywgZl9zZXJ2aWNlX25hbWUpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfZmlsZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2hybF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAvLyAgIiUgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGV4cG9ydF9zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotICBmX3NlcnZpY2VfICAgIDw8ICJzdHJ1Y3RfaW5mbygnaSBhbSBhIGR1bW15IHN0cnVjdCcpIC0+IHVuZGVmaW5lZC4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotCi0gIGV4cG9ydF9zdHJpbmcoImZ1bmN0aW9uX2luZm8iLCAyKTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCAiJSUlIGludGVyZmFjZSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICAvLyBJbmhlcml0YW5jZSAtIHBhc3MgdW5rbm93biBmdW5jdGlvbnMgdG8gYmFzZSBjbGFzcwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBJbmZvVHlwZSkgLT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCB1bmNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpLiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSB7Ci0gICAgICAvLyBEdW1teSBmdW5jdGlvbl9pbmZvIHNvIHdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSA7cwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKHh4eCwgZHVtbXkpIC0+IGR1bW15LiIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHBhcmFtc190eXBlKSBhbmQKLSAqIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb25OYW1lLCByZXBseV90eXBlKQotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0KLSAgc3RyaW5nIG5hbWVfYXRvbSA9ICInIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICInIjsKLQotCi0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKToKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcGFyYW1zX3R5cGUpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZ2VuZXJhdGVfdHlwZV90ZXJtKGFyZ19zdHJ1Y3QsIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcmVwbHlfdHlwZSk6Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIHJlcGx5X3R5cGUpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICBnZW5lcmF0ZV90eXBlX3Rlcm0odGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGVsc2UgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvbmV3YXlfdm9pZDsiIDw8IGVuZGw7Ci0gIGVsc2UKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIntzdHJ1Y3QsIFtdfSIgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgZXhjZXB0aW9ucyk6Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIGV4Y2VwdGlvbnMpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IGdlbmVyYXRlX3R5cGVfdGVybSh4cywgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKSB7ICAvLyBUT0RPCi0gIHN0cmluZyByZXN1bHQgPSAiQCIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgKz0gIiA9IG5pbCI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICByZXR1cm4KLSAgICBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICIoVGhpcyIgKyAgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpICsgIikiOwotfQotCi0vKioKLSAqIEFkZCBhIGZ1bmN0aW9uIHRvIHRoZSBleHBvcnRzIGxpc3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKLSAgaWYgKGV4cG9ydF9saW5lc19maXJzdF8pIHsKLSAgICBleHBvcnRfbGluZXNfZmlyc3RfID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgZXhwb3J0X2xpbmVzXyA8PCAiLCAiOwotICB9Ci0gIGV4cG9ydF9saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3R5cGVzX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotCi0gIGV4cG9ydF90eXBlc19zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgIDEgLy8gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICsgKCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpLT5nZXRfbWVtYmVycygpKS5zaXplKCkKLSAgICAgICAgICAgICAgICAgICAgICApOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3R5cGVzX3N0cmluZyhzdHJpbmcgbmFtZSwgaW50IG51bSkgewotICBpZiAoZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XykgewotICAgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBleHBvcnRfdHlwZXNfbGluZXNfIDw8ICIsICI7Ci0gIH0KLSAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCBuYW1lIDw8ICIvIiA8PCBudW07Ci19Ci0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0KLSAgZXhwb3J0X3N0cmluZyhwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgMSAvLyBUaGlzCi0gICAgICAgICAgICAgICAgKyAoKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSktPmdldF9tZW1iZXJzKCkpLnNpemUoKQotICAgICAgICAgICAgICAgICk7Ci19Ci0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIHJlc3VsdCArPSAiLCAiOyAvLyBpbml0aWFsIGNvbW1hIHRvIGNvbXBlbnNhdGUgZm9yIGluaXRpYWwgVGhpcwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgbmFtZSA9IHVuY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEVybGFuZyAidHlwZSIgKG1hY3JvIGZvciBpbnQgY29uc3RhbnRzKQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICI/dFR5cGVfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIj90VHlwZV9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIj90VHlwZV9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiP3RUeXBlX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIj90VHlwZV9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI/dFR5cGVfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiP3RUeXBlX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiP3RUeXBlX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiP3RUeXBlX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIGFuIEVybGFuZyB0ZXJtIHdoaWNoIHJlcHJlc2VudHMgYSB0aHJpZnQgdHlwZQotICovCi1zdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVfdGVybSh0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4cGFuZF9zdHJ1Y3RzKSB7Ci0gICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaWYgKGV4cGFuZF9zdHJ1Y3RzKSB7Ci0gICAgICAvLyBDb252ZXJ0IHRvIGZvcm1hdDoge3N0cnVjdCwgW3tGaWQsIFR5cGVUZXJtfSwge0ZpZCwgVHlwZVRlcm19Li4uXX0KLSAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJldDsKLQotCi0gICAgICByZXQgPDwgIntzdHJ1Y3QsIFsiOwotCi0gICAgICBpbnQgZmlyc3QgPSB0cnVlOwotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIC8vIENvbW1hIHNlcGFyYXRlIHRoZSB0dXBsZXMKLSAgICAgICAgaWYgKCFmaXJzdCkgcmV0IDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpOwotICAgICAgICBmaXJzdCA9IGZhbHNlOwotCi0gICAgICAgIHJldCA8PCAieyIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PAotICAgICAgICAgIGdlbmVyYXRlX3R5cGVfdGVybSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlKSA8PCAifSI7Ci0gICAgICB9Ci0KLSAgICAgIHJldCA8PCAiXX0iIDw8IGVuZGw7Ci0KLSAgICAgIHJldHVybiByZXQuc3RyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAie3N0cnVjdCwgeyciICsgdHlwZV9tb2R1bGUodHlwZSkgKyAiJywgJyIgKyB0eXBlX25hbWUodHlwZSkgKyAiJ319IjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAvLyB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfQotICAgIHRfdHlwZSAqa2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlICp2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIHJldHVybiAie21hcCwgIiArIGdlbmVyYXRlX3R5cGVfdGVybShrZXlfdHlwZSwgZmFsc2UpICsgIiwgIiArCi0gICAgICBnZW5lcmF0ZV90eXBlX3Rlcm0odmFsX3R5cGUsIGZhbHNlKSArICJ9IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlICplbGVtX3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgcmV0dXJuICJ7c2V0LCAiICsgZ2VuZXJhdGVfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlICplbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIHJldHVybiAie2xpc3QsICIgKyBnZW5lcmF0ZV90eXBlX3Rlcm0oZWxlbV90eXBlLCBmYWxzZSkgKyAifSI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSkgewotICByZXR1cm4gdW5jYXBpdGFsaXplKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICJfdHlwZXMiOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGVybCwgIkVybGFuZyIsICIiKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTJjMDAyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8qKgotICogVG9wIGxldmVsIHByb2dyYW0gZ2VuZXJhdGlvbiBmdW5jdGlvbi4gQ2FsbHMgdGhlIGdlbmVyYXRvciBzdWJjbGFzcyBtZXRob2RzCi0gKiBmb3IgcHJlcGFyaW5nIGZpbGUgc3RyZWFtcyBldGMuIHRoZW4gaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIHRoZQotICogcHJvZ3JhbSB0byBwZXJmb3JtIHRoZSBjb3JyZWN0IGFjdGlvbnMuCi0gKgotICogQHBhcmFtIHByb2dyYW0gVGhlIHRocmlmdCBwcm9ncmFtIHRvIGNvbXBpbGUgaW50byBDKysgc291cmNlCi0gKi8KLXZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgotICBpbml0X2dlbmVyYXRvcigpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0YW50cwotICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7Ci0gIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOwotCi0gIC8vIEdlbmVyYXRlIHN0cnVjdHMsIGV4Y2VwdGlvbnMsIGFuZCB1bmlvbnMgaW4gZGVjbGFyZWQgb3JkZXIKLSAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgotICBjbG9zZV9nZW5lcmF0b3IoKTsKLX0KLQotc3RyaW5nIHRfZ2VuZXJhdG9yOjplc2NhcGVfc3RyaW5nKGNvbnN0IHN0cmluZyAmaW4pIGNvbnN0IHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbi5iZWdpbigpOyBpdCA8IGluLmVuZCgpOyBpdCsrKSB7Ci0gICAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciByZXMgPSBlc2NhcGVfLmZpbmQoKml0KTsKLSAgICBpZiAocmVzICE9IGVzY2FwZV8uZW5kKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQocmVzLT5zZWNvbmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQucHVzaF9iYWNrKCppdCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY29uc3QoKmNfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29tbWVudF9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb21tZW50X2VuZCkgewotICBpZiAoY29tbWVudF9zdGFydCAhPSAiIikgaW5kZW50KG91dCkgPDwgY29tbWVudF9zdGFydDsKLSAgc3RyaW5nc3RyZWFtIGRvY3MoY29udGVudHMsIGlvc19iYXNlOjppbik7Ci0gIHdoaWxlICghZG9jcy5lb2YoKSkgewotICAgIGNoYXIgbGluZVsxMDI0XTsKLSAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7Ci0gICAgaWYgKHN0cmxlbihsaW5lKSA+IDAgfHwgIWRvY3MuZW9mKCkpIHsgIC8vIHNraXAgdGhlIGVtcHR5IGxhc3QgbGluZQotICAgICAgaW5kZW50KG91dCkgPDwgbGluZV9wcmVmaXggPDwgbGluZSA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICB9Ci0gIGlmIChjb21tZW50X2VuZCAhPSAiIikgaW5kZW50KG91dCkgPDwgY29tbWVudF9lbmQ7Ci19Ci0KLQotdm9pZCB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6cmVnaXN0ZXJfZ2VuZXJhdG9yKHRfZ2VuZXJhdG9yX2ZhY3RvcnkqIGZhY3RvcnkpIHsKLSAgZ2VuX21hcF90JiB0aGVfbWFwID0gZ2V0X2dlbmVyYXRvcl9tYXAoKTsKLSAgaWYgKHRoZV9tYXAuZmluZChmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpKSAhPSB0aGVfbWFwLmVuZCgpKSB7Ci0gICAgZmFpbHVyZSgiRHVwbGljYXRlIGdlbmVyYXRvcnMgZm9yIGxhbmd1YWdlIFwiJXNcIiFcbiIsIGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLSAgdGhlX21hcFtmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpXSA9IGZhY3Rvcnk7Ci19Ci0KLXRfZ2VuZXJhdG9yKiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25zKSB7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGNvbG9uID0gb3B0aW9ucy5maW5kKCc6Jyk7Ci0gIHN0cmluZyBsYW5ndWFnZSA9IG9wdGlvbnMuc3Vic3RyKDAsIGNvbG9uKTsKLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zOwotICBpZiAoY29sb24gIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gY29sb24rMTsKLSAgICB3aGlsZSAocG9zICE9IHN0cmluZzo6bnBvcyAmJiBwb3MgPCBvcHRpb25zLnNpemUoKSkgewotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgbmV4dF9wb3MgPSBvcHRpb25zLmZpbmQoJywnLCBwb3MpOwotICAgICAgc3RyaW5nIG9wdGlvbiA9IG9wdGlvbnMuc3Vic3RyKHBvcywgbmV4dF9wb3MtcG9zKTsKLSAgICAgIHBvcyA9ICgobmV4dF9wb3MgPT0gc3RyaW5nOjpucG9zKSA/IG5leHRfcG9zIDogbmV4dF9wb3MrMSk7Ci0KLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIHNlcGFyYXRvciA9IG9wdGlvbi5maW5kKCc9Jyk7Ci0gICAgICBzdHJpbmcga2V5LCB2YWx1ZTsKLSAgICAgIGlmIChzZXBhcmF0b3IgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGtleSA9IG9wdGlvbjsKLSAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGtleSA9IG9wdGlvbi5zdWJzdHIoMCwgc2VwYXJhdG9yKTsKLSAgICAgICAgdmFsdWUgPSBvcHRpb24uc3Vic3RyKHNlcGFyYXRvcisxKTsKLSAgICAgIH0KLQotICAgICAgcGFyc2VkX29wdGlvbnNba2V5XSA9IHZhbHVlOwotICAgIH0KLSAgfQotCi0gIGdlbl9tYXBfdCYgdGhlX21hcCA9IGdldF9nZW5lcmF0b3JfbWFwKCk7Ci0gIGdlbl9tYXBfdDo6aXRlcmF0b3IgaXRlciA9IHRoZV9tYXAuZmluZChsYW5ndWFnZSk7Ci0KLSAgaWYgKGl0ZXIgPT0gdGhlX21hcC5lbmQoKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIGl0ZXItPnNlY29uZC0+Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9ucyk7Ci19Ci0KLXRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QmIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpIHsKLSAgLy8gaHR0cDovL3d3dy5wYXJhc2hpZnQuY29tL2MrKy1mYXEtbGl0ZS9jdG9ycy5odG1sI2ZhcS0xMC4xMgotICBzdGF0aWMgZ2VuX21hcF90KiB0aGVfbWFwID0gbmV3IGdlbl9tYXBfdCgpOwotICByZXR1cm4gKnRoZV9tYXA7Ci19Ci0KLXRfZ2VuZXJhdG9yX2ZhY3Rvcnk6OnRfZ2VuZXJhdG9yX2ZhY3RvcnkoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbikKLSAgOiBzaG9ydF9uYW1lXyhzaG9ydF9uYW1lKQotICAsIGxvbmdfbmFtZV8obG9uZ19uYW1lKQotICAsIGRvY3VtZW50YXRpb25fKGRvY3VtZW50YXRpb24pCi17Ci0gIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodGhpcyk7Ci19CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNzAxNWQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0dFTkVSQVRPUl9ICi0jZGVmaW5lIFRfR0VORVJBVE9SX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGEgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGJhc2ljCi0gKiByb3V0aW5lcyBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCBjb250YWlucyB0aGUgdG9wIGxldmVsIG1ldGhvZCB0aGF0Ci0gKiBkaXNwYXRjaGVzIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgdmFyaW91cyBjb21wb25lbnRzLgotICoKLSAqLwotY2xhc3MgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0gICAgdG1wXyA9IDA7Ci0gICAgaW5kZW50XyA9IDA7Ci0gICAgcHJvZ3JhbV8gPSBwcm9ncmFtOwotICAgIHByb2dyYW1fbmFtZV8gPSBnZXRfcHJvZ3JhbV9uYW1lKHByb2dyYW0pOwotICAgIGVzY2FwZV9bJ1xuJ10gPSAiXFxuIjsKLSAgICBlc2NhcGVfWydcciddID0gIlxcciI7Ci0gICAgZXNjYXBlX1snXHQnXSA9ICJcXHQiOwotICAgIGVzY2FwZV9bJyInXSAgPSAiXFxcIiI7Ci0gICAgZXNjYXBlX1snXFwnXSA9ICJcXFxcIjsKLSAgfQotCi0gIHZpcnR1YWwgfnRfZ2VuZXJhdG9yKCkge30KLQotICAvKioKLSAgICogRnJhbWV3b3JrIGdlbmVyYXRvciBtZXRob2QgdGhhdCBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgYSBwcm9ncmFtCi0gICAqIGFuZCBwZXJmb3JtcyBnZW5lcmFsIGFjdGlvbnMuIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MgYW5kCi0gICAqIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgb3ZlcndyaXR0ZW4gaW4gdGhlIHN1YmNsYXNzZXMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOwotCi0gIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQotCi0gIHZvaWQgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfZW5kKTsKLQotICAvKioKLSAgICogRXNjYXBlIHN0cmluZyB0byB1c2Ugb25lIGluIGdlbmVyYXRlZCBzb3VyY2VzLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBlc2NhcGVfc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZpbikgY29uc3Q7Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2VzY2FwZWRfc3RyaW5nKHRfY29uc3RfdmFsdWUqIGNvbnN0dmFsKSB7Ci0gICAgcmV0dXJuIGVzY2FwZV9zdHJpbmcoY29uc3R2YWwtPmdldF9zdHJpbmcoKSk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLQotICAvKioKLSAgICogT3B0aW9uYWwgbWV0aG9kcyB0aGF0IG1heSBiZSBpbWxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gdGFrZSBuZWNlc3NhcnkKLSAgICogc3RlcHMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgY29kZSBnZW5lcmF0aW9uLgotICAgKi8KLQotICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7fQotICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkge30KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQdXJlIHZpcnR1YWwgbWV0aG9kcyBpbXBsZW1lbnRlZCBieSB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzZXMuCi0gICAqLwotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpICA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pICAgICA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KSB7fQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpICAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKSAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbikgewotICAgIC8vIEJ5IGRlZmF1bHQgZXhjZXB0aW9ucyBhcmUgdGhlIHNhbWUgYXMgc3RydWN0cwotICAgIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBnZXQgdGhlIHByb2dyYW0gbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3Byb2dyYW1fbmFtZSh0X3Byb2dyYW0qIHRwcm9ncmFtKSB7Ci0gICAgcmV0dXJuIHRwcm9ncmFtLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBnZXQgdGhlIHNlcnZpY2UgbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3NlcnZpY2VfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5Ci0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9vdXRfZGlyKCkgY29uc3QgewotICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyBvdXRfZGlyX2Jhc2VfICsgIi8iOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSB1bmlxdWUgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUsIHdoaWNoIGlzIGp1c3QgIm5hbWUiIHdpdGggYQotICAgKiBudW1iZXIgYXBwZW5kZWQgdG8gaXQgKGkuZS4gbmFtZTM1KQotICAgKi8KLSAgc3RkOjpzdHJpbmcgdG1wKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIG91dCA8PCBuYW1lIDw8IHRtcF8rKzsKLSAgICByZXR1cm4gb3V0LnN0cigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIGxldmVsIG1vZGlmaWVycwotICAgKi8KLQotICB2b2lkIGluZGVudF91cCgpewotICAgICsraW5kZW50XzsKLSAgfQotCi0gIHZvaWQgaW5kZW50X2Rvd24oKSB7Ci0gICAgLS1pbmRlbnRfOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIHByaW50IGZ1bmN0aW9uCi0gICAqLwotICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7Ci0gICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluZGVudF87ICsraSkgewotICAgICAgaW5kICs9ICIgICI7Ci0gICAgfQotICAgIHJldHVybiBpbmQ7Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gdXRpbGl0eSB3cmFwcGVyCi0gICAqLwotICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0gJm9zKSB7Ci0gICAgcmV0dXJuIG9zIDw8IGluZGVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhcGl0YWxpemF0aW9uIGhlbHBlcnMKLSAgICovCi0gIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGQ6OnN0cmluZyBkZWNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGQ6OnN0cmluZyBsb3dlcmNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOwotICAgIH0KLSAgICByZXR1cm4gaW47Ci0gIH0KLSAgLyoqCi0gICAqIFRyYW5zZm9ybXMgYSBjYW1lbCBjYXNlIHN0cmluZyB0byBhbiBlcXVpdmFsZW50IG9uZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMKLSAgICogZS5nLiBhTXVsdGlXb3JkIC0+IGFfbXVsdGlfd29yZAotICAgKiAgICAgIHNvbWVOYW1lICAgLT4gc29tZV9uYW1lCi0gICAqICAgICAgQ2FtZWxDYXNlICAtPiBjYW1lbF9jYXNlCi0gICAqICAgICAgbmFtZSAgICAgICAtPiBuYW1lCi0gICAqICAgICAgTmFtZSAgICAgICAtPiBuYW1lCi0gICAqLwotICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGluLnNpemUoKTsgKytpKSB7Ci0gICAgICBpZiAoaXN1cHBlcihpbltpXSkpIHsKLSAgICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKLSAgICAgICAgaW4uaW5zZXJ0KGksICJfIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbjsKLSAgfQotICAvKioKLSAgICAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMgdG8gYSBjYW1lbCBjYXNlIGVxdWl2YWxlbnQKLSAgICAqIGUuZy4gYV9tdWx0aV93b3JkIC0+IGFNdWx0aVdvcmQKLSAgICAqICAgICAgc29tZV9uYW1lICAgIC0+ICBzb21lTmFtZQotICAgICogICAgICBuYW1lICAgICAgICAgLT4gIG5hbWUKLSAgICAqLwotICBzdGQ6OnN0cmluZyBjYW1lbGNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIGJvb2wgdW5kZXJzY29yZSA9IGZhbHNlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7IGkrKykgewotICAgICAgaWYgKGluW2ldID09ICdfJykgewotICAgICAgICB1bmRlcnNjb3JlID0gdHJ1ZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAodW5kZXJzY29yZSkgewotICAgICAgICBvdXQgPDwgKGNoYXIpIHRvdXBwZXIoaW5baV0pOwotICAgICAgICB1bmRlcnNjb3JlID0gZmFsc2U7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgb3V0IDw8IGluW2ldOwotICAgIH0KLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0cnVlIHR5cGUgYmVoaW5kIGEgc2VyaWVzIG9mIHR5cGVkZWZzLgotICAgKi8KLSAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICByZXR1cm4gdHlwZTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICAvKioKLSAgICogVGhlIHByb2dyYW0gYmVpbmcgZ2VuZXJhdGVkCi0gICAqLwotICB0X3Byb2dyYW0qIHByb2dyYW1fOwotCi0gIC8qKgotICAgKiBRdWljayBhY2Nlc3NvciBmb3IgZm9ybWF0dGVkIHByb2dyYW0gbmFtZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZwotICAgKiBnZW5lcmF0ZWQuCi0gICAqLwotICBzdGQ6OnN0cmluZyBwcm9ncmFtX25hbWVfOwotCi0gIC8qKgotICAgKiBRdWljayBhY2Nlc3NvciBmb3IgZm9ybWF0dGVkIHNlcnZpY2UgbmFtZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZwotICAgKiBnZW5lcmF0ZWQuCi0gICAqLwotICBzdGQ6OnN0cmluZyBzZXJ2aWNlX25hbWVfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgdHlwZS1zcGVjaWZjIGRpcmVjdG9yeSBuYW1lICgiZ2VuLSoiKQotICAgKi8KLSAgc3RkOjpzdHJpbmcgb3V0X2Rpcl9iYXNlXzsKLQotICAvKioKLSAgICogTWFwIG9mIGNoYXJhY3RlcnMgdG8gZXNjYXBlIGluIHN0cmluZyBsaXRlcmFscy4KLSAgICovCi0gIHN0ZDo6bWFwPGNoYXIsIHN0ZDo6c3RyaW5nPiBlc2NhcGVfOwotCi0gcHJpdmF0ZToKLSAgLyoqCi0gICAqIEN1cnJlbnQgY29kZSBpbmRlbnRhdGlvbiBsZXZlbAotICAgKi8KLSAgaW50IGluZGVudF87Ci0KLSAgLyoqCi0gICAqIFRlbXBvcmFyeSB2YXJpYWJsZSBjb3VudGVyLCBmb3IgbWFraW5nIHVuaXF1ZSB2YXJpYWJsZSBuYW1lcwotICAgKi8KLSAgaW50IHRtcF87Ci19OwotCi0KLS8qKgotICogQSBmYWN0b3J5IGZvciBwcm9kdWNpbmcgZ2VuZXJhdG9yIGNsYXNzZXMgb2YgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgYWxzbyByZXNwb25zaWJsZSBmb3I6Ci0gKiAgLSBSZWdpc3RlcmluZyBpdHNlbGYgd2l0aCB0aGUgZ2VuZXJhdG9yIHJlZ2lzdHJ5LgotICogIC0gUHJvdmlkaW5nIGRvY3VtZW50YXRpb24gZm9yIHRoZSBnZW5lcmF0b3JzIGl0IHByb2R1Y2VzLgotICovCi1jbGFzcyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIHRfZ2VuZXJhdG9yX2ZhY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbik7Ci0KLSAgdmlydHVhbCB+dF9nZW5lcmF0b3JfZmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcigKLSAgICAgIC8vIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlLgotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgLy8gTm90ZTogcGFyc2VkX29wdGlvbnMgd2lsbCBub3QgZXhpc3QgYmV5b25kIHRoZSBjYWxsIHRvIGdldF9nZW5lcmF0b3IuCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIC8vIE5vdGU6IG9wdGlvbl9zdHJpbmcgbWlnaHQgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgPSAwOwotCi0gIHN0ZDo6c3RyaW5nIGdldF9zaG9ydF9uYW1lKCkgeyByZXR1cm4gc2hvcnRfbmFtZV87IH0KLSAgc3RkOjpzdHJpbmcgZ2V0X2xvbmdfbmFtZSgpIHsgcmV0dXJuIGxvbmdfbmFtZV87IH0KLSAgc3RkOjpzdHJpbmcgZ2V0X2RvY3VtZW50YXRpb24oKSB7IHJldHVybiBkb2N1bWVudGF0aW9uXzsgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgc2hvcnRfbmFtZV87Ci0gIHN0ZDo6c3RyaW5nIGxvbmdfbmFtZV87Ci0gIHN0ZDo6c3RyaW5nIGRvY3VtZW50YXRpb25fOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIGdlbmVyYXRvcj4KLWNsYXNzIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCA6IHB1YmxpYyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbChjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbikKLSAgICA6IHRfZ2VuZXJhdG9yX2ZhY3Rvcnkoc2hvcnRfbmFtZSwgbG9uZ19uYW1lLCBkb2N1bWVudGF0aW9uKQotICB7fQotCi0gIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKSB7Ci0gICAgcmV0dXJuIG5ldyBnZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOwotICB9Ci19OwotCi1jbGFzcyB0X2dlbmVyYXRvcl9yZWdpc3RyeSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCByZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSk7Ci0KLSAgc3RhdGljIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2dlbmVyYXRvcl9mYWN0b3J5Kj4gZ2VuX21hcF90OwotICBzdGF0aWMgZ2VuX21hcF90JiBnZXRfZ2VuZXJhdG9yX21hcCgpOwotCi0gcHJpdmF0ZToKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoKTsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoY29uc3QgdF9nZW5lcmF0b3JfcmVnaXN0cnkmKTsKLX07Ci0KLSNkZWZpbmUgVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpICAgICAgICBcCi0gIGNsYXNzIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgICAgICAgICAgICAgICAgICAgICAgXAotICAgIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+ICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4oICAgICAgICBcCi0gICAgICAgICAgI2xhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIF9yZWdpc3RlcmVyOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFhMTc0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEhhc2tlbGwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2hzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9oc19nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ocyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0gJm91dCx0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSxib29sIGhlbHBlcj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCk7Ci0KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBoc19hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgaHNfbGFuZ3VhZ2VfcHJhZ21hKCk7Ci0gIHN0ZDo6c3RyaW5nIGhzX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucyA9IGZhbHNlLCBib29sIGlvID0gZmFsc2UsIGJvb2wgbWV0aG9kID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMgPSB0cnVlKTsKLQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9pZmFjZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jbGllbnRfOwotCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0KLSAgc3RyaW5nIHBuYW1lID0gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTsKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcG5hbWUrIl9UeXBlcy5ocyI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKStwbmFtZSsiX0NvbnN0cy5ocyI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLQotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGwgPDwKLSAgICBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgIm1vZHVsZSAiIDw8IHBuYW1lIDw8Il9UeXBlcyB3aGVyZSIgPDwgZW5kbCA8PAotICAgIGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGZfY29uc3RzXyA8PAotICAgIGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGwgPDwKLSAgICBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgIm1vZHVsZSAiIDw8IHBuYW1lIDw8Il9Db25zdHMgd2hlcmUiIDw8IGVuZGwgPDwKLSAgICBoc19pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICJpbXBvcnQgIiA8PCBwbmFtZTw8Il9UeXBlcyI8PCBlbmRsOwotCi19Ci0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfbGFuZ3VhZ2VfcHJhZ21hKCkgewotICByZXR1cm4gc3RkOjpzdHJpbmcoInstIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19Iik7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikgKwotICAgICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuIiArCi0gICAgIi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tXG4iICsKLSAgICAiLS0gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcgLS1cbiIgKwotICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19pbXBvcnRzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICByZXN1bHQgKz0gImltcG9ydCBxdWFsaWZpZWQgIiArIGNhcGl0YWxpemUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl9UeXBlc1xuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0KLSAgcmVzdWx0ICs9ICJpbXBvcnQgVGhyaWZ0XG5pbXBvcnQgRGF0YS5UeXBlYWJsZSAoIFR5cGVhYmxlIClcbmltcG9ydCBDb250cm9sLkV4Y2VwdGlvblxuaW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXBcbmltcG9ydCBxdWFsaWZpZWQgRGF0YS5TZXQgYXMgU2V0XG5pbXBvcnQgRGF0YS5JbnQ7XG5pbXBvcnQgUHJlbHVkZSAoKD09KSwgU3RyaW5nLCBFcSwgU2hvdywgT3JkLCBNYXliZSguLiksICgmJiksICh8fCksIHJldHVybiwgSU8sIEVudW0sIGZyb21FbnVtLCB0b0VudW0sIEJvb2woLi4pLCAoKyspLCAoJCksIERvdWJsZSwgKC0pKSI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZSAiPDwgY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiIDw8IHJlbmRlcl9oc190eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImRhdGEgIjw8Y2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk8PCIgPSAiOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpZihmaXJzdCkKLSAgICAgIGZpcnN0PWZhbHNlOwotICAgIGVsc2UKLSAgICAgIGZfdHlwZXNfIDw8ICJ8IjsKLSAgICBmX3R5cGVzXyA8PCBuYW1lOwotICB9Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImRlcml2aW5nIChTaG93LEVxLCBUeXBlYWJsZSwgT3JkKSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbnQgdmFsdWUgPSAtMTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgRW51bSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJmcm9tRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAidG9FbnVtIHQgPSBjYXNlIHQgb2YiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgdmFsdWUgPDwgIiAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJfIC0+IHRocm93IFRocmlmdEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgOjogIiA8PCByZW5kZXJfaHNfdHlwZSh0eXBlLCBmYWxzZSkgPDwgZW5kbDsKLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlRydWUiIDogIkZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICBpbnQgdmFsID0gLTE7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICAgIHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICArK3ZhbDsKLSAgICAgIH0KLSAgICAgIGlmKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSl7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBzdHJpbmcgY25hbWUgPSB0eXBlX25hbWUodHlwZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgY25hbWUgPDwgInsiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBpZihmaXJzdCkKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgImZfIiA8PCBjbmFtZSA8PCAiXyIgPDwgZm5hbWUgPDwgIiA9IEp1c3QgKCIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiKSI7Ci0KLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOwotICAgIGJvb2wgZmlyc3Q9dHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpZihmaXJzdCkKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLCI8PCB2YWwgPDwgIikiOwotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotCi0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBldHlwZSA9ICgodF9saXN0KikgdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgIHsKLSAgICAgICAgZXR5cGUgPSAoKHRfc2V0KikgdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpCi0gICAgICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCAiOwotCi0gICAgb3V0IDw8ICJbIjsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZihmaXJzdCkKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIl0iOwotICAgIGlmICh0eXBlLT5pc19zZXQoKSkKLSAgICAgICAgb3V0IDw8ICIpIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhICJzdHJ1Y3QiCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QsIGJ1dCBhbHNvIGhhcyBhbiBleGNlcHRpb24gZGVjbGFyYXRpb24uCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBIYXNrZWxsIHN0cnVjdAotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sdHN0cnVjdCwgaXNfZXhjZXB0aW9uLGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyKSB7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJkYXRhICI8PHRuYW1lPDwiID0gIjw8dG5hbWU7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgInsiOwotICAgIGJvb2wgZmlyc3Q9dHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZihmaXJzdCkKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBzdHJpbmcgbW5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBvdXQgPDwgImZfIiA8PCB0bmFtZSA8PCAiXyIgPDwgbW5hbWUgPDwgIiA6OiBNYXliZSAiIDw8IHJlbmRlcl9oc190eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgfQotICAgIG91dCA8PCAifSI7Ci0gIH0KLQotICBvdXQgPDwgIiBkZXJpdmluZyAoU2hvdyxFcSxPcmQsVHlwZWFibGUpIiA8PCBlbmRsOwotICBpZiAoaXNfZXhjZXB0aW9uKSBvdXQgPDwgImluc3RhbmNlIEV4Y2VwdGlvbiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIC8vZl9zdHJ1Y3RfLmNsb3NlKCk7Ci19Ci0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKLSAgc3RyaW5nIHQgPSB0bXAoIl90Iik7Ci0gIHN0cmluZyBpZCA9IHRtcCgiX2lkIik7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiX2ZpZWxkcyBpcHJvdCByZWMgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7IC8vIGRvCi0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICIoXywiIDw8IHQgPDwiLCI8PGlkPDwiKSA8LSByZWFkRmllbGRCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PAotICAgICJpZiAiIDw8IHQgPDwiID09IFRfU1RPUCB0aGVuIHJldHVybiByZWMgZWxzZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7IC8vIGlmCi0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgaWQ8PCIgb2YgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsgLy8gY2FzZQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICI7Ci0gICAgb3V0IDw8ICJpZiAiIDw8IHQgPDwiID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0aGVuIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOyAvLyBpZgotICAgIGluZGVudChvdXQpIDw8ICJzIDwtICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLHN0cik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInJlYWRfIjw8c25hbWU8PCJfZmllbGRzIGlwcm90IHJlY3tmXyI8PHNuYW1lPDwiXyI8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCI9SnVzdCBzfSIgPDwgZW5kbDsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJlbHNlIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJza2lwIGlwcm90ICI8PCB0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInJlYWRfIjw8c25hbWU8PCJfZmllbGRzIGlwcm90IHJlYyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOyAvLyAtZG8KLSAgICBpbmRlbnRfZG93bigpOyAvLyAtaWYKLSAgfQotCi0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiXyAtPiBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJza2lwIGlwcm90ICI8PHQ8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmVhZEZpZWxkRW5kIGlwcm90IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmVhZF8iPDxzbmFtZTw8Il9maWVsZHMgaXByb3QgcmVjIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOyAvLyAtY2FzZQotICBpbmRlbnRfZG93bigpOyAvLyAtaWYKLSAgaW5kZW50X2Rvd24oKTsgLy8gLWRvCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gcmVhZAotICBpbmRlbnQob3V0KSA8PCAicmVhZF8iPDxzbmFtZTw8IiBpcHJvdCA9IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJlYWRTdHJ1Y3RCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJlYyA8LSByZWFkXyI8PHNuYW1lPDwiX2ZpZWxkcyBpcHJvdCAoIjw8c25hbWU8PCJ7IjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYoZmlyc3QpCi0gICAgICBmaXJzdD1mYWxzZTsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgIiwiOwotICAgIG91dCA8PCAiZl8iIDw8IHNuYW1lIDw8ICJfIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiPU5vdGhpbmciOwotICB9Ci0gIG91dCA8PCAifSkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWFkU3RydWN0RW5kIGlwcm90IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJlYyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgZiA9IHRtcCgiX2YiKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ3cml0ZV8iPDxuYW1lPDwiIG9wcm90IHJlYyA9IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid3JpdGVTdHJ1Y3RCZWdpbiBvcHJvdCBcIiI8PG5hbWU8PCJcIiIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJjYXNlIGZfIiA8PCBuYW1lIDw8ICJfIiA8PCBtbmFtZSA8PCAiIHJlYyBvZiB7Tm90aGluZyAtPiByZXR1cm4gKCk7IEp1c3QgX3YgLT4gZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIndyaXRlRmllbGRCZWdpbiBvcHJvdCAoXCIiPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpPDwiXCIsIgotICAgICAgICAgICAgICAgIDw8dHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk8PCIsIgotICAgICAgICAgICAgICAgIDw8KCpmX2l0ZXIpLT5nZXRfa2V5KCk8PCIpIiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIl92Iik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIndyaXRlRmllbGRFbmQgb3Byb3R9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAid3JpdGVGaWVsZFN0b3Agb3Byb3QiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAid3JpdGVTdHJ1Y3RFbmQgb3Byb3QiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIuaHMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGwgPDwKLSAgICBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIiB3aGVyZSIgPDwgZW5kbCA8PAotICAgIGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0KLSAgaWYodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgfQotCi0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBxdWFsaWZpZWQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2UgYXMgSWZhY2UiIDw8IGVuZGw7Ci0KLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiLS0gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyAtLSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfaWZhY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkrY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSsiX0lmYWNlLmhzIjsKLSAgZl9pZmFjZV8ub3BlbihmX2lmYWNlX25hbWUuY19zdHIoKSk7Ci0gIGluZGVudChmX2lmYWNlXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSB3aGVyZSIgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9pZmFjZV8pIDw8Ci0gICAgaHNfaW1wb3J0cygpIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJpbXBvcnQgIiA8PCBleHRlbmRzIDw8Il9JZmFjZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIGEgPT4gIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX2lmYWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsdHJ1ZSx0cnVlLHRydWUpOwotICAgIGZfaWZhY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDo6IGEgLT4gIiA8PCBmdCAgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX2lmYWNlXy5jbG9zZSgpOwotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIEhhc2tlbGwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuIFRoaXMgaXMgYmVjYXVzZQotICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb3RoaW5nLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfY2xpZW50X25hbWUgPSBnZXRfb3V0X2RpcigpK2NhcGl0YWxpemUoc2VydmljZV9uYW1lXykrIl9DbGllbnQuaHMiOwotICBmX2NsaWVudF8ub3BlbihmX2NsaWVudF9uYW1lLmNfc3RyKCkpOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHBvcnRzPSIiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZihmaXJzdCkKLSAgICAgIGZpcnN0PWZhbHNlOwotICAgIGVsc2UKLSAgICAgIGV4cG9ydHMrPSIsIjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBleHBvcnRzKz1mdW5uYW1lOwotICB9Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfQ2xpZW50KCI8PGV4cG9ydHM8PCIpIHdoZXJlIiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGV4dGVuZHMgPDwgIl9DbGllbnQiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCBEYXRhLklPUmVmIiA8PCBlbmRsOwotICBpbmRlbnQoZl9jbGllbnRfKSA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgZW5kbDsKLSAgLy8gREFUUyBSSVRFIEEgR0xPQkFMIFZBUgotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxaWQgPSBuZXdJT1JlZiAwIiA8PCBlbmRsOwotCi0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBzdHJpbmcgZmFyZ3MgPSAiIjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZmFyZ3MrPSAiIGFyZ18iICsgZGVjYXBpdGFsaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgZnVubmFtZSA8PCAiIChpcCxvcCkiIDw8ICBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiIG9wIiA8PCBmYXJnczsKLQotICAgIGZfY2xpZW50XyA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX2NsaWVudF8gPDwgaW5kZW50KCk7Ci0gICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIgaXAiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxIDwtIHNlcWlkIiA8PCBlbmRsOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXFuIDwtIHJlYWRJT1JlZiBzZXEiIDw8IGVuZGw7Ci0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfY2xpZW50XyA8PAotICAgICAgaW5kZW50KCkgPDwgIndyaXRlTWVzc2FnZUJlZ2luIG9wIChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgTV9DQUxMLCBzZXFuKSIgPDwgZW5kbDsKLSAgICBmX2NsaWVudF8gPDwgaW5kZW50KCkgPDwgIndyaXRlXyIgPDwgYXJnc25hbWUgPDwgIiBvcCAoIjw8YXJnc25hbWU8PCJ7IjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYoZmlyc3QpCi0gICAgICAgIGZpcnN0PWZhbHNlOwotICAgICAgZWxzZQotICAgICAgICBmX2NsaWVudF8gPDwgIiwiOwotICAgICAgZl9jbGllbnRfIDw8ICJmXyIgPDwgYXJnc25hbWUgPDwiXyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIj1KdXN0IGFyZ18iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX2NsaWVudF8gPDwgIn0pIiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfY2xpZW50XyA8PAotICAgICAgaW5kZW50KCkgPDwgIndyaXRlTWVzc2FnZUVuZCBvcCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInRGbHVzaCAoZ2V0VHJhbnNwb3J0IG9wKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICBzdGQ6OnN0cmluZyBmdW5uYW1lID0gc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZnVubmFtZSA8PCAiIGlwID0gZG8iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsgLy8gZnVuCi0KLSAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KLQotICAgICAgZl9jbGllbnRfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpIDwtIHJlYWRNZXNzYWdlQmVnaW4gaXAiIDw8IGVuZGw7Ci0gICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIG10eXBlID09IE1fRVhDRVBUSU9OIHRoZW4gZG8iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeCA8LSByZWFkQXBwRXhuIGlwIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJlYWRNZXNzYWdlRW5kIGlwIiA8PCBlbmRsOwotICAgICAgZl9jbGllbnRfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHgiIDw8IGVuZGw7Ci0gICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZWxzZSByZXR1cm4gKCkiIDw8IGVuZGw7Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICAgICAgZl9jbGllbnRfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXMgPC0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKLSAgICAgIGZfY2xpZW50XyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVhZE1lc3NhZ2VFbmQgaXAiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiY2FzZSBmXyIgPDwgcmVzdWx0bmFtZSA8PCAiX3N1Y2Nlc3MgcmVzIG9mIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsgLy8gY2FzZQotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiSnVzdCB2IC0+IHJldHVybiB2IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiTm90aGluZyAtPiBkbyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7IC8vIG5vbmUKLSAgICAgIH0KLQotCi0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiY2FzZSBmXyI8PCByZXN1bHRuYW1lIDw8ICJfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiByZXMgb2YiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOyAvL2Nhc2UKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIk5vdGhpbmcgLT4gcmV0dXJuICgpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiSnVzdCBfdiAtPiB0aHJvdyBfdiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsgLy8tY2FzZQotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PAotICAgICAgICAgICJyZXR1cm4gKCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2NsaWVudF8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgKEFwcEV4biBBRV9NSVNTSU5HX1JFU1VMVCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsgLy8tbm9uZQotICAgICAgICBpbmRlbnRfZG93bigpOyAvLy1jYXNlCi0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOyAvLy1mdW4KLSAgICB9Ci0gIH0KLSAgZl9jbGllbnRfLmNsb3NlKCk7Ci0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpID0gY2FzZSBuYW1lIG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJcIiI8PGZuYW1lPDwiXCIgLT4gcHJvY2Vzc18iIDw8IGRlY2FwaXRhbGl6ZShmbmFtZSkgPDwgIiAoc2VxaWQsaXByb3Qsb3Byb3QsaGFuZGxlcikiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfIC0+ICI7Ci0gIGlmKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpewotICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSA8PCAiLnByb2MgaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJza2lwIGlwcm90IFRfU1RSVUNUIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVhZE1lc3NhZ2VFbmQgaXByb3QiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAobmFtZSxNX0VYQ0VQVElPTixzZXFpZCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZUFwcEV4biBvcHJvdCAoQXBwRXhuIEFFX1VOS05PV05fTUVUSE9EIChcIlVua25vd24gZnVuY3Rpb24gXCIgKysgbmFtZSkpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidEZsdXNoIChnZXRUcmFuc3BvcnQgb3Byb3QpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwcm9jZXNzIGhhbmRsZXIgKGlwcm90LCBvcHJvdCkgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIobmFtZSwgdHlwLCBzZXFpZCkgPC0gcmVhZE1lc3NhZ2VCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvYyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVHJ1ZSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCwgaGFuZGxlcikgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzIDwtIHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlYWRNZXNzYWdlRW5kIGlwcm90IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGludCBuID0geGNlcHRpb25zLnNpemUoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKXsKLSAgICBpZighdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpewotICAgICAgbisrOwotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJzIDwtIHJldHVybiAoIiA8PCByZXN1bHRuYW1lOwotCi0gICAgZm9yKGludCBpPTA7IGk8bjtpKyspewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIE5vdGhpbmciOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXMgPC0gIjsKLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmb3IodW5zaWduZWQgaW50IGk9MDtpPHhjZXB0aW9ucy5zaXplKCk7aSsrKXsKLSAgICAgIGZfc2VydmljZV8gPDwgIihDb250cm9sLkV4Y2VwdGlvbi5jYXRjaCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICIoZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKXsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXMgPC0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJJZmFjZS4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIGhhbmRsZXIiOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgICIgKGZfIiA8PCBhcmdzbmFtZSA8PCAgIl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGFyZ3MpIjsKLSAgfQotCi0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSl7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJze2ZfIjw8cmVzdWx0bmFtZTw8Il9zdWNjZXNzPSBKdXN0IHJlc30iOwotICB9IGVsc2UgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKXsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcnMiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwICYmICF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFxcZSAgLT4gIiA8PGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKXsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gcnN7Zl8iPDxyZXN1bHRuYW1lPDwiXyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPUp1c3QgZX0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gKCkiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotCi0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ3cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIE1fUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAid3JpdGVfIjw8cmVzdWx0bmFtZTw8IiBvcHJvdCByZXMiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAid3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInRGbHVzaCAoZ2V0VHJhbnNwb3J0IG9wcm90KSIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCl7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsdHlwZSk7Ci19Ci0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKXsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKLSAgfQotCi0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgICBvdXQgPDwgIiBpcHJvdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICBvdXQgPDwgIihkbyB7aSA8LSByZWFkSTMyIGlwcm90OyByZXR1cm4gKHRvRW51bSBpIDo6ICIgPDwgZW5hbWUgPDwgIil9KSI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKLSAgb3V0IDw8ICIocmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOwotCi19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0gIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8ICIobGV0IHtmIDAgPSByZXR1cm4gW107IGYgbiA9IGRvIHtrIDwtICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgb3V0IDw8ICI7IHYgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICBvdXQgPDwgIjtyIDwtIGYgKG4tMSk7IHJldHVybiAkIChrLHYpOnJ9fSBpbiBkbyB7KCI8PGt0eXBlPDwiLCI8PHZ0eXBlPDwiLCI8PHNpemU8PCIpIDwtIHJlYWRNYXBCZWdpbiBpcHJvdDsgbCA8LSBmICIgPDwgc2l6ZSA8PCAiOyByZXR1cm4gJCBNYXAuZnJvbUxpc3QgbH0pIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgIihsZXQge2YgMCA9IHJldHVybiBbXTsgZiBuID0gZG8ge3YgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBvdXQgPDwgIjtyIDwtIGYgKG4tMSk7IHJldHVybiAkIHY6cn19IGluIGRvIHsoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPC0gcmVhZFNldEJlZ2luIGlwcm90OyBsIDwtIGYgIiA8PCBzaXplIDw8ICI7IHJldHVybiAkIFNldC5mcm9tTGlzdCBsfSkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIihsZXQge2YgMCA9IHJldHVybiBbXTsgZiBuID0gZG8ge3YgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBvdXQgPDwgIjtyIDwtIGYgKG4tMSk7IHJldHVybiAkIHY6cn19IGluIGRvIHsoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPC0gcmVhZExpc3RCZWdpbiBpcHJvdDsgZiAiIDw8IHNpemUgPDwgIn0pIjsKLSAgfQotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZihuYW1lLmxlbmd0aCgpID09IDApewotICAgIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZyBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNiBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIgb3Byb3QgIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0IG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSBvcHJvdCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBocyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIgb3Byb3QgKGZyb21FbnVtICI8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJ3cml0ZV8iKSA8PCAiIG9wcm90ICIgPDwgcHJlZml4OwotfQotCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBrID0gdG1wKCJfa2l0ZXIiKTsKLSAgICBzdHJpbmcgdiA9IHRtcCgiX3ZpdGVyIik7Ci0gICAgb3V0IDw8ICIobGV0IHtmIFtdID0gcmV0dXJuICgpOyBmICgoIjw8azw8IiwiPDx2PDwiKTp0KSA9IGRvIHsiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGssIHYpOwotICAgIG91dCA8PCAiO2YgdH19IGluIGRvIHt3cml0ZU1hcEJlZ2luIG9wcm90ICgiPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpPDwiLCI8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk8PCIsTWFwLnNpemUgIiA8PCBwcmVmaXggPDwgIik7IGYgKE1hcC50b0xpc3QgIiA8PCBwcmVmaXggPDwgIik7d3JpdGVNYXBFbmQgb3Byb3R9KSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIHYgPSB0bXAoIl92aXRlciIpOwotICAgIG91dCA8PCAiKGxldCB7ZiBbXSA9IHJldHVybiAoKTsgZiAoIjw8djw8Ijp0KSA9IGRvIHsiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHYpOwotICAgIG91dCA8PCAiO2YgdH19IGluIGRvIHt3cml0ZVNldEJlZ2luIG9wcm90ICgiPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTw8IixTZXQuc2l6ZSAiIDw8IHByZWZpeCA8PCAiKTsgZiAoU2V0LnRvTGlzdCAiIDw8IHByZWZpeCA8PCAiKTt3cml0ZVNldEVuZCBvcHJvdH0pIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIHYgPSB0bXAoIl92aXRlciIpOwotICAgIG91dCA8PCAiKGxldCB7ZiBbXSA9IHJldHVybiAoKTsgZiAoIjw8djw8Ijp0KSA9IGRvIHsiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgdik7Ci0gICAgb3V0IDw8ICI7ZiB0fX0gaW4gZG8ge3dyaXRlTGlzdEJlZ2luIG9wcm90ICgiPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk8PCIsbGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyBmICIgPDwgcHJlZml4IDw8ICI7d3JpdGVMaXN0RW5kIG9wcm90fSkiOwotICB9Ci0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBvdXQgPDwgImRvIHsiOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLSAgb3V0IDw8ICI7IjsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci0gIG91dCA8PCAifSI7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucywgYm9vbCBpbywgYm9vbCBtZXRob2QpewotICBzdHJpbmcgcmVzdWx0PSIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYob3B0aW9ucykgcmVzdWx0ICs9ICJNYXliZSAiOwotICAgIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbnMpOwotICAgIHJlc3VsdCArPSAiIC0+ICI7Ci0gIH0KLSAgaWYoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCl7Ci0gICAgcmVzdWx0ICs9ICIoKSAtPiAiOwotICB9Ci0gIGlmKGlvKSByZXN1bHQgKz0gIklPICI7Ci0gIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgaW8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXgpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl9UeXBlcy4iOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIGlmKHR0eXBlLT5pc19zZXJ2aWNlKCkpewotICAgIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpOwotICB9IGVsc2UgewotICAgIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpOwotICB9Ci0gIHJldHVybiBwcmVmaXggKyBmdW5jdGlvbl9wcmVmaXggKyBuYW1lOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJUX1ZPSUQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVF9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVF9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVF9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBoYXNrZWxsIHR5cGUKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZSh0X3R5cGUqIHR5cGUsIGJvb2wgbmVlZHNfcGFyZW5zKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdHJpbmcgdHlwZV9yZXByOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICIoKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJCb29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIkludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIkludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIkludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIkludDY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiRG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuIGNhcGl0YWxpemUoKCh0X2VudW0qKXR5cGUpLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgdHlwZV9yZXByID0gIk1hcC5NYXAgIiArIHJlbmRlcl9oc190eXBlKGt0eXBlLCB0cnVlKSArICIgIiArIHJlbmRlcl9oc190eXBlKHZ0eXBlLCB0cnVlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotCi0gICAgdHlwZV9yZXByID0gIlNldC5TZXQgIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCB0cnVlKSA7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiAiWyIgKyByZW5kZXJfaHNfdHlwZShldHlwZSwgZmFsc2UpICsgIl0iOwotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBuZWVkc19wYXJlbnMgPyAiKCIgKyB0eXBlX3JlcHIgKyAiKSIgOiB0eXBlX3JlcHI7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihocywgIkhhc2tlbGwiLCAiIik7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZmRmOTUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEhUTUwgY29kZSBnZW5lcmF0b3IKLSAqCi0gKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KLSAqLwotY2xhc3MgdF9odG1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2h0bWxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1odG1sIjsKLSAgICBlc2NhcGVfLmNsZWFyKCk7Ci0gICAgZXNjYXBlX1snJiddICA9ICImYW1wOyI7Ci0gICAgZXNjYXBlX1snPCddICA9ICImbHQ7IjsKLSAgICBlc2NhcGVfWyc+J10gID0gIiZndDsiOwotICAgIGVzY2FwZV9bJyInXSAgPSAiJnF1b3Q7IjsKLSAgICBlc2NhcGVfWydcJyddID0gIiZhcG9zOyI7Ci0gIH0KLQotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOwotICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0JCQkJIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaW5kZXgoKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc3MoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLQotICB2b2lkIHByaW50X2RvYyAgICAgICAgKHRfZG9jKiB0ZG9jKTsKLSAgaW50ICBwcmludF90eXBlICAgICAgICh0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl9vdXRfOwotfTsKLQotLyoqCi0gKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jKCkgewotICBmX291dF8gPDwgIjx0YWJsZT48dHI+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD4iCi0JIDw8ICI8dGg+RGF0YSB0eXBlczwvdGg+PHRoPkNvbnN0YW50czwvdGg+PC90cj4iIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyhwcm9ncmFtXyk7Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBSZWN1cnNlcyB0aHJvdWdoIGZyb20gdGhlIHByb3ZpZGVkIHByb2dyYW0gYW5kIGdlbmVyYXRlcyBhIFRvQyByb3cKLSAqIGZvciBlYWNoIGRpc2NvdmVyZWQgcHJvZ3JhbSBleGFjdGx5IG9uY2UgYnkgbWFpbnRhaW5pbmcgdGhlIGxpc3Qgb2YKLSAqIGNvbXBsZXRlZCByb3dzIGluICdmaW5pc2hlZCcKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0JCQkJIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCkgewotICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGZpbmlzaGVkLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBmaW5pc2hlZC5lbmQoKTsgaXRlcisrKSB7Ci0gICAgaWYgKHRwcm9nLT5nZXRfcGF0aCgpID09ICgqaXRlciktPmdldF9wYXRoKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZmluaXNoZWQucHVzaF9iYWNrKHRwcm9nKTsKLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRwcm9nKTsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gdHByb2ctPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cygqaXRlciwgZmluaXNoZWQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZykgewotICBzdHJpbmcgZm5hbWUgPSB0cHJvZy0+Z2V0X25hbWUoKSArICIuaHRtbCI7Ci0gIGZfb3V0XyA8PCAiPHRyPiIgPDwgZW5kbCA8PCAiPHRkPiIgPDwgdHByb2ctPmdldF9uYW1lKCkgPDwgIjwvdGQ+PHRkPiI7Ci0gIGlmICghdHByb2ctPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSB0cHJvZy0+Z2V0X3NlcnZpY2VzKCk7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgZm5hbWUgPDwgIiNTdmNfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKLQkgICAgIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBmX291dF8gPDwgIjx1bD4iIDw8IGVuZGw7Ci0gICAgICBtYXA8c3RyaW5nLHN0cmluZz4gZm5faHRtbDsKLSAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gKCpzdl9pdGVyKS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7Ci0Jc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOwotCXN0cmluZyBodG1sID0gIjxsaT48YSBocmVmPVwiIiArIGZuYW1lICsgIiNGbl8iICsgbmFtZSArICJfIiArCi0JICBmbl9uYW1lICsgIlwiPiIgKyBmbl9uYW1lICsgIjwvYT48L2xpPiI7Ci0JZm5faHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsc3RyaW5nPihmbl9uYW1lLCBodG1sKSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKG1hcDxzdHJpbmcsc3RyaW5nPjo6aXRlcmF0b3IgaHRtbF9pdGVyID0gZm5faHRtbC5iZWdpbigpOwotCSAgIGh0bWxfaXRlciAhPSBmbl9odG1sLmVuZCgpOyBodG1sX2l0ZXIrKykgewotCWZfb3V0XyA8PCBodG1sX2l0ZXItPnNlY29uZCA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICI8L3VsPiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7Ci0gIG1hcDxzdHJpbmcsc3RyaW5nPiBkYXRhX3R5cGVzOwotICBpZiAoIXRwcm9nLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gdHByb2ctPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCplbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgZm5hbWUgPDwgIiNFbnVtXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLyA8PCAgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0VudW1fIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotCSI8L2E+IjsKLSAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgfQotICBpZiAoIXRwcm9nLT5nZXRfdHlwZWRlZnMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gdHByb2ctPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCp0ZF9pdGVyKS0+Z2V0X3N5bWJvbGljKCk7Ci0gICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IGZuYW1lIDw8ICIjVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQotICAgICAgLy8gPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI1R5cGVkZWZfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotCSI8L2E+IjsKLSAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgfQotICBpZiAoIXRwcm9nLT5nZXRfb2JqZWN0cygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gdHByb2ctPmdldF9vYmplY3RzKCk7Ci0gICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKLSAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqb19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBmbmFtZSA8PCAiI1N0cnVjdF8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQotICAgICAgLy88PCAiPC9hPjxici8+IiA8PCBlbmRsOwotICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBmbmFtZSArICIjU3RydWN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lICsKLQkiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGR0X2l0ZXIgPSBkYXRhX3R5cGVzLmJlZ2luKCk7Ci0gICAgICAgZHRfaXRlciAhPSBkYXRhX3R5cGVzLmVuZCgpOyBkdF9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgZHRfaXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+PGNvZGU+IjsKLSAgaWYgKCF0cHJvZy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3RfaHRtbDsKLSAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHRwcm9nLT5nZXRfY29uc3RzKCk7Ci0gICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY29uX2l0ZXI7Ci0gICAgZm9yIChjb25faXRlciA9IGNvbnN0cy5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY29uX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpjb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgaHRtbCA9IjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0NvbnN0XyIgKyBuYW1lICsKLQkiXCI+IiArIG5hbWUgKyAiPC9hPiI7Ci0gICAgICBjb25zdF9odG1sLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gICAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGNvbl9pdGVyID0gY29uc3RfaHRtbC5iZWdpbigpOwotCSBjb25faXRlciAhPSBjb25zdF9odG1sLmVuZCgpOyBjb25faXRlcisrKSB7Ci0gICAgICBmX291dF8gPDwgY29uX2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+IiA8PCBlbmRsIDw8ICI8L3RyPiI7Ci19Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbS4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKLSAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiPGh0bWw+PGhlYWQ+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxsaW5rIGhyZWY9XCJzdHlsZS5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIvPiIKLQkgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8dGl0bGU+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKQotCSA8PCAiPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsIDw8ICI8aDE+VGhyaWZ0IG1vZHVsZTogIgotCSA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiPC9oMT4iIDw8IGVuZGw7Ci0KLSAgcHJpbnRfZG9jKHByb2dyYW1fKTsKLQotICBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOwotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkNvbnN0YW50c1wiPkNvbnN0YW50czwvaDI+IiA8PCBlbmRsOwotICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKLSAgICBmX291dF8gPDwgIjx0YWJsZT4iOwotICAgIGZfb3V0XyA8PCAiPHRyPjx0aD5Db25zdGFudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7Ci0gICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7Ci0gIH0KLQotICBpZiAoIXByb2dyYW1fLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkVudW1lcmF0aW9uc1wiPkVudW1lcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIGVudW1zCi0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiVHlwZWRlZnNcIj5UeXBlIGRlY2xhcmF0aW9uczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTdHJ1Y3RzXCI+RGF0YSBzdHJ1Y3R1cmVzPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgc3RydWN0cyBhbmQgZXhjZXB0aW9ucyBpbiBkZWNsYXJlZCBvcmRlcgotICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKLQlnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKLSAgICAgIH0gZWxzZSB7Ci0JZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiU2VydmljZXNcIj5TZXJ2aWNlczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGZfb3V0XyA8PCAiPC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotCi0gIGdlbmVyYXRlX2luZGV4KCk7Ci0gIGdlbmVyYXRlX2NzcygpOwotfQotCi0vKioKLSAqIEVtaXRzIHRoZSBpbmRleC5odG1sIGZpbGUgZm9yIHRoZSByZWN1cnNpdmUgc2V0IG9mIFRocmlmdCBwcm9ncmFtcwotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2luZGV4KCkgewotICBzdHJpbmcgaW5kZXhfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgImluZGV4Lmh0bWwiOwotICBmX291dF8ub3BlbihpbmRleF9mbmFtZS5jX3N0cigpKTsKLSAgZl9vdXRfIDw8ICI8aHRtbD48aGVhZD4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPGxpbmsgaHJlZj1cInN0eWxlLmNzc1wiIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIi8+IgotCSA8PCBlbmRsOwotICBmX291dF8gPDwgIjx0aXRsZT5BbGwgVGhyaWZ0IGRlY2xhcmF0aW9uczwvdGl0bGU+PC9oZWFkPjxib2R5PiIKLQkgPDwgZW5kbCA8PCAiPGgxPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC9oMT4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlPjx0cj48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPjx0aD5EYXRhIHR5cGVzPC90aD4iCi0JIDw8ICI8dGg+Q29uc3RhbnRzPC90aD48L3RyPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zOwotICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHByb2dyYW1fLCBwcm9ncmFtcyk7Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotfQotCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzcygpIHsKLSAgc3RyaW5nIGNzc19mbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAic3R5bGUuY3NzIjsKLSAgZl9vdXRfLm9wZW4oY3NzX2ZuYW1lLmNfc3RyKCkpOwotICBmX291dF8gPDwgIi8qIEF1dG8tZ2VuZXJhdGVkIENTUyBmb3IgZ2VuZXJhdGVkIFRocmlmdCBkb2NzICovIiA8PCBlbmRsOwotICBmX291dF8gPDwKLSAgICAiYm9keSB7IGZvbnQtZmFtaWx5OiBUYWhvbWEsIHNhbnMtc2VyaWY7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJwcmUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOyBwYWRkaW5nOiA2cHg7IH0iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PAotICAgICJoMyxoNCB7IHBhZGRpbmctdG9wOiAwcHg7IG1hcmdpbi10b3A6IDBweDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgImRpdi5kZWZpbml0aW9uIHsgYm9yZGVyOiAxcHggc29saWQgZ3JheTsgbWFyZ2luOiAxMHB4OyBwYWRkaW5nOiAxMHB4OyB9IiA8PCBlbmRsOwotICBmX291dF8gPDwKLSAgICAiZGl2LmV4dGVuZHMgeyBtYXJnaW46IC0wLjVlbSAwIDFlbSA1ZW0gfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgInRhYmxlIHsgYm9yZGVyOiAxcHggc29saWQgZ3JleTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgInRkIHsgYm9yZGVyOiAxcHggc29saWQgZ3JleTsgcGFkZGluZzogMXB4IDZweDsgdmVydGljYWwtYWxpZ246IHRvcDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8Ci0gICAgInRoIHsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IGJhY2tncm91bmQtY29sb3I6ICNiYmJiYmI7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgdGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMXB4IDZweDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogSWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIGRvY3VtZW50YXRpb24gYXR0YWNoZWQsIHRoaXMKLSAqIHdpbGwgZW1pdCBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBIVE1MIGZvcm1hdC4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9kb2ModF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIHN0cmluZyBkb2MgPSB0ZG9jLT5nZXRfZG9jKCk7Ci0gICAgc2l6ZV90IGluZGV4OwotICAgIHdoaWxlICgoaW5kZXggPSBkb2MuZmluZF9maXJzdF9vZigiXHJcbiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGlmIChpbmRleCA9PSAwKSB7Ci0JZl9vdXRfIDw8ICI8cC8+IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLQlmX291dF8gPDwgZG9jLnN1YnN0cigwLCBpbmRleCkgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChpbmRleCArIDEgPCBkb2Muc2l6ZSgpICYmIGRvYy5hdChpbmRleCkgIT0gZG9jLmF0KGluZGV4ICsgMSkgJiYKLQkgIChkb2MuYXQoaW5kZXggKyAxKSA9PSAnXHInIHx8IGRvYy5hdChpbmRleCArIDEpID09ICdcbicpKSB7Ci0JaW5kZXgrKzsKLSAgICAgIH0KLSAgICAgIGRvYyA9IGRvYy5zdWJzdHIoaW5kZXggKyAxKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8IGRvYyA8PCAiPGJyLz4iOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIG91dCB0aGUgcHJvdmlkZWQgdHlwZSBpbiBIVE1MCi0gKi8KLWludCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgaW50IGxlbiA9IDA7Ci0gIGZfb3V0XyA8PCAiPGNvZGU+IjsKLSAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBmX291dF8gPDwgImxpc3QmbHQ7IjsKLSAgICAgIGxlbiA9IDYgKyBwcmludF90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiZndDsiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBmX291dF8gPDwgInNldCZsdDsiOwotICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZl9vdXRfIDw8ICJtYXAmbHQ7IjsKLSAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICBsZW4gKz0gcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICAgIGZfb3V0XyA8PCAiJmd0OyI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGZfb3V0XyA8PCB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICBsZW4gPSB0dHlwZS0+Z2V0X25hbWUoKS5zaXplKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHByb2dfbmFtZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyB0eXBlX25hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IHByb2dfbmFtZSA8PCAiLmh0bWwjIjsKLSAgICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgZl9vdXRfIDw8ICJUeXBlZGVmXyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiU3RydWN0XyI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBmX291dF8gPDwgIkVudW1fIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiU3ZjXyI7Ci0gICAgfQotICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIlwiPiI7Ci0gICAgbGVuID0gdHlwZV9uYW1lLnNpemUoKTsKLSAgICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gcHJvZ3JhbV8pIHsKLSAgICAgIGZfb3V0XyA8PCBwcm9nX25hbWUgPDwgIi4iOwotICAgICAgbGVuICs9IHByb2dfbmFtZS5zaXplKCkgKyAxOwotICAgIH0KLSAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICI8L2E+IjsKLSAgfQotICBmX291dF8gPDwgIjwvY29kZT4iOwotICByZXR1cm4gbGVuOwotfQotCi0vKioKLSAqIFByaW50cyBvdXQgYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHN3aXRjaCAodHZhbHVlLT5nZXRfdHlwZSgpKSB7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKLSAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKLSAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgotICAgIGZfb3V0XyA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkgPDwgJyInOwotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKLSAgICB7Ci0gICAgICBmX291dF8gPDwgInsgIjsKLSAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOwotICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIG1hcF9pdGVyOwotICAgICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7Ci0JICAgbWFwX2l0ZXIrKykgewotCWlmICghZmlyc3QpIHsKLQkgIGZfb3V0XyA8PCAiLCAiOwotCX0KLQlmaXJzdCA9IGZhbHNlOwotCXByaW50X2NvbnN0X3ZhbHVlKG1hcF9pdGVyLT5maXJzdCk7Ci0JZl9vdXRfIDw8ICIgPSAiOwotCXByaW50X2NvbnN0X3ZhbHVlKG1hcF9pdGVyLT5zZWNvbmQpOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICIgfSI7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6Ci0gICAgewotICAgICAgZl9vdXRfIDw8ICJ7ICI7Ci0gICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7OwotICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOwotICAgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOwotCSAgIGxpc3RfaXRlcisrKSB7Ci0JaWYgKCFmaXJzdCkgewotCSAgZl9vdXRfIDw8ICIsICI7Ci0JfQotCWZpcnN0ID0gZmFsc2U7Ci0JcHJpbnRfY29uc3RfdmFsdWUoKmxpc3RfaXRlcik7Ci0gICAgICB9Ci0gICAgICBmX291dF8gPDwgIiB9IjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZl9vdXRfIDw8ICJVTktOT1dOIjsKLSAgICBicmVhazsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPlR5cGVkZWY6ICIgPDwgbmFtZQotCSA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHA+PHN0cm9uZz5CYXNlIHR5cGU6PC9zdHJvbmc+Jm5ic3A7IjsKLSAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9wPiIgPDwgZW5kbDsKLSAgcHJpbnRfZG9jKHR0eXBlZGVmKTsKLSAgZl9vdXRfIDw8ICI8L2Rpdj4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOwotICBmX291dF8gPDwgIjxoMyBpZD1cIkVudW1fIiA8PCBuYW1lIDw8ICJcIj5FbnVtZXJhdGlvbjogIiA8PCBuYW1lCi0JIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgcHJpbnRfZG9jKHRlbnVtKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7Ci0gIGZfb3V0XyA8PCAiPGJyLz48dGFibGU+IiA8PCBlbmRsOwotICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgewotICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGFibGU+PC9kaXY+IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjx0ciBpZD1cIkNvbnN0XyIgPDwgbmFtZSA8PCAiXCI+PHRkPjxjb2RlPiIgPDwgbmFtZQotCSA8PCAiPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPiI7Ci0gIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKLSAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+IjsKLSAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdmFsdWUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PC90cj4iOwotICBpZiAodGNvbnN0LT5oYXNfZG9jKCkpIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YmxvY2txdW90ZT4iOwotICAgIHByaW50X2RvYyh0Y29uc3QpOwotICAgIGZfb3V0XyA8PCAiPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4iOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iOwotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAiRXhjZXB0aW9uOiAiOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCAiU3RydWN0OiAiOwotICB9Ci0gIGZfb3V0XyA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlPiI7Ci0gIGZfb3V0XyA8PCAiPHRyPjx0aD5GaWVsZDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PHRoPlJlcXVpcmVkPC90aD48dGg+RGVmYXVsdCB2YWx1ZTwvdGg+PC90cj4iCi0JIDw8IGVuZGw7Ci0gIGZvciAoIDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgewotICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI8L3RkPjx0ZD4iOwotICAgIHByaW50X3R5cGUoKCptZW1faXRlciktPmdldF90eXBlKCkpOwotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICBmX291dF8gPDwgKCptZW1faXRlciktPmdldF9kb2MoKTsKLSAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgZl9vdXRfIDw8ICJ5ZXMiOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX291dF8gPDwgIm5vIjsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIHRfY29uc3RfdmFsdWUqIGRlZmF1bHRfdmFsID0gKCptZW1faXRlciktPmdldF92YWx1ZSgpOwotICAgIGlmIChkZWZhdWx0X3ZhbCAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShkZWZhdWx0X3ZhbCk7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGFibGU+PGJyLz4iOwotICBwcmludF9kb2ModHN0cnVjdCk7Ci0gIGZfb3V0XyA8PCAiPC9kaXY+IjsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzcGVjaWFsIHN0cnVjdHMKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBibG9jayBmb3IgYSBUaHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBmX291dF8gPDwgIjxoMyBpZD1cIlN2Y18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlwiPlNlcnZpY2U6ICIKLQkgPDwgc2VydmljZV9uYW1lXyA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7Ci0gICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZXh0ZW5kc1wiPjxlbT5leHRlbmRzPC9lbT4gIjsKLSAgICBwcmludF90eXBlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBmX291dF8gPDwgIjwvZGl2PlxuIjsKLSAgfQotICBwcmludF9kb2ModHNlcnZpY2UpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgZm9yICggOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7Ci0gICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOwotICAgIGZfb3V0XyA8PCAiPGg0IGlkPVwiRm5fIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCBmbl9uYW1lCi0JICAgPDwgIlwiPkZ1bmN0aW9uOiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi4iIDw8IGZuX25hbWUKLQkgICA8PCAiPC9oND4iIDw8IGVuZGw7Ci0gICAgZl9vdXRfIDw8ICI8cHJlPiI7Ci0gICAgaW50IG9mZnNldCA9IHByaW50X3R5cGUoKCpmbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZl9vdXRfIDw8ICIgIiA8PCBmbl9uYW1lIDw8ICIoIjsKLSAgICBvZmZzZXQgKz0gZm5fbmFtZS5zaXplKCkgKyAyOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gICAgaWYgKGFyZ19pdGVyICE9IGFyZ3MuZW5kKCkpIHsKLSAgICAgIGZvciAoIDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgewotCWlmICghZmlyc3QpIHsKLQkgIGZfb3V0XyA8PCAiLCIgPDwgZW5kbDsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0OyArK2kpIHsKLQkgICAgZl9vdXRfIDw8ICIgIjsKLQkgIH0KLQl9Ci0JZmlyc3QgPSBmYWxzZTsKLQlwcmludF90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLQlmX291dF8gPDwgIiAiIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotCWlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotCSAgZl9vdXRfIDw8ICIgPSAiOwotCSAgcHJpbnRfY29uc3RfdmFsdWUoKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKLQl9Ci0gICAgICB9Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiKSIgPDwgZW5kbDsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7Ci0gICAgaWYgKGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKSkgewotICAgICAgZl9vdXRfIDw8ICIgICAgdGhyb3dzICI7Ci0gICAgICBmb3IgKCA7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7Ci0JaWYgKCFmaXJzdCkgewotCSAgZl9vdXRfIDw8ICIsICI7Ci0JfQotCWZpcnN0ID0gZmFsc2U7Ci0JcHJpbnRfdHlwZSgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCBlbmRsOwotICAgIH0KLSAgICBmX291dF8gPDwgIjwvcHJlPiI7Ci0gICAgcHJpbnRfZG9jKCpmbl9pdGVyKTsKLSAgICBmX291dF8gPDwgIjwvZGl2PiI7Ci0gIH0KLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihodG1sLCAiSFRNTCIsICIiKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlYjU2Ni4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNjU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9qYXZhX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9qYXZhX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYmVhbnMiKTsKLSAgICBiZWFuX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJwcml2YXRlLW1lbWJlcnMiKTsKLSAgICBwcml2YXRlX21lbWJlcnNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5vY2FtZWwiKTsKLSAgICBub2NhbWVsX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJoYXNoY29kZSIpOwotICAgIGdlbl9oYXNoX2NvZGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgb3V0X2Rpcl9iYXNlXyA9IChiZWFuX3N0eWxlXyA/ICJnZW4tamF2YWJlYW4iIDogImdlbi1qYXZhIik7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uICAgKHRfc3RydWN0KiAgIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpbl9jbGFzcz1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgICB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLCBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwgdF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLCBzdGQ6OnN0cmluZyBkZXN0X25hbWUsIHRfdHlwZSogdHlwZSk7Ci0KLSAgYm9vbCBoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBqYXZhX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSwgYm9vbCBpbl9pbml0PWZhbHNlLCBib29sIHNraXBfZ2VuZXJpYz1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAKLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJpbmcoKSB8fAotICAgICAgdHR5cGUtPmlzX2VudW0oKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLSAgYm9vbCBiZWFuX3N0eWxlXzsKLSAgYm9vbCBwcml2YXRlX21lbWJlcnNfOwotICBib29sIG5vY2FtZWxfc3R5bGVfOwotICBib29sIGdlbl9oYXNoX2NvZGVfOwotCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLQotICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgIGRpciA9IGRpci5zdWJzdHIobG9jKzEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Ci19Ci0KLS8qKgotICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCi0gKgotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7Ci0gIH0KLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgSmF2YSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfdHlwZV9pbXBvcnRzKCkgewotICBzdHJpbmcgaGFzaF9idWlsZGVyOwotICBpZiAoZ2VuX2hhc2hfY29kZV8pIHsKLSAgICBoYXNoX2J1aWxkZXIgPSAiaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXIuSGFzaENvZGVCdWlsZGVyO1xuIjsKLSAgfQotCi0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICBoYXNoX2J1aWxkZXIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkxpc3Q7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLlNldDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5BcnJheXM7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5O1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV90aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Ci19Ci0KLS8qKgotICogTm90aGluZyBpbiBKYXZhCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEphdmEsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHt9Ci0KLS8qKgotICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0ZW51bS0+Z2V0X25hbWUoKSkrIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0Ci0gIGZfZW51bSA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwgZW5kbDsKLQotICAvLyBBZGQgamF2YSBpbXBvcnRzCi0gIGZfZW51bSA8PCBzdHJpbmcoKSArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArIAotICAgICJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgdGVudW0pOwotICBpbmRlbnQoZl9lbnVtKSA8PAotICAgICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgaW1wbGVtZW50cyBURW51bSAiOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGludCB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotCi0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2VudW0gPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpIjsKLSAgfQotICBmX2VudW0gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDxlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBHZXQgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBlbnVtIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gdmFsdWU7IiA8PGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIisgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHZhbHVlID0gLTE7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIGluZGVudChmX2VudW0pIDw8ICJjYXNlICIgPDwgdmFsdWUgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIAotICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsgIAotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBmX2VudW0uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGlmIChjb25zdHMuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfKyIvQ29uc3RhbnRzLmphdmEiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX2NvbnN0cyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBDb25zdGFudHMgeyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpbmRlbnQob3V0KTsKLSAgaWYgKCFkZWZ2YWwpIHsKLSAgICBvdXQgPDwKLSAgICAgIChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8Ci0gICAgICB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKLSAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICBvdXQgPDwgInNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgZmFsc2UpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIFRCYXNlIAotICogaW1wbGVtZW50b3IuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV91bmlvbih0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0KLS8qKgotICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKSA8PAotICAgIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uKTsKLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodHN0cnVjdC0+Z2V0X25hbWUoKSkrIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7Ci0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgamF2YV90aHJpZnRfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KGZfc3RydWN0KSA8PAotICAgICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgPDwgIiBleHRlbmRzIFRVbmlvbjwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuX0ZpZWxkcz4gIjsKLQotICBzY29wZV91cChmX3N0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0gIAotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihzZXRGaWVsZCwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIob3RoZXIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlICJjb25zdHJ1Y3RvcnMiIGZvciBlYWNoIGZpZWxkCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7IAotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBnZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGdldFNldEZpZWxkKCkgPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gKCIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiKWdldEZpZWxkVmFsdWUoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBfRmllbGRzIGVudW1Gb3JJZChzaG9ydCBpZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWRPclRocm93KGlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiIAotICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7Ci0gICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3QgcmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MudHlwZSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSBvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgd3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgIDw8ICIgPSAoIiA8PCAgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICAKLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCBcIiArIHNldEZpZWxkXyk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLQotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBUU3RydWN0IGdldFN0cnVjdERlc2MoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gU1RSVUNUX0RFU0M7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBlcXVhbGl0eQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpb3RoZXIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmICgodmFsdWVfIGluc3RhbmNlb2YgYnl0ZVtdKSA/ICIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICBBcnJheXMuZXF1YWxzKChieXRlW10pZ2V0RmllbGRWYWx1ZSgpLCAoYnl0ZVtdKW90aGVyLmdldEZpZWxkVmFsdWUoKSkgOiBnZXRGaWVsZFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldEZpZWxkVmFsdWUoKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgb3RoZXIuZ2V0U2V0RmllbGQoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICBPYmplY3QgbXlWYWx1ZSA9IGdldEZpZWxkVmFsdWUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgaWYgKG15VmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgICByZXR1cm4gVEJhc2VIZWxwZXIuY29tcGFyZVRvKChieXRlW10pbXlWYWx1ZSwgKGJ5dGVbXSlvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICAgIHJldHVybiBUQmFzZUhlbHBlci5jb21wYXJlVG8oKENvbXBhcmFibGUpbXlWYWx1ZSwgKENvbXBhcmFibGUpb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmIChnZW5faGFzaF9jb2RlXykgewotICAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIEhhc2hDb2RlQnVpbGRlciBoY2IgPSBuZXcgSGFzaENvZGVCdWlsZGVyKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGhjYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIFRGaWVsZElkRW51bSBzZXRGaWVsZCA9IGdldFNldEZpZWxkKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgaGNiLmFwcGVuZChzZXRGaWVsZC5nZXRUaHJpZnRGaWVsZElkKCkpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIE9iamVjdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBURW51bSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgICAgaGNiLmFwcGVuZCgoKFRFbnVtKWdldEZpZWxkVmFsdWUoKSkuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICAgIGhjYi5hcHBlbmQodmFsdWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gaGNiLnRvSGFzaENvZGUoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAqIElmIHlvdSdkIGxpa2UgdGhpcyB0byBwZXJmb3JtIG1vcmUgcmVzcGVjdGFibHksIHVzZSB0aGUgaGFzaGNvZGUgZ2VuZXJhdG9yIG9wdGlvbi4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gMDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCi0gKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKLSAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PAotICAgICAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiZXh0ZW5kcyBFeGNlcHRpb24gIjsKLSAgfQotICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2U8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIjsKLQotICBvdXQgPDwgIiAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKLQotICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1qYXZhLCBwcml2YXRlIGZvciAtamF2YWJlYW4KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoYmVhbl9zdHlsZV8gfHwgcHJpdmF0ZV9tZW1iZXJzXykgewotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIjsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICB9Ci0gICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UpIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIGlzc2V0IGRhdGEKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOwotCi0gICAgaW50IGkgPSAwOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIiA8PCBpc3NldF9maWVsZF9pZCgqbV9pdGVyKQotICAgICAgICAgIDw8ICIgPSAiIDw8IGkgPDwgIjsiIDw8ICBlbmRsOwotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBCaXRTZXQgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IEJpdFNldCgiIDw8IGkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IHRydWU7Ci0KLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgIH0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgYWxsX29wdGlvbmFsX21lbWJlcnMgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoIW1lbWJlcnMuZW1wdHkoKSAmJiAhYWxsX29wdGlvbmFsX21lbWJlcnMpIHsKLSAgICAvLyBGdWxsIGNvbnN0cnVjdG9yIGZvciBhbGwgZmllbGRzCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8Ci0gICAgICAgICAgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcygpOyIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PAotICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKCptX2l0ZXIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gY29weSBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGhhc19iaXRfdmVjdG9yKHRzdHJ1Y3QpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5jbGVhcigpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLm9yKG90aGVyLl9faXNzZXRfYml0X3ZlY3Rvcik7IiA8PCBlbmRsOyAgICAKLSAgfQotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodHlwZSk7Ci0KLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsICJvdGhlciIsIGZpZWxkX25hbWUsICJfX3RoaXNfXyIgKyBmaWVsZF9uYW1lLCB0eXBlKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gX190aGlzX18iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgIm90aGVyLiIgKyBmaWVsZF9uYW1lLCBmaWVsZF9uYW1lLCB0eXBlKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGNsb25lIG1ldGhvZCwgc28gdGhhdCB5b3UgY2FuIGRlZXAgY29weSBhbiBvYmplY3Qgd2hlbiB5b3UgZG9uJ3Qga25vdyBpdHMgY2xhc3MuCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgY2xvbmUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKLSAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOwotICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOwotICAgIHN0cmluZyB1bmVxdWFsOwotCi0gICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7Ci0gICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgICA8PCB0aGF0X3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgICAgICAgICAgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCEoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgICAgICAgICAgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0KS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHVuZXF1YWwgPSAiIWphdmEudXRpbC5BcnJheXMuZXF1YWxzKHRoaXMuIiArIG5hbWUgKyAiLCB0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmVxdWFsID0gInRoaXMuIiArIG5hbWUgKyAiICE9IHRoYXQuIiArIG5hbWU7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChnZW5faGFzaF9jb2RlXykgewotICAgIGluZGVudChvdXQpIDw8ICJIYXNoQ29kZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBIYXNoQ29kZUJ1aWxkZXIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLQotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0KTsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICBzdHJpbmcgcHJlc2VudCA9ICJ0cnVlIjsKLQotICAgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7Ci0gICAgICAgIHByZXNlbnQgKz0gIiAmJiAoIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpICsgIikiOwotICAgICAgfQotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbGVhbiBwcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIiA8PCBwcmVzZW50IDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImJ1aWxkZXIuYXBwZW5kKHByZXNlbnRfIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAocHJlc2VudF8iIDw8IG5hbWUgPDwgIikiIDw8IGVuZGw7Ci0gICAgICBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIGJ1aWxkZXIuYXBwZW5kKCIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIGJ1aWxkZXIuYXBwZW5kKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBidWlsZGVyLnRvSGFzaENvZGUoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHR5cGVkT3RoZXIgPSAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIilvdGhlcjsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpLmNvbXBhcmVUbyh0eXBlZE90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyI7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHR5cGVkT3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKLSAgICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgICBpZiAoIWJlYW5fc3R5bGVfKXsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSBjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gICAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIH0gZWxzZXsKLSAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCi0gKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KLSAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCi0gKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19zdHJpbmcoKSkgewotICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR5cGU7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIigiIDw8IChiYXNlX3R5cGUtPmlzX2Jvb2woKSA/ICJpcyIgOiAiZ2V0IikgPDwgY2FwX25hbWUgPDwgIigpKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGdldCIgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lLCBzdHJpbmcgY2FwX25hbWUpIHsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKLQotICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0KLSAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKLSAgCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoaW50IGZpZWxkSUQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2V0RmllbGRWYWx1ZShfRmllbGRzLmZpbmRCeVRocmlmdElkT3JUaHJvdyhmaWVsZElEKSwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGdldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0RmllbGRWYWx1ZShfRmllbGRzLmZpbmRCeVRocmlmdElkT3JUaHJvdyhmaWVsZElkKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKLSAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBpc1NldChpbnQgZmllbGRJRCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGlzU2V0KF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWRPclRocm93KGZpZWxkSUQpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIiA8PAotICAgICAgICAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgICB0X3R5cGUqIGVsZW1lbnRfdHlwZTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEl0ZXJhdG9yIGdldHRlciBmb3Igc2V0cyBhbmQgbGlzdHMKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPCIgPDwKLSAgICAgICAgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICAiPiBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIgPDwKLSAgICAgICAgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXRlcmF0b3IoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwKLSAgICAgICAgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZChlbGVtKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIC8vIFB1dCB0byBtYXAKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgcHV0IiA8PCBnZXRfY2FwX25hbWUoInRvIik7Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSkgPDwgIiBrZXksICIKLSAgICAgICAgPDwgdHlwZV9uYW1lKHZhbF90eXBlKSA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PAotICAgICAgICB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJgotICAgICAgICAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7Ci0gICAgICBvdXQgPDwgIiBpcyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGdldCI7Ci0gICAgfQotICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgaWYgKGJlYW5fc3R5bGVfKSB7Ci0gICAgICBvdXQgPDwgInZvaWQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICAgIH0KLSAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwKLSAgICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOwotICAgIGlmICghYmVhbl9zdHlsZV8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpczsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF9iaXRfdmVjdG9yLmdldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iuc2V0KCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsgCi0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIGZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHNiLmFwcGVuZChcIiwgXCIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCIpOyIgPDwgZW5kbDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2IuYXBwZW5kKFwibnVsbFwiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKikoZmllbGQtPmdldF90eXBlKCkpKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGludCBfXyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9zaXplID0gTWF0aC5taW4odGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubGVuZ3RoLCAxMjgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGZvciAoaW50IGkgPSAwOyBpIDwgX18iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfc2l6ZTsgaSsrKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBpZiAoaSAhPSAwKSBzYi5hcHBlbmQoXCIgXCIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJbaV0pLmxlbmd0aCgpID4gMSA/IEludGVnZXIudG9IZXhTdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJbaV0pLnN1YnN0cmluZyhJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiW2ldKS5sZW5ndGgoKSAtIDIpLnRvVXBwZXJDYXNlKCkgOiBcIjBcIiArIEludGVnZXIudG9IZXhTdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJbaV0pLnRvVXBwZXJDYXNlKCkpOyIgPDxlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5sZW5ndGggPiAxMjgpIHNiLmFwcGVuZChcIiAuLi5cIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAic2IuYXBwZW5kKFwiKVwiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdGF0aWMgbWFwIHdpdGggbWV0YSBkYXRhIHRvIHN0b3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgZmllbGRJRCB0bwotICogZmllbGROYW1lIG1hcHBpbmcKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBGaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIk1hcDxfRmllbGRzLCBGaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBGaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsiIDw8IGVuZGw7Ci0KLSAgLy8gUG9wdWxhdGUgbWFwCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidG1wTWFwLnB1dChfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiLCBuZXcgRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7Ci0KLSAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQotICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOwotICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCi0gICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgIG91dCAgPDwgIikpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLmNsYXNzLCBtZXRhRGF0YU1hcCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKiogCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5FTlVNIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCAgIDogcmV0dXJuICAgICAgIlRUeXBlLlZPSUQiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HIDogcmV0dXJuICAgICJUVHlwZS5TVFJJTkciOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCAgIDogcmV0dXJuICAgICAgIlRUeXBlLkJPT0wiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURSAgIDogcmV0dXJuICAgICAgIlRUeXBlLkJZVEUiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2ICAgIDogcmV0dXJuICAgICAgICJUVHlwZS5JMTYiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyICAgIDogcmV0dXJuICAgICAgICJUVHlwZS5JMzIiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0ICAgIDogcmV0dXJuICAgICAgICJUVHlwZS5JNjQiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFIDogcmV0dXJuICAgICJUVHlwZS5ET1VCTEUiOyBicmVhazsKLSAgICAgIGRlZmF1bHQgOiB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKSArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7IGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKXsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKXsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpewotICAgIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7ICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsgICAKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAKLSAgICB9IGVsc2V7IC8vIG1hcAotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7Ci0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IEVudW1NZXRhRGF0YShUVHlwZS5FTlVNLCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiKSI7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyIuamF2YSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJwdWJsaWMgY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8Ci0gICAgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwKLSAgICAgIGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLkNsaWVudCI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgaW1wbGVtZW50cyBUU2VydmljZUNsaWVudCwgSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBUU2VydmljZUNsaWVudEZhY3Rvcnk8Q2xpZW50PiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgRmFjdG9yeSgpIHt9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KFRQcm90b2NvbCBwcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChwcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50IGdldENsaWVudChUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBDbGllbnQoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIHByb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInRoaXMocHJvdCwgcHJvdCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIG9wcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBUUHJvdG9jb2wgZ2V0T3V0cHV0UHJvdG9jb2woKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIH0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5DQUxMLCArK3NlcWlkXykpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLnNlcWlkICE9IHNlcWlkXykgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5CQURfU0VRVUVOQ0VfSUQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZVwiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuUHJvY2Vzc29yIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCkpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIFByb2Nlc3NvcihJZmFjZSBpZmFjZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgUHJvY2Vzc0Z1bmN0aW9uIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGZpbmFsIEhhc2hNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgSGFzaE1hcDxTdHJpbmcsUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuID0gcHJvY2Vzc01hcF8uZ2V0KG1zZy5uYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZuLnByb2Nlc3MobXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBjbGFzcwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHJpdmF0ZSBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgUHJvY2Vzc0Z1bmN0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAKLSAgICBpbmRlbnQoKSA8PCAifSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uUFJPVE9DT0xfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoIChUaHJvd2FibGUgdGgpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIkxPR0dFUi5lcnJvcihcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCB0aCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBDbG9zZSBjbGFzcwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKLQotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpICsgIi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBvYmo7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG9iaiA9IHRtcCgiX21hcCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgiX3NldCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9saXN0Iik7Ci0gIH0KLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkKLSAgICA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCi0gICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKLSAgICA8PCAiKCIKLSAgICA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIiApCi0gICAgPDwgb2JqIDw8ICIuc2l6ZSIKLSAgICA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8Ci0gICAgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIiA8PCAiOyAiIDw8Ci0gICAgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgotICoKLSAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCi0gKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoTWFwLkVudHJ5PCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiPiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgOiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5lbnRyeVNldCgpKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgOiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgOiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIikiOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLmdldEtleSgpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLmdldFZhbHVlKCkiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/Ci0gKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQsIGJvb2wgc2tpcF9nZW5lcmljKSB7Ci0gIC8vIEluIEphdmEgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKikgdHR5cGU7Ci0gICAgaWYgKGluX2luaXQpIHsKLSAgICAgIHByZWZpeCA9ICJIYXNoTWFwIjsKLSAgICB9IGVsc2UgewotICAgICAgcHJlZml4ID0gIk1hcCI7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKwotICAgICAgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsIiArCi0gICAgICB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdHNldCA9ICh0X3NldCopIHR0eXBlOwotICAgIGlmIChpbl9pbml0KSB7Ci0gICAgICBwcmVmaXggPSAiSGFzaFNldCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJTZXQiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopIHR0eXBlOwotICAgIGlmIChpbl9pbml0KSB7Ci0gICAgICBwcmVmaXggPSAiQXJyYXlMaXN0IjsKLSAgICB9IGVsc2UgewotICAgICAgcHJlZml4ID0gIkxpc3QiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgSmF2YSBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lcikgewotICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKLQotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHJldHVybiAiYnl0ZVtdIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJTdHJpbmciOwotICAgIH0KLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkJvb2xlYW4iIDogImJvb2xlYW4iKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkJ5dGUiIDogImJ5dGUiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiU2hvcnQiIDogInNob3J0Iik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkludGVnZXIiIDogImludCIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJMb25nIiA6ICJsb25nIik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkRvdWJsZSIgOiAiZG91YmxlIik7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgewotICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG9mc3RyZWFtIGR1bW15OwotICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9Ci0gICAgdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIHRocm93cyAiOwotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKLSAgfQotICByZXN1bHQgKz0gIlRFeGNlcHRpb24iOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgaWYgKG5vY2FtZWxfc3R5bGVfKSB7Ci0gICAgcmV0dXJuICJfIiArIG5hbWU7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KLQotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIGNvbnN0YW50X25hbWU7Ci0KLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0gIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7Ci0gICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7Ci0KLSAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKLSAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOwotICAgIH0KLSAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKLSAgfQotCi0gIHJldHVybiBjb25zdGFudF9uYW1lOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAiLyoqXG4iLAotICAgICIgKiAiLCBjb250ZW50cywKLSAgICAiICovXG4iKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIvKipcbiIsCi0gICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLCB0X3R5cGUqIHR5cGUpIHsKLQotICB0X2NvbnRhaW5lciogY29udGFpbmVyID0gKHRfY29udGFpbmVyKil0eXBlOwotICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZTsKLSAgaWYgKHNvdXJjZV9uYW1lX3AyID09ICIiKQotICAgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKLSAgZWxzZQotICAgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOwotCi0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLQotICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7Ci0KLSAgaWYoY29udGFpbmVyLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoTWFwLkVudHJ5PCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiwgIiA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiPiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiIDogIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmVudHJ5U2V0KCkpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldEtleSgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldFZhbHVlKCk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgdF90eXBlKiBlbGVtX3R5cGU7Ci0KLSAgICBpZiAoY29udGFpbmVyLT5pc19zZXQoKSkgewotICAgICAgZWxlbV90eXBlID0gKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgOiAiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmIChlbGVtX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAvLyByZWN1cnNpdmUgZGVlcCBjb3B5Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5Ci0gICAgICBpZigoKHRfYmFzZV90eXBlKillbGVtX3R5cGUpLT5pc19iaW5hcnkoKSl7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJieXRlW10gdGVtcF9iaW5hcnlfZWxlbWVudCA9ICI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAidGVtcF9iaW5hcnlfZWxlbWVudCIsIGVsZW1fdHlwZSk7Ci0gICAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQodGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQoIjsKLSAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsIHJlc3VsdF9uYW1lLCBlbGVtX3R5cGUpOwotICAgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgLy8gYmluYXJ5IGZpZWxkcyBuZWVkIHRvIGJlIGNvcGllZCB3aXRoIFN5c3RlbS5hcnJheWNvcHkKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKXsKLSAgICAgIG91dCA8PCAibmV3IGJ5dGVbIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aF07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLCAwLCAiIDw8IGRlc3RfbmFtZSA8PCAiLCAwLCAiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoKSI7Ci0gICAgfQotICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOwotICB9IGVsc2UgewotICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKLSAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6aXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpIHsKLSAgcmV0dXJuICJfXyIgKyB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpICsgIl9pc3NldF9pZCIpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgcGFja2FnZSA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOwotICB9Ci0gIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBURmllbGQgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICJfRklFTERfREVTQyA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICIoc2hvcnQpIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBURmllbGRJZEVudW0geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigoc2hvcnQpIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiLCBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiOwotICB9Ci0KLSAgb3V0IDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaChmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIGlmIGl0IGlzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiRmllbGQgXCIgKyBmaWVsZElkICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZmllbGRzOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIF90aHJpZnRJZCA9IHRocmlmdElkOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF90aHJpZnRJZDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9maWVsZE5hbWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi1ib29sIHRfamF2YV9nZW5lcmF0b3I6Omhhc19iaXRfdmVjdG9yKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbChnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmEsICJKYXZhIiwKLSIgICAgYmVhbnM6ICAgICAgICAgICBNZW1iZXJzIHdpbGwgYmUgcHJpdmF0ZSwgYW5kIHNldHRlciBtZXRob2RzIHdpbGwgcmV0dXJuIHZvaWQuXG4iCi0iICAgIHByaXZhdGUtbWVtYmVyczogTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGJ1dCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiAndGhpcycgbGlrZSB1c3VhbC5cbiIKLSIgICAgbm9jYW1lbDogICAgICAgICBEbyBub3QgdXNlIENhbWVsQ2FzZSBmaWVsZCBhY2Nlc3NvcnMgd2l0aCBiZWFucy5cbiIKLSIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBxdWFsaXR5IGhhc2hDb2RlIG1ldGhvZHMuXG4iCi0pOwotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliZTEyNS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLS8qKgotICogSlMgY29kZSBnZW5lcmF0b3IuCi0gKi8KLWNsYXNzIHRfanNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2pzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIDoKLSAgICAgdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLQotICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qcyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLQotICAvKioKLSAgICogU3RydWN0cyEKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCAgICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcganNfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4KLSAgICAgIHN0ZDo6c3RyaW5nKCIvL1xuIikgKwotICAgICAgIi8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAgICIvL1xuIiArCi0gICAgICAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiLy9cbiI7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ganNfbmFtZXNwYWNlX3BpZWNlcyh0X3Byb2dyYW0qIHApIHsKLSAgICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKLQotICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSAgIGxvYzsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaWVjZXM7Ci0KLSAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOwotICAgICAgICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcGllY2VzOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcganNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOwotICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICBucyArPSAiLiI7Ci0gICAgICB9Ci0KLQotICAgICAgcmV0dXJuIG5zOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpcitwcm9ncmFtXy0+Z2V0X25hbWUoKSsiX3R5cGVzLmpzIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqc19pbmNsdWRlcygpOwotCi0KLSAgc3RyaW5nIHBuczsKLQotICAvL3NldHVwIHRoZSBuYW1lc3BhY2UKLSAgdmVjdG9yPHN0cmluZz4gbnNfcGllY2VzID0ganNfbmFtZXNwYWNlX3BpZWNlcyggcHJvZ3JhbV8gKTsKLSAgaWYoIG5zX3BpZWNlcy5zaXplKCkgPiAwKXsKLSAgICAgIGZfdHlwZXNfIDw8ICJ2YXIgIiA8PCBuc19waWVjZXNbMF0gPDwgIiA9IHt9Ijw8ZW5kbDsKLQotICAgICAgcG5zID0gbnNfcGllY2VzWzBdOwotCi0gICAgICBmb3Ioc2l6ZV90IGk9MTsgaTxuc19waWVjZXMuc2l6ZSgpOyBpKyspewotICAgICAgICAgIHBucyArPSAiLiIgKyBuc19waWVjZXNbaV07Ci0KLSAgICAgICAgICBmX3R5cGVzXyA8PCBwbnMgPDwgIiA9IHt9Ijw8ZW5kbDsKLSAgICAgIH0KLSAgfQotCi19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGpzIGltcG9ydHMKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpqc19pbmNsdWRlcygpIHsKLSAgc3RyaW5nIGluYzsKLQotICByZXR1cm4gaW5jOwotfQotCi0vKioKLSAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLQotICBmX3R5cGVzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSlMsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7fQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBKUywgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0KLSAgZl90eXBlc18gPDwganNfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKTw8dGVudW0tPmdldF9uYW1lKCk8PCIgPSB7ICI8PGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIGlmKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkKLSAgICAgICAgZl90eXBlc18gPDwgIiwiOwotCi0gICAgZl90eXBlc18gPDwgIiciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyA6ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgfQotCi0gIGZfdHlwZXNfIDw8ICJ9Ijw8ZW5kbDsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX3R5cGVzXyA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICA8PCBuYW1lIDw8ICIgPSAiOwotICBmX3R5cGVzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgIiciIDw8IHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIiciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCBqc19uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIGJvb2wgICAga2V5X2lzX3N0cmluZyA9IGZhbHNlOwotICAgIGlmIChrdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopa3R5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyl7Ci0gICAgICAgIGtleV9pc19zdHJpbmcgPSB0cnVlOwotICAgIH0KLQotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IjsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLQotICAgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLQotICAgICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIG91dCA8PCAiWyI7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICIsIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIE1ha2UgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogU3RydWN0cyBjYW4gYmUgbm9ybWFsIG9yIGV4Y2VwdGlvbnMuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIEpTCi0gKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCi0gKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwiID0gZnVuY3Rpb24oYXJncyl7XG4iOwotCi0KLSAgLy9tZW1iZXJzIHdpdGggYXJndW1lbnRzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9IGRlY2xhcmVfZmllbGQoKm1faXRlcix0cnVlLHRydWUpOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAgZHZhbCA8PCBlbmRsOwotICAgIH0KLQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8ICJpZiggYXJncyAhPSBudWxsICl7IjsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPSBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICA8PCBlbmRsIDsKLQotICAgIH0KLQotICAgIG91dCA8PCAifSI7Ci0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCAifVxuIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgICBvdXQgPDwgImZvciAodmFyIHByb3BlcnR5IGluIFRocmlmdC5FeGNlcHRpb24pIjw8ZW5kbDw8Ci0gICAgICAgICAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpPDwiW3Byb3BlcnR5XSA9IFRocmlmdC5FeGNlcHRpb25bcHJvcGVydHldIjw8ZW5kbDsKLSAgfQotCi0gIC8vaW5pdCBwcm90b3R5cGUKLSAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8dHN0cnVjdC0+Z2V0X25hbWUoKSA8PCIucHJvdG90eXBlID0ge31cbiI7Ci0KLQotICBnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCl7ICI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhciByZXQgPSBpbnB1dC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKLQotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKDEpICIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJ2YXIgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInZhciBmbmFtZSA9IHJldC5mbmFtZSIgPDxlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidmFyIGZ0eXBlID0gcmV0LmZ0eXBlIiA8PGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ2YXIgZmlkICAgPSByZXQuZmlkIiAgIDw8ZW5kbDsKLQotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaChmaWQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IjsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICAiICBpbnB1dC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJicmVhayIgPDwgZW5kbDsKLQotICB9Ci0gIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgaW5kZW50KG91dCkgPDwgICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgICIgIGlucHV0LnNraXAoZnR5cGUpIiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCl7ICI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpIiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPSB0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7Ci0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAib3V0cHV0LndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICBvdXQgPDxpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK3NlcnZpY2VfbmFtZV8rIi5qcyI7Ci0gICAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gICAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotCi0gICAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgewotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAiLy9IRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7Ci0gICAgICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7Ci0gICAgICAgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgICAgIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgfQotCi0gICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpIHsiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5pbnB1dCAgPSBpbnB1dCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5vdXRwdXQgPSBudWxsID09IG91dHB1dCA/IGlucHV0IDogb3V0cHV0IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLnNlcWlkICA9IDAiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgImZvciAodmFyIHByb3BlcnR5IGluICI8PGV4dGVuZHM8PCJDbGllbnQpIjw8ZW5kbDw8Ci0gICAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfPDwiQ2xpZW50W3Byb3BlcnR5XSA9ICI8PGV4dGVuZHM8PCJDbGllbnRbcHJvcGVydHldIjw8ZW5kbDsKLQotICB9Ci0KLSAgLy9pbml0IHByb3RvdHlwZQotICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlID0ge30iPDxlbmRsOwotCi0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfPDwiQ2xpZW50LnByb3RvdHlwZS4iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAieyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8Ci0gICAgICAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInRoaXMucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAgICJDbGllbnQucHJvdG90eXBlLnNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgInsiIDw8ZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAganNfbmFtZXNwYWNlKHByb2dyYW1fKSsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwsIHRoaXMuc2VxaWQpIiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSh0aGlzLm91dHB1dCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpIiA8PCBlbmRsOwotCi0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBlbmRsIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAgICAgIkNsaWVudC5wcm90b3R5cGUuIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICJ7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmV0ID0gdGhpcy5pbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIGZuYW1lID0gcmV0LmZuYW1lIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciBtdHlwZSA9IHJldC5tdHlwZSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcnNlcWlkPSByZXQucnNlcWlkIiA8PGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB2YXIgeCA9IG5ldyBUaHJpZnQuQXBwbGljYXRpb25FeGNlcHRpb24oKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZCh0aGlzLmlucHV0KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMuaW5wdXQucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHgiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKHRoaXMuaW5wdXQpIiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRoaXMuaW5wdXQucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT0gcmVzdWx0LnN1Y2Nlc3MgKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgIn0iPDxlbmRsOwotCi0gICAgfQotICB9Ci0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCt0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgcnRtcCA9IGlucHV0LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBvdXQgPDxuYW1lIDw8ICIgPSBydG1wLnZhbHVlIjw8ZW5kbDsKLQotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgIGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8dHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpbnB1dCkiIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBzaXplIDw8ICIgPSAwIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBydG1wMyIgPDwgZW5kbDsKLQotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IGt0eXBlIDw8ICIgPSAwIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IHZ0eXBlIDw8ICIgPSAwIiA8PCBlbmRsOwotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJ0bXAzID0gaW5wdXQucmVhZE1hcEJlZ2luKCkiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwga3R5cGUgPDwgIj0gcnRtcDMua3R5cGUiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdnR5cGUgPDwgIj0gcnRtcDMudnR5cGUiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgc2l6ZSAgPDwgIj0gcnRtcDMuc2l6ZSIgPDwgZW5kbDsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyICIgPDwgZXR5cGUgPDwgIiA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJ0bXAzID0gaW5wdXQucmVhZFNldEJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXR5cGUgPDwgIj0gcnRtcDMuZXR5cGUiPDxlbmRsPDwKLSAgICAgICAgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gcnRtcDMuc2l6ZSI8PGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyICIgPDwgZXR5cGUgPDwgIiA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJ0bXAzID0gaW5wdXQucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGV0eXBlIDw8ICIgPSBydG1wMy5ldHlwZSI8PGVuZGw8PAotICAgICAgICBpbmRlbnQoKSA8PCBzaXplIDw8ICIgPSBydG1wMy5zaXplIjw8ZW5kbDsKLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAodmFyICIgPDwKLSAgICBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFNldEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZExpc3RFbmQoKSIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGwiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGwiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggK3RmaWVsZC0+Z2V0X25hbWUoKSApOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgLy9IYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgICBpZighcHJlZml4LmVtcHR5KCkpCi0gICAgICBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3V0cHV0KSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm91dHB1dC53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgcHJlZml4IDw8ICIubGVuZ3RoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICBwcmVmaXggPDwgIi5sZW5ndGgpIiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm91dHB1dC53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgcHJlZml4IDw8ICIubGVuZ3RoKSIgPDwgZW5kbDsKLQotICB9Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yKHZhciAiPDxraXRlcjw8IiBpbiAiPDxwcmVmaXg8PCIpIjsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIjw8dml0ZXI8PCIgPSAiPDxwcmVmaXg8PCJbIjw8a2l0ZXI8PCJdIjw8ZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcih2YXIgIjw8aXRlcjw8IiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIj0iIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXSI8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZvcih2YXIgIjw8aXRlcjw8IiBpbiAiPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiPSIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdIjw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3V0cHV0LndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVMaXN0RW5kKCkiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAidGhpcy4iICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmKCFvYmopewotICAgICAgcmVzdWx0ID0gdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gJyciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpewotICAgICAgcmVzdWx0ICs9ICIgPSB7fSI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBbXSI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpZiAob2JqKSB7Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiAranNfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0KLSAgc3RyaW5nIHN0cjsKLQotICBzdHIgID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiA9IGZ1bmN0aW9uKCI7Ci0KLQotICAvL05lZWQgdG8gY3JlYXRlIGpzIGZ1bmN0aW9uIGFyZyBpbnB1dHMKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiAmZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgICAgaWYoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKQotICAgICAgICAgIHN0ciArPSAiLCI7Ci0KLSAgICAgIHN0ciArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLQotCi0gIHN0ciArPSAiKSI7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvciA6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanMsICJKYXZhc2NyaXB0IiwgIiIpOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDVhMDQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2NzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogT0NhbWwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X29jYW1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9vY2FtbF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1vY2FtbCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSAgKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQpOwotCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZT0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgb2NhbWxfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIG9jYW1sX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG1ldGhvZD1mYWxzZSwgYm9vbCBvcHRpb25zID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpOwotCi0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfaV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX2lfOwotCi19OwotCi0KLS8qCi0gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHdhbnQgdHlwZWRlZnMgdG8gYXBwZWFyIGxhdGVyLAotICogYWZ0ZXIgYWxsIHRoZSB0eXBlcyBoYXZlIGJlZW4gZGVjbGFyZWQuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgotICBpbml0X2dlbmVyYXRvcigpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHN0cnVjdHMKLSAgdmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igc3RfaXRlcjsKLSAgZm9yIChzdF9pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzdF9pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc3RfaXRlcikgewotICAgIGdlbmVyYXRlX3N0cnVjdCgqc3RfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB4Y2VwdGlvbnMKLSAgdmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV94Y2VwdGlvbigqeF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKLSAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLQotICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCi0gIGNsb3NlX2dlbmVyYXRvcigpOwotfQotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5tbCI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl90eXBlc19pX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5tbGkiOwotICBmX3R5cGVzX2lfLm9wZW4oZl90eXBlc19pX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl9jb25zdHMubWwiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl90eXBlc19pXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsIDw8Ci0gICAgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pPDwiX3R5cGVzIjw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6Om9jYW1sX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIigqXG4iKSArCi0gICAgIiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArCi0gICAgIlxuIiArCi0gICAgIiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgIiopXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6Om9jYW1sX2ltcG9ydHMoKSB7Ci0gIHJldHVybiAib3BlbiBUaHJpZnQiOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZSAiPDwgZGVjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIgPDwgcmVuZGVyX29jYW1sX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl90eXBlc19pXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlICI8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IGVuZGwgPDwgInN0cnVjdCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCBlbmRsIDw8ICJzaWciIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAidHlwZSB0ID0gIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8ICIgPDwgbmFtZSA8PCBlbmRsOwotICAgIGluZGVudChmX3R5cGVzX2lfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImxldCB0b19pID0gZnVuY3Rpb24iIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIHRvX2kgOiB0IC0+IGludCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgInwgIiA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibGV0IG9mX2kgPSBmdW5jdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ2YWwgb2ZfaSA6IGludCAtPiB0IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZl90eXBlc18gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ8ICIgPDwgdmFsdWUgPDwgIiAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8IF8gLT4gcmFpc2UgVGhyaWZ0X2Vycm9yIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAiZW5kIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGluZGVudChmX2NvbnN0c18pIDw8ICJsZXQgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0eXBlOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICAgIGludCB2YWwgPSAtMTsKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgICAgdmFsID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICsrdmFsOwotICAgICAgfQotICAgICAgaWYodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKXsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIi4iIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBzdHJpbmcgY25hbWUgPSB0eXBlX25hbWUodHlwZSk7Ci0gICAgc3RyaW5nIGN0ID0gdG1wKCJfYyIpOwotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgY3QgPDwgIiA9IG5ldyAiIDw8IGNuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyBmbmFtZSA9IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCBjdCA8PCIjc2V0XyIgPDwgZm5hbWUgPDwgIiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8IGN0IDw8ICIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBzdHJpbmcgaG0gPSB0bXAoIl9obSIpOwotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgaG0gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgdmFsLnNpemUoKSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGhtIDw8ICIgIiA8PCBrZXkgPDwgIiAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgaG0gPDwgIikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIl0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IHZhbCA8PCAiIHRydWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgInN0cnVjdCIKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCwgYnV0IGFsc28gaGFzIGFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiBPQ2FtbCBzdHJ1Y3QKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKGZfdHlwZXNfaV8sdHN0cnVjdCxpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgICAgaW5kZW50KG91dCkgPDwgInZhbCBtdXRhYmxlIF8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHJlbmRlcl9vY2FtbF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBvcHRpb24gPSBOb25lIiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBtYXRjaCBfIjw8bW5hbWU8PCIgd2l0aCBOb25lLT5yYWlzZSAoRmllbGRfZW1wdHkgXCIiPDx0bmFtZTw8Ii4iPDxtbmFtZTw8IlwiKSB8IFNvbWUgIiA8PCB4IDw8IiAtPiAiIDw8IHggPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gU29tZSAiIDw8IHggPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIGlmKGlzX2V4Y2VwdGlvbil7Ci0gICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8IiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0bmFtZSA8PCAiIDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvYmplY3QiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIHggPSB0bXAoIl94Iik7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX29jYW1sX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIG9wdGlvbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIC0+IHVuaXQiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudChvdXQpIDw8ICJtZXRob2Qgd3JpdGUgOiBQcm90b2NvbC50IC0+IHVuaXQiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgaWYoaXNfZXhjZXB0aW9uKXsKLSAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwiIG9mICIgPDwgdG5hbWUgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJ2YWwgcmVhZF8iIDw8IHRuYW1lIDw8ICIgOiBQcm90b2NvbC50IC0+ICIgPDwgdG5hbWUgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyB0ID0gdG1wKCJfdCIpOwotICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJsZXQgcmVjIHJlYWRfIiA8PCBzbmFtZSA8PCAiIChpcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgc3RyIDw8ICIgPSBuZXcgIiA8PCBzbmFtZSA8PCAiIGluIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWdub3JlKGlwcm90I3JlYWRTdHJ1Y3RCZWdpbik7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICIodHJ5IHdoaWxlIHRydWUgZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwKLSAgICAibGV0IChfLCIgPDwgdCA8PCIsIjw8aWQ8PCIpID0gaXByb3QjcmVhZEZpZWxkQmVnaW4gaW4iIDw8IGVuZGw7Ci0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PAotICAgICJpZiAiIDw8IHQgPDwiID0gUHJvdG9jb2wuVF9TVE9QIHRoZW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PAotICAgICAgInJhaXNlIEJyZWFrIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVsc2UgKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IGlkPDwiIHdpdGggIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgLT4gKCI7Ci0gICAgICBvdXQgPDwgImlmICIgPDwgdCA8PCIgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGhlbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsc3RyKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcCAiPDwgdCA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInwgXyAtPiAiIDw8ICJpcHJvdCNza2lwICI8PHQ8PCIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkRmllbGRFbmQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImRvbmU7ICgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIndpdGggQnJlYWsgLT4gKCkpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaXByb3QjcmVhZFN0cnVjdEVuZDsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCBzdHIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKLSAgc3RyaW5nIGYgPSB0bXAoIl9mIik7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAibWV0aG9kIHdyaXRlIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdCN3cml0ZVN0cnVjdEJlZ2luIFwiIjw8bmFtZTw8IlwiOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIHN0cmluZyBtbmFtZSA9ICJfIitkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCBOb25lIC0+ICgpIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiI8PCAoKmZfaXRlciktPmdldF9uYW1lKCk8PCJcIiwiCi0gICAgICAgICAgICAgICAgPDx0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTw8IiwiCi0gICAgICAgICAgICAgICAgPDwoKmZfaXRlciktPmdldF9rZXkoKTw8Iik7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiX3YiKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUZpZWxkRW5kIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVGaWVsZFN0b3A7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlU3RydWN0RW5kIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkrY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSsiLm1sIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl9zZXJ2aWNlX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkrY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSsiLm1saSI7Ci0gIGZfc2VydmljZV9pXy5vcGVuKGZfc2VydmljZV9pX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIC8qIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgIGZfc2VydmljZV9pXyA8PAotICAgICAgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICB9Ci0gICovCi0gIGZfc2VydmljZV8gPDwKLSAgICAgIm9wZW4gIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfc2VydmljZV9pXyA8PAotICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLQotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIGZfc2VydmljZV9pXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICIoKiBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTICopIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9vY2FtbF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xhc3MgdmlydHVhbCBpZmFjZSA9IiA8PCBlbmRsIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfaV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xhc3MgdmlydHVhbCBpZmFjZSA6IiA8PCBlbmRsIDw8ICJvYmplY3QiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBzdHJpbmcgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmlmYWNlIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmlmYWNlIiA8PCBlbmRsOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ0ID0gZnVuY3Rpb25fdHlwZSgqZl9pdGVyLHRydWUsdHJ1ZSk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgZnQgIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCBmdCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLiBOb3RlIHRoYXQgaW4gT0NhbWwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuIFRoaXMgaXMgYmVjYXVzZQotICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb25lLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImNsYXNzIGNsaWVudCAoaXByb3QgOiBQcm90b2NvbC50KSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICJjbGFzcyBjbGllbnQgOiBQcm90b2NvbC50IC0+IFByb3RvY29sLnQgLT4gIiA8PCBlbmRsIDw8ICJvYmplY3QiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IGlwcm90IG9wcm90IGFzIHN1cGVyIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmNsaWVudCIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhbCBtdXRhYmxlIHNlcWlkID0gMCIgPDwgZW5kbDsKLQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAibWV0aG9kICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwKLSAgICAgICJtZXRob2QgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsdHJ1ZSxmYWxzZSkgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJzZWxmI3NlbmRfIiA8PCBmdW5uYW1lOwotCi0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiICIgPDwgZGVjYXBpdGFsaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInNlbGYjcmVjdl8iIDw8IGZ1bm5hbWUgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgIm1ldGhvZCBwcml2YXRlIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIFByb3RvY29sLkNBTEwsIHNlcWlkKTsiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Mjc2V0XyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYXJncyN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QjZ2V0VHJhbnNwb3J0I2ZsdXNoIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm1ldGhvZCBwcml2YXRlICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiID0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJsZXQgKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IGlwcm90I3JlYWRNZXNzYWdlQmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIihpZiBtdHlwZSA9IFByb3RvY29sLkVYQ0VQVElPTiB0aGVuIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGxldCB4ID0gQXBwbGljYXRpb25fRXhuLnJlYWQgaXByb3QgaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgKGlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIHJhaXNlIChBcHBsaWNhdGlvbl9FeG4uRSB4KSkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZWxzZSAoKSk7IiA8PCBlbmRsOwotICAgICAgc3RyaW5nIHJlcyA9ICJfIjsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpIHx8IHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHJlcyA9ICJyZXN1bHQiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibGV0ICI8PHJlczw8IiA9IHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXByb3QgaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAibWF0Y2ggcmVzdWx0I2dldF9zdWNjZXNzIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+ICgiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotCi0KLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiKG1hdGNoIHJlc3VsdCNnZXRfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiB3aXRoIE5vbmUgLT4gKCkgfCBTb21lIF92IC0+IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmFpc2UgKCIgPDwgY2FwaXRhbGl6ZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIiBfdikpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgIigpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgKEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLk1JU1NJTkdfUkVTVUxUIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKSkiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiY2xhc3MgcHJvY2Vzc29yIChoYW5kbGVyIDogaWZhY2UpID0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8Ci0gICAgImNsYXNzIHByb2Nlc3NvciA6IGlmYWNlIC0+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvYmplY3QiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBmX3NlcnZpY2VfaV8gPDwKLSAgICAgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IgKGhhbmRsZXIgOj4gIiArIGV4dGVuZHMgKyAiLmlmYWNlKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiICsgZXh0ZW5kcyArICIucHJvY2Vzc29yIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIHByb2Nlc3NNYXAgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IGZ1bmN0aW9ucy5zaXplKCkgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAidmFsIHByb2Nlc3NNYXAgOiAoc3RyaW5nLCBpbnQgKiBQcm90b2NvbC50ICogUHJvdG9jb2wudCAtPiB1bml0KSBIYXNodGJsLnQiIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAibWV0aG9kIHByb2Nlc3MgaXByb3Qgb3Byb3QgPSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwKLSAgICAibWV0aG9kIHByb2Nlc3MgOiBQcm90b2NvbC50IC0+IFByb3RvY29sLnQgLT4gYm9vbCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJsZXQgKG5hbWUsIHR5cCwgc2VxaWQpICA9IGlwcm90I3JlYWRNZXNzYWdlQmVnaW4gaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UKLQotICAvLyBIT1Q6IGRpY3Rpb25hcnkgZnVuY3Rpb24gbG9va3VwCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgSGFzaHRibC5tZW0gcHJvY2Vzc01hcCBuYW1lIHRoZW4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAoSGFzaHRibC5maW5kIHByb2Nlc3NNYXAgbmFtZSkgKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImVsc2UgKCIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAoUHJvdG9jb2wuVF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGxldCB4ID0gQXBwbGljYXRpb25fRXhuLmNyZWF0ZSBBcHBsaWNhdGlvbl9FeG4uVU5LTk9XTl9NRVRIT0QgKFwiVW5rbm93biBmdW5jdGlvbiBcIl5uYW1lKSBpbiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgb3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgUHJvdG9jb2wuRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICB4I3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgb3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgb3Byb3QjZ2V0VHJhbnNwb3J0I2ZsdXNoIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFJlYWQgZW5kIG9mIGFyZ3MgZmllbGQsIHRoZSBUX1NUT1AsIGFuZCB0aGUgc3RydWN0IGNsb3NlCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidHJ1ZSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaXRpYWxpemVyIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiSGFzaHRibC5hZGQgcHJvY2Vzc01hcCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiBzZWxmI3Byb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAibWV0aG9kIHByaXZhdGUgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICIgKHNlcWlkLCBpcHJvdCwgb3Byb3QpID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGFyZ3MgPSAiYXJncyI7Ci0gIGlmKGZpZWxkcy5zaXplKCkgPT0gMCl7Ci0gICAgYXJncz0iXyI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImxldCAiPDxhcmdzPDwiID0gcmVhZF8iIDw8IGFyZ3NuYW1lIDw8ICIgaXByb3QgaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJsZXQgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKHRyeSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0KLQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQjc2V0X3N1Y2Nlc3MgIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIihoYW5kbGVyIyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgICIgYXJncyNnZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLQotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid2l0aCIgPDxlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ8ICIgPDwgY2FwaXRhbGl6ZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIC0+ICIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpZighdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSl7Ci0gICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0I3NldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigpIjsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgUHJvdG9jb2wuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0I3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCl7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLQotCi0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3NldF8iPDxuYW1lIDw8ICIgIjsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsdHlwZSk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSl7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7Ci0gIH0KLQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgb3V0IDw8ICJpcHJvdCMiOwotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3QiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgInJlYWRTdHJpbmciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICJyZWFkQm9vbCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBvdXQgPDwgInJlYWRCeXRlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8ICJyZWFkSTE2IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8ICJyZWFkSTMyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8ICJyZWFkSTY0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgb3V0IDw8ICJyZWFkRG91YmxlIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgb3V0IDw8ICIoIiA8PGVuYW1lIDw8ICIub2ZfaSBpcHJvdCNyZWFkSTMyKSI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotICBvdXQgPDwgIihyZWFkXyIgPDwgbmFtZSA8PCAiIGlwcm90KSI7Ci0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQotICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLSAgc3RyaW5nIGNvbiA9IHRtcCgiX2NvbiIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICgiPDxrdHlwZTw8IiwiPDx2dHlwZTw8IiwiPDxzaXplPDwiKSA9IGlwcm90I3JlYWRNYXBCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0ICI8PGNvbjw8IiA9IEhhc2h0YmwuY3JlYXRlICI8PHNpemU8PCIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiPDxzaXplPDwiIGRvIiA8PGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCBfayA9ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCBfdiA9ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICI8PGNvbjw8ICIgX2sgX3YiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkTWFwRW5kOyAiPDxjb248PCIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICgiPDxldHlwZTw8IiwiPDxzaXplPDwiKSA9IGlwcm90I3JlYWRTZXRCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0ICI8PGNvbjw8IiA9IEhhc2h0YmwuY3JlYXRlICI8PHNpemU8PCIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiPDxzaXplPDwiIGRvIiA8PGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICI8PGNvbjw8IiAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImRvbmU7IGlwcm90I3JlYWRTZXRFbmQ7ICI8PGNvbjw8IikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICgiPDxldHlwZTw8IiwiPDxzaXplPDwiKSA9IGlwcm90I3JlYWRMaXN0QmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCAiPDxjb248PCIgPSAoQXJyYXkudG9fbGlzdCAoQXJyYXkuaW5pdCAiPDxzaXplPDwiIChmdW4gXyAtPiAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIpKSkgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRMaXN0RW5kOyAiPDxjb248PCIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZihuYW1lLmxlbmd0aCgpID09IDApewotICAgIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90IyI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIG9jYW1sIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIjw8ZW5hbWU8PCIudG9faSAiIDw8IG5hbWUgPDwgIikiOwotICAgIH0KLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLSAgb3V0IDw8ICI7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIjd3JpdGUob3Byb3QpIjsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBCZWdpbigiPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsIjsKLSAgICBvdXQgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsIjsKLSAgICBvdXQgPDwgIkhhc2h0YmwubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIjsKLSAgICBvdXQgPDwgIkhhc2h0YmwubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdCN3cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIjsKLSAgICBvdXQgPDwgIkxpc3QubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoIl9raXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgiX3ZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuaXRlciAoZnVuICI8PGtpdGVyPDwiIC0+IGZ1biAiIDw8IHZpdGVyIDw8ICIgLT4gIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIjw8aXRlcjw8IiAtPiBmdW4gXyAtPiAiOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJMaXN0Lml0ZXIgKGZ1biAiPDxpdGVyPDwiIC0+ICI7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCAgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlTWFwRW5kIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlU2V0RW5kIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdCN3cml0ZUxpc3RFbmQiOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotCi0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAnbmFtZSBhcmdzJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICByZXR1cm4KLSAgICBwcmVmaXggKyBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArCi0gICAgIiAiICsgIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLX0KLQotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG1ldGhvZCwgYm9vbCBvcHRpb25zKXsKLSAgc3RyaW5nIHJlc3VsdD0iIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmKG9wdGlvbnMpCi0gICAgICByZXN1bHQgKz0gIiBvcHRpb24iOwotICAgIHJlc3VsdCArPSAiIC0+ICI7Ci0gIH0KLSAgaWYoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCl7Ci0gICAgcmVzdWx0ICs9ICJ1bml0IC0+ICI7Ci0gIH0KLSAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIGlmKHR0eXBlLT5pc19zZXJ2aWNlKCkpewotICAgIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpOwotICB9IGVsc2UgewotICAgIG5hbWUgPSBkZWNhcGl0YWxpemUobmFtZSk7Ci0gIH0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQcm90b2NvbC50X3R5cGUgZW51bQotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfVk9JRCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIG9jYW1sIHR5cGUKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gInVuaXQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJzdHJpbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJpbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJJbnQ2NC50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZmxvYXQiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSgoKHRfZW51bSopdHlwZSktPmdldF9uYW1lKCkpKyIudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICByZXR1cm4gIigiK3JlbmRlcl9vY2FtbF90eXBlKGt0eXBlKSsiLCIrcmVuZGVyX29jYW1sX3R5cGUodnR5cGUpKyIpIEhhc2h0YmwudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICByZXR1cm4gIigiK3JlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSsiLGJvb2wpIEhhc2h0YmwudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiByZW5kZXJfb2NhbWxfdHlwZShldHlwZSkrIiBsaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKG9jYW1sLCAiT0NhbWwiLCAiIik7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NTc4Ni4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfT09QX0dFTkVSQVRPUl9ICi0jZGVmaW5lIFRfT09QX0dFTkVSQVRPUl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotLyoqCi0gKiBDbGFzcyB3aXRoIHV0aWxpdHkgbWV0aG9kcyBzaGFyZWQgYWNyb3NzIGNvbW1vbiBvYmplY3Qgb3JpZW50ZWQgbGFuZ3VhZ2VzLgotICogU3BlY2lmaWNhbGx5LCBtb3N0IG9mIHRoaXMgc3R1ZmYgaXMgZm9yIEMrKy9KYXZhLgotICoKLSAqLwotY2xhc3MgdF9vb3BfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfb29wX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pIDoKLSAgICB0X2dlbmVyYXRvcihwcm9ncmFtKSB7fQotCi0gIC8qKgotICAgKiBTY29waW5nLCB1c2luZyBjdXJseSBicmFjZXMhCi0gICAqLwotCi0gIHZvaWQgc2NvcGVfdXAoc3RkOjpvc3RyZWFtJiBvdXQpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgc3RkOjplbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgdm9pZCBzY29wZV9kb3duKHN0ZDo6b3N0cmVhbSYgb3V0KSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgc3RkOjplbmRsOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdXBjYXNlX3N0cmluZyhzdGQ6OnN0cmluZyBvcmlnaW5hbCkgewotICAgIHN0ZDo6dHJhbnNmb3JtKG9yaWdpbmFsLmJlZ2luKCksIG9yaWdpbmFsLmVuZCgpLCBvcmlnaW5hbC5iZWdpbigpLCAoaW50KCopKGludCkpIHRvdXBwZXIpOwotICAgIHJldHVybiBvcmlnaW5hbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgYSBjb21tZW50IGFib3V0IHRoaXMgY29kZSBiZWluZyBhdXRvZ2VuZXJhdGVkLCB1c2luZyBDKysgc3R5bGUKLSAgICogY29tbWVudHMsIHdoaWNoIGFyZSBhbHNvIGZhaXIgZ2FtZSBpbiBKYXZhIC8gUEhQLCB5YXkhCi0gICAqCi0gICAqIEByZXR1cm4gQy1zdHlsZSBjb21tZW50IG1lbnRpb25pbmcgdGhhdCB0aGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZC4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgIHJldHVybgotICAgICAgc3RkOjpzdHJpbmcoIi8qKlxuIikgKwotICAgICAgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKLSAgICAgICIgKlxuIiArCi0gICAgICAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiICovXG4iOwotICB9Ci19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDhhZGUyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4MTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBQRVJMIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9wZXJsX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9wZXJsX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXBlcmwiOwotICAgIGVzY2FwZV9bJyQnXSA9ICJcXCQiOwotICAgIGVzY2FwZV9bJ0AnXSA9ICJcXEAiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0ICAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0cyEKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0ICAgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwZXJsX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIGJvb2wgb2JqPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gICAgcmV0dXJuCi0gICAgICBzdGQ6OnN0cmluZygiI1xuIikgKwotICAgICAgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKwotICAgICAgIiNcbiIgKwotICAgICAgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiI1xuIjsKLSAgfQotCi0gIHZvaWQgcGVybF9uYW1lc3BhY2VfZGlycyh0X3Byb2dyYW0qIHAsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGRpcnMpIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgZGlycy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOwotICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIGRpcnMucHVzaF9iYWNrKG5zKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBwZXJsX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiIjsKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOwotICAgICAgICByZXN1bHQgKz0gIjo6IjsKLSAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICAgICAgfQotCi0gICAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgICByZXN1bHQgKz0gbnMgKyAiOjoiOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlX291dF9kaXIoKSB7Ci0gICAgc3RkOjpzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IGRpcnM7Ci0gICAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IGRpcnMuYmVnaW4oKTsgaXQgIT0gZGlycy5lbmQoKTsgaXQrKykgewotICAgICAgb3V0ZGlyICs9ICppdCArICIvIjsKLSAgICB9Ci0gICAgcmV0dXJuIG91dGRpcjsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlbHBlcnNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKLSAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7Ci0gIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OwotICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBvdXRkaXIgKz0gKml0ICsgIi8iOwotICAgICAgTUtESVIob3V0ZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyKyJUeXBlcy5wbSI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG91dGRpcisiQ29uc3RhbnRzLnBtIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIHBlcmxfaW5jbHVkZXMoKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAicGFja2FnZSAiPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IkNvbnN0YW50czsiPDxlbmRsPDwKLSAgICBwZXJsX2luY2x1ZGVzKCkgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnBlcmxfaW5jbHVkZXMoKSB7Ci0gIHN0cmluZyBpbmM7Ci0KLSAgaW5jICA9ICJyZXF1aXJlIDUuNi4wO1xuIjsKLSAgaW5jICs9ICJ1c2Ugc3RyaWN0O1xuIjsKLSAgaW5jICs9ICJ1c2Ugd2FybmluZ3M7XG4iOwotICBpbmMgKz0gInVzZSBUaHJpZnQ7XG5cbiI7Ci0KLSAgcmV0dXJuIGluYzsKLX0KLQotLyoqCi0gKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18gPDwgIjE7IiA8PCBlbmRsOwotICBmX3R5cGVzXy5jbG9zZSgpOwotCi0gIGZfY29uc3RzXyA8PCAiMTsiIDw8IGVuZGw7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEVSTCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBTaW5jZSBkZWZpbmUgaXMgZXhwZW5zaXZlIHRvIGxvb2t1cAotICogaW4gUEVSTCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl90eXBlc18gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDx0ZW51bS0+Z2V0X25hbWUoKTw8IjsiPDxlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgaW50IHZhbHVlID0gLTE7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0KLSAgICBmX3R5cGVzXyA8PCAidXNlIGNvbnN0YW50ICI8PCgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX2NvbnN0c18gPDwgInVzZSBjb25zdGFudCAiIDw8IG5hbWUgPDwgIiA9PiAiOwotICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl9jb25zdHNfIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICIxIiA6ICIwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwgcGVybF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgb3V0IDw8ICIgPT4gMSI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3Blcmxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3Blcmxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogU3RydWN0cyBjYW4gYmUgbm9ybWFsIG9yIGV4Y2VwdGlvbnMuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBFUkwKLSAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKLSAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PAotICAgICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IjtcbiI7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgInVzZSBiYXNlIHF3KFRocmlmdDo6VEV4Y2VwdGlvbik7XG4iOwotICB9Ci0KLSAgLy9DcmVhdGUgc2ltcGxlIGFjZXNzb3IgbWV0aG9kcwotICBvdXQgPDwgInVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcik7XG4iOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgIG91dCA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ii0+bWtfYWNjZXNzb3JzKCBxdyggIjsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICAgICAgaWYgKCF0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAiOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgb3V0IDw8ICIpICk7XG4iOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gbmV3KCkKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgICJzdWIgbmV3IHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGNsYXNzbmFtZSA9IHNoaWZ0OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICR2YWxzICAgICAgPSBzaGlmdCB8fCB7fTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyBkdmFsID0gInVuZGVmIjsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoVU5JVkVSU0FMOjppc2EoJHZhbHMsJ0hBU0gnKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICR2YWxzLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICR2YWxzLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn07IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzICgkc2VsZiwgJGNsYXNzbmFtZSk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgIn1cblxuIjsKLQotICBvdXQgPDwKLSAgICAic3ViIGdldE5hbWUgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8ICJzdWIgcmVhZCB7IiA8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJGlucHV0KSA9IEBfOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkeGZlciAgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkZm5hbWU7IiAgICAgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkZnR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkZmlkICAgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXFwkZm5hbWUpOyIgPDwgZW5kbDsKLQotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKDEpICIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFxcJGZuYW1lLCBcXCRmdHlwZSwgXFwkZmlkKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJsYXN0OyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgaW5kZW50KG91dCkgPDwgIlNXSVRDSDogZm9yKCRmaWQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiL14iIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIkLyAmJiBkb3siOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImxhc3Q7IH07IiA8PCBlbmRsOwotCi0gIH0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotCi0gIGluZGVudChvdXQpIDw8ICAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAic3ViIHdyaXRlIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJteSAoJHNlbGYsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAibXkgJHhmZXIgICA9IDA7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHNlbGYtPnsiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCIgPDwKLSAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLQotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi0+Iik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBvdXQgPDxpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkrc2VydmljZV9uYW1lXysiLnBtIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAvLy8gICAgICAicGFja2FnZSAiPDxzZXJ2aWNlX25hbWVfPDwiOyI8PGVuZGw8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgcGVybF9pbmNsdWRlcygpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8ICJUeXBlczsiIDw8IGVuZGw7Ci0KLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInVzZSAiIDw8IHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgPDwgZXh0ZW5kc19zLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBFUkwpCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8gPDwgIjE7IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIlByb2Nlc3Nvcik7IjsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgInVzZSBzdHJpY3Q7IiA8PCBlbmRsIDw8Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaGFuZGxlcikgPSBAXzsiPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiICAgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e2hhbmRsZXJ9ID0gJGhhbmRsZXI7IiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyI8PGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3MgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGZuYW1lICA9IHVuZGVmOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkbXR5cGUgID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbihcXCRmbmFtZSwgXFwkbXR5cGUsIFxcJHJzZXFpZCk7IiA8PCBlbmRsOwotCi0gIC8vIEhPVDogY2hlY2sgZm9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICghJHNlbGYtPmNhbigkbWV0aG9kbmFtZSkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5za2lwKFRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICR4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbignRnVuY3Rpb24gJy4kZm5hbWUuJyBub3QgaW1wbGVtZW50ZWQuJywgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPiRtZXRob2RuYW1lKCRyc2VxaWQsICRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiAxOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN1YiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIgeyI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZXZhbCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT57c3VjY2Vzc30gPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiJHNlbGYtPntoYW5kbGVyfS0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn07IGlmKCBVTklWRVJTQUw6OmlzYSgkQCwnIiA8PAotICAgICAgICAgIHBlcmxfbmFtZXNwYWNlKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKSkgPDwKLSAgICAgICAgICAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiJykgKXsgIiA8PCBlbmRsOwotCi0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJEA7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHNfaWYgPSAidXNlIGJhc2UgcXcoIiArIHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCkgKyAiSWYpOyI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwKLSAgICBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ZW5kbDw8ICIgIGRpZSAnaW1wbGVtZW50IGludGVyZmFjZSc7XG59IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyAgICA9ICBleHRlbmRzX3MtPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKSArICJSZXN0KTsiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJSZXN0OyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgInVzZSBzdHJpY3Q7IiA8PCBlbmRsIDw8Ci0gICAgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbXBsKSA9IEBfOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICRzZWxmICAgICA9eyBpbXBsID0+ICRpbXBsIH07IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7IiA8PCBlbmRsOwotCi0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyAgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAic3ViICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAieyIgICAgPDxlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkcmVxdWVzdCkgPSBAXzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3QtPnsnIiArICgqYV9pdGVyKS0+Z2V0X25hbWUoKSArICInfSI7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgcmVxIDw8ICIgOiB1bmRlZjsiIDw8IGVuZGw7Ci0gICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmCi0gICAgICAgICAgKCh0X2Jhc2VfdHlwZSopYXR5cGUpLT5pc19zdHJpbmdfbGlzdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAibXkgQCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBzcGxpdCgvLC8sICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSAgICAgPDwgIiQiPDwoKmFfaXRlciktPmdldF9uYW1lKCkgPDwiID0gXFxAIjw8KCphX2l0ZXIpLT5nZXRfbmFtZSgpPDxlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICRzZWxmLT57aW1wbH0tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBhcmd1bWVudF9saXN0KCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8ZW5kbDsKLSAgfQotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIkNsaWVudCk7IjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgZXh0ZW5kc19jbGllbnQgPDwgZW5kbCA8PAotICAgICAgInVzZSBiYXNlIHF3KCIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7Ijw8ZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiICAgPDxlbmRsOwotCi0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0gID0gJGlucHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fSA9IGRlZmluZWQgJG91dHB1dCA/ICRvdXRwdXQgOiAkaW5wdXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntzZXFpZH0gID0gMDsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiPDxlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8Ci0gICAgICAiJHNlbGYtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIiQiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICIkc2VsZi0+cmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInN1YiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OkNBTEwsICRzZWxmLT57c2VxaWR9KTsiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzLT57IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICQiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCRzZWxmLT57b3V0cHV0fSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0KLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibXkgJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VCZWdpbihcXCRmbmFtZSwgXFwkbXR5cGUsIFxcJHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJG10eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIG15ICR4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAkeC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBkaWUgJHg7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbDsKLQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRyZXN1bHQtPntzdWNjZXNzfSApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJHJlc3VsdC0+e3N1Y2Nlc3N9OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIGRpZSAkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkaWUgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCAifSI8PGVuZGw7Ci0KLSAgICB9Ci0gIH0KLQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgLy9IYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgaWYgKCFwcmVmaXguZW1wdHkoKSkgewotICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkaW5wdXQtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZyhcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMihcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKLSAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQotICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKLSAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwgc2l6ZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IHZ0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCIgPDwKLSAgICAgICJcXCQiIDw8IGt0eXBlIDw8ICIsIFxcJCIgPDwgdnR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiIDw8Ci0gICAgICAiXFwkIiA8PCBldHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0QmVnaW4oIiA8PAotICAgICAgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLQotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yIChteSAkIiA8PAotICAgIGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGtleSA8PCAifSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGVsZW0gPDwgIn0gPSAxOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwdXNoKEB7JCIgPDwgcHJlZml4IDw8ICJ9LCQiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgInsiK3RmaWVsZC0+Z2V0X25hbWUoKSsifSIgKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSsifSIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICAvL0hhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQotICAgIGlmKCFwcmVmaXguZW1wdHkoKSkKLSAgICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cKLSAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiRvdXRwdXQtPndyaXRlTWFwQmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic2NhbGFyKGtleXMgJXskIiA8PCBwcmVmaXggPDwgIn0pKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJG91dHB1dC0+d3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLQotICB9Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIndoaWxlKCBteSAoJCI8PGtpdGVyPDwiLCQiPDx2aXRlcjw8IikgPSBlYWNoICV7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggbXkgJCI8PGl0ZXI8PCIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoIG15ICQiPDxpdGVyPDwiIChAeyQiIDw8IHByZWZpeCA8PCAifSkgIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICJteSAkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gJyciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IFtdIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmIChvYmopIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gIiA9IHVuZGVmIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0KLSAgc3RyaW5nIHN0cjsKLQotICBzdHIgID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIntcbiI7Ci0gIHN0ciArPSAiICBteSAkc2VsZiA9IHNoaWZ0O1xuIjsKLQotICAvL05lZWQgdG8gY3JlYXRlIHBlcmwgZnVuY3Rpb24gYXJnIGlucHV0cwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+ICZmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0ciArPSAiICBteSAkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSBzaGlmdDtcbiI7Ci0gIH0KLQotICByZXR1cm4gc3RyOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAiJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yIDo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocGVybCwgIlBlcmwiLCAiIik7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTMyZWIwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBQSFAgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3BocF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcGhwX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiaW5saW5lZCIpOwotICAgIGJpbmFyeV9pbmxpbmVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInJlc3QiKTsKLSAgICByZXN0XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJzZXJ2ZXIiKTsKLSAgICBwaHBzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJhdXRvbG9hZCIpOwotICAgIGF1dG9sb2FkXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJvb3AiKTsKLSAgICBvb3BfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaWYgKG9vcF8gJiYgYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIHRocm93ICJvb3AgYW5kIGlubGluZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iOwotICAgIH0KLQotICAgIG91dF9kaXJfYmFzZV8gPSAoYmluYXJ5X2lubGluZV8gPyAiZ2VuLXBocGkiIDogImdlbi1waHAiKTsKLSAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdHMhCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlKTsKLSAgdm9pZCBfZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF90eXBlKiB0KTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMoc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCAgICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgX2dlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGhwX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIGJvb2wgb2JqPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fY2FzdCh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIHBocF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwaHAiKTsKLSAgICByZXR1cm4gbnMuc2l6ZSgpID8gKG5zICsgIl8iKSA6ICIiOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfaGVscGVyc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0gIC8qKgotICAgKiBHZW5lcmF0ZSBwcm90b2NvbC1pbmRlcGVuZGVudCB0ZW1wbGF0ZT8gT3IgQmluYXJ5IGlubGluZSBjb2RlPwotICAgKi8KLSAgYm9vbCBiaW5hcnlfaW5saW5lXzsKLQotICAvKioKLSAgICogR2VuZXJhdGUgYSBSRVNUIGhhbmRsZXIgY2xhc3MKLSAgICovCi0gIGJvb2wgcmVzdF87Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlIHN0dWJzIGZvciBhIFBIUCBzZXJ2ZXIKLSAgICovCi0gIGJvb2wgcGhwc187Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlIFBIUCBjb2RlIHRoYXQgdXNlcyBhdXRvbG9hZAotICAgKi8KLSAgYm9vbCBhdXRvbG9hZF87Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gdXNlIE9PUCBiYXNlIGNsYXNzIFRCYXNlCi0gICAqLwotICBib29sIG9vcF87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgcGFja2FnZV9kaXJfID0gZ2V0X291dF9kaXIoKSsiLyIrcHJvZ3JhbV9uYW1lXysiLyI7Ci0gIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5waHAiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICAiPD9waHAiIDw8IGVuZGwgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIHBocF9pbmNsdWRlcygpOwotCi0gIC8vIEluY2x1ZGUgb3RoZXIgVGhyaWZ0IGluY2x1ZGVzCi0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpOwotICAgIGZfdHlwZXNfIDw8Ci0gICAgICAiaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcGFja2FnZXMvIiA8PCBwYWNrYWdlIDw8ICIvIiA8PCBwYWNrYWdlIDw8ICJfdHlwZXMucGhwJzsiIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXytwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLnBocCI7Ci0gICAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLSAgICBmX2NvbnN0c18gPDwKLSAgICAgICI8P3BocCIgPDwgZW5kbCA8PAotICAgICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAgICJpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy8iICsgcHJvZ3JhbV9uYW1lXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLnBocCc7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICAiJEdMT0JBTFNbJyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UUyddID0gYXJyYXkoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgcGhwIGluY2x1ZGVzCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OnBocF9pbmNsdWRlcygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCJpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJztcblxuIik7Ci19Ci0KLS8qKgotICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18gPDwgIj8+IiA8PCBlbmRsOwotICBmX3R5cGVzXy5jbG9zZSgpOwotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7Ci0gICAgZl9jb25zdHNfIDw8ICI/PiIgPDwgZW5kbDsKLSAgICBmX2NvbnN0c18uY2xvc2UoKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEhQLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHt9Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIFBIUCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX3R5cGVzXyA8PAotICAgICIkR0xPQkFMU1snIiA8PCBwaHBfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKSA8PCAiRV8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICInXSA9IGFycmF5KCIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGludCB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotCi0gICAgZl90eXBlc18gPDwKLSAgICAgICIgICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyA9PiAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOwotICB9Ci0KLSAgZl90eXBlc18gPDwKLSAgICAiKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIC8vIFdlJ3JlIGFsc28gZG9pbmcgaXQgdGhpcyB3YXkgdG8gc2VlIGhvdyBpdCBwZXJmb3Jtcy4gSXQncyBtb3JlIGxlZ2libGUKLSAgLy8gY29kZSBidXQgeW91IGNhbid0IGRvIHRoaW5ncyBsaWtlIGFuICdleHRyYWN0JyBvbiBpdCwgd2hpY2ggaXMgYSBiaXQgb2YKLSAgLy8gYSBkb3duZXIuCi0gIGZfdHlwZXNfIDw8Ci0gICAgImZpbmFsIGNsYXNzICIgPDwgcGhwX25hbWVzcGFjZSh0ZW51bS0+Z2V0X3Byb2dyYW0oKSkgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotCi0gICAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICAgImNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICJzdGF0aWMgcHVibGljICRfX25hbWVzID0gYXJyYXkoIiA8PCBlbmRsOwotICB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotCi0gICAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICAgIiAgIiA8PCB2YWx1ZSA8PCAiID0+ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICIkR0xPQkFMU1snIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTJ11bJyIgPDwgbmFtZSA8PCAiJ10gPSAiOwotICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl9jb25zdHNfIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0+ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9PiB0cnVlIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHQpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0gIGluZGVudChvdXQpIDw8ICIndHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0odCkgPDwgIiwiIDw8IGVuZGw7Ci0KLSAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSkgewotICAgIC8vIE5vb3AsIHR5cGUgaXMgYWxsIHdlIG5lZWQKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIidjbGFzcycgPT4gJyIgPDwgcGhwX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpIDw8IicsIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIGluZGVudChvdXQpIDw8ICIna3R5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ3Z0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidrZXknID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwga3R5cGUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIndmFsJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHZ0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkgfHwgdC0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIidldHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oZXR5cGUpIDw8IiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidlbGVtJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIGV0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIHR5cGUgZm9yIHBocCBzdHJ1Y3Qgc3BlYyBmaWVsZCI7Ci0gIH0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgc3RydWN0IHNwZWNpZmljYXRpb24gc3RydWN0dXJlLCB3aGljaCBmdWxseSBxdWFsaWZpZXMgZW5vdWdoCi0gKiB0eXBlIGluZm9ybWF0aW9uIHRvIGdlbmVyYWxpemUgc2VyaWFsaXphdGlvbiByb3V0aW5lcy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiaWYgKCFpc3NldChzZWxmOjokX1RTUEVDKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInNlbGY6OiRfVFNQRUMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJ3ZhcicgPT4gJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgdCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiICApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgaWYgKGF1dG9sb2FkXykgewotICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgICBvZnN0cmVhbSBhdXRvbG9hZF9vdXQ7Ci0gICAgc3RyaW5nIGZfc3RydWN0ID0gcHJvZ3JhbV9uYW1lXysiLiIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIucGhwIjsKLSAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXytmX3N0cnVjdDsKLSAgICBhdXRvbG9hZF9vdXQub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotICAgIGF1dG9sb2FkX291dCA8PCAiPD9waHAiIDw8IGVuZGw7Ci0gICAgX2dlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihhdXRvbG9hZF9vdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gICAgYXV0b2xvYWRfb3V0IDw8IGVuZGwgPDwgIj8+IiA8PCBlbmRsOwotICAgIGF1dG9sb2FkX291dC5jbG9zZSgpOwotCi0gICAgZl90eXBlc18gPDwKLSAgICAgICIkR0xPQkFMU1snVEhSSUZUX0FVVE9MT0FEJ11bJyIgPDwgbG93ZXJjYXNlKHBocF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgKyB0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiJ10gPSAnIiA8PCBwcm9ncmFtX25hbWVfIDw8ICIvIiA8PCBmX3N0cnVjdCA8PCAiJzsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBfZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQSFAKLSAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKLSAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6X2dlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwKLSAgICAiY2xhc3MgIiA8PCBwaHBfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIiBleHRlbmRzIFRFeGNlcHRpb24iOwotICB9IGVsc2UgaWYgKG9vcF8pIHsKLSAgICBvdXQgPDwgIiBleHRlbmRzIFRCYXNlIjsKLSAgfQotICBvdXQgPDwKLSAgICAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgJF9UU1BFQzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIGR2YWwgPSAibnVsbCI7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyAkIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgc3RyaW5nIHBhcmFtID0gKG1lbWJlcnMuc2l6ZSgpID4gMCkgPyAiJHZhbHM9bnVsbCIgOiAiIjsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgiIDw8IHBhcmFtIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGlzX2FycmF5KCR2YWxzKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAob29wXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KHNlbGY6OiRfVFNQRUMsICR2YWxzKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChpc3NldCgkdmFsc1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiddKSkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJHZhbHNbJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGlmIChvb3BfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkeGZlciA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRmaWQgPSAwOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgdF9maWVsZCBmZnR5cGUoZ190eXBlX2J5dGUsICJmdHlwZSIpOwotICAgICAgdF9maWVsZCBmZmlkKGdfdHlwZV9pMTYsICJmaWQiKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZmdHlwZSk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsiIDw8IGVuZGw7Ci0gICAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3dpdGNoICgkZmlkKSIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIGluZGVudChvdXQpIDw8ICAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9IFRQcm90b2NvbDo6c2tpcEJpbmFyeSgkaW5wdXQsICRmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICAiICBicmVhazsiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJiRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAob29wXykgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRoaXMtPl93cml0ZSgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiR4ZmVyID0gMDsiIDw8IGVuZGw7Ci0KLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBzdHJpbmcgZXhwZWN0OwotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZXhwZWN0ID0gImFycmF5IjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBleHBlY3QgPSAib2JqZWN0IjsKLSAgICB9Ci0gICAgaWYgKCFleHBlY3QuZW1wdHkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoIWlzXyIgPDwgZXhwZWN0IDw8ICIoJHRoaXMtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB0eXBlIGluIHN0cnVjdHVyZS4nLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgIH0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgICAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCBUVHlwZTo6U1RPUCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rc2VydmljZV9uYW1lXysiLnBocCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIjw/cGhwIiA8PCBlbmRsIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBwaHBfaW5jbHVkZXMoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzLyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiLyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLnBocCc7IiA8PCBlbmRsOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzLyIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgPDwgIi8iIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIucGhwJzsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGlmIChyZXN0XykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7Ci0gIH0KLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBpZiAocGhwc18pIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0gIH0KLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXyA8PCAiPz4iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGhhbmRsZXJfID0gbnVsbDsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaGFuZGxlcikgeyIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT5oYW5kbGVyXyA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRoYW5kbGVyKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcygkaW5wdXQsICRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKLSAgICB0X2ZpZWxkIGZtdHlwZShnX3R5cGVfYnl0ZSwgIm10eXBlIik7Ci0gICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmZm5hbWUsICIiLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZm10eXBlLCAiIiwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZzZXFpZCwgIiIsIHRydWUpOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEhPVDogY2hlY2sgZm9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOwotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJGlucHV0LT5za2lwKFRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCBUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHgtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR0aGlzLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiKCRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkYXJncy0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiR0aGlzLT5oYW5kbGVyXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKCIgPDwgcGhwX25hbWVzcGFjZSgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCkpIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICQiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCRvdXRwdXQgaW5zdGFuY2VvZiBUUHJvdG9jb2w6OiRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJG91dHB1dCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OlJFUExZLCAkcmVzdWx0LCAkc2VxaWQsICRvdXRwdXQtPmlzU3RyaWN0V3JpdGUoKSk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCBUTWVzc2FnZVR5cGU6OlJFUExZKSk7ICIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19pZiA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiSWYiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYiIDw8IGV4dGVuZHNfaWYgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpICsgIlJlc3QiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJSZXN0IiA8PCBleHRlbmRzX2lmIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGltcGxfOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbXBsKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPmltcGxfID0gJGltcGw7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCRyZXF1ZXN0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBzdHJpbmcgY2FzdCA9IHR5cGVfdG9fY2FzdChhdHlwZSk7Ci0gICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0WyciICsgKCphX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiddIjsKLSAgICAgIGlmIChhdHlwZS0+aXNfYm9vbCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGNhc3QgPDwgIighZW1wdHkoIiA8PCByZXEgPDwgIikgJiYgKCIgPDwgcmVxIDw8ICIgIT09ICdmYWxzZScpKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gaXNzZXQoIiA8PCByZXEgPDwgIikgPyAiIDw8IGNhc3QgPDwgcmVxIDw8ICIgOiBudWxsOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChhdHlwZS0+aXNfc3RyaW5nKCkgJiYKLSAgICAgICAgICAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGV4cGxvZGUoJywnLCAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChhdHlwZS0+aXNfbWFwKCkgfHwgYXR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0ganNvbl9kZWNvZGUoJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcnJheV9maWxsX2tleXMoanNvbl9kZWNvZGUoJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpLCAxKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zdHJ1Y3QoKSB8fCBhdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbmV3ICIgPDwgcGhwX25hbWVzcGFjZShhdHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgYXR5cGUtPmdldF9uYW1lKCkgPDwgIihqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICR0aGlzLT5pbXBsXy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGFyZ3VtZW50X2xpc3QoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBpZiAoYXV0b2xvYWRfKSB7Ci0gICAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICAgIG9mc3RyZWFtIGF1dG9sb2FkX291dDsKLSAgICBzdHJpbmcgZl9zdHJ1Y3QgPSBwcm9ncmFtX25hbWVfKyIuIisodHNlcnZpY2UtPmdldF9uYW1lKCkpKyIuY2xpZW50LnBocCI7Ci0gICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rZl9zdHJ1Y3Q7Ci0gICAgYXV0b2xvYWRfb3V0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLSAgICBhdXRvbG9hZF9vdXQgPDwgIjw/cGhwIiA8PCBlbmRsOwotICAgIF9nZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChhdXRvbG9hZF9vdXQsIHRzZXJ2aWNlKTsKLSAgICBhdXRvbG9hZF9vdXQgPDwgZW5kbCA8PCAiPz4iIDw8IGVuZGw7Ci0gICAgYXV0b2xvYWRfb3V0LmNsb3NlKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiJEdMT0JBTFNbJ1RIUklGVF9BVVRPTE9BRCddWyciIDw8IGxvd2VyY2FzZShzZXJ2aWNlX25hbWVfICsgIkNsaWVudCIpIDw8ICInXSA9ICciIDw8IHByb2dyYW1fbmFtZV8gPDwgIi8iIDw8IGZfc3RydWN0IDw8ICInOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIF9nZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpfZ2VuZXJhdGVfc2VydmljZV9jbGllbnQob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiQ2xpZW50IjsKLSAgfQotCi0gIG91dCA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiBpbXBsZW1lbnRzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUHJpdmF0ZSBtZW1iZXJzCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGlucHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRvdXRwdXRfID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRzZXFpZF8gPSAwOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0PW51bGwpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPmlucHV0XyA9ICRpbnB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT5vdXRwdXRfID0gJG91dHB1dCA/ICRvdXRwdXQgOiAkaW5wdXQ7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHRoaXMtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICAiJHRoaXMtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+b3V0cHV0XyBpbnN0YW5jZW9mIFRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVEKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCR0aGlzLT5vdXRwdXRfLCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6Q0FMTCwgJGFyZ3MsICR0aGlzLT5zZXFpZF8sICR0aGlzLT5vdXRwdXRfLT5pc1N0cmljdFdyaXRlKCkpOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiA9IHBhY2soJ04nLCAoMHg4MDAxMDAwMCB8IFRNZXNzYWdlVHlwZTo6Q0FMTCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgc3RybGVuKCciIDw8IGZ1bm5hbWUgPDwgIicpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIgPDwgZnVubmFtZSA8PCAiJzsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsICR0aGlzLT5zZXFpZF8pOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGU6OkNBTEwsICR0aGlzLT5zZXFpZF8pOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCR0aGlzLT5vdXRwdXRfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJHRoaXMtPmlucHV0XyBpbnN0YW5jZW9mIFRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVEKSIKLSAgICAgICAgICAgICAgICAgPDwgIiAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeScpOyIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgJHJlc3VsdCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkdGhpcy0+aW5wdXRfLCAnIiA8PCByZXN1bHRuYW1lIDw8ICInLCAkdGhpcy0+aW5wdXRfLT5pc1N0cmljdFJlYWQoKSk7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7Ci0gICAgICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR2ZXIgPSB1bnBhY2soJ04nLCAkdGhpcy0+aW5wdXRfLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZlciA9ICR2ZXJbMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRtdHlwZSA9ICR2ZXIgJiAweGZmOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdmVyID0gJHZlciAmIDB4ZmZmZjAwMDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmVyICE9IDB4ODAwMTAwMDApIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGlkZW50aWZpZXI6ICcuJHZlciwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7IiA8PCBlbmRsOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZm5hbWUsICIiLCB0cnVlKTsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNlcWlkLCAiIiwgdHJ1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkeC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93ICR4OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsOwotCi0gICAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPnN1Y2Nlc3MgIT09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJHJlc3VsdC0+c3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgRXhjZXB0aW9uKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIHsKLQotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGl0cmFucyA9IChpbmNsYXNzID8gIiR0aGlzLT5pbnB1dF8iIDogIiRpbnB1dCIpOwotCi0gICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgICAgICBuYW1lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRsZW4gPSB1bnBhY2soJ04nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRsZW4gPSAkbGVuWzFdOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoJGxlbik7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IChib29sKSQiIDw8IG5hbWUgPDwgIlsxXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IHVucGFjaygnYycsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMSkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCduJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgyKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZmZmZmYpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnTjInLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkYXJyWzFdID0gJGFyclsxXSBeIDB4RkZGRkZGRkY7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhGRkZGRkZGRjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gMCAtICRhcnJbMV0qNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXSo0Mjk0OTY3Mjk2ICsgJGFyclsyXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnZCcsIHN0cnJldigiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkYXJyWzFdOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmZmZmZikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmZmZmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLQotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICIkeGZlciArPSAkaW5wdXQtPiI7Ci0KLSAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgICAgIG5hbWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IGFycmF5KCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiQiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOwotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmt0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2dHlwZSk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIiA8PAotICAgICAgICAiJCIgPDwga3R5cGUgPDwgIiwgJCIgPDwgdnR5cGUgPDwgIiwgJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmV0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIgPDwKLSAgICAgICAgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCIgPDwKLSAgICAgICAgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAoJCIgPDwKLSAgICBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBrZXkgPDwgIl0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBlbGVtIDw8ICJdID0gdHJ1ZTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIiBbXT0gJCIgPDwgZWxlbSA8PCAiOyIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cKLSAgICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgc3RybGVuKCQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gJCIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICQiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTicsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04yJywgJCIgPDwgbmFtZSA8PCAiID4+IDMyLCAkIiA8PCBuYW1lIDw8ICIgJiAweEZGRkZGRkZGKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2QnLCAkIiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPiI7Ci0KLSAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgfQotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7Ci0KLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAiIDw8Ci0gICAgICAiJCIgPDwga2l0ZXIgPDwgIiA9PiAkIiA8PCB2aXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAkIiA8PCBpdGVyIDw8ICIgPT4gJHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gJyciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IGFycmF5KCkiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaWYgKG9iaikgewotICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICByZXR1cm4KLSAgICBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAiJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBHZXRzIGEgdHlwZWNhc3Qgc3RyaW5nIGZvciBhIHBhcnRpY3VsYXIgdHlwZS4KLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19jYXN0KHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZSogYnR5cGUgPSAodF9iYXNlX3R5cGUqKXR5cGU7Ci0gICAgc3dpdGNoIChidHlwZS0+Z2V0X2Jhc2UoKSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiKGJvb2wpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIihpbnQpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiKGRvdWJsZSkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICIoc3RyaW5nKSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICIoaW50KSI7Ci0gIH0KLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvciA6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpTVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGU6OkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGU6OkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZTo6RE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6U1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGU6Ok1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGU6OkxTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocGhwLCAiUEhQIiwKLSIgICAgaW5saW5lZDogICAgICAgICBHZW5lcmF0ZSBQSFAgaW5saW5lZCBmaWxlc1xuIgotIiAgICBzZXJ2ZXI6ICAgICAgICAgIEdlbmVyYXRlIFBIUCBzZXJ2ZXIgc3R1YnNcbiIKLSIgICAgYXV0b2xvYWQ6ICAgICAgICBHZW5lcmF0ZSBQSFAgd2l0aCBhdXRvbG9hZFxuIgotIiAgICBvb3A6ICAgICAgICAgICAgIEdlbmVyYXRlIFBIUCB3aXRoIG9iamVjdCBvcmllbnRlZCBzdWJjbGFzc2VzXG4iCi0iICAgIHJlc3Q6ICAgICAgICAgICAgR2VuZXJhdGUgUEhQIFJFU1QgcHJvY2Vzc29yc1xuIgotKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU0NTAyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIFB5dGhvbiBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfcHlfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcHlfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5ld19zdHlsZSIpOwotICAgIGdlbl9uZXdzdHlsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidHdpc3RlZCIpOwotICAgIGdlbl90d2lzdGVkXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGlmIChnZW5fdHdpc3RlZF8pewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudHdpc3RlZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgIHRkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcHlfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIHB5X2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfcHlfbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkiKTsKLSAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiByZWFsX21vZHVsZTsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIG5ldy1zdHlsZSBjbGFzc2VzLgotICAgKi8KLSAgYm9vbCBnZW5fbmV3c3R5bGVfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuCi0gICAqLwotICBib29sIGdlbl90d2lzdGVkXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotCi19OwotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgc3RyaW5nIG1vZHVsZSA9IGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtXyk7Ci0gIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCi0gICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotICAgIHN0ZDo6b2ZzdHJlYW0gaW5pdF9weSgocGFja2FnZV9kaXJfKyIvX19pbml0X18ucHkiKS5jX3N0cigpKTsKLSAgICBpbml0X3B5LmNsb3NlKCk7Ci0gICAgaWYgKG1vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbW9kdWxlLmZpbmQoJy4nKTsKLSAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGU7Ci0gICAgICBtb2R1bGUuY2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGUuc3Vic3RyKDAsIHBvcyk7Ci0gICAgICBtb2R1bGUuZXJhc2UoMCwgcG9zKzEpOwotICAgIH0KLSAgfQotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrInR0eXBlcy5weSI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfKyIvIisiY29uc3RhbnRzLnB5IjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9pbml0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi9fX2luaXRfXy5weSI7Ci0gIG9mc3RyZWFtIGZfaW5pdDsKLSAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7Ci0gIGZfaW5pdCAgPDwKLSAgICAiX19hbGxfXyA9IFsndHR5cGVzJywgJ2NvbnN0YW50cyciOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgZl9pbml0IDw8ICIsICciIDw8ICgqc3ZfaXRlciktPmdldF9uYW1lKCkgPDwgIiciOwotICB9Ci0gIGZfaW5pdCA8PCAiXSIgPDwgZW5kbDsKLSAgZl9pbml0LmNsb3NlKCk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsIDw8Ci0gICAgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbCA8PAotICAgIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCkgPDwKLSAgICBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHNfIDw8Ci0gICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsIDw8Ci0gICAgImZyb20gdHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICByZXN1bHQgKz0gImltcG9ydCAiICsgZ2V0X3JlYWxfcHlfbW9kdWxlKGluY2x1ZGVzW2ldKSArICIudHR5cGVzXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKLSAgcmV0dXJuCi0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydFxuIgotICAgICJmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sXG4iCi0gICAgInRyeTpcbiIKLSAgICAiICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeVxuIgotICAgICJleGNlcHQ6XG4iCi0gICAgIiAgZmFzdGJpbmFyeSA9IE5vbmVcbiI7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIjXG4iKSArCi0gICAgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKwotICAgICIjXG4iICsKLSAgICAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiI1xuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9pbXBvcnRzKCkgewotICByZXR1cm4KLSAgICBzdHJpbmcoImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgKiIpOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQeXRob24sIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7fQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7Ci0KLSAgZl90eXBlc18gPDwKLSAgICAiY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PAotICAgIChnZW5fbmV3c3R5bGVfID8gIihvYmplY3QpIiA6ICIiKSA8PAotICAgICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOwotCi0gIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX05BTUVTX1RPX1ZBTFVFUyA9IHsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBpbnQgdmFsdWUgPSAtMTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICArK3ZhbHVlOwotICAgIH0KLQotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKLQotICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcwotICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCB2YWx1ZSA8PCAiOiBcIiIgPDwKLSAgICAgIGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIsIiA8PCBlbmRsOwotICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgIGluZGVudCgpIDw8IGluZGVudCgpIDw8ICciJyA8PCBlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICJcIjogIiA8PCB2YWx1ZSA8PCAnLCcgPDwgZW5kbDsKLSAgfQotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCB0b19zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsIDw8IGZyb21fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICBmX2NvbnN0c18gPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJUcnVlIiA6ICJGYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoKip7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAic2V0KCI7Ci0gICAgfQotICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJdIjsKLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiKSI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PAotICAgICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIihFeGNlcHRpb24pIjsKLSAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfKSB7Ci0gICAgb3V0IDw8ICIob2JqZWN0KSI7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLyoKLSAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgotICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKLSAgICAgaXRlbV9zcGVjIC0+IE5vbmUgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKLSAgICAgdGFnIC0+IGludGVnZXIKLSAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgotICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCi0gICAgIGRlZmF1bHQgLT4gTm9uZSAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCi0gICAgIHNwZWNfYXJncyAtPiBOb25lICAjIEZvciBzaW1wbGUgdHlwZXMKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCi0gICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAotICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KLSAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCi0gICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCi0KLSAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KLSAgKi8KLQotICAvLyBUT0RPKGRyZWlzcyk6IExvb2sgaW50byBnZW5lcmF0aW5nIGFuIGVtcHR5IHR1cGxlIGluc3RlYWQgb2YgTm9uZQotICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCi0gIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cwotICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgotICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJpZnRfc3BlYyA9ICgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKLSAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLQotICAgICAgZm9yICg7IHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKTsgc29ydGVkX2tleXNfcG9zKyspIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIk5vbmUsICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIKLSAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiciIDw8ICIsICIKLSAgICAgICAgICAgIDw8IHR5cGVfdG9fc3BlY19hcmdzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikgPDwgIiwgIgotICAgICAgICAgICAgPDwgIiksIgotICAgICAgICAgICAgPDwgIiAjICIgPDwgc29ydGVkX2tleXNfcG9zCi0gICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgICBzb3J0ZWRfa2V5c19wb3MgKys7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJpZnRfc3BlYyA9IE5vbmUiIDw8IGVuZGw7Ci0gIH0KLQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwiOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gVGhpcyBmaWxscyBpbiBkZWZhdWx0IHZhbHVlcywgYXMgb3Bwb3NlZCB0byBudWxscwotICAgICAgb3V0IDw8ICIgIiA8PCBkZWNsYXJlX2FyZ3VtZW50KCptX2l0ZXIpIDw8ICIsIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIik6IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAvLyBJbml0aWFsaXplIGZpZWxkcwotICAgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgaWYgKCF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpICYmICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzICIgPDwgInNlbGYudGhyaWZ0X3NwZWNbIiA8PAotICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl1bNF06IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PAotICAgICAgICAgIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLQotICAvLyBGb3IgZXhjZXB0aW9ucyBvbmx5LCBnZW5lcmF0ZSBhIF9fc3RyX18gbWV0aG9kLiBUaGlzIGlzCi0gIC8vIGJlY2F1c2Ugd2hlbiByYWlzZWQgZXhjZXB0aW9ucyBhcmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSwgX19yZXByX18KLSAgLy8gaXNuJ3QgdXNlZC4gU2VlIHB5dGhvbiBidWcgIzU4ODIKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX3N0cl9fKHNlbGYpOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlcHIoc2VsZikiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBQcmludGluZyB1dGlsaXRpZXMgc28gdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lIHRocmlmdAotICAvLyBzdHJ1Y3RzIGxvb2sgcHJldHR5IGxpa2UgZGljdGlvbmFyaWVzCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJkZWYgX19yZXByX18oc2VsZik6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgbWV0aG9kcyB0aGF0IGNvbXBhcmUgYnkgdmFsdWUKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCAiCi0gICAgICAgICAgICAgICAgInNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImRlZiByZWFkKHNlbGYsIGlwcm90KToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgIgotICAgICJhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpICIKLSAgICAiYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgIgotICAgICJhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInJldHVybiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgVHJ1ZToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIihmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhayIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZWxpZiAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICJmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgICIgIGlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCAiCi0gICAgImFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lICIKLSAgICAiYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKSIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IE5vbmU6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwKLSAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyIucHkiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBweV9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJpbXBvcnQgIiA8PCBnZXRfcmVhbF9weV9tb2R1bGUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpIDw8Ci0gICAgICAiLiIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiZnJvbSB0dHlwZXMgaW1wb3J0ICoiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yIiA8PCBlbmRsIDw8Ci0gICAgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgSW50ZXJmYWNlLCBpbXBsZW1lbnRzIiA8PCBlbmRsIDw8Ci0gICAgICAiZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciIgPDwgZW5kbCA8PAotICAgICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmID0gIigiICsgZXh0ZW5kcyArICIuSWZhY2UpIjsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBleHRlbmRzX2lmID0gIihJbnRlcmZhY2UpIjsKLSAgICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8pIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgSWZhY2UiIDw8IGV4dGVuZHNfaWYgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICBpZiAoZnVuY3Rpb25zLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKCIgKyBleHRlbmRzICsgIi5DbGllbnQpIjsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8gJiYgZ2VuX25ld3N0eWxlXykgewotICAgICAgICBleHRlbmRzX2NsaWVudCA9ICIob2JqZWN0KSI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICI6IiA8PCBlbmRsIDw8Ci0gICAgICAiICBpbXBsZW1lbnRzKElmYWNlKSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJjbGFzcyBDbGllbnQoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UpOiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KToiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3Q9Tm9uZSk6IiA8PCBlbmRsOwotICB9Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9vcHJvdF9mYWN0b3J5ID0gb3Byb3RfZmFjdG9yeSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5faXByb3QgPSBzZWxmLl9vcHJvdCA9IGlwcm90IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIG9wcm90ICE9IE5vbmU6IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgc2VsZi5fb3Byb3QgPSBvcHJvdCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fc2VxaWQgKz0gMSIgPDwgZW5kbDsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAiZCA9IHNlbGYuX3JlcXNbc2VsZi5fc2VxaWRdID0gZGVmZXIuRGVmZXJyZWQoKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiBkIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAic2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZGVmZXIuc3VjY2VlZChOb25lKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJkZWYgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOiIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLl90cmFuc3BvcnQpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICAgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLkNBTEwsIHNlbGYuX3NlcWlkKSIKLSAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuQ0FMTCwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShzZWxmLl9vcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAgICAgIihzZWxmLCBpcHJvdCwgbXR5cGUsIHJzZXFpZCk6IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3AocnNlcWlkKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IHNlbGYuX2lwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIiA8PCBlbmRsOwotCi0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBkLmVycmJhY2soeCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoc2VsZi5faXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5faXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJhaXNlIHgiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChzZWxmLl9pcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5faXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LnN1Y2Nlc3MgIT0gTm9uZToiIDw8IGVuZGw7Ci0gICAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5jYWxsYmFjayhyZXN1bHQuc3VjY2VzcykiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzIiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBkLmVycmJhY2socmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgICAicmV0dXJuIGQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgICAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBkLmVycmJhY2soVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIG1ha2luZyByZW1vdGUgcmVxdWVzdHMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSByZW1vdGUgZm9yLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBmX3JlbW90ZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyItcmVtb3RlIjsKLSAgb2ZzdHJlYW0gZl9yZW1vdGU7Ci0gIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKLQotICBmX3JlbW90ZSA8PAotICAgICIjIS91c3IvYmluL2VudiBweXRob24iIDw8IGVuZGwgPDwKLSAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBzeXMiIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0IHBwcmludCIgPDwgZW5kbCA8PAotICAgICJmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbCA8PAotICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0IiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEh0dHBDbGllbnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9yZW1vdGUgPDwKLSAgICAiaW1wb3J0ICIgPDwgc2VydmljZV9uYW1lXyA8PCBlbmRsIDw8Ci0gICAgImZyb20gdHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJpZiBsZW4oc3lzLmFyZ3YpIDw9IDEgb3Igc3lzLmFyZ3ZbMV0gPT0gJy0taGVscCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcHJpbnQgJyciIDw8IGVuZGwgPDwKLSAgICAiICBwcmludCAnVXNhZ2U6ICcgKyBzeXMuYXJndlswXSArICcgWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXSciIDw8IGVuZGwgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHByaW50ICdGdW5jdGlvbnM6JyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3JlbW90ZSA8PAotICAgICAgIiAgcHJpbnQgJyAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgaW50IG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3JlbW90ZSA8PAotICAgICAgICBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3JlbW90ZSA8PCAiKSciIDw8IGVuZGw7Ci0gIH0KLSAgZl9yZW1vdGUgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHN5cy5leGl0KDApIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGluZGVudCA9IDIpIiA8PCBlbmRsIDw8Ci0gICAgImhvc3QgPSAnbG9jYWxob3N0JyIgPDwgZW5kbCA8PAotICAgICJwb3J0ID0gOTA5MCIgPDwgZW5kbCA8PAotICAgICJ1cmkgPSAnJyIgPDwgZW5kbCA8PAotICAgICJmcmFtZWQgPSBGYWxzZSIgPDwgZW5kbCA8PAotICAgICJodHRwID0gRmFsc2UiIDw8IGVuZGwgPDwKLSAgICAiYXJnaSA9IDEiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctaCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcGFydHMgPSBzeXMuYXJndlthcmdpKzFdLnNwbGl0KCc6JykgIiA8PCBlbmRsIDw8Ci0gICAgIiAgaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsIDw8Ci0gICAgIiAgcG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwgPDwKLSAgICAiICBhcmdpICs9IDIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctdSc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgdXJsID0gdXJscGFyc2Uoc3lzLmFyZ3ZbYXJnaSsxXSkiIDw8IGVuZGwgPDwKLSAgICAiICBwYXJ0cyA9IHVybFsxXS5zcGxpdCgnOicpICIgPDwgZW5kbCA8PAotICAgICIgIGhvc3QgPSBwYXJ0c1swXSIgPDwgZW5kbCA8PAotICAgICIgIGlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbCA8PAotICAgICIgICAgcG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwgPDwKLSAgICAiICBlbHNlOiIgPDwgZW5kbCA8PAotICAgICIgICAgcG9ydCA9IDgwIiA8PCBlbmRsIDw8Ci0gICAgIiAgdXJpID0gdXJsWzJdIiA8PCBlbmRsIDw8Ci0gICAgIiAgaHR0cCA9IFRydWUiIDw8IGVuZGwgPDwKLSAgICAiICBhcmdpICs9IDIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctZicgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1mcmFtZWQnOiIgPDwgZW5kbCA8PAotICAgICIgIGZyYW1lZCA9IFRydWUiIDw8IGVuZGwgPDwKLSAgICAiICBhcmdpICs9IDEiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImNtZCA9IHN5cy5hcmd2W2FyZ2ldIiA8PCBlbmRsIDw8Ci0gICAgImFyZ3MgPSBzeXMuYXJndlthcmdpKzE6XSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiaWYgaHR0cDoiIDw8IGVuZGwgPDwKLSAgICAiICB0cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudChob3N0LCBwb3J0LCB1cmkpIiA8PCBlbmRsIDw8Ci0gICAgImVsc2U6IiA8PCBlbmRsIDw8Ci0gICAgIiAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KGhvc3QsIHBvcnQpIiA8PCBlbmRsIDw8Ci0gICAgIiAgaWYgZnJhbWVkOiIgPDwgZW5kbCA8PAotICAgICIgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwgPDwKLSAgICAiICBlbHNlOiIgPDwgZW5kbCA8PAotICAgICIgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSIgPDwgZW5kbCA8PAotICAgICJwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSIgPDwgZW5kbCA8PAotICAgICJjbGllbnQgPSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi5DbGllbnQocHJvdG9jb2wpIiA8PCBlbmRsIDw8Ci0gICAgInRyYW5zcG9ydC5vcGVuKCkiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3JlbW90ZSA8PCAiZWwiOwotICAgIH0KLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGludCBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOwotCi0gICAgZl9yZW1vdGUgPDwKLSAgICAgICJpZiBjbWQgPT0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOiIgPDwgZW5kbCA8PAotICAgICAgIiAgaWYgbGVuKGFyZ3MpICE9ICIgPDwgbnVtX2FyZ3MgPDwgIjoiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgcHJpbnQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmVxdWlyZXMgIiA8PCBudW1fYXJncyA8PCAiIGFyZ3MnIiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIHN5cy5leGl0KDEpIiA8PCBlbmRsIDw8Ci0gICAgICAiICBwcC5wcHJpbnQoY2xpZW50LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgewotICAgICAgICBmX3JlbW90ZSA8PCAiYXJnc1siIDw8IGkgPDwgIl0sIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICJldmFsKGFyZ3NbIiA8PCBpIDw8ICJdKSwiOwotICAgICAgfQotICAgIH0KLSAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7Ci0KLSAgICBmX3JlbW90ZSA8PCBlbmRsOwotICB9Ci0KLSAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3JlbW90ZS5jbG9zZSgpOwotCi0gIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KLSAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAotICAgICAgICAgIFNfSVJVU1IKLSAgICAgICAgfCBTX0lXVVNSCi0gICAgICAgIHwgU19JWFVTUgotI2lmbmRlZiBNSU5HVwotICAgICAgICB8IFNfSVJHUlAKLSAgICAgICAgfCBTX0lYR1JQCi0gICAgICAgIHwgU19JUk9USAotICAgICAgICB8IFNfSVhPVEgKLSNlbmRpZgotICApOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yKToiIDw8IGVuZGwgPDwKLSAgICAgICIgIGltcGxlbWVudHMoSWZhY2UpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJZmFjZSwgVFByb2Nlc3Nvcik6IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IElmYWNlKGhhbmRsZXIpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcCA9IHt9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSBQcm9jZXNzb3IucHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBuYW1lIG5vdCBpbiBzZWxmLl9wcm9jZXNzTWFwOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnNraXAoVFR5cGUuU1RSVUNUKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gZnVuY3Rpb24gJXMnICUgKG5hbWUpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZGVmZXIuc3VjY2VlZChOb25lKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuX2hhbmRsZXIuIiA8PAotICAgICAgICB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiwgIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICJkLmFkZENhbGxiYWNrKHNlbGYud3JpdGVfcmVzdWx0c19zdWNjZXNzXyIgPDwKLSAgICAgICAgICB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICAgImQuYWRkRXJyYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIgPDwKLSAgICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgImRlZiB3cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIihzZWxmLCBzdWNjZXNzLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHN1Y2Nlc3MiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJkZWYgd3JpdGVfcmVzdWx0c19leGNlcHRpb25fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIihzZWxmLCBlcnJvciwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKLQotICAgICAgLy8gS2luZGEgYWJzdXJkCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGVycm9yLnJhaXNlRXhjZXB0aW9uKCkiIDw8IGVuZGw7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgewotCi0gICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAic2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5Ci0gKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIigiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpICIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gc2V0KCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIikgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpID0gaXByb3QucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yICIgPDwgaSA8PCAiIGluIHhyYW5nZSgiIDw8IHNpemUgPDwgIik6IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYXBwZW5kKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLndyaXRlKG9wcm90KSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwQmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICIgPDwga2l0ZXIgPDwgIiwiIDw8IHZpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5pdGVtcygpOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gc3RydWN0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiAgICB0ZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKSB7Ci0gIGJvb2wgaGFzX2RvYyA9IGZhbHNlOwotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBoYXNfZG9jID0gdHJ1ZTsKLSAgICBzcyA8PCB0ZG9jLT5nZXRfZG9jKCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpZiAoaGFzX2RvYykgewotICAgICAgc3MgPDwgZW5kbDsKLSAgICB9Ci0gICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgc3MgPDwgc3ViaGVhZGVyIDw8ICI6XG4iOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiIC0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiOiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNzIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGhhc19kb2MpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiXCJcIlwiXG4iLAotICAgICAgIiIsIHNzLnN0cigpLAotICAgICAgIlwiXCJcIlxuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnZW5lcmljIG9iamVjdC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIlwiXCJcIlxuIiwKLSAgICAgICIiLCB0ZG9jLT5nZXRfZG9jKCksCi0gICAgICAiXCJcIlwiXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGFuIGFyZ3VtZW50LCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OwotICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9IjsKLSAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgIHJlc3VsdCA8PCAidGhyaWZ0X3NwZWNbIiA8PAotICAgICAgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIl1bNF0iOwotICB9IGVsc2UgewotICAgIHJlc3VsdCA8PCAiTm9uZSI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgZGVmYXVsdCB2YWx1ZSwgcmV0dXJucyBOb25lIG90aGVyd2lzZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiAiTm9uZSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHJldHVybgotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgIihzZWxmLCAiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYW4gaW50ZXJmYWNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICBzdHJpbmcgc2lnbmF0dXJlID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOwotICBpZiAoIWdlbl90d2lzdGVkXykgewotICAgIHNpZ25hdHVyZSArPSAic2VsZiwgIjsKLSAgfQotICBzaWduYXR1cmUgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotICByZXR1cm4gc2lnbmF0dXJlOwotfQotCi0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0pICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcmV0dXJuIGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtKSArICIudHR5cGVzLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQeXRob24gdHlvZQotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKiogU2VlIHRoZSBjb21tZW50IGluc2lkZSBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbiBmb3Igd2hhdCB0aGlzIGlzLiAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKSB7Ci0gIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJOb25lIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiKCIgKwotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArCi0gICAgICAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsKLSAgICAgICIpIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKwotICAgICAgIikiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocHksICJQeXRob24iLAotIiAgICBuZXdfc3R5bGU6ICAgICAgIEdlbmVyYXRlIG5ldy1zdHlsZSBjbGFzc2VzLlxuIiBcCi0iICAgIHR3aXN0ZWQ6ICAgICAgICAgR2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuXG4iCi0pOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZDA1NGQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+Ci0KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIFJ1YnkgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3JiX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9yYl9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1yYiI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAgICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uICAgICAgICAodF9zdHJ1Y3QqICAgdHVuaW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAgICAodF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICAgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl91bmlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9zaW1wbGVfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3RvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVmbnMgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2RhdGEgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogZmllbGRfdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUsIHRfY29uc3RfdmFsdWUqIGZpZWxkX3ZhbHVlLCBib29sIG9wdGlvbmFsKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcmRvYyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyByYl9hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdWxsX3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLQotCi0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJ1YnlfbW9kdWxlcyh0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInJiIik7Ci0gICAgYm9vc3Q6OnRva2VuaXplcjw+IHRvayhucyk7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXM7Ci0KLSAgICBmb3IoYm9vc3Q6OnRva2VuaXplcjw+OjppdGVyYXRvciBiZWc9dG9rLmJlZ2luKCk7IGJlZyAhPSB0b2suZW5kKCk7ICsrYmVnKSB7Ci0gICAgICBtb2R1bGVzLnB1c2hfYmFjayhjYXBpdGFsaXplKCpiZWcpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kdWxlczsKLSAgfQotCi0gIHZvaWQgYmVnaW5fbmFtZXNwYWNlKHN0ZDo6b2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOwotICB2b2lkIGVuZF9uYW1lc3BhY2Uoc3RkOjpvZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSt1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pKyJfdHlwZXMucmIiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkrdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSsiX2NvbnN0YW50cy5yYiI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7Ci0gICAgYmVnaW5fbmFtZXNwYWNlKGZfdHlwZXNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKLQotICBmX2NvbnN0c18gPDwKLSAgICByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgInJlcXVpcmUgJyIgPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gICAgYmVnaW5fbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICByZXN1bHQgKz0gInJlcXVpcmUgJyIgKyB1bmRlcnNjb3JlKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfdHlwZXMnXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuCi0gICAgc3RkOjpzdHJpbmcoIiNcbiIpICsKLSAgICAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArCi0gICAgIiNcbiIgKwotICAgICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICIjXG4iOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZW5kX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0gIGVuZF9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBSdWJ5LCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PAotICAgICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGludCB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotCi0gICAgLy8gUnVieSBjbGFzcyBjb25zdGFudHMgaGF2ZSB0byBiZSBjYXBpdGFsaXplZC4uLiBvbWcgaSBhbSBzbyBvbiB0aGUgZmVuY2UKLSAgICAvLyBhYm91dCBsYW5ndWFnZXMgc3RyaWN0bHkgZW5mb3JjaW5nIGNhcGl0YWxpemF0aW9uIHdoeSBjYW4ndCB3ZSBqdXN0IGFsbAotICAgIC8vIGFncmVlIGFuZCBwbGF5IG5pY2UuCi0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICB9Ci0gIAotICAvL0NyZWF0ZSBhIGhhc2ggbWFwcGluZyB2YWx1ZXMgYmFjayB0byB0aGVpciBuYW1lcyAoYXMgc3RyaW5ncykgc2luY2UgcnVieSBoYXMgbm8gbmF0aXZlIGVudW0gdHlwZQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJWQUxVRV9NQVAgPSB7IjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHZhbHVlID0gLTE7Ci0gIGZvcihjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvL1BvcHVsYXRlIHRoZSBoYXNoCi0gICAgLy9JZiBubyB2YWx1ZSBpcyBnaXZlbiwgdXNlIHRoZSBuZXh0IGF2YWlsYWJsZSBvbmUKLSAgICBpZiAoKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBlbHNlICsrdmFsdWU7Ci0gICAgCi0gICAgZmlyc3QgPyBmaXJzdCA9IGZhbHNlIDogZl90eXBlc18gPDwgIiwgIjsKLSAgICBmX3R5cGVzXyA8PCB2YWx1ZSA8PCAiID0+IFwiIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiIjsKLSAgICAKLSAgfQotICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIC8vIENyZWF0ZSBhIHNldCB3aXRoIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGluZGVudChmX3R5cGVzXykgPDwgIlZBTElEX1ZBTFVFUyA9IFNldC5uZXcoWyI7Ci0gIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvLyBQb3B1bGF0ZSB0aGUgc2V0Ci0gICAgZmlyc3QgPyBmaXJzdCA9IGZhbHNlOiBmX3R5cGVzXyA8PCAiLCAiOwotICAgIGZfdHlwZXNfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgfQotICBmX3R5cGVzXyA8PCAiXSkuZnJlZXplIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwKLSAgICAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotCi0gIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl9jb25zdHNfIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICIlcVwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IGZ1bGxfdHlwZV9uYW1lKHR5cGUpIDw8ICIubmV3KHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIlNldC5uZXcoWyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIl0pIjsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl0iOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHJ1Ynkgc3RydWN0Ci0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX3JiX3VuaW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcnVieSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKLSAgZ2VuZXJhdGVfcmRvYyhvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpFeGNlcHRpb24iOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0LCA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKG91dCwgdHN0cnVjdCk7Ci0gIH0KLQotICBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZmllbGRfZGVmbnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotCi0gIGluZGVudChvdXQpIDw8ICI6OlRocmlmdDo6U3RydWN0LmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHJ1YnkgdW5pb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfdW5pb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgewotICBnZW5lcmF0ZV9yZG9jKG91dCwgdHN0cnVjdCk7Ci0gIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIDwgOjpUaHJpZnQ6OlVuaW9uIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZWZucyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiOjpUaHJpZnQ6OlVuaW9uLmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLQotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgPDwgc2VsZiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZGVmICIgPDwgZmllbGRfbmFtZSA8PCAiKHZhbCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIubmV3KDoiIDw8IGZpZWxkX25hbWUgPDwgIiwgdmFsKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICB9Ci0gIAotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDEpIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJkZWYgaW5pdGlhbGl6ZShtZXNzYWdlPW5pbCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdXBlcigpIiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInNlbGYuIiA8PCBuYW1lIDw8ICIgPSBtZXNzYWdlIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgaWYgKG5hbWUgIT0gIm1lc3NhZ2UiKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJkZWYgbWVzc2FnZTsgIiA8PCBuYW1lIDw8ICIgZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX2ZpZWxkX25hbWUgPSB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8IGNhcF9maWVsZF9uYW1lIDw8ICIgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2RlZm5zKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJGSUVMRFMgPSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gZ2VuZXJhdGUgdGhlIGZpZWxkIGRvY3N0cmluZ3Mgd2l0aGluIHRoZSBGSUVMRFMgY29uc3RhbnQuIG5vIHJlYWwgYmV0dGVyIHBsYWNlLi4uCi0gICAgZ2VuZXJhdGVfcmRvYyhvdXQsICpmX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0+ICI7Ci0KLSAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmZfaXRlciktPmdldF9uYW1lKCksICgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCksIAotICAgICAgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmIHN0cnVjdF9maWVsZHM7IEZJRUxEUzsgZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiBmaWVsZF90eXBlLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lID0gIiIsIHRfY29uc3RfdmFsdWUqIGZpZWxkX3ZhbHVlID0gTlVMTCwgYm9vbCBvcHRpb25hbCA9IGZhbHNlKSB7Ci0gIGZpZWxkX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkX3R5cGUpOwotCi0gIC8vIEJlZ2luIHRoaXMgZmllbGQncyBkZWZuCi0gIG91dCA8PCAiezp0eXBlID0+ICIgPDwgdHlwZV90b19lbnVtKGZpZWxkX3R5cGUpOwotCi0gIGlmICghZmllbGRfbmFtZS5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICIsIDpuYW1lID0+ICciIDw8IGZpZWxkX25hbWUgPDwgIiciOwotICB9Ci0KLSAgaWYgKGZpZWxkX3ZhbHVlICE9IE5VTEwpIHsKLSAgICBvdXQgPDwgIiwgOmRlZmF1bHQgPT4gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgZmllbGRfdmFsdWUpOwotICB9Ci0KLSAgaWYgKCFmaWVsZF90eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGlmIChmaWVsZF90eXBlLT5pc19zdHJ1Y3QoKSB8fCBmaWVsZF90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmNsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoKHRfc3RydWN0KilmaWVsZF90eXBlKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgb3V0IDw8ICIsIDplbGVtZW50ID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X2xpc3QqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIG91dCA8PCAiLCA6a2V5ID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICAgIG91dCA8PCAiLCA6dmFsdWUgPT4gIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfbWFwKilmaWVsZF90eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9zZXQqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZmllbGRfdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmJpbmFyeSA9PiB0cnVlIjsKLSAgICB9Ci0gIH0KLSAgCi0gIGlmKG9wdGlvbmFsKSB7Ci0gICAgb3V0IDw8ICIsIDpvcHRpb25hbCA9PiB0cnVlIjsKLSAgfQotCi0gIGlmIChmaWVsZF90eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgIiwgOmVudW1fY2xhc3MgPT4gIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZF90eXBlKTsKLSAgfQotCi0gIC8vIEVuZCBvZiB0aGlzIGZpZWxkJ3MgZGVmbgotICBvdXQgPDwgIn0iOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpiZWdpbl9uYW1lc3BhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJtb2R1bGUgIiA8PCAqbV9pdGVyIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6ZW5kX25hbWVzcGFjZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlcykgewotICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46OnJldmVyc2VfaXRlcmF0b3IgbV9pdGVyID0gbW9kdWxlcy5yYmVnaW4oKTsgbV9pdGVyICE9IG1vZHVsZXMucmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkrdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSsiLnJiIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgInJlcXVpcmUgJ3RocmlmdCciIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAicmVxdWlyZSAnIiA8PCB1bmRlcnNjb3JlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiJyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAicmVxdWlyZSAnIiA8PCB1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMnIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBiZWdpbl9uYW1lc3BhY2UoZl9zZXJ2aWNlXywgcnVieV9tb2R1bGVzKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZW5kX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl9zZXJ2aWNlXywgdHMpOwotICAgIGdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0gIGdlbmVyYXRlX3JiX3N0cnVjdChmX3NlcnZpY2VfLCAmcmVzdWx0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IGZ1bGxfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgPCAiICsgZXh0ZW5kcyArICI6OkNsaWVudCAiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImluY2x1ZGUgOjpUaHJpZnQ6OkNsaWVudCIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLQotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kX21lc3NhZ2UoJyIgPDwgZnVubmFtZSA8PCAiJywgIiA8PCBhcmdzbmFtZTsKLQotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCA6IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCA9IHJlY2VpdmVfbWVzc2FnZSgiIDw8IHJlc3VsdG5hbWUgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuc3VjY2VzcyB1bmxlc3MgcmVzdWx0LnN1Y2Nlc3MubmlsPyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJhaXNlIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICAgIiB1bmxlc3MgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIubmlsPyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICAgInJldHVybiIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JykiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiA8ICIgKyBleHRlbmRzICsgIjo6UHJvY2Vzc29yICI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpQcm9jZXNzb3IiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICIoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncyA9IHJlYWRfYXJncyhpcHJvdCwgIiA8PCBhcmdzbmFtZSA8PCAiKSIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5uZXcoKSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJAaGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzY3VlICIgPDwgZnVsbF90eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiID0+ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ3cml0ZV9yZXN1bHQocmVzdWx0LCBvcHJvdCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBzZXFpZCkiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHJldHVybgotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgIigiICsgIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLQotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdWxsX3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzID0gcnVieV9tb2R1bGVzKHR0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7Ci0gICAgICAgbV9pdGVyICE9IG1vZHVsZXMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgcHJlZml4ICs9ICptX2l0ZXIgKyAiOjoiOwotICB9Ci0gIHJldHVybiBwcmVmaXggKyB0eXBlX25hbWUodHR5cGUpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUnVieSB0eW9lCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6RE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6Ok1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmRvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiIiwgIiMgIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7Ci0gIH0KLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiZGVmIHZhbGlkYXRlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICdSZXF1aXJlZCBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiOwotICAgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19ib29sKCkpIHsKLSAgICAgICAgb3V0IDw8ICIgaWYgQCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5uaWw/IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiIHVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSl7ICAgICAgCi0gICAgICBpbmRlbnQob3V0KSA8PCAidW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyB8fCAiIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oQCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIiA8PCBlbmRsOyAgCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJkZWYgdmFsaWRhdGUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAicmFpc2UoU3RhbmRhcmRFcnJvciwgJ1VuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4nKSBpZiBnZXRfc2V0X2ZpZWxkLm5pbD8gfHwgZ2V0X3ZhbHVlLm5pbD8iIDw8IGVuZGw7Ci0KLSAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBjb25zdCB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKXsgICAgICAKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiBnZXRfc2V0X2ZpZWxkID09IDoiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIHVubGVzcyAiIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oZ2V0X3ZhbHVlKSIgPDwgZW5kbDsgIAotICAgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocmIsICJSdWJ5IiwgIiIpOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZDc2YTQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBTbWFsbHRhbGsgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3N0X2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9zdF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zdCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAgICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uICgpOwotICB2b2lkIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cyAoKTsKLQotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3N0X3N0cnVjdCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2FjY2Vzc29ycyAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlbmRfbWV0aG9kICh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3JlY3ZfbWV0aG9kICh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHN0ZDo6c3RyaW5nIG1hcF9yZWFkZXIgKHRfbWFwICp0bWFwKTsKLSAgc3RkOjpzdHJpbmcgbGlzdF9yZWFkZXIgKHRfbGlzdCAqdGxpc3QpOwotICBzdGQ6OnN0cmluZyBzZXRfcmVhZGVyICh0X3NldCAqdHNldCk7Ci0gIHN0ZDo6c3RyaW5nIHN0cnVjdF9yZWFkZXIgKHRfc3RydWN0ICp0c3RydWN0LCBzdGQ6OnN0cmluZyBjbHNOYW1lKTsKLQotICBzdGQ6OnN0cmluZyBtYXBfd3JpdGVyICh0X21hcCAqdG1hcCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGxpc3Rfd3JpdGVyICh0X2xpc3QgKnRsaXN0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgc2V0X3dyaXRlciAodF9zZXQgKnRzZXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBzdHJ1Y3Rfd3JpdGVyICh0X3N0cnVjdCAqdHN0cnVjdCwgc3RkOjpzdHJpbmcgZm5hbWUpOwotCi0gIHN0ZDo6c3RyaW5nIHdyaXRlX3ZhbCAodF90eXBlICp0LCBzdGQ6OnN0cmluZyBmbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlYWRfdmFsICh0X3R5cGUgKnQpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBzdF9hdXRvZ2VuX2NvbW1lbnQoKTsKLQotICB2b2lkIHN0X2NsYXNzX2RlZihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7Ci0gIHZvaWQgc3RfY2xvc2VfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCk7Ci0gIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKLSAgdm9pZCBzdF9zZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOwotICB2b2lkIHN0X2dldHRlcihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lKCk7Ci0gIHN0ZDo6c3RyaW5nIGNsaWVudF9jbGFzc19uYW1lKCk7Ci0gIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKTsKLQotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGFfdHlwZSh0X3R5cGUqIHR5cGUpOwotICBib29sIGlzX3Zvd2VsKGNoYXIgYyk7Ci0gIHN0ZDo6c3RyaW5nIHRlbXBfbmFtZSgpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfY2F0ZWdvcnkoKTsKLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgaW50IHRlbXBvcmFyeV92YXI7Ci0gIHN0ZDo6b2ZzdHJlYW0gZl87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHRlbXBvcmFyeV92YXIgPSAwOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkrIi8iK3Byb2dyYW1fbmFtZV8rIi5zdCI7Ci0gIGZfLm9wZW4oZl9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmXyA8PCBzdF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHN0X2NsYXNzX2RlZihmXywgcHJvZ3JhbV9uYW1lXyk7Ci0gIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOwotCi0gIC8vR2VuZXJhdGUgZW51bXMKLSAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICB9Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6Y2xhc3NfbmFtZSgpIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBjbGFzc19uYW1lKSB7Ci0gIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLnByZWZpeCIpOwotICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoY2xhc3NfbmFtZSk7Ci0gIG5hbWUgPSBwcmVmaXguZW1wdHkoKSA/IG5hbWUgOiAocHJlZml4ICsgbmFtZSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsaWVudF9jbGFzc19uYW1lKCkgewotICByZXR1cm4gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJDbGllbnQiOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygiJyIpICsKLSAgICAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKwotICAgICJcbiIgKwotICAgICJETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiJyFcbiI7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpIHsKLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBrZXlzQW5kVmFsdWVzRG86IFs6ayA6diB8ICIgPDwKLSAgICBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGF0OiBrIHB1dDogdiB2YWx1ZV0uISIgPDwgZW5kbDsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBrZXlzQW5kVmFsdWVzRG86IFs6ayA6diB8ICIgPDwKLSAgICBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKTsKLSAgZl8uY2xvc2UoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZWRfY2F0ZWdvcnkoKSB7Ci0gIHN0cmluZyBjYXQgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLmNhdGVnb3J5Iik7Ci0gIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFRocmlmdCBncmFtbWFyLCB0aGUgY2F0ZWdvcnkgbXVzdAotICAvLyBiZSBwdW5jdHVhdGVkIGJ5IGRvdHMuICBSZXBsYWNlcyB0aGVtIHdpdGggZGFzaGVzIGhlcmUuCi0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gY2F0LmJlZ2luKCk7IGl0ZXIgIT0gY2F0LmVuZCgpOyArK2l0ZXIpIHsKLSAgICBpZiAoKml0ZXIgPT0gJy4nKSB7Ci0gICAgICAqaXRlciA9ICctJzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNhdC5zaXplKCkgPyBjYXQgOiAiR2VuZXJhdGVkLSIgKyBjbGFzc19uYW1lKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBTbWFsbHRhbGssIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7fQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19kZWYoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgbmFtZSkgewotICBvdXQgPDwgIk9iamVjdCBzdWJjbGFzczogIyIgPDwgcHJlZml4KG5hbWUpIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImluc3RhbmNlVmFyaWFibGVOYW1lczogJyciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xhc3NWYXJpYWJsZU5hbWVzOiAnJyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwb29sRGljdGlvbmFyaWVzOiAnJyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSwgImFzIHlldCB1bmNhdGVnb3JpemVkIik7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscyArICIgY2xhc3MiLCBuYW1lKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsIGNhdGVnb3J5KTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgewotICBjaGFyIHRpbWVzdHJbNTBdOwotICB0aW1lX3QgcmF3dGltZTsKLSAgc3RydWN0IHRtICp0aW5mbzsKLQotICB0aW1lKCZyYXd0aW1lKTsKLSAgdGluZm8gPSBsb2NhbHRpbWUoJnJhd3RpbWUpOwotICBzdHJmdGltZSh0aW1lc3RyLCA1MCwgIiVtLyVkLyVZICVIOiVNIiwgdGluZm8pOwotCi0gIG91dCA8PCAiISIgPDwgcHJlZml4KGNscykgPDwKLSAgICAiIG1ldGhvZHNGb3I6ICciK2NhdGVnb3J5KyInIHN0YW1wOiAndGhyaWZ0ICIgPDwgdGltZXN0ciA8PCAiJyFcbiIgPDwKLSAgICBuYW1lIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xvc2VfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCkgewotICBvdXQgPDwgIiEgISIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9zZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICI6ICIgKyB0eXBlKTsKLSAgb3V0IDw8IG5hbWUgPDwgIiA6PSAiICsgdHlwZTsKLSAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2dldHRlcihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICIiKTsKLSAgb3V0IDw8ICJeICIgPDwgbmFtZTsKLSAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgdHlwZSA9ICJhbk9iamVjdCIpIHsKLSAgc3Rfc2V0dGVyKG91dCwgY2xzLCBuYW1lLCB0eXBlKTsKLSAgc3RfZ2V0dGVyKG91dCwgY2xzLCBuYW1lKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCkgewotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNsYXNzIiA8PCBlbmRsIDw8Ci0gICAgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnY29uc3RhbnRzIGVudW1zJyEiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiZW51bXMiKTsKLSAgc3RfYWNjZXNzb3JzKGZfLCBjbGFzc19uYW1lKCkgKyAiIGNsYXNzIiwgImNvbnN0YW50cyIpOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKLQotICBmXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdHJpbmcgY2xzX25hbWUgPSBwcm9ncmFtX25hbWVfICsgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBhdDogJyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIicgcHV0OiBbIiA8PAotICAgICIoRGljdGlvbmFyeSBuZXcgIiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgaW50IHZhbHVlID0gLTE7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgKyt2YWx1ZTsKLSAgICB9Ci0KLSAgICBmXyA8PCAiXHRhdDogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHB1dDogIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfIDw8ICJcdHlvdXJzZWxmKV0hIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGF0OiAnIiA8PCBuYW1lIDw8ICInIHB1dDogWyIgPDwKLSAgICByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICJdISIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIigiIDw8IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSkgPDwgIiBuZXcgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICI6ICIgPDwKLSAgICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgIihEaWN0aW9uYXJ5IG5ldyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgImF0OiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiBwdXQ6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICIoU2V0IG5ldyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIoT3JkZXJlZENvbGxlY3Rpb24gbmV3IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCAiYWRkOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBTbWFsbHRhbGsgc3RydWN0Ci0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc21hbGx0YWxrIGNsYXNzIHRvIHJlcHJlc2VudCBhIHN0cnVjdAotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGlmIChpc19leGNlcHRpb24pCi0gICAgb3V0IDw8ICJFcnJvciI7Ci0gIGVsc2UKLSAgICBvdXQgPDwgIk9iamVjdCI7Ci0KLSAgb3V0IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeCh0eXBlX25hbWUodHN0cnVjdCkpIDw8IGVuZGwgPDwKLSAgICAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICciOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuYmVnaW4oKSkgb3V0IDw8ICIgIjsKLSAgICAgIG91dCA8PCBjYW1lbGNhc2UoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgIidcbiIgPDwKLSAgICAiXHRjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnXG4iIDw8Ci0gICAgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIgPDwKLSAgICAiXHRjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichXG5cbiI7Ci0KLSAgZ2VuZXJhdGVfYWNjZXNzb3JzKG91dCwgdHN0cnVjdCk7Ci19Ci0KLWJvb2wgdF9zdF9nZW5lcmF0b3I6OmlzX3Zvd2VsKGNoYXIgYykgewotICBzd2l0Y2godG9sb3dlcihjKSkgewotICAgIGNhc2UgJ2EnOiBjYXNlICdlJzogY2FzZSAnaSc6IGNhc2UgJ28nOiBjYXNlICd1JzoKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6YV90eXBlKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmIChpc192b3dlbCh0eXBlX25hbWUodHlwZSlbMF0pKQotICAgIHByZWZpeCA9ICJhbiI7Ci0gIGVsc2UKLSAgICBwcmVmaXggPSAiYSI7Ci0KLSAgcmV0dXJuIHByZWZpeCArIGNhcGl0YWxpemUodHlwZV9uYW1lKHR5cGUpKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgc3RyaW5nIHR5cGU7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHN0X2FjY2Vzc29ycyhvdXQsCi0gICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSh0eXBlX25hbWUodHN0cnVjdCkpLAotICAgICAgICAgICAgICAgICAgIGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpLAotICAgICAgICAgICAgICAgICAgIGFfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKTsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICAvLyBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dGVtcF9uYW1lKCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBvdXQgPDwgInRlbXAiIDw8IHRlbXBvcmFyeV92YXIrKzsKLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfd3JpdGVyKHRfbWFwICp0bWFwLCBzdHJpbmcgZm5hbWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGtleSA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVNYXBCZWdpbjogKFRNYXAgbmV3IGtleVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF9rZXlfdHlwZSgpKSA8PAotICAgICI7IHZhbHVlVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odG1hcC0+Z2V0X3ZhbF90eXBlKCkpIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGtleXNBbmRWYWx1ZXNEbzogWzoiIDw8IGtleSA8PCAiIDoiIDw8IHZhbCA8PCAiIHwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSkgPDwgIi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCB3cml0ZV92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZU1hcEVuZF0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3JlYWRlcih0X21hcCAqdG1hcCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTWFwQmVnaW4uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gRGljdGlvbmFyeSBuZXcuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhdDogIiA8PCByZWFkX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgPDwKLSAgICAiIHB1dDogIiA8PCByZWFkX3ZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCByZWFkTWFwRW5kLiIgPDwgZW5kbCA8PAotICBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF93cml0ZXIodF9saXN0ICp0bGlzdCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZUxpc3RCZWdpbjogKFRMaXN0IG5ldyBlbGVtVHlwZTogIiA8PAotICAgIHR5cGVfdG9fZW51bSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBkbzogWzoiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUxpc3RFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3RfcmVhZGVyKHRfbGlzdCAqdGxpc3QpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTGlzdEJlZ2luLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IE9yZGVyZWRDb2xsZWN0aW9uIG5ldy4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGFkZDogIiA8PCByZWFkX3ZhbCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90IHJlYWRMaXN0RW5kLiIgPDwgZW5kbCA8PAotICBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3dyaXRlcih0X3NldCAqdHNldCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZVNldEJlZ2luOiAoVFNldCBuZXcgZWxlbVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgPDwKLSAgICAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBkbzogWzoiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHZhbCkgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU2V0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfcmVhZGVyKHRfc2V0ICp0c2V0KSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZFNldEJlZ2luLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IFNldCBuZXcuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90IHJlYWRTZXRFbmQuIiA8PCBlbmRsIDw8Ci0gIGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgc25hbWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotCi0gIG91dCA8PCAiW29wcm90IHdyaXRlU3RydWN0QmVnaW46ICIgPDwKLSAgICAiKFRTdHJ1Y3QgbmV3IG5hbWU6ICciICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArIicpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBib29sIG9wdGlvbmFsID0gKCpmbGRfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIGFjY2Vzc29yID0gc25hbWUgKyAiICIgKyBjYW1lbGNhc2UoZm5hbWUpOwotCi0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzb3IgPDwgIiBpZk5vdE5pbDogWyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZSA8PAotICAgICAgIic7IHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PAotICAgICAgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiKS4iIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpLCBhY2Nlc3NvcikgPDwgIi4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kIjsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgb3V0IDw8ICJdIjsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIuIiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF9yZWFkZXIodF9zdHJ1Y3QgKnRzdHJ1Y3QsIHN0cmluZyBjbHNOYW1lID0gIiIpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIGZvdW5kID0gdGVtcF9uYW1lKCk7Ci0KLSAgaWYgKGNsc05hbWUuc2l6ZSgpID09IDApIHsKLSAgICBjbHNOYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy9UaGlzIGlzIG5hc3R5LCBidXQgd2l0aG91dCBpdCB3ZSdsbCBicmVhayB0aGluZ3MgYnkgcHJlZml4aW5nIFRSZXN1bHQuCi0gIHN0cmluZyBuYW1lID0gKChjYXBpdGFsaXplKGNsc05hbWUpID09ICJUUmVzdWx0IikgPyBjYXBpdGFsaXplKGNsc05hbWUpIDogcHJlZml4KGNsc05hbWUpKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9ICIgPDwgbmFtZSA8PCAiIG5ldy4iIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkU3RydWN0QmVnaW4uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlsiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkRmllbGRCZWdpbi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgdHlwZSA9IFRUeXBlIHN0b3BdIHdoaWxlRmFsc2U6IFt8IiA8PCBmb3VuZCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIGlkID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8Ci0gICAgICAiIGlmVHJ1ZTogWyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIDo9IHRydWUuIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB2YWwgPDwgIiAiIDw8IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjogIiA8PAotICAgICAgcmVhZF92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBvdXQgPDwgIl0uIiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZvdW5kIDw8ICIgaWZOaWw6IFtpcHJvdCBza2lwOiAiIDw8IGRlc2MgPDwgIiB0eXBlXV0uIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QgcmVhZFN0cnVjdEVuZC4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6d3JpdGVfdmFsKHRfdHlwZSAqdCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOwotCi0gIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKikgdCktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImlwcm90IHdyaXRlRG91YmxlOiAiICsgZm5hbWUgKyAiIGFzRmxvYXQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZSIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSkgKyAiOiAiICsgZm5hbWUgKyAiIGFzSW50ZWdlciI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lOwotICAgIH0KLSAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgewotICAgIHJldHVybiBtYXBfd3JpdGVyKCh0X21hcCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHN0cnVjdF93cml0ZXIoKHRfc3RydWN0KikgdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiBsaXN0X3dyaXRlcigodF9saXN0KikgdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuIHNldF93cml0ZXIoKHRfc2V0KikgdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaXByb3Qgd3JpdGVJMzI6ICIgKyBmbmFtZTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKLSAgfQotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlYWRfdmFsKHRfdHlwZSAqdCkgewotICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKLQotICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gImlwcm90IHJlYWQiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpOwotICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuIG1hcF9yZWFkZXIoKHRfbWFwKikgdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiBzdHJ1Y3RfcmVhZGVyKCh0X3N0cnVjdCopIHQpOwotICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiBsaXN0X3JlYWRlcigodF9saXN0KikgdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gc2V0X3JlYWRlcigodF9zZXQqKSB0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImlwcm90IHJlYWRJMzIiOwotICB9IGVsc2UgewotICAgIHRocm93ICJTb3JyeSwgSSBkb24ndCBrbm93IGhvdyB0byByZWFkIHRoaXM6ICIgKyB0eXBlX25hbWUodCk7Ci0gIH0KLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VuZF9tZXRob2QodF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGZ1bm5hbWUgPSBmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmN0aW9uX3NpZ25hdHVyZShmdW5jdGlvbik7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotCi0gIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgInNlbmQiICsgY2FwaXRhbGl6ZShzaWduYXR1cmUpKTsKLSAgZl8gPDwgIm9wcm90IHdyaXRlTWVzc2FnZUJlZ2luOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIihUQ2FsbE1lc3NhZ2UgbmV3IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmXyA8PCBpbmRlbnQoKSA8PCAibmFtZTogJyIgPDwgZnVubmFtZSA8PCAiJzsgIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInNlcWlkOiBzZWxmIG5leHRTZXFpZCkuIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotCi0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiIDw8Ci0gICAgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIGNhcGl0YWxpemUoY2FtZWxjYXNlKGZ1bm5hbWUpKSArICJfYXJncycpLiIgPDwgZW5kbDsKLQotICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZSA8PAotICAgICAgIic7IHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PAotICAgICAgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiKS4iIDw8IGVuZGw7Ci0KLSAgICBmXyA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCksIGZuYW1lKSA8PCAiLiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQuIiA8PCBlbmRsOwotICB9Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZDsgd3JpdGVNZXNzYWdlRW5kLiIgPDwgZW5kbDsKLSAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaCI7Ci0KLSAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKLX0KLQotLy8gV2Ugb25seSBzdXBwb3J0IHJlY2VpdmluZyBUUmVzdWx0IHN0cnVjdHVyZXMgKHNvIHRoaXMgd29uJ3Qgd29yayBvbiB0aGUgc2VydmVyIHNpZGUpCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWN2X21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgewotICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZShmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOwotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgIlRSZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLQotICB0X3N0cnVjdCogeHMgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIGR1cGxpY2F0ZSB0aGUgZmllbGQsIGJ1dCBjYWxsIGl0ICJleGNlcHRpb24iLi4uIHdlIGRvbid0IG5lZWQgYSBkeW5hbWljIG5hbWUKLSAgICB0X2ZpZWxkICpleGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKmZfaXRlciktPmdldF90eXBlKCksICJleGNlcHRpb24iLCAoKmZfaXRlciktPmdldF9rZXkoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb24pOwotICB9Ci0KLSAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAicmVjdiIgKyBjYXBpdGFsaXplKGZ1bm5hbWUpKTsKLSAgZl8gPDwgInwgZiBtc2cgcmVzIHwgIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm1zZyA6PSBvcHJvdCByZWFkTWVzc2FnZUJlZ2luLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzZWxmIHZhbGlkYXRlUmVtb3RlTWVzc2FnZTogbXNnLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXMgOj0gIiA8PCBzdHJ1Y3RfcmVhZGVyKCZyZXN1bHQpIDw8ICIuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90IHJlYWRNZXNzYWdlRW5kLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2guIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlcyBleGNlcHRpb24gaWZOb3ROaWw6IFtyZXMgZXhjZXB0aW9uIHNpZ25hbF0uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIl4gcmVzIjsKLSAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGZuLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8ICJcIiI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjogIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKGZfaXRlciArIDEpICE9IGZpZWxkcy5lbmQoKSkgewotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8ICJcIiI7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIlRDbGllbnQiOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICJDbGllbnQiOwotICB9Ci0KLSAgZl8gPDwgZXh0ZW5kc19jbGllbnQgPDwgIiBzdWJjbGFzczogIyIgPDwgcHJlZml4KGNsaWVudF9jbGFzc19uYW1lKCkpIDw8IGVuZGwgPDwKLSAgICAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnXG4iIDw8Ci0gICAgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIiA8PAotICAgICJcdHBvb2xEaWN0aW9uYXJpZXM6ICcnXG4iIDw8Ci0gICAgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOwotCi0gICAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCBzaWduYXR1cmUpOwotICAgIGZfIDw8IGZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQoKmZfaXRlcikgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInNlbGYgc2VuZCIgPDwgY2FwaXRhbGl6ZShzaWduYXR1cmUpIDw8ICIuIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmXyA8PCBpbmRlbnQoKSA8PCAiXiBzZWxmIHJlY3YiIDw8IGNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiBzdWNjZXNzICIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBzdF9jbG9zZV9tZXRob2QoZl8pOwotCi0gICAgZ2VuZXJhdGVfc2VuZF9tZXRob2QoKmZfaXRlcik7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBnZW5lcmF0ZV9yZWN2X21ldGhvZCgqZl9pdGVyKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICByZXR1cm4gY2FtZWxjYXNlKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgIjsKLSAgICB9Ci0gICAgc3RyaW5nIG5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICByZXN1bHQgKz0gbmFtZSArICI6ICIgKyBuYW1lOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7Ci0gICAgICBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl90eXBlcy4iOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotLyogQ29udmVydCB0X3R5cGUgdG8gU21hbGx0YWxrIHR5cGUgY29kZSAqLwotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZSBzdHJpbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUgYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZSBieXRlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUgaTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUgaTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUgaTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUgZG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBpMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIHN0cnVjdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIG1hcCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlIHNldCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBsaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHN0LCAiU21hbGx0YWxrIiwgIiIpOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5YTkxYS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIFhTRCBnZW5lcmF0b3IsIGNyZWF0ZXMgYW4gWFNEIGZvciB0aGUgYmFzZSB0eXBlcyBldGMuCi0gKgotICovCi1jbGFzcyB0X3hzZF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF94c2RfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi14c2QiOwotICB9Ci0KLSAgdmlydHVhbCB+dF94c2RfZ2VuZXJhdG9yKCkge30KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkge30KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLQotIHByaXZhdGU6Ci0KLSAgdm9pZCBnZW5lcmF0ZV9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X3N0cnVjdCogYXR0cnM9TlVMTCwgYm9vbCBvcHRpb25hbD1mYWxzZSwgYm9vbCBuaWxsYWJsZT1mYWxzZSwgYm9vbCBsaXN0X2VsZW1lbnQ9ZmFsc2UpOwotCi0gIHN0ZDo6c3RyaW5nIG5zKHN0ZDo6c3RyaW5nIGluLCBzdGQ6OnN0cmluZyBucykgewotICAgIHJldHVybiBucyArICI6IiArIGluOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgeHNkKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgcmV0dXJuIG5zKGluLCAieHNkIik7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpOwotCi0gIC8qKgotICAgKiBPdXRwdXQgeHNkL3BocCBmaWxlCi0gICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfeHNkXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3BocF87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCBzdHJpbmcgc3RyZWFtCi0gICAqLwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc194c2RfdHlwZXNfOwotCi19OwotCi0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9waHBfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV8tPmdldF9uYW1lKCkrIl94c2QucGhwIjsKLSAgZl9waHBfLm9wZW4oZl9waHBfbmFtZS5jX3N0cigpKTsKLQotICBmX3BocF8gPDwKLSAgICAiPD9waHAiIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZl9waHBfIDw8ICI/PiIgPDwgZW5kbDsKLSAgZl9waHBfLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAiPHhzZDpzaW1wbGVUeXBlIG5hbWU9XCIiIDw8IHR0eXBlZGVmLT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+aXNfc3RyaW5nX2VudW0oKSkgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgICAiPHhzZDpyZXN0cmljdGlvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHZhbHVlcyA9ICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+Z2V0X3N0cmluZ19lbnVtX3ZhbHMoKTsKLSAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICAgICAiPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT1cIiIgPDwgKCp2X2l0ZXIpIDw8ICJcIiAvPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICAgIjwveHNkOnJlc3RyaWN0aW9uPiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICAgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAiPC94c2Q6c2ltcGxlVHlwZT4iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBib29sIHhzZF9hbGwgPSB0c3RydWN0LT5nZXRfeHNkX2FsbCgpOwotCi0gIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmNvbXBsZXhUeXBlIG5hbWU9XCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh4c2RfYWxsKSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6YWxsPiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2VsZW1lbnQoc194c2RfdHlwZXNfLCAoKm1faXRlciktPmdldF9uYW1lKCksICgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfeHNkX2F0dHJzKCksICgqbV9pdGVyKS0+Z2V0X3hzZF9vcHRpb25hbCgpIHx8IHhzZF9hbGwsICgqbV9pdGVyKS0+Z2V0X3hzZF9uaWxsYWJsZSgpKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGlmICh4c2RfYWxsKSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOmFsbD4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZWxlbWVudChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGlzdF9lbGVtZW50KSB7Ci0gIHN0cmluZyBzbWluT2NjdXJzID0gKG9wdGlvbmFsIHx8IGxpc3RfZWxlbWVudCkgPyAiIG1pbk9jY3Vycz1cIjBcIiIgOiAiIjsKLSAgc3RyaW5nIHNtYXhPY2N1cnMgPSBsaXN0X2VsZW1lbnQgPyAiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiIiA6ICIiOwotICBzdHJpbmcgc29wdGlvbmFsID0gc21pbk9jY3VycyArIHNtYXhPY2N1cnM7Ci0gIHN0cmluZyBzbmlsbGFibGUgPSBuaWxsYWJsZSA/ICIgbmlsbGFibGU9XCJ0cnVlXCIiIDogIiI7Ci0KLSAgaWYgKHR0eXBlLT5pc192b2lkKCkgfHwgdHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICI+IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmIChhdHRycyA9PSBOVUxMICYmIHR0eXBlLT5pc192b2lkKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICI8eHNkOmNvbXBsZXhUeXBlIC8+IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPHhzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOnNlcXVlbmNlIG1pbk9jY3Vycz1cIjBcIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIj4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBzdHJpbmcgc3VibmFtZTsKLSAgICAgICAgdF90eXBlKiBzdWJ0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBpZiAoc3VidHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgc3VidHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgICAgICBzdWJuYW1lID0gbmFtZSArICJfZWx0IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdWJuYW1lID0gdHlwZV9uYW1lKHN1YnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGZfcGhwXyA8PCAiJEdMT0JBTFNbJyIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIl94c2RfZWx0XyIgPDwgbmFtZSA8PCAiJ10gPSAnIiA8PCBzdWJuYW1lIDw8ICInOyIgPDwgZW5kbDsKLSAgICAgICAgZ2VuZXJhdGVfZWxlbWVudChvdXQsIHN1Ym5hbWUsIHN1YnR5cGUsIE5VTEwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwibGlzdFwiIHR5cGU9XCJ4c2Q6Ym9vbGVhblwiIC8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYgKGF0dHJzICE9IE5VTEwpIHsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGF0dHJzLT5nZXRfbWVtYmVycygpOwotICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cIiIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlPVwiIiA8PCB0eXBlX25hbWUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGF0dHJzID09IE5VTEwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8ICIgdHlwZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIiAvPiIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gV293LCBhbGwgdGhpcyB3b3JrIGZvciBhIFNJTVBMRSBUWVBFIHdpdGggYXR0cmlidXRlcz8hPyE/IQotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmV4dGVuc2lvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIj4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpleHRlbnNpb24+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl94c2RfbmFtZSA9IGdldF9vdXRfZGlyKCkrdHNlcnZpY2UtPmdldF9uYW1lKCkrIi54c2QiOwotICBmX3hzZF8ub3BlbihmX3hzZF9uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBucyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJ4c2QiKTsKLSAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICBucyA9ICIgdGFyZ2V0TmFtZXNwYWNlPVwiIiArIG5zICsgIlwiIHhtbG5zPVwiIiArIG5zICsgIlwiICIgKwotICAgICAgImVsZW1lbnRGb3JtRGVmYXVsdD1cInF1YWxpZmllZFwiIjsKLSAgfQotCi0gIC8vIFByaW50IHRoZSBYU0QgaGVhZGVyCi0gIGZfeHNkXyA8PAotICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+IiA8PCBlbmRsIDw8Ci0gICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIiIDw8IG5zIDw8ICI+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICI8IS0tIFlvIHlvIHlvLCB0aGlzIFhTRCB3b3ogYmUgZ2VuZXJhdGVkIGJ5IFRocmlmdC4gLS0+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBQcmludCBvdXQgdGhlIHR5cGUgZGVmaW5pdGlvbnMKLSAgaW5kZW50KGZfeHNkXykgPDwgc194c2RfdHlwZXNfLnN0cigpOwotCi0gIC8vIEtlZXAgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgZXhjZXB0aW9ucyB0aGF0IG1pZ2h0IGdldCB0aHJvd24KLSAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPiBhbGxfeGNlcHRpb25zOwotCi0gIC8vIExpc3QgdGhlIGVsZW1lbnRzIHRoYXQgeW91IG1pZ2h0IGFjdHVhbGx5IGdldAotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZWxlbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3BvbnNlIjsKLSAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGVsZW1uYW1lLCByZXR1cm50eXBlKTsKLSAgICBmX3hzZF8gPDwgZW5kbDsKLQotICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBhbGxfeGNlcHRpb25zWygqeF9pdGVyKS0+Z2V0X25hbWUoKV0gPSAodF9zdHJ1Y3QqKSgoKnhfaXRlciktPmdldF90eXBlKCkpOwotICAgIH0KLSAgfQotCi0gIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj46Oml0ZXJhdG9yIGF4X2l0ZXI7Ci0gIGZvciAoYXhfaXRlciA9IGFsbF94Y2VwdGlvbnMuYmVnaW4oKTsgYXhfaXRlciAhPSBhbGxfeGNlcHRpb25zLmVuZCgpOyArK2F4X2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgYXhfaXRlci0+Zmlyc3QsIGF4X2l0ZXItPnNlY29uZCk7Ci0gIH0KLQotICAvLyBDbG9zZSB0aGUgWFNEIGRvY3VtZW50Ci0gIGZfeHNkXyA8PCBlbmRsIDw8ICI8L3hzZDpzY2hlbWE+IiA8PCBlbmRsOwotICBmX3hzZF8uY2xvc2UoKTsKLX0KLQotc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIHhzZChiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuIHhzZCgiaW50Iik7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuICJjb250YWluZXIiOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIFhTRCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcmV0dXJuIEV4cGxpY2l0IFhTRCB0eXBlLCBpLmUuIHhzZDpzdHJpbmcKLSAqLwotc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgewotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICByZXR1cm4gInN0cmluZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gImJvb2xlYW4iOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJieXRlIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJzaG9ydCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAiaW50IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuICJsb25nIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJkZWNpbWFsIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoeHNkLCAiWFNEIiwgIiIpOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nbG9iYWxzLmggYi9jb21waWxlci9jcHAvc3JjL2dsb2JhbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwNDE0My4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dsb2JhbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HTE9CQUxTX0gKLSNkZWZpbmUgVF9HTE9CQUxTX0gKLQotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0vKioKLSAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyAoc2xhcCBvbiB0aGUgd3Jpc3QpIHRoYXQgYXJlCi0gKiBzaGFyZWQgdGhyb3VnaG91dCB0aGUgcHJvZ3JhbS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0byBmYWNpbGl0YXRlIHNpbXBsZQotICogaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgcGFyc2VyIGFuZCB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS4gQmVmb3JlIGNhbGxpbmcKLSAqIHl5cGFyc2UoKSwgdGhlIG1haW4uY2MgcHJvZ3JhbSB3aWxsIG1ha2UgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIHRvIHRoZXNlCi0gKiBnbG9iYWwgdmFyaWFibGVzIHN1Y2ggdGhhdCB0aGUgcGFyc2VyIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGFuZCBwdXRzIGVudHJpZXMKLSAqIGludG8gdGhlIHJpZ2h0IGNvbnRhaW5lcnMsIGV0Yy4KLSAqCi0gKi8KLQotLyoqCi0gKiBIb29yYXkgZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgdHlwZXMhCi0gKi8KLQotY2xhc3MgdF9wcm9ncmFtOwotY2xhc3MgdF9zY29wZTsKLWNsYXNzIHRfdHlwZTsKLQotLyoqCi0gKiBQYXJzaW5nIG1vZGUsIHR3byBwYXNzZXMgdXAgaW4gdGhpcyBnaW4gcnVtbXkhCi0gKi8KLQotZW51bSBQQVJTRV9NT0RFIHsKLSAgSU5DTFVERVMgPSAxLAotICBQUk9HUkFNID0gMgotfTsKLQotLyoqCi0gKiBTdHJpY3RuZXNzIGxldmVsCi0gKi8KLWV4dGVybiBpbnQgZ19zdHJpY3Q7Ci0KLS8qKgotICogVGhlIG1hc3RlciBwcm9ncmFtIHBhcnNlIHRyZWUuIFRoaXMgaXMgYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIHBhcnNlciBjb2RlCi0gKiB0byBidWlsZCB1cCB0aGUgcHJvZ3JhbSBlbGVtZW50cy4KLSAqLwotZXh0ZXJuIHRfcHJvZ3JhbSogZ19wcm9ncmFtOwotCi0vKioKLSAqIEdsb2JhbCB0eXBlcyBmb3IgdGhlIHBhcnNlciB0byBiZSBhYmxlIHRvIHJlZmVyZW5jZQotICovCi0KLWV4dGVybiB0X3R5cGUqIGdfdHlwZV92b2lkOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX3N0cmluZzsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9iaW5hcnk7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfc2xpc3Q7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfYm9vbDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9ieXRlOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kxNjsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9pMzI7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfaTY0OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2RvdWJsZTsKLQotLyoqCi0gKiBUaGUgc2NvcGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcgaW50bwotICovCi1leHRlcm4gdF9zY29wZSogZ19zY29wZTsKLQotLyoqCi0gKiBUaGUgcGFyZW50IHNjb3BlIHRvIGFsc28gbG9hZCBzeW1ib2xzIGludG8KLSAqLwotZXh0ZXJuIHRfc2NvcGUqIGdfcGFyZW50X3Njb3BlOwotCi0vKioKLSAqIFRoZSBwcmVmaXggZm9yIHRoZSBwYXJlbnQgc2NvcGUgZW50cmllcwotICovCi1leHRlcm4gc3RkOjpzdHJpbmcgZ19wYXJlbnRfcHJlZml4OwotCi0vKioKLSAqIFRoZSBwYXJzaW5nIHBhc3MgdGhhdCB3ZSBhcmUgb24uIFdlIGRvIGRpZmZlcmVudCB0aGluZ3Mgb24gZWFjaCBwYXNzLgotICovCi1leHRlcm4gUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7Ci0KLS8qKgotICogR2xvYmFsIHRpbWUgc3RyaW5nLCB1c2VkIGluIGZvcm1hdHRpbmcgZXJyb3IgbWVzc2FnZXMgZXRjLgotICovCi1leHRlcm4gY2hhciogZ190aW1lX3N0cjsKLQotLyoqCi0gKiBUaGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgotICovCi1leHRlcm4gY2hhciogZ19kb2N0ZXh0OwotCi0vKioKLSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgotICovCi1leHRlcm4gaW50IGdfZG9jdGV4dF9saW5lbm87Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIyNDViLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIHRocmlmdCAtIGEgbGlnaHR3ZWlnaHQgY3Jvc3MtbGFuZ3VhZ2UgcnBjL3NlcmlhbGl6YXRpb24gdG9vbAotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBjb21waWxlciBlbmdpbmUgZm9yIFRocmlmdCwgd2hpY2ggaW52b2tlcyB0aGUKLSAqIHNjYW5uZXIvcGFyc2VyIHRvIGJ1aWxkIHRoZSB0aHJpZnQgb2JqZWN0IHRyZWUuIFRoZSBpbnRlcmZhY2UgZ2VuZXJhdGlvbgotICogY29kZSBmb3IgZWFjaCBsYW5ndWFnZSBsaXZlcyBpbiBhIGZpbGUgYnkgdGhlIGxhbmd1YWdlIG5hbWUgdW5kZXIgdGhlCi0gKiBnZW5lcmF0ZS8gZm9sZGVyLCBhbmQgYWxsIHBhcnNlIHN0cnVjdHVyZXMgbGl2ZSBpbiBwYXJzZS8KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2lmZGVmIE1JTkdXCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4gLyogZm9yIEdldEZ1bGxQYXRoTmFtZSAqLwotI2VuZGlmCi0KLS8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9zY29wZS5oIgotI2luY2x1ZGUgImdlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCi0KLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8qKgotICogR2xvYmFsIHByb2dyYW0gdHJlZQotICovCi10X3Byb2dyYW0qIGdfcHJvZ3JhbTsKLQotLyoqCi0gKiBHbG9iYWwgdHlwZXMKLSAqLwotCi10X3R5cGUqIGdfdHlwZV92b2lkOwotdF90eXBlKiBnX3R5cGVfc3RyaW5nOwotdF90eXBlKiBnX3R5cGVfYmluYXJ5OwotdF90eXBlKiBnX3R5cGVfc2xpc3Q7Ci10X3R5cGUqIGdfdHlwZV9ib29sOwotdF90eXBlKiBnX3R5cGVfYnl0ZTsKLXRfdHlwZSogZ190eXBlX2kxNjsKLXRfdHlwZSogZ190eXBlX2kzMjsKLXRfdHlwZSogZ190eXBlX2k2NDsKLXRfdHlwZSogZ190eXBlX2RvdWJsZTsKLQotLyoqCi0gKiBHbG9iYWwgc2NvcGUKLSAqLwotdF9zY29wZSogZ19zY29wZTsKLQotLyoqCi0gKiBQYXJlbnQgc2NvcGUgdG8gYWxzbyBwYXJzZSB0eXBlcwotICovCi10X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKLQotLyoqCi0gKiBQcmVmaXggZm9yIHB1dHRpbmcgdHlwZXMgaW4gcGFyZW50IHNjb3BlCi0gKi8KLXN0cmluZyBnX3BhcmVudF9wcmVmaXg7Ci0KLS8qKgotICogUGFyc2luZyBwYXNzCi0gKi8KLVBBUlNFX01PREUgZ19wYXJzZV9tb2RlOwotCi0vKioKLSAqIEN1cnJlbnQgZGlyZWN0b3J5IG9mIGZpbGUgYmVpbmcgcGFyc2VkCi0gKi8KLXN0cmluZyBnX2N1cmRpcjsKLQotLyoqCi0gKiBDdXJyZW50IGZpbGUgYmVpbmcgcGFyc2VkCi0gKi8KLXN0cmluZyBnX2N1cnBhdGg7Ci0KLS8qKgotICogU2VhcmNoIHBhdGggZm9yIGluY2x1c2lvbnMKLSAqLwotdmVjdG9yPHN0cmluZz4gZ19pbmNsX3NlYXJjaHBhdGg7Ci0KLS8qKgotICogU2hvdWxkIEMrKyBpbmNsdWRlIHN0YXRlbWVudHMgdXNlIHBhdGggcHJlZml4ZXMgZm9yIG90aGVyIHRocmlmdC1nZW5lcmF0ZWQKLSAqIGhlYWRlciBmaWxlcwotICovCi1ib29sIGdfY3BwX3VzZV9pbmNsdWRlX3ByZWZpeCA9IGZhbHNlOwotCi0vKioKLSAqIEdsb2JhbCBkZWJ1ZyBzdGF0ZQotICovCi1pbnQgZ19kZWJ1ZyA9IDA7Ci0KLS8qKgotICogU3RyaWN0bmVzcyBsZXZlbAotICovCi1pbnQgZ19zdHJpY3QgPSAxMjc7Ci0KLS8qKgotICogV2FybmluZyBsZXZlbAotICovCi1pbnQgZ193YXJuID0gMTsKLQotLyoqCi0gKiBWZXJib3NlIG91dHB1dAotICovCi1pbnQgZ192ZXJib3NlID0gMDsKLQotLyoqCi0gKiBHbG9iYWwgdGltZSBzdHJpbmcKLSAqLwotY2hhciogZ190aW1lX3N0cjsKLQotLyoqCi0gKiBUaGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgotICovCi1jaGFyKiBnX2RvY3RleHQ7Ci0KLS8qKgotICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWludCBnX2RvY3RleHRfbGluZW5vOwotCi0vKioKLSAqIEZsYWdzIHRvIGNvbnRyb2wgY29kZSBnZW5lcmF0aW9uCi0gKi8KLWJvb2wgZ2VuX2NwcCA9IGZhbHNlOwotYm9vbCBnZW5fZGVuc2UgPSBmYWxzZTsKLWJvb2wgZ2VuX2phdmEgPSBmYWxzZTsKLWJvb2wgZ2VuX2phdmFiZWFuID0gZmFsc2U7Ci1ib29sIGdlbl9yYiA9IGZhbHNlOwotYm9vbCBnZW5fcHkgPSBmYWxzZTsKLWJvb2wgZ2VuX3B5X25ld3N0eWxlID0gZmFsc2U7Ci1ib29sIGdlbl94c2QgPSBmYWxzZTsKLWJvb2wgZ2VuX3BocCA9IGZhbHNlOwotYm9vbCBnZW5fcGhwaSA9IGZhbHNlOwotYm9vbCBnZW5fcGhwcyA9IHRydWU7Ci1ib29sIGdlbl9waHBhID0gZmFsc2U7Ci1ib29sIGdlbl9waHBvID0gZmFsc2U7Ci1ib29sIGdlbl9yZXN0ID0gZmFsc2U7Ci1ib29sIGdlbl9wZXJsID0gZmFsc2U7Ci1ib29sIGdlbl9lcmwgPSBmYWxzZTsKLWJvb2wgZ2VuX29jYW1sID0gZmFsc2U7Ci1ib29sIGdlbl9ocyA9IGZhbHNlOwotYm9vbCBnZW5fY29jb2EgPSBmYWxzZTsKLWJvb2wgZ2VuX2NzaGFycCA9IGZhbHNlOwotYm9vbCBnZW5fc3QgPSBmYWxzZTsKLWJvb2wgZ2VuX3JlY3Vyc2UgPSBmYWxzZTsKLQotLyoqCi0gKiBNaW5HVyBkb2Vzbid0IGhhdmUgcmVhbHBhdGgsIHNvIHVzZSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBpbiB0aGF0IGNhc2UsCi0gKiBvdGhlcndpc2UgdGhpcyBqdXN0IGNhbGxzIHRocm91Z2ggdG8gcmVhbHBhdGgKLSAqLwotY2hhciAqc2FmZXJlYWxwYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKnJlc29sdmVkX3BhdGgpIHsKLSNpZmRlZiBNSU5HVwotICBjaGFyIGJ1ZltNQVhfUEFUSF07Ci0gIGNoYXIqIGJhc2VuYW1lOwotICBEV09SRCBsZW4gPSBHZXRGdWxsUGF0aE5hbWUocGF0aCwgTUFYX1BBVEgsIGJ1ZiwgJmJhc2VuYW1lKTsKLSAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+IE1BWF9QQVRIIC0gMSl7Ci0gICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIHBhdGgpOwotICB9IGVsc2UgewotICAgIENoYXJMb3dlckJ1ZmYoYnVmLCBsZW4pOwotICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBidWYpOwotICB9Ci0KLSAgLy8gUmVwbGFjZSBiYWNrc2xhc2hlcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBzbyB0aGUKLSAgLy8gcmVzdCBvZiB0aGUgY29kZSBiZWhhdmVzIGNvcnJlY3RseS4KLSAgc2l6ZV90IHJlc29sdmVkX2xlbiA9IHN0cmxlbihyZXNvbHZlZF9wYXRoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlZF9sZW47IGkrKykgewotICAgIGlmIChyZXNvbHZlZF9wYXRoW2ldID09ICdcXCcpIHsKLSAgICAgIHJlc29sdmVkX3BhdGhbaV0gPSAnLyc7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXNvbHZlZF9wYXRoOwotI2Vsc2UKLSAgcmV0dXJuIHJlYWxwYXRoKHBhdGgsIHJlc29sdmVkX3BhdGgpOwotI2VuZGlmCi19Ci0KLQotLyoqCi0gKiBSZXBvcnQgYW4gZXJyb3IgdG8gdGhlIHVzZXIuIFRoaXMgaXMgY2FsbGVkIHl5ZXJyb3IgZm9yIGhpc3RvcmljYWwKLSAqIHJlYXNvbnMgKGxleCBhbmQgeWFjYyBleHBlY3QgdGhlIGVycm9yIHJlcG9ydGluZyByb3V0aW5lIHRvIGJlIGNhbGxlZAotICogdGhpcykuIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZXBvcnQgYW55IGVycm9ycyB0byB0aGUgdXNlci4KLSAqIHl5ZXJyb3IgdGFrZXMgcHJpbnRmIHN0eWxlIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICovCi12b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAiW0VSUk9SOiVzOiVkXSAobGFzdCB0b2tlbiB3YXMgJyVzJylcbiIsCi0gICAgICAgICAgZ19jdXJwYXRoLmNfc3RyKCksCi0gICAgICAgICAgeXlsaW5lbm8sCi0gICAgICAgICAgeXl0ZXh0KTsKLQotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLQotICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgZGVidWcgbWVzc2FnZSBmcm9tIHRoZSBwYXJzZXIuCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfZGVidWcgPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotICB2YV9saXN0IGFyZ3M7Ci0gIHByaW50ZigiW1BBUlNFOiVkXSAiLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgdmVyYm9zZSBvdXRwdXQgbW9kZSBtZXNzYWdlCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICBpZiAoZ192ZXJib3NlID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLX0KLQotLyoqCi0gKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UKLSAqCi0gKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICovCi12b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfd2FybiA8IGxldmVsKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZhX2xpc3QgYXJnczsKLSAgcHJpbnRmKCJbV0FSTklORzolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0gIHByaW50ZigiXG4iKTsKLX0KLQotLyoqCi0gKiBQcmludHMgYSBmYWlsdXJlIG1lc3NhZ2UgYW5kIGV4aXRzCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgZnByaW50ZihzdGRlcnIsICJbRkFJTFVSRTolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0gIHByaW50ZigiXG4iKTsKLSAgZXhpdCgxKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQotICovCi1zdHJpbmcgcHJvZ3JhbV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgewotICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7Ci0gIGlmIChzbGFzaCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cihzbGFzaCsxKTsKLSAgfQotICBzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBmaWxlbmFtZS5yZmluZCgiLiIpOwotICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgewotICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKDAsIGRvdCk7Ci0gIH0KLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotCi0vKioKLSAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKLSAqLwotc3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgewotICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7Ci0gIC8vIE5vIHNsYXNoLCBqdXN0IHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkKLSAgaWYgKHNsYXNoID09IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiAiLiI7Ci0gIH0KLSAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cigwLCBzbGFzaCk7Ci19Ci0KLS8qKgotICogRmluZHMgdGhlIGFwcHJvcHJpYXRlIGZpbGUgcGF0aCBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lCi0gKi8KLXN0cmluZyBpbmNsdWRlX2ZpbGUoc3RyaW5nIGZpbGVuYW1lKSB7Ci0gIC8vIEFic29sdXRlIHBhdGg/IEp1c3QgdHJ5IHRoYXQKLSAgaWYgKGZpbGVuYW1lWzBdID09ICcvJykgewotICAgIC8vIFJlYWxwYXRoIQotICAgIGNoYXIgcnBbUEFUSF9NQVhdOwotICAgIGlmIChzYWZlcmVhbHBhdGgoZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKLSAgICAgIHB3YXJuaW5nKDAsICJDYW5ub3Qgb3BlbiBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gU3RhdCB0aGlzIGZpbGUKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gcnA7Ci0gICAgfQotICB9IGVsc2UgeyAvLyByZWxhdGl2ZSBwYXRoLCBzdGFydCBzZWFyY2hpbmcKLSAgICAvLyBuZXcgc2VhcmNoIHBhdGggd2l0aCBjdXJyZW50IGRpciBnbG9iYWwKLSAgICB2ZWN0b3I8c3RyaW5nPiBzcCA9IGdfaW5jbF9zZWFyY2hwYXRoOwotICAgIHNwLmluc2VydChzcC5iZWdpbigpLCBnX2N1cmRpcik7Ci0KLSAgICAvLyBpdGVyYXRlIHRocm91Z2ggcGF0aHMKLSAgICB2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IHNwLmJlZ2luKCk7IGl0ICE9IHNwLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBzdHJpbmcgc2ZpbGVuYW1lID0gKihpdCkgKyAiLyIgKyBmaWxlbmFtZTsKLQotICAgICAgLy8gUmVhbHBhdGghCi0gICAgICBjaGFyIHJwW1BBVEhfTUFYXTsKLSAgICAgIGlmIChzYWZlcmVhbHBhdGgoc2ZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvLyBTdGF0IHRoaXMgZmlsZXMKLSAgICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgewotICAgICAgICByZXR1cm4gcnA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gVWggb2gKLSAgcHdhcm5pbmcoMCwgIkNvdWxkIG5vdCBmaW5kIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygpOwotfQotCi0vKioKLSAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCi0gKiBBbHNvIHByaW50cyBhIHdhcm5pbmcgaWYgd2UgYXJlIGRpc2NhcmRpbmcgaW5mb3JtYXRpb24uCi0gKi8KLXZvaWQgY2xlYXJfZG9jdGV4dCgpIHsKLSAgaWYgKGdfZG9jdGV4dCAhPSBOVUxMKSB7Ci0gICAgcHdhcm5pbmcoMiwgIlVuY2FwdHVyZWQgZG9jdGV4dCBhdCBvbiBsaW5lICVkLiIsIGdfZG9jdGV4dF9saW5lbm8pOwotICB9Ci0gIGZyZWUoZ19kb2N0ZXh0KTsKLSAgZ19kb2N0ZXh0ID0gTlVMTDsKLX0KLQotLyoqCi0gKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKLSAqCi0gKiBXYXJuaW5nOiBpZiB5b3UgbWl4IHRhYnMgYW5kIHNwYWNlcyBpbiBhIG5vbi11bmlmb3JtIHdheSwKLSAqIHlvdSB3aWxsIGdldCB3aGF0IHlvdSBkZXNlcnZlLgotICovCi1jaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpIHsKLSAgLy8gQ29udmVydCB0byBDKysgc3RyaW5nLCBhbmQgcmVtb3ZlIFdpbmRvd3MncyBjYXJyaWFnZSByZXR1cm5zLgotICBzdHJpbmcgZG9jc3RyaW5nID0gZG9jdGV4dDsKLSAgZG9jc3RyaW5nLmVyYXNlKAotICAgICAgcmVtb3ZlKGRvY3N0cmluZy5iZWdpbigpLCBkb2NzdHJpbmcuZW5kKCksICdccicpLAotICAgICAgZG9jc3RyaW5nLmVuZCgpKTsKLQotICAvLyBTZXBhcmF0ZSBpbnRvIGxpbmVzLgotICB2ZWN0b3I8c3RyaW5nPiBsaW5lczsKLSAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gc3RyaW5nOjpucG9zOwotICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0OwotICB3aGlsZSAodHJ1ZSkgewotICAgIGxhc3QgPSAocG9zID09IHN0cmluZzo6bnBvcykgPyAwIDogcG9zKzE7Ci0gICAgcG9zID0gZG9jc3RyaW5nLmZpbmQoJ1xuJywgbGFzdCk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIC8vIEZpcnN0IGJpdCBvZiBjbGVhbmluZy4gIElmIHRoZSBsYXN0IGxpbmUgaXMgb25seSB3aGl0ZXNwYWNlLCBkcm9wIGl0LgotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgbm9ud2hpdGUgPSBkb2NzdHJpbmcuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIsIGxhc3QpOwotICAgICAgaWYgKG5vbndoaXRlICE9IHN0cmluZzo6bnBvcykgewotICAgICAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0KSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCwgcG9zLWxhc3QpKTsKLSAgfQotCi0gIC8vIEEgdmVyeSBwcm9mb3VuZCBkb2NzdHJpbmcuCi0gIGlmIChsaW5lcy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBDbGVhciBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZmlyc3QgbGluZS4KLSAgcG9zID0gbGluZXMuZnJvbnQoKS5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7Ci0gIGxpbmVzLmZyb250KCkuZXJhc2UoMCwgcG9zKTsKLQotICAvLyBJZiBldmVyeSBub25ibGFuayBsaW5lIGFmdGVyIHRoZSBmaXJzdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNwYWNlcy90YWJzLAotICAvLyB0aGVuIGEgc3RhciwgcmVtb3ZlIHRoZW0uCi0gIGJvb2wgaGF2ZV9wcmVmaXggPSB0cnVlOwotICBib29sIGZvdW5kX3ByZWZpeCA9IGZhbHNlOwotICBzdHJpbmc6OnNpemVfdHlwZSBwcmVmaXhfbGVuID0gMDsKLSAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGxfaXRlcjsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAoIWZvdW5kX3ByZWZpeCkgewotICAgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgaWYgKGxfaXRlci0+YXQocG9zKSA9PSAnKicpIHsKLSAgICAgICAgICBmb3VuZF9wcmVmaXggPSB0cnVlOwotICAgICAgICAgIHByZWZpeF9sZW4gPSBwb3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBUcnVuY2F0ZSBpdC4KLSAgICAgICAgbF9pdGVyLT5jbGVhcigpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAobF9pdGVyLT5zaXplKCkgPiBwb3MKLSAgICAgICAgJiYgbF9pdGVyLT5hdChwb3MpID09ICcqJwotICAgICAgICAmJiBwb3MgPT0gcHJlZml4X2xlbikgewotICAgICAgLy8gQnVzaW5lc3MgYXMgdXN1YWwuCi0gICAgfSBlbHNlIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIExldCdzIHRydW5jYXRlIGl0IGZvciB0aGVtLgotICAgICAgbF9pdGVyLT5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUaGUgcGF0dGVybiBoYXMgYmVlbiBicm9rZW4uCi0gICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KLSAgaWYgKGhhdmVfcHJlZml4KSB7Ci0gICAgLy8gR2V0IHRoZSBzdGFyIHRvby4KLSAgICBwcmVmaXhfbGVuKys7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7Ci0gICAgfQotICB9Ci0KLSAgLy8gTm93IGRlbGV0ZSB0aGUgbWluaW11bSBhbW91bnQgb2YgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZWFjaCBsaW5lLgotICBwcmVmaXhfbGVuID0gc3RyaW5nOjpucG9zOwotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkrMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcwotICAgICAgICAmJiAocHJlZml4X2xlbiA9PSBzdHJpbmc6Om5wb3MgfHwgcG9zIDwgcHJlZml4X2xlbikpIHsKLSAgICAgIHByZWZpeF9sZW4gPSBwb3M7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KLSAgaWYgKHByZWZpeF9sZW4gIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lLgotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfbGFzdF9ub3Rfb2YoIiBcdCIpOwotICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyAhPSBsX2l0ZXItPmxlbmd0aCgpLTEpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UocG9zKzEpOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHRoZSBmaXJzdCBsaW5lIGlzIGVtcHR5LCByZW1vdmUgaXQuCi0gIC8vIERvbid0IGRvIHRoaXMgZWFybGllciBiZWNhdXNlIGEgbG90IG9mIHN0ZXBzIHNraXAgdGhlIGZpcnN0IGxpbmUuCi0gIGlmIChsaW5lcy5mcm9udCgpLmVtcHR5KCkpIHsKLSAgICBsaW5lcy5lcmFzZShsaW5lcy5iZWdpbigpKTsKLSAgfQotCi0gIC8vIE5vdyByZWpvaW4gdGhlIGxpbmVzIGFuZCBjb3B5IHRoZW0gYmFjayBpbnRvIGRvY3RleHQuCi0gIGRvY3N0cmluZy5jbGVhcigpOwotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBkb2NzdHJpbmcgKz0gKmxfaXRlcjsKLSAgICBkb2NzdHJpbmcgKz0gJ1xuJzsKLSAgfQotCi0gIGFzc2VydChkb2NzdHJpbmcubGVuZ3RoKCkgPD0gc3RybGVuKGRvY3RleHQpKTsKLSAgc3RyY3B5KGRvY3RleHQsIGRvY3N0cmluZy5jX3N0cigpKTsKLSAgcmV0dXJuIGRvY3RleHQ7Ci19Ci0KLS8qKiBTZXQgdG8gdHJ1ZSB0byBkZWJ1ZyBkb2NzdHJpbmcgcGFyc2luZyAqLwotc3RhdGljIGJvb2wgZHVtcF9kb2NzID0gZmFsc2U7Ci0KLS8qKgotICogRHVtcHMgZG9jc3RyaW5ncyB0byBzdGRvdXQKLSAqIE9ubHkgd29ya3MgZm9yIHRvcC1sZXZlbCBkZWZpbml0aW9ucyBhbmQgdGhlIHdob2xlIHByb2dyYW0gZG9jCi0gKiAoaS5lLiwgbm90IGVudW0gY29uc3RhbnRzLCBzdHJ1Y3QgZmllbGRzLCBvciBmdW5jdGlvbnMuCi0gKi8KLXZvaWQgZHVtcF9kb2NzdHJpbmdzKHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICBzdHJpbmcgcHJvZ2RvYyA9IHByb2dyYW0tPmdldF9kb2MoKTsKLSAgaWYgKCFwcm9nZG9jLmVtcHR5KCkpIHsKLSAgICBwcmludGYoIldob2xlIHByb2dyYW0gZG9jOlxuJXNcbiIsIHByb2dkb2MuY19zdHIoKSk7Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfdHlwZWRlZio+JiB0eXBlZGVmcyA9IHByb2dyYW0tPmdldF90eXBlZGVmcygpOwotICB2ZWN0b3I8dF90eXBlZGVmKj46OmNvbnN0X2l0ZXJhdG9yIHRfaXRlcjsKLSAgZm9yICh0X2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0X2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdF9pdGVyKSB7Ci0gICAgdF90eXBlZGVmKiB0ZCA9ICp0X2l0ZXI7Ci0gICAgaWYgKHRkLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigidHlwZWRlZiAlczpcbiVzXG4iLCB0ZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0ZC0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9lbnVtKj4mIGVudW1zID0gcHJvZ3JhbS0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOwotICBmb3IgKGVfaXRlciA9IGVudW1zLmJlZ2luKCk7IGVfaXRlciAhPSBlbnVtcy5lbmQoKTsgKytlX2l0ZXIpIHsKLSAgICB0X2VudW0qIGVuID0gKmVfaXRlcjsKLSAgICBpZiAoZW4tPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJlbnVtICVzOlxuJXNcbiIsIGVuLT5nZXRfbmFtZSgpLmNfc3RyKCksIGVuLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X2NvbnN0Kj4mIGNvbnN0cyA9IHByb2dyYW0tPmdldF9jb25zdHMoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHRfY29uc3QqIGNvID0gKmNfaXRlcjsKLSAgICBpZiAoY28tPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJjb25zdCAlczpcbiVzXG4iLCBjby0+Z2V0X25hbWUoKS5jX3N0cigpLCBjby0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgc3RydWN0cyA9IHByb2dyYW0tPmdldF9zdHJ1Y3RzKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogc3QgPSAqc19pdGVyOwotICAgIGlmIChzdC0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInN0cnVjdCAlczpcbiVzXG4iLCBzdC0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdC0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgeGNlcHRpb25zID0gcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHRfc3RydWN0KiB4biA9ICp4X2l0ZXI7Ci0gICAgaWYgKHhuLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigieGNlcHRpb24gJXM6XG4lc1xuIiwgeG4tPmdldF9uYW1lKCkuY19zdHIoKSwgeG4tPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+JiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgZm9yICh2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyB2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgdF9zZXJ2aWNlKiBzdiA9ICp2X2l0ZXI7Ci0gICAgaWYgKHN2LT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50Zigic2VydmljZSAlczpcbiVzXG4iLCBzdi0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdi0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIENhbGwgZ2VuZXJhdGVfZmluZ2VycHJpbnQgZm9yIGV2ZXJ5IHN0cnVjdHVyZSBhbmQgZW51bS4KLSAqLwotdm9pZCBnZW5lcmF0ZV9hbGxfZmluZ2VycHJpbnRzKHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgc3RydWN0cyA9IHByb2dyYW0tPmdldF9zdHJ1Y3RzKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogc3QgPSAqc19pdGVyOwotICAgIHN0LT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHhjZXB0aW9ucyA9IHByb2dyYW0tPmdldF94Y2VwdGlvbnMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogc3QgPSAqeF9pdGVyOwotICAgIHN0LT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZW51bSo+JiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKLSAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7Ci0gICAgdF9lbnVtKiBlID0gKmVfaXRlcjsKLSAgICBlLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgZ190eXBlX3ZvaWQtPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0KLSAgLy8gSWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgZmluZ2VycHJpbnRzIGZvciBpbXBsaWNpdCBzdHJ1Y3R1cmVzLCBzdGFydCBoZXJlLgotICAvKgotICBjb25zdCB2ZWN0b3I8dF9zZXJ2aWNlKj4mIHNlcnZpY2VzID0gcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICBmb3IgKHZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICB0X3NlcnZpY2UqIHN2ID0gKnZfaXRlcjsKLSAgfQotICAqLwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIKLSAqLwotdm9pZCB2ZXJzaW9uKCkgewotICBwcmludGYoIlRocmlmdCB2ZXJzaW9uICVzXG4iLCBUSFJJRlRfVkVSU0lPTik7Ci19Ci0KLS8qKgotICogRGlwbGF5cyB0aGUgdXNhZ2UgbWVzc2FnZSBhbmQgdGhlbiBleGl0cyB3aXRoIGFuIGVycm9yIGNvZGUuCi0gKi8KLXZvaWQgdXNhZ2UoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcnNpb24gICAgUHJpbnQgdGhlIGNvbXBpbGVyIHZlcnNpb25cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW8gZGlyICAgICAgU2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBnZW4tKiBwYWNrYWdlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGN1cnJlbnQgZGlyZWN0b3J5KVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtSSBkaXIgICAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ub3dhcm4gICAgIFN1cHByZXNzIGFsbCBjb21waWxlciB3YXJuaW5ncyAoQkFEISlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXN0cmljdCAgICAgU3RyaWN0IGNvbXBpbGVyIHdhcm5pbmdzIG9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12W2VyYm9zZV0gIFZlcmJvc2UgbW9kZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcltlY3Vyc2VdICBBbHNvIGdlbmVyYXRlIGluY2x1ZGVkIGZpbGVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kZWJ1ZyAgICAgIFBhcnNlIGRlYnVnIHRyYWNlIHRvIHN0ZG91dFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtLWdlbiBTVFIgICBHZW5lcmF0ZSBjb2RlIHdpdGggYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIGdlbmVyYXRvci5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBTVFIgaGFzIHRoZSBmb3JtIGxhbmd1YWdlWzprZXkxPXZhbDFbLGtleTIsW2tleTM9dmFsM11dXS5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBLZXlzIGFuZCB2YWx1ZXMgYXJlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgTWFueSBvcHRpb25zIHdpbGwgbm90IHJlcXVpcmUgdmFsdWVzLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJBdmFpbGFibGUgZ2VuZXJhdG9ycyAoYW5kIG9wdGlvbnMpOlxuIik7Ci0KLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBnZW5fbWFwID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7Ci0gIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IGdlbl9tYXAuYmVnaW4oKTsgaXRlciAhPSBnZW5fbWFwLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgJXMgKCVzKTpcbiIsCi0gICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpLAotICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9sb25nX25hbWUoKS5jX3N0cigpKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlci0+c2Vjb25kLT5nZXRfZG9jdW1lbnRhdGlvbigpLmNfc3RyKCkpOwotICB9Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogWW91IGtub3csIHdoZW4gSSBzdGFydGVkIHdvcmtpbmcgb24gVGhyaWZ0IEkgcmVhbGx5IHRob3VnaHQgaXQgd2Fzbid0IGdvaW5nCi0gKiB0byBiZWNvbWUgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBiZWNhdXNlIGl0IHdhcyBqdXN0IGEgZ2VuZXJhdG9yIGFuZCBpdAotICogd291bGRuJ3QgbmVlZCBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYW5kIGFsbCB0aGF0IGphenouIEJ1dCB0aGVuIHdlCi0gKiBkZWNpZGVkIHRvIGFkZCBjb25zdGFudHMsIGFuZCBhbGwgb2YgYSBzdWRkZW4gdGhhdCBtZWFucyBydW50aW1lIHR5cGUKLSAqIHZhbGlkYXRpb24gYW5kIGluZmVyZW5jZSwgZXhjZXB0IHRoZSAicnVudGltZSIgaXMgdGhlIGNvZGUgZ2VuZXJhdG9yCi0gKiBydW50aW1lLgotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3JlYyhzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAidHlwZSBlcnJvcjogY2Fubm90IGRlY2xhcmUgYSB2b2lkIGNvbnN0OiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJpbmciOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJvb2wiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJ5dGUiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTE2IjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkzMiI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpNjQiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUiAmJgotICAgICAgICAgIHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRSkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZG91YmxlIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7Ci0gICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZW51bSI7Ci0gICAgfQotCi0gICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICgodF9lbnVtKil0eXBlKS0+Z2V0X2NvbnN0YW50cygpOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gdmFsdWUtPmdldF9pZGVudGlmaWVyKCkpIHsKLSAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0ICIgKyBuYW1lICsgIiB3YXMgZGVjbGFyZWQgYXMgdHlwZSAiIAotICAgICAgICArIHR5cGUtPmdldF9uYW1lKCkgKyAiIHdoaWNoIGlzIGFuIGVudW0sIGJ1dCAiIAotICAgICAgICArIHZhbHVlLT5nZXRfaWRlbnRpZmllcigpICsgIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVApIHsKLSAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJ1Y3QveGNlcHRpb24iOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAodl9pdGVyLT5maXJzdC0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBuYW1lICsgIiBzdHJ1Y3Qga2V5IG11c3QgYmUgc3RyaW5nIjsKLSAgICAgIH0KLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiLiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCksIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGtfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8a2V5PiIsIGtfdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8dmFsPiIsIHZfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGVfdHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBlX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8ZWxlbT4iLCBlX3R5cGUsICp2X2l0ZXIpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBwYXJzZWQgY29uc3QgaW5mb3JtYXRpb24gYWdhaW5zdCBpdHMgZGVjbGFyZWQgdHlwZQotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYykgewotICB2YWxpZGF0ZV9jb25zdF9yZWMoYy0+Z2V0X25hbWUoKSwgYy0+Z2V0X3R5cGUoKSwgYy0+Z2V0X3ZhbHVlKCkpOwotfQotCi0vKioKLSAqIENoZWNrIHRoZSB0eXBlIG9mIGEgZGVmYXVsdCB2YWx1ZSBhc3NpZ25lZCB0byBhIGZpZWxkLgotICovCi12b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdikgewotICB2YWxpZGF0ZV9jb25zdF9yZWMoZmllbGQtPmdldF9uYW1lKCksIGZpZWxkLT5nZXRfdHlwZSgpLCBjdik7Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgdGhyb3dzIGJsb2NrIGFyZSBhY3R1YWxseSBleGNlcHRpb25zLgotICovCi1ib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0aHJvd3MtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFBhcnNlcyBhIHByb2dyYW0KLSAqLwotdm9pZCBwYXJzZSh0X3Byb2dyYW0qIHByb2dyYW0sIHRfcHJvZ3JhbSogcGFyZW50X3Byb2dyYW0pIHsKLSAgLy8gR2V0IHNjb3BlIGZpbGUgcGF0aAotICBzdHJpbmcgcGF0aCA9IHByb2dyYW0tPmdldF9wYXRoKCk7Ci0KLSAgLy8gU2V0IGN1cnJlbnQgZGlyIGdsb2JhbCwgd2hpY2ggaXMgdXNlZCBpbiB0aGUgaW5jbHVkZV9maWxlIGZ1bmN0aW9uCi0gIGdfY3VyZGlyID0gZGlyZWN0b3J5X25hbWUocGF0aCk7Ci0gIGdfY3VycGF0aCA9IHBhdGg7Ci0KLSAgLy8gT3BlbiB0aGUgZmlsZQotICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOwotICBpZiAoeXlpbiA9PSAwKSB7Ci0gICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKLSAgfQotCi0gIC8vIENyZWF0ZSBuZXcgc2NvcGUgYW5kIHNjYW4gZm9yIGluY2x1ZGVzCi0gIHB2ZXJib3NlKCJTY2FubmluZyAlcyBmb3IgaW5jbHVkZXNcbiIsIHBhdGguY19zdHIoKSk7Ci0gIGdfcGFyc2VfbW9kZSA9IElOQ0xVREVTOwotICBnX3Byb2dyYW0gPSBwcm9ncmFtOwotICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKLSAgdHJ5IHsKLSAgICB5eWxpbmVubyA9IDE7Ci0gICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7Ci0gICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIGluY2x1ZGUgcGFzcy4iKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKHN0cmluZyB4KSB7Ci0gICAgZmFpbHVyZSh4LmNfc3RyKCkpOwotICB9Ci0gIGZjbG9zZSh5eWluKTsKLQotICAvLyBSZWN1cnNpdmVseSBwYXJzZSBhbGwgdGhlIGluY2x1ZGUgcHJvZ3JhbXMKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOwotICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraXRlcikgewotICAgIHBhcnNlKCppdGVyLCBwcm9ncmFtKTsKLSAgfQotCi0gIC8vIFBhcnNlIHRoZSBwcm9ncmFtIGZpbGUKLSAgZ19wYXJzZV9tb2RlID0gUFJPR1JBTTsKLSAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKLSAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7Ci0gIGdfcGFyZW50X3Njb3BlID0gKHBhcmVudF9wcm9ncmFtICE9IE5VTEwpID8gcGFyZW50X3Byb2dyYW0tPnNjb3BlKCkgOiBOVUxMOwotICBnX3BhcmVudF9wcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIi4iOwotICBnX2N1cnBhdGggPSBwYXRoOwotICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOwotICBpZiAoeXlpbiA9PSAwKSB7Ci0gICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKLSAgfQotICBwdmVyYm9zZSgiUGFyc2luZyAlcyBmb3IgdHlwZXNcbiIsIHBhdGguY19zdHIoKSk7Ci0gIHl5bGluZW5vID0gMTsKLSAgdHJ5IHsKLSAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKLSAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgdHlwZXMgcGFzcy4iKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKHN0cmluZyB4KSB7Ci0gICAgZmFpbHVyZSh4LmNfc3RyKCkpOwotICB9Ci0gIGZjbG9zZSh5eWluKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBjb2RlCi0gKi8KLXZvaWQgZ2VuZXJhdGUodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgZ2VuZXJhdG9yX3N0cmluZ3MpIHsKLSAgLy8gT29vb2hoLCByZWN1cnNpdmUgY29kZSBnZW5lcmF0aW9uLCBob3QhIQotICBpZiAoZ2VuX3JlY3Vyc2UpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgICAgLy8gUHJvcG9nYXRlIG91dHB1dCBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIHByb2dyYW1zCi0gICAgICBpbmNsdWRlc1tpXS0+c2V0X291dF9wYXRoKHByb2dyYW0tPmdldF9vdXRfcGF0aCgpKTsKLQotICAgICAgZ2VuZXJhdGUoaW5jbHVkZXNbaV0sIGdlbmVyYXRvcl9zdHJpbmdzKTsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb2RlIQotICB0cnkgewotICAgIHB2ZXJib3NlKCJQcm9ncmFtOiAlc1xuIiwgcHJvZ3JhbS0+Z2V0X3BhdGgoKS5jX3N0cigpKTsKLQotICAgIC8vIENvbXB1dGUgZmluZ2VycHJpbnRzLgotICAgIGdlbmVyYXRlX2FsbF9maW5nZXJwcmludHMocHJvZ3JhbSk7Ci0KLSAgICBpZiAoZHVtcF9kb2NzKSB7Ci0gICAgICBkdW1wX2RvY3N0cmluZ3MocHJvZ3JhbSk7Ci0gICAgfQotCi0gICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gZ2VuZXJhdG9yX3N0cmluZ3MuYmVnaW4oKTsgaXRlciAhPSBnZW5lcmF0b3Jfc3RyaW5ncy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICB0X2dlbmVyYXRvciogZ2VuZXJhdG9yID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgKml0ZXIpOwotCi0gICAgICBpZiAoZ2VuZXJhdG9yID09IE5VTEwpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIlVuYWJsZSB0byBnZXQgYSBnZW5lcmF0b3IgZm9yIFwiJXNcIi5cbiIsIGl0ZXItPmNfc3RyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHZlcmJvc2UoIkdlbmVyYXRpbmcgXCIlc1wiXG4iLCBpdGVyLT5jX3N0cigpKTsKLSAgICAgICAgZ2VuZXJhdG9yLT5nZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gICAgICAgIGRlbGV0ZSBnZW5lcmF0b3I7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgcHJpbnRmKCJFcnJvcjogJXNcbiIsIHMuY19zdHIoKSk7Ci0gIH0gY2F0Y2ggKGNvbnN0IGNoYXIqIGV4YykgewotICAgIHByaW50ZigiRXJyb3I6ICVzXG4iLCBleGMpOwotICB9Ci0KLX0KLQotLyoqCi0gKiBQYXJzZSBpdCB1cC4uIHRoZW4gc3BpdCBpdCBiYWNrIG91dCwgaW4gcHJldHR5IG11Y2ggZXZlcnkgbGFuZ3VhZ2UuIEFscmlnaHQKLSAqIG5vdCB0aGF0IG1hbnkgbGFuZ3VhZ2VzLCBidXQgdGhlIGNvb2wgb25lcyB0aGF0IHdlIGNhcmUgYWJvdXQuCi0gKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBpbnQgaTsKLSAgc3RkOjpzdHJpbmcgb3V0X3BhdGg7Ci0KLSAgLy8gU2V0dXAgdGltZSBzdHJpbmcKLSAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0gIGdfdGltZV9zdHIgPSBjdGltZSgmbm93KTsKLQotICAvLyBDaGVjayBmb3IgbmVjZXNzYXJ5IGFyZ3VtZW50cywgeW91IGdvdHRhIGhhdmUgYXQgbGVhc3QgYSBmaWxlbmFtZSBhbmQKLSAgLy8gYW4gb3V0cHV0IGxhbmd1YWdlIGZsYWcKLSAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIHZlY3RvcjxzdHJpbmc+IGdlbmVyYXRvcl9zdHJpbmdzOwotCi0gIC8vIFNldCB0aGUgY3VycmVudCBwYXRoIHRvIGEgZHVtbXkgdmFsdWUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCi0gIGdfY3VycGF0aCA9ICJhcmd1bWVudHMiOwotCi0gIC8vIEhhY2t5IHBhcmFtZXRlciBoYW5kbGluZy4uLiBJIGRpZG4ndCBmZWVsIGxpa2UgdXNpbmcgYSBsaWJyYXJ5IHNvcnJ5IQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYy0xOyBpKyspIHsKLSAgICBjaGFyKiBhcmc7Ci0KLSAgICBhcmcgPSBzdHJ0b2soYXJndltpXSwgIiAiKTsKLSAgICB3aGlsZSAoYXJnICE9IE5VTEwpIHsKLSAgICAgIC8vIFRyZWF0IGRvdWJsZSBkYXNoZXMgYXMgc2luZ2xlIGRhc2hlcwotICAgICAgaWYgKGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdID09ICctJykgewotICAgICAgICArK2FyZzsKLSAgICAgIH0KLQotICAgICAgaWYgKHN0cmNtcChhcmcsICItdmVyc2lvbiIpID09IDApIHsKLSAgICAgICAgdmVyc2lvbigpOwotICAgICAgICBleGl0KDEpOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWRlYnVnIikgPT0gMCkgewotICAgICAgICBnX2RlYnVnID0gMTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ub3dhcm4iKSA9PSAwKSB7Ci0gICAgICAgIGdfd2FybiA9IDA7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItc3RyaWN0IikgPT0gMCkgewotICAgICAgICBnX3N0cmljdCA9IDI1NTsKLSAgICAgICAgZ193YXJuID0gMjsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12IikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXZlcmJvc2UiKSA9PSAwICkgewotICAgICAgICBnX3ZlcmJvc2UgPSAxOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXIiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItcmVjdXJzZSIpID09IDAgKSB7Ci0gICAgICAgIGdlbl9yZWN1cnNlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1nZW4iKSA9PSAwKSB7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICIhISEgTWlzc2luZyBnZW5lcmF0b3Igc3BlY2lmaWNhdGlvblxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soYXJnKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1kZW5zZSIpID09IDApIHsKLSAgICAgICAgZ2VuX2RlbnNlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1jcHAiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9jcHAgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWphdmFiZWFuIikgPT0gMCkgewotICAgICAgICBnZW5famF2YWJlYW4gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWphdmEiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9qYXZhID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHAiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHAgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBocGkiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHBpID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBzIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3BocHMgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBocGwiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHAgPSB0cnVlOwotICAgICAgICBnZW5fcGhwcyA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBocGEiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHAgPSB0cnVlOwotICAgICAgICBnZW5fcGhwcyA9IGZhbHNlOwotICAgICAgICBnZW5fcGhwYSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcGhwbyIpID09IDApIHsKLSAgICAgICAgZ2VuX3BocCA9IHRydWU7Ci0gICAgICAgIGdlbl9waHBvID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yZXN0IikgPT0gMCkgewotICAgICAgICBnZW5fcmVzdCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcHkiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9weSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcHlucyIpID09IDApIHsKLSAgICAgICAgZ2VuX3B5ID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3B5X25ld3N0eWxlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yYiIpID09IDApIHsKLSAgICAgICAgZ2VuX3JiID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi14c2QiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl94c2QgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBlcmwiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9wZXJsID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1lcmwiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9lcmwgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLW9jYW1sIikgPT0gMCkgewotICAgICAgICBnZW5fb2NhbWwgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWhzIikgPT0gMCkgewotICAgICAgICBnZW5faHMgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWNvY29hIikgPT0gMCkgewotICAgICAgICBnZW5fY29jb2EgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXN0IikgPT0gMCkgewotICAgICAgICBnZW5fc3QgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWNzaGFycCIpID09IDApIHsKLSAgICAgICAgZ2VuX2NzaGFycCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItY3BwX3VzZV9pbmNsdWRlX3ByZWZpeCIpID09IDApIHsKLSAgICAgICAgZ19jcHBfdXNlX2luY2x1ZGVfcHJlZml4ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JIikgPT0gMCkgewotICAgICAgICAvLyBBbiBhcmd1bWVudCBvZiAiLUlcIGFzZGYiIGlzIGludmFsaWQgYW5kIGhhcyB1bmtub3duIHJlc3VsdHMKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotCi0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnlcbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKGFyZyk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItbyIpID09IDApIHsKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi1vOiBtaXNzaW5nIG91dHB1dCBkaXJlY3RvcnlcbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0X3BhdGggPSBhcmc7Ci0KLSNpZmRlZiBNSU5HVwotICAgICAgICAvL3N0cmlwIG91dCB0cmFpbGluZyBcIG9uIFdpbmRvd3MKLSAgICAgICAgaW50IGxhc3QgPSBvdXRfcGF0aC5sZW5ndGgoKS0xOwotICAgICAgICBpZiAob3V0X3BhdGhbbGFzdF0gPT0gJ1xcJykKLSAgICAgICAgewotICAgICAgICAgIG91dF9wYXRoLmVyYXNlKGxhc3QpOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKLSAgICAgICAgaWYgKHN0YXQob3V0X3BhdGguY19zdHIoKSwgJnNiKSA8IDApIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6ICVzXG4iLCBvdXRfcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoISBTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBvdXRfcGF0aC5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiISEhIFVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBhcmcpOwotICAgICAgICB1c2FnZSgpOwotICAgICAgfQotCi0gICAgICAvLyBUb2tlbml6ZSBtb3JlCi0gICAgICBhcmcgPSBzdHJ0b2soTlVMTCwgIiAiKTsKLSAgICB9Ci0gIH0KLQotICAvLyBpZiB5b3UncmUgYXNraW5nIGZvciB2ZXJzaW9uLCB5b3UgaGF2ZSBhIHJpZ2h0IG5vdCB0byBwYXNzIGEgZmlsZQotICBpZiAoc3RyY21wKGFyZ3ZbYXJnYy0xXSwgIi12ZXJzaW9uIikgPT0gMCkgewotICAgIHZlcnNpb24oKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBEZWxldGUgdGhlc2Ugd2hlbiBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuCi0gIGlmIChnZW5fY3BwKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1jcHAgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBjcHAiKTsKLSAgICBzdHJpbmcgZ2VuX3N0cmluZyA9ICJjcHA6IjsKLSAgICBpZiAoZ2VuX2RlbnNlKSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgiZGVuc2UsIik7Ci0gICAgfQotICAgIGlmIChnX2NwcF91c2VfaW5jbHVkZV9wcmVmaXgpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJpbmNsdWRlX3ByZWZpeCwiKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGdlbl9zdHJpbmcpOwotICB9Ci0gIGlmIChnZW5famF2YSkgewotICAgIHB3YXJuaW5nKDEsICItamF2YSBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGphdmEiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImphdmEiKTsKLSAgfQotICBpZiAoZ2VuX2phdmFiZWFuKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1qYXZhYmVhbiBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGphdmE6YmVhbnMiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImphdmE6YmVhbnMiKTsKLSAgfQotICBpZiAoZ2VuX2NzaGFycCkgewotICAgIHB3YXJuaW5nKDEsICItY3NoYXJwIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gY3NoYXJwIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJjc2hhcnAiKTsKLSAgfQotICBpZiAoZ2VuX3B5KSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1weSBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIHB5Iik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJweSIpOwotICB9Ci0gIGlmIChnZW5fcmIpIHsKLSAgICBwd2FybmluZygxLCAiLXJiIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gcmIiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soInJiIik7Ci0gIH0KLSAgaWYgKGdlbl9wZXJsKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1wZXJsIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gcGVybCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygicGVybCIpOwotICB9Ci0gIGlmIChnZW5fcGhwIHx8IGdlbl9waHBpKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1waHAgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBwaHAiKTsKLSAgICBzdHJpbmcgZ2VuX3N0cmluZyA9ICJwaHA6IjsKLSAgICBpZiAoZ2VuX3BocGkpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJpbmxpbmVkLCIpOwotICAgIH0gZWxzZSBpZihnZW5fcGhwcykgewotICAgICAgZ2VuX3N0cmluZy5hcHBlbmQoInNlcnZlciwiKTsKLSAgICB9IGVsc2UgaWYoZ2VuX3BocGEpIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJhdXRvbG9hZCwiKTsKLSAgICB9IGVsc2UgaWYoZ2VuX3BocG8pIHsKLSAgICAgIGdlbl9zdHJpbmcuYXBwZW5kKCJvb3AsIik7Ci0gICAgfSBlbHNlIGlmKGdlbl9yZXN0KSB7Ci0gICAgICBnZW5fc3RyaW5nLmFwcGVuZCgicmVzdCwiKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGdlbl9zdHJpbmcpOwotICB9Ci0gIGlmIChnZW5fY29jb2EpIHsKLSAgICBwd2FybmluZygxLCAiLWNvY29hIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gY29jb2EiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImNvY29hIik7Ci0gIH0KLSAgaWYgKGdlbl9lcmwpIHsKLSAgICBwd2FybmluZygxLCAiLWVybCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIGVybCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygiZXJsIik7Ci0gIH0KLSAgaWYgKGdlbl9zdCkgewotICAgIHB3YXJuaW5nKDEsICItc3QgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLWdlbiBzdCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygic3QiKTsKLSAgfQotICBpZiAoZ2VuX29jYW1sKSB7Ci0gICAgcHdhcm5pbmcoMSwgIi1vY2FtbCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIG9jYW1sIik7Ci0gICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKCJvY2FtbCIpOwotICB9Ci0gIGlmIChnZW5faHMpIHsKLSAgICBwd2FybmluZygxLCAiLWhzIGlzIGRlcHJlY2F0ZWQuICBVc2UgLS1nZW4gaHMiKTsKLSAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soImhzIik7Ci0gIH0KLSAgaWYgKGdlbl94c2QpIHsKLSAgICBwd2FybmluZygxLCAiLXhzZCBpcyBkZXByZWNhdGVkLiAgVXNlIC0tZ2VuIHhzZCIpOwotICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjaygieHNkIik7Ci0gIH0KLQotICAvLyBZb3UgZ290dGEgZ2VuZXJhdGUgc29tZXRoaW5nIQotICBpZiAoZ2VuZXJhdG9yX3N0cmluZ3MuZW1wdHkoKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE5vIG91dHB1dCBsYW5ndWFnZShzKSBzcGVjaWZpZWRcblxuIik7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIC8vIFJlYWwtcGF0aGlmeSBpdAotICBjaGFyIHJwW1BBVEhfTUFYXTsKLSAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiISEhIE1pc3NpbmcgZmlsZSBuYW1lXG4iKTsKLSAgICB1c2FnZSgpOwotICB9Ci0gIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgcnApID09IE5VTEwpIHsKLSAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7Ci0gIH0KLSAgc3RyaW5nIGlucHV0X2ZpbGUocnApOwotCi0gIC8vIEluc3RhbmNlIG9mIHRoZSBnbG9iYWwgcGFyc2UgdHJlZQotICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKGlucHV0X2ZpbGUpOwotICBpZiAob3V0X3BhdGguc2l6ZSgpKSB7Ci0gICAgcHJvZ3JhbS0+c2V0X291dF9wYXRoKG91dF9wYXRoKTsKLSAgfQotCi0gIC8vIENvbXB1dGUgdGhlIGNwcCBpbmNsdWRlIHByZWZpeC4KLSAgLy8gaW5mZXIgdGhpcyBmcm9tIHRoZSBmaWxlbmFtZSBwYXNzZWQgaW4KLSAgc3RyaW5nIGlucHV0X2ZpbGVuYW1lID0gYXJndltpXTsKLSAgc3RyaW5nIGluY2x1ZGVfcHJlZml4OwotCi0gIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7Ci0gIGlmICgobGFzdF9zbGFzaCA9IGlucHV0X2ZpbGVuYW1lLnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIGluY2x1ZGVfcHJlZml4ID0gaW5wdXRfZmlsZW5hbWUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOwotICB9Ci0KLSAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKLQotICAvLyBJbml0aWFsaXplIGdsb2JhbCB0eXBlcwotICBnX3R5cGVfdm9pZCAgID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgICB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKTsKLSAgZ190eXBlX3N0cmluZyA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgZ190eXBlX2JpbmFyeSA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgKCh0X2Jhc2VfdHlwZSopZ190eXBlX2JpbmFyeSktPnNldF9iaW5hcnkodHJ1ZSk7Ci0gIGdfdHlwZV9zbGlzdCAgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7Ci0gICgodF9iYXNlX3R5cGUqKWdfdHlwZV9zbGlzdCktPnNldF9zdHJpbmdfbGlzdCh0cnVlKTsKLSAgZ190eXBlX2Jvb2wgICA9IG5ldyB0X2Jhc2VfdHlwZSgiYm9vbCIsICAgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCk7Ci0gIGdfdHlwZV9ieXRlICAgPSBuZXcgdF9iYXNlX3R5cGUoImJ5dGUiLCAgIHRfYmFzZV90eXBlOjpUWVBFX0JZVEUpOwotICBnX3R5cGVfaTE2ICAgID0gbmV3IHRfYmFzZV90eXBlKCJpMTYiLCAgICB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpOwotICBnX3R5cGVfaTMyICAgID0gbmV3IHRfYmFzZV90eXBlKCJpMzIiLCAgICB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpOwotICBnX3R5cGVfaTY0ICAgID0gbmV3IHRfYmFzZV90eXBlKCJpNjQiLCAgICB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpOwotICBnX3R5cGVfZG91YmxlID0gbmV3IHRfYmFzZV90eXBlKCJkb3VibGUiLCB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOwotCi0gIC8vIFBhcnNlIGl0IQotICBwYXJzZShwcm9ncmFtLCBOVUxMKTsKLQotICAvLyBUaGUgY3VycmVudCBwYXRoIGlzIG5vdCByZWFsbHkgcmVsZXZhbnQgd2hlbiB3ZSBhcmUgZG9pbmcgZ2VuZXJhdGlvbi4KLSAgLy8gUmVzZXQgdGhlIHZhcmlhYmxlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgotICBnX2N1cnBhdGggPSAiZ2VuZXJhdGlvbiI7Ci0gIC8vIFJlc2V0IHl5bGluZW5vIGZvciB0aGUgaGVjayBvZiBpdC4gIFVzZSAxIGluc3RlYWQgb2YgMCBiZWNhdXNlCi0gIC8vIFRoYXQgaXMgd2hhdCBzaG93cyB1cCBkdXJpbmcgYXJndW1lbnQgcGFyc2luZy4KLSAgeXlsaW5lbm8gPSAxOwotCi0gIC8vIEdlbmVyYXRlIGl0IQotICBnZW5lcmF0ZShwcm9ncmFtLCBnZW5lcmF0b3Jfc3RyaW5ncyk7Ci0KLSAgLy8gQ2xlYW4gdXAuIFdobyBhbSBJIGtpZGRpbmcuLi4gdGhpcyBwcm9ncmFtIHByb2JhYmx5IG9ycGhhbnMgaGVhcCBtZW1vcnkKLSAgLy8gYWxsIG92ZXIgdGhlIHBsYWNlLCBidXQgd2hvIGNhcmVzIGJlY2F1c2UgaXQgaXMgYWJvdXQgdG8gZXhpdCBhbmQgaXQgaXMKLSAgLy8gYWxsIHJlZmVyZW5jZWQgYW5kIHVzZWQgYnkgdGhpcyB3YWNreSBwYXJzZSB0cmVlIHVwIHVudGlsIG5vdyBhbnl3YXlzLgotCi0gIGRlbGV0ZSBwcm9ncmFtOwotICBkZWxldGUgZ190eXBlX3ZvaWQ7Ci0gIGRlbGV0ZSBnX3R5cGVfc3RyaW5nOwotICBkZWxldGUgZ190eXBlX2Jvb2w7Ci0gIGRlbGV0ZSBnX3R5cGVfYnl0ZTsKLSAgZGVsZXRlIGdfdHlwZV9pMTY7Ci0gIGRlbGV0ZSBnX3R5cGVfaTMyOwotICBkZWxldGUgZ190eXBlX2k2NDsKLSAgZGVsZXRlIGdfdHlwZV9kb3VibGU7Ci0KLSAgLy8gRmluaXNoZWQKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL21haW4uaCBiL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjdkODJkLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX01BSU5fSAotI2RlZmluZSBUX01BSU5fSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInBhcnNlL3RfY29uc3QuaCIKLSNpbmNsdWRlICJwYXJzZS90X2ZpZWxkLmgiCi0KLS8qKgotICogRGVmaW5lZCBpbiB0aGUgZmxleCBsaWJyYXJ5Ci0gKi8KLQotaW50IHl5bGV4KHZvaWQpOwotCi1pbnQgeXlwYXJzZSh2b2lkKTsKLQotLyoqCi0gKiBFeHBlY3RlZCB0byBiZSBkZWZpbmVkIGJ5IEZsZXgvQmlzb24KLSAqLwotdm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBQYXJzZSBkZWJ1Z2dpbmcgb3V0cHV0LCB1c2VkIHRvIHByaW50IGhlbHBmdWwgaW5mbwotICovCi12b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogUGFyc2VyIHdhcm5pbmcKLSAqLwotdm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBGYWlsdXJlIQotICovCi12b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIENoZWNrIGNvbnN0YW50IHR5cGVzCi0gKi8KLXZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKTsKLQotLyoqCi0gKiBDaGVjayBjb25zdGFudCB0eXBlcwotICovCi12b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdik7Ci0KLS8qKgotICogQ2hlY2sgbWVtYmVycyBvZiBhIHRocm93cyBibG9jawotICovCi1ib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKTsKLQotLyoqCi0gKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQotICovCi1zdGQ6OnN0cmluZyBwcm9ncmFtX25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOwotCi0vKioKLSAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKLSAqLwotc3RkOjpzdHJpbmcgZGlyZWN0b3J5X25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOwotCi0vKioKLSAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgYW4gaW5jbHVkZSBmaWxlCi0gKi8KLXN0ZDo6c3RyaW5nIGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7Ci0KLS8qKgotICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KLSAqLwotdm9pZCBjbGVhcl9kb2N0ZXh0KCk7Ci0KLS8qKgotICogQ2xlYW5zIHVwIHRleHQgY29tbW9ubHkgZm91bmQgaW4gZG94eWdlbi1saWtlIGNvbW1lbnRzCi0gKi8KLWNoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCk7Ci0KLS8qKgotICogRmxleCB1dGlsaXRpZXMKLSAqLwotCi1leHRlcm4gaW50ICAgeXlsaW5lbm87Ci1leHRlcm4gY2hhciAgeXl0ZXh0W107Ci1leHRlcm4gRklMRSogeXlpbjsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL21kNS5jIGIvY29tcGlsZXIvY3BwL3NyYy9tZDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1ZDk2Yy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qCi0gIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KLS8qICRJZDogbWQ1LmMsdiAxLjYgMjAwMi8wNC8xMyAxOToyMDoyOCBscGQgRXhwICQgKi8KLS8qCi0gIEluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIE1ENSAoUkZDIDEzMjEpLgotCi0gIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBNRDUgQWxnb3JpdGhtIGRlZmluZWQgaW4gUkZDIDEzMjEsIHdob3NlCi0gIHRleHQgaXMgYXZhaWxhYmxlIGF0Ci0JaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTMyMS50eHQKLSAgVGhlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBSRkMsIGluY2x1ZGluZyB0aGUgdGVzdCBzdWl0ZQotICAoc2VjdGlvbiBBLjUpIGJ1dCBleGNsdWRpbmcgdGhlIHJlc3Qgb2YgQXBwZW5kaXggQS4gIEl0IGRvZXMgbm90IGluY2x1ZGUKLSAgYW55IGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGlkZW50aWZpZWQgaW4gdGhlIFJGQyBhcyBiZWluZwotICBjb3B5cmlnaHRlZC4KLQotICBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgbWQ1LmMgaXMgTC4gUGV0ZXIgRGV1dHNjaAotICA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5Ci0gIHRoYXQgZm9sbG93cyAoaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyKToKLQotICAyMDAyLTA0LTEzIGxwZCBDbGFyaWZpZWQgZGVyaXZhdGlvbiBmcm9tIFJGQyAxMzIxOyBub3cgaGFuZGxlcyBieXRlIG9yZGVyCi0JZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHk7IGFkZGVkIG1pc3NpbmcgI2luY2x1ZGUgPHN0cmluZy5oPgotCWluIGxpYnJhcnkuCi0gIDIwMDItMDMtMTEgbHBkIENvcnJlY3RlZCBhcmd1bWVudCBsaXN0IGZvciBtYWluKCksIGFuZCBhZGRlZCBpbnQgcmV0dXJuCi0JdHlwZSwgaW4gdGVzdCBwcm9ncmFtIGFuZCBUIHZhbHVlIHByb2dyYW0uCi0gIDIwMDItMDItMjEgbHBkIEFkZGVkIG1pc3NpbmcgI2luY2x1ZGUgPHN0ZGlvLmg+IGluIHRlc3QgcHJvZ3JhbS4KLSAgMjAwMC0wNy0wMyBscGQgUGF0Y2hlZCB0byBlbGltaW5hdGUgd2FybmluZ3MgYWJvdXQgImNvbnN0YW50IGlzCi0JdW5zaWduZWQgaW4gQU5TSSBDLCBzaWduZWQgaW4gdHJhZGl0aW9uYWwiOyBtYWRlIHRlc3QgcHJvZ3JhbQotCXNlbGYtY2hlY2tpbmcuCi0gIDE5OTktMTEtMDQgbHBkIEVkaXRlZCBjb21tZW50cyBzbGlnaHRseSBmb3IgYXV0b21hdGljIFRPQyBleHRyYWN0aW9uLgotICAxOTk5LTEwLTE4IGxwZCBGaXhlZCB0eXBvIGluIGhlYWRlciBjb21tZW50IChhbnNpMmtuciByYXRoZXIgdGhhbiBtZDUpLgotICAxOTk5LTA1LTAzIGxwZCBPcmlnaW5hbCB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlICJtZDUuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI3VuZGVmIEJZVEVfT1JERVIJLyogMSA9IGJpZy1lbmRpYW4sIC0xID0gbGl0dGxlLWVuZGlhbiwgMCA9IHVua25vd24gKi8KLSNpZmRlZiBBUkNIX0lTX0JJR19FTkRJQU4KLSMgIGRlZmluZSBCWVRFX09SREVSIChBUkNIX0lTX0JJR19FTkRJQU4gPyAxIDogLTEpCi0jZWxzZQotIyAgZGVmaW5lIEJZVEVfT1JERVIgMAotI2VuZGlmCi0KLSNkZWZpbmUgVF9NQVNLICgobWQ1X3dvcmRfdCl+MCkKLSNkZWZpbmUgVDEgLyogMHhkNzZhYTQ3OCAqLyAoVF9NQVNLIF4gMHgyODk1NWI4NykKLSNkZWZpbmUgVDIgLyogMHhlOGM3Yjc1NiAqLyAoVF9NQVNLIF4gMHgxNzM4NDhhOSkKLSNkZWZpbmUgVDMgICAgMHgyNDIwNzBkYgotI2RlZmluZSBUNCAvKiAweGMxYmRjZWVlICovIChUX01BU0sgXiAweDNlNDIzMTExKQotI2RlZmluZSBUNSAvKiAweGY1N2MwZmFmICovIChUX01BU0sgXiAweDBhODNmMDUwKQotI2RlZmluZSBUNiAgICAweDQ3ODdjNjJhCi0jZGVmaW5lIFQ3IC8qIDB4YTgzMDQ2MTMgKi8gKFRfTUFTSyBeIDB4NTdjZmI5ZWMpCi0jZGVmaW5lIFQ4IC8qIDB4ZmQ0Njk1MDEgKi8gKFRfTUFTSyBeIDB4MDJiOTZhZmUpCi0jZGVmaW5lIFQ5ICAgIDB4Njk4MDk4ZDgKLSNkZWZpbmUgVDEwIC8qIDB4OGI0NGY3YWYgKi8gKFRfTUFTSyBeIDB4NzRiYjA4NTApCi0jZGVmaW5lIFQxMSAvKiAweGZmZmY1YmIxICovIChUX01BU0sgXiAweDAwMDBhNDRlKQotI2RlZmluZSBUMTIgLyogMHg4OTVjZDdiZSAqLyAoVF9NQVNLIF4gMHg3NmEzMjg0MSkKLSNkZWZpbmUgVDEzICAgIDB4NmI5MDExMjIKLSNkZWZpbmUgVDE0IC8qIDB4ZmQ5ODcxOTMgKi8gKFRfTUFTSyBeIDB4MDI2NzhlNmMpCi0jZGVmaW5lIFQxNSAvKiAweGE2Nzk0MzhlICovIChUX01BU0sgXiAweDU5ODZiYzcxKQotI2RlZmluZSBUMTYgICAgMHg0OWI0MDgyMQotI2RlZmluZSBUMTcgLyogMHhmNjFlMjU2MiAqLyAoVF9NQVNLIF4gMHgwOWUxZGE5ZCkKLSNkZWZpbmUgVDE4IC8qIDB4YzA0MGIzNDAgKi8gKFRfTUFTSyBeIDB4M2ZiZjRjYmYpCi0jZGVmaW5lIFQxOSAgICAweDI2NWU1YTUxCi0jZGVmaW5lIFQyMCAvKiAweGU5YjZjN2FhICovIChUX01BU0sgXiAweDE2NDkzODU1KQotI2RlZmluZSBUMjEgLyogMHhkNjJmMTA1ZCAqLyAoVF9NQVNLIF4gMHgyOWQwZWZhMikKLSNkZWZpbmUgVDIyICAgIDB4MDI0NDE0NTMKLSNkZWZpbmUgVDIzIC8qIDB4ZDhhMWU2ODEgKi8gKFRfTUFTSyBeIDB4Mjc1ZTE5N2UpCi0jZGVmaW5lIFQyNCAvKiAweGU3ZDNmYmM4ICovIChUX01BU0sgXiAweDE4MmMwNDM3KQotI2RlZmluZSBUMjUgICAgMHgyMWUxY2RlNgotI2RlZmluZSBUMjYgLyogMHhjMzM3MDdkNiAqLyAoVF9NQVNLIF4gMHgzY2M4ZjgyOSkKLSNkZWZpbmUgVDI3IC8qIDB4ZjRkNTBkODcgKi8gKFRfTUFTSyBeIDB4MGIyYWYyNzgpCi0jZGVmaW5lIFQyOCAgICAweDQ1NWExNGVkCi0jZGVmaW5lIFQyOSAvKiAweGE5ZTNlOTA1ICovIChUX01BU0sgXiAweDU2MWMxNmZhKQotI2RlZmluZSBUMzAgLyogMHhmY2VmYTNmOCAqLyAoVF9NQVNLIF4gMHgwMzEwNWMwNykKLSNkZWZpbmUgVDMxICAgIDB4Njc2ZjAyZDkKLSNkZWZpbmUgVDMyIC8qIDB4OGQyYTRjOGEgKi8gKFRfTUFTSyBeIDB4NzJkNWIzNzUpCi0jZGVmaW5lIFQzMyAvKiAweGZmZmEzOTQyICovIChUX01BU0sgXiAweDAwMDVjNmJkKQotI2RlZmluZSBUMzQgLyogMHg4NzcxZjY4MSAqLyAoVF9NQVNLIF4gMHg3ODhlMDk3ZSkKLSNkZWZpbmUgVDM1ICAgIDB4NmQ5ZDYxMjIKLSNkZWZpbmUgVDM2IC8qIDB4ZmRlNTM4MGMgKi8gKFRfTUFTSyBeIDB4MDIxYWM3ZjMpCi0jZGVmaW5lIFQzNyAvKiAweGE0YmVlYTQ0ICovIChUX01BU0sgXiAweDViNDExNWJiKQotI2RlZmluZSBUMzggICAgMHg0YmRlY2ZhOQotI2RlZmluZSBUMzkgLyogMHhmNmJiNGI2MCAqLyAoVF9NQVNLIF4gMHgwOTQ0YjQ5ZikKLSNkZWZpbmUgVDQwIC8qIDB4YmViZmJjNzAgKi8gKFRfTUFTSyBeIDB4NDE0MDQzOGYpCi0jZGVmaW5lIFQ0MSAgICAweDI4OWI3ZWM2Ci0jZGVmaW5lIFQ0MiAvKiAweGVhYTEyN2ZhICovIChUX01BU0sgXiAweDE1NWVkODA1KQotI2RlZmluZSBUNDMgLyogMHhkNGVmMzA4NSAqLyAoVF9NQVNLIF4gMHgyYjEwY2Y3YSkKLSNkZWZpbmUgVDQ0ICAgIDB4MDQ4ODFkMDUKLSNkZWZpbmUgVDQ1IC8qIDB4ZDlkNGQwMzkgKi8gKFRfTUFTSyBeIDB4MjYyYjJmYzYpCi0jZGVmaW5lIFQ0NiAvKiAweGU2ZGI5OWU1ICovIChUX01BU0sgXiAweDE5MjQ2NjFhKQotI2RlZmluZSBUNDcgICAgMHgxZmEyN2NmOAotI2RlZmluZSBUNDggLyogMHhjNGFjNTY2NSAqLyAoVF9NQVNLIF4gMHgzYjUzYTk5YSkKLSNkZWZpbmUgVDQ5IC8qIDB4ZjQyOTIyNDQgKi8gKFRfTUFTSyBeIDB4MGJkNmRkYmIpCi0jZGVmaW5lIFQ1MCAgICAweDQzMmFmZjk3Ci0jZGVmaW5lIFQ1MSAvKiAweGFiOTQyM2E3ICovIChUX01BU0sgXiAweDU0NmJkYzU4KQotI2RlZmluZSBUNTIgLyogMHhmYzkzYTAzOSAqLyAoVF9NQVNLIF4gMHgwMzZjNWZjNikKLSNkZWZpbmUgVDUzICAgIDB4NjU1YjU5YzMKLSNkZWZpbmUgVDU0IC8qIDB4OGYwY2NjOTIgKi8gKFRfTUFTSyBeIDB4NzBmMzMzNmQpCi0jZGVmaW5lIFQ1NSAvKiAweGZmZWZmNDdkICovIChUX01BU0sgXiAweDAwMTAwYjgyKQotI2RlZmluZSBUNTYgLyogMHg4NTg0NWRkMSAqLyAoVF9NQVNLIF4gMHg3YTdiYTIyZSkKLSNkZWZpbmUgVDU3ICAgIDB4NmZhODdlNGYKLSNkZWZpbmUgVDU4IC8qIDB4ZmUyY2U2ZTAgKi8gKFRfTUFTSyBeIDB4MDFkMzE5MWYpCi0jZGVmaW5lIFQ1OSAvKiAweGEzMDE0MzE0ICovIChUX01BU0sgXiAweDVjZmViY2ViKQotI2RlZmluZSBUNjAgICAgMHg0ZTA4MTFhMQotI2RlZmluZSBUNjEgLyogMHhmNzUzN2U4MiAqLyAoVF9NQVNLIF4gMHgwOGFjODE3ZCkKLSNkZWZpbmUgVDYyIC8qIDB4YmQzYWYyMzUgKi8gKFRfTUFTSyBeIDB4NDJjNTBkY2EpCi0jZGVmaW5lIFQ2MyAgICAweDJhZDdkMmJiCi0jZGVmaW5lIFQ2NCAvKiAweGViODZkMzkxICovIChUX01BU0sgXiAweDE0NzkyYzZlKQotCi0KLXN0YXRpYyB2b2lkCi1tZDVfcHJvY2VzcyhtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhIC8qWzY0XSovKQotewotICAgIG1kNV93b3JkX3QKLQlhID0gcG1zLT5hYmNkWzBdLCBiID0gcG1zLT5hYmNkWzFdLAotCWMgPSBwbXMtPmFiY2RbMl0sIGQgPSBwbXMtPmFiY2RbM107Ci0gICAgbWQ1X3dvcmRfdCB0OwotI2lmIEJZVEVfT1JERVIgPiAwCi0gICAgLyogRGVmaW5lIHN0b3JhZ2Ugb25seSBmb3IgYmlnLWVuZGlhbiBDUFVzLiAqLwotICAgIG1kNV93b3JkX3QgWFsxNl07Ci0jZWxzZQotICAgIC8qIERlZmluZSBzdG9yYWdlIGZvciBsaXR0bGUtZW5kaWFuIG9yIGJvdGggdHlwZXMgb2YgQ1BVcy4gKi8KLSAgICBtZDVfd29yZF90IHhidWZbMTZdOwotICAgIGNvbnN0IG1kNV93b3JkX3QgKlg7Ci0jZW5kaWYKLQotICAgIHsKLSNpZiBCWVRFX09SREVSID09IDAKLQkvKgotCSAqIERldGVybWluZSBkeW5hbWljYWxseSB3aGV0aGVyIHRoaXMgaXMgYSBiaWctZW5kaWFuIG9yCi0JICogbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBzaW5jZSB3ZSBjYW4gdXNlIGEgbW9yZSBlZmZpY2llbnQKLQkgKiBhbGdvcml0aG0gb24gdGhlIGxhdHRlci4KLQkgKi8KLQlzdGF0aWMgY29uc3QgaW50IHcgPSAxOwotCi0JaWYgKCooKGNvbnN0IG1kNV9ieXRlX3QgKikmdykpIC8qIGR5bmFtaWMgbGl0dGxlLWVuZGlhbiAqLwotI2VuZGlmCi0jaWYgQllURV9PUkRFUiA8PSAwCQkvKiBsaXR0bGUtZW5kaWFuICovCi0JewotCSAgICAvKgotCSAgICAgKiBPbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCB3ZSBjYW4gcHJvY2VzcyBwcm9wZXJseSBhbGlnbmVkCi0JICAgICAqIGRhdGEgd2l0aG91dCBjb3B5aW5nIGl0LgotCSAgICAgKi8KLQkgICAgaWYgKCEoKGRhdGEgLSAoY29uc3QgbWQ1X2J5dGVfdCAqKTApICYgMykpIHsKLQkJLyogZGF0YSBhcmUgcHJvcGVybHkgYWxpZ25lZCAqLwotCQlYID0gKGNvbnN0IG1kNV93b3JkX3QgKilkYXRhOwotCSAgICB9IGVsc2UgewotCQkvKiBub3QgYWxpZ25lZCAqLwotCQltZW1jcHkoeGJ1ZiwgZGF0YSwgNjQpOwotCQlYID0geGJ1ZjsKLQkgICAgfQotCX0KLSNlbmRpZgotI2lmIEJZVEVfT1JERVIgPT0gMAotCWVsc2UJCQkvKiBkeW5hbWljIGJpZy1lbmRpYW4gKi8KLSNlbmRpZgotI2lmIEJZVEVfT1JERVIgPj0gMAkJLyogYmlnLWVuZGlhbiAqLwotCXsKLQkgICAgLyoKLQkgICAgICogT24gYmlnLWVuZGlhbiBtYWNoaW5lcywgd2UgbXVzdCBhcnJhbmdlIHRoZSBieXRlcyBpbiB0aGUKLQkgICAgICogcmlnaHQgb3JkZXIuCi0JICAgICAqLwotCSAgICBjb25zdCBtZDVfYnl0ZV90ICp4cCA9IGRhdGE7Ci0JICAgIGludCBpOwotCi0jICBpZiBCWVRFX09SREVSID09IDAKLQkgICAgWCA9IHhidWY7CQkvKiAoZHluYW1pYyBvbmx5KSAqLwotIyAgZWxzZQotIyAgICBkZWZpbmUgeGJ1ZiBYCQkvKiAoc3RhdGljIG9ubHkpICovCi0jICBlbmRpZgotCSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSwgeHAgKz0gNCkKLQkJeGJ1ZltpXSA9IHhwWzBdICsgKHhwWzFdIDw8IDgpICsgKHhwWzJdIDw8IDE2KSArICh4cFszXSA8PCAyNCk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0jZGVmaW5lIFJPVEFURV9MRUZUKHgsIG4pICgoKHgpIDw8IChuKSkgfCAoKHgpID4+ICgzMiAtIChuKSkpKQotCi0gICAgLyogUm91bmQgMS4gKi8KLSAgICAvKiBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgYSA9IGIgKyAoKGEgKyBGKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEYoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKH4oeCkgJiAoeikpKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEYoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDAsICA3LCAgVDEpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMSwgMTIsICBUMik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAyLCAxNywgIFQzKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDMsIDIyLCAgVDQpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgNCwgIDcsICBUNSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA1LCAxMiwgIFQ2KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDYsIDE3LCAgVDcpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgNywgMjIsICBUOCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA4LCAgNywgIFQ5KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDksIDEyLCBUMTApOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMCwgMTcsIFQxMSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDExLCAyMiwgVDEyKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTIsICA3LCBUMTMpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMywgMTIsIFQxNCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE0LCAxNywgVDE1KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTUsIDIyLCBUMTYpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFJvdW5kIDIuICovCi0gICAgIC8qIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICBhID0gYiArICgoYSArIEcoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KLSNkZWZpbmUgRyh4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgfih6KSkpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgRyhiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDEsICA1LCBUMTcpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNiwgIDksIFQxOCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDExLCAxNCwgVDE5KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDAsIDIwLCBUMjApOwotICAgIFNFVChhLCBiLCBjLCBkLCAgNSwgIDUsIFQyMSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDEwLCAgOSwgVDIyKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTUsIDE0LCBUMjMpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgNCwgMjAsIFQyNCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA5LCAgNSwgVDI1KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTQsICA5LCBUMjYpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMywgMTQsIFQyNyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA4LCAyMCwgVDI4KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTMsICA1LCBUMjkpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMiwgIDksIFQzMCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA3LCAxNCwgVDMxKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTIsIDIwLCBUMzIpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFJvdW5kIDMuICovCi0gICAgIC8qIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICBhID0gYiArICgoYSArIEgoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KLSNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEgoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICA1LCAgNCwgVDMzKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDgsIDExLCBUMzQpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMSwgMTYsIFQzNSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsIDE0LCAyMywgVDM2KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDEsICA0LCBUMzcpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgNCwgMTEsIFQzOCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA3LCAxNiwgVDM5KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTAsIDIzLCBUNDApOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMywgIDQsIFQ0MSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAwLCAxMSwgVDQyKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDMsIDE2LCBUNDMpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgNiwgMjMsIFQ0NCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA5LCAgNCwgVDQ1KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTIsIDExLCBUNDYpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNSwgMTYsIFQ0Nyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAyLCAyMywgVDQ4KTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBSb3VuZCA0LiAqLwotICAgICAvKiBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgYSA9IGIgKyAoKGEgKyBJKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykuICovCi0jZGVmaW5lIEkoeCwgeSwgeikgKCh5KSBeICgoeCkgfCB+KHopKSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBJKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgMCwgIDYsIFQ0OSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA3LCAxMCwgVDUwKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTQsIDE1LCBUNTEpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgNSwgMjEsIFQ1Mik7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEyLCAgNiwgVDUzKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDMsIDEwLCBUNTQpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxMCwgMTUsIFQ1NSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICAxLCAyMSwgVDU2KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDgsICA2LCBUNTcpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxNSwgMTAsIFQ1OCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICA2LCAxNSwgVDU5KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTMsIDIxLCBUNjApOwotICAgIFNFVChhLCBiLCBjLCBkLCAgNCwgIDYsIFQ2MSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDExLCAxMCwgVDYyKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDIsIDE1LCBUNjMpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgOSwgMjEsIFQ2NCk7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogVGhlbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zLiAoVGhhdCBpcyBpbmNyZW1lbnQgZWFjaAotICAgICAgICBvZiB0aGUgZm91ciByZWdpc3RlcnMgYnkgdGhlIHZhbHVlIGl0IGhhZCBiZWZvcmUgdGhpcyBibG9jawotICAgICAgICB3YXMgc3RhcnRlZC4pICovCi0gICAgcG1zLT5hYmNkWzBdICs9IGE7Ci0gICAgcG1zLT5hYmNkWzFdICs9IGI7Ci0gICAgcG1zLT5hYmNkWzJdICs9IGM7Ci0gICAgcG1zLT5hYmNkWzNdICs9IGQ7Ci19Ci0KLXZvaWQKLW1kNV9pbml0KG1kNV9zdGF0ZV90ICpwbXMpCi17Ci0gICAgcG1zLT5jb3VudFswXSA9IHBtcy0+Y291bnRbMV0gPSAwOwotICAgIHBtcy0+YWJjZFswXSA9IDB4Njc0NTIzMDE7Ci0gICAgcG1zLT5hYmNkWzFdID0gLyoweGVmY2RhYjg5Ki8gVF9NQVNLIF4gMHgxMDMyNTQ3NjsKLSAgICBwbXMtPmFiY2RbMl0gPSAvKjB4OThiYWRjZmUqLyBUX01BU0sgXiAweDY3NDUyMzAxOwotICAgIHBtcy0+YWJjZFszXSA9IDB4MTAzMjU0NzY7Ci19Ci0KLXZvaWQKLW1kNV9hcHBlbmQobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSwgaW50IG5ieXRlcykKLXsKLSAgICBjb25zdCBtZDVfYnl0ZV90ICpwID0gZGF0YTsKLSAgICBpbnQgbGVmdCA9IG5ieXRlczsKLSAgICBpbnQgb2Zmc2V0ID0gKHBtcy0+Y291bnRbMF0gPj4gMykgJiA2MzsKLSAgICBtZDVfd29yZF90IG5iaXRzID0gKG1kNV93b3JkX3QpKG5ieXRlcyA8PCAzKTsKLQotICAgIGlmIChuYnl0ZXMgPD0gMCkKLQlyZXR1cm47Ci0KLSAgICAvKiBVcGRhdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoLiAqLwotICAgIHBtcy0+Y291bnRbMV0gKz0gbmJ5dGVzID4+IDI5OwotICAgIHBtcy0+Y291bnRbMF0gKz0gbmJpdHM7Ci0gICAgaWYgKHBtcy0+Y291bnRbMF0gPCBuYml0cykKLQlwbXMtPmNvdW50WzFdKys7Ci0KLSAgICAvKiBQcm9jZXNzIGFuIGluaXRpYWwgcGFydGlhbCBibG9jay4gKi8KLSAgICBpZiAob2Zmc2V0KSB7Ci0JaW50IGNvcHkgPSAob2Zmc2V0ICsgbmJ5dGVzID4gNjQgPyA2NCAtIG9mZnNldCA6IG5ieXRlcyk7Ci0KLQltZW1jcHkocG1zLT5idWYgKyBvZmZzZXQsIHAsIGNvcHkpOwotCWlmIChvZmZzZXQgKyBjb3B5IDwgNjQpCi0JICAgIHJldHVybjsKLQlwICs9IGNvcHk7Ci0JbGVmdCAtPSBjb3B5OwotCW1kNV9wcm9jZXNzKHBtcywgcG1zLT5idWYpOwotICAgIH0KLQotICAgIC8qIFByb2Nlc3MgZnVsbCBibG9ja3MuICovCi0gICAgZm9yICg7IGxlZnQgPj0gNjQ7IHAgKz0gNjQsIGxlZnQgLT0gNjQpCi0JbWQ1X3Byb2Nlc3MocG1zLCBwKTsKLQotICAgIC8qIFByb2Nlc3MgYSBmaW5hbCBwYXJ0aWFsIGJsb2NrLiAqLwotICAgIGlmIChsZWZ0KQotCW1lbWNweShwbXMtPmJ1ZiwgcCwgbGVmdCk7Ci19Ci0KLXZvaWQKLW1kNV9maW5pc2gobWQ1X3N0YXRlX3QgKnBtcywgbWQ1X2J5dGVfdCBkaWdlc3RbMTZdKQotewotICAgIHN0YXRpYyBjb25zdCBtZDVfYnl0ZV90IHBhZFs2NF0gPSB7Ci0JMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotICAgIH07Ci0gICAgbWQ1X2J5dGVfdCBkYXRhWzhdOwotICAgIGludCBpOwotCi0gICAgLyogU2F2ZSB0aGUgbGVuZ3RoIGJlZm9yZSBwYWRkaW5nLiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCi0JZGF0YVtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmNvdW50W2kgPj4gMl0gPj4gKChpICYgMykgPDwgMykpOwotICAgIC8qIFBhZCB0byA1NiBieXRlcyBtb2QgNjQuICovCi0gICAgbWQ1X2FwcGVuZChwbXMsIHBhZCwgKCg1NSAtIChwbXMtPmNvdW50WzBdID4+IDMpKSAmIDYzKSArIDEpOwotICAgIC8qIEFwcGVuZCB0aGUgbGVuZ3RoLiAqLwotICAgIG1kNV9hcHBlbmQocG1zLCBkYXRhLCA4KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkKLQlkaWdlc3RbaV0gPSAobWQ1X2J5dGVfdCkocG1zLT5hYmNkW2kgPj4gMl0gPj4gKChpICYgMykgPDwgMykpOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OGM5OTUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tZDUuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KLS8qICRJZDogbWQ1LmgsdiAxLjQgMjAwMi8wNC8xMyAxOToyMDoyOCBscGQgRXhwICQgKi8KLS8qCi0gIEluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIE1ENSAoUkZDIDEzMjEpLgotCi0gIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBNRDUgQWxnb3JpdGhtIGRlZmluZWQgaW4gUkZDIDEzMjEsIHdob3NlCi0gIHRleHQgaXMgYXZhaWxhYmxlIGF0Ci0JaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTMyMS50eHQKLSAgVGhlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBSRkMsIGluY2x1ZGluZyB0aGUgdGVzdCBzdWl0ZQotICAoc2VjdGlvbiBBLjUpIGJ1dCBleGNsdWRpbmcgdGhlIHJlc3Qgb2YgQXBwZW5kaXggQS4gIEl0IGRvZXMgbm90IGluY2x1ZGUKLSAgYW55IGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGlkZW50aWZpZWQgaW4gdGhlIFJGQyBhcyBiZWluZwotICBjb3B5cmlnaHRlZC4KLQotICBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgbWQ1LmggaXMgTC4gUGV0ZXIgRGV1dHNjaAotICA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5Ci0gIHRoYXQgZm9sbG93cyAoaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyKToKLQotICAyMDAyLTA0LTEzIGxwZCBSZW1vdmVkIHN1cHBvcnQgZm9yIG5vbi1BTlNJIGNvbXBpbGVyczsgcmVtb3ZlZAotCXJlZmVyZW5jZXMgdG8gR2hvc3RzY3JpcHQ7IGNsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7Ci0Jbm93IGhhbmRsZXMgYnl0ZSBvcmRlciBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseS4KLSAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCi0gIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSk7Ci0JYWRkZWQgY29uZGl0aW9uYWxpemF0aW9uIGZvciBDKysgY29tcGlsYXRpb24gZnJvbSBNYXJ0aW4KLQlQdXJzY2hrZSA8cHVyc2Noa2VAYm5sLmdvdj4uCi0gIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBtZDVfSU5DTFVERUQKLSMgIGRlZmluZSBtZDVfSU5DTFVERUQKLQotLyoKLSAqIFRoaXMgcGFja2FnZSBzdXBwb3J0cyBib3RoIGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUgZGV0ZXJtaW5hdGlvbiBvZiBDUFUKLSAqIGJ5dGUgb3JkZXIuICBJZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgZGVmaW5lZCBhcyAwLCB0aGUgY29kZSB3aWxsIGJlCi0gKiBjb21waWxlZCB0byBydW4gb25seSBvbiBsaXR0bGUtZW5kaWFuIENQVXM7IGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcwotICogZGVmaW5lZCBhcyBub24temVybywgdGhlIGNvZGUgd2lsbCBiZSBjb21waWxlZCB0byBydW4gb25seSBvbiBiaWctZW5kaWFuCi0gKiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgbm90IGRlZmluZWQsIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8KLSAqIHJ1biBvbiBlaXRoZXIgYmlnLSBvciBsaXR0bGUtZW5kaWFuIENQVXMsIGJ1dCB3aWxsIHJ1biBzbGlnaHRseSBsZXNzCi0gKiBlZmZpY2llbnRseSBvbiBlaXRoZXIgb25lIHRoYW4gaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQuCi0gKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIG1kNV9ieXRlX3Q7IC8qIDgtYml0IGJ5dGUgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IG1kNV93b3JkX3Q7IC8qIDMyLWJpdCB3b3JkICovCi0KLS8qIERlZmluZSB0aGUgc3RhdGUgb2YgdGhlIE1ENSBBbGdvcml0aG0uICovCi10eXBlZGVmIHN0cnVjdCBtZDVfc3RhdGVfcyB7Ci0gICAgbWQ1X3dvcmRfdCBjb3VudFsyXTsJLyogbWVzc2FnZSBsZW5ndGggaW4gYml0cywgbHN3IGZpcnN0ICovCi0gICAgbWQ1X3dvcmRfdCBhYmNkWzRdOwkJLyogZGlnZXN0IGJ1ZmZlciAqLwotICAgIG1kNV9ieXRlX3QgYnVmWzY0XTsJCS8qIGFjY3VtdWxhdGUgYmxvY2sgKi8KLX0gbWQ1X3N0YXRlX3Q7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiAKLXsKLSNlbmRpZgotCi0vKiBJbml0aWFsaXplIHRoZSBhbGdvcml0aG0uICovCi12b2lkIG1kNV9pbml0KG1kNV9zdGF0ZV90ICpwbXMpOwotCi0vKiBBcHBlbmQgYSBzdHJpbmcgdG8gdGhlIG1lc3NhZ2UuICovCi12b2lkIG1kNV9hcHBlbmQobWQ1X3N0YXRlX3QgKnBtcywgY29uc3QgbWQ1X2J5dGVfdCAqZGF0YSwgaW50IG5ieXRlcyk7Ci0KLS8qIEZpbmlzaCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBkaWdlc3QuICovCi12b2lkIG1kNV9maW5pc2gobWQ1X3N0YXRlX3QgKnBtcywgbWQ1X2J5dGVfdCBkaWdlc3RbMTZdKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvKiBlbmQgZXh0ZXJuICJDIiAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBtZDVfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9iYXNlX3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9iYXNlX3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1MWRmOS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfYmFzZV90eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQkFTRV9UWVBFX0gKLSNkZWZpbmUgVF9CQVNFX1RZUEVfSAotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLQotLyoqCi0gKiBBIHRocmlmdCBiYXNlIHR5cGUsIHdoaWNoIG11c3QgYmUgb25lIG9mIHRoZSBkZWZpbmVkIGVudW1lcmF0ZWQgdHlwZXMgaW5zaWRlCi0gKiB0aGlzIGRlZmluaXRpb24uCi0gKgotICovCi1jbGFzcyB0X2Jhc2VfdHlwZSA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIEVudW1lcmF0aW9uIG9mIHRocmlmdCBiYXNlIHR5cGVzCi0gICAqLwotICBlbnVtIHRfYmFzZSB7Ci0gICAgVFlQRV9WT0lELAotICAgIFRZUEVfU1RSSU5HLAotICAgIFRZUEVfQk9PTCwKLSAgICBUWVBFX0JZVEUsCi0gICAgVFlQRV9JMTYsCi0gICAgVFlQRV9JMzIsCi0gICAgVFlQRV9JNjQsCi0gICAgVFlQRV9ET1VCTEUKLSAgfTsKLQotICB0X2Jhc2VfdHlwZShzdGQ6OnN0cmluZyBuYW1lLCB0X2Jhc2UgYmFzZSkgOgotICAgIHRfdHlwZShuYW1lKSwKLSAgICBiYXNlXyhiYXNlKSwKLSAgICBzdHJpbmdfbGlzdF8oZmFsc2UpLAotICAgIGJpbmFyeV8oZmFsc2UpLAotICAgIHN0cmluZ19lbnVtXyhmYWxzZSl7fQotCi0gIHRfYmFzZSBnZXRfYmFzZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV87Ci0gIH0KLQotICBib29sIGlzX3ZvaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfID09IFRZUEVfVk9JRDsKLSAgfQotCi0gIGJvb2wgaXNfc3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlXyA9PSBUWVBFX1NUUklORzsKLSAgfQotCi0gIGJvb2wgaXNfYm9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV8gPT0gVFlQRV9CT09MOwotICB9Ci0KLSAgdm9pZCBzZXRfc3RyaW5nX2xpc3QoYm9vbCB2YWwpIHsKLSAgICBzdHJpbmdfbGlzdF8gPSB2YWw7Ci0gIH0KLQotICBib29sIGlzX3N0cmluZ19saXN0KCkgY29uc3QgewotICAgIHJldHVybiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpICYmIHN0cmluZ19saXN0XzsKLSAgfQotCi0gIHZvaWQgc2V0X2JpbmFyeShib29sIHZhbCkgewotICAgIGJpbmFyeV8gPSB2YWw7Ci0gIH0KLQotICBib29sIGlzX2JpbmFyeSgpIGNvbnN0IHsKLSAgICByZXR1cm4gKGJhc2VfID09IFRZUEVfU1RSSU5HKSAmJiBiaW5hcnlfOwotICB9Ci0KLSAgdm9pZCBzZXRfc3RyaW5nX2VudW0oYm9vbCB2YWwpIHsKLSAgICBzdHJpbmdfZW51bV8gPSB0cnVlOwotICB9Ci0KLSAgYm9vbCBpc19zdHJpbmdfZW51bSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV8gPT0gVFlQRV9TVFJJTkcgJiYgc3RyaW5nX2VudW1fOwotICB9Ci0KLSAgdm9pZCBhZGRfc3RyaW5nX2VudW1fdmFsKHN0ZDo6c3RyaW5nIHZhbCkgewotICAgIHN0cmluZ19lbnVtX3ZhbHNfLnB1c2hfYmFjayh2YWwpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfc3RyaW5nX2VudW1fdmFscygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyaW5nX2VudW1fdmFsc187Ci0gIH0KLQotICBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIHJ2ID0gdF9iYXNlX25hbWUoYmFzZV8pOwotICAgIGlmIChydiA9PSAiKHVua25vd24pIikgewotICAgICAgdGhyb3cgIkJVRzogQ2FuJ3QgZ2V0IGZpbmdlcnByaW50IG1hdGVyaWFsIGZvciB0aGlzIGJhc2UgdHlwZS4iOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgdF9iYXNlX25hbWUodF9iYXNlIHRiYXNlKSB7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSBUWVBFX1ZPSUQgICA6IHJldHVybiAgICAgICJ2b2lkIjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfU1RSSU5HIDogcmV0dXJuICAgICJzdHJpbmciOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9CT09MICAgOiByZXR1cm4gICAgICAiYm9vbCI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0JZVEUgICA6IHJldHVybiAgICAgICJieXRlIjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfSTE2ICAgIDogcmV0dXJuICAgICAgICJpMTYiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9JMzIgICAgOiByZXR1cm4gICAgICAgImkzMiI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0k2NCAgICA6IHJldHVybiAgICAgICAiaTY0IjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfRE9VQkxFIDogcmV0dXJuICAgICJkb3VibGUiOyBicmVhazsKLSAgICAgIGRlZmF1bHQgICAgICAgICAgOiByZXR1cm4gIih1bmtub3duKSI7IGJyZWFrOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgdF9iYXNlIGJhc2VfOwotCi0gIGJvb2wgc3RyaW5nX2xpc3RfOwotICBib29sIGJpbmFyeV87Ci0gIGJvb2wgc3RyaW5nX2VudW1fOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nX2VudW1fdmFsc187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZDgxYmQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9DT05TVF9ICi0jZGVmaW5lIFRfQ09OU1RfSAotCi0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF9jb25zdF92YWx1ZS5oIgotCi0vKioKLSAqIEEgY29uc3QgaXMgYSBjb25zdGFudCB2YWx1ZSBkZWZpbmVkIGFjcm9zcyBsYW5ndWFnZXMgdGhhdCBoYXMgYSB0eXBlIGFuZAotICogYSB2YWx1ZS4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB0aGUgZGVjbGFyZWQgdHlwZSBtaWdodCBub3QgbWF0Y2ggdGhlIHR5cGUKLSAqIG9mIHRoZSB2YWx1ZSBvYmplY3QsIHNpbmNlIHRoYXQgaXMgbm90IGRldGVybWluZWQgdW50aWwgYWZ0ZXIgcGFyc2luZyB0aGUKLSAqIHdob2xlIHRoaW5nIG91dC4KLSAqCi0gKi8KLWNsYXNzIHRfY29uc3QgOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdF9jb25zdCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSA6Ci0gICAgdHlwZV8odHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAgdmFsdWVfKHZhbHVlKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgY29uc3QgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSogdHlwZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZV87Ci19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmYWViMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9DT05TVF9WQUxVRV9ICi0jZGVmaW5lIFRfQ09OU1RfVkFMVUVfSAotCi0jaW5jbHVkZSAidF9lbnVtLmgiCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotLyoqCi0gKiBBIGNvbnN0IHZhbHVlIGlzIHNvbWV0aGluZyBwYXJzZWQgdGhhdCBjb3VsZCBiZSBhIG1hcCwgc2V0LCBsaXN0LCBzdHJ1Y3QKLSAqIG9yIHdoYXRldmVyLgotICoKLSAqLwotY2xhc3MgdF9jb25zdF92YWx1ZSB7Ci0gcHVibGljOgotCi0gIGVudW0gdF9jb25zdF92YWx1ZV90eXBlIHsKLSAgICBDVl9JTlRFR0VSLAotICAgIENWX0RPVUJMRSwKLSAgICBDVl9TVFJJTkcsCi0gICAgQ1ZfTUFQLAotICAgIENWX0xJU1QsCi0gICAgQ1ZfSURFTlRJRklFUgotICB9OwotCi0gIHRfY29uc3RfdmFsdWUoKSB7fQotCi0gIHRfY29uc3RfdmFsdWUoaW50NjRfdCB2YWwpIHsKLSAgICBzZXRfaW50ZWdlcih2YWwpOwotICB9Ci0KLSAgdF9jb25zdF92YWx1ZShzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICBzZXRfc3RyaW5nKHZhbCk7Ci0gIH0KLQotICB2b2lkIHNldF9zdHJpbmcoc3RkOjpzdHJpbmcgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9TVFJJTkc7Ci0gICAgc3RyaW5nVmFsXyA9IHZhbDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9zdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmluZ1ZhbF87Ci0gIH0KLQotICB2b2lkIHNldF9pbnRlZ2VyKGludDY0X3QgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9JTlRFR0VSOwotICAgIGludFZhbF8gPSB2YWw7Ci0gIH0KLQotICBpbnQ2NF90IGdldF9pbnRlZ2VyKCkgY29uc3QgewotICAgIGlmICh2YWxUeXBlXyA9PSBDVl9JREVOVElGSUVSKSB7Ci0gICAgICBpZiAoZW51bV8gPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAiaGF2ZSBpZGVudGlmaWVyIFwiIiArIGdldF9pZGVudGlmaWVyKCkgKyAiXCIsIGJ1dCB1bnNldCBlbnVtIG9uIGxpbmUhIjsKLSAgICAgIH0KLSAgICAgIHRfZW51bV92YWx1ZSogdmFsID0gZW51bV8tPmdldF9jb25zdGFudF9ieV9uYW1lKGdldF9pZGVudGlmaWVyKCkpOwotICAgICAgcmV0dXJuIHZhbC0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBpbnRWYWxfOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9ET1VCTEU7Ci0gICAgZG91YmxlVmFsXyA9IHZhbDsKLSAgfQotCi0gIGRvdWJsZSBnZXRfZG91YmxlKCkgY29uc3QgewotICAgIHJldHVybiBkb3VibGVWYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfbWFwKCkgewotICAgIHZhbFR5cGVfID0gQ1ZfTUFQOwotICB9Ci0KLSAgdm9pZCBhZGRfbWFwKHRfY29uc3RfdmFsdWUqIGtleSwgdF9jb25zdF92YWx1ZSogdmFsKSB7Ci0gICAgbWFwVmFsX1trZXldID0gdmFsOwotICB9Ci0KLSAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgZ2V0X21hcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbWFwVmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X2xpc3QoKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9MSVNUOwotICB9Ci0KLSAgdm9pZCBhZGRfbGlzdCh0X2NvbnN0X3ZhbHVlKiB2YWwpIHsKLSAgICBsaXN0VmFsXy5wdXNoX2JhY2sodmFsKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZ2V0X2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxpc3RWYWxfOwotICB9Ci0KLSAgdm9pZCBzZXRfaWRlbnRpZmllcihzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICB2YWxUeXBlXyA9IENWX0lERU5USUZJRVI7Ci0gICAgaWRlbnRpZmllclZhbF8gPSB2YWw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcigpIGNvbnN0IHsKLSAgICByZXR1cm4gaWRlbnRpZmllclZhbF87Ci0gIH0KLSAgCi0gIHZvaWQgc2V0X2VudW0odF9lbnVtKiB0ZW51bSkgewotICAgIGVudW1fID0gdGVudW07Ci0gIH0KLQotICB0X2NvbnN0X3ZhbHVlX3R5cGUgZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbFR5cGVfOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcFZhbF87Ci0gIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0VmFsXzsKLSAgc3RkOjpzdHJpbmcgc3RyaW5nVmFsXzsKLSAgaW50NjRfdCBpbnRWYWxfOwotICBkb3VibGUgZG91YmxlVmFsXzsKLSAgc3RkOjpzdHJpbmcgaWRlbnRpZmllclZhbF87Ci0gIHRfZW51bSogZW51bV87Ci0KLSAgdF9jb25zdF92YWx1ZV90eXBlIHZhbFR5cGVfOwotCi19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnRhaW5lci5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnRhaW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzUzNDkzLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb250YWluZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0NPTlRBSU5FUl9ICi0jZGVmaW5lIFRfQ09OVEFJTkVSX0gKLQotI2luY2x1ZGUgInRfdHlwZS5oIgotCi1jbGFzcyB0X2NvbnRhaW5lciA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF9jb250YWluZXIoKSA6Ci0gICAgY3BwX25hbWVfKCksCi0gICAgaGFzX2NwcF9uYW1lXyhmYWxzZSkge30KLQotICB2aXJ0dWFsIH50X2NvbnRhaW5lcigpIHt9Ci0KLSAgdm9pZCBzZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcgY3BwX25hbWUpIHsKLSAgICBjcHBfbmFtZV8gPSBjcHBfbmFtZTsKLSAgICBoYXNfY3BwX25hbWVfID0gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgaGFzX2NwcF9uYW1lKCkgewotICAgIHJldHVybiBoYXNfY3BwX25hbWVfOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2NwcF9uYW1lKCkgewotICAgIHJldHVybiBjcHBfbmFtZV87Ci0gIH0KLQotICBib29sIGlzX2NvbnRhaW5lcigpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgY3BwX25hbWVfOwotICBib29sIGhhc19jcHBfbmFtZV87Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTIwNjhjLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9kb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0RPQ19ICi0jZGVmaW5lIFRfRE9DX0gKLQotLyoqCi0gKiBEb2N1bWVudGF0aW9uIHN0dWJzCi0gKgotICovCi1jbGFzcyB0X2RvYyB7Ci0KLSBwdWJsaWM6Ci0gIHRfZG9jKCkgOiBoYXNfZG9jXyhmYWxzZSkge30KLQotICB2b2lkIHNldF9kb2MoY29uc3Qgc3RkOjpzdHJpbmcmIGRvYykgewotICAgIGRvY18gPSBkb2M7Ci0gICAgaGFzX2RvY18gPSB0cnVlOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9kb2MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGRvY187Ci0gIH0KLQotICBib29sIGhhc19kb2MoKSB7Ci0gICAgcmV0dXJuIGhhc19kb2NfOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBkb2NfOwotICBib29sIGhhc19kb2NfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQxNjA2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9FTlVNX0gKLSNkZWZpbmUgVF9FTlVNX0gKLQotI2luY2x1ZGUgInRfZW51bV92YWx1ZS5oIgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotLyoqCi0gKiBBbiBlbnVtZXJhdGVkIHR5cGUuIEEgbGlzdCBvZiBjb25zdGFudCBvYmplY3RzIHdpdGggYSBuYW1lIGZvciB0aGUgdHlwZS4KLSAqCi0gKi8KLWNsYXNzIHRfZW51bSA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF9lbnVtKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfdHlwZShwcm9ncmFtKSB7fQotCi0gIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gIH0KLQotICB2b2lkIGFwcGVuZCh0X2VudW1fdmFsdWUqIGNvbnN0YW50KSB7Ci0gICAgY29uc3RhbnRzXy5wdXNoX2JhY2soY29uc3RhbnQpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGdldF9jb25zdGFudHMoKSB7Ci0gICAgcmV0dXJuIGNvbnN0YW50c187Ci0gIH0KLQotICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZSkgewotICAgICAgICByZXR1cm4gKmNfaXRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV92YWx1ZShpbnQ2NF90IHZhbHVlKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gKmNfaXRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBib29sIGlzX2VudW0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gImVudW0iOwotICB9Ci0KLSAgdm9pZCByZXNvbHZlX3ZhbHVlcygpIHsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBpbnQgbGFzdFZhbHVlID0gLTE7Ci0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoISAoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICAgICgqY19pdGVyKS0+c2V0X3ZhbHVlKCsrbGFzdFZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxhc3RWYWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bV92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW1fdmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzYTg3ZS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bV92YWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRU5VTV9WQUxVRV9ICi0jZGVmaW5lIFRfRU5VTV9WQUxVRV9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidF9kb2MuaCIKLQotLyoqCi0gKiBBIGNvbnN0YW50LiBUaGVzZSBhcmUgdXNlZCBpbnNpZGUgb2YgZW51bSBkZWZpbml0aW9ucy4gQ29uc3RhbnRzIGFyZSBqdXN0Ci0gKiBzeW1ib2wgaWRlbnRpZmllcnMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGV4cGxpY2l0IHZhbHVlIGFzc29jaWF0ZWQKLSAqIHdpdGggdGhlbS4KLSAqCi0gKi8KLWNsYXNzIHRfZW51bV92YWx1ZSA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X2VudW1fdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSkgOgotICAgIG5hbWVfKG5hbWUpLAotICAgIGhhc192YWx1ZV8oZmFsc2UpLAotICAgIHZhbHVlXygwKSB7fQotCi0gIHRfZW51bV92YWx1ZShzdGQ6OnN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIDoKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBoYXNfdmFsdWVfKHRydWUpLAotICAgIHZhbHVlXyh2YWx1ZSkge30KLQotICB+dF9lbnVtX3ZhbHVlKCkge30KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgYm9vbCBoYXNfdmFsdWUoKSB7Ci0gICAgcmV0dXJuIGhhc192YWx1ZV87Ci0gIH0KLQotICBpbnQgZ2V0X3ZhbHVlKCkgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotICB2b2lkIHNldF92YWx1ZShpbnQgdmFsKSB7Ci0gICAgaGFzX3ZhbHVlXyA9IHRydWU7Ci0gICAgdmFsdWVfID0gdmFsOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgYm9vbCBoYXNfdmFsdWVfOwotICBpbnQgdmFsdWVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE3YTUxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0ZJRUxEX0gKLSNkZWZpbmUgVF9GSUVMRF9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLQotI2luY2x1ZGUgInRfZG9jLmgiCi0KLS8vIEZvcndhcmQgZGVjbGFyZSBmb3IgeHNkX2F0dHJzCi1jbGFzcyB0X3N0cnVjdDsKLQotLyoqCi0gKiBDbGFzcyB0byByZXByZXNlbnQgYSBmaWVsZCBpbiBhIHRocmlmdCBzdHJ1Y3R1cmUuIEEgZmllbGQgaGFzIGEgZGF0YSB0eXBlLAotICogYSBzeW1ib2xpYyBuYW1lLCBhbmQgYSBudW1lcmljIGlkZW50aWZpZXIuCi0gKgotICovCi1jbGFzcyB0X2ZpZWxkIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgdHlwZV8odHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAga2V5XygwKSwKLSAgICB2YWx1ZV8oTlVMTCksCi0gICAgeHNkX29wdGlvbmFsXyhmYWxzZSksCi0gICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCi0gICAgeHNkX2F0dHJzXyhOVUxMKSB7fQotCi0gIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCBpbnQzMl90IGtleSkgOgotICAgIHR5cGVfKHR5cGUpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIGtleV8oa2V5KSwKLSAgICByZXFfKFRfT1BUX0lOX1JFUV9PVVQpLAotICAgIHZhbHVlXyhOVUxMKSwKLSAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKLSAgICB4c2RfbmlsbGFibGVfKGZhbHNlKSwKLSAgICB4c2RfYXR0cnNfKE5VTEwpIHt9Ci0KLSAgfnRfZmllbGQoKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIGludDMyX3QgZ2V0X2tleSgpIGNvbnN0IHsKLSAgICByZXR1cm4ga2V5XzsKLSAgfQotCi0gIGVudW0gZV9yZXEgewotICAgIFRfUkVRVUlSRUQsCi0gICAgVF9PUFRJT05BTCwKLSAgICBUX09QVF9JTl9SRVFfT1VULAotICB9OwotCi0gIHZvaWQgc2V0X3JlcShlX3JlcSByZXEpIHsKLSAgICByZXFfID0gcmVxOwotICB9Ci0KLSAgZV9yZXEgZ2V0X3JlcSgpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVxXzsKLSAgfQotCi0gIHZvaWQgc2V0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICAgdmFsdWVfID0gdmFsdWU7Ci0gIH0KLQotICB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotCi0gIHZvaWQgc2V0X3hzZF9vcHRpb25hbChib29sIHhzZF9vcHRpb25hbCkgewotICAgIHhzZF9vcHRpb25hbF8gPSB4c2Rfb3B0aW9uYWw7Ci0gIH0KLQotICBib29sIGdldF94c2Rfb3B0aW9uYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHhzZF9vcHRpb25hbF87Ci0gIH0KLQotICB2b2lkIHNldF94c2RfbmlsbGFibGUoYm9vbCB4c2RfbmlsbGFibGUpIHsKLSAgICB4c2RfbmlsbGFibGVfID0geHNkX25pbGxhYmxlOwotICB9Ci0KLSAgYm9vbCBnZXRfeHNkX25pbGxhYmxlKCkgY29uc3QgewotICAgIHJldHVybiB4c2RfbmlsbGFibGVfOwotICB9Ci0KLSAgdm9pZCBzZXRfeHNkX2F0dHJzKHRfc3RydWN0KiB4c2RfYXR0cnMpIHsKLSAgICB4c2RfYXR0cnNfID0geHNkX2F0dHJzOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGdldF94c2RfYXR0cnMoKSB7Ci0gICAgcmV0dXJuIHhzZF9hdHRyc187Ci0gIH0KLQotICAvLyBUaGlzIGlzIG5vdCB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0X3R5cGU6OmdldF9maW5nZXJwcmludF9tYXRlcmlhbCwKLSAgLy8gYnV0IGl0IGRvZXMgdGhlIHNhbWUgdGhpbmcuCi0gIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oa2V5XykgKyAiOiIgKwotICAgICAgKChyZXFfID09IFRfT1BUSU9OQUwpID8gIm9wdC0iIDogIiIpICsKLSAgICAgIHR5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCi0gICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KLSAgICogVGhlIGFyZ3VtZW50cyBhcmUgKGNvbnN0KSByZWZlcmVuY2VzIHRvIGNvbnN0IHBvaW50ZXJzIHRvIGNvbnN0IHRfZmllbGRzLgotICAgKi8KLSAgc3RydWN0IGtleV9jb21wYXJlIHsKLSAgICBib29sIG9wZXJhdG9yKCkodF9maWVsZCBjb25zdCAqIGNvbnN0ICYgYSwgdF9maWVsZCBjb25zdCAqIGNvbnN0ICYgYikgewotICAgICAgcmV0dXJuIGEtPmdldF9rZXkoKSA8IGItPmdldF9rZXkoKTsKLSAgICB9Ci0gIH07Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgaW50MzJfdCBrZXlfOwotICBlX3JlcSByZXFfOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZV87Ci0KLSAgYm9vbCB4c2Rfb3B0aW9uYWxfOwotICBib29sIHhzZF9uaWxsYWJsZV87Ci0gIHRfc3RydWN0KiB4c2RfYXR0cnNfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmFhNmMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9GVU5DVElPTl9ICi0jZGVmaW5lIFRfRlVOQ1RJT05fSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfc3RydWN0LmgiCi0jaW5jbHVkZSAidF9kb2MuaCIKLQotLyoqCi0gKiBSZXByZXNlbnRhdGlvbiBvZiBhIGZ1bmN0aW9uLiBLZXkgcGFydHMgYXJlIHJldHVybiB0eXBlLCBmdW5jdGlvbiBuYW1lLAotICogb3B0aW9uYWwgbW9kaWZpZXJzLCBhbmQgYW4gYXJndW1lbnQgbGlzdCwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYXMgYSB0aHJpZnQKLSAqIHN0cnVjdC4KLSAqCi0gKi8KLWNsYXNzIHRfZnVuY3Rpb24gOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsCi0gICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICB0X3N0cnVjdCogYXJnbGlzdCwKLSAgICAgICAgICAgICBib29sIG9uZXdheT1mYWxzZSkgOgotICAgIHJldHVybnR5cGVfKHJldHVybnR5cGUpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIGFyZ2xpc3RfKGFyZ2xpc3QpLAotICAgIG9uZXdheV8ob25ld2F5KSB7Ci0gICAgeGNlcHRpb25zXyA9IG5ldyB0X3N0cnVjdChOVUxMKTsKLSAgfQotCi0gIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLAotICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QsCi0gICAgICAgICAgICAgdF9zdHJ1Y3QqIHhjZXB0aW9ucywKLSAgICAgICAgICAgICBib29sIG9uZXdheT1mYWxzZSkgOgotICAgIHJldHVybnR5cGVfKHJldHVybnR5cGUpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIGFyZ2xpc3RfKGFyZ2xpc3QpLAotICAgIHhjZXB0aW9uc18oeGNlcHRpb25zKSwKLSAgICBvbmV3YXlfKG9uZXdheSkKLSAgewotICAgIGlmIChvbmV3YXlfICYmICF4Y2VwdGlvbnNfLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKLSAgICAgIHRocm93IHN0ZDo6c3RyaW5nKCJPbmV3YXkgbWV0aG9kcyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLiIpOwotICAgIH0KLSAgfQotCi0gIH50X2Z1bmN0aW9uKCkge30KLQotICB0X3R5cGUqIGdldF9yZXR1cm50eXBlKCkgY29uc3QgewotICAgIHJldHVybiByZXR1cm50eXBlXzsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICB0X3N0cnVjdCogZ2V0X2FyZ2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGFyZ2xpc3RfOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHhjZXB0aW9uc187Ci0gIH0KLQotICBib29sIGlzX29uZXdheSgpIGNvbnN0IHsKLSAgICByZXR1cm4gb25ld2F5XzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiByZXR1cm50eXBlXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIHRfc3RydWN0KiBhcmdsaXN0XzsKLSAgdF9zdHJ1Y3QqIHhjZXB0aW9uc187Ci0gIGJvb2wgb25ld2F5XzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2xpc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTk2MjUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0xJU1RfSAotI2RlZmluZSBUX0xJU1RfSAotCi0jaW5jbHVkZSAidF9jb250YWluZXIuaCIKLQotLyoqCi0gKiBBIGxpc3QgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciBkYXRhIHR5cGUuCi0gKgotICovCi1jbGFzcyB0X2xpc3QgOiBwdWJsaWMgdF9jb250YWluZXIgewotIHB1YmxpYzoKLSAgdF9saXN0KHRfdHlwZSogZWxlbV90eXBlKSA6Ci0gICAgZWxlbV90eXBlXyhlbGVtX3R5cGUpIHt9Ci0KLSAgdF90eXBlKiBnZXRfZWxlbV90eXBlKCkgY29uc3QgewotICAgIHJldHVybiBlbGVtX3R5cGVfOwotICB9Ci0KLSAgYm9vbCBpc19saXN0KCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuICJsaXN0PCIgKyBlbGVtX3R5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSArICI+IjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgZWxlbV90eXBlXy0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiBlbGVtX3R5cGVfOwotfTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9tYXAuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlMzU4Zi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9NQVBfSAotI2RlZmluZSBUX01BUF9ICi0KLSNpbmNsdWRlICJ0X2NvbnRhaW5lci5oIgotCi0vKioKLSAqIEEgbWFwIGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgdHdvIGRhdGEKLSAqIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF9tYXAgOiBwdWJsaWMgdF9jb250YWluZXIgewotIHB1YmxpYzoKLSAgdF9tYXAodF90eXBlKiBrZXlfdHlwZSwgdF90eXBlKiB2YWxfdHlwZSkgOgotICAgIGtleV90eXBlXyhrZXlfdHlwZSksCi0gICAgdmFsX3R5cGVfKHZhbF90eXBlKSB7fQotCi0gIHRfdHlwZSogZ2V0X2tleV90eXBlKCkgY29uc3QgewotICAgIHJldHVybiBrZXlfdHlwZV87Ci0gIH0KLQotICB0X3R5cGUqIGdldF92YWxfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdmFsX3R5cGVfOwotICB9Ci0KLSAgYm9vbCBpc19tYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gIm1hcDwiICsga2V5X3R5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSArCi0gICAgICAiLCIgKyB2YWxfdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpICsgIj4iOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBrZXlfdHlwZV8tPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgdmFsX3R5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIGtleV90eXBlXzsKLSAgdF90eXBlKiB2YWxfdHlwZV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9wcm9ncmFtLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTFhYjZhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9wcm9ncmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfUFJPR1JBTV9ICi0jZGVmaW5lIFRfUFJPR1JBTV9ICi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotLy8gRm9yIHByb2dyYW1fbmFtZSgpCi0jaW5jbHVkZSAibWFpbi5oIgotCi0jaW5jbHVkZSAidF9kb2MuaCIKLSNpbmNsdWRlICJ0X3Njb3BlLmgiCi0jaW5jbHVkZSAidF9iYXNlX3R5cGUuaCIKLSNpbmNsdWRlICJ0X3R5cGVkZWYuaCIKLSNpbmNsdWRlICJ0X2VudW0uaCIKLSNpbmNsdWRlICJ0X2NvbnN0LmgiCi0jaW5jbHVkZSAidF9zdHJ1Y3QuaCIKLSNpbmNsdWRlICJ0X3NlcnZpY2UuaCIKLSNpbmNsdWRlICJ0X2xpc3QuaCIKLSNpbmNsdWRlICJ0X21hcC5oIgotI2luY2x1ZGUgInRfc2V0LmgiCi0vLyNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIFRvcCBsZXZlbCBjbGFzcyByZXByZXNlbnRpbmcgYW4gZW50aXJlIHRocmlmdCBwcm9ncmFtLiBBIHByb2dyYW0gY29uc2lzdHMKLSAqIGZ1bmRhbWVudGFsbHkgb2YgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiAgIFR5cGVkZWZzCi0gKiAgIEVudW1lcmF0aW9ucwotICogICBDb25zdGFudHMKLSAqICAgU3RydWN0cwotICogICBFeGNlcHRpb25zCi0gKiAgIFNlcnZpY2VzCi0gKgotICogVGhlIHByb2dyYW0gbW9kdWxlIGFsc28gY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBiYXNlIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF9wcm9ncmFtIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcGF0aF8ocGF0aCksCi0gICAgbmFtZV8obmFtZSksCi0gICAgb3V0X3BhdGhfKCIuLyIpIHsKLSAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOwotICB9Ci0KLSAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgpIDoKLSAgICBwYXRoXyhwYXRoKSwKLSAgICBvdXRfcGF0aF8oIi4vIikgewotICAgIG5hbWVfID0gcHJvZ3JhbV9uYW1lKHBhdGgpOwotICAgIHNjb3BlXyA9IG5ldyB0X3Njb3BlKCk7Ci0gIH0KLQotICAvLyBQYXRoIGFjY2Vzc29yCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9Ci0KLSAgLy8gT3V0cHV0IHBhdGggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9vdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoXzsgfQotCi0gIC8vIE5hbWUgYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICAvLyBOYW1lc3BhY2UKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VfOyB9Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9pbmNsdWRlX3ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVfcHJlZml4XzsgfQotCi0gIC8vIEFjY2Vzc29ycyBmb3IgcHJvZ3JhbSBlbGVtZW50cwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiYgZ2V0X3R5cGVkZWZzKCkgIGNvbnN0IHsgcmV0dXJuIHR5cGVkZWZzXzsgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mICAgIGdldF9lbnVtcygpICAgICBjb25zdCB7IHJldHVybiBlbnVtc187ICAgICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgICBnZXRfY29uc3RzKCkgICAgY29uc3QgeyByZXR1cm4gY29uc3RzXzsgICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiAgZ2V0X3N0cnVjdHMoKSAgIGNvbnN0IHsgcmV0dXJuIHN0cnVjdHNfOyAgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mICBnZXRfb2JqZWN0cygpICAgY29uc3QgeyByZXR1cm4gb2JqZWN0c187ICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgZ2V0X3NlcnZpY2VzKCkgIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzXzsgIH0KLQotICAvLyBQcm9ncmFtIGVsZW1lbnRzCi0gIHZvaWQgYWRkX3R5cGVkZWYgICh0X3R5cGVkZWYqIHRkKSB7IHR5cGVkZWZzXy5wdXNoX2JhY2sodGQpOyAgfQotICB2b2lkIGFkZF9lbnVtICAgICAodF9lbnVtKiAgICB0ZSkgeyBlbnVtc18ucHVzaF9iYWNrKHRlKTsgICAgIH0KLSAgdm9pZCBhZGRfY29uc3QgICAgKHRfY29uc3QqICAgdGMpIHsgY29uc3RzXy5wdXNoX2JhY2sodGMpOyAgICB9Ci0gIHZvaWQgYWRkX3N0cnVjdCAgICh0X3N0cnVjdCogIHRzKSB7IG9iamVjdHNfLnB1c2hfYmFjayh0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHNfLnB1c2hfYmFjayh0cyk7ICAgfQotICB2b2lkIGFkZF94Y2VwdGlvbiAodF9zdHJ1Y3QqICB0eCkgeyBvYmplY3RzXy5wdXNoX2JhY2sodHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y2VwdGlvbnNfLnB1c2hfYmFjayh0eCk7IH0KLSAgdm9pZCBhZGRfc2VydmljZSAgKHRfc2VydmljZSogdHMpIHsgc2VydmljZXNfLnB1c2hfYmFjayh0cyk7ICB9Ci0KLSAgLy8gUHJvZ3JhbXMgdG8gaW5jbHVkZQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZXNfOyB9Ci0KLSAgdm9pZCBzZXRfb3V0X3BhdGgoc3RkOjpzdHJpbmcgb3V0X3BhdGgpIHsKLSAgICBvdXRfcGF0aF8gPSBvdXRfcGF0aDsKLSAgICAvLyBFbnN1cmUgdGhhdCBpdCBlbmRzIHdpdGggYSB0cmFpbGluZyAnLycgKG9yICdcJyBmb3Igd2luZG93cyBtYWNoaW5lcykKLSAgICBjaGFyIGMgPSBvdXRfcGF0aF8uYXQob3V0X3BhdGhfLnNpemUoKSAtIDEpOwotICAgIGlmICghKGMgPT0gJy8nIHx8IGMgPT0gJ1xcJykpIHsKLSAgICAgIG91dF9wYXRoXy5wdXNoX2JhY2soJy8nKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTY29waW5nIGFuZCBuYW1lc3BhY2luZwotICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIG5hbWVzcGFjZV8gPSBuYW1lOwotICB9Ci0KLSAgLy8gU2NvcGUgYWNjZXNzb3IKLSAgdF9zY29wZSogc2NvcGUoKSB7Ci0gICAgcmV0dXJuIHNjb3BlXzsKLSAgfQotCi0gIC8vIEluY2x1ZGVzCi0KLSAgdm9pZCBhZGRfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBpbmNsdWRlX3NpdGUpIHsKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgpOwotCi0gICAgLy8gaW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSBpcyB0aGUgc2l0ZSBhdCB3aGljaCBpdCB3YXMgaW5jbHVkZWQKLSAgICAvLyAobWludXMgdGhlIGZpbGVuYW1lKQotICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4OwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0ZDo6c3RyaW5nOjpucG9zOwotICAgIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfc2l0ZS5yZmluZCgiLyIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbmNsdWRlX3NpdGUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOwotICAgIH0KLQotICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7Ci0gICAgaW5jbHVkZXNfLnB1c2hfYmFjayhwcm9ncmFtKTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSB7Ci0gICAgcmV0dXJuIGluY2x1ZGVzXzsKLSAgfQotCi0gIHZvaWQgc2V0X2luY2x1ZGVfcHJlZml4KHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4KSB7Ci0gICAgaW5jbHVkZV9wcmVmaXhfID0gaW5jbHVkZV9wcmVmaXg7Ci0KLSAgICAvLyB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGEgZGlyZWN0b3J5OyBhZGQgYSB0cmFpbGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKLSAgICBpbnQgbGVuID0gaW5jbHVkZV9wcmVmaXhfLnNpemUoKTsKLSAgICBpZiAobGVuID4gMCAmJiBpbmNsdWRlX3ByZWZpeF9bbGVuIC0gMV0gIT0gJy8nKSB7Ci0gICAgICBpbmNsdWRlX3ByZWZpeF8gKz0gJy8nOwotICAgIH0KLSAgfQotCi0gIC8vIExhbmd1YWdlIG5ldXRyYWwgbmFtZXNwYWNlIC8gcGFja2FnaW5nCi0gIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSwgc3RkOjpzdHJpbmcgbmFtZV9zcGFjZSkgewotICAgIG5hbWVzcGFjZXNfW2xhbmd1YWdlXSA9IG5hbWVfc3BhY2U7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlKSBjb25zdCB7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQobGFuZ3VhZ2UpOwotICAgIGlmIChpdGVyID09IG5hbWVzcGFjZXNfLmVuZCgpKSB7Ci0gICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKLSAgfQotCi0gIC8vIExhbmd1YWdlIHNwZWNpZmljIG5hbWVzcGFjZSAvIHBhY2thZ2luZwotCi0gIHZvaWQgYWRkX2NwcF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsKLSAgICBjcHBfaW5jbHVkZXNfLnB1c2hfYmFjayhwYXRoKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X2NwcF9pbmNsdWRlcygpIHsKLSAgICByZXR1cm4gY3BwX2luY2x1ZGVzXzsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvLyBGaWxlIHBhdGgKLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci0KLSAgLy8gTmFtZQotICBzdGQ6OnN0cmluZyBuYW1lXzsKLQotICAvLyBPdXRwdXQgZGlyZWN0b3J5Ci0gIHN0ZDo6c3RyaW5nIG91dF9wYXRoXzsKLQotICAvLyBOYW1lc3BhY2UKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKLQotICAvLyBJbmNsdWRlZCBwcm9ncmFtcwotICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlc187Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSwgaWYgYW55Ci0gIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4XzsKLQotICAvLyBJZGVudGlmaWVyIGxvb2t1cCBzY29wZQotICB0X3Njb3BlKiBzY29wZV87Ci0KLSAgLy8gQ29tcG9uZW50cyB0byBnZW5lcmF0ZSBjb2RlIGZvcgotICBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmc187Ci0gIHN0ZDo6dmVjdG9yPHRfZW51bSo+ICAgIGVudW1zXzsKLSAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+ICAgY29uc3RzXzsKLSAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiAgb2JqZWN0c187Ci0gIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gIHN0cnVjdHNfOwotICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+ICB4Y2VwdGlvbnNfOwotICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlc187Ci0KLSAgLy8gRHluYW1pYyBuYW1lc3BhY2VzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbmFtZXNwYWNlc187Ci0KLSAgLy8gQysrIGV4dHJhIGluY2x1ZGVzCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjcHBfaW5jbHVkZXNfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZjlkMjYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0NPUEVfSAotI2RlZmluZSBUX1NDT1BFX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfc2VydmljZS5oIgotI2luY2x1ZGUgInRfY29uc3QuaCIKLSNpbmNsdWRlICJ0X2NvbnN0X3ZhbHVlLmgiCi0jaW5jbHVkZSAidF9iYXNlX3R5cGUuaCIKLSNpbmNsdWRlICJ0X21hcC5oIgotI2luY2x1ZGUgInRfbGlzdC5oIgotCi0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyBhIHZhcmlhYmxlIHNjb3BlIHVzZWQgZm9yIGxvb2tpbmcgdXAgcHJlZGVmaW5lZCB0eXBlcyBhbmQKLSAqIHNlcnZpY2VzLiBUeXBpY2FsbHksIGEgc2NvcGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdF9wcm9ncmFtLiBTY29wZXMgYXJlIG5vdAotICogdXNlZCB0byBkZXRlcm1pbmUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmF0aGVyIHRvIHJlc29sdmUgaWRlbnRpZmllcnMgYXQKLSAqIHBhcnNlIHRpbWUuCi0gKgotICovCi1jbGFzcyB0X3Njb3BlIHsKLSBwdWJsaWM6Ci0gIHRfc2NvcGUoKSB7fQotCi0gIHZvaWQgYWRkX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0gICAgdHlwZXNfW25hbWVdID0gdHlwZTsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHJldHVybiB0eXBlc19bbmFtZV07Ci0gIH0KLQotICB2b2lkIGFkZF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfc2VydmljZSogc2VydmljZSkgewotICAgIHNlcnZpY2VzX1tuYW1lXSA9IHNlcnZpY2U7Ci0gIH0KLQotICB0X3NlcnZpY2UqIGdldF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gc2VydmljZXNfW25hbWVdOwotICB9Ci0KLSAgdm9pZCBhZGRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdCogY29uc3RhbnQpIHsKLSAgICBjb25zdGFudHNfW25hbWVdID0gY29uc3RhbnQ7Ci0gIH0KLQotICB0X2NvbnN0KiBnZXRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBjb25zdGFudHNfW25hbWVdOwotICB9Ci0KLSAgdm9pZCBwcmludCgpIHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gdHlwZXNfLmJlZ2luKCk7IGl0ZXIgIT0gdHlwZXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJXMgPT4gJXNcbiIsCi0gICAgICAgICAgICAgaXRlci0+Zmlyc3QuY19zdHIoKSwKLSAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCByZXNvbHZlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCwgdF90eXBlKiB0dHlwZSkgewotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOwotICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPmZpcnN0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdF92YWwtPmdldF9saXN0KCk7Ci0gICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUoKCp2X2l0ZXIpLCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICB0X3N0cnVjdCogdHN0cnVjdCA9ICh0X3N0cnVjdCopdHR5cGU7Ci0gICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKLSAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHRfZmllbGQqIGZpZWxkID0gdHN0cnVjdC0+Z2V0X2ZpZWxkX2J5X25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoY29uc3RfdmFsLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKLSAgICAgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oKHRfZW51bSopdHR5cGUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdF9jb25zdCogY29uc3RhbnQgPSBnZXRfY29uc3RhbnQoY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpKTsKLSAgICAgICAgaWYgKGNvbnN0YW50ID09IE5VTEwpIHsKLSAgICAgICAgICB0aHJvdyAiTm8gZW51bSB2YWx1ZSBvciBjb25zdGFudCBmb3VuZCBuYW1lZCBcIiIgKyBjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkgKyAiXCIhIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb25zdGFudC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKWNvbnN0YW50LT5nZXRfdHlwZSgpKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgICBjb25zdF92YWwtPnNldF9pbnRlZ2VyKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X3N0cmluZyhjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2RvdWJsZShjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9kb3VibGUoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgICB0aHJvdyAiQ29uc3RhbnRzIGNhbm5vdCBiZSBvZiB0eXBlIFZPSUQiOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb25zdGFudC0+Z2V0X3R5cGUoKS0+aXNfbWFwKCkpIHsKLSAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9tYXAoKTsKLSAgICAgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICAgICAgICBjb25zdF92YWwtPnNldF9tYXAoKTsKLSAgICAgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbWFwKHZfaXRlci0+Zmlyc3QsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uc3RhbnQtPmdldF90eXBlKCktPmlzX2xpc3QoKSkgewotICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfbGlzdCgpOwotICAgICAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgICAgICAgY29uc3RfdmFsLT5zZXRfbGlzdCgpOwotICAgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgICBjb25zdF92YWwtPmFkZF9saXN0KCp2X2l0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgLy8gZW51bSBjb25zdGFudCB3aXRoIG5vbi1pZGVudGlmaWVyIHZhbHVlLiBzZXQgdGhlIGVudW0gYW5kIGZpbmQgdGhlCi0gICAgICAvLyB2YWx1ZSdzIG5hbWUuCi0gICAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHR5cGU7Ci0gICAgICB0X2VudW1fdmFsdWUqIGVudW1fdmFsdWUgPSB0ZW51bS0+Z2V0X2NvbnN0YW50X2J5X3ZhbHVlKGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgICBpZiAoZW51bV92YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJDb3VsZG4ndCBmaW5kIGEgbmFtZWQgdmFsdWUgaW4gZW51bSAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZvciB2YWx1ZSAiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpKTsKLSAgICAgIH0KLSAgICAgIGNvbnN0X3ZhbC0+c2V0X2lkZW50aWZpZXIoZW51bV92YWx1ZS0+Z2V0X25hbWUoKSk7Ci0gICAgICBjb25zdF92YWwtPnNldF9lbnVtKHRlbnVtKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgLy8gTWFwIG9mIG5hbWVzIHRvIHR5cGVzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3R5cGUqPiB0eXBlc187Ci0KLSAgLy8gTWFwIG9mIG5hbWVzIHRvIGNvbnN0YW50cwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+IGNvbnN0YW50c187Ci0KLSAgLy8gTWFwIG9mIG5hbWVzIHRvIHNlcnZpY2VzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3NlcnZpY2UqPiBzZXJ2aWNlc187Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZTJkYWMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NFUlZJQ0VfSAotI2RlZmluZSBUX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSAidF9mdW5jdGlvbi5oIgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotY2xhc3MgdF9wcm9ncmFtOwotCi0vKioKLSAqIEEgc2VydmljZSBjb25zaXN0cyBvZiBhIHNldCBvZiBmdW5jdGlvbnMuCi0gKgotICovCi1jbGFzcyB0X3NlcnZpY2UgOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIHRfc2VydmljZSh0X3Byb2dyYW0qIHByb2dyYW0pIDoKLSAgICB0X3R5cGUocHJvZ3JhbSksCi0gICAgZXh0ZW5kc18oTlVMTCkge30KLQotICBib29sIGlzX3NlcnZpY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIHNldF9leHRlbmRzKHRfc2VydmljZSogZXh0ZW5kcykgewotICAgIGV4dGVuZHNfID0gZXh0ZW5kczsKLSAgfQotCi0gIHZvaWQgYWRkX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIGZ1bmMpIHsKLSAgICBmdW5jdGlvbnNfLnB1c2hfYmFjayhmdW5jKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgZ2V0X2Z1bmN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gZnVuY3Rpb25zXzsKLSAgfQotCi0gIHRfc2VydmljZSogZ2V0X2V4dGVuZHMoKSB7Ci0gICAgcmV0dXJuIGV4dGVuZHNfOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgLy8gU2VydmljZXMgc2hvdWxkIG5ldmVyIGJlIHVzZWQgaW4gZmluZ2VycHJpbnRzLgotICAgIHRocm93ICJCVUc6IENhbid0IGdldCBmaW5nZXJwcmludCBtYXRlcmlhbCBmb3Igc2VydmljZS4iOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zXzsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NldC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTk4MzU3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NFVF9ICi0jZGVmaW5lIFRfU0VUX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBzZXQgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciBkYXRhIHR5cGUuCi0gKgotICovCi1jbGFzcyB0X3NldCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci0gcHVibGljOgotICB0X3NldCh0X3R5cGUqIGVsZW1fdHlwZSkgOgotICAgIGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQotCi0gIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZWxlbV90eXBlXzsKLSAgfQotCi0gIGJvb2wgaXNfc2V0KCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuICJzZXQ8IiArIGVsZW1fdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpICsgIj4iOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBlbGVtX3R5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIGVsZW1fdHlwZV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zdHJ1Y3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zdHJ1Y3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlZTExMi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU1RSVUNUX0gKLSNkZWZpbmUgVF9TVFJVQ1RfSAotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfZmllbGQuaCIKLQotLy8gRm9yd2FyZCBkZWNsYXJlIHRoYXQgcHVwcHkKLWNsYXNzIHRfcHJvZ3JhbTsKLQotLyoqCi0gKiBBIHN0cnVjdCBpcyBhIGNvbnRhaW5lciBmb3IgYSBzZXQgb2YgbWVtYmVyIGZpZWxkcyB0aGF0IGhhcyBhIG5hbWUuIFN0cnVjdHMKLSAqIGFyZSBhbHNvIHVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfc3RydWN0IDogcHVibGljIHRfdHlwZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzX3R5cGU7Ci0KLSAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtKSA6Ci0gICAgdF90eXBlKHByb2dyYW0pLAotICAgIGlzX3hjZXB0aW9uXyhmYWxzZSksCi0gICAgeHNkX2FsbF8oZmFsc2UpIHt9Ci0KLSAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgOgotICAgIHRfdHlwZShwcm9ncmFtLCBuYW1lKSwKLSAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAotICAgIHhzZF9hbGxfKGZhbHNlKSB7fQotCi0gIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gIH0KLQotICB2b2lkIHNldF94Y2VwdGlvbihib29sIGlzX3hjZXB0aW9uKSB7Ci0gICAgaXNfeGNlcHRpb25fID0gaXNfeGNlcHRpb247Ci0gIH0KLQotICB2b2lkIHNldF91bmlvbihib29sIGlzX3VuaW9uKSB7Ci0gICAgaXNfdW5pb25fID0gaXNfdW5pb247Ci0gIH0KLQotICB2b2lkIHNldF94c2RfYWxsKGJvb2wgeHNkX2FsbCkgewotICAgIHhzZF9hbGxfID0geHNkX2FsbDsKLSAgfQotCi0gIGJvb2wgZ2V0X3hzZF9hbGwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHhzZF9hbGxfOwotICB9Ci0KLSAgYm9vbCBhcHBlbmQodF9maWVsZCogZWxlbSkgewotICAgIG1lbWJlcnNfLnB1c2hfYmFjayhlbGVtKTsKLQotICAgIHR5cGVkZWYgbWVtYmVyc190eXBlOjppdGVyYXRvciBpdGVyX3R5cGU7Ci0gICAgc3RkOjpwYWlyPGl0ZXJfdHlwZSwgaXRlcl90eXBlPiBib3VuZHMgPSBzdGQ6OmVxdWFsX3JhbmdlKAotICAgICAgICAgICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKSwgbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCksIGVsZW0sIHRfZmllbGQ6OmtleV9jb21wYXJlKCkKLSAgICAgICAgKTsKLSAgICBpZiAoYm91bmRzLmZpcnN0ICE9IGJvdW5kcy5zZWNvbmQpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uaW5zZXJ0KGJvdW5kcy5zZWNvbmQsIGVsZW0pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfbWVtYmVycygpIHsKLSAgICByZXR1cm4gbWVtYmVyc187Ci0gIH0KLQotICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9zb3J0ZWRfbWVtYmVycygpIHsKLSAgICByZXR1cm4gbWVtYmVyc19pbl9pZF9vcmRlcl87Ci0gIH0KLQotICBib29sIGlzX3N0cnVjdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gIWlzX3hjZXB0aW9uXzsKLSAgfQotCi0gIGJvb2wgaXNfeGNlcHRpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlzX3hjZXB0aW9uXzsKLSAgfQotICAKLSAgYm9vbCBpc191bmlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gaXNfdW5pb25fOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcnYgPSAieyI7Ci0gICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBydiArPSAoKm1faXRlciktPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpOwotICAgICAgcnYgKz0gIjsiOwotICAgIH0KLSAgICBydiArPSAifSI7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICB9Ci0gIH0KLQotICB0X2ZpZWxkKiBnZXRfZmllbGRfYnlfbmFtZShzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfbmFtZSgpID09IGZpZWxkX25hbWUpIHsKLSAgICAgICAgcmV0dXJuICptX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIG1lbWJlcnNfdHlwZSBtZW1iZXJzXzsKLSAgbWVtYmVyc190eXBlIG1lbWJlcnNfaW5faWRfb3JkZXJfOwotICBib29sIGlzX3hjZXB0aW9uXzsKLSAgYm9vbCBpc191bmlvbl87Ci0KLSAgYm9vbCB4c2RfYWxsXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTJlZGEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9UWVBFX0gKLSNkZWZpbmUgVF9UWVBFX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vLyBXaGF0J3Mgd29yc2U/ICBUaGlzLCBvciBtYWtpbmcgYSBzcmMvcGFyc2Uvbm9uX2lubGluZWQuY2M/Ci0jaW5jbHVkZSAibWQ1LmgiCi0KLWNsYXNzIHRfcHJvZ3JhbTsKLQotLyoqCi0gKiBHZW5lcmljIHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHR5cGUuIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlCi0gKiBwYXJzZXIgbW9kdWxlIHRvIGJ1aWxkIHVwIGEgdHJlZSBvZiBvYmplY3QgdGhhdCBhcmUgYWxsIGV4cGxpY2l0bHkgdHlwZWQuCi0gKiBUaGUgZ2VuZXJpYyB0X3R5cGUgY2xhc3MgZXhwb3J0cyBhIHZhcmlldHkgb2YgdXNlZnVsIG1ldGhvZHMgdGhhdCBhcmUKLSAqIHVzZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIHRvIGJyYW5jaCBiYXNlZCB1cG9uIGRpZmZlcmVudCBoYW5kbGluZyBmb3IgdGhlCi0gKiB2YXJpb3VzIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF90eXBlIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfnRfdHlwZSgpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgdmlydHVhbCBib29sIGlzX3ZvaWQoKSAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc3RyaW5nKCkgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2Jvb2woKSAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc190eXBlZGVmKCkgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfZW51bSgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3N0cnVjdCgpICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc194Y2VwdGlvbigpICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2xpc3QoKSAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19zZXQoKSAgICAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfbWFwKCkgICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3NlcnZpY2UoKSAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIHsKLSAgICByZXR1cm4gcHJvZ3JhbV87Ci0gIH0KLQotCi0gIC8vIFJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB0eXBlCi0gIC8vIGZyb20gYW55IG90aGVyIHRocmlmdCB0eXBlIGluIHRoZSB3b3JsZCwgYXMgZmFyIGFzCi0gIC8vIFREZW5zZVByb3RvY29sIGlzIGNvbmNlcm5lZC4KLSAgLy8gV2UgZG9uJ3QgY2FjaGUgdGhpcywgd2hpY2ggaXMgYSBsaXR0bGUgc2xvcHB5LAotICAvLyBidXQgdGhlIGNvbXBpbGVyIGlzIHNvIGZhc3QgdGhhdCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIuCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgPSAwOwotCi0gIC8vIEZpbmdlcnByaW50IHNob3VsZCBjaGFuZ2Ugd2hlbmV2ZXIgKGFuZCBvbmx5IHdoZW4pCi0gIC8vIHRoZSBlbmNvZGluZyB2aWEgVERlbnNlUHJvdG9jb2wgY2hhbmdlcy4KLSAgc3RhdGljIGNvbnN0IGludCBmaW5nZXJwcmludF9sZW4gPSAxNjsKLQotICAvLyBDYWxsIHRoaXMgYmVmb3JlIHRyeWluZyBnZXRfKl9maW5nZXJwcmludCgpLgotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgc3RkOjpzdHJpbmcgbWF0ZXJpYWwgPSBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgICBtZDVfc3RhdGVfdCBjdHg7Ci0gICAgbWQ1X2luaXQoJmN0eCk7Ci0gICAgbWQ1X2FwcGVuZCgmY3R4LCAobWQ1X2J5dGVfdCopKG1hdGVyaWFsLmRhdGEoKSksIChpbnQpbWF0ZXJpYWwuc2l6ZSgpKTsKLSAgICBtZDVfZmluaXNoKCZjdHgsIChtZDVfYnl0ZV90KilmaW5nZXJwcmludF8pOwotICB9Ci0KLSAgYm9vbCBoYXNfZmluZ2VycHJpbnQoKSBjb25zdCB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgaWYgKGZpbmdlcnByaW50X1tpXSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCB1aW50OF90KiBnZXRfYmluYXJ5X2ZpbmdlcnByaW50KCkgY29uc3QgewotICAgIHJldHVybiBmaW5nZXJwcmludF87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfYXNjaWlfZmluZ2VycHJpbnQoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcnY7Ci0gICAgY29uc3QgdWludDhfdCogZnAgPSBnZXRfYmluYXJ5X2ZpbmdlcnByaW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgcnYgKz0gYnl0ZV90b19oZXgoZnBbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYnJlYWsgKG1heWJlIGJhZGx5KSB1bmxlc3MgMCA8PSBudW0gPD0gMTYuCi0gIHN0YXRpYyBjaGFyIG55YmJsZV90b194ZGlnaXQoaW50IG51bSkgewotICAgIGlmIChudW0gPCAxMCkgewotICAgICAgcmV0dXJuICcwJyArIG51bTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICdBJyArIG51bSAtIDEwOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBieXRlX3RvX2hleCh1aW50OF90IGJ5dGUpIHsKLSAgICBzdGQ6OnN0cmluZyBydjsKLSAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgPj4gNCk7Ci0gICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlICYgMHgwZik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHRfdHlwZSgpIDoKLSAgICBwcm9ncmFtXyhOVUxMKQotICB7Ci0gICAgbWVtc2V0KGZpbmdlcnByaW50XywgMCwgc2l6ZW9mKGZpbmdlcnByaW50XykpOwotICB9Ci0KLSAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHByb2dyYW1fKHByb2dyYW0pCi0gIHsKLSAgICBtZW1zZXQoZmluZ2VycHJpbnRfLCAwLCBzaXplb2YoZmluZ2VycHJpbnRfKSk7Ci0gIH0KLQotICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtLCBzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcHJvZ3JhbV8ocHJvZ3JhbSksCi0gICAgbmFtZV8obmFtZSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcHJvZ3JhbV8oTlVMTCksCi0gICAgbmFtZV8obmFtZSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotCi0gIHVpbnQ4X3QgZmluZ2VycHJpbnRfW2ZpbmdlcnByaW50X2xlbl07Ci19OwotCi0KLS8qKgotICogUGxhY2Vob2xkZXIgc3RydWN0IGZvciByZXR1cm5pbmcgdGhlIGtleSBhbmQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbgotICogZHVyaW5nIHBhcnNpbmcuCi0gKi8KLXN0cnVjdCB0X2Fubm90YXRpb24gewotICBzdGQ6OnN0cmluZyBrZXk7Ci0gIHN0ZDo6c3RyaW5nIHZhbDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzdkOTcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1RZUEVERUZfSAotI2RlZmluZSBUX1RZUEVERUZfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInRfdHlwZS5oIgotCi0vKioKLSAqIEEgdHlwZWRlZiBpcyBhIG1hcHBpbmcgZnJvbSBhIHN5bWJvbGljIG5hbWUgdG8gYW5vdGhlciB0eXBlLiBJbiBkeW1hbmljYWxseQotICogdHlwZWQgbGFuZ3VhZ2VzIChpLmUuIHBocC9weXRob24pIHRoZSBjb2RlIGdlbmVyYXRvciBjYW4gYWN0dWFsbHkgdXN1YWxseQotICogaWdub3JlIHR5cGVkZWZzIGFuZCBqdXN0IHVzZSB0aGUgdW5kZXJseWluZyB0eXBlIGRpcmVjdGx5LCB0aG91Z2ggaW4gQysrCi0gKiB0aGUgc3ltYm9saWMgbmFtaW5nIGNhbiBiZSBxdWl0ZSB1c2VmdWwgZm9yIGNvZGUgY2xhcml0eS4KLSAqCi0gKi8KLWNsYXNzIHRfdHlwZWRlZiA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBzeW1ib2xpYykgOgotICAgIHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksCi0gICAgdHlwZV8odHlwZSksCi0gICAgc3ltYm9saWNfKHN5bWJvbGljKSB7fQotCi0gIH50X3R5cGVkZWYoKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9zeW1ib2xpYygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3ltYm9saWNfOwotICB9Ci0KLSAgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgaWYgKCF0eXBlXy0+aGFzX2ZpbmdlcnByaW50KCkpIHsKLSAgICAgIHR5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiB0eXBlXzsKLSAgc3RkOjpzdHJpbmcgc3ltYm9saWNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmggYi9jb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOTdmNjguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIGRlZmluZSBmb3IgbWtkaXIsc2luY2UgdGhlIG1ldGhvZCBzaWduYXR1cmUKLSAqIGlzIGRpZmZlcmVudCBmb3IgdGhlIG5vbi1QT1NJWCBNaW5HVwotICovCi0KLSNpZmRlZiBNSU5HVwotI2luY2x1ZGUgPGlvLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgTUlOR1cKLSNkZWZpbmUgTUtESVIoeCkgbWtkaXIoeCkKLSNlbHNlCi0jZGVmaW5lIE1LRElSKHgpIG1rZGlyKHgsIFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM5ZDYwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKQEAgLTAsMCArMSw0NjQgQEAKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKworI2luY2x1ZGUgInRocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisKK2V4dGVybiBpbnQgZ193YXJuOworZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfY3VycGF0aDsKK2V4dGVybiBib29sIGdfcmV0dXJuX2ZhaWx1cmU7CisKK3ZvaWQgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICAgaWYgKGdfd2FybiA8IGxldmVsKSB7CisgICAgICByZXR1cm47CisgICB9CisgICB2YV9saXN0IGFyZ3M7CisgICBwcmludGYoIltUaHJpZnQgQXVkaXQgV2FybmluZzolc10gIiwgZ19jdXJwYXRoLmNfc3RyKCkpOworICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgIHZhX2VuZChhcmdzKTsKKyAgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCB0aHJpZnRfYXVkaXRfZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiW1RocmlmdCBBdWRpdCBGYWlsdXJlOiVzXSAiLCBnX2N1cnBhdGguY19zdHIoKSk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGdfcmV0dXJuX2ZhaWx1cmUgPSB0cnVlOworfQorCit2b2lkIGNvbXBhcmVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogbmV3UHJvZ3JhbSwgdF9wcm9ncmFtKiBvbGRQcm9ncmFtKQoreworICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgbmV3TmFtZXNwYWNlTWFwID0gbmV3UHJvZ3JhbS0+Z2V0X2FsbF9uYW1lc3BhY2VzKCk7CisgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBvbGROYW1lc3BhY2VNYXAgPSBvbGRQcm9ncmFtLT5nZXRfYWxsX25hbWVzcGFjZXMoKTsKKworICAgZm9yKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG9sZE5hbWVzcGFjZU1hcEl0ID0gb2xkTmFtZXNwYWNlTWFwLmJlZ2luKCk7CisgICAgICAgICBvbGROYW1lc3BhY2VNYXBJdCAhPSBvbGROYW1lc3BhY2VNYXAuZW5kKCk7CisgICAgICAgICBvbGROYW1lc3BhY2VNYXBJdCsrKQorICAgeworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbmV3TmFtZXNwYWNlTWFwSXQgPSBuZXdOYW1lc3BhY2VNYXAuZmluZChvbGROYW1lc3BhY2VNYXBJdC0+Zmlyc3QpOworICAgICAgaWYobmV3TmFtZXNwYWNlTWFwSXQgPT0gbmV3TmFtZXNwYWNlTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkxhbmd1YWdlICVzIG5vdCBmb3VuZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsIChvbGROYW1lc3BhY2VNYXBJdC0+Zmlyc3QpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZSBpZigobmV3TmFtZXNwYWNlTWFwSXQtPnNlY29uZCkgIT0gb2xkTmFtZXNwYWNlTWFwSXQtPnNlY29uZCkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJOYW1lc3BhY2UgJXMgY2hhbmdlZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsIChvbGROYW1lc3BhY2VNYXBJdC0+c2Vjb25kKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZCBjb21wYXJlX2VudW1fdmFsdWVzKHRfZW51bSogbmV3RW51bSx0X2VudW0qIG9sZEVudW0pCit7CisgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgb2xkRW51bVZhbHVlcyA9IG9sZEVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igb2xkRW51bVZhbHVlc0l0ID0gb2xkRW51bVZhbHVlcy5iZWdpbigpOworICAgICAgICAgb2xkRW51bVZhbHVlc0l0ICE9IG9sZEVudW1WYWx1ZXMuZW5kKCk7CisgICAgICAgICBvbGRFbnVtVmFsdWVzSXQrKykKKyAgIHsKKyAgICAgIGludCBlbnVtVmFsdWUgPSAoKm9sZEVudW1WYWx1ZXNJdCktPmdldF92YWx1ZSgpOworICAgICAgdF9lbnVtX3ZhbHVlKiBuZXdFbnVtVmFsdWUgPSBuZXdFbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoZW51bVZhbHVlKTsKKyAgICAgIGlmKG5ld0VudW1WYWx1ZSAhPSBOVUxMKQorICAgICAgeworICAgICAgICAgc3RkOjpzdHJpbmcgZW51bU5hbWUgPSAoKm9sZEVudW1WYWx1ZXNJdCktPmdldF9uYW1lKCk7CisgICAgICAgICBpZihlbnVtTmFtZSAhPSBuZXdFbnVtVmFsdWUtPmdldF9uYW1lKCkpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTmFtZSBvZiB0aGUgdmFsdWUgJWQgY2hhbmdlZCBpbiBlbnVtICVzXG4iLCBlbnVtVmFsdWUsIG9sZEVudW0tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiRW51bSB2YWx1ZSAlZCBtaXNzaW5nIGluICVzXG4iLCBlbnVtVmFsdWUsIG9sZEVudW0tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisKKyAgIH0KK30KKwordm9pZCBjb21wYXJlX2VudW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBuZXdFbnVtTGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG9sZEVudW1MaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9lbnVtKj4gbmV3RW51bU1hcDsKKyAgIHN0ZDo6dmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBuZXdFbnVtSXQ7CisgICBmb3IobmV3RW51bUl0ID0gbmV3RW51bUxpc3QuYmVnaW4oKTsgbmV3RW51bUl0ICE9IG5ld0VudW1MaXN0LmVuZCgpOyBuZXdFbnVtSXQrKykKKyAgIHsKKyAgICAgIG5ld0VudW1NYXBbKCpuZXdFbnVtSXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdFbnVtSXQ7CisgICB9CisgICBzdGQ6OnZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3Igb2xkRW51bUl0OworICAgZm9yKG9sZEVudW1JdCA9IG9sZEVudW1MaXN0LmJlZ2luKCk7IG9sZEVudW1JdCAhPSBvbGRFbnVtTGlzdC5lbmQoKTsgb2xkRW51bUl0KyspCisgICB7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X2VudW0qPjo6aXRlcmF0b3IgbmV3RW51bU1hcEl0OworICAgICAgbmV3RW51bU1hcEl0ID0gbmV3RW51bU1hcC5maW5kKCgqb2xkRW51bUl0KS0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmKG5ld0VudW1NYXBJdCA9PSBuZXdFbnVtTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkVudW0gJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwoKm9sZEVudW1JdCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBjb21wYXJlX2VudW1fdmFsdWVzKG5ld0VudW1NYXBJdC0+c2Vjb25kLCAqb2xkRW51bUl0KTsKKyAgICAgIH0KKyAgIH0KK30KKworLy9UaGlzIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIHRoZSB0d28gYXJndWVtZW50cyBhcmUgb2Ygc2FtZSB0eXBlcy4KKy8vUmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBvZiBkaWZmZXJlbnQgdHlwZQorYm9vbCBjb21wYXJlX3R5cGUodF90eXBlKiBuZXdUeXBlLCB0X3R5cGUqIG9sZFR5cGUpCit7CisgICAvL0NvbXBhcmluZyBuYW1lcyBvZiB0d28gdHlwZXMgd2lsbCB3b3JrIHdoZW4gdGhlIG5ld1R5cGUgYW5kIG9sZFR5cGUgYXJlIGJhc2ljIHR5cGVzIG9yIHN0cnVjdHMgb3IgZW51bXMuCisgICAvL0hvd2V2ZXIsIHdoZW4gdGhleSBhcmUgY29udGFpbmVycywgZ2V0X25hbWUoKSByZXR1cm5zIGVtcHR5IGZvciB3aGljaCB3ZSBoYXZlIHRvIGNvbXBhcmUgdGhlIHR5cGUgb2YKKyAgIC8vdGhlaXIgZWxlbWVudHMgYXMgd2VsbC4KKyAgIGlmKChuZXdUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpICYmIChvbGRUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpKQorICAgeworCisgICAgICBpZihuZXdUeXBlLT5pc19saXN0KCkgJiYgb2xkVHlwZS0+aXNfbGlzdCgpKQorICAgICAgeworICAgICAgICAgdF90eXBlKiBuZXdFbGVtZW50VHlwZSA9ICgodF9saXN0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9saXN0KilvbGRUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgcmV0dXJuIGNvbXBhcmVfdHlwZShuZXdFbGVtZW50VHlwZSwgb2xkRWxlbWVudFR5cGUpOworICAgICAgfQorICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19tYXAoKSAmJiBvbGRUeXBlLT5pc19tYXAoKSkKKyAgICAgIHsKKyAgICAgICAgIHRfdHlwZSogbmV3S2V5VHlwZSA9ICgodF9tYXAqKW5ld1R5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgIHRfdHlwZSogb2xkS2V5VHlwZSA9ICgodF9tYXAqKW9sZFR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKworICAgICAgICAgdF90eXBlKiBuZXdWYWxUeXBlID0gKCh0X21hcCopbmV3VHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRWYWxUeXBlID0gKCh0X21hcCopb2xkVHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgICAgICByZXR1cm4gKGNvbXBhcmVfdHlwZShuZXdLZXlUeXBlLCBvbGRLZXlUeXBlKSAmJiBjb21wYXJlX3R5cGUobmV3VmFsVHlwZSwgb2xkVmFsVHlwZSkpOworICAgICAgfQorICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19zZXQoKSAmJiBvbGRUeXBlLT5pc19zZXQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRfdHlwZSogbmV3RWxlbWVudFR5cGUgPSAoKHRfc2V0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9zZXQqKW9sZFR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgICByZXR1cm4gY29tcGFyZV90eXBlKG5ld0VsZW1lbnRUeXBlLCBvbGRFbGVtZW50VHlwZSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICB9CisgICBlbHNlIGlmKG5ld1R5cGUtPmdldF9uYW1lKCkgPT0gb2xkVHlwZS0+Z2V0X25hbWUoKSkKKyAgIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgfQorICAgZWxzZQorICAgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorfQorCitib29sIGNvbXBhcmVfcGFpcihzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBuZXdNYXBQYWlyLCBzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBvbGRNYXBQYWlyKQoreworICAgcmV0dXJuIGNvbXBhcmVfZGVmYXVsdHMobmV3TWFwUGFpci5maXJzdCwgb2xkTWFwUGFpci5maXJzdCkgJiYgY29tcGFyZV9kZWZhdWx0cyhuZXdNYXBQYWlyLnNlY29uZCwgb2xkTWFwUGFpci5zZWNvbmQpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJ3RydWUnIGlmIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgc2FtZS4gUmV0dXJucyBmYWxzZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQuCitib29sIGNvbXBhcmVfZGVmYXVsdHModF9jb25zdF92YWx1ZSogbmV3U3RydWN0RGVmYXVsdCwgdF9jb25zdF92YWx1ZSogb2xkU3RydWN0RGVmYXVsdCkKK3sKKyAgIGlmKG5ld1N0cnVjdERlZmF1bHQgPT0gTlVMTCAmJiBvbGRTdHJ1Y3REZWZhdWx0ID09IE5VTEwpIHJldHVybiB0cnVlOworICAgZWxzZSBpZihuZXdTdHJ1Y3REZWZhdWx0ID09IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCAhPSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICBlbHNlIGlmIChuZXdTdHJ1Y3REZWZhdWx0ICE9IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgIGlmKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkgIT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X3R5cGUoKSkKKyAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworICAgc3dpdGNoKG5ld1N0cnVjdERlZmF1bHQtPmdldF90eXBlKCkpCisgICB7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9pbnRlZ2VyKCkgPT0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2ludGVnZXIoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X2RvdWJsZSgpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9kb3VibGUoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X3N0cmluZygpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9zdHJpbmcoKSk7CisgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIG9sZERlZmF1bHRMaXN0ID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X2xpc3QoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbmV3RGVmYXVsdExpc3QgPSBuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfbGlzdCgpOworICAgICAgICAgICAgYm9vbCBkZWZhdWx0VmFsdWVzQ29tcGFyZSA9IChvbGREZWZhdWx0TGlzdC5zaXplKCkgPT0gbmV3RGVmYXVsdExpc3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNDb21wYXJlICYmIHN0ZDo6ZXF1YWwobmV3RGVmYXVsdExpc3QuYmVnaW4oKSwgbmV3RGVmYXVsdExpc3QuZW5kKCksIG9sZERlZmF1bHRMaXN0LmJlZ2luKCksIGNvbXBhcmVfZGVmYXVsdHMpOworICAgICAgICAgfQorICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG5ld01hcCA9IG5ld1N0cnVjdERlZmF1bHQtPmdldF9tYXAoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gb2xkTWFwID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X21hcCgpOworCisgICAgICAgICAgICBib29sIGRlZmF1bHRWYWx1ZXNDb21wYXJlID0gKG9sZE1hcC5zaXplKCkgPT0gbmV3TWFwLnNpemUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzQ29tcGFyZSAmJiBzdGQ6OmVxdWFsKG5ld01hcC5iZWdpbigpLCBuZXdNYXAuZW5kKCksIG9sZE1hcC5iZWdpbigpLCBjb21wYXJlX3BhaXIpOworICAgICAgICAgfQorICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfaWRlbnRpZmllcigpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfc3RydWN0X2ZpZWxkKHRfZmllbGQqIG5ld0ZpZWxkLCB0X2ZpZWxkKiBvbGRGaWVsZCwgc3RkOjpzdHJpbmcgb2xkU3RydWN0TmFtZSkKK3sKKyAgIHRfdHlwZSogbmV3RmllbGRUeXBlID0gbmV3RmllbGQtPmdldF90eXBlKCk7CisgICB0X3R5cGUqIG9sZEZpZWxkVHlwZSA9IG9sZEZpZWxkLT5nZXRfdHlwZSgpOworICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGaWVsZFR5cGUsIG9sZEZpZWxkVHlwZSkpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFR5cGUgQ2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7CisgICB9CisKKyAgIC8vIEEgU3RydWN0IG1lbWJlciBjYW4gYmUgb3B0aW9uYWwgaWYgaXQgaXMgbWVudGlvbmVkIGV4cGxpY2l0bHksIG9yIGlmIGl0IGlzIGFzc2lnbmVkIHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgICBib29sIG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgPSAobmV3RmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgIGJvb2wgb2xkU3RydWN0RmllbGRPcHRpb25hbCA9IChvbGRGaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworCisgICBpZihuZXdTdHJ1Y3RGaWVsZE9wdGlvbmFsICE9IG9sZFN0cnVjdEZpZWxkT3B0aW9uYWwpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIFJlcXVpcmVkbmVzcyBDaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKKyAgIH0KKyAgIGlmKG5ld1N0cnVjdEZpZWxkT3B0aW9uYWwgfHwgb2xkU3RydWN0RmllbGRPcHRpb25hbCkKKyAgIHsKKyAgICAgIGlmKCFjb21wYXJlX2RlZmF1bHRzKG5ld0ZpZWxkLT5nZXRfdmFsdWUoKSwgb2xkRmllbGQtPmdldF92YWx1ZSgpKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJEZWZhdWx0IHZhbHVlIGNoYW5nZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgfQorICAgfQorCisgICBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSBuZXdGaWVsZC0+Z2V0X25hbWUoKTsKKyAgIGlmKGZpZWxkTmFtZSAhPSBvbGRGaWVsZC0+Z2V0X25hbWUoKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJTdHJ1Y3QgZmllbGQgbmFtZSBjaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zaW5nbGVfc3RydWN0KHRfc3RydWN0KiBuZXdTdHJ1Y3QsIHRfc3RydWN0KiBvbGRTdHJ1Y3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvbGRTdHJ1Y3ROYW1lID0gc3RkOjpzdHJpbmcoKSkKK3sKKyAgIHN0ZDo6c3RyaW5nIHN0cnVjdE5hbWUgPSBvbGRTdHJ1Y3ROYW1lLmVtcHR5KCkgPyBvbGRTdHJ1Y3QtPmdldF9uYW1lKCkgOiBvbGRTdHJ1Y3ROYW1lOworICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyID0gb2xkU3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlciA9IG5ld1N0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG9sZFN0cnVjdE1lbWJlckl0ID0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5iZWdpbigpOworICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBuZXdTdHJ1Y3RNZW1iZXJJdCA9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuYmVnaW4oKTsKKworICAgLy8gU2luY2Ugd2UgaGF2ZSB0aGUgc3RydWN0IG1lbWJlcnMgaW4gdGhlaXIgSUQgb3JkZXIsIGNvbXBhcmluZyB0aGVpciBJRHMgY2FuIGJlIGRvbmUgYnkgdHJhdmVyc2luZyB0aGUgdHdvIG1lbWJlcgorICAgLy8gbGlzdHMgdG9nZXRoZXIuCisgICB3aGlsZSghKG9sZFN0cnVjdE1lbWJlckl0ID09IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgbmV3U3RydWN0TWVtYmVySXQgPT0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkpCisgICB7CisgICAgICBpZihuZXdTdHJ1Y3RNZW1iZXJJdCA9PSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpICYmIG9sZFN0cnVjdE1lbWJlckl0ICE9IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkpCisgICAgICB7CisgICAgICAgICAvLyBBIGZpZWxkIElEIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgorICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCByZW1vdmVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKG5ld1N0cnVjdE1lbWJlckl0ICE9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgb2xkU3RydWN0TWVtYmVySXQgPT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vTmV3IGZpZWxkIElEIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBlbmQuCisgICAgICAgICBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICAgICB7CisgICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiUmVxdWlyZWQgU3RydWN0IEZpZWxkIEFkZGVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIH0KKyAgICAgICAgIG5ld1N0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPT0gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vRmllbGQgSUQgZm91bmQgaW4gYm90aCBzdHJ1Y3RzLiBDb21wYXJlIGZpZWxkIHR5cGVzLCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgIGNvbXBhcmVfc3RydWN0X2ZpZWxkKCpuZXdTdHJ1Y3RNZW1iZXJJdCwgKm9sZFN0cnVjdE1lbWJlckl0LCBzdHJ1Y3ROYW1lKTsKKworICAgICAgICAgbmV3U3RydWN0TWVtYmVySXQrKzsKKyAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisgICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPCAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQorICAgICAgeworICAgICAgICAgLy9OZXcgRmllbGQgSWQgaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbgorICAgICAgICAgLy9BZGRpbmcgZmllbGRzIHRvIHN0cnVjdCBpcyBmaW5lLCBidXQgYWRkaW5nIHRoZW0gaW4gdGhlIG1pZGRsZSBpcyBzdXNwaWNpb3VzLiBFcnJvciEhCisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IGZpZWxkIGlzIGFkZGVkIGluIHRoZSBtaWRkbGUgd2l0aCBJZCA9ICVkIGluICVzXG4iLCAgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgIHN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICAgICBuZXdTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgfQorICAgICAgZWxzZSBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpID4gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vQSBmaWVsZCBpcyBkZWxldGVkIGluIG5ld1N0cnVjdC4KKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgcmVtb3ZlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsICAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKworICAgfQorfQorCit2b2lkIGNvbXBhcmVfc3RydWN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBuZXdTdHJ1Y3RMaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBvbGRTdHJ1Y3RMaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9zdHJ1Y3QqPiBuZXdTdHJ1Y3RNYXA7CisgICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdTdHJ1Y3RMaXN0SXQ7CisgICBmb3IobmV3U3RydWN0TGlzdEl0ID0gbmV3U3RydWN0TGlzdC5iZWdpbigpOyBuZXdTdHJ1Y3RMaXN0SXQgIT0gbmV3U3RydWN0TGlzdC5lbmQoKTsgbmV3U3RydWN0TGlzdEl0KyspCisgICB7CisgICAgICBuZXdTdHJ1Y3RNYXBbKCpuZXdTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdTdHJ1Y3RMaXN0SXQ7CisgICB9CisKKyAgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIG9sZFN0cnVjdExpc3RJdDsKKyAgIGZvcihvbGRTdHJ1Y3RMaXN0SXQgPSBvbGRTdHJ1Y3RMaXN0LmJlZ2luKCk7IG9sZFN0cnVjdExpc3RJdCAhPSBvbGRTdHJ1Y3RMaXN0LmVuZCgpOyBvbGRTdHJ1Y3RMaXN0SXQrKykKKyAgIHsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBuZXdTdHJ1Y3RNYXBJdDsKKyAgICAgIG5ld1N0cnVjdE1hcEl0ID0gbmV3U3RydWN0TWFwLmZpbmQoKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmKG5ld1N0cnVjdE1hcEl0ID09IG5ld1N0cnVjdE1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgY29tcGFyZV9zaW5nbGVfc3RydWN0KG5ld1N0cnVjdE1hcEl0LT5zZWNvbmQsICpvbGRTdHJ1Y3RMaXN0SXQpOworICAgICAgfQorICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9zaW5nbGVfZnVuY3Rpb24odF9mdW5jdGlvbiogbmV3RnVuY3Rpb24sIHRfZnVuY3Rpb24qIG9sZEZ1bmN0aW9uKQoreworICAgdF90eXBlKiBuZXdGdW5jdGlvblJldHVyblR5cGUgPSBuZXdGdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKworICAgaWYobmV3RnVuY3Rpb24tPmlzX29uZXdheSgpICE9IG9sZEZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJPbmV3YXkgYXR0cmlidXRlIGNoYW5nZWQgZm9yIGZ1bmN0aW9uICVzXG4iLG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgfQorICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGdW5jdGlvblJldHVyblR5cGUsIG9sZEZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkKKyAgIHsKKyAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJSZXR1cm4gdHlwZSBjaGFuZ2VkIGZvciBmdW5jdGlvbiAlc1xuIixvbGRGdW5jdGlvbi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgIH0KKworICAgLy9Db21wYXJlIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKyAgIGNvbXBhcmVfc2luZ2xlX3N0cnVjdChuZXdGdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgb2xkRnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICAgc3RkOjpzdHJpbmcgZXhjZXB0aW9uTmFtZSA9IG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICAgZXhjZXB0aW9uTmFtZSArPSAiX2V4Y2VwdGlvbiI7CisgICBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QobmV3RnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgb2xkRnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgZXhjZXB0aW9uTmFtZSk7Cit9CisKK3ZvaWQgY29tcGFyZV9mdW5jdGlvbnMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBuZXdGdW5jdGlvbkxpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgb2xkRnVuY3Rpb25MaXN0KQoreworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZnVuY3Rpb24qPiBuZXdGdW5jdGlvbk1hcDsKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIG5ld0Z1bmN0aW9uTWFwSXQ7CisgICBmb3Ioc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBuZXdGdW5jdGlvbkl0ID0gbmV3RnVuY3Rpb25MaXN0LmJlZ2luKCk7CisgICAgICAgICBuZXdGdW5jdGlvbkl0ICE9IG5ld0Z1bmN0aW9uTGlzdC5lbmQoKTsKKyAgICAgICAgIG5ld0Z1bmN0aW9uSXQrKykKKyAgIHsKKyAgICAgIG5ld0Z1bmN0aW9uTWFwWygqbmV3RnVuY3Rpb25JdCktPmdldF9uYW1lKCldID0gKm5ld0Z1bmN0aW9uSXQ7CisgICB9CisKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIG9sZEZ1bmN0aW9uSXQgPSBvbGRGdW5jdGlvbkxpc3QuYmVnaW4oKTsKKyAgICAgICAgIG9sZEZ1bmN0aW9uSXQgIT0gb2xkRnVuY3Rpb25MaXN0LmVuZCgpOworICAgICAgICAgb2xkRnVuY3Rpb25JdCsrKQorICAgeworICAgICAgbmV3RnVuY3Rpb25NYXBJdCA9IG5ld0Z1bmN0aW9uTWFwLmZpbmQoKCpvbGRGdW5jdGlvbkl0KS0+Z2V0X25hbWUoKSk7CisgICAgICBpZihuZXdGdW5jdGlvbk1hcEl0ID09IG5ld0Z1bmN0aW9uTWFwLmVuZCgpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk5ldyBUaHJpZnQgRmlsZSBoYXMgbWlzc2luZyBmdW5jdGlvbiAlc1xuIiwoKm9sZEZ1bmN0aW9uSXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAvL0Z1bmN0aW9uIGlzIGZvdW5kIGluIGJvdGggdGhyaWZ0IGZpbGVzLiBDb21wYXJlIHJldHVybiB0eXBlIGFuZCBhcmd1bWVudCBsaXN0CisgICAgICAgICBjb21wYXJlX3NpbmdsZV9mdW5jdGlvbihuZXdGdW5jdGlvbk1hcEl0LT5zZWNvbmQsICpvbGRGdW5jdGlvbkl0KTsKKyAgICAgIH0KKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfc2VydmljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG5ld1NlcnZpY2VzLCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgb2xkU2VydmljZXMpCit7CisgICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igb2xkU2VydmljZUl0OworCisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gbmV3U2VydmljZU1hcDsKKyAgIGZvcihzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3IgbmV3U2VydmljZUl0ID0gbmV3U2VydmljZXMuYmVnaW4oKTsKKyAgICAgICAgIG5ld1NlcnZpY2VJdCAhPSBuZXdTZXJ2aWNlcy5lbmQoKTsKKyAgICAgICAgIG5ld1NlcnZpY2VJdCsrKQorICAgeworICAgICAgbmV3U2VydmljZU1hcFsoKm5ld1NlcnZpY2VJdCktPmdldF9uYW1lKCldID0gKm5ld1NlcnZpY2VJdDsKKyAgIH0KKworCisgICBmb3Iob2xkU2VydmljZUl0ID0gb2xkU2VydmljZXMuYmVnaW4oKTsgb2xkU2VydmljZUl0ICE9IG9sZFNlcnZpY2VzLmVuZCgpOyBvbGRTZXJ2aWNlSXQrKykKKyAgIHsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9sZFNlcnZpY2VOYW1lID0gKCpvbGRTZXJ2aWNlSXQpLT5nZXRfbmFtZSgpOworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+OjppdGVyYXRvciBuZXdTZXJ2aWNlTWFwSXQgPSBuZXdTZXJ2aWNlTWFwLmZpbmQob2xkU2VydmljZU5hbWUpOworCisgICAgICBpZihuZXdTZXJ2aWNlTWFwSXQgPT0gbmV3U2VydmljZU1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJOZXcgVGhyaWZ0IGZpbGUgaXMgbWlzc2luZyBhIHNlcnZpY2UgJXNcbiIsIG9sZFNlcnZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgdF9zZXJ2aWNlKiBvbGRTZXJ2aWNlRXh0ZW5kcyA9ICgqb2xkU2VydmljZUl0KS0+Z2V0X2V4dGVuZHMoKTsKKyAgICAgICAgIHRfc2VydmljZSogbmV3U2VydmljZUV4dGVuZHMgPSAobmV3U2VydmljZU1hcEl0LT5zZWNvbmQpLT5nZXRfZXh0ZW5kcygpOworCisgICAgICAgICBpZihvbGRTZXJ2aWNlRXh0ZW5kcyA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgLy8gSXQgaXMgZmluZSB0byBhZGQgZXh0ZW5kcy4gU28gaWYgc2VydmljZSBpbiBvbGRlciB0aHJpZnQgZGlkIG5vdCBoYXZlIGFueSBleHRlbmRzLCB3ZSBhcmUgZmluZS4KKyAgICAgICAgICAgIC8vIERPIE5vdGhpbmcKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgaWYob2xkU2VydmljZUV4dGVuZHMgIT0gTlVMTCAmJiBuZXdTZXJ2aWNlRXh0ZW5kcyA9PSBOVUxMKQorICAgICAgICAgeworICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkNoYW5nZSBpbiBTZXJ2aWNlIGluaGVyaXRhbmNlIGZvciAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvbGRFeHRlbmRzTmFtZSA9IG9sZFNlcnZpY2VFeHRlbmRzLT5nZXRfbmFtZSgpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3RXh0ZW5kc05hbWUgPSBuZXdTZXJ2aWNlRXh0ZW5kcy0+Z2V0X25hbWUoKTsKKworICAgICAgICAgICAgaWYoIG5ld0V4dGVuZHNOYW1lICE9IG9sZEV4dGVuZHNOYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkNoYW5nZSBpbiBTZXJ2aWNlIGluaGVyaXRhbmNlIGZvciAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIGNvbXBhcmVfZnVuY3Rpb25zKChuZXdTZXJ2aWNlTWFwSXQtPnNlY29uZCktPmdldF9mdW5jdGlvbnMoKSwgKCpvbGRTZXJ2aWNlSXQpLT5nZXRfZnVuY3Rpb25zKCkpOworICAgICAgfQorCisgICB9CisKK30KKwordm9pZCBjb21wYXJlX2NvbnN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG5ld0NvbnN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG9sZENvbnN0KQoreworICAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdDb25zdEl0OworICAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBvbGRDb25zdEl0OworCisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+IG5ld0NvbnN0TWFwOworCisgICBmb3IobmV3Q29uc3RJdCA9IG5ld0NvbnN0LmJlZ2luKCk7IG5ld0NvbnN0SXQgIT0gbmV3Q29uc3QuZW5kKCk7IG5ld0NvbnN0SXQrKykKKyAgIHsKKyAgICAgIG5ld0NvbnN0TWFwWygqbmV3Q29uc3RJdCktPmdldF9uYW1lKCldID0gKm5ld0NvbnN0SXQ7CisgICB9CisKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld0NvbnN0TWFwSXQ7CisgICBmb3Iob2xkQ29uc3RJdCA9IG9sZENvbnN0LmJlZ2luKCk7IG9sZENvbnN0SXQgIT0gb2xkQ29uc3QuZW5kKCk7IG9sZENvbnN0SXQrKykKKyAgIHsKKyAgICAgIG5ld0NvbnN0TWFwSXQgPSBuZXdDb25zdE1hcC5maW5kKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpOworICAgICAgaWYobmV3Q29uc3RNYXBJdCA9PSBuZXdDb25zdE1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJDb25zdGFudHMgTWlzc2luZyAlcyBcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIWNvbXBhcmVfdHlwZSgobmV3Q29uc3RNYXBJdC0+c2Vjb25kKS0+Z2V0X3R5cGUoKSwgKCpvbGRDb25zdEl0KS0+Z2V0X3R5cGUoKSkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiQ29uc3RhbnQgJXMgaXMgb2YgZGlmZmVyZW50IHR5cGUgXG4iLCAoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKCFjb21wYXJlX2RlZmF1bHRzKChuZXdDb25zdE1hcEl0LT5zZWNvbmQpLT5nZXRfdmFsdWUoKSwgKCpvbGRDb25zdEl0KS0+Z2V0X3ZhbHVlKCkpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkNvbnN0YW50ICVzIGhhcyBkaWZmZXJlbnQgdmFsdWVcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTc5ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgVF9BVURJVF9ICisjZGVmaW5lIFRfQVVESVRfSAorCit2b2lkIGNvbXBhcmVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogbmV3UHJvZ3JhbSwgdF9wcm9ncmFtKiBvbGRQcm9ncmFtKTsKK3ZvaWQgY29tcGFyZV9lbnVtcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgbmV3RW51bUxpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG9sZEVudW1MaXN0KTsKK2Jvb2wgY29tcGFyZV9kZWZhdWx0cyh0X2NvbnN0X3ZhbHVlKiBuZXdTdHJ1Y3REZWZhdWx0LCB0X2NvbnN0X3ZhbHVlKiBvbGRTdHJ1Y3REZWZhdWx0KTsKK3ZvaWQgY29tcGFyZV9zdHJ1Y3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG5ld1N0cnVjdExpc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBvbGRTdHJ1Y3RMaXN0KTsKK3ZvaWQgY29tcGFyZV9zZXJ2aWNlcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgbmV3U2VydmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG9sZFNlcnZpY2VzKTsKK3ZvaWQgY29tcGFyZV9jb25zdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBuZXdDb25zdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBvbGRDb25zdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMmI5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uY2MKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIgorCit0X3R5cGUqIGdfdHlwZV92b2lkOwordF90eXBlKiBnX3R5cGVfc3RyaW5nOwordF90eXBlKiBnX3R5cGVfYmluYXJ5OwordF90eXBlKiBnX3R5cGVfc2xpc3Q7Cit0X3R5cGUqIGdfdHlwZV9ib29sOwordF90eXBlKiBnX3R5cGVfaTg7Cit0X3R5cGUqIGdfdHlwZV9pMTY7Cit0X3R5cGUqIGdfdHlwZV9pMzI7Cit0X3R5cGUqIGdfdHlwZV9pNjQ7Cit0X3R5cGUqIGdfdHlwZV9kb3VibGU7CisKK3ZvaWQgaW5pdEdsb2JhbHMoKSB7CisgIGdfdHlwZV92b2lkID0gbmV3IHRfYmFzZV90eXBlKCJ2b2lkIiwgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCk7CisgIGdfdHlwZV9zdHJpbmcgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgIGdfdHlwZV9iaW5hcnkgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICgodF9iYXNlX3R5cGUqKWdfdHlwZV9iaW5hcnkpLT5zZXRfYmluYXJ5KHRydWUpOworICBnX3R5cGVfc2xpc3QgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICgodF9iYXNlX3R5cGUqKWdfdHlwZV9zbGlzdCktPnNldF9zdHJpbmdfbGlzdCh0cnVlKTsKKyAgZ190eXBlX2Jvb2wgPSBuZXcgdF9iYXNlX3R5cGUoImJvb2wiLCB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKTsKKyAgZ190eXBlX2k4ID0gbmV3IHRfYmFzZV90eXBlKCJpOCIsIHRfYmFzZV90eXBlOjpUWVBFX0k4KTsKKyAgZ190eXBlX2kxNiA9IG5ldyB0X2Jhc2VfdHlwZSgiaTE2IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTE2KTsKKyAgZ190eXBlX2kzMiA9IG5ldyB0X2Jhc2VfdHlwZSgiaTMyIiwgdF9iYXNlX3R5cGU6OlRZUEVfSTMyKTsKKyAgZ190eXBlX2k2NCA9IG5ldyB0X2Jhc2VfdHlwZSgiaTY0IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTY0KTsKKyAgZ190eXBlX2RvdWJsZSA9IG5ldyB0X2Jhc2VfdHlwZSgiZG91YmxlIiwgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKK30KKwordm9pZCBjbGVhckdsb2JhbHMoKSB7CisgIGRlbGV0ZSBnX3R5cGVfdm9pZDsKKyAgZGVsZXRlIGdfdHlwZV9zdHJpbmc7CisgIGRlbGV0ZSBnX3R5cGVfYm9vbDsKKyAgZGVsZXRlIGdfdHlwZV9pODsKKyAgZGVsZXRlIGdfdHlwZV9pMTY7CisgIGRlbGV0ZSBnX3R5cGVfaTMyOworICBkZWxldGUgZ190eXBlX2k2NDsKKyAgZGVsZXRlIGdfdHlwZV9kb3VibGU7Cit9CisKKy8qKgorICogVGhvc2UgYXJlIG5vdCByZWFsbHkgbmVlZGVkIGZvciBwbHVnaW5zIGJ1dCBjYXVzZXMgbGluayBlcnJvcnMgd2l0aG91dAorICovCisKKy8qKgorICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2ludCBnX2RvY3RleHRfbGluZW5vOworaW50IGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IDA7CitQUk9HRE9DVEVYVF9TVEFUVVMgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gSU5WQUxJRDsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0ODg0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTU1PTl9ICisjZGVmaW5lIFRfQ09NTU9OX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBHbG9iYWwgdHlwZXMgZm9yIHRoZSBwYXJzZXIgdG8gYmUgYWJsZSB0byByZWZlcmVuY2UKKyAqLworCitleHRlcm4gdF90eXBlKiBnX3R5cGVfdm9pZDsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9zdHJpbmc7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfYmluYXJ5OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX3NsaXN0OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2Jvb2w7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTg7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTE2OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kzMjsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9pNjQ7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfZG91YmxlOworCit2b2lkIGluaXRHbG9iYWxzKCk7Cit2b2lkIGNsZWFyR2xvYmFscygpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTcyNGZlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjU5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQVMzIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9hczNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfYXMzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBiaW5kYWJsZV8gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJiaW5kYWJsZSIpID09IDApIHsKKyAgICAgICAgYmluZGFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBhczM6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWFzMyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM192YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGJpbmRhYmxlKTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIC8vIHJlbW92ZWQgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGFzM19wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGFzM190eXBlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cyk7CisgIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisKKyAgYm9vbCBiaW5kYWJsZV87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImFzMyIpOworCisgIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAoZGlyLnNpemUoKSA+IDApIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICB9CisKKyAgcGFja2FnZV9kaXJfID0gc3ViZGlyOworfQorCisvKioKKyAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQorICoKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM19wYWNrYWdlKCkgeworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIiAiOworICB9CisgIHJldHVybiAicGFja2FnZSAiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBBczMgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190eXBlX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0O1xuIiArICJpbXBvcnQgZmxhc2gudXRpbHMuQnl0ZUFycmF5O1xuIgorICAgICAgICAgKyAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7XG5cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGFzMyBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKKyAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc3RydWN0CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cykgeworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQorICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3NlcnZpY2UKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBpbXBvcnRzOworICBjb25zdCB2ZWN0b3I8dF9mdW5jdGlvbio+JiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVybmV0IG5hbWVzcGFjZQorICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgeworICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGFzM190aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLCBpbXBvcnRzKTsKKyAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLCBpbXBvcnRzKTsKKyAgfQorCisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIE5vdGhpbmcgaW4gQXMzCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBBczMsIHNpbmNlIGl0IGRvZXMKKyAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQorICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUpOworCisgIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCkgPDwgZW5kbDsKKworICBzY29wZV91cChmX2VudW0pOworICAvLyBBZGQgYXMzIGltcG9ydHMKKyAgZl9lbnVtIDw8IHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TZXQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsiCisgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjppbnQgPSAiIDw8IHZhbHVlIDw8ICI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCisgIGZfZW51bSA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IFZBTElEX1ZBTFVFUzpTZXQgPSBuZXcgU2V0KCI7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIHBvcHVsYXRlIHNldAorICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIikgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2VudW0gPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IFZBTFVFU19UT19OQU1FUzpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiVkFMVUVTX1RPX05BTUVTWyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdID0gXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCisKKyAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgcGFja2FnZQorCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzLmFzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX2NvbnN0cyk7CisgIGZfY29uc3RzIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgYXMzX3R5cGVfaW1wb3J0cygpOworCisgIGluZGVudChmX2NvbnN0cykgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfY29uc3RzKTsKKyAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICJ2YXIgIiA6ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIpOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKKyAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8ICh0eXBlLT5pc19saXN0KCkgPyAicHVzaCIgOiAiYWRkIikgPDwgIigiIDw8IHZhbCA8PCAiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEFzMyBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmFzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zdHJ1Y3QpOworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIHN0cmluZyBpbXBvcnRzOworCisgIGZfc3RydWN0IDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzdHJ1Y3QsIGltcG9ydHMpCisgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaWYgKGJpbmRhYmxlXyAmJiAhaXNfZXhjZXB0aW9uKSB7CisgICAgZl9zdHJ1Y3QgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcjsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IG14LmV2ZW50cy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICBzY29wZV9kb3duKGZfc3RydWN0KTsgLy8gZW5kIG9mIHBhY2thZ2UKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBBczMgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBib29sIGJpbmRhYmxlID0gIWlzX2V4Y2VwdGlvbiAmJiAhaW5fY2xhc3MgJiYgYmluZGFibGVfOworCisgIGluZGVudChvdXQpIDw8IChpbl9jbGFzcyA/ICIiIDogInB1YmxpYyAiKSA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJleHRlbmRzIEVycm9yICI7CisgIH0gZWxzZSBpZiAoYmluZGFibGUpIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgRXZlbnREaXNwYXRjaGVyICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY29uc3QgU1RSVUNUX0RFU0M6VFN0cnVjdCA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWFzMywgcHJpdmF0ZSBmb3IgLWFzM2JlYW4KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNvbnN0ICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDOlRGaWVsZCA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgdXBjYXNlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIjppbnQgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6Qm9vbGVhbiA9IGZhbHNlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOworCisgIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAorICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJGaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIG1ldGFEYXRhTWFwKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QsIGJpbmRhYmxlKTsKKyAgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZChpcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkOlRGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGFzMyBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKHR5cGUpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlIFwiICsgIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAorICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCisgKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQorICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50LCB2YWx1ZToqKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElEOmludCk6KiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworCisgIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOworCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAorICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgIgorICAgICAgICAgICAgICAgICAidmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXNTZXQoZmllbGRJRDppbnQpOkJvb2xlYW4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIEFzMyBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKKyAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmluZGFibGUpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICAvLyBTaW1wbGUgZ2V0dGVyCisgICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldCAiIDw8IGZpZWxkX25hbWUgPDwgIigpOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBzdGQ6OnN0cmluZyBwcm9wTmFtZSA9IHRtcCgidGhyaWZ0UHJvcGVydHlDaGFuZ2UiKTsKKyAgICBpZiAoYmluZGFibGUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbQmluZGFibGUoZXZlbnQ9XCIiIDw8IHByb3BOYW1lIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldCAiIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUgPDwgIjoiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOworCisgICAgaWYgKGJpbmRhYmxlKSB7CisgICAgICAvLyBXZSBoYXZlIHRvIHVzZSBhIGN1c3RvbSBldmVudCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCwgYmVjYXVzZSBpZiB5b3UgdXNlIHRoZSBkZWZhdWx0LAorICAgICAgLy8gdGhlIHNldHRlciBvbmx5IGdldHMgY2FsbGVkIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCAtIHRoaXMgbWVhbnMgY2FsbGluZworICAgICAgLy8gZm9vLnNldEludFZhbHVlKDApCisgICAgICAvLyB3aWxsIG5vdCBjYXVzZSBmb28uaXNJbnRWYWx1ZVNldCgpIHRvIHJldHVybiB0cnVlIHNpbmNlIHRoZSB2YWx1ZSBvZiBmb28uX2ludFZhbHVlIHdhc24ndAorICAgICAgLy8gY2hhbmdlZAorICAgICAgLy8gc28gdGhlIHNldHRlciB3YXMgbmV2ZXIgY2FsbGVkLgorICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIEhvd2V2ZXIsIGlmIHlvdSBqdXN0IHVzZSBhIGN1c3RvbSBldmVudCwgdGhlbiBjb2xsZWN0aW9ucyB3b24ndCBiZSBhYmxlIHRvIGRldGVjdCB3aGVuCisgICAgICAvLyBlbGVtZW50cworICAgICAgLy8gaW4gdGhlIGNvbGxlY3Rpb25zIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGV5IGxpc3RlZCBmb3IgUHJvcGVydHlDaGFuZ2VFdmVudHMuICBTbywgd2UKKyAgICAgIC8vIGRpc3BhdGNoIGJvdGguCisgICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50LlBST1BFUlRZX0NIQU5HRSkpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKTpCb29sZWFuIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiaW5kYWJsZSkgeworICAvLyBJZiBpdCdzIGJpbmRhYmxlLCBpdCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciBzbyB0b1N0cmluZyBpcyBhbiBvdmVycmlkZS4KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoYmluZGFibGUgPyAib3ZlcnJpZGUgIiA6ICIiKSA8PCAiZnVuY3Rpb24gdG9TdHJpbmcoKTpTdHJpbmcgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHJldDpTdHJpbmcgPSBuZXcgU3RyaW5nKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmlyc3Q6Qm9vbGVhbiA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgcmV0ICs9ICBcIiwgXCI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIjsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIm51bGxcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICJfbmFtZTpTdHJpbmcgPSAiIDw8IGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXQgKz0gXCIpXCI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCisgKiBmaWVsZE5hbWUgbWFwcGluZworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gRmllbGRNZXRhRGF0YSBtYXBwaW5ncworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBtZXRhRGF0YU1hcDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgLy8gUG9wdWxhdGUgbWFwCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwWyIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiXSA9IG5ldyBGaWVsZE1ldGFEYXRhKFwiIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7CisKKyAgICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGFzMyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2FzM190eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiVFR5cGUuVk9JRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2FzM190eXBlX3N0cmluZyh0eXBlKTsKKyAgfQorICBvdXQgPDwgIikiOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmFzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworCisgIC8vIE5vdyBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbi9jbGllbnQgZmlsZQorICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiSW1wbC5hcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiSW1wbDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgcHJvY2Vzc29yL3NlcnZlciBmaWxlCisgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IuYXMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgIH0KKworICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiCisgICAgICAgICAgICAgICAgICAgICA8PCAiKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sPW51bGwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgaXByb3RfOlRQcm90b2NvbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgdmFyIG9wcm90XzpUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgdmFyIHNlcWlkXzppbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE91dHB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzOiIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaChmdW5jdGlvbihlcnJvcjpFcnJvcik6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZXJyb3IgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGVycm9yKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3RfKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgOiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKHJlc3VsdC5zdWNjZXNzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworCisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IobmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChlOlRFcnJvcikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgIH0KKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IoaWZhY2U6IiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICA8PCAiKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaWZhY2UpOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9DRVNTX01BUFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpZmFjZV86IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICI7IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgY29uc3QgUFJPQ0VTU19NQVA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgc3RyaW5nIG92ZXJyaWRlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgb3ZlcnJpZGUgPSAib3ZlcnJpZGUgIjsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbCk6Qm9vbGVhbiIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/CisgIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKKyAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/CisgIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/CisgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgZm46RnVuY3Rpb24gPSBQUk9DRVNTX01BUFttc2cubmFtZV07IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLlVOS05PV05fTUVUSE9ELCAiCisgICAgICAgICAiXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbi5jYWxsKHRoaXMsbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGNsYXNzCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCk6RnVuY3Rpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBmdW5jdGlvbihzZXFpZDppbnQsIGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTp2b2lkIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJnczoiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdDoiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIvLyBzb3JyeSB0aGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIKKyAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAodGg6RXJyb3IpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJhY2UoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIHRoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJ2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRNYXAgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRTZXQgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUTGlzdCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5CisgICAgICAgICAgICAgIDw8ICIoIgorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaSA8PCAiOmludCA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKKyAgICBzdHJpbmcgY291bnRlciA9IHRtcCgiX3NpemVDb3VudGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGNvdW50ZXIgPDwgIjppbnQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgY291bnRlciA8PCArIisrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBjb3VudGVyIDw8ICIpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgZWFjaCAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIi50b0FycmF5KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBlYWNoICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEFzMyB0eXBlIG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPworICogQHJldHVybiBBczMgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgeworICAodm9pZClpbl9pbml0OworICAvLyBJbiBBczMgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImludCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJEaWN0aW9uYXJ5IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlNldCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiQXJyYXkiOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBBUzMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEFzMyBjb250YWluZXI/CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICAodm9pZClpbl9jb250YWluZXI7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJCeXRlQXJyYXkiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCb29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgdGhyb3cgImk2NCBpcyBub3QgeWV0IHN1cHBvcnRlZCBpbiBhczMiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIk51bWJlciI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoYXJndW1lbnRzICE9ICIiKSB7CisgICAgICBhcmd1bWVudHMgKz0gIiwgIjsKKyAgICB9CisgICAgYXJndW1lbnRzICs9ICJvbkVycm9yOkZ1bmN0aW9uLCBvblN1Y2Nlc3M6RnVuY3Rpb24iOworICB9CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gImZ1bmN0aW9uICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudHMgKyAiKTp2b2lkIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKworLyoqCisgKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCB0ZG9jLT5nZXRfZG9jKCksICIgKi9cbiIpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBBczNEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKSArICIuIjsKKyAgfQorICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgYXMzLAorICAgICJBUzMiLAorICAgICIgICAgYmluZGFibGU6ICAgICAgICBBZGQgW2JpbmRhYmxlXSBtZXRhZGF0YSB0byBhbGwgdGhlIHN0cnVjdCBjbGFzc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTNiYWQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDU4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSk7CitzdHJpbmcgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHN0cmluZyBuYW1lKTsKK3N0cmluZyB0b191cHBlcl9jYXNlKHN0cmluZyBuYW1lKTsKK3N0cmluZyB0b19sb3dlcl9jYXNlKHN0cmluZyBuYW1lKTsKKworLyoqCisgKiBDIGNvZGUgZ2VuZXJhdG9yLCB1c2luZyBnbGliIGZvciBDIHR5cGluZy4KKyAqLworY2xhc3MgdF9jX2dsaWJfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIC8qIGNvbnN0cnVjdG9yICovCisgIHRfY19nbGliX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogc2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5ICovCisgICAgdGhpcy0+b3V0X2Rpcl9iYXNlXyA9ICJnZW4tY19nbGliIjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY19nbGliOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICAvKiBzZXQgdGhlIG5hbWVzcGFjZSAqLworICAgIHRoaXMtPm5zcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKKworICAgIGlmICh0aGlzLT5uc3BhY2UuZW1wdHkoKSkgeworICAgICAgdGhpcy0+bnNwYWNlID0gIiI7CisgICAgICB0aGlzLT5uc3BhY2VfdSA9ICIiOworICAgICAgdGhpcy0+bnNwYWNlX3VjID0gIiI7CisgICAgICB0aGlzLT5uc3BhY2VfbGMgPSAiIjsKKyAgICB9IGVsc2UgeworICAgICAgLyogcmVwbGFjZSBkb3RzIHdpdGggdW5kZXJzY29yZXMgKi8KKyAgICAgIGNoYXIqIHRtcCA9IHN0cmR1cCh0aGlzLT5uc3BhY2UuY19zdHIoKSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cmxlbih0bXApOyBpKyspIHsKKyAgICAgICAgaWYgKHRtcFtpXSA9PSAnLicpIHsKKyAgICAgICAgICB0bXBbaV0gPSAnXyc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRoaXMtPm5zcGFjZSA9IHN0cmluZyh0bXAsIHN0cmxlbih0bXApKTsKKyAgICAgIGZyZWUodG1wKTsKKworICAgICAgLyogY2xlYW4gdXAgdGhlIG5hbWVzcGFjZSBmb3IgQy4KKyAgICAgICAqIEFuIGlucHV0IG9mICduYW1lc3BhY2UgZm9vJyBzaG91bGQgcmVzdWx0IGluOgorICAgICAgICogIC0gbnNwYWNlID0gZm9vICAgICAgIC0gZm9yIHRocmlmdCBvYmplY3RzIGFuZCB0eXBlZGVmcworICAgICAgICogIC0gbnNwYWNlX3UgPSBGb28gICAgIC0gZm9yIGludGVybmFsIEdPYmplY3QgcHJlZml4ZXMKKyAgICAgICAqICAtIG5zcGFjZV91YyA9IEZPT18gICAtIGZvciBtYWNybyBwcmVmaXhlcworICAgICAgICogIC0gbnNwYWNlX2xjID0gZm9vXyAgIC0gZm9yIGZpbGVuYW1lIGFuZCBtZXRob2QgcHJlZml4ZXMKKyAgICAgICAqIFRoZSB1bmRlcnNjb3JlcyBhcmUgdGhlcmUgc2luY2UgdWMgYW5kIGxjIHN0cmluZ3MgYXJlIHVzZWQgYXMgZmlsZSBhbmQKKyAgICAgICAqIHZhcmlhYmxlIHByZWZpeGVzLgorICAgICAgICovCisgICAgICB0aGlzLT5uc3BhY2VfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0aGlzLT5uc3BhY2UpOworICAgICAgdGhpcy0+bnNwYWNlX3VjID0gdG9fdXBwZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7CisgICAgICB0aGlzLT5uc3BhY2VfbGMgPSB0b19sb3dlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKKyAgICB9CisgIH0KKworICAvKiBpbml0aWFsaXphdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKworcHJpdmF0ZToKKyAgLyogZmlsZSBzdHJlYW1zICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19pbXBsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICAvKiBuYW1lc3BhY2UgdmFyaWFibGVzICovCisgIHN0cmluZyBuc3BhY2U7CisgIHN0cmluZyBuc3BhY2VfdTsKKyAgc3RyaW5nIG5zcGFjZV91YzsKKyAgc3RyaW5nIG5zcGFjZV9sYzsKKworICAvKiBoZWxwZXIgZnVuY3Rpb25zICovCisgIGJvb2wgaXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpOworICBib29sIGlzX251bWVyaWModF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgaXNfY29uc3QgPSBmYWxzZSk7CisgIHN0cmluZyBwcm9wZXJ0eV90eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgaXNfY29uc3QgPSBmYWxzZSk7CisgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X3R5cGUqIHR5cGUpOworICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSk7CisgIHN0cmluZyBjb25zdGFudF9saXRlcmFsKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdHJpbmcgY29uc3RhbnRfdmFsdWUoc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdHJpbmcgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0cmluZyB4Y2VwdGlvbl9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UgPSBmYWxzZSk7CisgIHZvaWQgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgYmFzZV9uYW1lLCBib29sIGZvcl9oYXNoX3RhYmxlKTsKKyAgdm9pZCBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgYmFzZV9uYW1lKTsKKworICAvKiBnZW5lcmF0aW9uIGZ1bmN0aW9ucyAqLworICB2b2lkIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRvcF9sZXZlbCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX29iamVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24gPSB0cnVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGVsZW1lbnQsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUgPSB0cnVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisKKyAgc3RyaW5nIGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSh0X3R5cGUqIGtleSwgdF90eXBlKiB2YWx1ZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgZ2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RyaW5nIGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKK307CisKKy8qKgorICogUHJlcGFyZSBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlCisgKiBvdXRwdXQgc3RyZWFtcy4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvKiBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSAqLworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7CisKKyAgLyogY3JlYXRlIG91dHB1dCBmaWxlcyAqLworICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYyArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuaCI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgdGhpcy0+bnNwYWNlX2xjICsgcHJvZ3JhbV9uYW1lX2xjICsgIl90eXBlcy5jIjsKKyAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOworCisgIC8qIGFkZCB0aHJpZnQgYm9pbGVycGxhdGUgaGVhZGVycyAqLworICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl90eXBlc19pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvKiBpbmNsdWRlIGluY2x1c2lvbiBndWFyZCAqLworICBmX3R5cGVzXyA8PCAiI2lmbmRlZiAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgZW5kbDsKKworICAvKiBpbmNsdWRlIGJhc2UgdHlwZXMgKi8KKyAgZl90eXBlc18gPDwgIi8qIGJhc2UgaW5jbHVkZXMgKi8iIDw8IGVuZGwgPDwgIiNpbmNsdWRlIDxnbGliLW9iamVjdC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+IiA8PCBlbmRsOworCisgIC8qIGluY2x1ZGUgb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGlmICghaW5jbHVkZXMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8ICIvKiBvdGhlciB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGw7CisKKyAgICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOworICAgICAgICAgKytpdGVyKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5jbHVkZV9uc3BhY2UgPSAoKml0ZXIpLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfbnNwYWNlX3ByZWZpeCA9CisgICAgICAgIGluY2x1ZGVfbnNwYWNlLmVtcHR5KCkgPyAiIiA6IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhpbmNsdWRlX25zcGFjZSkgKyAiXyI7CisKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgaW5jbHVkZV9uc3BhY2VfcHJlZml4CisgICAgICAgICAgICAgICA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCppdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKworICAvKiBpbmNsdWRlIGN1c3RvbSBoZWFkZXJzICovCisgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jX2luY2x1ZGVzKCk7CisgIGZfdHlwZXNfIDw8ICIvKiBjdXN0b20gdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoY19pbmNsdWRlc1tpXVswXSA9PSAnPCcpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSAiIDw8IGNfaW5jbHVkZXNbaV0gPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBjX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvKiBpbmNsdWRlIG1hdGguaCAoZm9yICJJTkZJTklUWSIpIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLCBpbiBjYXNlIHdlCisgICAgIGVuY291bnRlciBhIHN0cnVjdCB3aXRoIGEgbWVtYmVyIG9mIHR5cGUgZG91YmxlICovCisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCAiI2luY2x1ZGUgPG1hdGguaD4iIDw8IGVuZGw7CisKKyAgLy8gaW5jbHVkZSB0aGUgdHlwZXMgZmlsZQorICBmX3R5cGVzX2ltcGxfIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgcHJvZ3JhbV9uYW1lX3UgPDwgIl90eXBlcy5oXCIiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc18gPDwgIi8qIGJlZ2luIHR5cGVzICovIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogIEZpbmlzaCB1cCBnZW5lcmF0aW9uIGFuZCBjbG9zZSBhbGwgZmlsZSBzdHJlYW1zLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXykpOworCisgIC8qIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZCAqLworICBmX3R5cGVzXyA8PCAiI2VuZGlmIC8qICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0ggKi8iIDw8IGVuZGw7CisKKyAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl90eXBlc19pbXBsXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIFRocmlmdCB0eXBlZGVmIGluIEMgY29kZS4gIEZvciBleGFtcGxlOgorICoKKyAqIFRocmlmdDoKKyAqIHR5cGVkZWYgbWFwPGkzMixpMzI+IFNvbWVNYXAKKyAqCisgKiBDOgorICogdHlwZWRlZiBHSGFzaFRhYmxlICogVGhyaWZ0U29tZU1hcDsKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBDIGVudW1lcmF0aW9uLiAgRm9yIGV4YW1wbGU6CisgKgorICogVGhyaWZ0OgorICogZW51bSBNeUVudW0geworICogICBPTkUgPSAxLAorICogICBUV08KKyAqIH0KKyAqCisgKiBDOgorICogZW51bSBfVGhyaWZ0TXlFbnVtIHsKKyAqICAgVEhSSUZUX01ZX0VOVU1fT05FID0gMSwKKyAqICAgVEhSSUZUX01ZX0VOVU1fVFdPCisgKiB9OworICogdHlwZWRlZiBlbnVtIF9UaHJpZnRNeUVudW0gVGhyaWZ0TXlFbnVtOworICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSkpOworCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIC8qIG91dHB1dCBlYWNoIG9mIHRoZSBlbnVtZXJhdGlvbiBlbGVtZW50cyAqLworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl8iIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX3R5cGVzXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzXyA8PCAiLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCAqLyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInRvU3RyaW5nXyIgPDwgbmFtZSA8PCAiKGludCB2YWx1ZSk7ICIgPDwgZW5kbCA8PCBlbmRsOworICA7CisgIGZfdHlwZXNfaW1wbF8gPDwgIi8qIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQgKi8iIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAidG9TdHJpbmdfIiA8PCBuYW1lIDw8ICIoaW50IHZhbHVlKSAiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgInsiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3RhdGljIF9fdGhyZWFkIGNoYXIgYnVmWzE2XSA9IHswfTsiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3dpdGNoKHZhbHVlKSB7IiA8PCBlbmRsOworICBzdGQ6OnNldDxpbnQ+IGRvbmU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAvLyBTa2lwcGluZyBkdXBsaWNhdGUgdmFsdWUKKyAgICBpZiAoZG9uZS5maW5kKHZhbHVlKSA9PSBkb25lLmVuZCgpKSB7CisgICAgICBkb25lLmluc2VydCh2YWx1ZSk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8ICIgIGNhc2UgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICI6IgorICAgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIFwiIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJcIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgZGVmYXVsdDogZ19zbnByaW50ZihidWYsIDE2LCBcIiVkXCIsIHZhbHVlKTsgcmV0dXJuIGJ1ZjsiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBUaHJpZnQgY29uc3RhbnRzIGluIEMgY29kZS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBmX3R5cGVzXyA8PCAiLyogY29uc3RhbnRzICovIiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lKTsKKyAgICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZSk7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGlmIChpc19jb21wbGV4X3R5cGUodHlwZSkpIHsKKyAgICAgIGZfdHlwZXNfIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudCgpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICIgIgorICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKG5hbWVfbGMsIHR5cGUsIHZhbHVlKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIobmFtZV9sYywgdHlwZSwgdmFsdWUsIHRydWUpOworICB9CisKKyAgZl90eXBlc18gPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIFRocmlmdCBzdHJ1Y3RzIGluIEMgY29kZSwgYXMgR09iamVjdHMuICBFeGFtcGxlOgorICoKKyAqIFRocmlmdDoKKyAqIHN0cnVjdCBCb25rCisgKiB7CisgKiAgIDE6IHN0cmluZyBtZXNzYWdlLAorICogICAyOiBpMzIgdHlwZQorICogfQorICoKKyAqIEMgR09iamVjdCBpbnN0YW5jZSBoZWFkZXI6CisgKiBzdHJ1Y3QgX1RocmlmdEJvbmsKKyAqIHsKKyAqICAgR09iamVjdCBwYXJlbnQ7CisgKgorICogICBnY2hhciAqIG1lc3NhZ2U7CisgKiAgIGdpbnQzMiB0eXBlOworICogfTsKKyAqIHR5cGVkZWYgc3RydWN0IF9UaHJpZnRCb25rIFRocmlmdEJvbmsKKyAqIC8vIC4uLiBhZGRpdGlvbmFsIEdPYmplY3QgYm9pbGVycGxhdGUgLi4uCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZl90eXBlc18gPDwgIi8qIHN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfb2JqZWN0KHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlIEMgY29kZSB0byByZXByZXNlbnQgVGhyaWZ0IHNlcnZpY2VzLiAgQ3JlYXRlcyBhIG5ldyBHT2JqZWN0CisgKiB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHNlcnZpY2UuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHN2Y25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0c2VydmljZS0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBzdmNuYW1lX3VjID0gdGhpcy0+bnNwYWNlX3VjICsgdG9fdXBwZXJfY2FzZShzdmNuYW1lX3UpOworICBzdHJpbmcgZmlsZW5hbWUgPSB0aGlzLT5uc3BhY2VfbGMgKyB0b19sb3dlcl9jYXNlKHN2Y25hbWVfdSk7CisKKyAgLy8gbWFrZSBvdXRwdXQgZmlsZXMKKyAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpICsgZmlsZW5hbWUgKyAiLmgiOworICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBwcm9ncmFtX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyhwcm9ncmFtX25hbWVfKTsKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOworCisgIC8vIGFkZCBoZWFkZXIgZmlsZSBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gYWRkIGFuIGluY2x1c2lvbiBndWFyZAorICBmX2hlYWRlcl8gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIGFkZCBzdGFuZGFyZCBpbmNsdWRlcworICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmg+IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfbGMgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisKKyAgLy8gaWYgd2UgYXJlIGluaGVyaXRpbmcgZnJvbSBhbm90aGVyIHNlcnZpY2UsIGluY2x1ZGUgaXRzIGhlYWRlcgorICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMKKyAgICAgICAgICAgICAgPDwgdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpKSkgPDwgIi5oXCIiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuYyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAvLyBhZGQgdGhlIGJvaWxlcnBsYWNlIGhlYWRlcgorICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIC8vIGluY2x1ZGUgdGhlIGhlYWRlcnMKKyAgZl9zZXJ2aWNlXyA8PCAiI2luY2x1ZGUgPHN0cmluZy5oPiIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4iIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIgorICAgICAgICAgICAgIDw8IGZpbGVuYW1lIDw8ICIuaFwiIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHNlcnZpY2UtaGVscGVyIGNsYXNzZXMKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICAvLyBnZW5lcmF0ZSB0aGUgY2xpZW50IG9iamVjdHMKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworCisgIC8vIGdlbmVyYXRlIHRoZSBzZXJ2ZXIgb2JqZWN0cworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgLy8gZW5kIHRoZSBoZWFkZXIgaW5jbHVzaW9uIGd1YXJkCisgIGZfaGVhZGVyXyA8PCAiI2VuZGlmIC8qICIgPDwgc3ZjbmFtZV91YyA8PCAiX0ggKi8iIDw8IGVuZGw7CisKKyAgLy8gY2xvc2UgdGhlIGZpbGVzCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgZl9oZWFkZXJfLmNsb3NlKCk7Cit9CisKKy8qKgorICoKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWVfdSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworCisgIGdlbmVyYXRlX29iamVjdCh0c3RydWN0KTsKKworICBmX3R5cGVzXyA8PCAiLyogZXhjZXB0aW9uICovIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJ0eXBlZGVmIGVudW0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SX0NPREUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8ICJ9ICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkVycm9yOyIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJHUXVhcmsgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrICh2b2lkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SICgiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfZXJyb3JfcXVhcmsoKSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsOworCisgIGZfdHlwZXNfaW1wbF8gPDwgIi8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgZXhjZXB0aW9ucyAqLyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUl9ET01BSU4gXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgICAgICAgPDwgIl9lcnJvcl9xdWFya1wiIiA8PCBlbmRsIDw8ICJHUXVhcmsiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKKyAgICAgICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrICh2b2lkKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICAgICAgIDw8ICJfRVJST1JfRE9NQUlOKTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqCisgKiBIRUxQRVIgRlVOQ1RJT05TICoKKyAqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdHR5cGUgaXMgbm90IGEgcHJpbWl0aXZlLgorICovCitib29sIHRfY19nbGliX2dlbmVyYXRvcjo6aXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKTsKK30KKworYm9vbCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmlzX251bWVyaWModF90eXBlKiB0dHlwZSkgeworICByZXR1cm4gdHR5cGUtPmlzX2VudW0oKSB8fCAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0dHlwZS0+aXNfc3RyaW5nKCkpOworfQorCisvKioKKyAqIE1hcHMgYSBUaHJpZnQgdF90eXBlIHRvIGEgQyB0eXBlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGlzX2NvbnN0KSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgYm5hbWUgPSBiYXNlX3R5cGVfbmFtZSh0dHlwZSk7CisKKyAgICBpZiAoaXNfY29uc3QpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYm5hbWU7CisgICAgfQorICB9CisKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIHN0cmluZyBjbmFtZTsKKworICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKKyAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGNuYW1lID0gIkdIYXNoVGFibGUiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAvLyBzaW5jZSBhIHNldCByZXF1aXJlcyB1bmlxdWUgZWxlbWVudHMsIHVzZSBhIEdIYXNoVGFibGUsIGFuZAorICAgICAgLy8gcG9wdWxhdGUgdGhlIGtleXMgYW5kIHZhbHVlcyB3aXRoIHRoZSBzYW1lIGRhdGEsIHVzaW5nIGtleXMgZm9yCisgICAgICAvLyB0aGUgYWN0dWFsIHdyaXRlcyBhbmQgcmVhZHMuCisgICAgICAvLyBUT0RPOiBkaXNjdXNzIHdoZXRoZXIgb3Igbm90IHRvIGltcGxlbWVudCBUU2V0LCBUSGFzaFNldCBvciBHSGFzaFNldAorICAgICAgY25hbWUgPSAiR0hhc2hUYWJsZSI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICB0X3R5cGUqIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgaWYgKGV0eXBlLT5pc192b2lkKCkpIHsKKyAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgICAgIH0KKyAgICAgIC8vIFRPRE86IGludmVzdGlnYXRlIG90aGVyIGltcGxlbWVudGF0aW9ucyBiZXNpZGVzIEdQdHJBcnJheQorICAgICAgY25hbWUgPSBpc19udW1lcmljKGV0eXBlKSA/ICJHQXJyYXkiIDogIkdQdHJBcnJheSI7CisgICAgfQorCisgICAgLyogT21pdCB0aGUgZGVyZWZlcmVuY2Ugb3BlcmF0b3IgaWYgd2UgYXJlIGFsaWFzaW5nIHRoaXMgdHlwZSB3aXRoaW4gYQorICAgICAgIHR5cGVkZWYsIHRvIGFsbG93IHRoZSB0eXBlIHRvIGJlIHVzZWQgbW9yZSBuYXR1cmFsbHkgaW4gY2xpZW50IGNvZGU7CisgICAgICAgb3RoZXJ3aXNlLCBpbmNsdWRlIGl0ICovCisgICAgaWYgKCFpbl90eXBlZGVmKSB7CisgICAgICBjbmFtZSArPSAiICoiOworICAgIH0KKworICAgIGlmIChpc19jb25zdCkgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjbmFtZTsKKyAgICB9CisgIH0KKworICAvLyBjaGVjayBmb3IgYSBuYW1lc3BhY2UKKyAgdF9wcm9ncmFtKiB0cHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBzdHJpbmcgcG5hbWUgPSAodHByb2dyYW0gPyB0cHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY19nbGliIikgOiAiIikgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKworICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgeworICAgIHBuYW1lICs9ICIgKiI7CisgIH0KKworICBpZiAoaXNfY29uc3QpIHsKKyAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcG5hbWU7CisgIH0KK30KKworLyoqCisgKiBNYXBzIGEgVGhyaWZ0IHByaW1pdGl2ZSB0byB0aGUgdHlwZSBuZWVkZWQgdG8gaG9sZCBpdHMgdmFsdWUgd2hlbiB1c2VkIGFzIGFuCisgKiBvYmplY3QgcHJvcGVydHkuCisgKgorICogVGhpcyBtZXRob2QgaXMgbmVlZGVkIGJlY2F1c2UgYWxsIGludGVnZXIgcHJvcGVydGllcyBvZiB3aWR0aCBsZXNzIHRoYW4gNjQKKyAqIGJpdHMgbWFwIHRvIHRoZSBzYW1lIHR5cGUsIGdpbnQsIGFzIG9wcG9zZWQgdG8gdGhlaXIgd2lkdGgtc3BlY2lmaWMgdHlwZQorICogKGdpbnQ4LCBnaW50MTYgb3IgZ2ludDMyKS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6cHJvcGVydHlfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBpc19jb25zdCkgeworICBzdHJpbmcgcmVzdWx0OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBpZiAoaXNfY29uc3QpIHsKKyAgICAgICAgcmVzdWx0ID0gImNvbnN0IGdpbnQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gImdpbnQiOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBpc19jb25zdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSwgaW5fdHlwZWRlZiwgaXNfY29uc3QpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBNYXBzIGEgVGhyaWZ0IHByaW1pdGl2ZSB0byBhIEMgcHJpbWl0aXZlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUodHlwZSk7CisgIH0KKyAgaWYgKCF0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiT25seSBiYXNlIHR5cGVzIGFyZSBzdXBwcG9ydGVkLiIpOworICB9CisgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSByZWludGVycHJldF9jYXN0PHRfYmFzZV90eXBlKj4odHlwZSk7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBiYXNlX3R5cGUtPmdldF9iYXNlKCk7CisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIkdCeXRlQXJyYXkgKiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZ2NoYXIgKiI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJnYm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJnaW50OCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiZ2ludDE2IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJnaW50MzIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImdpbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZ2RvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiY29tcGlsZXIgZXJyb3I6IG5vIEMgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIG1lbWJlciBvZiB0aGUgVGhyaWZ0VHlwZSBDIGVudW1lcmF0aW9uIGluIHRocmlmdF9wcm90b2NvbC5oCisgKiBmb3IgYSBUaHJpZnQgdHlwZS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUX0JPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRfQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVF9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUX0k2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRfRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUX0kzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gIlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVF9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVF9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgVGhyaWZ0IGNvbnN0YW50IGZvcm1hdHRlZCBhcyBhIGxpdGVyYWwgZm9yIGluY2x1c2lvbiBpbiBDIGNvZGUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNvbnN0YW50X2xpdGVyYWwodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvKiBwcmltaXRpdmVzICovCisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICJcIiIgKyB2YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHZhbHVlX3R5cGUgPSB2YWx1ZS0+Z2V0X3R5cGUoKTsKKworICAgIHN3aXRjaCAodmFsdWVfdHlwZSkgeworICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICAgIHJlbmRlciA8PCAieyAiOworICAgICAgeworICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGxpc3RfaXRlcjsKKworICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgbGlzdF9pdGVyID0gbGlzdC5iZWdpbigpOworICAgICAgICAgIHJlbmRlciA8PCBjb25zdGFudF9saXRlcmFsKGVsZW1fdHlwZSwgKmxpc3RfaXRlcik7CisKKyAgICAgICAgICB3aGlsZSAoKytsaXN0X2l0ZXIgIT0gbGlzdC5lbmQoKSkgeworICAgICAgICAgICAgcmVuZGVyIDw8ICIsICIgPDwgY29uc3RhbnRfbGl0ZXJhbChlbGVtX3R5cGUsICpsaXN0X2l0ZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVuZGVyIDw8ICIgfSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICBkZWZhdWx0OgorICAgICAgcmVuZGVyIDw8ICJOVUxMIC8qIG5vdCBzdXBwb3J0ZWQgKi8iOworICAgIH0KKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogUmV0dXJucyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IGNvbnN0YW50LgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvKiBwcmltaXRpdmVzICovCisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiZ19zdHJkdXAgKFwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gMSA6IDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8ICJHX0dJTlQ2NF9DT05TVEFOVCAoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAoaXNfY29tcGxleF90eXBlKHR5cGUpKSB7CisgICAgcmVuZGVyIDw8ICIoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgdG9fbG93ZXJfY2FzZShuYW1lKSA8PCAiX2NvbnN0YW50KCkpIjsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXIgPDwgIk5VTEwgLyogbm90IHN1cHBvcnRlZCAqLyI7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogYXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgdF9zdHJ1Y3QqIHhsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIHN0cmluZyBmbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgIHJldHVybiAiZ2Jvb2xlYW4gIiArIHRoaXMtPm5zcGFjZV9sYyArIGZuYW1lICsgIiAoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKiBpZmFjZSIKKyAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKiBlcnJvcikiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpICsgIiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBtdXRhYmxlIGV4Y2VwdGlvbiBsaXN0cworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0CisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnhjZXB0aW9uX2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiKiAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgaW5jbHVkaW5nIGFueSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBpZiAoY29uc3RhbnQpIHsKKyAgICByZXN1bHQgKz0gImNvbnN0ICI7CisgIH0KKyAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAocG9pbnRlcikgeworICAgIHJlc3VsdCArPSAiKiI7CisgIH0KKyAgaWYgKHJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiKiI7CisgIH0KKyAgcmVzdWx0ICs9ICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChnZG91YmxlKSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBOVUxMIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgaW50aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR5cGUpICsgIikgMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBOVUxMIjsKKyAgICB9CisgIH0KKworICBpZiAoIXJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiOyI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2Uoc3RyaW5nIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CisgIGlmIChpc19udW1lcmljKGV0eXBlKSkgeworICAgIHJlbmRlciA8PCAiICAgICIgPDwgdHlwZV9uYW1lKGV0eXBlKSA8PCAiICoiIDw8IGZuYW1lIDw8ICIgPSAiCisgICAgICAgICAgIDw8ICJnX25ldyAoIiA8PCBiYXNlX3R5cGVfbmFtZShldHlwZSkgPDwgIiwgMSk7IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIgICAgKiIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCB2YWx1ZSkgPDwgIjsiCisgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIgorICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCBpbml0aWFsaXplcyBjb21wbGV4IGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRvcF9sZXZlbCkgeworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKKyAgc3RyaW5nIHR5cGVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHR5cGVfdWMgPSB0b191cHBlcl9jYXNlKHR5cGVfdSk7CisgIHN0cmluZyBtYXliZV9zdGF0aWMgPSB0b3BfbGV2ZWwgPyAiIiA6ICJzdGF0aWMgIjsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworCisgICAgLy8gaW5pdGlhbGl6ZSBhbnkgY29uc3RhbnRzIHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgYnkgdGhpcyBpbml0aWFsaXplcgorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSAiIjsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgorICAgICAgICAgICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgZmllbGRfbmFtZSA9IHRtcChmaWVsZF9uYW1lKTsKKworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5pdGlhbGl6ZXJzIDw8ICIgICAgY29uc3RhbnQtPiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCAiICAgIGNvbnN0YW50LT5fX2lzc2V0XyIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpCisgICAgICAgICAgICAgICAgICAgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIGltcGxlbWVudCB0aGUgaW5pdGlhbGl6ZXIKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiICoiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgIiA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjb25zdGFudCA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgICAgIDw8ICJUWVBFXyIgPDwgdHlwZV91YyA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluaXRpYWxpemVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9ICIiOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBmaWVsZF9uYW1lID0gdG1wKGZpZWxkX25hbWUpOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGxpc3RfdHlwZSA9ICJHUHRyQXJyYXkgKiI7CisgICAgc3RyaW5nIGZyZWVfZnVuYworICAgICAgICA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUocmVpbnRlcnByZXRfY2FzdDx0X2xpc3QqPih0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBzdHJpbmcgbGlzdF9pbml0aWFsaXplciA9ICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKCIgKyBmcmVlX2Z1bmMgKyAiKTsiOworICAgIHN0cmluZyBsaXN0X2FwcGVuZGVyID0gImdfcHRyX2FycmF5X2FkZCI7CisgICAgYm9vbCBsaXN0X3ZhcmlhYmxlID0gZmFsc2U7CisKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworICAgIG9zdHJpbmdzdHJlYW0gYXBwZW5kZXJzOworCisgICAgbGlzdF9pbml0aWFsaXplciA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUoZXR5cGUpOworICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgbGlzdF90eXBlID0gIkdBcnJheSAqIjsKKyAgICAgICAgbGlzdF9hcHBlbmRlciA9ICJnX2FycmF5X2FwcGVuZF92YWwiOworICAgICAgICBsaXN0X3ZhcmlhYmxlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2VudW0oKSkgeworICAgICAgbGlzdF90eXBlID0gIkdBcnJheSAqIjsKKyAgICAgIGxpc3RfYXBwZW5kZXIgPSAiZ19hcnJheV9hcHBlbmRfdmFsIjsKKyAgICAgIGxpc3RfdmFyaWFibGUgPSB0cnVlOworICAgIH0KKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7CisKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKKyAgICAgIGlmIChsaXN0X3ZhcmlhYmxlKSB7CisgICAgICAgIGluaXRpYWxpemVycyA8PCAiICAgICIgPDwgdHlwZV9uYW1lKGV0eXBlKSA8PCAiICIgPDwgZm5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGFwcGVuZGVycyA8PCAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiIDw8IGZuYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcHBlbmRlcnMgPDwgIiAgICAiIDw8IGxpc3RfYXBwZW5kZXIgPDwgIihjb25zdGFudCwgIgorICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAoKnZfaXRlcikpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgbGlzdF90eXBlIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IGxpc3RfdHlwZSA8PCAiIGNvbnN0YW50ID0gTlVMTDsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGlmICghaW5pdGlhbGl6ZXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBsaXN0X2luaXRpYWxpemVyIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGFwcGVuZGVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisgICAgb3N0cmluZ3N0cmVhbSBhcHBlbmRlcnM7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGZuYW1lID0gdG1wKG5hbWUpOworICAgICAgc3RyaW5nIHB0ciA9IGlzX251bWVyaWMoZXR5cGUpID8gIioiIDogIiI7CisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihmbmFtZSwgZXR5cGUsICgqdl9pdGVyKSk7CisgICAgICBpbml0aWFsaXplcnMgPDwgY29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKGZuYW1lLCAodF90eXBlKilldHlwZSwgKnZfaXRlcik7CisgICAgICBhcHBlbmRlcnMgPDwgIiAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb25zdGFudCwgIiA8PCBmbmFtZSA8PCAiLCAwKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgIkdIYXNoVGFibGUgKiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoZXR5cGUsIE5VTEwpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGFwcGVuZGVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKKyAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7CisgICAgICBzdHJpbmcga25hbWUgPSBmbmFtZSArICJrZXkiOworICAgICAgc3RyaW5nIHZuYW1lID0gZm5hbWUgKyAidmFsIjsKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGtuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcih2bmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKworICAgICAgaW5pdGlhbGl6ZXJzIDw8IGNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZShrbmFtZSwgKHRfdHlwZSopa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgaW5pdGlhbGl6ZXJzIDw8IGNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZSh2bmFtZSwgKHRfdHlwZSopdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGFwcGVuZGVycyA8PCAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAiIDw8IGtuYW1lIDw8ICIsICIgPDwgdm5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgbWF5YmVfc3RhdGljIDw8ICJHSGFzaFRhYmxlICoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyBHSGFzaFRhYmxlICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjb25zdGFudCA9ICIgPDwgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGt0eXBlLCB2dHlwZSkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgY2xhc3NlcyBmb3IgYSBzZXJ2aWNlLCBjb25zaXN0aW5nIG9mIGEgVGhyaWZ0U3RydWN0IHN1YmNsYXNzCisgKiBmb3IgdGhlIGFyZ3VtZW50cyB0byBhbmQgdGhlIHJlc3VsdCBmcm9tIGVhY2ggbWV0aG9kLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgaGVscGVyIGNsYXNzZXMKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKKworICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHNlcnZpY2UncyBtZXRob2RzCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIGFyZ19saXN0X25hbWVfb3JpZyA9IGFyZ19saXN0LT5nZXRfbmFtZSgpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGFyZ3VtZW50cyBjbGFzcworICAgIGFyZ19saXN0LT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhmdW5jdGlvbl9uYW1lKSArICJBcmdzIik7CisgICAgZ2VuZXJhdGVfc3RydWN0KGFyZ19saXN0KTsKKworICAgIGFyZ19saXN0LT5zZXRfbmFtZShhcmdfbGlzdF9uYW1lX29yaWcpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIHJlc3VsdCBjbGFzcworICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywKKyAgICAgICAgICAgICAgICAgICAgICB0c2VydmljZS0+Z2V0X25hbWUoKSArIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhmdW5jdGlvbl9uYW1lKSArICJSZXN1bHQiKTsKKyAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICAgICAgc3VjY2Vzcy5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcjsKKyAgICAgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgICAgICgqZmllbGRfaXRlciktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoKmZpZWxkX2l0ZXIpOworICAgICAgfQorCisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoJnJlc3VsdCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBjbGllbnQuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8qIGdldCBzb21lIEMgZnJpZW5kbHkgc2VydmljZSBuYW1lcyAqLworICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOworICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOworCisgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lOworICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYzsKKyAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWM7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lID0gIkdPYmplY3QiOworICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZSA9ICJHX1RZUEVfT0JKRUNUIjsKKworICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vCisgIC8vIHNlcnZpY2UKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgc2VydmljZQorICAgIHBhcmVudF9zZXJ2aWNlX25hbWUgPSBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHBhcmVudF9zZXJ2aWNlX25hbWUpKTsKKyAgICBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKKworICAgIC8vIFRoZSBuYW1lcyBvZiB0aGUgY2xpZW50IGNsYXNzJyBwYXJlbnQgY2xhc3MgYW5kIHR5cGUKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHBhcmVudF9zZXJ2aWNlX25hbWUgKyAiQ2xpZW50IjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX0NMSUVOVCI7CisgIH0KKworICAvLyBUaGUgYmFzZSBzZXJ2aWNlICh0aGUgdG9wbW9zdCBpbiB0aGUgImV4dGVuZHMiIGhpZXJhcmNoeSksIG9uCisgIC8vIHdob3NlIGNsaWVudCBjbGFzcyB0aGUgImlucHV0X3Byb3RvY29sIiBhbmQgIm91dHB1dF9wcm90b2NvbCIKKyAgLy8gcHJvcGVydGllcyBhcmUgZGVmaW5lZAorICB0X3NlcnZpY2UqIGJhc2Vfc2VydmljZSA9IHRzZXJ2aWNlOworICB3aGlsZSAoYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgYmFzZV9zZXJ2aWNlID0gYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICB9CisKKyAgc3RyaW5nIGJhc2Vfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlLT5nZXRfbmFtZSgpOworICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhiYXNlX3NlcnZpY2VfbmFtZSkpOworICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGJhc2Vfc2VydmljZV9uYW1lX2xjKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBkdW1teSBvYmplY3QgaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBzZXJ2aWNlIGludGVyZmFjZSAqLyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsgIgorICAgICAgICAgICAgPDwgIiAvKiBkdW1teSBvYmplY3QgKi8iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBvYmplY3QgaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiICBHVHlwZUludGVyZmFjZSBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogd3JpdGUgb3V0IHRoZSBmdW5jdGlvbnMgZm9yIHRoaXMgaW50ZXJmYWNlICovCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImdib29sZWFuICgqIiA8PCBmdW5uYW1lIDw8ICIpICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBhbGwgdGhlIGludGVyZmFjZSBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYgIgorICAgICAgICAgICAgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmKSkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGX0dFVF9JTlRFUkZBQ0UoaW5zdCkgKEdfVFlQRV9JTlNUQU5DRV9HRVRfSU5URVJGQUNFICgoaW5zdCksICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHdyaXRlIG91dCBhbGwgdGhlIGludGVyZmFjZSBmdW5jdGlvbiBwcm90b3R5cGVzCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfIiA8PCBmdW5uYW1lIDw8ICIgIgorICAgICAgICAgICAgICA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsaWVudCBvYmplY3QgaW5zdGFuY2UgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgY2xpZW50ICovIiA8PCBlbmRsIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgIiA8PCBwYXJlbnRfY2xhc3NfbmFtZQorICAgICAgICAgICAgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIERlZmluZSAiaW5wdXRfcHJvdG9jb2wiIGFuZCAib3V0cHV0X3Byb3RvY29sIiBwcm9wZXJ0aWVzIG9ubHkKKyAgICAvLyBmb3IgYmFzZSBzZXJ2aWNlczsgY2hpbGQgc2VydmljZS1jbGllbnQgY2xhc3NlcyB3aWxsIGluaGVyaXQKKyAgICAvLyB0aGVzZQorICAgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgIFRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgIiAgVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbDsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiAgIiA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENyZWF0ZSBhbGwgdGhlIEdPYmplY3QgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQgIgorICAgICAgICAgICAgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3R5cGUoKSkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVChvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCkpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lTX0NMSUVOVChvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UX0NMQVNTKGMpICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xJRU5UKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMSUVOVF9HRVRfQ0xBU1Mob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogd3JpdGUgb3V0IHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzICovCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKKworICAgIHRfZnVuY3Rpb24gc2VydmljZV9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VydmljZV9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9zZW5kXyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOworCisgICAgLy8gaW1wbGVtZW50IHJlY3YgaWYgbm90IGEgb25ld2F5IHNlcnZpY2UKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9yZWN2XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLyogd3JpdGUgb3V0IHRoZSBnZXQvc2V0IGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyAgZl9oZWFkZXJfIDw8ICJ2b2lkICIgKyBzZXJ2aWNlX25hbWVfbGMgKyAiX2NsaWVudF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAidm9pZCAiICsgc2VydmljZV9uYW1lX2xjICsgIl9jbGllbnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlfaWQsIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKTsiCisgICAgICAgICAgICA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBlbmRsOworICAvLyBlbmQgb2YgaGVhZGVyIGNvZGUKKworICAvLyBHZW5lcmF0ZSBpbnRlcmZhY2UgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBzdHJpbmcgcGFyYW1zX3dpdGhvdXRfdHlwZSA9IHN0cmluZygiaWZhY2UsICIpICsgKGhhc19yZXR1cm4gPyAiX3JldHVybiwgIiA6ICIiKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyX2ZpZWxkOworICAgIGZvciAoZl9pdGVyX2ZpZWxkID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlcl9maWVsZCAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyX2ZpZWxkKSB7CisgICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICgqZl9pdGVyX2ZpZWxkKS0+Z2V0X25hbWUoKTsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gIiwgIjsKKyAgICB9CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgImdib29sZWFuIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl8iIDw8IGZ1bm5hbWUKKyAgICAgICAgICAgICAgIDw8ICIgIiA8PCBwYXJhbXMgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICByZXR1cm4gIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGX0dFVF9JTlRFUkZBQ0UgKGlmYWNlKS0+IiA8PCBmdW5uYW1lIDw8ICIgKCIKKyAgICAgICAgICAgICAgIDw8IHBhcmFtc193aXRob3V0X3R5cGUgPDwgImVycm9yKTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGludGVyZmFjZSBib2lsZXJwbGF0ZQorICBmX3NlcnZpY2VfIDw8ICJHVHlwZSIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUgKHZvaWQpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOyIgPDwgZW5kbCA8PCAiICBpZiAodHlwZSA9PSAwKSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9IiA8PCBlbmRsIDw8ICIgICAgeyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlKSwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGJhc2VfZmluYWxpemUgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2luaXQgKi8iIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBjbGFzc19maW5hbGl6ZSAqLyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogY2xhc3NfZGF0YSAqLyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAwLCAgICAgLyogaW5zdGFuY2Vfc2l6ZSAqLyIgPDwgZW5kbCA8PCAiICAgICAgMCwgICAgIC8qIG5fcHJlYWxsb2NzICovIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBpbnN0YW5jZV9pbml0ICovIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwgICAvKiB2YWx1ZV90YWJsZSAqLyIgPDwgZW5kbCA8PCAiICAgIH07IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR19UWVBFX0lOVEVSRkFDRSwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmXCIsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaW5mbywgMCk7IiA8PCBlbmRsIDw8ICIgIH0iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICByZXR1cm4gdHlwZTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgYm9pbGVycGxhdGUKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgPDwgIkNsaWVudCwgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50LCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCBwYXJlbnRfdHlwZV9uYW1lIDw8ICIsICIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPDwgdGhpcy0+bnNwYWNlX2xjCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb3BlcnR5LXJlbGF0ZWQgY29kZSBvbmx5IGZvciBiYXNlIHNlcnZpY2VzLS0tY2hpbGQKKyAgLy8gc2VydmljZS1jbGllbnQgY2xhc3NlcyBoYXZlIG9ubHkgcHJvcGVydGllcyBpbmhlcml0ZWQgZnJvbSB0aGVpcgorICAvLyBwYXJlbnQgY2xhc3MKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICAvLyBHZW5lcmF0ZSBjbGllbnQgcHJvcGVydGllcworICAgIGZfc2VydmljZV8gPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudFByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIFBST1BfMCwiIDw8IGVuZGwgPDwgIiAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCIgPDwgZW5kbCA8PCAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MIiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyCisgICAgZl9zZXJ2aWNlXyA8PCAidm9pZCIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoIgorICAgICAgICAgICAgICAgPDwgIkdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsIGNvbnN0IEdWYWx1ZSAqdmFsdWUsICIKKyAgICAgICAgICAgICAgIDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAqY2xpZW50ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICBzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbCA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIKKyAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0w6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgY2xpZW50LT5pbnB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBjbGllbnQtPm91dHB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICB9IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBnZXR0ZXIKKyAgICBmX3NlcnZpY2VfIDw8ICJ2b2lkIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3Byb3BlcnR5ICgiCisgICAgICAgICAgICAgICA8PCAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgIgorICAgICAgICAgICAgICAgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIgorICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPmlucHV0X3Byb3RvY29sKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0w6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICB9IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMgYW5kIGV4Y2VwdGlvbnMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfc2VuZF8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICAvLyBPcGVuIHRoZSBzZW5kIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIHN0cmluZyByZXFUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUX09ORVdBWSIgOiAiVF9DQUxMIjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdpbnQzMiBjc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBiYXNlX3NlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKGlmYWNlKS0+b3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgXCIiIDw8IG5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCByZXFUeXBlIDw8ICIsIGNzZXFpZCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl9zZXJ2aWNlXywgYXJnX3N0cnVjdCwgIiIsICIiLCBmYWxzZSk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBUUlVFOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gYXN5bmMgZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9yZWN2XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJzZXFpZDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdjaGFyICogZm5hbWUgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRQcm90b2NvbCAqIHByb3RvY29sID0gIgorICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgYmFzZV9zZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKGlmYWNlKS0+aW5wdXRfcHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luICIKKyAgICAgICAgICAgICAgICAgICAgIihwcm90b2NvbCwgJmZuYW1lLCAmbXR5cGUsICZyc2VxaWQsIGVycm9yKSA8IDApIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRfRVhDRVBUSU9OKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieGNlcHRpb24gPSBnX29iamVjdF9uZXcgIgorICAgICAgICAgICAgICAgICAgICAiKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwgIgorICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgIgorICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgIgorICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLHhjZXB0aW9uLT50eXBlLCAiCisgICAgICAgICAgICAgICAgICAgICJcImFwcGxpY2F0aW9uIGVycm9yOiAlc1wiLCB4Y2VwdGlvbi0+bWVzc2FnZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgKG10eXBlICE9IFRfUkVQTFkpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIFRfU1RSVUNULCAiCisgICAgICAgICAgICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAgICAgICAgICAiTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICgiCisgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbC0+dHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfc2V0X2Vycm9yIChlcnJvciwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX01FU1NBR0VfVFlQRSwgIgorICAgICAgICAgICAgICAgICAgICAiXCJpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCwgZXhwZWN0ZWQgVF9SRVBMWVwiLCBtdHlwZSk7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAoc3RybmNtcCAoZm5hbWUsIFwiIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCBuYW1lLmxlbmd0aCgpIDw8ICIpICE9IDApIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsICIKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCIKKyAgICAgICAgICAgICAgICAgICAgImVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKCIKKyAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfc2V0X2Vycm9yIChlcnJvciwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9XUk9OR19NRVRIT0RfTkFNRSwgIgorICAgICAgICAgICAgICAgICAgICAiXCJ3cm9uZyBtZXRob2QgbmFtZSAlcywgZXhwZWN0ZWQgIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgICB7CisgICAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgICB0X2ZpZWxkIHN1Y2Nlc3MoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiKl9yZXR1cm4iLCAwKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIHJlYWRlcnMgZm9yIGV4Y2VwdGlvbnMsIGRlcmVmZXJlbmNpbmcgdGhlIHBvaW50ZXIuCisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7CisgICAgICAgICAgdF9maWVsZCogeGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKnhfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiIgKyAoKnhfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnhfaXRlciktPmdldF9rZXkoKSk7CisgICAgICAgICAgcmVzdWx0LmFwcGVuZCh4Y2VwdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKGZfc2VydmljZV8sICZyZXN1bHQsICIiLCAiIiwgZmFsc2UpOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIGNvcHkgb3ZlciBhbnkgdGhyb3cgZXhjZXB0aW9ucyBhbmQgcmV0dXJuIGZhaWx1cmUKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgqIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgZ19zZXRfZXJyb3IgKGVycm9yLCAiCisgICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiX0VSUk9SLCAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgICAgIDw8IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgPDwgIl9FUlJPUl9DT0RFLCBcIiIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50XyIpICsgZnVubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VydmljZV9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIHdyYXAgZWFjaCBmdW5jdGlvbgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NlbmRfIgorICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiIChpZmFjZSI7CisKKyAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiwgZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworCisgICAgLy8gaWYgbm90IG9uZXdheSwgaW1wbGVtZW50IHJlY3YKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSA/ICIiIDogIl9yZXR1cm4sICI7CisKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgcmV0ICs9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgcmV0ICs9ICIsICI7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3JlY3ZfIgorICAgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIgKGlmYWNlLCAiIDw8IHJldCA8PCAiZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIHJldHVybiBUUlVFIHdoaWNoIG1lYW5zIGFsbCBmdW5jdGlvbnMgd2VyZSBjYWxsZWQgT0sKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBUUlVFOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgaW50ZXJmYWNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiCisgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZS0+IiA8PCBmdW5uYW1lIDw8ICIgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYworICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfIiA8PCBmdW5uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBjbGllbnQgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2luaXQgKCIKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjbGllbnQtPmlucHV0X3Byb3RvY29sID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjbGllbnQtPm91dHB1dF9wcm90b2NvbCA9IE5VTEw7IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChjbGllbnQpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBjbGllbnQgY2xhc3MgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfY2xpZW50X2NsYXNzX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzICpjbHMpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgICAgPDwgIl9jbGllbnRfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgICA8PCAiX2NsaWVudF9nZXRfcHJvcGVydHk7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcImlucHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpbnB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgaW5wdXQgcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwib3V0cHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvdXRwdXQgcHJvdG9jb2wgKGNvbnN0cnVjdClcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNldCB0aGUgY2xpZW50IG91dHB1dCBwcm90b2NvbFwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiICBUSFJJRlRfVU5VU0VEX1ZBUiAoY2xzKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgaGFuZGxlci4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgaGFuZGxlci4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKKworICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOworICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOworCisgIHN0cmluZyBzZXJ2aWNlX2hhbmRsZXJfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiSGFuZGxlciI7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX2hhbmRsZXJfbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9oYW5kbGVyX25hbWUpOworICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOworICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZTsKKworICBzdHJpbmcgYXJnc19pbmRlbnQ7CisKKyAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubyBzZXJ2aWNlCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIG91ciBwYXJlbnQgc2VydmljZSAoaWYgYW55KSBhbmQgdGhlIGhhbmRsZXIgY2xhc3MnCisgIC8vIHBhcmVudCBjbGFzcyBuYW1lIGFuZCB0eXBlCisgIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHBhcmVudF9zZXJ2aWNlX25hbWUpKTsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocGFyZW50X3NlcnZpY2VfbmFtZV9sYyk7CisKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHBhcmVudF9zZXJ2aWNlX25hbWUgKyAiSGFuZGxlciI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBwYXJlbnRfc2VydmljZV9uYW1lX3VjICsgIl9IQU5ETEVSIjsKKyAgfSBlbHNlIHsKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9ICJHT2JqZWN0IjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gIkdfVFlQRV9PQkpFQ1QiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MnIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlciBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIGhhbmRsZXIgKGFic3RyYWN0IGJhc2UgY2xhc3MpICovIiA8PCBlbmRsIDw8ICJzdHJ1Y3QgXyIKKyAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiIHBhcmVudDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIiAiIDw8IGNsYXNzX25hbWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MgZGVmaW5pdGlvbiwgaW5jbHVkaW5nIGl0cyBjbGFzcyBtZW1iZXJzCisgIC8vIChtZXRob2RzKQorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ19saXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4X2xpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImdib29sZWFuICgqIiA8PCBtZXRob2RfbmFtZSA8PCAiKSAiIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICIgPDwgY2xhc3NfbmFtZQorICAgICAgICAgICAgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSByZW1haW5pbmcgaGVhZGVyIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwgY2xhc3NfbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSX0NMQVNTKGMpICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfSEFORExFUikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9IQU5ETEVSX0dFVF9DTEFTUyhvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzJyBtZXRob2QgZGVmaW5pdGlvbnMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHJldHVybl90eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnX2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhfbGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBmX2hlYWRlcl8gPDwgImdib29sZWFuICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgbWV0aG9kX25hbWUgPDwgIiAiIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlcidzIGltcGxlbWVudGF0aW9uIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIGJvaWxlcnBsYXRlCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICBhcmdzX2luZGVudCA9IHN0cmluZygyNSwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAiR19ERUZJTkVfVFlQRV9XSVRIX0NPREUgKCIgPDwgY2xhc3NfbmFtZSA8PCAiLCAiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX2xjIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IHBhcmVudF90eXBlX25hbWUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR19JTVBMRU1FTlRfSU5URVJGQUNFICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjMsICcgJyk7CisgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQpKSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZnVuY3Rpb25fbmFtZSk7CisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZpZWxkX2l0ZXI7CisKKyAgICB0X2Z1bmN0aW9uIGltcGxlbWVudGluZ19mdW5jdGlvbihyZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyAiX2hhbmRsZXJfIiArIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZpbXBsZW1lbnRpbmdfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSIChpZmFjZSksIEZBTFNFKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9HRVRfQ0xBU1MgKGlmYWNlKSIKKyAgICAgICAgICAgICAgIDw8ICItPiIgPDwgbWV0aG9kX25hbWUgPDwgIiAoaWZhY2UsICI7CisKKyAgICBpZiAoIXJldHVybl90eXBlLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIl9yZXR1cm4sICI7CisgICAgfQorICAgIGZvciAoZmllbGRfaXRlciA9IGFyZ3MuYmVnaW4oKTsgZmllbGRfaXRlciAhPSBhcmdzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgKCpmaWVsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICAgIH0KKyAgICBmb3IgKGZpZWxkX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgZmllbGRfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZpZWxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImVycm9yKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnRlcmZhY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKSIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2UtPiIgPDwgbWV0aG9kX25hbWUgPDwgIiA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIKKyAgICAgICAgICAgICAgICAgPDwgbWV0aG9kX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgIlRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAqY2xzKSIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgICAgICAgICBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICAgICsrZnVuY3Rpb25faXRlcikgeworICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGZ1bmN0aW9uX25hbWUpOworCisgICAgICAvLyBBbGwgbWV0aG9kcyBhcmUgcHVyZSB2aXJ0dWFsIGFuZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNscy0+IiA8PCBtZXRob2RfbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChjbHMpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBwcm9jZXNzb3IuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBhIHByb2Nlc3NvcgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmN0aW9uX2l0ZXI7CisKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfbmFtZV8pKTsKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9uYW1lX2xjKTsKKworICBzdHJpbmcgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfcHJvY2Vzc29yX25hbWU7CisgIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdGhpcy0+bnNwYWNlX2xjICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfcHJvY2Vzc29yX25hbWUpOworICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOworICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZTsKKworICBzdHJpbmcgaGFuZGxlcl9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJIYW5kbGVyIjsKKyAgc3RyaW5nIGhhbmRsZXJfY2xhc3NfbmFtZV9sYyA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhoYW5kbGVyX2NsYXNzX25hbWUpOworCisgIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZSA9IGNsYXNzX25hbWUgKyAiUHJvY2Vzc0Z1bmN0aW9uIjsKKyAgc3RyaW5nIHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZSA9CisgICAgY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc19mdW5jdGlvbl9kZWYiOworCisgIHN0cmluZyBmdW5jdGlvbl9uYW1lOworICBzdHJpbmcgYXJnc19pbmRlbnQ7CisKKyAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubyBzZXJ2aWNlCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIG91ciBwYXJlbnQgc2VydmljZSAoaWYgYW55KSBhbmQgdGhlCisgIC8vIHByb2Nlc3NvciBjbGFzcycgcGFyZW50IGNsYXNzIG5hbWUgYW5kIHR5cGUKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOworICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKKworICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJQcm9jZXNzb3IiOworICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfUFJPQ0VTU09SIjsKKyAgfSBlbHNlIHsKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9ICJUaHJpZnREaXNwYXRjaFByb2Nlc3NvciI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9ICJUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBjbGFzcycgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyIGZpbGUKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yIGluc3RhbmNlIGRlZmluaXRpb24KKyAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBwcm9jZXNzb3IgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICIgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiLyogcHJvdGVjdGVkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIgKmhhbmRsZXI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiR0hhc2hUYWJsZSAqcHJvY2Vzc19tYXA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICIgIiA8PCBjbGFzc19uYW1lIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgY2xhc3MgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiLyogcHJvdGVjdGVkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiZ2Jvb2xlYW4gKCpkaXNwYXRjaF9jYWxsKSAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnByb2Nlc3NvciwiIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjcsICcgJyk7CisgIGZfaGVhZGVyXyA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKmluLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dCwiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnY2hhciAqZm5hbWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIgc2VxaWQsIgorICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqZXJyb3IpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHJlbWFpbmluZyBoZWFkZXIgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiAiCisgICAgICAgICAgICA8PCAiKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IsICIgPDwgY2xhc3NfbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1JfQ0xBU1MoYykgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9QUk9DRVNTT1IpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIGltcGxlbWVudGF0aW9uIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb3BlcnRpZXMgZW51bQorICBmX3NlcnZpY2VfIDw8ICJlbnVtIF8iIDw8IGNsYXNzX25hbWUgPDwgIlByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXzAsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJQUk9QXyIKKyAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gYm9pbGVycGxhdGUKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcoMTUsICcgJyk7CisgIGZfc2VydmljZV8gPDwgIkdfREVGSU5FX1RZUEUgKCIgPDwgY2xhc3NfbmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBjbGFzc19uYW1lX2xjCisgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uIHR5cGUKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcocHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUubGVuZ3RoKCkgKyAyMywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAidHlwZWRlZiBnYm9vbGVhbiAoKiAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lIDw8ICIpICgiCisgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICosICIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKik7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZy1mdW5jdGlvbi1kZWZpbml0aW9uIHR5cGUKKyAgZl9zZXJ2aWNlXyA8PCAidHlwZWRlZiBzdHJ1Y3QiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdjaGFyICpuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lIDw8ICIgZnVuY3Rpb247IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9ICIgPDwgcHJvY2Vzc19mdW5jdGlvbl9kZWZfdHlwZV9uYW1lIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZyBmdW5jdGlvbnMgc28gd2UKKyAgLy8gY2FuIHJlZmVyIHRvIHRoZW0gaW4gdGhlIHByb2Nlc3NpbmctZnVuY3Rpb24tZGVmaW5pdGlvbiBzdHJ1Y3QgYmVsb3cgYW5kCisgIC8vIGtlZXAgYWxsIG9mIHRoZSBwcm9jZXNzb3IncyBkZWNsYXJhdGlvbnMgaW4gb25lIHBsYWNlCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICsrZnVuY3Rpb25faXRlcikgeworICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKKyAgICAgICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworCisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKCIKKyAgICAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgIiAqLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICosIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR0Vycm9yICoqKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9jZXNzaW5nLWZ1bmN0aW9uIGRlZmluaXRpb25zLCBpZiB0aGUgc2VydmljZQorICAvLyBkZWZpbmVzIGFueSBtZXRob2RzCisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZQorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1siCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8ICJdID0geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKKyAgICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8IHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA8PCAiXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHByb2Nlc3NfZnVuY3Rpb25fbmFtZSA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgICAgIDw8IChmdW5jdGlvbl9pdGVyID09IC0tZnVuY3Rpb25zLmVuZCgpID8gIiIgOiAiLCIpIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZyBmdW5jdGlvbnMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljID0gdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7CisgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYyA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYyk7CisKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICBib29sIGhhc19yZXR1cm5fdmFsdWUgPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKKworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFyZ19pdGVyOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhjZXB0aW9uX2l0ZXI7CisKKyAgICBzdHJpbmcgYXJnc19jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyArICJBcmdzIjsKKyAgICBzdHJpbmcgYXJnc19jbGFzc190eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV91YyArICJfQVJHUyI7CisKKyAgICBzdHJpbmcgcmVzdWx0X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX2ljICsgIlJlc3VsdCI7CisgICAgc3RyaW5nIHJlc3VsdF9jbGFzc190eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjICsgIl9SRVNVTFQiOworCisgICAgc3RyaW5nIGhhbmRsZXJfZnVuY3Rpb25fbmFtZSA9IGhhbmRsZXJfY2xhc3NfbmFtZV9sYyArICJfIiArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9sYzsKKworICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9wcm9jZXNzXyIKKyAgICAgICAgICAgICAgICAgICAgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmLCIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKmVycm9yKSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2Jvb2xlYW4gcmVzdWx0ID0gVFJVRTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgYXJnc19jbGFzc19uYW1lICsgIiAqIGFyZ3MgPSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9uZXcgKCIgPDwgYXJnc19jbGFzc190eXBlIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKCgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoc2VxdWVuY2VfaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKG91dHB1dF9wcm90b2NvbCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2dldCAoaW5wdXRfcHJvdG9jb2wsIFwidHJhbnNwb3J0XCIsICIKKyAgICAgICAgICAgICAgIDw8ICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgdGhlIG1ldGhvZCdzIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoKHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoYXJncyksICIKKyAgICAgICAgICAgICAgIDw8ICJpbnB1dF9wcm90b2NvbCwgZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGlucHV0X3Byb3RvY29sLCAiCisgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgICAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgIT0gRkFMU0UpKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcHJvcGVydHlfdHlwZV9uYW1lKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSA8PCAiIHJldHVybl92YWx1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0X2NsYXNzX25hbWUgPDwgIiAqIHJlc3VsdF9zdHJ1Y3Q7IiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoYXJncy5zaXplKCkgPiAwKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKGFyZ3MsIiA8PCBlbmRsOworICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKKyAgICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgICAgc3RyaW5nIGFyZ19uYW1lID0gKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8IGFyZ19uYW1lIDw8ICJcIiwgJiIgPDwgYXJnX25hbWUgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImdfb2JqZWN0X2dldCAob3V0cHV0X3Byb3RvY29sLCBcInRyYW5zcG9ydFwiLCAiCisgICAgICAgICAgICAgICAgIDw8ICImdHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0X3N0cnVjdCA9IGdfb2JqZWN0X25ldyAoIiA8PCByZXN1bHRfY2xhc3NfdHlwZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7CisgICAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKHJlc3VsdF9zdHJ1Y3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJzdWNjZXNzXCIsICZyZXR1cm5fdmFsdWUsIE5VTEwpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBQYXNzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGluIHRoZSBoYW5kbGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaGFuZGxlcl9mdW5jdGlvbl9uYW1lIDw8ICIgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiAoc2VsZi0+aGFuZGxlciksIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoaGFuZGxlcl9mdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgNiwgJyAnKTsKKyAgICBpZiAoaGFzX3JldHVybl92YWx1ZSkgeworICAgICAgc3RyaW5nIHJldHVybl90eXBlX25hbWUgPSB0eXBlX25hbWUocmV0dXJuX3R5cGUpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50OworCisgICAgICAvLyBDYXN0IHJldHVybl92YWx1ZSBpZiBpdCB3YXMgZGVjbGFyZWQgYXMgYSB0eXBlIG90aGVyIHRoYW4gdGhlIHJldHVybgorICAgICAgLy8gdmFsdWUncyBhY3R1YWwgdHlwZS0tLXRoaXMgaXMgdHJ1ZSBmb3IgaW50ZWdlciB2YWx1ZXMgMzIgYml0cyBvciBmZXdlcgorICAgICAgLy8gaW4gd2lkdGgsIGZvciB3aGljaCBHTGliIHJlcXVpcmVzIGEgcGxhaW4gZ2ludCB0eXBlIGJlIHVzZWQgd2hlbgorICAgICAgLy8gc3RvcmluZyBvciByZXRyaWV2aW5nIGFzIGFuIG9iamVjdCBwcm9wZXJ0eQorICAgICAgaWYgKHJldHVybl90eXBlX25hbWUgIT0gcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSkgeworICAgICAgICBpZiAocmV0dXJuX3R5cGVfbmFtZVtyZXR1cm5fdHlwZV9uYW1lLmxlbmd0aCgpIC0gMV0gIT0gJyonKSB7CisgICAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnICc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuX3R5cGVfbmFtZSArPSAnKic7CisKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiKCIgPDwgcmV0dXJuX3R5cGVfbmFtZSA8PCAiKSI7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgIiZyZXR1cm5fdmFsdWUsIiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiJiIgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgPT0gVFJVRSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBUaGUgaGFuZGxlciByZXBvcnRlZCBzdWNjZXNzOyByZXR1cm4gdGhlIHJlc3VsdCwgaWYgYW55LCB0byB0aGUgY2FsbGVyCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3Rfc2V0IChyZXN1bHRfc3RydWN0LCBcInN1Y2Nlc3NcIiwgIjsKKyAgICAgICAgaWYgKHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgIT0gcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSkgeworICAgICAgICAgIC8vIFJvdW5kdHJpcCBjYXN0IHRvIGZpeCB0aGUgcG9zaXRpb24gb2Ygc2lnbiBiaXQuCisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiKCIgPDwgcHJvcGVydHlfdHlwZV9uYW1lKHJldHVybl90eXBlKSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCB0eXBlX25hbWUocmV0dXJuX3R5cGUpIDw8ICIpIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm5fdmFsdWUsICIKKyAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCk7IiA8PCBlbmRsOworCisgICAgICAgIC8vIERlYWxsb2NhdGUgKG9yIHVucmVmKSByZXR1cm5fdmFsdWUKKyAgICAgICAgcmV0dXJuX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHJldHVybl90eXBlKTsKKyAgICAgICAgaWYgKHJldHVybl90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKilyZXR1cm5fdHlwZSk7CisKKyAgICAgICAgICBpZiAoYmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJldHVybl92YWx1ZSAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19ieXRlX2FycmF5X3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfZnJlZSAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgaWYgKHJldHVybl90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXJldHVybl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICAgICAgaWYgKGlzX251bWVyaWMoZWxlbV90eXBlKSkgeworICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5fdHlwZS0+aXNfbWFwKCkgfHwgcmV0dXJuX3R5cGUtPmlzX3NldCgpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJldHVybl92YWx1ZSAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsOworICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICA8PCAiVF9SRVBMWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUIChyZXN1bHRfc3RydWN0KSwiIDw8IGVuZGw7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpICE9IC0xKSk7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gVGhlIGhhbmRsZXIgcmVwb3J0ZWQgZmFpbHVyZTsgY2hlY2sgdG8gc2VlIGlmIGFuIGFwcGxpY2F0aW9uLWRlZmluZWQKKyAgICAvLyBleGNlcHRpb24gd2FzIHJhaXNlZCBhbmQgaWYgc28sIHJldHVybiBpdCB0byB0aGUgY2FsbGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoeGNlcHRpb25faXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgImlmICgiIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9zZXQgKHJlc3VsdF9zdHJ1Y3QsIiA8PCBlbmRsOworICAgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDE0LCAnICcpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGw7CisgICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgIDw8ICJUX1JFUExZLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUIChyZXN1bHRfc3RydWN0KSwiIDw8IGVuZGw7CisgICAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMjMsICcgJyk7CisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGhhbmRsZXIgcmVwb3J0ZWQgZmFpbHVyZSBidXQgcmFpc2VkIG5vIGFwcGxpY2F0aW9uLWRlZmluZWQKKyAgICAvLyBleGNlcHRpb24sIHJldHVybiBhIFRocmlmdCBhcHBsaWNhdGlvbiBleGNlcHRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24KKyAgICAvLyByZXR1cm5lZCB2aWEgR0xpYidzIG93biBlcnJvci1yZXBvcnRpbmcgbWVjaGFuaXNtCisgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKCplcnJvciA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3dhcm5pbmcgKFwiIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuIgorICAgICAgICAgICAgICAgPDwgKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudGF0aW9uIHJldHVybmVkIEZBTFNFIFwiIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBzdHJpbmcoMTEsICcgJykgPDwgIlwiYnV0IGRpZCBub3Qgc2V0IGFuIGVycm9yXCIpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAieGNlcHRpb24gPSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwiIDw8IGVuZGw7CisgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcInR5cGVcIiwgICAgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+Y29kZSA6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBzdHJpbmcoMTEsICcgJykgPDwgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJcIm1lc3NhZ2VcIiwgKmVycm9yICE9IE5VTEwgPyAoKmVycm9yKS0+bWVzc2FnZSA6IE5VTEwsIgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19jbGVhcl9lcnJvciAoZXJyb3IpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOworICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIlRfRVhDRVBUSU9OLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7IiA8PCBlbmRsOworCisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIERlbGxvY2F0ZSBvciB1bnJlZiByZXRyaWV2ZWQgYXJndW1lbnQgdmFsdWVzIGFzIG5lY2Vzc2FyeQorICAgIGZvciAoYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBhcmdfbmFtZSA9ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF90eXBlKiBhcmdfdHlwZSA9IGdldF90cnVlX3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOworCisgICAgICBpZiAoYXJnX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKilhcmdfdHlwZSk7CisKKyAgICAgICAgaWYgKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2J5dGVfYXJyYXlfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2ZyZWUgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBpZiAoYXJnX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKWFyZ190eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgICBpZiAoaXNfbnVtZXJpYyhlbGVtX3R5cGUpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0KKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19tYXAoKSB8fCBhcmdfdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnX3R5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGFyZ19uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBhcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHJlc3VsdF9zdHJ1Y3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAocmVzdWx0ID09IFRSVUUpIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgIgorICAgICAgICAgICAgICAgICA8PCAiKG91dHB1dF9wcm90b2NvbCwgZXJyb3IpICE9IC0xKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgIgorICAgICAgICAgICAgICAgICA8PCAiIT0gRkFMU0UpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpICIKKyAgICAgICAgICAgICAgICAgPDwgIiE9IEZBTFNFKSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBGQUxTRTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiZ19vYmplY3RfdW5yZWYgKGFyZ3MpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIGRpc3BhdGNoX2NhbGwgaW1wbGVtZW50YXRpb24KKyAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2Rpc3BhdGNoX2NhbGwiOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgIDw8ICIgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpkaXNwYXRjaF9wcm9jZXNzb3IsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdjaGFyICptZXRob2RfbmFtZSwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJHRXJyb3IgKiplcnJvcikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZiAqIgorICAgICAgICAgICAgIDw8ICJwcm9jZXNzX2Z1bmN0aW9uX2RlZjsiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdib29sZWFuIGRpc3BhdGNoX3Jlc3VsdCA9IEZBTFNFOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKGRpc3BhdGNoX3Byb2Nlc3Nvcik7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIipwYXJlbnRfY2xhc3MgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfdHlwZV9jbGFzc19wZWVrX3BhcmVudCAoIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfR0VUX0NMQVNTIChzZWxmKSk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzX2Z1bmN0aW9uX2RlZiA9ICIKKyAgICAgICAgICAgICA8PCAiZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2VsZi0+cHJvY2Vzc19tYXAsIG1ldGhvZF9uYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKHByb2Nlc3NfZnVuY3Rpb25fZGVmICE9IE5VTEwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyg1MywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19mcmVlIChtZXRob2RfbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Jlc3VsdCA9ICIKKyAgICAgICAgICAgICA8PCAiKCpwcm9jZXNzX2Z1bmN0aW9uX2RlZi0+ZnVuY3Rpb24pIChzZWxmLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgLy8gTWV0aG9kIG5hbWUgbm90IHJlY29nbml6ZWQ7IGNoYWluIHVwIHRvIG91ciBwYXJlbnQgcHJvY2Vzc29yLS0tbm90ZSB0aGUKKyAgLy8gdG9wLW1vc3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIGluIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yIGl0c2VsZiwKKyAgLy8gd2lsbCByZXR1cm4gYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIgaWYgbm8gY2xhc3MgaW4gdGhlCisgIC8vIGhpZXJhcmNoeSByZWNvZ25pemVzIHRoZSBtZXRob2QgbmFtZQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkaXNwYXRjaF9yZXN1bHQgPSBwYXJlbnRfY2xhc3MtPmRpc3BhdGNoX2NhbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGlzcGF0Y2hfcHJvY2Vzc29yLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyg0NywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIm1ldGhvZF9uYW1lLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGRpc3BhdGNoX3Jlc3VsdDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvcGVydHkgc2V0dGVyCisgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9zZXRfcHJvcGVydHkiOworICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiY29uc3QgR1ZhbHVlICp2YWx1ZSwiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhc2UgUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT5oYW5kbGVyICE9IE5VTEwpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+aGFuZGxlciA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJnX29iamVjdF9yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSkgeworICAgIC8vIENoYWluIHVwIHRvIHNldCB0aGUgaGFuZGxlciBpbiBldmVyeSBzdXBlcmNsYXNzIGFzIHdlbGwKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpLT4iCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNldF9wcm9wZXJ0eSAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgdmFsdWUsIHBzcGVjKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvcidzIHByb3BlcnR5IGdldHRlcgorICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZ2V0X3Byb3BlcnR5IjsKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdWYWx1ZSAqdmFsdWUsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXNlIFBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0b3IgdGhlIHByb2Nlc3NvcidzIGRpc3Bvc2UgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAoZ29iamVjdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPmhhbmRsZXIgIT0gTlVMTCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInNlbGYtPmhhbmRsZXIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPmRpc3Bvc2UgKGdvYmplY3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGZpbmFsaXplIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgKnNlbGYgPSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiAoZ29iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAidGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95IChzZWxmLT5wcm9jZXNzX21hcCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiR19PQkpFQ1RfQ0xBU1MgKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3BhcmVudF9jbGFzcykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+ZmluYWxpemUgKGdvYmplY3QpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvciBpbnN0YW5jZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfaW5pdCAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYpIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJndWludCBpbmRleDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+aGFuZGxlciA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInNlbGYtPnByb2Nlc3NfbWFwID0gIgorICAgICAgICAgICAgICAgICJnX2hhc2hfdGFibGVfbmV3IChnX3N0cl9oYXNoLCBnX3N0cl9lcXVhbCk7IiA8PCBlbmRsOworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBhcmdzX2luZGVudCA9IHN0cmluZygyMSwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAiCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8ICI7IGluZGV4ICs9IDEpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKHNlbGYtPnByb2Nlc3NfbWFwLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZnNbaW5kZXhdLm5hbWUsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIiYiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZnNbaW5kZXhdIiA8PCAiKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvciBjbGFzcyBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICAgPDwgIkNsYXNzICpjbHMpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MgKmRpc3BhdGNoX3Byb2Nlc3Nvcl9jbGFzcyA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9DTEFTUyAoY2xzKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3Bvc2U7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZmluYWxpemU7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3NldF9wcm9wZXJ0eTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3Byb3BlcnR5OyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzLT5kaXNwYXRjaF9jYWxsID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcGF0Y2hfY2FsbDsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY2xzLT5kaXNwYXRjaF9jYWxsID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcGF0Y2hfY2FsbDsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJoYW5kbGVyXCIsIgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzQsICcgJyk7CisgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiU2VydmljZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlwiVGhlIHNlcnZpY2UgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBcIiIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJcInRvIHdoaWNoIG1ldGhvZCBjYWxscyBhcmUgZGlzcGF0Y2hlZC5cIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgc2VydmljZV9uYW1lX3VjICsgIl9IQU5ETEVSLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzMywgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJwYXJhbV9zcGVjKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBzZXJ2ZXIuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmljZSdzIGhhbmRsZXIgY2xhc3MKKyAgZ2VuZXJhdGVfc2VydmljZV9oYW5kbGVyKHRzZXJ2aWNlKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmljZSdzIHByb2Nlc3NvciBjbGFzcworICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIEMgY29kZSB0byByZXByZXNlbnQgYSBUSHJpZnQgc3RydWN0dXJlIGFzIGEgR09iamVjdC4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX29iamVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKKworICBzdHJpbmcgZnVuY3Rpb25fbmFtZTsKKyAgc3RyaW5nIGFyZ3NfaW5kZW50OworCisgIC8vIHdyaXRlIHRoZSBpbnN0YW5jZSBkZWZpbml0aW9uCisgIGZfdHlwZXNfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgZW5kbCA8PCAieyAiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiAgVGhyaWZ0U3RydWN0IHBhcmVudDsgIiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgLyogcHVibGljICovIiA8PCBlbmRsOworCisgIC8vIGZvciBlYWNoIGZpZWxkLCBhZGQgYSBtZW1iZXIgdmFyaWFibGUKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBmX3R5cGVzXyA8PCAiICAiIDw8IHR5cGVfbmFtZSh0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBmX3R5cGVzXyA8PCAiICBnYm9vbGVhbiBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIGNsb3NlIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBhbmQgY3JlYXRlIGEgdHlwZWRlZgorICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHdyaXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uCisgIGZfdHlwZXNfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIgIFRocmlmdFN0cnVjdENsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgdGhlIHN0YW5kYXJkIEdPYmplY3QgYm9pbGVycGxhdGUKKyAgZl90eXBlc18gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIgKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKKyAgICAgICAgICAgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YworICAgICAgICAgICA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICA8PCBuYW1lX3VjIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJfVFlQRV8iCisgICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBuYW1lX3VjIDw8ICIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgIDw8ICJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHN0YXJ0IHdyaXRpbmcgdGhlIG9iamVjdCBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlCisKKyAgLy8gZ2VuZXJhdGUgcHJvcGVydGllcyBlbnVtCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmX3R5cGVzX2ltcGxfIDw8ICJlbnVtIF8iIDw8IGNsYXNzX25hbWUgPDwgIlByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl8wIjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKKyAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworCisgICAgICBmX3R5cGVzX2ltcGxfIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXyIgPDwgbWVtYmVyX25hbWVfdWM7CisgICAgfQorICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSBzdHJ1Y3QgSS9PIG1ldGhvZHMKKyAgc3RyaW5nIHRoaXNfZ2V0ID0gdGhpcy0+bnNwYWNlICsgbmFtZSArICIgKiB0aGlzX29iamVjdCA9ICIgKyB0aGlzLT5uc3BhY2VfdWMgKyBuYW1lX3VjCisgICAgICAgICAgICAgICAgICAgICsgIihvYmplY3QpOyI7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgInRoaXNfb2JqZWN0LT4iLCB0aGlzX2dldCk7CisgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgInRoaXNfb2JqZWN0LT4iLCB0aGlzX2dldCk7CisKKyAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyIGFuZCBnZXR0ZXIKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IHNldHRlcgorICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9zZXRfcHJvcGVydHkiOworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgPDwgImNvbnN0IEdWYWx1ZSAqdmFsdWUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbV9pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKKworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IHByb3BlcnR5X2lkZW50aWZpZXIgKyAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSk7CisgICAgICAgIHN0cmluZyBhc3NpZ25fZnVuY3Rpb25fbmFtZTsKKworICAgICAgICBpZiAoYmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgICAgIHN0cmluZyByZWxlYXNlX2Z1bmN0aW9uX25hbWU7CisKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2J5dGVfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19mcmVlIjsKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX3N0cmluZyI7CisgICAgICAgICAgfQorCisgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPDwgIiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9ib29sZWFuIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2ludCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfaW50NjQiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2RvdWJsZSI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCisgICAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSAiIDw8IGFzc2lnbl9mdW5jdGlvbl9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiAodmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHN0cmluZyByZWxlYXNlX2Z1bmN0aW9uX25hbWU7CisgICAgICAgIHN0cmluZyBhc3NpZ25fZnVuY3Rpb25fbmFtZTsKKworICAgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgICAgICAgLy8gTGlzdHMgb2YgYmFzZSB0eXBlcyBvdGhlciB0aGFuIHN0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGFzIEdBcnJheXM7CisgICAgICAgICAgLy8gYWxsIG90aGVycyBhcyBHUHRyQXJyYXlzCisgICAgICAgICAgaWYgKGlzX251bWVyaWMoZWxlbV90eXBlKSkgeworICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgICAgIH0KKworICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX2JveGVkIjsKKyAgICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc2V0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX21hcCgpKSB7CisgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfaGFzaF90YWJsZV91bnJlZiI7CisgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOworICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgcmVsZWFzZV9mdW5jdGlvbl9uYW1lIDw8ICIgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9ICIgPDwgYXNzaWduX2Z1bmN0aW9uX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiICh2YWx1ZSk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc3RydWN0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmIChtZW1iZXItPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPl9faXNzZXRfIiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgorICAgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9nZXRfcHJvcGVydHkiOworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1ZhbHVlICp2YWx1ZSwiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbV9pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKKworICAgICAgc3RyaW5nIHNldHRlcl9mdW5jdGlvbl9uYW1lOworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSk7CisKKyAgICAgICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2Jvb2xlYW4iOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2ludDY0IjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9kb3VibGUiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib3hlZCI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X3N0cmluZyI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgYmFzZV90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCisgICAgICAgICAgICAgICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50IjsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X29iamVjdCI7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib3hlZCI7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgInVucmVjb2duaXplZCB0eXBlIGZvciBzdHJ1Y3QgbWVtYmVyIFwiIiArIG1lbWJlcl9uYW1lICsgIlwiIjsKKyAgICAgIH0KKworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IHByb3BlcnR5X2lkZW50aWZpZXIgKyAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA8PCAiICh2YWx1ZSwgc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHRoZSBpbnN0YW5jZSBpbml0IGZ1bmN0aW9uCisKKyAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0ICgiCisgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAqIG9iamVjdCkiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGdlbmVyYXRlIGRlZmF1bHQtdmFsdWUgc3RydWN0dXJlcyBmb3IgY29udGFpbmVyLXR5cGUgbWVtYmVycworICBib29sIGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCA9IGZhbHNlOworICBib29sIHN0cmluZ19saXN0X2NvbnN0YW50X291dHB1dCA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKm1faXRlcjsKKyAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSBtZW1iZXItPmdldF92YWx1ZSgpOworCisgICAgaWYgKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gbWVtYmVyX3ZhbHVlLT5nZXRfbGlzdCgpOworICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KiltZW1iZXJfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgICAgICAvLyBHZW5lcmF0ZSBhbiBhcnJheSB3aXRoIHRoZSBsaXN0IGxpdGVyYWwKKyAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJzdGF0aWMgIiA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIiBfX2RlZmF1bHRfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbWVtYmVyX25hbWUgPDwgIlsiIDw8IGxpc3Quc2l6ZSgpIDw8ICJdID0gIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBjb25zdGFudF9saXRlcmFsKG1lbWJlcl90eXBlLCBtZW1iZXJfdmFsdWUpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAgIGNvbnN0YW50X2RlY2xhcmF0aW9uX291dHB1dCA9IHRydWU7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgdmFsdWVzIGZvciBhIHBvaW50ZXIgYXJyYXkgKGkuZS4gYSBsaXN0IG9mCisgICAgICAgIC8vIHN0cmluZ3MpLCBzZXQgYSBmbGFnIHNvIHdlIGtub3cgdG8gYWxzbyBkZWNsYXJlIGFuIGluZGV4IHZhcmlhYmxlIHRvCisgICAgICAgIC8vIHVzZSBpbiBwcmUtcG9wdWxhdGluZyB0aGUgYXJyYXkKKyAgICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgICAgICBzdHJpbmdfbGlzdF9jb25zdGFudF9vdXRwdXQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRPRE86IEhhbmRsZSBjb250YWluZXIgdHlwZXMgb3RoZXIgdGhhbiBsaXN0CisgICAgfQorICB9CisgIGlmIChjb25zdGFudF9kZWNsYXJhdGlvbl9vdXRwdXQpIHsKKyAgICBpZiAoc3RyaW5nX2xpc3RfY29uc3RhbnRfb3V0cHV0KSB7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgInVuc2lnbmVkIGludCBsaXN0X2luZGV4OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0KKworICAvLyBzYXRpc2Z5IGNvbXBpbGVycyB3aXRoIC1XYWxsIHR1cm5lZCBvbgorICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIi8qIHNhdGlzZnkgLVdhbGwgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsiIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZShtZW1iZXJfdHlwZSk7CisgICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBzdHJpbmcgZHZhbCA9ICIgPSAiOworICAgICAgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSh0KSArICIpIjsKKyAgICAgIH0KKyAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgIGR2YWwgKz0gY29uc3RhbnRfdmFsdWUoIiIsIHQsIGN2KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGR2YWwgKz0gdC0+aXNfc3RyaW5nKCkgPyAiTlVMTCIgOiAiMCI7CisgICAgICB9CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHRfcHJvZ3JhbSogdHlwZV9wcm9ncmFtID0gbWVtYmVyX3R5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgICBzdHJpbmcgdHlwZV9uc3BhY2UgPSB0eXBlX3Byb2dyYW0gPyB0eXBlX3Byb2dyYW0tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpIDogIiI7CisgICAgICBzdHJpbmcgdHlwZV9uc3BhY2VfcHJlZml4ID0KKyAgICAgICAgdHlwZV9uc3BhY2UuZW1wdHkoKSA/ICIiIDogaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHR5cGVfbnNwYWNlKSArICJfIjsKKyAgICAgIHN0cmluZyB0eXBlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSkpOworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gZ19vYmplY3RfbmV3ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZSh0eXBlX25zcGFjZV9wcmVmaXgpIDw8ICJUWVBFXyIgPDwgdHlwZV9uYW1lX3VjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBpbml0X2Z1bmN0aW9uOworICAgICAgdF90eXBlKiBldHlwZSA9IE5VTEw7CisKKyAgICAgIGlmICh0LT5pc19tYXAoKSkgeworICAgICAgICB0X3R5cGUqIGtleSA9ICgodF9tYXAqKXQpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgdF90eXBlKiB2YWx1ZSA9ICgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShrZXksIHZhbHVlKTsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGV0eXBlLCBOVUxMKTsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKGV0eXBlKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gIiA8PCBpbml0X2Z1bmN0aW9uIDw8IGVuZGw7CisKKyAgICAgIC8vIFByZS1wb3B1bGF0ZSB0aGUgY29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlcywgaWYgYW55CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgeworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworCisgICAgICAgIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gbWVtYmVyX3ZhbHVlLT5nZXRfbGlzdCgpOworCisgICAgICAgICAgaWYgKGlzX251bWVyaWMoZXR5cGUpKSB7CisgICAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKKyAgICAgICAgICAgICAgImdfYXJyYXlfYXBwZW5kX3ZhbHMgKG9iamVjdC0+IiA8PCBuYW1lIDw8ICIsICZfX2RlZmF1bHRfIiA8PAorICAgICAgICAgICAgICBuYW1lIDw8ICIsICIgPDwgbGlzdC5zaXplKCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAorICAgICAgICAgICAgICAiZm9yIChsaXN0X2luZGV4ID0gMDsgbGlzdF9pbmRleCA8ICIgPDwgbGlzdC5zaXplKCkgPDwgIjsgIiA8PAorICAgICAgICAgICAgICAibGlzdF9pbmRleCArPSAxKSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8CisgICAgICAgICAgICAgICJnX3B0cl9hcnJheV9hZGQgKG9iamVjdC0+IiA8PCBuYW1lIDw8ICIsIiA8PCBlbmRsIDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8IHN0cmluZygxNywgJyAnKSA8PCAiZ19zdHJkdXAgKF9fZGVmYXVsdF8iIDw8CisgICAgICAgICAgICAgIG5hbWUgPDwgIltsaXN0X2luZGV4XSkpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogSGFuZGxlIGNvbnRhaW5lciB0eXBlcyBvdGhlciB0aGFuIGxpc3QKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBub3QgcmVxdWlyZWQsIGluaXRpYWxpemUgdGhlIF9faXNzZXQgdmFyaWFibGUgKi8KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPl9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogY3JlYXRlIHRoZSBkZXN0cnVjdG9yICovCisgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgICAgICAgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICp0b2JqZWN0ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICAgICAgIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSB0b2JqZWN0ICovIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0b2JqZWN0KTsiIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHQtPmlzX21hcCgpIHx8IHQtPmlzX3NldCgpKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9kZXN0cm95ICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBzdHJpbmcgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX3B0cl9hcnJheV91bnJlZiI7CisKKyAgICAgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGRlc3RydWN0b3JfZnVuY3Rpb24gPSAiZ19hcnJheV91bnJlZiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgICAgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA8PCAiICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICAvLyBUT0RPOiBnX2NsZWFyX29iamVjdCBuZWVkcyBnbGliID49IDIuMjgKKyAgICAgIC8vIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImdfY2xlYXJfb2JqZWN0ICgmKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsOworICAgICAgLy8gZG9lcyBnX29iamVjdF91bnJlZiB0aGUgdHJpY2s/CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfc3RyaW5nKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHQpIDw8ICIodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzX2ltcGxfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIGNsYXNzIGluaXQgZnVuY3Rpb24KKworICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfY2xhc3NfaW5pdCAoIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICAgICAgPDwgIkNsYXNzICogY2xzKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFN0cnVjdENsYXNzICpzdHJ1Y3RfY2xhc3MgPSAiCisgICAgICAgICAgICAgICAgPDwgIlRIUklGVF9TVFJVQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAic3RydWN0X2NsYXNzLT5yZWFkID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcmVhZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAic3RydWN0X2NsYXNzLT53cml0ZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3dyaXRlOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZmluYWxpemU7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMKKyAgICAgICAgICAgICAgICAgIDw8ICJfZ2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3NldF9wcm9wZXJ0eTsiIDw8IGVuZGw7CisKKyAgICAvLyBpbnN0YWxsIGEgcHJvcGVydHkgZm9yIGVhY2ggbWVtYmVyCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICAgIHRfY29uc3RfdmFsdWUqIG1lbWJlcl92YWx1ZSA9IG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisKKyAgICAgIHN0cmluZyBwcm9wZXJ0eV9pZGVudGlmaWVyID0gIlBST1BfIiArIGNsYXNzX25hbWVfdWMgKyAiXyIgKyBtZW1iZXJfbmFtZV91YzsKKworICAgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgJyAnOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IHByb3BlcnR5X2lkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQ7CisKKyAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKiltZW1iZXJfdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICAgICAgaWYgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1RZUEVfQllURV9BUlJBWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjEsICcgJyk7CisgICAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfc3RyaW5nIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgobWVtYmVyX3ZhbHVlICE9IE5VTEwpID8gIlwiIiArIG1lbWJlcl92YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJOVUxMIikgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgeworICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMiwgJyAnKTsKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm9vbGVhbiAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgoKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSAmJiAobWVtYmVyX3ZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJUUlVFIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJGQUxTRSIpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JOCkgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpCisgICAgICAgICAgICAgICAgICAgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTY0KQorICAgICAgICAgICAgICAgICAgIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSkgeworICAgICAgICAgIHN0cmluZyBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2ludCI7CisgICAgICAgICAgc3RyaW5nIG1pbl92YWx1ZTsKKyAgICAgICAgICBzdHJpbmcgbWF4X3ZhbHVlOworICAgICAgICAgIG9zdHJpbmdzdHJlYW0gZGVmYXVsdF92YWx1ZTsKKworICAgICAgICAgIHN3aXRjaCAoYmFzZV90eXBlKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDgiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UOCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UMTYiOworICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UMTYiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDMyIjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDMyIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2ludDY0IjsKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDY0IjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDY0IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2RvdWJsZSI7CisgICAgICAgICAgICBtaW5fdmFsdWUgPSAiLUlORklOSVRZIjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJJTkZJTklUWSI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIG1lbWJlcl90eXBlLT5nZXRfbmFtZSgpICsgIlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzdHJ1Y3QgbWVtYmVyIFwiIgorICAgICAgICAgICAgICAgICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlIDw8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFID8gbWVtYmVyX3ZhbHVlLT5nZXRfZG91YmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZW1iZXJfdmFsdWUtPmdldF9pbnRlZ2VyKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlIDw8ICIwIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcocGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA8PCAiIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgbWluX3ZhbHVlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IG1heF92YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgZGVmYXVsdF92YWx1ZS5zdHIoKSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2VudW0oKSkgeworICAgICAgICB0X2VudW1fdmFsdWUqIGVudW1fbWluX3ZhbHVlID0gKCh0X2VudW0qKW1lbWJlcl90eXBlKS0+Z2V0X21pbl92YWx1ZSgpOworICAgICAgICB0X2VudW1fdmFsdWUqIGVudW1fbWF4X3ZhbHVlID0gKCh0X2VudW0qKW1lbWJlcl90eXBlKS0+Z2V0X21heF92YWx1ZSgpOworICAgICAgICBpbnQgbWluX3ZhbHVlID0gKGVudW1fbWluX3ZhbHVlICE9IE5VTEwpID8gZW51bV9taW5fdmFsdWUtPmdldF92YWx1ZSgpIDogMDsKKyAgICAgICAgaW50IG1heF92YWx1ZSA9IChlbnVtX21heF92YWx1ZSAhPSBOVUxMKSA/IGVudW1fbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKSA6IDA7CisKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDE4LCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfaW50IChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgbWF4X3ZhbHVlIDw8ICIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgbWluX3ZhbHVlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc3RydWN0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgdF9wcm9ncmFtKiB0eXBlX3Byb2dyYW0gPSBtZW1iZXJfdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICAgICAgc3RyaW5nIHR5cGVfbnNwYWNlID0gdHlwZV9wcm9ncmFtID8gdHlwZV9wcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKSA6ICIiOworICAgICAgICBzdHJpbmcgdHlwZV9uc3BhY2VfcHJlZml4ID0KKyAgICAgICAgICB0eXBlX25zcGFjZS5lbXB0eSgpID8gIiIgOiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZV9uc3BhY2UpICsgIl8iOworCisgICAgICAgIHN0cmluZyBwYXJhbV90eXBlID0gdG9fdXBwZXJfY2FzZSh0eXBlX25zcGFjZV9wcmVmaXgpICsgIlRZUEVfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX3R5cGUtPmdldF9uYW1lKCkpKTsKKworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19vYmplY3QgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtX3R5cGUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKW1lbWJlcl90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBzdHJpbmcgcGFyYW1fdHlwZTsKKworICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhZWxlbV90eXBlLT5pc19zdHJpbmcoKSkgeworICAgICAgICAgIHBhcmFtX3R5cGUgPSAiR19UWVBFX0FSUkFZIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJhbV90eXBlID0gIkdfVFlQRV9QVFJfQVJSQVkiOworICAgICAgICB9CisKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfYm94ZWQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtX3R5cGUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfc2V0KCkgfHwgbWVtYmVyX3R5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiR19UWVBFX0hBU0hfVEFCTEUsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgIH0KKyAgfQorICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCAiR1R5cGUiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2dldF90eXBlICh2b2lkKSIgPDwgZW5kbCA8PCAieyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICBpZiAodHlwZSA9PSAwKSAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB0eXBlX2luZm8gPSAiIDw8IGVuZGwgPDwgIiAgICB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIHNpemVvZiAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAvKiBiYXNlX2luaXQgKi8iIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsIC8qIGJhc2VfZmluYWxpemUgKi8iCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgKEdDbGFzc0luaXRGdW5jKSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9jbGFzc19pbml0LCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAvKiBjbGFzc19maW5hbGl6ZSAqLyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMLCAvKiBjbGFzc19kYXRhICovIiA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICAgICAgPDwgbmFtZSA8PCAiKSwiIDw8IGVuZGwgPDwgIiAgICAgIDAsIC8qIG5fcHJlYWxsb2NzICovIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfaW5zdGFuY2VfaW5pdCwiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgLyogdmFsdWVfdGFibGUgKi8iIDw8IGVuZGwgPDwgIiAgICB9OyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoVEhSSUZUX1RZUEVfU1RSVUNULCAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIlR5cGVcIiwiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwgIiAgfSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgcmV0dXJuIHR5cGU7IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGZ1bmN0aW9ucyB0byB3cml0ZSBUaHJpZnQgc3RydWN0dXJlcyB0byBhIHN0cmVhbS4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgaW50IGVycm9yX3JldCA9IDA7CisKKyAgaWYgKGlzX2Z1bmN0aW9uKSB7CisgICAgZXJyb3JfcmV0ID0gLTE7CisgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBnaW50MzIiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICAgICAgIDw8ICJfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImdpbnQzMiByZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnaW50MzIgeGZlciA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgdGhpc19nZXQgPDwgZW5kbDsKKyAgLy8gc2F0aXNmeSAtV2FsbCBpbiB0aGUgY2FzZSBvZiBhbiBlbXB0eSBzdHJ1Y3QKKyAgaWYgKCF0aGlzX2dldC5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwgbmFtZQorICAgICAgPDwgIlwiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpc19vYmplY3QtPl9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBUUlVFKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldAorICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHRoaXNfbmFtZSwgIiIsIGVycm9yX3JldCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byByZWFkIFRocmlmdCBzdHJ1Y3R1cmVzIGZyb20gYSBzdHJlYW0uCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKKyAgaW50IGVycm9yX3JldCA9IDA7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoaXNfZnVuY3Rpb24pIHsKKyAgICBlcnJvcl9yZXQgPSAtMTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLyogcmVhZHMgYSAiIDw8IG5hbWVfdSA8PCAiIG9iamVjdCAqLyIgPDwgZW5kbCA8PCAic3RhdGljIGdpbnQzMiIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKKyAgICAgICAgICAgICAgICA8PCAiX3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBkZWNsYXJlIHN0YWNrIHRlbXAgdmFyaWFibGVzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJnY2hhciAqbmFtZSA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImdpbnQxNiBmaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJndWludDMyIGxlbiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZ3BvaW50ZXIgZGF0YSA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImdib29sZWFuIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBGQUxTRTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSBzb21lIHZhcmlhYmxlcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB0aGVzZSBhcmVuJ3QgdXNlZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIlRIUklGVF9VTlVTRURfVkFSIChsZW4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGRhdGEpOyIgPDwgZW5kbDsKKworICBpZiAoIXRoaXNfZ2V0LmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIHJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0dXJlIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIHN0cnVjdCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgc3RydWN0IGZpZWxkcyAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAid2hpbGUgKDEpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIHJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsICZmaWQsIGVycm9yKSkgPCAwKSIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIGJyZWFrIGlmIHdlIGdldCBhIFNUT1AgZmllbGQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoZnR5cGUgPT0gVF9TVE9QKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gc3dpdGNoIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZQorICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWQpIiA8PCBlbmRsOworCisgIC8vIHN0YXJ0IHN3aXRjaAorICBzY29wZV91cChvdXQpOworCisgIC8vIGdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biB0eXBlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemUgZmllbGQKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHRoaXNfbmFtZSwgIiIsIGVycm9yX3JldCwgZmFsc2UpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgICAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIGRlZmF1bHQgY2FzZQorICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisKKyAgLy8gZW5kIHN3aXRjaAorICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gcmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworCisgIC8vIGVuZCB3aGlsZSBsb29wCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsOworCisgIC8vIGlmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZywgdGhyb3cgYW4gZXJyb3IKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgIFwibWlzc2luZyBmaWVsZFwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIC0xOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKGlzX2Z1bmN0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGVuZCB0aGUgZnVuY3Rpb24vc3RydWN0dXJlCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV8iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiaTE2IChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiZG91YmxlIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICIgPDwgbmFtZSA8PCAiID8gKChHQnl0ZUFycmF5ICopICIgPDwgbmFtZSA8PCAiKS0+ZGF0YSA6IE5VTEwsICIKKyAgICAgICAgICAgICAgPDwgbmFtZSA8PCAiID8gKChHQnl0ZUFycmF5ICopICIgPDwgbmFtZSA8PCAiKS0+bGVuIDogMCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJzdHJpbmcgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgd3JpdGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsIChnaW50MzIpICIgPDwgbmFtZTsKKyAgICB9CisgICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyIgKyBuYW1lICsgIicgVFlQRSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodHlwZSkpOworICB9Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKCIgPDwgcHJlZml4CisgICAgICA8PCAiKSwgcHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSogdGtleSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB0dmFsID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBzdHJpbmcgdGtleV9uYW1lID0gdHlwZV9uYW1lKHRrZXkpOworICAgIHN0cmluZyB0dmFsX25hbWUgPSB0eXBlX25hbWUodHZhbCk7CisgICAgc3RyaW5nIHRrZXlfcHRyOworICAgIHN0cmluZyB0dmFsX3B0cjsKKyAgICBzdHJpbmcga2V5bmFtZSA9IHRtcCgia2V5Iik7CisgICAgc3RyaW5nIHZhbG5hbWUgPSB0bXAoInZhbCIpOworCisgICAgZGVjbG9yZV9sb2NhbF92YXJpYWJsZV9mb3Jfd3JpdGUob3V0LCB0a2V5LCBrZXluYW1lKTsKKyAgICBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvdXQsIHR2YWwsIHZhbG5hbWUpOworCisgICAgLyogSWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcgdHlwZSBzbworICAgICAgIHdlIGNhbiBjb3JyZWN0bHkgZGV0ZXJtaW5lIGhvdyB0byBnZW5lcmF0ZSBhIHBvaW50ZXIgdG8gaXQgKi8KKyAgICB0a2V5ID0gZ2V0X3RydWVfdHlwZSh0a2V5KTsKKyAgICB0dmFsID0gZ2V0X3RydWVfdHlwZSh0dmFsKTsKKworICAgIHRrZXlfcHRyID0gdGtleS0+aXNfc3RyaW5nKCkgfHwgIXRrZXktPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisgICAgdHZhbF9wdHIgPSB0dmFsLT5pc19zdHJpbmcoKSB8fCAhdHZhbC0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKworICAgIC8qCisgICAgICogU29tZSB1Z2xpbmVzcyBoZXJlLiAgVG8gbWF4aW1pemUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlCisgICAgICogYXZvaWQgdXNpbmcgR0hhc2hUYWJsZUl0ZXIgYW5kIGluc3RlYWQgZ2V0IGEgR0xpc3Qgb2YgYWxsIGtleXMsCisgICAgICogdGhlbiBjb3B5IGl0IGludG8gYSBhcnJheSBvbiB0aGUgc3RhY2ssIGFuZCBmcmVlIGl0LgorICAgICAqIFRoaXMgaXMgYmVjYXVzZSB3ZSBtYXkgZXhpdCBlYXJseSBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvIGZyZWUgdGhlCisgICAgICogR0xpc3QuCisgICAgICovCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0ciA8PCAiKiBrZXlzOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IGkgPSAwLCBrZXlfY291bnQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKHRrZXkpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKHR2YWwpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIgPyAiCisgICAgICAgIDw8ICIoZ2ludDMyKSBnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIikgOiAwIgorICAgICAgICA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGdfaGFzaF90YWJsZV9mb3JlYWNoICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAorICAgICAgICA8PCAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleV9jb3VudCA9IGdfbGlzdF9sZW5ndGggKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleXMgPSBnX25ld2EgKCIgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyCisgICAgICAgIDw8ICIsIGtleV9jb3VudCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGl0ZXIgPSBnX2xpc3RfZmlyc3QgKGtleV9saXN0KTsgaXRlcjsgIgorICAgICAgICAgICAiaXRlciA9IGl0ZXItPm5leHQpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAia2V5c1tpKytdID0gKCIgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyCisgICAgICAgIDw8ICIpIGl0ZXItPmRhdGE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyArK2kpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGtleW5hbWUgPDwgIiA9IGtleXNbaV07IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHZhbG5hbWUgPDwgIiA9ICgiIDw8IHR2YWxfbmFtZSA8PCB0dmFsX3B0cgorICAgICAgICA8PCAiKSBnX2hhc2hfdGFibGVfbG9va3VwICgoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXgKKyAgICAgICAgPDwgIiksIChncG9pbnRlcikgIiA8PCBrZXluYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X21hcCopdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRrZXlfcHRyICsgIiAiICsga2V5bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHZhbF9wdHIgKyAiICIgKyB2YWxuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIHRlbGVtID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgc3RyaW5nIHRlbGVtX25hbWUgPSB0eXBlX25hbWUodGVsZW0pOworICAgIHN0cmluZyB0ZWxlbV9wdHIgPSB0ZWxlbS0+aXNfc3RyaW5nKCkgfHwgIXRlbGVtLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiR0xpc3QgKmtleV9saXN0ID0gTlVMTCwgKml0ZXIgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0ciA8PCAiKiBrZXlzOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IGkgPSAwLCBrZXlfY291bnQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIgZWxlbTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImdwb2ludGVyIHZhbHVlOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0odGVsZW0pIDw8ICIsICIgPDwgcHJlZml4IDw8ICIgPyAiCisgICAgICAgIDw8ICIoZ2ludDMyKSBnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIikgOiAwIgorICAgICAgICA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGdfaGFzaF90YWJsZV9mb3JlYWNoICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAorICAgICAgICA8PCAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleV9jb3VudCA9IGdfbGlzdF9sZW5ndGggKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImtleXMgPSBnX25ld2EgKCIgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIKKyAgICAgICAgPDwgIiwga2V5X2NvdW50KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyAiCisgICAgICAgICAgICJpdGVyID0gaXRlci0+bmV4dCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJrZXlzW2krK10gPSAoIiA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0cgorICAgICAgICA8PCAiKSBpdGVyLT5kYXRhOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ19saXN0X2ZyZWUgKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IGtleV9jb3VudDsgKytpKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxlbSA9IGtleXNbaV07IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YWx1ZSA9IChncG9pbnRlcikgZ19oYXNoX3RhYmxlX2xvb2t1cCAiCisgICAgICAgICAgICIoKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8ICIpLCAoZ3BvaW50ZXIpIGVsZW0pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3NldCopdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbGVtX3B0ciArICJlbGVtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBsZW5ndGggPSAiKCIgKyBwcmVmaXggKyAiID8gIiArIHByZWZpeCArICItPmxlbiA6IDApIjsKKyAgICBzdHJpbmcgaSA9IHRtcCgiaSIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIChnaW50MzIpICIKKyAgICAgICAgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IGxlbmd0aCA8PCAiOyAiCisgICAgICAgIDw8IGkgPDwgIisrKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCBpLCBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbHVlKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKKworICAvLyBjYXN0IHRvIG5vbi1jb25zdAorICBzdHJpbmcgY2FzdCA9ICIiOworICBzdHJpbmcgbmFtZSA9ICJnX3B0cl9hcnJheV9pbmRleCAoKEdQdHJBcnJheSAqKSAiICsgbGlzdCArICIsICIgKyBpbmRleCArICIpIjsKKworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGxpc3QgZWxlbWVudCB0eXBlIGNhbm5vdCBiZSB2b2lkIik7CisgIH0gZWxzZSBpZiAoaXNfbnVtZXJpYyh0dHlwZSkpIHsKKyAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgIiArIGJhc2VfdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyBpbmRleCArICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICBjYXN0ID0gIihnY2hhciopIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7CisgICAgY2FzdCA9ICIoR0hhc2hUYWJsZSopIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAoZXR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgICB9CisgICAgY2FzdCA9IGlzX251bWVyaWMoZXR5cGUpID8gIihHQXJyYXkqKSIgOiAiKEdQdHJBcnJheSopIjsKKyAgfQorCisgIHRfZmllbGQgZWZpZWxkKHR0eXBlLCAiKCIgKyBjYXN0ICsgbmFtZSArICIpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKK30KKworLyogZGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBlcnJvcl9yZXQsIGFsbG9jYXRlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUsIGVycm9yX3JldCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImdfZnJlZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkXyI7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJiaW5hcnkgKHByb3RvY29sLCAmZGF0YSwgJmxlbiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgImJvb2wgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAiYnl0ZSAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAiaTE2IChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8ICJpMzIgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgImk2NCAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAiZG91YmxlIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgcmVhZGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgIH0KKyAgICBvdXQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIKKyAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIGxvYWQgdGhlIGJ5dGUgYXJyYXkgd2l0aCB0aGUgZGF0YQorICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgJiYgdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGdfYnl0ZV9hcnJheV9uZXcoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ19ieXRlX2FycmF5X2FwcGVuZCAoIiA8PCBuYW1lIDw8ICIsIChndWludDggKikgZGF0YSwgKGd1aW50KSBsZW4pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJnX2ZyZWUgKGRhdGEpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIHQgPSB0bXAoImVjYXN0Iik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICYiIDw8IHQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICciICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIicgVFlQRSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodHlwZSkpOworICB9CisKKyAgLy8gaWYgdGhlIHR5cGUgaXMgbm90IHJlcXVpcmVkIGFuZCB0aGlzIGlzIGEgdGhyaWZ0IHN0cnVjdCAobm8gcHJlZml4KSwKKyAgLy8gc2V0IHRoZSBpc3NldCB2YXJpYWJsZS4gIGlmIHRoZSB0eXBlIGlzIHJlcXVpcmVkLCB0aGVuIHNldCB0aGUKKyAgLy8gbG9jYWwgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgdmFsdWUgd2FzIHNldCwgc28gdGhhdCB3ZSBjYW4gZG8gICAgLy8gdmFsaWRhdGlvbiBsYXRlci4KKyAgaWYgKHByZWZpeCAhPSAiIiAmJiB0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJfX2lzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeCA8PCAiID0gVFJVRTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAocHJlZml4ICE9ICIiICYmIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSkgeworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIFRoaXMgc3RydWN0IGlzIGFuIGV4Y2VwdGlvbiAqLyIgPDwgZW5kbDsKKyAgICBhbGxvY2F0ZSA9IHRydWU7CisgIH0KKworICBpZiAoYWxsb2NhdGUpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICggIiA8PCBwcmVmaXggPDwgIiAhPSBOVUxMKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICgiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXgKKyAgICAgIDw8ICIpLCBwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGFsbG9jYXRlKSB7CisgICAgaW5kZW50KG91dCkgPDwgImdfb2JqZWN0X3VucmVmICgiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJndWludDMyIHNpemU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJndWludDMyIGk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGtleV90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSB2YWx1ZV90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBtYXAgYmVnaW4gbWFya2VyICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgICAgIiZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIG1hcCBlbGVtZW50cworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIG1hcCdzIGZpZWxkcyAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyByZWFkIG1hcCBlbmQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBlbmQgbWFya2VyICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgICAgIiZlbGVtZW50X3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZXQgZWxlbWVudHMgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgsIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gcmVhZCBzZXQgZW5kCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgICAgICImZWxlbWVudF90eXBlLCZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGxpc3QgZWxlbWVudHMgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfbGlzdCopdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIC8vIHJlYWQgbGlzdCBlbmQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCAiCisgICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIG5hbWUsIGJvb2wgZm9yX2hhc2hfdGFibGUpIHsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHR0eXBlKTsKKworICAvKiBJZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcgdHlwZSBzbyB3ZQorICAgICBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvIGl0ICovCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwdHIgPSAhaXNfbnVtZXJpYyh0dHlwZSkgPyAiIiA6ICIqIjsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgIiAiIDw8IG5hbWUgPDwgIiA9ICIKKyAgICAgICAgPDwgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0bWFwLT5nZXRfdmFsX3R5cGUoKSkgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgIiAiIDw8IG5hbWUgPDwgIiA9ICIKKyAgICAgICAgPDwgZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSA8PCBlbmRsOworICB9IGVsc2UgaWYgKGZvcl9oYXNoX3RhYmxlICYmIHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZQorICAgICAgICA8PCAocHRyICE9ICIiID8gIiA9IGdfbmV3ICgiICsgdG5hbWUgKyAiLCAxKSIgOiAiID0gTlVMTCIpIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHR0eXBlKTsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHB0ciA9IHR0eXBlLT5pc19zdHJpbmcoKSB8fCAhdHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gIiAiIDogIiogIjsKKyAgc3RyaW5nIGluaXRfdmFsID0gdHR5cGUtPmlzX2VudW0oKSA/ICIiIDogIiA9IE5VTEwiOworICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8IG5hbWUgPDwgaW5pdF92YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdGtleSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHR2YWwgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKKyAgc3RyaW5nIGtleW5hbWUgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsbmFtZSA9IHRtcCgidmFsIik7CisKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRrZXksIGtleW5hbWUsIHRydWUpOworICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHZhbCwgdmFsbmFtZSwgdHJ1ZSk7CisKKyAgLyogSWYgZWl0aGVyIHRoZSBrZXkgb3IgdmFsdWUgdHlwZSBpcyBhIHR5cGVkZWYsIGZpbmQgaXRzIHVuZGVybHlpbmcKKyAgICAgdHlwZSBzbyB3ZSBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvCisgICAgIGl0ICovCisgIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKHRrZXkpOworICB0dmFsID0gZ2V0X3RydWVfdHlwZSh0dmFsKTsKKworICBzdHJpbmcgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKyAgc3RyaW5nIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisKKyAgLy8gZGVzZXJpYWxpemUgdGhlIGZpZWxkcyBvZiB0aGUgbWFwIGVsZW1lbnQKKyAgdF9maWVsZCBma2V5KHRrZXksIHRrZXlfcHRyICsga2V5bmFtZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCAiIiwgZXJyb3JfcmV0KTsKKyAgdF9maWVsZCBmdmFsKHR2YWwsIHR2YWxfcHRyICsgdmFsbmFtZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgJiYgIiA8PCBrZXluYW1lIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8IGtleW5hbWUKKyAgICAgICAgICAgICAgPDwgIiwgKGdwb2ludGVyKSAiIDw8IHZhbG5hbWUgPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHRlbGVtID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRlbGVtLCBlbGVtLCB0cnVlKTsKKworICB0X2ZpZWxkIGZlbGVtKHRlbGVtLCB0ZWxlbV9wdHIgKyBlbGVtKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgJiYgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8ICIsIChncG9pbnRlcikgIiA8PCBlbGVtCisgICAgICAgICAgICAgIDw8ICIsIChncG9pbnRlcikgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICAodm9pZClpbmRleDsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICBzdHJpbmcgdGVsZW1fcHRyID0gIWlzX251bWVyaWModHR5cGUpID8gIiIgOiAiKiI7CisKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHR0eXBlLCBlbGVtLCBmYWxzZSk7CisKKyAgdF9maWVsZCBmZWxlbSh0dHlwZSwgdGVsZW1fcHRyICsgZWxlbSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgIiIsIGVycm9yX3JldCk7CisKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICB9IGVsc2UgaWYgKGlzX251bWVyaWModHR5cGUpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImdfYXJyYXlfYXBwZW5kX3ZhbHMgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiLCAxKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImdfcHRyX2FycmF5X2FkZCAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlID09IE5VTEwpCisgICAgcmV0dXJuICJOVUxMIjsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZ19mcmVlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAidGhyaWZ0X3N0cmluZ19mcmVlIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAiZ19mcmVlIjsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJOVUxMIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIHRocmlmdF9zYWZlX2hhc2hfdGFibGVfZGVzdHJveSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICJnX29iamVjdF91bnJlZiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfYXJyYXlfdW5yZWYiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IGV0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgIDsKKyAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX2FycmF5X3VucmVmIjsKKyAgICB9CisgICAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZCBpbnNpZGUgdGhlIGFycmF5OiAlc1xuIiwgZXR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIGluc2lkZSBhcnJheSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOworICB9CisgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZSA9PSBOVUxMKQorICAgIHJldHVybiAiTlVMTCI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJ0aHJpZnRfYm9vbGVhbl9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50OF9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAidGhyaWZ0X2ludDE2X2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJnX2ludF9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiZ19pbnQ2NF9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZ19kb3VibGVfaGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gImdfc3RyX2hhc2giOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2hhc2giOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2hhc2giOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSgoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfQorICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkOiAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCI7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZSA9PSBOVUxMKQorICAgIHJldHVybiAiTlVMTCI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJ0aHJpZnRfYm9vbGVhbl9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAidGhyaWZ0X2ludDhfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJ0aHJpZnRfaW50MTZfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJnX2ludF9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImdfaW50NjRfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJnX2RvdWJsZV9lcXVhbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gImdfc3RyX2VxdWFsIjsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJnX2RpcmVjdF9lcXVhbCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfZXF1YWwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOworICB9CisgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRfdHlwZSoga2V5LCB0X3R5cGUqIHZhbHVlKSB7CisgIHN0cmluZyBoYXNoX2Z1bmMgPSBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKGtleSk7CisgIHN0cmluZyBjbXBfZnVuYyA9IGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZShrZXkpOworICBzdHJpbmcga2V5X2ZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUoa2V5KTsKKyAgc3RyaW5nIHZhbHVlX2ZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodmFsdWUpOworCisgIHJldHVybiAiZ19oYXNoX3RhYmxlX25ld19mdWxsICgiICsgaGFzaF9mdW5jICsgIiwgIiArIGNtcF9mdW5jICsgIiwgIiArIGtleV9mcmVlX2Z1bmMgKyAiLCAiCisgICAgICAgICArIHZhbHVlX2ZyZWVfZnVuYyArICIpOyI7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSIpOworICB9IGVsc2UgaWYgKGlzX251bWVyaWModHR5cGUpKSB7CisgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mICgiICsgYmFzZV90eXBlX25hbWUodHR5cGUpICsgIikpOyI7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIGZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodHR5cGUpOworICAgIHJldHVybiAiZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgiICsgZnJlZV9mdW5jICsgIik7IjsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVVElMSVRZIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFVwcGVyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgorICovCitzdHJpbmcgdG9fdXBwZXJfY2FzZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcyhuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0ocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG91cHBlcik7CisgIHJldHVybiBzOworICAvLyAgcmV0dXJuIGJvb3N0Ojp0b191cHBlcl9jb3B5IChuYW1lKTsKK30KKworLyoqCisgKiBMb3dlciBjYXNlIGEgc3RyaW5nLiAgV3JhcHMgYm9vc3QncyBzdHJpbmcgdXRpbGl0eS4KKyAqLworc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHMobmFtZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCA6OnRvbG93ZXIpOworICByZXR1cm4gczsKKyAgLy8gIHJldHVybiBib29zdDo6dG9fbG93ZXJfY29weSAobmFtZSk7Cit9CisKKy8qKgorICogTWFrZXMgYSBzdHJpbmcgZnJpZW5kbHkgdG8gQyBjb2RlIHN0YW5kYXJkcyBieSBsb3dlcmNhc2luZyBhbmQgYWRkaW5nCisgKiB1bmRlcnNjb3Jlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZToKKyAqCisgKiBJbnB1dDogIlpvbWdDYW1lbENhc2UiCisgKiBPdXRwdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCisgKi8KK3N0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBpbnQgcG9zID0gMDsKKworICAvKiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzbid0IHVuZGVyc2NvcmVkIGlmIHVwcGVyY2FzZSwganVzdCBsb3dlcmNhc2VkICovCisgIHJldCArPSB0b2xvd2VyKHRtcFtwb3NdKTsKKyAgcG9zKys7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSBwb3M7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGxjID0gdG9sb3dlcih0bXBbaV0pOworICAgIGlmIChsYyAhPSB0bXBbaV0pIHsKKyAgICAgIHJldCArPSAnXyc7CisgICAgfQorICAgIHJldCArPSBsYzsKKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUGVyZm9ybXMgdGhlIHJldmVyc2Ugb3BlcmF0aW9uIG9mIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlczogVGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBpcyBtYWRlIHVwcGVyY2FzZSwgYWxvbmcgd2l0aCBlYWNoIGNoYXJhY3RlciB0aGF0CisgKiBmb2xsb3dzIGFuIHVuZGVyc2NvcmUgKHdoaWNoIGlzIHJlbW92ZWQpLiBVc2VmdWwgZm9yIGNvbnZlcnRpbmcgVGhyaWZ0CisgKiBzZXJ2aWNlLW1ldGhvZCBuYW1lcyBpbnRvIEdPYmplY3Qtc3R5bGUgY2xhc3MgbmFtZXMuCisgKgorICogSW5wdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCisgKiBPdXRwdXQ6ICJab21nQ2FtZWxDYXNlIgorICovCitzdHJpbmcgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgYm9vbCB1cHBlcmNhc2VfbmV4dCA9IHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGMgPSB0bXBbaV07CisgICAgaWYgKGMgPT0gJ18nKSB7CisgICAgICB1cHBlcmNhc2VfbmV4dCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh1cHBlcmNhc2VfbmV4dCkgeworICAgICAgICByZXQgKz0gdG91cHBlcihjKTsKKyAgICAgICAgdXBwZXJjYXNlX25leHQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldCArPSBjOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIHJlZ2lzdGVyIHRoaXMgZ2VuZXJhdG9yIHdpdGggdGhlIG1haW4gcHJvZ3JhbSAqLworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihjX2dsaWIsICJDLCB1c2luZyBHTGliIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGQwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0gUGF0cmljayBDb2xsaXNvbiA8cGF0cmlja0Bjb2xsaXNvbi5pZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0gRmFjZWJvb2sKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworLyoqCisgKiBDb21tb24gTGlzcCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgQ29sbGlzb24gPHBhdHJpY2tAY29sbGlzb24uaWU+CisgKi8KK2NsYXNzIHRfY2xfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CisgcHVibGljOgorICB0X2NsX2dlbmVyYXRvcigKKyAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKKyAgeworICAgIG5vX2FzZCA9IGZhbHNlOworICAgIHN5c3RlbV9wcmVmaXggPSAidGhyaWZ0LWdlbi0iOworCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGZvcihpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZihpdGVyLT5maXJzdC5jb21wYXJlKCJub19hc2QiKSA9PSAwKSB7CisgICAgICAgIG5vX2FzZCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInN5c19wcmVmIikgPT0gMCkgeworCXN5c3RlbV9wcmVmaXggPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY2w6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNsIjsKKyAgICBjb3B5X29wdGlvbnNfID0gb3B0aW9uX3N0cmluZzsKKyAgfQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICAgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAgICAodF9jb25zdCogICAgdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gICAgKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jbF9zdHJ1Y3QgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NsX3N0cnVjdF9pbnRlcm5hbCAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZik7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyBjbF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgdm9pZCBhc2RmX2RlZihzdGQ6Om9zdHJlYW0gJm91dCk7CisgIHZvaWQgcGFja2FnZV9kZWYoc3RkOjpvc3RyZWFtICZvdXQpOworICB2b2lkIHBhY2thZ2VfaW4oc3RkOjpvc3RyZWFtICZvdXQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2Vfb2YodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVzcGVjICh0X3R5cGUgKnQpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgY2xfZG9jc3RyaW5nKHN0ZDo6c3RyaW5nIHJhdyk7CisKKyBwcml2YXRlOgorCisgIGludCB0ZW1wb3JhcnlfdmFyOworICAvKioKKyAgICogSXNvbGF0ZSB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgY2FuIHJlcXVpcmUgc3RydWN0dXJlIGRlZmluaXRpb25zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfYXNkXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3ZhcnNfOworCisgIHN0ZDo6c3RyaW5nIGNvcHlfb3B0aW9uc187CisKKyAgYm9vbCBub19hc2Q7CisgIHN0ZDo6c3RyaW5nIHN5c3RlbV9wcmVmaXg7Cit9OworCisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBzdHJpbmcgcHJvZ3JhbV9kaXIgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgcHJvZ3JhbV9uYW1lXzsKKyAgTUtESVIocHJvZ3JhbV9kaXIuY19zdHIoKSk7CisKKyAgdGVtcG9yYXJ5X3ZhciA9IDA7CisKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHByb2dyYW1fZGlyICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItdHlwZXMubGlzcCI7CisgIHN0cmluZyBmX3ZhcnNfbmFtZSA9IHByb2dyYW1fZGlyICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItdmFycy5saXNwIjsKKworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgZl90eXBlc18gPDwgY2xfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl92YXJzXy5vcGVuKGZfdmFyc19uYW1lLmNfc3RyKCkpOworICBmX3ZhcnNfIDw8IGNsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgcGFja2FnZV9kZWYoZl90eXBlc18pOworICBwYWNrYWdlX2luKGZfdHlwZXNfKTsKKyAgcGFja2FnZV9pbihmX3ZhcnNfKTsKKworICBpZiAoIW5vX2FzZCkgeworICAgIHN0cmluZyBmX2FzZF9uYW1lID0gcHJvZ3JhbV9kaXIgKyAiLyIgKyBzeXN0ZW1fcHJlZml4ICsgcHJvZ3JhbV9uYW1lXyArICIuYXNkIjsKKyAgICBmX2FzZF8ub3BlbihmX2FzZF9uYW1lLmNfc3RyKCkpOworICAgIGZfYXNkXyA8PCBjbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICAgIGFzZGZfZGVmKGZfYXNkXyk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIHJlc3VsdCArPSAiOmRlcGVuZHMtb24gKDp0aHJpZnQiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgcmVzdWx0ICs9ICIgOiIgKyBzeXN0ZW1fcHJlZml4ICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSk7CisgIH0KKyAgcmVzdWx0ICs9ICIpXG4iOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnBhY2thZ2Vfb2YodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjbCIpOworICByZXR1cm4gcHJlZml4LmVtcHR5KCkgPyAidGhyaWZ0LWdlbmVyYXRlZCIgOiBwcmVmaXg7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZSgpIHsKKyAgcmV0dXJuIHBhY2thZ2Vfb2YocHJvZ3JhbV8pOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgc3ltYm9sKSB7CisgIHJldHVybiAiXCIiICsgc3ltYm9sICsgIlwiIjsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpjbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybgorICAgIHN0ZDo6c3RyaW5nKCI7OzsgIikgKyAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKworICAgICI7OzsgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCisgICAgIjs7OyBvcHRpb25zIHN0cmluZzogIiArIGNvcHlfb3B0aW9uc18gKyAiXG4iOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmNsX2RvY3N0cmluZyhzdHJpbmcgcmF3KSB7CisgIHJlcGxhY2UocmF3LmJlZ2luKCksIHJhdy5lbmQoKSwgJyInLCAnXCcnKTsKKyAgcmV0dXJuIHJhdzsKK30KKworCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfYXNkXy5jbG9zZSgpOworICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3ZhcnNfLmNsb3NlKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVkX3BhY2thZ2UoKSB7CisgIHJldHVybiBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIik7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmFzZGZfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisgIG91dCA8PCAiKGFzZGY6ZGVmc3lzdGVtICM6IiA8PCBzeXN0ZW1fcHJlZml4IDw8IHByb2dyYW1fbmFtZV8gPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfaW5jbHVkZXMoKQorICAgICAgPDwgaW5kZW50KCkgPDwgIjpzZXJpYWwgdCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjpjb21wb25lbnRzICgiCisgICAgICA8PCAiKDpmaWxlIFwiIiA8PCBwcm9ncmFtX25hbWVfIDw8ICItdHlwZXNcIikgIgorICAgICAgPDwgIig6ZmlsZSBcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiLXZhcnNcIikpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqKgorICogR2VuZXJhdGUgYSBwYWNrYWdlIGRlZmluaXRpb24uIEFkZCB1c2UgcmVmZXJlbmNlcyBlcXVpdmFsZW50IHRvIHRoZSBpZGwgZmlsZSdzIGluY2x1ZGUgc3RhdGVtZW50cy4KKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9kZWYoc3RkOjpvc3RyZWFtICZvdXQpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKworICBvdXQgPDwgIih0aHJpZnQ6ZGVmLXBhY2thZ2UgOiIgPDwgcGFja2FnZSgpOworICBpZiAoIGluY2x1ZGVzLnNpemUoKSA+IDAgKSB7CisgICAgb3V0IDw8ICIgOnVzZSAoIjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICBvdXQgPDwgIiA6IiA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpIjsKKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9pbihzdGQ6Om9zdHJlYW0gJm91dCkgeworICBvdXQgPDwgIihjbDppbi1wYWNrYWdlIDoiIDw8IHBhY2thZ2UoKSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gQ29tbW9uIExpc3AsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgIih0aHJpZnQ6ZGVmLWVudW0gIiA8PCBwcmVmaXgodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBpbnQgdmFsdWUgPSAtMTsKKworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIigiOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGlmKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICI7CisKKyAgICBmX3R5cGVzXyA8PCAiKFwiIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIC4gIiA8PCB2YWx1ZSA8PCAiKSI7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgIikpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfdmFyc18gPDwgIih0aHJpZnQ6ZGVmLWNvbnN0YW50ICIgPDwgcHJlZml4KG5hbWUpIDw8ICIgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICIpIgorICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJcIiIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidCIgOiAibmlsIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAodHlwZS0+aXNfc3RydWN0KCkgPyAiKG1ha2UtaW5zdGFuY2UgJyIgOiAiKG1ha2UtZXhjZXB0aW9uICciKSA8PAorICAgICAgICAgICBsb3dlcmNhc2UodHlwZS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgIiA8PAorICAgICAgICByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKSI7CisKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgLy8gZW1pdCBhbiBoYXNoIGZvcm0gd2l0aCBib3RoIGtleXMgYW5kIHZhbHVlcyB0byBiZSBldmFsdWF0ZWQKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICIodGhyaWZ0Om1hcCAiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIihjbDpjb25zICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiKSI7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIih0aHJpZnQ6c2V0IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIih0aHJpZnQ6bGlzdCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0KGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8ICIoIjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKworICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5iZWdpbigpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCAiKCIgPDwgcHJlZml4KCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8CisgICAgICAgICggKE5VTEwgIT0gdmFsdWUpID8gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA6ICJuaWwiICkgPDwKKyAgICAgICAgIiA6aWQgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKTsKKyAgICBpZiAoIHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICJzdHJpbmciID09IHR5cGVzcGVjKHR5cGUpICkKKyAgICAgIGlmICggKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpICkKKyAgICAgICAgb3V0IDw8ICIgOnR5cGUgYmluYXJ5IjsKKyAgICAgIGVsc2UKKyAgICAgICAgb3V0IDw8ICIgOnR5cGUgc3RyaW5nIjsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIiA6dHlwZSAiIDw8IHR5cGVzcGVjKHR5cGUpOworICAgIGlmICggKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCApIHsKKyAgICAgIG91dCA8PCAiIDpvcHRpb25hbCB0IjsKKyAgICB9CisgICAgaWYgKCAoKm1faXRlciktPmhhc19kb2MoKSkgeworICAgICAgb3V0IDw8ICIgOmRvY3VtZW50YXRpb24gXCIiIDw8IGNsX2RvY3N0cmluZygoKm1faXRlciktPmdldF9kb2MoKSkgPDwgIlwiIjsKKyAgICB9CisgICAgb3V0IDw8IikiOworICB9CisKKyAgb3V0IDw8ICIpIjsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2xfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICBzdGQ6OnN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBvdXQgPDwgKGlzX2V4Y2VwdGlvbiA/ICIodGhyaWZ0OmRlZi1leGNlcHRpb24gIiA6ICIodGhyaWZ0OmRlZi1zdHJ1Y3QgIikgPDwKKyAgICAgIHByZWZpeChuYW1lKSA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCB0c3RydWN0LT5oYXNfZG9jKCkgKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDsKKyAgICBvdXQgPDwgIlwiIiA8PCBjbF9kb2NzdHJpbmcodHN0cnVjdC0+Z2V0X2RvYygpKSA8PCAiXCIiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGYpIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsKG91dCwgZi0+Z2V0X3hjZXB0aW9ucygpLCB0cnVlKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2NsaWVudCA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgIH0KKworICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHNfY2xpZW50LmVtcHR5KCkgPyAibmlsIiA6IHByZWZpeChleHRlbmRzX2NsaWVudCk7CisKKyAgZl90eXBlc18gPDwgIih0aHJpZnQ6ZGVmLXNlcnZpY2UgIiA8PCBwcmVmaXgoc2VydmljZV9uYW1lXykgPDwgIiAiCisgICAgICAgICAgIDw8IGV4dGVuZHNfY2xpZW50OworCisgIGluZGVudF91cCgpOworCisgIGlmICggdHNlcnZpY2UtPmhhc19kb2MoKSkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIig6ZG9jdW1lbnRhdGlvbiBcIiIgPDwgY2xfZG9jc3RyaW5nKHRzZXJ2aWNlLT5nZXRfZG9jKCkpIDw8ICJcIikiOworICAgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIGZ1bmN0aW9uID0gKmZfaXRlcjsKKyAgICBzdHJpbmcgZm5hbWUgPSBmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKyAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworCisgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKDptZXRob2QgIiA8PCBwcmVmaXgoZm5hbWUpOworICAgIGZfdHlwZXNfIDw8ICIgKCIgPDwgc2lnbmF0dXJlIDw8ICIgIiAgPDwgdHlwZXNwZWMoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKSI7CisgICAgaWYgKHhtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiA6ZXhjZXB0aW9ucyAiIDsKKyAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoZl90eXBlc18sIGZ1bmN0aW9uKTsKKyAgICB9CisgICAgaWYgKCAoKmZfaXRlciktPmlzX29uZXdheSgpICkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIDpvbmV3YXkgdCI7CisgICAgfQorICAgIGlmICggKCpmX2l0ZXIpLT5oYXNfZG9jKCkgKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgOmRvY3VtZW50YXRpb24gXCIiCisgICAgICAgICAgICAgICA8PCBjbF9kb2NzdHJpbmcoKCpmX2l0ZXIpLT5nZXRfZG9jKCkpIDw8ICJcIiI7CisgIH0KKyAgICBmX3R5cGVzXyA8PCAiKSI7CisgIH0KKworICBmX3R5cGVzXyA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6dHlwZXNwZWModF90eXBlICp0KSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0IC0+IGlzX2JpbmFyeSgpKXsKKyAgICByZXR1cm4gImJpbmFyeSI7CisgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHQpOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm0gPSAodF9tYXAqKSB0OworICAgIHJldHVybiAiKHRocmlmdDptYXAgIiArIHR5cGVzcGVjKG0tPmdldF9rZXlfdHlwZSgpKSArICIgIiArCisgICAgICB0eXBlc3BlYyhtLT5nZXRfdmFsX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKHN0cnVjdCAiICsgcHJlZml4KHR5cGVfbmFtZSh0KSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIodGhyaWZ0Omxpc3QgIiArIHR5cGVzcGVjKCgodF9saXN0KikgdCktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIih0aHJpZnQ6c2V0ICIgKyB0eXBlc3BlYygoKHRfc2V0KikgdCktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoZW51bSBcIiIgKyAoKHRfZW51bSopIHQpLT5nZXRfbmFtZSgpICsgIlwiKSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIGdlbmVyYXRlIHRoaXM6ICIgKyB0eXBlX25hbWUodCk7CisgIH0KK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmdzdHJlYW0gcmVzOworICByZXMgPDwgIigiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXMgPDwgIiAiOworICAgIH0KKyAgICByZXMgPDwgIigiICsgcHJlZml4KCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8CisgICAgICB0eXBlc3BlYygoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAorICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgICIpIjsKKworCisgIH0KKyAgcmVzIDw8ICIpIjsKKyAgcmV0dXJuIHJlcy5zdHIoKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworCisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICBwcmVmaXggPSBwYWNrYWdlX29mKHByb2dyYW0pID09IHBhY2thZ2UoKSA/ICIiIDogcGFja2FnZV9vZihwcm9ncmFtKSArICI6IjsKKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworCisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgbmFtZSA9IGxvd2VyY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY2wsCisgICAgIkNvbW1vbiBMaXNwIiwKKyAgICAiICAgIG5vX2FzZDogICAgICAgICAgRG8gbm90IGRlZmluZSBBU0RGIHN5c3RlbXMgZm9yIGVhY2ggZ2VuZXJhdGVkIFRocmlmdCBwcm9ncmFtLlxuIgorICAgICIgICAgc3lzX3ByZWY9ICAgICAgICBUaGUgcHJlZml4IHRvIGdpdmUgQVNERiBzeXN0ZW0gbmFtZXMuIERlZmF1bHQ6IHRocmlmdC1nZW4tXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzY0NGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMzA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBPYmplY3RpdmUtQyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KKyAqLworY2xhc3MgdF9jb2NvYV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9jb2NvYV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxvZ191bmV4cGVjdGVkXyA9IGZhbHNlOworICAgIHZhbGlkYXRlX3JlcXVpcmVkXyA9IGZhbHNlOworICAgIGFzeW5jX2NsaWVudHNfID0gZmFsc2U7CisgICAgcHJvbWlzZV9raXRfID0gZmFsc2U7CisgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IGZhbHNlOworICAgIHBvZHNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibG9nX3VuZXhwZWN0ZWQiKSA9PSAwKSB7CisgICAgICAgIGxvZ191bmV4cGVjdGVkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInZhbGlkYXRlX3JlcXVpcmVkIikgPT0gMCkgeworICAgICAgICB2YWxpZGF0ZV9yZXF1aXJlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhc3luY19jbGllbnRzIikgPT0gMCkgeworICAgICAgICBhc3luY19jbGllbnRzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInByb21pc2Vfa2l0IikgPT0gMCkgeworICAgICAgICBwcm9taXNlX2tpdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJkZWJ1Z19kZXNjcmlwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGRlYnVnX2Rlc2NyaXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwb2RzIikgPT0gMCkgeworICAgICAgICBwb2RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY29jb2E6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNvY29hIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJveF9pdCA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfYXN5bmNfcHJvdG9jb2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmYWlsdXJlQmxvY2tOYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGlzdE5hbWUpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBjb2NvYV9wcmVmaXgoKTsKKyAgc3RkOjpzdHJpbmcgY29jb2FfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBjb2NvYV90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWYgPSBmYWxzZSwgYm9vbCBuZWVkc19tdXRhYmxlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBlbGVtZW50X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX3Byb3BlcnR5X2lzc2V0KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfcHJvcGVydHlfdW5zZXQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgaW52YWxpZF9yZXR1cm5fc3RhdGVtZW50KHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9lcnJvcik7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9lcnJvcik7CisgIHN0ZDo6c3RyaW5nIHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGluY2x1ZGVfZXJyb3IpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZm9ybWF0X2Nhc3RfZm9yX3R5cGUodF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgY2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOworICBzdGQ6OnN0cmluZyBib3godF90eXBlICp0dHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHVuYm94KHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpOworICBzdGQ6OnN0cmluZyBnZXR0ZXJfbmFtZShzdHJpbmcgZmllbGRfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNldHRlcl9uYW1lKHN0cmluZyBmaWVsZF9uYW1lKTsKKworICBib29sIHR5cGVfY2FuX2JlX2NvcHkodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgCisgICAgcmV0dXJuIHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorICAKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfOworICBpbnQgZXJyb3JfY29uc3RhbnRfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pbXBsXzsKKworICBib29sIGxvZ191bmV4cGVjdGVkXzsKKyAgYm9vbCB2YWxpZGF0ZV9yZXF1aXJlZF87CisgIGJvb2wgYXN5bmNfY2xpZW50c187CisgIGJvb2wgcHJvbWlzZV9raXRfOworICBib29sIGRlYnVnX2Rlc2NyaXB0aW9uc187CisgIGJvb2wgcG9kc187Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIGNvY29hX3ByZWZpeF8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKTsKKworICAvLyB3ZSBoYXZlIGEgLmggaGVhZGVyIGZpbGUuLi4KKyAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSArICIuaCI7CisgIHN0cmluZyBmX2hlYWRlcl9mdWxsbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmX2hlYWRlcl9uYW1lOworICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2hlYWRlcl8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2hlYWRlcl8gPDwgY29jb2FfaW1wb3J0cygpIDw8IGNvY29hX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgLy8gLi4uYW5kIGEgLm0gaW1wbGVtZW50YXRpb24gZmlsZQorICBzdHJpbmcgZl9pbXBsX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSArICIubSI7CisgIHN0cmluZyBmX2ltcGxfZnVsbG5hbWUgPSBnZXRfb3V0X2RpcigpICsgZl9pbXBsX25hbWU7CisgIGZfaW1wbF8ub3BlbihmX2ltcGxfZnVsbG5hbWUuY19zdHIoKSk7CisKKyAgZl9pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIGZfaW1wbF8gPDwgY29jb2FfaW1wb3J0cygpIDw8IGNvY29hX3RocmlmdF9pbXBvcnRzKCkgPDwgIiNpbXBvcnQgXCIiIDw8IGZfaGVhZGVyX25hbWUgPDwgIlwiIgorICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICBlcnJvcl9jb25zdGFudF8gPSA2MDAwMDsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+XG4iICsgIlxuIjsKK30KKworLyoqCisgKiBQcmludHMgdGhyaWZ0IHJ1bnRpbWUgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0IHJ1bnRpbWUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb2NvYV90aHJpZnRfaW1wb3J0cygpIHsKKworICB2ZWN0b3I8c3RyaW5nPiBpbmNsdWRlc19saXN0OworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRQcm90b2NvbEZhY3RvcnkuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVEFwcGxpY2F0aW9uRXJyb3IuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sRXJyb3IuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb3RvY29sVXRpbC5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvY2Vzc29yLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRCYXNlLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRBc3luY1RyYW5zcG9ydC5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUQmFzZUNsaWVudC5oIik7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGluY2x1ZGVzOworCisgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgIGZvciAoaV9pdGVyPWluY2x1ZGVzX2xpc3QuYmVnaW4oKTsgaV9pdGVyIT1pbmNsdWRlc19saXN0LmVuZCgpOyArK2lfaXRlcikgeworICAgIGluY2x1ZGVzIDw8ICIjaW1wb3J0ICI7CisgICAgaWYgKHBvZHNfKSB7CisgICAgICBpbmNsdWRlcyA8PCAiPFRocmlmdC8iIDw8ICppX2l0ZXIgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICBpbmNsdWRlcyA8PCAiXCIiIDw8ICppX2l0ZXIgPDwgIlwiIjsKKyAgICB9CisgICAgaW5jbHVkZXMgPDwgZW5kbDsKKyAgfQorCisgIGluY2x1ZGVzIDw8IGVuZGw7CisKKyAgaWYgKHByb21pc2Vfa2l0XykgeworICAgIGluY2x1ZGVzIDw8ICIjaW1wb3J0ICI7CisgICAgaWYgKHBvZHNfKSB7CisgICAgICBpbmNsdWRlcyA8PCAiPFByb21pc2VLaXQvUHJvbWlzZUtpdC5oPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGluY2x1ZGVzIDw8ICJcIlByb21pc2VLaXQuaFwiIjsKKyAgICB9CisgICAgaW5jbHVkZXMgPDwgZW5kbDsKKyAgfQorCisgIC8vIEluY2x1ZGUgb3RoZXIgVGhyaWZ0IGluY2x1ZGVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgb3RoZXJfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3RoZXJfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpbmNsdWRlcyA8PCAiI2ltcG9ydCBcIiIKKyAgICAgICAgICAgICA8PCBvdGhlcl9pbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKQorICAgICAgICAgICAgIDw8IGNhcGl0YWxpemUob3RoZXJfaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgPDwgIi5oXCIiIDw8IGVuZGw7CisgIH0KKworICBpbmNsdWRlcyA8PCBlbmRsOworCisgIHJldHVybiBpbmNsdWRlcy5zdHIoKTsKK30KKworLyoqCisgKiBGaW5pc2ggdXAgZ2VuZXJhdGlvbi4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQorICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCisgIGZfaGVhZGVyXyA8PCBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIG9iamVjdGl2ZS1jCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGVkZWYtPmdldF90eXBlKCk7CisgICAgaWYgKG1hcC0+Z2V0X2tleV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIkBjbGFzcyAiIDw8IHR5cGVfbmFtZShtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKG1hcC0+Z2V0X3ZhbF90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIkBjbGFzcyAiIDw8IHR5cGVfbmFtZShtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX3NldCgpKSB7CisgICAgdF9zZXQgKnNldCA9ICh0X3NldCAqKXR0eXBlZGVmLT5nZXRfdHlwZSgpOworICAgIGlmIChzZXQtPmdldF9lbGVtX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzICIgPDwgdHlwZV9uYW1lKHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZWRlZi0+Z2V0X3R5cGUoKTsKKyAgICBpZiAobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJAY2xhc3MgIiA8PCB0eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XworICAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XworICAgICAgICAgICAgICA8PCAiTXV0YWJsZSIgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBPYmplY3RpdmUtQywgdGhpcyBpcworICogZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgaW5zdGVhZCB1c2luZworICogTlNfRU5VTSBrZXl3b3JkIGluIE9iamVjdGl2ZS1DLiAgRm9yIG5hbWVzcGFjZSBwdXJwb3NlcywgdGhlIG5hbWUgb2YKKyAqIHRoZSBlbnVtIGlzIHByZWZpeGVkIHRvIGVhY2ggZWxlbWVudCBpbiBrZWVwaW5nIHdpdGggQ29jb2EgJiBTd2lmdAorICogc3RhbmRhcmRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiBOU19FTlVNKFNJbnQzMiwgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX2hlYWRlcl8gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25zdF9pbnRlcmZhY2U7CisKKyAgY29uc3RfaW50ZXJmYWNlIDw8ICJGT1VOREFUSU9OX0VYUE9SVCBOU1N0cmluZyAqIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yRG9tYWluOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworCisgIGJvb2wgbmVlZHNfY2xhc3MgPSBmYWxzZTsKKworICAvLyBQdWJsaWMgY29uc3RhbnRzIGZvciBiYXNlIHR5cGVzICYgc3RyaW5ncworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgaWYgKCF0eXBlLT5pc19jb250YWluZXIoKSAmJiAhdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGNvbnN0X2ludGVyZmFjZSA8PCAiRk9VTkRBVElPTl9FWFBPUlQgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbmVlZHNfY2xhc3MgPSB0cnVlOworICAgIH0KKyAgfQorCisKKyAgc3RyaW5nIGNvbnN0YW50c19jbGFzc19uYW1lID0gY29jb2FfcHJlZml4XyArIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgKyAiQ29uc3RhbnRzIjsKKworICBpZiAobmVlZHNfY2xhc3MpIHsKKworICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsOworCisgICAgY29uc3RfaW50ZXJmYWNlIDw8ICJAaW50ZXJmYWNlICIgPDwgY29uc3RhbnRzX2NsYXNzX25hbWUgPDwgIiA6IE5TT2JqZWN0ICI7CisgICAgc2NvcGVfdXAoY29uc3RfaW50ZXJmYWNlKTsKKyAgICBzY29wZV9kb3duKGNvbnN0X2ludGVyZmFjZSk7CisKKyAgICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50IGRlZmluZWQuCisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBjb25zdF9pbnRlcmZhY2UgPDwgZW5kbCA8PCAiKyAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsIDw8ICJAZW5kIjsKKyAgfQorCisgIC8vIHRoaXMgZ2V0cyBzcGl0IGludG8gdGhlIGhlYWRlciBmaWxlIGluIDo6Y2xvc2VfZ2VuZXJhdG9yCisgIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfID0gY29uc3RfaW50ZXJmYWNlLnN0cigpOworCisgIGZfaW1wbF8gPDwgIk5TU3RyaW5nICoiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3JEb21haW4gPSAiCisgICAgICAgICAgPDwgIkBcIiIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvckRvbWFpblwiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHZhcmlhYmxlcyBpbiB0aGUgLm0gaG9sZCBhbGwgc2ltcGxlIGNvbnN0YW50IHZhbHVlcworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBmX2ltcGxfIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XyA8PCBuYW1lOworICAgIHRfdHlwZSogdHR5cGUgPSB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgaWYgKCF0dHlwZS0+aXNfY29udGFpbmVyKCkgJiYgIXR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9pbXBsXyA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZl9pbXBsXywgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9pbXBsXyA8PCBlbmRsOworCisgIGlmIChuZWVkc19jbGFzcykgeworCisgICAgZl9pbXBsXyA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29uc3RhbnRzX2NsYXNzX25hbWUgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaW5pdGlhbGl6ZSBjb21wbGV4IGNvbnN0YW50cyB3aGVuIHRoZSBjbGFzcyBpcyBsb2FkZWQKKyAgICBmX2ltcGxfIDw8ICIrICh2b2lkKSBpbml0aWFsaXplICI7CisgICAgc2NvcGVfdXAoZl9pbXBsXyk7CisKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgdF90eXBlKiB0dHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgZl9pbXBsXyA8PCBlbmRsOworICAgICAgICBwcmludF9jb25zdF92YWx1ZShmX2ltcGxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2NvYV9wcmVmaXhfICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihmX2ltcGxfKTsKKworICAgIC8vIGdldHRlciBtZXRob2QgZm9yIGVhY2ggY29uc3RhbnQKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBmX2ltcGxfIDw8IGVuZGwgPDwgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiICI7CisgICAgICAgIHNjb3BlX3VwKGZfaW1wbF8pOworICAgICAgICBpbmRlbnQoZl9pbXBsXykgPDwgInJldHVybiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihmX2ltcGxfKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX2ltcGxfIDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKKyAqIHdpdGggcHJvdGVjdGVkIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgZ2V0dGVycyBhbmQgc2V0dGVycy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIE5TRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGEgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJlbnVtIHsiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICAiID0gLSIgPDwgZXJyb3JfY29uc3RhbnRfKysgPDwgZW5kbAorICAgICAgICA8PCAifTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICJOU0Vycm9yICI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJOU09iamVjdCAiOworICB9CisgIG91dCA8PCAiPFRCYXNlLCBOU0NvZGluZywgTlNDb3B5aW5nPiAiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gcHJvcGVydGllcworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eSgqbV9pdGVyKSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHlfaXNzZXQoKm1faXRlcikgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5X3Vuc2V0KCptX2l0ZXIpIDw8IGVuZGw7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBpbml0aWFsaXplciBmb3IgYWxsIGZpZWxkcworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3V0LCB0c3RydWN0KTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc2lnbmF0dXJlIGZvciBpbml0aWFsaXplciBvZiBzdHJ1Y3Qgd2l0aCBhIHBhcmFtZXRlciBmb3IKKyAqIGVhY2ggZmllbGQuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBpbmRlbnQob3V0KSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBpbml0V2l0aCI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICBpZiAobV9pdGVyID09IG1lbWJlcnMuYmVnaW4oKSkgeworICAgICAgb3V0IDw8IGNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICI6ICgiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICsrbV9pdGVyOworICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgeworICAgICAgb3V0IDw8ICIgIjsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaW5pdFdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIGluZGVudChvdXQpIDw8ICItIChpbnN0YW5jZXR5cGUpIGluaXRXaXRoQ29kZXI6IChOU0NvZGVyICopIGRlY29kZXIiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgorICAgIGluZGVudChvdXQpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRXaXRoQ29kZXI6IGRlY29kZXJdOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYpICI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFtkZWNvZGVyIGNvbnRhaW5zVmFsdWVGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0pIgorICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlT2JqZWN0Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVCb29sRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQzMkZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50NjRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZURvdWJsZUZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBkZWNvZGUgdGhyaWZ0IHR5cGU6ICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0ID0gWUVTOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGVuY29kZVdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBlbmNvZGVXaXRoQ29kZXI6IChOU0NvZGVyICopIGVuY29kZXIiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGVuY29kZVdpdGhDb2RlcjogZW5jb2Rlcl07IiA8PCBlbmRsOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlT2JqZWN0OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVCb29sOiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQzMjogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50NjQ6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZURvdWJsZTogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBlbmNvZGUgdGhyaWZ0IHR5cGU6ICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgY29weSBtZXRob2QgZm9yIHRoaXMgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGluc3RhbmNldHlwZSkgY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgdmFsID0gWyIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZXJyb3JXaXRoRG9tYWluOiBzZWxmLmRvbWFpbiBjb2RlOiBzZWxmLmNvZGUgdXNlckluZm86IHNlbGYudXNlckluZm9dOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgdmFsID0gWyIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YWwuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IFtzZWxmLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgY29weV07IjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YWwuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB2YWw7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGhhc2ggbWV0aG9kIGZvciB0aGlzIHN0cnVjdAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiLSAoTlNVSW50ZWdlcikgaGFzaCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJOU1VJbnRlZ2VyIGhhc2ggPSAxNzsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICJJc1NldCA/IDI2NTQ0MzU3NjEgOiAwOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2ggPSAoaGFzaCAqIDMxKSBeIFtfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBoYXNoXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaCA9IChoYXNoICogMzEpIF4gW0AoXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIGhhc2hdOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBoYXNoOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaXNFcXVhbCBtZXRob2QgZm9yIHRoaXMgc3RydWN0CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgaW5kZW50KG91dCkgPDwgIi0gKEJPT0wpIGlzRXF1YWw6IChpZCkgYW5PYmplY3QiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIChzZWxmID09IGFuT2JqZWN0KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbc3VwZXIgaXNFcXVhbDphbk9iamVjdF0pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVthbk9iamVjdCBpc0tpbmRPZkNsYXNzOlsiIDw8IGNsYXNzX25hbWUgPDwgIiBjbGFzc11dKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgY2xhc3NfbmFtZSA8PCAiICpvdGhlciA9ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqKWFuT2JqZWN0OyIgPDwgZW5kbDsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKF8iIDw8IG5hbWUgPDwgIklzU2V0ICE9IG90aGVyLT5fIiA8PCBuYW1lIDw8ICJJc1NldCkgfHwiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgIgorICAgICAgICAgICAgPDwgIihfIiA8PCBuYW1lIDw8ICJJc1NldCAmJiAiCisgICAgICAgICAgICA8PCAiKChfIiA8PCBuYW1lIDw8ICIgfHwgb3RoZXItPl8iIDw8IG5hbWUgPDwgIikgJiYgIgorICAgICAgICAgICAgPDwgIiFbXyIgPDwgbmFtZSA8PCAiIGlzRXF1YWw6b3RoZXItPl8iIDw8IG5hbWUgPDwgIl0pKSkgeyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChfIiA8PCBuYW1lIDw8ICJJc1NldCAhPSBvdGhlci0+XyIgPDwgbmFtZSA8PCAiSXNTZXQpIHx8IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICIKKyAgICAgICAgICAgIDw8ICIoXyIgPDwgbmFtZSA8PCAiSXNTZXQgJiYgIgorICAgICAgICAgICAgPDwgIihfIiA8PCBuYW1lIDw8ICIgIT0gb3RoZXItPl8iIDw8IG5hbWUgPDwgIikpKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBpbmRlbnQob3V0KSA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIGV4Y2VwdGlvbnMgbmVlZCB0byBjYWxsIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uIE5TRXhjZXB0aW9uCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGluc3RhbmNldHlwZSkgaW5pdCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzdXBlciBpbml0V2l0aERvbWFpbjogIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yRG9tYWluIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3IiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogbmlsXTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIHN0cnVjdAorCisgICAgLy8gZGVmYXVsdCBpbml0aWFsaXplcgorICAgIC8vIHNldHVwIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIGRlZmF1bHQgdmFsdWVzCisgICAgaW5kZW50KG91dCkgPDwgIi0gKGluc3RhbmNldHlwZSkgaW5pdCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICAvLyBpbml0aWFsaXplciB3aXRoIGFsbCBmaWVsZHMgYXMgcGFyYW1zCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOworICAgIG91dCA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3NlbGYgaW5pdF07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoc2VsZikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7CisgICAgICBpZiAoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBvdXQgPDwgIlsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIG11dGFibGVDb3B5XTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0ID0gWUVTOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgLy8gaW5pdFdpdGhDb2RlciBmb3IgTlNDb2RpbmcKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAvLyBlbmNvZGVXaXRoQ29kZXIgZm9yIE5TQ29kaW5nCisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAvLyBoYXNoIGFuZCBpc0VxdWFsIGZvciBOU09iamVjdAorICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIC8vIGNvcHkgZm9yIE5TT2JqZWN0CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgLy8gdGhlIHJlc3Qgb2YgdGhlIG1ldGhvZHMKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8ICItIChCT09MKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgZXJyb3I6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKKyAgaW5kZW50KG91dCkgPDwgIk5TU3RyaW5nICogZmllbGROYW1lOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIlNJbnQzMiBmaWVsZFR5cGU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiU0ludDMyIGZpZWxkSUQ7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogJmZpZWxkTmFtZSB0eXBlOiAmZmllbGRUeXBlIGZpZWxkSUQ6ICZmaWVsZElEIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGRUeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgImZpZWxkVmFsdWUiKTsKKyAgICBpbmRlbnQob3V0KSA8PCBjYWxsX2ZpZWxkX3NldHRlcigqZl9pdGVyLCAiZmllbGRWYWx1ZSIpIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsOworICAgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogZmllbGQgSUQgJWkgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlaS4gIFNraXBwaW5nLlwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9fUFJFVFRZX0ZVTkNUSU9OX18sIChpbnQpZmllbGRJRCwgKGludClmaWVsZFR5cGUpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNMb2coQFwiJXM6IHVuZXhwZWN0ZWQgZmllbGQgSUQgJWkgd2l0aCB0eXBlICVpLiAgU2tpcHBpbmcuXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIl9fUFJFVFRZX0ZVTkNUSU9OX18sIChpbnQpZmllbGRJRCwgKGludClmaWVsZFR5cGUpOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaWYgKHZhbGlkYXRlX3JlcXVpcmVkXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiB2YWxpZGF0ZTogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCBlcnJvcjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgbmFtZSA8PCAiXCIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiIGZpZWxkSUQ6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwgd2hpY2gKKyAqIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZQorICogc2V0LCBhbmQgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIihfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbmlsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisgKiAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgdmFsaWRhdGU6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpICI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChfX3RocmlmdEVycm9yKSAiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKl9fdGhyaWZ0RXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBUUHJvdG9jb2xFcnJvclVua25vd24iIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IEB7VFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBAKFRQcm90b2NvbEV4dGVuZGVkRXJyb3JNaXNzaW5nUmVxdWlyZWRGaWVsZCksIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yRmllbGROYW1lS2V5OiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJ9XTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcyBmb3IgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0LgorICogZ2V0dGVyLCBzZXR0ZXIsIGlzc2V0IGdldHRlci4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZmllbGRfbmFtZTsKKyAgICBjYXBfbmFtZVswXSA9IHRvdXBwZXIoY2FwX25hbWVbMF0pOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBzZXQiIDw8IGNhcF9uYW1lIDw8ICI6ICgiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIklzU2V0ID0gWUVTOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlciAtIGRvIHdlIG5lZWQgdGhpcz8KKyAgICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5pbDsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCBmaWVsZF9uYW1lIDw8ICJJc1NldCA9IE5POyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBkZXNjcmlwdGlvbiBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICAvLyBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbgorICBpZiAoZGVidWdfZGVzY3JpcHRpb25zXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoTlNTdHJpbmcgKikgZGVidWdEZXNjcmlwdGlvbiB7IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24geyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TTXV0YWJsZVN0cmluZyAqIG1zID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBAXCIiCisgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIl07IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIiwiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7CisgICAgfQorICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaW5kZW50KG91dCkgPDwgIlttcyBhcHBlbmRGb3JtYXQ6IEBcIiIgPDwgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0dHlwZSkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgZm9ybWF0X2Nhc3RfZm9yX3R5cGUodHR5cGUpIDw8ICJfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiW21zIGFwcGVuZFN0cmluZzogQFwiKVwiXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IG1zXTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIE9iamVjdGl2ZS1DIHRoaXMgY29uc2lzdHMgb2YgYQorICogcHJvdG9jb2wgZGVmaW5pdGlvbiwgYSBjbGllbnQgaW50ZXJmYWNlIGFuZCBhIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICBpZiAoYXN5bmNfY2xpZW50c18pIHsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBxbmFtZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICAgIHRfc3RydWN0IHFuYW1lX3RzID0gdF9zdHJ1Y3QodHMtPmdldF9wcm9ncmFtKCksIHFuYW1lKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgcW5hbWVfdHMuYXBwZW5kKCptX2l0ZXIpOworICAgIH0KKworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgJnFuYW1lX3RzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sICZxbmFtZV90cywgZmFsc2UsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgfQorfQorCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAorICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHRoZSByZXN1bHQgc3RydWN0CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCAiOyIKKyAgICAgICAgPDwgIiAgLy8gdGhyb3dzICI7CisgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7CisgICAgfQorICAgIG91dCA8PCAiVEV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gYXN5bmNocm9ub3VzIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jIgorICAgICAgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCAiLSAiIDw8IGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaWYgKHByb21pc2Vfa2l0XykgeworICAgICAgb3V0IDw8ICItICIgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCA6IFRCYXNlQ2xpZW50IDwiCisgICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+ICIgPDwgZW5kbDsKKworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgb3V0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgIgorICAgICAgICAgIm91dFByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50QXN5bmMgOiBUQmFzZUNsaWVudCA8IgorICAgICAgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmM+ICIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgIDw8ICJ0cmFuc3BvcnRGYWN0b3J5OiAoaWQgPFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+KSB0cmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgVFByb2Nlc3MgaW1wbGVtZW50YXRpb24gZm9yCisgKnRoZQorICogc2VydmljZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkKKyAgICAgIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCA8VFByb2Nlc3Nvcj4gIiA8PCBlbmRsOworCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOiAoaWQgPCIgPDwgY29jb2FfcHJlZml4XworICAgICAgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgIi0gKGlkPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZTsiIDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24oCisgICAgb3N0cmVhbSYgb3V0LAorICAgIHRfc2VydmljZSAqdHNlcnZpY2UsCisgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKKyAgc3RyaW5nIGZ1bm5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisKKyAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV9ib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8ICItIChCT09MKSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBuZWVkc19wcm90b2NvbCA/ICJvdXRQcm90b2NvbCIgOiAiIiwgdHJ1ZSkgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIgorICAgICAgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiIHR5cGU6IFRNZXNzYWdlVHlwZU9ORVdBWSIgOiAiIHR5cGU6IFRNZXNzYWdlVHlwZUNBTEwiKQorICAgICAgPDwgIiBzZXF1ZW5jZUlEOiAwIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgICAgPDwgIlwiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyB3cml0ZSBvdXQgZnVuY3Rpb24gcGFyYW1ldGVycworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBmaWVsZE5hbWUgPDwgIiAhPSBuaWwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZmllbGROYW1lCisgICAgICAgIDw8ICJcIiIKKyAgICAgICAgICAgIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZmxkX2l0ZXIsIGZpZWxkTmFtZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3A6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKAorICAgIG9zdHJlYW0mIG91dCwKKyAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8ICItIChCT09MKSByZWN2XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgb3V0IDw8ICI6ICgiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiICopIHJlc3VsdCAiOworICAgIGlmIChuZWVkc19wcm90b2NvbCkgeworICAgICAgb3V0IDw8ICJwcm90b2NvbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiZXJyb3IiOworICAgIH0KKyAgfQorICBpZiAobmVlZHNfcHJvdG9jb2wpIHsKKyAgICBvdXQgPDwgIjogKGlkPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgZXJyb3IiOworICB9CisgIG91dCA8PCAiOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBUT0RPKG1jc2xlZSk6IE1lc3NhZ2UgdmFsaWRhdGlvbiBoZXJlLCB3YXMgdGhlIHNlcWlkIGV0YyBvaz8KKworICAvLyBjaGVjayBmb3IgYW4gZXhjZXB0aW9uCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqaW5jb21pbmdFeGNlcHRpb24gPSBbc2VsZiBjaGVja0luY29taW5nTWVzc2FnZUV4Y2VwdGlvbjogaW5Qcm90b2NvbF07IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGluY29taW5nRXhjZXB0aW9uKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fdGhyaWZ0RXJyb3IpIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIqX190aHJpZnRFcnJvciA9IGluY29taW5nRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBGSVhNRSAtIGNvdWxkIG9wdGltaXplIGhlcmUgdG8gcmVkdWNlIGNyZWF0aW9uIG9mIHRlbXBvcmFyeSBvYmplY3RzLgorICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBjb2NvYV9wcmVmaXhfIDw8IHJlc3VsdG5hbWUgPDwgIiAqIHJlc3VsdGVyID0gWyIgPDwgY29jb2FfcHJlZml4XyA8PCByZXN1bHRuYW1lIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoIVtyZXN1bHRlciByZWFkOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0ZXIuc3VjY2Vzc0lzU2V0KSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIipyZXN1bHQgPSByZXN1bHRlci5zdWNjZXNzOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0ZXIuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX3RocmlmdEVycm9yKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIipfX3RocmlmdEVycm9yID0gW3Jlc3VsdGVyICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICBpZiAodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX190aHJpZnRFcnJvcikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIqX190aHJpZnRFcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjogVEFwcGxpY2F0aW9uRXJyb3JEb21haW4iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBUQXBwbGljYXRpb25FcnJvck1pc3NpbmdSZXN1bHQiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBAe1RBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OiBAXCIiCisgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJ9XTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiAnc2VuZF8nIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIG91dCA8PCAiICI7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICIgPDwgZmllbGROYW1lOworICAgIH0KKyAgfQorICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICIgZXJyb3IiOworICB9CisgIG91dCA8PCAiOiBfX3RocmlmdEVycm9yXSkgIiA8PCBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQodGZ1bmN0aW9uKSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2l2ZW4gJ3NlbmRfJyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmFpbHVyZUJsb2NrTmFtZSkgeworCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBvdXQgPDwgIiAiOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGZpZWxkTmFtZSA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKKyAgICB9CisgIH0KKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIG91dCA8PCAiIHByb3RvY29sIjsKKyAgfQorICBvdXQgPDwgIjogcHJvdG9jb2wgZXJyb3I6ICZ0aHJpZnRFcnJvcl0pICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBmYWlsdXJlQmxvY2tOYW1lIDw8ICIodGhyaWZ0RXJyb3IpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICJDbGllbnQiOworCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IG5hbWUgPDwgIiAoKSAiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2w+IGluUHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlkPFRQcm90b2NvbD4gb3V0UHJvdG9jb2w7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBuYW1lIDw8IGVuZGw7CisKKyAgLy8gaW5pdGlhbGl6ZXJzCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzZWxmIGluaXRXaXRoSW5Qcm90b2NvbDogcHJvdG9jb2wgb3V0UHJvdG9jb2w6IHByb3RvY29sXTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGFuSW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSAiCisgICAgICAgICAiYW5PdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZikgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpblByb3RvY29sID0gYW5JblByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXRQcm90b2NvbCA9IGFuT3V0UHJvdG9jb2w7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgZmFsc2UpOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQob3V0KSA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlcik7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoOiBfX3RocmlmdEVycm9yXSkgIiA8PCBpbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSwgdHJ1ZSkgPDwgIiBfX3Jlc3VsdDsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogJl9fcmVzdWx0IGVycm9yOiBfX3RocmlmdEVycm9yXSkgIgorICAgICAgICAgICAgPDwgaW52YWxpZF9yZXR1cm5fc3RhdGVtZW50KCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBfX3Jlc3VsdDsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gQChfX3Jlc3VsdCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24gZm9yIGl0cyBhc3luY2hyb25vdXMgaW50ZXJmYWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gY29jb2FfcHJlZml4XyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudEFzeW5jIjsKKworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBuYW1lIDw8ICIgKCkgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZDxUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworCisKKyAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBuYW1lIDw8IGVuZGwKKyAgICAgIDw8IGVuZGwgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgYVByb3RvY29sRmFjdG9yeSAiCisgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnRGYWN0b3J5OiAoaWQgPFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+KSBhVHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZikgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IGFQcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgdHJhbnNwb3J0RmFjdG9yeSA9IGFUcmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRXJyb3IgKnRocmlmdEVycm9yOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VEFzeW5jVHJhbnNwb3J0PiB0cmFuc3BvcnQgPSBbdHJhbnNwb3J0RmFjdG9yeSBuZXdUcmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sPiBwcm90b2NvbCA9IFtwcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDp0cmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlciwgImZhaWx1cmVCbG9jayIpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbdHJhbnNwb3J0IGZsdXNoV2l0aENvbXBsZXRpb246XnsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqdGhyaWZ0RXJyb3I7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICI6ICZyZXN1bHQgcHJvdG9jb2wiOworICAgICAgfQorICAgICAgb3V0IDw8ICI6IHByb3RvY29sIGVycm9yOiAmdGhyaWZ0RXJyb3JdKSAiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmFpbHVyZUJsb2NrKHRocmlmdEVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3BvbnNlQmxvY2soIjsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkgJiYgISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGZhaWx1cmU6ZmFpbHVyZUJsb2NrXTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFByb21pc2UgZnVuY3Rpb24KKyAgICBpZiAocHJvbWlzZV9raXRfKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICItICIgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtBbnlQcm9taXNlIHByb21pc2VXaXRoUmVzb2x2ZXJCbG9jazpeKFBNS1Jlc29sdmVyIHJlc29sdmVyKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqdGhyaWZ0RXJyb3I7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlkPFRBc3luY1RyYW5zcG9ydD4gdHJhbnNwb3J0ID0gW3RyYW5zcG9ydEZhY3RvcnkgbmV3VHJhbnNwb3J0XTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sPiBwcm90b2NvbCA9IFtwcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDp0cmFuc3BvcnRdOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIsICJyZXNvbHZlciIpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlt0cmFuc3BvcnQgZmx1c2hXaXRoQ29tcGxldGlvbjpeeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICp0aHJpZnRFcnJvcjsiIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgIjogJnJlc3VsdCBwcm90b2NvbCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICI6IHByb3RvY29sIGVycm9yOiAmdGhyaWZ0RXJyb3JdKSAiOworICAgICAgICBzY29wZV91cChvdXQpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc29sdmVyKHRocmlmdEVycm9yKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzb2x2ZXIoIjsKKyAgICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpIHx8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAiQFlFUyI7CisgICAgICB9IGVsc2UgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIkAocmVzdWx0KSI7CisgICAgICB9CisgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZmFpbHVyZTpeKE5TRXJyb3IgKmVycm9yKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc29sdmVyKGVycm9yKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9XTsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn1dOyIgPDwgZW5kbDsKKworICAgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgICBvdXQgPDwgZW5kbDsKKworICAgIH0KKworICB9CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uICBJbiBvdGhlciB3b3JkcyB0aGUgYWN0dWFsIFRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24KKyAqIGZvciB0aGUgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworCisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IG5hbWUgPDwgIiAoKSAiOworCisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPiBzZXJ2aWNlOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0RpY3Rpb25hcnkgKiBtZXRob2RNYXA7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBuYW1lIDw8IGVuZGw7CisKKyAgLy8gaW5pdGlhbGl6ZXIKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOiAoaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgYVNlcnZpY2UiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYpICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VydmljZSA9IGFTZXJ2aWNlOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJtZXRob2RNYXAgPSBbTlNNdXRhYmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsiIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgbWV0aG9kIG1hcCBmb3Igcm91dGluZyBpbmNvbWluZyBjYWxscworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiU0VMIHMgPSBAc2VsZWN0b3IocHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIl93aXRoU2VxdWVuY2VJRDppblByb3RvY29sOm91dFByb3RvY29sOmVycm9yOik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNNZXRob2RTaWduYXR1cmUgKiBzaWcgPSBbc2VsZiBtZXRob2RTaWduYXR1cmVGb3JTZWxlY3Rvcjogc107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6IHNpZ107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2ludm9jYXRpb24gc2V0U2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHJldGFpbkFyZ3VtZW50c107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW21ldGhvZE1hcCBzZXRWYWx1ZTogaW52b2NhdGlvbiBmb3JLZXk6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSAnc2VydmljZScgbWV0aG9kIHdoaWNoIHJldHVybnMgdGhlIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgLy8gcHJvY2Vzc29yCisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGlkPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHNlcnZpY2U7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRQcm9jZXNzIG1ldGhvZCwgd2hpY2ggZGlzcGF0Y2hlcyB0aGUgaW5jb21pbmcgY2FsbCB1c2luZyB0aGUgbWV0aG9kIG1hcAorICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNTdHJpbmcgKiBtZXNzYWdlTmFtZTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBTSW50MzIgbWVzc2FnZVR5cGU7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgU0ludDMyIHNlcUlEOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6ICZtZXNzYWdlTmFtZSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAmbWVzc2FnZVR5cGUiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogJnNlcUlEIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFttZXRob2RNYXAgdmFsdWVGb3JLZXk6IG1lc3NhZ2VOYW1lXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoaW52b2NhdGlvbiA9PSBuaWwpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IFRUeXBlU1RSVUNUIG9uUHJvdG9jb2w6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgTlNFcnJvciAqIHggPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46IFRBcHBsaWNhdGlvbkVycm9yRG9tYWluIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duTWV0aG9kIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogQHtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogbWVzc2FnZU5hbWV9XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IG1lc3NhZ2VOYW1lIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBUTWVzc2FnZVR5cGVFWENFUFRJT04iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbeCB3cml0ZTogb3V0UHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBZRVM7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIC8vIE5TSW52b2NhdGlvbiBkb2VzIG5vdCBjb25mb3JtIHRvIE5TQ29weWluZyBwcm90b2NvbCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TSW52b2NhdGlvbiAqIGkgPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiAiCisgICAgICAgICAgICAgICAgICAgICAiW2ludm9jYXRpb24gbWV0aG9kU2lnbmF0dXJlXV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0U2VsZWN0b3I6IFtpbnZvY2F0aW9uIHNlbGVjdG9yXV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZzZXFJRCBhdEluZGV4OiAyXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJmluUHJvdG9jb2wgYXRJbmRleDogM107IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZvdXRQcm90b2NvbCBhdEluZGV4OiA0XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJl9fdGhyaWZ0RXJyb3IgYXRJbmRleDogNV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0VGFyZ2V0OiBzZWxmXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBpbnZva2VdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBZRVM7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgYSBwcm9jZXNzX1hYWFggbWV0aG9kIGZvciBlYWNoIHNlcnZpY2UgZnVuY3Rpb24sIHdoaWNoIHJlYWRzIGFyZ3MsIGNhbGxzIHRoZSBzZXJ2aWNlLAorICAvLyBhbmQgd3JpdGVzIHJlc3VsdHMKKyAgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHByb2Nlc3NfIiA8PCBmdW5uYW1lCisgICAgICAgIDw8ICJfd2l0aFNlcXVlbmNlSUQ6IChTSW50MzIpIHNlcUlEIGluUHJvdG9jb2w6IChpZDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAiCisgICAgICAgICAgICIoaWQ8VFByb3RvY29sPikgb3V0UHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBzdHJpbmcgYXJnc3R5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhcmdzdHlwZSA8PCAiICogYXJncyA9IFsiIDw8IGFyZ3N0eXBlIDw8ICIgbmV3XTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVthcmdzIHJlYWQ6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgICAvLyBwcmVwYXJlIHRoZSByZXN1bHQgaWYgbm90IG9uZXdheQorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdHR5cGUgPSBjb2NvYV9wcmVmaXhfICsgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgKmZfaXRlcik7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0dHlwZSA8PCAiICogcmVzdWx0ID0gWyIgPDwgcmVzdWx0dHlwZSA8PCAiIG5ld107IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIG1ha2UgdGhlIGNhbGwgdG8gdGhlIGFjdHVhbCBzZXJ2aWNlIG9iamVjdAorICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiQk9PTCI7CisgICAgfSBlbHNlIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiTlNOdW1iZXIgKiI7CisgICAgfQorICAgIG91dCA8PCAiIHNlcnZpY2VSZXN1bHQgPSAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8ICJbc2VydmljZSAiIDw8IGZ1bm5hbWU7CisgICAgLy8gc3VwcGx5aW5nIGFyZ3VtZW50cworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgIjogW2FyZ3MgIiA8PCBmaWVsZE5hbWUgPDwgIl0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgIiA8PCBmaWVsZE5hbWUgPDwgIjogW2FyZ3MgIiA8PCBmaWVsZE5hbWUgPDwgIl0iOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgIiBlcnJvciI7CisgICAgfQorICAgIG91dCA8PCAiOiBfX3RocmlmdEVycm9yXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIXNlcnZpY2VSZXN1bHQpIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbcmVzdWx0IHNldFN1Y2Nlc3M6ICIgPDwgdW5ib3goKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAic2VydmljZVJlc3VsdCIpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBvdXQgdGhlIHJlc3VsdCBpZiBub3Qgb25ld2F5CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZVJFUExZIiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRCIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3Jlc3VsdCB3cml0ZTogb3V0UHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgdmFyaWFibGUgbmFtZSBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZE5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5OiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2w6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlOihVSW50OCAqKSYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNjomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzI6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0OiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZTomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgfQorICAgIG91dCA8PCAiKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGFsbG9jYXRlcyB0aGUgc3RydWN0IGFuZCBpbnZva2VzIHJlYWQ6CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZmllbGROYW1lIDw8ICIgPSBbWyIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUpCisgICAgICAgICAgICAgIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmICghWyIgPDwgZmllbGROYW1lIDw8ICIgcmVhZDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBpbmRlbnQob3V0KSA8PCAiU0ludDMyICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IE5VTEwgdmFsdWVUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZURpY3Rpb25hcnkgKiAiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IE5VTEwgc2l6ZTogJiIgPDwgc2l6ZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVTZXQgKiAiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZVNldCBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlQXJyYXkgKiAiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOworICB9CisgIC8vIEZJWE1FIC0gdGhlIGNvZGUgYWJvdmUgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIGVsZW1lbnQgdHlwZXMgb2YKKyAgLy8gdGhlIGNvbnRhaW5lcnMgYmVpbmcgcmVhZCBtYXRjaCB0aGUgZWxlbWVudCB0eXBlcyBvZiB0aGUKKyAgLy8gY29udGFpbmVycyB3ZSBhcmUgcmVhZGluZyBpbnRvLiAgRG9lcyB0aGF0IG1hdHRlcj8KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIgorICAgICAgICAgICAgICA8PCBzaXplIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBmaWVsZE5hbWUpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZE1hcEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZFNldEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRMaXN0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFRha2UgYSB2YXJpYWJsZSBvZiBhIGdpdmVuIHR5cGUgYW5kIHdyYXAgaXQgaW4gY29kZSB0byBtYWtlIGl0CisgKiBzdWl0YWJsZSBmb3IgcHV0dGluZyBpbnRvIGEgY29udGFpbmVyLCBpZiBuZWNlc3NhcnkuICBCYXNpY2FsbHksCisgKiB3cmFwIHNjYWxlciBwcmltaXRpdmVzIGluIE5TTnVtYmVyIG9iamVjdHMuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Ym94KHRfdHlwZSogdHR5cGUsIHN0cmluZyBmaWVsZF9uYW1lKSB7CisKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIkAoIiArIGZpZWxkX25hbWUgKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjYW4ndCBib3ggdm9pZCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiQCgiICsgZmllbGRfbmFtZSArICIpIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIGRvIG5vdGhpbmcKKyAgcmV0dXJuIGZpZWxkX25hbWU7Cit9CisKKy8qKgorICogRXh0cmFjdHMgdGhlIGFjdHVhbCB2YWx1ZSBmcm9tIGEgYm94ZWQgdmFsdWUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp1bmJveCh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiWyIgKyBmaWVsZF9uYW1lICsgIiBpbnRWYWx1ZV0iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY2FuJ3QgdW5ib3ggdm9pZCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiAiWyIgKyBmaWVsZF9uYW1lICsgIiBib29sVmFsdWVdIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIHJldHVybiAiKChTSW50OClbIiArIGZpZWxkX25hbWUgKyAiIGNoYXJWYWx1ZV0pIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICByZXR1cm4gIigoU0ludDE2KVsiICsgZmllbGRfbmFtZSArICIgc2hvcnRWYWx1ZV0pIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gIigoU0ludDMyKVsiICsgZmllbGRfbmFtZSArICIgbG9uZ1ZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAiKChTSW50NjQpWyIgKyBmaWVsZF9uYW1lICsgIiBsb25nTG9uZ1ZhbHVlXSkiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiWyIgKyBmaWVsZF9uYW1lICsgIiBkb3VibGVWYWx1ZV0iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gZG8gbm90aGluZworICByZXR1cm4gZmllbGRfbmFtZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcCBlbGVtZW50CisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF90eXBlKiBrZXlUeXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdmFsVHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworICB0X2ZpZWxkIGZrZXkoa2V5VHlwZSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHZhbFR5cGUsIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwga2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgc2V0T2JqZWN0OiAiIDw8IGJveCh2YWxUeXBlLCB2YWwpCisgICAgICAgICAgICAgIDw8ICIgZm9yS2V5OiAiIDw8IGJveChrZXlUeXBlLCBrZXkpIDw8ICJdOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfdHlwZSogdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBib3godHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF90eXBlKiB0eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKyAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBib3godHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSB0byBvZiB0aGUgdmFyaWFibGUgaG9sZGluZyB0aGUgZmllbGQKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgZmllbGROYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIGZpZWxkTmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeTogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmc6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2w6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZTogKFVJbnQ4KSIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNjogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQ6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZTogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgIH0KKyAgICBvdXQgPDwgIikgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIHN0cnVjdAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVsiIDw8IGZpZWxkTmFtZSA8PCAiIHdyaXRlOiBvdXRQcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBjb250YWluZXIKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIgdmFsdWVUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiIHNpemU6IChTSW50MzIpWyIKKyAgICAgICAgICAgICAgICA8PCBmaWVsZE5hbWUgPDwgIiBjb3VudF0gZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IChTSW50MzIpWyIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiBjb3VudF0gZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IChTSW50MzIpWyIgPDwgZmllbGROYW1lCisgICAgICAgICAgICAgICAgPDwgIiBjb3VudF0gZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIHN0cmluZyBrZXk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBrZXkgPSB0bXAoImtleSIpOworICAgIGluZGVudChvdXQpIDw8ICJOU0VudW1lcmF0b3IgKiAiIDw8IGl0ZXIgPDwgIiA9IFsiIDw8IGZpZWxkTmFtZSA8PCAiIGtleUVudW1lcmF0b3JdOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGtleSA9IHRtcCgib2JqIik7CisgICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIgb2JqZWN0RW51bWVyYXRvcl07IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAga2V5ID0gdG1wKCJpZHgiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwga2V5IDw8ICIgPSAwOyAiIDw8IGtleSA8PCAiIDwgWyIgPDwgZmllbGROYW1lIDw8ICIgY291bnRdOyAiIDw8IGtleQorICAgICAgICAgICAgICAgIDw8ICIrKykiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwga2V5KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1hcEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlU2V0RW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTGlzdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXBOYW1lKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCB1bmJveChrZmllbGQuZ2V0X3R5cGUoKSwga2V5KSk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiWyIgKyBtYXBOYW1lICsgIiBvYmplY3RGb3JLZXk6ICIgKyBrZXkgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCB1bmJveCh2ZmllbGQuZ2V0X3R5cGUoKSwgdmZpZWxkLmdldF9uYW1lKCkpKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50TmFtZSkgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnROYW1lKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgdW5ib3goZWZpZWxkLmdldF90eXBlKCksIGVsZW1lbnROYW1lKSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0TmFtZSkgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiWyIgKyBsaXN0TmFtZSArICIgb2JqZWN0QXRJbmRleDogIiArIGluZGV4ICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgdW5ib3goZWZpZWxkLmdldF90eXBlKCksIGVmaWVsZC5nZXRfbmFtZSgpKSk7Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBPYmplY3RpdmUtQyBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY2xhc3NfcmVmIERvIHdlIHdhbnQgYSBDbGFzcyByZWZlcmVuY2UgaXN0ZWFkIG9mIGEgdHlwZSByZWZlcmVuY2U/CisgKiBAcmV0dXJuIE9iamVjdGl2ZS1DIHR5cGUgbmFtZSwgaS5lLiBOU0RpY3Rpb25hcnk8S2V5LFZhbHVlPiAqCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgY2xhc3NfcmVmLCBib29sIG5lZWRzX211dGFibGUpIHsKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICBzdHJpbmcgbmFtZSA9IChuZWVkc19tdXRhYmxlICYmIHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCktPmlzX2NvbnRhaW5lcigpKSA/ICJNdXRhYmxlIiArIHR0eXBlLT5nZXRfbmFtZSgpIDogdHR5cGUtPmdldF9uYW1lKCk7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgcmV0dXJuIHByb2dyYW0gPyAocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKSArIG5hbWUpIDogbmFtZTsKKyAgfQorCisgIHN0cmluZyByZXN1bHQ7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBjb2NvYV9wcmVmaXhfICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlOworICAgIHJlc3VsdCA9IG5lZWRzX211dGFibGUgPyAiTlNNdXRhYmxlRGljdGlvbmFyeSIgOiAiTlNEaWN0aW9uYXJ5IjsKKyAgICByZXN1bHQgKz0gIjwiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgZWxlbWVudF90eXBlX25hbWUobWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQgKnNldCA9ICh0X3NldCAqKXR0eXBlOworICAgIHJlc3VsdCA9IG5lZWRzX211dGFibGUgPyAiTlNNdXRhYmxlU2V0IiA6ICJOU1NldCI7CisgICAgcmVzdWx0ICs9ICI8IiArIGVsZW1lbnRfdHlwZV9uYW1lKHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0ICpsaXN0ID0gKHRfbGlzdCAqKXR0eXBlOworICAgIHJlc3VsdCA9IG5lZWRzX211dGFibGUgPyAiTlNNdXRhYmxlQXJyYXkiIDogIk5TQXJyYXkiOworICAgIHJlc3VsdCArPSAiPCIgKyBlbGVtZW50X3R5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgeworICAgIC8vIENoZWNrIGZvciBwcmVmaXgKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMKSB7CisgICAgICByZXN1bHQgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIGlmICghY2xhc3NfcmVmKSB7CisgICAgcmVzdWx0ICs9ICIgKiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIE9iamVjdGl2ZS1DIHR5cGUgbmFtZSBmb3IgY29udGFpbmVyIHR5cGVzCisgKgorICogQHBhcmFtIHR0eXBlIHRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZWxlbWVudF90eXBlX25hbWUodF90eXBlKiBldHlwZSkgeworCisgIHRfdHlwZSogdHR5cGUgPSBldHlwZS0+Z2V0X3RydWVfdHlwZSgpOworCisgIGlmIChldHlwZS0+aXNfdHlwZWRlZigpICYmIHR5cGVfY2FuX2JlX251bGwodHR5cGUpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZShldHlwZSk7CisgIH0KKworICBzdHJpbmcgcmVzdWx0OworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJlc3VsdCA9ICJOU0RhdGEgKiI7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gIk5TU3RyaW5nICoiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlc3VsdCA9ICJOU051bWJlciAqIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgPSAiTlNOdW1iZXIgKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlOworICAgIHJlc3VsdCA9ICJOU0RpY3Rpb25hcnk8IiArIGVsZW1lbnRfdHlwZV9uYW1lKG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIGVsZW1lbnRfdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4gKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQgKnNldCA9ICh0X3NldCAqKXR0eXBlOworICAgIHJlc3VsdCA9ICJOU1NldDwiICsgZWxlbWVudF90eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4gKiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZTsKKyAgICByZXN1bHQgPSAiTlNBcnJheTwiICsgZWxlbWVudF90eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+ICoiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJlc3VsdCA9IGNvY29hX3ByZWZpeF8gKyB0dHlwZS0+Z2V0X25hbWUoKSArICIgKiI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIE9iamVjdGl2ZS1DIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiTlNEYXRhICoiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIk5TU3RyaW5nICoiOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiQk9PTCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJTSW50OCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiU0ludDE2IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJTSW50MzIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gIlNJbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFsiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIG5ld107IgorICAgICAgICA8PCBlbmRsOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBjYXBpdGFsaXplKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgbmFtZSA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIjoiIDw8IHZhbCA8PCAiXTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3N0cmluZ3N0cmVhbSBtYXBvdXQ7CisgICAgaW5kZW50KG1hcG91dCk7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG1hcG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG1hcG91dCA8PCBuYW1lIDw8ICIgPSBAeyI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIG1hcG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBrdHlwZSwgdl9pdGVyLT5maXJzdCwgdHJ1ZSkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7CisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG1hcG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBtYXBvdXQgPDwgIn0iOworICAgIG91dCA8PCBtYXBvdXQuc3RyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3N0cmluZ3N0cmVhbSBsaXN0b3V0OworICAgIGluZGVudChsaXN0b3V0KTsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmIChkZWZ2YWwpCisgICAgICBsaXN0b3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgbGlzdG91dCA8PCBuYW1lIDw8ICIgPSBAWyI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIGxpc3RvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOworICAgICAgaWYgKCsrdl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBsaXN0b3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIGxpc3RvdXQgPDwgIl0iOworICAgIG91dCA8PCBsaXN0b3V0LnN0cigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3N0cmluZ3N0cmVhbSBzZXRvdXQ7CisgICAgaW5kZW50KHNldG91dCk7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmIChkZWZ2YWwpCisgICAgICBzZXRvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBzZXRvdXQgPDwgbmFtZSA8PCAiID0gW05TU2V0IHNldFdpdGhBcnJheTpAWyI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIHNldG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7CisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIHNldG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBzZXRvdXQgPDwgIl1dIjsKKyAgICBvdXQgPDwgc2V0b3V0LnN0cigpOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYm94X2l0KSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAvLyBXZSBtdXN0IGhhbmRsZSBiaW5hcnkgY29uc3RhbnQgYnV0IHRoZSBzeW50YXggb2YgSURMIGRlZmluZXMKKyAgICAgIC8vIG5vdGhpbmcgYWJvdXQgYmluYXJ5IGNvbnN0YW50LgorICAgICAgLy8gICBpZiB0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgIC8vICAgICAgLy8gYmluYXJ5IGNvZGUKKyAgICAgIHJlbmRlciA8PCAiQFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiWUVTIiA6ICJOTyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgaWYgKGJveF9pdCkgeworICAgIHJldHVybiBib3godHlwZSwgcmVuZGVyLnN0cigpKTsKKyAgfQorICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisjaWYgMAorLyoqCitPUklHSU5BTAorICogU3BpdCBvdXQgY29kZSB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IHZhbHVlLgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBib3hfaXQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiQFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiWUVTIiA6ICJOTyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKHZhbC5zaXplKCkgPiAwKQorICAgICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRXaXRoIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIltbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIC8vIEZJWE1FIFRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGluaXRXaXRoWFhYCisgICAgICAvLyAgICAgICBpbml0aWFsaXplciBhbmQgY2F1c2VzIGNvbXBpbGUgZXJyb3IuCisgICAgICAvLyAgICAgICBUcnk6IHRlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IGFuZCB0ZXN0L1NtYWxsVGVzdC50aHJpZnQKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICByZW5kZXIgPDwgY2FwaXRhbGl6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8ICIgIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICByZW5kZXIgPDwgIjogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICByZW5kZXIgPDwgIl0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmVuZGVyIDw8ICJbW05TRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzQW5kS2V5czogIjsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCwgdHJ1ZSk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCAiLCAiOworICAgICAgfQorICAgICAgcmVuZGVyIDw8IHZhbCA8PCAiLCAiIDw8IGtleTsKKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7CisgICAgZWxzZQorICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJlbmRlciA8PCAiW1tOU0FycmF5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7CisgICAgdF90eXBlICogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8ICIsICI7CisgICAgICB9CisgICAgICByZW5kZXIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7CisgICAgZWxzZQorICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmVuZGVyIDw8ICJbW05TU2V0IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7CisgICAgdF90eXBlICogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOworICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgICByZW5kZXIgPDwgIiBuaWxdIjsKKyAgICBlbHNlCisgICAgICByZW5kZXIgPDwgIiwgbmlsXSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImRvbid0IGtub3cgaG93IHRvIHJlbmRlciBjb25zdGFudCBmb3IgdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAoYm94X2l0KSB7CisgICAgcmV0dXJuIGJveCh0eXBlLCByZW5kZXIuc3RyKCkpOworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKyNlbmRpZgorCisvKioKKyAqIERlY2xhcmVzIGFuIE9iamVjdGl2ZS1DIDIuMCBwcm9wZXJ0eS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKyAgcmVuZGVyIDw8ICJAcHJvcGVydHkgKCI7CisKKyAgaWYgKHR5cGVfY2FuX2JlX2NvcHkodGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIHJlbmRlciA8PCAiY29weSwgIjsKKyAgfSBlbHNlIGlmICh0eXBlX2Nhbl9iZV9udWxsKHRmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICByZW5kZXIgPDwgInN0cm9uZywgIjsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXIgPDwgImFzc2lnbiwgIjsKKyAgfQorCisgIHJlbmRlciA8PCAibm9uYXRvbWljKSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiICIKKyAgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IjsKKworICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgbmFtZSBpcyBhbiBPYmplY3RpdmUtQyByZXR1cm4gKzEgY291bnQgc2lnbmFsCisgIGlmICgodGZpZWxkLT5nZXRfbmFtZSgpLmxlbmd0aCgpID49IDMgJiYgdGZpZWxkLT5nZXRfbmFtZSgpLnN1YnN0cigwLDMpID09ICJuZXciKSB8fAorICAgICAgKHRmaWVsZC0+Z2V0X25hbWUoKS5sZW5ndGgoKSA+PSA2ICYmIHRmaWVsZC0+Z2V0X25hbWUoKS5zdWJzdHIoMCw2KSA9PSAiY3JlYXRlIikgfHwKKyAgICAgICh0ZmllbGQtPmdldF9uYW1lKCkubGVuZ3RoKCkgPj0gNSAmJiB0ZmllbGQtPmdldF9uYW1lKCkuc3Vic3RyKDAsNSkgPT0gImFsbG9jIikpIHsKKyAgICAvLyBMZXQgT2JqZWN0aXZlLUMga25vdyBub3QgdG8gcmV0dXJuICsxIGZvciBvYmplY3QgcG9pbnRlcnMKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0ZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgICByZW5kZXIgPDwgZW5kbDsKKyAgICAgIHJlbmRlciA8PCAiLSAoIiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIikgIiArIGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIiBfX2F0dHJpYnV0ZV9fKChvYmpjX21ldGhvZF9mYW1pbHkobm9uZSkpKTsiOworICAgIH0KKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYW4gT2JqZWN0aXZlLUMgMi4wIHByb3BlcnR5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5X2lzc2V0KHRfZmllbGQqIHRmaWVsZCkgeworICByZXR1cm4gIkBwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIEJPT0wgIiArIGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIklzU2V0OyI7Cit9CisKKy8qKgorICogRGVjbGFyZXMgcHJvcGVydHkgdW5zZXQgbWV0aG9kLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5X3Vuc2V0KHRfZmllbGQqIHRmaWVsZCkgeworICByZXR1cm4gIi0gKHZvaWQpIHVuc2V0IiArIGNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIHRoZSBlYXJseSBvdXQgcmV0dXJuIHN0YXRlbWVudAorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgaW52YWxpZCByZXR1cm4gc3RhdG1lbnQKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjppbnZhbGlkX3JldHVybl9zdGF0ZW1lbnQodF9mdW5jdGlvbiAqdGZ1bmN0aW9uKSB7CisgIGlmICgodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpKSB7CisgICAgcmV0dXJuICJyZXR1cm4gTk87IjsKKyAgfQorICByZXR1cm4gInJldHVybiBuaWw7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0cmluZyByZXN1bHQ7CisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0ID0gIihCT09MKSI7CisgIH0KKyAgZWxzZSBpZiAodHlwZV9jYW5fYmVfbnVsbCh0dHlwZSkpIHsKKyAgICByZXN1bHQgPSAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIikiOworICB9CisgIGVsc2UgeworICAgIHJlc3VsdCA9ICIoTlNOdW1iZXIgKikiOworICB9CisgIHJlc3VsdCArPSAiICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGluY2x1ZGVfZXJyb3IpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IGluc3RlYWQgb2YKKyAqIGxpdGVyYWxseSByZXR1cm5pbmcuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2Vycm9yKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiB0YXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgc3RyaW5nIHJlc3BvbnNlX3BhcmFtID0gInZvaWQgKF4pKCIgKyAoKHR0eXBlLT5pc192b2lkKCkpID8gIiIgOiB0eXBlX25hbWUodHR5cGUpKSArICIpIjsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIih2b2lkKSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBpbmNsdWRlX2Vycm9yKQorICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiIHJlc3BvbnNlIiA6ICIiKSArICI6ICgiCisgICsgcmVzcG9uc2VfcGFyYW0gKyAiKSByZXNwb25zZUJsb2NrICIKKyAgKyAiZmFpbHVyZSA6IChUQXN5bmNGYWlsdXJlQmxvY2spIGZhaWx1cmVCbG9jayI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHJldHVybnMgYSBwcm9taXNlIGluc3RlYWQgb2YKKyAqIGxpdGVyYWxseSByZXR1cm5pbmcuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiAiKEFueVByb21pc2UgKikgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiB0eXBlcyBhbmQgbmFtZXMsIHN1aXRhYmxlIGZvciBhbgorICogb2JqZWN0aXZlLWMgcGFyYW1ldGVyIGxpc3QKKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJvdG9jb2xfbmFtZSwgYm9vbCBpbmNsdWRlX2Vycm9yKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgYm9vbCBpbmNsdWRlX3Byb3RvY29sID0gIXByb3RvY29sX25hbWUuZW1wdHkoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBhcmdQcmVmaXggPSAiIjsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ1ByZWZpeCA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHJlc3VsdCArPSAiICI7CisgICAgfQorICAgIHJlc3VsdCArPSBhcmdQcmVmaXggKyAiOiAoIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIikgIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAoaW5jbHVkZV9wcm90b2NvbCkgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIHJlc3VsdCArPSAiIHByb3RvY29sIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICI6IChpZDxUUHJvdG9jb2w+KSAiICsgcHJvdG9jb2xfbmFtZTsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIGlmIChpbmNsdWRlX2Vycm9yKSB7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgcmVzdWx0ICs9ICIgZXJyb3IiOworICAgIH0KKyAgICByZXN1bHQgKz0gIjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBPYmplY3RpdmUtQyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGVTVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGVCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZUJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZUkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGVJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZURPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGVJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGVNQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZVNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZUxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgYSBmb3JtYXQgc3RyaW5nIHNwZWNpZmllciBmb3IgdGhlIHN1cHBsaWVkIHBhcnNlIHR5cGUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Zm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlxcXCIlQFxcXCIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiJWhpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICIlcWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIlZiI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiJWkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIiVAIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIlQCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgYSBmb3JtYXQgY2FzdCBmb3IgdGhlIHN1cHBsaWVkIHBhcnNlIHR5cGUuCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Zm9ybWF0X2Nhc3RfZm9yX3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICIiOyAvLyAiXFxcIiVAXFxcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICIiOyAvLyAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIiI7IC8vICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIiI7IC8vICIlaGkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICIoaW50KSI7IC8vICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIiI7IC8vICIlcWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIiOyAvLyAiJWYiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihpbnQpIjsgLy8gIiVpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIiOyAvLyAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiIjsgLy8gIiVAIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZm9ybWF0X2Nhc3RfZm9yX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY2FsbCB0byBhIGZpZWxkJ3Mgc2V0dGVyLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgRmllbGQgdGhlIHNldHRlciBpcyBiZWluZyBjYWxsZWQgb24KKyAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSB0byBwYXNzIHRvIHNldHRlcgorICovCisKK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7CisgIHJldHVybiAic2VsZi4iICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiA9ICIgKyBmaWVsZE5hbWUgKyAiOyI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY29jb2EsCisgICAgIkNvY29hIiwKKyAgICAiICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgorICAgICIgICAgZGVidWdfZGVzY3JpcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvblxuIgorICAgICIgICAgdmFsaWRhdGVfcmVxdWlyZWQ6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFRocm93cyBleGNlcHRpb24gaWYgYW55IHJlcXVpcmVkIGZpZWxkIGlzIG5vdCBzZXQuXG4iCisgICAgIiAgICBhc3luY19jbGllbnRzOiAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBibG9jayBzeW50YXguXG4iCisgICAgIiAgICBwb2RzOiAgICAgICAgICAgIEdlbmVyYXRlIGltcG9ydHMgaW4gQ29jb3BvZHMgZnJhbWV3b3JrIGZvcm1hdC5cbiIKKyAgICAiICAgIHByb21pc2Vfa2l0OiAgICAgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIHByb21pc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMwMzYzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDQ5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBDKysgY29kZSBnZW5lcmF0b3IuIFRoaXMgaXMgbGVnaXRpbWFjeSBpbmNhcm5hdGUuCisgKgorICovCitjbGFzcyB0X2NwcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9jcHBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworCisgICAgZ2VuX3B1cmVfZW51bXNfID0gZmFsc2U7CisgICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IGZhbHNlOworICAgIGdlbl9jb2Jfc3R5bGVfID0gZmFsc2U7CisgICAgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXyA9IGZhbHNlOworICAgIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18gPSBmYWxzZTsKKyAgICBnZW5fdGVtcGxhdGVzXyA9IGZhbHNlOworICAgIGdlbl90ZW1wbGF0ZXNfb25seV8gPSBmYWxzZTsKKyAgICBnZW5fbW92ZWFibGVfID0gZmFsc2U7CisgICAgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXyA9IGZhbHNlOworICAgIGdlbl9ub19za2VsZXRvbl8gPSBmYWxzZTsKKworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInB1cmVfZW51bXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9wdXJlX2VudW1zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImluY2x1ZGVfcHJlZml4IikgPT0gMCkgeworICAgICAgICB1c2VfaW5jbHVkZV9wcmVmaXhfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY29iX3N0eWxlIikgPT0gMCkgeworICAgICAgICBnZW5fY29iX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX2NsaWVudF9jb21wbGV0aW9uIikgPT0gMCkgeworICAgICAgICBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fZGVmYXVsdF9vcGVyYXRvcnMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0ZW1wbGF0ZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl90ZW1wbGF0ZXNfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX3RlbXBsYXRlc19vbmx5XyA9IChpdGVyLT5zZWNvbmQgPT0gIm9ubHkiKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibW92ZWFibGVfdHlwZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9tb3ZlYWJsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmICggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fb3N0cmVhbV9vcGVyYXRvcnMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmICggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fc2tlbGV0b24iKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub19za2VsZXRvbl8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNwcDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY3BwIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7IH0KKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7IGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsgfQorICB2b2lkIGdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN3YXAgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191c2VyX3N0cnVjdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGZvcmNlX2NwcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXR0ZXJzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y3BldGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb3ZlKTsKKyAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNwZWNpYWxpemVkID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1c2hfYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmdfcHJlZml4KTsKKyAgLyoKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeChzdGQ6OnN0cmluZyBucyk7CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9vcGVuKHN0ZDo6c3RyaW5nIG5zKTsKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Nsb3NlKHN0ZDo6c3RyaW5nIG5zKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGFyZyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGNvYl9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcyA9IHRydWUsIGJvb2wgc3RhcnRfY29tbWEgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKworICB2b2lkIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChzdGQ6Om9zdHJlYW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgY29uc3RhbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3ZhbHVlcyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlcm5hbCA9IGZhbHNlKTsKKworICBib29sIGlzX3JlZmVyZW5jZSh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlZmVyZW5jZSgpOyB9CisKKyAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpCisgICAgICAgICAgICAgICAmJiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykpOworICB9CisKKyAgdm9pZCBzZXRfdXNlX2luY2x1ZGVfcHJlZml4KGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4KSB7IHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB1c2VfaW5jbHVkZV9wcmVmaXg7IH0KKworICAvKioKKyAgICogVGhlIGNvbXBpbGVyIG9wdGlvbiAibm9fdGhyaWZ0X29zdHJlYW1faW1wbCIgY2FuIGJlIHVzZWQgdG8gcHJldmVudAorICAgKiB0aGUgY29tcGlsZXIgZnJvbSBlbWl0dGluZyBpbXBsZW1lbnRhdGlvbnMgZm9yIG9wZXJhdG9yIDw8LiAgSW4gdGhpcworICAgKiBjYXNlIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGFueSBuZWVkZWQgdG8gYnVpbGQuCisgICAqCisgICAqIFRvIGRpc2FibGUgdGhpcyBvbiBhIHBlciBzdHJ1Y3R1cmUgYmFzZXMsIG9uZSBjYW4gYWx0ZXJuYXRpdmVseSBzZXQKKyAgICogdGhlIGFubm90YXRpb24gImNwcC5jdXN0b21vc3RyZWFtIiB0byBwcmV2ZW50IHRocmlmdCBmcm9tIGVtaXR0aW5nIGFuCisgICAqIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mKS4KKyAgICoKKyAgICogU2VlIEFubm90YXRpb25UZXN0IGZvciB2YWxpZGF0aW9uIG9mIHRoaXMgYW5ub3RhdGlvbiBmZWF0dXJlLgorICAgKi8KKyAgYm9vbCBoYXNfY3VzdG9tX29zdHJlYW0odF90eXBlKiB0dHlwZSkgY29uc3QgeworICAgIHJldHVybiAoZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXykgfHwKKyAgICAgICAgICAgKHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgiY3BwLmN1c3RvbW9zdHJlYW0iKSAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogUmV0dXJucyB0aGUgaW5jbHVkZSBwcmVmaXggdG8gdXNlIGZvciBhIGZpbGUgZ2VuZXJhdGVkIGJ5IHByb2dyYW0sIG9yIHRoZQorICAgKiBlbXB0eSBzdHJpbmcgaWYgbm8gaW5jbHVkZSBwcmVmaXggc2hvdWxkIGJlIHVzZWQuCisgICAqLworICBzdGQ6OnN0cmluZyBnZXRfaW5jbHVkZV9wcmVmaXgoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdDsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHVyZSBlbnVtcyBmb3IgVGhyaWZ0IGVudW1zLCBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy4KKyAgICovCisgIGJvb2wgZ2VuX3B1cmVfZW51bXNfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCisgICAqLworICBib29sIGdlbl90ZW1wbGF0ZXNfOworCisgIC8qKgorICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHJvY2VzcyBmdW5jdGlvbiBwb2ludGVycyBmb3Igb25seSB0ZW1wbGF0aXplZAorICAgKiByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCisgICAqLworICBib29sIGdlbl90ZW1wbGF0ZXNfb25seV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIG1vdmUgY29uc3RydWN0b3JzICYgYXNzaWdubWVudCBvcGVyYXRvcnMuCisgICAqLworICBib29sIGdlbl9tb3ZlYWJsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIG9zdHJlYW0gZGVmaW5pdGlvbnMKKyAgICovCisgIGJvb2wgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXzsKKworICAvKioKKyAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIHVzZSBhIHBhdGggcHJlZml4IGluIG91ciAjaW5jbHVkZSBzdGF0ZW1lbnRzIGZvciBvdGhlcgorICAgKiB0aHJpZnQtZ2VuZXJhdGVkIGhlYWRlciBmaWxlcy4KKyAgICovCisgIGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4XzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgIkNvbnRpbnVhdGlvbiBPQmplY3QiLXN0eWxlIGNsYXNzZXMgYXMgd2VsbC4KKyAgICovCisgIGJvb2wgZ2VuX2NvYl9zdHlsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIG9taXQgY2FsbHMgdG8gY29tcGxldGlvbl9fKCkgaW4gQ29iQ2xpZW50IGNsYXNzLgorICAgKi8KKyAgYm9vbCBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBvbWl0IGdlbmVyYXRpbmcgdGhlIGRlZmF1bHQgb3BlYXJ0b3JzID09LCAhPSBhbmQgPC4KKyAgICovCisgIGJvb2wgZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXzsKKworICAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHNrZWxldG9uLgorICAgKi8KKyAgYm9vbCBnZW5fbm9fc2tlbGV0b25fOworCisgIC8qKgorICAgKiBTdHJpbmdzIGZvciBuYW1lc3BhY2UsIGNvbXB1dGVkIG9uY2UgdXAgZnJvbnQgdGhlbiB1c2VkIGRpcmVjdGx5CisgICAqLworCisgIHN0ZDo6c3RyaW5nIG5zX29wZW5fOworICBzdGQ6OnN0cmluZyBuc19jbG9zZV87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcywgc3RvcmVkIGhlcmUgdG8gYXZvaWQgcGFzc2luZyB0aGVtIGFzIHBhcmFtZXRlcnMgdG8gZXZlcnkKKyAgICogZnVuY3Rpb24uCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19pbXBsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX3RjY187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX3RjY187CisKKyAgLy8gVGhlIFByb2Nlc3NvckdlbmVyYXRvciBpcyB1c2VkIHRvIGdlbmVyYXRlIHBhcnRzIG9mIHRoZSBjb2RlLAorICAvLyBzbyBpdCBuZWVkcyBhY2Nlc3MgdG8gbWFueSBvZiBvdXIgcHJvdGVjdGVkIG1lbWJlcnMgYW5kIG1ldGhvZHMuCisgIC8vCisgIC8vIFRPRE86IFRoZSBjb2RlIHJlYWxseSBzaG91bGQgYmUgY2xlYW5lZCB1cCBzbyB0aGF0IGhlbHBlciBtZXRob2RzIGZvcgorICAvLyB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZXMgYXJlIHNlcGFyYXRlIGZyb20gdGhlIGdlbmVyYXRvciBjbGFzc2VzCisgIC8vIHRoZW1zZWx2ZXMuCisgIGZyaWVuZCBjbGFzcyBQcm9jZXNzb3JHZW5lcmF0b3I7Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5oIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUpOworCisgIHN0cmluZyBmX3R5cGVzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5jcHAiOworICBmX3R5cGVzX2ltcGxfLm9wZW4oZl90eXBlc19pbXBsX25hbWUuY19zdHIoKSk7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgLy8gSWYgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBpdCBhcHBlYXJzIHRvIGp1c3QgZGlzY2FyZCBkYXRhLAorICAgIC8vIHdoaWNoIGlzIGZpbmUuCisgICAgc3RyaW5nIGZfdHlwZXNfdGNjX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMudGNjIjsKKyAgICBmX3R5cGVzX3RjY18ub3BlbihmX3R5cGVzX3RjY19uYW1lLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX3R5cGVzX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX3R5cGVzX3RjY18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gU3RhcnQgaWZuZGVmCisgIGZfdHlwZXNfIDw8ICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgPDwgIl9UWVBFU19UQ0MiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIGJhc2UgdHlwZXMKKyAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDxpb3Nmd2Q+IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9UQmFzZS5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgLy8gSW5jbHVkZSBDKyt4eCBjb21wYXRpYmlsaXR5IGhlYWRlcgorICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPGZ1bmN0aW9uYWw+IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPG1lbW9yeT4iIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOworCisgICAgLy8gWFhYKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKKyAgICAvLyBpbmNsdWRlZCBmaWxlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgZl90eXBlc190Y2NfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsOworICB9CisgIGZfdHlwZXNfIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSBjdXN0b20gaGVhZGVycworICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY3BwX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jcHBfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjcHBfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoY3BwX2luY2x1ZGVzW2ldWzBdID09ICc8JykgeworICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlICIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl90eXBlc18gPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIHRoZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgICA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gVGhlIHN3YXAoKSBjb2RlIG5lZWRzIDxhbGdvcml0aG0+IGZvciBzdGQ6OnN3YXAoKQorICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8YWxnb3JpdGhtPiIgPDwgZW5kbDsKKyAgLy8gZm9yIG9wZXJhdG9yPDwKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPG9zdHJlYW0+IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gT3BlbiBuYW1lc3BhY2UKKyAgbnNfb3Blbl8gPSBuYW1lc3BhY2Vfb3Blbihwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworICBuc19jbG9zZV8gPSBuYW1lc3BhY2VfY2xvc2UocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKKworICBmX3R5cGVzXyA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc190Y2NfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIG91dHB1dCBmaWxlcy4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgbmFtZXNwYWNlCisgIGZfdHlwZXNfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgbnNfY2xvc2VfIDw8IGVuZGw7CisgIGZfdHlwZXNfdGNjXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgdGhlIHR5cGVzLnRjYyBmaWxlIGZyb20gdGhlIHR5cGVzIGhlYWRlciBmaWxlLAorICAvLyBzbyBjbGllbnRzIGRvbid0IGhhdmUgdG8gZXhwbGljaXRseSBpbmNsdWRlIHRoZSB0Y2MgZmlsZS4KKyAgLy8gVE9ETyhzaW1wa2lucyk6IE1ha2UgdGhpcyBhIHNlcGFyYXRlIG9wdGlvbi4KKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDbG9zZSBpZm5kZWYKKyAgZl90eXBlc18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgZl90eXBlc190Y2NfIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugb3V0cHV0IGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl90eXBlc19pbXBsXy5jbG9zZSgpOworICBmX3R5cGVzX3RjY18uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBDKysKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIKKyAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvc3RyZWFtJiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpIHsKKyAgZiA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGYgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChmKSA8PCBwcmVmaXggPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeDsKKyAgICBpZiAoaW5jbHVkZV92YWx1ZXMpIHsKKyAgICAgIGYgPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICB9CisgIH0KKworICBmIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmKSA8PCAifTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gQysrLCB0aGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lCisgKiBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUgZW51bSBrZXl3b3JkIGluIEMrKy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisKKyAgc3RkOjpzdHJpbmcgZW51bV9uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgZW51bV9uYW1lID0gInR5cGUiOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJzdHJ1Y3QgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWU7CisKKyAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfLCBjb25zdGFudHMsICIiLCAiIiwgdHJ1ZSk7CisKKyAgaWYgKCFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGVuZGw7CisKKyAgLyoqCisgICAgIEdlbmVyYXRlIGEgY2hhcmFjdGVyIGFycmF5IG9mIGVudW0gbmFtZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgKi8KKyAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiI7CisgIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgcHJlZml4ID0gdGVudW0tPmdldF9uYW1lKCkgKyAiOjoiOworICB9CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaW50IF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzW10gPSI7CisgIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsIHByZWZpeC5jX3N0cigpLCAiIiwgZmFsc2UpOworCisgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0IGNoYXIqIF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiTmFtZXNbXSA9IjsKKyAgZ2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KGZfdHlwZXNfaW1wbF8sIGNvbnN0YW50cywgIlwiIiwgIlwiIiwgZmFsc2UpOworCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJleHRlcm4gY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgPDwgIl9WQUxVRVNfVE9fTkFNRVM7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3Qgc3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj4gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiX1ZBTFVFU19UT19OQU1FUyg6OmFwYWNoZTo6dGhyaWZ0OjpURW51bUl0ZXJhdG9yKCIgPDwgY29uc3RhbnRzLnNpemUoKSA8PCAiLCBfayIKKyAgICAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzIgorICAgICAgICAgICAgICAgIDw8ICIsIF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiTmFtZXMpLCAiCisgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRFbnVtSXRlcmF0b3IoLTEsIE5VTEwsIE5VTEwpKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3JfZGVjbChmX3R5cGVzXywgdGVudW0pOworICBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdGVudW0pOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pIHsKKworICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIjsKKyAgaWYgKGdlbl9wdXJlX2VudW1zXykgeworICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIjo6dHlwZSYiOworICB9CisgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkgeworCisgIC8vIElmIHdlJ3ZlIGJlZW4gdG9sZCB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIHdpbGwgcHJvdmlkZSBhbiBvc3RyZWFtCisgIC8vIG9wZXJhdG9yIGRlZmluaXRpb24gdGhlbiB3ZSBvbmx5IG1ha2UgYSBkZWNsYXJhdGlvbjoKKworICBpZiAoIWhhc19jdXN0b21fb3N0cmVhbSh0ZW51bSkpIHsKKyAgICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIjsKKyAgICBpZiAoZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOjp0eXBlJiI7CisgICAgfQorICAgIG91dCA8PCAiIHZhbCkgIjsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBfIgorICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJfVkFMVUVTX1RPX05BTUVTLmZpbmQodmFsKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaXQgIT0gXyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMuZW5kKCkpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgaXQtPnNlY29uZDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IHN0YXRpY19jYXN0PGludD4odmFsKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBvdXQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdGFudHMuaCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdGFudHMuY3BwIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c19pbXBsOworICBmX2NvbnN0c19pbXBsLm9wZW4oZl9jb25zdHNfaW1wbF9uYW1lKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfY29uc3RzX2ltcGwgPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLy8gU3RhcnQgaWZuZGVmCisgIGZfY29uc3RzIDw8ICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfaW1wbCA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgIDw8ICJfY29uc3RhbnRzLmhcIiIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCAiY2xhc3MgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgIiAgIgorICAgICAgICAgICA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgZl9jb25zdHMgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfY29uc3RzIDw8ICJ9OyIgPDwgZW5kbDsKKworICBmX2NvbnN0c19pbXBsIDw8ICJjb25zdCAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyBnXyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX2NvbnN0YW50czsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50czo6IiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICAgPDwgIkNvbnN0YW50cygpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHNfaW1wbCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgZW5kbCA8PCAiZXh0ZXJuIGNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGwgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgZl9jb25zdHMuY2xvc2UoKTsKKworICBmX2NvbnN0c19pbXBsIDw8IGVuZGwgPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9jb25zdHNfaW1wbC5jbG9zZSgpOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBib29sIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBpc19ub25yZXF1aXJlZF9maWVsZCA9IGZhbHNlOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICAgIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpZiAoaXNfbm9ucmVxdWlyZWRfZmllbGQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLl9faXNzZXQuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHVzaF9iYWNrKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBwcmludF9jb25zdF92YWx1ZTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworLyoqCisgKgorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAic3RhdGljX2Nhc3Q8ZG91YmxlPigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gRm9yd2FyZCBkZWNsYXJlIHN0cnVjdCBkZWYKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMgYW5kIGEgcmVhZC93cml0ZSgpIGZ1bmN0aW9uLCBwbHVzIGEgbWlycm9yaW5nIGlzc2V0CisgKiBpbm5lciBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfaW1wbF8sIGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIHRydWUsIHRydWUpOworCisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl90eXBlc190Y2NfIDogZl90eXBlc19pbXBsXyk7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfY29weV9jb25zdHJ1Y3RvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgIGdlbmVyYXRlX21vdmVfY29uc3RydWN0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgfQorICBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgIGdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgfQorCisgIGlmICghaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CisgICAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgfQorCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2QoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIC8qaXNfbW92ZT0qL2ZhbHNlKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX21vdmVfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIC8qaXNfbW92ZT0qL3RydWUpOworfQorCituYW1lc3BhY2UgeworLy8gSGVscGVyIHRvIGNvbnZlcnQgYSB2YXJpYWJsZSB0byBydmFsdWUsIGlmIG1vdmUgaXMgZW5hYmxlZAorc3RkOjpzdHJpbmcgbWF5YmVNb3ZlKHN0ZDo6c3RyaW5nIGNvbnN0JiBvdGhlciwgYm9vbCBtb3ZlKSB7CisgIGlmIChtb3ZlKSB7CisgICAgcmV0dXJuICJzdGQ6Om1vdmUoIiArIG90aGVyICsgIikiOworICB9CisgIHJldHVybiBvdGhlcjsKK30KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb3ZlKSB7CisKKyAgc3RkOjpzdHJpbmcgdG1wX25hbWUgPSB0bXAoIm90aGVyIik7CisKKyAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKGlzX21vdmUpIHsKKyAgICBvdXQgPDwgIiggIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJiAiOworICB9IGVsc2UgeworICAgIG91dCA8PCAiKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiOworICB9CisgIG91dCA8PCB0bXBfbmFtZSA8PCAiKSAiOworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIG91dCA8PCAiOiBURXhjZXB0aW9uKCkgIjsKKyAgb3V0IDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBlbGltaW5hdGUgY29tcGlsZXIgdW51c2VkIHdhcm5pbmcKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCAiKHZvaWQpICIgPDwgdG1wX25hbWUgPDwgIjsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQgPSAiIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuX19pc3NldCIsIGlzX21vdmUpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIob3V0LCB0c3RydWN0LCAvKmlzX21vdmU9Ki9mYWxzZSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tb3ZlX2Fzc2lnbm1lbnRfb3BlcmF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvdXQsIHRzdHJ1Y3QsIC8qaXNfbW92ZT0qL3RydWUpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19tb3ZlKSB7CisgIHN0ZDo6c3RyaW5nIHRtcF9uYW1lID0gdG1wKCJvdGhlciIpOworCisgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Om9wZXJhdG9yPSgiOworCisgIGlmIChpc19tb3ZlKSB7CisgICAgb3V0IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmICI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIjsKKyAgfQorICBvdXQgPDwgdG1wX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBlbGltaW5hdGUgY29tcGlsZXIgdW51c2VkIHdhcm5pbmcKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCAiKHZvaWQpICIgPDwgdG1wX25hbWUgPDwgIjsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgZm9yIChmX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGZfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgeworICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0ID0gIiA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLl9faXNzZXQiLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKnRoaXM7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZXMgdGhlIHN0cnVjdCBkZWNsYXJhdGlvbiBpbnRvIHRoZSBoZWFkZXIgZmlsZQorICoKKyAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191c2VyX3N0cnVjdCkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgZXh0ZW5kcyA9ICIgOiBwdWJsaWMgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiI7CisgIH0gZWxzZSB7CisgICAgaWYgKGlzX3VzZXJfc3RydWN0ICYmICFnZW5fdGVtcGxhdGVzXykgeworICAgICAgZXh0ZW5kcyA9ICIgOiBwdWJsaWMgdmlydHVhbCA6OmFwYWNoZTo6dGhyaWZ0OjpUQmFzZSI7CisgICAgfQorICB9CisKKyAgLy8gR2V0IG1lbWJlcnMKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAvLyBXcml0ZSB0aGUgaXNzZXQgc3RydWN0dXJlIGRlY2xhcmF0aW9uIG91dHNpZGUgdGhlIGNsYXNzLiBUaGlzIG1ha2VzCisgIC8vIHRoZSBnZW5lcmF0ZWQgY29kZSBhbWVuYWJsZSB0byBwcm9jZXNzaW5nIGJ5IFNXSUcuCisgIC8vIFdlIG9ubHkgZGVjbGFyZSB0aGUgc3RydWN0IGlmIGl0IGdldHMgdXNlZCBpbiB0aGUgY2xhc3MuCisKKyAgLy8gSXNzZXQgc3RydWN0IGhhcyBib29sZWFuIGZpZWxkcywgYnV0IG9ubHkgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgfQorCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIl8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQoKSAiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgc3RyaW5nIGlzU2V0ID0gKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiOiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgaXNTZXQgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBpc1NldCA8PCAiKSI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiIHt9IiA8PCBlbmRsOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA6MTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0OyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIE9wZW4gc3RydWN0IGRlZgorICBvdXQgPDwgaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICghcG9pbnRlcnMpIHsKKyAgICAvLyBDb3B5IGNvbnN0cnVjdG9yCisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJik7IiA8PCBlbmRsOworCisgICAgLy8gTW92ZSBjb25zdHJ1Y3RvcgorICAgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJik7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEFzc2lnbm1lbnQgT3BlcmF0b3IKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImIG9wZXJhdG9yPShjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgLy8gTW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgb3BlcmF0b3I9KCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkiOworCisgICAgYm9vbCBpbml0X2N0b3IgPSBmYWxzZTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSB8fCB0LT5pc19lbnVtKCkgfHwgaXNfcmVmZXJlbmNlKCptX2l0ZXIpKSB7CisgICAgICAgIHN0cmluZyBkdmFsOworICAgICAgICBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICAgICAgZHZhbCArPSAiKCIgKyB0eXBlX25hbWUodCkgKyAiKSI7CisgICAgICAgIH0KKyAgICAgICAgZHZhbCArPSAodC0+aXNfc3RyaW5nKCkgfHwgaXNfcmVmZXJlbmNlKCptX2l0ZXIpKSA/ICIiIDogIjAiOworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgY3YpOworICAgICAgICB9CisgICAgICAgIGlmICghaW5pdF9jdG9yKSB7CisgICAgICAgICAgaW5pdF9jdG9yID0gdHJ1ZTsKKyAgICAgICAgICBvdXQgPDwgIiA6ICI7CisgICAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZHZhbCA8PCAiKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIC8vIFRPRE8oZHJlaXNzKTogV2hlbiBldmVyeXRoaW5nIGVsc2UgaW4gVGhyaWZ0IGlzIHBlcmZlY3QsCisgICAgLy8gZG8gbW9yZSBvZiB0aGVzZSBpbiB0aGUgaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmICghdC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgICAgICBpZiAoY3YgIT0gTlVMTCkgeworICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpID09IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSkgeworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIG5vZXhjZXB0OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlY2xhcmUgYWxsIGZpZWxkcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRlcnMgJiYgISgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVhZCkgPDwgZW5kbDsKKyAgfQorCisgIC8vIEFkZCB0aGUgX19pc3NldCBkYXRhIG1lbWJlciBpZiB3ZSBuZWVkIGl0LCB1c2luZyB0aGUgZGVmaW5pdGlvbiBmcm9tIGFib3ZlCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCBfX2lzc2V0OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKHBvaW50ZXJzKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICI+IjsKKyAgICAgIG91dCA8PCAiIHZhbCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSk7CisgICAgICBvdXQgPDwgIiB2YWwpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKCFwb2ludGVycykgeworICAgIC8vIFNob3VsZCB3ZSBnZW5lcmF0ZSBkZWZhdWx0IG9wZXJhdG9ycz8KKyAgICBpZiAoIWdlbl9ub19kZWZhdWx0X29wZXJhdG9yc18pIHsKKyAgICAgIC8vIEdlbmVyYXRlIGFuIGVxdWFsaXR5IHRlc3Rpbmcgb3BlcmF0b3IuICBNYWtlIGl0IGlubGluZSBzaW5jZSB0aGUgY29tcGlsZXIKKyAgICAgIC8vIHdpbGwgZG8gYSBiZXR0ZXIgam9iIHRoYW4gd2Ugd291bGQgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGlubGluZSBpdC4KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiAiCisgICAgICAgICAgPDwgKG1lbWJlcnMuc2l6ZSgpID4gMCA/ICJyaHMiIDogIi8qIHJocyAqLyIpIDw8ICIpIGNvbnN0IiA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCisgICAgICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IHJocy4iCisgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gcmhzLl9faXNzZXQuIgorICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZSBpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICYmICEoIgorICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZyaHMpIGNvbnN0IHsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gISgqdGhpcyA9PSByaHMpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxlc3MtdGhhbiBvcGVyYXRvci4gIFRoaXMgbXVzdCBiZQorICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciBpZiB0aGV5IHdpc2ggdG8gdXNlIGl0LiAgKFRoZXkKKyAgICAgIC8vIHdpbGwgZ2V0IGEgbGluayBlcnJvciBpZiB0aGV5IHRyeSB0byB1c2UgaXQgd2l0aG91dCBhbiBpbXBsZW1lbnRhdGlvbi4pCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPCAoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJiApIGNvbnN0OyIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHJlYWQpIHsKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAidWludDMyX3QgcmVhZChQcm90b2NvbF8qIGlwcm90KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZCgiCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmICh3cml0ZSkgeworICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ1aW50MzJfdCB3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3Qgd3JpdGUoIgorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBpZiAoaXNfdXNlcl9zdHJ1Y3QgJiYgIWhhc19jdXN0b21fb3N0cmVhbSh0c3RydWN0KSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiOworICAgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChvdXQsIE5VTEwpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIHN0ZDo6ZXhjZXB0aW9uOjp3aGF0KCkKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibXV0YWJsZSBzdGQ6OnN0cmluZyB0aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl87IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoc3dhcCkgeworICAgIC8vIEdlbmVyYXRlIGEgbmFtZXNwYWNlLXNjb3BlIHN3YXAoKSBmdW5jdGlvbgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIiAmYik7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpZiAoaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKG91dCwgdHN0cnVjdCk7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBmb3JjZV9jcHBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0dGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0KSB7CisgIC8vIEdldCBtZW1iZXJzCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgLy8gRGVzdHJ1Y3RvcgorICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7CisgICAgZm9yY2VfY3BwX291dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6fiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIigpIG5vZXhjZXB0IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZvcmNlX2NwcF9vdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHNldHRlciBmdW5jdGlvbiBmb3IgZWFjaCBmaWVsZAorICBpZiAoc2V0dGVycykgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChpc19yZWZlcmVuY2UoKCptX2l0ZXIpKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlID0gdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpfX3NldF8iCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6c2hhcmVkX3B0cjwiCisgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICI+IjsKKyAgICAgICAgb3V0IDw8ICIgdmFsKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Ol9fc2V0XyIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpOworICAgICAgICBvdXQgPDwgIiB2YWwpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHZhbDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAvLyBhc3N1bWUgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQgZXhjZXB0IG9wdGlvbmFsIGZpZWxkcy4KKyAgICAgIC8vIGZvciBvcHRpb25hbCBmaWVsZHMgY2hhbmdlIF9faXNzZXQubmFtZSB0byB0cnVlCisgICAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAoaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIE1ha2VzIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGdlbiBhIHN0cnVjdCByZWFkZXIuCisgKgorICogQHBhcmFtIG91dCBTdHJlYW0gdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycykgeworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6cmVhZChQcm90b2NvbF8qIGlwcm90KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiOjpyZWFkKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSB7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKKyAgb3V0IDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VElucHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKCppcHJvdCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmcgZm5hbWU7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImludDE2X3QgZmlkOyIgPDwgZW5kbAorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7IiA8PCBlbmRsCisgICAgICA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbjsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0uCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZnR5cGUgPT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuZW1wdHkoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSIgPDwgZW5kbDsKKworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgY29uc3QgY2hhciogaXNzZXRfcHJlZml4ID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpID8gInRoaXMtPl9faXNzZXQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImlzc2V0XyI7CisKKyNpZiAwCisgICAgICAgICAgLy8gVGhpcyBjb2RlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgZmllbGQgaXMgZW5jb3VudGVyZWQgdHdpY2UuCisgICAgICAgICAgLy8gV2UndmUgZGVjaWRlZCB0byBsZWF2ZSBpdCBvdXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBHZW5lcmF0ZSB0aGlzIGNvZGUgYW5kICJpZiIgaXQgb3V0IHRvIG1ha2UgaXQgZWFzaWVyCisgICAgICAgICAgLy8gZm9yIHBlb3BsZSByZWNvbXBpbGluZyB0aHJpZnQgdG8gaW5jbHVkZSBpdC4KKyAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyNlbmRpZgorCisgICAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGlzc2V0X3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsCisgICAgICAgICAgPDwKKyAgICAgICAgICAvLyBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBhbiBvcHRpb24gd2hlbiB0aHJpZnQgc3RydWN0cworICAgICAgICAgIC8vIGhhdmUgYSBjb21tb24gYmFzZSBjbGFzcy4KKyAgICAgICAgICAvLyBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0gLy8hZmllbGRzLmVtcHR5KCkKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIC8vIFRocm93IGlmIGFueSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCisgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgcmVhZGluZyB0aGUgc3RydWN0IGVuZCBzbyB0aGF0CisgIC8vIHRoZXJlIG1pZ2h0IHBvc3NpYmx5IGJlIGEgY2hhbmNlIG9mIGNvbnRpbnVpbmcuCisgIG91dCA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICcpJyA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB3cml0ZSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bworICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzKSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6d3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIjo6d3JpdGUoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUT3V0cHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKCpvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY2hlY2tfaWZfc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpOworICAgIGlmIChjaGVja19pZl9zZXQpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgIH0KKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICBpZiAoY2hlY2tfaWZfc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgJ30nOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFN0cnVjdCB3cml0ZXIgZm9yIHJlc3VsdCBvZiBhIGZ1bmN0aW9uLCB3aGljaCBjYW4gaGF2ZSBvbmx5IG9uZSBvZiBpdHMKKyAqIGZpZWxkcyBzZXQgYW5kIGRvZXMgYSBjb25kaXRpb25hbCBpZiBlbHNlIGxvb2sgdXAgaW50byB0aGUgX19pc3NldCBmaWVsZAorICogb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KKyAqIEBwYXJhbSB0c3RydWN0IFRoZSByZXN1bHQgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMtPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBpZiAocG9pbnRlcnMpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgIH0KKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisKKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgc3dhcCBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bworICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3N3YXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgc3dhcCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmYSwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiICZiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBMZXQgYXJndW1lbnQtZGVwZW5kZW50IG5hbWUgbG9va3VwIGZpbmQgdGhlIGNvcnJlY3Qgc3dhcCgpIGZ1bmN0aW9uIHRvCisgIC8vIHVzZSBiYXNlZCBvbiB0aGUgYXJndW1lbnQgdHlwZXMuICBJZiBub25lIGlzIGZvdW5kIGluIHRoZSBhcmd1bWVudHMnCisgIC8vIG5hbWVzcGFjZXMsIGZhbGwgYmFjayB0byA6OnN0ZDo6c3dhcCgpLgorICBvdXQgPDwgaW5kZW50KCkgPDwgInVzaW5nIDo6c3RkOjpzd2FwOyIgPDwgZW5kbDsKKworICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAqZl9pdGVyOworCisgICAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dhcChhLiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIGIuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IgorICAgICAgICA8PCBlbmRsOworICB9CisKKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN3YXAoYS5fX2lzc2V0LCBiLl9faXNzZXQpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGhhbmRsZSBlbXB0eSBzdHJ1Y3RzCisgIGlmIChmaWVsZHMuc2l6ZSgpID09IDApIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBhOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBiOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIiYgb2JqKTsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICghaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CisgICAgLy8gdGhyaWZ0IGRlZmluZXMgdGhpcyBiZWhhdmlvcgorICAgIG91dCA8PCAic3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIiYgb2JqKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib2JqLnByaW50VG8ob3V0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBvdXQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgInZvaWQgIjsKKyAgaWYgKHRzdHJ1Y3QpIHsKKyAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiOworICB9CisgIG91dCA8PCAicHJpbnRUbyhzdGQ6Om9zdHJlYW0mIG91dCkgY29uc3QiOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlcm5hbCkgeworICBvdXQgPDwgImNvbnN0IGNoYXIqICI7CisgIGlmIChleHRlcm5hbCkgeworICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiI7CisgIH0KKyAgb3V0IDw8ICJ3aGF0KCkgY29uc3Qgbm9leGNlcHQiOworfQorCituYW1lc3BhY2Ugc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZ2VuZXJhdG9yIHsKK3ZvaWQgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIG91dCA8PCAiIDw8IHRvX3N0cmluZygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIjsKK30KKwordm9pZCBnZW5lcmF0ZV9vcHRpb25hbF9maWVsZF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgb3V0IDw8ICI7IChfX2lzc2V0LiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA/IChvdXQiOworICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKKyAgb3V0IDw8ICIpIDogKG91dCA8PCBcIjxudWxsPlwiKSkiOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKQorICAgIGdlbmVyYXRlX29wdGlvbmFsX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworICBlbHNlCisgICAgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgb3V0IDw8ICJcIiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIj1cIiI7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIGdlbmVyYXRlX2ZpZWxkX25hbWUob3V0LCBmaWVsZCk7CisgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkcyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbmRlbnQpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYmVnID0gZmllbGRzLmJlZ2luKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGZpZWxkcy5lbmQoKTsKKworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJvdXQgPDwgIjsKKworICAgIGlmIChpdCAhPSBiZWcpIHsKKyAgICAgIG91dCA8PCAiXCIsIFwiIDw8ICI7CisgICAgfQorCisgICAgZ2VuZXJhdGVfZmllbGQob3V0LCAqaXQpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBvcGVyYXRvcjw8CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCk7CisgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjphcGFjaGU6OnRocmlmdDo6dG9fc3RyaW5nOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIjsiIDw8IGVuZGw7CisgIHN0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRzKG91dCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgaW5kZW50KCkpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBcIilcIjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHdoYXQoKSBtZXRob2QgZm9yIGV4Y2VwdGlvbnMKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpOworICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QsIHRydWUpOworICBvdXQgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nc3RyZWFtIHNzOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzcyA8PCBcIlRFeGNlcHRpb24gLSBzZXJ2aWNlIGhhcyB0aHJvd246IFwiIDw8ICp0aGlzOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLT50aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl8gPSBzcy5zdHIoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMtPnRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXy5jX3N0cigpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJikgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gXCJURXhjZXB0aW9uIC0gc2VydmljZSBoYXMgdGhyb3duOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiOyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCisgIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLmgiOworICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlciBmaWxlIGluY2x1ZGVzCisgIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl9oZWFkZXJfIDw8ICIjaWZuZGVmICIgPDwgc3ZjbmFtZSA8PCAiX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPiIgPDwgZW5kbCAvLyBUTWVtb3J5QnVmZmVyCisgICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8ZnVuY3Rpb25hbD4iIDw8IGVuZGwgCisgICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8bWVtb3J5PiIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAibmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAiY2xhc3MgVEFzeW5jQ2hhbm5lbDsiIDw8IGVuZGwgPDwgIn19fSIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg+IiA8PCBlbmRsOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaD4iIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaD4iIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhcIiIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkKKyAgICAgICAgICAgICAgPDwgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIuaFwiIiA8PCBlbmRsOworICB9CisKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCAiI2lmZGVmIF9NU0NfVkVSXG4iCisgICAgICAgICAgICAgICAiICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKVxuIgorICAgICAgICAgICAgICAgIiAgI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDI1MCApIC8vaW5oZXJpdGluZyBtZXRob2RzIHZpYSBkb21pbmFuY2UgXG4iCisgICAgICAgICAgICAgICAiI2VuZGlmXG5cbiI7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIi5jcHAiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGw7CisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwidGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaFwiIiA8PCBlbmRsOworICB9CisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi50Y2NcIiIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3RjY19uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLnRjYyI7CisgICAgZl9zZXJ2aWNlX3RjY18ub3BlbihmX3NlcnZpY2VfdGNjX25hbWUuY19zdHIoKSk7CisgICAgZl9zZXJ2aWNlX3RjY18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgICAgZl9zZXJ2aWNlX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV90Y2NfIDw8ICIjaWZuZGVmICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWUgPDwgIl9UQ0MiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgICBmX3NlcnZpY2VfdGNjXyA8PCAiI2luY2x1ZGUgXCJ0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oXCIiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX3RjY18gPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb21wb25lbnRzCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodHNlcnZpY2UsICIiKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICJDb25jdXJyZW50Iik7CisKKyAgLy8gR2VuZXJhdGUgc2tlbGV0b24KKyAgaWYgKCFnZW5fbm9fc2tlbGV0b25fKSB7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRzZXJ2aWNlKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGFsbCB0aGUgY29iIGNvbXBvbmVudHMKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JDbCIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiQ29iU3YiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRzZXJ2aWNlLCAiQ29iU3YiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICJDb2JTdiIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29iIik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICJDb2IiKTsKKworICAgIGlmICghZ2VuX25vX3NrZWxldG9uXykgeworICAgICAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0c2VydmljZSk7CisgICAgfQorCisgIH0KKworICBmX2hlYWRlcl8gPDwgIiNpZmRlZiBfTVNDX1ZFUlxuIgorICAgICAgICAgICAgICAgIiAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKVxuIgorICAgICAgICAgICAgICAgIiNlbmRpZlxuXG4iOworCisgIC8vIENsb3NlIHRoZSBuYW1lc3BhY2UKKyAgZl9zZXJ2aWNlXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfdGNjXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX2hlYWRlcl8gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBUT0RPKHNpbXBraW5zKTogTWFrZSB0aGlzIGEgc2VwYXJhdGUgb3B0aW9uCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLnRjY1wiIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgIDw8ICJfdHlwZXMudGNjXCIiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBmX3NlcnZpY2VfdGNjXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworCisgIC8vIENsb3NlIHRoZSBmaWxlcworICBmX3NlcnZpY2VfdGNjXy5jbG9zZSgpOworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIGZfaGVhZGVyXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuIEJhc2ljYWxseSwgdGhpcyBnZW5lcmF0ZXMgdHlwZXMKKyAqIGZvciBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgcmVzdWx0cyB0byBmdW5jdGlvbnMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBuYW1lX29yaWcgPSB0cy0+Z2V0X25hbWUoKTsKKworICAgIC8vIFRPRE8oZHJlaXNzKTogV2h5IGlzIHRoaXMgc3R1ZmYgbm90IGluIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnM/CisgICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisgICAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHMpOworICAgIHRzLT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCB0cywgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzLCB0cnVlKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZV9vcmlnKTsKKworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworCisgIHN0cmluZyBzZXJ2aWNlX2lmX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgc3R5bGUgKyAiSWYiOworICBpZiAoc3R5bGUgPT0gIkNvYkNsIikgeworICAgIC8vIEZvcndhcmQgZGVjbGFyZSB0aGUgY2xpZW50LgorICAgIHN0cmluZyBjbGllbnRfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGNsaWVudF9uYW1lICs9ICJUIjsKKyAgICAgIHNlcnZpY2VfaWZfbmFtZSArPSAiVCI7CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJjbGFzcyAiIDw8IGNsaWVudF9uYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSAiIDogdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBzdHlsZSArICJJZiI7CisgICAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICAgIGV4dGVuZHMgKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgfQorICB9CisKKyAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKCkge30iIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+aGFzX2RvYygpKQorICAgICAgZl9oZWFkZXJfIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9oZWFkZXJfLCAqZl9pdGVyKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAvLyBnZW5lcmF0ZSBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIHR5cGVkZWYgZm9yIGNsaWVudHMgdGhhdCBkbyBub3QKKyAgICAvLyBrbm93IGFib3V0IHRoZSBuZXcgdGVtcGxhdGUtc3R5bGUgY29kZQorICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiAiCisgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIklmOyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZmFjdG9yeS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZhY3RvcnkgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKKyAgc3RyaW5nIHNlcnZpY2VfaWZfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArICJJZiI7CisKKyAgLy8gRmlndXJlIG91dCB0aGUgbmFtZSBvZiB0aGUgdXBwZXItbW9zdCBwYXJlbnQgY2xhc3MuCisgIC8vIEdldHRpbmcgZXZlcnl0aGluZyB0byB3b3JrIG91dCBwcm9wZXJseSB3aXRoIGluaGVyaXRhbmNlIGlzIGFubm95aW5nLgorICAvLyBIZXJlJ3Mgd2hhdCB3ZSdyZSBkb2luZyBmb3Igbm93OgorICAvLworICAvLyAtIEFsbCBoYW5kbGVycyBpbXBsZW1lbnQgZ2V0SGFuZGxlcigpLCBidXQgc3ViY2xhc3NlcyB1c2UgY292YXJpYW50IHJldHVybgorICAvLyAgIHR5cGVzIHRvIHJldHVybiB0aGVpciBzcGVjaWZpYyBzZXJ2aWNlIGludGVyZmFjZSBjbGFzcyB0eXBlLiAgV2UgaGF2ZSB0bworICAvLyAgIHVzZSByYXcgcG9pbnRlcnMgYmVjYXVzZSBvZiB0aGlzOyBzaGFyZWRfcHRyPD4gY2FuJ3QgYmUgdXNlZCBmb3IKKyAgLy8gICBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzLgorICAvLworICAvLyAtIFNpbmNlIHdlJ3JlIG5vdCB1c2luZyBzaGFyZWRfcHRyPD4sIHdlIGFsc28gcHJvdmlkZSBhIHJlbGVhc2VIYW5kbGVyKCkKKyAgLy8gICBmdW5jdGlvbiB0aGF0IG11c3QgYmUgY2FsbGVkIHRvIHJlbGVhc2UgYSBwb2ludGVyIHRvIGEgaGFuZGxlciBvYnRhaW5lZAorICAvLyAgIHZpYSBnZXRIYW5kbGVyKCkuCisgIC8vCisgIC8vICAgcmVsZWFzZUhhbmRsZXIoKSBhbHdheXMgYWNjZXB0cyBhIHBvaW50ZXIgdG8gdGhlIHVwcGVyLW1vc3QgcGFyZW50IGNsYXNzCisgIC8vICAgdHlwZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBwYXJlbnQgdmVyc2lvbnMgb2YgcmVsZWFzZUhhbmRsZXIoKQorICAvLyAgIG1heSBhY2NlcHQgYW55IG9mIHRoZSBwYXJlbnQgdHlwZXMsIG5vdCBqdXN0IHRoZSBtb3N0IHNwZWNpZmljIHN1YmNsYXNzCisgIC8vICAgdHlwZS4gIEltcGxlbWVudGF0aW9ucyBjYW4gdXNlIGR5bmFtaWNfY2FzdCB0byBjYXN0IHRoZSBwb2ludGVyIHRvIHRoZQorICAvLyAgIHN1YmNsYXNzIHR5cGUgaWYgZGVzaXJlZC4KKyAgdF9zZXJ2aWNlKiBiYXNlX3NlcnZpY2UgPSB0c2VydmljZTsKKyAgd2hpbGUgKGJhc2Vfc2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgYmFzZV9zZXJ2aWNlID0gYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICB9CisgIHN0cmluZyBiYXNlX2lmX25hbWUgPSB0eXBlX25hbWUoYmFzZV9zZXJ2aWNlKSArIHN0eWxlICsgIklmIjsKKworICAvLyBHZW5lcmF0ZSB0aGUgYWJzdHJhY3QgZmFjdG9yeSBjbGFzcworICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gc2VydmljZV9pZl9uYW1lICsgIkZhY3RvcnkiOworICBzdHJpbmcgZXh0ZW5kczsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiA6IHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgc3R5bGUgKyAiSWZGYWN0b3J5IjsKKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBmYWN0b3J5X25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIgSGFuZGxlcjsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgInZpcnR1YWwgfiIgPDwgZmFjdG9yeV9uYW1lIDw8ICIoKSB7fSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKiBnZXRIYW5kbGVyKCIKKyAgICAgICAgICAgIDw8ICJjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAidmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCIgPDwgYmFzZV9pZl9uYW1lIDw8ICIqIC8qIGhhbmRsZXIgKi8pID0gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBzaW5nbGV0b24gZmFjdG9yeSBjbGFzcworICBzdHJpbmcgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA9IHNlcnZpY2VfaWZfbmFtZSArICJTaW5nbGV0b25GYWN0b3J5IjsKKyAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIiA6IHZpcnR1YWwgcHVibGljICIgPDwgZmFjdG9yeV9uYW1lIDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIihjb25zdCA6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfaWZfbmFtZQorICAgICAgICAgICAgPDwgIj4mIGlmYWNlKSA6IGlmYWNlXyhpZmFjZSkge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIKKyAgICAgICAgICAgIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIigpIHt9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIgorICAgICAgICAgICAgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIqIGdldEhhbmRsZXIoIgorICAgICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIgIHJldHVybiBpZmFjZV8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAidmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCIgPDwgYmFzZV9pZl9uYW1lIDw8ICIqIC8qIGhhbmRsZXIgKi8pIHt9IiA8PCBlbmRsOworCisgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX2lmX25hbWUKKyAgICAgICAgICAgIDw8ICI+IGlmYWNlXzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIG51bGwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX251bGwodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9ICIgLCB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIk51bGwiOworICB9CisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJOdWxsIDogdmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICA8PCBzdHlsZSA8PCAiSWYiIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJOdWxsKCkge30iIDw8IGVuZGw7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUsICIiLCBmYWxzZSkgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKKworICAgIGlmIChzdHlsZSA9PSAiIikgeworICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSB8fCBpc19jb21wbGV4X3R5cGUocmV0dXJudHlwZSkpIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gIkNvYlN2IikgeworICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgInJldHVybiBjb2IoX3JldHVybik7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXJnX3ByZWZpeCkgeworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgdF90eXBlKiByZXRfdHlwZSA9IGdldF90cnVlX3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgb3V0IDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXJldF90eXBlLT5pc192b2lkKCkpIHsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHJldF90eXBlKSkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdGFyZ2V0OworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgdGFyZ2V0IDw8ICIgPSAiIDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsICI7CisgICAgfQorICAgIG91dCA8PCBhcmdfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBvdXQgPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICJfYXN5bmNfc2VydmVyLnNrZWxldG9uLmNwcCI7CisKKyAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9za2VsZXRvbjsKKyAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKKyAgZl9za2VsZXRvbiA8PCAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgb25lIHdheSB0byBhZGFwdCBhIHN5bmNocm9ub3VzIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIi8vIGludGVyZmFjZSBpbnRvIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIgorICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiLy8gZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQgYW5kIHJld3JpdGUgYXMgYXN5bmNocm9ub3VzIGFueSBmdW5jdGlvbnMiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiLy8gdGhhdCB3b3VsZCBvdGhlcndpc2UgaW50cm9kdWNlIHVud2FudGVkIGxhdGVuY3kuIiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgbm90IGNvbXBpbGU6CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA7CisgIC8vIHVzaW5nIG5hbWVzcGFjZSA6OjsKKyAgaWYgKCghbnMuZW1wdHkoKSkgJiYgKG5zLmNvbXBhcmUoIiA6OiIpICE9IDApKSB7CisgICAgZl9za2VsZXRvbiA8PCAidXNpbmcgbmFtZXNwYWNlICIgPDwgc3RyaW5nKG5zLCAwLCBucy5zaXplKCkgLSAyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9za2VsZXRvbiA8PCAiY2xhc3MgIiA8PCBzdmNuYW1lIDw8ICJBc3luY0hhbmRsZXIgOiAiCisgICAgICAgICAgICAgPDwgInB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIkNvYlN2SWYgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBzeW5jSGFuZGxlcl8gPSBzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcj4obmV3ICIgPDwgc3ZjbmFtZQorICAgICAgICAgICAgIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJBc3luY0hhbmRsZXIoKTsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9za2VsZXRvbiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiQ29iU3YiLCAiIiwgdHJ1ZSkgPDwgIiB7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7CisKKyAgICBzdHJpbmcgdGFyZ2V0ID0gcmV0dXJudHlwZS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiI7CisgICAgaWYgKCFyZXR1cm50eXBlLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGw7CisgICAgfQorICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwoZl9za2VsZXRvbiwgKmZfaXRlciwgdGFyZ2V0LCAic3luY0hhbmRsZXJfIiwgIiIpOworICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoIiA8PCB0YXJnZXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NrZWxldG9uKTsKKyAgfQorICBmX3NrZWxldG9uIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZQorICAgICAgICAgICAgIDw8ICJIYW5kbGVyPiBzeW5jSGFuZGxlcl87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NrZWxldG9uIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIG11bHRpZmFjZSwgd2hpY2ggaXMgYSBzaW5nbGUgc2VydmVyIHRoYXQganVzdCB0YWtlcyBhIHNldAorICogb2Ygb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBhbmQgY2FsbHMgdGhlbSBhbGwsIHJldHVybmluZyB0aGUKKyAqIHZhbHVlIG9mIHRoZSBsYXN0IG9uZSB0byBiZSBjYWxsZWQuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgbXVsdGlzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19tdWx0aWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX211bHRpZmFjZSA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJNdWx0aWZhY2UiOworICB9CisKKyAgc3RyaW5nIGxpc3RfdHlwZSA9IHN0cmluZygic3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPCIpICsgc2VydmljZV9uYW1lXyArICJJZj4gPiI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UgOiAiCisgICAgICAgICAgICA8PCAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwgZXh0ZW5kc19tdWx0aWZhY2UgPDwgIiB7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlKCIgPDwgbGlzdF90eXBlCisgICAgICAgICAgICA8PCAiJiBpZmFjZXMpIDogaWZhY2VzXyhpZmFjZXMpIHsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjwiICsgc2VydmljZV9uYW1lXyArICJJZj4gPjo6aXRlcmF0b3IgaXRlcjsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZm9yIChpdGVyID0gaWZhY2VzLmJlZ2luKCk7IGl0ZXIgIT0gaWZhY2VzLmVuZCgpOyArK2l0ZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICAiIDw8IGV4dGVuZHMgPDwgIk11bHRpZmFjZTo6YWRkKCppdGVyKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKKyAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBsaXN0X3R5cGUgPDwgIiBpZmFjZXNfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICA8PCAiTXVsdGlmYWNlKCkge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgYWRkKDo6c3RkOjpzaGFyZWRfcHRyPCIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmPiBpZmFjZSkgeyIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICJNdWx0aWZhY2U6OmFkZChpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZmFjZXNfLnB1c2hfYmFjayhpZmFjZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworCisgICAgc3RyaW5nIGNhbGwgPSBzdHJpbmcoImlmYWNlc19baV0tPiIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgY2FsbCArPSAiX3JldHVybiI7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGwgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIGNhbGwgKz0gKCphX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBjYWxsICs9ICIpIjsKKworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNpemVfdCBzeiA9IGlmYWNlc18uc2l6ZSgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2l6ZV90IGkgPSAwOyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICg7IGkgPCAoc3ogLSAxKTsgKytpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworICBzdHJpbmcgaWZzdHlsZTsKKyAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgaWZzdHlsZSA9ICJDb2JDbCI7CisgIH0KKworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisgIHN0cmluZyB0ZW1wbGF0ZV9oZWFkZXIsIHRlbXBsYXRlX3N1ZmZpeCwgc2hvcnRfc3VmZml4LCBwcm90b2NvbF90eXBlLCBfdGhpczsKKyAgc3RyaW5nIGNvbnN0IHByb3RfZmFjdG9yeV90eXBlID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5IjsKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgdGVtcGxhdGVfaGVhZGVyID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOworICAgIHNob3J0X3N1ZmZpeCA9ICJUIjsKKyAgICB0ZW1wbGF0ZV9zdWZmaXggPSAiVDxQcm90b2NvbF8+IjsKKyAgICBwcm90b2NvbF90eXBlID0gIlByb3RvY29sXyI7CisgICAgX3RoaXMgPSAidGhpcy0+IjsKKyAgfSBlbHNlIHsKKyAgICBwcm90b2NvbF90eXBlID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiOworICB9CisgIHN0cmluZyBwcm90X3B0ciA9ICJzdGQ6OnNoYXJlZF9wdHI8ICIgKyBwcm90b2NvbF90eXBlICsgIj4iOworICBzdHJpbmcgY2xpZW50X3N1ZmZpeCA9ICJDbGllbnQiICsgdGVtcGxhdGVfc3VmZml4OworICBzdHJpbmcgaWZfc3VmZml4ID0gIklmIjsKKyAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgaWZfc3VmZml4ICs9IHRlbXBsYXRlX3N1ZmZpeDsKKyAgfQorCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyBzdHlsZSArIGNsaWVudF9zdWZmaXg7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgIGZfaGVhZGVyXyA8PCAiLy8gVGhlIFwnY29uY3VycmVudFwnIGNsaWVudCBpcyBhIHRocmVhZCBzYWZlIGNsaWVudCB0aGF0IGNvcnJlY3RseSBoYW5kbGVzXG4iCisgICAgICAgICAgICAgICAgICIvLyBvdXQgb2Ygb3JkZXIgcmVzcG9uc2VzLiAgSXQgaXMgc2xvd2VyIHRoYW4gdGhlIHJlZ3VsYXIgY2xpZW50LCBzbyBzaG91bGRcbiIKKyAgICAgICAgICAgICAgICAgIi8vIG9ubHkgYmUgdXNlZCB3aGVuIHlvdSBuZWVkIHRvIHNoYXJlIGEgY29ubmVjdGlvbiBhbW9uZyBtdWx0aXBsZSB0aHJlYWRzXG4iOworICB9CisgIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXIgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXgKKyAgICAgICAgICAgIDw8ICIgOiAiCisgICAgICAgICAgICA8PCAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgaWZfc3VmZml4IDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyCisgICAgICAgICAgICAgIDw8ICIgcHJvdCkgIjsKKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIocHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeCA8PCAiKHByb3QsIHByb3QpIHt9IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0cgorICAgICAgICAgICAgICA8PCAiIGlwcm90LCAiIDw8IHByb3RfcHRyIDw8ICIgb3Byb3QpICI7CisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8ICJ7IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihpcHJvdCxvcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiOiIgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXgKKyAgICAgICAgICAgICAgICA8PCAiKGlwcm90LCBvcHJvdCkge30iIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gY3JlYXRlIHRoZSBzZXRQcm90b2NvbCBtZXRob2RzCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8ICIgcHJpdmF0ZToiIDw8IGVuZGw7CisgICAgICAvLyAxOiBvbmUgcGFyYW1ldGVyCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIgPDwgIiBwcm90KSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIihwcm90LHByb3QpOyIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIC8vIDI6IHR3byBwYXJhbWV0ZXIKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0ciA8PCAiIGlwcm90LCAiCisgICAgICAgICAgICAgICAgPDwgcHJvdF9wdHIgPDwgIiBvcHJvdCkgeyIgPDwgZW5kbDsKKworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF89aXByb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHBvcHJvdF89b3Byb3Q7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfID0gaXByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gb3Byb3QuZ2V0KCk7IiA8PCBlbmRsOworCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGdldHRlcnMgZm9yIHRoZSBwcm90b2NvbHMuCisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSBub3QgY3VycmVudGx5IHRlbXBsYXRlZCBmb3Igc2ltcGxpY2l0eS4KKyAgICAvLyBUT0RPKHNpbXBraW5zKTogc2hvdWxkIHRoZXkgYmUgdGVtcGxhdGVkPworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRJbnB1dFByb3RvY29sKCkgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicGlwcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gZ2V0T3V0cHV0UHJvdG9jb2woKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwb3Byb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICB9IGVsc2UgLyogaWYgKHN0eWxlID09ICJDb2IiKSAqLyB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIgorICAgICAgICAgICAgICA8PCAic3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbCwgIgorICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3RvcnkqIHByb3RvY29sRmFjdG9yeSkgOiIgPDwgZW5kbDsKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgY2hhbm5lbF8oY2hhbm5lbCksIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgaXRyYW5zXyhuZXcgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKCkpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG90cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICAvLyBUUHJvdG9jb2xGYWN0b3J5IGNsYXNzZXMgcmV0dXJuIGdlbmVyaWMgVFByb3RvY29sIHBvaW50ZXJzLgorICAgICAgICAvLyBXZSBoYXZlIHRvIGR5bmFtaWMgY2FzdCB0byB0aGUgUHJvdG9jb2xfIHR5cGUgd2UgYXJlIGV4cGVjdGluZy4KKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF8oOjpzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgorICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgIHBvcHJvdF8oOjpzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgorICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wob3RyYW5zXykpKSB7IiA8PCBlbmRsOworICAgICAgICAvLyBUaHJvdyBhIFRFeGNlcHRpb24gaWYgZWl0aGVyIGR5bmFtaWMgY2FzdCBmYWlsZWQuCisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIXBpcHJvdF8gfHwgIXBvcHJvdF8pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgICAgdGhyb3cgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihcIiIKKyAgICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2xGYWN0b3J5IHJldHVybmVkIHVuZXhwZWN0ZWQgcHJvdG9jb2wgdHlwZSBpbiAiIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiIGNvbnN0cnVjdG9yXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfKHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90XyA9IHBpcHJvdF8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgb3Byb3RfID0gcG9wcm90Xy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMgPDwgc3R5bGUgPDwgY2xpZW50X3N1ZmZpeAorICAgICAgICAgICAgICAgIDw8ICIoY2hhbm5lbCwgcHJvdG9jb2xGYWN0b3J5KSB7fSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gZ2V0Q2hhbm5lbCgpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgImNoYW5uZWxfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAoIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB2b2lkIGNvbXBsZXRlZF9fKGJvb2wgLyogc3VjY2VzcyAqLykge30iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUpIDw8ICI7IiA8PCBlbmRsOworICAgIC8vIFRPRE8oZHJlaXNzKTogVXNlIHByaXZhdGUgaW5oZXJpdGFuY2UgdG8gYXZvaWQgZ2VuZXJhdGluZyB0aGlzZSBpbiBjb2Itc3R5bGUuCisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgLy8gY29uY3VycmVudCBjbGllbnRzIG5lZWQgdG8gbW92ZSB0aGUgc2VxaWQgZnJvbSB0aGUgc2VuZCBmdW5jdGlvbiB0byB0aGUKKyAgICAgIC8vIHJlY3YgZnVuY3Rpb24uICBPbmV3YXkgbWV0aG9kcyBkb24ndCBoYXZlIGEgcmVjdiBmdW5jdGlvbiwgc28gd2UgZG9uJ3QgbmVlZCB0bworICAgICAgLy8gbW92ZSB0aGUgc2VxaWQgZm9yIHRoZW0uICBBdHRlbXB0aW5nIHRvIGRvIHNvIHdvdWxkIHJlc3VsdCBpbiBhIHNlcWlkIGxlYWsuCisgICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2kzMiwgLypyZXR1cm5pbmcgc2VxaWQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgdF9maWVsZCBzZXFJZEFyZyhnX3R5cGVfaTMyLCAic2VxaWQiKTsKKyAgICAgICAgdF9zdHJ1Y3Qgc2VxSWRBcmdTdHJ1Y3QocHJvZ3JhbV8pOworICAgICAgICBzZXFJZEFyZ1N0cnVjdC5hcHBlbmQoJnNlcUlkQXJnKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZEFyZ1N0cnVjdCk7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbF87IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaXRyYW5zXzsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvdHJhbnNfOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBmX2hlYWRlcl8gPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcGlwcm90XzsiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcG9wcm90XzsiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RvY29sX3R5cGUgPDwgIiogaXByb3RfOyIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBvcHJvdF87IiA8PCBlbmRsOworCisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgZl9oZWFkZXJfIDw8CisgICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyBzeW5jXzsiPDxlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIC8vIE91dHB1dCBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHR5cGVkZWYgdXNpbmcKKyAgICAvLyBUUHJvdG9jb2wgYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlCisgICAgICAgICAgICAgIDw8ICJDbGllbnRUPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUKKyAgICAgICAgICAgICAgPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBzY29wZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArIGNsaWVudF9zdWZmaXggKyAiOjoiOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIHNlcUlkQ2FwdHVyZTsKKyAgICBzdHJpbmcgc2VxSWRVc2U7CisgICAgc3RyaW5nIHNlcUlkQ29tbWFVc2U7CisgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc2VxSWRDYXB0dXJlID0gImludDMyX3Qgc2VxaWQgPSAiOworICAgICAgc2VxSWRVc2UgPSAic2VxaWQiOworICAgICAgc2VxSWRDb21tYVVzZSA9ICIsIHNlcWlkIjsKKyAgICB9CisKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUsIHNjb3BlKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgc2VxSWRDYXB0dXJlIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmIChzdHlsZSAhPSAiQ29iIikgeworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgICAgb3V0IDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKF9yZXR1cm4iIDw8IHNlcUlkQ29tbWFVc2UgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgInJldHVybiByZWN2XyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgc2VxSWRVc2UgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBzZXFJZFVzZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRBbmRSZWN2TWVzc2FnZSgiCisgICAgICAgICAgICA8PCAiOjpzdGQ6OmJpbmQoY29iLCB0aGlzKSwgIiA8PCBfdGhpcyA8PCAib3RyYW5zXy5nZXQoKSwgIiA8PCBfdGhpcyA8PCAiaXRyYW5zXy5nZXQoKSk7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRNZXNzYWdlKCIKKyAgICAgICAgICAgIDw8ICI6OnN0ZDo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIGlmIChzdHlsZSAhPSAiQ29iIikgLy8gVE9ETyhkcmVpc3MpOiBMaWJpZnkgdGhlIGNsaWVudCBhbmQgZG9uJ3QgZ2VuZXJhdGUgdGhpcyBmb3IgY29iLXN0eWxlCisgICAgaWYgKHRydWUpIHsKKyAgICAgIHRfdHlwZSogc2VuZF9mdW5jX3JldHVybl90eXBlID0gZ190eXBlX3ZvaWQ7CisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIHNlbmRfZnVuY19yZXR1cm5fdHlwZSA9IGdfdHlwZV9pMzI7CisgICAgICB9CisgICAgICAvLyBGdW5jdGlvbiBmb3Igc2VuZGluZworICAgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKHNlbmRfZnVuY19yZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgorICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgLy8gRnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXN1bHRzCisgICAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiOworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCI7CisKKyAgICAgIHN0cmluZyBjc2VxaWRWYWwgPSAiMCI7CisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGNzZXFpZFZhbCA9ICJ0aGlzLT5zeW5jXy5nZW5lcmF0ZVNlcUlkKCkiOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICAgIG91dCA8PAorICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCBjc2VxaWQgPSAiIDw8IGNzZXFpZFZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50U2VuZFNlbnRyeSBzZW50cnkoJnRoaXMtPnN5bmNfKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm90cmFuc18tPnJlc2V0QnVmZmVyKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8CisgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PAorICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKKyAgICAgICAgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6IiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUX09ORVdBWSIgOiAiVF9DQUxMIikgPDwKKyAgICAgICAgIiwgY3NlcWlkKTsiIDw8IGVuZGwgPDwgZW5kbCA8PAorICAgICAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3M7IiA8PCBlbmRsOworCisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoIiA8PCBfdGhpcyA8PCAib3Byb3RfKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBjc2VxaWQ7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKworICAgICAgLy8gR2VuZXJhdGUgcmVjdiBmdW5jdGlvbiBvbmx5IGlmIG5vdCBhbiBvbmV3YXkgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICAgIHRfZmllbGQgc2VxSWRBcmcoZ190eXBlX2kzMiwgInNlcWlkIik7CisgICAgICAgIHRfc3RydWN0IHNlcUlkQXJnU3RydWN0KHByb2dyYW1fKTsKKyAgICAgICAgc2VxSWRBcmdTdHJ1Y3QuYXBwZW5kKCZzZXFJZEFyZyk7CisKKyAgICAgICAgdF9zdHJ1Y3QqIHJlY3ZfZnVuY3Rpb25fYXJncyA9ICZub2FyZ3M7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICByZWN2X2Z1bmN0aW9uX2FyZ3MgPSAmc2VxSWRBcmdTdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdl9mdW5jdGlvbl9hcmdzKTsKKyAgICAgICAgLy8gT3BlbiB0aGUgcmVjdiBmdW5jdGlvbgorICAgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIiwgc2NvcGUpIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCByc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGw7CisgICAgICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIi8vIHRoZSByZWFkIG11dGV4IGdldHMgZHJvcHBlZCBhbmQgcmVhY3F1aXJlZCBhcyBwYXJ0IG9mIHdhaXRGb3JXb3JrKCkiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIvLyBUaGUgZGVzdHJ1Y3RvciBvZiB0aGlzIHNlbnRyeSB3YWtlcyB1cCBvdGhlciBjbGllbnRzIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50UmVjdlNlbnRyeSBzZW50cnkoJnRoaXMtPnN5bmNfLCBzZXFpZCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBjb21wbGV0ZWQgPSBmYWxzZTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAid2hpbGUodHJ1ZSkgeyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYoIXRoaXMtPnN5bmNfLmdldFBlbmRpbmcoZm5hbWUsIG10eXBlLCByc2VxaWQpKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCByc2VxaWQpOyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmKHNlcWlkID09IHJzZXFpZCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4OyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSAhPSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSkgeyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoZm5hbWUuY29tcGFyZShcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikgIT0gMCkgeyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18oZmFsc2UpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIGluIGEgYmFkIHN0YXRlLCBkb24ndCBjb21taXQiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb247IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgICAgICAgJiYgIWlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgdF9maWVsZCByZXR1cm5maWVsZCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICJfcmV0dXJuIik7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkKSA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gJl9yZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBfdGhpcworICAgICAgICAgICAgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKKyAgICAgICAgICAgIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgLy8gQ2FyZWZ1bCwgb25seSBsb29rIGZvciBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbDsKKyAgICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBfcmV0dXJuIHBvaW50ZXIgaGFzIG5vdyBiZWVuIGZpbGxlZCIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIGFyZSBhIHZvaWQgZnVuY3Rpb24KKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGluIGEgYmFkIHN0YXRlLCBkb24ndCBjb21taXQiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gc2VxaWQgIT0gcnNlcWlkIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5zeW5jXy51cGRhdGVQZW5kaW5nKGZuYW1lLCBtdHlwZSwgcnNlcWlkKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIHRoaXMgd2lsbCB0ZW1wb3JhcmlseSB1bmxvY2sgdGhlIHJlYWRNdXRleCwgYW5kIGxldCBvdGhlciBjbGllbnRzIGdldCB3b3JrIGRvbmUiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPnN5bmNfLndhaXRGb3JXb3JrKHNlcWlkKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IC8vIGVuZCB3aGlsZSh0cnVlKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoLi4uKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlmICghY29tcGxldGVkKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgY29tcGxldGVkX18oZmFsc2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitjbGFzcyBQcm9jZXNzb3JHZW5lcmF0b3IgeworcHVibGljOgorICBQcm9jZXNzb3JHZW5lcmF0b3IodF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3IsIHRfc2VydmljZSogc2VydmljZSwgY29uc3Qgc3RyaW5nJiBzdHlsZSk7CisKKyAgdm9pZCBydW4oKSB7CisgICAgZ2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoQ2FsbCgpIGZ1bmN0aW9uCisgICAgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChmYWxzZSk7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKHRydWUpOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGFsbCBvZiB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOworCisgICAgZ2VuZXJhdGVfZmFjdG9yeSgpOworICB9CisKKyAgdm9pZCBnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCk7CisgIHZvaWQgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChib29sIHRlbXBsYXRlX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOworICB2b2lkIGdlbmVyYXRlX2ZhY3RvcnkoKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgYXJnID0gZmFsc2UpIHsKKyAgICByZXR1cm4gZ2VuZXJhdG9yXy0+dHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBhcmcpOworICB9CisKKyAgc3RkOjpzdHJpbmcgaW5kZW50KCkgeyByZXR1cm4gZ2VuZXJhdG9yXy0+aW5kZW50KCk7IH0KKyAgc3RkOjpvc3RyZWFtJiBpbmRlbnQoc3RkOjpvc3RyZWFtJiBvcykgeyByZXR1cm4gZ2VuZXJhdG9yXy0+aW5kZW50KG9zKTsgfQorCisgIHZvaWQgaW5kZW50X3VwKCkgeyBnZW5lcmF0b3JfLT5pbmRlbnRfdXAoKTsgfQorICB2b2lkIGluZGVudF9kb3duKCkgeyBnZW5lcmF0b3JfLT5pbmRlbnRfZG93bigpOyB9CisKKyAgdF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3JfOworICB0X3NlcnZpY2UqIHNlcnZpY2VfOworICBzdGQ6Om9zdHJlYW0mIGZfaGVhZGVyXzsKKyAgc3RkOjpvc3RyZWFtJiBmX291dF87CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfOworICBzdHJpbmcgc3R5bGVfOworICBzdHJpbmcgcHN0eWxlXzsKKyAgc3RyaW5nIGNsYXNzX25hbWVfOworICBzdHJpbmcgaWZfbmFtZV87CisgIHN0cmluZyBmYWN0b3J5X2NsYXNzX25hbWVfOworICBzdHJpbmcgZmluaXNoX2NvYl87CisgIHN0cmluZyBmaW5pc2hfY29iX2RlY2xfOworICBzdHJpbmcgcmV0X3R5cGVfOworICBzdHJpbmcgY2FsbF9jb250ZXh0XzsKKyAgc3RyaW5nIGNvYl9hcmdfOworICBzdHJpbmcgY2FsbF9jb250ZXh0X2FyZ187CisgIHN0cmluZyBjYWxsX2NvbnRleHRfZGVjbF87CisgIHN0cmluZyB0ZW1wbGF0ZV9oZWFkZXJfOworICBzdHJpbmcgdGVtcGxhdGVfc3VmZml4XzsKKyAgc3RyaW5nIHR5cGVuYW1lX3N0cl87CisgIHN0cmluZyBjbGFzc19zdWZmaXhfOworICBzdHJpbmcgZXh0ZW5kc187Cit9OworCitQcm9jZXNzb3JHZW5lcmF0b3I6OlByb2Nlc3NvckdlbmVyYXRvcih0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3R5bGUpCisgIDogZ2VuZXJhdG9yXyhnZW5lcmF0b3IpLAorICAgIHNlcnZpY2VfKHNlcnZpY2UpLAorICAgIGZfaGVhZGVyXyhnZW5lcmF0b3ItPmZfaGVhZGVyXyksCisgICAgZl9vdXRfKGdlbmVyYXRvci0+Z2VuX3RlbXBsYXRlc18gPyBnZW5lcmF0b3ItPmZfc2VydmljZV90Y2NfIDogZ2VuZXJhdG9yLT5mX3NlcnZpY2VfKSwKKyAgICBzZXJ2aWNlX25hbWVfKGdlbmVyYXRvci0+c2VydmljZV9uYW1lXyksCisgICAgc3R5bGVfKHN0eWxlKSB7CisgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICBwc3R5bGVfID0gIkFzeW5jIjsKKyAgICBjbGFzc19uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyBwc3R5bGVfICsgIlByb2Nlc3NvciI7CisgICAgaWZfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgIkNvYlN2SWYiOworCisgICAgZmluaXNoX2NvYl8gPSAiOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgIjsKKyAgICBmaW5pc2hfY29iX2RlY2xfID0gIjo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiwgIjsKKyAgICBjb2JfYXJnXyA9ICJjb2IsICI7CisgICAgcmV0X3R5cGVfID0gInZvaWQgIjsKKyAgfSBlbHNlIHsKKyAgICBjbGFzc19uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKKyAgICBpZl9uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiSWYiOworCisgICAgcmV0X3R5cGVfID0gImJvb2wgIjsKKyAgICAvLyBUT0RPKGVkaGFsbCkgY2FsbENvbnRleHQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgYWRkZWQgdG8gVEFzeW5jUHJvY2Vzc29yCisgICAgY2FsbF9jb250ZXh0XyA9ICIsIHZvaWQqIGNhbGxDb250ZXh0IjsKKyAgICBjYWxsX2NvbnRleHRfYXJnXyA9ICIsIGNhbGxDb250ZXh0IjsKKyAgICBjYWxsX2NvbnRleHRfZGVjbF8gPSAiLCB2b2lkKiI7CisgIH0KKworICBmYWN0b3J5X2NsYXNzX25hbWVfID0gY2xhc3NfbmFtZV8gKyAiRmFjdG9yeSI7CisKKyAgaWYgKGdlbmVyYXRvci0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICB0ZW1wbGF0ZV9oZWFkZXJfID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOworICAgIHRlbXBsYXRlX3N1ZmZpeF8gPSAiPFByb3RvY29sXz4iOworICAgIHR5cGVuYW1lX3N0cl8gPSAidHlwZW5hbWUgIjsKKyAgICBjbGFzc19uYW1lXyArPSAiVCI7CisgICAgZmFjdG9yeV9jbGFzc19uYW1lXyArPSAiVCI7CisgIH0KKworICBpZiAoc2VydmljZV8tPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfID0gdHlwZV9uYW1lKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpKSArIHBzdHlsZV8gKyAiUHJvY2Vzc29yIjsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAorICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KKyAgICAgIGV4dGVuZHNfICs9ICJUPFByb3RvY29sXz4iOworICAgIH0KKyAgfQorfQorCit2b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSBzZXJ2aWNlXy0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIHBhcmVudF9jbGFzczsKKyAgaWYgKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBwYXJlbnRfY2xhc3MgPSBleHRlbmRzXzsKKyAgfSBlbHNlIHsKKyAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgICBwYXJlbnRfY2xhc3MgPSAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIjsKKyAgICB9IGVsc2UgeworICAgICAgcGFyZW50X2NsYXNzID0gIjo6YXBhY2hlOjp0aHJpZnQ6OlREaXNwYXRjaFByb2Nlc3NvciI7CisgICAgfQorCisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBwYXJlbnRfY2xhc3MgKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWVfIDw8ICIgOiBwdWJsaWMgIiA8PCBwYXJlbnRfY2xhc3MgPDwgIiB7IgorICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBQcm90ZWN0ZWQgZGF0YSBtZW1iZXJzCisgIGZfaGVhZGVyXyA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8gPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgcmV0X3R5cGVfIDw8ICJkaXNwYXRjaENhbGwoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCAiCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsICIKKyAgICAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOworICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZV8gPDwgImRpc3BhdGNoQ2FsbFRlbXBsYXRlZCgiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90LCAiCisgICAgICAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gUHJvY2VzcyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAgZl9oZWFkZXJfIDw8ICIgcHJpdmF0ZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIERlY2xhcmUgcHJvY2Vzc01hcF8KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICB2b2lkICgiIDw8IGNsYXNzX25hbWVfIDw8ICI6OioiCisgICAgICAgICAgICA8PCAiUHJvY2Vzc0Z1bmN0aW9uKSgiIDw8IGZpbmlzaF9jb2JfZGVjbF8gPDwgImludDMyX3QsICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwgIgorICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIiA8PCBjYWxsX2NvbnRleHRfZGVjbF8gPDwgIik7IiA8PCBlbmRsOworICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgdm9pZCAoIiA8PCBjbGFzc19uYW1lXyA8PCAiOjoqIgorICAgICAgICAgICAgICA8PCAiU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24pKCIgPDwgZmluaXNoX2NvYl9kZWNsXyA8PCAiaW50MzJfdCwgIgorICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiwgUHJvdG9jb2xfKiIgPDwgY2FsbF9jb250ZXh0X2RlY2xfIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAic3RydWN0IFByb2Nlc3NGdW5jdGlvbnMgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBQcm9jZXNzRnVuY3Rpb24gZ2VuZXJpYzsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24gc3BlY2lhbGl6ZWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoUHJvY2Vzc0Z1bmN0aW9uIGcsICIKKyAgICAgICAgICAgICAgPDwgIlNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uIHMpIDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBnZW5lcmljKGcpLCIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIHNwZWNpYWxpemVkKHMpIHt9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoKSA6IGdlbmVyaWMoTlVMTCksIHNwZWNpYWxpemVkKE5VTEwpICIKKyAgICAgICAgICAgICAgPDwgInt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAidHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHJvY2Vzc0Z1bmN0aW9ucz4gIgorICAgICAgICAgICAgICA8PCAiUHJvY2Vzc01hcDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+ICIKKyAgICAgICAgICAgICAgPDwgIlByb2Nlc3NNYXA7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc01hcCBwcm9jZXNzTWFwXzsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnQzMl90IHNlcWlkLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGZpbmlzaF9jb2JfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW50MzJfdCBzZXFpZCwgUHJvdG9jb2xfKiBpcHJvdCwgUHJvdG9jb2xfKiBvcHJvdCIgPDwgY2FsbF9jb250ZXh0XworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgICAvLyBYWFggRmFjdG9yIHRoaXMgb3V0LCBldmVuIGlmIGl0IGlzIGEgcGFpbi4KKyAgICAgIHN0cmluZyByZXRfYXJnID0gKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiwgY29uc3QgIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiIpOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgIgorICAgICAgICAgICAgICAgIDw8ICJ2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOworICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCByZXR1cm5fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBYWFggRG9uJ3QgZGVjbGFyZSB0aHJvdyBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZl9oZWFkZXJfIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lXyA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8KKyAgICAgICAgICAgIDw8ICI+IGlmYWNlKSA6IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHNfLmVtcHR5KCkpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzXyA8PCAiKGlmYWNlKSwiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlmYWNlXyhpZmFjZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiXSA9ICI7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBmX2hlYWRlcl8gPDwgIlByb2Nlc3NGdW5jdGlvbnMoIiA8PCBlbmRsOworICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfb25seV8pIHsKKyAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgTlVMTCwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICAmIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgJiIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6cHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiJiIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6cHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9oZWFkZXJfIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgY2xhc3NfbmFtZV8gPDwgIigpIHt9IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgIC8vIEdlbmVyYXRlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgdHlwZWRlZiwgZm9yIGNhbGxlcnMgd2hvIGRvbid0IGtub3cKKyAgICAvLyBhYm91dCB0aGUgbmV3IHRlbXBsYXRlLXN0eWxlIGNvZGUuCisgICAgLy8KKyAgICAvLyBXZSBjYW4ndCB1c2UgVFByb3RvY29sIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHNpbmNlIFByb2Nlc3NvclQKKyAgICAvLyBwcm92aWRlcyBvdmVybG9hZGVkIHZlcnNpb25zIG9mIG1vc3QgbWV0aG9kcywgb25lIG9mIHdoaWNoIGFjY2VwdHMKKyAgICAvLyBUUHJvdG9jb2wgcG9pbnRlcnMsIGFuZCBvbmUgd2hpY2ggYWNjZXB0cyBQcm90b2NvbF8gcG9pbnRlcnMuICBUaGlzCisgICAgLy8gcmVzdWx0cyBpbiBhIGNvbXBpbGUgZXJyb3IgaWYgaW5zdGFudGlhdGVkIHdpdGggUHJvdG9jb2xfID09IFRQcm90b2NvbC4KKyAgICAvLyBUaGVyZWZvcmUsIHdlIGRlZmluZSBURHVtbXlQcm90b2NvbCBzb2xlbHkgc28gd2UgY2FuIHVzZSBpdCBhcyB0aGUKKyAgICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaGVyZS4KKyAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBjbGFzc19uYW1lXyA8PCAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VER1bW15UHJvdG9jb2wgPiAiCisgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlXyA8PCAiUHJvY2Vzc29yOyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGJvb2wgdGVtcGxhdGVfcHJvdG9jb2wpIHsKKyAgc3RyaW5nIHByb3RvY29sID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiOworICBzdHJpbmcgZnVuY3Rpb25fc3VmZml4OworICBpZiAodGVtcGxhdGVfcHJvdG9jb2wpIHsKKyAgICBwcm90b2NvbCA9ICJQcm90b2NvbF8iOworICAgIC8vIFdlIGNhbGwgdGhlIGdlbmVyaWMgdmVyc2lvbiBkaXNwYXRjaENhbGwoKSwgYW5kIHRoZSBzcGVjaWFsaXplZAorICAgIC8vIHZlcnNpb24gZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKCkuICBXZSBjYW4ndCBjYWxsIHRoZW0gYm90aAorICAgIC8vIGRpc3BhdGNoQ2FsbCgpLCBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIGlzc3VlIGEgd2FybmluZyBpZgorICAgIC8vIGEgc2VydmljZSB0aGF0IGRvZXNuJ3QgdXNlIHRlbXBsYXRlcyBpbmhlcml0cyBmcm9tIGEgc2VydmljZSB0aGF0IGRvZXMKKyAgICAvLyB1c2UgdGVtcGxhdGVzOiB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHRoYXQgdGhlIHN1YmNsYXNzIG9ubHkgaW1wbGVtZW50cworICAgIC8vIHRoZSBnZW5lcmljIHZlcnNpb24gb2YgZGlzcGF0Y2hDYWxsKCksIGFuZCBoaWRlcyB0aGUgdGVtcGxhdGVkIHZlcnNpb24uCisgICAgLy8gVXNpbmcgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgdHdvIGZ1bmN0aW9ucyBwcmV2ZW50cyB0aGlzLgorICAgIGZ1bmN0aW9uX3N1ZmZpeCA9ICJUZW1wbGF0ZWQiOworICB9CisKKyAgZl9vdXRfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgcmV0X3R5cGVfIDw8IGNsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwgIjo6ZGlzcGF0Y2hDYWxsIgorICAgICAgICAgPDwgZnVuY3Rpb25fc3VmZml4IDw8ICIoIiA8PCBmaW5pc2hfY29iXyA8PCBwcm90b2NvbCA8PCAiKiBpcHJvdCwgIiA8PCBwcm90b2NvbAorICAgICAgICAgPDwgIiogb3Byb3QsICIKKyAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gSE9UOiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBtYXAKKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8IHR5cGVuYW1lX3N0cl8gPDwgIlByb2Nlc3NNYXA6Oml0ZXJhdG9yIHBmbjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICJwZm4gPSBwcm9jZXNzTWFwXy5maW5kKGZuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICJpZiAocGZuID09IHByb2Nlc3NNYXBfLmVuZCgpKSB7IiA8PCBlbmRsOworICBpZiAoZXh0ZW5kc18uZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICJ4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogIgorICAgICAgICAgICAgICAiJ1wiK2ZuYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKGZuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiCisgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiICByZXR1cm4gY29iKHRydWUpOyIgOiAiICByZXR1cm4gdHJ1ZTsiKSA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBleHRlbmRzXyA8PCAiOjpkaXNwYXRjaENhbGwoIgorICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImNvYiwgIiA6ICIiKSA8PCAiaXByb3QsIG9wcm90LCBmbmFtZSwgc2VxaWQiIDw8IGNhbGxfY29udGV4dF9hcmdfCisgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorICBmX291dF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGlmICh0ZW1wbGF0ZV9wcm90b2NvbCkgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuc3BlY2lhbGl6ZWQpKSI7CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfb25seV8pIHsKKyAgICAgIC8vIFRPRE86IFRoaXMgaXMgYSBudWxsIHBvaW50ZXIsIHNvIG5vdGhpbmcgZ29vZCB3aWxsIGNvbWUgZnJvbSBjYWxsaW5nCisgICAgICAvLyBpdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpbnN0ZWFkLgorICAgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5nZW5lcmljKSkiOworICAgIH0gZWxzZSBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuZ2VuZXJpYykpIjsKKyAgICB9IGVsc2UgeworICAgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZCkpIjsKKyAgICB9CisgIH0KKyAgZl9vdXRfIDw8ICIoIiA8PCBjb2JfYXJnXyA8PCAic2VxaWQsIGlwcm90LCBvcHJvdCIgPDwgY2FsbF9jb250ZXh0X2FyZ18gPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFRPRE8oZHJlaXNzKTogcmV0dXJuIHBmbiByZXQ/CisgIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX291dF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHNlcnZpY2VfLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgZmFsc2UpOworICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCBmYWxzZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9mYWN0b3J5KCkgeworICBzdHJpbmcgaWZfZmFjdG9yeV9uYW1lID0gaWZfbmFtZV8gKyAiRmFjdG9yeSI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZhY3RvcnkgY2xhc3MgZGVmaW5pdGlvbgorICBmX2hlYWRlcl8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8ICIgOiBwdWJsaWMgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yRmFjdG9yeSIgOiAiVFByb2Nlc3NvckZhY3RvcnkiKSA8PCAiIHsiCisgICAgICAgICAgICA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgIihjb25zdCA6OnN0ZDo6c2hhcmVkX3B0cjwgIiA8PCBpZl9mYWN0b3J5X25hbWUKKyAgICAgICAgICAgIDw8ICIgPiYgaGFuZGxlckZhY3RvcnkpIDoiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICIgICAgaGFuZGxlckZhY3RvcnlfKGhhbmRsZXJGYWN0b3J5KSB7fSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCisgICAgICAgICAgICA8PCAiZ2V0UHJvY2Vzc29yKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pOyIgPDwgZW5kbDsKKworICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCAiCisgICAgICAgICAgICA8PCBpZl9mYWN0b3J5X25hbWUgPDwgIiA+IGhhbmRsZXJGYWN0b3J5XzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIHRlbXBsYXRlcywgb3V0cHV0IGEgdHlwZWRlZiBmb3IgdGhlIHBsYWluCisgIC8vIGZhY3RvcnkgbmFtZS4KKyAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgZmFjdG9yeV9jbGFzc19uYW1lXworICAgICAgICAgICAgICA8PCAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VER1bW15UHJvdG9jb2wgPiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlXworICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yRmFjdG9yeTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBnZXRQcm9jZXNzb3IoKSBtZXRob2QKKyAgZl9vdXRfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgorICAgICAgICAgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICI6OmdldFByb2Nlc3NvcigiCisgICAgICAgICA8PCAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpSZWxlYXNlSGFuZGxlcjwgIiA8PCBpZl9mYWN0b3J5X25hbWUKKyAgICAgICAgIDw8ICIgPiBjbGVhbnVwKGhhbmRsZXJGYWN0b3J5Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgIgorICAgICAgICAgPDwgaWZfbmFtZV8gPDwgIiA+IGhhbmRsZXIoIgorICAgICAgICAgPDwgImhhbmRsZXJGYWN0b3J5Xy0+Z2V0SGFuZGxlcihjb25uSW5mbyksIGNsZWFudXApOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgorICAgICAgICAgPDwgInByb2Nlc3NvcihuZXcgIiA8PCBjbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICIoaGFuZGxlcikpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgPDwgInJldHVybiBwcm9jZXNzb3I7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvY2Vzc29yIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvY2Vzc29yIGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworICBQcm9jZXNzb3JHZW5lcmF0b3IgZ2VuZXJhdG9yKHRoaXMsIHRzZXJ2aWNlLCBzdHlsZSk7CisgIGdlbmVyYXRvci5ydW4oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgJnJlc3VsdCwgZmFsc2UpOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQpOworICBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsICZyZXN1bHQpOworCisgIHJlc3VsdC5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCIpOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZ2VuX2NvYl9zdHlsZV8pOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQsIHRydWUpOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGVjaWFsaXplZCkgeworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgc3RyaW5nIHNlcnZpY2VfZnVuY19uYW1lID0gIlwiIiArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi4iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIlwiIjsKKworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIHByb3RfdHlwZSA9IChzcGVjaWFsaXplZCA/ICJQcm90b2NvbF8iIDogIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiKTsKKyAgc3RyaW5nIGNsYXNzX3N1ZmZpeDsKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgY2xhc3Nfc3VmZml4ID0gIlQ8UHJvdG9jb2xfPiI7CisgIH0KKworICAvLyBJIHRyaWVkIHRvIGRvIHRoaXMgYXMgb25lIGZ1bmN0aW9uLiAgSSByZWFsbHkgZGlkLiAgQnV0IGl0IHdhcyB0b28gaGFyZC4KKyAgaWYgKHN0eWxlICE9ICJDb2IiKSB7CisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICB9CisgICAgY29uc3QgYm9vbCB1bm5hbWVkX29wcm90X3NlcWlkID0gdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCk7CisgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OiIKKyAgICAgICAgPDwgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgIDw8ICJpbnQzMl90IiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIHNlcWlkLCAiKSA8PCBwcm90X3R5cGUgPDwgIiogaXByb3QsICIKKyAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIiA8PCAodW5uYW1lZF9vcHJvdF9zZXFpZCA/ICIsICIgOiAiIG9wcm90LCAiKSA8PCAidm9pZCogY2FsbENvbnRleHQpIgorICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF1bm5hbWVkX29wcm90X3NlcWlkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBzZXFpZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIih2b2lkKSBvcHJvdDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkKiBjdHggPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgY2FsbENvbnRleHQpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCisgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gRGVjbGFyZSByZXN1bHQKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBUcnkgYmxvY2sgZm9yIGZ1bmN0aW9ucyB3aXRoIGV4Y2VwdGlvbnMKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHJlc3VsdC5zdWNjZXNzIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB9CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIn0iOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoZS53aGF0KCkpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+YXN5bmNDb21wbGV0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgLy8gQ29iIHN0eWxlLgorICBlbHNlIHsKKyAgICAvLyBQcm9jZXNzb3IgZW50cnkgcG9pbnQuCisgICAgLy8gVE9ETyhlZGhhbGwpIHVwZGF0ZSBmb3IgY2FsbENvbnRleHQgd2hlbiBURXZlbnRTZXJ2ZXIgaXMgcmVhZHkKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnByb2Nlc3NfIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBpcHJvdCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAvLyBUT0RPKHNpbXBraW5zKTogd2UgY291bGQgdHJ5IHRvIGNvbnNvbGRhdGUgdGhpcworICAgIC8vIHdpdGggdGhlIG5vbi1jb2IgY29kZSBhYm92ZQorICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKKyAgICAgIC8vIElmIHRoZXNlIGFyZSBpbnN0YW5jZXMgb2YgUHJvdG9jb2xfLCBpbnN0ZWFkIG9mIGFueSBvbGQgVFByb3RvY29sLAorICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCBwcm9jZXNzIGZ1bmN0aW9uIGluc3RlYWQuCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX2lwcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJpZiAoX2lwcm90ICYmIF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc18iCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX2lwcm90LCBfb3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgaXByb3QsIF9pcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX2FyZ3MgYXJnczsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInZvaWQqIGN0eCA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ1aW50MzJfdCBieXRlcyA9IGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyBUT0RPKGRyZWlzcyk6IEhhbmRsZSBURXhjZXB0aW9ucz8gIEV4cG9zZSB0byBzZXJ2ZXI/CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIGlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBjb2IoZmFsc2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5hc3luY0NvbXBsZXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gVE9ETyhkcmVpc3MpOiBGaWd1cmUgb3V0IGEgc3RyYXRlZ3kgZm9yIGV4Y2VwdGlvbnMgaW4gYXN5bmMgaGFuZGxlcnMuCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmcmVlci51bnJlZ2lzdGVyKCk7IiA8PCBlbmRsOworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAvLyBObyByZXR1cm4uICBKdXN0IGhhbmQgb2ZmIG91ciBjb2IuCisgICAgICAvLyBUT0RPKGRyZWlzcyk6IENhbGwgdGhlIGNvYiBpbW1lZGlhdGVseT8KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICA8PCAiOjpzdGQ6OmJpbmQoY29iLCB0cnVlKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmluZyByZXRfYXJnLCByZXRfcGxhY2Vob2xkZXI7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIHJldF9hcmcgPSAiLCBjb25zdCAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIjsKKyAgICAgICAgcmV0X3BsYWNlaG9sZGVyID0gIiwgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzEiOworICAgICAgfQorCisgICAgICAvLyBXaGVuIGdlbl90ZW1wbGF0ZXNfIGlzIHRydWUsIHRoZSByZXR1cm5fIGFuZCB0aHJvd18gZnVuY3Rpb25zIGFyZQorICAgICAgLy8gb3ZlcmxvYWRlZC4gIFdlIGhhdmUgdG8gZGVjbGFyZSBwb2ludGVycyB0byB0aGVtIHNvIHRoYXQgdGhlIGNvbXBpbGVyCisgICAgICAvLyBjYW4gcmVzb2x2ZSB0aGUgY29ycmVjdCBvdmVybG9hZGVkIHZlcnNpb24uCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICA8PCAiOjoqcmV0dXJuX2ZuKSg6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgorICAgICAgICAgIDw8ICJjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcKKyAgICAgICAgICA8PCAiKSA9IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CisgICAgICAgICAgPDwgIjo6cmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICAgIDw8ICI6Oip0aHJvd19mbikoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+ICIKKyAgICAgICAgICAgIDw8ICJjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSA9IiA8PCBlbmRsOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgJiIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKKyAgICAgICAgICAgIDw8ICI6OnRocm93XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6YmluZChyZXR1cm5fZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCBjdHgiIDw8IHJldF9wbGFjZWhvbGRlcgorICAgICAgICAgIDw8ICIpIjsKKyAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgb3V0IDw8ICcsJyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6YmluZCh0aHJvd19mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsICIKKyAgICAgICAgICAgIDw8ICJjdHgsIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSI7CisgICAgICB9CisgICAgfQorCisgICAgLy8gWFhYIFdoaXRlc3BhY2UgY2xlYW51cC4KKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8ICcsJyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBOb3JtYWwgcmV0dXJuLgorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJldF9hcmdfZGVjbCwgcmV0X2FyZ19uYW1lOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICByZXRfYXJnX2RlY2wgPSAiLCBjb25zdCAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIjsKKyAgICAgICAgcmV0X2FyZ19uYW1lID0gIiwgX3JldHVybiI7CisgICAgICB9CisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnJldHVybl8iCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnX2RlY2wgPDwgJyknIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworCisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7CisgICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAorICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHJldHVybiBmdW5jdGlvbiBpbnN0ZWFkLgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoX29wcm90KSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXR1cm5fIgorICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX29wcm90LCBjdHgiIDw8IHJldF9hcmdfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX3ByZXN1bHQgcmVzdWx0OyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAvLyBUaGUgY29uc3RfY2FzdCBoZXJlIGlzIHVuZm9ydHVuYXRlLCBidXQgaXQgd291bGQgYmUgYSBwYWluIHRvIGF2b2lkLAorICAgICAgICAvLyBhbmQgd2Ugb25seSBkbyBhIHdyaXRlIHdpdGggdGhpcyBzdHJ1Y3QsIHdoaWNoIGlzIGNvbnN0LXNhZmUuCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBjb25zdF9jYXN0PCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgIDw8ICIqPigmX3JldHVybik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuX19pc3NldC5zdWNjZXNzID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKKyAgICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBFeGNlcHRpb24gcmV0dXJuLgorICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6dGhyb3dfIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIgorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKKyAgICAgICAgLy8gSWYgb3Byb3QgaXMgYSBQcm90b2NvbF8gaW5zdGFuY2UsCisgICAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgdGhyb3cgZnVuY3Rpb24gaW5zdGVhZC4KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyb3dfIgorICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX29wcm90LCBjdHgsIF90aHJvdyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gR2V0IHRoZSBldmVudCBoYW5kbGVyIGNvbnRleHQKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIFRocm93IHRoZSBURGVsYXllZEV4Y2VwdGlvbiwgYW5kIGNhdGNoIHRoZSByZXN1bHQKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfcmVzdWx0IHJlc3VsdDsiCisgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfdGhyb3ctPnRocm93X2l0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKGZhbHNlKTsiCisgICAgICAgICAgPDwgZW5kbDsgLy8gSXMgdGhpcyBwb3NzaWJsZT8gIFRCRC4KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgJ30nOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8ICIgIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgJiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgfQorCisgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYW4gdW5kZWNsYXJlZCBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICBvdXQgPDwgIiBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geChlLndoYXQoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAorICAgICAgICAgIC8vIFdlIHBhc3MgdHJ1ZSB0byB0aGUgY29iIGhlcmUsIHNpbmNlIHdlIGRpZCBzdWNjZXNzZnVsbHkgd3JpdGUgYQorICAgICAgICAgIC8vIHJlc3BvbnNlLCBldmVuIHRob3VnaCBpdCBpcyBhbiBleGNlcHRpb24gcmVzcG9uc2UuCisgICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSB0aGUgYXJndW1lbnQgaXMgY3VycmVudGx5IGlnbm9yZWQsIGFueXdheS4KKyAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0gLy8gZm9yIGVhY2ggZnVuY3Rpb24KKyAgfSAgIC8vIGNvYiBzdHlsZQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNrZWxldG9uIGZpbGUgb2YgYSBzZXJ2ZXIKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICJfc2VydmVyLnNrZWxldG9uLmNwcCI7CisKKyAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9za2VsZXRvbjsKKyAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKKyAgZl9za2VsZXRvbiA8PCAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIvLyBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPiIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIG5vdCBjb21waWxlOgorICAvLyB1c2luZyBuYW1lc3BhY2UgOworICAvLyB1c2luZyBuYW1lc3BhY2UgOjo7CisgIGlmICgoIW5zLmVtcHR5KCkpICYmIChucy5jb21wYXJlKCIgOjoiKSAhPSAwKSkgeworICAgIGZfc2tlbGV0b24gPDwgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpIC0gMikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2tlbGV0b24gPDwgImNsYXNzICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlciA6IHZpcnR1YWwgcHVibGljICIgPDwgc3ZjbmFtZSA8PCAiSWYgeyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2tlbGV0b24sICpmX2l0ZXIpOworICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiKSA8PCAiIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgIC8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHByaW50ZihcIiIKKyAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXFxuXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9za2VsZXRvbiA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8ICJpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NrZWxldG9uCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IHBvcnQgPSA5MDkwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBzdmNuYW1lCisgICAgICA8PCAiSGFuZGxlcj4gaGFuZGxlcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlcikpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsiCisgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9za2VsZXRvbiA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENsb3NlIHRoZSBmaWxlcworICBmX3NrZWxldG9uLmNsb3NlKCk7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGlzX3JlZmVyZW5jZSh0ZmllbGQpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPiI7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgInJlYWRCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAicmVhZEJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8ICJyZWFkSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgInJlYWRJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0cmluZyB0ID0gdG1wKCJlY2FzdCIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaW50MzJfdCAiIDw8IHQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRJMzIoIiA8PCB0CisgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCisgKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKKyAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCisgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIpIHsKKyAgaWYgKHBvaW50ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCEiIDw8IHByZWZpeCA8PCAiKSB7ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHByZWZpeCA8PCAiID0gOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIj4obmV3ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICItPnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCB3YXNTZXQgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKSB7IHdhc1NldCA9IHRydWU7IH0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXdhc1NldCkgeyAiIDw8IHByZWZpeCA8PCAiLnJlc2V0KCk7IH0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKKyAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKKyAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKKyAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKKworICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7CisgIGJvb2wgdXNlX3B1c2ggPSB0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5jbGVhcigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCBzaXplIDw8ICI7IiA8PCBlbmRsOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBrdHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgdnR5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRNYXBCZWdpbigiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU2V0QmVnaW4oIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTGlzdEJlZ2luKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpZiAoIXVzZV9wdXNoKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZXNpemUoIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgaSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaQorICAgICAgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCB1c2VfcHVzaCwgaSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkKKyAgICAgICAgICAgICAgPDwgIl07IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5pbnNlcnQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3B1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCkgeworICBpZiAodXNlX3B1c2gpIHsKKyAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKyAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoX2JhY2soIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHByZWZpeCArICJbIiArIGluZGV4ICsgIl0iKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGlzX3JlZmVyZW5jZSh0ZmllbGQpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyB3cml0ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKQorICAgICAgICAgICAgKyBuYW1lOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKChpbnQzMl90KSIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7CisgIGlmIChwb2ludGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUob3Byb3QpOyAiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IgorICAgICAgICAgICAgICAgIDw8ICJvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyAiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIjo6Y29uc3RfaXRlcmF0b3IgIiA8PCBpdGVyIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm9yICgiIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIuYmVnaW4oKTsgIiA8PCBpdGVyIDw8ICIgIT0gIiA8PCBwcmVmaXgKKyAgICAgIDw8ICIuZW5kKCk7ICsrIiA8PCBpdGVyIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi0+Zmlyc3QiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpdGVyICsgIi0+c2Vjb25kIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogTWFrZXMgYSA6OiBwcmVmaXggZm9yIGEgbmFtZXNwYWNlCisgKgorICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKKyAqIEByZXR1cm4gTmFtZXNwYWNlcworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2VfcHJlZml4KHN0cmluZyBucykgeworICAvLyBBbHdheXMgc3RhcnQgd2l0aCAiOjoiLCB0byBhdm9pZCBwb3NzaWJsZSBuYW1lIGNvbGxpc2lvbnMgd2l0aAorICAvLyBvdGhlciBuYW1lcyBpbiBvbmUgb2YgdGhlIGN1cnJlbnQgbmFtZXNwYWNlcy4KKyAgLy8KKyAgLy8gV2UgYWxzbyBuZWVkIGEgbGVhZGluZyBzcGFjZSwgaW4gY2FzZSB0aGUgbmFtZSBpcyB1c2VkIGluc2lkZSBvZiBhCisgIC8vIHRlbXBsYXRlIHBhcmFtZXRlci4gICJNeVRlbXBsYXRlPDo6Zm9vOjpCYXI+IiBpcyBub3QgdmFsaWQgQysrLAorICAvLyBzaW5jZSAiPDoiIGlzIGFuIGFsdGVybmF0aXZlIHRva2VuIGZvciAiWyIuCisgIHN0cmluZyByZXN1bHQgPSAiIDo6IjsKKworICBpZiAobnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKKyAgICByZXN1bHQgKz0gIjo6IjsKKyAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSBucyArICI6OiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBPcGVucyBuYW1lc3BhY2UuCisgKgorICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKKyAqIEByZXR1cm4gTmFtZXNwYWNlcworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2Vfb3BlbihzdHJpbmcgbnMpIHsKKyAgaWYgKG5zLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgc3RyaW5nIHNlcGFyYXRvciA9ICIiOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXN1bHQgKz0gc2VwYXJhdG9yOworICAgIHJlc3VsdCArPSAibmFtZXNwYWNlICI7CisgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOworICAgIHJlc3VsdCArPSAiIHsiOworICAgIHNlcGFyYXRvciA9ICIgIjsKKyAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSBzZXBhcmF0b3IgKyAibmFtZXNwYWNlICIgKyBucyArICIgeyI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDbG9zZXMgbmFtZXNwYWNlLgorICoKKyAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0CisgKiBAcmV0dXJuIE5hbWVzcGFjZXMKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX2Nsb3NlKHN0cmluZyBucykgeworICBpZiAobnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgc3RyaW5nIHJlc3VsdCA9ICJ9IjsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmVzdWx0ICs9ICJ9IjsKKyAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICByZXN1bHQgKz0gIiAvLyBuYW1lc3BhY2UiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgYSBDKysgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgdHlwZSBuYW1lLCBpLmUuIHN0ZDo6c2V0PHR5cGU+CisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgYXJnKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgYm5hbWUgPSBiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpOworICAgIHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmZpbmQoImNwcC50eXBlIik7CisgICAgaWYgKGl0ICE9IHR0eXBlLT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICAgIGJuYW1lID0gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBpZiAoIWFyZykgeworICAgICAgcmV0dXJuIGJuYW1lOworICAgIH0KKworICAgIGlmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZSArICImIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgZm9yIGEgY3VzdG9tIG92ZXJsb2FkZWQgQysrIG5hbWUKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIHN0cmluZyBjbmFtZTsKKworICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKKyAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKKyAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgIGNuYW1lID0gInN0ZDo6bWFwPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIGluX3R5cGVkZWYpICsgIiwgIgorICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgICBjbmFtZSA9ICJzdGQ6OnNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgICAgY25hbWUgPSAic3RkOjp2ZWN0b3I8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7CisgICAgfQorCisgICAgaWYgKGFyZykgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWUgKyAiJiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjbmFtZTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgY2xhc3NfcHJlZml4OworICBpZiAoaW5fdHlwZWRlZiAmJiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSkgeworICAgIGNsYXNzX3ByZWZpeCA9ICJjbGFzcyAiOworICB9CisKKyAgLy8gQ2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgbmFtZXNwYWNlZAorICBzdHJpbmcgcG5hbWU7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwbmFtZSA9IGNsYXNzX3ByZWZpeCArIG5hbWVzcGFjZV9wcmVmaXgocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcG5hbWUgPSBjbGFzc19wcmVmaXggKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfZW51bSgpICYmICFnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBwbmFtZSArPSAiOjp0eXBlIjsKKyAgfQorCisgIGlmIChhcmcpIHsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWUgKyAiJiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcG5hbWU7CisgIH0KK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHJldHVybiBFeHBsaWNpdCBDKysgdHlwZSwgaS5lLiAiaW50MzJfdCIKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgeworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICByZXR1cm4gInN0ZDo6c3RyaW5nIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJpbnQ4X3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gImludDE2X3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludDMyX3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImludDY0X3QiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEByZXR1cm4gRmllbGQgZGVjbGFyYXRpb24sIGkuZS4gaW50IHggPSAwOworICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlKSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGlmIChjb25zdGFudCkgeworICAgIHJlc3VsdCArPSAiY29uc3QgIjsKKyAgfQorICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChpc19yZWZlcmVuY2UodGZpZWxkKSkgeworICAgIHJlc3VsdCA9ICI6OnN0ZDo6c2hhcmVkX3B0cjwiICsgcmVzdWx0ICsgIj4iOworICB9CisgIGlmIChwb2ludGVyKSB7CisgICAgcmVzdWx0ICs9ICIqIjsKKyAgfQorICBpZiAocmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICImIjsKKyAgfQorICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0eXBlKSArICIpMCI7CisgICAgfQorICB9CisgIGlmICghcmVmZXJlbmNlKSB7CisgICAgcmVzdWx0ICs9ICI7IjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBib29sIGhhc194Y2VwdGlvbnMgPSAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKTsKKworICBpZiAoc3R5bGUgPT0gIiIpIHsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyB0eXBlX25hbWUodHR5cGUpCisgICAgICAgICAgICAgKyAobmFtZV9wYXJhbXMgPyAiJiBfcmV0dXJuIiA6ICImIC8qIF9yZXR1cm4gKi8iKQorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcywgdHJ1ZSkgKyAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zKSArICIpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoc3R5bGUuc3Vic3RyKDAsIDMpID09ICJDb2IiKSB7CisgICAgc3RyaW5nIGNvYl90eXBlOworICAgIHN0cmluZyBleG5fY29iOworICAgIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7CisgICAgICBjb2JfdHlwZSA9ICIoIiArIHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICBjb2JfdHlwZSArPSAiVDxQcm90b2NvbF8+IjsKKyAgICAgIH0KKyAgICAgIGNvYl90eXBlICs9ICIqIGNsaWVudCkiOworICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gIkNvYlN2IikgeworICAgICAgY29iX3R5cGUgPSAodHR5cGUtPmlzX3ZvaWQoKSA/ICIoKSIgOiAoIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIgY29uc3QmIF9yZXR1cm4pIikpOworICAgICAgaWYgKGhhc194Y2VwdGlvbnMpIHsKKyAgICAgICAgZXhuX2NvYgorICAgICAgICAgICAgPSAiLCA6OnN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gLyogZXhuX2NvYiAqLyI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKKyAgICB9CisKKyAgICByZXR1cm4gInZvaWQgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQiICsgY29iX3R5cGUgKyAiPiBjb2IiCisgICAgICAgICAgICsgZXhuX2NvYiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMsIHRydWUpICsgIikiOworICB9IGVsc2UgeworICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcywgYm9vbCBzdGFydF9jb21tYSkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gIXN0YXJ0X2NvbW1hOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIKKyAgICAgICAgICAgICAgKyAobmFtZV9wYXJhbXMgPyAoKmZfaXRlciktPmdldF9uYW1lKCkgOiAiLyogIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgKi8iKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqCisgKiBAcGFyYW0gdHlwZSBUaHJpZnQgVHlwZQorICogQHJldHVybiBTdHJpbmcgb2YgQysrIGNvZGUgdG8gZGVmaW5pdGlvbiBvZiB0aGF0IHR5cGUgY29uc3RhbnQKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpnZXRfaW5jbHVkZV9wcmVmaXgoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdCB7CisgIHN0cmluZyBpbmNsdWRlX3ByZWZpeCA9IHByb2dyYW0uZ2V0X2luY2x1ZGVfcHJlZml4KCk7CisgIGlmICghdXNlX2luY2x1ZGVfcHJlZml4XyB8fCAoaW5jbHVkZV9wcmVmaXguc2l6ZSgpID4gMCAmJiBpbmNsdWRlX3ByZWZpeFswXSA9PSAnLycpKSB7CisgICAgLy8gaWYgZmxhZyBpcyB0dXJuZWQgb2ZmIG9yIHRoaXMgaXMgYWJzb2x1dGUgcGF0aCwgcmV0dXJuIGVtcHR5IHByZWZpeAorICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7CisgIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfcHJlZml4LnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJldHVybiBpbmNsdWRlX3ByZWZpeC5zdWJzdHIoMCwgbGFzdF9zbGFzaCkKKyAgICAgICAgICAgKyAoZ2V0X3Byb2dyYW0oKS0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSA/ICIvIiA6ICIvIiArIG91dF9kaXJfYmFzZV8gKyAiLyIpOworICB9CisKKyAgcmV0dXJuICIiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGNwcCwKKyAgICAiQysrIiwKKyAgICAiICAgIGNvYl9zdHlsZTogICAgICAgR2VuZXJhdGUgXCJDb250aW51YXRpb24gT0JqZWN0XCItc3R5bGUgY2xhc3Nlcy5cbiIKKyAgICAiICAgIG5vX2NsaWVudF9jb21wbGV0aW9uOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy5cbiIKKyAgICAiICAgIG5vX2RlZmF1bHRfb3BlcmF0b3JzOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0cyBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgb3BlcmF0b3JzID09LCAhPSBhbmQgPFxuIgorICAgICIgICAgdGVtcGxhdGVzOiAgICAgICBHZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuXG4iCisgICAgIiAgICBwdXJlX2VudW1zOiAgICAgIEdlbmVyYXRlIHB1cmUgZW51bXMgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuXG4iCisgICAgIiAgICBpbmNsdWRlX3ByZWZpeDogIFVzZSBmdWxsIGluY2x1ZGUgcGF0aHMgaW4gZ2VuZXJhdGVkIGZpbGVzLlxuIgorICAgICIgICAgbW92ZWFibGVfdHlwZXM6ICBHZW5lcmF0ZSBtb3ZlIGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMuXG4iCisgICAgIiAgICBub19vc3RyZWFtX29wZXJhdG9yczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgT21pdCBnZW5lcmF0aW9uIG9mIG9zdHJlYW0gZGVmaW5pdGlvbnMuXG4iCisgICAgIiAgICBub19za2VsZXRvbjogICAgIE9taXRzIGdlbmVyYXRpb24gb2Ygc2tlbGV0b24uXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWUyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMjQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK3N0cnVjdCBtZW1iZXJfbWFwcGluZ19zY29wZSB7CisgIHZvaWQqIHNjb3BlX21lbWJlcjsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtYXBwaW5nX3RhYmxlOworfTsKKworY2xhc3MgdF9jc2hhcnBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfY3NoYXJwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGFzeW5jXyA9IGZhbHNlOworICAgIG51bGxhYmxlXyA9IGZhbHNlOworICAgIGhhc2hjb2RlXyA9IGZhbHNlOworICAgIHVuaW9uXyA9IGZhbHNlOworICAgIHNlcmlhbGl6ZV8gPSBmYWxzZTsKKyAgICB3Y2ZfID0gZmFsc2U7CisgICAgd2NmX25hbWVzcGFjZV8uY2xlYXIoKTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhc3luYyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibnVsbGFibGUiKSA9PSAwKSB7CisgICAgICAgIG51bGxhYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImhhc2hjb2RlIikgPT0gMCkgeworICAgICAgICBoYXNoY29kZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1bmlvbiIpID09IDApIHsKKyAgICAgICAgdW5pb25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic2VyaWFsIikgPT0gMCkgeworICAgICAgICBzZXJpYWxpemVfID0gdHJ1ZTsKKyAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7IC8vIHNpbmNlIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBuYW1lc3BhY2UKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgid2NmIikgPT0gMCkgeworICAgICAgICB3Y2ZfID0gdHJ1ZTsKKyAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY3NoYXJwOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jc2hhcnAiOworICB9CisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVJc3NldCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOworICBib29sIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkdHlwZSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fY2xhc3Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24sIHRfZmllbGQqIHRmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXBhcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZXModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9hc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb21iaW5lZF9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zaWx2ZXJsaWdodF9hc3luY19tZXRob2RzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lbGVtZW50ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICB2b2lkIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uoc3RkOjpvc3RyZWFtJiBvdXQpOworICB2b2lkIGVuZF9jc2hhcnBfbmFtZXNwYWNlKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKworICBzdGQ6OnN0cmluZyBjc2hhcnBfdHlwZV91c2luZ3MoKTsKKyAgc3RkOjpzdHJpbmcgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY291bnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworCisgIGJvb2wgZmllbGRfaGFzX2RlZmF1bHQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEw7IH0KKworICBib29sIGZpZWxkX2lzX3JlcXVpcmVkKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRDsgfQorCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBib29sIGFzeW5jXzsKKyAgYm9vbCBudWxsYWJsZV87CisgIGJvb2wgdW5pb25fOworICBib29sIGhhc2hjb2RlXzsKKyAgYm9vbCBzZXJpYWxpemVfOworICBib29sIHdjZl87CisgIHN0ZDo6c3RyaW5nIHdjZl9uYW1lc3BhY2VfOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGNzaGFycF9rZXl3b3JkczsKKyAgc3RkOjp2ZWN0b3I8bWVtYmVyX21hcHBpbmdfc2NvcGU+ICBtZW1iZXJfbWFwcGluZ19zY29wZXM7CisKKyAgdm9pZCBpbml0X2tleXdvcmRzKCk7CisgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSk7CisgIHZvaWQgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKTsKKyAgc3RyaW5nIGdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG9sZG5hbWUpOworfTsKKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7CisKKyAgc3RyaW5nIGRpciA9IG5hbWVzcGFjZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKyAgaW5pdF9rZXl3b3JkcygpOworCisgIHdoaWxlKCAhIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKSB7CisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpLnNjb3BlX21lbWJlcik7CisgIH0KKworICBwdmVyYm9zZSgiQyMgb3B0aW9uczpcbiIpOworICBwdmVyYm9zZSgiLSBhc3luYyAuLi4uLi4gJXNcbiIsIChhc3luY18gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gbnVsbGFibGUgLi4uICVzXG4iLCAobnVsbGFibGVfID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIHVuaW9uIC4uLi4uLiAlc1xuIiwgKHVuaW9uXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSBoYXNoY29kZSAuLi4gJXNcbiIsIChoYXNoY29kZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gc2VyaWFsaXplIC4uICVzXG4iLCAoc2VyaWFsaXplXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSB3Y2YgLi4uLi4uLi4gJXNcbiIsICh3Y2ZfID8gIk9OIiA6ICJvZmYiKSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgdG1wKG5hbWUpOworICBzdGQ6OnRyYW5zZm9ybSh0bXAuYmVnaW4oKSwgdG1wLmVuZCgpLCB0bXAuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8aW50ICgqKShpbnQpPihzdGQ6OnRvbG93ZXIpKTsKKworICAvLyB1bi1jb25mbGljdCBrZXl3b3JkcyBieSBwcmVmaXhpbmcgd2l0aCAiQCIKKyAgaWYgKGNzaGFycF9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gY3NoYXJwX2tleXdvcmRzLmVuZCgpKSB7CisgICAgcmV0dXJuICJAIiArIG5hbWU7CisgIH0KKworICAvLyBubyBjaGFuZ2VzIG5lY2Vzc2FyeQorICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmluaXRfa2V5d29yZHMoKSB7CisgIGNzaGFycF9rZXl3b3Jkcy5jbGVhcigpOworCisgIC8vIEMjIGtleXdvcmRzCisgIGNzaGFycF9rZXl3b3Jkc1siYWJzdHJhY3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYmFzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJib29sIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJyZWFrIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJ5dGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2FzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjYXRjaCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjaGFyIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNoZWNrZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY29uc3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY29udGludWUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZGVjaW1hbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZWZhdWx0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRlbGVnYXRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRvIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRvdWJsZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJlbHNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImVudW0iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZXZlbnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZXhwbGljaXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZXh0ZXJuIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZhbHNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZml4ZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZmxvYXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZm9yIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZvcmVhY2giXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ290byJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbXBsaWNpdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbnQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludGVybmFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImlzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImxvY2siXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibG9uZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJuYW1lc3BhY2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibmV3Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm51bGwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm9wZXJhdG9yIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm91dCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvdmVycmlkZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwYXJhbXMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJlYWRvbmx5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJlZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJyZXR1cm4iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2J5dGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2VhbGVkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNob3J0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNpemVvZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdGFja2FsbG9jIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN0YXRpYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3RydWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN3aXRjaCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0aGlzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRocm93Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRydWUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidHJ5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInR5cGVvZiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1aW50Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVsb25nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVuY2hlY2tlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1bnNhZmUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidXNob3J0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVzaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZpcnR1YWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidm9pZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2b2xhdGlsZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKKworICAvLyBDIyBjb250ZXh0dWFsIGtleXdvcmRzCisgIGNzaGFycF9rZXl3b3Jkc1siYWRkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFsaWFzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFzY2VuZGluZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhc3luYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhd2FpdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZXNjZW5kaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImR5bmFtaWMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZnJvbSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJnZXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ2xvYmFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImdyb3VwIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludG8iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siam9pbiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJsZXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib3JkZXJieSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJwYXJ0aWFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInJlbW92ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzZWxlY3QiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2V0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZhbHVlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZhciJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ3aGVyZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ5aWVsZCJdID0gMTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KSB7CisgIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIm5hbWVzcGFjZSAiIDw8IG5hbWVzcGFjZV9uYW1lXyA8PCAiXG4iOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmVuZF9jc2hhcnBfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkgeworICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90eXBlX3VzaW5ncygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgInVzaW5nIFN5c3RlbTtcbiIgKyAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgKyAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iICsgInVzaW5nIFN5c3RlbS5UZXh0O1xuIiArICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICArICgoYXN5bmNfKSA/ICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIiA6ICIiKSArICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICArICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gIiNpZiAhU0lMVkVSTElHSFRcbiIgOiAiIikKKyAgICAgICAgICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gInVzaW5nIFN5c3RlbS5YbWwuU2VyaWFsaXphdGlvbjtcbiIgOiAiIikKKyAgICAgICAgICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gIiNlbmRpZlxuIiA6ICIiKQorICAgICAgICAgKyAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90aHJpZnRfdXNpbmdzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAidXNpbmcgVGhyaWZ0LlByb3RvY29sO1xuIiArICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0O1xuIjsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKK30KK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfZW51bSk7CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2VudW0sIHRlbnVtKTsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXG4iOworICBzY29wZV91cChmX2VudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfZW51bSwgKmNfaXRlcik7CisKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsKKworICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOworCisgIGZfZW51bS5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAnLycgKyBwcm9ncmFtX25hbWVfICsgIi5Db25zdGFudHMuY3MiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgZW5kbDsKKworICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKKworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKQorICAgICAgICAgICAgICAgICAgIDw8ICJDb25zdGFudHMiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfY29uc3RzKTsKKworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSBmYWxzZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfY29uc3RzLCAoKmNfaXRlcikpOworICAgIGlmIChwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChuZWVkX3N0YXRpY19jb25zdHJ1Y3RvcikgeworICAgIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKGZfY29uc3RzLCBjb25zdHMpOworICB9CisKKyAgc2NvcGVfZG93bihmX2NvbnN0cyk7CisgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKKyAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoKHRfc3RydWN0Kil0eXBlKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHByb3BfbmFtZShmaWVsZCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKHRfc3RydWN0Kil0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0iCisgICAgICAgICAgICAgICAgICA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykuY19zdHIoKSA8PCAiQ29uc3RhbnRzKCkiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLy8gaXQgc2VlbXMgbGlrZSBhbGwgdGhhdCBtZXRob2RzIHRoYXQgY2FsbCB0aGlzIGFyZSB1c2luZyBpbl9zdGF0aWMgdG8gYmUgdGhlIG9wcG9zaXRlIG9mIHdoYXQgaXQKKy8vIHdvdWxkIGltcGx5Citib29sIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHR5cGUpIHsKKyAgaW5kZW50KG91dCk7CisgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gIWluX3N0YXRpYzsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAoIWRlZnZhbCB8fCBuZWVkdHlwZSkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiB0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICJwdWJsaWMgY29uc3QgIiA6ICJwdWJsaWMgc3RhdGljICIpCisgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOworICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkKKyAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZGVmdmFsICYmICF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpKSB7CisgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICB9CisKKyAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworCisgIGlmICghaW5fY2xhc3MpIHsKKyAgICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgdHN0cnVjdCk7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKworICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgIWlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJbRGF0YUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iCisgICAgICAgICAgICAgICAgPDwgZW5kbDsgLy8gZG8gbm90IG1ha2UgZXhjZXB0aW9uIGNsYXNzZXMgZGlyZWN0bHkgV0NGIHNlcmlhbGl6YWJsZSwgd2UgcHJvdmlkZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VwYXJhdGUgImZhdWx0IiBmb3IgdGhhdAorICB9CisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIKKyAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIiA6ICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiVEV4Y2VwdGlvbiwgIjsKKyAgfQorICBvdXQgPDwgIlRCYXNlIjsKKworICBvdXQgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgLy8gaWYgdGhlIGZpZWxkIGlzIHJlcXVpZWQsIHRoZW4gd2UgdXNlIGF1dG8tcHJvcGVydGllcworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gZmFsc2U7CisgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgdHJ1ZSk7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgaWYgKGlzX3JlcXVpcmVkKSB7CisgICAgICBoYXNfcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGhhc19kZWZhdWx0KSB7CisgICAgICAgIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSB0cnVlOworICAgICAgfQorICAgICAgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGJvb2wgZ2VuZXJhdGVfaXNzZXQgPSAobnVsbGFibGVfICYmIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyk7CisgIGlmIChnZW5lcmF0ZV9pc3NldCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1htbElnbm9yZV0gLy8gWG1sU2VyaWFsaXplciIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDEpXSAgLy8gWG1sT2JqZWN0U2VyaWFsaXplciwgRGF0YUNvbnRyYWN0SnNvblNlcmlhbGl6ZXIsIGV0Yy4iCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykgeworICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0cnVjdCBJc3NldCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQorICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkgeworICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIltEYXRhTWVtYmVyXSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2wgIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChnZW5lcmF0ZV9pc3NldCAmJiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiNyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQorICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbCBTaG91bGRTZXJpYWxpemUiIDw8IHByb3BfbmFtZSgoKm1faXRlcikpIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiI2VuZHJlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBXZSBhbHdheXMgd2FudCBhIGRlZmF1bHQsIG5vIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGZvciBSZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyBwcm9wX25hbWUoKm1faXRlciksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIC8vIE9wdGlvbmFscyB3aXRoIGRlZmF1bHRzIGFyZSBtYXJrZWQgc2V0CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkcykgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIDogdGhpcygpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IHByb3BfbmFtZSgoKm1faXRlcikpIDw8ICIgPSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKGhhc2hjb2RlXykgeworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKG91dCwgdHN0cnVjdCk7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgV0NGIGZhdWx0IHRvIHdyYXAgdGhlIGV4Y2VwdGlvbgorICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNfZXhjZXB0aW9uKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7CisgIH0KKworICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisgIGlmICghaW5fY2xhc3MpIHsKKyAgICBlbmRfY3NoYXJwX25hbWVzcGFjZShvdXQpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIkZhdWx0IiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAvLyBpZiB0aGUgZmllbGQgaXMgcmVxdWllZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpICYmICghbnVsbGFibGVfIHx8IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIFJlYWQgKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKyAgICBpZiAoaXNfcmVxdWlyZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIgorICAgICAgICAgIDw8ICJcInJlcXVpcmVkIGZpZWxkICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiBub3Qgc2V0XCIpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpOworICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgIHsKKyAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiCisgICAgICAgICAgICAgIDw8ICJcInJlcXVpcmVkIGZpZWxkICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiBub3Qgc2V0XCIpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0KSB7CisgICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIgorICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKKworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgICAgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgICB9CisKKyAgICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgICAgb3V0IDw8ICIodGhpcy4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiKHRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBib29sIG51bGxfYWxsb3dlZCA9ICFudWxsYWJsZV8gJiYgdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKKworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIlN0cmluZ0J1aWxkZXIgX19zYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJib29sIF9fZmlyc3QgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKKyAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCAmJiAhaXNfcmVxdWlyZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9IGVsc2UgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iCisgICAgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYoIV9fZmlyc3QpIHsgX19zYi5BcHBlbmQoXCIsIFwiKTsgfSIgPDwgZW5kbDsKKyAgICAgIGlmICghaXNfcmVxdWlyZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9fZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI6IFwiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIiwgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkKKyAgICAgICAgICAgICAgICAgIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIWlzX3JlcXVpcmVkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQorICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbih0X3N0cnVjdCogdHVuaW9uKSB7CisgIHN0cmluZyBmX3VuaW9uX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0dW5pb24tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl91bmlvbjsKKworICBmX3VuaW9uLm9wZW4oZl91bmlvbl9uYW1lLmNfc3RyKCkpOworCisgIGZfdW5pb24gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKGZfdW5pb24sIHR1bmlvbik7CisKKyAgZl91bmlvbi5jbG9zZSgpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pIHsKKyAgLy8gTGV0J3MgZGVmaW5lIHRoZSBjbGFzcyBmaXJzdAorICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBhYnN0cmFjdCBwYXJ0aWFsIGNsYXNzICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgOiBUQWJzdHJhY3RCYXNlIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKFRQcm90b2NvbCBwcm90b2NvbCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHJlYWRvbmx5IGJvb2wgSXNzZXQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IG9iamVjdCBEYXRhIHsgZ2V0OyB9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIihib29sIGlzc2V0KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIklzc2V0ID0gaXNzZXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgX19fdW5kZWZpbmVkIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIG51bGw7IH0gfSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIF9fX3VuZGVmaW5lZCgpIDogYmFzZShmYWxzZSkge30iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoVFByb3RvY29sIHByb3RvY29sKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsIFwiQ2Fubm90IHBlcnNpc3QgIgorICAgICAgICAgICAgICAgICAiYW4gdW5pb24gdHlwZSB3aGljaCBpcyBub3Qgc2V0LlwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhvdXQsIHR1bmlvbiwgKCpmX2l0ZXIpKTsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIob3V0LCB0dW5pb24pOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHR1bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkKSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBfZGF0YTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gX2RhdGE7IH0gfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgPDwgIiBkYXRhKSA6IGJhc2UodHJ1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9kYXRhID0gZGF0YTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZC5JRCA9ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCB0ZmllbGQsICJfZGF0YSIsIHRydWUsIHRydWUpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJ2YXIgb3RoZXIgPSB0aGF0IGFzICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoUmVmZXJlbmNlRXF1YWxzKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIjsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICImJiAiOworICAgIH0KKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKSB7CisgICAgICBvdXQgPDwgIigoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PSBvdGhlci5fX2lzc2V0LiIKKyAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpICYmICgoIV9faXNzZXQuIgorICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgfHwgKCI7CisgICAgfQorICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAiVENvbGxlY3Rpb25zLkVxdWFscygiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIlN5c3RlbS5PYmplY3QuRXF1YWxzKCI7CisgICAgfQorICAgIG91dCA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLCBvdGhlci4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpIjsKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKSB7CisgICAgICBvdXQgPDwgIikpKSI7CisgICAgfQorICB9CisgIGlmIChmaXJzdCkgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImludCBoYXNoY29kZSA9IDA7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidW5jaGVja2VkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaW5kZW50KG91dCkgPDwgImhhc2hjb2RlID0gKGhhc2hjb2RlICogMzk3KSBeICI7CisgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKKyAgICAgIG91dCA8PCAiKCI7CisgICAgfSBlbHNlIGlmIChudWxsYWJsZV8pIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiA9PSBudWxsID8gMCA6ICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKCFfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID8gMCA6ICI7CisgICAgfQorICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIG91dCA8PCAiKFRDb2xsZWN0aW9ucy5HZXRIYXNoQ29kZSgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5HZXRIYXNoQ29kZSgpKSI7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBoYXNoY29kZTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgcGFydGlhbCBjbGFzcyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc2VwYXJhdGVfc2VydmljZV9pbnRlcmZhY2VzKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcGFyYXRlX3NlcnZpY2VfaW50ZXJmYWNlcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGdlbmVyYXRlX3N5bmNfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworCisgIGlmIChhc3luY18pIHsKKyAgICBnZW5lcmF0ZV9hc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIH0KKworICBnZW5lcmF0ZV9jb21iaW5lZF9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JU3luYyI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpZiAod2NmXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElTeW5jIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKworICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKKyAgICBpZiAod2NmXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5PcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CisKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLkZhdWx0Q29udHJhY3QodHlwZW9mKCIKKyAgICAgICAgICArIHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiRmF1bHQpKV0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgOiAiICsgZXh0ZW5kcyArICIuSUFzeW5jIjsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIGlmICh3Y2ZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5TZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSUFzeW5jIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKworICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKKyAgICBpZiAod2NmXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5PcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CisKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLkZhdWx0Q29udHJhY3QodHlwZW9mKCIKKyAgICAgICAgICArIHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiRmF1bHQpKV0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb21iaW5lZF9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiA6IElTeW5jIjsKKworICBpZiAoYXN5bmNfKSB7CisgICAgZXh0ZW5kc19pZmFjZSArPSAiLCBJQXN5bmMiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaWYgKHdjZl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLlNlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyBXZSBuZWVkIHRvIGdlbmVyYXRlIGV4dHJhIG9sZCBzdHlsZSBhc3luYyBtZXRob2RzIGZvciBzaWx2ZXJsaWdodC4gU2luY2UKKyAgLy8gdGhpcyBpc24ndCBzb21ldGhpbmcgeW91J2Qgd2FudCB0byBpbXBsZW1lbnQgc2VydmVyLXNpZGUsIGp1c3QgcHV0IHRoZW0gaW50bworICAvLyB0aGUgbWFpbiBJZmFjZSBpbnRlcmZhY2UuCisgIGdlbmVyYXRlX3NpbHZlcmxpZ2h0X2FzeW5jX21ldGhvZHModHNlcnZpY2UpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2lsdmVybGlnaHRfYXN5bmNfbWV0aG9kcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisKKyAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGluY2x1ZGUgdGhlIEJlZ2luXywgRW5kXyBtZXRob2RzIGlmIHdlJ3JlIGdlbmVyYXRpbmcKKyAgICAvLyB3aXRoIHRoZSBhc3luYyBmbGFnLiBJJ20gbm90IHN1cmUgdGhpcyBpcyBuZWNlc3NhcnksIHNvIHNvbWVvbmUgd2l0aCBtb3JlIGtub3dsZWRnZQorICAgIC8vIGNhbiBtYXliZSByZW1vdmUgdGhlc2UgY2hlY2tzIGlmIHRoZXkga25vdyBpdCdzIHNhZmUuCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oKmZfaXRlciwgIkJlZ2luXyIpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKCpmX2l0ZXIsICJFbmRfIikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOworICB9IGVsc2UgeworICAgIGV4dGVuZHNfY2xpZW50ID0gIklEaXNwb3NhYmxlLCAiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkgOiB0aGlzKHByb3QsIHByb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaXByb3QsIG9wcm90KSI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIFRQcm90b2NvbCBJbnB1dFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZ2V0IHsgcmV0dXJuIGlwcm90XzsgfSIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIFRQcm90b2NvbCBPdXRwdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImdldCB7IHJldHVybiBvcHJvdF87IH0iIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI3JlZ2lvbiBcIiBJRGlzcG9zYWJsZSBTdXBwb3J0IFwiIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gSURpc3Bvc2FibGUiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBEaXNwb3NlKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJEaXNwb3NlKHRydWUpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKCFfSXNEaXNwb3NlZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZGlzcG9zaW5nKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChpcHJvdF8gIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKElEaXNwb3NhYmxlKWlwcm90XykuRGlzcG9zZSgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9wcm90XyAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigoSURpc3Bvc2FibGUpb3Byb3RfKS5EaXNwb3NlKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX0lzRGlzcG9zZWQgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZHJlZ2lvbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gQmVnaW5fCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oKmZfaXRlciwgIkJlZ2luXyIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihjYWxsYmFjaywgc3RhdGUiOworCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgZl9zZXJ2aWNlXyA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gRW5kCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKCpmX2l0ZXIsICJFbmRfIikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRW5kRmx1c2goYXN5bmNSZXN1bHQpOyIgPDwgZW5kbDsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBhc3luYworICAgIGJvb2wgZmlyc3Q7CisgICAgaWYgKGFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgIiIpIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHZhbCA9ICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhd2FpdCBUYXNrLlJ1bigoKSA9PiIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgaW5kZW50KGZfc2VydmljZV8pOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgZnVubmFtZSA8PCAiKCI7CisgICAgICBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIHNpbHZlcmxpZ2h0IGludm9rZQorICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgYXN5bmNSZXN1bHQgPSBCZWdpbl8iIDw8IGZ1bm5hbWUgPDwgIihudWxsLCBudWxsIjsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIAorICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJFbmRfIiA8PCBmdW5uYW1lIDw8ICIoYXN5bmNSZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBzeW5jaHJvbm91cyBpbnZva2UKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKyAgCisgICAgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIFNlbmQKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKQorICAgICAgICAgICAgICAgPDwgIiwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5Xcml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gb3Byb3RfLlRyYW5zcG9ydC5CZWdpbkZsdXNoKGNhbGxiYWNrLCBzdGF0ZSk7IiA8PCBlbmRsOworICAgICAgCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUKKyAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdF8uUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKG1zZy5UeXBlID09IFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoaXByb3RfKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgeDsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuUmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MuSGFzVmFsdWUpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzLlZhbHVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmIChhc3luY18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9hc3luYyh0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0c2VydmljZSk7CisgIH0KKyAgZWxzZSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0c2VydmljZSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX3N5bmModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzIFByb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKElTeW5jIGlmYWNlKSI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgOiBiYXNlKGlmYWNlKSI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2VzczsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIHZvaWQgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIElTeW5jIGlmYWNlXzsiIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiBwcm9jZXNzTWFwXyA9IG5ldyAiCisgICAgICAiRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgbmV3IGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8KKyAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBUVHlwZS5TdHJ1Y3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKKyAgICAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgIgorICAgICJtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCkpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Bc3luY1Byb2Nlc3NvciwgIjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzIEFzeW5jUHJvY2Vzc29yIDogIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVEFzeW5jUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEFzeW5jUHJvY2Vzc29yKElBc3luYyBpZmFjZSkiOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzQXN5bmM7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInByb3RlY3RlZCBkZWxlZ2F0ZSBUYXNrIFByb2Nlc3NGdW5jdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsiCisgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJQXN5bmMgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3ICIKKyAgICAgICJEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIG5ldyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8KKyAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBUVHlwZS5TdHJ1Y3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKKyAgICAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgIgorICAgICJtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCkpOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImF3YWl0IGZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyh0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiX1Byb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIuVmFsdWUiOworICAgIH0KKyAgfQorICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCkpOyAiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoRXhjZXB0aW9uIGV4KSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoXCJFcnJvciBvY2N1cnJlZCBpbiBwcm9jZXNzb3I6XCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGV4LlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24iIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsXCIgSW50ZXJuYWwgZXJyb3IuXCIpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGFzeW5jIFRhc2sgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICA8PCAiX1Byb2Nlc3NBc3luYyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJhd2FpdCBpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJBc3luYygiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIuVmFsdWUiOworICAgIH0KKyAgfQorICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCkpOyAiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoRXhjZXB0aW9uIGV4KSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgIiAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoXCJFcnJvciBvY2N1cnJlZCBpbiBwcm9jZXNzb3I6XCIpOyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICIgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGV4LlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24iIDw8IGluZGVudCgpCisgICAgICA8PCAiKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsXCIgSW50ZXJuYWwgZXJyb3IuXCIpOyIKKyAgICAgIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikgeworICAvLyBUaGFua3MgdG8gVEhSSUZULTE3NjgsIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgdW5pb24KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiBSZWFkKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgcmV0dmFsOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworICAvLyB3ZSBjYW5ub3QgaGF2ZSB0aGUgZmlyc3QgZmllbGQgYmUgYSBzdG9wIC0tIHdlIG11c3QgaGF2ZSBhIHNpbmdsZSBmaWVsZCBkZWZpbmVkCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGVtcDsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJ0ZW1wIiwgdHJ1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHZhbCA9IG5ldyAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHRlbXApOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJyZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoaXByb3QuUmVhZEZpZWxkQmVnaW4oKS5UeXBlICE9IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBlbmQgb2YgZWxzZSBmb3IgVFN0b3AKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcykgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIjsKKworICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSI7CisgICAgfQorCisgICAgb3V0IDw8ICJpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8IHByZWZpeCA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yKCBpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuQ291bnQiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworCisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzKSB7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBzdHJpbmcgbnVsbGFibGVfbmFtZSA9IG51bGxhYmxlXyAmJiAhaXNfZWxlbWVudCAmJiAhZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKSA/IG5hbWUgKyAiLlZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmFtZTsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIldyaXRlSTMyKChpbnQpIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgdHJ1ZSk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5lcmF0ZUlzc2V0KSB7CisgIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvdXQsIHRmaWVsZCwgaXNQdWJsaWMsIGdlbmVyYXRlSXNzZXQsICJfIik7Cit9Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbmVyYXRlSXNzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4KSB7CisgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc1B1YmxpYykgeworICAgIGluZGVudChvdXQpIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDApXSIgPDwgZW5kbDsKKyAgfQorICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKTsKKyAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCk7CisgIGlmICgobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCkgfHwgKGlzX3JlcXVpcmVkKSkgeworICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBpc19yZXF1aXJlZCkgPDwgIiAiCisgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgIiB7IGdldDsgc2V0OyB9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgImdldCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGJvb2wgdXNlX251bGxhYmxlID0gZmFsc2U7CisgICAgaWYgKG51bGxhYmxlXykgeworICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdXNlX251bGxhYmxlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpICE9IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzsKKyAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICB1c2VfbnVsbGFibGUgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodXNlX251bGxhYmxlKSB7CisgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHZhbHVlLkhhc1ZhbHVlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUuSGFzVmFsdWUpIHRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiA9IHZhbHVlLlZhbHVlOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICBvdXQgPDwgZW5kbDsKK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKSB7CisgIGlmKCBtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkgeworICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgbm8gc2NvcGUgYWN0aXZlIjsKKyAgfQorCisgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICBpZiAoYWN0aXZlLnNjb3BlX21lbWJlciAhPSBzY29wZSkgeworICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgY2FsbGVkIGZvciB3cm9uZyBzdHJ1Y3QiOworICB9CisKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnBvcF9iYWNrKCk7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgaWYoICEgbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpIHsKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gYWN0aXZlLm1hcHBpbmdfdGFibGUuZmluZChuYW1lKTsKKyAgICBpZiAoYWN0aXZlLm1hcHBpbmdfdGFibGUuZW5kKCkgIT0gaXRlcikgeworICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgICB9CisgIH0KKworICBwdmVyYm9zZSgibm8gbWFwcGluZyBmb3IgbWVtYmVyICVzXG4iLCBuYW1lLmNfc3RyKCkpOworICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCkgeworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSkgeworICAvLyBiZWdpbiBuZXcgc2NvcGUKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGUgZHVtbXk7CisgIGR1bW15LnNjb3BlX21lbWJlciA9IDA7CisgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5wdXNoX2JhY2soZHVtbXkpOworICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgYWN0aXZlLnNjb3BlX21lbWJlciA9IHNjb3BlOworCisgIC8vIGN1cnJlbnQgQyMgZ2VuZXJhdG9yIHBvbGljeToKKyAgLy8gLSBwcm9wIG5hbWVzIGFyZSBhbHdheXMgcmVuZGVyZWQgd2l0aCBhbiBVcHBlcmNhc2UgZmlyc3QgbGV0dGVyCisgIC8vIC0gc3RydWN0IG5hbWVzIGFyZSB1c2VkIGFzIGdpdmVuCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB1c2VkX21lbWJlcl9uYW1lczsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGggc3RydWN0IChDUzA1NDIgZXJyb3IpCisgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChzdHJ1Y3RuYW1lKTsKKworICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGgga25vd24gbWV0aG9kcyAoVEhSSUZULTI5NDIpCisgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiUmVhZCIpOworICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoIldyaXRlIik7CisKKyAgZm9yIChpdGVyID0gbWVtYmVycy5iZWdpbigpOyBpdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZyBvbGRuYW1lID0gKCppdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgbmV3bmFtZSA9IHByb3BfbmFtZSgqaXRlciwgdHJ1ZSk7CisgICAgd2hpbGUgKHRydWUpIHsKKworICAgICAgLy8gbmV3IG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXIKKyAgICAgIGlmICh1c2VkX21lbWJlcl9uYW1lcy5maW5kKG5ld25hbWUpICE9IHVzZWRfbWVtYmVyX25hbWVzLmVuZCgpKSB7CisgICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciAlcyBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlclxuIiwKKyAgICAgICAgICAgICAgICAgc3RydWN0bmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBuZXduYW1lLmNfc3RyKCkpOworICAgICAgICBuZXduYW1lICs9ICdfJzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIGFkZCBhbHdheXMsIHRoaXMgaGVscHMgdXMgdG8gZGV0ZWN0IGVkZ2UgY2FzZXMgbGlrZQorICAgICAgLy8gZGlmZmVyZW50IHNwZWxsaW5ncyAoImZvbyIgYW5kICJGb28iKSB3aXRoaW4gdGhlIHNhbWUgc3RydWN0CisgICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgbWFwcGluZyAlcyA9PiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cnVjdG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgIG9sZG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgIG5ld25hbWUuY19zdHIoKSk7CisgICAgICBhY3RpdmUubWFwcGluZ190YWJsZVtvbGRuYW1lXSA9IG5ld25hbWU7CisgICAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQobmV3bmFtZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcpIHsKKyAgc3RyaW5nIG5hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHN1cHByZXNzX21hcHBpbmcpIHsKKyAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgfSBlbHNlIHsKKyAgICBuYW1lID0gZ2V0X21hcHBlZF9tZW1iZXJfbmFtZShuYW1lKTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCkgeworICAodm9pZClpbl9pbml0OworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyLCBpbl9wYXJhbSwgaXNfcmVxdWlyZWQpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuICJUSGFzaFNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgfQorCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtICYmIHR0eXBlLT5pc19lbnVtKCkpID8gIj8iIDogIiI7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBucyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOworICAgIGlmICghbnMuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIG5zICsgIi4iICsgbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKKyAgICB9CisgIH0KKworICByZXR1cm4gbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCkgeworICAodm9pZClpbl9jb250YWluZXI7CisgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0pID8gIj8iIDogIiI7CisgIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbCIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAic2J5dGUiICsgcG9zdGZpeDsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJzaG9ydCIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludCIgKyBwb3N0Zml4OworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImxvbmciICsgcG9zdGZpeDsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiICsgcG9zdGZpeDsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlLT5nZXRfYmFzZSgpKTsKKyAgfQorfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBzdGQ6OnN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIikwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIKKyAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBjb21tYSA9ICh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCA/ICIsICIgOiAiIik7CisgIHJldHVybiAiSUFzeW5jUmVzdWx0ICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICArICIoQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlIiArIGNvbW1hICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpCisgICAgICAgICArICIpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICArICIoSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KSI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RyaW5nIHRhc2sgPSAiVGFzayI7CisgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB0YXNrICs9ICI8IiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiPiI7CisgIHJldHVybiB0YXNrICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJBc3luYygiCisgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5Cb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CeXRlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1hcCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNldCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvLy8gPHN1bW1hcnk+XG4iLCAiLy8vICIsIGNvbnRlbnRzLCAiLy8vIDwvc3VtbWFyeT5cbiIpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuPHNlZWFsc28gY3JlZj1cIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiXCIvPiI7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHBzOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgcHMgPDwgIlxuPHBhcmFtIG5hbWU9XCIiIDw8IHAtPmdldF9uYW1lKCkgPDwgIlwiPiI7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKKyAgICAgICAgc3RyLmVyYXNlKHN0ZDo6cmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLAorICAgICAgICAgICAgICAgICAgc3RyLmVuZCgpKTsgLy8gcmVtb3ZlIHRoZSBuZXdsaW5lcyB0aGF0IGFwcGVhciBmcm9tIHRoZSBwYXJzZXIKKyAgICAgICAgcHMgPDwgc3RyOworICAgICAgfQorICAgICAgcHMgPDwgIjwvcGFyYW0+IjsKKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+XG4iICsgdGZ1bmN0aW9uLT5nZXRfZG9jKCkgKyAiPC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY3NoYXJwLAorICAgICJDIyIsCisgICAgIiAgICBhc3luYzogICAgICAgICAgIEFkZHMgQXN5bmMgc3VwcG9ydCB1c2luZyBUYXNrLlJ1bi5cbiIKKyAgICAiICAgIHdjZjogICAgICAgICAgICAgQWRkcyBiaW5kaW5ncyBmb3IgV0NGIHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgc2VyaWFsOiAgICAgICAgICBBZGQgc2VyaWFsaXphdGlvbiBzdXBwb3J0IHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgbnVsbGFibGU6ICAgICAgICBVc2UgbnVsbGFibGUgdHlwZXMgZm9yIHByb3BlcnRpZXMuXG4iCisgICAgIiAgICBoYXNoY29kZTogICAgICAgIEdlbmVyYXRlIGEgaGFzaGNvZGUgYW5kIGVxdWFscyBpbXBsZW1lbnRhdGlvbiBmb3IgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHVuaW9uOiAgICAgICAgICAgVXNlIG5ldyB1bmlvbiB0eXBpbmcsIHdoaWNoIGluY2x1ZGVzIGEgc3RhdGljIHJlYWQgZnVuY3Rpb24gZm9yIHVuaW9uICIKKyAgICAidHlwZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1NmNmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogRCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBnZW5lcmF0ZV8qKCkgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIGJhc2UgY2xhc3MgdG8gZW1pdCBjb2RlIGZvciB0aGUKKyAqIGdpdmVuIGVudGl0eSwgcHJpbnRfKigpIGZ1bmN0aW9ucyB3cml0ZSBhIHBpZWNlIG9mIGNvZGUgdG8gdGhlIHBhc3NlZAorICogc3RyZWFtLCBhbmQgcmVuZGVyXyooKSByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgRCByZXByZXNlbnRhdGlvbiBvZgorICogdGhlIHBhc3NlZCBlbnRpdHkuCisgKi8KK2NsYXNzIHRfZF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZCI7CisgIH0KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7CisgICAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgICAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAgIHN0cmluZyBkaXIgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZCIpOworICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgICAgaWYgKCFkaXIuZW1wdHkoKSkgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIH0KKworICAgIHBhY2thZ2VfZGlyXyA9IHN1YmRpciArICIvIjsKKworICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuZCI7CisgICAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgICAvLyBQcmludCBoZWFkZXIKKyAgICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgPDwgIl90eXBlczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3R5cGVzXyk7CisKKyAgICAvLyBJbmNsdWRlIHR5cGUgbW9kdWxlcyBmcm9tIG90aGVyIGltcG9ydGVkIHByb2dyYW1zLgorICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgZl90eXBlc18gPDwgInB1YmxpYyBpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqKGluY2x1ZGVzW2ldKSkgPDwgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJfdHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluY2x1ZGVzLmVtcHR5KCkpCisgICAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgdmlydHVhbCB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIHsKKyAgICAvLyBDbG9zZSBvdXRwdXQgZmlsZQorICAgIGZfdHlwZXNfLmNsb3NlKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgICBpZiAoIWNvbnN0cy5lbXB0eSgpKSB7CisgICAgICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5kIjsKKyAgICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgICAgICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgICAgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBwcmludF9kZWZhdWx0X2ltcG9ydHMoZl9jb25zdHMpOworCisgICAgICBmX2NvbnN0cyA8PCAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlczsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIHRoaXMtPmVtaXRfZG9jKCpjX2l0ZXIsIGZfY29uc3RzKTsKKyAgICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAiaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfY29uc3RzIDw8IGVuZGwgPDwgInN0YXRpYyB0aGlzKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9jb25zdHMgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOworICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKHR5cGUpKSB7CisgICAgICAgICAgZl9jb25zdHMgPDwgImNhc3QoaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSkgIjsKKyAgICAgICAgfQorICAgICAgICBmX2NvbnN0cyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICAgdGhpcy0+ZW1pdF9kb2ModHR5cGVkZWYsIGZfdHlwZXNfKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYWxpYXMgIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIKKyAgICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKworICAgIHRoaXMtPmVtaXRfZG9jKHRlbnVtLCBmX3R5cGVzXyk7CisgICAgc3RyaW5nIGVudW1fbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHRoaXMtPmVtaXRfZG9jKCpjX2l0ZXIsIGZfdHlwZXNfKTsKKyAgICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZl90eXBlc18gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA8PCAiLCI7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICAgIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAgIHN0cmluZyBzdmNfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgICAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCisgICAgc3RyaW5nIGZfc2VydmljZW5hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzdmNfbmFtZSArICIuZCI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2U7CisgICAgZl9zZXJ2aWNlLm9wZW4oZl9zZXJ2aWNlbmFtZS5jX3N0cigpKTsKKyAgICBmX3NlcnZpY2UgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgc3ZjX25hbWUgPDwgIjsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3NlcnZpY2UpOworCisgICAgZl9zZXJ2aWNlIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbDsKKworICAgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkKKyAgICAgICAgICAgICAgICA8PCBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBleHRlbmRzID0gIiA6ICIgKyByZW5kZXJfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICB9CisKKyAgICB0aGlzLT5lbWl0X2RvYyh0c2VydmljZSwgZl9zZXJ2aWNlKTsKKyAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgImludGVyZmFjZSAiIDw8IHN2Y19uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gQ29sbGVjdCBhbGwgdGhlIGV4Y2VwdGlvbiB0eXBlcyBzZXJ2aWNlIG1ldGhvZHMgY2FuIHRocm93IHNvIHdlIGNhbgorICAgIC8vIGVtaXQgdGhlIG5lY2Vzc2FyeSBhbGlhc2VzIGxhdGVyLgorICAgIHNldDx0X3R5cGUqPiBleGNlcHRpb25fdHlwZXM7CisKKyAgICAvLyBQcmludCB0aGUgbWV0aG9kIHNpZ25hdHVyZXMuCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXI7CisgICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKKyAgICAgIHRoaXMtPmVtaXRfZG9jKCpmbl9pdGVyLCBmX3NlcnZpY2UpOworICAgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpOworICAgICAgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKGZfc2VydmljZSwgKmZuX2l0ZXIpOworICAgICAgZl9zZXJ2aWNlIDw8ICI7IiA8PCBlbmRsOworCisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKKyAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKKyAgICAgICAgZXhjZXB0aW9uX3R5cGVzLmluc2VydCgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBbGlhcyB0aGUgZXhjZXB0aW9uIHR5cGVzIGludG8gdGhlIGN1cnJlbnQgc2NvcGUuCisgICAgaWYgKCFleGNlcHRpb25fdHlwZXMuZW1wdHkoKSkKKyAgICAgIGZfc2VydmljZSA8PCBlbmRsOworICAgIHNldDx0X3R5cGUqPjo6Y29uc3RfaXRlcmF0b3IgZXRfaXRlcjsKKyAgICBmb3IgKGV0X2l0ZXIgPSBleGNlcHRpb25fdHlwZXMuYmVnaW4oKTsgZXRfaXRlciAhPSBleGNlcHRpb25fdHlwZXMuZW5kKCk7ICsrZXRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZSkgPDwgImFsaWFzICIgPDwgcmVuZGVyX3BhY2thZ2UoKigqZXRfaXRlciktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmV0X2l0ZXIpLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpIDw8ICJfdHlwZXMiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIG1ldGhvZCBtZXRhZGF0YS4KKyAgICBvc3RyaW5nc3RyZWFtIG1ldGE7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkKKyAgICAgICAgICAmJiAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSAmJiAhKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0YSA8PCAiLCI7CisgICAgICB9CisKKyAgICAgIG1ldGEgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVE1ldGhvZE1ldGEoYCIgPDwgKCpmbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQobWV0YSkgPDwgIlsiOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHBhcmFtcyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgICBmb3IgKHBfaXRlciA9IHBhcmFtcy5iZWdpbigpOyBwX2l0ZXIgIT0gcGFyYW1zLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1ldGEgPDwgIiwgIjsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGEgPDwgIlRQYXJhbU1ldGEoYCIgPDwgKCpwX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqcF9pdGVyKS0+Z2V0X2tleSgpOworCisgICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCpwX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgICBtZXRhIDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCpwX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOworICAgICAgICB9CisgICAgICAgIG1ldGEgPDwgIikiOworICAgICAgfQorCisgICAgICBtZXRhIDw8ICJdIjsKKworICAgICAgaWYgKCEoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSB8fCAoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBtZXRhIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJbIjsKKworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjZXB0aW9ucyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKKyAgICAgICAgZm9yIChleF9pdGVyID0gZXhjZXB0aW9ucy5iZWdpbigpOyBleF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsrZXhfaXRlcikgeworICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0YSA8PCAiLCAiOworICAgICAgICAgIH0KKworICAgICAgICAgIG1ldGEgPDwgIlRFeGNlcHRpb25NZXRhKGAiIDw8ICgqZXhfaXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgKCpleF9pdGVyKS0+Z2V0X2tleSgpCisgICAgICAgICAgICAgICA8PCAiLCBgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICJgKSI7CisgICAgICAgIH0KKworICAgICAgICBtZXRhIDw8ICJdIjsKKyAgICAgIH0KKworICAgICAgaWYgKCgqZm5faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG1ldGEgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRNZXRob2RUeXBlLk9ORVdBWSI7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBtZXRhIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIikiOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc3RyaW5nIG1ldGFfc3RyKG1ldGEuc3RyKCkpOworICAgIGlmICghbWV0YV9zdHIuZW1wdHkoKSkgeworICAgICAgZl9zZXJ2aWNlIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVudW0gbWV0aG9kTWV0YSA9IFsiIDw8IG1ldGFfc3RyIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIl07IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIFNlcnZlciBza2VsZXRvbiBnZW5lcmF0aW9uLgorICAgIHN0cmluZyBmX3NrZWxldG9ubmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIl9zZXJ2ZXIuc2tlbGV0b24uZCI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NrZWxldG9uOworICAgIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9ubmFtZS5jX3N0cigpKTsKKyAgICBwcmludF9zZXJ2ZXJfc2tlbGV0b24oZl9za2VsZXRvbiwgdHNlcnZpY2UpOworICAgIGZfc2tlbGV0b24uY2xvc2UoKTsKKyAgfQorCisgIHZvaWQgZW1pdF9kb2ModF9kb2MgKmRvYywgc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgICBpZiAoIWRvYy0+aGFzX2RvYygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IHN0ZDo6ZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBObyBlbmRsIC0tIGNvbW1lbnRzIHJlbGlhYmx5IGhhdmUgYSBuZXdsaW5lIGF0IHRoZSBlbmQuCisgICAgLy8gVGhpcyBpcyB0cnVlIGV2ZW4gZm9yIHN0dWZmIGxpa2U6CisgICAgLy8gICAgIC8qKiBtZXRob2QgaW5mb3MgKi8gdm9pZCBmb28oLyoqIGh1aD8qLyAxOiBpNjQgc3R1ZmYpCisgICAgaW5kZW50KG91dCkgPDwgZG9jLT5nZXRfZG9jKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKi8iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogV3JpdGVzIGEgc2VydmVyIHNrZWxldG9uIGZvciB0aGUgcGFzc2VkIHNlcnZpY2UgdG8gb3V0LgorICAgKi8KKyAgdm9pZCBwcmludF9zZXJ2ZXJfc2tlbGV0b24ob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7CisKKyAgICBvdXQgPDwgIi8qIiA8PCBlbmRsCisgICAgICAgIDw8ICIgKiBUaGlzIGF1dG8tZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiBJZiB5b3UiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAqIGludGVuZCB0byBjdXN0b21pemUgaXQsIHlvdSBzaG91bGQgZWRpdCBhIGNvcHkgd2l0aCBhbm90aGVyIGZpbGUgbmFtZSB0byAiIDw8IGVuZGwKKyAgICAgICAgPDwgIiAqIGF2b2lkIG92ZXJ3cml0aW5nIGl0IHdoZW4gcnVubmluZyB0aGUgZ2VuZXJhdG9yIGFnYWluLiIgPDwgZW5kbCA8PCAiICovIiA8PCBlbmRsCisgICAgICAgIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqdHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHN2Y19uYW1lIDw8ICJfc2VydmVyOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsIDw8ICJpbXBvcnQgc3RkLnN0ZGlvOyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsiIDw8IGVuZGwKKyAgICAgICAgPDwgImltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5zZXJ2ZXIuc2ltcGxlOyIgPDwgZW5kbAorICAgICAgICA8PCAiaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOyIKKyAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwgImltcG9ydCAiCisgICAgICAgIDw8IHJlbmRlcl9wYWNrYWdlKCp0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc3ZjX25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgImltcG9ydCAiCisgICAgICAgIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCAiY2xhc3MgIiA8PCBzdmNfbmFtZSA8PCAiSGFuZGxlciA6ICIgPDwgc3ZjX25hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzKCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZS4iCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShvdXQsICpmX2l0ZXIpOworICAgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ3cml0ZWxuKFwiIgorICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGNhbGxlZFwiKTsiIDw8IGVuZGw7CisKKwkgIHRfdHlwZSogcnQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisJICBpZiAoIXJ0LT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0eXBlb2YocmV0dXJuKS5pbml0OyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBtYWluKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciEiIDw8IHN2Y19uYW1lIDw8ICIobmV3ICIgPDwgc3ZjX25hbWUKKyAgICAgICAgPDwgIkhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcigiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0IG9yIGFuIGV4Y2VwdGlvbiB0eXBlIHRvIG91dC4KKyAgICovCisgIHZvaWQgcHJpbnRfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIERlY2xhcmUgYWxsIGZpZWxkcy4KKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX3R5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghbWVtYmVycy5lbXB0eSgpKQorICAgICAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWl4aW4gVFN0cnVjdEhlbHBlcnMhKCI7CisKKyAgICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBmaWVsZHMsIGNvbnN0cnVjdCB0aGUgVEZpZWxkTWV0YSBhcnJheSB0byBwYXNzIHRvCisgICAgICAvLyBUU3RydWN0SGVscGVycy4gV2UgY2FuJ3QganVzdCBwYXNzIGFuIGVtcHR5IGFycmF5IGlmIG5vdCBiZWNhdXNlIFtdCisgICAgICAvLyBkb2Vzbid0IHBhc3MgdGhlIFRGaWVsZE1ldGFbXSBjb25zdHJhaW50LgorICAgICAgb3V0IDw8ICJbIjsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGluZGVudChvdXQpIDw8ICJURmllbGRNZXRhKGAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKTsKKworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpOworICAgICAgICBvdXQgPDwgIiwgIiA8PCByZW5kZXJfcmVxKHJlcSk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgb3V0IDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSI7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXSI7CisgICAgfQorCisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8qKgorICAgKiBQcmludHMgdGhlIEQgZnVuY3Rpb24gc2lnbmF0dXJlIChpbmNsdWRpbmcgcmV0dXJuIHR5cGUpIGZvciB0aGUgZ2l2ZW4KKyAgICogbWV0aG9kLgorICAgKi8KKyAgdm9pZCBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmbikgeworICAgIG91dCA8PCByZW5kZXJfdHlwZV9uYW1lKGZuLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiICIgPDwgZm4tPmdldF9uYW1lKCkgPDwgIigiOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIG91dCA8PCAiKSI7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgRCByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZS4gVGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEKKyAgICogc2luZ2xlIGV4cHJlc3Npb247IGZvciBjb21wbGV4IHR5cGVzLCBpbW1lZGlhdGVseSBjYWxsZWQgZGVsZWdhdGUKKyAgICogbGl0ZXJhbHMgYXJlIHVzZWQgdG8gYWNoaWV2ZSB0aGlzLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICAgLy8gUmVzb2x2ZSBhbnkgdHlwZWRlZnMuCisgICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgICBvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IE5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIgdjsiIDw8IGVuZGw7CisgICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidiA9ICIgPDwgKHR5cGUtPmlzX3hjZXB0aW9uKCkgPyAibmV3ICIgOiAiIikgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKQorICAgICAgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHRocm93ICJUeXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKKyAgICAgICAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInYuc2V0IWAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiYCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2WyI7CisgICAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZShrdHlwZSkpIHsKKyAgICAgICAgICAgIG91dCA8PCAiY2FzdChpbW11dGFibGUoIiA8PCByZW5kZXJfdHlwZV9uYW1lKGt0eXBlKSA8PCAiKSkiOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidiB+PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidiB+PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gcmVuZGVyX2NvbnN0X3ZhbHVlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdjsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpIjsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEQgcGFja2FnZSB0byB3aGljaCBtb2R1bGVzIGZvciBwcm9ncmFtIGFyZSB3cml0dGVuICh3aXRoIGEKKyAgICogdHJhaWxpbmcgZG90LCBpZiBub3QgZW1wdHkpLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl9wYWNrYWdlKGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS5nZXRfbmFtZXNwYWNlKCJkIik7CisgICAgaWYgKHBhY2thZ2Uuc2l6ZSgpID09IDApCisgICAgICByZXR1cm4gIiI7CisgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiI7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgRCByZXBlc2VudGF0aW9uIG9mIHR0eXBlLgorICAgKgorICAgKiBJZiBpc0FyZyBpcyB0cnVlLCBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdHlwZSB3aWxsIGJlIHJldHVybmVkIGZvcgorICAgKiBzdHJ1Y3RzLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSwgYm9vbCBpc0FyZyA9IGZhbHNlKSBjb25zdCB7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiAiYm9vbCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICByZXR1cm4gImJ5dGUiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIHJldHVybiAic2hvcnQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiaW50IjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXR1cm4gImxvbmciOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogTm8gRCB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7CisgICAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKKyAgICAgICAgcmV0dXJuIHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgICAgICB0X3R5cGUqIGt0eXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisKKyAgICAgICAgc3RyaW5nIG5hbWUgPSByZW5kZXJfdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICJbIjsKKyAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZShrdHlwZSkpIHsKKyAgICAgICAgICBuYW1lICs9ICJpbW11dGFibGUoIjsKKyAgICAgICAgfQorICAgICAgICBuYW1lICs9IHJlbmRlcl90eXBlX25hbWUoa3R5cGUpOworICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgeworICAgICAgICAgIG5hbWUgKz0gIikiOworICAgICAgICB9CisgICAgICAgIG5hbWUgKz0gIl0iOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgICAgcmV0dXJuICJIYXNoU2V0ISgiICsgcmVuZGVyX3R5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICAgICAgcmV0dXJuIHJlbmRlcl90eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiW10iOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgJiYgaXNBcmcpIHsKKyAgICAgIHJldHVybiAicmVmIGNvbnN0KCIgKyB0dHlwZS0+Z2V0X25hbWUoKSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBEIFRSZXEgZW51bSBtZW1iZXIgY29ycmVzcG9uZGluZyB0byByZXEuCisgICAqLworICBzdHJpbmcgcmVuZGVyX3JlcSh0X2ZpZWxkOjplX3JlcSByZXEpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKHJlcSkgeworICAgIGNhc2UgdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDoKKyAgICAgIHJldHVybiAiVFJlcS5PUFRfSU5fUkVRX09VVCI7CisgICAgY2FzZSB0X2ZpZWxkOjpUX09QVElPTkFMOgorICAgICAgcmV0dXJuICJUUmVxLk9QVElPTkFMIjsKKyAgICBjYXNlIHRfZmllbGQ6OlRfUkVRVUlSRUQ6CisgICAgICByZXR1cm4gIlRSZXEuUkVRVUlSRUQiOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgIkNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHJlcXVpcmVtZW50IGxldmVsICIgPDwgcmVxOworICAgICAgdGhyb3cgc3Muc3RyKCk7CisgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIGRlZmF1bHQgbGlzdCBvZiBpbXBvcnRzICh3aGljaCBhcmUgd3JpdHRlbiB0byBldmVyeSBnZW5lcmF0ZWQKKyAgICogbW9kdWxlKSB0byBmLgorICAgKi8KKyAgdm9pZCBwcmludF9kZWZhdWx0X2ltcG9ydHMob3N0cmVhbSYgb3V0KSB7CisgICAgaW5kZW50KG91dCkgPDwgImltcG9ydCB0aHJpZnQuYmFzZTsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICJpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgdHlwZSBpcyDCu2ludHJpbnNpY2FsbHkgaW1tdXRhYmxlwqssIGluIHRoZSBzZW5zZSB0aGF0CisgICAqIGEgdmFsdWUgb2YgdGhhdCB0eXBlIGlzIGltcGxpY2l0bHkgY2FzdGFibGUgdG8gaW1tdXRhYmxlKHR5cGUpLCBhbmQgaXQgaXMKKyAgICogYWxsb3dlZCBmb3IgQUEga2V5cyB3aXRob3V0IGFuIGltbXV0YWJsZSgpIHF1YWxpZmllci4KKyAgICovCisgIGJvb2wgaXNfaW1tdXRhYmxlX3R5cGUodF90eXBlKiB0eXBlKSBjb25zdCB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgICAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpOworICB9CisKKyAgLyoKKyAgICogRmlsZSBzdHJlYW1zLCBzdG9yZWQgaGVyZSB0byBhdm9pZCBwYXNzaW5nIHRoZW0gYXMgcGFyYW1ldGVycyB0byBldmVyeQorICAgKiBmdW5jdGlvbi4KKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworCisgIHN0cmluZyBwYWNrYWdlX2Rpcl87Cit9OworCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGQsICJEIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRjMzMzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI1MTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsMiA9ICJcblxuIjsKKworLyoqCisgKiBVc2UgdGhlIGN1cnJlbnQgVGhyaWZ0IHZlcnNpb24gZm9yIHN0YXRpYyBsaWJyYXJpZXMuICBXaGVuIHJlbGVhc2luZywgdXBkYXRlCisgKiB0aGUgdmVyc2lvbiBpbiB0aGVzZSBmaWxlcy4KKyAqIC0gbGliL2RhcnQvcHVic3BlYy55YW1sCisgKiAtIHRlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwKKyAqIC0gdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCisgKiAtIHR1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sCisgKiAtIHR1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbAorICogU2VlIGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG9jcy9jb21taXR0ZXJzL0hvd1RvVmVyc2lvbgorICovCitzdGF0aWMgY29uc3Qgc3RyaW5nIGRhcnRfdGhyaWZ0X3ZlcnNpb24gPSBUSFJJRlRfVkVSU0lPTjsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpOworCisvKioKKyAqIERhcnQgY29kZSBnZW5lcmF0b3IKKyAqCisgKi8KK2NsYXNzIHRfZGFydF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kYXJ0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBsaWJyYXJ5X25hbWVfID0gIiI7CisgICAgbGlicmFyeV9wcmVmaXhfID0gIiI7CisgICAgcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgcHVic3BlY19saWJfID0gIiI7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibGlicmFyeV9uYW1lIikgPT0gMCkgeworICAgICAgICBsaWJyYXJ5X25hbWVfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImxpYnJhcnlfcHJlZml4IikgPT0gMCkgeworICAgICAgICBsaWJyYXJ5X3ByZWZpeF8gPSAoaXRlci0+c2Vjb25kKSArICIuIjsKKyAgICAgICAgcGFja2FnZV9wcmVmaXhfID0gcmVwbGFjZV9hbGwobGlicmFyeV9wcmVmaXhfLCAiLiIsICIvIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInB1YnNwZWNfbGliIikgPT0gMCkgeworICAgICAgICBwdWJzcGVjX2xpYl8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBkYXJ0OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kYXJ0IjsKKyAgfQorCisgIHZvaWQgc2NvcGVfdXAoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iICIpIHsKKyAgICBvdXQgPDwgcHJlZml4IDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdm9pZCBzY29wZV9kb3duKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBwb3N0Zml4PWVuZGwpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBwb3N0Zml4OworICB9CisKKyAgc3RyaW5nIHJlcGxhY2VfYWxsKHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGwpIHsKKyAgICBzdHJpbmcgc3RyKGNvbnRlbnRzKTsKKworICAgIHNpemVfdCBzbGVuID0gc2VhcmNoLmxlbmd0aCgpOworICAgIHNpemVfdCBybGVuID0gcmVwbC5sZW5ndGgoKTsKKyAgICBzaXplX3QgaW5jciA9IChybGVuID4gMCkgPyBybGVuIDogMTsKKworICAgIGlmIChzbGVuID4gMCkgeworICAgICAgc2l6ZV90IGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoKTsKKyAgICAgIHdoaWxlICgoZm91bmQgIT0gc3RyaW5nOjpucG9zKSAmJiAoZm91bmQgPCBzdHIubGVuZ3RoKCkpKSB7CisgICAgICAgIHN0ci5yZXBsYWNlKGZvdW5kLCBzbGVuLCByZXBsKTsKKyAgICAgICAgZm91bmQgPSBzdHIuZmluZChzZWFyY2gsIGZvdW5kICsgaW5jcik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSwgc3RyaW5nIGNsYXNzX25hbWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9saWJyYXJ5KCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9wdWJzcGVjKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXhwb3J0X2ZpbGVfbmFtZSA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBnZXRfZGFydF90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGluaXRfdmFsdWUodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfbWVtYmVyX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9hcmdzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9yZXN1bHRfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2ZpbGVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NvbnN0YW50c19jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBmaW5kX2xpYnJhcnlfbmFtZSh0X3Byb2dyYW0qIHByb2dyYW0pOworICBzdGQ6OnN0cmluZyBkYXJ0X2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNlcnZpY2VfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBkYXJ0X3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF90dHlwZV9jbGFzc19uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCisgIHZlY3RvcjxzdGQ6OnN0cmluZz4gc3BsaXQoY29uc3Qgc3RyaW5nJiBzLCBjaGFyIGRlbGltKSB7CisgICAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBlbGVtczsKKyAgICBzdHJpbmdzdHJlYW0gc3Mocyk7CisgICAgc3RyaW5nIGl0ZW07CisgICAgd2hpbGUgKGdldGxpbmUoc3MsIGl0ZW0sIGRlbGltKSkgeworICAgICAgZWxlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIH0KKyAgICByZXR1cm4gZWxlbXM7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworCitwcml2YXRlOgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgc3RkOjpzdHJpbmcgbGlicmFyeV9uYW1lXzsKKyAgc3RkOjpzdHJpbmcgbGlicmFyeV9wcmVmaXhfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIHB1YnNwZWNfbGliXzsKKworICBzdGQ6OnN0cmluZyBiYXNlX2Rpcl87CisgIHN0ZDo6c3RyaW5nIHNyY19kaXJfOworICBzdGQ6OnN0cmluZyBsaWJyYXJ5X2V4cG9ydHNfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBpZiAobGlicmFyeV9uYW1lXy5lbXB0eSgpKSB7CisgICAgbGlicmFyeV9uYW1lXyA9IGZpbmRfbGlicmFyeV9uYW1lKHByb2dyYW1fKTsKKyAgfQorCisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgbGlicmFyeV9uYW1lXzsKKyAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICBiYXNlX2Rpcl8gPSBzdWJkaXI7CisKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc3ViZGlyICs9ICIvbGliIjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgc3ViZGlyICs9ICIvc3JjIjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgc3JjX2Rpcl8gPSBzdWJkaXI7CisgIH0gZWxzZSB7CisgICAgc3JjX2Rpcl8gPSBiYXNlX2Rpcl87CisgIH0KK30KKworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmZpbmRfbGlicmFyeV9uYW1lKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdHJpbmcgbmFtZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImRhcnQiKTsKKyAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgIG5hbWUgPSBwcm9ncmFtLT5nZXRfbmFtZSgpOworICB9CisgIG5hbWUgPSByZXBsYWNlX2FsbChuYW1lLCAiLiIsICJfIik7CisgIG5hbWUgPSByZXBsYWNlX2FsbChuYW1lLCAiLSIsICJfIik7CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFRoZSBEYXJ0IGxpYnJhcnkKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgbGlicmFyeSwgZS5nLiAibGlicmFyeSBteXNlcnZpY2U7IgorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6ZGFydF9saWJyYXJ5KHN0cmluZyBmaWxlX25hbWUpIHsKKyAgc3RyaW5nIG91dCA9ICJsaWJyYXJ5ICIgKyBsaWJyYXJ5X3ByZWZpeF8gKyBsaWJyYXJ5X25hbWVfOworICBpZiAoIWZpbGVfbmFtZS5lbXB0eSgpKSB7CisgICAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgICBvdXQgKz0gIi5zcmMuIiArIGZpbGVfbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0ICs9ICIuIiArIGZpbGVfbmFtZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG91dCArICI7XG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIGZvciBzZXJ2aWNlcworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBzZXJ2aWNlcworICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6c2VydmljZV9pbXBvcnRzKCkgeworICByZXR1cm4gImltcG9ydCAnZGFydDphc3luYyc7IiArIGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGRhcnQgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0CisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpkYXJ0X3RocmlmdF9pbXBvcnRzKCkgeworICBzdHJpbmcgaW1wb3J0cyA9ICJpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7IiArIGVuZGwgKworICAgICAgICAgICAgICAgICAgICJpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsiICsgZW5kbDsKKworICAvLyBhZGQgaW1wb3J0IGZvciB0aGlzIGxpYnJhcnkKKyAgaWYgKHBhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBsaWJyYXJ5X25hbWVfICsgIi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCc7IiArIGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBwYWNrYWdlX3ByZWZpeF8gKyBsaWJyYXJ5X25hbWVfICsgIi5kYXJ0JzsiICsgZW5kbDsKKyAgfQorCisgIC8vIGFkZCBpbXBvcnRzIGZvciBpbmNsdWRlZCB0aHJpZnQgZmlsZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHN0cmluZyBpbmNsdWRlX25hbWUgPSBmaW5kX2xpYnJhcnlfbmFtZShpbmNsdWRlc1tpXSk7CisgICAgc3RyaW5nIG5hbWVkX2ltcG9ydCA9ICJ0XyIgKyBpbmNsdWRlX25hbWU7CisgICAgaWYgKHBhY2thZ2VfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgICBpbXBvcnRzICs9ICJpbXBvcnQgJ3BhY2thZ2U6IiArIGluY2x1ZGVfbmFtZSArICIvIiArIGluY2x1ZGVfbmFtZSArICIuZGFydCcgYXMgIiArIG5hbWVkX2ltcG9ydCArICI7IiArIGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGltcG9ydHMgKz0gImltcG9ydCAncGFja2FnZToiICsgcGFja2FnZV9wcmVmaXhfICsgaW5jbHVkZV9uYW1lICsgIi5kYXJ0JyBhcyAiICsgbmFtZWRfaW1wb3J0ICsgIjsiICsgZW5kbDsKKyAgICB9CisgIH0KKworICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBOb3QgdXNlZAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZ2VuZXJhdGVfZGFydF9saWJyYXJ5KCk7CisKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgZ2VuZXJhdGVfZGFydF9wdWJzcGVjKCk7CisgIH0KK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2xpYnJhcnkoKSB7CisgIHN0cmluZyBmX2xpYnJhcnlfbmFtZTsKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgZl9saWJyYXJ5X25hbWUgPSBiYXNlX2Rpcl8gKyAiL2xpYi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCI7CisgIH0gZWxzZSB7CisgICAgZl9saWJyYXJ5X25hbWUgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgbGlicmFyeV9uYW1lXyArICIuZGFydCI7CisgIH0KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfbGlicmFyeTsKKyAgZl9saWJyYXJ5Lm9wZW4oZl9saWJyYXJ5X25hbWUuY19zdHIoKSk7CisKKyAgZl9saWJyYXJ5IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfbGlicmFyeSA8PCAibGlicmFyeSAiIDw8IGxpYnJhcnlfcHJlZml4XyA8PCBsaWJyYXJ5X25hbWVfIDw8ICI7IiA8PCBlbmRsMjsKKyAgZl9saWJyYXJ5IDw8IGxpYnJhcnlfZXhwb3J0c187CisKKyAgZl9saWJyYXJ5LmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6ZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoc3RyaW5nIGZpbGVfbmFtZSwgc3RyaW5nIGNsYXNzX25hbWUpIHsKKyAgc3RyaW5nIHN1YmRpcjsKKyAgaWYgKGxpYnJhcnlfcHJlZml4Xy5lbXB0eSgpKSB7CisgICAgc3ViZGlyID0gInNyYyI7CisgIH0gZWxzZSB7CisgICAgc3ViZGlyID0gbGlicmFyeV9uYW1lXzsKKyAgfQorICBsaWJyYXJ5X2V4cG9ydHNfICs9ICJleHBvcnQgJyIgKyBzdWJkaXIgKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQnIHNob3cgIiArIGNsYXNzX25hbWUgKyAiOyIgKyBlbmRsOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfcHVic3BlYygpIHsKKyAgc3RyaW5nIGZfcHVic3BlY19uYW1lID0gYmFzZV9kaXJfICsgIi9wdWJzcGVjLnlhbWwiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcHVic3BlYzsKKyAgZl9wdWJzcGVjLm9wZW4oZl9wdWJzcGVjX25hbWUuY19zdHIoKSk7CisKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgIm5hbWU6ICIgPDwgbGlicmFyeV9uYW1lXyA8PCBlbmRsOworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAidmVyc2lvbjogMC4wLjEiIDw8IGVuZGw7CisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJkZXNjcmlwdGlvbjogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIiIDw8IGVuZGw7CisgIGZfcHVic3BlYyA8PCBlbmRsOworCisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJlbnZpcm9ubWVudDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAic2RrOiBeMS4xMi4wIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3B1YnNwZWMgPDwgZW5kbDsKKworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAiZGVwZW5kZW5jaWVzOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHB1YnNwZWNfbGliXy5lbXB0eSgpKSB7CisgICAgLy8gZGVmYXVsdCB0byByZWxhdGl2ZSBwYXRoIHdpdGhpbiB3b3JraW5nIGRpcmVjdG9yeSwgd2hpY2ggd29ya3MgZm9yIHRlc3RzCisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInRocmlmdDogICMgXiIgPDwgZGFydF90aHJpZnRfdmVyc2lvbiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3B1YnNwZWMpIDw8ICJwYXRoOiAuLi8uLi8uLi8uLi9saWIvZGFydCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIGNvbnN0IHZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXMgPSBzcGxpdChwdWJzcGVjX2xpYl8sICd8Jyk7CisgICAgZm9yIChzaXplX3QgbGluZV9pbmRleCA9IDA7IGxpbmVfaW5kZXggPCBsaW5lcy5zaXplKCk7IGxpbmVfaW5kZXgrKykgeworICAgICAgaW5kZW50KGZfcHVic3BlYykgPDwgbGluZXNbbGluZV9pbmRleF0gPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBhZGQgaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGFzIGRlcGVuZGVuY2llcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgc3RyaW5nIGluY2x1ZGVfbmFtZSA9IGZpbmRfbGlicmFyeV9uYW1lKGluY2x1ZGVzW2ldKTsKKyAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCBpbmNsdWRlX25hbWUgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgInBhdGg6IC4uLyIgPDwgaW5jbHVkZV9uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfcHVic3BlYyA8PCBlbmRsOworCisgIGZfcHVic3BlYy5jbG9zZSgpOworfQorCisvKioKKyAqIE5vdCB1c2VkCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSk7CisKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gc3JjX2Rpcl8gKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgYWRkIGxpYnJhcnkKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZmlsZV9uYW1lLCBjbGFzc19uYW1lKTsKKyAgZl9lbnVtIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWU7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBjb25zdCBpbnQgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBmaW5hbCBTZXQ8aW50PiBWQUxJRF9WQUxVRVMgPSBuZXcgU2V0LmZyb20oWyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gcG9wdWxhdGUgc2V0CisgICAgaW5kZW50KGZfZW51bSkgPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpOworICAgIGZfZW51bSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIl0pOyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAic3RhdGljIGZpbmFsIE1hcDxpbnQsIFN0cmluZz4gVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGluZGVudChmX2VudW0pIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKTsKKyAgICBmX2VudW0gIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiciIDw8IGVuZGw7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICJ9OyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSBnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUocHJvZ3JhbV9uYW1lXyk7CisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKGNsYXNzX25hbWUpOworCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gc3JjX2Rpcl8gKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisgIGZfY29uc3RzIDw8IGRhcnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGZpbGVfbmFtZSwgY2xhc3NfbmFtZSk7CisgIGluZGVudChmX2NvbnN0cykgPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZTsKKyAgc2NvcGVfdXAoZl9jb25zdHMpOworCisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGZfY29uc3RzIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfY29uc3RzKTsKKworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICJ2YXIgIiA6ICJzdGF0aWMgZmluYWwgIik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWU7CisgICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBvdXQgPDwgbmFtZTsKKyAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKSI7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIuLiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCBuYW1lIDw8ICIgPSI7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IGtleSA8PCAiOiAiIDw8IHZhbCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQsICI7IiArIGVuZGwpOworCisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIjsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuZnJvbShbIiA8PCBlbmRsOworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IHZhbCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl0pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBEYXJ0IHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBkYXJ0X2xpYnJhcnkoZmlsZV9uYW1lKSA8PCBlbmRsOworCisgIHN0cmluZyBpbXBvcnRzOworCisgIGZfc3RydWN0IDw8IGRhcnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgZmFsc2UsIGZpbGVfbmFtZSk7CisKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBEYXJ0IHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXhwb3J0X2ZpbGVfbmFtZSkgeworICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsIHRzdHJ1Y3QpOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgaWYgKCFleHBvcnRfZmlsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShleHBvcnRfZmlsZV9uYW1lLCBjbGFzc19uYW1lKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8ICIgIjsKKworICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UiOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICIsIEV4Y2VwdGlvbiAiOworICB9CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBmaW5hbCBUU3RydWN0IF9TVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KFwiIiA8PCBjbGFzc19uYW1lCisgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWRhcnQsIHByaXZhdGUgZm9yIC1kYXJ0YmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGZpbmFsIFRGaWVsZCBfIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpICsgIiBfIgorICAgICAgICAgICAgICAgIDw8IGdldF9tZW1iZXJfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8IGluaXRfdmFsdWUoKm1faXRlcikgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGNvbnN0IGludCAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJib29sIF9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArIGdldF9tZW1iZXJfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgfQorICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicmVhZChUUHJvdG9jb2wgaXByb3QpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKKyAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkiOworICBzY29wZV91cChvdXQpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOworCisgICAgc2NvcGVfZG93bihvdXQsICIgZWxzZSIpOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwyOworCisgIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQorICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKKyAgaW5kZW50KG91dCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKKyAgICAgICAgICAgICAgICAgImNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIikiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7CisgICAgfQorICB9CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCisvLyBnZW5lcmF0ZXMgZGFydCBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSI7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgZmllbGRfbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIGluZGVudChvdXQpIDw8ICIvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIgPDwgZ2V0X3R0eXBlX2NsYXNzX25hbWUodHlwZSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIgPDwgZmllbGRfbmFtZSA8PCAiKSkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLlVOS05PV04sIFwiVGhlIGZpZWxkICciCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgIDw8ICIkIiA8PCBmaWVsZF9uYW1lIDw8ICJcIik7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAid3JpdGUoVFByb3RvY29sIG9wcm90KSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsMjsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbihfIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAid3JpdGUoVFByb3RvY29sIG9wcm90KSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikiOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKF8iIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQsICIiKTsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJnZXRGaWVsZFZhbHVlKGludCBmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsgIC8vIHN3aXRjaAorICBzY29wZV9kb3duKG91dCwgZW5kbDIpOyAgLy8gbWV0aG9kCit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorICBpbmRlbnQob3V0KSA8PCAic2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCwgT2JqZWN0IHZhbHVlKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAidW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQsICIgZWxzZSIpOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOyAgLy8gc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7ICAvLyBtZXRob2QKK30KKworLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCisgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJvb2wgaXNTZXQoaW50IGZpZWxkSUQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOyAgLy8gc3dpdGNoCisgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7ICAvLyBtZXRob2QKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgRGFydCBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKKyAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudChvdXQpIDw8ICIvLyAiIDw8IGZpZWxkX25hbWUgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiBnZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT4gdGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsMjsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAic2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7CisgICAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKKworICAgIC8vIGlzU2V0IG1ldGhvZAorICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSI7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIG91dCA8PCAiID0+IHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGwyOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiA9PiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsMjsKKyAgICB9CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJ1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiU3RyaW5nIHRvU3RyaW5nKCkiOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcihcIiIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGwyOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgaWYgKCFmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIiwgXCIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIiIgPDwgZmllbGRfbmFtZSA8PCAiOlwiKTsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwibnVsbFwiKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCwgIiBlbHNlIik7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCJCSU5BUllcIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlN0cmluZyAiIDw8IGZpZWxkX25hbWUgPDwgIl9uYW1lID0gIgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X3R0eXBlX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGRfbmFtZSA8PCAiX25hbWUgIT0gbnVsbCkiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoIiA8PCBmaWVsZF9uYW1lIDw8ICJfbmFtZSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIiAoXCIpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkX25hbWUgPDwgIl9uYW1lICE9IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiKVwiKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIilcIik7IiA8PCBlbmRsMjsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldC50b1N0cmluZygpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgZGFydCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2RhcnRfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZXRfZGFydF90eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiVFR5cGUuVk9JRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfZGFydF9nZW5lcmF0b3I6OmdldF9kYXJ0X3R5cGVfc3RyaW5nISIpOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAorICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZGFydF90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKHNlcnZpY2VfbmFtZV8pOworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGRhcnRfbGlicmFyeShmaWxlX25hbWUpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgc2VydmljZV9pbXBvcnRzKCkgPDwgZGFydF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgIH0KKworICBnZW5lcmF0ZV9kYXJ0X2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSBzZXJ2aWNlX25hbWVfOworICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShnZXRfZmlsZV9uYW1lKHNlcnZpY2VfbmFtZV8pLCBjbGFzc19uYW1lKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhYnN0cmFjdCBjbGFzcyAiIDw8IGNsYXNzX25hbWUgPDwgZXh0ZW5kc19pZmFjZTsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGdlbmVyYXRlX2RhcnRfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X3R0eXBlX2NsYXNzX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIkNsaWVudCI7CisgIH0KKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiQ2xpZW50IjsKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZ2V0X2ZpbGVfbmFtZShzZXJ2aWNlX25hbWVfKSwgY2xhc3NfbmFtZSk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBzZXJ2aWNlX25hbWVfOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBjbGFzc19uYW1lIDw8ICIoVFByb3RvY29sIGlwcm90LCBbVFByb3RvY29sIG9wcm90ID0gbnVsbF0pIjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIjogc3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9pcHJvdCA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9vcHJvdCA9IChvcHJvdCA9PSBudWxsKSA/IGlwcm90IDogb3Byb3Q7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBfaXByb3Q7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbCBnZXQgaXByb3QgPT4gX2lwcm90OyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2wgX29wcm90OyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2wgZ2V0IG9wcm90ID0+IF9vcHJvdDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW50IF9zZXFpZCA9IDA7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImludCBnZXQgc2VxaWQgPT4gX3NlcWlkOyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbnQgbmV4dFNlcWlkKCkgPT4gKytfc2VxaWQ7IiA8PCBlbmRsMjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgYXN5bmMiOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9hcmdzX2NsYXNzX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgIDw8ICIsIG5leHRTZXFpZCgpKSk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBhcmdfZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MuIiA8PCBhcmdfZmllbGRfbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCBhcmdfZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3Mud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDI7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImF3YWl0IG9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOyIgPDwgZW5kbDI7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIjsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUQXBwbGljYXRpb25FcnJvciBlcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IGVycm9yOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworCisgICAgICBzdHJpbmcgcmVzdWx0X2NsYXNzID0gZ2V0X3Jlc3VsdF9jbGFzc19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0X2NsYXNzIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0X2NsYXNzIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSI7CisgICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBzdHJpbmcgcmVzdWx0X2ZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIiAhPSBudWxsKSI7CisgICAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHJlc3VsdC4iIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgfQorCisgICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvclR5cGUuTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gdHlwZWRlZgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInR5cGVkZWYgdm9pZCBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IiA8PCBlbmRsMjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBzdHJpbmcgY2xhc3NfbmFtZSA9ICBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3NvciI7CisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGdldF9maWxlX25hbWUoc2VydmljZV9uYW1lXyksIGNsYXNzX25hbWUpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZSA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciI7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBjbGFzc19uYW1lIDw8ICIoIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgaWZhY2UpIjsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICI6IHN1cGVyKGlmYWNlKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUFJPQ0VTU19NQVBbXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiXSA9ICIgPDwgZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZpbmFsIE1hcDxTdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gUFJPQ0VTU19NQVAgPSB7fTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbiA9IFBST0NFU1NfTUFQW21zZy5uYW1lXTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGZuID09IG51bGwpIjsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUQXBwbGljYXRpb25FcnJvciB4ID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yVHlwZS5VTktOT1dOX01FVEhPRCwgIgorICAgICAgICAgIlwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZuKG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsgLy8gcHJvY2VzcyBmdW5jdGlvbgorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7IC8vIGNsYXNzCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGdldF9yZXN1bHRfY2xhc3NfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2RhcnRfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisKKyAgYm9vbCBhd2FpdF9yZXN1bHQgPSAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZ2V0X21lbWJlcl9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSI7CisgIGlmIChhd2FpdF9yZXN1bHQpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgYXN5bmMiOworICB9CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9hcmdzX2NsYXNzX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfcmVzdWx0X2NsYXNzX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkiOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmIChhd2FpdF9yZXN1bHQpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9IGF3YWl0ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgZ2V0X21lbWJlcl9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBzdHJpbmcgcmVzdWx0X2ZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgIiIpOworICAgICAgZl9zZXJ2aWNlXyA8PCAiIG9uICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgPDwgIiBjYXRjaCgiIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICIpIjsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LiIgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCByZXN1bHRfZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCAiICIpOworICAgIGZfc2VydmljZV8gPDwgImNhdGNoICh0aCkiOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gSW50ZXJuYWwgZXJyb3IiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUQXBwbGljYXRpb25FcnJvciB4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvclR5cGUuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgfQorCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIGZpZWxkX25hbWU7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIGZpZWxkX25hbWU7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERhcnQgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgZmllbGRfbmFtZS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpbmRlbnQob3V0KTsKKyAgc2NvcGVfdXAob3V0LCAiIik7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIubGVuZ3RoIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIGZpZWxkX25hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIGZpZWxkX25hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIGZpZWxkX25hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBmaWVsZF9uYW1lOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERhcnQgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIGZpZWxkX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaW5kZW50KG91dCk7CisgIHNjb3BlX3VwKG91dCwgIiIpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2tleSIpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5rZXlzKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpIHx8IHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBEYXJ0IHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHJldHVybiBEYXJ0IHR5cGUgbmFtZSwgaS5lLiBNYXA8S2V5LCBWYWx1ZT4KKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gIk1hcDwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuICJTZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgcmV0dXJuICJMaXN0PCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKworICByZXR1cm4gZ2V0X3R0eXBlX2NsYXNzX25hbWUodHR5cGUpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIERhcnQgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUpIHsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIlVpbnQ4TGlzdCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGFydCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIGZpZWxkX25hbWU7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjogb2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIGZpZWxkX25hbWUsIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUpICsgIigpIjsKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdGQ6OnN0cmluZyByZXR1cm50eXBlOworICBpZiAodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXR1cm50eXBlID0gIkZ1dHVyZSI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJudHlwZSA9ICJGdXR1cmU8IiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj4iOworICB9CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcmV0dXJudHlwZSArICIgIiArIGdldF9tZW1iZXJfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIigiICsgYXJndW1lbnRzICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgZmllbGRfbmFtZTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6aW5pdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgeworICAvLyBEbyBub3QgaW5pdGlhbGl6ZSBvcHRpb25hbCBmaWVsZHMKKyAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHRfdHlwZSogdHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKworICAvLyBHZXQgdGhlIGFjdHVhbCB0eXBlIGZvciBhIHR5cGVkZWYKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICAvLyBPbmx5IGNvbnNpZGVyIGJhc2UgdHlwZXMgZm9yIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24KKyAgaWYgKCF0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAvLyBJbml0aWFsaXplIGJvb2xzLCBpbnRzLCBhbmQgZG91YmxlcyB3aXRoIHNhbmUgZGVmYXVsdHMKKyAgc3RyaW5nIHJlc3VsdDsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmVzdWx0ID0gIiA9IGZhbHNlIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXN1bHQgPSAiID0gMCI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJlc3VsdCA9ICIgPSAwLjAiOworICAgIGJyZWFrOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIHJlc3VsdCA9ICIiOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfbWVtYmVyX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG9sb3dlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9hcmdzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICByZXR1cm4gbmFtZSArICJfYXJncyI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9yZXN1bHRfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHJldHVybiBuYW1lICsgIl9yZXN1bHQiOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZmlsZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgLy8gZS5nLiBjaGFuZ2UgQVBJRm9yRmlsZUlPIHRvIGFwaV9mb3JfZmlsZV9pbworCisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgYm9vbCBpc19wcmV2X2xjID0gdHJ1ZTsKKyAgYm9vbCBpc19jdXJyZW50X2xjID0gdG1wWzBdID09IHRvbG93ZXIodG1wWzBdKTsKKyAgYm9vbCBpc19uZXh0X2xjID0gZmFsc2U7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBjaGFyIGxjID0gdG9sb3dlcih0bXBbaV0pOworCisgICAgaWYgKGkgPT0gbmFtZS5sZW5ndGgoKSAtIDEpIHsKKyAgICAgIGlzX25leHRfbGMgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaXNfbmV4dF9sYyA9ICh0bXBbaSsxXSA9PSB0b2xvd2VyKHRtcFtpKzFdKSk7CisgICAgfQorCisgICAgaWYgKGkgIT0gMCAmJiAhaXNfY3VycmVudF9sYyAmJiAoaXNfcHJldl9sYyB8fCBpc19uZXh0X2xjKSkgeworICAgICAgcmV0ICs9ICJfIjsKKyAgICB9CisgICAgcmV0ICs9IGxjOworCisgICAgaXNfcHJldl9sYyA9IGlzX2N1cnJlbnRfbGM7CisgICAgaXNfY3VycmVudF9sYyA9IGlzX25leHRfbGM7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICAvLyBlLmcuIGNoYW5nZSBteV9ncmVhdF9tb2RlbCB0byBNeUdyZWF0TW9kZWxDb25zdGFudHMKKyAgc3RyaW5nIHJldDsKKyAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOworICBib29sIGlzX3ByZXZfdW5kZXJzY29yZSA9IHRydWU7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAodG1wW2ldID09ICdfJykgeworICAgICAgaXNfcHJldl91bmRlcnNjb3JlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzX3ByZXZfdW5kZXJzY29yZSkgeworICAgICAgICByZXQgKz0gdG91cHBlcih0bXBbaV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ICs9IHRtcFtpXTsKKyAgICAgIH0KKworICAgICAgaXNfcHJldl91bmRlcnNjb3JlID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldCArICJDb25zdGFudHMiOworfQorCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKKworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKKy8qKgorICogRW1pdHMgYSBkb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8vICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBkb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShwLT5nZXRfbmFtZSgpKTsKKyAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IGZpZWxkX25hbWU7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLy8gIiwgc3Muc3RyKCksICIiKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZF9uYW1lKTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF90dHlwZV9jbGFzc19uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHByb2dyYW1fID09IHR0eXBlLT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyBuYW1lZF9pbXBvcnQgPSAidF8iICsgZmluZF9saWJyYXJ5X25hbWUodHR5cGUtPmdldF9wcm9ncmFtKCkpOworICAgIHJldHVybiBuYW1lZF9pbXBvcnQgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGRhcnQsCisgICAgIkRhcnQiLAorICAgICIgICAgbGlicmFyeV9uYW1lOiAgICBPcHRpb25hbCBvdmVycmlkZSBmb3IgbGlicmFyeSBuYW1lLlxuIgorICAgICIgICAgbGlicmFyeV9wcmVmaXg6ICBHZW5lcmF0ZSBjb2RlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aGluIGFuIGV4aXN0aW5nIGxpYnJhcnkuXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFVzZSBhIGRvdC1zZXBhcmF0ZWQgc3RyaW5nLCBlLmcuIFwibXlfcGFyZW50X2xpYi5zcmMuZ2VuXCJcbiIKKyAgICAiICAgIHB1YnNwZWNfbGliOiAgICAgT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIHRocmlmdCBsaWIgZGVwZW5kZW5jeSBpbiBwdWJzcGVjLnlhbWwsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIGUuZy4gXCJ0aHJpZnQ6IDAueC54XCIuICBVc2UgYSBwaXBlIGRlbGltaXRlciB0byBzZXBhcmF0ZSBsaW5lcyxcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgZS5nLiBcInRocmlmdDp8ICBnaXQ6fCAgICB1cmw6IGdpdEBmb28uY29tXCJcbiIKKykKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ3N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNDAxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCitjbGFzcyB0X2RlbHBoaV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9kZWxwaGlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgaW5kZW50X2ltcGxfID0gMDsKKyAgICBoYXNfZm9yd2FyZCA9IGZhbHNlOworICAgIGhhc19lbnVtID0gZmFsc2U7CisgICAgaGFzX2NvbnN0ID0gZmFsc2U7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGFuc2lzdHJfYmluYXJ5XyA9IGZhbHNlOworICAgIHJlZ2lzdGVyX3R5cGVzXyA9IGZhbHNlOworICAgIGNvbnN0cHJlZml4XyA9IGZhbHNlOworICAgIGV2ZW50c18gPSBmYWxzZTsKKyAgICB4bWxkb2NfID0gZmFsc2U7CisgICAgYXN5bmNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYW5zaXN0cl9iaW5hcnkiKSA9PSAwKSB7CisgICAgICAgIGFuc2lzdHJfYmluYXJ5XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJlZ2lzdGVyX3R5cGVzIikgPT0gMCkgeworICAgICAgICByZWdpc3Rlcl90eXBlc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjb25zdHByZWZpeCIpID09IDApIHsKKyAgICAgICAgY29uc3RwcmVmaXhfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXZlbnRzIikgPT0gMCkgeworICAgICAgICBldmVudHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgieG1sZG9jIikgPT0gMCkgeworICAgICAgICB4bWxkb2NfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZGVscGhpOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kZWxwaGkiOworICAgIGVzY2FwZV8uY2xlYXIoKTsKKyAgICBlc2NhcGVfWydcJyddID0gIicnIjsKKyAgfQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgaXNfeGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X3dyaXRlcl8ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJ1Y3RfaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KTsKKworICB2b2lkIGFkZF9kZWxwaGlfdXNlc19saXN0KHN0cmluZyB1bml0bmFtZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgYm9vbCBjb25zdF9uZWVkc192YXIodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBwcmludF9jb25zdF9wcm9wKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfcHJpdmF0ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgaW5pdGlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX25tID0gIiIpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfbm0gPSAiIik7CisgIHN0ZDo6c3RyaW5nIG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgYm9vbCBmb3JfYXN5bmMpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworCisgIHZvaWQgZGVscGhpX3R5cGVfdXNpbmdzKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgc3RkOjpzdHJpbmcgZGVscGhpX3RocmlmdF91c2luZ3MoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9jbHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19wb3N0Zml4ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX2ZhY3RvcnkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBub3JtYWxpemVfY2xzbm0oc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9ub19jaGVja19rZXl3b3JkID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2RlbHBoaV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHN0ZDo6c3RyaW5nIGlucHV0X2FyZ19wcmVmaXgodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yX2FzeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZnVsbF9jbHMgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBjdXJyZW50X2luZGVudCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoc3RyaW5nIG5hbWUpOworCisgIHZvaWQgd3JpdGVfZW51bShzdGQ6OnN0cmluZyBsaW5lKTsKKyAgdm9pZCB3cml0ZV9mb3J3YXJkX2RlY3Ioc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfY29uc3Qoc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfc3RydWN0KHN0ZDo6c3RyaW5nIGxpbmUpOworICB2b2lkIHdyaXRlX3NlcnZpY2Uoc3RkOjpzdHJpbmcgbGluZSk7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIoKipcbiIpICsgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgICArICIgKlxuIiArICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIiAqKVxuIjsKKyAgfQorCisgIHN0cmluZyByZXBsYWNlX2FsbChzdHJpbmcgY29udGVudHMsIHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsYWNlKTsKKyAgc3RyaW5nIHhtbF9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKTsKKyAgc3RyaW5nIHhtbGRvY19lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKTsKKyAgc3RyaW5nIHhtbGF0dHJpYl9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19mb3J3YXJkX2RlY3I7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2VudW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2NvbnN0OworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zdHJ1Y3Q7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3NlcnZpY2U7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2NvbnN0X2ltcGw7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3N0cnVjdF9pbXBsOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zZXJ2aWNlX2ltcGw7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb247CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3R5cGVfZmFjdG9yeV9mdW5jczsKKyAgYm9vbCBoYXNfZm9yd2FyZDsKKyAgYm9vbCBoYXNfZW51bTsKKyAgYm9vbCBoYXNfY29uc3Q7CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfa2V5d29yZHM7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9yZXNlcnZlZF9tZXRob2Q7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiB0eXBlc19rbm93bjsKKyAgc3RkOjpsaXN0PHRfdHlwZWRlZio+IHR5cGVkZWZzX3BlbmRpbmc7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB1c2VzX2xpc3Q7CisgIHZvaWQgY3JlYXRlX2tleXdvcmRzKCk7CisgIGJvb2wgZmluZF9rZXl3b3JkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+JiBrZXl3b3JkX21hcCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9tZXRob2QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9tZXRob2QgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGVtcHR5X3ZhbHVlKHRfdHlwZSogdHlwZSk7CisgIGJvb2wgaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpOworICB2b2lkIGFkZF9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgaW5pdF9rbm93bl90eXBlc19saXN0KCk7CisgIGJvb2wgaXNfdm9pZCh0X3R5cGUqIHR5cGUpOworICBpbnQgaW5kZW50X2ltcGxfOworICBib29sIGFuc2lzdHJfYmluYXJ5XzsKKyAgYm9vbCByZWdpc3Rlcl90eXBlc187CisgIGJvb2wgY29uc3RwcmVmaXhfOworICBib29sIGV2ZW50c187CisgIGJvb2wgeG1sZG9jXzsKKyAgYm9vbCBhc3luY187CisgIHZvaWQgaW5kZW50X3VwX2ltcGwoKSB7ICsraW5kZW50X2ltcGxfOyB9OworICB2b2lkIGluZGVudF9kb3duX2ltcGwoKSB7IC0taW5kZW50X2ltcGxfOyB9OworICBzdGQ6OnN0cmluZyBpbmRlbnRfaW1wbCgpIHsKKyAgICBzdGQ6OnN0cmluZyBpbmQgPSAiIjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50X2ltcGxfOyArK2kpIHsKKyAgICAgIGluZCArPSAiICAiOworICAgIH0KKyAgICByZXR1cm4gaW5kOworICB9OworICBzdGQ6Om9zdHJlYW0mIGluZGVudF9pbXBsKHN0ZDo6b3N0cmVhbSYgb3MpIHsgcmV0dXJuIG9zIDw8IGluZGVudF9pbXBsKCk7IH07Cit9OworCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZXBsYWNlX2FsbChzdHJpbmcgY29udGVudHMsIHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsKSB7CisgIHN0cmluZyBzdHIoY29udGVudHMpOworCisgIHNpemVfdCBzbGVuID0gc2VhcmNoLmxlbmd0aCgpOworICBzaXplX3QgcmxlbiA9IHJlcGwubGVuZ3RoKCk7CisgIHNpemVfdCBpbmNyID0gKHJsZW4gPiAwKSA/IHJsZW4gOiAxOworCisgIGlmIChzbGVuID4gMCkgeworICAgIHNpemVfdCBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCk7CisgICAgd2hpbGUgKChmb3VuZCAhPSBzdHJpbmc6Om5wb3MpICYmIChmb3VuZCA8IHN0ci5sZW5ndGgoKSkpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGZvdW5kLCBzbGVuLCByZXBsKTsKKyAgICAgIGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoLCBmb3VuZCArIGluY3IpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8vIFhNTCBlbmNvZGluZworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKKyAgc3RyaW5nIHN0cihjb250ZW50cyk7CisKKyAgLy8gZXNjYXBlIHRoZSBlc2NhcGUKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiJiIsICImYW1wOyIpOworCisgIC8vIG90aGVyIHN0YW5kYXJkIFhNTCBlbnRpdGllcworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICI8IiwgIiZsdDsiKTsKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiPiIsICImZ3Q7Iik7CisKKyAgcmV0dXJuIHN0cjsKK30KKworLy8gWE1MIGF0dHJpYnV0ZSBlbmNvZGluZworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sYXR0cmliX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKKyAgc3RyaW5nIHN0cih4bWxfZW5jb2RlKGNvbnRlbnRzKSk7CisKKyAgLy8gb3VyIGF0dHJpYnMgYXJlIGVuY2xvc2VkIGluICIKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXCIiLCAiXFxcIiIpOworCisgIHJldHVybiBzdHI7Cit9CisKKy8vIFhNTCBlbmNvZGluZyBmb3IgZG9jIGNvbW1lbnRzCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjp4bWxkb2NfZW5jb2RlKHN0cmluZyBjb250ZW50cykgeworICBzdHJpbmcgc3RyKHhtbF9lbmNvZGUoY29udGVudHMpKTsKKworICAvLyBYTUxEb2Mgc3BlY2lmaWM6IGNvbnZlcnQgbGluZWJyZWFrcyBpbnRvIDxwYXJhPmdyYXBoczwvcGFyYT4KKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXHJcbiIsICJcciIpOworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcbiIsICJcciIpOworICBzdHIgPSByZXBsYWNlX2FsbChzdHIsICJcciIsICI8L3BhcmE+XG48cGFyYT4iKTsKKworICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7CisgIGlmICh4bWxkb2NfKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JFJFR0lPTiAnWE1MRG9jJ30vLy8gPHN1bW1hcnk+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHBhcmE+IiArIGNvbnRlbnRzICsgIjwvcGFyYT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gPC9zdW1tYXJ5PlxueyRFTkRSRUdJT059XG4iKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICh4bWxkb2NfKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0geG1sZG9jX2VuY29kZShmaWVsZC0+Z2V0X2RvYygpKSArICJcbjxzZWVhbHNvIGNyZWY9XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgeG1sZG9jX2VuY29kZSh0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpKSArICJcIi8+IjsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSAmJiB4bWxkb2NfKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KG91dCwgeG1sZG9jX2VuY29kZSh0ZG9jLT5nZXRfZG9jKCkpKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkgJiYgeG1sZG9jXykgeworICAgIHN0cmluZ3N0cmVhbSBwczsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHBzIDw8ICJcbjxwYXJhbSBuYW1lPVwiIiA8PCB4bWxhdHRyaWJfZW5jb2RlKHAtPmdldF9uYW1lKCkpIDw8ICJcIj4iOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7CisgICAgICAgIHN0ci5lcmFzZShzdGQ6OnJlbW92ZShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCAnXG4nKSwKKyAgICAgICAgICAgICAgICAgIHN0ci5lbmQoKSk7IC8vIHJlbW92ZSB0aGUgbmV3bGluZXMgdGhhdCBhcHBlYXIgZnJvbSB0aGUgcGFyc2VyCisgICAgICAgIHBzIDw8IHhtbGRvY19lbmNvZGUoc3RyKTsKKyAgICAgIH0KKyAgICAgIHBzIDw8ICI8L3BhcmFtPiI7CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRSRUdJT04gJ1hNTERvYyd9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdW1tYXJ5PjxwYXJhPiIgKyB4bWxkb2NfZW5jb2RlKHRmdW5jdGlvbi0+Z2V0X2RvYygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvcGFyYT48L3N1bW1hcnk+IiArIHBzLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7JEVORFJFR0lPTn1cbiIpOworICB9Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmaW5kX2tleXdvcmQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4mIGtleXdvcmRfbWFwLCBzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gbmFtZS5sZW5ndGgoKTsKKworICBpZiAobGVuIDw9IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIG5sYXN0ID0gbmFtZS5maW5kX2xhc3Rfb2YoJ18nKTsKKworICBpZiAobmxhc3QgPj0gMSkgeworICAgIGlmIChubGFzdCA9PSAobGVuIC0gMSkpIHsKKyAgICAgIHN0cmluZyBuZXdfbmFtZShuYW1lLCAwLCBubGFzdCk7CisgICAgICByZXR1cm4gZmluZF9rZXl3b3JkKGtleXdvcmRfbWFwLCBuZXdfbmFtZSk7CisgICAgfQorICB9CisgIHJldHVybiAoa2V5d29yZF9tYXBbbmFtZV0gPT0gMSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9tZXRob2QpIHsKKyAgc3RyaW5nIHRtcChuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oc3RkOjp0b2xvd2VyKSk7CisKKyAgYm9vbCBiX2ZvdW5kID0gZmFsc2U7CisKKyAgaWYgKGZpbmRfa2V5d29yZChkZWxwaGlfa2V5d29yZHMsIHRtcCkpIHsKKyAgICBiX2ZvdW5kID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChiX21ldGhvZCAmJiBmaW5kX2tleXdvcmQoZGVscGhpX3Jlc2VydmVkX21ldGhvZCwgdG1wKSkgeworICAgIGJfZm91bmQgPSB0cnVlOworICB9IGVsc2UgaWYgKGJfZXhjZXB0aW9uX21ldGhvZCAmJiBmaW5kX2tleXdvcmQoZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb24sIHRtcCkpIHsKKyAgICBiX2ZvdW5kID0gdHJ1ZTsKKyAgfQorCisgIGlmIChiX2ZvdW5kKSB7CisgICAgcmV0dXJuIG5hbWUgKyAiXyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmNyZWF0ZV9rZXl3b3JkcygpIHsKKyAgZGVscGhpX2tleXdvcmRzWyJhbmQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZW5kIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImludGVyZmFjZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyYWlzZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ1c2VzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFycmF5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImV4Y2VwdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJyZWNvcmQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidmFyIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImV4cG9ydHMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibGFiZWwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmVwZWF0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIndoaWxlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFzbSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmaWxlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImxpYnJhcnkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmVzb3VyY2VzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sid2l0aCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJiZWdpbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmaW5hbGl6YXRpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sibW9kIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNldCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ4b3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY2FzZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJmaW5hbGx5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm5pbCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzaGwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZm9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm5vdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzaHIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY29uc3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZnVuY3Rpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJjb25zdHJ1Y3RvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm9mIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRoZW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZGVzdHJ1Y3RvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpZiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aHJlYWR2YXIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZGlzcGludGVyZmFjZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbXBsZW1lbnRhdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvdXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZGl2Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImluIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInBhY2tlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW5oZXJpdGVkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByb2NlZHVyZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0eXBlIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRvd250byJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbml0aWFsaXphdGlvbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm9ncmFtIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInVuaXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZWxzZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbmxpbmUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJvcGVydHkiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidW50aWwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInB1Ymxpc2hlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhdXRvbWF0ZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib24iXSA9IDE7CisKKyAgLy8gcmVzZXJ2ZWQvcHJlZGVmaW5lZCB2YXJpYWJsZXMgYW5kIHR5cGVzIChsb3dlcmNhc2UhKQorICBkZWxwaGlfa2V5d29yZHNbInJlc3VsdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzeXN0ZW0iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3lzdXRpbHMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGhyaWZ0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRieXRlcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0b2JqZWN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRjbGFzcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aW50ZXJmYWNlZG9iamVjdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhbnNpc3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJib29sZWFuIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNob3J0aW50Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInNtYWxsaW50Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImludGVnZXIiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW50NjQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworCisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNyZWF0ZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZnJlZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5pdGluc3RhbmNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGVhbnVwaW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzdHlwZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NuYW1lIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc25hbWVpcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NwYXJlbnQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzaW5mbyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5zdGFuY2VzaXplIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbmhlcml0c2Zyb20iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZG5hbWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZpZWxkYWRkcmVzcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZmllbGRhZGRyZXNzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZWVudHJ5Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2V0YWJsZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsidW5pdG5hbWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImVxdWFscyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aGFzaGNvZGUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInRvc3RyaW5nIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJzYWZlY2FsbGV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiYWZ0ZXJjb25zdHJ1Y3Rpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImJlZm9yZWRlc3RydWN0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkaXNwYXRjaCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGVmYXVsdGhhbmRsZXIiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm5ld2luc3RhbmNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmcmVlaW5zdGFuY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRlc3Ryb3kiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInJlYWQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIndyaXRlIl0gPSAxOworCisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzZXRpbm5lcmV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInNldHN0YWNraW5mbyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldHN0YWNrdHJhY2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJyYWlzaW5nZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlZm10Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzZm10Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlaGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWZtdGhlbHAiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzZm10aGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldGJhc2VleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJiYXNlZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiaGVscGNvbnRleHQiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJpbm5lcmV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bIm1lc3NhZ2UiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzdGFja3RyYWNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic3RhY2tpbmZvIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0ZXhjZXB0aW9uc3RhY2tpbmZvcHJvYyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldHN0YWNraW5mb3N0cmluZ3Byb2MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjbGVhbnVwc3RhY2tpbmZvcHJvYyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInJhaXNlb3V0ZXJleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJ0aHJvd291dGVyZXhjZXB0aW9uIl0gPSAxOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6YWRkX2RlbHBoaV91c2VzX2xpc3Qoc3RyaW5nIHVuaXRuYW1lKSB7CisgIHZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgYm9vbCBmb3VuZCA9IGZhbHNlOworICBmb3IgKHNfaXRlciA9IHVzZXNfbGlzdC5iZWdpbigpOyBzX2l0ZXIgIT0gdXNlc19saXN0LmVuZCgpOyArK3NfaXRlcikgeworICAgIGlmICgoKnNfaXRlcikgPT0gdW5pdG5hbWUpIHsKKyAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIWZvdW5kKSB7CisgICAgdXNlc19saXN0LnB1c2hfYmFjayh1bml0bmFtZSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBpbmRlbnRfaW1wbF8gPSAwOworICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZGVscGhpIik7CisgIGhhc19mb3J3YXJkID0gZmFsc2U7CisgIGhhc19lbnVtID0gZmFsc2U7CisgIGhhc19jb25zdCA9IGZhbHNlOworICBjcmVhdGVfa2V5d29yZHMoKTsKKworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiQ2xhc3NlcyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiU3lzVXRpbHMiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIkdlbmVyaWNzLkNvbGxlY3Rpb25zIik7CisgIGlmKGFzeW5jXykgeworICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJTeXN0ZW0uVGhyZWFkaW5nIik7CisgIH0KKworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0Iik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVXRpbHMiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5Db2xsZWN0aW9ucyIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LlByb3RvY29sIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVHJhbnNwb3J0Iik7CisgIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKKyAgICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LlR5cGVSZWdpc3RyeSIpOworICB9CisKKyAgaW5pdF9rbm93bl90eXBlc19saXN0KCk7CisKKyAgc3RyaW5nIHVuaXRuYW1lLCBuc25hbWU7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICB1bml0bmFtZSA9IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpOworICAgIG5zbmFtZSA9IGluY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKKyAgICBpZiAoIiIgIT0gbnNuYW1lKSB7CisgICAgICB1bml0bmFtZSA9IG5vcm1hbGl6ZV9uYW1lKG5zbmFtZSk7CisgICAgfQorICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KHVuaXRuYW1lKTsKKyAgfQorCisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIHN0ZDo6c3RyaW5nIHVuaXRuYW1lID0gcHJvZ3JhbV9uYW1lXzsKKyAgaWYgKCIiICE9IG5hbWVzcGFjZV9uYW1lXykgeworICAgIHVuaXRuYW1lID0gbmFtZXNwYWNlX25hbWVfOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXVuaXRuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHVuaXRuYW1lW2ldID09ICcgJykgeworICAgICAgdW5pdG5hbWUucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHVuaXRuYW1lID0gbm9ybWFsaXplX25hbWUodW5pdG5hbWUpOworICAKKyAgc3RkOjpzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHVuaXRuYW1lICsgIi5wYXMiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfYWxsOworCisgIGZfYWxsLm9wZW4oZl9uYW1lLmNfc3RyKCkpOworCisgIGZfYWxsIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2MoZl9hbGwsIHByb2dyYW1fKTsKKyAgZl9hbGwgPDwgInVuaXQgIiA8PCB1bml0bmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICBmX2FsbCA8PCAiaW50ZXJmYWNlIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfYWxsIDw8ICJ1c2VzIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgZm9yIChzX2l0ZXIgPSB1c2VzX2xpc3QuYmVnaW4oKTsgc19pdGVyICE9IHVzZXNfbGlzdC5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICBpZiAoc19pdGVyICE9IHVzZXNfbGlzdC5iZWdpbigpKSB7CisgICAgICBmX2FsbCA8PCAiLCI7CisgICAgICBmX2FsbCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQoZl9hbGwpIDw8ICpzX2l0ZXI7CisgIH0KKworICBmX2FsbCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgc3RyaW5nIHRtcF91bml0KHVuaXRuYW1lKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXRtcF91bml0LnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHRtcF91bml0W2ldID09ICcuJykgeworICAgICAgdG1wX3VuaXQucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIGZfYWxsIDw8ICJjb25zdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0CisgICAgICAgICAgICAgICAgPDwgIl9PcHRpb25fQW5zaVN0cl9CaW5hcnkgPSAiIDw8IChhbnNpc3RyX2JpbmFyeV8gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdAorICAgICAgICAgICAgICAgIDw8ICJfT3B0aW9uX1JlZ2lzdGVyX1R5cGVzID0gIiA8PCAocmVnaXN0ZXJfdHlwZXNfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQKKyAgICAgICAgICAgICAgICA8PCAiX09wdGlvbl9Db25zdFByZWZpeCAgICA9ICIgPDwgKGNvbnN0cHJlZml4XyA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdCA8PCAiX09wdGlvbl9FdmVudHMgICAgICAgICA9ICIgPDwgKGV2ZW50c18gPyAiVHJ1ZSIgOiAiRmFsc2UiKQorICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdCA8PCAiX09wdGlvbl9YbWxEb2MgICAgICAgICA9ICIgPDwgKHhtbGRvY18gPyAiVHJ1ZSIgOiAiRmFsc2UiKQorICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGZfYWxsIDw8IGVuZGw7CisgIGZfYWxsIDw8ICJ0eXBlIiA8PCBlbmRsOworICBpZiAoaGFzX2ZvcndhcmQpIHsKKyAgICBmX2FsbCA8PCBzX2ZvcndhcmRfZGVjci5zdHIoKSA8PCBlbmRsOworICB9CisgIGlmIChoYXNfZW51bSkgeworICAgIGluZGVudChmX2FsbCkgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9hbGwpIDw8ICJ7JFNDT1BFREVOVU1TIE9OfSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfYWxsIDw8IHNfZW51bS5zdHIoKTsKKyAgICBpbmRlbnQoZl9hbGwpIDw8ICJ7JFNDT1BFREVOVU1TIE9GRn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBzX3N0cnVjdC5zdHIoKTsKKyAgZl9hbGwgPDwgc19zZXJ2aWNlLnN0cigpOworICBmX2FsbCA8PCBzX2NvbnN0LnN0cigpOworICBmX2FsbCA8PCAiaW1wbGVtZW50YXRpb24iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9hbGwgPDwgc19zdHJ1Y3RfaW1wbC5zdHIoKTsKKyAgZl9hbGwgPDwgc19zZXJ2aWNlX2ltcGwuc3RyKCk7CisgIGZfYWxsIDw8IHNfY29uc3RfaW1wbC5zdHIoKTsKKworICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgZl9hbGwgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAiLy8gVHlwZSBmYWN0b3J5IG1ldGhvZHMgYW5kIHJlZ2lzdHJhdGlvbiIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCBzX3R5cGVfZmFjdG9yeV9mdW5jcy5zdHIoKTsKKyAgICBmX2FsbCA8PCAicHJvY2VkdXJlIFJlZ2lzdGVyVHlwZUZhY3RvcmllczsiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGZfYWxsIDw8IHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbi5zdHIoKTsKKyAgICBmX2FsbCA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBlbmRsOworCisgIHN0cmluZyBjb25zdGFudHNfY2xhc3MgPSBtYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKTsKKworICBmX2FsbCA8PCAiaW5pdGlhbGl6YXRpb24iIDw8IGVuZGw7CisgIGlmIChoYXNfY29uc3QpIHsKKyAgICBmX2FsbCA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfSAgLy8gRDIwMTAiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgIiAgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0luaXRpYWxpemU7IiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKKyAgfQorICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgZl9hbGwgPDwgIiAgUmVnaXN0ZXJUeXBlRmFjdG9yaWVzOyIgPDwgZW5kbDsKKyAgfQorICBmX2FsbCA8PCBlbmRsOworCisgIGZfYWxsIDw8ICJmaW5hbGl6YXRpb24iIDw8IGVuZGw7CisgIGlmIChoYXNfY29uc3QpIHsKKyAgICBmX2FsbCA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfSAgLy8gRDIwMTAiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgIiAgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0ZpbmFsaXplOyIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAieyRJRkVORH0iIDw8IGVuZGw7CisgIH0KKyAgZl9hbGwgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfYWxsIDw8ICJlbmQuIiA8PCBlbmRsOworICBmX2FsbC5jbG9zZSgpOworCisgIGlmICghdHlwZWRlZnNfcGVuZGluZy5lbXB0eSgpKSB7CisgICAgcHdhcm5pbmcoMCwgIiVkIHR5cGVkZWZzIHdpdGggdW5yZXNvbHZlZCB0eXBlIHJlZmVyZW5jZXMgbGVmdDpcbiIsIHR5cGVkZWZzX3BlbmRpbmcuc2l6ZSgpKTsKKyAgICBmb3IgKHN0ZDo6bGlzdDx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgaXRlciA9IHR5cGVkZWZzX3BlbmRpbmcuYmVnaW4oKTsKKyAgICAgICAgIHR5cGVkZWZzX3BlbmRpbmcuZW5kKCkgIT0gaXRlcjsKKyAgICAgICAgICsraXRlcikgeworICAgICAgcHdhcm5pbmcoMCwgIi0gJXNcbiIsICgqaXRlciktPmdldF9zeW1ib2xpYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6ZGVscGhpX3R5cGVfdXNpbmdzKG9zdHJlYW0mIG91dCkgeworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIkNsYXNzZXMsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywgVGhyaWZ0LkNvbGxlY3Rpb25zLCBUaHJpZnQuUHJvdG9jb2wsIgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiVGhyaWZ0LlRyYW5zcG9ydDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gRm9yd2FyZCBkZWNsYXJlIHN0cnVjdCBkZWYKKyAgaGFzX2ZvcndhcmQgPSB0cnVlOworICBwdmVyYm9zZSgiZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiAlc1xuIiwgdHlwZV9uYW1lKHRzdHJ1Y3QpLmNfc3RyKCkpOworCisgIHN0cmluZyB3aGF0ID0gdHN0cnVjdC0+aXNfeGNlcHRpb24oKSA/ICJjbGFzcyIgOiAiaW50ZXJmYWNlIjsKKworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfZm9yd2FyZF9kZWNyKSA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSwgdHJ1ZSkgPDwgIiA9ICIgPDwgd2hhdCA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGFkZF9kZWZpbmVkX3R5cGUodHN0cnVjdCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgdF90eXBlKiB0eXBlID0gdHR5cGVkZWYtPmdldF90eXBlKCk7CisKKyAgLy8gd3JpdGUgbm93IG9yIHNhdmUgZm9yIGxhdGVyPworICBpZiAoIWlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0eXBlKSkgeworICAgIHB2ZXJib3NlKCJ0eXBlZGVmICVzOiB1bnJlc29sdmVkIGRlcGVuZGVuY2llcyBmb3VuZFxuIiwgdHlwZV9uYW1lKHR0eXBlZGVmKS5jX3N0cigpKTsKKyAgICB0eXBlZGVmc19wZW5kaW5nLnB1c2hfYmFjayh0dHlwZWRlZik7CisgICAgcmV0dXJuOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zdHJ1Y3QsIHR0eXBlZGVmKTsKKyAgaW5kZW50KHNfc3RydWN0KSA8PCB0eXBlX25hbWUodHR5cGVkZWYpIDw8ICIgPSAiOworCisgIC8vIGNvbW1lbnRlZCBvdXQ6IHRoZSBiZW5lZml0IGlzIG5vdCBiaWcgZW5vdWdoIHRvIHJpc2sgYnJlYWtpbmcgZXhpc3RpbmcgY29kZQorICAvLyBib29sIGNvbnRhaW5lciA9IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKTsKKyAgLy8gaWYoICEgY29udGFpbmVyKQorICAvLyAgc19zdHJ1Y3QgPDwgInR5cGUgIjsgIC8vdGhlICJ0eXBlIEEgPSB0eXBlIEIiIHN5bnRheCBsZWFkcyB0byBFMjU3NCB3aXRoIGdlbmVyaWNzCisKKyAgc19zdHJ1Y3QgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGFkZF9kZWZpbmVkX3R5cGUodHR5cGVkZWYpOworfQorCitib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6aXNfZnVsbHlfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKChOVUxMICE9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpKSAmJiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gcHJvZ3JhbV8pKSB7CisgICAgdF9zY29wZSogc2NvcGUgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+c2NvcGUoKTsKKyAgICBpZiAoTlVMTCAhPSBzY29wZS0+Z2V0X3R5cGUodHR5cGUtPmdldF9uYW1lKCkpKSB7CisgICAgICAvLyBwcmludGYoInR5cGUgJXMgZm91bmQgaW4gaW5jbHVkZWQgc2NvcGUgJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAvLyB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuICgxID09IHR5cGVzX2tub3duW3R5cGVfbmFtZSh0dHlwZSldKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gKDEgPT0gdHlwZXNfa25vd25bYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSldKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHRydWU7IC8vIGVudW1zIGFyZSB3cml0dGVuIGZpcnN0LCBiZWZvcmUgYWxsIG90aGVyIHR5cGVzCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICYmIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIH0KKworICByZXR1cm4gKDEgPT0gdHlwZXNfa25vd25bdHlwZV9uYW1lKHR0eXBlKV0pOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6YWRkX2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIC8vIG1hcmsgYXMga25vd24gdHlwZQorICB0eXBlc19rbm93blt0eXBlX25hbWUodHR5cGUpXSA9IDE7CisKKyAgLy8gY2hlY2sgYWxsIHBlbmRpbmcgdHlwZWRlZnMKKyAgc3RkOjpsaXN0PHRfdHlwZWRlZio+OjppdGVyYXRvciBpdGVyOworICBib29sIG1vcmUgPSB0cnVlOworICB3aGlsZSAobW9yZSAmJiAoIXR5cGVkZWZzX3BlbmRpbmcuZW1wdHkoKSkpIHsKKyAgICBtb3JlID0gZmFsc2U7CisKKyAgICBmb3IgKGl0ZXIgPSB0eXBlZGVmc19wZW5kaW5nLmJlZ2luKCk7IHR5cGVkZWZzX3BlbmRpbmcuZW5kKCkgIT0gaXRlcjsgKytpdGVyKSB7CisgICAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKCppdGVyKTsKKyAgICAgIGlmIChpc19mdWxseV9kZWZpbmVkX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpKSB7CisgICAgICAgIHB2ZXJib3NlKCJ0eXBlZGVmICVzOiBhbGwgcGVuZGluZyByZWZlcmVuY2VzIGFyZSBub3cgcmVzb2x2ZWRcbiIsCisgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSh0dHlwZWRlZikuY19zdHIoKSk7CisgICAgICAgIHR5cGVkZWZzX3BlbmRpbmcuZXJhc2UoaXRlcik7CisgICAgICAgIGdlbmVyYXRlX3R5cGVkZWYodHR5cGVkZWYpOworICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0X2tub3duX3R5cGVzX2xpc3QoKSB7CisgIC8vIGtub3duIGJhc2UgdHlwZXMKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9zdHJpbmcpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfYmluYXJ5KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2Jvb2wpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTgpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTE2KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2kzMildID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pNjQpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfZG91YmxlKV0gPSAxOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGhhc19lbnVtID0gdHJ1ZTsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19lbnVtLCB0ZW51bSk7CisgIGluZGVudChzX2VudW0pIDw8IHR5cGVfbmFtZSh0ZW51bSwgdHJ1ZSwgdHJ1ZSkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgIigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgaWYgKGNvbnN0YW50cy5lbXB0eSgpKSB7CisgICAgaW5kZW50KHNfZW51bSkgPDwgImR1bW15ID0gMCAgLy8gZW1wdHkgZW51bXMgYXJlIG5vdCBhbGxvd2VkIjsKKyAgfSBlbHNlIHsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpIHsKKyAgICAgICAgc19lbnVtIDw8ICIsIjsKKyAgICAgICAgc19lbnVtIDw8IGVuZGw7CisgICAgICB9CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfZW51bSwgKmNfaXRlcik7CisgICAgICBpbmRlbnQoc19lbnVtKSA8PCBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IHZhbHVlOworICAgIH0KKyAgfQorICBzX2VudW0gPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfZW51bSkgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjptYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKSB7CisgIGlmIChjb25zdHByZWZpeF8pIHsKKyAgICByZXR1cm4gbWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcigiVCIgKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cyIpOworICB9IGVsc2UgeworICAgIHJldHVybiAiVENvbnN0YW50cyI7IC8vIGNvbXBhdGliaWxpdHkKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaGFzX2NvbnN0ID0gdHJ1ZTsKKyAgc3RyaW5nIGNvbnN0YW50c19jbGFzcyA9IG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOworCisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19jb25zdCkgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIiA9IGNsYXNzIiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgInByaXZhdGUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBwcmludF9wcml2YXRlX2ZpZWxkKHNfY29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX2NvbnN0KSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfY29uc3QsICpjX2l0ZXIpOworICAgIHByaW50X2NvbnN0X3Byb3Aoc19jb25zdCwKKyAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorICBpbmRlbnQoc19jb25zdCkgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9IiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgImNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudChzX2NvbnN0KSA8PCAiY2xhc3MgZGVzdHJ1Y3RvciBEZXN0cm95OyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnMsIGNvZGU7CisKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCisgICAgICAgICAgICAgICAgICAgICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgIkYiICsgcHJvcF9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImNsYXNzIGNvbnN0cnVjdG9yICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIi5DcmVhdGU7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaWYgKCF2YXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgc19jb25zdF9pbXBsIDw8IHZhcnMuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGlmICghY29kZS5zdHIoKS5lbXB0eSgpKSB7CisgICAgc19jb25zdF9pbXBsIDw8IGNvZGUuc3RyKCk7CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJjbGFzcyBkZXN0cnVjdG9yICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIi5EZXN0cm95OyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoY29uc3RfbmVlZHNfdmFyKCgqY19pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGZpbmFsaXplX2ZpZWxkKHNfY29uc3RfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JEVMU0V9IiA8PCBlbmRsOworCisgIHZhcnMuc3RyKCIiKTsKKyAgY29kZS5zdHIoIiIpOworCisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c19jbGFzcyArICIuRiIgKyBwcm9wX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInByb2NlZHVyZSAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfSW5pdGlhbGl6ZTsiIDw8IGVuZGw7CisgIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICAgIHNfY29uc3RfaW1wbCA8PCB2YXJzLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgeworICAgIHNfY29uc3RfaW1wbCA8PCBjb2RlLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJwcm9jZWR1cmUgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0ZpbmFsaXplOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZmluYWxpemVfZmllbGQoc19jb25zdF9pbXBsLAorICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzX2NsYXNzKTsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUZFTkR9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfbm0pIHsKKworICBzdHJpbmcgY2xzX3ByZWZpeDsKKworICBpZiAoY2xzX25tID09ICIiKSB7CisgICAgY2xzX3ByZWZpeCA9ICIiOworICB9IGVsc2UgeworICAgIGNsc19wcmVmaXggPSBjbHNfbm0gKyAiLiI7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIlsiIDw8IGtleSA8PCAiXSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X3ByaXZhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKXZhbHVlOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgdmFyIEYiIDw8IG5hbWUgPDwgIjogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIjsiIDw8IGVuZGw7Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdF9uZWVkc192YXIodF90eXBlKiB0eXBlKSB7CisgIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOworICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorICByZXR1cm4gKCF0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfcHJvcChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpdmFsdWU7CisgIGlmIChjb25zdF9uZWVkc192YXIodHlwZSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgcHJvcGVydHkgIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgcmVhZCBGIiA8PCBuYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhcnM7IC8vIGR1bW15CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIC8vIGFscmVhZHkgZG9uZQorICAgIC8vIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZSggdmFycywgb3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgLy8gaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0cmluZyB0eXBuYW1lOworICAgIHR5cG5hbWUgPSB0eXBlX25hbWUodHJ1ZXR5cGUsIHRydWUsIGZhbHNlLCB0eXBlLT5pc194Y2VwdGlvbigpLCB0eXBlLT5pc194Y2VwdGlvbigpKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cG5hbWUgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHRydWV0eXBlLCB2YWx1ZSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHByaW50X2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6ZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfbm0pIHsKKyAgKHZvaWQpb3V0OworICAodm9pZCluYW1lOworICAodm9pZCl0eXBlOworICAodm9pZCl2YWx1ZTsKKyAgKHZvaWQpY2xzX25tOworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRydWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIiciIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJUcnVlIiA6ICJGYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiU2hvcnRJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIlNtYWxsSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8ICJMb25nSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8ICJJbnQ2NCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiLjAiOyAvLyBtYWtlIGl0IGEgZG91YmxlIGNvbnN0YW50IGJ5IGFkZGluZyAiLjAiCisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICB2YXJzIDw8ICIgICIgPDwgdCA8PCAiIDogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgcHJpbnRfY29uc3RfdmFsdWUodmFycywgb3V0LCB0LCB0eXBlLCB2YWx1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpbmRlbnRfZG93bigpOworCisgIGFkZF9kZWZpbmVkX3R5cGUodHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc3RydWN0X2ltcGwsICIiLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3Rvcnkoc190eXBlX2ZhY3RvcnlfZnVuY3MsICIiLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24pOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfcmVzdWx0LCB0cnVlKTsKKyAgfQorCisgIHN0cmluZyBjbHNfbm07CisKKyAgc3RyaW5nIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWU7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzLCBjb2RlOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICJGIiArIHByb3BfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCksIGlzX2V4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoY29kZSkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IFRydWU7IgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiY29uc3RydWN0b3IgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiQ3JlYXRlOyIgPDwgZW5kbDsKKworICBpZiAoIXZhcnMuc3RyKCkuZW1wdHkoKSkgeworICAgIG91dCA8PCAidmFyIiA8PCBlbmRsOworICAgIG91dCA8PCB2YXJzLnN0cigpOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkIENyZWF0ZSgnJyk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgeworICAgIG91dCA8PCBjb2RlLnN0cigpOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKChtZW1iZXJzLnNpemUoKSA+IDApICYmIGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgICAgPDwgIkNyZWF0ZSgiIDw8IGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodHN0cnVjdCwgaW5kZW50X2ltcGwoKSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkNyZWF0ZTsiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgc3RyaW5nIHByb3BuYW1lID0gcHJvcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIHN0cmluZyBwYXJhbV9uYW1lID0gY29uc3RydWN0b3JfcGFyYW1fbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBwcm9wbmFtZSA8PCAiIDo9ICIgPDwgcGFyYW1fbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZGVzdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJEZXN0cm95OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBmaW5hbGl6ZV9maWVsZChvdXQsIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZQorICAgICAgICAgICAgICAgICAgICAgPDwgIjogSSIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIEYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA9IG5pbCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ0aGVuIEYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA6PSBUIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgInJlc3VsdCA6PSBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgorICAgICAgICAgICAgICAgICAgICAgPDwgIkNsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgICAgfQorCisgICAgICBnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX25tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1faXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QtPmlzX3VuaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUpOworICAgIH0KKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOworICAgIH0KKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCBjbHNfbm0sIHQsICptX2l0ZXIsICJGIiwgaXNfZXhjZXB0aW9uKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfbm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LT5pc191bmlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUpOworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCBjbHNfbm0sIHQsICptX2l0ZXIsICJGIiwgaXNfZXhjZXB0aW9uKTsKKyAgICB9CisgIH0KKworICBpZiAoKCFpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgeworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIGlmIChpc19yZXN1bHQpIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorICB9CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfeF9mYWN0b3J5KTsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmIGlzX3hfZmFjdG9yeSkgeworICAgIGdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIG91dCA8PCAiQ3JlYXRlXyI7CisgIG91dCA8PCBzdHJ1Y3RfaW50Zl9uYW1lOworICBvdXQgPDwgIl9JbXBsIjsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworICAodm9pZCljbHNfcHJlZml4OworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIHJldHVybjsKKyAgaWYgKGlzX3Jlc3VsdCkKKyAgICByZXR1cm47CisgIGlmIChpc194X2ZhY3RvcnkpCisgICAgcmV0dXJuOworCisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKworICBvdXQgPDwgImZ1bmN0aW9uICI7CisgIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICI6ICI7CisgIG91dCA8PCBzdHJ1Y3RfaW50Zl9uYW1lOworICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIG91dCA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgY2xzX25tIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKyAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICByZXR1cm47CisgIGlmIChpc19yZXN1bHQpCisgICAgcmV0dXJuOworICBpZiAoaXNfeF9mYWN0b3J5KQorICAgIHJldHVybjsKKworICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKworICBpbmRlbnQob3V0KSA8PCAiICBUeXBlUmVnaXN0cnkuUmVnaXN0ZXJUeXBlRmFjdG9yeTwiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIj4oIjsKKyAgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgIik7IjsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgeworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lOworICBzdHJpbmcgc3RydWN0X25hbWU7CisgIHN0cmluZyBpc3NldF9uYW1lOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIHN0cmluZyBleGNlcHRpb25fZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlKSArICJGYWN0b3J5IjsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCBmYWxzZSwgZmFsc2UsIHRydWUpOworICB9IGVsc2UgeworICAgIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIH0KKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgc3RydWN0X25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgKCFpc194X2ZhY3RvcnkpLCBpc194X2ZhY3RvcnkpOworICB9IGVsc2UgeworICAgIHN0cnVjdF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUpOworICB9CisKKyAgaWYgKCghaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKKworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICIgPSBpbnRlcmZhY2UoSUJhc2UpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorCisgICAgaWYgKGlzX3hfZmFjdG9yeSkgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ3JlYXRlIEV4Y2VwdGlvbiBPYmplY3QiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBpc19leGNlcHRpb24pOworICAgICAgfQorICAgIH0KKworICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICAgIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW4gcmVhZCBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2RlbHBoaV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgc3RydWN0X25hbWUgPDwgIiA9ICI7CisgIGlmIChpc19maW5hbCkgeworICAgIG91dCA8PCAic2VhbGVkICI7CisgIH0KKyAgb3V0IDw8ICJjbGFzcygiOworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIG91dCA8PCAiVEV4Y2VwdGlvbiI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJUSW50ZXJmYWNlZE9iamVjdCwgSUJhc2UsICIgPDwgc3RydWN0X2ludGZfbmFtZTsKKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0eXBlIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaW5fY2xhc3MsIGlzX3Jlc3VsdCwgdHJ1ZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIkYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA6IiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIkYiLCBpc19leGNlcHRpb24pIDw8IGVuZGw7CisgIH0KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpc3NldF9uYW1lID0gIkZfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ2xlYXIgdmFsdWVzKGZvciB1bmlvbidzIHByb3BlcnR5IHNldHRlcikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICgobWVtYmVycy5zaXplKCkgPiAwKSAmJiBpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIiA8PCBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRzdHJ1Y3QsIGluZGVudCgpKQorICAgICAgICAgICAgICAgIDw8ICIpOyBvdmVybG9hZDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBUb1N0cmluZzogc3RyaW5nOyBvdmVycmlkZTsiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gRXhjZXB0aW9uIEZhY3RvcnkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uICIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOiAiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoKCFpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBJQmFzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFdyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoaXNfZXhjZXB0aW9uICYmIGlzX3hfZmFjdG9yeSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBDcmVhdGUgRXhjZXB0aW9uIE9iamVjdCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gUHJvcGVydGllcyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorICB9CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuIHJlYWQgR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpIDw8ICIgPSBjbGFzcyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsZmFsc2UpOworICBpZihhc3luY18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSx0cnVlKTsKKyAgfQorfQorCisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBib29sIGZvcl9hc3luYykgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBzdHJpbmcgaWZhY2VfbmFtZSA9IGZvcl9hc3luYyA/ICJJQXN5bmMiIDogIklmYWNlIjsKKworICBpbmRlbnRfdXAoKTsKKworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOworICAgIGV4dGVuZHNfaWZhY2UgPSBleHRlbmRzICsgIi4iICsgaWZhY2VfbmFtZTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGlmYWNlX25hbWUgPDwgIiA9IGludGVyZmFjZSgiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIikiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgaWZhY2VfbmFtZSA8PCAiID0gaW50ZXJmYWNlIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZm9yX2FzeW5jKSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3NlcnZpY2UsIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc2VydmljZV9pbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGluZGVudF91cCgpOworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiVEludGVyZmFjZWRPYmplY3QiOworICBzdHJpbmcgaW1wbGVtZW50cyA9IGFzeW5jXyA/ICJJZmFjZSwgSUFzeW5jIiA6ICJJZmFjZSI7CisKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLlRDbGllbnQiOworICB9CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUQ2xpZW50ID0gY2xhc3MoICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiwgIiA8PCBpbXBsZW1lbnRzIDw8ICIpIiA8PCBlbmRsOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuVENsaWVudC5DcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkNyZWF0ZSggcHJvdCwgcHJvdCApOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoc19zZXJ2aWNlKQorICAgICAgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuVENsaWVudC5DcmVhdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfIDo9IGlwcm90OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8gOj0gb3Byb3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgImlwcm90XzogSVByb3RvY29sOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAib3Byb3RfOiBJUHJvdG9jb2w7IiA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJzZXFpZF86IFN5c3RlbS5JbnRlZ2VyOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvcGVydHkgSW5wdXRQcm90b2NvbDogSVByb3RvY29sIHJlYWQgaXByb3RfOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvcGVydHkgT3V0cHV0UHJvdG9jb2w6IElQcm90b2NvbCByZWFkIG9wcm90XzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICIvLyBJZmFjZSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOworICB9CisKKyAgaWYoIGFzeW5jXykgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIi8vIElBc3luYyIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7CisgICAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UQ2xpZW50IjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIG9uZSBmb3Igc3luYyBvbmx5LCB0d28gZm9yIGFzeW5jK3N5bmMKKyAgICBpbnQgbW9kZSA9IGFzeW5jXyA/IDEgOiAwOworICAgIHdoaWxlKCBtb2RlID49IDApIHsKKyAgICAgIGJvb2wgZm9yX2FzeW5jID0gKG1vZGUgIT0gMCk7CisgICAgICBtb2RlLS07CisKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZm9yX2FzeW5jLCBmdWxsX2NscykgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworCisgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgICAgaWYoIGZvcl9hc3luYykgeworICAgICAgICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKKyAgICAgICAgICAgLy8gRGVscGhpIGZvcmNlcyB1cyB0byBzcGVjaWZ5IGEgdHlwZSB3aXRoIElGdXR1cmU8VD4sIHNvIHdlIHVzZSBJbnRlZ2VyPTAgZm9yIHZvaWQgbWV0aG9kcworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmVzdWx0IDo9IFRUYXNrLkZ1dHVyZTxTeXN0ZW0uSW50ZWdlcj4oZnVuY3Rpb246IFN5c3RlbS5JbnRlZ2VyIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0cmluZyByZXR0eXBlID0gdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmVzdWx0IDo9IFRUYXNrLkZ1dHVyZTwiIDw8IHJldHR5cGUgPDwgIj4oZnVuY3Rpb246ICIgPDwgcmV0dHlwZSA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICB9CisKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICB9CisgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCBpbmRlbnRfaW1wbCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIlJlc3VsdCA6PSAiOworICAgICAgICB9CisgICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiggZm9yX2FzeW5jKSB7CisgICAgICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IDA7IiA8PCBlbmRsOyAgLy8gbm8gSUZ1dHVyZTx2b2lkPiBpbiBEZWxwaGkKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgICBzdHJpbmcgYXJnc19jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShhcmdzbmFtZSwgIlQiKTsKKyAgICBzdHJpbmcgYXJnc19pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0oYXJnc25hbWUsICJJIik7CisKKyAgICBzdHJpbmcgYXJnc3ZhciA9IHRtcCgiX2FyZ3MiKTsKKyAgICBzdHJpbmcgbXNndmFyID0gdG1wKCJfbXNnIik7CisKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sIGZhbHNlKSA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sIGZhbHNlLCBmdWxsX2NscykgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIgOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAic2VxaWRfIDo9IHNlcWlkXyArIDE7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgbXNndmFyIDw8ICIsICciIDw8IGZ1bm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKCAiIDw8IG1zZ3ZhciA8PCAiICk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIgOj0gIiA8PCBhcmdzX2Nsc25tIDw8ICJJbXBsLkNyZWF0ZSgpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGw7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCBlbXB0eV92YWx1ZSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIG9yZ19yZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgc3RyaW5nIHJlc3VsdF9jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIlQiKTsKKyAgICAgIHN0cmluZyByZXN1bHRfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiSSIpOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgc3RyaW5nIGV4Y2VwdHZhciA9IHRtcCgiX2V4Iik7CisgICAgICBzdHJpbmcgYXBwZXh2YXIgPSB0bXAoIl9heCIpOworICAgICAgc3RyaW5nIHJldHZhciA9IHRtcCgiX3JldCIpOworCisgICAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sIGZhbHNlKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgZmFsc2UsIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZXhjZXB0dmFyIDw8ICIgOiBFeGNlcHRpb247IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFwcGV4dmFyIDw8ICIgOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiIDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6PSBpcHJvdF8uUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgbXNndmFyIDw8ICIuVHlwZV8gPSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB0aGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcHBleHZhciA8PCAiIDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJhaXNlICIgPDwgYXBwZXh2YXIgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIiA6PSAiIDw8IHJlc3VsdF9jbHNubSA8PCAiSW1wbC5DcmVhdGUoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIuUmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgcmV0dmFyIDw8ICIuX19pc3NldF9zdWNjZXNzKSB0aGVuIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSAiIDw8IHJldHZhciA8PCAiLlN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX2xpc3QoKQorICAgICAgICAgICAgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIuU3VjY2VzcyA6PSBuaWw7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IHJldHZhciA8PCAiLl9faXNzZXRfIiA8PCBwcm9wX25hbWUoKnhfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHRoZW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBleGNlcHR2YXIgPDwgIiA6PSAiIDw8IHJldHZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLkNyZWF0ZUV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2UgIiA8PCBleGNlcHR2YXIgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgICAgICAgPDwgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQuQ3JlYXRlKCciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0Jyk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKworICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVFByb2Nlc3NvckltcGwiOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5UUHJvY2Vzc29ySW1wbCI7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzb3JJbXBsID0gY2xhc3MoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiLCBJUHJvY2Vzc29yKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVFByb2Nlc3NvckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm9jZXNzb3IpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIGlmYWNlXzogSWZhY2UgKTsiIDw8IGVuZGw7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnN0cnVjdG9yICIgPDwgZnVsbF9jbHMgPDwgIi5DcmVhdGUoIGlmYWNlXzogSWZhY2UgKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlKCBpZmFjZV8pOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGU7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiU2VsZi5pZmFjZV8gOj0gaWZhY2VfOyIgPDwgZW5kbDsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkFTU0VSVCggcHJvY2Vzc01hcF8gPD4gbmlsKTsgIC8vIGluaGVyaXRlZCIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgICAgPDwgInByb2Nlc3NNYXBfIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxzdHJpbmcsIFRQcm9jZXNzRnVuY3Rpb24+LkNyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicHJvY2Vzc01hcF8uQWRkT3JTZXRWYWx1ZSggJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3MpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZGVzdHJ1Y3RvciAiIDw8IGZ1bGxfY2xzIDw8ICIuRGVzdHJveTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJpdmF0ZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJpZmFjZV86IElmYWNlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInR5cGUiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzRnVuY3Rpb24gPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKCBzZXFpZDogU3lzdGVtLkludGVnZXI7IGNvbnN0IGlwcm90OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIklQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb2Nlc3NNYXBfOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIFRQcm9jZXNzRnVuY3Rpb24+OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMpOiBTeXN0ZW0uQm9vbGVhbjsgcmVpbnRyb2R1Y2U7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmdW5jdGlvbiAiIDw8IGZ1bGxfY2xzIDw8ICIuUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBJUHJvY2Vzc29yRXZlbnRzKTogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICA7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4gOiBUUHJvY2Vzc0Z1bmN0aW9uOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4IDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQgOiBJUmVxdWVzdEV2ZW50czsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbiA6PSBuaWw7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIG5vdCBwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgZm4pIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9yIG5vdCBBc3NpZ25lZChmbikgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOj0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QuQ3JlYXRlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCBtZXRob2QgbmFtZTogJycnICsgbXNnLk5hbWUgKyAnJycnKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQorICAgICAgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBtc2csIG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpOyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInguV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidGhlbiBjb250ZXh0IDo9IGV2ZW50cy5DcmVhdGVSZXF1ZXN0Q29udGV4dChtc2cuTmFtZSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbHNlIGNvbnRleHQgOj0gbmlsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QsIGNvbnRleHQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBjb250ZXh0IDw+IG5pbCB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0LkNsZWFudXBDb250ZXh0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQgOj0gbmlsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJleGNlcHQiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib24gVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0IGRvIGJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZWxzZSBiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gRmFsc2U7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IFRydWU7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJTdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zZXJ2aWNlLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3NlcnZpY2VfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICBzdHJpbmcgZnVuY25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UUHJvY2Vzc29ySW1wbCI7CisKKyAgc3RyaW5nIG9yZ19hcmdzbmFtZSA9IGZ1bmNuYW1lICsgIl9hcmdzIjsKKyAgc3RyaW5nIGFyZ3NfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX2FyZ3NuYW1lLCAiVCIpOworICBzdHJpbmcgYXJnc19pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX2FyZ3NuYW1lLCAiSSIpOworCisgIHN0cmluZyBvcmdfcmVzdWx0bmFtZSA9IGZ1bmNuYW1lICsgIl9yZXN1bHQiOworICBzdHJpbmcgcmVzdWx0X2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiVCIpOworICBzdHJpbmcgcmVzdWx0X2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIkkiKTsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvY2VkdXJlICIgPDwgZnVuY25hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIl9Qcm9jZXNzKCBzZXFpZDogU3lzdGVtLkludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCisgICAgICAgICAgICAgICAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiLy8gb25lIHdheSBwcm9jZXNzb3IiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICIvLyBib3RoIHdheSBwcm9jZXNzb3IiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgIDw8ICJwcm9jZWR1cmUgIiA8PCBmdWxsX2NscyA8PCAiLiIgPDwgZnVuY25hbWUKKyAgICAgIDw8ICJfUHJvY2Vzcyggc2VxaWQ6IFN5c3RlbS5JbnRlZ2VyOyBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgorICAgICAgPDwgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZzogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlUmVhZDsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzIDo9ICIgPDwgYXJnc19jbHNubSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0UmVhZDsiIDw8IGVuZGw7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0IDo9ICIgPDwgcmVzdWx0X2Nsc25tIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc19zZXJ2aWNlX2ltcGwgPDwgaW5kZW50X2ltcGwoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZXQuU3VjY2VzcyA6PSAiOworICB9CisgIHNfc2VydmljZV9pbXBsIDw8ICJpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOworICAgIH0KKyAgICBzX3NlcnZpY2VfaW1wbCA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgfQorICBzX3NlcnZpY2VfaW1wbCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IGVtcHR5X3ZhbHVlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBFOiAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIHRydWUsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZG8gYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0oKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJGYWN0b3J5IjsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgOj0gRS4iIDw8IGZhY3RvcnlfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGlmKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuVW5oYW5kbGVkRXJyb3IoRSk7IiA8PCBlbmRsOworICB9CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yLkNyZWF0ZShFLk1lc3NhZ2UpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGlmKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVXcml0ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIG1zZywgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICAgIGlmKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0V3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHguRnJlZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoZXZlbnRzXykgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlByZVdyaXRlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggbXNnLCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsgIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgICAgaWYgKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0V3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLk9uZXdheUNvbXBsZXRlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgIiIpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgaXNfeGNlcHRpb24sIHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICI7CisKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlKSA8PCAiKCI7CisgICAgfQorCisgICAgb3V0IDw8ICJpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICAgICAgb3V0IDw8ICJSZWFkQW5zaVN0cmluZygpOyI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiUmVhZEJvb2woKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOworICAgICAgb3V0IDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHR5cF9uYW1lOworCisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgdHlwX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUpOworICB9IGVsc2UgeworICAgIHR5cF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cF9uYW1lIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgbmFtZSA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKworICBzdHJpbmcgb2JqOworICBzdHJpbmcgY291bnRlcjsKKyAgc3RyaW5nIGxvY2FsX3ZhcjsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBUVGhyaWZ0TWFwOyI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgbG9jYWxfdmFyID0gb2JqICsgIjogVFRocmlmdFNldDsiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBUVGhyaWZ0TGlzdDsiOworICB9CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBsb2NhbF92YXIgPDwgZW5kbDsKKyAgY291bnRlciA9IHRtcCgiX2kiKTsKKyAgbG9jYWxfdmFyID0gY291bnRlciArICI6IFN5c3RlbS5JbnRlZ2VyOyI7CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBsb2NhbF92YXIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgdHJ1ZSkgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgY291bnRlciA8PCAiIDo9IDAgdG8gIiA8PCBvYmogPDwgIi5Db3VudCAtIDEgZG8iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbWFwKil0dHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfc2V0Kil0dHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9saXN0Kil0dHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgc3RyaW5nIGxvY2FsX3ZhcjsKKworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZrZXksICIiLCBsb2NhbF92YXJzKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZ2YWwsICIiLCBsb2NhbF92YXJzKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZE9yU2V0VmFsdWUoICIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZmZWxlbSwgIiIsIGxvY2FsX3ZhcnMpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmVsZW0sICIiLCBsb2NhbF92YXJzKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICAodm9pZClsb2NhbF92YXJzOworCisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgaXNfeGNlcHRpb24sIHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUFuc2lTdHJpbmcoIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJXcml0ZUkzMihTeXN0ZW0uSW50ZWdlcigiIDw8IG5hbWUgPDwgIikpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgICh2b2lkKWxvY2FsX3ZhcnM7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnRfaW1wbCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgc3RyaW5nIG9iajsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgibWFwIik7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdE1hcDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJzZXRfIik7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdFNldDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgibGlzdF8iKTsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBUVGhyaWZ0TGlzdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0QmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cyBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4LCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfc2V0Kil0dHlwZSwgaXRlciwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbGlzdCopdHR5cGUsIGl0ZXIsIGxvY2FsX3ZhcnMpOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmtmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmdmZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZlZmllbGQsICIiLCBsb2NhbF92YXJzKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3V0LCBpc194Y2VwdGlvbiwgdGZpZWxkLCBpc1B1YmxpYywgIkdldCIpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJ1Y3RfaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgpIHsKKyAgKHZvaWQpaXNQdWJsaWM7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdGZpZWxkKTsKKyAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOiAiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiIHJlYWQgIgorICAgICAgICAgICAgICA8PCBmaWVsZFByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIiB3cml0ZSBTZXQiCisgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbikgeworICByZXR1cm4gcHJvcF9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSwgaXNfeGNlcHRpb24pOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnByb3BfbmFtZShzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbikgeworICBzdHJpbmcgcmV0ID0gbmFtZTsKKyAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOworICByZXR1cm4gbm9ybWFsaXplX25hbWUocmV0LCB0cnVlLCBpc194Y2VwdGlvbik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6Y29uc3RydWN0b3JfcGFyYW1fbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcmV0ID0gbmFtZTsKKyAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOworICByZXQgPSAiQSIgKyByZXQ7CisgIHJldHVybiBub3JtYWxpemVfbmFtZShyZXQsIGZhbHNlLCBmYWxzZSk7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9jbHNubShzdHJpbmcgY2xzbm0sIHN0cmluZyBwcmVmaXgsIGJvb2wgYl9ub19jaGVja19rZXl3b3JkKSB7CisgIGlmIChjbHNubS5zaXplKCkgPiAwKSB7CisgICAgY2xzbm1bMF0gPSB0b3VwcGVyKGNsc25tWzBdKTsKKyAgfQorICBpZiAoYl9ub19jaGVja19rZXl3b3JkKSB7CisgICAgcmV0dXJuIHByZWZpeCArIGNsc25tOworICB9IGVsc2UgeworICAgIHJldHVybiBub3JtYWxpemVfbmFtZShwcmVmaXggKyBjbHNubSk7CisgIH0KK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2NscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbm9fcG9zdGZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKKworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRfdHlwZWRlZiogdGRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOworICAgIGlmICh0ZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSkgeyAvLyBmb3J3YXJkIHR5cGVzIGFjY29yZGluZyB0byBUSFJJRlQtMjQyMQorICAgICAgaWYgKHRkZWYtPmdldF90eXBlKCkgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdHlwZV9uYW1lKHRkZWYtPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9jbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9ub19wb3N0Zml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJfZXhjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bnJlc29sdmVkIGZvcndhcmQgZGVjbGFyYXRpb246ICIgKyB0ZGVmLT5nZXRfc3ltYm9saWMoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKCJUIiArIHRkZWYtPmdldF9zeW1ib2xpYygpKTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgdHlwX25tOworCisgIHN0cmluZyBzX2ZhY3Rvcnk7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgYl9jbHMgPSB0cnVlOworICAgIGJfbm9fcG9zdGZpeCA9IHRydWU7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIGlmIChiX2NscykgeworICAgICAgdHlwX25tID0gIlRUaHJpZnREaWN0aW9uYXJ5SW1wbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0RGljdGlvbmFyeSI7CisgICAgfQorICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkKKyAgICAgICAgICAgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIGlmIChiX2NscykgeworICAgICAgdHlwX25tID0gIlRIYXNoU2V0SW1wbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cF9ubSA9ICJJSGFzaFNldCI7CisgICAgfQorICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIGlmIChiX2NscykgeworICAgICAgdHlwX25tID0gIlRUaHJpZnRMaXN0SW1wbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0TGlzdCI7CisgICAgfQorICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKworICBzdHJpbmcgdHlwZV9wcmVmaXg7CisKKyAgaWYgKGJfY2xzKSB7CisgICAgdHlwZV9wcmVmaXggPSAiVCI7CisgIH0gZWxzZSB7CisgICAgdHlwZV9wcmVmaXggPSAiSSI7CisgIH0KKworICBzdHJpbmcgbm0gPSBub3JtYWxpemVfY2xzbm0odHR5cGUtPmdldF9uYW1lKCksIHR5cGVfcHJlZml4KTsKKworICBpZiAoYl9leGNlcHRpb25fZmFjdG9yeSkgeworICAgIG5tID0gbm0gKyAiRmFjdG9yeSI7CisgIH0KKworICBpZiAoYl9jbHMpIHsKKyAgICBpZiAoIWJfbm9fcG9zdGZpeCkgeworICAgICAgbm0gPSBubSArICJJbXBsIjsKKyAgICB9CisgIH0KKworICBpZiAoYl9leGNlcHRpb25fZmFjdG9yeSAmJiBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpICsgIi4iICsgbm07CisgIH0KKworICByZXR1cm4gbm07Cit9CisKKy8vIHJldHVybnMgImNvbnN0ICIgZm9yIHNvbWUgYXJndW1lbnQgdHlwZXMKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmlucHV0X2FyZ19wcmVmaXgodF90eXBlKiB0dHlwZSkgeworCisgIC8vIGJhc2UgdHlwZXMKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSB7CisKKyAgICAvLyB0aGVzZSBzaG91bGQgYmUgY29uc3QnZWQgZm9yIG9wdGltYWwgcGVyZm9ybWFtY2UKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogLy8gcmVmY291bnRlZCBwb2ludGVyCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAgIC8vIGxhcmdlciB0aGFuIDMyIGJpdAorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOiAvLyBsYXJnZXIgdGhhbiAzMiBiaXQKKyAgICAgIHJldHVybiAiY29uc3QgIjsKKworICAgIC8vIGFsbCBvdGhlcnMgZG9uJ3QgbmVlZCB0byBiZQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiIjsKKworICAgIC8vIHdlIGJldHRlciBhbHdheXMgcmVwb3J0IGFueSB1bmtub3duIHR5cGVzCisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaW5wdXRfYXJnX3ByZWZpeCgpIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSk7CisgICAgfQorCisgICAgLy8gZW51bXMKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIiOyAvLyB1c3VhbGx5IDw9IDMyIGJpdAorCisgICAgLy8gY29udGFpbmVycworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiY29uc3QgIjsgLy8gcmVmY291bnRlZCBwb2ludGVyCisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gImNvbnN0ICI7IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgorCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiY29uc3QgIjsgLy8gcmVmY291bnRlZCBwb2ludGVyCisgIH0KKworICAvLyBhbnkgb3RoZXIgdHlwZSwgZWl0aGVyIFRTb21ldGhpbmcgb3IgSVNvbWV0aGluZworICByZXR1cm4gImNvbnN0ICI7IC8vIHBvc3NpYmx5IHJlZmNvdW50ZWQgcG9pbnRlcgorfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpIHsKKyAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgLy8gbm8gInZvaWQiIGluIERlbHBoaSBsYW5ndWFnZQorICAgIHJldHVybiAiIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgeworICAgICAgICByZXR1cm4gIlN5c3RlbS5BbnNpU3RyaW5nIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiU3lzVXRpbHMuVEJ5dGVzIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTeXN0ZW0uc3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIlN5c3RlbS5Cb29sZWFuIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gIlN5c3RlbS5TaG9ydEludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiU3lzdGVtLlNtYWxsSW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJTeXN0ZW0uSW50ZWdlciI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiU3lzdGVtLkludDY0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJTeXN0ZW0uRG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIgorICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZS0+Z2V0X2Jhc2UoKSk7CisgIH0KK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgICh2b2lkKWluaXQ7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIHN0cmluZyByZXN1bHQgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgKyAiOiAiCisgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI7IjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcl9hc3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmdWxsX2NscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0cmluZyBwcmVmaXg7CisgIGlmIChmdWxsX2NscyA9PSAiIikgeworICAgIHByZWZpeCA9ICIiOworICB9IGVsc2UgeworICAgIHByZWZpeCA9IGZ1bGxfY2xzICsgIi4iOworICB9CisKKyAgaWYoIGZvcl9hc3luYykgeworICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiQXN5bmMoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6IElGdXR1cmU8SW50ZWdlcj47IjsgIC8vIG5vIElGdXR1cmU8dm9pZD4gaW4gRGVscGhpCisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIkFzeW5jKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOiBJRnV0dXJlPCIKKyAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI+OyI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJwcm9jZWR1cmUgIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIigiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTsiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICIoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6ICIKKyAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI7IjsKKyAgICB9CisgIH0KK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHRfdHlwZSogdHQ7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiOyAiOworICAgIH0KKworICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHJlc3VsdCArPSBpbnB1dF9hcmdfcHJlZml4KHR0KTsgLy8gY29uc3Q/CisgICAgcmVzdWx0ICs9IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiCisgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0LCBmYWxzZSwgdHJ1ZSwgdHQtPmlzX3hjZXB0aW9uKCksIHRydWUpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBjdXJyZW50X2luZGVudCkgeworICBvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgdF90eXBlKiB0dDsKKyAgc3RyaW5nIGxpbmUgPSAiIjsKKyAgc3RyaW5nIG5ld2xpbmVfaW5kZW50ID0gY3VycmVudF9pbmRlbnQgKyAiICAiOworCisgIGJvb2wgZmlyc3RsaW5lID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgbGluZSArPSAiOyI7CisgICAgfQorCisgICAgaWYgKGxpbmUuc2l6ZSgpID4gODApIHsKKyAgICAgIGlmIChmaXJzdGxpbmUpIHsKKyAgICAgICAgcmVzdWx0IDw8IGVuZGwgPDwgbmV3bGluZV9pbmRlbnQ7CisgICAgICAgIGZpcnN0bGluZSA9IGZhbHNlOworICAgICAgfQorICAgICAgcmVzdWx0IDw8IGxpbmUgPDwgZW5kbDsKKyAgICAgIGxpbmUgPSBuZXdsaW5lX2luZGVudDsKKyAgICB9IGVsc2UgaWYgKGxpbmUuc2l6ZSgpID4gMCkgeworICAgICAgbGluZSArPSAiICI7CisgICAgfQorCisgICAgdHQgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgbGluZSArPSBpbnB1dF9hcmdfcHJlZml4KHR0KTsgLy8gY29uc3Q/CisgICAgbGluZSArPSBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiCisgICAgICAgICAgICArIHR5cGVfbmFtZSh0dCwgZmFsc2UsIHRydWUsIHR0LT5pc194Y2VwdGlvbigpLCB0cnVlKTsKKyAgfQorCisgIGlmIChsaW5lLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgPDwgbGluZTsKKyAgfQorCisgIHN0cmluZyByZXN1bHRfc3RyOworCisgIGlmIChmaXJzdGxpbmUpIHsKKyAgICByZXN1bHRfc3RyID0gIiAiICsgcmVzdWx0LnN0cigpOworICB9IGVsc2UgeworICAgIHJlc3VsdF9zdHIgPSByZXN1bHQuc3RyKCk7CisgIH0KKworICByZXR1cm4gcmVzdWx0X3N0cjsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmdfIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJvb2xfIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CeXRlXyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRvdWJsZV8iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTWFwIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU2V0XyI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZW1wdHlfdmFsdWUodF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKKyAgICAgICAgICByZXR1cm4gIicnIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gIm5pbCI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiJyciOworICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiRmFsc2UiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIwLjAiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQiICsgdHlwZS0+Z2V0X25hbWUoKSArICIoMCkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCisgICAgICAgICAgICAgIDw8ICIoIGNvbnN0IFZhbHVlOiAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOiAiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0X19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKSB7CisgICh2b2lkKWNsc19wcmVmaXg7CisgICh2b2lkKW5hbWU7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWlzX3VuaW9uOworICAodm9pZClpc194Y2VwdGlvbl9mYWN0b3J5OworICAodm9pZCl4Y2VwdGlvbl9mYWN0b3J5X25hbWU7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIEZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgdGhlbiBiZWdpbiIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IEZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSAiCisgICAgICAgICAgICAgICAgICAgPDwgIkRlZmF1bHQoICIgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdG9yeV9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiU2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKKyAgICAgICAgICAgICAgICAgICA8PCAiKCBjb25zdCBWYWx1ZTogIiA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAoaXNfdW5pb24pIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKKyAgfQorICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gVHJ1ZTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2ltcGwob3V0KSA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBWYWx1ZTsiIDw8IGVuZGw7CisKKyAgaWYgKGlzX3hjZXB0aW9uX2NsYXNzICYmICghaXNfeGNlcHRpb25fZmFjdG9yeSkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9IFZhbHVlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgICh2b2lkKXR5cGU7CisKKyAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgorICAgICAgICAgICAgICAgICAgIDw8ICJHZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7CisgICh2b2lkKXR5cGU7CisKKyAgc3RyaW5nIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGZpZWxkUHJlZml4IDw8IGlzc2V0X25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2NyZWF0ZV9leGNlcHRpb25faW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKworICBzdHJpbmcgZXhjZXB0aW9uX2Nsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCB0cnVlKTsKKyAgc3RyaW5nIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX25tIDw8ICIuQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IGV4Y2VwdGlvbl9jbHNfbm0gPDwgIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBleGNlcHRpb25fY2xzX25tIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkgKyAiRmFjdG9yeSI7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC5GIiA8PCBmYWN0b3J5X25hbWUgPDwgIiA6PSBTZWxmOyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIHByb3BuYW1lOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcHJvcG5hbWUgPSBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgX19pc3NldF8iIDw8IHByb3BuYW1lIDw8ICIgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgfQorICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC4iIDw8IHByb3BuYW1lIDw8ICIgOj0gIiA8PCBwcm9wbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOworICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBpcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOworCisgIC8vIGxvY2FsIGJvb2xzIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDogU3lzdGVtLkJvb2xlYW47IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6PSBGQUxTRTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJzdHJ1YyA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW47IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cnkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIndoaWxlICh0cnVlKSBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8gOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChmaWVsZF8uVHlwZV8gPSBUVHlwZS5TdG9wKSB0aGVuIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJCcmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGlmIChmaXJzdCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImNhc2UgZmllbGRfLklEIG9mIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9CisKKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgIGNvZGVfYmxvY2sgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChmaWVsZF8uVHlwZV8gPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiU2VsZi4iLCBsb2NhbF92YXJzKTsKKworICAgIC8vIHJlcXVpcmVkIGZpZWxkPworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOj0gVFJVRTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQgZWxzZSBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkXy5UeXBlXyk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZCI7CisgIH0KKworICBpZiAoIWZpcnN0KSB7CisgICAgY29kZV9ibG9jayA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbHNlIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZF8uVHlwZV8pOyIgPDwgZW5kbDsKKworICBpZiAoIWZpcnN0KSB7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgLy8gYWxsIHJlcXVpcmVkIGZpZWxkcyBoYXZlIGJlZW4gcmVhZD8KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIG5vdCBfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spCisgICAgICAgICAgPDwgInRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCIKKyAgICAgICAgICA8PCAiJ3JlcXVpcmVkIGZpZWxkICIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiBub3Qgc2V0Jyk7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5SZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIG91dCA8PCBsb2NhbF92YXJzLnN0cigpIDw8IGVuZGw7CisgIG91dCA8PCBjb2RlX2Jsb2NrLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOworICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBvcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggc3RydWMsICciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIGZpZWxkXyk7IiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiKSB0aGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLk5hbWUgOj0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uVHlwZV8gIDo9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBUVGhyaWZ0U3RydWN0OyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCk7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKKyAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgInRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyYWNrZXIgOj0gb3Byb3QuTmV4dFJlY3Vyc2lvbkxldmVsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIHN0cnVjLCAnIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBmaWVsZF8pOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkbmFtZSA9IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbik7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgICBib29sIGhhc19pc3NldCA9ICghaXNfcmVxdWlyZWQpOworICAgIGlmIChpc19yZXF1aXJlZCAmJiBudWxsX2FsbG93ZWQpIHsKKyAgICAgIG51bGxfYWxsb3dlZCA9IGZhbHNlOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChTZWxmLiIgPDwgZmllbGRuYW1lIDw8ICIgPSBuaWwpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIncmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZG5hbWUgPDwgIiBub3Qgc2V0Jyk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChTZWxmLiIgPDwgZmllbGRuYW1lIDw8ICIgPD4gbmlsKSI7CisgICAgICBpZiAoaGFzX2lzc2V0KSB7CisgICAgICAgIGNvZGVfYmxvY2sgPDwgIiBhbmQgX19pc3NldF8iIDw8IGZpZWxkbmFtZTsKKyAgICAgIH0KKyAgICAgIGNvZGVfYmxvY2sgPDwgIiB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGhhc19pc3NldCkgeworICAgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBmaWVsZG5hbWUgPDwgIikgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5OYW1lIDo9ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5UeXBlXyAgOj0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uSUQgOj0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkXyk7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgIGlmIChudWxsX2FsbG93ZWQgfHwgaGFzX2lzc2V0KSB7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IFRUaHJpZnRTdHJ1Y3Q7IiA8PCBlbmRsOworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBsb2NhbF92YXJzLnN0cigpOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIG91dCA8PCBjb2RlX2Jsb2NrLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGNsc19ubTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghaXNfeF9mYWN0b3J5KSwgaXNfeF9mYWN0b3J5LCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgc3RyaW5nIHRtcF9zYiA9IHRtcCgiX3NiIik7CisgIHN0cmluZyB0bXBfZmlyc3QgPSB0bXAoIl9maXJzdCIpOworICBib29sIHVzZUZpcnN0RmxhZyA9IGZhbHNlOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Ub1N0cmluZzogc3RyaW5nOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiIDogVFRocmlmdFN0cmluZ0J1aWxkZXI7IiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICAgICAgdXNlRmlyc3RGbGFnID0gdHJ1ZTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiIDo9IFRUaHJpZnRTdHJpbmdCdWlsZGVyLkNyZWF0ZSgnKCcpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAidHJ5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGlmICh1c2VGaXJzdEZsYWcpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDo9IFRSVUU7IiA8PCBlbmRsOworICB9CisKKyAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBib29sIGlzX29wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIChTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDw+IG5pbCkiOworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIG91dCA8PCAiIGFuZCBfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICB9CisgICAgICBvdXQgPDwgIiB0aGVuIGJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIChfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIikgdGhlbiBiZWdpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBub3QgIiA8PCB0bXBfZmlyc3QgPDwgIiB0aGVuICIgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcsJyk7IiA8PCBlbmRsOworICAgICAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOj0gRkFMU0U7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJyIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiOiAnKTsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcsICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiOiAnKTsiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIChTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiID0gbmlsKSB0aGVuICIgPDwgdG1wX3NiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuQXBwZW5kKCc8bnVsbD4nKSBlbHNlICIgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCBTZWxmLiIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKFN5c3RlbS5JbnRlZ2VyKCBTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCggU2VsZi4iIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChudWxsX2FsbG93ZWQgfHwgaXNfb3B0aW9uYWwpIHsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFpc19vcHRpb25hbCkgeworICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJyknKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IHRtcF9zYiA8PCAiLlRvU3RyaW5nOyIgPDwgZW5kbDsKKyAgaWYgKHVzZUZpcnN0RmxhZykgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmICIgPDwgdG1wX2ZpcnN0IDw8ICIgdGhlbiB7cHJldmVudCB3YXJuaW5nfTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuRnJlZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmlzX3ZvaWQodF90eXBlKiB0eXBlKSB7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGRlbHBoaSwKKyAgICAiZGVscGhpIiwKKyAgICAiICAgIGFuc2lzdHJfYmluYXJ5OiAgVXNlIEFuc2lTdHJpbmcgZm9yIGJpbmFyeSBkYXRhdHlwZSAoZGVmYXVsdCBpcyBUQnl0ZXMpLlxuIgorICAgICIgICAgcmVnaXN0ZXJfdHlwZXM6ICBFbmFibGUgVHlwZVJlZ2lzdHJ5LCBhbGxvd3MgZm9yIGNyZWF0aW9uIG9mIHN0cnVjdCwgdW5pb25cbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgYW5kIGNvbnRhaW5lciBpbnN0YW5jZXMgYnkgaW50ZXJmYWNlIG9yIFR5cGVJbmZvKClcbiIKKyAgICAiICAgIGNvbnN0cHJlZml4OiAgICAgTmFtZSBUQ29uc3RhbnRzIGNsYXNzZXMgYWZ0ZXIgSURMIHRvIHJlZHVjZSBhbWJpZ3VpdGllc1xuIgorICAgICIgICAgZXZlbnRzOiAgICAgICAgICBFbmFibGUgYW5kIHVzZSBwcm9jZXNzaW5nIGV2ZW50cyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4iCisgICAgIiAgICB4bWxkb2M6ICAgICAgICAgIEVuYWJsZSBYTUxEb2MgY29tbWVudHMgZm9yIEhlbHAgSW5zaWdodCBldGMuXG4iCisgICAgIiAgICBhc3luYzogICAgICAgICAgIEdlbmVyYXRlIElBc3luYyBpbnRlcmZhY2UgdG8gdXNlIFBhcmFsbGVsIFByb2dyYW1taW5nIExpYnJhcnkgKFhFNysgb25seSkuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDkxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMjgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogRXJsYW5nIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9lcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9lcmxfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbGVnYWN5X25hbWVzXyA9IGZhbHNlOworICAgIG1hcHNfID0gZmFsc2U7CisgICAgb3RwMTZfID0gZmFsc2U7CisgICAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7CisgICAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IHRydWU7CisKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsZWdhY3luYW1lcyIpID09IDApIHsKKyAgICAgICAgbGVnYWN5X25hbWVzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm1hcHMiKSA9PSAwKSB7CisgICAgICAgIG1hcHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgib3RwMTYiKSA9PSAwKSB7CisgICAgICAgIG90cDE2XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZXJsOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWFwc18gJiYgb3RwMTZfKSB7CisgICAgICB0aHJvdyAiYXJndW1lbnQgZXJyb3I6IENhbm5vdCBzcGVjaWZ5IGJvdGggbWFwcyBhbmQgb3RwMTY7IG1hcHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIEVybGFuZy9PVFAgUjE2IG9yIG9sZGVyIjsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1lcmwiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX21lbWJlcl90eXBlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX21lbWJlcl92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl90eXBlKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX21lbWJlcl92YWx1ZSh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKHRfZmllbGQqIGZpZWxkKTsKKworICAvLyAgc3RkOjpzdHJpbmcgcmVuZGVyX2RlZmF1bHRfdmFsdWUodF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2RlZmF1bHRfdmFsdWUodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0dHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cywgYm9vbCBleHRlbmRlZF9pbmZvID0gZmFsc2UpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfZXh0ZW5kZWRfc3RydWN0X2luZm8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoc3RkOjpzdHJpbmcgZnVuY3Rpb25fbmFtZSwgdmVjdG9yPHN0cmluZz4gbmFtZXMpOworICB2b2lkIGdlbmVyYXRlX2VudW1faW5mbyh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX21ldGFkYXRhKCk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb24odF9jb25zdCogdGNvbnN0LCBvc3RyaW5nc3RyZWFtJiBleHBvcnRzLCBvc3RyaW5nc3RyZWFtJiBmdW5jdGlvbnMpOworICB2b2lkIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0YWRhdGEodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBlcmxfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIGVybF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF9saXN0X3ZhbHVlcyh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShzdGQ6OnN0cmluZyBpbikgeworICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7CisgICAgICByZXR1cm4gZGVjYXBpdGFsaXplKGluKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHVuZGVyc2NvcmUoaW4pOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIGF0b21pZnkoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpZiAobGVnYWN5X25hbWVzXykgeworICAgICAgcmV0dXJuICInIiArIGRlY2FwaXRhbGl6ZShpbikgKyAiJyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiJyIgKyBpbiArICInIjsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGlmeShzdGQ6OnN0cmluZyBpbikgeworICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7CisgICAgICByZXR1cm4gY2FwaXRhbGl6ZShpbik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB1cHBlcmNhc2UoaW4pOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb21tZW50KHN0cmluZyBpbik7CisKK3ByaXZhdGU6CisgIGJvb2wgaGFzX2RlZmF1bHRfdmFsdWUodF9maWVsZCopOworCisgIC8qIGlmIHRydWUgcmV0YWluIHByZSAwLjkuMiBuYW1pbmcgc2NoZW1lIGZvciBmdW5jdGlvbnMsIGF0b21zIGFuZCBjb25zdHMgKi8KKyAgYm9vbCBsZWdhY3lfbmFtZXNfOworCisgIC8qIGlmIHRydWUgdXNlIG1hcHMgaW5zdGVhZCBvZiBkaWN0cyBpbiBnZW5lcmF0ZWQgY29kZSAqLworICBib29sIG1hcHNfOworCisgIC8qIGlmIHRydWUgdXNlIG5vbi1uYW1lc3BhY2VkIGRpY3QgYW5kIHNldCBpbnN0ZWFkIG9mIGRpY3Q6ZGljdCBhbmQgc2V0czpzZXQgKi8KKyAgYm9vbCBvdHAxNl87CisKKyAgLyoqCisgICAqIGFkZCBmdW5jdGlvbiB0byBleHBvcnQgbGlzdAorICAgKi8KKworICB2b2lkIGV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBleHBvcnRfc3RyaW5nKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBudW0pOworCisgIHZvaWQgZXhwb3J0X3R5cGVzX3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKKworICAvKioKKyAgICogd3JpdGUgb3V0IGhlYWRlcnMgYW5kIGZvb3RlcnMgZm9yIGhybCBmaWxlcworICAgKi8KKworICB2b2lkIGhybF9oZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIGhybF9mb290ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworCisgIC8qKgorICAgKiBzdHVmZiB0byBzcGl0IG91dCBhdCB0aGUgdG9wIG9mIGdlbmVyYXRlZCBmaWxlcworICAgKi8KKworICBib29sIGV4cG9ydF9saW5lc19maXJzdF87CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfbGluZXNfOworCisgIGJvb2wgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGV4cG9ydF90eXBlc19saW5lc187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9pbmZvXzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb19leHRfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19maWxlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2hybF9maWxlXzsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzX2ZpbGVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzX2hybF9maWxlXzsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX2hybF87CisKKyAgLyoqCisgICAqIE1ldGFkYXRhIGNvbnRhaW5lcnMKKyAgICovCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2X3N0cnVjdF9uYW1lc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2X2VudW1fbmFtZXNfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdl9leGNlcHRpb25fbmFtZXNfOworICBzdGQ6OnZlY3Rvcjx0X2VudW0qPiB2X2VudW1zXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IHZfY29uc3RzXzsKK307CisKKy8qKgorICogVUkgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gc2V0dXAgZXhwb3J0IGxpbmVzCisgIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOworICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKworICBzdHJpbmcgcHJvZ3JhbV9tb2R1bGVfbmFtZSA9IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXyk7CisKKyAgLy8gdHlwZXMgZmlsZXMKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl90eXBlcy5lcmwiOworICBzdHJpbmcgZl90eXBlc19ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl90eXBlcy5ocmwiOworCisgIGZfdHlwZXNfZmlsZV8ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIGZfdHlwZXNfaHJsX2ZpbGVfLm9wZW4oZl90eXBlc19ocmxfbmFtZS5jX3N0cigpKTsKKworICBocmxfaGVhZGVyKGZfdHlwZXNfaHJsX2ZpbGVfLCBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl90eXBlcyIpOworCisgIGZfdHlwZXNfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiLW1vZHVsZSgiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcykuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGZfdHlwZXNfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBmX3R5cGVzX2hybF9maWxlXyA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworCisgIC8vIGNvbnN0cyBmaWxlcworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl9jb25zdGFudHMuZXJsIjsKKyAgc3RyaW5nIGZfY29uc3RzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX2NvbnN0YW50cy5ocmwiOworCisgIGZfY29uc3RzX2ZpbGVfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKyAgZl9jb25zdHNfaHJsX2ZpbGVfLm9wZW4oZl9jb25zdHNfaHJsX25hbWUuY19zdHIoKSk7CisKKyAgZl9jb25zdHNfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgIi1tb2R1bGUoIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfY29uc3RhbnRzKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8ICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBmX2NvbnN0c19ocmxfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogQm9pbGVycGxhdGUgYXQgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaGVhZGVyIGZpbGVzCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpocmxfaGVhZGVyKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKKyAgb3V0IDw8ICItaWZuZGVmKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCkuIiA8PCBlbmRsIDw8ICItZGVmaW5lKF8iIDw8IG5hbWUgPDwgIl9pbmNsdWRlZCwgeWVhaCkuIgorICAgICAgPDwgZW5kbDsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9mb290ZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgeworICAodm9pZCluYW1lOworICBvdXQgPDwgIi1lbmRpZi4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHJlc3VsdCArPSAiLWluY2x1ZGUoXCIiICsgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgKyAiX3R5cGVzLmhybFwiKS5cbiI7CisgIH0KKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gIlxuIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZygiJSVcbiIpICsgIiUlIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgKyAiJSVcbiIgKyAiJSUgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgKyAiJSVcbiI7Cit9CisKKy8qKgorICogQ29tbWVudCBvdXQgdGV4dAorICovCisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmNvbW1lbnQoc3RyaW5nIGluKSB7CisgIHNpemVfdCBwb3MgPSAwOworICBpbi5pbnNlcnQocG9zLCAiJSUgIik7CisgIHdoaWxlICgocG9zID0gaW4uZmluZF9maXJzdF9vZignXG4nLCBwb3MpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBpbi5pbnNlcnQoKytwb3MsICIlJSAiKTsKKyAgfQorICByZXR1cm4gaW47Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9pbXBvcnRzKCkgeworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm8iLCAxKTsKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygic3RydWN0X2luZm9fZXh0IiwgMSk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoImVudW1faW5mbyIsIDEpOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJlbnVtX25hbWVzIiwgMCk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9uYW1lcyIsIDApOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJleGNlcHRpb25fbmFtZXMiLCAwKTsKKworICBmX3R5cGVzX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF90eXBlc19saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfZmlsZV8gPDwgZl9pbmZvXy5zdHIoKTsKKyAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm8oXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc19maWxlXyA8PCBmX2luZm9fZXh0Xy5zdHIoKTsKKyAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm9fZXh0KF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpOworCisgIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoInN0cnVjdF9uYW1lcyIsIHZfc3RydWN0X25hbWVzXyk7CisgIGdlbmVyYXRlX2VudW1fbWV0YWRhdGEoKTsKKyAgZ2VuZXJhdGVfdHlwZV9tZXRhZGF0YSgiZW51bV9uYW1lcyIsIHZfZW51bV9uYW1lc18pOworICBnZW5lcmF0ZV90eXBlX21ldGFkYXRhKCJleGNlcHRpb25fbmFtZXMiLCB2X2V4Y2VwdGlvbl9uYW1lc18pOworCisgIGhybF9mb290ZXIoZl90eXBlc19ocmxfZmlsZV8sIHN0cmluZygiQk9HVVMiKSk7CisKKyAgZl90eXBlc19maWxlXy5jbG9zZSgpOworICBmX3R5cGVzX2hybF9maWxlXy5jbG9zZSgpOworICBmX2NvbnN0c19maWxlXy5jbG9zZSgpOworICBmX2NvbnN0c19ocmxfZmlsZV8uY2xvc2UoKTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcgZW1pdF9kb3VibGVfYXNfc3RyaW5nKGNvbnN0IGRvdWJsZSB2YWx1ZSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBkb3VibGVfb3V0cHV0X3N0cmVhbTsKKyAgLy8gc2V0cyB0aGUgbWF4aW11bSBwcmVjaXNpb246IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL3NldHByZWNpc2lvbgorICAvLyBzZXRzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGZpeGVkOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9maXhlZCAobm90IGluIHNjaWVudGlmaWMgbm90YXRpb24pCisgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTAgKyAxKTsKKworICAjaWZkZWYgX01TQ19WRVIKKyAgICAgIC8vIHN0cnRvZCBpcyBicm9rZW4gaW4gTVNWQyBjb21waWxlcnMgb2xkZXIgdGhhbiAyMDE1LCBzbyBzdGQ6OmZpeGVkIGZhaWxzIHRvIGZvcm1hdCBhIGRvdWJsZSBsaXRlcmFsLgorICAgICAgLy8gbW9yZSBkZXRhaWxzOiBodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS92Y2Jsb2cvMjAxNC8wNi8xOC8KKyAgICAgIC8vICAgICAgICAgICAgICAgYy1ydW50aW1lLWNydC1mZWF0dXJlcy1maXhlcy1hbmQtYnJlYWtpbmctY2hhbmdlcy1pbi12aXN1YWwtc3R1ZGlvLTE0LWN0cDEvCisgICAgICAvLyAgICAgICAgICAgICAgIGFuZAorICAgICAgLy8gICAgICAgICAgICAgICBodHRwOi8vd3d3LmV4cGxvcmluZ2JpbmFyeS5jb20vdmlzdWFsLWMtcGx1cy1wbHVzLXN0cnRvZC1zdGlsbC1icm9rZW4vCisgICAgICAjaWYgX01TQ19WRVIgPj0gTVNDXzIwMTVfVkVSCisgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICNlbHNlCisgICAgICAgICAgLy8gbm90ZSB0aGF0IGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGVybGFuZyBnZW5lcmF0b3IgYW5kIHRoZSBNU1ZDIGNvbXBpbGVyIGlzIG9sZGVyIHRoYW4gMjAxNSwKKyAgICAgICAgICAvLyB0aGUgZG91YmxlIGxpdGVyYWwgbXVzdCBiZSBvdXRwdXQgaW4gdGhlIHNjaWVudGlmaWMgZm9ybWF0LiBUaGVyZSBjYW4gYmUgc29tZSBjYXNlcyB3aGVyZSB0aGUKKyAgICAgICAgICAvLyBtYW50aXNzYSBvZiB0aGUgb3V0cHV0IGRvZXMgbm90IGhhdmUgZnJhY3Rpb25hbHMsIHdoaWNoIGlzIGlsbGVnYWwgaW4gRXJsYW5nLgorICAgICAgICAgIC8vIGV4YW1wbGUgPT4gMTAwMDAwMDAwMDAwMDAwMDAuMCBiZWluZyBvdXRwdXQgYXMgMWUrMTYKKyAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OnNjaWVudGlmaWM7CisgICAgICAjZW5kaWYKKyAgI2Vsc2UKKyAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6Zml4ZWQ7CisgICNlbmRpZgorCisgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHZhbHVlOworCisgIHJldHVybiBkb3VibGVfb3V0cHV0X3N0cmVhbS5zdHIoKTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoc3RkOjpzdHJpbmcgZnVuY3Rpb25fbmFtZSwgdmVjdG9yPHN0cmluZz4gbmFtZXMpIHsKKyAgc2l6ZV90IG51bV9zdHJ1Y3RzID0gbmFtZXMuc2l6ZSgpOworCisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCBmdW5jdGlvbl9uYW1lIDw8ICIoKSAtPlxuIjsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiWyI7CisKKworICBmb3Ioc2l6ZV90IGk9MDsgaSA8IG51bV9zdHJ1Y3RzOyBpKyspIHsKKyAgICBmX3R5cGVzX2ZpbGVfIDw8IG5hbWVzLmF0KGkpOworCisgICAgaWYgKGkgPCBudW1fc3RydWN0cyAtIDEpIHsKKyAgICAgIGZfdHlwZXNfZmlsZV8gPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBmX3R5cGVzX2ZpbGVfIDw8ICJdLlxuXG4iOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIG5vIG9wCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfZnVuY3Rpb24odF9jb25zdCogdGNvbnN0LCBvc3RyaW5nc3RyZWFtJiBleHBvcnRzLCBvc3RyaW5nc3RyZWFtJiBmdW5jdGlvbnMpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0Y29uc3QtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBzdHJpbmcgY29uc3RfZnVuX25hbWUgPSBsb3dlcmNhc2UobmFtZSk7CisKKyAgICAvLyBFbWl0IGNvbnN0IGZ1bmN0aW9uIGV4cG9ydC4KKyAgICBpZiAoZXhwb3J0cy50ZWxscCgpID4gMCkgeyBleHBvcnRzIDw8ICIsICI7IH0KKyAgICBleHBvcnRzIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMSwgIiA8PCBjb25zdF9mdW5fbmFtZSA8PCAiLzIiOworCisgICAgLy8gRW1pdCBjb25zdCBmdW5jdGlvbiBkZWZpbml0aW9uLgorICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSB2YWx1ZS0+Z2V0X21hcCgpLmVuZCgpOworICAgIC8vIFRoZSBvbmUtYXJndW1lbnQgZm9ybSB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwLgorICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbWFwKCkuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7CisgICAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIigiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgaS0+Zmlyc3QpIDw8ICIpIC0+ICIKKyAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIGktPnNlY29uZCk7CisgICAgICArK2k7CisgICAgICBmdW5jdGlvbnMgPDwgKGkgIT0gZW5kID8gIjtcbiIgOiAiLlxuXG4iKTsKKyAgICB9CisKKyAgICAvLyBUaGUgdHdvLWFyZ3VtZW50IGZvcm0gcmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwLgorICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbWFwKCkuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkgeworICAgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSA8PCAiLCBfKSAtPiAiCisgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpIDw8ICI7XG4iOworICAgIH0KKyAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIihfLCBEZWZhdWx0KSAtPiBEZWZhdWx0LlxuXG4iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBjb25zdF9mdW5fbmFtZSA9IGxvd2VyY2FzZShuYW1lKTsKKworICAgIGlmIChleHBvcnRzLnRlbGxwKCkgPiAwKSB7IGV4cG9ydHMgPDwgIiwgIjsgfQorICAgIGV4cG9ydHMgPDwgY29uc3RfZnVuX25hbWUgPDwgIi8xLCAiIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMiI7CisKKyAgICBzaXplX3QgbGlzdF9zaXplID0gdmFsdWUtPmdldF9saXN0KCkuc2l6ZSgpOworICAgIHN0cmluZyByZW5kZXJlZF9saXN0ID0gcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHR5cGUsIHZhbHVlKTsKKyAgICBmdW5jdGlvbnMgPDwgY29uc3RfZnVuX25hbWUgPDwgIihOKSB3aGVuIE4gPj0gMSwgTiA9PCAiIDw8IGxpc3Rfc2l6ZSA8PCAiIC0+XG4iCisgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxlbWVudChOLCB7IiA8PCByZW5kZXJlZF9saXN0IDw8ICJ9KS5cbiI7CisgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoTiwgXykgd2hlbiBOID49IDEsIE4gPTwgIiA8PCBsaXN0X3NpemUgPDwgIiAtPlxuIgorICAgICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsZW1lbnQoTiwgeyIgPDwgcmVuZGVyZWRfbGlzdCA8PCAifSk7XG4iCisgICAgICAgICAgICAgIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoXywgRGVmYXVsdCkgLT4gRGVmYXVsdC5cblxuIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbnMoKSB7CisgIG9zdHJpbmdzdHJlYW0gZXhwb3J0czsKKyAgb3N0cmluZ3N0cmVhbSBmdW5jdGlvbnM7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSB2X2NvbnN0c18uYmVnaW4oKTsgY19pdGVyICE9IHZfY29uc3RzXy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbigqY19pdGVyLCBleHBvcnRzLCBmdW5jdGlvbnMpOworICB9CisgIGlmIChleHBvcnRzLnRlbGxwKCkgPiAwKSB7CisgICAgZl9jb25zdHNfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0cy5zdHIoKSA8PCAiXSkuXG5cbiIKKyAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbnMuc3RyKCk7CisgIH0KK30KKworCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIHZfZW51bXNfLnB1c2hfYmFjayh0ZW51bSk7CisgIHZfZW51bV9uYW1lc18ucHVzaF9iYWNrKGF0b21pZnkodGVudW0tPmdldF9uYW1lKCkpKTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgaW5kZW50KGZfdHlwZXNfaHJsX2ZpbGVfKSA8PCAiLWRlZmluZSgiIDw8IGNvbnN0aWZ5KG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXyIgPDwgY29uc3RpZnkodGVudW0tPmdldF9uYW1lKCkpIDw8ICJfIiA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiKS4iIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzX2hybF9maWxlXyA8PCBlbmRsOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9pbmZvKHRfZW51bSogdGVudW0peworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgc2l6ZV90IG51bV9jb25zdGFudHMgPSBjb25zdGFudHMuc2l6ZSgpOworCisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiZW51bV9pbmZvKCIgPDwgYXRvbWlmeSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIikgLT5cbiI7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgIltcbiI7CisKKyAgZm9yKHNpemVfdCBpPTA7IGkgPCBudW1fY29uc3RhbnRzOyBpKyspIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB0X2VudW1fdmFsdWUqIHZhbHVlID0gY29uc3RhbnRzLmF0KGkpOworICAgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAieyIgPDwgYXRvbWlmeSh2YWx1ZS0+Z2V0X25hbWUoKSkgPDwgIiwgIiA8PCB2YWx1ZS0+Z2V0X3ZhbHVlKCkgPDwgIn0iOworCisgICAgaWYgKGkgPCBudW1fY29uc3RhbnRzIC0gMSkgeworICAgICAgZl90eXBlc19maWxlXyA8PCAiLFxuIjsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBmX3R5cGVzX2ZpbGVfIDw8ICJcbiI7CisgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCAiXTtcblxuIjsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fbWV0YWRhdGEoKSB7CisgIHNpemVfdCBlbnVtX2NvdW50ID0gdl9lbnVtc18uc2l6ZSgpOworCisgIGZvcihzaXplX3QgaT0wOyBpIDwgZW51bV9jb3VudDsgaSsrKSB7CisgICAgdF9lbnVtKiB0ZW51bSA9IHZfZW51bXNfLmF0KGkpOworICAgIGdlbmVyYXRlX2VudW1faW5mbyh0ZW51bSk7CisgIH0KKworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgImVudW1faW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS5cblxuIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIC8vIFNhdmUgdGhlIHRjb25zdCBzbyB0aGF0IGZ1bmN0aW9uIGNhbiBiZSBlbWl0dGVkIGluIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpLgorICB2X2NvbnN0c18ucHVzaF9iYWNrKHRjb25zdCk7CisKKyAgZl9jb25zdHNfaHJsX2ZpbGVfIDw8ICItZGVmaW5lKCIgPDwgY29uc3RpZnkobWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSkgPDwgIl8iCisgICAgICAgICAgICAgICAgICAgICA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikuIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdCgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAiIyIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICJ7IjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICBvdXQgPDwgIiA9ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGlmIChtYXBzXykgeworICAgICAgb3V0IDw8ICJtYXBzOmZyb21fbGlzdChbIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJkaWN0OmZyb21fbGlzdChbIjsKKyAgICB9CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbWFwKCkuZW5kKCk7CisgICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKKyAgICAgIG91dCA8PCAieyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCBpLT5maXJzdCkgPDwgIiwiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpIDw8ICJ9IjsKKyAgICAgIGlmICgrK2kgIT0gZW5kKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiXSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgb3V0IDw8ICJzZXRzOmZyb21fbGlzdChbIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5lbmQoKTsKKyAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X2xpc3QoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICppKTsKKyAgICAgIGlmICgrK2kgIT0gZW5kKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiXSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHR5cGUsIHZhbHVlKSA8PCAiXSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIiMiICsgdHlwZV9uYW1lKHR5cGUpICsgInt9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIGlmIChtYXBzXykgeworICAgICAgcmV0dXJuICIje30iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImRpY3Q6bmV3KCkiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAic2V0czpuZXcoKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJbXSI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJ1bmRlZmluZWQiOworICB9Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfdHlwZSh0X2ZpZWxkKiBmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nKCkgfCBiaW5hcnkoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sZWFuKCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImludGVnZXIoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImZsb2F0KCkiOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IHVuc3VwcG9ydGVkIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnRlZ2VyKCkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR5cGUpICsgIigpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIGlmIChtYXBzXykgeworICAgICAgcmV0dXJuICJtYXAoKSI7CisgICAgfSBlbHNlIGlmIChvdHAxNl8pIHsKKyAgICAgIHJldHVybiAiZGljdCgpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJkaWN0OmRpY3QoKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKG90cDE2XykgeworICAgICAgcmV0dXJuICJzZXQoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAic2V0czpzZXQoKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAibGlzdCgpIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IHVuc3VwcG9ydGVkIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl9yZXF1aXJlZG5lc3ModF9maWVsZCogZmllbGQpIHsKKyAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CisgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICByZXR1cm4gInJlcXVpcmVkIjsKKyAgY2FzZSB0X2ZpZWxkOjpUX09QVElPTkFMOgorICAgIHJldHVybiAib3B0aW9uYWwiOworICBkZWZhdWx0OgorICAgIHJldHVybiAidW5kZWZpbmVkIjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdAorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHZfc3RydWN0X25hbWVzXy5wdXNoX2JhY2sodHlwZV9uYW1lKHRzdHJ1Y3QpKTsKKyAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIHZfZXhjZXB0aW9uX25hbWVzXy5wdXNoX2JhY2sodHlwZV9uYW1lKHR4Y2VwdGlvbikpOworICBnZW5lcmF0ZV9lcmxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2hybF9maWxlXywgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhmX2luZm9fLCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKGZfaW5mb19leHRfLCB0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIiUlIHN0cnVjdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOworICBidWYgPDwgaW5kZW50KCkgPDwgIi1yZWNvcmQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgeyI7CisgIHN0cmluZyBmaWVsZF9pbmRlbnQoYnVmLnN0cigpLnNpemUoKSwgJyAnKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKGJ1ZiwgKm1faXRlcik7CisgICAgaWYgKCsrbV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7CisgICAgfQorICB9CisgIGJ1ZiA8PCAifSkuIjsKKworICBvdXQgPDwgYnVmLnN0cigpIDw8IGVuZGw7CisgIG91dCA8PCAiLXR5cGUgIiArIHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgOjogIyIgKyB0eXBlX25hbWUodHN0cnVjdCkgKyAie30uIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWNvcmQgZmllbGQgZGVmaW5pdGlvbgorICovCisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgb3V0IDw8IGF0b21pZnkodG1lbWJlci0+Z2V0X25hbWUoKSk7CisgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSh0bWVtYmVyKSkKKyAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX21lbWJlcl92YWx1ZSh0bWVtYmVyKTsKKyAgb3V0IDw8ICIgOjogIiA8PCByZW5kZXJfbWVtYmVyX3R5cGUodG1lbWJlcik7CisgIGlmICh0bWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICBvdXQgPDwgIiB8ICd1bmRlZmluZWQnIjsKK30KKworYm9vbCB0X2VybF9nZW5lcmF0b3I6Omhhc19kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICBpZiAoIWZpZWxkLT5nZXRfdmFsdWUoKSkgeworICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpCisgICAgICAgICAgfHwgdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfdmFsdWUodF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCFmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICByZXR1cm4gcmVuZGVyX2RlZmF1bHRfdmFsdWUoZmllbGQpOworICB9IGVsc2UgeworICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUoZmllbGQtPmdldF90eXBlKCksIGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvX2V4dCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfdHlwZV90ZXJtKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHNlcnZpY2VfbmFtZV8gPSBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHNlcnZpY2VfbmFtZV8pOworCisgIHN0cmluZyBmX3NlcnZpY2VfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICJfdGhyaWZ0LmhybCI7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIl90aHJpZnQuZXJsIjsKKyAgZl9zZXJ2aWNlX2ZpbGVfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIGZfc2VydmljZV9ocmxfLm9wZW4oZl9zZXJ2aWNlX2hybF9uYW1lLmNfc3RyKCkpOworCisgIC8vIFJlc2V0IHNlcnZpY2UgdGV4dCBhZ2dyZWdhdGluZyBzdHJlYW0gc3RyZWFtcworICBmX3NlcnZpY2VfLnN0cigiIik7CisgIGV4cG9ydF9saW5lc18uc3RyKCIiKTsKKyAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IHRydWU7CisKKyAgaHJsX2hlYWRlcihmX3NlcnZpY2VfaHJsXywgc2VydmljZV9uYW1lXyk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfaHJsXyA8PCAiLWluY2x1ZGUoXCIiCisgICAgICAgICAgICAgICAgICAgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiX3RocmlmdC5ocmxcIikuICUgaW5oZXJpdCAiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfaHJsXyA8PCAiLWluY2x1ZGUoXCIiIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcy5ocmxcIikuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsgLy8gY3Bpcm86IE5ldyBFcmxhbmcgT3JkZXIKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9tZXRhZGF0YSh0c2VydmljZSk7CisKKyAgLy8gaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgIi1tb2R1bGUoIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfdGhyaWZ0KS4iCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICItYmVoYXZpb3VyKHRocmlmdF9zZXJ2aWNlKS4iIDw8IGVuZGwgPDwgZW5kbCA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2ZpbGVfIDw8ICItaW5jbHVkZShcIiIgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0LmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGZfc2VydmljZV8uc3RyKCk7CisKKyAgaHJsX2Zvb3RlcihmX3NlcnZpY2VfaHJsXywgZl9zZXJ2aWNlX25hbWUpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfZmlsZV8uY2xvc2UoKTsKKyAgZl9zZXJ2aWNlX2hybF8uY2xvc2UoKTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0YWRhdGEodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBleHBvcnRfc3RyaW5nKCJmdW5jdGlvbl9uYW1lcyIsIDApOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHNpemVfdCBudW1fZnVuY3Rpb25zID0gZnVuY3Rpb25zLnNpemUoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX25hbWVzKCkgLT4gIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbIjsKKworICBmb3IgKHNpemVfdCBpPTA7IGkgPCBudW1fZnVuY3Rpb25zOyBpKyspIHsKKyAgICB0X2Z1bmN0aW9uKiBjdXJyZW50ID0gZnVuY3Rpb25zLmF0KGkpOworICAgIGZfc2VydmljZV8gPDwgYXRvbWlmeShjdXJyZW50LT5nZXRfbmFtZSgpKTsKKyAgICBpZiAoaSA8IG51bV9mdW5jdGlvbnMgLSAxKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiXS5cblxuIjsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gIGluZGVudChmX3NlcnZpY2VfKSA8PAorICAvLyAgIiUgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGV4cG9ydF9zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJzdHJ1Y3RfaW5mbyhfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdGZ1bmN0aW9uOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgZXhwb3J0X3N0cmluZygiZnVuY3Rpb25faW5mbyIsIDIpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmX3NlcnZpY2VfIDw8ICIlJSUgaW50ZXJmYWNlIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgLy8gSW5oZXJpdGFuY2UgLSBwYXNzIHVua25vd24gZnVuY3Rpb25zIHRvIGJhc2UgY2xhc3MKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIEluZm9UeXBlKSAtPiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpLiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIC8vIHJldHVybiBmdW5jdGlvbl9jbGF1c2UgZXJyb3IgZm9yIG5vbi1leGlzdGVudCBmdW5jdGlvbnMKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oX0Z1bmMsIF9JbmZvKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uTmFtZSwgcGFyYW1zX3R5cGUpIGFuZAorICogZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHJlcGx5X3R5cGUpCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgc3RyaW5nIG5hbWVfYXRvbSA9IGF0b21pZnkodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisKKyAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpOgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcGFyYW1zX3R5cGUpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybShhcmdfc3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpOgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcmVwbHlfdHlwZSkgLT4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0odGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisgIGVsc2UgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvbmV3YXlfdm9pZDsiIDw8IGVuZGw7CisgIGVsc2UKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIntzdHJ1Y3QsIFtdfSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgZXhjZXB0aW9ucyk6CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCBleGNlcHRpb25zKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZW5kZXJfdHlwZV90ZXJtKHhzLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgcmV0dXJuIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoVGhpcyIKKyAgICAgICAgICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpICsgIikiOworfQorCisvKioKKyAqIEFkZCBhIGZ1bmN0aW9uIHRvIHRoZSBleHBvcnRzIGxpc3QKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKKyAgaWYgKGV4cG9ydF9saW5lc19maXJzdF8pIHsKKyAgICBleHBvcnRfbGluZXNfZmlyc3RfID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgZXhwb3J0X2xpbmVzXyA8PCAiLCAiOworICB9CisgIGV4cG9ydF9saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X3R5cGVzX3N0cmluZyhzdHJpbmcgbmFtZSwgaW50IG51bSkgeworICBpZiAoZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XykgeworICAgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBleHBvcnRfdHlwZXNfbGluZXNfIDw8ICIsICI7CisgIH0KKyAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCBuYW1lIDw8ICIvIiA8PCBudW07Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnNpemVfdHlwZSBudW0gPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpOworICBpZiAobnVtID4gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6c2l6ZV90eXBlPihzdGQ6Om51bWVyaWNfbGltaXRzPGludD4oKS5tYXgoKSkpIHsKKyAgICB0aHJvdyAiaW50ZWdlciBvdmVyZmxvdyBpbiB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9mdW5jdGlvbiwgbmFtZSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICB9CisgIGV4cG9ydF9zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgIDEgLy8gVGhpcworICAgICAgICAgICAgICAgICsgc3RhdGljX2Nhc3Q8aW50PihudW0pKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHJlc3VsdCArPSAiLCAiOyAvLyBpbml0aWFsIGNvbW1hIHRvIGNvbXBlbnNhdGUgZm9yIGluaXRpYWwgVGhpcworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImVybCIpOworICBzaXplX3QgcHJlZml4X2xlbmd0aCA9IHByZWZpeC5sZW5ndGgoKTsKKyAgaWYgKHByZWZpeF9sZW5ndGggPiAwICYmIHByZWZpeFtwcmVmaXhfbGVuZ3RoIC0gMV0gIT0gJ18nKSB7CisgICAgcHJlZml4ICs9ICcuJzsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisKKyAgcmV0dXJuIGF0b21pZnkocHJlZml4ICsgbmFtZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBFcmxhbmcgInR5cGUiIChtYWNybyBmb3IgaW50IGNvbnN0YW50cykKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiP3RUeXBlX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICI/dFR5cGVfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiP3RUeXBlX0k4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiP3RUeXBlX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIj90VHlwZV9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICI/dFR5cGVfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiP3RUeXBlX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiP3RUeXBlX0kzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiP3RUeXBlX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICI/dFR5cGVfU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhbiBFcmxhbmcgdGVybSB3aGljaCByZXByZXNlbnRzIGEgdGhyaWZ0IHR5cGUKKyAqLworc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV90ZXJtKHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4cGFuZF9zdHJ1Y3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZW5kZWRfaW5mbykgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJpMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJpMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJkb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGlmIChleHBhbmRfc3RydWN0cykgeworCisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7CisgICAgICBidWYgPDwgIntzdHJ1Y3QsIFsiOworICAgICAgc3RyaW5nIGZpZWxkX2luZGVudChidWYuc3RyKCkuc2l6ZSgpLCAnICcpOworCisgICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlIGNvbnN0JiBmaWVsZHMgPSBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLT5nZXRfbWVtYmVycygpOworICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gZmllbGRzLmVuZCgpOworICAgICAgZm9yIChpID0gZmllbGRzLmJlZ2luKCk7IGkgIT0gZW5kOykgeworICAgICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlOjp2YWx1ZV90eXBlIG1lbWJlciA9ICppOworICAgICAgICBpbnQzMl90IGtleSA9IG1lbWJlci0+Z2V0X2tleSgpOworICAgICAgICBzdHJpbmcgdHlwZSA9IHJlbmRlcl90eXBlX3Rlcm0obWVtYmVyLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpOyAvLyByZWN1cnNpdmUgY2FsbAorCisgICAgICAgIGlmICghZXh0ZW5kZWRfaW5mbykgeworICAgICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0OiB7c3RydWN0LCBbe0ZpZCwgVHlwZX18Li4uXX0KKyAgICAgICAgICBidWYgPDwgInsiIDw8IGtleSA8PCAiLCAiIDw8IHR5cGUgPDwgIn0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0OiB7c3RydWN0LCBbe0ZpZCwgUmVxLCBUeXBlLCBOYW1lLCBEZWZ9fC4uLl19CisgICAgICAgICAgc3RyaW5nIG5hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICAgICAgc3RyaW5nIHZhbHVlID0gcmVuZGVyX21lbWJlcl92YWx1ZShtZW1iZXIpOworICAgICAgICAgIHN0cmluZyByZXF1aXJlZG5lc3MgPSByZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyhtZW1iZXIpOworICAgICAgICAgIGJ1ZiA8PCAieyIgPDwga2V5IDw8ICIsICIgPDwgcmVxdWlyZWRuZXNzIDw8ICIsICIgPDwgdHlwZSA8PCAiLCAiIDw8IGF0b21pZnkobmFtZSkgPDwgIiwgIgorICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAifSI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKytpICE9IGVuZCkgeworICAgICAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYnVmIDw8ICJdfSIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBidWYuc3RyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAie3N0cnVjdCwgeyIgKyBhdG9taWZ5KHR5cGVfbW9kdWxlKHR5cGUpKSArICIsICIgKyB0eXBlX25hbWUodHlwZSkgKyAifX0iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIC8vIHttYXAsIEtleVR5cGUsIFZhbFR5cGV9CisgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgcmV0dXJuICJ7bWFwLCAiICsgcmVuZGVyX3R5cGVfdGVybShrZXlfdHlwZSwgZmFsc2UpICsgIiwgIiArIHJlbmRlcl90eXBlX3Rlcm0odmFsX3R5cGUsIGZhbHNlKQorICAgICAgICAgICArICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgcmV0dXJuICJ7c2V0LCAiICsgcmVuZGVyX3R5cGVfdGVybShlbGVtX3R5cGUsIGZhbHNlKSArICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICByZXR1cm4gIntsaXN0LCAiICsgcmVuZGVyX3R5cGVfdGVybShlbGVtX3R5cGUsIGZhbHNlKSArICJ9IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX21vZHVsZSh0X3R5cGUqIHR0eXBlKSB7CisgIHJldHVybiBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICJfdHlwZXMiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGVybCwKKyAgICAiRXJsYW5nIiwKKyAgICAiICAgIGxlZ2FjeW5hbWVzOiBPdXRwdXQgZmlsZXMgcmV0YWluIG5hbWluZyBjb252ZW50aW9ucyBvZiBUaHJpZnQgMC45LjEgYW5kIGVhcmxpZXIuXG4iCisgICAgIiAgICBtYXBzOiAgICAgICAgR2VuZXJhdGUgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzLlxuIgorICAgICIgICAgb3RwMTY6ICAgICAgIEdlbmVyYXRlIG5vbi1uYW1lc3BhY2VkIGRpY3QgYW5kIHNldCBpbnN0ZWFkIG9mIGRpY3Q6ZGljdCBhbmQgc2V0czpzZXQuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNmNWRkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLyoqCisgKiBUb3AgbGV2ZWwgcHJvZ3JhbSBnZW5lcmF0aW9uIGZ1bmN0aW9uLiBDYWxscyB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzIG1ldGhvZHMKKyAqIGZvciBwcmVwYXJpbmcgZmlsZSBzdHJlYW1zIGV0Yy4gdGhlbiBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgdGhlCisgKiBwcm9ncmFtIHRvIHBlcmZvcm0gdGhlIGNvcnJlY3QgYWN0aW9ucy4KKyAqCisgKiBAcGFyYW0gcHJvZ3JhbSBUaGUgdGhyaWZ0IHByb2dyYW0gdG8gY29tcGlsZSBpbnRvIEMrKyBzb3VyY2UKKyAqLwordm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2VuZXJhdG9yCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKKyAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOworICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIHVuaW9ucyBpbiBkZWNsYXJlZCBvcmRlcgorICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gcHJvZ3JhbV8tPmdldF9vYmplY3RzKCk7CisKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24oKm9faXRlcik7CisgIH0KKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7CisKKyAgLy8gR2VuZXJhdGUgc2VydmljZXMKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgfQorCisgIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKKyAgY2xvc2VfZ2VuZXJhdG9yKCk7Cit9CisKK3N0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0X2dlbmVyYXRvcjo6bGFuZ19rZXl3b3JkcygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcga2V5d29yZHNbXSA9IHsgIkJFR0lOIiwgIkVORCIsICJfX0NMQVNTX18iLCAiX19ESVJfXyIsICJfX0ZJTEVfXyIsICJfX0ZVTkNUSU9OX18iLAorICAgICAgIl9fTElORV9fIiwgIl9fTUVUSE9EX18iLCAiX19OQU1FU1BBQ0VfXyIsICJhYnN0cmFjdCIsICJhbGlhcyIsICJhbmQiLCAiYXJncyIsICJhcyIsCisgICAgICAiYXNzZXJ0IiwgImJlZ2luIiwgImJyZWFrIiwgImNhc2UiLCAiY2F0Y2giLCAiY2xhc3MiLCAiY2xvbmUiLCAiY29udGludWUiLCAiZGVjbGFyZSIsCisgICAgICAiZGVmIiwgImRlZmF1bHQiLCAiZGVsIiwgImRlbGV0ZSIsICJkbyIsICJkeW5hbWljIiwgImVsaWYiLCAiZWxzZSIsICJlbHNlaWYiLCAiZWxzaWYiLAorICAgICAgImVuZCIsICJlbmRkZWNsYXJlIiwgImVuZGZvciIsICJlbmRmb3JlYWNoIiwgImVuZGlmIiwgImVuZHN3aXRjaCIsICJlbmR3aGlsZSIsICJlbnN1cmUiLAorICAgICAgImV4Y2VwdCIsICJleGVjIiwgImZpbmFsbHkiLCAiZmxvYXQiLCAiZm9yIiwgImZvcmVhY2giLCAiZnJvbSIsICJmdW5jdGlvbiIsICJnbG9iYWwiLAorICAgICAgImdvdG8iLCAiaWYiLCAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAiaW4iLCAiaW5saW5lIiwgImluc3RhbmNlb2YiLCAiaW50ZXJmYWNlIiwgImlzIiwKKyAgICAgICJsYW1iZGEiLCAibW9kdWxlIiwgIm5hdGl2ZSIsICJuZXciLCAibmV4dCIsICJuaWwiLCAibm90IiwgIm9yIiwgInBhY2thZ2UiLCAicGFzcyIsCisgICAgICAicHVibGljIiwgInByaW50IiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInJhaXNlIiwgInJlZG8iLCAicmVzY3VlIiwgInJldHJ5IiwgInJlZ2lzdGVyIiwKKyAgICAgICJyZXR1cm4iLCAic2VsZiIsICJzaXplb2YiLCAic3RhdGljIiwgInN1cGVyIiwgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLCAidGhlbiIsICJ0aGlzIiwKKyAgICAgICJ0aHJvdyIsICJ0cmFuc2llbnQiLCAidHJ5IiwgInVuZGVmIiwgInVubGVzcyIsICJ1bnNpZ25lZCIsICJ1bnRpbCIsICJ1c2UiLCAidmFyIiwKKyAgICAgICJ2aXJ0dWFsIiwgInZvbGF0aWxlIiwgIndoZW4iLCAid2hpbGUiLCAid2l0aCIsICJ4b3IiLCAieWllbGQiIH07CisgIHJldHVybiBzdGQ6OnNldDxzdGQ6OnN0cmluZz4oa2V5d29yZHMsIGtleXdvcmRzICsgc2l6ZW9mKGtleXdvcmRzKS9zaXplb2Yoa2V5d29yZHNbMF0pICk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlX2lucHV0KCkgY29uc3QgeworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X2VudW1zKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X29iamVjdHMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfY29uc3RzKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKGNvbnN0IHZlY3RvcjxUPiYgbGlzdCkgY29uc3R7CisgIHR5cGVuYW1lIHZlY3RvcjxUPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgIGZvcihpdD1saXN0LmJlZ2luKCk7IGl0ICE9IGxpc3QuZW5kKCk7ICsraXQpIHsKKyAgICAgIHZhbGlkYXRlKCppdCk7CisgIH0KK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9mdW5jdGlvbiBjb25zdCogZikgY29uc3QgeworICB2YWxpZGF0ZV9pZChmLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUoZi0+Z2V0X2FyZ2xpc3QoKSk7CisgIHZhbGlkYXRlKGYtPmdldF94Y2VwdGlvbnMoKSk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfc2VydmljZSBjb25zdCogcykgY29uc3QgeworICB2YWxpZGF0ZV9pZChzLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUocy0+Z2V0X2Z1bmN0aW9ucygpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9lbnVtIGNvbnN0KiBlbikgY29uc3QgeworICB2YWxpZGF0ZV9pZChlbi0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKGVuLT5nZXRfY29uc3RhbnRzKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9zdHJ1Y3QgY29uc3QqIHMpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQocy0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKHMtPmdldF9tZW1iZXJzKCkpOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2VudW1fdmFsdWUgY29uc3QqIGVuX3ZhbCkgY29uc3QgeworICB2YWxpZGF0ZV9pZChlbl92YWwtPmdldF9uYW1lKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF90eXBlZGVmIGNvbnN0KiB0ZCkgY29uc3QgeworICB2YWxpZGF0ZV9pZCh0ZC0+Z2V0X25hbWUoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2NvbnN0IGNvbnN0KiBjKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGMtPmdldF9uYW1lKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9maWVsZCBjb25zdCogZikgY29uc3QgeworICB2YWxpZGF0ZV9pZChmLT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGVfaWQoY29uc3Qgc3RyaW5nJiBpZCkgY29uc3QgeworICBpZiAoa2V5d29yZHNfLmZpbmQoaWQpICE9IGtleXdvcmRzXy5lbmQoKSkgeworICAgIGZhaWx1cmUoIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZDogXCIlc1wiIiwgaWQuY19zdHIoKSk7CisgIH0KK30KKworc3RyaW5nIHRfZ2VuZXJhdG9yOjplc2NhcGVfc3RyaW5nKGNvbnN0IHN0cmluZyYgaW4pIGNvbnN0IHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbi5iZWdpbigpOyBpdCA8IGluLmVuZCgpOyBpdCsrKSB7CisgICAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciByZXMgPSBlc2NhcGVfLmZpbmQoKml0KTsKKyAgICBpZiAocmVzICE9IGVzY2FwZV8uZW5kKCkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQocmVzLT5zZWNvbmQpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKCppdCk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY29uc3QoKmNfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKSB7CisgIGlmICghY29tbWVudF9zdGFydC5lbXB0eSgpKQorICAgIGluZGVudChvdXQpIDw8IGNvbW1lbnRfc3RhcnQ7CisgIHN0cmluZ3N0cmVhbSBkb2NzKGNvbnRlbnRzLCBpb3NfYmFzZTo6aW4pOworICB3aGlsZSAoIShkb2NzLmVvZigpIHx8IGRvY3MuZmFpbCgpKSkgeworICAgIGNoYXIgbGluZVsxMDI0XTsKKyAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7CisKKyAgICBpZiAoc3RybGVuKGxpbmUpID4gMCkgeworICAgICAgaW5kZW50KG91dCkgPDwgbGluZV9wcmVmaXggPDwgbGluZSA8PCBzdGQ6OmVuZGw7CisgICAgfSBlbHNlIGlmIChsaW5lX3ByZWZpeC5lbXB0eSgpKXsKKyAgICAgIG91dCA8PCBzdGQ6OmVuZGw7CisgICAgfSBlbHNlIGlmKCFkb2NzLmVvZigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBsaW5lX3ByZWZpeCA8PCBzdGQ6OmVuZGw7CisgICAgfQorICB9CisgIGlmICghY29tbWVudF9lbmQuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCBjb21tZW50X2VuZDsKK30KKwordm9pZCB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6cmVnaXN0ZXJfZ2VuZXJhdG9yKHRfZ2VuZXJhdG9yX2ZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgZ2VuX21hcF90JiB0aGVfbWFwID0gZ2V0X2dlbmVyYXRvcl9tYXAoKTsKKyAgaWYgKHRoZV9tYXAuZmluZChmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpKSAhPSB0aGVfbWFwLmVuZCgpKSB7CisgICAgZmFpbHVyZSgiRHVwbGljYXRlIGdlbmVyYXRvcnMgZm9yIGxhbmd1YWdlIFwiJXNcIiFcbiIsIGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkuY19zdHIoKSk7CisgIH0KKyAgdGhlX21hcFtmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpXSA9IGZhY3Rvcnk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnBhcnNlX29wdGlvbnMoY29uc3Qgc3RyaW5nJiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcmIGxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucykgeworICBzdHJpbmc6OnNpemVfdHlwZSBjb2xvbiA9IG9wdGlvbnMuZmluZCgnOicpOworICBsYW5ndWFnZSA9IG9wdGlvbnMuc3Vic3RyKDAsIGNvbG9uKTsKKworICBpZiAoY29sb24gIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gY29sb24gKyAxOworICAgIHdoaWxlIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyA8IG9wdGlvbnMuc2l6ZSgpKSB7CisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBuZXh0X3BvcyA9IG9wdGlvbnMuZmluZCgnLCcsIHBvcyk7CisgICAgICBzdHJpbmcgb3B0aW9uID0gb3B0aW9ucy5zdWJzdHIocG9zLCBuZXh0X3BvcyAtIHBvcyk7CisgICAgICBwb3MgPSAoKG5leHRfcG9zID09IHN0cmluZzo6bnBvcykgPyBuZXh0X3BvcyA6IG5leHRfcG9zICsgMSk7CisKKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIHNlcGFyYXRvciA9IG9wdGlvbi5maW5kKCc9Jyk7CisgICAgICBzdHJpbmcga2V5LCB2YWx1ZTsKKyAgICAgIGlmIChzZXBhcmF0b3IgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGtleSA9IG9wdGlvbjsKKyAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGtleSA9IG9wdGlvbi5zdWJzdHIoMCwgc2VwYXJhdG9yKTsKKyAgICAgICAgdmFsdWUgPSBvcHRpb24uc3Vic3RyKHNlcGFyYXRvciArIDEpOworICAgICAgfQorCisgICAgICBwYXJzZWRfb3B0aW9uc1trZXldID0gdmFsdWU7CisgICAgfQorICB9Cit9CisKK3RfZ2VuZXJhdG9yKiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucykgeworICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOworICBnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXIgPSB0aGVfbWFwLmZpbmQobGFuZ3VhZ2UpOworCisgIGlmIChpdGVyID09IHRoZV9tYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBpdGVyLT5zZWNvbmQtPmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbnMpOworfQorCit0X2dlbmVyYXRvciogdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdHJpbmcmIG9wdGlvbnMpIHsKKyAgc3RyaW5nIGxhbmd1YWdlOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zOworICB0X2dlbmVyYXRvcjo6cGFyc2Vfb3B0aW9ucyhvcHRpb25zLCBsYW5ndWFnZSwgcGFyc2VkX29wdGlvbnMpOworICByZXR1cm4gZ2V0X2dlbmVyYXRvcihwcm9ncmFtLCBsYW5ndWFnZSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbnMpOworfQorCit0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90JiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKSB7CisgIC8vIGh0dHA6Ly93d3cucGFyYXNoaWZ0LmNvbS9jKystZmFxLWxpdGUvY3RvcnMuaHRtbCNmYXEtMTAuMTIKKyAgc3RhdGljIGdlbl9tYXBfdCogdGhlX21hcCA9IG5ldyBnZW5fbWFwX3QoKTsKKyAgcmV0dXJuICp0aGVfbWFwOworfQorCit0X2dlbmVyYXRvcl9mYWN0b3J5Ojp0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbikKKyAgOiBzaG9ydF9uYW1lXyhzaG9ydF9uYW1lKSwgbG9uZ19uYW1lXyhsb25nX25hbWUpLCBkb2N1bWVudGF0aW9uXyhkb2N1bWVudGF0aW9uKSB7CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodGhpcyk7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjlkMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfR0VORVJBVE9SX0gKKyNkZWZpbmUgVF9HRU5FUkFUT1JfSAorI2RlZmluZSBNU0NfMjAxNV9WRVIgMTkwMAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGEgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGJhc2ljCisgKiByb3V0aW5lcyBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCBjb250YWlucyB0aGUgdG9wIGxldmVsIG1ldGhvZCB0aGF0CisgKiBkaXNwYXRjaGVzIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgdmFyaW91cyBjb21wb25lbnRzLgorICoKKyAqLworY2xhc3MgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pCisgICAgOiBrZXl3b3Jkc18obGFuZ19rZXl3b3JkcygpKXsKKyAgICB0bXBfID0gMDsKKyAgICBpbmRlbnRfID0gMDsKKyAgICBwcm9ncmFtXyA9IHByb2dyYW07CisgICAgcHJvZ3JhbV9uYW1lXyA9IGdldF9wcm9ncmFtX25hbWUocHJvZ3JhbSk7CisgICAgZXNjYXBlX1snXG4nXSA9ICJcXG4iOworICAgIGVzY2FwZV9bJ1xyJ10gPSAiXFxyIjsKKyAgICBlc2NhcGVfWydcdCddID0gIlxcdCI7CisgICAgZXNjYXBlX1snIiddID0gIlxcXCIiOworICAgIGVzY2FwZV9bJ1xcJ10gPSAiXFxcXCI7CisgIH0KKworICB2aXJ0dWFsIH50X2dlbmVyYXRvcigpIHt9CisKKyAgLyoqCisgICAqIEZyYW1ld29yayBnZW5lcmF0b3IgbWV0aG9kIHRoYXQgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIGEgcHJvZ3JhbQorICAgKiBhbmQgcGVyZm9ybXMgZ2VuZXJhbCBhY3Rpb25zLiBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFuZAorICAgKiBzaG91bGQgbm90IG5vcm1hbGx5IGJlIG92ZXJ3cml0dGVuIGluIHRoZSBzdWJjbGFzc2VzLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKworICBjb25zdCB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV87IH0KKworICB2b2lkIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfZW5kKTsKKworICBzdGF0aWMgdm9pZCBwYXJzZV9vcHRpb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zLCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucyk7CisKKyAgLyoqCisgICAqIGNoZWNrIHdoZXRoZXIgc3ViLW5hbWVzcGFjZSBkZWNsYXJhY3Rpb24gaXMgdXNlZCBieSBnZW5lcmF0b3IuCisgICAqIGUuZy4gYWxsb3cKKyAgICogbmFtZXNwYWNlIHB5LnR3aXN0ZWQgYmFyCisgICAqIHRvIHNwZWNpZnkgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIC1nZW4gcHk6dHdpc3RlZCBpcyBzcGVjaWZpZWQuCisgICAqIFdpbGwgYmUgY2FsbGVkIHdpdGggc3VibmFtZXNwYWNlLCBpLmUuIGlzX3ZhbGlkX25hbWVzcGFjZSgidHdpc3RlZCIpCisgICAqIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgYWJvdmUgZXhhbXBsZS4KKyAgICovCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICAgICh2b2lkKXN1Yl9uYW1lc3BhY2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIEVzY2FwZSBzdHJpbmcgdG8gdXNlIG9uZSBpbiBnZW5lcmF0ZWQgc291cmNlcy4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXNjYXBlX3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgaW4pIGNvbnN0OworCisgIHN0ZDo6c3RyaW5nIGdldF9lc2NhcGVkX3N0cmluZyh0X2NvbnN0X3ZhbHVlKiBjb25zdHZhbCkgeworICAgIHJldHVybiBlc2NhcGVfc3RyaW5nKGNvbnN0dmFsLT5nZXRfc3RyaW5nKCkpOworICB9CisKKyAgLyoqCisgICAqIENoZWNrIGlmIGFsbCBpZGVudGlmaWVycyBhcmUgdmFsaWQgZm9yIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKKyAgICovCisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZV9pbnB1dCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGxhbmdfa2V5d29yZHMoKSBjb25zdDsKKworICAvKioKKyAgICogQSBsaXN0IG9mIHJlc2VydmVkIHdvcmRzIHRoYXQgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMuCisgICAqLworICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5d29yZHNfOworCisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZV9pZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2VudW0gY29uc3QqIGVuKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZW51bV92YWx1ZSBjb25zdCogZW5fdmFsKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfdHlwZWRlZiBjb25zdCogdGQpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9jb25zdCBjb25zdCogYykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X3NlcnZpY2UgY29uc3QqIHMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9zdHJ1Y3QgY29uc3QqIGMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9maWVsZCBjb25zdCogZikgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2Z1bmN0aW9uIGNvbnN0KiBmKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCB2YWxpZGF0ZShjb25zdCBzdGQ6OnZlY3RvcjxUPiYgbGlzdCkgY29uc3Q7CisKKyAgLyoqCisgICAqIE9wdGlvbmFsIG1ldGhvZHMgdGhhdCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byB0YWtlIG5lY2Vzc2FyeQorICAgKiBzdGVwcyBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBjb2RlIGdlbmVyYXRpb24uCisgICAqLworCisgIHZpcnR1YWwgdm9pZCBpbml0X2dlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFB1cmUgdmlydHVhbCBtZXRob2RzIGltcGxlbWVudGVkIGJ5IHRoZSBnZW5lcmF0b3Igc3ViY2xhc3Nlcy4KKyAgICovCisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsgKHZvaWQpdGNvbnN0OyB9CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpID0gMDsKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCopIHt9CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgICAgLy8gQnkgZGVmYXVsdCBleGNlcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBzdHJ1Y3RzCisgICAgZ2VuZXJhdGVfc3RydWN0KHR4Y2VwdGlvbik7CisgIH0KKworICAvKioKKyAgICogTWV0aG9kIHRvIGdldCB0aGUgcHJvZ3JhbSBuYW1lLCBtYXkgYmUgb3ZlcnJpZGRlbgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfcHJvZ3JhbV9uYW1lKHRfcHJvZ3JhbSogdHByb2dyYW0pIHsgcmV0dXJuIHRwcm9ncmFtLT5nZXRfbmFtZSgpOyB9CisKKyAgLyoqCisgICAqIE1ldGhvZCB0byBnZXQgdGhlIHNlcnZpY2UgbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3NlcnZpY2VfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7IHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKTsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IGRpcmVjdG9yeQorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfb3V0X2RpcigpIGNvbnN0IHsKKyAgICBpZiAocHJvZ3JhbV8tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpIHsKKyAgICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyAiLyI7CisgICAgfQorCisgICAgcmV0dXJuIHByb2dyYW1fLT5nZXRfb3V0X3BhdGgoKSArIG91dF9kaXJfYmFzZV8gKyAiLyI7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHVuaXF1ZSB0ZW1wb3JhcnkgdmFyaWFibGUgbmFtZSwgd2hpY2ggaXMganVzdCAibmFtZSIgd2l0aCBhCisgICAqIG51bWJlciBhcHBlbmRlZCB0byBpdCAoaS5lLiBuYW1lMzUpCisgICAqLworICBzdGQ6OnN0cmluZyB0bXAoc3RkOjpzdHJpbmcgbmFtZSkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgb3V0IDw8IG5hbWUgPDwgdG1wXysrOworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICAvKioKKyAgICogR2VuZXJhdGVzIGEgY29tbWVudCBhYm91dCB0aGlzIGNvZGUgYmVpbmcgYXV0b2dlbmVyYXRlZCwgdXNpbmcgQysrIHN0eWxlCisgICAqIGNvbW1lbnRzLCB3aGljaCBhcmUgYWxzbyBmYWlyIGdhbWUgaW4gSmF2YSAvIFBIUCwgeWF5IQorICAgKgorICAgKiBAcmV0dXJuIEMtc3R5bGUgY29tbWVudCBtZW50aW9uaW5nIHRoYXQgdGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi8qKlxuIikgKyAiICogIiArIGF1dG9nZW5fc3VtbWFyeSgpICsgIlxuIiArICIgKlxuIgorICAgICAgICAgICArICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIiAqICBAZ2VuZXJhdGVkXG4iICsgIiAqL1xuIjsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9zdW1tYXJ5KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIpICsgVEhSSUZUX1ZFUlNJT04gKyAiKSI7CisgIH0KKworICAvKioKKyAgICogSW5kZW50YXRpb24gbGV2ZWwgbW9kaWZpZXJzCisgICAqLworCisgIHZvaWQgaW5kZW50X3VwKCkgeyArK2luZGVudF87IH0KKworICB2b2lkIGluZGVudF9kb3duKCkgeyAtLWluZGVudF87IH0KKworICAvKioKKyAgKiBJbmRlbnRhdGlvbiB2YWxpZGF0aW9uIGhlbHBlcgorICAqLworICBpbnQgaW5kZW50X2NvdW50KCkgeyByZXR1cm4gaW5kZW50XzsgfQorCisgIHZvaWQgaW5kZW50X3ZhbGlkYXRlKCBpbnQgZXhwZWN0ZWQsIGNvbnN0IGNoYXIgKiBmdW5jX25hbWUpIHsKKyAgICBpZiAoaW5kZW50XyAhPSBleHBlY3RlZCkgeyAKKyAgICAgIHB2ZXJib3NlKCJXcm9uZyBpbmRlbnQgY291bnQgaW4gJXM6IGRpZmZlcmVuY2UgPSAlaSBcbiIsIGZ1bmNfbmFtZSwgKGV4cGVjdGVkIC0gaW5kZW50XykpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBJbmRlbnRhdGlvbiBwcmludCBmdW5jdGlvbgorICAgKi8KKyAgc3RkOjpzdHJpbmcgaW5kZW50KCkgeworICAgIHN0ZDo6c3RyaW5nIGluZCA9ICIiOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBpbmRlbnRfOyArK2kpIHsKKyAgICAgIGluZCArPSBpbmRlbnRfc3RyKCk7CisgICAgfQorICAgIHJldHVybiBpbmQ7CisgIH0KKworICAvKioKKyAgICogSW5kZW50YXRpb24gdXRpbGl0eSB3cmFwcGVyCisgICAqLworICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBvcyA8PCBpbmRlbnQoKTsgfQorCisgIC8qKgorICAgKiBDYXBpdGFsaXphdGlvbiBoZWxwZXJzCisgICAqLworICBzdGQ6OnN0cmluZyBjYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaW5bMF0gPSB0b3VwcGVyKGluWzBdKTsKKyAgICByZXR1cm4gaW47CisgIH0KKyAgc3RkOjpzdHJpbmcgZGVjYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKKyAgICByZXR1cm4gaW47CisgIH0KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGxvd2VyY2FzZShzdGQ6OnN0cmluZyBpbikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKKyAgICAgIGluW2ldID0gdG9sb3dlcihpbltpXSk7CisgICAgfQorICAgIHJldHVybiBpbjsKKyAgfQorICBzdGF0aWMgc3RkOjpzdHJpbmcgdXBwZXJjYXNlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7ICsraSkgeworICAgICAgaW5baV0gPSB0b3VwcGVyKGluW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIGluOworICB9CisKKyAgLyoqCisgICAqIFRyYW5zZm9ybXMgYSBjYW1lbCBjYXNlIHN0cmluZyB0byBhbiBlcXVpdmFsZW50IG9uZSBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMKKyAgICogZS5nLiBhTXVsdGlXb3JkIC0+IGFfbXVsdGlfd29yZAorICAgKiAgICAgIHNvbWVOYW1lICAgLT4gc29tZV9uYW1lCisgICAqICAgICAgQ2FtZWxDYXNlICAtPiBjYW1lbF9jYXNlCisgICAqICAgICAgbmFtZSAgICAgICAtPiBuYW1lCisgICAqICAgICAgTmFtZSAgICAgICAtPiBuYW1lCisgICAqLworICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlKHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGluLnNpemUoKTsgKytpKSB7CisgICAgICBpZiAoaXN1cHBlcihpbltpXSkpIHsKKyAgICAgICAgaW5baV0gPSB0b2xvd2VyKGluW2ldKTsKKyAgICAgICAgaW4uaW5zZXJ0KGksICJfIik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbjsKKyAgfQorCisgIC8qKgorICAgICogVHJhbnNmb3JtcyBhIHN0cmluZyB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcyB0byBhIGNhbWVsIGNhc2UgZXF1aXZhbGVudAorICAgICogZS5nLiBhX211bHRpX3dvcmQgLT4gYU11bHRpV29yZAorICAgICogICAgICBzb21lX25hbWUgICAgLT4gIHNvbWVOYW1lCisgICAgKiAgICAgIG5hbWUgICAgICAgICAtPiAgbmFtZQorICAgICovCisgIHN0ZDo6c3RyaW5nIGNhbWVsY2FzZShzdGQ6OnN0cmluZyBpbikgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgYm9vbCB1bmRlcnNjb3JlID0gZmFsc2U7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgaSsrKSB7CisgICAgICBpZiAoaW5baV0gPT0gJ18nKSB7CisgICAgICAgIHVuZGVyc2NvcmUgPSB0cnVlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICh1bmRlcnNjb3JlKSB7CisgICAgICAgIG91dCA8PCAoY2hhcil0b3VwcGVyKGluW2ldKTsKKyAgICAgICAgdW5kZXJzY29yZSA9IGZhbHNlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbltpXTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW1pdF9kb3VibGVfYXNfc3RyaW5nKGNvbnN0IGRvdWJsZSB2YWx1ZSkgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZG91YmxlX291dHB1dF9zdHJlYW07CisgICAgICAvLyBzZXRzIHRoZSBtYXhpbXVtIHByZWNpc2lvbjogaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvaW8vbWFuaXAvc2V0cHJlY2lzaW9uCisgICAgICAvLyBzZXRzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGZpeGVkOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9maXhlZCAobm90IGluIHNjaWVudGlmaWMgbm90YXRpb24pCisgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMSk7CisKKyAgICAgICNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgIC8vIHN0cnRvZCBpcyBicm9rZW4gaW4gTVNWQyBjb21waWxlcnMgb2xkZXIgdGhhbiAyMDE1LCBzbyBzdGQ6OmZpeGVkIGZhaWxzIHRvIGZvcm1hdCBhIGRvdWJsZSBsaXRlcmFsLgorICAgICAgICAgIC8vIG1vcmUgZGV0YWlsczogaHR0cHM6Ly9ibG9ncy5tc2RuLm1pY3Jvc29mdC5jb20vdmNibG9nLzIwMTQvMDYvMTgvCisgICAgICAgICAgLy8gICAgICAgICAgICAgICBjLXJ1bnRpbWUtY3J0LWZlYXR1cmVzLWZpeGVzLWFuZC1icmVha2luZy1jaGFuZ2VzLWluLXZpc3VhbC1zdHVkaW8tMTQtY3RwMS8KKyAgICAgICAgICAvLyAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgIC8vICAgICAgICAgICAgICAgaHR0cDovL3d3dy5leHBsb3JpbmdiaW5hcnkuY29tL3Zpc3VhbC1jLXBsdXMtcGx1cy1zdHJ0b2Qtc3RpbGwtYnJva2VuLworICAgICAgICAgICNpZiBfTVNDX1ZFUiA+PSBNU0NfMjAxNV9WRVIKKyAgICAgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICAgICAjZW5kaWYKKyAgICAgICNlbHNlCisgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICNlbmRpZgorCisgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCB2YWx1ZTsKKworICAgICAgcmV0dXJuIGRvdWJsZV9vdXRwdXRfc3RyZWFtLnN0cigpOworICB9CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIEdldCB0aGUgdHJ1ZSB0eXBlIGJlaGluZCBhIHNlcmllcyBvZiB0eXBlZGVmcy4KKyAgICovCisgIHN0YXRpYyBjb25zdCB0X3R5cGUqIGdldF90cnVlX3R5cGUoY29uc3QgdF90eXBlKiB0eXBlKSB7IHJldHVybiB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7IH0KKyAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsgcmV0dXJuIHR5cGUtPmdldF90cnVlX3R5cGUoKTsgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBUaGUgcHJvZ3JhbSBiZWluZyBnZW5lcmF0ZWQKKyAgICovCisgIHRfcHJvZ3JhbSogcHJvZ3JhbV87CisKKyAgLyoqCisgICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgcHJvZ3JhbSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCisgICAqIGdlbmVyYXRlZC4KKyAgICovCisgIHN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZV87CisKKyAgLyoqCisgICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgc2VydmljZSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCisgICAqIGdlbmVyYXRlZC4KKyAgICovCisgIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87CisKKyAgLyoqCisgICAqIE91dHB1dCB0eXBlLXNwZWNpZmMgZGlyZWN0b3J5IG5hbWUgKCJnZW4tKiIpCisgICAqLworICBzdGQ6OnN0cmluZyBvdXRfZGlyX2Jhc2VfOworCisgIC8qKgorICAgKiBNYXAgb2YgY2hhcmFjdGVycyB0byBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWxzLgorICAgKi8KKyAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+IGVzY2FwZV87CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBpbmRlbnRfc3RyKCkgY29uc3QgeworICAgIHJldHVybiAiICAiOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBDdXJyZW50IGNvZGUgaW5kZW50YXRpb24gbGV2ZWwKKyAgICovCisgIGludCBpbmRlbnRfOworCisgIC8qKgorICAgKiBUZW1wb3JhcnkgdmFyaWFibGUgY291bnRlciwgZm9yIG1ha2luZyB1bmlxdWUgdmFyaWFibGUgbmFtZXMKKyAgICovCisgIGludCB0bXBfOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+ID4KK2NsYXNzIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgOiBwdWJsaWMgc3RkOjpvc3RyaW5nc3RyZWFtIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSgpOiBjb250ZW50c193cml0dGVuKGZhbHNlKSB7fQorCisgIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUoc3RkOjpzdHJpbmcgY29uc3QmIG91dHB1dF9maWxlX3BhdGhfKQorICA6IG91dHB1dF9maWxlX3BhdGgob3V0cHV0X2ZpbGVfcGF0aF8pLCBjb250ZW50c193cml0dGVuKGZhbHNlKSB7fQorCisgIH50ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlKCkgeworICAgIGlmICghY29udGVudHNfd3JpdHRlbikgeworICAgICAgY2xvc2UoKTsKKyAgICB9CisgIH0KKworICB2b2lkIG9wZW4oc3RkOjpzdHJpbmcgY29uc3QmIG91dHB1dF9maWxlX3BhdGhfKSB7CisgICAgb3V0cHV0X2ZpbGVfcGF0aCA9IG91dHB1dF9maWxlX3BhdGhfOworICAgIGNsZWFyX2J1ZigpOworICAgIGNvbnRlbnRzX3dyaXR0ZW4gPSBmYWxzZTsKKyAgfQorCisgIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKGNvbnRlbnRzX3dyaXR0ZW4gfHwgb3V0cHV0X2ZpbGVfcGF0aCA9PSAiIikKKyAgICAgIHJldHVybjsKKworICAgIGlmICghaXNfcmVhZGFibGUob3V0cHV0X2ZpbGVfcGF0aCkpIHsKKyAgICAgIGR1bXAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Omlmc3RyZWFtIG9sZF9maWxlOworICAgIG9sZF9maWxlLmV4Y2VwdGlvbnMob2xkX2ZpbGUuZXhjZXB0aW9ucygpIHwgc3RkOjppZnN0cmVhbTo6YmFkYml0IHwgc3RkOjppZnN0cmVhbTo6ZmFpbGJpdCk7CisgICAgb2xkX2ZpbGUub3BlbihvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIHN0ZDo6aW9zOjppbik7CisKKyAgICBpZiAob2xkX2ZpbGUpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0IG9sZF9maWxlX2NvbnRlbnRzKHN0YXRpY19jYXN0PHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25zdCY+KHN0ZDo6b3N0cmluZ3N0cmVhbSgpIDw8IG9sZF9maWxlLnJkYnVmKCkpLnN0cigpKTsKKyAgICAgIG9sZF9maWxlLmNsb3NlKCk7CisKKyAgICAgIGlmIChvbGRfZmlsZV9jb250ZW50cyAhPSBzdHIoKSkgeworICAgICAgICBkdW1wKCk7CisgICAgICB9CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBkdW1wKCkgeworICAgIHN0ZDo6b2ZzdHJlYW0gb3V0X2ZpbGU7CisgICAgb3V0X2ZpbGUuZXhjZXB0aW9ucyhvdXRfZmlsZS5leGNlcHRpb25zKCkgfCBzdGQ6Om9mc3RyZWFtOjpiYWRiaXQgfCBzdGQ6Om9mc3RyZWFtOjpmYWlsYml0KTsKKyAgICB0cnkgeworICAgICAgb3V0X2ZpbGUub3BlbihvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIHN0ZDo6aW9zOjpvdXQpOworICAgIH0KKyAgICBjYXRjaCAoY29uc3Qgc3RkOjppb3NfYmFzZTo6ZmFpbHVyZSYgZSkgeworICAgICAgOjpmYWlsdXJlKCJmYWlsZWQgdG8gd3JpdGUgdGhlIG91dHB1dCB0byB0aGUgZmlsZSAnJXMnLCBkZXRhaWxzOiAnJXMnIiwgb3V0cHV0X2ZpbGVfcGF0aC5jX3N0cigpLCBlLndoYXQoKSk7CisgICAgfQorICAgIG91dF9maWxlIDw8IHN0cigpOworICAgIG91dF9maWxlLmNsb3NlKCk7CisgICAgY2xlYXJfYnVmKCk7CisgICAgY29udGVudHNfd3JpdHRlbiA9IHRydWU7CisgIH0KKworICB2b2lkIGNsZWFyX2J1ZigpIHsKKyAgICBzdHIoc3RkOjpzdHJpbmcoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc19yZWFkYWJsZShzdGQ6OnN0cmluZyBjb25zdCYgZmlsZV9uYW1lKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHN0ZDo6aWZzdHJlYW0oZmlsZV9uYW1lLmNfc3RyKCkpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZV9wYXRoOworICBib29sIGNvbnRlbnRzX3dyaXR0ZW47Cit9OwordHlwZWRlZiB0ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlPGNoYXI+IG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMjE2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICisjZGVmaW5lIFRfR0VORVJBVE9SX1JFR0lTVFJZX0gKKworY2xhc3MgdF9nZW5lcmF0b3I7CisKKy8qKgorICogQSBmYWN0b3J5IGZvciBwcm9kdWNpbmcgZ2VuZXJhdG9yIGNsYXNzZXMgb2YgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgYWxzbyByZXNwb25zaWJsZSBmb3I6CisgKiAgLSBSZWdpc3RlcmluZyBpdHNlbGYgd2l0aCB0aGUgZ2VuZXJhdG9yIHJlZ2lzdHJ5LgorICogIC0gUHJvdmlkaW5nIGRvY3VtZW50YXRpb24gZm9yIHRoZSBnZW5lcmF0b3JzIGl0IHByb2R1Y2VzLgorICovCitjbGFzcyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKK3B1YmxpYzoKKyAgdF9nZW5lcmF0b3JfZmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKTsKKworICB2aXJ0dWFsIH50X2dlbmVyYXRvcl9mYWN0b3J5KCkge30KKworICB2aXJ0dWFsIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKAorICAgICAgLy8gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUuCisgICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAvLyBOb3RlOiBwYXJzZWRfb3B0aW9ucyB3aWxsIG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgLy8gTm90ZTogb3B0aW9uX3N0cmluZyBtaWdodCBub3QgZXhpc3QgYmV5b25kIHRoZSBjYWxsIHRvIGdldF9nZW5lcmF0b3IuCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykgPSAwOworCisgIHZpcnR1YWwgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpID0gMDsKKworICBzdGQ6OnN0cmluZyBnZXRfc2hvcnRfbmFtZSgpIHsgcmV0dXJuIHNob3J0X25hbWVfOyB9CisgIHN0ZDo6c3RyaW5nIGdldF9sb25nX25hbWUoKSB7IHJldHVybiBsb25nX25hbWVfOyB9CisgIHN0ZDo6c3RyaW5nIGdldF9kb2N1bWVudGF0aW9uKCkgeyByZXR1cm4gZG9jdW1lbnRhdGlvbl87IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgc2hvcnRfbmFtZV87CisgIHN0ZDo6c3RyaW5nIGxvbmdfbmFtZV87CisgIHN0ZDo6c3RyaW5nIGRvY3VtZW50YXRpb25fOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIGdlbmVyYXRvcj4KK2NsYXNzIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCA6IHB1YmxpYyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKK3B1YmxpYzoKKyAgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQorICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeShzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRvY3VtZW50YXRpb24pIHt9CisKKyAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIHsKKyAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgICAgcmV0dXJuIGdlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpOworICB9Cit9OworCitjbGFzcyB0X2dlbmVyYXRvcl9yZWdpc3RyeSB7CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2dlbmVyYXRvcih0X2dlbmVyYXRvcl9mYWN0b3J5KiBmYWN0b3J5KTsKKworICBzdGF0aWMgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucyk7CisgIHN0YXRpYyB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGF1Z25hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKKworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2dlbmVyYXRvcl9mYWN0b3J5Kj4gZ2VuX21hcF90OworICBzdGF0aWMgZ2VuX21hcF90JiBnZXRfZ2VuZXJhdG9yX21hcCgpOworCitwcml2YXRlOgorICB0X2dlbmVyYXRvcl9yZWdpc3RyeSgpOworICB0X2dlbmVyYXRvcl9yZWdpc3RyeShjb25zdCB0X2dlbmVyYXRvcl9yZWdpc3RyeSYpOworfTsKKworI2RlZmluZSBUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGxhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGw8dF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yPigjbGFuZ3VhZ2UsIGxvbmdfbmFtZSwgZG9jKSB7fSAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCBfcmVnaXN0ZXJlcjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTZiODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDM3MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm9ncmFtbWF0aWNhbGx5IHNhbml0aXplZCBmb3Igc3R5bGU6CisgKiBhc3R5bGUgLS1zdHlsZT0xdGJzIC1mIC1wIC1IIC1qIC1VIHRfZ29fZ2VuZXJhdG9yLmNjCisgKgorICogVGhlIG91dHB1dCBvZiBhc3R5bGUgc2hvdWxkIG5vdCBiZSB0YWtlbiB1bnF1ZXN0aW9uaW5nbHksIGJ1dCBpdCBpcyBhIGdvb2QKKyAqIGd1aWRlIGZvciBlbnN1cmluZyB1bmlmb3JtaXR5IGFuZCByZWFkYWJpbGl0eS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2xvY2FsZT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEEgaGVscGVyIGZvciBhdXRvbWF0aWNhbGx5IGZvcm1hdHRpbmcgdGhlIGVtaXR0ZWQgR28gY29kZSBmcm9tIHRoZSBUaHJpZnQKKyAqIElETCBwZXIgdGhlIEdvIHN0eWxlIGd1aWRlLgorICoKKyAqIFJldHVybnM6CisgKiAgLSB0cnVlLCBpZiB0aGUgZm9ybWF0dGluZyBwcm9jZXNzIHN1Y2NlZWRlZC4KKyAqICAtIGZhbHNlLCBpZiB0aGUgZm9ybWF0dGluZyBwcm9jZXNzIGZhaWxlZCwgd2hpY2ggbWVhbnMgdGhlIGJhc2ljIG91dHB1dCB3YXMKKyAqICAgICAgICAgICBzdGlsbCBnZW5lcmF0ZWQuCisgKi8KK2Jvb2wgZm9ybWF0X2dvX291dHB1dChjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCk7CisKK2NvbnN0IHN0cmluZyBERUZBVUxUX1RIUklGVF9JTVBPUlQgPSAiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiOworc3RhdGljIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZmxhZzsKKworLyoqCisgKiBHbyBjb2RlIGdlbmVyYXRvci4KKyAqLworY2xhc3MgdF9nb19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2dvX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKworICAgIGdlbl90aHJpZnRfaW1wb3J0XyA9IERFRkFVTFRfVEhSSUZUX0lNUE9SVDsKKyAgICBnZW5fcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgcGFja2FnZV9mbGFnID0gIiI7CisgICAgcmVhZF93cml0ZV9wcml2YXRlXyA9IGZhbHNlOworICAgIGlnbm9yZV9pbml0aWFsaXNtc18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwYWNrYWdlX3ByZWZpeCIpID09IDApIHsKKyAgICAgICAgZ2VuX3BhY2thZ2VfcHJlZml4XyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0aHJpZnRfaW1wb3J0IikgPT0gMCkgeworICAgICAgICBnZW5fdGhyaWZ0X2ltcG9ydF8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicGFja2FnZSIpID09IDApIHsKKyAgICAgICAgcGFja2FnZV9mbGFnID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJlYWRfd3JpdGVfcHJpdmF0ZSIpID09IDApIHsKKyAgICAgICAgcmVhZF93cml0ZV9wcml2YXRlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImlnbm9yZV9pbml0aWFsaXNtcyIpID09IDApIHsKKyAgICAgICAgaWdub3JlX2luaXRpYWxpc21zXyA9ICB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGdvOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1nbyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHQgPSBmYWxzZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3MgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlc19jb3VudHNldGZpZWxkcyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBPVVRfcHViX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqKiBPVVRfZGVmX3ZhbHVlKSBjb25zdDsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb2VyY2VEYXRhID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBnb19hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgZ29fcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBnb19pbXBvcnRzX2JlZ2luKGJvb2wgY29uc3RzKTsKKyAgc3RkOjpzdHJpbmcgZ29faW1wb3J0c19lbmQoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKGJvb2wgY29uc3RzKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVkX3Byb2dyYW1zKHN0cmluZyYgdW51c2VkX3Byb3RlY3Rpb24pOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHRpb25hbF9maWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgbW9kdWxlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRFcnJvciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19nb190eXBlKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX2tleV90eXBlKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfZ29fbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworCisgICAgaWYgKCFwYWNrYWdlX2ZsYWcuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHBhY2thZ2VfZmxhZzsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJnbyIpOworICAgIGlmICghcmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHJlYWxfbW9kdWxlOworICAgIH0KKworICAgIHJldHVybiBsb3dlcmNhc2UocHJvZ3JhbS0+Z2V0X25hbWUoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgZ2VuX3BhY2thZ2VfcHJlZml4XzsKKyAgc3RkOjpzdHJpbmcgZ2VuX3RocmlmdF9pbXBvcnRfOworICBib29sIHJlYWRfd3JpdGVfcHJpdmF0ZV87CisgIGJvb2wgaWdub3JlX2luaXRpYWxpc21zXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIHN0ZDo6c3RyaW5nIGZfdHlwZXNfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBzdGQ6OnN0cmluZyBmX2NvbnN0c19uYW1lXzsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gZl9jb25zdF92YWx1ZXNfOworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgcmVhZF9tZXRob2RfbmFtZV87CisgIHN0ZDo6c3RyaW5nIHdyaXRlX21ldGhvZF9uYW1lXzsKKworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29tbW9uSW5pdGlhbGlzbXM7CisKKyAgc3RkOjpzdHJpbmcgY2FtZWxjYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgZml4X2NvbW1vbl9pbml0aWFsaXNtKHN0ZDo6c3RyaW5nJiB2YWx1ZSwgaW50IGkpIGNvbnN0OworICBzdGQ6OnN0cmluZyBwdWJsaWNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0ID0gZmFsc2UpIGNvbnN0OworICBzdGQ6OnN0cmluZyBwcml2YXRpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgbmV3X3ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0OworICBzdGF0aWMgc3RkOjpzdHJpbmcgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHN0YXRpYyBib29sIGlzX3BvaW50ZXJfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RhdGljIGJvb2wgb21pdF9pbml0aWFsaXphdGlvbih0X2ZpZWxkKiB0ZmllbGQpOworfTsKKworLy8gcmV0dXJucyB0cnVlIGlmIGZpZWxkIGluaXRpYWxpemF0aW9uIGNhbiBiZSBvbWl0dGVkIHNpbmNlIGl0IGhhcyBjb3JyZXNwb25kaW5nIGdvIHR5cGUgemVybyB2YWx1ZQorLy8gb3IgZGVmYXVsdCB2YWx1ZSBpcyBub3Qgc2V0Citib29sIHRfZ29fZ2VuZXJhdG9yOjpvbWl0X2luaXRpYWxpemF0aW9uKHRfZmllbGQqIHRmaWVsZCkgeworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7CisgIGlmICghdmFsdWUpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgLy9bXWJ5dGUgYXJlIGFsd2F5cyBpbmxpbmUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gc3RyaW5ncyBhcmUgcG9pbnRlcnMgaWYgaGFzIG5vIGRlZmF1bHQKKyAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X3N0cmluZygpLmVtcHR5KCk7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA9PSAwOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfaW50ZWdlcigpID09IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdmFsdWUtPmdldF9kb3VibGUoKSA9PSAwLjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgbmVlZCBhIHJlZmVyZW5jZSBpZiB1c2VkIGFzIG9wdGlvbmFsIHdpdGhvdXQgZGVmYXVsdAorc3RhdGljIGJvb2wgdHlwZV9uZWVkX3JlZmVyZW5jZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgaWYgKHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKQorICAgICAgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19iaW5hcnkoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gcmV0dXJucyBmYWxzZSBpZiBmaWVsZCBjb3VsZCBub3QgdXNlIGNvbXBhcmlzb24gdG8gZGVmYXVsdCB2YWx1ZSBhcyAhSXNTZXQqCitib29sIHRfZ29fZ2VuZXJhdG9yOjppc19wb2ludGVyX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbl9jb250YWluZXJfdmFsdWUpIHsKKyAgKHZvaWQpaW5fY29udGFpbmVyX3ZhbHVlOworICBpZiAodGZpZWxkLT5hbm5vdGF0aW9uc18uY291bnQoImNwcC5yZWYiKSAhPSAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIC8vIFN0cnVjdHMgaW4gY29udGFpbmVycyBhcmUgcG9pbnRlcnMKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoISh0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIGhhc19kZWZhdWx0ID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgLy9bXWJ5dGUgYXJlIGFsd2F5cyBpbmxpbmUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy8gc3RyaW5ncyBhcmUgcG9pbnRlcnMgaWYgaGFzIG5vIGRlZmF1bHQKKyAgICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAhaGFzX2RlZmF1bHQ7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiBoYXNfZGVmYXVsdDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gaGFzX2RlZmF1bHQ7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZ29fdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpjYW1lbGNhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7CisgIHN0ZDo6c2V0bG9jYWxlKExDX0FMTCwgIkMiKTsgLy8gc2V0IGxvY2FsZSB0byBjbGFzc2ljCisKKyAgLy8gRml4IGNvbW1vbiBpbml0aWFsaXNtIGluIGZpcnN0IHdvcmQKKyAgZml4X2NvbW1vbl9pbml0aWFsaXNtKHZhbHVlMiwgMCk7CisKKyAgLy8gYXMgbG9uZyBhcyB3ZSBhcmUgY2hhbmdpbmcgdGhpbmdzLCBsZXQncyBjaGFuZ2UgXyBmb2xsb3dlZCBieSBsb3dlcmNhc2UgdG8KKyAgLy8gY2FwaXRhbCBhbmQgZml4IGNvbW1vbiBpbml0aWFsaXNtcworICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDE7IGkgPCB2YWx1ZTIuc2l6ZSgpIC0gMTsgKytpKSB7CisgICAgaWYgKHZhbHVlMltpXSA9PSAnXycpIHsKKyAgICAgIGlmIChpc2xvd2VyKHZhbHVlMltpICsgMV0pKSB7CisgICAgICAgIHZhbHVlMi5yZXBsYWNlKGksIDIsIDEsIHRvdXBwZXIodmFsdWUyW2kgKyAxXSkpOworICAgICAgfQorCisgICAgICBpZiAoaSA+IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nOjpzaXplX3R5cGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50PigpLm1heCgpKSkgeworICAgICAgICB0aHJvdyAiaW50ZWdlciBvdmVyZmxvdyBpbiB0X2dvX2dlbmVyYXRvcjo6Y2FtZWxjYXNlLCB2YWx1ZSA9ICIgKyB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGZpeF9jb21tb25faW5pdGlhbGlzbSh2YWx1ZTIsIHN0YXRpY19jYXN0PGludD4oaSkpOworICAgIH0KKyAgfQorCisgIHJldHVybiB2YWx1ZTI7Cit9CisKKy8vIENoZWNrcyB0byBzZWUgaWYgdGhlIHdvcmQgc3RhcnRpbmcgYXQgaSBpbiB2YWx1ZSBjb250YWlucyBhIGNvbW1vbiBpbml0aWFsaXNtCisvLyBhbmQgaWYgc28gcmVwbGFjZXMgaXQgd2l0aCB0aGUgdXBwZXIgY2FzZSB2ZXJzaW9uIG9mIHRoZSB3b3JkLgordm9pZCB0X2dvX2dlbmVyYXRvcjo6Zml4X2NvbW1vbl9pbml0aWFsaXNtKHN0ZDo6c3RyaW5nJiB2YWx1ZSwgaW50IGkpIGNvbnN0IHsKKyAgaWYgKCFpZ25vcmVfaW5pdGlhbGlzbXNfKSB7CisgICAgc2l6ZV90IHdvcmRMZW4gPSB2YWx1ZS5maW5kKCdfJywgaSk7CisgICAgaWYgKHdvcmRMZW4gIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHdvcmRMZW4gLT0gaTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgd29yZCA9IHZhbHVlLnN1YnN0cihpLCB3b3JkTGVuKTsKKyAgICBzdGQ6OnRyYW5zZm9ybSh3b3JkLmJlZ2luKCksIHdvcmQuZW5kKCksIHdvcmQuYmVnaW4oKSwgOjp0b3VwcGVyKTsKKyAgICBpZiAoY29tbW9uSW5pdGlhbGlzbXMuZmluZCh3b3JkKSAhPSBjb21tb25Jbml0aWFsaXNtcy5lbmQoKSkgeworICAgICAgdmFsdWUucmVwbGFjZShpLCB3b3JkLmxlbmd0aCgpLCB3b3JkKTsKKyAgICB9CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnB1YmxpY2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQpIGNvbnN0IHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKSwgcHJlZml4OworCisgIHN0cmluZzo6c2l6ZV90eXBlIGRvdF9wb3MgPSB2YWx1ZS5yZmluZCgnLicpOworICBpZiAoZG90X3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBwcmVmaXggPSB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgcHJlZml4OworICAgIHZhbHVlMiA9IHZhbHVlLnN1YnN0cihkb3RfcG9zICsgMSk7CisgIH0KKworICBpZiAoIWlzdXBwZXIodmFsdWUyWzBdKSkgeworICAgIHZhbHVlMlswXSA9IHRvdXBwZXIodmFsdWUyWzBdKTsKKyAgfQorCisgIHZhbHVlMiA9IGNhbWVsY2FzZSh2YWx1ZTIpOworCisgIC8vIGZpbmFsIGxlbmd0aCBiZWZvcmUgZnVydGhlciBjaGVja3MsIHRoZSBzdHJpbmcgbWF5IGJlY29tZSBsb25nZXIKKyAgc2l6ZV90IGxlbl9iZWZvcmUgPSB2YWx1ZTIubGVuZ3RoKCk7CisKKyAgLy8gSURMIGlkZW50aWZpZXJzIG1heSBzdGFydCB3aXRoICJOZXciIHdoaWNoIGludGVyZmVyZXMgd2l0aCB0aGUgQ1RPUiBwYXR0ZXJuCisgIC8vIEFkZGluZyBhbiBleHRyYSB1bmRlcnNjb3JlIHRvIGFsbCB0aG9zZSBpZGVudGlmaWVycyBzb2x2ZXMgdGhpcworICBpZiAoKGxlbl9iZWZvcmUgPj0gMykgJiYgKHZhbHVlMi5zdWJzdHIoMCwgMykgPT0gIk5ldyIpKSB7CisgICAgdmFsdWUyICs9ICdfJzsKKyAgfQorCisgIC8vIElETCBpZGVudGlmaWVycyBtYXkgZW5kIHdpdGggIkFyZ3MiLyJSZXN1bHQiIHdoaWNoIGludGVyZmVyZXMgd2l0aCB0aGUgaW1wbGljaXQgc2VydmljZQorICAvLyBmdW5jdGlvbiBzdHJ1Y3RzCisgIC8vIEFkZGluZyBhbm90aGVyIGV4dHJhIHVuZGVyc2NvcmUgdG8gYWxsIHRob3NlIGlkZW50aWZpZXJzIHNvbHZlcyB0aGlzCisgIC8vIFN1cHByZXNzIHRoaXMgY2hlY2sgZm9yIHRoZSBhY3R1YWwgaGVscGVyIHN0cnVjdCBuYW1lcworICBpZiAoIWlzX2FyZ3Nfb3JfcmVzdWx0KSB7CisgICAgYm9vbCBlbmRzX3dpdGhfYXJncyA9IChsZW5fYmVmb3JlID49IDQpICYmICh2YWx1ZTIuc3Vic3RyKGxlbl9iZWZvcmUgLSA0LCA0KSA9PSAiQXJncyIpOworICAgIGJvb2wgZW5kc193aXRoX3JzbHQgPSAobGVuX2JlZm9yZSA+PSA2KSAmJiAodmFsdWUyLnN1YnN0cihsZW5fYmVmb3JlIC0gNiwgNikgPT0gIlJlc3VsdCIpOworICAgIGlmIChlbmRzX3dpdGhfYXJncyB8fCBlbmRzX3dpdGhfcnNsdCkgeworICAgICAgdmFsdWUyICs9ICdfJzsKKyAgICB9CisgIH0KKworICAvLyBBdm9pZCBuYW1pbmcgY29sbGlzaW9ucyB3aXRoIG90aGVyIHNlcnZpY2VzCisgIGlmIChpc19hcmdzX29yX3Jlc3VsdCkgeworICAgIHByZWZpeCArPSBwdWJsaWNpemUoc2VydmljZV9uYW1lXyk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgdmFsdWUyOworfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6bmV3X3ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHZhbHVlLnJmaW5kKCcuJyk7CisgIGlmIChkb3RfcG9zICE9IHN0cmluZzo6bnBvcykgeworICAgIHJldHVybiB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgIk5ldyIgKyBwdWJsaWNpemUodmFsdWUuc3Vic3RyKGRvdF9wb3MgKyAxKSk7CisgIH0KKyAgcmV0dXJuICJOZXciICsgcHVibGljaXplKHZhbHVlKTsKK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnByaXZhdGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKKyAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKKworICBpZiAoIWlzbG93ZXIodmFsdWUyWzBdKSkgeworICAgIHZhbHVlMlswXSA9IHRvbG93ZXIodmFsdWUyWzBdKTsKKyAgfQorCisgIHZhbHVlMiA9IGNhbWVsY2FzZSh2YWx1ZTIpOworCisgIHJldHVybiB2YWx1ZTI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHZhbHVlMi5iZWdpbigpLCB2YWx1ZTIuZW5kKCksIHZhbHVlMi5iZWdpbigpLCA6OnRvbG93ZXIpOworCisgIHN3aXRjaCAodmFsdWVbMF0pIHsKKyAgY2FzZSAnYic6CisgIGNhc2UgJ0InOgorICAgIGlmICh2YWx1ZTIgIT0gImJyZWFrIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2MnOgorICBjYXNlICdDJzoKKyAgICBpZiAodmFsdWUyICE9ICJjYXNlIiAmJiB2YWx1ZTIgIT0gImNoYW4iICYmIHZhbHVlMiAhPSAiY29uc3QiICYmIHZhbHVlMiAhPSAiY29udGludWUiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZCc6CisgIGNhc2UgJ0QnOgorICAgIGlmICh2YWx1ZTIgIT0gImRlZmF1bHQiICYmIHZhbHVlMiAhPSAiZGVmZXIiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZSc6CisgIGNhc2UgJ0UnOgorICAgIGlmICh2YWx1ZTIgIT0gImVsc2UiICYmIHZhbHVlMiAhPSAiZXJyb3IiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAnZic6CisgIGNhc2UgJ0YnOgorICAgIGlmICh2YWx1ZTIgIT0gImZhbGx0aHJvdWdoIiAmJiB2YWx1ZTIgIT0gImZvciIgJiYgdmFsdWUyICE9ICJmdW5jIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2cnOgorICBjYXNlICdHJzoKKyAgICBpZiAodmFsdWUyICE9ICJnbyIgJiYgdmFsdWUyICE9ICJnb3RvIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2knOgorICBjYXNlICdJJzoKKyAgICBpZiAodmFsdWUyICE9ICJpZiIgJiYgdmFsdWUyICE9ICJpbXBvcnQiICYmIHZhbHVlMiAhPSAiaW50ZXJmYWNlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ20nOgorICBjYXNlICdNJzoKKyAgICBpZiAodmFsdWUyICE9ICJtYXAiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAncCc6CisgIGNhc2UgJ1AnOgorICAgIGlmICh2YWx1ZTIgIT0gInBhY2thZ2UiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAncic6CisgIGNhc2UgJ1InOgorICAgIGlmICh2YWx1ZTIgIT0gInJhbmdlIiAmJiB2YWx1ZTIgIT0gInJldHVybiIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdzJzoKKyAgY2FzZSAnUyc6CisgICAgaWYgKHZhbHVlMiAhPSAic2VsZWN0IiAmJiB2YWx1ZTIgIT0gInN0cnVjdCIgJiYgdmFsdWUyICE9ICJzd2l0Y2giKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAndCc6CisgIGNhc2UgJ1QnOgorICAgIGlmICh2YWx1ZTIgIT0gInR5cGUiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAndic6CisgIGNhc2UgJ1YnOgorICAgIGlmICh2YWx1ZTIgIT0gInZhciIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTIgKyAiX2ExIjsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKKyAgc3RyaW5nIHRhcmdldCA9IG1vZHVsZTsKKyAgcGFja2FnZV9kaXJfID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBUaGlzIHNldCBpcyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nb2xhbmcvbGludC9ibG9iL21hc3Rlci9saW50LmdvI0w2OTIKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJBUEkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJBU0NJSSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkNQVSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkNTUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkROUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkVPRiIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkdVSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJIVE1MIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSFRUUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkhUVFBTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJJUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkpTT04iKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJMSFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJRUFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSQU0iKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSSFMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSUEMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTTEEiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTTVRQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiU1NIIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVENQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVExTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVFRMIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVURQIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVUkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVSUQiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVVUlEIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVJJIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVJMIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVRGOCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlZNIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWE1MIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWFNSRiIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlhTUyIpOworCisgIC8vIG5hbWVzIG9mIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMKKyAgaWYgKHJlYWRfd3JpdGVfcHJpdmF0ZV8pIHsKKyAgICByZWFkX21ldGhvZF9uYW1lXyA9ICJyZWFkIjsKKyAgICB3cml0ZV9tZXRob2RfbmFtZV8gPSAid3JpdGUiOworICB9IGVsc2UgeworICAgIHJlYWRfbWV0aG9kX25hbWVfID0gIlJlYWQiOworICAgIHdyaXRlX21ldGhvZF9uYW1lXyA9ICJXcml0ZSI7CisgIH0KKworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgorICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKKworICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbW9kdWxlLmZpbmQoJy4nKTsKKworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZTsKKyAgICAgIHBhY2thZ2VfbmFtZV8gPSBtb2R1bGU7CisgICAgICBtb2R1bGUuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGUuc3Vic3RyKDAsIHBvcyk7CisgICAgICBtb2R1bGUuZXJhc2UoMCwgcG9zICsgMSk7CisgICAgfQorICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHdoaWxlICgobG9jID0gdGFyZ2V0LmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgdGFyZ2V0LnJlcGxhY2UobG9jLCAxLCAxLCAnLycpOworICB9CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKKyAgZl90eXBlc19uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLmdvIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWVfLmNfc3RyKCkpOworCisgIGZfY29uc3RzX25hbWVfID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItY29uc3RzLmdvIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZV8uY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW5jbHVkZXMoZmFsc2UpOworCisgIGZfY29uc3RzXyA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBnb19wYWNrYWdlKCkgPDwgcmVuZGVyX2luY2x1ZGVzKHRydWUpOworCisgIGZfY29uc3RfdmFsdWVzXyA8PCBlbmRsIDw8ICJmdW5jIGluaXQoKSB7IiA8PCBlbmRsOworCisgIC8vIENyZWF0ZSBmaWxlIGZvciB0aGUgR29VbnVzZWRQcm90ZWN0aW9uX18gdmFyaWFibGUKKyAgc3RyaW5nIGZfdW51c2VkX3Byb3RfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAiR29VbnVzZWRQcm90ZWN0aW9uX18uZ28iOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW51c2VkX3Byb3RfOworICBmX3VudXNlZF9wcm90Xy5vcGVuKGZfdW51c2VkX3Byb3RfbmFtZV8uY19zdHIoKSk7CisgIGZfdW51c2VkX3Byb3RfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKKyAgZl91bnVzZWRfcHJvdF8uY2xvc2UoKTsKK30KKworCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcyhzdHJpbmcmIHVudXNlZF9wcm90ZWN0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICB1bnVzZWRfcHJvdGVjdGlvbiA9ICIiOworCisgIHN0cmluZyBsb2NhbF9uYW1lc3BhY2UgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmICghbG9jYWxfbmFtZXNwYWNlLmVtcHR5KCkgJiYgbG9jYWxfbmFtZXNwYWNlID09IGluY2x1ZGVzW2ldLT5nZXRfbmFtZXNwYWNlKCJnbyIpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzdHJpbmcgZ29fbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKGluY2x1ZGVzW2ldKTsKKyAgICBzaXplX3QgZm91bmQgPSAwOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZ29fbW9kdWxlLnNpemUoKTsgaisrKSB7CisgICAgICAvLyBJbXBvcnQgc3RhdGVtZW50IHVzZXMgc2xhc2hlcyAoJy8nKSBpbiBuYW1lc3BhY2UKKyAgICAgIGlmIChnb19tb2R1bGVbal0gPT0gJy4nKSB7CisgICAgICAgIGdvX21vZHVsZVtqXSA9ICcvJzsKKyAgICAgICAgZm91bmQgPSBqICsgMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgKz0gIlx0XCIiICsgZ2VuX3BhY2thZ2VfcHJlZml4XyArIGdvX21vZHVsZSArICJcIlxuIjsKKyAgICB1bnVzZWRfcHJvdGVjdGlvbiArPSAidmFyIF8gPSAiICsgZ29fbW9kdWxlLnN1YnN0cihmb3VuZCkgKyAiLkdvVW51c2VkUHJvdGVjdGlvbl9fXG4iOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtLgorICogSWYgY29uc3RzIGluY2x1ZGUgdGhlIGFkZGl0aW9uYWwgaW1wb3J0cy4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoYm9vbCBjb25zdHMpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBzdHJpbmcgdW51c2VkX3Byb3QgPSAiIjsKKworICBzdHJpbmcgbG9jYWxfbmFtZXNwYWNlID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImdvIik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoIWxvY2FsX25hbWVzcGFjZS5lbXB0eSgpICYmIGxvY2FsX25hbWVzcGFjZSA9PSBpbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiZ28iKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3RyaW5nIGdvX21vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShpbmNsdWRlc1tpXSk7CisgICAgc2l6ZV90IGZvdW5kID0gMDsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGdvX21vZHVsZS5zaXplKCk7IGorKykgeworICAgICAgLy8gSW1wb3J0IHN0YXRlbWVudCB1c2VzIHNsYXNoZXMgKCcvJykgaW4gbmFtZXNwYWNlCisgICAgICBpZiAoZ29fbW9kdWxlW2pdID09ICcuJykgeworICAgICAgICBnb19tb2R1bGVbal0gPSAnLyc7CisgICAgICAgIGZvdW5kID0gaiArIDE7CisgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ICs9ICJcdFwiIiArIGdlbl9wYWNrYWdlX3ByZWZpeF8gKyBnb19tb2R1bGUgKyAiXCJcbiI7CisgICAgdW51c2VkX3Byb3QgKz0gInZhciBfID0gIiArIGdvX21vZHVsZS5zdWJzdHIoZm91bmQpICsgIi5Hb1VudXNlZFByb3RlY3Rpb25fX1xuIjsKKyAgfQorCisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9ICJcbiI7CisgIH0KKworICByZXR1cm4gZ29faW1wb3J0c19iZWdpbihjb25zdHMpICsgcmVzdWx0ICsgZ29faW1wb3J0c19lbmQoKSArIHVudXNlZF9wcm90OworfQorCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9pbXBvcnRfcHJvdGVjdGlvbigpIHsKKyAgcmV0dXJuIHN0cmluZygidmFyIEdvVW51c2VkUHJvdGVjdGlvbl9fIGludDtcblxuIik7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgYWNjZWxlcmF0ZWQgVEJpbmFyeVByb3RvY29sCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSB7CisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuCisgICAgICAgIHN0ZDo6c3RyaW5nKCkgKworICAgICAgICAiLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG5cbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBwYWNrYWdlCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fcGFja2FnZSgpIHsKKyAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiXG5cbiI7Cit9CisKKy8qKgorICogUmVuZGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGltcG9ydCBzdGF0ZW1lbnQuCisgKiBJZiBjb25zdHMgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBpbXBvcnRzLgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfYmVnaW4oYm9vbCBjb25zdHMpIHsKKyAgc3RyaW5nIGV4dHJhOworCisgIC8vIElmIG5vdCB3cml0aW5nIGNvbnN0YW50cywgYW5kIHRoZXJlIGFyZSBlbnVtcywgbmVlZCBleHRyYSBpbXBvcnRzLgorICBpZiAoIWNvbnN0cyAmJiBnZXRfcHJvZ3JhbSgpLT5nZXRfZW51bXMoKS5zaXplKCkgPiAwKSB7CisgICAgZXh0cmEgKz0KKyAgICAgICJcdFwiZGF0YWJhc2Uvc3FsL2RyaXZlclwiXG4iCisgICAgICAiXHRcImVycm9yc1wiXG4iOworICB9CisgIHJldHVybiBzdHJpbmcoCisgICAgICAiaW1wb3J0IChcbiIKKyAgICAgICJcdFwiYnl0ZXNcIlxuIgorICAgICAgIlx0XCJjb250ZXh0XCJcbiIKKyAgICAgICJcdFwicmVmbGVjdFwiXG4iCisgICAgICArIGV4dHJhICsKKyAgICAgICJcdFwiZm10XCJcbiIKKyAgICAgICJcdFwiIiArIGdlbl90aHJpZnRfaW1wb3J0XyArICJcIlxuIik7Cit9CisKKy8qKgorICogRW5kIHRoZSBpbXBvcnQgc3RhdGVtZW50LCBpbmNsdWRlIHVuZHNjb3JlLWFzc2lnbm1lbnRzCisgKgorICogVGhlc2UgIl8gPSIgcHJldmVudCB0aGUgZ28gY29tcGlsZXIgY29tcGxhaW5pbmcgYWJvdXQgdW51c2VkIGltcG9ydHMuCisgKiBUaGlzIHdpbGwgaGF2ZSB0byBkbyBpbiBsaWV1IG9mIG1vcmUgaW50ZWxsaWdlbnQgaW1wb3J0IHN0YXRlbWVudCBjb25zdHJ1Y3Rpb24KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19pbXBvcnRzX2VuZCgpIHsKKyAgcmV0dXJuIHN0cmluZygKKyAgICAgICIpXG5cbiIKKyAgICAgICIvLyAobmVlZGVkIHRvIGVuc3VyZSBzYWZldHkgYmVjYXVzZSBvZiBuYWl2ZSBpbXBvcnQgbGlzdCBjb25zdHJ1Y3Rpb24uKVxuIgorICAgICAgInZhciBfID0gdGhyaWZ0LlpFUk9cbiIKKyAgICAgICJ2YXIgXyA9IGZtdC5QcmludGZcbiIKKyAgICAgICJ2YXIgXyA9IGNvbnRleHQuQmFja2dyb3VuZFxuIgorICAgICAgInZhciBfID0gcmVmbGVjdC5EZWVwRXF1YWxcbiIKKyAgICAgICJ2YXIgXyA9IGJ5dGVzLkVxdWFsXG5cbiIpOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfY29uc3RfdmFsdWVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgZl9jb25zdF92YWx1ZXNfLnN0cigpOworCisgIC8vIENsb3NlIHR5cGVzIGFuZCBjb25zdGFudHMgZmlsZXMKKyAgZl9jb25zdHNfLmNsb3NlKCk7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZvcm1hdF9nb19vdXRwdXQoZl90eXBlc19uYW1lXyk7CisgIGZvcm1hdF9nb19vdXRwdXQoZl9jb25zdHNfbmFtZV8pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHR5cGVkZWYpOworICBzdHJpbmcgbmV3X3R5cGVfbmFtZShwdWJsaWNpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSk7CisgIHN0cmluZyBiYXNlX3R5cGUodHlwZV90b19nb190eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSk7CisKKyAgaWYgKGJhc2VfdHlwZSA9PSBuZXdfdHlwZV9uYW1lKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZl90eXBlc18gPDwgInR5cGUgIiA8PCBuZXdfdHlwZV9uYW1lIDw8ICIgIiA8PCBiYXNlX3R5cGUgPDwgZW5kbCA8PCBlbmRsOworICAvLyBHZW5lcmF0ZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gaW5zdGFuY2Ugb2YgYSB0eXBlCisgIC8vICh3aGljaCBtYXkgYmUgYSBjb25zdGFudCkgaW50byBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgYSB0eXBlLgorICBmX3R5cGVzXyA8PCAiZnVuYyAiIDw8IG5ld190eXBlX25hbWUgPDwgIlB0cih2ICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiKSAqIiA8PCBuZXdfdHlwZV9uYW1lCisgICAgICAgICAgIDw8ICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7CisgIHN0ZDo6c3RyaW5nIHRlbnVtX25hbWUocHVibGljaXplKHRlbnVtLT5nZXRfbmFtZSgpKSk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOworICBmX3R5cGVzXyA8PCAidHlwZSAiIDw8IHRlbnVtX25hbWUgPDwgIiBpbnQ2NCIgPDwgZW5kbCA8PCAiY29uc3QgKCIgPDwgZW5kbDsKKworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHN3aXRjaCBwIHsiIDw8IGVuZGw7CisKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAiIDw8IHRlbnVtX25hbWUgPDwgIkZyb21TdHJpbmcocyBzdHJpbmcpICgiIDw8IHRlbnVtX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvcikgeyIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggcyB7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgaW50IHZhbHVlID0gLTE7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBzdHJpbmcgaXRlcl9zdGRfbmFtZShlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgIHN0cmluZyBpdGVyX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAnICcgPDwgdGVudW1fbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgIDw8IHZhbHVlIDw8IGVuZGw7CisgICAgLy8gRGljdGlvbmFyaWVzIHRvL2Zyb20gc3RyaW5nIG5hbWVzIG9mIGVudW1zCisgICAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgY2FzZSAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAiOiByZXR1cm4gXCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIiIDw8IGVuZGw7CisKKyAgICBpZiAoaXRlcl9zdGRfbmFtZSAhPSBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkpIHsKKyAgICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgY2FzZSBcIiIgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkgPDwgIlwiOiByZXR1cm4gIiA8PCB0ZW51bV9uYW1lIDw8ICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpdGVyX25hbWUgPDwgIiwgbmlsICIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIjogcmV0dXJuICIgPDwgdGVudW1fbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICIsIG5pbCAiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFwiPFVOU0VUPlwiIiA8PCBlbmRsOworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IHRlbnVtX25hbWUgPDwgIigwKSwiCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmbXQuRXJyb3JmKFwibm90IGEgdmFsaWQgIiA8PCB0ZW51bV9uYW1lIDw8ICIgc3RyaW5nXCIpIiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGZfdHlwZXNfIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGwgPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpCisgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gaW5zdGFuY2Ugb2YgYW4gZW51bQorICAvLyAod2hpY2ggbWF5IGJlIGEgY29uc3RhbnQpIGludG8gYSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIHRoYXQgZW51bQorICAvLyB0eXBlLgorICBmX3R5cGVzXyA8PCAiZnVuYyAiIDw8IHRlbnVtX25hbWUgPDwgIlB0cih2ICIgPDwgdGVudW1fbmFtZSA8PCAiKSAqIiA8PCB0ZW51bV9uYW1lCisgICAgICAgICAgIDw8ICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIE1hcnNoYWxUZXh0CisgIGZfdHlwZXNfIDw8ICJmdW5jIChwICIgPDwgdGVudW1fbmFtZSA8PCAiKSBNYXJzaGFsVGV4dCgpIChbXWJ5dGUsIGVycm9yKSB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIFtdYnl0ZShwLlN0cmluZygpKSwgbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIFVubWFyc2hhbFRleHQKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgKiIgPDwgdGVudW1fbmFtZSA8PCAiKSBVbm1hcnNoYWxUZXh0KHRleHQgW11ieXRlKSBlcnJvciB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicSwgZXJyIDo9ICIgPDwgdGVudW1fbmFtZSA8PCAiRnJvbVN0cmluZyhzdHJpbmcodGV4dCkpIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiaWYgKGVyciAhPSBuaWwpIHsiIDw8IGVuZGwgPDwgInJldHVybiBlcnIiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICIqcCA9IHEiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIFNjYW4gZm9yIHNxbC5TY2FubmVyIGludGVyZmFjZQorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAqIiA8PCB0ZW51bV9uYW1lIDw8ICIpIFNjYW4odmFsdWUgaW50ZXJmYWNle30pIGVycm9yIHsiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgInYsIG9rIDo9IHZhbHVlLihpbnQ2NCkiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgImlmICFvayB7IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gZXJyb3JzLk5ldyhcIlNjYW4gdmFsdWUgaXMgbm90IGludDY0XCIpIiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICIqcCA9ICIgPDwgdGVudW1fbmFtZSA8PCAiKHYpIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBWYWx1ZSBmb3IgZHJpdmVyLlZhbHVlciBpbnRlcmZhY2UKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgKiAiIDw8IHRlbnVtX25hbWUgPDwgIikgVmFsdWUoKSAoZHJpdmVyLlZhbHVlLCBlcnJvcikgeyIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiICAgIHJldHVybiBuaWwsIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBpbnQ2NCgqcCksIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7CisKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gcHVibGljaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChmX2NvbnN0c18pIDw8ICJjb25zdCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfY29uc3RfdmFsdWVzXyA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSwgbmFtZSkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9jb25zdHNfIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBuYW1lIDw8ICIgIiA8PCB0eXBlX3RvX2dvX3R5cGUodHlwZSkgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgaWYgKG9wdCkgeworICAgICAgb3V0IDw8ICImKCZzdHJ1Y3R7eCAiOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8ICJib29sfXsiOworICAgICAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBvdXQgPDwgImludDh9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBvdXQgPDwgImludDE2fXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgb3V0IDw8ICJpbnQzMn17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIG91dCA8PCAiaW50NjR9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIG91dCA8PCAiZmxvYXQ2NH17IjsKKyAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgb3V0IDw8ICJzdHJpbmd9eyI7CisgICAgICAgICAgb3V0IDw8ICciJyArIGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgKyAnIic7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAifSkueCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICBvdXQgPDwgIltdYnl0ZShcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiXCIpIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGlmIChvcHQpIHsKKyAgICAgICAgICAgIG91dCA8PCAiJigmc3RydWN0e3ggaW50fXsiOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgaWYgKG9wdCkgeworICAgICAgICAgICAgb3V0IDw8ICJ9KS54IjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAiJiIgPDwgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSkgPDwgInsiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBib29sIGlzX29wdGlvbmFsID0gZmFsc2U7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgICAgaXNfb3B0aW9uYWwgPSBpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQsIG5hbWUsIGlzX29wdGlvbmFsKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCAifSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBvdXQgPDwgIm1hcFsiIDw8IHR5cGVfdG9fZ29fdHlwZShrdHlwZSkgPDwgIl0iIDw8IHR5cGVfdG9fZ29fdHlwZSh2dHlwZSkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0LCBuYW1lKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBvdXQgPDwgIltdIiA8PCB0eXBlX3RvX2dvX3R5cGUoZXR5cGUpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiLCAiOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIG91dCA8PCAiW10iIDw8IHR5cGVfdG9fZ29fa2V5X3R5cGUoZXR5cGUpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiLCAiOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZ28gc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9nb19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2dvX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGdvIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogT1VUX3B1Yl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqKiBPVVRfZGVmX3ZhbHVlKSBjb25zdCB7CisgIGNvbnN0IHN0cmluZyBiYXNlX2ZpZWxkX25hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGNvbnN0IHN0cmluZyBlc2NhcGVkX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGJhc2VfZmllbGRfbmFtZSk7CisgICpPVVRfcHViX25hbWUgPSBwdWJsaWNpemUoZXNjYXBlZF9maWVsZF9uYW1lKTsKKyAgKk9VVF9kZWZfdmFsdWUgPSB0ZmllbGQtPmdldF92YWx1ZSgpOworfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQpIHsKKyAgb3V0IDw8IHB1YmxpY2l6ZSh0eXBlX25hbWUodHN0cnVjdCksIGlzX2FyZ3Nfb3JfcmVzdWx0KSA8PCAieyI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgKyttX2l0ZXIpIHsKKyAgICBib29sIHBvaW50ZXJfZmllbGQgPSBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpOworICAgIHN0cmluZyBwdWJsaWNpemVkX25hbWU7CisgICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOworICAgIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSgqbV9pdGVyLCAmcHVibGljaXplZF9uYW1lLCAmZGVmX3ZhbHVlKTsKKyAgICBpZiAoIXBvaW50ZXJfZmllbGQgJiYgZGVmX3ZhbHVlICE9IE5VTEwgJiYgIW9taXRfaW5pdGlhbGl6YXRpb24oKm1faXRlcikpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUoKm1faXRlciwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBwb2ludGVyX2ZpZWxkKSA8PCAiLCIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3MpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCksIGlzX2FyZ3MgfHwgaXNfcmVzdWx0KSk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCB0c3RydWN0X25hbWUgPDwgIiBzdHJ1Y3QgeyIgPDwgZW5kbDsKKyAgLyoKKyAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgorICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKKyAgICAgaXRlbV9zcGVjIC0+IG5pbCB8ICh0YWcsIHR5cGVfZW51bSwgbmFtZSwgc3BlY19hcmdzLCBkZWZhdWx0KQorICAgICB0YWcgLT4gaW50ZWdlcgorICAgICB0eXBlX2VudW0gLT4gVFR5cGUuSTMyIHwgVFR5cGUuU1RSSU5HIHwgVFR5cGUuU1RSVUNUIHwgLi4uCisgICAgIG5hbWUgLT4gc3RyaW5nX2xpdGVyYWwKKyAgICAgZGVmYXVsdCAtPiBuaWwgICMgSGFuZGxlZCBieSBfX2luaXRfXworICAgICBzcGVjX2FyZ3MgLT4gbmlsICAjIEZvciBzaW1wbGUgdHlwZXMKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCisgICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAorICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KKyAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCisgICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCisKKyAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KKyAgKi8KKyAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIG5pbAorICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCisgIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cworICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgorICBpbmRlbnRfdXAoKTsKKworICBpbnQgbnVtX3NldGFibGUgPSAwOworICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgeworICAgIGludCBzb3J0ZWRfa2V5c19wb3MgPSAwOworCisgICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAvLyBTZXQgZmllbGQgdG8gb3B0aW9uYWwgaWYgZmllbGQgaXMgdW5pb24sIHRoaXMgaXMgc28gd2UgY2FuIGdldCBhCisgICAgICAvLyBwb2ludGVyIHRvIHRoZSBmaWVsZC4KKyAgICAgIGlmICh0c3RydWN0LT5pc191bmlvbigpKQorICAgICAgICAoKm1faXRlciktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICBpZiAoc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpKSB7CisgICAgICAgIGludCBmaXJzdF91bnVzZWQgPSAoc3RkOjptYXgpKDEsIHNvcnRlZF9rZXlzX3BvcysrKTsKKyAgICAgICAgd2hpbGUgKHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKSkgeworICAgICAgICAgICsrc29ydGVkX2tleXNfcG9zOworICAgICAgICB9CisgICAgICAgIGludCBsYXN0X3VudXNlZCA9IHNvcnRlZF9rZXlzX3BvcyAtIDE7CisgICAgICAgIGlmIChmaXJzdF91bnVzZWQgPCBsYXN0X3VudXNlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyB1bnVzZWQgZmllbGRzICMgIiA8PCBmaXJzdF91bnVzZWQgPDwgIiB0byAiIDw8IGxhc3RfdW51c2VkIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RfdW51c2VkID09IGxhc3RfdW51c2VkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIHVudXNlZCBmaWVsZCAjICIgPDwgZmlyc3RfdW51c2VkIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdF90eXBlKiBmaWVsZFR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICBzdHJpbmcgZ29UeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSk7CisgICAgICBzdHJpbmcgZ290YWcgPSAiZGI6XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICArICJcIiAiOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgZ290YWcgKz0gImpzb246XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICsgIixvbWl0ZW1wdHlcIiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3RhZyArPSAianNvbjpcIiIgKyBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiXCIiOworICAgICAgfQorCisgICAgICAvLyBDaGVjayBmb3IgdXNlciBvdmVycmlkZSBvZiBkYiBhbmQganNvbiB0YWdzIHVzaW5nICJnby50YWciCisgICAgICBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gKCptX2l0ZXIpLT5hbm5vdGF0aW9uc18uZmluZCgiZ28udGFnIik7CisgICAgICBpZiAoaXQgIT0gKCptX2l0ZXIpLT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICAgICAgZ290YWcgPSBpdC0+c2Vjb25kOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgcHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8IGdvVHlwZSA8PCAiIGB0aHJpZnQ6XCIiCisgICAgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiwiIDw8IHNvcnRlZF9rZXlzX3BvczsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIG91dCA8PCAiLHJlcXVpcmVkIjsKKyAgICAgIH0KKworICAgICAgb3V0IDw8ICJcIiAiIDw8IGdvdGFnIDw8ICJgIiA8PCBlbmRsOworICAgICAgc29ydGVkX2tleXNfcG9zKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIC8vIFRoaXMgZmlsbHMgaW4gZGVmYXVsdCB2YWx1ZXMsIGFzIG9wcG9zZWQgdG8gbnVsbHMKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiICIKKyAgICAgICAgICA8PCB0eXBlX3RvX2dvX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCB0c3RydWN0X25hbWUgPDwgIigpICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gJiI7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCB8fCBpc19hcmdzKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIC8vIERlZmF1bHQgdmFsdWVzIGZvciBvcHRpb25hbCBmaWVsZHMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHN0cmluZyBwdWJsaWNpemVkX25hbWU7CisgICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOworICAgIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSgqbV9pdGVyLCAmcHVibGljaXplZF9uYW1lLCAmZGVmX3ZhbHVlKTsKKyAgICB0X3R5cGUqIGZpZWxkVHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBzdHJpbmcgZ29UeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgZmFsc2UpOworICAgIHN0cmluZyBkZWZfdmFyX25hbWUgPSB0c3RydWN0X25hbWUgKyAiXyIgKyBwdWJsaWNpemVkX25hbWUgKyAiX0RFRkFVTFQiOworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcikpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgZGVmX3Zhcl9uYW1lIDw8ICIgIiA8PCBnb1R5cGU7CisgICAgICBpZiAoZGVmX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZFR5cGUsIGRlZl92YWx1ZSwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIG51bV9zZXRhYmxlIGlzIHVzZWQgZm9yIGRlY2lkaW5nIGlmIENvdW50KiBtZXRob2RzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB1bmlvbiBmaWVsZHMuCisgICAgLy8gVGhpcyBhcHBsaWVzIHRvIGFsbCBudWxsYWJsZSBmaWVsZHMgaW5jbHVkaW5nIHNsaWNlcyAodXNlZCBmb3Igc2V0LCBsaXN0IGFuZCBiaW5hcnkpIGFuZCBtYXBzLCBub3QganVzdCBwb2ludGVycy4KKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZFR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKXx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgbnVtX3NldGFibGUgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSkgeworICAgICAgc3RyaW5nIGdvT3B0VHlwZSA9IHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdChmaWVsZFR5cGUsIHRydWUpOworICAgICAgc3RyaW5nIG1heWJlcG9pbnRlciA9IGdvT3B0VHlwZSAhPSBnb1R5cGUgPyAiKiIgOiAiIjsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgR2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpICIKKyAgICAgICAgICA8PCBnb1R5cGUgPDwgIiB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmICFwLklzU2V0IiA8PCBwdWJsaWNpemVkX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gIiA8PCBkZWZfdmFyX25hbWUgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBtYXliZXBvaW50ZXIgPDwgInAuIiA8PCBwdWJsaWNpemVkX25hbWUgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEdldCIgPDwgcHVibGljaXplZF9uYW1lIDw8ICIoKSAiCisgICAgICAgICAgPDwgZ29UeXBlIDw8ICIgeyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC4iIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmICh0c3RydWN0LT5pc191bmlvbigpICYmIG51bV9zZXRhYmxlID4gMCkgeworICAgIGdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKKyAgfQorCisgIGdlbmVyYXRlX2lzc2V0X2hlbHBlcnMob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCwgbnVtX3NldGFibGUgPiAwKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFN0cmluZygpIHN0cmluZyB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgcCA9PSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFwiPG5pbD5cIiIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LlNwcmludGYoXCIiIDw8IGVzY2FwZV9zdHJpbmcodHN0cnVjdF9uYW1lKSA8PCAiKCUrdilcIiwgKnApIgorICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgRXJyb3IoKSBzdHJpbmcgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAuU3RyaW5nKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIElzU2V0IGhlbHBlciBtZXRob2RzIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICAodm9pZClpc19yZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgSXNTZXQiIDw8IGZpZWxkX25hbWUgPDwgIigpIGJvb2wgeyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgICBib29sIGlzX2J5dGVzbGljZSA9IHR0eXBlLT5pc19iaW5hcnkoKTsKKyAgICAgIGJvb2wgY29tcGFyZV90b19uaWxfb25seSA9IHR0eXBlLT5pc19zZXQoKSB8fCB0dHlwZS0+aXNfbGlzdCgpIHx8IHR0eXBlLT5pc19tYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGlzX2J5dGVzbGljZSAmJiAhKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSB8fCBjb21wYXJlX3RvX25pbF9vbmx5KSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbmlsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyaW5nIGRlZl92YXJfbmFtZSA9IHRzdHJ1Y3RfbmFtZSArICJfIiArIGZpZWxkX25hbWUgKyAiX0RFRkFVTFQiOworICAgICAgICBpZiAoaXNfYnl0ZXNsaWNlKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIWJ5dGVzLkVxdWFsKHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIsICIgPDwgZGVmX3Zhcl9uYW1lIDw8ICIpIgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gIiA8PCBkZWZfdmFyX25hbWUgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgQ291bnRTZXRGaWVsZHMgaGVscGVyIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICAodm9pZClpc19yZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgQ291bnRTZXRGaWVsZHMiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgaW50IHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJjb3VudCA6PSAwIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgY29udGludWU7CisKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKworICAgIGlmICghKGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX2JpbmFyeSgpKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocC5Jc1NldCIgPDwgZmllbGRfbmFtZSA8PCAiKCkpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb3VudCsrIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY291bnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgKHZvaWQpaXNfcmVzdWx0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBlc2NhcGVkX3RzdHJ1Y3RfbmFtZShlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIF8sIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCByZWFkIGVycm9yOiBcIiwgcCksIGVycikiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgZG9lcyBub3QgaGF2ZSBJc1NldCBmdW5jdGlvbnMsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbS4KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgICAgaW5kZW50KG91dCkgPDwgInZhciBpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAiIGJvb2wgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAiZm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgorICAgICAgICAgICAgICAgICAgICAgIlwiJVQgZmllbGQgJWQgcmVhZCBlcnJvcjogXCIsIHAsIGZpZWxkSWQpLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZFR5cGVJZCA9PSB0aHJpZnQuU1RPUCB7IGJyZWFrOyB9IiA8PCBlbmRsOworCisgIHN0cmluZyB0aHJpZnRGaWVsZFR5cGVJZDsKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGludDMyX3QgZmllbGRfaWQgPSAtMTsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZywgZmFsc2UgaWYgbm8gZmllbGRzIHByZXNlbnQKKyAgYm9vbCBoYXZlX3N3aXRjaCA9ICFmaWVsZHMuZW1wdHkoKTsKKyAgaWYgKGhhdmVfc3dpdGNoKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBmaWVsZElkIHsiIDw8IGVuZGw7CisgIH0KKworICAvLyBBbGwgdGhlIGZpZWxkcyB3ZSBrbm93CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKworICAgIC8vIGlmIG5lZ2F0aXZlIGlkLCBlbnN1cmUgd2UgZ2VuZXJhdGUgYSB2YWxpZCBtZXRob2QgbmFtZQorICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJSZWFkRmllbGQiKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IGZpZWxkX2lkIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHRocmlmdEZpZWxkVHlwZUlkID0gdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAodGhyaWZ0RmllbGRUeXBlSWQgPT0gInRocmlmdC5CSU5BUlkiKSB7CisgICAgICB0aHJpZnRGaWVsZFR5cGVJZCA9ICJ0aHJpZnQuU1RSSU5HIjsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09ICIgPDwgdGhyaWZ0RmllbGRUeXBlSWQgPDwgIiB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgOj0gcC4iIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeCA8PCAiKGlwcm90KTsgZXJyICE9IG5pbCB7IgorICAgICAgICA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisKKyAgICAvLyBNYXJrIHJlcXVpcmVkIGZpZWxkIGFzIHJlYWQKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlzc2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB0cnVlIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciA6PSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gQmVnaW4gc3dpdGNoIGRlZmF1bHQgY2FzZQorICBpZiAoaGF2ZV9zd2l0Y2gpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gU2tpcCB1bmtub3duIGZpZWxkcyBpbiBlaXRoZXIgY2FzZQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIEVuZCBzd2l0Y2ggZGVmYXVsdCBjYXNlCisgIGlmIChoYXZlX3N3aXRjaCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCisgICAgICAgICAgICAgICAgICAgICAiXCIlVCByZWFkIHN0cnVjdCBlbmQgZXJyb3I6IFwiLCBwKSwgZXJyKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJldHVybiBlcnJvciBpZiBhbnkgcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICFpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKHRocmlmdC5JTlZBTElEX0RBVEEsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZm10LkVycm9yZihcIlJlcXVpcmVkIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGlzIG5vdCBzZXRcIikpOyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkX3R5cGVfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSk7CisgICAgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJSZWFkRmllbGQiKTsKKyAgICBpbnQzMl90IGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgaW50MzJfdCBmaWVsZF9tZXRob2Rfc3VmZml4ID0gZmllbGRfaWQ7CisKKyAgICBpZiAoZmllbGRfbWV0aG9kX3N1ZmZpeCA8IDApIHsKKyAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOworICAgICAgZmllbGRfbWV0aG9kX3N1ZmZpeCAqPSAtMTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICAiIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeAorICAgICAgICA8PCAiKGlwcm90IHRocmlmdC5UUHJvdG9jb2wpIGVycm9yIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCBmYWxzZSwgInAuIik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VzX2NvdW50c2V0ZmllbGRzKSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgc3RyaW5nIG5hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGluZGVudChvdXQpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIGVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSAmJiB1c2VzX2NvdW50c2V0ZmllbGRzKSB7CisgICAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBjIDo9IHAuQ291bnRTZXRGaWVsZHMiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCk7IGMgIT0gMSB7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHJldHVybiBmbXQuRXJyb3JmKFwiJVQgd3JpdGUgdW5pb246IGV4YWN0bHkgb25lIGZpZWxkIG11c3QgYmUgc2V0ICglZCBzZXQpLlwiLCBwLCBjKSIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIKKyAgICAgICAgICAgICAgICAgICAgICJcIiVUIHdyaXRlIHN0cnVjdCBiZWdpbiBlcnJvcjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7CisKKyAgc3RyaW5nIGZpZWxkX25hbWU7CisgIHN0cmluZyBlc2NhcGVfZmllbGRfbmFtZTsKKyAgLy8gdF9jb25zdF92YWx1ZSogZmllbGRfZGVmYXVsdF92YWx1ZTsKKyAgdF9maWVsZDo6ZV9yZXEgZmllbGRfcmVxdWlyZWQ7CisgIGludDMyX3QgZmllbGRfaWQgPSAtMTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHAgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIndyaXRlRmllbGQiKTsKKyAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGVzY2FwZV9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhmaWVsZF9uYW1lKTsKKyAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gcC4iIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeAorICAgICAgICA8PCAiKG9wcm90KTsgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcIndyaXRlIGZpZWxkIHN0b3AgZXJyb3I6IFwiLCBlcnIpIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwid3JpdGUgc3RydWN0IHN0b3AgZXJyb3I6IFwiLCBlcnIpIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgid3JpdGVGaWVsZCIpOworICAgIGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBlc2NhcGVfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoZmllbGRfbmFtZSk7CisgICAgLy8gZmllbGRfZGVmYXVsdF92YWx1ZSA9ICgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZmllbGRfcmVxdWlyZWQgPSAoKmZfaXRlciktPmdldF9yZXEoKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX21ldGhvZF9zdWZmaXgKKyAgICAgICAgPDwgIihvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoZXJyIGVycm9yKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKGZpZWxkX3JlcXVpcmVkID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgcC5Jc1NldCIgPDwgcHVibGljaXplKGZpZWxkX25hbWUpIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKFwiIiA8PCBlc2NhcGVfZmllbGRfbmFtZSA8PCAiXCIsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCBmaWVsZF9pZCA8PCAiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yICIKKyAgICAgICAgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICI6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAicC4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAiCisgICAgICAgIDw8IGZpZWxkX2lkIDw8ICI6IiA8PCBlc2NhcGVfZmllbGRfbmFtZSA8PCAiOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKworICAgIGlmIChmaWVsZF9yZXF1aXJlZCA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHRlc3Rfc3VmZml4KCJfdGVzdCIpOworICBzdHJpbmcgZmlsZW5hbWUgPSBsb3dlcmNhc2Uoc2VydmljZV9uYW1lXyk7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZTsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7CisgIGZfdHlwZXNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZfdHlwZXNfIDw8ICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgc3VjY2Vzcy5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGYgPSAqZl9pdGVyOworICAgICAgZi0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQoZik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworICBzdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHNlcnZpY2VOYW1lOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOworCisgICAgaWYgKGluZGV4ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgZXh0ZW5kc19pZiA9ICJcbiIgKyBpbmRlbnQoKSArICIgICIgKyBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpCisgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiXG4iOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX2lmID0gIlxuIiArIGluZGVudCgpICsgcHVibGljaXplKGV4dGVuZHMpICsgIlxuIjsKKyAgICB9CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGludGVyZmFjZU5hbWUgPDwgIiBpbnRlcmZhY2UgeyIgPDwgZXh0ZW5kc19pZjsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHNlcnZpY2UpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisKKyAgaWYgKCFmdW5jdGlvbnMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgKCpmX2l0ZXIpKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19maWVsZCA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50X25ldyA9ICIiOworICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7CisKKyAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiQ2xpZW50IjsKKyAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyAiTmV3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiQ2xpZW50IjsKKyAgICB9IGVsc2UgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSBwdWJsaWNpemUoZXh0ZW5kcykgKyAiQ2xpZW50IjsKKyAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9ICJOZXciICsgZXh0ZW5kc19jbGllbnQ7CisgICAgfQorICB9CisKKyAgZXh0ZW5kc19maWVsZCA9IGV4dGVuZHNfY2xpZW50LnN1YnN0cihleHRlbmRzX2NsaWVudC5maW5kKCIuIikgKyAxKTsKKworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sIHRzZXJ2aWNlKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHN0cnVjdCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoIWV4dGVuZHNfY2xpZW50LmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiKiIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYyB0aHJpZnQuVENsaWVudCIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gTGVnYWN5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICA8PCAiQ2xpZW50RmFjdG9yeSh0IHRocmlmdC5UVHJhbnNwb3J0LCBmIHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5KSAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZXh0ZW5kc19maWVsZCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiRmFjdG9yeSh0LCBmKX0iOworICB9IGVsc2UgeworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjOiB0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGYuR2V0UHJvdG9jb2wodCksIGYuR2V0UHJvdG9jb2wodCkpLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgLy8gTGVnYWN5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggY3VzdG9tIGlucHV0ICYgb3V0cHV0IHByb3RvY29scworICBmX3R5cGVzXworICAgICAgPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZQorICAgICAgPDwgIkNsaWVudFByb3RvY29sKHQgdGhyaWZ0LlRUcmFuc3BvcnQsIGlwcm90IHRocmlmdC5UUHJvdG9jb2wsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpICoiCisgICAgICA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQiOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgInsiIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIlByb3RvY29sKHQsIGlwcm90LCBvcHJvdCl9IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYzogdGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChpcHJvdCwgb3Byb3QpLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCisgICAgPDwgIkNsaWVudChjIHRocmlmdC5UQ2xpZW50KSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnR7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIihjKSwiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImM6IGMsIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpIENsaWVudF8oKSB0aHJpZnQuVENsaWVudCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC5jIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCAoKmZfaXRlcikpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpICIKKyAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgbWV0aG9kID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGFyZ3NUeXBlID0gcHVibGljaXplKG1ldGhvZCArICJfYXJncyIsIHRydWUpOworICAgIHN0ZDo6c3RyaW5nIGFyZ3NOYW1lID0gdG1wKCJfYXJncyIpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBhcmdzTmFtZSA8PCAiICIgPDwgYXJnc1R5cGUgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCBhcmdzTmFtZSA8PCAiLiIgPDwgcHVibGljaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0TmFtZSA9IHRtcCgiX3Jlc3VsdCIpOworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0VHlwZSA9IHB1YmxpY2l6ZShtZXRob2QgKyAiX3Jlc3VsdCIsIHRydWUpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IHJlc3VsdE5hbWUgPDwgIiAiIDw8IHJlc3VsdFR5cGUgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBwLkNsaWVudF8oKS5DYWxsKGN0eCwgXCIiCisgICAgICAgIDw8IG1ldGhvZCA8PCAiXCIsICYiIDw8IGFyZ3NOYW1lIDw8ICIsICYiIDw8IHJlc3VsdE5hbWUgPDwgIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInN3aXRjaCB7IiA8PCBlbmRsOworCisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHVibmFtZSA9IHB1YmxpY2l6ZSgoKnhfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpZWxkID0gcmVzdWx0TmFtZSArICIuIiArIHB1Ym5hbWU7CisKKyAgICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IGZpZWxkIDw8ICIhPSBuaWw6IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiByLCAiIDw8IGZpZWxkIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIjw8IGZpZWxkIDw8IGVuZGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IHJlc3VsdE5hbWUgPDwgIi5HZXRTdWNjZXNzKCksIG5pbCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBUT0RPOiB3b3VsZCBiZSBuaWNlIHRvIG5vdCB0byBkdXBsaWNhdGUgdGhlIGNhbGwgZ2VuZXJhdGlvbgorICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBwLkNsaWVudF8oKS5DYWxsKGN0eCwgXCIiCisgICAgICA8PCBtZXRob2QgPDwgIlwiLCAmIjw8IGFyZ3NOYW1lIDw8ICIsIG5pbCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gY29sbGVjdCBpbmhlcml0ZWQgZnVuY3Rpb25zCisgIHdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gcF9mdW5jdGlvbnMgPSBwYXJlbnQtPmdldF9mdW5jdGlvbnMoKTsKKyAgICBmdW5jdGlvbnMuaW5zZXJ0KGZ1bmN0aW9ucy5lbmQoKSwgcF9mdW5jdGlvbnMuYmVnaW4oKSwgcF9mdW5jdGlvbnMuZW5kKCkpOworICAgIHBhcmVudCA9IHBhcmVudC0+Z2V0X2V4dGVuZHMoKTsKKyAgfQorCisgIC8vIFRoaXMgZmlsZSBpcyBub3QgdXNlZnVsIGlmIHRoZXJlIGFyZSBubyBmdW5jdGlvbnM7IGRvbid0IGdlbmVyYXRlIGl0CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9yZW1vdGVfZGlyID0gcGFja2FnZV9kaXJfICsgIi8iICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlIjsKKyAgTUtESVIoZl9yZW1vdGVfZGlyLmNfc3RyKCkpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIGZfcmVtb3RlX25hbWUgPSBmX3JlbW90ZV9kaXIgKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLXJlbW90ZS5nbyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9yZW1vdGU7CisgIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIHNlcnZpY2VfbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgIHdoaWxlICgobG9jID0gc2VydmljZV9tb2R1bGUuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzZXJ2aWNlX21vZHVsZS5yZXBsYWNlKGxvYywgMSwgMSwgJy8nKTsKKyAgfQorICBpZiAoIWdlbl9wYWNrYWdlX3ByZWZpeF8uZW1wdHkoKSkgeworICAgIHNlcnZpY2VfbW9kdWxlID0gZ2VuX3BhY2thZ2VfcHJlZml4XyArIHNlcnZpY2VfbW9kdWxlOworICB9CisKKyAgc3RyaW5nIHVudXNlZF9wcm90ZWN0aW9uOworCisgIHN0cmluZyBjdHhQYWNrYWdlID0gImNvbnRleHQiOworCisgIGZfcmVtb3RlIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAicGFja2FnZSBtYWluIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpbXBvcnQgKCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCIiIDw8IGN0eFBhY2thZ2UgPDwgIlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcImZsYWdcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJmbXRcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJtYXRoXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwibmV0XCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwibmV0L3VybFwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm9zXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwic3RyY29udlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcInN0cmluZ3NcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCIiICsgZ2VuX3RocmlmdF9pbXBvcnRfICsgIlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCByZW5kZXJfaW5jbHVkZWRfcHJvZ3JhbXModW51c2VkX3Byb3RlY3Rpb24pOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgPDwgc2VydmljZV9tb2R1bGUgPDwgIlwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgdW51c2VkX3Byb3RlY3Rpb247IC8vIGZpbGxlZCBpbiByZW5kZXJfaW5jbHVkZWRfcHJvZ3JhbXMoKQorICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyBVc2FnZSgpIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiVXNhZ2Ugb2YgXCIsIG9zLkFyZ3NbMF0sIFwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlstaCBob3N0OnBvcnRdIFstdSB1cmxdIFstZltyYW1lZF1dIGZ1bmN0aW9uIFthcmcxIFthcmcyLi4uXV06XCIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbGFnLlByaW50RGVmYXVsdHMoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJcXG5GdW5jdGlvbnM6XCIpIiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9yZW1vdGUgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCIgICIgPDwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0KKworICAgICAgZl9yZW1vdGUgPDwgYXJnc1tpXS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgYXJnc1tpXS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3JlbW90ZSA8PCAiKVwiKSIgPDwgZW5kbDsKKyAgfQorCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDApIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidHlwZSBodHRwSGVhZGVycyBtYXBbc3RyaW5nXXN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZ1bmMgKGggaHR0cEhlYWRlcnMpIFN0cmluZygpIHN0cmluZyB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB2YXIgbSBtYXBbc3RyaW5nXXN0cmluZyA9IGgiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiVzXCIsIG0pIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZ1bmMgKGggaHR0cEhlYWRlcnMpIFNldCh2YWx1ZSBzdHJpbmcpIGVycm9yIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBhcnRzIDo9IHN0cmluZ3MuU3BsaXQodmFsdWUsIFwiOiBcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGxlbihwYXJ0cykgIT0gMiB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBmbXQuRXJyb3JmKFwiaGVhZGVyIHNob3VsZCBiZSBvZiBmb3JtYXQgJ0tleTogVmFsdWUnXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBoW3BhcnRzWzBdXSA9IHBhcnRzWzFdIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gbmlsIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyBtYWluKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgaG9zdCBzdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcG9ydCBpbnQiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2wgc3RyaW5nIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHVybFN0cmluZyBzdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgZnJhbWVkIGJvb2wiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdXNlSHR0cCBib29sIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaGVhZGVycyA6PSBtYWtlKGh0dHBIZWFkZXJzKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwYXJzZWRVcmwgKnVybC5VUkwiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfID0gc3RyY29udi5BdG9pIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXyA9IG1hdGguQWJzIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Vc2FnZSA9IFVzYWdlIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJmhvc3QsIFwiaFwiLCBcImxvY2FsaG9zdFwiLCBcIlNwZWNpZnkgaG9zdCBhbmQgcG9ydFwiKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuSW50VmFyKCZwb3J0LCBcInBcIiwgOTA5MCwgXCJTcGVjaWZ5IHBvcnRcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlN0cmluZ1ZhcigmcHJvdG9jb2wsIFwiUFwiLCBcImJpbmFyeVwiLCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpZnkgdGhlIHByb3RvY29sIChiaW5hcnksIGNvbXBhY3QsIHNpbXBsZWpzb24sIGpzb24pXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJnVybFN0cmluZywgXCJ1XCIsIFwiXCIsIFwiU3BlY2lmeSB0aGUgdXJsXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Cb29sVmFyKCZmcmFtZWQsIFwiZnJhbWVkXCIsIGZhbHNlLCBcIlVzZSBmcmFtZWQgdHJhbnNwb3J0XCIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Cb29sVmFyKCZ1c2VIdHRwLCBcImh0dHBcIiwgZmFsc2UsIFwiVXNlIGh0dHBcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlZhcihoZWFkZXJzLCBcIkhcIiwgXCJIZWFkZXJzIHRvIHNldCBvbiB0aGUgaHR0cChzKSByZXF1ZXN0IChlLmcuIC1IIFxcXCJLZXk6IFZhbHVlXFxcIilcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlBhcnNlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBsZW4odXJsU3RyaW5nKSA+IDAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdmFyIGVyciBlcnJvciIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcGFyc2VkVXJsLCBlcnIgPSB1cmwuUGFyc2UodXJsU3RyaW5nKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaG9zdCA9IHBhcnNlZFVybC5Ib3N0IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB1c2VIdHRwID0gbGVuKHBhcnNlZFVybC5TY2hlbWUpIDw9IDAgfHwgcGFyc2VkVXJsLlNjaGVtZSA9PSBcImh0dHBcIiB8fCBwYXJzZWRVcmwuU2NoZW1lID09IFwiaHR0cHNcIiIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiB1c2VIdHRwIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIF8sIGVyciA6PSB1cmwuUGFyc2UoZm10LlNwcmludChcImh0dHA6Ly9cIiwgaG9zdCwgXCI6XCIsIHBvcnQpKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjbWQgOj0gZmxhZy5BcmcoMCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgZXJyIGVycm9yIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgdXNlSHR0cCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RIdHRwQ2xpZW50KHBhcnNlZFVybC5TdHJpbmcoKSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGxlbihoZWFkZXJzKSA+IDAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBodHRwdHJhbnMgOj0gdHJhbnMuKCp0aHJpZnQuVEh0dHBDbGllbnQpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZvciBrZXksIHZhbHVlIDo9IHJhbmdlIGhlYWRlcnMgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgIGh0dHB0cmFucy5TZXRIZWFkZXIoa2V5LCB2YWx1ZSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwb3J0U3RyIDo9IGZtdC5TcHJpbnQocG9ydCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIHN0cmluZ3MuQ29udGFpbnMoaG9zdCwgXCI6XCIpIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICBob3N0LCBwb3J0U3RyLCBlcnIgPSBuZXQuU3BsaXRIb3N0UG9ydChob3N0KSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJlcnJvciB3aXRoIGhvc3Q6XCIsIGVycikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQobmV0LkpvaW5Ib3N0UG9ydChob3N0LCBwb3J0U3RyKSkiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcImVycm9yIHJlc29sdmluZyBhZGRyZXNzOlwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGZyYW1lZCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIHRyYW5zID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBjcmVhdGluZyB0cmFuc3BvcnRcIiwgZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciB0cmFucy5DbG9zZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInN3aXRjaCBwcm90b2NvbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcImNvbXBhY3RcIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJzaW1wbGVqc29uXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwianNvblwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcImJpbmFyeVwiLCBcIlwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQ6IFwiLCBwcm90b2NvbCkiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaXByb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIm9wcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjbGllbnQgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuTmV3IiA8PCBwdWJsaWNpemUoc2VydmljZV9uYW1lXykKKyAgICAgICAgICAgPDwgIkNsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHRyYW5zLk9wZW4oKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIG9wZW5pbmcgc29ja2V0IHRvIFwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0LCBcIjpcIiwgcG9ydCwgXCIgXCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIGNtZCB7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworICAgIHN0cmluZyBmdW5jTmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBwdWJOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSkpOworICAgIHN0cmluZyBhcmd1bWVudHNOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSArICJfYXJncyIsIHRydWUpKTsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcIiIgPDwgZXNjYXBlX3N0cmluZyhmdW5jTmFtZSkgPDwgIlwiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZmxhZy5OQXJnKCkgLSAxICE9ICIgPDwgbnVtX2FyZ3MgPDwgIiB7IiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHB1Yk5hbWUpIDw8ICIgcmVxdWlyZXMgIgorICAgICAgICAgICAgIDw8IG51bV9hcmdzIDw8ICIgYXJnc1wiKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbGFnLlVzYWdlKCkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgZmxhZ0FyZyA9IGkgKyAxOworICAgICAgdF90eXBlKiB0aGVfdHlwZShhcmdzW2ldLT5nZXRfdHlwZSgpKTsKKyAgICAgIHRfdHlwZSogdGhlX3R5cGUyKGdldF90cnVlX3R5cGUodGhlX3R5cGUpKTsKKworICAgICAgaWYgKHRoZV90eXBlMi0+aXNfZW51bSgpKSB7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgZXJyIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuIgorICAgICAgICAgICAgICAgICA8PCBwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpIDw8ICIodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgZSA9ICgodF9iYXNlX3R5cGUqKXRoZV90eXBlMiktPmdldF9iYXNlKCk7CisgICAgICAgIHN0cmluZyBlcnIodG1wKCJlcnIiKSk7CisKKyAgICAgICAgc3dpdGNoIChlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAodGhlX3R5cGUyLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gW11ieXRlKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikgPT0gXCJ0cnVlXCIiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIKKyAgICAgICAgICAgICAgICAgICA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gaW50OCh0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgorICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQxNih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgorICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBpbnQzMih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIsICIgPDwgZXJyCisgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAoc3RyY29udi5QYXJzZUludChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIiksIDEwLCA2NCkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiLCAiIDw8IGVycgorICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gKHN0cmNvbnYuUGFyc2VGbG9hdChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIiksIDY0KSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdygiSW52YWxpZCBiYXNlIHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZfcmVtb3RlIDw8IHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSA8PCAiKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwKKyAgICAgICAgLy8gIikpKSI7CisgICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgc3RyaW5nIGFyZyh0bXAoImFyZyIpKTsKKyAgICAgICAgc3RyaW5nIG1iVHJhbnModG1wKCJtYlRyYW5zIikpOworICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKKyAgICAgICAgc3RyaW5nIGZhY3RvcnkodG1wKCJmYWN0b3J5IikpOworICAgICAgICBzdHJpbmcganNQcm90KHRtcCgianNQcm90IikpOworICAgICAgICBzdHJpbmcgZXJyMih0bXAoImVyciIpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkpOworICAgICAgICBzdGQ6OnN0cmluZyB0c3RydWN0X21vZHVsZSggbW9kdWxlX25hbWUodGhlX3R5cGUpKTsKKyAgICAgICAgaWYodHN0cnVjdF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgICAgIHRzdHJ1Y3RfbW9kdWxlID0gcGFja2FnZV9uYW1lXzsKKyAgICAgICAgfQorCisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGFyZyA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgbWJUcmFucyA8PCAiIDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyTGVuKGxlbigiIDw8IGFyZyA8PCAiKSkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciAiIDw8IG1iVHJhbnMgPDwgIi5DbG9zZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXywgIiA8PCBlcnIxIDw8ICIgOj0gIiA8PCBtYlRyYW5zIDw8ICIuV3JpdGVTdHJpbmcoIiA8PCBhcmcgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjEgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZmFjdG9yeSA8PCAiIDo9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBqc1Byb3QgPDwgIiA6PSAiIDw8IGZhY3RvcnkgPDwgIi5HZXRQcm90b2NvbCgiIDw8IG1iVHJhbnMgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgdHN0cnVjdF9tb2R1bGUgPDwgIi5OZXciIDw8IHRzdHJ1Y3RfbmFtZQorICAgICAgICAgICAgICAgICA8PCAiKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCAiLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoIiA8PCBqc1Byb3QgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAodGhlX3R5cGUyLT5pc19jb250YWluZXIoKSB8fCB0aGVfdHlwZTItPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgc3RyaW5nIGFyZyh0bXAoImFyZyIpKTsKKyAgICAgICAgc3RyaW5nIG1iVHJhbnModG1wKCJtYlRyYW5zIikpOworICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKKyAgICAgICAgc3RyaW5nIGZhY3RvcnkodG1wKCJmYWN0b3J5IikpOworICAgICAgICBzdHJpbmcganNQcm90KHRtcCgianNQcm90IikpOworICAgICAgICBzdHJpbmcgZXJyMih0bXAoImVyciIpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXJnTmFtZShwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkpOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBhcmcgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IG1iVHJhbnMgPDwgIiA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlckxlbihsZW4oIiA8PCBhcmcgPDwgIikpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmZXIgIiA8PCBtYlRyYW5zIDw8ICIuQ2xvc2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8sICIgPDwgZXJyMSA8PCAiIDo9ICIgPDwgbWJUcmFucyA8PCAiLldyaXRlU3RyaW5nKCIgPDwgYXJnIDw8ICIpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIxIDw8ICIgIT0gbmlsIHsgIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLk5ldyIKKyAgICAgICAgICAgICAgICAgPDwgYXJndW1lbnRzTmFtZSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi5SZWFkRmllbGQiIDw8IChpICsgMSkgPDwgIigiCisgICAgICAgICAgICAgICAgIDw8IGpzUHJvdCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi4iIDw8IGFyZ05hbWUKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93KCJJbnZhbGlkIGFyZ3VtZW50IHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKKyAgICAgIH0KKworICAgICAgaWYgKHRoZV90eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZWRlZl9tb2R1bGUoIG1vZHVsZV9uYW1lKHRoZV90eXBlKSk7CisgICAgICAgIGlmKHR5cGVkZWZfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgICAgICB0eXBlZGVmX21vZHVsZSA9IHBhY2thZ2VfbmFtZV87CisgICAgICAgIH0KKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCB0eXBlZGVmX21vZHVsZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgPDwgcHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSA8PCAiKGFyZ3ZhbHVlIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhbHVlIiA8PCBpIDw8ICIgOj0gYXJndmFsdWUiIDw8IGkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZm10LlByaW50KGNsaWVudC4iIDw8IHB1Yk5hbWUgPDwgIigiOworICAgIGJvb2wgYXJnRmlyc3QgPSB0cnVlOworCisgICAgZl9yZW1vdGUgPDwgImNvbnRleHQuQmFja2dyb3VuZCgpIjsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGFyZ0ZpcnN0KSB7CisgICAgICAgIGFyZ0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOworICAgICAgfQorCisgICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKKyAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopKGFyZ3NbaV0tPmdldF90eXBlKCkpKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgICBzd2l0Y2ggKGUpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93KCJJbnZhbGlkIGJhc2UgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZl9yZW1vdGUgPDwgcHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpIDw8ICIoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PAorICAgICAgICAvLyAiKSkpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZtdC5QcmludChcIlxcblwiKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYnJlYWsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiXCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkludmFsaWQgZnVuY3Rpb24gXCIsIGNtZCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfcmVtb3RlLmNsb3NlKCk7CisgIGZvcm1hdF9nb19vdXRwdXQoZl9yZW1vdGVfbmFtZSk7CisjaWZuZGVmIF9NU0NfVkVSCisgIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KKyAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAorICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVhVU1IKKyNpZm5kZWYgX1dJTjMyCisgICAgICAgIHwgU19JUkdSUCB8IFNfSVhHUlAgfCBTX0lST1RIIHwgU19JWE9USAorI2VuZGlmCisgICAgICAgICk7CisjZW5kaWYKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIiI7CisgIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKKworICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm9jZXNzb3IiOworICAgICAgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJOZXciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJQcm9jZXNzb3IiOworICAgIH0gZWxzZSB7CisgICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJQcm9jZXNzb3IiOworICAgICAgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIk5ldyIgKyBleHRlbmRzX3Byb2Nlc3NvcjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgcFNlcnZpY2VOYW1lKHByaXZhdGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgc3RyaW5nIHNlbGYodG1wKCJzZWxmIikpOworCisgIGlmIChleHRlbmRzX3Byb2Nlc3Nvci5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHN0cnVjdCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvck1hcCBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgQWRkVG9Qcm9jZXNzb3JNYXAoa2V5IHN0cmluZywgcHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHAucHJvY2Vzc29yTWFwW2tleV0gPSBwcm9jZXNzb3IiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgR2V0UHJvY2Vzc29yRnVuY3Rpb24oa2V5IHN0cmluZykgIgorICAgICAgICAgICAgICAgICAgIihwcm9jZXNzb3IgdGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbiwgb2sgYm9vbCkgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBwcm9jZXNzb3IsIG9rID0gcC5wcm9jZXNzb3JNYXBba2V5XSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc29yLCBvayIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzb3JNYXAoKSBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24geyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5wcm9jZXNzb3JNYXAiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXworICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIiA6PSAmIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICA8PCAiUHJvY2Vzc29ye2hhbmRsZXI6aGFuZGxlciwgcHJvY2Vzc29yTWFwOm1ha2UobWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uKX0iCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgc3RyaW5nIGVzY2FwZWRGdW5jTmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIucHJvY2Vzc29yTWFwW1wiIiA8PCBlc2NhcGVkRnVuY05hbWUgPDwgIlwiXSA9ICYiCisgICAgICAgICAgICAgICAgIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICA8PCAie2hhbmRsZXI6aGFuZGxlcn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RyaW5nIHgodG1wKCJ4IikpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBzZWxmIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKKyAgICAgICAgICAgICAgICAgICJ0aHJpZnQuVEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBuYW1lLCBfLCBzZXFJZCwgZXJyIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIGZhbHNlLCBlcnIgfSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpZiBwcm9jZXNzb3IsIG9rIDo9IHAuR2V0UHJvY2Vzc29yRnVuY3Rpb24obmFtZSk7IG9rIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gcHJvY2Vzc29yLlByb2Nlc3MoY3R4LCBzZXFJZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LlNraXAodGhyaWZ0LlNUUlVDVCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHgKKyAgICAgICAgICAgICAgIDw8ICIgOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuVU5LTk9XTl9NRVRIT0QsIFwiVW5rbm93biBmdW5jdGlvbiAiCisgICAgICAgICAgICAgICAgICAiXCIgKyBuYW1lKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCB4IDw8ICIuV3JpdGUob3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlLCAiIDw8IHggPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHN0cnVjdCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICoiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgICA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIgOj0gJiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcnsiCisgICAgICAgICAgICAgICA8PCBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPDwgIihoYW5kbGVyKX0iIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgc3RyaW5nIGVzY2FwZWRGdW5jTmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIuQWRkVG9Qcm9jZXNzb3JNYXAoXCIiIDw8IGVzY2FwZWRGdW5jTmFtZQorICAgICAgICAgICAgICAgICA8PCAiXCIsICYiIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICA8PCAie2hhbmRsZXI6aGFuZGxlcn0pIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IHNlbGYgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBmX3R5cGVzXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgc3RyaW5nIHByb2Nlc3Nvck5hbWUgPSBwcml2YXRpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlByb2Nlc3NvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBzdHJpbmcgYXJnc25hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIiwgdHJ1ZSk7CisgIHN0cmluZyByZXN1bHRuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IiwgdHJ1ZSk7CisKKyAgLy8gdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIC8vIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgcHJvY2Vzc29yTmFtZSA8PCAiIHN0cnVjdCB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBoYW5kbGVyICIgPDwgcHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBwcm9jZXNzb3JOYW1lCisgICAgICAgICAgICAgPDwgIikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBzZXFJZCBpbnQzMiwgaXByb3QsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChzdWNjZXNzIGJvb2wsIGVyciAiCisgICAgICAgICAgICAgICAgInRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImFyZ3MgOj0gIiA8PCBhcmdzbmFtZSA8PCAie30iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBhcmdzLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICB4IDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlBST1RPQ09MX0VSUk9SLCBlcnIuRXJyb3IoKSkiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlLCBlcnIiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgOj0gIiA8PCByZXN1bHRuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKKyAgfQorICBib29sIG5lZWRfcmVmZXJlbmNlID0gdHlwZV9uZWVkX3JlZmVyZW5jZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl90eXBlc18gPDwgInZhciByZXR2YWwgIiA8PCB0eXBlX3RvX2dvX3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhciBlcnIyIGVycm9yIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAicmV0dmFsLCAiOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZl90eXBlc18gPDwgImVycjIgPSBwLmhhbmRsZXIuIiA8PCBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZfdHlwZXNfIDw8ICJjdHgiOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgImFyZ3MuIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIGZfdHlwZXNfIDw8ICIpOyBlcnIyICE9IG5pbCB7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhfZmllbGRzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKCF4X2ZpZWxkcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInN3aXRjaCB2IDo9IGVycjIuKHR5cGUpIHsiIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Zl9pdGVyOworCisgICAgZm9yICh4Zl9pdGVyID0geF9maWVsZHMuYmVnaW4oKTsgeGZfaXRlciAhPSB4X2ZpZWxkcy5lbmQoKTsgKyt4Zl9pdGVyKSB7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgdHlwZV90b19nb190eXBlKCgoKnhmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIjoiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHVibGljaXplKCgqeGZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB2IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGRlZmF1bHQ6IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgeCA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIjogXCIgKyBlcnIyLkVycm9yKCkpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZSwgZXJyMiIgPDwgZW5kbDsKKworICBpZiAoIXhfZmllbGRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IjsgLy8gY2xvc2VzIGVycjIgIT0gbmlsCisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgZl90eXBlc18gPDwgIiBlbHNlIHsiIDw8IGVuZGw7IC8vIG1ha2Ugc3VyZSB3ZSBzZXQgU3VjY2VzcyByZXR2YWwgb25seSBvbiBzdWNjZXNzCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgICAgICBpZiAobmVlZF9yZWZlcmVuY2UpIHsKKyAgICAgICAgZl90eXBlc18gPDwgIiYiOworICAgICAgfQorICAgICAgZl90eXBlc18gPDwgInJldHZhbCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICB9CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIKKyAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIHRocmlmdC5SRVBMWSwgc2VxSWQpOyBlcnIyICE9IG5pbCB7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gcmVzdWx0LiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSBvcHJvdC5GbHVzaChjdHgpOyBlcnIgPT0gbmlsICYmIGVycjIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWUsIGVyciIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgbmlsIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvZXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXJfdmFsdWUpIHsKKyAgKHZvaWQpaW5jbGFzczsKKyAgKHZvaWQpY29lcmNlRGF0YTsKKyAgdF90eXBlKiBvcmlnX3R5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKKyAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQsIGluX2NvbnRhaW5lcl92YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgb3JpZ190eXBlLCBpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCksIGRlY2xhcmUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaWYgKGRlY2xhcmUpIHsKKyAgICAgIHN0cmluZyB0eXBlX25hbWUgPSBpbmtleSA/IHR5cGVfdG9fZ29fa2V5X3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZV90b19nb190eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIG91dCA8PCAidmFyICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCB0eXBlX25hbWUgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgdiwgZXJyIDo9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICFpbmtleSkgeworICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiUmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEdvIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOworICAgIH0KKworICAgIG91dCA8PCAiOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgZmllbGQgIiA8PCB0ZmllbGQtPmdldF9rZXkoKQorICAgICAgICA8PCAiOiBcIiwgZXJyKSIgPDwgZW5kbDsKKworICAgIG91dCA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgc3RyaW5nIHdyYXA7CisKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpIHx8IG9yaWdfdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB3cmFwID0gcHVibGljaXplKHR5cGVfbmFtZShvcmlnX3R5cGUpKTsKKyAgICB9IGVsc2UgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB7CisgICAgICB3cmFwID0gImludDgiOworICAgIH0KKworICAgIHN0cmluZyBtYXliZV9hZGRyZXNzID0gKGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSA/ICImIiA6ICIiKTsKKyAgICBpZiAod3JhcCA9PSAiIikgeworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCBtYXliZV9hZGRyZXNzIDw8ICJ2IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGVtcCA6PSAiIDw8IHdyYXAgPDwgIih2KSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgbWF5YmVfYWRkcmVzcyA8PCAidGVtcCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgZmllbGQgJyIKKyAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiJyI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVxKGRlY2xhcmUgPyAiIDo9ICIgOiAiID0gIik7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKTsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9ICIgPDwgcHJlZml4IDw8ICIuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAgIihpcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgZXJyb3IgcmVhZGluZyBzdHJ1Y3Q6IFwiLCAiCisgICAgICA8PCBwcmVmaXggPDwgIiksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIG9yaWdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKKyAgc3RyaW5nIGVxKCIgPSAiKTsKKworICBpZiAoZGVjbGFyZSkgeworICAgIGVxID0gIiA6PSAiOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIF8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIG1hcCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidE1hcCA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgc2l6ZSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRNYXAiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBzZXQgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRTZXQgOj0gbWFrZSgiIDw8IHR5cGVfdG9fZ29fdHlwZShvcmlnX3R5cGUpIDw8ICIsIDAsIHNpemUpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0U2V0IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBsaXN0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0U2xpY2UgOj0gbWFrZSgiIDw8IHR5cGVfdG9fZ29fdHlwZShvcmlnX3R5cGUpIDw8ICIsIDAsIHNpemUpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0U2xpY2UiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgJyIgKyB0dHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBwcmVmaXggJyIKKyAgICAgICAgKyBwcmVmaXggKyAiJyI7CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkgKysgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHBvaW50ZXJfZmllbGQpIHsKKyAgICBwcmVmaXggPSAiKCoiICsgcHJlZml4ICsgIikiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRNYXBFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbWFwIGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRTZXRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgc2V0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBsaXN0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKWRlY2xhcmU7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKyAgZmtleS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBmdmFsLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClkZWNsYXJlOworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICBmZWxlbS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGFwcGVuZCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKWRlY2xhcmU7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKCgodF9saXN0Kil0bGlzdCktPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGZlbGVtLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gYXBwZW5kKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHN0cmluZyBuYW1lKHByZWZpeCArIHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBnZW5lcmF0ZSBzZXJpYWxpemUgZm9yIHZvaWQgdHlwZTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmIGVyciA6PSBvcHJvdC4iOworCisgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSkgeworICAgICAgbmFtZSA9ICIqIiArIG5hbWU7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSAmJiAhaW5rZXkpIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZyhzdHJpbmcoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIldyaXRlQm9vbChib29sKCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoaW50OCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIldyaXRlSTE2KGludDE2KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiV3JpdGVJMzIoaW50MzIoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUk2NChpbnQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKGZsb2F0NjQoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEdvIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIjsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVC4iCisgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiICgiIDw8IHRmaWVsZC0+Z2V0X2tleSgpCisgICAgICAgIDw8ICIpIGZpZWxkIHdyaXRlIGVycm9yOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IEludmFsaWQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgJyIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIicgZm9yIGZpZWxkICciICsgbmFtZSArICInIjsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSAiIDw8IHByZWZpeCA8PCAiLiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIGVycm9yIHdyaXRpbmcgc3RydWN0OiBcIiwgIgorICAgICAgPDwgcHJlZml4IDw8ICIpLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHBvaW50ZXJfZmllbGQpIHsKKyAgICBwcmVmaXggPSAiKiIgKyBwcmVmaXg7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwQmVnaW4oIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbWFwIGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRCZWdpbigiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgc2V0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEJlZ2luKCIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbGlzdCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgJyIgKyB0dHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICInIGZvciBwcmVmaXggJyIgKyBwcmVmaXggKyAiJyI7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIGssIHYgOj0gcmFuZ2UgIiA8PCBwcmVmaXggPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHRtYXAsICJrIiwgInYiKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBpIDo9IDA7IGk8bGVuKCIgPDwgcHJlZml4IDw8ICIpOyBpKysgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgZm9yIGogOj0gaSsxOyBqPGxlbigiIDw8IHByZWZpeCA8PCAiKTsgaisrIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgcmVmbGVjdC5EZWVwRXF1YWwoIiA8PCBwcmVmaXggPDwgIltpXSwiIDw8IHByZWZpeCA8PCAiW2pdKSB7ICIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiXCIsIGZtdC5FcnJvcmYoXCIlVCBlcnJvciB3cml0aW5nIHNldCBmaWVsZDogc2xpY2UgaXMgbm90IHVuaXF1ZVwiLCAiIDw8IHByZWZpeCA8PCAiW2ldKSkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgXywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgdHNldCwgInYiKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgXywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgdGxpc3QsICJ2Iik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZU1hcEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBtYXAgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgc2V0IGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUxpc3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksICIiKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICIiKTsKKyAga2ZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIHZmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCBraXRlciwgdHJ1ZSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsIHZpdGVyKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksICIiKTsKKyAgZWZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHByZWZpeCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4KSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICIiKTsKKyAgZWZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHByZWZpeCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gc3RydWN0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgeworICBib29sIGhhc19kb2MgPSBmYWxzZTsKKyAgc3RyaW5nc3RyZWFtIHNzOworCisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBoYXNfZG9jID0gdHJ1ZTsKKyAgICBzcyA8PCB0ZG9jLT5nZXRfZG9jKCk7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGlmIChoYXNfZG9jKSB7CisgICAgICBzcyA8PCBlbmRsOworICAgIH0KKworICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiIC0gIiA8PCBwdWJsaWNpemUocC0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZG9jKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vICIsIHNzLnN0cigpLCAiIik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnZW5lcmljIG9iamVjdC4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLyIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYW4gYXJndW1lbnQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgIHJlc3VsdCA8PCBwdWJsaWNpemUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiPSI7CisKKyAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgIHJlc3VsdCA8PCAidGhyaWZ0X3NwZWNbIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiXVs0XSI7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0IDw8ICJuaWwiOworICB9CisKKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgc3RydWN0IGZpZWxkIGluaXRpYWwgdmFsdWUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQsIHdoaWNoIG11c3QgaGF2ZSBgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMYAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9pbml0aWFsX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAob3B0aW9uYWxfZmllbGQpIHsKKyAgICAvLyBUaGUgY2FsbGVyIHdpbGwgbWFrZSBhIHNlY29uZCBwYXNzIGZvciBvcHRpb25hbCBmaWVsZHMsCisgICAgLy8gYXNzaWduaW5nIHRoZSByZXN1bHQgb2YgcmVuZGVyX2NvbnN0X3ZhbHVlIHRvICIqZmllbGRfbmFtZSIuIEl0CisgICAgLy8gaXMgbWFkZGVuaW5nIHRoYXQgR28gc3ludGF4IGRvZXMgbm90IGFsbG93IGZvciBhIHR5cGUtYWdub3N0aWMKKyAgICAvLyB3YXkgdG8gaW5pdGlhbGl6ZSBhIHBvaW50ZXIgdG8gYSBjb25zdCB2YWx1ZSwgYnV0IHNvIGl0IGdvZXMuCisgICAgLy8gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHdyaXRlIHR5cGUgc3BlY2lmaWMgZnVuY3Rpb25zIHRoYXQKKyAgICAvLyBjb252ZXJ0IGZyb20gY29uc3QgdmFsdWVzIHRvIHBvaW50ZXIgdHlwZXMsIGJ1dCBnaXZlbiB0aGUgbGFjaworICAgIC8vIG9mIG92ZXJsb2FkaW5nIGl0IHdvdWxkIGJlIG1lc3N5LgorICAgIHJldHVybiAibmV3KCIgKyB0eXBlX3RvX2dvX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCksIG5hbWUpOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKKyAgcmV0dXJuIHB1YmxpY2l6ZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpCisgICAgICAgICArICIpIjsKK30KKworLyoqCisgKiBSZW5kZXJzIGFuIGludGVyZmFjZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4LCBib29sIGFkZEVycm9yKSB7CisgIHN0cmluZyBzaWduYXR1cmUgPSBwdWJsaWNpemUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIjsKKyAgc2lnbmF0dXJlICs9ICJjdHggY29udGV4dC5Db250ZXh0IjsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgIHNpZ25hdHVyZSArPSAiLCAiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICB9CisgIHNpZ25hdHVyZSArPSAiKSAoIjsKKworICB0X3R5cGUqIHJldCA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgc3RyaW5nIGVycnMgPSBhcmd1bWVudF9saXN0KGV4Y2VwdGlvbnMpOworCisgIGlmICghcmV0LT5pc192b2lkKCkpIHsKKyAgICBzaWduYXR1cmUgKz0gInIgIiArIHR5cGVfdG9fZ29fdHlwZShyZXQpOworCisgICAgaWYgKGFkZEVycm9yIHx8IGVycnMuc2l6ZSgpID09IDApIHsKKyAgICAgIHNpZ25hdHVyZSArPSAiLCAiOworICAgIH0KKyAgfQorCisgIGlmIChhZGRFcnJvcikgeworICAgIHNpZ25hdHVyZSArPSAiZXJyIGVycm9yIjsKKyAgfQorCisgIHNpZ25hdHVyZSArPSAiKSI7CisgIHJldHVybiBzaWduYXR1cmU7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorCisgICAgcmVzdWx0ICs9IHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIiAiCisgICAgICAgICAgICAgICsgdHlwZV90b19nb190eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBtb2R1bGUoIG1vZHVsZV9uYW1lKHR0eXBlKSk7CisgIGlmKCAhIG1vZHVsZS5lbXB0eSgpKSB7CisgICAgcmV0dXJuIG1vZHVsZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6Om1vZHVsZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIikuZW1wdHkoKSB8fAorICAgICAgICBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZ28iKS5lbXB0eSgpIHx8CisgICAgICAgIHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImdvIikgIT0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImdvIikpIHsKKyAgICAgIHN0cmluZyBtb2R1bGUoZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW0pKTsKKyAgICAgIC8vIGZvciBuYW1lc3BhY2VkIGluY2x1ZGVzLCBvbmx5IGtlZXAgcGFydCBhZnRlciBkb3QuCisgICAgICBzaXplX3QgZG90ID0gbW9kdWxlLnJmaW5kKCcuJyk7CisgICAgICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBtb2R1bGUgPSBtb2R1bGUuc3Vic3RyKGRvdCArIDEpOworICAgICAgfQorICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eW9lCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAvKiB0aGlzIGlzIHdyb25nLCBiaW5hcnkgaXMgc3RpbGwgYSBzdHJpbmcgdHlwZSBpbnRlcm5hbGx5CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICByZXR1cm4gInRocmlmdC5CSU5BUlkiOworICAgICAgfQorICAgICAgKi8KKyAgICAgIHJldHVybiAidGhyaWZ0LlNUUklORyI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gInRocmlmdC5CT09MIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gInRocmlmdC5CWVRFIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJ0aHJpZnQuSTE2IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJ0aHJpZnQuSTY0IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJ0aHJpZnQuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAidGhyaWZ0Lk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAidGhyaWZ0LkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gbWFwIHR5cGUsIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IHdpbGwKKyAqIG5vdCBwcm9kdWNlIGEgdmFsaWQgZ28gbWFwIHR5cGUuCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb19rZXlfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdF90eXBlKiByZXNvbHZlZF90eXBlID0gdHlwZTsKKworICB3aGlsZSAocmVzb2x2ZWRfdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmVzb2x2ZWRfdHlwZSA9ICgodF90eXBlZGVmKilyZXNvbHZlZF90eXBlKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICB9CisKKyAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX21hcCgpIHx8IHJlc29sdmVkX3R5cGUtPmlzX2xpc3QoKSB8fCByZXNvbHZlZF90eXBlLT5pc19zZXQoKSkgeworICAgIHRocm93ICJDYW5ub3QgcHJvZHVjZSBhIHZhbGlkIHR5cGUgZm9yIGEgR28gbWFwIGtleTogIiArIHR5cGVfdG9fZ29fdHlwZSh0eXBlKSArICIgLSBhYm9ydGluZy4iOworICB9CisKKyAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX2JpbmFyeSgpKQorICAgIHJldHVybiAic3RyaW5nIjsKKworICByZXR1cm4gdHlwZV90b19nb190eXBlKHR5cGUpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlwZQorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZ29fdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgcmV0dXJuIHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdCh0eXBlLCBmYWxzZSk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eXBlLCB0YWtpbmcgaW50byBhY2NvdW50IHdoZXRoZXIgdGhlIGZpZWxkCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUgaXMgVF9PUFRJT05BTC4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbF9maWVsZCkgeworICBzdHJpbmcgbWF5YmVfcG9pbnRlcihvcHRpb25hbF9maWVsZCA/ICIqIiA6ICIiKTsKKworICBpZiAodHlwZS0+aXNfdHlwZWRlZigpICYmICgodF90eXBlZGVmKil0eXBlKS0+aXNfZm9yd2FyZF90eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJbXWJ5dGUiOworICAgICAgfQorCisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJzdHJpbmciOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiYm9vbCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50OCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDE2IjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50MzIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQ2NCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImZsb2F0NjQiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIioiICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdCA9ICh0X21hcCopdHlwZTsKKyAgICBzdHJpbmcga2V5VHlwZSA9IHR5cGVfdG9fZ29fa2V5X3R5cGUodC0+Z2V0X2tleV90eXBlKCkpOworICAgIHN0cmluZyB2YWx1ZVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X3ZhbF90eXBlKCkpOworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJtYXBbIikgKyBrZXlUeXBlICsgIl0iICsgdmFsdWVUeXBlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHQgPSAodF9zZXQqKXR5cGU7CisgICAgc3RyaW5nIGVsZW1UeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIltdIikgKyBlbGVtVHlwZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHQgPSAodF9saXN0Kil0eXBlOworICAgIHN0cmluZyBlbGVtVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfZWxlbV90eXBlKCkpOworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJbXSIpICsgZWxlbVR5cGU7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19nb190eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitib29sIGZvcm1hdF9nb19vdXRwdXQoY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpIHsKKworICAvLyBmb3JtYXR0aW5nIHZpYSBnb2ZtdCBkZWFjdGl2YXRlZCBkdWUgdG8gVEhSSUZULTM4OTMKKyAgLy8gUGxlYXNlIGxvb2sgYXQgdGhlIHRpY2tldCBhbmQgbWFrZSBzdXJlIHlvdSBmdWxseSB1bmRlcnN0YW5kIGFsbCB0aGUgaW1wbGljYXRpb25zCisgIC8vIGJlZm9yZSBzdWJtaXR0aW5nIGEgcGF0Y2ggdGhhdCBlbmFibGVzIHRoaXMgZmVhdHVyZSBhZ2Fpbi4gVGhhbmsgeW91LgorICAodm9pZCkgZmlsZV9wYXRoOworICByZXR1cm4gZmFsc2U7CisKKyAgLyoKKyAgY29uc3Qgc3RyaW5nIGNvbW1hbmQgPSAiZ29mbXQgLXcgIiArIGZpbGVfcGF0aDsKKworICBpZiAoc3lzdGVtKGNvbW1hbmQuY19zdHIoKSkgPT0gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HIC0gUnVubmluZyAnJXMnIGZhaWxlZC5cbiIsIGNvbW1hbmQuY19zdHIoKSk7CisgIHJldHVybiBmYWxzZTsKKyAgKi8KKyB9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZ28sICJHbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGFja2FnZV9wcmVmaXg9ICBQYWNrYWdlIHByZWZpeCBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdGhyaWZ0X2ltcG9ydD0gICBPdmVycmlkZSB0aHJpZnQgcGFja2FnZSBpbXBvcnQgcGF0aCAoZGVmYXVsdDoiICsgREVGQVVMVF9USFJJRlRfSU1QT1JUICsgIilcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHBhY2thZ2U9ICAgICAgICAgUGFja2FnZSBuYW1lIChkZWZhdWx0OiBpbmZlcnJlZCBmcm9tIHRocmlmdCBmaWxlIG5hbWUpXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZ25vcmVfaW5pdGlhbGlzbXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgYXV0b21hdGljIHNwZWxsaW5nIGNvcnJlY3Rpb24gb2YgaW5pdGlhbGlzbXMgKGUuZy4gXCJVUkxcIilcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHJlYWRfd3JpdGVfcHJpdmF0ZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgTWFrZSByZWFkL3dyaXRlIG1ldGhvZHMgcHJpdmF0ZSwgZGVmYXVsdCBpcyBwdWJsaWMgUmVhZC9Xcml0ZVxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4MzAxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEdyYXBodml6IGNvZGUgZ2VuZXJhdG9yCisgKi8KK2NsYXNzIHRfZ3ZfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9ndl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZXhjZXB0aW9uX2Fycm93cyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImV4Y2VwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGV4Y2VwdGlvbl9hcnJvd3MgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGd2OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ndiI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgZW5kIG9mIGdlbmVyYXRvcgorICAgKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogSGVscGVycworICAgKi8KKyAgdm9pZCBwcmludF90eXBlKHRfdHlwZSogdHR5cGUsIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9vdXRfOworICBzdGQ6Omxpc3Q8c3RyaW5nPiBlZGdlczsKKyAgYm9vbCBleGNlcHRpb25fYXJyb3dzOworfTsKKworLyoqCisgKiBJbml0IGdlbmVyYXRvcjoKKyAqIC0gQWRkcyBzb21lIGVzY2FwaW5nIGZvciB0aGUgR3JhcGh2aXogZG9tYWluLgorICogLSBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBhbmQgb3BlbiBmaWxlIGZvciB3cml0dGluZy4KKyAqIC0gV3JpdGUgdGhlIGZpbGUgaGVhZGVyLgorICovCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgZXNjYXBlX1sneyddID0gIlxceyI7CisgIGVzY2FwZV9bJ30nXSA9ICJcXH0iOworCisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBzdHJpbmcgZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmd2IjsKKyAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7CisgIGZfb3V0XyA8PCAiZGlncmFwaCBcIiIgPDwgZXNjYXBlX3N0cmluZyhwcm9ncmFtX25hbWVfKSA8PCAiXCIgeyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJub2RlIFtzdHlsZT1maWxsZWQsIHNoYXBlPXJlY29yZF07IiA8PCBlbmRsOworICBmX291dF8gPDwgImVkZ2UgW2Fycm93c2l6ZT0wLjVdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJyYW5rZGlyPUxSIiA8PCBlbmRsOworfQorCisvKioKKyAqIENsb3NlcyBnZW5lcmF0b3I6CisgKiAtIFByaW50IGFjY3VtdWxhdGVkIG5vZGVzIGNvbm5lY3Rpb25zLgorICogLSBQcmludCBmb290bm90ZS4KKyAqIC0gQ2xvc2VzIGZpbGUuCisgKi8KK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gUHJpbnQgZWRnZXMKKyAgc3RkOjpsaXN0PHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5iZWdpbigpOworICBmb3IgKDsgaXRlciAhPSBlZGdlcy5lbmQoKTsgaXRlcisrKSB7CisgICAgZl9vdXRfIDw8ICgqaXRlcikgPDwgZW5kbDsKKyAgfQorCisgIC8vIFByaW50IGdyYXBoIGVuZCB9IGFuZCBjbG9zZSBmaWxlCisgIGZfb3V0XyA8PCAifSIgPDwgZW5kbDsKKyAgZl9vdXRfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdHJpbmcgbmFtZSA9IHR0eXBlZGVmLT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1henVyZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisKKyAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIGZfb3V0XyA8PCAiIDo6ICI7CisgIHByaW50X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIG5hbWUpOworCisgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPXdoaXRlXTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiZW51bSAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgZl9vdXRfIDw8ICd8JyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIiA9ICI7CisgICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgfQorCisgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworCisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWFsaWNlYmx1ZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgImNvbnN0XyIgPDwgbmFtZSA8PCAiIFtsYWJlbD1cIiI7CisKKyAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIGZfb3V0XyA8PCAiID0gIjsKKyAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdHlwZSgpLCB0Y29uc3QtPmdldF92YWx1ZSgpKTsKKyAgZl9vdXRfIDw8ICIgOjogIjsKKyAgcHJpbnRfdHlwZSh0Y29uc3QtPmdldF90eXBlKCksICJjb25zdF8iICsgbmFtZSk7CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9bGlnaHRwaW5rXTsiIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworICAgIGZfb3V0XyA8PCAiZXhjZXB0aW9uICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9bGlnaHRjeWFuXTsiIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworICAgIGZfb3V0XyA8PCAidW5pb24gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWJlaWdlXTsiIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworICAgIGZfb3V0XyA8PCAic3RydWN0ICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgfQorCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHN0cmluZyBmaWVsZF9uYW1lID0gKCptZW1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBwcmludCBwb3J0IChhbmNob3IgcmVmZXJlbmNlKQorICAgIGZfb3V0XyA8PCAifDxmaWVsZF8iIDw8IGZpZWxkX25hbWUgPDwgJz4nOworCisgICAgLy8gZmllbGQgbmFtZSA6OiBmaWVsZCB0eXBlCisgICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiIDo6ICI7CisgICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSwgbmFtZSArICI6ZmllbGRfIiArIGZpZWxkX25hbWUpOworICB9CisKKyAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUsIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVmKSB7CisgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZl9vdXRfIDw8ICJsaXN0XFw8IjsKKyAgICAgIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBzdHJ1Y3RfZmllbGRfcmVmKTsKKyAgICAgIGZfb3V0XyA8PCAiXFw+IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgZl9vdXRfIDw8ICJzZXRcXDwiOworICAgICAgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIlxcPiI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibWFwXFw8IjsKKyAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIlxcPiI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGZfb3V0XyA8PCAodHR5cGUtPmlzX2JpbmFyeSgpID8gImJpbmFyeSIgOiB0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIGVkZ2VzLnB1c2hfYmFjayhzdHJ1Y3RfZmllbGRfcmVmICsgIiAtPiAiICsgdHR5cGUtPmdldF9uYW1lKCkpOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIG91dCBhbiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBzd2l0Y2ggKHR2YWx1ZS0+Z2V0X3R5cGUoKSkgeworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICBmX291dF8gPDwgIlxcXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh0dmFsdWUpIDw8ICJcXFwiIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6IHsKKyAgICBmX291dF8gPDwgIlxceyAiOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtYXBfaXRlcjsKKyAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCksIG1hcF9pdGVyLT5maXJzdCk7CisgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIG1hcF9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBmX291dF8gPDwgIiBcXH0iOworICB9IGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6IHsKKyAgICBmX291dF8gPDwgIlxceyAiOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICA7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOworICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9vdXRfIDw8ICIgXFx9IjsKKyAgfSBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgIGZfb3V0XyA8PCBlc2NhcGVfc3RyaW5nKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIuIgorICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKHR2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBmX291dF8gPDwgIlVOS05PV04iOworICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc2VydmljZV9uYW1lID0gZ2V0X3NlcnZpY2VfbmFtZSh0c2VydmljZSk7CisgIGZfb3V0XyA8PCAic3ViZ3JhcGggY2x1c3Rlcl8iIDw8IHNlcnZpY2VfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWJpc3F1ZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgInN0eWxlPWRhc2hlZDsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAibGFiZWwgPSBcIiIgPDwgZXNjYXBlX3N0cmluZyhzZXJ2aWNlX25hbWUpIDw8ICIgc2VydmljZVwiOyIgPDwgZW5kbDsKKworICAvLyBUT0RPOiBzZXJ2aWNlIGV4dGVuZHMKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKKyAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBmX291dF8gPDwgImZ1bmN0aW9uXyIgPDwgc2VydmljZV9uYW1lIDw8IGZuX25hbWU7CisgICAgZl9vdXRfIDw8ICJbbGFiZWw9XCI8cmV0dXJuX3R5cGU+ZnVuY3Rpb24gIiA8PCBlc2NhcGVfc3RyaW5nKGZuX25hbWUpOworICAgIGZfb3V0XyA8PCAiIDo6ICI7CisgICAgcHJpbnRfdHlwZSgoKmZuX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiZnVuY3Rpb25fIiArIHNlcnZpY2VfbmFtZSArIGZuX25hbWUgKyAiOnJldHVybl90eXBlIik7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSAoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7CisgICAgICBmX291dF8gPDwgInw8cGFyYW1fIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiPiI7CisgICAgICBmX291dF8gPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAoKCphcmdfaXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSwgKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiIDo6ICI7CisgICAgICBwcmludF90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAiZnVuY3Rpb25fIiArIHNlcnZpY2VfbmFtZSArIGZuX25hbWUgKyAiOnBhcmFtXyIgKyAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIC8vIGVuZCBvZiBub2RlCisgICAgZl9vdXRfIDw8ICJcIl07IiA8PCBlbmRsOworCisgICAgLy8gRXhjZXB0aW9uIGVkZ2VzCisgICAgaWYgKGV4Y2VwdGlvbl9hcnJvd3MpIHsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgICAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICAgICAgZWRnZXMucHVzaF9iYWNrKCJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICIgLT4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpICsgIiBbY29sb3I9cmVkXSIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZfb3V0XyA8PCAiIH0iIDw8IGVuZGw7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgZ3YsCisgICAgIkdyYXBodml6IiwKKyAgICAiICAgIGV4Y2VwdGlvbnM6ICAgICAgV2hldGhlciB0byBkcmF3IGFycm93cyBmcm9tIGZ1bmN0aW9ucyB0byBleGNlcHRpb24uXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4OGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyOTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBIYXhlIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9oYXhlX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2hheGVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgY2FsbGJhY2tzXyA9IGZhbHNlOworICAgIHJ0dGlfID0gZmFsc2U7CisgICAgYnVpbGRtYWNyb18gPSAiIjsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjYWxsYmFja3MiKSA9PSAwKSB7CisgICAgICAgIGNhbGxiYWNrc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJydHRpIikgPT0gMCkgeworICAgICAgICBydHRpXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImJ1aWxkbWFjcm8iKSA9PSAwKSB7CisgICAgICAgIGJ1aWxkbWFjcm9fID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gaGF4ZToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taGF4ZSI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2hheGVfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgLy8gcmVtb3ZlZCBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX2hheGVfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgaGF4ZV9wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdHlwZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cyk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9pbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGFzX3R5cGUsIGJvb2wgb21pdF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgLy8gY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAtIEludDY0IGlzIG5vdCByZWFsbHkgbnVsbGFibGUsIGV2ZW4gdGhvdWdoIGl0IGJlaGF2ZWQgdGhhdAorICAgICAgICAvLyB3YXkgYmVmb3JlIEhheGUgMy4yLjAKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgYm9vbCBjYWxsYmFja3NfOworICBib29sIHJ0dGlfOworICBzdHJpbmcgYnVpbGRtYWNyb187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKworICAvLyBIYXhlIHBhY2thZ2UgbmFtZXMgYXJlIGxvd2VyY2FzZQorICBpZiAocGFja2FnZV9uYW1lXy5sZW5ndGgoKSA+IDApIHsKKyAgICBwYWNrYWdlX25hbWVfWzBdID0gdG9sb3dlcihwYWNrYWdlX25hbWVfWzBdKTsKKyAgICBzaXplX3QgaW5kZXggPSBwYWNrYWdlX25hbWVfLmZpbmQoJy4nKTsKKyAgICB3aGlsZSAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGlmICgrK2luZGV4IDwgcGFja2FnZV9uYW1lXy5sZW5ndGgoKSkgeworICAgICAgICBwYWNrYWdlX25hbWVfW2luZGV4XSA9IHRvbG93ZXIocGFja2FnZV9uYW1lX1tpbmRleF0pOworICAgICAgfQorICAgICAgaW5kZXggPSBwYWNrYWdlX25hbWVfLmZpbmQoJy4nLCBpbmRleCk7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Cit9CisKKy8qKgorICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCisgKgorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXzsKKyAgfQorICByZXR1cm4gInBhY2thZ2UiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBoYXhlIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgaGF4ZSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdHlwZV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qO1xuIiArICJpbXBvcnQgaGF4ZS5pby5CeXRlcztcbiIKKyAgICAgICAgICsgImltcG9ydCBoYXhlLmRzLkludE1hcDtcbiIgKyAiaW1wb3J0IGhheGUuZHMuU3RyaW5nTWFwO1xuIgorICAgICAgICAgKyAiaW1wb3J0IGhheGUuZHMuT2JqZWN0TWFwO1xuIiArICJcbiIgKyAiI2lmIGZsYXNoXG4iCisgICAgICAgICArICJpbXBvcnQgZmxhc2guZXJyb3JzLkFyZ3VtZW50RXJyb3I7XG4iICsgIiNlbmRcbiIgKyAiXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBoYXhlIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90aHJpZnRfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCisgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcbiIgKyAiXG4iOworfQorCisvKioKKyAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc3RydWN0CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKSB7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICAgIGlmIChpbXBvcnRzLmZpbmQocGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgaW1wb3J0cy5hcHBlbmQoImltcG9ydCAiICsgcGFja2FnZSArICIuIiArICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQorICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3NlcnZpY2UKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGltcG9ydHM7CisgIGNvbnN0IHZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBGb3IgZWFjaCB0eXBlIGNoZWNrIGlmIGl0IGlzIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgeworICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICI7XG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgaW1wb3J0cyk7CisgICAgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHMoKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCksIGltcG9ydHMpOworICB9CisKKyAgcmV0dXJuIGltcG9ydHM7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBoYXhlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gaGF4ZSwgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmh4IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQWRkIGhheGUgaW1wb3J0cworICBmX2VudW0gPDwgc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX2VudW0pOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfZW51bSk7CisgIGluZGVudChmX2VudW0pIDw8ICJjbGFzcyAiIDw8IGdldF9jYXBfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiAiOworICBzY29wZV91cChmX2VudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA6IEludCA9ICIgPDwgdmFsdWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENyZWF0ZSBhIHN0YXRpYyBTZXQgd2l0aCBhbGwgdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgdmFyIFZBTElEX1ZBTFVFUyA9IHsgbmV3IEludFNldCggWyI7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIHBvcHVsYXRlIHNldAorICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIikgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2VudW0gPDwgIl0pOyB9OyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyB2YXIgVkFMVUVTX1RPX05BTUVTID0geyBbIjsKKyAgaW5kZW50X3VwKCk7CisgIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZW51bSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwiKSA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+IFwiIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIjsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgZl9lbnVtIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICJdOyB9OyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiQ29uc3RhbnRzLmh4IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKTsKKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9jb25zdHMpOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfY29uc3RzKTsKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gInZhciAiIDogInB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciAgIik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgorICAgICAgICA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgKHR5cGUtPmlzX2xpc3QoKSA/ICJwdXNoIiA6ICJhZGQiKSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcworICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBIYXhlIHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpc19yZXN1bHQpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuaHgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGw7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzdHJpbmcgaW1wb3J0czsKKworICBmX3N0cnVjdCA8PCBoYXhlX3R5cGVfaW1wb3J0cygpIDw8IGhheGVfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c3RydWN0LCBpbXBvcnRzKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfcmVzdWx0KTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIGhheGUgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgc3RyaW5nIGNsc25hbWUgPSBnZXRfY2FwX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisKKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKG91dCk7CisgIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgY2xzbmFtZSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBURXhjZXB0aW9uICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHZhciBTVFJVQ1RfREVTQyA9IHsgbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsgfTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB2YXIgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSB7IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyB9OyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsICptX2l0ZXIpOworICAgIC8vIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiIDogIiArCisgICAgLy8gdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIkA6aXNWYXIiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2YXIgIgorICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICIoZ2V0LHNldCkgOiAiCisgICAgICAgICAgICAgICAgICAgKyBnZXRfY2FwX25hbWUodHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJpbmxpbmUgc3RhdGljIHZhciAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfSUQgOiBJbnQgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgOiBCb29sID0gZmFsc2U7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAorICBpZiAoZmFsc2UpIHsKKyAgICAvLyBUT0RPOiByZWFjdGl2YXRlIHdoZW4gbmVlZGVkCisgICAgZ2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgbWV0YURhdGFNYXApOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoKTsiIDw8IGVuZGw7CisgIH0KKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoIGlwcm90IDogVFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA6IFRGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgorICAgICAgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiY2F0Y2goZTpEeW5hbWljKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgaGF4ZSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpIDogVm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUuIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGdldF9lbnVtX2NsYXNzX25hbWUodHlwZSkpIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlRoZSBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIicgaGFzIGJlZW4gYXNzaWduZWQgdGhlIGludmFsaWQgdmFsdWUgXCIgKyAiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgfQorCisgICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXRjaChlOkR5bmFtaWMpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICAodm9pZCl0eXBlOworICAodm9pZCljYXBfbmFtZTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldEZpZWxkVmFsdWUoZmllbGRJRCA6IEludCwgdmFsdWUgOiBEeW5hbWljKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJRCA6IEludCkgOiBEeW5hbWljIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7CisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCisgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpc1NldChmaWVsZElEIDogSW50KSA6IEJvb2wgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIHByb3BlcnR5IHNldHRlcnMvZ2V0dGVycyBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eV9nZXR0ZXJzX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldF8iIDw8IGZpZWxkX25hbWUgPDwgIigpIDogIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHR5cGUpKQorICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldF8iIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUgPDwgIjoiCisgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0eXBlKSkgPDwgIikgOiAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHlwZSkpIDw8ICIgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gVW5zZXR0ZXIKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGlzU2V0IG1ldGhvZAorICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkgOiBCb29sIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIgorICAgICAgPDwgImZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmV0IDogU3RyaW5nID0gXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIjsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpcnN0IDogQm9vbCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgcmV0ICs9ICBcIiwgXCI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIjsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIm51bGxcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJCSU5BUllcIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICJfbmFtZSA6IFN0cmluZyA9ICIgPDwgZ2V0X2NhcF9uYW1lKGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxVRVNfVE9fTkFNRVNbdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiIChcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiKVwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0ICs9IFwiKVwiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdGF0aWMgbWFwIHdpdGggbWV0YSBkYXRhIHRvIHN0b3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgZmllbGRJRCB0bworICogZmllbGROYW1lIG1hcHBpbmcKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gRmllbGRNZXRhRGF0YSBtYXBwaW5ncworICBpbmRlbnQob3V0KSA8PCAiaW5saW5lIHN0YXRpYyB2YXIgbWV0YURhdGFNYXAgOiBJbnRNYXAgPSBuZXcgSW50TWFwKCk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIC8vIFBvcHVsYXRlIG1hcAorICAgIHNjb3BlX3VwKG91dCk7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkKKyAgICAgICAgICAgICAgICAgIDw8ICJfRklFTERfSURdID0gbmV3IEZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOworCisgICAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQorICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKKyAgICAgIH0KKworICAgICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQorICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOworICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBoYXhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9oYXhlX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2hheGVfdHlwZV9zdHJpbmchIik7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoCisgICAgICAgICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9oYXhlX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudF91cCgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgeyAvLyBtYXAKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOworICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfaGF4ZV90eXBlX3N0cmluZyh0eXBlKTsKKyAgfQorICBvdXQgPDwgIikiOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBpbnRlcmZhY2UgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiLmh4IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIGltcGxlbWVudGF0aW9uL2NsaWVudCBmaWxlCisgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pICsgIkltcGwuaHgiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiSW1wbDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIGhlbHBlciBjbGFzcyBmaWxlcworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiUHJvY2Vzc29yLmh4IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbCA8PCBoYXhlX3R5cGVfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworCisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKS5jX3N0cigpCisgICAgICAgICAgICAgICA8PCAiSW1wbDsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgc25pcHBldCBmb3IgdGhlIG9uU3VjY2VzcyBjYWxsYmFja3MKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9taXRfbmFtZSkgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gIiI7CisgIGlmICghb21pdF9uYW1lKSB7CisgICAgbmFtZSA9ICJvblN1Y2Nlc3MiOworICAgIGlmIChhc190eXBlKSB7CisgICAgICBuYW1lICs9ICIgOiAiOworICAgIH0KKyAgfQorCisgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGlmIChhc190eXBlKSB7CisgICAgICByZXR1cm4gbmFtZSArICJWb2lkLT5Wb2lkID0gbnVsbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuYW1lICsgIigpIDogVm9pZCI7CisgICAgfQorICB9CisKKyAgaWYgKGFzX3R5cGUpIHsKKyAgICByZXR1cm4gbmFtZSArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIi0+Vm9pZCA9IG51bGwiOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lICsgIiggcmV0dmFsIDogIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIikiOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBtZXRob2QgaGVhZGVyCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBjb2RlIGZvci4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSkgeworICBpZiAoY2FsbGJhY2tzXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0ZnVuY3Rpb24sIGlzX2ludGVyZmFjZSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0ZnVuY3Rpb24sIGlzX2ludGVyZmFjZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIgaW4gIm5vcm1hbCIgc3R5bGUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW50ZXJmYWNlKSB7CisgIGlmIChpc19pbnRlcmZhY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0ZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBtZXRob2QgaGVhZGVyIGluICJjYWxsYmFjayIgc3R5bGUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ludGVyZmFjZSkgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBzdGQ6OnN0cmluZyBvbl9zdWNjZXNzX2ltcGwgPSBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCBmYWxzZSwgZmFsc2UpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gZnVuY3Rpb24gb25FcnJvcihEeW5hbWljKSA6IFZvaWQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gZnVuY3Rpb24gIiA8PCBvbl9zdWNjZXNzX2ltcGwuY19zdHIoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChpc19pbnRlcmZhY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0ZnVuY3Rpb24pIDw8ICIgeyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICB9CisKKyAgZ2VuZXJhdGVfaGF4ZV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICAvLyBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7IC0gbm90IHlldCwgYmVjYXVzZSBvZgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzYyNgorICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpbnRlcmZhY2UgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IGdldF9jYXBfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiSW1wbCI7CisgIH0KKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7CisgIC8vIGJ1aWxkIG1hY3JvIGlzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJJbXBsIiA8PCBleHRlbmRzX2NsaWVudAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCA9IG51bGwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgaXByb3RfIDogVFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIG9wcm90XyA6IFRQcm90b2NvbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcml2YXRlIHZhciBzZXFpZF8gOiBJbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCkgOiBUUHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0UHJvdG9jb2woKSA6IFRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBzdHJpbmcgY2FsbHR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIk9ORVdBWSIgOiAiQ0FMTCI7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuIiA8PCBjYWxsdHlwZSA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJ2YXIgYXJncyA6ICIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXR2YWwgOiAiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKGZ1bmN0aW9uKGVycm9yOkR5bmFtaWMpIDogVm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnJvciAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZXJyb3IpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyBlcnJvcjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgbXNnIDogVE1lc3NhZ2UgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHgpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciByZXN1bHQgOiAiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKHJlc3VsdC5zdWNjZXNzKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dmFsID0gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcygpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICAgICAgICAgIDw8ICJvbkVycm9yKCBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gY2F0Y2goIGUgOiBURXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCEoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgdmFyICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pCisgICAgICAgICAgICAgPDwgIl9pZmFjZV8gOiAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIFBST0NFU1NfTUFQID0gbmV3IFN0cmluZ01hcDwgSW50LT5UUHJvdG9jb2wtPlRQcm90b2NvbC0+Vm9pZCA+KCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoIGlmYWNlIDogIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIikiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJfaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUFJPQ0VTU19NQVAuc2V0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBzdHJpbmcgb3ZlcnJpZGUgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBvdmVycmlkZSA9ICJvdmVycmlkZSAiOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogQm9vbCIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBtc2cgOiBUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/CisgIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKKyAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/CisgIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/CisgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgZm4gID0gUFJPQ0VTU19NQVAuZ2V0KG1zZy5uYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgdmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkICIKKyAgICAgICAgICJtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4oIG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCByZXN1bHRuYW1lKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2hheGVfc3RydWN0KCZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGNsYXNzCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIigpIDogSW50LT5UUHJvdG9jb2wtPlRQcm90b2NvbC0+Vm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1bmN0aW9uKCBzZXFpZCA6IEludCwgaXByb3QgOiBUUHJvdG9jb2wsIG9wcm90IDogVFByb3RvY29sKSA6IFZvaWQiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisgIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X2NhcF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgOiAiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA6ICIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYW55ICBmdW5jdGlvbiB0byBjYXRjaCAoZGVmaW5lZCBvciB1bmRlZmluZWQpIGV4Y2VwdGlvbnMKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChjYWxsYmFja3NfKSB7CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gc3R5bGUgb25FcnJvci9vblN1Y2Nlc3MKKworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgZl9zZXJ2aWNlXyA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBvbl9zdWNjZXNzID0gZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRmdW5jdGlvbiwgZmFsc2UsIHRydWUpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm51bGwsICAvLyBlcnJvcnMgYXJlIHRocm93biBieSB0aGUgaGFuZGxlciIgPDwgZW5kbDsKKyAgICAgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm51bGwpOyAvLyBubyByZXR2YWwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uIiA8PCBvbl9zdWNjZXNzLmNfc3RyKCkgPDwgIiB7IiA8PCBlbmRsOworICAgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHJldHZhbDsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgLy8gbm9ybWFsIGZ1bmN0aW9uKCk6cmVzdWx0IHN0eWxlCisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgfHwgdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJfaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAvLyBjYXRjaCBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIElETAorICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IgorICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGFsd2F5cyBjYXRjaCBhbGwgZXhjZXB0aW9ucyB0byBwcmV2ZW50IGZyb20gc2VydmljZSBkZW5pYWwKKyAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICh0aCA6IER5bmFtaWMpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyYWNlKFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHRoKTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0c3RydWN0KSkgPDwgIigpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZworICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQorICAgICAgICAgICAgICA8PCAiKCIKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaSA8PCAiIGluIDAgLi4uICIgPDwgb2JqIDw8ICIuc2l6ZSkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuc2V0KCAiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBIYXhlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7CisgICAgc3RyaW5nIGNvdW50ZXIgPSB0bXAoIl9zaXplQ291bnRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBjb3VudGVyIDw8ICIgOiBJbnQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgY291bnRlciA8PCArIisrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBjb3VudGVyIDw8ICIpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCkpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIudG9BcnJheSgpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIi5nZXQoIiArIGl0ZXIgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBoYXhlIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIGhheGUgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQpIHsKKyAgKHZvaWQpaW5faW5pdDsKKworICAvLyB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiSW50IjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgIHRfdHlwZSogdHZhbCA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgaWYgKHRrZXktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdGtleSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKCEodGtleS0+aXNfYmluYXJ5KCkpKSB7CisgICAgICAgICAgcmV0dXJuICJTdHJpbmdNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0TWFwPD4KKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gIkludE1hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXR1cm4gIkludDY0TWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0TWFwPD4KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHRrZXktPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuICJJbnRNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgfQorICAgIHJldHVybiAiT2JqZWN0TWFwPCAiICsgdHlwZV9uYW1lKHRrZXkpICsgIiwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBpZiAodGtleS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0a2V5KS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAoISh0a2V5LT5pc19iaW5hcnkoKSkpIHsKKyAgICAgICAgICByZXR1cm4gIlN0cmluZ1NldCI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0U2V0CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICJJbnRTZXQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAiSW50NjRTZXQiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0U2V0CisgICAgICB9CisgICAgfQorICAgIGlmICh0a2V5LT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiAiSW50U2V0IjsKKyAgICB9CisgICAgcmV0dXJuICJPYmplY3RTZXQ8ICIgKyB0eXBlX25hbWUodGtleSkgKyAiPiI7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogdGVsbSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gIkxpc3Q8ICIgKyB0eXBlX25hbWUodGVsbSkgKyAiPiI7CisgIH0KKworICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBoYXhlIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBoYXhlIGNvbnRhaW5lcj8KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICAodm9pZClpbl9jb250YWluZXI7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAiVm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJoYXhlLmlvLkJ5dGVzIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiQm9vbCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImhheGUuSW50MzIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImhheGUuSW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIkZsb2F0IjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEhheGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICJ2YXIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICIgOiAiICsgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0ZDo6c3RyaW5nIG9uX2Vycm9yX3N1Y2Nlc3MgPSAib25FcnJvciA6IER5bmFtaWMtPlZvaWQgPSBudWxsLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0ZnVuY3Rpb24sIHRydWUsIGZhbHNlKTsKKworICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmIChhcmd1bWVudHMgIT0gIiIpIHsKKyAgICAgIGFyZ3VtZW50cyArPSAiLCAiOworICAgIH0KKyAgICBhcmd1bWVudHMgKz0gb25fZXJyb3Jfc3VjY2VzczsgLy8ib25FcnJvciA6IEZ1bmN0aW9uLCBvblN1Y2Nlc3MgOiBGdW5jdGlvbiI7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpIDogVm9pZCI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdHR5cGU7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpIHx8IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0dHlwZSA9ICJWb2lkIjsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHR0eXBlID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgIH0KKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpIDogIiArIHJlc3VsdHR5cGU7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgOiAiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogSGF4ZSBjbGFzcyBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggdXBwZXJjYXNlIGxldHRlciwgYnV0IEhheGUgbmFtZXNwYWNlcyBtdXN0IG5vdC4KKyAqLworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLy8gdGVzdC5mb3IuR2VuZXJpYzwgZGF0YS5UeXBlLCBvci50aGUuTGlrZT4gYW5kIGhhbmRsZSBpdCByZWN1cnNpdmVseQorICBzaXplX3QgZ2VuZXJpY19maXJzdCA9IG5hbWUuZmluZCgnPCcpOworICBzaXplX3QgZ2VuZXJpY19sYXN0ID0gbmFtZS5yZmluZCgnPicpOworICBpZiAoKGdlbmVyaWNfZmlyc3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpICYmIChnZW5lcmljX2xhc3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CisgICAgc3RyaW5nIG91dGVyX3R5cGUgPSBuYW1lLnN1YnN0cigwLCBnZW5lcmljX2ZpcnN0KTsKKyAgICBzdHJpbmcgaW5uZXJfdHlwZXMgPSBuYW1lLnN1YnN0cihnZW5lcmljX2ZpcnN0ICsgMSwgZ2VuZXJpY19sYXN0IC0gZ2VuZXJpY19maXJzdCAtIDEpOworCisgICAgc3RyaW5nIG5ld19pbm5lciA9ICIiOworICAgIHNpemVfdCBjb21tYV9zdGFydCA9IDA7CisgICAgd2hpbGUgKGNvbW1hX3N0YXJ0IDwgaW5uZXJfdHlwZXMubGVuZ3RoKCkpIHsKKyAgICAgIHNpemVfdCBjb21tYV9wb3MgPSBjb21tYV9zdGFydDsKKyAgICAgIGludCBuZXN0ZWQgPSAwOworCisgICAgICB3aGlsZSAoY29tbWFfcG9zIDwgaW5uZXJfdHlwZXMubGVuZ3RoKCkpIHsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKGlubmVyX3R5cGVzW2NvbW1hX3Bvc10pIHsKKyAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgKytuZXN0ZWQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgIC0tbmVzdGVkOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICBmb3VuZCA9IChuZXN0ZWQgPT0gMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKytjb21tYV9wb3M7CisgICAgICB9CisKKyAgICAgIGlmIChuZXdfaW5uZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIG5ld19pbm5lciArPSAiLCI7CisgICAgICB9CisKKyAgICAgIHN0cmluZyBpbm5lciA9IGlubmVyX3R5cGVzLnN1YnN0cihjb21tYV9zdGFydCwgY29tbWFfcG9zIC0gY29tbWFfc3RhcnQpOworICAgICAgbmV3X2lubmVyICs9IGdldF9jYXBfbmFtZShpbm5lcik7CisgICAgICBjb21tYV9zdGFydCA9ICsrY29tbWFfcG9zOworICAgIH0KKworICAgIHJldHVybiBnZXRfY2FwX25hbWUob3V0ZXJfdHlwZSkgKyAiPCIgKyBuZXdfaW5uZXIgKyAiPiI7CisgIH0KKworICAvLyBwYWNrYWdlIG5hbWUKKyAgc2l6ZV90IGluZGV4ID0gbmFtZS5maW5kX2ZpcnN0X25vdF9vZigiIFxuXHJcdCIpOworICBpZiAoaW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7CisgICAgbmFtZVtpbmRleF0gPSB0b2xvd2VyKG5hbWVbaW5kZXhdKTsKKyAgICBpbmRleCA9IG5hbWUuZmluZCgnLicpOworICAgIHdoaWxlIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgaWYgKCsraW5kZXggPCBuYW1lLmxlbmd0aCgpKSB7CisgICAgICAgIG5hbWVbaW5kZXhdID0gdG9sb3dlcihuYW1lW2luZGV4XSk7CisgICAgICB9CisgICAgICBpbmRleCA9IG5hbWUuZmluZCgnLicsIGluZGV4KTsKKyAgICB9CisgIH0KKworICAvLyBjbGFzcyBuYW1lCisgIGluZGV4ID0gbmFtZS5yZmluZCgnLicpOworICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICArK2luZGV4OworICB9IGVsc2UgeworICAgIGluZGV4ID0gbmFtZS5maW5kX2ZpcnN0X25vdF9vZigiIFxuXHJcdCIpOworICB9CisKKyAgaWYgKGluZGV4IDwgbmFtZS5sZW5ndGgoKSkgeworICAgIG5hbWVbaW5kZXhdID0gdG91cHBlcihuYW1lW2luZGV4XSk7CisgIH0KKworICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIGNvbnN0YW50X25hbWU7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7CisKKyAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOworCisgICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKKyAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOworICAgIH0KKyAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKKyAgfQorCisgIHJldHVybiBjb25zdGFudF9uYW1lOworfQorCisvKioKKyAqIEVuYWJsZXMgUlRUSSBmb3IgYSBjbGFzcyBvciBpbnRlcmZhY2UKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24ob3N0cmVhbSYgb3V0KSB7CisgIGlmIChydHRpXykgeworICAgIG91dCA8PCAiQDpydHRpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogQWRkcyBidWlsZCBtYWNyb3MgdG8gYSBjbGFzcyBvciBpbnRlcmZhY2UKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKG9zdHJlYW0mIG91dCkgeworICBpZiAoIWJ1aWxkbWFjcm9fLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIiNpZiAhIG1hY3JvIiA8PCBlbmRsOworICAgIG91dCA8PCAiQDpidWlsZCggIiA8PCBidWlsZG1hY3JvXyA8PCAiKSIgPDwgZW5kbDsgICAgIC8vIGN1cnJlbnQgY2xhc3MvaW50ZXJmYWNlCisgICAgb3V0IDw8ICJAOmF1dG9CdWlsZCggIiA8PCBidWlsZG1hY3JvXyA8PCAiKSIgPDwgZW5kbDsgLy8gaW5oZXJpdGVkIGNsYXNzZXMvaW50ZXJmYWNlcworICAgIG91dCA8PCAiI2VuZCIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgaGF4ZURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwgIiAqL1xuIik7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIGhheGVEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfQorICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgLyomJiBwcm9ncmFtICE9IHByb2dyYW1fKi8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBoYXhlLAorICAgICJIYXhlIiwKKyAgICAiICAgIGNhbGxiYWNrcyAgICAgICAgVXNlIG9uRXJyb3IoKS9vblN1Y2Nlc3MoKSBjYWxsYmFja3MgZm9yIHNlcnZpY2UgbWV0aG9kcyAobGlrZSBBUzMpXG4iCisgICAgIiAgICBydHRpICAgICAgICAgICAgIEVuYWJsZSBAOnJ0dGkgZm9yIGdlbmVyYXRlZCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzXG4iCisgICAgIiAgICBidWlsZG1hY3JvPW15Lm1hY3Jvcy5DbGFzcy5tZXRob2QoYXJncylcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgQWRkIEA6YnVpbGQgbWFjcm8gY2FsbHMgdG8gZ2VuZXJhdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXNcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmQ0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDE3MjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogSGFza2VsbCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfaHNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfaHNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBoczoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taHMiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfdHlwZW1hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX2RlZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIG5hbWUgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgYXJnID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGFyZyA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgbmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBraXRlciwgc3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgaHNfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0cmluZyBoc19sYW5ndWFnZV9wcmFnbWEoKTsKKyAgc3RyaW5nIGhzX2ltcG9ydHMoKTsKKworICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXggPSAiIik7CisKKyAgc3RyaW5nIGZpZWxkX25hbWUoc3RyaW5nIHRuYW1lLCBzdHJpbmcgZm5hbWUpOworCisgIHN0cmluZyBmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbnMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIG1ldGhvZCA9IGZhbHNlKTsKKworICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyB0eXBlX3RvX2RlZmF1bHQodF90eXBlKiB0dHlwZSk7CisKKyAgc3RyaW5nIHJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpOworCisgIHN0cmluZyB0eXBlX3RvX2NvbnN0cnVjdG9yKHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyByZW5kZXJfaHNfdHlwZV9mb3JfZnVuY3Rpb25fbmFtZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaWZhY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY2xpZW50XzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBwbmFtZSA9IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7CisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX1R5cGVzLmhzIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX0NvbnN0cy5ocyI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIHdoZXJlIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKworICBmX2NvbnN0c18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCAibW9kdWxlICIgPDwgcG5hbWUgPDwgIl9Db25zdHMgd2hlcmUiIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8ICJpbXBvcnQgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2xhbmd1YWdlX3ByYWdtYSgpIHsKKyAgcmV0dXJuIHN0cmluZygKKyAgICAgICJ7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfVxuIgorICAgICAgInstIyBMQU5HVUFHRSBEZXJpdmVHZW5lcmljICMtfVxuIgorICAgICAgInstIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3NpbmctZmllbGRzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbWlzc2luZy1zaWduYXR1cmVzICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbmFtZS1zaGFkb3dpbmcgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtaW1wb3J0cyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLXVudXNlZC1tYXRjaGVzICMtfVxuIik7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdHJpbmcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKQorICAgICAgICAgKyAiLS0gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpICAgICAgICAgICAgICAgICAgICAgIC0tXG4iCisgICAgICAgICArICItLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuIgorICAgICAgICAgKyAiLS0gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcgLS1cbiIKKyAgICAgICAgICsgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cworICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2ltcG9ydHMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSBzdHJpbmcoCisgICAgICAiaW1wb3J0IFByZWx1ZGUgKCgkKSwgKC4pLCAoPj49KSwgKD09KSwgKCsrKSlcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFByZWx1ZGUgYXMgUFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5FeGNlcHRpb24gYXMgWFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5Nb25hZCBhcyBNICggbGlmdE0sIGFwLCB3aGVuIClcbiIKKyAgICAgICJpbXBvcnQgRGF0YS5GdW5jdG9yICggKDwkPikgKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hhYmxlIGFzIEhcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSW50IGFzIElcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuTWF5YmUgYXMgTSAoY2F0TWF5YmVzKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkuRW5jb2RpbmcgYXMgRSAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIEdIQy5HZW5lcmljcyBhcyBHIChHZW5lcmljKVxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UeXBlYWJsZSBhcyBUWSAoIFR5cGVhYmxlIClcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0XG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3JcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRlc3QuUXVpY2tDaGVjay5BcmJpdHJhcnkgYXMgUUMgKCBBcmJpdHJhcnkoLi4pIClcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRlc3QuUXVpY2tDaGVjayBhcyBRQyAoIGVsZW1lbnRzIClcbiIKKyAgICAgICJcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdCBhcyBUXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQuVHlwZXMgYXMgVFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0LkFyYml0cmFyaWVzIGFzIFRcbiIKKyAgICAgICJcbiIpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpCisgICAgcmVzdWx0ICs9ICJpbXBvcnQgcXVhbGlmaWVkICIgKyBjYXBpdGFsaXplKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfVHlwZXNcbiI7CisKKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApCisgICAgcmVzdWx0ICs9ICJcbiI7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdHJpbmcgdG5hbWUgPSBjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSk7CisgIHN0cmluZyB0ZGVmID0gcmVuZGVyX2hzX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIGZhbHNlKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAidHlwZSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRkZWYgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBpbmRlbnQoZl90eXBlc18pIDw8ICJkYXRhICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICI7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgZl90eXBlc18gPDwgKGZpcnN0ID8gIiIgOiAifCIpOworICAgIGZfdHlwZXNfIDw8IG5hbWU7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBpbmRlbnQoZl90eXBlc18pIDw8ICJkZXJpdmluZyAoUC5TaG93LCBQLkVxLCBHLkdlbmVyaWMsIFRZLlR5cGVhYmxlLCBQLk9yZCwgUC5Cb3VuZGVkKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBQLkVudW0gIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZnJvbUVudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8IG5hbWUgPDwgIiAtPiAiIDw8IHZhbHVlIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAidG9FbnVtIHQgPSBjYXNlIHQgb2YiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCB2YWx1ZSA8PCAiIC0+ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3R5cGVzXykgPDwgIl8gLT4gWC50aHJvdyBULlRocmlmdEV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBILkhhc2hhYmxlICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImhhc2hXaXRoU2FsdCBzYWx0ID0gSC5oYXNoV2l0aFNhbHQgc2FsdCBQLi4gUC5mcm9tRW51bSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBRQy5BcmJpdHJhcnkgIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiYXJiaXRyYXJ5ID0gUUMuZWxlbWVudHMgKFAuZW51bUZyb21UbyBQLm1pbkJvdW5kIFAubWF4Qm91bmQpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKKworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiIDo6ICIgPDwgcmVuZGVyX2hzX3R5cGUodHlwZSwgZmFsc2UpIDw8IGVuZGw7CisgIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgIHJldHVybiB0eXBlX3RvX2RlZmF1bHQodHlwZSk7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIG9zdHJpbmdzdHJlYW0gb3V0OworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlAuVHJ1ZSIgOiAiUC5GYWxzZSIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIigiIDw8IHZhbHVlLT5nZXRfZG91YmxlKCkgPDwgIikiOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgICAgZm9yICh2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOworICAgICAgICAgKytjX2l0ZXIpIHsKKyAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgeworICAgICAgICB0X3Byb2dyYW0qIHByb2cgPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICBpZiAocHJvZyAhPSBOVUxMICYmIHByb2cgIT0gcHJvZ3JhbV8pCisgICAgICAgICAgb3V0IDw8IGNhcGl0YWxpemUocHJvZy0+Z2V0X25hbWUoKSkgPDwgIl9UeXBlcy4iOworICAgICAgICBvdXQgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOworICAgIG91dCA8PCAiZGVmYXVsdF8iIDw8IGNuYW1lIDw8ICJ7IjsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyID0gdmFsLmJlZ2luKCk7CisgICAgICAgICB2X2l0ZXIgIT0gdmFsLmVuZCgpOworICAgICAgICAgKyt2X2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gTlVMTDsKKworICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKKyAgICAgICAgICAgKytmX2l0ZXIpCisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKQorICAgICAgICAgIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBjbmFtZSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisKKyAgICAgIHN0cmluZyBmbmFtZSA9IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIHN0cmluZyBjb25zdF92YWx1ZSA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3R5cGUoKSwgdl9pdGVyLT5zZWNvbmQpOworCisgICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCAiKTsKKyAgICAgIG91dCA8PCBmaWVsZF9uYW1lKGNuYW1lLCBmbmFtZSkgPDwgIiA9ICI7CisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8ICgodF90eXBlKilmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBjb25zdF92YWx1ZTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorCisgICAgb3V0IDw8ICJ9IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIG91dCA8PCAiKE1hcC5mcm9tTGlzdCBbIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLCIgPDwgdmFsIDw8ICIpIjsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIG91dCA8PCAiXSkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9IHR5cGUtPmlzX2xpc3QoKSA/ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpCisgICAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgWyI7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICIoVmVjdG9yLmZyb21MaXN0IFsiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorCisgICAgb3V0IDw8ICJdKSI7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgInN0cnVjdCIKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2hzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCwgYnV0IGFsc28gaGFzIGFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2hzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIEhhc2tlbGwgc3RydWN0CisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlcikgeworICAodm9pZCloZWxwZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpbmRlbnQob3V0KSA8PCAiZGF0YSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRuYW1lOworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICAgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAieyAiOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHRuYW1lLCBtbmFtZSkgPDwgIiA6OiAiOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKHRfdHlwZSopKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgIlAuTWF5YmUgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCByZW5kZXJfaHNfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCksIHRydWUpIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgb3V0IDw8ICIgZGVyaXZpbmcgKFAuU2hvdyxQLkVxLEcuR2VuZXJpYyxUWS5UeXBlYWJsZSkiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICBvdXQgPDwgImluc3RhbmNlIFguRXhjZXB0aW9uICIgPDwgdG5hbWUgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaW5zdGFuY2UgSC5IYXNoYWJsZSAiIDw8IHRuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaGFzaFdpdGhTYWx0IHNhbHQgcmVjb3JkID0gc2FsdCI7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKKyAgICAgICArK21faXRlcikgeworICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiIGBILmhhc2hXaXRoU2FsdGAgIiA8PCBmaWVsZF9uYW1lKHRuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiOworICB9CisgIGluZGVudChvdXQpIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaHNfdHlwZW1hcChvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc19kZWZhdWx0KG91dCwgdHN0cnVjdCk7Cit9CisKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImluc3RhbmNlIFFDLkFyYml0cmFyeSAiIDw8IHRuYW1lIDw8ICIgd2hlcmUgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJhcmJpdHJhcnkgPSBNLmxpZnRNICIgPDwgdG5hbWU7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICAgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgIiAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImBNLmFwYCI7CisgICAgICB9CisgICAgICBvdXQgPDwgIigiOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKHRfdHlwZSopKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgIk0ubGlmdE0gUC5KdXN0ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgIlFDLmFyYml0cmFyeSkiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBTaHJpbmsKKyAgICBpbmRlbnQob3V0KSA8PCAic2hyaW5rIG9iaiB8IG9iaiA9PSBkZWZhdWx0XyIgPDwgdG5hbWUgPDwgIiA9IFtdIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgICAgICAgIHwgUC5vdGhlcndpc2UgPSBNLmNhdE1heWJlcyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICAgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiWyAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBmbmFtZSA9IGZpZWxkX25hbWUodG5hbWUsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBvdXQgPDwgImlmIG9iaiA9PSBkZWZhdWx0XyIgPDwgdG5hbWU7CisgICAgICBvdXQgPDwgInsiIDw8IGZuYW1lIDw8ICIgPSAiIDw8IGZuYW1lIDw8ICIgb2JqfSAiOworICAgICAgb3V0IDw8ICJ0aGVuIFAuTm90aGluZyAiOworICAgICAgb3V0IDw8ICJlbHNlIFAuSnVzdCAkIGRlZmF1bHRfIiA8PCB0bmFtZTsKKyAgICAgIG91dCA8PCAieyIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgZm5hbWUgPDwgIiBvYmp9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiXSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeyAvKiAwID09IG1lbWJlcnMuc2l6ZSgpICovCisgICAgaW5kZW50KG91dCkgPDwgImFyYml0cmFyeSA9IFFDLmVsZW1lbnRzIFsiIDw8IHRuYW1lIDw8ICJdIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisKKyAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiA6OiBULlRocmlmdFZhbCAtPiAiIDw8IHNuYW1lIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0b18iIDw8IHNuYW1lIDw8ICIgKFQuVFN0cnVjdCBmaWVsZHMpID0gIiA8PCBzbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBzdHJpbmcgZXR5cGUgPSB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBGaWxsIGluIEZpZWxkCisgICAgaW5kZW50KG91dCkgPDwgZmllbGRfbmFtZShzbmFtZSwgZm5hbWUpIDw8ICIgPSAiOworCisgICAgb3V0IDw8ICJQLm1heWJlICgiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgIlAuZXJyb3IgXCJNaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiAiIDw8IGZuYW1lIDw8ICJcIiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgJiYgKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSBOVUxMKSB7CisgICAgICAgIG91dCA8PCAiUC5Ob3RoaW5nIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHNuYW1lLCBmbmFtZSkgPDwgIiBkZWZhdWx0XyIgPDwgc25hbWU7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiKSAiOworCisgICAgb3V0IDw8ICIoXFwoXywiIDw8IHZhbCA8PCAiKSAtPiAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQorICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHZhbCk7CisgICAgb3V0IDw8ICIpIjsKKyAgICBvdXQgPDwgIiAoTWFwLmxvb2t1cCAoIiA8PCBrZXkgPDwgIikgZmllbGRzKSI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gcmVhZAorICBzdHJpbmcgdG1hcCA9IHR5cGVfbmFtZSh0c3RydWN0LCAidHlwZW1hcF8iKTsKKyAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiBfID0gUC5lcnJvciBcIm5vdCBhIHN0cnVjdFwiIiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIiA6OiBULlByb3RvY29sIHAgPT4gcCAtPiBQLklPICIgPDwgc25hbWUKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIGlwcm90ID0gdG9fIiA8PCBzbmFtZTsKKyAgb3V0IDw8ICIgPCQ+IFQucmVhZFZhbCBpcHJvdCAoVC5UX1NUUlVDVCAiIDw8IHRtYXAgPDwgIikiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImRlY29kZV8iIDw8IHNuYW1lCisgICAgICAgICAgICAgIDw8ICIgOjogVC5TdGF0ZWxlc3NQcm90b2NvbCBwID0+IHAgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gIiA8PCBzbmFtZSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZGVjb2RlXyIgPDwgc25hbWUgPDwgIiBpcHJvdCBicyA9IHRvXyIgPDwgc25hbWUgPDwgIiAkICI7CisgIG91dCA8PCAiVC5kZXNlcmlhbGl6ZVZhbCBpcHJvdCAoVC5UX1NUUlVDVCAiIDw8IHRtYXAgPDwgIikgYnMiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKKyAgc3RyaW5nIGYgPSB0bXAoIl9mIik7CisgIHN0cmluZyB2ID0gdG1wKCJfdiIpOworCisgIGluZGVudChvdXQpIDw8ICJmcm9tXyIgPDwgbmFtZSA8PCAiIDo6ICIgPDwgbmFtZSA8PCAiIC0+IFQuVGhyaWZ0VmFsIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiByZWNvcmQgPSBULlRTdHJ1Y3QgJCBNYXAuZnJvbUxpc3QgIjsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2V0IEV4Y2VwdGlvbnMKKyAgYm9vbCBoYXNFeG4gPSBmYWxzZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGhhc0V4biA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBib29sIGlzZmlyc3QgPSB0cnVlOworICBpZiAoaGFzRXhuKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgZXhucyA9IE0uY2F0TWF5YmVzICI7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsKKyAgICAgICAgICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgaWYgKGlzZmlyc3QpIHsKKyAgICAgICAgICBvdXQgPDwgIlsgIjsKKyAgICAgICAgICBpc2ZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgICAgICBvdXQgPDwgIihcXCIgPDwgdiA8PCAiIC0+ICgiIDw8IGtleSA8PCAiLCAoXCIiIDw8IG1uYW1lIDw8ICJcIiwiOworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgdik7CisgICAgICAgIG91dCA8PCAiKSkpIDwkPiAiIDw8IGZpZWxkX25hbWUobmFtZSwgbW5hbWUpIDw8ICIgcmVjb3JkIjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpc2ZpcnN0KSB7CisgICAgICBvdXQgPDwgIl0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImluIGlmIFAubm90IChQLm51bGwgZXhucykgdGhlbiBleG5zIGVsc2UgIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiQgIjsKKyAgfQorCisgIG91dCA8PCAiTS5jYXRNYXliZXMiIDw8IGVuZGw7CisgIC8vIEdldCB0aGUgUmVzdAorICBpc2ZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpZiAoaXNmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlsgIjsKKyAgICAgIGlzZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKKyAgICB9CisgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgb3V0IDw8ICIoXFwiOworICAgIG91dCA8PCB2IDw8ICIgLT4gIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAmJiAhKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIG91dCA8PCAiUC5KdXN0ICI7CisgICAgfQorICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIChcIiIgPDwgbW5hbWUgPDwgIlwiLCI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCAoKmZfaXRlciktPmdldF90eXBlKCksIHYpOworICAgIG91dCA8PCAiKSkpICI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgJiYgISgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIiQiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIjwkPiI7CisgICAgfQorICAgIG91dCA8PCAiICIgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiIDw8IGVuZGw7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpZiAoaXNmaXJzdCkgeworICAgIGluZGVudChvdXQpIDw8ICJbXSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiXSIgPDwgZW5kbDsKKyAgfQorICBpZiAoaGFzRXhuKSB7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIC8vIHdyaXRlCisgIGluZGVudChvdXQpIDw8ICJ3cml0ZV8iIDw8IG5hbWUgPDwgIiA6OiBULlByb3RvY29sIHAgPT4gcCAtPiAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgPDwgIiAtPiBQLklPICgpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAid3JpdGVfIiA8PCBuYW1lIDw8ICIgb3Byb3QgcmVjb3JkID0gVC53cml0ZVZhbCBvcHJvdCAkIGZyb21fIjsKKyAgb3V0IDw8IG5hbWUgPDwgIiByZWNvcmQiIDw8IGVuZGw7CisKKyAgLy8gZW5jb2RlCisgIGluZGVudChvdXQpIDw8ICJlbmNvZGVfIiA8PCBuYW1lIDw8ICIgOjogVC5TdGF0ZWxlc3NQcm90b2NvbCBwID0+IHAgLT4gIiA8PCBuYW1lCisgICAgICAgICAgICAgIDw8ICIgLT4gTEJTLkJ5dGVTdHJpbmciIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJlbmNvZGVfIiA8PCBuYW1lIDw8ICIgb3Byb3QgcmVjb3JkID0gVC5zZXJpYWxpemVWYWwgb3Byb3QgJCAiOworICBvdXQgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgcmVjb3JkIiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIuaHMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IHF1YWxpZmllZCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSBhcyBJZmFjZSIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQorICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIC0tIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmaWVsZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgInJlc3VsdCIpKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBtYXAgZnJvbSBmaWVsZCBuYW1lcyB0byAodHlwZSwgaWQpCisgKiBAcGFyYW0gdHN0cnVjdCB0aGUgU3RydWN0CisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3R5cGVtYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInR5cGVtYXBfIiA8PCBuYW1lIDw8ICIgOjogVC5UeXBlTWFwIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHlwZW1hcF8iIDw8IG5hbWUgPDwgIiA9IE1hcC5mcm9tTGlzdCBbIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIG91dCA8PCAiLCI7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwoXCIiIDw8IG1uYW1lIDw8ICJcIiwiIDw8IHR5cGVfdG9fZW51bSh0eXBlKSA8PCAiKSkiOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8ICJdIiA8PCBlbmRsOworfQorCisvKioKKyAqIGdlbmVyYXRlIHRoZSBzdHJ1Y3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyBmaWxsZWQgaW4KKyAqIEBwYXJhbSB0c3RydWN0IHRoZSBTdHJ1Y3QKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfZGVmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgZm5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgImRlZmF1bHRfIik7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8IGZuYW1lIDw8ICIgOjogIiA8PCBuYW1lIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGZuYW1lIDw8ICIgPSAiIDw8IG5hbWUgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiID0gIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgb3V0IDw8ICJQLk5vdGhpbmciOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJQLkp1c3QgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKKyAgICB9CisgIH0KKyAgb3V0IDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfaWZhY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIl9JZmFjZS5ocyI7CisgIGZfaWZhY2VfLm9wZW4oZl9pZmFjZV9uYW1lLmNfc3RyKCkpOworCisgIGZfaWZhY2VfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfaWZhY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9pZmFjZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSB3aGVyZSIgPDwgZW5kbDsKKworICBmX2lmYWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9pZmFjZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKKyAgZl9pZmFjZV8gPDwgZW5kbDsKKworICBzdHJpbmcgc25hbWUgPSBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKworICAgIGluZGVudChmX2lmYWNlXykgPDwgImltcG9ydCAiIDw8IGV4dGVuZHMgPDwgIl9JZmFjZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IGV4dGVuZHMgPDwgIl9JZmFjZSBhID0+ICIgPDwgc25hbWUgPDwgIl9JZmFjZSBhIHdoZXJlIiA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiY2xhc3MgIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIHRydWUsIHRydWUpOworICAgIGluZGVudChmX2lmYWNlXykgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6OiBhIC0+ICIgPDwgZnQgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfaWZhY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIEhhc2tlbGwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuCisgKlRoaXMgaXMgYmVjYXVzZQorICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb3RoaW5nLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfY2xpZW50X25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJfQ2xpZW50LmhzIjsKKyAgZl9jbGllbnRfLm9wZW4oZl9jbGllbnRfbmFtZS5jX3N0cigpKTsKKyAgZl9jbGllbnRfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfY2xpZW50XyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHBvcnRzID0gIiI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZXhwb3J0cyArPSAoZmlyc3QgPyAiIiA6ICIsIik7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgZXhwb3J0cyArPSBkZWNhcGl0YWxpemUoZnVubmFtZSk7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorCisgIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7CisgIGluZGVudChmX2NsaWVudF8pIDw8ICJtb2R1bGUgIiA8PCBzbmFtZSA8PCAiX0NsaWVudCgiIDw8IGV4cG9ydHMgPDwgIikgd2hlcmUiIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0NsaWVudCIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSU9SZWYgYXMgUiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7CisgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7CisgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGw7CisKKyAgLy8gREFUUyBSSVRFIEEgR0xPQkFMIFZBUgorICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxaWQgPSBSLm5ld0lPUmVmIDAiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgc3RyaW5nIGZhcmdzID0gIiI7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpCisgICAgICBmYXJncyArPSAiIGFyZ18iICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgZGVjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgKGlwLG9wKSIgPDwgZmFyZ3MgPDwgIiA9IGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiIG9wIiA8PCBmYXJnczsKKworICAgIGZfY2xpZW50XyA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKQorICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIgaXAiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXEgPC0gc2VxaWQiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcW4gPC0gUi5yZWFkSU9SZWYgc2VxIiA8PCBlbmRsOworICAgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBtc2dUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJULk1fT05FV0FZIiA6ICJULk1fQ0FMTCI7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlQud3JpdGVNZXNzYWdlIG9wIChcIiIgPDwgZm5hbWUgPDwgIlwiLCAiIDw8IG1zZ1R5cGUgPDwgIiwgc2VxbikgJCIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJ3cml0ZV8iIDw8IGFyZ3NuYW1lIDw8ICIgb3AgKCIgPDwgYXJnc25hbWUgPDwgInsiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7CisgICAgICAgICArK2ZsZF9pdGVyKSB7CisgICAgICBzdHJpbmcgZmllbGRuYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBmX2NsaWVudF8gPDwgKGZpcnN0ID8gIiIgOiAiLCIpOworICAgICAgZl9jbGllbnRfIDw8IGZpZWxkX25hbWUoYXJnc25hbWUsIGZpZWxkbmFtZSkgPDwgIj0iOworICAgICAgaWYgKCgqZmxkX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgodF90eXBlKikoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpCisgICAgICAgIGZfY2xpZW50XyA8PCAiUC5KdXN0ICI7CisgICAgICBmX2NsaWVudF8gPDwgImFyZ18iIDw8IGZpZWxkbmFtZTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGZfY2xpZW50XyA8PCAifSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHN0cmluZyBmdW5uYW1lID0gc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgZnVubmFtZSwgJm5vYXJncyk7CisKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8IGZ1bm5hbWUgPDwgIiBpcCA9IGRvIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULnJlYWRNZXNzYWdlIGlwICQgXFwoZm5hbWUsIG10eXBlLCByc2VxaWQpIC0+IGRvIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiTS53aGVuIChtdHlwZSA9PSBULk1fRVhDRVBUSU9OKSAkIGRvIHsgZXhuIDwtIFQucmVhZEFwcEV4biBpcCA7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLnRocm93IGV4biB9IiA8PCBlbmRsOworCisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVzIDwtIHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXAiIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7CisgICAgICAgICAgICsreF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLm1heWJlIChQLnJldHVybiAoKSkgWC50aHJvdyAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiByZXMpIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5yZXR1cm4gJCAiIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiIHJlcyIgPDwgZW5kbDsKKyAgICAgIGVsc2UKKyAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAucmV0dXJuICgpIiA8PCBlbmRsOworCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgZl9jbGllbnRfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpID0gY2FzZSBuYW1lIG9mIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlwiIiA8PCBmbmFtZSA8PCAiXCIgLT4gcHJvY2Vzc18iIDw8IGRlY2FwaXRhbGl6ZShmbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAoc2VxaWQsaXByb3Qsb3Byb3QsaGFuZGxlcikiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl8gLT4gIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkKKyAgICAgICAgICAgICAgIDw8ICIucHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkiIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl8gPC0gVC5yZWFkVmFsIGlwcm90IChULlRfU1RSVUNUIE1hcC5lbXB0eSkiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAobmFtZSxULk1fRVhDRVBUSU9OLHNlcWlkKSAkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZUFwcEV4biBvcHJvdCAoVC5BcHBFeG4gVC5BRV9VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiICsrIExULnVucGFjayBuYW1lKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2VzcyBoYW5kbGVyIChpcHJvdCwgb3Byb3QpID0gZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC5yZWFkTWVzc2FnZSBpcHJvdCAoIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpKSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiBQLlRydWUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK2Jvb2wgaGFzTm9Bcmd1bWVudHModF9mdW5jdGlvbiogZnVuYykgeworICByZXR1cm4gKGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSk7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2hzX3R5cGVfZm9yX2Z1bmN0aW9uX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyB0eXBlX3N0ciA9IHJlbmRlcl9oc190eXBlKHR5cGUsIGZhbHNlKTsKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBmb3VuZCA9IC0xOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgZm91bmQgPSB0eXBlX3N0ci5maW5kX2ZpcnN0X29mKCJbXS4gIiwgZm91bmQgKyAxKTsKKyAgICBpZiAoc3RyaW5nOjpucG9zID09IHNpemVfdChmb3VuZCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0eXBlX3N0cltmb3VuZF0gPT0gJy4nKQorICAgICAgdHlwZV9zdHJbZm91bmRdID0gJ18nOworICAgIGVsc2UKKyAgICAgIHR5cGVfc3RyW2ZvdW5kXSA9ICdaJzsKKyAgfQorICByZXR1cm4gdHlwZV9zdHI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgc3RyaW5nIGZ1bm5hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzXyIgPDwgZnVubmFtZSA8PCAiIChzZXFpZCwgaXByb3QsIG9wcm90LCBoYW5kbGVyKSA9IGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncyA8LSByZWFkXyIgPDwgYXJnc25hbWUgPDwgIiBpcHJvdCIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBzaXplX3QgbiA9IHhjZXB0aW9ucy5zaXplKCkgKyAxOworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmIChuID4gMCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIihYLmNhdGNoIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICB9CisKKyAgaWYgKG4gPiAwKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgZl9zZXJ2aWNlXyA8PCAidmFsIDwtICI7CisKKyAgZl9zZXJ2aWNlXyA8PCAiSWZhY2UuIiA8PCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiIGhhbmRsZXIiOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICBmX3NlcnZpY2VfIDw8ICIgKCIgPDwgZmllbGRfbmFtZShhcmdzbmFtZSwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIGFyZ3MpIjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lIDw8ICJ7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICJzdWNjZXNzIikgPDwgIiA9IHZhbH0iOworCisgIH0gZWxzZSBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWU7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9SRVBMWSwgc2VxaWQpICQiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZV8iIDw8IHJlc3VsdG5hbWUgPDwgIiBvcHJvdCByZXMiOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgaWYgKG4gPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKG4gPiAwKSB7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFxcZSAgLT4gZG8iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lIDw8ICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSBQLkp1c3QgZX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9SRVBMWSwgc2VxaWQpICQiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlXyIgPDwgcmVzdWx0bmFtZSA8PCAiIG9wcm90IHJlcyI7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKFxcXyAtPiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX0VYQ0VQVElPTiwgc2VxaWQpICQiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZUFwcEV4biBvcHJvdCAoVC5BcHBFeG4gVC5BRV9VTktOT1dOIFwiXCIpIjsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgIikgOjogWC5Tb21lRXhjZXB0aW9uIC0+IFAuSU8gKCkpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpcHJlZml4OworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlLCBwcmVmaXgpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgYXJnKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIG91dCA8PCAiKGNhc2UgIiA8PCBhcmcgPDwgIiBvZiB7IiA8PCB0eXBlX3RvX2NvbnN0cnVjdG9yKHR5cGUpIDw8ICIgIiA8PCB2YWwgPDwgIiAtPiAiOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCB2YWwpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCB2YWwpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAiRS5kZWNvZGVVdGY4ICI7CisgICAgfQorICAgIG91dCA8PCB2YWw7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAvLyBTaW5jZSB3aXJlIHR5cGUgb2YgYmluYXJ5IGlzIHRoZSBzYW1lIGFzIHN0cmluZywgd2UgYWN0dWFsbHkgcmVjZWl2ZSBULlRTdHJpbmcgbm90CisgICAgICAvLyBULlRCaW5hcnkKKyAgICAgIG91dCA8PCAiOyBULlRTdHJpbmcgIiA8PCB2YWwgPDwgIiAtPiAiIDw8IHZhbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8ICJQLnRvRW51bSAkIFAuZnJvbUludGVncmFsICIgPDwgdmFsOworCisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBUWVBFICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIG91dCA8PCAiOyBfIC0+IFAuZXJyb3IgXCJ3cm9uZyB0eXBlXCJ9KSI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSkgeworCisgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJ0b18iKSA8PCAiIChULlRTdHJ1Y3QgIiA8PCBuYW1lIDw8ICIpKSI7Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcpIHsKKworICBzdHJpbmcgdmFsID0gdG1wKCJfdiIpOworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBrZXkgPSB0bXAoIl9rIik7CisgICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0ICQgUC5tYXAgKFxcKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikgLT4gKCI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIGtleSk7CisKKyAgICBvdXQgPDwgIiwiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgICAgb3V0IDw8ICIpKSAiIDw8IGFyZyA8PCAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpOworICAgIG91dCA8PCAiKSAiIDw8IGFyZyA8PCAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8ICIoVmVjdG9yLmZyb21MaXN0ICQgUC5tYXAgKFxcIiA8PCB2YWwgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHZhbCk7CisgICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBuYW1lKSB7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgb3V0IDw8IHR5cGVfdG9fY29uc3RydWN0b3IodHlwZSkgPDwgIiAiOworICAgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICIkIEUuZW5jb2RlVXRmOCAiOworICAgICAgfQorICAgICAgb3V0IDw8IG5hbWU7CisKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICAgIG91dCA8PCAiVC5USTMyICQgUC5mcm9tSW50ZWdyYWwgJCBQLmZyb21FbnVtICIgPDwgbmFtZTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCBPRiBUWVBFICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCwgImZyb21fIikgPDwgIiAiIDw8IHByZWZpeDsKK30KKwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGsgPSB0bXAoIl9rIik7CisgIHN0cmluZyB2ID0gdG1wKCJfdiIpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIlQuVE1hcCAiIDw8IHR5cGVfdG9fZW51bShrdHlwZSkgPDwgIiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSk7CisgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwoIiA8PCBrIDw8ICIsIiA8PCB2IDw8ICIpIC0+ICgiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwga3R5cGUsIGspOworICAgIG91dCA8PCAiLCAiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgdnR5cGUsIHYpOworICAgIG91dCA8PCAiKSkgJCBNYXAudG9MaXN0ICIgPDwgcHJlZml4OworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8ICJULlRTZXQgIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIG91dCA8PCAiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2KTsKKyAgICBvdXQgPDwgIikgJCBTZXQudG9MaXN0ICIgPDwgcHJlZml4OworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCAiVC5UTGlzdCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIG91dCA8PCAiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdik7CisgICAgb3V0IDw8ICIpICQgVmVjdG9yLnRvTGlzdCAiIDw8IHByZWZpeDsKKyAgfQorfQorCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucywgYm9vbCBpbywgYm9vbCBtZXRob2QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQorICAgICAgcmVzdWx0ICs9ICJQLk1heWJlICI7CisgICAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgb3B0aW9ucyk7CisgICAgcmVzdWx0ICs9ICIgLT4gIjsKKyAgfQorCisgIGlmIChmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKQorICAgIHJlc3VsdCArPSAiKCkgLT4gIjsKKworICBpZiAoaW8pCisgICAgcmVzdWx0ICs9ICJQLklPICI7CisKKyAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCBpbyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIHN0cmluZyBmdW5jdGlvbl9wcmVmaXgpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKQorICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfVHlwZXMuIjsKKworICByZXR1cm4gcHJlZml4ICsgZnVuY3Rpb25fcHJlZml4ICsgY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6ZmllbGRfbmFtZShzdHJpbmcgdG5hbWUsIHN0cmluZyBmbmFtZSkgeworICByZXR1cm4gZGVjYXBpdGFsaXplKHRuYW1lKSArICJfIiArIGZuYW1lOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJULlRfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gdHlwZS0+aXNfYmluYXJ5KCkgPyAiVC5UX0JJTkFSWSIgOiAiVC5UX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJULlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVC5UX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJULlRfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVC5UX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlQuVF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJULlRfRE9VQkxFIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQuVF9JMzIiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKFQuVF9TVFJVQ1QgIiArIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUsICJ0eXBlbWFwXyIpICsgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga3R5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBzdHJpbmcgdnR5cGUgPSB0eXBlX3RvX2VudW0oKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICByZXR1cm4gIihULlRfTUFQICIgKyBrdHlwZSArICIgIiArIHZ0eXBlICsgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIihULlRfU0VUICIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIihULlRfTElTVCAiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGRlZmF1bHQgdmFsdWUKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2RlZmF1bHQodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJQLmVycm9yIFwiTm8gZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZSBUX1ZPSURcIiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlwiXCIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUC5GYWxzZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIjAiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiKFAudG9FbnVtIDApIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSwgImRlZmF1bHRfIik7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiTWFwLmVtcHR5IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJTZXQuZW1wdHkiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJWZWN0b3IuZW1wdHkiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2RlZmF1bHQ6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIGhhc2tlbGwgdHlwZQorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9oc190eXBlKHRfdHlwZSogdHlwZSwgYm9vbCBuZWVkc19wYXJlbnMpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0cmluZyB0eXBlX3JlcHI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIigpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAodHlwZS0+aXNfYmluYXJ5KCkgPyAiTEJTLkJ5dGVTdHJpbmciIDogIkxULlRleHQiKTsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlAuQm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiSS5JbnQ4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiSS5JbnQxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIkkuSW50MzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJJLkludDY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiUC5Eb3VibGUiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUoKHRfZW51bSopdHlwZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgdHlwZV9yZXByID0gIk1hcC5IYXNoTWFwICIgKyByZW5kZXJfaHNfdHlwZShrdHlwZSwgdHJ1ZSkgKyAiICIgKyByZW5kZXJfaHNfdHlwZSh2dHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHR5cGVfcmVwciA9ICJTZXQuSGFzaFNldCAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHR5cGVfcmVwciA9ICJWZWN0b3IuVmVjdG9yICIgKyByZW5kZXJfaHNfdHlwZShldHlwZSwgdHJ1ZSk7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gbmVlZHNfcGFyZW5zID8gIigiICsgdHlwZV9yZXByICsgIikiIDogdHlwZV9yZXByOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgaGFza2VsbCBjb25zdHJ1Y3RvcgorICovCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fY29uc3RydWN0b3IodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImludmFsaWQgdHlwZTogVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiB0eXBlLT5pc19iaW5hcnkoKSA/ICJULlRCaW5hcnkiIDogIlQuVFN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJULlRCb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJULlRCeXRlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVC5USTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVC5USTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVC5USTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVC5URG91YmxlIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlQuVEkzMiI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJULlRTdHJ1Y3QiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlQuVE1hcCBfIF8iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlQuVFNldCBfIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVC5UTGlzdCBfIjsKKyAgfQorICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoaHMsICJIYXNrZWxsIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGZhMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEwODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2VudW0gaW5wdXRfdHlwZSB7IElOUFVUX1VOS05PV04sIElOUFVUX1VURjgsIElOUFVUX1BMQUlOIH07CisKKy8qKgorICogSFRNTCBjb2RlIGdlbmVyYXRvcgorICoKKyAqIG1vc3RseSBjb3B5L3Bhc3RpbmcvdHdlYWtpbmcgZnJvbSBtY3NsZWUncyB3b3JrLgorICovCitjbGFzcyB0X2h0bWxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9odG1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgc3RhbmRhbG9uZV8gPSBmYWxzZTsKKyAgICB1bnNhZmVfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic3RhbmRhbG9uZSIpID09IDApIHsKKyAgICAgICAgc3RhbmRhbG9uZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub2VzY2FwZSIpID09IDApIHsKKyAgICAgICAgdW5zYWZlXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gaHRtbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1odG1sIjsKKyAgICBpbnB1dF90eXBlXyA9IElOUFVUX1VOS05PV047CisKKyAgICBlc2NhcGVfLmNsZWFyKCk7CisgICAgZXNjYXBlX1snJiddID0gIiZhbXA7IjsKKyAgICBlc2NhcGVfWyc8J10gPSAiJmx0OyI7CisgICAgZXNjYXBlX1snPiddID0gIiZndDsiOworICAgIGVzY2FwZV9bJyInXSA9ICImcXVvdDsiOworICAgIGVzY2FwZV9bJ1wnJ10gPSAiJmFwb3M7IjsKKworICAgIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7CisgIH0KKworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCk7CisgIHZvaWQgZ2VuZXJhdGVfaW5kZXgoKTsKKyAgc3RkOjpzdHJpbmcgZXNjYXBlX2h0bWwoc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7CisgIHN0ZDo6c3RyaW5nIGVzY2FwZV9odG1sX3RhZ3Moc3RkOjpzdHJpbmcgY29uc3QmIHN0cik7CisgIHZvaWQgZ2VuZXJhdGVfY3NzKCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoc3RkOjpvc3RyZWFtJiBmX3RhcmdldCk7CisgIHZvaWQgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIG5hbWUpOworICBib29sIGlzX3V0Zjhfc2VxdWVuY2Uoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKTsKKyAgdm9pZCBkZXRlY3RfaW5wdXRfZW5jb2Rpbmcoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKTsKKyAgdm9pZCBpbml0X2FsbG93ZWRfX21hcmt1cCgpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworCisgIHZvaWQgcHJpbnRfZG9jKHRfZG9jKiB0ZG9jKTsKKyAgaW50IHByaW50X3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworICB2b2lkIHByaW50X2ZuX2FyZ3NfZG9jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKK3ByaXZhdGU6CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9vdXRfOworICBzdGQ6OnN0cmluZyBjdXJyZW50X2ZpbGVfOworICBpbnB1dF90eXBlIGlucHV0X3R5cGVfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBhbGxvd2VkX21hcmt1cDsKKyAgYm9vbCBzdGFuZGFsb25lXzsKKyAgYm9vbCB1bnNhZmVfOworfTsKKworLyoqCisgKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jKCkgeworICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgIgorICAgICAgICAgICAgInRhYmxlLWNvbmRlbnNlZFwiPjx0aGVhZD48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPiIKKyAgICAgICAgIDw8ICI8dGg+RGF0YSB0eXBlczwvdGg+PHRoPkNvbnN0YW50czwvdGg+PC90aGVhZD4iIDw8IGVuZGw7CisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyhwcm9ncmFtXyk7CisgIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVjdXJzZXMgdGhyb3VnaCBmcm9tIHRoZSBwcm92aWRlZCBwcm9ncmFtIGFuZCBnZW5lcmF0ZXMgYSBUb0Mgcm93CisgKiBmb3IgZWFjaCBkaXNjb3ZlcmVkIHByb2dyYW0gZXhhY3RseSBvbmNlIGJ5IG1haW50YWluaW5nIHRoZSBsaXN0IG9mCisgKiBjb21wbGV0ZWQgcm93cyBpbiAnZmluaXNoZWQnCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyh0X3Byb2dyYW0qIHRwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBmaW5pc2hlZCkgeworICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGZpbmlzaGVkLmJlZ2luKCk7IGl0ZXIgIT0gZmluaXNoZWQuZW5kKCk7IGl0ZXIrKykgeworICAgIGlmICh0cHJvZy0+Z2V0X3BhdGgoKSA9PSAoKml0ZXIpLT5nZXRfcGF0aCgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZpbmlzaGVkLnB1c2hfYmFjayh0cHJvZyk7CisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0cHJvZyk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHRwcm9nLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOyBpdGVyKyspIHsKKyAgICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKCppdGVyLCBmaW5pc2hlZCk7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyB0aGUgVGFibGUgb2YgQ29udGVudHMgbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJ3MgcGFnZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0X3Byb2dyYW0qIHRwcm9nKSB7CisgIHN0cmluZyBmbmFtZSA9IHRwcm9nLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKKyAgZl9vdXRfIDw8ICI8dHI+IiA8PCBlbmRsIDw8ICI8dGQ+IiA8PCB0cHJvZy0+Z2V0X25hbWUoKSA8PCAiPC90ZD48dGQ+IjsKKyAgaWYgKCF0cHJvZy0+Z2V0X3NlcnZpY2VzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHRwcm9nLT5nZXRfc2VydmljZXMoKTsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgICAgZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNTdmNfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgICAgICAgICA8PCAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgZl9vdXRfIDw8ICI8dWw+IiA8PCBlbmRsOworICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiBmbl9odG1sOworICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSAoKnN2X2l0ZXIpLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyOworICAgICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKKyAgICAgICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBzdHJpbmcgaHRtbCA9ICI8bGk+PGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0ZuXyIgKyBuYW1lICsgIl8iICsgZm5fbmFtZQorICAgICAgICAgICAgICAgICAgICAgICsgIlwiPiIgKyBmbl9uYW1lICsgIjwvYT48L2xpPiI7CisgICAgICAgIGZuX2h0bWwuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KGZuX25hbWUsIGh0bWwpKTsKKyAgICAgIH0KKyAgICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaHRtbF9pdGVyID0gZm5faHRtbC5iZWdpbigpOyBodG1sX2l0ZXIgIT0gZm5faHRtbC5lbmQoKTsKKyAgICAgICAgICAgaHRtbF9pdGVyKyspIHsKKyAgICAgICAgZl9vdXRfIDw8IGh0bWxfaXRlci0+c2Vjb25kIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIjwvdWw+IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+IjsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBkYXRhX3R5cGVzOworICBpZiAoIXRwcm9nLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gdHByb2ctPmdldF9lbnVtcygpOworICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCplbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjRW51bV8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQorICAgICAgLy8gPDwgICI8L2E+PGJyLz4iIDw8IGVuZGw7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjRW51bV8iICsgbmFtZSArICJcIj4iICsgbmFtZSArICI8L2E+IjsKKyAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKKyAgICB9CisgIH0KKyAgaWYgKCF0cHJvZy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHRwcm9nLT5nZXRfdHlwZWRlZnMoKTsKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7CisgICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqdGRfaXRlciktPmdldF9zeW1ib2xpYygpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNUeXBlZGVmXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCisgICAgICAvLyA8PCAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI1R5cGVkZWZfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPiI7CisgICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICB9CisgIGlmICghdHByb2ctPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSB0cHJvZy0+Z2V0X29iamVjdHMoKTsKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpvX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgIC8vPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNTdHJ1Y3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPiI7CisgICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICB9CisgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgZHRfaXRlciA9IGRhdGFfdHlwZXMuYmVnaW4oKTsgZHRfaXRlciAhPSBkYXRhX3R5cGVzLmVuZCgpOworICAgICAgIGR0X2l0ZXIrKykgeworICAgIGZfb3V0XyA8PCBkdF9pdGVyLT5zZWNvbmQgPDwgIjxici8+IiA8PCBlbmRsOworICB9CisgIGZfb3V0XyA8PCAiPC90ZD4iIDw8IGVuZGwgPDwgIjx0ZD4iOworICBpZiAoIXRwcm9nLT5nZXRfY29uc3RzKCkuZW1wdHkoKSkgeworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gY29uc3RfaHRtbDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHRwcm9nLT5nZXRfY29uc3RzKCk7CisgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY29uX2l0ZXI7CisgICAgZm9yIChjb25faXRlciA9IGNvbnN0cy5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY29uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjb25faXRlciktPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8Y29kZT48YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjQ29uc3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiPC9hPjwvY29kZT4iOworICAgICAgY29uc3RfaHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOworICAgIH0KKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGNvbl9pdGVyID0gY29uc3RfaHRtbC5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdF9odG1sLmVuZCgpOworICAgICAgICAgY29uX2l0ZXIrKykgeworICAgICAgZl9vdXRfIDw8IGNvbl9pdGVyLT5zZWNvbmQgPDwgIjxici8+IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX291dF8gPDwgIjwvY29kZT48L3RkPiIgPDwgZW5kbCA8PCAiPC90cj4iOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW0uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIGN1cnJlbnRfZmlsZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuaHRtbCI7CisgIHN0cmluZyBmbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjdXJyZW50X2ZpbGVfOworICBmX291dF8ub3BlbihmbmFtZS5jX3N0cigpKTsKKyAgZl9vdXRfIDw8ICI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIiA8PCBlbmRsOworICBmX291dF8gPDwgIiAgICBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGRcIj4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxoZWFkPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04XCIgLz4iIDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0eWxlX3RhZygpOworICBmX291dF8gPDwgIjx0aXRsZT5UaHJpZnQgbW9kdWxlOiAiIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICI8L3RpdGxlPjwvaGVhZD48Ym9keT4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPGgxPlRocmlmdCBtb2R1bGU6ICIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIjwvaDE+IiA8PCBlbmRsOworCisgIHByaW50X2RvYyhwcm9ncmFtXyk7CisKKyAgZ2VuZXJhdGVfcHJvZ3JhbV90b2MoKTsKKworICBpZiAoIXByb2dyYW1fLT5nZXRfY29uc3RzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJDb25zdGFudHNcIj5Db25zdGFudHM8L2gyPiIgPDwgZW5kbDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPkNvbnN0YW50PC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKKyAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKKyAgfQorCisgIGlmICghcHJvZ3JhbV8tPmdldF9lbnVtcygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiRW51bWVyYXRpb25zXCI+RW51bWVyYXRpb25zPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgZW51bXMKKyAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgICAgfQorICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJUeXBlZGVmc1wiPlR5cGUgZGVjbGFyYXRpb25zPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgICAgfQorICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X29iamVjdHMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlN0cnVjdHNcIj5EYXRhIHN0cnVjdHVyZXM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzIGFuZCBleGNlcHRpb25zIGluIGRlY2xhcmVkIG9yZGVyCisgICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOworICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIXByb2dyYW1fLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlNlcnZpY2VzXCI+U2VydmljZXM8L2gyPiIgPDwgZW5kbDsKKyAgICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgICB9CisgIH0KKworICBmX291dF8gPDwgIjwvZGl2PjwvYm9keT48L2h0bWw+IiA8PCBlbmRsOworICBmX291dF8uY2xvc2UoKTsKKworICBnZW5lcmF0ZV9pbmRleCgpOworICBnZW5lcmF0ZV9jc3MoKTsKK30KKworLyoqCisgKiBFbWl0cyB0aGUgaW5kZXguaHRtbCBmaWxlIGZvciB0aGUgcmVjdXJzaXZlIHNldCBvZiBUaHJpZnQgcHJvZ3JhbXMKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pbmRleCgpIHsKKyAgY3VycmVudF9maWxlXyA9ICJpbmRleC5odG1sIjsKKyAgc3RyaW5nIGluZGV4X2ZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87CisgIGZfb3V0Xy5vcGVuKGluZGV4X2ZuYW1lLmNfc3RyKCkpOworICBmX291dF8gPDwgIjxodG1sPjxoZWFkPiIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CisgIGZfb3V0XyA8PCAiPHRpdGxlPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiIgPDwgZW5kbCA8PCAiPGgxPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC9oMT4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCAiCisgICAgICAgICAgICAidGFibGUtY29uZGVuc2VkXCI+PHRoZWFkPjx0aD5Nb2R1bGU8L3RoPjx0aD5TZXJ2aWNlczwvdGg+PHRoPkRhdGEgdHlwZXM8L3RoPiIKKyAgICAgICAgIDw8ICI8dGg+Q29uc3RhbnRzPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zOworICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHByb2dyYW1fLCBwcm9ncmFtcyk7CisgIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPC9kaXY+PC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7CisgIGZfb3V0Xy5jbG9zZSgpOworfQorCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzcygpIHsKKyAgaWYgKCFzdGFuZGFsb25lXykgeworICAgIGN1cnJlbnRfZmlsZV8gPSAic3R5bGUuY3NzIjsKKyAgICBzdHJpbmcgY3NzX2ZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87CisgICAgZl9vdXRfLm9wZW4oY3NzX2ZuYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX2Nzc19jb250ZW50KGZfb3V0Xyk7CisgICAgZl9vdXRfLmNsb3NlKCk7CisgIH0KK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc3NfY29udGVudChzdGQ6Om9zdHJlYW0mIGZfdGFyZ2V0KSB7CisgIGZfdGFyZ2V0IDw8IEJPT1RTVFJBUF9DU1MoKSA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiLyogQXV0by1nZW5lcmF0ZWQgQ1NTIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IGRvY3MgKi8iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJoMywgaDQgeyBtYXJnaW4tYm90dG9tOiA2cHg7IH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJkaXYuZGVmaW5pdGlvbiB7IGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7IG1hcmdpbi1ib3R0b206IDEwcHg7IHBhZGRpbmc6IDEwcHg7IH0iCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJkaXYuZXh0ZW5kcyB7IG1hcmdpbjogLTAuNWVtIDAgMWVtIDVlbSB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAidGQgeyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAidGFibGUgeyBlbXB0eS1jZWxsczogc2hvdzsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgImNvZGUgeyBsaW5lLWhlaWdodDogMjBweDsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgIi50YWJsZS1ib3JkZXJlZCB0aCwgLnRhYmxlLWJvcmRlcmVkIHRkIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNEREREREQ7IH0iCisgICAgICAgICAgIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBDU1MgdGFnLgorICogRGVwZW5kaW5nIG9uICJzdGFuZGFsb25lIiwgZWl0aGVyIGEgQ1NTIGZpbGUgbGluayAoZGVmYXVsdCksIG9yIHRoZSBlbnRpcmUgQ1NTIGlzIGVtYmVkZGVkCisgKiBpbmxpbmUuCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3R5bGVfdGFnKCkgeworICBpZiAoIXN0YW5kYWxvbmVfKSB7CisgICAgZl9vdXRfIDw8ICI8bGluayBocmVmPVwic3R5bGUuY3NzXCIgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiLz4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCIvPjwhLS0iIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoZl9vdXRfKTsKKyAgICBmX291dF8gPDwgIi0tPjwvc3R5bGU+IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgdGFyZ2V0IGZpbGUgZm9yIGEgPGEgaHJlZj4gbGluaworICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBlbXB0eSwgd2hlbmV2ZXIgZmlsZW5hbWUgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGZpbGUuCisgKi8KK3N0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6Om1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKSB7CisgIHJldHVybiAoY3VycmVudF9maWxlXy5jb21wYXJlKGZpbGVuYW1lKSAhPSAwKSA/IGZpbGVuYW1lIDogIiI7Cit9CisKKy8qKgorICogSWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIGRvY3VtZW50YXRpb24gYXR0YWNoZWQsIHRoaXMKKyAqIHdpbGwgZW1pdCBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBIVE1MIGZvcm1hdC4KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9kb2ModF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGlmICh1bnNhZmVfKSB7CisgICAgICBmX291dF8gPDwgdGRvYy0+Z2V0X2RvYygpIDw8ICI8YnIvPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfb3V0XyA8PCAiPHByZT4iIDw8IGVzY2FwZV9odG1sKHRkb2MtPmdldF9kb2MoKSkgPDwgIjwvcHJlPjxici8+IjsKKyAgICB9CisgIH0KK30KKworYm9vbCB0X2h0bWxfZ2VuZXJhdG9yOjppc191dGY4X3NlcXVlbmNlKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgeworICAvLyBsZWFkaW5nIGNoYXIgZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQorICB1bnNpZ25lZCBjaGFyIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOworICBpbnQgY291bnQgPSAwOworICBpZiAoKGMgJiAweEUwKSA9PSAweEMwKSB7CisgICAgY291bnQgPSAxOworICB9IGVsc2UgaWYgKChjICYgMHhGMCkgPT0gMHhFMCkgeworICAgIGNvdW50ID0gMjsKKyAgfSBlbHNlIGlmICgoYyAmIDB4RjgpID09IDB4RjApIHsKKyAgICBjb3VudCA9IDM7CisgIH0gZWxzZSBpZiAoKGMgJiAweEZDKSA9PSAweEY4KSB7CisgICAgY291bnQgPSA0OworICB9IGVsc2UgaWYgKChjICYgMHhGRSkgPT0gMHhGQykgeworICAgIGNvdW50ID0gNTsKKyAgfSBlbHNlIHsKKyAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGxlYWRpbmcgYnl0ZSIsIGMsIGludChjKSk7CisgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBVVEYtOAorICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzCisgIHNpemVfdCBwb3MgPSBmaXJzdHBvcyArIDE7CisgIHdoaWxlICgocG9zIDwgc3RyLmxlbmd0aCgpKSAmJiAoMCA8IGNvdW50KSkgeworICAgIGMgPSBzdHIuYXQocG9zKTsKKyAgICBpZiAoKGMgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAvLyBwZGVidWcoIlVURi04IHRlc3Q6IGNoYXIgJyVjJyAoJWQpIGlzIG5vdCBhIHZhbGlkIFVURi04IGZvbGxvd2luZyBieXRlIiwgYywgaW50KGMpKTsKKyAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gVVRGLTgKKyAgICB9CisgICAgLS1jb3VudDsKKyAgICArK3BvczsKKyAgfQorCisgIC8vIHRydWUgaWYgdGhlIHNlcXVlbmNlIGlzIGNvbXBsZXRlCisgIHJldHVybiAoMCA9PSBjb3VudCk7Cit9CisKK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6ZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcykgeworICBpZiAoaXNfdXRmOF9zZXF1ZW5jZShzdHIsIGZpcnN0cG9zKSkgeworICAgIHBkZWJ1ZygiSW5wdXQgc2VlbXMgdG8gYmUgYWxyZWFkeSBVVEYtOCBlbmNvZGVkIik7CisgICAgaW5wdXRfdHlwZV8gPSBJTlBVVF9VVEY4OworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGZhbGxiYWNrCisgIHB3YXJuaW5nKDEsICJJbnB1dCBpcyBub3QgVVRGLTgsIHRyZWF0aW5nIGFzIHBsYWluIEFOU0kiKTsKKyAgaW5wdXRfdHlwZV8gPSBJTlBVVF9QTEFJTjsKK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjppbml0X2FsbG93ZWRfX21hcmt1cCgpIHsKKyAgYWxsb3dlZF9tYXJrdXAuY2xlYXIoKTsKKyAgLy8gc3RhbmRhbG9uZSB0YWdzCisgIGFsbG93ZWRfbWFya3VwWyJiciJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImJyLyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImltZyJdID0gMTsKKyAgLy8gcGFpcmVkIHRhZ3MKKyAgYWxsb3dlZF9tYXJrdXBbImIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvYiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImkiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInMiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvcyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImJpZyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9iaWciXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzbWFsbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zbWFsbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInN1cCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9zdXAiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzdWIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvc3ViIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicHJlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3ByZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInR0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3R0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsidWwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvdWwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJvbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9vbCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImxpIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2xpIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiYSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9hIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsicCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9wIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiY29kZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9jb2RlIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiZGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvZGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJkdCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9kdCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImRkIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2RkIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDEiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDEiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoMiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oMiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImgzIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2gzIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoNSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oNSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImg2Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2g2Il0gPSAxOworfQorCitzdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjplc2NhcGVfaHRtbF90YWdzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICB1bnNpZ25lZCBjaGFyIGMgPSAnPyc7CisgIHNpemVfdCBsYXN0cG9zOworICBzaXplX3QgZmlyc3Rwb3MgPSAwOworICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKworICAgIC8vIGxvb2sgZm9yIG5vbi1BU0NJSSBjaGFyCisgICAgbGFzdHBvcyA9IGZpcnN0cG9zOworICAgIHdoaWxlIChsYXN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisgICAgICBjID0gc3RyLmF0KGxhc3Rwb3MpOworICAgICAgaWYgKCgnPCcgPT0gYykgfHwgKCc+JyA9PSBjKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrbGFzdHBvczsKKyAgICB9CisKKyAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhcgorICAgIGlmIChsYXN0cG9zID4gZmlyc3Rwb3MpIHsKKyAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB0YWcgZW5kIHdpdGhvdXQgY29ycmVzcG9uZGluZyBiZWdpbgorICAgICsrZmlyc3Rwb3M7CisgICAgaWYgKCc+JyA9PSBjKSB7CisgICAgICByZXN1bHQgPDwgIiZndDsiOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gZXh0cmFjdCB0aGUgdGFnCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHRhZ3N0cmVhbTsKKyAgICB3aGlsZSAoZmlyc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGMgPSBzdHIuYXQoZmlyc3Rwb3MpOworICAgICAgKytmaXJzdHBvczsKKyAgICAgIGlmICgnPCcgPT0gYykgeworICAgICAgICB0YWdzdHJlYW0gPDwgIiZsdDsiOyAvLyBuZXN0ZWQgYmVnaW4/CisgICAgICB9IGVsc2UgaWYgKCc+JyA9PSBjKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFnc3RyZWFtIDw8IGM7IC8vIG5vdCB2ZXJ5IGVmZmljaWVudCwgYnV0IHRhZ3Mgc2hvdWxkIGJlIHF1aXRlIHNob3J0CisgICAgICB9CisgICAgfQorCisgICAgLy8gd2UgYWxsb3cgZm9yIHNldmVyYWwgbWFya3VwIGluIGRvY3N0cmluZ3MsIGFsbCBlbHNlIHdpbGwgYmVjb21lIGVzY2FwZWQKKyAgICBzdHJpbmcgdGFnX2NvbnRlbnQgPSB0YWdzdHJlYW0uc3RyKCk7CisgICAgc3RyaW5nIHRhZ19rZXkgPSB0YWdfY29udGVudDsKKyAgICBzaXplX3QgZmlyc3Rfd2hpdGUgPSB0YWdfa2V5LmZpbmRfZmlyc3Rfb2YoIiBcdFxmXHZcblxyIik7CisgICAgaWYgKGZpcnN0X3doaXRlICE9IHN0cmluZzo6bnBvcykgeworICAgICAgdGFnX2tleS5lcmFzZShmaXJzdF93aGl0ZSk7CisgICAgfQorICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IHRhZ19rZXkubGVuZ3RoKCk7ICsraSkgeworICAgICAgdGFnX2tleVtpXSA9IHRvbG93ZXIodGFnX2tleVtpXSk7CisgICAgfQorICAgIGlmIChhbGxvd2VkX21hcmt1cC5maW5kKHRhZ19rZXkpICE9IGFsbG93ZWRfbWFya3VwLmVuZCgpKSB7CisgICAgICByZXN1bHQgPDwgIjwiIDw8IHRhZ19jb250ZW50IDw8ICI+IjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0IDw8ICImbHQ7IiA8PCB0YWdzdHJlYW0uc3RyKCkgPDwgIiZndDsiOworICAgICAgcHZlcmJvc2UoImlsbGVnYWwgbWFya3VwIDwlcz4gaW4gZG9jLWNvbW1lbnRcbiIsIHRhZ19rZXkuY19zdHIoKSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6ZXNjYXBlX2h0bWwoc3RkOjpzdHJpbmcgY29uc3QmIHN0cikgeworICAvLyB0aGUgZ2VuZXJhdGVkIEhUTUwgaGVhZGVyIHNheXMgaXQgaXMgVVRGLTggZW5jb2RlZAorICAvLyBpZiBVVEYtOCBpbnB1dCBoYXMgYmVlbiBkZXRlY3RlZCBiZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nCisgIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VVEY4KSB7CisgICAgcmV0dXJuIGVzY2FwZV9odG1sX3RhZ3Moc3RyKTsKKyAgfQorCisgIC8vIGNvbnZlcnQgdW5zYWZlIGNoYXJzIHRvIHRoZWlyICYjPG51bT47IGVxdWl2YWxlbnQKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgdW5zaWduZWQgY2hhciBjID0gJz8nOworICB1bnNpZ25lZCBpbnQgaWMgPSAwOworICBzaXplX3QgbGFzdHBvczsKKyAgc2l6ZV90IGZpcnN0cG9zID0gMDsKKyAgd2hpbGUgKGZpcnN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisKKyAgICAvLyBsb29rIGZvciBub24tQVNDSUkgY2hhcgorICAgIGxhc3Rwb3MgPSBmaXJzdHBvczsKKyAgICB3aGlsZSAobGFzdHBvcyA8IHN0ci5sZW5ndGgoKSkgeworICAgICAgYyA9IHN0ci5hdChsYXN0cG9zKTsKKyAgICAgIGljID0gYzsKKyAgICAgIGlmICgoMzIgPiBpYykgfHwgKDEyNyA8IGljKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrbGFzdHBvczsKKyAgICB9CisKKyAgICAvLyBjb3B5IHdoYXQgd2UgZ290IHNvIGZhcgorICAgIGlmIChsYXN0cG9zID4gZmlyc3Rwb3MpIHsKKyAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgZmlyc3Rwb3MgPSBsYXN0cG9zOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBzb21lIGNvbnRyb2wgY29kZT8KKyAgICBpZiAoaWMgPD0gMzEpIHsKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnXHInOgorICAgICAgY2FzZSAnXG4nOgorICAgICAgY2FzZSAnXHQnOgorICAgICAgICByZXN1bHQgPDwgYzsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAvLyBzaWxlbnRseSBjb25zdW1lIGFsbCBvdGhlciBjdHJsIGNoYXJzCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytmaXJzdHBvczsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIHJlYWNoZWQgdGhlIGVuZD8KKyAgICBpZiAoZmlyc3Rwb3MgPj0gc3RyLmxlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB0cnkgdG8gZGV0ZWN0IGlucHV0IGVuY29kaW5nCisgICAgaWYgKGlucHV0X3R5cGVfID09IElOUFVUX1VOS05PV04pIHsKKyAgICAgIGRldGVjdF9pbnB1dF9lbmNvZGluZyhzdHIsIGZpcnN0cG9zKTsKKyAgICAgIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VVEY4KSB7CisgICAgICAgIGxhc3Rwb3MgPSBzdHIubGVuZ3RoKCk7CisgICAgICAgIHJlc3VsdCA8PCBzdHIuc3Vic3RyKGZpcnN0cG9zLCBsYXN0cG9zIC0gZmlyc3Rwb3MpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gc29tZXRoaW5nIHVzZWZ1bCBiYXNlZCBvbiB0aGUgZGV0ZWN0ZWQgZW5jb2RpbmcKKyAgICBzd2l0Y2ggKGlucHV0X3R5cGVfKSB7CisgICAgY2FzZSBJTlBVVF9QTEFJTjoKKyAgICAgIHJlc3VsdCA8PCAiJiMiIDw8IGljIDw8ICI7IjsKKyAgICAgICsrZmlyc3Rwb3M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgb3IgdW5yZWNvZ25pemVkIGlucHV0IGVuY29kaW5nIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXNjYXBlX2h0bWxfdGFncyhyZXN1bHQuc3RyKCkpOworfQorCisvKioKKyAqIFByaW50cyBvdXQgdGhlIHByb3ZpZGVkIHR5cGUgaW4gSFRNTAorICovCitpbnQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gMDsKKyAgZl9vdXRfIDw8ICI8Y29kZT4iOworICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibGlzdCZsdDsiOworICAgICAgbGVuID0gNiArIHByaW50X3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiJmd0OyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGZfb3V0XyA8PCAic2V0Jmx0OyI7CisgICAgICBsZW4gPSA1ICsgcHJpbnRfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiZndDsiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBmX291dF8gPDwgIm1hcCZsdDsiOworICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIGxlbiArPSBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgZl9vdXRfIDw8ICh0dHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICBsZW4gPSB0dHlwZS0+Z2V0X25hbWUoKS5zaXplKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHByb2dfbmFtZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyB0eXBlX25hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKHByb2dfbmFtZSArICIuaHRtbCIpIDw8ICIjIjsKKyAgICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgZl9vdXRfIDw8ICJTdHJ1Y3RfIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZl9vdXRfIDw8ICJTdHJ1Y3RfIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAiRW51bV8iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgICAgZl9vdXRfIDw8ICJTdmNfIjsKKyAgICB9CisgICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiXCI+IjsKKyAgICBsZW4gPSB0eXBlX25hbWUuc2l6ZSgpOworICAgIGlmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgeworICAgICAgZl9vdXRfIDw8IHByb2dfbmFtZSA8PCAiLiI7CisgICAgICBsZW4gKz0gcHJvZ19uYW1lLnNpemUoKSArIDE7CisgICAgfQorICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIjwvYT4iOworICB9CisgIGZfb3V0XyA8PCAiPC9jb2RlPiI7CisgIHJldHVybiAoaW50KWxlbjsKK30KKworLyoqCisgKiBQcmludHMgb3V0IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKworICAvLyBpZiB0dmFsdWUgaXMgYW4gaWRlbnRpZmllciwgdGhlIGNvbnN0YW50IGNvbnRlbnQgaXMgYWxyZWFkeSBzaG93biBlbHNld2hlcmUKKyAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7CisgICAgc3RyaW5nIGZuYW1lID0gcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmh0bWwiOworICAgIHN0cmluZyBuYW1lID0gZXNjYXBlX2h0bWwodHZhbHVlLT5nZXRfaWRlbnRpZmllcigpKTsKKyAgICBmX291dF8gPDwgIjxjb2RlPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNDb25zdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQorICAgICAgICAgICAgICArICI8L2E+PC9jb2RlPiI7CisgICAgcmV0dXJuOworICB9CisKKyAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7CisgIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHJ1ZXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGZfb3V0XyA8PCAnIicgPDwgZXNjYXBlX2h0bWwoZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfb3V0XyA8PCAoKHR2YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh0dmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZfb3V0XyA8PCAiVU5LTk9XTiBCQVNFIFRZUEUiOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwodHJ1ZXR5cGUtPmdldF9uYW1lKCkpIDw8ICIuIgorICAgICAgICAgICA8PCBlc2NhcGVfaHRtbCh0dmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX3N0cnVjdCgpIHx8IHRydWV0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJ7ICI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHJ1ZXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHRydWV0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgorICAgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIDw8ICIgPSAiOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfbWFwKCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXBfZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWFwX2l0ZXI7CisgICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7IG1hcF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHJ1ZXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgbWFwX2l0ZXItPmZpcnN0KTsKKyAgICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXRydWV0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIG1hcF9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZl9vdXRfIDw8ICJ7ICI7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICAgIDsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7CisgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbGlzdCopdHJ1ZXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgIH0KKyAgICBmX291dF8gPDwgIiB9IjsKKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfc2V0KCkpIHsKKyAgICBmX291dF8gPDwgInsgIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgICAgOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKKyAgICBmb3IgKGxpc3RfaXRlciA9IGxpc3RfZWxlbXMuYmVnaW4oKTsgbGlzdF9pdGVyICE9IGxpc3RfZWxlbXMuZW5kKCk7IGxpc3RfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9zZXQqKXRydWV0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICB9CisgICAgZl9vdXRfIDw8ICIgfSI7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICJVTktOT1dOIFRZUEUiOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIG91dCBkb2N1bWVudGF0aW9uIGZvciBhcmd1bWVudHMvZXhjZXB0aW9ucyBvZiBhIGZ1bmN0aW9uLCBpZiBhbnkgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbgorICogc3VwcGxpZWQuCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfZm5fYXJnc19kb2ModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGJvb2wgaGFzX2RvY3MgPSBmYWxzZTsKKyAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKKyAgaWYgKGFyZ19pdGVyICE9IGFyZ3MuZW5kKCkpIHsKKyAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgaWYgKCgqYXJnX2l0ZXIpLT5oYXNfZG9jKCkgJiYgISgqYXJnX2l0ZXIpLT5nZXRfZG9jKCkuZW1wdHkoKSkKKyAgICAgICAgaGFzX2RvY3MgPSB0cnVlOworICAgIH0KKyAgICBpZiAoaGFzX2RvY3MpIHsKKyAgICAgIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICAgICAgZl9vdXRfIDw8ICI8YnIvPjxoNCBpZD1cIlBhcmFtZXRlcnNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCI+UGFyYW1ldGVyczwvaDQ+IiA8PCBlbmRsOworICAgICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgICAgICBmX291dF8gPDwgIjx0aGVhZD48dGg+TmFtZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RoZWFkPiI7CisgICAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgICAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwoKCphcmdfaXRlciktPmdldF9kb2MoKSk7CisgICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOworICAgIH0KKyAgfQorCisgIGhhc19kb2NzID0gZmFsc2U7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICBpZiAoZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpKSB7CisgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgICBpZiAoKCpleF9pdGVyKS0+aGFzX2RvYygpICYmICEoKmV4X2l0ZXIpLT5nZXRfZG9jKCkuZW1wdHkoKSkKKyAgICAgICAgaGFzX2RvY3MgPSB0cnVlOworICAgIH0KKyAgICBpZiAoaGFzX2RvY3MpIHsKKyAgICAgIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgICAgICBmX291dF8gPDwgIjxici8+PGg0IGlkPVwiRXhjZXB0aW9uc18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIj5FeGNlcHRpb25zPC9oND4iIDw8IGVuZGw7CisgICAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKKyAgICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdGhlYWQ+IjsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKmV4X2l0ZXIpLT5nZXRfZG9jKCkpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0cmluZyBuYW1lID0gdHR5cGVkZWYtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICBmX291dF8gPDwgIjxoMyBpZD1cIlR5cGVkZWZfIiA8PCBuYW1lIDw8ICJcIj5UeXBlZGVmOiAiIDw8IG5hbWUgPDwgIjwvaDM+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxwPjxzdHJvbmc+QmFzZSB0eXBlOjwvc3Ryb25nPiZuYnNwOyI7CisgIHByaW50X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpOworICBmX291dF8gPDwgIjwvcD4iIDw8IGVuZGw7CisgIHByaW50X2RvYyh0dHlwZWRlZik7CisgIGZfb3V0XyA8PCAiPC9kaXY+IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKKyAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJFbnVtXyIgPDwgbmFtZSA8PCAiXCI+RW51bWVyYXRpb246ICIgPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7CisgIHByaW50X2RvYyh0ZW51bSk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOworICBmX291dF8gPDwgIjxici8+PHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iIDw8IGVuZGw7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgZl9vdXRfIDw8ICI8dHI+PHRkPjxjb2RlPiI7CisgICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PHRkPjxjb2RlPiI7CisgICAgZl9vdXRfIDw8ICgqdmFsX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD4iIDw8IGVuZGw7CisgICAgcHJpbnRfZG9jKCgqdmFsX2l0ZXIpKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RhYmxlPjwvZGl2PiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8dHIgaWQ9XCJDb25zdF8iIDw8IG5hbWUgPDwgIlwiPjx0ZD48Y29kZT4iIDw8IG5hbWUgPDwgIjwvY29kZT48L3RkPjx0ZD4iOworICBwcmludF90eXBlKHRjb25zdC0+Z2V0X3R5cGUoKSk7CisgIGZfb3V0XyA8PCAiPC90ZD48dGQ+PGNvZGU+IjsKKyAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdHlwZSgpLCB0Y29uc3QtPmdldF92YWx1ZSgpKTsKKyAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48L3RyPiI7CisgIGlmICh0Y29uc3QtPmhhc19kb2MoKSkgeworICAgIGZfb3V0XyA8PCAiPHRyPjx0ZCBjb2xzcGFuPVwiM1wiPjxibG9ja3F1b3RlPiI7CisgICAgcHJpbnRfZG9jKHRjb25zdCk7CisgICAgZl9vdXRfIDw8ICI8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPiI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICBmX291dF8gPDwgIjxoMyBpZD1cIlN0cnVjdF8iIDw8IG5hbWUgPDwgIlwiPiI7CisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9vdXRfIDw8ICJFeGNlcHRpb246ICI7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGZfb3V0XyA8PCAiVW5pb246ICI7CisgIH0gZWxzZSB7CisgICAgZl9vdXRfIDw8ICJTdHJ1Y3Q6ICI7CisgIH0KKyAgZl9vdXRfIDw8IG5hbWUgPDwgIjwvaDM+IiA8PCBlbmRsOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKyAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5LZXk8L3RoPjx0aD5GaWVsZDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PHRoPlJlcXVpcmVkbmVzczwvIgorICAgICAgICAgICAgInRoPjx0aD5EZWZhdWx0IHZhbHVlPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKKyAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKm1lbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI8L3RkPjx0ZD4iOworICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKm1lbV9pdGVyKS0+Z2V0X2RvYygpKTsKKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgZl9vdXRfIDw8ICJvcHRpb25hbCI7CisgICAgfSBlbHNlIGlmICgoKm1lbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGZfb3V0XyA8PCAicmVxdWlyZWQiOworICAgIH0gZWxzZSB7CisgICAgICBmX291dF8gPDwgImRlZmF1bHQiOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7CisgICAgdF9jb25zdF92YWx1ZSogZGVmYXVsdF92YWwgPSAoKm1lbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGRlZmF1bHRfdmFsICE9IE5VTEwpIHsKKyAgICAgIGZfb3V0XyA8PCAiPGNvZGU+IjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpLCBkZWZhdWx0X3ZhbCk7CisgICAgICBmX291dF8gPDwgIjwvY29kZT4iOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RhYmxlPjxici8+IjsKKyAgcHJpbnRfZG9jKHRzdHJ1Y3QpOworICBmX291dF8gPDwgIjwvZGl2PiI7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3BlY2lhbCBzdHJ1Y3RzCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zdHJ1Y3QodHhjZXB0aW9uKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgYmxvY2sgZm9yIGEgVGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdmNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJcIj5TZXJ2aWNlOiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIjwvaDM+IiA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImV4dGVuZHNcIj48ZW0+ZXh0ZW5kczwvZW0+ICI7CisgICAgcHJpbnRfdHlwZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZl9vdXRfIDw8ICI8L2Rpdj5cbiI7CisgIH0KKyAgcHJpbnRfZG9jKHRzZXJ2aWNlKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOworICAgIGZfb3V0XyA8PCAiPGg0IGlkPVwiRm5fIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCBmbl9uYW1lIDw8ICJcIj5GdW5jdGlvbjogIiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgIDw8ICIuIiA8PCBmbl9uYW1lIDw8ICI8L2g0PiIgPDwgZW5kbDsKKyAgICBmX291dF8gPDwgIjxwcmU+IjsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIG9mZnNldCA9IHByaW50X3R5cGUoKCpmbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZl9vdXRfIDw8ICIgIiA8PCBmbl9uYW1lIDw8ICIoIjsKKyAgICBvZmZzZXQgKz0gZm5fbmFtZS5zaXplKCkgKyAyOworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsIiA8PCBlbmRsOworICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBvZmZzZXQ7ICsraSkgeworICAgICAgICAgIGZfb3V0XyA8PCAiICI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiICIgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAoKCphcmdfaXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgICBwcmludF9jb25zdF92YWx1ZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSwgKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9vdXRfIDw8ICIpIiA8PCBlbmRsOworICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgICBpZiAoZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpKSB7CisgICAgICBmX291dF8gPDwgIiAgICB0aHJvd3MgIjsKKyAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgcHJpbnRfdHlwZSgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIH0KKyAgICAgIGZfb3V0XyA8PCBlbmRsOworICAgIH0KKyAgICBmX291dF8gPDwgIjwvcHJlPiI7CisgICAgcHJpbnRfZG9jKCpmbl9pdGVyKTsKKyAgICBwcmludF9mbl9hcmdzX2RvYygqZm5faXRlcik7CisgICAgZl9vdXRfIDw8ICI8L2Rpdj4iOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgaHRtbCwKKyAgICAiSFRNTCIsCisgICAgIiAgICBzdGFuZGFsb25lOiAgICAgIFNlbGYtY29udGFpbmVkIG1vZGUsIGluY2x1ZGVzIGFsbCBDU1MgaW4gdGhlIEhUTUwgZmlsZXMuXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlcyBubyBzdHlsZS5jc3MgZmlsZSwgYnV0IEhUTUwgZmlsZXMgd2lsbCBiZSBsYXJnZXIuXG4iCisgICAgIiAgICBub2VzY2FwZTogICAgICAgIERvIG5vdCBlc2NhcGUgaHRtbCBpbiBkb2MgdGV4dC5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwYjE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDI0MCBAQAorI2RlZmluZSBCT09UU1RSQVBfQ1NTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLyohXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogQm9vdHN0cmFwIHYyLjAuM1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICpcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIHYyLjBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICpcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiICogRGVzaWduZWQgYW5kIGJ1aWx0IHdpdGggYWxsIHRoZSBsb3ZlIGluIHRoZSB3b3JsZCBAdHdpdHRlciBieSBAbWRvIGFuZCBAZmF0LlxuIiAgICAgICAgICAgICAgXAorICAiICovXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNsZWFyZml4eyp6b29tOjE7fS5jbGVhcmZpeDpiZWZvcmUsLmNsZWFyZml4OmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgICAgXAorICAiLmNsZWFyZml4OmFmdGVye2NsZWFyOmJvdGg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmhpZGUtdGV4dHtmb250OjAvMCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYTtjb2xvcjp0cmFuc3BhcmVudDt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7fVxuIiAgICAgICAgICAgICAgICAgXAorICAiLmlucHV0LWJsb2NrLWxldmVse2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjI4cHg7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LSIgICAgXAorICAibW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbXMtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDt9XG4iICAgICAgICAgICAgICAgICAgXAorICAiYXJ0aWNsZSxhc2lkZSxkZXRhaWxzLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaGdyb3VwLG5hdixzZWN0aW9ue2Rpc3BsYXk6YmxvY2s7fVxuIiAgICAgXAorICAiYXVkaW8sY2FudmFzLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrOypkaXNwbGF5OmlubGluZTsqem9vbToxO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYXVkaW86bm90KFtjb250cm9sc10pe2Rpc3BsYXk6bm9uZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaHRtbHtmb250LXNpemU6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlO31cbiIgICAgICAgICAgICAgICAgXAorICAiYTpmb2N1c3tvdXRsaW5lOnRoaW4gZG90dGVkICMzMzM7b3V0bGluZTo1cHggYXV0byAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO291dGxpbmUtb2Zmc2V0Oi0ycHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYTpob3ZlcixhOmFjdGl2ZXtvdXRsaW5lOjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic3ViLHN1cHtwb3NpdGlvbjpyZWxhdGl2ZTtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7fVxuIiAgICAgICAgICAgICAgXAorICAic3Vwe3RvcDotMC41ZW07fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic3Vie2JvdHRvbTotMC4yNWVtO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW1ne21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3JkZXI6MDstbXMtaW50ZXJwb2xhdGlvbi1tb2RlOmJpY3ViaWM7fVxuIiAgICAgICAgICAgXAorICAiYnV0dG9uLGlucHV0LHNlbGVjdCx0ZXh0YXJlYXttYXJnaW46MDtmb250LXNpemU6MTAwJTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fVxuIiAgICAgICAgICAgICAgICAgXAorICAiYnV0dG9uLGlucHV0eypvdmVyZmxvdzp2aXNpYmxlO2xpbmUtaGVpZ2h0Om5vcm1hbDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLGlucHV0OjotbW96LWZvY3VzLWlubmVye3BhZGRpbmc6MDtib3JkZXI6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYnV0dG9uLGlucHV0W3R5cGU9XCJidXR0b25cIl0saW5wdXRbdHlwZT1cInJlc2V0XCJdLGlucHV0W3R5cGU9XCJzdWJtaXRcIl17Y3Vyc29yOnBvaW50ZXI7LSIgICAgXAorICAid2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW5wdXRbdHlwZT1cInNlYXJjaFwiXXstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6IiAgXAorICAiY29udGVudC1ib3g7LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbixpbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC0iICAgICAgXAorICAiY2FuY2VsLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGV4dGFyZWF7b3ZlcmZsb3c6YXV0bzt2ZXJ0aWNhbC1hbGlnbjp0b3A7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYm9keXttYXJnaW46MDtmb250LWZhbWlseTpcIkhlbHZldGljYSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiTmV1ZVwiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjE4cHg7Y29sb3I6IzMzMzMzMztiYWNrZ3JvdW5kLSIgICAgXAorICAiY29sb3I6I2ZmZmZmZjt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYXtjb2xvcjojMDA4OGNjO3RleHQtZGVjb3JhdGlvbjpub25lO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYTpob3Zlcntjb2xvcjojMDA1NTgwO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvd3ttYXJnaW4tbGVmdDotMjBweDsqem9vbToxO30ucm93OmJlZm9yZSwucm93OmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgXAorICAiLnJvdzphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiW2NsYXNzKj1cInNwYW5cIl17ZmxvYXQ6bGVmdDttYXJnaW4tbGVmdDoyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lciwubmF2YmFyLWZpeGVkLXRvcCAuY29udGFpbmVyLC5uYXZiYXItZml4ZWQtYm90dG9tIC5jb250YWluZXJ7d2lkdGg6OTQwcHg7fVxuIiAgICAgICAgXAorICAiLnNwYW4xMnt3aWR0aDo5NDBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4xMXt3aWR0aDo4NjBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4xMHt3aWR0aDo3ODBweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW45e3dpZHRoOjcwMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW44e3dpZHRoOjYyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW43e3dpZHRoOjU0MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW42e3dpZHRoOjQ2MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW41e3dpZHRoOjM4MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW40e3dpZHRoOjMwMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4ze3dpZHRoOjIyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4ye3dpZHRoOjE0MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnNwYW4xe3dpZHRoOjYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDEye21hcmdpbi1sZWZ0Ojk4MHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDExe21hcmdpbi1sZWZ0OjkwMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDEwe21hcmdpbi1sZWZ0OjgyMHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDl7bWFyZ2luLWxlZnQ6NzQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDh7bWFyZ2luLWxlZnQ6NjYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDd7bWFyZ2luLWxlZnQ6NTgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDZ7bWFyZ2luLWxlZnQ6NTAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDV7bWFyZ2luLWxlZnQ6NDIwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDR7bWFyZ2luLWxlZnQ6MzQwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDN7bWFyZ2luLWxlZnQ6MjYwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDJ7bWFyZ2luLWxlZnQ6MTgwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm9mZnNldDF7bWFyZ2luLWxlZnQ6MTAwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZHt3aWR0aDoxMDAlOyp6b29tOjE7fS5yb3ctZmx1aWQ6YmVmb3JlLC5yb3ctZmx1aWQ6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fSIgXAorICAiXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZDphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiW2NsYXNzKj1cInNwYW5cIl17ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MjhweDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LSIgXAorICAiYm94LXNpemluZzpib3JkZXItYm94Oy1tcy1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6IiAgXAorICAiMi4xMjc2NTk1NzQlOyptYXJnaW4tbGVmdDoyLjA3NDQ2ODA4NDYzODI5NzclO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCBbY2xhc3MqPVwic3BhblwiXTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjEye3dpZHRoOjk5Ljk5OTk5OTk4OTk5OTk5JTsqd2lkdGg6OTkuOTQ2ODA4NTAwNjM4MjglO31cbiIgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjExe3dpZHRoOjkxLjQ4OTM2MTY5MyU7KndpZHRoOjkxLjQzNjE3MDIwMzYzODMlO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjEwe3dpZHRoOjgyLjk3ODcyMzM5NTk5OTk5JTsqd2lkdGg6ODIuOTI1NTMxOTA2NjM4MjglO31cbiIgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3Bhbjl7d2lkdGg6NzQuNDY4MDg1MDk5JTsqd2lkdGg6NzQuNDE0ODkzNjA5NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3Bhbjh7d2lkdGg6NjUuOTU3NDQ2ODAxOTk5OTklOyp3aWR0aDo2NS45MDQyNTUzMTI2MzgyOCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3Bhbjd7d2lkdGg6NTcuNDQ2ODA4NTA1JTsqd2lkdGg6NTcuMzkzNjE3MDE1NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjZ7d2lkdGg6NDguOTM2MTcwMjA3OTk5OTklOyp3aWR0aDo0OC44ODI5Nzg3MTg2MzgyOSU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjV7d2lkdGg6NDAuNDI1NTMxOTExJTsqd2lkdGg6NDAuMzcyMzQwNDIxNjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjR7d2lkdGg6MzEuOTE0ODkzNjE0JTsqd2lkdGg6MzEuODYxNzAyMTI0NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjN7d2lkdGg6MjMuNDA0MjU1MzE3JTsqd2lkdGg6MjMuMzUxMDYzODI3NjM4MyU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjJ7d2lkdGg6MTQuODkzNjE3MDIlOyp3aWR0aDoxNC44NDA0MjU1MzA2MzgzJTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnJvdy1mbHVpZCAuc3BhbjF7d2lkdGg6Ni4zODI5Nzg3MjMlOyp3aWR0aDo2LjMyOTc4NzIzMzYzODI5OCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lcnttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvOyp6b29tOjE7fS5jb250YWluZXI6YmVmb3JlLC5jb250YWluZXI6YWZ0ZXJ7IiAgICAgXAorICAiZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lcjphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lci1mbHVpZHtwYWRkaW5nLXJpZ2h0OjIwcHg7cGFkZGluZy1sZWZ0OjIwcHg7Knpvb206MTt9LmNvbnRhaW5lci1mbHVpZDpiZWZvcmUsLiIgICAgICAgXAorICAiY29udGFpbmVyLWZsdWlkOmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmNvbnRhaW5lci1mbHVpZDphZnRlcntjbGVhcjpib3RoO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHttYXJnaW46MCAwIDlweDtmb250LWZhbWlseTpcIkhlbHZldGljYSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiTmV1ZVwiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjE4cHg7fXAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGx7Zm9udC1zaXplOjExcHg7Y29sb3I6Izk5OTk5OTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxlYWR7bWFyZ2luLWJvdHRvbToxOHB4O2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OjIwMDtsaW5lLWhlaWdodDoyN3B4O31cbiIgICAgICAgICAgICAgICAgICAgXAorICAiaDEsaDIsaDMsaDQsaDUsaDZ7bWFyZ2luOjA7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDpib2xkO2NvbG9yOmluaGVyaXQ7dGV4dC1yZW5kZXJpbmc6IiAgXAorICAib3B0aW1pemVsZWdpYmlsaXR5O31oMSBzbWFsbCxoMiBzbWFsbCxoMyBzbWFsbCxoNCBzbWFsbCxoNSBzbWFsbCxoNiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGx7Zm9udC13ZWlnaHQ6bm9ybWFsO2NvbG9yOiM5OTk5OTk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDF7Zm9udC1zaXplOjMwcHg7bGluZS1oZWlnaHQ6MzZweDt9aDEgc21hbGx7Zm9udC1zaXplOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDJ7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6MzZweDt9aDIgc21hbGx7Zm9udC1zaXplOjE4cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDN7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MjdweDt9aDMgc21hbGx7Zm9udC1zaXplOjE0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDQsaDUsaDZ7bGluZS1oZWlnaHQ6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDR7Zm9udC1zaXplOjE0cHg7fWg0IHNtYWxse2ZvbnQtc2l6ZToxMnB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDV7Zm9udC1zaXplOjEycHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaDZ7Zm9udC1zaXplOjExcHg7Y29sb3I6Izk5OTk5OTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnBhZ2UtaGVhZGVye3BhZGRpbmctYm90dG9tOjE3cHg7bWFyZ2luOjE4cHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlZWVlO31cbiIgICAgICAgICAgICAgXAorICAiLnBhZ2UtaGVhZGVyIGgxe2xpbmUtaGVpZ2h0OjE7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWwsb2x7cGFkZGluZzowO21hcmdpbjowIDAgOXB4IDI1cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWwgdWwsdWwgb2wsb2wgb2wsb2wgdWx7bWFyZ2luLWJvdHRvbTowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWx7bGlzdC1zdHlsZTpkaXNjO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAib2x7bGlzdC1zdHlsZTpkZWNpbWFsO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibGl7bGluZS1oZWlnaHQ6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWwudW5zdHlsZWQsb2wudW5zdHlsZWR7bWFyZ2luLWxlZnQ6MDtsaXN0LXN0eWxlOm5vbmU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZGx7bWFyZ2luLWJvdHRvbToxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZHQsZGR7bGluZS1oZWlnaHQ6MThweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZHR7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoxN3B4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZGR7bWFyZ2luLWxlZnQ6OXB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmRsLWhvcml6b250YWwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZHR7ZmxvYXQ6bGVmdDt3aWR0aDoxMjBweDtjbGVhcjpsZWZ0O3RleHQtYWxpZ246cmlnaHQ7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7IiAgXAorICAid2hpdGUtc3BhY2U6bm93cmFwO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmRsLWhvcml6b250YWwgZGR7bWFyZ2luLWxlZnQ6MTMwcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaHJ7bWFyZ2luOjE4cHggMDtib3JkZXI6MDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlZWVlO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmZmZmZmY7fVxuIiAgICAgXAorICAic3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiZW17Zm9udC1zdHlsZTppdGFsaWM7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLm11dGVke2NvbG9yOiM5OTk5OTk7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWJiclt0aXRsZV17Y3Vyc29yOmhlbHA7Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkICNkZGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWJici5pbml0aWFsaXNte2ZvbnQtc2l6ZTo5MCU7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYmxvY2txdW90ZXtwYWRkaW5nOjAgMCAwIDE1cHg7bWFyZ2luOjAgMCAxOHB4O2JvcmRlci1sZWZ0OjVweCBzb2xpZCAjZWVlZWVlO31ibG9ja3F1b3RlICIgICAgICAgXAorICAicHttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6MzAwO2xpbmUtaGVpZ2h0OjIyLjVweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYmxvY2txdW90ZSBzbWFsbHtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjE4cHg7Y29sb3I6Izk5OTk5OTt9YmxvY2txdW90ZSAiICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGw6YmVmb3Jle2NvbnRlbnQ6J1xcMjAxNCBcXDAwQTAnO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYmxvY2txdW90ZS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0O3BhZGRpbmctcmlnaHQ6MTVweDtwYWRkaW5nLWxlZnQ6MDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkICIgICAgXAorICAiI2VlZWVlZTtib3JkZXItbGVmdDowO31ibG9ja3F1b3RlLnB1bGwtcmlnaHQgcCxibG9ja3F1b3RlLnB1bGwtcmlnaHQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic21hbGx7dGV4dC1hbGlnbjpyaWdodDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicTpiZWZvcmUscTphZnRlcixibG9ja3F1b3RlOmJlZm9yZSxibG9ja3F1b3RlOmFmdGVye2NvbnRlbnQ6XCJcIjt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkcmVzc3tkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206MThweDtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDoxOHB4O31cbiIgICAgICAgICAgICAgICAgXAorICAic21hbGx7Zm9udC1zaXplOjEwMCU7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiY2l0ZXtmb250LXN0eWxlOm5vcm1hbDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiY29kZSxwcmV7cGFkZGluZzowIDNweCAycHg7Zm9udC1mYW1pbHk6TWVubG8sTW9uYWNvLENvbnNvbGFzLFwiQ291cmllciAiICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiTmV3XCIsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4O2NvbG9yOiMzMzMzMzM7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4OyIgXAorICAiYm9yZGVyLXJhZGl1czozcHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiY29kZXtwYWRkaW5nOjJweCA0cHg7Y29sb3I6I2QxNDtiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y3Zjk7Ym9yZGVyOjFweCBzb2xpZCAjZTFlMWU4O31cbiIgICAgICAgICAgXAorICAicHJle2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo4LjVweDttYXJnaW46MCAwICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiOXB4O2ZvbnQtc2l6ZToxMi4wMjVweDtsaW5lLWhlaWdodDoxOHB4O3dvcmQtYnJlYWs6YnJlYWstYWxsO3dvcmQtd3JhcDpicmVhay13b3JkO3doaXRlLXNwYWNlOiIgXAorICAicHJlO3doaXRlLXNwYWNlOnByZS13cmFwO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyOjFweCBzb2xpZCAiICAgICAgXAorICAicmdiYSgwLCAwLCAwLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMC4xNSk7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4O31wcmUucHJldHR5cHJpbnR7IiAgICAgXAorICAibWFyZ2luLWJvdHRvbToxOHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHJlIGNvZGV7cGFkZGluZzowO2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiLnByZS1zY3JvbGxhYmxle21heC1oZWlnaHQ6MzQwcHg7b3ZlcmZsb3cteTpzY3JvbGw7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLC5iYWRnZXtmb250LXNpemU6MTAuOTk4cHg7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoxNHB4O2NvbG9yOiNmZmZmZmY7dmVydGljYWwtIiAgICAgXAorICAiYWxpZ246YmFzZWxpbmU7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwgMCwgMCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMC4yNSk7YmFja2dyb3VuZC1jb2xvcjojOTk5OTk5O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVse3BhZGRpbmc6MXB4IDRweCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweDt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiLmJhZGdle3BhZGRpbmc6MXB4IDlweCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiMnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo5cHg7LW1vei1ib3JkZXItcmFkaXVzOjlweDtib3JkZXItcmFkaXVzOjlweDt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiYS5sYWJlbDpob3ZlcixhLmJhZGdlOmhvdmVye2NvbG9yOiNmZmZmZmY7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7fVxuIiAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWltcG9ydGFudCwuYmFkZ2UtaW1wb3J0YW50e2JhY2tncm91bmQtY29sb3I6I2I5NGE0ODt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWltcG9ydGFudFtocmVmXSwuYmFkZ2UtaW1wb3J0YW50W2hyZWZde2JhY2tncm91bmQtY29sb3I6Izk1M2IzOTt9XG4iICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXdhcm5pbmcsLmJhZGdlLXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZjg5NDA2O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXdhcm5pbmdbaHJlZl0sLmJhZGdlLXdhcm5pbmdbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojYzY3NjA1O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXN1Y2Nlc3MsLmJhZGdlLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojNDY4ODQ3O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLXN1Y2Nlc3NbaHJlZl0sLmJhZGdlLXN1Y2Nlc3NbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMzU2NjM1O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWluZm8sLmJhZGdlLWluZm97YmFja2dyb3VuZC1jb2xvcjojM2E4N2FkO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWluZm9baHJlZl0sLmJhZGdlLWluZm9baHJlZl17YmFja2dyb3VuZC1jb2xvcjojMmQ2OTg3O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWludmVyc2UsLmJhZGdlLWludmVyc2V7YmFja2dyb3VuZC1jb2xvcjojMzMzMzMzO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmxhYmVsLWludmVyc2VbaHJlZl0sLmJhZGdlLWludmVyc2VbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMWExYTFhO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGV7bWF4LXdpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDt9IiAgXAorICAiXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxle3dpZHRoOjEwMCU7bWFyZ2luLWJvdHRvbToxOHB4O30udGFibGUgdGgsLnRhYmxlICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGR7cGFkZGluZzo4cHg7bGluZS1oZWlnaHQ6MThweDt0ZXh0LWFsaWduOmxlZnQ7dmVydGljYWwtYWxpZ246dG9wO2JvcmRlci10b3A6MXB4IHNvbGlkICIgICAgICAgXAorICAiI2RkZGRkZDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRoe2ZvbnQtd2VpZ2h0OmJvbGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRoZWFkIHRoe3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlICIgICAgICAgICAgXAorICAiY29sZ3JvdXArdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlIGNvbGdyb3VwK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZSAiICAgICAgICAgICAgICAgXAorICAidGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkICIgICAgICAgICAgICAgICAgICAgXAorICAidGR7Ym9yZGVyLXRvcDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRib2R5K3Rib2R5e2JvcmRlci10b3A6MnB4IHNvbGlkICNkZGRkZGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWNvbmRlbnNlZCB0aCwudGFibGUtY29uZGVuc2VkIHRke3BhZGRpbmc6NHB4IDVweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVke2JvcmRlcjoxcHggc29saWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiI2RkZGRkZDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGU7KmJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZWQ7Ym9yZGVyLWxlZnQ6MDstd2Via2l0LWJvcmRlci0iICAgICAgXAorICAicmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4O30udGFibGUtYm9yZGVyZWQgdGgsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgXAorICAidGR7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZGRkZGQ7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGJvZHkgdHI6Zmlyc3QtY2hpbGQgIiAgXAorICAidGgsLnRhYmxlLWJvcmRlcmVkIGNhcHRpb24rdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwK3RoZWFkICIgICAgICAgICAgICAgXAorICAidHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCAiICAgICAgICAgICAgXAorICAiY29sZ3JvdXArdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkICIgICAgICAgICAgICAgXAorICAidGgsLnRhYmxlLWJvcmRlcmVkIHRib2R5OmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpmaXJzdC1jaGlsZCAiICAgICAgXAorICAidHI6Zmlyc3QtY2hpbGQgdGR7Ym9yZGVyLXRvcDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoOmZpcnN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCAiICAgICAgICAgICAgICAgXAorICAidGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGQ6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci0iICAgICAgXAorICAicmFkaXVzLXRvcGxlZnQ6NHB4O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkICIgICAgICAgICAgICAgICAgXAorICAidGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGQ6bGFzdC1jaGlsZHstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItIiAgICAgXAorICAicmFkaXVzLXRvcHJpZ2h0OjRweDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgIiAgICAgICAgICAgICAgICAgXAorICAidGJvZHk6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkey13ZWJraXQtYm9yZGVyLXJhZGl1czowIDAgMCAiICAgICAgICAgICAgICAgICAgICAgXAorICAiNHB4Oy1tb3otYm9yZGVyLXJhZGl1czowIDAgMCA0cHg7Ym9yZGVyLXJhZGl1czowIDAgMCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiNHB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzLSIgICAgXAorICAiYm90dG9tbGVmdDo0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLWJvcmRlcmVkIHRoZWFkOmxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0aDpsYXN0LWNoaWxkLC50YWJsZS1ib3JkZXJlZCB0Ym9keTpsYXN0LWNoaWxkICIgXAorICAidHI6bGFzdC1jaGlsZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGQ6bGFzdC1jaGlsZHstd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHg7LW1vei0iICAgICAgXAorICAiYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDo0cHg7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgdGQsLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgIiAgICAgICAgICAgICAgXAorICAidGh7YmFja2dyb3VuZC1jb2xvcjojZjlmOWY5O31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLnRhYmxlIHRib2R5IHRyOmhvdmVyIHRkLC50YWJsZSB0Ym9keSB0cjpob3ZlciB0aHtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7fVxuIiAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xe2Zsb2F0Om5vbmU7d2lkdGg6NDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4ye2Zsb2F0Om5vbmU7d2lkdGg6MTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4ze2Zsb2F0Om5vbmU7d2lkdGg6MjA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW40e2Zsb2F0Om5vbmU7d2lkdGg6Mjg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW41e2Zsb2F0Om5vbmU7d2lkdGg6MzY0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW42e2Zsb2F0Om5vbmU7d2lkdGg6NDQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW43e2Zsb2F0Om5vbmU7d2lkdGg6NTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW44e2Zsb2F0Om5vbmU7d2lkdGg6NjA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW45e2Zsb2F0Om5vbmU7d2lkdGg6Njg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xMHtmbG9hdDpub25lO3dpZHRoOjc2NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xMXtmbG9hdDpub25lO3dpZHRoOjg0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xMntmbG9hdDpub25lO3dpZHRoOjkyNHB4O21hcmdpbi1sZWZ0OjA7fVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xM3tmbG9hdDpub25lO3dpZHRoOjEwMDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xNHtmbG9hdDpub25lO3dpZHRoOjEwODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xNXtmbG9hdDpub25lO3dpZHRoOjExNjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xNntmbG9hdDpub25lO3dpZHRoOjEyNDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xN3tmbG9hdDpub25lO3dpZHRoOjEzMjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xOHtmbG9hdDpub25lO3dpZHRoOjE0MDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4xOXtmbG9hdDpub25lO3dpZHRoOjE0ODRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yMHtmbG9hdDpub25lO3dpZHRoOjE1NjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yMXtmbG9hdDpub25lO3dpZHRoOjE2NDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yMntmbG9hdDpub25lO3dpZHRoOjE3MjRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yM3tmbG9hdDpub25lO3dpZHRoOjE4MDRweDttYXJnaW4tbGVmdDowO31cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidGFibGUgLnNwYW4yNHtmbG9hdDpub25lO3dpZHRoOjE4ODRweDttYXJnaW4tbGVmdDowO30iCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg0NTUxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDU0NTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3RpbWU+CisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnNldGZpbGw7Cit1c2luZyBzdGQ6OnNldHc7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9qYXZhX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2phdmFfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYmVhbl9zdHlsZV8gPSBmYWxzZTsKKyAgICBhbmRyb2lkX3N0eWxlXyA9IGZhbHNlOworICAgIHByaXZhdGVfbWVtYmVyc18gPSBmYWxzZTsKKyAgICBub2NhbWVsX3N0eWxlXyA9IGZhbHNlOworICAgIGZ1bGxjYW1lbF9zdHlsZV8gPSBmYWxzZTsKKyAgICBhbmRyb2lkX2xlZ2FjeV8gPSBmYWxzZTsKKyAgICBzb3J0ZWRfY29udGFpbmVyc18gPSBmYWxzZTsKKyAgICBqYXZhNV8gPSBmYWxzZTsKKyAgICByZXVzZV9vYmplY3RzXyA9IGZhbHNlOworICAgIHVzZV9vcHRpb25fdHlwZV8gPSBmYWxzZTsKKyAgICB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gID0gZmFsc2U7CisgICAgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyA9IGZhbHNlOworICAgIHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfID0gZmFsc2U7CisgICAgdW5zYWZlX2JpbmFyaWVzXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImJlYW5zIikgPT0gMCkgeworICAgICAgICBiZWFuX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFuZHJvaWQiKSA9PSAwKSB7CisgICAgICAgIGFuZHJvaWRfc3R5bGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJpdmF0ZS1tZW1iZXJzIikgPT0gMCkgeworICAgICAgICBwcml2YXRlX21lbWJlcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9jYW1lbCIpID09IDApIHsKKyAgICAgICAgbm9jYW1lbF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJmdWxsY2FtZWwiKSA9PSAwKSB7CisgICAgICAgIGZ1bGxjYW1lbF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJhbmRyb2lkX2xlZ2FjeSIpID09IDApIHsKKyAgICAgICAgYW5kcm9pZF9sZWdhY3lfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic29ydGVkX2NvbnRhaW5lcnMiKSA9PSAwKSB7CisgICAgICAgIHNvcnRlZF9jb250YWluZXJzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImphdmE1IikgPT0gMCkgeworICAgICAgICBqYXZhNV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZXVzZS1vYmplY3RzIikgPT0gMCkgeworICAgICAgICByZXVzZV9vYmplY3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9wdGlvbl90eXBlIikgPT0gMCkgeworICAgICAgICB1c2Vfb3B0aW9uX3R5cGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9ucyIpID09IDApIHsKKyAgICAgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJnZW5lcmF0ZWRfYW5ub3RhdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGlmKCBpdGVyLT5zZWNvbmQuY29tcGFyZSgidW5kYXRlZCIpID09IDApIHsKKyAgICAgICAgICB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmKGl0ZXItPnNlY29uZC5jb21wYXJlKCJzdXBwcmVzcyIpID09IDApIHsKKyAgICAgICAgICBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gamF2YToiICsgaXRlci0+Zmlyc3QgKyAiPSIgKyBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidW5zYWZlX2JpbmFyaWVzIikgPT0gMCkgeworICAgICAgICB1bnNhZmVfYmluYXJpZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqYXZhOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoamF2YTVfKSB7CisgICAgICBhbmRyb2lkX2xlZ2FjeV8gPSB0cnVlOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAoYmVhbl9zdHlsZV8gPyAiZ2VuLWphdmFiZWFuIiA6ICJnZW4tamF2YSIpOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4KTsKKyAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfc2NoZW1lX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3N0cmVhbSYgb3V0KTsKKworICB2b2lkIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG9zdHJlYW0mIG91dCk7CisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmogPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKworICBlbnVtIGlzc2V0X3R5cGUgeyBJU1NFVF9OT05FLCBJU1NFVF9QUklNSVRJVkUsIElTU0VUX0JJVFNFVCB9OworICBpc3NldF90eXBlIG5lZWRzX2lzc2V0KHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyogb3V0UHJpbWl0aXZlVHlwZSA9IE5VTEwpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9zdXBwcmVzc2lvbnMoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VfbmFtZXNwYWNlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgY29tbWVudCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyBhc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfZW51bSgpOworICB9CisKKyAgYm9vbCBpc19kZXByZWNhdGVkKGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGFubm90YXRpb25zKSB7CisgICAgcmV0dXJuIGFubm90YXRpb25zLmZpbmQoImRlcHJlY2F0ZWQiKSAhPSBhbm5vdGF0aW9ucy5lbmQoKTsKKyAgfQorCisgIGJvb2wgaXNfZW51bV9zZXQodF90eXBlKiB0dHlwZSkgeworICAgIGlmICghc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgICAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gZ2V0X3RydWVfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgICByZXR1cm4gZWxlbV90eXBlLT5pc19lbnVtKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaXNfZW51bV9tYXAodF90eXBlKiB0dHlwZSkgeworICAgIGlmICghc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIGtleV90eXBlLT5pc19lbnVtKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGlubmVyX2VudW1fdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgIHJldHVybiB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUpICsgIi5jbGFzcyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gZ2V0X3RydWVfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgcmV0dXJuIHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUpICsgIi5jbGFzcyI7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisKKyAgYm9vbCBiZWFuX3N0eWxlXzsKKyAgYm9vbCBhbmRyb2lkX3N0eWxlXzsKKyAgYm9vbCBwcml2YXRlX21lbWJlcnNfOworICBib29sIG5vY2FtZWxfc3R5bGVfOworICBib29sIGZ1bGxjYW1lbF9zdHlsZV87CisgIGJvb2wgYW5kcm9pZF9sZWdhY3lfOworICBib29sIGphdmE1XzsKKyAgYm9vbCBzb3J0ZWRfY29udGFpbmVyc187CisgIGJvb2wgcmV1c2Vfb2JqZWN0c187CisgIGJvb2wgdXNlX29wdGlvbl90eXBlXzsKKyAgYm9vbCB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc187CisgIGJvb2wgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXzsKKyAgYm9vbCByZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zXzsKKyAgYm9vbCB1bnNhZmVfYmluYXJpZXNfOworCit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisKKyAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICB9CisgIGlmIChkaXIuc2l6ZSgpID4gMCkgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgIH0KKworICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Cit9CisKKy8qKgorICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCisgKgorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7CisgIH0KKyAgcmV0dXJuICIiOworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9zdXBwcmVzc2lvbnMoKSB7CisgIHJldHVybiAiQFN1cHByZXNzV2FybmluZ3Moe1wiY2FzdFwiLCBcInJhd3R5cGVzXCIsIFwic2VyaWFsXCIsIFwidW5jaGVja2VkXCIsIFwidW51c2VkXCJ9KVxuIjsKK30KKworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIHsKKyAgcmV0dXJuICJAb3JnLmFwYWNoZS50aHJpZnQuYW5ub3RhdGlvbi5OdWxsYWJsZSI7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBKYXZhCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSmF2YSwgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRlbnVtLT5hbm5vdGF0aW9uc18pOworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKKworICBpZiAoIXN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18pIHsKKyAgICBnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihmX2VudW0pOworICB9CisKKyAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX2VudW0gPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKyAgICBpZiAodGhpcy0+aXNfZGVwcmVjYXRlZCgoKmNfaXRlciktPmFubm90YXRpb25zXykpIHsKKyAgICAgIGluZGVudChmX2VudW0pIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB2YWx1ZSA8PCAiKSI7CisgIH0KKyAgZl9lbnVtIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgImNhc2UgIiA8PCB2YWx1ZSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAnLycgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUocHJvZ3JhbV9uYW1lXykKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJDb25zdGFudHMuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKKworICBmX2NvbnN0cyA8PCAicHVibGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9jb25zdHMsICgqY19pdGVyKSk7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogInB1YmxpYyBzdGF0aWMgZmluYWwgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgdW5zb3J0ZWRfZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPiBmaWVsZHMgPSB1bnNvcnRlZF9maWVsZHM7CisgICAgc3RkOjpzb3J0KGZpZWxkcy5iZWdpbigpLCBmaWVsZHMuZW5kKCksIHRfZmllbGQ6OmtleV9jb21wYXJlKCkpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOworICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIG91dCA8PCAic2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmdzOworICAgIGlmIChpc19lbnVtX21hcCh0eXBlKSkgeworICAgICAgY29uc3RydWN0b3JfYXJncyA9IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIGlmIChpc19lbnVtX3NldCh0eXBlKSkgeworICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZigiIDw8IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXggPSB0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisgICAgaWYgKG5hbWVzcGFjZV9wcmVmaXgubGVuZ3RoKCkgPiAwKSB7CisgICAgICBuYW1lc3BhY2VfcHJlZml4ICs9ICIuIjsKKyAgICB9CisgICAgcmVuZGVyIDw8IG5hbWVzcGFjZV9wcmVmaXggPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX3dpdGhfcGFyZW50KCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZQorICogaW1wbGVtZW50b3IuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgZ2VuZXJhdGVfamF2YV91bmlvbih0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7CisgIH0KK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKKy8qKgorICogSmF2YSB1bmlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgYm9vbCBpc19kZXByZWNhdGVkID0gdGhpcy0+aXNfZGVwcmVjYXRlZCh0c3RydWN0LT5hbm5vdGF0aW9uc18pOworCisgIGlmICghc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKGZfc3RydWN0KTsKKyAgfQorCisgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgaW5kZW50KGZfc3RydWN0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc3RydWN0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5UVW5pb248IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuX0ZpZWxkcz4gIjsKKworICBzY29wZV91cChmX3N0cnVjdCk7CisKKyAgZ2VuZXJhdGVfc3RydWN0X2Rlc2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3N0cnVjdCk7CisKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZGVmYXVsdF92YWx1ZSA9IGZhbHNlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdXBlcihfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGRlZmF1bHRfdmFsdWUgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChkZWZhdWx0X3ZhbHVlID09IGZhbHNlKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKF9GaWVsZHMgc2V0RmllbGQsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKHZhbHVlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIoYnl0ZVtdIHZhbHVlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXykgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZSkpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZS5jbG9uZSgpKSk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworICAgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQoZmllbGQtPmFubm90YXRpb25zXyk7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYnl0ZVtdIGdldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIob3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIucmlnaHRTaXplKGJ1ZmZlciIKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpKSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgamF2YS5uaW8uQnl0ZUJ1ZmZlciBiID0gYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYiA9PSBudWxsID8gbnVsbCA6IGIuYXJyYXkoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS5uaW8uQnl0ZUJ1ZmZlciBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICIgICAgcmV0dXJuIChqYXZhLm5pby5CeXRlQnVmZmVyKWdldEZpZWxkVmFsdWUoKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICIgICAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoKGphdmEubmlvLkJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGdldCIKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiAoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUpIDw8ICIpZ2V0RmllbGRWYWx1ZSgpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihieXRlW10gdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAodmFsdWUpKTsiIDw8IGVuZGw7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAodmFsdWUuY2xvbmUoKSkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCkgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gc2V0RmllbGRfID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIF9GaWVsZHMgZW51bUZvcklkKHNob3J0IGlkKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZE9yVGhyb3coaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpCisgICAgICA8PCAicHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKF9GaWVsZHMgc2V0RmllbGQsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHRocm93cyBqYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24oXCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgZm9yIGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIicsIGJ1dCBnb3QgXCIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7IiA8PCBlbmRsOworICAgIC8vIGRvIHRoZSByZWFsIGNoZWNrIGhlcmUKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCBzdGFuZGFyZFNjaGVtZVJlYWRWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgIgorICAgICAgICAgICAgICAgICAiaXByb3QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBmaWVsZCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGQuaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MudHlwZSkgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55ICIKKyAgICAgICAgICAgICAgICAgIm9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCBzdGFuZGFyZFNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sICIKKyAgICAgICAgICAgICAgICAgIm9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyAiCisgICAgICAgICAgICAgICAgICJzZXRGaWVsZF8pOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHR1cGxlU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCisgICAgICAgICAgICAgICAgICJpcHJvdCwgc2hvcnQgZmllbGRJRCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJRCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgIgorICAgICAgICAgICAgICAgICAib2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiQ291bGRuJ3QgZmluZCBhIGZpZWxkIHdpdGggZmllbGQgaWQgXCIgKyBmaWVsZElEKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgdHVwbGVTY2hlbWVXcml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgIgorICAgICAgICAgICAgICAgICAidGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZF8pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9ICgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgIgorICAgICAgICAgICAgICAgICAic2V0RmllbGRfKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBlcXVhbGl0eQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKGphdmEubGFuZy5PYmplY3Qgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBlcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKW90aGVyKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvdGhlciAhPSBudWxsICYmIGdldFNldEZpZWxkKCkgPT0gb3RoZXIuZ2V0U2V0RmllbGQoKSAmJiAiCisgICAgICAgICAgICAgICAgICJnZXRGaWVsZFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGludCBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRTZXRGaWVsZCgpLCAiCisgICAgICAgICAgICAgICAgICJvdGhlci5nZXRTZXRGaWVsZCgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiA9PSAwKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0RmllbGRWYWx1ZSgpLCAiCisgICAgICAgICAgICAgICAgICJvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuT2JqZWN0PiBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8amF2YS5sYW5nLk9iamVjdD4oKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGxpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHNldEZpZWxkID0gZ2V0U2V0RmllbGQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGxpc3QuYWRkKHNldEZpZWxkLmdldFRocmlmdEZpZWxkSWQoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGphdmEubGFuZy5PYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgICAgbGlzdC5hZGQoKChvcmcuYXBhY2hlLnRocmlmdC5URW51bSlnZXRGaWVsZFZhbHVlKCkpLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICAgIGxpc3QuYWRkKHZhbHVlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IjsKK30KKworLyoqCisgKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CisKKyAgaWYgKCFpbl9jbGFzcyAmJiAhc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG91dCk7CisgIH0KKworICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiAiOworICB9CisgIG91dCA8PCAiaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiI7CisKKyAgaWYgKGFuZHJvaWRfc3R5bGVfKSB7CisgICAgb3V0IDw8ICIsIGFuZHJvaWQub3MuUGFyY2VsYWJsZSI7CisgIH0KKworICBvdXQgPDwgIiAiOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKKworICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1qYXZhLCBwcml2YXRlIGZvciAtamF2YWJlYW4KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3NjaGVtZV9tYXAob3V0LCB0c3RydWN0KTsKKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKGJlYW5fc3R5bGVfIHx8IHByaXZhdGVfbWVtYmVyc18pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgfQorICAgIG91dCA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCB0cnVlKSA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKGFuZHJvaWRfc3R5bGVfKSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKKworICAvLyBpc3NldCBkYXRhCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKKworICAgIGludCBpID0gMDsKKyAgICBpbnQgb3B0aW9uYWxzID0gMDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBvcHRpb25hbHMrKzsKKyAgICAgIH0KKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIiA8PCBpc3NldF9maWVsZF9pZCgqbV9pdGVyKSA8PCAiID0gIiA8PCBpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcHJpbWl0aXZlVHlwZTsKKyAgICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZwcmltaXRpdmVUeXBlKSkgeworICAgIGNhc2UgSVNTRVRfTk9ORToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBwcmltaXRpdmVUeXBlIDw8ICIgX19pc3NldF9iaXRmaWVsZCA9IDA7IiA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJU1NFVF9CSVRTRVQ6CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBqYXZhLnV0aWwuQml0U2V0IF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBqYXZhLnV0aWwuQml0U2V0KCIgPDwgaSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAob3B0aW9uYWxzID4gMCkgeworICAgICAgc3RkOjpzdHJpbmcgb3V0cHV0X3N0cmluZyA9ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0geyI7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgICAgb3V0cHV0X3N0cmluZyA9IG91dHB1dF9zdHJpbmcgKyAiX0ZpZWxkcy4iICsgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpICsgIiwiOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCBvdXRwdXRfc3RyaW5nLnN1YnN0cigwLCBvdXRwdXRfc3RyaW5nLmxlbmd0aCgpIC0gMSkgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOworCisgIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7CisgICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSwgIiIpOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIGNvcHkgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCkpIHsKKyAgY2FzZSBJU1NFVF9OT05FOgorICAgIGJyZWFrOworICBjYXNlIElTU0VUX1BSSU1JVElWRToKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IG90aGVyLl9faXNzZXRfYml0ZmllbGQ7IiA8PCBlbmRsOworICAgIGJyZWFrOworICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iub3Iob3RoZXIuX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7CisgICAgYnJlYWs7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodHlwZSk7CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsICJvdGhlciIsIGZpZWxkX25hbWUsICJfX3RoaXNfXyIgKyBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gX190aGlzX18iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgIm90aGVyLiIgKyBmaWVsZF9uYW1lLCBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNsb25lIG1ldGhvZCwgc28gdGhhdCB5b3UgY2FuIGRlZXAgY29weSBhbiBvYmplY3Qgd2hlbiB5b3UgZG9uJ3Qga25vdyBpdHMgY2xhc3MuCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3V0KTsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIGdlbmVyYXRlcyBwYXJjZWxhYmxlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgdG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgc3RyaW5nIGJpdHNldFByaW1pdGl2ZVR5cGUgPSAiIjsKKyAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0LCAmYml0c2V0UHJpbWl0aXZlVHlwZSkpIHsKKyAgY2FzZSBJU1NFVF9OT05FOgorICAgIGJyZWFrOworICBjYXNlIElTU0VUX1BSSU1JVElWRToKKyAgICBpbmRlbnQob3V0KSA8PCAiLy9wcmltaXRpdmUgYml0ZmllbGQgb2YgdHlwZTogIiA8PCBiaXRzZXRQcmltaXRpdmVUeXBlIDw8IGVuZGw7CisgICAgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImJ5dGUiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZShfX2lzc2V0X2JpdGZpZWxkKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJzaG9ydCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQobmV3IFNob3J0KF9faXNzZXRfYml0ZmllbGQpLmludFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gImludCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoX19pc3NldF9iaXRmaWVsZCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAibG9uZyIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMb25nKF9faXNzZXRfYml0ZmllbGQpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgIGluZGVudChvdXQpIDw8ICIvL0JpdFNldCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlU2VyaWFsaXphYmxlKF9faXNzZXRfYml0X3ZlY3Rvcik7IiA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworICAgIGJyZWFrOworICB9CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVQYXJjZWxhYmxlKCIgPDwgbmFtZSA8PCAiLCBmbGFncyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHlwZV9uYW1lKHQpID09ICJmbG9hdCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVGbG9hdCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiICE9IG51bGwgPyAiIDw8IG5hbWUgPDwgIi5nZXRWYWx1ZSgpIDogLTEpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgaWYgKCgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVUeXBlZExpc3QoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMaXN0KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZU1hcCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIGlmICh0LT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiIT1udWxsID8gMSA6IDApOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmKCIgPDwgbmFtZSA8PCAiICE9IG51bGwpIHsgIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGVBcnJheSgiIDw8IG5hbWUgPDwgIi5hcnJheSgpLCAiIDw8IG5hbWUgPDwgIi5wb3NpdGlvbigpICsgIgorICAgICAgICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIuYXJyYXlPZmZzZXQoKSwgIiA8PCBuYW1lIDw8ICIubGltaXQoKSAtICIgPDwgbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiLnBvc2l0aW9uKCkgKTsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChuZXcgU2hvcnQoIiA8PCBuYW1lIDw8ICIpLmludFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTG9uZygiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRuYW1lIDw8ICIoYW5kcm9pZC5vcy5QYXJjZWwgaW4pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAvLyByZWFkIGluIHRoZSByZXF1aXJlZCBiaXRmaWVsZAorICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZiaXRzZXRQcmltaXRpdmVUeXBlKSkgeworICBjYXNlIElTU0VUX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgIGluZGVudChvdXQpIDw8ICIvL3ByaW1pdGl2ZSBiaXRmaWVsZCBvZiB0eXBlOiAiIDw8IGJpdHNldFByaW1pdGl2ZVR5cGUgPDwgZW5kbDsKKyAgICBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiYnl0ZSIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gaW4ucmVhZEJ5dGUoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJzaG9ydCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gKHNob3J0KSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiaW50IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAibG9uZyIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gaW4ucmVhZExvbmcoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICAgIGJyZWFrOworICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICBpbmRlbnQob3V0KSA8PCAiLy9CaXRTZXQiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3RvciA9IChqYXZhLnV0aWwuQml0U2V0KSBpbi5yZWFkU2VyaWFsaXphYmxlKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworICAgIGJyZWFrOworICB9CisgIC8vIHJlYWQgYWxsIHRoZSBmaWVsZHMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgcHJlZml4ID0gInRoaXMuIiArIG5hbWU7CisKKyAgICBpZiAodC0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiPSBpbi5yZWFkUGFyY2VsYWJsZSgiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0KSA8PCAiLmZpbmRCeVZhbHVlKGluLnJlYWRJbnQoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICB0X2xpc3QqIGxpc3QgPSAodF9saXN0Kil0OworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodCwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICBpZiAobGlzdC0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpbi5yZWFkVHlwZWRMaXN0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIi5DUkVBVE9SKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaW4ucmVhZExpc3QoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCB0bmFtZSA8PCAiLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0LCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgaW4ucmVhZE1hcCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR5cGVfbmFtZSh0KSA9PSAiZmxvYXQiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRGbG9hdCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZSogYnQgPSAodF9iYXNlX3R5cGUqKXQ7CisgICAgICBpZiAoYnQtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZihpbi5yZWFkSW50KCk9PTEpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcChpbi5jcmVhdGVCeXRlQXJyYXkoKSk7IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGJ0LT5nZXRfYmFzZSgpKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gKHNob3J0KSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZExvbmcoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IChpbi5yZWFkSW50KCk9PTEpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRCeXRlKCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWREb3VibGUoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiPSBpbi5yZWFkU3RyaW5nKCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPCIgPDwgdG5hbWUKKyAgICAgICAgICAgICAgPDwgIj4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjwiIDw8IHRuYW1lIDw8ICI+KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgdG5hbWUgPDwgIltdIG5ld0FycmF5KGludCBzaXplKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0bmFtZSA8PCAiW3NpemVdOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZQorICAgICAgICAgICAgICA8PCAiIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgaW4pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRuYW1lIDw8ICIoaW4pOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGVxdWFscyBtZXRob2RzIGFuZCBhIGhhc2hDb2RlIG1ldGhvZCBmb3IgYSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKGphdmEubGFuZy5PYmplY3QgdGhhdCkgeyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcyA9PSB0aGF0KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiICA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKKyAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgorICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKKyAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB1bmVxdWFsOworCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKKyAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoYXRfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiCisgICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmICh0LT5pc19iaW5hcnkoKSkgeworICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7CisgICAgfSBlbHNlIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHVuZXF1YWwgPSAidGhpcy4iICsgbmFtZSArICIgIT0gdGhhdC4iICsgbmFtZTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHVuZXF1YWwgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBjb25zdCBpbnQgTVVMID0gODE5MTsgLy8gSGFzaENvZGUgbXVsdGlwbGllcgorICBjb25zdCBpbnQgQl9ZRVMgPSAxMzEwNzE7CisgIGNvbnN0IGludCBCX05PID0gNTI0Mjg3OworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaW50IGhhc2hDb2RlID0gMTsiIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dCA8PCBlbmRsOworCisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAoKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcikKKyAgICAgICAgICAgICAgICAgIDw8ICIpID8gIiA8PCBCX1lFUyA8PCAiIDogIiA8PCBCX05PIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpICsgIikiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAiIDw8IG5hbWUgPDwgIi5nZXRWYWx1ZSgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBzd2l0Y2goKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAiIDw8IG5hbWUgPDwgIi5oYXNoQ29kZSgpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICgoIiA8PCBuYW1lIDw8ICIpID8gIgorICAgICAgICAgICAgICAgICAgICA8PCBCX1lFUyA8PCAiIDogIiA8PCBCX05PIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAoaW50KSAoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImhhc2hDb2RlID0gaGFzaENvZGUgKiAiIDw8IE1VTCA8PCAiICsgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuaGFzaENvZGUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBhIHN0cnVjdCBmaWVsZCBjYW5ub3QgYmUgdm9pZCIpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiY29tcGlsZXIgZXJyb3I6IHRoZSBmb2xsb3dpbmcgYmFzZSB0eXBlIGhhcyBubyBoYXNoY29kZSBnZW5lcmF0b3I6ICIgKworICAgICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiLmhhc2hDb2RlKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBoYXNoQ29kZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImludCBsYXN0Q29tcGFyaXNvbiA9IDA7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJsYXN0Q29tcGFyaXNvbiA9IGphdmEubGFuZy5Cb29sZWFuLnZhbHVlT2YoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkKKyAgICAgICAgICAgICAgICA8PCAiKS5jb21wYXJlVG8ob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIgorICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIG90aGVyLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyAiCisgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic2NoZW1lKGlwcm90KS5yZWFkKGlwcm90LCB0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCisvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgaXMgdW5zZXQhIFN0cnVjdDpcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpICYmICEoKHRfc3RydWN0Kil0eXBlKS0+aXNfdW5pb24oKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIudmFsaWRhdGUoKTsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzY2hlbWUob3Byb3QpLndyaXRlKG9wcm90LCB0aGlzKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAorICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCisgKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQorICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyAiCisgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic2NoZW1lKG9wcm90KS53cml0ZShvcHJvdCwgdGhpcyk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCAodHlwZS0+aXNfYm9vbCgpID8gImlzIiA6ICJnZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgIGNvbnN0IGJvb2wgaXNfYmluYXJ5ID0gdHlwZS0+aXNfYmluYXJ5KCk7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGlmIChpc19iaW5hcnkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoYnl0ZVtdKXZhbHVlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWUpOyIgPDwgZW5kbDsKKyAgaWYgKGlzX2JpbmFyeSkgeworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07CisKKyAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIHNldHRlcgorCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsICIgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkKKyAgICAgICAgICAgICAgPDwgIiBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOworICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSAiCisgICAgICAgICAgICAgICAgICJ2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkID09IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXQgb2YgSmF2YSBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKKyAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlzc2V0X3R5cGUgaXNzZXRUeXBlID0gbmVlZHNfaXNzZXQodHN0cnVjdCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworICAgIGJvb2wgb3B0aW9uYWwgPSB1c2Vfb3B0aW9uX3R5cGVfICYmIGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKGZpZWxkLT5hbm5vdGF0aW9uc18pOworCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb248SW50ZWdlcj4gZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIgorICAgICAgICAgICAgICAgICAgICA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5zaXplKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0KKworICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cworICAgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uPGphdmEudXRpbC5JdGVyYXRvcjwiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUsIHRydWUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICA8PCAiPj4gZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbi5ub25lKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbi5zb21lKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXRlcmF0b3IoKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIDw8ICI+IGdldCIgPDwgY2FwX25hbWU7CisgICAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoIml0ZXJhdG9yKCkgeyIpIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIgorICAgICAgICAgICAgICAgICAgICA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5pdGVyYXRvcigpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKKyAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWU7CisgICAgICBpZiAoaXNfZW51bV9zZXQodHlwZSkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSkgPDwgIi5ub25lT2YoIiA8PCBpbm5lcl9lbnVtX3R5cGVfbmFtZSh0eXBlKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZChlbGVtKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAvLyBQdXQgdG8gbWFwCisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHB1dCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOworICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoa2V5X3R5cGUpIDw8ICIga2V5LCAiIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSkgPDwgIiB2YWwpIHsiCisgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfYXJnczsKKyAgICAgIGlmIChpc19lbnVtX21hcCh0eXBlKSkgeworICAgICAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigiIDw8IGNvbnN0cnVjdG9yX2FyZ3MgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBieXRlW10gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIihvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5yaWdodFNpemUoIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiKSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyBudWxsIDogIiA8PCBmaWVsZF9uYW1lIDw8ICIuYXJyYXkoKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGJ1ZmZlciIgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKSA8PCBjYXBfbmFtZSA8PCAiKCkgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgZmllbGRfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH1lbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvcHRpb25hbCkgeworICAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbjwiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiPiI7CisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICAgICAgb3V0IDw8ICIgaXMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiIGdldCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuaXNTZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbi5ub25lKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgeworICAgICAgICAgIG91dCA8PCAiIGlzIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiBnZXQiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiOworICAgICAgaWYgKGJlYW5fc3R5bGVfKSB7CisgICAgICAgIG91dCA8PCAidm9pZCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOworICAgICAgfQorICAgICAgb3V0IDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKGJ5dGVbXSAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsID8gKGphdmEubmlvLkJ5dGVCdWZmZXIpbnVsbCI7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiIDogamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKCIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiA6IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCgiIDw8IGZpZWxkX25hbWUgPDwgIi5jbG9uZSgpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICAgICAgICAgICAgIAorICAgICAgaWYgKCFiZWFuX3N0eWxlXykgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gdGhpczsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgaWYgKGJlYW5fc3R5bGVfKSB7CisgICAgICBvdXQgPDwgInZvaWQiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOworICAgIH0KKyAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSA/IChqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSArICIgIikgOiAiIikKKyAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSAmJiAhdW5zYWZlX2JpbmFyaWVzXykgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgZmllbGRfbmFtZSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBmaWVsZF9uYW1lOworICAgIH0KKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQsICIiKTsKKyAgICBpZiAoIWJlYW5fc3R5bGVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXM7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCAiCisgICAgICAgICAgICAgICAgICA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7CisgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCAiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKQorICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9faXNzZXRfYml0X3ZlY3Rvci5nZXQoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBjYXBfbmFtZSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihib29sZWFuIHZhbHVlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsICIKKyAgICAgICAgICAgICAgICAgIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiLCB2YWx1ZSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLnNldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiLCB2YWx1ZSk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJqYXZhLmxhbmcuU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gZmlyc3QgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKCFmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHNiLmFwcGVuZChcIiwgXCIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCIpOyIgPDwgZW5kbDsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2IuYXBwZW5kKFwibnVsbFwiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19zZXQoKSkKKyAgICAgICAgICAgICAgICYmIChnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKWZpZWxkLT5nZXRfdHlwZSgpKS0+Z2V0X2VsZW1fdHlwZSgpKS0+aXNfYmluYXJ5KCkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19saXN0KCkpCisgICAgICAgICAgICAgICAmJiAoZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpLT5pc19iaW5hcnkoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuYXBwZW5kKFwiKVwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCisgKiBmaWVsZE5hbWUgbWFwcGluZworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSBtYXBwaW5ncworICBpbmRlbnQob3V0KQorICAgICAgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLk1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiamF2YS51dGlsLk1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgImphdmEudXRpbC5FbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gUG9wdWxhdGUgbWFwCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidG1wTWFwLnB1dChfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKQorICAgICAgICAgICAgICAgIDw8ICIsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YShcIiIgPDwgZmllbGRfbmFtZSA8PCAiXCIsICI7CisKKyAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQorICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAiOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdmFsdWUgbWV0YSBkYXRhCisgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOworICAgIG91dCA8PCAiKSk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5jbGFzcywgbWV0YURhdGFNYXApOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7CisgICAgICByZXR1cm4gIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyAiCisgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS4iCisgICAgICAgICAgICAgICAgICAgIlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkxpc3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TZXRNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5NYXBNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KQorICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5FbnVtTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSwgIgorICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKCIKKyAgICAgICAgICAgICAgICA8PCBnZXRfamF2YV90eXBlX3N0cmluZyh0eXBlKTsKKyAgICBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLCBcIiIgPDwgKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfc3ltYm9saWMoKSA8PCAiXCIiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIHRydWUiOworICAgIH0KKyAgfQorICBvdXQgPDwgIikiOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCisgKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKKyAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUoc2VydmljZV9uYW1lXykgKyAiLmphdmEiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOworCisgIGlmICghc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKGZfc2VydmljZV8pOworICB9CisgIGZfc2VydmljZV8gPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIiAuQXN5bmNJZmFjZSI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIEFzeW5jSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGV4dGVuZHNfY2xpZW50ID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50IjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50IGV4dGVuZHMgIiA8PCBleHRlbmRzX2NsaWVudAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIElmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50RmFjdG9yeTxDbGllbnQ+IHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgRmFjdG9yeSgpIHt9IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSB7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBDbGllbnQocHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzdXBlcihwcm90LCBwcm90KTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzZXAgPSAiXyI7CisgICAgc3RyaW5nIGphdmFuYW1lID0gZnVubmFtZTsKKyAgICBpZiAoZnVsbGNhbWVsX3N0eWxlXykgeworICAgICAgc2VwID0gIiI7CisgICAgICBqYXZhbmFtZSA9IGFzX2NhbWVsX2Nhc2UoZnVubmFtZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kIiA8PCBzZXAgPDwgamF2YW5hbWUgPDwgIigiOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdiIgPDwgc2VwIDw8IGphdmFuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmQiKSArIHNlcCArIGphdmFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGNvbnN0IHN0cmluZyBzZW5kQmFzZU5hbWUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gInNlbmRCYXNlT25ld2F5IiA6ICJzZW5kQmFzZSI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHNlbmRCYXNlTmFtZSA8PCAiKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgYXJncyk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3YiKSArIHNlcCArIGphdmFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZWNlaXZlQmFzZShyZXN1bHQsIFwiIiA8PCBmdW5uYW1lIDw8ICJcIik7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgIi5Bc3luY0NsaWVudCI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBBc3luY0lmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEZhY3RvcnkgbWV0aG9kCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudEZhY3Rvcnk8QXN5bmNDbGllbnQ+IHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcml2YXRlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgY2xpZW50TWFuYWdlcjsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJpdmF0ZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEZhY3Rvcnkob3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50TWFuYWdlciwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2xGYWN0b3J5KSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLmNsaWVudE1hbmFnZXIgPSBjbGllbnRNYW5hZ2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgdGhpcy5wcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHB1YmxpYyBBc3luY0NsaWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0QXN5bmNDbGllbnQob3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0KSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICByZXR1cm4gbmV3IEFzeW5jQ2xpZW50KHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2xGYWN0b3J5LCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihwcm90b2NvbEZhY3RvcnksIGNsaWVudE1hbmFnZXIsIHRyYW5zcG9ydCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2VwID0gIl8iOworICAgIHN0cmluZyBqYXZhbmFtZSA9IGZ1bm5hbWU7CisgICAgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICAgIHNlcCA9ICIiOworICAgICAgamF2YW5hbWUgPSBhc19jYW1lbF9jYXNlKGphdmFuYW1lKTsKKyAgICB9CisgICAgdF90eXBlKiByZXRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgZnVuY2xhc3NuYW1lID0gZnVubmFtZSArICJfY2FsbCI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBhcmdzX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0cmluZyByZXN1bHRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICAgIC8vIE1haW4gbWV0aG9kIGJvZHkKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBjaGVja1JlYWR5KCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAiIDw8IGZ1bmNsYXNzbmFtZSA8PCAiIG1ldGhvZF9jYWxsID0gbmV3ICIgKyBmdW5jbGFzc25hbWUgKyAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgdGhpcywgX19fcHJvdG9jb2xGYWN0b3J5LCBfX190cmFuc3BvcnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgdGhpcy5fX19jdXJyZW50TWV0aG9kID0gbWV0aG9kX2NhbGw7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBfX19tYW5hZ2VyLmNhbGwobWV0aG9kX2NhbGwpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBUQXN5bmNNZXRob2Qgb2JqZWN0IGZvciB0aGlzIGZ1bmN0aW9uIGNhbGwKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiArIGZ1bmNsYXNzbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsPCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKSArICI+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBNZW1iZXIgdmFyaWFibGVzCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSAiICsgdHlwZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgKyAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBOT1RFIHNpbmNlIHdlIHVzZSBhIG5ldyBDbGllbnQgaW5zdGFuY2UgdG8gZGVzZXJpYWxpemUsIGxldCdzIGtlZXAgc2VxaWQgdG8gMCBmb3Igbm93CisgICAgLy8gaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIGludCBzZXFpZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIENvbnN0cnVjdG9yCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIGZ1bmNsYXNzbmFtZSArICIoIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIGFzeW5jX2FyZ3VtZW50X2xpc3QoKmZfaXRlciwgYXJnX3N0cnVjdCwgcmV0X3R5cGUsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCBjbGllbnQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoY2xpZW50LCBwcm90b2NvbEZhY3RvcnksIHRyYW5zcG9ydCwgcmVzdWx0SGFuZGxlciwgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIEFzc2lnbiBtZW1iZXIgdmFyaWFibGVzCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLiIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSAiICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCB3cml0ZV9hcmdzKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gU2VyaWFsaXplIHJlcXVlc3QKKyAgICAvLyBOT1RFIHdlIGFyZSBsZWF2aW5nIHNlcWlkIGFzIDAsIGZvciBub3cgKHNlZSBhYm92ZSkKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIlwiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4iCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpIDw8ICIsIDApKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NfbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzX25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUocHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gUmV0dXJuIG1ldGhvZAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgKyB0eXBlX25hbWUocmV0X3R5cGUsIHRydWUpICsgIiBnZXRSZXN1bHQoKSB0aHJvd3MgIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmIChnZXRTdGF0ZSgpICE9IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwuU3RhdGUuUkVTUE9OU0VfUkVBRCkgeyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIk1ldGhvZCBjYWxsIG5vdCBmaW5pc2hlZCFcIik7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbW9yeVRyYW5zcG9ydCA9IG5ldyAiCisgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0KGdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudC5nZXRQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbChtZW1vcnlUcmFuc3BvcnQpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7CisgICAgaWYgKHJldF90eXBlLT5pc192b2lkKCkpIHsgLy8gTkI6IEluY2x1ZGVzIG9uZXdheXMgd2hpY2ggYWx3YXlzIHJldHVybiB2b2lkLgorICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gKG5ldyBDbGllbnQocHJvdCkpLnJlY3YiICsgc2VwICsgamF2YW5hbWUgKyAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDbG9zZSBBc3luY0NsaWVudAorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZVByb2Nlc3NvcjxJPiI7CisgIH0gZWxzZSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3I8ST4iOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3I8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5zbGY0ai5Mb2dnZXIgX0xPR0dFUiA9IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJIGlmYWNlKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaWZhY2UsIGdldFByb2Nlc3NNYXAobmV3IGphdmEudXRpbC5IYXNoTWFwPGphdmEubGFuZy5TdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+KCkpKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIFByb2Nlc3NvcihJIGlmYWNlLCBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gIgorICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChwcm9jZXNzTWFwKSk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgSWZhY2U+IGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gIgorICAgICAgICAgICAgICAgICAgICAgICAgImdldFByb2Nlc3NNYXAoamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiBwcm9jZXNzTWFwKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NNYXAucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcHJvY2Vzc01hcDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUFzeW5jUHJvY2Vzc29yPEk+IjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yPEk+IjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNQcm9jZXNzb3I8SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5zbGY0ai5Mb2dnZXIgX0xPR0dFUiA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXN5bmNQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxqYXZhLmxhbmcuU3RyaW5nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+KCkpKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIEFzeW5jUHJvY2Vzc29yKEkgaWZhY2UsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChwcm9jZXNzTWFwKSk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLD8+PiBnZXRQcm9jZXNzTWFwKGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc01hcC5wdXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBwcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19hc3luY19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19hc3luY19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXN1bHRuYW1lID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlIjsKKyAgfQorCisgIHN0cmluZyByZXN1bHR0eXBlID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgdHJ1ZSk7CisKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NuYW1lIDw8ICIsICIgPDwgcmVzdWx0dHlwZSA8PCAiPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgYXJnc25hbWUgPDwgIiBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiIDw8IHJlc3VsdHR5cGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgaW50IHNlcWlkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbiBmY2FsbCA9IHRoaXM7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiIDw8IHJlc3VsdHR5cGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI+KCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIG9uQ29tcGxldGUoIiA8PCByZXN1bHR0eXBlIDw8ICIgbykgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zdWNjZXNzID0gbzsiIDw8IGVuZGw7CisgICAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICAgIDw8ICIgIGZjYWxsLnNlbmRSZXNwb25zZShmYiwgcmVzdWx0LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFksc2VxaWQpOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIl9MT0dHRVIuZXJyb3IoXCJUVHJhbnNwb3J0RXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyXCIsIGUpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmYi5jbG9zZSgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXJcIiwgZSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9uRXJyb3IoZSk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIG9uRXJyb3IoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikgeyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJUVHJhbnNwb3J0RXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyXCIsIGUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiBpbnNpZGUgb25ld2F5IGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJieXRlIG1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6YWJsZSBtc2c7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGlmICh4X2l0ZXIgPT0geGNlcHRpb25zLmJlZ2luKCkpCisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgc3RyaW5nIHR5cGUgPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBzdHJpbmcgbmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKGUgaW5zdGFuY2VvZiAiIDw8IHR5cGUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGUgPDwgIikgZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKG5hbWUpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1zZyA9IHJlc3VsdDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlICI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiaWYgKGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJfTE9HR0VSLmVycm9yKFwiVFRyYW5zcG9ydEV4Y2VwdGlvbiBpbnNpZGUgaGFuZGxlclwiLCBlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmYi5jbG9zZSgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgeyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJfTE9HR0VSLmVycm9yKFwiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyXCIsIGUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuRVhDRVBUSU9OOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1zZyA9IChvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJFeGNlcHRpb24gaW5zaWRlIGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT047IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGZjYWxsLnNlbmRSZXNwb25zZShmYixtc2csbXNnVHlwZSxzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBleCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlclwiLCBleCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZmIuY2xvc2UoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgc3RhcnQoSSBpZmFjZSwgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBhcmdzLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQorICAgICAgICAgICAgICAgICAgICAgPDwgIj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworCisgIGZfc2VydmljZV8gPDwgImlmYWNlLiIgPDwgZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKCFmaXJzdCkKKyAgICBmX3NlcnZpY2VfIDw8ICIsIjsKKyAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0SGFuZGxlciI7CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSI7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJlc3VsdG5hbWUgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UiOworICB9CisKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gY2xhc3MKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIj4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGFyZ3NuYW1lIDw8ICIgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuICIgPDwgKCh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiByZXRocm93VW5oYW5kbGVkRXhjZXB0aW9ucygpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBnZXRSZXN1bHQoSSBpZmFjZSwgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBhcmdzKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZS4iIDw8IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJlc3VsdDsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgaGFzX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICBpZiAoaGFzX21ldGFkYXRhKSB7CisgICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmoKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmoKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCAiIDw8IG9iagorICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCBpcHJvdC5yZWFkSTMyKCkpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICBpZiAoaXNfZW51bV9zZXQodHR5cGUpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZiI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICAvLyBjb25zdHJ1Y3QgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5IGkuZS4gd2l0aCBhcHByb3ByaWF0ZSBzaXplL3R5cGUKKyAgaWYgKGlzX2VudW1fc2V0KHR0eXBlKSB8fCBpc19lbnVtX21hcCh0dHlwZSkpIHsKKyAgICBvdXQgPDwgIigiIDw8IGlubmVyX2VudW1fdHlwZV9uYW1lKHR0eXBlKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoc29ydGVkX2NvbnRhaW5lcnNfICYmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSkgeworICAgIC8vIFRyZWVTZXQgYW5kIFRyZWVNYXAgZG9uJ3QgaGF2ZSBhbnkgY29uc3RydWN0b3Igd2hpY2ggdGFrZXMgYSBjYXBhY2l0eSBhcyBhbiBhcmd1bWVudAorICAgIG91dCA8PCAiKCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiKCIgPDwgKHR0eXBlLT5pc19saXN0KCkgPyAiIiA6ICIyKiIpIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChyZXVzZV9vYmplY3RzXykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgsIG9iaiwgaGFzX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCwgb2JqLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCBvYmosIGhhc19tZXRhZGF0YSk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKGhhc19tZXRhZGF0YSkgeworICAgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXksIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCBoYXNfbWV0YWRhdGEpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCAiIiwgaGFzX21ldGFkYXRhKTsKKworICBpZiAoZ2V0X3RydWVfdHlwZShma2V5LmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwga2V5IDw8ICIgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKGdldF90cnVlX3R5cGUoZmtleS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZrZXkuZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwga2V5IDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShmdmFsLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IHZhbCA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZWxlbSA8PCAiICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtLCByZXVzZV9vYmplY3RzXywgZmFsc2UpIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgaGFzX21ldGFkYXRhKTsKKworICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGVsZW0gPDwgIiAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKGdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKHN0cnVjdC4iIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICBzY29wZV91cChvdXQpOworCisgIGlmIChoYXNfbWV0YWRhdGEpIHsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQoIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKGphdmEudXRpbC5NYXAuRW50cnk8IiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlcgorICAgICAgICAgICAgICAgIDw8ICIgOiAiIDw8IHByZWZpeCA8PCAiLmVudHJ5U2V0KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICA8PCBwcmVmaXggPDwgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgPDwgcHJlZml4IDw8ICIpIjsKKyAgfQorCisgIG91dCA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4LCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIsIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlciwgaGFzX21ldGFkYXRhKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKGhhc19tZXRhZGF0YSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICAodm9pZCltYXA7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi5nZXRLZXkoKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLmdldFZhbHVlKCkiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOworfQorCisvKioKKyAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIGphdmEudXRpbC5IYXNoTWFwPEtleSxWYWx1ZT4KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9uYW1lc3BhY2UpIHsKKyAgLy8gSW4gSmF2YSB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIGlmIChpbl9pbml0KSB7CisgICAgICBpZiAoaXNfZW51bV9tYXAodG1hcCkpIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5FbnVtTWFwIjsKKyAgICAgIH0gZWxzZSBpZiAoc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuVHJlZU1hcCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkhhc2hNYXAiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLk1hcCI7CisgICAgfQorICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpICsgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIGlmIChpbl9pbml0KSB7CisgICAgICBpZiAoaXNfZW51bV9zZXQodHNldCkpIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5FbnVtU2V0IjsKKyAgICAgIH0gZWxzZSBpZiAoc29ydGVkX2NvbnRhaW5lcnNfKSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuVHJlZVNldCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkhhc2hTZXQiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLlNldCI7CisgICAgfQorICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICBpZiAoaW5faW5pdCkgeworICAgICAgcHJlZml4ID0gImphdmEudXRpbC5BcnJheUxpc3QiOworICAgIH0gZWxzZSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkxpc3QiOworICAgIH0KKyAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKChwcm9ncmFtICE9IE5VTEwpICYmICgocHJvZ3JhbSAhPSBwcm9ncmFtXykgfHwgZm9yY2VfbmFtZXNwYWNlKSkgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBKYXZhIGNvbnRhaW5lcj8KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJWb2lkIiA6ICJ2b2lkIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJqYXZhLm5pby5CeXRlQnVmZmVyIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuQm9vbGVhbiIgOiAiYm9vbGVhbiIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5CeXRlIiA6ICJieXRlIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5TaG9ydCIgOiAic2hvcnQiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiamF2YS5sYW5nLkludGVnZXIiIDogImludCIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuTG9uZyIgOiAibG9uZyIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuRG91YmxlIiA6ICJkb3VibGUiKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gaW5pdCBXaGV0aGVyIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIGNvbW1lbnQpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKHR5cGVfY2FuX2JlX251bGwodHR5cGUpKSB7CisgICAgcmVzdWx0ICs9IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpICsgIiAiOworICB9CisgIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgICAgOworICAgIH0KKyAgfQorICByZXN1bHQgKz0gIjsiOworICBpZiAoY29tbWVudCkgeworICAgIHJlc3VsdCArPSAiIC8vICI7CisgICAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIHJlc3VsdCArPSAib3B0aW9uYWwiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gInJlcXVpcmVkIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0ZDo6c3RyaW5nIGZuX25hbWUgPSBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyBmbl9uYW1lICsgIigiCisgICAgICAgICAgICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikgdGhyb3dzICI7CisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiLCAiOworICB9CisgIHJlc3VsdCArPSAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndm9pZCBuYW1lKGFyZ3MsIHJlc3VsdEhhbmRsZXIpJworICoKKyAqIEBwYXJhbXMgdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0ZDo6c3RyaW5nIGFyZ2xpc3QgPSBhc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodGZ1bmN0aW9uLCB1c2VfYmFzZV9tZXRob2QsIHRydWUpOworCisgIHN0ZDo6c3RyaW5nIHJldF90eXBlID0gIiI7CisgIGlmICh1c2VfYmFzZV9tZXRob2QpIHsKKyAgICByZXRfdHlwZSArPSAiQXN5bmNDbGllbnQuIjsKKyAgfQorICByZXRfdHlwZSArPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2NhbGwiOworCisgIHN0ZDo6c3RyaW5nIGZuX25hbWUgPSBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgInZvaWQgIiArIGZuX25hbWUgKyAiKCIgKyBhcmdsaXN0ICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRfZnVuY3Rpb24qIHRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9iYXNlX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R5cGVzKSB7CisgICh2b2lkKXVzZV9iYXNlX21ldGhvZDsKKyAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9ICIiOworICBpZiAodGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgeworICAgIGFyZ2xpc3QgPSBhcmd1bWVudF9saXN0KHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX3R5cGVzKSArICIsICI7CisgIH0KKworICBpZiAoaW5jbHVkZV90eXBlcykgeworICAgIGFyZ2xpc3QgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IjsKKyAgICBhcmdsaXN0ICs9IHR5cGVfbmFtZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgdHJ1ZSkgKyAiPiAiOworICB9CisgIGFyZ2xpc3QgKz0gInJlc3VsdEhhbmRsZXIiOworCisgIHJldHVybiBhcmdsaXN0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgKHZvaWQpdGZ1bmN0OworICAodm9pZCl0dHlwZTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIGlmIChpbmNsdWRlX3R5cGVzKSB7CisgICAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKCFmaXJzdCkgeworICAgIHJlc3VsdCArPSAiLCAiOworICB9CisgIGlmIChpbmNsdWRlX3R5cGVzKSB7CisgICAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCI7CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZnVuY3QtPmdldF9yZXR1cm50eXBlKCksIHRydWUpICsgIj4gIjsKKyAgfQorICByZXN1bHQgKz0gInJlc3VsdEhhbmRsZXIiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgSmF2YSBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWVzIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gZnJvbU5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lCisgKiBAcmV0dXJuIFRoZSBwcm9kdWNlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgLy8gaWYgYW55IGZ1cnRoZXIgcnVsZXMgYXBwbHkgdG8gc291cmNlIGZpbGUgbmFtZXMgaW4gSmF2YSwgbW9kaWZ5IGFzIG5lY2Vzc2FyeQorICByZXR1cm4gbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIoZnJvbU5hbWUpOworfQorCisvKioKKyAqIFRha2VzIGEgbmFtZSBhbmQgcHJvZHVlcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBmcm9tIGl0CisgKgorICogQHBhcmFtIGZyb21OYW1lIFRoZSBuYW1lIHdoaWNoIHNoYWxsIGJlY29tZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgorICogQHJldHVybiBUaGUgcHJvZHVjZWQgaWRlbnRpZmllcgorICovCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QpIHsKKyAgc3RkOjpzdHJpbmcgbmV3X25hbWU7CisgIHNpemVfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAobmFtZVtpXSAhPSAnXycpCisgICAgICBicmVhazsKKyAgfQorICBpZiAodWNmaXJzdCkgeworICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpKytdKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdfbmFtZSArPSB0b2xvd2VyKG5hbWVbaSsrXSk7CisgIH0KKyAgZm9yICg7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKG5hbWVbaV0gPT0gJ18nKSB7CisgICAgICBpZiAoaSA8IG5hbWUuc2l6ZSgpIC0gMSkgeworICAgICAgICBpKys7CisgICAgICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG5ld19uYW1lICs9IG5hbWVbaV07CisgICAgfQorICB9CisgIHJldHVybiBuZXdfbmFtZTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7CisgICAgcmV0dXJuIGFzX2NhbWVsX2Nhc2UobmFtZSwgZmFsc2UpOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKKy8qKgorICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KKyAqIGFuZC9vciBmdWxsY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIGlmIChub2NhbWVsX3N0eWxlXykgeworICAgIHJldHVybiAiXyIgKyBuYW1lOworICB9IGVsc2UgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICByZXR1cm4gYXNfY2FtZWxfY2FzZShuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKKworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisKKyAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKKyAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7CisgIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOworICBlbHNlCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOworCisgIGJvb2wgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyOworICBpZiAoY29udGFpbmVyLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKiljb250YWluZXI7CisgICAgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyID0gdG1hcC0+Z2V0X2tleV90eXBlKCktPmlzX2Jhc2VfdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdG1hcC0+Z2V0X3ZhbF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpOworICB9IGVsc2UgeworICAgIHRfdHlwZSogZWxlbV90eXBlID0gY29udGFpbmVyLT5pc19saXN0KCkgPyAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb3B5X2NvbnN0cnVjdF9jb250YWluZXIgPSBlbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpOworICB9CisKKyAgaWYgKGNvcHlfY29uc3RydWN0X2NvbnRhaW5lcikgeworICAgIC8vIGRlZXAgY29weSBvZiBiYXNlIHR5cGVzIGNhbiBiZSBkb25lIG11Y2ggbW9yZSBlZmZpY2llbnRseSB0aGFuIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUKKyAgICAvLyBlbGVtZW50cyBtYW51YWxseQorICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3M7CisgIGlmIChpc19lbnVtX3NldChjb250YWluZXIpIHx8IGlzX2VudW1fbWFwKGNvbnRhaW5lcikpIHsKKyAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUoY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICghKHNvcnRlZF9jb250YWluZXJzXyAmJiAoY29udGFpbmVyLT5pc19tYXAoKSB8fCBjb250YWluZXItPmlzX3NldCgpKSkpIHsKKyAgICAvLyB1bnNvcnRlZCBjb250YWluZXJzIGFjY2VwdCBhIGNhcGFjaXR5IHZhbHVlCisgICAgY29uc3RydWN0b3JfYXJncyA9IHNvdXJjZV9uYW1lICsgIi5zaXplKCkiOworICB9CisKKyAgaWYgKGlzX2VudW1fc2V0KGNvbnRhaW5lcikpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZigiIDw8IGNvbnN0cnVjdG9yX2FyZ3MgPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7CisKKyAgaWYgKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF92YWxfdHlwZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoamF2YS51dGlsLk1hcC5FbnRyeTwiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiPiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiIDogIgorICAgICAgICAgICAgICAgIDw8IHNvdXJjZV9uYW1lIDw8ICIuZW50cnlTZXQoKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfa2V5ID0gIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIi5nZXRLZXkoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldFZhbHVlKCk7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZTsKKworICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7CisgICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgOiAiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChlbGVtX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAvLyByZWN1cnNpdmUgZGVlcCBjb3B5CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiamF2YS5uaW8uQnl0ZUJ1ZmZlciB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCh0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCgiOworICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgcmVzdWx0X25hbWUsIGVsZW1fdHlwZSk7CisgICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKKyAgKHZvaWQpZGVzdF9uYW1lOworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGNhbiBiZSBjb3BpZWQgZGlyZWN0bHkKKyAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkICIKKyAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICIoc2hvcnQpIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zY2hlbWVfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IFNUQU5EQVJEX1NDSEVNRV9GQUNUT1JZID0gbmV3ICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IFRVUExFX1NDSEVNRV9GQUNUT1JZID0gbmV3ICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSgpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICIvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgIgorICAgICAgICAgICAgICAgICAiZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKChzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpCisgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKKyAgfQorCisgIG91dCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpCisgICAgICA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8amF2YS5sYW5nLlN0cmluZywgX0ZpZWxkcz4oKTsiCisgICAgICA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IGphdmEudXRpbC5FbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoKGZpZWxkSWQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIKKyAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBpZiBpdCBpcyBub3QgZm91bmQuIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJGaWVsZCBcIiArIGZpZWxkSWQgKyAiCisgICAgICAgICAgICAgICAgICJcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBmaWVsZHM7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuIgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgamF2YS5sYW5nLlN0cmluZyBfZmllbGROYW1lOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzKHNob3J0IHRocmlmdElkLCBqYXZhLmxhbmcuU3RyaW5nIGZpZWxkTmFtZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgX3RocmlmdElkID0gdGhyaWZ0SWQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBfZmllbGROYW1lID0gZmllbGROYW1lOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX3RocmlmdElkOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RmllbGROYW1lKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9maWVsZE5hbWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit0X2phdmFfZ2VuZXJhdG9yOjppc3NldF90eXBlIHRfamF2YV9nZW5lcmF0b3I6Om5lZWRzX2lzc2V0KHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0UHJpbWl0aXZlVHlwZSkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGludCBjb3VudCA9IDA7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKSkgeworICAgICAgY291bnQrKzsKKyAgICB9CisgIH0KKyAgaWYgKGNvdW50ID09IDApIHsKKyAgICByZXR1cm4gSVNTRVRfTk9ORTsKKyAgfSBlbHNlIGlmIChjb3VudCA8PSA2NCkgeworICAgIGlmIChvdXRQcmltaXRpdmVUeXBlICE9IE5VTEwpIHsKKyAgICAgIGlmIChjb3VudCA8PSA4KQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJieXRlIjsKKyAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDE2KQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJzaG9ydCI7CisgICAgICBlbHNlIGlmIChjb3VudCA8PSAzMikKKyAgICAgICAgKm91dFByaW1pdGl2ZVR5cGUgPSAiaW50IjsKKyAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDY0KQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJsb25nIjsKKyAgICB9CisgICAgcmV0dXJuIElTU0VUX1BSSU1JVElWRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gSVNTRVRfQklUU0VUOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICghamF2YTVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAoZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIGZpZWxkLT5nZXRfbmFtZSgpLCB0LCBmaWVsZC0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKworICAgICAgaWYgKHJldXNlX29iamVjdHNfICYmICh0LT5pc19jb250YWluZXIoKSB8fCB0LT5pc19zdHJ1Y3QoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmNsZWFyKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgfSBlbHNlIHsKKworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIG11c3QgYmUgYSBiYXNlIHR5cGUKKyAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKKyAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGZhbHNlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0OworCisgICAgc3dpdGNoIChiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgInVuc3VwcG9ydGVkIHR5cGU6ICIgKyBiYXNlX3R5cGUtPmdldF9uYW1lKCkgKyAiIGZvciBmaWVsZCAiICsgZmllbGQtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHNlcmlhbGl6ZSAoaW4gdGhlIEphdmEgc2Vuc2UpIHRoZSBvYmplY3QKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3ICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5XyA/ICIuZ2V0TWVzc2FnZSgpIiA6ICIiKQorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBzZXJpYWxpemUgKGluIHRoZSBKYXZhIHNlbnNlKSB0aGUgb2JqZWN0Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyAiCisgICAgICAgICAgICAgICAgICJqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKKyAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0KSkgeworICAgIGNhc2UgSVNTRVRfTk9ORToKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgICAgaW5kZW50KG91dCkgPDwgIiAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgIgorICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhICIKKyAgICAgICAgICAgICAgICAgICAgICJzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IGphdmEudXRpbC5CaXRTZXQoMSk7IiA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICIgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUiIDw8IChhbmRyb2lkX2xlZ2FjeV8gPyAiLmdldE1lc3NhZ2UoKSIgOiAiIikKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiCisgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChzY2hlbWVGaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic3RydWN0LiIsIHRydWUpOworICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QuIgorICAgICAgICAgICAgICAgIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gaW4gbm9uLWJlYW5zIHN0eWxlLCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlCisgIC8vICh3aGljaCBjYW4gYmUgY2hlY2tlZCBoZXJlIGJ1dCBub3QgaW4gdGhlIGdlbmVyYWwgdmFsaWRhdGUgbWV0aG9kKQorICBpZiAoIWJlYW5fc3R5bGVfKSB7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QudmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoc3RydWN0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG9wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHx8IChpc19yZXN1bHQgJiYgIW51bGxfYWxsb3dlZCk7CisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIKKyAgICAgICAgICAgICAgICAgIDw8ICJzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzdHJ1Y3QuIiwgdHJ1ZSk7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChvcHRpb25hbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIlN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCBpcHJvdCA9IChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCkgcHJvdDsiIDw8IGVuZGw7CisgIGludCBvcHRpb25hbF9jb3VudCA9IDA7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICBvcHRpb25hbF9jb3VudCsrOworICAgIH0KKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmIChvcHRpb25hbF9jb3VudCA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiamF2YS51dGlsLkJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoIiA8PCBvcHRpb25hbF9jb3VudCA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChpbmNvbWluZy5nZXQoIiA8PCBpIDw8ICIpKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCBvcHJvdCA9IChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbCkgcHJvdDsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGhhc19vcHRpb25hbCA9IGZhbHNlOworICBpbnQgb3B0aW9uYWxfY291bnQgPSAwOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgIG9wdGlvbmFsX2NvdW50Kys7CisgICAgICBoYXNfb3B0aW9uYWwgPSB0cnVlOworICAgIH0KKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAic3RydWN0LiIsIGZhbHNlKTsKKyAgICB9CisgIH0KKyAgaWYgKGhhc19vcHRpb25hbCkgeworICAgIGluZGVudChvdXQpIDw8ICJqYXZhLnV0aWwuQml0U2V0IG9wdGlvbmFscyA9IG5ldyBqYXZhLnV0aWwuQml0U2V0KCk7IiA8PCBlbmRsOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm9wdGlvbmFscy5zZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAiIDw8IG9wdGlvbmFsX2NvdW50IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbnQgaiA9IDA7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaisrOworICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICJUdXBsZVNjaGVtZSBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIj4geyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zY2hlbWVfbG9va3VwKG9zdHJlYW0mIG91dCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgPFMgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZT4gUyBzY2hlbWUoIgorICAgICAgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90bykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZS5jbGFzcy5lcXVhbHMocHJvdG8uZ2V0U2NoZW1lKCkpICIKKyAgICAgIDw8ICI/IFNUQU5EQVJEX1NDSEVNRV9GQUNUT1JZICIKKyAgICAgIDw8ICI6IFRVUExFX1NDSEVNRV9GQUNUT1JZIgorICAgICAgPDwgIikuZ2V0U2NoZW1lKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihvc3RyZWFtJiBvdXQpIHsKKyAgdGltZV90IHNlY29uZHMgPSB0aW1lKE5VTEwpOworICBzdHJ1Y3QgdG0qIG5vdyA9IGxvY2FsdGltZSgmc2Vjb25kcyk7CisgIGluZGVudChvdXQpIDw8ICJAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQodmFsdWUgPSBcIiIgPDwgYXV0b2dlbl9zdW1tYXJ5KCkgPDwgIlwiIjsKKyAgaWYgKHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiLCBkYXRlID0gXCIiIDw8IChub3ctPnRtX3llYXIgKyAxOTAwKSA8PCAiLSIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikKKyAgICAgICAgICAgICAgICA8PCAobm93LT50bV9tb24gKyAxKSA8PCAiLSIgPDwgc2V0ZmlsbCgnMCcpIDw8IHNldHcoMikgPDwgbm93LT50bV9tZGF5CisgICAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGphdmEsCisgICAgIkphdmEiLAorICAgICIgICAgYmVhbnM6ICAgICAgICAgICBNZW1iZXJzIHdpbGwgYmUgcHJpdmF0ZSwgYW5kIHNldHRlciBtZXRob2RzIHdpbGwgcmV0dXJuIHZvaWQuXG4iCisgICAgIiAgICBwcml2YXRlLW1lbWJlcnM6IE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBidXQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gJ3RoaXMnIGxpa2UgIgorICAgICJ1c3VhbC5cbiIKKyAgICAiICAgIG5vY2FtZWw6ICAgICAgICAgRG8gbm90IHVzZSBDYW1lbENhc2UgZmllbGQgYWNjZXNzb3JzIHdpdGggYmVhbnMuXG4iCisgICAgIiAgICBmdWxsY2FtZWw6ICAgICAgIENvbnZlcnQgdW5kZXJzY29yZWRfYWNjZXNzb3Jfb3Jfc2VydmljZV9uYW1lcyB0byBjYW1lbENhc2UuXG4iCisgICAgIiAgICBhbmRyb2lkOiAgICAgICAgIEdlbmVyYXRlZCBzdHJ1Y3R1cmVzIGFyZSBQYXJjZWxhYmxlLlxuIgorICAgICIgICAgYW5kcm9pZF9sZWdhY3k6ICBEbyBub3QgdXNlIGphdmEuaW8uSU9FeGNlcHRpb24odGhyb3dhYmxlKSAoYXZhaWxhYmxlIGZvciBBbmRyb2lkIDIuMyBhbmQgIgorICAgICJhYm92ZSkuXG4iCisgICAgIiAgICBvcHRpb25fdHlwZTogICAgIFdyYXAgb3B0aW9uYWwgZmllbGRzIGluIGFuIE9wdGlvbiB0eXBlLlxuIgorICAgICIgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHJldGhyb3cgb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYW5kIGxldCB0aGVtIHByb3BhZ2F0ZSBmdXRoZXIuIgorICAgICIgKERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2F0Y2ggYW5kIGxvZyBpdC4pXG4iCisgICAgIiAgICBqYXZhNTogICAgICAgICAgIEdlbmVyYXRlIEphdmEgMS41IGNvbXBsaWFudCBjb2RlIChpbmNsdWRlcyBhbmRyb2lkX2xlZ2FjeSBmbGFnKS5cbiIKKyAgICAiICAgIHJldXNlLW9iamVjdHM6ICAgRGF0YSBvYmplY3RzIHdpbGwgbm90IGJlIGFsbG9jYXRlZCwgYnV0IGV4aXN0aW5nIGluc3RhbmNlcyB3aWxsIGJlIHVzZWQgIgorICAgICIocmVhZCBhbmQgd3JpdGUpLlxuIgorICAgICIgICAgc29ydGVkX2NvbnRhaW5lcnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFVzZSBUcmVlU2V0L1RyZWVNYXAgaW5zdGVhZCBvZiBIYXNoU2V0L0hhc2hNYXAgYXMgYSBpbXBsZW1lbnRhdGlvbiBvZiAiCisgICAgInNldC9tYXAuXG4iCisgICAgIiAgICBnZW5lcmF0ZWRfYW5ub3RhdGlvbnM9W3VuZGF0ZWR8c3VwcHJlc3NdOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICB1bmRhdGVkOiBzdXBwcmVzcyB0aGUgZGF0ZSBhdCBAR2VuZXJhdGVkIGFubm90YXRpb25zXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzOiBzdXBwcmVzcyBAR2VuZXJhdGVkIGFubm90YXRpb25zIGVudGlyZWx5XG4iCisgICAgIiAgICB1bnNhZmVfYmluYXJpZXM6IERvIG5vdCBjb3B5IEJ5dGVCdWZmZXJzIGluIGNvbnN0cnVjdG9ycywgZ2V0dGVycywgYW5kIHNldHRlcnMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzQzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMjk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9qYXZhbWVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfamF2YW1lX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGphdmFtZToiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tamF2YW1lIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfcHJpbWl0aXZlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKKworICBib29sIGhhc19iaXRfdmVjdG9yKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgamF2YV9wYWNrYWdlKCk7CisgIHN0ZDo6c3RyaW5nIGphdmFfdHlwZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIGJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX2VudW0oKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3BhY2thZ2UoKSB7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiO1xuXG4iOworICB9CisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIEphdmEgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfdHlwZV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIgorICAgICAgICAgKyAiaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjtcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90aHJpZnRfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCisgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOworfQorCisvKioKKyAqIE5vdGhpbmcgaW4gSmF2YQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSmF2YSwgc2luY2UgaXQgZG9lcworICogbm90IHN1cHBvcnQgYXJiaXRyYXJ5IG5hbWUgcmVwbGFjZW1lbnRzLCBhbmQgaXQnZCBiZSBhIHdhY2t5IHdhc3RlCisgKiBvZiBvdmVyaGVhZCB0byBtYWtlIHdyYXBwZXIgY2xhc3Nlcy4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpOworCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgdGVudW0pOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7CisgIHNjb3BlX3VwKGZfZW51bSk7CisgIGZfZW51bSA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgKmNfaXRlcik7CisgICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB2YWx1ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgImNhc2UgIiA8PCB2YWx1ZSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOworCisgIGZfZW51bS5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCk7CisKKyAgZl9jb25zdHMgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICBmX2NvbnN0cy5jbG9zZSgpOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaW5kZW50KG91dCk7CisgIGlmICghZGVmdmFsKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgIH0KKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOworICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgIG91dCA8PCAic2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PCBib3hfdHlwZShrdHlwZSwga2V5KSA8PCAiLCAiIDw8IGJveF90eXBlKHZ0eXBlLCB2YWwpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PCBib3hfdHlwZShldHlwZSwgdmFsKSA8PCAiLCAiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpCisgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpOworICB9IGVsc2UgeworICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIm5ldyBCb29sZWFuKCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJuZXcgQnl0ZSgiICsgdmFsdWUgKyAiKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIm5ldyBTaG9ydCgiICsgdmFsdWUgKyAiKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIm5ldyBJbnRlZ2VyKCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAibmV3IExvbmcoIiArIHZhbHVlICsgIikiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJuZXcgRG91YmxlKCIgKyB2YWx1ZSArICIpIjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBUQmFzZQorICogaW1wbGVtZW50b3IuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiBleHRlbmRzIFRVbmlvbiAiOworCisgIHNjb3BlX3VwKGZfc3RydWN0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc3RydWN0KTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihzZXRGaWVsZCwgdmFsdWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIob3RoZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlICJjb25zdHJ1Y3RvcnMiIGZvciBlYWNoIGZpZWxkCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOworCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBnZXQiCisgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfY2hlY2tfdHlwZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7CisgICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3QgcmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSAiCisgICAgICAgICAgICAgICAgICJvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCBcIiArICIKKyAgICAgICAgICAgICAgICAgInNldEZpZWxkXyk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIFRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBTVFJVQ1RfREVTQzsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBlcXVhbGl0eQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpb3RoZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmICIKKyAgICAgICAgICAgICAgICAgImdldEZpZWxkVmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaW50IGxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldFNldEZpZWxkKCksIG90aGVyLmdldFNldEZpZWxkKCkpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIFRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRGaWVsZFZhbHVlKCksIG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpCisgICAgICA8PCAiICogSWYgeW91J2QgbGlrZSB0aGlzIHRvIHBlcmZvcm0gbW9yZSByZXNwZWN0YWJseSwgdXNlIHRoZSBoYXNoY29kZSBnZW5lcmF0b3Igb3B0aW9uLiIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIDA7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgRXhjZXB0aW9uICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7CisgICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UpIDw8IGVuZGw7CisgIH0KKworICAvLyBpc3NldCBkYXRhCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKKworICAgIGludCBpID0gMDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikgPDwgIiA9ICIgPDwgaSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChpID4gMCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgYm9vbGVhbltdIF9faXNzZXRfdmVjdG9yID0gbmV3IGJvb2xlYW5bIiA8PCBpIDw8ICJdOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7CisgICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAoKm1faXRlcikpOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBjb3B5IGNvbnN0cnVjdG9yCisgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoaGFzX2JpdF92ZWN0b3IodHN0cnVjdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weShvdGhlci5fX2lzc2V0X3ZlY3RvciwgMCwgX19pc3NldF92ZWN0b3IsIDAsICIKKyAgICAgICAgICAgICAgICAgICAib3RoZXIuX19pc3NldF92ZWN0b3IubGVuZ3RoKTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHR5cGUpOworCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCAib3RoZXIiLCBmaWVsZF9uYW1lLCAiX190aGlzX18iICsgZmllbGRfbmFtZSwgdHlwZSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IF9fdGhpc19fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsICJvdGhlci4iICsgZmllbGRfbmFtZSwgZmllbGRfbmFtZSwgdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjbG9uZSBtZXRob2QsIHNvIHRoYXQgeW91IGNhbiBkZWVwIGNvcHkgYW4gb2JqZWN0IHdoZW4geW91IGRvbid0IGtub3cgaXRzIGNsYXNzLgorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcyA9PSB0aGF0KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiICA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKKyAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgorICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKKyAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB1bmVxdWFsOworCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKKyAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHRoYXRfcHJlc2VudCA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISgiCisgICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmICh0LT5pc19iaW5hcnkoKSkgeworICAgICAgdW5lcXVhbCA9ICJUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iICsgbmFtZSArICIsIHRoYXQuIiArIG5hbWUgKyAiKSAhPSAwIjsKKyAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgdW5lcXVhbCA9ICJ0aGlzLiIgKyBuYW1lICsgIiAhPSB0aGF0LiIgKyBuYW1lOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb3RoZXJPYmplY3QpIHsiIDw8IGVuZGw7CisgIC8vICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKSkpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlciA9ICgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKW90aGVyT2JqZWN0OyI7CisKKyAgaW5kZW50KG91dCkgPDwgImludCBsYXN0Q29tcGFyaXNvbiA9IDA7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJsYXN0Q29tcGFyaXNvbiA9IFRCYXNlSGVscGVyLmNvbXBhcmVUbygiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKQorICAgICAgICAgICAgICAgIDw8ICIsIG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX3N0cnVjdCgpIHx8IGZpZWxkLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmNvbXBhcmVUbyhvdGhlci4iCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIgorICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoISIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgYm9vbCBvcHRpb25hbCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX3N0cmluZygpKSB7CisgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKKworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKCIKKyAgICAgICAgICAgICAgICA8PCAoYmFzZV90eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSk7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZClvdXQ7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBKYXZhIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbgorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gMCA6ICIKKyAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0KKworICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBFbnVtZXJhdGlvbiBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiRW51bWVyYXRpb24oKSB7IikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIKKyAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmVsZW1lbnRzKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIEFkZCB0byBzZXQgb3IgbGlzdCwgY3JlYXRlIGlmIHRoZSBzZXQvbGlzdCBpcyBudWxsCisgICAgICBpbmRlbnQob3V0KTsKKyAgICAgIG91dCA8PCAicHVibGljIHZvaWQgYWRkIiA8PCBnZXRfY2FwX25hbWUoInRvIik7CisgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUpIDw8ICIgZWxlbSkgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgIDw8IGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgLy8gUHV0IHRvIG1hcAorICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBwdXRUbyIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSkgPDwgIiBrZXksICIKKyAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUpIDw8ICIgdmFsKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFNpbXBsZSBnZXR0ZXIKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICBvdXQgPDwgIiBpcyI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGdldCI7CisgICAgfQorICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgb3V0IDw8ICJ2b2lkIjsKKyAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gaXNTZXQgbWV0aG9kCisgICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF92ZWN0b3JbIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIl07IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBjYXBfbmFtZSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihib29sZWFuIHZhbHVlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiBmaXJzdCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJUQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5hcHBlbmQoXCIpXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBqYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQorICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQorICovCitzdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuRU5VTSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudF91cCgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEVudW1NZXRhRGF0YShUVHlwZS5FTlVNLCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOworICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7CisgICAgfQorICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuamF2YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOworCisgIGZfc2VydmljZV8gPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIGV4dGVuZHMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSB7IH0iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBmX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJJZmFjZS5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2lmYWNlOworICBmX2lmYWNlLm9wZW4oZl9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiSWZhY2UiOworICB9CisKKyAgZl9pZmFjZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgdHNlcnZpY2UpOworICBmX2lmYWNlIDw8ICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgKmZfaXRlcik7CisgICAgZl9pZmFjZSA8PCAiICBwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBmX2lmYWNlIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5JZmFjZSI7CisgIH0KKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuQ2xpZW50IjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFNlcnZpY2VDbGllbnQsIElmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMocHJvdCwgcHJvdCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCArK3NlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgeDsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkJBRF9TRVFVRU5DRV9JRCwgXCIiCisgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlXCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5Qcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBQcm9jZXNzb3IoSWZhY2UgaWZhY2UpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIKKyAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXworICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgUHJvY2Vzc0Z1bmN0aW9uIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgcHVibGljIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSWZhY2UgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZSBwcm9jZXNzTWFwXyA9IG5ldyBIYXNodGFibGUoKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KKworICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuID0gKFByb2Nlc3NGdW5jdGlvbilwcm9jZXNzTWFwXy5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgIgorICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogIgorICAgICAgICAgIidcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuLnByb2Nlc3MobXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgIDw8ICJwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIgorICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInRyeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgIgorICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKFRocm93YWJsZSB0aCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBDbG9zZSBjbGFzcworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIENsb3NlIGNsYXNzCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKCF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgKyAiLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5CisgICAgICAgICAgICAgIDw8ICIoIiA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIikgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBib3hfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLCAiCisgICAgICAgICAgICAgIDw8IGJveF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHV0KCIgPDwgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiLCAiCisgICAgICAgICAgICAgIDw8IGJveF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkRWxlbWVudCgiIDw8IGJveF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgIDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7CisgICAgc3RyaW5nIGtleV90eXBlID0gdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHRydWUsIGZhbHNlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyCisgICAgICAgICAgICAgICAgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwga2V5X3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiIDw8IGtleV90eXBlIDw8ICIpIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKKyAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyCisgICAgICAgICAgICAgICAgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgZWxlX3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiIDw8IGVsZV90eXBlIDw8ICIpIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIuZWxlbWVudHMoKTsgIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKyAgc3RyaW5nIHZhbF90eXBlID0gdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSk7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiKCgiICsgdmFsX3R5cGUgKyAiKSIgKyBtYXAgKyAiLmdldCgiICsgaXRlciArICIpKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/CisgKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIFZlY3RvcgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMpIHsKKyAgKHZvaWQpaW5faW5pdDsKKyAgKHZvaWQpc2tpcF9nZW5lcmljOworICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIkhhc2h0YWJsZSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJIYXNodGFibGUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlZlY3RvciI7CisgIH0KKworICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOworICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPworICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwgYm9vbCBpbl9jb250YWluZXIpIHsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKCF0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImJ5dGVbXSI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkJ5dGUiIDogImJ5dGUiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiU2hvcnQiIDogInNob3J0Iik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkludGVnZXIiIDogImludCIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJMb25nIiA6ICJsb25nIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkRvdWJsZSIgOiAiZG91YmxlIik7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICA7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7CisgIH0KKyAgcmVzdWx0ICs9ICJURXhjZXB0aW9uIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEFwcGxpZXMgdGhlIGNvcnJlY3Qgc3R5bGUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG5vY2FtZWxfc3R5bGVfCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOworICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgeworCisgIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7CisgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOworICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKKyAgZWxzZQorICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiLiIgKyBzb3VyY2VfbmFtZV9wMjsKKworICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgc3RkOjpzdHJpbmcgaXRlcmF0b3JfZWxlbWVudF9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VsZW1lbnQiOworICBzdGQ6OnN0cmluZyBlbnVtZXJhdGlvbl9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VudW0iOworICBzdGQ6OnN0cmluZyByZXN1bHRfZWxlbWVudF9uYW1lID0gcmVzdWx0X25hbWUgKyAiX2NvcHkiOworCisgIGlmIChjb250YWluZXItPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiID0gIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmtleXMoKTsgIgorICAgICAgICAgICAgICAgIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgc291cmNlX25hbWUgPDwgIi5nZXQoIgorICAgICAgICAgICAgICAgIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSk7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZTsKKworICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7CisgICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lCisgICAgICAgICAgICAgICAgPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIsICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZEVsZW1lbnQodGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KHRlbXBfYmluYXJ5X2VsZW1lbnQsIHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCI7CisgICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgLy8gYmluYXJ5IGZpZWxkcyBuZWVkIHRvIGJlIGNvcGllZCB3aXRoIFN5c3RlbS5hcnJheWNvcHkKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG91dCA8PCAibmV3IGJ5dGVbIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aF07IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLCAwLCAiIDw8IGRlc3RfbmFtZSA8PCAiLCAwLCAiCisgICAgICAgICAgICAgICAgICA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aCkiOworICAgIH0KKyAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQorICAgIGVsc2UKKyAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiXCIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCitib29sIHRfamF2YW1lX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQorICAgICAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgIDw8ICIoZmFsc2UpOyIgPDwgZW5kbDsKKyAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBwcmV2ZW50IGdjYyBjb21waWxlciB3YXJuaW5nCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmFtZSwgIkphdmEgTUUiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3ODJiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjcyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKworCisvKioKKyAqIEpTIGNvZGUgZ2VuZXJhdG9yLgorICovCitjbGFzcyB0X2pzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2pzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZ2VuX25vZGVfID0gZmFsc2U7CisgICAgZ2VuX2pxdWVyeV8gPSBmYWxzZTsKKyAgICBnZW5fdHNfID0gZmFsc2U7CisgICAgZ2VuX2VzNl8gPSBmYWxzZTsKKworICAgIGJvb2wgd2l0aF9uc18gPSBmYWxzZTsKKworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vZGUiKSA9PSAwKSB7CisgICAgICAgIGdlbl9ub2RlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImpxdWVyeSIpID09IDApIHsKKyAgICAgICAgZ2VuX2pxdWVyeV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0cyIpID09IDApIHsKKyAgICAgICAgZ2VuX3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIndpdGhfbnMiKSA9PSAwKSB7CisgICAgICAgIHdpdGhfbnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZXM2IikgPT0gMCkgeworICAgICAgICBnZW5fZXM2XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24ganM6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChnZW5fZXM2XyAmJiBnZW5fanF1ZXJ5XykgeworICAgICAgdGhyb3cgIkludmFsaWQgc3dpdGNoOiBbLWdlbiBqczplczYsanF1ZXJ5XSBvcHRpb25zIG5vdCBjb21wYXRpYmxlIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuX25vZGVfICYmIGdlbl9qcXVlcnlfKSB7CisgICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOm5vZGUsanF1ZXJ5XSBvcHRpb25zIG5vdCBjb21wYXRpYmxlLCB0cnk6IFstZ2VuIGpzOm5vZGUgLWdlbiAiCisgICAgICAgICAgICAianM6anF1ZXJ5XSI7CisgICAgfQorCisgICAgaWYgKCFnZW5fbm9kZV8gJiYgd2l0aF9uc18pIHsKKyAgICAgIHRocm93ICJJbnZhbGlkIHN3aXRjaDogWy1nZW4ganM6d2l0aF9uc10gaXMgb25seSB2YWxpZCB3aGVuIHVzaW5nIG5vZGUuanMiOworICAgIH0KKworICAgIC8vIERlcGVuZGluZyBvbiB0aGUgcHJvY2Vzc2luZyBmbGFncywgd2Ugd2lsbCB1cGRhdGUgdGhlc2UgdG8gYmUgRVM2IGNvbXBhdGlibGUKKyAgICBqc19jb25zdF90eXBlXyA9ICJ2YXIgIjsKKyAgICBqc19sZXRfdHlwZV8gPSAidmFyICI7CisgICAganNfdmFyX3R5cGVfID0gInZhciAiOworICAgIGlmIChnZW5fZXM2XykgeworICAgICAganNfY29uc3RfdHlwZV8gPSAiY29uc3QgIjsKKyAgICAgIGpzX2xldF90eXBlXyA9ICJsZXQgIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1ub2RlanMiOworICAgICAgbm9fbnNfID0gIXdpdGhfbnNfOworICAgIH0gZWxzZSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qcyI7CisgICAgICBub19uc18gPSBmYWxzZTsKKyAgICB9CisKKyAgICBlc2NhcGVfWydcJyddID0gIlxcJyI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlY3ZfcmV0dXJuKHN0ZDo6c3RyaW5nIHZhcik7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3RzIQorICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHBvcnRlZCA9IHRydWUpOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqc19pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyB0c19pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBib29sIG9iaiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX2NhbGxiYWNrID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfY2FsbGJhY2sgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9ub2RlSnNfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiLy9cbiIpICsgIi8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgICArICIvL1xuIiArICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iCisgICAgICAgICAgICsgIi8vXG4iOworICB9CisKKyAgdF90eXBlKiBnZXRfY29udGFpbmVkX3R5cGUodF90eXBlKiB0KTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ganNfbmFtZXNwYWNlX3BpZWNlcyh0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7CisKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGllY2VzOworCisgICAgaWYgKG5vX25zXykgeworICAgICAgcmV0dXJuIHBpZWNlczsKKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgcGllY2VzLnB1c2hfYmFjayhucyk7CisgICAgfQorCisgICAgcmV0dXJuIHBpZWNlczsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGpzX3R5cGVfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGlmIChwICE9IE5VTEwgJiYgcCAhPSBwcm9ncmFtXykgeworICAgICAgICByZXR1cm4gbWFrZV92YWxpZF9ub2RlSnNfaWRlbnRpZmllcihwLT5nZXRfbmFtZSgpKSArICJfdHR5cGVzLiI7CisgICAgICB9CisgICAgICByZXR1cm4gInR0eXBlcy4iOworICAgIH0KKyAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOworICB9CisKKyAgc3RkOjpzdHJpbmcganNfZXhwb3J0X25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICByZXR1cm4gImV4cG9ydHMuIjsKKyAgICB9CisgICAgcmV0dXJuIGpzX25hbWVzcGFjZShwKTsKKyAgfQorCisgIGJvb2wgaGFzX2pzX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBpZiAobm9fbnNfKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKKyAgICByZXR1cm4gKG5zLnNpemUoKSA+IDApOworICB9CisKKyAgc3RkOjpzdHJpbmcganNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChub19uc18pIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICBucyArPSAiLiI7CisgICAgfQorCisgICAgcmV0dXJuIG5zOworICB9CisKKyAgLyoqCisgICAqIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlIGhlbHBlciBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RyaW5nIHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9jYWxsYmFjaywgYm9vbCBvcHRpb25hbF9jYWxsYmFjayk7CisgIHN0cmluZyB0c19nZXRfdHlwZSh0X3R5cGUqIHR5cGUpOworCisgIC8qKgorICAgKiBTcGVjaWFsIGluZGVudGF0aW9uIGZvciBUeXBlU2NyaXB0IERlZmluaXRpb25zIGJlY2F1c2Ugb2YgdGhlIG1vZHVsZS4KKyAgICogUmV0dXJucyB0aGUgbm9ybWFsIGluZGVudGF0aW9uICsgIiAgIiBpZiBhIG1vZHVsZSB3YXMgZGVmaW5lZC4KKyAgICogQHJldHVybiBzdHJpbmcKKyAgICovCisgIHN0cmluZyB0c19pbmRlbnQoKSB7IHJldHVybiBpbmRlbnQoKSArICghdHNfbW9kdWxlXy5lbXB0eSgpID8gIiAgIiA6ICIiKTsgfQorCisgIC8qKgorICAgKiBSZXR1cm5zICJkZWNsYXJlICIgaWYgbm8gbW9kdWxlIHdhcyBkZWZpbmVkLgorICAgKiBAcmV0dXJuIHN0cmluZworICAgKi8KKyAgc3RyaW5nIHRzX2RlY2xhcmUoKSB7IHJldHVybiAodHNfbW9kdWxlXy5lbXB0eSgpID8gImRlY2xhcmUgIiA6ICIiKTsgfQorCisgIC8qKgorICAgKiBSZXR1cm5zICI/IiBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgb3B0aW9uYWwgb3IgaGFzIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICogQHBhcmFtIHRfZmllbGQgVGhlIGZpZWxkIHRvIGNoZWNrCisgICAqIEByZXR1cm4gc3RyaW5nCisgICAqLworICBzdHJpbmcgdHNfZ2V0X3JlcSh0X2ZpZWxkKiBmaWVsZCkge3JldHVybiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMID8gIj8iIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGRvY3VtZW50YXRpb24sIGlmIHRoZSBwcm92aWRlZCBkb2N1bWVudGFibGUgb2JqZWN0IGhhcyBvbmUuCisgICAqIEBwYXJhbSB0X2RvYyBUaGUgb2JqZWN0IHRvIGdldCB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tCisgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkb2N1bWVudGF0aW9uCisgICAqLworICBzdHJpbmcgdHNfcHJpbnRfZG9jKHRfZG9jKiB0ZG9jKSB7CisgICAgc3RyaW5nIHJlc3VsdCA9IGVuZGw7CisKKyAgICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBkb2ModGRvYy0+Z2V0X2RvYygpKTsKKyAgICAgIHN0cmluZyBpdGVtOworCisgICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiLyoqIiArIGVuZGw7CisgICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGRvYywgaXRlbSkpIHsKKyAgICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIiAqICIgKyBpdGVtICsgZW5kbDsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIgKi8iICsgZW5kbDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgTm9kZUpTLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KKyAgICovCisgIGJvb2wgZ2VuX25vZGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBzZXJ2aWNlcyB0aGF0IHVzZSBqUXVlcnkgYWpheCAoYXN5bmMvc3luYykuCisgICAqLworICBib29sIGdlbl9qcXVlcnlfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBhIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlIGZvciBlYWNoIHNlcnZpY2UuCisgICAqLworICBib29sIGdlbl90c187CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIEVTNiBjb2RlLCBpLmUuIHdpdGggUHJvbWlzZXMKKyAgICovCisgIGJvb2wgZ2VuX2VzNl87CisKKyAgLyoqCisgICAqIFRoZSBuYW1lIG9mIHRoZSBkZWZpbmVkIG1vZHVsZShzKSwgZm9yIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlcy4KKyAgICovCisgIHN0cmluZyB0c19tb2R1bGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBub3QgZ2VuZXJhdGUgbmFtZXNwYWNlIG9iamVjdHMgZm9yIG5vZGUuCisgICAqLworICBib29sIG5vX25zXzsKKworICAvKioKKyAgICogVGhlIHZhcmlhYmxlIGRlY29yYXRvciBmb3IgImNvbnN0IiB2YXJpYWJsZXMuIFdpbGwgZGVmYXVsdCB0byAidmFyIiBpZiBpbiBhbiBpbmNvbXBhdGlibGUgbGFuZ3VhZ2UuCisgICAqLworICBzdHJpbmcganNfY29uc3RfdHlwZV87CisKKyAgIC8qKgorICAgKiBUaGUgdmFyaWFibGUgZGVjb3JhdG9yIGZvciAibGV0IiB2YXJpYWJsZXMuIFdpbGwgZGVmYXVsdCB0byAidmFyIiBpZiBpbiBhbiBpbmNvbXBhdGlibGUgbGFuZ3VhZ2UuCisgICAqLworICBzdHJpbmcganNfbGV0X3R5cGVfOworCisgICAvKioKKyAgICogVGhlIGRlZmF1bHQgdmFyaWFibGUgZGVjb3JhdG9yLiBTdXBwb3J0cyBhbGwgamF2YXNjcmlwdCBsYW5ndWFnZXMsIGJ1dCBpcyBub3Qgc2NvcGVkIHRvIGZ1bmN0aW9ucyBvciBjbG9zdXJlcy4KKyAgICovCisgIHN0cmluZyBqc192YXJfdHlwZV87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV90c187Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZShzKQorICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzLmpzIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBzdHJpbmcgZl90eXBlc190c19uYW1lID0gb3V0ZGlyICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzLmQudHMiOworICAgIGZfdHlwZXNfdHNfLm9wZW4oZl90eXBlc190c19uYW1lLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIGlmICgoZ2VuX25vZGVfIHx8IGdlbl9lczZfKSAmJiBub19uc18pIHsKKyAgICBmX3R5cGVzXyA8PCAiXCJ1c2Ugc3RyaWN0XCI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHRzX2luY2x1ZGVzKCkgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBmX3R5cGVzXyA8PCBqc19jb25zdF90eXBlXyA8PCAidHR5cGVzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgcG5zOworCisgIC8vIHNldHVwIHRoZSBuYW1lc3BhY2UKKyAgLy8gVE9ETyBzaG91bGQgdGhlIG5hbWVzcGFjZSBqdXN0IGJlIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBub2RlPworICB2ZWN0b3I8c3RyaW5nPiBuc19waWVjZXMgPSBqc19uYW1lc3BhY2VfcGllY2VzKHByb2dyYW1fKTsKKyAgaWYgKG5zX3BpZWNlcy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuc19waWVjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHBucyArPSAoKGkgPT0gMCkgPyAiIiA6ICIuIikgKyBuc19waWVjZXNbaV07CisgICAgICBmX3R5cGVzXyA8PCAiaWYgKHR5cGVvZiAiIDw8IHBucyA8PCAiID09PSAndW5kZWZpbmVkJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgcG5zIDw8ICIgPSB7fTsiIDw8IGVuZGw7CisgICAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIHRzX21vZHVsZV8gPSBwbnM7CisgICAgICBmX3R5cGVzX3RzXyA8PCAiZGVjbGFyZSBtb2R1bGUgIiA8PCB0c19tb2R1bGVfIDw8ICIgeyI7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGpzIGltcG9ydHMKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpqc19pbmNsdWRlcygpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyByZXN1bHQgPSBqc19jb25zdF90eXBlXyArICJ0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKKyAgICAgICAgKyBqc19jb25zdF90eXBlXyArICJUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIjsKKyAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICByZXN1bHQgKz0ganNfY29uc3RfdHlwZV8gKyAiUSA9IHRocmlmdC5RO1xuIjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdHMgaW1wb3J0cworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgcmV0dXJuIHN0cmluZygKKyAgICAgICAgImltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKKyAgICAgICAgImltcG9ydCBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIgorICAgICAgICAiaW1wb3J0IFEgPSB0aHJpZnQuUTtcbiIpOworICB9CisKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICByZXN1bHQgKz0ganNfY29uc3RfdHlwZV8gKyBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICArICJfdHlwZXMnKTtcbiI7CisgICAgfQorICAgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgICByZXN1bHQgKz0gIlxuIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUocykKKworICBmX3R5cGVzXy5jbG9zZSgpOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8ICJ9IjsKKyAgICB9CisgICAgZl90eXBlc190c18uY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSlMsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBKUywgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0ZW51bSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJlbnVtICIKKyAgICAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3QmIGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIC8vIGFkZCAndmFsdWU6IGtleScgaW4gYWRkaXRpb24gdG8gJ2tleTogdmFsdWUnIGZvciBUeXBlU2NyaXB0IGVudW1zCisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgdmFsdWUgPDwgIicgOiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIDogIiA8PCB2YWx1ZTsKKyAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKSAtIDEpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIsIjsKKyAgICB9CisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgZl90eXBlc18gPDwgIn07IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IG5hbWUgPDwgIiA9ICI7CisgIGZfdHlwZXNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModGNvbnN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwganNfY29uc3RfdHlwZV8gPDwgbmFtZSA8PCAiOiAiCisgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUodHlwZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJyIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIih7IjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiIDogIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9KSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworCisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworCisgICAgICBvdXQgPDwgIiA6ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgIlsiOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgIH0KKyAgICBvdXQgPDwgIl0iOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogTWFrZSBhIHN0cnVjdAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfanNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKK30KKworLyoqCisgKiBSZXR1cm4gdHlwZSBvZiBjb250YWluZWQgZWxlbWVudHMgZm9yIGEgY29udGFpbmVyIHR5cGUuIEZvciBtYXBzCisgKiB0aGlzIGlzIHR5cGUgb2YgdmFsdWUgKGtleXMgYXJlIGFsd2F5cyBzdHJpbmdzIGluIGpzKQorICovCit0X3R5cGUqIHRfanNfZ2VuZXJhdG9yOjpnZXRfY29udGFpbmVkX3R5cGUodF90eXBlKiB0KSB7CisgIHRfdHlwZSogZXR5cGU7CisgIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICBldHlwZSA9ICgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7CisgICAgZXR5cGUgPSAoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICB9IGVsc2UgeworICAgIGV0eXBlID0gKCh0X21hcCopdCktPmdldF92YWxfdHlwZSgpOworICB9CisgIHJldHVybiBldHlwZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIG5vdGhpbmcgaW4gSlMKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHBvcnRlZCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBzdHJpbmcgcHJlZml4ID0gaGFzX2pzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIG91dCA8PCBwcmVmaXggPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAorICAgICAgKGlzX2V4cG9ydGVkID8gIiA9IG1vZHVsZS5leHBvcnRzLiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpIDogIiIpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModHN0cnVjdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IChpc19leGNlcHRpb24gPyAiIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24iIDogIiIpCisgICAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRzdHJ1Y3QpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAoaXNfZXhjZXB0aW9uID8gIiBleHRlbmRzIFRocmlmdC5URXhjZXB0aW9uIiA6ICIiKQorICAgICAgICAgICAgICAgICAgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChnZW5fbm9kZV8gJiYgaXNfZXhjZXB0aW9uKSB7CisgICAgICBvdXQgPDwgIiA9IGNsYXNzIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgPSBjbGFzcyB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IoYXJncykgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiA9IGZ1bmN0aW9uKGFyZ3MpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICAvLyBDYWxsIHN1cGVyKCkgbWV0aG9kIG9uIGluaGVyaXRlZCBFcnJvciBjbGFzcworICBpZiAoZ2VuX25vZGVfICYmIGlzX2V4Y2VwdGlvbikgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKGFyZ3MpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIlRocmlmdC5URXhjZXB0aW9uLmNhbGwodGhpcywgXCIiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMubmFtZSA9IFwiIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gbWVtYmVycyB3aXRoIGFyZ3VtZW50cworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIGR2YWwgPSBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCB0cnVlKTsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIAorICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGV4Y2VwdGlvbnMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChhcmdzIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gYXJnczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInJldHVybjsiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoYXJncykgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAiY29uc3RydWN0b3IoYXJncz86IHsgIjsKKyAgICB9CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gdW5kZWZpbmVkICYmIGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBvdXQgPDwgKCIgPSBuZXcgIiArIGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpICsgdC0+Z2V0X25hbWUoKSArCisgICAgICAgICAgICAgICAgIihhcmdzLiIrKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsiKTsiKTsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHRfdHlwZSogZXR5cGUgPSBnZXRfY29udGFpbmVkX3R5cGUodCk7CisgICAgICAgIHN0cmluZyBjb3B5RnVuYyA9IHQtPmlzX21hcCgpID8gIlRocmlmdC5jb3B5TWFwIiA6ICJUaHJpZnQuY29weUxpc3QiOworICAgICAgICBzdHJpbmcgdHlwZV9saXN0ID0gIiI7CisKKyAgICAgICAgd2hpbGUgKGV0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICAgIGlmICh0eXBlX2xpc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0eXBlX2xpc3QgKz0gIiwgIjsKKyAgICAgICAgICB9CisgICAgICAgICAgdHlwZV9saXN0ICs9IGV0eXBlLT5pc19tYXAoKSA/ICJUaHJpZnQuY29weU1hcCIgOiAiVGhyaWZ0LmNvcHlMaXN0IjsKKyAgICAgICAgICBldHlwZSA9IGdldF9jb250YWluZWRfdHlwZShldHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlX2xpc3QgKz0ganNfdHlwZV9uYW1lc3BhY2UoZXR5cGUtPmdldF9wcm9ncmFtKCkpICsgZXR5cGUtPmdldF9uYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlX2xpc3QgKz0gIm51bGwiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICgiID0gIiArIGNvcHlGdW5jICsgIihhcmdzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCkgKworICAgICAgICAgICAgICAgICIsIFsiICsgdHlwZV9saXN0ICsgIl0pOyIpOworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiID0gYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGlmICghKCptX2l0ZXIpLT5nZXRfcmVxKCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLlVOS05PV04sICIKKyAgICAgICAgICAgICAgICInUmVxdWlyZWQgZmllbGQgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdHNfKSB7CisgICAgICAgIGZfdHlwZXNfdHNfIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCB0c19nZXRfcmVxKCptX2l0ZXIpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyAiOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgIn0pOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBEb25lIHdpdGggY29uc3RydWN0b3IKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFnZW5fZXM2XykgeworICAgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICAgIG91dCA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiLCBUaHJpZnQuVEV4Y2VwdGlvbik7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlLm5hbWUgPSAnIgorICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICAvLyBpbml0IHByb3RvdHlwZSBtYW51YWxseSBpZiB3ZSBhcmVuJ3QgdXNpbmcgZXM2CisgICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUgPSB7fTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgfQorCisgIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworCisgIC8vIENsb3NlIG91dCB0aGUgY2xhc3MgZGVmaW5pdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmVhZCAoaW5wdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIi5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGlucHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgImZ0eXBlID0gcmV0LmZ0eXBlOyIgPDwgZW5kbDsKKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIGluZGVudChvdXQpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJmaWQgPSByZXQuZmlkOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChmaWVsZHMuc2l6ZSgpID09IDEpIHsKKyAgICAgIC8vIHBzZXVkbyBjYXNlIHRvIG1ha2UganNsaW50IGhhcHB5CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAwOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAid3JpdGUgKG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwgJiYgdGhpcy4iCisgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlRmllbGRCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5qcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBpZiAoZ2VuX3RzXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5kLnRzIjsKKyAgICBmX3NlcnZpY2VfdHNfLm9wZW4oZl9zZXJ2aWNlX3RzX25hbWUuY19zdHIoKSk7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIGlmICgoZ2VuX25vZGVfIHx8IGdlbl9lczZfKSAmJiBub19uc18pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJcInVzZSBzdHJpY3RcIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwganNfaW5jbHVkZXMoKSA8PCBlbmRsIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIi5kLnRzXCIgLz4iIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV90c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luY2x1ZGVzKCkgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMnKTsiIDw8IGVuZGw7CisgICAgICAvLyBHZW5lcmF0ZSB0eXBlIGFsaWFzZXMKKyAgICAgIC8vIGVudW0KKyAgICAgIHZlY3Rvcjx0X2VudW0qPiBjb25zdCYgZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgICAgICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKKyAgICAgIGZvciAoZV9pdGVyID0gZW51bXMuYmVnaW4oKTsgZV9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKmVfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqZV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gY29uc3QKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3QmIGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgICAgICB2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gZXhjZXB0aW9uCisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBjb25zdCYgZXhjZXB0aW9ucyA9IHByb2dyYW1fLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSBleGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gc3RydWN0cworICAgICAgdmVjdG9yPHRfc3RydWN0Kj4gY29uc3QmIHN0cnVjdHMgPSBwcm9ncmFtXy0+Z2V0X3N0cnVjdHMoKTsKKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgICAgICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqc19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCpzX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGlmICghdHNfbW9kdWxlXy5lbXB0eSgpKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJkZWNsYXJlIG1vZHVsZSAiIDw8IHRzX21vZHVsZV8gPDwgIiB7IjsKKyAgICB9CisgIH0KKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgIGZfc2VydmljZV8gPDwganNfY29uc3RfdHlwZV8gPDwgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXF1aXJlKCcuLyIKKyAgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIicpOyIgPDwgZW5kbCA8PCBqc19jb25zdF90eXBlXworICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50ID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLkNsaWVudDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwganNfY29uc3RfdHlwZV8gPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvciA9ICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIi5Qcm9jZXNzb3I7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwganNfY29uc3RfdHlwZV8gPDwgInR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisgIH0KKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIGlmIChnZW5fdHNfKSB7CisgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgIn0iOworICAgIH0KKyAgICBmX3NlcnZpY2VfdHNfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyBwcmVmaXggPSBoYXNfanNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgOiBqc19jb25zdF90eXBlXzsKKyAgICBmX3NlcnZpY2VfIDw8IHByZWZpeCA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiIDw8ICJleHBvcnRzLlByb2Nlc3NvciI7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgZW5kbCA8PCAiZGVjbGFyZSBjbGFzcyBQcm9jZXNzb3IgIjsKKyAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJwcml2YXRlIF9oYW5kbGVyOiBPYmplY3Q7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihoYW5kbGVyOiBPYmplY3QpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByb2Nlc3MoaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sLCBvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sKTogdm9pZDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yID0gIgorICAgICAgICAgICAgIDw8ICJleHBvcnRzLlByb2Nlc3NvciI7CisgIH0KKworICBib29sIGlzX3N1YmNsYXNzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMOworCisgIC8vIEVTNiBDb25zdHJ1Y3RvcgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgeyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihoYW5kbGVyKSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgIiA9IGZ1bmN0aW9uKGhhbmRsZXIpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGdlbl9lczZfICYmIGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInN1cGVyKGhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBEb25lIHdpdGggY29uc3RydWN0b3IKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBFUzUgc2VydmljZSBpbmhlcml0YW5jZQorICBpZiAoIWdlbl9lczZfICYmIGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRocmlmdC5pbmhlcml0cygiIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yLCAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzIChpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiciA9IGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiaWYgKHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdLmNhbGwodGhpcywgci5yc2VxaWQsIGlucHV0LCBvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5za2lwKFRocmlmdC5UeXBlLlNUUlVDVCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAiIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAiVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCwgIgorICAgICAgICAgICAgICAgICInVW5rbm93biBmdW5jdGlvbiAnICsgci5mbmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKHIuZm5hbWUsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHIucnNlcWlkKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgLy8gQ2xvc2Ugb2ZmIHRoZSBwcm9jZXNzb3IgY2xhc3MgZGVmaW5pdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKyAgaWYgKGdlbl9ub2RlXyAmJiBnZW5fdHNfKSB7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiAoc2VxaWQsIGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3NfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICArICIgPSBmdW5jdGlvbihzZXFpZCwgaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX3RzXykgeworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihzZXFpZDogbnVtYmVyLCBpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOiB2b2lkOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgKyAiX3Jlc3VsdCI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJhcmdzLnJlYWQoaW5wdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBQcm9taXNlIHN0eWxlIGludm9jYXRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICIubGVuZ3RoID09PSAiIDw8IGZpZWxkcy5zaXplKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQcm9taXNlLnJlc29sdmUodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLmJpbmQodGhpcy5faGFuZGxlcikoIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0cmluZyBtYXliZUNvbW1hID0gKGZpZWxkcy5zaXplKCkgPiAwID8gIiwiIDogIiIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUS5mY2FsbCh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIuYmluZCh0aGlzLl9oYW5kbGVyKSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgbWF5YmVDb21tYSA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG1heWJlQ29tbWEgPSAoZl9pdGVyICE9IGZpZWxkcy5lbmQoKSAtIDEgPyAiLCIgOiAiIik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IG1heWJlQ29tbWEgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKSkudGhlbihyZXN1bHQgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIikudGhlbihmdW5jdGlvbihyZXN1bHQpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmVzdWx0X29iaiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIih7c3VjY2VzczogcmVzdWx0fSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAicmVzdWx0X29iai53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KS5jYXRjaChlcnIgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdDsiIDw8IGVuZGw7CisKKyAgYm9vbCBoYXNfZXhjZXB0aW9uID0gZmFsc2U7CisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGlmIChleGNlcHRpb25zKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lbWJlcnMuYmVnaW4oKTsgaXQgIT0gbWVtYmVycy5lbmQoKTsgKytpdCkgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBpZiAoIWhhc19leGNlcHRpb24pIHsKKyAgICAgICAgICBoYXNfZXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnIgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIHx8IGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGZfc2VydmljZV8gPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoZXJyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV04sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXJyLm1lc3NhZ2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGw7CisKKyAgaWYgKGhhc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICAvLyBFbmQgcHJvbWlzZSBzdHlsZSBpbnZvY2F0aW9uCisKKyAgLy8gQ2FsbGJhY2sgc3R5bGUgaW52b2NhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgfQorCisgIGlmIChnZW5fZXM2XykgeworICAgIGZfc2VydmljZV8gPDwgIihlcnIsIHJlc3VsdCkgPT4geyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdF9vYmo7IiA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKChlcnIgPT09IG51bGwgfHwgdHlwZW9mIGVyciA9PT0gJ3VuZGVmaW5lZCcpIjsKKyAgaWYgKGhhc19leGNlcHRpb24pIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqaXQpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiB8fCBlcnIgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgfQorICB9CisgIGZfc2VydmljZV8gPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdF9vYmogPSBuZXcgIiA8PCByZXN1bHRuYW1lCisgICAgICAgICAgICAgPDwgIigoZXJyICE9PSBudWxsIHx8IHR5cGVvZiBlcnIgPT09ICd1bmRlZmluZWQnKSA/IGVyciA6IHtzdWNjZXNzOiByZXN1bHR9KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdF9vYmogPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV04sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXJyLm1lc3NhZ2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdF9vYmoud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIC8vIEVuZCBjYWxsYmFjayBzdHlsZSBpbnZvY2F0aW9uCisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIERvIG5vdCBnZW5lcmF0ZSBUUyBkZWZpbml0aW9ucyBmb3IgaGVscGVyIGZ1bmN0aW9ucworICBib29sIGdlbl90c190bXAgPSBnZW5fdHNfOworICBnZW5fdHNfID0gZmFsc2U7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCAiLy9IRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKKyAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOworICAgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgZmFsc2UpOworICAgIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgICAgdHMtPnNldF9uYW1lKG5hbWUpOworICB9CisKKyAgZ2VuX3RzXyA9IGdlbl90c190bXA7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgKHZvaWQpdHNlcnZpY2U7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgKHZvaWQpdHNlcnZpY2U7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgYm9vbCBpc19zdWJjbGFzc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTDsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHByZWZpeCA9IGhhc19qc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIGZfc2VydmljZV8gPDwgcHJlZml4IDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCA9ICIgPDwgImV4cG9ydHMuQ2xpZW50IjsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2ModHNlcnZpY2UpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50ICI7CisgICAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAieyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJDbGllbnQiOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYyh0c2VydmljZSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiOworICAgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV90c18gPDwgInsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gRVM2IENvbnN0cnVjdG9yCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChpc19zdWJjbGFzc19zZXJ2aWNlKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyBleHRlbmRzICIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGNsYXNzIHsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY29uc3RydWN0b3Iob3V0cHV0LCBwQ2xhc3MpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY29uc3RydWN0b3IoaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24ob3V0cHV0LCBwQ2xhc3MpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5vdXRwdXQgPSBvdXRwdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5wQ2xhc3MgPSBwQ2xhc3M7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5fc2VxaWQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX3JlcXMgPSB7fTsiIDw8IGVuZGw7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByaXZhdGUgaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSBvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAicHJpdmF0ZSBzZXFpZDogbnVtYmVyOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJjb25zdHJ1Y3RvcihpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dD86IFRocmlmdC5USlNPTlByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5pbnB1dCA9IGlucHV0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMub3V0cHV0ID0gKCFvdXRwdXQpID8gaW5wdXQgOiBvdXRwdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5zZXFpZCA9IDA7IiA8PCBlbmRsOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAic2VxaWQ6IG51bWJlcjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICA8PCAiY29uc3RydWN0b3IoaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sLCBvdXRwdXQ/OiBUaHJpZnQuVEpTT05Qcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGluaXQgcHJvdG90eXBlCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZSA9IHt9OyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyB1dGlscyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZXFpZCAoKSB7IHJldHVybiB0aGlzLl9zZXFpZDsgfSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibmV3X3NlcWlkICgpIHsgcmV0dXJuIHRoaXMuX3NlcWlkICs9IDE7IH0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLnNlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZDsgfTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZCArPSAxOyB9OyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QoYXJnX3N0cnVjdCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmdsaXN0IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuIgorICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIiwgIWdlbl9lczZfKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgLy8gZnVuY3Rpb24gZGVmaW5pdGlvbiB3aXRob3V0IGNhbGxiYWNrCisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PCB0c19pbmRlbnQoKSA8PCB0c19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UsIGZhbHNlKSA8PCBlbmRsOworICAgICAgaWYgKCFnZW5fZXM2XykgeworICAgICAgICAvLyBvdmVybG9hZCB3aXRoIGNhbGxiYWNrCisgICAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8IHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG92ZXJsb2FkIHdpdGggY2FsbGJhY2sKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUsIHRydWUpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl9lczZfICYmIGdlbl9ub2RlXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9zZXFpZCA9IHRoaXMubmV3X3NlcWlkKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3JlcXNbc2VsZi5zZXFpZCgpXSA9IChlcnJvciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX25vZGVfKSB7IC8vIE5vZGUuanMgb3V0cHV0ICAgICAgLi9nZW4tbm9kZWpzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLl9zZXFpZCA9IHRoaXMubmV3X3NlcWlkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAiX2RlZmVyID0gUS5kZWZlcigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAidGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldID0gZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZXJyb3IpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2RlZmVyLnJlamVjdChlcnJvcik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2RlZmVyLnJlc29sdmUocmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIF9kZWZlci5wcm9taXNlOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gPSBjYWxsYmFjazsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl9lczZfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0CisgICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICIoZXJyb3IsIHJlc3VsdCkgPT4geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZShyZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworCisgICAgfSBlbHNlIGlmIChnZW5fanF1ZXJ5XykgeyAvLyBqUXVlcnkgb3V0cHV0ICAgICAgIC4vZ2VuLWpzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInRoaXMucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicG9zdERhdGEgPSB0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0CisgICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJ0cnVlKTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIi5qcVJlcXVlc3QodGhpcywgcG9zdERhdGEsIGFyZ3VtZW50cywgdGhpcy5yZWN2XyIgPDwgZnVubmFtZQorICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsgLy8gU3RhbmRhcmQgSmF2YVNjcmlwdCAuL2dlbi1qcworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdAorICAgICAgICAgICAgICAgICA8PCAoYXJnbGlzdC5lbXB0eSgpID8gIiIgOiAiLCAiKSA8PCAiY2FsbGJhY2spOyAiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCFjYWxsYmFjaykgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAgcmV0dXJuICI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gU2VuZCBmdW5jdGlvbgorICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgKCIgPDwgYXJnbGlzdCA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRVM2IGpzIHN0aWxsIHVzZXMgY2FsbGJhY2tzIGhlcmUuIFNob3VsZCByZWZhY3RvciB0aGlzIHRvIHByb21pc2Ugc3R5bGUgbGF0ZXIuLgorICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgKCIgPDwgYXJndW1lbnRfbGlzdChhcmdfc3RydWN0LCB0cnVlKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlLnNlbmRfIgorICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIiwgIWdlbl9ub2RlXykgPDwgIiB7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgb3V0cHV0VmFyOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgIm91dHB1dCA9IG5ldyB0aGlzLnBDbGFzcyh0aGlzLm91dHB1dCk7IiA8PCBlbmRsOworICAgICAgb3V0cHV0VmFyID0gIm91dHB1dCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dFZhciA9ICJ0aGlzLm91dHB1dCI7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2FyZ3MiOworCisgICAgc3RkOjpzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRocmlmdC5NZXNzYWdlVHlwZS5PTkVXQVkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRocmlmdC5NZXNzYWdlVHlwZS5DQUxMIjsKKyAgICAvLyBCdWlsZCBhcmdzCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKXsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInBhcmFtcyA9IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAoZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpLTEpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKHBhcmFtcyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlciB3aXRoaW4gdHJ5L2NhdGNoCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHRoaXMuc2VxaWQoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IG91dHB1dFZhciA8PCAiLndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiJywgIiA8PCBtZXNzYWdlVHlwZSA8PCAiLCB0aGlzLnNlcWlkKTsiIDw8IGVuZGw7CisgICAgfQorCisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSgiIDw8IG91dHB1dFZhciA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyCisgICAgICAgICAgICAgICA8PCAiLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGlmKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgImNhbGxiYWNrID0gdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldIHx8IGZ1bmN0aW9uKCkge307IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2sobnVsbCk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKGNhbGxiYWNrKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGdlbl9lczZfKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbDsKKyAgICAgICAgaWYoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsIG51bGwpOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjaygpOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCAoKSA9PiB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfbGV0X3R5cGVfIDw8ICJlcnJvciA9IG51bGwsIHJlc3VsdCA9IG51bGw7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0ID0gc2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGUpIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBlcnJvciA9IGU7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2soZXJyb3IsIHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoY2FsbGJhY2spIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpZigoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgbnVsbCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBmdW5jdGlvbigpIHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdCA9IG51bGw7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0ID0gc2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGUpIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBlOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAvLyBSZXNldCB0aGUgdHJhbnNwb3J0IGFuZCBkZWxldGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBpZiB0aGVyZSB3YXMgYSBzZXJpYWxpemF0aW9uIGVycm9yCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKGUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodHlwZW9mICIgPDwgb3V0cHV0VmFyIDw8ICIucmVzZXQgPT09ICdmdW5jdGlvbicpIHsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgb3V0cHV0VmFyIDw8ICIucmVzZXQoKTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodHlwZW9mICIgPDwgb3V0cHV0VmFyIDw8ICIuZ2V0VHJhbnNwb3J0KCkucmVzZXQgPT09ICdmdW5jdGlvbicpIHsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgb3V0cHV0VmFyIDw8ICIuZ2V0VHJhbnNwb3J0KCkucmVzZXQoKTsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gQ2xvc2Ugc2VuZCBmdW5jdGlvbgorICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFJlY2VpdmUgZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICAvLyBPcGVuIHJlY2VpdmUgZnVuY3Rpb24KKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgKGlucHV0LCBtdHlwZSwgcnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9IGZ1bmN0aW9uKGlucHV0LG10eXBlLHJzZXFpZCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS4iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBzdGQ6OnN0cmluZyBpbnB1dFZhcjsKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgaW5wdXRWYXIgPSAiaW5wdXQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRWYXIgPSAidGhpcy5pbnB1dCI7CisgICAgICB9CisKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAiY2FsbGJhY2sgPSB0aGlzLl9yZXFzW3JzZXFpZF0gfHwgZnVuY3Rpb24oKSB7fTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbcnNlcWlkXTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXQgPSB0aGlzLmlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAibXR5cGUgPSByZXQubXR5cGU7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ4ID0gbmV3IFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIngucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbnB1dFZhciA8PCAiLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJ4IikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0LnJlYWQoIiA8PCBpbnB1dFZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5wdXRWYXIgPDwgIi5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHJlbmRlcl9yZWN2X3Rocm93KCJyZXN1bHQuIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobnVsbCAhPT0gcmVzdWx0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgIgorICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9yZWN2X3JldHVybigicmVzdWx0LnN1Y2Nlc3MiKSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIiciICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JyIpCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNhbGxiYWNrKG51bGwpOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgcmVjZWl2ZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGlmIChnZW5fZXM2XykgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEZpbmlzaCBjbGFzcyBkZWZpbml0aW9ucworICBpZiAoZ2VuX3RzXykgeworICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKSB7CisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICByZXR1cm4gInJldHVybiBjYWxsYmFjaygiICsgdmFyICsgIik7IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gInRocm93ICIgKyB2YXIgKyAiOyI7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3JldHVybihzdGQ6OnN0cmluZyB2YXIpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHJldHVybiAicmV0dXJuIGNhbGxiYWNrKG51bGwsICIgKyB2YXIgKyAiKTsiOworICB9IGVsc2UgeworICAgIHJldHVybiAicmV0dXJuICIgKyB2YXIgKyAiOyI7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgeworICAodm9pZClpbmNsYXNzOworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaW5wdXQuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAodHlwZS0+aXNfYmluYXJ5KCkgPyAicmVhZEJpbmFyeSgpIiA6ICJyZWFkU3RyaW5nKCkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgfQorCisgICAgaWYgKCFnZW5fbm9kZV8pIHsKKyAgICAgIG91dCA8PCAiLnZhbHVlIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpbnB1dCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcgcnRtcDMgPSB0bXAoIl9ydG1wMyIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplIHx8IDA7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplIHx8IDA7IiA8PCBlbmRsOworICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKCFnZW5fbm9kZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaSA8PCAiID4gMCApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICBpZiAoaW5wdXQucnN0YWNrLmxlbmd0aCA+IGlucHV0LnJwb3NbaW5wdXQucnBvcy5sZW5ndGggLTFdICsgMSkgeyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgaW5wdXQucnN0YWNrLnBvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXksIGZhbHNlLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwsIGZhbHNlLCBmYWxzZSkgPDwgIjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgLy8gSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCisgICAgaWYgKCFwcmVmaXguZW1wdHkoKSkKKyAgICAgIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgKHR5cGUtPmlzX2JpbmFyeSgpID8gIndyaXRlQmluYXJ5KCIgOiAid3JpdGVTdHJpbmcoIikgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiVGhyaWZ0Lm9iamVjdExlbmd0aCgiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHByZWZpeCA8PCAiLmxlbmd0aCk7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGtpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBraXRlciA8PCAiKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19sZXRfdHlwZV8gPDwgdml0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBraXRlciA8PCAiXTsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBpdGVyIDw8ICIpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwgaXRlciA8PCAiKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXTsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICJ0aGlzLiIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKCFvYmopIHsKKyAgICByZXN1bHQgPSBqc19sZXRfdHlwZV8gKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaWYgKG9iaikgeworICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKKworICBzdHJpbmcgc3RyOworCisgIHN0ciA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIgPSBmdW5jdGlvbigiOworCisgIHN0ciArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgaW5jbHVkZV9jYWxsYmFjayk7CisKKyAgc3RyICs9ICIpIjsKKyAgcmV0dXJuIHN0cjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKGluY2x1ZGVfY2FsbGJhY2spIHsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICJjYWxsYmFjayI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgYSB0X3R5cGUgdG8gYSBUeXBlU2NyaXB0IHR5cGUgKHN0cmluZykuCisgKiBAcGFyYW0gdF90eXBlIFR5cGUgdG8gY29udmVydCB0byBUeXBlU2NyaXB0CisgKiBAcmV0dXJuIFN0cmluZyBUeXBlU2NyaXB0IHR5cGUKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0c19nZXRfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RkOjpzdHJpbmcgdHNfdHlwZTsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgdHNfdHlwZSA9ICJzdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgdHNfdHlwZSA9ICJib29sZWFuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICB0c190eXBlID0gImFueSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHRzX3R5cGUgPSAibnVtYmVyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRzX3R5cGUgPSAidm9pZCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lOworICAgIGlmICh0eXBlLT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgICB0eXBlX25hbWUgPSBqc19uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSk7CisgICAgfQorICAgIHR5cGVfbmFtZS5hcHBlbmQodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgdHNfdHlwZSA9IHR5cGVfbmFtZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworCisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKworICAgIHRzX3R5cGUgPSB0c19nZXRfdHlwZShldHlwZSkgKyAiW10iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGt0eXBlID0gdHNfZ2V0X3R5cGUoKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBzdHJpbmcgdnR5cGUgPSB0c19nZXRfdHlwZSgoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworCisKKyAgICBpZiAoa3R5cGUgPT0gIm51bWJlciIgfHwga3R5cGUgPT0gInN0cmluZyIgKSB7CisgICAgICB0c190eXBlID0gInsgW2s6ICIgKyBrdHlwZSArICJdOiAiICsgdnR5cGUgKyAiOyB9IjsKKyAgICB9IGVsc2UgaWYgKCgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICAgIC8vIE5vdCB5ZXQgc3VwcG9ydGVkIChlbnVtIG1hcCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9wdWxsLzI2NTIKKyAgICAgIC8vdHNfdHlwZSA9ICJ7IFtrOiAiICsga3R5cGUgKyAiXTogIiArIHZ0eXBlICsgIjsgfSI7CisgICAgICB0c190eXBlID0gInsgW2s6IG51bWJlciAvKiIgKyBrdHlwZSArICIqL106ICIgKyB2dHlwZSArICI7IH0iOworICAgIH0gZWxzZSB7CisgICAgICB0c190eXBlID0gImFueSI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRzX3R5cGU7Cit9CisKKy8qKgorICogUmVuZGVycyBhIFR5cGVTY3JpcHQgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICduYW1lKGFyZ3M6IHR5cGVzKTogdHlwZTsnCisgKgorICogQHBhcmFtIHRfZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHBhcmFtIGJvb2wgaW4tL2V4Y2x1ZGUgdGhlIGNhbGxiYWNrIGFyZ3VtZW50CisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0c19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfY2FsbGJhY2ssIGJvb2wgb3B0aW9uYWxfY2FsbGJhY2spIHsKKyAgc3RyaW5nIHN0cjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArIHRzX2dldF9yZXEoKmZfaXRlcikgKyAiOiAiICsgdHNfZ2V0X3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgIGlmIChmX2l0ZXIgKyAxICE9IGZpZWxkcy5lbmQoKSB8fCAoaW5jbHVkZV9jYWxsYmFjayAmJiBmaWVsZHMuc2l6ZSgpID4gMCkpIHsKKyAgICAgIHN0ciArPSAiLCAiOworICAgIH0KKyAgfQorCisgIGlmIChpbmNsdWRlX2NhbGxiYWNrKSB7CisgICAgc3RyaW5nIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyA9IG9wdGlvbmFsX2NhbGxiYWNrID8gIj8iIDogIiI7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHN0cmluZyBleGNlcHRpb25fdHlwZXM7CisgICAgICBpZiAoZXhjZXB0aW9ucykgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lbWJlcnMuYmVnaW4oKTsgaXQgIT0gbWVtYmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCppdCktPmdldF90eXBlKCkpOworICAgICAgICAgIGlmIChpdCA9PSBtZW1iZXJzLmJlZ2luKCkpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbl90eXBlcyA9IHQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbl90eXBlcyArPSAiIHwgIiArIHQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZXhjZXB0aW9uX3R5cGVzID09ICIiKSB7CisgICAgICAgIHN0ciArPSAiY2FsbGJhY2siICsgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nICsgIjogKGVycm9yOiB2b2lkLCByZXNwb25zZTogIiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKT0+dm9pZCk6ICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHIgKz0gImNhbGxiYWNrIiArIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyArICI6IChlcnJvcjogIiArIGV4Y2VwdGlvbl90eXBlcyArICIsIHJlc3BvbnNlOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3RyICs9ICJjYWxsYmFjayIgKyBjYWxsYmFja19vcHRpb25hbF9zdHJpbmcgKyAiOiAoZGF0YTogIiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiKT0+dm9pZCk6ICI7CisgICAgfQorCisgICAgaWYgKGdlbl9qcXVlcnlfKSB7CisgICAgICBzdHIgKz0gIkpRdWVyeVByb21pc2U8IiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyI+OyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAidm9pZDsiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIHN0ciArPSAiKTogUHJvbWlzZTwiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI+OyI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc3RyICs9ICIpOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI7IjsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFRha2VzIGEgbmFtZSBhbmQgcHJvZHVjZXMgYSB2YWxpZCBOb2RlSlMgaWRlbnRpZmllciBmcm9tIGl0CisgKgorICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgTm9kZUpTIGlkZW50aWZpZXIKKyAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIG5hbWUgd2l0aCB0aGUgdXBkYXRlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9IG5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykgJiYgKCckJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSmF2YXNjcmlwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAganF1ZXJ5OiAgICAgICAgICBHZW5lcmF0ZSBqUXVlcnkgY29tcGF0aWJsZSBjb2RlLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG5vZGU6ICAgICAgICAgICAgR2VuZXJhdGUgbm9kZS5qcyBjb21wYXRpYmxlIGNvZGUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdHM6ICAgICAgICAgICAgICBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlZmluaXRpb24gZmlsZXMuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgd2l0aF9uczogICAgICAgICBDcmVhdGUgZ2xvYmFsIG5hbWVzcGFjZSBvYmplY3RzIHdoZW4gdXNpbmcgbm9kZS5qc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGVzNjogICAgICAgICAgICAgQ3JlYXRlIEVTNiBjb2RlIHdpdGggUHJvbWlzZXNcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDUzNjEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDc5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdGFjazsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsKK3N0YXRpYyBjb25zdCBzdHJpbmcgcXVvdCA9ICJcIiI7CitzdGF0aWMgY29uc3QgYm9vbCBOT19JTkRFTlQgPSBmYWxzZTsKK3N0YXRpYyBjb25zdCBib29sIEZPUkNFX1NUUklORyA9IHRydWU7CisKK2NsYXNzIHRfanNvbl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2pzb25fZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibWVyZ2UiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGpzb246IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzb24iOworICB9CisKKyAgdmlydHVhbCB+dF9qc29uX2dlbmVyYXRvcigpIHt9CisKKyAgLyoqCisgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworcHJpdmF0ZToKKyAgYm9vbCBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9qc29uXzsKKyAgc3RkOjpzdGFjazxib29sPiBjb21tYV9uZWVkZWRfOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJpbmcgbnVtYmVyX3RvX3N0cmluZyhUIHQpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICAgIG91dC5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgICBvdXQucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKKyAgICBvdXQgPDwgdDsKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfbnVtYmVyKFQgbikgeworICAgIGZfanNvbl8gPDwgbnVtYmVyX3RvX3N0cmluZyhuKTsKKyAgfQorCisgIHN0cmluZyBnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgZ2V0X3F1YWxpZmllZF9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgc3RhcnRfb2JqZWN0KGJvb2wgc2hvdWxkX2luZGVudCA9IHRydWUpOworICB2b2lkIHN0YXJ0X2FycmF5KCk7CisgIHZvaWQgZW5kX29iamVjdCgpOworICB2b2lkIGVuZF9hcnJheSgpOworICB2b2lkIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICB2b2lkIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICBzdHJpbmcgZXNjYXBlX2pzb25fc3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQpOworICBzdHJpbmcganNvbl9zdHIoY29uc3Qgc3RyaW5nJiBzdHIpOworICB2b2lkIG1lcmdlX2luY2x1ZGVzKHRfcHJvZ3JhbSopOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKTsKKworICB2b2lkIHdyaXRlX3R5cGVfc3BlY19lbnRyeShjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3R5cGVfc3BlYyh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgd3JpdGVfdmFsdWUodF90eXBlKiB0dmFsdWUpOworICB2b2lkIHdyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGZvcmNlX3N0cmluZyA9IGZhbHNlKTsKKyAgdm9pZCB3cml0ZV9rZXlfYW5kKHN0cmluZyBrZXkpOworICB2b2lkIHdyaXRlX2tleV9hbmRfc3RyaW5nKHN0cmluZyBrZXksIHN0cmluZyB2YWwpOworICB2b2lkIHdyaXRlX2tleV9hbmRfaW50ZWdlcihzdHJpbmcga2V5LCBpbnQgdmFsKTsKKyAgdm9pZCB3cml0ZV9rZXlfYW5kX2Jvb2woc3RyaW5nIGtleSwgYm9vbCB2YWwpOworfTsKKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9qc29uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmpzb24iOworICBmX2pzb25fLm9wZW4oZl9qc29uX25hbWUuY19zdHIoKSk7CisKKyAgLy8gTWVyZ2UgYWxsIGluY2x1ZGVkIHByb2dyYW1zIGludG8gdGhpcyBvbmUgc28gd2UgY2FuIG91dHB1dCBvbmUgYmlnIGZpbGUuCisgIGlmIChzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7CisgICAgbWVyZ2VfaW5jbHVkZXMocHJvZ3JhbV8pOworICB9Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjplc2NhcGVfanNvbl9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBpbnB1dC5iZWdpbigpOyBpdGVyICE9IGlucHV0LmVuZCgpOyBpdGVyKyspIHsKKyAgICBzd2l0Y2ggKCppdGVyKSB7CisgICAgY2FzZSAnXFwnOgorICAgICAgc3MgPDwgIlxcXFwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBzcyA8PCAiXFxcIiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICcvJzoKKyAgICAgIHNzIDw8ICJcXC8iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXGInOgorICAgICAgc3MgPDwgIlxcYiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcZic6CisgICAgICBzcyA8PCAiXFxmIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xuJzoKKyAgICAgIHNzIDw8ICJcXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXHInOgorICAgICAgc3MgPDwgIlxcciI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgICBzcyA8PCAiXFx0IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzcyA8PCAqaXRlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6c3RhcnRfb2JqZWN0KGJvb2wgc2hvdWxkX2luZGVudCkgeworICBmX2pzb25fIDw8IChzaG91bGRfaW5kZW50ID8gaW5kZW50KCkgOiAiIikgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBjb21tYV9uZWVkZWRfLnB1c2goZmFsc2UpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OnN0YXJ0X2FycmF5KCkgeworICBmX2pzb25fIDw8ICJbIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgY29tbWFfbmVlZGVkXy5wdXNoKGZhbHNlKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9jb21tYV9pZl9uZWVkZWQoKSB7CisgIGlmIChjb21tYV9uZWVkZWRfLnRvcCgpKSB7CisgICAgZl9qc29uXyA8PCAiLCIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluZGljYXRlX2NvbW1hX25lZWRlZCgpIHsKKyAgY29tbWFfbmVlZGVkXy5wb3AoKTsKKyAgY29tbWFfbmVlZGVkXy5wdXNoKHRydWUpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmQoc3RyaW5nIGtleSkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIjsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZF9pbnRlZ2VyKHN0cmluZyBrZXksIGludCB2YWwpIHsKKyAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICIgPDwgbnVtYmVyX3RvX3N0cmluZyh2YWwpOworICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kX3N0cmluZyhzdHJpbmcga2V5LCBzdHJpbmcgdmFsKSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiIDw8IGpzb25fc3RyKHZhbCk7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmRfYm9vbChzdHJpbmcga2V5LCBib29sIHZhbCkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIiA8PCAodmFsID8gInRydWUiIDogImZhbHNlIik7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmVuZF9vYmplY3QoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGZfanNvbl8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIGNvbW1hX25lZWRlZF8ucG9wKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6ZW5kX2FycmF5KCkgeworICBpbmRlbnRfZG93bigpOworICBpZiAoY29tbWFfbmVlZGVkXy50b3AoKSkgeworICAgIGZfanNvbl8gPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9qc29uXykgPDwgIl0iOworICBjb21tYV9uZWVkZWRfLnBvcCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3R5cGVfc3BlY19vYmplY3QoY29uc3QgY2hhciogbmFtZSwgdF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgd3JpdGVfa2V5X2FuZChuYW1lKTsKKyAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKKyAgICB3cml0ZV9rZXlfYW5kKCJ0eXBlSWQiKTsKKyAgICB3cml0ZV90eXBlX3NwZWModHR5cGUpOworICAgIGVuZF9vYmplY3QoKTsKKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3R5cGVfc3BlY19lbnRyeShjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKSB7CisgIHdyaXRlX2tleV9hbmQobmFtZSk7CisgIHdyaXRlX3R5cGVfc3BlYyh0dHlwZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworCisgIHdyaXRlX3N0cmluZyhnZXRfdHlwZV9uYW1lKHR0eXBlKSk7CisKKyAgaWYgKHR0eXBlLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJjbGFzcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0dHlwZSkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJrZXlUeXBlSWQiLCBnZXRfdHlwZV9uYW1lKGt0eXBlKSk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInZhbHVlVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh2dHlwZSkpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImtleVR5cGUiLCBrdHlwZSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgidmFsdWVUeXBlIiwgdnR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJlbGVtVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShldHlwZSkpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImVsZW1UeXBlIiwgZXR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZWxlbVR5cGVJZCIsIGdldF90eXBlX25hbWUoZXR5cGUpKTsKKyAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJlbGVtVHlwZSIsIGV0eXBlKTsKKyAgfQorfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9qc29uXyA8PCBlbmRsOworICBmX2pzb25fLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6bWVyZ2VfaW5jbHVkZXModF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGluY19pdGVyOworICBmb3IgKGluY19pdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIGluY2x1ZGUgPSAqaW5jX2l0ZXI7CisgICAgLy8gcmVjdXJzZSBpbiBjYXNlIHdlIGdldCBjcmF6eQorICAgIG1lcmdlX2luY2x1ZGVzKGluY2x1ZGUpOworICAgIC8vIG1lcmdlIGVudW1zCisgICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gaW5jbHVkZS0+Z2V0X2VudW1zKCk7CisgICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX2VudW0oKmVuX2l0ZXIpOworICAgIH0KKyAgICAvLyBtZXJnZSB0eXBlZGVmcworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IGluY2x1ZGUtPmdldF90eXBlZGVmcygpOworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgICB9CisgICAgLy8gbWVyZ2Ugc3RydWN0cworICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBpbmNsdWRlLT5nZXRfb2JqZWN0cygpOworICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgICAgLy8gbWVyZ2UgY29uc3RhbnRzCisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBpbmNsdWRlLT5nZXRfY29uc3RzKCk7CisgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfY29uc3QoKmNfaXRlcik7CisgICAgfQorCisgICAgLy8gbWVyZ2Ugc2VydmljZXMKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBpbmNsdWRlLT5nZXRfc2VydmljZXMoKTsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfc2VydmljZSgqc3ZfaXRlcik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKworICBpbml0X2dlbmVyYXRvcigpOworCisgIHN0YXJ0X29iamVjdCgpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHByb2dyYW1fLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHByb2dyYW1fLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgcHJvZ3JhbV8tPmdldF9kb2MoKSk7CisgIH0KKworICAvLyBXaGVuIG1lcmdpbmcgaW5jbHVkZXMsIHRoZSAibmFtZXNwYWNlcyIgYW5kICJpbmNsdWRlcyIgc2VjdGlvbnMKKyAgLy8gYmVjb21lIGFtYmlndW91cywgc28ganVzdCBza2lwIHRoZW0uCisgIGlmICghc2hvdWxkX21lcmdlX2luY2x1ZGVzXykgeworICAgIC8vIEdlbmVyYXRlIG5hbWVzcGFjZXMKKyAgICB3cml0ZV9rZXlfYW5kKCJuYW1lc3BhY2VzIik7CisgICAgc3RhcnRfb2JqZWN0KE5PX0lOREVOVCk7CisgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgbmFtZXNwYWNlcyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlcygpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5zX2l0OworICAgIGZvciAobnNfaXQgPSBuYW1lc3BhY2VzLmJlZ2luKCk7IG5zX2l0ICE9IG5hbWVzcGFjZXMuZW5kKCk7ICsrbnNfaXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKG5zX2l0LT5maXJzdCwgbnNfaXQtPnNlY29uZCk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworCisgICAgLy8gR2VuZXJhdGUgaW5jbHVkZXMKKyAgICB3cml0ZV9rZXlfYW5kKCJpbmNsdWRlcyIpOworICAgIHN0YXJ0X2FycmF5KCk7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jX2l0OworICAgIGZvciAoaW5jX2l0ID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY19pdCkgeworICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgICB3cml0ZV9zdHJpbmcoKCppbmNfaXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfYXJyYXkoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHdyaXRlX2tleV9hbmQoImVudW1zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICB3cml0ZV9rZXlfYW5kKCJ0eXBlZGVmcyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIHVuaW9ucyBpbiBkZWNsYXJlZCBvcmRlcgorICB3cml0ZV9rZXlfYW5kKCJzdHJ1Y3RzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7CisgICAgfQorICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIC8vIEdlbmVyYXRlIGNvbnN0YW50cworICB3cml0ZV9rZXlfYW5kKCJjb25zdGFudHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfY29uc3RhbnQoKmNfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgc2VydmljZXMKKyAgd3JpdGVfa2V5X2FuZCgic2VydmljZXMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKKworICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCisgIGNsb3NlX2dlbmVyYXRvcigpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdGFydF9vYmplY3QoKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBnZXRfcXVhbGlmaWVkX25hbWUodHR5cGVkZWYpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInR5cGVJZCIsIGdldF90eXBlX25hbWUodHR5cGVkZWYtPmdldF90cnVlX3R5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgdHR5cGVkZWYtPmdldF90cnVlX3R5cGUoKSk7CisgIGlmICh0dHlwZWRlZi0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHR0eXBlZGVmLT5nZXRfZG9jKCkpOworICB9CisgIGlmICh0dHlwZWRlZi0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0dHlwZWRlZi0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHR0eXBlZGVmLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfc3RyaW5nKGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgZl9qc29uXyA8PCBxdW90IDw8IGVzY2FwZV9qc29uX3N0cmluZyh2YWx1ZSkgPDwgcXVvdDsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBzaG91bGRfZm9yY2Vfc3RyaW5nKSB7CisKKyAgc3dpdGNoICh2YWx1ZS0+Z2V0X3R5cGUoKSkgeworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIGlmIChzaG91bGRfZm9yY2Vfc3RyaW5nKSB7CisgICAgICB3cml0ZV9zdHJpbmcobnVtYmVyX3RvX3N0cmluZyh2YWx1ZS0+Z2V0X2ludGVnZXIoKSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZV9udW1iZXIodmFsdWUtPmdldF9pbnRlZ2VyKCkpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICBpZiAoc2hvdWxkX2ZvcmNlX3N0cmluZykgeworICAgICAgd3JpdGVfc3RyaW5nKG51bWJlcl90b19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZV9udW1iZXIodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIHdyaXRlX3N0cmluZyh2YWx1ZS0+Z2V0X3N0cmluZygpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6IHsKKyAgICBzdGFydF9hcnJheSgpOworICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0ID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXQ7CisgICAgZm9yIChsaXQgPSBsaXN0LmJlZ2luKCk7IGxpdCAhPSBsaXN0LmVuZCgpOyArK2xpdCkgeworICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgICBmX2pzb25fIDw8IGluZGVudCgpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUoKmxpdCk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX2FycmF5KCk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogeworICAgIHN0YXJ0X29iamVjdChOT19JTkRFTlQpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtaXQ7CisgICAgZm9yIChtaXQgPSBtYXAuYmVnaW4oKTsgbWl0ICE9IG1hcC5lbmQoKTsgKyttaXQpIHsKKyAgICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgICAgZl9qc29uXyA8PCBpbmRlbnQoKTsKKyAgICAgIC8vIEpTT04gb2JqZWN0cyBvbmx5IGFsbG93IHN0cmluZyBrZXlzCisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPmZpcnN0LCBGT1JDRV9TVFJJTkcpOworICAgICAgZl9qc29uXyA8PCAiOiAiOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUobWl0LT5zZWNvbmQpOworICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGRlZmF1bHQ6CisgICAgZl9qc29uXyA8PCAibnVsbCI7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6Ompzb25fc3RyKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIHJldHVybiBxdW90ICsgZXNjYXBlX2pzb25fc3RyaW5nKHN0cikgKyBxdW90OworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0YW50KHRfY29uc3QqIGNvbikgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIGNvbi0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ0eXBlSWQiLCBnZXRfdHlwZV9uYW1lKGNvbi0+Z2V0X3R5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgY29uLT5nZXRfdHlwZSgpKTsKKworICBpZiAoY29uLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgY29uLT5nZXRfZG9jKCkpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgidmFsdWUiKTsKKyAgd3JpdGVfY29uc3RfdmFsdWUoY29uLT5nZXRfdmFsdWUoKSk7CisKKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBpZiAodGVudW0tPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0ZW51bS0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0ZW51bS0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgICBzdGFydF9vYmplY3QoKTsKKyAgICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0ZW51bS0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHRlbnVtLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICAgIH0KKyAgICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmQoIm1lbWJlcnMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7CisgIGZvciAodmFsX2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdmFsX2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZhbF9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSAoKnZhbF9pdGVyKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHZhbC0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKCJ2YWx1ZSIsIHZhbC0+Z2V0X3ZhbHVlKCkpOworICAgIGlmICh2YWwtPmhhc19kb2MoKSkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHZhbC0+Z2V0X2RvYygpKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKKworICBpZiAodHN0cnVjdC0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRzdHJ1Y3QtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kX2Jvb2woImlzRXhjZXB0aW9uIiwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSk7CisKKyAgd3JpdGVfa2V5X2FuZF9ib29sKCJpc1VuaW9uIiwgdHN0cnVjdC0+aXNfdW5pb24oKSk7CisKKyAgd3JpdGVfa2V5X2FuZCgiZmllbGRzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyOworICBmb3IgKG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgZ2V0X3F1YWxpZmllZF9uYW1lKHRzZXJ2aWNlKSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImV4dGVuZHMiLCBnZXRfcXVhbGlmaWVkX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpKTsKKyAgfQorCisgIGlmICh0c2VydmljZS0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRzZXJ2aWNlLT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHNlcnZpY2UtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgiZnVuY3Rpb25zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uKCpmbl9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCB0ZnVuYy0+Z2V0X25hbWUoKSk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInJldHVyblR5cGVJZCIsIGdldF90eXBlX25hbWUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpKTsKKyAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgicmV0dXJuVHlwZSIsIHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKworICB3cml0ZV9rZXlfYW5kX2Jvb2woIm9uZXdheSIsIHRmdW5jLT5pc19vbmV3YXkoKSk7CisKKyAgaWYgKHRmdW5jLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdGZ1bmMtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodGZ1bmMtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdGZ1bmMtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0ZnVuYy0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJhcmd1bWVudHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgd3JpdGVfa2V5X2FuZCgiZXhjZXB0aW9ucyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqZXhfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfaW50ZWdlcigia2V5IiwgZmllbGQtPmdldF9rZXkoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgZmllbGQtPmdldF9uYW1lKCkpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygidHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmIChmaWVsZC0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIGZpZWxkLT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKGZpZWxkLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IGZpZWxkLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gZmllbGQtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgicmVxdWlyZWQiKTsKKyAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CisgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICB3cml0ZV9zdHJpbmcoInJlcXVpcmVkIik7CisgICAgYnJlYWs7CisgIGNhc2UgdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDoKKyAgICB3cml0ZV9zdHJpbmcoInJlcV9vdXQiKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB3cml0ZV9zdHJpbmcoIm9wdGlvbmFsIik7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoZmllbGQtPmdldF92YWx1ZSgpKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiZGVmYXVsdCIpOworICAgIHdyaXRlX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgIH0KKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAibGlzdCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAic2V0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJtYXAiOworICB9CisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpMzIiOworICB9CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gKCh0X3N0cnVjdCopdHR5cGUpLT5pc191bmlvbigpID8gInVuaW9uIiA6ICJzdHJ1Y3QiOworICB9CisgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiZXhjZXB0aW9uIjsKKyAgfQorICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNldHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgcmV0dXJuIHRiYXNldHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZXR5cGUtPmdldF9iYXNlKCkpOworICB9CisKKyAgcmV0dXJuICIodW5rbm93bikiOworfQorCitzdHJpbmcgdF9qc29uX2dlbmVyYXRvcjo6Z2V0X3F1YWxpZmllZF9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18gfHwgdHR5cGUtPmdldF9wcm9ncmFtKCkgPT0gcHJvZ3JhbV8pIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG1lcmdlOiAgICAgICAgICAgR2VuZXJhdGUgb3V0cHV0IHdpdGggaW5jbHVkZWQgZmlsZXMgbWVyZ2VkXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWU4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHN0ZDo6bWFwOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogTFVBIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9sdWFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfbHVhX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBnZW5fcmVxdWlyZXNfID0gdHJ1ZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJvbWl0X3JlcXVpcmVzIikgPT0gMCkgeworICAgICAgICBnZW5fcmVxdWlyZXNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gbHVhOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1sdWEiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCitwcml2YXRlOgorICAvKioKKyAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIGx1YSByZXF1aXJlIHN0YXRlbWVudHMuCisgICAqLworICBib29sIGdlbl9yZXF1aXJlc187CisKKyAgLyoqCisgICAqIFN0cnVjdC1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBEZXNlcmlhbGl6YXRpb24gKFJlYWQpCisgICAqLworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIChXcml0ZSkKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisgIHN0ZDo6c3RyaW5nIGx1YV9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pOworCisgIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi0tXG4iKSArICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdFxuIiArICItLVxuIgorICAgICAgICAgICArICItLSBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIi0tIEAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkXG4iCisgICAgICAgICAgICsgIi0tXG4iOworICB9CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKK307CisKKy8qKgorICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgTUtESVIob3V0ZGlyLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCisgIHN0cmluZyBjdXJfbmFtZXNwYWNlID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7CisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gb3V0ZGlyICsgY3VyX25hbWVzcGFjZSArICJjb25zdGFudHMubHVhIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArIGN1cl9uYW1lc3BhY2UgKyAidHR5cGVzLmx1YSI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworCisgIC8vIEFkZCBoZWFkZXJzCisgIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBsdWFfaW5jbHVkZXMoKTsKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7CisgIGlmIChnZW5fcmVxdWlyZXNfKSB7CisgICAgZl90eXBlc18gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbmFtZXNwYWNlIDw8ICJjb25zdGFudHMnIjsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdHlwZWRlZiAoZXNzZW50aWFsbHkgYSBjb25zdGFudCkKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICIgPSAiCisgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUgKHRhYmxlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7KSB7CisgICAgaW50MzJfdCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBmX3R5cGVzXyA8PCAiICAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZTsKKyAgICArK2NfaXRlcjsKKyAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKSkgeworICAgICAgZl90eXBlc18gPDwgIiwiOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisgIGZfdHlwZXNfIDw8ICJ9IjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IChub24tbG9jYWwpIHZhbHVlCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfY29uc3RzXyA8PCBlbmRsIDw8IGVuZGwgPDwgbmFtZSA8PCAiID0gIjsKKyAgZl9jb25zdHNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIiciIDw8IHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIiciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAibHVhbG9uZ251bWJlci5uZXcoJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJykiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAifSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCkKKyAgICAgICAgICAgICAgICAgIDw8ICJdID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICsrdl9pdGVyOworICAgICAgaWYgKHZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIiA9IHsiIDw8IGVuZGw7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBpbmRlbnQob3V0KTsKKyAgICAgIG91dCA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCAiXSI7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPSB0cnVlIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiID0gZmFsc2UiOworICAgICAgfQorICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAifSI7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHRocmlmdCBzdHJ1Y3QKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHRocmlmdCBleGNlcHRpb24KKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHN0cnVjdCBvciBleGNlcHRpb24gKGx1YSB0YWJsZSkKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICIgPSBURXhjZXB0aW9uOm5ld3siIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgX190eXBlID0gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJyI7CisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIgPSBfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGluZGVudChvdXQpOworICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgKyttX2l0ZXI7CisgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpOworICBvdXQgPDwgZW5kbCA8PCAifSI7CisKKyAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gcmVhZGVyCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOnJlYWQoaXByb3QpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgLy8gd2hpbGU6IFJlYWQgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBpZjogQ2hlY2sgd2hhdCB0byByZWFkCisgIGluZGVudChvdXQpIDw8ICJsb2NhbCBmbmFtZSwgZnR5cGUsIGZpZCA9IGlwcm90OnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSBUVHlwZS5TVE9QIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbHNlaWYgZmlkID09ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGhlbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIFJlYWQgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIGZhbHNlLCAic2VsZi4iKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaXByb3Q6c2tpcChmdHlwZSkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGVuZCBpZgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaXByb3Q6c2tpcChmdHlwZSkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICAvLyBlbmQgd2hpbGUKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICAvLyBlbmQgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCAiZW5kIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gd3JpdGVyCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU3RydWN0QmVnaW4oJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJykiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLy8gVG8gY2hlY2sgZWxlbWVudCBvZiBzZWxmIHdoZXRoZXIgbmlsIG9yIG5vdC4KKyAgICAvLyBhdm9pZCB0aGUgdmFsdWUoZmFsc2UpIG9mIEJPT0wgaXMgbG9zdC4KKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIH49IG5pbCB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkRW5kKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkU3RvcCgpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICAvLyBlbmQgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCAiZW5kIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIHRocmlmdCBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2V0IG91dHB1dCBkaXJlY3RvcnkKKyAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gT3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZworICBzdHJpbmcgY3VyX25zID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG91dGRpciArIGN1cl9ucyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi5sdWEiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgLy8gSGVhZGVycworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOworICBpZiAoZ2VuX3JlcXVpcmVzXykgeworICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbnMgPDwgInR0eXBlcyciIDw8IGVuZGw7CisKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCBnZXRfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSB0aGUgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIklmYWNlIjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBJbnRlcmZhY2Ugb2JqZWN0IGRlZmluaXRpb24KKyAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gIjsKKyAgaWYgKGV4dGVuZHNfcykgeworICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIklmYWNlOm5ld3siIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJfX1RPYmplY3Q6bmV3eyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgIiAgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gQ2xpZW50IG9iamVjdCBkZWZpbml0aW9uCisgIG91dCA8PCBjbGFzc25hbWUgPDwgIiA9IF9fVE9iamVjdC5uZXcoIjsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVENsaWVudCI7CisgIH0KKyAgb3V0IDw8ICIsIHsiIDw8IGVuZGwgPDwgIiAgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9KSIgPDwgZW5kbDsKKworICAvLyBTZW5kL1JlY3YgZnVuY3Rpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBzaWcgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgc3RyaW5nIGZ1bmNuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gV3JhcHBlciBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6IiA8PCBzaWcgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJzZWxmOnNlbmRfIiA8PCBzaWcgPDwgZW5kbCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAic2VsZjpyZWN2XyIgPDwgc2lnIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgICAgLy8gU2VuZCBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6c2VuZF8iIDw8IHNpZyA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgZnVuY25hbWUgPDwgIicsICIKKyAgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICAgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCBhcmdzID0gIiA8PCBmdW5jbmFtZSA8PCAiX2FyZ3M6bmV3e30iIDw8IGVuZGw7CisKKyAgICAvLyBTZXQgdGhlIGFyZ3MKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGZvciAoZmxkX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGFyZ25hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJhcmdzLiIgPDwgYXJnbmFtZSA8PCAiID0gIiA8PCBhcmduYW1lIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImFyZ3M6d3JpdGUoc2VsZi5vcHJvdCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3Q6d3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInNlbGYub3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAgIC8vIFJlY3YgZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6cmVjdl8iIDw8IHNpZyA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgZm5hbWUsIG10eXBlLCByc2VxaWQgPSBzZWxmLmlwcm90OiIKKyAgICAgICAgICA8PCAicmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIHRoZW4iCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBsb2NhbCB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgeDpyZWFkKHNlbGYuaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHNlbGYuaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGVycm9yKHgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAibG9jYWwgcmVzdWx0ID0gIiA8PCBmdW5jbmFtZSA8PCAiX3Jlc3VsdDpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJyZXN1bHQ6cmVhZChzZWxmLmlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VsZi5pcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworCisgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBpZiBpdCdzIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuc3VjY2VzcyB+PSBuaWwgdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiCisgICAgICAgICAgICA8PCBlbmRsOworCisgICAgICAgIC8vIFRocm93IGN1c3RvbSBleGNlcHRpb25zCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGYgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICBmb3IgKHhfaXRlciA9IHhmLmJlZ2luKCk7IHhfaXRlciAhPSB4Zi5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2VpZiByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiB0aGVuIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiZXJyb3IoVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3tlcnJvckNvZGUgPSAiCisgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxUfSkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Iob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIERlZmluZSBwcm9jZXNzb3IgdGFibGUKKyAgb3V0IDw8IGVuZGwgPDwgY2xhc3NuYW1lIDw8ICIgPSBfX1RPYmplY3QubmV3KCI7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVFByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgIiwgeyIgPDwgZW5kbCA8PCAiIF9fdHlwZSA9ICciIDw8IGNsYXNzbmFtZSA8PCAiJyIgPDwgZW5kbCA8PCAifSkiIDw8IGVuZGw7CisKKyAgLy8gUHJvY2VzcyBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnByb2Nlc3MoaXByb3QsIG9wcm90LCBzZXJ2ZXJfY3R4KSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIG5hbWUsIG10eXBlLCBzZXFpZCA9IGlwcm90OnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIGZ1bmNfbmFtZSA9ICdwcm9jZXNzXycgLi4gbmFtZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIG5vdCBzZWxmW2Z1bmNfbmFtZV0gb3IgdHR5cGUoc2VsZltmdW5jX25hbWVdKSB+PSAnZnVuY3Rpb24nIHRoZW4iOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90OnNraXAoVFR5cGUuU1RSVUNUKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb246bmV3eyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3JDb2RlID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9EIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgIgorICAgICAgPDwgInNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieDp3cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiAgc2VsZltmdW5jX25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgc3RyaW5nIGZuX25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpwcm9jZXNzXyIgPDwgZm5fbmFtZQorICAgICAgICAgICAgICA8PCAiKHNlcWlkLCBpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBSZWFkIHRoZSByZXF1ZXN0CisgIG91dCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImxvY2FsIHJlcGx5X3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3M6cmVhZChpcHJvdCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJsb2NhbCByZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUKKyAgICAgIDw8ICI6bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxvY2FsIHN0YXR1cywgcmVzID0gcGNhbGwoc2VsZi5oYW5kbGVyLiIgPDwgZm5fbmFtZQorICAgICAgPDwgIiwgc2VsZi5oYW5kbGVyIjsKKworICAvLyBQcmludCBhcmd1bWVudHMKKyAgdF9zdHJ1Y3QqIGFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGlmIChhcmdzLT5nZXRfbWVtYmVycygpLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgIiwgIiA8PCBhcmd1bWVudF9saXN0KGFyZ3MsICJhcmdzLiIpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGVycm9ycworICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIG5vdCBzdGF0dXMgdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmVwbHlfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9IHJlc30iIDw8IGVuZGw7CisKKyAgLy8gSGFuZGxlIGN1c3RvbSBleGNlcHRpb25zCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGYgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKHhmLnNpemUoKSA+IDApIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Zi5iZWdpbigpOyB4X2l0ZXIgIT0geGYuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2VpZiB0dHlwZShyZXMpID09ICciIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiJyB0aGVuIgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXMiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gU2V0IHRoZSByZXN1bHQgYW5kIHdyaXRlIHRoZSByZXBseQorICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0LnN1Y2Nlc3MgPSByZXMiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90OndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IGZuX25hbWUgPDwgIicsIHJlcGx5X3R5cGUsICIKKyAgICAgIDw8ICJzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdDp3cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworfQorCisvLyBTZXJ2aWNlIGhlbHBlcnMKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBlbmRsIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG91dCwgKmZfaXRlcik7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKyAgICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24ob3V0LCAmcmVzdWx0LCBmYWxzZSk7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZSAoUmVhZCkKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbG9jYWwsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbG9jYWwsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IG5hbWUgPDwgIiA9IGlwcm90OiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6bmV3e30iCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICI6cmVhZChpcHJvdCkiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisgIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9pOCwga3R5cGUpOworICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfaTgsIHZ0eXBlKTsKKyAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2k4LCBldHlwZSk7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGw7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiID0gaXByb3Q6cmVhZE1hcEJlZ2luKCkgIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkTGlzdEJlZ2luKCkiIDw8IGVuZGw7CisgIH0KKworICAvLyBEZXNlcmlhbGl6ZQorICBpbmRlbnQob3V0KSA8PCAiZm9yIF9pPTEsIiA8PCBzaXplIDw8ICIgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZE1hcEVuZCgpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU2V0RW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIEEgbWFwIGlzIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUgaW5kZXhhYmxlIGJ5IGFueSBsdWEgdHlwZQorICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHRydWUpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBzZXQgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGVkIGJ5IHRoZSB2YWx1ZQorICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGVsZW0gPDwgIl0gPSAiIDw8IGVsZW0gPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBsaXN0IGlzIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUgaW5kZXhlZCBieSBpbnRlZ2VyIHZhbHVlcworICAvLyBMVUEgbmF0aXZlbHkgcHJvdmlkZXMgYWxsIG9mIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBsaXN0CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlKTsKKworICBpbmRlbnQob3V0KSA8PCAidGFibGUuaW5zZXJ0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemUgKFdyaXRlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIjp3cml0ZShvcHJvdCkiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICAvLyBCZWdpbiB3cml0aW5nCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAidHRhYmxlX3NpemUoIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInR0YWJsZV9zaXplKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIiMiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOworICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwga2l0ZXIgPDwgIiwiIDw8IHZpdGVyIDw8ICIgaW4gcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiLF8gaW4gcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgXywiIDw8IGl0ZXIgPDwgIiBpbiBpcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKworICAvLyBGaW5pc2ggd3JpdGluZworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU2V0RW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgKi8KK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6Omx1YV9pbmNsdWRlcygpIHsKKyAgaWYgKGdlbl9yZXF1aXJlc18pIHsKKyAgICByZXR1cm4gIlxuXG5yZXF1aXJlICdUaHJpZnQnIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6Z2V0X25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJsdWEiKTsKKyAgaWYgKHJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfIjsKKyAgfQorICByZXR1cm4gcmVhbF9tb2R1bGUgKyAiXyI7Cit9CisKK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpcHJlZml4OworICBzdGQ6OnN0cmluZyByZXQgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7CisgIHJldHVybiByZXQ7Cit9CisKK3N0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIHN0ZDo6c3RyaW5nIHJldCA9ICIiOworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICByZXQgKz0gcHJlZml4ICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgKytmbGRfaXRlcjsKKyAgICBpZiAoZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICByZXQgKz0gIiwgIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGx1YSwKKyAgICAiTHVhIiwKKyAgICAiICAgIG9taXRfcmVxdWlyZXM6ICAgU3VwcHJlc3MgZ2VuZXJhdGlvbiBvZiByZXF1aXJlICdzb21lZmlsZScuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlN2RhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKKy8vVE9ETzogY2hlY2sgZm9yIGluZGVudGF0aW9uCisvL1RPRE86IERvIHdlIG5lZWQgc2VxSWRfIGluIGdlbmVyYXRpb24/CisKK3RfbmV0Y29yZV9nZW5lcmF0b3I6OnRfbmV0Y29yZV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCit7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKworICAgIG51bGxhYmxlXyA9IGZhbHNlOworICAgIGhhc2hjb2RlXyA9IGZhbHNlOworICAgIHVuaW9uXyA9IGZhbHNlOworICAgIHNlcmlhbGl6ZV8gPSBmYWxzZTsKKyAgICB3Y2ZfID0gZmFsc2U7CisgICAgd2NmX25hbWVzcGFjZV8uY2xlYXIoKTsKKworICAgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBmb3IgKGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpCisgICAgeworICAgICAgICBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgibnVsbGFibGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBudWxsYWJsZV8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImhhc2hjb2RlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzaGNvZGVfID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJ1bmlvbiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuaW9uXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgic2VyaWFsIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VyaWFsaXplXyA9IHRydWU7CisgICAgICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsgLy8gc2luY2UgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG5hbWVzcGFjZQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoIndjZiIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdjZl8gPSB0cnVlOworICAgICAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gbmV0Y29yZToiICsgaXRlci0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1uZXRjb3JlIjsKK30KKworc3RhdGljIHN0cmluZyBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHN0cmluZyBjb25zdCYgZnVuY3Rpb25fbmFtZSkKK3sKKyAgICBzdHJpbmcgY29uc3QgYXN5bmNfZW5kID0gIkFzeW5jIjsKKyAgICBzaXplX3QgaSA9IGZ1bmN0aW9uX25hbWUuZmluZChhc3luY19lbmQpOworICAgIGlmIChpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbl9uYW1lICsgYXN5bmNfZW5kOworICAgIH0KKworICAgIHJldHVybiBmdW5jdGlvbl9uYW1lOworfQorCisvKioKKyogXGJyaWVmIFNlYXJjaCBhbmQgcmVwbGFjZSAiX2FyZ3MiIHN1YnN0cmluZyBpbiBzdHJ1Y3QgbmFtZSBpZiBleGlzdCAoZm9yIEMjIGNsYXNzIG5hbWluZykKKyogXHBhcmFtIHN0cnVjdF9uYW1lCisqIFxyZXR1cm4gTW9kaWZpZWQgc3RydWN0IG5hbWUgKCJTdHJ1Y3RfYXJncyIgLT4gIlN0cnVjdEFyZ3MiKSBvciBvcmlnaW5hbCBuYW1lCisqLworc3RhdGljIHN0cmluZyBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lKQoreworICAgIHN0cmluZyBhcmdzX2VuZCA9ICJfYXJncyI7CisgICAgc2l6ZV90IGkgPSBzdHJ1Y3RfbmFtZS5maW5kKGFyZ3NfZW5kKTsKKyAgICBpZiAoaSAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdHJpbmcgbmV3X3N0cnVjdF9uYW1lID0gc3RydWN0X25hbWU7CisgICAgICAgIG5ld19zdHJ1Y3RfbmFtZS5yZXBsYWNlKGksIGFyZ3NfZW5kLmxlbmd0aCgpLCAiQXJncyIpOworICAgICAgICByZXR1cm4gbmV3X3N0cnVjdF9uYW1lOworICAgIH0KKworICAgIHN0cmluZyByZXN1bHRfZW5kID0gIl9yZXN1bHQiOworICAgIHNpemVfdCBqID0gc3RydWN0X25hbWUuZmluZChyZXN1bHRfZW5kKTsKKyAgICBpZiAoaiAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdHJpbmcgbmV3X3N0cnVjdF9uYW1lID0gc3RydWN0X25hbWU7CisgICAgICAgIG5ld19zdHJ1Y3RfbmFtZS5yZXBsYWNlKGosIHJlc3VsdF9lbmQubGVuZ3RoKCksICJSZXN1bHQiKTsKKyAgICAgICAgcmV0dXJuIG5ld19zdHJ1Y3RfbmFtZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RydWN0X25hbWU7Cit9CisKK3N0YXRpYyBib29sIGZpZWxkX2hhc19kZWZhdWx0KHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMOyB9CisKK3N0YXRpYyBib29sIGZpZWxkX2lzX3JlcXVpcmVkKHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRDsgfQorCitzdGF0aWMgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpCit7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7Cit9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfd2NmX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB3Y2ZfOyB9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfbnVsbGFibGVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX2hhc2hjb2RlX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBoYXNoY29kZV87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc19zZXJpYWxpemVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHNlcmlhbGl6ZV87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc191bmlvbl9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gdW5pb25fOyB9CisKK21hcDxzdHJpbmcsIGludD4gdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2V0X2tleXdvcmRzX2xpc3QoKSBjb25zdAoreworICAgIHJldHVybiBuZXRjb3JlX2tleXdvcmRzOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkKK3sKKyAgICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgICAgLy8gZm9yIHVzYWdlIG9mIGNzaGFycCBuYW1lc3BhY2VzIGluIHRocmlmdCBmaWxlcyAoZnJvbSBmaWxlcyBmb3IgY3NoYXJwKQorICAgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIik7CisgICAgaWYgKG5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKTsKKyAgICB9CisKKyAgICBzdHJpbmcgZGlyID0gbmFtZXNwYWNlX25hbWVfOworICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpLmNfc3RyKCk7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgICAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgICAgaWYgKGRpci5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgfQorCisgICAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7CisgICAgaW5pdF9rZXl3b3JkcygpOworCisgICAgd2hpbGUgKCFtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpLnNjb3BlX21lbWJlcik7CisgICAgfQorCisgICAgcHZlcmJvc2UoIi5ORVQgQ29yZSBvcHRpb25zOlxuIik7CisgICAgcHZlcmJvc2UoIi0gbnVsbGFibGUgLi4uICVzXG4iLCAobnVsbGFibGVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gdW5pb24gLi4uLi4uICVzXG4iLCAodW5pb25fID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gaGFzaGNvZGUgLi4uICVzXG4iLCAoaGFzaGNvZGVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gc2VyaWFsaXplIC4uICVzXG4iLCAoc2VyaWFsaXplXyA/ICJPTiIgOiAib2ZmIikpOworICAgIHB2ZXJib3NlKCItIHdjZiAuLi4uLi4uLiAlc1xuIiwgKHdjZl8gPyAiT04iIDogIm9mZiIpKTsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0cmluZyBuYW1lKQoreworICAgIHN0cmluZyB0bXAobmFtZSk7CisgICAgdHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQoKikoaW50KT4odG9sb3dlcikpOworCisgICAgLy8gdW4tY29uZmxpY3Qga2V5d29yZHMgYnkgcHJlZml4aW5nIHdpdGggIkAiCisgICAgaWYgKG5ldGNvcmVfa2V5d29yZHMuZmluZCh0bXApICE9IG5ldGNvcmVfa2V5d29yZHMuZW5kKCkpCisgICAgeworICAgICAgICByZXR1cm4gIkAiICsgbmFtZTsKKyAgICB9CisKKyAgICAvLyBubyBjaGFuZ2VzIG5lY2Vzc2FyeQorICAgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmluaXRfa2V5d29yZHMoKQoreworICAgIG5ldGNvcmVfa2V5d29yZHMuY2xlYXIoKTsKKworICAgIC8vIEMjIGtleXdvcmRzCisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYWJzdHJhY3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYmFzZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJib29sIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJyZWFrIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJ5dGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2FzZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjYXRjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjaGFyIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNoZWNrZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2xhc3MiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY29uc3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY29udGludWUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVjaW1hbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkZWZhdWx0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlbGVnYXRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRvdWJsZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJlbHNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImVudW0iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZXZlbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZXhwbGljaXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZXh0ZXJuIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZhbHNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZml4ZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmxvYXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZm9yIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZvcmVhY2giXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ290byJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbXBsaWNpdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImludGVybmFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImlzIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImxvY2siXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibG9uZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJuYW1lc3BhY2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibmV3Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm51bGwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib2JqZWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm9wZXJhdG9yIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm91dCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvdmVycmlkZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwYXJhbXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicHJpdmF0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwcm90ZWN0ZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicHVibGljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJlYWRvbmx5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJlZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJyZXR1cm4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2J5dGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2VhbGVkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNob3J0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNpemVvZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdGFja2FsbG9jIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0YXRpYyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3RydWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN3aXRjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0aGlzIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRocm93Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRydWUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHJ5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInR5cGVvZiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1aW50Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVsb25nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVuY2hlY2tlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1bnNhZmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidXNob3J0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVzaW5nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZpcnR1YWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidm9pZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2b2xhdGlsZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKKworICAgIC8vIEMjIGNvbnRleHR1YWwga2V5d29yZHMKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhZGQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYWxpYXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXNjZW5kaW5nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImFzeW5jIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImF3YWl0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlc2NlbmRpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZHluYW1pYyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmcm9tIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImdldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJnbG9iYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ3JvdXAiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50byJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJqb2luIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImxldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvcmRlcmJ5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInBhcnRpYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVtb3ZlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNlbGVjdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzZXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmFsdWUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmFyIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIndoZXJlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInlpZWxkIl0gPSAxOworCisJbmV0Y29yZV9rZXl3b3Jkc1sid2hlbiJdID0gMTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpCit7CisgICAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAibmFtZXNwYWNlICIgPDwgbmFtZXNwYWNlX25hbWVfIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmVuZF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpCit7CisgICAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3R5cGVfdXNpbmdzKCkgY29uc3QKK3sKKyAgICBzdHJpbmcgbmFtZXNwYWNlcyA9CisgICAgICAgICJ1c2luZyBTeXN0ZW07XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iOworCisgICAgaWYgKHdjZl8pCisgICAgeworICAgICAgICBuYW1lc3BhY2VzICs9ICJ1c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsO1xuIjsKKyAgICAgICAgbmFtZXNwYWNlcyArPSAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiI7CisgICAgfQorCisgICAgcmV0dXJuIG5hbWVzcGFjZXMgKyBlbmRsOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgY29uc3QKK3sKKyAgICBzdHJpbmcgbmFtZXNwYWNlcyA9CisgICAgICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2xzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXI7XG4iOworCisgICAgcmV0dXJuIG5hbWVzcGFjZXMgKyBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpCit7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKQoreworICAgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkKK3sKKwlpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKyAgICBzdHJpbmcgZl9lbnVtX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIi5jcyI7CisKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworCWdlbmVyYXRlX2VudW0oZl9lbnVtLCB0ZW51bSk7CisKKyAgICBmX2VudW0uY2xvc2UoKTsKKwlpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9lbnVtIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bShvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pCit7CisJb3V0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKwlzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCWdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdGVudW0pOworCisJb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisJc2NvcGVfdXAob3V0KTsKKworCXZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworCXZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisJZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpCisJeworCQlnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpjX2l0ZXIpOworCQlpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCQlvdXQgPDwgaW5kZW50KCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOworCX0KKworCXNjb3BlX2Rvd24ob3V0KTsKKwllbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpCit7CisgICAgaWYgKGNvbnN0cy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAnLycgKyBwcm9ncmFtX25hbWVfICsgIi5Db25zdGFudHMuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgICAgZ2VuZXJhdGVfY29uc3RzKGZfY29uc3RzLCBjb25zdHMpOworCisgICAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBpZiAoY29uc3RzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb3V0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBlbmRsOworCisgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyIgPDwgZW5kbDsKKworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IGZhbHNlOworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCAqY19pdGVyKTsKKyAgICAgICAgaWYgKHByaW50X2NvbnN0X3ZhbHVlKG91dCwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksIGZhbHNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yKQorICAgIHsKKyAgICAgICAgcHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3V0LCBjb25zdHMpOworICAgIH0KKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpKTsKKworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOworCisgICAgICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gKmZfaXRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworCisgICAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIi4iIDw8IHByb3BfbmFtZShmaWVsZCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSkpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIHRfdHlwZSoga3R5cGUgPSBzdGF0aWNfY2FzdDx0X21hcCo+KHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICAgICAgdF90eXBlKiB2dHlwZSA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0iIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICB0X3R5cGUqIGV0eXBlOworICAgICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBldHlwZSA9IHN0YXRpY19jYXN0PHRfbGlzdCo+KHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBldHlwZSA9IHN0YXRpY19jYXN0PHRfc2V0Kj4odHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGF0aWMgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pLmNfc3RyKCkgPDwgIkNvbnN0YW50cygpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpCisgICAgeworICAgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICAgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7Cit9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsLCBib29sIG5lZWR0eXBlKQoreworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAoIWRlZnZhbCB8fCBuZWVkdHlwZSkKKyAgICB7CisgICAgICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiB0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICJwdWJsaWMgY29uc3QgIiA6ICJwdWJsaWMgc3RhdGljICIpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgICAgICBvdXQgPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoZGVmdmFsICYmICF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICAgIHJldHVybiBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb247Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKK3sKKyAgICAodm9pZCluYW1lOworICAgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICByZW5kZXIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgcmVuZGVyIDw8IHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbih0c3RydWN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKQoreworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisKKyAgICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgICBmX3N0cnVjdC5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QiKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGluX2NsYXNzLCBib29sIGlzX3Jlc3VsdCkKK3sKKyAgICBpZiAoIWluX2NsYXNzKQorICAgIHsKKyAgICAgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdHN0cnVjdCk7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworCisgICAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmICFpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBib29sIGlzX2ZpbmFsID0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOworCisgICAgc3RyaW5nIHNoYXJwX3N0cnVjdF9uYW1lID0gY2hlY2tfYW5kX2NvcnJlY3Rfc3RydWN0X25hbWUobm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiIDogIjsKKworICAgIGlmIChpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBvdXQgPDwgIlRFeGNlcHRpb24sICI7CisgICAgfQorCisgICAgb3V0IDw8ICJUQmFzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgLy8gaWYgdGhlIGZpZWxkIGlzIHJlcXVpZWQsIHRoZW4gd2UgdXNlIGF1dG8tcHJvcGVydGllcworICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgICBib29sIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSBmYWxzZTsKKyAgICBib29sIGhhc19yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhc19yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhc19kZWZhdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBnZW5lcmF0ZV9pc3NldCA9IChudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcykgfHwgKCFudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMpOworICAgIGlmIChnZW5lcmF0ZV9pc3NldCkKKyAgICB7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMSldIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIElzc2V0IF9faXNzZXQ7IiA8PCBlbmRsOworICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RydWN0IElzc2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSk7CisgICAgICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICAgICAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgbnVsbGFibGUsIHRoZW4gd2UgZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyXSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBpZiAoZ2VuZXJhdGVfaXNzZXQgJiYgKHNlcmlhbGl6ZV8gfHwgd2NmXykpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiI3JlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcik7CisgICAgICAgICAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCptX2l0ZXIpOworICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIHJlcXVpcmVkLCBkb24ndCBuZWVkIElzc2V0IGZvciB0aGF0IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQgJiYgKCFudWxsYWJsZV8gfHwgaGFzX2RlZmF1bHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbCBTaG91bGRTZXJpYWxpemUiIDw8IHByb3BfbmFtZSgqbV9pdGVyKSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIjZW5kcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgYWx3YXlzIHdhbnQgYSBkZWZhdWx0LCBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBmb3IgUmVhZGluZworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIigpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdCA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHQpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArIHByb3BfbmFtZSgqbV9pdGVyKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gT3B0aW9uYWxzIHdpdGggZGVmYXVsdHMgYXJlIG1hcmtlZCBzZXQKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkcykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIigiOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCptX2l0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIikgOiB0aGlzKCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgcHJvcF9uYW1lKCptX2l0ZXIpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICAgIGlmIChpc19yZXN1bHQpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBpZiAoaGFzaGNvZGVfKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZXF1YWxzKG91dCwgdHN0cnVjdCk7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2hhc2hjb2RlKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgYSBjb3JyZXNwb25kaW5nIFdDRiBmYXVsdCB0byB3cmFwIHRoZSBleGNlcHRpb24KKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNfZXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvdXQsIHRzdHJ1Y3QpOworICAgIH0KKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKyAgICBpZiAoIWluX2NsYXNzKQorICAgIHsKKyAgICAgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOworCisgICAgYm9vbCBpc19maW5hbCA9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiRmF1bHQiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFJlYWRBc3luYyhUUHJvdG9jb2wgaXByb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKmZfaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaWVsZCA9IGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworICAgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0QmVnaW5Bc3luYyhzdHJ1YywgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKTsKKyAgICAgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgqZl9pdGVyKTsKKyAgICAgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0ICYmICFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgICAgIGlmIChudWxsX2FsbG93ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0QmVnaW5Bc3luYyhzdHJ1YywgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSBpZiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIodGhpcy4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8ICIodGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgICBib29sIG51bGxfYWxsb3dlZCA9ICFudWxsYWJsZV8gJiYgdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbCBfX2ZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAorCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKKyAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7CisgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0ICYmICFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh1c2VGaXJzdEZsYWcgJiYgKCFoYWRfcmVxdWlyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmKCFfX2ZpcnN0KSB7IHNiLkFwcGVuZChcIiwgXCIpOyB9IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICI6IFwiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIiwgIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQorICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoXCIpXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLlRvU3RyaW5nKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICBpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKworICAgIHN0cmluZyBmX3VuaW9uX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0dW5pb24tPmdldF9uYW1lKCkpICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3VuaW9uOworCisgICAgZl91bmlvbi5vcGVuKGZfdW5pb25fbmFtZS5jX3N0cigpKTsKKworICAgIGZfdW5pb24gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IG5ldGNvcmVfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24oZl91bmlvbiwgdHVuaW9uKTsKKworICAgIGZfdW5pb24uY2xvc2UoKTsKKworICAgIGluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX25ldGNvcmVfdW5pb24uIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICAvLyBMZXQncyBkZWZpbmUgdGhlIGNsYXNzIGZpcnN0CisgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IHBhcnRpYWwgY2xhc3MgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiA6IFRBYnN0cmFjdEJhc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIHRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHJlYWRvbmx5IGJvb2wgSXNzZXQ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IERhdGEgeyBnZXQ7IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiKGJvb2wgaXNzZXQpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiSXNzZXQgPSBpc3NldDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIF9fX3VuZGVmaW5lZCA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBudWxsOyB9IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBfX191bmRlZmluZWQoKSA6IGJhc2UoZmFsc2UpIHt9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCBcIkNhbm5vdCBwZXJzaXN0IGFuIHVuaW9uIHR5cGUgd2hpY2ggaXMgbm90IHNldC5cIik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fY2xhc3Mob3V0LCB0dW5pb24sICgqZl9pdGVyKSk7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9yZWFkZXIob3V0LCB0dW5pb24pOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfdW5pb25fY2xhc3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIF9kYXRhOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIF9kYXRhOyB9IH0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBkYXRhKSA6IGJhc2UodHJ1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLl9kYXRhID0gZGF0YTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuSUQgPSAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIHRmaWVsZCwgIl9kYXRhIiwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCB0aGF0KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBvdGhlciA9IHRoYXQgYXMgIiA8PCBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoUmVmZXJlbmNlRXF1YWxzKHRoaXMsIG90aGVyKSkgcmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiYmICI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPT0gb3RoZXIuX19pc3NldC4iCisgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSAmJiAoKCFfX2lzc2V0LiIKKyAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHx8ICgiOworICAgICAgICB9CisgICAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIlRDb2xsZWN0aW9ucy5FcXVhbHMoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiU3lzdGVtLk9iamVjdC5FcXVhbHMoIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiwgb3RoZXIuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKSI7CisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKSkpIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlyc3QpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfaGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnQgaGFzaGNvZGUgPSAwOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInVuY2hlY2tlZCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gIjsKKyAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobnVsbGFibGVfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgPT0gbnVsbCA/IDAgOiAiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIV9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPyAwIDogIjsKKyAgICAgICAgfQorICAgICAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIihUQ29sbGVjdGlvbnMuR2V0SGFzaENvZGUoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKSkiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLkdldEhhc2hDb2RlKCkpIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGhhc2hjb2RlOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2U7CisgICAgZl9zZXJ2aWNlLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgICBmX3NlcnZpY2UgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IG5ldGNvcmVfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShmX3NlcnZpY2UpOworCisgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgcGFydGlhbCBjbGFzcyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShmX3NlcnZpY2UpOworICAgIGZfc2VydmljZS5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfc2VydmljZS4iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklBc3luYyI7CisgICAgfQorCisgICAgLy9vdXQgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c2VydmljZSk7CisKKyAgICBpZiAod2NmXykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1NlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJQXN5bmMiIDw8IGV4dGVuZHNfaWZhY2UgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpmX2l0ZXIpOworCisgICAgICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgKHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW09wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltGYXVsdENvbnRyYWN0KHR5cGVvZigiICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3V0LCAqZl9pdGVyKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGV4dGVuZHNfY2xpZW50ID0gIlRCYXNlQ2xpZW50LCBJRGlzcG9zYWJsZSwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdHNlcnZpY2UpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSUFzeW5jIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90b2NvbCkgOiB0aGlzKHByb3RvY29sLCBwcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCwgVFByb3RvY29sIG91dHB1dFByb3RvY29sKSA6IGJhc2UoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpIgorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jdGlvbnNfaXRlcmF0b3I7CisKKyAgICBmb3IgKGZ1bmN0aW9uc19pdGVyYXRvciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbnNfaXRlcmF0b3IgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uc19pdGVyYXRvcikKKyAgICB7CisgICAgICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYygoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkpOworCisgICAgICAgIC8vIGFzeW5jCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmdW5jdGlvbnNfaXRlcmF0b3IsICIiKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfbmFtZSgpICsgIkFyZ3MiOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgT3V0cHV0UHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgICAgICAgIDw8ICJcIiwgIiA8PCAoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpIDw8ICIsIFNlcUlkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKworICAgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBhcmdzLldyaXRlQXN5bmMoT3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgT3V0cHV0UHJvdG9jb2wuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+aXNfb25ld2F5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfbmFtZSgpICsgIlJlc3VsdCI7CisgICAgICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICAgICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA9IGF3YWl0IElucHV0UHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG1zZy5UeXBlID09IFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IGF3YWl0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkQXN5bmMoSW5wdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBJbnB1dFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCByZXN1bHQuUmVhZEFzeW5jKElucHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgSW5wdXRQcm90b2NvbC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGlmICghKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3JldHVybnR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2Vzcy5IYXNWYWx1ZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LlN1Y2Nlc3MuVmFsdWU7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdCwgXCIiCisgICAgICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLkFzeW5jUHJvY2Vzc29yLCAiOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIEFzeW5jUHJvY2Vzc29yIDogIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiSVRBc3luY1Byb2Nlc3NvciIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlIElBc3luYyBfaUFzeW5jOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQXN5bmNQcm9jZXNzb3IoSUFzeW5jIGlBc3luYykiOworCisgICAgaWYgKCFleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgIiA6IGJhc2UoaUFzeW5jKSI7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpQXN5bmMgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaUFzeW5jKSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIl9pQXN5bmMgPSBpQXN5bmM7IiA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyhmdW5jdGlvbl9uYW1lKSA8PCAiXCJdID0gIiA8PCBmdW5jdGlvbl9uYW1lIDw8ICJfUHJvY2Vzc0FzeW5jOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIFRhc2sgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG5ldyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYXdhaXQgUHJvY2Vzc0FzeW5jKGlwcm90LCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBuZXcgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnID0gYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8uVHJ5R2V0VmFsdWUobXNnLk5hbWUsIG91dCBmbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBUVHlwZS5TdHJ1Y3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIChUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kLCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIiArIG1zZy5OYW1lICsgXCInXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHguV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKQoreworICAgICh2b2lkKXRzZXJ2aWNlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIl9Qcm9jZXNzQXN5bmMoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIkFyZ3MiOworICAgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIlJlc3VsdCI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgYXJncy5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgICAgfQorCisgICAgb3V0IDw8ICJhd2FpdCBfaUFzeW5jLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiQXN5bmMoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOworICAgICAgICBpZiAobnVsbGFibGVfICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiLlZhbHVlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKworICAgIGlmICghZmlyc3QpCisgICAgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiCisgICAgICAgICAgICAgICAgPDwgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCksIGNhbmNlbGxhdGlvblRva2VuKTsgIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgcmVzdWx0LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoeHMpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3c7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoRXhjZXB0aW9uIGV4KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoXCJFcnJvciBvY2N1cnJlZCBpbiBwcm9jZXNzb3I6XCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZXguVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsXCIgSW50ZXJuYWwgZXJyb3IuXCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKFwiIiA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgeC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKQoreworICAgIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgorICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazwiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiPiBSZWFkQXN5bmMoVFByb3RvY29sIGlwcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZCA9IGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAvLyB3ZSBjYW5ub3QgaGF2ZSB0aGUgZmlyc3QgZmllbGQgYmUgYSBzdG9wIC0tIHdlIG11c3QgaGF2ZSBhIHNpbmdsZSBmaWVsZCBkZWZpbmVkCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGVtcDsiIDw8IGVuZGw7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAidGVtcCIsIHRydWUpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHZhbCA9IG5ldyAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHRlbXApOyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZEZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChhd2FpdCBpcHJvdC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSkuVHlwZSAhPSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gZW5kIG9mIGVsc2UgZm9yIFRTdG9wCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgsIGJvb2wgaXNfcHJvcGVydHlsZXNzKQoreworICAgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgeworICAgICAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiOworCisgICAgICAgIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgImF3YWl0IGlwcm90LiI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCb29sQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEkxNkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpCit7CisgICAgaWYgKHVuaW9uXyAmJiB0c3RydWN0LT5pc191bmlvbigpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gYXdhaXQgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgIiA8PCBwcmVmaXggPDwgIi5SZWFkQXN5bmMoaXByb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG9iajsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBhd2FpdCBpcHJvdC5SZWFkTWFwQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGF3YWl0IGlwcm90LlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBhd2FpdCBpcHJvdC5SZWFkTGlzdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcihpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuQ291bnQ7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSksIHByZWZpeCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSksIHByZWZpeCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSksIHByZWZpeCk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICAgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKworICAgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCwgYm9vbCBpc19lbGVtZW50LCBib29sIGlzX3Byb3BlcnR5bGVzcykKK3sKKyAgICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKKworICAgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgeworICAgICAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsIHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSksIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC4iOworCisgICAgICAgIHN0cmluZyBudWxsYWJsZV9uYW1lID0gbnVsbGFibGVfICYmICFpc19lbGVtZW50ICYmICFmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpID8gbmFtZSArICIuVmFsdWUiIDogbmFtZTsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5QXN5bmMoIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZ0FzeW5jKCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCBuYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCb29sQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZUFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJMTZBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTMyQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUk2NEFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGVBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMkFzeW5jKChpbnQpIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwgcHJlZml4LmNfc3RyKCksIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICAodm9pZCl0c3RydWN0OworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgIiA8PCBwcmVmaXggPDwgIi5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWFwQmVnaW5Bc3luYyhuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICA8PCAiLkNvdW50KSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVNldEJlZ2luQXN5bmMobmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUxpc3RCZWdpbkFzeW5jKG5ldyBUTGlzdCgiCisgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IgorICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZShzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cykiOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCisgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSksIGl0ZXIsIHByZWZpeCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLCBpdGVyKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSksIGl0ZXIpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApCit7CisgICAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCB0cnVlKTsKKyAgICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikKK3sKKyAgICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpCit7CisgICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpCit7CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvdXQsIHRmaWVsZCwgaXNQdWJsaWMsIGdlbmVyYXRlSXNzZXQsICJfIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0LCBzdHJpbmcgZmllbGRQcmVmaXgpCit7CisgICAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzUHVibGljKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDApXSIgPDwgZW5kbDsKKyAgICB9CisgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCk7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCk7CisgICAgaWYgKChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0KSB8fCBpc19yZXF1aXJlZCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKSA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUsIGlzX3JlcXVpcmVkKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgIiB7IGdldDsgc2V0OyB9IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdldCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGJvb2wgdXNlX251bGxhYmxlID0gZmFsc2U7CisgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgICAgICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlX251bGxhYmxlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0dHlwZSktPmdldF9iYXNlKCkgIT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgaWYgKHVzZV9udWxsYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdmFsdWUuSGFzVmFsdWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodmFsdWUuSGFzVmFsdWUpIHRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWUuVmFsdWU7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdHJpbmcgY29uc3QmIGZyb21OYW1lKQoreworICAgIHN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgICBpZiAoc3RyLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICAgIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7CisKKyAgICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgICAgY2hhciBjID0gc3RyLmF0KDApOworICAgIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpCisgICAgeworICAgICAgICBzdHIgPSAiXyIgKyBzdHI7CisgICAgfQorCisgICAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpCisgICAgeworICAgICAgICBjID0gc3RyLmF0KGkpOworICAgICAgICBpZiAoKCdBJyA+IGMgfHwgYyA+ICdaJykgJiYgKCdhJyA+IGMgfHwgYyA+ICd6JykgJiYgKCcwJyA+IGMgfHwgYyA+ICc5JykgJiYgJ18nICE9IGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSkKK3sKKyAgICBpZiAobWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpCisgICAgeworICAgICAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygpIG5vIHNjb3BlIGFjdGl2ZSI7CisgICAgfQorCisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgICAgaWYgKGFjdGl2ZS5zY29wZV9tZW1iZXIgIT0gc2NvcGUpCisgICAgeworICAgICAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygpIGNhbGxlZCBmb3Igd3Jvbmcgc3RydWN0IjsKKyAgICB9CisKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZXMucG9wX2JhY2soKTsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG5hbWUpCit7CisgICAgaWYgKCFtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gYWN0aXZlLm1hcHBpbmdfdGFibGUuZmluZChuYW1lKTsKKyAgICAgICAgaWYgKGFjdGl2ZS5tYXBwaW5nX3RhYmxlLmVuZCgpICE9IGl0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdmVyYm9zZSgibm8gbWFwcGluZyBmb3IgbWVtYmVyICVzXG4iLCBuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBuYW1lOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCwgdHN0cnVjdC0+Z2V0X21lbWJlcnMoKSwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlLCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzLCBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpCit7CisgICAgLy8gYmVnaW4gbmV3IHNjb3BlCisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnB1c2hfYmFjayhtZW1iZXJfbWFwcGluZ19zY29wZSgpKTsKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBhY3RpdmUuc2NvcGVfbWVtYmVyID0gc2NvcGU7CisKKyAgICAvLyBjdXJyZW50IEMjIGdlbmVyYXRvciBwb2xpY3k6CisgICAgLy8gLSBwcm9wIG5hbWVzIGFyZSBhbHdheXMgcmVuZGVyZWQgd2l0aCBhbiBVcHBlcmNhc2UgZmlyc3QgbGV0dGVyCisgICAgLy8gLSBzdHJ1Y3QgbmFtZXMgYXJlIHVzZWQgYXMgZ2l2ZW4KKyAgICBzdGQ6OnNldDxzdHJpbmc+IHVzZWRfbWVtYmVyX25hbWVzOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGggc3RydWN0IChDUzA1NDIgZXJyb3IpCisgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KHN0cnVjdG5hbWUpOworCisgICAgLy8gcHJldmVudCBuYW1lIGNvbmZsaWN0cyB3aXRoIGtub3duIG1ldGhvZHMgKFRIUklGVC0yOTQyKQorICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiUmVhZCIpOworICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiV3JpdGUiKTsKKworICAgIGZvciAoaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2l0ZXIpCisgICAgeworICAgICAgICBzdHJpbmcgb2xkbmFtZSA9ICgqaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHN0cmluZyBuZXduYW1lID0gcHJvcF9uYW1lKCppdGVyLCB0cnVlKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5ldyBuYW1lIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyCisgICAgICAgICAgICBpZiAodXNlZF9tZW1iZXJfbmFtZXMuZmluZChuZXduYW1lKSAhPSB1c2VkX21lbWJlcl9uYW1lcy5lbmQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgJXMgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXJcbiIsIHN0cnVjdG5hbWUuY19zdHIoKSwgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBuZXduYW1lICs9ICdfJzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYWRkIGFsd2F5cywgdGhpcyBoZWxwcyB1cyB0byBkZXRlY3QgZWRnZSBjYXNlcyBsaWtlCisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc3BlbGxpbmdzICgiZm9vIiBhbmQgIkZvbyIpIHdpdGhpbiB0aGUgc2FtZSBzdHJ1Y3QKKyAgICAgICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciBtYXBwaW5nICVzID0+ICVzXG4iLCBzdHJ1Y3RuYW1lLmNfc3RyKCksIG9sZG5hbWUuY19zdHIoKSwgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGFjdGl2ZS5tYXBwaW5nX3RhYmxlW29sZG5hbWVdID0gbmV3bmFtZTsKKyAgICAgICAgICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChuZXduYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nKQoreworICAgIHN0cmluZyBuYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgaWYgKHN1cHByZXNzX21hcHBpbmcpCisgICAgeworICAgICAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbmFtZSA9IGdldF9tYXBwZWRfbWVtYmVyX25hbWUobmFtZSk7CisgICAgfQorICAgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQsIGJvb2wgaW5fcGFyYW0sIGJvb2wgaXNfcmVxdWlyZWQpCit7CisgICAgKHZvaWQpaW5faW5pdDsKKworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZShzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKSwgaW5fY29udGFpbmVyLCBpbl9wYXJhbSwgaXNfcmVxdWlyZWQpOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICB0X21hcCogdG1hcCA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpOworICAgICAgICByZXR1cm4gIkRpY3Rpb25hcnk8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgdF9zZXQqIHRzZXQgPSBzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKTsKKyAgICAgICAgcmV0dXJuICJUSGFzaFNldDwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICB0X2xpc3QqIHRsaXN0ID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpOworICAgICAgICByZXR1cm4gIkxpc3Q8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgICB9CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtICYmIHR0eXBlLT5pc19lbnVtKCkpID8gIj8iIDogIiI7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG5zID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgibmV0Y29yZSIpOworICAgICAgICBpZiAoIW5zLmVtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBucyArICIuIiArIG5vcm1hbGl6ZV9uYW1lKHR0eXBlLT5nZXRfbmFtZSgpKSArIHBvc3RmaXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5fcGFyYW0sIGJvb2wgaXNfcmVxdWlyZWQpCit7CisgICAgKHZvaWQpaW5fY29udGFpbmVyOworICAgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0pID8gIj8iIDogIiI7CisgICAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkKKyAgICB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICByZXR1cm4gInZvaWQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmV0dXJuICJib29sIiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgcmV0dXJuICJzYnl0ZSIgKyBwb3N0Zml4OworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICByZXR1cm4gInNob3J0IiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiaW50IiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJldHVybiAibG9uZyIgKyBwb3N0Zml4OworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gImRvdWJsZSIgKyBwb3N0Zml4OworICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGlmIChpbml0KQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIikwIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KQoreworICAgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHN0cmluZyB0YXNrID0gIlRhc2siOworICAgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRhc2sgKz0gIjwiICsgdHlwZV9uYW1lKHR0eXBlKSArICI+IjsKKyAgICB9CisKKyAgICBzdHJpbmcgcmVzdWx0ID0gdGFzayArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiQXN5bmMoIjsKKyAgICBzdHJpbmcgYXJncyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgICByZXN1bHQgKz0gYXJnczsKKyAgICBpZiAoIWFyZ3MuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gIkNhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSI7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkKK3sKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuQm9vbCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkJ5dGUiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5NYXAiOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuU2V0IjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKKyAgICB9CisKKyAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykKK3sKKyAgICBkb2NzdHJpbmdfY29tbWVudChvdXQsICIvLy8gPHN1bW1hcnk+IiArIGVuZGwsICIvLy8gIiwgY29udGVudHMsICIvLy8gPC9zdW1tYXJ5PiIgKyBlbmRsKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKQoreworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgZW5kbCArICI8c2VlYWxzbyBjcmVmPVwiIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpICsgIlwiLz4iOworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgc3RhdGljX2Nhc3Q8dF9kb2MqPihmaWVsZCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKQoreworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKQorICAgIHsKKyAgICAgICAgc3RyaW5nc3RyZWFtIHBzOworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICAgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgICAgICAgcHMgPDwgZW5kbCA8PCAiPHBhcmFtIG5hbWU9XCIiIDw8IHAtPmdldF9uYW1lKCkgPDwgIlwiPiI7CisgICAgICAgICAgICBpZiAocC0+aGFzX2RvYygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7CisgICAgICAgICAgICAgICAgc3RyLmVyYXNlKHJlbW92ZShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCAnXG4nKSwgc3RyLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBwcyA8PCBzdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcyA8PCAiPC9wYXJhbT4iOworICAgICAgICB9CisKKyAgICAgICAgZG9jc3RyaW5nX2NvbW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1bW1hcnk+IiArIGVuZGwgKyB0ZnVuY3Rpb24tPmdldF9kb2MoKSArICI8L3N1bW1hcnk+IiArIHBzLnN0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmRvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LCBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzLCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKQoreworICAgIGlmIChjb21tZW50X3N0YXJ0ICE9ICIiKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGNvbW1lbnRfc3RhcnQ7CisgICAgfQorCisgICAgc3RyaW5nc3RyZWFtIGRvY3MoY29udGVudHMsIHN0ZDo6aW9zX2Jhc2U6OmluKTsKKworICAgIHdoaWxlICghKGRvY3MuZW9mKCkgfHwgZG9jcy5mYWlsKCkpKQorICAgIHsKKyAgICAgICAgY2hhciBsaW5lWzEwMjRdOworICAgICAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7CisKKyAgICAgICAgLy8gSnVzdCBwcm50IGEgbmV3bGluZSB3aGVuIHRoZSBsaW5lICYgcHJlZml4IGFyZSBlbXB0eS4KKyAgICAgICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwICYmIGxpbmVfcHJlZml4ID09ICIiICYmICFkb2NzLmVvZigpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJsZW4obGluZSkgPiAwIHx8ICFkb2NzLmVvZigpKQorICAgICAgICB7IC8vIHNraXAgdGhlIGVtcHR5IGxhc3QgbGluZQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGxpbmVfcHJlZml4IDw8IGxpbmUgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29tbWVudF9lbmQgIT0gIiIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgY29tbWVudF9lbmQ7CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpCit7CisgICAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICB7CisgICAgICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIikgKyAiLiI7CisgICAgfQorICAgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBuZXRjb3JlLAorICAgICJDIyIsCisgICAgIiAgICB3Y2Y6ICAgICAgICAgICAgIEFkZHMgYmluZGluZ3MgZm9yIFdDRiB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHNlcmlhbDogICAgICAgICAgQWRkIHNlcmlhbGl6YXRpb24gc3VwcG9ydCB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIG51bGxhYmxlOiAgICAgICAgVXNlIG51bGxhYmxlIHR5cGVzIGZvciBwcm9wZXJ0aWVzLlxuIgorICAgICIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBhIGhhc2hjb2RlIGFuZCBlcXVhbHMgaW1wbGVtZW50YXRpb24gZm9yIGNsYXNzZXMuXG4iCisgICAgIiAgICB1bmlvbjogICAgICAgICAgIFVzZSBuZXcgdW5pb24gdHlwaW5nLCB3aGljaCBpbmNsdWRlcyBhIHN0YXRpYyByZWFkIGZ1bmN0aW9uIGZvciB1bmlvbiB0eXBlcy5cbiIKKykKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWZjOTIyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTM3IEBACisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKK2NsYXNzIHRfbmV0Y29yZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yCit7CisKKyAgICBzdHJ1Y3QgbWVtYmVyX21hcHBpbmdfc2NvcGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBtZW1iZXJfbWFwcGluZ19zY29wZSgpIDogc2NvcGVfbWVtYmVyKDApIHsgfQorICAgICAgICB2b2lkKiBzY29wZV9tZW1iZXI7CisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwcGluZ190YWJsZTsKKyAgICB9OworCitwdWJsaWM6CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLCBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpOworCisgICAgYm9vbCBpc193Y2ZfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfbnVsbGFibGVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfaGFzaGNvZGVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfc2VyaWFsaXplX2VuYWJsZWQoKSBjb25zdDsKKyAgICBib29sIGlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdDsKKyAgICBtYXA8c3RyaW5nLCBpbnQ+IGdldF9rZXl3b3Jkc19saXN0KCkgY29uc3Q7CisKKyAgICAvLyBvdmVycmlkZXMKKyAgICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgICAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKyAgICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBnZW5lcmF0ZV9jb25zdHMob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICAgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgICB2b2lkIGdlbmVyYXRlX2VudW0ob3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBpbmNsdWRlSXNzZXQgPSB0cnVlLCBzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7CisgICAgYm9vbCBwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwgPSBmYWxzZSwgYm9vbCBuZWVkdHlwZSA9IGZhbHNlKTsKKyAgICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICAgIHZvaWQgcHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgICAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLCBib29sIGluX2NsYXNzID0gZmFsc2UsIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2NsYXNzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfd2NmZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICAgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4ID0gIiIsIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIGxpc3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXggPSAiIiwgYm9vbCBpc19lbGVtZW50ID0gZmFsc2UsIGJvb2wgaXNfcHJvcGVydHlsZXNzID0gZmFsc2UpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIsIHN0cmluZyBtYXApOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOworICAgIHZvaWQgZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsIGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpOworICAgIHZvaWQgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KTsKKyAgICB2b2lkIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpOworCisgICAgc3RyaW5nIG5ldGNvcmVfdHlwZV91c2luZ3MoKSBjb25zdDsKKyAgICBzdHJpbmcgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgY29uc3Q7CisKKyAgICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY291bnRhaW5lciA9IGZhbHNlLCBib29sIGluX2luaXQgPSBmYWxzZSwgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLCBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICAgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgICBzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICBzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICAgIHN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcgPSBmYWxzZSk7CisgICAgc3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKworcHJpdmF0ZToKKyAgICBzdHJpbmcgbmFtZXNwYWNlX25hbWVfOworICAgIHN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKworICAgIGJvb2wgbnVsbGFibGVfOworICAgIGJvb2wgdW5pb25fOworICAgIGJvb2wgaGFzaGNvZGVfOworICAgIGJvb2wgc2VyaWFsaXplXzsKKyAgICBib29sIHdjZl87CisKKyAgICBzdHJpbmcgd2NmX25hbWVzcGFjZV87CisgICAgbWFwPHN0cmluZywgaW50PiBuZXRjb3JlX2tleXdvcmRzOworICAgIHZlY3RvcjxtZW1iZXJfbWFwcGluZ19zY29wZT4gbWVtYmVyX21hcHBpbmdfc2NvcGVzOworCisgICAgdm9pZCBpbml0X2tleXdvcmRzKCk7CisgICAgc3RyaW5nIG5vcm1hbGl6ZV9uYW1lKHN0cmluZyBuYW1lKTsKKyAgICBzdHJpbmcgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKKyAgICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSk7CisgICAgdm9pZCBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpOworICAgIHN0cmluZyBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBvbGRuYW1lKTsKK307CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzgxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDE3NjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjppb3M7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIE9DYW1sIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9vY2FtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9vY2FtbF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gb2NhbWw6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW9jYW1sIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCogdG1lbWJlcik7CisgIGJvb2wgc3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQqIHRtZW1iZXIpOworICBzdGQ6OnN0cmluZyBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YodF90eXBlKiB0eXBlLCBzdHJpbmcgd2hhdCk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyB0bmFtZSwgdF9maWVsZCogdG1lbWJlcik7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIG1lbWJlcik7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgbmFtZSA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgb2NhbWxfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIG9jYW1sX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgbWV0aG9kID0gZmFsc2UsIGJvb2wgb3B0aW9ucyA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19pXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfaV87Cit9OworCisvKgorICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB3YW50IHR5cGVkZWZzIHRvIGFwcGVhciBsYXRlciwKKyAqIGFmdGVyIGFsbCB0aGUgdHlwZXMgaGF2ZSBiZWVuIGRlY2xhcmVkLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKKyAgaW5pdF9nZW5lcmF0b3IoKTsKKworICAvLyBHZW5lcmF0ZSBlbnVtcworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzCisgIHZlY3Rvcjx0X3N0cnVjdCo+IHN0cnVjdHMgPSBwcm9ncmFtXy0+Z2V0X3N0cnVjdHMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHN0X2l0ZXI7CisgIGZvciAoc3RfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc3RfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3N0X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3QoKnN0X2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgeGNlcHRpb25zCisgIHZlY3Rvcjx0X3N0cnVjdCo+IHhjZXB0aW9ucyA9IHByb2dyYW1fLT5nZXRfeGNlcHRpb25zKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfeGNlcHRpb24oKnhfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0eXBlZGVmcworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7CisKKyAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgorICBjbG9zZV9nZW5lcmF0b3IoKTsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5tbCI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19pX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMubWxpIjsKKyAgZl90eXBlc19pXy5vcGVuKGZfdHlwZXNfaV9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0cy5tbCI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7CisgIGZfdHlwZXNfaV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGwgPDwgIm9wZW4gIgorICAgICAgICAgICAgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIigqXG4iKSArICIgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsgIlxuIgorICAgICAgICAgKyAiIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiopXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cworICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6Om9jYW1sX2ltcG9ydHMoKSB7CisgIHJldHVybiAib3BlbiBUaHJpZnQiOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIgorICAgICAgICAgICA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX2lfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgZGVjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgICA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGluZGVudChmX3R5cGVzXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgPSAiIDw8IGVuZGwgPDwgInN0cnVjdCIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGVuZGwgPDwgInNpZyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAidHlwZSB0ID0gIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ8ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAibGV0IHRvX2kgPSBmdW5jdGlvbiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ2YWwgdG9faSA6IHQgLT4gSW50MzIudCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8ICIgPDwgbmFtZSA8PCAiIC0+ICIgPDwgdmFsdWUgPDwgImwiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgb2ZfaSA9IGZ1bmN0aW9uIiA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCBvZl9pIDogSW50MzIudCAtPiB0IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCB2YWx1ZSA8PCAibCAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8IF8gLT4gcmFpc2UgVGhyaWZ0X2Vycm9yIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJlbmQiIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAiZW5kIiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGluZGVudChmX2NvbnN0c18pIDw8ICJsZXQgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIC8vIE9DYW1sIHJlcXVpcmVzIGFsbCBmbG9hdGluZyBwb2ludCBudW1iZXJzIGNvbnRhaW4gYSBkZWNpbWFsIHBvaW50CisgIG91dC5zZXRmKGlvczo6c2hvd3BvaW50KTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJsIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiLiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKKyAgICBzdHJpbmcgY3QgPSB0bXAoIl9jIik7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBjdCA8PCAiID0gbmV3ICIgPDwgY25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgb3V0IDw8IGN0IDw8ICIjc2V0XyIgPDwgZm5hbWUgPDwgIiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8IGN0IDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBzdHJpbmcgaG0gPSB0bXAoIl9obSIpOworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgaG0gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgdmFsLnNpemUoKSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGhtIDw8ICIgIiA8PCBrZXkgPDwgIiAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgaG0gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIl0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IHZhbCA8PCAiIHRydWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgInN0cnVjdCIKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCwgYnV0IGFsc28gaGFzIGFuIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBPQ2FtbCBzdHJ1Y3QKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhmX3R5cGVzX2lfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvc3RyZWFtJiBvdXQsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMpIHsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0ICovCisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJsZXQgX25ldyA9IE9vLmNvcHkgc2VsZiBpbiIgPDwgZW5kbDsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvdXQsICptX2l0ZXIpOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJfbmV3IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUqIHR5cGUsIHN0cmluZyB3aGF0KSB7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHdoYXQgKyBzdHJpbmcoIiNjb3B5Iik7CisgIH0KKyAgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGNvcHlfb2ZfayA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCksICJrIik7CisgICAgc3RyaW5nIGNvcHlfb2ZfdiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCksICJ2Iik7CisKKyAgICBpZiAoY29weV9vZl9rID09ICJrIiAmJiBjb3B5X29mX3YgPT0gInYiKSB7CisgICAgICByZXR1cm4gc3RyaW5nKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAgICAgICAgICAiKChmdW4gb2ggLT4gbGV0IG5oID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIG9oKSBpbiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgIgorICAgICAgICAgICAgICAgICAiLT4gSGFzaHRibC5hZGQgbmggIikgKyBjb3B5X29mX2sgKyBzdHJpbmcoIiAiKSArIGNvcHlfb2ZfdiArIHN0cmluZygiKSBvaDsgbmgpICIpCisgICAgICAgICAgICAgKyB3aGF0ICsgIikiOworICAgIH0KKyAgfQorICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAiayIpOworCisgICAgaWYgKGNvcHlfb2YgPT0gImsiKSB7CisgICAgICByZXR1cm4gc3RyaW5nKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAgICAgICAgICAiKChmdW4gb2ggLT4gbGV0IG5oID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIG9oKSBpbiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgIgorICAgICAgICAgICAgICAgICAiLT4gSGFzaHRibC5hZGQgbmggIikgKyBjb3B5X29mICsgc3RyaW5nKCIgdHJ1ZSIpICsgc3RyaW5nKCIpIG9oOyBuaCkgIikgKyB3aGF0CisgICAgICAgICAgICAgKyAiKSI7CisgICAgfQorICB9CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgIngiKTsKKyAgICBpZiAoY29weV9vZiAhPSAieCIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihMaXN0Lm1hcCAoZnVuIHggLT4gIikgKyBjb3B5X29mICsgc3RyaW5nKCIpICIpICsgd2hhdCArIHN0cmluZygiKSIpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gd2hhdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHdoYXQ7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcikgeworICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodG1lbWJlci0+Z2V0X3R5cGUoKSk7CisKKyAgc3RyaW5nIGdyYWJfZmllbGQgPSBzdHJpbmcoInNlbGYjZ3JhYl8iKSArIG1uYW1lOworICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZih0eXBlLCBncmFiX2ZpZWxkKTsKKyAgaWYgKGNvcHlfb2YgIT0gZ3JhYl9maWVsZCkgeworICAgIGluZGVudChvdXQpOworICAgIGlmICghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7CisgICAgICBvdXQgPDwgImlmIF8iIDw8IG1uYW1lIDw8ICIgPD4gTm9uZSB0aGVuIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgIjsKKyAgICB9CisgICAgb3V0IDw8ICJfbmV3I3NldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCBjb3B5X29mIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRuYW1lIDw8ICIgPSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3V0LCB0bmFtZSwgKCptX2l0ZXIpKTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfQorICBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvdXQsIG1lbWJlcnMpOworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJleGNlcHRpb24gIiA8PCBjYXBpdGFsaXplKHRuYW1lKSA8PCAiIG9mICIgPDwgdG5hbWUgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3R1cmUgbWVtYmVyIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRuYW1lIE5hbWUgb2YgdGhlIHBhcmVudCBzdHJ1Y3R1cmUgZm9yIHRoZSBtZW1iZXIKKyAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgc3RyaW5nIHggPSB0bXAoIl94Iik7CisgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKworICBpbmRlbnQob3V0KSA8PCAidmFsIG11dGFibGUgXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgcmVuZGVyX29jYW1sX3R5cGUodG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgIHRfY29uc3RfdmFsdWUqIHZhbCA9IHRtZW1iZXItPmdldF92YWx1ZSgpOworICBpZiAodmFsKSB7CisgICAgaWYgKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKKyAgICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICIgb3B0aW9uID0gU29tZSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkKKyAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIGFzc2VydCghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgIG91dCA8PCAiIG9wdGlvbiA9IE5vbmUiIDw8IGVuZGw7CisgIH0KKworICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiID0gU29tZSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gIiA8PCB4IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdyYWJfIiA8PCBtbmFtZSA8PCAiID0gbWF0Y2ggXyIgPDwgbW5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIHdpdGggTm9uZS0+cmFpc2UgKEZpZWxkX2VtcHR5IFwiIiA8PCB0bmFtZSA8PCAiLiIgPDwgbW5hbWUgPDwgIlwiKSB8IFNvbWUgIgorICAgICAgICAgICAgICAgIDw8IHggPDwgIiAtPiAiIDw8IHggPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHNldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCB4IDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtIFNvbWUgIiA8PCB4CisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gTm9uZSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgcmVzZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiOworICBpZiAodmFsKSB7CisgICAgaWYgKHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICJTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiTm9uZSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gbm90IGhhdmUgdW5kZWZpbmVkIHZhbHVlCisgKgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLworYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIHJldHVybiAodmFsID8gdHJ1ZSA6IGZhbHNlKTsKK30KKworLyoqCisgKiBDaGVjayB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIGJlIHNraXBwZWQgZHVyaW5nIGVuY29kaW5nCisgKgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLworYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkKiB0bWVtYmVyKSB7CisgIHJldHVybiAodG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworfQorCisvKioKKyAqIEZpZ3VyZSBvdXQgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGhhcworICogYSBjaGVhcGx5IGNvbXBhcmFibGUgZGVmYXVsdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIGlmICghdmFsKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgLy8gQmFzZSB0eXBlcyBhcmUgZ2VuZXJhbGx5IGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbC0+Z2V0X2RvdWJsZSgpID09IDAuMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIC8vIEVtcHR5IGxpc3RzIGFyZSBjaGVhcGx5IGNvbXBhcmVkIGZvciBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLgorICAgIC8vIElzIGVtcHR5IGxpc3Q/CisgICAgaWYgKHZhbC0+Z2V0X2xpc3QoKS5zaXplKCkgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib2JqZWN0ICgnYSkiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIHggPSB0bXAoIl94Iik7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX29jYW1sX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIG9wdGlvbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIC0+IHVuaXQiIDw8IGVuZGw7CisgICAgICBpZiAoIXN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCgqbV9pdGVyKSkKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB1bnNldF8iIDw8IG1uYW1lIDw8ICIgOiB1bml0IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgOiB1bml0IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGNvcHkgOiAnYSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB3cml0ZSA6IFByb3RvY29sLnQgLT4gdW5pdCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8ICIgb2YgIiA8PCB0bmFtZSA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInZhbCByZWFkXyIgPDwgdG5hbWUgPDwgIiA6IFByb3RvY29sLnQgLT4gIiA8PCB0bmFtZSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOworICBzdHJpbmcgdCA9IHRtcCgiX3QiKTsKKyAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCByZWMgcmVhZF8iIDw8IHNuYW1lIDw8ICIgKGlwcm90IDogUHJvdG9jb2wudCkgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJsZXQgIiA8PCBzdHIgPDwgIiA9IG5ldyAiIDw8IHNuYW1lIDw8ICIgaW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWdub3JlKGlwcm90I3JlYWRTdHJ1Y3RCZWdpbik7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAiKHRyeSB3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJsZXQgKF8sIiA8PCB0IDw8ICIsIiA8PCBpZCA8PCAiKSA9IGlwcm90I3JlYWRGaWVsZEJlZ2luIGluIiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmICIgPDwgdCA8PCAiID0gUHJvdG9jb2wuVF9TVE9QIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmFpc2UgQnJlYWsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbHNlICgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgaWQgPDwgIiB3aXRoICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJ8ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiAtPiAoIjsKKyAgICBvdXQgPDwgImlmICIgPDwgdCA8PCAiID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCBzdHIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAgIiA8PCB0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAifCBfIC0+ICIKKyAgICAgIDw8ICJpcHJvdCNza2lwICIgPDwgdCA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImRvbmU7ICgpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAid2l0aCBCcmVhayAtPiAoKSk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkU3RydWN0RW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCBzdHIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7CisgIHN0cmluZyBmID0gdG1wKCJfZiIpOworCisgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgd3JpdGUgKG9wcm90IDogUHJvdG9jb2wudCkgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVN0cnVjdEJlZ2luIFwiIiA8PCBuYW1lIDw8ICJcIjsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0bWVtYmVyID0gKCpmX2l0ZXIpOworICAgIHN0cmluZyBtbmFtZSA9ICJfIiArIGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgX3Y7CisKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7CisKKyAgICAgIGlmIChzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpICYmIHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodG1lbWJlcikpIHsKKyAgICAgICAgX3YgPSAiX3YiOworICAgICAgICAvLyBBdm9pZCByZWR1bmRhbnQgZW5jb2Rpbmcgb2YgbWVtYmVycyBoYXZpbmcgZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBtbmFtZSA8PCAiIHdpdGggIgorICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8ICIgLT4gKCkgfCAiCisgICAgICAgICAgICAgICAgICAgIDw8IF92IDw8ICIgLT4gIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3YgPSBtbmFtZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiKG1hdGNoICIgPDwgbW5hbWUgPDwgIiB3aXRoICI7CisKKyAgICAgIGlmIChzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpKSB7CisgICAgICAgIG91dCA8PCAiTm9uZSAtPiAoKSI7CisKKyAgICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodG1lbWJlcikpIHsKKyAgICAgICAgICAvLyBBdm9pZCByZWR1bmRhbnQgZW5jb2Rpbmcgb2YgbWVtYmVycyBoYXZpbmcgZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgICAgb3V0IDw8ICIgfCBTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKQorICAgICAgICAgICAgICA8PCAiIC0+ICgpIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIiB8IFNvbWUgX3YgLT4gIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ8IE5vbmUgLT4gcmFpc2UgKEZpZWxkX2VtcHR5IFwiIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi4iIDw8IG1uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICJcIikiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ8IFNvbWUgX3YgLT4gIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBfdiA9ICJfdiI7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUZpZWxkQmVnaW4oXCIiIDw8IHRtZW1iZXItPmdldF9uYW1lKCkgPDwgIlwiLCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0odG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIiwiIDw8IHRtZW1iZXItPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIHRtZW1iZXIsIF92KTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUZpZWxkRW5kIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlRmllbGRTdG9wOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVTdHJ1Y3RFbmQiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLm1sIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl9zZXJ2aWNlX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIi5tbGkiOworICBmX3NlcnZpY2VfaV8ub3BlbihmX3NlcnZpY2VfaV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2lfIDw8IG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgLyogaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8CisgICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2lfIDw8CisgICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIH0KKyAgKi8KKyAgZl9zZXJ2aWNlXyA8PCAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfc2VydmljZV9pXyA8PCAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgZl9zZXJ2aWNlX2lfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKiBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTICopIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9vY2FtbF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgPSIgPDwgZW5kbCA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2lfIDw8IGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlIDoiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7CisgIH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIHRydWUpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgIDw8IGZ0IDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2lfIDw8IGluZGVudCgpIDw8ICJtZXRob2QgdmlydHVhbCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgIDw8IGZ0IDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBPQ2FtbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4KKyAqVGhpcyBpcyBiZWNhdXNlCisgKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vbmUuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzIGNsaWVudCAoaXByb3QgOiBQcm90b2NvbC50KSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImNsYXNzIGNsaWVudCA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiAiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IGlwcm90IG9wcm90IGFzIHN1cGVyIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgPDwgZXh0ZW5kcyA8PCAiLmNsaWVudCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhbCBtdXRhYmxlIHNlcWlkID0gMCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgIm1ldGhvZCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fdHlwZSgqZl9pdGVyLCB0cnVlLCBmYWxzZSkgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYjc2VuZF8iIDw8IGZ1bm5hbWU7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiICIgPDwgZGVjYXBpdGFsaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgInNlbGYjcmVjdl8iIDw8IGZ1bm5hbWUgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByaXZhdGUgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4gKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJQcm90b2NvbC5PTkVXQVkiIDogIlByb3RvY29sLkNBTEwiKSA8PCAiLCBzZXFpZCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzI3NldF8iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kIHByaXZhdGUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgPSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKGlmIG10eXBlID0gUHJvdG9jb2wuRVhDRVBUSU9OIHRoZW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4ucmVhZCBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAoaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAgcmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIHgpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJlbHNlICgpKTsiIDw8IGVuZGw7CisgICAgICBzdHJpbmcgcmVzID0gIl8iOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmVzID0gInJlc3VsdCI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCByZXMgPDwgIiA9IHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXByb3QgaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIHJlc3VsdCNnZXRfc3VjY2VzcyB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiAoIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKG1hdGNoIHJlc3VsdCNnZXRfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggTm9uZSAtPiAoKSB8IFNvbWUgX3YgLT4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByYWlzZSAoIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBfdikpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8KKyAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAicmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIChBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5NSVNTSU5HX1JFU1VMVCBcIiIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzIHByb2Nlc3NvciAoaGFuZGxlciA6IGlmYWNlKSA9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvYmplY3QgKHNlbGYpIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImNsYXNzIHByb2Nlc3NvciA6IGlmYWNlIC0+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvYmplY3QiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2lfIDw8IGluZGVudCgpIDw8ICJpbmhlcml0IFByb2Nlc3Nvci50IiA8PCBlbmRsIDw8IGVuZGw7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciAoaGFuZGxlciA6PiAiICsgZXh0ZW5kcyArICIuaWZhY2UpIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA9IEhhc2h0YmwuY3JlYXRlICIgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfaV8pCisgICAgICA8PCAidmFsIHByb2Nlc3NNYXAgOiAoc3RyaW5nLCBpbnQgKiBQcm90b2NvbC50ICogUHJvdG9jb2wudCAtPiB1bml0KSBIYXNodGJsLnQiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm1ldGhvZCBwcm9jZXNzIGlwcm90IG9wcm90ID0iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJtZXRob2QgcHJvY2VzcyA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiBib29sIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgKG5hbWUsIHR5cCwgc2VxaWQpICA9IGlwcm90I3JlYWRNZXNzYWdlQmVnaW4gaW4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UKKworICAvLyBIT1Q6IGRpY3Rpb25hcnkgZnVuY3Rpb24gbG9va3VwCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIEhhc2h0YmwubWVtIHByb2Nlc3NNYXAgbmFtZSB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgKEhhc2h0YmwuZmluZCBwcm9jZXNzTWFwIG5hbWUpIChzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJlbHNlICgiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcChQcm90b2NvbC5UX1NUUlVDVCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5VTktOT1dOX01FVEhPRCAoXCJVbmtub3duICIKKyAgICAgICAgICAgICAgICAiZnVuY3Rpb24gXCJebmFtZSkgaW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAgIG9wcm90I3dyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFByb3RvY29sLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICAgeCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFJlYWQgZW5kIG9mIGFyZ3MgZmllbGQsIHRoZSBUX1NUT1AsIGFuZCB0aGUgc3RydWN0IGNsb3NlCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRydWUiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbml0aWFsaXplciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiSGFzaHRibC5hZGQgcHJvY2Vzc01hcCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIgc2VsZiNwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByaXZhdGUgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCkgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOworCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgYXJncyA9ICJhcmdzIjsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMCkgeworICAgIGFyZ3MgPSAiXyI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCBhcmdzIDw8ICIgPSByZWFkXyIgPDwgYXJnc25hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90I3JlYWRNZXNzYWdlRW5kOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIih0cnkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0I3NldF9zdWNjZXNzICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKGhhbmRsZXIjIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIGFyZ3MjZ2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3aXRoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ8ICIgPDwgY2FwaXRhbGl6ZSh0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIC0+ICIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0I3NldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKCkiOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIiwgUHJvdG9jb2wuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworCisgIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3NldF8iIDw8IG5hbWUgPDwgIiAiOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgdHlwZSk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIG91dCA8PCAiaXByb3QjIjsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAicmVhZEJvb2wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIG91dCA8PCAicmVhZEJ5dGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBvdXQgPDwgInJlYWRJMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgInJlYWRJMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgInJlYWRJNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBvdXQgPDwgInJlYWREb3VibGUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gb2NhbWwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOworICAgIG91dCA8PCAiKCIgPDwgZW5hbWUgPDwgIi5vZl9pIGlwcm90I3JlYWRJMzIpIjsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBUWVBFICclcydcbiIsIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0c3RydWN0LT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOworICB9CisgIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworICBvdXQgPDwgIigiIDw8IHByZWZpeCA8PCAicmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CisgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworICBzdHJpbmcgY29uID0gdG1wKCJfY29uIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCIgPDwga3R5cGUgPDwgIiwiIDw8IHZ0eXBlIDw8ICIsIiA8PCBzaXplIDw8ICIpID0gaXByb3QjcmVhZE1hcEJlZ2luIGluIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCBzaXplIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9rID0gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfdiA9ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGNvbiA8PCAiIF9rIF92IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgaXByb3QjcmVhZE1hcEVuZDsgIiA8PCBjb24gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkU2V0QmVnaW4gaW4iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCBzaXplIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBpID0gMSB0byAiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBjb24gPDwgIiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkU2V0RW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgKCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkTGlzdEJlZ2luIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJsZXQgIiA8PCBjb24gPDwgIiA9IChBcnJheS50b19saXN0IChBcnJheS5pbml0ICIgPDwgc2l6ZSA8PCAiIChmdW4gXyAtPiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIG91dCA8PCAiKSkpIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkTGlzdEVuZDsgIiA8PCBjb24gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgbmFtZSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QjIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gb2NhbWwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IGVuYW1lIDw8ICIudG9faSAiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KKyAgb3V0IDw8ICI7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiN3cml0ZShvcHJvdCkiOworfQorCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiOworICAgIG91dCA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwiOworICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwiOworICAgIG91dCA8PCAiTGlzdC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgiX2tpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJfdml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIiA8PCBraXRlciA8PCAiIC0+IGZ1biAiIDw8IHZpdGVyIDw8ICIgLT4gIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIiA8PCBpdGVyIDw8ICIgLT4gZnVuIF8gLT4gIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiTGlzdC5pdGVyIChmdW4gIiA8PCBpdGVyIDw8ICIgLT4gIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTWFwRW5kIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVTZXRFbmQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVMaXN0RW5kIjsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ25hbWUgYXJncycKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHJldHVybiBwcmVmaXggKyBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIgIgorICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QsIGJvb2wgb3B0aW9ucykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAob3B0aW9ucykKKyAgICAgIHJlc3VsdCArPSAiIG9wdGlvbiI7CisgICAgcmVzdWx0ICs9ICIgLT4gIjsKKyAgfQorICBpZiAoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCkgeworICAgIHJlc3VsdCArPSAidW5pdCAtPiAiOworICB9CisgIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfdHlwZXMuIjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpOworICB9IGVsc2UgeworICAgIG5hbWUgPSBkZWNhcGl0YWxpemUobmFtZSk7CisgIH0KKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQcm90b2NvbC50X3R5cGUgZW51bQorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBvY2FtbCB0eXBlCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJ1bml0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIkludDMyLnQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJJbnQ2NC50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZmxvYXQiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZSgoKHRfZW51bSopdHlwZSktPmdldF9uYW1lKCkpICsgIi50IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHJldHVybiAiKCIgKyByZW5kZXJfb2NhbWxfdHlwZShrdHlwZSkgKyAiLCIgKyByZW5kZXJfb2NhbWxfdHlwZSh2dHlwZSkgKyAiKSBIYXNodGJsLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgcmV0dXJuICIoIiArIHJlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSArICIsYm9vbCkgSGFzaHRibC50IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgcmV0dXJuIHJlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSArICIgbGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Iob2NhbWwsICJPQ2FtbCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRhNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX09PUF9HRU5FUkFUT1JfSAorI2RlZmluZSBUX09PUF9HRU5FUkFUT1JfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisvKioKKyAqIENsYXNzIHdpdGggdXRpbGl0eSBtZXRob2RzIHNoYXJlZCBhY3Jvc3MgY29tbW9uIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZXMuCisgKiBTcGVjaWZpY2FsbHksIG1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBmb3IgQysrL0phdmEuCisgKgorICovCitjbGFzcyB0X29vcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X29vcF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHt9CisKKyAgLyoqCisgICAqIFNjb3BpbmcsIHVzaW5nIGN1cmx5IGJyYWNlcyEKKyAgICovCisKKyAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBzdGQ6OmVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7CisgIH0KKworICBzdGQ6OnN0cmluZyB1cGNhc2Vfc3RyaW5nKHN0ZDo6c3RyaW5nIG9yaWdpbmFsKSB7CisgICAgc3RkOjp0cmFuc2Zvcm0ob3JpZ2luYWwuYmVnaW4oKSwgb3JpZ2luYWwuZW5kKCksIG9yaWdpbmFsLmJlZ2luKCksIChpbnQgKCopKGludCkpdG91cHBlcik7CisgICAgcmV0dXJuIG9yaWdpbmFsOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKSArICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgY29tYmluZWRfbWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICAgIH0KKyAgfQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI0YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDE2ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIFBFUkwgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3BlcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcGVybF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pLCBmX3R5cGVzX3VzZV9pbmNsdWRlc19lbWl0dGVkXyhmYWxzZSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gcGVybDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcGVybCI7CisgICAgZXNjYXBlX1snJCddID0gIlxcJCI7CisgICAgZXNjYXBlX1snQCddID0gIlxcQCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3RzIQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3VzZV9pbmNsdWRlcyhzdGQ6Om9zdHJlYW0mIG9zLCBib29sJiBkb25lLCB0X3R5cGUgKnR5cGUsIGJvb2wgc2VsZmlzaCk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBlcmxfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBib29sIG9iaiA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiNcbiIgKyAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiNcbiI7CisgIH0KKworICB2b2lkIHBlcmxfbmFtZXNwYWNlX2RpcnModF9wcm9ncmFtKiBwLCBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBkaXJzKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwZXJsIik7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGRpcnMucHVzaF9iYWNrKG5zLnN1YnN0cigwLCBsb2MpKTsKKyAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIGRpcnMucHVzaF9iYWNrKG5zKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBwZXJsX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiIjsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOworICAgICAgICByZXN1bHQgKz0gIjo6IjsKKyAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgICAgICB9CisKKyAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICAgIHJlc3VsdCArPSBucyArICI6OiI7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpIHsKKyAgICBzdGQ6OnN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKKyAgICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICBvdXRkaXIgKz0gKml0ICsgIi8iOworICAgIH0KKyAgICByZXR1cm4gb3V0ZGlyOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVscGVyc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBib29sIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKKyAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7CisgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OworICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7CisgICAgb3V0ZGlyICs9ICppdCArICIvIjsKKyAgICBNS0RJUihvdXRkaXIuY19zdHIoKSk7CisgIH0KKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIgKyAiVHlwZXMucG0iOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBvdXRkaXIgKyAiQ29uc3RhbnRzLnBtIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGVybF9pbmNsdWRlcygpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgIkNvbnN0YW50czsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IHBlcmxfaW5jbHVkZXMoKSA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnBlcmxfaW5jbHVkZXMoKSB7CisgIHN0cmluZyBpbmM7CisKKyAgaW5jICA9ICJ1c2UgNS4xMC4wO1xuIjsKKyAgaW5jICs9ICJ1c2Ugc3RyaWN0O1xuIjsKKyAgaW5jICs9ICJ1c2Ugd2FybmluZ3M7XG4iOworICBpbmMgKz0gInVzZSBUaHJpZnQ6OkV4Y2VwdGlvbjtcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7XG4iOworICBpbmMgKz0gInVzZSBUaHJpZnQ6OlR5cGU7XG5cbiI7CisKKyAgcmV0dXJuIGluYzsKK30KKworLyoqCisgKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18gPDwgIjE7IiA8PCBlbmRsOworICBmX3R5cGVzXy5jbG9zZSgpOworCisgIGZfY29uc3RzXyA8PCAiMTsiIDw8IGVuZGw7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEVSTCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBTaW5jZSBkZWZpbmUgaXMgZXhwZW5zaXZlIHRvIGxvb2t1cAorICogaW4gUEVSTCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZl90eXBlc18gPDwgInVzZSBjb25zdGFudCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBmX2NvbnN0c18gPDwgInVzZSBjb25zdGFudCAiIDw8IG5hbWUgPDwgIiA9PiAiOworICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKKyAgZl9jb25zdHNfIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICIxIiA6ICIwIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLT5uZXcoeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIiwiOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPT4gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworCisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIG91dCA8PCAiID0+IDEiOworICAgICAgfQorICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJdIjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIE1ha2UgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKGZfdHlwZXNfLCBmX3R5cGVzX3VzZV9pbmNsdWRlc19lbWl0dGVkXywgdHN0cnVjdCwgZmFsc2UpOworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQRVJMCisgKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCisgKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjtcbiI7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgInVzZSBiYXNlIHF3KFRocmlmdDo6VEV4Y2VwdGlvbik7XG4iOworICB9CisKKyAgLy8gQ3JlYXRlIHNpbXBsZSBhY2Vzc29yIG1ldGhvZHMKKyAgb3V0IDw8ICJ1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpO1xuIjsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi0+bWtfYWNjZXNzb3JzKCBxdyggIjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoIXQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICIpICk7XG4iOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gbmV3KCkKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCAic3ViIG5ldyB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkY2xhc3NuYW1lID0gc2hpZnQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJHZhbHMgICAgICA9IHNoaWZ0IHx8IHt9OyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIGR2YWwgPSAidW5kZWYiOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAifSA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFVOSVZFUlNBTDo6aXNhKCR2YWxzLCdIQVNIJykpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkdmFscy0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICR2YWxzLT57IgorICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MgKCRzZWxmLCAkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAifVxuXG4iOworCisgIG91dCA8PCAic3ViIGdldE5hbWUgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8ICJzdWIgcmVhZCB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkeGZlciAgPSAwOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibXkgJGZpZCAgID0gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFxcJGZuYW1lKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoMSkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcXCRmbmFtZSwgXFwkZnR5cGUsIFxcJGZpZCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJsYXN0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgIlNXSVRDSDogZm9yKCRmaWQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiL14iIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIkLyAmJiBkb3siOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxhc3Q7IH07IiA8PCBlbmRsOworICB9CisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKworICBpbmRlbnQob3V0KSA8PCAiICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgInN1YiB3cml0ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAibXkgKCRzZWxmLCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm15ICR4ZmVyICAgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRzZWxmLT57IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLT4iKTsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHVzZSBjbGF1c2VzIGZvciBpbmNsdWRlZCBlbnRpdGllcworICoKKyAqIEBwYXJhbSAgb3MgICAgICAgVGhlIG91dHB1dCBzdHJlYW0KKyAqIEBwYXJhbSAgZG9uZSAgICAgQSBmbGFnIHJlZmVyZW5jZSB0byBkZWJvdW5jZSB0aGUgYWN0aW9uCisgKiBAcGFyYW0gIHR5cGUgICAgIFRoZSB0eXBlIGJlaW5nIHByb2Nlc3NlZAorICogQHBhcmFtICBzZWxmaXNoICBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBjdXJyZW50IG5hbWVzcGFjZSB0eXBlcyBzaG91bGQgYmUgInVzZSJkIGFzIHdlbGwuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdXNlX2luY2x1ZGVzKHN0ZDo6b3N0cmVhbSYgb3MsIGJvb2wmIGRvbmUsIHRfdHlwZSAqdHlwZSwgYm9vbCBzZWxmaXNoKSB7CisgIHRfcHJvZ3JhbSAqY3VycmVudCA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChjdXJyZW50ICYmICFkb25lKSB7CisgICAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGN1cnJJbmMgPSBjdXJyZW50LT5nZXRfaW5jbHVkZXMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6c2l6ZV90eXBlIG51bUluYyA9IGN1cnJJbmMuc2l6ZSgpOworICAgIGlmIChzZWxmaXNoKSB7CisgICAgICBvcyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoY3VycmVudCkgPDwgIlR5cGVzOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtSW5jOyArK2kpIHsKKyAgICAgIHRfcHJvZ3JhbSogaW5jUHJvZ3JhbSA9IGN1cnJJbmMuYXQoaSk7CisgICAgICBvcyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoaW5jUHJvZ3JhbSkgPDwgIlR5cGVzOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3MgPDwgZW5kbDsKKyAgICBkb25lID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICIucG0iOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwZXJsX2luY2x1ZGVzKCk7CisKKyAgYm9vbCBkb25lID0gZmFsc2U7CisgIGdlbmVyYXRlX3VzZV9pbmNsdWRlcyhmX3NlcnZpY2VfLCBkb25lLCB0c2VydmljZSwgdHJ1ZSk7CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAidXNlICIgPDwgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQRVJMKQorICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfIDw8ICIxOyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IpOyI7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaGFuZGxlcikgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntoYW5kbGVyfSA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZSAgPSB1bmRlZjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlICA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiIDw8IGVuZGw7CisKKyAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImlmICghJHNlbGYtPmNhbigkbWV0aG9kbmFtZSkpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+c2tpcChUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm15ICR4ID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldygnRnVuY3Rpb24gJy4kZm5hbWUuJyBub3QgaW1wbGVtZW50ZWQuJywgIgorICAgICAgICAgICAgICAgICJUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkc2VsZi0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiAxOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKKworICBzdHJpbmcgYXJnc25hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkYXJncy0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV2YWwgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiJHJlc3VsdC0+e3N1Y2Nlc3N9ID0gIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIkc2VsZi0+e2hhbmRsZXJ9LT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIkYXJncy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifTsgaWYoIFVOSVZFUlNBTDo6aXNhKCRALCciCisgICAgICAgICAgICAgICAgIDw8IHBlcmxfbmFtZXNwYWNlKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICInKSApeyAiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJEA7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJEAgPSB1bmRlZjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIGNhdGNoLWFsbCBmb3IgdW5leHBlY3RlZCBleGNlcHRpb25zIChUSFJJRlQtMzE5MSkKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoJEApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJEAgPX4gcy9eXFxzK3xcXHMrJC8vZzsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJteSAkZXJyID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldyhcIlVuZXhwZWN0ZWQgRXhjZXB0aW9uOiBcIiAuICRALCBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkZXJyLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkQCA9IHVuZGVmOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBTZXJpYWxpemUgdGhlIHJlcGx5CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8ICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOworICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7CisgICAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICArICJJZik7IjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsIDw8ICIgIGRpZSAnaW1wbGVtZW50IGludGVyZmFjZSc7XG59IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfaWYgPSAidXNlIGJhc2UgcXcoIiArIHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgKyAiUmVzdCk7IjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3Q7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNlIHN0cmljdDsiIDw8IGVuZGwgPDwgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbXBsKSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm15ICRzZWxmICAgICA9eyBpbXBsID0+ICRpbXBsIH07IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkcmVxdWVzdCkgPSBAXzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0LT57JyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ30iOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAoIiA8PCByZXEgPDwgIikgPyAiIDw8IHJlcQorICAgICAgICAgICAgICAgICA8PCAiIDogdW5kZWY7IiA8PCBlbmRsOworICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgQCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBzcGxpdCgvLC8sICQiCisgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IFxcQCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiAkc2VsZi0+e2ltcGx9LT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICAgICAgIDw8IGFyZ3VtZW50X2xpc3QoKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJDbGllbnQpOyI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGwgPDwgInVzZSBiYXNlIHF3KCIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pCisgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYpOyIgPDwgZW5kbDsKKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgPDwgZW5kbDsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fSAgPSAkaW5wdXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9ID0gZGVmaW5lZCAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e3NlcWlkfSAgPSAwOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+c2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgIiRzZWxmLT5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJzdWIgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIicsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkNBTEwiKQorICAgICAgICAgICAgICAgPDwgIiwgJHNlbGYtPntzZXFpZH0pOyIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPnsiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkc2VsZi0+e291dHB1dH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBteSAkeCA9IFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgJHgtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZGllICR4OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiRyZXN1bHQtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRyZXN1bHQtPntzdWNjZXNzfSApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gJHJlc3VsdC0+e3N1Y2Nlc3N9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZGllICRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGllIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CisgICh2b2lkKWluY2xhc3M7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgaWYgKCFwcmVmaXguZW1wdHkoKSkgeworICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbChcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMihcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKKyAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQorICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKKyAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9ICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi0+bmV3KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXgKKyAgICAgIDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisgIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9pOCwga3R5cGUpOworICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfaTgsIHZ0eXBlKTsKKyAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2k4LCBldHlwZSk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBzaXplIDw8ICIgPSAwOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IGt0eXBlIDw8ICIgPSAwOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiCisgICAgICAgIDw8ICJcXCQiIDw8IGt0eXBlIDw8ICIsIFxcJCIgPDwgdnR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgZXR5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiCisgICAgICAgIDw8ICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiCisgICAgICAgIDw8ICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChteSAkIiA8PCBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwga2V5IDw8ICJ9ID0gJCIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGVsZW0gPDwgIn0gPSAxOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAibXkgJCIgPDwgZWxlbSA8PCAiID0gdW5kZWY7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVzaChAeyQiIDw8IHByZWZpeCA8PCAifSwkIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9Iik7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgLy8gSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCisgICAgaWYgKCFwcmVmaXguZW1wdHkoKSkKKyAgICAgIG5hbWUgPSBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSI7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzY2FsYXIoa2V5cyAleyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzY2FsYXIoQHskIiA8PCBwcmVmaXggPDwgIn0pKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSggbXkgKCQiIDw8IGtpdGVyIDw8ICIsJCIgPDwgdml0ZXIgPDwgIikgPSBlYWNoICV7JCIgPDwgcHJlZml4IDw8ICJ9KSAiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoIG15ICQiIDw8IGl0ZXIgPDwgIiAoQHskIiA8PCBwcmVmaXggPDwgIn0pIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggbXkgJCIgPDwgaXRlciA8PCAiIChAeyQiIDw8IHByZWZpeCA8PCAifSkgIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICJteSAkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gJyciOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gW10iOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgaWYgKG9iaikgeworICAgICAgICByZXN1bHQgKz0gIiA9ICIgKyBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiLT5uZXcoKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiA9IHVuZGVmIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisKKyAgc3RyaW5nIHN0cjsKKworICBzdHIgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAie1xuIjsKKyAgc3RyICs9ICIgIG15ICRzZWxmID0gc2hpZnQ7XG4iOworCisgIC8vIE5lZWQgdG8gY3JlYXRlIHBlcmwgZnVuY3Rpb24gYXJnIGlucHV0cworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0ciArPSAiICBteSAkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgPSBzaGlmdDtcbiI7CisgIH0KKworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAiJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6Qk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6QllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpNQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6TElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocGVybCwgIlBlcmwiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGE0NDE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjc4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworI2RlZmluZSBOU0dMT0JBTCAobnNnbG9iYWxfLnNpemUoKSA/IG5zZ2xvYmFsXyA6ICIiKQorI2RlZmluZSBOU0dMT0JBTF9BICgiXFwiICsgTlNHTE9CQUwpCisjZGVmaW5lIE5TR0xPQkFMX0IgKE5TR0xPQkFMICsgIlxcIikKKyNkZWZpbmUgTlNHTE9CQUxfQUIgKCJcXCIgKyBOU0dMT0JBTCArICJcXCIpCisKKy8qKgorICogUEhQIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9waHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcGhwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBiaW5hcnlfaW5saW5lXyA9IGZhbHNlOworICAgIHJlc3RfID0gZmFsc2U7CisgICAgcGhwc18gPSBmYWxzZTsKKyAgICBvb3BfID0gZmFsc2U7CisgICAgdmFsaWRhdGVfID0gZmFsc2U7CisgICAganNvbl9zZXJpYWxpemFibGVfID0gZmFsc2U7CisgICAgbnNnbG9iYWxfID0gIiI7IC8vIGJ5IGRlZmF1bHQgZ2xvYmFsIG5hbWVzcGFjZSBpcyBlbXB0eQorICAgIGNsYXNzbWFwXyA9IGZhbHNlOworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImlubGluZWQiKSA9PSAwKSB7CisgICAgICAgIGJpbmFyeV9pbmxpbmVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgicmVzdCIpID09IDApIHsKKyAgICAgICAgcmVzdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJzZXJ2ZXIiKSA9PSAwKSB7CisgICAgICAgIHBocHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgib29wIikgPT0gMCkgeworICAgICAgICBvb3BfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgidmFsaWRhdGUiKSA9PSAwKSB7CisgICAgICAgIHZhbGlkYXRlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImpzb24iKSA9PSAwKSB7CisgICAgICAgIGpzb25fc2VyaWFsaXphYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5zZ2xvYmFsIikgPT0gMCkgeworICAgICAgICBuc2dsb2JhbF8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoImNsYXNzbWFwIikgPT0gMCkgeworICAgICAgICBjbGFzc21hcF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJwc3I0IikgPT0gMCkgeworICAgICAgICBpZihjbGFzc21hcF8peworICAgICAgICAgIHRocm93ICJwc3I0IGFuZCBjbGFzc21hcCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHdhcm5pbmcoMCwgInBzcjQgaXMgZGVmYXVsdCBvcHRpb24hIG5lZWRuJ3QgYWRkIHBzcjQgb3B0aW9uIVxuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBwaHA6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChvb3BfICYmIGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICB0aHJvdyAib29wIGFuZCBpbmxpbmVkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIjsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gKGJpbmFyeV9pbmxpbmVfID8gImdlbi1waHBpIiA6ICJnZW4tcGhwIik7CisgICAgZXNjYXBlX1snJCddID0gIlxcJCI7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuICIgICAgIjsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0cyEKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlX21vZGUpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGJvb2wgbmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICBib29sIG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICBpbnQgZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywgYm9vbCB3cml0ZV9tb2RlKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF90eXBlX3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RkOjpvc3RyZWFtJiBmaWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihzdGQ6Om9zdHJlYW0mIGZpbGUpOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBocF9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYWRkVHlwZUhpbnRzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fY2FzdCh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR0eXBlKTsKKworICBib29sIHBocF9pc19zY2FsYXIodF90eXBlICp0dHlwZSkgeworICAgIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZih0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZih0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHBocF9uYW1lc3BhY2VfYmFzZShjb25zdCB0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocCIpOworICAgIGNvbnN0IGNoYXIqIGRlbGltaXRlciA9ICJcXCI7CisgICAgc2l6ZV90IHBvc2l0aW9uID0gbnMuZmluZCgnLicpOworICAgIHdoaWxlIChwb3NpdGlvbiAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIG5zLnJlcGxhY2UocG9zaXRpb24sIDEsIGRlbGltaXRlcik7CisgICAgICBwb3NpdGlvbiA9IG5zLmZpbmQoJy4nLCBwb3NpdGlvbiArIDEpOworICAgIH0KKyAgICByZXR1cm4gbnM7CisgIH0KKworICAvLyBnZW5lcmFsIHVzZSBuYW1lc3BhY2UgcHJlZml4aW5nOiBcbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCisgIHN0cmluZyBwaHBfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKKyAgICByZXR1cm4gKG5zZ2xvYmFsXy5zaXplKCkgPyBOU0dMT0JBTF9BQiA6IE5TR0xPQkFMX0IpICsgKG5zLnNpemUoKSA/IChucyArICJcXCIpIDogIiIpOworICB9CisKKyAgLy8gcmV0dXJuIHRoZSBuYW1lc3BhY2Ugb2YgYSBmaWxlOgorICAvLyBnbG9iYWxcbnNcc3ViXG5zIG9yIGdsb2JhbFxucyBvciBzdWJcbnMKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2Vfc3VmZml4KGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKKworICAgIHJldHVybiBOU0dMT0JBTAorICAgICAgKyAobnMuc2l6ZSgpICYmIE5TR0xPQkFMLnNpemUoKSA/ICJcXCIgOiAiIikKKyAgICAgICsgbnM7CisgIH0KKworICAvLyBhZGQgYSBkaXJlY3RvcnkgdG8gYWxyZWFkeSBleGlzdGluZyBuYW1lc3BhY2UKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KHN0cmluZyBkaXJlY3RvcnksIGJvb2wgZW5kID0gdHJ1ZSkgeworICAgICh2b2lkKWRpcmVjdG9yeTsKKyAgICBpZiAoZW5kKSB7CisgICAgICByZXR1cm4gIjsiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGluZyBhbiBhdXRsb2FkIGlkZW50aWZpZXIgaW50byBnbG9iYTtsczogbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCisgIHN0cmluZyBwaHBfbmFtZXNwYWNlX2F1dG9sb2FkKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0IgOiBOU0dMT0JBTCkgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7CisgIH0KKworICAvLyBkZWNsYXJpbmcgYSB0eXBlOiB0eXBlbmFtZSBvciBteV9uYW1lc3BhY2VfdHlwZW5hbWUKKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odF90eXBlKiB0KSB7IHJldHVybiB0LT5nZXRfbmFtZSgpOyB9CisKKyAgc3RkOjpzdHJpbmcgcGhwX3BhdGgodF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwaHAucGF0aCIpOworICAgIGlmIChucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcC0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICAvLyBUcmFuc2Zvcm0gdGhlIGphdmEtc3R5bGUgbmFtZXNwYWNlIGludG8gYSBwYXRoLgorICAgIGZvciAoc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gbnMuYmVnaW4oKTsgaXQgIT0gbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgIGlmICgqaXQgPT0gJy4nKSB7CisgICAgICAgICppdCA9ICcvJzsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnMgKyAnLyc7CisgIH0KKworICAvKioKKyAgICogVHJhbnNmb3JtIGNsYXNzX21ldGhvZCBpbnRvIENsYXNzTWV0aG9kCisgICAqCisgICAqIEBwYXJhbSBzdHIKKyAgICogQHJldHVybiBzdGlybmcKKyAgICovCisgIHN0cmluZyBjbGFzc2lmeShzdHJpbmcgc3RyKSB7CisgICAgc3RyaW5nIGNsYXNzZSA9ICIiOworCisgICAgdmVjdG9yPHN0cmluZz4geCA9IHNwbGl0KHN0ciwgJ18nKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgeC5zaXplKCk7ICsraSkgeworICAgICAgY2xhc3NlID0gY2xhc3NlICsgY2FwaXRhbGl6ZSh4W2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2xhc3NlOworICB9CisKKyAgLyoqCisgICAqIFNwbGl0IG1ldGhvZAorICAgKiBAcGFyYW0gcworICAgKiBAcGFyYW0gZGVsaW0KKyAgICogQHBhcmFtIGVsZW1zCisgICAqIEByZXR1cm4KKyAgICovCisgIHZlY3RvcjxzdHJpbmc+JiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0sIHZlY3RvcjxzdHJpbmc+JiBlbGVtcykgeworICAgIHN0cmluZ3N0cmVhbSBzcyhzKTsKKyAgICBzdHJpbmcgaXRlbTsKKworICAgIHdoaWxlIChnZXRsaW5lKHNzLCBpdGVtLCBkZWxpbSkpIHsKKyAgICAgIGVsZW1zLnB1c2hfYmFjayhpdGVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gZWxlbXM7CisgIH0KKworICB2ZWN0b3I8c3RyaW5nPiBzcGxpdChjb25zdCBzdHJpbmcmIHMsIGNoYXIgZGVsaW0pIHsKKyAgICB2ZWN0b3I8c3RyaW5nPiBlbGVtczsKKworICAgIHJldHVybiBzcGxpdChzLCBkZWxpbSwgZWxlbXMpOworICB9CisKKyAgLyoqCisgICAqIENhcGl0YWxpemUgbWV0aG9kCisgICAqIEBwYXJhbSBzdHIKKyAgICogQHJldHVybgorICAgKi8KKyAgc3RyaW5nIGNhcGl0YWxpemUoc3RyaW5nIHN0cikgeworICAgIHN0cmluZzo6aXRlcmF0b3IgaXQoc3RyLmJlZ2luKCkpOworCisgICAgaWYgKGl0ICE9IHN0ci5lbmQoKSkKKyAgICAgIHN0clswXSA9IHRvdXBwZXIoKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKKworICAgIC8vICAgIHdoaWxlKCsraXQgIT0gc3RyLmVuZCgpKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICppdCA9IHRvbG93ZXIoKHVuc2lnbmVkIGNoYXIpKml0KTsKKyAgICAvLyAgICB9CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworICAvKioKKyAgICogR2VuZXJhdGUgcHJvdG9jb2wtaW5kZXBlbmRlbnQgdGVtcGxhdGU/IE9yIEJpbmFyeSBpbmxpbmUgY29kZT8KKyAgICovCisgIGJvb2wgYmluYXJ5X2lubGluZV87CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIGEgUkVTVCBoYW5kbGVyIGNsYXNzCisgICAqLworICBib29sIHJlc3RfOworCisgIC8qKgorICAgKiBHZW5lcmF0ZSBzdHVicyBmb3IgYSBQSFAgc2VydmVyCisgICAqLworICBib29sIHBocHNfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBPT1AgYmFzZSBjbGFzcyBUQmFzZQorICAgKi8KKyAgYm9vbCBvb3BfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG9sZC1zdHlsZSBQSFAgZmlsZSB0byB1c2UgY2xhc3NtYXAgYXV0b2xvYWRpbmcKKyAgICovCisgIGJvb2wgY2xhc3NtYXBfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHZhbGlkYXRvciBjb2RlCisgICAqLworICBib29sIHZhbGlkYXRlXzsKKworICAvKioKKyAgICogV2hldGhlciB0byBnZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMKKyAgICovCisgIGJvb2wganNvbl9zZXJpYWxpemFibGVfOworCisgIC8qKgorICAgKiBHbG9iYWwgbmFtZXNwYWNlIGZvciBQSFAgNS4zCisgICAqLworICBzdGQ6OnN0cmluZyBuc2dsb2JhbF87Cit9OworCitib29sIHRfcGhwX2dlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7CisgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJwYXRoIjsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBDcmVhdGUgUmVhbCBkaXJlY3RvcnkgTmFtZXNwYWNlcworICB2ZWN0b3I8c3RyaW5nPiBOU3ggPSBzcGxpdChwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKSwgJ1xcJyk7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOU3guc2l6ZSgpOyArK2kpIHsKKyAgICBwYWNrYWdlX2Rpcl8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBOU3hbaV0gKyAiLyI7CisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworICB9CisKKyAgLy8gUHJlcGFyZSBvdXRwdXQgZmlsZSBmb3IgYWxsIHRoZSB0eXBlcyBpbiBjbGFzc21hcCBtb2RlCisgIGlmIChjbGFzc21hcF8pIHsKKyAgICAvLyBNYWtlIG91dHB1dCBmaWxlCisgICAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICJUeXBlcy5waHAiOworICAgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfdHlwZXNfKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBwaHAgaW5jbHVkZXMKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cGhwX2luY2x1ZGVzKCkgeworICBzdHJpbmcgaW5jbHVkZXMgPSAidXNlIFRocmlmdFxcQmFzZVxcVEJhc2U7XG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxUeXBlXFxUVHlwZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFR5cGVcXFRNZXNzYWdlVHlwZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEV4Y2VwdGlvbjtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRQcm90b2NvbDtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFByb3RvY29sXFxUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZDtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uO1xuIjsKKworICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgaW5jbHVkZXMgKz0gInVzZSBKc29uU2VyaWFsaXphYmxlO1xuIgorICAgICAgICAgICAgICAgICJ1c2Ugc3RkQ2xhc3M7XG4iOworICB9CisKKyAgcmV0dXJuIGluY2x1ZGVzOworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBpZiAoY2xhc3NtYXBfKSB7CisgICAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICAgIGZfdHlwZXNfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFBIUCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzZXJ2aWNlIGhlYWRlciBjb250YWlucyBuYW1lc3BhY2Ugc3VmZml4IGFuZCBpbmNsdWRlcyBpbnNpZGUgZmlsZSBzcGVjaWZpZWQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRfc2VydmljZSogdHNlcnZpY2UsIHN0ZDo6b3N0cmVhbSYgZmlsZSkgeworICBmaWxlIDw8ICI8P3BocCIgPDwgZW5kbDsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlX3N1ZmZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkuZW1wdHkoKSkgeworICAgIGZpbGUgPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBmaWxlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBocF9pbmNsdWRlcygpOworCisgIGZpbGUgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgcHJvZ3JhbSBoZWFkZXIgY29udGFpbnMgbmFtZXNwYWNlIHN1ZmZpeCBhbmQgaW5jbHVkZXMgaW5zaWRlIGZpbGUgc3BlY2lmaWVkCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihzdGQ6Om9zdHJlYW0mIGZpbGUpIHsKKyAgZmlsZSA8PCAiPD9waHAiIDw8IGVuZGw7CisgIGlmICghcGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSkuZW1wdHkoKSkgeworICAgIGZpbGUgPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICA8PCBlbmRsOworICB9CisgIGZpbGUgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGhwX2luY2x1ZGVzKCk7CisKKyAgZmlsZSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBQSFAsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9lbnVtID0gZl90eXBlc187CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgdGVudW0tPmdldF9uYW1lKCkgKyAiLnBocCI7CisgICAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl9lbnVtKTsKKyAgfQorCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICAvLyBXZSdyZSBhbHNvIGRvaW5nIGl0IHRoaXMgd2F5IHRvIHNlZSBob3cgaXQgcGVyZm9ybXMuIEl0J3MgbW9yZSBsZWdpYmxlCisgIC8vIGNvZGUgYnV0IHlvdSBjYW4ndCBkbyB0aGluZ3MgbGlrZSBhbiAnZXh0cmFjdCcgb24gaXQsIHdoaWNoIGlzIGEgYml0IG9mCisgIC8vIGEgZG93bmVyLgorICBnZW5lcmF0ZV9waHBfZG9jKGZfZW51bSwgdGVudW0pOworICBmX2VudW0gPDwgImZpbmFsIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBnZW5lcmF0ZV9waHBfZG9jKGZfZW51bSwgKmNfaXRlcik7CisgICAgaW5kZW50KGZfZW51bSkgPDwgImNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2VudW0pIDw8ICJzdGF0aWMgcHVibGljICRfX25hbWVzID0gYXJyYXkoIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfZW51bSkgPDwgdmFsdWUgPDwgIiA9PiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZW51bSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfZW51bS5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGUgY29uc3RhbnQgY2xhc3MKKyAqCisgKiBPdmVycmlkZSB0aGUgb25lIGZyb20gdF9nZW5lcmF0b3IKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgLy8gQ3JlYXRlIGNsYXNzIG9ubHkgaWYgbmVlZGVkCisgIGlmIChjb25zdHMuc2l6ZSgpID4gMCkgeworCisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9jb25zdHMgPSBmX3R5cGVzXzsKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiQ29uc3RhbnQucGhwIjsKKyAgICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKyAgICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfY29uc3RzKTsKKyAgICB9CisgICAgZl9jb25zdHMgPDwgImZpbmFsIGNsYXNzIENvbnN0YW50IGV4dGVuZHMgXFxUaHJpZnRcXFR5cGVcXFRDb25zdGFudCI8PCBlbmRsCisgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIENyZWF0ZSBzdGF0aWMgcHJvcGVydHkKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAgIGluZGVudChmX2NvbnN0cykgPDwgInN0YXRpYyBwcm90ZWN0ZWQgJCIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgaW5pdCBmdW5jdGlvbgorICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgZl9jb25zdHMgPDwgZW5kbDsKKworICAgICAgZl9jb25zdHMgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaW5pdF8iIDw8IG5hbWUgPDwgIigpIiA8PGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGluZGVudChmX2NvbnN0cykgPDwgInJldHVybiAiOworICAgICAgZ2VuZXJhdGVfcGhwX2RvYyhmX2NvbnN0cywgKmNfaXRlcik7CisgICAgICBmX2NvbnN0cyA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIGZfY29uc3RzIDw8ICI7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfY29uc3RzIDw8ICJ9IiA8PCBlbmRsOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBmX2NvbnN0cy5jbG9zZSgpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAibmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPT4gIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBvdXQgPDwgIiA9PiB0cnVlIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSI7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBNYWtlIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3BocF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0ID0gZl90eXBlc187CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIi5waHAiOworICAgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihmX3N0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc3RydWN0LmNsb3NlKCk7CisgIH0KK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF90eXBlX3NwZWMob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHQpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisgIGluZGVudChvdXQpIDw8ICIndHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0odCkgPDwgIiwiIDw8IGVuZGw7CisKKyAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSkgeworICAgIC8vIE5vb3AsIHR5cGUgaXMgYWxsIHdlIG5lZWQKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIidjbGFzcycgPT4gJyIgPDwgcGhwX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpIDw8ICInLCIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIGluZGVudChvdXQpIDw8ICIna3R5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiJ3Z0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIidrZXknID0+IGFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwga3R5cGUpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIndmFsJyA9PiBhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHZ0eXBlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkgfHwgdC0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIidldHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oZXR5cGUpIDw8ICIsIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICInZWxlbScgPT4gYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCBldHlwZSk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyB0eXBlIGZvciBwaHAgc3RydWN0IHNwZWMgZmllbGQiOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoIGZ1bGx5IHF1YWxpZmllcyBlbm91Z2gKKyAqIHR5cGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhbGl6ZSBzZXJpYWxpemF0aW9uIHJvdXRpbmVzLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBwdWJsaWMgJF9UU1BFQyA9IGFycmF5KCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpbmRlbnQob3V0KSA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiID0+IGFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIid2YXInID0+ICciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICInaXNSZXF1aXJlZCcgPT4gIiA8PCAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIsIiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCB0KTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQSFAKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGdlbmVyYXRlX3BocF9kb2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICJjbGFzcyAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHN0cnVjdCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiBleHRlbmRzICIKKyAgICAgICAgPDwgIlRFeGNlcHRpb24iOworICB9IGVsc2UgaWYgKG9vcF8pIHsKKyAgICBvdXQgPDwgIiBleHRlbmRzICIKKyAgICAgICAgPDwgIlRCYXNlIjsKKyAgfQorICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgb3V0IDw8ICIgaW1wbGVtZW50cyBKc29uU2VyaWFsaXphYmxlIjsKKyAgfQorICBvdXQgPDwgZW5kbAorICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAic3RhdGljIHB1YmxpYyAkaXNWYWxpZGF0ZSA9ICIgPDwgKHZhbGlkYXRlXyA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG91dCwgdHN0cnVjdCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHN0cmluZyBkdmFsID0gIm51bGwiOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfcGhwX2RvYyhvdXQsICptX2l0ZXIpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgJCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5CisgIHN0cmluZyBwYXJhbSA9IChtZW1iZXJzLnNpemUoKSA+IDApID8gIiR2YWxzID0gbnVsbCIgOiAiIjsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoIiA8PCBwYXJhbSA8PCAiKSI8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpc19hcnJheSgkdmFscykpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKG9vcF8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicGFyZW50OjpfX2NvbnN0cnVjdChzZWxmOjokX1RTUEVDLCAkdmFscyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlzc2V0KCR2YWxzWyciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ10pKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJHZhbHNbJyIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ107IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKGpzb25fc2VyaWFsaXphYmxlXykgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoJGlucHV0KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAob29wXykgeworICAgIGlmIChuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR0bXAgPSAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JSZWFkKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdG1wOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3JlYWQoJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJywgc2VsZjo6JF9UU1BFQywgJGlucHV0KTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZmlkID0gMDsiIDw8IGVuZGw7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICB0X2ZpZWxkIGZmdHlwZShnX3R5cGVfaTgsICJmdHlwZSIpOworICAgIHRfZmllbGQgZmZpZChnX3R5cGVfaTE2LCAiZmlkIik7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZ0eXBlKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkZnR5cGUgPT0gIgorICAgICAgICA8PCAiVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZmaWQpOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsiIDw8IGVuZGw7CisgICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIKKyAgICAgICAgICAgICAgICA8PCAiVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoJGZpZCkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSBUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICIKKyAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JSZWFkKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgmJG91dHB1dCkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+X3ZhbGlkYXRlRm9yV3JpdGUoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAob29wXykgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRoaXMtPl93cml0ZSgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyID0gMDsiIDw8IGVuZGw7CisKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoJHRoaXMtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgc3RyaW5nIGV4cGVjdDsKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGV4cGVjdCA9ICJhcnJheSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZXhwZWN0ID0gIm9iamVjdCI7CisgICAgfQorICAgIGlmICghZXhwZWN0LmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc18iIDw8IGV4cGVjdCA8PCAiKCR0aGlzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSkgeyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyAiCisgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHR5cGUgaW4gc3RydWN0dXJlLicsICIKKyAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKTsiCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiCisgICAgICAgIDw8ICJUVHlwZTo6U1RPUCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QsICJfdmFsaWRhdGVGb3JSZWFkIiwgZmFsc2UpOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QsICJfdmFsaWRhdGVGb3JXcml0ZSIsIHRydWUpOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IG1ldGhvZF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQKKyAgICAgICAgICB8fCAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUICYmIHdyaXRlX21vZGUpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJHRoaXMtPiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9PT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdSZXF1aXJlZCBmaWVsZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJyk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JXcml0ZSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICIkanNvbiA9IG5ldyBzdGRDbGFzczsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgICBjb25zdCBzdHJpbmcmIG5hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICBpZiAoIShrZXlfdHlwZS0+aXNfYmFzZV90eXBlKCkgfHwga2V5X3R5cGUtPmlzX2VudW0oKSkpIHsKKyAgICAgICAgICAvLyBKU09OIG9iamVjdCBrZXlzIG11c3QgYmUgc3RyaW5ncy4gUEhQJ3MganNvbl9lbmNvZGUoKQorICAgICAgICAgIC8vIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhbnkgc2NhbGFyIGtleSB0byBzdHJpbmdzLCBidXQKKyAgICAgICAgICAvLyB3ZSBza2lwIHRocmlmdCBtYXBzIHdpdGggbm9uLXNjYWxhciBrZXlzLgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCR0aGlzLT4iIDw8IG5hbWUgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIiRqc29uLT4iIDw8IG5hbWUgPDwgIiA9ICI7CisgICAgICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgb3V0IDw8ICIob2JqZWN0KSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdHlwZV90b19jYXN0KHR5cGUpOworICAgICAgfQorICAgICAgb3V0IDw8ICIkdGhpcy0+IiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJGpzb247IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCitpbnQgdF9waHBfZ2VuZXJhdG9yOjpnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHMoY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLCBib29sIHdyaXRlX21vZGUpIHsKKyAgaW50IG51bV9yZXEgPSAwOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQKKyAgICAgICAgICB8fCAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCAmJiB3cml0ZV9tb2RlKSkgeworICAgICAgICArK251bV9yZXE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBudW1fcmVxOworfQorCitib29sIHRfcGhwX2dlbmVyYXRvcjo6bmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKKyAgcmV0dXJuICh2YWxpZGF0ZV8gJiYgIWlzX3Jlc3VsdCAmJiAhdHN0cnVjdC0+aXNfdW5pb24oKQorICAgICAgICAgICYmIGdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0cnVlKSA+IDApOworfQorCitib29sIHRfcGhwX2dlbmVyYXRvcjo6bmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgeworICByZXR1cm4gKHZhbGlkYXRlXyAmJiAhaXNfcmVzdWx0CisgICAgICAgICAgJiYgKGdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0LT5nZXRfbWVtYmVycygpLCBmYWxzZSkgPiAwKSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZihjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIi5waHAiOworICAgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlXyk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQorICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGlmIChyZXN0XykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7CisgIH0KKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBpZiAocGhwc18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisgIH0KKworICBpZihjbGFzc21hcF8pIHsKKyAgICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfcHJvY2Vzc29yID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IucGhwIjsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yLm9wZW4oZl9zZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3NlcnZpY2VfcHJvY2Vzc29yKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGhhbmRsZXJfID0gbnVsbDsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhhbmRsZXIpIjw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5oYW5kbGVyXyA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KCRoYW5kbGVyKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcygkaW5wdXQsICRvdXRwdXQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKKyAgICB0X2ZpZWxkIGZtdHlwZShnX3R5cGVfaTgsICJtdHlwZSIpOworICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfcHJvY2Vzc29yLCAmZmZuYW1lLCAiIiwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX3Byb2Nlc3NvciwgJmZtdHlwZSwgIiIsIHRydWUpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9wcm9jZXNzb3IsICZmc2VxaWQsICIiLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEhPVDogY2hlY2sgZm9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIkbWV0aG9kbmFtZSA9ICdwcm9jZXNzXycuJGZuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIW1ldGhvZF9leGlzdHMoJHRoaXMsICRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFxcRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnNraXAoIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICAkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm47IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKGZfc2VydmljZV9wcm9jZXNzb3IsIHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgIn0iIDw8IGVuZGw7CisKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCRzZXFpZCwgJGlucHV0LCAkb3V0cHV0KSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCRpbnB1dCBpbnN0YW5jZW9mICIKKyAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4nKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJncyA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luKCIgPDxlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRpbnB1dCwiPDxlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgYXJnc25hbWUgPDwgIicsIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5pc1N0cmljdFJlYWQoKSIgPDxlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCisgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgb3V0IDw8ICIkcmVzdWx0LT5zdWNjZXNzID0gIjsKKyAgfQorICBvdXQgPDwgIiR0aGlzLT5oYW5kbGVyXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgICBvdXQgPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoIgorICAgICAgICAgICAgICAgICA8PCBwaHBfbmFtZXNwYWNlKGdldF90cnVlX3R5cGUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgJCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICQiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkb3V0cHV0IGluc3RhbmNlb2YgIgorICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LCI8PGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk8PCAiJywiIDw8ZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksIjw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRzZXFpZCwiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT5pc1N0cmljdFdyaXRlKCkiPDxlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgIgorICAgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSkpOyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIKKyAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSAnIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHNlcWlkKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmZsdXNoKCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCAiCisgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJG91dHB1dCk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0X2RlZmluaXRpb24gPSBmX3NlcnZpY2VfOworICBpZiAoY2xhc3NtYXBfKSB7CisgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbiA8PCAiLy8gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKKyAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOworCisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIHN0cmluZyBmX3N0cnVjdF9kZWZpbml0aW9uX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSArICIucGhwIjsKKyAgICAgIGZfc3RydWN0X2RlZmluaXRpb24ub3BlbihmX3N0cnVjdF9kZWZpbml0aW9uX25hbWUuY19zdHIoKSk7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zdHJ1Y3RfZGVmaW5pdGlvbik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0X2RlZmluaXRpb24sIHRzKTsKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbi5jbG9zZSgpOworICAgIH0KKworICAgIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0X2hlbHBlciA9IGZfc2VydmljZV87CisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIHN0cmluZyBmX3N0cnVjdF9oZWxwZXJfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHJlc3VsdC5nZXRfbmFtZSgpICsgIi5waHAiOworICAgICAgZl9zdHJ1Y3RfaGVscGVyLm9wZW4oZl9zdHJ1Y3RfaGVscGVyX25hbWUuY19zdHIoKSk7CisgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zdHJ1Y3RfaGVscGVyKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0X2hlbHBlciwgJnJlc3VsdCwgZmFsc2UsIHRydWUpOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBmX3N0cnVjdF9oZWxwZXIuY2xvc2UoKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfaW50ZXJmYWNlID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICJJZi5waHAiOworICAgIGZfc2VydmljZV9pbnRlcmZhY2Uub3BlbihmX3NlcnZpY2VfaW50ZXJmYWNlX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9pbnRlcmZhY2UpOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiSWYiOworICB9CisgIGdlbmVyYXRlX3BocF9kb2MoZl9zZXJ2aWNlX2ludGVyZmFjZSwgdHNlcnZpY2UpOworICBmX3NlcnZpY2VfaW50ZXJmYWNlIDw8ICJpbnRlcmZhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX2RlY2xhcmF0aW9uKHRzZXJ2aWNlKSA8PCAiSWYiIDw8IGV4dGVuZHNfaWYgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9waHBfZG9jKGZfc2VydmljZV9pbnRlcmZhY2UsICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfaW50ZXJmYWNlKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9pbnRlcmZhY2UgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBpbnRlcmZhY2UgZmlsZQorICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9pbnRlcmZhY2UuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfcmVzdCA9IGZfc2VydmljZV87CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfc2VydmljZV9yZXN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIlJlc3QucGhwIjsKKyAgICBmX3NlcnZpY2VfcmVzdC5vcGVuKGZfc2VydmljZV9yZXN0X25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9yZXN0KTsKKyAgfQorCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgICBleHRlbmRzX2lmID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpICsgIlJlc3QiOworICB9CisgIGZfc2VydmljZV9yZXN0IDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3QiIDw8IGV4dGVuZHNfaWYgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGltcGxfOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW1wbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICR0aGlzLT5pbXBsXyA9ICRpbXBsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfcmVzdCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCRyZXF1ZXN0KSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBzdHJpbmcgY2FzdCA9IHR5cGVfdG9fY2FzdChhdHlwZSk7CisgICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0WyciICsgKCphX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiddIjsKKyAgICAgIGlmIChhdHlwZS0+aXNfYm9vbCgpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgY2FzdCA8PCAiKCFlbXB0eSgiIDw8IHJlcQorICAgICAgICAgICAgICAgICAgIDw8ICIpICYmICgiIDw8IHJlcSA8PCAiICE9PSAnZmFsc2UnKSk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gaXNzZXQoIiA8PCByZXEgPDwgIikgPyAiCisgICAgICAgICAgICAgICAgICAgPDwgY2FzdCA8PCByZXEgPDwgIiA6IG51bGw7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKilhdHlwZSktPmlzX3N0cmluZ19saXN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXhwbG9kZSgnLCcsICQiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19tYXAoKSB8fCBhdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGpzb25fZGVjb2RlKCQiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcnJheV9maWxsX2tleXMoanNvbl9kZWNvZGUoJCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpLCAxKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zdHJ1Y3QoKSB8fCBhdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiaWYgKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGhwX25hbWVzcGFjZShhdHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgYXR5cGUtPmdldF9uYW1lKCkgPDwgIihqc29uX2RlY29kZSgkIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgInJldHVybiAkdGhpcy0+aW1wbF8tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGZhbHNlKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX3Jlc3QpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Jlc3QgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIHJlc3QgZmlsZQorICBmX3NlcnZpY2VfcmVzdCA8PCBlbmRsOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9yZXN0LmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9jbGllbnQgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfY2xpZW50X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIkNsaWVudC5waHAiOworICAgIGZfc2VydmljZV9jbGllbnQub3BlbihmX3NlcnZpY2VfY2xpZW50X25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9jbGllbnQpOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgICAgICsgIkNsaWVudCI7CisgIH0KKworICBmX3NlcnZpY2VfY2xpZW50IDw8ICJjbGFzcyAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCJ7Ijw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFByaXZhdGUgbWVtYmVycworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRpbnB1dF8gPSBudWxsOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCAkb3V0cHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRzZXFpZF8gPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCA9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicGFyZW50OjpfX2NvbnN0cnVjdCgkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfID0gJGlucHV0OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfID0gJG91dHB1dCA/ICRvdXRwdXQgOiAkaW5wdXQ7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGw7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV9jbGllbnQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfY2xpZW50KTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgIiR0aGlzLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCAiJHRoaXMtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV9jbGllbnQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYXJncy0+IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+b3V0cHV0XyBpbnN0YW5jZW9mICIKKyAgICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlOjpDQUxMIjsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoIiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgbWVzc2FnZVR5cGUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkYXJncywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+c2VxaWRfLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT5pc1N0cmljdFdyaXRlKCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgIiA8PCBtZXNzYWdlVHlwZSA8PCAiKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgc3RybGVuKCciIDw8IGZ1bm5hbWUgPDwgIicpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49ICciIDw8IGZ1bm5hbWUgPDwgIic7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsICR0aGlzLT5zZXFpZF8pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCR0aGlzLT5vdXRwdXRfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfY2xpZW50KTsKKworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfY2xpZW50KTsKKworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+aW5wdXRfIGluc3RhbmNlb2YgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5Jyk7IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcmVzdWx0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgcmVzdWx0bmFtZSA8PCAiJywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPmlzU3RyaWN0UmVhZCgpIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7CisgICAgICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHZlciA9IHVucGFjaygnTicsICR0aGlzLT5pbnB1dF8tPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdmVyID0gJHZlclsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRtdHlwZSA9ICR2ZXIgJiAweGZmOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkdmVyID0gJHZlciAmIDB4ZmZmZjAwMDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImlmICgkdmVyICE9IDB4ODAwMTAwMDApIHRocm93IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kdmVyLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOyIgPDwgZW5kbDsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX2NsaWVudCwgJmZmbmFtZSwgIiIsIHRydWUpOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfY2xpZW50LCAmZnNlcWlkLCAiIiwgdHJ1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR4LT5yZWFkKCR0aGlzLT5pbnB1dF8pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJvdyAkeDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsOworCisgICAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJpZiAoJHJlc3VsdC0+c3VjY2VzcyAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICRyZXN1bHQtPnN1Y2Nlc3M7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ0aHJvdyAkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgXFxFeGNlcHRpb24oXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9jbGllbnQgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBjbGllbnQgZmlsZQorICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9jbGllbnQuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgeworCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaXRyYW5zID0gKGluY2xhc3MgPyAiJHRoaXMtPmlucHV0XyIgOiAiJGlucHV0Iik7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGxlbiA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbGVuID0gJGxlblsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkbGVuID4gMHg3ZmZmZmZmZikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgkbGVuKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gdW5wYWNrKCdjJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgxKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IChib29sKSQiIDw8IG5hbWUgPDwgIlsxXTsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCduJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgyKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmYpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmZmZmZikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnTjInLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgJGFyclsxXSA9ICRhcnJbMV0gXiAweEZGRkZGRkZGOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICIgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhGRkZGRkZGRjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgPSAwIC0gJGFyclsxXSo0Mjk0OTY3Mjk2IC0gJGFyclsyXSAtIDE7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICQiIDw8IG5hbWUgPDwgIiA9ICRhcnJbMV0qNDI5NDk2NzI5NiArICRhcnJbMl07IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnZCcsIHN0cnJldigiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICRhcnJbMV07IiA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKQorICAgICAgICAgICAgICAgICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ04nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmZmZmZmKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICR2YWw7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworCisgICAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPiI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXgKKyAgICAgIDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOworICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOworICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOworICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOworCisgIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7CisgIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9pOCwga3R5cGUpOworICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfaTgsIHZ0eXBlKTsKKyAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2k4LCBldHlwZSk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IGFycmF5KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBzaXplIDw8ICIgPSAwOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgdnR5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsOworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmt0eXBlKTsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2dHlwZSk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIgorICAgICAgICAgIDw8ICIkIiA8PCBrdHlwZSA8PCAiLCAkIiA8PCB2dHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiCisgICAgICAgICAgPDwgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0QmVnaW4oIgorICAgICAgICAgIDw8ICIkIiA8PCBldHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yICgkIiA8PCBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGtleSA8PCAiXSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICIkIiA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgIGlmKHBocF9pc19zY2FsYXIoZWxlbV90eXBlKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBlbGVtIDw8ICJdID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiW10gPSAkIiA8PCBlbGVtIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgW109ICQiIDw8IGVsZW0gPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgc3RybGVuKCQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiJG91dHB1dCAuPSAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIgPyAxIDogMCk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCduJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOMicsICQiIDw8IG5hbWUgPDwgIiA+PiAzMiwgJCIgPDwgbmFtZQorICAgICAgICAgICAgICA8PCAiICYgMHhGRkZGRkZGRik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2QnLCAkIiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTicsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT4iOworCisgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiCisgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IgorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnbCcsIGNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSkpOyIKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICIKKyAgICAgICAgICAgICAgICA8PCAiJCIgPDwga2l0ZXIgPDwgIiA9PiAkIiA8PCB2aXRlciA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgc3RyaW5nIGl0ZXJfdmFsID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIiA9PiAkIiA8PCBpdGVyX3ZhbCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZihwaHBfaXNfc2NhbGFyKGVsZW1fdHlwZSkpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyX3ZhbCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgdGhlIGdpdmVuIGNvbnRlbnRzCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOworfQorCisvKioKKyAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciBhIGZpZWxkCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgc3RyaW5nc3RyZWFtIHNzOworCisgIC8vIHByZXBlbmQgZnJlZS1zdHlsZSBkb2MgaWYgYXZhaWxhYmxlCisgIGlmIChmaWVsZC0+aGFzX2RvYygpKSB7CisgICAgc3MgPDwgZmllbGQtPmdldF9kb2MoKSA8PCBlbmRsOworICB9CisKKyAgLy8gYXBwZW5kIEB2YXIgdGFnCisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICBzcyA8PCAiQHZhciAiIDw8IHR5cGVfdG9fcGhwZG9jKHR5cGUpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50KG91dCwgc3Muc3RyKCkpOworfQorCisvKioKKyAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgZm9yIGEgZnVuY3Rpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmdzdHJlYW0gc3M7CisgIGlmIChmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3MgPDwgZnVuY3Rpb24tPmdldF9kb2MoKSA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgcGFyYW1ldGVyIHR5cGVzIGRvYworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKyAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgIHRfZmllbGQqIGFyZyA9ICphX2l0ZXI7CisgICAgc3MgPDwgIkBwYXJhbSAiIDw8IHR5cGVfdG9fcGhwZG9jKGFyZy0+Z2V0X3R5cGUoKSkgPDwgIiAkIiA8PCBhcmctPmdldF9uYW1lKCk7CisgICAgaWYgKGFyZy0+aGFzX2RvYygpKSB7CisgICAgICBzcyA8PCAiICIgPDwgYXJnLT5nZXRfZG9jKCk7CisgICAgfQorICAgIHNzIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSByZXR1cm4gdHlwZSBkb2MKKyAgdF90eXBlKiByZXRfdHlwZSA9IGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBpZiAoIXJldF90eXBlLT5pc192b2lkKCkgfHwgcmV0X3R5cGUtPmhhc19kb2MoKSkgeworICAgIHNzIDw8ICJAcmV0dXJuICIgPDwgdHlwZV90b19waHBkb2MocmV0X3R5cGUpOworICAgIGlmIChyZXRfdHlwZS0+aGFzX2RvYygpKSB7CisgICAgICBzcyA8PCAiICIgPDwgcmV0X3R5cGUtPmdldF9kb2MoKTsKKyAgICB9CisgICAgc3MgPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIGV4Y2VwdGlvbnMgZG9jCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y3MgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7CisgIGZvciAoZV9pdGVyID0gZXhjcy5iZWdpbigpOyBlX2l0ZXIgIT0gZXhjcy5lbmQoKTsgKytlX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBleGMgPSAqZV9pdGVyOworICAgIHNzIDw8ICJAdGhyb3dzICIgPDwgdHlwZV90b19waHBkb2MoZXhjLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoZXhjLT5oYXNfZG9jKCkpIHsKKyAgICAgIHNzIDw8ICIgIiA8PCBleGMtPmdldF9kb2MoKTsKKyAgICB9CisgICAgc3MgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7CisgIHN0cmluZyByZXN1bHQgPSAiJCIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9ICcnIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBpbml0aWFsaXplciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gYXJyYXkoKSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICIoKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICByZXR1cm4gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYWRkVHlwZUhpbnRzKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorCisgICAgdF90eXBlKiB0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworCisgICAgLy8gU2V0IHR5cGUgbmFtZQorICAgIGlmIChhZGRUeXBlSGludHMpIHsKKyAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBzdHJpbmcgY2xhc3NOYW1lID0gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwaHBfbmFtZXNwYWNlX2RpcmVjdG9yeSgiRGVmaW5pdGlvbiIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc2lmeSh0eXBlLT5nZXRfbmFtZSgpKTsKKworICAgICAgICByZXN1bHQgKz0gY2xhc3NOYW1lICsgIiAiOworICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICByZXN1bHQgKz0gImFycmF5ICI7CisgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEdldHMgYSB0eXBlY2FzdCBzdHJpbmcgZm9yIGEgcGFydGljdWxhciB0eXBlLgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2Nhc3QodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiBidHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKKyAgICBzd2l0Y2ggKGJ0eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICIoYm9vbCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIihpbnQpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiKGRvdWJsZSkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICIoc3RyaW5nKSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoaW50KSI7CisgIH0KKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGU6OkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZTo6RE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6U1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGU6Ok1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGU6OkxTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQSFBEb2Mgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19waHBkb2ModF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImludCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaW50IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJhcnJheSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9IHN0YXRpY19jYXN0PHRfc2V0Kj4odHlwZSk7CisgICAgdF90eXBlKiB0X2VsZW0gPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgICAgaWYgKHRfZWxlbS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX3BocGRvYyh0X2VsZW0pICsgIilbXSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0eXBlX3RvX3BocGRvYyh0X2VsZW0pICsgIltdIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9IHN0YXRpY19jYXN0PHRfbGlzdCo+KHR5cGUpOworICAgIHRfdHlwZSogdF9lbGVtID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAodF9lbGVtLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiKVtdIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiW10iOworICAgIH0KKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBwaHAsCisgICAgIlBIUCIsCisgICAgIiAgICBpbmxpbmVkOiAgICAgICAgIEdlbmVyYXRlIFBIUCBpbmxpbmVkIGZpbGVzXG4iCisgICAgIiAgICBzZXJ2ZXI6ICAgICAgICAgIEdlbmVyYXRlIFBIUCBzZXJ2ZXIgc3R1YnNcbiIKKyAgICAiICAgIG9vcDogICAgICAgICAgICAgR2VuZXJhdGUgUEhQIHdpdGggb2JqZWN0IG9yaWVudGVkIHN1YmNsYXNzZXNcbiIKKyAgICAiICAgIGNsYXNzbWFwOiAgICAgICAgR2VuZXJhdGUgb2xkLXN0eWxlIFBIUCBmaWxlcyAodXNlIGNsYXNzbWFwIGF1dG9sb2FkaW5nKVxuIgorICAgICIgICAgcmVzdDogICAgICAgICAgICBHZW5lcmF0ZSBQSFAgUkVTVCBwcm9jZXNzb3JzXG4iCisgICAgIiAgICBuc2dsb2JhbD1OQU1FOiAgIFNldCBnbG9iYWwgbmFtZXNwYWNlXG4iCisgICAgIiAgICB2YWxpZGF0ZTogICAgICAgIEdlbmVyYXRlIFBIUCB2YWxpZGF0b3IgbWV0aG9kc1xuIgorICAgICIgICAganNvbjogICAgICAgICAgICBHZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMgKHJlcXVpcmVzIFBIUCA+PSA1LjQpXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDYyMDdhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogUHl0aG9uIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9weV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3B5X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yIChwcm9ncmFtKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGdlbl9uZXdzdHlsZV8gPSB0cnVlOworICAgIGdlbl91dGY4c3RyaW5nc18gPSB0cnVlOworICAgIGdlbl9keW5iYXNlXyA9IGZhbHNlOworICAgIGdlbl9zbG90c18gPSBmYWxzZTsKKyAgICBnZW5fdG9ybmFkb18gPSBmYWxzZTsKKyAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gZmFsc2U7CisgICAgZ2VuX3R3aXN0ZWRfID0gZmFsc2U7CisgICAgZ2VuX2R5bmFtaWNfID0gZmFsc2U7CisgICAgY29kaW5nXyA9ICIiOworICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fID0gIiI7CisgICAgaW1wb3J0X2R5bmJhc2VfID0gIiI7CisgICAgcGFja2FnZV9wcmVmaXhfID0gIiI7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmV3X3N0eWxlIikgPT0gMCkgeworICAgICAgICBwd2FybmluZygwLCAibmV3X3N0eWxlIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhlIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLlxuIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9sZF9zdHlsZSIpID09IDApIHsKKyAgICAgICAgZ2VuX25ld3N0eWxlXyA9IGZhbHNlOworICAgICAgICBwd2FybmluZygwLCAib2xkX3N0eWxlIGlzIGRlcHJlY2F0ZWQgYW5kIG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4iKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidXRmOHN0cmluZ3MiKSA9PSAwKSB7CisgICAgICAgIHB3YXJuaW5nKDAsICJ1dGY4c3RyaW5ncyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIHNvIHRoZSBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZS5cbiIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub191dGY4c3RyaW5ncyIpID09IDApIHsKKyAgICAgICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzbG90cyIpID09IDApIHsKKyAgICAgICAgZ2VuX3Nsb3RzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBhY2thZ2VfcHJlZml4IikgPT0gMCkgeworICAgICAgICBwYWNrYWdlX3ByZWZpeF8gPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmFtaWMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9keW5hbWljXyA9IHRydWU7CisgICAgICAgIGdlbl9uZXdzdHlsZV8gPSBmYWxzZTsgLy8gZHluYW1pYyBpcyBuZXdzdHlsZQorICAgICAgICBpZiggZ2VuX2R5bmJhc2VjbGFzc18uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIlRCYXNlIjsKKyAgICAgICAgfQorICAgICAgICBpZiggZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fLmVtcHR5KCkpIHsKKyAgICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAiVEZyb3plbkJhc2UiOworICAgICAgICB9CisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzX2V4Y18uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfZXhjXyA9ICJURXhjZXB0aW9uQmFzZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGltcG9ydF9keW5iYXNlXy5lbXB0eSgpKSB7CisgICAgICAgICAgaW1wb3J0X2R5bmJhc2VfID0gImZyb20gdGhyaWZ0LnByb3RvY29sLlRCYXNlIGltcG9ydCBUQmFzZSwgVEZyb3plbkJhc2UsIFRFeGNlcHRpb25CYXNlLCBUVHJhbnNwb3J0XG4iOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmJhc2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl9keW5iYXNlXyA9IHRydWU7CisgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmZyb3plbiIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmV4YyIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImR5bmltcG9ydCIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VfID0gdHJ1ZTsKKyAgICAgICAgaW1wb3J0X2R5bmJhc2VfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInpvcGUuaW50ZXJmYWNlIikgPT0gMCkgeworICAgICAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidHdpc3RlZCIpID09IDApIHsKKyAgICAgICAgZ2VuX3R3aXN0ZWRfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX3pvcGVfaW50ZXJmYWNlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRvcm5hZG8iKSA9PSAwKSB7CisgICAgICAgIGdlbl90b3JuYWRvXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvZGluZyIpID09IDApIHsKKyAgICAgICAgY29kaW5nXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBweToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl90d2lzdGVkXyAmJiBnZW5fdG9ybmFkb18pIHsKKyAgICAgIHRocm93ICJhdCBtb3N0IG9uZSBvZiAndHdpc3RlZCcgYW5kICd0b3JuYWRvJyBhcmUgYWxsb3dlZCI7CisgICAgfQorCisgICAgY29weV9vcHRpb25zXyA9IG9wdGlvbl9zdHJpbmc7CisKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50d2lzdGVkIjsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudG9ybmFkbyI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuICIgICAgIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBweV9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgcHlfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW50ZXJmYWNlID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcHJlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBvc3QgPSBOVUxMKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKKworICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAidHdpc3RlZCI7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfcHlfbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSwgYm9vbCBnZW5fdHdpc3RlZCwgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXI9IiIpIHsKKyAgICBpZiAoZ2VuX3R3aXN0ZWQpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHR3aXN0ZWRfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkudHdpc3RlZCIpOworICAgICAgaWYgKCF0d2lzdGVkX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0d2lzdGVkX21vZHVsZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoInB5Iik7CisgICAgaWYgKHJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZV9kaXIgKyByZWFsX21vZHVsZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzX2ltbXV0YWJsZSh0X3R5cGUqIHR0eXBlKSB7CisgICAgcmV0dXJuIHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgicHl0aG9uLmltbXV0YWJsZSIpICE9IHR0eXBlLT5hbm5vdGF0aW9uc18uZW5kKCk7CisgIH0KKworcHJpdmF0ZToKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbmV3LXN0eWxlIGNsYXNzZXMuCisgICAqLworICBib29sIGdlbl9uZXdzdHlsZV87CisKKyAgLyoqCisgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgZHluYW1pYyBzdHlsZSBjbGFzc2VzLgorICAqLworICBib29sIGdlbl9keW5hbWljXzsKKworICBib29sIGdlbl9keW5iYXNlXzsKKyAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc187CisgIHN0ZDo6c3RyaW5nIGdlbl9keW5iYXNlY2xhc3NfZnJvemVuXzsKKyAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc19leGNfOworCisgIHN0ZDo6c3RyaW5nIGltcG9ydF9keW5iYXNlXzsKKworICBib29sIGdlbl9zbG90c187CisKKyAgc3RkOjpzdHJpbmcgY29weV9vcHRpb25zXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggem9wZS5pbnRlcmZhY2UuCisgICAqLworICBib29sIGdlbl96b3BlX2ludGVyZmFjZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgorICAgKi8KKyAgYm9vbCBnZW5fdHdpc3RlZF87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGNvZGUgZm9yIHVzZSB3aXRoIFRvcm5hZG8KKyAgICovCisgIGJvb2wgZ2VuX3Rvcm5hZG9fOworCisgIC8qKgorICAgKiBUcnVlIGlmIHN0cmluZ3Mgc2hvdWxkIGJlIGVuY29kZWQgdXNpbmcgdXRmLTguCisgICAqLworICBib29sIGdlbl91dGY4c3RyaW5nc187CisKKyAgLyoqCisgICAqIHNwZWNpZnkgZ2VuZXJhdGVkIGZpbGUgZW5jb2RpbmcKKyAgICogZWcuICMgLSotIGNvZGluZzogdXRmLTggLSotCisgICAqLworICBzdHJpbmcgY29kaW5nXzsKKworICBzdHJpbmcgcGFja2FnZV9wcmVmaXhfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisgIHN0ZDo6c3RyaW5nIG1vZHVsZV87CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGFuZ19rZXl3b3JkcygpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBrZXl3b3Jkc1tdID0geyAiRmFsc2UiLCAiTm9uZSIsICJUcnVlIiwgImFuZCIsICJhcyIsICJhc3NlcnQiLCAiYnJlYWsiLCAiY2xhc3MiLAorICAgICAgICAgICJjb250aW51ZSIsICJkZWYiLCAiZGVsIiwgImVsaWYiLCAiZWxzZSIsICJleGNlcHQiLCAiZXhlYyIsICJmaW5hbGx5IiwgImZvciIsICJmcm9tIiwKKyAgICAgICAgICAiZ2xvYmFsIiwgImlmIiwgImltcG9ydCIsICJpbiIsICJpcyIsICJsYW1iZGEiLCAibm9ubG9jYWwiLCAibm90IiwgIm9yIiwgInBhc3MiLCAicHJpbnQiLAorICAgICAgICAgICJyYWlzZSIsICJyZXR1cm4iLCAidHJ5IiwgIndoaWxlIiwgIndpdGgiLCAieWllbGQiIH07CisgICAgcmV0dXJuIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPihrZXl3b3Jkcywga2V5d29yZHMgKyBzaXplb2Yoa2V5d29yZHMpL3NpemVvZihrZXl3b3Jkc1swXSkgKTsKKyAgfQorfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW1fLCBnZW5fdHdpc3RlZF8pOworICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOworICBtb2R1bGVfID0gbW9kdWxlOworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgorICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKKyAgICBzdGQ6Om9mc3RyZWFtIGluaXRfcHkoKHBhY2thZ2VfZGlyXyArICIvX19pbml0X18ucHkiKS5jX3N0cigpLCBzdGQ6Omlvc19iYXNlOjphcHApOworICAgIGluaXRfcHkuY2xvc2UoKTsKKyAgICBpZiAobW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBtb2R1bGUuZmluZCgnLicpOworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZTsKKyAgICAgIG1vZHVsZS5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOworICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKKyAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MgKyAxKTsKKyAgICB9CisgIH0KKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAidHR5cGVzLnB5IjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAiY29uc3RhbnRzLnB5IjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9pbml0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiL19faW5pdF9fLnB5IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2luaXQ7CisgIGZfaW5pdC5vcGVuKGZfaW5pdF9uYW1lLmNfc3RyKCkpOworICBmX2luaXQgPDwgIl9fYWxsX18gPSBbJ3R0eXBlcycsICdjb25zdGFudHMnIjsKKyAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIGZfaW5pdCA8PCAiLCAnIiA8PCAoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIjsKKyAgfQorICBmX2luaXQgPDwgIl0iIDw8IGVuZGw7CisgIGZfaW5pdC5jbG9zZSgpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsCisgICAgICAgICAgIDw8IHB5X2ltcG9ydHMoKSA8PCBlbmRsCisgICAgICAgICAgIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbXBvcnRfZHluYmFzZV87CisKKyAgZl90eXBlc18gPDwgImFsbF9zdHJ1Y3RzID0gW10iIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfIDw8CisgICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAorICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsIDw8CisgICAgImZyb20gLnR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICByZXN1bHQgKz0gImltcG9ydCAiICsgZ2V0X3JlYWxfcHlfbW9kdWxlKGluY2x1ZGVzW2ldLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLnR0eXBlc1xuIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cHlfYXV0b2dlbl9jb21tZW50KCkgeworICBzdHJpbmcgY29kaW5nOworICBpZiAoIWNvZGluZ18uZW1wdHkoKSkgeworICAgICAgY29kaW5nID0gIiMgLSotIGNvZGluZzogIiArIGNvZGluZ18gKyAiIC0qLVxuIjsKKyAgfQorICByZXR1cm4gY29kaW5nICsgc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICArICIjXG4iICsgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICIjXG4iCisgICAgICAgICArICIjICBvcHRpb25zIHN0cmluZzogIiArIGNvcHlfb3B0aW9uc18gKyAiXG4iICsgIiNcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cHlfaW1wb3J0cygpIHsKKyAgb3N0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFR5cGUsIFRNZXNzYWdlVHlwZSwgVEZyb3plbkRpY3QsIFRFeGNlcHRpb24sICIKKyAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgICAgPDwgZW5kbAorICAgICA8PCAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xFeGNlcHRpb24iCisgICAgIDw8IGVuZGwKKyAgICAgPDwgImZyb20gdGhyaWZ0LlRSZWN1cnNpdmUgaW1wb3J0IGZpeF9zcGVjIgorICAgICA8PCBlbmRsOworCisgIGlmIChnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgc3MgPDwgZW5kbCA8PCAiaW1wb3J0IHN5cyI7CisgIH0KKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisKKyAgLy8gRml4IHRocmlmdF9zcGVjIGRlZmluaXRpb25zIGZvciByZWN1cnNpdmUgc3RydWN0cy4KKyAgZl90eXBlc18gPDwgImZpeF9zcGVjKGFsbF9zdHJ1Y3RzKSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgImRlbCBhbGxfc3RydWN0cyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUHl0aG9uLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHRvX3N0cmluZ19tYXBwaW5nLCBmcm9tX3N0cmluZ19tYXBwaW5nOworCisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCAiY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAoZ2VuX25ld3N0eWxlXyA/ICIob2JqZWN0KSIgOiAiIikKKyAgICAgICAgICAgPDwgKGdlbl9keW5hbWljXyA/ICIoIiArIGdlbl9keW5iYXNlY2xhc3NfICsgIikiIDogIiIpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOworCisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX05BTUVTX1RPX1ZBTFVFUyA9IHsiIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKKworICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcworICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8IHZhbHVlIDw8ICI6IFwiIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIsIiA8PCBlbmRsOworICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgJyInIDw8IGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiOiAiIDw8IHZhbHVlIDw8ICcsJyA8PCBlbmRsOworICB9CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IHRvX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGwgPDwgZnJvbV9zdHJpbmdfbWFwcGluZy5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICBmX2NvbnN0c18gPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCAiZmxvYXQoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW1pdF9kb3VibGVfYXNfc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigqKnsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGlmIChpc19pbW11dGFibGUodHlwZSkpIHsKKyAgICAgIG91dCA8PCAiVEZyb3plbkRpY3QoIjsKKyAgICB9CisgICAgb3V0IDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpKSB7CisgICAgICBvdXQgPDwgIikiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpKSB7CisgICAgICAgIG91dCA8PCAiZnJvemVuIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAic2V0KCI7CisgICAgfQorICAgIGlmIChpc19pbW11dGFibGUodHlwZSkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcikgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiXSI7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIpIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgImZvcndhcmQgZGVjbGFyYXRpb25zIiBmb3IgcHl0aG9uIHN0cnVjdHMuCisgKiBUaGVzZSBhcmUgYWN0dWFsbHkgZnVsbCBjbGFzcyBkZWZpbml0aW9ucyBzbyB0aGF0IGNhbGxzIHRvIGdlbmVyYXRlX3N0cnVjdAorICogY2FuIGFkZCB0aGUgdGhyaWZ0X3NwZWMgZmllbGQuICBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGFsbCB0aHJpZnRfc3BlYworICogZGVmaW5pdGlvbnMgYXJlIGdyb3VwZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBlbmFibGUgY28tcmVjdXJzaXZlIHN0cnVjdHMuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHN0cnVjdCwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHl0aG9uIHN0cnVjdAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgdGhyaWZ0X3NwZWMgZm9yIGEgc3RydWN0CisgKiBGb3IgZXhhbXBsZSwKKyAqICAgYWxsX3N0cnVjdHMuYXBwZW5kKFJlY3Vyc2l2ZSkKKyAqICAgUmVjdXJzaXZlLnRocmlmdF9zcGVjID0gKAorICogICAgICAgTm9uZSwgICMgMAorICogICAgICAgKDEsIFRUeXBlLkxJU1QsICdDaGlsZHJlbicsIChUVHlwZS5TVFJVQ1QsIChSZWN1cnNpdmUsIE5vbmUpLCBGYWxzZSksIE5vbmUsICksICAjIDEKKyAqICAgKQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyppc19leGNlcHRpb24qLykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gQWRkIHN0cnVjdCBkZWZpbml0aW9uIHRvIGxpc3Qgc28gdGhyaWZ0X3NwZWMgY2FuIGJlIGZpeGVkIGZvciByZWN1cnNpdmUgc3RydWN0dXJlcy4KKyAgaW5kZW50KG91dCkgPDwgImFsbF9zdHJ1Y3RzLmFwcGVuZCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisKKyAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIudGhyaWZ0X3NwZWMgPSAoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW50IHNvcnRlZF9rZXlzX3BvcyA9IDA7CisgICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisKKyAgICAgIGZvciAoOyBzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCk7IHNvcnRlZF9rZXlzX3BvcysrKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJOb25lLCAgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcyA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyIKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19zcGVjX2FyZ3MoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSgqbV9pdGVyKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiKSwiCisgICAgICAgICAgICAgICAgICA8PCAiICAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7CisKKyAgICAgIHNvcnRlZF9rZXlzX3BvcysrOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnRocmlmdF9zcGVjID0gKCkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGwgPDwgZW5kbCA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaWYgKGdlbl9keW5hbWljXykgeworICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIihURXhjZXB0aW9uKSI7CisgICAgfQorICB9IGVsc2UgaWYgKGdlbl9keW5hbWljXykgeworICAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fIDw8ICIpIjsKKyAgICB9IGVsc2UgIHsKKyAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc18gPDwgIikiOworICAgIH0KKyAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfKSB7CisgICAgb3V0IDw8ICIob2JqZWN0KSI7CisgIH0KKyAgb3V0IDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCBlbmRsOworCisgIC8qCisgICAgIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIHN0cnVjdHVyZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZmFzdGJpbmFyeSBjb2RlYy4KKyAgICAgVGhlc2Ugc3BlY2lmaWNhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyAgICAgdGhyaWZ0X3NwZWMgLT4gdHVwbGUgb2YgaXRlbV9zcGVjCisgICAgIGl0ZW1fc3BlYyAtPiBOb25lIHwgKHRhZywgdHlwZV9lbnVtLCBuYW1lLCBzcGVjX2FyZ3MsIGRlZmF1bHQpCisgICAgIHRhZyAtPiBpbnRlZ2VyCisgICAgIHR5cGVfZW51bSAtPiBUVHlwZS5JMzIgfCBUVHlwZS5TVFJJTkcgfCBUVHlwZS5TVFJVQ1QgfCAuLi4KKyAgICAgbmFtZSAtPiBzdHJpbmdfbGl0ZXJhbAorICAgICBkZWZhdWx0IC0+IE5vbmUgICMgSGFuZGxlZCBieSBfX2luaXRfXworICAgICBzcGVjX2FyZ3MgLT4gTm9uZSAgIyBGb3Igc2ltcGxlIHR5cGVzCisgICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MpICAjIFZhbHVlIHR5cGUgZm9yIGxpc3Qvc2V0CisgICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MsIHR5cGVfZW51bSwgc3BlY19hcmdzKQorICAgICAgICAgICAgICAgICAgIyBLZXkgYW5kIHZhbHVlIGZvciBtYXAKKyAgICAgICAgICAgICAgICB8IChjbGFzc19uYW1lLCBzcGVjX2FyZ3NfcHRyKSAjIEZvciBzdHJ1Y3QvZXhjZXB0aW9uCisgICAgIGNsYXNzX25hbWUgLT4gaWRlbnRpZmllciAgIyBCYXNpY2FsbHkgYSBwb2ludGVyIHRvIHRoZSBjbGFzcworICAgICBzcGVjX2FyZ3NfcHRyIC0+IGV4cHJlc3Npb24gICMganVzdCBjbGFzc19uYW1lLnNwZWNfYXJncworCisgICAgIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbWFraW5nIHRoaXMgd29yayBmb3Igc3RydWN0cyB3aXRoIG5lZ2F0aXZlIHRhZ3MuCisgICovCisKKyAgaWYgKGdlbl9zbG90c18pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19zbG90c19fID0gKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBUT0RPKGRyZWlzcyk6IExvb2sgaW50byBnZW5lcmF0aW5nIGFuIGVtcHR5IHR1cGxlIGluc3RlYWQgb2YgTm9uZQorICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCisgIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cworICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCI7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgIiAiIDw8IGRlY2xhcmVfYXJndW1lbnQoKm1faXRlcikgPDwgIiwiOworICAgIH0KKyAgICBvdXQgPDwgIik6IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAvLyBJbml0aWFsaXplIGZpZWxkcworICAgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgaWYgKCF0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfZW51bSgpICYmICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJzZWxmLnRocmlmdF9zcGVjWyIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIl1bNF06IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisKKyAgICAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICAgICAgaWYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCBzZWxmKS5fX3NldGF0dHJfXygnIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInNlbGYuX19kaWN0X19bJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiddID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX3NldGF0dHJfXyhzZWxmLCAqYXJncyk6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgVHlwZUVycm9yKFwiY2FuJ3QgbW9kaWZ5IGltbXV0YWJsZSBpbnN0YW5jZVwiKSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fZGVsYXR0cl9fKHNlbGYsICphcmdzKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSBUeXBlRXJyb3IoXCJjYW4ndCBtb2RpZnkgaW1tdXRhYmxlIGluc3RhbmNlXCIpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBIYXNoIGFsbCBvZiB0aGUgbWVtYmVycyBpbiBvcmRlciwgYW5kIGFsc28gaGFzaCBpbiB0aGUgY2xhc3MKKyAgICAvLyB0byBhdm9pZCBjb2xsaXNpb25zIGZvciBzdHVmZiBsaWtlIHNpbmdsZS1maWVsZCBzdHJ1Y3R1cmVzLgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faGFzaF9fKHNlbGYpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBoYXNoKHNlbGYuX19jbGFzc19fKSBeIGhhc2goKCI7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgInNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIikpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFnZW5fZHluYW1pY18pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgLy8gRm9yIGV4Y2VwdGlvbnMgb25seSwgZ2VuZXJhdGUgYSBfX3N0cl9fIG1ldGhvZC4gVGhpcyBpcworICAvLyBiZWNhdXNlIHdoZW4gcmFpc2VkIGV4Y2VwdGlvbnMgYXJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUsIF9fcmVwcl9fCisgIC8vIGlzbid0IHVzZWQuIFNlZSBweXRob24gYnVnICM1ODgyCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX3N0cl9fKHNlbGYpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiByZXByKHNlbGYpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFnZW5fc2xvdHNfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgLy8gUHJpbnRpbmcgdXRpbGl0aWVzIHNvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSB0aHJpZnQKKyAgICAvLyBzdHJ1Y3RzIGxvb2sgcHJldHR5IGxpa2UgZGljdGlvbmFyaWVzCisgICAgaW5kZW50KG91dCkgPDwgImRlZiBfX3JlcHJfXyhzZWxmKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVtcygpXSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIEVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG1ldGhvZHMgdGhhdCBjb21wYXJlIGJ5IHZhbHVlCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19lcV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX25lX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICghZ2VuX2R5bmFtaWNfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgLy8gbm8gYmFzZSBjbGFzcyBhdmFpbGFibGUgdG8gaW1wbGVtZW50IF9fZXFfXyBhbmQgX19yZXByX18gYW5kIF9fbmVfXyBmb3IgdXMKKyAgICAvLyBzbyB3ZSBtdXN0IHByb3ZpZGUgb25lIHRoYXQgdXNlcyBfX3Nsb3RzX18KKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkwgPSBbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgZm9yIGtleSBpbiBzZWxmLl9fc2xvdHNfX10iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBFcXVhbGl0eSBtZXRob2QgdGhhdCBjb21wYXJlcyBlYWNoIGF0dHJpYnV0ZSBieSB2YWx1ZSBhbmQgdHlwZSwgd2Fsa2luZyBfX3Nsb3RzX18KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIEZhbHNlIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgYXR0ciBpbiBzZWxmLl9fc2xvdHNfXzoiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJteV92YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAib3RoZXJfdmFsID0gZ2V0YXR0cihvdGhlciwgYXR0cikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBteV92YWwgIT0gb3RoZXJfdmFsOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBUcnVlIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkBjbGFzc21ldGhvZCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZGVmIHJlYWQoY2xzLCBpcHJvdCk6IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJkZWYgcmVhZChzZWxmLCBpcHJvdCk6IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IGNoYXIqIGlkID0gaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpID8gImNscyIgOiAic2VsZiI7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSAiCisgICAgICAgICAgICAgICAgICJhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpICIKKyAgICAgICAgICAgICAgICAgImFuZCAiCisgICAgICAgICAgICAgIDw8IGlkIDw8ICIudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBpcHJvdC5fZmFzdF9kZWNvZGUoTm9uZSwgaXByb3QsIFtjbHMsIGNscy50aHJpZnRfc3BlY10pIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5fZmFzdF9kZWNvZGUoc2VsZiwgaXByb3QsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisgIAorICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICAgICAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gIjsKKyAgICAgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0IDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRmaWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPDwgIk5vbmUiOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0LnN0cigpIDw8IGVuZGw7CisgICAgIH0KKyAgfQorCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgVHJ1ZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsaWYgIjsKKyAgICB9CisgICAgb3V0IDw8ICJmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3Quc2tpcChmdHlwZSkiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gY2xzKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI9IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiZGVmIHdyaXRlKHNlbGYsIG9wcm90KToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpZiBvcHJvdC5fZmFzdF9lbmNvZGUgaXMgbm90IE5vbmUgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KQorICAgICAgPDwgIm9wcm90LnRyYW5zLndyaXRlKG9wcm90Ll9mYXN0X2VuY29kZShzZWxmLCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKSkiCisgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpIiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgaW5kZW50KG91dCkgPDwgImlmIHNlbGYuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiCisgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCkiCisgICAgICA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJkZWYgdmFsaWRhdGUoc2VsZik6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIHNlbGYuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIE5vbmU6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIucHkiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHB5X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIKKyAgICAgICAgICAgICAgIDw8IGdldF9yZWFsX3B5X21vZHVsZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSwgZ2VuX3R3aXN0ZWRfLCBwYWNrYWdlX3ByZWZpeF8pIDw8ICIuIgorICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgImltcG9ydCBsb2dnaW5nIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImZyb20gLnR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW1wb3J0X2R5bmJhc2VfOworICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgIGZfc2VydmljZV8gPDwgImZyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IEludGVyZmFjZSwgaW1wbGVtZW50ZXIiIDw8IGVuZGw7CisgIH0KKworICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBjb25jdXJyZW50IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiYWxsX3N0cnVjdHMgPSBbXSIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQorICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8gPDwgImZpeF9zcGVjKGFsbF9zdHJ1Y3RzKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJkZWwgYWxsX3N0cnVjdHMiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICAgIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2lmID0gIigiICsgZXh0ZW5kcyArICIuSWZhY2UpIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZXh0ZW5kc19pZiA9ICIoSW50ZXJmYWNlKSI7CisgICAgfSBlbHNlIGlmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsIDw8ICJjbGFzcyBJZmFjZSIgPDwgZXh0ZW5kc19pZiA8PCAiOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIGlmIChmdW5jdGlvbnMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gIigiICsgZXh0ZW5kcyArICIuQ2xpZW50KSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXyAmJiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18pKSB7CisgICAgICBleHRlbmRzX2NsaWVudCA9ICIob2JqZWN0KSI7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJAaW1wbGVtZW50ZXIoSWZhY2UpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiY2xhc3MgQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBDbGllbnQoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UpOiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lKToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdD1Ob25lKToiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX29wcm90X2ZhY3RvcnkgPSBvcHJvdF9mYWN0b3J5IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9pcHJvdF9mYWN0b3J5ID0gaXByb3RfZmFjdG9yeSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3RfZmFjdG9yeSA9IChvcHJvdF9mYWN0b3J5IGlmIG9wcm90X2ZhY3RvcnkgaXMgbm90IE5vbmUiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpcHJvdF9mYWN0b3J5KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fc2VxaWQgPSAwIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3RyYW5zcG9ydC5pb19sb29wLnNwYXduX2NhbGxiYWNrKHNlbGYuX3N0YXJ0X3JlY2VpdmluZykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX2lwcm90ID0gc2VsZi5fb3Byb3QgPSBpcHJvdCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgb3Byb3QgaXMgbm90IE5vbmU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic2VsZi5fb3Byb3QgPSBvcHJvdCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fc2VxaWQgPSAwIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzCisgICAgICAgICAgICAgICAgIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fdG9ybmFkb18gJiYgZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8CisgICAgICBpbmRlbnQoKSA8PCAiQGdlbi5lbmdpbmUiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8ICJkZWYgX3N0YXJ0X3JlY2VpdmluZyhzZWxmKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3aGlsZSBUcnVlOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZyYW1lID0geWllbGQgc2VsZi5fdHJhbnNwb3J0LnJlYWRGcmFtZSgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJmb3IgZnV0dXJlIGluIHNlbGYuX3JlcXMudmFsdWVzKCk6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJmdXR1cmUuc2V0X2V4Y2VwdGlvbihlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9yZXFzID0ge30iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QgPSBzZWxmLl9pcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHRyKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIihmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdyZWN2XycgKyBmbmFtZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmdXR1cmUgPSBzZWxmLl9yZXFzLnBvcChyc2VxaWQsIE5vbmUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IGZ1dHVyZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiIyBmdXR1cmUgaGFzIGFscmVhZHkgYmVlbiBkaXNjYXJkZWQiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiY29udGludWUiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IG1ldGhvZChpcHJvdCwgbXR5cGUsIHJzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uIGFzIGU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZ1dHVyZS5zZXRfZXhjZXB0aW9uKGUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZnV0dXJlLnNldF9yZXN1bHQocmVzdWx0KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VxaWQgPSBzZWxmLl9zZXFpZCA9IHNlbGYuX3NlcWlkICsgMSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fcmVxc1tzZXFpZF0gPSBkZWZlci5EZWZlcnJlZCgpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuc2VuZF8iIDw8IGZ1bm5hbWU7CisKKyAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLl9zZXFpZCArPSAxIiA8PCBlbmRsOworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnV0dXJlID0gc2VsZi5fcmVxc1tzZWxmLl9zZXFpZF0gPSBjb25jdXJyZW50LkZ1dHVyZSgpIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworICAgIH0KKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIC8vIHdlIG5lZWQgYSBsZWFkaW5nIGNvbW1hIGlmIHRoZXJlIGFyZSBhcmdzLCBzaW5jZSBpdCdzIGNhbGxlZCBhcyBtYXliZURlZmVycmVkKGZ1bmNuYW1lLAorICAgICAgLy8gYXJnKQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgIC8vIG5vdGhpbmcuIFNlZSB0aGUgbmV4dCBibG9jay4KKyAgICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1dHVyZSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIC8vIFRoaXMgYmxvY2sgaW5qZWN0cyB0aGUgYm9keSBvZiB0aGUgc2VuZF88PiBtZXRob2QgZm9yIHR3aXN0ZWQgKGFuZCBhIGNiL2ViIHBhaXIpCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZC5hZGRDYWxsYmFja3MoIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrPXNlbGYuY2Jfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImNhbGxiYWNrQXJncz0oc2VxaWQsKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVycmJhY2s9c2VsZi5lYl9zZW5kXyIKKyAgICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZXJyYmFja0FyZ3M9KHNlcWlkLCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGNiX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIoc2VsZiwgXywgc2VxaWQpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgLy8gaWYgb25lLXdheSwgZmlyZSB0aGUgZGVmZXJyZWQgJiByZW1vdmUgaXQgZnJvbSBfcmVxcworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3Aoc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgImQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGYuX3JlcXNbc2VxaWRdIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgICAgLy8gYWRkIGFuIGVycmJhY2sgdG8gZmFpbCB0aGUgcmVxdWVzdCBpZiB0aGUgY2FsbCB0byBzZW5kXzw+IHJhaXNlZCBhbiBleGNlcHRpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGViX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIoc2VsZiwgZiwgc2VxaWQpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZC5lcnJiYWNrKGYpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCI7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90ID0gc2VsZi5fb3Byb3RfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLl90cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICAgPDwgbWVzc2FnZVR5cGUgPDwgIiwgc2VsZi5fc2VxaWQpIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShzZWxmLl9vcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJzZWxmLl9vcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgaXByb3QsIG10eXBlLCByc2VxaWQpOiIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF91cCgpOworCisgICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCisKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCkiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QgPSBzZWxmLl9pcHJvdCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oKSIgPDwgZW5kbDsKKworICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAieC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBkLmVycmJhY2soeCkiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAieC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIHgiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuc3VjY2VzcyBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgICAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuY2FsbGJhY2socmVzdWx0LnN1Y2Nlc3MpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gcmVzdWx0LnN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LiIgPDwgeG5hbWUgPDwgIiBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgICAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuZXJyYmFjayhyZXN1bHQuIiA8PCB4bmFtZSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIHJlc3VsdC4iIDw8IHhuYW1lIDw8ICIiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkLmNhbGxiYWNrKE5vbmUpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8KKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInJldHVybiBkLmVycmJhY2soVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjb21tYW5kIGxpbmUgdG9vbCBmb3IgbWFraW5nIHJlbW90ZSByZXF1ZXN0cworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHJlbW90ZSBmb3IuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAvLyBHZXQgYWxsIGZ1bmN0aW9uIGZyb20gcGFyZW50cworICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICB3aGlsZSAocGFyZW50ICE9IE5VTEwpIHsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IHBfZnVuY3Rpb25zID0gcGFyZW50LT5nZXRfZnVuY3Rpb25zKCk7CisgICAgZnVuY3Rpb25zLmluc2VydChmdW5jdGlvbnMuZW5kKCksIHBfZnVuY3Rpb25zLmJlZ2luKCksIHBfZnVuY3Rpb25zLmVuZCgpKTsKKyAgICBwYXJlbnQgPSBwYXJlbnQtPmdldF9leHRlbmRzKCk7CisgIH0KKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBmX3JlbW90ZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICItcmVtb3RlIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3JlbW90ZTsKKyAgZl9yZW1vdGUub3BlbihmX3JlbW90ZV9uYW1lLmNfc3RyKCkpOworCisgIGZfcmVtb3RlIDw8CisgICAgIiMhL3Vzci9iaW4vZW52IHB5dGhvbiIgPDwgZW5kbCA8PAorICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKKyAgICAiaW1wb3J0IHN5cyIgPDwgZW5kbCA8PAorICAgICJpbXBvcnQgcHByaW50IiA8PCBlbmRsIDw8CisgICAgImlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPiAyOiIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAiZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybHBhcnNlIiA8PCBlbmRsIDw8CisgICAgImVsc2U6IiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSIgPDwgZW5kbCA8PAorICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQsIFRTb2NrZXQsIFRTU0xTb2NrZXQsIFRIdHRwQ2xpZW50IiA8PCBlbmRsIDw8CisgICAgImZyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sIiA8PCBlbmRsIDw8CisgICAgZW5kbDsKKworICBmX3JlbW90ZSA8PAorICAgICJmcm9tICIgPDwgbW9kdWxlXyA8PCAiIGltcG9ydCAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZW5kbCA8PAorICAgICJmcm9tICIgPDwgbW9kdWxlXyA8PCAiLnR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbCA8PAorICAgIGVuZGw7CisKKyAgZl9yZW1vdGUgPDwKKyAgICAiaWYgbGVuKHN5cy5hcmd2KSA8PSAxIG9yIHN5cy5hcmd2WzFdID09ICctLWhlbHAnOiIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJycpIiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnVXNhZ2U6ICcgKyBzeXMuYXJndlswXSArICcgWy1oIGhvc3RbOnBvcnRdXSBbLXUgdXJsXSBbLWZbcmFtZWRdXSBbLXNbc2xdXSBbLW5vdmFsaWRhdGVdIFstY2FfY2VydHMgY2VydHNdIFsta2V5ZmlsZSBrZXlmaWxlXSBbLWNlcnRmaWxlIGNlcnRmaWxlXSBmdW5jdGlvbiBbYXJnMSBbYXJnMi4uLl1dJykiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgInByaW50KCcnKSIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJ0Z1bmN0aW9uczonKSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCcgICIgPDwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3JlbW90ZSA8PCBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3JlbW90ZSA8PCAiKScpIiA8PCBlbmRsOworICB9CisgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJycpIiA8PCBlbmRsIDw8IGluZGVudF9zdHIoKSA8PCAic3lzLmV4aXQoMCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3JlbW90ZSA8PCAicHAgPSBwcHJpbnQuUHJldHR5UHJpbnRlcihpbmRlbnQ9MikiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImhvc3QgPSAnbG9jYWxob3N0JyIgPDwgZW5kbAorICAgICAgICAgICA8PCAicG9ydCA9IDkwOTAiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInVyaSA9ICcnIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJmcmFtZWQgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAic3NsID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgInZhbGlkYXRlID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiY2FfY2VydHMgPSBOb25lIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJrZXlmaWxlID0gTm9uZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiY2VydGZpbGUgPSBOb25lIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJodHRwID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImFyZ2kgPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctaCc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAicGFydHMgPSBzeXMuYXJndlthcmdpICsgMV0uc3BsaXQoJzonKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImhvc3QgPSBwYXJ0c1swXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJwb3J0ID0gaW50KHBhcnRzWzFdKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLXUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInVybCA9IHVybHBhcnNlKHN5cy5hcmd2W2FyZ2kgKyAxXSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJwYXJ0cyA9IHVybFsxXS5zcGxpdCgnOicpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgbGVuKHBhcnRzKSA+IDE6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAicG9ydCA9IDgwIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAidXJpID0gdXJsWzJdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgdXJsWzRdOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJ1cmkgKz0gJz8lcycgJSB1cmxbNF0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJodHRwID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWYnIG9yIHN5cy5hcmd2W2FyZ2ldID09ICctZnJhbWVkJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJmcmFtZWQgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctcycgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1zc2wnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInNzbCA9IFRydWUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1ub3ZhbGlkYXRlJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ2YWxpZGF0ZSA9IEZhbHNlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAxIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctY2FfY2VydHMnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImNhX2NlcnRzID0gc3lzLmFyZ3ZbYXJnaSsxXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLWtleWZpbGUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImtleWZpbGUgPSBzeXMuYXJndlthcmdpKzFdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctY2VydGZpbGUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImNlcnRmaWxlID0gc3lzLmFyZ3ZbYXJnaSsxXSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjbWQgPSBzeXMuYXJndlthcmdpXSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiYXJncyA9IHN5cy5hcmd2W2FyZ2kgKyAxOl0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgaHR0cDoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ0cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudChob3N0LCBwb3J0LCB1cmkpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIHNzbDoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAic29ja2V0ID0gVFNTTFNvY2tldC5UU1NMU29ja2V0KGhvc3QsIHBvcnQsICIKKyAgICAgICAgICAgICAgInZhbGlkYXRlPXZhbGlkYXRlLCBjYV9jZXJ0cz1jYV9jZXJ0cywga2V5ZmlsZT1rZXlmaWxlLCBjZXJ0ZmlsZT1jZXJ0ZmlsZSkiCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQoaG9zdCwgcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBmcmFtZWQ6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiZWxzZToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAidHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCAicHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiY2xpZW50ID0gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIuQ2xpZW50KHByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgICA8PCAidHJhbnNwb3J0Lm9wZW4oKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3JlbW90ZSA8PCAiZWwiOworICAgIH0KKworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKKworICAgIGZfcmVtb3RlIDw8ICJpZiBjbWQgPT0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgbGVuKGFyZ3MpICE9ICIgPDwgbnVtX2FyZ3MgPDwgIjoiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHJlcXVpcmVzICIgPDwgbnVtX2FyZ3MKKyAgICAgICAgICAgICA8PCAiIGFyZ3MnKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic3lzLmV4aXQoMSkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHAucHByaW50KGNsaWVudC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChmaXJzdF9hcmcpCisgICAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgICAgZWxzZQorICAgICAgICBmX3JlbW90ZSA8PCAiICI7CisgICAgICBpZiAoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgImFyZ3NbIiA8PCBpIDw8ICJdLCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAiZXZhbChhcmdzWyIgPDwgaSA8PCAiXSksIjsKKyAgICAgIH0KKyAgICB9CisgICAgZl9yZW1vdGUgPDwgIikpIiA8PCBlbmRsOworCisgICAgZl9yZW1vdGUgPDwgZW5kbDsKKyAgfQorCisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfcmVtb3RlIDw8ICJlbHNlOiIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInByaW50KCdVbnJlY29nbml6ZWQgbWV0aG9kICVzJyAlIGNtZCkiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50X3N0cigpIDw8ICJzeXMuZXhpdCgxKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBlbmRsOworICB9CisKKyAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3JlbW90ZS5jbG9zZSgpOworCisjaWZuZGVmIF9NU0NfVkVSCisKKyAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgorICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCisgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JWFVTUgorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RICisjZW5kaWYKKyAgICAgICAgKTsKKworI2VuZGlmIC8vIF9NU0NfVkVSCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiQGltcGxlbWVudGVyKElmYWNlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yKToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgUHJvY2Vzc29yKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIklmYWNlLCBUUHJvY2Vzc29yKToiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX2hhbmRsZXIgPSBJZmFjZShoYW5kbGVyKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IGhhbmRsZXIiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcCA9IHt9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMgPDwgIi5Qcm9jZXNzb3IuX19pbml0X18oc2VsZiwgSWZhY2UoaGFuZGxlcikpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMgPDwgIi5Qcm9jZXNzb3IuX19pbml0X18oc2VsZiwgaGFuZGxlcikiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCJdID0gUHJvY2Vzc29yLnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKG5hbWUsIHR5cGUsIHNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UKKworICAvLyBIT1Q6IGRpY3Rpb25hcnkgZnVuY3Rpb24gbG9va3VwCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIG5hbWUgbm90IGluIHNlbGYuX3Byb2Nlc3NNYXA6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3Quc2tpcChUVHlwZS5TVFJVQ1QpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJ4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gIgorICAgICAgICAgICAgICAgICJmdW5jdGlvbiAlcycgJSAobmFtZSkpIgorICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkZWZlci5zdWNjZWVkKE5vbmUpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIGVuZCBvZiBhcmdzIGZpZWxkLCB0aGUgVF9TVE9QLCBhbmQgdGhlIHN0cnVjdCBjbG9zZQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBUcnVlIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJAZ2VuLmNvcm91dGluZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIgorICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gZGVmZXIubWF5YmVEZWZlcnJlZChzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiLCAiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRFcnJiYWNrKHNlbGYuaGFuZGxlX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiLCBzZXFpZCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQuYWRkQ2FsbGJhY2soc2VsZi53cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi53cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iCisgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIGhhbmRsZV9leGNlcHRpb25fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIGVycm9yLCBzZXFpZCk6IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiB3cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIHN1Y2Nlc3MsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBzdWNjZXNzIiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgd3JpdGVfcmVzdWx0c19leGNlcHRpb25fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIGVycm9yLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOworCisgICAgLy8gS2luZGEgYWJzdXJkCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImVycm9yLnJhaXNlRXhjZXB0aW9uKCkiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHhuYW1lIDw8ICIgPSAiIDw8IHhuYW1lIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBleCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiJ0ludGVybmFsIGVycm9yJykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCBtc2dfdHlwZSwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgInlpZWxkIGdlbi5tYXliZV9mdXR1cmUoc2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiIDw8IHhuYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdC4iIDw8IHhuYW1lIDw8ICIgPSAiIDw8IHhuYW1lIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBleCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiJ0ludGVybmFsIGVycm9yJykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAibG9nZ2luZy5leGNlcHRpb24oJ0V4Y2VwdGlvbiBpbiBvbmV3YXkgaGFuZGxlcicpIiA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgaW5kZW50X2Rvd24oKTsKKworICB9IGVsc2UgeyAvLyBweQorICAgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgICAvLyBJdCBhbHNvIGNhdGNoZXMgYXJiaXRyYXJ5IGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IGhhbmRsZXIgbWV0aG9kIHRvIHByb3BhZ2F0ZSB0aGVtIHRvIHRoZSBjbGllbnQKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgInNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiIDw8IHhuYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVEFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXN1bHQgPSBleCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignVW5leHBlY3RlZCBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAicmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgorICAgICAgICAgICAgICAgICAgICAiJ0ludGVybmFsIGVycm9yJykiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCBtc2dfdHlwZSwgc2VxaWQpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGlwcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpIjsKKyAgICAgICAgfSBlbHNlIGlmKCFnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKSBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgZWxzZSBpcHJvdC5yZWFkU3RyaW5nKCkiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFB5dGhvbiBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlCisgICAgICAgIDw8ICIsICIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHNldCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUKKyAgICAgICAgPDwgIikgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW10iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZQorICAgICAgICA8PCAiKSA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8CisgICAgImZvciAiIDw8IGkgPDwgIiBpbiByYW5nZSgiIDw8IHNpemUgPDwgIik6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpIiA8PCBlbmRsOworICAgIGlmIChpc19pbW11dGFibGUodHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IFRGcm96ZW5EaWN0KCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpIiA8PCBlbmRsOworICAgIGlmIChpc19pbW11dGFibGUodHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGZyb3plbnNldCgiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGlmIChpc19pbW11dGFibGUodHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IHR1cGxlKCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFwcGVuZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIGlmICghZ2VuX3V0ZjhzdHJpbmdzXykgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiLmVuY29kZSgndXRmLTgnKSBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgZWxzZSAiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFB5dGhvbiBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCkiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCAiIDw8IHZpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5pdGVtcygpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBzdHJ1Y3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCwgdHN0cnVjdCwgIkF0dHJpYnV0ZXMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpIHsKKyAgYm9vbCBoYXNfZG9jID0gZmFsc2U7CisgIHN0cmluZ3N0cmVhbSBzczsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGlmIChoYXNfZG9jKSB7CisgICAgICBzcyA8PCBlbmRsOworICAgIH0KKyAgICBoYXNfZG9jID0gdHJ1ZTsKKyAgICBzcyA8PCBzdWJoZWFkZXIgPDwgIjpcbiI7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICIgLSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICI6ICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3MgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaGFzX2RvYykgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIlwiXCJcIlxuIiwgIiIsIHNzLnN0cigpLCAiXCJcIlwiXG4iKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdlbmVyaWMgb2JqZWN0LgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIlwiXCJcIlxuIiwgIiIsIHRkb2MtPmdldF9kb2MoKSwgIlwiXCJcIlxuIik7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiPSI7CisgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICByZXN1bHQgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPDwgIk5vbmUiOworICB9CisgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGRlZmF1bHQgdmFsdWUsIHJldHVybnMgTm9uZSBvdGhlcndpc2UuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIk5vbmUiOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW50ZXJmYWNlKSB7CisgIHZlY3RvcjxzdHJpbmc+IHByZTsKKyAgdmVjdG9yPHN0cmluZz4gcG9zdDsKKyAgc3RyaW5nIHNpZ25hdHVyZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIjsKKworICBpZiAoIShnZW5fem9wZV9pbnRlcmZhY2VfICYmIGludGVyZmFjZSkpIHsKKyAgICBwcmUucHVzaF9iYWNrKCJzZWxmIik7CisgIH0KKworICBzaWduYXR1cmUgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICZwcmUsICZwb3N0KSArICIpIjsKKyAgcmV0dXJuIHNpZ25hdHVyZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHZlY3RvcjxzdHJpbmc+KiBwcmUsIHZlY3RvcjxzdHJpbmc+KiBwb3N0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBpZiAocHJlKSB7CisgICAgZm9yIChzX2l0ZXIgPSBwcmUtPmJlZ2luKCk7IHNfaXRlciAhPSBwcmUtPmVuZCgpOyArK3NfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSAqc19pdGVyOworICAgIH0KKyAgfQorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKHBvc3QpIHsKKyAgICBmb3IgKHNfaXRlciA9IHBvc3QtPmJlZ2luKCk7IHNfaXRlciAhPSBwb3N0LT5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgICB9CisgICAgICByZXN1bHQgKz0gKnNfaXRlcjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgIHJldHVybiBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbSwgZ2VuX3R3aXN0ZWRfLCBwYWNrYWdlX3ByZWZpeF8pICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgcmV0dXJuIGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLnR0eXBlcy4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHl0aG9uIHR5b2UKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKiBTZWUgdGhlIGNvbW1lbnQgaW5zaWRlIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uIGZvciB3aGF0IHRoaXMgaXMuICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpIHsKKyAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgcmV0dXJuICAiJ0JJTkFSWSciOworICB9IGVsc2UgaWYgKGdlbl91dGY4c3RyaW5nc18gJiYgdHR5cGUtPmlzX2Jhc2VfdHlwZSgpCisgICAgICAgICAgICAgJiYgcmVpbnRlcnByZXRfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+aXNfc3RyaW5nKCkpIHsKKyAgICByZXR1cm4gIidVVEY4JyI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gICJOb25lIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlsiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsIE5vbmVdIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyAoaXNfaW1tdXRhYmxlKHR0eXBlKSA/ICJUcnVlIiA6ICJGYWxzZSIpICsgIikiOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIChpc19pbW11dGFibGUodHR5cGUpID8gIlRydWUiIDogIkZhbHNlIikgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgKGlzX2ltbXV0YWJsZSh0dHlwZSkgPyAiVHJ1ZSIgOiAiRmFsc2UiKSArICIpIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBweSwKKyAgICAiUHl0aG9uIiwKKyAgICAiICAgIHpvcGUuaW50ZXJmYWNlOiAgR2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggem9wZS5pbnRlcmZhY2UuXG4iCisgICAgIiAgICB0d2lzdGVkOiAgICAgICAgIEdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLlxuIgorICAgICIgICAgdG9ybmFkbzogICAgICAgICBHZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCBUb3JuYWRvLlxuIgorICAgICIgICAgbm9fdXRmOHN0cmluZ3M6ICBEbyBub3QgRW5jb2RlL2RlY29kZSBzdHJpbmdzIHVzaW5nIHV0ZjggaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBCYXNpY2FsbHkgbm8gZWZmZWN0IGZvciBQeXRob24gMy5cbiIKKyAgICAiICAgIGNvZGluZz1DT0RJTkc6ICAgQWRkIGZpbGUgZW5jb2RpbmcgZGVjbGFyZSBpbiBnZW5lcmF0ZWQgZmlsZS5cbiIKKyAgICAiICAgIHNsb3RzOiAgICAgICAgICAgR2VuZXJhdGUgY29kZSB1c2luZyBzbG90cyBmb3IgaW5zdGFuY2UgbWVtYmVycy5cbiIKKyAgICAiICAgIGR5bmFtaWM6ICAgICAgICAgR2VuZXJhdGUgZHluYW1pYyBjb2RlLCBsZXNzIGNvZGUgZ2VuZXJhdGVkIGJ1dCBzbG93ZXIuXG4iCisgICAgIiAgICBkeW5iYXNlPUNMUyAgICAgIERlcml2ZSBnZW5lcmF0ZWQgY2xhc3NlcyBmcm9tIGNsYXNzIENMUyBpbnN0ZWFkIG9mIFRCYXNlLlxuIgorICAgICIgICAgZHluZnJvemVuPUNMUyAgICBEZXJpdmUgZ2VuZXJhdGVkIGltbXV0YWJsZSBjbGFzc2VzIGZyb20gY2xhc3MgQ0xTIGluc3RlYWQgb2YgVEZyb3plbkJhc2UuXG4iCisgICAgIiAgICBkeW5leGM9Q0xTICAgICAgIERlcml2ZSBnZW5lcmF0ZWQgZXhjZXB0aW9ucyBmcm9tIENMUyBpbnN0ZWFkIG9mIFRFeGNlcHRpb25CYXNlLlxuIgorICAgICIgICAgZHluaW1wb3J0PSdmcm9tIGZvby5iYXIgaW1wb3J0IENMUydcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgQWRkIGFuIGltcG9ydCBsaW5lIHRvIGdlbmVyYXRlZCBjb2RlIHRvIGZpbmQgdGhlIGR5bmJhc2UgY2xhc3MuXG4iCisgICAgIiAgICBwYWNrYWdlX3ByZWZpeD0ndG9wLnBhY2thZ2UuJ1xuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlIHByZWZpeCBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIgorICAgICIgICAgb2xkX3N0eWxlOiAgICAgICBEZXByZWNhdGVkLiBHZW5lcmF0ZSBvbGQtc3R5bGUgY2xhc3Nlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWEyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEyODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEEgc3ViY2xhc3Mgb2Ygc3RkOjpvZnN0cmVhbSB0aGF0IGluY2x1ZGVzIGluZGVudGluZyBmdW5jdGlvbmFsaXR5LgorICovCitjbGFzcyB0X3JiX29mc3RyZWFtIDogcHVibGljIHN0ZDo6b2ZzdHJlYW0geworcHJpdmF0ZToKKyAgaW50IGluZGVudF87CisKK3B1YmxpYzoKKyAgdF9yYl9vZnN0cmVhbSgpIDogc3RkOjpvZnN0cmVhbSgpLCBpbmRlbnRfKDApIHt9CisgIGV4cGxpY2l0IHRfcmJfb2ZzdHJlYW0oY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBpb3NfYmFzZTo6b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRlbnQgPSAwKQorICAgIDogc3RkOjpvZnN0cmVhbShmaWxlbmFtZSwgbW9kZSksIGluZGVudF8oaW5kZW50KSB7fQorCisgIHRfcmJfb2ZzdHJlYW0mIGluZGVudCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudF87ICsraSkgeworICAgICAgKnRoaXMgPDwgIiAgIjsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBpbmRlbnRfdXAoKSB7IGluZGVudF8rKzsgfQorICB2b2lkIGluZGVudF9kb3duKCkgeyBpbmRlbnRfLS07IH0KK307CisKKy8qKgorICogUnVieSBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfcmJfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcmJfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICByZXF1aXJlX3J1YnlnZW1zXyA9IGZhbHNlOworICAgIG5hbWVzcGFjZWRfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicnVieWdlbXMiKSA9PSAwKSB7CisgICAgICAgIHJlcXVpcmVfcnVieWdlbXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmFtZXNwYWNlZCIpID09IDApIHsKKyAgICAgICAgbmFtZXNwYWNlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHJ1Ynk6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXJiIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB0X3JiX29mc3RyZWFtJiByZW5kZXJfY29uc3RfdmFsdWUodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9kZWNsYXJhdGlvbih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9jb25zdHJ1Y3Rvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVmbnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGZpZWxkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfcmRvYyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcmJfYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lKGNvbnN0IHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChzdGQ6OnN0cmluZyByYl9uYW1lc3BhY2UpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBydWJ5X21vZHVsZXMoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJyYiIpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzOworICAgIGlmIChucy5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gbW9kdWxlczsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgcG9zID0gbnMuYmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGRlbGltID0gc3RkOjpmaW5kKHBvcywgbnMuZW5kKCksICcuJyk7CisgICAgICBtb2R1bGVzLnB1c2hfYmFjayhjYXBpdGFsaXplKHN0ZDo6c3RyaW5nKHBvcywgZGVsaW0pKSk7CisgICAgICBwb3MgPSBkZWxpbTsKKyAgICAgIGlmIChwb3MgPT0gbnMuZW5kKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK3BvczsKKyAgICB9CisKKyAgICByZXR1cm4gbW9kdWxlczsKKyAgfQorCisgIHZvaWQgYmVnaW5fbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOworICB2b2lkIGVuZF9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgdF9yYl9vZnN0cmVhbSBmX3R5cGVzXzsKKyAgdF9yYl9vZnN0cmVhbSBmX2NvbnN0c187CisgIHRfcmJfb2ZzdHJlYW0gZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgcmVxdWlyZV9wcmVmaXhfOworCisgIC8qKiBJZiB0cnVlLCBhZGQgYSAicmVxdWlyZSAncnVieWdlbXMnIiBsaW5lIHRvIHRoZSB0b3Agb2YgZWFjaCBnZW4tcmIgZmlsZS4gKi8KKyAgYm9vbCByZXF1aXJlX3J1YnlnZW1zXzsKKworICAvKiogSWYgdHJ1ZSwgZ2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuICovCisgIGJvb2wgbmFtZXNwYWNlZF87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKworICBpZiAobmFtZXNwYWNlZF8pIHsKKyAgICByZXF1aXJlX3ByZWZpeF8gPSByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInJiIikpOworCisgICAgc3RyaW5nIGRpciA9IHJlcXVpcmVfcHJlZml4XzsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgc3ViZGlyID0gc3ViZGlyICsgZGlyLnN1YnN0cigwLCBsb2MpICsgIi8iOworICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgICB9CisgIH0KKworICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzLnJiIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgKyAiX2NvbnN0YW50cy5yYiI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKyAgYmVnaW5fbmFtZXNwYWNlKGZfdHlwZXNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKKworICBmX2NvbnN0c18gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PCAicmVxdWlyZSAnIgorICAgICAgICAgICAgPDwgcmVxdWlyZV9wcmVmaXhfIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwgPDwgZW5kbDsKKyAgYmVnaW5fbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Cit9CisKKy8qKgorICogUmVuZGVycyB0aGUgcmVxdWlyZSBvZiB0aHJpZnQgaXRzZWxmLCBhbmQgcG9zc2libHkgb2YgdGhlIHJ1YnlnZW1zIGRlcGVuZGVuY3kuCisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgeworICBpZiAocmVxdWlyZV9ydWJ5Z2Vtc18pIHsKKyAgICByZXR1cm4gInJlcXVpcmUgJ3J1YnlnZW1zJ1xucmVxdWlyZSAndGhyaWZ0J1xuIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gInJlcXVpcmUgJ3RocmlmdCdcbiI7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAobmFtZXNwYWNlZF8pIHsKKyAgICAgIHRfcHJvZ3JhbSogaW5jbHVkZWQgPSBpbmNsdWRlc1tpXTsKKyAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVkX3JlcXVpcmVfcHJlZml4CisgICAgICAgICAgPSByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoaW5jbHVkZWQtPmdldF9uYW1lc3BhY2UoInJiIikpOworICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZWRfbmFtZSA9IGluY2x1ZGVkLT5nZXRfbmFtZSgpOworICAgICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgaW5jbHVkZWRfcmVxdWlyZV9wcmVmaXggKyB1bmRlcnNjb3JlKGluY2x1ZGVkX25hbWUpICsgIl90eXBlcydcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAicmVxdWlyZSAnIiArIHVuZGVyc2NvcmUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl90eXBlcydcbiI7CisgICAgfQorICB9CisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9ICJcbiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIjXG4iKSArICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgIGVuZF9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOworICBlbmRfbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfY29uc3RzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUnVieSwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3R5cGVzXy5pbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIC8vIFJ1YnkgY2xhc3MgY29uc3RhbnRzIGhhdmUgdG8gYmUgY2FwaXRhbGl6ZWQuLi4gb21nIGkgYW0gc28gb24gdGhlIGZlbmNlCisgICAgLy8gYWJvdXQgbGFuZ3VhZ2VzIHN0cmljdGx5IGVuZm9yY2luZyBjYXBpdGFsaXphdGlvbiB3aHkgY2FuJ3Qgd2UganVzdCBhbGwKKyAgICAvLyBhZ3JlZSBhbmQgcGxheSBuaWNlLgorICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgZ2VuZXJhdGVfcmRvYyhmX3R5cGVzXywgKmNfaXRlcik7CisgICAgZl90eXBlc18uaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgaGFzaCBtYXBwaW5nIHZhbHVlcyBiYWNrIHRvIHRoZWlyIG5hbWVzIChhcyBzdHJpbmdzKSBzaW5jZSBydWJ5IGhhcyBubyBuYXRpdmUgZW51bQorICAvLyB0eXBlCisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJWQUxVRV9NQVAgPSB7IjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBQb3B1bGF0ZSB0aGUgaGFzaAorICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgZl90eXBlc18gPDwgdmFsdWUgPDwgIiA9PiBcIiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiI7CisgIH0KKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gQ3JlYXRlIGEgc2V0IHdpdGggdmFsaWQgdmFsdWVzIGZvciB0aGlzIGVudW0KKyAgZl90eXBlc18uaW5kZW50KCkgPDwgIlZBTElEX1ZBTFVFUyA9IFNldC5uZXcoWyI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgLy8gUG9wdWxhdGUgdGhlIHNldAorICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpCisgICAgICBmX3R5cGVzXyA8PCAiLCAiOworICAgIGZfdHlwZXNfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICBmX3R5cGVzXyA8PCAiXSkuZnJlZXplIiA8PCBlbmRsOworCisgIGZfdHlwZXNfLmluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisKKyAgZl9jb25zdHNfLmluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICI7CisgIHJlbmRlcl9jb25zdF92YWx1ZShmX2NvbnN0c18sIHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordF9yYl9vZnN0cmVhbSYgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgIiVxXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQuaW5kZW50KCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBmdWxsX3R5cGVfbmFtZSh0eXBlKSA8PCAiLm5ldyh7IiA8PCBlbmRsOworICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgb3V0LmluZGVudCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCkgPDwgIiA9PiAiOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBvdXQuaW5kZW50KCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dC5pbmRlbnQoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiID0+ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBvdXQuaW5kZW50KCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiU2V0Lm5ldyhbIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dC5pbmRlbnQoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0LmluZGVudF9kb3duKCk7CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgIl0pIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJdIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9yYl91bmlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworICB9Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlICJmb3J3YXJkIGRlY2xhcmF0aW9ucyIgZm9yIHJ1Ynkgc3RydWN0cy4KKyAqIFRoZXNlIGFyZSBzaW1wbHkgYSBkZWNsYXJhdGlvbiBvZiBlYWNoIGNsYXNzIHdpdGggcHJvcGVyIGluaGVyaXRhbmNlLgorICogVGhlIHJlc3Qgb2YgdGhlIHN0cnVjdCBpcyBzdGlsbCBnZW5lcmF0ZWQgaW4gZ2VuZXJhdGVfc3RydWN0IGFzIGhhcworICogYWx3YXlzIGJlZW4gdGhlIGNhc2UuIFRoZXNlIGRlY2xhcmF0aW9ucyBhbGxvdyB0aHJpZnQgdG8gZ2VuZXJhdGUgdmFsaWQKKyAqIHJ1YnkgaW4gY2FzZXMgd2hlcmUgdGhyaWZ0IHN0cnVjdHMgcmVseSBvbiByZWN1cnNpdmUgZGVmaW5pdGlvbnMuCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCk7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgb3V0IDw8ICIgPCA6OlRocmlmdDo6VW5pb24iOworICB9CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpFeGNlcHRpb24iOworICB9CisgIG91dCA8PCAiOyBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcnVieSBzdHJ1Y3QKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7CisgIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIDwgOjpUaHJpZnQ6OkV4Y2VwdGlvbiI7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0LmluZGVudF91cCgpOworICBvdXQuaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlN0cnVjdCwgOjpUaHJpZnQ6OlN0cnVjdF9VbmlvbiIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgZ2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3RvcihvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKworICBvdXQuaW5kZW50KCkgPDwgIjo6VGhyaWZ0OjpTdHJ1Y3QuZ2VuZXJhdGVfYWNjZXNzb3JzIHNlbGYiIDw8IGVuZGw7CisKKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcnVieSB1bmlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbih0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgKHZvaWQpaXNfZXhjZXB0aW9uOworICBnZW5lcmF0ZV9yZG9jKG91dCwgdHN0cnVjdCk7CisgIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiIgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X3VwKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyhvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9maWVsZF9kZWZucyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKworICBvdXQuaW5kZW50KCkgPDwgIjo6VGhyaWZ0OjpVbmlvbi5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBvdXQuaW5kZW50KCkgPDwgImNsYXNzIDw8IHNlbGYiIDw8IGVuZGw7CisgIG91dC5pbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZmllbGRfbmFtZSA8PCAiKHZhbCkiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudCgpIDw8ICIgICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLm5ldyg6IiA8PCBmaWVsZF9uYW1lIDw8ICIsIHZhbCkiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPT0gMSkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKworICAgIGlmICgoKm1faXRlciktPmdldF90eXBlKCktPmlzX3N0cmluZygpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgaW5pdGlhbGl6ZShtZXNzYWdlPW5pbCkiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X3VwKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInN1cGVyKCkiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInNlbGYuIiA8PCBuYW1lIDw8ICIgPSBtZXNzYWdlIiA8PCBlbmRsOworICAgICAgb3V0LmluZGVudF9kb3duKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBpZiAobmFtZSAhPSAibWVzc2FnZSIpIHsKKyAgICAgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgbWVzc2FnZTsgIiA8PCBuYW1lIDw8ICIgZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX2ZpZWxkX25hbWUgPSB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpOworCisgICAgb3V0LmluZGVudCgpIDw8IGNhcF9maWVsZF9uYW1lIDw8ICIgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2RlZm5zKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dC5pbmRlbnQoKSA8PCAiRklFTERTID0geyIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBnZW5lcmF0ZSB0aGUgZmllbGQgZG9jc3RyaW5ncyB3aXRoaW4gdGhlIEZJRUxEUyBjb25zdGFudC4gbm8gcmVhbCBiZXR0ZXIgcGxhY2UuLi4KKyAgICBnZW5lcmF0ZV9yZG9jKG91dCwgKmZfaXRlcik7CisKKyAgICBvdXQuaW5kZW50KCkgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPT4gIjsKKworICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICB9CisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKKyAgb3V0LmluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgb3V0LmluZGVudCgpIDw8ICJkZWYgc3RydWN0X2ZpZWxkczsgRklFTERTOyBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsID0gZmFsc2UpIHsKKyAgZmllbGRfdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGRfdHlwZSk7CisKKyAgLy8gQmVnaW4gdGhpcyBmaWVsZCdzIGRlZm4KKyAgb3V0IDw8ICJ7OnR5cGUgPT4gIiA8PCB0eXBlX3RvX2VudW0oZmllbGRfdHlwZSk7CisKKyAgaWYgKCFmaWVsZF9uYW1lLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIiwgOm5hbWUgPT4gJyIgPDwgZmllbGRfbmFtZSA8PCAiJyI7CisgIH0KKworICBpZiAoZmllbGRfdmFsdWUgIT0gTlVMTCkgeworICAgIG91dCA8PCAiLCA6ZGVmYXVsdCA9PiAiOworICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIGZpZWxkX3ZhbHVlKTsKKyAgfQorCisgIGlmICghZmllbGRfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpZiAoZmllbGRfdHlwZS0+aXNfc3RydWN0KCkgfHwgZmllbGRfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICIsIDpjbGFzcyA9PiAiIDw8IGZ1bGxfdHlwZV9uYW1lKCh0X3N0cnVjdCopZmllbGRfdHlwZSk7CisgICAgfSBlbHNlIGlmIChmaWVsZF90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9saXN0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX21hcCgpKSB7CisgICAgICBvdXQgPDwgIiwgOmtleSA9PiAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9tYXAqKWZpZWxkX3R5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICBvdXQgPDwgIiwgOnZhbHVlID0+ICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIiwgOmVsZW1lbnQgPT4gIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfc2V0KilmaWVsZF90eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCgodF9iYXNlX3R5cGUqKWZpZWxkX3R5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICIsIDpiaW5hcnkgPT4gdHJ1ZSI7CisgICAgfQorICB9CisKKyAgaWYgKG9wdGlvbmFsKSB7CisgICAgb3V0IDw8ICIsIDpvcHRpb25hbCA9PiB0cnVlIjsKKyAgfQorCisgIGlmIChmaWVsZF90eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgIiwgOmVudW1fY2xhc3MgPT4gIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZF90eXBlKTsKKyAgfQorCisgIC8vIEVuZCBvZiB0aGlzIGZpZWxkJ3MgZGVmbgorICBvdXQgPDwgIn0iOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dC5pbmRlbnQoKSA8PCAibW9kdWxlICIgPDwgKm1faXRlciA8PCBlbmRsOworICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgfQorfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjplbmRfbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzKSB7CisgIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6cmV2ZXJzZV9pdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLnJiZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5yZW5kKCk7CisgICAgICAgKyttX2l0ZXIpIHsKKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLnJiIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGlmIChuYW1lc3BhY2VkXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgicmIiKSkKKyAgICAgICAgICAgICAgICAgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlcXVpcmUgJyIgPDwgcmVxdWlyZV9wcmVmaXhfCisgICAgICAgICAgICAgICAgIDw8IHVuZGVyc2NvcmUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8ICInIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgInJlcXVpcmUgJyIgPDwgcmVxdWlyZV9wcmVmaXhfIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsOworCisgIGJlZ2luX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZW5kX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3NlcnZpY2VfLCB0cyk7CisgICAgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKyAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sICZyZXN1bHQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiA8ICIgKyBleHRlbmRzICsgIjo6Q2xpZW50ICI7CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6Q2xpZW50IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlU2VuZFByb2MgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gInNlbmRfb25ld2F5X21lc3NhZ2UiIDogInNlbmRfbWVzc2FnZSI7CisKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8IG1lc3NhZ2VTZW5kUHJvYyA8PCAiKCciIDw8IGZ1bm5hbWUgPDwgIicsICIgPDwgYXJnc25hbWU7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCA6IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0ID0gcmVjZWl2ZV9tZXNzYWdlKCIgPDwgcmVzdWx0bmFtZSA8PCAiKSIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuc3VjY2VzcyB1bmxlc3MgcmVzdWx0LnN1Y2Nlc3MubmlsPyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgdW5sZXNzIHJlc3VsdC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIubmlsPyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmFpc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6OlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSVNTSU5HX1JFU1VMVCwgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JykiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiA8ICIgKyBleHRlbmRzICsgIjo6UHJvY2Vzc29yICI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiY2xhc3MgUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsOworICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlByb2Nlc3NvciIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImFyZ3MgPSByZWFkX2FyZ3MoaXByb3QsICIgPDwgYXJnc25hbWUgPDwgIikiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5uZXcoKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfLmluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgIkBoYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc2N1ZSAiIDw8IGZ1bGxfdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiA9PiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJ3cml0ZV9yZXN1bHQocmVzdWx0LCBvcHJvdCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBzZXFpZCkiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5CisgIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOworICB9CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVsbF90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIjo6IjsKKyAgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzID0gcnVieV9tb2R1bGVzKHR0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgeworICAgIHByZWZpeCArPSAqbV9pdGVyICsgIjo6IjsKKyAgfQorICByZXR1cm4gcHJlZml4ICsgdHlwZV9uYW1lKHR0eXBlKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFJ1YnkgdHlvZQorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6Qk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpMSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoc3RyaW5nIHJiX25hbWVzcGFjZSkgeworICBzdHJpbmcgbmFtZXNwYWNlc19sZWZ0ID0gcmJfbmFtZXNwYWNlOworICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgc3RyaW5nIHBhdGhfcHJlZml4ID0gIiI7CisKKyAgd2hpbGUgKChsb2MgPSBuYW1lc3BhY2VzX2xlZnQuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBwYXRoX3ByZWZpeCA9IHBhdGhfcHJlZml4ICsgdW5kZXJzY29yZShuYW1lc3BhY2VzX2xlZnQuc3Vic3RyKDAsIGxvYykpICsgIi8iOworICAgIG5hbWVzcGFjZXNfbGVmdCA9IG5hbWVzcGFjZXNfbGVmdC5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKG5hbWVzcGFjZXNfbGVmdC5zaXplKCkgPiAwKSB7CisgICAgcGF0aF9wcmVmaXggPSBwYXRoX3ByZWZpeCArIHVuZGVyc2NvcmUobmFtZXNwYWNlc19sZWZ0KSArICIvIjsKKyAgfQorICByZXR1cm4gcGF0aF9wcmVmaXg7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Jkb2ModF9yYl9vZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgb3V0LmluZGVudCgpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIjICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICIKKyAgICAgICAgICAgICAgICAgICAgICAiJ1JlcXVpcmVkIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSI7CisgICAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jvb2woKSkgeworICAgICAgICBvdXQgPDwgIiBpZiBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgdW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgInVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8gfHwgIgorICAgICAgICAgICAgICAgICAgIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oQCIKKyAgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICIKKyAgICAgICAgICAgICAgICAgICAgICAiJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIiA8PCBlbmRsOworICAgICAgb3V0LmluZGVudF9kb3duKCk7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0LmluZGVudCgpIDw8ICJkZWYgdmFsaWRhdGUiIDw8IGVuZGw7CisgIG91dC5pbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0LmluZGVudCgpCisgICAgICA8PCAicmFpc2UoU3RhbmRhcmRFcnJvciwgJ1VuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4nKSBpZiBnZXRfc2V0X2ZpZWxkLm5pbD8gfHwgZ2V0X3ZhbHVlLm5pbD8iCisgICAgICA8PCBlbmRsOworCisgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgY29uc3QgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJpZiBnZXRfc2V0X2ZpZWxkID09IDoiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50KCkgPDwgIiAgcmFpc2UgIgorICAgICAgICAgICAgICAgICAgICAgICI6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykgdW5sZXNzICIKKyAgICAgICAgICAgICAgICAgICA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjo6VkFMSURfVkFMVUVTLmluY2x1ZGU/KGdldF92YWx1ZSkiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHJiLAorICAgICJSdWJ5IiwKKyAgICAiICAgIHJ1YnlnZW1zOiAgICAgICAgQWRkIGEgXCJyZXF1aXJlICdydWJ5Z2VtcydcIiBsaW5lIHRvIHRoZSB0b3Agb2YgZWFjaCBnZW5lcmF0ZWQgZmlsZS5cbiIKKyAgICAiICAgIG5hbWVzcGFjZWQ6ICAgICAgR2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQzZDdhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzMzM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzZXQ7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCgiXG4iKTsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworc3RhdGljIGNvbnN0IHN0cmluZyBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSgicmVzdWx0X3ZhbHVlIik7CitzdGF0aWMgY29uc3Qgc3RyaW5nIFJFU1VMVF9TVFJVQ1RfU1VGRklYKCJSZXN1bHQiKTsKK3N0YXRpYyBjb25zdCBzdHJpbmcgUlVTVF9SRVNFUlZFRF9XT1JEU1tdID0geworICAiYWJzdHJhY3QiLCAiYWxpZ25vZiIsICJhcyIsICJiZWNvbWUiLAorICAiYm94IiwgImJyZWFrIiwgImNvbnN0IiwgImNvbnRpbnVlIiwKKyAgImNyYXRlIiwgImRvIiwgImVsc2UiLCAiZW51bSIsCisgICJleHRlcm4iLCAiZmFsc2UiLCAiZmluYWwiLCAiZm4iLAorICAiZm9yIiwgImlmIiwgImltcGwiLCAiaW4iLAorICAibGV0IiwgImxvb3AiLCAibWFjcm8iLCAibWF0Y2giLAorICAibW9kIiwgIm1vdmUiLCAibXV0IiwgIm9mZnNldG9mIiwKKyAgIm92ZXJyaWRlIiwgInByaXYiLCAicHJvYyIsICJwdWIiLAorICAicHVyZSIsICJyZWYiLCAicmV0dXJuIiwgIlNlbGYiLAorICAic2VsZiIsICJzaXplb2YiLCAic3RhdGljIiwgInN0cnVjdCIsCisgICJzdXBlciIsICJ0cmFpdCIsICJ0cnVlIiwgInR5cGUiLAorICAidHlwZW9mIiwgInVuc2FmZSIsICJ1bnNpemVkIiwgInVzZSIsCisgICJ2aXJ0dWFsIiwgIndoZXJlIiwgIndoaWxlIiwgInlpZWxkIgorfTsKK2NvbnN0IHNldDxzdHJpbmc+IFJVU1RfUkVTRVJWRURfV09SRFNfU0VUKAorICBSVVNUX1JFU0VSVkVEX1dPUkRTLAorICBSVVNUX1JFU0VSVkVEX1dPUkRTICsgc2l6ZW9mKFJVU1RfUkVTRVJWRURfV09SRFMpL3NpemVvZihSVVNUX1JFU0VSVkVEX1dPUkRTWzBdKQorKTsKKworc3RhdGljIGNvbnN0IHN0cmluZyBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMoIjxJUCwgT1A+Iik7CitzdGF0aWMgY29uc3Qgc3RyaW5nIFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTKCJ3aGVyZSBJUDogVElucHV0UHJvdG9jb2wsIE9QOiBUT3V0cHV0UHJvdG9jb2wiKTsKKworLy8gRklYTUU6IGV4dHJhY3QgY29tbW9uIFRNZXNzYWdlSWRlbnRpZmllciBmdW5jdGlvbgorLy8gRklYTUU6IGhhdmUgdG9fcnVzdF90eXBlIGRlYWwgd2l0aCBPcHRpb24KKworY2xhc3MgdF9yc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3JzX2dlbmVyYXRvcigKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmCisgICkgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgZ2VuX2Rpcl8gPSBnZXRfb3V0X2RpcigpOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCitwcml2YXRlOgorICAvLyBzdHJ1Y3QgdHlwZQorICAvLyBUX1JFR1VMQVI6IHVzZXItZGVmaW5lZCBzdHJ1Y3QgaW4gdGhlIElETAorICAvLyBUX0FSR1M6IHN0cnVjdCB1c2VkIHRvIGhvbGQgYWxsIHNlcnZpY2UtY2FsbCBwYXJhbWV0ZXJzCisgIC8vIFRfUkVTVUxUOiBzdHJ1Y3QgdXNlZCB0byBob2xkIGFsbCBzZXJ2aWNlLWNhbGwgcmV0dXJucyBhbmQgZXhjZXB0aW9ucworICAvLyBUX0VYQ0VQVElPTjogdXNlci1kZWZpbmVkIGV4Y2VwdGlvbiBpbiB0aGUgSURMCisgIGVudW0gZV9zdHJ1Y3RfdHlwZSB7IFRfUkVHVUxBUiwgVF9BUkdTLCBUX1JFU1VMVCwgVF9FWENFUFRJT04gfTsKKworICAvLyBEaXJlY3RvcnkgdG8gd2hpY2ggZ2VuZXJhdGVkIGNvZGUgaXMgd3JpdHRlbi4KKyAgc3RyaW5nIGdlbl9kaXJfOworCisgIC8vIEZpbGUgdG8gd2hpY2ggZ2VuZXJhdGVkIGNvZGUgaXMgd3JpdHRlbi4KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2dlbl87CisKKyAgLy8gV3JpdGUgdGhlIGNvbW1vbiBjb21waWxlciBhdHRyaWJ1dGVzIGFuZCBtb2R1bGUgaW5jbHVkZXMgdG8gdGhlIHRvcCBvZiB0aGUgYXV0by1nZW5lcmF0ZWQgZmlsZS4KKyAgdm9pZCByZW5kZXJfYXR0cmlidXRlc19hbmRfaW5jbHVkZXMoKTsKKworICAvLyBDcmVhdGUgdGhlIGNsb3N1cmUgb2YgUnVzdCBtb2R1bGVzIHJlZmVyZW5jZWQgYnkgdGhpcyBzZXJ2aWNlLgorICB2b2lkIGNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXModF9zZXJ2aWNlICp0c2VydmljZSwgc2V0PHN0cmluZz4gJnJlZmVyZW5jZWRfbW9kdWxlcyk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYW4gZW51bS4KKyAgdm9pZCByZW5kZXJfZW51bV9kZWZpbml0aW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgaW1wbCBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFpdHMgbmVjZXNzYXJ5IHRvIGNvbnZlcnQgYW4gZW51bSB0by9mcm9tIGFuIGkzMi4KKyAgdm9pZCByZW5kZXJfZW51bV9jb252ZXJzaW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgaW1wbCBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYW4gZW51bS4gVGhpcyBpbmNsdWRlcyBtZXRob2RzCisgIC8vIHRvIHdyaXRlIHRoZSBlbnVtIHRvIGEgcHJvdG9jb2wsIHJlYWQgaXQgZnJvbSBhIHByb3RvY29sLCBldGMuCisgIHZvaWQgcmVuZGVyX2VudW1faW1wbChjb25zdCBzdHJpbmcmIGVudW1fbmFtZSk7CisKKyAgLy8gV3JpdGUgYSBzaW1wbGUgcnVzdCBjb25zdCB2YWx1ZSAoaWUuIGBwdWIgY29uc3QgRk9POiBmb28uLi5gKS4KKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWUoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3RhbnQgbGlzdCwgc2V0LCBtYXAgb3Igc3RydWN0LiBUaGVzZSBjb25zdGFudHMgcmVxdWlyZSBhbGxvY2F0aW9uIGFuZCBjYW5ub3QgYmUgZGVmaW5lZAorICAvLyB1c2luZyBhICdwdWIgY29uc3QnLiBBcyBhIHJlc3VsdCwgSSBjcmVhdGUgYSBob2xkZXIgc3RydWN0IHdpdGggYSBzaW5nbGUgYGNvbnN0X3ZhbHVlYCBtZXRob2QgdGhhdAorICAvLyByZXR1cm5zIHRoZSBpbml0aWFsaXplZCBpbnN0YW5jZS4KKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWVfaG9sZGVyKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSB0aGUgYWN0dWFsIGNvbnN0IHZhbHVlIC0gdGhlIHJpZ2h0IHNpZGUgb2YgYSBjb25zdCBkZWZpbml0aW9uLgorICB2b2lkIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUsIGJvb2wgaXNfb3duZWQgPSB0cnVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IHN0cnVjdCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3N0cnVjdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3QgbGlzdCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X2xpc3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IHNldCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3NldCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3QgbWFwIChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3RfbWFwKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gaW5zZXJ0IGNvbnN0YW50IHZhbHVlcyBpbnRvIGEgcnVzdCB2ZWMgb3Igc2V0LiBUaGUKKyAgLy8gYGluc2VydF9mdW5jdGlvbmAgaXMgdGhlIHJ1c3QgZnVuY3Rpb24gdGhhdCB3ZSdsbCB1c2UgdG8gaW5zZXJ0IHRoZSBlbGVtZW50cy4KKyAgdm9pZCByZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKAorICAgIGNvbnN0IHN0cmluZyYgaW5zZXJ0X2Z1bmN0aW9uLAorICAgIHRfdHlwZSogdHR5cGUsCisgICAgdF9jb25zdF92YWx1ZSogdHZhbHVlCisgICk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgc3RydWN0IHRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4gU2V0IGBzdHJ1Y3RfdHlwZWAgdG8gYFRfQVJHU2AKKyAgLy8gaWYgcmVuZGVyaW5nIHRoZSBzdHJ1Y3QgdXNlZCB0byBwYWNrIGFyZ3VtZW50cyBmb3IgYSBzZXJ2aWNlIGNhbGwuIFdoZW4gYHN0cnVjdF90eXBlYCBpcyBgVF9BUkdTYCB0aGUKKyAgLy8gc3RydWN0IGFuZCBpdHMgbWVtYmVycyBoYXZlIG1vZHVsZSB2aXNpYmlsaXR5LCBhbmQgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQuIFdoZW4gYHN0cnVjdF90eXBlYCBpcworICAvLyBhbnl0aGluZyBlbHNlIHRoZSBzdHJ1Y3QgYW5kIGl0cyBtZW1iZXJzIGhhdmUgcHVibGljIHZpc2liaWxpdHkgYW5kIGZpZWxkcyBoYXZlIHRoZSB2aXNpYmlsaXR5IHNldAorICAvLyBpbiB0aGVpciBkZWZpbml0aW9uLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3QoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBXcml0ZSB0aGUgY29tbWVudCBibG9jayBwcmVjZWRpbmcgYSB0eXBlIGRlZmluaXRpb24gKGFuZCBpbXBsZW1lbnRhdGlvbikuCisgIHZvaWQgcmVuZGVyX3R5cGVfY29tbWVudChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHRocmlmdCBzdHJ1Y3QuIFN1cHBvcnRzIGFyZ3VtZW50IHN0cnVjdHMsIHJlc3VsdCBzdHJ1Y3RzLAorICAvLyB1c2VyLWRlZmluZWQgc3RydWN0cyBhbmQgZXhjZXB0aW9uIHN0cnVjdHMuIFRoZSBleGFjdCBzdHJ1Y3QgdHlwZSB0byBiZSBnZW5lcmF0ZWQgaXMgY29udHJvbGxlZAorICAvLyBieSB0aGUgYHN0cnVjdF90eXBlYCBwYXJhbWV0ZXIsIHdoaWNoIChhbW9uZyBvdGhlciB0aGluZ3MpIG1vZGlmaWVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQorICAvLyB3cml0dGVuIHN0cnVjdCBhbmQgbWVtYmVycywgY29udHJvbHMgd2hpY2ggdHJhaXQgaW1wbGVtZW50YXRpb25zIGFyZSBnZW5lcmF0ZWQuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9kZWZpbml0aW9uKAorICAgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKyAgKTsKKworICAvLyBXcml0ZXMgdGhlIGltcGwgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgc3RydWN0LiBBdCBtaW5pbXVtIHRoaXMKKyAgLy8gY29udGFpbnMgdGhlIG1ldGhvZHMgdG8gcmVhZCBmcm9tIGEgcHJvdG9jb2wgYW5kIHdyaXRlIHRvIGEgcHJvdG9jb2wuIEFkZGl0aW9uYWwgbWV0aG9kcyBtYXkKKyAgLy8gYmUgZ2VuZXJhdGVkIGRlcGVuZGluZyBvbiBgc3RydWN0X3R5cGVgLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfaW1wbCgKKyAgICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCisgICk7CisKKyAgLy8gR2VuZXJhdGUgYSBgZm4gbmV3KC4uLilgIGZvciBhIHN0cnVjdCB3aXRoIG5hbWUgYHN0cnVjdF9uYW1lYCBhbmQgdHlwZSBgdF9zdHJ1Y3RgLiBUaGUgYXV0by1nZW5lcmF0ZWQKKyAgLy8gY29kZSBtYXkgaW5jbHVkZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVycyB0byBtYWtlIHRoZSBjb25zdHJ1Y3RvciBtb3JlIGVyZ29ub21pYy4gYHN0cnVjdF90eXBlYCBjb250cm9scworICAvLyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZ2VuZXJhdGVkIGNvbnN0cnVjdG9yLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfY29uc3RydWN0b3IoCisgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorICApOworCisgIC8vIFdyaXRlIHRoZSBgb2tfb3JgIG1ldGhvZCBhZGRlZCB0byBhbGwgVGhyaWZ0IHNlcnZpY2UgY2FsbCByZXN1bHQgc3RydWN0cy4gWW91IGNhbiB1c2UgdGhpcyBtZXRob2QKKyAgLy8gdG8gY29udmVydCBhIHN0cnVjdCBpbnRvIGEgYFJlc3VsdGAgYW5kIHVzZSBpdCBpbiBhIGB0cnkhYCBvciBjb21iaW5hdG9yIGNoYWluLgorICB2b2lkIHJlbmRlcl9yZXN1bHRfc3RydWN0X3RvX3Jlc3VsdF9tZXRob2QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBgRXJyb3JgIGFuZCBgRGVidWdgIHRyYWl0cy4gVGhlc2UgdHJhaXRzIGFyZSBuZWNlc3NhcnkgZm9yIGEKKyAgLy8gdXNlci1kZWZpbmVkIGV4Y2VwdGlvbiB0byBiZSBwcm9wZXJseSBoYW5kbGVkIGFzIFJ1c3QgZXJyb3JzLgorICB2b2lkIHJlbmRlcl9leGNlcHRpb25fc3RydWN0X2Vycm9yX3RyYWl0X2ltcGxzKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgYERlZmF1bHRgLiBUaGlzIHRyYWl0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBvbmx5IHRoZSBmaWVsZHMgeW91IHdhbnQKKyAgLy8gYW5kIHVzZSBgLi5EZWZhdWx0OjpkZWZhdWx0KClgIHRvIGZpbGwgaW4gdGhlIHJlc3QuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9kZWZhdWx0X3RyYWl0X2ltcGwoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBzdHJ1Y3QgdG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uIElmIGBzdHJ1Y3RfdHlwZWAgaXMgYFRfQVJHU2AKKyAgLy8gdGhlbiBhbGwgZmllbGRzIGFyZSBjb25zaWRlcmVkICJyZXF1aXJlZCIsIGlmIG5vdCwgdGhlIGRlZmF1bHQgb3B0aW9uYWxpdHkgaXMgdXNlZC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X3N5bmNfd3JpdGUodF9zdHJ1Y3QgKnRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgc2luZ2xlIHN0cnVjdCBmaWVsZCB0byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4gVW5wYWNrcyB0aGUKKyAgLy8gdmFyaWFibGUgKHNpbmNlIGl0IG1heSBiZSBvcHRpb25hbCkgYW5kIHNlcmlhbGl6ZXMgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25hbGl0eSBydWxlcyByZXF1aXJlZCBieSBgcmVxYC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBmaWVsZF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZSgKKyAgICBjb25zdCBzdHJpbmcgJmZpZWxkX3ZhciwKKyAgICBib29sIGZpZWxkX3Zhcl9pc19yZWYsCisgICAgdF9maWVsZCAqdGZpZWxkLAorICAgIHRfZmllbGQ6OmVfcmVxIHJlcSk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgc2luZ2xlIHR5cGUgKGkuZS4gYSBpMzIgZXRjLikgdG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgdHlwZV92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgYm9vbCB0eXBlX3Zhcl9pc19yZWYsIHRfdHlwZSAqdHR5cGUpOworCisgIC8vIFdyaXRlIGEgbGlzdCB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBgbGlzdF92YXJpYWJsZWAgaXMgdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIGxpc3QKKyAgLy8gdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBsaXN0X3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX2xpc3Rfc3luY193cml0ZShjb25zdCBzdHJpbmcgJmxpc3RfdmFyLCBib29sIGxpc3RfdmFyX2lzX3JlZiwgdF9saXN0ICp0bGlzdCk7CisKKyAgLy8gV3JpdGUgYSBzZXQgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gYHNldF92YXJpYWJsZWAgaXMgdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHNldCB0aGF0IHdpbGwKKyAgLy8gYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYHNldF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9zZXRfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnNldF92YXIsIGJvb2wgc2V0X3Zhcl9pc19yZWYsIHRfc2V0ICp0c2V0KTsKKworICAvLyBXcml0ZSBhIG1hcCB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBgbWFwX3ZhcmlhYmxlYCBpcyB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgbWFwIHRoYXQgd2lsbAorICAvLyBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgbWFwX3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX21hcF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbWFwX3ZhciwgYm9vbCBtYXBfdmFyX2lzX3JlZiwgdF9tYXAgKnRzZXQpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgd2UgbmVlZCB0byBkZXJlZmVyZW5jZSB0aHMgdHlwZSB3aGVuIHdyaXRpbmcgYW4gZWxlbWVudCBmcm9tIGEgY29udGFpbmVyLgorICAvLyBJdGVyYXRpb25zIG9uIHJ1c3QgY29udGFpbmVycyBhcmUgcGVyZm9ybWVkIGFzIGZvbGxvd3M6IGBmb3IgdiBpbiAmdmFsdWVzIHsgLi4uIH1gCisgIC8vIHdoZXJlIGB2YCBoYXMgdHlwZSBgJlJVU1RfVFlQRWAgQWxsIGRlZmluZWQgZnVuY3Rpb25zIHRha2UgcHJpbWl0aXZlcyBieSB2YWx1ZSwgc28sIGlmIHRoZQorICAvLyByZW5kZXJlZCBjb2RlIGlzIGNhbGxpbmcgc3VjaCBhIGZ1bmN0aW9uIGl0IGhhcyB0byBkZXJlZmVyZW5jZSBgdmAuCisgIGJvb2wgbmVlZHNfZGVyZWZfb25fY29udGFpbmVyX3dyaXRlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiB0aGUgdmFyaWFibGUgKGluY2x1ZGluZyBhbGwgZGVyZWZlcmVuY2VzKSByZXF1aXJlZCB0byB3cml0ZSB2YWx1ZXMgZnJvbSBhIHJ1c3QgY29udGFpbmVyCisgIC8vIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2VyZSBpdGVyYXRpbmcgdGhyb3VnaCBhIGNvbnRhaW5lciBhbmQgdXNpbmcgdGhlIHRlbXAKKyAgLy8gdmFyaWFibGUgYHZgIHRvIHJlcHJlc2VudCBlYWNoIGVsZW1lbnQsIHRoZW4gYHR0eXBlYCBpcyB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGNvbnRhaW5lciBhbmQKKyAgLy8gYGJhc2VfdmFyYCBpcyAidiIuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmcgeW91IHdpbGwgaGF2ZSB0byB1c2UgdG8gcHJvcGVybHkgcmVmZXJlbmNlCisgIC8vIHRoZSB0ZW1wIHZhcmlhYmxlIGZvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIHN0cmluZyBzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKHRfdHlwZSogdHR5cGUsIGNvbnN0IHN0cmluZyYgYmFzZV92YXIpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIHJlYWQgYnl0ZXMgZnJvbSB0aGUgd2lyZSBpbnRvIHRoZSBnaXZlbiBgdF9zdHJ1Y3RgLiBgc3RydWN0X25hbWVgIGlzIHRoZQorICAvLyBhY3R1YWwgUnVzdCBuYW1lIG9mIHRoZSBgdF9zdHJ1Y3RgLiBJZiBgc3RydWN0X3R5cGVgIGlzIGBUX0FSR1NgIHRoZW4gYWxsIHN0cnVjdCBmaWVsZHMgYXJlCisgIC8vIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlLCB0aGUgZmllbGQncyBkZWZhdWx0IG9wdGlvbmFsaXR5IGlzIHVzZWQuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCBmdW5jdGlvbiB0aGF0IGRlc2VyaWFsaXplcyBhIHNpbmdsZSB0eXBlIChpLmUuIGkzMiBldGMuKSBmcm9tIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLgorICAvLyBTZXQgYGlzX2JveGVkYCB0byBgdHJ1ZWAgaWYgdGhlIHJlc3VsdGluZyB2YWx1ZSBzaG91bGQgYmUgd3JhcHBlZCBpbiBhIGBCb3g6Om5ldyguLi4pYC4KKyAgdm9pZCByZW5kZXJfdHlwZV9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgdF90eXBlICp0dHlwZSwgYm9vbCBpc19ib3hlZCA9IGZhbHNlKTsKKworICAvLyBSZWFkIHRoZSB3aXJlIHJlcHJlc2VudGF0aW9uIG9mIGEgbGlzdCBhbmQgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBydXN0IGltcGxlbWVudGF0aW9uLgorICAvLyBUaGUgZGVzZXJpYWxpemVkIGxpc3QgaXMgc3RvcmVkIGluIGBsaXN0X3ZhcmlhYmxlYC4KKyAgdm9pZCByZW5kZXJfbGlzdF9zeW5jX3JlYWQodF9saXN0ICp0bGlzdCwgY29uc3Qgc3RyaW5nICZsaXN0X3ZhcmlhYmxlKTsKKworICAvLyBSZWFkIHRoZSB3aXJlIHJlcHJlc2VudGF0aW9uIG9mIGEgc2V0IGFuZCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIHJ1c3QgaW1wbGVtZW50YXRpb24uCisgIC8vIFRoZSBkZXNlcmlhbGl6ZWQgc2V0IGlzIHN0b3JlZCBpbiBgc2V0X3ZhcmlhYmxlYC4KKyAgdm9pZCByZW5kZXJfc2V0X3N5bmNfcmVhZCh0X3NldCAqdHNldCwgY29uc3Qgc3RyaW5nICZzZXRfdmFyaWFibGUpOworCisgIC8vIFJlYWQgdGhlIHdpcmUgcmVwcmVzZW50YXRpb24gb2YgYSBtYXAgYW5kIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgcnVzdCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVGhlIGRlc2VyaWFsaXplZCBtYXAgaXMgc3RvcmVkIGluIGBtYXBfdmFyaWFibGVgLgorICB2b2lkIHJlbmRlcl9tYXBfc3luY19yZWFkKHRfbWFwICp0bWFwLCBjb25zdCBzdHJpbmcgJm1hcF92YXJpYWJsZSk7CisKKyAgLy8gUmV0dXJuIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHVzZWQgdG8gc3RvcmUgdmFsdWVzIHdoZW4gZGVzZXJpYWxpemluZyBuZXN0ZWQgY29udGFpbmVycy4KKyAgc3RyaW5nIHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodF9maWVsZCogdGZpZWxkKTsKKworICAvLyBUb3AtbGV2ZWwgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgdmFyaW91cyByZW5kZXIgZnVuY3Rpb25zIG5lY2Vzc2FyeSB0byB3cml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbgorICAvLyBvZiBhIHRocmlmdCB1bmlvbiAoaS5lLiBhbiBlbnVtKS4KKyAgdm9pZCByZW5kZXJfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFRocmlmdCB1bmlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25fZGVmaW5pdGlvbihjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgZW51bSBpbXBsICh3aXRoIHJlYWQvd3JpdGUgZnVuY3Rpb25zKSBmb3IgdGhlIFRocmlmdCB1bmlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25faW1wbChjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgYEVOVU06OndyaXRlX3RvX291dF9wcm90b2NvbGAgZnVuY3Rpb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGBFTlVNOjpyZWFkX2Zyb21faW5fcHJvdG9jb2xgIGZ1bmN0aW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCk7CisKKyAgLy8gVG9wLWxldmVsIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIHZhcmlvdXMgcmVuZGVyIGZ1bmN0aW9ucyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24KKyAgLy8gb2YgYSBUaHJpZnQgY2xpZW50LgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgdHJhaXQgd2l0aCB0aGUgc2VydmljZS1jYWxsIG1ldGhvZHMgZm9yIGB0c2VydmljZWAuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSB0cmFpdCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY2xpZW50IGltcGwgaWYgZW5kIHVzZXJzIGNhbiB1c2UgaXQgdG8gbWFrZSBzZXJ2aWNlIGNhbGxzLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gY3JlYXRlIHRoZSBUaHJpZnQgc2VydmljZSBzeW5jIGNsaWVudCBzdHJ1Y3QgYW5kIGl0cyBtYXRjaGluZyAnaW1wbCcgYmxvY2suCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X2RlZmluaXRpb25fYW5kX2ltcGwoY29uc3Qgc3RyaW5nJiBjbGllbnRfaW1wbF9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBjcmVhdGUgdGhlIGBTeW5jQ2xpZW50OjpuZXdgIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIGFueSBvdGhlciBmdW5jdGlvbnMKKyAgLy8gY2FsbGVycyB3b3VsZCBsaWtlIHRvIHVzZSBvbiB0aGUgVGhyaWZ0IHNlcnZpY2Ugc3luYyBjbGllbnQuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X2xpZmVjeWNsZV9mdW5jdGlvbnMoY29uc3Qgc3RyaW5nJiBjbGllbnRfc3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBjcmVhdGUgdGhlIGltcGwgYmxvY2sgZm9yIHRoZSBgVFRocmlmdENsaWVudGAgdHJhaXQuIFNpbmNlIGdlbmVyYXRlZAorICAvLyBSdXN0IFRocmlmdCBjbGllbnRzIHBlcmZvcm0gYWxsIHRoZWlyIG9wZXJhdGlvbnMgdXNpbmcgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgdHJhaXQsIHdlCisgIC8vIGhhdmUgdG8gaW1wbGVtZW50IGl0IGZvciB0aGUgY2xpZW50IHN0cnVjdHMuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X3R0aHJpZnRjbGllbnRfaW1wbChjb25zdCBzdHJpbmcgJmNsaWVudF9pbXBsX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBtYXJrZXIgdHJhaXRzIGZvciBhbnkgc2VydmljZShzKSBiZWluZyBleHRlbmRlZCwgaW5jbHVkaW5nIHRoZSBvbmUgZm9yIHRoZSBjdXJyZW50CisgIC8vIHNlcnZpY2UgaXRzZWxmIChpLmUuIGB0c2VydmljZWApCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCBjb25zdCBzdHJpbmcgJmltcGxfc3RydWN0X25hbWUpOworCisgIC8vIEdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgdGhlIHRyYWl0cyB0aGlzIFRocmlmdCBjbGllbnQgc3RydWN0IGV4dGVuZHMuCisgIHN0cmluZyBzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24odF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gVG9wLWxldmVsIGZ1bmN0aW9uIHRoYXQgd3JpdGVzIHRoZSBjb2RlIHRvIG1ha2UgdGhlIFRocmlmdCBzZXJ2aWNlIGNhbGxzLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9wcm9jZXNzX2ltcGwodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIGFjdHVhbCBmdW5jdGlvbiB0aGF0IGNhbGxzIG91dCB0byB0aGUgcmVtb3RlIHNlcnZpY2UgYW5kIHByb2Nlc3NlcyBpdHMgcmVzcG9uc2UuCisgIHZvaWQgcmVuZGVyX3N5bmNfc2VuZF9yZWN2X3dyYXBwZXIodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFdyaXRlIHRoZSBgc2VuZGAgZnVuY3Rpb25hbGl0eSBmb3IgYSBUaHJpZnQgc2VydmljZSBjYWxsIHJlcHJlc2VudGVkIGJ5IGEgYHRfc2VydmljZS0+dF9mdW5jdGlvbmAuCisgIHZvaWQgcmVuZGVyX3N5bmNfc2VuZCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gV3JpdGUgdGhlIGByZWN2YCBmdW5jdGlvbmFsaXR5IGZvciBhIFRocmlmdCBzZXJ2aWNlIGNhbGwgcmVwcmVzZW50ZWQgYnkgYSBgdF9zZXJ2aWNlLT50X2Z1bmN0aW9uYC4KKyAgLy8gVGhpcyBtZXRob2QgaXMgb25seSByZW5kZXJlZCBpZiB0aGUgZnVuY3Rpb24gaXMgKm5vdCogb25ld2F5LgorICB2b2lkIHJlbmRlcl9zeW5jX3JlY3YodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc29yKHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzb3JfZGVmaW5pdGlvbl9hbmRfaW1wbCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKHRfc2VydmljZSAqdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZnVuY3Rpb24odF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmaGFuZGxlcl90eXBlKTsKKyAgdm9pZCByZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfc3VjY2VlZGVkKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfdXNlcl9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9hcHBsaWNhdGlvbl9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmFwcF9lcnJfdmFyKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9kZWZhdWx0X2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmZXJyX3Zhcik7CisgIHZvaWQgcmVuZGVyX3NlcnZpY2VfY2FsbF9zdHJ1Y3RzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zZXJ2aWNlX2NhbGxfcmVzdWx0X3ZhbHVlX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgc3RyaW5nIGhhbmRsZXJfc3VjY2Vzc2Z1bF9yZXR1cm5fc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBXcml0ZXMgdGhlIHJlc3VsdCBvZiBgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3RgIHdyYXBwZWQgaW4gYW4gYEVycih0aHJpZnQ6OkVycm9yKC4uLikpYC4KKyAgdm9pZCByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3Jfa2luZCwKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorICApOworCisgIC8vIFdyaXRlIGEgdGhyaWZ0OjpFcnJvciB2YXJpYW50IHN0cnVjdC4gRXJyb3Igc3RydWN0cyB0YWtlIHRoZSBmb3JtOgorICAvLyBgYGAKKyAgLy8gcHViIHN0cnVjdCBlcnJvcl9zdHJ1Y3QgeworICAvLyAgIGtpbmQ6IHN1Yl9lcnJvcl9raW5kLAorICAvLyAgIG1lc3NhZ2U6IGVycm9yX21lc3NhZ2UsCisgIC8vIH0KKyAgLy8gYGBgCisgIC8vIEEgY29uY3JldGUgZXhhbXBsZSBpczoKKyAgLy8gYGBgCisgIC8vICBwdWIgc3RydWN0IEFwcGxpY2F0aW9uRXJyb3IgeworICAvLyAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgLy8gICAgbWVzc2FnZTogIlRoaXMgaXMgc29tZSBlcnJvciBtZXNzYWdlIiwKKyAgLy8gIH0KKyAgLy8gYGBgCisgIHZvaWQgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJfZXJyb3Jfa2luZCwKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKyAgKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIHVucGFja2VkIHNlcnZpY2UgY2FsbCBhcmdzIGdpdmVuIGEgc2VydmljZSBjYWxsIGZ1bmN0aW9uCisgIC8vIGB0X2Z1bmN0aW9uYC4gUHJlcGVuZHMgdGhlIGFyZ3Mgd2l0aCBlaXRoZXIgYCZtdXQgc2VsZmAgb3IgYCZzZWxmYCBhbmQgaW5jbHVkZXMgdGhlIGFyZyB0eXBlcworICAvLyBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLCBmb3IgZXhhbXBsZToKKyAgLy8gYGZuIGZvbygmbXV0IHNlbGYsIGZpZWxkXzA6IFN0cmluZylgLgorICBzdHJpbmcgcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBzZWxmX2lzX211dGFibGUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgdW5wYWNrZWQgc2VydmljZSBjYWxsIGFyZ3MgZ2l2ZW4gYSBzZXJ2aWNlIGNhbGwgZnVuY3Rpb24KKyAgLy8gYHRfZnVuY3Rpb25gLiBPbmx5IGluY2x1ZGVzIHRoZSBhcmcgbmFtZXMsIGVhY2ggb2Ygd2hpY2ggaXMgcHJlZml4ZWQgd2l0aCB0aGUgb3B0aW9uYWwgcHJlZml4CisgIC8vIGBmaWVsZF9wcmVmaXhgLCBmb3IgZXhhbXBsZTogYHNlbGYuZmllbGRfMGAuCisgIHN0cmluZyBydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4ID0gIiIpOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIHN0cnVjdCBgdHN0cnVjdGAgZm9yIHVzZSBpbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAvLyBFYWNoIGZpZWxkIGlzIGZvbGxvd2VkIGJ5IGl0cyB0eXBlLCBmb3IgZXhhbXBsZTogYGZpZWxkXzA6IFN0cmluZ2AuCisgIHN0cmluZyBzdHJ1Y3RfdG9fZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QgYHRzdHJ1Y3RgIGZvciB1c2UgaW4gYSBmdW5jdGlvbiBjYWxsLAorICAvLyBmb3IgZXhhbXBsZTogYGZpZWxkXzA6IFN0cmluZ2AuCisgIHN0cmluZyBzdHJ1Y3RfdG9faW52b2NhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXggPSAiIik7CisKKyAgLy8gV3JpdGUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGEgc3RydWN0LCBzZXJ2aWNlLWNhbGwgb3Igb3RoZXIgZG9jdW1lbnRhdGlvbi1hbm5vdGF0ZWQgZWxlbWVudC4KKyAgdm9pZCByZW5kZXJfcnVzdGRvYyh0X2RvYyogdGRvYyk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgdHJ1ZSB0eXBlIG9mIGB0dHlwZWAgaXMgYSB0aHJpZnQgZG91YmxlLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBpc19kb3VibGUodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcnVzdCB0eXBlIGdpdmVuIGEgYHRfdHlwZWAuCisgIHN0cmluZyB0b19ydXN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0ID0gdHJ1ZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYGNvbnN0YCBydXN0IHR5cGUgZ2l2ZW4gYSBgdF90eXBlYAorICBzdHJpbmcgdG9fcnVzdF9jb25zdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCA9IHRydWUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJpZnQgYHByb3RvY29sOjpUVHlwZWAgZ2l2ZW4gYSBgdF90eXBlYC4KKyAgc3RyaW5nIHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSB0byBiZSB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIGEgc3RydWN0IGZpZWxkIHdoaWNoIGhhcyBgT1BUX0lOX1JFUV9PVVRgCisgIC8vIG9wdGlvbmFsaXR5LgorICBzdHJpbmcgb3B0X2luX3JlcV9vdXRfdmFsdWUodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBjYW4gd3JpdGUgYSBjb25zdCBvZiB0aGUgZm9ybSBgcHViIGNvbnN0IEZPTzogLi4uYC4KKyAgYm9vbCBjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgd2UgY2Fubm90IHdyaXRlIGEgc3RhbmRhcmQgUnVzdCBjb25zdGFudCAoYmVjYXVzZSB0aGUgdHlwZSBuZWVkcyBzb21lIGFsbG9jYXRpb24pLgorICBib29sIGNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgYSB2b2lkLCBhbmQgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBydXN0IGAoKWAgdHlwZS4KKyAgYm9vbCBpc192b2lkKHRfdHlwZSogdHR5cGUpOworCisgIHRfZmllbGQ6OmVfcmVxIGFjdHVhbF9maWVsZF9yZXEodF9maWVsZCogdGZpZWxkLCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGlzIGB0X2ZpZWxkOjplX3JlcWAgaXMgZWl0aGVyIGB0X2ZpZWxkOjpUX09QVElPTkFMYCBvciBgdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVGAKKyAgLy8gYW5kIG5lZWRzIHRvIGJlIHdyYXBwZWQgYnkgYW4gYE9wdGlvbjxUWVBFX05BTUU+YCwgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaXNfb3B0aW9uYWwodF9maWVsZDo6ZV9yZXEgcmVxKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBzZXJ2aWNlIGNhbGwgaGFzIGFyZ3VtZW50cywgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaGFzX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgYSBzZXJ2aWNlIGNhbGwgaGFzIG5vbi1gKClgIGFyZ3VtZW50cywgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaGFzX25vbl92b2lkX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiBgcHViIGAgKG5vdGljZSB0cmFpbGluZyB3aGl0ZXNwYWNlISkgaWYgdGhlIHN0cnVjdCBzaG91bGQgYmUgcHVibGljLCBgYCAoZW1wdHkgc3RyaW5nKSBvdGhlcndpc2UuCisgIHN0cmluZyB2aXNpYmlsaXR5X3F1YWxpZmllcih0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgYSBnaXZlbiBUaHJpZnQgc2VydmljZS4gSWYgdGhlIHR5cGUgaXMgZGVmaW5lZCBpbiB0aGUgcHJlc2VudGx5LWNvbXB1dGVkCisgIC8vIFRocmlmdCBwcm9ncmFtLCB0aGVuIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAgc3RyaW5nIHJ1c3RfbmFtZXNwYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybnMgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIGEgZ2l2ZW4gVGhyaWZ0IHR5cGUuIElmIHRoZSB0eXBlIGlzIGRlZmluZWQgaW4gdGhlIHByZXNlbnRseS1jb21wdXRlZAorICAvLyBUaHJpZnQgcHJvZ3JhbSwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgIHN0cmluZyBydXN0X25hbWVzcGFjZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm5zIHRoZSBjYW1lbC1jYXNlZCBuYW1lIGZvciBhIFJ1c3Qgc3RydWN0IHR5cGUuIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgYHRzdHJ1Y3QtPmdldF9uYW1lKClgIGlzCisgIC8vIGEgcmVzZXJ2ZWQgd29yZC4KKyAgc3RyaW5nIHJ1c3Rfc3RydWN0X25hbWUodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFJldHVybnMgdGhlIHNuYWtlLWNhc2VkIG5hbWUgZm9yIGEgUnVzdCBmaWVsZCBvciBsb2NhbCB2YXJpYWJsZS4gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZQorICAvLyBgdGZpZWxkLT5nZXRfbmFtZSgpYCBpcyBhIHJlc2VydmVkIHdvcmQuCisgIHN0cmluZyBydXN0X2ZpZWxkX25hbWUodF9maWVsZCogdHN0cnVjdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgY2FtZWwtY2FzZWQgbmFtZSBmb3IgYSBSdXN0IHVuaW9uIHR5cGUuIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgYHRzdHJ1Y3QtPmdldF9uYW1lKClgIGlzCisgIC8vIGEgcmVzZXJ2ZWQgd29yZC4KKyAgc3RyaW5nIHJ1c3RfdW5pb25fZmllbGRfbmFtZSh0X2ZpZWxkKiB0c3RydWN0KTsKKworICAvLyBDb252ZXJ0cyBhbnkgdmFyaWFibGUgbmFtZSBpbnRvIGEgJ3NhZmUnIHZhcmlhbnQgdGhhdCBkb2VzIG5vdCBjbGFzaCB3aXRoIGFueSBSdXN0IHJlc2VydmVkIGtleXdvcmRzLgorICBzdHJpbmcgcnVzdF9zYWZlX25hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoZSBuYW1lIGlzIGEgcmVzZXJ2ZWQgUnVzdCBrZXl3b3JkLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBpc19yZXNlcnZlZChjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCB1c2VycyB3aWxsIGludm9rZSB0byBtYWtlIG91dGdvaW5nIHNlcnZpY2UgY2FsbHMuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCB1c2VycyB3aWxsIGhhdmUgdG8gaW1wbGVtZW50IHRvIGhhbmRsZSBpbmNvbWluZyBzZXJ2aWNlIGNhbGxzLgorICBzdHJpbmcgc2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgdXNlZCB0byBwYWNrIHRoZSBhcmd1bWVudHMgZm9yIHRoZSB0aHJpZnQgc2VydmljZSBjYWxsLgorICBzdHJpbmcgc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3RydWN0IHVzZWQgdG8gcGFjayB0aGUgcmV0dXJuIHZhbHVlCisgIC8vIGFuZCB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucyBmb3IgdGhlIHRocmlmdCBzZXJ2aWNlIGNhbGwuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICBzdHJpbmcgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHRyYWl0IG5hbWUgZm9yIHRoZSBzeW5jIHNlcnZpY2UgY2xpZW50IGdpdmVuIGEgYHRfc2VydmljZWAuCisgIHN0cmluZyBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIGZvciB0aGUgc3luYyBzZXJ2aWNlIGNsaWVudCBzdHJ1Y3QgZ2l2ZW4gYSBgdF9zZXJ2aWNlYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19jbGllbnRfaW1wbF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgdHJhaXQgbmFtZSB0aGF0IHVzZXJzIHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgZm9yIHRoZSBzZXJ2ZXIgaGFsZiBvZiBhIFRocmlmdCBzZXJ2aWNlLgorICBzdHJpbmcgcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHN0cnVjdCBuYW1lIGZvciB0aGUgIHNlcnZlciBoYWxmIG9mIGEgVGhyaWZ0IHNlcnZpY2UuCisgIHN0cmluZyBydXN0X3N5bmNfcHJvY2Vzc29yX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBzdHJ1Y3QgbmFtZSBmb3IgdGhlIHN0cnVjdCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgc2VydmljZS1jYWxsIGltcGxlbWVudGF0aW9ucyBmb3IKKyAgLy8gdGhlIHNlcnZlciBoYWxmIG9mIGEgVGhyaWZ0IHNlcnZpY2UuCisgIHN0cmluZyBydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHZhcmlhbnQgbmFtZSBmb3IgYW4gZW51bSB2YXJpYW50CisgIHN0cmluZyBydXN0X2VudW1fdmFyaWFudF9uYW1lKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUHJvcGVybHkgdXBwZXJjYXNlIG5hbWVzIGZvciB1c2UgaW4gUnVzdC4KKyAgc3RyaW5nIHJ1c3RfdXBwZXJfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFNuYWtlLWNhc2UgZmllbGQsIHBhcmFtZXRlciBhbmQgZnVuY3Rpb24gbmFtZXMgYW5kIG1ha2UgdGhlbSBSdXN0IGZyaWVuZGx5LgorICBzdHJpbmcgcnVzdF9zbmFrZV9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gQ2FtZWwtY2FzZSB0eXBlL3ZhcmlhbnQgbmFtZXMgYW5kIG1ha2UgdGhlbSBSdXN0IGZyaWVuZGx5LgorICBzdHJpbmcgcnVzdF9jYW1lbF9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mIGBzZWFyY2hfc3RyaW5nYCB3aXRoIGByZXBsYWNlX3N0cmluZ2AgaW4gYHRhcmdldGAuCisgIHZvaWQgc3RyaW5nX3JlcGxhY2Uoc3RyaW5nJiB0YXJnZXQsIGNvbnN0IHN0cmluZyYgc2VhcmNoX3N0cmluZywgY29uc3Qgc3RyaW5nJiByZXBsYWNlX3N0cmluZyk7Cit9OworCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gbWFrZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGlzIHRocmlmdCBwcm9ncmFtCisgIE1LRElSKGdlbl9kaXJfLmNfc3RyKCkpOworCisgIC8vIGNyZWF0ZSB0aGUgZmlsZSBpbnRvIHdoaWNoIHdlJ3JlIGdvaW5nIHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgY29kZQorICBzdHJpbmcgZl9nZW5fbmFtZSA9IGdlbl9kaXJfICsgIi8iICsgcnVzdF9zbmFrZV9jYXNlKGdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIi5ycyI7CisgIGZfZ2VuXy5vcGVuKGZfZ2VuX25hbWUuY19zdHIoKSk7CisKKyAgLy8gaGVhZGVyIGNvbW1lbnQKKyAgZl9nZW5fIDw8ICIvLyAiIDw8IGF1dG9nZW5fc3VtbWFyeSgpIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgcmVuZGVyX2F0dHJpYnV0ZXNfYW5kX2luY2x1ZGVzKCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9hdHRyaWJ1dGVzX2FuZF9pbmNsdWRlcygpIHsKKyAgLy8gdHVybiBvZmYgc29tZSBjb21waWxlci9jbGlwcHkgd2FybmluZ3MKKworICAvLyBjb2RlIGFsd2F5cyBpbmNsdWRlcyBCVHJlZU1hcC9CVHJlZVNldC9PcmRlcmVkRmxvYXQKKyAgZl9nZW5fIDw8ICIjIVthbGxvdyh1bnVzZWRfaW1wb3J0cyldIiA8PCBlbmRsOworICAvLyBjb2RlIG1pZ2h0IG5vdCBpbmNsdWRlIGltcG9ydHMgZnJvbSBjcmF0ZXMKKyAgZl9nZW5fIDw8ICIjIVthbGxvdyh1bnVzZWRfZXh0ZXJuX2NyYXRlcyldIiA8PCBlbmRsOworICAvLyBjb25zdHJ1Y3RvcnMgdGFrZSAqYWxsKiBzdHJ1Y3QgcGFyYW1ldGVycywgd2hpY2ggY2FuIHRyaWdnZXIgdGhlICJ0b28gbWFueSBhcmd1bWVudHMiIHdhcm5pbmcKKyAgLy8gc29tZSBhdXRvLWdlbidkIHR5cGVzIGNhbiBiZSBkZWVwbHkgbmVzdGVkLiBjbGlwcHkgcmVjb21tZW5kcyBmYWN0b3JpbmcgdGhlbSBvdXQgd2hpY2ggaXMgaGFyZCB0byBhdXRvZ2VuCisgIGZfZ2VuXyA8PCAiIyFbY2ZnX2F0dHIoZmVhdHVyZSA9IFwiY2FyZ28tY2xpcHB5XCIsIGFsbG93KHRvb19tYW55X2FyZ3VtZW50cywgdHlwZV9jb21wbGV4aXR5KSldIiA8PCBlbmRsOworICAvLyBwcmV2ZW50IHJ1c3RmbXQgZnJvbSBydW5uaW5nIGFnYWluc3QgdGhpcyBmaWxlCisgIC8vIGxpbmVzIGFyZSB0b28gbG9uZywgY29kZSBpcyAodGhhbmtmdWxseSEpIG5vdCB2aXN1YWwtaW5kZW50ZWQsIGV0Yy4KKyAgZl9nZW5fIDw8ICIjIVtjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10X3NraXApXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gYWRkIHN0YW5kYXJkIGluY2x1ZGVzCisgIGZfZ2VuXyA8PCAiZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgImV4dGVybiBjcmF0ZSB0aHJpZnQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgImV4dGVybiBjcmF0ZSB0cnlfZnJvbTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBvcmRlcmVkX2Zsb2F0OjpPcmRlcmVkRmxvYXQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmNlbGw6OlJlZkNlbGw7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Y29udmVydDo6RnJvbTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6ZGVmYXVsdDo6RGVmYXVsdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6ZXJyb3I6OkVycm9yOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpmbXQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmZtdDo6e0Rpc3BsYXksIEZvcm1hdHRlcn07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OnJjOjpSYzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRyeV9mcm9tOjpUcnlGcm9tOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6e0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kLCBQcm90b2NvbEVycm9yLCBQcm90b2NvbEVycm9yS2luZCwgVFRocmlmdENsaWVudH07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEZpZWxkSWRlbnRpZmllciwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6ZmllbGRfaWQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfZXhwZWN0ZWRfbWVzc2FnZV90eXBlOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X2V4cGVjdGVkX3NlcXVlbmNlX251bWJlcjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9leHBlY3RlZF9zZXJ2aWNlX2NhbGw7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfcmVxdWlyZWRfZmllbGRfZXhpc3RzOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRQcm9jZXNzb3I7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBhZGQgYWxsIHRoZSBwcm9ncmFtIGluY2x1ZGVzCisgIC8vIE5PVEU6IHRoaXMgaXMgbW9yZSBpbnZvbHZlZCB0aGFuIHlvdSB3b3VsZCBleHBlY3QgYmVjYXVzZSBvZiBzZXJ2aWNlIGV4dGVuc2lvbgorICAvLyBCYXNpY2FsbHksIEkgaGF2ZSB0byBmaW5kIHRoZSBjbG9zdXJlIG9mIGFsbCB0aGUgc2VydmljZXMgYW5kIGluY2x1ZGUgdGhlaXIgbW9kdWxlcyBhdCB0aGUgdG9wLWxldmVsCisKKyAgc2V0PHN0cmluZz4gcmVmZXJlbmNlZF9tb2R1bGVzOworCisgIC8vIGZpcnN0LCBzdGFydCBieSBhZGRpbmcgZXhwbGljaXQgdGhyaWZ0IGluY2x1ZGVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IGdldF9wcm9ncmFtKCktPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46OmNvbnN0X2l0ZXJhdG9yIGluY2x1ZGVzX2l0ZXI7CisgIGZvcihpbmNsdWRlc19pdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jbHVkZXNfaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNsdWRlc19pdGVyKSB7CisgICAgcmVmZXJlbmNlZF9tb2R1bGVzLmluc2VydCgoKmluY2x1ZGVzX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIC8vIG5leHQsIHJlY3Vyc2l2ZWx5IGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHNlcnZpY2VzIGFuZCBhZGQgdGhlIG5hbWVzIG9mIGFueSBwcm9ncmFtcyB0aGV5IHJlZmVyZW5jZQorICBjb25zdCB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBnZXRfcHJvZ3JhbSgpLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciBzZXJ2aWNlX2l0ZXI7CisgIGZvciAoc2VydmljZV9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc2VydmljZV9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3NlcnZpY2VfaXRlcikgeworICAgIGNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXMoKnNlcnZpY2VfaXRlciwgcmVmZXJlbmNlZF9tb2R1bGVzKTsKKyAgfQorCisgIC8vIGZpbmFsbHksIHdyaXRlIGFsbCB0aGUgInB1YiB1c2UuLi4iIGRlY2xhcmF0aW9ucworICBpZiAoIXJlZmVyZW5jZWRfbW9kdWxlcy5lbXB0eSgpKSB7CisgICAgc2V0PHN0cmluZz46Oml0ZXJhdG9yIG1vZHVsZV9pdGVyOworICAgIGZvciAobW9kdWxlX2l0ZXIgPSByZWZlcmVuY2VkX21vZHVsZXMuYmVnaW4oKTsgbW9kdWxlX2l0ZXIgIT0gcmVmZXJlbmNlZF9tb2R1bGVzLmVuZCgpOyArK21vZHVsZV9pdGVyKSB7CisgICAgICBmX2dlbl8gPDwgInVzZSAiIDw8IHJ1c3Rfc25ha2VfY2FzZSgqbW9kdWxlX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBmX2dlbl8gPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKAorICB0X3NlcnZpY2UgKnRzZXJ2aWNlLAorICBzZXQ8c3RyaW5nPiAmcmVmZXJlbmNlZF9tb2R1bGVzCispIHsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgaWYgKGV4dGVuZHMtPmdldF9wcm9ncmFtKCkgIT0gZ2V0X3Byb2dyYW0oKSkgeworICAgICAgcmVmZXJlbmNlZF9tb2R1bGVzLmluc2VydChleHRlbmRzLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgY29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcyhleHRlbmRzLCByZWZlcmVuY2VkX21vZHVsZXMpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl9nZW5fLmNsb3NlKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb25zdHMKKy8vCisvLyBOT1RFOiBjb25zaWRlciB1c2luZyBtYWNyb3MgdG8gZ2VuZXJhdGUgY29uc3RhbnRzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIGlzIHdvcnNlIHRoYW4gaXQgc2hvdWxkIGJlIGJlY2F1c2UgY29uc3RhbnRzCisvLyBhcmVuJ3QgKHNlbnNpYmx5KSBsaW1pdGVkIHRvIHNjYWxhciB0eXBlcwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X3R5cGUqIHR0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGlmIChjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHR0eXBlKSkgeworICAgIHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCB0dHlwZSwgdHZhbHVlKTsKKyAgfSBlbHNlIGlmIChjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHR0eXBlKSkgeworICAgIHJlbmRlcl9jb25zdF92YWx1ZV9ob2xkZXIobmFtZSwgdHR5cGUsIHR2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCBmb3IgIiArIG5hbWU7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIGlmICghY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0dHlwZSkpIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIHNpbXBsZSBydXN0IGNvbnN0YW50IGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBmX2dlbl8gPDwgInB1YiBjb25zdCAiIDw8IHJ1c3RfdXBwZXJfY2FzZShuYW1lKSA8PCAiOiAiIDw8IHRvX3J1c3RfY29uc3RfdHlwZSh0dHlwZSkgPDwgIiA9ICI7CisgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlLCBmYWxzZSk7CisgIGZfZ2VuXyA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZV9ob2xkZXIoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgaWYgKCFjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHR0eXBlKSkgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3RhbnQgaG9sZGVyIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgaG9sZGVyX25hbWUoIkNvbnN0IiArIHJ1c3RfY2FtZWxfY2FzZShuYW1lKSk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgc3RydWN0ICIgPDwgaG9sZGVyX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaW1wbCAiIDw8IGhvbGRlcl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgZm4gY29uc3RfdmFsdWUoKSAtPiAiIDw8IHRvX3J1c3RfdHlwZSh0dHlwZSkgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSwgYm9vbCBpc19vd25lZCkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmIChpc19vd25lZCkgeworICAgICAgICAgIGZfZ2VuXyA8PCAiXCIiIDw8IHR2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI8PCAgIi50b19vd25lZCgpLmludG9fYnl0ZXMoKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9nZW5fIDw8ICJiXCIiIDw8IHR2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCAiXCIiIDw8IHR2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICJcIiI7CisgICAgICAgIGlmIChpc19vd25lZCkgeworICAgICAgICAgIGZfZ2VuXyA8PCAiLnRvX293bmVkKCkiOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX2dlbl8gPDwgKHR2YWx1ZS0+Z2V0X2ludGVnZXIoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfZ2VuXyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGZfZ2VuXyA8PCAiT3JkZXJlZEZsb2F0Ojpmcm9tKCIgPDwgdHZhbHVlLT5nZXRfZG91YmxlKCkgPDwgIiBhcyBmNjQpIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IHZhbHVlIGZvciAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGdldF90cnVlX3R5cGUodHR5cGUpLCB0dmFsdWUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgdG9fcnVzdF90eXBlKHR0eXBlKQorICAgICAgPDwgIjo6dHJ5X2Zyb20oIgorICAgICAgPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpCisgICAgICA8PCAiKS5leHBlY3QoXCJleHBlY3RpbmcgdmFsaWQgY29uc3QgdmFsdWVcIikiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJlbmRlcl9jb25zdF9zdHJ1Y3QodHR5cGUsIHR2YWx1ZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHJlbmRlcl9jb25zdF9saXN0KHR0eXBlLCB0dmFsdWUpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICByZW5kZXJfY29uc3Rfc2V0KHR0eXBlLCB0dmFsdWUpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZW5kZXJfY29uc3RfbWFwKHR0eXBlLCB0dmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IGNvbnRhaW5lciB2YWx1ZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgdmFsdWUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3Rfc3RydWN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqKSB7CisgIGlmICgoKHRfc3RydWN0Kil0dHlwZSktPmlzX3VuaW9uKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ1bmltcGxlbWVudGVkISgpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInVuaW1wbGVtZW50ZWQhKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X2xpc3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgbDogVmVjPCIgPDwgdG9fcnVzdF90eXBlKGVsZW1fdHlwZSkgPDwgIj4gPSBWZWM6Om5ldygpOyIgPDwgZW5kbDsKKyAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGVsZW1faXRlcjsKKyAgZm9yKGVsZW1faXRlciA9IGVsZW1zLmJlZ2luKCk7IGVsZW1faXRlciAhPSBlbGVtcy5lbmQoKTsgKytlbGVtX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiBlbGVtX3ZhbHVlID0gKCplbGVtX2l0ZXIpOworICAgIHJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoImwucHVzaCIsIGVsZW1fdHlwZSwgZWxlbV92YWx1ZSk7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3Rfc2V0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgczogQlRyZWVTZXQ8IiA8PCB0b19ydXN0X3R5cGUoZWxlbV90eXBlKSA8PCAiPiA9IEJUcmVlU2V0OjpuZXcoKTsiIDw8IGVuZGw7CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGVsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBlbGVtX2l0ZXI7CisgIGZvcihlbGVtX2l0ZXIgPSBlbGVtcy5iZWdpbigpOyBlbGVtX2l0ZXIgIT0gZWxlbXMuZW5kKCk7ICsrZWxlbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSogZWxlbV92YWx1ZSA9ICgqZWxlbV9pdGVyKTsKKyAgICByZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKCJzLmluc2VydCIsIGVsZW1fdHlwZSwgZWxlbV92YWx1ZSk7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfbWFwKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgbTogQlRyZWVNYXA8IgorICAgIDw8IHRvX3J1c3RfdHlwZShrZXlfdHlwZSkgPDwgIiwgIiA8PCB0b19ydXN0X3R5cGUodmFsX3R5cGUpCisgICAgPDwgIj4gPSBCVHJlZU1hcDo6bmV3KCk7IgorICAgIDw8IGVuZGw7CisgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBlbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgZWxlbV9pdGVyOworICBmb3IgKGVsZW1faXRlciA9IGVsZW1zLmJlZ2luKCk7IGVsZW1faXRlciAhPSBlbGVtcy5lbmQoKTsgKytlbGVtX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiBrZXlfdmFsdWUgPSBlbGVtX2l0ZXItPmZpcnN0OworICAgIHRfY29uc3RfdmFsdWUqIHZhbF92YWx1ZSA9IGVsZW1faXRlci0+c2Vjb25kOworICAgIGlmIChnZXRfdHJ1ZV90eXBlKGtleV90eXBlKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGsgPSAiOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGtleV90eXBlLCBrZXlfdmFsdWUpOworICAgICAgZl9nZW5fIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBrID0geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGtleV90eXBlLCBrZXlfdmFsdWUpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChnZXRfdHJ1ZV90eXBlKHZhbF90eXBlKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHYgPSAiOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHZhbF90eXBlLCB2YWxfdmFsdWUpOworICAgICAgZl9nZW5fIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCB2ID0geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHZhbF90eXBlLCB2YWxfdmFsdWUpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfZ2VuXyA8PCAgaW5kZW50KCkgPDwgIm0uaW5zZXJ0KGssIHYpOyIgPDwgZW5kbDsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoCisgIGNvbnN0IHN0cmluZyYgaW5zZXJ0X2Z1bmN0aW9uLAorICB0X3R5cGUqIHR0eXBlLAorICB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUKKykgeworICBpZiAoZ2V0X3RydWVfdHlwZSh0dHlwZSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGluc2VydF9mdW5jdGlvbiA8PCAiKCI7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUpOworICAgIGZfZ2VuXyA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGluc2VydF9mdW5jdGlvbiA8PCAiKCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUeXBlZGVmcworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0ZDo6c3RyaW5nIGFjdHVhbF90eXBlID0gdG9fcnVzdF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKTsKKyAgZl9nZW5fIDw8ICJwdWIgdHlwZSAiIDw8IHJ1c3Rfc2FmZV9uYW1lKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkgPDwgIiA9ICIgPDwgYWN0dWFsX3R5cGUgPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRW51bXMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgZW51bV9uYW1lKHJ1c3RfY2FtZWxfY2FzZSh0ZW51bS0+Z2V0X25hbWUoKSkpOworICByZW5kZXJfZW51bV9kZWZpbml0aW9uKHRlbnVtLCBlbnVtX25hbWUpOworICByZW5kZXJfZW51bV9pbXBsKGVudW1fbmFtZSk7CisgIHJlbmRlcl9lbnVtX2NvbnZlcnNpb24odGVudW0sIGVudW1fbmFtZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9lbnVtX2RlZmluaXRpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpIHsKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdGVudW0pOworICBmX2dlbl8gPDwgIiNbZGVyaXZlKENvcHksIENsb25lLCBEZWJ1ZywgRXEsIEhhc2gsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAicHViIGVudW0gIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjb25zdGFudHNfaXRlcjsKKyAgZm9yIChjb25zdGFudHNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjb25zdGFudHNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY29uc3RhbnRzX2l0ZXIpIHsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqY29uc3RhbnRzX2l0ZXIpOworICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHZhbCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgcnVzdF9lbnVtX3ZhcmlhbnRfbmFtZSh2YWwtPmdldF9uYW1lKCkpCisgICAgICA8PCAiID0gIgorICAgICAgPDwgdmFsLT5nZXRfdmFsdWUoKQorICAgICAgPDwgIiwiCisgICAgICA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2VudW1faW1wbChjb25zdCBzdHJpbmcmIGVudW1fbmFtZSkgeworICBmX2dlbl8gPDwgImltcGwgIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTMyKCpzZWxmIGFzIGkzMikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBlbnVtX25hbWUgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBlbnVtX3ZhbHVlID0gaV9wcm90LnJlYWRfaTMyKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGVudW1fbmFtZSA8PCAiOjp0cnlfZnJvbShlbnVtX3ZhbHVlKSI7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9lbnVtX2NvbnZlcnNpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpIHsKKyAgZl9nZW5fIDw8ICJpbXBsIFRyeUZyb208aTMyPiBmb3IgIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInR5cGUgRXJyID0gdGhyaWZ0OjpFcnJvcjsiOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gdHJ5X2Zyb20oaTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIGkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY29uc3RhbnRzX2l0ZXI7CisgIGZvciAoY29uc3RhbnRzX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY29uc3RhbnRzX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NvbnN0YW50c19pdGVyKSB7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSAoKmNvbnN0YW50c19pdGVyKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCB2YWwtPmdldF92YWx1ZSgpCisgICAgICA8PCAiID0+IE9rKCIgPDwgZW51bV9uYW1lIDw8ICI6OiIgPDwgcnVzdF9lbnVtX3ZhcmlhbnRfbmFtZSh2YWwtPmdldF9uYW1lKCkpIDw8ICIpLCIKKyAgICAgIDw8IGVuZGw7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJQcm90b2NvbCIsCisgICAgIlByb3RvY29sRXJyb3IiLAorICAgICJQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEiLAorICAgICJmb3JtYXQhKFwiY2Fubm90IGNvbnZlcnQgZW51bSBjb25zdGFudCB7fSB0byAiICsgZW51bV9uYW1lICsgIlwiLCBpKSIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTdHJ1Y3RzLCBVbmlvbnMgYW5kIEV4Y2VwdGlvbnMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgcmVuZGVyX3N0cnVjdChydXN0X3N0cnVjdF9uYW1lKHR4Y2VwdGlvbiksIHR4Y2VwdGlvbiwgdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgcmVuZGVyX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3N0cnVjdCgpKSB7CisgICAgcmVuZGVyX3N0cnVjdChydXN0X3N0cnVjdF9uYW1lKHRzdHJ1Y3QpLCB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6VF9SRUdVTEFSKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIHN0cnVjdCBmb3IgZXhjZXB0aW9uIjsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0KAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICByZW5kZXJfdHlwZV9jb21tZW50KHN0cnVjdF9uYW1lKTsKKyAgcmVuZGVyX3N0cnVjdF9kZWZpbml0aW9uKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIHJlbmRlcl9zdHJ1Y3RfaW1wbChzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfUkVHVUxBUiB8fCBzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pIHsKKyAgICByZW5kZXJfc3RydWN0X2RlZmF1bHRfdHJhaXRfaW1wbChzdHJ1Y3RfbmFtZSwgdHN0cnVjdCk7CisgIH0KKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTikgeworICAgIHJlbmRlcl9leGNlcHRpb25fc3RydWN0X2Vycm9yX3RyYWl0X2ltcGxzKHN0cnVjdF9uYW1lLCB0c3RydWN0KTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2RlZmluaXRpb24oCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRzdHJ1Y3QpOworICBmX2dlbl8gPDwgIiNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIEhhc2gsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkgPDwgInN0cnVjdCAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICAvLyByZW5kZXIgdGhlIG1lbWJlcnMKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKworICAgICAgc3RyaW5nIHJ1c3RfdHlwZSA9IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgICAgcnVzdF90eXBlID0gaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkgPyAiT3B0aW9uPCIgKyBydXN0X3R5cGUgKyAiPiIgOiBydXN0X3R5cGU7CisKKyAgICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIG1lbWJlcik7CisgICAgICBmX2dlbl8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpCisgICAgICAgIDw8IHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpIDw8ICI6ICIgPDwgcnVzdF90eXBlIDw8ICIsIgorICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZXhjZXB0aW9uX3N0cnVjdF9lcnJvcl90cmFpdF9pbXBscyhjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBlcnJvcjo6RXJyb3IgdHJhaXQKKyAgZl9nZW5fIDw8ICJpbXBsIEVycm9yIGZvciAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8ICJyZW1vdGUgc2VydmljZSB0aHJldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCBlbmRsOyAvLyB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBjb252ZXJ0OjpGcm9tIHRyYWl0CisgIGZfZ2VuXyA8PCAiaW1wbCBGcm9tPCIgPDwgc3RydWN0X25hbWUgPDwgIj4gZm9yIHRocmlmdDo6RXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZnJvbShlOiAiIDw8IHN0cnVjdF9uYW1lIDw8ICIpIC0+IFNlbGYgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6VXNlcihCb3g6Om5ldyhlKSkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBmbXQ6OkRpc3BsYXkgdHJhaXQKKyAgZl9nZW5fIDw8ICJpbXBsIERpc3BsYXkgZm9yICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmRlc2NyaXB0aW9uKCkuZm10KGYpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfZGVmYXVsdF90cmFpdF9pbXBsKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAqbWVtYmVyc19pdGVyOworICAgIGlmICghaXNfb3B0aW9uYWwobWVtYmVyLT5nZXRfcmVxKCkpKSB7CisgICAgICBoYXNfcmVxdWlyZWRfZmllbGQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGhhc19yZXF1aXJlZF9maWVsZCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZfZ2VuXyA8PCAiaW1wbCBEZWZhdWx0IGZvciAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZGVmYXVsdCgpIC0+IFNlbGYgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfbmFtZSA8PCAie30iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQgKm1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBvcHRfaW5fcmVxX291dF92YWx1ZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9pbXBsKAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBmX2dlbl8gPDwgImltcGwgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9SRUdVTEFSIHx8IHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTikgeworICAgIHJlbmRlcl9zdHJ1Y3RfY29uc3RydWN0b3Ioc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgfQorCisgIHJlbmRlcl9zdHJ1Y3Rfc3luY19yZWFkKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIHJlbmRlcl9zdHJ1Y3Rfc3luY193cml0ZSh0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisKKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX1JFU1VMVCkgeworICAgIHJlbmRlcl9yZXN1bHRfc3RydWN0X3RvX3Jlc3VsdF9tZXRob2QodHN0cnVjdCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2NvbnN0cnVjdG9yKAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKworICAvLyBidWlsZCB0aGUgY29udmVuaWVuY2UgdHlwZSBwYXJhbWV0ZXJzIHRoYXQgYWxsb3dzIHVzIHRvIHBhc3MgdW53cmFwcGVkIHZhbHVlcyB0byBhIGNvbnN0cnVjdG9yIGFuZAorICAvLyBoYXZlIHRoZW0gYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgaW50byBPcHRpb248dmFsdWU+CisgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKworICBvc3RyaW5nc3RyZWFtIGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzOworICBvc3RyaW5nc3RyZWFtIGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzOworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkpIHsKKyAgICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmljX3R5cGVfcGFyYW1ldGVycyA8PCAiLCAiOworICAgICAgICBnZW5lcmljX3R5cGVfcXVhbGlmaWVycyA8PCAiLCAiOworICAgICAgfQorICAgICAgZ2VuZXJpY190eXBlX3BhcmFtZXRlcnMgPDwgIkYiIDw8IG1lbWJlci0+Z2V0X2tleSgpOworICAgICAgZ2VuZXJpY190eXBlX3F1YWxpZmllcnMgPDwgIkYiIDw8IG1lbWJlci0+Z2V0X2tleSgpIDw8ICI6IEludG88T3B0aW9uPCIgPDwgdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIj4+IjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nID0gZ2VuZXJpY190eXBlX3BhcmFtZXRlcnMuc3RyKCk7CisgIGlmICh0eXBlX3BhcmFtZXRlcl9zdHJpbmcubGVuZ3RoKCkgIT0gMCkgeworICAgIHR5cGVfcGFyYW1ldGVyX3N0cmluZyA9ICI8IiArIHR5cGVfcGFyYW1ldGVyX3N0cmluZyArICI+IjsKKyAgfQorCisgIHN0cmluZyB0eXBlX3F1YWxpZmllcl9zdHJpbmcgPSBnZW5lcmljX3R5cGVfcXVhbGlmaWVycy5zdHIoKTsKKyAgaWYgKHR5cGVfcXVhbGlmaWVyX3N0cmluZy5sZW5ndGgoKSAhPSAwKSB7CisgICAgdHlwZV9xdWFsaWZpZXJfc3RyaW5nID0gIndoZXJlICIgKyB0eXBlX3F1YWxpZmllcl9zdHJpbmcgKyAiICI7CisgIH0KKworICAvLyBub3cgYnVpbGQgdGhlIGFjdHVhbCBjb25zdHJ1Y3RvciBhcmcgbGlzdAorICAvLyB3aGVuIHdlJ3JlIGJ1aWxkaW5nIHRoaXMgbGlzdCB3ZSBoYXZlIHRvIHVzZSB0aGUgdHlwZSBwYXJhbWV0ZXJzIGluIHBsYWNlIG9mIHRoZSBhY3R1YWwgdHlwZSBuYW1lcworICAvLyBpZiBuZWNlc3NhcnkKKyAgb3N0cmluZ3N0cmVhbSBhcmdzOworICBmaXJzdF9hcmcgPSB0cnVlOworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKworICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8ICIsICI7CisgICAgfQorCisgICAgaWYgKGlzX29wdGlvbmFsKG1lbWJlcl9yZXEpKSB7CisgICAgICBhcmdzIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgIkYiIDw8IG1lbWJlci0+Z2V0X2tleSgpOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGFyZ19zdHJpbmcgPSBhcmdzLnN0cigpOworCisgIHN0cmluZyB2aXNpYmlsaXR5KHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKSk7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgdmlzaWJpbGl0eQorICAgIDw8ICJmbiBuZXciCisgICAgPDwgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nCisgICAgPDwgIigiCisgICAgPDwgYXJnX3N0cmluZworICAgIDw8ICIpIC0+ICIKKyAgICA8PCBzdHJ1Y3RfbmFtZQorICAgIDw8ICIgIgorICAgIDw8IHR5cGVfcXVhbGlmaWVyX3N0cmluZworICAgIDw8ICJ7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAwKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICIge30iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworCisgICAgICBpZiAoaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgbWVtYmVyX25hbWUgPDwgIi5pbnRvKCksIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgbWVtYmVyX25hbWUgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9yZXN1bHRfc3RydWN0X3RvX3Jlc3VsdF9tZXRob2QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gd2UgZG9uJ3QgdXNlIHRoZSBydXN0IHN0cnVjdCBuYW1lIGluIHRoaXMgbWV0aG9kLCBqdXN0IHRoZSBzZXJ2aWNlIGNhbGwgbmFtZQorICBzdHJpbmcgc2VydmljZV9jYWxsX25hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIC8vIGNoZWNrIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBhIHJlc3VsdAorICBzaXplX3QgaW5kZXggPSBzZXJ2aWNlX2NhbGxfbmFtZS5maW5kKFJFU1VMVF9TVFJVQ1RfU1VGRklYLCAwKTsKKyAgaWYgKGluZGV4ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgdGhyb3cgInJlc3VsdCBzdHJ1Y3QgIiArIHNlcnZpY2VfY2FsbF9uYW1lICsgIiBtaXNzaW5nIHJlc3VsdCBzdWZmaXgiOworICB9IGVsc2UgeworICAgICBzZXJ2aWNlX2NhbGxfbmFtZS5yZXBsYWNlKGluZGV4LCA2LCAiIik7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKworICAvLyBmaW5kIG91dCB3aGF0IHRoZSBjYWxsJ3MgZXhwZWN0ZWQgcmV0dXJuIHR5cGUgd2FzCisgIHN0cmluZyBydXN0X3JldHVybl90eXBlID0gIigpIjsKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGlmIChtZW1iZXItPmdldF9uYW1lKCkgPT0gU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUpIHsgLy8gZG9uJ3QgaGF2ZSB0byBjaGVjayBzYWZlIG5hbWUgaGVyZQorICAgICAgcnVzdF9yZXR1cm5fdHlwZSA9IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gTk9URTogaWRlYWxseSBJIHdvdWxkIGdlbmVyYXRlIHRoZSBicmFuY2hlcyBhbmQgcmVuZGVyIHRoZW0gc2VwYXJhdGVseQorICAvLyBJIHRyaWVkIHRoaXMgaG93ZXZlciwgYW5kIHRoZSByZXN1bHRpbmcgY29kZSB3YXMgaGFyZGVyIHRvIHVuZGVyc3RhbmQKKyAgLy8gbWFpbnRhaW5pbmcgYSByZW5kZXJlZCBicmFuY2ggY291bnQgKHdoaWxlIGEgbGl0dGxlIHVnbHkpIGdvdCBtZSB0aGUKKyAgLy8gcmVuZGVyaW5nIEkgd2FudGVkIHdpdGggY29kZSB0aGF0IHdhcyByZWFzb25hYmx5IHVuZGVyc3RhbmRhYmxlCisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBva19vcihzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IHJ1c3RfcmV0dXJuX3R5cGUgPDwgIj4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW50IHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9IDA7CisKKyAgLy8gcmVuZGVyIHRoZSBleGNlcHRpb24gYnJhbmNoZXMKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGlmICh0ZmllbGQtPmdldF9uYW1lKCkgIT0gU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUpIHsgLy8gZG9uJ3QgaGF2ZSB0byBjaGVjayBzYWZlIG5hbWUgaGVyZQorICAgICAgc3RyaW5nIGZpZWxkX25hbWUoInNlbGYuIiArIHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpKTsKKyAgICAgIHN0cmluZyBicmFuY2hfc3RhdGVtZW50ID0gcmVuZGVyZWRfYnJhbmNoX2NvdW50ID09IDAgPyAiaWYiIDogIn0gZWxzZSBpZiI7CisKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBicmFuY2hfc3RhdGVtZW50IDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXNfc29tZSgpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoQm94OjpuZXcoIiA8PCBmaWVsZF9uYW1lIDw8ICIudW53cmFwKCkpKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICByZW5kZXJlZF9icmFuY2hfY291bnQrKzsKKyAgICB9CisgIH0KKworICAvLyByZW5kZXIgdGhlIHJldHVybiB2YWx1ZSBicmFuY2hlcworICBpZiAocnVzdF9yZXR1cm5fdHlwZSA9PSAiKCkiKSB7CisgICAgaWYgKHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9PSAwKSB7CisgICAgICAvLyB3ZSBoYXZlIHRoZSB1bml0IHJldHVybiBhbmQgdGhpcyBzZXJ2aWNlIGNhbGwgaGFzIG5vIHVzZXItZGVmaW5lZAorICAgICAgLy8gZXhjZXB0aW9ucy4gdGhpcyBtZWFucyB0aGF0IHdlJ3ZlIGEgdHJpdmlhbCByZXR1cm4gKGhhcHBlbnMgd2l0aCBvbmV3YXlzKQorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygoKSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHdlIGhhdmUgdGhlIHVuaXQgcmV0dXJuLCBidXQgdGhlcmUgYXJlIHVzZXItZGVmaW5lZCBleGNlcHRpb25zCisgICAgICAvLyBpZiB3ZSd2ZSBnb3R0ZW4gdGhpcyBmYXIgdGhlbiB3ZSBoYXZlIHRoZSBkZWZhdWx0IHJldHVybiAoaS5lLiBjYWxsIHN1Y2Nlc3NmdWwpCisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0cmluZyBicmFuY2hfc3RhdGVtZW50ID0gcmVuZGVyZWRfYnJhbmNoX2NvdW50ID09IDAgPyAiaWYiIDogIn0gZWxzZSBpZiI7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGJyYW5jaF9zdGF0ZW1lbnQgPDwgIiBzZWxmLiIgPDwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUgPDwgIi5pc19zb21lKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKHNlbGYuIiA8PCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSA8PCAiLnVud3JhcCgpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCBhIHZhbGlkIHJldHVybiB2YWx1ZSAqb3IqIGEgdXNlciBleGNlcHRpb24KKyAgICAvLyB0aGVuIHdlJ3JlIGluIHRyb3VibGU7IHJldHVybiBhIGRlZmF1bHQgZXJyb3IKKyAgICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICAgIkFwcGxpY2F0aW9uIiwKKyAgICAgICJBcHBsaWNhdGlvbkVycm9yIiwKKyAgICAgICJBcHBsaWNhdGlvbkVycm9yS2luZDo6TWlzc2luZ1Jlc3VsdCIsCisgICAgICAiXCJubyByZXN1bHQgcmVjZWl2ZWQgZm9yICIgKyBzZXJ2aWNlX2NhbGxfbmFtZSArICJcIiIKKyAgICApOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHVuaW9uX25hbWUocnVzdF9zdHJ1Y3RfbmFtZSh0c3RydWN0KSk7CisgIHJlbmRlcl90eXBlX2NvbW1lbnQodW5pb25fbmFtZSk7CisgIHJlbmRlcl91bmlvbl9kZWZpbml0aW9uKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworICByZW5kZXJfdW5pb25faW1wbCh1bmlvbl9uYW1lLCB0c3RydWN0KTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX2RlZmluaXRpb24oY29uc3Qgc3RyaW5nJiB1bmlvbl9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmIChtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIHJ1c3QgZW51bSB3aXRoIDAgbWVtYmVycyI7IC8vIG1heSBiZSB2YWxpZCB0aHJpZnQsIGJ1dCBpdCdzIGludmFsaWQgcnVzdAorICB9CisKKyAgZl9nZW5fIDw8ICIjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBIYXNoLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgInB1YiBlbnVtICIgPDwgdW5pb25fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcl9pdGVyOworICBmb3IobWVtYmVyX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcl9pdGVyKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCBydXN0X3VuaW9uX2ZpZWxkX25hbWUodGZpZWxkKQorICAgICAgPDwgIigiIDw8IHRvX3J1c3RfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIpLCIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25faW1wbChjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGZfZ2VuXyA8PCAiaW1wbCAiIDw8IHVuaW9uX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICByZW5kZXJfdW5pb25fc3luY19yZWFkKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworICByZW5kZXJfdW5pb25fc3luY193cml0ZSh1bmlvbl9uYW1lLCB0c3RydWN0KTsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBTdHJ1Y3QgV3JpdGUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3Rfc3luY193cml0ZSgKKyAgICB0X3N0cnVjdCAqdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpCisgICAgPDwgImZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gd3JpdGUgc3RydWN0IGhlYWRlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgLy8gbm90ZTogdXNlIHRoZSAqb3JpZ2luYWwqIHN0cnVjdCBuYW1lIGhlcmUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldyhcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiKTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KT87IiA8PCBlbmRsOworCisgIC8vIHdyaXRlIHN0cnVjdCBtZW1iZXJzIHRvIG91dHB1dCBwcm90b2NvbAorICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfdmFyKCJzZWxmLiIgKyBydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgICByZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUobWVtYmVyX3ZhciwgZmFsc2UsIG1lbWJlciwgbWVtYmVyX3JlcSk7CisgICAgfQorICB9CisKKyAgLy8gd3JpdGUgc3RydWN0IGZvb3RlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gd3JpdGUgc3RydWN0IGhlYWRlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgLy8gbm90ZTogdXNlIHRoZSAqb3JpZ2luYWwqIHN0cnVjdCBuYW1lIGhlcmUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldyhcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiKTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KT87IiA8PCBlbmRsOworCisgIC8vIHdyaXRlIHRoZSBlbnVtIGZpZWxkIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCAqc2VsZiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSB0X2ZpZWxkOjpUX1JFUVVJUkVEOworICAgICAgdF90eXBlKiB0dHlwZSA9IG1lbWJlci0+Z2V0X3R5cGUoKTsKKyAgICAgIHN0cmluZyBtYXRjaF92YXIoKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHR5cGUtPmlzX3N0cmluZygpKSA/ICJmIiA6ICJyZWYgZiIpOworICAgICAgZl9nZW5fCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8IHVuaW9uX25hbWUgPDwgIjo6IiA8PCBydXN0X3VuaW9uX2ZpZWxkX25hbWUobWVtYmVyKQorICAgICAgICA8PCAiKCIgPDwgbWF0Y2hfdmFyIDw8ICIpID0+IHsiCisgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZSgiZiIsIHRydWUsIG1lbWJlciwgbWVtYmVyX3JlcSk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyB3cml0ZSBzdHJ1Y3QgZm9vdGVyIHRvIG91dHB1dCBwcm90b2NvbAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKAorICBjb25zdCBzdHJpbmcgJmZpZWxkX3ZhciwKKyAgYm9vbCBmaWVsZF92YXJfaXNfcmVmLAorICB0X2ZpZWxkICp0ZmllbGQsCisgIHRfZmllbGQ6OmVfcmVxIHJlcQorKSB7CisgIHRfdHlwZSogZmllbGRfdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgdF90eXBlKiBhY3R1YWxfdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGRfdHlwZSk7CisKKyAgb3N0cmluZ3N0cmVhbSBmaWVsZF9zdHJlYW07CisgIGZpZWxkX3N0cmVhbQorICAgIDw8ICJURmllbGRJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8ICJcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIiIgPDwgIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oZmllbGRfdHlwZSkgPDwgIiwgIgorICAgIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIjsKKyAgc3RyaW5nIGZpZWxkX2lkZW50X3N0cmluZyA9IGZpZWxkX3N0cmVhbS5zdHIoKTsKKworICBpZiAoaXNfb3B0aW9uYWwocmVxKSkgeworICAgIHN0cmluZyBsZXRfdmFyKChhY3R1YWxfdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWFjdHVhbF90eXBlLT5pc19zdHJpbmcoKSkgPyAiZmxkX3ZhciIgOiAicmVmIGZsZF92YXIiKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIGxldCBTb21lKCIgPDwgbGV0X3ZhciA8PCAiKSA9ICIgPDwgZmllbGRfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmIiA8PCBmaWVsZF9pZGVudF9zdHJpbmcgPDwgIik/OyIgPDwgZW5kbDsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKCJmbGRfdmFyIiwgdHJ1ZSwgZmllbGRfdHlwZSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOyAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgZXh0cmFuZW91cyAnKCknCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOyAvLyBGSVhNRTogcmVtb3ZlIGVsc2UgYnJhbmNoCisgICAgaW5kZW50X3VwKCk7CisgICAgLyogRklYTUU6IHJldGhpbmsgaG93IEkgZGVhbCB3aXRoIE9QVF9JTl9SRVFfT1VUCisgICAgaWYgKHJlcSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZGVudCA9ICIgPDwgZmllbGRfaWRlbnRfc3RyaW5nIDw8ICI7IiA8PCBlbmRsOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50KT87IiA8PCBlbmRsOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICB9Ki8KKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIigpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCYiIDw8IGZpZWxkX2lkZW50X3N0cmluZyA8PCAiKT87IiA8PCBlbmRsOworICAgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoZmllbGRfdmFyLCBmaWVsZF92YXJfaXNfcmVmLCB0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3R5cGVfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCBib29sIHR5cGVfdmFyX2lzX3JlZiwgdF90eXBlICp0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjYW5ub3Qgd3JpdGUgZmllbGQgb2YgdHlwZSBUWVBFX1ZPSUQgdG8gb3V0cHV0IHByb3RvY29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogeworICAgICAgc3RyaW5nIHJlZih0eXBlX3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfYnl0ZXMoIiArIHJlZiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cmluZygiICsgcmVmICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9ib29sKCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2k4KCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pMTYoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2kzMigiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTY0KCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9kb3VibGUoIiArIHR5cGVfdmFyICsgIi5pbnRvKCkpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKHRfdHlwZWRlZiopIHR0eXBlOworICAgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgdHR5cGVkZWYtPmdldF90eXBlKCkpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCB0eXBlX3ZhciArICIud3JpdGVfdG9fb3V0X3Byb3RvY29sKG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmVuZGVyX21hcF9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsICh0X21hcCAqKSB0dHlwZSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJlbmRlcl9zZXRfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCAodF9zZXQgKikgdHR5cGUpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmVuZGVyX2xpc3Rfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCAodF9saXN0ICopIHR0eXBlKTsKKyAgICByZXR1cm47CisgIH0KKworICB0aHJvdyAiY2Fubm90IHdyaXRlIHVuc3VwcG9ydGVkIHR5cGUgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbGlzdF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbGlzdF92YXIsIGJvb2wgbGlzdF92YXJfaXNfcmVmLCB0X2xpc3QgKnRsaXN0KSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigiCisgICAgPDwgIiZUTGlzdElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oZWxlbV90eXBlKSA8PCAiLCAiCisgICAgPDwgbGlzdF92YXIgPDwgIi5sZW4oKSBhcyBpMzIiIDw8ICIpIgorICAgIDw8ICIpPzsiCisgICAgPDwgZW5kbDsKKworICBzdHJpbmcgcmVmKGxpc3RfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgZSBpbiAiIDw8IHJlZiA8PCBsaXN0X3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUoZWxlbV90eXBlLCAiZSIpLCB0cnVlLCBlbGVtX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9saXN0X2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NldF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmc2V0X3ZhciwgYm9vbCBzZXRfdmFyX2lzX3JlZiwgdF9zZXQgKnRzZXQpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAib19wcm90LndyaXRlX3NldF9iZWdpbigiCisgICAgPDwgIiZUU2V0SWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShlbGVtX3R5cGUpIDw8ICIsICIKKyAgICA8PCBzZXRfdmFyIDw8ICIubGVuKCkgYXMgaTMyIiA8PCAiKSIKKyAgICA8PCAiKT87IgorICAgIDw8IGVuZGw7CisKKyAgc3RyaW5nIHJlZihzZXRfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgZSBpbiAiIDw8IHJlZiA8PCBzZXRfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZShlbGVtX3R5cGUsICJlIiksIHRydWUsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3NldF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9tYXBfc3luY193cml0ZShjb25zdCBzdHJpbmcgJm1hcF92YXIsIGJvb2wgbWFwX3Zhcl9pc19yZWYsIHRfbWFwICp0bWFwKSB7CisgIHRfdHlwZSoga2V5X3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxfdHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm9fcHJvdC53cml0ZV9tYXBfYmVnaW4oIgorICAgIDw8ICImVE1hcElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oa2V5X3R5cGUpIDw8ICIsICIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bSh2YWxfdHlwZSkgPDwgIiwgIgorICAgIDw8IG1hcF92YXIgPDwgIi5sZW4oKSBhcyBpMzIpIgorICAgIDw8ICIpPzsiCisgICAgPDwgZW5kbDsKKworICBzdHJpbmcgcmVmKG1hcF92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciAoaywgdikgaW4gIiA8PCByZWYgPDwgbWFwX3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUoa2V5X3R5cGUsICJrIiksIHRydWUsIGtleV90eXBlKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKHZhbF90eXBlLCAidiIpLCB0cnVlLCB2YWxfdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21hcF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZSh0X3R5cGUqIHR0eXBlLCBjb25zdCBzdHJpbmcmIGJhc2VfdmFyKSB7CisgIGJvb2wgdHlwZV9uZWVkc19kZXJlZiA9IG5lZWRzX2RlcmVmX29uX2NvbnRhaW5lcl93cml0ZSh0dHlwZSk7CisgIGJvb2wgdHlwZV9pc19kb3VibGUgPSBpc19kb3VibGUodHR5cGUpOworCisgIHN0cmluZyB3cml0ZV92YXJpYWJsZTsKKworICBpZiAodHlwZV9pc19kb3VibGUgJiYgdHlwZV9uZWVkc19kZXJlZikgeworICAgIHdyaXRlX3ZhcmlhYmxlID0gIigqIiArIGJhc2VfdmFyICsgIikiOworICB9IGVsc2UgaWYgKHR5cGVfbmVlZHNfZGVyZWYpIHsKKyAgICB3cml0ZV92YXJpYWJsZSA9ICIqIiArIGJhc2VfdmFyOworICB9IGVsc2UgeworICAgIHdyaXRlX3ZhcmlhYmxlID0gYmFzZV92YXI7CisgIH0KKworICByZXR1cm4gd3JpdGVfdmFyaWFibGU7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6Om5lZWRzX2RlcmVmX29uX2NvbnRhaW5lcl93cml0ZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHJldHVybiB0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR0eXBlLT5pc19zdHJpbmcoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgU3RydWN0IFJlYWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3Rfc3luY19yZWFkKAorICAgIGNvbnN0IHN0cmluZyAmc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkKKyAgICA8PCAiZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBzdHJ1Y3RfbmFtZSA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKT87IiA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0ZW1wb3JhcnkgdmFyaWFibGVzOiBvbmUgZm9yIGVhY2ggZmllbGQgaW4gdGhlIHN0cnVjdAorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtdXQgIiA8PCBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKG1lbWJlcikKKyAgICAgIDw8ICI6IE9wdGlvbjwiIDw8IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICI+ID0gIjsKKyAgICAgIGlmIChtZW1iZXJfcmVxID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgZl9nZW5fIDw8IG9wdF9pbl9yZXFfb3V0X3ZhbHVlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIjsiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8ICJOb25lOyI7CisgICAgICB9CisgICAgICBmX2dlbl8gPDwgZW5kbDsKKyAgfQorCisgIC8vIG5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyB3ZSd2ZSByZWNlaXZlZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxvb3AgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbG9vcAorICBpbmRlbnRfdXAoKTsKKworICAvLyBicmVhayBvdXQgaWYgeW91J3ZlIGZvdW5kIHRoZSBTdG9wIGZpZWxkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkZW50ID0gaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gbm93IHJlYWQgYWxsIHRoZSBmaWVsZHMgZm91bmQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWQgPSBmaWVsZF9pZCgmZmllbGRfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggZmllbGRfaWQgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbWF0Y2gKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIiA9PiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCgidmFsIiwgdGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0ZmllbGQpIDw8ICIgPSBTb21lKHZhbCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGRlZmF1bHQgY2FzZSAoc2tpcCBmaWVsZHMpCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3Quc2tpcChmaWVsZF9pZGVudC5maWVsZF90eXBlKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7IC8vIGZpbmlzaCBtYXRjaAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZmluaXNoIGxvb3AKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCk/OyIgPDwgZW5kbDsgLy8gcmVhZCBtZXNzYWdlIGZvb3RlciBmcm9tIHRoZSB3aXJlCisKKyAgLy8gdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBleGlzdAorICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9IGFjdHVhbF9maWVsZF9yZXEodGZpZWxkLCBzdHJ1Y3RfdHlwZSk7CisgICAgaWYgKCFpc19vcHRpb25hbChyZXEpKSB7CisgICAgICBmX2dlbl8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInZlcmlmeV9yZXF1aXJlZF9maWVsZF9leGlzdHMoIgorICAgICAgICA8PCAiXCIiIDw8IHN0cnVjdF9uYW1lIDw8ICIuIiA8PCBydXN0X2ZpZWxkX25hbWUodGZpZWxkKSA8PCAiXCIiCisgICAgICAgIDw8ICIsICIKKyAgICAgICAgPDwgIiYiIDw8IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodGZpZWxkKQorICAgICAgICA8PCAiKT87IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIGNvbnN0cnVjdCB0aGUgc3RydWN0CisgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAwKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0ID0gIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHt9OyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXQgPSAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9IGFjdHVhbF9maWVsZF9yZXEodGZpZWxkLCBzdHJ1Y3RfdHlwZSk7CisgICAgICBzdHJpbmcgZmllbGRfbmFtZShydXN0X2ZpZWxkX25hbWUodGZpZWxkKSk7CisgICAgICBzdHJpbmcgZmllbGRfa2V5ID0gc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0ZmllbGQpOworICAgICAgaWYgKGlzX29wdGlvbmFsKHJlcSkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGZpZWxkX25hbWUgPDwgIjogIiA8PCBmaWVsZF9rZXkgPDwgIiwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8KKyAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICA8PCAiOiAiCisgICAgICAgICAgPDwgZmllbGRfa2V5CisgICAgICAgICAgPDwgIi5leHBlY3QoXCJhdXRvLWdlbmVyYXRlZCBjb2RlIHNob3VsZCBoYXZlIGNoZWNrZWQgZm9yIHByZXNlbmNlIG9mIHJlcXVpcmVkIGZpZWxkc1wiKSIKKyAgICAgICAgICA8PCAiLCIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIHJldHVybiB0aGUgY29uc3RydWN0ZWQgdmFsdWUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPayhyZXQpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IHVuaW9uX25hbWUgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBjcmVhdGUgdGVtcG9yYXJ5IHZhcmlhYmxlcyB0byBob2xkIHRoZQorICAvLyBjb21wbGV0ZWQgdW5pb24gYXMgd2VsbCBhcyBhIGNvdW50IG9mIGZpZWxkcyByZWFkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCByZXQ6IE9wdGlvbjwiIDw8IHVuaW9uX25hbWUgPDwgIj4gPSBOb25lOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IHJlY2VpdmVkX2ZpZWxkX2NvdW50ID0gMDsiIDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgc3RydWN0IHByZWFtYmxlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKworICAvLyBub3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgd2UndmUgcmVjZWl2ZWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsb29wIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IGxvb3AKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gYnJlYWsgb3V0IGlmIHlvdSd2ZSBmb3VuZCB0aGUgU3RvcCBmaWVsZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZGVudCA9IGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIG5vdyByZWFkIGFsbCB0aGUgZmllbGRzIGZvdW5kCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkID0gZmllbGRfaWQoJmZpZWxkX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIGZpZWxkX2lkIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IG1hdGNoCisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlci0+Z2V0X2tleSgpIDw8ICIgPT4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoInZhbCIsIG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiByZXQuaXNfbm9uZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldCA9IFNvbWUoIiA8PCB1bmlvbl9uYW1lIDw8ICI6OiIgPDwgcnVzdF91bmlvbl9maWVsZF9uYW1lKG1lbWJlcikgPDwgIih2YWwpKTsiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmVjZWl2ZWRfZmllbGRfY291bnQgKz0gMTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgLy8gZGVmYXVsdCBjYXNlIChza2lwIGZpZWxkcykKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5za2lwKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmVjZWl2ZWRfZmllbGRfY291bnQgKz0gMTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsgLy8gZmluaXNoIG1hdGNoCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBmaW5pc2ggbG9vcAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKT87IiA8PCBlbmRsOyAvLyBmaW5pc2ggcmVhZGluZyBtZXNzYWdlIGZyb20gd2lyZQorCisgIC8vIHJldHVybiB0aGUgdmFsdWUgb3IgYW4gZXJyb3IKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiByZWNlaXZlZF9maWVsZF9jb3VudCA9PSAwIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJQcm90b2NvbCIsCisgICAgIlByb3RvY29sRXJyb3IiLAorICAgICJQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEiLAorICAgICJcInJlY2VpdmVkIGVtcHR5IHVuaW9uIGZyb20gcmVtb3RlICIgKyB1bmlvbl9uYW1lICsgIlwiIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiByZWNlaXZlZF9maWVsZF9jb3VudCA+IDEgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIlByb3RvY29sIiwKKyAgICAiUHJvdG9jb2xFcnJvciIsCisgICAgIlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSIsCisgICAgIlwicmVjZWl2ZWQgbXVsdGlwbGUgZmllbGRzIGZvciB1bmlvbiBmcm9tIHJlbW90ZSAiICsgdW5pb25fbmFtZSArICJcIiIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2socmV0LmV4cGVjdChcInJldHVybiB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkXCIpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90eXBlX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCB0X3R5cGUgKnR0eXBlLCBib29sIGlzX2JveGVkKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNhbm5vdCByZWFkIGZpZWxkIG9mIHR5cGUgVFlQRV9WT0lEIGZyb20gaW5wdXQgcHJvdG9jb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2J5dGVzKCk/OyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX3N0cmluZygpPzsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfYm9vbCgpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2k4KCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2kxNigpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pMzIoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTY0KCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IE9yZGVyZWRGbG9hdDo6ZnJvbShpX3Byb3QucmVhZF9kb3VibGUoKT8pOyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIC8vIEZJWE1FOiBub3QgYSBmYW4gb2Ygc2VwYXJhdGUgYGlzX2JveGVkYCBwYXJhbWV0ZXIKKyAgICAvLyBUaGlzIGlzIHByb2JsZW1hdGljIGJlY2F1c2UgaXQncyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIsIGFuZCBvbmx5IGNvbWVzCisgICAgLy8gaW50byBwbGF5IG9uY2UuIFRoZSBjb3JlIGlzc3VlIGlzIHRoYXQgSSBsb3NlIGFuIGltcG9ydGFudCBwaWVjZSBvZiB0eXBlCisgICAgLy8gaW5mb3JtYXRpb24gKHdoZXRoZXIgdGhlIHR5cGUgaXMgYSBmd2QgcmVmKSBieSB1bndyYXBwaW5nIHRoZSB0eXBlZGVmJ2QKKyAgICAvLyB0eXBlIGFuZCBtYWtpbmcgdGhlIHJlY3Vyc2l2ZSBjYWxsIHVzaW5nIGl0LiBJIGNhbid0IG1vZGlmeSBvciB3cmFwIHRoZQorICAgIC8vIGdlbmVyYXRlZCBzdHJpbmcgYWZ0ZXIgdGhlIGZhY3QgYmVjYXVzZSBpdCdzIHdyaXR0ZW4gZGlyZWN0bHkgaW50byB0aGUgZmlsZSwKKyAgICAvLyBzbyBJIGhhdmUgdG8gcGFzcyB0aGlzIHBhcmFtZXRlciBhbG9uZy4gR29pbmcgd2l0aCB0aGlzIGFwcHJvYWNoIGJlY2F1c2UgaXQKKyAgICAvLyBzZWVtcyBsaWtlIHRoZSBsb3dlc3QtY29zdCBvcHRpb24gdG8gZWFzaWx5IHN1cHBvcnQgcmVjdXJzaXZlIHR5cGVzLgorICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAodF90eXBlZGVmKil0dHlwZTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3JlYWQodHlwZV92YXIsIHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0dHlwZWRlZi0+aXNfZm9yd2FyZF90eXBlZGVmKCkpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHN0cmluZyByZWFkX2NhbGwodG9fcnVzdF90eXBlKHR0eXBlKSArICI6OnJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3QpPyIpOworICAgIHJlYWRfY2FsbCA9IGlzX2JveGVkID8gIkJveDo6bmV3KCIgKyByZWFkX2NhbGwgKyAiKSIgOiByZWFkX2NhbGw7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSAiIDw8ICByZWFkX2NhbGwgPDwgIjsiCisgICAgICA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZW5kZXJfbWFwX3N5bmNfcmVhZCgodF9tYXAgKikgdHR5cGUsIHR5cGVfdmFyKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmVuZGVyX3NldF9zeW5jX3JlYWQoKHRfc2V0ICopIHR0eXBlLCB0eXBlX3Zhcik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZW5kZXJfbGlzdF9zeW5jX3JlYWQoKHRfbGlzdCAqKSB0dHlwZSwgdHlwZV92YXIpOworICAgIHJldHVybjsKKyAgfQorCisgIHRocm93ICJjYW5ub3QgcmVhZCB1bnN1cHBvcnRlZCB0eXBlICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgbGlzdCBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2xpc3Rfc3luY19yZWFkKHRfbGlzdCAqdGxpc3QsIGNvbnN0IHN0cmluZyAmbGlzdF92YXIpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGxpc3RfaWRlbnQgPSBpX3Byb3QucmVhZF9saXN0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCAiIDw8IGxpc3RfdmFyIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKCh0X3R5cGUqKSB0bGlzdCkKKyAgICA8PCAiID0gVmVjOjp3aXRoX2NhcGFjaXR5KGxpc3RfaWRlbnQuc2l6ZSBhcyB1c2l6ZSk7IgorICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIF8gaW4gMC4ubGlzdF9pZGVudC5zaXplIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGxpc3RfZWxlbV92YXIgPSB0bXAoImxpc3RfZWxlbV8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKGxpc3RfZWxlbV92YXIsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBsaXN0X3ZhciA8PCAiLnB1c2goIiA8PCBsaXN0X2VsZW1fdmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9saXN0X2VuZCgpPzsiIDw8IGVuZGw7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHNldCBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NldF9zeW5jX3JlYWQodF9zZXQgKnRzZXQsIGNvbnN0IHN0cmluZyAmc2V0X3ZhcikgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBzZXRfaWRlbnQgPSBpX3Byb3QucmVhZF9zZXRfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0ICIgPDwgc2V0X3ZhciA8PCAiOiAiIDw8IHRvX3J1c3RfdHlwZSgodF90eXBlKikgdHNldCkKKyAgICA8PCAiID0gQlRyZWVTZXQ6Om5ldygpOyIKKyAgICA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBfIGluIDAuLnNldF9pZGVudC5zaXplIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIHNldF9lbGVtX3ZhciA9IHRtcCgic2V0X2VsZW1fIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZChzZXRfZWxlbV92YXIsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzZXRfdmFyIDw8ICIuaW5zZXJ0KCIgPDwgc2V0X2VsZW1fdmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zZXRfZW5kKCk/OyIgPDwgZW5kbDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgbWFwIGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbWFwX3N5bmNfcmVhZCh0X21hcCAqdG1hcCwgY29uc3Qgc3RyaW5nICZtYXBfdmFyKSB7CisgIHRfdHlwZSoga2V5X3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB2YWxfdHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG1hcF9pZGVudCA9IGlfcHJvdC5yZWFkX21hcF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgIiA8PCBtYXBfdmFyIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKCh0X3R5cGUqKSB0bWFwKQorICAgIDw8ICIgPSBCVHJlZU1hcDo6bmV3KCk7IgorICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIF8gaW4gMC4ubWFwX2lkZW50LnNpemUgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcga2V5X2VsZW1fdmFyID0gdG1wKCJtYXBfa2V5XyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoa2V5X2VsZW1fdmFyLCBrZXlfdHlwZSk7CisgIHN0cmluZyB2YWxfZWxlbV92YXIgPSB0bXAoIm1hcF92YWxfIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCh2YWxfZWxlbV92YXIsIHZhbF90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1hcF92YXIgPDwgIi5pbnNlcnQoIiA8PCBrZXlfZWxlbV92YXIgPDwgIiwgIiA8PCB2YWxfZWxlbV92YXIgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX21hcF9lbmQoKT87IiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodF9maWVsZCogdGZpZWxkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmb3NzOworICBmb3NzIDw8ICJmXyIgPDwgdGZpZWxkLT5nZXRfa2V5KCk7CisgIHJldHVybiBmb3NzLnN0cigpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBDbGllbnQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZW5kZXJfc3luY19jbGllbnQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19wcm9jZXNzb3IodHNlcnZpY2UpOworICByZW5kZXJfc2VydmljZV9jYWxsX3N0cnVjdHModHNlcnZpY2UpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2VydmljZV9jYWxsX3N0cnVjdHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisKKyAgLy8gdGhyaWZ0IGFyZ3MgZm9yIHNlcnZpY2UgY2FsbHMgYXJlIHBhY2tlZAorICAvLyBpbnRvIGEgc3RydWN0IHRoYXQncyB0cmFuc21pdHRlZCBvdmVyIHRoZSB3aXJlLCBzbworICAvLyBnZW5lcmF0ZSBzdHJ1Y3RzIGZvciB0aG9zZSB0b28KKyAgLy8KKyAgLy8gdGhyaWZ0IHJldHVybnMgYXJlICphbHNvKiBwYWNrZWQgaW50byBhIHN0cnVjdAorICAvLyB0aGF0J3MgcGFzc2VkIG92ZXIgdGhlIHdpcmUsIHNvLCBnZW5lcmF0ZSB0aGUgc3RydWN0CisgIC8vIGZvciB0aGF0IHRvby4gTm90ZSB0aGF0IHRoaXMgcmVzdWx0IHN0cnVjdCAqYWxzbyoKKyAgLy8gY29udGFpbnMgdGhlIGV4Y2VwdGlvbnMgYXMgd2VsbAorICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgcmVuZGVyX3NlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdCh0ZnVuYyk7CisgICAgaWYgKCF0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHJlbmRlcl9zZXJ2aWNlX2NhbGxfcmVzdWx0X3ZhbHVlX3N0cnVjdCh0ZnVuYyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBjbGllbnRfaW1wbF9uYW1lKHJ1c3Rfc3luY19jbGllbnRfaW1wbF9uYW1lKHRzZXJ2aWNlKSk7CisKKyAgcmVuZGVyX3R5cGVfY29tbWVudCh0c2VydmljZS0+Z2V0X25hbWUoKSArICIgc2VydmljZSBjbGllbnQiKTsgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICByZW5kZXJfc3luY19jbGllbnRfdHJhaXQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0KHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X2RlZmluaXRpb25fYW5kX2ltcGwoY2xpZW50X2ltcGxfbmFtZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF90dGhyaWZ0Y2xpZW50X2ltcGwoY2xpZW50X2ltcGxfbmFtZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHModHNlcnZpY2UsIGNsaWVudF9pbXBsX25hbWUpOyBmX2dlbl8gPDwgZW5kbDsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X3Byb2Nlc3NfaW1wbCh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbnNpb24gPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgZXh0ZW5zaW9uID0gIiA6ICIgKyBydXN0X25hbWVzcGFjZShleHRlbmRzKSArIHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZShleHRlbmRzKTsKKyAgfQorCisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8ICJwdWIgdHJhaXQgIiA8PCBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodHNlcnZpY2UpIDw8IGV4dGVuc2lvbiA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHN0cmluZyBmdW5jX25hbWUgPSBzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodGZ1bmMpOworICAgIHN0cmluZyBmdW5jX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRmdW5jLCB0cnVlKTsKKyAgICBzdHJpbmcgZnVuY19yZXR1cm4gPSB0b19ydXN0X3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRmdW5jKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuICIgPDwgZnVuY19uYW1lIDw8ICBmdW5jX2FyZ3MgPDwgIiAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGZ1bmNfcmV0dXJuIDw8ICI+OyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiB0cmFpdCAiIDw8IHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodHNlcnZpY2UpIDw8ICIge30iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKHRfc2VydmljZSAqdHNlcnZpY2UsIGNvbnN0IHN0cmluZyAmaW1wbF9zdHJ1Y3RfbmFtZSkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBydXN0X25hbWVzcGFjZSh0c2VydmljZSkgPDwgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0c2VydmljZSkKKyAgICA8PCAiIGZvciAiCisgICAgPDwgaW1wbF9zdHJ1Y3RfbmFtZSA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIge30iCisgICAgPDwgZW5kbDsKKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKGV4dGVuZHMsIGltcGxfc3RydWN0X25hbWUpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9kZWZpbml0aW9uX2FuZF9pbXBsKGNvbnN0IHN0cmluZyYgY2xpZW50X2ltcGxfbmFtZSkgeworCisgIC8vIHJlbmRlciB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIGNsaWVudCBzdHJ1Y3QKKyAgZl9nZW5fCisgICAgPDwgInB1YiBzdHJ1Y3QgIgorICAgIDw8IGNsaWVudF9pbXBsX25hbWUKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfaV9wcm90OiBJUCwiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiX29fcHJvdDogT1AsIiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl9zZXF1ZW5jZV9udW1iZXI6IGkzMiwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gcmVuZGVyIHRoZSBzdHJ1Y3QgaW1wbGVtZW50YXRpb24KKyAgLy8gdGhpcyBpbmNsdWRlcyB0aGUgbmV3KCkgZnVuY3Rpb24gYXMgd2VsbCBhcyB0aGUgaGVscGVyIHNlbmQvcmVjdiBtZXRob2RzIGZvciBlYWNoIHNlcnZpY2UgY2FsbAorICBmX2dlbl8KKyAgICA8PCAiaW1wbCAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgY2xpZW50X2ltcGxfbmFtZQorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19jbGllbnRfbGlmZWN5Y2xlX2Z1bmN0aW9ucyhjbGllbnRfaW1wbF9uYW1lKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X2xpZmVjeWNsZV9mdW5jdGlvbnMoY29uc3Qgc3RyaW5nJiBjbGllbnRfc3RydWN0KSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiBuZXcoaW5wdXRfcHJvdG9jb2w6IElQLCBvdXRwdXRfcHJvdG9jb2w6IE9QKSAtPiAiCisgICAgPDwgY2xpZW50X3N0cnVjdAorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IGNsaWVudF9zdHJ1Y3QKKyAgICA8PCAiIHsgX2lfcHJvdDogaW5wdXRfcHJvdG9jb2wsIF9vX3Byb3Q6IG91dHB1dF9wcm90b2NvbCwgX3NlcXVlbmNlX251bWJlcjogMCB9IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfdHRocmlmdGNsaWVudF9pbXBsKGNvbnN0IHN0cmluZyAmY2xpZW50X2ltcGxfbmFtZSkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiIFRUaHJpZnRDbGllbnQgZm9yICIKKyAgICA8PCBjbGllbnRfaW1wbF9uYW1lCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gaV9wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVElucHV0UHJvdG9jb2wgeyAmbXV0IHNlbGYuX2lfcHJvdCB9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIG9fcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRPdXRwdXRQcm90b2NvbCB7ICZtdXQgc2VsZi5fb19wcm90IH0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gc2VxdWVuY2VfbnVtYmVyKCZzZWxmKSAtPiBpMzIgeyBzZWxmLl9zZXF1ZW5jZV9udW1iZXIgfSIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiZm4gaW5jcmVtZW50X3NlcXVlbmNlX251bWJlcigmbXV0IHNlbGYpIC0+IGkzMiB7IHNlbGYuX3NlcXVlbmNlX251bWJlciArPSAxOyBzZWxmLl9zZXF1ZW5jZV9udW1iZXIgfSIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9wcm9jZXNzX2ltcGwodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgbWFya2VyX2V4dGVuc2lvbiA9ICIiICsgc3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKHRzZXJ2aWNlKTsKKworICBmX2dlbl8KKyAgICA8PCAiaW1wbCA8QzogVFRocmlmdENsaWVudCArICIgPDwgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgbWFya2VyX2V4dGVuc2lvbiA8PCAiPiAiCisgICAgPDwgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRzZXJ2aWNlKQorICAgIDw8ICIgZm9yIEMgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICByZW5kZXJfc3luY19zZW5kX3JlY3Zfd3JhcHBlcihmdW5jKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIG1hcmtlcl9leHRlbnNpb247CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgbWFya2VyX2V4dGVuc2lvbiA9ICIgKyAiICsgcnVzdF9uYW1lc3BhY2UoZXh0ZW5kcykgKyBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKGV4dGVuZHMpOworICAgIG1hcmtlcl9leHRlbnNpb24gPSBtYXJrZXJfZXh0ZW5zaW9uICsgc3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKGV4dGVuZHMpOworICB9CisKKyAgcmV0dXJuIG1hcmtlcl9leHRlbnNpb247Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3NlbmRfcmVjdl93cmFwcGVyKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHN0cmluZyBmdW5jX25hbWUgPSBzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodGZ1bmMpOworICBzdHJpbmcgZnVuY19kZWNsX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRmdW5jLCB0cnVlKTsKKyAgc3RyaW5nIGZ1bmNfY2FsbF9hcmdzID0gcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRmdW5jKTsKKyAgc3RyaW5nIGZ1bmNfcmV0dXJuID0gdG9fcnVzdF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJmbiAiIDw8IGZ1bmNfbmFtZSA8PCAgZnVuY19kZWNsX2FyZ3MgPDwgIiAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGZ1bmNfcmV0dXJuCisgICAgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19zZW5kKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpPzsiIDw8IGVuZGw7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXJfc3luY19yZWN2KHRmdW5jKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfc2VuZCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGluY3JlbWVudCB0aGUgc2VxdWVuY2UgbnVtYmVyIGFuZCBnZW5lcmF0ZSB0aGUgY2FsbCBoZWFkZXIKKyAgc3RyaW5nIG1lc3NhZ2VfdHlwZSA9IHRmdW5jLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9uZVdheSIgOiAiVE1lc3NhZ2VUeXBlOjpDYWxsIjsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmluY3JlbWVudF9zZXF1ZW5jZV9udW1iZXIoKTsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gIgorICAgIDw8ICJUTWVzc2FnZUlkZW50aWZpZXI6Om5ldyhcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICA8PCBtZXNzYWdlX3R5cGUgPDwgIiwgIgorICAgIDw8ICJzZWxmLnNlcXVlbmNlX251bWJlcigpKTsiCisgICAgPDwgZW5kbDsKKyAgLy8gcGFjayB0aGUgYXJndW1lbnRzIGludG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0IHRoYXQgd2UnbGwgd3JpdGUgb3V0IG92ZXIgdGhlIHdpcmUKKyAgLy8gbm90ZSB0aGF0IHRoaXMgc3RydWN0IGlzIGdlbmVyYXRlZCBldmVuIGlmIHdlIGhhdmUgMCBhcmdzCisgIG9zdHJpbmdzdHJlYW0gc3RydWN0X2RlZmluaXRpb247CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgc3RydWN0X2RlZmluaXRpb24gPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBtZW1iZXJfbmFtZSA8PCAiLCAiOworICB9CisgIHN0cmluZyBzdHJ1Y3RfZmllbGRzID0gc3RydWN0X2RlZmluaXRpb24uc3RyKCk7CisgIGlmIChzdHJ1Y3RfZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBzdHJ1Y3RfZmllbGRzID0gc3RydWN0X2ZpZWxkcy5zdWJzdHIoMCwgc3RydWN0X2ZpZWxkcy5zaXplKCkgLSAyKTsgLy8gc3RyaXAgdHJhaWxpbmcgY29tbWEKKyAgfQorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgY2FsbF9hcmdzID0gIgorICAgIDw8IHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRmdW5jKQorICAgIDw8ICIgeyAiCisgICAgPDwgc3RydWN0X2ZpZWxkcworICAgIDw8ICIgfTsiCisgICAgPDwgZW5kbDsKKyAgLy8gd3JpdGUgZXZlcnl0aGluZyBvdmVyIHRoZSB3aXJlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5vX3Byb3RfbXV0KCkud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJjYWxsX2FyZ3Mud3JpdGVfdG9fb3V0X3Byb3RvY29sKHNlbGYub19wcm90X211dCgpKT87IiA8PCBlbmRsOyAvLyB3cml0dGVuIGV2ZW4gaWYgd2UgaGF2ZSAwIGFyZ3MKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLm9fcHJvdF9tdXQoKS53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5vX3Byb3RfbXV0KCkuZmx1c2goKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3JlY3YodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gc2VsZi5pX3Byb3RfbXV0KCkucmVhZF9tZXNzYWdlX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ2ZXJpZnlfZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKHNlbGYuc2VxdWVuY2VfbnVtYmVyKCksIG1lc3NhZ2VfaWRlbnQuc2VxdWVuY2VfbnVtYmVyKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInZlcmlmeV9leHBlY3RlZF9zZXJ2aWNlX2NhbGwoXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8IlwiLCAmbWVzc2FnZV9pZGVudC5uYW1lKT87IiA8PCBlbmRsOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIC8vIEZJWE1FOiByZXBsYWNlIHdpdGggYSAidHJ5IiBibG9jaworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIG1lc3NhZ2VfaWRlbnQubWVzc2FnZV90eXBlID09IFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZW1vdGVfZXJyb3IgPSB0aHJpZnQ6OkVycm9yOjpyZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woc2VsZi5pX3Byb3RfbXV0KCkpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5pX3Byb3RfbXV0KCkucmVhZF9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbihyZW1vdGVfZXJyb3IpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInZlcmlmeV9leHBlY3RlZF9tZXNzYWdlX3R5cGUoVE1lc3NhZ2VUeXBlOjpSZXBseSwgbWVzc2FnZV9pZGVudC5tZXNzYWdlX3R5cGUpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9ICIgPDwgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYykgPDwgIjo6cmVhZF9mcm9tX2luX3Byb3RvY29sKHNlbGYuaV9wcm90X211dCgpKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuaV9wcm90X211dCgpLnJlYWRfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5va19vcigpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIHNlbGZfaXNfbXV0YWJsZSkgeworICBvc3RyaW5nc3RyZWFtIGZ1bmNfYXJnczsKKworICBpZiAoc2VsZl9pc19tdXRhYmxlKSB7CisgICAgZnVuY19hcmdzIDw8ICIoJm11dCBzZWxmIjsKKyAgfSBlbHNlIHsKKyAgICBmdW5jX2FyZ3MgPDwgIigmc2VsZiI7CisgIH0KKworICBpZiAoaGFzX2FyZ3ModGZ1bmMpKSB7CisgICAgZnVuY19hcmdzIDw8ICIsICI7IC8vIHB1dCBjb21tYSBhZnRlciAic2VsZiIKKyAgICBmdW5jX2FyZ3MgPDwgc3RydWN0X3RvX2RlY2xhcmF0aW9uKHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBUX0FSR1MpOworICB9CisKKyAgZnVuY19hcmdzIDw8ICIpIjsKKyAgcmV0dXJuIGZ1bmNfYXJncy5zdHIoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4KSB7CisgIG9zdHJpbmdzdHJlYW0gZnVuY19hcmdzOworICBmdW5jX2FyZ3MgPDwgIigiOworCisgIGlmIChoYXNfYXJncyh0ZnVuYykpIHsKKyAgICBmdW5jX2FyZ3MgPDwgc3RydWN0X3RvX2ludm9jYXRpb24odGZ1bmMtPmdldF9hcmdsaXN0KCksIGZpZWxkX3ByZWZpeCk7CisgIH0KKworICBmdW5jX2FyZ3MgPDwgIikiOworICByZXR1cm4gZnVuY19hcmdzLnN0cigpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cnVjdF90b19kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpIHsKKyAgb3N0cmluZ3N0cmVhbSBhcmdzOworCisgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGZpZWxkX2l0ZXI7CisgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCpmaWVsZF9pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBmaWVsZF9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKHRmaWVsZCwgc3RydWN0X3R5cGUpOworICAgIHN0cmluZyBydXN0X3R5cGUgPSB0b19ydXN0X3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBydXN0X3R5cGUgPSBpc19vcHRpb25hbChmaWVsZF9yZXEpID8gIk9wdGlvbjwiICsgcnVzdF90eXBlICsgIj4iIDogcnVzdF90eXBlOworCisgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgIiwgIjsKKyAgICB9CisKKyAgICBhcmdzIDw8IHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpIDw8ICI6ICIgPDwgcnVzdF90eXBlOworICB9CisKKyAgcmV0dXJuIGFyZ3Muc3RyKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RydWN0X3RvX2ludm9jYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4KSB7CisgIG9zdHJpbmdzdHJlYW0gYXJnczsKKworICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBmaWVsZF9pdGVyOworICBmb3IgKGZpZWxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmllbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqZmllbGRfaXRlcik7CisKKyAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCAiLCAiOworICAgIH0KKworICAgIGFyZ3MgPDwgZmllbGRfcHJlZml4IDw8IHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpOworICB9CisKKyAgcmV0dXJuIGFyZ3Muc3RyKCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgICBzdHJpbmcgYXJnc19zdHJ1Y3RfbmFtZShzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0ZnVuYykpOworICAgIHJlbmRlcl9zdHJ1Y3QoYXJnc19zdHJ1Y3RfbmFtZSwgdGZ1bmMtPmdldF9hcmdsaXN0KCksIHRfcnNfZ2VuZXJhdG9yOjpUX0FSR1MpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2VydmljZV9jYWxsX3Jlc3VsdF92YWx1ZV9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgc3RyaW5nIHJlc3VsdF9zdHJ1Y3RfbmFtZSA9IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpOworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHJlc3VsdF9zdHJ1Y3RfbmFtZSk7CisKKyAgdF9maWVsZCByZXR1cm5fdmFsdWUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCksIFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFLCAwKTsKKyAgcmV0dXJuX3ZhbHVlLnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgIGlmICghdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnJldHVybl92YWx1ZSk7CisgIH0KKworICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y2VwdGlvbl90eXBlcyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGV4Y2VwdGlvbl9pdGVyOworICBmb3IoZXhjZXB0aW9uX2l0ZXIgPSBleGNlcHRpb25fdHlwZXMuYmVnaW4oKTsgZXhjZXB0aW9uX2l0ZXIgIT0gZXhjZXB0aW9uX3R5cGVzLmVuZCgpOyArK2V4Y2VwdGlvbl9pdGVyKSB7CisgICAgdF9maWVsZCogZXhjZXB0aW9uX3R5cGUgPSAqZXhjZXB0aW9uX2l0ZXI7CisgICAgZXhjZXB0aW9uX3R5cGUtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb25fdHlwZSk7CisgIH0KKworICByZW5kZXJfc3RydWN0KHJlc3VsdF9zdHJ1Y3RfbmFtZSwgJnJlc3VsdCwgdF9yc19nZW5lcmF0b3I6OlRfUkVTVUxUKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgUHJvY2Vzc29yCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzb3IodF9zZXJ2aWNlICp0c2VydmljZSkgeworICByZW5kZXJfdHlwZV9jb21tZW50KHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIiBzZXJ2aWNlIHByb2Nlc3NvciIpOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfdHJhaXQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19wcm9jZXNzb3JfZGVmaW5pdGlvbl9hbmRfaW1wbCh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5zaW9uID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgZXh0ZW5zaW9uID0gIiA6ICIgKyBydXN0X25hbWVzcGFjZShleHRlbmRzKSArIHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUoZXh0ZW5kcyk7CisgIH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdHNlcnZpY2UpOworICBmX2dlbl8gPDwgInB1YiB0cmFpdCAiIDw8IHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodHNlcnZpY2UpIDw8IGV4dGVuc2lvbiA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgc3RyaW5nIGZ1bmNfbmFtZSA9IHNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodGZ1bmMpOworICAgIHN0cmluZyBmdW5jX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRmdW5jLCBmYWxzZSk7CisgICAgc3RyaW5nIGZ1bmNfcmV0dXJuID0gdG9fcnVzdF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0ZnVuYyk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuICIKKyAgICAgIDw8IGZ1bmNfbmFtZSA8PCAgZnVuY19hcmdzCisgICAgICA8PCAiIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZnVuY19yZXR1cm4gPDwgIj47IgorICAgICAgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzb3JfZGVmaW5pdGlvbl9hbmRfaW1wbCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lID0gcnVzdF9zeW5jX3Byb2Nlc3Nvcl9uYW1lKHRzZXJ2aWNlKTsKKyAgc3RyaW5nIGhhbmRsZXJfdHJhaXRfbmFtZSA9IHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodHNlcnZpY2UpOworCisgIC8vIHN0cnVjdAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgc3RydWN0ICIgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZQorICAgIDw8ICI8SDogIiA8PCBoYW5kbGVyX3RyYWl0X25hbWUKKyAgICA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImhhbmRsZXI6IEgsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGRlbGVnYXRpbmcgaW1wbAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsIDxIOiAiIDw8IGhhbmRsZXJfdHJhaXRfbmFtZSA8PCAiPiAiCisgICAgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZQorICAgIDw8ICI8SD4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgZm4gbmV3KGhhbmRsZXI6IEgpIC0+ICIgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA8PCAiPEg+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImhhbmRsZXIsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgcmVuZGVyX3N5bmNfcHJvY2Vzc19kZWxlZ2F0aW9uX2Z1bmN0aW9ucyh0c2VydmljZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gYWN0dWFsIGltcGwKKyAgc3RyaW5nIHNlcnZpY2VfYWN0dWFsX3Byb2Nlc3Nvcl9uYW1lID0gcnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodHNlcnZpY2UpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBzdHJ1Y3QgIiA8PCBzZXJ2aWNlX2FjdHVhbF9wcm9jZXNzb3JfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaW1wbCAiIDw8IHNlcnZpY2VfYWN0dWFsX3Byb2Nlc3Nvcl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICByZW5kZXJfc3luY19wcm9jZXNzX2Z1bmN0aW9uKHRmdW5jLCBoYW5kbGVyX3RyYWl0X25hbWUpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBwcm9jZXNzb3IgaW1wbAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJpbXBsIDxIOiAiCisgICAgPDwgaGFuZGxlcl90cmFpdF9uYW1lIDw8ICI+IFRQcm9jZXNzb3IgZm9yICIKKyAgICA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lCisgICAgPDwgIjxIPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImZuIHByb2Nlc3MoJnNlbGYsIGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKT87IiA8PCBlbmRsOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlcyA9IG1hdGNoICYqbWVzc2FnZV9pZGVudC5uYW1lIHsiIDw8IGVuZGw7IC8vIFtzaWdoXSBleHBsaWNpdCBkZXJlZiBjb2VyY2lvbgorICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyh0c2VydmljZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJBcHBsaWNhdGlvbiIsCisgICAgIkFwcGxpY2F0aW9uRXJyb3IiLAorICAgICJBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bk1ldGhvZCIsCisgICAgImZvcm1hdCEoXCJ1bmtub3duIG1ldGhvZCB7fVwiLCBtZXRob2QpIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpzZXJ2ZXI6OmhhbmRsZV9wcm9jZXNzX3Jlc3VsdCgmbWVzc2FnZV9pZGVudCwgcmVzLCBvX3Byb3QpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGFjdHVhbF9wcm9jZXNzb3IocnVzdF9uYW1lc3BhY2UodHNlcnZpY2UpICsgcnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodHNlcnZpY2UpKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lKCJwcm9jZXNzXyIgKyBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4gIiA8PCBmdW5jdGlvbl9uYW1lCisgICAgICA8PCAiKCZzZWxmLCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyOiBpMzIsICIKKyAgICAgIDw8ICJpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsICIKKyAgICAgIDw8ICJvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAiCisgICAgICA8PCAiLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgYWN0dWFsX3Byb2Nlc3NvcgorICAgICAgPDwgIjo6IiA8PCBmdW5jdGlvbl9uYW1lCisgICAgICA8PCAiKCIKKyAgICAgIDw8ICImc2VsZi5oYW5kbGVyLCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyLCAiCisgICAgICA8PCAiaV9wcm90LCAiCisgICAgICA8PCAib19wcm90IgorICAgICAgPDwgIikiCisgICAgICA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICByZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKGV4dGVuZHMpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiIgPDwgIiA9PiB7IiA8PCBlbmRsOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInNlbGYucHJvY2Vzc18iIDw8IHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkKKyAgICAgIDw8ICIobWVzc2FnZV9pZGVudC5zZXF1ZW5jZV9udW1iZXIsIGlfcHJvdCwgb19wcm90KSIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgcmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyhleHRlbmRzKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19wcm9jZXNzX2Z1bmN0aW9uKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmhhbmRsZXJfdHlwZSkgeworICBzdHJpbmcgc2VxdWVuY2VfbnVtYmVyX3BhcmFtKCJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIiKTsKKyAgc3RyaW5nIG91dHB1dF9wcm90b2NvbF9wYXJhbSgib19wcm90Iik7CisKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIHNlcXVlbmNlX251bWJlcl9wYXJhbSA9ICJfIjsKKyAgICBvdXRwdXRfcHJvdG9jb2xfcGFyYW0gPSAiXyI7CisgIH0KKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gcHJvY2Vzc18iIDw8IHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkKKyAgICA8PCAiPEg6ICIgPDwgaGFuZGxlcl90eXBlIDw8ICI+IgorICAgIDw8ICIoaGFuZGxlcjogJkgsICIKKyAgICA8PCBzZXF1ZW5jZV9udW1iZXJfcGFyYW0gPDwgIjogaTMyLCAiCisgICAgPDwgImlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgIgorICAgIDw8IG91dHB1dF9wcm90b2NvbF9wYXJhbSA8PCAiOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgIgorICAgIDw8ICItPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vICphbHdheXMqIHJlYWQgYXJndW1lbnRzIGZyb20gdGhlIGlucHV0IHByb3RvY29sCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCAiCisgICAgPDwgKGhhc19ub25fdm9pZF9hcmdzKHRmdW5jKSA/ICJhcmdzIiA6ICJfIikKKyAgICA8PCAiID0gIgorICAgIDw8IHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRmdW5jKQorICAgIDw8ICI6OnJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3QpPzsiCisgICAgPDwgZW5kbDsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJtYXRjaCBoYW5kbGVyLiIKKyAgICA8PCBzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRmdW5jKQorICAgIDw8IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0ZnVuYywgImFyZ3MuIikKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsgLy8gc3RhcnQgbWF0Y2gKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gaGFuZGxlciBzdWNjZWVkZWQKKyAgc3RyaW5nIGhhbmRsZXJfcmV0dXJuX3ZhcmlhYmxlID0gdGZ1bmMtPmlzX29uZXdheSgpIHx8IHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgPyAiXyIgOiAiaGFuZGxlcl9yZXR1cm4iOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCIgPDwgaGFuZGxlcl9yZXR1cm5fdmFyaWFibGUgPDwgIikgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc3VjY2VlZGVkKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgLy8gaGFuZGxlciBmYWlsZWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIoZSkgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGVuZCBtYXRjaAorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZW5kIGZ1bmN0aW9uCit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfc3VjY2VlZGVkKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiCisgICAgICA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSZXBseSwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcik7IgorICAgICAgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldCA9ICIgPDwgaGFuZGxlcl9zdWNjZXNzZnVsX3JldHVybl9zdHJ1Y3QodGZ1bmMpIDw8IjsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXQud3JpdGVfdG9fb3V0X3Byb3RvY29sKG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3QuZmx1c2goKSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBzdHJpbmcgZXJyX3ZhcigiZSIpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggIiA8PCBlcnJfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gaWYgdGhlcmUgYXJlIGFueSB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlIGNhbGwgaGFuZGxlIHRoZW0gZmlyc3QKKyAgaWYgKHRmdW5jLT5nZXRfeGNlcHRpb25zKCkgIT0gTlVMTCAmJiB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfc29ydGVkX21lbWJlcnMoKS5zaXplKCkgPiAwKSB7CisgICAgc3RyaW5nIHVzZXJfZXJyX3ZhcigidXNyX2VyciIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6VXNlcigiIDw8IHVzZXJfZXJyX3ZhciA8PCAiKSA9PiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX3VzZXJfZXhjZXB0aW9uX2JyYW5jaCh0ZnVuYyk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgLy8gYXBwbGljYXRpb24gZXJyb3IKKyAgc3RyaW5nIGFwcF9lcnJfdmFyKCJhcHBfZXJyIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24oIiA8PCBhcHBfZXJyX3ZhciA8PCAiKSA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2JyYW5jaCh0ZnVuYywgYXBwX2Vycl92YXIpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIC8vIGRlZmF1bHQgY2FzZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2RlZmF1bHRfZXhjZXB0aW9uX2JyYW5jaCh0ZnVuYyk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF91c2VyX2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgaWYgKHRmdW5jLT5nZXRfeGNlcHRpb25zKCkgPT0gTlVMTCB8fCB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfc29ydGVkX21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgdGhyb3cgImNhbm5vdCByZW5kZXIgdXNlciBleGNlcHRpb24gYnJhbmNoZXMgaWYgbm8gdXNlciBleGNlcHRpb25zIGRlZmluZWQiOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiB0eGNlcHRpb25zID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhjZXB0aW9uX2l0ZXI7CisgIGludCBicmFuY2hlc19yZW5kZXJlZCA9IDA7CisKKyAgLy8gcnVuIHRocm91Z2ggYWxsIHVzZXItZGVmaW5lZCBleGNlcHRpb25zCisgIGZvciAoeGNlcHRpb25faXRlciA9IHR4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB0eGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB4Y2VwdGlvbl9maWVsZCA9ICgqeGNlcHRpb25faXRlcik7CisKKyAgICBzdHJpbmcgaWZfc3RhdGVtZW50KGJyYW5jaGVzX3JlbmRlcmVkID09IDAgPyAiaWYgdXNyX2VyciIgOiAifSBlbHNlIGlmIHVzcl9lcnIiKTsKKyAgICBzdHJpbmcgZXhjZXB0aW9uX3R5cGUodG9fcnVzdF90eXBlKHhjZXB0aW9uX2ZpZWxkLT5nZXRfdHlwZSgpKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGlmX3N0YXRlbWVudCA8PCAiLmRvd25jYXN0X3JlZjo6PCIgPDwgZXhjZXB0aW9uX3R5cGUgPDwgIj4oKS5pc19zb21lKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgZXJyID0gdXNyX2Vyci5kb3duY2FzdDo6PCIgPDwgZXhjZXB0aW9uX3R5cGUgPDwgIj4oKS5leHBlY3QoXCJkb3duY2FzdCBhbHJlYWR5IGNoZWNrZWRcIik7IgorICAgICAgPDwgZW5kbDsKKworICAgIC8vIHJlbmRlciB0aGUgbWVtYmVycyBvZiB0aGUgcmV0dXJuIHN0cnVjdAorICAgIG9zdHJpbmdzdHJlYW0gbWVtYmVyczsKKworICAgIGJvb2wgaGFzX3Jlc3VsdF92YXJpYWJsZSA9ICEodGZ1bmMtPmlzX29uZXdheSgpIHx8IHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpOworICAgIGlmIChoYXNfcmVzdWx0X3ZhcmlhYmxlKSB7CisgICAgICBtZW1iZXJzIDw8IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFIDw8ICI6IE5vbmUsICI7CisgICAgfQorCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25fbWVtYmVyc19pdGVyOworICAgIGZvcih4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIgPSB0eGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX21lbWJlcnNfaXRlciAhPSB0eGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCp4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICAgIGlmIChtZW1iZXIgPT0geGNlcHRpb25fZmllbGQpIHsKKyAgICAgICAgbWVtYmVycyA8PCBtZW1iZXJfbmFtZSA8PCAiOiBTb21lKCplcnIpLCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtYmVycyA8PCBtZW1iZXJfbmFtZSA8PCAiOiBOb25lLCAiOworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyBtZW1iZXJfc3RyaW5nID0gbWVtYmVycy5zdHIoKTsKKyAgICBtZW1iZXJfc3RyaW5nLnJlcGxhY2UobWVtYmVyX3N0cmluZy5zaXplKCkgLSAyLCAyLCAiICIpOyAvLyB0cmltIHRyYWlsaW5nIGNvbW1hCisKKyAgICAvLyBub3cgd3JpdGUgb3V0IHRoZSByZXR1cm4gc3RydWN0CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCByZXRfZXJyID0gIgorICAgICAgPDwgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYykKKyAgICAgIDw8ICJ7ICIgPDwgbWVtYmVyX3N0cmluZyA8PCAifTsiCisgICAgICA8PCBlbmRsOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gIgorICAgICAgPDwgIlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCIKKyAgICAgIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJlcGx5LCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyKTsiCisgICAgICA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXRfZXJyLndyaXRlX3RvX291dF9wcm90b2NvbChvX3Byb3QpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LmZsdXNoKCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgYnJhbmNoZXNfcmVuZGVyZWQrKzsKKyAgfQorCisgIC8vIHRoZSBjYXRjaCBhbGwsIGlmIHNvbWVob3cgaXQgd2FzIGEgdXNlciBleGNlcHRpb24gdGhhdCB3ZSBkb24ndCBzdXBwb3J0CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEZJWE1FOiBzYW1lIGFzIGRlZmF1bHQgYmxvY2sgYmVsb3cKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXRfZXJyID0geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KCJBcHBsaWNhdGlvbkVycm9yIiwgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duIiwgInVzcl9lcnIuZGVzY3JpcHRpb24oKSIpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRmdW5jLCAicmV0X2VyciIpOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2JyYW5jaCgKKyAgICB0X2Z1bmN0aW9uICp0ZnVuYywKKyAgICBjb25zdCBzdHJpbmcgJmFwcF9lcnJfdmFyCispIHsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKCIgPDwgYXBwX2Vycl92YXIgPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodGZ1bmMsIGFwcF9lcnJfdmFyKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9kZWZhdWx0X2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0X2VyciA9IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgiQXBwbGljYXRpb25FcnJvciIsICJBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biIsICJlLmRlc2NyaXB0aW9uKCkiKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKHJldF9lcnIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRmdW5jLCAicmV0X2VyciIpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmZXJyX3ZhcikgeworICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiCisgICAgICA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIpOyIKKyAgICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6d3JpdGVfYXBwbGljYXRpb25fZXJyb3JfdG9fb3V0X3Byb3RvY29sKCYiIDw8IGVycl92YXIgPDwgIiwgb19wcm90KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LmZsdXNoKCkiIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6aGFuZGxlcl9zdWNjZXNzZnVsX3JldHVybl9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgaW50IG1lbWJlcl9jb3VudCA9IDA7CisgIG9zdHJpbmdzdHJlYW0gcmV0dXJuX3N0cnVjdDsKKworICByZXR1cm5fc3RydWN0IDw8IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpIDw8ICIgeyAiOworCisgIC8vIGFjdHVhbCByZXR1cm4KKyAgaWYgKCF0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmV0dXJuX3N0cnVjdCA8PCAicmVzdWx0X3ZhbHVlOiBTb21lKGhhbmRsZXJfcmV0dXJuKSI7CisgICAgbWVtYmVyX2NvdW50Kys7CisgIH0KKworICAvLyBhbnkgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMKKyAgaWYgKHRmdW5jLT5nZXRfeGNlcHRpb25zKCkgIT0gTlVMTCkgeworICAgIHRfc3RydWN0KiB0eGNlcHRpb25zID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0eGNlcHRpb25zLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogeGNlcHRpb25fZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICBpZiAobWVtYmVyX2NvdW50ID4gMCkgeyByZXR1cm5fc3RydWN0IDw8ICIsICI7IH0KKyAgICAgIHJldHVybl9zdHJ1Y3QgPDwgcnVzdF9maWVsZF9uYW1lKHhjZXB0aW9uX2ZpZWxkKSA8PCAiOiBOb25lIjsKKyAgICAgIG1lbWJlcl9jb3VudCsrOworICAgIH0KKyAgfQorCisgIHJldHVybl9zdHJ1Y3QgPDwgIiB9IjsKKworICByZXR1cm4gIHJldHVybl9zdHJ1Y3Quc3RyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXR5CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV9jb21tZW50KGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSB7CisgIGZfZ2VuXyA8PCAiLy8iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiLy8gIiA8PCB0eXBlX25hbWUgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICIvLyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vIE5PVEU6IGRvICpub3QqIHB1dCBpbiBhbiBleHRyYSBuZXdsaW5lIGFmdGVyIGRvYyBpcyBnZW5lcmF0ZWQuCisvLyBUaGlzIGlzIGJlY2F1c2UgcnVzdCBkb2NzIGhhdmUgdG8gYWJ1dCB0aGUgbGluZSB0aGV5J3JlIGRvY3VtZW50aW5nLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3J1c3Rkb2ModF9kb2MqIHRkb2MpIHsKKyAgaWYgKCF0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChmX2dlbl8sICIiLCAiLy8vICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdGhyaWZ0X2Vycm9yKAorICBjb25zdCBzdHJpbmcmIGVycm9yX2tpbmQsCisgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OiIgPDwgZXJyb3Jfa2luZCA8PCAiKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KGVycm9yX3N0cnVjdCwgc3ViX2Vycm9yX2tpbmQsIGVycm9yX21lc3NhZ2UpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoCisgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZXJyb3Jfc3RydWN0IDw8ICI6Om5ldygiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3ViX2Vycm9yX2tpbmQgPDwgIiwiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBlcnJvcl9tZXNzYWdlIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfZG91YmxlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnRvX3J1c3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQpIHsKKyAgLy8gdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsgPC0tIHJlY3Vyc2VzIHRocm91Z2ggYXMgbWFueSB0eXBlZGVmIGxheWVycyBhcyBuZWNlc3NhcnkKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiKCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAiVmVjPHU4PiI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJpOCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gImkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gImkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAob3JkZXJlZF9mbG9hdCkgeworICAgICAgICByZXR1cm4gIk9yZGVyZWRGbG9hdDxmNjQ+IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiZjY0IjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAodF90eXBlZGVmKil0dHlwZTsKKyAgICBzdHJpbmcgcnVzdF90eXBlID0gcnVzdF9uYW1lc3BhY2UodHR5cGUpICsgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpOworICAgIHJ1c3RfdHlwZSA9ICB0dHlwZWRlZi0+aXNfZm9yd2FyZF90eXBlZGVmKCkgPyAiQm94PCIgKyBydXN0X3R5cGUgKyAiPiIgOiBydXN0X3R5cGU7CisgICAgcmV0dXJuIHJ1c3RfdHlwZTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHJ1c3RfbmFtZXNwYWNlKHR0eXBlKSArIHJ1c3RfY2FtZWxfY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHJ1c3RfbmFtZXNwYWNlKHR0eXBlKSArIHJ1c3RfY2FtZWxfY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgIHJldHVybiAiQlRyZWVNYXA8IiArIHRvX3J1c3RfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdG9fcnVzdF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgcmV0dXJuICJCVHJlZVNldDwiICsgdG9fcnVzdF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gIlZlYzwiICsgdG9fcnVzdF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9CisKKyAgdGhyb3cgImNhbm5vdCBmaW5kIHJ1c3QgdHlwZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnRvX3J1c3RfY29uc3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICAgIGlmICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAiJlt1OF0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICImc3RyIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdG9fcnVzdF90eXBlKHR0eXBlLCBvcmRlcmVkX2Zsb2F0KTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjp0b19ydXN0X2ZpZWxkX3R5cGVfZW51bSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAid2lsbCBub3QgZ2VuZXJhdGUgcHJvdG9jb2w6OlRUeXBlIGZvciBUWVBFX1ZPSUQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiAvLyBib3RoIHN0cmluZ3MgYW5kIGJpbmFyeSBhcmUgYWN0dWFsbHkgZW5jb2RlZCBhcyBUVHlwZTo6U3RyaW5nCisgICAgICByZXR1cm4gIlRUeXBlOjpTdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGU6OkJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMDgiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZTo6RG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6U3RydWN0IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpNYXAiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGU6OlNldCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGU6Okxpc3QiOworICB9CisKKyAgdGhyb3cgImNhbm5vdCBmaW5kIFRUeXBlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6b3B0X2luX3JlcV9vdXRfdmFsdWUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBPUFRfSU5fUkVRX09VVCB2YWx1ZSBmb3Igdm9pZCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICJTb21lKFZlYzo6bmV3KCkpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiU29tZShcIlwiLnRvX293bmVkKCkpIjsKKyAgICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlNvbWUoZmFsc2UpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJTb21lKDApIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiU29tZShPcmRlcmVkRmxvYXQ6OmZyb20oMC4wKSkiOworICAgIH0KKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJOb25lIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJTb21lKFZlYzo6bmV3KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlNvbWUoQlRyZWVTZXQ6Om5ldygpKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJTb21lKEJUcmVlTWFwOjpuZXcoKSkiOworICB9CisKKyAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBvcHQtaW4tcmVxLW91dCB2YWx1ZSBmb3IgdHlwZSAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodF90eXBlKiB0dHlwZSkgeworICB0X3R5cGUqIGFjdHVhbF90eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmIChhY3R1YWxfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopYWN0dWFsX3R5cGU7CisgICAgcmV0dXJuICEodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHRfdHlwZSogdHR5cGUpIHsKKyAgdF90eXBlKiBhY3R1YWxfdHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICByZXR1cm4gIWNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QoYWN0dWFsX3R5cGUpICYmICFhY3R1YWxfdHlwZS0+aXNfc2VydmljZSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc192b2lkKHRfdHlwZSogdHR5cGUpIHsKKyAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfb3B0aW9uYWwodF9maWVsZDo6ZV9yZXEgcmVxKSB7CisgIHJldHVybiByZXEgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCByZXEgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKK30KKwordF9maWVsZDo6ZV9yZXEgdF9yc19nZW5lcmF0b3I6OmFjdHVhbF9maWVsZF9yZXEodF9maWVsZCogdGZpZWxkLCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSkgeworICByZXR1cm4gc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfQVJHUyA/IHRfZmllbGQ6OlRfUkVRVUlSRUQgOiB0ZmllbGQtPmdldF9yZXEoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aGFzX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuIHRmdW5jLT5nZXRfYXJnbGlzdCgpICE9IE5VTEwgJiYgIXRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfc29ydGVkX21lbWJlcnMoKS5lbXB0eSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpoYXNfbm9uX3ZvaWRfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBib29sIGhhc19ub25fdm9pZF9hcmdzID0gZmFsc2U7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhcmdzX2l0ZXI7CisgIGZvciAoYXJnc19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdzX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKmFyZ3NfaXRlcik7CisgICAgaWYgKCF0ZmllbGQtPmdldF90eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaGFzX25vbl92b2lkX2FyZ3MgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGhhc19ub25fdm9pZF9hcmdzOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnZpc2liaWxpdHlfcXVhbGlmaWVyKHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKSB7CisgIHN3aXRjaChzdHJ1Y3RfdHlwZSkgeworICBjYXNlIHRfcnNfZ2VuZXJhdG9yOjpUX0FSR1M6CisgIGNhc2UgdF9yc19nZW5lcmF0b3I6OlRfUkVTVUxUOgorICAgIHJldHVybiAiIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gInB1YiAiOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9uYW1lc3BhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgIT0gZ2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgeworICAgIHJldHVybiBydXN0X3NuYWtlX2Nhc2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIjo6IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X25hbWVzcGFjZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSAhPSBnZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSB7CisgICAgcmV0dXJuIHJ1c3Rfc25ha2VfY2FzZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiOjoiOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc19yZXNlcnZlZChjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIFJVU1RfUkVTRVJWRURfV09SRFNfU0VULmZpbmQobmFtZSkgIT0gUlVTVF9SRVNFUlZFRF9XT1JEU19TRVQuZW5kKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zdHJ1Y3RfbmFtZSh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgYmFzZV9zdHJ1Y3RfbmFtZShydXN0X2NhbWVsX2Nhc2UodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICByZXR1cm4gcnVzdF9zYWZlX25hbWUoYmFzZV9zdHJ1Y3RfbmFtZSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9maWVsZF9uYW1lKHRfZmllbGQqIHRmaWVsZCkgeworICBzdHJpbmcgYmFzZV9maWVsZF9uYW1lKHJ1c3Rfc25ha2VfY2FzZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKyAgcmV0dXJuIHJ1c3Rfc2FmZV9uYW1lKGJhc2VfZmllbGRfbmFtZSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF91bmlvbl9maWVsZF9uYW1lKHRfZmllbGQqIHRmaWVsZCkgeworICBzdHJpbmcgYmFzZV9maWVsZF9uYW1lKHJ1c3RfY2FtZWxfY2FzZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKyAgcmV0dXJuIHJ1c3Rfc2FmZV9uYW1lKGJhc2VfZmllbGRfbmFtZSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zYWZlX25hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIGlmIChpc19yZXNlcnZlZChuYW1lKSkgeworICAgIHJldHVybiBuYW1lICsgIl8iOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX2NsaWVudF9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuICJoYW5kbGVfIiArIHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgLy8gVGhyaWZ0IGF1dG9tYXRpY2FsbHkgYXBwZW5kcyBgQXJnc2AgdG8gdGhlIGFyZ2xpc3QgbmFtZS4gTm8gbmVlZCB0byBkbyBpdCBoZXJlLgorICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHNlcnZpY2VfbmFtZV8pICsgcnVzdF9jYW1lbF9jYXNlKHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2Uoc2VydmljZV9uYW1lXykgKyBydXN0X2NhbWVsX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpICsgUkVTVUxUX1NUUlVDVF9TVUZGSVg7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiAiVCIgKyBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNDbGllbnRNYXJrZXIiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiAiVCIgKyBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNDbGllbnQiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19jbGllbnRfaW1wbF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0NsaWVudCI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNIYW5kbGVyIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfcHJvY2Vzc29yX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jUHJvY2Vzc29yIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHJldHVybiAiVCIgKyBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlByb2Nlc3NGdW5jdGlvbnMiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfZW51bV92YXJpYW50X25hbWUoY29uc3Qgc3RyaW5nICZuYW1lKSB7CisgIGJvb2wgYWxsX3VwcGVyY2FzZSA9IHRydWU7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGlzYWxudW0obmFtZVtpXSkgJiYgaXNsb3dlcihuYW1lW2ldKSkgeworICAgICAgYWxsX3VwcGVyY2FzZSA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGFsbF91cHBlcmNhc2UpIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShjYW1lbGNhc2UobG93ZXJjYXNlKG5hbWUpKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGNhcGl0YWxpemUoY2FtZWxjYXNlKG5hbWUpKTsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfdXBwZXJfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHN0cih1cHBlcmNhc2UodW5kZXJzY29yZShuYW1lKSkpOworICBzdHJpbmdfcmVwbGFjZShzdHIsICJfXyIsICJfIik7CisgIHJldHVybiBzdHI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zbmFrZV9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgc3RyKGRlY2FwaXRhbGl6ZSh1bmRlcnNjb3JlKG5hbWUpKSk7CisgIHN0cmluZ19yZXBsYWNlKHN0ciwgIl9fIiwgIl8iKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X2NhbWVsX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHN0cmluZyBzdHIoY2FwaXRhbGl6ZShjYW1lbGNhc2UobmFtZSkpKTsKKyAgc3RyaW5nX3JlcGxhY2Uoc3RyLCAiXyIsICIiKTsKKyAgcmV0dXJuIHN0cjsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6c3RyaW5nX3JlcGxhY2Uoc3RyaW5nJiB0YXJnZXQsIGNvbnN0IHN0cmluZyYgc2VhcmNoX3N0cmluZywgY29uc3Qgc3RyaW5nJiByZXBsYWNlX3N0cmluZykgeworICBpZiAodGFyZ2V0LmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzaXplX3QgbWF0Y2hfbGVuID0gc2VhcmNoX3N0cmluZy5sZW5ndGgoKTsKKyAgc2l6ZV90IHJlcGxhY2VfbGVuID0gcmVwbGFjZV9zdHJpbmcubGVuZ3RoKCk7CisKKyAgc2l6ZV90IHNlYXJjaF9pZHggPSAwOworICBzaXplX3QgbWF0Y2hfaWR4OworICB3aGlsZSAoKG1hdGNoX2lkeCA9IHRhcmdldC5maW5kKHNlYXJjaF9zdHJpbmcsIHNlYXJjaF9pZHgpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICB0YXJnZXQucmVwbGFjZShtYXRjaF9pZHgsIG1hdGNoX2xlbiwgcmVwbGFjZV9zdHJpbmcpOworICAgIHNlYXJjaF9pZHggPSBtYXRjaF9pZHggKyByZXBsYWNlX2xlbjsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICBycywKKyAgIlJ1c3QiLAorICAiXG4iKSAvLyBubyBSdXN0LWdlbmVyYXRvci1zcGVjaWZpYyBvcHRpb25zCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWE5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEwNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIFNtYWxsdGFsayBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfc3RfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfc3RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHRlbXBvcmFyeV92YXIgPSAwOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHN0OiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zdCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZW5kX21ldGhvZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3JlY3ZfbWV0aG9kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgc3RkOjpzdHJpbmcgbWFwX3JlYWRlcih0X21hcCogdG1hcCk7CisgIHN0ZDo6c3RyaW5nIGxpc3RfcmVhZGVyKHRfbGlzdCogdGxpc3QpOworICBzdGQ6OnN0cmluZyBzZXRfcmVhZGVyKHRfc2V0KiB0c2V0KTsKKyAgc3RkOjpzdHJpbmcgc3RydWN0X3JlYWRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgY2xzTmFtZSk7CisKKyAgc3RkOjpzdHJpbmcgbWFwX3dyaXRlcih0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGxpc3Rfd3JpdGVyKHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBzZXRfd3JpdGVyKHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgc3RydWN0X3dyaXRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgZm5hbWUpOworCisgIHN0ZDo6c3RyaW5nIHdyaXRlX3ZhbCh0X3R5cGUqIHQsIHN0ZDo6c3RyaW5nIGZuYW1lKTsKKyAgc3RkOjpzdHJpbmcgcmVhZF92YWwodF90eXBlKiB0KTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgc3RfYXV0b2dlbl9jb21tZW50KCk7CisKKyAgdm9pZCBzdF9jbGFzc19kZWYoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgY2F0ZWdvcnkpOworICB2b2lkIHN0X2Nsb3NlX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCk7CisgIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X2NsYXNzX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7CisgIHZvaWQgc3Rfc2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOworICB2b2lkIHN0X2dldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9hY2Nlc3NvcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSgpOworICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpOworICBzdGQ6OnN0cmluZyBjbGllbnRfY2xhc3NfbmFtZSgpOworICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbik7CisKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBhX3R5cGUodF90eXBlKiB0eXBlKTsKKyAgYm9vbCBpc192b3dlbChjaGFyIGMpOworICBzdGQ6OnN0cmluZyB0ZW1wX25hbWUoKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2NhdGVnb3J5KCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisgIGludCB0ZW1wb3JhcnlfdmFyOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHRlbXBvcmFyeV92YXIgPSAwOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi5zdCI7CisgIGZfLm9wZW4oZl9uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmXyA8PCBzdF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIHN0X2NsYXNzX2RlZihmXywgcHJvZ3JhbV9uYW1lXyk7CisgIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOworCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsYXNzX25hbWUoKSB7CisgIHJldHVybiBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pOworfQorCitib29sIHRfc3RfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInByZWZpeCIgfHwgc3ViX25hbWVzcGFjZSA9PSAiY2F0ZWdvcnkiOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgY2xhc3NfbmFtZSkgeworICBzdHJpbmcgcHJlZml4ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5wcmVmaXgiKTsKKyAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKGNsYXNzX25hbWUpOworICBuYW1lID0gcHJlZml4LmVtcHR5KCkgPyBuYW1lIDogKHByZWZpeCArIG5hbWUpOworICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpjbGllbnRfY2xhc3NfbmFtZSgpIHsKKyAgcmV0dXJuIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiQ2xpZW50IjsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0X2F1dG9nZW5fY29tbWVudCgpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCInIikgKyAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsgIlxuIgorICAgICAgICAgKyAiRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICInIVxuIjsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yY2VfY29uc3RzKCkgeworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKQorICAgICA8PCAiIGVudW1zIGF0OiBrIHB1dDogdiB2YWx1ZV0uISIgPDwgZW5kbDsKKworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBrZXlzQW5kVmFsdWVzRG86IFs6ayA6diB8ICIgPDwgcHJlZml4KGNsYXNzX25hbWUoKSkKKyAgICAgPDwgIiBjb25zdGFudHMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpOworICBmXy5jbG9zZSgpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlZF9jYXRlZ29yeSgpIHsKKyAgc3RyaW5nIGNhdCA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsKKyAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgVGhyaWZ0IGdyYW1tYXIsIHRoZSBjYXRlZ29yeSBtdXN0CisgIC8vIGJlIHB1bmN0dWF0ZWQgYnkgZG90cy4gIFJlcGxhY2VzIHRoZW0gd2l0aCBkYXNoZXMgaGVyZS4KKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBjYXQuYmVnaW4oKTsgaXRlciAhPSBjYXQuZW5kKCk7ICsraXRlcikgeworICAgIGlmICgqaXRlciA9PSAnLicpIHsKKyAgICAgICppdGVyID0gJy0nOworICAgIH0KKyAgfQorICByZXR1cm4gY2F0LnNpemUoKSA/IGNhdCA6ICJHZW5lcmF0ZWQtIiArIGNsYXNzX25hbWUoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFNtYWxsdGFsaywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX2RlZihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKKyAgb3V0IDw8ICJPYmplY3Qgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChuYW1lKSA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnIgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicG9vbERpY3Rpb25hcmllczogJyciIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNhdGVnb3J5OiAnIgorICAgICAgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKKyAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lLCAiYXMgeWV0IHVuY2F0ZWdvcml6ZWQiKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMgKyAiIGNsYXNzIiwgbmFtZSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsIGNhdGVnb3J5KTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7CisgIGNoYXIgdGltZXN0cls1MF07CisgIHRpbWVfdCByYXd0aW1lOworICBzdHJ1Y3QgdG0qIHRpbmZvOworCisgIHRpbWUoJnJhd3RpbWUpOworICB0aW5mbyA9IGxvY2FsdGltZSgmcmF3dGltZSk7CisgIHN0cmZ0aW1lKHRpbWVzdHIsIDUwLCAiJW0vJWQvJVkgJUg6JU0iLCB0aW5mbyk7CisKKyAgb3V0IDw8ICIhIiA8PCBwcmVmaXgoY2xzKSA8PCAiIG1ldGhvZHNGb3I6ICciICsgY2F0ZWdvcnkgKyAiJyBzdGFtcDogJ3RocmlmdCAiIDw8IHRpbWVzdHIKKyAgICAgIDw8ICInIVxuIiA8PCBuYW1lIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xvc2VfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0KSB7CisgIG91dCA8PCAiISAhIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X3NldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUgKyAiOiAiICsgdHlwZSk7CisgIG91dCA8PCBuYW1lIDw8ICIgOj0gIiArIHR5cGU7CisgIHN0X2Nsb3NlX21ldGhvZChvdXQpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9nZXR0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICIiKTsKKyAgb3V0IDw8ICJeICIgPDwgbmFtZTsKKyAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgeworICBzdF9zZXR0ZXIob3V0LCBjbHMsIG5hbWUsIHR5cGUpOworICBzdF9nZXR0ZXIob3V0LCBjbHMsIG5hbWUpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKSB7CisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY2xhc3MiIDw8IGVuZGwgPDwgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnY29uc3RhbnRzIGVudW1zJyEiCisgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiZW51bXMiKTsKKyAgc3RfYWNjZXNzb3JzKGZfLCBjbGFzc19uYW1lKCkgKyAiIGNsYXNzIiwgImNvbnN0YW50cyIpOworCisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKKworICBmXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgY2xzX25hbWUgPSBwcm9ncmFtX25hbWVfICsgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBhdDogJyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIicgcHV0OiBbIgorICAgICA8PCAiKERpY3Rpb25hcnkgbmV3ICIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmXyA8PCAiXHRhdDogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHB1dDogIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfIDw8ICJcdHlvdXJzZWxmKV0hIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGF0OiAnIiA8PCBuYW1lIDw8ICInIHB1dDogWyIKKyAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiXSEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAiKCIgPDwgY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiIG5ldyAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICIoRGljdGlvbmFyeSBuZXciIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpOworICAgICAgb3V0IDw8ICJhdDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgcHV0OiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiKFNldCBuZXciIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKE9yZGVyZWRDb2xsZWN0aW9uIG5ldyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgImFkZDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgU21hbGx0YWxrIHN0cnVjdAorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNtYWxsdGFsayBjbGFzcyB0byByZXByZXNlbnQgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIG91dCA8PCAiRXJyb3IiOworICBlbHNlCisgICAgb3V0IDw8ICJPYmplY3QiOworCisgIG91dCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCBlbmRsIDw8ICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJyI7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiAiOworICAgICAgb3V0IDw8IGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiJ1xuIgorICAgICAgPDwgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIgorICAgICAgPDwgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIKKyAgICAgIDw8ICJcdGNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyFcblxuIjsKKworICBnZW5lcmF0ZV9hY2Nlc3NvcnMob3V0LCB0c3RydWN0KTsKK30KKworYm9vbCB0X3N0X2dlbmVyYXRvcjo6aXNfdm93ZWwoY2hhciBjKSB7CisgIHN3aXRjaCAodG9sb3dlcihjKSkgeworICBjYXNlICdhJzoKKyAgY2FzZSAnZSc6CisgIGNhc2UgJ2knOgorICBjYXNlICdvJzoKKyAgY2FzZSAndSc6CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmFfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAoaXNfdm93ZWwodHlwZV9uYW1lKHR5cGUpWzBdKSkKKyAgICBwcmVmaXggPSAiYW4iOworICBlbHNlCisgICAgcHJlZml4ID0gImEiOworCisgIHJldHVybiBwcmVmaXggKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0eXBlKSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgc3RyaW5nIHR5cGU7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0X2FjY2Vzc29ycyhvdXQsCisgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSh0eXBlX25hbWUodHN0cnVjdCkpLAorICAgICAgICAgICAgICAgICAgIGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgIGFfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICAvLyBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dGVtcF9uYW1lKCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBvdXQgPDwgInRlbXAiIDw8IHRlbXBvcmFyeV92YXIrKzsKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfd3JpdGVyKHRfbWFwKiB0bWFwLCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGtleSA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVNYXBCZWdpbjogKFRNYXAgbmV3IGtleVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF9rZXlfdHlwZSgpKQorICAgICAgPDwgIjsgdmFsdWVUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGtleXNBbmRWYWx1ZXNEbzogWzoiIDw8IGtleSA8PCAiIDoiIDw8IHZhbCA8PCAiIHwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSkgPDwgIi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZU1hcEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3JlYWRlcih0X21hcCogdG1hcCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTWFwQmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbAorICAgICAgPDwgIiA6PSBEaWN0aW9uYXJ5IG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhdDogIiA8PCByZWFkX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgIDw8ICIgcHV0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkTWFwRW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF93cml0ZXIodF9saXN0KiB0bGlzdCwgc3RyaW5nIGZuYW1lKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZUxpc3RCZWdpbjogKFRMaXN0IG5ldyBlbGVtVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHZhbCkgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUxpc3RFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3RfcmVhZGVyKHRfbGlzdCogdGxpc3QpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkTGlzdEJlZ2luLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IE9yZGVyZWRDb2xsZWN0aW9uIG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYworICAgICAgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRMaXN0RW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3dyaXRlcih0X3NldCogdHNldCwgc3RyaW5nIGZuYW1lKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZVNldEJlZ2luOiAoVFNldCBuZXcgZWxlbVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmbmFtZSA8PCAiIGRvOiBbOiIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU2V0RW5kXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfcmVhZGVyKHRfc2V0KiB0c2V0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZFNldEJlZ2luLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IFNldCBuZXcuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGFkZDogIiA8PCByZWFkX3ZhbCh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRTZXRFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgc25hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlU3RydWN0QmVnaW46ICIKKyAgICAgIDw8ICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIicpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBib29sIG9wdGlvbmFsID0gKCpmbGRfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgc3RyaW5nIGFjY2Vzc29yID0gc25hbWUgKyAiICIgKyBjYW1lbGNhc2UoZm5hbWUpOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzb3IgPDwgIiBpZk5vdE5pbDogWyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZQorICAgICAgICA8PCAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgIDw8ICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgYWNjZXNzb3IpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kIjsKKworICAgIGlmIChvcHRpb25hbCkgeworICAgICAgb3V0IDw8ICJdIjsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8ICIuIiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF9yZWFkZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBjbHNOYW1lID0gIiIpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIGZvdW5kID0gdGVtcF9uYW1lKCk7CisKKyAgaWYgKGNsc05hbWUuc2l6ZSgpID09IDApIHsKKyAgICBjbHNOYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gVGhpcyBpcyBuYXN0eSwgYnV0IHdpdGhvdXQgaXQgd2UnbGwgYnJlYWsgdGhpbmdzIGJ5IHByZWZpeGluZyBUUmVzdWx0LgorICBzdHJpbmcgbmFtZSA9ICgoY2FwaXRhbGl6ZShjbHNOYW1lKSA9PSAiVFJlc3VsdCIpID8gY2FwaXRhbGl6ZShjbHNOYW1lKSA6IHByZWZpeChjbHNOYW1lKSk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSAiIDw8IG5hbWUgPDwgIiBuZXcuIiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFN0cnVjdEJlZ2luLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiWyIgPDwgZGVzYworICAgICAgPDwgIiA6PSBpcHJvdCByZWFkRmllbGRCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYworICAgICAgPDwgIiB0eXBlID0gVFR5cGUgc3RvcF0gd2hpbGVGYWxzZTogW3wiIDw8IGZvdW5kIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgaWQgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiBpZlRydWU6IFsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiA6PSB0cnVlLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiAiCisgICAgICAgIDw8IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjogIiA8PCByZWFkX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCAiXS4iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiBpZk5pbDogW2lwcm90IHNraXA6ICIgPDwgZGVzYyA8PCAiIHR5cGVdXS4iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkU3RydWN0RW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6d3JpdGVfdmFsKHRfdHlwZSogdCwgc3RyaW5nIGZuYW1lKSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImlwcm90IHdyaXRlRG91YmxlOiAiICsgZm5hbWUgKyAiIGFzRmxvYXQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lICsgIiBhc0ludGVnZXIiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gImlwcm90IHdyaXRlIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKSArICI6ICIgKyBmbmFtZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gbWFwX3dyaXRlcigodF9tYXAqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHN0cnVjdF93cml0ZXIoKHRfc3RydWN0Kil0LCBmbmFtZSk7CisgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuIGxpc3Rfd3JpdGVyKCh0X2xpc3QqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiBzZXRfd3JpdGVyKCh0X3NldCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaXByb3Qgd3JpdGVJMzI6ICIgKyBmbmFtZTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKKyAgfQorfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlYWRfdmFsKHRfdHlwZSogdCkgeworICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKKworICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gImlwcm90IHJlYWQiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuIG1hcF9yZWFkZXIoKHRfbWFwKil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHN0cnVjdF9yZWFkZXIoKHRfc3RydWN0Kil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gbGlzdF9yZWFkZXIoKHRfbGlzdCopdCk7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gc2V0X3JlYWRlcigodF9zZXQqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaXByb3QgcmVhZEkzMiI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIHJlYWQgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKKyAgfQorfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZW5kX21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmcgZnVubmFtZSA9IGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSBmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisKKyAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAic2VuZCIgKyBjYXBpdGFsaXplKHNpZ25hdHVyZSkpOworICBmXyA8PCAib3Byb3Qgd3JpdGVNZXNzYWdlQmVnaW46IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmXyA8PCBpbmRlbnQoKSA8PCAiKFRDYWxsTWVzc2FnZSBuZXciIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICJuYW1lOiAnIiA8PCBmdW5uYW1lIDw8ICInOyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNlcWlkOiBzZWxmIG5leHRTZXFpZCkuIgorICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiCisgICAgIDw8ICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyBjYXBpdGFsaXplKGNhbWVsY2FzZShmdW5uYW1lKSkgKyAiX2FyZ3MnKS4iIDw8IGVuZGw7CisKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUKKyAgICAgICA8PCAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkKKyAgICAgICA8PCAiKS4iIDw8IGVuZGw7CisKKyAgICBmXyA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCksIGZuYW1lKSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kLiIgPDwgZW5kbDsKKyAgfQorCisgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmQ7IHdyaXRlTWVzc2FnZUVuZC4iIDw8IGVuZGw7CisgIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2giOworCisgIHN0X2Nsb3NlX21ldGhvZChmXyk7Cit9CisKKy8vIFdlIG9ubHkgc3VwcG9ydCByZWNlaXZpbmcgVFJlc3VsdCBzdHJ1Y3R1cmVzIChzbyB0aGlzIHdvbid0IHdvcmsgb24gdGhlIHNlcnZlciBzaWRlKQordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoZnVuY3Rpb24tPmdldF9uYW1lKCkpOworICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sICJUUmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2VzcyhmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisKKyAgdF9zdHJ1Y3QqIHhzID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBkdXBsaWNhdGUgdGhlIGZpZWxkLCBidXQgY2FsbCBpdCAiZXhjZXB0aW9uIi4uLiB3ZSBkb24ndCBuZWVkIGEgZHluYW1pYyBuYW1lCisgICAgdF9maWVsZCogZXhjZXB0aW9uID0gbmV3IHRfZmllbGQoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCAiZXhjZXB0aW9uIiwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkpOworICAgIHJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uKTsKKyAgfQorCisgIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgInJlY3YiICsgY2FwaXRhbGl6ZShmdW5uYW1lKSk7CisgIGZfIDw8ICJ8IGYgbXNnIHJlcyB8ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXNnIDo9IG9wcm90IHJlYWRNZXNzYWdlQmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJzZWxmIHZhbGlkYXRlUmVtb3RlTWVzc2FnZTogbXNnLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICA8PCAicmVzIDo9ICIgPDwgc3RydWN0X3JlYWRlcigmcmVzdWx0KSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QgcmVhZE1lc3NhZ2VFbmQuIgorICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2guIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJyZXMgZXhjZXB0aW9uIGlmTm90TmlsOiBbcmVzIGV4Y2VwdGlvbiBzaWduYWxdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXiByZXMiOworICBzdF9jbG9zZV9tZXRob2QoZl8pOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQodF9mdW5jdGlvbiogZm4pIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgIlwiIjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoZl9pdGVyICsgMSkgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBvdXQgPDwgIlwiIjsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiVENsaWVudCI7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIkNsaWVudCI7CisgIH0KKworICBmXyA8PCBleHRlbmRzX2NsaWVudCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgoY2xpZW50X2NsYXNzX25hbWUoKSkgPDwgZW5kbAorICAgICA8PCAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnXG4iCisgICAgIDw8ICJcdGNsYXNzVmFyaWFibGVOYW1lczogJydcbiIKKyAgICAgPDwgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIKKyAgICAgPDwgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworCisgICAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCBzaWduYXR1cmUpOworICAgIGZfIDw8IGZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQoKmZfaXRlcikgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VsZiBzZW5kIgorICAgICAgIDw8IGNhcGl0YWxpemUoc2lnbmF0dXJlKSA8PCAiLiIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl8gPDwgaW5kZW50KCkgPDwgIl4gc2VsZiByZWN2IiA8PCBjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgc3VjY2VzcyAiIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKKworICAgIGdlbmVyYXRlX3NlbmRfbWV0aG9kKCpmX2l0ZXIpOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfcmVjdl9tZXRob2QoKmZfaXRlcik7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuIGNhbWVsY2FzZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiICI7CisgICAgfQorICAgIHN0cmluZyBuYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgcmVzdWx0ICs9IG5hbWUgKyAiOiAiICsgbmFtZTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgeworICAgICAgcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfdHlwZXMuIjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOworICB9CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKKy8qIENvbnZlcnQgdF90eXBlIHRvIFNtYWxsdGFsayB0eXBlIGNvZGUgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUgc3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlIGJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlIGJ5dGUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZSBpMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZSBpMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZSBpNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZSBkb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlIGkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUgc3RydWN0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUgbWFwIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUgc2V0IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlIGxpc3QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHN0LCAiU21hbGx0YWxrIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGIwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMxOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c2V0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogU3dpZnQgMyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBEZXNpZ25lZCBmcm9tIHRoZSBTd2lmdC9Db2NvYSBjb2RlIGdlbmVyYXRvcihzKQorICovCitjbGFzcyB0X3N3aWZ0X2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3N3aWZ0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxvZ191bmV4cGVjdGVkXyA9IGZhbHNlOworICAgIGFzeW5jX2NsaWVudHNfID0gZmFsc2U7CisgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IGZhbHNlOworICAgIG5vX3N0cmljdF8gPSBmYWxzZTsKKyAgICBuYW1lc3BhY2VkXyA9IGZhbHNlOworICAgIGdlbl9jb2NvYV8gPSBmYWxzZTsKKyAgICBwcm9taXNlX2tpdF8gPSBmYWxzZTsKKyAgICBzYWZlX2VudW1zXyA9IGZhbHNlOworCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibG9nX3VuZXhwZWN0ZWQiKSA9PSAwKSB7CisgICAgICAgIGxvZ191bmV4cGVjdGVkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFzeW5jX2NsaWVudHMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jX2NsaWVudHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fc3RyaWN0IikgPT0gMCkgeworICAgICAgICBub19zdHJpY3RfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZGVidWdfZGVzY3JpcHRpb25zIikgPT0gMCkgeworICAgICAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibmFtZXNwYWNlZCIpID09IDApIHsKKyAgICAgICAgbmFtZXNwYWNlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJjb2NvYSIpID09IDApIHsKKyAgICAgICAgZ2VuX2NvY29hXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInNhZmVfZW51bXMiKSA9PSAwKSB7CisgICAgICAgIHNhZmVfZW51bXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJvbWlzZV9raXQiKSA9PSAwKSB7CisgICAgICAgIGlmIChnZW5fY29jb2FfID09IGZhbHNlKSB7CisgICAgICAgICAgdGhyb3cgIlByb21pc2VLaXQgb25seSBhdmFpbGFibGUgd2l0aCBTd2lmdCAyLngsIHVzZSBgY29jb2FgIG9wdGlvbiIgKyBpdGVyLT5maXJzdDsKKyAgICAgICAgfQorICAgICAgICBwcm9taXNlX2tpdF8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHN3aWZ0OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zd2lmdCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9lcXVhdGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF90aHJpZnRfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKKworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3ByaW50YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0cmluZyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2wob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RyaW5nIHN3aWZ0X2ltcG9ydHMoKTsKKyAgc3RyaW5nIHN3aWZ0X3RocmlmdF9pbXBvcnRzKCk7CisgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpc19vcHRpb25hbD1mYWxzZSwgYm9vbCBpc19mb3JjZWQ9ZmFsc2UpOworICBzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKKyAgc3RyaW5nIGRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3ByaXZhdGUpOworICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0cmluZyBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworCisgIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJvdG9jb2xfbmFtZSwgYm9vbCBpc19pbnRlcm5hbCk7CisgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSwgYm9vbCBxdWFsaWZpZWQ9ZmFsc2UpOworICBzdHJpbmcgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoY29uc3Qgc3RyaW5nJiBpZGVudGlmaWVyKTsKKyAgdm9pZCBwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpOworICAvKiogU3dpZnQgMyBzcGVjaWZpYyAqLworICBzdHJpbmcgZW51bV9jYXNlX25hbWUodF9lbnVtX3ZhbHVlKiB0ZW51bV9jYXNlLCBib29sIGRlY2xhcmF0aW9uKTsKKyAgc3RyaW5nIGVudW1fY29uc3RfbmFtZShzdHJpbmcgZW51bV9pZGVudGlmaWVyKTsKKyAgdm9pZCBmdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgc3RyaW5nJiBkb2MpOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGNhcnJ5b3ZlciAqLworICBzdHJpbmcgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki8KKyAgdm9pZCBnZW5lcmF0ZV9vbGRfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgic3dpZnQiKTsKKyAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIHJldHVybiByZWFsX21vZHVsZTsKKyAgfQorcHJpdmF0ZToKKworICB2b2lkIGJsb2NrX29wZW4ob3N0cmVhbSYgb3V0KSB7CisgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHZvaWQgYmxvY2tfY2xvc2Uob3N0cmVhbSYgb3V0LCBib29sIGVuZF9saW5lPXRydWUpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICBpZiAoZW5kX2xpbmUpIG91dCA8PCBlbmRsOworICB9CisKKyAgYm9vbCBmaWVsZF9pc19vcHRpb25hbCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgICBib29sIG9wdCA9IHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKHRmaWVsZC0+YW5ub3RhdGlvbnNfLmZpbmQoInN3aWZ0Lm51bGxhYmxlIikgIT0gdGZpZWxkLT5hbm5vdGF0aW9uc18uZW5kKCkgJiYgdGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3B0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGdlbl9jb2NvYV8pIHsgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHksIG9ubHkgaWYgaXRzIGFjdHVhbGx5ICJvcHRpb25hbCIKKyAgICAgIG9wdCA9IHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgfQorICAgIHJldHVybiBvcHQ7CisgIH0KKworICBib29sIHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRfc3RydWN0KiB0c3RydWN0KSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghZmllbGRfaXNfb3B0aW9uYWwoKm1faXRlcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgc3RydWN0X2hhc19vcHRpb25hbF9maWVsZHModF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKCptX2l0ZXIpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdHJpbmcgY29uc3RhbnRzX2RlY2xhcmF0aW9uc187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZGVjbF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pbXBsXzsKKworICBib29sIGxvZ191bmV4cGVjdGVkXzsKKyAgYm9vbCBhc3luY19jbGllbnRzXzsKKworICBib29sIGRlYnVnX2Rlc2NyaXB0aW9uc187CisgIGJvb2wgbm9fc3RyaWN0XzsKKyAgYm9vbCBuYW1lc3BhY2VkXzsKKyAgYm9vbCBzYWZlX2VudW1zXzsKKyAgc2V0PHN0cmluZz4gc3dpZnRfcmVzZXJ2ZWRfd29yZHNfOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGNvbXBhdGliaWxpdHkgKi8KKyAgYm9vbCBnZW5fY29jb2FfOworICBib29sIHByb21pc2Vfa2l0XzsKKworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKHByb2dyYW1fKTsKKyAgc3RyaW5nIG91dF9kaXIgPSBnZXRfb3V0X2RpcigpOworICBzdHJpbmcgbW9kdWxlX3BhdGggPSBvdXRfZGlyOworICBzdHJpbmcgbmFtZSA9IHByb2dyYW1fbmFtZV87CisgIGlmIChuYW1lc3BhY2VkXyAmJiAhbW9kdWxlLmVtcHR5KCkpIHsKKyAgICBtb2R1bGVfcGF0aCA9IG1vZHVsZV9wYXRoICsgIi8iICsgbW9kdWxlOworICAgIG5hbWUgPSBtb2R1bGU7CisgIH0KKyAgTUtESVIobW9kdWxlX3BhdGguY19zdHIoKSk7CisKKyAgcG9wdWxhdGVfcmVzZXJ2ZWRfd29yZHMoKTsKKworICAvLyB3ZSBoYXZlIGEgLnN3aWZ0IGRlY2xhcmF0aW9ucyBmaWxlLi4uCisgIHN0cmluZyBmX2RlY2xfbmFtZSA9IG5hbWUgKyAiLnN3aWZ0IjsKKyAgc3RyaW5nIGZfZGVjbF9mdWxsbmFtZSA9IG1vZHVsZV9wYXRoICsgIi8iICsgZl9kZWNsX25hbWU7CisgIGZfZGVjbF8ub3BlbihmX2RlY2xfZnVsbG5hbWUuY19zdHIoKSk7CisKKyAgZl9kZWNsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIGZfZGVjbF8gPDwgc3dpZnRfaW1wb3J0cygpIDw8IHN3aWZ0X3RocmlmdF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICAvLyAuLi5hbmQgYSAuc3dpZnQgaW1wbGVtZW50YXRpb24gZXh0ZW5zaW9ucyBmaWxlCisgIHN0cmluZyBmX2ltcGxfbmFtZSA9IG5hbWUgKyAiK0V4dHMuc3dpZnQiOworICBzdHJpbmcgZl9pbXBsX2Z1bGxuYW1lID0gbW9kdWxlX3BhdGggKyAiLyIgKyBmX2ltcGxfbmFtZTsKKyAgZl9pbXBsXy5vcGVuKGZfaW1wbF9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBzd2lmdF9pbXBvcnRzKCkgPDwgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIENvY29hIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQ29jb2EgbGlicmFyaWVzCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6c3dpZnRfaW1wb3J0cygpIHsKKworICB2ZWN0b3I8c3RyaW5nPiBpbmNsdWRlc19saXN0OworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiRm91bmRhdGlvbiIpOworCisgIG9zdHJpbmdzdHJlYW0gaW5jbHVkZXM7CisKKyAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgZm9yIChpX2l0ZXI9aW5jbHVkZXNfbGlzdC5iZWdpbigpOyBpX2l0ZXIhPWluY2x1ZGVzX2xpc3QuZW5kKCk7ICsraV9pdGVyKSB7CisgICAgaW5jbHVkZXMgPDwgImltcG9ydCAiIDw8ICppX2l0ZXIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChuYW1lc3BhY2VkXykgeworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgcHJvZ3JhbV9pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByb2dyYW1faW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGluY2x1ZGVzIDw8ICgiaW1wb3J0ICIgKyBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbV9pbmNsdWRlc1tpXSkpIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluY2x1ZGVzIDw8IGVuZGw7CisKKyAgcmV0dXJuIGluY2x1ZGVzLnN0cigpOworfQorCisvKioKKyAqIFByaW50cyBUaHJpZnQgcnVudGltZSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBUaHJpZnQgcnVudGltZQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnN3aWZ0X3RocmlmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUaHJpZnQiKTsKKworICBpZiAoZ2VuX2NvY29hXyAmJiBwcm9taXNlX2tpdF8pIHsKKyAgICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiUHJvbWlzZUtpdCIpOworICB9CisKKyAgb3N0cmluZ3N0cmVhbSBpbmNsdWRlczsKKworICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICBmb3IgKGlfaXRlcj1pbmNsdWRlc19saXN0LmJlZ2luKCk7IGlfaXRlciE9aW5jbHVkZXNfbGlzdC5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICBpbmNsdWRlcyA8PCAiaW1wb3J0ICIgPDwgKmlfaXRlciA8PCBlbmRsOworICB9CisKKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICByZXR1cm4gaW5jbHVkZXMuc3RyKCk7Cit9CisKKy8qKgorICogRmluaXNoIHVwIGdlbmVyYXRpb24uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gc3RpY2sgb3VyIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGZpbGUKKyAgLy8gc2luY2UgdGhleSByZWZlciB0byB0aGluZ3Mgd2UgYXJlIGRlZmluaW5nLgorICBmX2RlY2xfIDw8IGNvbnN0YW50c19kZWNsYXJhdGlvbnNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gU3dpZnQKKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHR5cGVhbGlhcyAiIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKQorICAgICAgICAgIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbDsKKyAgZl9kZWNsXyA8PCBlbmRsOworfQorCisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gU3dpZnQsIHRoaXMgaXMKKyAqIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nCisgKiBTd2lmdCBzeW50YXguICBDb25mb3JtcyB0byBURW51bSB3aGljaAorICogaW1wbGVtZW50ZXMgcmVhZC93cml0ZS4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBpZiAoZ2VuX2NvY29hXykgeworICAgIGdlbmVyYXRlX29sZF9lbnVtKHRlbnVtKTsKKyAgICByZXR1cm47CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogVEVudW0iOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpIDw8IGVuZGw7CisgIH0KKworICAvLyB1bmtub3duIGFzc29jaWF0ZWQgdmFsdWUgY2FzZSBmb3Igc2FmZXR5IGFuZCBzaW1pbGFyIGJlaGF2aW9yIHRvIG90aGVyIGxhbmd1YWdlcworICBpZiAoc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIHVua25vd24oSW50MzIpIiA8PCBlbmRsOworICB9CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICAvLyBUU2VyaWFsaXphYmxlIHJlYWQoZnJvbTopCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJhdzogSW50MzIgPSB0cnkgcHJvdG8ucmVhZCgpIiA8PCBlbmRsOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJsZXQgbmV3ID0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKHJhd1ZhbHVlOiByYXcpIiA8PCBlbmRsOworCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImlmIGxldCB1bndyYXBwZWQgPSBuZXcgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiB1bndyYXBwZWQiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwiIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBlbnVtIHZhbHVlIChcXChyYXcpKSBmb3IgXFwoIgorICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIuc2VsZilcIikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworCisgIC8vIGVtcHR5IGluaXQgZm9yIFRTZXJpYWxpemFibGUKKyAgZl9kZWNsXyA8PCBlbmRsOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW5pdCgpIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJzZWxmID0gLiIgPDwgZW51bV9jYXNlX25hbWUoY29uc3RhbnRzLmZyb250KCksIGZhbHNlKSA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIHJhd1ZhbHVlIGdldHRlcgorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdmFyIHJhd1ZhbHVlOiBJbnQzMiI7CisgIGJsb2NrX29wZW4oZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAuIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpCisgICAgICAgICAgICA8PCAiOiByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8IGVuZGw7CisgIH0KKyAgaWYgKHNhZmVfZW51bXNfKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAudW5rbm93bihsZXQgdmFsdWUpOiByZXR1cm4gdmFsdWUiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICAvLyBjb252ZW5pZW5jZSByYXdWYWx1ZSBpbml0YWxpemVyCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0PyhyYXdWYWx1ZTogSW50MzIpIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHJhd1ZhbHVlIHsiIDw8IGVuZGw7OworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpCisgICAgICAgICAgICA8PCAiOiBzZWxmID0gLiIgPDwgZW51bV9jYXNlX25hbWUoKCpjX2l0ZXIpLCB0cnVlKSA8PCBlbmRsOworICB9CisgIGlmICghc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiByZXR1cm4gbmlsIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IHNlbGYgPSAudW5rbm93bihyYXdWYWx1ZSkiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisKKworCisKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBUaGlzIGlzIGZvciBTd2lmdCAyLngvQ29jb2EKKyAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiA6IEludDMyIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8IGVuZGw7CisgIH0KKworICBmX2RlY2xfIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0KCkgeyBzZWxmLmluaXQocmF3VmFsdWU6ICIgPDwgY29uc3RhbnRzLmZyb250KCktPmdldF92YWx1ZSgpIDw8ICIpISB9IiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZXh0ZW5zaW9uICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiA6IFRFbnVtIjsKKyAgYmxvY2tfb3BlbihmX2ltcGxfKTsKKworICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihmX2ltcGxfKTsKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJhdyA9IEludDMyKCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IHByb3RvLnJlYWRJMzIoJnJhdykiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihyYXdWYWx1ZTogcmF3KSEiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgZl9pbXBsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MiOworICBibG9ja19vcGVuKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0cnkgcHJvdG8ud3JpdGVJMzIodmFsdWUucmF3VmFsdWUpIiA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2ltcGxfKTsKKyAgZl9pbXBsXyA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZW51bV9jYXNlX25hbWUodF9lbnVtX3ZhbHVlKiB0ZW51bV9jYXNlLCBib29sIGRlY2xhcmF0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW1fY2FzZS0+Z2V0X25hbWUoKTsKKyAgLy8gZm9yY2UgdG8gbG93ZXJjYXNlIGZvciBTd2lmdCBzdHlsZSwgbWF5YmUgZXNjYXBlIGlmIGl0cyBhIGtleXdvcmQKKyAgc3RkOjp0cmFuc2Zvcm0obmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCBuYW1lLmJlZ2luKCksIDo6dG9sb3dlcik7CisgIGlmIChkZWNsYXJhdGlvbikgeworICAgIG5hbWUgPSBtYXliZV9lc2NhcGVfaWRlbnRpZmllcihuYW1lKTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29uc3RhbnQgZW51bSB2YWx1ZSBieSB0cmFuc2Zvcm1pbmcgdGhlIHZhbHVlIHBvcnRpb24gdG8gbG93ZXJjYXNlCisgKiBmb3IgU3dpZnQgc3R5bGUuCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZW51bV9jb25zdF9uYW1lKHN0cmluZyBlbnVtX2lkZW50aWZpZXIpIHsKKyAgc3RyaW5nOjppdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IGVudW1faWRlbnRpZmllci5iZWdpbigpOyBpdCA8IGVudW1faWRlbnRpZmllci5lbmQoKTsgKytpdCkgeworICAgIGlmICgoKml0KSA9PSAnLicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBzdGQ6OnRyYW5zZm9ybShpdCwgZW51bV9pZGVudGlmaWVyLmVuZCgpLCBpdCwgOjp0b2xvd2VyKTsKKyAgcmV0dXJuIGVudW1faWRlbnRpZmllcjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgcHVibGljIGNvbnN0YW50cyBmb3IgYWxsIFRocmlmdCBjb25zdGFudHMuCisgKgorICogQHBhcmFtIGNvbnN0cyBDb25zdGFudHMgdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisKKyAgb3N0cmluZ3N0cmVhbSBjb25zdF9pbnRlcmZhY2U7CisKKyAgLy8gUHVibGljIGNvbnN0YW50cyBmb3IgYmFzZSB0eXBlcyAmIHN0cmluZ3MKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBjb25zdF9pbnRlcmZhY2UgPDwgInB1YmxpYyBsZXQgIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSAiOworICAgIHJlbmRlcl9jb25zdF92YWx1ZShjb25zdF9pbnRlcmZhY2UsIHR5cGUsICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIGNvbnN0X2ludGVyZmFjZSA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyB0aGlzIGdldHMgc3BpdCBpbnRvIHRoZSBoZWFkZXIgZmlsZSBpbiA6OmNsb3NlX2dlbmVyYXRvcgorICBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA9IGNvbnN0X2ludGVyZmFjZS5zdHIoKTsKKworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBzdHJ1Y3QKKyAqIHdpdGggcHVibGljIG1lbWJlcnMuIE9wdGlvbmFsIHR5cGVzIGFyZSB1c2VkIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvCisgKiBhbGxvdyB0aGVtIHRvIGJlIHRlc3RlZCBmb3IgYXZhaWxhYmlsaXR5LiBTZXBhcmF0ZSBpbml0cyBhcmUgaW5jbHVkZWQgZm9yCisgKiByZXF1aXJlZCBwcm9wZXJ0aWVzICYgYWxsIHByb3BlcnRpZXMuCisgKgorICogR2VuZXJhdGVzIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSBjb25mb3JtYW5jZSB0byBUU3RydWN0LCBUU2VyaWFsaXphYmxlLAorICogSGFzaGFibGUgJiBFcXVhdGFibGUKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChmX2RlY2xfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c3RydWN0LCBmYWxzZSwgZmFsc2UpOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGNvbmZvcm0gdG8gRXJyb3IKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3QoZl9kZWNsXywgdHhjZXB0aW9uLCBmYWxzZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0eGNlcHRpb24sIGZhbHNlLCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHN0cmluZyYgZG9jKSB7CisgIGlmIChkb2MgIT0gIiIpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHByZXYgPSAwOworICAgIHdoaWxlICgoKHBvcyA9IGRvYy5maW5kKCJcbiIsIHByZXYpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgfHwgKChwb3MgPSBkb2MuZmluZCgiXHIiLCBwcmV2KSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIHx8ICgocG9zID0gZG9jLmZpbmQoIlxyXG4iLCBwcmV2KSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKQorICAgIHsKKyAgICAgICAgc3RyaW5ncy5wdXNoX2JhY2soZG9jLnN1YnN0cihwcmV2LCBwb3MgLSBwcmV2KSk7CisgICAgICAgIHByZXYgPSBwb3MgKyAxOworICAgIH0KKworICAgIC8vIFRvIGdldCB0aGUgbGFzdCBzdWJzdHJpbmcgKG9yIG9ubHksIGlmIGRlbGltaXRlciBpcyBub3QgZm91bmQpCisgICAgc3RyaW5ncy5wdXNoX2JhY2soZG9jLnN1YnN0cihwcmV2KSk7CisKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgZF9pdGVyOworICAgIGZvciAoZF9pdGVyID0gc3RyaW5ncy5iZWdpbigpOyBkX2l0ZXIgIT0gc3RyaW5ncy5lbmQoKTsgKytkX2l0ZXIpIHsKKyAgICAgIGlmICgoKmRfaXRlcikgIT0gIiIpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvLy8gIiA8PCAoKmRfaXRlcikgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisKKy8qKgorICogR2VuZXJhdGUgdGhlIGludGVyZmFjZSBmb3IgYSBzdHJ1Y3QuIE9ubHkgcHJvcGVydGllcyBhbmQKKyAqIGluaXQgbWV0aG9kcyBhcmUgaW5jbHVkZWQuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIGlmIChnZW5fY29jb2FfKSB7CisgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdChvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworICAgIHJldHVybjsKKyAgfQorICBzdHJpbmcgZG9jID0gdHN0cnVjdC0+Z2V0X2RvYygpOworICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworCisKKyAgLy8gcHJvcGVydGllcworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAvLyBzcGVjaWFsLCB1bmlvbnMKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBzdHJpbmcgZG9jID0gKCptX2l0ZXIpLT5nZXRfZG9jKCk7CisgICAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIKKyAgICAgICAgICA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsOiAiCisgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UpIDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBOb3JtYWwgc3RydWN0cworCisgICAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHZpc2liaWxpdHkgPDwgIiBmaW5hbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICIgOiBTd2lmdC5FcnJvciI7IC8vIEVycm9yIHNlZW1zIHRvIGJlIGEgY29tbW9uIGV4Y2VwdGlvbiBuYW1lIGluIHRocmlmdAorICAgIH0KKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIC8vIFRPRE86IERlZmF1bHRzCisKKyAgICAgIHN0cmluZyBkb2MgPSAoKm1faXRlciktPmdldF9kb2MoKTsKKyAgICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5KCptX2l0ZXIsIGlzX3ByaXZhdGUpIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoIXN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgaW5pdCgpIHsgfSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvdXQsIHRzdHJ1Y3QsIGZhbHNlLCBpc19wcml2YXRlKTsKKyAgICB9CisgICAgaWYgKHN0cnVjdF9oYXNfb3B0aW9uYWxfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvdXQsIHRzdHJ1Y3QsIHRydWUsIGlzX3ByaXZhdGUpOworICAgIH0KKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogTGVnYWN5IFN3aWZ0Mi9Db2NvYSBnZW5lcmF0b3IKKyAqCisgKiBAcGFyYW0gdHN0cnVjdAorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqLworCisKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB2aXNpYmlsaXR5IDw8ICIgZmluYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICIgOiBFcnJvclR5cGUiOworICB9CisKKyAgYmxvY2tfb3BlbihvdXQpOworCisgIC8vIHByb3BlcnRpZXMKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlciwgaXNfcHJpdmF0ZSkgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIGluaXQKKworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgaW5pdCgpIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworCisgIGlmIChzdHJ1Y3RfaGFzX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0KSkgeworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgZmFsc2UsIGlzX3ByaXZhdGUpOworICB9CisgIGlmIChzdHJ1Y3RfaGFzX29wdGlvbmFsX2ZpZWxkcyh0c3RydWN0KSkgeworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgdHJ1ZSwgaXNfcHJpdmF0ZSk7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHN0cnVjdCBpbml0IGZvciBwcm9wZXJ0aWVzCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gYWxsICAgICBHZW5lcmF0ZSBpbml0IHdpdGggYWxsIG9yIGp1c3QgcmVxdWlyZWQgcHJvcGVydGllcworICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBpbml0aWFsaXplciBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBpbml0KCI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBib29sIGZpcnN0PXRydWU7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICBpZiAoYWxsIHx8ICFmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkpOworICAgIH0KKyAgICArK21faXRlcjsKKyAgfQorICBvdXQgPDwgIikiOworCisgIGJsb2NrX29wZW4ob3V0KTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICBib29sIHNob3VsZF9zZXQgPSBhbGw7CisgICAgICBzaG91bGRfc2V0ID0gc2hvdWxkX3NldCB8fCAhZmllbGRfaXNfb3B0aW9uYWwoKCptX2l0ZXIpKTsKKyAgICAgIGlmIChzaG91bGRfc2V0KSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyoqIGxlZ2FjeSBTd2lmdDIvQ29jb2EgKi8KKyAgICAgIGlmIChhbGwgfHwgKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCB8fCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBoYXNoYWJsZSBwcm90b2NvbCBpbXBsbWVudGF0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaGFzaGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IEhhc2hhYmxlIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHZhciBoYXNoVmFsdWUgOiBJbnQiOworICBibG9ja19vcGVuKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJsZXQgcHJpbWUgPSAzMSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyIHJlc3VsdCA9IDEiIDw8IGVuZGw7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIHN0cmluZyBhY2Nlc3NvciA9IGZpZWxkX2lzX29wdGlvbmFsKHRmaWVsZCkgPyAiPy4iIDogIi4iOworICAgICAgICBzdHJpbmcgZGVmYXVsdG9yID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSA/ICIgPz8gMCIgOiAiIjsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyAoIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8IGFjY2Vzc29yCisgICAgICAgICAgICAgICAgICAgIDw8ICAiaGFzaFZhbHVlIiA8PCBkZWZhdWx0b3IgPDwgIikiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggc2VsZiB7IiA8PCBlbmRsOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtX2l0ZXIrKykgeworICAgICAgICB0X2ZpZWxkICp0ZmllbGQgPSAqbV9pdGVyOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIihsZXQgdmFsKTogcmVzdWx0ID0gcHJpbWUgJiogdmFsLmhhc2hWYWx1ZSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcmVzdWx0IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMzEiIDw8IGVuZGw7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGVxdWF0YWJsZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisKKyAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIGZ1bmMgPT0obGhzOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCByaHM6ICIKKyAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IEJvb2wiOworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpKSB7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIobGhzLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICA8PCAoZ2VuX2NvY29hXyA/ICIgPyIgOiAiICIpIDw8ICI9PSByaHMuIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIjsgLy8gc3dpZnQgMiA/PT0gb3BlcmF0b3Igbm90IGluIDM/CisgICAgICAgIGlmICgrK21faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIgJiYiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9IGVsc2UgeworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAobGhzLCByaHMpIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICguIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIihsZXQgbHZhbCksIC4iCisgICAgICAgICAgICAgICAgICAgIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCBydmFsKSk6IHJldHVybiBsdmFsID09IHJ2YWwiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogcmV0dXJuIGZhbHNlIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbi4gUHJvZHVjZXMgZXh0ZW5zaW9ucyB0aGF0CisgKiBmdWxmaWxsIHRoZSByZXF1aXNpdGUgcHJvdG9jb2xzIHRvIGNvbXBsZXRlIHRoZSB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19yZXN1bHQKKyAqICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9lcXVhdGFibGVfZXh0ZW5zaW9uKG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisKKyAgaWYgKCFpc19wcml2YXRlICYmICFpc19yZXN1bHQgJiYgIWdlbl9jb2NvYV8pIHsgIC8vIG9sZCBjb21waWxlciBkaWRuJ3QgdXNlIGRlYnVnX2Rlc2NyaXB0aW9ucywgT1IgaXQgd2l0aCBnZW5fY29jb2FfIHNvIHRoZSBmbGFnIGRvZXNuJ3QgbWF0dGVyIHcvIGNvY29hCisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3ByaW50YWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0KTsKKyAgfQorCisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3RocmlmdF9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19yZXN1bHQsIGlzX3ByaXZhdGUpOworCisgIG91dCA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIFRTdHJ1Y3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcmVzdWx0CisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IGEgcmVzdWx0IHZhbHVlCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfdGhyaWZ0X2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IFRTdHJ1Y3QiOworCisgIGJsb2NrX29wZW4ob3V0KTsKKworICBvdXQgPDwgZW5kbDsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgLyoqIFN3aWZ0IDMsIG5vIHdyaXRlciB3ZSBqdXN0IHdyaXRlIGZpZWxkIElEJ3MgKi8KKyAgICBzdHJpbmcgYWNjZXNzID0gKGlzX3ByaXZhdGUpID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworICAgIC8vIGdlbmVyYXRlIGZpZWxkSUQncyBkaWN0aW9uYXJ5CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2VzcyA8PCAiIHN0YXRpYyB2YXIgZmllbGRJZHM6IFtTdHJpbmc6IEludDMyXSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFsiOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgd3JvdGUgPSBmYWxzZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgd3JvdGUgPSB0cnVlOworICAgICAgb3V0IDw8ICJcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiOworICAgIH0KKyAgICBpZiAoIXdyb3RlKSB7CisgICAgICAvLyBwYWQgYSBjb2xvbgorICAgICAgb3V0IDw8ICI6IjsKKyAgICB9CisgICAgb3V0IDw8ICJdIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2VzcyA8PCAiIHN0YXRpYyB2YXIgc3RydWN0TmFtZTogU3RyaW5nIHsgcmV0dXJuIFwiIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIiB9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyoqIExlZ2FjeSBTd2lmdDIvQ29jb2EgKi8KKworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKworICAgIGlmIChpc19yZXN1bHQpIHsKKyAgICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisgICAgfQorICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3VuaW9uX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgIl8gPSB0cnkgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInZhciByZXQ6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPyI7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZmllbGRzOiB3aGlsZSB0cnVlIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBwcm90by5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkiOworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuc3RvcCk6ICAgICAgICAgICAgYnJlYWsgZmllbGRzIiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOiI7CisgICAgc3RyaW5nIHBhZGRpbmcgPSAiIjsKKworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAiOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8IHBhZGRpbmcgPDwgInJldCA9ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLiIKKyAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih2YWw6ICIgPDwgInRyeSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKQorICAgICAgICAgICAgICAgIDw8ICIucmVhZChmcm9tOiBwcm90bykpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6ICB0cnkgcHJvdG8uc2tpcCh0eXBlOiB1bmtub3duVHlwZSkiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0IHJldCA9IHJldCI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXQiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiBcIk1pc3NpbmcgcmVxdWlyZWQgdmFsdWUgZm9yIHR5cGU6ICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGEgc3RydWN0IGZyb20KKyAqIGZyb20gYSBwcm90b2NvbC4gKFRTdHJ1Y3QgY29tcGxpYW5jZSkKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgLyoqIFN3aWZ0IDMgY2FzZSAqLworICAgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJmaWxlcHJpdmF0ZSIgOiAicHVibGljIjsKKworICAgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgIl8gPSB0cnkgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBib29sIG9wdGlvbmFsID0gZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25hbCwgIW9wdGlvbmFsKSA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgImZpZWxkczogd2hpbGUgdHJ1ZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBwcm90by5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuc3RvcCk6ICAgICAgICAgICAgYnJlYWsgZmllbGRzIiA8PCBlbmRsOworCisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKToiOworICAgICAgc3RyaW5nIHBhZGRpbmcgPSAiIjsKKworICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBwYWRkaW5nIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRyeSAiCisgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiLnJlYWQoZnJvbTogcHJvdG8pIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOiAgdHJ5IHByb3RvLnNraXAodHlwZTogdW5rbm93blR5cGUpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisKKyAgICBpZiAoc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICAgICAgaW5kZW50KG91dCkgPDwgIi8vIFJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKCpmX2l0ZXIpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by52YWxpZGF0ZVZhbHVlKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgIm5hbWVkOiBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIG91dCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICAvKiogTGVnYWN5IFN3aWYyL0NvY29hIGNhc2UgKi8KKyAgICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAicHJpdmF0ZSIgOiAicHVibGljIjsKKworICAgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2woX19wcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBib29sIG9wdGlvbmFsID0gZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgb3B0aW9uYWwsICFvcHRpb25hbCkgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJmaWVsZHM6IHdoaWxlIHRydWUiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgX19wcm90by5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoXywgLlNUT1ApOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWsgZmllbGRzIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICgiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB0cnkgX19wcm90by5yZWFkVmFsdWUoKSBhcyAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5za2lwVHlwZSh1bmtub3duVHlwZSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmIChmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by52YWxpZGF0ZVZhbHVlKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgIm5hbWVkOiBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIG91dCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb3V0IDw8ICIpIiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYSBzdHJ1Y3QgdG8KKyAqIGEgcHJvdG9jb2wuIChUU3RydWN0IGNvbXBsaWFuY2UpIE9OTFkgRk9SIFNXSUZUMi9DT0NPQQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAicHJpdmF0ZSIgOiAicHVibGljIjsKKworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZShfX3ZhbHVlOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiwgdG9Qcm90b2NvbCBfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlU3RydWN0QmVnaW5XaXRoTmFtZShcIiIgPDwgbmFtZSA8PCAiXCIpIiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQgKnRmaWVsZCA9ICpmX2l0ZXI7CisKKyAgICBib29sIG9wdGlvbmFsID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKTsKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICA8PCAiID0gX192YWx1ZS4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRWYWx1ZSgiCisgICAgICAgICAgICAgICAgPDwgKG9wdGlvbmFsID8gIiIgOiAiX192YWx1ZS4iKSA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAibmFtZTogXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCAidHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImlkOiAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYSBzdHJ1Y3QgZnJvbQorICogZnJvbSBhIHByb3RvY29sLiAoVFN0cnVjdCBjb21wbGlhbmNlKSAgT05MWSBGT1IgU1dJRlQgMi9DT0NPQQorICoKKyAqIFRoaXMgaXMgc3BlY2lmaWNhbGx5IGEgZnVuY3Rpb24gcmVzdWx0LiBPbmx5CisgKiB0aGUgZmlyc3QgYXZhaWxhYmxlIGZpZWxkIGlzIHdyaXR0ZW4uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZShfX3ZhbHVlOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiwgdG9Qcm90b2NvbCBfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lKFwiIiA8PCBuYW1lIDw8ICJcIikiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCAqdGZpZWxkID0gKmZfaXRlcjsKKworICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgcmVzdWx0ID0gX192YWx1ZS4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by53cml0ZUZpZWxkVmFsdWUocmVzdWx0LCAiCisgICAgICAgICAgICAgICAgPDwgIm5hbWU6IFwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJpZDogIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiKSIgPDwgZW5kbDsKKworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlU3RydWN0RW5kKCkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGRlc2NyaXB0aW9uIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgLy8gQWxsb3cgdXNlIG9mIGRlYnVnRGVzY3JpcHRpb24gc28gdGhlIGFwcCBjYW4gYWRkIGRlc2NyaXB0aW9uIHZpYSBhIGNhdGVvZ29yeS9leHRlbnNpb24KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgPDwgKGRlYnVnX2Rlc2NyaXB0aW9uc18gPyAiQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSIgOiAiQ3VzdG9tU3RyaW5nQ29udmVydGlibGUiKTsKKworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInZhciBkZXNjID0gXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgIihcIiIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIj1cXChTdHJpbmcoZGVzY3JpYmluZzogc2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikpIjsKKyAgICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiXCIiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLlwiIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpO2ZfaXRlcisrKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGxldCB2YWwpOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih2YWw6IFxcKHZhbCkpXCIiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIoXCIiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICI9XFwoc2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiXCIiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiKVwiIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBkZXNjIiA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuICBJbiBTd2lmdCB0aGlzIGNvbnNpc3RzIG9mIGEKKyAqIHByb3RvY29sIGRlZmluaXRpb24gYW5kIGEgY2xpZW50ICh3aXRoIGl0J3MgaW1wbGVtZW50YXRpb24KKyAqIHNlcGFyYXRlZCBpbnRvIGV4dHMgZmlsZSkuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChmX2RlY2xfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KGZfZGVjbF8sIHRzZXJ2aWNlKTsKKyAgaWYgKGFzeW5jX2NsaWVudHNfKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbF9hc3luYyhmX2RlY2xfLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMoZl9kZWNsXywgdHNlcnZpY2UpOworICB9CisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyKGZfZGVjbF8sIHRzZXJ2aWNlKTsKKworICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKKyAgaWYgKGFzeW5jX2NsaWVudHNfKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICB9CisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIHJldHVybiB0eXBlcworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBxbmFtZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICAgIHRfc3RydWN0IHFuYW1lX3RzID0gdF9zdHJ1Y3QodHMtPmdldF9wcm9ncmFtKCksIHFuYW1lKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgcW5hbWVfdHMuYXBwZW5kKCptX2l0ZXIpOworICAgIH0KKworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChmX2ltcGxfLCAmcW5hbWVfdHMsIHRydWUpOworICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcW5hbWVfdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgfQorfQorCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAorICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHRfZmllbGQqIHN1Y2Nlc3MgPSBuZXcgdF9maWVsZCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgc3VjY2Vzcy0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICByZXN1bHQuYXBwZW5kKHN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCAqeCA9ICpmX2l0ZXI7CisgICAgdF9maWVsZCAqb3ggPSBuZXcgdF9maWVsZCh4LT5nZXRfdHlwZSgpLCB4LT5nZXRfbmFtZSgpLCB4LT5nZXRfa2V5KCkpOworICAgIG94LT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgIHJlc3VsdC5hcHBlbmQob3gpOworICB9CisKKyAgLy8gZ2VuZXJhdGUgdGhlIHJlc3VsdCBzdHJ1Y3QKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0KGZfaW1wbF8sICZyZXN1bHQsIHRydWUpOworICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnJlc3VsdCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgZm9yIChmX2l0ZXIgPSByZXN1bHQuZ2V0X21lbWJlcnMoKS5iZWdpbigpOyBmX2l0ZXIgIT0gcmVzdWx0LmdldF9tZW1iZXJzKCkuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZGVsZXRlICpmX2l0ZXI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIGRvYyA9IHRzZXJ2aWNlLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgcHJvdG9jb2wgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgeworICAgICAgb3V0IDw8ICIgOiAiIDw8IHBhcmVudC0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBmdW5jdGlvbl9kb2NzdHJpbmcob3V0LCAqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiAgLy8gZXhjZXB0aW9uczogIjsKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBhc3luY2hyb25vdXMgc2VydmljZSBwcm90b2NvbCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2xfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN0cmluZyBkb2MgPSB0c2VydmljZS0+Z2V0X2RvYygpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luYyI7CisKKyAgYmxvY2tfb3BlbihvdXQpOworICBpZiAoIWdlbl9jb2NvYV8pIHsgIG91dCA8PCBlbmRsOyB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvdXQsICpmX2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICBpZiAocHJvbWlzZV9raXRfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICB9IC8vCisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wZW4gY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IjsvLyA6ICIKKworICAgIC8vIEluaGVyaXQgZnJvbSBQYXJlbnRDbGllbnQKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIG91dCA8PCAiIDogIiA8PCAoKHBhcmVudCA9PSBOVUxMKSA/ICJUQ2xpZW50IiA6IHBhcmVudC0+Z2V0X25hbWUoKSArICJDbGllbnQiKTsKKyAgICBvdXQgPDwgICIgLyogLCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICAvLyBhCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgLyogOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX19pblByb3RvY29sIDogVFByb3RvY29sIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX291dFByb3RvY29sIDogVFByb3RvY29sIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KGlub3V0UHJvdG9jb2w6IFRQcm90b2NvbCkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJfX2luUHJvdG9jb2wgPSBpbm91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX291dFByb3RvY29sID0gaW5vdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pblByb3RvY29sID0gaW5Qcm90b2NvbCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19vdXRQcm90b2NvbCA9IG91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIkFzeW5jQ2xpZW50PFByb3RvY29sOiBUUHJvdG9jb2wsIEZhY3Rvcnk6IFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+IjsvLyA6ICIKKworICAgIC8vIEluaGVyaXQgZnJvbSBQYXJlbnRDbGllbnQKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgICAgb3V0IDw8ICIgOiAiIDw8ICgocGFyZW50ID09IE5VTEwpID8gIlQiIDogIHBhcmVudC0+Z2V0X25hbWUoKSkgKyAiQXN5bmNDbGllbnQ8UHJvdG9jb2wsIEZhY3Rvcnk+IjsKKyAgICBvdXQgPDwgICIgLyogLCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNDbGllbnQgLyogOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX19wcm90b2NvbEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX3RyYW5zcG9ydEZhY3RvcnkgOiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KHByb3RvY29sRmFjdG9yeTogVFByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeTogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJfX3Byb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnRGYWN0b3J5ID0gdHJhbnNwb3J0RmFjdG9yeSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGludGVyZmFjZSBkZWZpbml0aW9uLiBJbiBvdGhlciB3b3JkcywKKyAqIHRoZSBUUHJvY2VzcyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgLyogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiICovIjsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGVhbGlhcyBQcm9jZXNzb3JIYW5kbGVyRGljdGlvbmFyeSA9ICIKKyAgICAgICAgPDwgIltTdHJpbmc6IChJbnQzMiwgVFByb3RvY29sLCBUUHJvdG9jb2wsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikgdGhyb3dzIC0+IFZvaWRdIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2YXIgc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyByZXF1aXJlZCBpbml0KHNlcnZpY2U6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIDogTlNPYmplY3QgLyogIgorICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWFsaWFzIFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0gIgorICAgICAgICA8PCAiW1N0cmluZzogKEludCwgVFByb3RvY29sLCBUUHJvdG9jb2wsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikgdGhyb3dzIC0+IFZvaWRdIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBzZXJ2aWNlIDogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0KHNlcnZpY2U6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIikiOworICB9CisKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAic2VsZi5zZXJ2aWNlID0gc2VydmljZSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHNlbmQgdGhlIGFyZ3VtZW50cworICogZm9yIGEgc2VydmljZSBmdW5jdGlvbiB2aWEgYSBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBnZW5lcmF0ZQorICogQHBhcmFtIG5lZWRzX3Byb3RvY29sCisgKiAgICAgICAgICAgICAgICAgIFdldGhlciB0aGUgZmlyc3QgcGFyYW1ldGVyIG11c3QgYmUgYSBwcm90b2NvbCBvciBpZgorICogICAgICAgICAgICAgICAgICB0aGUgcHJvdG9jb2wgaXMgdG8gYmUgYXNzdW1lZAorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlICp0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisKKyAgc3RyaW5nIGZ1bm5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisKKyAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV9ib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmRfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworCisgIHN0cmluZyBwcm90byA9IG5lZWRzX3Byb3RvY29sID8gKGdlbl9jb2NvYV8gPyAiX19vdXRQcm90b2NvbCIgOiAib24gb3V0UHJvdG9jb2wiKSA6ICIiOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZ1bmMgIiA8PCBzZW5kX2Z1bmN0aW9uLmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgIDw8IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBwcm90bywgdHJ1ZSkKKyAgICAgICAgICAgICAgPDwgIikgdGhyb3dzIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0eXBlOiAiIDw8ICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpID8gIi5vbmV3YXkiIDogIi5jYWxsIikgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiAwKSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigiOworCisgICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIiA8PCB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBhcmdzLndyaXRlKHRvOiBvdXRQcm90b2NvbCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19vdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0eXBlOiAiIDw8ICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpID8gIi5PTkVXQVkiIDogIi5DQUxMIikgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiAwKSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX2FyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoIjsKKworICAgIC8vIHdyaXRlIG91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzCisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICB0X2ZpZWxkICp0ZmllbGQgPSAoKmZfaXRlcik7CisgICAgICBvdXQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgIiA8PCBhcmdzbmFtZSA8PCAiLndyaXRlVmFsdWUoX19hcmdzLCB0b1Byb3RvY29sOiBfX291dFByb3RvY29sKSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19vdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWN2IHRoZSByZXN1bHQgZm9yIGEKKyAqIHNlcnZpY2UgZnVuY3Rpb24gdmlhIGEgcHJvdG9jb2wuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlICBUaGUgc2VydmljZSB0byBnZW5lcmF0ZQorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUKKyAqIEBwYXJhbSBuZWVkc19wcm90b2NvbAorICogICAgICAgICAgICAgICAgICBXZXRoZXIgdGhlIGZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIGEgcHJvdG9jb2wgb3IgaWYKKyAqICAgICAgICAgICAgICAgICAgdGhlIHByb3RvY29sIGlzIHRvIGJlIGFzc3VtZWQKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCkgeworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZnVuYyByZWN2XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgICBvdXQgPDwgIm9uIGluUHJvdG9jb2w6IFRQcm90b2NvbCI7CisgICAgfQorICAgIG91dCA8PCAiKSB0aHJvd3MiOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiIC0+ICIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgfQorCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgorCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSAiIDw8IGVuZGw7CisKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJsZXQgcmVzdWx0ID0gIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJfID0gIjsKKyAgICB9CisKKyAgICBzdHJpbmcgcmV0dXJuX3R5cGVfbmFtZSA9IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICAgIG91dCA8PCAidHJ5ICIgPDwgcmVzdWx0bmFtZSA8PCAiLnJlYWQoZnJvbTogaW5Qcm90b2NvbCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCBzdWNjZXNzID0gcmVzdWx0LnN1Y2Nlc3MiOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzdWNjZXNzIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBUQXBwbGljYXRpb25FcnJvcihlcnJvcjogLm1pc3NpbmdSZXN1bHQobWV0aG9kTmFtZTogXCIiCisgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKSkiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChuZWVkc19wcm90b2NvbCkgeworICAgICAgb3V0IDw8ICJfX2luUHJvdG9jb2w6IFRQcm90b2NvbCI7CisgICAgfQorCisgICAgb3V0IDw8ICIpIHRocm93cyI7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgIiAtPiAiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICAgIH0KKworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIC8vIGNoZWNrIGZvciBhbiBleGNlcHRpb24KKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9faW5Qcm90b2NvbC5yZWFkUmVzdWx0TWVzc2FnZUJlZ2luKCkgIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pOworICAgIGluZGVudChvdXQpOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgIXRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICAgIG91dCA8PCAibGV0IF9fcmVzdWx0ID0gIjsKKyAgICB9CisgICAgb3V0IDw8ICJ0cnkgIiA8PCByZXN1bHRuYW1lIDw8ICIucmVhZFZhbHVlRnJvbVByb3RvY29sKF9faW5Qcm90b2NvbCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19pblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgX19zdWNjZXNzID0gX19yZXN1bHQuc3VjY2VzcyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fc3VjY2VzcyIgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IF9fcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgorICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBOU0Vycm9yKCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImRvbWFpbjogVEFwcGxpY2F0aW9uRXJyb3JEb21haW4sICIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjb2RlOiBJbnQoVEFwcGxpY2F0aW9uRXJyb3IuTWlzc2luZ1Jlc3VsdC5yYXdWYWx1ZSksIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInVzZXJJbmZvOiBbVEFwcGxpY2F0aW9uRXJyb3JNZXRob2RLZXk6IFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiXSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2l2ZW4gdGhlIHNlbmQgZnVuY3Rpb24gZm9yIHRoZQorICogc2VydmljZSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworCisgIGluZGVudChvdXQpIDw8ICJ0cnkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgb3V0IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICBvdXQgPDwgIiwgIjsKKyAgICB9CisgIH0KKworICBvdXQgPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiB0aGUgc2VuZCBmdW5jdGlvbiBmb3IgdGhlCisgKiBzZXJ2aWNlIGZ1bmN0aW9uLiBUaGlzIGlzIGZvciBhc3luY2hyb25vdXMgcHJvdG9jb2xzLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihvbjogcHJvdG8iOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKF9fcHJvdG9jb2wiOyAvLworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKworICBvdXQgPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdmlhIGV4dGVuc2lvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7CisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgZmFsc2UpOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGlmIChnZW5fY29jb2FfKSB7IG91dCA8PCBlbmRsOyB9CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgb3V0UHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLnRyYW5zcG9ydCgpLmZsdXNoKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnkgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBhc3luY2hyb25vdXMgY2xpZW50IHByb3RvY29sIGltcGxlbWVudGF0aW9uIHZpYSBleHRlbnNpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKGdlbl9jb2NvYV8pIHsKKyAgICBnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSk7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmNDbGllbnQiOworICBzdHJpbmcgcHJvdG9jb2xfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkFzeW5jIjsKKworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgbmFtZSA8PCAiIDogIiA8PCBwcm90b2NvbF9uYW1lOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCB0cnVlKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCB0cmFuc3BvcnQgICA9IGZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBwcm90byA9IFByb3RvY29sKG9uOiB0cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIGxldCBlcnJvciB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGlvbiguZXJyb3IoZXJyb3IpKSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBib29sIHJldF9pc192b2lkID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCk7CisgICAgYm9vbCBpc19vbmV3YXkgPSAoKmZfaXRlciktPmlzX29uZXdheSgpOworCisgICAgc3RyaW5nIGVycm9yX2NvbXBsZXRpb25fY2FsbCA9ICJjb21wbGV0aW9uKC5lcnJvcihlcnJvcikpIjsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJhbnNwb3J0LmZsdXNoIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodHJhbnMsIGVycm9yKSBpbiIgPDwgZW5kbCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IGVycm9yID0gZXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZXJyb3JfY29tcGxldGlvbl9jYWxsIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICAgIGlmICghaXNfb25ld2F5KSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCFyZXRfaXNfdm9pZCkgeworICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJ0cnkgc2VsZi5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIob246IHByb3RvKSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IChyZXRfaXNfdm9pZCA/ICJjb21wbGV0aW9uKC5zdWNjZXNzKFZvaWQoKSkpIiA6ICJjb21wbGV0aW9uKC5zdWNjZXNzKHJlc3VsdCkpIikgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggbGV0IGVycm9yIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlcnJvcl9jb21wbGV0aW9uX2NhbGwgPDwgZW5kbDsKKworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0aW9uKC5zdWNjZXNzKFZvaWQoKSkpIiA8PCBlbmRsOworICAgIH0KKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luY0NsaWVudCI7CisgIHN0cmluZyBwcm90b2NvbF9uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmMiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHByb3RvY29sX25hbWU7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgX190cmFuc3BvcnQgPSBfX3RyYW5zcG9ydEZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBfX3Byb3RvY29sID0gX19wcm90b2NvbEZhY3RvcnkubmV3UHJvdG9jb2xPblRyYW5zcG9ydChfX3RyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIl9fdHJhbnNwb3J0LmZsdXNoV2l0aENvbXBsZXRpb24oIjsKKworICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgInN1Y2Nlc3MsIGZhaWx1cmU6IGZhaWx1cmUpIiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJkbyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJ0cnkgc2VsZi5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoX19wcm90b2NvbCkiIDw8IGVuZGw7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3VjY2VzcygiOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgICB9CisgICAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmYWlsdXJlKGVycm9yIGFzIE5TRXJyb3IpIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLCBmYWlsdXJlOiBmYWlsdXJlKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gUHJvbWlzZSBmdW5jdGlvbgorICAgIGlmIChwcm9taXNlX2tpdF8pIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOworICAgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCAoX19wcm9taXNlLCBfX2Z1bGZpbGwsIF9fcmVqZWN0KSA9IFByb21pc2U8IiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiPi5wZW5kaW5nUHJvbWlzZSgpIiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IF9fdHJhbnNwb3J0ID0gX190cmFuc3BvcnRGYWN0b3J5Lm5ld1RyYW5zcG9ydCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBfX3Byb3RvY29sID0gX19wcm90b2NvbEZhY3RvcnkubmV3UHJvdG9jb2xPblRyYW5zcG9ydChfX3RyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIl9fdHJhbnNwb3J0LmZsdXNoV2l0aENvbXBsZXRpb24oIjsKKworICAgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJ7IF9fZnVsZmlsbCgpIH0sIGZhaWx1cmU6IHsgX19yZWplY3QoJDApIH0pIiA8PCBlbmRsOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImRvIjsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgICAgIGluZGVudChvdXQpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICJsZXQgcmVzdWx0ID0gIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgInRyeSBzZWxmLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihfX3Byb3RvY29sKSIgPDwgZW5kbDsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fZnVsZmlsbCgiOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZXN1bHQiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKworICAgICAgICBibG9ja19jbG9zZShvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19yZWplY3QoZXJyb3IpIiA8PCBlbmRsOworICAgICAgICBibG9ja19jbG9zZShvdXQpOworICAgICAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgICAgIGluZGVudChvdXQpIDw8ICIsIGZhaWx1cmU6IHsgZXJyb3IgaW4gIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9fcmVqZWN0KGVycm9yKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0pIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fcHJvbWlzZSIgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKworICAgIH0KKworICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEltcGxlbWVudGVkIGJ5IGdlbmVyYXRpbmcgYSBibG9jayBmb3IgZWFjaCBzZXJ2aWNlIGZ1bmN0aW9uIHRoYXQKKyAqIGhhbmRsZXMgdGhlIHByb2Nlc3Npbmcgb2YgdGhhdCBmdW5jdGlvbi4gVGhlIGJsb2NrcyBhcmUgc3RvcmVkIGluCisgKiBhIG1hcCBhbmQgbG9va2VkIHVwIHZpYSBmdW5jdGlvbi9tZXNzYWdlIG5hbWUuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiBUUHJvY2Vzc29yIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBsZXQgcHJvY2Vzc29ySGFuZGxlcnMiIDw8IChnZW5fY29jb2FfID8gIiAiIDogIiIpIDw8ICI6IFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0iOworICBibG9ja19vcGVuKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHByb2Nlc3NvckhhbmRsZXJzID0gUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIG1ldGhvZCBtYXAgZm9yIHJvdXRpbmcgaW5jb21pbmcgY2FsbHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24gPSAqZl9pdGVyOworCisgICAgc3RyaW5nIGFyZ3NfdHlwZSA9IGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc29ySGFuZGxlcnNbXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJdID0geyBzZXF1ZW5jZUlELCBpblByb3RvY29sLCBvdXRQcm90b2NvbCwgaGFuZGxlciBpbiIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCBhcmdzID0gdHJ5ICIgPDwgYXJnc190eXBlIDw8ICIucmVhZChmcm9tOiBpblByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSB0cnkgIiA8PCBhcmdzX3R5cGUgPDwgIi5yZWFkVmFsdWVGcm9tUHJvdG9jb2woaW5Qcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSApIHsKKyAgICAgIHN0cmluZyByZXN1bHRfdHlwZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgICBpbmRlbnQob3V0KSA8PCAidmFyIHJlc3VsdCA9ICIgPDwgcmVzdWx0X3R5cGUgPDwgIigpIiA8PCBlbmRsOworCisgICAgICBpbmRlbnQob3V0KSA8PCAiZG8iOworICAgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgICBpbmRlbnQob3V0KTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgInRyeSBoYW5kbGVyLiIgPDwgKGdlbl9jb2NvYV8gPyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgOiB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKworICAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAoIWdlbl9jb2NvYV8gfHwgZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7CisgICAgICAgICAgb3V0IDw8IGZpZWxkTmFtZSA8PCAiOiAiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgZmllbGROYW1lOworICAgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4ZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgICBmb3IgKHhfaXRlciA9IHhmaWVsZHMuYmVnaW4oKTsgeF9pdGVyICE9IHhmaWVsZHMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciBhcyAiOworCisgICAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICAgIGlmICgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPT0gIkVycm9yIiAmJiBuYW1lc3BhY2VkXyAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICAgICAgICBvdXQgPDwgZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKHByb2dyYW0pIDw8ICIuIjsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKKworICAgICAgICAgIG91dCA8PCAiIHsgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBlcnJvciB9IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciB7IHRocm93IGVycm9yIH0iIDw8IGVuZGw7CisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCB0eXBlOiAucmVwbHksIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgcmVzdWx0LndyaXRlKHRvOiBvdXRQcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4ZmllbGRzLmJlZ2luKCk7IHhfaXRlciAhPSB4ZmllbGRzLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgIiA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCk7CisgICAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGVycm9yIiA8PCBlbmRsOworICAgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IGVycm9yIiA8PCBlbmRsOworICAgICAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHR5cGU6IC5SRVBMWSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSAiIDw8IHJlc3VsdF90eXBlIDw8ICIud3JpdGVWYWx1ZShyZXN1bHQsIHRvUHJvdG9jb2w6IG91dFByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcHJvY2Vzc29ySGFuZGxlcnMiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0LGZhbHNlKTsKKyAgb3V0IDw8ICIoKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jIHByb2Nlc3Mob24gaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuYyBwcm9jZXNzT25JbnB1dFByb3RvY29sKGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgfQorICBibG9ja19vcGVuKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IChtZXNzYWdlTmFtZSwgXywgc2VxdWVuY2VJRCkgPSB0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiBsZXQgcHJvY2Vzc29ySGFuZGxlciA9ICIgPDwgbmFtZSA8PCAiLnByb2Nlc3NvckhhbmRsZXJzW21lc3NhZ2VOYW1lXSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkbyI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgcHJvY2Vzc29ySGFuZGxlcihzZXF1ZW5jZUlELCBpblByb3RvY29sLCBvdXRQcm90b2NvbCwgc2VydmljZSkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzIFRBcHBsaWNhdGlvbkVycm9yIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWU6IG1lc3NhZ2VOYW1lLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXJyb3IpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnNraXAodHlwZTogLnN0cnVjdCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBleCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAudW5rbm93bk1ldGhvZChtZXRob2ROYW1lOiBtZXNzYWdlTmFtZSkpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWU6IG1lc3NhZ2VOYW1lLCAiCisgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXgpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzIE5TRXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG1lc3NhZ2VOYW1lLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXJyb3IpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnNraXBUeXBlKC5TVFJVQ1QpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb25Gb3JNZXNzYWdlTmFtZShtZXNzYWdlTmFtZSwiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXg6IE5TRXJyb3IoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiwgIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjb2RlOiBJbnQoVEFwcGxpY2F0aW9uRXJyb3IuVW5rbm93bk1ldGhvZC5yYXdWYWx1ZSksICIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidXNlckluZm86IFtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogbWVzc2FnZU5hbWVdKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBTd2lmdCBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY2xhc3NfcmVmIERvIHdlIHdhbnQgYSBDbGFzcyByZWZlcmVuY2UgaXN0ZWFkIG9mIGEgdHlwZSByZWZlcmVuY2U/CisgKiBAcmV0dXJuIFN3aWZ0IHR5cGUgbmFtZSwgaS5lLiBEaWN0aW9uYXJ5PEtleSxWYWx1ZT4KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpc19vcHRpb25hbCwgYm9vbCBpc19mb3JjZWQpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXN1bHQgKz0gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlOworICAgIHJlc3VsdCArPSAiVE1hcDwiICsgdHlwZV9uYW1lKG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIHR5cGVfbmFtZShtYXAtPmdldF92YWxfdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCAqc2V0ID0gKHRfc2V0ICopdHR5cGU7CisgICAgcmVzdWx0ICs9ICJUU2V0PCIgKyB0eXBlX25hbWUoc2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QgKmxpc3QgPSAodF9saXN0ICopdHR5cGU7CisgICAgcmVzdWx0ICs9ICJUTGlzdDwiICsgdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKyAgZWxzZSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKG5hbWVzcGFjZWRfICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHJlc3VsdCArPSBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbSkgKyAiLiI7CisgICAgfQorICAgIHJlc3VsdCArPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmIChpc19vcHRpb25hbCkgeworICAgIHJlc3VsdCArPSAiPyI7CisgIH0KKyAgaWYgKGlzX2ZvcmNlZCkgeworICAgIHJlc3VsdCArPSAiISI7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIFN3aWZ0IHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSkgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gIlZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiBnZW5fY29jb2FfID8gIlRCaW5hcnkiIDogIkRhdGEiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJCb29sIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gIkludDgiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gIkludDE2IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJJbnQzMiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAiSW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gIkRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBTd2lmdCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGZ1bGwgY29uc3RhbnQgdmFsdWUgKGFzIHdvdWxkIGJlIHNlZW4gYWZ0ZXIgYW4gJz0nKQorICoKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigiOworICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgKGdlbl9jb2NvYV8gPyB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSA6IGVudW1fY29uc3RfbmFtZSh2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSkpOyAvLyBTd2lmdDIvQ29jb2EgY29tcGF0aWJpbGl0eQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKworICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigiOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICB0X2ZpZWxkKiB0ZmllbGQgPSAqZl9pdGVyOworICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSBOVUxMOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgaWYgKHRmaWVsZC0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICB2YWx1ZSA9IHZfaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBvdXQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI6ICI7CisgICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHRmaWVsZC0+Z2V0X3R5cGUoKSwgdmFsdWUpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIWZpZWxkX2lzX29wdGlvbmFsKHRmaWVsZCkpIHsKKyAgICAgICAgdGhyb3cgImNvbnN0YW50IGVycm9yOiByZXF1aXJlZCBmaWVsZCAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIuIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICIgaGFzIG5vIHZhbHVlIjsKKyAgICAgIH0KKworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKworICAgIG91dCA8PCAiWyI7CisKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICI6ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworCisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiXSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKworICAgIG91dCA8PCAiWyI7CisKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsIHZfaXRlci0+Zmlyc3QpOworCisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiXSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworCisgICAgb3V0IDw8ICJbIjsKKworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKworICAgICAgaWYgKCsrdl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIl0iOworCisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKK30KKworLyoqCisgKiBEZWNsYXJlcyBhbiBTd2lmdCBwcm9wZXJ0eS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKworICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICByZW5kZXIgPDwgdmlzaWJpbGl0eSA8PCAiIHZhciAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKHRmaWVsZCkpIHsKKyAgICByZW5kZXIgPDwgKGdlbl9jb2NvYV8gPyAiICIgOiAiIikgPDwgIjogIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU3dpZnQyL0NvY29hIGJhY2t3YXJkIGNvbXBhdCwgQmFkLCBkZWZhdWx0IGluaXQKKyAgICAgIHJlbmRlciA8PCAiID0gIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgIigpIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgc3RyaW5nIHJlc3VsdCA9ICJmdW5jICIgKyAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpICsgIikgdGhyb3dzIjsgLy8vIGFyZ3NyZXZpZXcKKworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBpZiAoIXR0eXBlLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQgKz0gIiAtPiAiICsgdHlwZV9uYW1lKHR0eXBlKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIGRvY3N0cmluZworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICAgIC8vIEdlbmVyYXRlIGRvY3N0cmluZyB3aXRoIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgLy8gLy8vIDxEZXNjcmlwdGlvbj4KKyAgICAvLyAvLy8gPGVtcHR5IGxpbmU+CisgICAgLy8gLy8vIC0gUGFyYW1ldGVyczoKKyAgICAvLyAvLy8gICAtIDxwYXJhbWV0ZXI+OiA8cGFyYW1ldGVyIGRvY3N0cmluZz4KKyAgICAvLyAvLy8gLSBSZXR1cm5zOiA8cmV0dXJuIHR5cGU+IChUaHJpZnQgaGFzIG5vIGRvY3N0cmluZyBvbiByZXR1cm4gdmFsKQorICAgIC8vIC8vLyAtIFRocm93czogPGV4Y2VwdGlvbiB0eXBlcz4KKworICAgIC8vIERlc2NyaXB0aW9uCisgICAgc3RyaW5nIGRvYyA9IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgICAgaW5kZW50KG91dCkgPDwgIi8vLyIgPDwgZW5kbDsKKworICAgIC8vIFBhcmFtZXRlcnMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLy8gLSBQYXJhbWV0ZXJzOiIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLy8gICAtICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICI7CisgICAgICAgIHN0cmluZyBkb2MgPSAoKmZfaXRlciktPmdldF9kb2MoKTsKKyAgICAgICAgaWYgKCFkb2MuZW1wdHkoKSAmJiBkb2NbZG9jLmxlbmd0aCgpLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGRvYy5lcmFzZShkb2MubGVuZ3RoKCktMSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGRvYyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybnMKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFJldHVybnM6ICIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFRocm93cworICAgIGluZGVudChvdXQpIDw8ICIvLy8gLSBUaHJvd3M6ICI7CisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKnhfaXRlciAhPSB4Y2VwdGlvbnMuYmFjaygpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfSAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIGRvY3N0cmluZworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgICAvLyBHZW5lcmF0ZSBkb2NzdHJpbmcgd2l0aCBmb2xsb3dpbmcgZm9ybWF0OgorICAgIC8vIC8vLyA8RGVzY3JpcHRpb24+CisgICAgLy8gLy8vIDxlbXB0eSBsaW5lPgorICAgIC8vIC8vLyAtIFBhcmFtZXRlcnM6CisgICAgLy8gLy8vICAgLSA8cGFyYW1ldGVyPjogPHBhcmFtZXRlciBkb2NzdHJpbmc+CisgICAgLy8gLy8vICAgLSBjYWxsYmFjazogPGNhbGxiYWNrIHR5cGVzPgorCisgICAgLy8gRGVzY3JpcHRpb24KKyAgICBzdHJpbmcgZG9jID0gdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8vIiA8PCBlbmRsOworCisgICAgLy8gUGFyYW1ldGVycworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFBhcmFtZXRlcnM6IiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgc3RyaW5nIGRvYyA9ICgqZl9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgICBpZiAoIWRvYy5lbXB0eSgpICYmIGRvY1tkb2MubGVuZ3RoKCktMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKS0xKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZG9jIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gY29tcGxldGlvbgorICAgIGluZGVudChvdXQpIDw8ICIvLy8gICAtIGNvbXBsZXRpb246IFRBc3luY1Jlc3VsdDwiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIj4gd3JhcHBpbmcgcmV0dXJuIGFuZCBmb2xsb3dpbmcgRXhjZXB0aW9uczogIjsKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgqeF9pdGVyICE9IHhjZXB0aW9ucy5iYWNrKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IHZpYSBibG9ja3MuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6YXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogdGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIHN0cmluZyByZXN1bHQgPSAiZnVuYyAiICsgKGdlbl9jb2NvYV8gPyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgOiB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOworCisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN0cmluZyByZXNwb25zZV9zdHJpbmcgPSAiKFRBc3luY1Jlc3VsdDwiOworICAgIHJlc3BvbnNlX3N0cmluZyArPSAodHR5cGUtPmlzX3ZvaWQoKSkgPyAiVm9pZCIgOiB0eXBlX25hbWUodHR5cGUpOworICAgIHJlc3BvbnNlX3N0cmluZyArPSAiPikgLT4gVm9pZCI7CisgICAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpCisgICAgICAgICAgICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiLCAiIDogIiIpCisgICAgICAgICAgICArICJjb21wbGV0aW9uOiBAZXNjYXBpbmcgIiArIHJlc3BvbnNlX3N0cmluZyArICIpIjsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgcmVzcG9uc2VfcGFyYW0gPSAiKCIgKyAoKHR0eXBlLT5pc192b2lkKCkpID8gIiIgOiB0eXBlX25hbWUodHR5cGUpKSArICIpIC0+IFZvaWQiOworICAgIHJlc3VsdCArPSAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGZhbHNlKQorICAgICAgICAgICAgKyAodGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID8gIiwgIiA6ICIiKQorICAgICAgICAgICAgKyAic3VjY2VzczogIiArIHJlc3BvbnNlX3BhcmFtICsgIiwgIgorICAgICAgICAgICAgKyAiZmFpbHVyZTogKE5TRXJyb3IpIC0+IFZvaWQpIHRocm93cyI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgcmV0dXJucyBhc3luY2hyb25vdXNseSB2aWEgcHJvbWlzZXMuCisgKiBPTkxZIEZPUiBTd2lmdDIvQ29jb2EgQkFDS1dBUkRTIENPTVBBVElCSUxJVFkKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuICJmdW5jICIgKyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGZhbHNlKSArICIpIHRocm93cyAiCisgICAgICAgICArICItPiBQcm9taXNlPCIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI+IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgdmVyYm9zZSBmdW5jdGlvbiBuYW1lIHN1aXRhYmxlIGZvciBhIFN3aWZ0IG1ldGhvZC4gIE9OTFkgRk9SIFN3aWZ0Mi9Db2NvYSBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgc3RyaW5nIGZpcnN0X2FyZyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5mcm9udCgpLT5nZXRfbmFtZSgpOworICAgIGlmIChuYW1lLnNpemUoKSA8IGZpcnN0X2FyZy5zaXplKCkgfHwKKyAgICAgICAgbG93ZXJjYXNlKG5hbWUuc3Vic3RyKG5hbWUuc2l6ZSgpLWZpcnN0X2FyZy5zaXplKCkpKSAhPSBsb3dlcmNhc2UoZmlyc3RfYXJnKSkgeworICAgICAgbmFtZSArPSAiV2l0aCIgKyBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKVswXS0+Z2V0X25hbWUoKSk7CisgICAgfQorICB9CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBTd2lmdCBtZXRob2QgYXJndW1lbnQgbGlzdAorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGlzX2ludGVybmFsKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgYm9vbCBpbmNsdWRlX3Byb3RvY29sID0gIXByb3RvY29sX25hbWUuZW1wdHkoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGluY2x1ZGVfcHJvdG9jb2wpIHsKKyAgICByZXN1bHQgKz0gcHJvdG9jb2xfbmFtZSArICI6IFRQcm90b2NvbCI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICB9IGVsc2UgaWYgKCFmaWVsZHMuZW1wdHkoKSAmJiBpc19pbnRlcm5hbCAmJiBnZW5fY29jb2FfKSB7CisgICAgLy8gRm9yY2UgZmlyc3QgYXJndW1lbnQgdG8gYmUgbmFtZWQsIFN3aWZ0Mi9Db2NvYSBiYWNrd2FyZHMgY29tcGF0CisgICAgcmVzdWx0ICs9IGZpZWxkcy5mcm9udCgpLT5nZXRfbmFtZSgpICsgIiAiOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICB0X2ZpZWxkKiBhcmcgPSAqZl9pdGVyOworCisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICAvLyBvcHRpb25hbCBhcmdzIG5vdCB1c3VhbGx5IHBlcm1pdHRlZCBmb3Igc29tZSByZWFzb24sIGV2ZW4gdGhvdWdoIGR5bmFtaWMgbGFuZ3MgaGFuZGxlIGl0CisgICAgICAvLyB1c2UgYW5ub3RhdGlvbiAic3dpZnQubnVsbGFibGUiIHRvIGFjaGlldmUKKyAgICAgIHJlc3VsdCArPSBhcmctPmdldF9uYW1lKCkgKyAiOiAiICsgdHlwZV9uYW1lKGFyZy0+Z2V0X3R5cGUoKSwgZmllbGRfaXNfb3B0aW9uYWwoYXJnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSBhcmctPmdldF9uYW1lKCkgKyAiOiAiICsgdHlwZV9uYW1lKGFyZy0+Z2V0X3R5cGUoKSk7CisgICAgfQorCisgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvaW9zL2RvY3VtZW50YXRpb24vU3dpZnQvQ29uY2VwdHVhbC9Td2lmdF9Qcm9ncmFtbWluZ19MYW5ndWFnZS9MZXhpY2FsU3RydWN0dXJlLmh0bWwKKyAqCisgKi8KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6cG9wdWxhdGVfcmVzZXJ2ZWRfd29yZHMoKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fQ09MVU1OX18iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJfX0ZJTEVfXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fRlVOQ1RJT05fXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fTElORV9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiQW55Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiYXMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhc3NvY2lhdGVkdHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0aXZpdHkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJicmVhayIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNhc2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjYXRjaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNsYXNzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY29udGludWUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjb252ZW5pZW5jZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmF1bHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkZWZlciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRpZFNldCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRvIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImR5bmFtaWNUeXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZWxzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImVudW0iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJleHRlbnNpb24iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxsdGhyb3VnaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmlsZXByaXZhdGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmaW5hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZ1bmMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJnZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJndWFyZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlmIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW1wb3J0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbmRpcmVjdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluZml4Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlub3V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW50ZXJuYWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImxhenkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZWZ0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGV0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibXV0YXRpbmciKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJuaWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJub25lIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibm9ubXV0YXRpbmciKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVuIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3BlcmF0b3IiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcHRpb25hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm92ZXJyaWRlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicG9zdGZpeCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByZWNlZGVuY2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcmVmaXgiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcml2YXRlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHJvdG9jb2wiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJQcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInB1YmxpYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcGVhdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcXVpcmVkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmV0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyZXR1cm4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyaWdodCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJTZWxmIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic2V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RhdGljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RydWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3Vic2NyaXB0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3VwZXIiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzd2l0Y2giKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0aHJvdyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRocm93cyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRydWUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0cnkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJUeXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHlwZWFsaWFzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidW5vd25lZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInZhciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndlYWsiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ3aGVyZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoaWxlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2lsbFNldCIpOworICB9IGVsc2UgeworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhc3NvY2lhdGVkdHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmVyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pY1R5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJlbnVtIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZXh0ZW5zaW9uIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmFsbHRocm91Z2giKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZ1bmMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJndWFyZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluaXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbm91dCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImludGVybmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGV0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3BlcmF0b3IiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcGVhdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJldGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RydWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3Vic2NyaXB0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHJ1ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInR5cGVhbGlhcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoZXJlIik7CisgIH0KK30KKworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjptYXliZV9lc2NhcGVfaWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGlkZW50aWZpZXIpIHsKKyAgaWYgKHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5maW5kKGlkZW50aWZpZXIpICE9IHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5lbmQoKSkgeworICAgIHJldHVybiAiYCIgKyBpZGVudGlmaWVyICsgImAiOworICB9CisgIHJldHVybiBpZGVudGlmaWVyOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgU3dpZnQgVFR5cGUgZW51bWVyYXRpb24uCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSwgYm9vbCBxdWFsaWZpZWQpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgc3RyaW5nIHJlc3VsdCA9IHF1YWxpZmllZCA/ICJUVHlwZS4iIDogIi4iOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJzdHJpbmciOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJib29sIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImk4IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJpMTYiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTY0IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJkb3VibGUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgImkzMiI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgInN0cnVjdCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJtYXAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAic2V0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJsaXN0IjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiU1RSSU5HIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiQk9PTCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJCWVRFIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJJMTYiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkkzMiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiSTY0IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJET1VCTEUiOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIkkzMiI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIlNUUlVDVCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJNQVAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiU0VUIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJMSVNUIjsKKyAgICB9CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBzd2lmdCwKKyAgICAiU3dpZnQgMy4wIiwKKyAgICAiICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgorICAgICIgICAgZGVidWdfZGVzY3JpcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvblxuIgorICAgICIgICAgYXN5bmNfY2xpZW50czogICBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgYmxvY2sgc3ludGF4LlxuIgorICAgICIgICAgbmFtZXNwYWNlZDogICAgICBHZW5lcmF0ZSBzb3VyY2UgaW4gTW9kdWxlIHNjb3BlZCBvdXRwdXQgZGlyZWN0b3JpZXMgZm9yIFN3aWZ0IE5hbWVzcGFjaW5nLlxuIgorICAgICIgICAgY29jb2E6ICAgICAgICAgICBHZW5lcmF0ZSBTd2lmdCAyLnggY29kZSBjb21wYXRpYmxlIHdpdGggdGhlIFRocmlmdC9Db2NvYSBsaWJyYXJ5XG4iCisgICAgIiAgICBwcm9taXNlX2tpdDogICAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcyAob25seSB1c2Ugd2l0aCBjb2NvYSBmbGFnKVxuIgorICAgICIgICAgc2FmZV9lbnVtczogICAgICBHZW5lcmF0ZSBlbnVtIHR5cGVzIHdpdGggYW4gdW5rbm93biBjYXNlIHRvIGhhbmRsZSB1bnNwZWNpZmllZCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmVkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw2OTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjpzdGFjazsKK3VzaW5nIHN0ZDo6c2V0OworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOworc3RhdGljIGNvbnN0IHN0cmluZyBxdW90ID0gIlwiIjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBkZWZhdWx0X25zX3ByZWZpeCA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL25zLyI7CisKKy8qKgorICogVGhpcyBnZW5lcmF0b3IgY3JlYXRlcyBhbiBYTUwgbW9kZWwgb2YgdGhlIHBhcnNlZCBJREwgdHJlZSwgYW5kIGlzIGRlc2lnbmVkCisgKiB0byBtYWtlIGl0IGVhc3kgdG8gdXNlIHRoaXMgZmlsZSBhcyB0aGUgaW5wdXQgZm9yIG90aGVyIHRlbXBsYXRlIGVuZ2luZXMsCisgKiBzdWNoIGFzIFhTTFQuICBUbyB0aGlzIGVuZCwgdGhlIGdlbmVyYXRlZCBYTUwgaXMgc2xpZ2h0bHkgbW9yZSB2ZXJib3NlIHRoYW4KKyAqIHlvdSBtaWdodCBleHBlY3QuLi4gZm9yIGV4YW1wbGUsIHJlZmVyZW5jZXMgdG8gImlkIiB0eXBlcyAoc3VjaCBhcyBzdHJ1Y3RzLAorICogdW5pb25zLCBldGMpIGFsd2F5cyBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBJREwgZG9jdW1lbnQsIGV2ZW4gaWYgdGhlIHR5cGUKKyAqIGlzIGRlZmluZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgYXMgdGhlIHJlZmVyZW5jZS4KKyAqLworY2xhc3MgdF94bWxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF94bWxfZ2VuZXJhdG9yKCB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgc2hvdWxkX21lcmdlX2luY2x1ZGVzXyA9IGZhbHNlOworICAgIHNob3VsZF91c2VfZGVmYXVsdF9uc18gPSB0cnVlOworICAgIHNob3VsZF91c2VfbmFtZXNwYWNlc18gPSB0cnVlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm1lcmdlIikgPT0gMCkgeworICAgICAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fZGVmYXVsdF9ucyIpID09IDApIHsKKyAgICAgICAgc2hvdWxkX3VzZV9kZWZhdWx0X25zXyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19uYW1lc3BhY2VzIikgPT0gMCkgeworICAgICAgICBzaG91bGRfdXNlX25hbWVzcGFjZXNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24geG1sOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi14bWwiOworICB9CisKKyAgdmlydHVhbCB+dF94bWxfZ2VuZXJhdG9yKCkge30KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOworCisgIHZvaWQgaXRlcmF0ZV9wcm9ncmFtKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jKTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9hbm5vdGF0aW9ucyhzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zKTsKKworcHJpdmF0ZToKKyAgYm9vbCBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfOworICBib29sIHNob3VsZF91c2VfZGVmYXVsdF9uc187CisgIGJvb2wgc2hvdWxkX3VzZV9uYW1lc3BhY2VzXzsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfeG1sXzsKKworICBzdGQ6OnNldDxzdHJpbmc+IHByb2dyYW1zXzsKKyAgc3RkOjpzdGFjazxzdHJpbmc+IGVsZW1lbnRzXzsKKyAgYm9vbCB0b3BfZWxlbWVudF9pc19lbXB0eTsKKyAgYm9vbCB0b3BfZWxlbWVudF9pc19vcGVuOworCisgIHN0cmluZyB0YXJnZXRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHZvaWQgd3JpdGVfZWxlbWVudF9zdGFydChjb25zdCBzdHJpbmcgbmFtZSk7CisgIHZvaWQgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgdm9pZCB3cml0ZV9lbGVtZW50X2VuZCgpOworICB2b2lkIHdyaXRlX2F0dHJpYnV0ZShzdHJpbmcga2V5LCBzdHJpbmcgdmFsKTsKKyAgdm9pZCB3cml0ZV9pbnRfYXR0cmlidXRlKHN0cmluZyBrZXksIGludCB2YWwpOworICBzdHJpbmcgZXNjYXBlX3htbF9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCk7CisKKyAgdm9pZCB3cml0ZV94bWxfY29tbWVudChzdHJpbmcgbXNnKTsKKworICB2b2lkIHdyaXRlX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHZvaWQgd3JpdGVfZG9jKHRfZG9jKiB0ZG9jKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RyaW5nIG51bWJlcl90b19zdHJpbmcoVCB0KSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBvdXQuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgICAgb3V0LnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMxMCk7CisgICAgb3V0IDw8IHQ7CisgICAgcmV0dXJuIG91dC5zdHIoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHdyaXRlX251bWJlcihUIG4pIHsKKyAgICBmX3htbF8gPDwgbnVtYmVyX3RvX3N0cmluZyhuKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHdyaXRlX2VsZW1lbnRfbnVtYmVyKHN0cmluZyBuYW1lLCBUIG4pIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0cmluZyhuYW1lLCBudW1iZXJfdG9fc3RyaW5nKG4pKTsKKyAgfQorCisgIHN0cmluZyBnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKTsKKworICB2b2lkIHdyaXRlX2VsZW1lbnRfc3RyaW5nKHN0cmluZyBuYW1lLCBzdHJpbmcgdmFsdWUpOworICB2b2lkIHdyaXRlX3ZhbHVlKHRfdHlwZSogdHZhbHVlKTsKKyAgdm9pZCB3cml0ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgeG1sX2F1dG9nZW5fY29tbWVudCgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIlxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiI7CisgIH0KK307CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgZl94bWxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIueG1sIjsKKyAgZl94bWxfLm9wZW4oZl94bWxfbmFtZS5jX3N0cigpKTsKKworICB0b3BfZWxlbWVudF9pc19vcGVuID0gZmFsc2U7Cit9CisKK3N0cmluZyB0X3htbF9nZW5lcmF0b3I6OnRhcmdldF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbWFwOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyOworICBtYXAgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKCJ4bWwiKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInRhcmdldE5hbWVzcGFjZSIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIGlmICgoaXRlciA9IG1hcC5maW5kKCJ4bWwiKSkgIT0gbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfbnNfcHJlZml4ICsgaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoIioiKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInhtbC50YXJnZXROYW1lc3BhY2UiKSkgIT0gbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgfQorICBtYXAgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlcygpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgiKiIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgcmV0dXJuIGRlZmF1bHRfbnNfcHJlZml4ICsgcHJvZ3JhbS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX3htbF9jb21tZW50KHN0cmluZyBtc2cpIHsKKyAgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgLy8gVE9ETzogaW5kZW50IGFueSBFT0xzIHRoYXQgbWF5IG9jY3VyIHdpdGggbXNnCisgIC8vIFRPRE86IHByb3BlciBtc2cgZXNjYXBpbmcgbmVlZGVkPworICBmX3htbF8gPDwgaW5kZW50KCkgPDwgIjwhLS0gIiA8PCBtc2cgPDwgIiAtLT4iICA8PCBlbmRsOworICB0b3BfZWxlbWVudF9pc19lbXB0eSA9IGZhbHNlOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Y2xvc2VfdG9wX2VsZW1lbnQoKSB7CisgIGlmKCB0b3BfZWxlbWVudF9pc19vcGVuKSB7CisgICAgdG9wX2VsZW1lbnRfaXNfb3BlbiA9IGZhbHNlOworICAgIGlmIChlbGVtZW50c18uc2l6ZSgpID4gMCAmJiB0b3BfZWxlbWVudF9pc19lbXB0eSkgeworICAgICAgZl94bWxfIDw8ICI+IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9zdGFydChzdHJpbmcgbmFtZSkgeworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyAmJiAhc2hvdWxkX3VzZV9kZWZhdWx0X25zXykgeworICAgIG5hbWUgPSAiaWRsOiIgKyBuYW1lOworICB9CisgIGNsb3NlX3RvcF9lbGVtZW50KCk7CisgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPCIgPDwgbmFtZTsKKyAgZWxlbWVudHNfLnB1c2gobmFtZSk7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gdHJ1ZTsKKyAgdG9wX2VsZW1lbnRfaXNfb3BlbiA9IHRydWU7CisgIGluZGVudF91cCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9lbmQoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGlmICh0b3BfZWxlbWVudF9pc19lbXB0eSAmJiB0b3BfZWxlbWVudF9pc19vcGVuKSB7CisgICAgZl94bWxfIDw8ICIgLz4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8LyIgPDwgZWxlbWVudHNfLnRvcCgpIDw8ICI+IiA8PCBlbmRsOworICB9CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7CisgIGVsZW1lbnRzXy5wb3AoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2F0dHJpYnV0ZShzdHJpbmcga2V5LCBzdHJpbmcgdmFsKSB7CisgIGZfeG1sXyA8PCAiICIgPDwga2V5IDw8ICI9XCIiIDw8IGVzY2FwZV94bWxfc3RyaW5nKHZhbCkgPDwgIlwiIjsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2ludF9hdHRyaWJ1dGUoc3RyaW5nIGtleSwgaW50IHZhbCkgeworICB3cml0ZV9hdHRyaWJ1dGUoa2V5LCBudW1iZXJfdG9fc3RyaW5nKHZhbCkpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZWxlbWVudF9zdHJpbmcoc3RyaW5nIG5hbWUsIHN0cmluZyB2YWwpIHsKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18gJiYgIXNob3VsZF91c2VfZGVmYXVsdF9uc18pIHsKKyAgICBuYW1lID0gImlkbDoiICsgbmFtZTsKKyAgfQorICBjbG9zZV90b3BfZWxlbWVudCgpOworICB0b3BfZWxlbWVudF9pc19lbXB0eSA9IGZhbHNlOworICBmX3htbF8gPDwgaW5kZW50KCkKKyAgICA8PCAiPCIgPDwgbmFtZSA8PCAiPiIgPDwgZXNjYXBlX3htbF9zdHJpbmcodmFsKSA8PCAiPC8iIDw8IG5hbWUgPDwgIj4iCisgICAgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6ZXNjYXBlX3htbF9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CisgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBpbnB1dC5iZWdpbigpOyBpdGVyICE9IGlucHV0LmVuZCgpOyBpdGVyKyspIHsKKyAgICBzd2l0Y2ggKCppdGVyKSB7CisgICAgY2FzZSAnJic6CisgICAgICBzcyA8PCAiJmFtcDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnIic6CisgICAgICBzcyA8PCAiJnF1b3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1wnJzoKKyAgICAgIHNzIDw8ICImYXBvczsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnPCc6CisgICAgICBzcyA8PCAiJmx0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIHNzIDw8ICImZ3Q7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzcyA8PCAqaXRlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfeG1sXy5jbG9zZSgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKKworICBpbml0X2dlbmVyYXRvcigpOworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImlkbCIpOworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXykgeworICAgIGlmIChzaG91bGRfdXNlX2RlZmF1bHRfbnNfKSB7CisgICAgICB3cml0ZV9hdHRyaWJ1dGUoInhtbG5zIiwgImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIik7CisgICAgfQorICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnM6aWRsIiwgImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIik7CisgIH0KKworICB3cml0ZV94bWxfY29tbWVudCggeG1sX2F1dG9nZW5fY29tbWVudCgpKTsKKworICBpdGVyYXRlX3Byb2dyYW0ocHJvZ3JhbV8pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKKyAgY2xvc2VfZ2VuZXJhdG9yKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6Oml0ZXJhdGVfcHJvZ3JhbSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJkb2N1bWVudCIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBwcm9ncmFtLT5nZXRfbmFtZSgpKTsKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18pIHsKKyAgICBjb25zdCBzdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0X25hbWVzcGFjZShwcm9ncmFtKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIHRhcmdldE5hbWVzcGFjZSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxuczoiICsgcHJvZ3JhbS0+Z2V0X25hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlKTsKKyAgfQorICB3cml0ZV9kb2MocHJvZ3JhbSk7CisKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jX2l0OworICBmb3IgKGluY19pdCA9IGluY2x1ZGVzLmJlZ2luKCk7IGluY19pdCAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNfaXQpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJpbmNsdWRlIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgKCppbmNfaXQpLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgbmFtZXNwYWNlcyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5zX2l0OworICBmb3IgKG5zX2l0ID0gbmFtZXNwYWNlcy5iZWdpbigpOyBuc19pdCAhPSBuYW1lc3BhY2VzLmVuZCgpOyArK25zX2l0KSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgibmFtZXNwYWNlIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgbnNfaXQtPmZpcnN0KTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInZhbHVlIiwgbnNfaXQtPnNlY29uZCk7CisgICAgZ2VuZXJhdGVfYW5ub3RhdGlvbnMocHJvZ3JhbS0+Z2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucyhuc19pdC0+Zmlyc3QpKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgLy8gVE9ETzogY2FuIGNvbnN0YW50cyBoYXZlIGFubm90YXRpb25zPworICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW0tPmdldF9jb25zdHMoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NvbnN0YW50KCpjX2l0ZXIpOworICB9CisKKyAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbS0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7CisgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7CisgIH0KKworICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorCisgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtLT5nZXRfb2JqZWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgIH0KKworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgfQorCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKKyAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18pIHsKKyAgICBwcm9ncmFtc18uaW5zZXJ0KHByb2dyYW0tPmdldF9uYW1lKCkpOworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiBwcm9ncmFtcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICAgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgcHJvZ19pdDsKKyAgICBmb3IgKHByb2dfaXQgPSBwcm9ncmFtcy5iZWdpbigpOyBwcm9nX2l0ICE9IHByb2dyYW1zLmVuZCgpOyArK3Byb2dfaXQpIHsKKyAgICAgIGlmICghcHJvZ3JhbXNfLmNvdW50KCgqcHJvZ19pdCktPmdldF9uYW1lKCkpKSB7CisgICAgICAgIGl0ZXJhdGVfcHJvZ3JhbSgqcHJvZ19pdCk7CisgICAgICB9CisgICAgfQorICB9CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ0eXBlZGVmIik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHR0eXBlZGVmLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfZG9jKHR0eXBlZGVmKTsKKyAgd3JpdGVfdHlwZSh0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKTsKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModHR5cGVkZWYtPmFubm90YXRpb25zXyk7CisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIHJldHVybjsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBjb25zdCBzdHJpbmcgdHlwZSA9IGdldF90eXBlX25hbWUodHR5cGUpOworICB3cml0ZV9hdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKKyAgaWYgKHR5cGUgPT0gImlkIikgeworICAgIHdyaXRlX2F0dHJpYnV0ZSgidHlwZS1tb2R1bGUiLCB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0eXBlLWlkIiwgdHR5cGUtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gImxpc3QiKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbGVtVHlwZSIpOworICAgIHdyaXRlX3R5cGUoZXR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAic2V0IikgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbGVtVHlwZSIpOworICAgIHdyaXRlX3R5cGUoZXR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAibWFwIikgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImtleVR5cGUiKTsKKyAgICB3cml0ZV90eXBlKGt0eXBlKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInZhbHVlVHlwZSIpOworICAgIHdyaXRlX3R5cGUodnR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2RvYyh0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nIGRvYyA9IHRkb2MtPmdldF9kb2MoKTsKKyAgICAvLyBmb3Igc29tZSByZWFzb24gdGhlcmUgYWx3YXlzIHNlZW1zIHRvIGJlIGEgdHJhaWxpbmcgbmV3bGluZSBvbiBkb2MKKyAgICAvLyBjb21tZW50czsgbG9vcCBiZWxvdyBuYWl2ZWx5IHRyaWVzIHRvIHN0cmlwIG9mZiB0cmFpbGluZyBjci9sZgorICAgIGludCBuID0gMDsKKyAgICBmb3IgKHN0cmluZzo6cmV2ZXJzZV9pdGVyYXRvciBpID0gZG9jLnJiZWdpbigpOyBpICE9IGRvYy5yZW5kKCk7IGkrKyxuKyspIHsKKyAgICAgIGlmICgqaSAhPSAnXG4nIHx8ICppID09ICdccicpIHsKKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKSAtIG4pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB3cml0ZV9hdHRyaWJ1dGUoImRvYyIsIGRvYyk7CisgIH0KK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Fubm90YXRpb25zKAorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnMpIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gYW5ub3RhdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBhbm5vdGF0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiYW5ub3RhdGlvbiIpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgia2V5IiwgaXRlci0+Zmlyc3QpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidmFsdWUiLCBpdGVyLT5zZWNvbmQpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0YW50KHRfY29uc3QqIGNvbikgeworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJjb25zdCIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBjb24tPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2MoY29uKTsKKyAgd3JpdGVfdHlwZShjb24tPmdldF90eXBlKCkpOworICB3cml0ZV9jb25zdF92YWx1ZShjb24tPmdldF92YWx1ZSgpKTsKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OndyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisKKyAgc3dpdGNoICh2YWx1ZS0+Z2V0X3R5cGUoKSkgeworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIHdyaXRlX2VsZW1lbnRfbnVtYmVyKCJpbnQiLCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgd3JpdGVfZWxlbWVudF9udW1iZXIoImRvdWJsZSIsIHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIHdyaXRlX2VsZW1lbnRfc3RyaW5nKCJzdHJpbmciLCB2YWx1ZS0+Z2V0X3N0cmluZygpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6IHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJsaXN0Iik7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpdDsKKyAgICBmb3IgKGxpdCA9IGxpc3QuYmVnaW4oKTsgbGl0ICE9IGxpc3QuZW5kKCk7ICsrbGl0KSB7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnRyeSIpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUoKmxpdCk7CisgICAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIH0KKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgIGJyZWFrOworICB9CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6IHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJtYXAiKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWl0OworICAgIGZvciAobWl0ID0gbWFwLmJlZ2luKCk7IG1pdCAhPSBtYXAuZW5kKCk7ICsrbWl0KSB7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnRyeSIpOworICAgICAgd3JpdGVfZWxlbWVudF9zdGFydCgia2V5Iik7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPmZpcnN0KTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ2YWx1ZSIpOworICAgICAgd3JpdGVfY29uc3RfdmFsdWUobWl0LT5zZWNvbmQpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgfQorICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgYnJlYWs7CisgIH0KKworICBkZWZhdWx0OgorICAgIGluZGVudF91cCgpOworICAgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPG51bGwgLz4iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBicmVhazsKKyAgfQorCit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnVtIik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRlbnVtLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfZG9jKHRlbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqdmFsX2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoIm1lbWJlciIpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHZhbC0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfaW50X2F0dHJpYnV0ZSgidmFsdWUiLCB2YWwtPmdldF92YWx1ZSgpKTsKKyAgICB3cml0ZV9kb2ModmFsKTsKKyAgICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh2YWwtPmFubm90YXRpb25zXyk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRlbnVtLT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIHN0cmluZyB0YWduYW1lID0gInN0cnVjdCI7CisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgdGFnbmFtZSA9ICJ1bmlvbiI7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIHRhZ25hbWUgPSAiZXhjZXB0aW9uIjsKKyAgfQorCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQodGFnbmFtZSk7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2ModHN0cnVjdCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyOworICBmb3IgKG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgiZmllbGQiKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh0c3RydWN0LT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKSB7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfaW50X2F0dHJpYnV0ZSgiZmllbGQtaWQiLCBmaWVsZC0+Z2V0X2tleSgpKTsKKyAgd3JpdGVfZG9jKGZpZWxkKTsKKyAgc3RyaW5nIHJlcXVpcmVkbmVzczsKKyAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CisgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKKyAgICByZXF1aXJlZG5lc3MgPSAicmVxdWlyZWQiOworICAgIGJyZWFrOworICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6CisgICAgcmVxdWlyZWRuZXNzID0gIm9wdGlvbmFsIjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXF1aXJlZG5lc3MgPSAiIjsKKyAgICBicmVhazsKKyAgfQorICBpZiAocmVxdWlyZWRuZXNzICE9ICIiKSB7CisgICAgd3JpdGVfYXR0cmlidXRlKCJyZXF1aXJlZCIsIHJlcXVpcmVkbmVzcyk7CisgIH0KKyAgd3JpdGVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJkZWZhdWx0Iik7CisgICAgd3JpdGVfY29uc3RfdmFsdWUoZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisgIGdlbmVyYXRlX2Fubm90YXRpb25zKGZpZWxkLT5hbm5vdGF0aW9uc18pOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgic2VydmljZSIpOworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB0c2VydmljZS0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKHNob3VsZF91c2VfbmFtZXNwYWNlc18pIHsKKyAgICBzdHJpbmcgcHJvZ19ucyA9IHRhcmdldF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpOworICAgIGlmICgqcHJvZ19ucy5yYmVnaW4oKSAhPSAnLycpIHsKKyAgICAgIHByb2dfbnMucHVzaF9iYWNrKCcvJyk7CisgICAgfQorICAgIGNvbnN0IHN0cmluZyB0bnMgPSBwcm9nX25zICsgdHNlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCB0bnMpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnM6dG5zIiwgdG5zKTsKKyAgfQorCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGNvbnN0IHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgicGFyZW50LW1vZHVsZSIsIGV4dGVuZHMtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgicGFyZW50LWlkIiwgZXh0ZW5kcy0+Z2V0X25hbWUoKSk7CisgIH0KKworICB3cml0ZV9kb2ModHNlcnZpY2UpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIGdlbmVyYXRlX2Z1bmN0aW9uKCpmbl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgibWV0aG9kIik7CisKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdGZ1bmMtPmdldF9uYW1lKCkpOworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgd3JpdGVfYXR0cmlidXRlKCJvbmV3YXkiLCAidHJ1ZSIpOworICB9CisKKyAgd3JpdGVfZG9jKHRmdW5jKTsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJyZXR1cm5zIik7CisgIHdyaXRlX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworICB3cml0ZV9lbGVtZW50X2VuZCgpOworCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKyAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJhcmciKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJ0aHJvd3MiKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqZXhfaXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRmdW5jLT5hbm5vdGF0aW9uc18pOworCisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6Z2V0X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJsaXN0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJzZXQiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm1hcCI7CisgIH0KKyAgaWYgKCh0dHlwZS0+aXNfZW51bSgpICAgICl8fAorICAgICAgKHR0eXBlLT5pc19zdHJ1Y3QoKSAgKXx8CisgICAgICAodHR5cGUtPmlzX3R5cGVkZWYoKSApfHwKKyAgICAgICh0dHlwZS0+aXNfeGNlcHRpb24oKSkpeworICAgIHJldHVybiAiaWQiOworICB9CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2V0eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBpZiAodGJhc2V0eXBlLT5pc19iaW5hcnkoKSApIHsKKyAgICAgIHJldHVybiAiYmluYXJ5IjsKKyAgICB9CisgICAgcmV0dXJuIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZXR5cGUtPmdldF9iYXNlKCkpOworICB9CisgIHJldHVybiAiKHVua25vd24pIjsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgeG1sLAorICAiWE1MIiwKKyAgIiAgICBtZXJnZTogICAgICAgICAgIEdlbmVyYXRlIG91dHB1dCB3aXRoIGluY2x1ZGVkIGZpbGVzIG1lcmdlZFxuIgorICAiICAgIG5vX2RlZmF1bHRfbnM6ICAgT21pdCBkZWZhdWx0IHhtbG5zIGFuZCBhZGQgaWRsOiBwcmVmaXggdG8gYWxsIGVsZW1lbnRzXG4iCisgICIgICAgbm9fbmFtZXNwYWNlczogICBEbyBub3QgYWRkIG5hbWVzcGFjZSBkZWZpbml0aW9ucyB0byB0aGUgWE1MIG1vZGVsXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODdmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBYU0QgZ2VuZXJhdG9yLCBjcmVhdGVzIGFuIFhTRCBmb3IgdGhlIGJhc2UgdHlwZXMgZXRjLgorICoKKyAqLworY2xhc3MgdF94c2RfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF94c2RfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiB4c2Q6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXhzZCI7CisgIH0KKworICB2aXJ0dWFsIH50X3hzZF9nZW5lcmF0b3IoKSB7fQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7ICh2b2lkKXRlbnVtOyB9CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKK3ByaXZhdGU6CisgIHZvaWQgZ2VuZXJhdGVfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIGF0dHJzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmlsbGFibGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGlzdF9lbGVtZW50ID0gZmFsc2UpOworCisgIHN0ZDo6c3RyaW5nIG5zKHN0ZDo6c3RyaW5nIGluLCBzdGQ6OnN0cmluZyBucykgeyByZXR1cm4gbnMgKyAiOiIgKyBpbjsgfQorCisgIHN0ZDo6c3RyaW5nIHhzZChzdGQ6OnN0cmluZyBpbikgeyByZXR1cm4gbnMoaW4sICJ4c2QiKTsgfQorCisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyB4bWxfYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiPCEtLVxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiIC0tPlxuIjsKKyAgfQorCisgIC8qKgorICAgKiBPdXRwdXQgeHNkL3BocCBmaWxlCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfeHNkXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3BocF87CisKKyAgLyoqCisgICAqIE91dHB1dCBzdHJpbmcgc3RyZWFtCisgICAqLworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc194c2RfdHlwZXNfOworfTsKKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3BocF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl94c2QucGhwIjsKKyAgZl9waHBfLm9wZW4oZl9waHBfbmFtZS5jX3N0cigpKTsKKworICBmX3BocF8gPDwgIjw/cGhwIiA8PCBlbmRsCisgICAgICAgICA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX3BocF8gPDwgIj8+IiA8PCBlbmRsOworICBmX3BocF8uY2xvc2UoKTsKK30KKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpzaW1wbGVUeXBlIG5hbWU9XCIiIDw8IHR0eXBlZGVmLT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+aXNfc3RyaW5nX2VudW0oKSkgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB2YWx1ZXMgPSAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmdldF9zdHJpbmdfZW51bV92YWxzKCk7CisgICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsdWVzLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9XCIiIDw8ICgqdl9pdGVyKSA8PCAiXCIgLz4iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnJlc3RyaWN0aW9uPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpyZXN0cmljdGlvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICJcIiAvPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzaW1wbGVUeXBlPiIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGJvb2wgeHNkX2FsbCA9IHRzdHJ1Y3QtPmdldF94c2RfYWxsKCk7CisKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6Y29tcGxleFR5cGUgbmFtZT1cIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHhzZF9hbGwpIHsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDphbGw+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZWxlbWVudChzX3hzZF90eXBlc18sCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2RfYXR0cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9vcHRpb25hbCgpIHx8IHhzZF9hbGwsCisgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2RfbmlsbGFibGUoKSk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpZiAoeHNkX2FsbCkgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDphbGw+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGlzdF9lbGVtZW50KSB7CisgIHN0cmluZyBzbWluT2NjdXJzID0gKG9wdGlvbmFsIHx8IGxpc3RfZWxlbWVudCkgPyAiIG1pbk9jY3Vycz1cIjBcIiIgOiAiIjsKKyAgc3RyaW5nIHNtYXhPY2N1cnMgPSBsaXN0X2VsZW1lbnQgPyAiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiIiA6ICIiOworICBzdHJpbmcgc29wdGlvbmFsID0gc21pbk9jY3VycyArIHNtYXhPY2N1cnM7CisgIHN0cmluZyBzbmlsbGFibGUgPSBuaWxsYWJsZSA/ICIgbmlsbGFibGU9XCJ0cnVlXCIiIDogIiI7CisKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkgfHwgdHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGF0dHJzID09IE5VTEwgJiYgdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGUgLz4iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6c2VxdWVuY2UgbWluT2NjdXJzPVwiMFwiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIHN0cmluZyBzdWJuYW1lOworICAgICAgICB0X3R5cGUqIHN1YnR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGlmIChzdWJ0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCBzdWJ0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICAgIHN1Ym5hbWUgPSBuYW1lICsgIl9lbHQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN1Ym5hbWUgPSB0eXBlX25hbWUoc3VidHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgZl9waHBfIDw8ICIkR0xPQkFMU1snIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiX3hzZF9lbHRfIiA8PCBuYW1lIDw8ICInXSA9ICciIDw8IHN1Ym5hbWUKKyAgICAgICAgICAgICAgIDw8ICInOyIgPDwgZW5kbDsKKyAgICAgICAgZ2VuZXJhdGVfZWxlbWVudChvdXQsIHN1Ym5hbWUsIHN1YnR5cGUsIE5VTEwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwibGlzdFwiIHR5cGU9XCJ4c2Q6Ym9vbGVhblwiIC8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaWYgKGF0dHJzICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGF0dHJzLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cIiIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlPVwiIgorICAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGlmIChhdHRycyA9PSBOVUxMKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIgorICAgICAgICAgICAgICAgICAgPDwgIiB0eXBlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiIC8+IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV293LCBhbGwgdGhpcyB3b3JrIGZvciBhIFNJTVBMRSBUWVBFIHdpdGggYXR0cmlidXRlcz8hPyE/IQorICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpleHRlbnNpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCI+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiCisgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZXh0ZW5zaW9uPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleENvbnRlbnQ+IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmVsZW1lbnQ+IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl94c2RfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICIueHNkIjsKKyAgZl94c2RfLm9wZW4oZl94c2RfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgbnMgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgieHNkIik7CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3QgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucygieHNkIik7CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHVyaSA9IGFubm90LmZpbmQoInVyaSIpOworICBpZiAodXJpICE9IGFubm90LmVuZCgpKSB7CisgICAgbnMgPSB1cmktPnNlY29uZDsKKyAgfQorICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgIG5zID0gIiB0YXJnZXROYW1lc3BhY2U9XCIiICsgbnMgKyAiXCIgeG1sbnM9XCIiICsgbnMgKyAiXCIgIgorICAgICAgICAgKyAiZWxlbWVudEZvcm1EZWZhdWx0PVwicXVhbGlmaWVkXCIiOworICB9CisKKyAgLy8gUHJpbnQgdGhlIFhTRCBoZWFkZXIKKyAgZl94c2RfIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiIgPDwgbnMgPDwgIj4iIDw8IGVuZGwKKyAgICAgICAgIDw8IHhtbF9hdXRvZ2VuX2NvbW1lbnQoKQorICAgICAgICAgPDwgZW5kbDsKKworICAvLyBQcmludCBvdXQgdGhlIHR5cGUgZGVmaW5pdGlvbnMKKyAgaW5kZW50KGZfeHNkXykgPDwgc194c2RfdHlwZXNfLnN0cigpOworCisgIC8vIEtlZXAgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgZXhjZXB0aW9ucyB0aGF0IG1pZ2h0IGdldCB0aHJvd24KKyAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPiBhbGxfeGNlcHRpb25zOworCisgIC8vIExpc3QgdGhlIGVsZW1lbnRzIHRoYXQgeW91IG1pZ2h0IGFjdHVhbGx5IGdldAorICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZWxlbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3BvbnNlIjsKKyAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGVsZW1uYW1lLCByZXR1cm50eXBlKTsKKyAgICBmX3hzZF8gPDwgZW5kbDsKKworICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBhbGxfeGNlcHRpb25zWygqeF9pdGVyKS0+Z2V0X25hbWUoKV0gPSAodF9zdHJ1Y3QqKSgoKnhfaXRlciktPmdldF90eXBlKCkpOworICAgIH0KKyAgfQorCisgIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj46Oml0ZXJhdG9yIGF4X2l0ZXI7CisgIGZvciAoYXhfaXRlciA9IGFsbF94Y2VwdGlvbnMuYmVnaW4oKTsgYXhfaXRlciAhPSBhbGxfeGNlcHRpb25zLmVuZCgpOyArK2F4X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgYXhfaXRlci0+Zmlyc3QsIGF4X2l0ZXItPnNlY29uZCk7CisgIH0KKworICAvLyBDbG9zZSB0aGUgWFNEIGRvY3VtZW50CisgIGZfeHNkXyA8PCBlbmRsIDw8ICI8L3hzZDpzY2hlbWE+IiA8PCBlbmRsOworICBmX3hzZF8uY2xvc2UoKTsKK30KKworc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIHhzZChiYXNlX3R5cGVfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHhzZCgiaW50Iik7CisgIH0KKworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuICJjb250YWluZXIiOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIFhTRCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcmV0dXJuIEV4cGxpY2l0IFhTRCB0eXBlLCBpLmUuIHhzZDpzdHJpbmcKKyAqLworc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgeworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICByZXR1cm4gInN0cmluZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2xlYW4iOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAic2hvcnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAibG9uZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZGVjaW1hbCI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBYU0QgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHhzZCwgIlhTRCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90aHJpZnQtdF9waHBfZ2VuZXJhdG9yLm8tYTYwYTM4ZTkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dsb2JhbHMuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dsb2JhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjFjNmVmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2xvYmFscy5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9HTE9CQUxTX0gKKyNkZWZpbmUgVF9HTE9CQUxTX0gKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCisvKioKKyAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyAoc2xhcCBvbiB0aGUgd3Jpc3QpIHRoYXQgYXJlCisgKiBzaGFyZWQgdGhyb3VnaG91dCB0aGUgcHJvZ3JhbS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0byBmYWNpbGl0YXRlIHNpbXBsZQorICogaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgcGFyc2VyIGFuZCB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS4gQmVmb3JlIGNhbGxpbmcKKyAqIHl5cGFyc2UoKSwgdGhlIG1haW4uY2MgcHJvZ3JhbSB3aWxsIG1ha2UgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIHRvIHRoZXNlCisgKiBnbG9iYWwgdmFyaWFibGVzIHN1Y2ggdGhhdCB0aGUgcGFyc2VyIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGFuZCBwdXRzIGVudHJpZXMKKyAqIGludG8gdGhlIHJpZ2h0IGNvbnRhaW5lcnMsIGV0Yy4KKyAqCisgKi8KKworLyoqCisgKiBIb29yYXkgZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgdHlwZXMhCisgKi8KKworY2xhc3MgdF9wcm9ncmFtOworY2xhc3MgdF9zY29wZTsKK2NsYXNzIHRfdHlwZTsKKworLyoqCisgKiBQYXJzaW5nIG1vZGUsIHR3byBwYXNzZXMgdXAgaW4gdGhpcyBnaW4gcnVtbXkhCisgKi8KKworZW51bSBQQVJTRV9NT0RFIHsgSU5DTFVERVMgPSAxLCBQUk9HUkFNID0gMiB9OworCisvKioKKyAqIFN0cmljdG5lc3MgbGV2ZWwKKyAqLworZXh0ZXJuIGludCBnX3N0cmljdDsKKworLyoqCisgKiBUaGUgbWFzdGVyIHByb2dyYW0gcGFyc2UgdHJlZS4gVGhpcyBpcyBhY2Nlc3NlZCBmcm9tIHdpdGhpbiB0aGUgcGFyc2VyIGNvZGUKKyAqIHRvIGJ1aWxkIHVwIHRoZSBwcm9ncmFtIGVsZW1lbnRzLgorICovCitleHRlcm4gdF9wcm9ncmFtKiBnX3Byb2dyYW07CisKKy8qKgorICogVGhlIHNjb3BlIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIGludG8KKyAqLworZXh0ZXJuIHRfc2NvcGUqIGdfc2NvcGU7CisKKy8qKgorICogVGhlIHBhcmVudCBzY29wZSB0byBhbHNvIGxvYWQgc3ltYm9scyBpbnRvCisgKi8KK2V4dGVybiB0X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKKworLyoqCisgKiBUaGUgcHJlZml4IGZvciB0aGUgcGFyZW50IHNjb3BlIGVudHJpZXMKKyAqLworZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKKworLyoqCisgKiBUaGUgcGFyc2luZyBwYXNzIHRoYXQgd2UgYXJlIG9uLiBXZSBkbyBkaWZmZXJlbnQgdGhpbmdzIG9uIGVhY2ggcGFzcy4KKyAqLworZXh0ZXJuIFBBUlNFX01PREUgZ19wYXJzZV9tb2RlOworCisvKioKKyAqIEdsb2JhbCB0aW1lIHN0cmluZywgdXNlZCBpbiBmb3JtYXR0aW5nIGVycm9yIG1lc3NhZ2VzIGV0Yy4KKyAqLworZXh0ZXJuIGNoYXIqIGdfdGltZV9zdHI7CisKKy8qKgorICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KKyAqLworZXh0ZXJuIGNoYXIqIGdfZG9jdGV4dDsKKworLyoqCisgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KKyAqLworZXh0ZXJuIGludCBnX2RvY3RleHRfbGluZW5vOworCisvKioKKyAqIFN0YXR1cyBvZiBwcm9ncmFtIGxldmVsIGRvY3RleHQgY2FuZGlkYXRlCisgKi8KK2VudW0gUFJPR0RPQ1RFWFRfU1RBVFVTIHsKKyAgSU5WQUxJRCA9IDAsCisgIFNUSUxMX0NBTkRJREFURSA9IDEsICAgLy8gdGhlIHRleHQgbWF5IG9yIG1heSBub3QgYmUgdGhlIHByb2dyYW0gZG9jdGV4dAorICBBTFJFQURZX1BST0NFU1NFRCA9IDIsIC8vIGRvY3RleHQgaGFzIGJlZW4gdXNlZCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQorICBBQlNPTFVURUxZX1NVUkUgPSAzLCAgIC8vIHRoaXMgaXMgdGhlIHByb2dyYW0gZG9jdGV4dAorICBOT19QUk9HUkFNX0RPQ1RFWFQgPSA0IC8vIHRoZXJlIGlzIG5vIHByb2dyYW0gZG9jdGV4dAorfTsKKworLyoqCisgKiBUaGUgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0LiBTdG9yZWQgc2VwYXJhdGVseSB0byBtYWtlIHBhcnNpbmcgZWFzaWVyLgorICovCitleHRlcm4gY2hhciogZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlOworZXh0ZXJuIGludCBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm87CitleHRlcm4gUFJPR0RPQ1RFWFRfU1RBVFVTIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1czsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCBuZWdhdGl2ZSBmaWVsZCBrZXlzIGFyZSBhY2NlcHRlZC4KKyAqCisgKiBXaGVuIGEgZmllbGQgZG9lcyBub3QgaGF2ZSBhIHVzZXItc3BlY2lmaWVkIGtleSwgdGhyaWZ0IGF1dG9tYXRpY2FsbHkKKyAqIGFzc2lnbnMgYSBuZWdhdGl2ZSB2YWx1ZS4gIEhvd2V2ZXIsIHRoaXMgaXMgZnJhZ2lsZSBzaW5jZSBjaGFuZ2VzIHRvIHRoZQorICogZmlsZSBtYXkgdW5pbnRlbnRpb25hbGx5IGNoYW5nZSB0aGUga2V5IG51bWJlcmluZywgcmVzdWx0aW5nIGluIGEgbmV3CisgKiBwcm90b2NvbCB0aGF0IGlzIG5vdCBiYWNrd2FyZHMgY29tcGF0aWJsZS4KKyAqCisgKiBXaGVuIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgaXMgZW5hYmxlZCwgdXNlcnMgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeQorICogbmVnYXRpdmUga2V5cy4gIFRoaXMgd2F5IHRoZXkgY2FuIHdyaXRlIGEgLnRocmlmdCBmaWxlIHdpdGggZXhwbGljaXRseQorICogc3BlY2lmaWVkIGtleXMgdGhhdCBpcyBzdGlsbCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMKKyAqIHRoYXQgZGlkIG5vdCBzcGVjaWZ5IGtleSB2YWx1ZXMuCisgKi8KK2V4dGVybiBpbnQgZ19hbGxvd19uZWdfZmllbGRfa2V5czsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCA2NC1iaXQgY29uc3RhbnRzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nLgorICoKKyAqIFNvbWUgbGFuZ3VhZ2VzIGRvbid0IHN1cHBvcnQgNjQtYml0IGNvbnN0YW50cywgYnV0IG1hbnkgZG8sIHNvIHdlIGNhbgorICogc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGZvciBwcm9qZWN0cyB0aGF0IGRvbid0IHVzZSBhbnkgbm9uLTY0LWJpdC1zYWZlCisgKiBsYW5ndWFnZXMuCisgKi8KK2V4dGVybiBpbnQgZ19hbGxvd182NGJpdF9jb25zdHM7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMWY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIExvZ2dpbmcgZnVuY3Rpb25zIGNvcGllZCBmcm9tIG1haW4uY2MgdG8gYXZvaWQgbGluayBlcnJvcnMgZm9yIHBsdWdpbnMKKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisKKy8vIFRPRE86IG1ha2UgcGx1Z2lucyBhY2NlcHQgbG9nIG9wdGlvbnMgZnJvbSBtYWluIGNvbXBpbGVyCitpbnQgZ19kZWJ1ZyA9IDA7CitpbnQgZ193YXJuID0gMTsKK2ludCBnX3ZlcmJvc2UgPSAwOworCit2b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ19kZWJ1ZyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgLy8gcHJpbnRmKCJbUEFSU0U6JWRdICIsIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ192ZXJib3NlID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3dhcm4gPCBsZXZlbCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIC8vIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKK3ZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIC8vIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7CisgIGV4aXQoMSk7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlZmJmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9MT0dHSU5HX0gKKyNkZWZpbmUgVF9MT0dHSU5HX0gKKworZXh0ZXJuIGludCBnX2RlYnVnOworZXh0ZXJuIGludCBnX3dhcm47CitleHRlcm4gaW50IGdfdmVyYm9zZTsKKworLyoqCisgKiBQYXJzZSBkZWJ1Z2dpbmcgb3V0cHV0LCB1c2VkIHRvIHByaW50IGhlbHBmdWwgaW5mbworICovCit2b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogUGFyc2VyIHdhcm5pbmcKKyAqLwordm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBQcmludCB2ZXJib3NlIG91dHB1dCBtZXNzYWdlCisgKi8KK3ZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIEZhaWx1cmUhCisgKi8KK3ZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjMTcxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MKQEAgLTAsMCArMSwxMzA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogdGhyaWZ0IC0gYSBsaWdodHdlaWdodCBjcm9zcy1sYW5ndWFnZSBycGMvc2VyaWFsaXphdGlvbiB0b29sCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGNvbXBpbGVyIGVuZ2luZSBmb3IgVGhyaWZ0LCB3aGljaCBpbnZva2VzIHRoZQorICogc2Nhbm5lci9wYXJzZXIgdG8gYnVpbGQgdGhlIHRocmlmdCBvYmplY3QgdHJlZS4gVGhlIGludGVyZmFjZSBnZW5lcmF0aW9uCisgKiBjb2RlIGZvciBlYWNoIGxhbmd1YWdlIGxpdmVzIGluIGEgZmlsZSBieSB0aGUgbGFuZ3VhZ2UgbmFtZSB1bmRlciB0aGUKKyAqIGdlbmVyYXRlLyBmb2xkZXIsIGFuZCBhbGwgcGFyc2Ugc3RydWN0dXJlcyBsaXZlIGluIHBhcnNlLworICoKKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4gLyogZm9yIEdldEZ1bGxQYXRoTmFtZSAqLworI2VuZGlmCisKKy8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCIKKyNpZmRlZiBUSFJJRlRfRU5BQkxFX1BMVUdJTgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisvKioKKyAqIEdsb2JhbCBwcm9ncmFtIHRyZWUKKyAqLwordF9wcm9ncmFtKiBnX3Byb2dyYW07CisKKy8qKgorICogR2xvYmFsIHNjb3BlCisgKi8KK3Rfc2NvcGUqIGdfc2NvcGU7CisKKy8qKgorICogUGFyZW50IHNjb3BlIHRvIGFsc28gcGFyc2UgdHlwZXMKKyAqLwordF9zY29wZSogZ19wYXJlbnRfc2NvcGU7CisKKy8qKgorICogUHJlZml4IGZvciBwdXR0aW5nIHR5cGVzIGluIHBhcmVudCBzY29wZQorICovCitzdHJpbmcgZ19wYXJlbnRfcHJlZml4OworCisvKioKKyAqIFBhcnNpbmcgcGFzcworICovCitQQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKKworLyoqCisgKiBDdXJyZW50IGRpcmVjdG9yeSBvZiBmaWxlIGJlaW5nIHBhcnNlZAorICovCitzdHJpbmcgZ19jdXJkaXI7CisKKy8qKgorICogQ3VycmVudCBmaWxlIGJlaW5nIHBhcnNlZAorICovCitzdHJpbmcgZ19jdXJwYXRoOworCisvKioKKyAqIFNlYXJjaCBwYXRoIGZvciBpbmNsdXNpb25zCisgKi8KK3ZlY3RvcjxzdHJpbmc+IGdfaW5jbF9zZWFyY2hwYXRoOworCisvKioKKyAqIEdsb2JhbCBkZWJ1ZyBzdGF0ZQorICovCitpbnQgZ19kZWJ1ZyA9IDA7CisKKy8qKgorICogU3RyaWN0bmVzcyBsZXZlbAorICovCitpbnQgZ19zdHJpY3QgPSAxMjc7CisKKy8qKgorICogV2FybmluZyBsZXZlbAorICovCitpbnQgZ193YXJuID0gMTsKKworLyoqCisgKiBWZXJib3NlIG91dHB1dAorICovCitpbnQgZ192ZXJib3NlID0gMDsKKworLyoqCisgKiBHbG9iYWwgdGltZSBzdHJpbmcKKyAqLworY2hhciogZ190aW1lX3N0cjsKKworLyoqCisgKiBUaGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgorICovCitjaGFyKiBnX2RvY3RleHQ7CisKKy8qKgorICogVGhlIEZpcnN0IGRvY3RleHQgY29tbWVudAorICovCitjaGFyKiBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGU7CisKKy8qKgorICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCisgKi8KK2ludCBnX2FsbG93X25lZ19maWVsZF9rZXlzOworCisvKioKKyAqIFdoZXRoZXIgb3Igbm90IDY0LWJpdCBjb25zdGFudHMgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcuCisgKi8KK2ludCBnX2FsbG93XzY0Yml0X2NvbnN0cyA9IDA7CisKKy8qKgorICogRmxhZ3MgdG8gY29udHJvbCBjb2RlIGdlbmVyYXRpb24KKyAqLworYm9vbCBnZW5fcmVjdXJzZSA9IGZhbHNlOworCisvKioKKyAqIEZsYWdzIHRvIGNvbnRyb2wgdGhyaWZ0IGF1ZGl0CisgKi8KK2Jvb2wgZ19hdWRpdCA9IGZhbHNlOworCisvKioKKyAqIEZsYWcgdG8gY29udHJvbCByZXR1cm4gc3RhdHVzCisgKi8KK2Jvb2wgZ19yZXR1cm5fZmFpbHVyZSA9IGZhbHNlOworYm9vbCBnX2F1ZGl0X2ZhdGFsID0gdHJ1ZTsKK2Jvb2wgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IGZhbHNlOworCisvKioKKyAqIFdpbjMyIGRvZXNuJ3QgaGF2ZSByZWFscGF0aCwgc28gdXNlIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGluIHRoYXQgY2FzZSwKKyAqIG90aGVyd2lzZSB0aGlzIGp1c3QgY2FsbHMgdGhyb3VnaCB0byByZWFscGF0aAorICovCitjaGFyKiBzYWZlcmVhbHBhdGgoY29uc3QgY2hhciogcGF0aCwgY2hhciogcmVzb2x2ZWRfcGF0aCkgeworI2lmZGVmIF9XSU4zMgorICBjaGFyIGJ1ZltNQVhfUEFUSF07CisgIGNoYXIqIGJhc2VuYW1lOworICBEV09SRCBsZW4gPSBHZXRGdWxsUGF0aE5hbWUocGF0aCwgTUFYX1BBVEgsIGJ1ZiwgJmJhc2VuYW1lKTsKKyAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+IE1BWF9QQVRIIC0gMSkgeworICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBwYXRoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgYnVmKTsKKyAgfQorCisgIC8vIFJlcGxhY2UgYmFja3NsYXNoZXMgd2l0aCBmb3J3YXJkIHNsYXNoZXMgc28gdGhlCisgIC8vIHJlc3Qgb2YgdGhlIGNvZGUgYmVoYXZlcyBjb3JyZWN0bHkuCisgIHNpemVfdCByZXNvbHZlZF9sZW4gPSBzdHJsZW4ocmVzb2x2ZWRfcGF0aCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb2x2ZWRfbGVuOyBpKyspIHsKKyAgICBpZiAocmVzb2x2ZWRfcGF0aFtpXSA9PSAnXFwnKSB7CisgICAgICByZXNvbHZlZF9wYXRoW2ldID0gJy8nOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzb2x2ZWRfcGF0aDsKKyNlbHNlCisgIHJldHVybiByZWFscGF0aChwYXRoLCByZXNvbHZlZF9wYXRoKTsKKyNlbmRpZgorfQorCitib29sIGNoZWNrX2lzX2RpcmVjdG9yeShjb25zdCBjaGFyKiBkaXJfbmFtZSkgeworI2lmZGVmIF9XSU4zMgorICBEV09SRCBhdHRyaWJ1dGVzID0gOjpHZXRGaWxlQXR0cmlidXRlc0EoZGlyX25hbWUpOworICBpZiAoYXR0cmlidXRlcyA9PSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUykgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6IEdldExhc3RFcnJvcigpID0gJWxkXG4iLAorICAgICAgICAgICAgZGlyX25hbWUsCisgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICgoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgIT0gRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgc3RydWN0IHN0YXQgc2I7CisgIGlmIChzdGF0KGRpcl9uYW1lLCAmc2IpIDwgMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBpcyB1bnVzYWJsZTogJXNcbiIsIGRpcl9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIVNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnlcbiIsIGRpcl9uYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworLyoqCisgKiBSZXBvcnQgYW4gZXJyb3IgdG8gdGhlIHVzZXIuIFRoaXMgaXMgY2FsbGVkIHl5ZXJyb3IgZm9yIGhpc3RvcmljYWwKKyAqIHJlYXNvbnMgKGxleCBhbmQgeWFjYyBleHBlY3QgdGhlIGVycm9yIHJlcG9ydGluZyByb3V0aW5lIHRvIGJlIGNhbGxlZAorICogdGhpcykuIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZXBvcnQgYW55IGVycm9ycyB0byB0aGUgdXNlci4KKyAqIHl5ZXJyb3IgdGFrZXMgcHJpbnRmIHN0eWxlIGFyZ3VtZW50cy4KKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBmcHJpbnRmKHN0ZGVyciwgIltFUlJPUjolczolZF0gKGxhc3QgdG9rZW4gd2FzICclcycpXG4iLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8sIHl5dGV4dCk7CisKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCisvKioKKyAqIFByaW50cyBhIGRlYnVnIG1lc3NhZ2UgZnJvbSB0aGUgcGFyc2VyLgorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX2RlYnVnID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICBwcmludGYoIltQQVJTRTolZF0gIiwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCisvKioKKyAqIFByaW50cyBhIHZlcmJvc2Ugb3V0cHV0IG1vZGUgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKKy8qKgorICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3dhcm4gPCBsZXZlbCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKKy8qKgorICogUHJpbnRzIGEgZmFpbHVyZSBtZXNzYWdlIGFuZCBleGl0cworICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7CisgIGV4aXQoMSk7Cit9CisKKy8qKgorICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKKyAqLworc3RyaW5nIHByb2dyYW1fbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKKyAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOworICBpZiAoc2xhc2ggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoc2xhc2ggKyAxKTsKKyAgfQorICBzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBmaWxlbmFtZS5yZmluZCgiLiIpOworICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgeworICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKDAsIGRvdCk7CisgIH0KKyAgcmV0dXJuIGZpbGVuYW1lOworfQorCisvKioKKyAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKKyAqLworc3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgeworICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7CisgIC8vIE5vIHNsYXNoLCBqdXN0IHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyAgaWYgKHNsYXNoID09IHN0cmluZzo6bnBvcykgeworICAgIHJldHVybiAiLiI7CisgIH0KKyAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cigwLCBzbGFzaCk7Cit9CisKKy8qKgorICogRmluZHMgdGhlIGFwcHJvcHJpYXRlIGZpbGUgcGF0aCBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lCisgKi8KK3N0cmluZyBpbmNsdWRlX2ZpbGUoc3RyaW5nIGZpbGVuYW1lKSB7CisgIC8vIEFic29sdXRlIHBhdGg/IEp1c3QgdHJ5IHRoYXQKKyAgaWYgKGZpbGVuYW1lWzBdID09ICcvJykgeworICAgIC8vIFJlYWxwYXRoIQorICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICBpZiAoc2FmZXJlYWxwYXRoKGZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7CisgICAgICBwd2FybmluZygwLCAiQ2Fubm90IG9wZW4gaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIH0KKworICAgIC8vIFN0YXQgdGhpcyBmaWxlCisgICAgc3RydWN0IHN0YXQgZmluZm87CisgICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgeworICAgICAgcmV0dXJuIHJwOworICAgIH0KKyAgfSBlbHNlIHsgLy8gcmVsYXRpdmUgcGF0aCwgc3RhcnQgc2VhcmNoaW5nCisgICAgLy8gbmV3IHNlYXJjaCBwYXRoIHdpdGggY3VycmVudCBkaXIgZ2xvYmFsCisgICAgdmVjdG9yPHN0cmluZz4gc3AgPSBnX2luY2xfc2VhcmNocGF0aDsKKyAgICBzcC5pbnNlcnQoc3AuYmVnaW4oKSwgZ19jdXJkaXIpOworCisgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHBhdGhzCisgICAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBzcC5iZWdpbigpOyBpdCAhPSBzcC5lbmQoKTsgaXQrKykgeworICAgICAgc3RyaW5nIHNmaWxlbmFtZSA9ICooaXQpICsgIi8iICsgZmlsZW5hbWU7CisKKyAgICAgIC8vIFJlYWxwYXRoIQorICAgICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOworICAgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgICBpZiAoc2FmZXJlYWxwYXRoKHNmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gU3RhdCB0aGlzIGZpbGVzCisgICAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKKyAgICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJwOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFVoIG9oCisgIHB3YXJuaW5nKDAsICJDb3VsZCBub3QgZmluZCBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOworICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKK30KKworLyoqCisgKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgorICogQWxzbyBwcmludHMgYSB3YXJuaW5nIGlmIHdlIGFyZSBkaXNjYXJkaW5nIGluZm9ybWF0aW9uLgorICovCit2b2lkIGNsZWFyX2RvY3RleHQoKSB7CisgIGlmIChnX2RvY3RleHQgIT0gTlVMTCkgeworICAgIHB3YXJuaW5nKDIsICJVbmNhcHR1cmVkIGRvY3RleHQgYXQgb24gbGluZSAlZC4iLCBnX2RvY3RleHRfbGluZW5vKTsKKyAgfQorICBmcmVlKGdfZG9jdGV4dCk7CisgIGdfZG9jdGV4dCA9IE5VTEw7Cit9CisKKy8qKgorICogUmVzZXQgcHJvZ3JhbSBkb2N0ZXh0IGluZm9ybWF0aW9uIGFmdGVyIHByb2Nlc3NpbmcgYSBmaWxlCisgKi8KK3ZvaWQgcmVzZXRfcHJvZ3JhbV9kb2N0ZXh0X2luZm8oKSB7CisgIGlmIChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgeworICAgIGZyZWUoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlKTsKKyAgICBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPSBOVUxMOworICB9CisgIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IDA7CisgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IElOVkFMSUQ7CisgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBJTlZBTElEIik7Cit9CisKKy8qKgorICogV2UgYXJlIHN1cmUgdGhlIHByb2dyYW0gZG9jdGV4dCBjYW5kaWRhdGUgaXMgcmVhbGx5IHRoZSBwcm9ncmFtIGRvY3RleHQuCisgKi8KK3ZvaWQgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKSB7CisgIGlmICgoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gU1RJTExfQ0FORElEQVRFKSkgeworICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFCU09MVVRFTFlfU1VSRTsKKyAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gQUJTT0xVVEVMWV9TVVJFIik7CisgIH0gZWxzZSB7CisgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gTk9fUFJPR1JBTV9ET0NURVhUOworICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBOT19QUk9HUkFNX0RPQ1RFWFQiKTsKKyAgfQorfQorCisvKioKKyAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cworICoKKyAqIFdhcm5pbmc6IGlmIHlvdSBtaXggdGFicyBhbmQgc3BhY2VzIGluIGEgbm9uLXVuaWZvcm0gd2F5LAorICogeW91IHdpbGwgZ2V0IHdoYXQgeW91IGRlc2VydmUuCisgKi8KK2NoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCkgeworICAvLyBDb252ZXJ0IHRvIEMrKyBzdHJpbmcsIGFuZCByZW1vdmUgV2luZG93cydzIGNhcnJpYWdlIHJldHVybnMuCisgIHN0cmluZyBkb2NzdHJpbmcgPSBkb2N0ZXh0OworICBkb2NzdHJpbmcuZXJhc2UocmVtb3ZlKGRvY3N0cmluZy5iZWdpbigpLCBkb2NzdHJpbmcuZW5kKCksICdccicpLCBkb2NzdHJpbmcuZW5kKCkpOworCisgIC8vIFNlcGFyYXRlIGludG8gbGluZXMuCisgIHZlY3RvcjxzdHJpbmc+IGxpbmVzOworICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSBzdHJpbmc6Om5wb3M7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Q7CisgIHdoaWxlICh0cnVlKSB7CisgICAgbGFzdCA9IChwb3MgPT0gc3RyaW5nOjpucG9zKSA/IDAgOiBwb3MgKyAxOworICAgIHBvcyA9IGRvY3N0cmluZy5maW5kKCdcbicsIGxhc3QpOworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBGaXJzdCBiaXQgb2YgY2xlYW5pbmcuICBJZiB0aGUgbGFzdCBsaW5lIGlzIG9ubHkgd2hpdGVzcGFjZSwgZHJvcCBpdC4KKyAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5vbndoaXRlID0gZG9jc3RyaW5nLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBsYXN0KTsKKyAgICAgIGlmIChub253aGl0ZSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QsIHBvcyAtIGxhc3QpKTsKKyAgfQorCisgIC8vIEEgdmVyeSBwcm9mb3VuZCBkb2NzdHJpbmcuCisgIGlmIChsaW5lcy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBDbGVhciBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZmlyc3QgbGluZS4KKyAgcG9zID0gbGluZXMuZnJvbnQoKS5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgIGxpbmVzLmZyb250KCkuZXJhc2UoMCwgcG9zKTsKKworICAvLyBJZiBldmVyeSBub25ibGFuayBsaW5lIGFmdGVyIHRoZSBmaXJzdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNwYWNlcy90YWJzLAorICAvLyB0aGVuIGEgc3RhciwgcmVtb3ZlIHRoZW0uCisgIGJvb2wgaGF2ZV9wcmVmaXggPSB0cnVlOworICBib29sIGZvdW5kX3ByZWZpeCA9IGZhbHNlOworICBzdHJpbmc6OnNpemVfdHlwZSBwcmVmaXhfbGVuID0gMDsKKyAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGxfaXRlcjsKKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHBvcyA9IGxfaXRlci0+ZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOworICAgIGlmICghZm91bmRfcHJlZml4KSB7CisgICAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBpZiAobF9pdGVyLT5hdChwb3MpID09ICcqJykgeworICAgICAgICAgIGZvdW5kX3ByZWZpeCA9IHRydWU7CisgICAgICAgICAgcHJlZml4X2xlbiA9IHBvczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIFRydW5jYXRlIGl0LgorICAgICAgICBsX2l0ZXItPmNsZWFyKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsX2l0ZXItPnNpemUoKSA+IHBvcyAmJiBsX2l0ZXItPmF0KHBvcykgPT0gJyonICYmIHBvcyA9PSBwcmVmaXhfbGVuKSB7CisgICAgICAvLyBCdXNpbmVzcyBhcyB1c3VhbC4KKyAgICB9IGVsc2UgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIC8vIFdoaXRlc3BhY2Utb25seSBsaW5lLiAgTGV0J3MgdHJ1bmNhdGUgaXQgZm9yIHRoZW0uCisgICAgICBsX2l0ZXItPmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSBwYXR0ZXJuIGhhcyBiZWVuIGJyb2tlbi4KKyAgICAgIGhhdmVfcHJlZml4ID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBJZiBvdXIgcHJlZml4IHN1cnZpdmVkLCBkZWxldGUgaXQgZnJvbSBldmVyeSBsaW5lLgorICBpZiAoaGF2ZV9wcmVmaXgpIHsKKyAgICAvLyBHZXQgdGhlIHN0YXIgdG9vLgorICAgIHByZWZpeF9sZW4rKzsKKyAgICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOworICAgIH0KKyAgfQorCisgIC8vIE5vdyBkZWxldGUgdGhlIG1pbmltdW0gYW1vdW50IG9mIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGVhY2ggbGluZS4KKyAgcHJlZml4X2xlbiA9IHN0cmluZzo6bnBvczsKKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIGlmIChsX2l0ZXItPmVtcHR5KCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcyAmJiAocHJlZml4X2xlbiA9PSBzdHJpbmc6Om5wb3MgfHwgcG9zIDwgcHJlZml4X2xlbikpIHsKKyAgICAgIHByZWZpeF9sZW4gPSBwb3M7CisgICAgfQorICB9CisKKyAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KKyAgaWYgKHByZWZpeF9sZW4gIT0gc3RyaW5nOjpucG9zKSB7CisgICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKKyAgICB9CisgIH0KKworICAvLyBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUuCisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIHBvcyA9IGxfaXRlci0+ZmluZF9sYXN0X25vdF9vZigiIFx0Iik7CisgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zICE9IGxfaXRlci0+bGVuZ3RoKCkgLSAxKSB7CisgICAgICBsX2l0ZXItPmVyYXNlKHBvcyArIDEpOworICAgIH0KKyAgfQorCisgIC8vIElmIHRoZSBmaXJzdCBsaW5lIGlzIGVtcHR5LCByZW1vdmUgaXQuCisgIC8vIERvbid0IGRvIHRoaXMgZWFybGllciBiZWNhdXNlIGEgbG90IG9mIHN0ZXBzIHNraXAgdGhlIGZpcnN0IGxpbmUuCisgIGlmIChsaW5lcy5mcm9udCgpLmVtcHR5KCkpIHsKKyAgICBsaW5lcy5lcmFzZShsaW5lcy5iZWdpbigpKTsKKyAgfQorCisgIC8vIE5vdyByZWpvaW4gdGhlIGxpbmVzIGFuZCBjb3B5IHRoZW0gYmFjayBpbnRvIGRvY3RleHQuCisgIGRvY3N0cmluZy5jbGVhcigpOworICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBkb2NzdHJpbmcgKz0gKmxfaXRlcjsKKyAgICBkb2NzdHJpbmcgKz0gJ1xuJzsKKyAgfQorCisgIC8vIGFzc2VydChkb2NzdHJpbmcubGVuZ3RoKCkgPD0gc3RybGVuKGRvY3RleHQpKTsgIG1heSBoYXBwZW4sIHNlZSBUSFJJRlQtMTc1NQorICBpZiAoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSkgeworICAgIHN0cmNweShkb2N0ZXh0LCBkb2NzdHJpbmcuY19zdHIoKSk7CisgIH0gZWxzZSB7CisgICAgZnJlZShkb2N0ZXh0KTsgLy8gdG9vIHNob3J0CisgICAgZG9jdGV4dCA9IHN0cmR1cChkb2NzdHJpbmcuY19zdHIoKSk7CisgIH0KKyAgcmV0dXJuIGRvY3RleHQ7Cit9CisKKy8qKiBTZXQgdG8gdHJ1ZSB0byBkZWJ1ZyBkb2NzdHJpbmcgcGFyc2luZyAqLworc3RhdGljIGJvb2wgZHVtcF9kb2NzID0gZmFsc2U7CisKKy8qKgorICogRHVtcHMgZG9jc3RyaW5ncyB0byBzdGRvdXQKKyAqIE9ubHkgd29ya3MgZm9yIHRvcC1sZXZlbCBkZWZpbml0aW9ucyBhbmQgdGhlIHdob2xlIHByb2dyYW0gZG9jCisgKiAoaS5lLiwgbm90IGVudW0gY29uc3RhbnRzLCBzdHJ1Y3QgZmllbGRzLCBvciBmdW5jdGlvbnMuCisgKi8KK3ZvaWQgZHVtcF9kb2NzdHJpbmdzKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdHJpbmcgcHJvZ2RvYyA9IHByb2dyYW0tPmdldF9kb2MoKTsKKyAgaWYgKCFwcm9nZG9jLmVtcHR5KCkpIHsKKyAgICBwcmludGYoIldob2xlIHByb2dyYW0gZG9jOlxuJXNcbiIsIHByb2dkb2MuY19zdHIoKSk7CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfdHlwZWRlZio+JiB0eXBlZGVmcyA9IHByb2dyYW0tPmdldF90eXBlZGVmcygpOworICB2ZWN0b3I8dF90eXBlZGVmKj46OmNvbnN0X2l0ZXJhdG9yIHRfaXRlcjsKKyAgZm9yICh0X2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0X2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdF9pdGVyKSB7CisgICAgdF90eXBlZGVmKiB0ZCA9ICp0X2l0ZXI7CisgICAgaWYgKHRkLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigidHlwZWRlZiAlczpcbiVzXG4iLCB0ZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0ZC0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9lbnVtKj4mIGVudW1zID0gcHJvZ3JhbS0+Z2V0X2VudW1zKCk7CisgIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOworICBmb3IgKGVfaXRlciA9IGVudW1zLmJlZ2luKCk7IGVfaXRlciAhPSBlbnVtcy5lbmQoKTsgKytlX2l0ZXIpIHsKKyAgICB0X2VudW0qIGVuID0gKmVfaXRlcjsKKyAgICBpZiAoZW4tPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJlbnVtICVzOlxuJXNcbiIsIGVuLT5nZXRfbmFtZSgpLmNfc3RyKCksIGVuLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0Kj4mIGNvbnN0cyA9IHByb2dyYW0tPmdldF9jb25zdHMoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHRfY29uc3QqIGNvID0gKmNfaXRlcjsKKyAgICBpZiAoY28tPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJjb25zdCAlczpcbiVzXG4iLCBjby0+Z2V0X25hbWUoKS5jX3N0cigpLCBjby0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgc3RydWN0cyA9IHByb2dyYW0tPmdldF9zdHJ1Y3RzKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogc3QgPSAqc19pdGVyOworICAgIGlmIChzdC0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInN0cnVjdCAlczpcbiVzXG4iLCBzdC0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdC0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9zdHJ1Y3QqPiYgeGNlcHRpb25zID0gcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgIHRfc3RydWN0KiB4biA9ICp4X2l0ZXI7CisgICAgaWYgKHhuLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigieGNlcHRpb24gJXM6XG4lc1xuIiwgeG4tPmdldF9uYW1lKCkuY19zdHIoKSwgeG4tPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+JiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgZm9yICh2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyB2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgdF9zZXJ2aWNlKiBzdiA9ICp2X2l0ZXI7CisgICAgaWYgKHN2LT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50Zigic2VydmljZSAlczpcbiVzXG4iLCBzdi0+Z2V0X25hbWUoKS5jX3N0cigpLCBzdi0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgd2FybmluZyBvbiBsaXN0PGJ5dGU+LCBiaW5hcnkgdHlwZSBpcyB0eXBpY2FsbHkgYSBtdWNoIGJldHRlciBjaG9pY2UuCisgKi8KK3ZvaWQgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXModF90eXBlKiBsaXN0X2VsZW1fdHlwZSkgeworICBpZiAoKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSAmJiAobGlzdF9lbGVtX3R5cGUgIT0gTlVMTCkgJiYgbGlzdF9lbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlID0gKHRfYmFzZV90eXBlKilsaXN0X2VsZW1fdHlwZTsKKyAgICBpZiAodGJhc2UtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTgpIHsKKyAgICAgIHB3YXJuaW5nKDEsICJDb25zaWRlciB1c2luZyB0aGUgbW9yZSBlZmZpY2llbnQgXCJiaW5hcnlcIiB0eXBlIGluc3RlYWQgb2YgXCJsaXN0PGJ5dGU+XCIuIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBib29sIGdfYnl0ZV93YXJuaW5nX2VtaXR0ZWQgPSBmYWxzZTsKKworLyoqCisgKiBFbWl0cyBhIG9uZS10aW1lIHdhcm5pbmcgb24gYnl0ZSB0eXBlLCBwcm9tb3RpbmcgdGhlIG5ldyBpOCB0eXBlIGluc3RlYWQKKyAqLwordm9pZCBlbWl0X2J5dGVfdHlwZV93YXJuaW5nKCkgeworICBpZiAoIWdfYnl0ZV93YXJuaW5nX2VtaXR0ZWQpIHsKKyAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICJUaGUgXCJieXRlXCIgdHlwZSBpcyBhIGNvbXBhdGliaWxpdHkgYWxpYXMgZm9yIFwiaThcIi4gVXNlIFwiaThcIiB0byBlbXBoYXNpemUgdGhlICIKKyAgICAgICAgICAgICAic2lnbmVkbmVzcyBvZiB0aGlzIHR5cGUuXG4iKTsKKyAgICBnX2J5dGVfd2FybmluZ19lbWl0dGVkID0gdHJ1ZTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyBkZXByZWNhdGlvbiBub3RpY2UgZm9yIG9sZCBOUyBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAorICogSWYgbmV3X2Zvcm0gaXMgTlVMTCwgb2xkX2Zvcm0gaXMgYXNzdW1lZCB0byBiZSBhIGxhbmd1YWdlIGlkZW50aWZpZXIsIHN1Y2ggYXMgImNwcCIKKyAqIElmIG5ld19mb3JtIGlzIG5vdCBOVUxMLCBib3RoIGFyZ3VtZW50cyBhcmUgdXNlZCBleGFjdGx5IGFzIGdpdmVuCisgKi8KK3ZvaWQgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woY29uc3QgY2hhciogb2xkX2Zvcm0sIGNvbnN0IGNoYXIqIG5ld19mb3JtKSB7CisgIGNvbnN0IGNoYXIqIHJlbWFpbmRlciA9ICIiOworICBpZiggbmV3X2Zvcm0gPT0gTlVMTCkgeworICAgIG5ld19mb3JtID0gb2xkX2Zvcm07CisgICAgcmVtYWluZGVyID0gIl9uYW1lc3BhY2UiOworICB9CisgIGZhaWx1cmUoIlVuc3VwcG9ydGVkIGRlY2xhcmF0aW9uICclcyVzJy4gVXNlICduYW1lc3BhY2UgJXMnIGluc3RlYWQuIiwgb2xkX2Zvcm0sIHJlbWFpbmRlciwgbmV3X2Zvcm0pOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIKKyAqLwordm9pZCB2ZXJzaW9uKCkgeworICBwcmludGYoIlRocmlmdCB2ZXJzaW9uICVzXG4iLCBUSFJJRlRfVkVSU0lPTik7Cit9CisKKy8qKgorICogRGlzcGxheSB0aGUgdXNhZ2UgbWVzc2FnZSBhbmQgdGhlbiBleGl0IHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZCB1c2FnZSgpIHsKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogdGhyaWZ0IFtvcHRpb25zXSBmaWxlXG5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlVzZSB0aHJpZnQgLWhlbHAgZm9yIGEgbGlzdCBvZiBvcHRpb25zXG4iKTsKKyAgZXhpdCgxKTsKK30KKworLyoqCisgKiBEaXBsYXlzIHRoZSBoZWxwIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdHMgd2l0aCBhbiBlcnJvciBjb2RlLgorICovCit2b2lkIGhlbHAoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiT3B0aW9uczpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcnNpb24gICAgUHJpbnQgdGhlIGNvbXBpbGVyIHZlcnNpb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW8gZGlyICAgICAgU2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBnZW4tKiBwYWNrYWdlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGN1cnJlbnQgZGlyZWN0b3J5KVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtb3V0IGRpciAgICBTZXQgdGhlIG91cHV0IGxvY2F0aW9uIGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAobm8gZ2VuLSogZm9sZGVyIHdpbGwgYmUgY3JlYXRlZClcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUkgZGlyICAgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtbm93YXJuICAgICBTdXBwcmVzcyBhbGwgY29tcGlsZXIgd2FybmluZ3MgKEJBRCEpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1zdHJpY3QgICAgIFN0cmljdCBjb21waWxlciB3YXJuaW5ncyBvblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdltlcmJvc2VdICBWZXJib3NlIG1vZGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJbZWN1cnNlXSAgQWxzbyBnZW5lcmF0ZSBpbmNsdWRlZCBmaWxlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZGVidWcgICAgICBQYXJzZSBkZWJ1ZyB0cmFjZSB0byBzdGRvdXRcbiIpOworICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiICAtLWFsbG93LW5lZy1rZXlzICBBbGxvdyBuZWdhdGl2ZSBmaWVsZCBrZXlzIChVc2VkIHRvICIKKyAgICAgICAgICAicHJlc2VydmUgcHJvdG9jb2xcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgLnRocmlmdCBmaWxlcylcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1hbGxvdy02NGJpdC1jb25zdHMgIERvIG5vdCBwcmludCB3YXJuaW5ncyBhYm91dCB1c2luZyA2NC1iaXQgY29uc3RhbnRzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC0tZ2VuIFNUUiAgIEdlbmVyYXRlIGNvZGUgd2l0aCBhIGR5bmFtaWNhbGx5LXJlZ2lzdGVyZWQgZ2VuZXJhdG9yLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIFNUUiBoYXMgdGhlIGZvcm0gbGFuZ3VhZ2VbOmtleTE9dmFsMVssa2V5Mlssa2V5Mz12YWwzXV1dLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIEtleXMgYW5kIHZhbHVlcyBhcmUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGdlbmVyYXRvci5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBNYW55IG9wdGlvbnMgd2lsbCBub3QgcmVxdWlyZSB2YWx1ZXMuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnMgcmVsYXRlZCB0byBhdWRpdCBvcGVyYXRpb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgIC0tYXVkaXQgT2xkRmlsZSAgIE9sZCBUaHJpZnQgZmlsZSB0byBiZSBhdWRpdGVkIHdpdGggJ2ZpbGUnXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1Jb2xkIGRpciAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIGZvciBvbGQgdGhyaWZ0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUluZXcgZGlyICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXMgZm9yIG5ldyB0aHJpZnQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJBdmFpbGFibGUgZ2VuZXJhdG9ycyAoYW5kIG9wdGlvbnMpOlxuIik7CisKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBnZW5fbWFwID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7CisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGdlbl9tYXAuYmVnaW4oKTsgaXRlciAhPSBnZW5fbWFwLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICIgICVzICglcyk6XG4iLAorICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfc2hvcnRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9sb25nX25hbWUoKS5jX3N0cigpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlci0+c2Vjb25kLT5nZXRfZG9jdW1lbnRhdGlvbigpLmNfc3RyKCkpOworICB9CisgIGV4aXQoMSk7Cit9CisKKy8qKgorICogWW91IGtub3csIHdoZW4gSSBzdGFydGVkIHdvcmtpbmcgb24gVGhyaWZ0IEkgcmVhbGx5IHRob3VnaHQgaXQgd2Fzbid0IGdvaW5nCisgKiB0byBiZWNvbWUgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBiZWNhdXNlIGl0IHdhcyBqdXN0IGEgZ2VuZXJhdG9yIGFuZCBpdAorICogd291bGRuJ3QgbmVlZCBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYW5kIGFsbCB0aGF0IGphenouIEJ1dCB0aGVuIHdlCisgKiBkZWNpZGVkIHRvIGFkZCBjb25zdGFudHMsIGFuZCBhbGwgb2YgYSBzdWRkZW4gdGhhdCBtZWFucyBydW50aW1lIHR5cGUKKyAqIHZhbGlkYXRpb24gYW5kIGluZmVyZW5jZSwgZXhjZXB0IHRoZSAicnVudGltZSIgaXMgdGhlIGNvZGUgZ2VuZXJhdG9yCisgKiBydW50aW1lLgorICovCit2b2lkIHZhbGlkYXRlX2NvbnN0X3JlYyhzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAidHlwZSBlcnJvcjogY2Fubm90IGRlY2xhcmUgYSB2b2lkIGNvbnN0OiAiICsgbmFtZTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJpbmciOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJvb2wiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBieXRlIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkxNiI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMzIiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTY0IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIKKyAgICAgICAgICAmJiB2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEUpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGRvdWJsZSI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgeworICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGVudW0iOworICAgIH0KKworICAgIC8vIHNlZSBpZiB0aGVyZSdzIGEgZG90IGluIHRoZSBpZGVudGlmaWVyCisgICAgc3RkOjpzdHJpbmcgbmFtZV9wb3J0aW9uID0gdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSAoKHRfZW51bSopdHlwZSktPmdldF9jb25zdGFudHMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisKKyAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZV9wb3J0aW9uKSB7CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCAiICsgbmFtZSArICIgd2FzIGRlY2xhcmVkIGFzIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICArICIgd2hpY2ggaXMgYW4gZW51bSwgYnV0ICIgKyB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKQorICAgICAgICAgICsgIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVApIHsKKyAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJ1Y3QveGNlcHRpb24iOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAodl9pdGVyLT5maXJzdC0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBuYW1lICsgIiBzdHJ1Y3Qga2V5IG11c3QgYmUgc3RyaW5nIjsKKyAgICAgIH0KKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiLiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCksIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGtfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8a2V5PiIsIGtfdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8dmFsPiIsIHZfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGVfdHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBlX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8ZWxlbT4iLCBlX3R5cGUsICp2X2l0ZXIpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIENoZWNrIHNpbXBsZSBpZGVudGlmaWVyIG5hbWVzCisgKiBJdCdzIGVhc2llciB0byBkbyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHJld3JpdGluZyB0aGUgd2hvbGUgZ3JhbW1hciBldGMuCisgKi8KK3ZvaWQgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoY29uc3QgY2hhciogaWRlbnRpZmllcikgeworICBzdHJpbmcgbmFtZShpZGVudGlmaWVyKTsKKyAgaWYgKG5hbWUuZmluZCgiLiIpICE9IHN0cmluZzo6bnBvcykgeworICAgIHl5ZXJyb3IoIklkZW50aWZpZXIgJXMgY2FuJ3QgaGF2ZSBhIGRvdC4iLCBpZGVudGlmaWVyKTsKKyAgICBleGl0KDEpOworICB9Cit9CisKKy8qKgorICogQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHBhcnNlZCBjb25zdCBpbmZvcm1hdGlvbiBhZ2FpbnN0IGl0cyBkZWNsYXJlZCB0eXBlCisgKi8KK3ZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKSB7CisgIHZhbGlkYXRlX2NvbnN0X3JlYyhjLT5nZXRfbmFtZSgpLCBjLT5nZXRfdHlwZSgpLCBjLT5nZXRfdmFsdWUoKSk7Cit9CisKKy8qKgorICogQ2hlY2sgdGhlIHR5cGUgb2YgYSBkZWZhdWx0IHZhbHVlIGFzc2lnbmVkIHRvIGEgZmllbGQuCisgKi8KK3ZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KSB7CisgIHZhbGlkYXRlX2NvbnN0X3JlYyhmaWVsZC0+Z2V0X25hbWUoKSwgZmllbGQtPmdldF90eXBlKCksIGN2KTsKK30KKworLyoqCisgKiBDaGVjayB0aGF0IGFsbCB0aGUgZWxlbWVudHMgb2YgYSB0aHJvd3MgYmxvY2sgYXJlIGFjdHVhbGx5IGV4Y2VwdGlvbnMuCisgKi8KK2Jvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRocm93cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCF0X2dlbmVyYXRvcjo6Z2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFNraXBzIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKKyAqLworYm9vbCBza2lwX3V0ZjhfYm9tKEZJTEUqIGYpIHsKKworICAvLyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLCBidXQgd29ya3MKKyAgaWYgKGZnZXRjKGYpID09IDB4RUYpIHsKKyAgICBpZiAoZmdldGMoZikgPT0gMHhCQikgeworICAgICAgaWYgKGZnZXRjKGYpID09IDB4QkYpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV3aW5kKGYpOworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogUGFyc2VzIGEgcHJvZ3JhbQorICovCit2b2lkIHBhcnNlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF9wcm9ncmFtKiBwYXJlbnRfcHJvZ3JhbSkgeworICAvLyBHZXQgc2NvcGUgZmlsZSBwYXRoCisgIHN0cmluZyBwYXRoID0gcHJvZ3JhbS0+Z2V0X3BhdGgoKTsKKworICAvLyBTZXQgY3VycmVudCBkaXIgZ2xvYmFsLCB3aGljaCBpcyB1c2VkIGluIHRoZSBpbmNsdWRlX2ZpbGUgZnVuY3Rpb24KKyAgZ19jdXJkaXIgPSBkaXJlY3RvcnlfbmFtZShwYXRoKTsKKyAgZ19jdXJwYXRoID0gcGF0aDsKKworICAvLyBPcGVuIHRoZSBmaWxlCisgIC8vIHNraXAgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQorICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOworICBpZiAoeXlpbiA9PSAwKSB7CisgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKKyAgfQorICBpZiAoc2tpcF91dGY4X2JvbSh5eWluKSkKKyAgICBwdmVyYm9zZSgiU2tpcHBlZCBVVEYtOCBCT00gYXQgJXNcbiIsIHBhdGguY19zdHIoKSk7CisKKyAgLy8gQ3JlYXRlIG5ldyBzY29wZSBhbmQgc2NhbiBmb3IgaW5jbHVkZXMKKyAgcHZlcmJvc2UoIlNjYW5uaW5nICVzIGZvciBpbmNsdWRlc1xuIiwgcGF0aC5jX3N0cigpKTsKKyAgZ19wYXJzZV9tb2RlID0gSU5DTFVERVM7CisgIGdfcHJvZ3JhbSA9IHByb2dyYW07CisgIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOworICB0cnkgeworICAgIHl5bGluZW5vID0gMTsKKyAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKKyAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgaW5jbHVkZSBwYXNzLiIpOworICAgIH0KKyAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKKyAgICBmYWlsdXJlKHguY19zdHIoKSk7CisgIH0KKyAgZmNsb3NlKHl5aW4pOworCisgIC8vIFJlY3Vyc2l2ZWx5IHBhcnNlIGFsbCB0aGUgaW5jbHVkZSBwcm9ncmFtcworICB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpdGVyKSB7CisgICAgcGFyc2UoKml0ZXIsIHByb2dyYW0pOworICB9CisKKyAgLy8gcmVzZXQgcHJvZ3JhbSBkb2N0ZXh0IHN0YXR1cyBiZWZvcmUgcGFyc2luZyBhIG5ldyBmaWxlCisgIHJlc2V0X3Byb2dyYW1fZG9jdGV4dF9pbmZvKCk7CisKKyAgLy8gUGFyc2UgdGhlIHByb2dyYW0gZmlsZQorICBnX3BhcnNlX21vZGUgPSBQUk9HUkFNOworICBnX3Byb2dyYW0gPSBwcm9ncmFtOworICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKKyAgZ19wYXJlbnRfc2NvcGUgPSAocGFyZW50X3Byb2dyYW0gIT0gTlVMTCkgPyBwYXJlbnRfcHJvZ3JhbS0+c2NvcGUoKSA6IE5VTEw7CisgIGdfcGFyZW50X3ByZWZpeCA9IHByb2dyYW0tPmdldF9uYW1lKCkgKyAiLiI7CisgIGdfY3VycGF0aCA9IHBhdGg7CisKKyAgLy8gT3BlbiB0aGUgZmlsZQorICAvLyBza2lwIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKKyAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKKyAgaWYgKHl5aW4gPT0gMCkgeworICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7CisgIH0KKyAgaWYgKHNraXBfdXRmOF9ib20oeXlpbikpCisgICAgcHZlcmJvc2UoIlNraXBwZWQgVVRGLTggQk9NIGF0ICVzXG4iLCBwYXRoLmNfc3RyKCkpOworCisgIHB2ZXJib3NlKCJQYXJzaW5nICVzIGZvciB0eXBlc1xuIiwgcGF0aC5jX3N0cigpKTsKKyAgeXlsaW5lbm8gPSAxOworICB0cnkgeworICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgeworICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyB0eXBlcyBwYXNzLiIpOworICAgIH0KKyAgfSBjYXRjaCAoc3RyaW5nIHgpIHsKKyAgICBmYWlsdXJlKHguY19zdHIoKSk7CisgIH0KKyAgZmNsb3NlKHl5aW4pOworfQorCisvKioKKyAqIEdlbmVyYXRlIGNvZGUKKyAqLwordm9pZCBnZW5lcmF0ZSh0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBnZW5lcmF0b3Jfc3RyaW5ncykgeworICAvLyBPb29vaGgsIHJlY3Vyc2l2ZSBjb2RlIGdlbmVyYXRpb24sIGhvdCEhCisgIGlmIChnZW5fcmVjdXJzZSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICAvLyBQcm9wYWdhdGUgb3V0cHV0IHBhdGggZnJvbSBwYXJlbnQgdG8gY2hpbGQgcHJvZ3JhbXMKKyAgICAgIGluY2x1ZGVzW2ldLT5zZXRfb3V0X3BhdGgocHJvZ3JhbS0+Z2V0X291dF9wYXRoKCksIHByb2dyYW0tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpOworCisgICAgICBnZW5lcmF0ZShpbmNsdWRlc1tpXSwgZ2VuZXJhdG9yX3N0cmluZ3MpOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIGNvZGUhCisgIHRyeSB7CisgICAgcHZlcmJvc2UoIlByb2dyYW06ICVzXG4iLCBwcm9ncmFtLT5nZXRfcGF0aCgpLmNfc3RyKCkpOworCisgICAgaWYgKGR1bXBfZG9jcykgeworICAgICAgZHVtcF9kb2NzdHJpbmdzKHByb2dyYW0pOworICAgIH0KKworICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGdlbmVyYXRvcl9zdHJpbmdzLmJlZ2luKCk7IGl0ZXIgIT0gZ2VuZXJhdG9yX3N0cmluZ3MuZW5kKCk7ICsraXRlcikgeworICAgICAgdF9nZW5lcmF0b3IqIGdlbmVyYXRvciA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHByb2dyYW0sICppdGVyKTsKKworICAgICAgaWYgKGdlbmVyYXRvciA9PSBOVUxMKSB7CisjaWZkZWYgVEhSSUZUX0VOQUJMRV9QTFVHSU4KKyAgICAgICAgc3dpdGNoIChwbHVnaW5fb3V0cHV0OjpkZWxlZ2F0ZVRvUGx1Z2luKHByb2dyYW0sICppdGVyKSkgeworICAgICAgICAgIGNhc2UgcGx1Z2luX291dHB1dDo6UExVR0lOX05PVF9GT1VORDoKKyAgICAgICAgICAgIHB3YXJuaW5nKDEsICJVbmFibGUgdG8gZ2V0IGEgZ2VuZXJhdG9yIGZvciBcIiVzXCIuXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgICAgIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBwbHVnaW5fb3V0cHV0OjpQTFVHSU5fRkFJTFVSRToKKyAgICAgICAgICAgIHB3YXJuaW5nKDEsICJQbHVnaW4gZ2VuZXJhdG9yIGZvciBcIiVzXCIgZmFpbGVkLlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgICAgICBnX2dlbmVyYXRvcl9mYWlsdXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgcGx1Z2luX291dHB1dDo6UExVR0lOX1NVQ0NFRVNTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgcHdhcm5pbmcoMSwgIlVuYWJsZSB0byBnZXQgYSBnZW5lcmF0b3IgZm9yIFwiJXNcIi5cbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICBnX2dlbmVyYXRvcl9mYWlsdXJlID0gdHJ1ZTsKKyNlbmRpZgorICAgICAgfSBlbHNlIGlmIChnZW5lcmF0b3IpIHsKKyAgICAgICAgZ2VuZXJhdG9yLT52YWxpZGF0ZV9pbnB1dCgpOworICAgICAgICBwdmVyYm9zZSgiR2VuZXJhdGluZyBcIiVzXCJcbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICBnZW5lcmF0b3ItPmdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgICAgICAgZGVsZXRlIGdlbmVyYXRvcjsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKHN0cmluZyBzKSB7CisgICAgZmFpbHVyZSgiRXJyb3I6ICVzXG4iLCBzLmNfc3RyKCkpOworICB9IGNhdGNoIChjb25zdCBjaGFyKiBleGMpIHsKKyAgICBmYWlsdXJlKCJFcnJvcjogJXNcbiIsIGV4Yyk7CisgIH0KK30KKwordm9pZCBhdWRpdCh0X3Byb2dyYW0qIG5ld19wcm9ncmFtLAorICAgICAgICAgICB0X3Byb2dyYW0qIG9sZF9wcm9ncmFtLAorICAgICAgICAgICBzdHJpbmcgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGgsCisgICAgICAgICAgIHN0cmluZyBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCkgeworICB2ZWN0b3I8c3RyaW5nPiB0ZW1wX2luY2xfc2VhcmNocGF0aCA9IGdfaW5jbF9zZWFyY2hwYXRoOworICBpZiAoIW9sZF90aHJpZnRfaW5jbHVkZV9wYXRoLmVtcHR5KCkpIHsKKyAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2sob2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpOworICB9CisKKyAgcGFyc2Uob2xkX3Byb2dyYW0sIE5VTEwpOworCisgIGdfaW5jbF9zZWFyY2hwYXRoID0gdGVtcF9pbmNsX3NlYXJjaHBhdGg7CisgIGlmICghbmV3X3RocmlmdF9pbmNsdWRlX3BhdGguZW1wdHkoKSkgeworICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7CisgIH0KKworICBwYXJzZShuZXdfcHJvZ3JhbSwgTlVMTCk7CisKKyAgY29tcGFyZV9uYW1lc3BhY2UobmV3X3Byb2dyYW0sIG9sZF9wcm9ncmFtKTsKKyAgY29tcGFyZV9zZXJ2aWNlcyhuZXdfcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCksIG9sZF9wcm9ncmFtLT5nZXRfc2VydmljZXMoKSk7CisgIGNvbXBhcmVfZW51bXMobmV3X3Byb2dyYW0tPmdldF9lbnVtcygpLCBvbGRfcHJvZ3JhbS0+Z2V0X2VudW1zKCkpOworICBjb21wYXJlX3N0cnVjdHMobmV3X3Byb2dyYW0tPmdldF9zdHJ1Y3RzKCksIG9sZF9wcm9ncmFtLT5nZXRfc3RydWN0cygpKTsKKyAgY29tcGFyZV9zdHJ1Y3RzKG5ld19wcm9ncmFtLT5nZXRfeGNlcHRpb25zKCksIG9sZF9wcm9ncmFtLT5nZXRfeGNlcHRpb25zKCkpOworICBjb21wYXJlX2NvbnN0cyhuZXdfcHJvZ3JhbS0+Z2V0X2NvbnN0cygpLCBvbGRfcHJvZ3JhbS0+Z2V0X2NvbnN0cygpKTsKK30KKworLyoqCisgKiBQYXJzZSBpdCB1cC4uIHRoZW4gc3BpdCBpdCBiYWNrIG91dCwgaW4gcHJldHR5IG11Y2ggZXZlcnkgbGFuZ3VhZ2UuIEFscmlnaHQKKyAqIG5vdCB0aGF0IG1hbnkgbGFuZ3VhZ2VzLCBidXQgdGhlIGNvb2wgb25lcyB0aGF0IHdlIGNhcmUgYWJvdXQuCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBpbnQgaTsKKyAgc3RkOjpzdHJpbmcgb3V0X3BhdGg7CisgIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUgPSBmYWxzZTsKKworICAvLyBTZXR1cCB0aW1lIHN0cmluZworICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgZ190aW1lX3N0ciA9IGN0aW1lKCZub3cpOworCisgIC8vIENoZWNrIGZvciBuZWNlc3NhcnkgYXJndW1lbnRzLCB5b3UgZ290dGEgaGF2ZSBhdCBsZWFzdCBhIGZpbGVuYW1lIGFuZAorICAvLyBhbiBvdXRwdXQgbGFuZ3VhZ2UgZmxhZworICBpZiAoYXJnYyA8IDIpIHsKKyAgICB1c2FnZSgpOworICB9CisKKyAgdmVjdG9yPHN0cmluZz4gZ2VuZXJhdG9yX3N0cmluZ3M7CisgIHN0cmluZyBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aDsKKyAgc3RyaW5nIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoOworICBzdHJpbmcgb2xkX2lucHV0X2ZpbGU7CisKKyAgLy8gU2V0IHRoZSBjdXJyZW50IHBhdGggdG8gYSBkdW1teSB2YWx1ZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KKyAgZ19jdXJwYXRoID0gImFyZ3VtZW50cyI7CisKKyAgLy8gSGFja3kgcGFyYW1ldGVyIGhhbmRsaW5nLi4uIEkgZGlkbid0IGZlZWwgbGlrZSB1c2luZyBhIGxpYnJhcnkgc29ycnkhCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjIC0gMTsgaSsrKSB7CisgICAgY2hhciogYXJnOworCisgICAgYXJnID0gc3RydG9rKGFyZ3ZbaV0sICIgIik7CisgICAgd2hpbGUgKGFyZyAhPSBOVUxMKSB7CisgICAgICAvLyBUcmVhdCBkb3VibGUgZGFzaGVzIGFzIHNpbmdsZSBkYXNoZXMKKyAgICAgIGlmIChhcmdbMF0gPT0gJy0nICYmIGFyZ1sxXSA9PSAnLScpIHsKKyAgICAgICAgKythcmc7CisgICAgICB9CisKKyAgICAgIGlmIChzdHJjbXAoYXJnLCAiLWhlbHAiKSA9PSAwKSB7CisgICAgICAgIGhlbHAoKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12ZXJzaW9uIikgPT0gMCkgeworICAgICAgICB2ZXJzaW9uKCk7CisgICAgICAgIGV4aXQoMCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZGVidWciKSA9PSAwKSB7CisgICAgICAgIGdfZGVidWcgPSAxOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLW5vd2FybiIpID09IDApIHsKKyAgICAgICAgZ193YXJuID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1zdHJpY3QiKSA9PSAwKSB7CisgICAgICAgIGdfc3RyaWN0ID0gMjU1OworICAgICAgICBnX3dhcm4gPSAyOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXYiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItdmVyYm9zZSIpID09IDApIHsKKyAgICAgICAgZ192ZXJib3NlID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXJlY3Vyc2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl9yZWN1cnNlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hbGxvdy1uZWcta2V5cyIpID09IDApIHsKKyAgICAgICAgZ19hbGxvd19uZWdfZmllbGRfa2V5cyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctNjRiaXQtY29uc3RzIikgPT0gMCkgeworICAgICAgICBnX2FsbG93XzY0Yml0X2NvbnN0cyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZ2VuIikgPT0gMCkgeworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBnZW5lcmF0b3Igc3BlY2lmaWNhdGlvblxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0b3Jfc3RyaW5ncy5wdXNoX2JhY2soYXJnKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JIikgPT0gMCkgeworICAgICAgICAvLyBBbiBhcmd1bWVudCBvZiAiLUlcIGFzZGYiIGlzIGludmFsaWQgYW5kIGhhcyB1bmtub3duIHJlc3VsdHMKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworCisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2soYXJnKTsKKyAgICAgIH0gZWxzZSBpZiAoKHN0cmNtcChhcmcsICItbyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApKSB7CisgICAgICAgIG91dF9wYXRoX2lzX2Fic29sdXRlID0gKHN0cmNtcChhcmcsICItb3V0IikgPT0gMCkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICItbzogbWlzc2luZyBvdXRwdXQgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIG91dF9wYXRoID0gYXJnOworCisjaWZkZWYgX1dJTjMyCisgICAgICAgIC8vIHN0cmlwIG91dCB0cmFpbGluZyBcIG9uIFdpbmRvd3MKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0ID0gb3V0X3BhdGgubGVuZ3RoKCkgLSAxOworICAgICAgICBpZiAob3V0X3BhdGhbbGFzdF0gPT0gJ1xcJykgeworICAgICAgICAgIG91dF9wYXRoLmVyYXNlKGxhc3QpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKCFjaGVja19pc19kaXJlY3Rvcnkob3V0X3BhdGguY19zdHIoKSkpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWF1ZGl0IikgPT0gMCkgeworICAgICAgICBnX2F1ZGl0ID0gdHJ1ZTsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3Npbmcgb2xkIHRocmlmdCBmaWxlIG5hbWUgZm9yIGF1ZGl0IG9wZXJhdGlvblxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIG9sZF90aHJpZnRfZmlsZV9ycFtUSFJJRlRfUEFUSF9NQVhdOworCisgICAgICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgICAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZywgb2xkX3RocmlmdF9maWxlX3JwKSA9PSBOVUxMKSB7CisgICAgICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgb2xkX2lucHV0X2ZpbGUgPSBzdHJpbmcob2xkX3RocmlmdF9maWxlX3JwKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hdWRpdC1ub2ZhdGFsIikgPT0gMCkgeworICAgICAgICBnX2F1ZGl0X2ZhdGFsID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSW9sZCIpID09IDApIHsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnkgZm9yIG9sZCB0aHJpZnQgZmlsZVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCA9IHN0cmluZyhhcmcpOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUluZXciKSA9PSAwKSB7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5IGZvciBuZXcgdGhyaWZ0IGZpbGVcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGggPSBzdHJpbmcoYXJnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIG9wdGlvbjogJXNcbiIsIGFyZyk7CisgICAgICAgIHVzYWdlKCk7CisgICAgICB9CisKKyAgICAgIC8vIFRva2VuaXplIG1vcmUKKyAgICAgIGFyZyA9IHN0cnRvayhOVUxMLCAiICIpOworICAgIH0KKyAgfQorCisgIC8vIGRpc3BsYXkgaGVscAorICBpZiAoKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi1oZWxwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi0taGVscCIpID09IDApKSB7CisgICAgaGVscCgpOworICB9CisKKyAgLy8gaWYgeW91J3JlIGFza2luZyBmb3IgdmVyc2lvbiwgeW91IGhhdmUgYSByaWdodCBub3QgdG8gcGFzcyBhIGZpbGUKKyAgaWYgKChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItdmVyc2lvbiIpID09IDApIHx8IChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItLXZlcnNpb24iKSA9PSAwKSkgeworICAgIHZlcnNpb24oKTsKKyAgICBleGl0KDApOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSBnbG9iYWwgdHlwZXMKKyAgaW5pdEdsb2JhbHMoKTsKKworICBpZiAoZ19hdWRpdCkgeworICAgIC8vIEF1ZGl0IG9wZXJhdGlvbgorCisgICAgaWYgKG9sZF9pbnB1dF9maWxlLmVtcHR5KCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWUgb2Ygb2xkIHRocmlmdCBmaWxlIGZvciBhdWRpdFxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKworICAgIGNoYXIgbmV3X3RocmlmdF9maWxlX3JwW1RIUklGVF9QQVRIX01BWF07CisgICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZSBvZiBuZXcgdGhyaWZ0IGZpbGUgZm9yIGF1ZGl0XG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgbmV3X3RocmlmdF9maWxlX3JwKSA9PSBOVUxMKSB7CisgICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7CisgICAgfQorICAgIHN0cmluZyBuZXdfaW5wdXRfZmlsZShuZXdfdGhyaWZ0X2ZpbGVfcnApOworCisgICAgdF9wcm9ncmFtIG5ld19wcm9ncmFtKG5ld19pbnB1dF9maWxlKTsKKyAgICB0X3Byb2dyYW0gb2xkX3Byb2dyYW0ob2xkX2lucHV0X2ZpbGUpOworCisgICAgYXVkaXQoJm5ld19wcm9ncmFtLCAmb2xkX3Byb2dyYW0sIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoLCBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7CisKKyAgfSBlbHNlIHsKKyAgICAvLyBHZW5lcmF0ZSBvcHRpb25zCisKKyAgICAvLyBZb3UgZ290dGEgZ2VuZXJhdGUgc29tZXRoaW5nIQorICAgIGlmIChnZW5lcmF0b3Jfc3RyaW5ncy5lbXB0eSgpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIG91dHB1dCBsYW5ndWFnZShzKSBzcGVjaWZpZWRcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisKKyAgICAvLyBSZWFsLXBhdGhpZnkgaXQKKyAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07CisgICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZVxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZ3ZbaV0sIHJwKSA9PSBOVUxMKSB7CisgICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7CisgICAgfQorICAgIHN0cmluZyBpbnB1dF9maWxlKHJwKTsKKworICAgIC8vIEluc3RhbmNlIG9mIHRoZSBnbG9iYWwgcGFyc2UgdHJlZQorICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0oaW5wdXRfZmlsZSk7CisgICAgaWYgKG91dF9wYXRoLnNpemUoKSkgeworICAgICAgcHJvZ3JhbS0+c2V0X291dF9wYXRoKG91dF9wYXRoLCBvdXRfcGF0aF9pc19hYnNvbHV0ZSk7CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSB0aGUgY3BwIGluY2x1ZGUgcHJlZml4LgorICAgIC8vIGluZmVyIHRoaXMgZnJvbSB0aGUgZmlsZW5hbWUgcGFzc2VkIGluCisgICAgc3RyaW5nIGlucHV0X2ZpbGVuYW1lID0gYXJndltpXTsKKyAgICBzdHJpbmcgaW5jbHVkZV9wcmVmaXg7CisKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RyaW5nOjpucG9zOworICAgIGlmICgobGFzdF9zbGFzaCA9IGlucHV0X2ZpbGVuYW1lLnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbnB1dF9maWxlbmFtZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7CisgICAgfQorCisgICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKKworICAgIC8vIFBhcnNlIGl0IQorICAgIHBhcnNlKHByb2dyYW0sIE5VTEwpOworCisgICAgLy8gVGhlIGN1cnJlbnQgcGF0aCBpcyBub3QgcmVhbGx5IHJlbGV2YW50IHdoZW4gd2UgYXJlIGRvaW5nIGdlbmVyYXRpb24uCisgICAgLy8gUmVzZXQgdGhlIHZhcmlhYmxlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgorICAgIGdfY3VycGF0aCA9ICJnZW5lcmF0aW9uIjsKKyAgICAvLyBSZXNldCB5eWxpbmVubyBmb3IgdGhlIGhlY2sgb2YgaXQuICBVc2UgMSBpbnN0ZWFkIG9mIDAgYmVjYXVzZQorICAgIC8vIFRoYXQgaXMgd2hhdCBzaG93cyB1cCBkdXJpbmcgYXJndW1lbnQgcGFyc2luZy4KKyAgICB5eWxpbmVubyA9IDE7CisKKyAgICAvLyBHZW5lcmF0ZSBpdCEKKyAgICBnZW5lcmF0ZShwcm9ncmFtLCBnZW5lcmF0b3Jfc3RyaW5ncyk7CisgICAgZGVsZXRlIHByb2dyYW07CisgIH0KKworICAvLyBDbGVhbiB1cC4gV2hvIGFtIEkga2lkZGluZy4uLiB0aGlzIHByb2dyYW0gcHJvYmFibHkgb3JwaGFucyBoZWFwIG1lbW9yeQorICAvLyBhbGwgb3ZlciB0aGUgcGxhY2UsIGJ1dCB3aG8gY2FyZXMgYmVjYXVzZSBpdCBpcyBhYm91dCB0byBleGl0IGFuZCBpdCBpcworICAvLyBhbGwgcmVmZXJlbmNlZCBhbmQgdXNlZCBieSB0aGlzIHdhY2t5IHBhcnNlIHRyZWUgdXAgdW50aWwgbm93IGFueXdheXMuCisgIGNsZWFyR2xvYmFscygpOworCisgIC8vIEZpbmlzaGVkCisgIGlmIChnX3JldHVybl9mYWlsdXJlICYmIGdfYXVkaXRfZmF0YWwpIHsKKyAgICBleGl0KDIpOworICB9CisgIGlmIChnX2dlbmVyYXRvcl9mYWlsdXJlKSB7CisgICAgZXhpdCgzKTsKKyAgfQorICAvLyBGaW5pc2hlZAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFiYjAzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9NQUlOX0gKKyNkZWZpbmUgVF9NQUlOX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RkaW8+CisKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisvKioKKyAqIERlZmluZWQgaW4gdGhlIGZsZXggbGlicmFyeQorICovCisKK2V4dGVybiAiQyIgeyBpbnQgeXlsZXgodm9pZCk7IH0KKworaW50IHl5cGFyc2Uodm9pZCk7CisKKy8qKgorICogRXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCBieSBGbGV4L0Jpc29uCisgKi8KK3ZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogQ2hlY2sgc2ltcGxlIGlkZW50aWZpZXIgbmFtZXMKKyAqLwordm9pZCB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcihjb25zdCBjaGFyKiBpZGVudGlmaWVyKTsKKworLyoqCisgKiBDaGVjayBjb25zdGFudCB0eXBlcworICovCit2b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYyk7CisKKy8qKgorICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKKyAqLwordm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpOworCisvKioKKyAqIENoZWNrIG1lbWJlcnMgb2YgYSB0aHJvd3MgYmxvY2sKKyAqLworYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cyk7CisKKy8qKgorICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKKyAqLworc3RkOjpzdHJpbmcgcHJvZ3JhbV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKKworLyoqCisgKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCisgKi8KK3N0ZDo6c3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKKworLyoqCisgKiBHZXQgdGhlIGFic29sdXRlIHBhdGggZm9yIGFuIGluY2x1ZGUgZmlsZQorICovCitzdGQ6OnN0cmluZyBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOworCisvKioKKyAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCisgKi8KK3ZvaWQgY2xlYXJfZG9jdGV4dCgpOworCisvKioKKyAqIENsZWFucyB1cCB0ZXh0IGNvbW1vbmx5IGZvdW5kIGluIGRveHlnZW4tbGlrZSBjb21tZW50cworICovCitjaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpOworCisvKioKKyAqIFdlIGFyZSBzdXJlIHRoZSBwcm9ncmFtIGRvY3RleHQgY2FuZGlkYXRlIGlzIHJlYWxseSB0aGUgcHJvZ3JhbSBkb2N0ZXh0LgorICovCit2b2lkIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisKKy8qKgorICogRW1pdHMgYSB3YXJuaW5nIG9uIGxpc3Q8Ynl0ZT4sIGJpbmFyeSB0eXBlIGlzIHR5cGljYWxseSBhIG11Y2ggYmV0dGVyIGNob2ljZS4KKyAqLwordm9pZCBjaGVja19mb3JfbGlzdF9vZl9ieXRlcyh0X3R5cGUqIGxpc3RfZWxlbV90eXBlKTsKKworLyoqCisgKiBFbWl0cyBhIG9uZS10aW1lIHdhcm5pbmcgb24gYnl0ZSB0eXBlLCBwcm9tb3RpbmcgdGhlIG5ldyBpOCB0eXBlIGluc3RlYWQKKyAqLwordm9pZCBlbWl0X2J5dGVfdHlwZV93YXJuaW5nKCk7CisKKy8qKgorICogUHJpbnRzIGRlcHJlY2F0aW9uIG5vdGljZSBmb3Igb2xkIE5TIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkCisgKiBJZiBuZXdfZm9ybSBpcyBOVUxMLCBvbGRfZm9ybSBpcyBhc3N1bWVkIHRvIGJlIGEgbGFuZ3VhZ2UgaWRlbnRpZmllciwgc3VjaCBhcyAiY3BwIgorICogSWYgbmV3X2Zvcm0gaXMgbm90IE5VTEwsIGJvdGggYXJndW1lbnRzIGFyZSB1c2VkIGV4YWN0bHkgYXMgZ2l2ZW4KKyAqLwordm9pZCBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbChjb25zdCBjaGFyKiBvbGRfZm9ybSwgY29uc3QgY2hhciogbmV3X2Zvcm0gPSBOVUxMKTsKKworLyoqCisgKiBGbGV4IHV0aWxpdGllcworICovCisKK2V4dGVybiBpbnQgeXlsaW5lbm87CitleHRlcm4gY2hhciB5eXRleHRbXTsKK2V4dGVybiBzdGQ6OkZJTEUqIHl5aW47CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY3NjM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKworI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisKK3RfdHlwZSogdF90eXBlOjpnZXRfdHJ1ZV90eXBlKCkgeworICB0X3R5cGUqIHR5cGUgPSB0aGlzOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworY29uc3QgdF90eXBlKiB0X3R5cGU6OmdldF90cnVlX3R5cGUoKSBjb25zdCB7CisgIGNvbnN0IHRfdHlwZSogdHlwZSA9IHRoaXM7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisgIHJldHVybiB0eXBlOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzOThiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0JBU0VfVFlQRV9ICisjZGVmaW5lIFRfQkFTRV9UWVBFX0gKKworI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEEgdGhyaWZ0IGJhc2UgdHlwZSwgd2hpY2ggbXVzdCBiZSBvbmUgb2YgdGhlIGRlZmluZWQgZW51bWVyYXRlZCB0eXBlcyBpbnNpZGUKKyAqIHRoaXMgZGVmaW5pdGlvbi4KKyAqCisgKi8KK2NsYXNzIHRfYmFzZV90eXBlIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIC8qKgorICAgKiBFbnVtZXJhdGlvbiBvZiB0aHJpZnQgYmFzZSB0eXBlcworICAgKi8KKyAgZW51bSB0X2Jhc2UgeworICAgIFRZUEVfVk9JRCwKKyAgICBUWVBFX1NUUklORywKKyAgICBUWVBFX0JPT0wsCisgICAgVFlQRV9JOCwKKyAgICBUWVBFX0kxNiwKKyAgICBUWVBFX0kzMiwKKyAgICBUWVBFX0k2NCwKKyAgICBUWVBFX0RPVUJMRQorICB9OworCisgIHRfYmFzZV90eXBlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfYmFzZSBiYXNlKQorICAgIDogdF90eXBlKG5hbWUpLCBiYXNlXyhiYXNlKSwgc3RyaW5nX2xpc3RfKGZhbHNlKSwgYmluYXJ5XyhmYWxzZSksIHN0cmluZ19lbnVtXyhmYWxzZSkge30KKworICB0X2Jhc2UgZ2V0X2Jhc2UoKSBjb25zdCB7IHJldHVybiBiYXNlXzsgfQorCisgIGJvb2wgaXNfdm9pZCgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfVk9JRDsgfQorCisgIGJvb2wgaXNfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9TVFJJTkc7IH0KKworICBib29sIGlzX2Jvb2woKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX0JPT0w7IH0KKworICB2b2lkIHNldF9zdHJpbmdfbGlzdChib29sIHZhbCkgeyBzdHJpbmdfbGlzdF8gPSB2YWw7IH0KKworICBib29sIGlzX3N0cmluZ19saXN0KCkgY29uc3QgeyByZXR1cm4gc3RyaW5nX2xpc3RfICYmIChiYXNlXyA9PSBUWVBFX1NUUklORyk7IH0KKworICB2b2lkIHNldF9iaW5hcnkoYm9vbCB2YWwpIHsgYmluYXJ5XyA9IHZhbDsgfQorCisgIGJvb2wgaXNfYmluYXJ5KCkgY29uc3QgeyByZXR1cm4gYmluYXJ5XyAmJiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpOyB9CisKKyAgdm9pZCBzZXRfc3RyaW5nX2VudW0oYm9vbCB2YWwpIHsgc3RyaW5nX2VudW1fID0gdmFsOyB9CisKKyAgYm9vbCBpc19zdHJpbmdfZW51bSgpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19lbnVtXyAmJiBiYXNlXyA9PSBUWVBFX1NUUklORzsgfQorCisgIHZvaWQgYWRkX3N0cmluZ19lbnVtX3ZhbChzdGQ6OnN0cmluZyB2YWwpIHsgc3RyaW5nX2VudW1fdmFsc18ucHVzaF9iYWNrKHZhbCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9zdHJpbmdfZW51bV92YWxzKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nX2VudW1fdmFsc187IH0KKworICBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgdF9iYXNlX25hbWUodF9iYXNlIHRiYXNlKSB7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgVFlQRV9WT0lEOgorICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTg6CisgICAgICByZXR1cm4gImk4IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JMTY6CisgICAgICByZXR1cm4gImkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTMyOgorICAgICAgcmV0dXJuICJpMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaTY0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICIodW5rbm93bikiOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHRfYmFzZSBiYXNlXzsKKworICBib29sIHN0cmluZ19saXN0XzsKKyAgYm9vbCBiaW5hcnlfOworICBib29sIHN0cmluZ19lbnVtXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ19lbnVtX3ZhbHNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwOGUwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9DT05TVF9ICisjZGVmaW5lIFRfQ09OU1RfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgiCisKKy8qKgorICogQSBjb25zdCBpcyBhIGNvbnN0YW50IHZhbHVlIGRlZmluZWQgYWNyb3NzIGxhbmd1YWdlcyB0aGF0IGhhcyBhIHR5cGUgYW5kCisgKiBhIHZhbHVlLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIG1pZ2h0IG5vdCBtYXRjaCB0aGUgdHlwZQorICogb2YgdGhlIHZhbHVlIG9iamVjdCwgc2luY2UgdGhhdCBpcyBub3QgZGV0ZXJtaW5lZCB1bnRpbCBhZnRlciBwYXJzaW5nIHRoZQorICogd2hvbGUgdGhpbmcgb3V0LgorICoKKyAqLworY2xhc3MgdF9jb25zdCA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfY29uc3QodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKKyAgICA6IHR5cGVfKHR5cGUpLCBuYW1lXyhuYW1lKSwgdmFsdWVfKHZhbHVlKSB7fQorCisgIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiB0eXBlXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTE0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTlNUX1ZBTFVFX0gKKyNkZWZpbmUgVF9DT05TVF9WQUxVRV9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9lbnVtLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChGcm9tKiwgVG8mKTsKK30KKworLyoqCisgKiBBIGNvbnN0IHZhbHVlIGlzIHNvbWV0aGluZyBwYXJzZWQgdGhhdCBjb3VsZCBiZSBhIG1hcCwgc2V0LCBsaXN0LCBzdHJ1Y3QKKyAqIG9yIHdoYXRldmVyLgorICoKKyAqLworY2xhc3MgdF9jb25zdF92YWx1ZSB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCisgICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KKyAgICovCisgIHN0cnVjdCB2YWx1ZV9jb21wYXJlIHsKKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKSh0X2NvbnN0X3ZhbHVlIGNvbnN0KiBjb25zdCYgbGVmdCwgdF9jb25zdF92YWx1ZSBjb25zdCogY29uc3QmIHJpZ2h0KSBjb25zdCB7CisgICAgICByZXR1cm4gKmxlZnQgPCAqcmlnaHQ7CisgICAgfQorICB9OworCisgIGVudW0gdF9jb25zdF92YWx1ZV90eXBlIHsgQ1ZfSU5URUdFUiwgQ1ZfRE9VQkxFLCBDVl9TVFJJTkcsIENWX01BUCwgQ1ZfTElTVCwgQ1ZfSURFTlRJRklFUiwgQ1ZfVU5LTk9XTiB9OworCisgIHRfY29uc3RfdmFsdWUoKSA6IGludFZhbF8oMCksIGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKTApLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7fQorCisgIHRfY29uc3RfdmFsdWUoaW50NjRfdCB2YWwpIDogZG91YmxlVmFsXygwLjBmKSwgZW51bV8oKHRfZW51bSopMCksIHZhbFR5cGVfKENWX1VOS05PV04pIHsgc2V0X2ludGVnZXIodmFsKTsgfQorCisgIHRfY29uc3RfdmFsdWUoc3RkOjpzdHJpbmcgdmFsKSA6IGludFZhbF8oMCksIGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKTApLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7IHNldF9zdHJpbmcodmFsKTsgfQorCisgIHZvaWQgc2V0X3N0cmluZyhzdGQ6OnN0cmluZyB2YWwpIHsKKyAgICB2YWxUeXBlXyA9IENWX1NUUklORzsKKyAgICBzdHJpbmdWYWxfID0gdmFsOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ1ZhbF87IH0KKworICB2b2lkIHNldF9pbnRlZ2VyKGludDY0X3QgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9JTlRFR0VSOworICAgIGludFZhbF8gPSB2YWw7CisgIH0KKworICBpbnQ2NF90IGdldF9pbnRlZ2VyKCkgY29uc3QgeworICAgIGlmICh2YWxUeXBlXyA9PSBDVl9JREVOVElGSUVSKSB7CisgICAgICBpZiAoZW51bV8gPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAiaGF2ZSBpZGVudGlmaWVyIFwiIiArIGdldF9pZGVudGlmaWVyKCkgKyAiXCIsIGJ1dCB1bnNldCBlbnVtIG9uIGxpbmUhIjsKKyAgICAgIH0KKyAgICAgIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXIgPSBnZXRfaWRlbnRpZmllcigpOworICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBpZGVudGlmaWVyLnJmaW5kKCcuJyk7CisgICAgICBpZiAoZG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyLnN1YnN0cihkb3QgKyAxKTsKKyAgICAgIH0KKyAgICAgIHRfZW51bV92YWx1ZSogdmFsID0gZW51bV8tPmdldF9jb25zdGFudF9ieV9uYW1lKGlkZW50aWZpZXIpOworICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJVbmFibGUgdG8gZmluZCBlbnVtIHZhbHVlIFwiIiArIGlkZW50aWZpZXIgKyAiXCIgaW4gZW51bSBcIiIgKyBlbnVtXy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgKyAiXCIiOworICAgICAgfQorICAgICAgcmV0dXJuIHZhbC0+Z2V0X3ZhbHVlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBpbnRWYWxfOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9ET1VCTEU7CisgICAgZG91YmxlVmFsXyA9IHZhbDsKKyAgfQorCisgIGRvdWJsZSBnZXRfZG91YmxlKCkgY29uc3QgeyByZXR1cm4gZG91YmxlVmFsXzsgfQorCisgIHZvaWQgc2V0X21hcCgpIHsgdmFsVHlwZV8gPSBDVl9NQVA7IH0KKworICB2b2lkIGFkZF9tYXAodF9jb25zdF92YWx1ZSoga2V5LCB0X2NvbnN0X3ZhbHVlKiB2YWwpIHsgbWFwVmFsX1trZXldID0gdmFsOyB9CisKKyAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgZ2V0X21hcCgpIGNvbnN0IHsgcmV0dXJuIG1hcFZhbF87IH0KKworICB2b2lkIHNldF9saXN0KCkgeyB2YWxUeXBlXyA9IENWX0xJU1Q7IH0KKworICB2b2lkIGFkZF9saXN0KHRfY29uc3RfdmFsdWUqIHZhbCkgeyBsaXN0VmFsXy5wdXNoX2JhY2sodmFsKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZ2V0X2xpc3QoKSBjb25zdCB7IHJldHVybiBsaXN0VmFsXzsgfQorCisgIHZvaWQgc2V0X2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9JREVOVElGSUVSOworICAgIGlkZW50aWZpZXJWYWxfID0gdmFsOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBpZGVudGlmaWVyVmFsXzsgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyX25hbWUoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKKyAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7CisgICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOworICAgIH0KKyAgICByZXQgPSByZXQuc3Vic3RyKHMgKyAxKTsKKyAgICBzID0gcmV0LmZpbmQoJy4nKTsKKyAgICBpZiAocyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl93aXRoX3BhcmVudCgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyByZXQgPSBnZXRfaWRlbnRpZmllcigpOworICAgIHNpemVfdCBzID0gcmV0LmZpbmQoJy4nKTsKKyAgICBpZiAocyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgdGhyb3cgImVycm9yOiBpZGVudGlmaWVyICIgKyByZXQgKyAiIGlzIHVucXVhbGlmaWVkISI7CisgICAgfQorICAgIHNpemVfdCBzMiA9IHJldC5maW5kKCcuJywgcyArIDEpOworICAgIGlmIChzMiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICB2b2lkIHNldF9lbnVtKHRfZW51bSogdGVudW0pIHsgZW51bV8gPSB0ZW51bTsgfQorCisgIHRfY29uc3RfdmFsdWVfdHlwZSBnZXRfdHlwZSgpIGNvbnN0IHsgaWYgKHZhbFR5cGVfID09IENWX1VOS05PV04pIHsgdGhyb3cgc3RkOjpzdHJpbmcoInVua25vd24gdF9jb25zdF92YWx1ZSIpOyB9IHJldHVybiB2YWxUeXBlXzsgfQorCisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgbWFwIGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5IGFuZCB0aGVuIHZhbHVlLgorICAgKiBUaGlzIGlzIHVzZWQgZm9yIG1hcCBjb21wYXJpc29uIGluIGxleGljb2dyYXBoaWMgb3JkZXIuCisgICAqLworICBzdHJ1Y3QgbWFwX2VudHJ5X2NvbXBhcmUgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gQ29uc3RQYWlyOworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcigpKENvbnN0UGFpciBsZWZ0LCBDb25zdFBhaXIgcmlnaHQpIGNvbnN0IHsKKyAgICAgIGlmICgqKGxlZnQuZmlyc3QpIDwgKihyaWdodC5maXJzdCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKihyaWdodC5maXJzdCkgPCAqKGxlZnQuZmlyc3QpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAqKGxlZnQuc2Vjb25kKSA8ICoocmlnaHQuc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IHRfY29uc3RfdmFsdWUmIHRoYXQpIGNvbnN0IHsKKyAgICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MSA9IGdldF90eXBlKCk7CisgICAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDIgPSB0aGF0LmdldF90eXBlKCk7CisgICAgaWYgKHQxICE9IHQyKQorICAgICAgcmV0dXJuIHQxIDwgdDI7CisgICAgc3dpdGNoICh0MSkgeworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgICAgcmV0dXJuIGludFZhbF8gPCB0aGF0LmludFZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICAgIHJldHVybiBkb3VibGVWYWxfIDwgdGhhdC5kb3VibGVWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgICByZXR1cm4gc3RyaW5nVmFsXyA8IHRoYXQuc3RyaW5nVmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICAgIHJldHVybiBpZGVudGlmaWVyVmFsXyA8IHRoYXQuaWRlbnRpZmllclZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKAorICAgICAgICAgIG1hcFZhbF8uYmVnaW4oKSwgbWFwVmFsXy5lbmQoKSwgdGhhdC5tYXBWYWxfLmJlZ2luKCksIHRoYXQubWFwVmFsXy5lbmQoKSwgbWFwX2VudHJ5X2NvbXBhcmUoKSk7CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgKKyAgICAgICAgICBsaXN0VmFsXy5iZWdpbigpLCBsaXN0VmFsXy5lbmQoKSwgdGhhdC5saXN0VmFsXy5iZWdpbigpLCB0aGF0Lmxpc3RWYWxfLmVuZCgpLCB2YWx1ZV9jb21wYXJlKCkpOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAidW5rbm93biB2YWx1ZSB0eXBlIjsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB2YWx1ZV9jb21wYXJlPiBtYXBWYWxfOworICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdFZhbF87CisgIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbF87CisgIGludDY0X3QgaW50VmFsXzsKKyAgZG91YmxlIGRvdWJsZVZhbF87CisgIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXJWYWxfOworICB0X2VudW0qIGVudW1fOworCisgIHRfY29uc3RfdmFsdWVfdHlwZSB2YWxUeXBlXzsKKworICAvLyB0byByZWFkIGVudW1fCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KKyAgZnJpZW5kIHZvaWQgcGx1Z2luX291dHB1dDo6Y29udmVydChGcm9tKiwgVG8mKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkYWI3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09OVEFJTkVSX0gKKyNkZWZpbmUgVF9DT05UQUlORVJfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCitjbGFzcyB0X2NvbnRhaW5lciA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X2NvbnRhaW5lcigpIDogY3BwX25hbWVfKCksIGhhc19jcHBfbmFtZV8oZmFsc2UpIHt9CisKKyAgdmlydHVhbCB+dF9jb250YWluZXIoKSB7fQorCisgIHZvaWQgc2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nIGNwcF9uYW1lKSB7CisgICAgY3BwX25hbWVfID0gY3BwX25hbWU7CisgICAgaGFzX2NwcF9uYW1lXyA9IHRydWU7CisgIH0KKworICBib29sIGhhc19jcHBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGhhc19jcHBfbmFtZV87IH0KKworICBzdGQ6OnN0cmluZyBnZXRfY3BwX25hbWUoKSBjb25zdCB7IHJldHVybiBjcHBfbmFtZV87IH0KKworICBib29sIGlzX2NvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgY3BwX25hbWVfOworICBib29sIGhhc19jcHBfbmFtZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiY2I4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0RPQ19ICisjZGVmaW5lIFRfRE9DX0gKKworI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisjaW5jbHVkZSAidGhyaWZ0L2xvZ2dpbmcuaCIKKworLyoqCisgKiBEb2N1bWVudGF0aW9uIHN0dWJzCisgKgorICovCitjbGFzcyB0X2RvYyB7CisKK3B1YmxpYzoKKyAgdF9kb2MoKSA6IGhhc19kb2NfKGZhbHNlKSB7fQorICB2aXJ0dWFsIH50X2RvYygpIHt9CisKKyAgdm9pZCBzZXRfZG9jKGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2MpIHsKKyAgICBkb2NfID0gZG9jOworICAgIGhhc19kb2NfID0gdHJ1ZTsKKyAgICBpZiAoKGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9PSBnX2RvY3RleHRfbGluZW5vKQorICAgICAgICAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IFNUSUxMX0NBTkRJREFURSkpIHsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFMUkVBRFlfUFJPQ0VTU0VEOworICAgICAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIEFMUkVBRFlfUFJPQ0VTU0VEIik7CisgICAgfQorICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9kb2MoKSBjb25zdCB7IHJldHVybiBkb2NfOyB9CisKKyAgYm9vbCBoYXNfZG9jKCkgeyByZXR1cm4gaGFzX2RvY187IH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgZG9jXzsKKyAgYm9vbCBoYXNfZG9jXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTIzNzgwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0VOVU1fSAorI2RlZmluZSBUX0VOVU1fSAorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBBbiBlbnVtZXJhdGVkIHR5cGUuIEEgbGlzdCBvZiBjb25zdGFudCBvYmplY3RzIHdpdGggYSBuYW1lIGZvciB0aGUgdHlwZS4KKyAqCisgKi8KK2NsYXNzIHRfZW51bSA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X2VudW0odF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfdHlwZShwcm9ncmFtKSB7fQorCisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsgbmFtZV8gPSBuYW1lOyB9CisKKyAgdm9pZCBhcHBlbmQodF9lbnVtX3ZhbHVlKiBjb25zdGFudCkgeyBjb25zdGFudHNfLnB1c2hfYmFjayhjb25zdGFudCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZ2V0X2NvbnN0YW50cygpIGNvbnN0IHsgcmV0dXJuIGNvbnN0YW50c187IH0KKworICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICpjX2l0ZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfdmFsdWUoaW50NjRfdCB2YWx1ZSkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPT0gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICpjX2l0ZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfbWluX3ZhbHVlKCkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIHRfZW51bV92YWx1ZSogbWluX3ZhbHVlOworICAgIGlmIChlbnVtX3ZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgbWluX3ZhbHVlID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IG1pbl92YWx1ZV92YWx1ZTsKKyAgICAgIG1pbl92YWx1ZSA9IGVudW1fdmFsdWVzLmZyb250KCk7CisgICAgICBtaW5fdmFsdWVfdmFsdWUgPSBtaW5fdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGlmICgoKmNfaXRlciktPmdldF92YWx1ZSgpIDwgbWluX3ZhbHVlX3ZhbHVlKSB7CisgICAgICAgICAgbWluX3ZhbHVlID0gKCpjX2l0ZXIpOworICAgICAgICAgIG1pbl92YWx1ZV92YWx1ZSA9IG1pbl92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1pbl92YWx1ZTsKKyAgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X21heF92YWx1ZSgpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICB0X2VudW1fdmFsdWUqIG1heF92YWx1ZTsKKyAgICBpZiAoZW51bV92YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgIG1heF92YWx1ZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBtYXhfdmFsdWVfdmFsdWU7CisgICAgICBtYXhfdmFsdWUgPSBlbnVtX3ZhbHVlcy5iYWNrKCk7CisgICAgICBtYXhfdmFsdWVfdmFsdWUgPSBtYXhfdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGlmICgoKmNfaXRlciktPmdldF92YWx1ZSgpID4gbWF4X3ZhbHVlX3ZhbHVlKSB7CisgICAgICAgICAgbWF4X3ZhbHVlID0gKCpjX2l0ZXIpOworICAgICAgICAgIG1heF92YWx1ZV92YWx1ZSA9IG1heF92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1heF92YWx1ZTsKKyAgfQorCisgIGJvb2wgaXNfZW51bSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJmM2FkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRU5VTV9WQUxVRV9ICisjZGVmaW5lIFRfRU5VTV9WQUxVRV9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorCisvKioKKyAqIEEgY29uc3RhbnQuIFRoZXNlIGFyZSB1c2VkIGluc2lkZSBvZiBlbnVtIGRlZmluaXRpb25zLiBDb25zdGFudHMgYXJlIGp1c3QKKyAqIHN5bWJvbCBpZGVudGlmaWVycyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYW4gZXhwbGljaXQgdmFsdWUgYXNzb2NpYXRlZAorICogd2l0aCB0aGVtLgorICoKKyAqLworY2xhc3MgdF9lbnVtX3ZhbHVlIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9lbnVtX3ZhbHVlKHN0ZDo6c3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgOiBuYW1lXyhuYW1lKSwgdmFsdWVfKHZhbHVlKSB7fQorCisgIH50X2VudW1fdmFsdWUoKSB7fQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgaW50IGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgaW50IHZhbHVlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjFmODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0ZJRUxEX0gKKyNkZWZpbmUgVF9GSUVMRF9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8vIEZvcndhcmQgZGVjbGFyZSBmb3IgeHNkX2F0dHJzCitjbGFzcyB0X3N0cnVjdDsKKworLyoqCisgKiBDbGFzcyB0byByZXByZXNlbnQgYSBmaWVsZCBpbiBhIHRocmlmdCBzdHJ1Y3R1cmUuIEEgZmllbGQgaGFzIGEgZGF0YSB0eXBlLAorICogYSBzeW1ib2xpYyBuYW1lLCBhbmQgYSBudW1lcmljIGlkZW50aWZpZXIuCisgKgorICovCitjbGFzcyB0X2ZpZWxkIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUpCisgICAgOiB0eXBlXyh0eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAga2V5XygwKSwKKyAgICAgIHZhbHVlXyhOVUxMKSwKKyAgICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAorICAgICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCisgICAgICB4c2RfYXR0cnNfKE5VTEwpLAorICAgICAgcmVmZXJlbmNlXyhmYWxzZSkge30KKworICB0X2ZpZWxkKHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgaW50MzJfdCBrZXkpCisgICAgOiB0eXBlXyh0eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAga2V5XyhrZXkpLAorICAgICAgcmVxXyhUX09QVF9JTl9SRVFfT1VUKSwKKyAgICAgIHZhbHVlXyhOVUxMKSwKKyAgICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAorICAgICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCisgICAgICB4c2RfYXR0cnNfKE5VTEwpLAorICAgICAgcmVmZXJlbmNlXyhmYWxzZSkge30KKworICB+dF9maWVsZCgpIHt9CisKKyAgdF90eXBlKiBnZXRfdHlwZSgpIHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgY29uc3QgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICBpbnQzMl90IGdldF9rZXkoKSBjb25zdCB7IHJldHVybiBrZXlfOyB9CisKKyAgZW51bSBlX3JlcSB7IFRfUkVRVUlSRUQsIFRfT1BUSU9OQUwsIFRfT1BUX0lOX1JFUV9PVVQgfTsKKworICB2b2lkIHNldF9yZXEoZV9yZXEgcmVxKSB7IHJlcV8gPSByZXE7IH0KKworICBlX3JlcSBnZXRfcmVxKCkgY29uc3QgeyByZXR1cm4gcmVxXzsgfQorCisgIHZvaWQgc2V0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7IHZhbHVlXyA9IHZhbHVlOyB9CisKKyAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgeyByZXR1cm4gdmFsdWVfOyB9CisKKyAgY29uc3QgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyAgdm9pZCBzZXRfeHNkX29wdGlvbmFsKGJvb2wgeHNkX29wdGlvbmFsKSB7IHhzZF9vcHRpb25hbF8gPSB4c2Rfb3B0aW9uYWw7IH0KKworICBib29sIGdldF94c2Rfb3B0aW9uYWwoKSBjb25zdCB7IHJldHVybiB4c2Rfb3B0aW9uYWxfOyB9CisKKyAgdm9pZCBzZXRfeHNkX25pbGxhYmxlKGJvb2wgeHNkX25pbGxhYmxlKSB7IHhzZF9uaWxsYWJsZV8gPSB4c2RfbmlsbGFibGU7IH0KKworICBib29sIGdldF94c2RfbmlsbGFibGUoKSBjb25zdCB7IHJldHVybiB4c2RfbmlsbGFibGVfOyB9CisKKyAgdm9pZCBzZXRfeHNkX2F0dHJzKHRfc3RydWN0KiB4c2RfYXR0cnMpIHsgeHNkX2F0dHJzXyA9IHhzZF9hdHRyczsgfQorCisgIHRfc3RydWN0KiBnZXRfeHNkX2F0dHJzKCkgeyByZXR1cm4geHNkX2F0dHJzXzsgfQorCisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCisgICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KKyAgICogVGhlIGFyZ3VtZW50cyBhcmUgKGNvbnN0KSByZWZlcmVuY2VzIHRvIGNvbnN0IHBvaW50ZXJzIHRvIGNvbnN0IHRfZmllbGRzLgorICAgKi8KKyAgc3RydWN0IGtleV9jb21wYXJlIHsKKyAgICBib29sIG9wZXJhdG9yKCkodF9maWVsZCBjb25zdCogY29uc3QmIGEsIHRfZmllbGQgY29uc3QqIGNvbnN0JiBiKSB7CisgICAgICByZXR1cm4gYS0+Z2V0X2tleSgpIDwgYi0+Z2V0X2tleSgpOworICAgIH0KKyAgfTsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworICBib29sIGdldF9yZWZlcmVuY2UoKSB7IHJldHVybiByZWZlcmVuY2VfOyB9CisKKyAgdm9pZCBzZXRfcmVmZXJlbmNlKGJvb2wgcmVmZXJlbmNlKSB7IHJlZmVyZW5jZV8gPSByZWZlcmVuY2U7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiB0eXBlXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIGludDMyX3Qga2V5XzsKKyAgZV9yZXEgcmVxXzsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWVfOworCisgIGJvb2wgeHNkX29wdGlvbmFsXzsKKyAgYm9vbCB4c2RfbmlsbGFibGVfOworICB0X3N0cnVjdCogeHNkX2F0dHJzXzsKKyAgYm9vbCByZWZlcmVuY2VfOworfTsKKworLyoqCisgKiBBIHNpbXBsZSBzdHJ1Y3QgZm9yIHRoZSBwYXJzZXIgdG8gdXNlIHRvIHN0b3JlIGEgZmllbGQgSUQsIGFuZCB3aGV0aGVyIG9yCisgKiBub3QgaXQgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciBvciBhdXRvbWF0aWNhbGx5IGNob3Nlbi4KKyAqLworc3RydWN0IHRfZmllbGRfaWQgeworICBpbnQzMl90IHZhbHVlOworICBib29sIGF1dG9fYXNzaWduZWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQyNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0ZVTkNUSU9OX0gKKyNkZWZpbmUgVF9GVU5DVElPTl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3N0cnVjdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgZnVuY3Rpb24uIEtleSBwYXJ0cyBhcmUgcmV0dXJuIHR5cGUsIGZ1bmN0aW9uIG5hbWUsCisgKiBvcHRpb25hbCBtb2RpZmllcnMsIGFuZCBhbiBhcmd1bWVudCBsaXN0LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBhcyBhIHRocmlmdAorICogc3RydWN0LgorICoKKyAqLworY2xhc3MgdF9mdW5jdGlvbiA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X3N0cnVjdCogYXJnbGlzdCwgYm9vbCBvbmV3YXkgPSBmYWxzZSkKKyAgICA6IHJldHVybnR5cGVfKHJldHVybnR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBhcmdsaXN0XyhhcmdsaXN0KSwKKyAgICAgIHhjZXB0aW9uc18obmV3IHRfc3RydWN0KE5VTEwpKSwKKyAgICAgIG93bl94Y2VwdGlvbnNfKHRydWUpLAorICAgICAgb25ld2F5XyhvbmV3YXkpIHsKKyAgICBpZiAob25ld2F5XyAmJiAoIXJldHVybnR5cGVfLT5pc192b2lkKCkpKSB7CisgICAgICBwd2FybmluZygxLCAiT25ld2F5IG1ldGhvZHMgc2hvdWxkIHJldHVybiB2b2lkLlxuIik7CisgICAgfQorICB9CisKKyAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsCisgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICB0X3N0cnVjdCogYXJnbGlzdCwKKyAgICAgICAgICAgICB0X3N0cnVjdCogeGNlcHRpb25zLAorICAgICAgICAgICAgIGJvb2wgb25ld2F5ID0gZmFsc2UpCisgICAgOiByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAgYXJnbGlzdF8oYXJnbGlzdCksCisgICAgICB4Y2VwdGlvbnNfKHhjZXB0aW9ucyksCisgICAgICBvd25feGNlcHRpb25zXyhmYWxzZSksCisgICAgICBvbmV3YXlfKG9uZXdheSkgeworICAgIGlmIChvbmV3YXlfICYmICF4Y2VwdGlvbnNfLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICAgIHRocm93IHN0ZDo6c3RyaW5nKCJPbmV3YXkgbWV0aG9kcyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLiIpOworICAgIH0KKyAgICBpZiAob25ld2F5XyAmJiAoIXJldHVybnR5cGVfLT5pc192b2lkKCkpKSB7CisgICAgICBwd2FybmluZygxLCAiT25ld2F5IG1ldGhvZHMgc2hvdWxkIHJldHVybiB2b2lkLlxuIik7CisgICAgfQorICB9CisKKyAgfnRfZnVuY3Rpb24oKSB7CisgICAgaWYgKG93bl94Y2VwdGlvbnNfKQorICAgICAgZGVsZXRlIHhjZXB0aW9uc187CisgIH0KKworICB0X3R5cGUqIGdldF9yZXR1cm50eXBlKCkgY29uc3QgeyByZXR1cm4gcmV0dXJudHlwZV87IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIHRfc3RydWN0KiBnZXRfYXJnbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGFyZ2xpc3RfOyB9CisKKyAgdF9zdHJ1Y3QqIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9CisKKyAgYm9vbCBpc19vbmV3YXkoKSBjb25zdCB7IHJldHVybiBvbmV3YXlfOyB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKK3ByaXZhdGU6CisgIHRfdHlwZSogcmV0dXJudHlwZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICB0X3N0cnVjdCogYXJnbGlzdF87CisgIHRfc3RydWN0KiB4Y2VwdGlvbnNfOworICBib29sIG93bl94Y2VwdGlvbnNfOworICBib29sIG9uZXdheV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmNjg2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0xJU1RfSAorI2RlZmluZSBUX0xJU1RfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisKKy8qKgorICogQSBsaXN0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgorICoKKyAqLworY2xhc3MgdF9saXN0IDogcHVibGljIHRfY29udGFpbmVyIHsKK3B1YmxpYzoKKyAgdF9saXN0KHRfdHlwZSogZWxlbV90eXBlKSA6IGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQorCisgIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGVsZW1fdHlwZV87IH0KKworICBib29sIGlzX2xpc3QoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogZWxlbV90eXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzZjA4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTUFQX0gKKyNkZWZpbmUgVF9NQVBfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisKKy8qKgorICogQSBtYXAgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciB0d28gZGF0YQorICogdHlwZXMuCisgKgorICovCitjbGFzcyB0X21hcCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7CitwdWJsaWM6CisgIHRfbWFwKHRfdHlwZSoga2V5X3R5cGUsIHRfdHlwZSogdmFsX3R5cGUpIDoga2V5X3R5cGVfKGtleV90eXBlKSwgdmFsX3R5cGVfKHZhbF90eXBlKSB7fQorCisgIHRfdHlwZSogZ2V0X2tleV90eXBlKCkgY29uc3QgeyByZXR1cm4ga2V5X3R5cGVfOyB9CisKKyAgdF90eXBlKiBnZXRfdmFsX3R5cGUoKSBjb25zdCB7IHJldHVybiB2YWxfdHlwZV87IH0KKworICBib29sIGlzX21hcCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiBrZXlfdHlwZV87CisgIHRfdHlwZSogdmFsX3R5cGVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZGQ0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaApAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUFJPR1JBTV9ICisjZGVmaW5lIFRfUFJPR1JBTV9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gRm9yIHByb2dyYW1fbmFtZSgpCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2VudW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3N0cnVjdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NlcnZpY2UuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9saXN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbWFwLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2V0LmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCisvLyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworLyoqCisgKiBUb3AgbGV2ZWwgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudGlyZSB0aHJpZnQgcHJvZ3JhbS4gQSBwcm9ncmFtIGNvbnNpc3RzCisgKiBmdW5kYW1lbnRhbGx5IG9mIHRoZSBmb2xsb3dpbmc6CisgKgorICogICBUeXBlZGVmcworICogICBFbnVtZXJhdGlvbnMKKyAqICAgQ29uc3RhbnRzCisgKiAgIFN0cnVjdHMKKyAqICAgRXhjZXB0aW9ucworICogICBTZXJ2aWNlcworICoKKyAqIFRoZSBwcm9ncmFtIG1vZHVsZSBhbHNvIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYmFzZSB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfcHJvZ3JhbSA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBuYW1lKQorICAgIDogcGF0aF8ocGF0aCksIG5hbWVfKG5hbWUpLCBvdXRfcGF0aF8oIi4vIiksIG91dF9wYXRoX2lzX2Fic29sdXRlXyhmYWxzZSksIHNjb3BlXyhuZXcgdF9zY29wZSkge30KKworICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCkgOiBwYXRoXyhwYXRoKSwgb3V0X3BhdGhfKCIuLyIpLCBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpIHsKKyAgICBuYW1lXyA9IHByb2dyYW1fbmFtZShwYXRoKTsKKyAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOworICB9CisKKyAgfnRfcHJvZ3JhbSgpIHsKKyAgICBpZiAoc2NvcGVfKSB7CisgICAgICBkZWxldGUgc2NvcGVfOworICAgICAgc2NvcGVfID0gTlVMTDsKKyAgICB9CisgIH0KKworICAvLyBQYXRoIGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9CisKKyAgLy8gT3V0cHV0IHBhdGggYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9vdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoXzsgfQorCisgIC8vIENyZWF0ZSBnZW4tKiBkaXIgYWNjZXNzb3IKKyAgYm9vbCBpc19vdXRfcGF0aF9hYnNvbHV0ZSgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoX2lzX2Fic29sdXRlXzsgfQorCisgIC8vIE5hbWUgYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICAvLyBOYW1lc3BhY2UKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VfOyB9CisKKyAgLy8gSW5jbHVkZSBwcmVmaXggYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9pbmNsdWRlX3ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVfcHJlZml4XzsgfQorCisgIC8vIEFjY2Vzc29ycyBmb3IgcHJvZ3JhbSBlbGVtZW50cworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiYgZ2V0X3R5cGVkZWZzKCkgY29uc3QgeyByZXR1cm4gdHlwZWRlZnNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBnZXRfZW51bXMoKSBjb25zdCB7IHJldHVybiBlbnVtc187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBnZXRfY29uc3RzKCkgY29uc3QgeyByZXR1cm4gY29uc3RzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfc3RydWN0cygpIGNvbnN0IHsgcmV0dXJuIHN0cnVjdHNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF9vYmplY3RzKCkgY29uc3QgeyByZXR1cm4gb2JqZWN0c187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIGdldF9zZXJ2aWNlcygpIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzXzsgfQorICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfbmFtZXNwYWNlcygpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZXNfOyB9CisKKyAgLy8gUHJvZ3JhbSBlbGVtZW50cworICB2b2lkIGFkZF90eXBlZGVmKHRfdHlwZWRlZiogdGQpIHsgdHlwZWRlZnNfLnB1c2hfYmFjayh0ZCk7IH0KKyAgdm9pZCBhZGRfZW51bSh0X2VudW0qIHRlKSB7IGVudW1zXy5wdXNoX2JhY2sodGUpOyB9CisgIHZvaWQgYWRkX2NvbnN0KHRfY29uc3QqIHRjKSB7IGNvbnN0c18ucHVzaF9iYWNrKHRjKTsgfQorICB2b2lkIGFkZF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzKSB7CisgICAgb2JqZWN0c18ucHVzaF9iYWNrKHRzKTsKKyAgICBzdHJ1Y3RzXy5wdXNoX2JhY2sodHMpOworICB9CisgIHZvaWQgYWRkX3hjZXB0aW9uKHRfc3RydWN0KiB0eCkgeworICAgIG9iamVjdHNfLnB1c2hfYmFjayh0eCk7CisgICAgeGNlcHRpb25zXy5wdXNoX2JhY2sodHgpOworICB9CisgIHZvaWQgYWRkX3NlcnZpY2UodF9zZXJ2aWNlKiB0cykgeyBzZXJ2aWNlc18ucHVzaF9iYWNrKHRzKTsgfQorCisgIC8vIFByb2dyYW1zIHRvIGluY2x1ZGUKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGdldF9pbmNsdWRlcygpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVzXzsgfQorCisgIHZvaWQgc2V0X291dF9wYXRoKHN0ZDo6c3RyaW5nIG91dF9wYXRoLCBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlKSB7CisgICAgb3V0X3BhdGhfID0gb3V0X3BhdGg7CisgICAgb3V0X3BhdGhfaXNfYWJzb2x1dGVfID0gb3V0X3BhdGhfaXNfYWJzb2x1dGU7CisgICAgLy8gRW5zdXJlIHRoYXQgaXQgZW5kcyB3aXRoIGEgdHJhaWxpbmcgJy8nIChvciAnXCcgZm9yIHdpbmRvd3MgbWFjaGluZXMpCisgICAgY2hhciBjID0gb3V0X3BhdGhfLmF0KG91dF9wYXRoXy5zaXplKCkgLSAxKTsKKyAgICBpZiAoIShjID09ICcvJyB8fCBjID09ICdcXCcpKSB7CisgICAgICBvdXRfcGF0aF8ucHVzaF9iYWNrKCcvJyk7CisgICAgfQorICB9CisKKyAgLy8gVHlwZW5hbWUgY29sbGlzaW9uIGRldGVjdGlvbgorICAvKioKKyAgICogU2VhcmNoIGZvciB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIHRvIHRlc3QgZm9yIGNvbGxpc2lvbnMKKyAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBhIGNlcnRhaW4gY29sbGlzaW9uIHdhcyBmb3VuZCwgb3RoZXJ3aXNlIGZhbHNlCisgICAqLworICBib29sIGlzX3VuaXF1ZV90eXBlbmFtZSh0X3R5cGUqIHQpIHsKKyAgICBpbnQgb2NjdXJyZW5jZXMgPSBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KHRoaXMsIHQpOworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ID0gaW5jbHVkZXNfLmJlZ2luKCk7IGl0ICE9IGluY2x1ZGVzXy5lbmQoKTsgKytpdCkgeworICAgICAgb2NjdXJyZW5jZXMgKz0gcHJvZ3JhbV90eXBlbmFtZV9jb3VudCgqaXQsIHQpOworICAgIH0KKyAgICByZXR1cm4gMCA9PSBvY2N1cnJlbmNlczsKKyAgfQorCisgIC8qKgorICAgKiBTZWFyY2ggYWxsIHR5cGUgY29sbGVjdGlvbnMgZm9yIGR1cGxpY2F0ZSB0eXBlbmFtZXMKKyAgICogQHBhcmFtIHByb2cgdGhlIHByb2dyYW0gdG8gc2VhcmNoCisgICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIHRvIHRlc3QgZm9yIGNvbGxpc2lvbnMKKyAgICogQHJldHVybiAgICAgdGhlIG51bWJlciBvZiBjZXJ0YWluIHR5cGVuYW1lIGNvbGxpc2lvbnMKKyAgICovCisgIGludCBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KHRfcHJvZ3JhbSogcHJvZywgdF90eXBlKiB0KSB7CisgICAgaW50IG9jY3VycmVuY2VzID0gMDsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPnR5cGVkZWZzXywgdCk7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5lbnVtc18sIHQpOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+b2JqZWN0c18sIHQpOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+c2VydmljZXNfLCB0KTsKKyAgICByZXR1cm4gb2NjdXJyZW5jZXM7CisgIH0KKworICAvKioKKyAgICogU2VhcmNoIGEgdHlwZSBjb2xsZWN0aW9uIGZvciBkdXBsaWNhdGUgdHlwZW5hbWVzCisgICAqIEBwYXJhbSBwcm9nICAgICAgICAgICAgdGhlIHByb2dyYW0gdG8gc2VhcmNoCisgICAqIEBwYXJhbSB0eXBlX2NvbGxlY3Rpb24gdGhlIHR5cGUgY29sbGVjdGlvbiB0byBzZWFyY2gKKyAgICogQHBhcmFtIHQgICAgICAgICAgICAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjZXJ0YWluIHR5cGVuYW1lIGNvbGxpc2lvbnMKKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICBpbnQgY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudCh0X3Byb2dyYW0qIHByb2csIFQgdHlwZV9jb2xsZWN0aW9uLCB0X3R5cGUqIHQpIHsKKyAgICBpbnQgb2NjdXJyZW5jZXMgPSAwOworICAgIGZvciAodHlwZW5hbWUgVDo6aXRlcmF0b3IgaXQgPSB0eXBlX2NvbGxlY3Rpb24uYmVnaW4oKTsgaXQgIT0gdHlwZV9jb2xsZWN0aW9uLmVuZCgpOyArK2l0KQorICAgICAgaWYgKHQgIT0gKml0ICYmIDAgPT0gdC0+Z2V0X25hbWUoKS5jb21wYXJlKCgqaXQpLT5nZXRfbmFtZSgpKSAmJiBpc19jb21tb25fbmFtZXNwYWNlKHByb2csIHQpKQorICAgICAgICArK29jY3VycmVuY2VzOworICAgIHJldHVybiBvY2N1cnJlbmNlczsKKyAgfQorCisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciBpZGVudGljYWwgdHlwZW5hbWVzIHdpbGwgY29sbGlkZSBiYXNlZCBvbiBuYW1lc3BhY2VzLgorICAgKgorICAgKiBCZWNhdXNlIHdlIGRvIG5vdCBrbm93IHdoaWNoIGxhbmd1YWdlcyB0aGUgdXNlciB3aWxsIGdlbmVyYXRlIGNvZGUgZm9yLAorICAgKiBjb2xsaXNpb25zIHdpdGhpbiBwcm9ncmFtcyAoSURMIGZpbGVzKSBoYXZpbmcgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBjYW4gYmUKKyAgICogZGlmZmljdWx0IHRvIGRldGVybWluZS4gT25seSBndWFyYW50ZWVkIGNvbGxpc2lvbnMgcmV0dXJuIHRydWUgKGNhdXNlIGFuIGVycm9yKS4KKyAgICogUG9zc2libGUgY29sbGlzaW9ucyBpbnZvbHZpbmcgZXhwbGljaXQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBwcm9kdWNlIGEgd2FybmluZy4KKyAgICogT3RoZXIgcG9zc2libGUgY29sbGlzaW9ucyBnbyB1bnJlcG9ydGVkLgorICAgKiBAcGFyYW0gcHJvZyB0aGUgcHJvZ3JhbSBjb250YWluaW5nIHRoZSBwcmVleGlzdGluZyB0eXBlbmFtZQorICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSBjb250YWluaW5nIHRoZSB0eXBlbmFtZSBtYXRjaAorICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGEgY29sbGlzaW9uIHdpdGhpbiBuYW1lc3BhY2VzIGlzIGZvdW5kLCBvdGhlcndpc2UgZmFsc2UKKyAgICovCisgIGJvb2wgaXNfY29tbW9uX25hbWVzcGFjZSh0X3Byb2dyYW0qIHByb2csIHRfdHlwZSogdCkgeworICAgIC8vIENhc2UgMTogVHlwZW5hbWVzIGFyZSBpbiB0aGUgc2FtZSBwcm9ncmFtIFtjb2xsaXNpb25dCisgICAgaWYgKHByb2cgPT0gdC0+Z2V0X3Byb2dyYW0oKSkgeworICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMiLAorICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIENhc2UgMjogQm90aCBwcm9ncmFtcyBoYXZlIGlkZW50aWNhbCBuYW1lc3BhY2Ugc2NvcGUvbmFtZSBkZWNsYXJhdGlvbnMgW2NvbGxpc2lvbl0KKyAgICBib29sIG1hdGNoID0gdHJ1ZTsKKyAgICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gcHJvZy0+bmFtZXNwYWNlc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHByb2ctPm5hbWVzcGFjZXNfLmVuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgaWYgKDAgPT0gaXQtPnNlY29uZC5jb21wYXJlKHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoaXQtPmZpcnN0KSkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcywlcywlcyBhbmQgJXMsJXMsJXMgW2ZpbGUsc2NvcGUsbnNdIiwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLmVuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgaWYgKDAgPT0gaXQtPnNlY29uZC5jb21wYXJlKHByb2ctPmdldF9uYW1lc3BhY2UoaXQtPmZpcnN0KSkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcywlcywlcyBhbmQgJXMsJXMsJXMgW2ZpbGUsc2NvcGUsbnNdIiwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoMCA9PSBwcm9nLT5uYW1lc3BhY2VzXy5zaXplKCkgJiYgMCA9PSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5zaXplKCkpIHsKKyAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzIGFuZCAlcyIsCisgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gbWF0Y2g7CisgIH0KKworICAvLyBTY29waW5nIGFuZCBuYW1lc3BhY2luZworICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbmFtZSkgeyBuYW1lc3BhY2VfID0gbmFtZTsgfQorCisgIC8vIFNjb3BlIGFjY2Vzc29yCisgIHRfc2NvcGUqIHNjb3BlKCkgY29uc3QgeyByZXR1cm4gc2NvcGVfOyB9CisKKyAgLy8gSW5jbHVkZXMKKworICB2b2lkIGFkZF9pbmNsdWRlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGluY2x1ZGVzXy5wdXNoX2JhY2socHJvZ3JhbSk7CisgIH0KKworICB2b2lkIGFkZF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIGluY2x1ZGVfc2l0ZSkgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCk7CisKKyAgICAvLyBpbmNsdWRlIHByZWZpeCBmb3IgdGhpcyBwcm9ncmFtIGlzIHRoZSBzaXRlIGF0IHdoaWNoIGl0IHdhcyBpbmNsdWRlZAorICAgIC8vIChtaW51cyB0aGUgZmlsZW5hbWUpCisgICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXg7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9zaXRlLnJmaW5kKCIvIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBpbmNsdWRlX3ByZWZpeCA9IGluY2x1ZGVfc2l0ZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7CisgICAgfQorCisgICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKKyAgICBpbmNsdWRlc18ucHVzaF9iYWNrKHByb2dyYW0pOworICB9CisKKyAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGdldF9pbmNsdWRlcygpIHsgcmV0dXJuIGluY2x1ZGVzXzsgfQorCisgIHZvaWQgc2V0X2luY2x1ZGVfcHJlZml4KHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4KSB7CisgICAgaW5jbHVkZV9wcmVmaXhfID0gaW5jbHVkZV9wcmVmaXg7CisKKyAgICAvLyB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGEgZGlyZWN0b3J5OyBhZGQgYSB0cmFpbGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxlbiA9IGluY2x1ZGVfcHJlZml4Xy5zaXplKCk7CisgICAgaWYgKGxlbiA+IDAgJiYgaW5jbHVkZV9wcmVmaXhfW2xlbiAtIDFdICE9ICcvJykgeworICAgICAgaW5jbHVkZV9wcmVmaXhfICs9ICcvJzsKKyAgICB9CisgIH0KKworICAvLyBMYW5ndWFnZSBuZXV0cmFsIG5hbWVzcGFjZSAvIHBhY2thZ2luZworICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UsIHN0ZDo6c3RyaW5nIG5hbWVfc3BhY2UpIHsKKyAgICBpZiAobGFuZ3VhZ2UgIT0gIioiKSB7CisgICAgICBzaXplX3Qgc3ViX2luZGV4ID0gbGFuZ3VhZ2UuZmluZCgnLicpOworICAgICAgc3RkOjpzdHJpbmcgYmFzZV9sYW5ndWFnZSA9IGxhbmd1YWdlLnN1YnN0cigwLCBzdWJfaW5kZXgpOworICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZTsKKworICAgICAgaWYgKGJhc2VfbGFuZ3VhZ2UgPT0gInNtYWxsdGFsayIpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIk5hbWVzcGFjZSAnc21hbGx0YWxrJyBpcyBkZXByZWNhdGVkLiBVc2UgJ3N0JyBpbnN0ZWFkIik7CisgICAgICAgIGJhc2VfbGFuZ3VhZ2UgPSAic3QiOworICAgICAgfQorCisgICAgICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90IG15X2NvcHkgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKTsKKworICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXQ7CisgICAgICBpdCA9IG15X2NvcHkuZmluZChiYXNlX2xhbmd1YWdlKTsKKworICAgICAgaWYgKGl0ID09IG15X2NvcHkuZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgd2FybmluZyA9ICJObyBnZW5lcmF0b3IgbmFtZWQgJyIgKyBiYXNlX2xhbmd1YWdlICsgIicgY291bGQgYmUgZm91bmQhIjsKKyAgICAgICAgcHdhcm5pbmcoMSwgd2FybmluZy5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdWJfaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBzdWJfbmFtZXNwYWNlID0gbGFuZ3VhZ2Uuc3Vic3RyKHN1Yl9pbmRleCArIDEpOworICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB3YXJuaW5nID0gYmFzZV9sYW5ndWFnZSArICIgZ2VuZXJhdG9yIGRvZXMgbm90IGFjY2VwdCAnIiArIHN1Yl9uYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGFzIHN1Yi1uYW1lc3BhY2UhIjsKKyAgICAgICAgICAgIHB3YXJuaW5nKDEsIHdhcm5pbmcuY19zdHIoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgbmFtZXNwYWNlc19bbGFuZ3VhZ2VdID0gbmFtZV9zcGFjZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UpIGNvbnN0IHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICAgIGlmICgoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQobGFuZ3VhZ2UpKSAhPSBuYW1lc3BhY2VzXy5lbmQoKQorICAgICAgICB8fCAoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQoIioiKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkpIHsKKyAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICB9CisKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZ2V0X2FsbF9uYW1lc3BhY2VzKCl7CisgICAgIHJldHVybiBuYW1lc3BhY2VzXzsKKyAgfQorCisgIHZvaWQgc2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucyhzdGQ6OnN0cmluZyBsYW5ndWFnZSwgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9ucykgeworICAgIG5hbWVzcGFjZV9hbm5vdGF0aW9uc19bbGFuZ3VhZ2VdID0gYW5ub3RhdGlvbnM7CisgIH0KKworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKHN0ZDo6c3RyaW5nIGxhbmd1YWdlKSB7CisgICAgcmV0dXJuIG5hbWVzcGFjZV9hbm5vdGF0aW9uc19bbGFuZ3VhZ2VdOworICB9CisKKyAgLy8gTGFuZ3VhZ2Ugc3BlY2lmaWMgbmFtZXNwYWNlIC8gcGFja2FnaW5nCisKKyAgdm9pZCBhZGRfY3BwX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCkgeyBjcHBfaW5jbHVkZXNfLnB1c2hfYmFjayhwYXRoKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X2NwcF9pbmNsdWRlcygpIHsgcmV0dXJuIGNwcF9pbmNsdWRlc187IH0KKworICB2b2lkIGFkZF9jX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCkgeyBjX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jX2luY2x1ZGVzKCkgeyByZXR1cm4gY19pbmNsdWRlc187IH0KKworcHJpdmF0ZToKKyAgLy8gRmlsZSBwYXRoCisgIHN0ZDo6c3RyaW5nIHBhdGhfOworCisgIC8vIE5hbWUKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisKKyAgLy8gT3V0cHV0IGRpcmVjdG9yeQorICBzdGQ6OnN0cmluZyBvdXRfcGF0aF87CisKKyAgLy8gT3V0cHV0IGRpcmVjdG9yeSBpcyBhYnNvbHV0ZSBsb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIHNvdXJjZSAobm8gZ2VuLSopCisgIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGVfOworCisgIC8vIE5hbWVzcGFjZQorICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfOworCisgIC8vIEluY2x1ZGVkIHByb2dyYW1zCisgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzXzsKKworICAvLyBJbmNsdWRlIHByZWZpeCBmb3IgdGhpcyBwcm9ncmFtLCBpZiBhbnkKKyAgc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXhfOworCisgIC8vIElkZW50aWZpZXIgbG9va3VwIHNjb3BlCisgIHRfc2NvcGUqIHNjb3BlXzsKKworICAvLyBDb21wb25lbnRzIHRvIGdlbmVyYXRlIGNvZGUgZm9yCisgIHN0ZDo6dmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzXzsKKyAgc3RkOjp2ZWN0b3I8dF9lbnVtKj4gZW51bXNfOworICBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzXzsKKyAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiBzdHJ1Y3RzXzsKKyAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiB4Y2VwdGlvbnNfOworICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlc187CisKKyAgLy8gRHluYW1pYyBuYW1lc3BhY2VzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbmFtZXNwYWNlc187CisKKyAgLy8gQW5ub3RhdGlvbnMgZm9yIGR5bmFtaWMgbmFtZXNwYWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiA+IG5hbWVzcGFjZV9hbm5vdGF0aW9uc187CisKKyAgLy8gQysrIGV4dHJhIGluY2x1ZGVzCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjcHBfaW5jbHVkZXNfOworCisgIC8vIEMgZXh0cmEgaW5jbHVkZXMKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNfaW5jbHVkZXNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxNjBhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfU0NPUEVfSAorI2RlZmluZSBUX1NDT1BFX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X21hcC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2xpc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zZXQuaCIKKworbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgewordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgordm9pZCBjb252ZXJ0KEZyb20qLCBUbyYpOworfQorCisvKioKKyAqIFRoaXMgcmVwcmVzZW50cyBhIHZhcmlhYmxlIHNjb3BlIHVzZWQgZm9yIGxvb2tpbmcgdXAgcHJlZGVmaW5lZCB0eXBlcyBhbmQKKyAqIHNlcnZpY2VzLiBUeXBpY2FsbHksIGEgc2NvcGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdF9wcm9ncmFtLiBTY29wZXMgYXJlIG5vdAorICogdXNlZCB0byBkZXRlcm1pbmUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmF0aGVyIHRvIHJlc29sdmUgaWRlbnRpZmllcnMgYXQKKyAqIHBhcnNlIHRpbWUuCisgKgorICovCitjbGFzcyB0X3Njb3BlIHsKK3B1YmxpYzoKKyAgdF9zY29wZSgpIHt9CisKKyAgdm9pZCBhZGRfdHlwZShzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUpIHsgdHlwZXNfW25hbWVdID0gdHlwZTsgfQorCisgIHRfdHlwZSogZ2V0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gdHlwZXNfW25hbWVdOyB9CisKKyAgdm9pZCBhZGRfc2VydmljZShzdGQ6OnN0cmluZyBuYW1lLCB0X3NlcnZpY2UqIHNlcnZpY2UpIHsgc2VydmljZXNfW25hbWVdID0gc2VydmljZTsgfQorCisgIHRfc2VydmljZSogZ2V0X3NlcnZpY2Uoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gc2VydmljZXNfW25hbWVdOyB9CisKKyAgdm9pZCBhZGRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdCogY29uc3RhbnQpIHsKKyAgICBpZiAoY29uc3RhbnRzXy5maW5kKG5hbWUpICE9IGNvbnN0YW50c18uZW5kKCkpIHsKKyAgICAgIHRocm93ICJFbnVtICIgKyBuYW1lICsgIiBpcyBhbHJlYWR5IGRlZmluZWQhIjsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3RhbnRzX1tuYW1lXSA9IGNvbnN0YW50OworICAgIH0KKyAgfQorCisgIHRfY29uc3QqIGdldF9jb25zdGFudChzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiBjb25zdGFudHNfW25hbWVdOyB9CisKKyAgdm9pZCBwcmludCgpIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj46Oml0ZXJhdG9yIGl0ZXI7CisgICAgZm9yIChpdGVyID0gdHlwZXNfLmJlZ2luKCk7IGl0ZXIgIT0gdHlwZXNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHByaW50ZigiJXMgPT4gJXNcbiIsIGl0ZXItPmZpcnN0LmNfc3RyKCksIGl0ZXItPnNlY29uZC0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlc29sdmVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogY29uc3RfdmFsLCB0X3R5cGUqIHR0eXBlKSB7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgbWFwID0gY29uc3RfdmFsLT5nZXRfbWFwKCk7CisgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+Zmlyc3QsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RfdmFsLT5nZXRfbGlzdCgpOworICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKCgqdl9pdGVyKSwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdF92YWwtPmdldF9saXN0KCk7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUoKCp2X2l0ZXIpLCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIHRfc3RydWN0KiB0c3RydWN0ID0gKHRfc3RydWN0Kil0dHlwZTsKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogZmllbGQgPSB0c3RydWN0LT5nZXRfZmllbGRfYnlfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgICAgICAgIHRocm93ICJObyBmaWVsZCBuYW1lZCBcIiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkKKyAgICAgICAgICAgICAgKyAiXCIgd2FzIGZvdW5kIGluIHN0cnVjdCBvZiB0eXBlIFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIiOworICAgICAgICB9CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5zZWNvbmQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvbnN0X3ZhbC0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7CisgICAgICBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICBjb25zdF92YWwtPnNldF9lbnVtKCh0X2VudW0qKXR0eXBlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRfY29uc3QqIGNvbnN0YW50ID0gZ2V0X2NvbnN0YW50KGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSk7CisgICAgICAgIGlmIChjb25zdGFudCA9PSBOVUxMKSB7CisgICAgICAgICAgdGhyb3cgIk5vIGVudW0gdmFsdWUgb3IgY29uc3RhbnQgZm91bmQgbmFtZWQgXCIiICsgY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpICsgIlwiISI7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIHR5cGVkZWZzIHRvIHRoZSB1bmRlcmx5aW5nIHR5cGUKKyAgICAgICAgdF90eXBlKiBjb25zdF90eXBlID0gY29uc3RhbnQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKworICAgICAgICBpZiAoY29uc3RfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKWNvbnN0X3R5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBjb25zdF92YWwtPnNldF9pbnRlZ2VyKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X3N0cmluZyhjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9zdHJpbmcoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2RvdWJsZShjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9kb3VibGUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiQ29uc3RhbnRzIGNhbm5vdCBiZSBvZiB0eXBlIFZPSUQiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19tYXAoKSkgeworICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X21hcCgpOworICAgICAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X21hcCgpOworICAgICAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgICBjb25zdF92YWwtPmFkZF9tYXAodl9pdGVyLT5maXJzdCwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2xpc3QoKTsKKyAgICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbGlzdCgqdl9pdGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIC8vIGVudW0gY29uc3RhbnQgd2l0aCBub24taWRlbnRpZmllciB2YWx1ZS4gc2V0IHRoZSBlbnVtIGFuZCBmaW5kIHRoZQorICAgICAgLy8gdmFsdWUncyBuYW1lLgorICAgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR0eXBlOworICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX3ZhbHVlID0gdGVudW0tPmdldF9jb25zdGFudF9ieV92YWx1ZShjb25zdF92YWwtPmdldF9pbnRlZ2VyKCkpOworICAgICAgaWYgKGVudW1fdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFsc3RtOworICAgICAgICB2YWxzdG0gPDwgY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpOworICAgICAgICB0aHJvdyAiQ291bGRuJ3QgZmluZCBhIG5hbWVkIHZhbHVlIGluIGVudW0gIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmb3IgdmFsdWUgIgorICAgICAgICAgICAgKyB2YWxzdG0uc3RyKCk7CisgICAgICB9CisgICAgICBjb25zdF92YWwtPnNldF9pZGVudGlmaWVyKHRlbnVtLT5nZXRfbmFtZSgpICsgIi4iICsgZW51bV92YWx1ZS0+Z2V0X25hbWUoKSk7CisgICAgICBjb25zdF92YWwtPnNldF9lbnVtKHRlbnVtKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgLy8gTWFwIG9mIG5hbWVzIHRvIHR5cGVzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3R5cGUqPiB0eXBlc187CisKKyAgLy8gTWFwIG9mIG5hbWVzIHRvIGNvbnN0YW50cworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+IGNvbnN0YW50c187CisKKyAgLy8gTWFwIG9mIG5hbWVzIHRvIHNlcnZpY2VzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3NlcnZpY2UqPiBzZXJ2aWNlc187CisKKyAgLy8gdG8gbGlzdCBtYXAgZW50cmllcworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CisgICAgZnJpZW5kIHZvaWQgcGx1Z2luX291dHB1dDo6Y29udmVydChGcm9tKiwgVG8mKTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIwNGNhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfU0VSVklDRV9ICisjZGVmaW5lIFRfU0VSVklDRV9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworY2xhc3MgdF9wcm9ncmFtOworCisvKioKKyAqIEEgc2VydmljZSBjb25zaXN0cyBvZiBhIHNldCBvZiBmdW5jdGlvbnMuCisgKgorICovCitjbGFzcyB0X3NlcnZpY2UgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF9zZXJ2aWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiB0X3R5cGUocHJvZ3JhbSksIGV4dGVuZHNfKE5VTEwpIHt9CisKKyAgYm9vbCBpc19zZXJ2aWNlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZvaWQgc2V0X2V4dGVuZHModF9zZXJ2aWNlKiBleHRlbmRzKSB7IGV4dGVuZHNfID0gZXh0ZW5kczsgfQorCisgIHZvaWQgYWRkX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIGZ1bmMpIHsKKyAgICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgICAgZm9yIChpdGVyID0gZnVuY3Rpb25zXy5iZWdpbigpOyBpdGVyICE9IGZ1bmN0aW9uc18uZW5kKCk7ICsraXRlcikgeworICAgICAgaWYgKGZ1bmMtPmdldF9uYW1lKCkgPT0gKCppdGVyKS0+Z2V0X25hbWUoKSkgeworICAgICAgICB0aHJvdyAiRnVuY3Rpb24gIiArIGZ1bmMtPmdldF9uYW1lKCkgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCI7CisgICAgICB9CisgICAgfQorICAgIGZ1bmN0aW9uc18ucHVzaF9iYWNrKGZ1bmMpOworICB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBnZXRfZnVuY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gZnVuY3Rpb25zXzsgfQorCisgIHRfc2VydmljZSogZ2V0X2V4dGVuZHMoKSB7IHJldHVybiBleHRlbmRzXzsgfQorCisgIGNvbnN0IHRfc2VydmljZSogZ2V0X2V4dGVuZHMoKSBjb25zdCB7IHJldHVybiBleHRlbmRzXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zXzsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxM2JlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfU0VUX0gKKyNkZWZpbmUgVF9TRVRfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisKKy8qKgorICogQSBzZXQgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciBkYXRhIHR5cGUuCisgKgorICovCitjbGFzcyB0X3NldCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7CitwdWJsaWM6CisgIHRfc2V0KHRfdHlwZSogZWxlbV90eXBlKSA6IGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQorCisgIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGVsZW1fdHlwZV87IH0KKworICBib29sIGlzX3NldCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiBlbGVtX3R5cGVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTAyZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfU1RSVUNUX0gKKyNkZWZpbmUgVF9TVFJVQ1RfSAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9maWVsZC5oIgorCisvLyBGb3J3YXJkIGRlY2xhcmUgdGhhdCBwdXBweQorY2xhc3MgdF9wcm9ncmFtOworCisvKioKKyAqIEEgc3RydWN0IGlzIGEgY29udGFpbmVyIGZvciBhIHNldCBvZiBtZW1iZXIgZmllbGRzIHRoYXQgaGFzIGEgbmFtZS4gU3RydWN0cworICogYXJlIGFsc28gdXNlZCB0byBpbXBsZW1lbnQgZXhjZXB0aW9uIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF9zdHJ1Y3QgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVyc190eXBlOworCisgIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSkKKyAgICA6IHRfdHlwZShwcm9ncmFtKSwKKyAgICAgIGlzX3hjZXB0aW9uXyhmYWxzZSksCisgICAgICBpc191bmlvbl8oZmFsc2UpLAorICAgICAgbWVtYmVyc192YWxpZGF0ZWQoZmFsc2UpLAorICAgICAgbWVtYmVyc193aXRoX3ZhbHVlKDApLAorICAgICAgeHNkX2FsbF8oZmFsc2UpIHt9CisKKyAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkKKyAgICA6IHRfdHlwZShwcm9ncmFtLCBuYW1lKSwKKyAgICAgIGlzX3hjZXB0aW9uXyhmYWxzZSksCisgICAgICBpc191bmlvbl8oZmFsc2UpLAorICAgICAgbWVtYmVyc192YWxpZGF0ZWQoZmFsc2UpLAorICAgICAgbWVtYmVyc193aXRoX3ZhbHVlKDApLAorICAgICAgeHNkX2FsbF8oZmFsc2UpIHt9CisKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIG5hbWVfID0gbmFtZTsKKyAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCk7CisgIH0KKworICB2b2lkIHNldF94Y2VwdGlvbihib29sIGlzX3hjZXB0aW9uKSB7IGlzX3hjZXB0aW9uXyA9IGlzX3hjZXB0aW9uOyB9CisKKyAgdm9pZCB2YWxpZGF0ZV91bmlvbl9tZW1iZXIodF9maWVsZCogZmllbGQpIHsKKyAgICBpZiAoaXNfdW5pb25fICYmICghbmFtZV8uZW1wdHkoKSkpIHsKKworICAgICAgLy8gMSkgdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzCisgICAgICAvLyAyKSB1bmlvbiBtZW1iZXJzIGFyZSBpbXBsaWNpdGx5IG9wdGlvbmFsLCBvdGhlcndpc2UgYnVncyBsaWtlIFRIUklGVC0zNjUwIHdhaXQgdG8gaGFwcGVuCisgICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIC8vIG5vIHdhcm5pbmcgb24gZGVmYXVsdCByZXF1aXJlZG5lc3MsIGJ1dCBkbyB3YXJuIG9uIGFueXRoaW5nIGVsc2UgdGhhdCBpcyBleHBsaWNpdGx5IGFza2VkIGZvcgorICAgICAgICBpZihmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgICAgICJVbmlvbiAlcyBmaWVsZCAlczogdW5pb24gbWVtYmVycyBtdXN0IGJlIG9wdGlvbmFsLCBpZ25vcmluZyBzcGVjaWZpZWQgcmVxdWlyZWRuZXNzLlxuIiwKKyAgICAgICAgICAgICAgICAgICBuYW1lXy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGZpZWxkLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgfQorCisgICAgICAvLyB1bmlvbnMgbWF5IGhhdmUgdXAgdG8gb25lIG1lbWJlciBkZWZhdWx0ZWQsIGJ1dCBub3QgbW9yZQorICAgICAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgIGlmICgxIDwgKyttZW1iZXJzX3dpdGhfdmFsdWUpIHsKKyAgICAgICAgICB0aHJvdyAiRXJyb3I6IEZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKSArICIgcHJvdmlkZXMgYW5vdGhlciBkZWZhdWx0IHZhbHVlIGZvciB1bmlvbiAiCisgICAgICAgICAgICAgICsgbmFtZV87CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKSB7CisgICAgaWYgKGlzX3VuaW9uXyAmJiAoIW5hbWVfLmVtcHR5KCkpICYmICghbWVtYmVyc192YWxpZGF0ZWQpKSB7CisgICAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgeworICAgICAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXIoKm1faXRlcik7CisgICAgICB9CisgICAgICBtZW1iZXJzX3ZhbGlkYXRlZCA9IHRydWU7CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRfdW5pb24oYm9vbCBpc191bmlvbikgeworICAgIGlzX3VuaW9uXyA9IGlzX3VuaW9uOworICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKTsKKyAgfQorCisgIHZvaWQgc2V0X3hzZF9hbGwoYm9vbCB4c2RfYWxsKSB7IHhzZF9hbGxfID0geHNkX2FsbDsgfQorCisgIGJvb2wgZ2V0X3hzZF9hbGwoKSBjb25zdCB7IHJldHVybiB4c2RfYWxsXzsgfQorCisgIGJvb2wgYXBwZW5kKHRfZmllbGQqIGVsZW0pIHsKKyAgICB0eXBlZGVmIG1lbWJlcnNfdHlwZTo6aXRlcmF0b3IgaXRlcl90eXBlOworICAgIHN0ZDo6cGFpcjxpdGVyX3R5cGUsIGl0ZXJfdHlwZT4gYm91bmRzID0gc3RkOjplcXVhbF9yYW5nZShtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZDo6a2V5X2NvbXBhcmUoKSk7CisgICAgaWYgKGJvdW5kcy5maXJzdCAhPSBib3VuZHMuc2Vjb25kKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHJldHVybnMgZmFsc2Ugd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0IG9mIGZpZWxkIG5hbWVzCisgICAgaWYgKGdldF9maWVsZF9ieV9uYW1lKGVsZW0tPmdldF9uYW1lKCkpICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtYmVyc18ucHVzaF9iYWNrKGVsZW0pOworICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmluc2VydChib3VuZHMuc2Vjb25kLCBlbGVtKTsKKyAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXIoZWxlbSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9tZW1iZXJzKCkgY29uc3QgeyByZXR1cm4gbWVtYmVyc187IH0KKworICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9zb3J0ZWRfbWVtYmVycygpIHsgcmV0dXJuIG1lbWJlcnNfaW5faWRfb3JkZXJfOyB9CisKKyAgYm9vbCBpc19zdHJ1Y3QoKSBjb25zdCB7IHJldHVybiAhaXNfeGNlcHRpb25fOyB9CisKKyAgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGlzX3hjZXB0aW9uXzsgfQorCisgIGJvb2wgaXNfdW5pb24oKSBjb25zdCB7IHJldHVybiBpc191bmlvbl87IH0KKworICB0X2ZpZWxkKiBnZXRfZmllbGRfYnlfbmFtZShzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfbmFtZSgpID09IGZpZWxkX25hbWUpIHsKKyAgICAgICAgcmV0dXJuICptX2l0ZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgY29uc3QgdF9maWVsZCogZ2V0X2ZpZWxkX2J5X25hbWUoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgY29uc3QgeworICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSA9PSBmaWVsZF9uYW1lKSB7CisgICAgICAgIHJldHVybiAqbV9pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCitwcml2YXRlOgorICBtZW1iZXJzX3R5cGUgbWVtYmVyc187CisgIG1lbWJlcnNfdHlwZSBtZW1iZXJzX2luX2lkX29yZGVyXzsKKyAgYm9vbCBpc194Y2VwdGlvbl87CisgIGJvb2wgaXNfdW5pb25fOworICBib29sIG1lbWJlcnNfdmFsaWRhdGVkOworICBpbnQgbWVtYmVyc193aXRoX3ZhbHVlOworCisgIGJvb2wgeHNkX2FsbF87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2ZDFlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9UWVBFX0gKKyNkZWZpbmUgVF9UWVBFX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworY2xhc3MgdF9wcm9ncmFtOworCisvKioKKyAqIEdlbmVyaWMgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUKKyAqIHBhcnNlciBtb2R1bGUgdG8gYnVpbGQgdXAgYSB0cmVlIG9mIG9iamVjdCB0aGF0IGFyZSBhbGwgZXhwbGljaXRseSB0eXBlZC4KKyAqIFRoZSBnZW5lcmljIHRfdHlwZSBjbGFzcyBleHBvcnRzIGEgdmFyaWV0eSBvZiB1c2VmdWwgbWV0aG9kcyB0aGF0IGFyZQorICogdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IgdG8gYnJhbmNoIGJhc2VkIHVwb24gZGlmZmVyZW50IGhhbmRsaW5nIGZvciB0aGUKKyAqIHZhcmlvdXMgdHlwZXMuCisgKgorICovCitjbGFzcyB0X3R5cGUgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB2aXJ0dWFsIH50X3R5cGUoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBuYW1lXyA9IG5hbWU7IH0KKworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgdmlydHVhbCBib29sIGlzX3ZvaWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19iaW5hcnkoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2VudW0oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc3RydWN0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3hjZXB0aW9uKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2NvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19saXN0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3NldCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19tYXAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIHsgcmV0dXJuIHByb2dyYW1fOyB9CisKKyAgY29uc3QgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIGNvbnN0IHsgcmV0dXJuIHByb2dyYW1fOyB9CisKKyAgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKCk7CisgIGNvbnN0IHRfdHlwZSogZ2V0X3RydWVfdHlwZSgpIGNvbnN0OworCisgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBicmVhayAobWF5YmUgYmFkbHkpIHVubGVzcyAwIDw9IG51bSA8PSAxNi4KKyAgc3RhdGljIGNoYXIgbnliYmxlX3RvX3hkaWdpdChpbnQgbnVtKSB7CisgICAgaWYgKG51bSA8IDEwKSB7CisgICAgICByZXR1cm4gJzAnICsgbnVtOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gJ0EnICsgbnVtIC0gMTA7CisgICAgfQorICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGJ5dGVfdG9faGV4KHVpbnQ4X3QgYnl0ZSkgeworICAgIHN0ZDo6c3RyaW5nIHJ2OworICAgIHJ2ICs9IG55YmJsZV90b194ZGlnaXQoYnl0ZSA+PiA0KTsKKyAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgJiAweDBmKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworcHJvdGVjdGVkOgorICB0X3R5cGUoKSA6IHByb2dyYW1fKE5VTEwpIHsgOyB9CisKKyAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiBwcm9ncmFtXyhwcm9ncmFtKSB7IDsgfQorCisgIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0sIHN0ZDo6c3RyaW5nIG5hbWUpIDogcHJvZ3JhbV8ocHJvZ3JhbSksIG5hbWVfKG5hbWUpIHsgOyB9CisKKyAgdF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIDogcHJvZ3JhbV8oTlVMTCksIG5hbWVfKG5hbWUpIHsgOyB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87Cit9OworCisvKioKKyAqIFBsYWNlaG9sZGVyIHN0cnVjdCBmb3IgcmV0dXJuaW5nIHRoZSBrZXkgYW5kIHZhbHVlIG9mIGFuIGFubm90YXRpb24KKyAqIGR1cmluZyBwYXJzaW5nLgorICovCitzdHJ1Y3QgdF9hbm5vdGF0aW9uIHsKKyAgc3RkOjpzdHJpbmcga2V5OworICBzdGQ6OnN0cmluZyB2YWw7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWZmZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxjc3RkaW8+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorCit0X3R5cGUqIHRfdHlwZWRlZjo6Z2V0X3R5cGUoKSBjb25zdCB7CisgIGlmICh0eXBlXyA9PSBOVUxMKSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3Byb2dyYW0oKS0+c2NvcGUoKS0+Z2V0X3R5cGUoc3ltYm9saWNfKTsKKyAgICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgICBwcmludGYoIlR5cGUgXCIlc1wiIG5vdCBkZWZpbmVkXG4iLCBzeW1ib2xpY18uY19zdHIoKSk7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gdHlwZTsKKyAgfQorICByZXR1cm4gdHlwZV87Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDNhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9UWVBFREVGX0gKKyNkZWZpbmUgVF9UWVBFREVGX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogQSB0eXBlZGVmIGlzIGEgbWFwcGluZyBmcm9tIGEgc3ltYm9saWMgbmFtZSB0byBhbm90aGVyIHR5cGUuIEluIGR5bWFuaWNhbGx5CisgKiB0eXBlZCBsYW5ndWFnZXMgKGkuZS4gcGhwL3B5dGhvbikgdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbiBhY3R1YWxseSB1c3VhbGx5CisgKiBpZ25vcmUgdHlwZWRlZnMgYW5kIGp1c3QgdXNlIHRoZSB1bmRlcmx5aW5nIHR5cGUgZGlyZWN0bHksIHRob3VnaCBpbiBDKysKKyAqIHRoZSBzeW1ib2xpYyBuYW1pbmcgY2FuIGJlIHF1aXRlIHVzZWZ1bCBmb3IgY29kZSBjbGFyaXR5LgorICoKKyAqLworY2xhc3MgdF90eXBlZGVmIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfdHlwZWRlZih0X3Byb2dyYW0qIHByb2dyYW0sIHRfdHlwZSogdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbGljKQorICAgIDogdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwgdHlwZV8odHlwZSksIHN5bWJvbGljXyhzeW1ib2xpYyksIGZvcndhcmRfKGZhbHNlKSB7fQorCisgIC8qKgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSB0eXBlIHRoYXQgaXMgbGF6aWx5CisgICAqIHJlc29sdmVkIGF0IGEgbGF0ZXIgdGltZSwgbGlrZSBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb3IKKyAgICogcmVjdXJzaXZlIHR5cGVzLgorICAgKi8KKyAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbGljLCBib29sIGZvcndhcmQpCisgICAgOiB0X3R5cGUocHJvZ3JhbSwgc3ltYm9saWMpLAorICAgICAgdHlwZV8oTlVMTCksCisgICAgICBzeW1ib2xpY18oc3ltYm9saWMpLAorICAgICAgZm9yd2FyZF8oZm9yd2FyZCkKKyAge30KKworICB+dF90eXBlZGVmKCkge30KKworICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3Q7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9zeW1ib2xpYygpIGNvbnN0IHsgcmV0dXJuIHN5bWJvbGljXzsgfQorCisgIGJvb2wgaXNfZm9yd2FyZF90eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gZm9yd2FyZF87IH0KKworICBib29sIGlzX3R5cGVkZWYoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogdHlwZV87CisgIHN0ZDo6c3RyaW5nIHN5bWJvbGljXzsKKyAgYm9vbCBmb3J3YXJkXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGxhdGZvcm0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5YWRiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIGRlZmluZSBmb3IgbWtkaXIsc2luY2UgdGhlIG1ldGhvZCBzaWduYXR1cmUKKyAqIGlzIGRpZmZlcmVudCBmb3IgdGhlIG5vbi1QT1NJWCBNaW5HVworICovCisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgInRocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxkaXJlY3QuaD4KKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjZXJybm8+CisKKy8vIGlnbm9yZSBFRVhJU1QsIHRocm93IG9uIGFueSBvdGhlciBlcnJvcgorI2lmZGVmIF9XSU4zMgorI2RlZmluZSBNS0RJUih4KSB7IGludCByID0gX21rZGlyKHgpOyBpZiAociA9PSAtMSAmJiBlcnJubyAhPSBFRVhJU1QpIHsgdGhyb3cgKHN0ZDo6c3RyaW5nKHgpICsgIjogIikgKyBzdHJlcnJvcihlcnJubyk7IH0gfQorI2Vsc2UKKyNkZWZpbmUgTUtESVIoeCkgeyBpbnQgciA9IG1rZGlyKHgsIFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTyk7IGlmIChyID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeyB0aHJvdyAoc3RkOjpzdHJpbmcoeCkgKyAiOiAiKSArIHN0cmVycm9yKGVycm5vKTsgfSB9CisjZW5kaWYKKworI2lmZGVmIFBBVEhfTUFYCisjZGVmaW5lIFRIUklGVF9QQVRIX01BWCBQQVRIX01BWAorI2Vsc2UKKyNkZWZpbmUgVEhSSUZUX1BBVEhfTUFYIE1BWF9QQVRICisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODRjZGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworaWYgV0lUSF9QTFVHSU4KK3BsdWdpbl9nZW4gPSBwbHVnaW5fdHlwZXMuaCBcCisgICAgICAgICAgICAgcGx1Z2luX3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgcGx1Z2luX2NvbnN0YW50cy5oIFwKKyAgICAgICAgICAgICBwbHVnaW5fY29uc3RhbnRzLmNwcAorCitCVUlMVF9TT1VSQ0VTID0gJChwbHVnaW5fZ2VuKQorZ2VuLnN0YW1wOiBwbHVnaW4udGhyaWZ0ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnQtYm9vdHN0cmFwCisJQCQoUk0pIC1mIGdlbi50bXAKKwlAdG91Y2ggZ2VuLnRtcAorCSQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnQtYm9vdHN0cmFwIC1nZW4gY3BwIC1vdXQgLiAkPAorCUBtdiAtZiBnZW4udG1wICRACisKKyQocGx1Z2luX2dlbik6IGdlbi5zdGFtcAorCUBpZiB0ZXN0IC1mICRAOyB0aGVuIDo7IGVsc2UgXAorCSQoUk0pIC1mIGdlbi5zdGFtcDsgXAorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGdlbi5zdGFtcDsgXAorCWZpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIHZlcnNpb24uaCB3aW5kb3dzL3ZlcnNpb24uaCAkKHBsdWdpbl9nZW4pCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0YzQzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MKQEAgLTAsMCArMSw1MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hZGFwdG9yL21hcC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWxnb3JpdGhtL2Zvcl9lYWNoLmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgiCisjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgiCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURkRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0OworCisjZGVmaW5lIFRIUklGVF9DT05WRVJUX0ZPUldBUkQoZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVuYW1lIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiBjb252ZXJ0X2ZvcndhcmQ8ZnJvbV90eXBlPihjb25zdCBmcm9tX3R5cGUmIGZyb20pCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEVfREVDTChmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBjb252ZXJ0KGNvbnN0IGZyb21fdHlwZSYgZnJvbSwgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUqIHRvKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJUX1VOQVJZX0RFQ0woZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHR5cGVuYW1lIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiBjb252ZXJ0PGZyb21fdHlwZT4oY29uc3QgZnJvbV90eXBlJiBmcm9tKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJTSU9OX0RFQ0woZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0ZPUldBUkQoZnJvbV90eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFX0RFQ0woZnJvbV90eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX1VOQVJZX0RFQ0woZnJvbV90eXBlKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJTSU9OX0RFQ0woZnJvbV90eXBlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUqIHRvID0gY29udmVydF9mb3J3YXJkKGZyb20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29udmVydChmcm9tLCB0byk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFX0RFQ0woZnJvbV90eXBlKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJTSU9OKGZyb21fdHlwZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0ZPUldBUkQoZnJvbV90eXBlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHZvaWQpZnJvbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ldyBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZShfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFKGZyb21fdHlwZSkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0RPQygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLl9faXNzZXQuZG9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8tPnNldF9kb2MoZnJvbS5kb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fQU5OT1RBVElPTlMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRIUklGVF9BU1NJR05fRE9DKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20uX19pc3NldC5hbm5vdGF0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+YW5ub3RhdGlvbnNfID0gZnJvbS5hbm5vdGF0aW9uczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0by0+c2V0X25hbWUoZnJvbS5tZXRhZGF0YS5uYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS5tZXRhZGF0YS5fX2lzc2V0LmRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLT5zZXRfZG9jKGZyb20ubWV0YWRhdGEuZG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS5tZXRhZGF0YS5fX2lzc2V0LmFubm90YXRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLT5hbm5vdGF0aW9uc18gPSBmcm9tLm1ldGFkYXRhLmFubm90YXRpb25zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworOjp0X3Byb2dyYW0qIGdfcHJvZ3JhbSA9IDA7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDLCB0eXBlbmFtZSBTPgorc3RydWN0IFR5cGVDYWNoZSB7CisgIEMqIG9wZXJhdG9yW10oY29uc3QgaW50NjRfdCYgaykgeworICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludDY0X3QsIEMqPjo6aXRlcmF0b3IgaXQgPSBjYWNoZS5maW5kKGspOworICAgIGlmIChpdCAhPSBjYWNoZS5lbmQoKSkgeworICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludDY0X3QsIFM+Ojpjb25zdF9pdGVyYXRvciBjaXQgPSBzb3VyY2UtPmZpbmQoayk7CisgICAgICBpZiAoY2l0ID09IHNvdXJjZS0+ZW5kKCkpIHsKKyAgICAgICAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlR5cGUgbm90IGZvdW5kIik7CisgICAgICB9CisgICAgICByZXR1cm4gKGNhY2hlKVtrXSA9IGNvbnZlcnRfZm9yd2FyZChjaXQtPnNlY29uZCk7CisgICAgfQorICB9CisKKyAgdm9pZCBjb21waWxlQWxsKCkgeworICAgIGJvb3N0Ojpmb3JfZWFjaCgqc291cmNlIHwgYm9vc3Q6OmFkYXB0b3JzOjptYXBfa2V5cywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZUeXBlQ2FjaGU6OmNvbXBpbGUsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICB9CisKKyAgc3RkOjptYXA8aW50NjRfdCwgUz4gY29uc3QqIHNvdXJjZTsKKworICB2b2lkIGNsZWFyKCkgeworICAgIHNvdXJjZSA9IG51bGxwdHIgOworICAgIGNhY2hlLmNsZWFyKCkgOworICB9CisKK3Byb3RlY3RlZDoKKyAgc3RkOjptYXA8aW50NjRfdCwgQyo+IGNhY2hlOworCitwcml2YXRlOgorICB2b2lkIGNvbXBpbGUoY29uc3QgaW50NjRfdCYgaykgeworICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludDY0X3QsIFM+Ojpjb25zdF9pdGVyYXRvciBjaXQgPSBzb3VyY2UtPmZpbmQoayk7CisgICAgaWYgKGNpdCA9PSBzb3VyY2UtPmVuZCgpKSB7CisgICAgICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiVHlwZSBub3QgZm91bmQgIik7CisgICAgfQorICAgIGNvbnZlcnQoY2l0LT5zZWNvbmQsICgqdGhpcylba10pOworICB9Cit9Oworc3RkOjptYXA8aW50NjRfdCwgOjp0X3Byb2dyYW0qPiBnX3Byb2dyYW1fY2FjaGU7CitUeXBlQ2FjaGU8IDo6dF90eXBlLCB0X3R5cGU+IGdfdHlwZV9jYWNoZTsKK1R5cGVDYWNoZTwgOjp0X2NvbnN0LCB0X2NvbnN0PiBnX2NvbnN0X2NhY2hlOworVHlwZUNhY2hlPCA6OnRfc2VydmljZSwgdF9zZXJ2aWNlPiBnX3NlcnZpY2VfY2FjaGU7CisKK3ZvaWQgY2xlYXJfZ2xvYmFsX2NhY2hlKCkgeworICBnX3R5cGVfY2FjaGUuY2xlYXIoKTsKKyAgZ19jb25zdF9jYWNoZS5jbGVhcigpOworICBnX3NlcnZpY2VfY2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBzZXRfZ2xvYmFsX2NhY2hlKGNvbnN0IFR5cGVSZWdpc3RyeSYgZnJvbSkgeworICBnX3R5cGVfY2FjaGUuc291cmNlID0gJmZyb20udHlwZXM7CisgIGdfY29uc3RfY2FjaGUuc291cmNlID0gJmZyb20uY29uc3RhbnRzOworICBnX3NlcnZpY2VfY2FjaGUuc291cmNlID0gJmZyb20uc2VydmljZXM7CisKKyAgZ190eXBlX2NhY2hlLmNvbXBpbGVBbGwoKTsKKyAgZ19jb25zdF9jYWNoZS5jb21waWxlQWxsKCk7CisgIGdfc2VydmljZV9jYWNoZS5jb21waWxlQWxsKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCogcmVzb2x2ZV90eXBlKGludDY0X3QgbmFtZSkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oZ190eXBlX2NhY2hlW25hbWVdKTsKK30KKworOjp0X2NvbnN0KiByZXNvbHZlX2NvbnN0KGludDY0X3QgbmFtZSkgeworICByZXR1cm4gZ19jb25zdF9jYWNoZVtuYW1lXTsKK30KKworOjp0X3NlcnZpY2UqIHJlc29sdmVfc2VydmljZShpbnQ2NF90IG5hbWUpIHsKKyAgcmV0dXJuIGdfc2VydmljZV9jYWNoZVtuYW1lXTsKK30KKworVEhSSUZUX0NPTlZFUlRfRk9SV0FSRCh0X2Jhc2VfdHlwZSkgeworI2RlZmluZSBUX0JBU0VUWVBFX0NBU0UodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIHRfYmFzZTo6VFlQRV8jI3R5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQgPSA6OnRfYmFzZV90eXBlOjpUWVBFXyMjdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisKKyAgOjp0X2Jhc2VfdHlwZTo6dF9iYXNlIHQgPSA6OnRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ7CisgIGJvb2wgaXNfYmluYXJ5ID0gZmFsc2U7CisgIHN3aXRjaCAoZnJvbS52YWx1ZSkgeworICAgIFRfQkFTRVRZUEVfQ0FTRShWT0lEKTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoU1RSSU5HKTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoQk9PTCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKEk4KTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoSTE2KTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoSTMyKTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoSTY0KTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoRE9VQkxFKTsKKyAgY2FzZSB0X2Jhc2U6OlRZUEVfQklOQVJZOgorICAgIHQgPSA6OnRfYmFzZV90eXBlOjpUWVBFX1NUUklORzsKKyAgICBpc19iaW5hcnkgPSB0cnVlOworICAgIGJyZWFrOworICB9CisgIDo6dF9iYXNlX3R5cGUqIHRvID0gbmV3IDo6dF9iYXNlX3R5cGUoZnJvbS5tZXRhZGF0YS5uYW1lLCB0KTsKKyAgdG8tPnNldF9iaW5hcnkoaXNfYmluYXJ5KTsKKyAgcmV0dXJuIHRvOworI3VuZGVmIFRfQkFTRVRZUEVfQ0FTRQorfQorVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUodF9iYXNlX3R5cGUpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfdHlwZWRlZikgeworICA6OnRfdHlwZWRlZiogdG87CisgIGlmIChmcm9tLmZvcndhcmQpIHsKKyAgICB0byA9IG5ldyA6OnRfdHlwZWRlZihnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSwgZnJvbS5zeW1ib2xpYywgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgdG8gPSBuZXcgOjp0X3R5cGVkZWYoZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS50eXBlKSwgZnJvbS5zeW1ib2xpYyk7CisgIH0KKyAgcmV0dXJuIHRvOworfQorVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUodF90eXBlZGVmKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZW51bV92YWx1ZSwgZnJvbS5uYW1lLCBmcm9tLnZhbHVlKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fQU5OT1RBVElPTlMoKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZW51bSwgZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0pIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBib29zdDo6Zm9yX2VhY2goZnJvbS5jb25zdGFudHMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKGNvbnZlcnQ8dF9lbnVtX3ZhbHVlPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9lbnVtOjphcHBlbmQsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfbGlzdCwgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS5lbGVtX3R5cGUpKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgaWYgKGZyb20uX19pc3NldC5jcHBfbmFtZSkKKyAgICB0by0+c2V0X2NwcF9uYW1lKGZyb20uY3BwX25hbWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9zZXQsIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20uZWxlbV90eXBlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGlmIChmcm9tLl9faXNzZXQuY3BwX25hbWUpCisgICAgdG8tPnNldF9jcHBfbmFtZShmcm9tLmNwcF9uYW1lKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfbWFwLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS5rZXlfdHlwZSksCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnZhbF90eXBlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGlmIChmcm9tLl9faXNzZXQuY3BwX25hbWUpCisgICAgdG8tPnNldF9jcHBfbmFtZShmcm9tLmNwcF9uYW1lKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3RfdmFsdWUsICkgeworI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0NBU0UodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZnJvbS5fX2lzc2V0LnR5cGUjI192YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0by0+c2V0XyMjdHlwZShmcm9tLnR5cGUjI192YWwpCisKKyAgYXNzZXJ0KHRvKTsKKyAgaWYgKGZyb20uX19pc3NldC5tYXBfdmFsKSB7CisgICAgdG8tPnNldF9tYXAoKTsKKyAgICBmb3IgKHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUsIHRfY29uc3RfdmFsdWU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ubWFwX3ZhbC5iZWdpbigpOworICAgICAgICAgaXQgIT0gZnJvbS5tYXBfdmFsLmVuZCgpOyBpdCsrKSB7CisgICAgICB0by0+YWRkX21hcChjb252ZXJ0KGl0LT5maXJzdCksIGNvbnZlcnQoaXQtPnNlY29uZCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChmcm9tLl9faXNzZXQubGlzdF92YWwpIHsKKyAgICB0by0+c2V0X2xpc3QoKTsKKyAgICBib29zdDo6Zm9yX2VhY2goZnJvbS5saXN0X3ZhbCB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJmNvbnZlcnQ8dF9jb25zdF92YWx1ZT4pLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9jb25zdF92YWx1ZTo6YWRkX2xpc3QsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgfSBlbHNlCisgICAgVF9DT05TVF9WQUxVRV9DQVNFKHN0cmluZyk7CisgIGVsc2UgVF9DT05TVF9WQUxVRV9DQVNFKGludGVnZXIpOworICBlbHNlIFRfQ09OU1RfVkFMVUVfQ0FTRShkb3VibGUpOworICBlbHNlIGlmIChmcm9tLl9faXNzZXQuY29uc3RfaWRlbnRpZmllcl92YWwpIHsKKyAgICB0by0+c2V0X2lkZW50aWZpZXIoZnJvbS5jb25zdF9pZGVudGlmaWVyX3ZhbC5pZGVudGlmaWVyX3ZhbCkgOworICAgIHRvLT5zZXRfZW51bShyZXNvbHZlX3R5cGU8IDo6dF9lbnVtPihmcm9tLmNvbnN0X2lkZW50aWZpZXJfdmFsLmVudW1fdmFsKSkgOworICB9CisKKyN1bmRlZiBUX0NPTlNUX1ZBTFVFX0NBU0UKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZmllbGQsIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udHlwZSksIGZyb20ubmFtZSwgZnJvbS5rZXkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9BTk5PVEFUSU9OUygpOworICB0by0+c2V0X3JlZmVyZW5jZShmcm9tLnJlZmVyZW5jZSk7CisgIHRvLT5zZXRfcmVxKHN0YXRpY19jYXN0PCA6OnRfZmllbGQ6OmVfcmVxPihmcm9tLnJlcSkpOworICBpZiAoZnJvbS5fX2lzc2V0LnZhbHVlKSB7CisgICAgdG8tPnNldF92YWx1ZShjb252ZXJ0KGZyb20udmFsdWUpKTsKKyAgfQorfQorVEhSSUZUX0NPTlZFUlNJT04odF9zdHJ1Y3QsIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgdG8tPnNldF91bmlvbihmcm9tLmlzX3VuaW9uKTsKKyAgdG8tPnNldF94Y2VwdGlvbihmcm9tLmlzX3hjZXB0aW9uKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20ubWVtYmVycyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoY29udmVydDx0X2ZpZWxkPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9zdHJ1Y3Q6OmFwcGVuZCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9jb25zdCwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udHlwZSksCisgICAgICAgICAgICAgICAgICBmcm9tLm5hbWUsCisgICAgICAgICAgICAgICAgICBjb252ZXJ0PHRfY29uc3RfdmFsdWU+KGZyb20udmFsdWUpKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fRE9DKCk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnJldHVybnR5cGUpLAorICAgICAgICAgICAgICAgICAgZnJvbS5uYW1lLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfc3RydWN0Pihmcm9tLmFyZ2xpc3QpLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfc3RydWN0Pihmcm9tLnhjZXB0aW9ucyksCisgICAgICAgICAgICAgICAgICBmcm9tLmlzX29uZXdheSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0RPQygpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3NlcnZpY2UsIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKSB7CisgIGFzc2VydCh0byk7CisgIGFzc2VydChmcm9tLm1ldGFkYXRhLnByb2dyYW1faWQpOworICBhc3NlcnQoZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uZnVuY3Rpb25zIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZChjb252ZXJ0PHRfZnVuY3Rpb24+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3NlcnZpY2U6OmFkZF9mdW5jdGlvbiwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworCisgIGlmIChmcm9tLl9faXNzZXQuZXh0ZW5kc18pCisgICAgdG8tPnNldF9leHRlbmRzKHJlc29sdmVfc2VydmljZShmcm9tLmV4dGVuZHNfKSk7Cit9CisKK1RIUklGVF9DT05WRVJUX0ZPUldBUkQodF90eXBlKSB7CisjZGVmaW5lIFRfVFlQRV9DQVNFX0ZXX1QoY2FzZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmcm9tLl9faXNzZXQuY2FzZSMjX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBjb252ZXJ0X2ZvcndhcmQ8dHlwZT4oZnJvbS5jYXNlIyNfdmFsKQorI2RlZmluZSBUX1RZUEVfQ0FTRV9GVyhjYXNlKSBUX1RZUEVfQ0FTRV9GV19UKGNhc2UsIHRfIyNjYXNlKQorCisgIFRfVFlQRV9DQVNFX0ZXKGJhc2VfdHlwZSk7CisgIFRfVFlQRV9DQVNFX0ZXKHR5cGVkZWYpOworICBUX1RZUEVfQ0FTRV9GVyhlbnVtKTsKKyAgVF9UWVBFX0NBU0VfRlcoc3RydWN0KTsKKyAgVF9UWVBFX0NBU0VfRldfVCh4Y2VwdGlvbiwgdF9zdHJ1Y3QpOworICBUX1RZUEVfQ0FTRV9GVyhsaXN0KTsKKyAgVF9UWVBFX0NBU0VfRlcoc2V0KTsKKyAgVF9UWVBFX0NBU0VfRlcobWFwKTsKKyAgVF9UWVBFX0NBU0VfRlcoc2VydmljZSk7CisgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJJbnZhbGlkIGRhdGE6IFR5cGUgdW5pb24gaGFzIG5vIHZhbHVlLiIpOworI3VuZGVmIFRfVFlQRV9DQVNFX0ZXX1QKKyN1bmRlZiBUX1RZUEVfQ0FTRV9GVworfQorVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUodF90eXBlKSB7CisjZGVmaW5lIFRfVFlQRV9DQVNFX1QoY2FzZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKGZyb20uX19pc3NldC5jYXNlIyNfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb252ZXJ0PHR5cGUsIDo6dHlwZT4oZnJvbS5jYXNlIyNfdmFsLCByZWludGVycHJldF9jYXN0PCA6OnR5cGUqPih0bykpCisjZGVmaW5lIFRfVFlQRV9DQVNFKGNhc2UpIFRfVFlQRV9DQVNFX1QoY2FzZSwgdF8jI2Nhc2UpCisKKyAgaWYgKGZhbHNlKSB7CisgIH0KKyAgVF9UWVBFX0NBU0UoYmFzZV90eXBlKTsKKyAgVF9UWVBFX0NBU0UodHlwZWRlZik7CisgIFRfVFlQRV9DQVNFKGVudW0pOworICBUX1RZUEVfQ0FTRShzdHJ1Y3QpOworICBUX1RZUEVfQ0FTRV9UKHhjZXB0aW9uLCB0X3N0cnVjdCk7CisgIFRfVFlQRV9DQVNFKGxpc3QpOworICBUX1RZUEVfQ0FTRShzZXQpOworICBUX1RZUEVfQ0FTRShtYXApOworICBUX1RZUEVfQ0FTRShzZXJ2aWNlKTsKKyAgZWxzZSB7CisgICAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIkludmFsaWQgZGF0YTogVHlwZSB1bmlvbiBoYXMgbm8gdmFsdWUuIik7CisgIH0KKyN1bmRlZiBUX1RZUEVfQ0FTRV9UCisjdW5kZWYgVF9UWVBFX0NBU0UKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zY29wZSwgKSB7CisgIGFzc2VydCh0byk7CisjZGVmaW5lIFRfU0NPUEVfUkVTT0xWRSh0eXBlLCBuYW1lLCBhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoc3RkOjp2ZWN0b3I8aW50NjRfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5uYW1lIyNzLmJlZ2luKCk7IGl0ICE9IGZyb20ubmFtZSMjcy5lbmQoKTsgICBcCisgICAgICAgaXQrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjp0XyMjdHlwZSogdCA9IHJlc29sdmVfIyN0eXBlIGEoKml0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8tPmFkZF8jI25hbWUodC0+Z2V0X25hbWUoKSwgdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyAgVF9TQ09QRV9SRVNPTFZFKHR5cGUsIHR5cGUsIDwgOjp0X3R5cGU+KTsKKyAgVF9TQ09QRV9SRVNPTFZFKGNvbnN0LCBjb25zdGFudCwgKTsKKyAgVF9TQ09QRV9SRVNPTFZFKHNlcnZpY2UsIHNlcnZpY2UsICk7CisjdW5kZWYgVF9TQ09QRV9SRVNPTFZFCit9CisKK1RIUklGVF9DT05WRVJUX0ZPUldBUkQodF9wcm9ncmFtKSB7CisgIDo6dF9wcm9ncmFtKiB0byA9IG5ldyA6OnRfcHJvZ3JhbShmcm9tLnBhdGgsIGZyb20ubmFtZSk7CisgIGZvciAoc3RkOjp2ZWN0b3I8dF9wcm9ncmFtPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLmluY2x1ZGVzLmJlZ2luKCk7IGl0ICE9IGZyb20uaW5jbHVkZXMuZW5kKCk7CisgICAgICAgaXQrKykgeworICAgIHRvLT5hZGRfaW5jbHVkZShjb252ZXJ0X2ZvcndhcmQoKml0KSk7CisgIH0KKyAgZ19wcm9ncmFtX2NhY2hlW2Zyb20ucHJvZ3JhbV9pZF0gPSB0bzsKKyAgcmV0dXJuIHRvOworfQorVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUodF9wcm9ncmFtKSB7CisgIGFzc2VydCh0byk7CisgIGdfcHJvZ3JhbSA9IHRvOworICBjb252ZXJ0PHRfc2NvcGUsIDo6dF9zY29wZT4oZnJvbS5zY29wZSwgdG8tPnNjb3BlKCkpOworICBUSFJJRlRfQVNTSUdOX0RPQygpOworCisgIHRvLT5zZXRfb3V0X3BhdGgoZnJvbS5vdXRfcGF0aCwgZnJvbS5vdXRfcGF0aF9pc19hYnNvbHV0ZSk7CisKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20udHlwZWRlZnMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3R5cGU8IDo6dF90eXBlZGVmPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfdHlwZWRlZiwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBib29zdDo6Zm9yX2VhY2goZnJvbS5lbnVtcyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnJlc29sdmVfdHlwZTwgOjp0X2VudW0+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9lbnVtLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIGZvciAoc3RkOjp2ZWN0b3I8aW50NjRfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5vYmplY3RzLmJlZ2luKCk7IGl0ICE9IGZyb20ub2JqZWN0cy5lbmQoKTsKKyAgICAgICBpdCsrKSB7CisgICAgOjp0X3N0cnVjdCogdDIgPSByZXNvbHZlX3R5cGU8IDo6dF9zdHJ1Y3Q+KCppdCk7CisgICAgaWYgKHQyLT5pc194Y2VwdGlvbigpKSB7CisgICAgICB0by0+YWRkX3hjZXB0aW9uKHQyKTsKKyAgICB9IGVsc2UgeworICAgICAgdG8tPmFkZF9zdHJ1Y3QodDIpOworICAgIH0KKyAgfQorICBib29zdDo6Zm9yX2VhY2goZnJvbS5jb25zdHMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX2NvbnN0KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9jb25zdCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBib29zdDo6Zm9yX2VhY2goZnJvbS5zZXJ2aWNlcyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnJlc29sdmVfc2VydmljZSksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfc2VydmljZSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworCisgIGZvciAoc3RkOjp2ZWN0b3I8dF9wcm9ncmFtPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLmluY2x1ZGVzLmJlZ2luKCk7IGl0ICE9IGZyb20uaW5jbHVkZXMuZW5kKCk7CisgICAgICAgaXQrKykgeworICAgIGNvbnZlcnQoKml0LCBnX3Byb2dyYW1fY2FjaGVbaXQtPnByb2dyYW1faWRdKTsKKyAgfQorICBzdGQ6OmZvcl9lYWNoKGZyb20uY19pbmNsdWRlcy5iZWdpbigpLCBmcm9tLmNfaW5jbHVkZXMuZW5kKCksCisgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX2NfaW5jbHVkZSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBzdGQ6OmZvcl9lYWNoKGZyb20uY3BwX2luY2x1ZGVzLmJlZ2luKCksIGZyb20uY3BwX2luY2x1ZGVzLmVuZCgpLAorICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9jcHBfaW5jbHVkZSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5uYW1lc3BhY2VzLmJlZ2luKCk7CisgICAgICAgaXQgIT0gZnJvbS5uYW1lc3BhY2VzLmVuZCgpOyBpdCsrKSB7CisgICAgdG8tPnNldF9uYW1lc3BhY2UoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgfQorCisgIHRvLT5zZXRfaW5jbHVkZV9wcmVmaXgoZnJvbS5pbmNsdWRlX3ByZWZpeCk7CisgIHRvLT5zZXRfbmFtZXNwYWNlKGZyb20ubmFtZXNwYWNlXyk7Cit9CisKK2ludCBHZW5lcmF0b3JQbHVnaW46OmV4ZWMoaW50LCBjaGFyKiBbXSkgeworI2lmZGVmIF9XSU4zMgorICBfc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBfT19CSU5BUlkpOworI2VuZGlmCisgIHN0ZDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiB0cmFuc3BvcnQoCisgICAgICBuZXcgVEZyYW1lZFRyYW5zcG9ydChzdGQ6Om1ha2Vfc2hhcmVkPFRGRFRyYW5zcG9ydD4oZmlsZW5vKHN0ZGluKSkpKTsKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvKHRyYW5zcG9ydCk7CisgIEdlbmVyYXRvcklucHV0IGlucHV0OworICB0cnkgeworICAgIGlucHV0LnJlYWQoJnByb3RvKTsKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGVycikgeworICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3Igd2hpbGUgcmVjZWl2aW5nIHBsdWdpbiBkYXRhOiAiIDw8IGVyci53aGF0KCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAtMTsKKyAgfQorICBpbml0R2xvYmFscygpOworICA6OnRfcHJvZ3JhbSogcCA9IGdfcHJvZ3JhbSA9IGNvbnZlcnRfZm9yd2FyZChpbnB1dC5wcm9ncmFtKTsKKyAgc2V0X2dsb2JhbF9jYWNoZShpbnB1dC50eXBlX3JlZ2lzdHJ5KTsKKyAgY29udmVydChpbnB1dC5wcm9ncmFtLCBwKTsKKworICBpbnQgcmV0ID0gZ2VuZXJhdGUocCwgaW5wdXQucGFyc2VkX29wdGlvbnMpOworICBjbGVhckdsb2JhbHMoKTsKKworICByZXR1cm4gcmV0OworfQorCis6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSBjb25zdF92YWx1ZV9jYXNlKGNvbnN0IHRfY29uc3RfdmFsdWUmIHYpIHsKKyAgaWYgKHYuX19pc3NldC5tYXBfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX01BUDsKKyAgaWYgKHYuX19pc3NldC5saXN0X3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOworICBpZiAodi5fX2lzc2V0LnN0cmluZ192YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOworICBpZiAodi5fX2lzc2V0LmludGVnZXJfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI7CisgIGlmICh2Ll9faXNzZXQuZG91YmxlX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU7CisgIGlmICh2Ll9faXNzZXQuY29uc3RfaWRlbnRpZmllcl92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjsKKyAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlVua25vd24gY29uc3QgdmFsdWUgdHlwZSIpOworfQorCitib29sIHRfY29uc3RfdmFsdWU6Om9wZXJhdG9yPChjb25zdCB0X2NvbnN0X3ZhbHVlJiB0aGF0KSBjb25zdCB7CisgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQxID0gY29uc3RfdmFsdWVfY2FzZSgqdGhpcyk7CisgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQyID0gY29uc3RfdmFsdWVfY2FzZSh0aGF0KTsKKyAgaWYgKHQxICE9IHQyKQorICAgIHJldHVybiB0MSA8IHQyOworICBzd2l0Y2ggKHQxKSB7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIHJldHVybiBpbnRlZ2VyX3ZhbCA8IHRoYXQuaW50ZWdlcl92YWw7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgcmV0dXJuIGRvdWJsZV92YWwgPCB0aGF0LmRvdWJsZV92YWw7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgcmV0dXJuIHN0cmluZ192YWwgPCB0aGF0LnN0cmluZ192YWw7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgaWYgKHRoYXQubWFwX3ZhbC5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGVsc2UgaWYgKG1hcF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBtYXBfdmFsLmJlZ2luKCktPmZpcnN0IDwgdGhhdC5tYXBfdmFsLmJlZ2luKCktPmZpcnN0OworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICBpZiAodGhhdC5saXN0X3ZhbC5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGVsc2UgaWYgKGxpc3RfdmFsLmVtcHR5KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbGlzdF92YWwuZnJvbnQoKSA8IHRoYXQubGlzdF92YWwuZnJvbnQoKTsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgcmV0dXJuIGludGVnZXJfdmFsIDwgdGhhdC5pbnRlZ2VyX3ZhbDsKKyAgfQorICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiVW5rbm93biBjb25zdCB2YWx1ZSB0eXBlIik7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1Y2Q0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9QTFVHSU5fUExVR0lOX0gKKyNkZWZpbmUgVF9QTFVHSU5fUExVR0lOX0gKKworI2luY2x1ZGUgInRocmlmdC9UaHJpZnQuaCIKKworY2xhc3MgdF9wcm9ncmFtOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHBsdWdpbiB7CisKK3N0cnVjdCBUaHJpZnRQbHVnaW5FcnJvciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CisgIFRocmlmdFBsdWdpbkVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obXNnKSB7fQorfTsKKworY2xhc3MgR2VuZXJhdG9yUGx1Z2luIHsKK3B1YmxpYzoKKyAgaW50IGV4ZWMoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSk7CisgIHZpcnR1YWwgaW50IGdlbmVyYXRlKDo6dF9wcm9ncmFtKiwgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYpID0gMDsKK307Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk4Zjk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGFzMyBvcmcuYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBjcHAgYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBjc2hhcnAgVGhyaWZ0LlBsdWdpbgorbmFtZXNwYWNlIGQgdGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGRlbHBoaSBUaHJpZnQuUGx1Z2luCituYW1lc3BhY2UgZXJsIHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBnbyB0aHJpZnQKK25hbWVzcGFjZSBoYXhlIG9yZy5hcGFjaGUudGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGhzIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBqYXZhIG9yZy5hcGFjaGUudGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIG9jYW1sIFRocmlmdAorbmFtZXNwYWNlIHBlcmwgVGhyaWZ0LlBsdWdpbgorbmFtZXNwYWNlIHBocCB0aHJpZnQucGx1Z2luCituYW1lc3BhY2UgcHkgdGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIHJiIFRocmlmdAorCit0eXBlZGVmIGk2NCB0X3Byb2dyYW1faWQKK3R5cGVkZWYgaTY0IHRfdHlwZV9pZAordHlwZWRlZiBpNjQgdF9jb25zdF9pZAordHlwZWRlZiBpNjQgdF9zZXJ2aWNlX2lkCisKK2VudW0gdF9iYXNlIHsKKyAgICBUWVBFX1ZPSUQKKyAgICBUWVBFX1NUUklORworICAgIFRZUEVfQk9PTAorICAgIFRZUEVfSTgKKyAgICBUWVBFX0kxNgorICAgIFRZUEVfSTMyCisgICAgVFlQRV9JNjQKKyAgICBUWVBFX0RPVUJMRQorICAgIFRZUEVfQklOQVJZCit9CisKK3N0cnVjdCBUeXBlTWV0YWRhdGEgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3Byb2dyYW1faWQgcHJvZ3JhbV9pZAorICA5OTogb3B0aW9uYWwgbWFwPHN0cmluZywgc3RyaW5nPiBhbm5vdGF0aW9ucworICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KKworc3RydWN0IHRfYmFzZV90eXBlIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIHRfYmFzZSB2YWx1ZQorfQorCitzdHJ1Y3QgdF9saXN0IHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IG9wdGlvbmFsIHN0cmluZyBjcHBfbmFtZQorICAzOiByZXF1aXJlZCB0X3R5cGVfaWQgZWxlbV90eXBlCit9CisKK3N0cnVjdCB0X3NldCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiBvcHRpb25hbCBzdHJpbmcgY3BwX25hbWUKKyAgMzogcmVxdWlyZWQgdF90eXBlX2lkIGVsZW1fdHlwZQorfQorCitzdHJ1Y3QgdF9tYXAgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogb3B0aW9uYWwgc3RyaW5nIGNwcF9uYW1lCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBrZXlfdHlwZQorICA0OiByZXF1aXJlZCB0X3R5cGVfaWQgdmFsX3R5cGUKK30KKworc3RydWN0IHRfdHlwZWRlZiB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgdHlwZQorICAzOiByZXF1aXJlZCBzdHJpbmcgc3ltYm9saWMKKyAgNDogcmVxdWlyZWQgYm9vbCBmb3J3YXJkCit9CisKK3N0cnVjdCB0X2VudW1fdmFsdWUgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCBpMzIgdmFsdWUKKyAgOTk6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gYW5ub3RhdGlvbnMKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9lbnVtIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIGxpc3Q8dF9lbnVtX3ZhbHVlPiBjb25zdGFudHMKK30KKworZW51bSBSZXF1aXJlZG5lc3MgeworICBUX1JFUVVJUkVEID0gMAorICBUX09QVElPTkFMID0gMQorICBUX09QVF9JTl9SRVFfT1VUID0gMgorfQorCitzdHJ1Y3QgdF9jb25zdF9pZGVudGlmaWVyX3ZhbHVlIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkZW50aWZpZXJfdmFsCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCBlbnVtX3ZhbAorfQorCit1bmlvbiB0X2NvbnN0X3ZhbHVlIHsKKyAgMTogb3B0aW9uYWwgbWFwPHRfY29uc3RfdmFsdWUsIHRfY29uc3RfdmFsdWU+IG1hcF92YWwKKyAgMjogb3B0aW9uYWwgbGlzdDx0X2NvbnN0X3ZhbHVlPiBsaXN0X3ZhbAorICAzOiBvcHRpb25hbCBzdHJpbmcgc3RyaW5nX3ZhbAorICA0OiBvcHRpb25hbCBpNjQgaW50ZWdlcl92YWwKKyAgNTogb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWwKKyAgODogb3B0aW9uYWwgdF9jb25zdF9pZGVudGlmaWVyX3ZhbHVlIGNvbnN0X2lkZW50aWZpZXJfdmFsCit9CisKK3N0cnVjdCB0X2NvbnN0IHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIHR5cGUKKyAgMzogcmVxdWlyZWQgdF9jb25zdF92YWx1ZSB2YWx1ZQorICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KK3N0cnVjdCB0X2ZpZWxkIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIHR5cGUKKyAgMzogcmVxdWlyZWQgaTMyIGtleQorICA0OiByZXF1aXJlZCBSZXF1aXJlZG5lc3MgcmVxCisgIDU6IG9wdGlvbmFsIHRfY29uc3RfdmFsdWUgdmFsdWUKKyAgMTA6IHJlcXVpcmVkIGJvb2wgcmVmZXJlbmNlCisgIDk5OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBzdHJpbmc+IGFubm90YXRpb25zCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorc3RydWN0IHRfc3RydWN0IHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIGxpc3Q8dF9maWVsZD4gbWVtYmVycworICAzOiByZXF1aXJlZCBib29sIGlzX3VuaW9uCisgIDQ6IHJlcXVpcmVkIGJvb2wgaXNfeGNlcHRpb24KK30KK3N0cnVjdCB0X2Z1bmN0aW9uIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIHJldHVybnR5cGUKKyAgMzogcmVxdWlyZWQgdF90eXBlX2lkIGFyZ2xpc3QKKyAgNDogcmVxdWlyZWQgdF90eXBlX2lkIHhjZXB0aW9ucworICA1OiByZXF1aXJlZCBib29sIGlzX29uZXdheQorICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KK3N0cnVjdCB0X3NlcnZpY2UgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgbGlzdDx0X2Z1bmN0aW9uPiBmdW5jdGlvbnMKKyAgMzogb3B0aW9uYWwgdF9zZXJ2aWNlX2lkIGV4dGVuZHNfCit9Cit1bmlvbiB0X3R5cGUgeworICAxOiBvcHRpb25hbCB0X2Jhc2VfdHlwZSBiYXNlX3R5cGVfdmFsCisgIDI6IG9wdGlvbmFsIHRfdHlwZWRlZiB0eXBlZGVmX3ZhbAorICAzOiBvcHRpb25hbCB0X2VudW0gZW51bV92YWwKKyAgNDogb3B0aW9uYWwgdF9zdHJ1Y3Qgc3RydWN0X3ZhbAorICA1OiBvcHRpb25hbCB0X3N0cnVjdCB4Y2VwdGlvbl92YWwKKyAgNjogb3B0aW9uYWwgdF9saXN0IGxpc3RfdmFsCisgIDc6IG9wdGlvbmFsIHRfc2V0IHNldF92YWwKKyAgODogb3B0aW9uYWwgdF9tYXAgbWFwX3ZhbAorICA5OiBvcHRpb25hbCB0X3NlcnZpY2Ugc2VydmljZV92YWwKK30KK3N0cnVjdCB0X3Njb3BlIHsKKyAgMTogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IHR5cGVzCisgIDI6IHJlcXVpcmVkIGxpc3Q8dF9jb25zdF9pZD4gY29uc3RhbnRzCisgIDM6IHJlcXVpcmVkIGxpc3Q8dF9zZXJ2aWNlX2lkPiBzZXJ2aWNlcworfQorCitzdHJ1Y3QgVHlwZVJlZ2lzdHJ5IHsKKyAgMTogcmVxdWlyZWQgbWFwPHRfdHlwZV9pZCwgdF90eXBlPiB0eXBlcworICAyOiByZXF1aXJlZCBtYXA8dF9jb25zdF9pZCwgdF9jb25zdD4gY29uc3RhbnRzCisgIDM6IHJlcXVpcmVkIG1hcDx0X3NlcnZpY2VfaWQsIHRfc2VydmljZT4gc2VydmljZXMKK30KKworc3RydWN0IHRfcHJvZ3JhbSB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfcHJvZ3JhbV9pZCBwcm9ncmFtX2lkCisgIDM6IHJlcXVpcmVkIHN0cmluZyBwYXRoCisgIDQ6IHJlcXVpcmVkIHN0cmluZyBuYW1lc3BhY2VfCisgIDU6IHJlcXVpcmVkIHN0cmluZyBvdXRfcGF0aAorICA2OiByZXF1aXJlZCBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlCisgIDg6IHJlcXVpcmVkIGxpc3Q8dF9wcm9ncmFtPiBpbmNsdWRlcworICA5OiByZXF1aXJlZCBzdHJpbmcgaW5jbHVkZV9wcmVmaXgKKyAgMTA6IHJlcXVpcmVkIHRfc2NvcGUgc2NvcGUKKworICAxMTogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IHR5cGVkZWZzCisgIDEyOiByZXF1aXJlZCBsaXN0PHRfdHlwZV9pZD4gZW51bXMKKyAgMTM6IHJlcXVpcmVkIGxpc3Q8dF9jb25zdF9pZD4gY29uc3RzCisgIDE0OiByZXF1aXJlZCBsaXN0PHRfdHlwZV9pZD4gb2JqZWN0cworICAxNTogcmVxdWlyZWQgbGlzdDx0X3NlcnZpY2VfaWQ+IHNlcnZpY2VzCisKKyAgMTY6IHJlcXVpcmVkIG1hcDxzdHJpbmcsIHN0cmluZz4gbmFtZXNwYWNlcworICAxNzogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IGNwcF9pbmNsdWRlcworICAxODogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IGNfaW5jbHVkZXMKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CisKK3N0cnVjdCBHZW5lcmF0b3JJbnB1dCB7CisgIDE6IHJlcXVpcmVkIHRfcHJvZ3JhbSBwcm9ncmFtCisgIDI6IHJlcXVpcmVkIFR5cGVSZWdpc3RyeSB0eXBlX3JlZ2lzdHJ5CisgIDM6IHJlcXVpcmVkIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMjNkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2RlZmluZSBUSFJJRlRfUE9QRU4oY21kKSBfcG9wZW4oY21kLCAid2IiKQorI2RlZmluZSBUSFJJRlRfUENMT1NFIF9wY2xvc2UKKyNlbHNlCisjZGVmaW5lIFRIUklGVF9QT1BFTihjbWQpIHBvcGVuKGNtZCwgInciKQorI2RlZmluZSBUSFJJRlRfUENMT1NFIHBjbG9zZQorI2VuZGlmCisKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCIKKworI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FkYXB0b3IvbWFwLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hbGdvcml0aG0vY29weS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWxnb3JpdGhtL3RyYW5zZm9ybS5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgiCisjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlRvVHlwZTxGcm9tPjo6dHlwZSBjb252ZXJ0KEZyb20qIGZyb20pIHsKKyAgdHlwZW5hbWUgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6VG9UeXBlPEZyb20+Ojp0eXBlIHRvOworICBjb252ZXJ0KGZyb20sIHRvKTsKKyAgcmV0dXJuIHRvOworfQorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIHN0ZDo6bWFrZV9zaGFyZWQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURkRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0OworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlNJT05fTihmcm9tX3R5cGUsIHRvX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBjb252ZXJ0PGZyb21fdHlwZSwgdG9fdHlwZT4oZnJvbV90eXBlICogZnJvbSwgdG9fdHlwZSAmIHRvKQorI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTih0eXBlKSBUSFJJRlRfQ09OVkVSU0lPTl9OKDo6dHlwZSwgcGx1Z2luOjp0eXBlKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTihmcm9tX25hbWUsIHRvX25hbWUsIHByZWZpeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by5fX3NldF8jI3RvX25hbWUocHJlZml4KGZyb20tPmZyb21fbmFtZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTihuYW1lKSBUSFJJRlRfQVNTSUdOX04oZ2V0XyMjbmFtZSgpLCBuYW1lLCApCisjZGVmaW5lIFRIUklGVF9BU1NJR05fQ09OVkVSVCh0eXBlLCBmcm9tX25hbWUsIHRvX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20gJiYgZnJvbS0+ZnJvbV9uYW1lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by5fX3NldF8jI3RvX25hbWUoY29udmVydChmcm9tLT5mcm9tX25hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9PUFQobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS0+aGFzXyMjbmFtZSgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRIUklGVF9BU1NJR04obmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0xJU1RfTih0eXBlLCBmcm9tX25hbWUsIHRvX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tICYmICFmcm9tLT5mcm9tX25hbWUuZW1wdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjp0cmFuc2Zvcm0oZnJvbS0+ZnJvbV9uYW1lLmJlZ2luKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgZnJvbS0+ZnJvbV9uYW1lLmVuZCgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHRvLnRvX25hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgY29udmVydDwgOjp0eXBlPik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKSBjb252ZXJ0KHJlaW50ZXJwcmV0X2Nhc3Q8dF90eXBlKj4oZnJvbSksIHRvLm1ldGFkYXRhKQorCisvLyBhIGdlbmVyYXRvciBvZiBzZXF1ZW50aWFsIHVuaXF1ZSBpZGVudGlmaWVycyBmb3IgYWRkcmVzc2VzIC0tIHNvCisvLyB0aGF0IHRoZSBUeXBlQ2FjaGUgYmVsb3cgY2FuIHVzZSB0aG9zZSBJRHMgaW5zdGVhZCBvZgorLy8gYWRkcmVzc2VzLiBUaGlzIGFsbG93cyBHZW5lcmF0b3JJbnB1dCdzIHZhcmlvdXMKKy8vIHRfe3Byb2dyYW0sdHlwZSxldGN9X2lkIHR5cGVzIHRvIGJlIGRlbnNlIGNvbnNlY3V0aXZlbHktbnVtYmVyZWQKKy8vIGludGVnZXJzLCBpbnN0ZWFkIG9mIGxhcmdlIHJhbmRvbS1zZWVtaW5nIGludGVnZXJzLgorLy8KKy8vIEZ1cnRoZXJtb3JlLCB0aGlzIGFsbG93cyBHZW5lcmF0b3JJbnB1dCB0byBiZSBkZXRlcm1pbmlzdGljIChubworLy8gYWRkcmVzc2VzLCBzbyBubyBwc2V1ZG8tcmFuZG9tbmVzcykgYW5kIHRoYXQgbWVhbnMgcmVwcm9kdWNpYmlsaXR5CisvLyBvZiBvdXRwdXQuCitjb25zdCBpbnQ2NF90IE9ORV9NSUxMSU9OID0gMTAwMCAqIDEwMDA7CitjbGFzcyBpZF9nZW5lcmF0b3IgeworcHVibGljOgorICBpZF9nZW5lcmF0b3IoKSA6IGFkZHIyaWRfKCksIG5leHRfaWRfKE9ORV9NSUxMSU9OKSB7fQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgYWRkcjJpZF8uY2xlYXIoKSA7CisgICAgbmV4dF9pZF8gPSBPTkVfTUlMTElPTiA7CisgIH0KKworICBpbnQ2NF90IGdlbnN5bShjb25zdCBpbnQ2NF90IGFkZHIpIHsKKyAgICBpZiAoIWFkZHIpIHJldHVybiAwTCA7CisgICAgc3RkOjptYXA8aW50NjRfdCwgaW50NjRfdD46Oml0ZXJhdG9yIGl0ID0gYWRkcjJpZF8uZmluZChhZGRyKTsKKyAgICBpZiAoaXQgIT0gYWRkcjJpZF8uZW5kKCkpIHJldHVybiBpdC0+c2Vjb25kIDsKKyAgICBpbnQ2NF90IGlkID0gbmV4dF9pZF8rKyA7CisgICAgYWRkcjJpZF8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFkZHIsIGlkKSkgOworICAgIHJldHVybiBpZCA7CisgIH0KKworICBzdGQ6Om1hcDxpbnQ2NF90LCBpbnQ2NF90PiBhZGRyMmlkXyA7CisgIGludDY0X3QgbmV4dF9pZF8gOworfSA7CisKKy8vIFRvIGF2b2lkIG11bHRpcGxlIGluc3RhbmNlcyBvZiBzYW1lIHR5cGUsIHRfdHlwZSwgdF9jb25zdCBhbmQgdF9zZXJ2aWNlIGFyZSBzdG9yZWQgaW4gb25lIHBsYWNlCisvLyBhbmQgcmVmZXJlbmNlZCBieSBJRC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVDYWNoZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgcGx1Z2luOjpUb1R5cGU8VD46OnR5cGUgdG9fdHlwZTsKKyAgaWRfZ2VuZXJhdG9yIGlkZ2VuIDsKKyAgc3RkOjptYXA8aW50NjRfdCwgdG9fdHlwZT4gY2FjaGU7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQyPgorICBpbnQ2NF90IHN0b3JlKFQyKiB0KSB7CisgICAgaW50cHRyX3QgYWRkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHQpOworICAgIGlmICghYWRkcikgcmV0dXJuIDBMIDsKKworICAgIGludDY0X3QgaWQgPSBpZGdlbi5nZW5zeW0oYWRkcikgOworICAgIGlmIChjYWNoZS5lbmQoKSAhPSBjYWNoZS5maW5kKGlkKSkgcmV0dXJuIGlkIDsKKworICAgIC8vIEhBQ0s6IGZha2UgcmVzb2x2ZSBmb3IgcmVjdXJzaXZlIHR5cGUKKyAgICBjYWNoZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoaWQsIHRvX3R5cGUoKSkpOworICAgIC8vIG92ZXJ3cml0ZSB3aXRoIHRydWUgdmFsdWUKKyAgICBjYWNoZVtpZF0gPSBjb252ZXJ0KHQpOworICAgIHJldHVybiBpZCA7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeyBjYWNoZS5jbGVhcigpIDsgaWRnZW4uY2xlYXIoKTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnQ2NF90IHN0b3JlX3R5cGUoVCogdCk7CisKKyNkZWZpbmUgVF9TVE9SRSh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVHlwZUNhY2hlPHRfIyN0eXBlPiB0eXBlIyNfY2FjaGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcGx1Z2luOjp0XyMjdHlwZSMjX2lkIHN0b3JlX3R5cGU8dF8jI3R5cGU+KHRfIyN0eXBlICogdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHlwZSMjX2NhY2hlLnN0b3JlPHRfIyN0eXBlPih0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorVF9TVE9SRSh0eXBlKQorVF9TVE9SRShjb25zdCkKK1RfU1RPUkUoc2VydmljZSkKKyN1bmRlZiBUX1NUT1JFCisvLyB0aGlzIGlkX2dlbmVyYXRvciBpcyBmb3IgZ2Vuc3ltbS1pbmcgdF9wcm9ncmFtX2lkCitpZF9nZW5lcmF0b3IgcHJvZ3JhbV9jYWNoZSA7CisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9JRF9OKHQsIGZyb21fbmFtZSwgdG9fbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiBmcm9tLT5mcm9tX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLl9fc2V0XyMjdG9fbmFtZShzdG9yZV90eXBlPHQ+KGZyb20tPmZyb21fbmFtZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0lEKG5hbWUpIFRIUklGVF9BU1NJR05fSURfTih0X3R5cGUsIGdldF8jI25hbWUoKSwgbmFtZSkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodCwgbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tICYmICFmcm9tLT5nZXRfIyNuYW1lIyNzKCkuZW1wdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjp0cmFuc2Zvcm0oZnJvbS0+Z2V0XyMjbmFtZSMjcygpLmJlZ2luKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgZnJvbS0+Z2V0XyMjbmFtZSMjcygpLmVuZCgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHRvLm5hbWUjI3MpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgJnN0b3JlX3R5cGU8dD4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitUSFJJRlRfQ09OVkVSU0lPTl9OKDo6dF90eXBlLCBwbHVnaW46OlR5cGVNZXRhZGF0YSkgeworICB0by5wcm9ncmFtX2lkID0gcHJvZ3JhbV9jYWNoZS5nZW5zeW0ocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Pihmcm9tLT5nZXRfcHJvZ3JhbSgpKSk7CisgIFRIUklGVF9BU1NJR05fTihhbm5vdGF0aW9uc18sIGFubm90YXRpb25zLCApOworICBpZiAoZnJvbS0+aGFzX2RvYygpKSB7CisgICAgdG8uX19zZXRfZG9jKGZyb20tPmdldF9kb2MoKSk7CisgIH0KKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF90eXBlZGVmKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh0eXBlKTsKKyAgVEhSSUZUX0FTU0lHTihzeW1ib2xpYyk7CisgIFRIUklGVF9BU1NJR05fTihpc19mb3J3YXJkX3R5cGVkZWYoKSwgZm9yd2FyZCwgKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9lbnVtX3ZhbHVlKSB7CisgIFRIUklGVF9BU1NJR05fT1BUKGRvYyk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR04odmFsdWUpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW0pIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2VudW1fdmFsdWUsIGdldF9jb25zdGFudHMoKSwgY29uc3RhbnRzKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9jb25zdF92YWx1ZSkgeworICBzd2l0Y2ggKGZyb20tPmdldF90eXBlKCkpIHsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIFRIUklGVF9BU1NJR05fTihnZXRfaW50ZWdlcigpLCBpbnRlZ2VyX3ZhbCwgKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgVEhSSUZUX0FTU0lHTl9OKGdldF9kb3VibGUoKSwgZG91YmxlX3ZhbCwgKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgVEhSSUZUX0FTU0lHTl9OKGdldF9zdHJpbmcoKSwgc3RyaW5nX3ZhbCwgKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgIGlmIChmcm9tKSB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjp0X2NvbnN0X2lkZW50aWZpZXJfdmFsdWUgY2lkdmFsIDsKKyAgICAgIGlmIChmcm9tLT5lbnVtXykKKwljaWR2YWwuX19zZXRfZW51bV92YWwoc3RvcmVfdHlwZTx0X3R5cGU+KGZyb20tPmVudW1fKSk7CisgICAgICBjaWR2YWwuX19zZXRfaWRlbnRpZmllcl92YWwoZnJvbS0+Z2V0X2lkZW50aWZpZXIoKSk7CisgICAgICB0by5fX3NldF9jb25zdF9pZGVudGlmaWVyX3ZhbChjaWR2YWwpIDsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIHRvLl9faXNzZXQubWFwX3ZhbCA9IHRydWU7CisgICAgaWYgKGZyb20gJiYgIWZyb20tPmdldF9tYXAoKS5lbXB0eSgpKSB7CisgICAgICBmb3IgKHN0ZDo6bWFwPCA6OnRfY29uc3RfdmFsdWUqLCA6OnRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaXQKKyAgICAgICAgICAgPSBmcm9tLT5nZXRfbWFwKCkuYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gZnJvbS0+Z2V0X21hcCgpLmVuZCgpOworICAgICAgICAgICBpdCsrKSB7CisgICAgICAgIHRvLm1hcF92YWwuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbnZlcnQoaXQtPmZpcnN0KSwgY29udmVydChpdC0+c2Vjb25kKSkpOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgIHRvLl9faXNzZXQubGlzdF92YWwgPSB0cnVlOworICAgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfY29uc3RfdmFsdWUsIGdldF9saXN0KCksIGxpc3RfdmFsKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBwbHVnaW46OlRocmlmdFBsdWdpbkVycm9yKCJjb25zdCB2YWx1ZSBoYXMgbm8gdmFsdWUiKTsKKyAgfQorfQorVEhSSUZUX0NPTlZFUlNJT04odF9jb25zdCkgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKHR5cGUpOworICBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodF9jb25zdF92YWx1ZSwgZ2V0X3ZhbHVlKCksIHZhbHVlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZmllbGQpIHsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoZG9jKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTihrZXkpOworICBUSFJJRlRfQVNTSUdOX04oZ2V0X3JlcSgpLCByZXEsIChwbHVnaW46OlJlcXVpcmVkbmVzczo6dHlwZSkpOworICBUSFJJRlRfQVNTSUdOKHJlZmVyZW5jZSk7CisgIFRIUklGVF9BU1NJR05fSUQodHlwZSk7CisgIFRIUklGVF9BU1NJR05fQ09OVkVSVCh0X2NvbnN0X3ZhbHVlLCBnZXRfdmFsdWUoKSwgdmFsdWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9zdHJ1Y3QpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2ZpZWxkLCBnZXRfbWVtYmVycygpLCBtZW1iZXJzKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX3VuaW9uKCksIGlzX3VuaW9uLCApOworICBUSFJJRlRfQVNTSUdOX04oaXNfeGNlcHRpb24oKSwgaXNfeGNlcHRpb24sICk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2Z1bmN0aW9uKSB7CisgIFRIUklGVF9BU1NJR05fT1BUKGRvYyk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQocmV0dXJudHlwZSk7CisgIFRIUklGVF9BU1NJR05fTihpc19vbmV3YXkoKSwgaXNfb25ld2F5LCApOworICBUSFJJRlRfQVNTSUdOX0lEKGFyZ2xpc3QpOworICBUSFJJRlRfQVNTSUdOX0lEKHhjZXB0aW9ucyk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfbGlzdCkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fT1BUKGNwcF9uYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChlbGVtX3R5cGUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9zZXQpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX09QVChjcHBfbmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQoZWxlbV90eXBlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfbWFwKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoY3BwX25hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKGtleV90eXBlKTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh2YWxfdHlwZSk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfc2VydmljZSkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfZnVuY3Rpb24sIGdldF9mdW5jdGlvbnMoKSwgZnVuY3Rpb25zKTsKKyAgVEhSSUZUX0FTU0lHTl9JRF9OKHRfc2VydmljZSwgZ2V0X2V4dGVuZHMoKSwgZXh0ZW5kc18pOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2Jhc2VfdHlwZSkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGlmIChmcm9tLT5pc19iaW5hcnkoKSkgeworICAgIHRvLnZhbHVlID0gcGx1Z2luOjp0X2Jhc2U6OlRZUEVfQklOQVJZOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoZnJvbS0+Z2V0X2Jhc2UoKSkgeworI2RlZmluZSBUX0JBU0VUWVBFX0NBU0UobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFXyMjbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvLnZhbHVlID0gcGx1Z2luOjp0X2Jhc2U6OlRZUEVfIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisgICAgICBUX0JBU0VUWVBFX0NBU0UoVk9JRCk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoU1RSSU5HKTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShCT09MKTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShJOCk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTE2KTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShJMzIpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEk2NCk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoRE9VQkxFKTsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgcGx1Z2luOjpUaHJpZnRQbHVnaW5FcnJvcigiQmFzZSB0eXBlIHVuaW9uIGhhcyBubyB2YWx1ZSIpOworICAgICAgYnJlYWs7CisjdW5kZWYgVF9CQVNFVFlQRV9DQVNFCisgICAgfQorICB9Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3R5cGUpIHsKKyNkZWZpbmUgVF9DT05WRVJUX1VOSU9OX04obmFtZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoZnJvbS0+aXNfIyNuYW1lKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0by5fX2lzc2V0Lm5hbWUjI192YWwgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb252ZXJ0KHJlaW50ZXJwcmV0X2Nhc3Q8IDo6dHlwZSo+KGZyb20pLCB0by5uYW1lIyNfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBUX0NPTlZFUlRfVU5JT04obmFtZSkgVF9DT05WRVJUX1VOSU9OX04obmFtZSwgdF8jI25hbWUpCisgIGlmIChmYWxzZSkgeworICB9CisgIFRfQ09OVkVSVF9VTklPTihiYXNlX3R5cGUpCisgIFRfQ09OVkVSVF9VTklPTih0eXBlZGVmKQorICBUX0NPTlZFUlRfVU5JT04oZW51bSkKKyAgVF9DT05WRVJUX1VOSU9OKHN0cnVjdCkKKyAgVF9DT05WRVJUX1VOSU9OX04oeGNlcHRpb24sIHRfc3RydWN0KQorICBUX0NPTlZFUlRfVU5JT04obGlzdCkKKyAgVF9DT05WRVJUX1VOSU9OKHNldCkKKyAgVF9DT05WRVJUX1VOSU9OKG1hcCkKKyAgVF9DT05WRVJUX1VOSU9OKHNlcnZpY2UpCisgIGVsc2UgeworICAgIHRocm93IHBsdWdpbjo6VGhyaWZ0UGx1Z2luRXJyb3IoIlR5cGUgdW5pb24gaGFzIG5vIHZhbHVlIik7CisgIH0KKyN1bmRlZiBUX0NPTlZFUlRfVU5JT05fTgorI3VuZGVmIFRfQ09OVkVSVF9VTklPTgorfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3Njb3BlKSB7CisjZGVmaW5lIFRfU0NPUEVfQVNTSUdOKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb3N0Ojpjb3B5KGZyb20tPm5hbWUjI3NfIHwgYm9vc3Q6OmFkYXB0b3JzOjptYXBfdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmc3RvcmVfdHlwZTx0eXBlPiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih0by5uYW1lIyNzKSkKKyAgVF9TQ09QRV9BU1NJR04odHlwZSwgdF90eXBlKTsKKyAgVF9TQ09QRV9BU1NJR04oY29uc3RhbnQsIHRfY29uc3QpOworICBUX1NDT1BFX0FTU0lHTihzZXJ2aWNlLCB0X3NlcnZpY2UpOworI3VuZGVmIFRfU0NPUEVfQVNTSUdOCit9CisKK3ZvaWQgZ2V0X2dsb2JhbF9jYWNoZShwbHVnaW46OlR5cGVSZWdpc3RyeSYgcmVnKSB7CisgIHJlZy50eXBlcyA9IHR5cGVfY2FjaGUuY2FjaGU7CisgIHJlZy5jb25zdGFudHMgPSBjb25zdF9jYWNoZS5jYWNoZTsKKyAgcmVnLnNlcnZpY2VzID0gc2VydmljZV9jYWNoZS5jYWNoZTsKK30KKwordm9pZCBjbGVhcl9nbG9iYWxfY2FjaGUoKSB7CisgIHR5cGVfY2FjaGUuY2xlYXIoKTsKKyAgY29uc3RfY2FjaGUuY2xlYXIoKTsKKyAgc2VydmljZV9jYWNoZS5jbGVhcigpOworICBwcm9ncmFtX2NhY2hlLmNsZWFyKCkgOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3Byb2dyYW0pIHsKKyAgVEhSSUZUX0FTU0lHTl9DT05WRVJUKHRfc2NvcGUsIHNjb3BlKCksIHNjb3BlKTsKKyAgVEhSSUZUX0FTU0lHTihwYXRoKTsKKyAgVEhSSUZUX0FTU0lHTihvdXRfcGF0aCk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR04oaW5jbHVkZV9wcmVmaXgpOworICBUSFJJRlRfQVNTSUdOKGNwcF9pbmNsdWRlcyk7CisgIFRIUklGVF9BU1NJR04oY19pbmNsdWRlcyk7CisgIFRIUklGVF9BU1NJR04obmFtZXNwYWNlcyk7CisgIFRIUklGVF9BU1NJR05fTihpc19vdXRfcGF0aF9hYnNvbHV0ZSgpLCBvdXRfcGF0aF9pc19hYnNvbHV0ZSwgKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGdldF9uYW1lc3BhY2UoKSwgbmFtZXNwYWNlXywgKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfdHlwZSwgdHlwZWRlZik7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3R5cGUsIGVudW0pOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF90eXBlLCBvYmplY3QpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF9jb25zdCwgY29uc3QpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF9zZXJ2aWNlLCBzZXJ2aWNlKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9wcm9ncmFtLCBnZXRfaW5jbHVkZXMoKSwgaW5jbHVkZXMpOworICB0by5wcm9ncmFtX2lkID0gcHJvZ3JhbV9jYWNoZS5nZW5zeW0ocmVpbnRlcnByZXRfY2FzdDxwbHVnaW46OnRfcHJvZ3JhbV9pZD4oZnJvbSkpOworfQorCitQbHVnaW5EZWxlZ2F0ZVJlc3VsdCBkZWxlZ2F0ZVRvUGx1Z2luKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpIHsKKyAgc3RkOjpzdHJpbmcgbGFuZ3VhZ2U7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gcGFyc2VkX29wdGlvbnM7CisgIHRfZ2VuZXJhdG9yOjpwYXJzZV9vcHRpb25zKG9wdGlvbnMsIGxhbmd1YWdlLCBwYXJzZWRfb3B0aW9ucyk7CisgIHN0ZDo6c3RyaW5nIGNtZCA9ICJ0aHJpZnQtZ2VuLSI7CisgIGlmIChsYW5ndWFnZS5maW5kX2ZpcnN0X25vdF9vZigiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl8tMDEyMzQ1Njc4OSIpCisgICAgICAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIHN0ZDo6Y2VyciA8PCAiSW52YWxpZCBsYW5ndWFnZSBuYW1lIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIFBMVUdJTl9GQUlMVVJFOworICB9CisgIGNtZC5hcHBlbmQobGFuZ3VhZ2UpOworICBGSUxFKiBmZCA9IFRIUklGVF9QT1BFTihjbWQuY19zdHIoKSk7CisgIGlmIChmZCkgeworI2lmZGVmIF9XSU4zMgorICAgIF9zZXRtb2RlKGZpbGVubyhmZCksIF9PX0JJTkFSWSk7CisjZW5kaWYKKyAgICBzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IHRyYW5zcG9ydCgKKyAgICAgICAgbmV3IFRGcmFtZWRUcmFuc3BvcnQobWFrZV9zaGFyZWQ8VEZEVHJhbnNwb3J0PihmaWxlbm8oZmQpKSkpOworICAgIFRCaW5hcnlQcm90b2NvbCBwcm90byh0cmFuc3BvcnQpOworCisgICAgcGx1Z2luOjpHZW5lcmF0b3JJbnB1dCBpbnB1dDsKKyAgICBpbnB1dC5fX3NldF9wYXJzZWRfb3B0aW9ucyhwYXJzZWRfb3B0aW9ucyk7CisgICAgY2xlYXJfZ2xvYmFsX2NhY2hlKCk7CisgICAgY29udmVydChwcm9ncmFtLCBpbnB1dC5wcm9ncmFtKTsKKyAgICBnZXRfZ2xvYmFsX2NhY2hlKGlucHV0LnR5cGVfcmVnaXN0cnkpOworICAgIHRyeSB7CisgICAgICBpbnB1dC53cml0ZSgmcHJvdG8pOworICAgICAgdHJhbnNwb3J0LT5mbHVzaCgpOworICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlcnIpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3Igd2hpbGUgc2VuZGluZyBkYXRhIHRvIHBsdWdpbjogIiA8PCBlcnIud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIFRIUklGVF9QQ0xPU0UoZmQpOworICAgICAgcmV0dXJuIFBMVUdJTl9GQUlMVVJFOworICAgIH0KKworICAgIC8vIFRPRE86IGJlIHByZXBhcmVkIGZvciBoYW5nIG9yIGNyYXNoIG9mIGNoaWxkIHByb2Nlc3MKKyAgICBpbnQgcmV0ID0gVEhSSUZUX1BDTE9TRShmZCk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIHJldHVybiBQTFVHSU5fU1VDQ0VFU1M7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAicGx1Z2luIHByb2Nlc3MgcmV0dXJuZWQgbm9uIHplcm8gZXhpdCBjb2RlOiAiIDw8IHJldCA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUExVR0lOX0ZBSUxVUkU7CisgICAgfQorICB9CisgIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworICByZXR1cm4gUExVR0lOX05PVF9GT1VORDsKK30KK30KKwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiMmQxYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUExVR0lOX1BMVUdJTl9PVVRQVVRfSAorI2RlZmluZSBUX1BMVUdJTl9QTFVHSU5fT1VUUFVUX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgdF9wcm9ncmFtOworCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7CisKK2VudW0gUGx1Z2luRGVsZWdhdGVSZXN1bHQgeworICBQTFVHSU5fTk9UX0ZPVU5ELAorICBQTFVHSU5fRkFJTFVSRSwKKyAgUExVR0lOX1NVQ0NFRVNTLAorfTsKKworUGx1Z2luRGVsZWdhdGVSZXN1bHQgZGVsZWdhdGVUb1BsdWdpbih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2YjVjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9QTFVHSU5fVFlQRV9VVElMX0gKKyNkZWZpbmUgVF9QTFVHSU5fVFlQRV9VVElMX0gKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwbHVnaW4geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3N0cnVjdCBUb1R5cGUge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgordHlwZW5hbWUgVG9UeXBlPEZyb20+Ojp0eXBlKiBjb252ZXJ0X2ZvcndhcmQoY29uc3QgRnJvbSYpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Cit2b2lkIGNvbnZlcnQoY29uc3QgRnJvbSYsIFRvKik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgordHlwZW5hbWUgVG9UeXBlPEZyb20+Ojp0eXBlKiBjb252ZXJ0KGNvbnN0IEZyb20mIGZyb20pOworCitjbGFzcyBUeXBlUmVnaXN0cnk7Cit2b2lkIHNldF9nbG9iYWxfY2FjaGUoY29uc3QgVHlwZVJlZ2lzdHJ5Jik7Cit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworfQorfQorfQorCisvLyBjb252ZXJzaW9uIGZyb20gcmF3IGNvbXBpbGVyIHR5cGVzIHRvIHBsdWdpbiB3aXJlIHR5cGUKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgordm9pZCBjb252ZXJ0KEZyb20qIGZyb20sIFRvJiB0byk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgordHlwZW5hbWUgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6VG9UeXBlPEZyb20+Ojp0eXBlIGNvbnZlcnQoRnJvbSogZnJvbSk7CisKK3ZvaWQgZ2V0X2dsb2JhbF9jYWNoZShhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpUeXBlUmVnaXN0cnkmKTsKK3ZvaWQgY2xlYXJfZ2xvYmFsX2NhY2hlKCk7Cit9CisKKyNkZWZpbmUgVEhSSUZUX1RZUEVfTUFQUElORyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGFwYWNoZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHRocmlmdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHBsdWdpbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IFRvVHlwZTwgOjpUWVBFPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIFRZUEUgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IFRvVHlwZTxUWVBFPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIDo6VFlQRSB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2Jhc2VfdHlwZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9jb25zdCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9jb25zdF92YWx1ZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9jb250YWluZXIpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZG9jKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2VudW0pCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZW51bV92YWx1ZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9maWVsZCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9mdW5jdGlvbikKK1RIUklGVF9UWVBFX01BUFBJTkcodF9saXN0KQorVEhSSUZUX1RZUEVfTUFQUElORyh0X21hcCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9wcm9ncmFtKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3Njb3BlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3NlcnZpY2UpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfc2V0KQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3N0cnVjdCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF90eXBlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3R5cGVkZWYpCisjdW5kZWYgVEhSSUZUX1RZUEVfTUFQUElORworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmxsIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5sbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjc4M2JlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5sbApAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRocmlmdCBzY2FubmVyLgorICoKKyAqIFRva2VuaXplcyBhIHRocmlmdCBkZWZpbml0aW9uIGZpbGUuCisgKi8KKworJXsKKworLyogVGhpcyBpcyByZWR1bmRhbnQgd2l0aCBzb21lIG9mIHRoZSBmbGFncyBpbiBNYWtlZmlsZS5hbSwgYnV0IGl0IHdvcmtzCisgKiB3aGVuIHBlb3BsZSBvdmVycmlkZSBDWFhGTEFHUyB3aXRob3V0IGJlaW5nIGNhcmVmdWwuIFRoZSBwcmFnbWFzIGFyZQorICogdGhlICdyaWdodCcgd2F5IHRvIGRvIGl0LCBidXQgZG9uJ3Qgd29yayBvbiBvbGQtZW5vdWdoIEdDQyAoaW4gcGFydGljdWxhcgorICogdGhlIEdDQyB0aGF0IHNoaXAgb24gTWFjIE9TIFggMTAuNi41LCAqY291bnRlciogdG8gd2hhdCB0aGUgR05VIGRvY3Mgc2F5KQorICoKKyAqIFdlIHNob3VsZCByZXZlcnQgdGhlIE1ha2VmaWxlLmFtIGNoYW5nZXMgb25jZSBBcHBsZSBzaGlwcyBhIHJlYXNvbmFibGUKKyAqIEdDQy4KKyAqLworI2lmZGVmIF9fR05VQ19fCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWZ1bmN0aW9uIgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1sYWJlbCIKKyNlbmRpZgorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcHVzaCApCisKKy8vIHdhcm5pbmcgQzQxMDI6ICdmaW5kX3J1bGUnIDogdW5yZWZlcmVuY2VkIGxhYmVsCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAyICkKKworLy8gd2FybmluZyBDNDI2NzogJ2FyZ3VtZW50JyA6IGNvbnZlcnNpb24gZnJvbSAnc2l6ZV90JyB0byAnaW50JywgcG9zc2libGUgbG9zcyBvZiBkYXRhCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MjY3ICkKKworLy8gYXZvaWQgaXNhdHR5IHJlZGVmaW5pdGlvbgorI2RlZmluZSBZWV9ORVZFUl9JTlRFUkFDVElWRSAxCisKKyNkZWZpbmUgWVlfTk9fVU5JU1REX0ggMQorI2VuZGlmCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlICJ0aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorCisvKioKKyAqIE11c3QgYmUgaW5jbHVkZWQgQUZURVIgcGFyc2UvdF9wcm9ncmFtLmgsIGJ1dCBJIGNhbid0IHJlbWVtYmVyIHdoeSBhbnltb3JlCisgKiBiZWNhdXNlIEkgd3JvdGUgdGhpcyBhIHdoaWxlIGFnby4KKyAqLworI2lmIGRlZmluZWQoQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTikKKyNpbmNsdWRlICJ0aHJpZnQvdGhyaWZ0eS5oIgorI2Vsc2UKKyNpbmNsdWRlICJ0aHJpZnQvdGhyaWZ0eS5oaCIKKyNlbmRpZgorCit2b2lkIGludGVnZXJfb3ZlcmZsb3coY2hhciogdGV4dCkgeworICB5eWVycm9yKCJUaGlzIGludGVnZXIgaXMgdG9vIGJpZzogXCIlc1wiXG4iLCB0ZXh0KTsKKyAgZXhpdCgxKTsKK30KKwordm9pZCB1bmV4cGVjdGVkX3Rva2VuKGNoYXIqIHRleHQpIHsKKyAgeXllcnJvcigiVW5leHBlY3RlZCB0b2tlbiBpbiBpbnB1dDogXCIlc1wiXG4iLCB0ZXh0KTsKKyAgZXhpdCgxKTsKK30KKworJX0KKworLyoqCisgKiBQcm92aWRlcyB0aGUgeXlsaW5lbm8gZ2xvYmFsLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvdXRwdXQKKyAqLworJW9wdGlvbiBsZXgtY29tcGF0CisKKy8qKgorICogT3VyIGlucHV0cyBhcmUgYWxsIHNpbmdsZSBmaWxlcywgc28gbm8gbmVlZCBmb3IgeXl3cmFwCisgKi8KKyVvcHRpb24gbm95eXdyYXAKKworLyoqCisgKiBXZSBkb24ndCB1c2UgaXQsIGFuZCBpdCBmaXJlcyB1cCB3YXJuaW5ncyBhdCAtV2FsbAorICovCislb3B0aW9uIG5vdW5wdXQKKworLyoqCisgKiBIZWxwZXIgZGVmaW5pdGlvbnMsIGNvbW1lbnRzLCBjb25zdGFudHMsIGFuZCB3aGF0bm90CisgKi8KKworaW50Y29uc3RhbnQgICAoWystXT9bMC05XSspCitoZXhjb25zdGFudCAgIChbKy1dPyIweCJbMC05QS1GYS1mXSspCitkdWJjb25zdGFudCAgIChbKy1dP1swLTldKihcLlswLTldKyk/KFtlRV1bKy1dP1swLTldKyk/KQoraWRlbnRpZmllciAgICAoW2EtekEtWl9dKFwuW2EtekEtWl8wLTldfFthLXpBLVpfMC05XSkqKQord2hpdGVzcGFjZSAgICAoWyBcdFxyXG5dKikKK3NpbGx5Y29tbSAgICAgKCIvKiIiKiIqIiovIikKK211bHRpY21fYmVnaW4gKCIvKiIpCitkb2N0ZXh0X2JlZ2luICgiLyoqIikKK2NvbW1lbnQgICAgICAgKCIvLyJbXlxuXSopCit1bml4Y29tbWVudCAgICgiIyJbXlxuXSopCitzeW1ib2wgICAgICAgIChbOjtcLFx7XH1cKFwpXD08PlxbXF1dKQorbGl0ZXJhbF9iZWdpbiAoWydcIl0pCisKKyUlCisKK3t3aGl0ZXNwYWNlfSAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQore3NpbGx5Y29tbX0gICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9CisKK3tkb2N0ZXh0X2JlZ2lufSB7CisgIHN0ZDo6c3RyaW5nIHBhcnNlZCgiLyoqIik7CisgIGludCBzdGF0ZSA9IDA7ICAvLyAwID0gbm9ybWFsLCAxID0gIioiIHNlZW4sICIqLyIgc2VlbgorICB3aGlsZShzdGF0ZSA8IDIpCisgIHsKKyAgICBpbnQgY2ggPSB5eWlucHV0KCk7CisgICAgcGFyc2VkLnB1c2hfYmFjayhjaCk7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSBFT0Y6CisgICAgICAgIHl5ZXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gZG9jLWNvbW1lbnQgYXQgJWRcbiIsIHl5bGluZW5vKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJyonOgorICAgICAgICBzdGF0ZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIHN0YXRlID0gKHN0YXRlID09IDEpID8gMiA6IDA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdGUgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcGRlYnVnKCJkb2N0ZXh0ID0gXCIlc1wiXG4iLHBhcnNlZC5jX3N0cigpKTsKKworIC8qIFRoaXMgZG9lcyBub3Qgc2hvdyB1cCBpbiB0aGUgcGFyc2UgdHJlZS4gKi8KKyAvKiBSYXRoZXIsIHRoZSBwYXJzZXIgd2lsbCBncmFiIGl0IG91dCBvZiB0aGUgZ2xvYmFsLiAqLworICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICBjbGVhcl9kb2N0ZXh0KCk7CisgICAgZ19kb2N0ZXh0ID0gc3RyZHVwKHBhcnNlZC5jX3N0cigpICsgMyk7CisgICAgYXNzZXJ0KHN0cmxlbihnX2RvY3RleHQpID49IDIpOworICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDJdID0gJyAnOworICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDFdID0gJ1wwJzsKKyAgICBnX2RvY3RleHQgPSBjbGVhbl91cF9kb2N0ZXh0KGdfZG9jdGV4dCk7CisgICAgZ19kb2N0ZXh0X2xpbmVubyA9IHl5bGluZW5vOworICAgIGlmKCAoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID09IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gSU5WQUxJRCkpeworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID0gc3RyZHVwKGdfZG9jdGV4dCk7CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSBnX2RvY3RleHRfbGluZW5vOworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gU1RJTExfQ0FORElEQVRFOworICAgICAgcGRlYnVnKCIlcyIsInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gU1RJTExfQ0FORElEQVRFIik7CisgICAgfQorICB9Cit9CisKK3ttdWx0aWNtX2JlZ2lufSAgeyAvKiBwYXJzZWQsIGJ1dCB0aHJvd24gYXdheSAqLworICBzdGQ6OnN0cmluZyBwYXJzZWQoIi8qIik7CisgIGludCBzdGF0ZSA9IDA7ICAvLyAwID0gbm9ybWFsLCAxID0gIioiIHNlZW4sICIqLyIgc2VlbgorICB3aGlsZShzdGF0ZSA8IDIpCisgIHsKKyAgICBpbnQgY2ggPSB5eWlucHV0KCk7CisgICAgcGFyc2VkLnB1c2hfYmFjayhjaCk7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSBFT0Y6CisgICAgICAgIHl5ZXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gbXVsdGlsaW5lIGNvbW1lbnQgYXQgJWRcbiIsIHl5bGluZW5vKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJyonOgorICAgICAgICBzdGF0ZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnLyc6CisgICAgICAgIHN0YXRlID0gKHN0YXRlID09IDEpID8gMiA6IDA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdGUgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcGRlYnVnKCJtdWx0aV9jb21tID0gXCIlc1wiXG4iLHBhcnNlZC5jX3N0cigpKTsKK30KKwore2NvbW1lbnR9ICAgICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Cit7dW5peGNvbW1lbnR9ICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KKwore3N5bWJvbH0gICAgICAgICAgICAgeyByZXR1cm4geXl0ZXh0WzBdOyAgICAgICAgICAgICAgICB9CisiKiIgICAgICAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07ICAgICAgICAgICAgICAgIH0KKworImZhbHNlIiAgICAgICAgICAgICAgeyB5eWx2YWwuaWNvbnN0PTA7IHJldHVybiB0b2tfaW50X2NvbnN0YW50OyB9CisidHJ1ZSIgICAgICAgICAgICAgICB7IHl5bHZhbC5pY29uc3Q9MTsgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7IH0KKworIm5hbWVzcGFjZSIgICAgICAgICAgeyByZXR1cm4gdG9rX25hbWVzcGFjZTsgICAgICAgICAgICB9CisiY3BwX25hbWVzcGFjZSIgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJjcHAiKTsgLyogZG8gbm90aGluZyAqLyB9CisiY3BwX2luY2x1ZGUiICAgICAgICB7IHJldHVybiB0b2tfY3BwX2luY2x1ZGU7ICAgICAgICAgIH0KKyJjcHBfdHlwZSIgICAgICAgICAgIHsgcmV0dXJuIHRva19jcHBfdHlwZTsgICAgICAgICAgICAgfQorImphdmFfcGFja2FnZSIgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiamF2YV9wYWNrYWdlIiwgImphdmEiKTsgLyogZG8gbm90aGluZyAqLyB9CisiY29jb2FfcHJlZml4IiAgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJjb2NvYV9wcmVmaXgiLCAiY29jb2EiKTsgLyogZG8gbm90aGluZyAqLyB9CisiY3NoYXJwX25hbWVzcGFjZSIgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJjc2hhcnAiKTsgLyogZG8gbm90aGluZyAqLyB9CisiZGVscGhpX25hbWVzcGFjZSIgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJkZWxwaGkiKTsgLyogZG8gbm90aGluZyAqLyB9CisicGhwX25hbWVzcGFjZSIgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJwaHAiKTsgLyogZG8gbm90aGluZyAqLyB9CisicHlfbW9kdWxlIiAgICAgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJweV9tb2R1bGUiLCAicHkiKTsgLyogZG8gbm90aGluZyAqLyB9CisicGVybF9wYWNrYWdlIiAgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJwZXJsX3BhY2thZ2UiLCAicGVybCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJydWJ5X25hbWVzcGFjZSIgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInJ1YnkiKTsgLyogZG8gbm90aGluZyAqLyB9Cisic21hbGx0YWxrX2NhdGVnb3J5IiB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJzbWFsbHRhbGtfY2F0ZWdvcnkiLCAic21hbGx0YWxrLmNhdGVnb3J5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInNtYWxsdGFsa19wcmVmaXgiICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgic21hbGx0YWxrX2NhdGVnb3J5IiwgInNtYWxsdGFsay5jYXRlZ29yeSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJ4c2RfYWxsIiAgICAgICAgICAgIHsgcmV0dXJuIHRva194c2RfYWxsOyAgICAgICAgICAgICAgfQorInhzZF9vcHRpb25hbCIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9vcHRpb25hbDsgICAgICAgICB9CisieHNkX25pbGxhYmxlIiAgICAgICB7IHJldHVybiB0b2tfeHNkX25pbGxhYmxlOyAgICAgICAgIH0KKyJ4c2RfbmFtZXNwYWNlIiAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInhzZCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJ4c2RfYXR0cnMiICAgICAgICAgIHsgcmV0dXJuIHRva194c2RfYXR0cnM7ICAgICAgICAgICAgfQorImluY2x1ZGUiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2luY2x1ZGU7ICAgICAgICAgICAgICB9Cisidm9pZCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdm9pZDsgICAgICAgICAgICAgICAgIH0KKyJib29sIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19ib29sOyAgICAgICAgICAgICAgICAgfQorImJ5dGUiICAgICAgICAgICAgICAgeworICBlbWl0X2J5dGVfdHlwZV93YXJuaW5nKCk7CisgIHJldHVybiB0b2tfaTg7Cit9CisiaTgiICAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTg7ICAgICAgICAgICAgICAgICAgIH0KKyJpMTYiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMTY7ICAgICAgICAgICAgICAgICAgfQorImkzMiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kzMjsgICAgICAgICAgICAgICAgICB9CisiaTY0IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTY0OyAgICAgICAgICAgICAgICAgIH0KKyJkb3VibGUiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19kb3VibGU7ICAgICAgICAgICAgICAgfQorInN0cmluZyIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cmluZzsgICAgICAgICAgICAgICB9CisiYmluYXJ5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfYmluYXJ5OyAgICAgICAgICAgICAgIH0KKyJzbGlzdCIgeworICBwd2FybmluZygwLCAiXCJzbGlzdFwiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBjb21waWxlciB2ZXJzaW9uLiAgVGhpcyB0eXBlIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIFwic3RyaW5nXCIuXG4iKTsKKyAgcmV0dXJuIHRva19zbGlzdDsKK30KKyJzZW51bSIgeworICBwd2FybmluZygwLCAiXCJzZW51bVwiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBjb21waWxlciB2ZXJzaW9uLiAgVGhpcyB0eXBlIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIFwic3RyaW5nXCIuXG4iKTsKKyAgcmV0dXJuIHRva19zZW51bTsKK30KKyJtYXAiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19tYXA7ICAgICAgICAgICAgICAgICAgfQorImxpc3QiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2xpc3Q7ICAgICAgICAgICAgICAgICB9Cisic2V0IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfc2V0OyAgICAgICAgICAgICAgICAgIH0KKyJvbmV3YXkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19vbmV3YXk7ICAgICAgICAgICAgICAgfQorInR5cGVkZWYiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3R5cGVkZWY7ICAgICAgICAgICAgICB9Cisic3RydWN0IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RydWN0OyAgICAgICAgICAgICAgIH0KKyJ1bmlvbiIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva191bmlvbjsgICAgICAgICAgICAgICAgfQorImV4Y2VwdGlvbiIgICAgICAgICAgeyByZXR1cm4gdG9rX3hjZXB0aW9uOyAgICAgICAgICAgICB9CisiZXh0ZW5kcyIgICAgICAgICAgICB7IHJldHVybiB0b2tfZXh0ZW5kczsgICAgICAgICAgICAgIH0KKyJ0aHJvd3MiICAgICAgICAgICAgIHsgcmV0dXJuIHRva190aHJvd3M7ICAgICAgICAgICAgICAgfQorInNlcnZpY2UiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NlcnZpY2U7ICAgICAgICAgICAgICB9CisiZW51bSIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfZW51bTsgICAgICAgICAgICAgICAgIH0KKyJjb25zdCIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19jb25zdDsgICAgICAgICAgICAgICAgfQorInJlcXVpcmVkIiAgICAgICAgICAgeyByZXR1cm4gdG9rX3JlcXVpcmVkOyAgICAgICAgICAgICB9Cisib3B0aW9uYWwiICAgICAgICAgICB7IHJldHVybiB0b2tfb3B0aW9uYWw7ICAgICAgICAgICAgIH0KKyJhc3luYyIgeworICBwd2FybmluZygwLCAiXCJhc3luY1wiIGlzIGRlcHJlY2F0ZWQuICBJdCBpcyBjYWxsZWQgXCJvbmV3YXlcIiBub3cuXG4iKTsKKyAgcmV0dXJuIHRva19vbmV3YXk7Cit9CisiJiIgICAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfcmVmZXJlbmNlOyAgICAgICAgICAgIH0KKwore2ludGNvbnN0YW50fSB7CisgIGVycm5vID0gMDsKKyAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0LCBOVUxMLCAxMCk7CisgIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKyAgICBpbnRlZ2VyX292ZXJmbG93KHl5dGV4dCk7CisgIH0KKyAgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7Cit9CisKK3toZXhjb25zdGFudH0geworICBlcnJubyA9IDA7CisgIGNoYXIgc2lnbiA9IHl5dGV4dFswXTsKKyAgaW50IHNoaWZ0ID0gc2lnbiA9PSAnMCcgPyAyIDogMzsKKyAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0K3NoaWZ0LCBOVUxMLCAxNik7CisgIGlmIChzaWduID09ICctJykgeworICAgIHl5bHZhbC5pY29uc3QgPSAteXlsdmFsLmljb25zdDsKKyAgfQorICBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgaW50ZWdlcl9vdmVyZmxvdyh5eXRleHQpOworICB9CisgIHJldHVybiB0b2tfaW50X2NvbnN0YW50OworfQorCit7aWRlbnRpZmllcn0geworICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKKyAgcmV0dXJuIHRva19pZGVudGlmaWVyOworfQorCit7ZHViY29uc3RhbnR9IHsKKyAvKiBEZWxpYmVyYXRlbHkgcGxhY2VkIGFmdGVyIGlkZW50aWZpZXIsIHNpbmNlICJlMTAiIGlzIE5PVCBhIGRvdWJsZSBsaXRlcmFsIChUSFJJRlQtMzQ3NykgKi8KKyAgeXlsdmFsLmRjb25zdCA9IGF0b2YoeXl0ZXh0KTsKKyAgcmV0dXJuIHRva19kdWJfY29uc3RhbnQ7Cit9CisKK3tsaXRlcmFsX2JlZ2lufSB7CisgIGNoYXIgbWFyayA9IHl5dGV4dFswXTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBmb3IoOzspCisgIHsKKyAgICBpbnQgY2ggPSB5eWlucHV0KCk7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSBFT0Y6CisgICAgICAgIHl5ZXJyb3IoIkVuZCBvZiBmaWxlIHdoaWxlIHJlYWQgc3RyaW5nIGF0ICVkXG4iLCB5eWxpbmVubyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICdcbic6CisgICAgICAgIHl5ZXJyb3IoIkVuZCBvZiBsaW5lIHdoaWxlIHJlYWQgc3RyaW5nIGF0ICVkXG4iLCB5eWxpbmVubyAtIDEpOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnXFwnOgorICAgICAgICBjaCA9IHl5aW5wdXQoKTsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXHInKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXG4nKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXHQnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnIicpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXCcnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xcJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeXllcnJvcigiQmFkIGVzY2FwZSBjaGFyYWN0ZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGNoID09IG1hcmspIHsKKyAgICAgICAgICB5eWx2YWwuaWQgPSBzdHJkdXAocmVzdWx0LmNfc3RyKCkpOworICAgICAgICAgIHJldHVybiB0b2tfbGl0ZXJhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGNoKTsKKyAgICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy4geworICB1bmV4cGVjdGVkX3Rva2VuKHl5dGV4dCk7Cit9CisKKyUlCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorI2VuZGlmCisKKy8qIHZpbTogZmlsZXR5cGU9bGV4CisqLwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS55eSBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzNGFkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkKQEAgLTAsMCArMSwxMjAxIEBACislY29kZSByZXF1aXJlcyB7CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorfQorJXsKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUaHJpZnQgcGFyc2VyLgorICoKKyAqIFRoaXMgcGFyc2VyIGlzIHVzZWQgb24gYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9fU1REQ19MSU1JVF9NQUNST1MKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2VuZGlmCisjaWZuZGVmIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmbmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlICJ0aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Njb3BlLmgiCisKKyNpZmRlZiBfTVNDX1ZFUgorLy93YXJuaW5nIEM0MDY1OiBzd2l0Y2ggc3RhdGVtZW50IGNvbnRhaW5zICdkZWZhdWx0JyBidXQgbm8gJ2Nhc2UnIGxhYmVscworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDA2NSkKKyNlbmRpZgorCisvKioKKyAqIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGF1dG9tYXRpYyBudW1iZXJpbmcgb2YgZmllbGQgaW5kaWNlcyBldGMuCisgKiB3aGVuIHBhcnNpbmcgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuIEZpZWxkIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseQorICogYXNzaWduZWQgc3RhcnRpbmcgZnJvbSAtMSBhbmQgd29ya2luZyB0aGVpciB3YXkgZG93bi4KKyAqLworaW50IHlfZmllbGRfdmFsID0gLTE7CisvKioKKyAqIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGF1dG9tYXRpYyBudW1iZXJpbmcgb2YgZW51bSB2YWx1ZXMuCisgKiB5X2VudW1fdmFsIGlzIHRoZSBsYXN0IHZhbHVlIGFzc2lnbmVkOyB0aGUgbmV4dCBhdXRvLWFzc2lnbmVkIHZhbHVlIHdpbGwgYmUKKyAqIHlfZW51bV92YWwrMSwgYW5kIHRoZW4gaXQgY29udGludWVzIHdvcmtpbmcgdXB3YXJkcy4gIEV4cGxpY2l0bHkgc3BlY2lmaWVkCisgKiBlbnVtIHZhbHVlcyByZXNldCB5X2VudW1fdmFsIHRvIHRoYXQgdmFsdWUuCisgKi8KK2ludDMyX3QgeV9lbnVtX3ZhbCA9IC0xOworaW50IGdfYXJnbGlzdCA9IDA7Citjb25zdCBpbnQgc3RydWN0X2lzX3N0cnVjdCA9IDA7Citjb25zdCBpbnQgc3RydWN0X2lzX3VuaW9uID0gMTsKKworJX0KKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gaG9sZCB0aGUgZGF0YSB0eXBlcyBhc3NvY2lhdGVkIHdpdGgKKyAqIHZhcmlvdXMgcGFyc2Ugbm9kZXMuCisgKi8KKyV1bmlvbiB7CisgIGNoYXIqICAgICAgICAgIGlkOworICBpbnQ2NF90ICAgICAgICBpY29uc3Q7CisgIGRvdWJsZSAgICAgICAgIGRjb25zdDsKKyAgYm9vbCAgICAgICAgICAgdGJvb2w7CisgIHRfZG9jKiAgICAgICAgIHRkb2M7CisgIHRfdHlwZSogICAgICAgIHR0eXBlOworICB0X2Jhc2VfdHlwZSogICB0YmFzZTsKKyAgdF90eXBlZGVmKiAgICAgdHR5cGVkZWY7CisgIHRfZW51bSogICAgICAgIHRlbnVtOworICB0X2VudW1fdmFsdWUqICB0ZW51bXY7CisgIHRfY29uc3QqICAgICAgIHRjb25zdDsKKyAgdF9jb25zdF92YWx1ZSogdGNvbnN0djsKKyAgdF9zdHJ1Y3QqICAgICAgdHN0cnVjdDsKKyAgdF9zZXJ2aWNlKiAgICAgdHNlcnZpY2U7CisgIHRfZnVuY3Rpb24qICAgIHRmdW5jdGlvbjsKKyAgdF9maWVsZCogICAgICAgdGZpZWxkOworICBjaGFyKiAgICAgICAgICBkdGV4dDsKKyAgdF9maWVsZDo6ZV9yZXEgZXJlcTsKKyAgdF9hbm5vdGF0aW9uKiAgdGFubm90OworICB0X2ZpZWxkX2lkICAgICB0ZmllbGRpZDsKK30KKworLyoqCisgKiBTdHJpbmdzIGlkZW50aWZpZXIKKyAqLworJXRva2VuPGlkPiAgICAgdG9rX2lkZW50aWZpZXIKKyV0b2tlbjxpZD4gICAgIHRva19saXRlcmFsCisldG9rZW48ZHRleHQ+ICB0b2tfZG9jdGV4dAorCisvKioKKyAqIENvbnN0YW50IHZhbHVlcworICovCisldG9rZW48aWNvbnN0PiB0b2tfaW50X2NvbnN0YW50CisldG9rZW48ZGNvbnN0PiB0b2tfZHViX2NvbnN0YW50CisKKy8qKgorICogSGVhZGVyIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfaW5jbHVkZQorJXRva2VuIHRva19uYW1lc3BhY2UKKyV0b2tlbiB0b2tfY3BwX2luY2x1ZGUKKyV0b2tlbiB0b2tfY3BwX3R5cGUKKyV0b2tlbiB0b2tfeHNkX2FsbAorJXRva2VuIHRva194c2Rfb3B0aW9uYWwKKyV0b2tlbiB0b2tfeHNkX25pbGxhYmxlCisldG9rZW4gdG9rX3hzZF9hdHRycworCisvKioKKyAqIEJhc2UgZGF0YXR5cGUga2V5d29yZHMKKyAqLworJXRva2VuIHRva192b2lkCisldG9rZW4gdG9rX2Jvb2wKKyV0b2tlbiB0b2tfc3RyaW5nCisldG9rZW4gdG9rX2JpbmFyeQorJXRva2VuIHRva19zbGlzdAorJXRva2VuIHRva19zZW51bQorJXRva2VuIHRva19pOAorJXRva2VuIHRva19pMTYKKyV0b2tlbiB0b2tfaTMyCisldG9rZW4gdG9rX2k2NAorJXRva2VuIHRva19kb3VibGUKKworLyoqCisgKiBDb21wbGV4IHR5cGUga2V5d29yZHMKKyAqLworJXRva2VuIHRva19tYXAKKyV0b2tlbiB0b2tfbGlzdAorJXRva2VuIHRva19zZXQKKworLyoqCisgKiBGdW5jdGlvbiBtb2RpZmllcnMKKyAqLworJXRva2VuIHRva19vbmV3YXkKKworLyoqCisgKiBUaHJpZnQgbGFuZ3VhZ2Uga2V5d29yZHMKKyAqLworJXRva2VuIHRva190eXBlZGVmCisldG9rZW4gdG9rX3N0cnVjdAorJXRva2VuIHRva194Y2VwdGlvbgorJXRva2VuIHRva190aHJvd3MKKyV0b2tlbiB0b2tfZXh0ZW5kcworJXRva2VuIHRva19zZXJ2aWNlCisldG9rZW4gdG9rX2VudW0KKyV0b2tlbiB0b2tfY29uc3QKKyV0b2tlbiB0b2tfcmVxdWlyZWQKKyV0b2tlbiB0b2tfb3B0aW9uYWwKKyV0b2tlbiB0b2tfdW5pb24KKyV0b2tlbiB0b2tfcmVmZXJlbmNlCisKKy8qKgorICogR3JhbW1hciBub2RlcworICovCisKKyV0eXBlPHR0eXBlPiAgICAgQmFzZVR5cGUKKyV0eXBlPHR0eXBlPiAgICAgU2ltcGxlQmFzZVR5cGUKKyV0eXBlPHR0eXBlPiAgICAgQ29udGFpbmVyVHlwZQorJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVDb250YWluZXJUeXBlCisldHlwZTx0dHlwZT4gICAgIE1hcFR5cGUKKyV0eXBlPHR0eXBlPiAgICAgU2V0VHlwZQorJXR5cGU8dHR5cGU+ICAgICBMaXN0VHlwZQorCisldHlwZTx0ZG9jPiAgICAgIERlZmluaXRpb24KKyV0eXBlPHR0eXBlPiAgICAgVHlwZURlZmluaXRpb24KKworJXR5cGU8dHR5cGVkZWY+ICBUeXBlZGVmCisKKyV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25zCisldHlwZTx0dHlwZT4gICAgIFR5cGVBbm5vdGF0aW9uTGlzdAorJXR5cGU8dGFubm90PiAgICBUeXBlQW5ub3RhdGlvbgorJXR5cGU8aWQ+ICAgICAgICBUeXBlQW5ub3RhdGlvblZhbHVlCisKKyV0eXBlPHRmaWVsZD4gICAgRmllbGQKKyV0eXBlPHRmaWVsZGlkPiAgRmllbGRJZGVudGlmaWVyCisldHlwZTxlcmVxPiAgICAgIEZpZWxkUmVxdWlyZWRuZXNzCisldHlwZTx0dHlwZT4gICAgIEZpZWxkVHlwZQorJXR5cGU8dGNvbnN0dj4gICBGaWVsZFZhbHVlCisldHlwZTx0c3RydWN0PiAgIEZpZWxkTGlzdAorJXR5cGU8dGJvb2w+ICAgICBGaWVsZFJlZmVyZW5jZQorCisldHlwZTx0ZW51bT4gICAgIEVudW0KKyV0eXBlPHRlbnVtPiAgICAgRW51bURlZkxpc3QKKyV0eXBlPHRlbnVtdj4gICAgRW51bURlZgorJXR5cGU8dGVudW12PiAgICBFbnVtVmFsdWUKKworJXR5cGU8dHR5cGVkZWY+ICBTZW51bQorJXR5cGU8dGJhc2U+ICAgICBTZW51bURlZkxpc3QKKyV0eXBlPGlkPiAgICAgICAgU2VudW1EZWYKKworJXR5cGU8dGNvbnN0PiAgICBDb25zdAorJXR5cGU8dGNvbnN0dj4gICBDb25zdFZhbHVlCisldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdAorJXR5cGU8dGNvbnN0dj4gICBDb25zdExpc3RDb250ZW50cworJXR5cGU8dGNvbnN0dj4gICBDb25zdE1hcAorJXR5cGU8dGNvbnN0dj4gICBDb25zdE1hcENvbnRlbnRzCisKKyV0eXBlPGljb25zdD4gICAgU3RydWN0SGVhZAorJXR5cGU8dHN0cnVjdD4gICBTdHJ1Y3QKKyV0eXBlPHRzdHJ1Y3Q+ICAgWGNlcHRpb24KKyV0eXBlPHRzZXJ2aWNlPiAgU2VydmljZQorCisldHlwZTx0ZnVuY3Rpb24+IEZ1bmN0aW9uCisldHlwZTx0dHlwZT4gICAgIEZ1bmN0aW9uVHlwZQorJXR5cGU8dHNlcnZpY2U+ICBGdW5jdGlvbkxpc3QKKworJXR5cGU8dHN0cnVjdD4gICBUaHJvd3MKKyV0eXBlPHRzZXJ2aWNlPiAgRXh0ZW5kcworJXR5cGU8dGJvb2w+ICAgICBPbmV3YXkKKyV0eXBlPHRib29sPiAgICAgWHNkQWxsCisldHlwZTx0Ym9vbD4gICAgIFhzZE9wdGlvbmFsCisldHlwZTx0Ym9vbD4gICAgIFhzZE5pbGxhYmxlCisldHlwZTx0c3RydWN0PiAgIFhzZEF0dHJpYnV0ZXMKKyV0eXBlPGlkPiAgICAgICAgQ3BwVHlwZQorCisldHlwZTxkdGV4dD4gICAgIENhcHR1cmVEb2NUZXh0CisKKyUlCisKKy8qKgorICogVGhyaWZ0IEdyYW1tYXIgSW1wbGVtZW50YXRpb24uCisgKgorICogRm9yIHRoZSBtb3N0IHBhcnQgdGhpcyBzb3VyY2UgZmlsZSB3b3JrcyBpdHMgd2F5IHRvcCBkb3duIGZyb20gd2hhdCB5b3UKKyAqIG1pZ2h0IGV4cGVjdCB0byBmaW5kIGluIGEgdHlwaWNhbCAudGhyaWZ0IGZpbGUsIGkuZS4gdHlwZSBkZWZpbml0aW9ucyBhbmQKKyAqIG5hbWVzcGFjZXMgdXAgdG9wIGZvbGxvd2VkIGJ5IHNlcnZpY2UgZGVmaW5pdGlvbnMgdXNpbmcgdGhvc2UgdHlwZXMuCisgKi8KKworUHJvZ3JhbToKKyAgSGVhZGVyTGlzdCBEZWZpbml0aW9uTGlzdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiUHJvZ3JhbSAtPiBIZWFkZXJzIERlZmluaXRpb25MaXN0Iik7CisgICAgICBpZigoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgIT0gQUxSRUFEWV9QUk9DRVNTRUQpKQorICAgICAgeworICAgICAgICBnX3Byb2dyYW0tPnNldF9kb2MoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlKTsKKyAgICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUxSRUFEWV9QUk9DRVNTRUQ7CisgICAgICB9CisgICAgICBjbGVhcl9kb2N0ZXh0KCk7CisgICAgfQorCitDYXB0dXJlRG9jVGV4dDoKKyAgICB7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgJCQgPSBnX2RvY3RleHQ7CisgICAgICAgIGdfZG9jdGV4dCA9IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9IE5VTEw7CisgICAgICB9CisgICAgfQorCisvKiBUT0RPKGRyZWlzcyk6IFRyeSB0byBEZXN0cm95RG9jVGV4dCBpbiBhbGwgc29ydHMgb3IgcmFuZG9tIHBsYWNlcy4gKi8KK0Rlc3Ryb3lEb2NUZXh0OgorICAgIHsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBjbGVhcl9kb2N0ZXh0KCk7CisgICAgICB9CisgICAgfQorCisvKiBXZSBoYXZlIHRvIERlc3Ryb3lEb2NUZXh0IGhlcmUsIG90aGVyd2lzZSBpdCBjYXRjaGVzIHRoZSBkb2N0ZXh0CisgICBvbiB0aGUgZmlyc3QgcmVhbCBlbGVtZW50LiAqLworSGVhZGVyTGlzdDoKKyAgSGVhZGVyTGlzdCBEZXN0cm95RG9jVGV4dCBIZWFkZXIKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gSGVhZGVyTGlzdCBIZWFkZXIiKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+ICIpOworICAgIH0KKworSGVhZGVyOgorICBJbmNsdWRlCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gSW5jbHVkZSIpOworICAgIH0KK3wgdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIHRva19pZGVudGlmaWVyIik7CisgICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgkMiwgJDMpOworICAgICAgfQorICAgICAgaWYgKCQ0ICE9IE5VTEwpIHsKKyAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKCQyLCAkNC0+YW5ub3RhdGlvbnNfKTsKKyAgICAgICAgZGVsZXRlICQ0OworICAgICAgfQorICAgIH0KK3wgdG9rX25hbWVzcGFjZSAnKicgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfbmFtZXNwYWNlICogdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCIqIiwgJDMpOworICAgICAgfQorICAgIH0KK3wgdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsIik7CisgICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2NwcF9pbmNsdWRlKCQyKTsKKyAgICAgIH0KKyAgICB9CisKK0luY2x1ZGU6CisgIHRva19pbmNsdWRlIHRva19saXRlcmFsCisgICAgeworICAgICAgcGRlYnVnKCJJbmNsdWRlIC0+IHRva19pbmNsdWRlIHRva19saXRlcmFsIik7CisgICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgeworICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gaW5jbHVkZV9maWxlKHN0ZDo6c3RyaW5nKCQyKSk7CisgICAgICAgIGlmICghcGF0aC5lbXB0eSgpKSB7CisgICAgICAgICAgZ19wcm9ncmFtLT5hZGRfaW5jbHVkZShwYXRoLCBzdGQ6OnN0cmluZygkMikpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCitEZWZpbml0aW9uTGlzdDoKKyAgRGVmaW5pdGlvbkxpc3QgQ2FwdHVyZURvY1RleHQgRGVmaW5pdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbkxpc3QgLT4gRGVmaW5pdGlvbkxpc3QgRGVmaW5pdGlvbiIpOworICAgICAgaWYgKCQyICE9IE5VTEwgJiYgJDMgIT0gTlVMTCkgeworICAgICAgICAkMy0+c2V0X2RvYygkMik7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbkxpc3QgLT4gIik7CisgICAgfQorCitEZWZpbml0aW9uOgorICBDb25zdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBDb25zdCIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2NvbnN0KCQxKTsKKyAgICAgIH0KKyAgICAgICQkID0gJDE7CisgICAgfQorfCBUeXBlRGVmaW5pdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBUeXBlRGVmaW5pdGlvbiIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfc2NvcGUtPmFkZF90eXBlKCQxLT5nZXRfbmFtZSgpLCAkMSk7CisgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF90eXBlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEgZ19wcm9ncmFtLT5pc191bmlxdWVfdHlwZW5hbWUoJDEpKSB7CisgICAgICAgICAgeXllcnJvcigiVHlwZSBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiIsICQxLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICQkID0gJDE7CisgICAgfQorfCBTZXJ2aWNlCisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFNlcnZpY2UiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Njb3BlLT5hZGRfc2VydmljZSgkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgeworICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfc2VydmljZShnX3BhcmVudF9wcmVmaXggKyAkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICB9CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3NlcnZpY2UoJDEpOworICAgICAgICBpZiAoISBnX3Byb2dyYW0tPmlzX3VuaXF1ZV90eXBlbmFtZSgkMSkpIHsKKyAgICAgICAgICB5eWVycm9yKCJUeXBlIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQuIiwgJDEtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgJCQgPSAkMTsKKyAgICB9CisKK1R5cGVEZWZpbml0aW9uOgorICBUeXBlZGVmCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBUeXBlZGVmIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfdHlwZWRlZigkMSk7CisgICAgICB9CisgICAgfQorfCBFbnVtCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBFbnVtIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfZW51bSgkMSk7CisgICAgICB9CisgICAgfQorfCBTZW51bQorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gU2VudW0iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKKyAgICAgIH0KKyAgICB9Cit8IFN0cnVjdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gU3RydWN0Iik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfc3RydWN0KCQxKTsKKyAgICAgIH0KKyAgICB9Cit8IFhjZXB0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBYY2VwdGlvbiIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3hjZXB0aW9uKCQxKTsKKyAgICAgIH0KKyAgICB9CisKK0NvbW1hT3JTZW1pY29sb25PcHRpb25hbDoKKyAgJywnCisgICAge30KK3wgJzsnCisgICAge30KK3wKKyAgICB7fQorCitUeXBlZGVmOgorICB0b2tfdHlwZWRlZiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZiAtPiB0b2tfdHlwZWRlZiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMyk7CisgICAgICB0X3R5cGVkZWYgKnRkID0gbmV3IHRfdHlwZWRlZihnX3Byb2dyYW0sICQyLCAkMyk7CisgICAgICAkJCA9IHRkOworICAgICAgaWYgKCQ0ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ0LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNDsKKyAgICAgIH0KKyAgICB9CisKK0VudW06CisgIHRva19lbnVtIHRva19pZGVudGlmaWVyICd7JyBFbnVtRGVmTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJFbnVtIC0+IHRva19lbnVtIHRva19pZGVudGlmaWVyIHsgRW51bURlZkxpc3QgfSIpOworICAgICAgJCQgPSAkNDsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkJC0+c2V0X25hbWUoJDIpOworICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ2LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNjsKKyAgICAgIH0KKworICAgICAgLy8gbWFrZSBjb25zdGFudHMgZm9yIGFsbCB0aGUgZW51bSB2YWx1ZXMKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSAkJC0+Z2V0X2NvbnN0YW50cygpOworICAgICAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdF9uYW1lID0gJCQtPmdldF9uYW1lKCkgKyAiLiIgKyAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsID0gbmV3IHRfY29uc3RfdmFsdWUoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSgkJCk7CisgICAgICAgICAgZ19zY29wZS0+YWRkX2NvbnN0YW50KGNvbnN0X25hbWUsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgY29uc3RfdmFsKSk7CisgICAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgY29uc3RfbmFtZSwgbmV3IHRfY29uc3QoZ190eXBlX2kzMiwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCBjb25zdF92YWwpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKK0VudW1EZWZMaXN0OgorICBFbnVtRGVmTGlzdCBFbnVtRGVmCisgICAgeworICAgICAgcGRlYnVnKCJFbnVtRGVmTGlzdCAtPiBFbnVtRGVmTGlzdCBFbnVtRGVmIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFwcGVuZCgkMik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gIik7CisgICAgICAkJCA9IG5ldyB0X2VudW0oZ19wcm9ncmFtKTsKKyAgICAgIHlfZW51bV92YWwgPSAtMTsKKyAgICB9CisKK0VudW1EZWY6CisgIENhcHR1cmVEb2NUZXh0IEVudW1WYWx1ZSBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJFbnVtRGVmIC0+IEVudW1WYWx1ZSIpOworICAgICAgJCQgPSAkMjsKKyAgICAgIGlmICgkMSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5zZXRfZG9jKCQxKTsKKyAgICAgIH0KKwkgIGlmICgkMyAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMy0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDM7CisgICAgICB9CisgICAgfQorCitFbnVtVmFsdWU6CisgIHRva19pZGVudGlmaWVyICc9JyB0b2tfaW50X2NvbnN0YW50CisgICAgeworICAgICAgcGRlYnVnKCJFbnVtVmFsdWUgLT4gdG9rX2lkZW50aWZpZXIgPSB0b2tfaW50X2NvbnN0YW50Iik7CisgICAgICBpZiAoJDMgPCBJTlQzMl9NSU4gfHwgJDMgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgLy8gTm90ZTogdGhpcyB1c2VkIHRvIGJlIGp1c3QgYSB3YXJuaW5nLiAgSG93ZXZlciwgc2luY2UgdGhyaWZ0IGFsd2F5cworICAgICAgICAvLyB0cmVhdHMgZW51bXMgYXMgaTMyIHZhbHVlcywgSSdtIGNoYW5naW5nIGl0IHRvIGEgZmF0YWwgZXJyb3IuCisgICAgICAgIC8vIEkgZG91YnQgdGhpcyB3aWxsIGFmZmVjdCBtYW55IHBlb3BsZSwgYnV0IHVzZXJzIHdobyBydW4gaW50byB0aGlzCisgICAgICAgIC8vIHdpbGwgaGF2ZSB0byB1cGRhdGUgdGhlaXIgdGhyaWZ0IGZpbGVzIHRvIG1hbnVhbGx5IHNwZWNpZnkgdGhlCisgICAgICAgIC8vIHRydW5jYXRlZCBpMzIgdmFsdWUgdGhhdCB0aHJpZnQgaGFzIGFsd2F5cyBiZWVuIHVzaW5nIGFueXdheS4KKyAgICAgICAgZmFpbHVyZSgiNjQtYml0IHZhbHVlIHN1cHBsaWVkIGZvciBlbnVtICVzIHdpbGwgYmUgdHJ1bmNhdGVkLiIsICQxKTsKKyAgICAgIH0KKyAgICAgIHlfZW51bV92YWwgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMyk7CisgICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDEsIHlfZW51bV92YWwpOworICAgIH0KKyB8CisgIHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJFbnVtVmFsdWUgLT4gdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMSk7CisgICAgICBpZiAoeV9lbnVtX3ZhbCA9PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgZmFpbHVyZSgiZW51bSB2YWx1ZSBvdmVyZmxvdyBhdCBlbnVtICVzIiwgJDEpOworICAgICAgfQorICAgICAgKyt5X2VudW1fdmFsOworICAgICAgJCQgPSBuZXcgdF9lbnVtX3ZhbHVlKCQxLCB5X2VudW1fdmFsKTsKKyAgICB9CisKK1NlbnVtOgorICB0b2tfc2VudW0gdG9rX2lkZW50aWZpZXIgJ3snIFNlbnVtRGVmTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJTZW51bSAtPiB0b2tfc2VudW0gdG9rX2lkZW50aWZpZXIgeyBTZW51bURlZkxpc3QgfSIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQkID0gbmV3IHRfdHlwZWRlZihnX3Byb2dyYW0sICQ0LCAkMik7CisgICAgICBpZiAoJDYgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ2OworICAgICAgfQorICAgIH0KKworU2VudW1EZWZMaXN0OgorICBTZW51bURlZkxpc3QgU2VudW1EZWYKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtRGVmTGlzdCAtPiBTZW51bURlZkxpc3QgU2VudW1EZWYiKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YWRkX3N0cmluZ19lbnVtX3ZhbCgkMik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+ICIpOworICAgICAgJCQgPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICAgICAkJC0+c2V0X3N0cmluZ19lbnVtKHRydWUpOworICAgIH0KKworU2VudW1EZWY6CisgIHRva19saXRlcmFsIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VudW1EZWYgLT4gdG9rX2xpdGVyYWwiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitDb25zdDoKKyAgdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciAnPScgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0IC0+IHRva19jb25zdCBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgPSBDb25zdFZhbHVlIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQzKTsKKyAgICAgICAgZ19zY29wZS0+cmVzb2x2ZV9jb25zdF92YWx1ZSgkNSwgJDIpOworICAgICAgICAkJCA9IG5ldyB0X2NvbnN0KCQyLCAkMywgJDUpOworICAgICAgICB2YWxpZGF0ZV9jb25zdF90eXBlKCQkKTsKKworICAgICAgICBnX3Njb3BlLT5hZGRfY29uc3RhbnQoJDMsICQkKTsKKyAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX2NvbnN0YW50KGdfcGFyZW50X3ByZWZpeCArICQzLCAkJCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKK0NvbnN0VmFsdWU6CisgIHRva19pbnRfY29uc3RhbnQKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2ludF9jb25zdGFudCIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9pbnRlZ2VyKCQxKTsKKyAgICAgIGlmICghZ19hbGxvd182NGJpdF9jb25zdHMgJiYgKCQxIDwgSU5UMzJfTUlOIHx8ICQxID4gSU5UMzJfTUFYKSkgeworICAgICAgICBwd2FybmluZygxLCAiNjQtYml0IGNvbnN0YW50IFwiJSIgUFJJaTY0IlwiIG1heSBub3Qgd29yayBpbiBhbGwgbGFuZ3VhZ2VzLlxuIiwgJDEpOworICAgICAgfQorICAgIH0KK3wgdG9rX2R1Yl9jb25zdGFudAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfZHViX2NvbnN0YW50Iik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X2RvdWJsZSgkMSk7CisgICAgfQorfCB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfbGl0ZXJhbCIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgkMSk7CisgICAgfQorfCB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaWRlbnRpZmllciIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9pZGVudGlmaWVyKCQxKTsKKyAgICB9Cit8IENvbnN0TGlzdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiBDb25zdExpc3QiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCBDb25zdE1hcAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiBDb25zdE1hcCIpOworICAgICAgJCQgPSAkMTsKKyAgICB9CisKK0NvbnN0TGlzdDoKKyAgJ1snIENvbnN0TGlzdENvbnRlbnRzICddJworICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0ID0+IFsgQ29uc3RMaXN0Q29udGVudHMgXSIpOworICAgICAgJCQgPSAkMjsKKyAgICB9CisKK0NvbnN0TGlzdENvbnRlbnRzOgorICBDb25zdExpc3RDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0Q29udGVudHMgPT4gQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwiKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YWRkX2xpc3QoJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+Iik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X2xpc3QoKTsKKyAgICB9CisKK0NvbnN0TWFwOgorICAneycgQ29uc3RNYXBDb250ZW50cyAnfScKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TWFwID0+IHsgQ29uc3RNYXBDb250ZW50cyB9Iik7CisgICAgICAkJCA9ICQyOworICAgIH0KKworQ29uc3RNYXBDb250ZW50czoKKyAgQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlICc6JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiBDb25zdE1hcENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFkZF9tYXAoJDIsICQ0KTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdE1hcENvbnRlbnRzID0+Iik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X21hcCgpOworICAgIH0KKworU3RydWN0SGVhZDoKKyAgdG9rX3N0cnVjdAorICAgIHsKKyAgICAgICQkID0gc3RydWN0X2lzX3N0cnVjdDsKKyAgICB9Cit8IHRva191bmlvbgorICAgIHsKKyAgICAgICQkID0gc3RydWN0X2lzX3VuaW9uOworICAgIH0KKworU3RydWN0OgorICBTdHJ1Y3RIZWFkIHRva19pZGVudGlmaWVyIFhzZEFsbCAneycgRmllbGRMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIlN0cnVjdCAtPiB0b2tfc3RydWN0IHRva19pZGVudGlmaWVyIHsgRmllbGRMaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkNS0+c2V0X3hzZF9hbGwoJDMpOworICAgICAgJDUtPnNldF91bmlvbigkMSA9PSBzdHJ1Y3RfaXNfdW5pb24pOworICAgICAgJCQgPSAkNTsKKyAgICAgICQkLT5zZXRfbmFtZSgkMik7CisgICAgICBpZiAoJDcgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDctPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ3OworICAgICAgfQorICAgIH0KKworWHNkQWxsOgorICB0b2tfeHNkX2FsbAorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1hzZE9wdGlvbmFsOgorICB0b2tfeHNkX29wdGlvbmFsCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IGZhbHNlOworICAgIH0KKworWHNkTmlsbGFibGU6CisgIHRva194c2RfbmlsbGFibGUKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gZmFsc2U7CisgICAgfQorCitYc2RBdHRyaWJ1dGVzOgorICB0b2tfeHNkX2F0dHJzICd7JyBGaWVsZExpc3QgJ30nCisgICAgeworICAgICAgJCQgPSAkMzsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworWGNlcHRpb246CisgIHRva194Y2VwdGlvbiB0b2tfaWRlbnRpZmllciAneycgRmllbGRMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIlhjZXB0aW9uIC0+IHRva194Y2VwdGlvbiB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJDQtPnNldF9uYW1lKCQyKTsKKyAgICAgICQ0LT5zZXRfeGNlcHRpb24odHJ1ZSk7CisgICAgICAkJCA9ICQ0OworICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ2LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNjsKKyAgICAgIH0KKyAgICB9CisKK1NlcnZpY2U6CisgIHRva19zZXJ2aWNlIHRva19pZGVudGlmaWVyIEV4dGVuZHMgJ3snIEZsYWdBcmdzIEZ1bmN0aW9uTGlzdCBVbmZsYWdBcmdzICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIlNlcnZpY2UgLT4gdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgeyBGdW5jdGlvbkxpc3QgfSIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQkID0gJDY7CisgICAgICAkJC0+c2V0X25hbWUoJDIpOworICAgICAgJCQtPnNldF9leHRlbmRzKCQzKTsKKyAgICAgIGlmICgkOSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkOS0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDk7CisgICAgICB9CisgICAgfQorCitGbGFnQXJnczoKKyAgICB7CisgICAgICAgZ19hcmdsaXN0ID0gMTsKKyAgICB9CisKK1VuZmxhZ0FyZ3M6CisgICAgeworICAgICAgIGdfYXJnbGlzdCA9IDA7CisgICAgfQorCitFeHRlbmRzOgorICB0b2tfZXh0ZW5kcyB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRXh0ZW5kcyAtPiB0b2tfZXh0ZW5kcyB0b2tfaWRlbnRpZmllciIpOworICAgICAgJCQgPSBOVUxMOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICQkID0gZ19zY29wZS0+Z2V0X3NlcnZpY2UoJDIpOworICAgICAgICBpZiAoJCQgPT0gTlVMTCkgeworICAgICAgICAgIHl5ZXJyb3IoIlNlcnZpY2UgXCIlc1wiIGhhcyBub3QgYmVlbiBkZWZpbmVkLiIsICQyKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK0Z1bmN0aW9uTGlzdDoKKyAgRnVuY3Rpb25MaXN0IEZ1bmN0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJGdW5jdGlvbkxpc3QgLT4gRnVuY3Rpb25MaXN0IEZ1bmN0aW9uIik7CisgICAgICAkJCA9ICQxOworICAgICAgJDEtPmFkZF9mdW5jdGlvbigkMik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+ICIpOworICAgICAgJCQgPSBuZXcgdF9zZXJ2aWNlKGdfcHJvZ3JhbSk7CisgICAgfQorCitGdW5jdGlvbjoKKyAgQ2FwdHVyZURvY1RleHQgT25ld2F5IEZ1bmN0aW9uVHlwZSB0b2tfaWRlbnRpZmllciAnKCcgRmllbGRMaXN0ICcpJyBUaHJvd3MgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkNCk7CisgICAgICAkNi0+c2V0X25hbWUoc3RkOjpzdHJpbmcoJDQpICsgIl9hcmdzIik7CisgICAgICAkJCA9IG5ldyB0X2Z1bmN0aW9uKCQzLCAkNCwgJDYsICQ4LCAkMik7CisgICAgICBpZiAoJDEgIT0gTlVMTCkgeworICAgICAgICAkJC0+c2V0X2RvYygkMSk7CisgICAgICB9CisgICAgICBpZiAoJDkgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDktPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ5OworICAgICAgfQorICAgIH0KKworT25ld2F5OgorICB0b2tfb25ld2F5CisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IGZhbHNlOworICAgIH0KKworVGhyb3dzOgorICB0b2tfdGhyb3dzICcoJyBGaWVsZExpc3QgJyknCisgICAgeworICAgICAgcGRlYnVnKCJUaHJvd3MgLT4gdG9rX3Rocm93cyAoIEZpZWxkTGlzdCApIik7CisgICAgICAkJCA9ICQzOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNICYmICF2YWxpZGF0ZV90aHJvd3MoJCQpKSB7CisgICAgICAgIHl5ZXJyb3IoIlRocm93cyBjbGF1c2UgbWF5IG5vdCBjb250YWluIG5vbi1leGNlcHRpb24gdHlwZXMiKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKKyAgICB9CisKK0ZpZWxkTGlzdDoKKyAgRmllbGRMaXN0IEZpZWxkCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZExpc3QgLT4gRmllbGRMaXN0ICwgRmllbGQiKTsKKyAgICAgICQkID0gJDE7CisgICAgICBpZiAoISgkJC0+YXBwZW5kKCQyKSkpIHsKKyAgICAgICAgeXllcnJvcigiXCIlZDogJXNcIiAtIGZpZWxkIGlkZW50aWZpZXIvbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQiLCAkMi0+Z2V0X2tleSgpLCAkMi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZExpc3QgLT4gIik7CisgICAgICB5X2ZpZWxkX3ZhbCA9IC0xOworICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKKyAgICB9CisKK0ZpZWxkOgorICBDYXB0dXJlRG9jVGV4dCBGaWVsZElkZW50aWZpZXIgRmllbGRSZXF1aXJlZG5lc3MgRmllbGRUeXBlIEZpZWxkUmVmZXJlbmNlIHRva19pZGVudGlmaWVyIEZpZWxkVmFsdWUgWHNkT3B0aW9uYWwgWHNkTmlsbGFibGUgWHNkQXR0cmlidXRlcyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJ0b2tfaW50X2NvbnN0YW50IDogRmllbGQgLT4gRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7CisgICAgICBpZiAoJDIuYXV0b19hc3NpZ25lZCkgeworICAgICAgICBwd2FybmluZygxLCAiTm8gZmllbGQga2V5IHNwZWNpZmllZCBmb3IgJXMsIHJlc3VsdGluZyBwcm90b2NvbCBtYXkgaGF2ZSBjb25mbGljdHMgb3Igbm90IGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIVxuIiwgJDYpOworICAgICAgICBpZiAoZ19zdHJpY3QgPj0gMTkyKSB7CisgICAgICAgICAgeXllcnJvcigiSW1wbGljaXQgZmllbGQga2V5cyBhcmUgZGVwcmVjYXRlZCBhbmQgbm90IGFsbG93ZWQgd2l0aCAtc3RyaWN0Iik7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoJDYpOworICAgICAgJCQgPSBuZXcgdF9maWVsZCgkNCwgJDYsICQyLnZhbHVlKTsKKyAgICAgICQkLT5zZXRfcmVmZXJlbmNlKCQ1KTsKKyAgICAgICQkLT5zZXRfcmVxKCQzKTsKKyAgICAgIGlmICgkNyAhPSBOVUxMKSB7CisgICAgICAgIGdfc2NvcGUtPnJlc29sdmVfY29uc3RfdmFsdWUoJDcsICQ0KTsKKyAgICAgICAgdmFsaWRhdGVfZmllbGRfdmFsdWUoJCQsICQ3KTsKKyAgICAgICAgJCQtPnNldF92YWx1ZSgkNyk7CisgICAgICB9CisgICAgICAkJC0+c2V0X3hzZF9vcHRpb25hbCgkOCk7CisgICAgICAkJC0+c2V0X3hzZF9uaWxsYWJsZSgkOSk7CisgICAgICBpZiAoJDEgIT0gTlVMTCkgeworICAgICAgICAkJC0+c2V0X2RvYygkMSk7CisgICAgICB9CisgICAgICBpZiAoJDEwICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF94c2RfYXR0cnMoJDEwKTsKKyAgICAgIH0KKyAgICAgIGlmICgkMTEgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDExLT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkMTE7CisgICAgICB9CisgICAgfQorCitGaWVsZElkZW50aWZpZXI6CisgIHRva19pbnRfY29uc3RhbnQgJzonCisgICAgeworICAgICAgaWYgKCQxIDw9IDApIHsKKyAgICAgICAgaWYgKGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMpIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgZXhpc3RzIHRvIGFsbG93IHVzZXJzIHRvIGFkZCBleHBsaWNpdGx5CisgICAgICAgICAgICogc3BlY2lmaWVkIGtleSB2YWx1ZXMgdG8gb2xkIC50aHJpZnQgZmlsZXMgd2l0aG91dCBicmVha2luZworICAgICAgICAgICAqIHByb3RvY29sIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCQxICE9IHlfZmllbGRfdmFsKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogd2FybiBpZiB0aGUgdXNlci1zcGVjaWZpZWQgbmVnYXRpdmUgdmFsdWUgaXNuJ3Qgd2hhdAorICAgICAgICAgICAgICogdGhyaWZ0IHdvdWxkIGhhdmUgYXV0by1hc3NpZ25lZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHdhcm5pbmcoMSwgIk5vbnBvc2l0aXZlIGZpZWxkIGtleSAoJSIgUFJJaTY0IikgZGlmZmVycyBmcm9tIHdoYXQgd291bGQgYmUgIgorICAgICAgICAgICAgICAgICAgICAgImF1dG8tYXNzaWduZWQgYnkgdGhyaWZ0ICglZCkuXG4iLCAkMSwgeV9maWVsZF92YWwpOworICAgICAgICAgIH0KKyAgICAgICAgICAvKgorICAgICAgICAgICAqIExlYXZlICQxIGFzLWlzLCBhbmQgdXBkYXRlIHlfZmllbGRfdmFsIHRvIGJlIG9uZSBsZXNzIHRoYW4gJDEuCisgICAgICAgICAgICogVGhlIEZpZWxkTGlzdCBwYXJzaW5nIHdpbGwgY2F0Y2ggYW55IGR1cGxpY2F0ZSBrZXkgdmFsdWVzLgorICAgICAgICAgICAqLworICAgICAgICAgIHlfZmllbGRfdmFsID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDEgLSAxKTsKKyAgICAgICAgICAkJC52YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxKTsKKyAgICAgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHdhcm5pbmcoMSwgIk5vbnBvc2l0aXZlIHZhbHVlICglZCkgbm90IGFsbG93ZWQgYXMgYSBmaWVsZCBrZXkuXG4iLAorICAgICAgICAgICAgICAgICAgICQxKTsKKyAgICAgICAgICAkJC52YWx1ZSA9IHlfZmllbGRfdmFsLS07CisgICAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkLnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDEpOworICAgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gZmFsc2U7CisgICAgICB9CisgICAgICBpZiggKFNIUlRfTUlOID4gJCQudmFsdWUpIHx8ICgkJC52YWx1ZSA+IFNIUlRfTUFYKSkgeworICAgICAgICBwd2FybmluZygxLCAiRmllbGQga2V5ICglZCkgZXhjZWVkcyBhbGxvd2VkIHJhbmdlICglZC4uJWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgJCQudmFsdWUsIFNIUlRfTUlOLCBTSFJUX01BWCk7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkLnZhbHVlID0geV9maWVsZF92YWwtLTsKKyAgICAgICQkLmF1dG9fYXNzaWduZWQgPSB0cnVlOworICAgICAgaWYoIChTSFJUX01JTiA+ICQkLnZhbHVlKSB8fCAoJCQudmFsdWUgPiBTSFJUX01BWCkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIkZpZWxkIGtleSAoJWQpIGV4Y2VlZHMgYWxsb3dlZCByYW5nZSAoJWQuLiVkKS5cbiIsCisgICAgICAgICAgICAgICAgICQkLnZhbHVlLCBTSFJUX01JTiwgU0hSVF9NQVgpOworICAgICAgfQorICAgIH0KKworRmllbGRSZWZlcmVuY2U6CisgIHRva19yZWZlcmVuY2UKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgeworICAgICAkJCA9IGZhbHNlOworICAgfQorCitGaWVsZFJlcXVpcmVkbmVzczoKKyAgdG9rX3JlcXVpcmVkCisgICAgeworICAgICAgJCQgPSB0X2ZpZWxkOjpUX1JFUVVJUkVEOworICAgIH0KK3wgdG9rX29wdGlvbmFsCisgICAgeworICAgICAgaWYgKGdfYXJnbGlzdCkgeworICAgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgICBwd2FybmluZygxLCAib3B0aW9uYWwga2V5d29yZCBpcyBpZ25vcmVkIGluIGFyZ3VtZW50IGxpc3RzLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7CisgICAgfQorCitGaWVsZFZhbHVlOgorICAnPScgQ29uc3RWYWx1ZQorICAgIHsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICAkJCA9ICQyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitGdW5jdGlvblR5cGU6CisgIEZpZWxkVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25UeXBlIC0+IEZpZWxkVHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IHRva192b2lkCisgICAgeworICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gdG9rX3ZvaWQiKTsKKyAgICAgICQkID0gZ190eXBlX3ZvaWQ7CisgICAgfQorCitGaWVsZFR5cGU6CisgIHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gSU5DTFVERVMpIHsKKyAgICAgICAgLy8gSWdub3JlIGlkZW50aWZpZXJzIGluIGluY2x1ZGUgbW9kZQorICAgICAgICAkJCA9IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBMb29rdXAgdGhlIGlkZW50aWZpZXIgaW4gdGhlIGN1cnJlbnQgc2NvcGUKKyAgICAgICAgJCQgPSBnX3Njb3BlLT5nZXRfdHlwZSgkMSk7CisgICAgICAgIGlmICgkJCA9PSBOVUxMKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBFaXRoZXIgdGhpcyB0eXBlIGlzbid0IHlldCBkZWNsYXJlZCwgb3IgaXQncyBuZXZlcgorICAgICAgICAgICAgIGRlY2xhcmVkLiAgRWl0aGVyIHdheSBhbGxvdyBpdCBhbmQgd2UnbGwgZmlndXJlIGl0IG91dAorICAgICAgICAgICAgIGR1cmluZyBnZW5lcmF0aW9uLgorICAgICAgICAgICAqLworICAgICAgICAgICQkID0gbmV3IHRfdHlwZWRlZihnX3Byb2dyYW0sICQxLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK3wgQmFzZVR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBCYXNlVHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IENvbnRhaW5lclR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiBDb250YWluZXJUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KKworQmFzZVR5cGU6IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zIik7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgqc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPigkMSkpOworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSAkMTsKKyAgICAgIH0KKyAgICB9CisKK1NpbXBsZUJhc2VUeXBlOgorICB0b2tfc3RyaW5nCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc3RyaW5nIik7CisgICAgICAkJCA9IGdfdHlwZV9zdHJpbmc7CisgICAgfQorfCB0b2tfYmluYXJ5CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYmluYXJ5Iik7CisgICAgICAkJCA9IGdfdHlwZV9iaW5hcnk7CisgICAgfQorfCB0b2tfc2xpc3QKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zbGlzdCIpOworICAgICAgJCQgPSBnX3R5cGVfc2xpc3Q7CisgICAgfQorfCB0b2tfYm9vbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2Jvb2wiKTsKKyAgICAgICQkID0gZ190eXBlX2Jvb2w7CisgICAgfQorfCB0b2tfaTgKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pOCIpOworICAgICAgJCQgPSBnX3R5cGVfaTg7CisgICAgfQorfCB0b2tfaTE2CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTE2Iik7CisgICAgICAkJCA9IGdfdHlwZV9pMTY7CisgICAgfQorfCB0b2tfaTMyCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTMyIik7CisgICAgICAkJCA9IGdfdHlwZV9pMzI7CisgICAgfQorfCB0b2tfaTY0CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTY0Iik7CisgICAgICAkJCA9IGdfdHlwZV9pNjQ7CisgICAgfQorfCB0b2tfZG91YmxlCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfZG91YmxlIik7CisgICAgICAkJCA9IGdfdHlwZV9kb3VibGU7CisgICAgfQorCitDb250YWluZXJUeXBlOiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29udGFpbmVyVHlwZSAtPiBTaW1wbGVDb250YWluZXJUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOworICAgICAgJCQgPSAkMTsKKyAgICAgIGlmICgkMiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDI7CisgICAgICB9CisgICAgfQorCitTaW1wbGVDb250YWluZXJUeXBlOgorICBNYXBUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IE1hcFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCBTZXRUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IFNldFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCBMaXN0VHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBMaXN0VHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9CisKK01hcFR5cGU6CisgIHRva19tYXAgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICcsJyBGaWVsZFR5cGUgJz4nCisgICAgeworICAgICAgcGRlYnVnKCJNYXBUeXBlIC0+IHRva19tYXAgPEZpZWxkVHlwZSwgRmllbGRUeXBlPiIpOworICAgICAgJCQgPSBuZXcgdF9tYXAoJDQsICQ2KTsKKyAgICAgIGlmICgkMiAhPSBOVUxMKSB7CisgICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7CisgICAgICB9CisgICAgfQorCitTZXRUeXBlOgorICB0b2tfc2V0IENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnPicKKyAgICB7CisgICAgICBwZGVidWcoIlNldFR5cGUgLT4gdG9rX3NldDxGaWVsZFR5cGU+Iik7CisgICAgICAkJCA9IG5ldyB0X3NldCgkNCk7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOworICAgICAgfQorICAgIH0KKworTGlzdFR5cGU6CisgIHRva19saXN0ICc8JyBGaWVsZFR5cGUgJz4nIENwcFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIkxpc3RUeXBlIC0+IHRva19saXN0PEZpZWxkVHlwZT4iKTsKKyAgICAgIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKCQzKTsKKyAgICAgICQkID0gbmV3IHRfbGlzdCgkMyk7CisgICAgICBpZiAoJDUgIT0gTlVMTCkgeworICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkNSkpOworICAgICAgfQorICAgIH0KKworQ3BwVHlwZToKKyAgdG9rX2NwcF90eXBlIHRva19saXRlcmFsCisgICAgeworICAgICAgJCQgPSAkMjsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworVHlwZUFubm90YXRpb25zOgorICAnKCcgVHlwZUFubm90YXRpb25MaXN0ICcpJworICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25zIC0+ICggVHlwZUFubm90YXRpb25MaXN0ICkiKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uTGlzdDoKKyAgVHlwZUFubm90YXRpb25MaXN0IFR5cGVBbm5vdGF0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbkxpc3QgLT4gVHlwZUFubm90YXRpb25MaXN0ICwgVHlwZUFubm90YXRpb24iKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YW5ub3RhdGlvbnNfWyQyLT5rZXldID0gJDItPnZhbDsKKyAgICAgIGRlbGV0ZSAkMjsKKyAgICB9Cit8CisgICAgeworICAgICAgLyogSnVzdCB1c2UgYSBkdW1teSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYW5ub3RhdGlvbnMuICovCisgICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOworICAgIH0KKworVHlwZUFubm90YXRpb246CisgIHRva19pZGVudGlmaWVyIFR5cGVBbm5vdGF0aW9uVmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbiAtPiBUeXBlQW5ub3RhdGlvblZhbHVlIik7CisgICAgICAkJCA9IG5ldyB0X2Fubm90YXRpb247CisgICAgICAkJC0+a2V5ID0gJDE7CisgICAgICAkJC0+dmFsID0gJDI7CisgICAgfQorCitUeXBlQW5ub3RhdGlvblZhbHVlOgorICAnPScgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uVmFsdWUgLT4gPSB0b2tfbGl0ZXJhbCIpOworICAgICAgJCQgPSAkMjsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvblZhbHVlIC0+Iik7CisgICAgICAkJCA9IHN0cmR1cCgiMSIpOworICAgIH0KKworJSUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbiBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYwNzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oLmluCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1ZFUlNJT05fSF8KKyNkZWZpbmUgX1RIUklGVF9WRVJTSU9OX0hfIDEKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjZGVmaW5lIFRIUklGVF9WRVJTSU9OICJAUEFDS0FHRV9WRVJTSU9OQCIKKworI2VuZGlmIC8vIF9USFJJRlRfVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNjljZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciAiVGhpcyBpcyBhIFdpbmRvd3MgaGVhZGVyIG9ubHkiCisjZW5kaWYKKworI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGlyZWN0Lmg+CisKKyNkZWZpbmUgc3RydG9sbChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkgX3N0cnRvaTY0KGJlZ2luX3B0ciwgZW5kX3B0ciwgbGVuZ3RoKQorCisjaWZuZGVmIFBSSXU2NAorI2RlZmluZSBQUkl1NjQgIkk2NHUiCisjZW5kaWYKKworI2lmbmRlZiBQUklpNjQKKyNkZWZpbmUgUFJJaTY0ICJJNjRpIgorI2VuZGlmCisvLyBzcXVlbGNoIGRlcHJlY2F0aW9uIHdhcm5pbmdzCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ5OTYpCisvLyBzcXVlbGNoIGJvb2wgY29udmVyc2lvbiBwZXJmb3JtYW5jZSB3YXJuaW5nCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ4MDApCisKKy8vIE1TVkMxMCAoMjAxMCkgb3IgbGF0ZXIgaGFzIHN0ZGludC5oCisjaWYgX01TQ19WRVIgPj0gMTYwMAorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKyNlbmRpZgorCisvLyBNdXN0IGJlIHVzaW5nIFZTMjAxMCBvciBsYXRlciwgb3IgYm9vc3QsIHNvIHRoYXQgQzk5IHR5cGVzIGFyZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxib29zdC9jc3RkaW50LmhwcD4KKwordHlwZWRlZiBib29zdDo6aW50NjRfdCBpbnQ2NF90OwordHlwZWRlZiBib29zdDo6dWludDY0X3QgdWludDY0X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQzMl90IGludDMyX3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50MzJfdCB1aW50MzJfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDE2X3QgaW50MTZfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQxNl90IHVpbnQxNl90OwordHlwZWRlZiBib29zdDo6aW50OF90IGludDhfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQ4X3QgdWludDhfdDsKKyNlbmRpZgorCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTgyNGQxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbAorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVGhyaWZ0IHNjYW5uZXIuCi0gKgotICogVG9rZW5pemVzIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KLSAqLwotCi0lewotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotCi0vKioKLSAqIE11c3QgYmUgaW5jbHVkZWQgQUZURVIgcGFyc2UvdF9wcm9ncmFtLmgsIGJ1dCBJIGNhbid0IHJlbWVtYmVyIHdoeSBhbnltb3JlCi0gKiBiZWNhdXNlIEkgd3JvdGUgdGhpcyBhIHdoaWxlIGFnby4KLSAqLwotI2luY2x1ZGUgInRocmlmdHkuaCIKLQotdm9pZCB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZChjaGFyKiBrZXl3b3JkKSB7Ci0gIHl5ZXJyb3IoIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZDogXCIlc1wiXG4iLCBrZXl3b3JkKTsKLSAgZXhpdCgxKTsKLX0KLQotdm9pZCBpbnRlZ2VyX292ZXJmbG93KGNoYXIqIHRleHQpIHsKLSAgeXllcnJvcigiVGhpcyBpbnRlZ2VyIGlzIHRvbyBiaWc6IFwiJXNcIlxuIiwgdGV4dCk7Ci0gIGV4aXQoMSk7Ci19Ci0KLSV9Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIHl5bGluZW5vIGdsb2JhbCwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgb3V0cHV0Ci0gKi8KLSVvcHRpb24gbGV4LWNvbXBhdAotCi0vKioKLSAqIEhlbHBlciBkZWZpbml0aW9ucywgY29tbWVudHMsIGNvbnN0YW50cywgYW5kIHdoYXRub3QKLSAqLwotCi1pbnRjb25zdGFudCAgIChbKy1dP1swLTldKykKLWhleGNvbnN0YW50ICAgKCIweCJbMC05QS1GYS1mXSspCi1kdWJjb25zdGFudCAgIChbKy1dP1swLTldKihcLlswLTldKyk/KFtlRV1bKy1dP1swLTldKyk/KQotaWRlbnRpZmllciAgICAoW2EtekEtWl9dW1wuYS16QS1aXzAtOV0qKQotd2hpdGVzcGFjZSAgICAoWyBcdFxyXG5dKikKLXNpbGx5Y29tbSAgICAgKCIvKiIiKiIqIiovIikKLW11bHRpY29tbSAgICAgKCIvKiJbXipdIi8iKihbXiovXXxbXipdIi8ifCIqIlteL10pKiIqIioiKi8iKQotZG9jdGV4dCAgICAgICAoIi8qKiIoW14qL118W14qXSIvInwiKiJbXi9dKSoiKiIqIiovIikKLWNvbW1lbnQgICAgICAgKCIvLyJbXlxuXSopCi11bml4Y29tbWVudCAgICgiIyJbXlxuXSopCi1zeW1ib2wgICAgICAgIChbOjtcLFx7XH1cKFwpXD08PlxbXF1dKQotc3RfaWRlbnRpZmllciAoW2EtekEtWi1dW1wuYS16QS1aXzAtOS1dKikKLWxpdGVyYWxfYmVnaW4gKFsnXCJdKQotCi0lJQotCi17d2hpdGVzcGFjZX0gICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXtzaWxseWNvbW19ICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote211bHRpY29tbX0gICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17Y29tbWVudH0gICAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXt1bml4Y29tbWVudH0gICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQotCi17c3ltYm9sfSAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07ICAgICAgICAgICAgICAgIH0KLQotIm5hbWVzcGFjZSIgICAgICAgICAgeyByZXR1cm4gdG9rX25hbWVzcGFjZTsgICAgICAgICAgICB9Ci0iY3BwX25hbWVzcGFjZSIgICAgICB7IHJldHVybiB0b2tfY3BwX25hbWVzcGFjZTsgICAgICAgIH0KLSJjcHBfaW5jbHVkZSIgICAgICAgIHsgcmV0dXJuIHRva19jcHBfaW5jbHVkZTsgICAgICAgICAgfQotImNwcF90eXBlIiAgICAgICAgICAgeyByZXR1cm4gdG9rX2NwcF90eXBlOyAgICAgICAgICAgICB9Ci0iamF2YV9wYWNrYWdlIiAgICAgICB7IHJldHVybiB0b2tfamF2YV9wYWNrYWdlOyAgICAgICAgIH0KLSJjb2NvYV9wcmVmaXgiICAgICAgIHsgcmV0dXJuIHRva19jb2NvYV9wcmVmaXg7ICAgICAgICAgfQotImNzaGFycF9uYW1lc3BhY2UiICAgeyByZXR1cm4gdG9rX2NzaGFycF9uYW1lc3BhY2U7ICAgICB9Ci0icGhwX25hbWVzcGFjZSIgICAgICB7IHJldHVybiB0b2tfcGhwX25hbWVzcGFjZTsgICAgICAgIH0KLSJweV9tb2R1bGUiICAgICAgICAgIHsgcmV0dXJuIHRva19weV9tb2R1bGU7ICAgICAgICAgICAgfQotInBlcmxfcGFja2FnZSIgICAgICAgeyByZXR1cm4gdG9rX3BlcmxfcGFja2FnZTsgICAgICAgICB9Ci0icnVieV9uYW1lc3BhY2UiICAgICB7IHJldHVybiB0b2tfcnVieV9uYW1lc3BhY2U7ICAgICAgIH0KLSJzbWFsbHRhbGtfY2F0ZWdvcnkiIHsgcmV0dXJuIHRva19zbWFsbHRhbGtfY2F0ZWdvcnk7ICAgfQotInNtYWxsdGFsa19wcmVmaXgiICAgeyByZXR1cm4gdG9rX3NtYWxsdGFsa19wcmVmaXg7ICAgICB9Ci0ieHNkX2FsbCIgICAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2FsbDsgICAgICAgICAgICAgIH0KLSJ4c2Rfb3B0aW9uYWwiICAgICAgIHsgcmV0dXJuIHRva194c2Rfb3B0aW9uYWw7ICAgICAgICAgfQotInhzZF9uaWxsYWJsZSIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9uaWxsYWJsZTsgICAgICAgICB9Ci0ieHNkX25hbWVzcGFjZSIgICAgICB7IHJldHVybiB0b2tfeHNkX25hbWVzcGFjZTsgICAgICAgIH0KLSJ4c2RfYXR0cnMiICAgICAgICAgIHsgcmV0dXJuIHRva194c2RfYXR0cnM7ICAgICAgICAgICAgfQotImluY2x1ZGUiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2luY2x1ZGU7ICAgICAgICAgICAgICB9Ci0idm9pZCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdm9pZDsgICAgICAgICAgICAgICAgIH0KLSJib29sIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19ib29sOyAgICAgICAgICAgICAgICAgfQotImJ5dGUiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2J5dGU7ICAgICAgICAgICAgICAgICB9Ci0iaTE2IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTE2OyAgICAgICAgICAgICAgICAgIH0KLSJpMzIiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMzI7ICAgICAgICAgICAgICAgICAgfQotImk2NCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k2NDsgICAgICAgICAgICAgICAgICB9Ci0iZG91YmxlIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfZG91YmxlOyAgICAgICAgICAgICAgIH0KLSJzdHJpbmciICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJpbmc7ICAgICAgICAgICAgICAgfQotImJpbmFyeSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2JpbmFyeTsgICAgICAgICAgICAgICB9Ci0ic2xpc3QiICAgICAgICAgICAgICB7IHJldHVybiB0b2tfc2xpc3Q7ICAgICAgICAgICAgICAgIH0KLSJzZW51bSIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZW51bTsgICAgICAgICAgICAgICAgfQotIm1hcCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX21hcDsgICAgICAgICAgICAgICAgICB9Ci0ibGlzdCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbGlzdDsgICAgICAgICAgICAgICAgIH0KLSJzZXQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXQ7ICAgICAgICAgICAgICAgICAgfQotIm9uZXdheSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX29uZXdheTsgICAgICAgICAgICAgICB9Ci0idHlwZWRlZiIgICAgICAgICAgICB7IHJldHVybiB0b2tfdHlwZWRlZjsgICAgICAgICAgICAgIH0KLSJzdHJ1Y3QiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJ1Y3Q7ICAgICAgICAgICAgICAgfQotInVuaW9uIiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3VuaW9uOyAgICAgICAgICAgICAgICB9Ci0iZXhjZXB0aW9uIiAgICAgICAgICB7IHJldHVybiB0b2tfeGNlcHRpb247ICAgICAgICAgICAgIH0KLSJleHRlbmRzIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19leHRlbmRzOyAgICAgICAgICAgICAgfQotInRocm93cyIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3Rocm93czsgICAgICAgICAgICAgICB9Ci0ic2VydmljZSIgICAgICAgICAgICB7IHJldHVybiB0b2tfc2VydmljZTsgICAgICAgICAgICAgIH0KLSJlbnVtIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19lbnVtOyAgICAgICAgICAgICAgICAgfQotImNvbnN0IiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2NvbnN0OyAgICAgICAgICAgICAgICB9Ci0icmVxdWlyZWQiICAgICAgICAgICB7IHJldHVybiB0b2tfcmVxdWlyZWQ7ICAgICAgICAgICAgIH0KLSJvcHRpb25hbCIgICAgICAgICAgIHsgcmV0dXJuIHRva19vcHRpb25hbDsgICAgICAgICAgICAgfQotImFzeW5jIiB7Ci0gIHB3YXJuaW5nKDAsICJcImFzeW5jXCIgaXMgZGVwcmVjYXRlZC4gIEl0IGlzIGNhbGxlZCBcIm9uZXdheVwiIG5vdy5cbiIpOwotICByZXR1cm4gdG9rX29uZXdheTsKLX0KLQotCi0iYWJzdHJhY3QiICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhbmQiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFyZ3MiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYXMiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhc3NlcnQiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImJyZWFrIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2FzZSIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjbGFzcyIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNvbnRpbnVlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVjbGFyZSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWYiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlZmF1bHQiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVsIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWxldGUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRvIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxpZiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbHNlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVsc2VpZiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZXhjZXB0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJleGVjIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZhbHNlIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZmluYWxseSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmbG9hdCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZvciIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZm9yZWFjaCIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmdW5jdGlvbiIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImdsb2JhbCIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZ290byIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpZiIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImltcGxlbWVudHMiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW1wb3J0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbiIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlubGluZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW5zdGFuY2VvZiIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbnRlcmZhY2UiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlzIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibGFtYmRhIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuYXRpdmUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5ldyIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibm90IiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJvciIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInBhc3MiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHVibGljIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwcmludCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInByaXZhdGUiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHJvdGVjdGVkIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyYWlzZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlZ2lzdGVyIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmV0dXJuIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzaXplb2YiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN0YXRpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3dpdGNoIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzeW5jaHJvbml6ZWQiICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRoaXMiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idGhyb3ciICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0cmFuc2llbnQiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRydWUiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idHJ5IiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bnNpZ25lZCIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInZhciIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idmlydHVhbCIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ2b2xhdGlsZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIndoaWxlIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0id2l0aCIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ5aWVsZCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotCi17aW50Y29uc3RhbnR9IHsKLSAgZXJybm8gPSAwOwotICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2hleGNvbnN0YW50fSB7Ci0gIGVycm5vID0gMDsKLSAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0KzIsIE5VTEwsIDE2KTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2R1YmNvbnN0YW50fSB7Ci0gIHl5bHZhbC5kY29uc3QgPSBhdG9mKHl5dGV4dCk7Ci0gIHJldHVybiB0b2tfZHViX2NvbnN0YW50OwotfQotCi17aWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19pZGVudGlmaWVyOwotfQotCi17c3RfaWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19zdF9pZGVudGlmaWVyOwotfQotCi17bGl0ZXJhbF9iZWdpbn0gewotICBjaGFyIG1hcmsgPSB5eXRleHRbMF07Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgZm9yKDs7KQotICB7Ci0gICAgaW50IGNoID0geXlpbnB1dCgpOwotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgRU9GOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgZmlsZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8pOwotICAgICAgICBleGl0KDEpOwotICAgICAgY2FzZSAnXG4nOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgbGluZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8gLSAxKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgY2ggPSB5eWlucHV0KCk7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xyJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xuJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1x0Jyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyInKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1wnJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcXCcpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgY2hhcmFjdGVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChjaCA9PSBtYXJrKSB7Ci0gICAgICAgICAgeXlsdmFsLmlkID0gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gdG9rX2xpdGVyYWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi17ZG9jdGV4dH0gewotIC8qIFRoaXMgZG9lcyBub3Qgc2hvdyB1cCBpbiB0aGUgcGFyc2UgdHJlZS4gKi8KLSAvKiBSYXRoZXIsIHRoZSBwYXJzZXIgd2lsbCBncmFiIGl0IG91dCBvZiB0aGUgZ2xvYmFsLiAqLwotICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgZ19kb2N0ZXh0ID0gc3RyZHVwKHl5dGV4dCArIDMpOwotICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDJdID0gJ1wwJzsKLSAgICBnX2RvY3RleHQgPSBjbGVhbl91cF9kb2N0ZXh0KGdfZG9jdGV4dCk7Ci0gICAgZ19kb2N0ZXh0X2xpbmVubyA9IHl5bGluZW5vOwotICB9Ci19Ci0KLQotJSUKLQotLyogdmltOiBmaWxldHlwZT1sZXgKLSovCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdHkueXkgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdHkueXkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMmNjYTMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5CisrKyAvZGV2L251bGwKQEAgLTEsMTEzNCArMCwwIEBACi0lewotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRocmlmdCBwYXJzZXIuCi0gKgotICogVGhpcyBwYXJzZXIgaXMgdXNlZCBvbiBhIHRocmlmdCBkZWZpbml0aW9uIGZpbGUuCi0gKgotICovCi0KLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotI2luY2x1ZGUgInBhcnNlL3Rfc2NvcGUuaCIKLQotLyoqCi0gKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGZpZWxkIGluZGljZXMgZXRjLgotICogd2hlbiBwYXJzaW5nIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LiBGaWVsZCB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkKLSAqIGFzc2lnbmVkIHN0YXJ0aW5nIGZyb20gLTEgYW5kIHdvcmtpbmcgdGhlaXIgd2F5IGRvd24uCi0gKi8KLWludCB5X2ZpZWxkX3ZhbCA9IC0xOwotaW50IGdfYXJnbGlzdCA9IDA7Ci1jb25zdCBpbnQgc3RydWN0X2lzX3N0cnVjdCA9IDA7Ci1jb25zdCBpbnQgc3RydWN0X2lzX3VuaW9uID0gMTsKLQotJX0KLQotLyoqCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gaG9sZCB0aGUgZGF0YSB0eXBlcyBhc3NvY2lhdGVkIHdpdGgKLSAqIHZhcmlvdXMgcGFyc2Ugbm9kZXMuCi0gKi8KLSV1bmlvbiB7Ci0gIGNoYXIqICAgICAgICAgIGlkOwotICBpbnQ2NF90ICAgICAgICBpY29uc3Q7Ci0gIGRvdWJsZSAgICAgICAgIGRjb25zdDsKLSAgYm9vbCAgICAgICAgICAgdGJvb2w7Ci0gIHRfZG9jKiAgICAgICAgIHRkb2M7Ci0gIHRfdHlwZSogICAgICAgIHR0eXBlOwotICB0X2Jhc2VfdHlwZSogICB0YmFzZTsKLSAgdF90eXBlZGVmKiAgICAgdHR5cGVkZWY7Ci0gIHRfZW51bSogICAgICAgIHRlbnVtOwotICB0X2VudW1fdmFsdWUqICB0ZW51bXY7Ci0gIHRfY29uc3QqICAgICAgIHRjb25zdDsKLSAgdF9jb25zdF92YWx1ZSogdGNvbnN0djsKLSAgdF9zdHJ1Y3QqICAgICAgdHN0cnVjdDsKLSAgdF9zZXJ2aWNlKiAgICAgdHNlcnZpY2U7Ci0gIHRfZnVuY3Rpb24qICAgIHRmdW5jdGlvbjsKLSAgdF9maWVsZCogICAgICAgdGZpZWxkOwotICBjaGFyKiAgICAgICAgICBkdGV4dDsKLSAgdF9maWVsZDo6ZV9yZXEgZXJlcTsKLSAgdF9hbm5vdGF0aW9uKiAgdGFubm90OwotfQotCi0vKioKLSAqIFN0cmluZ3MgaWRlbnRpZmllcgotICovCi0ldG9rZW48aWQ+ICAgICB0b2tfaWRlbnRpZmllcgotJXRva2VuPGlkPiAgICAgdG9rX2xpdGVyYWwKLSV0b2tlbjxkdGV4dD4gIHRva19kb2N0ZXh0Ci0ldG9rZW48aWQ+ICAgICB0b2tfc3RfaWRlbnRpZmllcgotCi0vKioKLSAqIENvbnN0YW50IHZhbHVlcwotICovCi0ldG9rZW48aWNvbnN0PiB0b2tfaW50X2NvbnN0YW50Ci0ldG9rZW48ZGNvbnN0PiB0b2tfZHViX2NvbnN0YW50Ci0KLS8qKgotICogSGVhZGVyIGtleXdvcmRzCi0gKi8KLSV0b2tlbiB0b2tfaW5jbHVkZQotJXRva2VuIHRva19uYW1lc3BhY2UKLSV0b2tlbiB0b2tfY3BwX25hbWVzcGFjZQotJXRva2VuIHRva19jcHBfaW5jbHVkZQotJXRva2VuIHRva19jcHBfdHlwZQotJXRva2VuIHRva19waHBfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX3B5X21vZHVsZQotJXRva2VuIHRva19wZXJsX3BhY2thZ2UKLSV0b2tlbiB0b2tfamF2YV9wYWNrYWdlCi0ldG9rZW4gdG9rX3hzZF9hbGwKLSV0b2tlbiB0b2tfeHNkX29wdGlvbmFsCi0ldG9rZW4gdG9rX3hzZF9uaWxsYWJsZQotJXRva2VuIHRva194c2RfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX3hzZF9hdHRycwotJXRva2VuIHRva19ydWJ5X25hbWVzcGFjZQotJXRva2VuIHRva19zbWFsbHRhbGtfY2F0ZWdvcnkKLSV0b2tlbiB0b2tfc21hbGx0YWxrX3ByZWZpeAotJXRva2VuIHRva19jb2NvYV9wcmVmaXgKLSV0b2tlbiB0b2tfY3NoYXJwX25hbWVzcGFjZQotCi0vKioKLSAqIEJhc2UgZGF0YXR5cGUga2V5d29yZHMKLSAqLwotJXRva2VuIHRva192b2lkCi0ldG9rZW4gdG9rX2Jvb2wKLSV0b2tlbiB0b2tfYnl0ZQotJXRva2VuIHRva19zdHJpbmcKLSV0b2tlbiB0b2tfYmluYXJ5Ci0ldG9rZW4gdG9rX3NsaXN0Ci0ldG9rZW4gdG9rX3NlbnVtCi0ldG9rZW4gdG9rX2kxNgotJXRva2VuIHRva19pMzIKLSV0b2tlbiB0b2tfaTY0Ci0ldG9rZW4gdG9rX2RvdWJsZQotCi0vKioKLSAqIENvbXBsZXggdHlwZSBrZXl3b3JkcwotICovCi0ldG9rZW4gdG9rX21hcAotJXRva2VuIHRva19saXN0Ci0ldG9rZW4gdG9rX3NldAotCi0vKioKLSAqIEZ1bmN0aW9uIG1vZGlmaWVycwotICovCi0ldG9rZW4gdG9rX29uZXdheQotCi0vKioKLSAqIFRocmlmdCBsYW5ndWFnZSBrZXl3b3JkcwotICovCi0ldG9rZW4gdG9rX3R5cGVkZWYKLSV0b2tlbiB0b2tfc3RydWN0Ci0ldG9rZW4gdG9rX3hjZXB0aW9uCi0ldG9rZW4gdG9rX3Rocm93cwotJXRva2VuIHRva19leHRlbmRzCi0ldG9rZW4gdG9rX3NlcnZpY2UKLSV0b2tlbiB0b2tfZW51bQotJXRva2VuIHRva19jb25zdAotJXRva2VuIHRva19yZXF1aXJlZAotJXRva2VuIHRva19vcHRpb25hbAotJXRva2VuIHRva191bmlvbgotCi0vKioKLSAqIEdyYW1tYXIgbm9kZXMKLSAqLwotCi0ldHlwZTx0dHlwZT4gICAgIEJhc2VUeXBlCi0ldHlwZTx0dHlwZT4gICAgIFNpbXBsZUJhc2VUeXBlCi0ldHlwZTx0dHlwZT4gICAgIENvbnRhaW5lclR5cGUKLSV0eXBlPHR0eXBlPiAgICAgU2ltcGxlQ29udGFpbmVyVHlwZQotJXR5cGU8dHR5cGU+ICAgICBNYXBUeXBlCi0ldHlwZTx0dHlwZT4gICAgIFNldFR5cGUKLSV0eXBlPHR0eXBlPiAgICAgTGlzdFR5cGUKLQotJXR5cGU8dGRvYz4gICAgICBEZWZpbml0aW9uCi0ldHlwZTx0dHlwZT4gICAgIFR5cGVEZWZpbml0aW9uCi0KLSV0eXBlPHR0eXBlZGVmPiAgVHlwZWRlZgotCi0ldHlwZTx0dHlwZT4gICAgIFR5cGVBbm5vdGF0aW9ucwotJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbkxpc3QKLSV0eXBlPHRhbm5vdD4gICAgVHlwZUFubm90YXRpb24KLQotJXR5cGU8dGZpZWxkPiAgICBGaWVsZAotJXR5cGU8aWNvbnN0PiAgICBGaWVsZElkZW50aWZpZXIKLSV0eXBlPGVyZXE+ICAgICAgRmllbGRSZXF1aXJlZG5lc3MKLSV0eXBlPHR0eXBlPiAgICAgRmllbGRUeXBlCi0ldHlwZTx0Y29uc3R2PiAgIEZpZWxkVmFsdWUKLSV0eXBlPHRzdHJ1Y3Q+ICAgRmllbGRMaXN0Ci0KLSV0eXBlPHRlbnVtPiAgICAgRW51bQotJXR5cGU8dGVudW0+ICAgICBFbnVtRGVmTGlzdAotJXR5cGU8dGVudW12PiAgICBFbnVtRGVmCi0KLSV0eXBlPHR0eXBlZGVmPiAgU2VudW0KLSV0eXBlPHRiYXNlPiAgICAgU2VudW1EZWZMaXN0Ci0ldHlwZTxpZD4gICAgICAgIFNlbnVtRGVmCi0KLSV0eXBlPHRjb25zdD4gICAgQ29uc3QKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RWYWx1ZQotJXR5cGU8dGNvbnN0dj4gICBDb25zdExpc3QKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Q29udGVudHMKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXAKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXBDb250ZW50cwotCi0ldHlwZTxpY29uc3Q+ICAgIFN0cnVjdEhlYWQKLSV0eXBlPHRzdHJ1Y3Q+ICAgU3RydWN0Ci0ldHlwZTx0c3RydWN0PiAgIFhjZXB0aW9uCi0ldHlwZTx0c2VydmljZT4gIFNlcnZpY2UKLQotJXR5cGU8dGZ1bmN0aW9uPiBGdW5jdGlvbgotJXR5cGU8dHR5cGU+ICAgICBGdW5jdGlvblR5cGUKLSV0eXBlPHRzZXJ2aWNlPiAgRnVuY3Rpb25MaXN0Ci0KLSV0eXBlPHRzdHJ1Y3Q+ICAgVGhyb3dzCi0ldHlwZTx0c2VydmljZT4gIEV4dGVuZHMKLSV0eXBlPHRib29sPiAgICAgT25ld2F5Ci0ldHlwZTx0Ym9vbD4gICAgIFhzZEFsbAotJXR5cGU8dGJvb2w+ICAgICBYc2RPcHRpb25hbAotJXR5cGU8dGJvb2w+ICAgICBYc2ROaWxsYWJsZQotJXR5cGU8dHN0cnVjdD4gICBYc2RBdHRyaWJ1dGVzCi0ldHlwZTxpZD4gICAgICAgIENwcFR5cGUKLQotJXR5cGU8ZHRleHQ+ICAgICBDYXB0dXJlRG9jVGV4dAotCi0lJQotCi0vKioKLSAqIFRocmlmdCBHcmFtbWFyIEltcGxlbWVudGF0aW9uLgotICoKLSAqIEZvciB0aGUgbW9zdCBwYXJ0IHRoaXMgc291cmNlIGZpbGUgd29ya3MgaXRzIHdheSB0b3AgZG93biBmcm9tIHdoYXQgeW91Ci0gKiBtaWdodCBleHBlY3QgdG8gZmluZCBpbiBhIHR5cGljYWwgLnRocmlmdCBmaWxlLCBpLmUuIHR5cGUgZGVmaW5pdGlvbnMgYW5kCi0gKiBuYW1lc3BhY2VzIHVwIHRvcCBmb2xsb3dlZCBieSBzZXJ2aWNlIGRlZmluaXRpb25zIHVzaW5nIHRob3NlIHR5cGVzLgotICovCi0KLVByb2dyYW06Ci0gIEhlYWRlckxpc3QgRGVmaW5pdGlvbkxpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIlByb2dyYW0gLT4gSGVhZGVycyBEZWZpbml0aW9uTGlzdCIpOwotICAgICAgLyoKLSAgICAgIFRPRE8oZHJlaXNzKTogRGVjaWRlIHdoZXRoZXIgZnVsbC1wcm9ncmFtIGRvY3RleHQgaXMgd29ydGggdGhlIHRyb3VibGUuCi0gICAgICBpZiAoJDEgIT0gTlVMTCkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgICAgKi8KLSAgICAgIGNsZWFyX2RvY3RleHQoKTsKLSAgICB9Ci0KLUNhcHR1cmVEb2NUZXh0OgotICAgIHsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAkJCA9IGdfZG9jdGV4dDsKLSAgICAgICAgZ19kb2N0ZXh0ID0gTlVMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQkID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLS8qIFRPRE8oZHJlaXNzKTogVHJ5IHRvIERlc3Ryb3lEb2NUZXh0IGluIGFsbCBzb3J0cyBvciByYW5kb20gcGxhY2VzLiAqLwotRGVzdHJveURvY1RleHQ6Ci0gICAgewotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGNsZWFyX2RvY3RleHQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLS8qIFdlIGhhdmUgdG8gRGVzdHJveURvY1RleHQgaGVyZSwgb3RoZXJ3aXNlIGl0IGNhdGNoZXMgdGhlIGRvY3RleHQKLSAgIG9uIHRoZSBmaXJzdCByZWFsIGVsZW1lbnQuICovCi1IZWFkZXJMaXN0OgotICBIZWFkZXJMaXN0IERlc3Ryb3lEb2NUZXh0IEhlYWRlcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyTGlzdCAtPiBIZWFkZXJMaXN0IEhlYWRlciIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gIik7Ci0gICAgfQotCi1IZWFkZXI6Ci0gIEluY2x1ZGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiBJbmNsdWRlIik7Ci0gICAgfQotfCB0b2tfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgkMiwgJDMpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInY3BwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3BwJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3BwIiwgJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY3BwX2luY2x1ZGUoJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BocF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHBocCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInBocCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIncHlfbW9kdWxlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBweScgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgicHkiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19wZXJsX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BlcmxfcGFja2FnZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgcGVybCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BlcmxfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJwZXJsIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfcnVieV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3J1YnlfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSByYicgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3J1YnlfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJyYiIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19jYXRlZ29yeSB0b2tfc3RfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInc21hbGx0YWxrX2NhdGVnb3J5JyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBzbWFsbHRhbGsuY2F0ZWdvcnknIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfY2F0ZWdvcnkgdG9rX3N0X2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3NtYWxsdGFsa19wcmVmaXgnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHNtYWxsdGFsay5wcmVmaXgnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfcHJlZml4IHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsucHJlZml4IiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfamF2YV9wYWNrYWdlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidqYXZhX3BhY2thZ2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGphdmEnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19qYXZhX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImphdmEiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ2NvY29hX3ByZWZpeCcgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY29jb2EnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImNvY29hIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIneHNkX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgeHNkJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbCIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY29jb2EiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyCi0gICB7Ci0gICAgIHB3YXJuaW5nKDEsICInY3NoYXJwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3NoYXJwJyBpbnN0ZWFkIik7Ci0gICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3NoYXJwIiwgJDIpOwotICAgICB9Ci0gICB9Ci0KLUluY2x1ZGU6Ci0gIHRva19pbmNsdWRlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJJbmNsdWRlIC0+IHRva19pbmNsdWRlIHRva19saXRlcmFsIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgICAgaWYgKCFwYXRoLmVtcHR5KCkpIHsKLSAgICAgICAgICBnX3Byb2dyYW0tPmFkZF9pbmNsdWRlKHBhdGgsIHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLURlZmluaXRpb25MaXN0OgotICBEZWZpbml0aW9uTGlzdCBDYXB0dXJlRG9jVGV4dCBEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiBEZWZpbml0aW9uTGlzdCBEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCAmJiAkMyAhPSBOVUxMKSB7Ci0gICAgICAgICQzLT5zZXRfZG9jKCQyKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiAiKTsKLSAgICB9Ci0KLURlZmluaXRpb246Ci0gIENvbnN0Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IENvbnN0Iik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY29uc3QoJDEpOwotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFR5cGVEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFR5cGVEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19zY29wZS0+YWRkX3R5cGUoJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKLSAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3R5cGUoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFNlcnZpY2UKLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gU2VydmljZSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfc2NvcGUtPmFkZF9zZXJ2aWNlKCQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9zZXJ2aWNlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfc2VydmljZSgkMSk7Ci0gICAgICB9Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotVHlwZURlZmluaXRpb246Ci0gIFR5cGVkZWYKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFR5cGVkZWYiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IEVudW0KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IEVudW0iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9lbnVtKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IFNlbnVtCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTZW51bSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOwotICAgICAgfQotICAgIH0KLXwgU3RydWN0Ci0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTdHJ1Y3QiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9zdHJ1Y3QoJDEpOwotICAgICAgfQotICAgIH0KLXwgWGNlcHRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFhjZXB0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfeGNlcHRpb24oJDEpOwotICAgICAgfQotICAgIH0KLQotVHlwZWRlZjoKLSAgdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmIC0+IHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgdF90eXBlZGVmICp0ZCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMiwgJDMpOwotICAgICAgJCQgPSB0ZDsKLSAgICB9Ci0KLUNvbW1hT3JTZW1pY29sb25PcHRpb25hbDoKLSAgJywnCi0gICAge30KLXwgJzsnCi0gICAge30KLXwKLSAgICB7fQotCi1FbnVtOgotICB0b2tfZW51bSB0b2tfaWRlbnRpZmllciAneycgRW51bURlZkxpc3QgJ30nCi0gICAgewotICAgICAgcGRlYnVnKCJFbnVtIC0+IHRva19lbnVtIHRva19pZGVudGlmaWVyIHsgRW51bURlZkxpc3QgfSIpOwotICAgICAgJCQgPSAkNDsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICAkJC0+cmVzb2x2ZV92YWx1ZXMoKTsKLSAgICB9Ci0KLUVudW1EZWZMaXN0OgotICBFbnVtRGVmTGlzdCBFbnVtRGVmCi0gICAgewotICAgICAgcGRlYnVnKCJFbnVtRGVmTGlzdCAtPiBFbnVtRGVmTGlzdCBFbnVtRGVmIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFwcGVuZCgkMik7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X2VudW0oZ19wcm9ncmFtKTsKLSAgICB9Ci0KLUVudW1EZWY6Ci0gIENhcHR1cmVEb2NUZXh0IHRva19pZGVudGlmaWVyICc9JyB0b2tfaW50X2NvbnN0YW50IENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bURlZiAtPiB0b2tfaWRlbnRpZmllciA9IHRva19pbnRfY29uc3RhbnQiKTsKLSAgICAgIGlmICgkNCA8IDApIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIk5lZ2F0aXZlIHZhbHVlIHN1cHBsaWVkIGZvciBlbnVtICVzLlxuIiwgJDIpOwotICAgICAgfQotICAgICAgaWYgKCQ0ID4gSU5UX01BWCkgewotICAgICAgICBwd2FybmluZygxLCAiNjQtYml0IHZhbHVlIHN1cHBsaWVkIGZvciBlbnVtICVzLlxuIiwgJDIpOwotICAgICAgfQotICAgICAgJCQgPSBuZXcgdF9lbnVtX3ZhbHVlKCQyLCAkNCk7Ci0gICAgICBpZiAoJDEgIT0gTlVMTCkgewotICAgICAgICAkJC0+c2V0X2RvYygkMSk7Ci0gICAgICB9Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19zY29wZS0+YWRkX2NvbnN0YW50KCQyLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAkMiwgbmV3IHRfY29uc3RfdmFsdWUoJDQpKSk7Ci0gICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyAkMiwgbmV3IHRfY29uc3QoZ190eXBlX2kzMiwgJDIsIG5ldyB0X2NvbnN0X3ZhbHVlKCQ0KSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotfAotICBDYXB0dXJlRG9jVGV4dCB0b2tfaWRlbnRpZmllciBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWYgLT4gdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMik7Ci0gICAgICBpZiAoJDEgIT0gTlVMTCkgewotICAgICAgICAkJC0+c2V0X2RvYygkMSk7Ci0gICAgICB9Ci0gICAgfQotCi1TZW51bToKLSAgdG9rX3NlbnVtIHRva19pZGVudGlmaWVyICd7JyBTZW51bURlZkxpc3QgJ30nCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bSAtPiB0b2tfc2VudW0gdG9rX2lkZW50aWZpZXIgeyBTZW51bURlZkxpc3QgfSIpOwotICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDQsICQyKTsKLSAgICB9Ci0KLVNlbnVtRGVmTGlzdDoKLSAgU2VudW1EZWZMaXN0IFNlbnVtRGVmCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gU2VudW1EZWZMaXN0IFNlbnVtRGVmIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFkZF9zdHJpbmdfZW51bV92YWwoJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlbnVtRGVmTGlzdCAtPiAiKTsKLSAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICAgICAgJCQtPnNldF9zdHJpbmdfZW51bSh0cnVlKTsKLSAgICB9Ci0KLVNlbnVtRGVmOgotICB0b2tfbGl0ZXJhbCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlbnVtRGVmIC0+IHRva19saXRlcmFsIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotQ29uc3Q6Ci0gIHRva19jb25zdCBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgJz0nIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdCAtPiB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyID0gQ29uc3RWYWx1ZSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfc2NvcGUtPnJlc29sdmVfY29uc3RfdmFsdWUoJDUsICQyKTsKLSAgICAgICAgJCQgPSBuZXcgdF9jb25zdCgkMiwgJDMsICQ1KTsKLSAgICAgICAgdmFsaWRhdGVfY29uc3RfdHlwZSgkJCk7Ci0KLSAgICAgICAgZ19zY29wZS0+YWRkX2NvbnN0YW50KCQzLCAkJCk7Ci0gICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyAkMywgJCQpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi1Db25zdFZhbHVlOgotICB0b2tfaW50X2NvbnN0YW50Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19pbnRfY29uc3RhbnQiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfaW50ZWdlcigkMSk7Ci0gICAgICBpZiAoJDEgPCBJTlQzMl9NSU4gfHwgJDEgPiBJTlQzMl9NQVgpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIjY0LWJpdCBjb25zdGFudCBcIiUiUFJJaTY0IlwiIG1heSBub3Qgd29yayBpbiBhbGwgbGFuZ3VhZ2VzLlxuIiwgJDEpOwotICAgICAgfQotICAgIH0KLXwgdG9rX2R1Yl9jb25zdGFudAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfZHViX2NvbnN0YW50Iik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2RvdWJsZSgkMSk7Ci0gICAgfQotfCB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfbGl0ZXJhbCIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgkMSk7Ci0gICAgfQotfCB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaWRlbnRpZmllciIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9pZGVudGlmaWVyKCQxKTsKLSAgICB9Ci18IENvbnN0TGlzdAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiBDb25zdExpc3QiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBDb25zdE1hcAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiBDb25zdE1hcCIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLUNvbnN0TGlzdDoKLSAgJ1snIENvbnN0TGlzdENvbnRlbnRzICddJwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0ID0+IFsgQ29uc3RMaXN0Q29udGVudHMgXSIpOwotICAgICAgJCQgPSAkMjsKLSAgICB9Ci0KLUNvbnN0TGlzdENvbnRlbnRzOgotICBDb25zdExpc3RDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0Q29udGVudHMgPT4gQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkJC0+YWRkX2xpc3QoJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+Iik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2xpc3QoKTsKLSAgICB9Ci0KLUNvbnN0TWFwOgotICAneycgQ29uc3RNYXBDb250ZW50cyAnfScKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TWFwID0+IHsgQ29uc3RNYXBDb250ZW50cyB9Iik7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLQotQ29uc3RNYXBDb250ZW50czoKLSAgQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlICc6JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiBDb25zdE1hcENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFkZF9tYXAoJDIsICQ0KTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdE1hcENvbnRlbnRzID0+Iik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X21hcCgpOwotICAgIH0KLQotU3RydWN0SGVhZDoKLSAgdG9rX3N0cnVjdAotICAgIHsKLSAgICAgICQkID0gc3RydWN0X2lzX3N0cnVjdDsKLSAgICB9Ci18IHRva191bmlvbgotICAgIHsKLSAgICAgICQkID0gc3RydWN0X2lzX3VuaW9uOwotICAgIH0KLQotU3RydWN0OgotICBTdHJ1Y3RIZWFkIHRva19pZGVudGlmaWVyIFhzZEFsbCAneycgRmllbGRMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIlN0cnVjdCAtPiB0b2tfc3RydWN0IHRva19pZGVudGlmaWVyIHsgRmllbGRMaXN0IH0iKTsKLSAgICAgICQ1LT5zZXRfeHNkX2FsbCgkMyk7Ci0gICAgICAkNS0+c2V0X3VuaW9uKCQxID09IHN0cnVjdF9pc191bmlvbik7Ci0gICAgICAkJCA9ICQ1OwotICAgICAgJCQtPnNldF9uYW1lKCQyKTsKLSAgICAgIGlmICgkNyAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNy0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDc7Ci0gICAgICB9Ci0gICAgfQotICAgIAotWHNkQWxsOgotICB0b2tfeHNkX2FsbAotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVhzZE9wdGlvbmFsOgotICB0b2tfeHNkX29wdGlvbmFsCi0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IGZhbHNlOwotICAgIH0KLQotWHNkTmlsbGFibGU6Ci0gIHRva194c2RfbmlsbGFibGUKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1Yc2RBdHRyaWJ1dGVzOgotICB0b2tfeHNkX2F0dHJzICd7JyBGaWVsZExpc3QgJ30nCi0gICAgewotICAgICAgJCQgPSAkMzsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotWGNlcHRpb246Ci0gIHRva194Y2VwdGlvbiB0b2tfaWRlbnRpZmllciAneycgRmllbGRMaXN0ICd9JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiWGNlcHRpb24gLT4gdG9rX3hjZXB0aW9uIHRva19pZGVudGlmaWVyIHsgRmllbGRMaXN0IH0iKTsKLSAgICAgICQ0LT5zZXRfbmFtZSgkMik7Ci0gICAgICAkNC0+c2V0X3hjZXB0aW9uKHRydWUpOwotICAgICAgJCQgPSAkNDsKLSAgICB9Ci0KLVNlcnZpY2U6Ci0gIHRva19zZXJ2aWNlIHRva19pZGVudGlmaWVyIEV4dGVuZHMgJ3snIEZsYWdBcmdzIEZ1bmN0aW9uTGlzdCBVbmZsYWdBcmdzICd9JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VydmljZSAtPiB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciB7IEZ1bmN0aW9uTGlzdCB9Iik7Ci0gICAgICAkJCA9ICQ2OwotICAgICAgJCQtPnNldF9uYW1lKCQyKTsKLSAgICAgICQkLT5zZXRfZXh0ZW5kcygkMyk7Ci0gICAgfQotCi1GbGFnQXJnczoKLSAgICB7Ci0gICAgICAgZ19hcmdsaXN0ID0gMTsKLSAgICB9Ci0KLVVuZmxhZ0FyZ3M6Ci0gICAgewotICAgICAgIGdfYXJnbGlzdCA9IDA7Ci0gICAgfQotCi1FeHRlbmRzOgotICB0b2tfZXh0ZW5kcyB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRXh0ZW5kcyAtPiB0b2tfZXh0ZW5kcyB0b2tfaWRlbnRpZmllciIpOwotICAgICAgJCQgPSBOVUxMOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgICQkID0gZ19zY29wZS0+Z2V0X3NlcnZpY2UoJDIpOwotICAgICAgICBpZiAoJCQgPT0gTlVMTCkgewotICAgICAgICAgIHl5ZXJyb3IoIlNlcnZpY2UgXCIlc1wiIGhhcyBub3QgYmVlbiBkZWZpbmVkLiIsICQyKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLUZ1bmN0aW9uTGlzdDoKLSAgRnVuY3Rpb25MaXN0IEZ1bmN0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvbkxpc3QgLT4gRnVuY3Rpb25MaXN0IEZ1bmN0aW9uIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJDEtPmFkZF9mdW5jdGlvbigkMik7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+ICIpOwotICAgICAgJCQgPSBuZXcgdF9zZXJ2aWNlKGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1GdW5jdGlvbjoKLSAgQ2FwdHVyZURvY1RleHQgT25ld2F5IEZ1bmN0aW9uVHlwZSB0b2tfaWRlbnRpZmllciAnKCcgRmllbGRMaXN0ICcpJyBUaHJvd3MgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgJDYtPnNldF9uYW1lKHN0ZDo6c3RyaW5nKCQ0KSArICJfYXJncyIpOwotICAgICAgJCQgPSBuZXcgdF9mdW5jdGlvbigkMywgJDQsICQ2LCAkOCwgJDIpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgIH0KLQotT25ld2F5OgotICB0b2tfb25ld2F5Ci0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IGZhbHNlOwotICAgIH0KLQotVGhyb3dzOgotICB0b2tfdGhyb3dzICcoJyBGaWVsZExpc3QgJyknCi0gICAgewotICAgICAgcGRlYnVnKCJUaHJvd3MgLT4gdG9rX3Rocm93cyAoIEZpZWxkTGlzdCApIik7Ci0gICAgICAkJCA9ICQzOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNICYmICF2YWxpZGF0ZV90aHJvd3MoJCQpKSB7Ci0gICAgICAgIHl5ZXJyb3IoIlRocm93cyBjbGF1c2UgbWF5IG5vdCBjb250YWluIG5vbi1leGNlcHRpb24gdHlwZXMiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLUZpZWxkTGlzdDoKLSAgRmllbGRMaXN0IEZpZWxkCi0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZExpc3QgLT4gRmllbGRMaXN0ICwgRmllbGQiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICBpZiAoISgkJC0+YXBwZW5kKCQyKSkpIHsKLSAgICAgICAgeXllcnJvcigiRmllbGQgaWRlbnRpZmllciAlZCBmb3IgXCIlc1wiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCIsICQyLT5nZXRfa2V5KCksICQyLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkTGlzdCAtPiAiKTsKLSAgICAgIHlfZmllbGRfdmFsID0gLTE7Ci0gICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOwotICAgIH0KLQotRmllbGQ6Ci0gIENhcHR1cmVEb2NUZXh0IEZpZWxkSWRlbnRpZmllciBGaWVsZFJlcXVpcmVkbmVzcyBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgRmllbGRWYWx1ZSBYc2RPcHRpb25hbCBYc2ROaWxsYWJsZSBYc2RBdHRyaWJ1dGVzIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoInRva19pbnRfY29uc3RhbnQgOiBGaWVsZCAtPiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmICgkMiA8IDApIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIk5vIGZpZWxkIGtleSBzcGVjaWZpZWQgZm9yICVzLCByZXN1bHRpbmcgcHJvdG9jb2wgbWF5IGhhdmUgY29uZmxpY3RzIG9yIG5vdCBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSFcbiIsICQ1KTsKLSAgICAgICAgaWYgKGdfc3RyaWN0ID49IDE5MikgewotICAgICAgICAgIHl5ZXJyb3IoIkltcGxpY2l0IGZpZWxkIGtleXMgYXJlIGRlcHJlY2F0ZWQgYW5kIG5vdCBhbGxvd2VkIHdpdGggLXN0cmljdCIpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICQkID0gbmV3IHRfZmllbGQoJDQsICQ1LCAkMik7Ci0gICAgICAkJC0+c2V0X3JlcSgkMyk7Ci0gICAgICBpZiAoJDYgIT0gTlVMTCkgewotICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ2LCAkNCk7Ci0gICAgICAgIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKCQkLCAkNik7Ci0gICAgICAgICQkLT5zZXRfdmFsdWUoJDYpOwotICAgICAgfQotICAgICAgJCQtPnNldF94c2Rfb3B0aW9uYWwoJDcpOwotICAgICAgJCQtPnNldF94c2RfbmlsbGFibGUoJDgpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF94c2RfYXR0cnMoJDkpOwotICAgICAgfQotICAgICAgaWYgKCQxMCAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMTAtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQxMDsKLSAgICAgIH0KLSAgICB9Ci0KLUZpZWxkSWRlbnRpZmllcjoKLSAgdG9rX2ludF9jb25zdGFudCAnOicKLSAgICB7Ci0gICAgICBpZiAoJDEgPD0gMCkgewotICAgICAgICBwd2FybmluZygxLCAiTm9ucG9zaXRpdmUgdmFsdWUgKCVkKSBub3QgYWxsb3dlZCBhcyBhIGZpZWxkIGtleS5cbiIsICQxKTsKLSAgICAgICAgJDEgPSB5X2ZpZWxkX3ZhbC0tOwotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSB5X2ZpZWxkX3ZhbC0tOwotICAgIH0KLQotRmllbGRSZXF1aXJlZG5lc3M6Ci0gIHRva19yZXF1aXJlZAotICAgIHsKLSAgICAgICQkID0gdF9maWVsZDo6VF9SRVFVSVJFRDsKLSAgICB9Ci18IHRva19vcHRpb25hbAotICAgIHsKLSAgICAgIGlmIChnX2FyZ2xpc3QpIHsKLSAgICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgICAgcHdhcm5pbmcoMSwgIm9wdGlvbmFsIGtleXdvcmQgaXMgaWdub3JlZCBpbiBhcmd1bWVudCBsaXN0cy5cbiIpOwotICAgICAgICB9Ci0gICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOwotICAgIH0KLQotRmllbGRWYWx1ZToKLSAgJz0nIENvbnN0VmFsdWUKLSAgICB7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSAkMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQkID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotRnVuY3Rpb25UeXBlOgotICBGaWVsZFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiBGaWVsZFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCB0b2tfdm9pZAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRnVuY3Rpb25UeXBlIC0+IHRva192b2lkIik7Ci0gICAgICAkJCA9IGdfdHlwZV92b2lkOwotICAgIH0KLQotRmllbGRUeXBlOgotICB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7Ci0gICAgICAgIC8vIElnbm9yZSBpZGVudGlmaWVycyBpbiBpbmNsdWRlIG1vZGUKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTG9va3VwIHRoZSBpZGVudGlmaWVyIGluIHRoZSBjdXJyZW50IHNjb3BlCi0gICAgICAgICQkID0gZ19zY29wZS0+Z2V0X3R5cGUoJDEpOwotICAgICAgICBpZiAoJCQgPT0gTlVMTCkgewotICAgICAgICAgIHl5ZXJyb3IoIlR5cGUgXCIlc1wiIGhhcyBub3QgYmVlbiBkZWZpbmVkLiIsICQxKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotfCBCYXNlVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IEJhc2VUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgQ29udGFpbmVyVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IENvbnRhaW5lclR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1CYXNlVHlwZTogU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCpzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KCQxKSk7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9ICQxOwotICAgICAgfQotICAgIH0KLQotU2ltcGxlQmFzZVR5cGU6Ci0gIHRva19zdHJpbmcKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zdHJpbmciKTsKLSAgICAgICQkID0gZ190eXBlX3N0cmluZzsKLSAgICB9Ci18IHRva19iaW5hcnkKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19iaW5hcnkiKTsKLSAgICAgICQkID0gZ190eXBlX2JpbmFyeTsKLSAgICB9Ci18IHRva19zbGlzdAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3NsaXN0Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9zbGlzdDsKLSAgICB9Ci18IHRva19ib29sCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYm9vbCIpOwotICAgICAgJCQgPSBnX3R5cGVfYm9vbDsKLSAgICB9Ci18IHRva19ieXRlCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYnl0ZSIpOwotICAgICAgJCQgPSBnX3R5cGVfYnl0ZTsKLSAgICB9Ci18IHRva19pMTYKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMTYiKTsKLSAgICAgICQkID0gZ190eXBlX2kxNjsKLSAgICB9Ci18IHRva19pMzIKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMzIiKTsKLSAgICAgICQkID0gZ190eXBlX2kzMjsKLSAgICB9Ci18IHRva19pNjQKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pNjQiKTsKLSAgICAgICQkID0gZ190eXBlX2k2NDsKLSAgICB9Ci18IHRva19kb3VibGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19kb3VibGUiKTsKLSAgICAgICQkID0gZ190eXBlX2RvdWJsZTsKLSAgICB9Ci0KLUNvbnRhaW5lclR5cGU6IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJDb250YWluZXJUeXBlIC0+IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMjsKLSAgICAgIH0KLSAgICB9Ci0KLVNpbXBsZUNvbnRhaW5lclR5cGU6Ci0gIE1hcFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTWFwVHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFNldFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gU2V0VHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IExpc3RUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IExpc3RUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotTWFwVHlwZToKLSAgdG9rX21hcCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJywnIEZpZWxkVHlwZSAnPicKLSAgICB7Ci0gICAgICBwZGVidWcoIk1hcFR5cGUgLT4gdG9rX21hcCA8RmllbGRUeXBlLCBGaWVsZFR5cGU+Iik7Ci0gICAgICAkJCA9IG5ldyB0X21hcCgkNCwgJDYpOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLVNldFR5cGU6Ci0gIHRva19zZXQgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICc+JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2V0VHlwZSAtPiB0b2tfc2V0PEZpZWxkVHlwZT4iKTsKLSAgICAgICQkID0gbmV3IHRfc2V0KCQ0KTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICB9Ci0gICAgfQotCi1MaXN0VHlwZToKLSAgdG9rX2xpc3QgJzwnIEZpZWxkVHlwZSAnPicgQ3BwVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiTGlzdFR5cGUgLT4gdG9rX2xpc3Q8RmllbGRUeXBlPiIpOwotICAgICAgJCQgPSBuZXcgdF9saXN0KCQzKTsKLSAgICAgIGlmICgkNSAhPSBOVUxMKSB7Ci0gICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQ1KSk7Ci0gICAgICB9Ci0gICAgfQotCi1DcHBUeXBlOgotICB0b2tfY3BwX3R5cGUgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1UeXBlQW5ub3RhdGlvbnM6Ci0gICcoJyBUeXBlQW5ub3RhdGlvbkxpc3QgJyknCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbnMgLT4gKCBUeXBlQW5ub3RhdGlvbkxpc3QgKSIpOwotICAgICAgJCQgPSAkMjsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotVHlwZUFubm90YXRpb25MaXN0OgotICBUeXBlQW5ub3RhdGlvbkxpc3QgVHlwZUFubm90YXRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uTGlzdCAtPiBUeXBlQW5ub3RhdGlvbkxpc3QgLCBUeXBlQW5ub3RhdGlvbiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hbm5vdGF0aW9uc19bJDItPmtleV0gPSAkMi0+dmFsOwotICAgICAgZGVsZXRlICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAvKiBKdXN0IHVzZSBhIGR1bW15IHN0cnVjdHVyZSB0byBob2xkIHRoZSBhbm5vdGF0aW9ucy4gKi8KLSAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1UeXBlQW5ub3RhdGlvbjoKLSAgdG9rX2lkZW50aWZpZXIgJz0nIHRva19saXRlcmFsIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb24gLT4gdG9rX2lkZW50aWZpZXIgPSB0b2tfbGl0ZXJhbCIpOwotICAgICAgJCQgPSBuZXcgdF9hbm5vdGF0aW9uOwotICAgICAgJCQtPmtleSA9ICQxOwotICAgICAgJCQtPnZhbCA9ICQzOwotICAgIH0KLQotJSUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvY29tcGlsZXIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5ZjIzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK2lmKCR7V0lUSF9QTFVHSU59KQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQorCisgICAgIyBNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQorCisgICAgc2V0KHBsdWdpbnRlc3RfU09VUkNFUworICAgICAgICBwbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCisgICAgKQorICAgIGFkZF9leGVjdXRhYmxlKHBsdWdpbnRlc3QgJHtwbHVnaW50ZXN0X1NPVVJDRVN9KQorICAgIGlmKFdJVEhfU0hBUkVEX0xJQiBBTkQgTk9UIE1TVkMpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbHVnaW50ZXN0CisgICAgICAgICAgICB0aHJpZnRjCisgICAgICAgICAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAgICAgKQorICAgIGVsc2UoKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXMocGx1Z2ludGVzdAorICAgICAgICAgICAgdGhyaWZ0Y19zdGF0aWMKKyAgICAgICAgICAgIHRocmlmdF9zdGF0aWMKKyAgICAgICAgICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICAgICApCisgICAgZW5kaWYoKQorICAgIGFkZF90ZXN0KE5BTUUgUGx1Z2luVW5pdFRlc3QgQ09NTUFORCBwbHVnaW50ZXN0KQorCisgICAgc2V0KHRocmlmdC1nZW4tbXljcHBfU09VUkNFUworICAgICAgICAuLi9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworICAgICAgICBwbHVnaW4vY3BwX3BsdWdpbi5jYworICAgICkKKyAgICBhZGRfZXhlY3V0YWJsZSh0aHJpZnQtZ2VuLW15Y3BwICR7dGhyaWZ0LWdlbi1teWNwcF9TT1VSQ0VTfSkKKyAgICBpZihXSVRIX1NIQVJFRF9MSUIgQU5EIE5PVCBNU1ZDKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWdlbi1teWNwcCB0aHJpZnRjKQorICAgIGVsc2UoKQorICAgICAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWdlbi1teWNwcCB0aHJpZnRjX3N0YXRpYyB0aHJpZnRfc3RhdGljKQorICAgIGVuZGlmKCkKKworICAgIGlmKENNQUtFX0JVSUxEX1RZUEUgU1RSRVFVQUwgIkRlYnVnIikKKyAgICAgICAgc2V0KEJVSUxEVFlQRSAiRGVidWciKQorICAgIGVsc2UoKQorICAgICAgICAjIFJlbFdpdGhEZWJJbmZvIGdlbmVyYXRlcyBiaW5hcmllcyBpbiAiUmVsZWFzZSIgZGlyZWN0b3J5IHRvbworICAgICAgICBzZXQoQlVJTERUWVBFICJSZWxlYXNlIikKKyAgICBlbmRpZigpCisKKyAgICBzZXRfZGlyZWN0b3J5X3Byb3BlcnRpZXMoUFJPUEVSVElFUworICAgICAgICBBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVMgZ2VuLWNwcAorICAgICAgICBBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVMgZ2VuLW15Y3BwKQorCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCkKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tbXljcHApCisgICAgYWRkX3Rlc3QoTkFNRSBQbHVnaW5JbnRlZ3JhdGlvblRlc3QKKyAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0KKyAgICAgICAgICAgICAgICAgLURUSFJJRlRfQ09NUElMRVI9JHtUSFJJRlRfQ09NUElMRVJ9CisgICAgICAgICAgICAgICAgIC1EQklORElSPSR7Q01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZfQorICAgICAgICAgICAgICAgICAtREJVSUxEVFlQRT0ke0JVSUxEVFlQRX0KKyAgICAgICAgICAgICAgICAgLURDVVJESVI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAgICAgIC1EU1JDRElSPSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgICAgICAtUCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY3BwX3BsdWdpbl90ZXN0LmNtYWtlKQorZW5kaWYoKQorCitmaWxlKEdMT0IgS0VZV09SRF9TQU1QTEVTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0va2V5d29yZC1zYW1wbGVzLyoudGhyaWZ0IikKK2ZvcmVhY2goTEFORyAke3RocmlmdF9jb21waWxlcl9MQU5HU30pCisgICAgZm9yZWFjaChTQU1QTEUgJHtLRVlXT1JEX1NBTVBMRVN9KQorICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEZJTEVOQU1FICR7U0FNUExFfSBOQU1FX1dFKQorICAgICAgICBhZGRfdGVzdChOQU1FICIke0xBTkd9XyR7RklMRU5BTUV9IgorICAgICAgICAgICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gJHtMQU5HfSAke1NBTVBMRX0pCisgICAgICAgIHNldF90ZXN0c19wcm9wZXJ0aWVzKCIke0xBTkd9XyR7RklMRU5BTUV9IiBQUk9QRVJUSUVTCisgICAgICAgICAgICBQQVNTX1JFR1VMQVJfRVhQUkVTU0lPTiAiQ2Fubm90IHVzZSByZXNlcnZlZCBsYW5ndWFnZSBrZXl3b3JkIikKKyAgICBlbmRmb3JlYWNoKCkKK2VuZGZvcmVhY2goKQorCisKK2ZpbmRfcGFja2FnZShQeXRob25JbnRlcnAgUkVRVUlSRUQpCithZGRfdGVzdChOQU1FIFN0YWxlbmVzc0NoZWNrVGVzdCBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkgJHtUSFJJRlRfQ09NUElMRVJ9KQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ZjOTFkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjCisjIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisjIGRldGFpbHMuCisKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3NyYworQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykKK0FNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKKworaWYgV0lUSF9QTFVHSU4KK2NoZWNrX1BST0dSQU1TID0gcGx1Z2ludGVzdAorCitub2luc3RfUFJPR1JBTVMgPSB0aHJpZnQtZ2VuLW15Y3BwCisKK2FsbC1sb2NhbDogdGhyaWZ0LWdlbi1iaW5jYXQKKworQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvc3JjCisKK3BsdWdpbnRlc3RfU09VUkNFUyA9IHBsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MKK3BsdWdpbnRlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL2xpYnRocmlmdGMubGEKKwordGhyaWZ0X2dlbl9teWNwcF9TT1VSQ0VTID0gcGx1Z2luL2NwcF9wbHVnaW4uY2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luL3RfY3BwX2dlbmVyYXRvci5jYwordGhyaWZ0X2dlbl9teWNwcF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAgLUkkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUKK3RocmlmdF9nZW5fbXljcHBfTERBREQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL2xpYnRocmlmdGMubGEKKworY3BwX3BsdWdpbl90ZXN0LnNoOiB0aHJpZnQtZ2VuLW15Y3BwCisKK3RocmlmdC1nZW4tYmluY2F0OgorCWNwIGJpbmNhdC5zaCAkQAorCWNobW9kIDc1NSAkQAorCitwbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2g6IHRocmlmdC1nZW4tYmluY2F0CisKK1RFU1RTID0gJChjaGVja19QUk9HUkFNUykgY3BwX3BsdWdpbl90ZXN0LnNoIHBsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZ2VuLWNwcCBnZW4tbXljcHAgZ2VuLWJpbmNhdCB0aHJpZnQtZ2VuLWJpbmNhdAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvYmluY2F0LnNoIGIvY29tcGlsZXIvY3BwL3Rlc3QvYmluY2F0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3ZjkwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9iaW5jYXQuc2gKQEAgLTAsMCArMSwzIEBACisjIS9iaW4vYmFzaAorCitleGVjIC9iaW4vY2F0CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRlZC50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4NGFiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGVkLnRocmlmdApAQCAtMCwwICsxLDE4IEBACitjb25zdCBzdHJpbmcgZm9vID0gImJhciIKKworc3RydWN0IGFfc3RydWN0IHsKKyAgMTogYm9vbCBpbV90cnVlLAorICAyOiBib29sIGltX2ZhbHNlLAorICAzOiBpOCBhX2JpdGUsCisgIDQ6IGkxNiBpbnRlZ2VyMTYsCisgIDU6IGkzMiBpbnRlZ2VyMzIsCisgIDY6IGk2NCBpbnRlZ2VyNjQsCisgIDc6IGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uLAorICA4OiBzdHJpbmcgc29tZV9jaGFyYWN0ZXJzLAorICA5OiBzdHJpbmcgem9tZ191bmljb2RlLAorICAxMDogYm9vbCB3aGF0X3dobywKK30KKworc2VydmljZSBBU2VydmljZSB7CisgIGkzMiBhX3Byb2NlZHVyZSgxOiBpMzIgYXJnKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkaW5nLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGluZy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3YWY3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGluZy50aHJpZnQKQEAgLTAsMCArMSw3IEBACitpbmNsdWRlICJJbmNsdWRlZC50aHJpZnQiCisKK2NvbnN0IHN0cmluZyBzID0gInN0cmluZyIKKworc3RydWN0IEJTdHJ1Y3QgeworICAxOiBJbmNsdWRlZC5hX3N0cnVjdCBvbmVfb2ZfZWFjaAorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvU2luZ2xlLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL1NpbmdsZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjMzAxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL1NpbmdsZS50aHJpZnQKQEAgLTAsMCArMSBAQAorY29uc3Qgc3RyaW5nIGZvbyA9ICJiYXIiCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWIxMWRmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weQpAQCAtMCwwICsxLDE0MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0U3RhbGVuZXNzQ2hlY2sodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQ1VSUkVOVF9ESVJfUEFUSCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkKKyAgICBUSFJJRlRfRVhFQ1VUQUJMRV9QQVRIID0gTm9uZQorICAgIFNJTkdMRV9USFJJRlRfRklMRV9QQVRIID0gb3MucGF0aC5qb2luKENVUlJFTlRfRElSX1BBVEgsICJTaW5nbGUudGhyaWZ0IikKKyAgICBJTkNMVURJTkdfVEhSSUZUX0ZJTEVfUEFUSCA9IG9zLnBhdGguam9pbihDVVJSRU5UX0RJUl9QQVRILCAiSW5jbHVkaW5nLnRocmlmdCIpCisgICAgSU5DTFVERURfVEhSSUZUX0ZJTEVfUEFUSCA9IG9zLnBhdGguam9pbihDVVJSRU5UX0RJUl9QQVRILCAiSW5jbHVkZWQudGhyaWZ0IikKKworICAgIGRlZiB0ZXN0X3N0YWxlbmVzc19jaGVja19vZl9zaW5nbGVfdGhyaWZ0X2ZpbGVfd2l0aG91dF9jaGFuZ2VkX291dHB1dChzZWxmKToKKyAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKGRpcj1UZXN0U3RhbGVuZXNzQ2hlY2suQ1VSUkVOVF9ESVJfUEFUSCkKKworICAgICAgICBjb21tYW5kID0gW1Rlc3RTdGFsZW5lc3NDaGVjay5USFJJRlRfRVhFQ1VUQUJMRV9QQVRILCAiLWdlbiIsICJjcHAiLCAiLW8iLCB0ZW1wX2Rpcl0KKyAgICAgICAgY29tbWFuZCArPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlNJTkdMRV9USFJJRlRfRklMRV9QQVRIXQorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICB1c2VkX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgImdlbi1jcHAiLCAiU2luZ2xlX2NvbnN0YW50cy5jcHAiKQorCisgICAgICAgIGZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShvcy5wYXRoLmpvaW4odXNlZF9maWxlX3BhdGgpKQorCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHNlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUodXNlZF9maWxlX3BhdGgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUsIGZpcnN0X21vZGlmaWNhdGlvbl90aW1lKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N0YWxlbmVzc19jaGVja19vZl9zaW5nbGVfdGhyaWZ0X2ZpbGVfd2l0aF9jaGFuZ2VkX291dHB1dChzZWxmKToKKyAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKGRpcj1UZXN0U3RhbGVuZXNzQ2hlY2suQ1VSUkVOVF9ESVJfUEFUSCkKKworICAgICAgICBjb21tYW5kID0gW1Rlc3RTdGFsZW5lc3NDaGVjay5USFJJRlRfRVhFQ1VUQUJMRV9QQVRILCAiLWdlbiIsICJjcHAiLCAiLW8iLCB0ZW1wX2Rpcl0KKyAgICAgICAgY29tbWFuZCArPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlNJTkdMRV9USFJJRlRfRklMRV9QQVRIXQorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICB1c2VkX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgImdlbi1jcHAiLCAiU2luZ2xlX2NvbnN0YW50cy5jcHAiKQorCisgICAgICAgIGZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShvcy5wYXRoLmpvaW4odXNlZF9maWxlX3BhdGgpKQorICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiciIpCisgICAgICAgIGZpcnN0X2NvbnRlbnRzID0gdXNlZF9maWxlLnJlYWQoKQorICAgICAgICB1c2VkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHVzZWRfZmlsZSA9IG9wZW4odXNlZF9maWxlX3BhdGgsICJhIikKKyAgICAgICAgdXNlZF9maWxlLndyaXRlKCJcbi8qIFRoaXMgaXMgYSBjb21tZW50ICovXG4iKQorICAgICAgICB1c2VkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHNlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUodXNlZF9maWxlX3BhdGgpCisgICAgICAgIHVzZWRfZmlsZSA9IG9wZW4odXNlZF9maWxlX3BhdGgsICJyIikKKyAgICAgICAgc2Vjb25kX2NvbnRlbnRzID0gdXNlZF9maWxlLnJlYWQoKQorICAgICAgICB1c2VkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUsIGZpcnN0X21vZGlmaWNhdGlvbl90aW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X2NvbnRlbnRzLCBzZWNvbmRfY29udGVudHMpCisKKyAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisgICAgZGVmIHRlc3Rfc3RhbGVuZXNzX2NoZWNrX29mX2luY2x1ZGVkX2ZpbGUoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJJbmNsdWRlZC50aHJpZnQiKQorICAgICAgICB0ZW1wX2luY2x1ZGluZ19maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJJbmNsdWRpbmcudGhyaWZ0IikKKworICAgICAgICBzaHV0aWwuY29weTIoVGVzdFN0YWxlbmVzc0NoZWNrLklOQ0xVREVEX1RIUklGVF9GSUxFX1BBVEgsIHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoKQorICAgICAgICBzaHV0aWwuY29weTIoVGVzdFN0YWxlbmVzc0NoZWNrLklOQ0xVRElOR19USFJJRlRfRklMRV9QQVRILCB0ZW1wX2luY2x1ZGluZ19maWxlX3BhdGgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1yZWN1cnNlIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW3RlbXBfaW5jbHVkaW5nX2ZpbGVfcGF0aF0KKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgImdlbi1jcHAiLCAiSW5jbHVkZWRfY29uc3RhbnRzLmNwcCIpCisgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgImdlbi1jcHAiLCAiSW5jbHVkaW5nX2NvbnN0YW50cy5jcHAiKQorCisgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoKQorICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoKQorCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZSA9IG9wZW4odGVtcF9pbmNsdWRlZF9maWxlX3BhdGgsICJhIikKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlLndyaXRlKCJcbmNvbnN0IGkzMiBhbl9pbnRlZ2VyID0gNDJcbiIpCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoKQorICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoCisgICAgICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSwgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lLCBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUpCisKKyAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdFN0YWxlbmVzc0NoZWNrKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICMgVGhlIHBhdGggb2YgVGhyaWZ0IGNvbXBpbGVyICBpcyAgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB0ZXN0IHNjcmlwdC4KKyAgICAjIFJlbW92ZSBpdCB0byBub3QgY29uZnVzZSB0aGUgdW5pdCB0ZXN0aW5nIGZyYW1ld29yaworICAgIFRlc3RTdGFsZW5lc3NDaGVjay5USFJJRlRfRVhFQ1VUQUJMRV9QQVRIID0gc3lzLmFyZ3ZbLTFdCisgICAgZGVsIHN5cy5hcmd2Wy0xXQorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3QuY21ha2UgYi9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3QuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxODI4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5jbWFrZQpAQCAtMCwwICsxLDQ1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZmlsZShNQUtFX0RJUkVDVE9SWSAke0NVUkRJUn0vZ2VuLWNwcCkKK2V4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtciAtb3V0ICR7Q1VSRElSfS9nZW4tY3BwIC1nZW4gY3BwICR7U1JDRElSfS8uLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0KQoraWYoRVhJVENPREUpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkZBSUxFRDogXCIke0FSR1Z9XCI6IFwiJHtFWElUQ09ERX1cIiIpCitlbmRpZigpCitpZihXSU4zMikKKyAgICBzZXQoRU5We1BBVEh9ICIke0JJTkRJUn0vJHtCVUlMRFRZUEV9OyR7QklORElSfTskRU5We1BBVEh9IikKK2Vsc2UoKQorICAgIHNldChFTlZ7UEFUSH0gIiR7QklORElSfTokRU5We1BBVEh9IikKK2VuZGlmKCkKKworZmlsZShNQUtFX0RJUkVDVE9SWSAke0NVUkRJUn0vZ2VuLW15Y3BwKQorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC1yIC1vdXQgJHtDVVJESVJ9L2dlbi1teWNwcCAtZ2VuIG15Y3BwICR7U1JDRElSfS8uLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0IFJFU1VMVF9WQVJJQUJMRSBFWElUQ09ERSkKK2lmKEVYSVRDT0RFKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGQUlMRUQ6IFwiJHtFWElUQ09ERX1cIiIpCitlbmRpZigpCisKK2ZpbmRfcHJvZ3JhbShESUZGIGRpZmYpCitpZihESUZGKQorICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke0RJRkZ9IC11ck4gZ2VuLWNwcCBnZW4tbXljcHAgUkVTVUxUX1ZBUklBQkxFIEVYSVRDT0RFKQorICBpZihFWElUQ09ERSkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJGQUlMRUQ6IFwiJHtFWElUQ09ERX1cIiIpCisgIGVuZGlmKCkKK2Vsc2UoKQorICAgIG1lc3NhZ2UoV0FSTklORyAiZGlmZiBleGVjdXRhYmxlIGlzIG5vdCBhdmFpbGFibGUuIE5vdCB2YWxpZGF0aW5nIHBsdWdpbi1nZW5lcmF0ZWQgY29kZS4iKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LnNoIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkYjJlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3Quc2gKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIGJ5IG1ha2UuCitzZXQgLWUKK21rZGlyIC1wIGdlbi1jcHAgZ2VuLW15Y3BwCitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLW91dCBnZW4tY3BwIC1nZW4gY3BwIC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQKK1BBVEg9LjoiJFBBVEgiIC4uL3RocmlmdCAtciAtb3V0IGdlbi1teWNwcCAtZ2VuIG15Y3BwIC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQKK2RpZmYgLXVyTiBnZW4tY3BwIGdlbi1teWNwcApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNWU0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvY29uc3QxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorY29uc3QgYm9vbCByZXR1cm4gPSAwCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODM0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDIgQEAKK2VudW0gcmV0dXJuIHsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0yX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjYWE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorZW51bSBlbnVtX25hbWUgeworICByZXR1cm4KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZGIzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2V4Y2VwdGlvbiByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24yX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2MzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorZXhjZXB0aW9uIGV4Y2VwdGlvbl9uYW1lIHsKKyAgMTogcmVxdWlyZWQgaTggcmV0dXJuCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODZhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitzZXJ2aWNlIHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjczMzFkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIGJvb2wgZnVuY3Rpb25fbmFtZSgxOiBpMzIgcmV0dXJuKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTNfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmRkOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIHZvaWQgcmV0dXJuKCkKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2U0X3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3ODdkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsNSBAQAorZXhjZXB0aW9uIGV4Y2VwdGlvbl9uYW1lIHt9CisKK3NlcnZpY2Ugc2VydmljZV9uYW1lIHsKKyAgdm9pZCBmdW5jdGlvbl9uYW1lKCkgdGhyb3dzICggMTogZXhjZXB0aW9uX25hbWUgcmV0dXJuKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyYjhiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorc3RydWN0IHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3MDBkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitzdHJ1Y3Qgc3RydWN0X25hbWUgeworICAxOiByZXF1aXJlZCBib29sIHJldHVybiA9IDEKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3R5cGVkZWYxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1OWJiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3R5cGVkZWYgYm9vbCByZXR1cm4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjhkZjEzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3VuaW9uIHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTlkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24yX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACit1bmlvbiB1bmlvbl9uYW1lIHsKKyAgMTogb3B0aW9uYWwgYm9vbCByZXR1cm49MQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4ZDgxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yLmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L2luY2x1ZGVkL3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9wYXJhbWV0ZXJpemVkX3Rlc3QuaHBwPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDsKKworbmFtZXNwYWNlIHRlc3RfZGF0YSB7CisjZGVmaW5lIFRfVEVTVF9UWVBFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2dyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpKQorI2RlZmluZSBUX0RFTEVURV9URVNUREFUQShyLCBkLCBlbGVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHN0ZDo6dmVjdG9yPHRfIyNlbGVtKj46OnJldmVyc2VfaXRlcmF0b3IgaXQgPSBlbGVtIyNzLnJiZWdpbigpOyBpdCAhPSBlbGVtIyNzLnJlbmQoKTsgaXQrKykgXAorICAgIGRlbGV0ZSAqaXQ7CisjZGVmaW5lIFRfREVDTF9URVNUREFUQShyLCBkLCBlbGVtKSBzdGF0aWMgc3RkOjp2ZWN0b3I8IDo6dF8jI2VsZW0qPiBlbGVtIyNzOworQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUX0RFQ0xfVEVTVERBVEEsIF8sIFRfVEVTVF9UWVBFUykKKyN1bmRlZiBUX0RFQ0xfVEVTVERBVEEKKworYm9vbCBoYXNfZGF0YSA9IGZhbHNlOwordm9pZCBjbGVhbnVwKCkgeworICBpZiAoaGFzX2RhdGEpIHsKKyAgICBoYXNfZGF0YSA9IGZhbHNlOworICAgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9ERUxFVEVfVEVTVERBVEEsIF8sIFRfVEVTVF9UWVBFUykKKyAgfQorfQorCit2b2lkIGluaXRfcHJvZ3JhbXMoKSB7CisgIHByb2dyYW1zLnB1c2hfYmFjayhuZXcgdF9wcm9ncmFtKCJwcm9nIHBhdGgiLCAicHJvZ19uYW1lIikpOworfQorCit2b2lkIGluaXRfYmFzZV90eXBlcygpIHsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWUwIiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lMSIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lMiIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkpOworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTMiLCA6OnRfYmFzZV90eXBlOjpUWVBFX0k4KSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lNCIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfSTE2KSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lNSIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfSTMyKSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lNiIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfSTY0KSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lNyIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSk7Cit9CisKK3ZvaWQgaW5pdF9jb25zdF92YWx1ZXMoKSB7CisgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfY29uc3RfdmFsdWUoNDIpKTsKKyAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayhuZXcgdF9jb25zdF92YWx1ZSgiZm9vIikpOworICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9kb3VibGUoMy4xNDE1KTsKKyAgICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKHgpOworICB9CisgIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB4ID0gbmV3IHRfY29uc3RfdmFsdWU7CisgICAgeC0+c2V0X2lkZW50aWZpZXIoImJhciIpOworICAgIHgtPnNldF9lbnVtKGVudW1zWzBdKTsKKyAgICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKHgpOworICB9CisgIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB4ID0gbmV3IHRfY29uc3RfdmFsdWU7CisgICAgeC0+c2V0X21hcCgpOworICAgIHgtPmFkZF9tYXAoY29uc3RfdmFsdWVzWzBdLCBjb25zdF92YWx1ZXNbMV0pOworICAgIHgtPmFkZF9tYXAoY29uc3RfdmFsdWVzWzFdLCBjb25zdF92YWx1ZXNbMF0pOworICAgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2soeCk7CisgIH0KKyAgeworICAgIHRfY29uc3RfdmFsdWUqIHggPSBuZXcgdF9jb25zdF92YWx1ZTsKKyAgICB4LT5zZXRfbGlzdCgpOworICAgIHgtPmFkZF9saXN0KGNvbnN0X3ZhbHVlc1swXSk7CisgICAgeC0+YWRkX2xpc3QoY29uc3RfdmFsdWVzWzFdKTsKKyAgICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKHgpOworICB9Cit9CisKK3ZvaWQgaW5pdF9jb25zdHMoKSB7CisgIC8vIGJhc2VfdHlwZS9lbnVtIGluZGV4ZXMgZm9yIHRoaXMgYW5kIG90aGVyIHRlc3RzIGFyZSBhcmJpdHJhcnkKKyAgY29uc3RzLnB1c2hfYmFjayhuZXcgdF9jb25zdChiYXNlX3R5cGVzWzJdLCAiYWFhIiwgY29uc3RfdmFsdWVzWzBdKSk7CisgIGNvbnN0cy5iYWNrKCktPnNldF9kb2MoInNvZW0gZG9jIik7CisgIGNvbnN0cy5wdXNoX2JhY2sobmV3IHRfY29uc3QoYmFzZV90eXBlc1szXSwgImJiYiIsIGNvbnN0X3ZhbHVlc1sxXSkpOworfQorCit2b2lkIGluaXRfZW51bV92YWx1ZXMoKSB7CisgIGVudW1fdmFsdWVzLnB1c2hfYmFjayhuZXcgdF9lbnVtX3ZhbHVlKCJWQUwxIiwgMTEpKTsKKyAgZW51bV92YWx1ZXMuYmFjaygpLT5zZXRfZG9jKCJlbnVtIGRvYyAxIik7CisgIGVudW1fdmFsdWVzLmJhY2soKS0+YW5ub3RhdGlvbnNfLmluc2VydChzdGQ6Om1ha2VfcGFpcigiYW5ubzEiLCAidmFsMSIpKTsKKworICBlbnVtX3ZhbHVlcy5wdXNoX2JhY2sobmV3IHRfZW51bV92YWx1ZSgiVkFMMiIsIDIyKSk7Cit9CisKK3ZvaWQgaW5pdF9lbnVtcygpIHsKKyAgZW51bXMucHVzaF9iYWNrKG5ldyB0X2VudW0ocHJvZ3JhbXNbMF0pKTsKKyAgZW51bXMuYmFjaygpLT5zZXRfZG9jKCJlbnVtIGRvYyAxIik7CisgIGVudW1zLmJhY2soKS0+YW5ub3RhdGlvbnNfLmluc2VydChzdGQ6Om1ha2VfcGFpcigiYW5ubzEiLCAidmFsMSIpKTsKKyAgZW51bXMuYmFjaygpLT5zZXRfbmFtZSgiZm9vbyIpOworICBlbnVtcy5iYWNrKCktPmFwcGVuZChlbnVtX3ZhbHVlc1swXSk7CisgIGVudW1zLmJhY2soKS0+YXBwZW5kKGVudW1fdmFsdWVzWzFdKTsKK30KKwordm9pZCBpbml0X2xpc3RzKCkgeworICBsaXN0cy5wdXNoX2JhY2sobmV3IHRfbGlzdChlbnVtc1swXSkpOworICBsaXN0cy5wdXNoX2JhY2sobmV3IHRfbGlzdChiYXNlX3R5cGVzWzVdKSk7CisgIGxpc3RzLmJhY2soKS0+c2V0X2NwcF9uYW1lKCJsaXN0X2NwcF9uYW1lXzEiKTsKK30KK3ZvaWQgaW5pdF9zZXRzKCkgeworICBzZXRzLnB1c2hfYmFjayhuZXcgdF9zZXQoYmFzZV90eXBlc1s0XSkpOworICBzZXRzLnB1c2hfYmFjayhuZXcgdF9zZXQoZW51bXNbMF0pKTsKKyAgc2V0cy5iYWNrKCktPnNldF9jcHBfbmFtZSgic2V0X2NwcF9uYW1lXzEiKTsKK30KK3ZvaWQgaW5pdF9tYXBzKCkgeworICBtYXBzLnB1c2hfYmFjayhuZXcgdF9tYXAoYmFzZV90eXBlc1s0XSwgYmFzZV90eXBlc1sxXSkpOworICBtYXBzLnB1c2hfYmFjayhuZXcgdF9tYXAoYmFzZV90eXBlc1s1XSwgZW51bXNbMF0pKTsKKyAgbWFwcy5iYWNrKCktPnNldF9jcHBfbmFtZSgibWFwX2NwcF9uYW1lXzEiKTsKK30KKwordm9pZCBpbml0X3R5cGVkZWZzKCkgeworICB0eXBlZGVmcy5wdXNoX2JhY2sobmV3IHRfdHlwZWRlZihwcm9ncmFtc1swXSwgYmFzZV90eXBlc1szXSwgIlZBTDEiKSk7Cit9Cit2b2lkIGluaXRfZmllbGRzKCkgeworICBmaWVsZHMucHVzaF9iYWNrKG5ldyB0X2ZpZWxkKGJhc2VfdHlwZXNbMV0sICJmMSIpKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3JlZmVyZW5jZShmYWxzZSk7CisgIGZpZWxkcy5iYWNrKCktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgIGZpZWxkcy5wdXNoX2JhY2sobmV3IHRfZmllbGQoYmFzZV90eXBlc1syXSwgImYyIiwgOSkpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVmZXJlbmNlKHRydWUpOworICBmaWVsZHMucHVzaF9iYWNrKG5ldyB0X2ZpZWxkKGJhc2VfdHlwZXNbM10sICJmMyIsIDExKSk7CisgIGZpZWxkcy5iYWNrKCktPnNldF9yZXEodF9maWVsZDo6VF9SRVFVSVJFRCk7CisgIGZpZWxkcy5iYWNrKCktPnNldF92YWx1ZShjb25zdF92YWx1ZXNbMF0pOworfQordm9pZCBpbml0X3N0cnVjdHMoKSB7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgInN0cnVjdDEiKSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzBdKTsKKyAgc3RydWN0cy5iYWNrKCktPmFwcGVuZChmaWVsZHNbMV0pOworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJ1bmlvbjEiKSk7CisgIHN0cnVjdHMuYmFjaygpLT5hcHBlbmQoZmllbGRzWzBdKTsKKyAgc3RydWN0cy5iYWNrKCktPmFwcGVuZChmaWVsZHNbMV0pOworICBzdHJ1Y3RzLmJhY2soKS0+c2V0X3VuaW9uKHRydWUpOworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJ4Y2VwdDEiKSk7CisgIHN0cnVjdHMuYmFjaygpLT5zZXRfeGNlcHRpb24odHJ1ZSk7Cit9Cit2b2lkIGluaXRfZnVuY3Rpb25zKCkgeworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJlcnJzMSIpKTsKKyAgdF9zdHJ1Y3QqIGVycm9ycyA9IHN0cnVjdHMuYmFjaygpOworICBzdHJ1Y3RzLnB1c2hfYmFjayhuZXcgdF9zdHJ1Y3QocHJvZ3JhbXNbMF0sICJhcmdzMSIpKTsKKyAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSBzdHJ1Y3RzLmJhY2soKTsKKyAgZnVuY3Rpb25zLnB1c2hfYmFjayhuZXcgdF9mdW5jdGlvbihiYXNlX3R5cGVzWzBdLCAiZnVuYzEiLCBlcnJvcnMsIGFyZ2xpc3QsIGZhbHNlKSk7CisgIGZ1bmN0aW9ucy5wdXNoX2JhY2sobmV3IHRfZnVuY3Rpb24oYmFzZV90eXBlc1swXSwgImZ1bmMyIiwgZXJyb3JzLCBhcmdsaXN0LCB0cnVlKSk7Cit9Cit2b2lkIGluaXRfc2VydmljZXMoKSB7CisgIHNlcnZpY2VzLnB1c2hfYmFjayhuZXcgdF9zZXJ2aWNlKHByb2dyYW1zWzBdKSk7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X2RvYygic3J2MSBkb2MiKTsKKyAgc2VydmljZXMuYmFjaygpLT5zZXRfbmFtZSgic3J2MSIpOworICBzZXJ2aWNlcy5iYWNrKCktPmFkZF9mdW5jdGlvbihmdW5jdGlvbnNbMF0pOworICBzZXJ2aWNlcy5iYWNrKCktPmFkZF9mdW5jdGlvbihmdW5jdGlvbnNbMV0pOworCisgIHNlcnZpY2VzLnB1c2hfYmFjayhuZXcgdF9zZXJ2aWNlKHByb2dyYW1zWzBdKSk7CisgIHNlcnZpY2VzLmJhY2soKS0+c2V0X25hbWUoInNydjIiKTsKKyAgc2VydmljZXMuYmFjaygpLT5zZXRfZXh0ZW5kcyhzZXJ2aWNlc1swXSk7Cit9CisKK3N0ZDo6dmVjdG9yPHRfdHlwZSo+IHR5cGVzOwordm9pZCBpbml0X3R5cGVzKCkgeworI2RlZmluZSBUX0NPUFlfVFlQRVModHlwZSkgc3RkOjpjb3B5KHR5cGUjI3MuYmVnaW4oKSwgdHlwZSMjcy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHR5cGVzKSkKKyAgVF9DT1BZX1RZUEVTKGJhc2VfdHlwZSk7CisgIFRfQ09QWV9UWVBFUyhlbnVtKTsKKyAgVF9DT1BZX1RZUEVTKHR5cGVkZWYpOworICBUX0NPUFlfVFlQRVMoc3RydWN0KTsKKyAgVF9DT1BZX1RZUEVTKGxpc3QpOworICBUX0NPUFlfVFlQRVMoc2V0KTsKKyAgVF9DT1BZX1RZUEVTKG1hcCk7CisvLyBUX0NPUFlfVFlQRVMoc2VydmljZSk7CisjdW5kZWYgVF9DT1BZX1RZUEVTCit9CisKK3ZvaWQgaW5pdCgpIHsKKyAgaWYgKCFoYXNfZGF0YSkgeworICAgIGhhc19kYXRhID0gdHJ1ZTsKKyNkZWZpbmUgVF9JTklUX1RFU1REQVRBKHIsIGQsIGVsZW0pIGluaXRfIyNlbGVtIyNzKCk7CisgICAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUX0lOSVRfVEVTVERBVEEsIF8sIFRfVEVTVF9UWVBFUykKKyAgICBpbml0X3R5cGVzKCk7CisjdW5kZWYgVF9JTklUX1RFU1REQVRBCisgIH0KK30KK30KK3N0cnVjdCBHbG9iYWxGaXh0dXJlIHsKKyAgfkdsb2JhbEZpeHR1cmUoKSB7IHRlc3RfZGF0YTo6Y2xlYW51cCgpOyB9Cit9OworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmUpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmUpCisjZW5kaWYKKwordm9pZCBtaWdyYXRlX2dsb2JhbF9jYWNoZSgpIHsKKyAgcGx1Z2luOjpUeXBlUmVnaXN0cnkgcmVnOworICBwbHVnaW5fb3V0cHV0OjpnZXRfZ2xvYmFsX2NhY2hlKHJlZyk7CisgIHBsdWdpbjo6c2V0X2dsb2JhbF9jYWNoZShyZWcpOworICBwbHVnaW5fb3V0cHV0OjpjbGVhcl9nbG9iYWxfY2FjaGUoKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCogcm91bmRfdHJpcChUKiB0KSB7CisgIHR5cGVuYW1lIHBsdWdpbjo6VG9UeXBlPFQ+Ojp0eXBlIHA7CisgIHBsdWdpbjo6Y2xlYXJfZ2xvYmFsX2NhY2hlKCk7CisgIHBsdWdpbl9vdXRwdXQ6OmNsZWFyX2dsb2JhbF9jYWNoZSgpOworICBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KHQsIHApOworICBtaWdyYXRlX2dsb2JhbF9jYWNoZSgpOworICByZXR1cm4gcGx1Z2luOjpjb252ZXJ0KHApOworfQorCit2b2lkIHRlc3RfYmFzZV90eXBlKDo6dF9iYXNlX3R5cGUqIHN1dCkgeworICBwbHVnaW46OnRfYmFzZV90eXBlIHA7CisgIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQoc3V0LCBwKTsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8IDo6dF9iYXNlX3R5cGU+IHN1dDIocGx1Z2luOjpjb252ZXJ0KHApKTsKKworI2RlZmluZSBUSFJJRlRfQ0hFQ0sociwgZGF0YSwgZWxlbSkgQk9PU1RfUFBfRVhQQU5EKEJPT1NUX0NIRUNLX0VRVUFMKGRhdGEgZWxlbSwgc3V0Mi0+ZWxlbSkpOworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfdm9pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Jvb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJpbmdfbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2JpbmFyeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cmluZ19lbnVtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYmFzZV90eXBlKCkpKSkKK30KKwordm9pZCB0ZXN0X2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2NvbnN0X3ZhbHVlPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfdHlwZSgpLCBzdXQyLT5nZXRfdHlwZSgpKTsKKyAgc3dpdGNoIChzdXQtPmdldF90eXBlKCkpIHsKKyNkZWZpbmUgVF9DT05TVF9WQUxVRV9DQVNFKHR5cGUsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjp0eXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF8jI25hbWUoKSwgc3V0Mi0+Z2V0XyMjbmFtZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShDVl9JTlRFR0VSLCBpbnRlZ2VyKTsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfRE9VQkxFLCBkb3VibGUpOworICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShDVl9TVFJJTkcsIHN0cmluZyk7CisgICAgVF9DT05TVF9WQUxVRV9DQVNFKENWX0lERU5USUZJRVIsIGlkZW50aWZpZXIpOworI3VuZGVmIFRfQ09OU1RfVkFMVUVfQ0FTRQorICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9tYXAoKS5zaXplKCksIHN1dDItPmdldF9tYXAoKS5zaXplKCkpOworICAgIHsKKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSwgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlPiBzdXRfdmFsdWVzOworICAgICAgZm9yIChzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN1dC0+Z2V0X21hcCgpLmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IHN1dC0+Z2V0X21hcCgpLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHN1dF92YWx1ZXNbaXQtPmZpcnN0LT5nZXRfdHlwZSgpXSA9IGl0LT5zZWNvbmQtPmdldF90eXBlKCk7CisgICAgICB9CisgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUsIHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZT4gc3V0Ml92YWx1ZXM7CisgICAgICBmb3IgKHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3V0Mi0+Z2V0X21hcCgpLmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IHN1dDItPmdldF9tYXAoKS5lbmQoKTsgaXQrKykgeworICAgICAgICBzdXQyX3ZhbHVlc1tpdC0+Zmlyc3QtPmdldF90eXBlKCldID0gaXQtPnNlY29uZC0+Z2V0X3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dF92YWx1ZXMuYmVnaW4oKS0+Zmlyc3QsIHN1dDJfdmFsdWVzLmJlZ2luKCktPmZpcnN0KTsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dF92YWx1ZXMuYmVnaW4oKS0+c2Vjb25kLCBzdXQyX3ZhbHVlcy5iZWdpbigpLT5zZWNvbmQpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2xpc3QoKS5zaXplKCksIHN1dDItPmdldF9saXN0KCkuc2l6ZSgpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9saXN0KCkuZnJvbnQoKS0+Z2V0X3R5cGUoKSwgc3V0Mi0+Z2V0X2xpc3QoKS5mcm9udCgpLT5nZXRfdHlwZSgpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBCT09TVF9BU1NFUlQoZmFsc2UpOworICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgdGVzdF9jb25zdCh0X2NvbnN0KiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8IDo6dF9jb25zdD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3ZhbHVlKCktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpKSkpCit9CisKK3ZvaWQgdGVzdF9lbnVtX3ZhbHVlKHRfZW51bV92YWx1ZSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfZW51bV92YWx1ZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMywgKGdldF9uYW1lKCksIGdldF92YWx1ZSgpLCBnZXRfZG9jKCkpKSkKK30KKwordm9pZCB0ZXN0X2VudW0odF9lbnVtKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8IDo6dF9lbnVtPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21pbl92YWx1ZSgpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbWF4X3ZhbHVlKCktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jb25zdGFudF9ieV92YWx1ZSgxMSktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jb25zdGFudF9ieV9uYW1lKCJWQUwxIiktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSkpKQorfQorCit2b2lkIHRlc3RfbGlzdCh0X2xpc3QqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2xpc3Q+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2VsZW1fdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jcHBfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmhhc19jcHBfbmFtZSgpKQorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2NwcF9uYW1lKCksIHN1dDItPmdldF9jcHBfbmFtZSgpKTsKK30KK3ZvaWQgdGVzdF9zZXQodF9zZXQqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3NldD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfZWxlbV90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2NwcF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKKyAgaWYgKHN1dC0+aGFzX2NwcF9uYW1lKCkpCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfY3BwX25hbWUoKSwgc3V0Mi0+Z2V0X2NwcF9uYW1lKCkpOworfQordm9pZCB0ZXN0X21hcCh0X21hcCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfbWFwPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9rZXlfdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF92YWxfdHlwZSgpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jcHBfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCisgIGlmIChzdXQtPmhhc19jcHBfbmFtZSgpKQorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2NwcF9uYW1lKCksIHN1dDItPmdldF9jcHBfbmFtZSgpKTsKK30KKwordm9pZCB0ZXN0X3R5cGVkZWYodF90eXBlZGVmKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF90eXBlZGVmPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9zeW1ib2xpYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2ZvcndhcmRfdHlwZWRlZigpKSkpCit9CisKK3ZvaWQgdGVzdF90eXBlKHRfdHlwZSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfdHlwZT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfdm9pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Jhc2VfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Jvb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc190eXBlZGVmKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZW51bSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cnVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hjZXB0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29udGFpbmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3NldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX21hcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3NlcnZpY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorfQorCit2b2lkIHRlc3RfZmllbGQodF9maWVsZCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfZmllbGQ+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X3JlcSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yZWZlcmVuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfa2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKKyAgaWYgKHN1dC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICBUSFJJRlRfQ0hFQ0soLCBzdXQtPiwgZ2V0X3ZhbHVlKCktPmdldF90eXBlKCkpOworICB9IGVsc2UgeworICAgIEJPT1NUX0NIRUNLKCFzdXQyLT5nZXRfdmFsdWUoKSk7CisgIH0KKyAgaWYgKHN1dC0+Z2V0X3R5cGUoKSkgeworICAgIFRIUklGVF9DSEVDSygsIHN1dC0+LCBnZXRfdHlwZSgpLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBCT09TVF9DSEVDSyghc3V0Mi0+Z2V0X3R5cGUoKSk7CisgIH0KK30KK3ZvaWQgdGVzdF9zdHJ1Y3QodF9zdHJ1Y3QqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3N0cnVjdD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc191bmlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hjZXB0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RydWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKK30KKwordm9pZCB0ZXN0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X2Z1bmN0aW9uPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSCgKKyAgICAgIFRIUklGVF9DSEVDSywKKyAgICAgIHN1dC0+LAorICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LCAoZ2V0X2RvYygpLCBnZXRfbmFtZSgpLCBnZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpLCBpc19vbmV3YXkoKSkpKQorfQordm9pZCB0ZXN0X3NlcnZpY2UodF9zZXJ2aWNlKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9zZXJ2aWNlPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgzLCAoZ2V0X2RvYygpLCBnZXRfbmFtZSgpLCBnZXRfZnVuY3Rpb25zKCkuc2l6ZSgpKSkpCisgIGlmIChzdXQtPmdldF9leHRlbmRzKCkpIHsKKyAgICBUSFJJRlRfQ0hFQ0soLCBzdXQtPiwgZ2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgQk9PU1RfQ0hFQ0soIXN1dDItPmdldF9leHRlbmRzKCkpOworICB9Cit9CisKK3ZvaWQgdGVzdF9wcm9ncmFtKHRfcHJvZ3JhbSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfcHJvZ3JhbT4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLCBzdXQtPiwgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgyLCAoZ2V0X2RvYygpLCBnZXRfbmFtZSgpKSkpCit9Citib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBkb19pbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgdGVzdF9kYXRhOjppbml0KCk7CisgIHRlc3Rfc3VpdGUqIHRzID0gQk9PU1RfVEVTVF9TVUlURSgiUGx1Z2luQ29udmVyc2lvblRlc3QiKTsKKworI2RlZmluZSBUX1RFU1RfQ0FTRShyLCBkLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0cy0+YWRkKEJPT1NUX1BBUkFNX1RFU1RfQ0FTRSh0ZXN0XyMjdHlwZSwgdGVzdF9kYXRhOjp0eXBlIyNzLmJlZ2luKCksIHRlc3RfZGF0YTo6dHlwZSMjcy5lbmQoKSkpOworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRfVEVTVF9DQVNFLCBfLCBUX1RFU1RfVFlQRVMpCisgIFRfVEVTVF9DQVNFKF8sIF8sIHR5cGUpCisjdW5kZWYgVF9URVNUX0NBU0UKKyAgcmV0dXJuIHRzOworfQorCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFkZChkb19pbml0X3VuaXRfdGVzdF9zdWl0ZSgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSwgYXJnYywgYXJndik7Cit9CisjZWxzZQorYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICByZXR1cm4gZG9faW5pdF91bml0X3Rlc3Rfc3VpdGUoKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NwcF9wbHVnaW4uY2MgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY3BwX3BsdWdpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2MxOWYyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NwcF9wbHVnaW4uY2MKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwbHVnaW4geworCitjbGFzcyBNeUNwcEdlbmVyYXRvciA6IHB1YmxpYyBHZW5lcmF0b3JQbHVnaW4geworICB2aXJ0dWFsIGludCBnZW5lcmF0ZSg6OnRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMpIHsKKyAgICB0X2dlbmVyYXRvciogZ2VuID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgImNwcCIsIHBhcnNlZF9vcHRpb25zLCAiIik7CisgICAgZ2VuLT5nZW5lcmF0ZV9wcm9ncmFtKCk7CisgICAgZGVsZXRlIGdlbjsKKyAgICByZXR1cm4gMDsKKyAgfQorfTsKK30KK30KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpNeUNwcEdlbmVyYXRvciBwOworICByZXR1cm4gcC5leGVjKGFyZ2MsIGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViN2M5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2gKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIGJ5IG1ha2UuCisjCisjIFRoaXMgZmlsZSBydW5zIHRoZSBjb21waWxlciB0d2ljZSwgdXNpbmcgYSBwbHVnaW4gdGhhdCBqdXN0IGludm9rZXMKKyMgL2Jpbi9jYXQsIGFuZCBjb21wYXJlcyB0aGUgb3V0cHV0LiAgSWYgR2VuZXJhdG9ySW5wdXQgaXMKKyMgbm9uZGV0ZXJtaW5zaXRpYywgeW91J2QgZXhwZWN0IHRoZSBvdXRwdXQgdG8gZGlmZmVyIGZyb20gcnVuLXRvLXJ1bi4KKyMgU28gdGhpcyB0ZXN0cyB0aGF0IGluIGZhY3QsIHRoZSBvdXRwdXQgaXMgc3RhYmxlIGZyb20gcnVuLXRvLXJ1bi4KK3NldCAtZQorbWtkaXIgLXAgZ2VuLWJpbmNhdAorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1nZW4gYmluY2F0IC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQgPiBnZW4tYmluY2F0LzEuc2VyCitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLWdlbiBiaW5jYXQgLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCA+IGdlbi1iaW5jYXQvMi5zZXIKK2RpZmYgLS1iaW5hcnkgZ2VuLWJpbmNhdC8xLnNlciBnZW4tYmluY2F0LzIuc2VyCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvdGVzdHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiMTAwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE1MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjEyKQorCitwcm9qZWN0KHRocmlmdF9jb21waWxlcl90ZXN0cykKKworc2V0KFRIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uCispCisKKyMgZG9uJ3QgZ2VuZXJhdGUgWkVST19DSEVDSworc2V0KENNQUtFX1NVUFBSRVNTX1JFR0VORVJBVElPTiB0cnVlKQorCitjb25maWd1cmVfZmlsZSgke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaCkKK2lmKE1TVkMpCisgICAgIyBUaGUgd2luZmxleGJpc29uIGdlbmVyYXRvciBvdXRwdXRzIHNvbWUgbWFjcm9zIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGUgVmlzdWFsIFN0dWRpbyAyMDEwIGNvcHkgb2Ygc3RkaW50LmgKKyAgICAjIFRoaXMgbWlnaHQgYmUgZml4ZWQgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgVmlzdWFsIFN0dWRpbywgYnV0IGFuIGVhc3kgc29sdXRpb24gaXMgdG8gaW5jbHVkZSBzdGRpbnQuaCBmaXJzdAorICAgIGlmKEhBVkVfU1RESU5UX0gpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRF9fU1REQ19MSU1JVF9NQUNST1MpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygvRkkic3RkaW50LmgiKQorICAgIGVuZGlmKEhBVkVfU1RESU5UX0gpCitlbmRpZigpCisKK2ZpbmRfcGFja2FnZShGTEVYIFJFUVVJUkVEKQorZmluZF9wYWNrYWdlKEJJU09OIFJFUVVJUkVEKQorCisjIGNyZWF0ZSBkaXJlY3RvcnkgZm9yIHRocmlmdHkgYW5kIHRocmlmdGwKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC8pCisKKyMgQ3JlYXRlIGZsZXggYW5kIGJpc29uIGZpbGVzIGFuZCBidWlsZCB0aGUgbGliIHBhcnNlIHN0YXRpYyBsaWJyYXJ5CitCSVNPTl9UQVJHRVQodGhyaWZ0eSAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdHkueXkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjKQorRkxFWF9UQVJHRVQodGhyaWZ0bCAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdGwubGwgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjKQorQUREX0ZMRVhfQklTT05fREVQRU5ERU5DWSh0aHJpZnRsIHRocmlmdHkpCisKK3NldChwYXJzZV9TT1VSQ0VTCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmhoCispCisKK2FkZF9saWJyYXJ5KHBhcnNlIFNUQVRJQyAke3BhcnNlX1NPVVJDRVN9KQorCisjIFRocmlmdCBjb21waWxlciB0ZXN0cworc2V0KHRocmlmdF9jb21waWxlcl90ZXN0cworKQorCisjIHlvdSBjYW4gYWRkIHNvbWUgZmlsZXMgbWFudWFsbHkgdGhlcmUgCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTCisgICAgIyB0ZXN0cyBmaWxlIHRvIGF2b2lkIG1haW4gaW4gZXZlcnkgdGVzdCBmaWxlCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3RzX21haW4uY2MKKykKKworIyBzZXQgdmFyaWFibGUgZm9yIHRlc3RzIHNvdXJjZXMgLSB3aWxsIGJlIGZpbGxlZCBsYXRlcgorc2V0KHRocmlmdF9jb21waWxlcl90ZXN0c19TT1VSQ0VTCispCisKK3NldCh0aHJpZnRfY29tcGlsZXJfU09VUkNFUworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvbG9nZ2luZy5jYyAjIHdlIHVzZSBsb2dnaW5nIGluc3RlYWQgb2YgbWFpbiB0byBhdm9pZCBicmVha2luZyBjb21waWxsYXRpb24gKDIgbWFpbiB2KQorICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2NvbW1vbi5jYworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaAorKQorCisjIFRoaXMgbWFjcm8gYWRkcyBhbiBvcHRpb24gVEhSSUZUX0NPTVBJTEVSXyR7TkFNRX0KKyMgdGhhdCBhbGxvd3MgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGNlcnRhaW4gbGFuZ3VhZ2VzCittYWNybyhUSFJJRlRfQUREX0NPTVBJTEVSIG5hbWUgZGVzY3JpcHRpb24gaW5pdGlhbCkKKyAgICBzdHJpbmcoVE9VUFBFUiAiVEhSSUZUX0NPTVBJTEVSXyR7bmFtZX0iIGVuYWJsZXIpCisgICAgc2V0KHNyYyAiJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9nZW5lcmF0ZS90XyR7bmFtZX1fZ2VuZXJhdG9yLmNjIikKKyAgICBvcHRpb24oJHtlbmFibGVyfSAke2Rlc2NyaXB0aW9ufSAke2luaXRpYWx9KQorICAgIGlmKCR7ZW5hYmxlcn0pCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdF9jb21waWxlcl9TT1VSQ0VTICR7c3JjfSkKKyAgICAgICAgZmlsZShHTE9CIHRocmlmdF9jb21waWxlcl90ZXN0c19TT1VSQ0VTCisgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7bmFtZX0vKi5jKiIKKyAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtuYW1lfS8qLnRocmlmdCIKKyAgICAgICAgKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBUaGUgZm9sbG93aW5nIGNvbXBpbGVyIHdpdGggdW5pdCB0ZXN0cyBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorVEhSSUZUX0FERF9DT01QSUxFUihjX2dsaWIgICJFbmFibGUgY29tcGlsZXIgZm9yIEMgd2l0aCBHbGliIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNwcCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQysrIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmEgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSIgICBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGFzMyAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQWN0aW9uU2NyaXB0IDMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZGFydCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEYXJ0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGhheGUgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGF4ZSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihjc2hhcnAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMjIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKG5ldGNvcmUgIkVuYWJsZSBjb21waWxlciBmb3IgLk5FVCBDb3JlIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocHkgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQeXRob24gMi4wIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHJiICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVieSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihwZXJsICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBlcmwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocGhwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQSFAiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZXJsICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBFcmxhbmciIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoY29jb2EgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBPYmplY3RpdmUtQyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihzd2lmdCAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvY29hIFN3aWZ0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHN0ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgU21hbGx0YWxrIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKG9jYW1sICAgIkVuYWJsZSBjb21waWxlciBmb3IgT0NhbWwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoaHMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIYXNrZWxsIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHhzZCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWFNEIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGh0bWwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSFRNTCBEb2N1bWVudGF0aW9uIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGpzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YVNjcmlwdCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqc29uICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEpTT04iIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoamF2YW1lICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhIE1FIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGRlbHBoaSAgIkVuYWJsZSBjb21waWxlciBmb3IgRGVscGhpIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGdvICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR28iIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZCAgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGx1YSAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgTHVhIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGd2ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR3JhcGhWaXoiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocnMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdXN0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHhtbCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWE1MIiBPRkYpCisKKyMgVGhyaWZ0IGlzIGxvb2tpbmcgZm9yIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkKKyMgd2UgYWxzbyBhZGQgdGhlIGN1cnJlbnQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NhdGNoKQorCithZGRfbGlicmFyeSh0aHJpZnRfY29tcGlsZXIgJHt0aHJpZnRfY29tcGlsZXJfU09VUkNFU30pCisKKyNsaW5rIHBhcnNlIGxpYiB0byB0aHJpZnRfY29tcGlsZXIgbGliCit0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0X2NvbXBpbGVyIHBhcnNlKQorCisjIGFkZCB0ZXN0cyBleGVjdXRhYmxlCithZGRfZXhlY3V0YWJsZSh0aHJpZnRfY29tcGlsZXJfdGVzdHMgJHt0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVN9ICR7dGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX1NPVVJDRVN9KQorCisjIGlmIGdlbmVyYXRlcyBmb3IgVmlzdWFsIFN0dWRpbyBzZXQgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIGFzIGRlZmF1bHQgcHJvamVjdAoraWYoTVNWQykKKyAgICBzZXRfcHJvcGVydHkoVEFSR0VUIHRocmlmdF9jb21waWxlcl90ZXN0cyBQUk9QRVJUWSBWU19TVEFSVFVQX1BST0pFQ1QgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQorZW5kaWYoKQorCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIFBST1BFUlRJRVMgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZIGJpbi8pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQorCit0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIHRocmlmdF9jb21waWxlcikKKworZW5hYmxlX3Rlc3RpbmcoKQorYWRkX3Rlc3QoTkFNRSBUaHJpZnRUZXN0cyBDT01NQU5EIHRocmlmdF9jb21waWxlcl90ZXN0cykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvUkVBRE1FLm1kIGIvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2JlNDkxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZApAQCAtMCwwICsxLDg4IEBACisjIEJ1aWxkIGFuZCBydW4gY29tcGlsZXIgdGVzdHMgdXNpbmcgQ01ha2UKKworPCEtLSBUT0MgLS0+CisKKy0gW0J1aWxkIGFuZCBydW4gY29tcGlsZXIgdGVzdHMgdXNpbmcgQ01ha2VdKCNidWlsZC1hbmQtcnVuLWNvbXBpbGVyLXRlc3RzLXVzaW5nLWNtYWtlKQorICAgIC0gW0dlbmVyYWwgaW5mb3JtYXRpb25dKCNnZW5lcmFsLWluZm9ybWF0aW9uKQorICAgIC0gW0hvdyB0byBhZGQgeW91ciB0ZXN0c10oI2hvdy10by1hZGQteW91ci10ZXN0cykKKyAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zXSgjYnVpbGQtYW5kLXJ1bi10ZXN0cy1vbi11bml4LWxpa2Utc3lzdGVtcykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlczpdKCNwcmVyZXF1aXNpdGVzKQorICAgICAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3Qgd2l0aCBDTWFrZV0oI2J1aWxkLWFuZC1ydW4tdGVzdC13aXRoLWNtYWtlKQorICAgIC0gW0J1aWxkIGFuZCBydW4gdGVzdHMgb24gV2luZG93c10oI2J1aWxkLWFuZC1ydW4tdGVzdHMtb24td2luZG93cykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlczpdKCNwcmVyZXF1aXNpdGVzLTEpCisgICAgICAgIC0gW0dlbmVyYXRpb24gb2YgVlMgcHJvamVjdCB3aXRoIENNYWtlLCBidWlsZCBhbmQgcnVuIG9uIFdpbmRvd3NdKCNnZW5lcmF0aW9uLW9mLXZzLXByb2plY3Qtd2l0aC1jbWFrZS1idWlsZC1hbmQtcnVuLW9uLXdpbmRvd3MpCisKKzwhLS0gL1RPQyAtLT4KKworIyMgR2VuZXJhbCBpbmZvcm1hdGlvbiAKKworQWRkZWQgZ2VuZXJpYyB3YXkgdG8gY292ZXIgY29kZSBieSB0ZXN0cyBmb3IgbWFueSBsYW5ndWFnZXMgKHlvdSBqdXN0IG5lZWQgdG8gbWFrZSBhIGNvcnJlY3QgaGVhZGVyIGZpbGUgZm9yIGdlbmVyYXRvciBmb3IgeW91ciBsYW5ndWFnZSAtIGV4YW1wbGUgaW4gKipuZXRjb3JlKiogaW1wbGVtZW50YXRpb24pCisKK0F0IGN1cnJlbnQgbW9tZW50IHRoZXNlIHRlc3RzIHVzZSBmcmVlIENhdGNoIGxpYnJhcnkgKGh0dHBzOi8vZ2l0aHViLmNvbS9jYXRjaG9yZy9DYXRjaDIvdHJlZS9DYXRjaDEueCkgZm9yIGVhc3kgdGVzdCBjcmVhdGlvbiBhbmQgdXNhZ2UuCitEZWNpc2lvbiB0byB1c2UgaXQgd2FzIGJlY2F1c2Ugb2Ygc2ltcGxpY2l0eSwgZWFzeSB1c2FnZSwgb25lIGhlYWRlciBmaWxlIHRvIHVzZSwgc3RhYmxlIGNvbW11bml0eSBhbmQgZ3Jvd2luZyBpbnRlcmVzdCAgKGh0dHBzOi8vY3BwLmxpYmh1bnQuY29tL3Byb2plY3QvZ29vZ2xldGVzdC1nb29nbGUvdnMvY2F0Y2g/cmVsPWNtcC1jbXApCisKK0Fsc28sIG1heWJlLCBsYXRlciBpdCB3aWxsIGJlIG1pZ3JhdGVkIHRvIENhdGNoMiAoaHR0cHM6Ly9naXRodWIuY29tL3BoaWxzcXVhcmVkL0NhdGNoKSAtIGRlcGVuZHMgb24gbmVlZCB0byBzdXBwb3J0IGxlZ2FjeSBjb21waWxlcnMgKGMrKzk4KQorCisjIyBIb3cgdG8gYWRkIHlvdXIgdGVzdHMKKworLSBPcGVuICoqQ01ha2VMaXN0cy50eHQqKgorLSBTZXQgKipPbioqIHRvIGNhbGwgb2YgKipUSFJJRlRfQUREX0NPTVBJTEVSKiogZm9yIHlvdXIgbGFuZ3VhZ2UKKworYGBgIGNtYWtlIAorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitgYGAKKworLSBDcmVhdGUgZm9sZGVyIHdpdGggbmFtZSBzcGVjaWZpZWQgaW4gbGlzdCBvZiBsYW5ndWFnZXMgaW4gKipDTWFrZUxpc3RzLnR4dCoqCistIENyZWF0ZSB0ZXN0cyBpbiBmb2xkZXIgZm9yIHlvdXIgbGFuZ3VhZ2UgKHdpdGggZXh0ZW5zaW9ucyBsaWtlICouYyogLSBjYywgY3BwLCBldGMpCisgIC0gRG9uJ3QgZm9yZ2V0IHRvIGFkZCBpbmNsdWRlIG9mIGNhdGNoLmhwcCBpbiB5b3VyIHRlc3QgZmlsZQorICBgYGAgQworICAjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorICBgYGAKKworLSBJZiB5b3UgbmVlZCAtIGFkZCBmaWxlcyBtYW51YWxseSB0byAqKnRocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFUyoqIGluICoqQ01ha2VMaXN0cy50eHQqKiBzaW1pbGFyIHRvIAorCitgYGAgY21ha2UKKyMgeW91IGNhbiBhZGQgc29tZSBmaWxlcyBtYW51YWxseSB0aGVyZSAKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMKKyAgICAjIHRlc3RzIGZpbGUgdG8gYXZvaWQgbWFpbiBpbiBldmVyeSB0ZXN0IGZpbGUKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdHNfbWFpbi5jYworKQorYGBgCisKKy0gUnVuICoqY21ha2UqKiB3aXRoIGFyZ3VtZW50cyBmb3IgeW91ciBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXIgCistIEVuam95CisKKyMjIEJ1aWxkIGFuZCBydW4gdGVzdHMgb24gVW5peC1saWtlIHN5c3RlbXMKKworIyMjIFByZXJlcXVpc2l0ZXM6CistIEluc3RhbGwgQ01ha2UgLSA8aHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvPgorLSBJbnN0YWxsIHdpbmZsZXhiaXNvbiAtIDxodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vPgorCisjIyMgQnVpbGQgYW5kIHJ1biB0ZXN0IHdpdGggQ01ha2UKKworLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lIGluIGN1cnJlbnQgZGlyZWN0b3J5OgorCitgYGAKK21rZGlyIGNtYWtlLXZzICYmIGNkIGNtYWtlLXZzCitjbWFrZSAuLgorY21ha2UgLS1idWlsZCAuCitjdGVzdCAtQyBEZWJ1ZyAtVgorYGBgCisKKyMjIEJ1aWxkIGFuZCBydW4gdGVzdHMgb24gV2luZG93cworCisjIyMgUHJlcmVxdWlzaXRlczoKKy0gSW5zdGFsbCBDTWFrZSAtIDxodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8+CistIEluc3RhbGwgd2luZmxleGJpc29uIC0gPGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8+CistIEluc3RhbGwgVlMyMDE3IENvbW11bml0eSBFZGl0aW9uIC0gPGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvd2hhdHNuZXcvPiAoZW5zdXJlIHRoYXQgeW91IGluc3RhbGxlZCB3b3JrbG9hZCAiRGVza3RvcCBEZXZlbG9wbWVudCB3aXRoIEMrKyIgZm9yIFZTMjAxNykKKworIyMjIEdlbmVyYXRpb24gb2YgVlMgcHJvamVjdCB3aXRoIENNYWtlLCBidWlsZCBhbmQgcnVuIG9uIFdpbmRvd3MKKy0gUnVuIGNvbW1hbmRzIGluIGNvbW1hbmQgbGluZSBpbiBjdXJyZW50IGRpcmVjdG9yeSAoZW5zdXJlIHRoYXQgVlMgaW5zdGFsbGVkKToKKworYGBgCitta2RpciBjbWFrZS12cworY2QgY21ha2UtdnMKK2NtYWtlIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2N0ZXN0IC1DIERlYnVnIC1WCitgYGAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvY2F0Y2gvY2F0Y2guaHBwIGIvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2QwMzdlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcApAQCAtMCwwICsxLDExNTA4IEBACisvKgorICogIENhdGNoIHYxLjkuNAorICogIEdlbmVyYXRlZDogMjAxNy0wNS0xNiAxMzo1MTo1NS41MDY1MTkKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhpcyBmaWxlIGhhcyBiZWVuIG1lcmdlZCBmcm9tIG11bHRpcGxlIGhlYWRlcnMuIFBsZWFzZSBkb24ndCBlZGl0IGl0IGRpcmVjdGx5CisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFR3byBCbHVlIEN1YmVzIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICogIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisjaWZuZGVmIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NBVENIX0hQUF9JTkNMVURFRAorCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworIyAgICBwcmFnbWEgY2xhbmcgc3lzdGVtX2hlYWRlcgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfc3VwcHJlc3Nfd2FybmluZ3MuaAorCisjaWZkZWYgX19jbGFuZ19fCisjICAgaWZkZWYgX19JQ0MgLy8gaWNwYyBkZWZpbmVzIHRoZSBfX2NsYW5nX18gbWFjcm8KKyMgICAgICAgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgICAgICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogMTYxIDE2ODIpCisjICAgZWxzZSAvLyBfX0lDQworIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2dsb2JhbC1jb25zdHJ1Y3RvcnMiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdmFyaWFkaWMtbWFjcm9zIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2M5OS1leHRlbnNpb25zIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKys5OC1jb21wYXQiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrOTgtY29tcGF0LXBlZGFudGljIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N3aXRjaC1lbnVtIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2NvdmVyZWQtc3dpdGNoLWRlZmF1bHQiCisjICAgIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3ZhcmlhZGljLW1hY3JvcyIKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXZhcmlhYmxlIgorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYXJlbnRoZXNlcyIKKworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19NQUlOKSB8fCBkZWZpbmVkKENBVENIX0NPTkZJR19SVU5ORVIpCisjICBkZWZpbmUgQ0FUQ0hfSU1QTAorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9JTVBMCisjICBpZm5kZWYgQ0xBUkFfQ09ORklHX01BSU4KKyMgICAgZGVmaW5lIENMQVJBX0NPTkZJR19NQUlOX05PVF9ERUZJTkVECisjICAgIGRlZmluZSBDTEFSQV9DT05GSUdfTUFJTgorIyAgZW5kaWYKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbm90aW1wbGVtZW50ZWRfZXhjZXB0aW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX05PVElNUExFTUVOVEVEX0VYQ0VQVElPTl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21tb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTU9OX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbXBpbGVyX2NhcGFiaWxpdGllcy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01QSUxFUl9DQVBBQklMSVRJRVNfSFBQX0lOQ0xVREVECisKKy8vIERldGVjdCBhIG51bWJlciBvZiBjb21waWxlciBmZWF0dXJlcyAtIG1vc3RseSBDKysxMS8xNCBjb25mb3JtYW5jZSAtIGJ5IGNvbXBpbGVyCisvLyBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBkZWZpbmVkOgorLy8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSIDogaXMgbnVsbHB0ciBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQgOiBpcyBub2V4Y2VwdCBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMgOiBUaGUgZGVsZXRlIGFuZCBkZWZhdWx0IGtleXdvcmRzIGZvciBjb21waWxlciBnZW5lcmF0ZWQgbWV0aG9kcworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0gOiBzdGQ6OmlzX2VudW0gaXMgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFIDogc3RkOjp0dXBsZSBpcyBzdXBwb3J0ZWQKKy8vIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcgOiBpcyBsb25nIGxvbmcgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFIDogaXMgb3ZlcnJpZGUgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIgOiBpcyB1bmlxdWVfcHRyIHN1cHBvcnRlZCAob3RoZXJ3aXNlIHVzZSBhdXRvX3B0cikKKy8vIENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFIDogaXMgc3RkOjpzaHVmZmxlIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUyA6IGFyZSB0eXBlX3RyYWl0cyBhbmQgZW5hYmxlX2lmIHN1cHBvcnRlZD8KKworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX09SX0dSRUFURVIgOiBJcyBDKysxMSBzdXBwb3J0ZWQ/CisKKy8vIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MgOiBhcmUgdmFyaWFkaWMgbWFjcm9zIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DT1VOVEVSIDogaXMgdGhlIF9fQ09VTlRFUl9fIG1hY3JvIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCA6IGlzIFdpbmRvd3MgU0VIIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTIDogYXJlIFBPU0lYIHNpZ25hbHMgc3VwcG9ydGVkPworLy8gKioqKioqKioqKioqKioqKgorLy8gTm90ZSB0byBtYWludGFpbmVyczogaWYgbmV3IHRvZ2dsZXMgYXJlIGFkZGVkIHBsZWFzZSBkb2N1bWVudCB0aGVtCisvLyBpbiBjb25maWd1cmF0aW9uLm1kLCB0b28KKy8vICoqKioqKioqKioqKioqKioKKworLy8gSW4gZ2VuZXJhbCBlYWNoIG1hY3JvIGhhcyBhIF9OT188ZmVhdHVyZSBuYW1lPiBmb3JtCisvLyAoZS5nLiBDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgd2hpY2ggZGlzYWJsZXMgdGhlIGZlYXR1cmUuCisvLyBNYW55IGZlYXR1cmVzLCBhdCBwb2ludCBvZiBkZXRlY3Rpb24sIGRlZmluZSBhbiBfSU5URVJOQUxfIG1hY3JvLCBzbyB0aGV5CisvLyBjYW4gYmUgY29tYmluZWQsIGVuLW1hc3MsIHdpdGggdGhlIF9OT18gZm9ybXMgbGF0ZXIuCisKKy8vIEFsbCB0aGUgQysrMTEgZmVhdHVyZXMgY2FuIGJlIGRpc2FibGVkIHdpdGggQ0FUQ0hfQ09ORklHX05PX0NQUDExCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjICBpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjICAgIGRlZmluZSBDQVRDSF9DUFAxMV9PUl9HUkVBVEVSCisjICBlbmRpZgorCisjICBpZiBfX2NwbHVzcGx1cyA+PSAyMDE0MDJMCisjICAgIGRlZmluZSBDQVRDSF9DUFAxNF9PUl9HUkVBVEVSCisjICBlbmRpZgorCisjZW5kaWYKKworI2lmZGVmIF9fY2xhbmdfXworCisjICBpZiBfX2hhc19mZWF0dXJlKGN4eF9udWxscHRyKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgIGVuZGlmCisKKyMgIGlmIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChDQVRDSF9DUFAxMV9PUl9HUkVBVEVSKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHB1c2giICkgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XZXhpdC10aW1lLWRlc3RydWN0b3JzXCIiICkKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHBvcCIgKQorCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIiApIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV3BhcmVudGhlc2VzXCIiICkKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcG9wIiApCisjICAgZW5kaWYKKworI2VuZGlmIC8vIF9fY2xhbmdfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV2Uga25vdyBzb21lIGVudmlyb25tZW50cyBub3QgdG8gc3VwcG9ydCBmdWxsIFBPU0lYIHNpZ25hbHMKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19RTlhfXykKKworIyAgIGlmICFkZWZpbmVkKENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1BPU0lYX1NJR05BTFMKKyMgICBlbmRpZgorCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEN5Z3dpbgorI2lmZGVmIF9fQ1lHV0lOX18KKworLy8gUmVxdWlyZWQgZm9yIHNvbWUgdmVyc2lvbnMgb2YgQ3lnd2luIHRvIGRlY2xhcmUgZ2V0dGltZW9mZGF5CisvLyBzZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzY5MDE4MDMvZ2V0dGltZW9mZGF5LW5vdC1kZWNsYXJlZC1pbi10aGlzLXNjb3BlLWN5Z3dpbgorIyAgIGRlZmluZSBfQlNEX1NPVVJDRQorCisjZW5kaWYgLy8gX19DWUdXSU5fXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQm9ybGFuZAorI2lmZGVmIF9fQk9STEFORENfXworCisjZW5kaWYgLy8gX19CT1JMQU5EQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBFREcKKyNpZmRlZiBfX0VER19WRVJTSU9OX18KKworI2VuZGlmIC8vIF9fRURHX1ZFUlNJT05fXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGlnaXRhbCBNYXJzCisjaWZkZWYgX19ETUNfXworCisjZW5kaWYgLy8gX19ETUNfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0NDCisjaWZkZWYgX19HTlVDX18KKworIyAgIGlmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNiAmJiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgICBlbmRpZgorCisvLyAtIG90aGVyd2lzZSBtb3JlIHJlY2VudCB2ZXJzaW9ucyBkZWZpbmUgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorLy8gYW5kIHdpbGwgZ2V0IHBpY2tlZCB1cCBiZWxvdworCisjZW5kaWYgLy8gX19HTlVDX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZpc3VhbCBDKysKKyNpZmRlZiBfTVNDX1ZFUgorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19XSU5ET1dTX1NFSAorCisjaWYgKF9NU0NfVkVSID49IDE2MDApCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworI2lmIChfTVNDX1ZFUiA+PSAxOTAwICkgLy8gKFZDKysgMTMgKFZTMjAxNSkpCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTCisjZW5kaWYKKworI2VuZGlmIC8vIF9NU0NfVkVSCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFVzZSB2YXJpYWRpYyBtYWNyb3MgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZW0KKyNpZiAoIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPiAxNDAwICYmICFkZWZpbmVkIF9fRURHRV9fKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fV0FWRV9fICYmIF9fV0FWRV9IQVNfVkFSSUFESUNTICkgfHwgXAorICAgICggZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAzICkgfHwgXAorICAgICggIWRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wgKQorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKworI2VuZGlmCisKKy8vIFVzZSBfX0NPVU5URVJfXyBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgaXQKKyNpZiAoIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTMwMCApIHx8IFwKKyAgICAoIGRlZmluZWQgX19HTlVDX18gICYmIF9fR05VQ19fID49IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMyApIHx8IFwKKyAgICAoIGRlZmluZWQgX19jbGFuZ19fICYmIF9fY2xhbmdfbWFqb3JfXyA+PSAzICkKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ09VTlRFUgorCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEMrKyBsYW5ndWFnZSBmZWF0dXJlIHN1cHBvcnQKKworLy8gY2F0Y2ggYWxsIHN1cHBvcnQgZm9yIEMrKzExCisjaWYgZGVmaW5lZChDQVRDSF9DUFAxMV9PUl9HUkVBVEVSKQorCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9JU19FTlVNCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RVUExFCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUworIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0xPTkdfTE9ORykKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERQorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyMgIGVuZGlmCisjIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorIyAgZW5kaWYKKyMgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKQorIyAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworIyBlbmRpZgorCisjZW5kaWYgLy8gX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisvLyBOb3cgc2V0IHRoZSBhY3R1YWwgZGVmaW5lcyBiYXNlZCBvbiB0aGUgYWJvdmUgKyBhbnl0aGluZyB0aGUgdXNlciBoYXMgY29uZmlndXJlZAorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX0lTX0VOVU0pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1RVUExFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19WQVJJQURJQ19NQUNST1MpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX09WRVJSSURFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorLy8gVXNlIG9mIF9fQ09VTlRFUl9fIGlzIHN1cHByZXNzZWQgaWYgX19KRVRCUkFJTlNfSURFX18gaXMgI2RlZmluZWQgKG1lYW5pbmcgd2UncmUgYmVpbmcgcGFyc2VkIGJ5IGEgSmV0QnJhaW5zIElERSBmb3IKKy8vIGFuYWx5dGljcykgYmVjYXVzZSwgYXQgdGltZSBvZiB3cml0aW5nLCBfX0NPVU5URVJfXyBpcyBub3QgcHJvcGVybHkgaGFuZGxlZCBieSBpdC4KKy8vIFRoaXMgZG9lcyBub3QgYWZmZWN0IGNvbXBpbGF0aW9uCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ09VTlRFUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NPVU5URVIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DT1VOVEVSKSAmJiAhZGVmaW5lZChfX0pFVEJSQUlOU19JREVfXykKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPVU5URVIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19TSFVGRkxFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorI2VuZGlmCisjIGlmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fVFlQRV9UUkFJVFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworIyBlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1dJTkRPV1NfU0VIKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fV0lORE9XU19TRUgpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VICisjZW5kaWYKKy8vIFRoaXMgaXMgc2V0IGJ5IGRlZmF1bHQsIGJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdW5peCBjb21waWxlcnMgYXJlIHBvc2l4LXNpZ25hbC1jb21wYXRpYmxlIGJ5IGRlZmF1bHQuCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1BPU0lYX1NJR05BTFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MpCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MKKyNlbmRpZgorI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUykKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisjZW5kaWYKKworLy8gbm9leGNlcHQgc3VwcG9ydDoKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfTk9FWENFUFQpCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFQgbm9leGNlcHQKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVF9JUyh4KSBub2V4Y2VwdCh4KQorI2Vsc2UKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVCB0aHJvdygpCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFRfSVMoeCkKKyNlbmRpZgorCisvLyBudWxscHRyIHN1cHBvcnQKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgIGRlZmluZSBDQVRDSF9OVUxMIG51bGxwdHIKKyNlbHNlCisjICAgZGVmaW5lIENBVENIX05VTEwgTlVMTAorI2VuZGlmCisKKy8vIG92ZXJyaWRlIHN1cHBvcnQKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyMgICBkZWZpbmUgQ0FUQ0hfT1ZFUlJJREUgb3ZlcnJpZGUKKyNlbHNlCisjICAgZGVmaW5lIENBVENIX09WRVJSSURFCisjZW5kaWYKKworLy8gdW5pcXVlX3B0ciBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyMgICBkZWZpbmUgQ0FUQ0hfQVVUT19QVFIoIFQgKSBzdGQ6OnVuaXF1ZV9wdHI8VD4KKyNlbHNlCisjICAgZGVmaW5lIENBVENIX0FVVE9fUFRSKCBUICkgc3RkOjphdXRvX3B0cjxUPgorI2VuZGlmCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORTIoIG5hbWUsIGxpbmUgKSBuYW1lIyNsaW5lCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUoIG5hbWUsIGxpbmUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FMiggbmFtZSwgbGluZSApCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NPVU5URVIKKyMgIGRlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggbmFtZSApIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUoIG5hbWUsIF9fQ09VTlRFUl9fICkKKyNlbHNlCisjICBkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIG5hbWUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBfX0xJTkVfXyApCisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJRlkyKCBleHByICkgI2V4cHIKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZMiggZXhwciApCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IENhc2VTZW5zaXRpdmUgeyBlbnVtIENob2ljZSB7CisgICAgICAgIFllcywKKyAgICAgICAgTm8KKyAgICB9OyB9OworCisgICAgY2xhc3MgTm9uQ29weWFibGUgeworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgY29uc3QmICkgICAgICAgICAgICAgID0gZGVsZXRlOworICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVsZXRlOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlIGNvbnN0JiApID0gZGVsZXRlOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlICYmICkgICAgID0gZGVsZXRlOworI2Vsc2UKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlIGNvbnN0JiBpbmZvICk7CisgICAgICAgIE5vbkNvcHlhYmxlJiBvcGVyYXRvciA9ICggTm9uQ29weWFibGUgY29uc3QmICk7CisjZW5kaWYKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgTm9uQ29weWFibGUoKSB7fQorICAgICAgICB2aXJ0dWFsIH5Ob25Db3B5YWJsZSgpOworICAgIH07CisKKyAgICBjbGFzcyBTYWZlQm9vbCB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHZvaWQgKFNhZmVCb29sOjoqdHlwZSkoKSBjb25zdDsKKworICAgICAgICBzdGF0aWMgdHlwZSBtYWtlU2FmZSggYm9vbCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICZTYWZlQm9vbDo6dHJ1ZVZhbHVlIDogMDsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdHJ1ZVZhbHVlKCkgY29uc3Qge30KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyVD4KKyAgICBpbmxpbmUgdm9pZCBkZWxldGVBbGwoIENvbnRhaW5lclQmIGNvbnRhaW5lciApIHsKKyAgICAgICAgdHlwZW5hbWUgQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb250YWluZXIuYmVnaW4oKTsKKyAgICAgICAgdHlwZW5hbWUgQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBjb250YWluZXIuZW5kKCk7CisgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgIGRlbGV0ZSAqaXQ7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFzc29jaWF0aXZlQ29udGFpbmVyVD4KKyAgICBpbmxpbmUgdm9pZCBkZWxldGVBbGxWYWx1ZXMoIEFzc29jaWF0aXZlQ29udGFpbmVyVCYgY29udGFpbmVyICkgeworICAgICAgICB0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgIHR5cGVuYW1lIEFzc29jaWF0aXZlQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBjb250YWluZXIuZW5kKCk7CisgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKTsKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHByZWZpeCApOworICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgc3VmZml4ICk7CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgc3VmZml4ICk7CisgICAgYm9vbCBjb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBpbmZpeCApOworICAgIHZvaWQgdG9Mb3dlckluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzICk7CisgICAgc3RkOjpzdHJpbmcgdG9Mb3dlciggc3RkOjpzdHJpbmcgY29uc3QmIHMgKTsKKyAgICBzdGQ6OnN0cmluZyB0cmltKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICk7CisgICAgYm9vbCByZXBsYWNlSW5QbGFjZSggc3RkOjpzdHJpbmcmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHJlcGxhY2VUaGlzLCBzdGQ6OnN0cmluZyBjb25zdCYgd2l0aFRoaXMgKTsKKworICAgIHN0cnVjdCBwbHVyYWxpc2UgeworICAgICAgICBwbHVyYWxpc2UoIHN0ZDo6c2l6ZV90IGNvdW50LCBzdGQ6OnN0cmluZyBjb25zdCYgbGFiZWwgKTsKKworICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIHBsdXJhbGlzZSBjb25zdCYgcGx1cmFsaXNlciApOworCisgICAgICAgIHN0ZDo6c2l6ZV90IG1fY291bnQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fbGFiZWw7CisgICAgfTsKKworICAgIHN0cnVjdCBTb3VyY2VMaW5lSW5mbyB7CisKKyAgICAgICAgU291cmNlTGluZUluZm8oKTsKKyAgICAgICAgU291cmNlTGluZUluZm8oIGNoYXIgY29uc3QqIF9maWxlLCBzdGQ6OnNpemVfdCBfbGluZSApOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFNvdXJjZUxpbmVJbmZvKFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlcikgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyggU291cmNlTGluZUluZm8gJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU291cmNlTGluZUluZm8mIG9wZXJhdG9yID0gKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvJiBvcGVyYXRvciA9ICggU291cmNlTGluZUluZm8gJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKyAgICAgICAgYm9vbCBlbXB0eSgpIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yID09ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0OworCisgICAgICAgIGNoYXIgY29uc3QqIGZpbGU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGxpbmU7CisgICAgfTsKKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgaW5mbyApOworCisgICAgLy8gVGhpcyBpcyBqdXN0IGhlcmUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3Mgd2l0aCBtYWNybyBjb25zdGFudHMgYW5kIGJvb2xlYW4gbGl0ZXJhbHMKKyAgICBpbmxpbmUgYm9vbCBpc1RydWUoIGJvb2wgdmFsdWUgKXsgcmV0dXJuIHZhbHVlOyB9CisgICAgaW5saW5lIGJvb2wgYWx3YXlzVHJ1ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBpbmxpbmUgYm9vbCBhbHdheXNGYWxzZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2b2lkIHRocm93TG9naWNFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsb2NhdGlvbkluZm8gKTsKKworICAgIHZvaWQgc2VlZFJuZyggSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgdW5zaWduZWQgaW50IHJuZ1NlZWQoKTsKKworICAgIC8vIFVzZSB0aGlzIGluIHZhcmlhZGljIHN0cmVhbWluZyBtYWNyb3MgdG8gYWxsb3cKKyAgICAvLyAgICA+PiArU3RyZWFtRW5kU3RvcAorICAgIC8vIGFzIHdlbGwgYXMKKyAgICAvLyAgICA+PiBzdHVmZiArU3RyZWFtRW5kU3RvcAorICAgIHN0cnVjdCBTdHJlYW1FbmRTdG9wIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgb3BlcmF0b3IrKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCBjb25zdCYgb3BlcmF0b3IgKyAoIFQgY29uc3QmIHZhbHVlLCBTdHJlYW1FbmRTdG9wICkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPIDo6Q2F0Y2g6OlNvdXJjZUxpbmVJbmZvKCBfX0ZJTEVfXywgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBfX0xJTkVfXyApICkKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfRVJST1IoIG1zZyApIDo6Q2F0Y2g6OnRocm93TG9naWNFcnJvciggbXNnLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisgICAgICAgIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBjb25zdCYgKSB7fQorCisgICAgICAgIHZpcnR1YWwgfk5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCkgQ0FUQ0hfTk9FWENFUFQge30KKworICAgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBDQVRDSF9OT0VYQ0VQVDsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fd2hhdDsKKyAgICAgICAgU291cmNlTGluZUluZm8gbV9saW5lSW5mbzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBDQVRDSF9OT1RfSU1QTEVNRU5URUQgdGhyb3cgQ2F0Y2g6Ok5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9jb250ZXh0LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlRFWFRfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19nZW5lcmF0b3JzLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfR0VORVJBVE9SU19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvckluZm8geworICAgICAgICB2aXJ0dWFsIH5JR2VuZXJhdG9ySW5mbygpOworICAgICAgICB2aXJ0dWFsIGJvb2wgbW92ZU5leHQoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzaXplX3QgZ2V0Q3VycmVudEluZGV4KCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvcnNGb3JUZXN0IHsKKyAgICAgICAgdmlydHVhbCB+SUdlbmVyYXRvcnNGb3JUZXN0KCk7CisKKyAgICAgICAgdmlydHVhbCBJR2VuZXJhdG9ySW5mbyYgZ2V0R2VuZXJhdG9ySW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzdGQ6OnNpemVfdCBzaXplICkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgbW92ZU5leHQoKSA9IDA7CisgICAgfTsKKworICAgIElHZW5lcmF0b3JzRm9yVGVzdCogY3JlYXRlR2VuZXJhdG9yc0ZvclRlc3QoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9wdHIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9QVFJfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIEFuIGludHJ1c2l2ZSByZWZlcmVuY2UgY291bnRpbmcgc21hcnQgcG9pbnRlci4KKyAgICAvLyBUIG11c3QgaW1wbGVtZW50IGFkZFJlZigpIGFuZCByZWxlYXNlKCkgbWV0aG9kcworICAgIC8vIHR5cGljYWxseSBpbXBsZW1lbnRpbmcgdGhlIElTaGFyZWQgaW50ZXJmYWNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBQdHIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUHRyKCkgOiBtX3AoIENBVENIX05VTEwgKXt9CisgICAgICAgIFB0ciggVCogcCApIDogbV9wKCBwICl7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPmFkZFJlZigpOworICAgICAgICB9CisgICAgICAgIFB0ciggUHRyIGNvbnN0JiBvdGhlciApIDogbV9wKCBvdGhlci5tX3AgKXsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+YWRkUmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgflB0cigpeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbV9wID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQdHImIG9wZXJhdG9yID0gKCBUKiBwICl7CisgICAgICAgICAgICBQdHIgdGVtcCggcCApOworICAgICAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIFB0ciYgb3BlcmF0b3IgPSAoIFB0ciBjb25zdCYgb3RoZXIgKXsKKyAgICAgICAgICAgIFB0ciB0ZW1wKCBvdGhlciApOworICAgICAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgc3dhcCggUHRyJiBvdGhlciApIHsgc3RkOjpzd2FwKCBtX3AsIG90aGVyLm1fcCApOyB9CisgICAgICAgIFQqIGdldCgpIGNvbnN0eyByZXR1cm4gbV9wOyB9CisgICAgICAgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICptX3A7IH0KKyAgICAgICAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG1fcDsgfQorICAgICAgICBib29sIG9wZXJhdG9yICEoKSBjb25zdCB7IHJldHVybiBtX3AgPT0gQ0FUQ0hfTlVMTDsgfQorICAgICAgICBvcGVyYXRvciBTYWZlQm9vbDo6dHlwZSgpIGNvbnN0IHsgcmV0dXJuIFNhZmVCb29sOjptYWtlU2FmZSggbV9wICE9IENBVENIX05VTEwgKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVCogbV9wOworICAgIH07CisKKyAgICBzdHJ1Y3QgSVNoYXJlZCA6IE5vbkNvcHlhYmxlIHsKKyAgICAgICAgdmlydHVhbCB+SVNoYXJlZCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkUmVmKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCA9IElTaGFyZWQ+CisgICAgc3RydWN0IFNoYXJlZEltcGwgOiBUIHsKKworICAgICAgICBTaGFyZWRJbXBsKCkgOiBtX3JjKCAwICl7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRSZWYoKSBjb25zdCB7CisgICAgICAgICAgICArK21fcmM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggLS1tX3JjID09IDAgKQorICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgbXV0YWJsZSB1bnNpZ25lZCBpbnQgbV9yYzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBjbGFzcyBTdHJlYW07CisgICAgc3RydWN0IElSZXN1bHRDYXB0dXJlOworICAgIHN0cnVjdCBJUnVubmVyOworICAgIHN0cnVjdCBJR2VuZXJhdG9yc0ZvclRlc3Q7CisgICAgc3RydWN0IElDb25maWc7CisKKyAgICBzdHJ1Y3QgSUNvbnRleHQKKyAgICB7CisgICAgICAgIHZpcnR1YWwgfklDb250ZXh0KCk7CisKKyAgICAgICAgdmlydHVhbCBJUmVzdWx0Q2FwdHVyZSogZ2V0UmVzdWx0Q2FwdHVyZSgpID0gMDsKKyAgICAgICAgdmlydHVhbCBJUnVubmVyKiBnZXRSdW5uZXIoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldEdlbmVyYXRvckluZGV4KCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHNpemVfdCB0b3RhbFNpemUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhZHZhbmNlR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgPSAwOworICAgICAgICB2aXJ0dWFsIFB0cjxJQ29uZmlnIGNvbnN0PiBnZXRDb25maWcoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJTXV0YWJsZUNvbnRleHQgOiBJQ29udGV4dAorICAgIHsKKyAgICAgICAgdmlydHVhbCB+SU11dGFibGVDb250ZXh0KCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZXN1bHRDYXB0dXJlKCBJUmVzdWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJ1bm5lciggSVJ1bm5lciogcnVubmVyICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApID0gMDsKKyAgICB9OworCisgICAgSUNvbnRleHQmIGdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKyAgICB2b2lkIGNsZWFuVXBDb250ZXh0KCk7CisgICAgU3RyZWFtIGNyZWF0ZVN0cmVhbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0cmVhbU5hbWUgKTsKKworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfdGVzdF9yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3Rlc3RjYXNlLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfVEVTVENBU0VfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWM7CisKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UgKCkgY29uc3QgPSAwOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdmlydHVhbCB+SVRlc3RDYXNlKCk7CisgICAgfTsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IElUZXN0Q2FzZVJlZ2lzdHJ5IHsKKyAgICAgICAgdmlydHVhbCB+SVRlc3RDYXNlUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgYm9vbCBtYXRjaFRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyVGVzdHMoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdGVzdENhc2VzLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorY2xhc3MgTWV0aG9kVGVzdENhc2UgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKworcHVibGljOgorICAgIE1ldGhvZFRlc3RDYXNlKCB2b2lkIChDOjoqbWV0aG9kKSgpICkgOiBtX21ldGhvZCggbWV0aG9kICkge30KKworICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAgICAgIEMgb2JqOworICAgICAgICAob2JqLiptX21ldGhvZCkoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdmlydHVhbCB+TWV0aG9kVGVzdENhc2UoKSB7fQorCisgICAgdm9pZCAoQzo6Km1fbWV0aG9kKSgpOworfTsKKwordHlwZWRlZiB2b2lkKCpUZXN0RnVuY3Rpb24pKCk7CisKK3N0cnVjdCBOYW1lQW5kRGVzYyB7CisgICAgTmFtZUFuZERlc2MoIGNvbnN0IGNoYXIqIF9uYW1lID0gIiIsIGNvbnN0IGNoYXIqIF9kZXNjcmlwdGlvbj0gIiIgKQorICAgIDogbmFtZSggX25hbWUgKSwgZGVzY3JpcHRpb24oIF9kZXNjcmlwdGlvbiApCisgICAge30KKworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb247Cit9OworCit2b2lkIHJlZ2lzdGVyVGVzdENhc2UKKyAgICAoICAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgY2hhciBjb25zdCogY2xhc3NOYW1lLAorICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworCitzdHJ1Y3QgQXV0b1JlZyB7CisKKyAgICBBdXRvUmVnCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgQXV0b1JlZworICAgICAgICAoICAgdm9pZCAoQzo6Km1ldGhvZCkoKSwKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzTmFtZSwKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYywKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKworICAgICAgICByZWdpc3RlclRlc3RDYXNlCisgICAgICAgICAgICAoICAgbmV3IE1ldGhvZFRlc3RDYXNlPEM+KCBtZXRob2QgKSwKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgbmFtZUFuZERlc2MsCisgICAgICAgICAgICAgICAgbGluZUluZm8gKTsKKyAgICB9CisKKyAgICB+QXV0b1JlZygpOworCitwcml2YXRlOgorICAgIEF1dG9SZWcoIEF1dG9SZWcgY29uc3QmICk7CisgICAgdm9pZCBvcGVyYXRvcj0gKCBBdXRvUmVnIGNvbnN0JiApOworfTsKKwordm9pZCByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24KKyAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIFRlc3ROYW1lLCAuLi4gKSBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmVGVzdE5hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICkgKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIC4uLiApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBfX1ZBX0FSR1NfXyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBRdWFsaWZpZWRNZXRob2QsIC4uLiApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmUXVhbGlmaWVkTWV0aG9kLCAiJiIgI1F1YWxpZmllZE1ldGhvZCwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBUZXN0TmFtZSwgQ2xhc3NOYW1lLCAuLi4gKVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBcCisgICAgICAgICAgICBzdHJ1Y3QgVGVzdE5hbWUgOiBDbGFzc05hbWV7IFwKKyAgICAgICAgICAgICAgICB2b2lkIHRlc3QoKTsgXAorICAgICAgICAgICAgfTsgXAorICAgICAgICAgICAgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSAoICZUZXN0TmFtZTo6dGVzdCwgI0NsYXNzTmFtZSwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyBcCisgICAgICAgIH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHZvaWQgVGVzdE5hbWU6OnRlc3QoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggQ2xhc3NOYW1lLCAuLi4gKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBDbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgLi4uICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBDYXRjaDo6QXV0b1JlZyggRnVuY3Rpb24sIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICkgKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisjZWxzZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggVGVzdE5hbWUsIE5hbWUsIERlc2MgKSBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmVGVzdE5hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIE5hbWUsIERlc2MgKSApOyB9XAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBOYW1lLCBEZXNjICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIE5hbWUsIERlc2MgKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggUXVhbGlmaWVkTWV0aG9kLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoICZRdWFsaWZpZWRNZXRob2QsICImIiAjUXVhbGlmaWVkTWV0aG9kLCBDYXRjaDo6TmFtZUFuZERlc2MoIE5hbWUsIERlc2MgKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggVGVzdENhc2VOYW1lLCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjIClcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgXAorICAgICAgICAgICAgc3RydWN0IFRlc3RDYXNlTmFtZSA6IENsYXNzTmFtZXsgXAorICAgICAgICAgICAgICAgIHZvaWQgdGVzdCgpOyBcCisgICAgICAgICAgICB9OyBcCisgICAgICAgICAgICBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApICggJlRlc3RDYXNlTmFtZTo6dGVzdCwgI0NsYXNzTmFtZSwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBUZXN0TmFtZSwgRGVzYyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyBcCisgICAgICAgIH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHZvaWQgVGVzdENhc2VOYW1lOjp0ZXN0KCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIENsYXNzTmFtZSwgVGVzdE5hbWUsIERlc2MgKVwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIENsYXNzTmFtZSwgVGVzdE5hbWUsIERlc2MgKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBDYXRjaDo6QXV0b1JlZyggRnVuY3Rpb24sIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIE5hbWUsIERlc2MgKSApOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfY2FwdHVyZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NBUFRVUkVfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXN1bHRfYnVpbGRlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfQlVJTERFUl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXN1bHRfdHlwZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfVFlQRV9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBSZXN1bHRXYXM6Ok9mVHlwZSBlbnVtCisgICAgc3RydWN0IFJlc3VsdFdhcyB7IGVudW0gT2ZUeXBlIHsKKyAgICAgICAgVW5rbm93biA9IC0xLAorICAgICAgICBPayA9IDAsCisgICAgICAgIEluZm8gPSAxLAorICAgICAgICBXYXJuaW5nID0gMiwKKworICAgICAgICBGYWlsdXJlQml0ID0gMHgxMCwKKworICAgICAgICBFeHByZXNzaW9uRmFpbGVkID0gRmFpbHVyZUJpdCB8IDEsCisgICAgICAgIEV4cGxpY2l0RmFpbHVyZSA9IEZhaWx1cmVCaXQgfCAyLAorCisgICAgICAgIEV4Y2VwdGlvbiA9IDB4MTAwIHwgRmFpbHVyZUJpdCwKKworICAgICAgICBUaHJld0V4Y2VwdGlvbiA9IEV4Y2VwdGlvbiB8IDEsCisgICAgICAgIERpZG50VGhyb3dFeGNlcHRpb24gPSBFeGNlcHRpb24gfCAyLAorCisgICAgICAgIEZhdGFsRXJyb3JDb25kaXRpb24gPSAweDIwMCB8IEZhaWx1cmVCaXQKKworICAgIH07IH07CisKKyAgICBpbmxpbmUgYm9vbCBpc09rKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICkgeworICAgICAgICByZXR1cm4gKCByZXN1bHRUeXBlICYgUmVzdWx0V2FzOjpGYWlsdXJlQml0ICkgPT0gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgaXNKdXN0SW5mbyggaW50IGZsYWdzICkgeworICAgICAgICByZXR1cm4gZmxhZ3MgPT0gUmVzdWx0V2FzOjpJbmZvOworICAgIH0KKworICAgIC8vIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBlbnVtCisgICAgc3RydWN0IFJlc3VsdERpc3Bvc2l0aW9uIHsgZW51bSBGbGFncyB7CisgICAgICAgIE5vcm1hbCA9IDB4MDEsCisKKyAgICAgICAgQ29udGludWVPbkZhaWx1cmUgPSAweDAyLCAgIC8vIEZhaWx1cmVzIGZhaWwgdGVzdCwgYnV0IGV4ZWN1dGlvbiBjb250aW51ZXMKKyAgICAgICAgRmFsc2VUZXN0ID0gMHgwNCwgICAgICAgICAgIC8vIFByZWZpeCBleHByZXNzaW9uIHdpdGggIQorICAgICAgICBTdXBwcmVzc0ZhaWwgPSAweDA4ICAgICAgICAgLy8gRmFpbHVyZXMgYXJlIHJlcG9ydGVkIGJ1dCBkbyBub3QgZmFpbCB0aGUgdGVzdAorICAgIH07IH07CisKKyAgICBpbmxpbmUgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIG9wZXJhdG9yIHwgKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgbGhzLCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmhzICkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0RGlzcG9zaXRpb246OkZsYWdzPiggc3RhdGljX2Nhc3Q8aW50PiggbGhzICkgfCBzdGF0aWNfY2FzdDxpbnQ+KCByaHMgKSApOworICAgIH0KKworICAgIGlubGluZSBib29sIHNob3VsZENvbnRpbnVlT25GYWlsdXJlKCBpbnQgZmxhZ3MgKSAgICB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlICkgIT0gMDsgfQorICAgIGlubGluZSBib29sIGlzRmFsc2VUZXN0KCBpbnQgZmxhZ3MgKSAgICAgICAgICAgICAgICB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCApICE9IDA7IH0KKyAgICBpbmxpbmUgYm9vbCBzaG91bGRTdXBwcmVzc0ZhaWx1cmUoIGludCBmbGFncyApICAgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwgKSAhPSAwOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfYXNzZXJ0aW9ucmVzdWx0LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0FTU0VSVElPTlJFU1VMVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uOworCisgICAgc3RydWN0IERlY29tcG9zZWRFeHByZXNzaW9uCisgICAgeworICAgICAgICB2aXJ0dWFsIH5EZWNvbXBvc2VkRXhwcmVzc2lvbigpIHt9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0JpbmFyeUV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gT25seSBzaW1wbGUgYmluYXJ5IGNvbXBhcmlzb25zIGNhbiBiZSBkZWNvbXBvc2VkLgorICAgICAgICAvLyBJZiBtb3JlIGNvbXBsZXggY2hlY2sgaXMgcmVxdWlyZWQgdGhlbiB3cmFwIHN1Yi1leHByZXNzaW9ucyBpbiBwYXJlbnRoZXNlcy4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciArICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAtICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAqICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAvICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAlICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAmJiAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgfHwgKCBUIGNvbnN0JiApOworCisJcHJpdmF0ZToKKwkJRGVjb21wb3NlZEV4cHJlc3Npb24mIG9wZXJhdG9yID0gKERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0Jik7CisgICAgfTsKKworICAgIHN0cnVjdCBBc3NlcnRpb25JbmZvCisgICAgeworICAgICAgICBBc3NlcnRpb25JbmZvKCkge30KKyAgICAgICAgQXNzZXJ0aW9uSW5mbyggIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIF9yZXN1bHREaXNwb3NpdGlvbiApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1hY3JvTmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIHN0ZDo6c3RyaW5nIGNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uUmVzdWx0RGF0YQorICAgIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSgpIDogZGVjb21wb3NlZEV4cHJlc3Npb24oIENBVENIX05VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCByZXN1bHRUeXBlKCBSZXN1bHRXYXM6OlVua25vd24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBuZWdhdGVkKCBmYWxzZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHBhcmVudGhlc2l6ZWQoIGZhbHNlICkge30KKworICAgICAgICB2b2lkIG5lZ2F0ZSggYm9vbCBwYXJlbnRoZXNpemUgKSB7CisgICAgICAgICAgICBuZWdhdGVkID0gIW5lZ2F0ZWQ7CisgICAgICAgICAgICBwYXJlbnRoZXNpemVkID0gcGFyZW50aGVzaXplOworICAgICAgICAgICAgaWYoIHJlc3VsdFR5cGUgPT0gUmVzdWx0V2FzOjpPayApCisgICAgICAgICAgICAgICAgcmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHJlc3VsdFR5cGUgPT0gUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkICkKKyAgICAgICAgICAgICAgICByZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpPazsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiByZWNvbnN0cnVjdEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICBpZiggZGVjb21wb3NlZEV4cHJlc3Npb24gIT0gQ0FUQ0hfTlVMTCApIHsKKyAgICAgICAgICAgICAgICBkZWNvbXBvc2VkRXhwcmVzc2lvbi0+cmVjb25zdHJ1Y3RFeHByZXNzaW9uKCByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiApOworICAgICAgICAgICAgICAgIGlmKCBwYXJlbnRoZXNpemVkICkgeworICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbi5pbnNlcnQoIDAsIDEsICcoJyApOworICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbi5hcHBlbmQoIDEsICcpJyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggbmVnYXRlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uaW5zZXJ0KCAwLCAxLCAnIScgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVjb21wb3NlZEV4cHJlc3Npb24gPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uOworICAgICAgICB9CisKKyAgICAgICAgbXV0YWJsZSBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCogZGVjb21wb3NlZEV4cHJlc3Npb247CisgICAgICAgIG11dGFibGUgc3RkOjpzdHJpbmcgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb247CisgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGU7CisgICAgICAgIGJvb2wgbmVnYXRlZDsKKyAgICAgICAgYm9vbCBwYXJlbnRoZXNpemVkOworICAgIH07CisKKyAgICBjbGFzcyBBc3NlcnRpb25SZXN1bHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCk7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywgQXNzZXJ0aW9uUmVzdWx0RGF0YSBjb25zdCYgZGF0YSApOworICAgICAgICB+QXNzZXJ0aW9uUmVzdWx0KCk7CisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvblJlc3VsdCAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblJlc3VsdCAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIGJvb2wgaXNPaygpIGNvbnN0OworICAgICAgICBib29sIHN1Y2NlZWRlZCgpIGNvbnN0OworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSBnZXRSZXN1bHRUeXBlKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaGFzRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBib29sIGhhc01lc3NhZ2UoKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHByZXNzaW9uSW5NYWNybygpIGNvbnN0OworICAgICAgICBib29sIGhhc0V4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0TWVzc2FnZSgpIGNvbnN0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyBnZXRTb3VyY2VJbmZvKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldFRlc3RNYWNyb05hbWUoKSBjb25zdDsKKyAgICAgICAgdm9pZCBkaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgdm9pZCBleHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBBc3NlcnRpb25JbmZvIG1faW5mbzsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBtX3Jlc3VsdERhdGE7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tYXRjaGVycy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01BVENIRVJTX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKyAgICBuYW1lc3BhY2UgSW1wbCB7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoQWxsT2Y7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaEFueU9mOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hOb3RPZjsKKworICAgICAgICBjbGFzcyBNYXRjaGVyVW50eXBlZEJhc2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggbV9jYWNoZWRUb1N0cmluZy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgbV9jYWNoZWRUb1N0cmluZyA9IGRlc2NyaWJlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fY2FjaGVkVG9TdHJpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgdmlydHVhbCB+TWF0Y2hlclVudHlwZWRCYXNlKCk7CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgPSAwOworICAgICAgICAgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtX2NhY2hlZFRvU3RyaW5nOworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgTWF0Y2hlclVudHlwZWRCYXNlJiBvcGVyYXRvciA9ICggTWF0Y2hlclVudHlwZWRCYXNlIGNvbnN0JiApOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQ+CisgICAgICAgIHN0cnVjdCBNYXRjaGVyTWV0aG9kIHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggT2JqZWN0VCBjb25zdCYgYXJnICkgY29uc3QgPSAwOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQdHJUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlck1ldGhvZDxQdHJUKj4geworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBQdHJUKiBhcmcgKSBjb25zdCA9IDA7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQgPSBPYmplY3RUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlckJhc2UgOiBNYXRjaGVyVW50eXBlZEJhc2UsIE1hdGNoZXJNZXRob2Q8T2JqZWN0VD4geworCisgICAgICAgICAgICBNYXRjaEFsbE9mPENvbXBhcmF0b3JUPiBvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICAgICAgTWF0Y2hBbnlPZjxDb21wYXJhdG9yVD4gb3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgICAgIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+IG9wZXJhdG9yICEgKCkgY29uc3Q7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoQWxsT2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIEFyZ1QgY29uc3QmIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtX21hdGNoZXJzW2ldLT5tYXRjaChhcmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSggNCArIG1fbWF0Y2hlcnMuc2l6ZSgpKjMyICk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiggIjsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiIGFuZCAiOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX21hdGNoZXJzW2ldLT50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiICkiOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hBbGxPZjxBcmdUPiYgb3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgbV9tYXRjaGVycy5wdXNoX2JhY2soICZvdGhlciApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckJhc2U8QXJnVD4gY29uc3QqPiBtX21hdGNoZXJzOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hBbnlPZiA6IE1hdGNoZXJCYXNlPEFyZ1Q+IHsKKworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX21hdGNoZXJzW2ldLT5tYXRjaChhcmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSggNCArIG1fbWF0Y2hlcnMuc2l6ZSgpKjMyICk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiggIjsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiIG9yICI7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fbWF0Y2hlcnNbaV0tPnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgKSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNYXRjaEFueU9mPEFyZ1Q+JiBvcGVyYXRvciB8fCAoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgICAgICBtX21hdGNoZXJzLnB1c2hfYmFjayggJm90aGVyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCo+IG1fbWF0Y2hlcnM7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoTm90T2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisKKyAgICAgICAgICAgIE1hdGNoTm90T2YoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiB1bmRlcmx5aW5nTWF0Y2hlciApIDogbV91bmRlcmx5aW5nTWF0Y2hlciggdW5kZXJseWluZ01hdGNoZXIgKSB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIEFyZ1QgY29uc3QmIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIW1fdW5kZXJseWluZ01hdGNoZXIubWF0Y2goIGFyZyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAibm90ICIgKyBtX3VuZGVybHlpbmdNYXRjaGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgbV91bmRlcmx5aW5nTWF0Y2hlcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVD4KKyAgICAgICAgTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4gTWF0Y2hlckJhc2U8T2JqZWN0VCwgQ29tcGFyYXRvclQ+OjpvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaEFsbE9mPENvbXBhcmF0b3JUPigpICYmICp0aGlzICYmIG90aGVyOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUPgorICAgICAgICBNYXRjaEFueU9mPENvbXBhcmF0b3JUPiBNYXRjaGVyQmFzZTxPYmplY3RULCBDb21wYXJhdG9yVD46Om9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoQW55T2Y8Q29tcGFyYXRvclQ+KCkgfHwgKnRoaXMgfHwgb3RoZXI7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQ+CisgICAgICAgIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+IE1hdGNoZXJCYXNlPE9iamVjdFQsIENvbXBhcmF0b3JUPjo6b3BlcmF0b3IgISAoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hOb3RPZjxDb21wYXJhdG9yVD4oICp0aGlzICk7CisgICAgICAgIH0KKworICAgIH0gLy8gbmFtZXNwYWNlIEltcGwKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSB0aGUgYWN0dWFsIG1hdGNoZXIgb2JqZWN0cy4KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgdHlwZXMgdG8gYmUgaW5mZXJyZWQKKyAgICAvLyAtIGRlcHJlY2F0ZWQ6IHByZWZlciB8fCwgJiYgYW5kICEKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaE5vdE9mPFQ+IE5vdCggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIHVuZGVybHlpbmdNYXRjaGVyICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hOb3RPZjxUPiggdW5kZXJseWluZ01hdGNoZXIgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbGxPZjxUPiBBbGxPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFsbE9mPFQ+KCkgJiYgbTEgJiYgbTI7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQWxsT2Y8VD4gQWxsT2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTMgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFsbE9mPFQ+KCkgJiYgbTEgJiYgbTIgJiYgbTM7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQW55T2Y8VD4gQW55T2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbnlPZjxUPigpIHx8IG0xIHx8IG0yOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFueU9mPFQ+IEFueU9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0zICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbnlPZjxUPigpIHx8IG0xIHx8IG0yIHx8IG0zOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKKwordXNpbmcgbmFtZXNwYWNlIE1hdGNoZXJzOwordXNpbmcgTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFRlc3RGYWlsdXJlRXhjZXB0aW9ue307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBFeHByZXNzaW9uTGhzOworCisgICAgc3RydWN0IENvcHlhYmxlU3RyZWFtIHsKKyAgICAgICAgQ29weWFibGVTdHJlYW0oKSB7fQorICAgICAgICBDb3B5YWJsZVN0cmVhbSggQ29weWFibGVTdHJlYW0gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgb3NzIDw8IG90aGVyLm9zcy5zdHIoKTsKKyAgICAgICAgfQorICAgICAgICBDb3B5YWJsZVN0cmVhbSYgb3BlcmF0b3I9KCBDb3B5YWJsZVN0cmVhbSBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBvc3Muc3RyKHN0ZDo6c3RyaW5nKCkpOworICAgICAgICAgICAgb3NzIDw8IG90aGVyLm9zcy5zdHIoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIH07CisKKyAgICBjbGFzcyBSZXN1bHRCdWlsZGVyIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlc3VsdEJ1aWxkZXIoICBjaGFyIGNvbnN0KiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBjYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBzZWNvbmRBcmcgPSAiIiApOworICAgICAgICB+UmVzdWx0QnVpbGRlcigpOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+IG9wZXJhdG9yIDw9ICggVCBjb25zdCYgb3BlcmFuZCApOworICAgICAgICBFeHByZXNzaW9uTGhzPGJvb2w+IG9wZXJhdG9yIDw9ICggYm9vbCB2YWx1ZSApOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFJlc3VsdEJ1aWxkZXImIG9wZXJhdG9yIDw8ICggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgICAgICBtX3N0cmVhbS5vc3MgPDwgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBSZXN1bHRCdWlsZGVyJiBzZXRSZXN1bHRUeXBlKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHQgKTsKKyAgICAgICAgUmVzdWx0QnVpbGRlciYgc2V0UmVzdWx0VHlwZSggYm9vbCByZXN1bHQgKTsKKworICAgICAgICB2b2lkIGVuZEV4cHJlc3Npb24oIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0JiBleHByICk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYnVpbGQoKSBjb25zdDsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGJ1aWxkKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApIGNvbnN0OworCisgICAgICAgIHZvaWQgdXNlQWN0aXZlRXhjZXB0aW9uKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24gPSBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsICk7CisgICAgICAgIHZvaWQgY2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApOworICAgICAgICB2b2lkIGNhcHR1cmVFeHByZXNzaW9uKCk7CisgICAgICAgIHZvaWQgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgZXhwZWN0ZWRNZXNzYWdlICk7CisgICAgICAgIHZvaWQgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IGNvbnN0JiBtYXRjaGVyICk7CisgICAgICAgIHZvaWQgaGFuZGxlUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApOworICAgICAgICB2b2lkIHJlYWN0KCk7CisgICAgICAgIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0OworICAgICAgICBib29sIGFsbG93VGhyb3dzKCkgY29uc3Q7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CisgICAgICAgIHZvaWQgY2FwdHVyZU1hdGNoKCBBcmdUIGNvbnN0JiBhcmcsIE1hdGNoZXJUIGNvbnN0JiBtYXRjaGVyLCBjaGFyIGNvbnN0KiBtYXRjaGVyU3RyaW5nICk7CisKKyAgICAgICAgdm9pZCBzZXRFeGNlcHRpb25HdWFyZCgpOworICAgICAgICB2b2lkIHVuc2V0RXhjZXB0aW9uR3VhcmQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIEFzc2VydGlvbkluZm8gbV9hc3NlcnRpb25JbmZvOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIG1fZGF0YTsKKyAgICAgICAgQ29weWFibGVTdHJlYW0gbV9zdHJlYW07CisKKyAgICAgICAgYm9vbCBtX3Nob3VsZERlYnVnQnJlYWs7CisgICAgICAgIGJvb2wgbV9zaG91bGRUaHJvdzsKKyAgICAgICAgYm9vbCBtX2d1YXJkRXhjZXB0aW9uOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vIEluY2x1ZGUgYWZ0ZXIgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3k6CisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXhwcmVzc2lvbl9saHMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FWFBSRVNTSU9OX0xIU19IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V2YWx1YXRlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVZBTFVBVEVfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0Mzg5KSAvLyAnPT0nIDogc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzEyKSAvLyBDb252ZXJ0aW5nIGludCB0byBUKiB1c2luZyByZWludGVycHJldF9jYXN0IChpc3N1ZSBvbiB4NjQgcGxhdGZvcm0pCisjZW5kaWYKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgSW50ZXJuYWwgeworCisgICAgZW51bSBPcGVyYXRvciB7CisgICAgICAgIElzRXF1YWxUbywKKyAgICAgICAgSXNOb3RFcXVhbFRvLAorICAgICAgICBJc0xlc3NUaGFuLAorICAgICAgICBJc0dyZWF0ZXJUaGFuLAorICAgICAgICBJc0xlc3NUaGFuT3JFcXVhbFRvLAorICAgICAgICBJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvCisgICAgfTsKKworICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHMgICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIiplcnJvcioiOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNFcXVhbFRvPiAgICAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPT0iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNOb3RFcXVhbFRvPiAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiIT0iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNMZXNzVGhhbj4gICAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPCI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0dyZWF0ZXJUaGFuPiAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI+IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTGVzc1RoYW5PckVxdWFsVG8+ICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIjw9IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzR3JlYXRlclRoYW5PckVxdWFsVG8+eyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIj49IjsgfSB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgVCYgb3BDYXN0KFQgY29uc3QmIHQpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VCY+KHQpOyB9CisKKy8vIG51bGxwdHJfdCBzdXBwb3J0IGJhc2VkIG9uIHB1bGwgcmVxdWVzdCAjMTU0IGZyb20gS29uc3RhbnRpbiBCYXVtYW5uCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyAgICBpbmxpbmUgc3RkOjpudWxscHRyX3Qgb3BDYXN0KHN0ZDo6bnVsbHB0cl90KSB7IHJldHVybiBudWxscHRyOyB9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKworICAgIC8vIFNvIHRoZSBjb21wYXJlIG92ZXJsb2FkcyBjYW4gYmUgb3BlcmF0b3IgYWdub3N0aWMgd2UgY29udmV5IHRoZSBvcGVyYXRvciBhcyBhIHRlbXBsYXRlCisgICAgLy8gZW51bSwgd2hpY2ggaXMgdXNlZCB0byBzcGVjaWFsaXNlIGFuIEV2YWx1YXRvciBmb3IgZG9pbmcgdGhlIGNvbXBhcmlzb24uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCBPcGVyYXRvciBPcD4KKyAgICBjbGFzcyBFdmFsdWF0b3J7fTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA9PSAgb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzTm90RXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApICE9IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0xlc3NUaGFuPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPCBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNHcmVhdGVyVGhhbj4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApID4gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzR3JlYXRlclRoYW5PckVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA+PSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNMZXNzVGhhbk9yRXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApIDw9IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIGJvb2wgYXBwbHlFdmFsdWF0b3IoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VDEsIFQyLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJocyApOworICAgIH0KKworICAgIC8vIFRoaXMgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gYWxsb3dzIHVzIHRvIHNwZWNpYWxpc2UgZm9yIGludGVnZXIgdHlwZXMKKyAgICAvLyB0byBhdm9pZCBzaWduZWQvIHVuc2lnbmVkIHdhcm5pbmdzCisKKyAgICAvLyAiYmFzZSIgb3ZlcmxvYWQKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIGJvb2wgY29tcGFyZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUMSwgVDIsIE9wPjo6ZXZhbHVhdGUoIGxocywgcmhzICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgWCB0byBpbnQKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBpbnQgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGNoYXIgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHJocyApICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgWCB0byBsb25nCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgaW50IGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggcmhzICkgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgY2hhciBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIGludCB0byB1bnNpZ25lZCBYCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCB1bnNpZ25lZCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggbGhzICksIHJocyApOworICAgIH0KKworICAgIC8vIGxvbmcgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCB1bnNpZ25lZCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBwb2ludGVyIHRvIGxvbmcgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggcmVpbnRlcnByZXRfY2FzdDxUKj4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgcmVpbnRlcnByZXRfY2FzdDxUKj4oIHJocyApICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBpbnQgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCByZWludGVycHJldF9jYXN0PFQqPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyAgICAvLyBsb25nIGxvbmcgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBsb25nIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyB1bnNpZ25lZCBsb25nIGxvbmcgdG8gWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBsb25nIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBwb2ludGVyIHRvIGxvbmcgbG9uZyAod2hlbiBjb21wYXJpbmcgYWdhaW5zdCBOVUxMKQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgcmVpbnRlcnByZXRfY2FzdDxUKj4oIHJocyApICk7CisgICAgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisgICAgLy8gcG9pbnRlciB0byBudWxscHRyX3QgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgbnVsbHB0cikKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBzdGQ6Om51bGxwdHJfdCwgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbnVsbHB0ciwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgc3RkOjpudWxscHRyX3QgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIG51bGxwdHIgKTsKKyAgICB9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlIEludGVybmFsCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90b3N0cmluZy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1NUUklOR19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjc3RkZGVmPgorCisjaWZkZWYgX19PQkpDX18KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9vYmpjX2FyYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX09CSkNfQVJDX0hQUF9JTkNMVURFRAorCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2lmZGVmIF9faGFzX2ZlYXR1cmUKKyNkZWZpbmUgQ0FUQ0hfQVJDX0VOQUJMRUQgX19oYXNfZmVhdHVyZShvYmpjX2FyYykKKyNlbHNlCisjZGVmaW5lIENBVENIX0FSQ19FTkFCTEVEIDAKKyNlbmRpZgorCit2b2lkIGFyY1NhZmVSZWxlYXNlKCBOU09iamVjdCogb2JqICk7CitpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICk7CisKKyNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQKK2lubGluZSB2b2lkIGFyY1NhZmVSZWxlYXNlKCBOU09iamVjdCogb2JqICkgeworICAgIFtvYmogcmVsZWFzZV07Cit9CitpbmxpbmUgaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApIHsKKyAgICBpZiggW29iaiByZXNwb25kc1RvU2VsZWN0b3I6IHNlbF0gKQorICAgICAgICByZXR1cm4gW29iaiBwZXJmb3JtU2VsZWN0b3I6IHNlbF07CisgICAgcmV0dXJuIG5pbDsKK30KKyNkZWZpbmUgQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQKKyNkZWZpbmUgQ0FUQ0hfQVJDX1NUUk9ORworI2Vsc2UKK2lubGluZSB2b2lkIGFyY1NhZmVSZWxlYXNlKCBOU09iamVjdCogKXt9CitpbmxpbmUgaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApIHsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdhcmMtcGVyZm9ybVNlbGVjdG9yLWxlYWtzIgorI2VuZGlmCisgICAgaWYoIFtvYmogcmVzcG9uZHNUb1NlbGVjdG9yOiBzZWxdICkKKyAgICAgICAgcmV0dXJuIFtvYmogcGVyZm9ybVNlbGVjdG9yOiBzZWxdOworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisgICAgcmV0dXJuIG5pbDsKK30KKyNkZWZpbmUgQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQgX191bnNhZmVfdW5yZXRhaW5lZAorI2RlZmluZSBDQVRDSF9BUkNfU1RST05HIF9fc3Ryb25nCisjZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKyNpbmNsdWRlIDx0dXBsZT4KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisvLyBXaHkgd2UncmUgaGVyZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b1N0cmluZyggVCBjb25zdCYgdmFsdWUgKTsKKworLy8gQnVpbHQgaW4gb3ZlcmxvYWRzCisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OndzdHJpbmcgY29uc3QmIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgY2hhciogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyKiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IHdjaGFyX3QqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggd2NoYXJfdCogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBpbnQgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgaW50IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZG91YmxlIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZmxvYXQgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBib29sIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHNpZ25lZCBjaGFyIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgY2hhciB2YWx1ZSApOworCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGxvbmcgbG9uZyB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSApOworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6bnVsbHB0cl90ICk7CisjZW5kaWYKKworI2lmZGVmIF9fT0JKQ19fCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nIGNvbnN0ICogY29uc3QmIG5zc3RyaW5nICk7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nICogQ0FUQ0hfQVJDX1NUUk9ORyBjb25zdCYgbnNzdHJpbmcgKTsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNPYmplY3QqIGNvbnN0JiBuc09iamVjdCApOworI2VuZGlmCisKK25hbWVzcGFjZSBEZXRhaWwgeworCisgICAgZXh0ZXJuIGNvbnN0IHN0ZDo6c3RyaW5nIHVucHJpbnRhYmxlU3RyaW5nOworCisgI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9TVFJFQU1fSU5TRVJUQUJMRV9DSEVDSykKKyAgICBzdHJ1Y3QgQm9yZ1R5cGUgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBCb3JnVHlwZSggVCBjb25zdCYgKTsKKyAgICB9OworCisgICAgc3RydWN0IFRydWVUeXBlIHsgY2hhciBzaXplclsxXTsgfTsKKyAgICBzdHJ1Y3QgRmFsc2VUeXBlIHsgY2hhciBzaXplclsyXTsgfTsKKworICAgIFRydWVUeXBlJiB0ZXN0U3RyZWFtYWJsZSggc3RkOjpvc3RyZWFtJiApOworICAgIEZhbHNlVHlwZSB0ZXN0U3RyZWFtYWJsZSggRmFsc2VUeXBlICk7CisKKyAgICBGYWxzZVR5cGUgb3BlcmF0b3I8PCggc3RkOjpvc3RyZWFtIGNvbnN0JiwgQm9yZ1R5cGUgY29uc3QmICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBJc1N0cmVhbUluc2VydGFibGUgeworICAgICAgICBzdGF0aWMgc3RkOjpvc3RyZWFtICZzOworICAgICAgICBzdGF0aWMgVCAgY29uc3QmdDsKKyAgICAgICAgZW51bSB7IHZhbHVlID0gc2l6ZW9mKCB0ZXN0U3RyZWFtYWJsZShzIDw8IHQpICkgPT0gc2l6ZW9mKCBUcnVlVHlwZSApIH07CisgICAgfTsKKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBJc1N0cmVhbUluc2VydGFibGUgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTUywgdHlwZW5hbWUgVFQ+CisgICAgICAgIHN0YXRpYyBhdXRvIHRlc3QoaW50KQorICAgICAgICAtPiBkZWNsdHlwZSggc3RkOjpkZWNsdmFsPFNTJj4oKSA8PCBzdGQ6OmRlY2x2YWw8VFQ+KCksIHN0ZDo6dHJ1ZV90eXBlKCkgKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgICAgIHN0YXRpYyBhdXRvIHRlc3QoLi4uKSAtPiBzdGQ6OmZhbHNlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZGVjbHR5cGUodGVzdDxzdGQ6Om9zdHJlYW0sY29uc3QgVCY+KDApKTo6dmFsdWU7CisgICAgfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGJvb2wgSXNFbnVtID0gc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZQorICAgICAgICAgICAgID4KKyAgICBzdHJ1Y3QgRW51bVN0cmluZ01ha2VyCisgICAgeworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgKSB7IHJldHVybiB1bnByaW50YWJsZVN0cmluZzsgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBFbnVtU3RyaW5nTWFrZXI8VCx0cnVlPgorICAgIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIHYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOjpDYXRjaDo6dG9TdHJpbmcoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGU+KHYpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH07CisjZW5kaWYKKyAgICB0ZW1wbGF0ZTxib29sIEM+CisgICAgc3RydWN0IFN0cmluZ01ha2VyQmFzZSB7CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIHYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRW51bVN0cmluZ01ha2VyPFQ+Ojpjb252ZXJ0KCB2ICk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiApIHsgcmV0dXJuIHVucHJpbnRhYmxlU3RyaW5nOyB9CisjZW5kaWYKKyAgICB9OworCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBTdHJpbmdNYWtlckJhc2U8dHJ1ZT4geworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBfdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCB2b2lkICpvYmplY3QsIHN0ZDo6c2l6ZV90IHNpemUgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCBUJiBvYmplY3QgKSB7CisgICAgICByZXR1cm4gcmF3TWVtb3J5VG9TdHJpbmcoICZvYmplY3QsIHNpemVvZihvYmplY3QpICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRGV0YWlsCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3RyaW5nTWFrZXIgOgorICAgIERldGFpbDo6U3RyaW5nTWFrZXJCYXNlPERldGFpbDo6SXNTdHJlYW1JbnNlcnRhYmxlPFQ+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3RyaW5nTWFrZXI8VCo+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBVKiBwICkgeworICAgICAgICBpZiggIXAgKQorICAgICAgICAgICAgcmV0dXJuICJOVUxMIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIERldGFpbDo6cmF3TWVtb3J5VG9TdHJpbmcoIHAgKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBDPgorc3RydWN0IFN0cmluZ01ha2VyPFIgQzo6Kj4geworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBSIEM6OiogcCApIHsKKyAgICAgICAgaWYoICFwICkKKyAgICAgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBEZXRhaWw6OnJhd01lbW9yeVRvU3RyaW5nKCBwICk7CisgICAgfQorfTsKKworbmFtZXNwYWNlIERldGFpbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgICBzdGQ6OnN0cmluZyByYW5nZVRvU3RyaW5nKCBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QgKTsKK30KKworLy90ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvY2F0b3I+CisvL3N0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OnZlY3RvcjxULCBBbGxvY2F0b3I+ID4geworLy8gICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIHN0ZDo6dmVjdG9yPFQsQWxsb2NhdG9yPiBjb25zdCYgdiApIHsKKy8vICAgICAgICByZXR1cm4gRGV0YWlsOjpyYW5nZVRvU3RyaW5nKCB2LmJlZ2luKCksIHYuZW5kKCkgKTsKKy8vICAgIH0KKy8vfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2NhdG9yPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6dmVjdG9yPFQsQWxsb2NhdG9yPiBjb25zdCYgdiApIHsKKyAgICByZXR1cm4gRGV0YWlsOjpyYW5nZVRvU3RyaW5nKCB2LmJlZ2luKCksIHYuZW5kKCkgKTsKK30KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorCisvLyB0b1N0cmluZyBmb3IgdHVwbGVzCituYW1lc3BhY2UgVHVwbGVEZXRhaWwgeworICB0ZW1wbGF0ZTwKKyAgICAgIHR5cGVuYW1lIFR1cGxlLAorICAgICAgc3RkOjpzaXplX3QgTiA9IDAsCisgICAgICBib29sID0gKE4gPCBzdGQ6OnR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZSkKKyAgICAgID4KKyAgc3RydWN0IEVsZW1lbnRQcmludGVyIHsKKyAgICAgIHN0YXRpYyB2b2lkIHByaW50KCBjb25zdCBUdXBsZSYgdHVwbGUsIHN0ZDo6b3N0cmVhbSYgb3MgKQorICAgICAgeworICAgICAgICAgIG9zIDw8ICggTiA/ICIsICIgOiAiICIgKQorICAgICAgICAgICAgIDw8IENhdGNoOjp0b1N0cmluZyhzdGQ6OmdldDxOPih0dXBsZSkpOworICAgICAgICAgIEVsZW1lbnRQcmludGVyPFR1cGxlLE4rMT46OnByaW50KHR1cGxlLG9zKTsKKyAgICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZTwKKyAgICAgIHR5cGVuYW1lIFR1cGxlLAorICAgICAgc3RkOjpzaXplX3QgTgorICAgICAgPgorICBzdHJ1Y3QgRWxlbWVudFByaW50ZXI8VHVwbGUsTixmYWxzZT4geworICAgICAgc3RhdGljIHZvaWQgcHJpbnQoIGNvbnN0IFR1cGxlJiwgc3RkOjpvc3RyZWFtJiApIHt9CisgIH07CisKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgLi4uVHlwZXM+CitzdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp0dXBsZTxUeXBlcy4uLj4+IHsKKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBjb25zdCBzdGQ6OnR1cGxlPFR5cGVzLi4uPiYgdHVwbGUgKQorICAgIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgICBvcyA8PCAneyc7CisgICAgICAgIFR1cGxlRGV0YWlsOjpFbGVtZW50UHJpbnRlcjxzdGQ6OnR1cGxlPFR5cGVzLi4uPj46OnByaW50KCB0dXBsZSwgb3MgKTsKKyAgICAgICAgb3MgPDwgIiB9IjsKKyAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KK307CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisKK25hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RkOjpzdHJpbmcgbWFrZVN0cmluZyggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgIHJldHVybiBTdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdmFsdWUgKTsKKyAgICB9Cit9IC8vIGVuZCBuYW1lc3BhY2UgRGV0YWlsCisKKy8vLyBcYnJpZWYgY29udmVydHMgYW55IHR5cGUgdG8gYSBzdHJpbmcKKy8vLworLy8vIFRoZSBkZWZhdWx0IHRlbXBsYXRlIGZvcndhcmRzIG9uIHRvIG9zdHJpbmdzdHJlYW0gLSBleGNlcHQgd2hlbiBhbgorLy8vIG9zdHJpbmdzdHJlYW0gb3ZlcmxvYWQgZG9lcyBub3QgZXhpc3QgLSBpbiB3aGljaCBjYXNlIGl0IGF0dGVtcHRzIHRvIGRldGVjdAorLy8vIHRoYXQgYW5kIHdyaXRlcyB7P30uCisvLy8gT3ZlcmxvYWQgKG5vdCBzcGVjaWFsaXNlKSB0aGlzIHRlbXBsYXRlIGZvciBjdXN0b20gdHlwcyB0aGF0IHlvdSBkb24ndCB3YW50CisvLy8gdG8gcHJvdmlkZSBhbiBvc3RyZWFtIG92ZXJsb2FkIGZvci4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b1N0cmluZyggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgcmV0dXJuIFN0cmluZ01ha2VyPFQ+Ojpjb252ZXJ0KCB2YWx1ZSApOworfQorCisgICAgbmFtZXNwYWNlIERldGFpbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgICBzdGQ6OnN0cmluZyByYW5nZVRvU3RyaW5nKCBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QgKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIG9zcyA8PCAieyAiOworICAgICAgICBpZiggZmlyc3QgIT0gbGFzdCApIHsKKyAgICAgICAgICAgIG9zcyA8PCBDYXRjaDo6dG9TdHJpbmcoICpmaXJzdCApOworICAgICAgICAgICAgZm9yKCArK2ZpcnN0IDsgZmlyc3QgIT0gbGFzdCA7ICsrZmlyc3QgKQorICAgICAgICAgICAgICAgIG9zcyA8PCAiLCAiIDw8IENhdGNoOjp0b1N0cmluZyggKmZpcnN0ICk7CisgICAgICAgIH0KKyAgICAgICAgb3NzIDw8ICIgfSI7CisgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzVCwgSW50ZXJuYWw6Ok9wZXJhdG9yIE9wLCB0eXBlbmFtZSBSaHNUPgorY2xhc3MgQmluYXJ5RXhwcmVzc2lvbjsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CitjbGFzcyBNYXRjaEV4cHJlc3Npb247CisKKy8vIFdyYXBzIHRoZSBMSFMgb2YgYW4gZXhwcmVzc2lvbiBhbmQgb3ZlcmxvYWRzIGNvbXBhcmlzb24gb3BlcmF0b3JzCisvLyBmb3IgYWxzbyBjYXB0dXJpbmcgdGhvc2UgYW5kIFJIUyAoaWYgYW55KQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEV4cHJlc3Npb25MaHMgOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIEV4cHJlc3Npb25MaHMoIFJlc3VsdEJ1aWxkZXImIHJiLCBUIGxocyApIDogbV9yYiggcmIgKSwgbV9saHMoIGxocyApLCBtX3RydXRoeShmYWxzZSkge30KKworICAgIEV4cHJlc3Npb25MaHMmIG9wZXJhdG9yID0gKCBjb25zdCBFeHByZXNzaW9uTGhzJiApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0VxdWFsVG8sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yID09ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNOb3RFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciAhPSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc05vdEVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTGVzc1RoYW4sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yIDwgKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNMZXNzVGhhbj4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbiwgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPiAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0dyZWF0ZXJUaGFuPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0xlc3NUaGFuT3JFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA8PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0xlc3NUaGFuT3JFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA+PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNFcXVhbFRvLCBib29sPiBvcGVyYXRvciA9PSAoIGJvb2wgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTm90RXF1YWxUbywgYm9vbD4gb3BlcmF0b3IgIT0gKCBib29sIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc05vdEVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB2b2lkIGVuZEV4cHJlc3Npb24oKSB7CisgICAgICAgIG1fdHJ1dGh5ID0gbV9saHMgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIG1fcmIKKyAgICAgICAgICAgIC5zZXRSZXN1bHRUeXBlKCBtX3RydXRoeSApCisgICAgICAgICAgICAuZW5kRXhwcmVzc2lvbiggKnRoaXMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZGVzdCA9IENhdGNoOjp0b1N0cmluZyggbV90cnV0aHkgKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8SW50ZXJuYWw6Ok9wZXJhdG9yIE9wLCB0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIFJoc1QmPiBjYXB0dXJlRXhwcmVzc2lvbiggUmhzVCYgcmhzICkgY29uc3QgeworICAgICAgICByZXR1cm4gQmluYXJ5RXhwcmVzc2lvbjxULCBPcCwgUmhzVCY+KCBtX3JiLCBtX2xocywgcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8SW50ZXJuYWw6Ok9wZXJhdG9yIE9wPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIGJvb2w+IGNhcHR1cmVFeHByZXNzaW9uKCBib29sIHJocyApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIGJvb2w+KCBtX3JiLCBtX2xocywgcmhzICk7CisgICAgfQorCitwcml2YXRlOgorICAgIFJlc3VsdEJ1aWxkZXImIG1fcmI7CisgICAgVCBtX2xoczsKKyAgICBib29sIG1fdHJ1dGh5OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzVCwgSW50ZXJuYWw6Ok9wZXJhdG9yIE9wLCB0eXBlbmFtZSBSaHNUPgorY2xhc3MgQmluYXJ5RXhwcmVzc2lvbiA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CitwdWJsaWM6CisgICAgQmluYXJ5RXhwcmVzc2lvbiggUmVzdWx0QnVpbGRlciYgcmIsIExoc1QgbGhzLCBSaHNUIHJocyApCisgICAgICAgIDogbV9yYiggcmIgKSwgbV9saHMoIGxocyApLCBtX3JocyggcmhzICkge30KKworICAgIEJpbmFyeUV4cHJlc3Npb24mIG9wZXJhdG9yID0gKCBCaW5hcnlFeHByZXNzaW9uJiApOworCisgICAgdm9pZCBlbmRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3JiCisgICAgICAgICAgICAuc2V0UmVzdWx0VHlwZSggSW50ZXJuYWw6OmNvbXBhcmU8T3A+KCBtX2xocywgbV9yaHMgKSApCisgICAgICAgICAgICAuZW5kRXhwcmVzc2lvbiggKnRoaXMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGhzID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX2xocyApOworICAgICAgICBzdGQ6OnN0cmluZyByaHMgPSBDYXRjaDo6dG9TdHJpbmcoIG1fcmhzICk7CisgICAgICAgIGNoYXIgZGVsaW0gPSBsaHMuc2l6ZSgpICsgcmhzLnNpemUoKSA8IDQwICYmCisgICAgICAgICAgICAgICAgICAgICBsaHMuZmluZCgnXG4nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICAgICAgICAgICAgICAgcmhzLmZpbmQoJ1xuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgPyAnICcgOiAnXG4nOworICAgICAgICBkZXN0LnJlc2VydmUoIDcgKyBsaHMuc2l6ZSgpICsgcmhzLnNpemUoKSApOworICAgICAgICAgICAgICAgICAgIC8vIDIgZm9yIHNwYWNlcyBhcm91bmQgb3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBvcGVyYXRvcgorICAgICAgICAgICAgICAgICAgIC8vIDIgZm9yIHBhcmVudGhlc2VzIChjb25kaXRpb25hbGx5IGFkZGVkIGxhdGVyKQorICAgICAgICAgICAgICAgICAgIC8vIDEgZm9yIG5lZ2F0aW9uIChjb25kaXRpb25hbGx5IGFkZGVkIGxhdGVyKQorICAgICAgICBkZXN0ID0gbGhzOworICAgICAgICBkZXN0ICs9IGRlbGltOworICAgICAgICBkZXN0ICs9IEludGVybmFsOjpPcGVyYXRvclRyYWl0czxPcD46OmdldE5hbWUoKTsKKyAgICAgICAgZGVzdCArPSBkZWxpbTsKKyAgICAgICAgZGVzdCArPSByaHM7CisgICAgfQorCitwcml2YXRlOgorICAgIFJlc3VsdEJ1aWxkZXImIG1fcmI7CisgICAgTGhzVCBtX2xoczsKKyAgICBSaHNUIG1fcmhzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CitjbGFzcyBNYXRjaEV4cHJlc3Npb24gOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIE1hdGNoRXhwcmVzc2lvbiggQXJnVCBhcmcsIE1hdGNoZXJUIG1hdGNoZXIsIGNoYXIgY29uc3QqIG1hdGNoZXJTdHJpbmcgKQorICAgICAgICA6IG1fYXJnKCBhcmcgKSwgbV9tYXRjaGVyKCBtYXRjaGVyICksIG1fbWF0Y2hlclN0cmluZyggbWF0Y2hlclN0cmluZyApIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWF0Y2hlckFzU3RyaW5nID0gbV9tYXRjaGVyLnRvU3RyaW5nKCk7CisgICAgICAgIGRlc3QgPSBDYXRjaDo6dG9TdHJpbmcoIG1fYXJnICk7CisgICAgICAgIGRlc3QgKz0gJyAnOworICAgICAgICBpZiggbWF0Y2hlckFzU3RyaW5nID09IERldGFpbDo6dW5wcmludGFibGVTdHJpbmcgKQorICAgICAgICAgICAgZGVzdCArPSBtX21hdGNoZXJTdHJpbmc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlc3QgKz0gbWF0Y2hlckFzU3RyaW5nOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBcmdUIG1fYXJnOworICAgIE1hdGNoZXJUIG1fbWF0Y2hlcjsKKyAgICBjaGFyIGNvbnN0KiBtX21hdGNoZXJTdHJpbmc7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgRXhwcmVzc2lvbkxoczxUIGNvbnN0Jj4gUmVzdWx0QnVpbGRlcjo6b3BlcmF0b3IgPD0gKCBUIGNvbnN0JiBvcGVyYW5kICkgeworICAgICAgICByZXR1cm4gRXhwcmVzc2lvbkxoczxUIGNvbnN0Jj4oICp0aGlzLCBvcGVyYW5kICk7CisgICAgfQorCisgICAgaW5saW5lIEV4cHJlc3Npb25MaHM8Ym9vbD4gUmVzdWx0QnVpbGRlcjo6b3BlcmF0b3IgPD0gKCBib29sIHZhbHVlICkgeworICAgICAgICByZXR1cm4gRXhwcmVzc2lvbkxoczxib29sPiggKnRoaXMsIHZhbHVlICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CisgICAgaW5saW5lIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZU1hdGNoKCBBcmdUIGNvbnN0JiBhcmcsIE1hdGNoZXJUIGNvbnN0JiBtYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogbWF0Y2hlclN0cmluZyApIHsKKyAgICAgICAgTWF0Y2hFeHByZXNzaW9uPEFyZ1QgY29uc3QmLCBNYXRjaGVyVCBjb25zdCY+IGV4cHIoIGFyZywgbWF0Y2hlciwgbWF0Y2hlclN0cmluZyApOworICAgICAgICBzZXRSZXN1bHRUeXBlKCBtYXRjaGVyLm1hdGNoKCBhcmcgKSApOworICAgICAgICBlbmRFeHByZXNzaW9uKCBleHByICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWVzc2FnZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NRVNTQUdFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBNZXNzYWdlSW5mbyB7CisgICAgICAgIE1lc3NhZ2VJbmZvKCAgICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSBfdHlwZSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1hY3JvTmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHR5cGU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKworICAgICAgICBib29sIG9wZXJhdG9yID09ICggTWVzc2FnZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlID09IG90aGVyLnNlcXVlbmNlOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIE1lc3NhZ2VJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZSA8IG90aGVyLnNlcXVlbmNlOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGludCBnbG9iYWxDb3VudDsKKyAgICB9OworCisgICAgc3RydWN0IE1lc3NhZ2VCdWlsZGVyIHsKKyAgICAgICAgTWVzc2FnZUJ1aWxkZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSB0eXBlICkKKyAgICAgICAgOiBtX2luZm8oIG1hY3JvTmFtZSwgbGluZUluZm8sIHR5cGUgKQorICAgICAgICB7fQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIE1lc3NhZ2VCdWlsZGVyJiBvcGVyYXRvciA8PCAoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICAgICAgbV9zdHJlYW0gPDwgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBNZXNzYWdlSW5mbyBtX2luZm87CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBtX3N0cmVhbTsKKyAgICB9OworCisgICAgY2xhc3MgU2NvcGVkTWVzc2FnZSB7CisgICAgcHVibGljOgorICAgICAgICBTY29wZWRNZXNzYWdlKCBNZXNzYWdlQnVpbGRlciBjb25zdCYgYnVpbGRlciApOworICAgICAgICBTY29wZWRNZXNzYWdlKCBTY29wZWRNZXNzYWdlIGNvbnN0JiBvdGhlciApOworICAgICAgICB+U2NvcGVkTWVzc2FnZSgpOworCisgICAgICAgIE1lc3NhZ2VJbmZvIG1faW5mbzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfY2FwdHVyZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0NBUFRVUkVfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0OworICAgIHN0cnVjdCBBc3NlcnRpb25JbmZvOworICAgIHN0cnVjdCBTZWN0aW9uSW5mbzsKKyAgICBzdHJ1Y3QgU2VjdGlvbkVuZEluZm87CisgICAgc3RydWN0IE1lc3NhZ2VJbmZvOworICAgIGNsYXNzIFNjb3BlZE1lc3NhZ2VCdWlsZGVyOworICAgIHN0cnVjdCBDb3VudHM7CisKKyAgICBzdHJ1Y3QgSVJlc3VsdENhcHR1cmUgeworCisgICAgICAgIHZpcnR1YWwgfklSZXN1bHRDYXB0dXJlKCk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNlY3Rpb25TdGFydGVkKCAgICBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRzJiBhc3NlcnRpb25zICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZEVhcmx5KCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHB1c2hTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHBvcFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRlc3ROYW1lKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGNvbnN0IEFzc2VydGlvblJlc3VsdCogZ2V0TGFzdFJlc3VsdCgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKSA9IDA7CisgICAgfTsKKworICAgIElSZXN1bHRDYXB0dXJlJiBnZXRSZXN1bHRDYXB0dXJlKCk7Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9kZWJ1Z2dlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUJVR0dFUl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9wbGF0Zm9ybS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9QTEFURk9STV9IX0lOQ0xVREVECisKKyNpZiBkZWZpbmVkKF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fTUFDCisjZWxpZiAgZGVmaW5lZChfX0lQSE9ORV9PU19WRVJTSU9OX01JTl9SRVFVSVJFRCkKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9JUEhPTkUKKyNlbGlmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChfX2xpbnV4X18pCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fTElOVVgKKyNlbGlmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisjICBpZiAhZGVmaW5lZChOT01JTk1BWCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX05PTUlOTUFYKQorIyAgICBkZWZpbmUgQ0FUQ0hfREVGSU5FU19OT01JTk1BWAorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKFdJTjMyX0xFQU5fQU5EX01FQU4pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19XSU4zMl9MRUFOX0FORF9NRUFOKQorIyAgICBkZWZpbmUgQ0FUQ0hfREVGSU5FU19XSU4zMl9MRUFOX0FORF9NRUFOCisjICBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaHsKKworICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpOworICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKTsKK30KKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworCisgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgYmFzZWQgb246CisgICAgLy8gaHR0cDovL2NvY29hd2l0aGxvdmUuY29tLzIwMDgvMDMvYnJlYWstaW50by1kZWJ1Z2dlci5odG1sCisgICAgI2lmIGRlZmluZWQoX19wcGM2NF9fKSB8fCBkZWZpbmVkKF9fcHBjX18pCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIFwKKyAgICAgICAgICAgICAgICBfX2FzbV9fKCJsaSByMCwgMjBcbnNjXG5ub3BcbmxpIHIwLCAzN1xubGkgcjQsIDJcbnNjXG5ub3BcbiIgXAorICAgICAgICAgICAgICAgIDogOiA6ICJtZW1vcnkiLCJyMCIsInIzIiwicjQiICkKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBfX2FzbV9fKCJpbnQgJDNcbiIgOiA6ICkKKyAgICAjZW5kaWYKKworI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9MSU5VWCkKKyAgICAvLyBJZiB3ZSBjYW4gdXNlIGlubGluZSBhc3NlbWJsZXIsIGRvIGl0IGJlY2F1c2UgdGhpcyBhbGxvd3MgdXMgdG8gYnJlYWsKKyAgICAvLyBkaXJlY3RseSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGZhaWxpbmcgY2hlY2sgaW5zdGVhZCBvZiBicmVha2luZyBpbnNpZGUKKyAgICAvLyByYWlzZSgpIGNhbGxlZCBmcm9tIGl0LCBpLmUuIG9uZSBzdGFjayBmcmFtZSBiZWxvdy4KKyAgICAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9feDg2XzY0KSkKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgYXNtIHZvbGF0aWxlICgiaW50ICQzIikKKyAgICAjZWxzZSAvLyBGYWxsIGJhY2sgdG8gdGhlIGdlbmVyaWMgd2F5LgorICAgICAgICAjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgcmFpc2UoU0lHVFJBUCkKKyAgICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgX19kZWJ1Z2JyZWFrKCkKKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBfX3N0ZGNhbGwgRGVidWdCcmVhaygpOworICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIERlYnVnQnJlYWsoKQorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9UUkFQCisgICAgI2RlZmluZSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCkgaWYoIENhdGNoOjppc0RlYnVnZ2VyQWN0aXZlKCkgKSB7IENBVENIX1RSQVAoKTsgfQorI2Vsc2UKKyAgICAjZGVmaW5lIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKSBDYXRjaDo6YWx3YXlzVHJ1ZSgpOworI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3J1bm5lci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1JVTk5FUl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgY2xhc3MgVGVzdENhc2U7CisKKyAgICBzdHJ1Y3QgSVJ1bm5lciB7CisgICAgICAgIHZpcnR1YWwgfklSdW5uZXIoKTsKKyAgICAgICAgdmlydHVhbCBib29sIGFib3J0aW5nKCkgY29uc3QgPSAwOworICAgIH07Cit9CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBXZSBjYW4gc3BlZWR1cCBjb21waWxhdGlvbiBzaWduaWZpY2FudGx5IGJ5IGJyZWFraW5nIGludG8gZGVidWdnZXIgbG93ZXIgaW4KKy8vIHRoZSBjYWxsc3RhY2ssIGJlY2F1c2UgdGhlbiB3ZSBkb24ndCBoYXZlIHRvIGV4cGFuZCBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSCisvLyBtYWNybyBpbiBlYWNoIGFzc2VydGlvbgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUFDVCggcmVzdWx0QnVpbGRlciApIFwKKyAgICByZXN1bHRCdWlsZGVyLnJlYWN0KCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFub3RoZXIgd2F5IHRvIHNwZWVkLXVwIGNvbXBpbGF0aW9uIGlzIHRvIG9taXQgbG9jYWwgdHJ5LWNhdGNoIGZvciBSRVFVSVJFKgorLy8gbWFjcm9zLgorLy8gVGhpcyBjYW4gcG90ZW50aWFsbHkgY2F1c2UgZmFsc2UgbmVnYXRpdmUsIGlmIHRoZSB0ZXN0IGNvZGUgY2F0Y2hlcworLy8gdGhlIGV4Y2VwdGlvbiBiZWZvcmUgaXQgcHJvcGFnYXRlcyBiYWNrIHVwIHRvIHRoZSBydW5uZXIuCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAoIF9fY2F0Y2hSZXN1bHQgPD0gZXhwciApLmVuZEV4cHJlc3Npb24oKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC51bnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmlzVHJ1ZSggZmFsc2UgJiYgc3RhdGljX2Nhc3Q8Ym9vbD4oICEhKGV4cHIpICkgKSApIC8vIGV4cHIgaGVyZSBpcyBuZXZlciBldmFsdWF0ZWQgYXQgcnVudGltZSBidXQgaXQgZm9yY2VzIHRoZSBjb21waWxlciB0byBnaXZlIGl0IGEgbG9vaworLy8gVGhlIGRvdWJsZSBuZWdhdGlvbiBzaWxlbmNlcyBNU1ZDJ3MgQzQ4MDAgd2FybmluZywgdGhlIHN0YXRpY19jYXN0IGZvcmNlcyBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24gaWYgdGhlIHR5cGUgaGFzIG92ZXJsb2FkZWQgJiYuCisKKyNkZWZpbmUgSU5URVJOQUxfQ0hFQ0tfVEhBVF9OT19UUlkoIG1hY3JvTmFtZSwgbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24sIGFyZyApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2FyZyAiLCAiICNtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVNYXRjaCggYXJnLCBtYXRjaGVyLCAjbWF0Y2hlciApOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQudW5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworI2Vsc2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUgd29ya3Mgb3V0IGlmIHRoZSBkZWJ1Z2dlciBuZWVkcyB0byBiZSBpbnZva2VkCisvLyBhbmQvb3IgYW4gZXhjZXB0aW9uIHRocm93biBhbmQgdGFrZXMgYXBwcm9wcmlhdGUgYWN0aW9uLgorLy8gVGhpcyBuZWVkcyB0byBiZSBkb25lIGFzIGEgbWFjcm8gc28gdGhlIGRlYnVnZ2VyIHdpbGwgc3RvcCBpbiB0aGUgdXNlcgorLy8gc291cmNlIGNvZGUgcmF0aGVyIHRoYW4gaW4gQ2F0Y2ggbGlicmFyeSBjb2RlCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFQUNUKCByZXN1bHRCdWlsZGVyICkgXAorICAgIGlmKCByZXN1bHRCdWlsZGVyLnNob3VsZERlYnVnQnJlYWsoKSApIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKTsgXAorICAgIHJlc3VsdEJ1aWxkZXIucmVhY3QoKTsKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgICggX19jYXRjaFJlc3VsdCA8PSBleHByICkuZW5kRXhwcmVzc2lvbigpOyBcCisgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgfSBcCisgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIH0gXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6aXNUcnVlKCBmYWxzZSAmJiBzdGF0aWNfY2FzdDxib29sPiggISEoZXhwcikgKSApICkgLy8gZXhwciBoZXJlIGlzIG5ldmVyIGV2YWx1YXRlZCBhdCBydW50aW1lIGJ1dCBpdCBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIGdpdmUgaXQgYSBsb29rCisgICAgLy8gVGhlIGRvdWJsZSBuZWdhdGlvbiBzaWxlbmNlcyBNU1ZDJ3MgQzQ4MDAgd2FybmluZywgdGhlIHN0YXRpY19jYXN0IGZvcmNlcyBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24gaWYgdGhlIHR5cGUgaGFzIG92ZXJsb2FkZWQgJiYuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfSUYoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApOyBcCisgICAgaWYoIENhdGNoOjpnZXRSZXN1bHRDYXB0dXJlKCkuZ2V0TGFzdFJlc3VsdCgpLT5zdWNjZWVkZWQoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfRUxTRSggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBJTlRFUk5BTF9DQVRDSF9URVNUKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICk7IFwKKyAgICBpZiggIUNhdGNoOjpnZXRSZXN1bHRDYXB0dXJlKCkuZ2V0TGFzdFJlc3VsdCgpLT5zdWNjZWVkZWQoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KGV4cHIpOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIH0gXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBtYXRjaGVyLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24sICNtYXRjaGVyICk7IFwKKyAgICAgICAgaWYoIF9fY2F0Y2hSZXN1bHQuYWxsb3dUaHJvd3MoKSApIFwKKyAgICAgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggbWF0Y2hlciApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggbWFjcm9OYW1lLCBleGNlcHRpb25UeXBlLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIgIiwgIiAjZXhjZXB0aW9uVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBpZiggX19jYXRjaFJlc3VsdC5hbGxvd1Rocm93cygpICkgXAorICAgICAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KGV4cHIpOyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0Y2goIGV4Y2VwdGlvblR5cGUgKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTVNHKCBtYWNyb05hbWUsIG1lc3NhZ2VUeXBlLCByZXN1bHREaXNwb3NpdGlvbiwgLi4uICkgXAorICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICIiLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0IDw8IF9fVkFfQVJHU19fICsgOjpDYXRjaDo6U3RyZWFtRW5kU3RvcCgpOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIG1lc3NhZ2VUeXBlICk7IFwKKyAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgICAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisjZWxzZQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTVNHKCBtYWNyb05hbWUsIG1lc3NhZ2VUeXBlLCByZXN1bHREaXNwb3NpdGlvbiwgbG9nICkgXAorICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICIiLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0IDw8IGxvZyArIDo6Q2F0Y2g6OlN0cmVhbUVuZFN0b3AoKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBtZXNzYWdlVHlwZSApOyBcCisgICAgICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICAgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfSU5GTyggbWFjcm9OYW1lLCBsb2cgKSBcCisgICAgQ2F0Y2g6OlNjb3BlZE1lc3NhZ2UgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIHNjb3BlZE1lc3NhZ2UgKSA9IENhdGNoOjpNZXNzYWdlQnVpbGRlciggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6OlJlc3VsdFdhczo6SW5mbyApIDw8IGxvZzsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DSEVDS19USEFUKCBtYWNyb05hbWUsIG1hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uLCBhcmcgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNhcmcgIiwgIiAjbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVNYXRjaCggYXJnLCBtYXRjaGVyLCAjbWF0Y2hlciApOyBcCisgICAgICAgIH0gY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC51c2VBY3RpdmVFeGNlcHRpb24oIHJlc3VsdERpc3Bvc2l0aW9uIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSApOyBcCisgICAgICAgIH0gXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9zZWN0aW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NFQ1RJT05fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc2VjdGlvbl9pbmZvLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NFQ1RJT05fSU5GT19IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90b3RhbHMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1RBTFNfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvdW50cyB7CisgICAgICAgIENvdW50cygpIDogcGFzc2VkKCAwICksIGZhaWxlZCggMCApLCBmYWlsZWRCdXRPayggMCApIHt9CisKKyAgICAgICAgQ291bnRzIG9wZXJhdG9yIC0gKCBDb3VudHMgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgQ291bnRzIGRpZmY7CisgICAgICAgICAgICBkaWZmLnBhc3NlZCA9IHBhc3NlZCAtIG90aGVyLnBhc3NlZDsKKyAgICAgICAgICAgIGRpZmYuZmFpbGVkID0gZmFpbGVkIC0gb3RoZXIuZmFpbGVkOworICAgICAgICAgICAgZGlmZi5mYWlsZWRCdXRPayA9IGZhaWxlZEJ1dE9rIC0gb3RoZXIuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgICAgfQorICAgICAgICBDb3VudHMmIG9wZXJhdG9yICs9ICggQ291bnRzIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIHBhc3NlZCArPSBvdGhlci5wYXNzZWQ7CisgICAgICAgICAgICBmYWlsZWQgKz0gb3RoZXIuZmFpbGVkOworICAgICAgICAgICAgZmFpbGVkQnV0T2sgKz0gb3RoZXIuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCB0b3RhbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzZWQgKyBmYWlsZWQgKyBmYWlsZWRCdXRPazsKKyAgICAgICAgfQorICAgICAgICBib29sIGFsbFBhc3NlZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmYWlsZWQgPT0gMCAmJiBmYWlsZWRCdXRPayA9PSAwOworICAgICAgICB9CisgICAgICAgIGJvb2wgYWxsT2soKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFpbGVkID09IDA7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBwYXNzZWQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZDsKKyAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkQnV0T2s7CisgICAgfTsKKworICAgIHN0cnVjdCBUb3RhbHMgeworCisgICAgICAgIFRvdGFscyBvcGVyYXRvciAtICggVG90YWxzIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIFRvdGFscyBkaWZmOworICAgICAgICAgICAgZGlmZi5hc3NlcnRpb25zID0gYXNzZXJ0aW9ucyAtIG90aGVyLmFzc2VydGlvbnM7CisgICAgICAgICAgICBkaWZmLnRlc3RDYXNlcyA9IHRlc3RDYXNlcyAtIG90aGVyLnRlc3RDYXNlczsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgVG90YWxzIGRlbHRhKCBUb3RhbHMgY29uc3QmIHByZXZUb3RhbHMgKSBjb25zdCB7CisgICAgICAgICAgICBUb3RhbHMgZGlmZiA9ICp0aGlzIC0gcHJldlRvdGFsczsKKyAgICAgICAgICAgIGlmKCBkaWZmLmFzc2VydGlvbnMuZmFpbGVkID4gMCApCisgICAgICAgICAgICAgICAgKytkaWZmLnRlc3RDYXNlcy5mYWlsZWQ7CisgICAgICAgICAgICBlbHNlIGlmKCBkaWZmLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgPiAwICkKKyAgICAgICAgICAgICAgICArK2RpZmYudGVzdENhc2VzLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMucGFzc2VkOworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKworICAgICAgICBUb3RhbHMmIG9wZXJhdG9yICs9ICggVG90YWxzIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIGFzc2VydGlvbnMgKz0gb3RoZXIuYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIHRlc3RDYXNlcyArPSBvdGhlci50ZXN0Q2FzZXM7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgQ291bnRzIHRlc3RDYXNlczsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNlY3Rpb25JbmZvIHsKKyAgICAgICAgU2VjdGlvbkluZm8KKyAgICAgICAgICAgICggICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uID0gc3RkOjpzdHJpbmcoKSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICB9OworCisgICAgc3RydWN0IFNlY3Rpb25FbmRJbmZvIHsKKyAgICAgICAgU2VjdGlvbkVuZEluZm8oIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8sIENvdW50cyBjb25zdCYgX3ByZXZBc3NlcnRpb25zLCBkb3VibGUgX2R1cmF0aW9uSW5TZWNvbmRzICkKKyAgICAgICAgOiBzZWN0aW9uSW5mbyggX3NlY3Rpb25JbmZvICksIHByZXZBc3NlcnRpb25zKCBfcHJldkFzc2VydGlvbnMgKSwgZHVyYXRpb25JblNlY29uZHMoIF9kdXJhdGlvbkluU2Vjb25kcyApCisgICAgICAgIHt9CisKKyAgICAgICAgU2VjdGlvbkluZm8gc2VjdGlvbkluZm87CisgICAgICAgIENvdW50cyBwcmV2QXNzZXJ0aW9uczsKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uSW5TZWNvbmRzOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGltZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVElNRVJfSF9JTkNMVURFRAorCisjaWZkZWYgX01TQ19WRVIKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSW50NjQ7Cit9CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorbmFtZXNwYWNlIENhdGNoIHsKKyAgICB0eXBlZGVmIHVpbnQ2NF90IFVJbnQ2NDsKK30KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFRpbWVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRpbWVyKCkgOiBtX3RpY2tzKCAwICkge30KKyAgICAgICAgdm9pZCBzdGFydCgpOworICAgICAgICB1bnNpZ25lZCBpbnQgZ2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpIGNvbnN0OworICAgICAgICB1bnNpZ25lZCBpbnQgZ2V0RWxhcHNlZE1pbGxpc2Vjb25kcygpIGNvbnN0OworICAgICAgICBkb3VibGUgZ2V0RWxhcHNlZFNlY29uZHMoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFVJbnQ2NCBtX3RpY2tzOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBTZWN0aW9uIDogTm9uQ29weWFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2VjdGlvbiggU2VjdGlvbkluZm8gY29uc3QmIGluZm8gKTsKKyAgICAgICAgflNlY3Rpb24oKTsKKworICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBvciBub3QKKyAgICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU2VjdGlvbkluZm8gbV9pbmZvOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1fbmFtZTsKKyAgICAgICAgQ291bnRzIG1fYXNzZXJ0aW9uczsKKyAgICAgICAgYm9vbCBtX3NlY3Rpb25JbmNsdWRlZDsKKyAgICAgICAgVGltZXIgbV90aW1lcjsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIC4uLiApIFwKKyAgICAgICAgaWYoIENhdGNoOjpTZWN0aW9uIGNvbnN0JiBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfU2VjdGlvbiApID0gQ2F0Y2g6OlNlY3Rpb25JbmZvKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgX19WQV9BUkdTX18gKSApCisjZWxzZQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzYyApIFwKKyAgICAgICAgaWYoIENhdGNoOjpTZWN0aW9uIGNvbnN0JiBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfU2VjdGlvbiApID0gQ2F0Y2g6OlNlY3Rpb25JbmZvKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgbmFtZSwgZGVzYyApICkKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfZ2VuZXJhdG9ycy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0dFTkVSQVRPUlNfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IElHZW5lcmF0b3IgeworICAgIHZpcnR1YWwgfklHZW5lcmF0b3IoKSB7fQorICAgIHZpcnR1YWwgVCBnZXRWYWx1ZSggc3RkOjpzaXplX3QgaW5kZXggKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBzaXplICgpIGNvbnN0ID0gMDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBCZXR3ZWVuR2VuZXJhdG9yIDogcHVibGljIElHZW5lcmF0b3I8VD4geworcHVibGljOgorICAgIEJldHdlZW5HZW5lcmF0b3IoIFQgZnJvbSwgVCB0byApIDogbV9mcm9tKCBmcm9tICksIG1fdG8oIHRvICl7fQorCisgICAgdmlydHVhbCBUIGdldFZhbHVlKCBzdGQ6OnNpemVfdCBpbmRleCApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fZnJvbStzdGF0aWNfY2FzdDxpbnQ+KCBpbmRleCApOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggMSttX3RvLW1fZnJvbSApOworICAgIH0KKworcHJpdmF0ZToKKworICAgIFQgbV9mcm9tOworICAgIFQgbV90bzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBWYWx1ZXNHZW5lcmF0b3IgOiBwdWJsaWMgSUdlbmVyYXRvcjxUPiB7CitwdWJsaWM6CisgICAgVmFsdWVzR2VuZXJhdG9yKCl7fQorCisgICAgdm9pZCBhZGQoIFQgdmFsdWUgKSB7CisgICAgICAgIG1fdmFsdWVzLnB1c2hfYmFjayggdmFsdWUgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFQgZ2V0VmFsdWUoIHN0ZDo6c2l6ZV90IGluZGV4ICkgY29uc3QgeworICAgICAgICByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzLnNpemUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp2ZWN0b3I8VD4gbV92YWx1ZXM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ29tcG9zaXRlR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgICBDb21wb3NpdGVHZW5lcmF0b3IoKSA6IG1fdG90YWxTaXplKCAwICkge30KKworICAgIC8vICoqKiBNb3ZlIHNlbWFudGljcywgc2ltaWxhciB0byBhdXRvX3B0ciAqKioKKyAgICBDb21wb3NpdGVHZW5lcmF0b3IoIENvbXBvc2l0ZUdlbmVyYXRvciYgb3RoZXIgKQorICAgIDogICBtX2ZpbGVJbmZvKCBvdGhlci5tX2ZpbGVJbmZvICksCisgICAgICAgIG1fdG90YWxTaXplKCAwICkKKyAgICB7CisgICAgICAgIG1vdmUoIG90aGVyICk7CisgICAgfQorCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yJiBzZXRGaWxlSW5mbyggY29uc3QgY2hhciogZmlsZUluZm8gKSB7CisgICAgICAgIG1fZmlsZUluZm8gPSBmaWxlSW5mbzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIH5Db21wb3NpdGVHZW5lcmF0b3IoKSB7CisgICAgICAgIGRlbGV0ZUFsbCggbV9jb21wb3NlZCApOworICAgIH0KKworICAgIG9wZXJhdG9yIFQgKCkgY29uc3QgeworICAgICAgICBzaXplX3Qgb3ZlcmFsbEluZGV4ID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRHZW5lcmF0b3JJbmRleCggbV9maWxlSW5mbywgbV90b3RhbFNpemUgKTsKKworICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3Rvcjxjb25zdCBJR2VuZXJhdG9yPFQ+Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb21wb3NlZC5iZWdpbigpOworICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3Rvcjxjb25zdCBJR2VuZXJhdG9yPFQ+Kj46OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbV9jb21wb3NlZC5lbmQoKTsKKyAgICAgICAgZm9yKCBzaXplX3QgaW5kZXggPSAwOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IElHZW5lcmF0b3I8VD4qIGdlbmVyYXRvciA9ICppdDsKKyAgICAgICAgICAgIGlmKCBvdmVyYWxsSW5kZXggPj0gaW5kZXggJiYgb3ZlcmFsbEluZGV4IDwgaW5kZXggKyBnZW5lcmF0b3ItPnNpemUoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci0+Z2V0VmFsdWUoIG92ZXJhbGxJbmRleC1pbmRleCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggKz0gZ2VuZXJhdG9yLT5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfRVJST1IoICJJbmRleGVkIHBhc3QgZW5kIG9mIGdlbmVyYXRlZCByYW5nZSIgKTsKKyAgICAgICAgcmV0dXJuIFQoKTsgLy8gU3VwcHJlc3Mgc3B1cmlvdXMgIm5vdCBhbGwgY29udHJvbCBwYXRocyByZXR1cm4gYSB2YWx1ZSIgd2FybmluZyBpbiBWaXN1YWwgU3R1ZGlvIC0gaWYgeW91IGtub3cgaG93IHRvIGZpeCB0aGlzIHBsZWFzZSBkbyBzbworICAgIH0KKworICAgIHZvaWQgYWRkKCBjb25zdCBJR2VuZXJhdG9yPFQ+KiBnZW5lcmF0b3IgKSB7CisgICAgICAgIG1fdG90YWxTaXplICs9IGdlbmVyYXRvci0+c2l6ZSgpOworICAgICAgICBtX2NvbXBvc2VkLnB1c2hfYmFjayggZ2VuZXJhdG9yICk7CisgICAgfQorCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yJiB0aGVuKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkgeworICAgICAgICBtb3ZlKCBvdGhlciApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yJiB0aGVuKCBUIHZhbHVlICkgeworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbHVlICk7CisgICAgICAgIGFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICB2b2lkIG1vdmUoIENvbXBvc2l0ZUdlbmVyYXRvciYgb3RoZXIgKSB7CisgICAgICAgIG1fY29tcG9zZWQuaW5zZXJ0KCBtX2NvbXBvc2VkLmVuZCgpLCBvdGhlci5tX2NvbXBvc2VkLmJlZ2luKCksIG90aGVyLm1fY29tcG9zZWQuZW5kKCkgKTsKKyAgICAgICAgbV90b3RhbFNpemUgKz0gb3RoZXIubV90b3RhbFNpemU7CisgICAgICAgIG90aGVyLm1fY29tcG9zZWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJR2VuZXJhdG9yPFQ+Kj4gbV9jb21wb3NlZDsKKyAgICBzdGQ6OnN0cmluZyBtX2ZpbGVJbmZvOworICAgIHNpemVfdCBtX3RvdGFsU2l6ZTsKK307CisKK25hbWVzcGFjZSBHZW5lcmF0b3JzCit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gYmV0d2VlbiggVCBmcm9tLCBUIHRvICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIG5ldyBCZXR3ZWVuR2VuZXJhdG9yPFQ+KCBmcm9tLCB0byApICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IHZhbHVlcyggVCB2YWwxLCBUIHZhbDIgKSB7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDEgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDIgKTsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyLCBUIHZhbDMgKXsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMSApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMiApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMyApOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IHZhbHVlcyggVCB2YWwxLCBUIHZhbDIsIFQgdmFsMywgVCB2YWw0ICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwxICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwyICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwzICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWw0ICk7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgR2VuZXJhdG9ycworCit1c2luZyBuYW1lc3BhY2UgR2VuZXJhdG9yczsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTElORVNUUjIoIGxpbmUgKSAjbGluZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSKCBsaW5lICkgSU5URVJOQUxfQ0FUQ0hfTElORVNUUjIoIGxpbmUgKQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0dFTkVSQVRFKCBleHByICkgZXhwci5zZXRGaWxlSW5mbyggX19GSUxFX18gIigiIElOVEVSTkFMX0NBVENIX0xJTkVTVFIoIF9fTElORV9fICkgIikiICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2ludGVyZmFjZXNfZXhjZXB0aW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfRVhDRVBUSU9OX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3JlZ2lzdHJ5X2h1Yi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1JFR0lTVFJZX0hVQl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlUmVnaXN0cnk7CisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk7CisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yOworICAgIHN0cnVjdCBJUmVwb3J0ZXJSZWdpc3RyeTsKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyRmFjdG9yeTsKKyAgICBzdHJ1Y3QgSVRhZ0FsaWFzUmVnaXN0cnk7CisKKyAgICBzdHJ1Y3QgSVJlZ2lzdHJ5SHViIHsKKyAgICAgICAgdmlydHVhbCB+SVJlZ2lzdHJ5SHViKCk7CisKKyAgICAgICAgdmlydHVhbCBJUmVwb3J0ZXJSZWdpc3RyeSBjb25zdCYgZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBJVGVzdENhc2VSZWdpc3RyeSBjb25zdCYgZ2V0VGVzdENhc2VSZWdpc3RyeSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgZ2V0VGFnQWxpYXNSZWdpc3RyeSgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkmIGdldEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElNdXRhYmxlUmVnaXN0cnlIdWIgeworICAgICAgICB2aXJ0dWFsIH5JTXV0YWJsZVJlZ2lzdHJ5SHViKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUYWdBbGlhcyggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSA9IDA7CisgICAgfTsKKworICAgIElSZWdpc3RyeUh1YiYgZ2V0UmVnaXN0cnlIdWIoKTsKKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViJiBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKTsKKyAgICB2b2lkIGNsZWFuVXAoKTsKKyAgICBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZygqZXhjZXB0aW9uVHJhbnNsYXRlRnVuY3Rpb24pKCk7CisKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvcio+IEV4Y2VwdGlvblRyYW5zbGF0b3JzOworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yIHsKKyAgICAgICAgdmlydHVhbCB+SUV4Y2VwdGlvblRyYW5zbGF0b3IoKTsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kICkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKTsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3IgOiBwdWJsaWMgSUV4Y2VwdGlvblRyYW5zbGF0b3IgeworICAgICAgICBwdWJsaWM6CisKKyAgICAgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3IoIHN0ZDo6c3RyaW5nKCp0cmFuc2xhdGVGdW5jdGlvbikoIFQmICkgKQorICAgICAgICAgICAgOiBtX3RyYW5zbGF0ZUZ1bmN0aW9uKCB0cmFuc2xhdGVGdW5jdGlvbiApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZSggRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0LCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0ID09IGl0RW5kICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCppdCktPnRyYW5zbGF0ZSggaXQrMSwgaXRFbmQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goIFQmIGV4ICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV90cmFuc2xhdGVGdW5jdGlvbiggZXggKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcoKm1fdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApOworICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cmFyKCBzdGQ6OnN0cmluZygqdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUcmFuc2xhdG9yCisgICAgICAgICAgICAgICAgKCBuZXcgRXhjZXB0aW9uVHJhbnNsYXRvcjxUPiggdHJhbnNsYXRlRnVuY3Rpb24gKSApOworICAgICAgICB9CisgICAgfTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OMiggdHJhbnNsYXRvck5hbWUsIHNpZ25hdHVyZSApIFwKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdHJhbnNsYXRvck5hbWUoIHNpZ25hdHVyZSApOyBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfRXhjZXB0aW9uUmVnaXN0cmFyICkoICZ0cmFuc2xhdG9yTmFtZSApOyB9XAorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0cmFuc2xhdG9yTmFtZSggc2lnbmF0dXJlICkKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX0V4Y2VwdGlvblRyYW5zbGF0b3IgKSwgc2lnbmF0dXJlICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2FwcHJveC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0FQUFJPWF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKQorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGNsYXNzIEFwcHJveCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBBcHByb3ggKCBkb3VibGUgdmFsdWUgKQorICAgICAgICA6ICAgbV9lcHNpbG9uKCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKjEwMCApLAorICAgICAgICAgICAgbV9tYXJnaW4oIDAuMCApLAorICAgICAgICAgICAgbV9zY2FsZSggMS4wICksCisgICAgICAgICAgICBtX3ZhbHVlKCB2YWx1ZSApCisgICAgICAgIHt9CisKKyAgICAgICAgQXBwcm94KCBBcHByb3ggY29uc3QmIG90aGVyICkKKyAgICAgICAgOiAgIG1fZXBzaWxvbiggb3RoZXIubV9lcHNpbG9uICksCisgICAgICAgICAgICBtX21hcmdpbiggb3RoZXIubV9tYXJnaW4gKSwKKyAgICAgICAgICAgIG1fc2NhbGUoIG90aGVyLm1fc2NhbGUgKSwKKyAgICAgICAgICAgIG1fdmFsdWUoIG90aGVyLm1fdmFsdWUgKQorICAgICAgICB7fQorCisgICAgICAgIHN0YXRpYyBBcHByb3ggY3VzdG9tKCkgeworICAgICAgICAgICAgcmV0dXJuIEFwcHJveCggMCApOworICAgICAgICB9CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3ggb3BlcmF0b3IoKSggVCB2YWx1ZSApIHsKKyAgICAgICAgICAgIEFwcHJveCBhcHByb3goIHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpICk7CisgICAgICAgICAgICBhcHByb3guZXBzaWxvbiggbV9lcHNpbG9uICk7CisgICAgICAgICAgICBhcHByb3gubWFyZ2luKCBtX21hcmdpbiApOworICAgICAgICAgICAgYXBwcm94LnNjYWxlKCBtX3NjYWxlICk7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94OworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQgQXBwcm94KCBUIHZhbHVlICk6IEFwcHJveChzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSkKKyAgICAgICAge30KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIGNvbnN0IFQmIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICAvLyBUaGFua3MgdG8gUmljaGFyZCBIYXJyaXMgZm9yIGhpcyBoZWxwIHJlZmluaW5nIHRoaXMgZm9ybXVsYQorICAgICAgICAgICAgYXV0byBsaHNfdiA9IGRvdWJsZShsaHMpOworICAgICAgICAgICAgYm9vbCByZWxhdGl2ZU9LID0gc3RkOjpmYWJzKGxoc192IC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fZXBzaWxvbiAqIChyaHMubV9zY2FsZSArIChzdGQ6Om1heCkoc3RkOjpmYWJzKGxoc192KSwgc3RkOjpmYWJzKHJocy5tX3ZhbHVlKSkpOworICAgICAgICAgICAgaWYgKHJlbGF0aXZlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZhYnMobGhzX3YgLSByaHMubV92YWx1ZSkgPCByaHMubV9tYXJnaW47CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIEFwcHJveCBjb25zdCYgbGhzLCBjb25zdCBUJiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggVCBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBkb3VibGUobGhzKSA8IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA8IGRvdWJsZShyaHMpIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBkb3VibGUobGhzKSA+IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA+IGRvdWJsZShyaHMpIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIGVwc2lsb24oIFQgbmV3RXBzaWxvbiApIHsKKyAgICAgICAgICAgIG1fZXBzaWxvbiA9IGRvdWJsZShuZXdFcHNpbG9uKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIEFwcHJveCYgbWFyZ2luKCBUIG5ld01hcmdpbiApIHsKKyAgICAgICAgICAgIG1fbWFyZ2luID0gZG91YmxlKG5ld01hcmdpbik7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIHNjYWxlKCBUIG5ld1NjYWxlICkgeworICAgICAgICAgICAgbV9zY2FsZSA9IGRvdWJsZShuZXdTY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworI2Vsc2UKKworICAgICAgICBBcHByb3ggb3BlcmF0b3IoKSggZG91YmxlIHZhbHVlICkgeworICAgICAgICAgICAgQXBwcm94IGFwcHJveCggdmFsdWUgKTsKKyAgICAgICAgICAgIGFwcHJveC5lcHNpbG9uKCBtX2Vwc2lsb24gKTsKKyAgICAgICAgICAgIGFwcHJveC5tYXJnaW4oIG1fbWFyZ2luICk7CisgICAgICAgICAgICBhcHByb3guc2NhbGUoIG1fc2NhbGUgKTsKKyAgICAgICAgICAgIHJldHVybiBhcHByb3g7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgLy8gVGhhbmtzIHRvIFJpY2hhcmQgSGFycmlzIGZvciBoaXMgaGVscCByZWZpbmluZyB0aGlzIGZvcm11bGEKKyAgICAgICAgICAgIGJvb2wgcmVsYXRpdmVPSyA9IHN0ZDo6ZmFicyggbGhzIC0gcmhzLm1fdmFsdWUgKSA8IHJocy5tX2Vwc2lsb24gKiAocmhzLm1fc2NhbGUgKyAoc3RkOjptYXgpKCBzdGQ6OmZhYnMobGhzKSwgc3RkOjpmYWJzKHJocy5tX3ZhbHVlKSApICk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmVPSykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmFicyhsaHMgLSByaHMubV92YWx1ZSkgPCByaHMubV9tYXJnaW47CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzIDwgcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPCByaHMgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzID4gcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPiByaHMgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgZXBzaWxvbiggZG91YmxlIG5ld0Vwc2lsb24gKSB7CisgICAgICAgICAgICBtX2Vwc2lsb24gPSBuZXdFcHNpbG9uOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQXBwcm94JiBtYXJnaW4oIGRvdWJsZSBuZXdNYXJnaW4gKSB7CisgICAgICAgICAgICBtX21hcmdpbiA9IG5ld01hcmdpbjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgc2NhbGUoIGRvdWJsZSBuZXdTY2FsZSApIHsKKyAgICAgICAgICAgIG1fc2NhbGUgPSBuZXdTY2FsZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICJBcHByb3goICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKCBtX3ZhbHVlICkgPDwgIiApIjsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGRvdWJsZSBtX2Vwc2lsb247CisgICAgICAgIGRvdWJsZSBtX21hcmdpbjsKKyAgICAgICAgZG91YmxlIG1fc2NhbGU7CisgICAgICAgIGRvdWJsZSBtX3ZhbHVlOworICAgIH07Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZzxEZXRhaWw6OkFwcHJveD4oIERldGFpbDo6QXBwcm94IGNvbnN0JiB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9tYXRjaGVyc19zdHJpbmcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUFUQ0hFUlNfU1RSSU5HX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgU3RkU3RyaW5nIHsKKworICAgICAgICBzdHJ1Y3QgQ2FzZWRTdHJpbmcKKyAgICAgICAgeworICAgICAgICAgICAgQ2FzZWRTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFkanVzdFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FzZVNlbnNpdGl2aXR5U3VmZml4KCkgY29uc3Q7CisKKyAgICAgICAgICAgIENhc2VTZW5zaXRpdmU6OkNob2ljZSBtX2Nhc2VTZW5zaXRpdml0eTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fc3RyOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBTdHJpbmdNYXRjaGVyQmFzZSA6IE1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiB7CisgICAgICAgICAgICBTdHJpbmdNYXRjaGVyQmFzZSggc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdGlvbiwgQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKworICAgICAgICAgICAgQ2FzZWRTdHJpbmcgbV9jb21wYXJhdG9yOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV9vcGVyYXRpb247CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEVxdWFsc01hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBFcXVhbHNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBDb250YWluc01hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBDb250YWluc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IFN0YXJ0c1dpdGhNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgU3RhcnRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IEVuZHNXaXRoTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIEVuZHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworCisgICAgfSAvLyBuYW1lc3BhY2UgU3RkU3RyaW5nCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisKKyAgICBTdGRTdHJpbmc6OkVxdWFsc01hdGNoZXIgRXF1YWxzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIgQ29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0cmluZzo6U3RhcnRzV2l0aE1hdGNoZXIgU3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX21hdGNoZXJzX3ZlY3Rvci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NQVRDSEVSU19WRUNUT1JfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBWZWN0b3IgeworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBDb250YWluc0VsZW1lbnRNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VD4sIFQ+IHsKKworICAgICAgICAgICAgQ29udGFpbnNFbGVtZW50TWF0Y2hlcihUIGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvcikge30KKworICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxUPiBjb25zdCAmdikgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQodi5iZWdpbigpLCB2LmVuZCgpLCBtX2NvbXBhcmF0b3IpICE9IHYuZW5kKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJDb250YWluczogIiArIENhdGNoOjp0b1N0cmluZyggbV9jb21wYXJhdG9yICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFQgY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgQ29udGFpbnNNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VD4sIHN0ZDo6dmVjdG9yPFQ+ID4geworCisgICAgICAgICAgICBDb250YWluc01hdGNoZXIoc3RkOjp2ZWN0b3I8VD4gY29uc3QgJmNvbXBhcmF0b3IpIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yICkge30KKworICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxUPiBjb25zdCAmdikgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIC8vICFUQkQ6IHNlZSBub3RlIGluIEVxdWFsc01hdGNoZXIKKyAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yLnNpemUoKSA+IHYuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2NvbXBhcmF0b3Iuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQodi5iZWdpbigpLCB2LmVuZCgpLCBtX2NvbXBhcmF0b3JbaV0pID09IHYuZW5kKCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAiQ29udGFpbnM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgbV9jb21wYXJhdG9yOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBFcXVhbHNNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VD4sIHN0ZDo6dmVjdG9yPFQ+ID4geworCisgICAgICAgICAgICBFcXVhbHNNYXRjaGVyKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAvLyAhVEJEOiBUaGlzIGN1cnJlbnRseSB3b3JrcyBpZiBhbGwgZWxlbWVudHMgY2FuIGJlIGNvbXBhcmVkIHVzaW5nICE9CisgICAgICAgICAgICAgICAgLy8gLSBhIG1vcmUgZ2VuZXJhbCBhcHByb2FjaCB3b3VsZCBiZSB2aWEgYSBjb21wYXJlIHRlbXBsYXRlIHRoYXQgZGVmYXVsdHMKKyAgICAgICAgICAgICAgICAvLyB0byB1c2luZyAhPS4gYnV0IGNvdWxkIGJlIHNwZWNpYWxpc2VkIGZvciwgZS5nLiBzdGQ6OnZlY3RvcjxUPiBldGMKKyAgICAgICAgICAgICAgICAvLyAtIHRoZW4ganVzdCBjYWxsIHRoYXQgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yLnNpemUoKSAhPSB2LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdi5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvcltpXSAhPSB2W2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVxdWFsczogIiArIENhdGNoOjp0b1N0cmluZyggbV9jb21wYXJhdG9yICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgbV9jb21wYXJhdG9yOworICAgICAgICB9OworCisgICAgfSAvLyBuYW1lc3BhY2UgVmVjdG9yCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFZlY3Rvcjo6Q29udGFpbnNNYXRjaGVyPFQ+IENvbnRhaW5zKCBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rvcjo6Q29udGFpbnNNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkNvbnRhaW5zRWxlbWVudE1hdGNoZXI8VD4gVmVjdG9yQ29udGFpbnMoIFQgY29uc3QmIGNvbXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkNvbnRhaW5zRWxlbWVudE1hdGNoZXI8VD4oIGNvbXBhcmF0b3IgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFZlY3Rvcjo6RXF1YWxzTWF0Y2hlcjxUPiBFcXVhbHMoIHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBjb21wYXJhdG9yICkgeworICAgICAgICByZXR1cm4gVmVjdG9yOjpFcXVhbHNNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2ludGVyZmFjZXNfdGFnX2FsaWFzX3JlZ2lzdHJ5LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfVEFHX0FMSUFTX1JFR0lTVFJZX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RhZ19hbGlhcy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFRhZ0FsaWFzIHsKKyAgICAgICAgVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfdGFnLCBTb3VyY2VMaW5lSW5mbyBfbGluZUluZm8gKSA6IHRhZyggX3RhZyApLCBsaW5lSW5mbyggX2xpbmVJbmZvICkge30KKworICAgICAgICBzdGQ6OnN0cmluZyB0YWc7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgIH07CisKKyAgICBzdHJ1Y3QgUmVnaXN0cmFyRm9yVGFnQWxpYXNlcyB7CisgICAgICAgIFJlZ2lzdHJhckZvclRhZ0FsaWFzZXMoIGNoYXIgY29uc3QqIGFsaWFzLCBjaGFyIGNvbnN0KiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX1RBR19BTElBUyggYWxpYXMsIHNwZWMgKSBuYW1lc3BhY2V7IENhdGNoOjpSZWdpc3RyYXJGb3JUYWdBbGlhc2VzIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBBdXRvUmVnaXN0ZXJUYWdBbGlhcyApKCBhbGlhcywgc3BlYywgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfQorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX29wdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX09QVElPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIEFuIG9wdGlvbmFsIHR5cGUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIE9wdGlvbiB7CisgICAgcHVibGljOgorICAgICAgICBPcHRpb24oKSA6IG51bGxhYmxlVmFsdWUoIENBVENIX05VTEwgKSB7fQorICAgICAgICBPcHRpb24oIFQgY29uc3QmIF92YWx1ZSApCisgICAgICAgIDogbnVsbGFibGVWYWx1ZSggbmV3KCBzdG9yYWdlICkgVCggX3ZhbHVlICkgKQorICAgICAgICB7fQorICAgICAgICBPcHRpb24oIE9wdGlvbiBjb25zdCYgX290aGVyICkKKyAgICAgICAgOiBudWxsYWJsZVZhbHVlKCBfb3RoZXIgPyBuZXcoIHN0b3JhZ2UgKSBUKCAqX290aGVyICkgOiBDQVRDSF9OVUxMICkKKyAgICAgICAge30KKworICAgICAgICB+T3B0aW9uKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIE9wdGlvbiYgb3BlcmF0b3I9ICggT3B0aW9uIGNvbnN0JiBfb3RoZXIgKSB7CisgICAgICAgICAgICBpZiggJl9vdGhlciAhPSB0aGlzICkgeworICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYoIF9vdGhlciApCisgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBuZXcoIHN0b3JhZ2UgKSBUKCAqX290aGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgT3B0aW9uJiBvcGVyYXRvciA9ICggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBuZXcoIHN0b3JhZ2UgKSBUKCBfdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggbnVsbGFibGVWYWx1ZSApCisgICAgICAgICAgICAgICAgbnVsbGFibGVWYWx1ZS0+flQoKTsKKyAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBDQVRDSF9OVUxMOworICAgICAgICB9CisKKyAgICAgICAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKm51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgVCBjb25zdCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKm51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIG51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWU7IH0KKworICAgICAgICBUIHZhbHVlT3IoIFQgY29uc3QmIGRlZmF1bHRWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBudWxsYWJsZVZhbHVlID8gKm51bGxhYmxlVmFsdWUgOiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBib29sIHNvbWUoKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlICE9IENBVENIX05VTEw7IH0KKyAgICAgICAgYm9vbCBub25lKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSA9PSBDQVRDSF9OVUxMOyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciAhKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSA9PSBDQVRDSF9OVUxMOyB9CisgICAgICAgIG9wZXJhdG9yIFNhZmVCb29sOjp0eXBlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFNhZmVCb29sOjptYWtlU2FmZSggc29tZSgpICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFQgKm51bGxhYmxlVmFsdWU7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIGNoYXIgc3RvcmFnZVtzaXplb2YoVCldOworCisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgaGVyZSB0byBmb3JjZSBhbGlnbm1lbnQgZm9yIHRoZSBzdG9yYWdlCisgICAgICAgICAgICBsb25nIGRvdWJsZSBkdW1teTE7CisgICAgICAgICAgICB2b2lkICgqZHVtbXkyKSgpOworICAgICAgICAgICAgbG9uZyBkb3VibGUgZHVtbXkzOworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyAgICAgICAgICAgIGxvbmcgbG9uZyBkdW1teTQ7CisjZW5kaWYKKyAgICAgICAgfTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJVGFnQWxpYXNSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklUYWdBbGlhc1JlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgT3B0aW9uPFRhZ0FsaWFzPiBmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXhwYW5kQWxpYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHVuZXhwYW5kZWRUZXN0U3BlYyApIGNvbnN0ID0gMDsKKworICAgICAgICBzdGF0aWMgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldCgpOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyBUaGVzZSBmaWxlcyBhcmUgaW5jbHVkZWQgaGVyZSBzbyB0aGUgc2luZ2xlX2luY2x1ZGUgc2NyaXB0IGRvZXNuJ3QgcHV0IHRoZW0KKy8vIGluIHRoZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkIHNlY3Rpb25zCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfdGVzdF9jYXNlX2luZm8uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX0lORk9fSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElUZXN0Q2FzZTsKKworICAgIHN0cnVjdCBUZXN0Q2FzZUluZm8geworICAgICAgICBlbnVtIFNwZWNpYWxQcm9wZXJ0aWVzeworICAgICAgICAgICAgTm9uZSA9IDAsCisgICAgICAgICAgICBJc0hpZGRlbiA9IDEgPDwgMSwKKyAgICAgICAgICAgIFNob3VsZEZhaWwgPSAxIDw8IDIsCisgICAgICAgICAgICBNYXlGYWlsID0gMSA8PCAzLAorICAgICAgICAgICAgVGhyb3dzID0gMSA8PCA0LAorICAgICAgICAgICAgTm9uUG9ydGFibGUgPSAxIDw8IDUKKyAgICAgICAgfTsKKworICAgICAgICBUZXN0Q2FzZUluZm8oICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiBfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKTsKKworICAgICAgICBUZXN0Q2FzZUluZm8oIFRlc3RDYXNlSW5mbyBjb25zdCYgb3RoZXIgKTsKKworICAgICAgICBmcmllbmQgdm9pZCBzZXRUYWdzKCBUZXN0Q2FzZUluZm8mIHRlc3RDYXNlSW5mbywgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiB0YWdzICk7CisKKyAgICAgICAgYm9vbCBpc0hpZGRlbigpIGNvbnN0OworICAgICAgICBib29sIHRocm93cygpIGNvbnN0OworICAgICAgICBib29sIG9rVG9GYWlsKCkgY29uc3Q7CisgICAgICAgIGJvb2wgZXhwZWN0ZWRUb0ZhaWwoKSBjb25zdDsKKworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBjbGFzc05hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGFnczsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGxjYXNlVGFnczsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnc0FzU3RyaW5nOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICAgICAgU3BlY2lhbFByb3BlcnRpZXMgcHJvcGVydGllczsKKyAgICB9OworCisgICAgY2xhc3MgVGVzdENhc2UgOiBwdWJsaWMgVGVzdENhc2VJbmZvIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgVGVzdENhc2UoIElUZXN0Q2FzZSogdGVzdENhc2UsIFRlc3RDYXNlSW5mbyBjb25zdCYgaW5mbyApOworICAgICAgICBUZXN0Q2FzZSggVGVzdENhc2UgY29uc3QmIG90aGVyICk7CisKKyAgICAgICAgVGVzdENhc2Ugd2l0aE5hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmV3TmFtZSApIGNvbnN0OworCisgICAgICAgIHZvaWQgaW52b2tlKCkgY29uc3Q7CisKKyAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdDsKKworICAgICAgICB2b2lkIHN3YXAoIFRlc3RDYXNlJiBvdGhlciApOworICAgICAgICBib29sIG9wZXJhdG9yID09ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBUZXN0Q2FzZSYgb3BlcmF0b3IgPSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHRyPElUZXN0Q2FzZT4gdGVzdDsKKyAgICB9OworCisgICAgVGVzdENhc2UgbWFrZVRlc3RDYXNlKCAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKworI2lmZGVmIF9fT0JKQ19fCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfb2JqYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX09CSkNfSFBQX0lOQ0xVREVECisKKyNpbXBvcnQgPG9iamMvcnVudGltZS5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBOQi4gQW55IGdlbmVyYWwgY2F0Y2ggaGVhZGVycyBpbmNsdWRlZCBoZXJlIG11c3QgYmUgaW5jbHVkZWQKKy8vIGluIGNhdGNoLmhwcCBmaXJzdCB0byBtYWtlIHN1cmUgdGhleSBhcmUgaW5jbHVkZWQgYnkgdGhlIHNpbmdsZQorLy8gaGVhZGVyIGZvciBub24gb2JqLXVzYWdlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoaXMgcHJvdG9jb2wgaXMgcmVhbGx5IG9ubHkgaGVyZSBmb3IgKHNlbGYpIGRvY3VtZW50aW5nIHB1cnBvc2VzLCBzaW5jZQorLy8gYWxsIGl0cyBtZXRob2RzIGFyZSBvcHRpb25hbC4KK0Bwcm90b2NvbCBPY0ZpeHR1cmUKKworQG9wdGlvbmFsCisKKy0odm9pZCkgc2V0VXA7CistKHZvaWQpIHRlYXJEb3duOworCitAZW5kCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBPY01ldGhvZCA6IHB1YmxpYyBTaGFyZWRJbXBsPElUZXN0Q2FzZT4geworCisgICAgcHVibGljOgorICAgICAgICBPY01ldGhvZCggQ2xhc3MgY2xzLCBTRUwgc2VsICkgOiBtX2NscyggY2xzICksIG1fc2VsKCBzZWwgKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAgICAgICAgICBpZCBvYmogPSBbW21fY2xzIGFsbG9jXSBpbml0XTsKKworICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgQHNlbGVjdG9yKHNldFVwKSAgKTsKKyAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIG1fc2VsICk7CisgICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBAc2VsZWN0b3IodGVhckRvd24pICApOworCisgICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggb2JqICk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIH5PY01ldGhvZCgpIHt9CisKKyAgICAgICAgQ2xhc3MgbV9jbHM7CisgICAgICAgIFNFTCBtX3NlbDsKKyAgICB9OworCisgICAgbmFtZXNwYWNlIERldGFpbHsKKworICAgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0QW5ub3RhdGlvbiggICBDbGFzcyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbm5vdGF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RDYXNlTmFtZSApIHsKKyAgICAgICAgICAgIE5TU3RyaW5nKiBzZWxTdHIgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEZvcm1hdDpAIkNhdGNoXyVzXyVzIiwgYW5ub3RhdGlvbk5hbWUuY19zdHIoKSwgdGVzdENhc2VOYW1lLmNfc3RyKCldOworICAgICAgICAgICAgU0VMIHNlbCA9IE5TU2VsZWN0b3JGcm9tU3RyaW5nKCBzZWxTdHIgKTsKKyAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBzZWxTdHIgKTsKKyAgICAgICAgICAgIGlkIHZhbHVlID0gcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGNscywgc2VsICk7CisgICAgICAgICAgICBpZiggdmFsdWUgKQorICAgICAgICAgICAgICAgIHJldHVybiBbKE5TU3RyaW5nKil2YWx1ZSBVVEY4U3RyaW5nXTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBzaXplX3QgcmVnaXN0ZXJUZXN0TWV0aG9kcygpIHsKKyAgICAgICAgc2l6ZV90IG5vVGVzdE1ldGhvZHMgPSAwOworICAgICAgICBpbnQgbm9DbGFzc2VzID0gb2JqY19nZXRDbGFzc0xpc3QoIENBVENIX05VTEwsIDAgKTsKKworICAgICAgICBDbGFzcyogY2xhc3NlcyA9IChDQVRDSF9VTlNBRkVfVU5SRVRBSU5FRCBDbGFzcyAqKW1hbGxvYyggc2l6ZW9mKENsYXNzKSAqIG5vQ2xhc3Nlcyk7CisgICAgICAgIG9iamNfZ2V0Q2xhc3NMaXN0KCBjbGFzc2VzLCBub0NsYXNzZXMgKTsKKworICAgICAgICBmb3IoIGludCBjID0gMDsgYyA8IG5vQ2xhc3NlczsgYysrICkgeworICAgICAgICAgICAgQ2xhc3MgY2xzID0gY2xhc3Nlc1tjXTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1X2ludCBjb3VudDsKKyAgICAgICAgICAgICAgICBNZXRob2QqIG1ldGhvZHMgPSBjbGFzc19jb3B5TWV0aG9kTGlzdCggY2xzLCAmY291bnQgKTsKKyAgICAgICAgICAgICAgICBmb3IoIHVfaW50IG0gPSAwOyBtIDwgY291bnQgOyBtKysgKSB7CisgICAgICAgICAgICAgICAgICAgIFNFTCBzZWxlY3RvciA9IG1ldGhvZF9nZXROYW1lKG1ldGhvZHNbbV0pOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2ROYW1lID0gc2VsX2dldE5hbWUoc2VsZWN0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggbWV0aG9kTmFtZSwgIkNhdGNoX1Rlc3RDYXNlXyIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3RDYXNlTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyKCAxNSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IERldGFpbDo6Z2V0QW5ub3RhdGlvbiggY2xzLCAiTmFtZSIsIHRlc3RDYXNlTmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzYyA9IERldGFpbDo6Z2V0QW5ub3RhdGlvbiggY2xzLCAiRGVzY3JpcHRpb24iLCB0ZXN0Q2FzZU5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsYXNzTmFtZSA9IGNsYXNzX2dldE5hbWUoIGNscyApOworCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRlc3QoIG1ha2VUZXN0Q2FzZSggbmV3IE9jTWV0aG9kKCBjbHMsIHNlbGVjdG9yICksIGNsYXNzTmFtZSwgbmFtZS5jX3N0cigpLCBkZXNjLmNfc3RyKCksIFNvdXJjZUxpbmVJbmZvKCkgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgbm9UZXN0TWV0aG9kcysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUobWV0aG9kcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vVGVzdE1ldGhvZHM7CisgICAgfQorCisgICAgbmFtZXNwYWNlIE1hdGNoZXJzIHsKKyAgICAgICAgbmFtZXNwYWNlIEltcGwgeworICAgICAgICBuYW1lc3BhY2UgTlNTdHJpbmdNYXRjaGVycyB7CisKKyAgICAgICAgICAgIHN0cnVjdCBTdHJpbmdIb2xkZXIgOiBNYXRjaGVyQmFzZTxOU1N0cmluZyo+eworICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlciggTlNTdHJpbmcqIHN1YnN0ciApIDogbV9zdWJzdHIoIFtzdWJzdHIgY29weV0gKXt9CisgICAgICAgICAgICAgICAgU3RyaW5nSG9sZGVyKCBTdHJpbmdIb2xkZXIgY29uc3QmIG90aGVyICkgOiBtX3N1YnN0ciggW290aGVyLm1fc3Vic3RyIGNvcHldICl7fQorICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJjU2FmZVJlbGVhc2UoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTlNTdHJpbmcqIG1fc3Vic3RyOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IEVxdWFscyA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgRXF1YWxzKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgaXNFcXVhbFRvU3RyaW5nOm1fc3Vic3RyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImVxdWFscyBzdHJpbmc6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IENvbnRhaW5zIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBDb250YWlucyggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIHJhbmdlT2ZTdHJpbmc6bV9zdWJzdHJdLmxvY2F0aW9uICE9IE5TTm90Rm91bmQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb250YWlucyBzdHJpbmc6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IFN0YXJ0c1dpdGggOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIFN0YXJ0c1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiA9PSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3RhcnRzIHdpdGg6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHN0cnVjdCBFbmRzV2l0aCA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgRW5kc1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiA9PSBbc3RyIGxlbmd0aF0gLSBbbV9zdWJzdHIgbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImVuZHMgd2l0aDogIiArIENhdGNoOjp0b1N0cmluZyggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIH0gLy8gbmFtZXNwYWNlIE5TU3RyaW5nTWF0Y2hlcnMKKyAgICAgICAgfSAvLyBuYW1lc3BhY2UgSW1wbAorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFcXVhbHMKKyAgICAgICAgICAgIEVxdWFscyggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RXF1YWxzKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpDb250YWlucworICAgICAgICAgICAgQ29udGFpbnMoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkNvbnRhaW5zKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpTdGFydHNXaXRoCisgICAgICAgICAgICBTdGFydHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpTdGFydHNXaXRoKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFbmRzV2l0aAorICAgICAgICAgICAgRW5kc1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVuZHNXaXRoKCBzdWJzdHIgKTsgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKKworICAgIHVzaW5nIG5hbWVzcGFjZSBNYXRjaGVyczsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBPQ19URVNUX0NBU0UoIG5hbWUsIGRlc2MgKVwKKysoTlNTdHJpbmcqKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ2F0Y2hfTmFtZV90ZXN0ICkgXAore1wKK3JldHVybiBAIG5hbWU7IFwKK31cCisrKE5TU3RyaW5nKikgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX0Rlc2NyaXB0aW9uX3Rlc3QgKSBcCit7IFwKK3JldHVybiBAIGRlc2M7IFwKK30gXAorLSh2b2lkKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ2F0Y2hfVGVzdENhc2VfdGVzdCApCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfSU1QTAorCisvLyAhVEJEOiBNb3ZlIHRoZSBsZWFrIGRldGVjdG9yIGNvZGUgaW50byBhIHNlcGFyYXRlIGhlYWRlcgorI2lmZGVmIENBVENIX0NPTkZJR19XSU5ET1dTX0NSVERCRworI2luY2x1ZGUgPGNydGRiZy5oPgorY2xhc3MgTGVha0RldGVjdG9yIHsKK3B1YmxpYzoKKwlMZWFrRGV0ZWN0b3IoKSB7CisJCWludCBmbGFnID0gX0NydFNldERiZ0ZsYWcoX0NSVERCR19SRVBPUlRfRkxBRyk7CisJCWZsYWcgfD0gX0NSVERCR19MRUFLX0NIRUNLX0RGOworCQlmbGFnIHw9IF9DUlREQkdfQUxMT0NfTUVNX0RGOworCQlfQ3J0U2V0RGJnRmxhZyhmbGFnKTsKKwkJX0NydFNldFJlcG9ydE1vZGUoX0NSVF9XQVJOLCBfQ1JUREJHX01PREVfRklMRSB8IF9DUlREQkdfTU9ERV9ERUJVRyk7CisJCV9DcnRTZXRSZXBvcnRGaWxlKF9DUlRfV0FSTiwgX0NSVERCR19GSUxFX1NUREVSUik7CisJCS8vIENoYW5nZSB0aGlzIHRvIGxlYWtpbmcgYWxsb2NhdGlvbidzIG51bWJlciB0byBicmVhayB0aGVyZQorCQlfQ3J0U2V0QnJlYWtBbGxvYygtMSk7CisJfQorfTsKKyNlbHNlCitjbGFzcyBMZWFrRGV0ZWN0b3Ige307CisjZW5kaWYKKworTGVha0RldGVjdG9yIGxlYWtEZXRlY3RvcjsKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTVBMX0hQUF9JTkNMVURFRAorCisvLyBDb2xsZWN0IGFsbCB0aGUgaW1wbGVtZW50YXRpb24gZmlsZXMgdG9nZXRoZXIgaGVyZQorLy8gVGhlc2UgYXJlIHRoZSBlcXVpdmFsZW50IG9mIHdoYXQgd291bGQgdXN1YWxseSBiZSBjcHAgZmlsZXMKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3dlYWstdnRhYmxlcyIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vY2F0Y2hfc2Vzc2lvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JVTk5FUl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2NvbW1hbmRsaW5lLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTUFORExJTkVfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb25maWcuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05GSUdfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X3NwZWNfcGFyc2VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9TUEVDX1BBUlNFUl9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9zcGVjLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9TUEVDX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF93aWxkY2FyZF9wYXR0ZXJuLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfV0lMRENBUkRfUEFUVEVSTl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgY2xhc3MgV2lsZGNhcmRQYXR0ZXJuIHsKKyAgICAgICAgZW51bSBXaWxkY2FyZFBvc2l0aW9uIHsKKyAgICAgICAgICAgIE5vV2lsZGNhcmQgPSAwLAorICAgICAgICAgICAgV2lsZGNhcmRBdFN0YXJ0ID0gMSwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRFbmQgPSAyLAorICAgICAgICAgICAgV2lsZGNhcmRBdEJvdGhFbmRzID0gV2lsZGNhcmRBdFN0YXJ0IHwgV2lsZGNhcmRBdEVuZAorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIFdpbGRjYXJkUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIHBhdHRlcm4sIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKQorICAgICAgICA6ICAgbV9jYXNlU2Vuc2l0aXZpdHkoIGNhc2VTZW5zaXRpdml0eSApLAorICAgICAgICAgICAgbV93aWxkY2FyZCggTm9XaWxkY2FyZCApLAorICAgICAgICAgICAgbV9wYXR0ZXJuKCBhZGp1c3RDYXNlKCBwYXR0ZXJuICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggbV9wYXR0ZXJuLCAnKicgKSApIHsKKyAgICAgICAgICAgICAgICBtX3BhdHRlcm4gPSBtX3BhdHRlcm4uc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgbV93aWxkY2FyZCA9IFdpbGRjYXJkQXRTdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBlbmRzV2l0aCggbV9wYXR0ZXJuLCAnKicgKSApIHsKKyAgICAgICAgICAgICAgICBtX3BhdHRlcm4gPSBtX3BhdHRlcm4uc3Vic3RyKCAwLCBtX3BhdHRlcm4uc2l6ZSgpLTEgKTsKKyAgICAgICAgICAgICAgICBtX3dpbGRjYXJkID0gc3RhdGljX2Nhc3Q8V2lsZGNhcmRQb3NpdGlvbj4oIG1fd2lsZGNhcmQgfCBXaWxkY2FyZEF0RW5kICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+V2lsZGNhcmRQYXR0ZXJuKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgc3dpdGNoKCBtX3dpbGRjYXJkICkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9XaWxkY2FyZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcGF0dGVybiA9PSBhZGp1c3RDYXNlKCBzdHIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRTdGFydDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZHNXaXRoKCBhZGp1c3RDYXNlKCBzdHIgKSwgbV9wYXR0ZXJuICk7CisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0RW5kOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRzV2l0aCggYWRqdXN0Q2FzZSggc3RyICksIG1fcGF0dGVybiApOworICAgICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdEJvdGhFbmRzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnMoIGFkanVzdENhc2UoIHN0ciApLCBtX3BhdHRlcm4gKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VucmVhY2hhYmxlLWNvZGUiCisjZW5kaWYKKyAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmtub3duIGVudW0iICk7CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIGFkanVzdENhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8gPyB0b0xvd2VyKCBzdHIgKSA6IHN0cjsKKyAgICAgICAgfQorICAgICAgICBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgbV9jYXNlU2Vuc2l0aXZpdHk7CisgICAgICAgIFdpbGRjYXJkUG9zaXRpb24gbV93aWxkY2FyZDsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9wYXR0ZXJuOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWMgeworICAgICAgICBzdHJ1Y3QgUGF0dGVybiA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgICAgICB2aXJ0dWFsIH5QYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKyAgICAgICAgY2xhc3MgTmFtZVBhdHRlcm4gOiBwdWJsaWMgUGF0dGVybiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIE5hbWVQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApCisgICAgICAgICAgICA6IG1fd2lsZGNhcmRQYXR0ZXJuKCB0b0xvd2VyKCBuYW1lICksIENhc2VTZW5zaXRpdmU6Ok5vICkKKyAgICAgICAgICAgIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5OYW1lUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fd2lsZGNhcmRQYXR0ZXJuLm1hdGNoZXMoIHRvTG93ZXIoIHRlc3RDYXNlLm5hbWUgKSApOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgV2lsZGNhcmRQYXR0ZXJuIG1fd2lsZGNhcmRQYXR0ZXJuOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFRhZ1BhdHRlcm4gOiBwdWJsaWMgUGF0dGVybiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFRhZ1BhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSA6IG1fdGFnKCB0b0xvd2VyKCB0YWcgKSApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5UYWdQYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdENhc2UubGNhc2VUYWdzLmZpbmQoIG1fdGFnICkgIT0gdGVzdENhc2UubGNhc2VUYWdzLmVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV90YWc7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgRXhjbHVkZWRQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBFeGNsdWRlZFBhdHRlcm4oIFB0cjxQYXR0ZXJuPiBjb25zdCYgdW5kZXJseWluZ1BhdHRlcm4gKSA6IG1fdW5kZXJseWluZ1BhdHRlcm4oIHVuZGVybHlpbmdQYXR0ZXJuICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgfkV4Y2x1ZGVkUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7IHJldHVybiAhbV91bmRlcmx5aW5nUGF0dGVybi0+bWF0Y2hlcyggdGVzdENhc2UgKTsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgUHRyPFBhdHRlcm4+IG1fdW5kZXJseWluZ1BhdHRlcm47CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEZpbHRlciB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8UGF0dGVybj4gPiBtX3BhdHRlcm5zOworCisgICAgICAgICAgICBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgLy8gQWxsIHBhdHRlcm5zIGluIGEgZmlsdGVyIG11c3QgbWF0Y2ggZm9yIHRoZSBmaWx0ZXIgdG8gYmUgYSBtYXRjaAorICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8UHRyPFBhdHRlcm4+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wYXR0ZXJucy5iZWdpbigpLCBpdEVuZCA9IG1fcGF0dGVybnMuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggISgqaXQpLT5tYXRjaGVzKCB0ZXN0Q2FzZSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzRmlsdGVycygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhbV9maWx0ZXJzLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgLy8gQSBUZXN0U3BlYyBtYXRjaGVzIGlmIGFueSBmaWx0ZXIgbWF0Y2hlcworICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxGaWx0ZXI+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZmlsdGVycy5iZWdpbigpLCBpdEVuZCA9IG1fZmlsdGVycy5lbmQoKTsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgIGlmKCBpdC0+bWF0Y2hlcyggdGVzdENhc2UgKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxGaWx0ZXI+IG1fZmlsdGVyczsKKworICAgICAgICBmcmllbmQgY2xhc3MgVGVzdFNwZWNQYXJzZXI7CisgICAgfTsKK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0U3BlY1BhcnNlciB7CisgICAgICAgIGVudW0gTW9kZXsgTm9uZSwgTmFtZSwgUXVvdGVkTmFtZSwgVGFnLCBFc2NhcGVkTmFtZSB9OworICAgICAgICBNb2RlIG1fbW9kZTsKKyAgICAgICAgYm9vbCBtX2V4Y2x1c2lvbjsKKyAgICAgICAgc3RkOjpzaXplX3QgbV9zdGFydCwgbV9wb3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fYXJnOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gbV9lc2NhcGVDaGFyczsKKyAgICAgICAgVGVzdFNwZWM6OkZpbHRlciBtX2N1cnJlbnRGaWx0ZXI7CisgICAgICAgIFRlc3RTcGVjIG1fdGVzdFNwZWM7CisgICAgICAgIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0KiBtX3RhZ0FsaWFzZXM7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgdGFnQWxpYXNlcyApIDogbV90YWdBbGlhc2VzKCAmdGFnQWxpYXNlcyApIHt9CisKKyAgICAgICAgVGVzdFNwZWNQYXJzZXImIHBhcnNlKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnICkgeworICAgICAgICAgICAgbV9tb2RlID0gTm9uZTsKKyAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gZmFsc2U7CisgICAgICAgICAgICBtX3N0YXJ0ID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgICAgICBtX2FyZyA9IG1fdGFnQWxpYXNlcy0+ZXhwYW5kQWxpYXNlcyggYXJnICk7CisgICAgICAgICAgICBtX2VzY2FwZUNoYXJzLmNsZWFyKCk7CisgICAgICAgICAgICBmb3IoIG1fcG9zID0gMDsgbV9wb3MgPCBtX2FyZy5zaXplKCk7ICsrbV9wb3MgKQorICAgICAgICAgICAgICAgIHZpc2l0Q2hhciggbV9hcmdbbV9wb3NdICk7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5hbWUgKQorICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjKCkgeworICAgICAgICAgICAgYWRkRmlsdGVyKCk7CisgICAgICAgICAgICByZXR1cm4gbV90ZXN0U3BlYzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdmlzaXRDaGFyKCBjaGFyIGMgKSB7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5vbmUgKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgIGNhc2UgJyAnOiByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSAnfic6IG1fZXhjbHVzaW9uID0gdHJ1ZTsgcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ1snOiByZXR1cm4gc3RhcnROZXdNb2RlKCBUYWcsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICBjYXNlICciJzogcmV0dXJuIHN0YXJ0TmV3TW9kZSggUXVvdGVkTmFtZSwgKyttX3BvcyApOworICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzogcmV0dXJuIGVzY2FwZSgpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHN0YXJ0TmV3TW9kZSggTmFtZSwgbV9wb3MgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOYW1lICkgeworICAgICAgICAgICAgICAgIGlmKCBjID09ICcsJyApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEZpbHRlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdbJyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN1YlN0cmluZygpID09ICJleGNsdWRlOiIgKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9leGNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnROZXdNb2RlKCBUYWcsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnXFwnICkKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBtX21vZGUgPT0gRXNjYXBlZE5hbWUgKQorICAgICAgICAgICAgICAgIG1fbW9kZSA9IE5hbWU7CisgICAgICAgICAgICBlbHNlIGlmKCBtX21vZGUgPT0gUXVvdGVkTmFtZSAmJiBjID09ICciJyApCisgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICBlbHNlIGlmKCBtX21vZGUgPT0gVGFnICYmIGMgPT0gJ10nICkKKyAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpUYWdQYXR0ZXJuPigpOworICAgICAgICB9CisgICAgICAgIHZvaWQgc3RhcnROZXdNb2RlKCBNb2RlIG1vZGUsIHN0ZDo6c2l6ZV90IHN0YXJ0ICkgeworICAgICAgICAgICAgbV9tb2RlID0gbW9kZTsKKyAgICAgICAgICAgIG1fc3RhcnQgPSBzdGFydDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGVzY2FwZSgpIHsKKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTm9uZSApCisgICAgICAgICAgICAgICAgbV9zdGFydCA9IG1fcG9zOworICAgICAgICAgICAgbV9tb2RlID0gRXNjYXBlZE5hbWU7CisgICAgICAgICAgICBtX2VzY2FwZUNoYXJzLnB1c2hfYmFjayggbV9wb3MgKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBzdWJTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtX2FyZy5zdWJzdHIoIG1fc3RhcnQsIG1fcG9zIC0gbV9zdGFydCApOyB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgYWRkUGF0dGVybigpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRva2VuID0gc3ViU3RyaW5nKCk7CisgICAgICAgICAgICBmb3IoIHNpemVfdCBpID0gMDsgaSA8IG1fZXNjYXBlQ2hhcnMuc2l6ZSgpOyArK2kgKQorICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKCAwLCBtX2VzY2FwZUNoYXJzW2ldLW1fc3RhcnQtaSApICsgdG9rZW4uc3Vic3RyKCBtX2VzY2FwZUNoYXJzW2ldLW1fc3RhcnQtaSsxICk7CisgICAgICAgICAgICBtX2VzY2FwZUNoYXJzLmNsZWFyKCk7CisgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggdG9rZW4sICJleGNsdWRlOiIgKSApIHsKKyAgICAgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoIDggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhdG9rZW4uZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBQdHI8VGVzdFNwZWM6OlBhdHRlcm4+IHBhdHRlcm4gPSBuZXcgVCggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICBpZiggbV9leGNsdXNpb24gKQorICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gbmV3IFRlc3RTcGVjOjpFeGNsdWRlZFBhdHRlcm4oIHBhdHRlcm4gKTsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRGaWx0ZXIubV9wYXR0ZXJucy5wdXNoX2JhY2soIHBhdHRlcm4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gZmFsc2U7CisgICAgICAgICAgICBtX21vZGUgPSBOb25lOworICAgICAgICB9CisgICAgICAgIHZvaWQgYWRkRmlsdGVyKCkgeworICAgICAgICAgICAgaWYoICFtX2N1cnJlbnRGaWx0ZXIubV9wYXR0ZXJucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fdGVzdFNwZWMubV9maWx0ZXJzLnB1c2hfYmFjayggbV9jdXJyZW50RmlsdGVyICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50RmlsdGVyID0gVGVzdFNwZWM6OkZpbHRlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBpbmxpbmUgVGVzdFNwZWMgcGFyc2VUZXN0U3BlYyggc3RkOjpzdHJpbmcgY29uc3QmIGFyZyApIHsKKyAgICAgICAgcmV0dXJuIFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggYXJnICkudGVzdFNwZWMoKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19jb25maWcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19DT05GSUdfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgVmVyYm9zaXR5IHsgZW51bSBMZXZlbCB7CisgICAgICAgIE5vT3V0cHV0ID0gMCwKKyAgICAgICAgUXVpZXQsCisgICAgICAgIE5vcm1hbAorICAgIH07IH07CisKKyAgICBzdHJ1Y3QgV2FybkFib3V0IHsgZW51bSBXaGF0IHsKKyAgICAgICAgTm90aGluZyA9IDB4MDAsCisgICAgICAgIE5vQXNzZXJ0aW9ucyA9IDB4MDEKKyAgICB9OyB9OworCisgICAgc3RydWN0IFNob3dEdXJhdGlvbnMgeyBlbnVtIE9yTm90IHsKKyAgICAgICAgRGVmYXVsdEZvclJlcG9ydGVyLAorICAgICAgICBBbHdheXMsCisgICAgICAgIE5ldmVyCisgICAgfTsgfTsKKyAgICBzdHJ1Y3QgUnVuVGVzdHMgeyBlbnVtIEluV2hhdE9yZGVyIHsKKyAgICAgICAgSW5EZWNsYXJhdGlvbk9yZGVyLAorICAgICAgICBJbkxleGljb2dyYXBoaWNhbE9yZGVyLAorICAgICAgICBJblJhbmRvbU9yZGVyCisgICAgfTsgfTsKKyAgICBzdHJ1Y3QgVXNlQ29sb3VyIHsgZW51bSBZZXNPck5vIHsKKyAgICAgICAgQXV0bywKKyAgICAgICAgWWVzLAorICAgICAgICBObworICAgIH07IH07CisKKyAgICBjbGFzcyBUZXN0U3BlYzsKKworICAgIHN0cnVjdCBJQ29uZmlnIDogSVNoYXJlZCB7CisKKyAgICAgICAgdmlydHVhbCB+SUNvbmZpZygpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBhbGxvd1Rocm93cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBuYW1lKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHdhcm5BYm91dE1pc3NpbmdBc3NlcnRpb25zKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGludCBhYm9ydEFmdGVyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvd0ludmlzaWJsZXMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgU2hvd0R1cmF0aW9uczo6T3JOb3Qgc2hvd0R1cmF0aW9ucygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgUnVuVGVzdHM6OkluV2hhdE9yZGVyIHJ1bk9yZGVyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCBybmdTZWVkKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRTZWN0aW9uc1RvUnVuKCkgY29uc3QgPSAwOworCisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TVFJFQU1fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc3RyZWFtYnVmLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NUUkVBTUJVRl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBTdHJlYW1CdWZCYXNlIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflN0cmVhbUJ1ZkJhc2UoKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGQ6Om9zdHJlYW0mIGNvdXQoKTsKKyAgICBzdGQ6Om9zdHJlYW0mIGNlcnIoKTsKKworICAgIHN0cnVjdCBJU3RyZWFtIHsKKyAgICAgICAgdmlydHVhbCB+SVN0cmVhbSgpIENBVENIX05PRVhDRVBUOworICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBjbGFzcyBGaWxlU3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBtdXRhYmxlIHN0ZDo6b2ZzdHJlYW0gbV9vZnM7CisgICAgcHVibGljOgorICAgICAgICBGaWxlU3RyZWFtKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZW5hbWUgKTsKKyAgICAgICAgdmlydHVhbCB+RmlsZVN0cmVhbSgpIENBVENIX05PRVhDRVBUOworICAgIHB1YmxpYzogLy8gSVN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgfTsKKworICAgIGNsYXNzIENvdXRTdHJlYW0gOiBwdWJsaWMgSVN0cmVhbSB7CisgICAgICAgIG11dGFibGUgc3RkOjpvc3RyZWFtIG1fb3M7CisgICAgcHVibGljOgorICAgICAgICBDb3V0U3RyZWFtKCk7CisgICAgICAgIHZpcnR1YWwgfkNvdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKworICAgIHB1YmxpYzogLy8gSVN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgfTsKKworICAgIGNsYXNzIERlYnVnT3V0U3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBDQVRDSF9BVVRPX1BUUiggU3RyZWFtQnVmQmFzZSApIG1fc3RyZWFtQnVmOworICAgICAgICBtdXRhYmxlIHN0ZDo6b3N0cmVhbSBtX29zOworICAgIHB1YmxpYzoKKyAgICAgICAgRGVidWdPdXRTdHJlYW0oKTsKKyAgICAgICAgdmlydHVhbCB+RGVidWdPdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKworICAgIHB1YmxpYzogLy8gSVN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgfTsKK30KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2lmbmRlZiBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCA4MAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29uZmlnRGF0YSB7CisKKyAgICAgICAgQ29uZmlnRGF0YSgpCisgICAgICAgIDogICBsaXN0VGVzdHMoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0VGFncyggZmFsc2UgKSwKKyAgICAgICAgICAgIGxpc3RSZXBvcnRlcnMoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0VGVzdE5hbWVzT25seSggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dTdWNjZXNzZnVsVGVzdHMoIGZhbHNlICksCisgICAgICAgICAgICBzaG91bGREZWJ1Z0JyZWFrKCBmYWxzZSApLAorICAgICAgICAgICAgbm9UaHJvdyggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dIZWxwKCBmYWxzZSApLAorICAgICAgICAgICAgc2hvd0ludmlzaWJsZXMoIGZhbHNlICksCisgICAgICAgICAgICBmaWxlbmFtZXNBc1RhZ3MoIGZhbHNlICksCisgICAgICAgICAgICBhYm9ydEFmdGVyKCAtMSApLAorICAgICAgICAgICAgcm5nU2VlZCggMCApLAorICAgICAgICAgICAgdmVyYm9zaXR5KCBWZXJib3NpdHk6Ok5vcm1hbCApLAorICAgICAgICAgICAgd2FybmluZ3MoIFdhcm5BYm91dDo6Tm90aGluZyApLAorICAgICAgICAgICAgc2hvd0R1cmF0aW9ucyggU2hvd0R1cmF0aW9uczo6RGVmYXVsdEZvclJlcG9ydGVyICksCisgICAgICAgICAgICBydW5PcmRlciggUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlciApLAorICAgICAgICAgICAgdXNlQ29sb3VyKCBVc2VDb2xvdXI6OkF1dG8gKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgbGlzdFRlc3RzOworICAgICAgICBib29sIGxpc3RUYWdzOworICAgICAgICBib29sIGxpc3RSZXBvcnRlcnM7CisgICAgICAgIGJvb2wgbGlzdFRlc3ROYW1lc09ubHk7CisKKyAgICAgICAgYm9vbCBzaG93U3VjY2Vzc2Z1bFRlc3RzOworICAgICAgICBib29sIHNob3VsZERlYnVnQnJlYWs7CisgICAgICAgIGJvb2wgbm9UaHJvdzsKKyAgICAgICAgYm9vbCBzaG93SGVscDsKKyAgICAgICAgYm9vbCBzaG93SW52aXNpYmxlczsKKyAgICAgICAgYm9vbCBmaWxlbmFtZXNBc1RhZ3M7CisKKyAgICAgICAgaW50IGFib3J0QWZ0ZXI7CisgICAgICAgIHVuc2lnbmVkIGludCBybmdTZWVkOworCisgICAgICAgIFZlcmJvc2l0eTo6TGV2ZWwgdmVyYm9zaXR5OworICAgICAgICBXYXJuQWJvdXQ6OldoYXQgd2FybmluZ3M7CisgICAgICAgIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnM7CisgICAgICAgIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcjsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cjsKKworICAgICAgICBzdGQ6OnN0cmluZyBvdXRwdXRGaWxlbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcHJvY2Vzc05hbWU7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcG9ydGVyTmFtZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0c09yVGFnczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNlY3Rpb25zVG9SdW47CisgICAgfTsKKworICAgIGNsYXNzIENvbmZpZyA6IHB1YmxpYyBTaGFyZWRJbXBsPElDb25maWc+IHsKKyAgICBwcml2YXRlOgorICAgICAgICBDb25maWcoIENvbmZpZyBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgQ29uZmlnJiBvcGVyYXRvciA9ICggQ29uZmlnIGNvbnN0JiBvdGhlciApOworICAgICAgICB2aXJ0dWFsIHZvaWQgZHVtbXkoKTsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ29uZmlnKCkKKyAgICAgICAge30KKworICAgICAgICBDb25maWcoIENvbmZpZ0RhdGEgY29uc3QmIGRhdGEgKQorICAgICAgICA6ICAgbV9kYXRhKCBkYXRhICksCisgICAgICAgICAgICBtX3N0cmVhbSggb3BlblN0cmVhbSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFkYXRhLnRlc3RzT3JUYWdzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgVGVzdFNwZWNQYXJzZXIgcGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKTsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgZGF0YS50ZXN0c09yVGFncy5zaXplKCk7ICsraSApCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZSggZGF0YS50ZXN0c09yVGFnc1tpXSApOworICAgICAgICAgICAgICAgIG1fdGVzdFNwZWMgPSBwYXJzZXIudGVzdFNwZWMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkNvbmZpZygpIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGdldEZpbGVuYW1lKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSA7CisgICAgICAgIH0KKworICAgICAgICBib29sIGxpc3RUZXN0cygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGVzdHM7IH0KKyAgICAgICAgYm9vbCBsaXN0VGVzdE5hbWVzT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGVzdE5hbWVzT25seTsgfQorICAgICAgICBib29sIGxpc3RUYWdzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmxpc3RUYWdzOyB9CisgICAgICAgIGJvb2wgbGlzdFJlcG9ydGVycygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0UmVwb3J0ZXJzOyB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0UHJvY2Vzc05hbWUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEucHJvY2Vzc05hbWU7IH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFJlcG9ydGVyTmFtZXMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEucmVwb3J0ZXJOYW1lczsgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFNlY3Rpb25zVG9SdW4oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2VjdGlvbnNUb1J1bjsgfQorCisgICAgICAgIHZpcnR1YWwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV90ZXN0U3BlYzsgfQorCisgICAgICAgIGJvb2wgc2hvd0hlbHAoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuc2hvd0hlbHA7IH0KKworICAgICAgICAvLyBJQ29uZmlnIGludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICAgICAgeyByZXR1cm4gIW1fZGF0YS5ub1Rocm93OyB9CisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICB7IHJldHVybiBtX3N0cmVhbS0+c3RyZWFtKCk7IH0KKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBuYW1lKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5uYW1lLmVtcHR5KCkgPyBtX2RhdGEucHJvY2Vzc05hbWUgOiBtX2RhdGEubmFtZTsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgeyByZXR1cm4gbV9kYXRhLnNob3dTdWNjZXNzZnVsVGVzdHM7IH0KKyAgICAgICAgdmlydHVhbCBib29sIHdhcm5BYm91dE1pc3NpbmdBc3NlcnRpb25zKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgIHsgcmV0dXJuIG1fZGF0YS53YXJuaW5ncyAmIFdhcm5BYm91dDo6Tm9Bc3NlcnRpb25zOyB9CisgICAgICAgIHZpcnR1YWwgU2hvd0R1cmF0aW9uczo6T3JOb3Qgc2hvd0R1cmF0aW9ucygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG93RHVyYXRpb25zOyB9CisgICAgICAgIHZpcnR1YWwgUnVuVGVzdHM6OkluV2hhdE9yZGVyIHJ1bk9yZGVyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICB7IHJldHVybiBtX2RhdGEucnVuT3JkZXI7IH0KKyAgICAgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5ybmdTZWVkOyB9CisgICAgICAgIHZpcnR1YWwgVXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cigpIGNvbnN0IENBVENIX09WRVJSSURFICAgICB7IHJldHVybiBtX2RhdGEudXNlQ29sb3VyOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNob3VsZERlYnVnQnJlYWs7IH0KKyAgICAgICAgdmlydHVhbCBpbnQgYWJvcnRBZnRlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5hYm9ydEFmdGVyOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG93SW52aXNpYmxlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG93SW52aXNpYmxlczsgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICBJU3RyZWFtIGNvbnN0KiBvcGVuU3RyZWFtKCkgeworICAgICAgICAgICAgaWYoIG1fZGF0YS5vdXRwdXRGaWxlbmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1fZGF0YS5vdXRwdXRGaWxlbmFtZVswXSA9PSAnJScgKSB7CisgICAgICAgICAgICAgICAgaWYoIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSA9PSAiJWRlYnVnIiApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVidWdPdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCAiVW5yZWNvZ25pc2VkIHN0cmVhbTogIiArIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVN0cmVhbSggbV9kYXRhLm91dHB1dEZpbGVuYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnRGF0YSBtX2RhdGE7CisKKyAgICAgICAgQ0FUQ0hfQVVUT19QVFIoIElTdHJlYW0gY29uc3QgKSBtX3N0cmVhbTsKKyAgICAgICAgVGVzdFNwZWMgbV90ZXN0U3BlYzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NsYXJhLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NMQVJBX0hfSU5DTFVERUQKKworLy8gVXNlIENhdGNoJ3MgdmFsdWUgZm9yIGNvbnNvbGUgd2lkdGggKHN0b3JlIENsYXJhJ3Mgb2ZmIHRvIHRoZSBzaWRlLCBpZiBwcmVzZW50KQorI2lmZGVmIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZGVmaW5lIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyN1bmRlZiBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2VuZGlmCisjZGVmaW5lIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRICisKKy8vIERlY2xhcmUgQ2xhcmEgaW5zaWRlIHRoZSBDYXRjaCBuYW1lc3BhY2UKKyNkZWZpbmUgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFIG5hbWVzcGFjZSBDYXRjaCB7CisvLyAjaW5jbHVkZWQgZnJvbTogLi4vZXh0ZXJuYWwvY2xhcmEuaAorCisvLyBWZXJzaW9uIDAuMC4yLjQKKworLy8gT25seSB1c2UgaGVhZGVyIGd1YXJkIGlmIHdlIGFyZSBub3QgdXNpbmcgYW4gb3V0ZXIgbmFtZXNwYWNlCisjaWYgIWRlZmluZWQoVFdPQkxVRUNVQkVTX0NMQVJBX0hfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFKQorCisjaWZuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0xBUkFfSF9JTkNMVURFRAorI2RlZmluZSBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyNkZWZpbmUgU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRQorI2Vsc2UKKyNkZWZpbmUgU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRSB9CisjZW5kaWYKKworI2RlZmluZSBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09QRU5fTkFNRVNQQUNFIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorCisvLyAtLS0tLS0tLS0tLSAjaW5jbHVkZWQgZnJvbSB0YmNfdGV4dF9mb3JtYXQuaCAtLS0tLS0tLS0tLQorCisvLyBPbmx5IHVzZSBoZWFkZXIgZ3VhcmQgaWYgd2UgYXJlIG5vdCB1c2luZyBhbiBvdXRlciBuYW1lc3BhY2UKKyNpZiAhZGVmaW5lZChUQkNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRCkgfHwgZGVmaW5lZChTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSkKKyNpZm5kZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKyNkZWZpbmUgVEJDX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorbmFtZXNwYWNlIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIHsKKyNlbmRpZgorCituYW1lc3BhY2UgVGJjIHsKKworI2lmZGVmIFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgIHN0cnVjdCBUZXh0QXR0cmlidXRlcyB7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgOiAgIGluaXRpYWxJbmRlbnQoIHN0ZDo6c3RyaW5nOjpucG9zICksCisgICAgICAgICAgICBpbmRlbnQoIDAgKSwKKyAgICAgICAgICAgIHdpZHRoKCBjb25zb2xlV2lkdGgtMSApLAorICAgICAgICAgICAgdGFiQ2hhciggJ1x0JyApCisgICAgICAgIHt9CisKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluaXRpYWxJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICB7IGluaXRpYWxJbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgIHsgaW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFdpZHRoKCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgICB7IHdpZHRoID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFRhYkNoYXIoIGNoYXIgX3ZhbHVlICkgICAgICAgICAgICAgICB7IHRhYkNoYXIgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGluaXRpYWxJbmRlbnQ7ICAvLyBpbmRlbnQgb2YgZmlyc3QgbGluZSwgb3IgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCBpbmRlbnQ7ICAgICAgICAgLy8gaW5kZW50IG9mIHN1YnNlcXVlbnQgbGluZXMsIG9yIGFsbCBpZiBpbml0aWFsSW5kZW50IGlzIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGg7ICAgICAgICAgIC8vIG1heGltdW0gd2lkdGggb2YgdGV4dCwgaW5jbHVkaW5nIGluZGVudC4gTG9uZ2VyIHRleHQgd2lsbCB3cmFwCisgICAgICAgIGNoYXIgdGFiQ2hhcjsgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGNoYXIgaXMgc2VlbiB0aGUgaW5kZW50IGlzIGNoYW5nZWQgdG8gY3VycmVudCBwb3MKKyAgICB9OworCisgICAgY2xhc3MgVGV4dCB7CisgICAgcHVibGljOgorICAgICAgICBUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ciwgVGV4dEF0dHJpYnV0ZXMgY29uc3QmIF9hdHRyID0gVGV4dEF0dHJpYnV0ZXMoKSApCisgICAgICAgIDogYXR0ciggX2F0dHIgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB3cmFwcGFibGVDaGFycyA9ICIgWyh7LiwvfFxcLSI7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBpbmRlbnQgPSBfYXR0ci5pbml0aWFsSW5kZW50ICE9IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICAgICAgICAgPyBfYXR0ci5pbml0aWFsSW5kZW50CisgICAgICAgICAgICAgICAgOiBfYXR0ci5pbmRlbnQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZW1haW5kZXIgPSBfc3RyOworCisgICAgICAgICAgICB3aGlsZSggIXJlbWFpbmRlci5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCBsaW5lcy5zaXplKCkgPj0gMTAwMCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCAiLi4uIG1lc3NhZ2UgdHJ1bmNhdGVkIGR1ZSB0byBleGNlc3NpdmUgc2l6ZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCB0YWJQb3MgPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCB3aWR0aCA9IChzdGQ6Om1pbikoIHJlbWFpbmRlci5zaXplKCksIF9hdHRyLndpZHRoIC0gaW5kZW50ICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgcG9zID0gcmVtYWluZGVyLmZpbmRfZmlyc3Rfb2YoICdcbicgKTsKKyAgICAgICAgICAgICAgICBpZiggcG9zIDw9IHdpZHRoICkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9zID0gcmVtYWluZGVyLmZpbmRfbGFzdF9vZiggX2F0dHIudGFiQ2hhciwgd2lkdGggKTsKKyAgICAgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgICAgICB0YWJQb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZW1haW5kZXJbd2lkdGhdID09ICdcbicgKQorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLnN1YnN0ciggMCwgdGFiUG9zICkgKyByZW1haW5kZXIuc3Vic3RyKCB0YWJQb3MrMSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCB3aWR0aCA9PSByZW1haW5kZXIuc2l6ZSgpICkgeworICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgd2lkdGggKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggcmVtYWluZGVyW3dpZHRoXSA9PSAnXG4nICkgeworICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgd2lkdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHdpZHRoIDw9IDEgfHwgcmVtYWluZGVyLnNpemUoKSAhPSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWJzdHIoIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gX2F0dHIuaW5kZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gcmVtYWluZGVyLmZpbmRfbGFzdF9vZiggd3JhcHBhYmxlQ2hhcnMsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgcG9zID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZUxpbmUoIGluZGVudCwgcmVtYWluZGVyLCBwb3MgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZW1haW5kZXJbMF0gPT0gJyAnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIuc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgd2lkdGgtMSApOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYmFjaygpICs9ICItIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gX2F0dHIuaW5kZW50OworICAgICAgICAgICAgICAgICAgICBpZiggdGFiUG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWJQb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzcGxpY2VMaW5lKCBzdGQ6OnNpemVfdCBfaW5kZW50LCBzdGQ6OnN0cmluZyYgX3JlbWFpbmRlciwgc3RkOjpzaXplX3QgX3BvcyApIHsKKyAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggc3RkOjpzdHJpbmcoIF9pbmRlbnQsICcgJyApICsgX3JlbWFpbmRlci5zdWJzdHIoIDAsIF9wb3MgKSApOworICAgICAgICAgICAgX3JlbWFpbmRlciA9IF9yZW1haW5kZXIuc3Vic3RyKCBfcG9zICk7CisgICAgICAgIH0KKworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBsaW5lcy5iZWdpbigpOyB9CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmVuZCgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYXN0KCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmFjaygpOyB9CisgICAgICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBsaW5lcy5zaXplKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdG9yW10oIHN0ZDo6c2l6ZV90IF9pbmRleCApIGNvbnN0IHsgcmV0dXJuIGxpbmVzW19pbmRleF07IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICp0aGlzOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgVGV4dCBjb25zdCYgX3RleHQgKSB7CisgICAgICAgICAgICBmb3IoIFRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gX3RleHQuYmVnaW4oKSwgaXRFbmQgPSBfdGV4dC5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gX3RleHQuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgIlxuIjsKKyAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICppdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfc3RyZWFtOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzIGF0dHI7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgVGJjCisKKyNpZmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorfSAvLyBlbmQgb3V0ZXIgbmFtZXNwYWNlCisjZW5kaWYKKworI2VuZGlmIC8vIFRCQ19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisKKy8vIC0tLS0tLS0tLS0tIGVuZCBvZiAjaW5jbHVkZSBmcm9tIHRiY190ZXh0X2Zvcm1hdC5oIC0tLS0tLS0tLS0tCisvLyAuLi4uLi4uLi4uLiBiYWNrIGluIGNsYXJhLmgKKworI3VuZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1BFTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0gI2luY2x1ZGVkIGZyb20gY2xhcmFfY29tcGlsZXJzLmggLS0tLS0tLS0tLS0KKworI2lmbmRlZiBUV09CTFVFQ1VCRVNfQ0xBUkFfQ09NUElMRVJTX0hfSU5DTFVERUQKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisKKy8vIERldGVjdCBhIG51bWJlciBvZiBjb21waWxlciBmZWF0dXJlcyAtIG1vc3RseSBDKysxMS8xNCBjb25mb3JtYW5jZSAtIGJ5IGNvbXBpbGVyCisvLyBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBkZWZpbmVkOgorLy8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSIDogaXMgbnVsbHB0ciBzdXBwb3J0ZWQ/CisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQgOiBpcyBub2V4Y2VwdCBzdXBwb3J0ZWQ/CisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMgOiBUaGUgZGVsZXRlIGFuZCBkZWZhdWx0IGtleXdvcmRzIGZvciBjb21waWxlciBnZW5lcmF0ZWQgbWV0aG9kcworLy8gQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFIDogaXMgb3ZlcnJpZGUgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIgOiBpcyB1bmlxdWVfcHRyIHN1cHBvcnRlZCAob3RoZXJ3aXNlIHVzZSBhdXRvX3B0cikKKworLy8gQ0xBUkFfQ09ORklHX0NQUDExX09SX0dSRUFURVIgOiBJcyBDKysxMSBzdXBwb3J0ZWQ/CisKKy8vIENMQVJBX0NPTkZJR19WQVJJQURJQ19NQUNST1MgOiBhcmUgdmFyaWFkaWMgbWFjcm9zIHN1cHBvcnRlZD8KKworLy8gSW4gZ2VuZXJhbCBlYWNoIG1hY3JvIGhhcyBhIF9OT188ZmVhdHVyZSBuYW1lPiBmb3JtCisvLyAoZS5nLiBDTEFSQV9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgd2hpY2ggZGlzYWJsZXMgdGhlIGZlYXR1cmUuCisvLyBNYW55IGZlYXR1cmVzLCBhdCBwb2ludCBvZiBkZXRlY3Rpb24sIGRlZmluZSBhbiBfSU5URVJOQUxfIG1hY3JvLCBzbyB0aGV5CisvLyBjYW4gYmUgY29tYmluZWQsIGVuLW1hc3MsIHdpdGggdGhlIF9OT18gZm9ybXMgbGF0ZXIuCisKKy8vIEFsbCB0aGUgQysrMTEgZmVhdHVyZXMgY2FuIGJlIGRpc2FibGVkIHdpdGggQ0xBUkFfQ09ORklHX05PX0NQUDExCisKKyNpZmRlZiBfX2NsYW5nX18KKworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X251bGxwdHIpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorCisjZW5kaWYgLy8gX19jbGFuZ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHQ0MKKyNpZmRlZiBfX0dOVUNfXworCisjaWYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2ICYmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworLy8gLSBvdGhlcndpc2UgbW9yZSByZWNlbnQgdmVyc2lvbnMgZGVmaW5lIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKy8vIGFuZCB3aWxsIGdldCBwaWNrZWQgdXAgYmVsb3cKKworI2VuZGlmIC8vIF9fR05VQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWaXN1YWwgQysrCisjaWZkZWYgX01TQ19WRVIKKworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNpZiAoX01TQ19WRVIgPj0gMTkwMCApIC8vIChWQysrIDEzIChWUzIwMTUpKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKworI2VuZGlmIC8vIF9NU0NfVkVSCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDKysgbGFuZ3VhZ2UgZmVhdHVyZSBzdXBwb3J0CisKKy8vIGNhdGNoIGFsbCBzdXBwb3J0IGZvciBDKysxMQorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworI2RlZmluZSBDTEFSQV9DUFAxMV9PUl9HUkVBVEVSCisKKyNpZiAhZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorCisjaWZuZGVmIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorCisjaWZuZGVmIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyNlbmRpZgorI2lmICFkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKy8vIE5vdyBzZXQgdGhlIGFjdHVhbCBkZWZpbmVzIGJhc2VkIG9uIHRoZSBhYm92ZSArIGFueXRoaW5nIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PX05VTExQVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX09WRVJSSURFKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisvLyBub2V4Y2VwdCBzdXBwb3J0OgorI2lmIGRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9OT0VYQ0VQVCkKKyNkZWZpbmUgQ0xBUkFfTk9FWENFUFQgbm9leGNlcHQKKyMgIGRlZmluZSBDTEFSQV9OT0VYQ0VQVF9JUyh4KSBub2V4Y2VwdCh4KQorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfTk9FWENFUFQgdGhyb3coKQorIyAgZGVmaW5lIENMQVJBX05PRVhDRVBUX0lTKHgpCisjZW5kaWYKKworLy8gbnVsbHB0ciBzdXBwb3J0CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX05VTExQVFIKKyNkZWZpbmUgQ0xBUkFfTlVMTCBudWxscHRyCisjZWxzZQorI2RlZmluZSBDTEFSQV9OVUxMIE5VTEwKKyNlbmRpZgorCisvLyBvdmVycmlkZSBzdXBwb3J0CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFCisjZGVmaW5lIENMQVJBX09WRVJSSURFIG92ZXJyaWRlCisjZWxzZQorI2RlZmluZSBDTEFSQV9PVkVSUklERQorI2VuZGlmCisKKy8vIHVuaXF1ZV9wdHIgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICAgZGVmaW5lIENMQVJBX0FVVE9fUFRSKCBUICkgc3RkOjp1bmlxdWVfcHRyPFQ+CisjZWxzZQorIyAgIGRlZmluZSBDTEFSQV9BVVRPX1BUUiggVCApIHN0ZDo6YXV0b19wdHI8VD4KKyNlbmRpZgorCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisKKy8vIC0tLS0tLS0tLS0tIGVuZCBvZiAjaW5jbHVkZSBmcm9tIGNsYXJhX2NvbXBpbGVycy5oIC0tLS0tLS0tLS0tCisvLyAuLi4uLi4uLi4uLiBiYWNrIGluIGNsYXJhLmgKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBDTEFSQV9QTEFURk9STV9XSU5ET1dTCisjZW5kaWYKKworLy8gVXNlIG9wdGlvbmFsIG91dGVyIG5hbWVzcGFjZQorI2lmZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjZW5kaWYKKworbmFtZXNwYWNlIENsYXJhIHsKKworICAgIHN0cnVjdCBVbnBvc2l0aW9uYWxUYWcge307CisKKyAgICBleHRlcm4gVW5wb3NpdGlvbmFsVGFnIF87CisKKyNpZmRlZiBDTEFSQV9DT05GSUdfTUFJTgorICAgIFVucG9zaXRpb25hbFRhZyBfOworI2VuZGlmCisKKyAgICBuYW1lc3BhY2UgRGV0YWlsIHsKKworI2lmZGVmIENMQVJBX0NPTlNPTEVfV0lEVEgKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEg7CisjZWxzZQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSA4MDsKKyNlbmRpZgorCisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBUYmM7CisKKyAgICAgICAgaW5saW5lIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHByZWZpeCApIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuc2l6ZSgpID49IHByZWZpeC5zaXplKCkgJiYgc3RyLnN1YnN0ciggMCwgcHJlZml4LnNpemUoKSApID09IHByZWZpeDsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZnsgdHlwZWRlZiBUIHR5cGU7IH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZjxUJj57IHR5cGVkZWYgVCB0eXBlOyB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWY8VCBjb25zdCY+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmPFQgY29uc3Q+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAgICBzdHJ1Y3QgSXNCb29sICAgICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IElzQm9vbDxib29sPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCYgX3NvdXJjZSwgVCYgX2Rlc3QgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IF9zb3VyY2U7CisgICAgICAgICAgICBzcyA+PiBfZGVzdDsKKyAgICAgICAgICAgIGlmKCBzcy5mYWlsKCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlVuYWJsZSB0byBjb252ZXJ0ICIgKyBfc291cmNlICsgIiB0byBkZXN0aW5hdGlvbiB0eXBlIiApOworICAgICAgICB9CisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCYgX3NvdXJjZSwgc3RkOjpzdHJpbmcmIF9kZXN0ICkgeworICAgICAgICAgICAgX2Rlc3QgPSBfc291cmNlOworICAgICAgICB9CisgICAgICAgIGNoYXIgdG9Mb3dlckNoKGNoYXIgYykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KCBzdGQ6OnRvbG93ZXIoIGMgKSApOworICAgICAgICB9CisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCYgX3NvdXJjZSwgYm9vbCYgX2Rlc3QgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VMQyA9IF9zb3VyY2U7CisgICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybSggc291cmNlTEMuYmVnaW4oKSwgc291cmNlTEMuZW5kKCksIHNvdXJjZUxDLmJlZ2luKCksIHRvTG93ZXJDaCApOworICAgICAgICAgICAgaWYoIHNvdXJjZUxDID09ICJ5IiB8fCBzb3VyY2VMQyA9PSAiMSIgfHwgc291cmNlTEMgPT0gInRydWUiIHx8IHNvdXJjZUxDID09ICJ5ZXMiIHx8IHNvdXJjZUxDID09ICJvbiIgKQorICAgICAgICAgICAgICAgIF9kZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYoIHNvdXJjZUxDID09ICJuIiB8fCBzb3VyY2VMQyA9PSAiMCIgfHwgc291cmNlTEMgPT0gImZhbHNlIiB8fCBzb3VyY2VMQyA9PSAibm8iIHx8IHNvdXJjZUxDID09ICJvZmYiICkKKyAgICAgICAgICAgICAgICBfZGVzdCA9IGZhbHNlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIkV4cGVjdGVkIGEgYm9vbGVhbiB2YWx1ZSBidXQgZGlkIG5vdCByZWNvZ25pc2U6XG4gICciICsgX3NvdXJjZSArICInIiApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICAgICAgc3RydWN0IElBcmdGdW5jdGlvbiB7CisgICAgICAgICAgICB2aXJ0dWFsIH5JQXJnRnVuY3Rpb24oKSB7fQorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uKCkgICAgICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uKCBJQXJnRnVuY3Rpb24gY29uc3QmICkgPSBkZWZhdWx0OworI2VuZGlmCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDb25maWdUJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uKiBjbG9uZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgICAgICBjbGFzcyBCb3VuZEFyZ0Z1bmN0aW9uIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbigpIDogZnVuY3Rpb25PYmooIENMQVJBX05VTEwgKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiggSUFyZ0Z1bmN0aW9uPENvbmZpZ1Q+KiBfZnVuY3Rpb25PYmogKSA6IGZ1bmN0aW9uT2JqKCBfZnVuY3Rpb25PYmogKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiggQm91bmRBcmdGdW5jdGlvbiBjb25zdCYgb3RoZXIgKSA6IGZ1bmN0aW9uT2JqKCBvdGhlci5mdW5jdGlvbk9iaiA/IG90aGVyLmZ1bmN0aW9uT2JqLT5jbG9uZSgpIDogQ0xBUkFfTlVMTCApIHt9CisgICAgICAgICAgICBCb3VuZEFyZ0Z1bmN0aW9uJiBvcGVyYXRvciA9ICggQm91bmRBcmdGdW5jdGlvbiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uPENvbmZpZ1Q+KiBuZXdGdW5jdGlvbk9iaiA9IG90aGVyLmZ1bmN0aW9uT2JqID8gb3RoZXIuZnVuY3Rpb25PYmotPmNsb25lKCkgOiBDTEFSQV9OVUxMOworICAgICAgICAgICAgICAgIGRlbGV0ZSBmdW5jdGlvbk9iajsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbk9iaiA9IG5ld0Z1bmN0aW9uT2JqOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH5Cb3VuZEFyZ0Z1bmN0aW9uKCkgeyBkZWxldGUgZnVuY3Rpb25PYmo7IH0KKworICAgICAgICAgICAgdm9pZCBzZXQoIENvbmZpZ1QmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGZ1bmN0aW9uT2JqLT5zZXQoIGNvbmZpZywgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiBmdW5jdGlvbk9iai0+dGFrZXNBcmcoKTsgfQorCisgICAgICAgICAgICBib29sIGlzU2V0KCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbk9iaiAhPSBDTEFSQV9OVUxMOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uPENvbmZpZ1Q+KiBmdW5jdGlvbk9iajsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICBzdHJ1Y3QgTnVsbEJpbmRlciA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmLCBzdGQ6OnN0cmluZyBjb25zdCYgKSBjb25zdCB7fQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IE51bGxCaW5kZXIoICp0aGlzICk7IH0KKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICBzdHJ1Y3QgQm91bmREYXRhTWVtYmVyIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmREYXRhTWVtYmVyKCBNIEM6OiogX21lbWJlciApIDogbWVtYmVyKCBfbWVtYmVyICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIHAsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHAuKm1lbWJlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gIUlzQm9vbDxNPjo6dmFsdWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZERhdGFNZW1iZXIoICp0aGlzICk7IH0KKyAgICAgICAgICAgIE0gQzo6KiBtZW1iZXI7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHN0cnVjdCBCb3VuZFVuYXJ5TWV0aG9kIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmRVbmFyeU1ldGhvZCggdm9pZCAoQzo6Kl9tZW1iZXIpKCBNICkgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmVtb3ZlQ29uc3RSZWY8TT46OnR5cGUgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIChwLiptZW1iZXIpKCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gIUlzQm9vbDxNPjo6dmFsdWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZFVuYXJ5TWV0aG9kKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkIChDOjoqbWVtYmVyKSggTSApOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICBzdHJ1Y3QgQm91bmROdWxsYXJ5TWV0aG9kIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmROdWxsYXJ5TWV0aG9kKCB2b2lkIChDOjoqX21lbWJlcikoKSApIDogbWVtYmVyKCBfbWVtYmVyICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIHAsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBib29sIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBpZiggdmFsdWUgKQorICAgICAgICAgICAgICAgICAgICAocC4qbWVtYmVyKSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZE51bGxhcnlNZXRob2QoICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKEM6OiptZW1iZXIpKCk7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IEJvdW5kVW5hcnlGdW5jdGlvbiA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kVW5hcnlGdW5jdGlvbiggdm9pZCAoKl9mdW5jdGlvbikoIEMmICkgKSA6IGZ1bmN0aW9uKCBfZnVuY3Rpb24gKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgb2JqLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oIG9iaiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZFVuYXJ5RnVuY3Rpb24oICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikoIEMmICk7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IEJvdW5kQmluYXJ5RnVuY3Rpb24gOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZEJpbmFyeUZ1bmN0aW9uKCB2b2lkICgqX2Z1bmN0aW9uKSggQyYsIFQgKSApIDogZnVuY3Rpb24oIF9mdW5jdGlvbiApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBvYmosIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBSZW1vdmVDb25zdFJlZjxUPjo6dHlwZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgZnVuY3Rpb24oIG9iaiwgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8VD46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRCaW5hcnlGdW5jdGlvbiggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSggQyYsIFQgKTsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIERldGFpbAorCisgICAgaW5saW5lIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzVG9WZWN0b3IoIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3MoIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggYXJnYyApICk7CisgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIGFyZ2MgKTsgKytpICkKKyAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmd2W2ldOworCisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKworICAgIGNsYXNzIFBhcnNlciB7CisgICAgICAgIGVudW0gTW9kZSB7IE5vbmUsIE1heWJlU2hvcnRPcHQsIFNsYXNoT3B0LCBTaG9ydE9wdCwgTG9uZ09wdCwgUG9zaXRpb25hbCB9OworICAgICAgICBNb2RlIG1vZGU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZyb207CisgICAgICAgIGJvb2wgaW5RdW90ZXM7CisgICAgcHVibGljOgorCisgICAgICAgIHN0cnVjdCBUb2tlbiB7CisgICAgICAgICAgICBlbnVtIFR5cGUgeyBQb3NpdGlvbmFsLCBTaG9ydE9wdCwgTG9uZ09wdCB9OworICAgICAgICAgICAgVG9rZW4oIFR5cGUgX3R5cGUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGF0YSApIDogdHlwZSggX3R5cGUgKSwgZGF0YSggX2RhdGEgKSB7fQorICAgICAgICAgICAgVHlwZSB0eXBlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICAgICAgfTsKKworICAgICAgICBQYXJzZXIoKSA6IG1vZGUoIE5vbmUgKSwgZnJvbSggMCApLCBpblF1b3RlcyggZmFsc2UgKXt9CisKKyAgICAgICAgdm9pZCBwYXJzZUludG9Ub2tlbnMoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgYXJncywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBkb3VibGVEYXNoID0gIi0tIjsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDE7IGkgPCBhcmdzLnNpemUoKSAmJiBhcmdzW2ldICE9IGRvdWJsZURhc2g7ICsraSApCisgICAgICAgICAgICAgICAgcGFyc2VJbnRvVG9rZW5zKCBhcmdzW2ldLCB0b2tlbnMpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwYXJzZUludG9Ub2tlbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGFyZy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBhcmdbaV07CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJyInICkKKyAgICAgICAgICAgICAgICAgICAgaW5RdW90ZXMgPSAhaW5RdW90ZXM7CisgICAgICAgICAgICAgICAgbW9kZSA9IGhhbmRsZU1vZGUoIGksIGMsIGFyZywgdG9rZW5zICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb2RlID0gaGFuZGxlTW9kZSggYXJnLnNpemUoKSwgJ1wwJywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZU1vZGUoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYywgc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBzd2l0Y2goIG1vZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb25lOiByZXR1cm4gaGFuZGxlTm9uZSggaSwgYyApOworICAgICAgICAgICAgICAgIGNhc2UgTWF5YmVTaG9ydE9wdDogcmV0dXJuIGhhbmRsZU1heWJlU2hvcnRPcHQoIGksIGMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFNob3J0T3B0OgorICAgICAgICAgICAgICAgIGNhc2UgTG9uZ09wdDoKKyAgICAgICAgICAgICAgICBjYXNlIFNsYXNoT3B0OiByZXR1cm4gaGFuZGxlT3B0KCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgICAgIGNhc2UgUG9zaXRpb25hbDogcmV0dXJuIGhhbmRsZVBvc2l0aW9uYWwoIGksIGMsIGFyZywgdG9rZW5zICk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIlVua25vd24gbW9kZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE1vZGUgaGFuZGxlTm9uZSggc3RkOjpzaXplX3QgaSwgY2hhciBjICkgeworICAgICAgICAgICAgaWYoIGluUXVvdGVzICkgeworICAgICAgICAgICAgICAgIGZyb20gPSBpOworICAgICAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgIGNhc2UgJy0nOiByZXR1cm4gTWF5YmVTaG9ydE9wdDsKKyNpZmRlZiBDTEFSQV9QTEFURk9STV9XSU5ET1dTCisgICAgICAgICAgICAgICAgY2FzZSAnLyc6IGZyb20gPSBpKzE7IHJldHVybiBTbGFzaE9wdDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZyb20gPSBpOyByZXR1cm4gUG9zaXRpb25hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZU1heWJlU2hvcnRPcHQoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYyApIHsKKyAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICctJzogZnJvbSA9IGkrMTsgcmV0dXJuIExvbmdPcHQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogZnJvbSA9IGk7IHJldHVybiBTaG9ydE9wdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE1vZGUgaGFuZGxlT3B0KCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgaWYoIHN0ZDo6c3RyaW5nKCAiOj1cMCIsIDMgKS5maW5kKCBjICkgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcHROYW1lID0gYXJnLnN1YnN0ciggZnJvbSwgaS1mcm9tICk7CisgICAgICAgICAgICBpZiggbW9kZSA9PSBTaG9ydE9wdCApCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBqID0gMDsgaiA8IG9wdE5hbWUuc2l6ZSgpOyArK2ogKQorICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OlNob3J0T3B0LCBvcHROYW1lLnN1YnN0ciggaiwgMSApICkgKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gU2xhc2hPcHQgJiYgb3B0TmFtZS5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpTaG9ydE9wdCwgb3B0TmFtZSApICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpMb25nT3B0LCBvcHROYW1lICkgKTsKKyAgICAgICAgICAgIHJldHVybiBOb25lOworICAgICAgICB9CisgICAgICAgIE1vZGUgaGFuZGxlUG9zaXRpb25hbCggc3RkOjpzaXplX3QgaSwgY2hhciBjLCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGlmKCBpblF1b3RlcyB8fCBzdGQ6OnN0cmluZyggIlwwIiwgMSApLmZpbmQoIGMgKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSBhcmcuc3Vic3RyKCBmcm9tLCBpLWZyb20gKTsKKyAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6UG9zaXRpb25hbCwgZGF0YSApICk7CisgICAgICAgICAgICByZXR1cm4gTm9uZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgIHN0cnVjdCBDb21tb25BcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgQ29tbW9uQXJnUHJvcGVydGllcygpIHt9CisgICAgICAgIENvbW1vbkFyZ1Byb3BlcnRpZXMoIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBjb25zdCYgX2JvdW5kRmllbGQgKSA6IGJvdW5kRmllbGQoIF9ib3VuZEZpZWxkICkge30KKworICAgICAgICBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gYm91bmRGaWVsZDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgIHN0ZDo6c3RyaW5nIGRldGFpbDsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGxhY2Vob2xkZXI7IC8vIE9ubHkgdmFsdWUgaWYgYm91bmRGaWVsZCB0YWtlcyBhbiBhcmcKKworICAgICAgICBib29sIHRha2VzQXJnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICFwbGFjZWhvbGRlci5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIHZvaWQgdmFsaWRhdGUoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggIWJvdW5kRmllbGQuaXNTZXQoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm9wdGlvbiBub3QgYm91bmQiICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHN0cnVjdCBPcHRpb25BcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNob3J0TmFtZXM7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxvbmdOYW1lOworCisgICAgICAgIGJvb2wgaGFzU2hvcnROYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgc2hvcnROYW1lICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZCggc2hvcnROYW1lcy5iZWdpbigpLCBzaG9ydE5hbWVzLmVuZCgpLCBzaG9ydE5hbWUgKSAhPSBzaG9ydE5hbWVzLmVuZCgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgaGFzTG9uZ05hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbG9uZ05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gX2xvbmdOYW1lID09IGxvbmdOYW1lOworICAgICAgICB9CisgICAgfTsKKyAgICBzdHJ1Y3QgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMgeworICAgICAgICBQb3NpdGlvbmFsQXJnUHJvcGVydGllcygpIDogcG9zaXRpb24oIC0xICkge30KKyAgICAgICAgaW50IHBvc2l0aW9uOyAvLyAtMSBtZWFucyBub24tcG9zaXRpb25hbCAoZmxvYXRpbmcpCisKKyAgICAgICAgYm9vbCBpc0ZpeGVkUG9zaXRpb25hbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiAhPSAtMTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgIGNsYXNzIENvbW1hbmRMaW5lIHsKKworICAgICAgICBzdHJ1Y3QgQXJnIDogQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPiwgT3B0aW9uQXJnUHJvcGVydGllcywgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMgeworICAgICAgICAgICAgQXJnKCkge30KKyAgICAgICAgICAgIEFyZyggRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IGNvbnN0JiBfYm91bmRGaWVsZCApIDogQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPiggX2JvdW5kRmllbGQgKSB7fQorCisgICAgICAgICAgICB1c2luZyBDb21tb25BcmdQcm9wZXJ0aWVzPENvbmZpZ1Q+OjpwbGFjZWhvbGRlcjsgLy8gIVRCRAorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYmdOYW1lKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhbG9uZ05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiLS0iICsgbG9uZ05hbWU7CisgICAgICAgICAgICAgICAgaWYoICFzaG9ydE5hbWVzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi0iICsgc2hvcnROYW1lc1swXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gInBvc2l0aW9uYWwgYXJncyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb21tYW5kcygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzaG9ydE5hbWVzLmJlZ2luKCksIGl0RW5kID0gc2hvcnROYW1lcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZpcnN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLCAiOworICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIi0iIDw8ICppdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoICFsb25nTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICBpZiggIWZpcnN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLCAiOworICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIi0tIiA8PCBsb25nTmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoICFwbGFjZWhvbGRlci5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICIgPCIgPDwgcGxhY2Vob2xkZXIgPDwgIj4iOworICAgICAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdHlwZWRlZiBDTEFSQV9BVVRPX1BUUiggQXJnICkgQXJnQXV0b1B0cjsKKworICAgICAgICBmcmllbmQgdm9pZCBhZGRPcHROYW1lKCBBcmcmIGFyZywgc3RkOjpzdHJpbmcgY29uc3QmIG9wdE5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggb3B0TmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiggRGV0YWlsOjpzdGFydHNXaXRoKCBvcHROYW1lLCAiLS0iICkgKSB7CisgICAgICAgICAgICAgICAgaWYoICFhcmcubG9uZ05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJPbmx5IG9uZSBsb25nIG9wdCBtYXkgYmUgc3BlY2lmaWVkLiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBhcmcubG9uZ05hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicgYWxyZWFkeSBzcGVjaWZpZWQsIG5vdyBhdHRlbXB0aW5nIHRvIGFkZCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBvcHROYW1lICsgIiciICk7CisgICAgICAgICAgICAgICAgYXJnLmxvbmdOYW1lID0gb3B0TmFtZS5zdWJzdHIoIDIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIERldGFpbDo6c3RhcnRzV2l0aCggb3B0TmFtZSwgIi0iICkgKQorICAgICAgICAgICAgICAgIGFyZy5zaG9ydE5hbWVzLnB1c2hfYmFjayggb3B0TmFtZS5zdWJzdHIoIDEgKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJvcHRpb24gbXVzdCBiZWdpbiB3aXRoIC0gb3IgLS0uIE9wdGlvbiB3YXM6ICciICsgb3B0TmFtZSArICInIiApOworICAgICAgICB9CisgICAgICAgIGZyaWVuZCB2b2lkIHNldFBvc2l0aW9uYWxBcmcoIEFyZyYgYXJnLCBpbnQgcG9zaXRpb24gKQorICAgICAgICB7CisgICAgICAgICAgICBhcmcucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEFyZ0J1aWxkZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBcmdCdWlsZGVyKCBBcmcqIGFyZyApIDogbV9hcmcoIGFyZyApIHt9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBub24tYm9vbGVhbiBkYXRhIG1lbWJlciAocmVxdWlyZXMgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgICAgIHZvaWQgYmluZCggTSBDOjoqIGZpZWxkLCBzdGQ6OnN0cmluZyBjb25zdCYgcGxhY2Vob2xkZXIgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8QyxNPiggZmllbGQgKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEJpbmQgYSBib29sZWFuIGRhdGEgbWVtYmVyIChubyBwbGFjZWhvbGRlciByZXF1aXJlZCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIGJvb2wgQzo6KiBmaWVsZCApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kRGF0YU1lbWJlcjxDLGJvb2w+KCBmaWVsZCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbWV0aG9kIHRha2luZyBhIHNpbmdsZSwgbm9uLWJvb2xlYW4gYXJndW1lbnQgKHJlcXVpcmVzIGEgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiB1bmFyeU1ldGhvZCkoIE0gKSwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeU1ldGhvZDxDLE0+KCB1bmFyeU1ldGhvZCApOworICAgICAgICAgICAgICAgIG1fYXJnLT5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbWV0aG9kIHRha2luZyBhIHNpbmdsZSwgYm9vbGVhbiBhcmd1bWVudCAobm8gcGxhY2Vob2xkZXIgc3RyaW5nIHJlcXVpcmVkKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiB1bmFyeU1ldGhvZCkoIGJvb2wgKSApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8Qyxib29sPiggdW5hcnlNZXRob2QgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyAod2lsbCBiZSBjYWxsZWQgaWYgb3B0IGlzIHByZXNlbnQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkIChDOjoqIG51bGxhcnlNZXRob2QpKCkgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZE51bGxhcnlNZXRob2Q8Qz4oIG51bGxhcnlNZXRob2QgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIGZyZWUgZnVuY3Rpb24gdGFraW5nIGEgc2luZ2xlIGFyZ3VtZW50IC0gdGhlIG9iamVjdCB0byBvcGVyYXRlIG9uIChubyBwbGFjZWhvbGRlciBzdHJpbmcgcmVxdWlyZWQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkICgqIHVuYXJ5RnVuY3Rpb24pKCBDJiApICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeUZ1bmN0aW9uPEM+KCB1bmFyeUZ1bmN0aW9uICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBmcmVlIGZ1bmN0aW9uIHRha2luZyBhIHNpbmdsZSBhcmd1bWVudCAtIHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbiAocmVxdWlyZXMgYSBwbGFjZWhvbGRlciBzdHJpbmcpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBUPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkICgqIGJpbmFyeUZ1bmN0aW9uKSggQyYsIFQgKSwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRCaW5hcnlGdW5jdGlvbjxDLCBUPiggYmluYXJ5RnVuY3Rpb24gKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXJnQnVpbGRlciYgZGVzY3JpYmUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXNjcmlwdGlvbiApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+ZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBcmdCdWlsZGVyJiBkZXRhaWwoIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXRhaWwgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmRldGFpbCA9IGRldGFpbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgQXJnKiBtX2FyZzsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBPcHRCdWlsZGVyIDogcHVibGljIEFyZ0J1aWxkZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBPcHRCdWlsZGVyKCBBcmcqIGFyZyApIDogQXJnQnVpbGRlciggYXJnICkge30KKyAgICAgICAgICAgIE9wdEJ1aWxkZXIoIE9wdEJ1aWxkZXImIG90aGVyICkgOiBBcmdCdWlsZGVyKCBvdGhlciApIHt9CisKKyAgICAgICAgICAgIE9wdEJ1aWxkZXImIG9wZXJhdG9yW10oIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkgeworICAgICAgICAgICAgICAgIGFkZE9wdE5hbWUoICpBcmdCdWlsZGVyOjptX2FyZywgb3B0TmFtZSApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBDb21tYW5kTGluZSgpCisgICAgICAgIDogICBtX2JvdW5kUHJvY2Vzc05hbWUoIG5ldyBEZXRhaWw6Ok51bGxCaW5kZXI8Q29uZmlnVD4oKSApLAorICAgICAgICAgICAgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24oIDAgKSwKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyggZmFsc2UgKQorICAgICAgICB7fQorICAgICAgICBDb21tYW5kTGluZSggQ29tbWFuZExpbmUgY29uc3QmIG90aGVyICkKKyAgICAgICAgOiAgIG1fYm91bmRQcm9jZXNzTmFtZSggb3RoZXIubV9ib3VuZFByb2Nlc3NOYW1lICksCisgICAgICAgICAgICBtX29wdGlvbnMgKCBvdGhlci5tX29wdGlvbnMgKSwKKyAgICAgICAgICAgIG1fcG9zaXRpb25hbEFyZ3MoIG90aGVyLm1fcG9zaXRpb25hbEFyZ3MgKSwKKyAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uKCBvdGhlci5tX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiApLAorICAgICAgICAgICAgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCBvdGhlci5tX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggb3RoZXIubV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgbV9mbG9hdGluZ0FyZy5yZXNldCggbmV3IEFyZyggKm90aGVyLm1fZmxvYXRpbmdBcmcgKSApOworICAgICAgICB9CisKKyAgICAgICAgQ29tbWFuZExpbmUmIHNldFRocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIGJvb2wgc2hvdWxkVGhyb3cgPSB0cnVlICkgeworICAgICAgICAgICAgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zID0gc2hvdWxkVGhyb3c7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBPcHRCdWlsZGVyIG9wZXJhdG9yW10oIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkgeworICAgICAgICAgICAgbV9vcHRpb25zLnB1c2hfYmFjayggQXJnKCkgKTsKKyAgICAgICAgICAgIGFkZE9wdE5hbWUoIG1fb3B0aW9ucy5iYWNrKCksIG9wdE5hbWUgKTsKKyAgICAgICAgICAgIE9wdEJ1aWxkZXIgYnVpbGRlciggJm1fb3B0aW9ucy5iYWNrKCkgKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgQXJnQnVpbGRlciBvcGVyYXRvcltdKCBpbnQgcG9zaXRpb24gKSB7CisgICAgICAgICAgICBtX3Bvc2l0aW9uYWxBcmdzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIHBvc2l0aW9uLCBBcmcoKSApICk7CisgICAgICAgICAgICBpZiggcG9zaXRpb24gPiBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiApCisgICAgICAgICAgICAgICAgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIHNldFBvc2l0aW9uYWxBcmcoIG1fcG9zaXRpb25hbEFyZ3NbcG9zaXRpb25dLCBwb3NpdGlvbiApOworICAgICAgICAgICAgQXJnQnVpbGRlciBidWlsZGVyKCAmbV9wb3NpdGlvbmFsQXJnc1twb3NpdGlvbl0gKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52b2tlIHRoaXMgd2l0aCB0aGUgXyBpbnN0YW5jZQorICAgICAgICBBcmdCdWlsZGVyIG9wZXJhdG9yW10oIFVucG9zaXRpb25hbFRhZyApIHsKKyAgICAgICAgICAgIGlmKCBtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiT25seSBvbmUgdW5wb3NpdGlvbmFsIGFyZ3VtZW50IGNhbiBiZSBhZGRlZCIgKTsKKyAgICAgICAgICAgIG1fZmxvYXRpbmdBcmcucmVzZXQoIG5ldyBBcmcoKSApOworICAgICAgICAgICAgQXJnQnVpbGRlciBidWlsZGVyKCBtX2Zsb2F0aW5nQXJnLmdldCgpICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHZvaWQgYmluZFByb2Nlc3NOYW1lKCBNIEM6OiogZmllbGQgKSB7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8QyxNPiggZmllbGQgKTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICB2b2lkIGJpbmRQcm9jZXNzTmFtZSggdm9pZCAoQzo6Kl91bmFyeU1ldGhvZCkoIE0gKSApIHsKKyAgICAgICAgICAgIG1fYm91bmRQcm9jZXNzTmFtZSA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8QyxNPiggX3VuYXJ5TWV0aG9kICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG9wdFVzYWdlKCBzdGQ6Om9zdHJlYW0mIG9zLCBzdGQ6OnNpemVfdCBpbmRlbnQgPSAwLCBzdGQ6OnNpemVfdCB3aWR0aCA9IERldGFpbDo6Y29uc29sZVdpZHRoICkgY29uc3QgeworICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QXJnPjo6Y29uc3RfaXRlcmF0b3IgaXRCZWdpbiA9IG1fb3B0aW9ucy5iZWdpbigpLCBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKSwgaXQ7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBtYXhXaWR0aCA9IDA7CisgICAgICAgICAgICBmb3IoIGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgIG1heFdpZHRoID0gKHN0ZDo6bWF4KSggbWF4V2lkdGgsIGl0LT5jb21tYW5kcygpLnNpemUoKSApOworCisgICAgICAgICAgICBmb3IoIGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgRGV0YWlsOjpUZXh0IHVzYWdlKCBpdC0+Y29tbWFuZHMoKSwgRGV0YWlsOjpUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggbWF4V2lkdGgraW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggaW5kZW50ICkgKTsKKyAgICAgICAgICAgICAgICBEZXRhaWw6OlRleHQgZGVzYyggaXQtPmRlc2NyaXB0aW9uLCBEZXRhaWw6OlRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCB3aWR0aCAtIG1heFdpZHRoIC0gMyApICk7CisKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgKHN0ZDo6bWF4KSggdXNhZ2Uuc2l6ZSgpLCBkZXNjLnNpemUoKSApOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlQ29sID0gaSA8IHVzYWdlLnNpemUoKSA/IHVzYWdlW2ldIDogIiI7CisgICAgICAgICAgICAgICAgICAgIG9zIDw8IHVzYWdlQ29sOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBpIDwgZGVzYy5zaXplKCkgJiYgIWRlc2NbaV0uZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBvcyAgPDwgc3RkOjpzdHJpbmcoIGluZGVudCArIDIgKyBtYXhXaWR0aCAtIHVzYWdlQ29sLnNpemUoKSwgJyAnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBkZXNjW2ldOworICAgICAgICAgICAgICAgICAgICBvcyA8PCAiXG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBvcHRVc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvcHRVc2FnZSggb3NzICk7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhcmdTeW5vcHNpcyggc3RkOjpvc3RyZWFtJiBvcyApIGNvbnN0IHsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAxOyBpIDw9IG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uOyArK2kgKSB7CisgICAgICAgICAgICAgICAgaWYoIGkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiAiOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludCwgQXJnPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Bvc2l0aW9uYWxBcmdzLmZpbmQoIGkgKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gbV9wb3NpdGlvbmFsQXJncy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICI8IiA8PCBpdC0+c2Vjb25kLnBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIjwiIDw8IG1fZmxvYXRpbmdBcmctPnBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub24gY29uc2VjdXRpdmUgcG9zaXRpb25hbCBhcmd1bWVudHMgd2l0aCBubyBmbG9hdGluZyBhcmdzIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gIVRCRCBObyBpbmRpY2F0aW9uIG9mIG1hbmRhdG9yeSBhcmdzCisgICAgICAgICAgICBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gPiAxICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiAiOworICAgICAgICAgICAgICAgIG9zIDw8ICJbPCIgPDwgbV9mbG9hdGluZ0FyZy0+cGxhY2Vob2xkZXIgPDwgIj4gLi4uXSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgYXJnU3lub3BzaXMoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgYXJnU3lub3BzaXMoIG9zcyApOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdXNhZ2UoIHN0ZDo6b3N0cmVhbSYgb3MsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcm9jTmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgICAgICBvcyA8PCAidXNhZ2U6XG4gICIgPDwgcHJvY05hbWUgPDwgIiAiOworICAgICAgICAgICAgYXJnU3lub3BzaXMoIG9zICk7CisgICAgICAgICAgICBpZiggIW1fb3B0aW9ucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG9zIDw8ICIgW29wdGlvbnNdXG5cbndoZXJlIG9wdGlvbnMgYXJlOiBcbiI7CisgICAgICAgICAgICAgICAgb3B0VXNhZ2UoIG9zLCAyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcyA8PCAiXG4iOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlKCBzdGQ6OnN0cmluZyBjb25zdCYgcHJvY05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgdXNhZ2UoIG9zcywgcHJvY05hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBDb25maWdUIHBhcnNlKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MgKSBjb25zdCB7CisgICAgICAgICAgICBDb25maWdUIGNvbmZpZzsKKyAgICAgICAgICAgIHBhcnNlSW50byggYXJncywgY29uZmlnICk7CisgICAgICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcGFyc2VJbnRvKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByb2Nlc3NOYW1lID0gYXJncy5lbXB0eSgpID8gc3RkOjpzdHJpbmcoKSA6IGFyZ3NbMF07CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBsYXN0U2xhc2ggPSBwcm9jZXNzTmFtZS5maW5kX2xhc3Rfb2YoICIvXFwiICk7CisgICAgICAgICAgICBpZiggbGFzdFNsYXNoICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZSA9IHByb2Nlc3NOYW1lLnN1YnN0ciggbGFzdFNsYXNoKzEgKTsKKyAgICAgICAgICAgIG1fYm91bmRQcm9jZXNzTmFtZS5zZXQoIGNvbmZpZywgcHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHRva2VuczsKKyAgICAgICAgICAgIFBhcnNlciBwYXJzZXI7CisgICAgICAgICAgICBwYXJzZXIucGFyc2VJbnRvVG9rZW5zKCBhcmdzLCB0b2tlbnMgKTsKKyAgICAgICAgICAgIHJldHVybiBwb3B1bGF0ZSggdG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zID0gcG9wdWxhdGVPcHRpb25zKCB0b2tlbnMsIGNvbmZpZyApOworICAgICAgICAgICAgdW51c2VkVG9rZW5zID0gcG9wdWxhdGVGaXhlZEFyZ3MoIHVudXNlZFRva2VucywgY29uZmlnICk7CisgICAgICAgICAgICB1bnVzZWRUb2tlbnMgPSBwb3B1bGF0ZUZsb2F0aW5nQXJncyggdW51c2VkVG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZU9wdGlvbnMoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9vcHRpb25zLmJlZ2luKCksIGl0RW5kID0gbV9vcHRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBBcmcgY29uc3QmIGFyZyA9ICppdDsKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpTaG9ydE9wdCAmJiBhcmcuaGFzU2hvcnROYW1lKCB0b2tlbi5kYXRhICkgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpMb25nT3B0ICYmIGFyZy5oYXNMb25nTmFtZSggdG9rZW4uZGF0YSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFyZy50YWtlc0FyZygpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaSA9PSB0b2tlbnMuc2l6ZSgpLTEgfHwgdG9rZW5zW2krMV0udHlwZSAhPSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoX2JhY2soICJFeHBlY3RlZCBhcmd1bWVudCB0byBvcHRpb246ICIgKyB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5ib3VuZEZpZWxkLnNldCggY29uZmlnLCB0b2tlbnNbKytpXS5kYXRhICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgInRydWUiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaF9iYWNrKCBzdGQ6OnN0cmluZyggZXgud2hhdCgpICkgKyAiXG4tIHdoaWxlIHBhcnNpbmc6ICgiICsgYXJnLmNvbW1hbmRzKCkgKyAiKSIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaXQgPT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgfHwgIW1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyApCisgICAgICAgICAgICAgICAgICAgICAgICB1bnVzZWRUb2tlbnMucHVzaF9iYWNrKCB0b2tlbiApOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnJvcnMuZW1wdHkoKSAmJiBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjayggInVucmVjb2duaXNlZCBvcHRpb246ICIgKyB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFlcnJvcnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVycm9ycy5iZWdpbigpLCBpdEVuZCA9IGVycm9ycy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0ICE9IGVycm9ycy5iZWdpbigpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiXG4iOworICAgICAgICAgICAgICAgICAgICBvc3MgPDwgKml0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIG9zcy5zdHIoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZUZpeGVkQXJncyggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zOworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gMTsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgUGFyc2VyOjpUb2tlbiBjb25zdCYgdG9rZW4gPSB0b2tlbnNbaV07CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50LCBBcmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcG9zaXRpb25hbEFyZ3MuZmluZCggcG9zaXRpb24gKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gbV9wb3NpdGlvbmFsQXJncy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdW51c2VkVG9rZW5zLnB1c2hfYmFjayggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICBpZiggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsICkKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVGbG9hdGluZ0FyZ3MoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCAhbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgUGFyc2VyOjpUb2tlbiBjb25zdCYgdG9rZW4gPSB0b2tlbnNbaV07CisgICAgICAgICAgICAgICAgaWYoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdBcmctPmJvdW5kRmllbGQuc2V0KCBjb25maWcsIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVudXNlZFRva2Vucy5wdXNoX2JhY2soIHRva2VuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB2YWxpZGF0ZSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtX29wdGlvbnMuZW1wdHkoKSAmJiBtX3Bvc2l0aW9uYWxBcmdzLmVtcHR5KCkgJiYgIW1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJObyBvcHRpb25zIG9yIGFyZ3VtZW50cyBzcGVjaWZpZWQiICk7CisKKyAgICAgICAgICAgIGZvciggdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QXJnPjo6Y29uc3RfaXRlcmF0b3IgIGl0ID0gbV9vcHRpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgIGl0LT52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gbV9ib3VuZFByb2Nlc3NOYW1lOworICAgICAgICBzdGQ6OnZlY3RvcjxBcmc+IG1fb3B0aW9uczsKKyAgICAgICAgc3RkOjptYXA8aW50LCBBcmc+IG1fcG9zaXRpb25hbEFyZ3M7CisgICAgICAgIEFyZ0F1dG9QdHIgbV9mbG9hdGluZ0FyZzsKKyAgICAgICAgaW50IG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uOworICAgICAgICBib29sIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VuczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2xhcmEKKworU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRQorI3VuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI3VuZGVmIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19DTEFSQV9IX0lOQ0xVREVECisjdW5kZWYgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisKKy8vIFJlc3RvcmUgQ2xhcmEncyB2YWx1ZSBmb3IgY29uc29sZSB3aWR0aCwgaWYgcHJlc2VudAorI2lmZGVmIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0FUQ0hfVEVNUF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI3VuZGVmIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNlbmRpZgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxjdGltZT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGlubGluZSB2b2lkIGFib3J0QWZ0ZXJGaXJzdCggQ29uZmlnRGF0YSYgY29uZmlnICkgeyBjb25maWcuYWJvcnRBZnRlciA9IDE7IH0KKyAgICBpbmxpbmUgdm9pZCBhYm9ydEFmdGVyWCggQ29uZmlnRGF0YSYgY29uZmlnLCBpbnQgeCApIHsKKyAgICAgICAgaWYoIHggPCAxICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlZhbHVlIGFmdGVyIC14IG9yIC0tYWJvcnRBZnRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIiApOworICAgICAgICBjb25maWcuYWJvcnRBZnRlciA9IHg7CisgICAgfQorICAgIGlubGluZSB2b2lkIGFkZFRlc3RPclRhZ3MoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF90ZXN0U3BlYyApIHsgY29uZmlnLnRlc3RzT3JUYWdzLnB1c2hfYmFjayggX3Rlc3RTcGVjICk7IH0KKyAgICBpbmxpbmUgdm9pZCBhZGRTZWN0aW9uVG9SdW4oIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lICkgeyBjb25maWcuc2VjdGlvbnNUb1J1bi5wdXNoX2JhY2soIHNlY3Rpb25OYW1lICk7IH0KKyAgICBpbmxpbmUgdm9pZCBhZGRSZXBvcnRlck5hbWUoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF9yZXBvcnRlck5hbWUgKSB7IGNvbmZpZy5yZXBvcnRlck5hbWVzLnB1c2hfYmFjayggX3JlcG9ydGVyTmFtZSApOyB9CisKKyAgICBpbmxpbmUgdm9pZCBhZGRXYXJuaW5nKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfd2FybmluZyApIHsKKyAgICAgICAgaWYoIF93YXJuaW5nID09ICJOb0Fzc2VydGlvbnMiICkKKyAgICAgICAgICAgIGNvbmZpZy53YXJuaW5ncyA9IHN0YXRpY19jYXN0PFdhcm5BYm91dDo6V2hhdD4oIGNvbmZpZy53YXJuaW5ncyB8IFdhcm5BYm91dDo6Tm9Bc3NlcnRpb25zICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlVucmVjb2duaXNlZCB3YXJuaW5nOiAnIiArIF93YXJuaW5nICsgJ1wnJyApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRPcmRlciggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgb3JkZXIgKSB7CisgICAgICAgIGlmKCBzdGFydHNXaXRoKCAiZGVjbGFyZWQiLCBvcmRlciApICkKKyAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXI7CisgICAgICAgIGVsc2UgaWYoIHN0YXJ0c1dpdGgoICJsZXhpY2FsIiwgb3JkZXIgKSApCisgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5MZXhpY29ncmFwaGljYWxPcmRlcjsKKyAgICAgICAgZWxzZSBpZiggc3RhcnRzV2l0aCggInJhbmRvbSIsIG9yZGVyICkgKQorICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluUmFuZG9tT3JkZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlVucmVjb2duaXNlZCBvcmRlcmluZzogJyIgKyBvcmRlciArICdcJycgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0Um5nU2VlZCggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgc2VlZCApIHsKKyAgICAgICAgaWYoIHNlZWQgPT0gInRpbWUiICkgeworICAgICAgICAgICAgY29uZmlnLnJuZ1NlZWQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCBzdGQ6OnRpbWUoMCkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgc2VlZDsKKyAgICAgICAgICAgIHNzID4+IGNvbmZpZy5ybmdTZWVkOworICAgICAgICAgICAgaWYoIHNzLmZhaWwoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiQXJndW1lbnQgdG8gLS1ybmctc2VlZCBzaG91bGQgYmUgdGhlIHdvcmQgJ3RpbWUnIG9yIGEgbnVtYmVyIiApOworICAgICAgICB9CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFZlcmJvc2l0eSggQ29uZmlnRGF0YSYgY29uZmlnLCBpbnQgbGV2ZWwgKSB7CisgICAgICAgIC8vICFUQkQ6IGFjY2VwdCBzdHJpbmdzPworICAgICAgICBjb25maWcudmVyYm9zaXR5ID0gc3RhdGljX2Nhc3Q8VmVyYm9zaXR5OjpMZXZlbD4oIGxldmVsICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFNob3dEdXJhdGlvbnMoIENvbmZpZ0RhdGEmIGNvbmZpZywgYm9vbCBfc2hvd0R1cmF0aW9ucyApIHsKKyAgICAgICAgY29uZmlnLnNob3dEdXJhdGlvbnMgPSBfc2hvd0R1cmF0aW9ucworICAgICAgICAgICAgPyBTaG93RHVyYXRpb25zOjpBbHdheXMKKyAgICAgICAgICAgIDogU2hvd0R1cmF0aW9uczo6TmV2ZXI7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFVzZUNvbG91ciggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1vZGUgPSB0b0xvd2VyKCB2YWx1ZSApOworCisgICAgICAgIGlmKCBtb2RlID09ICJ5ZXMiICkKKyAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6OlllczsKKyAgICAgICAgZWxzZSBpZiggbW9kZSA9PSAibm8iICkKKyAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6Ok5vOworICAgICAgICBlbHNlIGlmKCBtb2RlID09ICJhdXRvIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpBdXRvOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJjb2xvdXIgbW9kZSBtdXN0IGJlIG9uZSBvZjogYXV0bywgeWVzIG9yIG5vIiApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBmb3JjZUNvbG91ciggQ29uZmlnRGF0YSYgY29uZmlnICkgeworICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpZZXM7CisgICAgfQorICAgIGlubGluZSB2b2lkIGxvYWRUZXN0TmFtZXNGcm9tRmlsZSggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX2ZpbGVuYW1lICkgeworICAgICAgICBzdGQ6Omlmc3RyZWFtIGYoIF9maWxlbmFtZS5jX3N0cigpICk7CisgICAgICAgIGlmKCAhZi5pc19vcGVuKCkgKQorICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoICJVbmFibGUgdG8gbG9hZCBpbnB1dCBmaWxlOiAiICsgX2ZpbGVuYW1lICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICAgICAgd2hpbGUoIHN0ZDo6Z2V0bGluZSggZiwgbGluZSApICkgeworICAgICAgICAgICAgbGluZSA9IHRyaW0obGluZSk7CisgICAgICAgICAgICBpZiggIWxpbmUuZW1wdHkoKSAmJiAhc3RhcnRzV2l0aCggbGluZSwgJyMnICkgKSB7CisgICAgICAgICAgICAgICAgaWYoICFzdGFydHNXaXRoKCBsaW5lLCAnIicgKSApCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnIicgKyBsaW5lICsgJyInOworICAgICAgICAgICAgICAgIGFkZFRlc3RPclRhZ3MoIGNvbmZpZywgbGluZSArICcsJyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIENsYXJhOjpDb21tYW5kTGluZTxDb25maWdEYXRhPiBtYWtlQ29tbWFuZExpbmVQYXJzZXIoKSB7CisKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIENsYXJhOworICAgICAgICBDb21tYW5kTGluZTxDb25maWdEYXRhPiBjbGk7CisKKyAgICAgICAgY2xpLmJpbmRQcm9jZXNzTmFtZSggJkNvbmZpZ0RhdGE6OnByb2Nlc3NOYW1lICk7CisKKyAgICAgICAgY2xpWyItPyJdWyItaCJdWyItLWhlbHAiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbiIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93SGVscCApOworCisgICAgICAgIGNsaVsiLWwiXVsiLS1saXN0LXRlc3RzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsL21hdGNoaW5nIHRlc3QgY2FzZXMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFRlc3RzICk7CisKKyAgICAgICAgY2xpWyItdCJdWyItLWxpc3QtdGFncyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0YWdzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RUYWdzICk7CisKKyAgICAgICAgY2xpWyItcyJdWyItLXN1Y2Nlc3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiaW5jbHVkZSBzdWNjZXNzZnVsIHRlc3RzIGluIG91dHB1dCIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93U3VjY2Vzc2Z1bFRlc3RzICk7CisKKyAgICAgICAgY2xpWyItYiJdWyItLWJyZWFrIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImJyZWFrIGludG8gZGVidWdnZXIgb24gZmFpbHVyZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG91bGREZWJ1Z0JyZWFrICk7CisKKyAgICAgICAgY2xpWyItZSJdWyItLW5vdGhyb3ciXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2tpcCBleGNlcHRpb24gdGVzdHMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bm9UaHJvdyApOworCisgICAgICAgIGNsaVsiLWkiXVsiLS1pbnZpc2libGVzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNob3cgaW52aXNpYmxlcyAodGFicywgbmV3bGluZXMpIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OnNob3dJbnZpc2libGVzICk7CisKKyAgICAgICAgY2xpWyItbyJdWyItLW91dCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJvdXRwdXQgZmlsZW5hbWUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6b3V0cHV0RmlsZW5hbWUsICJmaWxlbmFtZSIgKTsKKworICAgICAgICBjbGlbIi1yIl1bIi0tcmVwb3J0ZXIiXQorLy8gICAgICAgICAgICAucGxhY2Vob2xkZXIoICJuYW1lWzpmaWxlbmFtZV0iICkKKyAgICAgICAgICAgIC5kZXNjcmliZSggInJlcG9ydGVyIHRvIHVzZSAoZGVmYXVsdHMgdG8gY29uc29sZSkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkUmVwb3J0ZXJOYW1lLCAibmFtZSIgKTsKKworICAgICAgICBjbGlbIi1uIl1bIi0tbmFtZSJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzdWl0ZSBuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om5hbWUsICJuYW1lIiApOworCisgICAgICAgIGNsaVsiLWEiXVsiLS1hYm9ydCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJhYm9ydCBhdCBmaXJzdCBmYWlsdXJlIiApCisgICAgICAgICAgICAuYmluZCggJmFib3J0QWZ0ZXJGaXJzdCApOworCisgICAgICAgIGNsaVsiLXgiXVsiLS1hYm9ydHgiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWJvcnQgYWZ0ZXIgeCBmYWlsdXJlcyIgKQorICAgICAgICAgICAgLmJpbmQoICZhYm9ydEFmdGVyWCwgIm5vLiBmYWlsdXJlcyIgKTsKKworICAgICAgICBjbGlbIi13Il1bIi0td2FybiJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJlbmFibGUgd2FybmluZ3MiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkV2FybmluZywgIndhcm5pbmcgbmFtZSIgKTsKKworLy8gLSBuZWVkcyB1cGRhdGluZyBpZiByZWluc3RhdGVkCisvLyAgICAgICAgY2xpLmludG8oICZzZXRWZXJib3NpdHkgKQorLy8gICAgICAgICAgICAuZGVzY3JpYmUoICJsZXZlbCBvZiB2ZXJib3NpdHkgKDA9bm8gb3V0cHV0KSIgKQorLy8gICAgICAgICAgICAuc2hvcnRPcHQoICJ2IikKKy8vICAgICAgICAgICAgLmxvbmdPcHQoICJ2ZXJib3NpdHkiICkKKy8vICAgICAgICAgICAgLnBsYWNlaG9sZGVyKCAibGV2ZWwiICk7CisKKyAgICAgICAgY2xpW19dCisgICAgICAgICAgICAuZGVzY3JpYmUoICJ3aGljaCB0ZXN0IG9yIHRlc3RzIHRvIHVzZSIgKQorICAgICAgICAgICAgLmJpbmQoICZhZGRUZXN0T3JUYWdzLCAidGVzdCBuYW1lLCBwYXR0ZXJuIG9yIHRhZ3MiICk7CisKKyAgICAgICAgY2xpWyItZCJdWyItLWR1cmF0aW9ucyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG93IHRlc3QgZHVyYXRpb25zIiApCisgICAgICAgICAgICAuYmluZCggJnNldFNob3dEdXJhdGlvbnMsICJ5ZXN8bm8iICk7CisKKyAgICAgICAgY2xpWyItZiJdWyItLWlucHV0LWZpbGUiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibG9hZCB0ZXN0IG5hbWVzIHRvIHJ1biBmcm9tIGEgZmlsZSIgKQorICAgICAgICAgICAgLmJpbmQoICZsb2FkVGVzdE5hbWVzRnJvbUZpbGUsICJmaWxlbmFtZSIgKTsKKworICAgICAgICBjbGlbIi0jIl1bIi0tZmlsZW5hbWVzLWFzLXRhZ3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWRkcyBhIHRhZyBmb3IgdGhlIGZpbGVuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OmZpbGVuYW1lc0FzVGFncyApOworCisgICAgICAgIGNsaVsiLWMiXVsiLS1zZWN0aW9uIl0KKyAgICAgICAgICAgICAgICAuZGVzY3JpYmUoICJzcGVjaWZ5IHNlY3Rpb24gdG8gcnVuIiApCisgICAgICAgICAgICAgICAgLmJpbmQoICZhZGRTZWN0aW9uVG9SdW4sICJzZWN0aW9uIG5hbWUiICk7CisKKyAgICAgICAgLy8gTGVzcyBjb21tb24gY29tbWFuZHMgd2hpY2ggZG9uJ3QgaGF2ZSBhIHNob3J0IGZvcm0KKyAgICAgICAgY2xpWyItLWxpc3QtdGVzdC1uYW1lcy1vbmx5Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsL21hdGNoaW5nIHRlc3QgY2FzZXMgbmFtZXMgb25seSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0VGVzdE5hbWVzT25seSApOworCisgICAgICAgIGNsaVsiLS1saXN0LXJlcG9ydGVycyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbCByZXBvcnRlcnMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFJlcG9ydGVycyApOworCisgICAgICAgIGNsaVsiLS1vcmRlciJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJ0ZXN0IGNhc2Ugb3JkZXIgKGRlZmF1bHRzIHRvIGRlY2wpIiApCisgICAgICAgICAgICAuYmluZCggJnNldE9yZGVyLCAiZGVjbHxsZXh8cmFuZCIgKTsKKworICAgICAgICBjbGlbIi0tcm5nLXNlZWQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2V0IGEgc3BlY2lmaWMgc2VlZCBmb3IgcmFuZG9tIG51bWJlcnMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0Um5nU2VlZCwgIid0aW1lJ3xudW1iZXIiICk7CisKKyAgICAgICAgY2xpWyItLWZvcmNlLWNvbG91ciJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJmb3JjZSBjb2xvdXJpc2VkIG91dHB1dCAoZGVwcmVjYXRlZCkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmZm9yY2VDb2xvdXIgKTsKKworICAgICAgICBjbGlbIi0tdXNlLWNvbG91ciJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG91bGQgb3V0cHV0IGJlIGNvbG91cmlzZWQiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0VXNlQ29sb3VyLCAieWVzfG5vIiApOworCisgICAgICAgIHJldHVybiBjbGk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2xpc3QuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MSVNUX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGV4dC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVhUX0hfSU5DTFVERUQKKworI2RlZmluZSBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorCisjZGVmaW5lIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIENhdGNoCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vZXh0ZXJuYWwvdGJjX3RleHRfZm9ybWF0LmgKKy8vIE9ubHkgdXNlIGhlYWRlciBndWFyZCBpZiB3ZSBhcmUgbm90IHVzaW5nIGFuIG91dGVyIG5hbWVzcGFjZQorI2lmbmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorIyBpZmRlZiBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorIyAgaWZuZGVmIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyMgICBkZWZpbmUgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworLy8gVXNlIG9wdGlvbmFsIG91dGVyIG5hbWVzcGFjZQorI2lmZGVmIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCituYW1lc3BhY2UgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UgeworI2VuZGlmCisKK25hbWVzcGFjZSBUYmMgeworCisjaWZkZWYgVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEgKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEg7CisjZWxzZQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSA4MDsKKyNlbmRpZgorCisgICAgc3RydWN0IFRleHRBdHRyaWJ1dGVzIHsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICA6ICAgaW5pdGlhbEluZGVudCggc3RkOjpzdHJpbmc6Om5wb3MgKSwKKyAgICAgICAgICAgIGluZGVudCggMCApLAorICAgICAgICAgICAgd2lkdGgoIGNvbnNvbGVXaWR0aC0xICkKKyAgICAgICAge30KKworICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5pdGlhbEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgIHsgaW5pdGlhbEluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgeyBpbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0V2lkdGgoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgIHsgd2lkdGggPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGluaXRpYWxJbmRlbnQ7ICAvLyBpbmRlbnQgb2YgZmlyc3QgbGluZSwgb3IgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCBpbmRlbnQ7ICAgICAgICAgLy8gaW5kZW50IG9mIHN1YnNlcXVlbnQgbGluZXMsIG9yIGFsbCBpZiBpbml0aWFsSW5kZW50IGlzIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGg7ICAgICAgICAgIC8vIG1heGltdW0gd2lkdGggb2YgdGV4dCwgaW5jbHVkaW5nIGluZGVudC4gTG9uZ2VyIHRleHQgd2lsbCB3cmFwCisgICAgfTsKKworICAgIGNsYXNzIFRleHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHIsIFRleHRBdHRyaWJ1dGVzIGNvbnN0JiBfYXR0ciA9IFRleHRBdHRyaWJ1dGVzKCkgKQorICAgICAgICA6IGF0dHIoIF9hdHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgd3JhcHBhYmxlQmVmb3JlQ2hhcnMgPSAiWyh7PFx0IjsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUFmdGVyQ2hhcnMgPSAiXSl9Pi0sLi98XFwiOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgd3JhcHBhYmxlSW5zdGVhZE9mQ2hhcnMgPSAiIFxuXHIiOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZW50ID0gX2F0dHIuaW5pdGlhbEluZGVudCAhPSBzdGQ6OnN0cmluZzo6bnBvcworICAgICAgICAgICAgICAgID8gc3RkOjpzdHJpbmcoIF9hdHRyLmluaXRpYWxJbmRlbnQsICcgJyApCisgICAgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZyggX2F0dHIuaW5kZW50LCAnICcgKTsKKworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBpdGVyYXRvciBpdCA9IF9zdHIuYmVnaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yIHN0ckVuZCA9IF9zdHIuZW5kKCk7CisKKyAgICAgICAgICAgIHdoaWxlKCBpdCAhPSBzdHJFbmQgKSB7CisKKyAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID49IDEwMDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggIi4uLiBtZXNzYWdlIHRydW5jYXRlZCBkdWUgdG8gZXhjZXNzaXZlIHNpemUiICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGggPSAoc3RkOjptaW4pKCBzdGF0aWNfY2FzdDxzaXplX3Q+KCBzdHJFbmQtaXQgKSwgX2F0dHIud2lkdGgtc3RhdGljX2Nhc3Q8c2l6ZV90PiggaW5kZW50LnNpemUoKSApICk7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXRFbmQgPSBpdCt3aWR0aDsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciBpdE5leHQgPSBfc3RyLmVuZCgpOworCisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXROZXdMaW5lID0gc3RkOjpmaW5kKCBpdCwgaXRFbmQsICdcbicgKTsKKyAgICAgICAgICAgICAgICBpZiggaXROZXdMaW5lICE9IGl0RW5kICkKKyAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBpdE5ld0xpbmU7CisKKyAgICAgICAgICAgICAgICBpZiggaXRFbmQgIT0gc3RyRW5kICApIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3VuZFdyYXBQb2ludCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBmaW5kSXQgPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHdyYXBwYWJsZUFmdGVyQ2hhcnMuZmluZCggKmZpbmRJdCApICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGZpbmRJdCAhPSBpdEVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdCsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGZpbmRJdCsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGZpbmRJdCA+IGl0ICYmIHdyYXBwYWJsZUJlZm9yZUNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXcmFwUG9pbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggd3JhcHBhYmxlSW5zdGVhZE9mQ2hhcnMuZmluZCggKmZpbmRJdCApICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGZpbmRJdCsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gZmluZEl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmaW5kSXQgPT0gaXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZmluZEl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhZm91bmRXcmFwUG9pbnQgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggIWZvdW5kV3JhcFBvaW50ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gZ29vZCB3cmFwIGNoYXIsIHNvIHdlJ2xsIGJyZWFrIG1pZCB3b3JkIGFuZCBhZGQgYSBoeXBoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC0taXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICItIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpdEVuZCA+IGl0ICYmIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzLmZpbmQoICooaXRFbmQtMSkgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soIGluZGVudCArIHN0ZDo6c3RyaW5nKCBpdCwgaXRFbmQgKSArIHN1ZmZpeCApOworCisgICAgICAgICAgICAgICAgaWYoIGluZGVudC5zaXplKCkgIT0gX2F0dHIuaW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc3RkOjpzdHJpbmcoIF9hdHRyLmluZGVudCwgJyAnICk7CisgICAgICAgICAgICAgICAgaXQgPSBpdE5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBsaW5lcy5iZWdpbigpOyB9CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmVuZCgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYXN0KCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmFjaygpOyB9CisgICAgICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBsaW5lcy5zaXplKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdG9yW10oIHN0ZDo6c2l6ZV90IF9pbmRleCApIGNvbnN0IHsgcmV0dXJuIGxpbmVzW19pbmRleF07IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICp0aGlzOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgVGV4dCBjb25zdCYgX3RleHQgKSB7CisgICAgICAgICAgICBmb3IoIFRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gX3RleHQuYmVnaW4oKSwgaXRFbmQgPSBfdGV4dC5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gX3RleHQuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgIlxuIjsKKyAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICppdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfc3RyZWFtOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzIGF0dHI7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgVGJjCisKKyNpZmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorfSAvLyBlbmQgb3V0ZXIgbmFtZXNwYWNlCisjZW5kaWYKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyN1bmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHVzaW5nIFRiYzo6VGV4dDsKKyAgICB1c2luZyBUYmM6OlRleHRBdHRyaWJ1dGVzOworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uc29sZV9jb2xvdXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05TT0xFX0NPTE9VUl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb2xvdXIgeworICAgICAgICBlbnVtIENvZGUgeworICAgICAgICAgICAgTm9uZSA9IDAsCisKKyAgICAgICAgICAgIFdoaXRlLAorICAgICAgICAgICAgUmVkLAorICAgICAgICAgICAgR3JlZW4sCisgICAgICAgICAgICBCbHVlLAorICAgICAgICAgICAgQ3lhbiwKKyAgICAgICAgICAgIFllbGxvdywKKyAgICAgICAgICAgIEdyZXksCisKKyAgICAgICAgICAgIEJyaWdodCA9IDB4MTAsCisKKyAgICAgICAgICAgIEJyaWdodFJlZCA9IEJyaWdodCB8IFJlZCwKKyAgICAgICAgICAgIEJyaWdodEdyZWVuID0gQnJpZ2h0IHwgR3JlZW4sCisgICAgICAgICAgICBMaWdodEdyZXkgPSBCcmlnaHQgfCBHcmV5LAorICAgICAgICAgICAgQnJpZ2h0V2hpdGUgPSBCcmlnaHQgfCBXaGl0ZSwKKworICAgICAgICAgICAgLy8gQnkgaW50ZW50aW9uCisgICAgICAgICAgICBGaWxlTmFtZSA9IExpZ2h0R3JleSwKKyAgICAgICAgICAgIFdhcm5pbmcgPSBZZWxsb3csCisgICAgICAgICAgICBSZXN1bHRFcnJvciA9IEJyaWdodFJlZCwKKyAgICAgICAgICAgIFJlc3VsdFN1Y2Nlc3MgPSBCcmlnaHRHcmVlbiwKKyAgICAgICAgICAgIFJlc3VsdEV4cGVjdGVkRmFpbHVyZSA9IFdhcm5pbmcsCisKKyAgICAgICAgICAgIEVycm9yID0gQnJpZ2h0UmVkLAorICAgICAgICAgICAgU3VjY2VzcyA9IEdyZWVuLAorCisgICAgICAgICAgICBPcmlnaW5hbEV4cHJlc3Npb24gPSBDeWFuLAorICAgICAgICAgICAgUmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBZZWxsb3csCisKKyAgICAgICAgICAgIFNlY29uZGFyeVRleHQgPSBMaWdodEdyZXksCisgICAgICAgICAgICBIZWFkZXJzID0gV2hpdGUKKyAgICAgICAgfTsKKworICAgICAgICAvLyBVc2UgY29uc3RydWN0ZWQgb2JqZWN0IGZvciBSQUlJIGd1YXJkCisgICAgICAgIENvbG91ciggQ29kZSBfY29sb3VyQ29kZSApOworICAgICAgICBDb2xvdXIoIENvbG91ciBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgfkNvbG91cigpOworCisgICAgICAgIC8vIFVzZSBzdGF0aWMgbWV0aG9kIGZvciBvbmUtc2hvdCBjaGFuZ2VzCisgICAgICAgIHN0YXRpYyB2b2lkIHVzZSggQ29kZSBfY29sb3VyQ29kZSApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBtX21vdmVkOworICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIENvbG91ciBjb25zdCYgKSB7IHJldHVybiBvczsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfcmVwb3J0ZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SRVBPUlRFUl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIHN0cnVjdCBSZXBvcnRlckNvbmZpZyB7CisgICAgICAgIGV4cGxpY2l0IFJlcG9ydGVyQ29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIF9mdWxsQ29uZmlnICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCAmX2Z1bGxDb25maWctPnN0cmVhbSgpICksIG1fZnVsbENvbmZpZyggX2Z1bGxDb25maWcgKSB7fQorCisgICAgICAgIFJlcG9ydGVyQ29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIF9mdWxsQ29uZmlnLCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0gKQorICAgICAgICA6ICAgbV9zdHJlYW0oICZfc3RyZWFtICksIG1fZnVsbENvbmZpZyggX2Z1bGxDb25maWcgKSB7fQorCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgICAgeyByZXR1cm4gKm1fc3RyZWFtOyB9CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBmdWxsQ29uZmlnKCkgY29uc3QgeyByZXR1cm4gbV9mdWxsQ29uZmlnOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om9zdHJlYW0qIG1fc3RyZWFtOworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9mdWxsQ29uZmlnOworICAgIH07CisKKyAgICBzdHJ1Y3QgUmVwb3J0ZXJQcmVmZXJlbmNlcyB7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMoKQorICAgICAgICA6IHNob3VsZFJlZGlyZWN0U3RkT3V0KCBmYWxzZSApCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCBzaG91bGRSZWRpcmVjdFN0ZE91dDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgTGF6eVN0YXQgOiBPcHRpb248VD4geworICAgICAgICBMYXp5U3RhdCgpIDogdXNlZCggZmFsc2UgKSB7fQorICAgICAgICBMYXp5U3RhdCYgb3BlcmF0b3I9KCBUIGNvbnN0JiBfdmFsdWUgKSB7CisgICAgICAgICAgICBPcHRpb248VD46Om9wZXJhdG9yPSggX3ZhbHVlICk7CisgICAgICAgICAgICB1c2VkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIE9wdGlvbjxUPjo6cmVzZXQoKTsKKyAgICAgICAgICAgIHVzZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBib29sIHVzZWQ7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0UnVuSW5mbyB7CisgICAgICAgIFRlc3RSdW5JbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKSA6IG5hbWUoIF9uYW1lICkge30KKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICB9OworICAgIHN0cnVjdCBHcm91cEluZm8geworICAgICAgICBHcm91cEluZm8oICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IF9ncm91cEluZGV4LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBfZ3JvdXBzQ291bnQgKQorICAgICAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgICAgIGdyb3VwSW5kZXgoIF9ncm91cEluZGV4ICksCisgICAgICAgICAgICBncm91cHNDb3VudHMoIF9ncm91cHNDb3VudCApCisgICAgICAgIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzaXplX3QgZ3JvdXBJbmRleDsKKyAgICAgICAgc3RkOjpzaXplX3QgZ3JvdXBzQ291bnRzOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uU3RhdHMgeworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiBfYXNzZXJ0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IGNvbnN0JiBfaW5mb01lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzICkKKyAgICAgICAgOiAgIGFzc2VydGlvblJlc3VsdCggX2Fzc2VydGlvblJlc3VsdCApLAorICAgICAgICAgICAgaW5mb01lc3NhZ2VzKCBfaW5mb01lc3NhZ2VzICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggYXNzZXJ0aW9uUmVzdWx0Lmhhc01lc3NhZ2UoKSApIHsKKyAgICAgICAgICAgICAgICAvLyBDb3B5IG1lc3NhZ2UgaW50byBtZXNzYWdlcyBsaXN0LgorICAgICAgICAgICAgICAgIC8vICFUQkQgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRvbmUgZWFybGllciwgc29tZXdoZXJlCisgICAgICAgICAgICAgICAgTWVzc2FnZUJ1aWxkZXIgYnVpbGRlciggYXNzZXJ0aW9uUmVzdWx0LmdldFRlc3RNYWNyb05hbWUoKSwgYXNzZXJ0aW9uUmVzdWx0LmdldFNvdXJjZUluZm8oKSwgYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSApOworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPDwgYXNzZXJ0aW9uUmVzdWx0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLm1faW5mby5tZXNzYWdlID0gYnVpbGRlci5tX3N0cmVhbS5zdHIoKTsKKworICAgICAgICAgICAgICAgIGluZm9NZXNzYWdlcy5wdXNoX2JhY2soIGJ1aWxkZXIubV9pbmZvICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+QXNzZXJ0aW9uU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIEFzc2VydGlvblN0YXRzKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIEFzc2VydGlvblN0YXRzJiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0OworICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gaW5mb01lc3NhZ2VzOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgIH07CisKKyAgICBzdHJ1Y3QgU2VjdGlvblN0YXRzIHsKKyAgICAgICAgU2VjdGlvblN0YXRzKCAgIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHMgY29uc3QmIF9hc3NlcnRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX21pc3NpbmdBc3NlcnRpb25zICkKKyAgICAgICAgOiAgIHNlY3Rpb25JbmZvKCBfc2VjdGlvbkluZm8gKSwKKyAgICAgICAgICAgIGFzc2VydGlvbnMoIF9hc3NlcnRpb25zICksCisgICAgICAgICAgICBkdXJhdGlvbkluU2Vjb25kcyggX2R1cmF0aW9uSW5TZWNvbmRzICksCisgICAgICAgICAgICBtaXNzaW5nQXNzZXJ0aW9ucyggX21pc3NpbmdBc3NlcnRpb25zICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+U2VjdGlvblN0YXRzKCk7CisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgU2VjdGlvblN0YXRzKCBTZWN0aW9uU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU2VjdGlvblN0YXRzKCBTZWN0aW9uU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU2VjdGlvblN0YXRzJiBvcGVyYXRvciA9ICggU2VjdGlvblN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgU2VjdGlvblN0YXRzJiBvcGVyYXRvciA9ICggU2VjdGlvblN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgU2VjdGlvbkluZm8gc2VjdGlvbkluZm87CisgICAgICAgIENvdW50cyBhc3NlcnRpb25zOworICAgICAgICBkb3VibGUgZHVyYXRpb25JblNlY29uZHM7CisgICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnM7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0Q2FzZVN0YXRzIHsKKyAgICAgICAgVGVzdENhc2VTdGF0cyggIFRlc3RDYXNlSW5mbyBjb25zdCYgX3Rlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ZEVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiB0ZXN0SW5mbyggX3Rlc3RJbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKSwKKyAgICAgICAgICAgIHN0ZE91dCggX3N0ZE91dCApLAorICAgICAgICAgICAgc3RkRXJyKCBfc3RkRXJyICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdENhc2VTdGF0cygpOworCisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgVGVzdENhc2VTdGF0cyggVGVzdENhc2VTdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0Q2FzZVN0YXRzKCBUZXN0Q2FzZVN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RDYXNlU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBUZXN0Q2FzZUluZm8gdGVzdEluZm87CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZE91dDsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RkRXJyOworICAgICAgICBib29sIGFib3J0aW5nOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdEdyb3VwU3RhdHMgeworICAgICAgICBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfYWJvcnRpbmcgKQorICAgICAgICA6ICAgZ3JvdXBJbmZvKCBfZ3JvdXBJbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQorICAgICAgICB7fQorICAgICAgICBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvICkKKyAgICAgICAgOiAgIGdyb3VwSW5mbyggX2dyb3VwSW5mbyApLAorICAgICAgICAgICAgYWJvcnRpbmcoIGZhbHNlICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdEdyb3VwU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyggVGVzdEdyb3VwU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RHcm91cFN0YXRzJiBvcGVyYXRvciA9ICggVGVzdEdyb3VwU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBHcm91cEluZm8gZ3JvdXBJbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBib29sIGFib3J0aW5nOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdFJ1blN0YXRzIHsKKyAgICAgICAgVGVzdFJ1blN0YXRzKCAgIFRlc3RSdW5JbmZvIGNvbnN0JiBfcnVuSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiAgIHJ1bkluZm8oIF9ydW5JbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0UnVuU3RhdHMoKTsKKworIyAgaWZuZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBUZXN0UnVuU3RhdHMoIFRlc3RSdW5TdGF0cyBjb25zdCYgX290aGVyICkKKyAgICAgICAgOiAgIHJ1bkluZm8oIF9vdGhlci5ydW5JbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF9vdGhlci50b3RhbHMgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfb3RoZXIuYWJvcnRpbmcgKQorICAgICAgICB7fQorIyAgZWxzZQorICAgICAgICBUZXN0UnVuU3RhdHMoIFRlc3RSdW5TdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0UnVuU3RhdHMoIFRlc3RSdW5TdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0UnVuU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0UnVuU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBUZXN0UnVuU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0UnVuU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBUZXN0UnVuSW5mbyBydW5JbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBib29sIGFib3J0aW5nOworICAgIH07CisKKyAgICBjbGFzcyBNdWx0aXBsZVJlcG9ydGVyczsKKworICAgIHN0cnVjdCBJU3RyZWFtaW5nUmVwb3J0ZXIgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB+SVN0cmVhbWluZ1JlcG9ydGVyKCk7CisKKyAgICAgICAgLy8gSW1wbGVtZW50aW5nIGNsYXNzIG11c3QgYWxzbyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgc3RhdGljIG1ldGhvZDoKKyAgICAgICAgLy8gc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgdGVzdFJ1bkluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmIGFzc2VydGlvbkluZm8gKSA9IDA7CisKKyAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2VzIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZDoKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgTXVsdGlwbGVSZXBvcnRlcnMqIHRyeUFzTXVsdGkoKSB7IHJldHVybiBDQVRDSF9OVUxMOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBJUmVwb3J0ZXJGYWN0b3J5IDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlckZhY3RvcnkoKTsKKyAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElSZXBvcnRlclJlZ2lzdHJ5IHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHRyPElSZXBvcnRlckZhY3Rvcnk+ID4gRmFjdG9yeU1hcDsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8SVJlcG9ydGVyRmFjdG9yeT4gPiBMaXN0ZW5lcnM7CisKKyAgICAgICAgdmlydHVhbCB+SVJlcG9ydGVyUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIEZhY3RvcnlNYXAgY29uc3QmIGdldEZhY3RvcmllcygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBMaXN0ZW5lcnMgY29uc3QmIGdldExpc3RlbmVycygpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gYWRkUmVwb3J0ZXIoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBleGlzdGluZ1JlcG9ydGVyLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgYWRkaXRpb25hbFJlcG9ydGVyICk7CisKK30KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRlc3RzKCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOworICAgICAgICBpZiggY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIk1hdGNoaW5nIHRlc3QgY2FzZXM6XG4iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkFsbCBhdmFpbGFibGUgdGVzdCBjYXNlczpcbiI7CisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIioiICkudGVzdFNwZWMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IG1hdGNoZWRUZXN0cyA9IDA7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzIG5hbWVBdHRyLCB0YWdzQXR0cjsKKyAgICAgICAgbmFtZUF0dHIuc2V0SW5pdGlhbEluZGVudCggMiApLnNldEluZGVudCggNCApOworICAgICAgICB0YWdzQXR0ci5zZXRJbmRlbnQoIDYgKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBtYXRjaGVkVGVzdHMrKzsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gaXQtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgQ29sb3VyOjpDb2RlIGNvbG91ciA9IHRlc3RDYXNlSW5mby5pc0hpZGRlbigpCisgICAgICAgICAgICAgICAgPyBDb2xvdXI6OlNlY29uZGFyeVRleHQKKyAgICAgICAgICAgICAgICA6IENvbG91cjo6Tm9uZTsKKyAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgVGV4dCggdGVzdENhc2VJbmZvLm5hbWUsIG5hbWVBdHRyICkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgaWYoICF0ZXN0Q2FzZUluZm8udGFncy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IFRleHQoIHRlc3RDYXNlSW5mby50YWdzQXNTdHJpbmcsIHRhZ3NBdHRyICkgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgaWYoICFjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIG1hdGNoZWRUZXN0cywgInRlc3QgY2FzZSIgKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIG1hdGNoZWRUZXN0cywgIm1hdGNoaW5nIHRlc3QgY2FzZSIgKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIG1hdGNoZWRUZXN0czsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRlc3RzTmFtZXNPbmx5KCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoICFjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICIqIiApLnRlc3RTcGVjKCk7CisgICAgICAgIHN0ZDo6c2l6ZV90IG1hdGNoZWRUZXN0cyA9IDA7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtYXRjaGVkVGVzdENhc2VzID0gZmlsdGVyVGVzdHMoIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICksIHRlc3RTcGVjLCBjb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWF0Y2hlZFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IG1hdGNoZWRUZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIG1hdGNoZWRUZXN0cysrOworICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggdGVzdENhc2VJbmZvLm5hbWUsICcjJyApICkKKyAgICAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgJyInIDw8IHRlc3RDYXNlSW5mby5uYW1lIDw8ICciJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHRlc3RDYXNlSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF0Y2hlZFRlc3RzOworICAgIH0KKworICAgIHN0cnVjdCBUYWdJbmZvIHsKKyAgICAgICAgVGFnSW5mbygpIDogY291bnQgKCAwICkge30KKyAgICAgICAgdm9pZCBhZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVsbGluZyApIHsKKyAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgICAgICBzcGVsbGluZ3MuaW5zZXJ0KCBzcGVsbGluZyApOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGFsbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG91dDsKKyAgICAgICAgICAgIGZvciggc3RkOjpzZXQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNwZWxsaW5ncy5iZWdpbigpLCBpdEVuZCA9IHNwZWxsaW5ncy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgb3V0ICs9ICJbIiArICppdCArICJdIjsKKyAgICAgICAgICAgIHJldHVybiBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHNwZWxsaW5nczsKKyAgICAgICAgc3RkOjpzaXplX3QgY291bnQ7CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0VGFncyggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCBjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiVGFncyBmb3IgbWF0Y2hpbmcgdGVzdCBjYXNlczpcbiI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiQWxsIGF2YWlsYWJsZSB0YWdzOlxuIjsKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiKiIgKS50ZXN0U3BlYygpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0luZm8+IHRhZ0NvdW50czsKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgIHRhZ0l0ID0gaXQtPmdldFRlc3RDYXNlSW5mbygpLnRhZ3MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnSXRFbmQgPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCkudGFncy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnSXQgIT0gdGFnSXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsrdGFnSXQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGFnTmFtZSA9ICp0YWdJdDsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsY2FzZVRhZ05hbWUgPSB0b0xvd2VyKCB0YWdOYW1lICk7CisgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0luZm8+OjppdGVyYXRvciBjb3VudEl0ID0gdGFnQ291bnRzLmZpbmQoIGxjYXNlVGFnTmFtZSApOworICAgICAgICAgICAgICAgIGlmKCBjb3VudEl0ID09IHRhZ0NvdW50cy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIGNvdW50SXQgPSB0YWdDb3VudHMuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggbGNhc2VUYWdOYW1lLCBUYWdJbmZvKCkgKSApLmZpcnN0OworICAgICAgICAgICAgICAgIGNvdW50SXQtPnNlY29uZC5hZGQoIHRhZ05hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0luZm8+Ojpjb25zdF9pdGVyYXRvciBjb3VudEl0ID0gdGFnQ291bnRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEl0RW5kID0gdGFnQ291bnRzLmVuZCgpOworICAgICAgICAgICAgICAgIGNvdW50SXQgIT0gY291bnRJdEVuZDsKKyAgICAgICAgICAgICAgICArK2NvdW50SXQgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICIgICIgPDwgc3RkOjpzZXR3KDIpIDw8IGNvdW50SXQtPnNlY29uZC5jb3VudCA8PCAiICAiOworICAgICAgICAgICAgVGV4dCB3cmFwcGVyKCBjb3VudEl0LT5zZWNvbmQuYWxsKCksIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEluZGVudCggMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggb3NzLnN0cigpLnNpemUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xMCApICk7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IG9zcy5zdHIoKSA8PCB3cmFwcGVyIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIHRhZ0NvdW50cy5zaXplKCksICJ0YWciICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiB0YWdDb3VudHMuc2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0UmVwb3J0ZXJzKCBDb25maWcgY29uc3QmIC8qY29uZmlnKi8gKSB7CisgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkF2YWlsYWJsZSByZXBvcnRlcnM6XG4iOworICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6RmFjdG9yeU1hcCBjb25zdCYgZmFjdG9yaWVzID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuZ2V0RmFjdG9yaWVzKCk7CisgICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpGYWN0b3J5TWFwOjpjb25zdF9pdGVyYXRvciBpdEJlZ2luID0gZmFjdG9yaWVzLmJlZ2luKCksIGl0RW5kID0gZmFjdG9yaWVzLmVuZCgpLCBpdDsKKyAgICAgICAgc3RkOjpzaXplX3QgbWF4TmFtZUxlbiA9IDA7CisgICAgICAgIGZvcihpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgIG1heE5hbWVMZW4gPSAoc3RkOjptYXgpKCBtYXhOYW1lTGVuLCBpdC0+Zmlyc3Quc2l6ZSgpICk7CisKKyAgICAgICAgZm9yKGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICBUZXh0IHdyYXBwZXIoIGl0LT5zZWNvbmQtPmdldERlc2NyaXB0aW9uKCksIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCA3K21heE5hbWVMZW4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIIC0gbWF4TmFtZUxlbi04ICkgKTsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIiAgIgorICAgICAgICAgICAgICAgICAgICA8PCBpdC0+Zmlyc3QKKyAgICAgICAgICAgICAgICAgICAgPDwgJzonCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6c3RyaW5nKCBtYXhOYW1lTGVuIC0gaXQtPmZpcnN0LnNpemUoKSArIDIsICcgJyApCisgICAgICAgICAgICAgICAgICAgIDw8IHdyYXBwZXIgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcmllcy5zaXplKCk7CisgICAgfQorCisgICAgaW5saW5lIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdCggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdGVkQ291bnQ7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRlc3RzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRlc3RzKCBjb25maWcgKTsKKyAgICAgICAgaWYoIGNvbmZpZy5saXN0VGVzdE5hbWVzT25seSgpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RUZXN0c05hbWVzT25seSggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRhZ3MoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0VGFncyggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFJlcG9ydGVycygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RSZXBvcnRlcnMoIGNvbmZpZyApOworICAgICAgICByZXR1cm4gbGlzdGVkQ291bnQ7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3J1bl9jb250ZXh0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUlVOTkVSX0lNUExfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X2Nhc2VfdHJhY2tlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9UUkFDS0VSX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCitDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nIHsKKworICAgIHN0cnVjdCBOYW1lQW5kTG9jYXRpb24geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsb2NhdGlvbjsKKworICAgICAgICBOYW1lQW5kTG9jYXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwgU291cmNlTGluZUluZm8gY29uc3QmIF9sb2NhdGlvbiApCisgICAgICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICAgICAgbG9jYXRpb24oIF9sb2NhdGlvbiApCisgICAgICAgIHt9CisgICAgfTsKKworICAgIHN0cnVjdCBJVHJhY2tlciA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgIHZpcnR1YWwgfklUcmFja2VyKCk7CisKKyAgICAgICAgLy8gc3RhdGljIHF1ZXJpZXMKKyAgICAgICAgdmlydHVhbCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbigpIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBkeW5hbWljIHF1ZXJpZXMKKyAgICAgICAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdCA9IDA7IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb3IgZmFpbGVkCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzT3BlbigpIGNvbnN0ID0gMDsgLy8gU3RhcnRlZCBidXQgbm90IGNvbXBsZXRlCisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIElUcmFja2VyJiBwYXJlbnQoKSA9IDA7CisKKyAgICAgICAgLy8gYWN0aW9ucworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZQorICAgICAgICB2aXJ0dWFsIHZvaWQgZmFpbCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZCggUHRyPElUcmFja2VyPiBjb25zdCYgY2hpbGQgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXIqIGZpbmRDaGlsZCggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvcGVuQ2hpbGQoKSA9IDA7CisKKyAgICAgICAgLy8gRGVidWcvIGNoZWNraW5nCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbmRleFRyYWNrZXIoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGNsYXNzICBUcmFja2VyQ29udGV4dCB7CisKKyAgICAgICAgZW51bSBSdW5TdGF0ZSB7CisgICAgICAgICAgICBOb3RTdGFydGVkLAorICAgICAgICAgICAgRXhlY3V0aW5nLAorICAgICAgICAgICAgQ29tcGxldGVkQ3ljbGUKKyAgICAgICAgfTsKKworICAgICAgICBQdHI8SVRyYWNrZXI+IG1fcm9vdFRyYWNrZXI7CisgICAgICAgIElUcmFja2VyKiBtX2N1cnJlbnRUcmFja2VyOworICAgICAgICBSdW5TdGF0ZSBtX3J1blN0YXRlOworCisgICAgcHVibGljOgorCisgICAgICAgIHN0YXRpYyBUcmFja2VyQ29udGV4dCYgaW5zdGFuY2UoKSB7CisgICAgICAgICAgICBzdGF0aWMgVHJhY2tlckNvbnRleHQgc19pbnN0YW5jZTsKKyAgICAgICAgICAgIHJldHVybiBzX2luc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgVHJhY2tlckNvbnRleHQoKQorICAgICAgICA6ICAgbV9jdXJyZW50VHJhY2tlciggQ0FUQ0hfTlVMTCApLAorICAgICAgICAgICAgbV9ydW5TdGF0ZSggTm90U3RhcnRlZCApCisgICAgICAgIHt9CisKKyAgICAgICAgSVRyYWNrZXImIHN0YXJ0UnVuKCk7CisKKyAgICAgICAgdm9pZCBlbmRSdW4oKSB7CisgICAgICAgICAgICBtX3Jvb3RUcmFja2VyLnJlc2V0KCk7CisgICAgICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBOb3RTdGFydGVkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzdGFydEN5Y2xlKCkgeworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IG1fcm9vdFRyYWNrZXIuZ2V0KCk7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICB9CisgICAgICAgIHZvaWQgY29tcGxldGVDeWNsZSgpIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRDeWNsZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgY29tcGxldGVkQ3ljbGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRDeWNsZTsKKyAgICAgICAgfQorICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gKm1fY3VycmVudFRyYWNrZXI7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRDdXJyZW50VHJhY2tlciggSVRyYWNrZXIqIHRyYWNrZXIgKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gdHJhY2tlcjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBUcmFja2VyQmFzZSA6IHB1YmxpYyBJVHJhY2tlciB7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIEN5Y2xlU3RhdGUgeworICAgICAgICAgICAgTm90U3RhcnRlZCwKKyAgICAgICAgICAgIEV4ZWN1dGluZywKKyAgICAgICAgICAgIEV4ZWN1dGluZ0NoaWxkcmVuLAorICAgICAgICAgICAgTmVlZHNBbm90aGVyUnVuLAorICAgICAgICAgICAgQ29tcGxldGVkU3VjY2Vzc2Z1bGx5LAorICAgICAgICAgICAgRmFpbGVkCisgICAgICAgIH07CisgICAgICAgIGNsYXNzIFRyYWNrZXJIYXNOYW1lIHsKKyAgICAgICAgICAgIE5hbWVBbmRMb2NhdGlvbiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgVHJhY2tlckhhc05hbWUoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgOiBtX25hbWVBbmRMb2NhdGlvbiggbmFtZUFuZExvY2F0aW9uICkge30KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgKCkoIFB0cjxJVHJhY2tlcj4gY29uc3QmIHRyYWNrZXIgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIHRyYWNrZXItPm5hbWVBbmRMb2NhdGlvbigpLm5hbWUgPT0gbV9uYW1lQW5kTG9jYXRpb24ubmFtZSAmJgorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5uYW1lQW5kTG9jYXRpb24oKS5sb2NhdGlvbiA9PSBtX25hbWVBbmRMb2NhdGlvbi5sb2NhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8SVRyYWNrZXI+ID4gQ2hpbGRyZW47CisgICAgICAgIE5hbWVBbmRMb2NhdGlvbiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgVHJhY2tlckNvbnRleHQmIG1fY3R4OworICAgICAgICBJVHJhY2tlciogbV9wYXJlbnQ7CisgICAgICAgIENoaWxkcmVuIG1fY2hpbGRyZW47CisgICAgICAgIEN5Y2xlU3RhdGUgbV9ydW5TdGF0ZTsKKyAgICBwdWJsaWM6CisgICAgICAgIFRyYWNrZXJCYXNlKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCApCisgICAgICAgIDogICBtX25hbWVBbmRMb2NhdGlvbiggbmFtZUFuZExvY2F0aW9uICksCisgICAgICAgICAgICBtX2N0eCggY3R4ICksCisgICAgICAgICAgICBtX3BhcmVudCggcGFyZW50ICksCisgICAgICAgICAgICBtX3J1blN0YXRlKCBOb3RTdGFydGVkICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VHJhY2tlckJhc2UoKTsKKworICAgICAgICB2aXJ0dWFsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fbmFtZUFuZExvY2F0aW9uOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5IHx8IG1fcnVuU3RhdGUgPT0gRmFpbGVkOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgIT0gTm90U3RhcnRlZCAmJiAhaXNDb21wbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiAhbV9jaGlsZHJlbi5lbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKCBQdHI8SVRyYWNrZXI+IGNvbnN0JiBjaGlsZCApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fY2hpbGRyZW4ucHVzaF9iYWNrKCBjaGlsZCApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciogZmluZENoaWxkKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIENoaWxkcmVuOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0ZDo6ZmluZF9pZiggbV9jaGlsZHJlbi5iZWdpbigpLCBtX2NoaWxkcmVuLmVuZCgpLCBUcmFja2VySGFzTmFtZSggbmFtZUFuZExvY2F0aW9uICkgKTsKKyAgICAgICAgICAgIHJldHVybiggaXQgIT0gbV9jaGlsZHJlbi5lbmQoKSApCisgICAgICAgICAgICAgICAgPyBpdC0+Z2V0KCkKKyAgICAgICAgICAgICAgICA6IENBVENIX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciYgcGFyZW50KCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgYXNzZXJ0KCBtX3BhcmVudCApOyAvLyBTaG91bGQgYWx3YXlzIGJlIG5vbi1udWxsIGV4Y2VwdCBmb3Igcm9vdAorICAgICAgICAgICAgcmV0dXJuICptX3BhcmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBvcGVuQ2hpbGQoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggbV9ydW5TdGF0ZSAhPSBFeGVjdXRpbmdDaGlsZHJlbiApIHsKKyAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nQ2hpbGRyZW47CisgICAgICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm9wZW5DaGlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbmRleFRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgIHZvaWQgb3BlbigpIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgICAgICBtb3ZlVG9UaGlzKCk7CisgICAgICAgICAgICBpZiggbV9wYXJlbnQgKQorICAgICAgICAgICAgICAgIG1fcGFyZW50LT5vcGVuQ2hpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIENBVENIX09WRVJSSURFIHsKKworICAgICAgICAgICAgLy8gQ2xvc2UgYW55IHN0aWxsIG9wZW4gY2hpbGRyZW4gKGUuZy4gZ2VuZXJhdG9ycykKKyAgICAgICAgICAgIHdoaWxlKCAmbV9jdHguY3VycmVudFRyYWNrZXIoKSAhPSB0aGlzICkKKyAgICAgICAgICAgICAgICBtX2N0eC5jdXJyZW50VHJhY2tlcigpLmNsb3NlKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCggbV9ydW5TdGF0ZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vdFN0YXJ0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk6CisgICAgICAgICAgICAgICAgY2FzZSBGYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJJbGxvZ2ljYWwgc3RhdGUiICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5lZWRzQW5vdGhlclJ1bjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7OworCisgICAgICAgICAgICAgICAgY2FzZSBFeGVjdXRpbmc6CisgICAgICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhlY3V0aW5nQ2hpbGRyZW46CisgICAgICAgICAgICAgICAgICAgIGlmKCBtX2NoaWxkcmVuLmVtcHR5KCkgfHwgbV9jaGlsZHJlbi5iYWNrKCktPmlzQ29tcGxldGUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmV4cGVjdGVkIHN0YXRlIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW92ZVRvUGFyZW50KCk7CisgICAgICAgICAgICBtX2N0eC5jb21wbGV0ZUN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIGZhaWwoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRmFpbGVkOworICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+bWFya0FzTmVlZGluZ0Fub3RoZXJSdW4oKTsKKyAgICAgICAgICAgIG1vdmVUb1BhcmVudCgpOworICAgICAgICAgICAgbV9jdHguY29tcGxldGVDeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBtYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBOZWVkc0Fub3RoZXJSdW47CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG1vdmVUb1BhcmVudCgpIHsKKyAgICAgICAgICAgIGFzc2VydCggbV9wYXJlbnQgKTsKKyAgICAgICAgICAgIG1fY3R4LnNldEN1cnJlbnRUcmFja2VyKCBtX3BhcmVudCApOworICAgICAgICB9CisgICAgICAgIHZvaWQgbW92ZVRvVGhpcygpIHsKKyAgICAgICAgICAgIG1fY3R4LnNldEN1cnJlbnRUcmFja2VyKCB0aGlzICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgU2VjdGlvblRyYWNrZXIgOiBwdWJsaWMgVHJhY2tlckJhc2UgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9maWx0ZXJzOworICAgIHB1YmxpYzoKKyAgICAgICAgU2VjdGlvblRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50ICkKKyAgICAgICAgOiAgIFRyYWNrZXJCYXNlKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgcGFyZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBhcmVudCApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSggIXBhcmVudC0+aXNTZWN0aW9uVHJhY2tlcigpICkKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gJnBhcmVudC0+cGFyZW50KCk7CisKKyAgICAgICAgICAgICAgICBTZWN0aW9uVHJhY2tlciYgcGFyZW50U2VjdGlvbiA9IHN0YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyJj4oICpwYXJlbnQgKTsKKyAgICAgICAgICAgICAgICBhZGROZXh0RmlsdGVycyggcGFyZW50U2VjdGlvbi5tX2ZpbHRlcnMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5TZWN0aW9uVHJhY2tlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIHN0YXRpYyBTZWN0aW9uVHJhY2tlciYgYWNxdWlyZSggVHJhY2tlckNvbnRleHQmIGN0eCwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSB7CisgICAgICAgICAgICBTZWN0aW9uVHJhY2tlciogc2VjdGlvbiA9IENBVENIX05VTEw7CisKKyAgICAgICAgICAgIElUcmFja2VyJiBjdXJyZW50VHJhY2tlciA9IGN0eC5jdXJyZW50VHJhY2tlcigpOworICAgICAgICAgICAgaWYoIElUcmFja2VyKiBjaGlsZFRyYWNrZXIgPSBjdXJyZW50VHJhY2tlci5maW5kQ2hpbGQoIG5hbWVBbmRMb2NhdGlvbiApICkgeworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXItPmlzU2VjdGlvblRyYWNrZXIoKSApOworICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlcio+KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBuZXcgU2VjdGlvblRyYWNrZXIoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCAmY3VycmVudFRyYWNrZXIgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2tlci5hZGRDaGlsZCggc2VjdGlvbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFjdHguY29tcGxldGVkQ3ljbGUoKSApCisgICAgICAgICAgICAgICAgc2VjdGlvbi0+dHJ5T3BlbigpOworICAgICAgICAgICAgcmV0dXJuICpzZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0cnlPcGVuKCkgeworICAgICAgICAgICAgaWYoICFpc0NvbXBsZXRlKCkgJiYgKG1fZmlsdGVycy5lbXB0eSgpIHx8IG1fZmlsdGVyc1swXS5lbXB0eSgpIHx8ICBtX2ZpbHRlcnNbMF0gPT0gbV9uYW1lQW5kTG9jYXRpb24ubmFtZSApICkKKyAgICAgICAgICAgICAgICBvcGVuKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZEluaXRpYWxGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGZpbHRlcnMgKSB7CisgICAgICAgICAgICBpZiggIWZpbHRlcnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMucHVzaF9iYWNrKCIiKTsgLy8gUm9vdCAtIHNob3VsZCBuZXZlciBiZSBjb25zdWx0ZWQKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMucHVzaF9iYWNrKCIiKTsgLy8gVGVzdCBDYXNlIC0gbm90IGEgc2VjdGlvbiBmaWx0ZXIKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMuaW5zZXJ0KCBtX2ZpbHRlcnMuZW5kKCksIGZpbHRlcnMuYmVnaW4oKSwgZmlsdGVycy5lbmQoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgYWRkTmV4dEZpbHRlcnMoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZmlsdGVycyApIHsKKyAgICAgICAgICAgIGlmKCBmaWx0ZXJzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgIG1fZmlsdGVycy5pbnNlcnQoIG1fZmlsdGVycy5lbmQoKSwgKytmaWx0ZXJzLmJlZ2luKCksIGZpbHRlcnMuZW5kKCkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBJbmRleFRyYWNrZXIgOiBwdWJsaWMgVHJhY2tlckJhc2UgeworICAgICAgICBpbnQgbV9zaXplOworICAgICAgICBpbnQgbV9pbmRleDsKKyAgICBwdWJsaWM6CisgICAgICAgIEluZGV4VHJhY2tlciggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQsIGludCBzaXplICkKKyAgICAgICAgOiAgIFRyYWNrZXJCYXNlKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgcGFyZW50ICksCisgICAgICAgICAgICBtX3NpemUoIHNpemUgKSwKKyAgICAgICAgICAgIG1faW5kZXgoIC0xICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+SW5kZXhUcmFja2VyKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIHN0YXRpYyBJbmRleFRyYWNrZXImIGFjcXVpcmUoIFRyYWNrZXJDb250ZXh0JiBjdHgsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBpbnQgc2l6ZSApIHsKKyAgICAgICAgICAgIEluZGV4VHJhY2tlciogdHJhY2tlciA9IENBVENIX05VTEw7CisKKyAgICAgICAgICAgIElUcmFja2VyJiBjdXJyZW50VHJhY2tlciA9IGN0eC5jdXJyZW50VHJhY2tlcigpOworICAgICAgICAgICAgaWYoIElUcmFja2VyKiBjaGlsZFRyYWNrZXIgPSBjdXJyZW50VHJhY2tlci5maW5kQ2hpbGQoIG5hbWVBbmRMb2NhdGlvbiApICkgeworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXItPmlzSW5kZXhUcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICB0cmFja2VyID0gc3RhdGljX2Nhc3Q8SW5kZXhUcmFja2VyKj4oIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2tlciA9IG5ldyBJbmRleFRyYWNrZXIoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCAmY3VycmVudFRyYWNrZXIsIHNpemUgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2tlci5hZGRDaGlsZCggdHJhY2tlciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggIWN0eC5jb21wbGV0ZWRDeWNsZSgpICYmICF0cmFja2VyLT5pc0NvbXBsZXRlKCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIHRyYWNrZXItPm1fcnVuU3RhdGUgIT0gRXhlY3V0aW5nQ2hpbGRyZW4gJiYgdHJhY2tlci0+bV9ydW5TdGF0ZSAhPSBOZWVkc0Fub3RoZXJSdW4gKQorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5tb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgIHRyYWNrZXItPm9wZW4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICp0cmFja2VyOworICAgICAgICB9CisKKyAgICAgICAgaW50IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgICAgIHZvaWQgbW92ZU5leHQoKSB7CisgICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICBtX2NoaWxkcmVuLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBUcmFja2VyQmFzZTo6Y2xvc2UoKTsKKyAgICAgICAgICAgIGlmKCBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseSAmJiBtX2luZGV4IDwgbV9zaXplLTEgKQorICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgIH0KKyAgICB9OworCisgICAgaW5saW5lIElUcmFja2VyJiBUcmFja2VyQ29udGV4dDo6c3RhcnRSdW4oKSB7CisgICAgICAgIG1fcm9vdFRyYWNrZXIgPSBuZXcgU2VjdGlvblRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiggIntyb290fSIsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICksICp0aGlzLCBDQVRDSF9OVUxMICk7CisgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBDQVRDSF9OVUxMOworICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICByZXR1cm4gKm1fcm9vdFRyYWNrZXI7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nCisKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OklUcmFja2VyOwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6VHJhY2tlckNvbnRleHQ7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpTZWN0aW9uVHJhY2tlcjsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OkluZGV4VHJhY2tlcjsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ZhdGFsX2NvbmRpdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0ZBVEFMX0NPTkRJVElPTl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBSZXBvcnQgdGhlIGVycm9yIGNvbmRpdGlvbgorICAgIGlubGluZSB2b2lkIHJlcG9ydEZhdGFsKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgSUNvbnRleHQmIGNvbnRleHQgPSBDYXRjaDo6Z2V0Q3VycmVudENvbnRleHQoKTsKKyAgICAgICAgSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgPSBjb250ZXh0LmdldFJlc3VsdENhcHR1cmUoKTsKKyAgICAgICAgcmVzdWx0Q2FwdHVyZS0+aGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggbWVzc2FnZSApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmIGRlZmluZWQgKCBDQVRDSF9QTEFURk9STV9XSU5ET1dTICkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF93aW5kb3dzX2hfcHJveHkuaAorCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9XSU5ET1dTX0hfUFJPWFlfSF9JTkNMVURFRAorCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19OT01JTk1BWAorIyAgZGVmaW5lIE5PTUlOTUFYCisjZW5kaWYKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKworI2lmZGVmIF9fQUZYRExMCisjaW5jbHVkZSA8QWZ4V2luLmg+CisjZWxzZQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19OT01JTk1BWAorIyAgdW5kZWYgTk9NSU5NQVgKKyNlbmRpZgorI2lmZGVmIENBVENIX0RFRklORVNfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisKKworIyAgaWYgIWRlZmluZWQgKCBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggKQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworICAgICAgICB2b2lkIHJlc2V0KCkge30KKyAgICB9OworfQorCisjICBlbHNlIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCBpcyBkZWZpbmVkCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU2lnbmFsRGVmcyB7IERXT1JEIGlkOyBjb25zdCBjaGFyKiBuYW1lOyB9OworICAgIGV4dGVybiBTaWduYWxEZWZzIHNpZ25hbERlZnNbXTsKKyAgICAvLyBUaGVyZSBpcyBubyAxLTEgbWFwcGluZyBiZXR3ZWVuIHNpZ25hbHMgYW5kIHdpbmRvd3MgZXhjZXB0aW9ucy4KKyAgICAvLyBXaW5kb3dzIGNhbiBlYXNpbHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBTTyBhbmQgU2lnU2VnViwKKyAgICAvLyBidXQgU2lnSW50LCBTaWdUZXJtLCBldGMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuCisgICAgU2lnbmFsRGVmcyBzaWduYWxEZWZzW10gPSB7CisgICAgICAgIHsgRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04sICAiU0lHSUxMIC0gSWxsZWdhbCBpbnN0cnVjdGlvbiBzaWduYWwiIH0sCisgICAgICAgIHsgRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XLCAiU0lHU0VHViAtIFN0YWNrIG92ZXJmbG93IiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OLCAiU0lHU0VHViAtIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gc2lnbmFsIiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8sICJEaXZpZGUgYnkgemVybyBlcnJvciIgfSwKKyAgICB9OworCisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisKKyAgICAgICAgc3RhdGljIExPTkcgQ0FMTEJBQ0sgaGFuZGxlVmVjdG9yZWRFeGNlcHRpb24oUEVYQ0VQVElPTl9QT0lOVEVSUyBFeGNlcHRpb25JbmZvKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKSAvIHNpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKEV4Y2VwdGlvbkluZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZSA9PSBzaWduYWxEZWZzW2ldLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydEZhdGFsKHNpZ25hbERlZnNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgaXRzIG5vdCBhbiBleGNlcHRpb24gd2UgY2FyZSBhYm91dCwgcGFzcyBpdCBhbG9uZy4KKyAgICAgICAgICAgIC8vIFRoaXMgc3RvcHMgdXMgZnJvbSBlYXRpbmcgZGVidWdnZXIgYnJlYWtzIGV0Yy4KKyAgICAgICAgICAgIHJldHVybiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworICAgICAgICB9CisKKyAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgaXNTZXQgPSB0cnVlOworICAgICAgICAgICAgLy8gMzJrIHNlZW1zIGVub3VnaCBmb3IgQ2F0Y2ggdG8gaGFuZGxlIHN0YWNrIG92ZXJmbG93LAorICAgICAgICAgICAgLy8gYnV0IHRoZSB2YWx1ZSB3YXMgZm91bmQgZXhwZXJpbWVudGFsbHksIHNvIHRoZXJlIGlzIG5vIHN0cm9uZyBndWFyYW50ZWUKKyAgICAgICAgICAgIGd1YXJhbnRlZVNpemUgPSAzMiAqIDEwMjQ7CisgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGFzIGZpcnN0IGhhbmRsZXIgaW4gY3VycmVudCBjaGFpbgorICAgICAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IEFkZFZlY3RvcmVkRXhjZXB0aW9uSGFuZGxlcigxLCBoYW5kbGVWZWN0b3JlZEV4Y2VwdGlvbik7CisgICAgICAgICAgICAvLyBQYXNzIGluIGd1YXJhbnRlZSBzaXplIHRvIGJlIGZpbGxlZAorICAgICAgICAgICAgU2V0VGhyZWFkU3RhY2tHdWFyYW50ZWUoJmd1YXJhbnRlZVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiAoaXNTZXQpIHsKKyAgICAgICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIGhhbmRsZXIgYW5kIHJlc3RvcmUgdGhlIG9sZCBndWFyYW50ZWUKKyAgICAgICAgICAgICAgICBSZW1vdmVWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoZXhjZXB0aW9uSGFuZGxlckhhbmRsZSk7CisgICAgICAgICAgICAgICAgU2V0VGhyZWFkU3RhY2tHdWFyYW50ZWUoJmd1YXJhbnRlZVNpemUpOworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgICAgIGlzU2V0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB+RmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyBib29sIGlzU2V0OworICAgICAgICBzdGF0aWMgVUxPTkcgZ3VhcmFudGVlU2l6ZTsKKyAgICAgICAgc3RhdGljIFBWT0lEIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGU7CisgICAgfTsKKworICAgIGJvb2wgRmF0YWxDb25kaXRpb25IYW5kbGVyOjppc1NldCA9IGZhbHNlOworICAgIFVMT05HIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6Z3VhcmFudGVlU2l6ZSA9IDA7CisgICAgUFZPSUQgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworIyAgZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VICisKKyNlbHNlIC8vIE5vdCBXaW5kb3dzIC0gYXNzdW1lZCB0byBiZSBQT1NJWCBjb21wYXRpYmxlIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTKQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworICAgICAgICB2b2lkIHJlc2V0KCkge30KKyAgICB9OworfQorCisjICBlbHNlIC8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTIGlzIGRlZmluZWQKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNpZ25hbERlZnMgeworICAgICAgICBpbnQgaWQ7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgfTsKKyAgICBleHRlcm4gU2lnbmFsRGVmcyBzaWduYWxEZWZzW107CisgICAgU2lnbmFsRGVmcyBzaWduYWxEZWZzW10gPSB7CisgICAgICAgICAgICB7IFNJR0lOVCwgICJTSUdJTlQgLSBUZXJtaW5hbCBpbnRlcnJ1cHQgc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdJTEwsICAiU0lHSUxMIC0gSWxsZWdhbCBpbnN0cnVjdGlvbiBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR0ZQRSwgICJTSUdGUEUgLSBGbG9hdGluZyBwb2ludCBlcnJvciBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR1NFR1YsICJTSUdTRUdWIC0gU2VnbWVudGF0aW9uIHZpb2xhdGlvbiBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR1RFUk0sICJTSUdURVJNIC0gVGVybWluYXRpb24gcmVxdWVzdCBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR0FCUlQsICJTSUdBQlJUIC0gQWJvcnQgKGFibm9ybWFsIHRlcm1pbmF0aW9uKSBzaWduYWwiIH0KKyAgICB9OworCisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisKKyAgICAgICAgc3RhdGljIGJvb2wgaXNTZXQ7CisgICAgICAgIHN0YXRpYyBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZFNpZ0FjdGlvbnMgW3NpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyldOworICAgICAgICBzdGF0aWMgc3RhY2tfdCBvbGRTaWdTdGFjazsKKyAgICAgICAgc3RhdGljIGNoYXIgYWx0U3RhY2tNZW1bU0lHU1RLU1pdOworCisgICAgICAgIHN0YXRpYyB2b2lkIGhhbmRsZVNpZ25hbCggaW50IHNpZyApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSAiPHVua25vd24gc2lnbmFsPiI7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpIC8gc2l6ZW9mKFNpZ25hbERlZnMpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTaWduYWxEZWZzICZkZWYgPSBzaWduYWxEZWZzW2ldOworICAgICAgICAgICAgICAgIGlmIChzaWcgPT0gZGVmLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkZWYubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIHJlcG9ydEZhdGFsKG5hbWUpOworICAgICAgICAgICAgcmFpc2UoIHNpZyApOworICAgICAgICB9CisKKyAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgaXNTZXQgPSB0cnVlOworICAgICAgICAgICAgc3RhY2tfdCBzaWdTdGFjazsKKyAgICAgICAgICAgIHNpZ1N0YWNrLnNzX3NwID0gYWx0U3RhY2tNZW07CisgICAgICAgICAgICBzaWdTdGFjay5zc19zaXplID0gU0lHU1RLU1o7CisgICAgICAgICAgICBzaWdTdGFjay5zc19mbGFncyA9IDA7CisgICAgICAgICAgICBzaWdhbHRzdGFjaygmc2lnU3RhY2ssICZvbGRTaWdTdGFjayk7CisgICAgICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhID0geyAwIH07CisKKyAgICAgICAgICAgIHNhLnNhX2hhbmRsZXIgPSBoYW5kbGVTaWduYWw7CisgICAgICAgICAgICBzYS5zYV9mbGFncyA9IFNBX09OU1RBQ0s7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgc2lnYWN0aW9uKHNpZ25hbERlZnNbaV0uaWQsICZzYSwgJm9sZFNpZ0FjdGlvbnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgfkZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggaXNTZXQgKSB7CisgICAgICAgICAgICAgICAgLy8gU2V0IHNpZ25hbHMgYmFjayB0byBwcmV2aW91cyB2YWx1ZXMgLS0gaG9wZWZ1bGx5IG5vYm9keSBvdmVyd3JvdGUgdGhlbSBpbiB0aGUgbWVhbnRpbWUKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBzaWdhY3Rpb24oc2lnbmFsRGVmc1tpXS5pZCwgJm9sZFNpZ0FjdGlvbnNbaV0sIENBVENIX05VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG9sZCBzdGFjaworICAgICAgICAgICAgICAgIHNpZ2FsdHN0YWNrKCZvbGRTaWdTdGFjaywgQ0FUQ0hfTlVMTCk7CisgICAgICAgICAgICAgICAgaXNTZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBib29sIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6aXNTZXQgPSBmYWxzZTsKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6b2xkU2lnQWN0aW9uc1tzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpXSA9IHt9OworICAgIHN0YWNrX3QgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpvbGRTaWdTdGFjayA9IHt9OworICAgIGNoYXIgRmF0YWxDb25kaXRpb25IYW5kbGVyOjphbHRTdGFja01lbVtTSUdTVEtTWl0gPSB7fTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworIyAgZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMKKworI2VuZGlmIC8vIG5vdCBXaW5kb3dzCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU3RyZWFtUmVkaXJlY3QgeworCisgICAgcHVibGljOgorICAgICAgICBTdHJlYW1SZWRpcmVjdCggc3RkOjpvc3RyZWFtJiBzdHJlYW0sIHN0ZDo6c3RyaW5nJiB0YXJnZXRTdHJpbmcgKQorICAgICAgICA6ICAgbV9zdHJlYW0oIHN0cmVhbSApLAorICAgICAgICAgICAgbV9wcmV2QnVmKCBzdHJlYW0ucmRidWYoKSApLAorICAgICAgICAgICAgbV90YXJnZXRTdHJpbmcoIHRhcmdldFN0cmluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbS5yZGJ1ZiggbV9vc3MucmRidWYoKSApOworICAgICAgICB9CisKKyAgICAgICAgflN0cmVhbVJlZGlyZWN0KCkgeworICAgICAgICAgICAgbV90YXJnZXRTdHJpbmcgKz0gbV9vc3Muc3RyKCk7CisgICAgICAgICAgICBtX3N0cmVhbS5yZGJ1ZiggbV9wcmV2QnVmICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgbV9zdHJlYW07CisgICAgICAgIHN0ZDo6c3RyZWFtYnVmKiBtX3ByZXZCdWY7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBtX29zczsKKyAgICAgICAgc3RkOjpzdHJpbmcmIG1fdGFyZ2V0U3RyaW5nOworICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGNsYXNzIFJ1bkNvbnRleHQgOiBwdWJsaWMgSVJlc3VsdENhcHR1cmUsIHB1YmxpYyBJUnVubmVyIHsKKworICAgICAgICBSdW5Db250ZXh0KCBSdW5Db250ZXh0IGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yID0oIFJ1bkNvbnRleHQgY29uc3QmICk7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgZXhwbGljaXQgUnVuQ29udGV4dCggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfY29uZmlnLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgcmVwb3J0ZXIgKQorICAgICAgICA6ICAgbV9ydW5JbmZvKCBfY29uZmlnLT5uYW1lKCkgKSwKKyAgICAgICAgICAgIG1fY29udGV4dCggZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkgKSwKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UoIENBVENIX05VTEwgKSwKKyAgICAgICAgICAgIG1fY29uZmlnKCBfY29uZmlnICksCisgICAgICAgICAgICBtX3JlcG9ydGVyKCByZXBvcnRlciApLAorICAgICAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkICggdHJ1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fY29udGV4dC5zZXRSdW5uZXIoIHRoaXMgKTsKKyAgICAgICAgICAgIG1fY29udGV4dC5zZXRDb25maWcoIG1fY29uZmlnICk7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0UmVzdWx0Q2FwdHVyZSggdGhpcyApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1blN0YXJ0aW5nKCBtX3J1bkluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflJ1bkNvbnRleHQoKSB7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyggbV9ydW5JbmZvLCBtX3RvdGFscywgYWJvcnRpbmcoKSApICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdFNwZWMsIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXgsIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50ICkgeworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyggdGVzdFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50ICkgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHRlc3RHcm91cEVuZGVkKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdFNwZWMsIFRvdGFscyBjb25zdCYgdG90YWxzLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCApIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvKCB0ZXN0U3BlYywgZ3JvdXBJbmRleCwgZ3JvdXBzQ291bnQgKSwgdG90YWxzLCBhYm9ydGluZygpICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFscyBydW5UZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UgKSB7CisgICAgICAgICAgICBUb3RhbHMgcHJldlRvdGFscyA9IG1fdG90YWxzOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZWRpcmVjdGVkQ291dDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlZGlyZWN0ZWRDZXJyOworCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gdGVzdEluZm8gPSB0ZXN0Q2FzZS5nZXRUZXN0Q2FzZUluZm8oKTsKKworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VTdGFydGluZyggdGVzdEluZm8gKTsKKworICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSA9ICZ0ZXN0Q2FzZTsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIElUcmFja2VyJiByb290VHJhY2tlciA9IG1fdHJhY2tlckNvbnRleHQuc3RhcnRSdW4oKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHJvb3RUcmFja2VyLmlzU2VjdGlvblRyYWNrZXIoKSApOworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyJj4oIHJvb3RUcmFja2VyICkuYWRkSW5pdGlhbEZpbHRlcnMoIG1fY29uZmlnLT5nZXRTZWN0aW9uc1RvUnVuKCkgKTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIG1fdHJhY2tlckNvbnRleHQuc3RhcnRDeWNsZSgpOworICAgICAgICAgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlciA9ICZTZWN0aW9uVHJhY2tlcjo6YWNxdWlyZSggbV90cmFja2VyQ29udGV4dCwgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uKCB0ZXN0SW5mby5uYW1lLCB0ZXN0SW5mby5saW5lSW5mbyApICk7CisgICAgICAgICAgICAgICAgICAgIHJ1bkN1cnJlbnRUZXN0KCByZWRpcmVjdGVkQ291dCwgcmVkaXJlY3RlZENlcnIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoICFtX3Rlc3RDYXNlVHJhY2tlci0+aXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSAmJiAhYWJvcnRpbmcoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gIVRCRDogZGVwcmVjYXRlZCAtIHRoaXMgd2lsbCBiZSByZXBsYWNlZCBieSBpbmRleGVkIHRyYWNrZXJzCisgICAgICAgICAgICB3aGlsZSggZ2V0Q3VycmVudENvbnRleHQoKS5hZHZhbmNlR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgJiYgIWFib3J0aW5nKCkgKTsKKworICAgICAgICAgICAgVG90YWxzIGRlbHRhVG90YWxzID0gbV90b3RhbHMuZGVsdGEoIHByZXZUb3RhbHMgKTsKKyAgICAgICAgICAgIGlmKCB0ZXN0SW5mby5leHBlY3RlZFRvRmFpbCgpICYmIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgPiAwICkgeworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLnBhc3NlZC0tOworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5mYWlsZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fdG90YWxzLnRlc3RDYXNlcyArPSBkZWx0YVRvdGFscy50ZXN0Q2FzZXM7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzKCAgIHRlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVRvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZENvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWRDZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGluZygpICkgKTsKKworICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSA9IENBVENIX05VTEw7CisgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlciA9IENBVENIX05VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBkZWx0YVRvdGFsczsKKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jb25maWc7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6IC8vIElSZXN1bHRDYXB0dXJlCisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApIHsKKyAgICAgICAgICAgIGlmKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpID09IFJlc3VsdFdhczo6T2sgKSB7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoICFyZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gdXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlICh3aGV0aGVyIG1lc3NhZ2VzIHNob3VsZCBiZSBjbGVhcmVkKSwgYmVjYXVzZSBtZXNzYWdlcyB3ZXJlIG1hZGUgc2NvcGVkCisgICAgICAgICAgICAvLyBhbmQgc2hvdWxkIGJlIGxldCB0byBjbGVhciB0aGVtc2VsdmVzIG91dC4KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KG1fcmVwb3J0ZXItPmFzc2VydGlvbkVuZGVkKEFzc2VydGlvblN0YXRzKHJlc3VsdCwgbV9tZXNzYWdlcywgbV90b3RhbHMpKSk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHdvcmtpbmcgc3RhdGUKKyAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8gPSBBc3NlcnRpb25JbmZvKCBzdGQ6OnN0cmluZygpLCBtX2xhc3RBc3NlcnRpb25JbmZvLmxpbmVJbmZvLCAie1Vua25vd24gZXhwcmVzc2lvbiBhZnRlciB0aGUgcmVwb3J0ZWQgbGluZX0iICwgbV9sYXN0QXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgICAgICAgICAgbV9sYXN0UmVzdWx0ID0gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIHNlY3Rpb25TdGFydGVkICgKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbywKKyAgICAgICAgICAgIENvdW50cyYgYXNzZXJ0aW9ucworICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmFja2VyJiBzZWN0aW9uVHJhY2tlciA9IFNlY3Rpb25UcmFja2VyOjphY3F1aXJlKCBtX3RyYWNrZXJDb250ZXh0LCBUZXN0Q2FzZVRyYWNraW5nOjpOYW1lQW5kTG9jYXRpb24oIHNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25JbmZvLmxpbmVJbmZvICkgKTsKKyAgICAgICAgICAgIGlmKCAhc2VjdGlvblRyYWNrZXIuaXNPcGVuKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucHVzaF9iYWNrKCAmc2VjdGlvblRyYWNrZXIgKTsKKworICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbyA9IHNlY3Rpb25JbmZvLmxpbmVJbmZvOworCisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7CisKKyAgICAgICAgICAgIGFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggQ291bnRzJiBhc3NlcnRpb25zICkgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvbnMudG90YWwoKSAhPSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT53YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiggbV90cmFja2VyQ29udGV4dC5jdXJyZW50VHJhY2tlcigpLmhhc0NoaWxkcmVuKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICBhc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApIHsKKyAgICAgICAgICAgIENvdW50cyBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9ucyAtIGVuZEluZm8ucHJldkFzc2VydGlvbnM7CisgICAgICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zID0gdGVzdEZvck1pc3NpbmdBc3NlcnRpb25zKCBhc3NlcnRpb25zICk7CisKKyAgICAgICAgICAgIGlmKCAhbV9hY3RpdmVTZWN0aW9ucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5jbG9zZSgpOworICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMoIGVuZEluZm8uc2VjdGlvbkluZm8sIGFzc2VydGlvbnMsIGVuZEluZm8uZHVyYXRpb25JblNlY29uZHMsIG1pc3NpbmdBc3NlcnRpb25zICkgKTsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWRFYXJseSggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSB7CisgICAgICAgICAgICBpZiggbV91bmZpbmlzaGVkU2VjdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5iYWNrKCktPmZhaWwoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+Y2xvc2UoKTsKKyAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucG9wX2JhY2soKTsKKworICAgICAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlvbnMucHVzaF9iYWNrKCBlbmRJbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcHVzaFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICAgICAgbV9tZXNzYWdlcy5wdXNoX2JhY2soIG1lc3NhZ2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBwb3BTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMuZXJhc2UoIHN0ZDo6cmVtb3ZlKCBtX21lc3NhZ2VzLmJlZ2luKCksIG1fbWVzc2FnZXMuZW5kKCksIG1lc3NhZ2UgKSwgbV9tZXNzYWdlcy5lbmQoKSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRDdXJyZW50VGVzdE5hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9hY3RpdmVUZXN0Q2FzZQorICAgICAgICAgICAgICAgID8gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCkubmFtZQorICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgY29uc3QgQXNzZXJ0aW9uUmVzdWx0KiBnZXRMYXN0UmVzdWx0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICZtX2xhc3RSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpIHsKKyAgICAgICAgICAgIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICAgICAgLy8gRG9uJ3QgcmVidWlsZCB0aGUgcmVzdWx0IC0tIHRoZSBzdHJpbmdpZmljYXRpb24gaXRzZWxmIGNhbiBjYXVzZSBtb3JlIGZhdGFsIGVycm9ycworICAgICAgICAgICAgLy8gSW5zdGVhZCwgZmFrZSBhIHJlc3VsdCBkYXRhLgorICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSB0ZW1wUmVzdWx0OworICAgICAgICAgICAgdGVtcFJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOworICAgICAgICAgICAgdGVtcFJlc3VsdC5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQobV9sYXN0QXNzZXJ0aW9uSW5mbywgdGVtcFJlc3VsdCk7CisKKyAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5hc3NlcnRpb25FbmRlZChyZXN1bHQpOworCisgICAgICAgICAgICBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKTsKKworICAgICAgICAgICAgLy8gUmVjcmVhdGUgc2VjdGlvbiBmb3IgdGVzdCBjYXNlIChhcyB3ZSB3aWxsIGxvc2UgdGhlIG9uZSB0aGF0IHdhcyBpbiBzY29wZSkKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyB0ZXN0Q2FzZVNlY3Rpb24oIHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENhc2VJbmZvLm5hbWUsIHRlc3RDYXNlSW5mby5kZXNjcmlwdGlvbiApOworCisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGFzc2VydGlvbnMuZmFpbGVkID0gMTsKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyggdGVzdENhc2VTZWN0aW9uLCBhc3NlcnRpb25zLCAwLCBmYWxzZSApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyApOworCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gdGVzdEluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKKworICAgICAgICAgICAgVG90YWxzIGRlbHRhVG90YWxzOworICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLmZhaWxlZCA9IDE7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzKCAgIHRlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVRvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKSApOworICAgICAgICAgICAgbV90b3RhbHMudGVzdENhc2VzLmZhaWxlZCsrOworICAgICAgICAgICAgdGVzdEdyb3VwRW5kZWQoIHN0ZDo6c3RyaW5nKCksIG1fdG90YWxzLCAxLCAxICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyggbV9ydW5JbmZvLCBtX3RvdGFscywgZmFsc2UgKSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIC8vICFUQkQgV2UgbmVlZCB0byBkbyB0aGlzIGFub3RoZXIgd2F5IQorICAgICAgICBib29sIGFib3J0aW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkID09IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggbV9jb25maWctPmFib3J0QWZ0ZXIoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIHZvaWQgcnVuQ3VycmVudFRlc3QoIHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ291dCwgc3RkOjpzdHJpbmcmIHJlZGlyZWN0ZWRDZXJyICkgeworICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIHRlc3RDYXNlU2VjdGlvbiggdGVzdENhc2VJbmZvLmxpbmVJbmZvLCB0ZXN0Q2FzZUluZm8ubmFtZSwgdGVzdENhc2VJbmZvLmRlc2NyaXB0aW9uICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uU3RhcnRpbmcoIHRlc3RDYXNlU2VjdGlvbiApOworICAgICAgICAgICAgQ291bnRzIHByZXZBc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGRvdWJsZSBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gQXNzZXJ0aW9uSW5mbyggIlRFU1RfQ0FTRSIsIHRlc3RDYXNlSW5mby5saW5lSW5mbywgc3RkOjpzdHJpbmcoKSwgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCApOworCisgICAgICAgICAgICAgICAgc2VlZFJuZyggKm1fY29uZmlnICk7CisKKyAgICAgICAgICAgICAgICBUaW1lciB0aW1lcjsKKyAgICAgICAgICAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgICAgICAgICAgIGlmKCBtX3JlcG9ydGVyLT5nZXRQcmVmZXJlbmNlcygpLnNob3VsZFJlZGlyZWN0U3RkT3V0ICkgeworICAgICAgICAgICAgICAgICAgICBTdHJlYW1SZWRpcmVjdCBjb3V0UmVkaXIoIENhdGNoOjpjb3V0KCksIHJlZGlyZWN0ZWRDb3V0ICk7CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbVJlZGlyZWN0IGNlcnJSZWRpciggQ2F0Y2g6OmNlcnIoKSwgcmVkaXJlY3RlZENlcnIgKTsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlQWN0aXZlVGVzdENhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludm9rZUFjdGl2ZVRlc3RDYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gdGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBUZXN0RmFpbHVyZUV4Y2VwdGlvbiYgKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBqdXN0IG1lYW5zIHRoZSB0ZXN0IHdhcyBhYm9ydGVkIGR1ZSB0byBmYWlsdXJlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCguLi4pIHsKKyAgICAgICAgICAgICAgICAvLyBVbmRlciBDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFLCB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgdW5kZXIgUkVRVUlSRSBhc3NlcnRpb25zCisgICAgICAgICAgICAgICAgLy8gYXJlIHJlcG9ydGVkIHdpdGhvdXQgdHJhbnNsYXRpb24gYXQgdGhlIHBvaW50IG9mIG9yaWdpbi4KKyAgICAgICAgICAgICAgICBpZiAobV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1ha2VVbmV4cGVjdGVkUmVzdWx0QnVpbGRlcigpLnVzZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fdGVzdENhc2VUcmFja2VyLT5jbG9zZSgpOworICAgICAgICAgICAgaGFuZGxlVW5maW5pc2hlZFNlY3Rpb25zKCk7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIENvdW50cyBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9ucyAtIHByZXZBc3NlcnRpb25zOworICAgICAgICAgICAgYm9vbCBtaXNzaW5nQXNzZXJ0aW9ucyA9IHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggYXNzZXJ0aW9ucyApOworCisgICAgICAgICAgICBpZiggdGVzdENhc2VJbmZvLm9rVG9GYWlsKCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzd2FwKCBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rLCBhc3NlcnRpb25zLmZhaWxlZCApOworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkIC09IGFzc2VydGlvbnMuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayArPSBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgdGVzdENhc2VTZWN0aW9uU3RhdHMoIHRlc3RDYXNlU2VjdGlvbiwgYXNzZXJ0aW9ucywgZHVyYXRpb24sIG1pc3NpbmdBc3NlcnRpb25zICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uRW5kZWQoIHRlc3RDYXNlU2VjdGlvblN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGludm9rZUFjdGl2ZVRlc3RDYXNlKCkgeworICAgICAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyIGZhdGFsQ29uZGl0aW9uSGFuZGxlcjsgLy8gSGFuZGxlIHNpZ25hbHMKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UtPmludm9rZSgpOworICAgICAgICAgICAgZmF0YWxDb25kaXRpb25IYW5kbGVyLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgUmVzdWx0QnVpbGRlciBtYWtlVW5leHBlY3RlZFJlc3VsdEJ1aWxkZXIoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0QnVpbGRlciggICBtX2xhc3RBc3NlcnRpb25JbmZvLm1hY3JvTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpIHsKKyAgICAgICAgICAgIC8vIElmIHNlY3Rpb25zIGVuZGVkIHByZW1hdHVyZWx5IGR1ZSB0byBhbiBleGNlcHRpb24gd2Ugc3RvcmVkIHRoZWlyCisgICAgICAgICAgICAvLyBpbmZvcyBoZXJlIHNvIHdlIGNhbiB0ZWFyIHRoZW0gZG93biBvdXRzaWRlIHRoZSB1bndpbmQgcHJvY2Vzcy4KKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8U2VjdGlvbkVuZEluZm8+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbV91bmZpbmlzaGVkU2VjdGlvbnMucmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fdW5maW5pc2hlZFNlY3Rpb25zLnJlbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIHNlY3Rpb25FbmRlZCggKml0ICk7CisgICAgICAgICAgICBtX3VuZmluaXNoZWRTZWN0aW9ucy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgVGVzdFJ1bkluZm8gbV9ydW5JbmZvOworICAgICAgICBJTXV0YWJsZUNvbnRleHQmIG1fY29udGV4dDsKKyAgICAgICAgVGVzdENhc2UgY29uc3QqIG1fYWN0aXZlVGVzdENhc2U7CisgICAgICAgIElUcmFja2VyKiBtX3Rlc3RDYXNlVHJhY2tlcjsKKyAgICAgICAgSVRyYWNrZXIqIG1fY3VycmVudFNlY3Rpb25UcmFja2VyOworICAgICAgICBBc3NlcnRpb25SZXN1bHQgbV9sYXN0UmVzdWx0OworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgVG90YWxzIG1fdG90YWxzOworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBtX3JlcG9ydGVyOworICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbV9tZXNzYWdlczsKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2xhc3RBc3NlcnRpb25JbmZvOworICAgICAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uRW5kSW5mbz4gbV91bmZpbmlzaGVkU2VjdGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPElUcmFja2VyKj4gbV9hY3RpdmVTZWN0aW9uczsKKyAgICAgICAgVHJhY2tlckNvbnRleHQgbV90cmFja2VyQ29udGV4dDsKKyAgICAgICAgYm9vbCBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQ7CisgICAgfTsKKworICAgIElSZXN1bHRDYXB0dXJlJiBnZXRSZXN1bHRDYXB0dXJlKCkgeworICAgICAgICBpZiggSVJlc3VsdENhcHR1cmUqIGNhcHR1cmUgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldFJlc3VsdENhcHR1cmUoKSApCisgICAgICAgICAgICByZXR1cm4gKmNhcHR1cmU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJObyByZXN1bHQgY2FwdHVyZSBpbnN0YW5jZSIgKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfdmVyc2lvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9WRVJTSU9OX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIFZlcnNpb25pbmcgaW5mb3JtYXRpb24KKyAgICBzdHJ1Y3QgVmVyc2lvbiB7CisgICAgICAgIFZlcnNpb24oICAgIHVuc2lnbmVkIGludCBfbWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX21pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9wYXRjaE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IF9icmFuY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX2J1aWxkTnVtYmVyICk7CisKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG1ham9yVmVyc2lvbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG1pbm9yVmVyc2lvbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IHBhdGNoTnVtYmVyOworCisgICAgICAgIC8vIGJ1aWxkTnVtYmVyIGlzIG9ubHkgdXNlZCBpZiBicmFuY2hOYW1lIGlzIG5vdCBudWxsCisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBicmFuY2hOYW1lOworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgYnVpbGROdW1iZXI7CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBWZXJzaW9uIGNvbnN0JiB2ZXJzaW9uICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG9wZXJhdG9yPSggVmVyc2lvbiBjb25zdCYgKTsKKyAgICB9OworCisgICAgaW5saW5lIFZlcnNpb24gbGlicmFyeVZlcnNpb24oKTsKK30KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY3JlYXRlUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBvcnRlck5hbWUsIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuY3JlYXRlKCByZXBvcnRlck5hbWUsIGNvbmZpZy5nZXQoKSApOworICAgICAgICBpZiggIXJlcG9ydGVyICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiTm8gcmVwb3J0ZXIgcmVnaXN0ZXJlZCB3aXRoIG5hbWU6ICciIDw8IHJlcG9ydGVyTmFtZSA8PCAiJyI7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyOworICAgIH0KKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IG1ha2VSZXBvcnRlciggUHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcG9ydGVycyA9IGNvbmZpZy0+Z2V0UmVwb3J0ZXJOYW1lcygpOworICAgICAgICBpZiggcmVwb3J0ZXJzLmVtcHR5KCkgKQorICAgICAgICAgICAgcmVwb3J0ZXJzLnB1c2hfYmFjayggImNvbnNvbGUiICk7CisKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXI7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IHJlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIHJlcG9ydGVyID0gYWRkUmVwb3J0ZXIoIHJlcG9ydGVyLCBjcmVhdGVSZXBvcnRlciggKml0LCBjb25maWcgKSApOworICAgICAgICByZXR1cm4gcmVwb3J0ZXI7CisgICAgfQorICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGFkZExpc3RlbmVycyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVycyApIHsKKyAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnk6Okxpc3RlbmVycyBsaXN0ZW5lcnMgPSBnZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnkoKS5nZXRMaXN0ZW5lcnMoKTsKKyAgICAgICAgZm9yKCBJUmVwb3J0ZXJSZWdpc3RyeTo6TGlzdGVuZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IGxpc3RlbmVycy5iZWdpbigpLCBpdEVuZCA9IGxpc3RlbmVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIHJlcG9ydGVycyA9IGFkZFJlcG9ydGVyKHJlcG9ydGVycywgKCppdCktPmNyZWF0ZSggUmVwb3J0ZXJDb25maWcoIGNvbmZpZyApICkgKTsKKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyczsKKyAgICB9CisKKyAgICBUb3RhbHMgcnVuVGVzdHMoIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGljb25maWcgPSBjb25maWcuZ2V0KCk7CisKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXIgPSBtYWtlUmVwb3J0ZXIoIGNvbmZpZyApOworICAgICAgICByZXBvcnRlciA9IGFkZExpc3RlbmVycyggaWNvbmZpZywgcmVwb3J0ZXIgKTsKKworICAgICAgICBSdW5Db250ZXh0IGNvbnRleHQoIGljb25maWcsIHJlcG9ydGVyICk7CisKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKworICAgICAgICBjb250ZXh0LnRlc3RHcm91cFN0YXJ0aW5nKCBjb25maWctPm5hbWUoKSwgMSwgMSApOworCisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLT50ZXN0U3BlYygpOworICAgICAgICBpZiggIXRlc3RTcGVjLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIn5bLl0iICkudGVzdFNwZWMoKTsgLy8gQWxsIG5vdCBoaWRkZW4gdGVzdHMKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGFsbFRlc3RDYXNlcyA9IGdldEFsbFRlc3RDYXNlc1NvcnRlZCggKmljb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYWxsVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gYWxsVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBpZiggIWNvbnRleHQuYWJvcnRpbmcoKSAmJiBtYXRjaFRlc3QoICppdCwgdGVzdFNwZWMsICppY29uZmlnICkgKQorICAgICAgICAgICAgICAgIHRvdGFscyArPSBjb250ZXh0LnJ1blRlc3QoICppdCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcG9ydGVyLT5za2lwVGVzdCggKml0ICk7CisgICAgICAgIH0KKworICAgICAgICBjb250ZXh0LnRlc3RHcm91cEVuZGVkKCBpY29uZmlnLT5uYW1lKCksIHRvdGFscywgMSwgMSApOworICAgICAgICByZXR1cm4gdG90YWxzOworICAgIH0KKworICAgIHZvaWQgYXBwbHlGaWxlbmFtZXNBc1RhZ3MoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0cyA9IGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICk7CisgICAgICAgIGZvcihzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRlc3RzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgVGVzdENhc2UmIHRlc3QgPSBjb25zdF9jYXN0PFRlc3RDYXNlJj4oIHRlc3RzW2ldICk7CisgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGFncyA9IHRlc3QudGFnczsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSB0ZXN0LmxpbmVJbmZvLmZpbGU7CisgICAgICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3RTbGFzaCA9IGZpbGVuYW1lLmZpbmRfbGFzdF9vZiggIlxcLyIgKTsKKyAgICAgICAgICAgIGlmKCBsYXN0U2xhc2ggIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKCBsYXN0U2xhc2grMSApOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3REb3QgPSBmaWxlbmFtZS5maW5kX2xhc3Rfb2YoICIuIiApOworICAgICAgICAgICAgaWYoIGxhc3REb3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKCAwLCBsYXN0RG90ICk7CisKKyAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCAiIyIgKyBmaWxlbmFtZSApOworICAgICAgICAgICAgc2V0VGFncyggdGVzdCwgdGFncyApOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU2Vzc2lvbiA6IE5vbkNvcHlhYmxlIHsKKyAgICAgICAgc3RhdGljIGJvb2wgYWxyZWFkeUluc3RhbnRpYXRlZDsKKworICAgIHB1YmxpYzoKKworICAgICAgICBzdHJ1Y3QgT25VbnVzZWRPcHRpb25zIHsgZW51bSBEb1doYXQgeyBJZ25vcmUsIEZhaWwgfTsgfTsKKworICAgICAgICBTZXNzaW9uKCkKKyAgICAgICAgOiBtX2NsaSggbWFrZUNvbW1hbmRMaW5lUGFyc2VyKCkgKSB7CisgICAgICAgICAgICBpZiggYWxyZWFkeUluc3RhbnRpYXRlZCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtc2cgPSAiT25seSBvbmUgaW5zdGFuY2Ugb2YgQ2F0Y2g6OlNlc3Npb24gY2FuIGV2ZXIgYmUgdXNlZCI7CisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCBtc2cgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIG1zZyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWxyZWFkeUluc3RhbnRpYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgflNlc3Npb24oKSB7CisgICAgICAgICAgICBDYXRjaDo6Y2xlYW5VcCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzaG93SGVscCggc3RkOjpzdHJpbmcgY29uc3QmIHByb2Nlc3NOYW1lICkgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiXG5DYXRjaCB2IiA8PCBsaWJyYXJ5VmVyc2lvbigpIDw8ICJcbiI7CisKKyAgICAgICAgICAgIG1fY2xpLnVzYWdlKCBDYXRjaDo6Y291dCgpLCBwcm9jZXNzTmFtZSApOworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiRm9yIG1vcmUgZGV0YWlsIHVzYWdlIHBsZWFzZSBzZWUgdGhlIHByb2plY3QgZG9jc1xuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbnQgYXBwbHlDb21tYW5kTGluZSggaW50IGFyZ2MsIGNoYXIgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2LCBPblVudXNlZE9wdGlvbnM6OkRvV2hhdCB1bnVzZWRPcHRpb25CZWhhdmlvdXIgPSBPblVudXNlZE9wdGlvbnM6OkZhaWwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1fY2xpLnNldFRocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIHVudXNlZE9wdGlvbkJlaGF2aW91ciA9PSBPblVudXNlZE9wdGlvbnM6OkZhaWwgKTsKKyAgICAgICAgICAgICAgICBtX3VudXNlZFRva2VucyA9IG1fY2xpLnBhcnNlSW50byggQ2xhcmE6OmFyZ3NUb1ZlY3RvciggYXJnYywgYXJndiApLCBtX2NvbmZpZ0RhdGEgKTsKKyAgICAgICAgICAgICAgICBpZiggbV9jb25maWdEYXRhLnNob3dIZWxwICkKKyAgICAgICAgICAgICAgICAgICAgc2hvd0hlbHAoIG1fY29uZmlnRGF0YS5wcm9jZXNzTmFtZSApOworICAgICAgICAgICAgICAgIG1fY29uZmlnLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OlJlZCApOworICAgICAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG5FcnJvcihzKSBpbiBpbnB1dDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRleHQoIGV4LndoYXQoKSwgVGV4dEF0dHJpYnV0ZXMoKS5zZXRJbmRlbnQoMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuXG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtX2NsaS51c2FnZSggQ2F0Y2g6OmNvdXQoKSwgbV9jb25maWdEYXRhLnByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1c2VDb25maWdEYXRhKCBDb25maWdEYXRhIGNvbnN0JiBfY29uZmlnRGF0YSApIHsKKyAgICAgICAgICAgIG1fY29uZmlnRGF0YSA9IF9jb25maWdEYXRhOworICAgICAgICAgICAgbV9jb25maWcucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBydW4oIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKworICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBhcHBseUNvbW1hbmRMaW5lKCBhcmdjLCBhcmd2ICk7CisgICAgICAgICAgICBpZiggcmV0dXJuQ29kZSA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlID0gcnVuKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorCisgICAgI2lmIGRlZmluZWQoV0lOMzIpICYmIGRlZmluZWQoVU5JQ09ERSkKKyAgICAgICAgaW50IHJ1biggaW50IGFyZ2MsIHdjaGFyX3QgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2ICkgeworCisgICAgICAgICAgICBjaGFyICoqdXRmOEFyZ3YgPSBuZXcgY2hhciAqWyBhcmdjIF07CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSApIHsKKyAgICAgICAgICAgICAgICBpbnQgYnVmU2l6ZSA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX1VURjgsIDAsIGFyZ3ZbaV0sIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICAgICAgICAgICAgICB1dGY4QXJndlsgaSBdID0gbmV3IGNoYXJbIGJ1ZlNpemUgXTsKKworICAgICAgICAgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX1VURjgsIDAsIGFyZ3ZbaV0sIC0xLCB1dGY4QXJndltpXSwgYnVmU2l6ZSwgTlVMTCwgTlVMTCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IGFwcGx5Q29tbWFuZExpbmUoIGFyZ2MsIHV0ZjhBcmd2ICk7CisgICAgICAgICAgICBpZiggcmV0dXJuQ29kZSA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlID0gcnVuKCk7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAgICAgZGVsZXRlIFtdIHV0ZjhBcmd2WyBpIF07CisKKyAgICAgICAgICAgIGRlbGV0ZSBbXSB1dGY4QXJndjsKKworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgICAgICBpbnQgcnVuKCkgeworICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5zaG93SGVscCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZygpOyAvLyBGb3JjZSBjb25maWcgdG8gYmUgY29uc3RydWN0ZWQKKworICAgICAgICAgICAgICAgIHNlZWRSbmcoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5maWxlbmFtZXNBc1RhZ3MgKQorICAgICAgICAgICAgICAgICAgICBhcHBseUZpbGVuYW1lc0FzVGFncyggKm1fY29uZmlnICk7CisKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbGlzdCByZXF1ZXN0CisgICAgICAgICAgICAgICAgaWYoIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdGVkID0gbGlzdCggY29uZmlnKCkgKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KCAqbGlzdGVkICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PiggcnVuVGVzdHMoIG1fY29uZmlnICkuYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCBleC53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDbGFyYTo6Q29tbWFuZExpbmU8Q29uZmlnRGF0YT4gY29uc3QmIGNsaSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NsaTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxDbGFyYTo6UGFyc2VyOjpUb2tlbj4gY29uc3QmIHVudXNlZFRva2VucygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX3VudXNlZFRva2VuczsKKyAgICAgICAgfQorICAgICAgICBDb25maWdEYXRhJiBjb25maWdEYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnRGF0YTsKKyAgICAgICAgfQorICAgICAgICBDb25maWcmIGNvbmZpZygpIHsKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWcgKQorICAgICAgICAgICAgICAgIG1fY29uZmlnID0gbmV3IENvbmZpZyggbV9jb25maWdEYXRhICk7CisgICAgICAgICAgICByZXR1cm4gKm1fY29uZmlnOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgQ2xhcmE6OkNvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IG1fY2xpOworICAgICAgICBzdGQ6OnZlY3RvcjxDbGFyYTo6UGFyc2VyOjpUb2tlbj4gbV91bnVzZWRUb2tlbnM7CisgICAgICAgIENvbmZpZ0RhdGEgbV9jb25maWdEYXRhOworICAgICAgICBQdHI8Q29uZmlnPiBtX2NvbmZpZzsKKyAgICB9OworCisgICAgYm9vbCBTZXNzaW9uOjphbHJlYWR5SW5zdGFudGlhdGVkID0gZmFsc2U7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVnaXN0cnlfaHViLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVHSVNUUllfSFVCX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9jYXNlX3JlZ2lzdHJ5X2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfUkVHSVNUUllfSU1QTF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgUmFuZG9tTnVtYmVyR2VuZXJhdG9yIHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCByZXN1bHRfdHlwZTsKKworICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKCByZXN1bHRfdHlwZSBuICkgY29uc3QgeyByZXR1cm4gc3RkOjpyYW5kKCkgJSBuOyB9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorICAgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1pbigpIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtYXgoKSB7IHJldHVybiAxMDAwMDAwOyB9CisgICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKSBjb25zdCB7IHJldHVybiBzdGQ6OnJhbmQoKSAlIG1heCgpOyB9CisjZW5kaWYKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVj4KKyAgICAgICAgc3RhdGljIHZvaWQgc2h1ZmZsZSggViYgdmVjdG9yICkgeworICAgICAgICAgICAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yIHJuZzsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorICAgICAgICAgICAgc3RkOjpzaHVmZmxlKCB2ZWN0b3IuYmVnaW4oKSwgdmVjdG9yLmVuZCgpLCBybmcgKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OnJhbmRvbV9zaHVmZmxlKCB2ZWN0b3IuYmVnaW4oKSwgdmVjdG9yLmVuZCgpLCBybmcgKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gc29ydFRlc3RzKCBJQ29uZmlnIGNvbnN0JiBjb25maWcsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdW5zb3J0ZWRUZXN0Q2FzZXMgKSB7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHNvcnRlZCA9IHVuc29ydGVkVGVzdENhc2VzOworCisgICAgICAgIHN3aXRjaCggY29uZmlnLnJ1bk9yZGVyKCkgKSB7CisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJbkxleGljb2dyYXBoaWNhbE9yZGVyOgorICAgICAgICAgICAgICAgIHN0ZDo6c29ydCggc29ydGVkLmJlZ2luKCksIHNvcnRlZC5lbmQoKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5SYW5kb21PcmRlcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlZWRSbmcoIGNvbmZpZyApOworICAgICAgICAgICAgICAgICAgICBSYW5kb21OdW1iZXJHZW5lcmF0b3I6OnNodWZmbGUoIHNvcnRlZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlcjoKKyAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGluIGRlY2xhcmF0aW9uIG9yZGVyCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNvcnRlZDsKKyAgICB9CisgICAgYm9vbCBtYXRjaFRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHJldHVybiB0ZXN0U3BlYy5tYXRjaGVzKCB0ZXN0Q2FzZSApICYmICggY29uZmlnLmFsbG93VGhyb3dzKCkgfHwgIXRlc3RDYXNlLnRocm93cygpICk7CisgICAgfQorCisgICAgdm9pZCBlbmZvcmNlTm9EdXBsaWNhdGVUZXN0Q2FzZXMoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZnVuY3Rpb25zICkgeworICAgICAgICBzdGQ6OnNldDxUZXN0Q2FzZT4gc2VlbkZ1bmN0aW9uczsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnVuY3Rpb25zLmJlZ2luKCksIGl0RW5kID0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgc3RkOjpwYWlyPHN0ZDo6c2V0PFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IsIGJvb2w+IHByZXYgPSBzZWVuRnVuY3Rpb25zLmluc2VydCggKml0ICk7CisgICAgICAgICAgICBpZiggIXByZXYuc2Vjb25kICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKworICAgICAgICAgICAgICAgIHNzICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkKKyAgICAgICAgICAgICAgICAgICAgPDwgImVycm9yOiBURVNUX0NBU0UoIFwiIiA8PCBpdC0+bmFtZSA8PCAiXCIgKSBhbHJlYWR5IGRlZmluZWQuXG4iCisgICAgICAgICAgICAgICAgICAgIDw8ICJcdEZpcnN0IHNlZW4gYXQgIiA8PCBwcmV2LmZpcnN0LT5nZXRUZXN0Q2FzZUluZm8oKS5saW5lSW5mbyA8PCAnXG4nCisgICAgICAgICAgICAgICAgICAgIDw8ICJcdFJlZGVmaW5lZCBhdCAiIDw8IGl0LT5nZXRUZXN0Q2FzZUluZm8oKS5saW5lSW5mbyA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3Ioc3Muc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlclRlc3RzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJlZDsKKyAgICAgICAgZmlsdGVyZWQucmVzZXJ2ZSggdGVzdENhc2VzLnNpemUoKSApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0ZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSB0ZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICBpZiggbWF0Y2hUZXN0KCAqaXQsIHRlc3RTcGVjLCBjb25maWcgKSApCisgICAgICAgICAgICAgICAgZmlsdGVyZWQucHVzaF9iYWNrKCAqaXQgKTsKKyAgICAgICAgcmV0dXJuIGZpbHRlcmVkOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICByZXR1cm4gZ2V0UmVnaXN0cnlIdWIoKS5nZXRUZXN0Q2FzZVJlZ2lzdHJ5KCkuZ2V0QWxsVGVzdHNTb3J0ZWQoIGNvbmZpZyApOworICAgIH0KKworICAgIGNsYXNzIFRlc3RSZWdpc3RyeSA6IHB1YmxpYyBJVGVzdENhc2VSZWdpc3RyeSB7CisgICAgcHVibGljOgorICAgICAgICBUZXN0UmVnaXN0cnkoKQorICAgICAgICA6ICAgbV9jdXJyZW50U29ydE9yZGVyKCBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyICksCisgICAgICAgICAgICBtX3VubmFtZWRDb3VudCggMCApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RSZWdpc3RyeSgpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSB0ZXN0Q2FzZS5nZXRUZXN0Q2FzZUluZm8oKS5uYW1lOworICAgICAgICAgICAgaWYoIG5hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIG9zcyA8PCAiQW5vbnltb3VzIHRlc3QgY2FzZSAiIDw8ICsrbV91bm5hbWVkQ291bnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyVGVzdCggdGVzdENhc2Uud2l0aE5hbWUoIG9zcy5zdHIoKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2Z1bmN0aW9ucy5wdXNoX2JhY2soIHRlc3RDYXNlICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9mdW5jdGlvbnM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggbV9zb3J0ZWRGdW5jdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgZW5mb3JjZU5vRHVwbGljYXRlVGVzdENhc2VzKCBtX2Z1bmN0aW9ucyApOworCisgICAgICAgICAgICBpZiggIG1fY3VycmVudFNvcnRPcmRlciAhPSBjb25maWcucnVuT3JkZXIoKSB8fCBtX3NvcnRlZEZ1bmN0aW9ucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fc29ydGVkRnVuY3Rpb25zID0gc29ydFRlc3RzKCBjb25maWcsIG1fZnVuY3Rpb25zICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50U29ydE9yZGVyID0gY29uZmlnLnJ1bk9yZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbV9zb3J0ZWRGdW5jdGlvbnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtX2Z1bmN0aW9uczsKKyAgICAgICAgbXV0YWJsZSBSdW5UZXN0czo6SW5XaGF0T3JkZXIgbV9jdXJyZW50U29ydE9yZGVyOworICAgICAgICBtdXRhYmxlIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtX3NvcnRlZEZ1bmN0aW9uczsKKyAgICAgICAgc2l6ZV90IG1fdW5uYW1lZENvdW50OworICAgICAgICBzdGQ6Omlvc19iYXNlOjpJbml0IG1fb3N0cmVhbUluaXQ7IC8vIEZvcmNlcyBjb3V0LyBjZXJyIHRvIGJlIGluaXRpYWxpc2VkCisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgY2xhc3MgRnJlZUZ1bmN0aW9uVGVzdENhc2UgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgRnJlZUZ1bmN0aW9uVGVzdENhc2UoIFRlc3RGdW5jdGlvbiBmdW4gKSA6IG1fZnVuKCBmdW4gKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAgICAgICAgICBtX2Z1bigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIH5GcmVlRnVuY3Rpb25UZXN0Q2FzZSgpOworCisgICAgICAgIFRlc3RGdW5jdGlvbiBtX2Z1bjsKKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIGV4dHJhY3RDbGFzc05hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBjbGFzc09yUXVhbGlmaWVkTWV0aG9kTmFtZSApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWU7CisgICAgICAgIGlmKCBzdGFydHNXaXRoKCBjbGFzc05hbWUsICcmJyApICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgbGFzdENvbG9ucyA9IGNsYXNzTmFtZS5yZmluZCggIjo6IiApOworICAgICAgICAgICAgc3RkOjpzaXplX3QgcGVudWx0aW1hdGVDb2xvbnMgPSBjbGFzc05hbWUucmZpbmQoICI6OiIsIGxhc3RDb2xvbnMtMSApOworICAgICAgICAgICAgaWYoIHBlbnVsdGltYXRlQ29sb25zID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBwZW51bHRpbWF0ZUNvbG9ucyA9IDE7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyKCBwZW51bHRpbWF0ZUNvbG9ucywgbGFzdENvbG9ucy1wZW51bHRpbWF0ZUNvbG9ucyApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgdm9pZCByZWdpc3RlclRlc3RDYXNlCisgICAgICAgICggICBJVGVzdENhc2UqIHRlc3RDYXNlLAorICAgICAgICAgICAgY2hhciBjb25zdCogY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUsCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUZXN0CisgICAgICAgICAgICAoIG1ha2VUZXN0Q2FzZQorICAgICAgICAgICAgICAgICggICB0ZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdENsYXNzTmFtZSggY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZUFuZERlc2MubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZUFuZERlc2MuZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgIGxpbmVJbmZvICkgKTsKKyAgICB9CisgICAgdm9pZCByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24KKyAgICAgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApIHsKKyAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZSggbmV3IEZyZWVGdW5jdGlvblRlc3RDYXNlKCBmdW5jdGlvbiApLCAiIiwgbmFtZUFuZERlc2MsIGxpbmVJbmZvICk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBBdXRvUmVnOjpBdXRvUmVnCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdENhc2VGdW5jdGlvbiggZnVuY3Rpb24sIGxpbmVJbmZvLCBuYW1lQW5kRGVzYyApOworICAgIH0KKworICAgIEF1dG9SZWc6On5BdXRvUmVnKCkge30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXBvcnRlcl9yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgUmVwb3J0ZXJSZWdpc3RyeSA6IHB1YmxpYyBJUmVwb3J0ZXJSZWdpc3RyeSB7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgdmlydHVhbCB+UmVwb3J0ZXJSZWdpc3RyeSgpIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgRmFjdG9yeU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSAgbV9mYWN0b3JpZXMuZmluZCggbmFtZSApOworICAgICAgICAgICAgaWYoIGl0ID09IG1fZmFjdG9yaWVzLmVuZCgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLT5jcmVhdGUoIFJlcG9ydGVyQ29uZmlnKCBjb25maWcgKSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgeworICAgICAgICAgICAgbV9mYWN0b3JpZXMuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggbmFtZSwgZmFjdG9yeSApICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSB7CisgICAgICAgICAgICBtX2xpc3RlbmVycy5wdXNoX2JhY2soIGZhY3RvcnkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgRmFjdG9yeU1hcCBjb25zdCYgZ2V0RmFjdG9yaWVzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fZmFjdG9yaWVzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgTGlzdGVuZXJzIGNvbnN0JiBnZXRMaXN0ZW5lcnMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9saXN0ZW5lcnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEZhY3RvcnlNYXAgbV9mYWN0b3JpZXM7CisgICAgICAgIExpc3RlbmVycyBtX2xpc3RlbmVyczsKKyAgICB9OworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXhjZXB0aW9uX3RyYW5zbGF0b3JfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FWENFUFRJT05fVFJBTlNMQVRPUl9SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fT0JKQ19fCisjaW1wb3J0ICJGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaCIKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IDogcHVibGljIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgfkV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpIHsKKyAgICAgICAgICAgIGRlbGV0ZUFsbCggbV90cmFuc2xhdG9ycyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVHJhbnNsYXRvciggY29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3IgKSB7CisgICAgICAgICAgICBtX3RyYW5zbGF0b3JzLnB1c2hfYmFjayggdHJhbnNsYXRvciApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICB0cnkgeworI2lmZGVmIF9fT0JKQ19fCisgICAgICAgICAgICAgICAgLy8gSW4gT2JqZWN0aXZlLUMgdHJ5IG9iamVjdGl2ZS1jIGV4Y2VwdGlvbnMgZmlyc3QKKyAgICAgICAgICAgICAgICBAdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRyYW5zbGF0b3JzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEBjYXRjaCAoTlNFeGNlcHRpb24gKmV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBbZXhjZXB0aW9uIGRlc2NyaXB0aW9uXSApOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRyYW5zbGF0b3JzKCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBUZXN0RmFpbHVyZUV4Y2VwdGlvbiYgKSB7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIHJldHVybiBleC53aGF0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpzdHJpbmcmIG1zZyApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIGNvbnN0IGNoYXIqIG1zZyApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goLi4uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGV4Y2VwdGlvbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyB0cnlUcmFuc2xhdG9ycygpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCBtX3RyYW5zbGF0b3JzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBtX3RyYW5zbGF0b3JzWzBdLT50cmFuc2xhdGUoIG1fdHJhbnNsYXRvcnMuYmVnaW4oKSsxLCBtX3RyYW5zbGF0b3JzLmVuZCgpICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKj4gbV90cmFuc2xhdG9yczsKKyAgICB9OworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGFnX2FsaWFzX3JlZ2lzdHJ5LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RBR19BTElBU19SRUdJU1RSWV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUYWdBbGlhc1JlZ2lzdHJ5IDogcHVibGljIElUYWdBbGlhc1JlZ2lzdHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBPcHRpb248VGFnQWxpYXM+IGZpbmQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcyApIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdDsKKyAgICAgICAgdm9pZCBhZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnQWxpYXM+IG1fcmVnaXN0cnk7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworCisgICAgICAgIGNsYXNzIFJlZ2lzdHJ5SHViIDogcHVibGljIElSZWdpc3RyeUh1YiwgcHVibGljIElNdXRhYmxlUmVnaXN0cnlIdWIgeworCisgICAgICAgICAgICBSZWdpc3RyeUh1YiggUmVnaXN0cnlIdWIgY29uc3QmICk7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSggUmVnaXN0cnlIdWIgY29uc3QmICk7CisKKyAgICAgICAgcHVibGljOiAvLyBJUmVnaXN0cnlIdWIKKyAgICAgICAgICAgIFJlZ2lzdHJ5SHViKCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJUmVwb3J0ZXJSZWdpc3RyeSBjb25zdCYgZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJVGVzdENhc2VSZWdpc3RyeSBjb25zdCYgZ2V0VGVzdENhc2VSZWdpc3RyeSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90ZXN0Q2FzZVJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5JiBnZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgZ2V0VGFnQWxpYXNSZWdpc3RyeSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90YWdBbGlhc1JlZ2lzdHJ5OworICAgICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYzogLy8gSU11dGFibGVSZWdpc3RyeUh1YgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV9yZXBvcnRlclJlZ2lzdHJ5LnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIGZhY3RvcnkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV9yZXBvcnRlclJlZ2lzdHJ5LnJlZ2lzdGVyTGlzdGVuZXIoIGZhY3RvcnkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX3Rlc3RDYXNlUmVnaXN0cnkucmVnaXN0ZXJUZXN0KCB0ZXN0SW5mbyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVHJhbnNsYXRvciggY29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3IgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV9leGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkucmVnaXN0ZXJUcmFuc2xhdG9yKCB0cmFuc2xhdG9yICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUYWdBbGlhcyggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV90YWdBbGlhc1JlZ2lzdHJ5LmFkZCggYWxpYXMsIHRhZywgbGluZUluZm8gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgVGVzdFJlZ2lzdHJ5IG1fdGVzdENhc2VSZWdpc3RyeTsKKyAgICAgICAgICAgIFJlcG9ydGVyUmVnaXN0cnkgbV9yZXBvcnRlclJlZ2lzdHJ5OworICAgICAgICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgICAgICAgICAgVGFnQWxpYXNSZWdpc3RyeSBtX3RhZ0FsaWFzUmVnaXN0cnk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gU2luZ2xlLCBnbG9iYWwsIGluc3RhbmNlCisgICAgICAgIGlubGluZSBSZWdpc3RyeUh1YiomIGdldFRoZVJlZ2lzdHJ5SHViKCkgeworICAgICAgICAgICAgc3RhdGljIFJlZ2lzdHJ5SHViKiB0aGVSZWdpc3RyeUh1YiA9IENBVENIX05VTEw7CisgICAgICAgICAgICBpZiggIXRoZVJlZ2lzdHJ5SHViICkKKyAgICAgICAgICAgICAgICB0aGVSZWdpc3RyeUh1YiA9IG5ldyBSZWdpc3RyeUh1YigpOworICAgICAgICAgICAgcmV0dXJuIHRoZVJlZ2lzdHJ5SHViOworICAgICAgICB9CisgICAgfQorCisgICAgSVJlZ2lzdHJ5SHViJiBnZXRSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgcmV0dXJuICpnZXRUaGVSZWdpc3RyeUh1YigpOworICAgIH0KKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViJiBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKSB7CisgICAgICAgIHJldHVybiAqZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICB9CisgICAgdm9pZCBjbGVhblVwKCkgeworICAgICAgICBkZWxldGUgZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICAgICAgZ2V0VGhlUmVnaXN0cnlIdWIoKSA9IENBVENIX05VTEw7CisgICAgICAgIGNsZWFuVXBDb250ZXh0KCk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkudHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX25vdGltcGxlbWVudGVkX2V4Y2VwdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX05PVElNUExFTUVOVEVEX0VYQ0VQVElPTl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHNzdHJlYW0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjo6Tm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApCisgICAgOiAgIG1fbGluZUluZm8oIGxpbmVJbmZvICkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBvc3MgPDwgbGluZUluZm8gPDwgIjogZnVuY3Rpb24gIjsKKyAgICAgICAgb3NzIDw8ICJub3QgaW1wbGVtZW50ZWQiOworICAgICAgICBtX3doYXQgPSBvc3Muc3RyKCk7CisgICAgfQorCisgICAgY29uc3QgY2hhciogTm90SW1wbGVtZW50ZWRFeGNlcHRpb246OndoYXQoKSBjb25zdCBDQVRDSF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBtX3doYXQuY19zdHIoKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29udGV4dF9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OVEVYVF9JTVBMX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc3RyZWFtLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU1RSRUFNX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFdyaXRlckYsIHNpemVfdCBidWZmZXJTaXplPTI1Nj4KKyAgICBjbGFzcyBTdHJlYW1CdWZJbXBsIDogcHVibGljIFN0cmVhbUJ1ZkJhc2UgeworICAgICAgICBjaGFyIGRhdGFbYnVmZmVyU2l6ZV07CisgICAgICAgIFdyaXRlckYgbV93cml0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFN0cmVhbUJ1ZkltcGwoKSB7CisgICAgICAgICAgICBzZXRwKCBkYXRhLCBkYXRhICsgc2l6ZW9mKGRhdGEpICk7CisgICAgICAgIH0KKworICAgICAgICB+U3RyZWFtQnVmSW1wbCgpIENBVENIX05PRVhDRVBUIHsKKyAgICAgICAgICAgIHN5bmMoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG92ZXJmbG93KCBpbnQgYyApIHsKKyAgICAgICAgICAgIHN5bmMoKTsKKworICAgICAgICAgICAgaWYoIGMgIT0gRU9GICkgeworICAgICAgICAgICAgICAgIGlmKCBwYmFzZSgpID09IGVwcHRyKCkgKQorICAgICAgICAgICAgICAgICAgICBtX3dyaXRlciggc3RkOjpzdHJpbmcoIDEsIHN0YXRpY19jYXN0PGNoYXI+KCBjICkgKSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3B1dGMoIHN0YXRpY19jYXN0PGNoYXI+KCBjICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IHN5bmMoKSB7CisgICAgICAgICAgICBpZiggcGJhc2UoKSAhPSBwcHRyKCkgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCBwYmFzZSgpLCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZzo6c2l6ZV90eXBlPiggcHB0cigpIC0gcGJhc2UoKSApICkgKTsKKyAgICAgICAgICAgICAgICBzZXRwKCBwYmFzZSgpLCBlcHB0cigpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEZpbGVTdHJlYW06OkZpbGVTdHJlYW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlbmFtZSApIHsKKyAgICAgICAgbV9vZnMub3BlbiggZmlsZW5hbWUuY19zdHIoKSApOworICAgICAgICBpZiggbV9vZnMuZmFpbCgpICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiVW5hYmxlIHRvIG9wZW4gZmlsZTogJyIgPDwgZmlsZW5hbWUgPDwgJ1wnJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6b3N0cmVhbSYgRmlsZVN0cmVhbTo6c3RyZWFtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9vZnM7CisgICAgfQorCisgICAgc3RydWN0IE91dHB1dERlYnVnV3JpdGVyIHsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoIHN0ZDo6c3RyaW5nIGNvbnN0JnN0ciApIHsKKyAgICAgICAgICAgIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ciApOworICAgICAgICB9CisgICAgfTsKKworICAgIERlYnVnT3V0U3RyZWFtOjpEZWJ1Z091dFN0cmVhbSgpCisgICAgOiAgIG1fc3RyZWFtQnVmKCBuZXcgU3RyZWFtQnVmSW1wbDxPdXRwdXREZWJ1Z1dyaXRlcj4oKSApLAorICAgICAgICBtX29zKCBtX3N0cmVhbUJ1Zi5nZXQoKSApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgRGVidWdPdXRTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb3M7CisgICAgfQorCisgICAgLy8gU3RvcmUgdGhlIHN0cmVhbWJ1ZiBmcm9tIGNvdXQgdXAtZnJvbnQgYmVjYXVzZQorICAgIC8vIGNvdXQgbWF5IGdldCByZWRpcmVjdGVkIHdoZW4gcnVubmluZyB0ZXN0cworICAgIENvdXRTdHJlYW06OkNvdXRTdHJlYW0oKQorICAgIDogICBtX29zKCBDYXRjaDo6Y291dCgpLnJkYnVmKCkgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIENvdXRTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb3M7CisgICAgfQorCisjaWZuZGVmIENBVENIX0NPTkZJR19OT1NURE9VVCAvLyBJZiB5b3UgI2RlZmluZSB0aGlzIHlvdSBtdXN0IGltcGxlbWVudCB0aGVzZSBmdW5jdGlvbnMKKyAgICBzdGQ6Om9zdHJlYW0mIGNvdXQoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmNvdXQ7CisgICAgfQorICAgIHN0ZDo6b3N0cmVhbSYgY2VycigpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y2VycjsKKyAgICB9CisjZW5kaWYKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIENvbnRleHQgOiBwdWJsaWMgSU11dGFibGVDb250ZXh0IHsKKworICAgICAgICBDb250ZXh0KCkgOiBtX2NvbmZpZyggQ0FUQ0hfTlVMTCApLCBtX3J1bm5lciggQ0FUQ0hfTlVMTCApLCBtX3Jlc3VsdENhcHR1cmUoIENBVENIX05VTEwgKSB7fQorICAgICAgICBDb250ZXh0KCBDb250ZXh0IGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yPSggQ29udGV4dCBjb25zdCYgKTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+Q29udGV4dCgpIHsKKyAgICAgICAgICAgIGRlbGV0ZUFsbFZhbHVlcyggbV9nZW5lcmF0b3JzQnlUZXN0TmFtZSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIElDb250ZXh0CisgICAgICAgIHZpcnR1YWwgSVJlc3VsdENhcHR1cmUqIGdldFJlc3VsdENhcHR1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXN1bHRDYXB0dXJlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgSVJ1bm5lciogZ2V0UnVubmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVubmVyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldEdlbmVyYXRvckluZGV4KCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHNpemVfdCB0b3RhbFNpemUgKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0R2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkKKyAgICAgICAgICAgIC5nZXRHZW5lcmF0b3JJbmZvKCBmaWxlSW5mbywgdG90YWxTaXplICkKKyAgICAgICAgICAgIC5nZXRDdXJyZW50SW5kZXgoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZ2VuZXJhdG9ycyA9IGZpbmRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKTsKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3JzICYmIGdlbmVyYXRvcnMtPm1vdmVOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFB0cjxJQ29uZmlnIGNvbnN0PiBnZXRDb25maWcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jb25maWc7CisgICAgICAgIH0KKworICAgIHB1YmxpYzogLy8gSU11dGFibGVDb250ZXh0CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZXN1bHRDYXB0dXJlKCBJUmVzdWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSApIHsKKyAgICAgICAgICAgIG1fcmVzdWx0Q2FwdHVyZSA9IHJlc3VsdENhcHR1cmU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJ1bm5lciggSVJ1bm5lciogcnVubmVyICkgeworICAgICAgICAgICAgbV9ydW5uZXIgPSBydW5uZXI7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldENvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgICAgICBtX2NvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBJTXV0YWJsZUNvbnRleHQmIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBmaW5kR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGVzdE5hbWUgPSBnZXRSZXN1bHRDYXB0dXJlKCktPmdldEN1cnJlbnRUZXN0TmFtZSgpOworCisgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvcnNGb3JUZXN0Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lLmZpbmQoIHRlc3ROYW1lICk7CisgICAgICAgICAgICByZXR1cm4gaXQgIT0gbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5lbmQoKQorICAgICAgICAgICAgICAgID8gaXQtPnNlY29uZAorICAgICAgICAgICAgICAgIDogQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCYgZ2V0R2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgeworICAgICAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBnZW5lcmF0b3JzID0gZmluZEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpOworICAgICAgICAgICAgaWYoICFnZW5lcmF0b3JzICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3ROYW1lID0gZ2V0UmVzdWx0Q2FwdHVyZSgpLT5nZXRDdXJyZW50VGVzdE5hbWUoKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0b3JzID0gY3JlYXRlR2VuZXJhdG9yc0ZvclRlc3QoKTsKKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lLmluc2VydCggc3RkOjptYWtlX3BhaXIoIHRlc3ROYW1lLCBnZW5lcmF0b3JzICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqZ2VuZXJhdG9yczsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBJUnVubmVyKiBtX3J1bm5lcjsKKyAgICAgICAgSVJlc3VsdENhcHR1cmUqIG1fcmVzdWx0Q2FwdHVyZTsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JzRm9yVGVzdCo+IG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWU7CisgICAgfTsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIENvbnRleHQqIGN1cnJlbnRDb250ZXh0ID0gQ0FUQ0hfTlVMTDsKKyAgICB9CisgICAgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKSB7CisgICAgICAgIGlmKCAhY3VycmVudENvbnRleHQgKQorICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBuZXcgQ29udGV4dCgpOworICAgICAgICByZXR1cm4gKmN1cnJlbnRDb250ZXh0OworICAgIH0KKyAgICBJQ29udGV4dCYgZ2V0Q3VycmVudENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFuVXBDb250ZXh0KCkgeworICAgICAgICBkZWxldGUgY3VycmVudENvbnRleHQ7CisgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gQ0FUQ0hfTlVMTDsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb25zb2xlX2NvbG91cl9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OU09MRV9DT0xPVVJfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2Vycm5vX2d1YXJkLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVJSTk9fR1VBUkRfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjZXJybm8+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBFcnJub0d1YXJkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVycm5vR3VhcmQoKTptX29sZEVycm5vKGVycm5vKXt9CisgICAgICAgIH5FcnJub0d1YXJkKCkgeyBlcnJubyA9IG1fb2xkRXJybm87IH0KKyAgICBwcml2YXRlOgorICAgICAgICBpbnQgbV9vbGRFcnJubzsKKyAgICB9OworCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgbmFtZXNwYWNlIHsKKworICAgICAgICBzdHJ1Y3QgSUNvbG91ckltcGwgeworICAgICAgICAgICAgdmlydHVhbCB+SUNvbG91ckltcGwoKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgPSAwOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBOb0NvbG91ckltcGwgOiBJQ29sb3VySW1wbCB7CisgICAgICAgICAgICB2b2lkIHVzZSggQ29sb3VyOjpDb2RlICkge30KKworICAgICAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbnN0YW5jZSgpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgTm9Db2xvdXJJbXBsIHNfaW5zdGFuY2U7CisgICAgICAgICAgICAgICAgcmV0dXJuICZzX2luc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgfSAvLyBhbm9uIG5hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX05PTkUgKSAmJiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTICkgJiYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSSApCisjICAgaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworIyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9VUl9BTlNJCisjICAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUyApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgeworCisgICAgY2xhc3MgV2luMzJDb2xvdXJJbXBsIDogcHVibGljIElDb2xvdXJJbXBsIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdpbjMyQ29sb3VySW1wbCgpIDogc3Rkb3V0SGFuZGxlKCBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpICkKKyAgICAgICAgeworICAgICAgICAgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY3NiaUluZm87CisgICAgICAgICAgICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyggc3Rkb3V0SGFuZGxlLCAmY3NiaUluZm8gKTsKKyAgICAgICAgICAgIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXMgPSBjc2JpSW5mby53QXR0cmlidXRlcyAmIH4oIEJBQ0tHUk9VTkRfR1JFRU4gfCBCQUNLR1JPVU5EX1JFRCB8IEJBQ0tHUk9VTkRfQkxVRSB8IEJBQ0tHUk9VTkRfSU5URU5TSVRZICk7CisgICAgICAgICAgICBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzID0gY3NiaUluZm8ud0F0dHJpYnV0ZXMgJiB+KCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgc3dpdGNoKCBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Tm9uZTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggb3JpZ2luYWxGb3JlZ3JvdW5kQXR0cmlidXRlcyApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpXaGl0ZTogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6UmVkOiAgICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9SRUQgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JlZW46ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCbHVlOiAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0JMVUUgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Q3lhbjogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9CTFVFIHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpZZWxsb3c6ICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JleTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggMCApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkxpZ2h0R3JleTogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRSZWQ6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX1JFRCApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRHcmVlbjogICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFdoaXRlOiAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSB8IEZPUkVHUk9VTkRfR1JFRU4gfCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfQkxVRSApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodDogdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm5vdCBhIGNvbG91ciIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBzZXRUZXh0QXR0cmlidXRlKCBXT1JEIF90ZXh0QXR0cmlidXRlICkgeworICAgICAgICAgICAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoIHN0ZG91dEhhbmRsZSwgX3RleHRBdHRyaWJ1dGUgfCBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzICk7CisgICAgICAgIH0KKyAgICAgICAgSEFORExFIHN0ZG91dEhhbmRsZTsKKyAgICAgICAgV09SRCBvcmlnaW5hbEZvcmVncm91bmRBdHRyaWJ1dGVzOworICAgICAgICBXT1JEIG9yaWdpbmFsQmFja2dyb3VuZEF0dHJpYnV0ZXM7CisgICAgfTsKKworICAgIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeworICAgICAgICBzdGF0aWMgV2luMzJDb2xvdXJJbXBsIHNfaW5zdGFuY2U7CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGNvbmZpZyA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCk7CisgICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyBjb2xvdXJNb2RlID0gY29uZmlnCisgICAgICAgICAgICA/IGNvbmZpZy0+dXNlQ29sb3VyKCkKKyAgICAgICAgICAgIDogVXNlQ29sb3VyOjpBdXRvOworICAgICAgICBpZiggY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OkF1dG8gKQorICAgICAgICAgICAgY29sb3VyTW9kZSA9ICFpc0RlYnVnZ2VyQWN0aXZlKCkKKyAgICAgICAgICAgICAgICA/IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICAgICAgOiBVc2VDb2xvdXI6Ok5vOworICAgICAgICByZXR1cm4gY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgPyAmc19pbnN0YW5jZQorICAgICAgICAgICAgOiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7CisgICAgfQorCit9IC8vIGVuZCBhbm9uIG5hbWVzcGFjZQorfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbGlmIGRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSSApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSB7CisKKyAgICAvLyB1c2UgUE9TSVgvIEFOU0kgY29uc29sZSB0ZXJtaW5hbCBjb2RlcworICAgIC8vIFRoYW5rcyB0byBBZGFtIFN0cnplbGVja2kgZm9yIG9yaWdpbmFsIGNvbnRyaWJ1dGlvbgorICAgIC8vIChodHRwOi8vZ2l0aHViLmNvbS9uYW5vYW50KQorICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsc3F1YXJlZC9DYXRjaC9wdWxsLzEzMQorICAgIGNsYXNzIFBvc2l4Q29sb3VySW1wbCA6IHB1YmxpYyBJQ29sb3VySW1wbCB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgdXNlKCBDb2xvdXI6OkNvZGUgX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICBzd2l0Y2goIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpOb25lOgorICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpXaGl0ZTogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMG0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlJlZDogICAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzMxbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JlZW46ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzJtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCbHVlOiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszNG0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkN5YW46ICAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzM2bSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6WWVsbG93OiAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzNtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpHcmV5OiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMG0iICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6TGlnaHRHcmV5OiAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzM3bSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0UmVkOiAgICAgcmV0dXJuIHNldENvbG91ciggIlsxOzMxbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0R3JlZW46ICAgcmV0dXJuIHNldENvbG91ciggIlsxOzMybSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0V2hpdGU6ICAgcmV0dXJuIHNldENvbG91ciggIlsxOzM3bSIgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub3QgYSBjb2xvdXIiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHN0YXRpYyBQb3NpeENvbG91ckltcGwgc19pbnN0YW5jZTsKKyAgICAgICAgICAgIHJldHVybiAmc19pbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBzZXRDb2xvdXIoIGNvbnN0IGNoYXIqIF9lc2NhcGVDb2RlICkgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAnXDAzMycgPDwgX2VzY2FwZUNvZGU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7CisgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gY29sb3VyTW9kZSA9IGNvbmZpZworICAgICAgICAgICAgPyBjb25maWctPnVzZUNvbG91cigpCisgICAgICAgICAgICA6IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgaWYoIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAgICAgIGNvbG91ck1vZGUgPSAoIWlzRGVidWdnZXJBY3RpdmUoKSAmJiBpc2F0dHkoU1RET1VUX0ZJTEVOTykgKQorICAgICAgICAgICAgICAgID8gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgICAgICA6IFVzZUNvbG91cjo6Tm87CisgICAgICAgIHJldHVybiBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICA/IFBvc2l4Q29sb3VySW1wbDo6aW5zdGFuY2UoKQorICAgICAgICAgICAgOiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7CisgICAgfQorCit9IC8vIGVuZCBhbm9uIG5hbWVzcGFjZQorfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbHNlICAvLyBub3QgV2luZG93cyBvciBBTlNJIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGF0aWMgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7IHJldHVybiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbmRpZiAvLyBXaW5kb3dzLyBBTlNJLyBOb25lCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBDb2xvdXI6OkNvbG91ciggQ29kZSBfY29sb3VyQ29kZSApIDogbV9tb3ZlZCggZmFsc2UgKSB7IHVzZSggX2NvbG91ckNvZGUgKTsgfQorICAgIENvbG91cjo6Q29sb3VyKCBDb2xvdXIgY29uc3QmIF9vdGhlciApIDogbV9tb3ZlZCggZmFsc2UgKSB7IGNvbnN0X2Nhc3Q8Q29sb3VyJj4oIF9vdGhlciApLm1fbW92ZWQgPSB0cnVlOyB9CisgICAgQ29sb3VyOjp+Q29sb3VyKCl7IGlmKCAhbV9tb3ZlZCApIHVzZSggTm9uZSApOyB9CisKKyAgICB2b2lkIENvbG91cjo6dXNlKCBDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICBzdGF0aWMgSUNvbG91ckltcGwqIGltcGwgPSBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCk7CisgICAgICAgIGltcGwtPnVzZSggX2NvbG91ckNvZGUgKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZ2VuZXJhdG9yc19pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfR0VORVJBVE9SU19JTVBMX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgR2VuZXJhdG9ySW5mbyA6IElHZW5lcmF0b3JJbmZvIHsKKworICAgICAgICBHZW5lcmF0b3JJbmZvKCBzdGQ6OnNpemVfdCBzaXplICkKKyAgICAgICAgOiAgIG1fc2l6ZSggc2l6ZSApLAorICAgICAgICAgICAgbV9jdXJyZW50SW5kZXgoIDAgKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgbW92ZU5leHQoKSB7CisgICAgICAgICAgICBpZiggKyttX2N1cnJlbnRJbmRleCA9PSBtX3NpemUgKSB7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50SW5kZXggPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgZ2V0Q3VycmVudEluZGV4KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY3VycmVudEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgbV9zaXplOworICAgICAgICBzdGQ6OnNpemVfdCBtX2N1cnJlbnRJbmRleDsKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBjbGFzcyBHZW5lcmF0b3JzRm9yVGVzdCA6IHB1YmxpYyBJR2VuZXJhdG9yc0ZvclRlc3QgeworCisgICAgcHVibGljOgorICAgICAgICB+R2VuZXJhdG9yc0ZvclRlc3QoKSB7CisgICAgICAgICAgICBkZWxldGVBbGwoIG1fZ2VuZXJhdG9yc0luT3JkZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIElHZW5lcmF0b3JJbmZvJiBnZXRHZW5lcmF0b3JJbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHN0ZDo6c2l6ZV90IHNpemUgKSB7CisgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2dlbmVyYXRvcnNCeU5hbWUuZmluZCggZmlsZUluZm8gKTsKKyAgICAgICAgICAgIGlmKCBpdCA9PSBtX2dlbmVyYXRvcnNCeU5hbWUuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgSUdlbmVyYXRvckluZm8qIGluZm8gPSBuZXcgR2VuZXJhdG9ySW5mbyggc2l6ZSApOworICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0J5TmFtZS5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBmaWxlSW5mbywgaW5mbyApICk7CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzSW5PcmRlci5wdXNoX2JhY2soIGluZm8gKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKmluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKml0LT5zZWNvbmQ7CisgICAgICAgIH0KKworICAgICAgICBib29sIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2dlbmVyYXRvcnNJbk9yZGVyLmJlZ2luKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJR2VuZXJhdG9ySW5mbyo+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1fZ2VuZXJhdG9yc0luT3JkZXIuZW5kKCk7CisgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggKCppdCktPm1vdmVOZXh0KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JJbmZvKj4gbV9nZW5lcmF0b3JzQnlOYW1lOworICAgICAgICBzdGQ6OnZlY3RvcjxJR2VuZXJhdG9ySW5mbyo+IG1fZ2VuZXJhdG9yc0luT3JkZXI7CisgICAgfTsKKworICAgIElHZW5lcmF0b3JzRm9yVGVzdCogY3JlYXRlR2VuZXJhdG9yc0ZvclRlc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JzRm9yVGVzdCgpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9hc3NlcnRpb25yZXN1bHQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BU1NFUlRJT05SRVNVTFRfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBBc3NlcnRpb25JbmZvOjpBc3NlcnRpb25JbmZvKCAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIF9yZXN1bHREaXNwb3NpdGlvbiApCisgICAgOiAgIG1hY3JvTmFtZSggX21hY3JvTmFtZSApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIGNhcHR1cmVkRXhwcmVzc2lvbiggX2NhcHR1cmVkRXhwcmVzc2lvbiApLAorICAgICAgICByZXN1bHREaXNwb3NpdGlvbiggX3Jlc3VsdERpc3Bvc2l0aW9uICkKKyAgICB7fQorCisgICAgQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoKSB7fQorCisgICAgQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sIEFzc2VydGlvblJlc3VsdERhdGEgY29uc3QmIGRhdGEgKQorICAgIDogICBtX2luZm8oIGluZm8gKSwKKyAgICAgICAgbV9yZXN1bHREYXRhKCBkYXRhICkKKyAgICB7fQorCisgICAgQXNzZXJ0aW9uUmVzdWx0Ojp+QXNzZXJ0aW9uUmVzdWx0KCkge30KKworICAgIC8vIFJlc3VsdCB3YXMgYSBzdWNjZXNzCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6OnN1Y2NlZWRlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENhdGNoOjppc09rKCBtX3Jlc3VsdERhdGEucmVzdWx0VHlwZSApOworICAgIH0KKworICAgIC8vIFJlc3VsdCB3YXMgYSBzdWNjZXNzLCBvciBmYWlsdXJlIGlzIHN1cHByZXNzZWQKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aXNPaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENhdGNoOjppc09rKCBtX3Jlc3VsdERhdGEucmVzdWx0VHlwZSApIHx8IHNob3VsZFN1cHByZXNzRmFpbHVyZSggbV9pbmZvLnJlc3VsdERpc3Bvc2l0aW9uICk7CisgICAgfQorCisgICAgUmVzdWx0V2FzOjpPZlR5cGUgQXNzZXJ0aW9uUmVzdWx0OjpnZXRSZXN1bHRUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLnJlc3VsdFR5cGU7CisgICAgfQorCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6Omhhc0V4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbi5lbXB0eSgpOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNNZXNzYWdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIW1fcmVzdWx0RGF0YS5tZXNzYWdlLmVtcHR5KCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBpZiggaXNGYWxzZVRlc3QoIG1faW5mby5yZXN1bHREaXNwb3NpdGlvbiApICkKKyAgICAgICAgICAgIHJldHVybiAnIScgKyBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHByZXNzaW9uSW5NYWNybygpIGNvbnN0IHsKKyAgICAgICAgaWYoIG1faW5mby5tYWNyb05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICByZXR1cm4gbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5tYWNyb05hbWUgKyAiKCAiICsgbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbiArICIgKSI7CisgICAgfQorCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6Omhhc0V4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGhhc0V4cHJlc3Npb24oKSAmJiBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSAhPSBnZXRFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Jlc3VsdERhdGEucmVjb25zdHJ1Y3RFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRNZXNzYWdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLm1lc3NhZ2U7CisgICAgfQorICAgIFNvdXJjZUxpbmVJbmZvIEFzc2VydGlvblJlc3VsdDo6Z2V0U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faW5mby5saW5lSW5mbzsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldFRlc3RNYWNyb05hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2luZm8ubWFjcm9OYW1lOworICAgIH0KKworICAgIHZvaWQgQXNzZXJ0aW9uUmVzdWx0OjpkaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIG1fcmVzdWx0RGF0YS5kZWNvbXBvc2VkRXhwcmVzc2lvbiA9IENBVENIX05VTEw7CisgICAgfQorCisgICAgdm9pZCBBc3NlcnRpb25SZXN1bHQ6OmV4cGFuZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3Jlc3VsdERhdGEucmVjb25zdHJ1Y3RFeHByZXNzaW9uKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3RfY2FzZV9pbmZvLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX0lORk9fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgVGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcyBwYXJzZVNwZWNpYWxUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSB7CisgICAgICAgIGlmKCBzdGFydHNXaXRoKCB0YWcsICcuJyApIHx8CisgICAgICAgICAgICB0YWcgPT0gImhpZGUiIHx8CisgICAgICAgICAgICB0YWcgPT0gIiFoaWRlIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpJc0hpZGRlbjsKKyAgICAgICAgZWxzZSBpZiggdGFnID09ICIhdGhyb3dzIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpUaHJvd3M7CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIXNob3VsZGZhaWwiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86OlNob3VsZEZhaWw7CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIW1heWZhaWwiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86Ok1heUZhaWw7CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIW5vbnBvcnRhYmxlIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpOb25Qb3J0YWJsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6Tm9uZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgaXNSZXNlcnZlZFRhZyggc3RkOjpzdHJpbmcgY29uc3QmIHRhZyApIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlU3BlY2lhbFRhZyggdGFnICkgPT0gVGVzdENhc2VJbmZvOjpOb25lICYmIHRhZy5zaXplKCkgPiAwICYmICFzdGQ6OmlzYWxudW0oIHRhZ1swXSApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBlbmZvcmNlTm90UmVzZXJ2ZWRUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKSB7CisgICAgICAgIGlmKCBpc1Jlc2VydmVkVGFnKCB0YWcgKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IENvbG91cihDb2xvdXI6OlJlZCkKKyAgICAgICAgICAgICAgIDw8ICJUYWcgbmFtZSBbIiA8PCB0YWcgPDwgIl0gbm90IGFsbG93ZWQuXG4iCisgICAgICAgICAgICAgICA8PCAiVGFnIG5hbWVzIHN0YXJ0aW5nIHdpdGggbm9uIGFscGhhLW51bWVyaWMgY2hhcmFjdGVycyBhcmUgcmVzZXJ2ZWRcbiIKKyAgICAgICAgICAgICAgIDw8IENvbG91cihDb2xvdXI6OkZpbGVOYW1lKQorICAgICAgICAgICAgICAgPDwgX2xpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3Ioc3Muc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgVGVzdENhc2UgbWFrZVRlc3RDYXNlKCAgSVRlc3RDYXNlKiBfdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY09yVGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkKKyAgICB7CisgICAgICAgIGJvb2wgaXNIaWRkZW4oIHN0YXJ0c1dpdGgoIF9uYW1lLCAiLi8iICkgKTsgLy8gTGVnYWN5IHN1cHBvcnQKKworICAgICAgICAvLyBQYXJzZSBvdXQgdGFncworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGFnczsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzYywgdGFnOworICAgICAgICBib29sIGluVGFnID0gZmFsc2U7CisgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBfZGVzY09yVGFncy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IF9kZXNjT3JUYWdzW2ldOworICAgICAgICAgICAgaWYoICFpblRhZyApIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnWycgKQorICAgICAgICAgICAgICAgICAgICBpblRhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZXNjICs9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnXScgKSB7CisgICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXMgcHJvcCA9IHBhcnNlU3BlY2lhbFRhZyggdGFnICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9wID09IFRlc3RDYXNlSW5mbzo6SXNIaWRkZW4gKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNIaWRkZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwcm9wID09IFRlc3RDYXNlSW5mbzo6Tm9uZSApCisgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlTm90UmVzZXJ2ZWRUYWcoIHRhZywgX2xpbmVJbmZvICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGFncy5pbnNlcnQoIHRhZyApOworICAgICAgICAgICAgICAgICAgICB0YWcuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaW5UYWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0YWcgKz0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggaXNIaWRkZW4gKSB7CisgICAgICAgICAgICB0YWdzLmluc2VydCggImhpZGUiICk7CisgICAgICAgICAgICB0YWdzLmluc2VydCggIi4iICk7CisgICAgICAgIH0KKworICAgICAgICBUZXN0Q2FzZUluZm8gaW5mbyggX25hbWUsIF9jbGFzc05hbWUsIGRlc2MsIHRhZ3MsIF9saW5lSW5mbyApOworICAgICAgICByZXR1cm4gVGVzdENhc2UoIF90ZXN0Q2FzZSwgaW5mbyApOworICAgIH0KKworICAgIHZvaWQgc2V0VGFncyggVGVzdENhc2VJbmZvJiB0ZXN0Q2FzZUluZm8sIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgdGFncyApCisgICAgeworICAgICAgICB0ZXN0Q2FzZUluZm8udGFncyA9IHRhZ3M7CisgICAgICAgIHRlc3RDYXNlSW5mby5sY2FzZVRhZ3MuY2xlYXIoKTsKKworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0YWdzLmJlZ2luKCksIGl0RW5kID0gdGFncy5lbmQoKTsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICBvc3MgPDwgJ1snIDw8ICppdCA8PCAnXSc7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsY2FzZVRhZyA9IHRvTG93ZXIoICppdCApOworICAgICAgICAgICAgdGVzdENhc2VJbmZvLnByb3BlcnRpZXMgPSBzdGF0aWNfY2FzdDxUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzPiggdGVzdENhc2VJbmZvLnByb3BlcnRpZXMgfCBwYXJzZVNwZWNpYWxUYWcoIGxjYXNlVGFnICkgKTsKKyAgICAgICAgICAgIHRlc3RDYXNlSW5mby5sY2FzZVRhZ3MuaW5zZXJ0KCBsY2FzZVRhZyApOworICAgICAgICB9CisgICAgICAgIHRlc3RDYXNlSW5mby50YWdzQXNTdHJpbmcgPSBvc3Muc3RyKCk7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvOjpUZXN0Q2FzZUluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKQorICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICBjbGFzc05hbWUoIF9jbGFzc05hbWUgKSwKKyAgICAgICAgZGVzY3JpcHRpb24oIF9kZXNjcmlwdGlvbiApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIHByb3BlcnRpZXMoIE5vbmUgKQorICAgIHsKKyAgICAgICAgc2V0VGFncyggKnRoaXMsIF90YWdzICk7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvOjpUZXN0Q2FzZUluZm8oIFRlc3RDYXNlSW5mbyBjb25zdCYgb3RoZXIgKQorICAgIDogICBuYW1lKCBvdGhlci5uYW1lICksCisgICAgICAgIGNsYXNzTmFtZSggb3RoZXIuY2xhc3NOYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBvdGhlci5kZXNjcmlwdGlvbiApLAorICAgICAgICB0YWdzKCBvdGhlci50YWdzICksCisgICAgICAgIGxjYXNlVGFncyggb3RoZXIubGNhc2VUYWdzICksCisgICAgICAgIHRhZ3NBc1N0cmluZyggb3RoZXIudGFnc0FzU3RyaW5nICksCisgICAgICAgIGxpbmVJbmZvKCBvdGhlci5saW5lSW5mbyApLAorICAgICAgICBwcm9wZXJ0aWVzKCBvdGhlci5wcm9wZXJ0aWVzICkKKyAgICB7fQorCisgICAgYm9vbCBUZXN0Q2FzZUluZm86OmlzSGlkZGVuKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgSXNIaWRkZW4gKSAhPSAwOworICAgIH0KKyAgICBib29sIFRlc3RDYXNlSW5mbzo6dGhyb3dzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgVGhyb3dzICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86Om9rVG9GYWlsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgKFNob3VsZEZhaWwgfCBNYXlGYWlsICkgKSAhPSAwOworICAgIH0KKyAgICBib29sIFRlc3RDYXNlSW5mbzo6ZXhwZWN0ZWRUb0ZhaWwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiAoU2hvdWxkRmFpbCApICkgIT0gMDsKKyAgICB9CisKKyAgICBUZXN0Q2FzZTo6VGVzdENhc2UoIElUZXN0Q2FzZSogdGVzdENhc2UsIFRlc3RDYXNlSW5mbyBjb25zdCYgaW5mbyApIDogVGVzdENhc2VJbmZvKCBpbmZvICksIHRlc3QoIHRlc3RDYXNlICkge30KKworICAgIFRlc3RDYXNlOjpUZXN0Q2FzZSggVGVzdENhc2UgY29uc3QmIG90aGVyICkKKyAgICA6ICAgVGVzdENhc2VJbmZvKCBvdGhlciApLAorICAgICAgICB0ZXN0KCBvdGhlci50ZXN0ICkKKyAgICB7fQorCisgICAgVGVzdENhc2UgVGVzdENhc2U6OndpdGhOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX25ld05hbWUgKSBjb25zdCB7CisgICAgICAgIFRlc3RDYXNlIG90aGVyKCAqdGhpcyApOworICAgICAgICBvdGhlci5uYW1lID0gX25ld05hbWU7CisgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICB9CisKKyAgICB2b2lkIFRlc3RDYXNlOjpzd2FwKCBUZXN0Q2FzZSYgb3RoZXIgKSB7CisgICAgICAgIHRlc3Quc3dhcCggb3RoZXIudGVzdCApOworICAgICAgICBuYW1lLnN3YXAoIG90aGVyLm5hbWUgKTsKKyAgICAgICAgY2xhc3NOYW1lLnN3YXAoIG90aGVyLmNsYXNzTmFtZSApOworICAgICAgICBkZXNjcmlwdGlvbi5zd2FwKCBvdGhlci5kZXNjcmlwdGlvbiApOworICAgICAgICB0YWdzLnN3YXAoIG90aGVyLnRhZ3MgKTsKKyAgICAgICAgbGNhc2VUYWdzLnN3YXAoIG90aGVyLmxjYXNlVGFncyApOworICAgICAgICB0YWdzQXNTdHJpbmcuc3dhcCggb3RoZXIudGFnc0FzU3RyaW5nICk7CisgICAgICAgIHN0ZDo6c3dhcCggVGVzdENhc2VJbmZvOjpwcm9wZXJ0aWVzLCBzdGF0aWNfY2FzdDxUZXN0Q2FzZUluZm8mPiggb3RoZXIgKS5wcm9wZXJ0aWVzICk7CisgICAgICAgIHN0ZDo6c3dhcCggbGluZUluZm8sIG90aGVyLmxpbmVJbmZvICk7CisgICAgfQorCisgICAgdm9pZCBUZXN0Q2FzZTo6aW52b2tlKCkgY29uc3QgeworICAgICAgICB0ZXN0LT5pbnZva2UoKTsKKyAgICB9CisKKyAgICBib29sIFRlc3RDYXNlOjpvcGVyYXRvciA9PSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICB0ZXN0LmdldCgpID09IG90aGVyLnRlc3QuZ2V0KCkgJiYKKyAgICAgICAgICAgICAgICBuYW1lID09IG90aGVyLm5hbWUgJiYKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPT0gb3RoZXIuY2xhc3NOYW1lOworICAgIH0KKworICAgIGJvb2wgVGVzdENhc2U6Om9wZXJhdG9yIDwgKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBuYW1lIDwgb3RoZXIubmFtZTsKKyAgICB9CisgICAgVGVzdENhc2UmIFRlc3RDYXNlOjpvcGVyYXRvciA9ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgeworICAgICAgICBUZXN0Q2FzZSB0ZW1wKCBvdGhlciApOworICAgICAgICBzd2FwKCB0ZW1wICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBUZXN0Q2FzZUluZm8gY29uc3QmIFRlc3RDYXNlOjpnZXRUZXN0Q2FzZUluZm8oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF92ZXJzaW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVkVSU0lPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFZlcnNpb246OlZlcnNpb24KKyAgICAgICAgKCAgIHVuc2lnbmVkIGludCBfbWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9taW5vclZlcnNpb24sCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX3BhdGNoTnVtYmVyLAorICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IF9icmFuY2hOYW1lLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9idWlsZE51bWJlciApCisgICAgOiAgIG1ham9yVmVyc2lvbiggX21ham9yVmVyc2lvbiApLAorICAgICAgICBtaW5vclZlcnNpb24oIF9taW5vclZlcnNpb24gKSwKKyAgICAgICAgcGF0Y2hOdW1iZXIoIF9wYXRjaE51bWJlciApLAorICAgICAgICBicmFuY2hOYW1lKCBfYnJhbmNoTmFtZSApLAorICAgICAgICBidWlsZE51bWJlciggX2J1aWxkTnVtYmVyICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFZlcnNpb24gY29uc3QmIHZlcnNpb24gKSB7CisgICAgICAgIG9zICA8PCB2ZXJzaW9uLm1ham9yVmVyc2lvbiA8PCAnLicKKyAgICAgICAgICAgIDw8IHZlcnNpb24ubWlub3JWZXJzaW9uIDw8ICcuJworICAgICAgICAgICAgPDwgdmVyc2lvbi5wYXRjaE51bWJlcjsKKyAgICAgICAgLy8gYnJhbmNoTmFtZSBpcyBuZXZlciBudWxsIC0+IDB0aCBjaGFyIGlzIFwwIGlmIGl0IGlzIGVtcHR5CisgICAgICAgIGlmICh2ZXJzaW9uLmJyYW5jaE5hbWVbMF0pIHsKKyAgICAgICAgICAgIG9zIDw8ICctJyA8PCB2ZXJzaW9uLmJyYW5jaE5hbWUKKyAgICAgICAgICAgICAgIDw8ICcuJyA8PCB2ZXJzaW9uLmJ1aWxkTnVtYmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBpbmxpbmUgVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbigpIHsKKyAgICAgICAgc3RhdGljIFZlcnNpb24gdmVyc2lvbiggMSwgOSwgNCwgIiIsIDAgKTsKKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tZXNzYWdlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUVTU0FHRV9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIE1lc3NhZ2VJbmZvOjpNZXNzYWdlSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgX3R5cGUgKQorICAgIDogICBtYWNyb05hbWUoIF9tYWNyb05hbWUgKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICB0eXBlKCBfdHlwZSApLAorICAgICAgICBzZXF1ZW5jZSggKytnbG9iYWxDb3VudCApCisgICAge30KKworICAgIC8vIFRoaXMgbWF5IG5lZWQgcHJvdGVjdGluZyBpZiB0aHJlYWRpbmcgc3VwcG9ydCBpcyBhZGRlZAorICAgIHVuc2lnbmVkIGludCBNZXNzYWdlSW5mbzo6Z2xvYmFsQ291bnQgPSAwOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgU2NvcGVkTWVzc2FnZTo6U2NvcGVkTWVzc2FnZSggTWVzc2FnZUJ1aWxkZXIgY29uc3QmIGJ1aWxkZXIgKQorICAgIDogbV9pbmZvKCBidWlsZGVyLm1faW5mbyApCisgICAgeworICAgICAgICBtX2luZm8ubWVzc2FnZSA9IGJ1aWxkZXIubV9zdHJlYW0uc3RyKCk7CisgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5wdXNoU2NvcGVkTWVzc2FnZSggbV9pbmZvICk7CisgICAgfQorICAgIFNjb3BlZE1lc3NhZ2U6OlNjb3BlZE1lc3NhZ2UoIFNjb3BlZE1lc3NhZ2UgY29uc3QmIG90aGVyICkKKyAgICA6IG1faW5mbyggb3RoZXIubV9pbmZvICkKKyAgICB7fQorCisgICAgU2NvcGVkTWVzc2FnZTo6flNjb3BlZE1lc3NhZ2UoKSB7CisgICAgICAgIGlmICggIXN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkgKXsKKyAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5wb3BTY29wZWRNZXNzYWdlKG1faW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbGVnYWN5X3JlcG9ydGVyX2FkYXB0ZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MRUdBQ1lfUkVQT1JURVJfQURBUFRFUl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2xlZ2FjeV9yZXBvcnRlcl9hZGFwdGVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0xFR0FDWV9SRVBPUlRFUl9BREFQVEVSX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgLy8gRGVwcmVjYXRlZAorICAgIHN0cnVjdCBJUmVwb3J0ZXIgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB+SVJlcG9ydGVyKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZFJlZGlyZWN0U3Rkb3V0KCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydFRlc3RpbmcoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRUZXN0aW5nKCBUb3RhbHMgY29uc3QmIHRvdGFscyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0R3JvdXAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBncm91cE5hbWUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRHcm91cCggc3RkOjpzdHJpbmcgY29uc3QmIGdyb3VwTmFtZSwgVG90YWxzIGNvbnN0JiB0b3RhbHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydFRlc3RDYXNlKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kVGVzdENhc2UoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8sIFRvdGFscyBjb25zdCYgdG90YWxzLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RkT3V0LCBzdGQ6OnN0cmluZyBjb25zdCYgc3RkRXJyICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRTZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXNjcmlwdGlvbiApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZFNlY3Rpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSwgQ291bnRzIGNvbnN0JiBhc3NlcnRpb25zICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgTm9Bc3NlcnRpb25zSW5TZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBOb0Fzc2VydGlvbnNJblRlc3RDYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdE5hbWUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBBYm9ydGVkKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyIDogcHVibGljIFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIExlZ2FjeVJlcG9ydGVyQWRhcHRlciggUHRyPElSZXBvcnRlcj4gY29uc3QmIGxlZ2FjeVJlcG9ydGVyICk7CisgICAgICAgIHZpcnR1YWwgfkxlZ2FjeVJlcG9ydGVyQWRhcHRlcigpOworCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHRyPElSZXBvcnRlcj4gbV9sZWdhY3lSZXBvcnRlcjsKKyAgICB9OworfQorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OkxlZ2FjeVJlcG9ydGVyQWRhcHRlciggUHRyPElSZXBvcnRlcj4gY29uc3QmIGxlZ2FjeVJlcG9ydGVyICkKKyAgICA6ICAgbV9sZWdhY3lSZXBvcnRlciggbGVnYWN5UmVwb3J0ZXIgKQorICAgIHt9CisgICAgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp+TGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCkge30KKworICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpnZXRQcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBwcmVmczsKKyAgICAgICAgcHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBtX2xlZ2FjeVJlcG9ydGVyLT5zaG91bGRSZWRpcmVjdFN0ZG91dCgpOworICAgICAgICByZXR1cm4gcHJlZnM7CisgICAgfQorCisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6Om5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApIHt9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydFRlc3RpbmcoKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRHcm91cCggZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0VGVzdENhc2UoIHRlc3RJbmZvICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRTZWN0aW9uKCBzZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uSW5mby5kZXNjcmlwdGlvbiApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6YXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgeworICAgICAgICAvLyBOb3Qgb24gbGVnYWN5IGludGVyZmFjZQorICAgIH0KKworICAgIGJvb2wgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjphc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgeworICAgICAgICBpZiggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Ok9rICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCksIGl0RW5kID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkgeworICAgICAgICAgICAgICAgICAgICBSZXN1bHRCdWlsZGVyIHJiKCBpdC0+bWFjcm9OYW1lLmNfc3RyKCksIGl0LT5saW5lSW5mbywgIiIsIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgKTsKKyAgICAgICAgICAgICAgICAgICAgcmIgPDwgaXQtPm1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgIHJiLnNldFJlc3VsdFR5cGUoIFJlc3VsdFdhczo6SW5mbyApOworICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0ID0gcmIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+UmVzdWx0KCByZXN1bHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+UmVzdWx0KCBhc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQgKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgeworICAgICAgICBpZiggc2VjdGlvblN0YXRzLm1pc3NpbmdBc3NlcnRpb25zICkKKyAgICAgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPk5vQXNzZXJ0aW9uc0luU2VjdGlvbiggc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgKTsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kU2VjdGlvbiggc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRUZXN0Q2FzZQorICAgICAgICAgICAgKCAgIHRlc3RDYXNlU3RhdHMudGVzdEluZm8sCisgICAgICAgICAgICAgICAgdGVzdENhc2VTdGF0cy50b3RhbHMsCisgICAgICAgICAgICAgICAgdGVzdENhc2VTdGF0cy5zdGRPdXQsCisgICAgICAgICAgICAgICAgdGVzdENhc2VTdGF0cy5zdGRFcnIgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSB7CisgICAgICAgIGlmKCB0ZXN0R3JvdXBTdGF0cy5hYm9ydGluZyApCisgICAgICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5BYm9ydGVkKCk7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZEdyb3VwKCB0ZXN0R3JvdXBTdGF0cy5ncm91cEluZm8ubmFtZSwgdGVzdEdyb3VwU3RhdHMudG90YWxzICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRUZXN0aW5nKCB0ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIHsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90aW1lci5ocHAKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzExLWxvbmctbG9uZyIKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworCisjZWxzZQorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyAgICAgICAgVUludDY0IGdldEN1cnJlbnRUaWNrcygpIHsKKyAgICAgICAgICAgIHN0YXRpYyBVSW50NjQgaHo9MCwgaHpvPTA7CisgICAgICAgICAgICBpZiAoIWh6KSB7CisgICAgICAgICAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSggcmVpbnRlcnByZXRfY2FzdDxMQVJHRV9JTlRFR0VSKj4oICZoeiApICk7CisgICAgICAgICAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmaHpvICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVJbnQ2NCB0OworICAgICAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmdCApICk7CisgICAgICAgICAgICByZXR1cm4gKCh0LWh6bykqMTAwMDAwMCkvaHo7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIFVJbnQ2NCBnZXRDdXJyZW50VGlja3MoKSB7CisgICAgICAgICAgICB0aW1ldmFsIHQ7CisgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoJnQsQ0FUQ0hfTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VUludDY0PiggdC50dl9zZWMgKSAqIDEwMDAwMDB1bGwgKyBzdGF0aWNfY2FzdDxVSW50NjQ+KCB0LnR2X3VzZWMgKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgdm9pZCBUaW1lcjo6c3RhcnQoKSB7CisgICAgICAgIG1fdGlja3MgPSBnZXRDdXJyZW50VGlja3MoKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IFRpbWVyOjpnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihnZXRDdXJyZW50VGlja3MoKSAtIG1fdGlja3MpOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgVGltZXI6OmdldEVsYXBzZWRNaWxsaXNlY29uZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKS8xMDAwKTsKKyAgICB9CisgICAgZG91YmxlIFRpbWVyOjpnZXRFbGFwc2VkU2Vjb25kcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKS8xMDAwMDAwLjA7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21tb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01NT05fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNjdHlwZT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKSB7CisgICAgICAgIHJldHVybiBzLnNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmIHN0ZDo6ZXF1YWwocHJlZml4LmJlZ2luKCksIHByZWZpeC5lbmQoKSwgcy5iZWdpbigpKTsKKyAgICB9CisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBwcmVmaXggKSB7CisgICAgICAgIHJldHVybiAhcy5lbXB0eSgpICYmIHNbMF0gPT0gcHJlZml4OworICAgIH0KKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHN1ZmZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuc2l6ZSgpID49IHN1ZmZpeC5zaXplKCkgJiYgc3RkOjplcXVhbChzdWZmaXgucmJlZ2luKCksIHN1ZmZpeC5yZW5kKCksIHMucmJlZ2luKCkpOworICAgIH0KKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBzdWZmaXggKSB7CisgICAgICAgIHJldHVybiAhcy5lbXB0eSgpICYmIHNbcy5zaXplKCktMV0gPT0gc3VmZml4OworICAgIH0KKyAgICBib29sIGNvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIGluZml4ICkgeworICAgICAgICByZXR1cm4gcy5maW5kKCBpbmZpeCApICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgIH0KKyAgICBjaGFyIHRvTG93ZXJDaChjaGFyIGMpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KCBzdGQ6OnRvbG93ZXIoIGMgKSApOworICAgIH0KKyAgICB2b2lkIHRvTG93ZXJJblBsYWNlKCBzdGQ6OnN0cmluZyYgcyApIHsKKyAgICAgICAgc3RkOjp0cmFuc2Zvcm0oIHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCB0b0xvd2VyQ2ggKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdG9Mb3dlciggc3RkOjpzdHJpbmcgY29uc3QmIHMgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxjID0gczsKKyAgICAgICAgdG9Mb3dlckluUGxhY2UoIGxjICk7CisgICAgICAgIHJldHVybiBsYzsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdHJpbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIHsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QqIHdoaXRlc3BhY2VDaGFycyA9ICJcblxyXHQgIjsKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzdGFydCA9IHN0ci5maW5kX2ZpcnN0X25vdF9vZiggd2hpdGVzcGFjZUNoYXJzICk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gc3RyLmZpbmRfbGFzdF9ub3Rfb2YoIHdoaXRlc3BhY2VDaGFycyApOworCisgICAgICAgIHJldHVybiBzdGFydCAhPSBzdGQ6OnN0cmluZzo6bnBvcyA/IHN0ci5zdWJzdHIoIHN0YXJ0LCAxK2VuZC1zdGFydCApIDogc3RkOjpzdHJpbmcoKTsKKyAgICB9CisKKyAgICBib29sIHJlcGxhY2VJblBsYWNlKCBzdGQ6OnN0cmluZyYgc3RyLCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwbGFjZVRoaXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB3aXRoVGhpcyApIHsKKyAgICAgICAgYm9vbCByZXBsYWNlZCA9IGZhbHNlOworICAgICAgICBzdGQ6OnNpemVfdCBpID0gc3RyLmZpbmQoIHJlcGxhY2VUaGlzICk7CisgICAgICAgIHdoaWxlKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgcmVwbGFjZWQgPSB0cnVlOworICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0ciggMCwgaSApICsgd2l0aFRoaXMgKyBzdHIuc3Vic3RyKCBpK3JlcGxhY2VUaGlzLnNpemUoKSApOworICAgICAgICAgICAgaWYoIGkgPCBzdHIuc2l6ZSgpLXdpdGhUaGlzLnNpemUoKSApCisgICAgICAgICAgICAgICAgaSA9IHN0ci5maW5kKCByZXBsYWNlVGhpcywgaSt3aXRoVGhpcy5zaXplKCkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGxhY2VkOworICAgIH0KKworICAgIHBsdXJhbGlzZTo6cGx1cmFsaXNlKCBzdGQ6OnNpemVfdCBjb3VudCwgc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsICkKKyAgICA6ICAgbV9jb3VudCggY291bnQgKSwKKyAgICAgICAgbV9sYWJlbCggbGFiZWwgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgcGx1cmFsaXNlIGNvbnN0JiBwbHVyYWxpc2VyICkgeworICAgICAgICBvcyA8PCBwbHVyYWxpc2VyLm1fY291bnQgPDwgJyAnIDw8IHBsdXJhbGlzZXIubV9sYWJlbDsKKyAgICAgICAgaWYoIHBsdXJhbGlzZXIubV9jb3VudCAhPSAxICkKKyAgICAgICAgICAgIG9zIDw8ICdzJzsKKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIFNvdXJjZUxpbmVJbmZvOjpTb3VyY2VMaW5lSW5mbygpIDogZmlsZSgiIiksIGxpbmUoIDAgKXt9CisgICAgU291cmNlTGluZUluZm86OlNvdXJjZUxpbmVJbmZvKCBjaGFyIGNvbnN0KiBfZmlsZSwgc3RkOjpzaXplX3QgX2xpbmUgKQorICAgIDogICBmaWxlKCBfZmlsZSApLAorICAgICAgICBsaW5lKCBfbGluZSApCisgICAge30KKyAgICBib29sIFNvdXJjZUxpbmVJbmZvOjplbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGZpbGVbMF0gPT0gJ1wwJzsKKyAgICB9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6b3BlcmF0b3IgPT0gKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaW5lID09IG90aGVyLmxpbmUgJiYgKGZpbGUgPT0gb3RoZXIuZmlsZSB8fCBzdGQ6OnN0cmNtcChmaWxlLCBvdGhlci5maWxlKSA9PSAwKTsKKyAgICB9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6b3BlcmF0b3IgPCAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxpbmUgPCBvdGhlci5saW5lIHx8ICggbGluZSA9PSBvdGhlci5saW5lICYmIChzdGQ6OnN0cmNtcChmaWxlLCBvdGhlci5maWxlKSA8IDApKTsKKyAgICB9CisKKyAgICB2b2lkIHNlZWRSbmcoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgaWYoIGNvbmZpZy5ybmdTZWVkKCkgIT0gMCApCisgICAgICAgICAgICBzdGQ6OnNyYW5kKCBjb25maWcucm5nU2VlZCgpICk7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBybmdTZWVkKCkgeworICAgICAgICByZXR1cm4gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+cm5nU2VlZCgpOworICAgIH0KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgaW5mbyApIHsKKyNpZm5kZWYgX19HTlVHX18KKyAgICAgICAgb3MgPDwgaW5mby5maWxlIDw8ICcoJyA8PCBpbmZvLmxpbmUgPDwgJyknOworI2Vsc2UKKyAgICAgICAgb3MgPDwgaW5mby5maWxlIDw8ICc6JyA8PCBpbmZvLmxpbmU7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIHZvaWQgdGhyb3dMb2dpY0Vycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSwgU291cmNlTGluZUluZm8gY29uc3QmIGxvY2F0aW9uSW5mbyApIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgb3NzIDw8IGxvY2F0aW9uSW5mbyA8PCAiOiBJbnRlcm5hbCBDYXRjaCBlcnJvcjogJyIgPDwgbWVzc2FnZSA8PCAnXCcnOworICAgICAgICBpZiggYWx3YXlzVHJ1ZSgpICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIG9zcy5zdHIoKSApOworICAgIH0KK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3NlY3Rpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgU2VjdGlvbkluZm86OlNlY3Rpb25JbmZvCisgICAgICAgICggICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiApCisgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApCisgICAge30KKworICAgIFNlY3Rpb246OlNlY3Rpb24oIFNlY3Rpb25JbmZvIGNvbnN0JiBpbmZvICkKKyAgICA6ICAgbV9pbmZvKCBpbmZvICksCisgICAgICAgIG1fc2VjdGlvbkluY2x1ZGVkKCBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvblN0YXJ0ZWQoIG1faW5mbywgbV9hc3NlcnRpb25zICkgKQorICAgIHsKKyAgICAgICAgbV90aW1lci5zdGFydCgpOworICAgIH0KKworICAgIFNlY3Rpb246On5TZWN0aW9uKCkgeworICAgICAgICBpZiggbV9zZWN0aW9uSW5jbHVkZWQgKSB7CisgICAgICAgICAgICBTZWN0aW9uRW5kSW5mbyBlbmRJbmZvKCBtX2luZm8sIG1fYXNzZXJ0aW9ucywgbV90aW1lci5nZXRFbGFwc2VkU2Vjb25kcygpICk7CisgICAgICAgICAgICBpZiggc3RkOjp1bmNhdWdodF9leGNlcHRpb24oKSApCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25FbmRlZEVhcmx5KCBlbmRJbmZvICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25FbmRlZCggZW5kSW5mbyApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90CisgICAgU2VjdGlvbjo6b3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fc2VjdGlvbkluY2x1ZGVkOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9kZWJ1Z2dlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0RFQlVHR0VSX0hQUF9JTkNMVURFRAorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fTUFDCisKKyAgICAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisgICAgI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorICAgICNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKKyAgICBuYW1lc3BhY2UgQ2F0Y2h7CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZSBmb2xsb3dpbmcgdGVjaG5pY2FsIG5vdGU6CisgICAgICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjLyNxYS9xYTIwMDQvcWExMzYxLmh0bWwKKworICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBiZWluZyBkZWJ1Z2dlZCAoZWl0aGVyCisgICAgICAgIC8vIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyIG9yIGhhcyBhIGRlYnVnZ2VyIGF0dGFjaGVkIHBvc3QgZmFjdG8pLgorICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKXsKKworICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtaWJbNF07CisgICAgICAgICAgICBzdHJ1Y3Qga2luZm9fcHJvYyAgIGluZm87CisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIHNpemU7CisKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZsYWdzIHNvIHRoYXQsIGlmIHN5c2N0bCBmYWlscyBmb3Igc29tZSBiaXphcnJlCisgICAgICAgICAgICAvLyByZWFzb24sIHdlIGdldCBhIHByZWRpY3RhYmxlIHJlc3VsdC4KKworICAgICAgICAgICAgaW5mby5rcF9wcm9jLnBfZmxhZyA9IDA7CisKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbWliLCB3aGljaCB0ZWxscyBzeXNjdGwgdGhlIGluZm8gd2Ugd2FudCwgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAvLyB3ZSdyZSBsb29raW5nIGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHByb2Nlc3MgSUQuCisKKyAgICAgICAgICAgIG1pYlswXSA9IENUTF9LRVJOOworICAgICAgICAgICAgbWliWzFdID0gS0VSTl9QUk9DOworICAgICAgICAgICAgbWliWzJdID0gS0VSTl9QUk9DX1BJRDsKKyAgICAgICAgICAgIG1pYlszXSA9IGdldHBpZCgpOworCisgICAgICAgICAgICAvLyBDYWxsIHN5c2N0bC4KKworICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihpbmZvKTsKKyAgICAgICAgICAgIGlmKCBzeXNjdGwobWliLCBzaXplb2YobWliKSAvIHNpemVvZigqbWliKSwgJmluZm8sICZzaXplLCBDQVRDSF9OVUxMLCAwKSAhPSAwICkgeworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgIlxuKiogQ2FsbCB0byBzeXNjdGwgZmFpbGVkIC0gdW5hYmxlIHRvIGRldGVybWluZSBpZiBkZWJ1Z2dlciBpcyBhY3RpdmUgKipcbiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UncmUgYmVpbmcgZGVidWdnZWQgaWYgdGhlIFBfVFJBQ0VEIGZsYWcgaXMgc2V0LgorCisgICAgICAgICAgICByZXR1cm4gKCAoaW5mby5rcF9wcm9jLnBfZmxhZyAmIFBfVFJBQ0VEKSAhPSAwICk7CisgICAgICAgIH0KKyAgICB9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjZWxpZiBkZWZpbmVkKENBVENIX1BMQVRGT1JNX0xJTlVYKQorICAgICNpbmNsdWRlIDxmc3RyZWFtPgorICAgICNpbmNsdWRlIDxzdHJpbmc+CisKKyAgICBuYW1lc3BhY2UgQ2F0Y2h7CisgICAgICAgIC8vIFRoZSBzdGFuZGFyZCBQT1NJWCB3YXkgb2YgZGV0ZWN0aW5nIGEgZGVidWdnZXIgaXMgdG8gYXR0ZW1wdCB0bworICAgICAgICAvLyBwdHJhY2UoKSB0aGUgcHJvY2VzcywgYnV0IHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBmcm9tIGEgY2hpbGQgYW5kIG5vdAorICAgICAgICAvLyB0aGlzIHByb2Nlc3MgaXRzZWxmIHRvIHN0aWxsIGFsbG93IGF0dGFjaGluZyB0byB0aGlzIHByb2Nlc3MgbGF0ZXIKKyAgICAgICAgLy8gaWYgd2FudGVkLCBzbyBpcyByYXRoZXIgaGVhdnkuIFVuZGVyIExpbnV4IHdlIGhhdmUgdGhlIFBJRCBvZiB0aGUKKyAgICAgICAgLy8gImRlYnVnZ2VyIiAod2hpY2ggZG9lc24ndCBuZWVkIHRvIGJlIGdkYiwgb2YgY291cnNlLCBpdCBjb3VsZCBhbHNvCisgICAgICAgIC8vIGJlIHN0cmFjZSwgZm9yIGV4YW1wbGUpIGluIC9wcm9jLyRQSUQvc3RhdHVzLCBzbyBqdXN0IGdldCBpdCBmcm9tCisgICAgICAgIC8vIHRoZXJlIGluc3RlYWQuCisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpeworICAgICAgICAgICAgLy8gTGlic3RkYysrIGhhcyBhIGJ1Zywgd2hlcmUgc3RkOjppZnN0cmVhbSBzZXRzIGVycm5vIHRvIDAKKyAgICAgICAgICAgIC8vIFRoaXMgd2F5IG91ciB1c2VycyBjYW4gcHJvcGVybHkgYXNzZXJ0IG92ZXIgZXJybm8gdmFsdWVzCisgICAgICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworICAgICAgICAgICAgc3RkOjppZnN0cmVhbSBpbigiL3Byb2Mvc2VsZi9zdGF0dXMiKTsKKyAgICAgICAgICAgIGZvciggc3RkOjpzdHJpbmcgbGluZTsgc3RkOjpnZXRsaW5lKGluLCBsaW5lKTsgKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBQUkVGSVhfTEVOID0gMTE7CisgICAgICAgICAgICAgICAgaWYoIGxpbmUuY29tcGFyZSgwLCBQUkVGSVhfTEVOLCAiVHJhY2VyUGlkOlx0IikgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgdHJhY2VkIGlmIHRoZSBQSUQgaXMgbm90IDAgYW5kIG5vIG90aGVyIFBJRCBzdGFydHMKKyAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCAwIGRpZ2l0LCBzbyBpdCdzIGVub3VnaCB0byBjaGVjayBmb3IganVzdCBhIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXIuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCgpID4gUFJFRklYX0xFTiAmJiBsaW5lW1BSRUZJWF9MRU5dICE9ICcwJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gLy8gbmFtZXNwYWNlIENhdGNoCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBfX3N0ZGNhbGwgSXNEZWJ1Z2dlclByZXNlbnQoKTsKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKSB7CisgICAgICAgICAgICByZXR1cm4gSXNEZWJ1Z2dlclByZXNlbnQoKSAhPSAwOworICAgICAgICB9CisgICAgfQorI2VsaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgICBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgX19zdGRjYWxsIElzRGVidWdnZXJQcmVzZW50KCk7CisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeworICAgICAgICAgICAgcmV0dXJuIElzRGVidWdnZXJQcmVzZW50KCkgIT0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICBpbmxpbmUgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9CisjZW5kaWYgLy8gUGxhdGZvcm0KKworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICA6Ok91dHB1dERlYnVnU3RyaW5nQSggdGV4dC5jX3N0cigpICk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICAvLyAhVEJEOiBOZWVkIGEgdmVyc2lvbiBmb3IgTWFjLyBYQ29kZSBhbmQgb3RoZXIgSURFcworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXh0OworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIFBsYXRmb3JtCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90b3N0cmluZy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RPU1RSSU5HX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHVucHJpbnRhYmxlU3RyaW5nID0gIns/fSI7CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBjb25zdCBpbnQgaGV4VGhyZXNob2xkID0gMjU1OworCisgICAgICAgIHN0cnVjdCBFbmRpYW5uZXNzIHsKKyAgICAgICAgICAgIGVudW0gQXJjaCB7IEJpZywgTGl0dGxlIH07CisKKyAgICAgICAgICAgIHN0YXRpYyBBcmNoIHdoaWNoKCkgeworICAgICAgICAgICAgICAgIHVuaW9uIF97CisgICAgICAgICAgICAgICAgICAgIGludCBhc0ludDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBhc0NoYXJbc2l6ZW9mIChpbnQpXTsKKyAgICAgICAgICAgICAgICB9IHU7CisKKyAgICAgICAgICAgICAgICB1LmFzSW50ID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCB1LmFzQ2hhcltzaXplb2YoaW50KS0xXSA9PSAxICkgPyBCaWcgOiBMaXR0bGU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcmF3TWVtb3J5VG9TdHJpbmcoIGNvbnN0IHZvaWQgKm9iamVjdCwgc3RkOjpzaXplX3Qgc2l6ZSApCisgICAgeworICAgICAgICAvLyBSZXZlcnNlIG9yZGVyIGZvciBsaXR0bGUgZW5kaWFuIGFyY2hpdGVjdHVyZXMKKyAgICAgICAgaW50IGkgPSAwLCBlbmQgPSBzdGF0aWNfY2FzdDxpbnQ+KCBzaXplICksIGluYyA9IDE7CisgICAgICAgIGlmKCBFbmRpYW5uZXNzOjp3aGljaCgpID09IEVuZGlhbm5lc3M6OkxpdHRsZSApIHsKKyAgICAgICAgICAgIGkgPSBlbmQtMTsKKyAgICAgICAgICAgIGVuZCA9IGluYyA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgY2hhciBjb25zdCAqYnl0ZXMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyIGNvbnN0ICo+KG9iamVjdCk7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgb3MgPDwgIjB4IiA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleDsKKyAgICAgICAgZm9yKCA7IGkgIT0gZW5kOyBpICs9IGluYyApCisgICAgICAgICAgICAgb3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihieXRlc1tpXSk7CisgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKKyAgICBzdGQ6OnN0cmluZyBzID0gdmFsdWU7CisgICAgaWYoIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnNob3dJbnZpc2libGVzKCkgKSB7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3ViczsKKyAgICAgICAgICAgIHN3aXRjaCggc1tpXSApIHsKKyAgICAgICAgICAgIGNhc2UgJ1xuJzogc3VicyA9ICJcXG4iOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1x0Jzogc3VicyA9ICJcXHQiOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFzdWJzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyKCAwLCBpICkgKyBzdWJzICsgcy5zdWJzdHIoIGkrMSApOworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJyInICsgcyArICciJzsKK30KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OndzdHJpbmcgY29uc3QmIHZhbHVlICkgeworCisgICAgc3RkOjpzdHJpbmcgczsKKyAgICBzLnJlc2VydmUoIHZhbHVlLnNpemUoKSApOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZS5zaXplKCk7ICsraSApCisgICAgICAgIHMgKz0gdmFsdWVbaV0gPD0gMHhmZiA/IHN0YXRpY19jYXN0PGNoYXI+KCB2YWx1ZVtpXSApIDogJz8nOworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHMgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlICkgeworICAgIHJldHVybiB2YWx1ZSA/IENhdGNoOjp0b1N0cmluZyggc3RkOjpzdHJpbmcoIHZhbHVlICkgKSA6IHN0ZDo6c3RyaW5nKCAie251bGwgc3RyaW5nfSIgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIqIGNvbnN0IHZhbHVlICkgeworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPiggdmFsdWUgKSApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3Qgd2NoYXJfdCogY29uc3QgdmFsdWUgKQoreworICAgIHJldHVybiB2YWx1ZSA/IENhdGNoOjp0b1N0cmluZyggc3RkOjp3c3RyaW5nKHZhbHVlKSApIDogc3RkOjpzdHJpbmcoICJ7bnVsbCBzdHJpbmd9IiApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggd2NoYXJfdCogY29uc3QgdmFsdWUgKQoreworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QqPiggdmFsdWUgKSApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggaW50IHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgaW50IHZhbHVlICkgeworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCB2YWx1ZSApICk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBmcFRvU3RyaW5nKCBUIHZhbHVlLCBpbnQgcHJlY2lzaW9uICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKCBwcmVjaXNpb24gKQorICAgICAgICA8PCBzdGQ6OmZpeGVkCisgICAgICAgIDw8IHZhbHVlOworICAgIHN0ZDo6c3RyaW5nIGQgPSBvc3Muc3RyKCk7CisgICAgc3RkOjpzaXplX3QgaSA9IGQuZmluZF9sYXN0X25vdF9vZiggJzAnICk7CisgICAgaWYoIGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgaSAhPSBkLnNpemUoKS0xICkgeworICAgICAgICBpZiggZFtpXSA9PSAnLicgKQorICAgICAgICAgICAgaSsrOworICAgICAgICBkID0gZC5zdWJzdHIoIDAsIGkrMSApOworICAgIH0KKyAgICByZXR1cm4gZDsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGRvdWJsZSB2YWx1ZSApIHsKKyAgICByZXR1cm4gZnBUb1N0cmluZyggdmFsdWUsIDEwICk7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZmxvYXQgdmFsdWUgKSB7CisgICAgcmV0dXJuIGZwVG9TdHJpbmcoIHZhbHVlLCA1ICkgKyAnZic7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBib29sIHZhbHVlICkgeworICAgIHJldHVybiB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyIHZhbHVlICkgeworICAgIGlmICggdmFsdWUgPT0gJ1xyJyApCisgICAgICAgIHJldHVybiAiJ1xcciciOworICAgIGlmICggdmFsdWUgPT0gJ1xmJyApCisgICAgICAgIHJldHVybiAiJ1xcZiciOworICAgIGlmICggdmFsdWUgPT0gJ1xuJyApCisgICAgICAgIHJldHVybiAiJ1xcbiciOworICAgIGlmICggdmFsdWUgPT0gJ1x0JyApCisgICAgICAgIHJldHVybiAiJ1xcdCciOworICAgIGlmICggJ1wwJyA8PSB2YWx1ZSAmJiB2YWx1ZSA8ICcgJyApCisgICAgICAgIHJldHVybiB0b1N0cmluZyggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggdmFsdWUgKSApOworICAgIGNoYXIgY2hzdHJbXSA9ICInICciOworICAgIGNoc3RyWzFdID0gdmFsdWU7CisgICAgcmV0dXJuIGNoc3RyOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc2lnbmVkIGNoYXIgdmFsdWUgKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWUgKSApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgY2hhciB2YWx1ZSApIHsKKyAgICByZXR1cm4gdG9TdHJpbmcoIHN0YXRpY19jYXN0PGNoYXI+KCB2YWx1ZSApICk7Cit9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCitzdGQ6OnN0cmluZyB0b1N0cmluZyggbG9uZyBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6bnVsbHB0cl90ICkgeworICAgIHJldHVybiAibnVsbHB0ciI7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fT0JKQ19fCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nIGNvbnN0ICogY29uc3QmIG5zc3RyaW5nICkgeworICAgICAgICBpZiggIW5zc3RyaW5nICkKKyAgICAgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgICAgcmV0dXJuICJAIiArIHRvU3RyaW5nKFtuc3N0cmluZyBVVEY4U3RyaW5nXSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyAqIENBVENIX0FSQ19TVFJPTkcgY29uc3QmIG5zc3RyaW5nICkgeworICAgICAgICBpZiggIW5zc3RyaW5nICkKKyAgICAgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgICAgcmV0dXJuICJAIiArIHRvU3RyaW5nKFtuc3N0cmluZyBVVEY4U3RyaW5nXSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU09iamVjdCogY29uc3QmIG5zT2JqZWN0ICkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoIFtuc09iamVjdCBkZXNjcmlwdGlvbl0gKTsKKyAgICB9CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXN1bHRfYnVpbGRlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFU1VMVF9CVUlMREVSX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RkOjpzdHJpbmcgY2FwdHVyZWRFeHByZXNzaW9uV2l0aFNlY29uZEFyZ3VtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgY2FwdHVyZWRFeHByZXNzaW9uLCBzdGQ6OnN0cmluZyBjb25zdCYgc2Vjb25kQXJnICkgeworICAgICAgICByZXR1cm4gc2Vjb25kQXJnLmVtcHR5KCkgfHwgc2Vjb25kQXJnID09ICJcIlwiIgorICAgICAgICAgICAgPyBjYXB0dXJlZEV4cHJlc3Npb24KKyAgICAgICAgICAgIDogY2FwdHVyZWRFeHByZXNzaW9uICsgIiwgIiArIHNlY29uZEFyZzsKKyAgICB9CisgICAgUmVzdWx0QnVpbGRlcjo6UmVzdWx0QnVpbGRlciggICBjaGFyIGNvbnN0KiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBjYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBzZWNvbmRBcmcgKQorICAgIDogICBtX2Fzc2VydGlvbkluZm8oIG1hY3JvTmFtZSwgbGluZUluZm8sIGNhcHR1cmVkRXhwcmVzc2lvbldpdGhTZWNvbmRBcmd1bWVudCggY2FwdHVyZWRFeHByZXNzaW9uLCBzZWNvbmRBcmcgKSwgcmVzdWx0RGlzcG9zaXRpb24gKSwKKyAgICAgICAgbV9zaG91bGREZWJ1Z0JyZWFrKCBmYWxzZSApLAorICAgICAgICBtX3Nob3VsZFRocm93KCBmYWxzZSApLAorICAgICAgICBtX2d1YXJkRXhjZXB0aW9uKCBmYWxzZSApCisgICAge30KKworICAgIFJlc3VsdEJ1aWxkZXI6On5SZXN1bHRCdWlsZGVyKCkgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyAgICAgICAgaWYgKCBtX2d1YXJkRXhjZXB0aW9uICkgeworICAgICAgICAgICAgbV9zdHJlYW0ub3NzIDw8ICJFeGNlcHRpb24gdHJhbnNsYXRpb24gd2FzIGRpc2FibGVkIGJ5IENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUiOworICAgICAgICAgICAgY2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbiApOworICAgICAgICAgICAgZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSZXN1bHRDYXB0dXJlKCktPmV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgUmVzdWx0QnVpbGRlciYgUmVzdWx0QnVpbGRlcjo6c2V0UmVzdWx0VHlwZSggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0ICkgeworICAgICAgICBtX2RhdGEucmVzdWx0VHlwZSA9IHJlc3VsdDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBSZXN1bHRCdWlsZGVyJiBSZXN1bHRCdWlsZGVyOjpzZXRSZXN1bHRUeXBlKCBib29sIHJlc3VsdCApIHsKKyAgICAgICAgbV9kYXRhLnJlc3VsdFR5cGUgPSByZXN1bHQgPyBSZXN1bHRXYXM6Ok9rIDogUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjplbmRFeHByZXNzaW9uKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IGJ1aWxkKCBleHByICk7CisgICAgICAgIGhhbmRsZVJlc3VsdCggcmVzdWx0ICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjp1c2VBY3RpdmVFeGNlcHRpb24oIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiApIHsKKyAgICAgICAgbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uID0gcmVzdWx0RGlzcG9zaXRpb247CisgICAgICAgIG1fc3RyZWFtLm9zcyA8PCBDYXRjaDo6dHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgICAgIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24gKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUgKSB7CisgICAgICAgIHNldFJlc3VsdFR5cGUoIHJlc3VsdFR5cGUgKTsKKyAgICAgICAgY2FwdHVyZUV4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIGV4cGVjdGVkTWVzc2FnZSApIHsKKyAgICAgICAgaWYoIGV4cGVjdGVkTWVzc2FnZS5lbXB0eSgpICkKKyAgICAgICAgICAgIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoQWxsT2Y8c3RkOjpzdHJpbmc+KCkgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6RXF1YWxzKCBleHBlY3RlZE1lc3NhZ2UgKSApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IGNvbnN0JiBtYXRjaGVyICkgeworCisgICAgICAgIGFzc2VydCggIWlzRmFsc2VUZXN0KCBtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKSApOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIGRhdGEgPSBtX2RhdGE7CisgICAgICAgIGRhdGEucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6T2s7CisgICAgICAgIGRhdGEucmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBtX2Fzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBDYXRjaDo6dHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgICAgIGlmKCAhbWF0Y2hlci5tYXRjaCggYWN0dWFsTWVzc2FnZSApICkgeworICAgICAgICAgICAgZGF0YS5yZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOworICAgICAgICAgICAgZGF0YS5yZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiA9IGFjdHVhbE1lc3NhZ2U7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCggbV9hc3NlcnRpb25JbmZvLCBkYXRhICk7CisgICAgICAgIGhhbmRsZVJlc3VsdCggcmVzdWx0ICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlRXhwcmVzc2lvbigpIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IGJ1aWxkKCk7CisgICAgICAgIGhhbmRsZVJlc3VsdCggcmVzdWx0ICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpoYW5kbGVSZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICkKKyAgICB7CisgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5hc3NlcnRpb25FbmRlZCggcmVzdWx0ICk7CisKKyAgICAgICAgaWYoICFyZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgaWYoIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnNob3VsZERlYnVnQnJlYWsoKSApCisgICAgICAgICAgICAgICAgbV9zaG91bGREZWJ1Z0JyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldFJ1bm5lcigpLT5hYm9ydGluZygpIHx8IChtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gJiBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsKSApCisgICAgICAgICAgICAgICAgbV9zaG91bGRUaHJvdyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnJlYWN0KCkgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyAgICAgICAgaWYgKG1fc2hvdWxkRGVidWdCcmVhaykgeworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgLy8gVG8gaW5zcGVjdCB0aGUgc3RhdGUgZHVyaW5nIHRlc3QsIHlvdSBuZWVkIHRvIGdvIG9uZSBsZXZlbCB1cCB0aGUgY2FsbHN0YWNrCisgICAgICAgICAgICAvLyBUbyBnbyBiYWNrIHRvIHRoZSB0ZXN0IGFuZCBjaGFuZ2UgZXhlY3V0aW9uLCBqdW1wIG92ZXIgdGhlIHRocm93IHN0YXRlbWVudAorICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYoIG1fc2hvdWxkVGhyb3cgKQorICAgICAgICAgICAgdGhyb3cgQ2F0Y2g6OlRlc3RGYWlsdXJlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgYm9vbCBSZXN1bHRCdWlsZGVyOjpzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgeyByZXR1cm4gbV9zaG91bGREZWJ1Z0JyZWFrOyB9CisgICAgYm9vbCBSZXN1bHRCdWlsZGVyOjphbGxvd1Rocm93cygpIGNvbnN0IHsgcmV0dXJuIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPmFsbG93VGhyb3dzKCk7IH0KKworICAgIEFzc2VydGlvblJlc3VsdCBSZXN1bHRCdWlsZGVyOjpidWlsZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYnVpbGQoICp0aGlzICk7CisgICAgfQorCisgICAgLy8gQ0FWRUFUOiBUaGUgcmV0dXJuZWQgQXNzZXJ0aW9uUmVzdWx0IHN0b3JlcyBhIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IGV4cHIsCisgICAgLy8gICAgICAgICBhIHRlbXBvcmFyeSBEZWNvbXBvc2VkRXhwcmVzc2lvbiwgd2hpY2ggaW4gdHVybiBob2xkcyByZWZlcmVuY2VzIHRvCisgICAgLy8gICAgICAgICBvcGVyYW5kcywgcG9zc2libHkgdGVtcG9yYXJ5IGFzIHdlbGwuCisgICAgLy8gICAgICAgICBJdCBzaG91bGQgaW1tZWRpYXRlbHkgYmUgcGFzc2VkIHRvIGhhbmRsZVJlc3VsdDsgaWYgdGhlIGV4cHJlc3Npb24KKyAgICAvLyAgICAgICAgIG5lZWRzIHRvIGJlIHJlcG9ydGVkLCBpdHMgc3RyaW5nIGV4cGFuc2lvbiBtdXN0IGJlIGNvbXBvc2VkIGJlZm9yZQorICAgIC8vICAgICAgICAgdGhlIHRlbXBvcmFyaWVzIGFyZSBkZXN0cm95ZWQuCisgICAgQXNzZXJ0aW9uUmVzdWx0IFJlc3VsdEJ1aWxkZXI6OmJ1aWxkKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApIGNvbnN0CisgICAgeworICAgICAgICBhc3NlcnQoIG1fZGF0YS5yZXN1bHRUeXBlICE9IFJlc3VsdFdhczo6VW5rbm93biApOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIGRhdGEgPSBtX2RhdGE7CisKKyAgICAgICAgLy8gRmxpcCBib29sIHJlc3VsdHMgaWYgRmFsc2VUZXN0IGZsYWcgaXMgc2V0CisgICAgICAgIGlmKCBpc0ZhbHNlVGVzdCggbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICkgKSB7CisgICAgICAgICAgICBkYXRhLm5lZ2F0ZSggZXhwci5pc0JpbmFyeUV4cHJlc3Npb24oKSApOworICAgICAgICB9CisKKyAgICAgICAgZGF0YS5tZXNzYWdlID0gbV9zdHJlYW0ub3NzLnN0cigpOworICAgICAgICBkYXRhLmRlY29tcG9zZWRFeHByZXNzaW9uID0gJmV4cHI7IC8vIGZvciBsYXp5IHJlY29uc3RydWN0aW9uCisgICAgICAgIHJldHVybiBBc3NlcnRpb25SZXN1bHQoIG1fYXNzZXJ0aW9uSW5mbywgZGF0YSApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6cmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IHsKKyAgICAgICAgZGVzdCA9IG1fYXNzZXJ0aW9uSW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpzZXRFeGNlcHRpb25HdWFyZCgpIHsKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiA9IHRydWU7CisgICAgfQorICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6dW5zZXRFeGNlcHRpb25HdWFyZCgpIHsKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiA9IGZhbHNlOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90YWdfYWxpYXNfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBUYWdBbGlhc1JlZ2lzdHJ5Ojp+VGFnQWxpYXNSZWdpc3RyeSgpIHt9CisKKyAgICBPcHRpb248VGFnQWxpYXM+IFRhZ0FsaWFzUmVnaXN0cnk6OmZpbmQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcyApIGNvbnN0IHsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlZ2lzdHJ5LmZpbmQoIGFsaWFzICk7CisgICAgICAgIGlmKCBpdCAhPSBtX3JlZ2lzdHJ5LmVuZCgpICkKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gT3B0aW9uPFRhZ0FsaWFzPigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIFRhZ0FsaWFzUmVnaXN0cnk6OmV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGV4cGFuZGVkVGVzdFNwZWMgPSB1bmV4cGFuZGVkVGVzdFNwZWM7CisgICAgICAgIGZvciggc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlZ2lzdHJ5LmJlZ2luKCksIGl0RW5kID0gbV9yZWdpc3RyeS5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgcG9zID0gZXhwYW5kZWRUZXN0U3BlYy5maW5kKCBpdC0+Zmlyc3QgKTsKKyAgICAgICAgICAgIGlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgZXhwYW5kZWRUZXN0U3BlYyA9ICBleHBhbmRlZFRlc3RTcGVjLnN1YnN0ciggMCwgcG9zICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC50YWcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRUZXN0U3BlYy5zdWJzdHIoIHBvcyArIGl0LT5maXJzdC5zaXplKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhwYW5kZWRUZXN0U3BlYzsKKyAgICB9CisKKyAgICB2b2lkIFRhZ0FsaWFzUmVnaXN0cnk6OmFkZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgaWYoICFzdGFydHNXaXRoKCBhbGlhcywgIltAIiApIHx8ICFlbmRzV2l0aCggYWxpYXMsICddJyApICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkKKyAgICAgICAgICAgICAgICA8PCAiZXJyb3I6IHRhZyBhbGlhcywgXCIiIDw8IGFsaWFzIDw8ICJcIiBpcyBub3Qgb2YgdGhlIGZvcm0gW0BhbGlhcyBuYW1lXS5cbiIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6RmlsZU5hbWUgKQorICAgICAgICAgICAgICAgIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpLmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggIW1fcmVnaXN0cnkuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggYWxpYXMsIFRhZ0FsaWFzKCB0YWcsIGxpbmVJbmZvICkgKSApLnNlY29uZCApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgPDwgImVycm9yOiB0YWcgYWxpYXMsIFwiIiA8PCBhbGlhcyA8PCAiXCIgYWxyZWFkeSByZWdpc3RlcmVkLlxuIgorICAgICAgICAgICAgICAgIDw8ICJcdEZpcnN0IHNlZW4gYXQgIgorICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKSA8PCBmaW5kKGFsaWFzKS0+bGluZUluZm8gPDwgJ1xuJworICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKSA8PCAiXHRSZWRlZmluZWQgYXQgIgorICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpGaWxlTmFtZSkgPDwgbGluZUluZm8gPDwgJ1xuJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkuY19zdHIoKSApOworICAgICAgICB9CisgICAgfQorCisgICAgSVRhZ0FsaWFzUmVnaXN0cnk6On5JVGFnQWxpYXNSZWdpc3RyeSgpIHt9CisKKyAgICBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0VGFnQWxpYXNSZWdpc3RyeSgpOworICAgIH0KKworICAgIFJlZ2lzdHJhckZvclRhZ0FsaWFzZXM6OlJlZ2lzdHJhckZvclRhZ0FsaWFzZXMoIGNoYXIgY29uc3QqIGFsaWFzLCBjaGFyIGNvbnN0KiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKyAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUYWdBbGlhcyggYWxpYXMsIHRhZywgbGluZUluZm8gKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmhwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBTdGRTdHJpbmcgeworCisgICAgICAgIENhc2VkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApCisgICAgICAgIDogICBtX2Nhc2VTZW5zaXRpdml0eSggY2FzZVNlbnNpdGl2aXR5ICksCisgICAgICAgICAgICBtX3N0ciggYWRqdXN0U3RyaW5nKCBzdHIgKSApCisgICAgICAgIHt9CisgICAgICAgIHN0ZDo6c3RyaW5nIENhc2VkU3RyaW5nOjphZGp1c3RTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8KKyAgICAgICAgICAgICAgICAgICA/IHRvTG93ZXIoIHN0ciApCisgICAgICAgICAgICAgICAgICAgOiBzdHI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgQ2FzZWRTdHJpbmc6OmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Nhc2VTZW5zaXRpdml0eSA9PSBDYXNlU2Vuc2l0aXZlOjpObworICAgICAgICAgICAgICAgICAgID8gIiAoY2FzZSBpbnNlbnNpdGl2ZSkiCisgICAgICAgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nTWF0Y2hlckJhc2U6OlN0cmluZ01hdGNoZXJCYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0aW9uLCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApCisgICAgICAgIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yICksCisgICAgICAgICAgbV9vcGVyYXRpb24oIG9wZXJhdGlvbiApIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIFN0cmluZ01hdGNoZXJCYXNlOjpkZXNjcmliZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSg1ICsgbV9vcGVyYXRpb24uc2l6ZSgpICsgbV9jb21wYXJhdG9yLm1fc3RyLnNpemUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wYXJhdG9yLmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpLnNpemUoKSk7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX29wZXJhdGlvbjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICI6IFwiIjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fY29tcGFyYXRvci5tX3N0cjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICJcIiI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX2NvbXBhcmF0b3IuY2FzZVNlbnNpdGl2aXR5U3VmZml4KCk7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICBFcXVhbHNNYXRjaGVyOjpFcXVhbHNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJlcXVhbHMiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIEVxdWFsc01hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApID09IG1fY29tcGFyYXRvci5tX3N0cjsKKyAgICAgICAgfQorCisgICAgICAgIENvbnRhaW5zTWF0Y2hlcjo6Q29udGFpbnNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJjb250YWlucyIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgQ29udGFpbnNNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBjb250YWlucyggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICksIG1fY29tcGFyYXRvci5tX3N0ciApOworICAgICAgICB9CisKKyAgICAgICAgU3RhcnRzV2l0aE1hdGNoZXI6OlN0YXJ0c1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJzdGFydHMgd2l0aCIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgU3RhcnRzV2l0aE1hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgICAgIEVuZHNXaXRoTWF0Y2hlcjo6RW5kc1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJlbmRzIHdpdGgiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIEVuZHNXaXRoTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZW5kc1dpdGgoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgU3RkU3RyaW5nCisKKyAgICBTdGRTdHJpbmc6OkVxdWFsc01hdGNoZXIgRXF1YWxzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIgQ29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OkNvbnRhaW5zTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorICAgIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyIEVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpFbmRzV2l0aE1hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyIFN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9tdWx0aS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX01VTFRJX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCitjbGFzcyBNdWx0aXBsZVJlcG9ydGVycyA6IHB1YmxpYyBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4geworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gPiBSZXBvcnRlcnM7CisgICAgUmVwb3J0ZXJzIG1fcmVwb3J0ZXJzOworCitwdWJsaWM6CisgICAgdm9pZCBhZGQoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiByZXBvcnRlciApIHsKKyAgICAgICAgbV9yZXBvcnRlcnMucHVzaF9iYWNrKCByZXBvcnRlciApOworICAgIH0KKworcHVibGljOiAvLyBJU3RyZWFtaW5nUmVwb3J0ZXIKKworICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJzWzBdLT5nZXRQcmVmZXJlbmNlcygpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5ub01hdGNoaW5nVGVzdENhc2VzKCBzcGVjICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RSdW5JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RSdW5TdGFydGluZyggdGVzdFJ1bkluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RHcm91cFN0YXJ0aW5nKCBncm91cEluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0Q2FzZVN0YXJ0aW5nKCB0ZXN0SW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5zZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiBhc3NlcnRpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPmFzc2VydGlvblN0YXJ0aW5nKCBhc3NlcnRpb25JbmZvICk7CisgICAgfQorCisgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2VzIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZDoKKyAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgYm9vbCBjbGVhckJ1ZmZlciA9IGZhbHNlOworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgY2xlYXJCdWZmZXIgfD0gKCppdCktPmFzc2VydGlvbkVuZGVkKCBhc3NlcnRpb25TdGF0cyApOworICAgICAgICByZXR1cm4gY2xlYXJCdWZmZXI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2VjdGlvbkVuZGVkKCBzZWN0aW9uU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0Q2FzZUVuZGVkKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdFJ1bkVuZGVkKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2tpcFRlc3QoIHRlc3RJbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCBNdWx0aXBsZVJlcG9ydGVycyogdHJ5QXNNdWx0aSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCit9OworCitQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBhZGRSZXBvcnRlciggUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGV4aXN0aW5nUmVwb3J0ZXIsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBhZGRpdGlvbmFsUmVwb3J0ZXIgKSB7CisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVzdWx0aW5nUmVwb3J0ZXI7CisKKyAgICBpZiggZXhpc3RpbmdSZXBvcnRlciApIHsKKyAgICAgICAgTXVsdGlwbGVSZXBvcnRlcnMqIG11bHRpID0gZXhpc3RpbmdSZXBvcnRlci0+dHJ5QXNNdWx0aSgpOworICAgICAgICBpZiggIW11bHRpICkgeworICAgICAgICAgICAgbXVsdGkgPSBuZXcgTXVsdGlwbGVSZXBvcnRlcnM7CisgICAgICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+KCBtdWx0aSApOworICAgICAgICAgICAgaWYoIGV4aXN0aW5nUmVwb3J0ZXIgKQorICAgICAgICAgICAgICAgIG11bHRpLT5hZGQoIGV4aXN0aW5nUmVwb3J0ZXIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IGV4aXN0aW5nUmVwb3J0ZXI7CisgICAgICAgIG11bHRpLT5hZGQoIGFkZGl0aW9uYWxSZXBvcnRlciApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdGluZ1JlcG9ydGVyID0gYWRkaXRpb25hbFJlcG9ydGVyOworCisgICAgcmV0dXJuIHJlc3VsdGluZ1JlcG9ydGVyOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl94bWwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9YTUxfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXBvcnRlcl9iYXNlcy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0JBU0VTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgLy8gQmVjYXVzZSBmb3JtYXR0aW5nIHVzaW5nIGMrKyBzdHJlYW1zIGlzIHN0YXRlZnVsLCBkcm9wIGRvd24gdG8gQyBpcyByZXF1aXJlZAorICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5IHdlIGNvdWxkIHVzZSBzdHJpbmdzdHJlYW0sIGJ1dCBpdHMgcGVyZm9ybWFuY2UgaXMuLi4gbm90IGdvb2QuCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEZvcm1hdHRlZER1cmF0aW9uKCBkb3VibGUgZHVyYXRpb24gKSB7CisgICAgICAgICAgICAvLyBNYXggZXhwb25lbnQgKyAxIGlzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgd2hvbGUgcGFydAorICAgICAgICAgICAgLy8gKyAxIGZvciBkZWNpbWFsIHBvaW50CisgICAgICAgICAgICAvLyArIDMgZm9yIHRoZSAzIGRlY2ltYWwgcGxhY2VzCisgICAgICAgICAgICAvLyArIDEgZm9yIG51bGwgdGVybWluYXRvcgorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1heERvdWJsZVNpemUgPSBEQkxfTUFYXzEwX0VYUCArIDEgKyAxICsgMyArIDE7CisgICAgICAgICAgICBjaGFyIGJ1ZmZlclttYXhEb3VibGVTaXplXTsKKworICAgICAgICAgICAgLy8gU2F2ZSBwcmV2aW91cyBlcnJubywgdG8gcHJldmVudCBzcHJpbnRmIGZyb20gb3ZlcndyaXRpbmcgaXQKKyAgICAgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHNwcmludGZfcyhidWZmZXIsICIlLjNmIiwgZHVyYXRpb24pOworI2Vsc2UKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJS4zZiIsIGR1cmF0aW9uKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJ1Y3QgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIDogU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKworICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIG1fY29uZmlnKCBfY29uZmlnLmZ1bGxDb25maWcoKSApLAorICAgICAgICAgICAgc3RyZWFtKCBfY29uZmlnLnN0cmVhbSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclByZWZzOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+U3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIF90ZXN0UnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mbyA9IF90ZXN0UnVuSW5mbzsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8gPSBfZ3JvdXBJbmZvOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgX3Rlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mbyA9IF90ZXN0SW5mbzsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucHVzaF9iYWNrKCBfc2VjdGlvbkluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgLyogX3NlY3Rpb25TdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIC8qIF90ZXN0Q2FzZVN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mby5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIC8qIF90ZXN0R3JvdXBTdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIC8qIF90ZXN0UnVuU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdENhc2VJbmZvLnJlc2V0KCk7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnJlc2V0KCk7CisgICAgICAgICAgICBjdXJyZW50VGVzdFJ1bkluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIHdpdGggdGhpcyBieSBkZWZhdWx0LgorICAgICAgICAgICAgLy8gSXQgY2FuIG9wdGlvbmFsbHkgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgZGVyaXZlZCBjbGFzcy4KKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisKKyAgICAgICAgTGF6eVN0YXQ8VGVzdFJ1bkluZm8+IGN1cnJlbnRUZXN0UnVuSW5mbzsKKyAgICAgICAgTGF6eVN0YXQ8R3JvdXBJbmZvPiBjdXJyZW50R3JvdXBJbmZvOworICAgICAgICBMYXp5U3RhdDxUZXN0Q2FzZUluZm8+IGN1cnJlbnRUZXN0Q2FzZUluZm87CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkluZm8+IG1fc2VjdGlvblN0YWNrOworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIG1fcmVwb3J0ZXJQcmVmczsKKyAgICB9OworCisgICAgc3RydWN0IEN1bXVsYXRpdmVSZXBvcnRlckJhc2UgOiBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4geworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBDaGlsZE5vZGVUPgorICAgICAgICBzdHJ1Y3QgTm9kZSA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgICAgICBleHBsaWNpdCBOb2RlKCBUIGNvbnN0JiBfdmFsdWUgKSA6IHZhbHVlKCBfdmFsdWUgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+Tm9kZSgpIHt9CisKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPENoaWxkTm9kZVQ+ID4gQ2hpbGROb2RlczsKKyAgICAgICAgICAgIFQgdmFsdWU7CisgICAgICAgICAgICBDaGlsZE5vZGVzIGNoaWxkcmVuOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgU2VjdGlvbk5vZGUgOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgZXhwbGljaXQgU2VjdGlvbk5vZGUoIFNlY3Rpb25TdGF0cyBjb25zdCYgX3N0YXRzICkgOiBzdGF0cyggX3N0YXRzICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgflNlY3Rpb25Ob2RlKCk7CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBTZWN0aW9uTm9kZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRzLnNlY3Rpb25JbmZvLmxpbmVJbmZvID09IG90aGVyLnN0YXRzLnNlY3Rpb25JbmZvLmxpbmVJbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFB0cjxTZWN0aW9uTm9kZT4gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCAqb3RoZXIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdGlvblN0YXRzIHN0YXRzOworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8U2VjdGlvbk5vZGU+ID4gQ2hpbGRTZWN0aW9uczsKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QXNzZXJ0aW9uU3RhdHM+IEFzc2VydGlvbnM7CisgICAgICAgICAgICBDaGlsZFNlY3Rpb25zIGNoaWxkU2VjdGlvbnM7CisgICAgICAgICAgICBBc3NlcnRpb25zIGFzc2VydGlvbnM7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdGRPdXQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdGRFcnI7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEJ5U2VjdGlvbkluZm8geworICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggU2VjdGlvbkluZm8gY29uc3QmIG90aGVyICkgOiBtX290aGVyKCBvdGhlciApIHt9CisgICAgICAgICAgICBCeVNlY3Rpb25JbmZvKCBCeVNlY3Rpb25JbmZvIGNvbnN0JiBvdGhlciApIDogbV9vdGhlciggb3RoZXIubV9vdGhlciApIHt9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yKCkgKCBQdHI8U2VjdGlvbk5vZGU+IGNvbnN0JiBub2RlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlLT5zdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbyA9PSBtX290aGVyLmxpbmVJbmZvOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0oIEJ5U2VjdGlvbkluZm8gY29uc3QmICk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyBjb25zdCYgbV9vdGhlcjsKKyAgICAgICAgfTsKKworICAgICAgICB0eXBlZGVmIE5vZGU8VGVzdENhc2VTdGF0cywgU2VjdGlvbk5vZGU+IFRlc3RDYXNlTm9kZTsKKyAgICAgICAgdHlwZWRlZiBOb2RlPFRlc3RHcm91cFN0YXRzLCBUZXN0Q2FzZU5vZGU+IFRlc3RHcm91cE5vZGU7CisgICAgICAgIHR5cGVkZWYgTm9kZTxUZXN0UnVuU3RhdHMsIFRlc3RHcm91cE5vZGU+IFRlc3RSdW5Ob2RlOworCisgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIG1fY29uZmlnKCBfY29uZmlnLmZ1bGxDb25maWcoKSApLAorICAgICAgICAgICAgc3RyZWFtKCBfY29uZmlnLnN0cmVhbSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgfkN1bXVsYXRpdmVSZXBvcnRlckJhc2UoKTsKKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclByZWZzOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU2VjdGlvblN0YXRzIGluY29tcGxldGVTdGF0cyggc2VjdGlvbkluZm8sIENvdW50cygpLCAwLCBmYWxzZSApOworICAgICAgICAgICAgUHRyPFNlY3Rpb25Ob2RlPiBub2RlOworICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoICFtX3Jvb3RTZWN0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgbV9yb290U2VjdGlvbiA9IG5ldyBTZWN0aW9uTm9kZSggaW5jb21wbGV0ZVN0YXRzICk7CisgICAgICAgICAgICAgICAgbm9kZSA9IG1fcm9vdFNlY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBTZWN0aW9uTm9kZSYgcGFyZW50Tm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGU6OkNoaWxkU2VjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpmaW5kX2lmKCAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggc2VjdGlvbkluZm8gKSApOworICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgU2VjdGlvbk5vZGUoIGluY29tcGxldGVTdGF0cyApOworICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9ICppdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgbV9kZWVwZXN0U2VjdGlvbiA9IG5vZGU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGFzc2VydCggIW1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBzZWN0aW9uTm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLnB1c2hfYmFjayggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgICAgIC8vIEFzc2VydGlvblJlc3VsdCBob2xkcyBhIHBvaW50ZXIgdG8gYSB0ZW1wb3JhcnkgRGVjb21wb3NlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAvLyB3aGljaCBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjYWxscyB0byBidWlsZCB0aGUgZXhwcmVzc2lvbiBzdHJpbmcuCisgICAgICAgICAgICAvLyBPdXIgc2VjdGlvbiBzdGFjayBjb3B5IG9mIHRoZSBhc3NlcnRpb25SZXN1bHQgd2lsbCBsaWtlbHkgb3V0bGl2ZSB0aGUKKyAgICAgICAgICAgIC8vIHRlbXBvcmFyeSwgc28gaXQgbXVzdCBiZSBleHBhbmRlZCBvciBkaXNjYXJkZWQgbm93IHRvIGF2b2lkIGNhbGxpbmcKKyAgICAgICAgICAgIC8vIGEgZGVzdHJveWVkIG9iamVjdCBsYXRlci4KKyAgICAgICAgICAgIHByZXBhcmVFeHBhbmRlZEV4cHJlc3Npb24oIHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuYmFjaygpLmFzc2VydGlvblJlc3VsdCApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSYgbm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICBub2RlLnN0YXRzID0gc2VjdGlvblN0YXRzOworICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFB0cjxUZXN0Q2FzZU5vZGU+IG5vZGUgPSBuZXcgVGVzdENhc2VOb2RlKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBhc3NlcnQoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA9PSAwICk7CisgICAgICAgICAgICBub2RlLT5jaGlsZHJlbi5wdXNoX2JhY2soIG1fcm9vdFNlY3Rpb24gKTsKKyAgICAgICAgICAgIG1fdGVzdENhc2VzLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgbV9yb290U2VjdGlvbi5yZXNldCgpOworCisgICAgICAgICAgICBhc3NlcnQoIG1fZGVlcGVzdFNlY3Rpb24gKTsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24tPnN0ZE91dCA9IHRlc3RDYXNlU3RhdHMuc3RkT3V0OworICAgICAgICAgICAgbV9kZWVwZXN0U2VjdGlvbi0+c3RkRXJyID0gdGVzdENhc2VTdGF0cy5zdGRFcnI7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdEdyb3VwTm9kZT4gbm9kZSA9IG5ldyBUZXN0R3JvdXBOb2RlKCB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4uc3dhcCggbV90ZXN0Q2FzZXMgKTsKKyAgICAgICAgICAgIG1fdGVzdEdyb3Vwcy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFB0cjxUZXN0UnVuTm9kZT4gbm9kZSA9IG5ldyBUZXN0UnVuTm9kZSggdGVzdFJ1blN0YXRzICk7CisgICAgICAgICAgICBub2RlLT5jaGlsZHJlbi5zd2FwKCBtX3Rlc3RHcm91cHMgKTsKKyAgICAgICAgICAgIG1fdGVzdFJ1bnMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUV4cGFuZGVkRXhwcmVzc2lvbiggQXNzZXJ0aW9uUmVzdWx0JiByZXN1bHQgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgcmVzdWx0LmRpc2NhcmREZWNvbXBvc2VkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdC5leHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXNzZXJ0aW9uU3RhdHM+IG1fYXNzZXJ0aW9uczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+ID4gbV9zZWN0aW9uczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFRlc3RDYXNlTm9kZT4gPiBtX3Rlc3RDYXNlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFRlc3RHcm91cE5vZGU+ID4gbV90ZXN0R3JvdXBzOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0UnVuTm9kZT4gPiBtX3Rlc3RSdW5zOworCisgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbV9yb290U2VjdGlvbjsKKyAgICAgICAgUHRyPFNlY3Rpb25Ob2RlPiBtX2RlZXBlc3RTZWN0aW9uOworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8U2VjdGlvbk5vZGU+ID4gbV9zZWN0aW9uU3RhY2s7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgbV9yZXBvcnRlclByZWZzOworCisgICAgfTsKKworICAgIHRlbXBsYXRlPGNoYXIgQz4KKyAgICBjaGFyIGNvbnN0KiBnZXRMaW5lT2ZDaGFycygpIHsKKyAgICAgICAgc3RhdGljIGNoYXIgbGluZVtDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSF0gPSB7MH07CisgICAgICAgIGlmKCAhKmxpbmUgKSB7CisgICAgICAgICAgICBzdGQ6Om1lbXNldCggbGluZSwgQywgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSApOworICAgICAgICAgICAgbGluZVtDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorCisgICAgc3RydWN0IFRlc3RFdmVudExpc3RlbmVyQmFzZSA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisgICAgICAgIFRlc3RFdmVudExpc3RlbmVyQmFzZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICkKKyAgICAgICAge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2ludGVybmFsL2NhdGNoX3JlcG9ydGVyX3JlZ2lzdHJhcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9SRUdJU1RSQVJTX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBMZWdhY3lSZXBvcnRlclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgUmVwb3J0ZXJGYWN0b3J5IDogcHVibGljIElSZXBvcnRlckZhY3RvcnkgeworICAgICAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExlZ2FjeVJlcG9ydGVyQWRhcHRlciggbmV3IFQoIGNvbmZpZyApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFQ6OmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgTGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgbmV3IFJlcG9ydGVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBSZXBvcnRlclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgUmVwb3J0ZXJGYWN0b3J5IDogcHVibGljIFNoYXJlZEltcGw8SVJlcG9ydGVyRmFjdG9yeT4geworCisgICAgICAgICAgICAvLyAqKiogUGxlYXNlIE5vdGUgKioqOgorICAgICAgICAgICAgLy8gLSBJZiB5b3UgZW5kIHVwIGhlcmUgbG9va2luZyBhdCBhIGNvbXBpbGVyIGVycm9yIGJlY2F1c2UgaXQncyB0cnlpbmcgdG8gcmVnaXN0ZXIKKyAgICAgICAgICAgIC8vIHlvdXIgY3VzdG9tIHJlcG9ydGVyIGNsYXNzIGJlIGF3YXJlIHRoYXQgdGhlIG5hdGl2ZSByZXBvcnRlciBpbnRlcmZhY2UgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIC8vIHRvIElTdHJlYW1pbmdSZXBvcnRlci4gVGhlICJsZWdhY3kiIGludGVyZmFjZSwgSVJlcG9ydGVyLCBpcyBzdGlsbCBzdXBwb3J0ZWQgdmlhCisgICAgICAgICAgICAvLyBhbiBhZGFwdGVyLiBKdXN0IHVzZSBSRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGFkYXB0ZXIuCisgICAgICAgICAgICAvLyBIb3dldmVyIHBsZWFzZSBjb25zaWRlciB1cGRhdGluZyB0byB0aGUgbmV3IGludGVyZmFjZSBhcyB0aGUgb2xkIG9uZSBpcyBub3cKKyAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQgYW5kIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBxdWl0ZSBzb29uIQorICAgICAgICAgICAgLy8gUGxlYXNlIGNvbnRhY3QgbWUgdmlhIGdpdGh1YiBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGF0IGFsbCBhYm91dCB0aGlzLgorICAgICAgICAgICAgLy8gSW4gZmFjdCwgaWRlYWxseSwgcGxlYXNlIGNvbnRhY3QgbWUgYW55d2F5IHRvIGxldCBtZSBrbm93IHlvdSd2ZSBoaXQgdGhpcyAtIGFzIEkgaGF2ZQorICAgICAgICAgICAgLy8gbm8gaWRlYSB3aG8gaXMgYWN0dWFsbHkgdXNpbmcgY3VzdG9tIHJlcG9ydGVycyBhdCBhbGwgKHBvc3NpYmx5IG5vLW9uZSEpLgorICAgICAgICAgICAgLy8gVGhlIG5ldyBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gbWluaW1pc2UgZXhwb3N1cmUgdG8gaW50ZXJmYWNlIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUKCBjb25maWcgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVDo6Z2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBSZXBvcnRlclJlZ2lzdHJhciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclJlcG9ydGVyKCBuYW1lLCBuZXcgUmVwb3J0ZXJGYWN0b3J5KCkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIExpc3RlbmVyUmVnaXN0cmFyIHsKKworICAgICAgICBjbGFzcyBMaXN0ZW5lckZhY3RvcnkgOiBwdWJsaWMgU2hhcmVkSW1wbDxJUmVwb3J0ZXJGYWN0b3J5PiB7CisKKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUKCBjb25maWcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgTGlzdGVuZXJSZWdpc3RyYXIoKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3Rlckxpc3RlbmVyKCBuZXcgTGlzdGVuZXJGYWN0b3J5KCkgKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6TGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXI8cmVwb3J0ZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI3JlcG9ydGVyVHlwZSggbmFtZSApOyB9CisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpSZXBvcnRlclJlZ2lzdHJhcjxyZXBvcnRlclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjcmVwb3J0ZXJUeXBlKCBuYW1lICk7IH0KKworLy8gRGVwcmVjYXRlZCAtIHVzZSB0aGUgZm9ybSB3aXRob3V0IElOVEVSTkFMXworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MSVNURU5FUiggbGlzdGVuZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6Okxpc3RlbmVyUmVnaXN0cmFyPGxpc3RlbmVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNsaXN0ZW5lclR5cGU7IH0KKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9MSVNURU5FUiggbGlzdGVuZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6Okxpc3RlbmVyUmVnaXN0cmFyPGxpc3RlbmVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNsaXN0ZW5lclR5cGU7IH0KKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2ludGVybmFsL2NhdGNoX3htbHdyaXRlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1hNTFdSSVRFUl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb21hbmlwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgWG1sRW5jb2RlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gRm9yV2hhdCB7IEZvclRleHROb2RlcywgRm9yQXR0cmlidXRlcyB9OworCisgICAgICAgIFhtbEVuY29kZSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgRm9yV2hhdCBmb3JXaGF0ID0gRm9yVGV4dE5vZGVzICkKKyAgICAgICAgOiAgIG1fc3RyKCBzdHIgKSwKKyAgICAgICAgICAgIG1fZm9yV2hhdCggZm9yV2hhdCApCisgICAgICAgIHt9CisKKyAgICAgICAgdm9pZCBlbmNvZGVUbyggc3RkOjpvc3RyZWFtJiBvcyApIGNvbnN0IHsKKworICAgICAgICAgICAgLy8gQXBvc3Ryb3BoZSBlc2NhcGluZyBub3QgbmVjZXNzYXJ5IGlmIHdlIGFsd2F5cyB1c2UgIiB0byB3cml0ZSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAvLyAoc2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI3N5bnRheCkKKworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fc3RyLnNpemUoKTsgKysgaSApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBtX3N0cltpXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJzwnOiAgIG9zIDw8ICImbHQ7IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJyYnOiAgIG9zIDw8ICImYW1wOyI7IGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI3N5bnRheAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPiAyICYmIG1fc3RyW2ktMV0gPT0gJ10nICYmIG1fc3RyW2ktMl0gPT0gJ10nICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCAiJmd0OyI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtX2ZvcldoYXQgPT0gRm9yQXR0cmlidXRlcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiZxdW90OyI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFc2NhcGUgY29udHJvbCBjaGFycyAtIGJhc2VkIG9uIGNvbnRyaWJ1dGlvbiBieSBAZXNwZW5hbGIgaW4gUFIgIzQ2NSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IEBtcnBpIFBSICM1ODgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCBjID49IDAgJiYgYyA8ICdceDA5JyApIHx8ICggYyA+ICdceDBEJyAmJiBjIDwgJ1x4MjAnKSB8fCBjPT0nXHg3RicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDA0MTA3L3doeS1hcmUtY29udHJvbC1jaGFyYWN0ZXJzLWlsbGVnYWwtaW4teG1sLTEtMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICJcXHgiIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oIGMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCBjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgWG1sRW5jb2RlIGNvbnN0JiB4bWxFbmNvZGUgKSB7CisgICAgICAgICAgICB4bWxFbmNvZGUuZW5jb2RlVG8oIG9zICk7CisgICAgICAgICAgICByZXR1cm4gb3M7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fc3RyOworICAgICAgICBGb3JXaGF0IG1fZm9yV2hhdDsKKyAgICB9OworCisgICAgY2xhc3MgWG1sV3JpdGVyIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgY2xhc3MgU2NvcGVkRWxlbWVudCB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQoIFhtbFdyaXRlciogd3JpdGVyICkKKyAgICAgICAgICAgIDogICBtX3dyaXRlciggd3JpdGVyICkKKyAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQoIFNjb3BlZEVsZW1lbnQgY29uc3QmIG90aGVyICkKKyAgICAgICAgICAgIDogICBtX3dyaXRlciggb3RoZXIubV93cml0ZXIgKXsKKyAgICAgICAgICAgICAgICBvdGhlci5tX3dyaXRlciA9IENBVENIX05VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH5TY29wZWRFbGVtZW50KCkgeworICAgICAgICAgICAgICAgIGlmKCBtX3dyaXRlciApCisgICAgICAgICAgICAgICAgICAgIG1fd3JpdGVyLT5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQmIHdyaXRlVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIGJvb2wgaW5kZW50ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVUZXh0KCB0ZXh0LCBpbmRlbnQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgICAgICBTY29wZWRFbGVtZW50JiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFQgY29uc3QmIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZSApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgbXV0YWJsZSBYbWxXcml0ZXIqIG1fd3JpdGVyOworICAgICAgICB9OworCisgICAgICAgIFhtbFdyaXRlcigpCisgICAgICAgIDogICBtX3RhZ0lzT3BlbiggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lKCBmYWxzZSApLAorICAgICAgICAgICAgbV9vcyggQ2F0Y2g6OmNvdXQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciggc3RkOjpvc3RyZWFtJiBvcyApCisgICAgICAgIDogICBtX3RhZ0lzT3BlbiggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lKCBmYWxzZSApLAorICAgICAgICAgICAgbV9vcyggb3MgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZURlY2xhcmF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICB+WG1sV3JpdGVyKCkgeworICAgICAgICAgICAgd2hpbGUoICFtX3RhZ3MuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiBzdGFydEVsZW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICBuZXdsaW5lSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgJzwnIDw8IG5hbWU7CisgICAgICAgICAgICBtX3RhZ3MucHVzaF9iYWNrKCBuYW1lICk7CisgICAgICAgICAgICBtX2luZGVudCArPSAiICAiOworICAgICAgICAgICAgbV90YWdJc09wZW4gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgU2NvcGVkRWxlbWVudCBzY29wZWRFbGVtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQgc2NvcGVkKCB0aGlzICk7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoIG5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBzY29wZWQ7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIGVuZEVsZW1lbnQoKSB7CisgICAgICAgICAgICBuZXdsaW5lSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIG1faW5kZW50ID0gbV9pbmRlbnQuc3Vic3RyKCAwLCBtX2luZGVudC5zaXplKCktMiApOworICAgICAgICAgICAgaWYoIG1fdGFnSXNPcGVuICkgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgIi8+IjsKKyAgICAgICAgICAgICAgICBtX3RhZ0lzT3BlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudCA8PCAiPC8iIDw8IG1fdGFncy5iYWNrKCkgPDwgIj4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9vcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBtX3RhZ3MucG9wX2JhY2soKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBzdGQ6OnN0cmluZyBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICAgICAgaWYoICFuYW1lLmVtcHR5KCkgJiYgIWF0dHJpYnV0ZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX29zIDw8ICcgJyA8PCBuYW1lIDw8ICI9XCIiIDw8IFhtbEVuY29kZSggYXR0cmlidXRlLCBYbWxFbmNvZGU6OkZvckF0dHJpYnV0ZXMgKSA8PCAnIic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgYm9vbCBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBtX29zIDw8ICcgJyA8PCBuYW1lIDw8ICI9XCIiIDw8ICggYXR0cmlidXRlID8gInRydWUiIDogImZhbHNlIiApIDw8ICciJzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBUIGNvbnN0JiBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IGF0dHJpYnV0ZTsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZUF0dHJpYnV0ZSggbmFtZSwgb3NzLnN0cigpICk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIGJvb2wgaW5kZW50ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgIGlmKCAhdGV4dC5lbXB0eSgpICl7CisgICAgICAgICAgICAgICAgYm9vbCB0YWdXYXNPcGVuID0gbV90YWdJc09wZW47CisgICAgICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICAgICAgaWYoIHRhZ1dhc09wZW4gJiYgaW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudDsKKyAgICAgICAgICAgICAgICBtX29zIDw8IFhtbEVuY29kZSggdGV4dCApOworICAgICAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVDb21tZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudCA8PCAiPCEtLSIgPDwgdGV4dCA8PCAiLS0+IjsKKyAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVTdHlsZXNoZWV0UmVmKCBzdGQ6OnN0cmluZyBjb25zdCYgdXJsICkgeworICAgICAgICAgICAgbV9vcyA8PCAiPD94bWwtc3R5bGVzaGVldCB0eXBlPVwidGV4dC94c2xcIiBocmVmPVwiIiA8PCB1cmwgPDwgIlwiPz5cbiI7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQmxhbmtMaW5lKCkgeworICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICBtX29zIDw8ICdcbic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVuc3VyZVRhZ0Nsb3NlZCgpIHsKKyAgICAgICAgICAgIGlmKCBtX3RhZ0lzT3BlbiApIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8ICI+IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgbV90YWdJc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgWG1sV3JpdGVyKCBYbWxXcml0ZXIgY29uc3QmICk7CisgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBYbWxXcml0ZXIgY29uc3QmICk7CisKKyAgICAgICAgdm9pZCB3cml0ZURlY2xhcmF0aW9uKCkgeworICAgICAgICAgICAgbV9vcyA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBuZXdsaW5lSWZOZWNlc3NhcnkoKSB7CisgICAgICAgICAgICBpZiggbV9uZWVkc05ld2xpbmUgKSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgbV90YWdJc09wZW47CisgICAgICAgIGJvb2wgbV9uZWVkc05ld2xpbmU7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtX3RhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1faW5kZW50OworICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fb3M7CisgICAgfTsKKworfQorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlZW5hYmxlX3dhcm5pbmdzLmgKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVFTkFCTEVfV0FSTklOR1NfSF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjICAgIGlmZGVmIF9fSUNDIC8vIGljcGMgZGVmaW5lcyB0aGUgX19jbGFuZ19fIG1hY3JvCisjICAgICAgICBwcmFnbWEgd2FybmluZyhwb3ApCisjICAgIGVsc2UKKyMgICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorIyAgICBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFhtbFJlcG9ydGVyIDogcHVibGljIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBYbWxSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICBtX3htbChfY29uZmlnLnN0cmVhbSgpKSwKKyAgICAgICAgICAgIG1fc2VjdGlvbkRlcHRoKCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflhtbFJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBhcyBhbiBYTUwgZG9jdW1lbnQiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRTdHlsZXNoZWV0UmVmKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU291cmNlSW5mbyggU291cmNlTGluZUluZm8gY29uc3QmIHNvdXJjZUluZm8gKSB7CisgICAgICAgICAgICBtX3htbAorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZpbGVuYW1lIiwgc291cmNlSW5mby5maWxlICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJsaW5lIiwgc291cmNlSW5mby5saW5lICk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzogLy8gU3RyZWFtaW5nUmVwb3J0ZXJCYXNlCisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpub01hdGNoaW5nVGVzdENhc2VzKCBzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5TdGFydGluZyggdGVzdEluZm8gKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0eWxlc2hlZXRSZWYgPSBnZXRTdHlsZXNoZWV0UmVmKCk7CisgICAgICAgICAgICBpZiggIXN0eWxlc2hlZXRSZWYuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwud3JpdGVTdHlsZXNoZWV0UmVmKCBzdHlsZXNoZWV0UmVmICk7CisgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJDYXRjaCIgKTsKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWctPm5hbWUoKS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBtX2NvbmZpZy0+bmFtZSgpICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJHcm91cCIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBncm91cEluZm8ubmFtZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlU3RhcnRpbmcodGVzdEluZm8pOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiVGVzdENhc2UiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgdHJpbSggdGVzdEluZm8ubmFtZSApICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJkZXNjcmlwdGlvbiIsIHRlc3RJbmZvLmRlc2NyaXB0aW9uICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJ0YWdzIiwgdGVzdEluZm8udGFnc0FzU3RyaW5nICk7CisKKyAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggdGVzdEluZm8ubGluZUluZm8gKTsKKworICAgICAgICAgICAgaWYgKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApCisgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBtX3htbC5lbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworICAgICAgICAgICAgaWYoIG1fc2VjdGlvbkRlcHRoKysgPiAwICkgeworICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIlNlY3Rpb24iICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHRyaW0oIHNlY3Rpb25JbmZvLm5hbWUgKSApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImRlc2NyaXB0aW9uIiwgc2VjdGlvbkluZm8uZGVzY3JpcHRpb24gKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHNlY3Rpb25JbmZvLmxpbmVJbmZvICk7CisgICAgICAgICAgICAgICAgbV94bWwuZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeyB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworCisgICAgICAgICAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOworCisgICAgICAgICAgICBpZiggaW5jbHVkZVJlc3VsdHMgKSB7CisgICAgICAgICAgICAgICAgLy8gUHJpbnQgYW55IGluZm8gbWVzc2FnZXMgaW4gPEluZm8+IHRhZ3MuCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCksIGl0RW5kID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkluZm8iICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggaXQtPm1lc3NhZ2UgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpXYXJuaW5nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIldhcm5pbmciICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggaXQtPm1lc3NhZ2UgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGJ1dCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhlbS4KKyAgICAgICAgICAgIGlmKCAhaW5jbHVkZVJlc3VsdHMgJiYgcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAvLyBQcmludCB0aGUgZXhwcmVzc2lvbiBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJFeHByZXNzaW9uIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3MiLCByZXN1bHQuc3VjY2VlZGVkKCkgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJ0eXBlIiwgcmVzdWx0LmdldFRlc3RNYWNyb05hbWUoKSApOworCisgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3JpZ2luYWwiICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cHJlc3Npb24oKSApOworICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJFeHBhbmRlZCIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQW5kLi4uIFByaW50IGEgcmVzdWx0IGFwcGxpY2FibGUgdG8gZWFjaCByZXN1bHQgdHlwZS4KKyAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkV4Y2VwdGlvbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJGYXRhbEVycm9yQ29uZGl0aW9uIiApOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJJbmZvIiApCisgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAvLyBXYXJuaW5nIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJGYWlsdXJlIiApOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25FbmRlZCggc2VjdGlvblN0YXRzICk7CisgICAgICAgICAgICBpZiggLS1tX3NlY3Rpb25EZXB0aCA+IDAgKSB7CisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHMiICk7CisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3NlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLnBhc3NlZCApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLmZhaWxlZCApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKTsKKworICAgICAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZHVyYXRpb25JblNlY29uZHMiLCBzZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMgKTsKKworICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZUVuZGVkKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0IiApOworICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3MiLCB0ZXN0Q2FzZVN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmFsbE9rKCkgKTsKKworICAgICAgICAgICAgaWYgKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApCisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgbV90ZXN0Q2FzZVRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCkgKTsKKworICAgICAgICAgICAgaWYoICF0ZXN0Q2FzZVN0YXRzLnN0ZE91dC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiU3RkT3V0IiApLndyaXRlVGV4dCggdHJpbSggdGVzdENhc2VTdGF0cy5zdGRPdXQgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VTdGF0cy5zdGRFcnIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIlN0ZEVyciIgKS53cml0ZVRleHQoIHRyaW0oIHRlc3RDYXNlU3RhdHMuc3RkRXJyICksIGZhbHNlICk7CisKKyAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBFbmRlZCggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRlc3RHcm91cFN0YXRzLmFib3J0aW5nIGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHMiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKTsKKyAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoIHRlc3RSdW5TdGF0cyApOworICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCB0ZXN0UnVuU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFRpbWVyIG1fdGVzdENhc2VUaW1lcjsKKyAgICAgICAgWG1sV3JpdGVyIG1feG1sOworICAgICAgICBpbnQgbV9zZWN0aW9uRGVwdGg7CisgICAgfTsKKworICAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggInhtbCIsIFhtbFJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfanVuaXQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9KVU5JVF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRpbWVzdGFtcCgpIHsKKyAgICAgICAgICAgIC8vIEJld2FyZSwgdGhpcyBpcyBub3QgcmVlbnRyYW50IGJlY2F1c2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZXMKKyAgICAgICAgICAgIC8vIEFsc28sIFVUQyBvbmx5LCBhZ2FpbiBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKCV6IGlzIEMrKzExKQorICAgICAgICAgICAgdGltZV90IHJhd3RpbWU7CisgICAgICAgICAgICBzdGQ6OnRpbWUoJnJhd3RpbWUpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHRpbWVTdGFtcFNpemUgPSBzaXplb2YoIjIwMTctMDEtMTZUMTc6MDY6NDVaIik7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3RkOjp0bSB0aW1lSW5mbyA9IHt9OworICAgICAgICAgICAgZ210aW1lX3MoJnRpbWVJbmZvLCAmcmF3dGltZSk7CisjZWxzZQorICAgICAgICAgICAgc3RkOjp0bSogdGltZUluZm87CisgICAgICAgICAgICB0aW1lSW5mbyA9IHN0ZDo6Z210aW1lKCZyYXd0aW1lKTsKKyNlbmRpZgorCisgICAgICAgICAgICBjaGFyIHRpbWVTdGFtcFt0aW1lU3RhbXBTaXplXTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBmbXQgPSAiJVktJW0tJWRUJUg6JU06JVNaIjsKKworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1wU2l6ZSwgZm10LCAmdGltZUluZm8pOworI2Vsc2UKKyAgICAgICAgICAgIHN0ZDo6c3RyZnRpbWUodGltZVN0YW1wLCB0aW1lU3RhbXBTaXplLCBmbXQsIHRpbWVJbmZvKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHRpbWVTdGFtcCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGNsYXNzIEp1bml0UmVwb3J0ZXIgOiBwdWJsaWMgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBKdW5pdFJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICB4bWwoIF9jb25maWcuc3RyZWFtKCkgKSwKKyAgICAgICAgICAgIG1fb2tUb0ZhaWwoIGZhbHNlICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkp1bml0UmVwb3J0ZXIoKSBDQVRDSF9PVkVSUklERTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIGluIGFuIFhNTCBmb3JtYXQgdGhhdCBsb29rcyBsaWtlIEFudCdzIGp1bml0cmVwb3J0IHRhcmdldCI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIC8qc3BlYyovICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgcnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RSdW5TdGFydGluZyggcnVuSW5mbyApOworICAgICAgICAgICAgeG1sLnN0YXJ0RWxlbWVudCggInRlc3RzdWl0ZXMiICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgc3VpdGVUaW1lci5zdGFydCgpOworICAgICAgICAgICAgc3RkT3V0Rm9yU3VpdGUuc3RyKCIiKTsKKyAgICAgICAgICAgIHN0ZEVyckZvclN1aXRlLnN0cigiIik7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9ucyA9IDA7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX29rVG9GYWlsID0gdGVzdENhc2VJbmZvLm9rVG9GYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSA9PSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICYmICFtX29rVG9GYWlsICkKKyAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9ucysrOworICAgICAgICAgICAgcmV0dXJuIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OmFzc2VydGlvbkVuZGVkKCBhc3NlcnRpb25TdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBzdGRPdXRGb3JTdWl0ZSA8PCB0ZXN0Q2FzZVN0YXRzLnN0ZE91dDsKKyAgICAgICAgICAgIHN0ZEVyckZvclN1aXRlIDw8IHRlc3RDYXNlU3RhdHMuc3RkRXJyOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBkb3VibGUgc3VpdGVUaW1lID0gc3VpdGVUaW1lci5nZXRFbGFwc2VkU2Vjb25kcygpOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgICAgICB3cml0ZUdyb3VwKCAqbV90ZXN0R3JvdXBzLmJhY2soKSwgc3VpdGVUaW1lICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHhtbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlR3JvdXAoIFRlc3RHcm91cE5vZGUgY29uc3QmIGdyb3VwTm9kZSwgZG91YmxlIHN1aXRlVGltZSApIHsKKyAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoICJ0ZXN0c3VpdGUiICk7CisgICAgICAgICAgICBUZXN0R3JvdXBTdGF0cyBjb25zdCYgc3RhdHMgPSBncm91cE5vZGUudmFsdWU7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgc3RhdHMuZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImVycm9ycyIsIHVuZXhwZWN0ZWRFeGNlcHRpb25zICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZC11bmV4cGVjdGVkRXhjZXB0aW9ucyApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGVzdHMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJob3N0bmFtZSIsICJ0YmQiICk7IC8vICFUQkQKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6Ok5ldmVyICkKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgIiIgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgc3VpdGVUaW1lICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lc3RhbXAiLCBnZXRDdXJyZW50VGltZXN0YW1wKCkgKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgdGVzdCBjYXNlcworICAgICAgICAgICAgZm9yKCBUZXN0R3JvdXBOb2RlOjpDaGlsZE5vZGVzOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IGdyb3VwTm9kZS5jaGlsZHJlbi5iZWdpbigpLCBpdEVuZCA9IGdyb3VwTm9kZS5jaGlsZHJlbi5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIHdyaXRlVGVzdENhc2UoICoqaXQgKTsKKworICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tb3V0IiApLndyaXRlVGV4dCggdHJpbSggc3RkT3V0Rm9yU3VpdGUuc3RyKCkgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLWVyciIgKS53cml0ZVRleHQoIHRyaW0oIHN0ZEVyckZvclN1aXRlLnN0cigpICksIGZhbHNlICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlVGVzdENhc2UoIFRlc3RDYXNlTm9kZSBjb25zdCYgdGVzdENhc2VOb2RlICkgeworICAgICAgICAgICAgVGVzdENhc2VTdGF0cyBjb25zdCYgc3RhdHMgPSB0ZXN0Q2FzZU5vZGUudmFsdWU7CisKKyAgICAgICAgICAgIC8vIEFsbCB0ZXN0IGNhc2VzIGhhdmUgZXhhY3RseSBvbmUgc2VjdGlvbiAtIHdoaWNoIHJlcHJlc2VudHMgdGhlCisgICAgICAgICAgICAvLyB0ZXN0IGNhc2UgaXRzZWxmLiBUaGF0IHNlY3Rpb24gbWF5IGhhdmUgMC1uIG5lc3RlZCBzZWN0aW9ucworICAgICAgICAgICAgYXNzZXJ0KCB0ZXN0Q2FzZU5vZGUuY2hpbGRyZW4uc2l6ZSgpID09IDEgKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlIGNvbnN0JiByb290U2VjdGlvbiA9ICp0ZXN0Q2FzZU5vZGUuY2hpbGRyZW4uZnJvbnQoKTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lID0gc3RhdHMudGVzdEluZm8uY2xhc3NOYW1lOworCisgICAgICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIHJvb3RTZWN0aW9uLmNoaWxkU2VjdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJnbG9iYWwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVTZWN0aW9uKCBjbGFzc05hbWUsICIiLCByb290U2VjdGlvbiApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVNlY3Rpb24oICBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiByb290TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uTm9kZSBjb25zdCYgc2VjdGlvbk5vZGUgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gdHJpbSggc2VjdGlvbk5vZGUuc3RhdHMuc2VjdGlvbkluZm8ubmFtZSApOworICAgICAgICAgICAgaWYoICFyb290TmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBuYW1lID0gcm9vdE5hbWUgKyAnLycgKyBuYW1lOworCisgICAgICAgICAgICBpZiggIXNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgICAgICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1wdHkoKSB8fAorICAgICAgICAgICAgICAgICFzZWN0aW9uTm9kZS5zdGRFcnIuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCAidGVzdGNhc2UiICk7CisgICAgICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJjbGFzc25hbWUiLCBuYW1lICk7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCAicm9vdCIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImNsYXNzbmFtZSIsIGNsYXNzTmFtZSApOworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgbmFtZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgQ2F0Y2g6OnRvU3RyaW5nKCBzZWN0aW9uTm9kZS5zdGF0cy5kdXJhdGlvbkluU2Vjb25kcyApICk7CisKKyAgICAgICAgICAgICAgICB3cml0ZUFzc2VydGlvbnMoIHNlY3Rpb25Ob2RlICk7CisKKyAgICAgICAgICAgICAgICBpZiggIXNlY3Rpb25Ob2RlLnN0ZE91dC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tb3V0IiApLndyaXRlVGV4dCggdHJpbSggc2VjdGlvbk5vZGUuc3RkT3V0ICksIGZhbHNlICk7CisgICAgICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5zdGRFcnIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLWVyciIgKS53cml0ZVRleHQoIHRyaW0oIHNlY3Rpb25Ob2RlLnN0ZEVyciApLCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKCBTZWN0aW9uTm9kZTo6Q2hpbGRTZWN0aW9uczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBzZWN0aW9uTm9kZS5jaGlsZFNlY3Rpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gc2VjdGlvbk5vZGUuY2hpbGRTZWN0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggbmFtZSwgIiIsICoqaXQgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggY2xhc3NOYW1lLCBuYW1lLCAqKml0ICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlQXNzZXJ0aW9ucyggU2VjdGlvbk5vZGUgY29uc3QmIHNlY3Rpb25Ob2RlICkgeworICAgICAgICAgICAgZm9yKCBTZWN0aW9uTm9kZTo6QXNzZXJ0aW9uczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmJlZ2luKCksIGl0RW5kID0gc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIHdyaXRlQXNzZXJ0aW9uKCAqaXQgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHdyaXRlQXNzZXJ0aW9uKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHMgKSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IHN0YXRzLmFzc2VydGlvblJlc3VsdDsKKyAgICAgICAgICAgIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbGVtZW50TmFtZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBuZXZlciBzZWUgdGhlc2UgaGVyZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6T2s6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImludGVybmFsRXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggZWxlbWVudE5hbWUgKTsKKworICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm1lc3NhZ2UiLCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0eXBlIiwgcmVzdWx0LmdldFRlc3RNYWNyb05hbWUoKSApOworCisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBpZiggIXJlc3VsdC5nZXRNZXNzYWdlKCkuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCByZXN1bHQuZ2V0TWVzc2FnZSgpIDw8ICdcbic7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBpdCA9IHN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBzdGF0cy5pbmZvTWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgICAgIGlmKCBpdC0+dHlwZSA9PSBSZXN1bHRXYXM6OkluZm8gKQorICAgICAgICAgICAgICAgICAgICAgICAgb3NzIDw8IGl0LT5tZXNzYWdlIDw8ICdcbic7CisKKyAgICAgICAgICAgICAgICBvc3MgPDwgImF0ICIgPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKTsKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVUZXh0KCBvc3Muc3RyKCksIGZhbHNlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXIgeG1sOworICAgICAgICBUaW1lciBzdWl0ZVRpbWVyOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RkT3V0Rm9yU3VpdGU7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdGRFcnJGb3JTdWl0ZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHVuZXhwZWN0ZWRFeGNlcHRpb25zOworICAgICAgICBib29sIG1fb2tUb0ZhaWw7CisgICAgfTsKKworICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAianVuaXQiLCBKdW5pdFJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfY29uc29sZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0NPTlNPTEVfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbnNvbGVSZXBvcnRlciA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisgICAgICAgIENvbnNvbGVSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQoIGZhbHNlICkKKyAgICAgICAge30KKworICAgICAgICB2aXJ0dWFsIH5Db25zb2xlUmVwb3J0ZXIoKSBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBhcyBwbGFpbiBsaW5lcyBvZiB0ZXh0IjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdCBjYXNlcyBtYXRjaGVkICciIDw8IHNwZWMgPDwgJ1wnJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX2Fzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBfYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworCisgICAgICAgICAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOworCisgICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYnV0IHdlJ3JlIG5vdCBwcmludGluZyB0aGVtLgorICAgICAgICAgICAgaWYoICFpbmNsdWRlUmVzdWx0cyAmJiByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6V2FybmluZyApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBsYXp5UHJpbnQoKTsKKworICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciBwcmludGVyKCBzdHJlYW0sIF9hc3NlcnRpb25TdGF0cywgaW5jbHVkZVJlc3VsdHMgKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvblN0YXJ0aW5nKCBfc2VjdGlvbkluZm8gKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIF9zZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggX3NlY3Rpb25TdGF0cy5taXNzaW5nQXNzZXJ0aW9ucyApIHsKKyAgICAgICAgICAgICAgICBsYXp5UHJpbnQoKTsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlxuTm8gYXNzZXJ0aW9ucyBpbiBzZWN0aW9uIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiXG5ObyBhc3NlcnRpb25zIGluIHRlc3QgY2FzZSI7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgJyIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8ICInXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0Rm9ybWF0dGVkRHVyYXRpb24oX3NlY3Rpb25TdGF0cy5kdXJhdGlvbkluU2Vjb25kcykgPDwgIiBzOiAiIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbV9oZWFkZXJQcmludGVkICkgeworICAgICAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uRW5kZWQoIF9zZWN0aW9uU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiBfdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggX3Rlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIF90ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmKCBjdXJyZW50R3JvdXBJbmZvLnVzZWQgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRTdW1tYXJ5RGl2aWRlcigpOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiU3VtbWFyeSBmb3IgZ3JvdXAgJyIgPDwgX3Rlc3RHcm91cFN0YXRzLmdyb3VwSW5mby5uYW1lIDw8ICInOlxuIjsKKyAgICAgICAgICAgICAgICBwcmludFRvdGFscyggX3Rlc3RHcm91cFN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIF90ZXN0R3JvdXBTdGF0cyApOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgX3Rlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHByaW50VG90YWxzRGl2aWRlciggX3Rlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgIHByaW50VG90YWxzKCBfdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1bkVuZGVkKCBfdGVzdFJ1blN0YXRzICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgY2xhc3MgQXNzZXJ0aW9uUHJpbnRlciB7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSAoIEFzc2VydGlvblByaW50ZXIgY29uc3QmICk7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9zdGF0cywgYm9vbCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgOiAgIHN0cmVhbSggX3N0cmVhbSApLAorICAgICAgICAgICAgICAgIHN0YXRzKCBfc3RhdHMgKSwKKyAgICAgICAgICAgICAgICByZXN1bHQoIF9zdGF0cy5hc3NlcnRpb25SZXN1bHQgKSwKKyAgICAgICAgICAgICAgICBjb2xvdXIoIENvbG91cjo6Tm9uZSApLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlcyggX3N0YXRzLmluZm9NZXNzYWdlcyApLAorICAgICAgICAgICAgICAgIHByaW50SW5mb01lc3NhZ2VzKCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpTdWNjZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJQQVNTRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiggcmVzdWx0Lmhhc01lc3NhZ2UoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OlN1Y2Nlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQgLSBidXQgd2FzIG9rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZHVlIHRvIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdpdGggIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCArPSAibWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCArPSAibWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJkdWUgdG8gYSBmYXRhbCBlcnJvciBjb25kaXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJiZWNhdXNlIG5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHdoZXJlIG9uZSB3YXMgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImluZm8iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndhcm5pbmciOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJleHBsaWNpdGx5IHdpdGggbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZXhwbGljaXRseSB3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBhcmUgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiKiogaW50ZXJuYWwgZXJyb3IgKioiOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBwcmludFNvdXJjZUluZm8oKTsKKyAgICAgICAgICAgICAgICBpZiggc3RhdHMudG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIHByaW50UmVzdWx0VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIXBhc3NPckZhaWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHBhc3NPckZhaWwgPDwgIjpcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6Ok9yaWdpbmFsRXhwcmVzc2lvbiApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8ICIgICI7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0RXhwcmVzc2lvbkluTWFjcm8oKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAid2l0aCBleHBhbnNpb246XG4iOworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKSwgVGV4dEF0dHJpYnV0ZXMoKS5zZXRJbmRlbnQoMikgKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRNZXNzYWdlKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhbWVzc2FnZUxhYmVsLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgbWVzc2FnZUxhYmVsIDw8ICc6JyA8PCAnXG4nOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lc3NhZ2VzLmJlZ2luKCksIGl0RW5kID0gbWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzZXJ0aW9uIGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByaW50SW5mb01lc3NhZ2VzIHx8IGl0LT50eXBlICE9IFJlc3VsdFdhczo6SW5mbyApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgVGV4dCggaXQtPm1lc3NhZ2UsIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6RmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKSA8PCAiOiAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKyAgICAgICAgICAgIEFzc2VydGlvblN0YXRzIGNvbnN0JiBzdGF0czsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0OworICAgICAgICAgICAgQ29sb3VyOjpDb2RlIGNvbG91cjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhc3NPckZhaWw7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlTGFiZWw7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1lc3NhZ2VzOworICAgICAgICAgICAgYm9vbCBwcmludEluZm9NZXNzYWdlczsKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkIGxhenlQcmludCgpIHsKKworICAgICAgICAgICAgaWYoICFjdXJyZW50VGVzdFJ1bkluZm8udXNlZCApCisgICAgICAgICAgICAgICAgbGF6eVByaW50UnVuSW5mbygpOworICAgICAgICAgICAgaWYoICFjdXJyZW50R3JvdXBJbmZvLnVzZWQgKQorICAgICAgICAgICAgICAgIGxhenlQcmludEdyb3VwSW5mbygpOworCisgICAgICAgICAgICBpZiggIW1faGVhZGVyUHJpbnRlZCApIHsKKyAgICAgICAgICAgICAgICBwcmludFRlc3RDYXNlQW5kU2VjdGlvbkhlYWRlcigpOworICAgICAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBsYXp5UHJpbnRSdW5JbmZvKCkgeworICAgICAgICAgICAgc3RyZWFtICA8PCAnXG4nIDw8IGdldExpbmVPZkNoYXJzPCd+Jz4oKSA8PCAnXG4nOworICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpTZWNvbmRhcnlUZXh0ICk7CisgICAgICAgICAgICBzdHJlYW0gIDw8IGN1cnJlbnRUZXN0UnVuSW5mby0+bmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIGEgQ2F0Y2ggdiIgIDw8IGxpYnJhcnlWZXJzaW9uKCkgPDwgIiBob3N0IGFwcGxpY2F0aW9uLlxuIgorICAgICAgICAgICAgICAgICAgICA8PCAiUnVuIHdpdGggLT8gZm9yIG9wdGlvbnNcblxuIjsKKworICAgICAgICAgICAgaWYoIG1fY29uZmlnLT5ybmdTZWVkKCkgIT0gMCApCisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJSYW5kb21uZXNzIHNlZWRlZCB0bzogIiA8PCBtX2NvbmZpZy0+cm5nU2VlZCgpIDw8ICJcblxuIjsKKworICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvLnVzZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZvaWQgbGF6eVByaW50R3JvdXBJbmZvKCkgeworICAgICAgICAgICAgaWYoICFjdXJyZW50R3JvdXBJbmZvLT5uYW1lLmVtcHR5KCkgJiYgY3VycmVudEdyb3VwSW5mby0+Z3JvdXBzQ291bnRzID4gMSApIHsKKyAgICAgICAgICAgICAgICBwcmludENsb3NlZEhlYWRlciggIkdyb3VwOiAiICsgY3VycmVudEdyb3VwSW5mby0+bmFtZSApOworICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8udXNlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludFRlc3RDYXNlQW5kU2VjdGlvbkhlYWRlcigpIHsKKyAgICAgICAgICAgIGFzc2VydCggIW1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKTsKKyAgICAgICAgICAgIHByaW50T3BlbkhlYWRlciggY3VycmVudFRlc3RDYXNlSW5mby0+bmFtZSApOworCisgICAgICAgICAgICBpZiggbV9zZWN0aW9uU3RhY2suc2l6ZSgpID4gMSApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6SGVhZGVycyApOworCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkluZm8+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IG1fc2VjdGlvblN0YWNrLmJlZ2luKCkrMSwgLy8gU2tpcCBmaXJzdCBzZWN0aW9uICh0ZXN0IGNhc2UpCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gbV9zZWN0aW9uU3RhY2suZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yKCA7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRIZWFkZXJTdHJpbmcoIGl0LT5uYW1lLCAyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvID0gbV9zZWN0aW9uU3RhY2suYmFjaygpLmxpbmVJbmZvOworCisgICAgICAgICAgICBpZiggIWxpbmVJbmZvLmVtcHR5KCkgKXsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy4nPigpIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludENsb3NlZEhlYWRlciggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgeworICAgICAgICAgICAgcHJpbnRPcGVuSGVhZGVyKCBfbmFtZSApOworICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRPcGVuSGVhZGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKSB7CisgICAgICAgICAgICBzdHJlYW0gIDw8IGdldExpbmVPZkNoYXJzPCctJz4oKSA8PCAnXG4nOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpIZWFkZXJzICk7CisgICAgICAgICAgICAgICAgcHJpbnRIZWFkZXJTdHJpbmcoIF9uYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBzdHJpbmcgaGFzIGEgOiBpbiBmaXJzdCBsaW5lIHdpbGwgc2V0IGluZGVudCB0byBmb2xsb3cgaXQgb24KKyAgICAgICAgLy8gc3Vic2VxdWVudCBsaW5lcworICAgICAgICB2b2lkIHByaW50SGVhZGVyU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgX3N0cmluZywgc3RkOjpzaXplX3QgaW5kZW50ID0gMCApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGkgPSBfc3RyaW5nLmZpbmQoICI6ICIgKTsKKyAgICAgICAgICAgIGlmKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBpKz0yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIF9zdHJpbmcsIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCBpbmRlbnQraSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEluZGVudCggaW5kZW50ICkgKSA8PCAnXG4nOworICAgICAgICB9CisKKyAgICAgICAgc3RydWN0IFN1bW1hcnlDb2x1bW4geworCisgICAgICAgICAgICBTdW1tYXJ5Q29sdW1uKCBzdGQ6OnN0cmluZyBjb25zdCYgX2xhYmVsLCBDb2xvdXI6OkNvZGUgX2NvbG91ciApCisgICAgICAgICAgICA6ICAgbGFiZWwoIF9sYWJlbCApLAorICAgICAgICAgICAgICAgIGNvbG91ciggX2NvbG91ciApCisgICAgICAgICAgICB7fQorICAgICAgICAgICAgU3VtbWFyeUNvbHVtbiBhZGRSb3coIHN0ZDo6c2l6ZV90IGNvdW50ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgb3NzIDw8IGNvdW50OworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJvdyA9IG9zcy5zdHIoKTsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSByb3dzLmJlZ2luKCk7IGl0ICE9IHJvd3MuZW5kKCk7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpdC0+c2l6ZSgpIDwgcm93LnNpemUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAqaXQgPSAnICcgKyAqaXQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpdC0+c2l6ZSgpID4gcm93LnNpemUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSAnICcgKyByb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvd3MucHVzaF9iYWNrKCByb3cgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxhYmVsOworICAgICAgICAgICAgQ29sb3VyOjpDb2RlIGNvbG91cjsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByb3dzOworCisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFscyggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSB7CisgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpXYXJuaW5nICkgPDwgIk5vIHRlc3RzIHJhblxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPiAwICYmIHRvdGFscy50ZXN0Q2FzZXMuYWxsUGFzc2VkKCkgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRTdWNjZXNzICkgPDwgIkFsbCB0ZXN0cyBwYXNzZWQiOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICgiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCwgImFzc2VydGlvbiIgKSA8PCAiIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQsICJ0ZXN0IGNhc2UiICkgPDwgJyknCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdW1tYXJ5Q29sdW1uPiBjb2x1bW5zOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAiIiwgQ29sb3VyOjpOb25lICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgKSApOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAicGFzc2VkIiwgQ29sb3VyOjpTdWNjZXNzICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggImZhaWxlZCIsIENvbG91cjo6UmVzdWx0RXJyb3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKSApOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAiZmFpbGVkIGFzIGV4cGVjdGVkIiwgQ29sb3VyOjpSZXN1bHRFeHBlY3RlZEZhaWx1cmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkQnV0T2sgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICkgKTsKKworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeVJvdyggInRlc3QgY2FzZXMiLCBjb2x1bW5zLCAwICk7CisgICAgICAgICAgICAgICAgcHJpbnRTdW1tYXJ5Um93KCAiYXNzZXJ0aW9ucyIsIGNvbHVtbnMsIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50U3VtbWFyeVJvdyggc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsLCBzdGQ6OnZlY3RvcjxTdW1tYXJ5Q29sdW1uPiBjb25zdCYgY29scywgc3RkOjpzaXplX3Qgcm93ICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxTdW1tYXJ5Q29sdW1uPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xzLmJlZ2luKCk7IGl0ICE9IGNvbHMuZW5kKCk7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBpdC0+cm93c1tyb3ddOworICAgICAgICAgICAgICAgIGlmKCBpdC0+bGFiZWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGxhYmVsIDw8ICI6ICI7CisgICAgICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSAhPSAiMCIgKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHZhbHVlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6Oldhcm5pbmcgKSA8PCAiLSBub25lIC0iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCB2YWx1ZSAhPSAiMCIgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgPDwgQ29sb3VyKCBDb2xvdXI6OkxpZ2h0R3JleSApIDw8ICIgfCAiOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8IENvbG91ciggaXQtPmNvbG91ciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdmFsdWUgPDwgJyAnIDw8IGl0LT5sYWJlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdCBtYWtlUmF0aW8oIHN0ZDo6c2l6ZV90IG51bWJlciwgc3RkOjpzaXplX3QgdG90YWwgKSB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCByYXRpbyA9IHRvdGFsID4gMCA/IENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIICogbnVtYmVyLyB0b3RhbCA6IDA7CisgICAgICAgICAgICByZXR1cm4gKCByYXRpbyA9PSAwICYmIG51bWJlciA+IDAgKSA/IDEgOiByYXRpbzsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgc3RkOjpzaXplX3QmIGZpbmRNYXgoIHN0ZDo6c2l6ZV90JiBpLCBzdGQ6OnNpemVfdCYgaiwgc3RkOjpzaXplX3QmIGsgKSB7CisgICAgICAgICAgICBpZiggaSA+IGogJiYgaSA+IGsgKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgZWxzZSBpZiggaiA+IGsgKQorICAgICAgICAgICAgICAgIHJldHVybiBqOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBrOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFsc0RpdmlkZXIoIFRvdGFscyBjb25zdCYgdG90YWxzICkgeworICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkUmF0aW8gPSBtYWtlUmF0aW8oIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWRCdXRPa1JhdGlvID0gbWFrZVJhdGlvKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZEJ1dE9rLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBwYXNzZWRSYXRpbyA9IG1ha2VSYXRpbyggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQsIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApOworICAgICAgICAgICAgICAgIHdoaWxlKCBmYWlsZWRSYXRpbyArIGZhaWxlZEJ1dE9rUmF0aW8gKyBwYXNzZWRSYXRpbyA8IENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKQorICAgICAgICAgICAgICAgICAgICBmaW5kTWF4KCBmYWlsZWRSYXRpbywgZmFpbGVkQnV0T2tSYXRpbywgcGFzc2VkUmF0aW8gKSsrOworICAgICAgICAgICAgICAgIHdoaWxlKCBmYWlsZWRSYXRpbyArIGZhaWxlZEJ1dE9rUmF0aW8gKyBwYXNzZWRSYXRpbyA+IENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKQorICAgICAgICAgICAgICAgICAgICBmaW5kTWF4KCBmYWlsZWRSYXRpbywgZmFpbGVkQnV0T2tSYXRpbywgcGFzc2VkUmF0aW8gKS0tOworCisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpFcnJvciApIDw8IHN0ZDo6c3RyaW5nKCBmYWlsZWRSYXRpbywgJz0nICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRFeHBlY3RlZEZhaWx1cmUgKSA8PCBzdGQ6OnN0cmluZyggZmFpbGVkQnV0T2tSYXRpbywgJz0nICk7CisgICAgICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMuYWxsUGFzc2VkKCkgKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MgKSA8PCBzdGQ6OnN0cmluZyggcGFzc2VkUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpTdWNjZXNzICkgPDwgc3RkOjpzdHJpbmcoIHBhc3NlZFJhdGlvLCAnPScgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6V2FybmluZyApIDw8IHN0ZDo6c3RyaW5nKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xLCAnPScgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRTdW1tYXJ5RGl2aWRlcigpIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBtX2hlYWRlclByaW50ZWQ7CisgICAgfTsKKworICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAiY29uc29sZSIsIENvbnNvbGVSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2NvbXBhY3QuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9DT01QQUNUX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbXBhY3RSZXBvcnRlciA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisKKyAgICAgICAgQ29tcGFjdFJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICkKKyAgICAgICAge30KKworICAgICAgICB2aXJ0dWFsIH5Db21wYWN0UmVwb3J0ZXIoKTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIG9uIGEgc2luZ2xlIGxpbmUsIHN1aXRhYmxlIGZvciBJREVzIjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICAgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgcHJlZnM7CisgICAgICAgICAgICBwcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHByZWZzOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgeworICAgICAgICAgICAgc3RyZWFtIDw8ICJObyB0ZXN0IGNhc2VzIG1hdGNoZWQgJyIgPDwgc3BlYyA8PCAnXCcnIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSB7fQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9hc3NlcnRpb25TdGF0cyApIHsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gX2Fzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBwcmludEluZm9NZXNzYWdlcyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBhbmQgd2UncmUgbm90IHByaW50aW5nIHRob3NlCisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSAmJiByZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6V2FybmluZyApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBwcmludEluZm9NZXNzYWdlcyA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyIHByaW50ZXIoIHN0cmVhbSwgX2Fzc2VydGlvblN0YXRzLCBwcmludEluZm9NZXNzYWdlcyApOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgpOworCisgICAgICAgICAgICBzdHJlYW0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKFNlY3Rpb25TdGF0cyBjb25zdCYgX3NlY3Rpb25TdGF0cykgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYgKG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldEZvcm1hdHRlZER1cmF0aW9uKF9zZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMpIDw8ICIgczogIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiBfdGVzdFJ1blN0YXRzICkgeworICAgICAgICAgICAgcHJpbnRUb3RhbHMoIF90ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggX3Rlc3RSdW5TdGF0cyApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjbGFzcyBBc3NlcnRpb25QcmludGVyIHsKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9ICggQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYgKTsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciggc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX3N0YXRzLCBib29sIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICA6IHN0cmVhbSggX3N0cmVhbSApCisgICAgICAgICAgICAsIHN0YXRzKCBfc3RhdHMgKQorICAgICAgICAgICAgLCByZXN1bHQoIF9zdGF0cy5hc3NlcnRpb25SZXN1bHQgKQorICAgICAgICAgICAgLCBtZXNzYWdlcyggX3N0YXRzLmluZm9NZXNzYWdlcyApCisgICAgICAgICAgICAsIGl0TWVzc2FnZSggX3N0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpICkKKyAgICAgICAgICAgICwgcHJpbnRJbmZvTWVzc2FnZXMoIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICB2b2lkIHByaW50KCkgeworICAgICAgICAgICAgICAgIHByaW50U291cmNlSW5mbygpOworCisgICAgICAgICAgICAgICAgaXRNZXNzYWdlID0gbWVzc2FnZXMuYmVnaW4oKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MsIHBhc3NlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoIENvbG91cjo6Tm9uZSApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6UmVzdWx0U3VjY2VzcywgZmFpbGVkU3RyaW5nKCkgKyBzdGQ6OnN0cmluZyggIiAtIGJ1dCB3YXMgb2siICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aXRoIG1lc3NhZ2U6IiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJmYXRhbCBlcnJvciBjb25kaXRpb24gd2l0aCBtZXNzYWdlOiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFeHByZXNzaW9uV2FzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAiZXhwZWN0ZWQgZXhjZXB0aW9uLCBnb3Qgbm9uZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXhwcmVzc2lvbldhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6Ok5vbmUsICJpbmZvIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6Tm9uZSwgIndhcm5pbmciICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggImV4cGxpY2l0bHkiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6Ok5vbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBhcmUgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgIioqIGludGVybmFsIGVycm9yICoqIiApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAvLyBDb2xvdXI6OkxpZ2h0R3JleQorCisgICAgICAgICAgICBzdGF0aWMgQ29sb3VyOjpDb2RlIGRpbUNvbG91cigpIHsgcmV0dXJuIENvbG91cjo6RmlsZU5hbWU7IH0KKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZhaWxlZFN0cmluZygpIHsgcmV0dXJuICJGQUlMRUQiOyB9CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcGFzc2VkU3RyaW5nKCkgeyByZXR1cm4gIlBBU1NFRCI7IH0KKyNlbHNlCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZmFpbGVkU3RyaW5nKCkgeyByZXR1cm4gImZhaWxlZCI7IH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBwYXNzZWRTdHJpbmcoKSB7IHJldHVybiAicGFzc2VkIjsgfQorI2VuZGlmCisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRTb3VyY2VJbmZvKCkgY29uc3QgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0U291cmNlSW5mbygpIDw8ICc6JzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6Q29kZSBjb2xvdXIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYXNzT3JGYWlsICkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhcGFzc09yRmFpbC5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICcgJyA8PCBwYXNzT3JGYWlsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnOic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50SXNzdWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBpc3N1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IGlzc3VlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50RXhwcmVzc2lvbldhcygpIHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICc7JzsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggZGltQ29sb3VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGV4cHJlc3Npb24gd2FzOiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnICcgPDwgcmVzdWx0LmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cGFuZGVkRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBkaW1Db2xvdXIoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgZm9yOiAiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50TWVzc2FnZSgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0TWVzc2FnZSAhPSBtZXNzYWdlcy5lbmQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgJyIgPDwgaXRNZXNzYWdlLT5tZXNzYWdlIDw8ICdcJyc7CisgICAgICAgICAgICAgICAgICAgICsraXRNZXNzYWdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6OkNvZGUgY29sb3VyID0gZGltQ29sb3VyKCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdE1lc3NhZ2UgPT0gbWVzc2FnZXMuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAvLyB1c2luZyBtZXNzYWdlcy5lbmQoKSBkaXJlY3RseSB5aWVsZHMgY29tcGlsYXRpb24gZXJyb3I6CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IE4gPSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIHN0ZDo6ZGlzdGFuY2UoIGl0TWVzc2FnZSwgaXRFbmQgKSApOworCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiB3aXRoICIgPDwgcGx1cmFsaXNlKCBOLCAibWVzc2FnZSIgKSA8PCAnOic7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yKDsgaXRNZXNzYWdlICE9IGl0RW5kOyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBhc3NlcnRpb24gaXMgYSB3YXJuaW5nIGlnbm9yZSBhbnkgSU5GTyBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICBpZiggcHJpbnRJbmZvTWVzc2FnZXMgfHwgaXRNZXNzYWdlLT50eXBlICE9IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IGl0TWVzc2FnZS0+bWVzc2FnZSA8PCAnXCcnOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCArK2l0TWVzc2FnZSAhPSBpdEVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGRpbUNvbG91cigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgYW5kIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgICAgICBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHM7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdDsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtZXNzYWdlczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXRNZXNzYWdlOworICAgICAgICAgICAgYm9vbCBwcmludEluZm9NZXNzYWdlczsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBDb2xvdXIsIG1lc3NhZ2UgdmFyaWFudHM6CisgICAgICAgIC8vIC0gd2hpdGU6IE5vIHRlc3RzIHJhbi4KKyAgICAgICAgLy8gLSAgIHJlZDogRmFpbGVkIFtib3RoL2FsbF0gTiB0ZXN0IGNhc2VzLCBmYWlsZWQgW2JvdGgvYWxsXSBNIGFzc2VydGlvbnMuCisgICAgICAgIC8vIC0gd2hpdGU6IFBhc3NlZCBbYm90aC9hbGxdIE4gdGVzdCBjYXNlcyAobm8gYXNzZXJ0aW9ucykuCisgICAgICAgIC8vIC0gICByZWQ6IEZhaWxlZCBOIHRlc3RzIGNhc2VzLCBmYWlsZWQgTSBhc3NlcnRpb25zLgorICAgICAgICAvLyAtIGdyZWVuOiBQYXNzZWQgW2JvdGgvYWxsXSBOIHRlc3RzIGNhc2VzIHdpdGggTSBhc3NlcnRpb25zLgorCisgICAgICAgIHN0ZDo6c3RyaW5nIGJvdGhPckFsbCggc3RkOjpzaXplX3QgY291bnQgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY291bnQgPT0gMSA/IHN0ZDo6c3RyaW5nKCkgOiBjb3VudCA9PSAyID8gImJvdGggIiA6ICJhbGwgIiA7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByaW50VG90YWxzKCBjb25zdCBUb3RhbHMmIHRvdGFscyApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIk5vIHRlc3RzIHJhbi4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgPT0gdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0RXJyb3IgKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBxdWFsaWZ5X2Fzc2VydGlvbnNfZmFpbGVkID0KKyAgICAgICAgICAgICAgICAgICAgdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkID09IHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgYm90aE9yQWxsKCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKSA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgIiA8PCBib3RoT3JBbGwoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQsICJ0ZXN0IGNhc2UiICApIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCAiIDw8IHF1YWxpZnlfYXNzZXJ0aW9uc19mYWlsZWQgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIlBhc3NlZCAiIDw8IGJvdGhPckFsbCggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpLCAidGVzdCBjYXNlIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChubyBhc3NlcnRpb25zKS4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0RXJyb3IgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCAiIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQsICJ0ZXN0IGNhc2UiICApIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCAiIDw8IHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0U3VjY2VzcyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiUGFzc2VkICIgPDwgYm90aE9yQWxsKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCAidGVzdCBjYXNlIiAgKSA8PAorICAgICAgICAgICAgICAgICAgICAiIHdpdGggIiAgPDwgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQsICJhc3NlcnRpb24iICkgPDwgJy4nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAiY29tcGFjdCIsIENvbXBhY3RSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIC8vIFRoZXNlIGFyZSBhbGwgaGVyZSB0byBhdm9pZCB3YXJuaW5ncyBhYm91dCBub3QgaGF2aW5nIGFueSBvdXQgb2YgbGluZQorICAgIC8vIHZpcnR1YWwgbWV0aG9kcworICAgIE5vbkNvcHlhYmxlOjp+Tm9uQ29weWFibGUoKSB7fQorICAgIElTaGFyZWQ6On5JU2hhcmVkKCkge30KKyAgICBJU3RyZWFtOjp+SVN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgRmlsZVN0cmVhbTo6fkZpbGVTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIENvdXRTdHJlYW06On5Db3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBEZWJ1Z091dFN0cmVhbTo6fkRlYnVnT3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBTdHJlYW1CdWZCYXNlOjp+U3RyZWFtQnVmQmFzZSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgSUNvbnRleHQ6On5JQ29udGV4dCgpIHt9CisgICAgSVJlc3VsdENhcHR1cmU6On5JUmVzdWx0Q2FwdHVyZSgpIHt9CisgICAgSVRlc3RDYXNlOjp+SVRlc3RDYXNlKCkge30KKyAgICBJVGVzdENhc2VSZWdpc3RyeTo6fklUZXN0Q2FzZVJlZ2lzdHJ5KCkge30KKyAgICBJUmVnaXN0cnlIdWI6On5JUmVnaXN0cnlIdWIoKSB7fQorICAgIElNdXRhYmxlUmVnaXN0cnlIdWI6On5JTXV0YWJsZVJlZ2lzdHJ5SHViKCkge30KKyAgICBJRXhjZXB0aW9uVHJhbnNsYXRvcjo6fklFeGNlcHRpb25UcmFuc2xhdG9yKCkge30KKyAgICBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5Ojp+SUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpIHt9CisgICAgSVJlcG9ydGVyOjp+SVJlcG9ydGVyKCkge30KKyAgICBJUmVwb3J0ZXJGYWN0b3J5Ojp+SVJlcG9ydGVyRmFjdG9yeSgpIHt9CisgICAgSVJlcG9ydGVyUmVnaXN0cnk6On5JUmVwb3J0ZXJSZWdpc3RyeSgpIHt9CisgICAgSVN0cmVhbWluZ1JlcG9ydGVyOjp+SVN0cmVhbWluZ1JlcG9ydGVyKCkge30KKyAgICBBc3NlcnRpb25TdGF0czo6fkFzc2VydGlvblN0YXRzKCkge30KKyAgICBTZWN0aW9uU3RhdHM6On5TZWN0aW9uU3RhdHMoKSB7fQorICAgIFRlc3RDYXNlU3RhdHM6On5UZXN0Q2FzZVN0YXRzKCkge30KKyAgICBUZXN0R3JvdXBTdGF0czo6flRlc3RHcm91cFN0YXRzKCkge30KKyAgICBUZXN0UnVuU3RhdHM6On5UZXN0UnVuU3RhdHMoKSB7fQorICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OlNlY3Rpb25Ob2RlOjp+U2VjdGlvbk5vZGUoKSB7fQorICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6On5DdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCkge30KKworICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6flN0cmVhbWluZ1JlcG9ydGVyQmFzZSgpIHt9CisgICAgQ29uc29sZVJlcG9ydGVyOjp+Q29uc29sZVJlcG9ydGVyKCkge30KKyAgICBDb21wYWN0UmVwb3J0ZXI6On5Db21wYWN0UmVwb3J0ZXIoKSB7fQorICAgIElSdW5uZXI6On5JUnVubmVyKCkge30KKyAgICBJTXV0YWJsZUNvbnRleHQ6On5JTXV0YWJsZUNvbnRleHQoKSB7fQorICAgIElDb25maWc6On5JQ29uZmlnKCkge30KKyAgICBYbWxSZXBvcnRlcjo6flhtbFJlcG9ydGVyKCkge30KKyAgICBKdW5pdFJlcG9ydGVyOjp+SnVuaXRSZXBvcnRlcigpIHt9CisgICAgVGVzdFJlZ2lzdHJ5Ojp+VGVzdFJlZ2lzdHJ5KCkge30KKyAgICBGcmVlRnVuY3Rpb25UZXN0Q2FzZTo6fkZyZWVGdW5jdGlvblRlc3RDYXNlKCkge30KKyAgICBJR2VuZXJhdG9ySW5mbzo6fklHZW5lcmF0b3JJbmZvKCkge30KKyAgICBJR2VuZXJhdG9yc0ZvclRlc3Q6On5JR2VuZXJhdG9yc0ZvclRlc3QoKSB7fQorICAgIFdpbGRjYXJkUGF0dGVybjo6fldpbGRjYXJkUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OlBhdHRlcm46On5QYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6TmFtZVBhdHRlcm46On5OYW1lUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OlRhZ1BhdHRlcm46On5UYWdQYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6RXhjbHVkZWRQYXR0ZXJuOjp+RXhjbHVkZWRQYXR0ZXJuKCkge30KKyAgICBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlclVudHlwZWRCYXNlOjp+TWF0Y2hlclVudHlwZWRCYXNlKCkge30KKworICAgIHZvaWQgQ29uZmlnOjpkdW1teSgpIHt9CisKKyAgICBuYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZyB7CisgICAgICAgIElUcmFja2VyOjp+SVRyYWNrZXIoKSB7fQorICAgICAgICBUcmFja2VyQmFzZTo6flRyYWNrZXJCYXNlKCkge30KKyAgICAgICAgU2VjdGlvblRyYWNrZXI6On5TZWN0aW9uVHJhY2tlcigpIHt9CisgICAgICAgIEluZGV4VHJhY2tlcjo6fkluZGV4VHJhY2tlcigpIHt9CisgICAgfQorfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfTUFJTgorLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2RlZmF1bHRfbWFpbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0RFRkFVTFRfTUFJTl9IUFBfSU5DTFVERUQKKworI2lmbmRlZiBfX09CSkNfXworCisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoRE9fTk9UX1VTRV9XTUFJTikKKy8vIFN0YW5kYXJkIEMvQysrIFdpbjMyIFVuaWNvZGUgd21haW4gZW50cnkgcG9pbnQKK2V4dGVybiAiQyIgaW50IHdtYWluIChpbnQgYXJnYywgd2NoYXJfdCAqIGFyZ3ZbXSwgd2NoYXJfdCAqIFtdKSB7CisjZWxzZQorLy8gU3RhbmRhcmQgQy9DKysgbWFpbiBlbnRyeSBwb2ludAoraW50IG1haW4gKGludCBhcmdjLCBjaGFyICogYXJndltdKSB7CisjZW5kaWYKKworCWludCByZXN1bHQgPSBDYXRjaDo6U2Vzc2lvbigpLnJ1biggYXJnYywgYXJndiApOworICAgIHJldHVybiAoIHJlc3VsdCA8IDB4ZmYgPyByZXN1bHQgOiAweGZmICk7Cit9CisKKyNlbHNlIC8vIF9fT0JKQ19fCisKKy8vIE9iamVjdGl2ZS1DIGVudHJ5IHBvaW50CitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pIHsKKyNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQKKyAgICBOU0F1dG9yZWxlYXNlUG9vbCAqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyNlbmRpZgorCisgICAgQ2F0Y2g6OnJlZ2lzdGVyVGVzdE1ldGhvZHMoKTsKKyAgICBpbnQgcmVzdWx0ID0gQ2F0Y2g6OlNlc3Npb24oKS5ydW4oIGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiApOworCisjaWYgIUNBVENIX0FSQ19FTkFCTEVECisgICAgW3Bvb2wgZHJhaW5dOworI2VuZGlmCisKKyAgICByZXR1cm4gKCByZXN1bHQgPCAweGZmID8gcmVzdWx0IDogMHhmZiApOworfQorCisjZW5kaWYgLy8gX19PQkpDX18KKworI2VuZGlmCisKKyNpZmRlZiBDTEFSQV9DT05GSUdfTUFJTl9OT1RfREVGSU5FRAorIyAgdW5kZWYgQ0xBUkFfQ09ORklHX01BSU4KKyNlbmRpZgorCisvLy8vLy8KKworLy8gSWYgdGhpcyBjb25maWcgaWRlbnRpZmllciBpcyBkZWZpbmVkIHRoZW4gYWxsIENBVENIIG1hY3JvcyBhcmUgcHJlZml4ZWQgd2l0aCBDQVRDSF8KKyNpZmRlZiBDQVRDSF9DT05GSUdfUFJFRklYX0FMTAorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZWxzZQorI2RlZmluZSBDQVRDSF9SRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX1JFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgICkKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhST1dTKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgIiIsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNBVENIX1JFUVVJUkVfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDQVRDSF9SRVFVSVJFX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0soIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0tfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS0VEX0lGKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfSUYoICJDQVRDSF9DSEVDS0VEX0lGIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLRURfRUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX0VMU0UoICJDQVRDSF9DSEVDS0VEX0VMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfTk9GQUlMKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLX05PRkFJTCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCwgZXhwciApCisKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTKCBleHByICkgIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX0NIRUNLX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsICIiLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0FUQ0hfQ0hFQ0tfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDQVRDSF9DSEVDS19USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgYXJnICkKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUX05PX1RSWSggIkNBVENIX1JFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0FUQ0hfUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9JTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfSU5GTyIsIG1zZyApCisjZGVmaW5lIENBVENIX1dBUk4oIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX1dBUk4iLCBDYXRjaDo6UmVzdWx0V2FzOjpXYXJuaW5nLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2RlZmluZSBDQVRDSF9TQ09QRURfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0lORk8iLCBtc2cgKQorI2RlZmluZSBDQVRDSF9DQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKyNkZWZpbmUgQ0FUQ0hfU0NPUEVEX0NBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9DQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9URVNUX0NBU0UoIEZ1bmN0aW9uLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1NFQ1RJT04oIC4uLiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUwoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMX0NIRUNLKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9TVUNDRUVEKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9TVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNlbHNlCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX1JFR0lTVEVSX1RFU1RfQ0FTRSggZnVuY3Rpb24sIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIGZ1bmN0aW9uLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUwoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtc2cgKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTF9DSEVDSyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyAgICAjZGVmaW5lIENBVENIX1NVQ0NFRUQoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX1NVQ0NFRUQiLCBDYXRjaDo6UmVzdWx0V2FzOjpPaywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNlbmRpZgorI2RlZmluZSBDQVRDSF9BTk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCAiIiwgIiIgKQorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisKKyNkZWZpbmUgQ0FUQ0hfR0VORVJBVEUoIGV4cHIpIElOVEVSTkFMX0NBVENIX0dFTkVSQVRFKCBleHByICkKKworLy8gIkJERC1zdHlsZSIgY29udmVuaWVuY2Ugd3JhcHBlcnMKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZGVmaW5lIENBVENIX1NDRU5BUklPKCAuLi4gKSBDQVRDSF9URVNUX0NBU0UoICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX1NDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJTyggbmFtZSwgdGFncyApIENBVENIX1RFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgdGFncyApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2VuZGlmCisjZGVmaW5lIENBVENIX0dJVkVOKCBkZXNjICkgICAgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICJHaXZlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX1dIRU4oIGRlc2MgKSAgICAgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgV2hlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX0FORF9XSEVOKCBkZXNjICkgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgIEFuZDogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX1RIRU4oIGRlc2MgKSAgICAgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgVGhlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX0FORF9USEVOKCBkZXNjICkgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgIEFuZDogIikgKyBkZXNjLCAiIiApCisKKy8vIElmIENBVENIX0NPTkZJR19QUkVGSVhfQUxMIGlzIG5vdCBkZWZpbmVkIHRoZW4gdGhlIENBVENIXyBwcmVmaXggaXMgbm90IHJlcXVpcmVkCisjZWxzZQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBSRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJSRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJSRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisKKyNlbHNlCisjZGVmaW5lIFJFUVVJUkUoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICApCisjZGVmaW5lIFJFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2VuZGlmCisKKyNkZWZpbmUgUkVRVUlSRV9USFJPV1MoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJSRVFVSVJFX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCAiIiwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiUkVRVUlSRV9USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJSRVFVSVJFX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIlJFUVVJUkVfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKworI2RlZmluZSBDSEVDSyggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDSEVDSyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS19GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDSEVDS19GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZGVmaW5lIENIRUNLRURfSUYoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9JRiggIkNIRUNLRURfSUYiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tFRF9FTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfRUxTRSggIkNIRUNLRURfRUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS19OT0ZBSUwoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0tfTk9GQUlMIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsLCBleHByICkKKworI2RlZmluZSBDSEVDS19USFJPV1MoIGV4cHIgKSAgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0hFQ0tfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgIiIsIGV4cHIgKQorI2RlZmluZSBDSEVDS19USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJDSEVDS19USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDSEVDS19USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBDSEVDS19OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDSEVDS19OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0tfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIkNIRUNLX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBhcmcgKQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBSRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVRfTk9fVFJZKCAiUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZWxzZQorI2RlZmluZSBSRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJSRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbmRpZgorCisjZGVmaW5lIElORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJJTkZPIiwgbXNnICkKKyNkZWZpbmUgV0FSTiggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiV0FSTiIsIENhdGNoOjpSZXN1bHRXYXM6Oldhcm5pbmcsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZGVmaW5lIFNDT1BFRF9JTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiSU5GTyIsIG1zZyApCisjZGVmaW5lIENBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorI2RlZmluZSBTQ09QRURfQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZGVmaW5lIFRFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgUkVHSVNURVJfVEVTVF9DQVNFKCBGdW5jdGlvbiwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFNFQ1RJT04oIC4uLiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRkFJTCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRkFJTF9DSEVDSyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBTVUNDRUVEKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJTVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIFRFU1RfQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgUkVHSVNURVJfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBGQUlMKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbXNnICkKKyAgICAjZGVmaW5lIEZBSUxfQ0hFQ0soIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisgICAgI2RlZmluZSBTVUNDRUVEKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJTVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZW5kaWYKKyNkZWZpbmUgQU5PTl9URVNUX0NBU0UoKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggIiIsICIiICkKKworI2RlZmluZSBSRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisjZGVmaW5lIFJFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorCisjZGVmaW5lIEdFTkVSQVRFKCBleHByKSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApCisKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApCisKKy8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBTQ0VOQVJJTyggLi4uICkgVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2RlZmluZSBTQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgU0NFTkFSSU8oIG5hbWUsIHRhZ3MgKSBURVNUX0NBU0UoICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNkZWZpbmUgU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIHRhZ3MgKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNlbmRpZgorI2RlZmluZSBHSVZFTiggZGVzYyApICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICBHaXZlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIFdIRU4oIGRlc2MgKSAgICAgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgICBXaGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQU5EX1dIRU4oIGRlc2MgKSBTRUNUSU9OKCBzdGQ6OnN0cmluZygiQW5kIHdoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBUSEVOKCBkZXNjICkgICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgVGhlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIEFORF9USEVOKCBkZXNjICkgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgICAgQW5kOiAiKSArIGRlc2MsICIiICkKKwordXNpbmcgQ2F0Y2g6OkRldGFpbDo6QXBwcm94OworCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NBVENIX0hQUF9JTkNMVURFRAorCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4YzgzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0cy5jYwpAQCAtMCwwICsxLDMzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlICJ0X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oIgorCitURVNUX0NBU0UoICJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBlbnVtIiwgIltmdW5jdGlvbmFsXSIgKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9lbnVtX2RhdGEocHJvZ3JhbSk7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9lbnVtKiB0ZXN0X2VudW0gPSBwYWlyLnNlY29uZDsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSB0ZXN0X2VudW0tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfZW51bShvdXQsIHRlc3RfZW51bSkpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIHRlc3RfZW51bTsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOwkKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCB2b2lkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF92b2lkX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9USFJPV1MoZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHN0cmluZyB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9zdHJpbmdfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgYm9vbCB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHNieXRlIChpOCkgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaThfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgc2hvcnQgKGkxNikgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTE2X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGludGVnZXIgKGkzMikgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTMyX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGxvbmcgKGk2NCkgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGRvdWJsZSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9kb3VibGVfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzE3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYwpAQCAtMCwwICsxLDIzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlICJ0X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oIgorCitjb25zdCBzdHJpbmcgVGVzdERhdGFHZW5lcmF0b3I6OkRFRkFVTFRfRklMRV9IRUFERVIgPSAiLyoqIiAiXG4iCisgICAgICAgICAgICAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCkiICJcbiIKKyAgICAgICAgICAgICIgKiIgIlxuIgorICAgICAgICAgICAgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkciICJcbiIKKyAgICAgICAgICAgICIgKiAgQGdlbmVyYXRlZCIgIlxuIgorICAgICAgICAgICAgIiAqLyI7CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9lbnVtX2RhdGEodF9wcm9ncmFtKiBwcm9ncmFtKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsKKyAgICAgICAgIlxuIgorICAgICAgICAiXG4iCisgICAgICAgICIvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIvLy8gVGVzdERvY1xuIgorICAgICAgICAiLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgInB1YmxpYyBlbnVtIFRlc3ROYW1lXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIE5vbmUgPSAwLFxuIgorICAgICAgICAiICBGaXJzdCA9IDEsXG4iCisgICAgICAgICIgIFNlY29uZCA9IDIsXG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF9lbnVtKiBlbnVtXyA9IG5ldyB0X2VudW0ocHJvZ3JhbSk7CisgICAgZW51bV8tPnNldF9uYW1lKCJUZXN0TmFtZSIpOworICAgIGVudW1fLT5zZXRfZG9jKCJUZXN0RG9jIik7CisgICAgZW51bV8tPmFwcGVuZChuZXcgdF9lbnVtX3ZhbHVlKCJOb25lIiwgMCkpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiRmlyc3QiLCAxKSk7CisgICAgZW51bV8tPmFwcGVuZChuZXcgdF9lbnVtX3ZhbHVlKCJTZWNvbmQiLCAyKSk7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4oZXhwZWN0ZWRfcmVzdWx0LCBlbnVtXyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfdm9pZF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoInZvaWQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9zdHJpbmcoIlZvaWRWYWx1ZSIpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJ2b2lkIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3N0cmluZ19jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsgCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzdHJpbmcgQHN0cmluZyA9IFwiU3RyaW5nVmFsdWVcIjtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X3N0cmluZygiU3RyaW5nVmFsdWUiKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAic3RyaW5nIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2Jvb2xfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBib29sIEBib29sID0gdHJ1ZTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJib29sIiwgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigxKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAiYm9vbCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pOF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IHNieXRlIEBzYnl0ZSA9IDEyNztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJJOCIsIHRfYmFzZV90eXBlOjpUWVBFX0k4KTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDEyNyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInNieXRlIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kxNl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IHNob3J0IEBzaG9ydCA9IDMyNzY3O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImkxNiIsIHRfYmFzZV90eXBlOjpUWVBFX0kxNik7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigzMjc2Nyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInNob3J0IiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kzMl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGludCBAaW50ID0gMjE0NzQ4MzY0NztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpMzIiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMjE0NzQ4MzY0Nyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImludCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pNjRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBsb25nIEBsb25nID0gOTIyMzM3MjAzNjg1NDc3NTgwNztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpNjQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoOTIyMzM3MjAzNjg1NDc3NTgwNyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImxvbmciLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgZG91YmxlIEBkb3VibGUgPSA5LjIyMzM3ZSsxODtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJkb3VibGUiLCB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2RvdWJsZSg5MjIzMzcyMDM2ODU0Nzc1ODA3LjEpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJkb3VibGUiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmVhYWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaApAQCAtMCwwICsxLDM0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorCitjbGFzcyBUZXN0RGF0YUdlbmVyYXRvcgoreworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBzdHJpbmcgREVGQVVMVF9GSUxFX0hFQURFUjsKKworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPiBnZXRfdGVzdF9lbnVtX2RhdGEodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X3ZvaWRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3Rfc3RyaW5nX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2Jvb2xfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaThfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaTE2X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2kzMl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pNjRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKK307CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjYmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaGVscGVyc190ZXN0cy5jYwpAQCAtMCwwICsxLDIwOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90eXBlX3VzaW5ncygpIHdpdGhvdXQgb3B0aW9uIHdjZiBzaG91bGQgcmV0dXJuIHZhbGlkIG5hbWVzcGFjZXMiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAidW5pb24iLCAidW5pb24iIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgc3RyaW5nIGV4cGVjdGVkX25hbWVzcGFjZXMgPSAidXNpbmcgU3lzdGVtO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5JTztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIiArIGVuZGw7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc193Y2ZfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFKGdlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpID09IGV4cGVjdGVkX25hbWVzcGFjZXMpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3R5cGVfdXNpbmdzKCkgd2l0aCBvcHRpb24gd2NmIHNob3VsZCByZXR1cm4gdmFsaWQgbmFtZXNwYWNlcyIsICJbaGVscGVyc10iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHN0cmluZyBleHBlY3RlZF9uYW1lc3BhY2VzX3djZiA9ICJ1c2luZyBTeXN0ZW07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5JTztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb247XG4iICsgZW5kbDsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgUkVRVUlSRShnZW4tPmlzX3djZl9lbmFibGVkKCkpOworICAgIFJFUVVJUkUoZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgPT0gZXhwZWN0ZWRfbmFtZXNwYWNlc193Y2YpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBjb250YWlucyBsYXRlc3QgQyMga2V5d29yZHMgdG8gbm9ybWFsaXplIHdpdGggQCIsICJbaGVscGVyc10iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKyAgICB2ZWN0b3I8c3RyaW5nPiBjdXJyZW50X2tleXdvcmRzID0geworICAgICAgICB7ICJhYnN0cmFjdCIgfSwKKyAgICAgICAgeyAiYXMiIH0sCisgICAgICAgIHsgImJhc2UiIH0sCisgICAgICAgIHsgImJvb2wiIH0sCisgICAgICAgIHsgImJyZWFrIiB9LAorICAgICAgICB7ICJieXRlIiB9LAorICAgICAgICB7ICJjYXNlIiB9LAorICAgICAgICB7ICJjYXRjaCIgfSwKKyAgICAgICAgeyAiY2hhciIgfSwKKyAgICAgICAgeyAiY2hlY2tlZCIgfSwKKyAgICAgICAgeyAiY2xhc3MiIH0sCisgICAgICAgIHsgImNvbnN0IiB9LAorICAgICAgICB7ICJjb250aW51ZSIgfSwKKyAgICAgICAgeyAiZGVjaW1hbCIgfSwKKyAgICAgICAgeyAiZGVmYXVsdCIgfSwKKyAgICAgICAgeyAiZGVsZWdhdGUiIH0sCisgICAgICAgIHsgImRvIiB9LAorICAgICAgICB7ICJkb3VibGUiIH0sCisgICAgICAgIHsgImVsc2UiIH0sCisgICAgICAgIHsgImVudW0iIH0sCisgICAgICAgIHsgImV2ZW50IiB9LAorICAgICAgICB7ICJleHBsaWNpdCIgfSwKKyAgICAgICAgeyAiZXh0ZXJuIiB9LAorICAgICAgICB7ICJmYWxzZSIgfSwKKyAgICAgICAgeyAiZmluYWxseSIgfSwKKyAgICAgICAgeyAiZml4ZWQiIH0sCisgICAgICAgIHsgImZsb2F0IiB9LAorICAgICAgICB7ICJmb3IiIH0sCisgICAgICAgIHsgImZvcmVhY2giIH0sCisgICAgICAgIHsgImdvdG8iIH0sCisgICAgICAgIHsgImlmIiB9LAorICAgICAgICB7ICJpbXBsaWNpdCIgfSwKKyAgICAgICAgeyAiaW4iIH0sCisgICAgICAgIHsgImludCIgfSwKKyAgICAgICAgeyAiaW50ZXJmYWNlIiB9LAorICAgICAgICB7ICJpbnRlcm5hbCIgfSwKKyAgICAgICAgeyAiaXMiIH0sCisgICAgICAgIHsgImxvY2siIH0sCisgICAgICAgIHsgImxvbmciIH0sCisgICAgICAgIHsgIm5hbWVzcGFjZSIgfSwKKyAgICAgICAgeyAibmV3IiB9LAorICAgICAgICB7ICJudWxsIiB9LAorICAgICAgICB7ICJvYmplY3QiIH0sCisgICAgICAgIHsgIm9wZXJhdG9yIiB9LAorICAgICAgICB7ICJvdXQiIH0sCisgICAgICAgIHsgIm92ZXJyaWRlIiB9LAorICAgICAgICB7ICJwYXJhbXMiIH0sCisgICAgICAgIHsgInByaXZhdGUiIH0sCisgICAgICAgIHsgInByb3RlY3RlZCIgfSwKKyAgICAgICAgeyAicHVibGljIiB9LAorICAgICAgICB7ICJyZWFkb25seSIgfSwKKyAgICAgICAgeyAicmVmIiB9LAorICAgICAgICB7ICJyZXR1cm4iIH0sCisgICAgICAgIHsgInNieXRlIiB9LAorICAgICAgICB7ICJzZWFsZWQiIH0sCisgICAgICAgIHsgInNob3J0IiB9LAorICAgICAgICB7ICJzaXplb2YiIH0sCisgICAgICAgIHsgInN0YWNrYWxsb2MiIH0sCisgICAgICAgIHsgInN0YXRpYyIgfSwKKyAgICAgICAgeyAic3RyaW5nIiB9LAorICAgICAgICB7ICJzdHJ1Y3QiIH0sCisgICAgICAgIHsgInN3aXRjaCIgfSwKKyAgICAgICAgeyAidGhpcyIgfSwKKyAgICAgICAgeyAidGhyb3ciIH0sCisgICAgICAgIHsgInRydWUiIH0sCisgICAgICAgIHsgInRyeSIgfSwKKyAgICAgICAgeyAidHlwZW9mIiB9LAorICAgICAgICB7ICJ1aW50IiB9LAorICAgICAgICB7ICJ1bG9uZyIgfSwKKyAgICAgICAgeyAidW5jaGVja2VkIiB9LAorICAgICAgICB7ICJ1bnNhZmUiIH0sCisgICAgICAgIHsgInVzaG9ydCIgfSwKKyAgICAgICAgeyAidXNpbmciIH0sCisgICAgICAgIHsgInZvaWQiIH0sCisgICAgICAgIHsgInZvbGF0aWxlIiB9LAorICAgICAgICB7ICJ3aGlsZSIgfSwKKyAgICAgICAgLy8gQ29udGV4dHVhbCBLZXl3b3JkcworICAgICAgICB7ICJhZGQiIH0sCisgICAgICAgIHsgImFsaWFzIiB9LAorICAgICAgICB7ICJhc2NlbmRpbmciIH0sCisgICAgICAgIHsgImFzeW5jIiB9LAorICAgICAgICB7ICJhd2FpdCIgfSwKKyAgICAgICAgeyAiZGVzY2VuZGluZyIgfSwKKyAgICAgICAgeyAiZHluYW1pYyIgfSwKKyAgICAgICAgeyAiZnJvbSIgfSwKKyAgICAgICAgeyAiZ2V0IiB9LAorICAgICAgICB7ICJnbG9iYWwiIH0sCisgICAgICAgIHsgImdyb3VwIiB9LAorICAgICAgICB7ICJpbnRvIiB9LAorICAgICAgICB7ICJqb2luIiB9LAorICAgICAgICB7ICJsZXQiIH0sCisgICAgICAgIHsgIm9yZGVyYnkiIH0sCisgICAgICAgIHsgInBhcnRpYWwiIH0sCisgICAgICAgIHsgInJlbW92ZSIgfSwKKyAgICAgICAgeyAic2VsZWN0IiB9LAorICAgICAgICB7ICJzZXQiIH0sCisgICAgICAgIHsgInZhbHVlIiB9LAorICAgICAgICB7ICJ2YXIiIH0sCisgICAgICAgIHsgIndoZW4iIH0sCisgICAgICAgIHsgIndoZXJlIiB9LAorICAgICAgICB7ICJ5aWVsZCIgfQorICAgIH07CisKKyAgICBzdHJpbmcgbWlzc2VkX2tleXdvcmRzID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisgICAgbWFwPHN0cmluZywgaW50PiBnZW5lcmF0b3JzX2tleXdvcmRzID0gZ2VuLT5nZXRfa2V5d29yZHNfbGlzdCgpOworCisgICAgZm9yICh2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBjdXJyZW50X2tleXdvcmRzLmJlZ2luKCk7IGl0ICE9IGN1cnJlbnRfa2V5d29yZHMuZW5kKCk7ICsraXQpCisgICAgeworICAgICAgICBpZiAoZ2VuZXJhdG9yc19rZXl3b3Jkcy5maW5kKCppdCkgPT0gZ2VuZXJhdG9yc19rZXl3b3Jkcy5lbmQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWlzc2VkX2tleXdvcmRzID0gbWlzc2VkX2tleXdvcmRzICsgKml0ICsgIiwiOworICAgICAgICB9CisgICAgfQorCisgICAgUkVRVUlSRShtaXNzZWRfa2V5d29yZHMgPT0gIiIpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaW5pdGlhbGl6YXRpb25fdGVzdHMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTc3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjCkBAIC0wLDAgKzEsNzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisKK1RFU1RfQ0FTRSggInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIHRocm93IGVycm9yIHdpdGggdW5rbm93biBvcHRpb25zIiwgIltpbml0aWFsaXphdGlvbl0iICkKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAia2V5cyIsICJrZXlzIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbnVsbHB0cjsKKworICAgIFJFUVVJUkVfVEhST1dTKGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKSk7CQorCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsJCit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgY3JlYXRlIHZhbGlkIGluc3RhbmNlIHdpdGggdmFsaWQgb3B0aW9ucyIsICJbaW5pdGlhbGl6YXRpb25dIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSwgeyAibnVsbGFibGUiLCAibnVsbGFibGUifSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG51bGxwdHI7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpKTsKKyAgICBSRVFVSVJFKGdlbiAhPSBudWxscHRyKTsKKyAgICBSRVFVSVJFKGdlbi0+aXNfd2NmX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRShnZW4tPmlzX251bGxhYmxlX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX2hhc2hjb2RlX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX3NlcmlhbGl6ZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc191bmlvbl9lbmFibGVkKCkpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBwYXNzIGluaXQgc3VjY2VzZnVsbHkiLCAiW2luaXRpYWxpemF0aW9uXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0seyAibnVsbGFibGUiLCAibnVsbGFibGUiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5pbml0X2dlbmVyYXRvcigpKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy90ZXN0c19tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDA5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYwpAQCAtMCwwICsxLDE5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjZGVmaW5lIENBVENIX0NPTkZJR19NQUlOCisjaW5jbHVkZSAiY2F0Y2gvY2F0Y2guaHBwIgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3ZlcnNpb24uaC5pbiBiL2NvbXBpbGVyL2NwcC92ZXJzaW9uLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzBlYzkuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3ZlcnNpb24uaC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNkZWZpbmUgVEhSSUZUX1ZFUlNJT04gIkBQQUNLQUdFX1ZFUlNJT05AIgpkaWZmIC0tZ2l0IGEvY29tcG9zZXIuanNvbiBiL2NvbXBvc2VyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzYTZjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBvc2VyLmpzb24KQEAgLTAsMCArMSwzOSBAQAoreworICAgICJuYW1lIjogImFwYWNoZS90aHJpZnQiLAorICAgICJkZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iLAorICAgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICJ0eXBlIjogImxpYnJhcnkiLAorICAgICJrZXl3b3JkcyI6IFsiUlBDIl0sCisgICAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCisgICAgInJlYWRtZSI6ICJSRUFETUUubWQiLAorICAgICJhdXRob3JzIjogWworICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiLAorICAgICAgICAgICAgImVtYWlsIjogImRldkB0aHJpZnQuYXBhY2hlLm9yZyIsCisgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICAgICAgICB9CisgICAgXSwKKyAgICAic3VwcG9ydCI6IHsKKyAgICAgICAgImVtYWlsIjogImRldkB0aHJpZnQuYXBhY2hlLm9yZyIsCisgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiCisgICAgfSwKKyAgICAicmVxdWlyZSI6IHsKKyAgICAgICAgInBocCI6ICJeNS41IHx8IF43LjAiCisgICAgfSwKKyAgICAicmVxdWlyZS1kZXYiOiB7CisgICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAifjQuOC4zNiIsCisgICAgICAgICJzcXVpemxhYnMvcGhwX2NvZGVzbmlmZmVyIjogIjMuKiIKKyAgICB9LAorICAgICJhdXRvbG9hZCI6IHsKKyAgICAgICAgInBzci00IjogeyJUaHJpZnRcXCI6ICJsaWIvcGhwL2xpYi8ifQorICAgIH0sCisgICAgImF1dG9sb2FkLWRldiI6IHsKKyAgICAgICAgInBzci00IjogeyJUZXN0XFxUaHJpZnRcXCI6ICJsaWIvcGhwL3Rlc3QvIn0KKyAgICB9LAorICAgICJtaW5pbXVtLXN0YWJpbGl0eSI6ICJzdGFibGUiLAorICAgICJleHRyYSI6IHsKKyAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKKyAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjEuMC54LWRldiIKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDk1YTc5NGEuLjIxNzQ2MjkKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMTcsMTMgKzE3LDE1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1BQ19QUkVSRVEoMi41OSkKK0FDX1BSRVJFUSgyLjY1KQorQUNfQ09ORklHX01BQ1JPX0RJUihbLi9hY2xvY2FsXSkKIAotQUNfSU5JVChbdGhyaWZ0XSwgWzAuMy4wXSkKK0FDX0lOSVQoW3RocmlmdF0sIFsxLjAuMF0pCiAKIEFDX0NPTkZJR19BVVhfRElSKFsuXSkKIAotQU1fSU5JVF9BVVRPTUFLRQorQU1fSU5JVF9BVVRPTUFLRShbMS4xMyBzdWJkaXItb2JqZWN0cyB0YXItdXN0YXJdKQorUEtHX1BST0dfUEtHX0NPTkZJRwogCiBBQ19BUkdfVkFSKFtQWV9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIFB5dGhvbiBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgIChOb3JtYWwgLS1wcmVmaXggaXMgaWdub3JlZCBmb3IgUHl0aG9uIGJlY2F1c2UKQEAgLTMyLDEwICszNCwxNSBAQAogQVNfSUYoW3Rlc3QgIngkUFlfUFJFRklYIiA9IHhdLCBbUFlfUFJFRklYPSIvdXNyIl0pCiAKIEFDX0FSR19WQVIoW0pBVkFfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyB0aGUgSmF2YSBsaWIgamFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBKYXZhIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEgaGFzIGRpZmZlcmVudCBjb25ldm50aW9ucy4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gIi91c3IvbG9jYWwvbGliIl0pCi1BU19JRihbdGVzdCAieCRKQVZBX1BSRUZJWCIgPSB4XSwgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQorQVNfSUYoW3Rlc3QgIngkSkFWQV9QUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRKQVZBX1BSRUZJWC91c3IvbG9jYWwvbGliIl0sCisgICAgICBbdGVzdCAieCRQUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRQUkVGSVgvdXNyL2xvY2FsL2xpYiJdLAorICAgICAgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQorCitBQ19BUkdfVkFSKFtSVUJZX1BSRUZJWF0sIFtQcmVmaXggZm9yIGluc3RhbGxpbmcgUnVieSBtb2R1bGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBSdWJ5IGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1YnkgaGFzIGRpZmZlcmVudCBjb252ZW50aW9ucy4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gbm9uZSwgbGV0IHJ1Ynkgc2V0dXAgZGVjaWRlXSkKIAogQUNfQVJHX1ZBUihbUEhQX1BSRUZJWF0sIFtQcmVmaXggZm9yIGluc3RhbGxpbmcgUEhQIG1vZHVsZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBQSFAgYmVjYXVzZQpAQCAtNDMsODggKzUwLDU5NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgPSAiL3Vzci9saWIvcGhwIl0pCiBBU19JRihbdGVzdCAieCRQSFBfUFJFRklYIiA9IHhdLCBbUEhQX1BSRUZJWD0iL3Vzci9saWIvcGhwIl0pCiAKK0FDX0FSR19WQVIoW1BIUF9DT05GSUdfUFJFRklYXSwKKyAgICAgICAgICAgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyBQSFAgZXh0ZW5zaW9uIG1vZHVsZSAuaW5pIGZpbGUuCisgICAgICAgICAgICAoTm9ybWFsIC0tcHJlZml4IGlzIGlnbm9yZWQgZm9yIFBIUCBiZWNhdXNlIFBIUCBoYXMKKyAgICAgICAgICAgICBkaWZmZXJlbnQgY29udmVudGlvbnMuKQorICAgICAgICAgICBEZWZhdWx0ID0gIi9ldGMvcGhwLmQiXSkKK0FTX0lGKFt0ZXN0ICJ4JFBIUF9DT05GSUdfUFJFRklYIiA9IHhdLCBbUEhQX0NPTkZJR19QUkVGSVg9Ii9ldGMvcGhwLmQiXSkKKworQUNfQVJHX1ZBUihbSU5TVEFMTERJUlNdLCBbV2hlbiBpbnN0YWxsaW5nIFBlcmwgbW9kdWxlcywgc3BlY2lmaWVzIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2V0cyBvZiBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNob29zZTogcGVybCwgc2l0ZSBvciB2ZW5kb3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gInZlbmRvciJdKQorQVNfSUYoW3Rlc3QgIngkSU5TVEFMTERJUlMiID0geF0sIFtJTlNUQUxMRElSUz0idmVuZG9yIl0pCisKK0FDX0FSR19WQVIoW1BFUkxfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyBQZXJsIG1vZHVsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9ybWFsIC0tcHJlZml4IGlzIGlnbm9yZWQgZm9yIFBlcmwgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybCBoYXMgZGlmZmVyZW50IGNvbnZlbnRpb25zLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQsIHdoZW4gSU5TVEFMTERJUlMgc2V0IHRvIHNpdGUgb3IgdmVuZG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9ICIvdXNyL2xvY2FsL2xpYiJdKQorQVNfSUYoW3Rlc3QgIngkUEVSTF9QUkVGSVgiID0geF0sIFtQRVJMX1BSRUZJWD0iL3Vzci9sb2NhbCJdKQorCitBQ19BUkdfVkFSKFtDQUJBTF9DT05GSUdVUkVfRkxBR1NdLAorICAgICAgICAgICBbRXh0cmEgZmxhZ3MgdG8gcGFzcyB0byBjYWJhbDogImNhYmFsIFNldHVwLmxocyBjb25maWd1cmUgJENBQkFMX0NPTkZJR1VSRV9GTEFHUyIuCisgICAgICAgICAgICAoVHlwaWNhbGx5IHVzZWQgdG8gc2V0IC0tdXNlciBvciBmb3JjZSAtLWdsb2JhbC4pXSkKKworQUNfU1VCU1QoQ0FCQUxfQ09ORklHVVJFX0ZMQUdTKQorCitBQ19BUkdfVkFSKFtEX0lNUE9SVF9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIEQgbW9kdWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJTkNMVURFRElSL2QyXV0pCitBU19JRihbdGVzdCAieCREX0lNUE9SVF9QUkVGSVgiID0geF0sIFtEX0lNUE9SVF9QUkVGSVg9IiR7aW5jbHVkZWRpcn0vZDIiXSkKKworQUNfQVJHX1ZBUihbRE1EX0xJQkVWRU5UX0ZMQUdTXSwgW0RNRCBmbGFncyBmb3IgbGlua2luZyBsaWJldmVudCAoYXV0by1kZXRlY3RlZCBpZiBub3Qgc2V0KS5dKQorQUNfQVJHX1ZBUihbRE1EX09QRU5TU0xfRkxBR1NdLCBbRE1EIGZsYWdzIGZvciBsaW5raW5nIE9wZW5TU0wgKGF1dG8tZGV0ZWN0ZWQgaWYgbm90IHNldCkuXSkKKworQUNfQVJHX1ZBUihbVEhSSUZUXSwgW1BhdGggdG8gdGhlIHRocmlmdCB0b29sIChuZWVkZWQgZm9yIGNyb3NzLWNvbXBpbGF0aW9uKS5dKQorQVNfSUYoW3Rlc3QgIngkVEhSSUZUIiA9IHhdLCBbVEhSSUZUPWBwd2RgL2NvbXBpbGVyL2NwcC90aHJpZnRdKQorCiBBQ19QUk9HX0NDCiBBQ19QUk9HX0NQUAogQUNfUFJPR19DWFgKIEFDX1BST0dfSU5TVEFMTAogQUNfUFJPR19MSUJUT09MCiBBQ19QUk9HX01BS0VfU0VUCitBQ19QUk9HX0JJU09OKDIuNSkKIEFDX1BST0dfWUFDQwogQUNfUFJPR19MRVgKIEFNX1BST0dfTEVYCiBBQ19QUk9HX0xOX1MKIEFDX1BST0dfTUtESVJfUAorQUNfUFJPR19BV0sKK0FDX1BST0dfUkFOTElCCiAKIEFDX0xBTkcoW0MrK10pCi1BWF9CT09TVF9CQVNFKFsxLjMzLjFdKQorQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtub2V4dF0sIFttYW5kYXRvcnldKQogCi1BWF9MSUJfRVZFTlQoWzEuMF0pCi1BTV9DT05ESVRJT05BTChbQU1YX0hBVkVfTElCRVZFTlRdLCBbdGVzdCAiJHN1Y2Nlc3MiID0gInllcyJdKQorQU1fRVhUUkFfUkVDVVJTSVZFX1RBUkdFVFMoW3N0eWxlXSkKK0FDX1NVQlNUKENQUFNUWUxFX0NNRCwgJ2ZpbmQgLiAtdHlwZSBmIFwoIC1pbmFtZSAiKi5oIiAtb3IgLWluYW1lICIqLmNwcCIgLW9yIC1pbmFtZSAiKi5jYyIgLW9yIC1pbmFtZSAiKi50Y2MiIFwpIC1wcmludGYgIlJlZm9ybWF0dGluZzogJWgvJWZcbiIgLWV4ZWMgY2xhbmctZm9ybWF0IC1pIHt9IFw7JykKKyMgJworIyBUaGUgYWJvdmUgY29tbWVudCBpcyB0byBmaXggZWRpdG9yIHN5bnRheCBoaWdobGlnaHRpbmcKIAotQVhfTElCX1pMSUIoWzEuMi4zXSkKLUFNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9aTElCXSwgW3Rlc3QgIiRzdWNjZXNzIiA9ICJ5ZXMiXSkKK0FDX0FSR19FTkFCTEUoW2xpYnNdLAorICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGlic10sIFtidWlsZCB0aGUgQXBhY2hlIFRocmlmdCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXV0pLAorICBbXSwgZW5hYmxlX2xpYnM9eWVzCispCitoYXZlX2xpYnM9eWVzCitpZiB0ZXN0ICIkZW5hYmxlX2xpYnMiID0gIm5vIjsgdGhlbgorICBoYXZlX2xpYnM9Im5vIgorICB3aXRoX2NwcD0ibm8iCisgIHdpdGhfY19nbGliPSJubyIKKyAgd2l0aF9jbD0ibm8iCisgIHdpdGhfamF2YT0ibm8iCisgIHdpdGhfY3NoYXJwPSJubyIKKyAgd2l0aF9weXRob249Im5vIgorICB3aXRoX3B5Mz0ibm8iCisgIHdpdGhfcnVieT0ibm8iCisgIHdpdGhfaGFza2VsbD0ibm8iCisgIHdpdGhfaGF4ZT0ibm8iCisgIHdpdGhfZG90bmV0Y29yZT0ibm8iCisgIHdpdGhfcGVybD0ibm8iCisgIHdpdGhfcGhwPSJubyIKKyAgd2l0aF9waHBfZXh0ZW5zaW9uPSJubyIKKyAgd2l0aF9kYXJ0PSJubyIKKyAgd2l0aF9lcmxhbmc9Im5vIgorICB3aXRoX2dvPSJubyIKKyAgd2l0aF9kPSJubyIKKyAgd2l0aF9ub2RlanM9Im5vIgorICB3aXRoX25vZGV0cz0ibm8iCisgIHdpdGhfbHVhPSJubyIKKyAgd2l0aF9ycz0ibm8iCisgIHdpdGhfc3dpZnQ9Im5vIgorZmkKKworQVhfVEhSSUZUX0xJQihjcHAsIFtDKytdLCB5ZXMpCitoYXZlX2NwcD1ubworaWYgdGVzdCAiJHdpdGhfY3BwIiA9ICJ5ZXMiOyAgdGhlbgorICBBWF9CT09TVF9CQVNFKFsxLjUzLjBdKQorICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgPSAieHllcyIgOyB0aGVuCisgICAgQUNfU1VCU1QoW0JPT1NUX0xJQl9ESVJdLCBbJChlY2hvICIkQk9PU1RfTERGTEFHUyIgfCBzZWQgLWUgJ3MvXlwtTC8vJyldKQorICAgIEFDX1NVQlNUKFtCT09TVF9DSFJPTk9fTERBRERdLCBbJChlY2hvICIkQk9PU1RfTElCX0RJUi9saWJib29zdF9jaHJvbm8uYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfRklMRVNZU1RFTV9MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X2ZpbGVzeXN0ZW0uYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfU1lTVEVNX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3Rfc3lzdGVtLmEiKV0pCisgICAgQUNfU1VCU1QoW0JPT1NUX1RFU1RfTERBRERdLCBbJChlY2hvICIkQk9PU1RfTElCX0RJUi9saWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEiKV0pCisgICAgQUNfU1VCU1QoW0JPT1NUX1RIUkVBRF9MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X3RocmVhZC5hIildKQorICAgIGhhdmVfY3BwPSJ5ZXMiCisgIGZpCisKKyAgQVhfTElCX0VWRU5UKFsyLjBdKQorICBoYXZlX2xpYmV2ZW50PSRzdWNjZXNzCisKKyAgQVhfTElCX1pMSUIoWzEuMi4zXSkKKyAgaGF2ZV96bGliPSRzdWNjZXNzCisKKyAgQVhfVEhSSUZUX0xJQihxdDQsIFtRdF0sIHllcykKKyAgaGF2ZV9xdD1ubworICBpZiB0ZXN0ICIkd2l0aF9xdDQiID0gInllcyI7ICB0aGVuCisgICAgUEtHX0NIRUNLX01PRFVMRVMoW1FUXSwgW1F0Q29yZSA+PSA0LjMsIFF0TmV0d29yayA+PSA0LjNdLCBoYXZlX3F0PXllcywgaGF2ZV9xdD1ubykKKyAgZmkKKyAgaWYgdGVzdCAiJGhhdmVfcXQiID0gInllcyI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0dTKFtRVF9NT0NdLCBbbW9jLXF0NCBtb2NdLCAiZmFpbCIpCisgICAgaWYgdGVzdCAiJFFUX01PQyIgPSAiZmFpbCI7IHRoZW4KKyAgICAgIGhhdmVfcXQ9bm8KKyAgICBmaQorICBmaQorCisgIEFYX1RIUklGVF9MSUIocXQ1LCBbUXQ1XSwgeWVzKQorICBoYXZlX3F0NT1ubworICBxdF9yZWR1Y2VfcmVsb2M9IiIKKyAgaWYgdGVzdCAiJHdpdGhfcXQ1IiA9ICJ5ZXMiOyAgdGhlbgorICAgIFBLR19DSEVDS19NT0RVTEVTKFtRVDVdLCBbUXQ1Q29yZSA+PSA1LjAsIFF0NU5ldHdvcmsgPj0gNS4wXSwKKyAgICAgICAgICAgICAgICAgICAgICBbaGF2ZV9xdDU9eWVzO3F0X3JlZHVjZV9yZWxvYz1gJFBLR19DT05GSUcgLS12YXJpYWJsZT1xdF9jb25maWcgUXQ1Q29yZSB8IGdyZXAgInJlZHVjZV9yZWxvY2F0aW9ucyJgXSwKKyAgICAgICAgICAgICAgICAgICAgICBbaGF2ZV9xdDU9bm9dKQorICBmaQorICBpZiB0ZXN0ICIkaGF2ZV9xdDUiID0gInllcyI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0dTKFtRVDVfTU9DXSwgW21vYy1xdDUgbW9jXSwgImZhaWwiKQorICAgIGlmIHRlc3QgIiRRVDVfTU9DIiA9ICJmYWlsIjsgdGhlbgorICAgICAgaGF2ZV9xdDU9bm8KKyAgICBmaQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFtXSVRIX0NQUF0sIFt0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX0xJQkVWRU5UXSwgW3Rlc3QgIiRoYXZlX2xpYmV2ZW50IiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9aTElCXSwgW3Rlc3QgIiRoYXZlX3psaWIiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX1FUXSwgW3Rlc3QgIiRoYXZlX3F0IiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtBTVhfSEFWRV9RVDVdLCBbdGVzdCAiJGhhdmVfcXQ1IiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtRVDVfUkVEVUNFX1JFTE9DQVRJT05TXSwgW3Rlc3QgIngkcXRfcmVkdWNlX3JlbG9jIiAhPSAieCJdKQorCitBWF9USFJJRlRfTElCKGNfZ2xpYiwgW0MgKEdMaWIpXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfY19nbGliIiA9ICJ5ZXMiOyB0aGVuCisgIFBLR19DSEVDS19NT0RVTEVTKFtHTElCXSwgW2dsaWItMi4wID49IDIuMF0sIGhhdmVfZ2xpYjI9eWVzLCBoYXZlX2dsaWIyPW5vKQorICBQS0dfQ0hFQ0tfTU9EVUxFUyhbR09CSkVDVF0sIFtnb2JqZWN0LTIuMCA+PSAyLjBdLCBoYXZlX2dvYmplY3QyPXllcywgaGF2ZV9nb2JqZWN0Mj1ubykKKyAgaWYgdGVzdCAiJGhhdmVfZ2xpYjIiID0gInllcyIgLWEgIiRoYXZlX2dvYmplY3QyIiA9ICJ5ZXMiIDsgdGhlbgorICAgIGhhdmVfY19nbGliPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9DX0dMSUIsIFt0ZXN0ICIkaGF2ZV9nbGliMiIgPSAieWVzIiAtYSAiJGhhdmVfZ29iamVjdDIiID0gInllcyJdKQorCitlY2hvICJPcGVuU1NMIGNoZWNrIgoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIC1vICIkaGF2ZV9jX2dsaWIiID0gInllcyI7ICB0aGVuCisgIGVjaG8gIkhhdmUgY3BwIG9yIGMgc28gd2UgY2hlY2sgZm9yIE9wZW5TU0wiCisgIEFYX0NIRUNLX09QRU5TU0woKQorZmkKIAogQVhfVEhSSUZUX0xJQihjc2hhcnAsIFtDI10sIHllcykKIGlmIHRlc3QgIiR3aXRoX2NzaGFycCIgPSAieWVzIjsgIHRoZW4KKyAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAyLjExLjAsIG1vbm9fMl8xMT15ZXMsIG1vbm9fMl8xMT1ubykKKyAgaWYgdGVzdCAiJG1vbm9fMl8xMSIgPT0gInllcyI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0coW01DU10sIFttY3NdKQorICAgIGlmIHRlc3QgIngkTUNTIiAhPSAieCI7IHRoZW4KKyAgICAgIG1vbm9fbWNzPSJ5ZXMiCisgICAgZmkKKyAgZmkKICAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAyLjAuMCwgbmV0XzNfNT15ZXMsIG5ldF8zXzU9bm8pCiAgIFBLR19DSEVDS19NT0RVTEVTKE1PTk8sIG1vbm8gPj0gMS4yLjQsIGhhdmVfbW9ubz15ZXMsIGhhdmVfbW9ubz1ubykKKyAgaWYgdGVzdCAiJGhhdmVfbW9ubyIgPSAieWVzIiA7IHRoZW4KKyAgICBoYXZlX2NzaGFycD0ieWVzIgorICBmaQogZmkKLUFNX0NPTkRJVElPTkFMKFdJVEhfTU9OTywgW3Rlc3QgIiRoYXZlX21vbm8iID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9NT05PLCBbdGVzdCAiJGhhdmVfY3NoYXJwIiA9ICJ5ZXMiXSkKIEFNX0NPTkRJVElPTkFMKE5FVF8yXzAsIFt0ZXN0ICIkbmV0XzNfNSIgPSAibm8iXSkKK0FNX0NPTkRJVElPTkFMKE1PTk9fTUNTLCBbdGVzdCAiJG1vbm9fbWNzIiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihqYXZhLCBbSmF2YV0sIHllcykKIGlmIHRlc3QgIiR3aXRoX2phdmEiID0gInllcyI7ICB0aGVuCiAgIEFYX0pBVkFDX0FORF9KQVZBCiAgIEFDX1BBVEhfUFJPRyhbQU5UXSwgW2FudF0pCi0gIEFYX0NIRUNLX0pBVkFfQ0xBU1Mob3JnLnNsZjRqLkxvZ2dlcikKLSAgaGF2ZV9zbGY0aj0iJHN1Y2Nlc3MiCi0gIEFYX0NIRUNLX0pBVkFfQ0xBU1Mob3JnLnNsZjRqLmltcGwuU2ltcGxlTG9nZ2VyKQotICBoYXZlX3NsZjRqX3NpbXBsZT0iJHN1Y2Nlc3MiCi0gIEFYX0NIRUNLX0pBVkFfQ0xBU1Mob3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5IYXNoQ29kZUJ1aWxkZXIpCi0gIGhhdmVfaGFzaGNvZGU9IiRzdWNjZXNzIgotICBpZiB0ZXN0ICJ4JGhhdmVfc2xmNGpfc2ltcGxlIiA9ICJ4eWVzIiAmJiB0ZXN0ICJ4JGhhdmVfc2xmNGoiID0gInh5ZXMiICYmIHRlc3QgIngkaGF2ZV9oYXNoY29kZSIgPSAieHllcyIgOyB0aGVuCi0gICAgQU5UX0ZMQUdTPSIkQU5UX0ZMQUdTIC1Ebm9pdnk9IgotICBmaQorICBBWF9DSEVDS19BTlRfVkVSU0lPTigkQU5ULCAxLjcpCiAgIEFDX1NVQlNUKENMQVNTUEFUSCkKICAgQUNfU1VCU1QoQU5UX0ZMQUdTKQorICBBQ19TVUJTVChHUkFETEVfT1BUUykKKyAgaWYgdGVzdCAieCRKQVZBIiAhPSAieCIgJiYgdGVzdCAieCRKQVZBQyIgIT0gIngiICYmIHRlc3QgIngkQU5UIiAhPSAieCIgOyB0aGVuCisgICAgaGF2ZV9qYXZhPSJ5ZXMiCisgIGZpCiBmaQotQU1fQ09ORElUSU9OQUwoW1dJVEhfSkFWQV0sCi0gICAgICAgICAgICAgICBbdGVzdCAtbiAiJEFOVCIgLWEgLW4gIiRKQVZBIiAtYSAtbiAiJEpBVkFDIl0pCitBTV9DT05ESVRJT05BTChbV0lUSF9KQVZBXSwgW3Rlc3QgIiRoYXZlX2phdmEiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKGVybGFuZywgW0VybGFuZ10sIHllcykKIGlmIHRlc3QgIiR3aXRoX2VybGFuZyIgPSAieWVzIjsgIHRoZW4KICAgQUNfRVJMQU5HX1BBVEhfRVJMCiAgIEFDX0VSTEFOR19QQVRIX0VSTEMKLSAgQUNfRVJMQU5HX1NVQlNUX0lOU1RBTExfTElCX1NVQkRJUihBQ19QQUNLQUdFX05BTUUsIEFDX1BBQ0tBR0VfVkVSU0lPTikKLWZpCi1BTV9DT05ESVRJT05BTChXSVRIX0VSTEFORywgW3Rlc3QgLW4gIiRFUkwiIC1hIC1uICIkRVJMQyJdKQorICBBQ19QQVRIX1BST0coW1JFQkFSXSwgW3JlYmFyXSkKKyAgaWYgdGVzdCAtbiAiJEVSTEMiIDsgdGhlbgorICAgIEFDX0VSTEFOR19TVUJTVF9MSUJfRElSCisgICAgIyBJbnN0YWxsIGludG8gdGhlIGRldGVjdGVkIEVybGFuZyBkaXJlY3RvcnkgaW5zdGVhZCBvZiAkbGliZGlyL2VybGFuZy9saWIKKyAgICBFUkxBTkdfSU5TVEFMTF9MSUJfRElSPSIkRVJMQU5HX0xJQl9ESVIiCisgICAgQUNfRVJMQU5HX1NVQlNUX0lOU1RBTExfTElCX1NVQkRJUihBQ19QQUNLQUdFX05BTUUsIEFDX1BBQ0tBR0VfVkVSU0lPTikKKyAgZmkKKyAgaWYgdGVzdCAtbiAiJEVSTCIgLWEgLW4gIiRFUkxDIiAmJiB0ZXN0ICJ4JFJFQkFSIiAhPSAieCIgOyB0aGVuCisgICAgaGF2ZV9lcmxhbmc9InllcyIKIAotQVhfVEhSSUZUX0xJQihweSwgW1B5dGhvbl0sIHllcykKLWlmIHRlc3QgIiR3aXRoX3B5IiA9ICJ5ZXMiOyAgdGhlbgotICBBTV9QQVRIX1BZVEhPTigyLjQsLCA6KQorICAgICMgb3RwX3JlbGVhc2UgaXMgc2ltcGx5IGEgbnVtYmVyIChsaWtlICIxNyIpIGZvciBPVFAxNysgd2hpbGUgIlIxNi4uLiIgZm9yIE9UUDE2IG9yIGxlc3MuCisgICAgIyBPVFAgdmVyc2lvbiBpcyBjdXJyZW50bHkgb25seSB1c2VkIGZvciBydW5uaW5nIHRlc3RzLgorICAgIGlmICRFUkwgLWV2YWwgJ2VybGFuZzpkaXNwbGF5KGVybGFuZzpzeXN0ZW1faW5mbyhvdHBfcmVsZWFzZSkpLGhhbHQoKS4nIC1ub3NoZWxsIHwgZ3JlcCAiXlwiUiIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgZXJsYW5nX290cDE2X29yX2xlc3M9InllcyIKKyAgICBmaQorICBmaQogZmkKLUFNX0NPTkRJVElPTkFMKFdJVEhfUFlUSE9OLCBbdGVzdCAtbiAiJFBZVEhPTiIgLWEgIiRQWVRIT04iICE9ICI6Il0pCitBTV9DT05ESVRJT05BTChXSVRIX0VSTEFORywgW3Rlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChFUkxBTkdfT1RQMTYsIFt0ZXN0ICIkZXJsYW5nX290cDE2X29yX2xlc3MiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKG5vZGVqcywgW05vZGVqc10sIHllcykKK2hhdmVfbm9kZWpzPW5vCitpZiB0ZXN0ICIkd2l0aF9ub2RlanMiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HUyhbTk9ERUpTXSwgW25vZGVqcyBub2RlXSkKKyAgQUNfUEFUSF9QUk9HKFtOUE1dLCBbbnBtXSkKKyAgaWYgdGVzdCAieCROT0RFSlMiICE9ICJ4IiAtYSAieCROUE0iICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfbm9kZWpzPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9OT0RFSlMsIFt0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoSEFWRV9OUE0sIFt0ZXN0ICJ4JE5QTSIgIT0gIngiXSkKKworQVhfVEhSSUZUX0xJQihub2RldHMsIFtOb2RldHNdLCB5ZXMpCitoYXZlX25vZGV0cz1ubworaWYgdGVzdCAiJHdpdGhfbm9kZXRzIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPR1MoW05PREVUU10sIFtub2RldHMgbm9kZV0pCisgIEFDX1BBVEhfUFJPRyhbTlBNXSwgW25wbV0pCisgIGlmIHRlc3QgIngkTk9ERVRTIiAhPSAieCIgLWEgIngkTlBNIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX25vZGV0cz0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfTk9ERVRTLCBbdGVzdCAiJGhhdmVfbm9kZXRzIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKEhBVkVfTlBNLCBbdGVzdCAieCROUE0iICE9ICJ4Il0pCisKK0FYX1RIUklGVF9MSUIobHVhLCBbTHVhXSwgeWVzKQoraGF2ZV9sdWE9bm8KK2lmIHRlc3QgIiR3aXRoX2x1YSIgPSAieWVzIjsgdGhlbgorICBBWF9QUk9HX0xVQSg1LjIsLCBoYXZlX2x1YT0ieWVzIiwgaGF2ZV9sdWE9Im5vIikKKyAgaWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiOyB0aGVuCisgICAgQVhfTFVBX0hFQURFUlMoLCBoYXZlX2x1YT0ibm8iKQorICAgIEFYX0xVQV9MSUJTKCwgaGF2ZV9sdWE9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0xVQSwgW3Rlc3QgIiRoYXZlX2x1YSIgPSAieWVzIl0pCisKKyMgRmluZCBweXRob24gcmVnYXJkbGVzcyBvZiB3aXRoX3B5dGhvbiB2YWx1ZSwgYmVjYXVzZSBpdCdzIG5lZWRlZCBieSBtYWtlIGNyb3NzCitBTV9QQVRIX1BZVEhPTigyLjYsLCA6KQorQVhfVEhSSUZUX0xJQihweXRob24sIFtQeXRob25dLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9weXRob24iID0gInllcyI7ICB0aGVuCisgIGlmIHRlc3QgLW4gIiRQWVRIT04iOyB0aGVuCisgICAgaGF2ZV9weXRob249InllcyIKKyAgZmkKKyAgQUNfUEFUSF9QUk9HKFtUUklBTF0sIFt0cmlhbF0pCisgIGlmIHRlc3QgLW4gIiRUUklBTCI7IHRoZW4KKyAgICBoYXZlX3RyaWFsPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QWVRIT04sIFt0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9UV0lTVEVEX1RFU1QsIFt0ZXN0ICIkaGF2ZV90cmlhbCIgPSAieWVzIl0pCisKKyMgRmluZCAicHl0aG9uMyIgZXhlY3V0YWJsZS4KKyMgSXQncyBkaXN0cm8gc3BlY2lmaWMgYW5kIGZhciBmcm9tIGlkZWFsIGJ1dCBuZWVkZWQgdG8gY3Jvc3MgdGVzdCBweTItMyBhdCBvbmNlLgorIyBUT0RPOiBmaW5kICJweXRob24yIiBpZiBpdCdzIDMueAoraGF2ZV9weTM9Im5vIgorQVhfVEhSSUZUX0xJQihweTMsIFtQeTNdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9weTMiID0gInllcyI7IHRoZW4KKyAgaWYgJFBZVEhPTiAtLXZlcnNpb24gMj4mMSB8IGdyZXAgLXEgIlB5dGhvbiAyIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPR1MoW1BZVEhPTjNdLCBbcHl0aG9uMyBweXRob24zLjcgcHl0aG9uMzcgcHl0aG9uMy42IHB5dGhvbjM2IHB5dGhvbjMuNSBweXRob24zNSBweXRob24zLjQgcHl0aG9uMzRdKQorICAgIGlmIHRlc3QgLW4gIiRQWVRIT04zIjsgdGhlbgorICAgICAgaGF2ZV9weTM9InllcyIKKyAgICBmaQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUFkzLCBbdGVzdCAiJGhhdmVfcHkzIiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihwZXJsLCBbUGVybF0sIHllcykKIGlmIHRlc3QgIiR3aXRoX3BlcmwiID0gInllcyI7IHRoZW4KICAgQUNfUEFUSF9QUk9HKFtQRVJMXSwgW3BlcmxdKQorICBpZiB0ZXN0IC1uICIkUEVSTCIgOyB0aGVuCisgICAgQUNfUFJPR19QRVJMX01PRFVMRVMoW0JpdDo6VmVjdG9yXSwgc3VjY2Vzcz0ieWVzIiwgc3VjY2Vzcz0ibm8iKQorICAgIGhhdmVfcGVybF9iaXRfdmVjdG9yPSIkc3VjY2VzcyIKKyAgICBBQ19QUk9HX1BFUkxfTU9EVUxFUyhbQ2xhc3M6OkFjY2Vzc29yXSwgc3VjY2Vzcz0ieWVzIiwgc3VjY2Vzcz0ibm8iKQorICAgIGhhdmVfcGVybF9jbGFzc19hY2Nlc3Nvcj0iJHN1Y2Nlc3MiCisgIGZpCisgIGlmIHRlc3QgLW4gIiRQRVJMIiAtYSAiJGhhdmVfcGVybF9iaXRfdmVjdG9yIiA9ICJ5ZXMiIDsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRQRVJMIiAtYSAiJGhhdmVfcGVybF9jbGFzc19hY2Nlc3NvciIgPSAieWVzIiA7IHRoZW4KKyAgICAgIGhhdmVfcGVybD0ieWVzIgorICAgIGZpCisgIGZpCiBmaQotQU1fQ09ORElUSU9OQUwoV0lUSF9QRVJMLCBbdGVzdCAtbiAiJFBFUkwiXSkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUEVSTCwgW3Rlc3QgIiRoYXZlX3BlcmwiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKHBocCwgW1BIUF0sIHllcykKIGlmIHRlc3QgIiR3aXRoX3BocCIgPSAieWVzIjsgdGhlbgogICBBQ19QQVRIX1BST0coW1BIUF0sIFtwaHBdKQorICBpZiB0ZXN0IC1uICIkUEhQIiA7IHRoZW4KKyAgICBoYXZlX3BocD0ieWVzIgorICBmaQogZmkKLUFNX0NPTkRJVElPTkFMKFdJVEhfUEhQLCBbdGVzdCAtbiAiJFBIUCJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9QSFAsIFt0ZXN0ICIkaGF2ZV9waHAiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHBocF9leHRlbnNpb24sIFtQSFBfRVhURU5TSU9OXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfcGhwX2V4dGVuc2lvbiIgPSAieWVzIjsgdGhlbgorICBpZiB0ZXN0IC1mICJsaWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZSI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0coW1BIUF9DT05GSUddLCBbcGhwLWNvbmZpZ10pCisgICAgaWYgdGVzdCAtbiAiJFBIUF9DT05GSUciIDsgdGhlbgorICAgICAgQUNfQ09ORklHX1NVQkRJUlMoW2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2xdKQorICAgICAgaGF2ZV9waHBfZXh0ZW5zaW9uPSJ5ZXMiCisgICAgZmkKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX1BIUF9FWFRFTlNJT04sIFt0ZXN0ICIkaGF2ZV9waHBfZXh0ZW5zaW9uIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihkYXJ0LCBbREFSVF0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2RhcnQiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtEQVJUXSwgW2RhcnRdKQorICBBQ19QQVRIX1BST0coW0RBUlRQVUJdLCBbcHViXSkKKyAgaWYgdGVzdCAieCREQVJUIiAhPSAieCIgLWEgIngkREFSVFBVQiIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9kYXJ0PSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9EQVJULCBbdGVzdCAiJGhhdmVfZGFydCIgPSAieWVzIl0pCiAKIEFYX1RIUklGVF9MSUIocnVieSwgW1J1YnldLCB5ZXMpCitoYXZlX3J1Ynk9bm8KIGlmIHRlc3QgIiR3aXRoX3J1YnkiID0gInllcyI7IHRoZW4KICAgQUNfUEFUSF9QUk9HKFtSVUJZXSwgW3J1YnldKQotICBBQ19QQVRIX1BST0coW1JTUEVDXSwgW3NwZWNdKQorICBBQ19QQVRIX1BST0coW0JVTkRMRVJdLCBbYnVuZGxlXSkKKyAgaWYgdGVzdCAieCRSVUJZIiAhPSAieCIgLWEgIngkQlVORExFUiIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9ydWJ5PSJ5ZXMiCisgIGZpCiBmaQotQU1fQ09ORElUSU9OQUwoV0lUSF9SVUJZLCBbdGVzdCAtbiAiJFJVQlkiXSkKLUFNX0NPTkRJVElPTkFMKEhBVkVfUlNQRUMsIFt0ZXN0IC1uICIkUlNQRUMiXSkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUlVCWSwgW3Rlc3QgIiRoYXZlX3J1YnkiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoSEFWRV9CVU5ETEVSLCBbdGVzdCAieCRCVU5ETEVSIiAhPSAieCJdKQogCitBWF9USFJJRlRfTElCKGhhc2tlbGwsIFtIYXNrZWxsXSwgeWVzKQoraGF2ZV9oYXNrZWxsPW5vCitSVU5IQVNLRUxMPXRydWUKK0NBQkFMPXRydWUKK2lmIHRlc3QgIiR3aXRoX2hhc2tlbGwiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtDQUJBTF0sIFtjYWJhbF0pCisgIEFDX1BBVEhfUFJPRyhbUlVOSEFTS0VMTF0sIFtydW5oYXNrZWxsXSkKKyAgaWYgdGVzdCAieCRDQUJBTCIgIT0gIngiIC1hICJ4JFJVTkhBU0tFTEwiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfaGFza2VsbD0ieWVzIgorICBlbHNlCisgICAgUlVOSEFTS0VMTD10cnVlCisgICAgQ0FCQUw9dHJ1ZQorICBmaQorZmkKK0FDX1NVQlNUKENBQkFMKQorQUNfU1VCU1QoUlVOSEFTS0VMTCkKK0FNX0NPTkRJVElPTkFMKFdJVEhfSEFTS0VMTCwgW3Rlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKGdvLCBbR29dLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9nbyIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtHT10sIFtnb10pCisgIGlmIFtbIC14ICIkR08iIF1dIDsgdGhlbgorICAgIEFTX0lGKFt0ZXN0IC1uICIkR08iXSxbCisgICAgICBheF9nb192ZXJzaW9uPSIxLjQiCisgICAgICBheF9nbzE3X3ZlcnNpb249IjEuNyIKKworICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR28gdmVyc2lvbl0pCisgICAgICBnb2xhbmdfdmVyc2lvbj1gJEdPIHZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChnbyBcKVwodmVyc2lvbiBcKVwoZ29cKVwoQDw6QDAtOUA6PkAuQDw6QDAtOUA6PkAuQDw6QDAtOUA6PkBcKVwoQDw6QFwqQDo+QCpcKS4qL1w0LydgCisgICAgICBBQ19NU0dfUkVTVUxUKCRnb2xhbmdfdmVyc2lvbikKKyAgICAgIEFDX1NVQlNUKFtnb2xhbmdfdmVyc2lvbl0sWyRnb2xhbmdfdmVyc2lvbl0pCisgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9nb192ZXJzaW9uXSxbbGVdLFskZ29sYW5nX3ZlcnNpb25dLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9nbz0ieWVzIgorICAgICAgXSxbCisgICAgICA6CisgICAgICAgIGhhdmVfZ289Im5vIgorICAgICAgXSkKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGdvbGFuZ192ZXJzaW9uXSxbbHRdLFskYXhfZ28xN192ZXJzaW9uXSxbCisgICAgICA6CisgICAgICAgIGdvX3ZlcnNpb25fbHRfMTc9InllcyIKKyAgICAgIF0sWworICAgICAgOgorICAgICAgICBnb192ZXJzaW9uX2x0XzE3PSJubyIKKyAgICAgIF0pCisgICAgXSxbCisgICAgICBBQ19NU0dfV0FSTihbY291bGQgbm90IGZpbmQgR28gXSkKKyAgICAgIGhhdmVfZ289Im5vIgorICAgIF0pCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9HTywgW3Rlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtHT1ZFUlNJT05fTFRfMTddLCBbdGVzdCAiJGdvX3ZlcnNpb25fbHRfMTciID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHN3aWZ0LCBbU3dpZnRdLCB5ZXMpCitoYXZlX3N3aWZ0PSJubyIKK2lmIHRlc3QgIiR3aXRoX3N3aWZ0IiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU1dJRlRdLCBbc3dpZnRdKQorICBpZiB0ZXN0ICJ4JFNXSUZUIiAhPSAieCIgLWEgIngkU1dJRlQiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfc3dpZnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChbV0lUSF9TV0lGVF0sIFt0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIocnMsIFtSdXN0XSwgeWVzKQoraGF2ZV9ycz0ibm8iCitpZiB0ZXN0ICIkd2l0aF9ycyIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtDQVJHT10sIFtjYXJnb10pCisgIEFDX1BBVEhfUFJPRyhbUlVTVENdLCBbcnVzdGNdKQorICBpZiBbWyAteCAiJENBUkdPIiBdXSAmJiBbWyAteCAiJFJVU1RDIiBdXTsgdGhlbgorICAgICAgbWluX3J1c3RjX3ZlcnNpb249IjEuMTMiCisKKyAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHJ1c3RjIHZlcnNpb25dKQorICAgICAgcnVzdGNfdmVyc2lvbj1gJFJVU1RDIC0tdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKHJ1c3RjIFwpXChbMC05XVwpXC5cKFswLTldWzAtOV0qXClcLlwoWzAtOV1bMC05XSpcKS4qL1wyLlwzLydgCisgICAgICBBQ19NU0dfUkVTVUxUKCRydXN0Y192ZXJzaW9uKQorICAgICAgQUNfU1VCU1QoW3J1c3RjX3ZlcnNpb25dLFskcnVzdGNfdmVyc2lvbl0pCisKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJG1pbl9ydXN0Y192ZXJzaW9uXSxbbGVdLFskcnVzdGNfdmVyc2lvbl0sWworICAgICAgOgorICAgICAgICBoYXZlX3JzPSJ5ZXMiCisgICAgICBdLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9ycz0ibm8iCisgICAgICBdKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUlMsIFt0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoY2wsIFtDb21tb24gTGlzcF0sIHllcykKK2hhdmVfY2w9Im5vIgoraWYgdGVzdCAiJHdpdGhfY2wiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU0JDTF0sIFtzYmNsXSkKKyAgaWYgdGVzdCAieCRTQkNMIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2NsPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9DTCwgW3Rlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihoYXhlLCBbSGF4ZV0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2hheGUiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbSEFYRV0sIFtoYXhlXSkKKyAgaWYgW1sgLXggIiRIQVhFIiBdXSA7IHRoZW4KKyAgICBBWF9QUk9HX0hBWEVfVkVSU0lPTiggWzMuMS4zXSwgaGF2ZV9oYXhlPSJ5ZXMiLCBoYXZlX2hheGU9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0hBWEUsIFt0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiXSkKKworCitBWF9USFJJRlRfTElCKGRvdG5ldGNvcmUsIFsuTkVUIENvcmVdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9kb3RuZXRjb3JlIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW0RPVE5FVENPUkVdLCBbZG90bmV0XSkKKyAgaWYgW1sgLXggIiRET1RORVRDT1JFIiBdXSA7IHRoZW4KKyAgICBBWF9QUk9HX0RPVE5FVENPUkVfVkVSU0lPTiggWzIuMC4wXSwgaGF2ZV9kb3RuZXRjb3JlPSJ5ZXMiLCBoYXZlX2RvdG5ldGNvcmU9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RPVE5FVENPUkUsIFt0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiXSkKKworCitBWF9USFJJRlRfTElCKGQsIFtEXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfZCIgPSAieWVzIjsgIHRoZW4KKyAgQVhfRE1ECisgIEFDX1NVQlNUKERNRCkKKyAgaWYgdGVzdCAieCRETUQiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfZD0ieWVzIgorICBmaQorZmkKKworIyBEZXRlcm1pbmUgYWN0dWFsIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBEIGxpYnJhcnkgZm9yIHVzZSBpbiB0aGUgY29tbWFuZCBsaW5lCisjIHdoZW4gY29tcGlsaW5nIHRlc3RzLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSAtbDxsaWI+IHN5bnRheCBkb2Vzbid0IHdvcmsKKyMgd2l0aCBPUFRMSU5LIChXaW5kb3dzKS4KK2xpYl9wcmVmaXg9bGliCitsaWJfc3VmZml4PWEKK2Nhc2UgIiRob3N0X29zIiBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbGliX3ByZWZpeD0iIgorICAgIGxpYl9zdWZmaXg9bGliCisgICAgOzsKK2VzYWMKK0RfTElCX05BTUU9IiR7bGliX3ByZWZpeH10aHJpZnRkLiR7bGliX3N1ZmZpeH0iCitBQ19TVUJTVChEX0xJQl9OQU1FKQorRF9FVkVOVF9MSUJfTkFNRT0iJHtsaWJfcHJlZml4fXRocmlmdGQtZXZlbnQuJHtsaWJfc3VmZml4fSIKK0FDX1NVQlNUKERfRVZFTlRfTElCX05BTUUpCitEX1NTTF9MSUJfTkFNRT0iJHtsaWJfcHJlZml4fXRocmlmdGQtc3NsLiR7bGliX3N1ZmZpeH0iCitBQ19TVUJTVChEX1NTTF9MSUJfTkFNRSkKKworaWYgdGVzdCAiJGhhdmVfZCIgPSAieWVzIjsgdGhlbgorICBBWF9DSEVDS19EX01PRFVMRShkZWltb3MuZXZlbnQyLmV2ZW50KQorICBoYXZlX2RlaW1vc19ldmVudDI9JHN1Y2Nlc3MKKworICB3aXRoX2RfZXZlbnRfdGVzdHM9Im5vIgorICBpZiB0ZXN0ICIkaGF2ZV9kZWltb3NfZXZlbnQyIiA9ICJ5ZXMiOyB0aGVuCisgICAgaWYgdGVzdCAieCRETURfTElCRVZFTlRfRkxBR1MiID0gIngiOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkZG1kX29wdGxpbmsiID0gInllcyI7IHRoZW4KKyAgICAgICAgQUNfTVNHX1dBUk4oW0QgbGliZXZlbnQgaW50ZXJmYWNlIGZvdW5kLCBidXQgY2Fubm90IGF1dG8tZGV0ZWN0IFwKK2xpbmtlciBmbGFncyBmb3IgT1BUTElOSy4gUGxlYXNlIHNldCBETURfTElCRVZFTlRfRkxBR1MgbWFudWFsbHkuXSkKKyAgICAgIGVsc2UKKyAgICAgICAgQVhfTElCX0VWRU5UKFsyLjBdKQorICAgICAgICBpZiB0ZXN0ICIkc3VjY2VzcyIgPSAieWVzIjsgdGhlbgorICAgICAgICAgIERNRF9MSUJFVkVOVF9GTEFHUz0kKGVjaG8gIi1mdXNlLWxkPWdvbGQgJExJQkVWRU5UX0xERkxBR1MgJExJQkVWRU5UX0xJQlMiIHwgXAorICAgICAgICAgICAgc2VkIC1lICdzL14gKi8vZztzLyAqJC8vZztzL15cKC5cKS8tTFwxL2c7cy8gICovIC1ML2cnKQorICAgICAgICAgIHdpdGhfZF9ldmVudF90ZXN0cz0ieWVzIgorICAgICAgICBlbHNlCisgICAgICAgICAgQUNfTVNHX1dBUk4oW0QgbGliZXZlbnQgaW50ZXJmYWNlIHByZXNlbnQsIGJ1dCBsaWJldmVudCBsaWJyYXJ5IG5vdCBmb3VuZC5dKQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICB3aXRoX2RfZXZlbnRfdGVzdHM9InllcyIKKyAgICBmaQorICBmaQorCisgIEFYX0NIRUNLX0RfTU9EVUxFKGRlaW1vcy5vcGVuc3NsLnNzbCkKKyAgaGF2ZV9kZWltb3Nfb3BlbnNzbD0kc3VjY2VzcworCisgIHdpdGhfZF9zc2xfdGVzdHM9Im5vIgorICBpZiB0ZXN0ICIkaGF2ZV9kZWltb3Nfb3BlbnNzbCIgPSAieWVzIjsgdGhlbgorICAgIGlmIHRlc3QgIngkRE1EX09QRU5TU0xfRkxBR1MiID0gIngiOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkZG1kX29wdGxpbmsiID0gInllcyI7IHRoZW4KKyAgICAgICAgQUNfTVNHX1dBUk4oW0QgT3BlblNTTCBpbnRlcmZhY2UgZm91bmQsIGJ1dCBjYW5ub3QgYXV0by1kZXRlY3QgXAorbGlua2VyIGZsYWdzIGZvciBPUFRMSU5LLiBQbGVhc2Ugc2V0IERNRF9PUEVOU1NMX0ZMQUdTIG1hbnVhbGx5Ll0pCisgICAgICBlbHNlCisgICAgICAgIEFYX0NIRUNLX09QRU5TU0woW3dpdGhfZF9zc2xfdGVzdHM9InllcyJdKQorICAgICAgICBpZiB0ZXN0ICIkd2l0aF9kX3NzbF90ZXN0cyIgPSAieWVzIjsgdGhlbgorICAgICAgICAgIERNRF9PUEVOU1NMX0ZMQUdTPSQoZWNobyAiLWZ1c2UtbGQ9Z29sZCAkT1BFTlNTTF9MREZMQUdTICRPUEVOU1NMX0xJQlMiIHwgXAorICAgICAgICAgICAgc2VkIC1lICdzL14gKi8vZztzLyAqJC8vZztzL15cKC5cKS8tTFwxL2c7cy8gICovIC1ML2cnKQorICAgICAgICBlbHNlCisgICAgICAgICAgQUNfTVNHX1dBUk4oW0QgT3BlblNTTCBpbnRlcmZhY2UgcHJlc2VudCwgYnV0IE9wZW5TU0wgbGlicmFyeSBub3QgZm91bmQuXSkKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgd2l0aF9kX3NzbF90ZXN0cz0ieWVzIgorICAgIGZpCisgIGZpCitmaQorCitBTV9DT05ESVRJT05BTChXSVRIX0QsIFt0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKERNRF9PUFRMSU5LLCBbdGVzdCAiJGRtZF9vcHRsaW5rIiA9ICJ5ZXMiXSkKK0FDX1NVQlNUKERNRF9PRl9ESVJTRVAsICIkZG1kX29mX2RpcnNlcCIpCitBTV9DT05ESVRJT05BTChIQVZFX0RFSU1PU19FVkVOVDIsIFt0ZXN0ICIkaGF2ZV9kZWltb3NfZXZlbnQyIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFdJVEhfRF9FVkVOVF9URVNUUywgW3Rlc3QgIiR3aXRoX2RfZXZlbnRfdGVzdHMiID0gInllcyJdKQorQUNfU1VCU1QoRE1EX0xJQkVWRU5UX0ZMQUdTKQorQU1fQ09ORElUSU9OQUwoSEFWRV9ERUlNT1NfT1BFTlNTTCwgW3Rlc3QgIiRoYXZlX2RlaW1vc19vcGVuc3NsIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFdJVEhfRF9TU0xfVEVTVFMsIFt0ZXN0ICIkd2l0aF9kX3NzbF90ZXN0cyIgPSAieWVzIl0pCitBQ19TVUJTVChETURfT1BFTlNTTF9GTEFHUykKKworQUNfQVJHX0VOQUJMRShbdGVzdHNdLAorICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtdGVzdHNdLCBbYnVpbGQgdGVzdHMgW2RlZmF1bHQ9eWVzXV0pLAorICBbXSwgZW5hYmxlX3Rlc3RzPXllcworKQoraGF2ZV90ZXN0cz15ZXMKK2lmIHRlc3QgIiRlbmFibGVfdGVzdHMiID0gIm5vIjsgdGhlbgorICBoYXZlX3Rlc3RzPSJubyIKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX1RFU1RTLCBbdGVzdCAiJGhhdmVfdGVzdHMiID0gInllcyJdKQorCitBQ19BUkdfRU5BQkxFKFtwbHVnaW5dLAorICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtcGx1Z2luXSwgW2J1aWxkIGNvbXBpbGVyIHBsdWdpbiBzdXBwb3J0IFtkZWZhdWx0PW5vXV0pLAorICBbXSwgZW5hYmxlX3BsdWdpbj1ubworKQoraGF2ZV9wbHVnaW49eWVzCitpZiB0ZXN0ICIkaGF2ZV9jcHAiID0gIm5vIiA7IHRoZW4KKyAgaGF2ZV9wbHVnaW49Im5vIgorZmkKK2lmIHRlc3QgIiRlbmFibGVfcGx1Z2luIiA9ICJubyI7IHRoZW4KKyAgaGF2ZV9wbHVnaW49Im5vIgorZmkKK0FDX0NPTkZJR19MSU5LUyhbY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL3RfY3BwX2dlbmVyYXRvci5jYzpjb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2NdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9QTFVHSU4sIFt0ZXN0ICIkaGF2ZV9wbHVnaW4iID0gInllcyJdKQorCitBQ19BUkdfRU5BQkxFKFt0dXRvcmlhbF0sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS10dXRvcmlhbF0sIFtidWlsZCB0dXRvcmlhbCBbZGVmYXVsdD15ZXNdXSksCisgIFtdLCBlbmFibGVfdHV0b3JpYWw9eWVzCispCitoYXZlX3R1dG9yaWFsPXllcworaWYgdGVzdCAiJGVuYWJsZV90dXRvcmlhbCIgPSAibm8iOyB0aGVuCisgIGhhdmVfdHV0b3JpYWw9Im5vIgorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfVFVUT1JJQUwsIFt0ZXN0ICIkaGF2ZV90dXRvcmlhbCIgPSAieWVzIl0pCisKK0FNX0NPTkRJVElPTkFMKE1JTkdXLCBmYWxzZSkKK2Nhc2UgIiR7aG9zdF9vc30iIGluCisqbWluZ3cqKQorICBtaW5ndzMyX3N1cHBvcnQ9InllcyIKKyAgQUNfQ0hFQ0tfSEVBREVSKHdpbmRvd3MuaCkKKyAgQU1fQ09ORElUSU9OQUwoTUlOR1csIHRydWUpCisgIDs7CisqKQorICBBQ19JU0NfUE9TSVgKKyAgOzsKK2VzYWMKIAogQUNfQ19DT05TVAogQUNfQ19JTkxJTkUKQEAgLTEzMywyMSArNjQ5LDM0IEBACiBBQ19IRUFERVJfU1REQk9PTAogQUNfSEVBREVSX1NUREMKIEFDX0hFQURFUl9USU1FCitBQ19IRUFERVJfU1lTX1dBSVQKK0FDX1RZUEVfU0lHTkFMCiBBQ19DSEVDS19IRUFERVJTKFthcnBhL2luZXQuaF0pCi1BQ19DSEVDS19IRUFERVJTKFtlbmRpYW4uaF0pCitBQ19DSEVDS19IRUFERVJTKFtzeXMvcGFyYW0uaF0pCiBBQ19DSEVDS19IRUFERVJTKFtmY250bC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW2ludHR5cGVzLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbbGltaXRzLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbbmV0ZGIuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtuZXRpbmV0L2luLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbcHRocmVhZC5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3NpZ25hbC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N0ZGRlZi5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N0ZGxpYi5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy9pb2N0bC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy9zb2NrZXQuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzeXMvdGltZS5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy91bi5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3BvbGwuaF0pCitBQ19DSEVDS19IRUFERVJTKFtzeXMvcG9sbC5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy9yZXNvdXJjZS5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3VuaXN0ZC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW2xpYmludGwuaF0pCiBBQ19DSEVDS19IRUFERVJTKFttYWxsb2MuaF0pCitBQ19DSEVDS19IRUFERVJTKFtvcGVuc3NsL3NzbC5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW29wZW5zc2wvcmFuZC5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW29wZW5zc2wveDUwOXYzLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc2NoZWQuaF0pCitBQ19DSEVDS19IRUFERVJTKFt3Y2hhci5oXSkKIAogQUNfQ0hFQ0tfTElCKHB0aHJlYWQsIHB0aHJlYWRfY3JlYXRlKQogZG5sIE5PVEUoZHJlaXNzKTogSSBoYXZlbid0IGJlZW4gYWJsZSB0byBmaW5kIGFueSByZWFsbHkgc29saWQgZG9jcwpAQCAtMTcwLDcgKzY5OSw3IEBACiBBQ19UWVBFX1VJTlQzMl9UCiBBQ19UWVBFX1VJTlQ2NF9UCiBBQ19UWVBFX1VJTlQ4X1QKLUFDX0NIRUNLX1RZUEVTKFtwdHJkaWZmX3RdLCBbXSwgW2V4aXQgMV0pCitBQ19DSEVDS19UWVBFUyhbcHRyZGlmZl90XSwgW10sIFtlY2hvICJwdHJkaWZmX3Qgbm90IGZvdW5kIG9yIGcrKyBub3QgaW5zdGFsbGVkIC0gY2Fubm90IGNvbnRpbnVlIiAmJiBleGl0IDFdKQogCiBBQ19TVFJVQ1RfVE0KIApAQCAtMTg1LDYgKzcxNCw3IEBACiBdKQogCiBBQ19GVU5DX0FMTE9DQQorQUNfRlVOQ19GT1JLCiBBQ19GVU5DX01BTExPQwogQUNfRlVOQ19NRU1DTVAKIEFDX0ZVTkNfUkVBTExPQwpAQCAtMTk3LDEyICs3MjcsMTQgQEAKIEFDX0NIRUNLX0ZVTkNTKFtiemVyb10pCiBBQ19DSEVDS19GVU5DUyhbZnRydW5jYXRlXSkKIEFDX0NIRUNLX0ZVTkNTKFtnZXRob3N0YnluYW1lXSkKK0FDX0NIRUNLX0ZVTkNTKFtnZXRob3N0YnluYW1lX3JdKQogQUNfQ0hFQ0tfRlVOQ1MoW2dldHRpbWVvZmRheV0pCiBBQ19DSEVDS19GVU5DUyhbbWVtbW92ZV0pCiBBQ19DSEVDS19GVU5DUyhbbWVtc2V0XSkKIEFDX0NIRUNLX0ZVTkNTKFtta2Rpcl0pCiBBQ19DSEVDS19GVU5DUyhbcmVhbHBhdGhdKQogQUNfQ0hFQ0tfRlVOQ1MoW3NlbGVjdF0pCitBQ19DSEVDS19GVU5DUyhbc2V0bG9jYWxlXSkKIEFDX0NIRUNLX0ZVTkNTKFtzb2NrZXRdKQogQUNfQ0hFQ0tfRlVOQ1MoW3N0cmNocl0pCiBBQ19DSEVDS19GVU5DUyhbc3RyZHVwXSkKQEAgLTIxMSw2NyArNzQzLDM1OCBAQAogQUNfQ0hFQ0tfRlVOQ1MoW3N0cnRvbF0pCiBBQ19DSEVDS19GVU5DUyhbc3FydF0pCiBkbmwgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG9wdGlvbmFsLgorQUNfQ0hFQ0tfRlVOQ1MoW2FsYXJtXSkKIEFDX0NIRUNLX0ZVTkNTKFtjbG9ja19nZXR0aW1lXSkKIEFDX0NIRUNLX0ZVTkNTKFtzY2hlZF9nZXRfcHJpb3JpdHlfbWluXSkKIEFDX0NIRUNLX0ZVTkNTKFtzY2hlZF9nZXRfcHJpb3JpdHlfbWF4XSkKK0FDX0NIRUNLX0ZVTkNTKFtpbmV0X250b2FdKQorQUNfQ0hFQ0tfRlVOQ1MoW3Bvd10pCiAKLUFYX1NJR05FRF9SSUdIVF9TSElGVAoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSAibm8iIDsgdGhlbgorICBBWF9TSUdORURfUklHSFRfU0hJRlQKK2ZpCiAKLUFYX1RIUklGVF9HRU4oY3BwLCBbQysrXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fY3BwXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2NwcCIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGphdmEsIFtKYXZhXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5famF2YV0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9qYXZhIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oYXMzLCBbQVMzXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fYXMzXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2FzMyIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGNzaGFycCwgW0MjXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fY3NoYXJwXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2NzaGFycCIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHB5LCBbUHl0aG9uXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fcHldLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fcHkiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihyYiwgW1J1YnldLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9yYl0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9yYiIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKHBlcmwsIFtQZXJsXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fcGVybF0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9wZXJsIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4ocGhwLCBbUEhQXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fcGhwXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX3BocCIgPSAieWVzIl0pCi1BWF9USFJJRlRfR0VOKGVybCwgW0VybGFuZ10sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX2VybF0sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9lcmwiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihjb2NvYSwgW0NvY29hXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5fY29jb2FdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5fY29jb2EiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihzdCwgW1NtYWxsdGFsa10sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX3N0XSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX3N0IiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4ob2NhbWwsIFtPQ2FtbF0sIHllcykKLUFNX0NPTkRJVElPTkFMKFtUSFJJRlRfR0VOX29jYW1sXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX29jYW1sIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oaHMsIFtIYXNrZWxsXSwgeWVzKQotQU1fQ09ORElUSU9OQUwoW1RIUklGVF9HRU5faHNdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5faHMiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTih4c2QsIFtYU0RdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl94c2RdLCBbdGVzdCAiJGF4X3RocmlmdF9nZW5feHNkIiA9ICJ5ZXMiXSkKLUFYX1RIUklGVF9HRU4oaHRtbCwgW0hUTUxdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9odG1sXSwgW3Rlc3QgIiRheF90aHJpZnRfZ2VuX2h0bWwiID0gInllcyJdKQotQVhfVEhSSUZUX0dFTihqcywgW0phdmFTY3JpcHRdLCB5ZXMpCi1BTV9DT05ESVRJT05BTChbVEhSSUZUX0dFTl9qc10sIFt0ZXN0ICIkYXhfdGhyaWZ0X2dlbl9qcyIgPSAieWVzIl0pCitkbmwgYXV0b3NjYW4gdGhpbmtzIHdlIG5lZWQgdGhpcyBtYWNybyBiZWNhdXNlIHdlIGhhdmUgYSBtZW1iZXIgZnVuY3Rpb24KK2RubCBjYWxsZWQgImVycm9yIi4gIEludm9rZSB0aGUgbWFjcm8gYnV0IGRvbid0IHJ1biB0aGUgY2hlY2sgc28gYXV0b3NjYW4KK2RubCB0aGlua3Mgd2UgYXJlIGluIHRoZSBjbGVhci4gIEl0J3MgaGlnaGx5IHVubGlrZWx5IHRoYXQgd2Ugd2lsbCBldmVyCitkbmwgYWN0dWFsbHkgdXNlIHRoZSBmdW5jdGlvbiB0aGF0IHRoaXMgY2hlY2tzIGZvci4KK2lmIGZhbHNlIDsgdGhlbgorICBBQ19GVU5DX0VSUk9SX0FUX0xJTkUKK2ZpCisKKyMgLS0tIENvdmVyYWdlIGhvb2tzIC0tLQorCitBQ19BUkdfRU5BQkxFKGNvdmVyYWdlLAorICAgICAgICAgICAgICBbICAtLWVuYWJsZS1jb3ZlcmFnZSAgICAgIHR1cm4gb24gLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlXSwKKyAgICAgICAgICAgICAgW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgICAgICAgICAgICAgICB5ZXMpIEVOQUJMRV9DT1ZFUkFHRT0xIDs7CisgICAgICAgICAgICAgICAgbm8pIEVOQUJMRV9DT1ZFUkFHRT0wIDs7CisgICAgICAgICAgICAgICAgKikgQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWNvdikgOzsKKyAgICAgICAgICAgICAgZXNhY10sCisgICAgICAgICAgICAgIFtFTkFCTEVfQ09WRVJBR0U9Ml0pCisKK2lmIHRlc3QgInhbJF1FTkFCTEVfQ09WRVJBR0UiID0gIngxIjsgdGhlbgorICBBQ19NU0dfV0FSTihlbmFibGUgY292ZXJhZ2UpCisgIEdDT1ZfQ0ZMQUdTPSJgZWNobyBcIlskXUNGTEFHU1wiIHwgcGVybCAtcGUgJ3MvLU9cZCsvL2c7J2AgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIgorICBHQ09WX0NYWEZMQUdTPSJgZWNobyBcIlskXUNYWEZMQUdTXCIgfCBwZXJsIC1wZSAncy8tT1xkKy8vZzsnYCAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UiCisgIEdDT1ZfTERGTEFHUz0iLVhDQ2xpbmtlciAtZnByb2ZpbGUtYXJjcyAtWENDbGlua2VyIC1mdGVzdC1jb3ZlcmFnZSIKK2ZpCisKK0FDX1NVQlNUKEVOQUJMRV9DT1ZFUkFHRSkKK0FDX1NVQlNUKEdDT1ZfQ0ZMQUdTKQorQUNfU1VCU1QoR0NPVl9DWFhGTEFHUykKK0FDX1NVQlNUKEdDT1ZfTERGTEFHUykKIAogQUNfQ09ORklHX0hFQURFUlMoY29uZmlnLmg6Y29uZmlnLmhpbikKK0FDX0NPTkZJR19IRUFERVJTKGxpYi9jcHAvc3JjL3RocmlmdC9jb25maWcuaDpjb25maWcuaGluKQorQUNfQ09ORklHX0hFQURFUlMobGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NvbmZpZy5oOmNvbmZpZy5oaW4pCisjIGdydWFyZCBhZ2FpbnN0IHByZSBkZWZpbmVkIGNvbmZpZy5oCitBSF9UT1AoWworI2lmbmRlZiBDT05GSUdfSAorI2RlZmluZSBDT05GSUdfSAorXSkKK0FIX0JPVFRPTShbCisjZW5kaWYKK10pCisKIAogQUNfQ09ORklHX0ZJTEVTKFsKICAgTWFrZWZpbGUKICAgY29tcGlsZXIvY3BwL01ha2VmaWxlCi0gIGNvbXBpbGVyL2NwcC92ZXJzaW9uLmgKKyAgY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZQorICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUKKyAgY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUKKyAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oCiAgIGxpYi9NYWtlZmlsZQorICBsaWIvY2wvTWFrZWZpbGUKICAgbGliL2NwcC9NYWtlZmlsZQotICBsaWIvY3BwL3RocmlmdC5wYworICBsaWIvY3BwL3Rlc3QvTWFrZWZpbGUKICAgbGliL2NwcC90aHJpZnQtbmIucGMKICAgbGliL2NwcC90aHJpZnQtei5wYworICBsaWIvY3BwL3RocmlmdC1xdC5wYworICBsaWIvY3BwL3RocmlmdC1xdDUucGMKKyAgbGliL2NwcC90aHJpZnQucGMKKyAgbGliL2NfZ2xpYi9NYWtlZmlsZQorICBsaWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMKKyAgbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlCiAgIGxpYi9jc2hhcnAvTWFrZWZpbGUKKyAgbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZQorICBsaWIvZC9NYWtlZmlsZQorICBsaWIvZC90ZXN0L01ha2VmaWxlCiAgIGxpYi9lcmwvTWFrZWZpbGUKKyAgbGliL2dvL01ha2VmaWxlCisgIGxpYi9nby90ZXN0L01ha2VmaWxlCisgIGxpYi9oYXhlL3Rlc3QvTWFrZWZpbGUKKyAgbGliL2hzL01ha2VmaWxlCiAgIGxpYi9qYXZhL01ha2VmaWxlCisgIGxpYi9qcy9NYWtlZmlsZQorICBsaWIvanMvdGVzdC9NYWtlZmlsZQorICBsaWIvanNvbi9NYWtlZmlsZQorICBsaWIvanNvbi90ZXN0L01ha2VmaWxlCisgIGxpYi9uZXRjb3JlL01ha2VmaWxlCisgIGxpYi9ub2RlanMvTWFrZWZpbGUKKyAgbGliL25vZGV0cy9NYWtlZmlsZQogICBsaWIvcGVybC9NYWtlZmlsZQogICBsaWIvcGVybC90ZXN0L01ha2VmaWxlCiAgIGxpYi9waHAvTWFrZWZpbGUKKyAgbGliL3BocC90ZXN0L01ha2VmaWxlCisgIGxpYi9kYXJ0L01ha2VmaWxlCiAgIGxpYi9weS9NYWtlZmlsZQogICBsaWIvcmIvTWFrZWZpbGUKKyAgbGliL3JzL01ha2VmaWxlCisgIGxpYi9ycy90ZXN0L01ha2VmaWxlCisgIGxpYi9sdWEvTWFrZWZpbGUKKyAgbGliL3N3aWZ0L01ha2VmaWxlCisgIGxpYi94bWwvTWFrZWZpbGUKKyAgbGliL3htbC90ZXN0L01ha2VmaWxlCiAgIHRlc3QvTWFrZWZpbGUKKyAgdGVzdC9mZWF0dXJlcy9NYWtlZmlsZQorICB0ZXN0L2NfZ2xpYi9NYWtlZmlsZQorICB0ZXN0L2NsL01ha2VmaWxlCisgIHRlc3QvY3BwL01ha2VmaWxlCisgIHRlc3QvY3NoYXJwL01ha2VmaWxlCisgIHRlc3QvZXJsL01ha2VmaWxlCisgIHRlc3QvZ28vTWFrZWZpbGUKKyAgdGVzdC9oYXhlL01ha2VmaWxlCisgIHRlc3QvaHMvTWFrZWZpbGUKKyAgdGVzdC9sdWEvTWFrZWZpbGUKKyAgdGVzdC9uZXRjb3JlL01ha2VmaWxlCisgIHRlc3QvcGhwL01ha2VmaWxlCisgIHRlc3QvZGFydC9NYWtlZmlsZQorICB0ZXN0L3BlcmwvTWFrZWZpbGUKICAgdGVzdC9weS9NYWtlZmlsZQorICB0ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUKKyAgdGVzdC9weS50b3JuYWRvL01ha2VmaWxlCiAgIHRlc3QvcmIvTWFrZWZpbGUKKyAgdGVzdC9ycy9NYWtlZmlsZQorICB0dXRvcmlhbC9NYWtlZmlsZQorICB0dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUKKyAgdHV0b3JpYWwvY2wvTWFrZWZpbGUKKyAgdHV0b3JpYWwvY3BwL01ha2VmaWxlCisgIHR1dG9yaWFsL2QvTWFrZWZpbGUKKyAgdHV0b3JpYWwvZ28vTWFrZWZpbGUKKyAgdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZQorICB0dXRvcmlhbC9ocy9NYWtlZmlsZQorICB0dXRvcmlhbC9qYXZhL01ha2VmaWxlCisgIHR1dG9yaWFsL2pzL01ha2VmaWxlCisgIHR1dG9yaWFsL25ldGNvcmUvTWFrZWZpbGUKKyAgdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlCisgIHR1dG9yaWFsL2RhcnQvTWFrZWZpbGUKKyAgdHV0b3JpYWwvcHkvTWFrZWZpbGUKKyAgdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZQorICB0dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlCisgIHR1dG9yaWFsL3JiL01ha2VmaWxlCisgIHR1dG9yaWFsL3JzL01ha2VmaWxlCiBdKQogCitpZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuIE1BWUJFX0NQUD0iY3BwIiA7IGVsc2UgTUFZQkVfQ1BQPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DUFBdKQoraWYgdGVzdCAiJGhhdmVfY19nbGliIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DX0dMSUI9ImNfZ2xpYiIgOyBlbHNlIE1BWUJFX0NfR0xJQj0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfQ19HTElCXSkKK2lmIHRlc3QgIiRoYXZlX2QiID0gInllcyIgLWEgIiRoYXZlX2RlaW1vc19ldmVudDIiID0gInllcyIgLWEgIiRoYXZlX2RlaW1vc19vcGVuc3NsIiA9ICJ5ZXMiOyB0aGVuIE1BWUJFX0Q9ImQiIDsgZWxzZSBNQVlCRV9EPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9EXSkKK2lmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuIE1BWUJFX0pBVkE9ImphdmEiIDsgZWxzZSBNQVlCRV9KQVZBPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9KQVZBXSkKK2lmIHRlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ1NIQVJQPSJjc2hhcnAiIDsgZWxzZSBNQVlCRV9DU0hBUlA9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0NTSEFSUF0pCitpZiB0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyIgOyB0aGVuIE1BWUJFX1BZVEhPTj0icHkiIDsgZWxzZSBNQVlCRV9QWVRIT049IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1BZVEhPTl0pCitpZiB0ZXN0ICIkaGF2ZV9weTMiID0gInllcyIgOyB0aGVuIE1BWUJFX1BZMz0icHkzIiA7IGVsc2UgTUFZQkVfUFkzPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9QWTNdKQoraWYgdGVzdCAiJGhhdmVfcnVieSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUlVCWT0icmIiIDsgZWxzZSBNQVlCRV9SVUJZPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9SVUJZXSkKK2lmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuIE1BWUJFX0hBU0tFTEw9ImhzIiA7IGVsc2UgTUFZQkVfSEFTS0VMTD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfSEFTS0VMTF0pCitpZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QRVJMPSJwZXJsIiA7IGVsc2UgTUFZQkVfUEVSTD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUEVSTF0pCitpZiB0ZXN0ICIkaGF2ZV9waHAiID0gInllcyIgOyB0aGVuIE1BWUJFX1BIUD0icGhwIiA7IGVsc2UgTUFZQkVfUEhQPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9QSFBdKQoraWYgdGVzdCAiJGhhdmVfZGFydCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfREFSVD0iZGFydCIgOyBlbHNlIE1BWUJFX0RBUlQ9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0RBUlRdKQoraWYgdGVzdCAiJGhhdmVfZ28iID0gInllcyIgOyB0aGVuIE1BWUJFX0dPPSJnbyIgOyBlbHNlIE1BWUJFX0dPPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9HT10pCitpZiB0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyIgOyB0aGVuIE1BWUJFX05PREVKUz0ibm9kZWpzIiA7IGVsc2UgTUFZQkVfTk9ERUpTPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9OT0RFSlNdKQoraWYgdGVzdCAiJGhhdmVfbm9kZXRzIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9OT0RFVFM9Im5vZGV0cyIgOyBlbHNlIE1BWUJFX05PREVUUz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfTk9ERVRTXSkKK2lmIHRlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfRVJMQU5HPSJlcmwiIDsgZWxzZSBNQVlCRV9FUkxBTkc9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0VSTEFOR10pCitpZiB0ZXN0ICIkaGF2ZV9sdWEiID0gInllcyIgOyB0aGVuIE1BWUJFX0xVQT0ibHVhIiA7IGVsc2UgTUFZQkVfTFVBPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9MVUFdKQoraWYgdGVzdCAiJGhhdmVfcnMiID0gInllcyIgOyB0aGVuIE1BWUJFX1JTPSJycyIgOyBlbHNlIE1BWUJFX1JTPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9SU10pCitpZiB0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfU1dJRlQ9InN3aWZ0IiA7IGVsc2UgTUFZQkVfU1dJRlQ9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1NXSUZUXSkKK2lmIHRlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyIgOyB0aGVuIE1BWUJFX0RPVE5FVENPUkU9Im5ldGNvcmUiIDsgZWxzZSBNQVlCRV9ET1RORVRDT1JFPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9ET1RORVRDT1JFXSkKK2lmIHRlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DTD0iY2wiIDsgZWxzZSBNQVlCRV9DTD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfQ0xdKQorCiBBQ19PVVRQVVQKKworCitlY2hvCitlY2hvICIkUEFDS0FHRSAkVkVSU0lPTiIKK2VjaG8KK2VjaG8gIkJ1aWxkaW5nIEMgKEdMaWIpIExpYnJhcnkgLi4uLiA6ICRoYXZlX2NfZ2xpYiIKK2VjaG8gIkJ1aWxkaW5nIEMjIChNb25vKSBMaWJyYXJ5IC4uLiA6ICRoYXZlX2NzaGFycCIKK2VjaG8gIkJ1aWxkaW5nIEMrKyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2NwcCIKK2VjaG8gIkJ1aWxkaW5nIENvbW1vbiBMaXNwIExpYnJhcnkuLiA6ICRoYXZlX2NsIgorZWNobyAiQnVpbGRpbmcgRCBMaWJyYXJ5IC4uLi4uLi4uLi4uIDogJGhhdmVfZCIKK2VjaG8gIkJ1aWxkaW5nIERhcnQgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2RhcnQiCitlY2hvICJCdWlsZGluZyBkb3RuZXRjb3JlIExpYnJhcnkgLi4gOiAkaGF2ZV9kb3RuZXRjb3JlIgorZWNobyAiQnVpbGRpbmcgRXJsYW5nIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfZXJsYW5nIgorZWNobyAiQnVpbGRpbmcgR28gTGlicmFyeSAuLi4uLi4uLi4uIDogJGhhdmVfZ28iCitlY2hvICJCdWlsZGluZyBIYXNrZWxsIExpYnJhcnkgLi4uLi4gOiAkaGF2ZV9oYXNrZWxsIgorZWNobyAiQnVpbGRpbmcgSGF4ZSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfaGF4ZSIKK2VjaG8gIkJ1aWxkaW5nIEphdmEgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2phdmEiCitlY2hvICJCdWlsZGluZyBMdWEgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9sdWEiCitlY2hvICJCdWlsZGluZyBOb2RlSlMgTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9ub2RlanMiCitlY2hvICJCdWlsZGluZyBQZXJsIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9wZXJsIgorZWNobyAiQnVpbGRpbmcgUEhQIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfcGhwIgorZWNobyAiQnVpbGRpbmcgUGx1Z2luIFN1cHBvcnQgLi4uLi4uIDogJGhhdmVfcGx1Z2luIgorZWNobyAiQnVpbGRpbmcgUHl0aG9uIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfcHl0aG9uIgorZWNobyAiQnVpbGRpbmcgUHkzIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfcHkzIgorZWNobyAiQnVpbGRpbmcgUnVieSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcnVieSIKK2VjaG8gIkJ1aWxkaW5nIFJ1c3QgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3JzIgorZWNobyAiQnVpbGRpbmcgU3dpZnQgTGlicmFyeSAuLi4uLi4uIDogJGhhdmVfc3dpZnQiCisKK2lmIHRlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJDIyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgLk5FVCAzLjUgLi4uLi4uLi4uLi4uIDogJG5ldF8zXzUiCisgIGVjaG8gIiAgIFVzaW5nIG1vbm8gdmVyc2lvbiAuLi4uLi4uLiA6ICQoJE1DUyAtLXZlcnNpb24gfCBoZWFkIC0xKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiQysrIExpYnJhcnk6IgorICBlY2hvICIgICBDKysgY29tcGlsZXIgLi4uLi4uLi4uLi4uLi4gOiAkQ1hYIgorICBlY2hvICIgICBCdWlsZCBUWmxpYlRyYW5zcG9ydCAuLi4uLi4gOiAkaGF2ZV96bGliIgorICBlY2hvICIgICBCdWlsZCBUTm9uYmxvY2tpbmdTZXJ2ZXIgLi4gOiAkaGF2ZV9saWJldmVudCIKKyAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NCkgLi4uIDogJGhhdmVfcXQiCisgIGVjaG8gIiAgIEJ1aWxkIFRRVGNwU2VydmVyIChRdDUpIC4uLiA6ICRoYXZlX3F0NSIKKyAgZWNobyAiICAgQysrIGNvbXBpbGVyIHZlcnNpb24gLi4uLi4uIDogJCgkQ1hYIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkNvbW1vbiBMaXNwIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDb21tb24gTGlzcCAuLi4uLi4uLi4gOiAkU0JDTCIKKyAgZWNobyAiICAgVXNpbmcgQ29tbW9uIExpc3AgdmVyc2lvbiAuIDogJCgkU0JDTCAtLXZlcnNpb24pIgorZmkKK2lmIHRlc3QgIiRoYXZlX2QiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiRCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgRCBDb21waWxlciAuLi4uLi4uLi4uIDogJERNRCIKKyAgZWNobyAiICAgQnVpbGRpbmcgRCBsaWJldmVudCB0ZXN0cyAuIDogJHdpdGhfZF9ldmVudF90ZXN0cyIKKyAgZWNobyAiICAgQnVpbGRpbmcgRCBTU0wgdGVzdHMgLi4uLi4uIDogJHdpdGhfZF9zc2xfdGVzdHMiCisgIGVjaG8gIiAgIFVzaW5nIEQgdmVyc2lvbiAuLi4uLi4uLi4uLiA6ICQoJERNRCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkRhcnQgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIERhcnQgLi4uLi4uLi4uLi4uLi4uLiA6ICREQVJUIgorICBlY2hvICIgICBVc2luZyBQdWIgLi4uLi4uLi4uLi4uLi4uLi4gOiAkREFSVFBVQiIKKyAgZWNobyAiICAgVXNpbmcgRGFydCB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkREFSVCAtLXZlcnNpb24gMj4mMSkiCitmaQoraWYgdGVzdCAiJGhhdmVfZG90bmV0Y29yZSIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICIuTkVUIENvcmUgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIC5ORVQgQ29yZSAuLi4uLi4uLi4uLiA6ICRET1RORVRDT1JFIgorICBlY2hvICIgICBVc2luZyAuTkVUIENvcmUgdmVyc2lvbiAuLi4gOiAkRE9UTkVUQ09SRV9WRVJTSU9OIgorZmkKK2lmIHRlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJFcmxhbmcgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIGVybGMgLi4uLi4uLi4uLi4uLi4uLiA6ICRFUkxDIgorICBlY2hvICIgICBVc2luZyByZWJhciAuLi4uLi4uLi4uLi4uLi4gOiAkUkVCQVIiCisgIGVjaG8gIiAgIFVzaW5nIGVybGMgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJEVSTCAtZXZhbCAnZXJsYW5nOmRpc3BsYXkoZXJsYW5nOnN5c3RlbV9pbmZvKG90cF9yZWxlYXNlKSksIGhhbHQoKS4nIC1ub3NoZWxsIHwgdHIgLWQgJ1wiJykiCitmaQoraWYgdGVzdCAiJGhhdmVfZ28iID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiR28gTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEdvLi4uLi4uLi4uLi4uLi4uLi4uLiA6ICRHTyIKKyAgZWNobyAiICAgVXNpbmcgR28gdmVyc2lvbi4uLi4uLi4uLi4uIDogJCgkR08gdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfaGFza2VsbCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJIYXNrZWxsIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDYWJhbCAuLi4uLi4uLi4uLi4uLi4gOiAkQ0FCQUwiCisgIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgLi4uLi4uLi4uLi4uLiA6ICRSVU5IQVNLRUxMIgorICBlY2hvICIgICBVc2luZyBIYXNrZWxsIHZlcnNpb24gLi4uLi4gOiAkKCRSVU5IQVNLRUxMIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfaGF4ZSIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJIYXhlIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBIYXhlIC4uLi4uLi4uLi4uLi4uLi4gOiAkSEFYRSIKKyAgZWNobyAiICAgVXNpbmcgSGF4ZSB2ZXJzaW9uIC4uLi4uLi4uIDogJEhBWEVfVkVSU0lPTiIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9qYXZhIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkphdmEgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIGdyYWRsZXcgLi4uLi4uLi4uLi4uLiA6IGxpYi9qYXZhL2dyYWRsZXciCisgIGVjaG8gIiAgIFVzaW5nIGphdmEgLi4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBIgorICBlY2hvICIgICBVc2luZyBqYXZhYyAuLi4uLi4uLi4uLi4uLi4gOiAkSkFWQUMiCisgIGVjaG8gIiAgIFVzaW5nIEdyYWRsZSB2ZXJzaW9uIC4uLi4uLiA6ICQobGliL2phdmEvZ3JhZGxldyAtLXZlcnNpb24gLS1xdWlldCB8IGdyZXAgR3JhZGxlIDI+JjEpIgorICBlY2hvICIgICBVc2luZyBqYXZhIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRKQVZBIC12ZXJzaW9uIDI+JjEgfCBncmVwICd2ZXJzaW9uICcpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2x1YSIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJMdWEgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEx1YSAuLi4uLi4uLi4uLi4uLi4uLiA6ICRMVUEiCisgIGVjaG8gIiAgIFVzaW5nIEx1YSB2ZXJzaW9uLi4uLi4uLi4uLiA6ICQoJExVQSAtdikiCitmaQoraWYgdGVzdCAiJGhhdmVfbm9kZWpzIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIk5vZGVKUyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgTm9kZUpTIC4uLi4uLi4uLi4uLi4uIDogJE5PREVKUyIKKyAgZWNobyAiICAgVXNpbmcgTm9kZUpTIHZlcnNpb24uLi4uLi4uIDogJCgkTk9ERUpTIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfcGVybCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJQZXJsIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBQZXJsIC4uLi4uLi4uLi4uLi4uLi4gOiAkUEVSTCIKKyAgZWNobyAiICAgVXNpbmcgUGVybCB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkUEVSTCAtdiB8IGdyZXAgJ3ZlcnNpb24gJykiCitmaQoraWYgdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlBIUCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgcGhwLWNvbmZpZyAuLi4uLi4uLi4uIDogJFBIUF9DT05GSUciCisgIGVjaG8gIiAgIFVzaW5nIHBocCB2ZXJzaW9uIC4uLi4uLi4uLiA6ICQoJFBIUCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUHl0aG9uIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBQeXRob24gLi4uLi4uLi4uLi4uLi4gOiAkUFlUSE9OIgorICBlY2hvICIgICBVc2luZyBQeXRob24gdmVyc2lvbiAuLi4uLi4gOiAkKCRQWVRIT04gLS12ZXJzaW9uIDI+JjEpIgorICBpZiB0ZXN0ICIkaGF2ZV9weTMiID0gInllcyIgOyB0aGVuCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbjMgLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04zIgorICBlY2hvICIgICBVc2luZyBQeXRob24zIHZlcnNpb24gLi4uLi4gOiAkKCRQWVRIT04zIC0tdmVyc2lvbikiCisgIGZpCisgIGlmIHRlc3QgIiRoYXZlX3RyaWFsIiA9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gIiAgIFVzaW5nIHRyaWFsIC4uLi4uLi4uLi4uLi4uLiA6ICRUUklBTCIKKyAgZmkKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ydWJ5IiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlJ1YnkgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFJ1YnkgLi4uLi4uLi4uLi4uLi4uLiA6ICRSVUJZIgorICBlY2hvICIgICBVc2luZyBSdWJ5IHZlcnNpb24gLi4uLi4uLi4gOiAkKCRSVUJZIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfcnMiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUnVzdCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgQ2FyZ28uLi4uLi4uLi4uLi4uLi4uIDogJENBUkdPIgorICBlY2hvICIgICBVc2luZyBydXN0Yy4uLi4uLi4uLi4uLi4uLi4gOiAkUlVTVEMiCisgIGVjaG8gIiAgIFVzaW5nIFJ1c3QgdmVyc2lvbi4uLi4uLi4uLiA6ICQoJFJVU1RDIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfc3dpZnQiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiU3dpZnQgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFN3aWZ0IC4uLi4uLi4uLi4uLi4uLiA6ICRTV0lGVCIKKyAgZWNobyAiICAgVXNpbmcgU3dpZnQgdmVyc2lvbiAuLi4uLi4uIDogJCgkU1dJRlQgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCitmaQorZWNobworZWNobyAiSWYgc29tZXRoaW5nIGlzIG1pc3NpbmcgdGhhdCB5b3UgdGhpbmsgc2hvdWxkIGJlIHByZXNlbnQsIgorZWNobyAicGxlYXNlIHNraW0gdGhlIG91dHB1dCBvZiBjb25maWd1cmUgdG8gZmluZCB0aGUgbWlzc2luZyIKK2VjaG8gImNvbXBvbmVudC4gIERldGFpbHMgYXJlIHByZXNlbnQgaW4gY29uZmlnLmxvZy4iCitlY2hvCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL0FwcC5jb25maWcgYi9jb250cmliL1JlYnVzL0FwcC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwOGFmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvQXBwLmNvbmZpZwpAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24+CisgIAorICA8Y29uZmlnU2VjdGlvbnM+CisgICAgPHNlY3Rpb24gbmFtZT0icmVidXMiIHR5cGU9IlJlYnVzLkNvbmZpZ3VyYXRpb24uUmVidXNDb25maWd1cmF0aW9uU2VjdGlvbiwgUmVidXMiLz4KKyAgPC9jb25maWdTZWN0aW9ucz4KKworICA8cmVidXMgaW5wdXRRdWV1ZT0iTXlSZXNwb25zZXMiIGVycm9yUXVldWU9Ik15RXJyb3JzIiB3b3JrZXJzPSIxIj4KKyAgICA8ZW5kcG9pbnRzPgorICAgICAgPGFkZCBtZXNzYWdlcz0iUmVidXNTYW1wbGUuTWF0aFJlcXVlc3RDYWxsLCBSZWJ1c1NhbXBsZSIgZW5kcG9pbnQ9Ik1hdGhSZXF1ZXN0cyIvPgorICAgICAgPGFkZCBtZXNzYWdlcz0iUmVidXNTYW1wbGUuTWF0aFJlc3BvbnNlQ2FsbCwgUmVidXNTYW1wbGUiIGVuZHBvaW50PSJNYXRoUmVzcG9uc2VzIi8+CisgICAgPC9lbmRwb2ludHM+CisgIDwvcmVidXM+CisKKyAgPHN0YXJ0dXA+PHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjQuMCIgc2t1PSIuTkVURnJhbWV3b3JrLFZlcnNpb249djQuMCIvPjwvc3RhcnR1cD48L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1Byb2dyYW0uY3MgYi9jb250cmliL1JlYnVzL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzYzYyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDgxIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBSZWJ1cy5Db25maWd1cmF0aW9uOwordXNpbmcgUmVidXMuUmFiYml0TVE7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgUmVidXNTYW1wbGUuQ2xpZW50OwordXNpbmcgUmVidXNTYW1wbGUuU2VydmVyOworCituYW1lc3BhY2UgUmVidXNTYW1wbGUKK3sKKyAgICBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBzdGF0aWMgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIgU3RhcnRSZXF1ZXN0U2VydmVyKHN0cmluZyBzZXJ2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNsaWVudCBSZWJ1cyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICB2YXIgYWRhcHRlciA9IG5ldyBCdWlsdGluQ29udGFpbmVyQWRhcHRlcigpOworICAgICAgICAgICAgQ29uZmlndXJlLldpdGgoYWRhcHRlcikKKyAgICAgICAgICAgICAgICAuVHJhbnNwb3J0KHQgPT4gdC5Vc2VSYWJiaXRNcSgiYW1xcDovLyIgKyBzZXJ2ZXIsICJNYXRoUmVxdWVzdHMiLCAiTWF0aFJlcXVlc3RFcnJvcnMiKSkKKyAgICAgICAgICAgICAgICAuTWVzc2FnZU93bmVyc2hpcChvID0+IG8uRnJvbVJlYnVzQ29uZmlndXJhdGlvblNlY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAuQ3JlYXRlQnVzKCkuU3RhcnQoKTsKKworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgYWxsIHJlbGV2YW50IG1lc3NhZ2UgaGFuZGxlcnMgCisgICAgICAgICAgICBhZGFwdGVyLlJlZ2lzdGVyKHR5cGVvZihNYXRoUmVxdWVzdENhbGxIYW5kbGVyKSk7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICAgICAgfQorCisKKyAgICAgICAgc3RhdGljIEJ1aWx0aW5Db250YWluZXJBZGFwdGVyIFN0YXJ0UmVzcG9uc2VTZXJ2ZXIoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2xpZW50IFJlYnVzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIHZhciBhZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChhZGFwdGVyKQorICAgICAgICAgICAgICAgIC5UcmFuc3BvcnQodCA9PiB0LlVzZVJhYmJpdE1xKCJhbXFwOi8vIiArIHNlcnZlciwgIk1hdGhSZXNwb25zZXMiLCAiTWF0aFJlc3BvbnNlRXJyb3JzIikpCisgICAgICAgICAgICAgICAgLk1lc3NhZ2VPd25lcnNoaXAobyA9PiBvLkZyb21SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgLkNyZWF0ZUJ1cygpLlN0YXJ0KCk7CisKKyAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGFsbCByZWxldmFudCBtZXNzYWdlIGhhbmRsZXJzIAorICAgICAgICAgICAgYWRhcHRlci5SZWdpc3Rlcih0eXBlb2YoTWF0aFJlc3BvbnNlQ2FsbEhhbmRsZXIpKTsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgc2VydmVyID0gImxvY2FsaG9zdCI7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IGFsbCBzZXJ2ZXJzCisgICAgICAgICAgICB2YXIgcmVxID0gU3RhcnRSZXF1ZXN0U2VydmVyKHNlcnZlcik7CisgICAgICAgICAgICB2YXIgcnNwID0gU3RhcnRSZXNwb25zZVNlcnZlcihzZXJ2ZXIpOworCisgICAgICAgICAgICAvLyBzZW5kIHRoZSBmaXJzdCBtZXNzYWdlCisgICAgICAgICAgICB2YXIgcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVxdWVzdENsaWVudChzZXJ2ZXIpOworICAgICAgICAgICAgY2xpZW50LkRvVGhlTWF0aChyYW5kb20uTmV4dCgpLCByYW5kb20uTmV4dCgpKTsKKworICAgICAgICAgICAgLy8gbm93IHdoYXQ/CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJIaXQgPEVOVEVSPiB0byBzdG9wIC4uLiAiKTsKKyAgICAgICAgICAgIENvbnNvbGUuUmVhZExpbmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9jb250cmliL1JlYnVzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NzZlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsMzggQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJSZWJ1c1NhbXBsZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJSZWJ1c1NhbXBsZSIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpICAyMDE0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworW2Fzc2VtYmx5OiBHdWlkKCIwYWYxMDk4NC00MGQzLTQ1M2QtYjFlNS00MjE1MjllOGM3ZTIiKV0KKworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9SRUFETUUubWQgYi9jb250cmliL1JlYnVzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI5YzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9SRUFETUUubWQKQEAgLTAsMCArMSwyMSBAQAorU2FtcGxlIGNvZGUgZm9yIHRoZSBjb21iaW5hdGlvbiBvZiBUaHJpZnQgd2l0aCBSZWJ1cy4KKworUmVidXMgaXMgYSAuTkVUIHNlcnZpY2UgYnVzLCBzaW1pbGFyIHRvIE5TZXJ2aWNlQnVzLCBidXQgbW9yZSBsaWdodHdlaWdodC4gCitJdCBpaGFzIGJlZW4gbWFpbmx5IHdyaXR0ZW4gYnkgTW9nZW5zIEhlbGxlciBHcmFiZSBhbmQgaXMgY3VycmVudGx5IGhvc3RlZCAKK29uIEdpdEh1YiAoaHR0cHM6Ly9naXRodWIuY29tL3JlYnVzLW9yZy9SZWJ1cykKKworQXMgd2l0aCBhbGwgU2VydmljZUJ1cyBvciBNUSBzY2VuYXJpb3MsIGR1ZSB0byB0aGUgaGlnaGx5IGFzeW5jaHJvbm91cyAKK29wZXJhdGlvbnMgaXQgaXMgcmVjb21tZW5kZWQgdG8gZG8gYWxsIGNhbGxzIGFzICJvbmV3YXkgdm9pZCIgY2FsbHMuCisKK1RoZSBjb25maWd1cmF0aW9uIGNhbiBiZSBkb25lIHZpYSBBcHAuQ29uZmlnLCB2aWEgY29kZSBvciBldmVuIG1peGVkIGZyb20gCitib3RoIGxvY2F0aW9ucy4gUmVmZXIgdG8gdGhlIFJlYnVzIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gRm9yIAordGhpcyBleGFtcGxlLCBzaW5jZSB3ZSBhcmUgZWZmZWN0aXZlbHkgaW1wbGVtZW50aW5nIHR3byBxdWV1ZSBsaXN0ZW5lcnMgaW4gCitvbmx5IG9uZSBzaW5nbGUgcHJvY2Vzcywgd2UgZG8gY29uZmlndXJhdGlvbiBvZiBpbmNvbWluZyBhbmQgZXJyb3IgcXVldWVzIAoraW4gdGhlIGNvZGUuCisKK0lmIHlvdSB3YW50IHRvIGNvbW11bmljYXRlIHdpdGggbm9uLU5FVCBsYW5ndWFnZXMsIHlvdSBtYXkgbmVlZCBhIGN1c3RvbWl6ZWQgCitzZXJpYWxpemVyIGFzIHdlbGwsIGluIG9yZGVyIHRvIG92ZXJyaWRlIFJlYnVzJyBkZWZhdWx0IHdpcmUgZm9ybWF0LiBQbGVhc2UgCityZWZlciB0byB0aGUgUmVidXMgZG9jcyBvbiBob3cgdG8gZG8gdGhhdCAoaXQncyBub3QgdGhhdCBoYXJkLCByZWFsbHkpLgorCitBZGRpdGlvbmFsIHJlcXVpcmVtZW50czoKKy0gUmFiYml0TVEgLk5FVCBjbGllbnQgKHNlZSBudWdldCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvUmVidXNTYW1wbGUuY3Nwcm9qIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1OGE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvUmVidXNTYW1wbGUuY3Nwcm9qCkBAIC0wLDAgKzEsMTAyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjEyLjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcyIgQ29uZGl0aW9uPSJFeGlzdHMoJyQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMnKSIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9qZWN0R3VpZD57MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5SZWJ1c1NhbXBsZTwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlJlYnVzU2FtcGxlPC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0PkFueUNQVTwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxQbGF0Zm9ybVRhcmdldD5BbnlDUFU8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJSYWJiaXRNUS5DbGllbnQiPgorICAgICAgPEhpbnRQYXRoPi4uXC4uXC4uXC4uXC4uXFRvb2xib3hcU2VydmljZUJ1c1wzcmRwYXJ0eVxyYWJiaXRtcS1kb3RuZXQtY2xpZW50LTMuMi4xLWRvdG5ldC0zLjBcYmluXFJhYmJpdE1RLkNsaWVudC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iUmVidXMiPgorICAgICAgPEhpbnRQYXRoPi4uXC4uXC4uXC4uXC4uXFRvb2xib3hcU2VydmljZUJ1c1wzcmRwYXJ0eVxSZWJ1cy1tYXN0ZXJcZGVwbG95XE5FVDQwXFJlYnVzLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJSZWJ1cy5SYWJiaXRNUSI+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cLi5cLi5cVG9vbGJveFxTZXJ2aWNlQnVzXDNyZHBhcnR5XFJlYnVzLW1hc3RlclxkZXBsb3lcTkVUNDBcUmVidXMuUmFiYml0TVEuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQ1NoYXJwIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJnZW4tY3NoYXJwXEJhc2ljTWF0aENsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJnZW4tY3NoYXJwXEJhc2ljTWF0aFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2aWNlSW1wbFxCb3RoLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VJbXBsXENsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VJbXBsXFNlcnZlci5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iQXBwLmNvbmZpZyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXAgLz4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTllYjYzYy1kNzRjLTQ3ZTgtYWU0OC1hMmZjOTQ1MzhlOWR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PmNkICQoUHJvamVjdERpcikKK2lmIG5vdCBleGlzdCBnZW4tY3NoYXJwXCouY3MgICB0aHJpZnQgIC1nZW4gY3NoYXJwIHNhbXBsZS50aHJpZnQKKzwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvUmVidXNTYW1wbGUuc2xuIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0ZWYzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvUmVidXNTYW1wbGUuc2xuCkBAIC0wLDAgKzEsMjggQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEzCitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTIuMC4zMDExMC4wCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJSZWJ1c1NhbXBsZSIsICJSZWJ1c1NhbXBsZS5jc3Byb2oiLCAiezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIiwgIns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQm90aC5jcyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQm90aC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmE2N2VjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9Cb3RoLmNzCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKKworCituYW1lc3BhY2UgUmVidXNTYW1wbGUKK3sKKyAgICAvLyBnZW5lcmljIGRhdGEgY29udGFpbmVyIGZvciBzZXJpYWxpemVkIFRocmlmdCBjYWxscworICAgIHB1YmxpYyBjbGFzcyBHZW5lcmljVGhyaWZ0U2VydmljZUNhbGwKKyAgICB7CisgICAgICAgIHB1YmxpYyBieXRlW10gcmF3Qnl0ZXM7CisgICAgfQorCisgICAgLy8gc3BlY2lmaWMgY29udGFpbmVycyAob25lIHBlciBUaHJpZnQgc2VydmljZSkgdG8gbGV2ZXJhZ2UgUmVidXMnIGhhbmRsZXIgcm91dGluZworICAgIHB1YmxpYyBjbGFzcyBNYXRoUmVxdWVzdENhbGwgOiBHZW5lcmljVGhyaWZ0U2VydmljZUNhbGwgeyB9CisgICAgcHVibGljIGNsYXNzIE1hdGhSZXNwb25zZUNhbGwgOiBHZW5lcmljVGhyaWZ0U2VydmljZUNhbGwgeyB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL0NsaWVudC5jcyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDgwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL0NsaWVudC5jcwpAQCAtMCwwICsxLDE1NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgUmVidXM7Cit1c2luZyBSZWJ1cy5Db25maWd1cmF0aW9uOwordXNpbmcgUmVidXMuTWVzc2FnZXM7Cit1c2luZyBSZWJ1cy5SYWJiaXRNUTsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworLyoKKyAqIFRoZSBjbGllbnQgZW1pdHMgY2FsbHMgdG8gQmFzaWNNYXRoU2VydmVycworICogCisgKiBUaGUgY2xpZW50IGltcGxlbWVudHMgdGhlIEJhc2ljTWF0aENsaWVudCBzZXJ2aWNlLiAKKyAqIElmIHRoZSBzZXJ2ZXIgaGFzIHByb2Nlc3NlZCBvdXIgcmVxdWVzdCwgd2UgZ2V0IHRoZSByZXN1bHRzIGJhY2sgdGhyb3VnaCB0aGlzIHNlcnZpY2UKKyAqLworCituYW1lc3BhY2UgUmVidXNTYW1wbGUuQ2xpZW50Cit7CisKKyAgICAvLyBoYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBSZWJ1cworICAgIGNsYXNzIE1hdGhSZXNwb25zZUNhbGxIYW5kbGVyIDogSUhhbmRsZU1lc3NhZ2VzPE1hdGhSZXNwb25zZUNhbGw+CisgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBIYW5kbGUoTWF0aFJlc3BvbnNlQ2FsbCBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbShtZXNzYWdlLnJhd0J5dGVzKTsKKyAgICAgICAgICAgIHZhciB0cm5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cm5zKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgcHJvY2Vzc29yIGFuZCBsZXQgaGltIGhhbmRsZSB0aGUgY2FsbAorICAgICAgICAgICAgdmFyIGhuZGwgPSBuZXcgTWF0aFJlc3BvbnNlc0hhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBwcm9jID0gbmV3IEJhc2ljTWF0aENsaWVudC5Qcm9jZXNzb3IoaG5kbCk7CisgICAgICAgICAgICBwcm9jLlByb2Nlc3MocHJvdCwgbnVsbCk7ICAvLyBvbmV3YXkgb25seQorICAgICAgICB9ICAgICAgCisgICAgfQorCisKKyAgICAvLyBzZXJ2ZXMgaW5jb21pbmcgcmVzcG9uc2VzIHdpdGggY2FsY3VsYXRpb24gcmVzdWx0cworICAgIGludGVybmFsIGNsYXNzIE1hdGhSZXNwb25zZXNIYW5kbGVyIDogQmFzaWNNYXRoQ2xpZW50LklmYWNlCisgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBGb3VyUmVzdWx0cyhpbnQgYWRkZWQsIGludCBtdWx0aXBsaWVkLCBpbnQgc3VidHJhY3RlZCwgaW50IGRpdmlkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhZGRlZCA9IHswfSIsIGFkZGVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtdWx0aXBsaWVkPSB7MH0iLCBtdWx0aXBsaWVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzdWJ0cmFjdGVkID0gezB9Iiwgc3VidHJhY3RlZCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZGl2aWRlZCA9IHswfSIsIGRpdmlkZWQpOworCisgICAgICAgICAgICBQaW5nQW5kRG9Bbm90aGVyQ2FsY3VsYXRpb24oKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgVGhyZWVSZXN1bHRzKGludCBhZGRlZCwgaW50IG11bHRpcGxpZWQsIGludCBzdWJ0cmFjdGVkKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiYWRkZWQgPSB7MH0iLCBhZGRlZCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibXVsdGlwbGllZD0gezB9IiwgbXVsdGlwbGllZCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgic3VidHJhY3RlZCA9IHswfSIsIHN1YnRyYWN0ZWQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkRJVi8wIGVycm9yIGR1cmluZyBkaXZpc2lvbiIpOworCisgICAgICAgICAgICBQaW5nQW5kRG9Bbm90aGVyQ2FsY3VsYXRpb24oKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgUG9uZyhsb25nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbGF0ZW5jeSA9IERhdGVUaW1lLk5vdy5UaWNrcyAtIHZhbHVlOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlBpbmcgdG9vayB7MH0gbXMiLCBuZXcgRGF0ZVRpbWUobGF0ZW5jeSkuTWlsbGlzZWNvbmQpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIHZvaWQgUGluZ0FuZERvQW5vdGhlckNhbGN1bGF0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgTWF0aFJlcXVlc3RDbGllbnQoImxvY2FsaG9zdCIpOworICAgICAgICAgICAgY2xpZW50LlBpbmcoRGF0ZVRpbWUuTm93LlRpY2tzKTsKKyAgICAgICAgICAgIGNsaWVudC5Eb1RoZU1hdGgocmFuZG9tLk5leHQoKSwgcmFuZG9tLk5leHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHByb3ZpZGVzIHRoZSBjbGllbnQtc2lkZSBpbnRlcmZhY2UgZm9yIGNhbGN1bGF0aW9uIHJlcXVlc3RzCisgICAgaW50ZXJuYWwgY2xhc3MgTWF0aFJlcXVlc3RDbGllbnQgOiBCYXNpY01hdGhTZXJ2ZXIuSWZhY2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIgTVFBZGFwdGVyOworCisKKyAgICAgICAgcHVibGljIE1hdGhSZXF1ZXN0Q2xpZW50KHN0cmluZyBzZXJ2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1RQWRhcHRlciA9IG5ldyBCdWlsdGluQ29udGFpbmVyQWRhcHRlcigpOworICAgICAgICAgICAgQ29uZmlndXJlLldpdGgoTVFBZGFwdGVyKQorICAgICAgICAgICAgICAgIC5UcmFuc3BvcnQodCA9PiB0LlVzZVJhYmJpdE1xSW5PbmVXYXlNb2RlKCJhbXFwOi8vIiArIHNlcnZlcikpICAvLyB3ZSBuZWVkIHNlbmQgb25seQorICAgICAgICAgICAgICAgIC5NZXNzYWdlT3duZXJzaGlwKG8gPT4gby5Gcm9tUmVidXNDb25maWd1cmF0aW9uU2VjdGlvbigpKQorICAgICAgICAgICAgICAgIC5DcmVhdGVCdXMoKS5TdGFydCgpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBTZXJpYWxpemVUaHJpZnRDYWxsKEFjdGlvbjxCYXNpY01hdGhTZXJ2ZXIuSWZhY2U+IGFjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhyaWZ0IHByb3RvY29sL3RyYW5zcG9ydCBzdGFjaworICAgICAgICAgICAgdmFyIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHZhciB0cm5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQobnVsbCwgc3RtKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cm5zKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gc2VyaWFsaXplIHRoZSBjYWxsIGludG8gYSBidW5jaCBvZiBieXRlcworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBCYXNpY01hdGhTZXJ2ZXIuQ2xpZW50KHByb3QpOworICAgICAgICAgICAgaWYoIGFjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFjdGlvbihjbGllbnQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgTWVtb3J5U3RyZWFtCisgICAgICAgICAgICB0cm5zLkZsdXNoKCk7CisKKyAgICAgICAgICAgIC8vIHNlbmQgdGhlIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBtc2cgPSBuZXcgTWF0aFJlcXVlc3RDYWxsKCkgeyByYXdCeXRlcyA9IHN0bS5Ub0FycmF5KCkgfTsKKyAgICAgICAgICAgIE1RQWRhcHRlci5CdXMuU2VuZChtc2cpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBQaW5nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LlBpbmcodmFsdWUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIERvVGhlTWF0aCggaW50IGFyZzEsIGludCBhcmcyKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJpYWxpemVUaHJpZnRDYWxsKGNsaWVudCA9PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Eb1RoZU1hdGgoYXJnMSwgYXJnMik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9TZXJ2ZXIuY3MgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL1NlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDlkNTEzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9TZXJ2ZXIuY3MKQEAgLTAsMCArMSwxNDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFJlYnVzOwordXNpbmcgUmVidXMuQ29uZmlndXJhdGlvbjsKK3VzaW5nIFJlYnVzLk1lc3NhZ2VzOwordXNpbmcgUmVidXMuUmFiYml0TVE7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKKy8qCisgKiBUaGUgc2VydmVyIGltcGxlbWVudHMgdGhlIEJhc2ljTWF0aFNlcnZlciBzZXJ2aWNlIC4KKyAqIEFsbCByZXN1bHRzIGFyZSBzZW50IGJhY2sgdG8gdGhlIGNsaWVudCB2aWEgdGhlIEJhc2ljTWF0aENsaWVudCBzZXJ2aWNlCisgKi8KKworCituYW1lc3BhY2UgUmVidXNTYW1wbGUuU2VydmVyCit7CisgICAgLy8gaGFuZGxlciB0byBiZSByZWdpc3RlcmVkIHdpdGggUmVidXMKKyAgICBjbGFzcyBNYXRoUmVxdWVzdENhbGxIYW5kbGVyIDogSUhhbmRsZU1lc3NhZ2VzPE1hdGhSZXF1ZXN0Q2FsbD4KKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIEhhbmRsZShNYXRoUmVxdWVzdENhbGwgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhyaWZ0IHByb3RvY29sL3RyYW5zcG9ydCBzdGFjaworICAgICAgICAgICAgdmFyIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0obWVzc2FnZS5yYXdCeXRlcyk7CisgICAgICAgICAgICB2YXIgdHJucyA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KHN0bSwgbnVsbCk7CisgICAgICAgICAgICB2YXIgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJucyk7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHByb2Nlc3NvciBhbmQgbGV0IGhpbSBoYW5kbGUgdGhlIGNhbGwKKyAgICAgICAgICAgIHZhciBobmRsID0gbmV3IE1hdGhSZXF1ZXN0c0hhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBwcm9jID0gbmV3IEJhc2ljTWF0aFNlcnZlci5Qcm9jZXNzb3IoaG5kbCk7CisgICAgICAgICAgICBwcm9jLlByb2Nlc3MocHJvdCwgbnVsbCk7ICAvLyBvbmV3YXkgb25seQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBzZXJ2ZXMgaW5jb21pbmcgY2FsY3VsYXRpb24gcmVxdWVzdHMKKyAgICBpbnRlcm5hbCBjbGFzcyBNYXRoUmVxdWVzdHNIYW5kbGVyIDogQmFzaWNNYXRoU2VydmVyLklmYWNlCisgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBQaW5nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgTWF0aFJlc3BvbnNlQ2xpZW50KCJsb2NhbGhvc3QiKTsKKyAgICAgICAgICAgIGNsaWVudC5Qb25nKHZhbHVlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgRG9UaGVNYXRoKGludCBhcmcxLCBpbnQgYXJnMikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVzcG9uc2VDbGllbnQoImxvY2FsaG9zdCIpOworICAgICAgICAgICAgaWYoIGFyZzIgIT0gMCkKKyAgICAgICAgICAgICAgICBjbGllbnQuRm91clJlc3VsdHMoIGFyZzErYXJnMiwgYXJnMSphcmcyLCBhcmcxLWFyZzIsIGFyZzEvYXJnMik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2xpZW50LlRocmVlUmVzdWx0cyggYXJnMSthcmcyLCBhcmcxKmFyZzIsIGFyZzEtYXJnMik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHByb3ZpZGVzIHRoZSBjbGllbnQtc2lkZSBpbnRlcmZhY2UgZm9yIGNhbGN1bGF0aW9uIHJlc3BvbnNlcworICAgIGludGVybmFsIGNsYXNzIE1hdGhSZXNwb25zZUNsaWVudCA6IEJhc2ljTWF0aENsaWVudC5JZmFjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBCdWlsdGluQ29udGFpbmVyQWRhcHRlciBNUUFkYXB0ZXI7CisKKworICAgICAgICBwdWJsaWMgTWF0aFJlc3BvbnNlQ2xpZW50KHN0cmluZyBzZXJ2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1RQWRhcHRlciA9IG5ldyBCdWlsdGluQ29udGFpbmVyQWRhcHRlcigpOworICAgICAgICAgICAgQ29uZmlndXJlLldpdGgoTVFBZGFwdGVyKQorICAgICAgICAgICAgICAgIC5UcmFuc3BvcnQodCA9PiB0LlVzZVJhYmJpdE1xSW5PbmVXYXlNb2RlKCJhbXFwOi8vIiArIHNlcnZlcikpICAvLyB3ZSBuZWVkIHNlbmQgb25seQorICAgICAgICAgICAgICAgIC5NZXNzYWdlT3duZXJzaGlwKG8gPT4gby5Gcm9tUmVidXNDb25maWd1cmF0aW9uU2VjdGlvbigpKQorICAgICAgICAgICAgICAgIC5DcmVhdGVCdXMoKS5TdGFydCgpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBTZXJpYWxpemVUaHJpZnRDYWxsKEFjdGlvbjxCYXNpY01hdGhDbGllbnQuSWZhY2U+IGFjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhyaWZ0IHByb3RvY29sL3RyYW5zcG9ydCBzdGFjaworICAgICAgICAgICAgdmFyIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHZhciB0cm5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQobnVsbCwgc3RtKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cm5zKTsKKworICAgICAgICAgICAgLy8gc2VyaWFsaXplIHRoZSBjYWxsIGludG8gYSBidW5jaCBvZiBieXRlcworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBCYXNpY01hdGhDbGllbnQuQ2xpZW50KHByb3QpOworICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFjdGlvbihjbGllbnQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgTWVtb3J5U3RyZWFtCisgICAgICAgICAgICB0cm5zLkZsdXNoKCk7CisKKyAgICAgICAgICAgIC8vIHNlbmQgdGhlIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBtc2cgPSBuZXcgTWF0aFJlc3BvbnNlQ2FsbCgpIHsgcmF3Qnl0ZXMgPSBzdG0uVG9BcnJheSgpIH07CisgICAgICAgICAgICBNUUFkYXB0ZXIuQnVzLlNlbmQobXNnKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgUG9uZyhsb25nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJpYWxpemVUaHJpZnRDYWxsKGNsaWVudCA9PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Qb25nKHZhbHVlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZVJlc3VsdHMoaW50IGFkZGVkLCBpbnQgbXVsdGlwbGllZCwgaW50IHN1Y3RyYWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LlRocmVlUmVzdWx0cyhhZGRlZCwgbXVsdGlwbGllZCwgc3VjdHJhY3RlZCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgRm91clJlc3VsdHMoaW50IGFkZGVkLCBpbnQgbXVsdGlwbGllZCwgaW50IHN1Y3RyYWN0ZWQsIGludCBkaXZpZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJpYWxpemVUaHJpZnRDYWxsKGNsaWVudCA9PgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Gb3VyUmVzdWx0cyhhZGRlZCwgbXVsdGlwbGllZCwgc3VjdHJhY3RlZCwgZGl2aWRlZCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9zYW1wbGUudGhyaWZ0IGIvY29udHJpYi9SZWJ1cy9zYW1wbGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NWUyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL3NhbXBsZS50aHJpZnQKQEAgLTAsMCArMSwzMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitzZXJ2aWNlIEJhc2ljTWF0aFNlcnZlciB7CisgICAgb25ld2F5IHZvaWQgRG9UaGVNYXRoKCAxOiBpMzIgYXJnMSwgIDI6IGkzMiBhcmcyKQorICAgIG9uZXdheSB2b2lkIFBpbmcoMTogaTY0IHZhbHVlKQorfQorCitzZXJ2aWNlIEJhc2ljTWF0aENsaWVudCB7CisgICAgb25ld2F5IHZvaWQgVGhyZWVSZXN1bHRzKCAxIDogaTMyIGFkZGVkLCAyIDogaTMyIG11bHRpcGxpZWQsIDMgOiBpMzIgc3VidHJhY3RlZCk7CisgICAgb25ld2F5IHZvaWQgRm91clJlc3VsdHMoICAxIDogaTMyIGFkZGVkLCAyIDogaTMyIG11bHRpcGxpZWQsIDMgOiBpMzIgc3VidHJhY3RlZCwgNCA6IGkzMiBkaXZpZGVkKTsKKyAgICBvbmV3YXkgdm9pZCBQb25nKDE6IGk2NCB2YWx1ZSkKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvU3RvbXAvUkVBRE1FLm1kIGIvY29udHJpYi9TdG9tcC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1ZjIxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvU3RvbXAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTggQEAKK1NhbXBsZSBjb2RlIGZvciBTVE9NUC1iYXNlZCBUaHJpZnQgY2xpZW50cyBhbmQvb3Igc2VydmVycy4KKworQWx0aG91Z2ggdGhlIHNhbXBsZSBUaHJpZnQgU1RPTVAgVHJhbnNwb3J0IGlzIHdyaXR0ZW4gaW4gCitEZWxwaGkvUGFzY2FsLCBpdCBjYW4gZWFzaWx5IHNlcnZlIGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIAorc2ltaWxhciBpbXBsZW1lbnRhdGlvbnMgaW4gb3RoZXIgbGFuZ3VhZ2VzLgorCitTVE9NUCBpcyBhIHByb3RvY29sIHdpZGVseSBzdXBwb3J0ZWQgYnkgbWFueSBtZXNzYWdpbmcgc3lzdGVtcywKK3N1Y2ggYXMgQXBhY2hlIEFjdGl2ZU1RLCBSYWJiaXRNUSBhbmQgbWFueSBvdGhlcnMuIEluIHBhcnRpY3VsYXIsCitpdCBjYW4gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIFNlcnZpY2UtQnVzIHByb2R1Y3RzIGxpa2UgUmVidXMKK29yIE5TZXJ2aWNlQnVzLCB3aGVuIHJ1bm5pbmcgYWdhaW5zdCBhIFNUT01QLWNhcGFibGUgTVEgc3lzdGVtLgorCitBIHByZXJlcXVpc2l0ZSBmb3IgdGhpcyBzYW1wbGUgaXMgdGhlIERlbHBoaSBTVE9NUCBBZGFwdGVyIHdyaXR0ZW4KK2J5IERhbmllbGUgVGV0aSAoaHR0cDovL3d3dy5kYW5pZWxldGV0aS5pdC9zdG9tcC1jbGllbnQpLCBjdXJyZW50bHkKK2hvc3RlZCBhdCBHb29nbGUgQ29kZSAoaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2RlbHBoaXN0b21wY2xpZW50KS4KKworQXQgdGhlIHRpbWUgb2Ygd3JpdGluZywgdGhlIFNUT01QIGFkYXB0ZXIgZG9lcyBub3QgZnVsbHkgc3VwcG9ydCAKK2JpbmFyeSBkYXRhLiBQbGVhc2UgY2hlY2sgd2hldGhlciB0aGlzIGhhcyBiZWVuIGZpeGVkLCBvdGhlcndpc2UgCit5b3UgaGF2ZSB0byB1c2UgdGhlIEpTT04gcHJvdG9jb2wgKG9yIHRvIGZpeCBpdCBvbiB5b3VyIG93bikuCmRpZmYgLS1naXQgYS9jb250cmliL1N0b21wL1RocmlmdC5UcmFuc3BvcnQuU1RPTVAucGFzIGIvY29udHJpYi9TdG9tcC9UaHJpZnQuVHJhbnNwb3J0LlNUT01QLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGZiMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9TdG9tcC9UaHJpZnQuVHJhbnNwb3J0LlNUT01QLnBhcwpAQCAtMCwwICsxLDIwMCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5UcmFuc3BvcnQuU1RPTVA7CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsV2luZG93cywgU3lzVXRpbHMsCisgIFRocmlmdCwKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuU3RyZWFtLAorICBTdG9tcENsaWVudCwKKyAgU3RvbXBUeXBlczsKKwordHlwZQorICBUU3RvbXBUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRTdHJlYW1UcmFuc3BvcnRJbXBsKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZEYXRhICAgICA6IFRTdHJpbmdTdHJlYW07CisgICAgRlNlcnZlciAgIDogc3RyaW5nOworICAgIEZPdXRRdWV1ZSA6IHN0cmluZzsKKyAgICBGU3RvbXBDbGkgOiBJU3RvbXBDbGllbnQ7CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUGVlazogQm9vbGVhbjsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVNlcnZlckFuZFBvcnQsIGFPdXRRdWV1ZSA6IHN0cmluZyk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgT3BlbigpOyAgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlKCk7ICBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7ICBvdmVycmlkZTsKKyAgZW5kOworCisKKyAgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGU2VydmVyICA6IHN0cmluZzsKKyAgICBGSW5RdWV1ZSA6IHN0cmluZzsKKyAgICBGQ2xpZW50ICA6IElTdG9tcENsaWVudDsKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIExpc3Rlbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFTZXJ2ZXJBbmRQb3J0LCBhSW5RdWV1ZSA6IHN0cmluZyk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisgIGVuZDsKKworCitjb25zdAorICBRVUVVRV9QUkVGSVggICAgPSAnL3F1ZXVlLyc7CisgIFRPUElDX1BSRUZJWCAgICA9ICcvdG9waWMvJzsKKyAgRVhDSEFOR0VfUFJFRklYID0gJy9leGNoYW5nZS8nOworCisKK2ltcGxlbWVudGF0aW9uCisKKworCitjb25zdHJ1Y3RvciBUU3RvbXBUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgYVNlcnZlckFuZFBvcnQsIGFPdXRRdWV1ZSA6IHN0cmluZyk7Cit2YXIgYWRhcHRlciA6IElUaHJpZnRTdHJlYW07CitiZWdpbgorICBGRGF0YSAgICAgOj0gVFN0cmluZ1N0cmVhbS5DcmVhdGU7CisgIEZTZXJ2ZXIgICA6PSBhU2VydmVyQW5kUG9ydDsKKyAgRk91dFF1ZXVlIDo9IGFPdXRRdWV1ZTsKKworICBhZGFwdGVyIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggRkRhdGEsIEZBTFNFKTsKKyAgaW5oZXJpdGVkIENyZWF0ZSggbmlsLCBhZGFwdGVyKTsgIC8vIG91dHB1dCBvbmx5CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUU3RvbXBUcmFuc3BvcnRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgRnJlZUFuZE5pbCggRkRhdGEpOworICBGU3RvbXBDbGkgOj0gbmlsOworZW5kOworCisKK2Z1bmN0aW9uIFRTdG9tcFRyYW5zcG9ydEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IChGU3RvbXBDbGkgPD4gbmlsKTsKK2VuZDsKKworCitmdW5jdGlvbiBUU3RvbXBUcmFuc3BvcnRJbXBsLlBlZWs6IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gRkFMU0U7ICAvLyBvdXRwdXQgb25seQorZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBUcmFuc3BvcnRJbXBsLk9wZW47CitiZWdpbgorICBpZiBGU3RvbXBDbGkgPD4gbmlsCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICdhbHJlYWR5IG9wZW4nKQorICBlbHNlIEZTdG9tcENsaSA6PSBTdG9tcFV0aWxzLk5ld1N0b21wKCBGU2VydmVyKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFN0b21wVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZTdG9tcENsaSA6PSBuaWw7CisgIEZEYXRhLkNsZWFyOworZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBUcmFuc3BvcnRJbXBsLkZsdXNoOworYmVnaW4KKyAgaWYgRlN0b21wQ2xpID0gbmlsCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwgJ25vdCBvcGVuJyk7CisKKyAgRlN0b21wQ2xpLlNlbmQoIEZPdXRRdWV1ZSwgRkRhdGEuRGF0YVN0cmluZyk7CisgIEZEYXRhLkNsZWFyOworZW5kOworCisKKy8vLS0tIFRTdG9tcFNlcnZlclRyYW5zcG9ydEltcGwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjb25zdHJ1Y3RvciBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgYVNlcnZlckFuZFBvcnQsIGFJblF1ZXVlIDogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTZXJ2ZXIgIDo9IGFTZXJ2ZXJBbmRQb3J0OworICBGSW5RdWV1ZSA6PSBhSW5RdWV1ZTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRTdG9tcFNlcnZlclRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIENsb3NlOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5MaXN0ZW47CitiZWdpbgorICBGQ2xpZW50IDo9IFN0b21wVXRpbHMuTmV3U3RvbXAoRlNlcnZlcik7CisgIEZDbGllbnQuU3Vic2NyaWJlKCBGSW5RdWV1ZSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTdG9tcFNlcnZlclRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBpZiBGQ2xpZW50IDw+IG5pbCB0aGVuIGJlZ2luCisgICAgRkNsaWVudC5VbnN1YnNjcmliZSggRkluUXVldWUpOworICAgIEZDbGllbnQgOj0gbmlsOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5BY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7Cit2YXIgZnJhbWUgICA6IElTdG9tcEZyYW1lOworICAgIGFkYXB0ZXIgOiBJVGhyaWZ0U3RyZWFtOworICAgIHN0cmVhbSAgOiBUU3RyaW5nU3RyZWFtOworYmVnaW4KKyAgaWYgRkNsaWVudCA9IG5pbAorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb3QgY29ubmVjdGVkLicpOworCisgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKQorICB0aGVuIGZuQWNjZXB0aW5nKCk7CisKKyAgdHJ5CisgICAgZnJhbWUgOj0gRkNsaWVudC5SZWNlaXZlKE1BWElOVCk7CisgICAgaWYgZnJhbWUgPSBuaWwgdGhlbiBFeGl0KG5pbCk7CisKKyAgICBzdHJlYW0gIDo9IFRTdHJpbmdTdHJlYW0uQ3JlYXRlKCBmcmFtZS5HZXRCb2R5KTsKKyAgICBhZGFwdGVyIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RyZWFtLCBUUlVFKTsKKyAgICByZXN1bHQgIDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggYWRhcHRlciwgbmlsKTsKKworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24KKyAgICBkbyByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggRS5Ub1N0cmluZyApOworICBlbmQ7CitlbmQ7CisKKworZW5kLgorCmRpZmYgLS1naXQgYS9jb250cmliL1ZhZ3JhbnRmaWxlIGIvY29udHJpYi9WYWdyYW50ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjUzMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9WYWdyYW50ZmlsZQpAQCAtMCwwICsxLDEzMyBAQAorIyAtKi0gbW9kZTogcnVieSAtKi0KKyMgdmk6IHNldCBmdD1ydWJ5IDoKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyRidWlsZF9hbmRfdGVzdCA9IDw8U0NSSVBUCitlY2hvICJQcm92aXNpb25pbmcgc3lzdGVtIHRvIGNvbXBpbGUgYW5kIHRlc3QgQXBhY2hlIFRocmlmdC4iCisKKyMgQ3JlYXRlIHN3YXAgc3BhY2UKK3N1ZG8gZmFsbG9jYXRlIC1sIDJHIC9zd2FwZmlsZQorc3VkbyBjaG1vZCA2MDAgL3N3YXBmaWxlCitzdWRvIG1rc3dhcCAvc3dhcGZpbGUKK3N1ZG8gc3dhcG9uIC9zd2FwZmlsZQorc3VkbyBzd2Fwb24gLXMKKworIyBVcGRhdGUgdGhlIHN5c3RlbQorc3VkbyBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCB1cGRhdGUgLXFxIC15CitzdWRvIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IHVwZ3JhZGUgLXFxIC15CisKKyMgSW5zdGFsbCBEZXBlbmRlbmNpZXMKKyMgLS0tCisjIEdlbmVyYWwgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgYXV0b21ha2UgbGlidG9vbCBmbGV4IGJpc29uIHBrZy1jb25maWcgZysrIGxpYnNzbC1kZXYgbWFrZSBsaWJxdDQtZGV2IGdpdCBkZWJoZWxwZXIKKworIyBDKysgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGliYm9vc3QtZGV2IGxpYmJvb3N0LXRlc3QtZGV2IGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgbGliYm9vc3Qtc3lzdGVtLWRldiBsaWJldmVudC1kZXYgCisKKyMgSmF2YSBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhbnQgb3Blbmpkay04LWpkayBtYXZlbgorCisjIFB5dGhvbiBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnIHB5dGhvbi1zZXR1cHRvb2xzIHB5dGhvbi1zdXBwb3J0IHB5dGhvbi1zaXggcHl0aG9uMy1zaXgKKworIyBSdWJ5IGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHJ1YnkgcnVieS1kZXYKK3N1ZG8gZ2VtIGluc3RhbGwgYnVuZGxlciByYWtlCisKKyMgUGVybCBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJiaXQtdmVjdG9yLXBlcmwgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybAorCisjIFBocCBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBwaHA1IHBocDUtZGV2IHBocDUtY2xpIHBocC1wZWFyIHJlMmMKKworIyBHbGliQyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJnbGliMi4wLWRldgorCisjIEVybGFuZyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldiBlcmxhbmctdG9vbHMKKworIyBHTyBkZXBlbmRlbmNpZXMKK2VjaG8gImdvbGFuZy1nbyBnb2xhbmctZ28vZGFzaGJvYXJkIGJvb2xlYW4gZmFsc2UiIHwgZGViY29uZi1zZXQtc2VsZWN0aW9ucworc3VkbyBhcHQtZ2V0IC15IGluc3RhbGwgLXFxIGdvbGFuZyBnb2xhbmctZ28KKworIyBIYXNrZWxsIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGdoYyBjYWJhbC1pbnN0YWxsIGxpYmdoYy1iaW5hcnktZGV2IGxpYmdoYy1uZXR3b3JrLWRldiBsaWJnaGMtaHR0cC1kZXYgbGliZ2hjLWhhc2hhYmxlLWRldiBsaWJnaGMtdW5vcmRlcmVkLWNvbnRhaW5lcnMtZGV2IGxpYmdoYy12ZWN0b3ItZGV2CitzdWRvIGNhYmFsIHVwZGF0ZQorCisjIEx1YSBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsdWE1LjIgbHVhNS4yLWRldgorCisjIE5vZGUuanMgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbm9kZWpzIG5vZGVqcy1kZXYgbm9kZWpzLWxlZ2FjeSBucG0KKworIyBDU2hhcnAKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBtb25vLWdtY3MgbW9uby1kZXZlbCBtb25vLXhidWlsZCBtb25vLWNvbXBsZXRlIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBtaW5ndzMyIG1pbmd3MzItYmludXRpbHMgbWluZ3czMi1ydW50aW1lIG5zaXMKKworIyBEIGRlcGVuZGVuY2llcworc3VkbyB3Z2V0IGh0dHA6Ly9tYXN0ZXIuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvZC1hcHQvZmlsZXMvZC1hcHQubGlzdCAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kLWFwdC5saXN0CitzdWRvIGFwdC1nZXQgdXBkYXRlICYmIHN1ZG8gYXB0LWdldCAteSAtLWFsbG93LXVuYXV0aGVudGljYXRlZCBpbnN0YWxsIC0tcmVpbnN0YWxsIGQtYXB0LWtleXJpbmcgJiYgc3VkbyBhcHQtZ2V0IHVwZGF0ZQorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHhkZy11dGlscyBkbWQtYmluCisKKyMgQ3VzdG9taXplIHRoZSBzeXN0ZW0KKyMgLS0tCisjIERlZmF1bHQgamF2YSB0byBsYXRlc3QgMS44IHZlcnNpb24KK3VwZGF0ZS1qYXZhLWFsdGVybmF0aXZlcyAtcyBqYXZhLTEuOC4wLW9wZW5qZGstYW1kNjQgCisKKyMgUEhQVW5pdCBwYWNrYWdlIGJyb2tlbiBpbiB1YnVudHUuIHNlZSBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9waHB1bml0LytidWcvNzAxNTQ0CitzdWRvIGFwdC1nZXQgdXBncmFkZSBwZWFyCitzdWRvIHBlYXIgY2hhbm5lbC1kaXNjb3ZlciBwZWFyLnBocHVuaXQuZGUKK3N1ZG8gcGVhciBjaGFubmVsLWRpc2NvdmVyIHBlYXIuc3ltZm9ueS5jb20KK3N1ZG8gcGVhciBjaGFubmVsLWRpc2NvdmVyIGNvbXBvbmVudHMuZXoubm8KK3N1ZG8gcGVhciB1cGRhdGUtY2hhbm5lbHMKK3N1ZG8gcGVhciB1cGdyYWRlLWFsbAorc3VkbyBwZWFyIGluc3RhbGwgLS1hbGxkZXBzIHBocHVuaXQvUEhQVW5pdAorCitkYXRlID4gL2V0Yy92YWdyYW50LnByb3Zpc2lvbmVkCisKKyMgU3RhcnQgdGhlIHNvdXJjZSBidWlsZAorIyAtLS0KK2VjaG8gIlN0YXJ0aW5nIEFwYWNoZSBUaHJpZnQgYnVpbGQuLi4iCitjZCAvdGhyaWZ0CitzaCBib290c3RyYXAuc2gKK3NoIGNvbmZpZ3VyZQorbWFrZQorbWFrZSBjaGVjaworZWNobyAiRmluaXNoZWQgYnVpbGRpbmcgQXBhY2hlIFRocmlmdC4iCisKK1NDUklQVAorCitWYWdyYW50LmNvbmZpZ3VyZSgiMiIpIGRvIHxjb25maWd8CisgICMgVWJ1bnR1IDE0LjA0IExUUyAoVHJ1c3R5IFRhaHIpCisgIGNvbmZpZy52bS5ib3ggPSAidHJ1c3R5NjQiCisgIGNvbmZpZy52bS5ib3hfdXJsID0gImh0dHBzOi8vY2xvdWQtaW1hZ2VzLnVidW50dS5jb20vdmFncmFudC90cnVzdHkvY3VycmVudC90cnVzdHktc2VydmVyLWNsb3VkaW1nLWFtZDY0LXZhZ3JhbnQtZGlzazEuYm94IgorCisgIGNvbmZpZy52bS5zeW5jZWRfZm9sZGVyICIuLi8iLCAiL3RocmlmdCIKKworICBjb25maWcudm0ucHJvdmlkZXIgOnZpcnR1YWxib3ggZG8gfHZib3h8CisgICAgdmJveC5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tbWVtb3J5IiwgIjEwMjQiXQorICAgIHZib3guY3VzdG9taXplIFsibW9kaWZ5dm0iLCA6aWQsICItLWNwdXMiLCAiMiJdCisgICAgdmJveC5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tcnRjdXNldXRjIiwgIm9uIl0KKyAgZW5kCisKKyAgIyBSdW4gdGhlIGJ1aWxkIHNjcmlwdCB0byBjb25maWd1cmUgdGhlIHN5c3RlbQorICBjb25maWcudm0ucHJvdmlzaW9uIDpzaGVsbCwgOmlubGluZSA9PiAkYnVpbGRfYW5kX3Rlc3QKK2VuZApkaWZmIC0tZ2l0IGEvY29udHJpYi9hc3luYy10ZXN0L01ha2VmaWxlIGIvY29udHJpYi9hc3luYy10ZXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZTdmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2FzeW5jLXRlc3QvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorVEhSSUZUID0gdGhyaWZ0CitDWFhGTEFHUyA9IGBwa2ctY29uZmlnIC0tY2ZsYWdzIHRocmlmdCB0aHJpZnQtbmJgIC1sZXZlbnQKK0xETElCUyA9IGBwa2ctY29uZmlnIC0tbGlicyB0aHJpZnQgdGhyaWZ0LW5iYCAtbGV2ZW50CitDWFhGTEFHUyArPSAtZyAtTzAKKworR0VOTkFNRVMgPSBBZ2dyIGFnZ3JfdHlwZXMKK0dFTkhFQURFUlMgPSAkKGFkZHN1ZmZpeCAuaCwgJChHRU5OQU1FUykpCitHRU5TUkNTID0gJChhZGRzdWZmaXggLmNwcCwgJChHRU5OQU1FUykpCitHRU5PQkpTID0gJChhZGRzdWZmaXggLm8sICQoR0VOTkFNRVMpKQorCitQWUxJQlMgPSBhZ2dyL19faW5pdF9fLnB5CisKK1BST0dTID0gIHRlc3Qtc2VydmVyCisKK2FsbDogJChQWUxJQlMpICQoUFJPR1MpCisKK3Rlc3Qtc2VydmVyOiB0ZXN0LXNlcnZlci5vICQoR0VOT0JKUykKKwordGVzdC1zZXJ2ZXIubzogJChHRU5TUkNTKQorCithZ2dyL19faW5pdF9fLnB5OiBhZ2dyLnRocmlmdAorCSQoUk0pICQoZGlyICRAKQorCSQoVEhSSUZUKSAtLWdlbiBweTpuZXdzdHlsZSAkPAorCW12IGdlbi1weS8kKGRpciAkQCkgLgorCiskKEdFTlNSQ1MpOiBhZ2dyLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHA6Y29iX3N0eWxlICQ8CisJbXYgJChhZGRwcmVmaXggZ2VuLWNwcC8sICQoR0VOU1JDUykgJChHRU5IRUFERVJTKSkgLgorCitjbGVhbjoKKwkkKFJNKSAtciAqLm8gJChQUk9HUykgJChHRU5TUkNTKSAkKEdFTkhFQURFUlMpIGdlbi0qIGFnZ3IKKworLlBIT05ZOiBjbGVhbgpkaWZmIC0tZ2l0IGEvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0IGIvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTZhNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKQEAgLTAsMCArMSw4IEBACitleGNlcHRpb24gRXJyb3IgeworICAxOiBzdHJpbmcgZGVzYzsKK30KKworc2VydmljZSBBZ2dyIHsKKyAgdm9pZCBhZGRWYWx1ZSgxOiBpMzIgdmFsdWUpOworICBsaXN0PGkzMj4gZ2V0VmFsdWVzKCkgdGhyb3dzICgxOiBFcnJvciBlcnIpOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9hc3luYy10ZXN0L3Rlc3QtbGVhZi5weSBiL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LWxlYWYucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGVhNGE5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LWxlYWYucHkKQEAgLTAsMCArMSwyNCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVEh0dHBTZXJ2ZXIKK2Zyb20gYWdnciBpbXBvcnQgQWdncgorCisKK2NsYXNzIEFnZ3JIYW5kbGVyKEFnZ3IuSWZhY2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbXQorCisgICAgZGVmIGFkZFZhbHVlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi52YWx1ZXMuYXBwZW5kKHZhbHVlKQorCisgICAgZGVmIGdldFZhbHVlcyhzZWxmLCApOgorICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlcworCitwcm9jZXNzb3IgPSBBZ2dyLlByb2Nlc3NvcihBZ2dySGFuZGxlcigpKQorcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCitUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgaW50KHN5cy5hcmd2WzFdKSksIHBmYWN0b3J5KS5zZXJ2ZSgpCmRpZmYgLS1naXQgYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1zZXJ2ZXIuY3BwIGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3Qtc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzA0ZTFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3Qtc2VydmVyLmNwcApAQCAtMCwwICsxLDk3IEBACisjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+CisjaW5jbHVkZSAiQWdnci5oIgorCit1c2luZyBzdGQ6OnRyMTo6YmluZDsKK3VzaW5nIHN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8xOworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEV2aHR0cFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNCdWZmZXJQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY1Byb3RvY29sUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpURXZodHRwQ2xpZW50Q2hhbm5lbDsKKworY2xhc3MgQWdnckFzeW5jSGFuZGxlciA6IHB1YmxpYyBBZ2dyQ29iU3ZJZiB7CisgcHJvdGVjdGVkOgorICBzdHJ1Y3QgUmVxdWVzdENvbnRleHQgeworICAgIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJldDsKKyAgICBpbnQgcGVuZGluZ19jYWxsczsKKyAgfTsKKworIHB1YmxpYzoKKyAgQWdnckFzeW5jSGFuZGxlcigpCisgICAgOiBlYl8oTlVMTCkKKyAgICAsIHBmYWN0XyhuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorICB7CisgICAgbGVhZl9wb3J0c18ucHVzaF9iYWNrKDgwODEpOworICAgIGxlYWZfcG9ydHNfLnB1c2hfYmFjayg4MDgyKTsKKyAgfQorCisgIHZvaWQgYWRkVmFsdWUoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBpbnQzMl90IHZhbHVlKSB7CisgICAgLy8gU2lsZW50bHkgZHJvcCB3cml0ZXMgdG8gdGhlIGFnZ3JnYXRvci4KKyAgICByZXR1cm4gY29iKCk7CisgIH0KKworICB2b2lkIGdldFZhbHVlcyhzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCgKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYikgeworICAgIFJlcXVlc3RDb250ZXh0KiBjdHggPSBuZXcgUmVxdWVzdENvbnRleHQoKTsKKyAgICBjdHgtPmNvYiA9IGNvYjsKKyAgICBjdHgtPnBlbmRpbmdfY2FsbHMgPSBsZWFmX3BvcnRzXy5zaXplKCk7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxpbnQ+OjppdGVyYXRvciBpdCA9IGxlYWZfcG9ydHNfLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IGxlYWZfcG9ydHNfLmVuZCgpOyArK2l0KSB7CisgICAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNDaGFubmVsPiBjaGFubmVsKAorICAgICAgICAgIG5ldyBURXZodHRwQ2xpZW50Q2hhbm5lbCgKKyAgICAgICAgICAgICJsb2NhbGhvc3QiLCAiLyIsICIxMjcuMC4wLjEiLCAqaXQsIGViXykpOworICAgICAgQWdnckNvYkNsaWVudCogY2xpZW50ID0gbmV3IEFnZ3JDb2JDbGllbnQoY2hhbm5lbCwgcGZhY3RfLmdldCgpKTsKKyAgICAgIGNsaWVudC0+Z2V0VmFsdWVzKHN0ZDo6dHIxOjpiaW5kKCZBZ2dyQXN5bmNIYW5kbGVyOjpjbGllbnRSZXR1cm4sIHRoaXMsIGN0eCwgXzEpKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldEV2ZW50QmFzZShzdHJ1Y3QgZXZlbnRfYmFzZSogZWIpIHsKKyAgICBlYl8gPSBlYjsKKyAgfQorCisgIHZvaWQgY2xpZW50UmV0dXJuKFJlcXVlc3RDb250ZXh0KiBjdHgsIEFnZ3JDb2JDbGllbnQqIGNsaWVudCkgeworICAgIGN0eC0+cGVuZGluZ19jYWxscyAtPSAxOworCisgICAgdHJ5IHsKKyAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHN1YnJldDsKKyAgICAgIGNsaWVudC0+cmVjdl9nZXRWYWx1ZXMoc3VicmV0KTsKKyAgICAgIGN0eC0+cmV0Lmluc2VydChjdHgtPnJldC5lbmQoKSwgc3VicmV0LmJlZ2luKCksIHN1YnJldC5lbmQoKSk7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZXhuKSB7CisgICAgICAvLyBUT0RPOiBMb2cgZXJyb3IKKyAgICB9CisKKyAgICBkZWxldGUgY2xpZW50OworCisgICAgaWYgKGN0eC0+cGVuZGluZ19jYWxscyA9PSAwKSB7CisgICAgICBjdHgtPmNvYihjdHgtPnJldCk7CisgICAgICBkZWxldGUgY3R4OworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWJfOworICBzdGQ6OnZlY3RvcjxpbnQ+IGxlYWZfcG9ydHNfOworICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87Cit9OworCisKK2ludCBtYWluKCkgeworICBib29zdDo6c2hhcmVkX3B0cjxBZ2dyQXN5bmNIYW5kbGVyPiBoYW5kbGVyKG5ldyBBZ2dyQXN5bmNIYW5kbGVyKCkpOworICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2MobmV3IEFnZ3JBc3luY1Byb2Nlc3NvcihoYW5kbGVyKSk7CisgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IGJ1ZnByb2MobmV3IFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHByb2MsIHBmYWN0KSk7CisgIGJvb3N0OjpzaGFyZWRfcHRyPFRFdmh0dHBTZXJ2ZXI+IHNlcnZlcihuZXcgVEV2aHR0cFNlcnZlcihidWZwcm9jLCA4MDgwKSk7CisgIGhhbmRsZXItPnNldEV2ZW50QmFzZShzZXJ2ZXItPmdldEV2ZW50QmFzZSgpKTsKKyAgc2VydmVyLT5zZXJ2ZSgpOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9NYWtlZmlsZS5hbSBiL2NvbnRyaWIvZmIzMDMvTWFrZWZpbGUuYW0KaW5kZXggZGU3ZmJiNi4uZTc3M2U1MiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9NYWtlZmlsZS5hbQorKysgYi9jb250cmliL2ZiMzAzL01ha2VmaWxlLmFtCkBAIC0yMSwxMSArMjEsMjYgQEAKIAogQFBST0RVQ1RfTUtACiAKLVNVQkRJUlMgPSAuIGNwcCBweQorU1VCRElSUyA9IC4KKworaWYgV0lUSF9DUFAKK1NVQkRJUlMgKz0gY3BwCitlbmRpZgorCitpZiBXSVRIX0pBVkEKK1NVQkRJUlMgKz0gamF2YQorZW5kaWYKKworaWYgV0lUSF9QSFAKK1NVQkRJUlMgKz0gcGhwCitlbmRpZgorCitpZiBXSVRIX1BZVEhPTgorU1VCRElSUyArPSBweQorZW5kaWYKIAogQlVJTFRfU09VUkNFUyA9CiAKLQogY2xlYW4tbG9jYWw6IGNsZWFuLWNvbW1vbgogCiBAR0xPQkFMX0ZPT1RFUl9NS0AKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvUkVBRE1FIGIvY29udHJpYi9mYjMwMy9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbnRyaWIvZmIzMDMvUkVBRE1FCnJlbmFtZSB0byBjb250cmliL2ZiMzAzL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAgYi9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM2NjEyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVENsaWVudEluZm8uaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisKK1RDbGllbnRJbmZvQ29ubmVjdGlvbjo6VENsaWVudEluZm9Db25uZWN0aW9uKCkgeworICBjYWxsX1trTmFtZUxlbiAtIDFdID0gJ1wwJzsgICAgLy8gaW5zdXJlIE5VTCB0ZXJtaW5hdG9yIGlzIHRoZXJlCisgIGVyYXNlQWRkcigpOworICBlcmFzZUNhbGwoKTsKK30KKwordm9pZCBUQ2xpZW50SW5mb0Nvbm5lY3Rpb246OnJlY29yZEFkZHIoY29uc3Qgc29ja2FkZHIqIGFkZHIpIHsKKyAgZXJhc2VBZGRyKCk7CisgIGluaXRUaW1lKCk7CisgIG5jYWxsc18gPSAwOworICBpZiAoYWRkciAhPSBOVUxMKSB7CisgICAgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisgICAgICBtZW1jcHkoKHZvaWQqKSZhZGRyXy5pcHY0LCAoY29uc3Qgdm9pZCAqKWFkZHIsIHNpemVvZihzb2NrYWRkcl9pbikpOworICAgIH0KKyAgICBlbHNlIGlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgIG1lbWNweSgodm9pZCopJmFkZHJfLmlwdjYsIChjb25zdCB2b2lkICopYWRkciwgc2l6ZW9mKHNvY2thZGRyX2luNikpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRDbGllbnRJbmZvQ29ubmVjdGlvbjo6ZXJhc2VBZGRyKCkgeworICBhZGRyXy5pcHY0LnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7Cit9CisKK2NvbnN0IGNoYXIqIFRDbGllbnRJbmZvQ29ubmVjdGlvbjo6Z2V0QWRkcihjaGFyKiBidWYsIGludCBsZW4pIGNvbnN0IHsKKyAgc3dpdGNoIChhZGRyXy5pcHY0LnNpbl9mYW1pbHkpIHsKKyAgY2FzZSBBRl9JTkVUOgorICAgIHJldHVybiBpbmV0X250b3AoQUZfSU5FVCwgJmFkZHJfLmlwdjQuc2luX2FkZHIsIGJ1ZiwgbGVuKTsKKyAgY2FzZSBBRl9JTkVUNjoKKyAgICByZXR1cm4gaW5ldF9udG9wKEFGX0lORVQ2LCAmYWRkcl8uaXB2Ni5zaW42X2FkZHIsIGJ1ZiwgbGVuKTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCit2b2lkIFRDbGllbnRJbmZvQ29ubmVjdGlvbjo6cmVjb3JkQ2FsbChjb25zdCBjaGFyKiBuYW1lKSB7CisgIHN0cm5jcHkoY2FsbF8sIG5hbWUsIGtOYW1lTGVuIC0gMSk7ICAgLy8gTlVMIHRlcm1pbmF0b3Igc2V0IGluIGNvbnN0cnVjdG9yCisgIG5jYWxsc18rKzsKK30KKwordm9pZCBUQ2xpZW50SW5mb0Nvbm5lY3Rpb246OmVyYXNlQ2FsbCgpIHsKKyAgY2FsbF9bMF0gPSAnXDAnOworfQorCitjb25zdCBjaGFyKiBUQ2xpZW50SW5mb0Nvbm5lY3Rpb246OmdldENhbGwoKSBjb25zdCB7CisgIGlmIChjYWxsX1swXSA9PSAnXDAnKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gY2FsbF87Cit9CisKK3ZvaWQgVENsaWVudEluZm9Db25uZWN0aW9uOjpnZXRUaW1lKHRpbWVzcGVjKiB0aW1lKSBjb25zdCB7CisgICp0aW1lID0gdGltZV87Cit9CisKK3VpbnQ2NF90IFRDbGllbnRJbmZvQ29ubmVjdGlvbjo6Z2V0TkNhbGxzKCkgY29uc3QgeworICByZXR1cm4gbmNhbGxzXzsKK30KKwordm9pZCBUQ2xpZW50SW5mb0Nvbm5lY3Rpb246OmluaXRUaW1lKCkgeworICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdGltZV8pOworfQorCisKK1RDbGllbnRJbmZvQ29ubmVjdGlvbiogVENsaWVudEluZm86OmdldENvbm5lY3Rpb24oaW50IGZkLCBib29sIGdyb3cpIHsKKyAgaWYgKGZkIDwgMCB8fCAoIWdyb3cgJiYgZmQgPj0gaW5mb18uc2l6ZSgpKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiAmaW5mb19bZmRdOworfQorCitzaXplX3QgVENsaWVudEluZm86OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGluZm9fLnNpemUoKTsKK30KKwordm9pZCogVENsaWVudEluZm9TZXJ2ZXJIYW5kbGVyOjpjcmVhdGVDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgKHZvaWQpaW5wdXQ7CisgICh2b2lkKW91dHB1dDsKKyAgcmV0dXJuICh2b2lkKikgbmV3IENvbm5lY3QoJmNsaWVudEluZm9fKTsKK30KKwordm9pZCBUQ2xpZW50SW5mb1NlcnZlckhhbmRsZXI6OmRlbGV0ZUNvbnRleHQodm9pZCogY29ubmVjdGlvbkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgQ29ubmVjdCogY2FsbCA9IHN0YXRpY19jYXN0PENvbm5lY3QqPihjb25uZWN0aW9uQ29udGV4dCk7CisgIGlmIChjYWxsLT5jYWxsSW5mb18pIHsKKyAgICBjYWxsLT5jYWxsSW5mb18tPmVyYXNlQ2FsbCgpOworICB9CisgIGRlbGV0ZSBjYWxsOworfQorCit2b2lkIFRDbGllbnRJbmZvU2VydmVySGFuZGxlcjo6cHJvY2Vzc0NvbnRleHQodm9pZCogY29ubmVjdGlvbkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKKyAgQ29ubmVjdCogY2FsbCA9IHN0YXRpY19jYXN0PENvbm5lY3QqPihjb25uZWN0aW9uQ29udGV4dCk7CisgIGlmIChjYWxsLT5jYWxsSW5mb18gPT0gTlVMTCkgeworICAgIGlmICh0eXBlaWQoKih0cmFuc3BvcnQuZ2V0KCkpKSA9PSB0eXBlaWQoVFNvY2tldCkpIHsKKyAgICAgIFRTb2NrZXQqIHRzb2NrZXQgPSBzdGF0aWNfY2FzdDxUU29ja2V0Kj4odHJhbnNwb3J0LmdldCgpKTsKKyAgICAgIGludCBmZCA9IHRzb2NrZXQtPmdldFNvY2tldEZEKCk7CisgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNhbGwtPmNhbGxJbmZvXyA9IGNhbGwtPmNsaWVudEluZm9fLT5nZXRDb25uZWN0aW9uKGZkLCB0cnVlKTsKKyAgICAgIGFzc2VydChjYWxsLT5jYWxsSW5mb18gIT0gTlVMTCk7CisgICAgICBzb2NrbGVuX3QgbGVuOworICAgICAgICBjYWxsLT5jYWxsSW5mb18tPnJlY29yZEFkZHIodHNvY2tldC0+Z2V0Q2FjaGVkQWRkcmVzcygmbGVuKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVENsaWVudEluZm9TZXJ2ZXJIYW5kbGVyOjpnZXRTdGF0c1N0cmluZ3ModmVjdG9yPHN0cmluZz4mIHJlc3VsdCkgeworICByZXN1bHQuY2xlYXIoKTsKKyAgdGltZXNwZWMgbm93OworICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGNsaWVudEluZm9fLnNpemUoKTsgKytpKSB7CisgICAgVENsaWVudEluZm9Db25uZWN0aW9uKiBpbmZvID0gY2xpZW50SW5mb18uZ2V0Q29ubmVjdGlvbihpLCBmYWxzZSk7CisgICAgY29uc3QgY2hhciogY2FsbFN0ciA9IGluZm8tPmdldENhbGwoKTsKKyAgICBpZiAoY2FsbFN0ciA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjaGFyIGFkZHJCdWZbSU5FVDZfQUREUlNUUkxFTl07CisgICAgY29uc3QgY2hhciogYWRkclN0ciA9IGluZm8tPmdldEFkZHIoYWRkckJ1Ziwgc2l6ZW9mIGFkZHJCdWYpOworICAgIGlmIChhZGRyU3RyID09IE5VTEwpIHsKKyAgICAgIC8vIGNlcnIgPDwgIm5vIGFkZHIhIiA8PCBlbmRsOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgdGltZXNwZWMgc3RhcnQ7CisgICAgaW5mby0+Z2V0VGltZSgmc3RhcnQpOworICAgIGRvdWJsZSBzZWNzID0gKGRvdWJsZSkobm93LnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKyAobm93LnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSowLjAwMDAwMDAwMTsKKworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiJWQgJXMgJXMgJS4zZiAlbGx1IiwgaSwgYWRkclN0ciwgY2FsbFN0ciwgc2VjcywKKyAgICAgICAgICAgICAodWludDY0X3QpaW5mby0+Z2V0TkNhbGxzKCkpOworICAgICAgICAgICAgICAgCisgICAgcmVzdWx0LnB1c2hfYmFjayhidWYpOworICB9Cit9CisKK3ZvaWQqIFRDbGllbnRJbmZvQ2FsbEhhbmRsZXI6OmdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgeworICBpZiAoc2VydmVyQ29udGV4dCkgeworICAgIFRDbGllbnRJbmZvQ29ubmVjdGlvbiogY2FsbEluZm8gPSAgc3RhdGljX2Nhc3Q8VENsaWVudEluZm9TZXJ2ZXJIYW5kbGVyOjpDb25uZWN0Kj4oc2VydmVyQ29udGV4dCktPmNhbGxJbmZvXzsKKyAgICBpZiAoY2FsbEluZm8gIT0gTlVMTCkgeworICAgICAgY2FsbEluZm8tPnJlY29yZENhbGwoZm5fbmFtZSk7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCit9IH0gfSAvLyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5oIGIvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjhjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmgKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfRkFDRUJPT0tfVEhSSUZUX1NFUlZFUl9UQ0xJRU5USU5GT19IXworI2RlZmluZSBfRkFDRUJPT0tfVEhSSUZUX1NFUlZFUl9UQ0xJRU5USU5GT19IXyAxCisKKy8vIGZvciBpbmV0X250b3AgLS0KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisvKioKKyAqIFN0YWJsZVZlY3RvciAtLSBhIG1pbmltYWwgdmVjdG9yIGNsYXNzIHdoZXJlIGdyb3d0aCBpcyBhdXRvbWF0aWMgYW5kCisgKiB2ZWN0b3IgZWxlbWVudHMgbmV2ZXIgbW92ZSBhcyB0aGUgdmVjdG9yIGdyb3dzLiAgQWxsb2NhdGVzIG5ldyBzcGFjZQorICogYXMgbmVlZGVkLCBidXQgZG9lcyBub3QgY29weSBvbGQgdmFsdWVzLgorICoKKyAqIEEgbGV2ZWwgdmVjdG9yIHN0b3JlcyBhIGxpc3Qgb2Ygc3RvcmFnZSB2ZWN0b3JzIGNvbnRhaW5pbmcgdGhlIGFjdHVhbAorICogZWxlbWVudHMuICBMZXZlbHMgYXJlIGFkZGVkIGFzIG5lZWRlZCwgZG91YmxpbmcgaW4gc2l6ZSBlYWNoIHRpbWUuCisgKiBMb2NraW5nIGlzIG9ubHkgZG9uZSB3aGVuIGEgbGV2ZWwgaXMgYWRkZWQuICBBY2Nlc3MgaXMgYW1vcnRpemVkCisgKiBjb25zdGFudCB0aW1lLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFN0YWJsZVZlY3RvciB7CisgIC8vLyBUaGUgaW5pdGlhbCBhbGxvY2F0aW9uIGFzIGFuIGV4cG9uZW50IG9mIDIKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtJbml0aWFsU2l6ZVBvd09mMiA9IDEwOworICAvLy8gVGhlIGluaXRpYWwgYWxsb2NhdGlvbiBzaXplCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSW5pdGlhbFZlY3RvclNpemUgPSAxIDw8IGtJbml0aWFsU2l6ZVBvd09mMjsKKyAgLy8vIFRoaXMgYm91bmQgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgZXhjZWVkZWQgb24gNjQtYml0IGFyY2hzCisgIHN0YXRpYyBjb25zdCBpbnQga01heExldmVscyA9IDY0OworCisgIC8vLyBWYWx1ZXMgYXJlIGtlcHQgaW4gb25lIG9yIG1vcmUgb2YgdGhlc2UKKyAgdHlwZWRlZiB2ZWN0b3I8VD4gVmVjdDsKKyAgLy8vIE9uZSBvciBtb3JlIHZhbHVlIHZlY3RvcnMgYXJlIGtlcHQgaW4gb25lIG9mIHRoZXNlCisgIHR5cGVkZWYgdmVjdG9yPFZlY3QqPiBMZXZlbFZlY3RvcjsKKworICBNdXRleCBtdXRleF87CisgIC8vLyBjdXJyZW50IHNpemUKKyAgc2l6ZV90IHNpemVfOworICBfQXRvbWljX3dvcmQgdmVjdEx2bF87CisgIExldmVsVmVjdG9yIHZlY3RzXzsKKworIHB1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIC0tIGluaXRpYWxpemUgdGhlIGxldmVsIHZlY3RvciBhbmQgYWxsb2NhdGUgdGhlCisgICAqIGluaXRpYWwgc3RvcmFnZSB2ZWN0b3IKKyAgICovCisgIFN0YWJsZVZlY3RvcigpCisgICAgOiBzaXplXygwKSAKKyAgICAsIHZlY3RMdmxfKDApIHsKKyAgICB2ZWN0c18ucmVzZXJ2ZShrTWF4TGV2ZWxzKTsKKyAgICBWZWN0KiBzdG9yYWdlVmVjdG9yKG5ldyBWZWN0KDEgPDwga0luaXRpYWxTaXplUG93T2YyKSk7CisgICAgdmVjdHNfLnB1c2hfYmFjayhzdG9yYWdlVmVjdG9yKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLyoqCisgICAqIG1ha2Ugc3VyZSB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBzdG9yYWdlIGxldmVscyBoYXZlIGJlZW4gYWxsb2NhdGVkLgorICAgKi8KKyAgdm9pZCBleHBhbmQodWludDMyX3QgbGV2ZWwpIHsKKyAgICAvLyB3ZSBuZWVkIHRoZSBndWFyZCB0byBpbnN1cmUgdGhhdCB3ZSBvbmx5IGFsbG9jYXRlIG9uY2UuCisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHdoaWxlIChsZXZlbCA+IHZlY3RMdmxfKSB7CisgICAgICBWZWN0KiBsZXZlbFZlY3QobmV3IFZlY3QoMSA8PCAodmVjdEx2bF8gKyBrSW5pdGlhbFNpemVQb3dPZjIpKSk7CisgICAgICB2ZWN0c18ucHVzaF9iYWNrKGxldmVsVmVjdCk7CisgICAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIGRvbmUgYWZ0ZXIgbGV2ZWxWZWN0IGlzIGluc2VydGVkCisgICAgICAvLyAod2hhdCB3ZSB3YW50IGlzIGVmZmVjdGl2ZWx5IGEgbWVtb3J5IGJhcnJpZXIgaGVyZSkuCisgICAgICBfX2dudV9jeHg6Ol9fYXRvbWljX2FkZCgmdmVjdEx2bF8sIDEpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhbiBpbmRleCwgZGV0ZXJtaW5lIHdoaWNoIGxldmVsIGFuZCBlbGVtZW50IG9mIHRoYXQgbGV2ZWwgaXMKKyAgICogcmVxdWlyZWQuICBHcm93cyBpZiBuZWVkZWQuCisgICAqLworICB2b2lkIHdoaWNoKHVpbnQzMl90IG4sIHVpbnQzMl90KiB2bm8sIHVpbnQzMl90KiBpZHgpIHsKKyAgICBpZiAobiA+PSBzaXplXykgeworICAgICAgc2l6ZV8gPSBuICsgMTsKKyAgICB9CisgICAgaWYgKG4gPCBrSW5pdGlhbFZlY3RvclNpemUpIHsKKyAgICAgICppZHggPSBuOworICAgICAgKnZubyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQzMl90IHVwcGVyID0gbiA+PiBrSW5pdGlhbFNpemVQb3dPZjI7CisgICAgICAqdm5vID0gQ0hBUl9CSVQqc2l6ZW9mKHVwcGVyKSAtIF9fYnVpbHRpbl9jbHoodXBwZXIpOworICAgICAgKmlkeCA9IG4gLSAoMSA8PCAoKnZubyArIGtJbml0aWFsU2l6ZVBvd09mMiAtIDEpKTsKKyAgICAgIGlmICgqdm5vID4gdmVjdEx2bF8pIHsKKyAgICAgICAgZXhwYW5kKCp2bm8pOworICAgICAgfQorICAgIH0KKyAgfQorCisgcHVibGljOgorICAvKioKKyAgICogR2l2ZW4gYW4gaW5kZXgsIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGF0IGVsZW1lbnQsIHBlcmhhcHMgYWZ0ZXIKKyAgICogYWxsb2NhdGluZyBhZGRpdGlvbmFsIHNwYWNlLgorICAgKgorICAgKiBAcGFyYW0gbiBhIHBvc2l0aXZlIGludGVnZXIKKyAgICovCisgIFQmIG9wZXJhdG9yW10odWludDMyX3QgbikgeworICAgIHVpbnQzMl90IHZubzsKKyAgICB1aW50MzJfdCBpZHg7CisgICAgd2hpY2gobiwgJnZubywgJmlkeCk7CisgICAgcmV0dXJuICgqdmVjdHNfW3Zub10pW2lkeF07CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBwcmVzZW50IHNpemUgb2YgdGhlIHZlY3Rvci4KKyAgICovCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KK307CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGVtYm9kaWVzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBjb25uZWN0aW9uIGR1cmluZworICogcHJvY2Vzc2luZy4gIFdlJ2xsIGtlZXAgb25lIG9mIHRoZXNlIHBlciBmaWxlIGRlc2NyaXB0b3IgaW4gVENsaWVudEluZm8uCisgKi8KK2NsYXNzIFRDbGllbnRJbmZvQ29ubmVjdGlvbiB7CisgcHVibGljOgorICBjb25zdCBzdGF0aWMgaW50IGtOYW1lTGVuID0gMzI7CisKKyBwcml2YXRlOgorICB0eXBlZGVmIHVuaW9uIElQQWRkclVuaW9uIHsKKyAgICBzb2NrYWRkcl9pbiBpcHY0OworICAgIHNvY2thZGRyX2luNiBpcHY2OworICB9OworCisgIGNoYXIgY2FsbF9ba05hbWVMZW5dOyAgICAgICAgICAgIC8vLzwgVGhlIG5hbWUgb2YgdGhlIHRocmlmdCBjYWxsCisgIElQQWRkclVuaW9uIGFkZHJfOyAgICAgICAgICAgICAgIC8vLzwgVGhlIGNsaWVudCdzIElQIGFkZHJlc3MKKyAgdGltZXNwZWMgdGltZV87ICAgICAgICAgICAgICAgICAgLy8vPCBUaW1lIHByb2Nlc3Npbmcgc3RhcnRlZAorICB1aW50NjRfdCBuY2FsbHNfOyAgICAgICAgICAgICAgICAvLy88ICMgb2YgY2FsbHMgcHJvY2Vzc2VkCisKKyBwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvcjsgaW5zdXJlIHRoYXQgbm8gY2xpZW50IGFkZHJlc3Mgb3IgdGhyaWZ0IGNhbGwgbmFtZSBpcworICAgKiByZXByZXNlbnRlZC4KKyAgICovCisgIFRDbGllbnRJbmZvQ29ubmVjdGlvbigpOworCisgIC8qKgorICAgKiBBIGNvbm5lY3Rpb24gaGFzIGJlZW4gbWFkZTsgcmVjb3JkIGl0cyBhZGRyZXNzLiAgU2luY2UgdGhpcyBpcyB0aGUKKyAgICogZmlyc3Qgd2UnbGwga25vdyBvZiBhIGNvbm5lY3Rpb24gd2Ugc3RhcnQgdGhlIHRpbWVyIGhlcmUgYXMgd2VsbC4KKyAgICovCisgIHZvaWQgcmVjb3JkQWRkcihjb25zdCBzb2NrYWRkciogYWRkcik7CisKKyAgLyoqCisgICAqIE1hcmsgdGhlIGFkZHJlc3MgYXMgZW1wdHkvdW5rbm93bi4KKyAgICovCisgIHZvaWQgZXJhc2VBZGRyKCk7CisKKyAgLyoqCisgICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByZXNlbnQgYWRkcmVzcywgb3IgTlVMTCBpZiBub25lLgorICAgKiBDb3BpZXMgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgcHJvdmlkZWQuCisgICAqLworICBjb25zdCBjaGFyKiBnZXRBZGRyKGNoYXIqIGJ1ZiwgaW50IGxlbikgY29uc3Q7CisKKyAgLyoqCisgICAqIEEgY2FsbCBoYXMgYmVlbiBtYWRlIG9uIHRoaXMgY29ubmVjdGlvbjsgcmVjb3JkIGl0cyBuYW1lLiAgU2luY2UgdGhpcyBpcworICAgKiBjYWxsZWQgZm9yIGV2ZXJ5IHRocmlmdCBjYWxsIHByb2Nlc3NlZCwgd2UgYWxzbyBkbyBvdXIgY2FsbCBjb3VudCBoZXJlLgorICAgKi8gCisgIHZvaWQgcmVjb3JkQ2FsbChjb25zdCBjaGFyKiBuYW1lKTsKKworICAvKioKKyAgICogSW52b2tlZCB3aGVuIHByb2Nlc3NpbmcgaGFzIGVuZGVkIHRvIGNsZWFyIHRoZSBjYWxsIG5hbWUuCisgICAqLworICB2b2lkIGVyYXNlQ2FsbCgpOworCisgIC8qKgorICAgKiBSZXR1cm4gYXMgc3RyaW5nIHRoZSB0aHJpZnQgY2FsbCBlaXRoZXIgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBvcgorICAgKiBtb3N0IHJlY2VudGx5IHByb2Nlc3NlZCBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBvcGVuIGZvciBhZGRpdGlvbmFsCisgICAqIGNhbGxzLiAgUmV0dXJucyBOVUxMIGlmIGEgY2FsbCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciBwcm9jZXNzaW5nCisgICAqIGhhcyBlbmRlZC4KKyAgICovCisgIGNvbnN0IGNoYXIqIGdldENhbGwoKSBjb25zdDsKKworICAvKioKKyAgICogR2V0IHRoZSB0aW1lc3BlYyBmb3IgdGhlIHN0YXJ0IG9mIHRoaXMgY29ubmVjdGlvbiAoc3BlY2lmaWNhbGx5LCB3aGVuCisgICAqIHJlY29yZEFkZHIoKSB3YXMgZmlyc3QgY2FsbGVkKS4KKyAgICovCisgIHZvaWQgZ2V0VGltZSh0aW1lc3BlYyogdGltZSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNhbGxzIG1hZGUgb24gdGhpcyBjb25uZWN0aW9uLgorICAgKi8KKyAgdWludDY0X3QgZ2V0TkNhbGxzKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB2b2lkIGluaXRUaW1lKCk7Cit9OworCisKKy8qKgorICogU3RvcmUgZm9yIGluZm8gYWJvdXQgYSBzZXJ2ZXIncyBjbGllbnRzIC0tIHNwZWNpZmljYWxseSwgdGhlIGNsaWVudCdzIElQCisgKiBhZGRyZXNzIGFuZCB0aGUgY2FsbCBpdCBpcyBleGVjdXRpbmcuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluZGV4ZWQgYnkKKyAqIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgYW5kIGluIHRoZSBwcmVzZW50IGltcGxlbWVudGF0aW9uIGlzIHVwZGF0ZWQKKyAqIGFzeW5jaHJvbm91c2x5LCBzbyBpdCBtYXkgb25seSBhcHByb3hpbWF0ZSByZWFsaXR5LgorICovCitjbGFzcyBUQ2xpZW50SW5mbyB7CisgcHJpdmF0ZToKKyAgU3RhYmxlVmVjdG9yPFRDbGllbnRJbmZvQ29ubmVjdGlvbj4gaW5mb187CisKKyBwdWJsaWM6CisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGluZm8gb2JqZWN0IGZvciBhIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4gIElmICJncm93IiBpcyB0cnVlCisgICAqIGV4dGVuZCB0aGUgaW5mbyB2ZWN0b3IgaWYgcmVxdWlyZWQgKHN1Y2ggYXMgZm9yIGEgZmlsZSBkZXNjcmlwdG9yIG5vdCBzZWVuCisgICAqIGJlZm9yZSkuICBJZiAiZ3JvdyIgaXMgZmFsc2UgYW5kIHRoZSBpbmZvIHZlY3RvciBpc24ndCBsYXJnZSBlbm91Z2gsCisgICAqIG9yIGlmICJmZCIgaXMgbmVnYXRpdmUsIHJldHVybiBOVUxMLgorICAgKi8KKyAgVENsaWVudEluZm9Db25uZWN0aW9uKiBnZXRDb25uZWN0aW9uKGludCBmZCwgYm9vbCBncm93KTsKKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworfTsKKworLyoqCisgKiBUaGlzIGRlcml2YXRpb24gb2YgVFNlcnZlckV2ZW50SGFuZGxlciBlbmNhcHN1bGF0ZXMgdGhlIG1haW4gc3RhdHVzIHZlY3RvcgorICogYW5kIHByb3ZpZGVzIGNvbnRleHQgdG8gdGhlIHNlcnZlcidzIHByb2Nlc3NpbmcgbG9vcCB2aWEgb3ZlcnJpZGVzLgorICogVG9nZXRoZXIgd2l0aCBUQ2xpZW50SW5mb0NhbGxIYW5kbGVyIChkZXJpdmVkIGZyb20gVFByb2Nlc3NvckV2ZW50SGFuZGxlcikgCisgKiBpdCBpbnRlZ3JhdGVzIGNsaWVudCBpbmZvIGNvbGxlY3Rpb24gaW50byB0aGUgc2VydmVyLgorICovCitjbGFzcyBUQ2xpZW50SW5mb1NlcnZlckhhbmRsZXIgOiBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciB7CisgcHJpdmF0ZToKKyAgVENsaWVudEluZm8gY2xpZW50SW5mb187CisKKyBwdWJsaWM6CisgIC8qKgorICAgKiBPbmUgb2YgdGhlc2UgaXMgY29uc3RydWN0ZWQgZm9yIGVhY2ggb3BlbiBjb25uZWN0aW9uL2Rlc2NyaXB0b3IgYW5kIGxpbmtzCisgICAqIHRvIGJvdGggdGhlIHN0YXR1cyB2ZWN0b3IgKGNsaWVudEluZm9fKSBhbmQgdGhhdCBkZXNjcmlwdG9yJ3MgZW50cnkKKyAgICogd2l0aGluIGl0LgorICAgKi8KKyAgc3RydWN0IENvbm5lY3QgeworICAgIFRDbGllbnRJbmZvKiBjbGllbnRJbmZvXzsKKyAgICBUQ2xpZW50SW5mb0Nvbm5lY3Rpb24qIGNhbGxJbmZvXzsKKworICAgIGV4cGxpY2l0IENvbm5lY3QoVENsaWVudEluZm8qIGNsaWVudEluZm8pCisgICAgICA6IGNsaWVudEluZm9fKGNsaWVudEluZm8pCisgICAgICAsIGNhbGxJbmZvXyhOVUxMKSB7CisgICAgfQorICB9OworCisgIC8qKgorICAgKiBHZW5lcmF0ZSBwcm9jZXNzb3IgY29udGV4dDsgd2UgZG9uJ3Qga25vdyB3aGF0IGRlc2NyaXB0b3Igd2UgYmVsb25nIHRvCisgICAqIHlldCAtLSB3ZSdsbCBnZXQgaG9va2VkIHVwIGluIGNvbnRleHRQcm9jZXNzKCkuIAorICAgKi8KKyAgdm9pZCogY3JlYXRlQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KTsKKworICAvKioKKyAgICogTWFyayBvdXIgc2xvdCBhcyB1bnVzZWQgYW5kIGRlbGV0ZSB0aGUgY29udGV4dCBjcmVhdGVkIGluIGNyZWF0ZUNvbnRleHQoKS4KKyAgICovCisgIHZvaWQgZGVsZXRlQ29udGV4dCh2b2lkKiBwcm9jZXNzb3JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KTsKKyAgCisgIC8qKgorICAgKiBDYWxsZWQgaW4gdGhlIHByb2Nlc3NpbmcgbG9vcCBqdXN0IGJlZm9yZSB0aGUgc2VydmVyIGludm9rZXMgdGhlCisgICAqIHByb2Nlc3NvciBpdHNlbGYsIG9uIHRoZSBmaXJzdCBjYWxsIHdlIGVzdGFibGlzaCB3aGljaCBkZXNjcmlwdG9yCisgICAqIHdlIGNvcnJlc3BvbmQgdG8gYW5kIHNldCBpdCB0byB0aGF0IHNvY2tldCdzIHBlZXIgSVAgYWRkcmVzcy4gIFRoaXMKKyAgICogYWxzbyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGluaXRpYWxpemluZyBjYWxsIGNvdW50aW5nIGFuZCBjb25uZWN0aW9uCisgICAqIHRpbWluZy4gIFdlIHdvbid0IGtub3cgd2hpY2ggY2FsbCB3ZSdyZSBoYW5kbGluZyB1bnRpbCB0aGUgaGFuZGxlcgorICAgKiBmaXJzdCBnZXRzIGNhbGxlZCBpbiBUQ2xpZW50SW5mb0NhbGxIYW5kbGVyOjpnZXRDb250ZXh0KCkuCisgICAqLworICB2b2lkIHByb2Nlc3NDb250ZXh0KHZvaWQqIHByb2Nlc3NvckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpOworCisgIC8qKgorICAgKiBHZXQgc3RhdHVzIHJlcG9ydCBmb3Igc2VydmVyIGluIHRoZSBmb3JtIG9mIGEgdmVjdG9yIG9mIHN0cmluZ3MuCisgICAqIEVhY2ggYWN0aXZlIGNsaWVudCBhcHBlYXJzIGFzIG9uZSBzdHJpbmcgaW4gdGhlIGZvcm1hdDoKKyAgICoKKyAgICogICAgIEZEIElQQUREUiBDQUxMTkFNRSBEVVJBVElPTiBOQ0FMTFMKKyAgICoKKyAgICogd2hlcmUgIkZEIiBpcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgY2xpZW50J3Mgc29ja2V0LCAiSVBBRERSIgorICAgKiBpcyB0aGUgSVAgYWRkcmVzcyAoYXMgcmVwb3J0ZWQgYnkgYWNjZXB0KCkpLCAiQ0FMTE5BTUUiIGlzIHRoZQorICAgKiBjdXJyZW50IG9yIG1vc3QgcmVjZW50IFRocmlmdCBmdW5jdGlvbiBuYW1lLCAiRFVSQVRJT04iIGlzIHRoZQorICAgKiBkdXJhdGlvbiBvZiB0aGUgY29ubmVjdGlvbiwgd2hpbGUgTkNBTExTIGlzIHRoZSBudW1iZXIgb2YgVGhyaWZ0CisgICAqIGNhbGxzIG1hZGUgc2luY2UgdGhlIGNvbm5lY3Rpb24gd2FzIG1hZGUuICBBIHNpbmdsZSBzcGFjZSBzZXBhcmF0ZXMKKyAgICogZmllbGRzLgorICAgKi8KKyAgdm9pZCBnZXRTdGF0c1N0cmluZ3ModmVjdG9yPHN0cmluZz4mIHJlc3VsdCk7Cit9OworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVyaXZlcyBmcm9tIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhlCisgKiBmdW5jdGlvbiBuYW1lIGZvciB0aGUgY3VycmVudCBUaHJpZnQgY2FsbC4gIFdlIG5lZWQgdHdvIHZlcnNpb25zIG9mCisgKiB0aGlzIC0tIFRDbGllbnRJbmZvQ2FsbFN0YXRzSGFuZGxlciBpcyB0aGUgb3RoZXIgLS0gc2luY2UgaW4gdGhlIGxhdHRlcgorICogY2FzZSB3ZSBwYXNzIHRocm91Z2ggdG8gVEZ1bmN0aW9uU3RhdEhhbmRsZXIgdG8gcGVyZm9ybSBUaHJpZnQgY2FsbAorICogc3RhdHMuCisgKi8KK2NsYXNzIFRDbGllbnRJbmZvQ2FsbEhhbmRsZXIgOiBwdWJsaWMgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCk7Cit9OworCit9IH0gfSAvLyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gIV9GQUNFQk9PS19USFJJRlRfU0VSVkVSX1RDTElFTlRJTkZPX0hfCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00IGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGM5MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApAQCAtMCwwICsxLDEzNCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtleHR8bm9leHRdLFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIGZvciBiYXNlbGluZSBsYW5ndWFnZSBjb3ZlcmFnZSBpbiB0aGUgY29tcGlsZXIgZm9yIHRoZSBDKysxMQorIyAgIHN0YW5kYXJkOyBpZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFhGTEFHUyB0byBlbmFibGUgc3VwcG9ydC4KKyMKKyMgICBUaGUgZmlyc3QgYXJndW1lbnQsIGlmIHNwZWNpZmllZCwgaW5kaWNhdGVzIHdoZXRoZXIgeW91IGluc2lzdCBvbiBhbgorIyAgIGV4dGVuZGVkIG1vZGUgKGUuZy4gLXN0ZD1nbnUrKzExKSBvciBhIHN0cmljdCBjb25mb3JtYW5jZSBtb2RlIChlLmcuCisjICAgLXN0ZD1jKysxMSkuICBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwgeW91IGdldCB3aGF0ZXZlciB3b3Jrcywgd2l0aAorIyAgIHByZWZlcmVuY2UgZm9yIGFuIGV4dGVuZGVkIG1vZGUuCisjCisjICAgVGhlIHNlY29uZCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkICdtYW5kYXRvcnknIG9yIGlmIGxlZnQgdW5zcGVjaWZpZWQsCisjICAgaW5kaWNhdGVzIHRoYXQgYmFzZWxpbmUgQysrMTEgc3VwcG9ydCBpcyByZXF1aXJlZCBhbmQgdGhhdCB0aGUgbWFjcm8KKyMgICBzaG91bGQgZXJyb3Igb3V0IGlmIG5vIG1vZGUgd2l0aCB0aGF0IHN1cHBvcnQgaXMgZm91bmQuICBJZiBzcGVjaWZpZWQKKyMgICAnb3B0aW9uYWwnLCB0aGVuIGNvbmZpZ3VyYXRpb24gcHJvY2VlZHMgcmVnYXJkbGVzcywgYWZ0ZXIgZGVmaW5pbmcKKyMgICBIQVZFX0NYWDExIGlmIGFuZCBvbmx5IGlmIGEgc3VwcG9ydGluZyBtb2RlIGlzIGZvdW5kLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMiBaYWNrIFdlaW5iZXJnIDx6YWNrd0BwYW5peC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEzIFJveSBTdG9nbmVyIDxyb3lzdGduckBpY2VzLnV0ZXhhcy5lZHU+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDMKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSwgWworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY2hlY2sKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQpIDw9IHNpemVvZihUKSwgIm5vdCBiaWcgZW5vdWdoIik7CisgICAgfTsKKworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8Ym9vbD4+IHJpZ2h0X2FuZ2xlX2JyYWNrZXRzOworCisgICAgaW50IGE7CisgICAgZGVjbHR5cGUoYSkgYjsKKworICAgIHR5cGVkZWYgY2hlY2s8aW50PiBjaGVja190eXBlOworICAgIGNoZWNrX3R5cGUgYzsKKyAgICBjaGVja190eXBlJiYgY3IgPSBzdGF0aWNfY2FzdDxjaGVja190eXBlJiY+KGMpOworCisgICAgYXV0byBkID0gYTsKK10pCisKK0FDX0RFRlVOKFtBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdLCBbZG5sCisgIG00X2lmKFskMV0sIFtdLCBbXSwKKyAgICAgICAgWyQxXSwgW2V4dF0sIFtdLAorICAgICAgICBbJDFdLCBbbm9leHRdLCBbXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIGFyZ3VtZW50IGAkMScgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSldKWRubAorICBtNF9pZihbJDJdLCBbXSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPXRydWVdLAorICAgICAgICBbJDJdLCBbbWFuZGF0b3J5XSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPXRydWVdLAorICAgICAgICBbJDJdLCBbb3B0aW9uYWxdLCBbYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQ9ZmFsc2VdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgc2Vjb25kIGFyZ3VtZW50IGAkMicgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSldKWRubAorICBBQ19MQU5HX1BVU0goW0MrK10pZG5sCisgIGFjX3N1Y2Nlc3M9bm8KKyAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIGJ5IGRlZmF1bHQsCisgIGF4X2N2X2N4eF9jb21waWxlX2N4eDExLAorICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAorICAgIFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMT15ZXNdLAorICAgIFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMT1ub10pXSkKKyAgaWYgdGVzdCB4JGF4X2N2X2N4eF9jb21waWxlX2N4eDExID0geHllczsgdGhlbgorICAgIGFjX3N1Y2Nlc3M9eWVzCisgIGZpCisKKyAgbTRfaWYoWyQxXSwgW25vZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBmb3Igc3dpdGNoIGluIC1zdGQ9Z251KysxMTsgZG8KKyAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMV8kc3dpdGNoXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgIFthY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCisgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldKV0sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyJdKQorICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgorICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKworICBtNF9pZihbJDFdLCBbZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBmb3Igc3dpdGNoIGluIC1zdGQ9YysrMTE7IGRvCisgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTFfJHN3aXRjaF0pCisgICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrMTEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAorICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICBbYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgorICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiXSkKKyAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKKyAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaV0pCisgIEFDX0xBTkdfUE9QKFtDKytdKQorICBpZiB0ZXN0IHgkYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQgPSB4dHJ1ZTsgdGhlbgorICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgICBBQ19NU0dfRVJST1IoWyoqKiBBIGNvbXBpbGVyIHdpdGggc3VwcG9ydCBmb3IgQysrMTEgbGFuZ3VhZ2UgZmVhdHVyZXMgaXMgcmVxdWlyZWQuXSkKKyAgICBmaQorICBlbHNlCisgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICAgIEhBVkVfQ1hYMTE9MAorICAgICAgQUNfTVNHX05PVElDRShbTm8gY29tcGlsZXIgd2l0aCBDKysxMSBzdXBwb3J0IHdhcyBmb3VuZF0pCisgICAgZWxzZQorICAgICAgSEFWRV9DWFgxMT0xCisgICAgICBBQ19ERUZJTkUoSEFWRV9DWFgxMSwxLAorICAgICAgICAgICAgICAgIFtkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGJhc2ljIEMrKzExIHN5bnRheF0pCisgICAgZmkKKworICAgIEFDX1NVQlNUKEhBVkVfQ1hYMTEpCisgIGZpCitdKQorCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQgYi9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxYjQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNApAQCAtMCwwICsxLDEyMSBAQAorZG5sIEBzeW5vcHNpcyBBWF9KQVZBQ19BTkRfSkFWQQorZG5sIEBzeW5vcHNpcyBBWF9DSEVDS19KQVZBX0NMQVNTKENMQVNTTkFNRSkKK2RubAorZG5sIFRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIEpESywgYW5kIChvcHRpb25hbGx5KSBzcGVjaWZpYyBjbGFzc2VzLgorZG5sCitkbmwgSWYgIkpBVkEiIGlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LCB0aGF0IHdpbGwgYmUgdGhlIG9ubHkKK2RubCBqYXZhIGNvbW1hbmQgdGVzdGVkLiAgT3RoZXJ3aXNlLCBhIGhhcmQtY29kZWQgbGlzdCB3aWxsIGJlIHVzZWQuCitkbmwgU2ltaWxhcmx5IGZvciAiSkFWQUMiLgorZG5sCitkbmwgQVhfSkFWQUNfQU5EX0pBVkEgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyCitkbmwgSmF2YSB2ZXJzaW9uLCB0ZXN0aW5nIGZvciBvbmx5IG9uZSBvZiAiamF2YSIgYW5kICJqYXZhYyIsIG9yCitkbmwgY29tcGlsaW5nIG9yIHJ1bm5pbmcgdXNlci1wcm92aWRlZCBKYXZhIGNvZGUuCitkbmwKK2RubCBBZnRlciBBWF9KQVZBQ19BTkRfSkFWQSBydW5zLCB0aGUgc2hlbGwgdmFyaWFibGVzICJzdWNjZXNzIiBhbmQKK2RubCAiYXhfamF2YWNfYW5kX2phdmEiIGFyZSBzZXQgdG8gInllcyIgb3IgIm5vIiwgYW5kICJKQVZBQyIgYW5kCitkbmwgIkpBVkEiIGFyZSBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmRzLgorZG5sCitkbmwgQVhfQ0hFQ0tfSkFWQV9DTEFTUyBtdXN0IGJlIHJ1biBhZnRlciBBWF9KQVZBQ19BTkRfSkFWQS4KK2RubCBJdCB0ZXN0cyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgY2xhc3MgYmFzZWQgb24gYSBmdWxseS1xdWFsaWZpZWQgbmFtZS4KK2RubCBJdCBzZXRzIHRoZSBzaGVsbCB2YXJpYWJsZSAic3VjY2VzcyIgdG8gInllcyIgb3IgIm5vIi4KK2RubAorZG5sIEBjYXRlZ29yeSBKYXZhCitkbmwgQHZlcnNpb24gMjAwOS0wMi0wOQorZG5sIEBsaWNlbnNlIEFsbFBlcm1pc3NpdmUKK2RubAorZG5sIENvcHlyaWdodCAoQykgMjAwOSBEYXZpZCBSZWlzcworZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCitkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Citkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCisKK0FDX0RFRlVOKFtBWF9KQVZBQ19BTkRfSkFWQV0sCisgICAgICAgICBbCisKKyAgICAgICAgICBkbmwgSGFyZC1jb2RlZCBkZWZhdWx0IGNvbW1hbmRzIHRvIHRlc3QuCisgICAgICAgICAgSkFWQUNfUFJPR1M9ImphdmFjLGppa2VzLGdjaiAtQyIKKyAgICAgICAgICBKQVZBX1BST0dTPSJqYXZhLGthZmZlIgorCisgICAgICAgICAgZG5sIEFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJEpBVkFDIiA7IHRoZW4KKyAgICAgICAgICAgIEpBVkFDX1BST0dTPSIkSkFWQUMiCisgICAgICAgICAgZmkKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkSkFWQSIgOyB0aGVuCisgICAgICAgICAgICBKQVZBX1BST0dTPSIkSkFWQSIKKyAgICAgICAgICBmaQorCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBqYXZhYyBhbmQgamF2YSkKKworICAgICAgICAgIGVjaG8gInB1YmxpYyBjbGFzcyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhIHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NAPDpAQDo+QCkgeyB9IH0iID4gY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhCisgICAgICAgICAgc3VjY2Vzcz1ubworICAgICAgICAgIG9JRlM9IiRJRlMiCisKKyAgICAgICAgICBJRlM9IiwiCisgICAgICAgICAgZm9yIEpBVkFDIGluICRKQVZBQ19QUk9HUyA7IGRvCisgICAgICAgICAgICBJRlM9IiRvSUZTIgorCisgICAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgICAgICBpZiAkSkFWQUMgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KKworICAgICAgICAgICAgICBJRlM9IiwiCisgICAgICAgICAgICAgIGZvciBKQVZBIGluICRKQVZBX1BST0dTIDsgZG8KKyAgICAgICAgICAgICAgICBJRlM9IiRvSUZTIgorCisgICAgICAgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRKQVZBIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmFcIiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICAgICAgICAgIGlmICRKQVZBIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgICAgICAgc3VjY2Vzcz15ZXMKKyAgICAgICAgICAgICAgICAgIGJyZWFrIDIKKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIGRvbmUKKworICAgICAgICAgICAgZmkKKworICAgICAgICAgIGRvbmUKKworICAgICAgICAgIHJtIC1mIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmNsYXNzCisKKyAgICAgICAgICBpZiB0ZXN0ICIkc3VjY2VzcyIgIT0gInllcyIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICAgICAgSkFWQUM9IiIKKyAgICAgICAgICAgIEpBVkE9IiIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICBmaQorCisgICAgICAgICAgYXhfamF2YWNfYW5kX2phdmE9IiRzdWNjZXNzIgorCisgICAgICAgICAgXSkKKworCitBQ19ERUZVTihbQVhfQ0hFQ0tfSkFWQV9DTEFTU10sCisgICAgICAgICBbCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBKYXZhIGNsYXNzIFskMV0pCisKKyAgICAgICAgICBlY2hvICJpbXBvcnQgJDE7IHB1YmxpYyBjbGFzcyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhIHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NAPDpAQDo+QCkgeyB9IH0iID4gY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhCisKKyAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgICAgaWYgJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICAgIHN1Y2Nlc3M9eWVzCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIHN1Y2Nlc3M9bm8KKyAgICAgICAgICBmaQorCisgICAgICAgICAgcm0gLWYgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuY2xhc3MKKyAgICAgICAgICBdKQorCisKK0FDX0RFRlVOKFtBWF9DSEVDS19BTlRfVkVSU0lPTl0sCisgICAgICAgICBbCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBhbnQgdmVyc2lvbiA+ICQyKQorICAgICAgICAgIEFOVF9WQUxJRD1gZXhwciAkKCQxIC12ZXJzaW9uIDI+L2Rldi9udWxsIHwgc2VkIC1uICdzLy4qdmVyc2lvbiBcKEA8OkAwLTlcLkA6PkAqXCkuKi9cMS9wJykgXD49ICQyYAorICAgICAgICAgIGlmIHRlc3QgIngkQU5UX1ZBTElEIiA9ICJ4MSIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICAgICAgQU5UPSIiCisgICAgICAgICAgZmkKKyAgICAgICAgICBdKQorCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfdGhyaWZ0X2ludGVybmFsLm00IGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzBlM2NiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNApAQCAtMCwwICsxLDI4IEBACitkbmwgQHN5bm9wc2lzIEFYX1RIUklGVF9HRU4oU0hPUlRfTEFOR1VBR0UsIExPTkdfTEFOR1VBR0UsIERFRkFVTFQpCitkbmwgQHN5bm9wc2lzIEFYX1RIUklGVF9MSUIoU0hPUlRfTEFOR1VBR0UsIExPTkdfTEFOR1VBR0UsIERFRkFVTFQpCitkbmwKK2RubCBBbGxvdyBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgZ2VuZXJhdG9yIHRvIGJlIGRpc2FibGVkLgorZG5sIEFsbG93IGEgcGFydGljdWxhciBsYW5ndWFnZSBsaWJyYXJ5IHRvIGJlIGRpc2FibGVkLgorZG5sCitkbmwgVGhlc2UgbWFjcm9zIGhhdmUgcG9vciBlcnJvciBoYW5kbGluZyBhbmQgYXJlIHBvb3JseSBkb2N1bWVudGVkLgorZG5sIFRoZXkgYXJlIGludGVuZGVkIG9ubHkgZm9yIGludGVybmFsIHVzZSBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyLgorZG5sCitkbmwgQHZlcnNpb24gMjAwOC0wMi0yMAorZG5sIEBsaWNlbnNlIEFsbFBlcm1pc3NpdmUKK2RubAorZG5sIENvcHlyaWdodCAoQykgMjAwOSBEYXZpZCBSZWlzcworZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCitkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Citkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCitBQ19ERUZVTihbQVhfVEhSSUZUX0xJQl0sCisgICAgICAgICBbCisgICAgICAgICAgQUNfQVJHX1dJVEgoJDEsCisgICAgICAgICAgICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC0kMV0sIFtidWlsZCB0aGUgJDIgbGlicmFyeSBAPDpAZGVmYXVsdD0kM0A6PkBdKSwKKyAgICAgICAgICAgICAgICAgICAgICBbd2l0aF8kMT0iJHdpdGh2YWwiXSwKKyAgICAgICAgICAgICAgICAgICAgICBbd2l0aF8kMT0kM10KKyAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgaGF2ZV8kMT1ubworICAgICAgICAgIGRubCBXaGF0IHdlIGRvIGhlcmUgaXMgZ29pbmcgdG8gdmFyeSBmcm9tIGxpYnJhcnkgdG8gbGlicmFyeSwKKyAgICAgICAgICBkbmwgc28gd2UgY2FuJ3QgcmVhbGx5IGdlbmVyYWxpemUgKHlldCEpLgorICAgICAgICAgXSkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlLmFjIGIvY29udHJpYi9mYjMwMy9jb25maWd1cmUuYWMKaW5kZXggNjdjYzExMC4uNzNiMzViYSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jb25maWd1cmUuYWMKKysrIGIvY29udHJpYi9mYjMwMy9jb25maWd1cmUuYWMKQEAgLTcxLDEzICs3MSw1NyBAQAogIyBFeGFtcGxlOiBzZXRzICQodGhyaWZ0X2hvbWUpIHZhcmlhYmxlIHdpdGggZGVmYXVsdCBwYXRoIHNldCB0byAvdXNyL2xvY2FsLgogRkJfV0lUSF9QQVRIKFt0aHJpZnRfaG9tZV0sIFt0aHJpZnRwYXRoXSwgWy91c3IvbG9jYWxdKQogCi0jIFJlcXVpcmUgYm9vc3QgMS4zMy4xIG9yIGxhdGVyCi1BWF9CT09TVF9CQVNFKFsxLjMzLjFdKQorQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtub2V4dF0pCitBWF9USFJJRlRfTElCKGNwcCwgW0MrK10sIHllcykKK2hhdmVfY3BwPW5vCitpZiB0ZXN0ICIkd2l0aF9jcHAiID0gInllcyI7IHRoZW4KKyAgIyBSZXF1aXJlIGJvb3N0IDEuNDAuMCBvciBsYXRlcgorICBBWF9CT09TVF9CQVNFKFsxLjQwLjBdKQorICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgPSAieHllcyI7IHRoZW4KKyAgICBoYXZlX2NwcD0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFtXSVRIX0NQUF0sIFt0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKGphdmEsIFtKYXZhXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfamF2YSIgPSAieWVzIjsgdGhlbgorICBBWF9KQVZBQ19BTkRfSkFWQQorICBBQ19QQVRIX1BST0coW0FOVF0sIFthbnRdKQorICBBWF9DSEVDS19BTlRfVkVSU0lPTigkQU5ULCAxLjcpCisgIEFDX1NVQlNUKENMQVNTUEFUSCkKKyAgQUNfU1VCU1QoQU5UX0ZMQUdTKQorICBpZiB0ZXN0ICJ4JEpBVkFDIiAhPSAieCIgJiYgdGVzdCAieCRKQVZBQyIgIT0gIngiICYmIHRlc3QgIngkQU5UIiAhPSAieCIgOyB0aGVuCisgICAgaGF2ZV9qYXZhPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9KQVZBLCBbdGVzdCAiJGhhdmVfamF2YSIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIocGhwLCBbUEhQXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfcGhwIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPRyhbUEhQXSwgW3BocF0pCisgIGlmIHRlc3QgIngkUEhQIiAhPSAieCIgJiYgdGVzdCAieCRQSFAiICE9ICJ4OiIgOyB0aGVuCisgICAgaGF2ZV9waHA9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX1BIUCwgW3Rlc3QgIiRoYXZlX3BocCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIocHl0aG9uLCBbUHl0aG9uXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfcHl0aG9uIiA9ICJ5ZXMiOyB0aGVuCisgIEFNX1BBVEhfUFlUSE9OKDIuNCwsIDopCisgIGlmIHRlc3QgIngkUFlUSE9OIiAhPSAieCIgJiYgdGVzdCAieCRQWVRIT04iICE9ICJ4OiIgOyB0aGVuCisgICAgaGF2ZV9weXRob249InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX1BZVEhPTiwgW3Rlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIl0pCiAKICMgR2VuZXJhdGVzIE1ha2VmaWxlIGZyb20gTWFrZWZpbGUuYW0uIE1vZGlmeSB3aGVuIG5ldyBzdWJkaXJzIGFyZSBhZGRlZC4KICMgQ2hhbmdlIE1ha2VmaWxlLmFtIGFsc28gdG8gYWRkIHN1YmRpcmVjdGx5LgogQUNfQ09ORklHX0ZJTEVTKE1ha2VmaWxlIGNwcC9NYWtlZmlsZSBweS9NYWtlZmlsZSkKIAorIyBDaGVjayBmb3IgaGVhZGVycworQUNfQ0hFQ0tfSEVBREVSUyhbaW50dHlwZXMuaF0pCitBQ19DSEVDS19IRUFERVJTKFtuZXRpbmV0L2luLmhdKQorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIERPIE5PVCBUT1VDSC4KIApAQCAtODgsNiArMTMyLDExIEBACiAjIyMjIyMjIyMgRklOSVNIICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBlY2hvICJFWFRFUk5BTF9QQVRIICRFWFRFUk5BTF9QQVRIIgorZWNobworZWNobyAiQnVpbGRpbmcgQysrIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfY3BwIgorZWNobyAiQnVpbGRpbmcgSmF2YSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfamF2YSIKK2VjaG8gIkJ1aWxkaW5nIFB5dGhvbiBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX3B5dGhvbiIKK2VjaG8gIkJ1aWxkaW5nIFBIUCBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX3BocCIKIAogCiAjCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuY3BwIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmNwcAppbmRleCA4MDAzMzQwLi4zYzU2OTc1IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuY3BwCisrKyBiL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5jcHAKQEAgLTk4LDcgKzk4LDcgQEAKICAgLy8gd2FudCBvdXIgcmVhZC93cml0ZSBzdHJ1Y3R1cmUgdG8gZ28gb3ZlciB0aGUgd2lyZQogICBjb3VudGVyc18uYWNxdWlyZVJlYWQoKTsKICAgZm9yKFJlYWRXcml0ZUNvdW50ZXJNYXA6Oml0ZXJhdG9yIGl0ID0gY291bnRlcnNfLmJlZ2luKCk7Ci0gICAgICBpdCAhPSBjb3VudGVyc18uZW5kKCk7IGl0KyspCisgICAgICBpdCAhPSBjb3VudGVyc18uZW5kKCk7ICsraXQpCiAgIHsKICAgICBfcmV0dXJuW2l0LT5maXJzdF0gPSBpdC0+c2Vjb25kLnZhbHVlOwogICB9CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaCBiL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5oCmluZGV4IGZkMTY5ZTYuLmRhYTUyNDYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5oCisrKyBiL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5oCkBAIC0yMiw4ICsyMiw5IEBACiAKICNpbmNsdWRlICJGYWNlYm9va1NlcnZpY2UuaCIKIAotI2luY2x1ZGUgInNlcnZlci9UU2VydmVyLmgiCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvTXV0ZXguaCIKKyNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KIAogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzdHJpbmc+CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2NwcC9NYWtlZmlsZS5hbSBiL2NvbnRyaWIvZmIzMDMvY3BwL01ha2VmaWxlLmFtCmluZGV4IGU2MjYwOGMuLjc0OGQzMjkgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY3BwL01ha2VmaWxlLmFtCisrKyBiL2NvbnRyaWIvZmIzMDMvY3BwL01ha2VmaWxlLmFtCkBAIC01OCw3ICs1OCw3IEBACiAKICMgU2hhcmVkIC0tIG11bHRpcGxlIGxpYnJhcmllcyBjYW4gYmUgZGVmaW5lZAogaWYgU0hBUkVECi1zaGFyZWRkaXIgPSBsaWIKK3NoYXJlZGRpciA9ICQocHJlZml4KS9saWIKIHNoYXJlZF9QUk9HUkFNUyA9IGxpYmZiMzAzLnNvCiBsaWJmYjMwM19zb19TT1VSQ0VTID0gJChmYjMwM19saWIpCiBsaWJmYjMwM19zb19DWFhGTEFHUyA9ICQoU0hBUkVEX0NYWEZMQUdTKQpAQCAtNjgsNyArNjgsNyBAQAogCiAjIFNldCB1cCBUaHJpZnQgc3BlY2lmaWMgYWN0aXZpdHkgaGVyZS4KICMgV2UgYXNzdW1lIHRoYXQgYSA8bmFtZT4rdHlwZXMuY3BwIHdpbGwgYWx3YXlzIGJlIGJ1aWx0IGZyb20gPG5hbWU+LnRocmlmdC4KLSQoZXZhbCAkKGNhbGwgdGhyaWZ0X3RlbXBsYXRlLC4sLi4vaWYvZmIzMDMudGhyaWZ0LC1JICQodGhyaWZ0X2hvbWUpL3NoYXJlICAtLWdlbiBjcHAgKSkKKyQoZXZhbCAkKGNhbGwgdGhyaWZ0X3RlbXBsYXRlLC4sLi4vaWYvZmIzMDMudGhyaWZ0LC1JICQodGhyaWZ0X2hvbWUpL3NoYXJlICAtLWdlbiBjcHA6cHVyZV9lbnVtcyApKQogCiBpbmNsdWRlX2ZiMzAzZGlyID0gJChpbmNsdWRlZGlyKS90aHJpZnQvZmIzMDMKIGluY2x1ZGVfZmIzMDNfSEVBREVSUyA9IEZhY2Vib29rQmFzZS5oIFNlcnZpY2VUcmFja2VyLmggZ2VuLWNwcC9GYWNlYm9va1NlcnZpY2UuaCBnZW4tY3BwL2ZiMzAzX2NvbnN0YW50cy5oIGdlbi1jcHAvZmIzMDNfdHlwZXMuaApkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuY3BwIGIvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuY3BwCmluZGV4IGMyMGEwNjguLjdhNjFiMjEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmNwcAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgIkZhY2Vib29rQmFzZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VUcmFja2VyLmgiCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgZmFjZWJvb2s6OmZiMzAzOwpAQCAtMjUxLDcgKzI1MSw3IEBACiAgIHVpbnQ2NF90IGNvdW50OwogICBmb3IgKGl0ZXIgPSBjaGVja3BvaW50U2VydmljZUR1cmF0aW9uXy5iZWdpbigpOwogICAgICAgIGl0ZXIgIT0gY2hlY2twb2ludFNlcnZpY2VEdXJhdGlvbl8uZW5kKCk7Ci0gICAgICAgaXRlcisrKSB7CisgICAgICAgKytpdGVyKSB7CiAgICAgY291bnQgPSBpdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgaGFuZGxlcl8tPnNldENvdW50ZXIoc3RyaW5nKCJjaGVja3BvaW50X2NvdW50XyIpICsgaXRlci0+Zmlyc3QsIGNvdW50KTsKICAgICBpZiAoY291bnQgPT0gMCkgewpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuaCBiL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmgKaW5kZXggOTMwNDM4Ni4uOWEzZWRkOCAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuaAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5oCkBAIC0xMDAsNyArMTAwLDcgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAKLSNpbmNsdWRlICJjb25jdXJyZW5jeS9NdXRleC5oIgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogCiAKIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0IGIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKaW5kZXggNjZjODMxNS4uODliZDZlYiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKKysrIGIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKQEAgLTI0LDYgKzI0LDcgQEAKIG5hbWVzcGFjZSBqYXZhIGNvbS5mYWNlYm9vay5mYjMwMwogbmFtZXNwYWNlIGNwcCBmYWNlYm9vay5mYjMwMwogbmFtZXNwYWNlIHBlcmwgRmFjZWJvb2suRkIzMDMKK25hbWVzcGFjZSBuZXRjb3JlIEZhY2Vib29rLkZCMzAzLlRlc3QKIAogLyoqCiAgKiBDb21tb24gc3RhdHVzIHJlcG9ydGluZyBtZWNoYW5pc20gYWNyb3NzIGFsbCBzZXJ2aWNlcwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9qYXZhL0ZhY2Vib29rQmFzZS5qYXZhIGIvY29udHJpYi9mYjMwMy9qYXZhL0ZhY2Vib29rQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc4Y2M4Li4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZmIzMDMvamF2YS9GYWNlYm9va0Jhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmZhY2Vib29rLmZiMzAzOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmFjZWJvb2tCYXNlIGltcGxlbWVudHMgRmFjZWJvb2tTZXJ2aWNlLklmYWNlIHsKLQotICBwcml2YXRlIFN0cmluZyBuYW1lXzsKLQotICBwcml2YXRlIGxvbmcgYWxpdmVfOwotCi0gIHByaXZhdGUgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLExvbmc+IGNvdW50ZXJzXyA9Ci0gICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgTG9uZz4oKTsKLQotICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZyxTdHJpbmc+IG9wdGlvbnNfID0KLSAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgcHJvdGVjdGVkIEZhY2Vib29rQmFzZShTdHJpbmcgbmFtZSkgewotICAgIG5hbWVfID0gbmFtZTsKLSAgICBhbGl2ZV8gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDA7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IGludCBnZXRTdGF0dXMoKTsKLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0RldGFpbHMoKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGVsZXRlQ291bnRlcihTdHJpbmcga2V5KSB7Ci0gICAgY291bnRlcnNfLnJlbW92ZShrZXkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzZXRDb3VudGVyKFN0cmluZyBrZXkpIHsKLSAgICBjb3VudGVyc18ucHV0KGtleSwgMEwpOwotICB9Ci0KLSAgcHVibGljIGxvbmcgaW5jcmVtZW50Q291bnRlcihTdHJpbmcga2V5KSB7Ci0gICAgbG9uZyB2YWwgPSBnZXRDb3VudGVyKGtleSkgKyAxOwotICAgIGNvdW50ZXJzXy5wdXQoa2V5LCB2YWwpOwotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotICBwdWJsaWMgQWJzdHJhY3RNYXA8U3RyaW5nLExvbmc+IGdldENvdW50ZXJzKCkgewotICAgIHJldHVybiBjb3VudGVyc187Ci0gIH0KLQotICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyKFN0cmluZyBrZXkpIHsKLSAgICBMb25nIHZhbCA9IGNvdW50ZXJzXy5nZXQoa2V5KTsKLSAgICBpZiAodmFsID09IG51bGwpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gdmFsLmxvbmdWYWx1ZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3B0aW9uKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgIG9wdGlvbnNfLnB1dChrZXksIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uKFN0cmluZyBrZXkpIHsKLSAgICByZXR1cm4gb3B0aW9uc18uZ2V0KGtleSk7Ci0gIH0KLQotICBwdWJsaWMgQWJzdHJhY3RNYXA8U3RyaW5nLFN0cmluZz4gZ2V0T3B0aW9ucygpIHsKLSAgICByZXR1cm4gb3B0aW9uc187Ci0gIH0KLQotICBwdWJsaWMgbG9uZyBhbGl2ZVNpbmNlKCkgewotICAgIHJldHVybiBhbGl2ZV87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENwdVByb2ZpbGUoKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVpbml0aWFsaXplKCkge30KLQotICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHt9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorIyBNYXZlbiBBbnQgdGFza3MgSmFyIGRldGFpbHMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbAppbmRleCA0YWQzMGU1Li43YTFiOGYxIDEwMDc1NQotLS0gYS9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sCisrKyBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwKQEAgLTEsMyArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KIDwhLS0KICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTcsNyArOCw3IEBACiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpAQCAtMTUsNzAgKzE2LDE4NCBAQAogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCBuYW1lPSJsaWJmYjMwMyIgZGVmYXVsdD0iZGlzdCIgYmFzZWRpcj0iLi4iPgorIC0tPgorPHByb2plY3QgbmFtZT0ibGliZmIzMDMiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4iCisgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgogCiAgIDwhLS0gcHJvamVjdCB3aWRlIHNldHRpbmdzLiBBbGwgZGlyZWN0b3JpZXMgcmVsYXRpdmUgdG8gYmFzZWRpciAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJqYXZhIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJpZi5kaXIiIHZhbHVlPSJpZiIvPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0X2hvbWUiIHZhbHVlPSIvdXNyL2xvY2FsIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQucm9vdCIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4vLi4vIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJmYjMwMy5hcnRpZmFjdGlkIiB2YWx1ZT0ibGliZmIzMDMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImludGVyZmFjZS5kaXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL2lmIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5yb290fS9saWIvamF2YSIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyIvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0X2NvbXBpbGVyIiB2YWx1ZT0iJHt0aHJpZnQucm9vdH0vY29tcGlsZXIvY3BwL3RocmlmdCIvPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIi8+CiAKLSAgPCEtLSB0ZW1wIGJ1aWxkIGRpcmVjdG9yaWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iJHtzcmMuZGlyfS9idWlsZCIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3Nlcy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgorICA8IS0tIGluaGVyaXQgZnJvbSB0aGUgamF2YSBidWlsZCBmaWxlIGZvciB2ZXJzaW9uIGFuZCBvdGhlciBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2dyYWRsZS5wcm9wZXJ0aWVzIiAvPgorCisgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+CisKKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KKyAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KKyAgPC9jb25kaXRpb24+CisgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tU05BUFNIT1QiLz4KKworICA8cHJvcGVydHkgbmFtZT0iZmIzMDMuZmluYWwubmFtZSIgdmFsdWU9IiR7ZmIzMDMuYXJ0aWZhY3RpZH0tJHt2ZXJzaW9ufSIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSIke2Jhc2VkaXJ9L3NyYyIvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuIiB2YWx1ZT0iJHtiYXNlZGlyfS9nZW4tamF2YSIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9idWlsZCIvPgogICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9saWIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KIAotICA8IS0tIGZpbmFsIGRpc3RyaWJ1dGlvbiBkaXJlY3RvcmllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImRpc3QuZGlyIiB2YWx1ZT0iL3Vzci9sb2NhbCIvPgotICA8cHJvcGVydHkgbmFtZT0iZGlzdC5saWIuZGlyIiB2YWx1ZT0iJHtkaXN0LmRpcn0vbGliIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJmYjMwMy5qYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZiMzAzLmZpbmFsLm5hbWV9LmphciIvPgorICA8cHJvcGVydHkgbmFtZT0iZmIzMDMucG9tLnhtbCIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZiMzAzLmZpbmFsLm5hbWV9LnBvbSIvPgogCi0gIDwhLS0gbWFrZSB0ZW1wb3JhcnkgYW5kIGRpc3RyaWJ1dGlvbiBkaXJlY3RvcmllcyAtLT4KLSAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KKyAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJzZXR1cC5pbml0LG12bi5pbml0IiB1bmxlc3M9ImluaXQuZmluaXNoZWQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpbml0LmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNldHVwLmluaXQiPgorICAgIDx0c3RhbXAvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9Ii8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWIuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7ZGlzdC5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtkaXN0LmxpYi5kaXJ9Ii8+CiAgIDwvdGFyZ2V0PgogCiAgIDwhLS0gZ2VuZXJhdGUgZmIzMDMgdGhyaWZ0IGNvZGUgLS0+Ci0gIDx0YXJnZXQgbmFtZT0idGhyaWZ0YnVpbGQiPgotICAgIDxlY2hvPmdlbmVyYXRpbmcgdGhyaWZ0IGZiMzAzIGZpbGVzPC9lY2hvPgotICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0X2hvbWV9L2Jpbi90aHJpZnQiICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgLW8gJHtzcmMuZGlyfSAke3NyYy5kaXJ9Ly4uL2lmL2ZiMzAzLnRocmlmdCIgLz4KKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CisgICAgPGVjaG8gbWVzc2FnZT0iZ2VuZXJhdGluZyB0aHJpZnQgZmIzMDMgZmlsZXMiLz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdF9jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YSAtbyAke2Jhc2VkaXJ9ICR7aW50ZXJmYWNlLmRpcn0vZmIzMDMudGhyaWZ0Ii8+CiAgICAgPC9leGVjPgotICAgIDxtb3ZlIHRvZGlyPSIke3NyYy5kaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfS9nZW4tamF2YS9jb20vZmFjZWJvb2svZmIzMDMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L21vdmU+CiAgIDwvdGFyZ2V0PgogCiAgIDwhLS0gY29tcGlsZSB0aGUgYmFzZSBhbmQgdGhyaWZ0IGdlbmVyYXRlZCBjb2RlIGFuZCBqYXIgdGhlbSAtLT4KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJwcmVwYXJlLHRocmlmdGJ1aWxkIj4KLSAgICA8ZWNobz5CdWlsZGluZyBsaWJmYjMwMy5qYXIgLi4uLiA8L2VjaG8+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIGRlYnVnPSJvbiI+CisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iaW5pdCxnZW5lcmF0ZSI+CisgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRpbmcgJHtmYjMwMy5maW5hbC5uYW1lfS5qYXIiLz4KKyAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGhyaWZ0X2hvbWV9L2xpYi9saWJ0aHJpZnQuamFyIi8+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvZGVwcyI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KKyAgICAgICAgPC9maWxlc2V0PgogICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqLmphdmEiLz4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiR7YnVpbGQuZGlyfS9nZW4tamF2YS9jb20vZmFjZWJvb2svZmIzMDMiLz4KKyAgICAgIDxzcmMgcGF0aD0iJHtzcmN9Ii8+CisgICAgICA8c3JjIHBhdGg9IiR7Z2VufSIvPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+CiAgICAgPC9qYXZhYz4KLSAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQubGliLmRpcn0vbGliZmIzMDMuamFyIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSI+CisgICAgPGphciBqYXJmaWxlPSIke2J1aWxkLmRpcn0vJHtmYjMwMy5maW5hbC5uYW1lfS5qYXIiIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9Ij4KICAgICA8L2phcj4KICAgPC90YXJnZXQ+CiAKICAgPCEtLSBjb3B5IHRoZSBidWlsZCBqYXIgdG8gdGhlIGRpc3RyaWJ1dGlvbiBsaWJyYXJ5IGRpcmVjdG9yeSAtLT4KICAgPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBkZXBlbmRzPSJkaXN0Ij4KLSAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmxpYi5kaXJ9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSIgaW5jbHVkZXM9ImxpYmZiMzAzLmphciIvPgorICAgIDxjb3B5IHRvZGlyPSIke2luc3RhbGwucGF0aH0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYi5kaXJ9IiBpbmNsdWRlcz0iKi5qYXIiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSIgaW5jbHVkZXM9IiR7ZmIzMDMuZmluYWwubmFtZX0uamFyIi8+CiAgICAgPC9jb3B5PgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICA8ZWNobz5DbGVhbmluZyBvbGQgc3R1ZmYgLi4uLiA8L2VjaG8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzL2NvbSIvPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0vbGliIi8+CiAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDxkZWxldGUgZGlyPSIke2dlbn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiBkZXBlbmRzPSJzZXR1cC5pbml0LG12bi5hbnQudGFza3MuY2hlY2siIHVubGVzcz0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgPGdldCBzcmM9IiR7bXZuLmFudC50YXNrLnVybH0vJHttdm4uYW50LnRhc2suamFyfSIgZGVzdD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuY2hlY2siPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgICAgPHR5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgbmFtZT0iYXJ0aWZhY3QiLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uaW5pdCIgZGVwZW5kcz0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgorICAgIDxlY2hvIG1lc3NhZ2U9IiR7bXZuLmFudC50YXNrLmphcn0iLz4KKyAgICA8IS0tIERvd25sb2FkIG12biBhbnQgdGFza3MsIGRvd25sb2FkIGRlcGVuZGVuY2llcywgYW5kIHNldHVwIHBvbSBmaWxlIC0tPgorICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGg9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9Ii8+CisKKyAgICA8IS0tIHJlbW90ZSByZXBvc2l0b3JpZXMgdXNlZCB0byBkb3dubG9hZCBkZXBlbmRlbmNpZXMgZnJvbSAtLT4KKyAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iY2VudHJhbCIgdXJsPSIke212bi5yZXBvfSIvPgorICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KKworICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+CisgICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIgorICAgICAgZ3JvdXBJZD0iJHt0aHJpZnQuZ3JvdXBpZH0iCisgICAgICBhcnRpZmFjdElkPSIke2ZiMzAzLmFydGlmYWN0aWR9IgorICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIKKyAgICAgIHVybD0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICAgICAgbmFtZT0iQXBhY2hlIFRocmlmdCIKKyAgICAgIGRlc2NyaXB0aW9uPSJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIKKyAgICAgIHBhY2thZ2luZz0iamFyIgorICAgID4KKyAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+CisgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+CisgICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KKyAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiCisgICAgLz4KKyAgICAgIDwhLS0gVGhyaWZ0IERldmVsb3BlcnMgLS0+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJtY3NsZWUiIG5hbWU9Ik1hcmsgU2xlZSIvPgorICAgICAgPGRldmVsb3BlciBpZD0iZHJlaXNzIiBuYW1lPSJEYXZpZCBSZWlzcyIvPgorICAgICAgPGRldmVsb3BlciBpZD0iYWRpdHlhIiBuYW1lPSJBZGl0eWEgQWdhcndhbCIvPgorICAgICAgPGRldmVsb3BlciBpZD0ibWFyY2siIG5hbWU9Ik1hcmMgS3dpYXRrb3dza2kiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9Imp3YW5nIiBuYW1lPSJKYW1lcyBXYW5nIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJjcGlybyIgbmFtZT0iQ2hyaXMgUGlybyIvPgorICAgICAgPGRldmVsb3BlciBpZD0iYm1hdXJlciIgbmFtZT0iQmVuIE1hdXJlciIvPgorICAgICAgPGRldmVsb3BlciBpZD0ia2NsYXJrIiBuYW1lPSJLZXZpbiBDbGFyayIvPgorICAgICAgPGRldmVsb3BlciBpZD0iamFrZSIgbmFtZT0iSmFrZSBMdWNpYW5pIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJicnlhbmR1eGJ1cnkiIG5hbWU9IkJyeWFuIER1eGJ1cnkiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImVzdGV2ZSIgbmFtZT0iRXN0ZXZlIEZlcm5hbmRleiIvPgorICAgICAgPGRldmVsb3BlciBpZD0idG9kZCIgbmFtZT0iVG9kZCBMaXBjb24iLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImdlZWNob3JhbWEiIG5hbWU9IkFuZHJldyBNY0dlYWNoaWUiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9Im1vbGluYXJvIiBuYW1lPSJBbnRob255IE1vbGluYXJvIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJyb2dlciIgbmFtZT0iUm9nZXIgTWVpZXIiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImpmYXJyZWxsIiBuYW1lPSJKYWtlIEZhcnJlbGwiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImplbnNnIiBuYW1lPSJKZW5zIEdleWVyIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJjYXJsIiBuYW1lPSJDYXJsIFlla3NpZ2lhbiIvPgorCisgICAgICA8IS0tIFRocmlmdCBkZXBlbmRlbmNpZXMgbGlzdCAtLT4KKyAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUudGhyaWZ0IiBhcnRpZmFjdElkPSJsaWJ0aHJpZnQiIHZlcnNpb249IiR7dmVyc2lvbn0iLz4KKyAgICA8L2FydGlmYWN0OnBvbT4KKworICAgIDwhLS0gR2VuZXJhdGUgdGhlIHBvbSBmaWxlIC0tPgorICAgIDxhcnRpZmFjdDp3cml0ZXBvbSBwb21SZWZJZD0icG9tIiBmaWxlPSIke2ZiMzAzLnBvbS54bWx9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8bWFjcm9kZWYgbmFtZT0ic2lnbkFuZERlcGxveSI+CisgICAgPCEtLSBTaWduIGFuZCBkZXBsb3kgamFycyB0byBhcGFjaGUgcmVwbyAtLT4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzaWZpZXIiIGRlZmF1bHQ9IiIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnaW5nIiBkZWZhdWx0PSJqYXIiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InBvbSIgZGVmYXVsdD0iIi8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8YXJ0aWZhY3Q6bXZuIGZvcms9InRydWUiPgorICAgICAgICA8YXJnIHZhbHVlPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZ3BnLXBsdWdpbjoxLjE6c2lnbi1hbmQtZGVwbG95LWZpbGUiLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLURyZXBvc2l0b3J5SWQ9JHttYXZlbi1yZXBvc2l0b3J5LWlkfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItRHVybD0ke21hdmVuLXJlcG9zaXRvcnktdXJsfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItRHBvbUZpbGU9QHtwb219Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EZmlsZT1Ae2ZpbGV9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EY2xhc3NpZmllcj1Ae2NsYXNzaWZpZXJ9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EcGFja2FnaW5nPUB7cGFja2FnaW5nfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItUGdwZyIvPgorICAgICAgPC9hcnRpZmFjdDptdm4+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDx0YXJnZXQgbmFtZT0icHVibGlzaCIgZGVwZW5kcz0iY2xlYW4sZGlzdCI+CisgICAgPCEtLSBDb21waWxlLCBwYWNrYWdlcyBhbmQgdGhlbiBzZW5kIHJlbGVhc2UgdG8gYXBhY2hlIG1hdmVuIHJlcG8gLS0+CisgICAgPCEtLSBydW4gd2l0aDogYW50IC1EcmVsZWFzZT10cnVlIHB1Ymxpc2gtLT4KKyAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2ZiMzAzLnBvbS54bWx9IiBwYWNrYWdpbmc9InBvbSIgY2xhc3NpZmllcj0iIiBwb209IiR7ZmIzMDMucG9tLnhtbH0iLz4KKyAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2ZiMzAzLmphci5maWxlfSIgcGFja2FnaW5nPSJqYXIiIGNsYXNzaWZpZXI9IiIgcG9tPSIke2ZiMzAzLnBvbS54bWx9Ii8+CiAgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9qYXZhL3NyYy9GYWNlYm9va0Jhc2UuamF2YSBiL2NvbnRyaWIvZmIzMDMvamF2YS9zcmMvRmFjZWJvb2tCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmMjZhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvamF2YS9zcmMvRmFjZWJvb2tCYXNlLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZmFjZWJvb2suZmIzMDM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYWNlYm9va0Jhc2UgaW1wbGVtZW50cyBGYWNlYm9va1NlcnZpY2UuSWZhY2UgeworCisgIHByaXZhdGUgU3RyaW5nIG5hbWVfOworCisgIHByaXZhdGUgbG9uZyBhbGl2ZV87CisKKyAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsTG9uZz4gY291bnRlcnNfID0KKyAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBMb25nPigpOworCisgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLFN0cmluZz4gb3B0aW9uc18gPQorICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICBwcm90ZWN0ZWQgRmFjZWJvb2tCYXNlKFN0cmluZyBuYW1lKSB7CisgICAgbmFtZV8gPSBuYW1lOworICAgIGFsaXZlXyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC8gMTAwMDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZV87CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3QgZmJfc3RhdHVzIGdldFN0YXR1cygpOworCisgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzRGV0YWlscygpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBwdWJsaWMgdm9pZCBkZWxldGVDb3VudGVyKFN0cmluZyBrZXkpIHsKKyAgICBjb3VudGVyc18ucmVtb3ZlKGtleSk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZXNldENvdW50ZXIoU3RyaW5nIGtleSkgeworICAgIGNvdW50ZXJzXy5wdXQoa2V5LCAwTCk7CisgIH0KKworICBwdWJsaWMgbG9uZyBpbmNyZW1lbnRDb3VudGVyKFN0cmluZyBrZXkpIHsKKyAgICBsb25nIHZhbCA9IGdldENvdW50ZXIoa2V5KSArIDE7CisgICAgY291bnRlcnNfLnB1dChrZXksIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorCisgIHB1YmxpYyBsb25nIGluY3JlbWVudENvdW50ZXIoU3RyaW5nIGtleSwgbG9uZyBpbmNyZW1lbnQpIHsKKyAgICBsb25nIHZhbCA9IGdldENvdW50ZXIoa2V5KSArIGluY3JlbWVudDsKKyAgICBjb3VudGVyc18ucHV0KGtleSwgdmFsKTsKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgcHVibGljIGxvbmcgc2V0Q291bnRlcihTdHJpbmcga2V5LCBsb25nIHZhbHVlKSB7CisgICAgY291bnRlcnNfLnB1dChrZXksIHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBwdWJsaWMgQWJzdHJhY3RNYXA8U3RyaW5nLExvbmc+IGdldENvdW50ZXJzKCkgeworICAgIHJldHVybiBjb3VudGVyc187CisgIH0KKworICBwdWJsaWMgbG9uZyBnZXRDb3VudGVyKFN0cmluZyBrZXkpIHsKKyAgICBMb25nIHZhbCA9IGNvdW50ZXJzXy5nZXQoa2V5KTsKKyAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gdmFsLmxvbmdWYWx1ZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0T3B0aW9uKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgIG9wdGlvbnNfLnB1dChrZXksIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uKFN0cmluZyBrZXkpIHsKKyAgICByZXR1cm4gb3B0aW9uc18uZ2V0KGtleSk7CisgIH0KKworICBwdWJsaWMgQWJzdHJhY3RNYXA8U3RyaW5nLFN0cmluZz4gZ2V0T3B0aW9ucygpIHsKKyAgICByZXR1cm4gb3B0aW9uc187CisgIH0KKworICBwdWJsaWMgbG9uZyBhbGl2ZVNpbmNlKCkgeworICAgIHJldHVybiBhbGl2ZV87CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldENwdVByb2ZpbGUoKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgcHVibGljIHZvaWQgcmVpbml0aWFsaXplKCkge30KKworICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHt9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5IGIvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKaW5kZXggNjg1ZmYyMC4uMDdkYjEwYyAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkKQEAgLTI0LDU5ICsyNCw2MCBAQAogaW1wb3J0IHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQKIGZyb20gdHR5cGVzIGltcG9ydCBmYl9zdGF0dXMKIAorCiBjbGFzcyBGYWNlYm9va0Jhc2UoRmFjZWJvb2tTZXJ2aWNlLklmYWNlKToKIAotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6Ci0gICAgc2VsZi5uYW1lID0gbmFtZQotICAgIHNlbGYuYWxpdmUgPSBpbnQodGltZS50aW1lKCkpCi0gICAgc2VsZi5jb3VudGVycyA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuYWxpdmUgPSBpbnQodGltZS50aW1lKCkpCisgICAgICAgIHNlbGYuY291bnRlcnMgPSB7fQogCi0gIGRlZiBnZXROYW1lKHNlbGYsICk6Ci0gICAgcmV0dXJuIHNlbGYubmFtZQorICAgIGRlZiBnZXROYW1lKHNlbGYsICk6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKIAotICBkZWYgZ2V0VmVyc2lvbihzZWxmLCApOgotICAgIHJldHVybiAnJworICAgIGRlZiBnZXRWZXJzaW9uKHNlbGYsICk6CisgICAgICAgIHJldHVybiAnJwogCi0gIGRlZiBnZXRTdGF0dXMoc2VsZiwgKToKLSAgICByZXR1cm4gZmJfc3RhdHVzLkFMSVZFCisgICAgZGVmIGdldFN0YXR1cyhzZWxmLCApOgorICAgICAgICByZXR1cm4gZmJfc3RhdHVzLkFMSVZFCiAKLSAgZGVmIGdldENvdW50ZXJzKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmNvdW50ZXJzCisgICAgZGVmIGdldENvdW50ZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb3VudGVycwogCi0gIGRlZiByZXNldENvdW50ZXIoc2VsZiwga2V5KToKLSAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSAwCisgICAgZGVmIHJlc2V0Q291bnRlcihzZWxmLCBrZXkpOgorICAgICAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSAwCiAKLSAgZGVmIGdldENvdW50ZXIoc2VsZiwga2V5KToKLSAgICBpZiBzZWxmLmNvdW50ZXJzLmhhc19rZXkoa2V5KToKLSAgICAgIHJldHVybiBzZWxmLmNvdW50ZXJzW2tleV0KLSAgICByZXR1cm4gMAorICAgIGRlZiBnZXRDb3VudGVyKHNlbGYsIGtleSk6CisgICAgICAgIGlmIHNlbGYuY291bnRlcnMuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY291bnRlcnNba2V5XQorICAgICAgICByZXR1cm4gMAogCi0gIGRlZiBpbmNyZW1lbnRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgc2VsZi5jb3VudGVyc1trZXldID0gc2VsZi5nZXRDb3VudGVyKGtleSkgKyAxCisgICAgZGVmIGluY3JlbWVudENvdW50ZXIoc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5jb3VudGVyc1trZXldID0gc2VsZi5nZXRDb3VudGVyKGtleSkgKyAxCiAKLSAgZGVmIHNldE9wdGlvbihzZWxmLCBrZXksIHZhbHVlKToKLSAgICBwYXNzCisgICAgZGVmIHNldE9wdGlvbihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBnZXRPcHRpb24oc2VsZiwga2V5KToKLSAgICByZXR1cm4gIiIKKyAgICBkZWYgZ2V0T3B0aW9uKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiAiIgogCi0gIGRlZiBnZXRPcHRpb25zKHNlbGYpOgotICAgIHJldHVybiB7fQorICAgIGRlZiBnZXRPcHRpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4ge30KIAotICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKLSAgICByZXR1cm4ge30KKyAgICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHt9CiAKLSAgZGVmIGFsaXZlU2luY2Uoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuYWxpdmUKKyAgICBkZWYgYWxpdmVTaW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYWxpdmUKIAotICBkZWYgZ2V0Q3B1UHJvZmlsZShzZWxmLCBkdXJhdGlvbik6Ci0gICAgcmV0dXJuICIiCisgICAgZGVmIGdldENwdVByb2ZpbGUoc2VsZiwgZHVyYXRpb24pOgorICAgICAgICByZXR1cm4gIiIKIAotICBkZWYgZ2V0TGltaXRlZFJlZmxlY3Rpb24oc2VsZik6Ci0gICAgcmV0dXJuIHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQuU2VydmljZSgpCisgICAgZGVmIGdldExpbWl0ZWRSZWZsZWN0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gdGhyaWZ0LnJlZmxlY3Rpb24ubGltaXRlZC5TZXJ2aWNlKCkKIAotICBkZWYgcmVpbml0aWFsaXplKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVpbml0aWFsaXplKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHNodXRkb3duKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weSBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weQppbmRleCA0ZjhjZTk5Li41YzhmNDA5IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5CkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIS91c3IvYmluL2VudiBweXRob24gCiAKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtMTksNyArMTksOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgb3MKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBzeXMKK2ltcG9ydCBvcwogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAKIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgKgpAQCAtMzEsMTEgKzMzLDEyIEBACiBmcm9tIGZiMzAzIGltcG9ydCAqCiBmcm9tIGZiMzAzLnR0eXBlcyBpbXBvcnQgKgogCisKIGRlZiBzZXJ2aWNlX2N0cmwoCi0gICAgICAgICAgICAgICAgIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgIHRyYW5zX2ZhY3RvcnkgPSBOb25lLAotICAgICAgICAgICAgICAgICBwcm90X2ZhY3RvcnkgPSBOb25lKToKKyAgICAgICAgY29tbWFuZCwKKyAgICAgICAgcG9ydCwKKyAgICAgICAgdHJhbnNfZmFjdG9yeT1Ob25lLAorICAgICAgICBwcm90X2ZhY3Rvcnk9Tm9uZSk6CiAgICAgIiIiCiAgICAgc2VydmljZV9jdHJsIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiB0byBleGVjdXRlIHN0YW5kYXJkIGZiMzAzIGZ1bmN0aW9ucwogCkBAIC01NSw2NiArNTgsNTkgQEAKICAgICAgICAgICAgIG1zZyA9IGZiX3N0YXR1c19zdHJpbmcoc3RhdHVzKQogICAgICAgICAgICAgaWYgKGxlbihzdGF0dXNfZGV0YWlscykpOgogICAgICAgICAgICAgICAgIG1zZyArPSAiIC0gJXMiICUgc3RhdHVzX2RldGFpbHMKLSAgICAgICAgICAgIHByaW50IG1zZwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IGZiX3N0YXR1cy5BTElWRSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDIKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgICAgIHByaW50KG1zZykKKyAgICAgICAgICAgIHJldHVybiAyIGlmIHN0YXR1cyA9PSBmYl9zdGF0dXMuQUxJVkUgZWxzZSAzCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIKKyAgICAgICAgICAgIHByaW50KCJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIpCiAgICAgICAgICAgICByZXR1cm4gMwogCiAgICAgIyBzY2FsYXIgY29tbWFuZHMKLSAgICBpZiBjb21tYW5kIGluIFsidmVyc2lvbiIsImFsaXZlIiwibmFtZSJdOgorICAgIGlmIGNvbW1hbmQgaW4gWyJ2ZXJzaW9uIiwgImFsaXZlIiwgIm5hbWUiXToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVzdWx0ID0gZmIzMDNfd3JhcHBlcihjb21tYW5kLCAgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQotICAgICAgICAgICAgcHJpbnQgcmVzdWx0CisgICAgICAgICAgICByZXN1bHQgPSBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKKyAgICAgICAgICAgIHByaW50KHJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJmYWlsZWQgdG8gZ2V0ICIsY29tbWFuZAorICAgICAgICAgICAgcHJpbnQoImZhaWxlZCB0byBnZXQgIiwgY29tbWFuZCkKICAgICAgICAgICAgIHJldHVybiAzCiAKICAgICAjIGNvdW50ZXJzCiAgICAgaWYgY29tbWFuZCBpbiBbImNvdW50ZXJzIl06CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGNvdW50ZXJzID0gZmIzMDNfd3JhcHBlcignY291bnRlcnMnLCAgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQorICAgICAgICAgICAgY291bnRlcnMgPSBmYjMwM193cmFwcGVyKCdjb3VudGVycycsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKICAgICAgICAgICAgIGZvciBjb3VudGVyIGluIGNvdW50ZXJzOgotICAgICAgICAgICAgICAgIHByaW50ICIlczogJWQiICUgKGNvdW50ZXIsIGNvdW50ZXJzW2NvdW50ZXJdKQorICAgICAgICAgICAgICAgIHByaW50KCIlczogJWQiICUgKGNvdW50ZXIuZW5jb2RlKCd1dGYtOCcpLCBjb3VudGVyc1tjb3VudGVyXSkpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIGdldCBjb3VudGVycyIKKyAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gZ2V0IGNvdW50ZXJzIikKICAgICAgICAgICAgIHJldHVybiAzCiAKLQogICAgICMgT25seSByb290IHNob3VsZCBiZSBhYmxlIHRvIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmRzCiAgICAgaWYgb3MuZ2V0dWlkKCkgPT0gMDoKICAgICAgICAgIyBhc3luYyBjb21tYW5kcwotICAgICAgICBpZiBjb21tYW5kIGluIFsic3RvcCIsInJlbG9hZCJdIDoKKyAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIHRlbGwgdGhlIHNlcnZpY2UgdG8gIiwgY29tbWFuZAorICAgICAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gdGVsbCB0aGUgc2VydmljZSB0byAiLCBjb21tYW5kKQogICAgICAgICAgICAgICAgIHJldHVybiAzCiAgICAgZWxzZToKLSAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCJyZWxvYWQiXToKLSAgICAgICAgICAgIHByaW50ICJyb290IHByaXZpbGVnZXMgYXJlIHJlcXVpcmVkIHRvIHN0b3Agb3IgcmVsb2FkIHRoZSBzZXJ2aWNlLiIKKyAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CisgICAgICAgICAgICBwcmludCgicm9vdCBwcml2aWxlZ2VzIGFyZSByZXF1aXJlZCB0byBzdG9wIG9yIHJlbG9hZCB0aGUgc2VydmljZS4iKQogICAgICAgICAgICAgcmV0dXJuIDQKIAotICAgIHByaW50ICJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGU6IgotICAgIGZvciBjb21tYW5kIGluIFsiY291bnRlcnMiLCJuYW1lIiwidmVyc2lvbiIsImFsaXZlIiwic3RhdHVzIl06Ci0gICAgICAgIHByaW50ICJcdCVzIiAlIGNvbW1hbmQKLSAgICBwcmludCAiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2VycyB3aXRoIHJvb3QgcHJpdmlsZWdlczoiCi0gICAgZm9yIGNvbW1hbmQgaW4gWyJzdG9wIiwicmVsb2FkIl06Ci0gICAgICAgIHByaW50ICJcdCVzIiAlIGNvbW1hbmQKKyAgICBwcmludCgiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlOiIpCisgICAgZm9yIGNvbW1hbmQgaW4gWyJjb3VudGVycyIsICJuYW1lIiwgInZlcnNpb24iLCAiYWxpdmUiLCAic3RhdHVzIl06CisgICAgICAgIHByaW50KCJcdCVzIiAlIGNvbW1hbmQpCisgICAgcHJpbnQoIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgd2l0aCByb290IHByaXZpbGVnZXM6IikKKyAgICBmb3IgY29tbWFuZCBpbiBbInN0b3AiLCAicmVsb2FkIl06CisgICAgICAgIHByaW50KCJcdCVzIiAlIGNvbW1hbmQpCisKKyAgICByZXR1cm4gMAogCiAKLQotICAgIHJldHVybiAwOwotCi0KLWRlZiBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnkgPSBOb25lLCBwcm90X2ZhY3RvcnkgPSBOb25lKToKK2RlZiBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3Rvcnk9Tm9uZSwgcHJvdF9mYWN0b3J5PU5vbmUpOgogICAgIHNvY2sgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIHBvcnQpCiAKICAgICAjIHVzZSBpbnB1dCB0cmFuc3BvcnQgZmFjdG9yeSBpZiBwcm92aWRlZApAQCAtMTc5LDExICsxNzUsMTEgQEAKIAogICAgICMgcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotICAgIGNvbW1hbmRzPVsic3RvcCIsImNvdW50ZXJzIiwic3RhdHVzIiwicmVsb2FkIiwidmVyc2lvbiIsIm5hbWUiLCJhbGl2ZSJdCisgICAgY29tbWFuZHMgPSBbInN0b3AiLCAiY291bnRlcnMiLCAic3RhdHVzIiwgInJlbG9hZCIsICJ2ZXJzaW9uIiwgIm5hbWUiLCAiYWxpdmUiXQogCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1jIiwgIi0tY29tbWFuZCIsIGRlc3Q9ImNvbW1hbmQiLCBoZWxwPSJleGVjdXRlIHRoaXMgQVBJIiwKICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPWNvbW1hbmRzLCBkZWZhdWx0PSJzdGF0dXMiKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKCItcCIsIi0tcG9ydCIsZGVzdD0icG9ydCIsaGVscD0idGhlIHNlcnZpY2UncyBwb3J0IiwKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCAiLS1wb3J0IiwgZGVzdD0icG9ydCIsIGhlbHA9InRoZSBzZXJ2aWNlJ3MgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD05MDgyKQogCiAgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weSBiL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkKaW5kZXggYTI5Zjk2NC4uZDI3YzI5NiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weQorKysgYi9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5CkBAIC0xLDMgKzEsNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtNyw3ICs5LDcgQEAKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KQEAgLTE3LDExICsxOSwzMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2ltcG9ydCBzeXMKK3RyeToKKyAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KK2V4Y2VwdDoKKyAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uLCBDb21tYW5kCiAKLXNldHVwKG5hbWU9J2ZiMzAzJywKLSAgICAgIHZlcnNpb249JzEuMCcsCi0gICAgICBwYWNrYWdlcz1bJ2ZiMzAzJywgJ2ZiMzAzX3NjcmlwdHMnXSwKK3NldHVwKG5hbWU9J3RocmlmdF9mYjMwMycsCisgICAgICB2ZXJzaW9uPScxLjAuMCcsCisgICAgICBkZXNjcmlwdGlvbj0nUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBGQjMwMycsCisgICAgICBhdXRob3I9WydBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnXSwKKyAgICAgIGF1dGhvcl9lbWFpbD1bJ2RldkB0aHJpZnQuYXBhY2hlLm9yZyddLAorICAgICAgdXJsPSdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAorICAgICAgbGljZW5zZT0nQXBhY2hlIExpY2Vuc2UgMi4wJywKKyAgICAgIHBhY2thZ2VzPVsKKyAgICAgICAgICAnZmIzMDMnLAorICAgICAgICAgICdmYjMwM19zY3JpcHRzJywKKyAgICAgIF0sCisgICAgICBjbGFzc2lmaWVycz1bCisgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA3IC0gSW5hY3RpdmUnLAorICAgICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKKyAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyJywKKyAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKKyAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCisgICAgICBdLAogICAgICAgKQotCi0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvbWluZ3ctY3Jvc3MtY29tcGlsZS5zaCBiL2NvbnRyaWIvbWluZ3ctY3Jvc3MtY29tcGlsZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZWQ1ZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9taW5ndy1jcm9zcy1jb21waWxlLnNoCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorc2V0IC1lCisKKy4vY29uZmlndXJlIFwKKyAgLS1kaXNhYmxlLWxpYnMgXAorICAtLWJ1aWxkPWk2ODYtcGMtbGludXgtZ251IFwKKyAgLS1ob3N0PWk1ODYtbWluZ3czMm1zdmMgXAorICBDQz1pNTg2LW1pbmd3MzJtc3ZjLWdjYyBDWFg9aTU4Ni1taW5ndzMybXN2Yy1nKysKKworbWFrZQorCisjIENoZWNrIHR3byBsb2NhdGlvbnMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGxpYnRvb2wgMS41LjI2IG9yIDIuMi42Yi4KK2lmIHRlc3QgLWYgY29tcGlsZXIvY3BwLy5saWJzL3RocmlmdC5leGUgOyB0aGVuCisgIGk1ODYtbWluZ3czMm1zdmMtc3RyaXAgY29tcGlsZXIvY3BwLy5saWJzL3RocmlmdC5leGUgLW8gLi90aHJpZnQuZXhlCitlbHNlIAorICBpNTg2LW1pbmd3MzJtc3ZjLXN0cmlwIGNvbXBpbGVyL2NwcC90aHJpZnQuZXhlIC1vIC4vdGhyaWZ0LmV4ZQorZmkKK2VjaG8gIkZpbmlzaGVkIGNvbXBpbGluZyB3aXRoIHJlc3VsdGluZyBleGUiCitscyAtbCAuL3RocmlmdC5leGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5IGIvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGJlNWYyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5CkBAIC0wLDAgKzEsMzEyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIiIiCitUaGlzIHNjcmlwdCBjYW4gYmUgdXNlZCB0byBtYWtlIHRoZSBvdXRwdXQgZnJvbQorYXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfcHJpbnRfaW5mbygpIG1vcmUgaHVtYW4tcmVhZGFibGUuCisKK0l0IHRyYW5zbGF0ZXMgZWFjaCBleGVjdXRhYmxlIGZpbGUgbmFtZSBhbmQgYWRkcmVzcyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nCitzb3VyY2UgZmlsZSBuYW1lLCBsaW5lIG51bWJlciwgYW5kIGZ1bmN0aW9uIG5hbWUuICBCeSBkZWZhdWx0LCBpdCBhbHNvCitkZW1hbmdsZXMgQysrIHN5bWJvbCBuYW1lcy4KKyIiIgorCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCisKK2NsYXNzIEFkZHJlc3NJbmZvKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBjbGFzcyB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgYWRkcmVzcyBpbiBhbiBvYmplY3QgZmlsZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqX2ZpbGUsIGFkZHJlc3MpOgorICAgICAgICBzZWxmLm9iamVjdEZpbGUgPSBvYmpfZmlsZQorICAgICAgICBzZWxmLmFkZHJlc3MgPSBhZGRyZXNzCisgICAgICAgIHNlbGYuc291cmNlRmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5zb3VyY2VMaW5lID0gTm9uZQorICAgICAgICBzZWxmLmZ1bmN0aW9uID0gTm9uZQorCisKK2dfYWRkcnNfYnlfZmlsZW5hbWUgPSB7fQorCisKK2RlZiBnZXRfYWRkcmVzcyhmaWxlbmFtZSwgYWRkcmVzcyk6CisgICAgIiIiCisgICAgUmV0cmlldmUgYW4gQWRkcmVzc0luZm8gb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBmaWxlIGFuZCBhZGRyZXNzLgorCisgICAgS2VlcHMgYSBnbG9iYWwgbGlzdCBvZiBBZGRyZXNzSW5mbyBvYmplY3RzLiAgVHdvIGNhbGxzIHRvIGdldF9hZGRyZXNzKCkKKyAgICB3aXRoIHRoZSBzYW1lIGZpbGVuYW1lIGFuZCBhZGRyZXNzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBBZGRyZXNzSW5mbworICAgIG9iamVjdC4KKyAgICAiIiIKKyAgICBnbG9iYWwgZ19hZGRyc19ieV9maWxlbmFtZQorICAgIHRyeToKKyAgICAgICAgYnlfYWRkcmVzcyA9IGdfYWRkcnNfYnlfZmlsZW5hbWVbZmlsZW5hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBieV9hZGRyZXNzID0ge30KKyAgICAgICAgZ19hZGRyc19ieV9maWxlbmFtZVtmaWxlbmFtZV0gPSBieV9hZGRyZXNzCisKKyAgICB0cnk6CisgICAgICAgIGFkZHJfaW5mbyA9IGJ5X2FkZHJlc3NbYWRkcmVzc10KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGFkZHJfaW5mbyA9IEFkZHJlc3NJbmZvKGZpbGVuYW1lLCBhZGRyZXNzKQorICAgICAgICBieV9hZGRyZXNzW2FkZHJlc3NdID0gYWRkcl9pbmZvCisgICAgcmV0dXJuIGFkZHJfaW5mbworCisKK2RlZiB0cmFuc2xhdGVfZmlsZV9hZGRyZXNzZXMoZmlsZW5hbWUsIGFkZHJlc3Nlcywgb3B0aW9ucyk6CisgICAgIiIiCisgICAgVXNlIGFkZHIybGluZSB0byBsb29rIHVwIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGFkZHJlc3Nlcy4KKyAgICBBbGwgb2YgdGhlIGFkZHJlc3NlcyBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBvYmplY3QgZmlsZS4KKyAgICAiIiIKKyAgICAjIERvIG5vdGhpbmcgaWYgd2UgY2FuJ3QgZmluZCB0aGUgZmlsZQorICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSk6CisgICAgICAgIHJldHVybgorCisgICAgYXJncyA9IFsnYWRkcjJsaW5lJ10KKyAgICBpZiBvcHRpb25zLnByaW50RnVuY3Rpb25zOgorICAgICAgICBhcmdzLmFwcGVuZCgnLWYnKQorICAgIGFyZ3MuZXh0ZW5kKFsnLWUnLCBmaWxlbmFtZV0pCisKKyAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICBmb3IgYWRkcmVzcyBpbiBhZGRyZXNzZXM6CisgICAgICAgIGFzc2VydCBhZGRyZXNzLm9iamVjdEZpbGUgPT0gZmlsZW5hbWUKKyAgICAgICAgcHJvYy5zdGRpbi53cml0ZShhZGRyZXNzLmFkZHJlc3MgKyAnXG4nKQorCisgICAgICAgIGlmIG9wdGlvbnMucHJpbnRGdW5jdGlvbnM6CisgICAgICAgICAgICBmdW5jdGlvbiA9IHByb2Muc3Rkb3V0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGZ1bmN0aW9uID0gZnVuY3Rpb24uc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IGZ1bmN0aW9uOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigndW5leHBlY3RlZCBFT0YgZnJvbSBhZGRyMmxpbmUnKQorICAgICAgICAgICAgYWRkcmVzcy5mdW5jdGlvbiA9IGZ1bmN0aW9uCisKKyAgICAgICAgZmlsZV9hbmRfbGluZSA9IHByb2Muc3Rkb3V0LnJlYWRsaW5lKCkKKyAgICAgICAgZmlsZV9hbmRfbGluZSA9IGZpbGVfYW5kX2xpbmUuc3RyaXAoKQorICAgICAgICBpZiBub3QgZmlsZV9hbmRfbGluZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigndW5leHBlY3RlZCBFT0YgZnJvbSBhZGRyMmxpbmUnKQorICAgICAgICBpZHggPSBmaWxlX2FuZF9saW5lLnJmaW5kKCc6JykKKyAgICAgICAgaWYgaWR4IDwgMDoKKyAgICAgICAgICAgIG1zZyA9ICdleHBlY3RlZCBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIGFkZHIybGluZTsgZ290ICVyJyAlIFwKKyAgICAgICAgICAgICAgICAoZmlsZV9hbmRfbGluZSwpCisgICAgICAgICAgICBtc2cgKz0gJ1xuZmlsZT0lciwgYWRkcmVzcz0lcicgJSAoZmlsZW5hbWUsIGFkZHJlc3MuYWRkcmVzcykKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihtc2cpCisKKyAgICAgICAgYWRkcmVzcy5zb3VyY2VGaWxlID0gZmlsZV9hbmRfbGluZVs6aWR4XQorICAgICAgICBhZGRyZXNzLnNvdXJjZUxpbmUgPSBmaWxlX2FuZF9saW5lW2lkeCArIDE6XQorCisgICAgKHJlbWFpbmluZ19vdXQsIGNtZF9lcnIpID0gcHJvYy5jb21tdW5pY2F0ZSgpCisgICAgcmV0Y29kZSA9IHByb2Mud2FpdCgpCisgICAgaWYgcmV0Y29kZSAhPSAwOgorICAgICAgICByYWlzZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcihyZXRjb2RlLCBhcmdzKQorCisKK2RlZiBsb29rdXBfYWRkcmVzc2VzKG9wdGlvbnMpOgorICAgICIiIgorICAgIExvb2sgdXAgc291cmNlIGZpbGUgaW5mb3JtYXRpb24gZm9yIGFsbCBvZiB0aGUgYWRkcmVzc2VzIGN1cnJlbnRseSBzdG9yZWQKKyAgICBpbiB0aGUgZ2xvYmFsIGxpc3Qgb2YgQWRkcmVzc0luZm8gb2JqZWN0cy4KKyAgICAiIiIKKyAgICBnbG9iYWwgZ19hZGRyc19ieV9maWxlbmFtZQorICAgIGZvciAoZmlsZSwgYWRkcmVzc2VzKSBpbiBnX2FkZHJzX2J5X2ZpbGVuYW1lLml0ZW1zKCk6CisgICAgICAgIHRyYW5zbGF0ZV9maWxlX2FkZHJlc3NlcyhmaWxlLCBhZGRyZXNzZXMudmFsdWVzKCksIG9wdGlvbnMpCisKKworY2xhc3MgRW50cnkob2JqZWN0KToKKyAgICAiIiIKKyAgICBBbiBlbnRyeSBpbiB0aGUgdGhyaWZ0IHByb2ZpbGUgb3V0cHV0LgorICAgIENvbnRhaW5zIGEgaGVhZGVyIGxpbmUsIGFuZCBhIGJhY2t0cmFjZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGVhZGVyKToKKyAgICAgICAgc2VsZi5oZWFkZXIgPSBoZWFkZXIKKyAgICAgICAgc2VsZi5idCA9IFtdCisKKyAgICBkZWYgYWRkRnJhbWUoc2VsZiwgZmlsZW5hbWUsIGFkZHJlc3MpOgorICAgICAgICAjIElmIGxpYmMgd2FzIGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBzeW1ib2xzIG5hbWVzLCB0aGUgZmlsZW5hbWUKKyAgICAgICAgIyBhcmd1bWVudCB3aWxsIGJlIG9mIHRoZSBmb3JtIDxmaWxlbmFtZT4oPGZ1bmN0aW9uPis8b2Zmc2V0PikKKyAgICAgICAgIyBTbywgc3RyaXAgb2ZmIGFueXRoaW5nIGFmdGVyIHRoZSBsYXN0ICcoJworICAgICAgICBpZHggPSBmaWxlbmFtZS5yZmluZCgnKCcpCisgICAgICAgIGlmIGlkeCA+PSAwOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6aWR4XQorCisgICAgICAgIGFkZHIgPSBnZXRfYWRkcmVzcyhmaWxlbmFtZSwgYWRkcmVzcykKKyAgICAgICAgc2VsZi5idC5hcHBlbmQoYWRkcikKKworICAgIGRlZiB3cml0ZShzZWxmLCBmLCBvcHRpb25zKToKKyAgICAgICAgZi53cml0ZShzZWxmLmhlYWRlcikKKyAgICAgICAgZi53cml0ZSgnXG4nKQorICAgICAgICBuID0gMAorICAgICAgICBmb3IgYWRkcmVzcyBpbiBzZWxmLmJ0OgorICAgICAgICAgICAgZi53cml0ZSgnICAjJS0yZCAlczolc1xuJyAlIChuLCBhZGRyZXNzLnNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc291cmNlTGluZSkpCisgICAgICAgICAgICBuICs9IDEKKyAgICAgICAgICAgIGlmIG9wdGlvbnMucHJpbnRGdW5jdGlvbnM6CisgICAgICAgICAgICAgICAgaWYgYWRkcmVzcy5mdW5jdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnICAgICAgJXNcbicgJSAoYWRkcmVzcy5mdW5jdGlvbiwpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyAgICAgID8/XG4nKQorCisKK2RlZiBwcm9jZXNzX2ZpbGUoaW5fZmlsZSwgb3V0X2ZpbGUsIG9wdGlvbnMpOgorICAgICIiIgorICAgIFJlYWQgdGhyaWZ0IHByb2ZpbGUgb3V0cHV0IGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBmaWxlLCBhbmQgcHJpbnQKKyAgICBwcmV0dGllciBpbmZvcm1hdGlvbiBvbiB0aGUgb3V0cHV0IGZpbGUuCisgICAgIiIiCisgICAgIworICAgICMgQSBuYWl2ZSBhcHByb2FjaCB3b3VsZCBiZSB0byByZWFkIHRoZSBpbnB1dCBsaW5lIGJ5IGxpbmUsCisgICAgIyBhbmQgZWFjaCB0aW1lIHdlIGNvbWUgdG8gYSBmaWxlbmFtZSBhbmQgYWRkcmVzcywgcGFzcyBpdCB0byBhZGRyMmxpbmUKKyAgICAjIGFuZCBwcmludCB0aGUgcmVzdWx0aW5nIGluZm9ybWF0aW9uLiAgVW5mb3J0dW5hdGVseSwgYWRkcjJsaW5lIGNhbiBiZQorICAgICMgcXVpdGUgc2xvdywgZXNwZWNpYWxseSB3aXRoIGxhcmdlIGV4ZWN1dGFibGVzLgorICAgICMKKyAgICAjIFRoaXMgYXBwcm9hY2ggaXMgbXVjaCBmYXN0ZXIuICBXZSByZWFkIGluIGFsbCBvZiB0aGUgaW5wdXQsIHN0b3JpbmcKKyAgICAjIHRoZSBhZGRyZXNzZXMgaW4gZWFjaCBmaWxlIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZC4gIFdlIHRoZW4gY2FsbAorICAgICMgYWRkcjJsaW5lIGp1c3Qgb25jZSBmb3IgZWFjaCBmaWxlLiAgVGhpcyBpcyBtdWNoIGZhc3RlciB0aGFuIGNhbGxpbmcKKyAgICAjIGFkZHIybGluZSBvbmNlIHBlciBhZGRyZXNzLgorICAgICMKKworICAgIHZpcnRfY2FsbF9yZWdleCA9IHJlLmNvbXBpbGUocideXHMqVF9WSVJUVUFMX0NBTEw6IChcZCspIGNhbGxzIG9uICguKik6JCcpCisgICAgZ2VuX3Byb3RfcmVnZXggPSByZS5jb21waWxlKAorICAgICAgICByJ15ccypUX0dFTkVSSUNfUFJPVE9DT0w6IChcZCspIGNhbGxzIHRvICguKikgd2l0aCBhICguKik6JCcpCisgICAgYnRfcmVnZXggPSByZS5jb21waWxlKHInXlxzKiMoXGQrKVxzKiguKikgXFsoMHhbMC05QS1aYS16XSspXF0kJykKKworICAgICMgUGFyc2UgYWxsIG9mIHRoZSBpbnB1dCwgYW5kIHN0b3JlIGl0IGFzIEVudHJ5IG9iamVjdHMKKyAgICBlbnRyaWVzID0gW10KKyAgICBjdXJyZW50X2VudHJ5ID0gTm9uZQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGxpbmUgPSBpbl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIGxpbmUgPT0gJ1xuJyBvciBsaW5lLnN0YXJ0c3dpdGgoJ1RocmlmdCB2aXJ0dWFsIGNhbGwgaW5mbzonKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgdmlydF9jYWxsX21hdGNoID0gdmlydF9jYWxsX3JlZ2V4Lm1hdGNoKGxpbmUpCisgICAgICAgIGlmIHZpcnRfY2FsbF9tYXRjaDoKKyAgICAgICAgICAgIG51bV9jYWxscyA9IGludCh2aXJ0X2NhbGxfbWF0Y2guZ3JvdXAoMSkpCisgICAgICAgICAgICB0eXBlX25hbWUgPSB2aXJ0X2NhbGxfbWF0Y2guZ3JvdXAoMikKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuY3h4ZmlsdDoKKyAgICAgICAgICAgICAgICAjIFR5cGUgbmFtZXMgcmVwb3J0ZWQgYnkgdHlwZWlkKCkgYXJlIGludGVybmFsIG5hbWVzLgorICAgICAgICAgICAgICAgICMgQnkgZGVmYXVsdCwgYysrZmlsdCBkb2Vzbid0IGRlbWFuZ2xlIGludGVybmFsIHR5cGUgbmFtZXMuCisgICAgICAgICAgICAgICAgIyAoU29tZSB2ZXJzaW9ucyBvZiBjKytmaWx0IGhhdmUgYSAiLXQiIG9wdGlvbiB0byBlbmFibGUgdGhpcy4KKyAgICAgICAgICAgICAgICAjIE90aGVyIHZlcnNpb25zIGRvbid0IGhhdmUgdGhpcyBhcmd1bWVudCwgYnV0IGRlbWFuZ2xlIHR5cGUKKyAgICAgICAgICAgICAgICAjIG5hbWVzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCwgYnV0IG5vdCBvbiBzdGRpbi4pCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgSWYgdGhlIG91dHB1dCBpcyBiZWluZyBmaWx0ZXJlZCB0aHJvdWdoIGMrK2ZpbHQsIHByZXBlbmQKKyAgICAgICAgICAgICAgICAjICJfWiIgdG8gdGhlIHR5cGUgbmFtZSB0byBtYWtlIGl0IGxvb2sgbGlrZSBhbiBleHRlcm5hbCBuYW1lLgorICAgICAgICAgICAgICAgIHR5cGVfbmFtZSA9ICdfWicgKyB0eXBlX25hbWUKKyAgICAgICAgICAgIGhlYWRlciA9ICdUX1ZJUlRVQUxfQ0FMTDogJWQgY2FsbHMgb24gIiVzIicgJSBcCisgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lKQorICAgICAgICAgICAgaWYgY3VycmVudF9lbnRyeSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChjdXJyZW50X2VudHJ5KQorICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IEVudHJ5KGhlYWRlcikKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZ2VuX3Byb3RfbWF0Y2ggPSBnZW5fcHJvdF9yZWdleC5tYXRjaChsaW5lKQorICAgICAgICBpZiBnZW5fcHJvdF9tYXRjaDoKKyAgICAgICAgICAgIG51bV9jYWxscyA9IGludChnZW5fcHJvdF9tYXRjaC5ncm91cCgxKSkKKyAgICAgICAgICAgIHR5cGVfbmFtZTEgPSBnZW5fcHJvdF9tYXRjaC5ncm91cCgyKQorICAgICAgICAgICAgdHlwZV9uYW1lMiA9IGdlbl9wcm90X21hdGNoLmdyb3VwKDMpCisgICAgICAgICAgICBpZiBvcHRpb25zLmN4eGZpbHQ6CisgICAgICAgICAgICAgICAgdHlwZV9uYW1lMSA9ICdfWicgKyB0eXBlX25hbWUxCisgICAgICAgICAgICAgICAgdHlwZV9uYW1lMiA9ICdfWicgKyB0eXBlX25hbWUyCisgICAgICAgICAgICBoZWFkZXIgPSAnVF9HRU5FUklDX1BST1RPQ09MOiAlZCBjYWxscyB0byAiJXMiIHdpdGggYSAiJXMiJyAlIFwKKyAgICAgICAgICAgICAgICAobnVtX2NhbGxzLCB0eXBlX25hbWUxLCB0eXBlX25hbWUyKQorICAgICAgICAgICAgaWYgY3VycmVudF9lbnRyeSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChjdXJyZW50X2VudHJ5KQorICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IEVudHJ5KGhlYWRlcikKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgYnRfbWF0Y2ggPSBidF9yZWdleC5tYXRjaChsaW5lKQorICAgICAgICBpZiBidF9tYXRjaDoKKyAgICAgICAgICAgIGlmIGN1cnJlbnRfZW50cnkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ2ZvdW5kIGJhY2t0cmFjZSBmcmFtZSBiZWZvcmUgZW50cnkgaGVhZGVyJykKKyAgICAgICAgICAgIGZyYW1lX251bSA9IGludChidF9tYXRjaC5ncm91cCgxKSkKKyAgICAgICAgICAgIGZpbGVuYW1lID0gYnRfbWF0Y2guZ3JvdXAoMikKKyAgICAgICAgICAgIGFkZHJlc3MgPSBidF9tYXRjaC5ncm91cCgzKQorICAgICAgICAgICAgY3VycmVudF9lbnRyeS5hZGRGcmFtZShmaWxlbmFtZSwgYWRkcmVzcykKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCd1bmV4cGVjdGVkIGxpbmUgaW4gaW5wdXQ6ICVyJyAlIChsaW5lLCkpCisKKyAgICAjIEFkZCB0aGUgbGFzdCBlbnRyeSB3ZSB3ZXJlIHByb2Nlc3NpbmcgdG8gdGhlIGxpc3QKKyAgICBpZiBjdXJyZW50X2VudHJ5IGlzIG5vdCBOb25lOgorICAgICAgICBlbnRyaWVzLmFwcGVuZChjdXJyZW50X2VudHJ5KQorICAgICAgICBjdXJyZW50X2VudHJ5ID0gTm9uZQorCisgICAgIyBMb29rIHVwIGFsbCBvZiB0aGUgYWRkcmVzc2VzCisgICAgbG9va3VwX2FkZHJlc3NlcyhvcHRpb25zKQorCisgICAgIyBQcmludCBvdXQgdGhlIGVudHJpZXMsIG5vdyB0aGF0IHRoZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiB0cmFuc2xhdGVkCisgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgIGVudHJ5LndyaXRlKG91dF9maWxlLCBvcHRpb25zKQorICAgICAgICBvdXRfZmlsZS53cml0ZSgnXG4nKQorCisKK2RlZiBzdGFydF9jcHBmaWx0KCk6CisgICAgKHJlYWRfcGlwZSwgd3JpdGVfcGlwZSkgPSBvcy5waXBlKCkKKworICAgICMgRm9yay4gIFJ1biBjKytmaWx0IGluIHRoZSBwYXJlbnQgcHJvY2VzcywKKyAgICAjIGFuZCB0aGVuIGNvbnRpbnVlIG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjaGlsZC4KKyAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgIyBjaGlsZAorICAgICAgICBvcy5kdXAyKHdyaXRlX3BpcGUsIHN5cy5zdGRvdXQuZmlsZW5vKCkpCisgICAgICAgIG9zLmNsb3NlKHJlYWRfcGlwZSkKKyAgICAgICAgb3MuY2xvc2Uod3JpdGVfcGlwZSkKKyAgICAgICAgcmV0dXJuCisgICAgZWxzZToKKyAgICAgICAgIyBwYXJlbnQKKyAgICAgICAgb3MuZHVwMihyZWFkX3BpcGUsIHN5cy5zdGRpbi5maWxlbm8oKSkKKyAgICAgICAgb3MuY2xvc2UocmVhZF9waXBlKQorICAgICAgICBvcy5jbG9zZSh3cml0ZV9waXBlKQorCisgICAgICAgIGNtZCA9IFsnYysrZmlsdCddCisgICAgICAgIG9zLmV4ZWN2cChjbWRbMF0sIGNtZCkKKworCitkZWYgbWFpbihhcmd2KToKKyAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIodXNhZ2U9JyVwcm9nIFtvcHRpb25zXSBbPGZpbGU+XScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tbm8tZnVuY3Rpb25zJywgaGVscD0nRG9uXCd0IHByaW50IGZ1bmN0aW9uIG5hbWVzJywKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdwcmludEZ1bmN0aW9ucycsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9VHJ1ZSkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1uby1kZW1hbmdsZScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRG9uXCd0IGRlbWFuZ2xlIEMrKyBzeW1ib2wgbmFtZXMnLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J2N4eGZpbHQnLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVRydWUpCisKKyAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2WzE6XSkKKyAgICBudW1fYXJncyA9IGxlbihhcmdzKQorICAgIGlmIG51bV9hcmdzID09IDA6CisgICAgICAgIGluX2ZpbGUgPSBzeXMuc3RkaW4KKyAgICBlbGlmIG51bV9hcmdzID09IDE6CisgICAgICAgIGluX2ZpbGUgPSBvcGVuKGFyZ3ZbMV0sICdyJykKKyAgICBlbHNlOgorICAgICAgICBwYXJzZXIucHJpbnRfdXNhZ2Uoc3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgJ3RyYWlsaW5nIGFyZ3VtZW50czogJXMnICUgKCcgJy5qb2luKGFyZ3NbMTpdLCkpCisgICAgICAgIHJldHVybiAxCisKKyAgICBpZiBvcHRpb25zLmN4eGZpbHQ6CisgICAgICAgIHN0YXJ0X2NwcGZpbHQoKQorCisgICAgcHJvY2Vzc19maWxlKGluX2ZpbGUsIHN5cy5zdGRvdXQsIG9wdGlvbnMpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICByYyA9IG1haW4oc3lzLmFyZ3YpCisgICAgc3lzLmV4aXQocmMpCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbCBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjZiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbApAQCAtMCwwICsxLDkyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPHByb2plY3QgCisgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIAorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxncm91cElkPm9yZy5hcGFjaGUudGhyaWZ0PC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD50aHJpZnQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgorICA8bmFtZT50aHJpZnQtbWF2ZW4tcGx1Z2luPC9uYW1lPgorICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CisgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4xNC4xPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICA8dGhyaWZ0RXhlY3V0YWJsZT4ke3RocmlmdC5jb21waWxlcn08L3RocmlmdEV4ZWN1dGFibGU+CisgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorICA8ZGVwZW5kZW5jaWVzPgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC4xMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuMS4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MTQuMC4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjAuMTQ8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuMTk8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorICA8cHJvcGVydGllcz4KKyAgICA8dGhyaWZ0LnJvb3Q+JHtiYXNlZGlyfS8uLi8uLjwvdGhyaWZ0LnJvb3Q+CisgICAgPHRocmlmdC5jb21waWxlcj4ke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0PC90aHJpZnQuY29tcGlsZXI+CisgICAgPHRocmlmdC50ZXN0LmhvbWU+JHt0aHJpZnQucm9vdH0vdGVzdDwvdGhyaWZ0LnRlc3QuaG9tZT4KKyAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjliZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmNsaS5Db21tYW5kTGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuaW8uUmF3SW5wdXRTdHJlYW1GYWNhZGU7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHMubmV3SGFzaFNldDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMubGlzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlscy5jbGVhbkRpcmVjdG9yeTsKK2ltcG9ydCBzdGF0aWMgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlscy5jb3B5U3RyZWFtVG9GaWxlOworaW1wb3J0IHN0YXRpYyBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzLmdldEZpbGVzOworCisvKioKKyAqIEFic3RyYWN0IE1vam8gaW1wbGVtZW50YXRpb24uCisgKiA8cC8+CisgKiBUaGlzIGNsYXNzIGlzIGV4dGVuZGVkIGJ5IHtAbGluayBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbi5UaHJpZnRDb21waWxlTW9qb30gYW5kCisgKiB7QGxpbmsgb3JnLmFwYWNoZS50aHJpZnQubWF2ZW4uVGhyaWZ0VGVzdENvbXBpbGVNb2pvfSBpbiBvcmRlciB0byBvdmVycmlkZSB0aGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IKKyAqIGNvbXBpbGluZyB0aGUgbWFpbiBvciB0ZXN0IGNsYXNzZXMgcmVzcGVjdGl2ZWx5LgorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRocmlmdE1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUklGVF9GSUxFX1NVRkZJWCA9ICIudGhyaWZ0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOQ0xVREVTID0gIioqLyoiICsgVEhSSUZUX0ZJTEVfU1VGRklYOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgTWF2ZW4gcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0fSIKKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciB1c2VkIHRvIGFkZCByZXNvdXJjZXMgdG8gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAY29tcG9uZW50CisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdEhlbHBlciBwcm9qZWN0SGVscGVyOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgcGF0aCB0byB0aGUge0Bjb2RlIHRocmlmdH0gZXhlY3V0YWJsZS4gQnkgZGVmYXVsdCBpdCB3aWxsIHNlYXJjaCB0aGUge0Bjb2RlICRQQVRIfS4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRocmlmdEV4ZWN1dGFibGU7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHN0cmluZyBpcyBwYXNzZWQgdG8gdGhlIHtAY29kZSAtLWdlbn0gb3B0aW9uIG9mIHRoZSB7QGNvZGUgdGhyaWZ0fSBwYXJhbWV0ZXIuIEJ5IGRlZmF1bHQKKyAgICAgKiBpdCB3aWxsIGdlbmVyYXRlIEphdmEgb3V0cHV0LiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgb3B0aW9uIGlzIHRvIGJlIGFibGUgdG8gYWRkIG9wdGlvbnMKKyAgICAgKiB0byB0aGUgSmF2YSBnZW5lcmF0b3IgLSBpZiB5b3UgZ2VuZXJhdGUgc29tZXRoaW5nIGVsc2UsIHlvdSdyZSBvbiB5b3VyIG93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iamF2YSIKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0b3I7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlW10gYWRkaXRpb25hbFRocmlmdFBhdGhFbGVtZW50cyA9IG5ldyBGaWxlW117fTsKKworICAgIC8qKgorICAgICAqIFNpbmNlIHtAY29kZSB0aHJpZnR9IGNhbm5vdCBhY2Nlc3MgamFycywgdGhyaWZ0IGZpbGVzIGluIGRlcGVuZGVuY2llcyBhcmUgZXh0cmFjdGVkIHRvIHRoaXMgbG9jYXRpb24KKyAgICAgKiBhbmQgZGVsZXRlZCBvbiBleGl0LiBUaGlzIGRpcmVjdG9yeSBpcyBhbHdheXMgY2xlYW5lZCBkdXJpbmcgZXhlY3V0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90aHJpZnQtZGVwZW5kZW5jaWVzIgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSB0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5OworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgcGF0aCB0byB0aGUgbG9jYWwgbWF2ZW4ge0Bjb2RlIHJlcG9zaXRvcnl9LgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2xvY2FsUmVwb3NpdG9yeX0iCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhpcyB0byB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUgaGFzaGluZyBvZiBkZXBlbmRlbnQgamFyIHBhdGhzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIHBsdWdpbiBleHBhbmRzIGphcnMgb24gdGhlIGNsYXNzcGF0aCBsb29raW5nIGZvciBlbWJlZGRlZCAudGhyaWZ0IGZpbGVzLgorICAgICAqIE5vcm1hbGx5IHRoZXNlIHBhdGhzIGFyZSBoYXNoZWQgKE1ENSkgdG8gYXZvaWQgaXNzdWVzIHdpdGggbG9uZyBmaWxlIG5hbWVzIG9uIHdpbmRvd3MuCisgICAgICogSG93ZXZlciBpZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byB7QGNvZGUgZmFsc2V9IGxvbmdlciBwYXRocyB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InRydWUiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzaERlcGVuZGVudFBhdGhzOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gaW5jbHVkZXMgPSBJbW11dGFibGVTZXQub2YoREVGQVVMVF9JTkNMVURFUyk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBleGNsdWRlcyA9IEltbXV0YWJsZVNldC5vZigpOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBzdGFsZU1pbGxpcyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU3RhbGVuZXNzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgbW9qby4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7CisgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0U291cmNlUm9vdCA9IGdldFRocmlmdFNvdXJjZVJvb3QoKTsKKyAgICAgICAgaWYgKHRocmlmdFNvdXJjZVJvb3QuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0PEZpbGU+IHRocmlmdEZpbGVzID0gZmluZFRocmlmdEZpbGVzSW5EaXJlY3RvcnkodGhyaWZ0U291cmNlUm9vdCk7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQ8RmlsZT4gb3V0cHV0RmlsZXMgPSBmaW5kR2VuZXJhdGVkRmlsZXNJbkRpcmVjdG9yeShnZXRPdXRwdXREaXJlY3RvcnkoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAodGhyaWZ0RmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIk5vIHRocmlmdCBmaWxlcyB0byBjb21waWxlLiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tTdGFsZW5lc3MgJiYgKChsYXN0TW9kaWZpZWQodGhyaWZ0RmlsZXMpICsgc3RhbGVNaWxsaXMpIDwgbGFzdE1vZGlmaWVkKG91dHB1dEZpbGVzKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiU2tpcHBpbmcgY29tcGlsYXRpb24gYmVjYXVzZSB0YXJnZXQgZGlyZWN0b3J5IG5ld2VyIHRoYW4gc291cmNlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNoRmlsZXMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQ8RmlsZT4gZGVyaXZlZFRocmlmdFBhdGhFbGVtZW50cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVRocmlmdFBhdGhGcm9tSmFycyh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCBnZXREZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5Lm1rZGlycygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFF1aWNrIGZpeCB0byBmaXggaXNzdWVzIHdpdGggdHdvIG12biBpbnN0YWxscyBpbiBhIHJvdyAoaWUgbm8gY2xlYW4pCisgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFuRGlyZWN0b3J5KG91dHB1dERpcmVjdG9yeSk7CisKKyAgICAgICAgICAgICAgICAgICAgVGhyaWZ0IHRocmlmdCA9IG5ldyBUaHJpZnQuQnVpbGRlcih0aHJpZnRFeGVjdXRhYmxlLCBvdXRwdXREaXJlY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEdlbmVyYXRvcihnZW5lcmF0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFRocmlmdFBhdGhFbGVtZW50KHRocmlmdFNvdXJjZVJvb3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFRocmlmdFBhdGhFbGVtZW50cyhkZXJpdmVkVGhyaWZ0UGF0aEVsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRUaHJpZnRQYXRoRWxlbWVudHMoYXNMaXN0KGFkZGl0aW9uYWxUaHJpZnRQYXRoRWxlbWVudHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRUaHJpZnRGaWxlcyh0aHJpZnRGaWxlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGV4aXRTdGF0dXMgPSB0aHJpZnQuY29tcGlsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhpdFN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvcigidGhyaWZ0IGZhaWxlZCBvdXRwdXQ6ICIgKyB0aHJpZnQuZ2V0T3V0cHV0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoInRocmlmdCBmYWlsZWQgZXJyb3I6ICIgKyB0aHJpZnQuZ2V0RXJyb3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJpZnQgZGlkIG5vdCBleGl0IGNsZWFubHkuIFJldmlldyBvdXRwdXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXR0YWNoRmlsZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkFuIElPIGVycm9yIG9jY3VycmVkIiwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbigidGhyaWZ0IGZhaWxlZCB0byBleGVjdXRlIGJlY2F1c2U6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChDb21tYW5kTGluZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGludm9raW5nIHRocmlmdC4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldExvZygpLmluZm8oZm9ybWF0KCIlcyBkb2VzIG5vdCBleGlzdC4gUmV2aWV3IHRoZSBjb25maWd1cmF0aW9uIG9yIGNvbnNpZGVyIGRpc2FibGluZyB0aGUgcGx1Z2luLiIsCisgICAgICAgICAgICAgICAgICAgIHRocmlmdFNvdXJjZVJvb3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEltbXV0YWJsZVNldDxGaWxlPiBmaW5kR2VuZXJhdGVkRmlsZXNJbkRpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRpcmVjdG9yeSA9PSBudWxsIHx8ICFkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQub2YoKTsKKworICAgICAgICBMaXN0PEZpbGU+IGphdmFGaWxlc0luRGlyZWN0b3J5ID0gZ2V0RmlsZXMoZGlyZWN0b3J5LCAiKiovKi5qYXZhIiwgbnVsbCk7CisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKGphdmFGaWxlc0luRGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkKEltbXV0YWJsZVNldDxGaWxlPiBmaWxlcykgeworICAgICAgICBsb25nIHJlc3VsdCA9IDA7CisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgICAgIGlmIChmaWxlLmxhc3RNb2RpZmllZCgpID4gcmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tQYXJhbWV0ZXJzKCkgeworICAgICAgICBjaGVja05vdE51bGwocHJvamVjdCwgInByb2plY3QiKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHByb2plY3RIZWxwZXIsICJwcm9qZWN0SGVscGVyIik7CisgICAgICAgIGNoZWNrTm90TnVsbCh0aHJpZnRFeGVjdXRhYmxlLCAidGhyaWZ0RXhlY3V0YWJsZSIpOworICAgICAgICBjaGVja05vdE51bGwoZ2VuZXJhdG9yLCAiZ2VuZXJhdG9yIik7CisgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0U291cmNlUm9vdCA9IGdldFRocmlmdFNvdXJjZVJvb3QoKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHRocmlmdFNvdXJjZVJvb3QpOworICAgICAgICBjaGVja0FyZ3VtZW50KCF0aHJpZnRTb3VyY2VSb290LmlzRmlsZSgpLCAidGhyaWZ0U291cmNlUm9vdCBpcyBhIGZpbGUsIG5vdCBhIGRpcmVjdG9yeSIpOworICAgICAgICBjaGVja05vdE51bGwodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgInRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkiKTsKKyAgICAgICAgY2hlY2tTdGF0ZSghdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeS5pc0ZpbGUoKSwgInRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnkgaXMgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgZmluYWwgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKG91dHB1dERpcmVjdG9yeSk7CisgICAgICAgIGNoZWNrU3RhdGUoIW91dHB1dERpcmVjdG9yeS5pc0ZpbGUoKSwgInRoZSBvdXRwdXREaXJlY3RvcnkgaXMgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRUaHJpZnRTb3VyY2VSb290KCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxBcnRpZmFjdD4gZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhdHRhY2hGaWxlcygpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIEZpbGV9IGZvciBlYWNoIGRlcGVuZGVuY3kgYXJ0aWZhY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGFsbCBkZXBlbmRlbmN5IGFydGlmYWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEltbXV0YWJsZVNldDxGaWxlPiBnZXREZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcygpIHsKKyAgICAgICAgU2V0PEZpbGU+IGRlcGVuZGVuY3lBcnRpZmFjdEZpbGVzID0gbmV3SGFzaFNldCgpOworICAgICAgICBmb3IgKEFydGlmYWN0IGFydGlmYWN0IDogZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpKSB7CisgICAgICAgICAgICBkZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcy5hZGQoYXJ0aWZhY3QuZ2V0RmlsZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZihkZXBlbmRlbmN5QXJ0aWZhY3RGaWxlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEltbXV0YWJsZVNldDxGaWxlPiBtYWtlVGhyaWZ0UGF0aEZyb21KYXJzKEZpbGUgdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgSXRlcmFibGU8RmlsZT4gY2xhc3NwYXRoRWxlbWVudEZpbGVzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGNsYXNzcGF0aEVsZW1lbnRGaWxlcywgImNsYXNzcGF0aEVsZW1lbnRGaWxlcyIpOworICAgICAgICAvLyBjbGVhbiB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byBlbnN1cmUgdGhhdCBzdGFsZSBmaWxlcyBhcmVuJ3QgdXNlZAorICAgICAgICBpZiAodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeS5leGlzdHMoKSkgeworICAgICAgICAgICAgY2xlYW5EaXJlY3RvcnkodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSk7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8RmlsZT4gdGhyaWZ0RGlyZWN0b3JpZXMgPSBuZXdIYXNoU2V0KCk7CisKKyAgICAgICAgZm9yIChGaWxlIGNsYXNzcGF0aEVsZW1lbnRGaWxlIDogY2xhc3NwYXRoRWxlbWVudEZpbGVzKSB7CisgICAgICAgICAgICAvLyBmb3Igc29tZSByZWFzb24gdW5kZXIgSUFNLCB3ZSByZWNlaXZlIHBvbXMgYXMgZGVwZW5kZW50IGZpbGVzCisgICAgICAgICAgICAvLyBJIGFtIGV4Y2x1ZGluZyAueG1sIHJhdGhlciB0aGFuIGluY2x1ZGluZyAuamFyIGFzIHRoZXJlIG1heSBiZSBvdGhlciBleHRlbnNpb25zIGluIHVzZSAoc2FyLCBoYXIsIHppcCkKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGhFbGVtZW50RmlsZS5pc0ZpbGUoKSAmJiBjbGFzc3BhdGhFbGVtZW50RmlsZS5jYW5SZWFkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWNsYXNzcGF0aEVsZW1lbnRGaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhtbCIpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGphciBmaWxlLiB0aGUgY29uc3RydWN0b3IgdmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIEphckZpbGUgY2xhc3NwYXRoSmFyOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aEphciA9IG5ldyBKYXJGaWxlKGNsYXNzcGF0aEVsZW1lbnRGaWxlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyB3YXMgbm90IGEgcmVhZGFibGUgYXJ0aWZhY3QiLCBjbGFzc3BhdGhFbGVtZW50RmlsZSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENvcHkgZWFjaCAudGhyaWZ0IGZpbGUgZm91bmQgaW4gdGhlIEpBUiBpbnRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgcHJlc2VydmluZyB0aGUKKyAgICAgICAgICAgICAgICAgKiBkaXJlY3RvcnkgcGF0aCBpdCBoYWQgcmVsYXRpdmUgdG8gaXRzIGNvbnRhaW5pbmcgSkFSLiBBZGQgdGhlIHJlc3VsdGluZyByb290IGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAqICh1bmlxdWUgZm9yIGVhY2ggSkFSIHByb2Nlc3NlZCkgdG8gdGhlIHNldCBvZiB0aHJpZnQgaW5jbHVkZSBkaXJlY3RvcmllcyB0byB1c2Ugd2hlbgorICAgICAgICAgICAgICAgICAqIGNvbXBpbGluZy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IgKEphckVudHJ5IGphckVudHJ5IDogbGlzdChjbGFzc3BhdGhKYXIuZW50cmllcygpKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgamFyRW50cnlOYW1lID0gamFyRW50cnkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoamFyRW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKFRIUklGVF9GSUxFX1NVRkZJWCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cnVuY2F0ZWRKYXJQYXRoID0gdHJ1bmNhdGVQYXRoKGNsYXNzcGF0aEphci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRSb290RGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgdHJ1bmNhdGVkSmFyUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHVuY29tcHJlc3NlZENvcHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSh0aHJpZnRSb290RGlyZWN0b3J5LCBqYXJFbnRyeU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkQ29weS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5U3RyZWFtVG9GaWxlKG5ldyBSYXdJbnB1dFN0cmVhbUZhY2FkZShjbGFzc3BhdGhKYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldElucHV0U3RyZWFtKGphckVudHJ5KSksIHVuY29tcHJlc3NlZENvcHkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0RGlyZWN0b3JpZXMuYWRkKHRocmlmdFJvb3REaXJlY3RvcnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNsYXNzcGF0aEVsZW1lbnRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlW10gdGhyaWZ0RmlsZXMgPSBjbGFzc3BhdGhFbGVtZW50RmlsZS5saXN0RmlsZXMobmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aChUSFJJRlRfRklMRV9TVUZGSVgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICBpZiAodGhyaWZ0RmlsZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJpZnREaXJlY3Rvcmllcy5hZGQoY2xhc3NwYXRoRWxlbWVudEZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKHRocmlmdERpcmVjdG9yaWVzKTsKKyAgICB9CisKKyAgICBJbW11dGFibGVTZXQ8RmlsZT4gZmluZFRocmlmdEZpbGVzSW5EaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTm90TnVsbChkaXJlY3RvcnkpOworICAgICAgICBjaGVja0FyZ3VtZW50KGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpLCAiJXMgaXMgbm90IGEgZGlyZWN0b3J5IiwgZGlyZWN0b3J5KTsKKyAgICAgICAgTGlzdDxGaWxlPiB0aHJpZnRGaWxlc0luRGlyZWN0b3J5ID0gZ2V0RmlsZXMoZGlyZWN0b3J5LCAKKyAgICAgICAgCQlKb2luZXIub24oIiwiKS5qb2luKGluY2x1ZGVzKSwKKyAgICAgICAgCQlKb2luZXIub24oIiwiKS5qb2luKGV4Y2x1ZGVzKSk7CisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKHRocmlmdEZpbGVzSW5EaXJlY3RvcnkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydW5jYXRlcyB0aGUgcGF0aCBvZiBqYXIgZmlsZXMgc28gdGhhdCB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXJQYXRoIHRoZSBmdWxsIHBhdGggb2YgYSBqYXIgZmlsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0cnVuY2F0ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeSBvciByb290IG9mIHRoZSBkcml2ZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgdHJ1bmNhdGVQYXRoKGZpbmFsIFN0cmluZyBqYXJQYXRoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGhhc2hEZXBlbmRlbnRQYXRocykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9IZXhTdHJpbmcoTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1IikuZGlnZXN0KGphclBhdGguZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGV4cGFuZCBkZXBlbmRlbnQgamFyIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSA9IGxvY2FsUmVwb3NpdG9yeS5nZXRCYXNlZGlyKCkucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICBpZiAoIXJlcG9zaXRvcnkuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgcmVwb3NpdG9yeSArPSAiLyI7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IGphclBhdGgucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICBpbnQgcmVwb3NpdG9yeUluZGV4ID0gcGF0aC5pbmRleE9mKHJlcG9zaXRvcnkpOworICAgICAgICBpZiAocmVwb3NpdG9yeUluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcocmVwb3NpdG9yeUluZGV4ICsgcmVwb3NpdG9yeS5sZW5ndGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBCeSBub3cgdGhlIHBhdGggc2hvdWxkIGJlIGdvb2QsIGJ1dCBkbyBhIGZpbmFsIGNoZWNrIHRvIGZpeCB3aW5kb3dzIG1hY2hpbmVzLgorICAgICAgICBpbnQgY29sb25JbmRleCA9IHBhdGguaW5kZXhPZignOicpOworICAgICAgICBpZiAoY29sb25JbmRleCAhPSAtMSkgeworICAgICAgICAgICAgLy8gMiA9IDpcIGluIEM6XAorICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhfQ0hBUlMgPSAiMDEyMzQ1Njc4OWFiY2RlZiIudG9DaGFyQXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSGV4U3RyaW5nKGJ5dGVbXSBieXRlQXJyYXkpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBoZXhTdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigyICogYnl0ZUFycmF5Lmxlbmd0aCk7CisgICAgICAgIGZvciAoZmluYWwgYnl0ZSBiIDogYnl0ZUFycmF5KSB7CisgICAgICAgICAgICBoZXhTdHJpbmcuYXBwZW5kKEhFWF9DSEFSU1soYiAmIDB4RjApID4+IDRdKS5hcHBlbmQoSEVYX0NIQVJTW2IgJiAweDBGXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhleFN0cmluZy50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdC5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlYTk1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdC5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmNsaS5Db21tYW5kTGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuY2xpLkNvbW1hbmRMaW5lVXRpbHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmNsaS5Db21tYW5kbGluZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzLm5ld0xpbmtlZExpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0cy5uZXdIYXNoU2V0OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBpbnZva2FibGUgY29uZmlndXJhdGlvbiBvZiB0aGUge0Bjb2RlIHRocmlmdH0KKyAqIGNvbXBpbGVyLiBUaGUgYWN0dWFsIGV4ZWN1dGFibGUgaXMgaW52b2tlZCB1c2luZyB0aGUgcGxleHVzCisgKiB7QGxpbmsgQ29tbWFuZGxpbmV9LgorICogPHAvPgorICogVGhpcyBjbGFzcyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBnZW5lcmF0aW5nIGphdmEgc291cmNlIGZpbGVzLgorICovCitmaW5hbCBjbGFzcyBUaHJpZnQgeworCisgICAgZmluYWwgc3RhdGljIFN0cmluZyBHRU5FUkFURURfSkFWQSA9ICJnZW4tamF2YSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBleGVjdXRhYmxlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGdlbmVyYXRvcjsKKyAgICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZVNldDxGaWxlPiB0aHJpZnRQYXRoRWxlbWVudHM7CisgICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVTZXQ8RmlsZT4gdGhyaWZ0RmlsZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGphdmFPdXRwdXREaXJlY3Rvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kTGluZVV0aWxzLlN0cmluZ1N0cmVhbUNvbnN1bWVyIG91dHB1dDsKKyAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRMaW5lVXRpbHMuU3RyaW5nU3RyZWFtQ29uc3VtZXIgZXJyb3I7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGVjdXRhYmxlICAgICAgICAgIFRoZSBwYXRoIHRvIHRoZSB7QGNvZGUgdGhyaWZ0fSBleGVjdXRhYmxlLgorICAgICAqIEBwYXJhbSBnZW5lcmF0b3IgICAgICAgICAgIFRoZSB2YWx1ZSBmb3IgdGhlIHtAY29kZSAtLWdlbn0gb3B0aW9uLgorICAgICAqIEBwYXJhbSB0aHJpZnRQYXRoICAgICAgICAgIFRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCB0byBzZWFyY2ggZm9yIGltcG9ydHMuCisgICAgICogQHBhcmFtIHRocmlmdEZpbGVzICAgICAgICAgVGhlIHRocmlmdCBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KKyAgICAgKiBAcGFyYW0gamF2YU91dHB1dERpcmVjdG9yeSBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGphdmEgc291cmNlIGZpbGVzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBUaHJpZnQoU3RyaW5nIGV4ZWN1dGFibGUsIFN0cmluZyBnZW5lcmF0b3IsIEltbXV0YWJsZVNldDxGaWxlPiB0aHJpZnRQYXRoLAorICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldDxGaWxlPiB0aHJpZnRGaWxlcywgRmlsZSBqYXZhT3V0cHV0RGlyZWN0b3J5KSB7CisgICAgICAgIHRoaXMuZXhlY3V0YWJsZSA9IGNoZWNrTm90TnVsbChleGVjdXRhYmxlLCAiZXhlY3V0YWJsZSIpOworICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGNoZWNrTm90TnVsbChnZW5lcmF0b3IsICJnZW5lcmF0b3IiKTsKKyAgICAgICAgdGhpcy50aHJpZnRQYXRoRWxlbWVudHMgPSBjaGVja05vdE51bGwodGhyaWZ0UGF0aCwgInRocmlmdFBhdGgiKTsKKyAgICAgICAgdGhpcy50aHJpZnRGaWxlcyA9IGNoZWNrTm90TnVsbCh0aHJpZnRGaWxlcywgInRocmlmdEZpbGVzIik7CisgICAgICAgIHRoaXMuamF2YU91dHB1dERpcmVjdG9yeSA9IGNoZWNrTm90TnVsbChqYXZhT3V0cHV0RGlyZWN0b3J5LCAiamF2YU91dHB1dERpcmVjdG9yeSIpOworICAgICAgICB0aGlzLmVycm9yID0gbmV3IENvbW1hbmRMaW5lVXRpbHMuU3RyaW5nU3RyZWFtQ29uc3VtZXIoKTsKKyAgICAgICAgdGhpcy5vdXRwdXQgPSBuZXcgQ29tbWFuZExpbmVVdGlscy5TdHJpbmdTdHJlYW1Db25zdW1lcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgdGhlIHtAY29kZSB0aHJpZnR9IGNvbXBpbGVyIHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIHNwZWNpZmllZCBhdAorICAgICAqIGNvbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGV4aXQgc3RhdHVzIG9mIHtAY29kZSB0aHJpZnR9LgorICAgICAqIEB0aHJvd3MgQ29tbWFuZExpbmVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBpbGUoKSB0aHJvd3MgQ29tbWFuZExpbmVFeGNlcHRpb24geworCisgICAgICAgIGZvciAoRmlsZSB0aHJpZnRGaWxlIDogdGhyaWZ0RmlsZXMpIHsKKyAgICAgICAgICAgIENvbW1hbmRsaW5lIGNsID0gbmV3IENvbW1hbmRsaW5lKCk7CisgICAgICAgICAgICBjbC5zZXRFeGVjdXRhYmxlKGV4ZWN1dGFibGUpOworICAgICAgICAgICAgY2wuYWRkQXJndW1lbnRzKGJ1aWxkVGhyaWZ0Q29tbWFuZCh0aHJpZnRGaWxlKS50b0FycmF5KG5ldyBTdHJpbmdbXXt9KSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gQ29tbWFuZExpbmVVdGlscy5leGVjdXRlQ29tbWFuZExpbmUoY2wsIG51bGwsIG91dHB1dCwgZXJyb3IpOworCisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVzdWx0IHdpbGwgYWx3YXlzIGJlIDAgaGVyZS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2QgaGFzIGJlZW4gbWFkZSB2aXNpYmxlIGZvciB0ZXN0aW5nIG9ubHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyaWZ0RmlsZQorICAgICAqIEByZXR1cm4gQSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIGV4ZWN1dGFibGUgZm9sbG93ZWQgYnkgYW55IGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBJbW11dGFibGVMaXN0PFN0cmluZz4gYnVpbGRUaHJpZnRDb21tYW5kKGZpbmFsIEZpbGUgdGhyaWZ0RmlsZSkgeworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY29tbWFuZCA9IG5ld0xpbmtlZExpc3QoKTsKKyAgICAgICAgLy8gYWRkIHRoZSBleGVjdXRhYmxlCisgICAgICAgIGZvciAoRmlsZSB0aHJpZnRQYXRoRWxlbWVudCA6IHRocmlmdFBhdGhFbGVtZW50cykgeworICAgICAgICAgICAgY29tbWFuZC5hZGQoIi1JIik7CisgICAgICAgICAgICBjb21tYW5kLmFkZCh0aHJpZnRQYXRoRWxlbWVudC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBjb21tYW5kLmFkZCgiLW91dCIpOworICAgICAgICBjb21tYW5kLmFkZChqYXZhT3V0cHV0RGlyZWN0b3J5LnRvU3RyaW5nKCkpOworICAgICAgICBjb21tYW5kLmFkZCgiLS1nZW4iKTsKKyAgICAgICAgY29tbWFuZC5hZGQoZ2VuZXJhdG9yKTsKKyAgICAgICAgY29tbWFuZC5hZGQodGhyaWZ0RmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKGNvbW1hbmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG91dHB1dAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgeworICAgICAgICByZXR1cm4gb3V0cHV0LmdldE91dHB1dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGVycm9yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yLmdldE91dHB1dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgYnVpbGRzIHtAbGluayBUaHJpZnR9IGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGV4ZWN1dGFibGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgRmlsZSBqYXZhT3V0cHV0RGlyZWN0b3J5OworICAgICAgICBwcml2YXRlIFNldDxGaWxlPiB0aHJpZnRQYXRoRWxlbWVudHM7CisgICAgICAgIHByaXZhdGUgU2V0PEZpbGU+IHRocmlmdEZpbGVzOworICAgICAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0b3I7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgYnVpbGRlci4gVGhlIHR3byBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50IGFzIHRoZXkgYXJlCisgICAgICAgICAqIHJlcXVpcmVkIGZvciBhbGwge0BsaW5rIFRocmlmdH0gaW5zdGFuY2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXhlY3V0YWJsZSAgICAgICAgICBUaGUgcGF0aCB0byB0aGUge0Bjb2RlIHRocmlmdH0gZXhlY3V0YWJsZS4KKyAgICAgICAgICogQHBhcmFtIGphdmFPdXRwdXREaXJlY3RvcnkgVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBqYXZhIHNvdXJjZSBmaWxlcworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgSWYgZWl0aGVyIG9mIHRoZSBhcmd1bWVudHMgYXJlIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIHtAY29kZSBqYXZhT3V0cHV0RGlyZWN0b3J5fSBpcworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSBkaXJlY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihTdHJpbmcgZXhlY3V0YWJsZSwgRmlsZSBqYXZhT3V0cHV0RGlyZWN0b3J5KSB7CisgICAgICAgICAgICB0aGlzLmV4ZWN1dGFibGUgPSBjaGVja05vdE51bGwoZXhlY3V0YWJsZSwgImV4ZWN1dGFibGUiKTsKKyAgICAgICAgICAgIHRoaXMuamF2YU91dHB1dERpcmVjdG9yeSA9IGNoZWNrTm90TnVsbChqYXZhT3V0cHV0RGlyZWN0b3J5KTsKKyAgICAgICAgICAgIGNoZWNrQXJndW1lbnQoamF2YU91dHB1dERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgIHRoaXMudGhyaWZ0RmlsZXMgPSBuZXdIYXNoU2V0KCk7CisgICAgICAgICAgICB0aGlzLnRocmlmdFBhdGhFbGVtZW50cyA9IG5ld0hhc2hTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgdGhyaWZ0IGZpbGUgdG8gYmUgY29tcGlsZWQuIFRocmlmdCBmaWxlcyBtdXN0IGJlIG9uIHRoZSB0aHJpZnRwYXRoCisgICAgICAgICAqIGFuZCB0aGlzIG1ldGhvZCB3aWxsIGZhaWwgaWYgYSB0aHJpZnQgZmlsZSBpcyBhZGRlZCB3aXRob3V0IGZpcnN0IGFkZGluZyBhCisgICAgICAgICAqIHBhcmVudCBkaXJlY3RvcnkgdG8gdGhlIHRocmlmdHBhdGguCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aHJpZnRGaWxlCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIuCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGEgdGhyaWZ0IGZpbGUgaXMgYWRkZWQgd2l0aG91dCBmaXJzdAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpbmcgYSBwYXJlbnQgZGlyZWN0b3J5IHRvIHRoZSB0aHJpZnRwYXRoLgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICBJZiB7QGNvZGUgdGhyaWZ0RmlsZX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkVGhyaWZ0RmlsZShGaWxlIHRocmlmdEZpbGUpIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbCh0aHJpZnRGaWxlKTsKKyAgICAgICAgICAgIGNoZWNrQXJndW1lbnQodGhyaWZ0RmlsZS5pc0ZpbGUoKSk7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KHRocmlmdEZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGhyaWZ0IikpOworICAgICAgICAgICAgY2hlY2tUaHJpZnRGaWxlSXNJblRocmlmdFBhdGgodGhyaWZ0RmlsZSk7CisgICAgICAgICAgICB0aHJpZnRGaWxlcy5hZGQodGhyaWZ0RmlsZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIHRoZSBvcHRpb24gc3RyaW5nIGZvciB0aGUgVGhyaWZ0IGV4ZWN1dGFibGUncyB7QGNvZGUgLS1nZW59IHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGdlbmVyYXRvcgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gSWYge0Bjb2RlIGdlbmVyYXRvcn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0R2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChnZW5lcmF0b3IpOworICAgICAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1RocmlmdEZpbGVJc0luVGhyaWZ0UGF0aChGaWxlIHRocmlmdEZpbGUpIHsKKyAgICAgICAgICAgIGFzc2VydCB0aHJpZnRGaWxlLmlzRmlsZSgpOworICAgICAgICAgICAgY2hlY2tTdGF0ZShjaGVja1RocmlmdEZpbGVJc0luVGhyaWZ0UGF0aEhlbHBlcih0aHJpZnRGaWxlLmdldFBhcmVudEZpbGUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrVGhyaWZ0RmlsZUlzSW5UaHJpZnRQYXRoSGVscGVyKEZpbGUgZGlyZWN0b3J5KSB7CisgICAgICAgICAgICBhc3NlcnQgZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCk7CisgICAgICAgICAgICBpZiAodGhyaWZ0UGF0aEVsZW1lbnRzLmNvbnRhaW5zKGRpcmVjdG9yeSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBwYXJlbnREaXJlY3RvcnkgPSBkaXJlY3RvcnkuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiAocGFyZW50RGlyZWN0b3J5ID09IG51bGwpID8gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDogY2hlY2tUaHJpZnRGaWxlSXNJblRocmlmdFBhdGhIZWxwZXIocGFyZW50RGlyZWN0b3J5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlICNhZGRUaHJpZnRGaWxlKEZpbGUpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRUaHJpZnRGaWxlcyhJdGVyYWJsZTxGaWxlPiB0aHJpZnRGaWxlcykgeworICAgICAgICAgICAgZm9yIChGaWxlIHRocmlmdEZpbGUgOiB0aHJpZnRGaWxlcykgeworICAgICAgICAgICAgICAgIGFkZFRocmlmdEZpbGUodGhyaWZ0RmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIHRoZSB7QGNvZGUgdGhyaWZ0UGF0aEVsZW1lbnR9IHRvIHRoZSB0aHJpZnRQYXRoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGhyaWZ0UGF0aEVsZW1lbnQgQSBkaXJlY3RvcnkgdG8gYmUgc2VhcmNoZWQgZm9yIGltcG9ydGVkIHRocmlmdCBtZXNzYWdlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgZGVmaW5pdGlvbnMuCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIuCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIElmIHtAY29kZSB0aHJpZnRQYXRoRWxlbWVudH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB7QGNvZGUgdGhyaWZ0UGF0aEVsZW1lbnR9IGlzIG5vdCBhCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFRocmlmdFBhdGhFbGVtZW50KEZpbGUgdGhyaWZ0UGF0aEVsZW1lbnQpIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbCh0aHJpZnRQYXRoRWxlbWVudCk7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KHRocmlmdFBhdGhFbGVtZW50LmlzRGlyZWN0b3J5KCkpOworICAgICAgICAgICAgdGhyaWZ0UGF0aEVsZW1lbnRzLmFkZCh0aHJpZnRQYXRoRWxlbWVudCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlICNhZGRUaHJpZnRQYXRoRWxlbWVudChGaWxlKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkVGhyaWZ0UGF0aEVsZW1lbnRzKEl0ZXJhYmxlPEZpbGU+IHRocmlmdFBhdGhFbGVtZW50cykgeworICAgICAgICAgICAgZm9yIChGaWxlIHRocmlmdFBhdGhFbGVtZW50IDogdGhyaWZ0UGF0aEVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgYWRkVGhyaWZ0UGF0aEVsZW1lbnQodGhyaWZ0UGF0aEVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBBIGNvbmZpZ3VyZWQge0BsaW5rIFRocmlmdH0gaW5zdGFuY2UuCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIG5vIHRocmlmdCBmaWxlcyBoYXZlIGJlZW4gYWRkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVGhyaWZ0IGJ1aWxkKCkgeworICAgICAgICAgICAgY2hlY2tTdGF0ZSghdGhyaWZ0RmlsZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGhyaWZ0KGV4ZWN1dGFibGUsIGdlbmVyYXRvciwgSW1tdXRhYmxlU2V0LmNvcHlPZih0aHJpZnRQYXRoRWxlbWVudHMpLAorICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQuY29weU9mKHRocmlmdEZpbGVzKSwgamF2YU91dHB1dERpcmVjdG9yeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRDb21waWxlTW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0Q29tcGlsZU1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY3NTcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0Q29tcGlsZU1vam8uamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CisKKy8qKgorICogVGhpcyBtb2pvIGV4ZWN1dGVzIHRoZSB7QGNvZGUgdGhyaWZ0fSBjb21waWxlciBmb3IgZ2VuZXJhdGluZyBqYXZhIHNvdXJjZXMKKyAqIGZyb20gdGhyaWZ0IGRlZmluaXRpb25zLiBJdCBhbHNvIHNlYXJjaGVzIGRlcGVuZGVuY3kgYXJ0aWZhY3RzIGZvcgorICogdGhyaWZ0IGZpbGVzIGFuZCBpbmNsdWRlcyB0aGVtIGluIHRoZSB0aHJpZnRQYXRoIHNvIHRoYXQgdGhleSBjYW4gYmUKKyAqIHJlZmVyZW5jZWQuIEZpbmFsbHksIGl0IGFkZHMgdGhlIHRocmlmdCBmaWxlcyB0byB0aGUgcHJvamVjdCBhcyByZXNvdXJjZXMgc28KKyAqIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIGFydGlmYWN0LgorICoKKyAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCisgKiBAZ29hbCBjb21waWxlCisgKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUaHJpZnRDb21waWxlTW9qbyBleHRlbmRzIEFic3RyYWN0VGhyaWZ0TW9qbyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIHNvdXJjZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7YmFzZWRpcn0vc3JjL21haW4vdGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSB0aHJpZnRTb3VyY2VSb290OworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHtAY29kZSAuamF2YX0gd2lsbCBiZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy90aHJpZnQiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMaXN0PEFydGlmYWN0PiBnZXREZXBlbmRlbmN5QXJ0aWZhY3RzKCkgeworICAgICAgICBMaXN0PEFydGlmYWN0PiBjb21waWxlQXJ0aWZhY3RzID0gcHJvamVjdC5nZXRDb21waWxlQXJ0aWZhY3RzKCk7CisgICAgICAgIHJldHVybiBjb21waWxlQXJ0aWZhY3RzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRUaHJpZnRTb3VyY2VSb290KCkgeworICAgICAgICByZXR1cm4gdGhyaWZ0U291cmNlUm9vdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2hGaWxlcygpIHsKKyAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBwcm9qZWN0SGVscGVyLmFkZFJlc291cmNlKHByb2plY3QsIHRocmlmdFNvdXJjZVJvb3QuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgIAkJSW1tdXRhYmxlTGlzdC5vZigiKiovKi50aHJpZnQiKSwgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0VGVzdENvbXBpbGVNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFkOTllCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0VGVzdENvbXBpbGVNb2pvLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CisKKy8qKgorICogQHBoYXNlIGdlbmVyYXRlLXRlc3Qtc291cmNlcworICogQGdvYWwgdGVzdENvbXBpbGUKKyAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHRlc3QKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRocmlmdFRlc3RDb21waWxlTW9qbyBleHRlbmRzIEFic3RyYWN0VGhyaWZ0TW9qbyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIHNvdXJjZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7YmFzZWRpcn0vc3JjL3Rlc3QvdGhyaWZ0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSB0aHJpZnRUZXN0U291cmNlUm9vdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSB7QGNvZGUgLmphdmF9IHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXRlc3Qtc291cmNlcy90aHJpZnQiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGF0dGFjaEZpbGVzKCkgeworICAgICAgICBwcm9qZWN0LmFkZFRlc3RDb21waWxlU291cmNlUm9vdChvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBwcm9qZWN0SGVscGVyLmFkZFRlc3RSZXNvdXJjZShwcm9qZWN0LCB0aHJpZnRUZXN0U291cmNlUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgCQlJbW11dGFibGVMaXN0Lm9mKCIqKi8qLnRocmlmdCIpLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGlzdDxBcnRpZmFjdD4gZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpIHsKKyAgICAgICAgLy8gVE9ETyhnYWspOiBtYXZlbi1wcm9qZWN0IG5lZWRzIGdlbmVyaWNzCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBMaXN0PEFydGlmYWN0PiB0ZXN0QXJ0aWZhY3RzID0gcHJvamVjdC5nZXRUZXN0QXJ0aWZhY3RzKCk7CisgICAgICAgIHJldHVybiB0ZXN0QXJ0aWZhY3RzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRUaHJpZnRTb3VyY2VSb290KCkgeworICAgICAgICByZXR1cm4gdGhyaWZ0VGVzdFNvdXJjZVJvb3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2NhbCBtYXZlbiBBcnRpZmFjdFJlcG9zaXRvcnkuIEV4cG9zZWQgb25seSB0byBhbGxvdyB0ZXN0aW5nIG91dHNpZGUgb2YgTWF2ZW4gaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsUmVwb3NpdG9yeSBsb2NhbCBBcnRpZmFjdFJlcG9zaXRvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1hdmVuUmVwb3NpdG9yeShmaW5hbCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5KSB7CisgICAgICAgIHRoaXMubG9jYWxSZXBvc2l0b3J5ID0gbG9jYWxSZXBvc2l0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3B0aW9uIHRvIGhhc2ggZGVwZW5kZW50IEpBUiBwYXRocy4gRXhwb3NlZCBvbmx5IHRvIGFsbG93IHRlc3Rpbmcgb3V0c2lkZSBvZiBNYXZlbiBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFzaERlcGVuZGVudFBhdGhzIHdoZXRoZXIgb3Igbm90IHRvIGhhc2ggcGF0aHMgdG8gZGVwZW5kZW50IEpBUnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIYXNoRGVwZW5kZW50UGF0aHMoZmluYWwgYm9vbGVhbiBoYXNoRGVwZW5kZW50UGF0aHMpIHsKKyAgICAgICAgdGhpcy5oYXNoRGVwZW5kZW50UGF0aHMgPSBoYXNoRGVwZW5kZW50UGF0aHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTc2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRFcXVhbHM7CisKKworcHVibGljIGNsYXNzIFRlc3RBYnN0cmFjdFRocmlmdE1vam8geworCisgICAgcHJpdmF0ZSBUaHJpZnRUZXN0Q29tcGlsZU1vam8gbW9qbzsKKyAgICBwcml2YXRlIEZpbGUgdGVzdFJvb3REaXI7CisgICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbWF2ZW5SZXBvc2l0b3J5OworCisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0bXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOworICAgICAgICB0ZXN0Um9vdERpciA9IG5ldyBGaWxlKHRtcERpciwgInRocmlmdC10ZXN0Iik7CisKKyAgICAgICAgLy8gdGhlIHRydW5jYXRlUGF0aCBtZXRob2QgYXNzdW1lcyBhIG1hdmVuIHJlcG9zaXRvcnksIGJ1dCBpdCBvbmx5IGNhcmVzIGFib3V0IHRoZSBiYXNlIGRpcgorICAgICAgICBtYXZlblJlcG9zaXRvcnkgPSBNb2NraXRvLm1vY2soQXJ0aWZhY3RSZXBvc2l0b3J5LmNsYXNzKTsKKyAgICAgICAgTW9ja2l0by53aGVuKG1hdmVuUmVwb3NpdG9yeS5nZXRCYXNlZGlyKCkpLnRoZW5SZXR1cm4oIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpciIpOworCisgICAgICAgIG1vam8gPSBuZXcgVGhyaWZ0VGVzdENvbXBpbGVNb2pvKCk7CisgICAgICAgIG1vam8uc2V0TG9jYWxNYXZlblJlcG9zaXRvcnkobWF2ZW5SZXBvc2l0b3J5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlVGhyaWZ0UGF0aEZyb21KYXJzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIEZpbGUgdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSA9IHRlc3RSb290RGlyOworCisgICAgICAgIC8vIFRoZSBTaGFyZWRJZGwuamFyIGZpbGUgY29udGFpbnMgdGhlIHNhbWUgaWRsL3NoYXJlZC50aHJpZnQgYW5kIGlkbC90dXRvcmlhbC50aHJpZnQgaGllcmFyY2h5CisgICAgICAgIC8vIHVzZWQgYnkgb3RoZXIgdGVzdHMuIEl0J3MgdXNlZCBoZXJlIHRvIHJlcHJlc2VudCBhIGRlcGVuZGVuY3kgb2YgdGhlIHByb2plY3QgbWF2ZW4gaXMgYnVpbGRpbmcsCisgICAgICAgIC8vIG9uZSB0aGF0IGlzIGNvbnRyaWJ1dGluZyAudGhyaWZ0IElETCBmaWxlcyBhcyB3ZWxsIGFzIGFueSBvdGhlciBhcnRpZmFjdHMuCisgICAgICAgIGZpbmFsIEl0ZXJhYmxlPEZpbGU+IGNsYXNzcGF0aEVsZW1lbnRGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL2RlcGVuZGVuY3ktamFyLXRlc3QvU2hhcmVkSWRsLmphciIpCisgICAgICAgICk7CisKKyAgICAgICAgZmluYWwgU2V0PEZpbGU+IHRocmlmdERpcmVjdG9yaWVzID0gbW9qby5tYWtlVGhyaWZ0UGF0aEZyb21KYXJzKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIGNsYXNzcGF0aEVsZW1lbnRGaWxlcyk7CisKKyAgICAgICAgLy8gVGhlIHJlc3VsdHMgc2hvdWxkIGJlIGEgcGF0aCB0byBhIGRpcmVjdG9yeSBuYW1lZCBhZnRlciB0aGUgSkFSIGl0c2VsZiAoYXNzdW1pbmcgbm8gcGF0aCBoYXNoaW5nLAorICAgICAgICAvLyBidXQgc2VlIGJlbG93IGZvciBhIHNlcGFyYXRlIHRlc3Qgb2YgdGhhdCkgcmVwcmVzZW50aW5nIHRoZSByb290IG9mIGEgaGllcmFyY2h5IGNvbnRhaW5pbmcgdGhyaWZ0CisgICAgICAgIC8vIGZpbGVzLCBzdWl0YWJsZSBmb3IgcHJvdmlkaW5nIHRvIHRoZSB0aHJpZnQgY29tcGlsZXIgYXMgYW4gaW5jbHVkZSBkaXJlY3RvcnkuIEluIHRoaXMgY2FzZSwgdGhhdAorICAgICAgICAvLyBtZWFucyBpdCBwb2ludHMgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAiaWRsIiBoaWVyYXJjaHkgcmF0aGVyIHRoYW4gdG8gdGhlIGlkbCBkaXJlY3RvcnkKKyAgICAgICAgLy8gaXRzZWxmLgorICAgICAgICBmaW5hbCBTZXQ8RmlsZT4gZXhwZWN0ZWQgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJzcmMvdGVzdC9yZXNvdXJjZXMvZGVwZW5kZW5jeS1qYXItdGVzdC9TaGFyZWRJZGwuamFyIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm1ha2VUaHJpZnRQYXRoRnJvbUphcnMgc2hvdWxkIHJldHVybiB0aHJpZnQgSURMIGJhc2UgcGF0aCBmcm9tIHdpdGhpbiBKQVIiLCBleHBlY3RlZCwgdGhyaWZ0RGlyZWN0b3JpZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlUGF0aCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBKQVIgcGF0aCBpcyB1bnJlbGF0ZWQgdG8gbWF2ZW4gcmVwbywgYW5kIHNob3VsZCBiZSB1bmNoYW5nZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCIvcGF0aC90by9zb21lamFyLmphciIpKTsKKworICAgICAgICAvLyBKQVIgcGF0aCBpcyB3aXRoaW4gbWF2ZW4gcmVwbywgYW5kIHNob3VsZCBiZSBtYWRlIHJlbGF0aXZlIHRvIHRoZSByZXBvCisgICAgICAgIGFzc2VydEVxdWFscygicGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCIvdGVzdC9tYXZlbi9yZXBvL2Jhc2VkaXIvcGF0aC90by9zb21lamFyLmphciIpKTsKKworICAgICAgICAvLyBKQVIgcGF0aCBjb250YWlucyBmb3J3YXJkIHNsYXNoZXMgdGhhdCBzaG91bGQgYmUgbm9ybWFsaXplZAorICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIlxccGF0aFxcdG9cXHNvbWVqYXIuamFyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlUGF0aFdpdGhEZXBlbmRlbnRQYXRoSGFzaGluZygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBtb2pvLnNldEhhc2hEZXBlbmRlbnRQYXRocyh0cnVlKTsKKworICAgICAgICAvLyBoYXNoRGVwZW5kZW50UGF0aHMgc2V0IHRvIHRydWUsIHRoZSBKQVIgcGF0aCBpcyBpbW1lZGlhdGVseSBoYXNoZWQgKE1ENSkgYW5kIGNvbnZlcnRlZCB0byBhIGhleCBzdHJpbmcKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjFjODU5NTA5ODdiMjM0OTM0NjJjZjNjMjYxZDk1MTBhIiwgbW9qby50cnVuY2F0ZVBhdGgoIi9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM5ZmMyYjRjMzRjYjZjYjBkYTM4YmVkNWQ4YjVmYzY3IiwgbW9qby50cnVuY2F0ZVBhdGgoIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpci9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjI1YjY5MjRmNWIwZTE5NDg2ZDBmZjg4NDQ4ZTk5OWQ1IiwgbW9qby50cnVuY2F0ZVBhdGgoIlxccGF0aFxcdG9cXHNvbWVqYXIuamFyIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzg5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0VGhyaWZ0LmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5jbGkuQ29tbWFuZExpbmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgVGVzdFRocmlmdCB7CisKKyAgICBwcml2YXRlIEZpbGUgdGVzdFJvb3REaXI7CisgICAgcHJpdmF0ZSBGaWxlIGlkbERpcjsKKyAgICBwcml2YXRlIEZpbGUgZ2VuSmF2YURpcjsKKyAgICBwcml2YXRlIFRocmlmdC5CdWlsZGVyIGJ1aWxkZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0bXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOworICAgICAgICB0ZXN0Um9vdERpciA9IG5ldyBGaWxlKHRtcERpciwgInRocmlmdC10ZXN0Iik7CisKKyAgICAgICAgaWYgKHRlc3RSb290RGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xlYW5EaXJlY3RvcnkodGVzdFJvb3REaXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0ZXN0OiAiICsgdGVzdFJvb3REaXIuZ2V0UGF0aCgpLCB0ZXN0Um9vdERpci5ta2RpcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgdGVzdFJlc291cmNlRGlyID0gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcyIpOworICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gZmluZCB0ZXN0IHJlc291cmNlcyIsIHRlc3RSb290RGlyLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgdGhyaWZ0RXhlY3V0YWJsZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidGhyaWZ0RXhlY3V0YWJsZSIsICJ0aHJpZnQiKTsKKyAgICAgICAgaWYgKCEobmV3IEZpbGUodGhyaWZ0RXhlY3V0YWJsZSkuZXhpc3RzKCkpKSB7CisgICAgICAgICAgICB0aHJpZnRFeGVjdXRhYmxlID0gInRocmlmdCI7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaHJpZnQgY29tcGlsZXI6ICIgKyB0aHJpZnRFeGVjdXRhYmxlKTsKKworICAgICAgICBpZGxEaXIgPSBuZXcgRmlsZSh0ZXN0UmVzb3VyY2VEaXIsICJpZGwiKTsKKyAgICAgICAgZ2VuSmF2YURpciA9IG5ldyBGaWxlKHRlc3RSb290RGlyLCBUaHJpZnQuR0VORVJBVEVEX0pBVkEpOworICAgICAgICBidWlsZGVyID0gbmV3IFRocmlmdC5CdWlsZGVyKHRocmlmdEV4ZWN1dGFibGUsIHRlc3RSb290RGlyKTsKKyAgICAgICAgYnVpbGRlcgorICAgICAgICAgICAgLnNldEdlbmVyYXRvcigiamF2YSIpCisgICAgICAgICAgICAuYWRkVGhyaWZ0UGF0aEVsZW1lbnQoaWRsRGlyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJpZnRDb21waWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUaHJpZnRDb21waWxlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyaWZ0Q29tcGlsZVdpdGhHZW5lcmF0b3JPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRlci5zZXRHZW5lcmF0b3IoImphdmE6cHJpdmF0ZS1tZW1iZXJzIik7CisgICAgICAgIGV4ZWN1dGVUaHJpZnRDb21waWxlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUaHJpZnRDb21waWxlKCkgdGhyb3dzIENvbW1hbmRMaW5lRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRGaWxlID0gbmV3IEZpbGUoaWRsRGlyLCAic2hhcmVkLnRocmlmdCIpOworCisgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0RmlsZSh0aHJpZnRGaWxlKTsKKworICAgICAgICBmaW5hbCBUaHJpZnQgdGhyaWZ0ID0gYnVpbGRlci5idWlsZCgpOworCisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgbm90IGZvdW5kOiBzaGFyZWQudGhyaWZ0IiwgdGhyaWZ0RmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJnZW4tamF2YSBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBleGlzdCIsIGdlbkphdmFEaXIuZXhpc3RzKCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNvbXBpbGUKKyAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IHRocmlmdC5jb21waWxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCByZXN1bHQpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJnZW4tamF2YSBkaXJlY3Rvcnkgd2FzIG5vdCByZW1vdmVkIiwgZ2VuSmF2YURpci5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoImdlbmVyYXRlZCBqYXZhIGNvZGUgZG9lc24ndCBleGlzdCIsCisgICAgICAgICAgICBuZXcgRmlsZSh0ZXN0Um9vdERpciwgInNoYXJlZC9TaGFyZWRTZXJ2aWNlLmphdmEiKS5leGlzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyaWZ0TXVsdGlwbGVGaWxlQ29tcGlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHNoYXJlZFRocmlmdCA9IG5ldyBGaWxlKGlkbERpciwgInNoYXJlZC50aHJpZnQiKTsKKyAgICAgICAgZmluYWwgRmlsZSB0dXRvcmlhbFRocmlmdCA9IG5ldyBGaWxlKGlkbERpciwgInR1dG9yaWFsLnRocmlmdCIpOworCisgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0RmlsZShzaGFyZWRUaHJpZnQpOworICAgICAgICBidWlsZGVyLmFkZFRocmlmdEZpbGUodHV0b3JpYWxUaHJpZnQpOworCisgICAgICAgIGZpbmFsIFRocmlmdCB0aHJpZnQgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBub3QgZm91bmQ6IHNoYXJlZC50aHJpZnQiLCBzaGFyZWRUaHJpZnQuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHNob3VsZCBub3QgZXhpc3QiLCBnZW5KYXZhRGlyLmV4aXN0cygpKTsKKworICAgICAgICAvLyBleGVjdXRlIHRoZSBjb21waWxlCisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSB0aHJpZnQuY29tcGlsZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0KTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHdhcyBub3QgcmVtb3ZlZCIsIGdlbkphdmFEaXIuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJnZW5lcmF0ZWQgamF2YSBjb2RlIGRvZXNuJ3QgZXhpc3QiLAorICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJzaGFyZWQvU2hhcmVkU2VydmljZS5qYXZhIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJnZW5lcmF0ZWQgamF2YSBjb2RlIGRvZXNuJ3QgZXhpc3QiLAorICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJ0dXRvcmlhbC9JbnZhbGlkT3BlcmF0aW9uLmphdmEiKS5leGlzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkQ29tcGlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRocmlmdEZpbGUgPSBuZXcgRmlsZSh0ZXN0Um9vdERpciwgIm1pc3NpbmcudGhyaWZ0Iik7CisgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0UGF0aEVsZW1lbnQodGVzdFJvb3REaXIpOworCisgICAgICAgIC8vIEhhY2tpbmcgYXJvdW5kIGNoZWNrcyBpbiBhZGRUaHJpZnQgZmlsZS4KKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJpZnRGaWxlLmNyZWF0ZU5ld0ZpbGUoKSk7CisgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0RmlsZSh0aHJpZnRGaWxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJpZnRGaWxlLmRlbGV0ZSgpKTsKKworICAgICAgICBmaW5hbCBUaHJpZnQgdGhyaWZ0ID0gYnVpbGRlci5idWlsZCgpOworCisgICAgICAgIGFzc2VydFRydWUoIXRocmlmdEZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiZ2VuLWphdmEgZGlyZWN0b3J5IHNob3VsZCBub3QgZXhpc3QiLCBnZW5KYXZhRGlyLmV4aXN0cygpKTsKKworICAgICAgICAvLyBleGVjdXRlIHRoZSBjb21waWxlCisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSB0aHJpZnQuY29tcGlsZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlSW5QYXRoUHJlQ29uZGl0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0RmlsZSA9IG5ldyBGaWxlKHRlc3RSb290RGlyLCAibWlzc2luZy50aHJpZnQiKTsKKworICAgICAgICAvLyBIYWNraW5nIGFyb3VuZCBjaGVja3MgaW4gYWRkVGhyaWZ0IGZpbGUuCisgICAgICAgIGFzc2VydFRydWUodGhyaWZ0RmlsZS5jcmVhdGVOZXdGaWxlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRUaHJpZnRGaWxlKHRocmlmdEZpbGUpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0ZXN0Um9vdERpci5leGlzdHMoKSkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsZWFuRGlyZWN0b3J5KHRlc3RSb290RGlyKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBkZWxldGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGVzdDogIiArIHRlc3RSb290RGlyLmdldFBhdGgoKSwgdGVzdFJvb3REaXIuZGVsZXRlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvc2hhcmVkLnRocmlmdCBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3NoYXJlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1ZTdmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3NoYXJlZC50aHJpZnQKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRoaXMgVGhyaWZ0IGZpbGUgY2FuIGJlIGluY2x1ZGVkIGJ5IG90aGVyIFRocmlmdCBmaWxlcyB0aGF0IHdhbnQgdG8gc2hhcmUKKyAqIHRoZXNlIGRlZmluaXRpb25zLgorICovCisKK25hbWVzcGFjZSBjcHAgc2hhcmVkCituYW1lc3BhY2UgamF2YSBzaGFyZWQKK25hbWVzcGFjZSBwZXJsIHNoYXJlZAorCitzdHJ1Y3QgU2hhcmVkU3RydWN0IHsKKyAgMTogaTMyIGtleQorICAyOiBzdHJpbmcgdmFsdWUKK30KKworc2VydmljZSBTaGFyZWRTZXJ2aWNlIHsKKyAgU2hhcmVkU3RydWN0IGdldFN0cnVjdCgxOiBpMzIga2V5KQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvdHV0b3JpYWwudGhyaWZ0IGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvdHV0b3JpYWwudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTQzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2lkbC90dXRvcmlhbC50aHJpZnQKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIyBUaHJpZnQgVHV0b3JpYWwKKyMgTWFyayBTbGVlIChtY3NsZWVAZmFjZWJvb2suY29tKQorIworIyBUaGlzIGZpbGUgYWltcyB0byB0ZWFjaCB5b3UgaG93IHRvIHVzZSBUaHJpZnQsIGluIGEgLnRocmlmdCBmaWxlLiBOZWF0by4gVGhlCisjIGZpcnN0IHRoaW5nIHRvIG5vdGljZSBpcyB0aGF0IC50aHJpZnQgZmlsZXMgc3VwcG9ydCBzdGFuZGFyZCBzaGVsbCBjb21tZW50cy4KKyMgVGhpcyBsZXRzIHlvdSBtYWtlIHlvdXIgdGhyaWZ0IGZpbGUgZXhlY3V0YWJsZSBhbmQgaW5jbHVkZSB5b3VyIFRocmlmdCBidWlsZAorIyBzdGVwIG9uIHRoZSB0b3AgbGluZS4gQW5kIHlvdSBjYW4gcGxhY2UgY29tbWVudHMgbGlrZSB0aGlzIGFueXdoZXJlIHlvdSBsaWtlLgorIworIyBCZWZvcmUgcnVubmluZyB0aGlzIGZpbGUsIHlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBpbnN0YWxsZWQgdGhlIHRocmlmdCBjb21waWxlcgorIyBpbnRvIC91c3IvbG9jYWwvYmluLgorCisvKioKKyAqIFRoZSBmaXJzdCB0aGluZyB0byBrbm93IGFib3V0IGFyZSB0eXBlcy4gVGhlIGF2YWlsYWJsZSB0eXBlcyBpbiBUaHJpZnQgYXJlOgorICoKKyAqICBib29sICAgICAgICBCb29sZWFuLCBvbmUgYnl0ZQorICogIGJ5dGUgICAgICAgIFNpZ25lZCBieXRlCisgKiAgaTE2ICAgICAgICAgU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisgKiAgaTMyICAgICAgICAgU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisgKiAgaTY0ICAgICAgICAgU2lnbmVkIDY0LWJpdCBpbnRlZ2VyCisgKiAgZG91YmxlICAgICAgNjQtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisgKiAgc3RyaW5nICAgICAgU3RyaW5nCisgKiAgYmluYXJ5ICAgICAgQmxvYiAoYnl0ZSBhcnJheSkKKyAqICBtYXA8dDEsdDI+ICBNYXAgZnJvbSBvbmUgdHlwZSB0byBhbm90aGVyCisgKiAgbGlzdDx0MT4gICAgT3JkZXJlZCBsaXN0IG9mIG9uZSB0eXBlCisgKiAgc2V0PHQxPiAgICAgU2V0IG9mIHVuaXF1ZSBlbGVtZW50cyBvZiBvbmUgdHlwZQorICoKKyAqIERpZCB5b3UgYWxzbyBub3RpY2UgdGhhdCBUaHJpZnQgc3VwcG9ydHMgQyBzdHlsZSBjb21tZW50cz8KKyAqLworCisvLyBKdXN0IGluIGNhc2UgeW91IHdlcmUgd29uZGVyaW5nLi4uIHllcy4gV2Ugc3VwcG9ydCBzaW1wbGUgQyBjb21tZW50cyB0b28uCisKKy8qKgorICogVGhyaWZ0IGZpbGVzIGNhbiByZWZlcmVuY2Ugb3RoZXIgVGhyaWZ0IGZpbGVzIHRvIGluY2x1ZGUgY29tbW9uIHN0cnVjdAorICogYW5kIHNlcnZpY2UgZGVmaW5pdGlvbnMuIFRoZXNlIGFyZSBmb3VuZCB1c2luZyB0aGUgY3VycmVudCBwYXRoLCBvciBieQorICogc2VhcmNoaW5nIHJlbGF0aXZlIHRvIGFueSBwYXRocyBzcGVjaWZpZWQgd2l0aCB0aGUgLUkgY29tcGlsZXIgZmxhZy4KKyAqCisgKiBJbmNsdWRlZCBvYmplY3RzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgbmFtZSBvZiB0aGUgLnRocmlmdCBmaWxlIGFzIGEKKyAqIHByZWZpeC4gaS5lLiBzaGFyZWQuU2hhcmVkT2JqZWN0CisgKi8KK2luY2x1ZGUgInNoYXJlZC50aHJpZnQiCisKKy8qKgorICogVGhyaWZ0IGZpbGVzIGNhbiBuYW1lc3BhY2UsIHBhY2thZ2UsIG9yIHByZWZpeCB0aGVpciBvdXRwdXQgaW4gdmFyaW91cworICogdGFyZ2V0IGxhbmd1YWdlcy4KKyAqLworbmFtZXNwYWNlIGNwcCB0dXRvcmlhbAorbmFtZXNwYWNlIGphdmEgdHV0b3JpYWwKK25hbWVzcGFjZSBwaHAgdHV0b3JpYWwKK25hbWVzcGFjZSBwZXJsIHR1dG9yaWFsCituYW1lc3BhY2Ugc21hbGx0YWxrLmNhdGVnb3J5IFRocmlmdC5UdXRvcmlhbAorCisvKioKKyAqIFRocmlmdCBsZXRzIHlvdSBkbyB0eXBlZGVmcyB0byBnZXQgcHJldHR5IG5hbWVzIGZvciB5b3VyIHR5cGVzLiBTdGFuZGFyZAorICogQyBzdHlsZSBoZXJlLgorICovCit0eXBlZGVmIGkzMiBNeUludGVnZXIKKworLyoqCisgKiBUaHJpZnQgYWxzbyBsZXRzIHlvdSBkZWZpbmUgY29uc3RhbnRzIGZvciB1c2UgYWNyb3NzIGxhbmd1YWdlcy4gQ29tcGxleAorICogdHlwZXMgYW5kIHN0cnVjdHMgYXJlIHNwZWNpZmllZCB1c2luZyBKU09OIG5vdGF0aW9uLgorICovCitjb25zdCBpMzIgSU5UMzJDT05TVEFOVCA9IDk4NTMKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBNQVBDT05TVEFOVCA9IHsnaGVsbG8nOid3b3JsZCcsICdnb29kbmlnaHQnOidtb29uJ30KKworLyoqCisgKiBZb3UgY2FuIGRlZmluZSBlbnVtcywgd2hpY2ggYXJlIGp1c3QgMzIgYml0IGludGVnZXJzLiBWYWx1ZXMgYXJlIG9wdGlvbmFsCisgKiBhbmQgc3RhcnQgYXQgMSBpZiBub3Qgc3VwcGxpZWQsIEMgc3R5bGUgYWdhaW4uCisgKi8KK2VudW0gT3BlcmF0aW9uIHsKKyAgQUREID0gMSwKKyAgU1VCVFJBQ1QgPSAyLAorICBNVUxUSVBMWSA9IDMsCisgIERJVklERSA9IDQKK30KKworLyoqCisgKiBTdHJ1Y3RzIGFyZSB0aGUgYmFzaWMgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMuIFRoZXkgYXJlIGNvbXByaXNlZCBvZiBmaWVsZHMKKyAqIHdoaWNoIGVhY2ggaGF2ZSBhbiBpbnRlZ2VyIGlkZW50aWZpZXIsIGEgdHlwZSwgYSBzeW1ib2xpYyBuYW1lLCBhbmQgYW4KKyAqIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWUuCisgKgorICogRmllbGRzIGNhbiBiZSBkZWNsYXJlZCAib3B0aW9uYWwiLCB3aGljaCBlbnN1cmVzIHRoZXkgd2lsbCBub3QgYmUgaW5jbHVkZWQKKyAqIGluIHRoZSBzZXJpYWxpemVkIG91dHB1dCBpZiB0aGV5IGFyZW4ndCBzZXQuICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBzb21lCisgKiBtYW51YWwgbWFuYWdlbWVudCBpbiBzb21lIGxhbmd1YWdlcy4KKyAqLworc3RydWN0IFdvcmsgeworICAxOiBpMzIgbnVtMSA9IDAsCisgIDI6IGkzMiBudW0yLAorICAzOiBPcGVyYXRpb24gb3AsCisgIDQ6IG9wdGlvbmFsIHN0cmluZyBjb21tZW50LAorfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGFsc28gYmUgZXhjZXB0aW9ucywgaWYgdGhleSBhcmUgbmFzdHkuCisgKi8KK2V4Y2VwdGlvbiBJbnZhbGlkT3BlcmF0aW9uIHsKKyAgMTogaTMyIHdoYXQsCisgIDI6IHN0cmluZyB3aHkKK30KKworLyoqCisgKiBBaGgsIG5vdyBvbnRvIHRoZSBjb29sIHBhcnQsIGRlZmluaW5nIGEgc2VydmljZS4gU2VydmljZXMganVzdCBuZWVkIGEgbmFtZQorICogYW5kIGNhbiBvcHRpb25hbGx5IGluaGVyaXQgZnJvbSBhbm90aGVyIHNlcnZpY2UgdXNpbmcgdGhlIGV4dGVuZHMga2V5d29yZC4KKyAqLworc2VydmljZSBDYWxjdWxhdG9yIGV4dGVuZHMgc2hhcmVkLlNoYXJlZFNlcnZpY2UgeworCisgIC8qKgorICAgKiBBIG1ldGhvZCBkZWZpbml0aW9uIGxvb2tzIGxpa2UgQyBjb2RlLiBJdCBoYXMgYSByZXR1cm4gdHlwZSwgYXJndW1lbnRzLAorICAgKiBhbmQgb3B0aW9uYWxseSBhIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IGl0IG1heSB0aHJvdy4gTm90ZSB0aGF0IGFyZ3VtZW50CisgICAqIGxpc3RzIGFuZCBleGNlcHRpb24gbGlzdHMgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgZXhhY3Qgc2FtZSBzeW50YXggYXMKKyAgICogZmllbGQgbGlzdHMgaW4gc3RydWN0IG9yIGV4Y2VwdGlvbiBkZWZpbml0aW9ucy4KKyAgICovCisKKyAgIHZvaWQgcGluZygpLAorCisgICBpMzIgYWRkKDE6aTMyIG51bTEsIDI6aTMyIG51bTIpLAorCisgICBpMzIgY2FsY3VsYXRlKDE6aTMyIGxvZ2lkLCAyOldvcmsgdykgdGhyb3dzICgxOkludmFsaWRPcGVyYXRpb24gb3VjaCksCisKKyAgIC8qKgorICAgICogVGhpcyBtZXRob2QgaGFzIGEgb25ld2F5IG1vZGlmaWVyLiBUaGF0IG1lYW5zIHRoZSBjbGllbnQgb25seSBtYWtlcworICAgICogYSByZXF1ZXN0IGFuZCBkb2VzIG5vdCBsaXN0ZW4gZm9yIGFueSByZXNwb25zZSBhdCBhbGwuIE9uZXdheSBtZXRob2RzCisgICAgKiBtdXN0IGJlIHZvaWQuCisgICAgKi8KKyAgIG9uZXdheSB2b2lkIHppcCgpCisKK30KKworLyoqCisgKiBUaGF0IGp1c3QgYWJvdXQgY292ZXJzIHRoZSBiYXNpY3MuIFRha2UgYSBsb29rIGluIHRoZSB0ZXN0LyBmb2xkZXIgZm9yIG1vcmUKKyAqIGRldGFpbGVkIGV4YW1wbGVzLiBBZnRlciB5b3UgcnVuIHRoaXMgZmlsZSwgeW91ciBnZW5lcmF0ZWQgY29kZSBzaG93cyB1cAorICogaW4gZm9sZGVycyB3aXRoIG5hbWVzIGdlbi08bGFuZ3VhZ2U+LiBUaGUgZ2VuZXJhdGVkIGNvZGUgaXNuJ3QgdG9vIHNjYXJ5CisgKiB0byBsb29rIGF0LiBJdCBldmVuIGhhcyBwcmV0dHkgaW5kZW50YXRpb24uCisgKi8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LmVsIGIvY29udHJpYi90aHJpZnQuZWwKaW5kZXggY2QzZTBlOC4uOTQxYTk5ZiAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQuZWwKKysrIGIvY29udHJpYi90aHJpZnQuZWwKQEAgLTEsNCArMSw3IEBACi07OworOzs7IHRocmlmdC5lbCAtLS0gTWFqb3IgbW9kZSBmb3IgQXBhY2hlIFRocmlmdCBmaWxlcworCis7OyBLZXl3b3JkczogZmlsZXMKKwogOzsgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogOzsgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKIDs7IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNyw5ICsyMCwxNiBAQAogOzsgdW5kZXIgdGhlIExpY2Vuc2UuCiA7OwogCis7OzsgQ29tbWVudGFyeToKKworOzsKKworOzs7IENvZGU6CisKIChyZXF1aXJlICdmb250LWxvY2spCiAKIChkZWZ2YXIgdGhyaWZ0LW1vZGUtaG9vayBuaWwpCis7OzsjIyNhdXRvbG9hZAogKGFkZC10by1saXN0ICdhdXRvLW1vZGUtYWxpc3QgJygiXFwudGhyaWZ0XFwnIiAuIHRocmlmdC1tb2RlKSkKIAogKGRlZnZhciB0aHJpZnQtaW5kZW50LWxldmVsIDIKQEAgLTI4LDEzICszOCwxMiBAQAogOzsgc3ludGF4IGNvbG9yaW5nCiAoZGVmY29uc3QgdGhyaWZ0LWZvbnQtbG9jay1rZXl3b3JkcwogICAobGlzdAotICAgJygiIy4qJCIgLiBmb250LWxvY2stY29tbWVudC1mYWNlKSAgOzsgcGVybCBzdHlsZSBjb21tZW50cwogICAgJygiXFw8XFwoaW5jbHVkZVxcfHN0cnVjdFxcfGV4Y2VwdGlvblxcfHR5cGVkZWZcXHxjb25zdFxcfGVudW1cXHxzZXJ2aWNlXFx8ZXh0ZW5kc1xcfHZvaWRcXHxvbmV3YXlcXHx0aHJvd3NcXHxvcHRpb25hbFxcfHJlcXVpcmVkXFwpXFw+IiAuIGZvbnQtbG9jay1rZXl3b3JkLWZhY2UpICA7OyBrZXl3b3JkcwogICAgJygiXFw8XFwoYm9vbFxcfGJ5dGVcXHxpMTZcXHxpMzJcXHxpNjRcXHxkb3VibGVcXHxzdHJpbmdcXHxiaW5hcnlcXHxtYXBcXHxsaXN0XFx8c2V0XFwpXFw+IiAuIGZvbnQtbG9jay10eXBlLWZhY2UpICA7OyBidWlsdC1pbiB0eXBlcwogICAgJygiXFw8XFwoWzAtOV0rXFwpXFw+IiAuIGZvbnQtbG9jay12YXJpYWJsZS1uYW1lLWZhY2UpICAgOzsgb3JkaW5hbHMKICAgICcoIlxcPFxcKFxcdytcXClcXHMtKigiICgxIGZvbnQtbG9jay1mdW5jdGlvbi1uYW1lLWZhY2UpKSAgOzsgZnVuY3Rpb25zCiAgICApCi0gICJUaHJpZnQgS2V5d29yZHMiKQorICAiVGhyaWZ0IEtleXdvcmRzLiIpCiAKIDs7IGluZGVudGF0aW9uCiAoZGVmdW4gdGhyaWZ0LWluZGVudC1saW5lICgpCkBAIC0xMDIsMTggKzExMSwyMCBAQAogICAgICAgICAgIChpbmRlbnQtbGluZS10byBjdXItaW5kZW50KQogICAgICAgICAoaW5kZW50LWxpbmUtdG8gMCkpKSkpCiAKLTs7IEMvQysrIGNvbW1lbnRzOyBhbHNvIGFsbG93aW5nIHVuZGVyc2NvcmUgaW4gd29yZHMKKzs7IEMvQysrLSBhbmQgc2gtc3R5bGUgY29tbWVudHM7IGFsc28gYWxsb3dpbmcgdW5kZXJzY29yZSBpbiB3b3JkcwogKGRlZnZhciB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUKICAgKGxldCAoKHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSAobWFrZS1zeW50YXgtdGFibGUpKSkKICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XyAidyIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQotICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8vICIuIDE0NTYiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKLSAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/KiAiLiAyMyIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQotICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cbiAiPiBiIiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCisgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyMgIjwiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkgOyBzaC1zdHlsZSBjb21tZW50cworICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8vICIuIDEyNCIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKSA7IGMvYysrLXN0eWxlIGNvbW1lbnRzCisgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyogIi4gMjNiIiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCisgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1xuICI+IiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCiAgICAgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQogICAiU3ludGF4IHRhYmxlIGZvciB0aHJpZnQtbW9kZSIpCiAKKzs7OyMjI2F1dG9sb2FkCiAoZGVmdW4gdGhyaWZ0LW1vZGUgKCkKLSAgIk1vZGUgZm9yIGVkaXRpbmcgVGhyaWZ0IGZpbGVzIgorICAiTW9kZSBmb3IgZWRpdGluZyBUaHJpZnQgZmlsZXMuIgogICAoaW50ZXJhY3RpdmUpCiAgIChraWxsLWFsbC1sb2NhbC12YXJpYWJsZXMpCiAgIChzZXQtc3ludGF4LXRhYmxlIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKQEAgLTEyMyw0ICsxMzQsNyBAQAogICAocnVuLWhvb2tzICd0aHJpZnQtbW9kZS1ob29rKQogICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdpbmRlbnQtbGluZS1mdW5jdGlvbikgJ3RocmlmdC1pbmRlbnQtbGluZSkKICAgKQotKHByb3ZpZGUgJ3RocmlmdC1tb2RlKQorCisocHJvdmlkZSAndGhyaWZ0KQorOzs7IHRocmlmdC5lbCBlbmRzIGhlcmUKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQuc3BlYyBiL2NvbnRyaWIvdGhyaWZ0LnNwZWMKaW5kZXggZWNlZTYzMS4uYmU1MjZlMiAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQuc3BlYworKysgYi9jb250cmliL3RocmlmdC5zcGVjCkBAIC0xNywzOCArMTcsMzkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgVE9ETyhkcmVpc3MpOiBIYXZlIGEgUHl0aG9uIGJ1aWxkIHdpdGggYW5kIHdpdGhvdXQgdGhlIGV4dGVuc2lvbi4KKyVkZWZpbmUgd2l0aG91dF9qYXZhIDEKKyVkZWZpbmUgd2l0aG91dF9weXRob24gMQorJWRlZmluZSB3aXRob3V0X3Rlc3RzIDEKKwogJXshP3B5dGhvbl9zaXRlbGliOiAlZGVmaW5lIHB5dGhvbl9zaXRlbGliICUoJXtfX3B5dGhvbn0gLWMgImZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl9saWI7IHByaW50IGdldF9weXRob25fbGliKCkiKX0KICV7IT9weXRob25fc2l0ZWFyY2g6ICVkZWZpbmUgcHl0aG9uX3NpdGVhcmNoICUoJXtfX3B5dGhvbn0gLWMgImZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl9saWI7IHByaW50IGdldF9weXRob25fbGliKDEpIil9Ci0jIFRPRE8oZHJlaXNzKTogV2hlcmUgaXMgdGhpcyBzdXBwb3NlZCB0byBnbz8KLSV7IT90aHJpZnRfZXJsYW5nX3Jvb3Q6ICVkZWZpbmUgdGhyaWZ0X2VybGFuZ19yb290IC9vcHQvdGhyaWZ0LWVybH0KIAogTmFtZTogICAgICAgICAgIHRocmlmdAogTGljZW5zZTogICAgICAgIEFwYWNoZSBMaWNlbnNlIHYyLjAKIEdyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudAogU3VtbWFyeTogICAgICAgIFJQQyBhbmQgc2VyaWFsaXphdGlvbiBmcmFtZXdvcmsKLVZlcnNpb246ICAgICAgICAyMDA4MDUyOXN2bgotRXBvY2g6ICAgICAgICAgIDEKLVJlbGVhc2U6ICAgICAgICAxCi1VUkw6ICAgICAgICAgICAgaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdAotUGFja2FnZXI6ICAgICAgIERhdmlkIFJlaXNzIDxkcmVpc3NAZmFjZWJvb2suY29tPgorVmVyc2lvbjogICAgICAgIDEuMC4wCitSZWxlYXNlOiAgICAgICAgMAorVVJMOiAgICAgICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworUGFja2FnZXI6ICAgICAgIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CiBTb3VyY2UwOiAgICAgICAgJXtuYW1lfS0le3ZlcnNpb259LnRhci5negogCiBCdWlsZFJlcXVpcmVzOiAgZ2NjID49IDMuNC42CiBCdWlsZFJlcXVpcmVzOiAgZ2NjLWMrKwogCi0jIFRPRE8oZHJlaXNzKTogQ2FuIHRoZXNlIGJlIG1vdmVkIGludG8gdGhlIGluZGl2aWR1YWwgcGFja2FnZXM/Ci0laWYgJXshP3dpdGhvdXRfamF2YTogMX0KKyVpZiAwJXshP3dpdGhvdXRfamF2YToxfQogQnVpbGRSZXF1aXJlczogIGphdmEtZGV2ZWwgPj0gMDoxLjUuMAogQnVpbGRSZXF1aXJlczogIGFudCA+PSAwOjEuNi41CiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X3B5dGhvbjogMX0KKyVpZiAwJXshP3dpdGhvdXRfcHl0aG9uOjF9CiBCdWlsZFJlcXVpcmVzOiAgcHl0aG9uLWRldmVsCiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X2VybGFuZzogMX0KLUJ1aWxkUmVxdWlyZXM6ICBlcmxhbmcKKyVpZiAwJXshP3dpdGhvdXRfcnVieToxfQorJWRlZmluZSBnZW1fbmFtZSAle25hbWV9CitCdWlsZFJlcXVpcmVzOiAgcnVieS1kZXZlbAorQnVpbGRSZXF1aXJlczogIHJ1YnlnZW1zLWRldmVsCiAlZW5kaWYKIAogQnVpbGRSb290OiAgICAgICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0le3JlbGVhc2V9LXJvb3QtJSgle19faWRfdX0gLW4pCkBAIC03NSw2ICs3Niw3IEBACiAlZmlsZXMgbGliLWNwcAogJWRlZmF0dHIoLSxyb290LHJvb3QpCiAle19saWJkaXJ9L2xpYnRocmlmdCouc28uKgorJXtfbGliZGlyfS9saWJ0aHJpZnQqLnNvCiAKIAogJXBhY2thZ2UgbGliLWNwcC1kZXZlbApAQCAtODIsMTAgKzg0LDEwIEBACiBHcm91cDogICAgIExpYnJhcmllcwogUmVxdWlyZXM6ICAle25hbWV9ID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9CiBSZXF1aXJlczogIGJvb3N0LWRldmVsCi0laWYgJXshP3dpdGhvdXRfbGliZXZlbnQ6IDF9CislaWYgMCV7IT93aXRob3V0X2xpYmV2ZW50OjF9CiBSZXF1aXJlczogIGxpYmV2ZW50LWRldmVsID49IDEuMgogJWVuZGlmCi0laWYgJXshP3dpdGhvdXRfemxpYjogMX0KKyVpZiAwJXshP3dpdGhvdXRfemxpYjoxfQogUmVxdWlyZXM6ICB6bGliLWRldmVsCiAlZW5kaWYKIApAQCAtOTYsMTEgKzk4LDEwIEBACiAlZGVmYXR0cigtLHJvb3Qscm9vdCkKICV7X2luY2x1ZGVkaXJ9L3RocmlmdC8KICV7X2xpYmRpcn0vbGlidGhyaWZ0Ki4qYQotJXtfbGliZGlyfS9saWJ0aHJpZnQqLnNvCiAle19saWJkaXJ9L3BrZ2NvbmZpZy90aHJpZnQqLnBjCiAKIAotJWlmICV7IT93aXRob3V0X2phdmE6IDF9CislaWYgMCV7IT93aXRob3V0X2phdmE6MX0KICVwYWNrYWdlIGxpYi1qYXZhCiBTdW1tYXJ5OiAgIFRocmlmdCBKYXZhIGxpYnJhcnkKIEdyb3VwOiAgICAgTGlicmFyaWVzCkBAIC0xMTUsNyArMTE2LDcgQEAKICVlbmRpZgogCiAKLSVpZiAleyE/d2l0aG91dF9weXRob246IDF9CislaWYgMCV7IT93aXRob3V0X3B5dGhvbjoxfQogJXBhY2thZ2UgbGliLXB5dGhvbgogU3VtbWFyeTogVGhyaWZ0IFB5dGhvbiBsaWJyYXJ5CiBHcm91cDogICBMaWJyYXJpZXMKQEAgLTEyOSwxOCArMTMwLDMyIEBACiAlZW5kaWYKIAogCi0laWYgJXshP3dpdGhvdXRfZXJsYW5nOiAxfQotJXBhY2thZ2UgbGliLWVybGFuZwotU3VtbWFyeTogIFRocmlmdCBQeXRob24gbGlicmFyeQotR3JvdXA6ICAgIExpYnJhcmllcwotUmVxdWlyZXM6IGVybGFuZworJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CislcGFja2FnZSAtbiBydWJ5Z2VtLSV7Z2VtX25hbWV9CitTdW1tYXJ5OiBUaHJpZnQgUnVieSBsaWJyYXJ5CitHcm91cDogICBMaWJyYXJpZXMKK09ic29sZXRlczogJXtuYW1lfS1saWItcnVieQogCi0lZGVzY3JpcHRpb24gbGliLWVybGFuZwotRXJsYW5nIGxpYnJhcmllcyBmb3IgVGhyaWZ0LgorJWRlc2NyaXB0aW9uIC1uIHJ1YnlnZW0tJXtnZW1fbmFtZX0KK1J1YnkgbGlicmFyaWVzIGZvciBUaHJpZnQuCiAKLSVmaWxlcyBsaWItZXJsYW5nCislZmlsZXMgLW4gcnVieWdlbS0le2dlbV9uYW1lfQogJWRlZmF0dHIoLSxyb290LHJvb3QpCi0le3RocmlmdF9lcmxhbmdfcm9vdH0KKyV7Z2VtX2Rpcn0vKgorJWVuZGlmCisKKworJWlmIDAleyE/d2l0aG91dF9waHA6MX0KKyVwYWNrYWdlIGxpYi1waHAKK1N1bW1hcnk6IFRocmlmdCBQSFAgbGlicmFyeQorR3JvdXA6ICAgTGlicmFyaWVzCisKKyVkZXNjcmlwdGlvbiBsaWItcGhwCitQSFAgbGlicmFyaWVzIGZvciBUaHJpZnQuCisKKyVmaWxlcyBsaWItcGhwCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKy91c3IvbGliL3BocC8qCiAlZW5kaWYKIAogCkBAIC0xNDgsNTkgKzE2Myw4OSBAQAogJXNldHVwIC1xCiAKICVidWlsZAotIyBUT0RPKGRyZWlzcyk6IEltcGxlbWVudCBhIHNpbmdsZSAtLXdpdGhvdXQtYnVpbGQta2x1ZGdlcy4KK1tbIC1lIE1ha2VmaWxlLmluIF1dIHx8IC4vYm9vdHN0cmFwLnNoCitleHBvcnQgR0VNX0hPTUU9JHtQV0R9Ly5nZW0taG9tZQorZXhwb3J0IFJVQllMSUI9JHtQV0R9L2xpYi9yYi9saWIKICVjb25maWd1cmUgXAogICAlez93aXRob3V0X2xpYmV2ZW50OiAtLXdpdGhvdXQtbGliZXZlbnQgfSBcCiAgICV7P3dpdGhvdXRfemxpYjogICAgIC0td2l0aG91dC16bGliICAgICB9IFwKLSAgLS13aXRob3V0LWphdmEgXAorICAlez93aXRob3V0X3Rlc3RzOiAgICAtLXdpdGhvdXQtdGVzdHMgICAgfSBcCisgICV7P3dpdGhvdXRfamF2YTogICAgIC0td2l0aG91dC1qYXZhICAgICB9IFwKKyAgJXs/d2l0aG91dF9weXRob246ICAgLS13aXRob3V0LXB5dGhvbiAgIH0gXAorICAlez93aXRob3V0X3J1Ynk6ICAgICAtLXdpdGhvdXQtcnVieSAgICAgfSBcCisgICV7P3dpdGhvdXRfcGhwOiAgICAgIC0td2l0aG91dC1waHAgICAgICB9IFwKKyAgJXshP3dpdGhvdXRfcGhwOiAgICAgUEhQX1BSRUZJWD0ke1JQTV9CVUlMRF9ST09UfS91c3IvbGliL3BocCB9IFwKICAgLS13aXRob3V0LWNzaGFycCBcCi0gIC0td2l0aG91dC1weSBcCiAgIC0td2l0aG91dC1lcmxhbmcgXAogCi1tYWtlCislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KK2V2YWwgJChncmVwICJeV0lUSF9SVUJZX1RSVUUiIGNvbmZpZy5sb2cpCitpZiBbWyAiJHtXSVRIX1JVQllfVFJVRX0iICE9ICIiIF1dOyB0aGVuCisgIHNldCAreAorICBlY2hvICIiCisgIGVjaG8gImNvbmZpZ3VyZSBkZXRlcm1pbmVkIHRoYXQgcnVieSByZXF1aXJlbWVudHMgYXJlIG1pc3NpbmcgKGJ1bmRsZXIgZ2VtPyksIGVpdGhlciBpbnN0YWxsIG1pc3NpbmcgY29tcG9uZW50cyIgPiYyCisgIGVjaG8gIm9yIGRpc2FibGUgdGhlIHJ1Ynkgc3ViLXBhY2thZ2VzIGFzIGZvbGxvd3M6IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiYyCisgIGVjaG8gIiAgICAgcnBtYnVpbGQgLUQnJXdpdGhvdXRfcnVieSAxJyAuLi4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiYyCisgIGVjaG8gIiIKKyAgZXhpdCAxCitmaQorJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9qYXZhOiAxfQorbWFrZSAlez9fc21wX21mbGFnc30KKworJWlmIDAleyE/d2l0aG91dF9qYXZhOjF9CiBjZCBsaWIvamF2YQogJWFudAogY2QgLi4vLi4KICVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfcHl0aG9uOiAxfQorJWlmIDAleyE/d2l0aG91dF9weXRob246MX0KIGNkIGxpYi9weQogQ0ZMQUdTPSIle29wdGZsYWdzfSIgJXtfX3B5dGhvbn0gc2V0dXAucHkgYnVpbGQKIGNkIC4uLy4uCiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X2VybGFuZzogMX0KLWNkIGxpYi9lcmwKLW1ha2UKLWNkIC4uLy4uCislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KKyVnZW1faW5zdGFsbCAtbiBsaWIvcmIvdGhyaWZ0Ki5nZW0KICVlbmRpZgogCiAlaW5zdGFsbAorZXhwb3J0IEdFTV9IT01FPSR7UFdEfS8uZ2VtLWhvbWUKK2V4cG9ydCBSVUJZTElCPSR7UFdEfS9saWIvcmIvbGliCiAlbWFrZWluc3RhbGwKK2xuIC1zIGxpYnRocmlmdC0le3ZlcnNpb259LnNvICR7UlBNX0JVSUxEX1JPT1R9JXtfbGliZGlyfS9saWJ0aHJpZnQuc28uMAorbG4gLXMgbGlidGhyaWZ0bmItJXt2ZXJzaW9ufS5zbyAke1JQTV9CVUlMRF9ST09UfSV7X2xpYmRpcn0vbGlidGhyaWZ0bmIuc28uMAorbG4gLXMgbGlidGhyaWZ0ei0le3ZlcnNpb259LnNvICR7UlBNX0JVSUxEX1JPT1R9JXtfbGliZGlyfS9saWJ0aHJpZnR6LnNvLjAKIAotJWlmICV7IT93aXRob3V0X2phdmE6IDF9CislaWYgMCV7IT93aXRob3V0X2phdmE6MX0KIG1rZGlyIC1wICRSUE1fQlVJTERfUk9PVCV7X2phdmFkaXJ9Ci1jcCAtcCBsaWIvamF2YS8qLmphciAkUlBNX0JVSUxEX1JPT1Qle19qYXZhZGlyfQorY3AgLXAgbGliL2phdmEvYnVpbGQvKi5qYXIgJFJQTV9CVUlMRF9ST09UJXtfamF2YWRpcn0KICVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfcHl0aG9uOiAxfQorJWlmIDAleyE/d2l0aG91dF9weXRob246MX0KIGNkIGxpYi9weQogJXtfX3B5dGhvbn0gc2V0dXAucHkgaW5zdGFsbCAtTzEgLS1za2lwLWJ1aWxkIC0tcm9vdCAkUlBNX0JVSUxEX1JPT1QKIGNkIC4uLy4uCiAlZW5kaWYKIAotJWlmICV7IT93aXRob3V0X2VybGFuZzogMX0KLW1rZGlyIC1wICR7UlBNX0JVSUxEX1JPT1R9JXt0aHJpZnRfZXJsYW5nX3Jvb3R9Ci1jcCAtciBsaWIvZXJsL2ViaW4gJHtSUE1fQlVJTERfUk9PVH0le3RocmlmdF9lcmxhbmdfcm9vdH0KKyVpZiAwJXshP3dpdGhvdXRfcnVieToxfQorbWtkaXIgLXAgJXtidWlsZHJvb3R9JXtnZW1fZGlyfQorY3AgLWEgLi8le2dlbV9kaXJ9LyogJXtidWlsZHJvb3R9JXtnZW1fZGlyfS8KICVlbmRpZgogCi0KICVjbGVhbgogcm0gLXJmICR7UlBNX0JVSUxEX1JPT1R9CiAKIAorJXBvc3QKK3VtYXNrIDAwNworL3NiaW4vbGRjb25maWcgPiAvZGV2L251bGwgMj4mMQorCisKKyVwb3N0dW4KK3VtYXNrIDAwNworL3NiaW4vbGRjb25maWcgPiAvZGV2L251bGwgMj4mMQorCiAlY2hhbmdlbG9nCi0qIFdlZCBNYXkgMjggMjAwOCBEYXZpZCBSZWlzcyA8ZHJlaXNzQGZhY2Vib29rLmNvbT4gLSAyMDA4MDUyOXN2bgotLSBJbml0aWFsIGJ1aWxkLCBiYXNlZCBvbiB0aGUgd29yayBvZiBLZXZpbiBTbWl0aCBhbmQgQmVuIE1hdXJlci4KKyogV2VkIE9jdCAxMCAyMDEyIFRocmlmdCBEZXYgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4gCistIFRocmlmdCAwLjkuMCByZWxlYXNlLgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQudmltIGIvY29udHJpYi90aHJpZnQudmltCmluZGV4IDc5Y2U1NDcuLjYyMzE5NTUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LnZpbQorKysgYi9jb250cmliL3RocmlmdC52aW0KQEAgLTUxLDggKzUxLDggQEAKIHN5biBrZXl3b3JkIHRocmlmdEtleXdvcmQgbmFtZXNwYWNlCiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIHhzZF9hbGwgeHNkX29wdGlvbmFsIHhzZF9uaWxsYWJsZSB4c2RfYXR0cnMKIHN5biBrZXl3b3JkIHRocmlmdEtleXdvcmQgaW5jbHVkZSBjcHBfaW5jbHVkZSBjcHBfdHlwZSBjb25zdCBvcHRpb25hbCByZXF1aXJlZAotc3luIGtleXdvcmQgdGhyaWZ0QmFzaWNUeXBlcyB2b2lkIGJvb2wgYnl0ZSBpMTYgaTMyIGk2NCBkb3VibGUgc3RyaW5nIGJpbmFyeQotc3luIGtleXdvcmQgdGhyaWZ0U3RydWN0dXJlIG1hcCBsaXN0IHNldCBzdHJ1Y3QgdHlwZWRlZiBleGNlcHRpb24gZW51bSB0aHJvd3MKK3N5biBrZXl3b3JkIHRocmlmdEJhc2ljVHlwZXMgdm9pZCBib29sIGJ5dGUgaTggaTE2IGkzMiBpNjQgZG91YmxlIHN0cmluZyBiaW5hcnkKK3N5biBrZXl3b3JkIHRocmlmdFN0cnVjdHVyZSBtYXAgbGlzdCBzZXQgc3RydWN0IHR5cGVkZWYgZXhjZXB0aW9uIGVudW0gdGhyb3dzIHVuaW9uCiAKICIgU3BlY2lhbAogc3luIG1hdGNoIHRocmlmdFNwZWNpYWwgIlxkXCs6IgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnRfZHVtcC5jcHAgYi9jb250cmliL3RocmlmdF9kdW1wLmNwcAppbmRleCAwZGRmY2VjLi41OWM4YWM4IDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdF9kdW1wLmNwcAorKysgYi9jb250cmliL3RocmlmdF9kdW1wLmNwcApAQCAtMjAsMTEgKzIwLDExIEBACiAjaW5jbHVkZSA8Y3N0ZGxpYj4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RQcm90b2NvbFRhcC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9NYWtlZmlsZSBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUwM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjUgQEAKK1RIUklGVF9ESVIgPS4uLy4uCitJTkNTX0RJUlMgID0tSSR7VEhSSUZUX0RJUn0vbGliL2NwcC9zcmMgLUkuCitUSFJJRlRfTElCID0ke1RIUklGVF9ESVJ9L2xpYi9jcHAvLmxpYnMvbGlidGhyaWZ0LmEKK0JPT1NUX0xJQiAgPQorQ1BQX0RFRlMgICA9CitDUFBfT1BUUyAgID0tV2FsbCAtTzIKKworR0VOX1NSQyAgICA9IGdlbi1jcHAvU2FtcGxlU2VydmljZS5jcHAgIFwKKyAgICAgICAgICAgICBnZW4tY3BwL1NhbXBsZV90eXBlcy5jcHAgICBcCisgICAgICAgICAgICAgZ2VuLWNwcC9TYW1wbGVDYWxsYmFjay5jcHAgXAorICAgICAgICAgICAgIGdlbi1jcHAvU2FtcGxlX2NvbnN0YW50cy5jcHAKK0dFTl9JTkMgICAgPSAtSWdlbi1jcHAKKworZGVmYXVsdDogc2VydmVyIGNsaWVudAorLlBIT05ZOiBzZXJ2ZXIgY2xpZW50CisKK3NlcnZlcjoKKwlnKysgJHtDUFBfT1BUU30gJHtDUFBfREVGU30gLW8gc2VydmVyL3NlcnZlciAke0dFTl9JTkN9ICR7SU5DU19ESVJTfSBzZXJ2ZXIvc2VydmVyLmNwcCAke0dFTl9TUkN9ICR7VEhSSUZUX0xJQn0gJHtCT09TVF9MSUJ9CisKK2NsaWVudDoKKwlnKysgJHtDUFBfT1BUU30gJHtDUFBfREVGU30gLW8gY2xpZW50L2NsaWVudCAke0dFTl9JTkN9ICR7SU5DU19ESVJTfSBjbGllbnQvY2xpZW50LmNwcCAke0dFTl9TUkN9ICR7VEhSSUZUX0xJQn0gJHtCT09TVF9MSUJ9CisKK2NsZWFuOgorCSQoUk0pIC1yIGNsaWVudC9jbGllbnQgc2VydmVyL3NlcnZlcgorCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvUkVBRE1FLm1kIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRmYzBhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1JFQURNRS5tZApAQCAtMCwwICsxLDYxIEBACitUaHJpZnQgdHJhbnNwb3J0IHNhbXBsZSBwcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgY3Jvc3MtcGxhdGZvcm0gcHJvamVjdCBoYXMgYmVlbiBidWlsdCB3aXRoIFdpbmRvd3MgVmlzdWFsIFN0dWRpbyAxMCBhbmQgCitPU1ggMTAuNy4xJ3MgZysrLiAgVGhlIGNsaWVudCBhbmQgc2VydmVyIHN1cHBvcnQgc29ja2V0IGFuZCBwaXBlIHRyYW5zcG9ydHMgCit0aHJvdWdoIGNvbW1hbmQtbGluZSBzd2l0Y2hlcy4KKworV2luZG93cyBzdXBwb3J0cyBib3RoIG5hbWVkICYgYW5vbnltb3VzIHBpcGVzOyAqTklYIGdldHMgb25seSBuYW1lZCAKKydwaXBlcycgYXQgdGhpcyB0aW1lLgorCitXaW5kb3dzLW9ubHkgYXQgdGhpcyB0aW1lOgorVGhlIGNsaWVudCAmIHNlcnZlciBhcmUgZG91YmxlLWVuZGVkLiBCb3RoIHNpZGVzIHJ1biBhIHNlcnZlciBhbmQgY2xpZW50IHRvIAorZW5hYmxlIGZ1bGwgZHVwbGV4IGJpZGlyZWN0aW9uYWwgZXZlbnQgc2lnbmFsaW5nLiBUaGV5IGFyZSBzaW1wbGUgY29tbWFuZCAKK2xpbmUgYXBwcy4gVGhlIHNlcnZlciBydW5zIHVudGlsIGl0J3MgYWJvcnRlZCAoQ3RsLUMpLiBUaGUgY2xpZW50IGNvbm5lY3RzIHRvCit0aGUgc2VydmVyLCBpbmZvcm1zIHRoZSBzZXJ2ZXIgb2YgaXRzIGxpc3RlbmluZyBwaXBlL3BvcnQsIHJ1bnMgc29tZSBtb3JlIFJQQ3MgCithbmQgZXhpdHMuIFRoZSBzZXJ2ZXIgYWxzbyBtYWtlcyBSUEMgY2FsbHMgdG8gdGhlIGNsaWVudCB0byBkZW1vbnN0cmF0ZSAKK2JpZGlyZWN0aW9uYWwgb3BlcmF0aW9uLgorCitQcmVxdWlzaXRlczoKK0Jvb3N0IC0tIHRlc3RlZCB3aXRoIEJvb3N0IDEuNDcsIG90aGVyIHZlcnNpb25zIG1heSB3b3JrLgorbGlidGhyaWZ0IGxpYnJhcnkgLS0gYnVpbGQgdGhlIGxpYnJhcnkgdW5kZXIgInRocmlmdC9saWIvY3BwLyIKK3RocmlmdCBJREwgY29tcGlsZXIgLS0gZG93bmxvYWQgZnJvbSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG93bmxvYWQvIAorICAgb3IgYnVpbGQgZnJvbSAidGhyaWZ0L2NvbXBpbGVyL2NwcCIuICBUaGUgSURMIGNvbXBpbGVyIHZlcnNpb24gc2hvdWxkCisgICBtYXRjaCB0aGUgdGhyaWZ0IHNvdXJjZSBkaXN0cmlidXRpb24ncyB2ZXJzaW9uLiBGb3IgaW5zdGFuY2UsIHRocmlmdC0wLjkuMAorICAgaGFzIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGhhbiB0aHJpZnQtMC44LjAgYW5kIHRoZSBnZW5lcmF0ZWQKKyAgIGZpbGVzIGFyZSBub3QgY29tcGF0aWJsZS4KKworTm90ZTogQnVsZGluZyB0aGUgdGhyaWZ0IElETCBjb21waWxlciBhbmQgbGlicmFyeSBhcmUgYmV5b25kIHRoZSBzY29wZQorb2YgdGhpcyBhcnRpY2xlLiBQbGVhc2UgcmVmZXIgdG8gdGhlIFRocmlmdCBkb2N1bWVudGF0aW9uIGluIHRoZSByZXNwZWN0aXZlCitkaXJlY3RvcmllcyBhbmQgb25saW5lLgorCisKK01pY3Jvc29mdCBXaW5kb3dzIHdpdGggVmlzdWFsIFN0dWRpbyAxMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29weSB0aGUgSURMIGNvbXBpbGVyICd0aHJpZnQuZXhlJyB0byB0aGlzIHByb2plY3QgZm9sZGVyIG9yIHRvIGEgbG9jYXRpb24gaW4gdGhlIHBhdGguCitSdW4gdGhyaWZ0bWUuYmF0IHRvIGdlbmVyYXRlIHRoZSBpbnRlcmZhY2Ugc291cmNlIGZyb20gdGhlIHRocmlmdCBmaWxlcy4KKworT3BlbiB0cmFuc3BvcnQtc2FtcGxlLnNsbiBhbmQuLi4KK0FkYXB0IHRoZSBCb29zdCBwYXRocyBmb3IgdGhlIGNsaWVudCBhbmQgc2VydmVyIHByb2plY3RzLiBSaWdodC1jbGljayBvbiBlYWNoIHByb2plY3QsIHNlbGVjdAorUHJvcGVydGllcywgdGhlbjoKK0NvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBDL0MrKyAtPiBHZW5lcmFsIC0+IEFkZGl0aW9uYWwgSW5jbHVkZSBEaXJlY3RvcmllcworQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIC0+IExpbmtlciAtPiBHZW5lcmFsIC0+IEFkZGl0aW9uYWwgSW5jbHVkZSBEaXJlY3RvcmllcworCitUaGUgc3RvY2sgcGF0aCBhc3N1bWVzIHRoYXQgQm9vc3QgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgdGhyaWZ0IHJlcG8gcm9vdC4KKworUnVuIHRoZSBmb2xsb3dpbmcgaW4gc2VwYXJhdGUgY29tbWFuZCBwcm9tcHRzIGZyb20gdGhlIFJlbGVhc2Ugb3IgRGVidWcgCitidWlsZCBmb2xkZXI6Cisgc2VydmVyLmV4ZSAtbnAgdGVzdAorIGNsaWVudC5leGUgLW5wIHRlc3QKKworCisqTklYIGZsYXZvcnMKKy0tLS0tLS0tLS0tLQorQnVpbGQgdGhlIHRocmlmdCBjcHAgbGlicmFyeS4KK0J1aWxkIHRoZSBJREwgY29tcGlsZXIgYW5kIGNvcHkgaXQgdG8gdGhpcyBwcm9qZWN0IGZvbGRlci4KK1J1biB0aHJpZnRtZS5zaCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIHNvdXJjZSBmcm9tIHRoZSB0aHJpZnQgZmlsZXMuCitSdW4gJ21ha2UnCisKK1J1biB0aGUgZm9sbG93aW5nIGluIHNlcGFyYXRlIHNoZWxsczoKKyBzZXJ2ZXIvc2VydmVyIC1ucCAvdG1wL3Rlc3QKKyBjbGllbnQvY2xpZW50IC1ucCAvdG1wL3Rlc3QKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9TYW1wbGUudGhyaWZ0IGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1NhbXBsZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0MGUyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9TYW1wbGUudGhyaWZ0CkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgdHJhbnNwb3J0LXNhbXBsZSB0aHJpZnQgSURMIGZpbGUgLgorIEV4ZWN1dGUgdGhyaWZ0bWUuYmF0IHVuZGVyIFdpbmRvd3MgdG8gZ2VuZXJhdGUgdGhlIGNwcCBzdHVicyBmcm9tIHRoaXMgSURMLgorICovCisKKy8vIFNlZSB0aHJpZnQvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0IGFuZCBzaGFyZWQudGhyaWZ0IGZvciBtb3JlIGV4dGVuc2l2ZSBleGFtcGxlcy4KKworCituYW1lc3BhY2UgY3BwIFNhbXBsZQorbmFtZXNwYWNlIGphdmEgU2FtcGxlCituYW1lc3BhY2UgcGVybCBTYW1wbGUKKworLy9UaGlzIHN0cnVjdCBpcyBub3QgdXNlZCBpbiB0aGUgc2FtcGxlLiBTaG93biBoZXJlIGZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMgb25seS4KKy8vCitzdHJ1Y3QgU2FtcGxlU3RydWN0Cit7CisgIDE6IGkzMiBrZXkKKyAgMjogc3RyaW5nIHZhbHVlCit9CisKKworLy9BIHNlcnZpY2UgY29udGFpbnMgdGhlIFJQQyhzKS4KKy8vCitzZXJ2aWNlIFNhbXBsZVNlcnZpY2UKK3sKKyAgc3RyaW5nIEhlbGxvVGhlcmUoMTpzdHJpbmcgSGVsbG9TdHJpbmcpLAorICB2b2lkIFNlcnZlckRvU29tZXRoaW5nKCksCisKKyAgLy9DbGllbnQgY2FsbHMgdGhpcyB0byB0ZWxsIHNlcnZlciB3aGljaCBwb3J0IHRvIGNvbm5lY3QgYmFjayBvbi4KKyAgdm9pZCBDbGllbnRTaWRlTGlzdGVuUG9ydCgxOmkxNiBQb3J0KSwKKyAgLy9OYW1lZCBwaXBlIHZlcnNpb24KKyAgdm9pZCBDbGllbnRTaWRlUGlwZU5hbWUoMTpzdHJpbmcgbmFtZSksCit9CisKKy8vU2FtcGxlIFJQQyBvbiB0aGUgJ2NsaWVudCcgc2lkZSB0aGF0IHRoZSBtYXN0ZXIgc2VydmVyIGNhbiBjYWxsLgorc2VydmljZSBTYW1wbGVDYWxsYmFjaworeworICB2b2lkIHBpbmdjbGllbnQoKSwKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uY3BwIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlYmY3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFRocmlmdENvbW1vbi5jcHAgOiBDb21tb24gZnVuY3Rpb25zIGZvciBzYW1wbGUgVGhyaWZ0IGNsaWVudCBhbmQgc2VydmVyCisvLworCisjaW5jbHVkZSAiVGhyaWZ0Q29tbW9uLmgiCisKK25hbWVzcGFjZSB0aHJpZnRjb21tb24KK3sKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvL0xhdW5jaCBjaGlsZCBwcm9jZXNzIGFuZCBwYXNzIFIvVyBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzIG9uIGNtZCBsaW5lLgorCS8vVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGVsZXZhdGlvbiBvciBvdGhlciAKKwkvL2FkdmFuY2VkIGZlYXR1cmVzLgorCS8vCisJYm9vbCBMYXVuY2hBbm9uUGlwZUNoaWxkKHN0ZDo6c3RyaW5nIGFwcCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KQorCXsKKyNpZmRlZiBfV0lOMzIKKwkJUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKwkJU1RBUlRVUElORk9BIHNpOworCQlHZXRTdGFydHVwSW5mb0EoJnNpKTsgIC8vc2V0IHN0YXJ0dXBpbmZvIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzCisJCWNoYXIgaGFuZGxlc1tNQVhfUEFUSF07ICAvL1N0b3JlcyBwaXBlIGhhbmRsZXMgY29udmVydGVkIHRvIHRleHQKKworCQlzcHJpbnRmKGhhbmRsZXMsICIlcyAlZCAlZCIsIGFwcC5jX3N0cigpLAorCQkJKGludClib29zdDo6c2hhcmVkX2R5bmFtaWNfY2FzdDxUUGlwZVNlcnZlcj4odHJhbnNwb3J0KS0+Z2V0Q2xpZW50UmRQaXBlSGFuZGxlKCksCisJCQkoaW50KWJvb3N0OjpzaGFyZWRfZHluYW1pY19jYXN0PFRQaXBlU2VydmVyPih0cmFuc3BvcnQpLT5nZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkpOworCisJCS8vc3Bhd24gdGhlIGNoaWxkIHByb2Nlc3MKKwkJaWYgKCFDcmVhdGVQcm9jZXNzQShOVUxMLCBoYW5kbGVzLCBOVUxMLE5VTEwsVFJVRSwwLE5VTEwsTlVMTCwmc2ksJnBpKSkKKwkJeworCQkJR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlUHJvY2VzcyBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKKwkJQ2xvc2VIYW5kbGUocGkuaFByb2Nlc3MpOworI2VuZGlmCisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZkODdkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5oCkBAIC0wLDAgKzEsMjA1IEBACisvLyBUaHJpZnRDb21tb24uaCA6IENvbW1vbiBpbmNsdWRlcywgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGVzIAorLy8gZm9yIHNhbXBsZSBUaHJpZnQgY2xpZW50IGFuZCBzZXJ2ZXIKKy8vCisvLyBBZGQgdGhlIGZvbGxvd2luZyBwYXRocyB0byB0aGUgUHJvamVjdCdzIHByb3BlcnRpZXM6CisvLworLy8gQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIC0+IEMvQysrIC0+IEdlbmVyYWwtPiBBZGRpdGlvbmFsIEluY2x1ZGUgRGlyZWN0b3JpZXMgLS0KKy8vIC4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9ib29zdDsuLi8uLi8uLi8uLi9ib29zdC9ib29zdC90cjE7CisvLworLy8gQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIC0+IExpbmtlciAtPiBHZW5lcmFsIC0+IEFkZGl0aW9uYWwgTGlicmFyeSBEaXJlY3RvcmllcyAtLQorLy8gLi4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYgorLy8KKy8vIENvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAtPiBMaW5rZXIgLT4gSW5wdXQgLT4gQWRkaXRpb25hbCBEZXBlbmRlbmNpZXMgLS0KKy8vIGxpYnRocmlmdC5saWIKKy8vCisvLyAuLi4gYWRqdXN0IHJlbGF0aXZlIHBhdGhzIGFzIG5lY2Vzc2FyeS4KKy8vCisKKyNpZmRlZiBfV0lOMzIgLy90aHJpZnQgaXMgY3Jhc2hpbmcgd2hlbiB1c2luZyBib29zdCB0aHJlYWRzIG9uIE1hYyBPU1gKKyNlbHNlCisjICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjICBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vIFJlcXVpcmVkIEluY2x1ZGVzCisvLydzZXJ2ZXInIHNpZGUgI2luY2x1ZGVzCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorLy8nY2xpZW50JyBzaWRlICNpbmNsdWRlcworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorCisKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvLyBSZXF1aXJlZCBOYW1lc3BhY2VzCisvLydzZXJ2ZXInIHNpZGUgbmFtZXNwYWNlcwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworLy9jb21tb24gbmFtZXNwYWNlcwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworLy91c2luZyBuYW1lc3BhY2UgYm9vc3Q7IC8vdXNpbmcgbnMgYm9vc3QgY2FuIGludHJvZHVjZSB0eXBlIGNvbmZsaWN0cworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworbmFtZXNwYWNlIHRocmlmdGNvbW1vbgoreworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vCisJLy9TdGFydCB0aGUgdGhyaWZ0ICdzZXJ2ZXInIChib3RoIHNlcnZlciAmIGNsaWVudCBzaWRlIHJ1biBvbmUgZm9yIGJpZGlyIGV2ZW50IHNpZ25hbGluZykKKwkvLyAqKiogVGhpcyBmdW5jdGlvbiB0ZW1wbGF0ZSB3aWxsIGJsb2NrICoqKgorCS8vCisJdGVtcGxhdGUgPGNsYXNzIE15SGFuZGxlciwgY2xhc3MgTXlQcm9jZXNzb3I+CisJdm9pZCBSdW5UaHJpZnRTZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15SGFuZGxlcj4gaG5kbHIsIAorCQkgICAgICAgICAgICAgICAgICBpbnQgTnVtVGhyZWFkcywgCisJCQkJCQkgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKwkJCQkJCSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4gJnNlcnZlcikKKwl7CisjaWZkZWYgX1dJTjMyCisJCWlmICghaG5kbHIuZ2V0KCkpCisJCQl0aHJvdyBzdGQ6OmV4Y2VwdGlvbigiUnVuVGhyaWZ0U2VydmVyKCkgaW52YWxpZCBoYW5kbGVyIik7CisJCWlmICghdHJhbnNwb3J0LmdldCgpKQorCQkJdGhyb3cgc3RkOjpleGNlcHRpb24oIlJ1blRocmlmdFNlcnZlcigpIGludmFsaWQgdHJhbnNwb3J0Iik7CisjZWxzZQorCQlpZiAoICFobmRsci5nZXQoKSB8fCAhdHJhbnNwb3J0LmdldCgpICkKKwkJCXRocm93IHN0ZDo6ZXhjZXB0aW9uKCk7CisjZW5kaWYKKworCQlib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhhbmRsZXIoaG5kbHIpOworCQlib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3IE15UHJvY2Vzc29yKGhhbmRsZXIpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRmYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworCQlib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKworCQlpZihOdW1UaHJlYWRzIDw9IDEpCisJCXsJLy9TaW5nbGUtdGhyZWFkZWQgc2VydmVyCisJCQlzZXJ2ZXIucmVzZXQobmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkpOworCQl9CisJCWVsc2UKKwkJewkvL011bHRpLXRocmVhZGVkIHNlcnZlcgorCQkJYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoTnVtVGhyZWFkcyk7CisJCQlib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPSBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisJCQl0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworCQkJdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKwkJCXNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSwgdGhyZWFkTWFuYWdlcikpOworCQl9CisKKwkJcHJpbnRmKCJTdGFydGluZyB0aGUgJ3NlcnZlcicuLi5cbiIpOworCQlzZXJ2ZXItPnNlcnZlKCk7CisJCXByaW50ZigiZG9uZS5cbiIpOworCX0KKworCS8vIFRocmlmdCBzZXJ2ZXIgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwaXBlIG5hbWUuCisJLy8gQSBoYW5kbGVyIG11c3QgYmUgcGFzc2VkIGluIHRvIHRoaXMgdmVyc2lvbi4KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlIYW5kbGVyLCBjbGFzcyBNeVByb2Nlc3Nvcj4KKwl2b2lkIFJ1blRocmlmdFNlcnZlciAoYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBobmRsciwgaW50IE51bVRocmVhZHMsIHN0ZDo6c3RyaW5nIHBpcGVuYW1lLCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPiAmc3ZyKQorCXsKKyNpZm5kZWYgX1dJTjMyICAvL01hYywgKm5peAorCQl1bmxpbmsocGlwZW5hbWUuY19zdHIoKSk7CisjZW5kaWYKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUUGlwZVNlcnZlcihwaXBlbmFtZSwgMTAyNCwgTnVtVGhyZWFkcykpOyAvL05hbWVkIHBpcGUKKwkJUnVuVGhyaWZ0U2VydmVyPE15SGFuZGxlciwgTXlQcm9jZXNzb3I+KGhuZGxyLCBOdW1UaHJlYWRzLCB0cmFuc3BvcnQsIHN2cik7CisJfQorCisJLy8gVGhyaWZ0IHNlcnZlciB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIHBpcGUgbmFtZS4KKwkvLyBUaGlzIHZlcnNpb24gaW5zdGFudGlhdGVzIGl0cyBvd24gaGFuZGxlci4KKwl0ZW1wbGF0ZSA8Y2xhc3MgTXlIYW5kbGVyLCBjbGFzcyBNeVByb2Nlc3Nvcj4KKwl2b2lkIFJ1blRocmlmdFNlcnZlciAoaW50IE51bVRocmVhZHMsIHN0ZDo6c3RyaW5nIHBpcGVuYW1lKQorCXsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8TXlIYW5kbGVyPiBoYW5kbGVyKG5ldyBNeUhhbmRsZXIoKSk7CisJCWJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IHNlcnZlcjsKKworCQlSdW5UaHJpZnRTZXJ2ZXI8TXlIYW5kbGVyLCBNeVByb2Nlc3Nvcj4oaGFuZGxlciwgTnVtVGhyZWFkcywgcGlwZW5hbWUsIHNlcnZlcik7CisJfQorCisJLy8gVGhyaWZ0IHNlcnZlciB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIHNvY2tldCBwb3J0IG51bWJlci4KKwkvLyBBIGhhbmRsZXIgbXVzdCBiZSBwYXNzZWQgaW4gdG8gdGhpcyB2ZXJzaW9uLgorCXRlbXBsYXRlIDxjbGFzcyBNeUhhbmRsZXIsIGNsYXNzIE15UHJvY2Vzc29yPgorCXZvaWQgUnVuVGhyaWZ0U2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhuZGxyLCBpbnQgTnVtVGhyZWFkcywgaW50IFBvcnQpCisJeworCQlib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQoUG9ydCkpOworCQlib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPiBzZXJ2ZXI7CisJCVJ1blRocmlmdFNlcnZlcjxNeUhhbmRsZXIsIE15UHJvY2Vzc29yPihobmRsciwgTnVtVGhyZWFkcywgdHJhbnNwb3J0LCBzZXJ2ZXIpOworCX0KKworCS8vIFRocmlmdCBzZXJ2ZXIgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBzb2NrZXQgcG9ydCBudW1iZXIuCisJLy8gVGhpcyB2ZXJzaW9uIGluc3RhbnRpYXRlcyBpdHMgb3duIGhhbmRsZXIuCisJdGVtcGxhdGUgPGNsYXNzIE15SGFuZGxlciwgY2xhc3MgTXlQcm9jZXNzb3I+CisJdm9pZCBSdW5UaHJpZnRTZXJ2ZXIgKGludCBOdW1UaHJlYWRzLCBpbnQgUG9ydCkKKwl7CisJCWJvb3N0OjpzaGFyZWRfcHRyPE15SGFuZGxlcj4gaGFuZGxlcihuZXcgTXlIYW5kbGVyKCkpOworCisJCVJ1blRocmlmdFNlcnZlcjxNeUhhbmRsZXIsIE15UHJvY2Vzc29yPihoYW5kbGVyLCBOdW1UaHJlYWRzLCBQb3J0KTsKKwl9CisKKwkvLworCXRlbXBsYXRlIDxjbGFzcyBNeUhhbmRsZXIsIGNsYXNzIE15UHJvY2Vzc29yPgorCXZvaWQgUnVuVGhyaWZ0U2VydmVyIChib29zdDo6c2hhcmVkX3B0cjxNeUhhbmRsZXI+IGhuZGxyLCBpbnQgTnVtVGhyZWFkcywgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KQorCXsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4gc2VydmVyOworCQlSdW5UaHJpZnRTZXJ2ZXI8TXlIYW5kbGVyLCBNeVByb2Nlc3Nvcj4oaG5kbHIsIE51bVRocmVhZHMsIHRyYW5zcG9ydCwgc2VydmVyKTsKKwl9CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvL0Nvbm5lY3QgdG8gdGhyaWZ0ICdzZXJ2ZXInIC0gU29ja2V0IHZlcnNpb24KKwkvLyhib3RoIHNlcnZlciAmIGNsaWVudCBzaWRlIHJ1biBvbmUgZm9yIGJpZGlyIGV2ZW50IHNpZ25hbGluZykKKwkvLworCXRlbXBsYXRlIDxjbGFzcyBNeUNsaWVudCwgY2xhc3MgTXlUcmFuc3BvcnQ+CisJdm9pZCBDb25uZWN0VG9TZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15Q2xpZW50PiAmY2xpZW50LCBib29zdDo6c2hhcmVkX3B0cjxNeVRyYW5zcG9ydD4gJnRyYW5zcG9ydCwgaW50IFBvcnQpCisJeworCQkvL0NsaWVudCBzaWRlIGNvbm5lY3Rpb24gdXNpbmcgc29ja2V0cyB0cmFuc3BvcnQuCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgUG9ydCkpOworCQl0cmFuc3BvcnQucmVzZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworCisJCWNsaWVudC5yZXNldChuZXcgTXlDbGllbnQocHJvdG9jb2wpKTsKKwl9CisKKwkvL0Nvbm5lY3QgdG8gdGhyaWZ0ICdzZXJ2ZXInIC0gTmFtZWQgUGlwZSB2ZXJzaW9uCisJdGVtcGxhdGUgPGNsYXNzIE15Q2xpZW50LCBjbGFzcyBNeVRyYW5zcG9ydD4KKwl2b2lkIENvbm5lY3RUb1NlcnZlciAoYm9vc3Q6OnNoYXJlZF9wdHI8TXlDbGllbnQ+ICZjbGllbnQsIGJvb3N0OjpzaGFyZWRfcHRyPE15VHJhbnNwb3J0PiAmdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBwaXBlbmFtZSkKKwl7CisJCS8vQ2xpZW50IHNpZGUgY29ubmVjdGlvbiB1c2luZyBOYW1lZCBQaXBlIHRyYW5zcG9ydC4KKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcGlwZShuZXcgVFBpcGUocGlwZW5hbWUpKTsKKwkJdHJhbnNwb3J0LnJlc2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocGlwZSkpOworCQlib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisKKwkJY2xpZW50LnJlc2V0KG5ldyBNeUNsaWVudChwcm90b2NvbCkpOworCX0KKworCS8vQ29ubmVjdCB0byB0aHJpZnQgJ3NlcnZlcicgLSBBbm9ueW1vdXMgUGlwZSB2ZXJzaW9uCisJLy9DdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgdW5kZXIgV2luZG93cworI2lmZGVmIF9XSU4zMgorCXRlbXBsYXRlIDxjbGFzcyBNeUNsaWVudCwgY2xhc3MgTXlUcmFuc3BvcnQ+CisJdm9pZCBDb25uZWN0VG9TZXJ2ZXIgKGJvb3N0OjpzaGFyZWRfcHRyPE15Q2xpZW50PiAmY2xpZW50LCBib29zdDo6c2hhcmVkX3B0cjxNeVRyYW5zcG9ydD4gJnRyYW5zcG9ydCwgSEFORExFIFJkUGlwZSwgSEFORExFIFdydFBpcGUpCisJeworCQkvL0NsaWVudCBzaWRlIGNvbm5lY3Rpb24gdXNpbmcgc29ja2V0cyB0cmFuc3BvcnQuCisjaWZkZWYgX1dJTjMyCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHBpcGUobmV3IFRQaXBlKChpbnQpUmRQaXBlLCAoaW50KVdydFBpcGUpKTsKKwkJdHJhbnNwb3J0LnJlc2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocGlwZSkpOworI2Vsc2UKKwkJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiKSk7CisJCXRyYW5zcG9ydC5yZXNldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworI2VuZGlmCisJCWJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKworCQljbGllbnQucmVzZXQobmV3IE15Q2xpZW50KHByb3RvY29sKSk7CisJfQorI2VuZGlmCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvL0xhdW5jaCBjaGlsZCBwcm9jZXNzIGFuZCBwYXNzIFIvVyBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzIG9uIGNtZCBsaW5lLgorCS8vQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHVuZGVyIFdpbmRvd3MKKyNpZmRlZiBfV0lOMzIKKwlib29sIExhdW5jaEFub25QaXBlQ2hpbGQoc3RkOjpzdHJpbmcgYXBwLCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L1JlYWRNZS50eHQgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L1JlYWRNZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0OWE5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvUmVhZE1lLnR4dApAQCAtMCwwICsxLDQwIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBDT05TT0xFIEFQUExJQ0FUSU9OIDogY2xpZW50IFByb2plY3QgT3ZlcnZpZXcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBcHBXaXphcmQgaGFzIGNyZWF0ZWQgdGhpcyBjbGllbnQgYXBwbGljYXRpb24gZm9yIHlvdS4KKworVGhpcyBmaWxlIGNvbnRhaW5zIGEgc3VtbWFyeSBvZiB3aGF0IHlvdSB3aWxsIGZpbmQgaW4gZWFjaCBvZiB0aGUgZmlsZXMgdGhhdAorbWFrZSB1cCB5b3VyIGNsaWVudCBhcHBsaWNhdGlvbi4KKworCitjbGllbnQudmN4cHJvagorICAgIFRoaXMgaXMgdGhlIG1haW4gcHJvamVjdCBmaWxlIGZvciBWQysrIHByb2plY3RzIGdlbmVyYXRlZCB1c2luZyBhbiBBcHBsaWNhdGlvbiBXaXphcmQuCisgICAgSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnNpb24gb2YgVmlzdWFsIEMrKyB0aGF0IGdlbmVyYXRlZCB0aGUgZmlsZSwgYW5kCisgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBsYXRmb3JtcywgY29uZmlndXJhdGlvbnMsIGFuZCBwcm9qZWN0IGZlYXR1cmVzIHNlbGVjdGVkIHdpdGggdGhlCisgICAgQXBwbGljYXRpb24gV2l6YXJkLgorCitjbGllbnQudmN4cHJvai5maWx0ZXJzCisgICAgVGhpcyBpcyB0aGUgZmlsdGVycyBmaWxlIGZvciBWQysrIHByb2plY3RzIGdlbmVyYXRlZCB1c2luZyBhbiBBcHBsaWNhdGlvbiBXaXphcmQuIAorICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB5b3VyIHByb2plY3QgCisgICAgYW5kIHRoZSBmaWx0ZXJzLiBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgaW4gdGhlIElERSB0byBzaG93IGdyb3VwaW5nIG9mIGZpbGVzIHdpdGgKKyAgICBzaW1pbGFyIGV4dGVuc2lvbnMgdW5kZXIgYSBzcGVjaWZpYyBub2RlIChmb3IgZS5nLiAiLmNwcCIgZmlsZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAiU291cmNlIEZpbGVzIiBmaWx0ZXIpLgorCitjbGllbnQuY3BwCisgICAgVGhpcyBpcyB0aGUgbWFpbiBhcHBsaWNhdGlvbiBzb3VyY2UgZmlsZS4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK090aGVyIHN0YW5kYXJkIGZpbGVzOgorCitTdGRBZnguaCwgU3RkQWZ4LmNwcAorICAgIFRoZXNlIGZpbGVzIGFyZSB1c2VkIHRvIGJ1aWxkIGEgcHJlY29tcGlsZWQgaGVhZGVyIChQQ0gpIGZpbGUKKyAgICBuYW1lZCBjbGllbnQucGNoIGFuZCBhIHByZWNvbXBpbGVkIHR5cGVzIGZpbGUgbmFtZWQgU3RkQWZ4Lm9iai4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK090aGVyIG5vdGVzOgorCitBcHBXaXphcmQgdXNlcyAiVE9ETzoiIGNvbW1lbnRzIHRvIGluZGljYXRlIHBhcnRzIG9mIHRoZSBzb3VyY2UgY29kZSB5b3UKK3Nob3VsZCBhZGQgdG8gb3IgY3VzdG9taXplLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQuY3BwIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZmJlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8vIGNsaWVudC0+Y3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjb25zb2xlIGFwcGxpY2F0aW9uLgorLy8KKy8vIHNhbXBsZSBjbGllbnQgY29tbWFuZCBsaW5lIGFwcCB1c2luZyBUaHJpZnQgSVBDLgorLy8gUXVpY2sgbiBEaXJ0eSBleGFtcGxlLCBtYXkgbm90IGhhdmUgdmVyeSByb2J1c3QgZXJyb3IgaGFuZGxpbmcKKy8vIGZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LgorCisjaWZkZWYgX1dJTjMyCisjICBpbmNsdWRlICJzdGRhZnguaCIKKyNlbHNlCisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvL0luY2x1ZGUgdGhpcyBiZWZvcmUgdGhlIGdlbmVyYXRlZCBpbmNsdWRlcworI2luY2x1ZGUgIlRocmlmdENvbW1vbi5oIgorLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vVGFpbG9yIHRoZXNlIHRvIHlvdXIgZ2VuZXJhdGVkIGZpbGVzCisjaW5jbHVkZSAiLi4vZ2VuLWNwcC9TYW1wbGVTZXJ2aWNlLmgiCisjaW5jbHVkZSAiLi4vZ2VuLWNwcC9TYW1wbGVDYWxsYmFjay5oIgorCit1c2luZyBuYW1lc3BhY2UgU2FtcGxlOyAvL2RlY2xhcmVkIGluIC50aHJpZnQgZmlsZQorLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKwordm9pZCBDbGllbnRMaXN0ZW5lclRocmVhZFByb2MoKTsKK2Jvb2wgYlNvY2tldCA9IGZhbHNlOworYm9vbCBiQW5vblBpcGUgPSBmYWxzZTsKK2ludCBzcnZQb3J0Oworc3RkOjpzdHJpbmcgcGlwZW5hbWU7CitzdGQ6OnN0cmluZyBwaXBlbmFtZV9jbGllbnQ7CisjaWZkZWYgX1dJTjMyCisgSEFORExFIGhDb25zb2xlOworI2VuZGlmCisKKy8vQ3VzdG9taXplZCB2ZXJzaW9uIG9mIHByaW50ZiB0aGF0IGNoYW5nZXMgdGhlIHRleHQgY29sb3IKKy8vVGhpcyBkZXBlbmRzIG9uIGhDb25zb2xlIGdsb2JhbCBiZWluZyBpbml0aWFsaXplZAordm9pZCBobHByaW50Zihjb25zdCBjaGFyKiBfRm9ybWF0LCAuLi4pCit7CisjaWZkZWYgX1dJTjMyCisJU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoaENvbnNvbGUsIDB4RSk7CisjZW5kaWYKKwl2YV9saXN0IGFwOworCWludCByOworCXZhX3N0YXJ0IChhcCwgX0Zvcm1hdCk7CisJciA9IHZwcmludGYgKF9Gb3JtYXQsIGFwKTsKKwl2YV9lbmQgKGFwKTsKKyNpZmRlZiBfV0lOMzIKKwlTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShoQ29uc29sZSwgNyk7CisjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xpZW50LXNpZGUgUlBDIGltcGxlbWVudGF0aW9uczogQ2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudCBmb3IgCisvLyBiaWRpcmVjdGlvbmFsIGV2ZW50aW5nLgorLy8KK2NsYXNzIFNhbXBsZUNhbGxiYWNrSGFuZGxlciA6IHZpcnR1YWwgcHVibGljIFNhbXBsZUNhbGxiYWNrSWYgeworIHB1YmxpYzoKKyAgU2FtcGxlQ2FsbGJhY2tIYW5kbGVyKCkgeworICAgIC8vIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZQorICB9CisKKyAgdm9pZCBwaW5nY2xpZW50KCkKKyAgeworICAgIGhscHJpbnRmKCI8PDxQaW5nIHJlY2VpdmVkIGZyb20gc2VydmVyIChzZXJ2ZXItdG8tY2xpZW50IGV2ZW50KS5cbiIpOworICB9CisKK307CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworI2lmZGVmIF9XSU4zMgoraW50IF90bWFpbihpbnQgYXJnYywgX1RDSEFSKiBhcmd2W10pCisjZWxzZQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorI2VuZGlmCit7CisJLy9Qcm9jZXNzIGNtZCBsaW5lIGFyZ3MgdG8gZGV0ZXJtaW5lIG5hbWVkIHZzIGFub24gcGlwZXMuCisJYm9vbCB1c2FnZSA9IGZhbHNlOworI2lmZGVmIF9XSU4zMgorCUhBTkRMRSBSZWFkUGlwZSwgV3JpdGVQaXBlOworCWhDb25zb2xlID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKyNlbmRpZgorCisJLy9Qcm9jZXNzIGNvbW1hbmQgbGluZSBwYXJhbXMKKwlpZihhcmdjID4gMSkKKwl7CisJCWlmKF90Y3NjbXAoYXJndlsxXSwgVEVYVCgiLXNwIikpID09IDApCisJCXsJLy9Tb2NrZXQgUG9ydCBzcGVjaWZpZWQKKwkJCXNydlBvcnQgPSBfdHN0b2koYXJndlsyXSk7CisJCQliU29ja2V0ID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmKF90Y3NjbXAoYXJndlsxXSwgVEVYVCgiLW5wIikpID09IDApCisJCXsJLy9OYW1lZCBQaXBlIHNwZWNpZmllZAorI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nIHdwaXBlKGFyZ3ZbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgcGlwZW5hbWUucmVzaXplKHdwaXBlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29weSh3cGlwZS5iZWdpbigpLCB3cGlwZS5lbmQoKSwgcGlwZW5hbWUuYmVnaW4oKSk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGlwZW5hbWUgPSBhcmd2WzJdOworI2VuZGlmCisJCQlwaXBlbmFtZV9jbGllbnQgPSBwaXBlbmFtZSArICJfY2xpZW50IjsKKwkJfQorCQllbHNlIGlmKGFyZ2MgPT0gMykKKwkJewkvL0Fub255bW91cyBQaXBlIHNwZWNpZmllZAorI2lmZGVmIF9XSU4zMgorCQkJUmVhZFBpcGUgID0gKEhBTkRMRSlfdHN0b2koYXJndlsxXSk7CisJCQlXcml0ZVBpcGUgPSAoSEFORExFKV90c3RvaShhcmd2WzJdKTsKKwkJCWJBbm9uUGlwZSA9IHRydWU7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJBbm9ueW1vdXMgcGlwZXMgbm90ICh5ZXQpIHN1cHBvcnRlZCB1bmRlciAqTklYXG4iKTsKKyNlbmRpZgorCQl9CisJCWVsc2UKKwkJCXVzYWdlID0gdHJ1ZTsKKwl9CisJZWxzZQorCQl1c2FnZSA9IHRydWU7CisKKwlpZih1c2FnZSkKKwl7CisJCWhscHJpbnRmKCJUaHJpZnQgc2FtcGxlIGNsaWVudCB1c2FnZTpcblxuIik7CisJCWhscHJpbnRmKCJTb2NrZXQgUG9ydCB0byBjb25uZWN0IHRvOiAtc3AgPHBvcnQjPlxuIik7CisJCWhscHJpbnRmKCJOYW1lZCBQaXBlIHRvIGNvbm5lY3QgdG86ICAtbnAgPHBpcGVuYW1lPiAoZS5nLiBhZmZwaXBlKVxuIik7CisJCWhscHJpbnRmKCJBbm9ueW1vdXMgUGlwZSAobXVzdCBiZSBsYXVuY2hlZCBieSBhbm9uIHBpcGUgY3JlYXRvcik6XG4iKTsKKwkJaGxwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFkIEhhbmRsZT4gPFdyaXRlIEhhbmRsZT5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvL0NsaWVudCBzaWRlIGNvbm5lY3Rpb24gdG8gc2VydmVyLgorCWJvb3N0OjpzaGFyZWRfcHRyPFNhbXBsZVNlcnZpY2VDbGllbnQ+IGNsaWVudDsgLy9DbGllbnQgY2xhc3MgZnJvbSBUaHJpZnQtZ2VuZXJhdGVkIGNvZGUuCisJYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCisJaWYoYlNvY2tldCkKKwl7CS8vU29ja2V0IHRyYW5zcG9ydAorI2lmZGVmIF9XSU4zMgorCQlUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKKwkJaGxwcmludGYoIlVzaW5nIHNvY2tldCB0cmFuc3BvcnQgcG9ydCAlZFxuIiwgc3J2UG9ydCk7CisJCXRocmlmdGNvbW1vbjo6Q29ubmVjdFRvU2VydmVyPFNhbXBsZVNlcnZpY2VDbGllbnQsIFRUcmFuc3BvcnQ+KGNsaWVudCwgdHJhbnNwb3J0LCBzcnZQb3J0KTsKKwl9CisJZWxzZSBpZighYkFub25QaXBlKQorCXsKKwkJaGxwcmludGYoIlVzaW5nIE5hbWVkIFBpcGUgJXNcbiIsIHBpcGVuYW1lLmNfc3RyKCkpOworCQl0aHJpZnRjb21tb246OkNvbm5lY3RUb1NlcnZlcjxTYW1wbGVTZXJ2aWNlQ2xpZW50LCBUVHJhbnNwb3J0PihjbGllbnQsIHRyYW5zcG9ydCwgcGlwZW5hbWUpOworCX0KKwllbHNlCisJeworI2lmZGVmIF9XSU4zMgorCQlobHByaW50ZigiVXNpbmcgQW5vbnltb3VzIFBpcGUgdHJhbnNwb3J0XG4iKTsKKwkJdGhyaWZ0Y29tbW9uOjpDb25uZWN0VG9TZXJ2ZXI8U2FtcGxlU2VydmljZUNsaWVudCwgVFRyYW5zcG9ydD4oY2xpZW50LCB0cmFuc3BvcnQsIFJlYWRQaXBlLCBXcml0ZVBpcGUpOworI2VuZGlmCisJfQorCisjaWZkZWYgX1dJTjMyCisJLy9TdGFydCBhIHRocmVhZCB0byByZWNlaXZlIGluYm91bmQgY29ubmVjdGlvbiBmcm9tIHNlcnZlciBmb3IgMi13YXkgZXZlbnQgc2lnbmFsaW5nLgorCWJvb3N0Ojp0aHJlYWQgQ2xpZW50TGlzdGVuZXJUaHJlYWQoQ2xpZW50TGlzdGVuZXJUaHJlYWRQcm9jKTsKKyNlbmRpZgorCisJdHJ5IHsKKwkJdHJhbnNwb3J0LT5vcGVuKCk7CisKKwkJLy9Ob3RpZnkgc2VydmVyIHdoYXQgdG8gY29ubmVjdCBiYWNrIG9uLgorCQlpZihiU29ja2V0KQorCQkJY2xpZW50LT5DbGllbnRTaWRlTGlzdGVuUG9ydChzcnZQb3J0ICsgMSk7IC8vU29ja2V0CisJCWVsc2UgaWYoIWJBbm9uUGlwZSkKKwkJCWNsaWVudC0+Q2xpZW50U2lkZVBpcGVOYW1lKHBpcGVuYW1lX2NsaWVudCk7IC8vTmFtZWQgUGlwZQorCisJCS8vUnVuIHNvbWUgbW9yZSBSUENzCisJCXN0ZDo6c3RyaW5nIGhlbGxvc3RyID0gIkhlbGxvIGhvdyBhcmUgeW91PyI7CisJCXN0ZDo6c3RyaW5nIHJldHVybnN0cjsKKwkJY2xpZW50LT5IZWxsb1RoZXJlKHJldHVybnN0ciwgaGVsbG9zdHIpOworCQlobHByaW50ZigiXG4+Pj5TZW50OiAlc1xuIiwgaGVsbG9zdHIuY19zdHIoKSk7CisJCWhscHJpbnRmKCI8PDxSZWNlaXZlZDogJXNcbiIsIHJldHVybnN0ci5jX3N0cigpKTsKKworCQlobHByaW50ZigiXG4+Pj5DYWxsaW5nIFNlcnZlckRvU29tZXRoaW5nKCkgd2hpY2ggZGVsYXlzIGZvciA1IHNlY29uZHMuXG4iKTsKKwkJY2xpZW50LT5TZXJ2ZXJEb1NvbWV0aGluZygpOworCQlobHByaW50ZigiPj4+U2VydmVyRG9Tb21ldGhpbmcoKSBkb25lLlxuXG4iKTsKKworCQl0cmFuc3BvcnQtPmNsb3NlKCk7CisJfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKKwkJaGxwcmludGYoIkVSUk9SOiAlc1xuIiwgdHgud2hhdCgpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvL1RocmVhZCBSb3V0aW5lCit2b2lkIENsaWVudExpc3RlbmVyVGhyZWFkUHJvYygpCit7CisJaWYoYlNvY2tldCkKKwkJdGhyaWZ0Y29tbW9uOjpSdW5UaHJpZnRTZXJ2ZXI8U2FtcGxlQ2FsbGJhY2tIYW5kbGVyLCBTYW1wbGVDYWxsYmFja1Byb2Nlc3Nvcj4oMSwgc3J2UG9ydCArIDEpOworCWVsc2UgaWYoIWJBbm9uUGlwZSkKKwkJdGhyaWZ0Y29tbW9uOjpSdW5UaHJpZnRTZXJ2ZXI8U2FtcGxlQ2FsbGJhY2tIYW5kbGVyLCBTYW1wbGVDYWxsYmFja1Byb2Nlc3Nvcj4oMSwgcGlwZW5hbWVfY2xpZW50KTsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvY2xpZW50LnZjeHByb2ogYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OWMzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qCkBAIC0wLDAgKzEsMTA1IEBACis/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+CisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57ODVGQkZCNTQtNTMwQi00OThGLTlGMzgtNDRCQTIwNEZBRTZBfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPmNsaWVudDwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD50cnVlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPExpbmtJbmNyZW1lbnRhbD5mYWxzZTwvTGlua0luY3JlbWVudGFsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9ib29zdDsuLi8uLi8uLi8uLi9ib29zdC9ib29zdC90cjE7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4uLi8uLi8uLi9saWIvY3BwLyQoQ29uZmlndXJhdGlvbik7Li4vLi4vLi4vLi4vQm9vc3QvbGliOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJ0aHJpZnQubGliO3dzMl8zMi5saWI7a2VybmVsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO3dpbnNwb29sLmxpYjtjb21kbGczMi5saWI7YWR2YXBpMzIubGliO3NoZWxsMzIubGliO29sZTMyLmxpYjtvbGVhdXQzMi5saWI7dXVpZC5saWI7b2RiYzMyLmxpYjtvZGJjY3AzMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9ib29zdDsuLi8uLi8uLi8uLi9ib29zdC9ib29zdC90cjE7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4uLi8uLi8uLi9saWIvY3BwLyQoQ29uZmlndXJhdGlvbik7Li4vLi4vLi4vLi4vQm9vc3QvbGliOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJ0aHJpZnQubGliO3dzMl8zMi5saWI7a2VybmVsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO3dpbnNwb29sLmxpYjtjb21kbGczMi5saWI7YWR2YXBpMzIubGliO3NoZWxsMzIubGliO29sZTMyLmxpYjtvbGVhdXQzMi5saWI7dXVpZC5saWI7b2RiYzMyLmxpYjtvZGJjY3AzMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJSZWFkTWUudHh0IiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3RkYWZ4LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0YXJnZXR2ZXIuaCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxUaHJpZnRDb21tb24uY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX3R5cGVzLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImNsaWVudC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzdGRhZnguY3BwIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4KKyAgPC9JbXBvcnRHcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qLmZpbHRlcnMgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L2NsaWVudC52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjN2JkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvY2xpZW50LnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDY2IEBACis/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214PC9FeHRlbnNpb25zPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM7eHNkPC9FeHRlbnNpb25zPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iUmVzb3VyY2UgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgICA8RXh0ZW5zaW9ucz5yYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeDt0aWZmO3RpZjtwbmc7d2F2O21mY3JpYmJvbi1tczwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlc1xnZW4tY3BwIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsxMjY1YjNkYy05MWRlLTQxNmYtYWJhNi03Yjc1MGRlNDIyMWV9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJSZWFkTWUudHh0IiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InN0ZGFmeC5oIj4KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJ0YXJnZXR2ZXIuaCI+CisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuaCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuaCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV9jb25zdGFudHMuaCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InN0ZGFmeC5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9ImNsaWVudC5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlU2VydmljZS5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cVGhyaWZ0Q29tbW9uLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmNwcCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvc3RkYWZ4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQxNTFlCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9zdGRhZnguY3BwCkBAIC0wLDAgKzEsOCBAQAorLy8gc3RkYWZ4LmNwcCA6IHNvdXJjZSBmaWxlIHRoYXQgaW5jbHVkZXMganVzdCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMKKy8vIGNsaWVudC5wY2ggd2lsbCBiZSB0aGUgcHJlLWNvbXBpbGVkIGhlYWRlcgorLy8gc3RkYWZ4Lm9iaiB3aWxsIGNvbnRhaW4gdGhlIHByZS1jb21waWxlZCB0eXBlIGluZm9ybWF0aW9uCisKKyNpbmNsdWRlICJzdGRhZnguaCIKKworLy8gVE9ETzogcmVmZXJlbmNlIGFueSBhZGRpdGlvbmFsIGhlYWRlcnMgeW91IG5lZWQgaW4gU1REQUZYLkgKKy8vIGFuZCBub3QgaW4gdGhpcyBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3N0ZGFmeC5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9zdGRhZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDA1YTgzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL2NsaWVudC9zdGRhZnguaApAQCAtMCwwICsxLDE1IEBACisvLyBzdGRhZnguaCA6IGluY2x1ZGUgZmlsZSBmb3Igc3RhbmRhcmQgc3lzdGVtIGluY2x1ZGUgZmlsZXMsCisvLyBvciBwcm9qZWN0IHNwZWNpZmljIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgdXNlZCBmcmVxdWVudGx5LCBidXQKKy8vIGFyZSBjaGFuZ2VkIGluZnJlcXVlbnRseQorLy8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJ0YXJnZXR2ZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGNoYXIuaD4KKworCisKKy8vIFRPRE86IHJlZmVyZW5jZSBhZGRpdGlvbmFsIGhlYWRlcnMgeW91ciBwcm9ncmFtIHJlcXVpcmVzIGhlcmUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jbGllbnQvdGFyZ2V0dmVyLmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3RhcmdldHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzAwODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY2xpZW50L3RhcmdldHZlci5oCkBAIC0wLDAgKzEsOCBAQAorI3ByYWdtYSBvbmNlCisKKy8vIEluY2x1ZGluZyBTREtEREtWZXIuaCBkZWZpbmVzIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBXaW5kb3dzIHBsYXRmb3JtLgorCisvLyBJZiB5b3Ugd2lzaCB0byBidWlsZCB5b3VyIGFwcGxpY2F0aW9uIGZvciBhIHByZXZpb3VzIFdpbmRvd3MgcGxhdGZvcm0sIGluY2x1ZGUgV2luU0RLVmVyLmggYW5kCisvLyBzZXQgdGhlIF9XSU4zMl9XSU5OVCBtYWNybyB0byB0aGUgcGxhdGZvcm0geW91IHdpc2ggdG8gc3VwcG9ydCBiZWZvcmUgaW5jbHVkaW5nIFNES0RES1Zlci5oLgorCisjaW5jbHVkZSA8U0RLRERLVmVyLmg+CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY29uZmlnLmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwZDc4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9jb25maWcuaApAQCAtMCwwICsxLDI0IEBACisvL01pc3NpbmcgZGVmaW5pdGlvbnMgZm9yICpOSVggc3lzdGVtcy4gVGhpcyBzYW1wbGUgcHJvamVjdAorLy93YXMgaW5pdGlhbGx5IGNyZWF0ZWQgb24gV2luZG93cy4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIFRFWFQoc3RyKSBzdHIKKworaW5saW5lIGludCBTbGVlcChpbnQgbXMpCit7CisJcmV0dXJuIHNsZWVwKG1zLzEwMDApOyAvL3NsZWVwKCkgcGFyYW0gaXMgaW4gc2Vjb25kcworfQorCitpbmxpbmUgaW50IF90Y3NjbXAoY29uc3QgY2hhciogc3RyMSwgY29uc3QgY2hhciogc3RyMikKK3sKKwlyZXR1cm4gc3RyY21wKHN0cjEsIHN0cjIpOworfQorCitpbmxpbmUgaW50IF90c3RvaShjb25zdCBjaGFyKiBzdHIpCit7CisJcmV0dXJuIGF0b2koc3RyKTsKK30KKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9SZWFkTWUudHh0IGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9SZWFkTWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzBlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL1JlYWRNZS50eHQKQEAgLTAsMCArMSw0MCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgQ09OU09MRSBBUFBMSUNBVElPTiA6IHNlcnZlciBQcm9qZWN0IE92ZXJ2aWV3Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXBwV2l6YXJkIGhhcyBjcmVhdGVkIHRoaXMgc2VydmVyIGFwcGxpY2F0aW9uIGZvciB5b3UuCisKK1RoaXMgZmlsZSBjb250YWlucyBhIHN1bW1hcnkgb2Ygd2hhdCB5b3Ugd2lsbCBmaW5kIGluIGVhY2ggb2YgdGhlIGZpbGVzIHRoYXQKK21ha2UgdXAgeW91ciBzZXJ2ZXIgYXBwbGljYXRpb24uCisKKworc2VydmVyLnZjeHByb2oKKyAgICBUaGlzIGlzIHRoZSBtYWluIHByb2plY3QgZmlsZSBmb3IgVkMrKyBwcm9qZWN0cyBnZW5lcmF0ZWQgdXNpbmcgYW4gQXBwbGljYXRpb24gV2l6YXJkLgorICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mIFZpc3VhbCBDKysgdGhhdCBnZW5lcmF0ZWQgdGhlIGZpbGUsIGFuZAorICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF0Zm9ybXMsIGNvbmZpZ3VyYXRpb25zLCBhbmQgcHJvamVjdCBmZWF0dXJlcyBzZWxlY3RlZCB3aXRoIHRoZQorICAgIEFwcGxpY2F0aW9uIFdpemFyZC4KKworc2VydmVyLnZjeHByb2ouZmlsdGVycworICAgIFRoaXMgaXMgdGhlIGZpbHRlcnMgZmlsZSBmb3IgVkMrKyBwcm9qZWN0cyBnZW5lcmF0ZWQgdXNpbmcgYW4gQXBwbGljYXRpb24gV2l6YXJkLiAKKyAgICBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZmlsZXMgaW4geW91ciBwcm9qZWN0IAorICAgIGFuZCB0aGUgZmlsdGVycy4gVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIGluIHRoZSBJREUgdG8gc2hvdyBncm91cGluZyBvZiBmaWxlcyB3aXRoCisgICAgc2ltaWxhciBleHRlbnNpb25zIHVuZGVyIGEgc3BlY2lmaWMgbm9kZSAoZm9yIGUuZy4gIi5jcHAiIGZpbGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgIlNvdXJjZSBGaWxlcyIgZmlsdGVyKS4KKworc2VydmVyLmNwcAorICAgIFRoaXMgaXMgdGhlIG1haW4gYXBwbGljYXRpb24gc291cmNlIGZpbGUuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitPdGhlciBzdGFuZGFyZCBmaWxlczoKKworU3RkQWZ4LmgsIFN0ZEFmeC5jcHAKKyAgICBUaGVzZSBmaWxlcyBhcmUgdXNlZCB0byBidWlsZCBhIHByZWNvbXBpbGVkIGhlYWRlciAoUENIKSBmaWxlCisgICAgbmFtZWQgc2VydmVyLnBjaCBhbmQgYSBwcmVjb21waWxlZCB0eXBlcyBmaWxlIG5hbWVkIFN0ZEFmeC5vYmouCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitPdGhlciBub3RlczoKKworQXBwV2l6YXJkIHVzZXMgIlRPRE86IiBjb21tZW50cyB0byBpbmRpY2F0ZSBwYXJ0cyBvZiB0aGUgc291cmNlIGNvZGUgeW91CitzaG91bGQgYWRkIHRvIG9yIGN1c3RvbWl6ZS4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLmNwcCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE4MzY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTY4IEBACisvLyBzZXJ2ZXIuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjb25zb2xlIGFwcGxpY2F0aW9uLgorLy8KKy8vIHNhbXBsZSBzZXJ2ZXIgY29tbWFuZCBsaW5lIGFwcCB1c2luZyBUaHJpZnQgSVBDLgorLy8KKy8vIFRoaXMgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBmdWxsIGR1cGxleCBSUEMuIFRoYXQgaXMsIGVhY2gKKy8vIHNpZGUgcnVucyBib3RoIGEgY2xpZW50IGFuZCBzZXJ2ZXIgdG8gZW5hYmxlIGJpZGlyZWN0aW9uYWwgZXZlbnQgCisvLyBzaWduYWxpbmcuCisvLworCisjaWZkZWYgX1dJTjMyCisjICBpbmNsdWRlICJzdGRhZnguaCIKKyNlbHNlCisjICBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy9JbmNsdWRlIHRoaXMgYmVmb3JlIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZXMKKyNpbmNsdWRlICJUaHJpZnRDb21tb24uaCIKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvL1RhaWxvciB0aGVzZSB0byB5b3VyIGdlbmVyYXRlZCBmaWxlcworI2luY2x1ZGUgIi4uL2dlbi1jcHAvU2FtcGxlU2VydmljZS5oIgorI2luY2x1ZGUgIi4uL2dlbi1jcHAvU2FtcGxlQ2FsbGJhY2suaCIKKwordXNpbmcgbmFtZXNwYWNlIFNhbXBsZTsgLy9kZWNsYXJlZCBpbiAudGhyaWZ0IGZpbGUKKy8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2ludDE2X3QgQ2xpZW50UG9ydF87CitzdGQ6OnN0cmluZyBDbGllbnRQaXBlTmFtZV87Cit2b2lkIFMyQ1RocmVhZFByb2MoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUlBDIGltcGxlbWVudGF0aW9ucworLy8KK2NsYXNzIFNhbXBsZVNlcnZpY2VIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgU2FtcGxlU2VydmljZUlmIHsKKyBwdWJsaWM6CisgIFNhbXBsZVNlcnZpY2VIYW5kbGVyKCkgeworICAgIC8vIFlvdXIgaW5pdGlhbGl6YXRpb24gZ29lcyBoZXJlCisgIH0KKworICB2b2lkIEhlbGxvVGhlcmUoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBIZWxsb1N0cmluZykgeworICAgIC8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlCisgICAgcHJpbnRmKCI8PDxIZWxsb1RoZXJlKCkgcmVjZWl2ZWQgc3RyaW5nOiAlc1xuIiwgSGVsbG9TdHJpbmcuY19zdHIoKSk7CisJX3JldHVybiA9ICJHb29kIHRoYW5rIHlvdS4iOworICB9CisKKyAgdm9pZCBTZXJ2ZXJEb1NvbWV0aGluZygpIHsKKyAgICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZQorICAgIHByaW50ZigiU2VydmVyRG9Tb21ldGhpbmcoKTogU2ltdWxhdGluZyB3b3JrIGZvciA1IHNlY29uZHNcbiIpOworICAgIFNsZWVwKDUwMDApOworICAgIHByaW50ZigiU2VydmVyRG9Tb21ldGhpbmcoKTogRG9uZVxuIik7CisgIH0KKworICB2b2lkIENsaWVudFNpZGVMaXN0ZW5Qb3J0KGNvbnN0IGludDE2X3QgQ2xpZW50TGlzdGVuUG9ydCkKKyAgeworCUNsaWVudFBvcnRfID0gQ2xpZW50TGlzdGVuUG9ydDsKKwlDbGllbnRQaXBlTmFtZV8gPSAiIjsKKyNpZmRlZiBfV0lOMzIKKwlwcmludGYoIj4+PkNvbm5lY3RpbmcgdG8gY2xpZW50IG9uIHBvcnQgJWRcbiIsIENsaWVudFBvcnRfKTsKKwlib29zdDo6dGhyZWFkIENvbm5lY3QyQ2xpZW50VGhyZWFkKFMyQ1RocmVhZFByb2MpOworI2VuZGlmCisgIH0KKworICB2b2lkIENsaWVudFNpZGVQaXBlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgQ2xpZW50UGlwZU5hbWUpCisgIHsKKwlDbGllbnRQaXBlTmFtZV8gPSBDbGllbnRQaXBlTmFtZTsKKwlDbGllbnRQb3J0XyA9IDA7CisjaWZkZWYgX1dJTjMyCisJcHJpbnRmKCI+Pj5Db25uZWN0aW5nIHRvIGNsaWVudCBwaXBlICVzXG4iLCBDbGllbnRQaXBlTmFtZV8uY19zdHIoKSk7CisJYm9vc3Q6OnRocmVhZCBDb25uZWN0MkNsaWVudFRocmVhZChTMkNUaHJlYWRQcm9jKTsKKyNlbmRpZgorICB9Cit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCitpbnQgX3RtYWluKGludCBhcmdjLCBfVENIQVIqIGFyZ3ZbXSkKKyNlbHNlCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisjZW5kaWYKK3sKKwlpbnQgcG9ydDsKKwlzdGQ6OnN0cmluZyBwaXBlbmFtZTsgLy9lLmcuICJhZmZwaXBlIgorCisJYm9vbCB1c2FnZSA9IGZhbHNlOworCisJLy9Qcm9jZXNzIGNvbW1hbmQgbGluZSBwYXJhbXMKKwlpZihhcmdjID4gMSkKKwl7CisJCWlmKF90Y3NjbXAoYXJndlsxXSwgVEVYVCgiLXNwIikpID09IDApCisJCXsJLy9Tb2NrZXQgUG9ydCBzcGVjaWZpZWQKKwkJCXBvcnQgPSBfdHN0b2koYXJndlsyXSk7CisjaWZkZWYgX1dJTjMyCisJCQlUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKKwkJCS8vIFN0YXJ0IHRoZSB0aHJpZnQgc2VydmVyIHdoaWNoIGlzIGEgYmxvY2tpbmcgY2FsbC4KKwkJCXRocmlmdGNvbW1vbjo6UnVuVGhyaWZ0U2VydmVyPFNhbXBsZVNlcnZpY2VIYW5kbGVyLCBTYW1wbGVTZXJ2aWNlUHJvY2Vzc29yPigxMCwgcG9ydCk7CisJCX0KKwkJZWxzZSBpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1ucCIpKSA9PSAwKQorCQl7CS8vTmFtZWQgUGlwZSBzcGVjaWZpZWQKKyNpZmRlZiBfV0lOMzIKKwkJCXN0ZDo6d3N0cmluZyB3cGlwZShhcmd2WzJdKTsKKwkJCXBpcGVuYW1lLnJlc2l6ZSh3cGlwZS5sZW5ndGgoKSk7CisJCQlzdGQ6OmNvcHkod3BpcGUuYmVnaW4oKSwgd3BpcGUuZW5kKCksIHBpcGVuYW1lLmJlZ2luKCkpOworI2Vsc2UKKwkJCXBpcGVuYW1lID0gYXJndlsyXTsKKyNlbmRpZgorCQkJcHJpbnRmKCJVc2luZyBOYW1lZCBQaXBlICVzXG4iLCBwaXBlbmFtZS5jX3N0cigpKTsKKworCQkJLy9UaHJpZnQgb3ZlciBOYW1lZCBQaXBlLgorCQkJdGhyaWZ0Y29tbW9uOjpSdW5UaHJpZnRTZXJ2ZXI8U2FtcGxlU2VydmljZUhhbmRsZXIsIFNhbXBsZVNlcnZpY2VQcm9jZXNzb3I+KDEwLCBwaXBlbmFtZSk7CisJCX0KKwkJZWxzZSBpZihfdGNzY21wKGFyZ3ZbMV0sIFRFWFQoIi1hcCIpKSA9PSAwKQorCQl7CS8vQW5vbnltb3VzIFBpcGUgc3BlY2lmaWVkCisJCQkvL1RoaXMgaXMgbW9yZSBpbnZvbHZlZCBiZWNhdXNlIHRoZSBjaGlsZCBuZWVkcyB0byBiZSBsYXVuY2hlZCAKKwkJCS8vYWZ0ZXIgdGhlIHRyYW5zcG9ydCBpcyBjcmVhdGVkIGJ1dCBiZWZvcmUgdGhlIGJsb2NraW5nIHNlcnZlciAKKwkJCS8vY2FsbC4KKyNpZmRlZiBfV0lOMzIKKwkJCWJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVFBpcGVTZXJ2ZXIoKSk7IC8vQW5vbnltb3VzIHBpcGUKKwkJCXRocmlmdGNvbW1vbjo6TGF1bmNoQW5vblBpcGVDaGlsZCgiLlxcY2xpZW50LmV4ZSIsIHRyYW5zcG9ydCk7CisJCQlib29zdDo6c2hhcmVkX3B0cjxTYW1wbGVTZXJ2aWNlSGFuZGxlcj4gaGFuZGxlcihuZXcgU2FtcGxlU2VydmljZUhhbmRsZXIoKSk7CisJCQl0aHJpZnRjb21tb246OlJ1blRocmlmdFNlcnZlcjxTYW1wbGVTZXJ2aWNlSGFuZGxlciwgU2FtcGxlU2VydmljZVByb2Nlc3Nvcj4oaGFuZGxlciwgMTAsIHRyYW5zcG9ydCk7CisjZWxzZQorCQkJcHJpbnRmKCJBbm9ueW1vdXMgcGlwZXMgbm90ICh5ZXQpIHN1cHBvcnRlZCB1bmRlciAqTklYXG4iKTsKKyNlbmRpZgorCQl9CisJCWVsc2UKKwkJCXVzYWdlID0gdHJ1ZTsKKwl9CisJZWxzZQorCQl1c2FnZSA9IHRydWU7CisKKwlpZih1c2FnZSkKKwl7CisJCXByaW50ZigiVGhyaWZ0IHNhbXBsZSBzZXJ2ZXIgdXNhZ2U6XG5cbiIpOworCQlwcmludGYoIlNvY2tldCBQb3J0IDogICAtc3AgPHBvcnQjPlxuIik7CisJCXByaW50ZigiTmFtZWQgUGlwZSA6ICAgIC1ucCA8cGlwZW5hbWU+IChlLmcuIGFmZnBpcGUpXG4iKTsKKwkJcHJpbnRmKCJBbm9ueW1vdXMgUGlwZTogLWFwXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLy9UaHJlYWQgUm91dGluZSB0aGF0IGNvbm5lY3RzIHRvIHRoZSAnY2xpZW50Jy4KK3ZvaWQgUzJDVGhyZWFkUHJvYygpCit7CisJLy9NYXN0ZXIgc2VydmVyJ3MgY29ubmVjdGlvbiB0byBjbGllbnQtc2lkZSdzIHNlcnZlci4KKwlib29zdDo6c2hhcmVkX3B0cjxTYW1wbGVDYWxsYmFja0NsaWVudD4gY2xpZW50c3J2OyAvL0NsaWVudCBjbGFzcyBmcm9tIFRocmlmdC1nZW5lcmF0ZWQgY29kZS4KKwlib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisJaWYoQ2xpZW50UG9ydF8gIT0gMCkKKwkJdGhyaWZ0Y29tbW9uOjpDb25uZWN0VG9TZXJ2ZXI8U2FtcGxlQ2FsbGJhY2tDbGllbnQsIFRUcmFuc3BvcnQ+KGNsaWVudHNydiwgdHJhbnNwb3J0LCBDbGllbnRQb3J0Xyk7CisJaWYoIUNsaWVudFBpcGVOYW1lXy5lbXB0eSgpKQorCQl0aHJpZnRjb21tb246OkNvbm5lY3RUb1NlcnZlcjxTYW1wbGVDYWxsYmFja0NsaWVudCwgVFRyYW5zcG9ydD4oY2xpZW50c3J2LCB0cmFuc3BvcnQsIENsaWVudFBpcGVOYW1lXyk7CisKKwl0cnkgeworCQl0cmFuc3BvcnQtPm9wZW4oKTsKKworCQljbGllbnRzcnYtPnBpbmdjbGllbnQoKTsKKwkJU2xlZXAoMTUwMCk7CisJCWNsaWVudHNydi0+cGluZ2NsaWVudCgpOworCQlTbGVlcCgxNTAwKTsKKwkJY2xpZW50c3J2LT5waW5nY2xpZW50KCk7CisKKwkJdHJhbnNwb3J0LT5jbG9zZSgpOworCX0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7CisJCXByaW50ZigiRVJST1I6ICVzXG4iLCB0eC53aGF0KCkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIudmN4cHJvaiBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzOWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc2VydmVyLnZjeHByb2oKQEAgLTAsMCArMSwxMDYgQEAKKz88P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CisgICAgPFByb2plY3RHdWlkPns3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9PC9Qcm9qZWN0R3VpZD4KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+CisgICAgPFJvb3ROYW1lc3BhY2U+c2VydmVyPC9Sb290TmFtZXNwYWNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8TGlua0luY3JlbWVudGFsPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li4vOy4uLy4uLy4uL2xpYi9jcHAvc3JjOy4uLy4uLy4uLy4uL0Jvb3N0LzsuLi8uLi8uLi8uLi9Cb29zdC9ib29zdC90cjE7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4uLi8uLi8uLi9saWIvY3BwLyQoQ29uZmlndXJhdGlvbik7Li4vLi4vLi4vLi4vQm9vc3QvbGliOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+CisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5saWJ0aHJpZnQubGliO3dzMl8zMi5saWI7a2VybmVsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliO3dpbnNwb29sLmxpYjtjb21kbGczMi5saWI7YWR2YXBpMzIubGliO3NoZWxsMzIubGliO29sZTMyLmxpYjtvbGVhdXQzMi5saWI7dXVpZC5saWI7b2RiYzMyLmxpYjtvZGJjY3AzMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uLzsuLi8uLi8uLi9saWIvY3BwL3NyYzsuLi8uLi8uLi8uLi9Cb29zdC87Li4vLi4vLi4vLi4vQm9vc3QvYm9vc3QvdHIxOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+Li4vLi4vLi4vbGliL2NwcC8kKENvbmZpZ3VyYXRpb24pOy4uLy4uLy4uLy4uL0Jvb3N0L2xpYjslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPgorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+bGlidGhyaWZ0LmxpYjt3czJfMzIubGliO2tlcm5lbDMyLmxpYjt1c2VyMzIubGliO2dkaTMyLmxpYjt3aW5zcG9vbC5saWI7Y29tZGxnMzIubGliO2FkdmFwaTMyLmxpYjtzaGVsbDMyLmxpYjtvbGUzMi5saWI7b2xlYXV0MzIubGliO3V1aWQubGliO29kYmMzMi5saWI7b2RiY2NwMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iUmVhZE1lLnR4dCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZUNhbGxiYWNrLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZVNlcnZpY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfdHlwZXMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InN0ZGFmeC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idGFyZ2V0dmVyLmgiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cVGhyaWZ0Q29tbW9uLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX2NvbnN0YW50cy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3RkYWZ4LmNwcCI+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkNyZWF0ZTwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Q3JlYXRlPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CisgIDwvSW1wb3J0R3JvdXA+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIudmN4cHJvai5maWx0ZXJzIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zZXJ2ZXIudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjZkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3NlcnZlci52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSw2NiBAQAorPzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7aW5jO3hzZDwvRXh0ZW5zaW9ucz4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgICAgPEV4dGVuc2lvbnM+cmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdjttZmNyaWJib24tbXM8L0V4dGVuc2lvbnM+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXNcZ2VuLWNwcCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZGFiNjZkYjgtYmM0NS00NTE4LWFhZDItN2E3NTY5NjIyNmUzfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iUmVhZE1lLnR4dCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzdGRhZnguaCI+CisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0idGFyZ2V0dmVyLmgiPgorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlX3R5cGVzLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVfY29uc3RhbnRzLmgiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVDYWxsYmFjay5oIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzdGRhZnguY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV90eXBlcy5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXNcZ2VuLWNwcDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNwcFxTYW1wbGVTZXJ2aWNlLmNwcCI+CisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlc1xnZW4tY3BwPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3BwXFNhbXBsZV9jb25zdGFudHMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jcHBcU2FtcGxlQ2FsbGJhY2suY3BwIj4KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzXGdlbi1jcHA8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFRocmlmdENvbW1vbi5jcHAiPgorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5jcHAgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3N0ZGFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1ZmY2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc3RkYWZ4LmNwcApAQCAtMCwwICsxLDggQEAKKy8vIHN0ZGFmeC5jcHAgOiBzb3VyY2UgZmlsZSB0aGF0IGluY2x1ZGVzIGp1c3QgdGhlIHN0YW5kYXJkIGluY2x1ZGVzCisvLyBzZXJ2ZXIucGNoIHdpbGwgYmUgdGhlIHByZS1jb21waWxlZCBoZWFkZXIKKy8vIHN0ZGFmeC5vYmogd2lsbCBjb250YWluIHRoZSBwcmUtY29tcGlsZWQgdHlwZSBpbmZvcm1hdGlvbgorCisjaW5jbHVkZSAic3RkYWZ4LmgiCisKKy8vIFRPRE86IHJlZmVyZW5jZSBhbnkgYWRkaXRpb25hbCBoZWFkZXJzIHlvdSBuZWVkIGluIFNUREFGWC5ICisvLyBhbmQgbm90IGluIHRoaXMgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci9zdGRhZnguaCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc3RkYWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwNWE4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9zZXJ2ZXIvc3RkYWZ4LmgKQEAgLTAsMCArMSwxNSBAQAorLy8gc3RkYWZ4LmggOiBpbmNsdWRlIGZpbGUgZm9yIHN0YW5kYXJkIHN5c3RlbSBpbmNsdWRlIGZpbGVzLAorLy8gb3IgcHJvamVjdCBzcGVjaWZpYyBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIHVzZWQgZnJlcXVlbnRseSwgYnV0CisvLyBhcmUgY2hhbmdlZCBpbmZyZXF1ZW50bHkKKy8vCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidGFyZ2V0dmVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRjaGFyLmg+CisKKworCisvLyBUT0RPOiByZWZlcmVuY2UgYWRkaXRpb25hbCBoZWFkZXJzIHlvdXIgcHJvZ3JhbSByZXF1aXJlcyBoZXJlCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvc2VydmVyL3RhcmdldHZlci5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci90YXJnZXR2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2MwMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3NlcnZlci90YXJnZXR2ZXIuaApAQCAtMCwwICsxLDggQEAKKyNwcmFnbWEgb25jZQorCisvLyBJbmNsdWRpbmcgU0RLRERLVmVyLmggZGVmaW5lcyB0aGUgaGlnaGVzdCBhdmFpbGFibGUgV2luZG93cyBwbGF0Zm9ybS4KKworLy8gSWYgeW91IHdpc2ggdG8gYnVpbGQgeW91ciBhcHBsaWNhdGlvbiBmb3IgYSBwcmV2aW91cyBXaW5kb3dzIHBsYXRmb3JtLCBpbmNsdWRlIFdpblNES1Zlci5oIGFuZAorLy8gc2V0IHRoZSBfV0lOMzJfV0lOTlQgbWFjcm8gdG8gdGhlIHBsYXRmb3JtIHlvdSB3aXNoIHRvIHN1cHBvcnQgYmVmb3JlIGluY2x1ZGluZyBTREtEREtWZXIuaC4KKworI2luY2x1ZGUgPFNES0RES1Zlci5oPgpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RocmlmdG1lLmJhdCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxZWY3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS90aHJpZnRtZS5iYXQKQEAgLTAsMCArMSBAQAordGhyaWZ0LmV4ZSAtLWdlbiBjcHAgU2FtcGxlLnRocmlmdApkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RocmlmdG1lLnNoIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RocmlmdG1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMThmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvdGhyaWZ0bWUuc2gKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL2Jhc2gKKworVEhSSUZUX0NPTVBJTEVSPS4vdGhyaWZ0CitPVVRQVVRfRk9MREVSPSRQV0QKKworaWYgWyAhIC1lICIke1RIUklGVF9DT01QSUxFUn0iIF0KK3RoZW4KKyAgIFRIUklGVF9DT01QSUxFUj10aHJpZnQKKyAgIGNvbW1hbmQgLXYgICR7VEhSSUZUX0NPTVBJTEVSfSA+L2Rldi9udWxsIDI+JjEKKyAgIGlmIFsgJD8gLWVxIDEgXTsgdGhlbgorICAgICAgZWNobworICAgICAgZWNobyAidGhyaWZ0IGNvbXBpbGVyIG5vdCBmb3VuZC4iCisgICAgICBlY2hvCisgICAgICBleGl0CisgICBmaQorZmkKKworJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCBTYW1wbGUudGhyaWZ0CisKK2VjaG8KK2VjaG8gIkZpbGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgaW4gZ2VuLWNwcC4iCisKK2V4aXQKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RyYW5zcG9ydC1zYW1wbGUuc2xuIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL3RyYW5zcG9ydC1zYW1wbGUuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZmExZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvdHJhbnNwb3J0LXNhbXBsZS5zbG4KQEAgLTAsMCArMSwyNiBAQAorPworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInNlcnZlciIsICJzZXJ2ZXJcc2VydmVyLnZjeHByb2oiLCAiezcyRkNBRjI5LTUwNkQtNDE2NC05RkE2LUY1NEM1QzI4RTc5RH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImNsaWVudCIsICJjbGllbnRcY2xpZW50LnZjeHByb2oiLCAiezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyCisJCXs3MkZDQUYyOS01MDZELTQxNjQtOUZBNi1GNTRDNUMyOEU3OUR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMgorCQl7NzJGQ0FGMjktNTA2RC00MTY0LTlGQTYtRjU0QzVDMjhFNzlEfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezcyRkNBRjI5LTUwNkQtNDE2NC05RkE2LUY1NEM1QzI4RTc5RH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7ODVGQkZCNTQtNTMwQi00OThGLTlGMzgtNDRCQTIwNEZBRTZBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7ODVGQkZCNTQtNTMwQi00OThGLTlGMzgtNDRCQTIwNEZBRTZBfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezg1RkJGQjU0LTUzMEItNDk4Ri05RjM4LTQ0QkEyMDRGQUU2QX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXs4NUZCRkI1NC01MzBCLTQ5OEYtOUYzOC00NEJBMjA0RkFFNkF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ODNmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1JFQURNRS5tZApAQCAtMCwwICsxLDYxIEBACitBcGFjaGUgVGhyaWZ0IENlbnRvcyA2LjUgVmFncmFudCBTdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGRpcmVjdG9yeSBpcyB0aGUgVmFncmFudCBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgQXBhY2hlIFRocmlmdCBydW5uaW5nIG9uIENlbnRvcyA2LjUuIFRoZSBWYWdyYW50ZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBjb25maWd1cmVzIGEgVmFncmFudCBwcm92aXNpb25lZCBWTSBsYXVuY2hlZCB1bmRlciBWaXJ0dWFsQm94LiBUbyB1c2UgdGhpcyBwcm9qZWN0IHlvdSBtdXN0IGhhdmUgYSByZWNlbnQgdmVyc2lvbiBvZiBWaXJ0dWFsQm94IGFuZCBWYWdyYW50IGluc3RhbGxlZCAoaW4gdGhhdCBvcmRlcikuIFRvIHJ1biB0aGUgVk0sIG9wZW4gYSBzaGVsbCwgY2xvbmUgQXBhY2hlIFRocmlmdCwgY2hhbmdlIHRvIHRoaXMgZGlyZWN0b3J5IGFuZCBlbnRlciB0aGUgVmFncmFudCB1cCBjb21tYW5kLgorCisgICAkIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorICAgJCBjZCB0aHJpZnQvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUKKyAgICQgdmFncmFudCB1cAorCitUaGlzIHdpbGwgZG93bmxvYWQgYW5kIGxhdW5jaCB0aGUgYmFzZSBib3ggVk0gdW5kZXIgVmlydHVhbEJveCBhbmQgcnVuIHRoZSBBcGFjaGUgVGhyaWZ0IHByb3Zpc2lvbmluZyBzY3JpcHQuIFRoaXMgd2lsbCB0YWtlIHVwIHRvIGFuIGhvdXIgZGVwZW5kaW5nIG9uIHlvdXIgaGFyZHdhcmUgYW5kIG5ldHdvcmsuIE9uY2UgY29tcGxldGUgeW91IGNhbiBsb2dpbiB0byB0aGUgYm94IHdpdGggVmFncmFudCBzc2guIFRoZSB0aHJpZnQgc291cmNlIHRyZWUgZnJvbSB5b3VyIGhvc3Qgb3MgaXMgbW91bnRlZCBhdCAvdGhyaWZ0LgorCisgICAkIHZhZ3JhbnQgc3NoCisgICBbdmFncmFudEB0aHJpZnQgfl0kIGNkIC90aHJpZnQKKyAgIFt2YWdyYW50QHRocmlmdCB0aHJpZnRdJCBjb21waWxlci9jcHAvdGhyaWZ0IC0tdmVyc2lvbgorICAgVGhyaWZ0IHZlcnNpb24gPHZlcnNpb24+CisKK1RoZSBwcm92aXNpb25pbmcgc2NyaXB0IChpbnNpZGUgdGhlIFZhZ3JhbnRmaWxlKSBydW5zIC4vYm9vdHN0cmFwLnNoLCAuL2NvbmZpZ3VyZSwgbWFrZSBhbmQgbWFrZSBjaGVjaywgYnV0IGRvZXMgbm90IGluc3RhbGwgdGhyaWZ0LiBUbyBpbnN0YWxsIHRocmlmdCBydW4gIm1ha2UgaW5zdGFsbCIuCisKK1RoZSBWYWdyYW50IGJhc2UgYm94IHVzZWQgaGVyZSBpcyBhIG1pbmltYWwgQ2VudG9zIDYuNSBWaXJ0dWFsQm94IHdpdGggMkdCIFJBTSBhbmQgMiBDUFVzLiBGb3IgbW9yZSBWYWdyYW50IGluZm9ybWF0aW9uOiBodHRwczovL3d3dy52YWdyYW50dXAuY29tLiBBIHN1bW1hcnkgb2YgdGhlIGJhc2UgYm94IHByZXBhcmF0aW9uIGZvbGxvd3M6CisKK3Jvb3QgcGFzc3dvcmQ6IHZhZ3JhbnQKKworI0NyZWF0ZSB0aGUgdmFncmFudCB1c2VyIGFuZCBnaXZlIGl0IHN1ZG8gcGVybWlzc2lvbgorYWRkdXNlciB2YWdyYW50CitwYXNzd2QgdmFncmFudAordmlzdWRvICA6ICB2YWdyYW50IEFMTD0oQUxMKSBOT1BBU1NXRDogQUxMCisgICAgICAgICAgICNEZWZhdWx0cyByZXF1aXJldHR5CisKKyNTaHV0IGRvd24gdGhlIGZpcmV3YWxsIGFuZCBkaXNhYmxlIGl0CitzZXJ2aWNlIGlwdGFibGVzIHN0b3AKK2Noa2NvbmZpZyBpcHRhYmxlcyBvZmYKKworI1NldHVwIHRoZSB2YWdyYW50IHNzaCBwdWJsaWMga2V5IHRvIGFsbG93IHZhZ3JhbnQgdG8gc3NoCitta2RpciAvaG9tZS92YWdyYW50Ly5zc2gKK2NobW9kIDcwMCAvaG9tZS92YWdyYW50Ly5zc2gKK2NkIC9ob21lL3ZhZ3JhbnQvLnNzaAord2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICdodHRwczovL3Jhdy5naXRodWIuY29tL21pdGNoZWxsaC92YWdyYW50L21hc3Rlci9rZXlzL3ZhZ3JhbnQucHViJyAtTyBhdXRob3JpemVkX2tleXMKK2NobW9kIDYwMCAvaG9tZS92YWdyYW50Ly5zc2gvYXV0aG9yaXplZF9rZXlzCitjaG93biAtUiB2YWdyYW50IC9ob21lL3ZhZ3JhbnQvLnNzaAorCisjSW5zdGFsbCBFUEVMIChFeHRyYSBQYWNrYWdlcyBmb3IgRW50ZXJwcmlzZSBMaW51eCkgYnV0IHByb3RlY3QgdGhlIGJhc2UKKyNyZXBvc2l0b3JpZXMgc28gdGhhdCBFUEVMIGRvZXMgbm90IG1hc2sgYmFzZSBwYWNrYWdlcworeXVtIC15IGluc3RhbGwgeXVtLXBsdWdpbi1wcm90ZWN0YmFzZQorcnBtIC1VdmggaHR0cDovL2Rvd25sb2FkLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsLzYvaTM4Ni9lcGVsLXJlbGVhc2UtNi04Lm5vYXJjaC5ycG0KKworI0luc3RhbGwgcGVybCwgZHluYW1pYyBrZXJuZWwgbW9kdWxlcywgZGV2IHRvb2xzIGFuZCBrZXJuZWwgaGVhZGVycyB0byBzdXBwb3J0CisjVmlydHVhbCBib3ggYWRkaXRpb25zCit5dW0gLXkgaW5zdGFsbCBwZXJsCit5dW0gLXkgLS1lbmFibGVyZXBvIGVwZWwgaW5zdGFsbCBka21zCit5dW0gLXkgZ3JvdXBpbnN0YWxsICJEZXZlbG9wbWVudCBUb29scyIKK3l1bSAteSBpbnN0YWxsIGtlcm5lbC1kZXZlbAorCisjVXBkYXRlIGV2ZXJ5dGhpbmcgYW5kIHJlYm9vdAoreXVtIHVwZGF0ZQorcmVib290CisKKyNJbnN0YWxsIHRoZSBWaXJ0dWFsQm94IEd1ZXN0IGFkZGl0aW9ucyAodXNpbmcgVmlydHVhbEJveCBpc28pCittb3VudCAvZGV2L2Nkcm9tIC9tbnQKKy9tbnQvVkJveExpbnV4QWRkaXRpb25zLnJ1bgordW1vdW50IC9tbnQKKworU2VlIHRoZSBWYWdyYW50ZmlsZSBmb3IgZnVydGhlciBkZXRhaWxzCmRpZmYgLS1naXQgYS9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9WYWdyYW50ZmlsZSBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTIyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9WYWdyYW50ZmlsZQpAQCAtMCwwICsxLDI3NCBAQAorIyAtKi0gbW9kZTogcnVieSAtKi0KKyMgdmk6IHNldCBmdD1ydWJ5IDoKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQVBBQ0hFIFRIUklGVCBQUk9WSVNJT05JTkcgU0NSSVBUCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYmFzZSBDZW50b3MgNi41CisjIFZhZ3JhbnQgYm94IGZvciBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBsaWIgYnVpbGRzLgorIyBUaGUgYmFzZSBib3ggaXMgQ2VudG9zIDYuNSB3aXRoIG5vIGFkZGl0aW9uYWwgcGFja2FnZXMKKyMgZXhjZXB0IHRob3NlIHJlcXVpcmVkIHRvIHN1cHBvcnQgVmlydHVhbEJveCBHdWVzdCB0b29sczoKKyMgcGVybCwgZGttcywga2VybmVsLWRldmVsIGFuZCB0aGUgIkRldmVsb3BtZW50IFRvb2xzIiBncm91cC4KKyMgVGhlIGVwZWwgcmVwbyB3YXMgYWxzbyBhZGRlZCBhbG9uZyB3aXRoIHRoZQorIyB5dW0tcGx1Z2luLXByb3RlY3RiYXNlIHBhY2thZ2UgdG8gcHJlZmVyIGJhc2UgcmVwbyBwYWNrYWdlcy4KKyMgVGhlIHNjcmlwdCBiZWxvdyBwcm92aXNpb25zIEFMTCBsYW5ndWFnZXMuIFRoaXMgd2lsbCB0YWtlCisjIHRpbWUuIFlvdSBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIGJ1aWxkIHRpbWUgYnkgY29tbWVudGluZworIyBvdXQgdGhlIExJQiBwcm92aXNpb25pbmcgZm9yIHVuZWVkZWQgbGFuZ3VhZ2UgbGlicmFyaWVzLgorIyBFeHBlY3QgZnVsbCBwcm92aXNpb25pbmcgdG8gdGFrZSAzMCBtaW51dGVzIG9uIGEgZmFzdAorIyBtYWNoaW5lIHdpdGggYW4gZXhjZWxsZW50IEludGVybmV0IGNvbm5lY3Rpb24gKGFuZCBhbm90aGVyCisjIDE1IG1pbnV0ZXMgZm9yIHRoZSBidWlsZCkuCisjCisjIE1hY2hpbmUgYWNjb3VudHM6CisjIC0gVXNlcjogdmFncmFudC92YWdyYW50CisjIC0gQWRtaW46IHJvb3QvdmFncmFudAorIyBWYWdyYW50IHB1YmxpYyBzc2gga2V5IGFsc28gaW5zdGFsbGVkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiskYnVpbGRfYW5kX3Rlc3QgPSA8PFNDUklQVAorZWNobyAiUHJvdmlzaW9uaW5nIHN5c3RlbSB0byBjb21waWxlIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQuIgorZGF0ZSA+IC9ldGMvdmFncmFudC5wcm92aXNpb25fYmVnaW4KKworIyBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGRlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjaW5zdGFsbCBhbiB1cGRhdGVkIGF1dG9jb25mCit3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b2NvbmYvYXV0b2NvbmYtMi42OS50YXIuZ3oKK3RhciB4dmYgYXV0b2NvbmYtMi42OS50YXIuZ3oKK2NkIGF1dG9jb25mLTIuNjkKKy4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKK21ha2UKK3N1ZG8gbWFrZSBpbnN0YWxsCitjZCAuLgorCisjaW5zdGFsbCBhbiB1cGRhdGVkIGF1dG9tYWtlCit3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b21ha2UvYXV0b21ha2UtMS4xNC50YXIuZ3oKK3RhciB4dmYgYXV0b21ha2UtMS4xNC50YXIuZ3oKK2NkIGF1dG9tYWtlLTEuMTQKKy4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKK21ha2UKK3N1ZG8gbWFrZSBpbnN0YWxsCitjZCAuLgorCisjaW5zdGFsbCBhbiB1cGRhdGVkIGJpc29uCit3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYmlzb24vYmlzb24tMi41LjEudGFyLmd6Cit0YXIgeHZmIGJpc29uLTIuNS4xLnRhci5negorY2QgYmlzb24tMi41LjEKKy4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKK21ha2UKK3N1ZG8gbWFrZSBpbnN0YWxsCitjZCAuLgorCisjIEMrKzk4IExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIC15IGluc3RhbGwgbGliZXZlbnQtZGV2ZWwgemxpYi1kZXZlbCBvcGVuc3NsLWRldmVsCisKKyNJbnN0YWxsIGFuIHVwZGF0ZWQgQm9vc3QgbGlicmFyeQord2dldCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Jvb3N0L2ZpbGVzL2Jvb3N0LzEuNTUuMC9ib29zdF8xXzU1XzAudGFyLmd6Cit0YXIgeHZmIGJvb3N0XzFfNTVfMC50YXIuZ3oKK2NkIGJvb3N0XzFfNTVfMAorLi9ib290c3RyYXAuc2gKK3N1ZG8gLi9iMiBpbnN0YWxsCisKKyMgSmF2YSBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGFudCBqdW5pdCBhbnQtbm9kZXBzIGFudC1qdW5pdCBqYXZhLTEuOC4wLW9wZW5qZGstZGV2ZWwKKworIyBQeXRob24gTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBweXRob24tZGV2ZWwgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXR3aXN0ZWQKKworIyBSdWJ5IExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcnVieSBydWJ5LWRldmVsIHJ1YnlnZW1zCitzdWRvIGdlbSBpbnN0YWxsIGJ1bmRsZXIgcmFrZQorCisjIE5vZGUuanMgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBub2RlanMgbm9kZWpzLWRldmVsIG5wbQorCisjIFBlcmwgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBwZXJsLUJpdC1WZWN0b3IgcGVybC1DbGFzcy1BY2Nlc3NvciBwZXJsLUV4dFV0aWxzLU1ha2VNYWtlciBwZXJsLVRlc3QtU2ltcGxlCisKKyMgUEhQIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcGhwIHBocC1kZXZlbCBwaHAtcGVhciByZTJjCisKKyMgR0xpYkMgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBnbGliMi1kZXZlbAorCisjIEVybGFuZyBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGVybGFuZy1rZXJuZWwgZXJsYW5nLWVydHMgZXJsYW5nLXN0ZGxpYiBlcmxhbmctZXVuaXQgZXJsYW5nLXJlYmFyCisKKyMgTHVhIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgbHVhLWRldmVsCisKKyMgR28gTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBnb2xhbmcgZ29sYW5nLXBrZy1saW51eC1hbWQ2NAorCisjIEMjIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgbW9uby1jb3JlIG1vbm8tZGV2ZWwgbW9uby13ZWItZGV2ZWwgbW9uby1leHRyYXMgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbWluZ3czMi1uc2lzCisKKyMgSGFza2VsbCBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit3Z2V0IGh0dHA6Ly9zaGVya2luLmp1c3RodWIub3JnL2VsNi9SUE1TL3g4Nl82NC9qdXN0aHViLXJlbGVhc2UtMi4wLTQuMC5lbDYueDg2XzY0LnJwbQorc3VkbyBycG0gLWl2aCBqdXN0aHViLXJlbGVhc2UtMi4wLTQuMC5lbDYueDg2XzY0LnJwbQorc3VkbyB5dW0gLXkgaW5zdGFsbCBoYXNrZWxsCitzdWRvIGNhYmFsIHVwZGF0ZQorc3VkbyBjYWJhbCBpbnN0YWxsIGNhYmFsLWluc3RhbGwKKworIyBCdWlsZCBhbmQgVGVzdCBBcGFjaGUgVGhyaWZ0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkYXRlID4gL2V0Yy92YWdyYW50LnByb3Zpc2lvbl9lbmQKK2VjaG8gIlN0YXJ0aW5nIEFwYWNoZSBUaHJpZnQgYnVpbGQuLi4iCitjZCAvdGhyaWZ0CitzaCBib290c3RyYXAuc2gKKworIyBBdCB0aGUgdGltZSBvZiB0aGlzIGZpbGUncyBjcmVhdGlvbiBSdWJ5LCBQeXRob24sIEdvIGFuZCBMdWEgZmFpbAorIyB0aGVpciB1bml0IHRlc3RzIGluIHRoaXMgZW52aXJvbm1lbnQuIFRvIGJ1aWxkIGFuZCB0ZXN0IGFueSBvZiB0aGVzZQorIyBsaWJyYXJpZXMgdW5jb21tZW50IHRoZSBhcHByb3ByaWF0ZSAtLXdpdGhvdXQgc3dpdGNoZXMgYmVsb3cuCisKK3NoIGNvbmZpZ3VyZSAtLXdpdGhvdXQtcnVieSAtLXdpdGhvdXQtZ28gLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtcHl0aG9uCittYWtlCitlY2hvICJTdGFydGluZyBBcGFjaGUgVGhyaWZ0IHRlc3RzLi4uIgorbWFrZSBjaGVjaworZWNobyAiRmluaXNoZWQgYnVpbGRpbmcgYW5kIHRlc3RpbmcgQXBhY2hlIFRocmlmdC4iCitlY2hvICdVc2UgIm1ha2UgaW5zdGFsbCIgdG8gaW5zdGFsbCB0aGUgY29tcGlsZXIgYW5kIGxpYnJhcmllcy4nCitkYXRlID4gL2V0Yy92YWdyYW50Lm1ha2VfZW5kCisKK1NDUklQVAorCitWYWdyYW50LmNvbmZpZ3VyZSgiMiIpIGRvIHxjb25maWd8CisgICMgRXZlcnkgVmFncmFudCB2aXJ0dWFsIGVudmlyb25tZW50IHJlcXVpcmVzIGEgYm94IHRvIGJ1aWxkIG9mZiBvZi4KKyAgIyMjIyMgQ2VudG9zIDYuNSBtaW5pbWFsIHN5c3RlbSB3aXRoIFZpcnR1YWxCb3ggR3Vlc3QgQWRkaXRpb25zCisgICMjIyMjIEJveCBtYWludGFpbmVkIGJ5IHJhQGFwYWNoZS5vcmcsIHNlZSBSRUFETUUubWQgZm9yIGJveCBjb25maWcKKyAgY29uZmlnLnZtLmJveCA9ICJSYW5keUFiZXJuZXRoeS90aHJpZnQtY2VudG9zLTYuNS02NCIKKworICAjIERpc2FibGUgYXV0b21hdGljIGJveCB1cGRhdGUgY2hlY2tpbmcuIElmIHlvdSBkaXNhYmxlIHRoaXMsIHRoZW4KKyAgIyBib3hlcyB3aWxsIG9ubHkgYmUgY2hlY2tlZCBmb3IgdXBkYXRlcyB3aGVuIHRoZSB1c2VyIHJ1bnMKKyAgIyBgdmFncmFudCBib3ggb3V0ZGF0ZWRgLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4KKyAgIyMjIyMgVGhpcyBib3ggd2lsbCBuZXZlciBjaGFuZ2UKKyAgY29uZmlnLnZtLmJveF9jaGVja191cGRhdGUgPSBmYWxzZQorCisgICMgQ3JlYXRlIGEgZm9yd2FyZGVkIHBvcnQgbWFwcGluZyB3aGljaCBhbGxvd3MgYWNjZXNzIHRvIGEgc3BlY2lmaWMgcG9ydAorICAjIHdpdGhpbiB0aGUgbWFjaGluZSBmcm9tIGEgcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lLiBJbiB0aGUgZXhhbXBsZSBiZWxvdywKKyAgIyBhY2Nlc3NpbmcgImxvY2FsaG9zdDo4MDgwIiB3aWxsIGFjY2VzcyBwb3J0IDgwIG9uIHRoZSBndWVzdCBtYWNoaW5lLgorICAjIGNvbmZpZy52bS5uZXR3b3JrICJmb3J3YXJkZWRfcG9ydCIsIGd1ZXN0OiA4MCwgaG9zdDogODA4MAorCisgICMgQ3JlYXRlIGEgcHJpdmF0ZSBuZXR3b3JrLCB3aGljaCBhbGxvd3MgaG9zdC1vbmx5IGFjY2VzcyB0byB0aGUgbWFjaGluZQorICAjIHVzaW5nIGEgc3BlY2lmaWMgSVAuCisgICMgY29uZmlnLnZtLm5ldHdvcmsgInByaXZhdGVfbmV0d29yayIsIGlwOiAiMTkyLjE2OC4zMy4xMCIKKworICAjIENyZWF0ZSBhIHB1YmxpYyBuZXR3b3JrLCB3aGljaCBnZW5lcmFsbHkgbWF0Y2hlZCB0byBicmlkZ2VkIG5ldHdvcmsuCisgICMgQnJpZGdlZCBuZXR3b3JrcyBtYWtlIHRoZSBtYWNoaW5lIGFwcGVhciBhcyBhbm90aGVyIHBoeXNpY2FsIGRldmljZSBvbgorICAjIHlvdXIgbmV0d29yay4KKyAgIyBjb25maWcudm0ubmV0d29yayAicHVibGljX25ldHdvcmsiCisKKyAgIyBJZiB0cnVlLCB0aGVuIGFueSBTU0ggY29ubmVjdGlvbnMgbWFkZSB3aWxsIGVuYWJsZSBhZ2VudCBmb3J3YXJkaW5nLgorICAjIERlZmF1bHQgdmFsdWU6IGZhbHNlCisgICMgY29uZmlnLnNzaC5mb3J3YXJkX2FnZW50ID0gdHJ1ZQorCisgICMgU2hhcmUgYW4gYWRkaXRpb25hbCBmb2xkZXIgdG8gdGhlIGd1ZXN0IFZNLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMKKyAgIyB0aGUgcGF0aCBvbiB0aGUgaG9zdCB0byB0aGUgYWN0dWFsIGZvbGRlci4gVGhlIHNlY29uZCBhcmd1bWVudCBpcworICAjIHRoZSBwYXRoIG9uIHRoZSBndWVzdCB0byBtb3VudCB0aGUgZm9sZGVyLiBBbmQgdGhlIG9wdGlvbmFsIHRoaXJkCisgICMgYXJndW1lbnQgaXMgYSBzZXQgb2Ygbm9uLXJlcXVpcmVkIG9wdGlvbnMuCisgICMgY29uZmlnLnZtLnN5bmNlZF9mb2xkZXIgIi4uL2RhdGEiLCAiL3ZhZ3JhbnRfZGF0YSIKKyAgIyMjIyMgQnkgY29udmVudGlvbiB0aGUgdGhyaWZ0IHNvdXJjZSB0cmVlIGlzIG1hcHBlZCB0byAvdGhyaWZ0CisgIGNvbmZpZy52bS5zeW5jZWRfZm9sZGVyICIuLi8uLi8uLi8iLCAiL3RocmlmdCIKKworICAjIFByb3ZpZGVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc28geW91IGNhbiBmaW5lLXR1bmUgdmFyaW91cworICAjIGJhY2tpbmcgcHJvdmlkZXJzIGZvciBWYWdyYW50LiBUaGVzZSBleHBvc2UgcHJvdmlkZXItc3BlY2lmaWMgb3B0aW9ucy4KKyAgIyMjIyMgVGhlIG1hY2hpbmUgbmVlZHMgMiBDUFVzIGFuZCAyR0IgUkFNIGZvciByZWFzb25hYmxlIHBlcmZvcm1hbmNlCisgIGNvbmZpZy52bS5wcm92aWRlciAidmlydHVhbGJveCIgZG8gfHZifAorICAgIHZiLmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMjA0OCJdCisgICAgdmIuY3VzdG9taXplIFsibW9kaWZ5dm0iLCA6aWQsICItLWNwdXMiLCAiMiJdCisgIGVuZAorCisgICMgRW5hYmxlIHByb3Zpc2lvbmluZyB3aXRoIENGRW5naW5lLiBDRkVuZ2luZSBDb21tdW5pdHkgcGFja2FnZXMgYXJlCisgICMgYXV0b21hdGljYWxseSBpbnN0YWxsZWQuIEZvciBleGFtcGxlLCBjb25maWd1cmUgdGhlIGhvc3QgYXMgYQorICAjIHBvbGljeSBzZXJ2ZXIgYW5kIG9wdGlvbmFsbHkgYSBwb2xpY3kgZmlsZSB0byBydW46CisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJjZmVuZ2luZSIgZG8gfGNmfAorICAjICAgY2YuYW1fcG9saWN5X2h1YiA9IHRydWUKKyAgIyAgICMgY2YucnVuX2ZpbGUgPSAibW90ZC5jZiIKKyAgIyBlbmQKKyAgIworICAjIFlvdSBjYW4gYWxzbyBjb25maWd1cmUgYW5kIGJvb3RzdHJhcCBhIGNsaWVudCB0byBhbiBleGlzdGluZworICAjIHBvbGljeSBzZXJ2ZXI6CisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJjZmVuZ2luZSIgZG8gfGNmfAorICAjICAgY2YucG9saWN5X3NlcnZlcl9hZGRyZXNzID0gIjEwLjAuMi4xNSIKKyAgIyBlbmQKKworICAjIEVuYWJsZSBwcm92aXNpb25pbmcgd2l0aCBQdXBwZXQgc3RhbmQgYWxvbmUuICBQdXBwZXQgbWFuaWZlc3RzCisgICMgYXJlIGNvbnRhaW5lZCBpbiBhIGRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIHRoaXMgVmFncmFudGZpbGUuCisgICMgWW91IHdpbGwgbmVlZCB0byBjcmVhdGUgdGhlIG1hbmlmZXN0cyBkaXJlY3RvcnkgYW5kIGEgbWFuaWZlc3QgaW4KKyAgIyB0aGUgZmlsZSBkZWZhdWx0LnBwIGluIHRoZSBtYW5pZmVzdHNfcGF0aCBkaXJlY3RvcnkuCisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJwdXBwZXQiIGRvIHxwdXBwZXR8CisgICMgICBwdXBwZXQubWFuaWZlc3RzX3BhdGggPSAibWFuaWZlc3RzIgorICAjICAgcHVwcGV0Lm1hbmlmZXN0X2ZpbGUgID0gImRlZmF1bHQucHAiCisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggY2hlZiBzb2xvLCBzcGVjaWZ5aW5nIGEgY29va2Jvb2tzIHBhdGgsIHJvbGVzCisgICMgcGF0aCwgYW5kIGRhdGFfYmFncyBwYXRoIChhbGwgcmVsYXRpdmUgdG8gdGhpcyBWYWdyYW50ZmlsZSksIGFuZCBhZGRpbmcKKyAgIyBzb21lIHJlY2lwZXMgYW5kL29yIHJvbGVzLgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2hlZl9zb2xvIiBkbyB8Y2hlZnwKKyAgIyAgIGNoZWYuY29va2Jvb2tzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9jb29rYm9va3MiCisgICMgICBjaGVmLnJvbGVzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9yb2xlcyIKKyAgIyAgIGNoZWYuZGF0YV9iYWdzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9kYXRhX2JhZ3MiCisgICMgICBjaGVmLmFkZF9yZWNpcGUgIm15c3FsIgorICAjICAgY2hlZi5hZGRfcm9sZSAid2ViIgorICAjCisgICMgICAjIFlvdSBtYXkgYWxzbyBzcGVjaWZ5IGN1c3RvbSBKU09OIGF0dHJpYnV0ZXM6CisgICMgICBjaGVmLmpzb24gPSB7IG15c3FsX3Bhc3N3b3JkOiAiZm9vIiB9CisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggY2hlZiBzZXJ2ZXIsIHNwZWNpZnlpbmcgdGhlIGNoZWYgc2VydmVyIFVSTCwKKyAgIyBhbmQgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24ga2V5IChyZWxhdGl2ZSB0byB0aGlzIFZhZ3JhbnRmaWxlKS4KKyAgIworICAjIFRoZSBPcHNjb2RlIFBsYXRmb3JtIHVzZXMgSFRUUFMuIFN1YnN0aXR1dGUgeW91ciBvcmdhbml6YXRpb24gZm9yCisgICMgT1JHTkFNRSBpbiB0aGUgVVJMIGFuZCB2YWxpZGF0aW9uIGtleS4KKyAgIworICAjIElmIHlvdSBoYXZlIHlvdXIgb3duIENoZWYgU2VydmVyLCB1c2UgdGhlIGFwcHJvcHJpYXRlIFVSTCwgd2hpY2ggbWF5IGJlCisgICMgSFRUUCBpbnN0ZWFkIG9mIEhUVFBTIGRlcGVuZGluZyBvbiB5b3VyIGNvbmZpZ3VyYXRpb24uIEFsc28gY2hhbmdlIHRoZQorICAjIHZhbGlkYXRpb24ga2V5IHRvIHZhbGlkYXRpb24ucGVtLgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2hlZl9jbGllbnQiIGRvIHxjaGVmfAorICAjICAgY2hlZi5jaGVmX3NlcnZlcl91cmwgPSAiaHR0cHM6Ly9hcGkub3BzY29kZS5jb20vb3JnYW5pemF0aW9ucy9PUkdOQU1FIgorICAjICAgY2hlZi52YWxpZGF0aW9uX2tleV9wYXRoID0gIk9SR05BTUUtdmFsaWRhdG9yLnBlbSIKKyAgIyBlbmQKKyAgIworICAjIElmIHlvdSdyZSB1c2luZyB0aGUgT3BzY29kZSBwbGF0Zm9ybSwgeW91ciB2YWxpZGF0b3IgY2xpZW50IGlzCisgICMgT1JHTkFNRS12YWxpZGF0b3IsIHJlcGxhY2luZyBPUkdOQU1FIHdpdGggeW91ciBvcmdhbml6YXRpb24gbmFtZS4KKyAgIworICAjIElmIHlvdSBoYXZlIHlvdXIgb3duIENoZWYgU2VydmVyLCB0aGUgZGVmYXVsdCB2YWxpZGF0aW9uIGNsaWVudCBuYW1lIGlzCisgICMgY2hlZi12YWxpZGF0b3IsIHVubGVzcyB5b3UgY2hhbmdlZCB0aGUgY29uZmlndXJhdGlvbi4KKyAgIworICAjICAgY2hlZi52YWxpZGF0aW9uX2NsaWVudF9uYW1lID0gIk9SR05BTUUtdmFsaWRhdG9yIgorCisgICMjIyMjIFJ1biB0aGUgQXBhY2hlIFRocmlmdCBwcm92aXNpb25pbmcgc2NyaXB0IChkZWNsYXJlZCBhYm92ZSkKKyAgY29uZmlnLnZtLnByb3Zpc2lvbiA6c2hlbGwsIDppbmxpbmUgPT4gJGJ1aWxkX2FuZF90ZXN0CitlbmQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL01ha2VmaWxlIGIvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzOThlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL01ha2VmaWxlCkBAIC0wLDAgKzEsMzkgQEAKK1RIUklGVCA9IHRocmlmdAorCitDWFhGTEFHUyArPSAtZzMgLU8wCisKK0dFTk5BTUVTID0gU3RvcmFnZSBzdG9yYWdlX3R5cGVzCitHRU5IRUFERVJTID0gJChhZGRzdWZmaXggLmgsICQoR0VOTkFNRVMpKQorR0VOU1JDUyA9ICQoYWRkc3VmZml4IC5jcHAsICQoR0VOTkFNRVMpKQorR0VOT0JKUyA9ICQoYWRkc3VmZml4IC5vLCAkKEdFTk5BTUVTKSkKKworUFlMSUJTID0gc3RvcmFnZS9fX2luaXRfXy5weQorCitQUk9HUyA9ICB0ZXN0LWNsaWVudCB0ZXN0LXNlcnZlciB0ZXN0LXNlbmRlciB0ZXN0LXJlY2VpdmVyCisKK2FsbDogJChQWUxJQlMpICQoUFJPR1MpCisKK3Rlc3QtY2xpZW50OiB0ZXN0LWNsaWVudC5vIFRabXFDbGllbnQubyAkKEdFTk9CSlMpCisJJChDWFgpICReIC1vICRAIC1sem1xIC1sdGhyaWZ0Cit0ZXN0LXNlcnZlcjogdGVzdC1zZXJ2ZXIubyBUWm1xU2VydmVyLm8gJChHRU5PQkpTKQorCSQoQ1hYKSAkXiAtbyAkQCAtbHptcSAtbHRocmlmdAordGVzdC1zZW5kZXI6IHRlc3Qtc2VuZGVyLm8gVFptcUNsaWVudC5vICQoR0VOT0JKUykKKwkkKENYWCkgJF4gLW8gJEAgLWx6bXEgLWx0aHJpZnQKK3Rlc3QtcmVjZWl2ZXI6IHRlc3QtcmVjZWl2ZXIubyBUWm1xU2VydmVyLm8gJChHRU5PQkpTKQorCSQoQ1hYKSAkXiAtbyAkQCAtbHptcSAtbHRocmlmdAorCit0ZXN0LWNsaWVudC5vIHRlc3Qtc2VydmVyLm8gdGVzdC1zZW5kZXIubyB0ZXN0LXJlY2VpdmVyLm86ICQoR0VOU1JDUykKKworc3RvcmFnZS9fX2luaXRfXy5weTogc3RvcmFnZS50aHJpZnQKKwkkKFJNKSAkKGRpciAkQCkKKwkkKFRIUklGVCkgLS1nZW4gcHkgJDwKKwltdiBnZW4tcHkvJChkaXIgJEApIC4KKworJChHRU5TUkNTKTogc3RvcmFnZS50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisJbXYgJChhZGRwcmVmaXggZ2VuLWNwcC8sICQoR0VOU1JDUykgJChHRU5IRUFERVJTKSkgLgorCitjbGVhbjoKKwkkKFJNKSAtciAqLm8gJChQUk9HUykgc3RvcmFnZSAkKEdFTlNSQ1MpICQoR0VOSEVBREVSUykKKworLlBIT05ZOiBjbGVhbgpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvUkVBRE1FLm1kIGIvY29udHJpYi96ZXJvbXEvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMGI1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9SRUFETUUubWQKQEAgLTAsMCArMSwzMCBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc29tZSBnbHVlIGNvZGUgdG8gYWxsb3cgVGhyaWZ0IFJQQ3MgdG8gYmUgc2VudCBvdmVyCitaZXJvTVEuICBJbmNsdWRlZCBhcmUgY2xpZW50IGFuZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBQeXRob24gYW5kIEMrKywKK2Fsb25nIHdpdGggYSBzaW1wbGUgZGVtbyBpbnRlcmZhY2UgKHdpdGggYSB3b3JraW5nIGNsaWVudCBhbmQgc2VydmVyIGZvcgorZWFjaCBsYW5ndWFnZSkuCisKK1RocmlmdCB3YXMgZGVzaWduZWQgZm9yIHN0cmVhbS1iYXNlZCBpbnRlcmZhY2VzIGxpa2UgVENQLCBidXQgWmVyb01RIGlzCittZXNzYWdlLWJhc2VkLCBzbyB0aGVyZSBpcyBhIHNtYWxsIGltcGVkYW5jZSBtaXNtYXRjaC4gIE1vc3Qgb2YgaXNzdWVzIGFyZQoraGlkZGVuIGZyb20gZGV2ZWxvcGVycywgYnV0IG9uZSBjYW5ub3QgYmU6IG9uZXdheSBtZXRob2RzIGhhdmUgdG8gYmUgaGFuZGxlZAorZGlmZmVyZW50bHkgZnJvbSBub3JtYWwgb25lcy4gIFplcm9NUSByZXF1aXJlcyB0aGUgbWVzc2FnaW5nIHBhdHRlcm4gdG8gYmUKK2RlY2xhcmVkIGF0IHNvY2tldCBjcmVhdGlvbiB0aW1lLCBzbyBhbiBhcHBsaWNhdGlvbiBjYW5ub3QgZGVjaWRlIG9uIGEKK21lc3NhZ2UtYnktbWVzc2FnZSBiYXNpcyB3aGV0aGVyIHRvIHNlbmQgYSByZXBseS4gIFRoZXJlZm9yZSwgdGhpcworaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgdGhlIGNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IFpNUV9SRVEKK3NvY2tldHMgYXJlIHVzZWQgZm9yIG5vcm1hbCBtZXRob2RzIGFuZCBaTVFfRE9XTlNUUkVBTSBzb2NrZXRzIGFyZSB1c2VkIGZvcgorb25ld2F5IG1ldGhvZHMuICBJbiBhZGRpdGlvbiwgc2VydmljZXMgdGhhdCBleHBvc2UgYm90aCB0eXBlcyBvZiBtZXRob2RzCitoYXZlIHRvIGV4cG9zZSB0d28gc2VydmVycyAob24gdHdvIHBvcnRzKSwgYnV0IHRoZSBUWm1xTXVsdGlTZXJ2ZXIgbWFrZXMgaXQKK2Vhc3kgdG8gcnVuIHRoZSB0d28gdG9nZXRoZXIgaW4gdGhlIHNhbWUgdGhyZWFkLgorCitUaGlzIGNvZGUgd2FzIHRlc3RlZCB3aXRoIFplcm9NUSAyLjAuNyBhbmQgcHl6bXEgYWZhYmJiNWI5YmQzLgorCitUbyBidWlsZCwgc2ltcGx5IGluc3RhbGwgVGhyaWZ0IGFuZCBaZXJvTVEsIHRoZW4gcnVuICJtYWtlIi4gIElmIHlvdSBpbnN0YWxsCitpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiwgbWFrZSBzdXJlIHRvIHNldCBUSFJJRlQgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQorVGhyaWZ0IGNvZGUgZ2VuZXJhdG9yIG9uIHRoZSBtYWtlIGNvbW1hbmQgbGluZSBhbmQgUEtHX0NPTkZJR19QQVRIIHRvIGEgcGF0aAordGhhdCBpbmNsdWRlcyB0aGUgcGtnY29uZmlnIGZpbGVzIGZvciBib3RoIFRocmlmdCBhbmQgWmVyb01RLiAgVGhlIHRlc3QKK3NlcnZlcnMgdGFrZSBubyBhcmd1bWVudHMuICBSdW4gdGhlIHRlc3QgY2xpZW50cyB3aXRoIG5vIGFyZ3VtZW50cyB0bworcmV0cmlldmUgdGhlIHN0b3JlZCB2YWx1ZSBvciB3aXRoIGFuIGludGVnZXIgYXJndW1lbnQgdG8gaW5jcmVtZW50IGl0IGJ5Cit0aGF0IGFtb3VudC4KKworVGhpcyBjb2RlIGlzIG5vdCBxdWl0ZSB3aGF0IEkgd291bGQgY29uc2lkZXIgcHJvZHVjdGlvbi1yZWFkeS4gIEl0IGRvZXNuJ3QKK3N1cHBvcnQgYWxsIG9mIHRoZSBub3JtYWwgaG9va3MgaW50byBUaHJpZnQsIGFuZCBpdHMgcGVyZm9ybWFuY2UgaXMKK3N1Yi1vcHRpbWFsIGJlY2F1c2UgaXQgZG9lcyBzb21lIHVubmVjZXNzYXJ5IGNvcHlpbmcuCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcCBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Mjc4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcApAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJUWm1xQ2xpZW50LmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordWludDMyX3QgVFptcUNsaWVudDo6cmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChyYnVmXy5hdmFpbGFibGVfcmVhZCgpID09IDApIHsKKyAgICAodm9pZClzb2NrXy5yZWN2KCZtc2dfKTsKKyAgICByYnVmXy5yZXNldEJ1ZmZlcigodWludDhfdCopbXNnXy5kYXRhKCksIG1zZ18uc2l6ZSgpKTsKKyAgfQorICByZXR1cm4gcmJ1Zl8ucmVhZChidWYsIGxlbik7Cit9CisKK3ZvaWQgVFptcUNsaWVudDo6d3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICByZXR1cm4gd2J1Zl8ud3JpdGUoYnVmLCBsZW4pOworfQorCit1aW50MzJfdCBUWm1xQ2xpZW50Ojp3cml0ZUVuZCgpIHsKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBzaXplOworICB3YnVmXy5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOworICB6bXE6Om1lc3NhZ2VfdCBtc2coc2l6ZSk7CisgIHN0ZDo6bWVtY3B5KG1zZy5kYXRhKCksIGJ1Ziwgc2l6ZSk7CisgICh2b2lkKXNvY2tfLnNlbmQobXNnKTsKKyAgd2J1Zl8ucmVzZXRCdWZmZXIodHJ1ZSk7CisgIHJldHVybiBzaXplOworfQorCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5oIGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTZlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTVFDTElFTlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFpNUUNMSUVOVF9IXyAxCisKKyNpbmNsdWRlIDx6bXEuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFptcUNsaWVudCA6IHB1YmxpYyBUVHJhbnNwb3J0IHsKKyBwdWJsaWM6CisgIFRabXFDbGllbnQoem1xOjpjb250ZXh0X3QmIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcmIGVuZHBvaW50LCBpbnQgdHlwZSkKKyAgICA6IHNvY2tfKGN0eCwgdHlwZSkKKyAgICAsIGVuZHBvaW50XyhlbmRwb2ludCkKKyAgICAsIHdidWZfKCkKKyAgICAsIHJidWZfKCkKKyAgICAsIG1zZ18oKQorICAgICwgem1xX3R5cGVfKHR5cGUpCisgIHt9CisKKyAgdm9pZCBvcGVuKCkgeworICAgIGlmKHptcV90eXBlXyA9PSBaTVFfUFVCKSB7CisgICAgICBzb2NrXy5iaW5kKGVuZHBvaW50Xy5jX3N0cigpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzb2NrXy5jb25uZWN0KGVuZHBvaW50Xy5jX3N0cigpKTsKKyAgICB9CisgIH0KKworICB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdWludDMyX3Qgd3JpdGVFbmQoKTsKKworIHByb3RlY3RlZDoKKyAgem1xOjpzb2NrZXRfdCBzb2NrXzsKKyAgc3RkOjpzdHJpbmcgZW5kcG9pbnRfOworICBUTWVtb3J5QnVmZmVyIHdidWZfOworICBUTWVtb3J5QnVmZmVyIHJidWZfOworICB6bXE6Om1lc3NhZ2VfdCBtc2dfOworICBpbnQgem1xX3R5cGVfOworfTsKKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFpNUUNMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5weSBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkNjBhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkKQEAgLTAsMCArMSw2NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbXBvcnQgem1xCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0CisKKworY2xhc3MgVFptcUNsaWVudChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3R4LCBlbmRwb2ludCwgc29ja190eXBlKToKKyAgICAgICAgc2VsZi5fc29jayA9IGN0eC5zb2NrZXQoc29ja190eXBlKQorICAgICAgICBzZWxmLl9lbmRwb2ludCA9IGVuZHBvaW50CisgICAgICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5fc29jay5jb25uZWN0KHNlbGYuX2VuZHBvaW50KQorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldCA9IHNlbGYuX3JidWYucmVhZChzaXplKQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICBzZWxmLl9yZWFkX21lc3NhZ2UoKQorICAgICAgICByZXR1cm4gc2VsZi5fcmJ1Zi5yZWFkKHNpemUpCisKKyAgICBkZWYgX3JlYWRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fc29jay5yZWN2KCkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKG1zZykKKworICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl93YnVmLndyaXRlKGJ1ZikKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX3NvY2suc2VuZChtc2cpCisKKyAgICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYKKworICAgICMgTk9URTogVGhpcyB3aWxsIHByb2JhYmx5IG5vdCBhY3R1YWxseSB3b3JrLgorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKKyAgICAgICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46CisgICAgICAgICAgICBzZWxmLnJlYWRfbWVzc2FnZSgpCisgICAgICAgICAgICBwcmVmaXggKz0gc2VsZi5fcmJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhwcmVmaXgpCisgICAgICAgIHJldHVybiBzZWxmLl9yYnVmCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjYwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJUWm1xU2VydmVyLmgiCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOworCituYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgeworCitib29sIFRabXFTZXJ2ZXI6OnNlcnZlT25lKGludCByZWN2X2ZsYWdzKSB7CisgIHptcTo6bWVzc2FnZV90IG1zZzsKKyAgYm9vbCByZWNlaXZlZCA9IHNvY2tfLnJlY3YoJm1zZywgcmVjdl9mbGFncyk7CisgIGlmICghcmVjZWl2ZWQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBpbnB1dFRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigodWludDhfdCopbXNnLmRhdGEoKSwgbXNnLnNpemUoKSkpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG91dHB1dFRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2woCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KSk7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCgKKyAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCkpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcik7CisKKyAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgTlVMTCk7CisKKyAgaWYgKHptcV90eXBlXyA9PSBaTVFfUkVQKSB7CisgICAgdWludDhfdCogYnVmOworICAgIHVpbnQzMl90IHNpemU7CisgICAgb3V0cHV0VHJhbnNwb3J0LT5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOworICAgIG1zZy5yZWJ1aWxkKHNpemUpOworICAgIHN0ZDo6bWVtY3B5KG1zZy5kYXRhKCksIGJ1Ziwgc2l6ZSk7CisgICAgKHZvaWQpc29ja18uc2VuZChtc2cpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKwordm9pZCBUWm1xTXVsdGlTZXJ2ZXI6OnNlcnZlT25lKGxvbmcgdGltZW91dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx6bXE6OnBvbGxpdGVtX3Q+IGl0ZW1zKHNldHVwUG9sbCgpKTsKKyAgc2VydmVBY3RpdmUoaXRlbXMuZ2V0KCksIHRpbWVvdXQpOworfQorCisKK3ZvaWQgVFptcU11bHRpU2VydmVyOjpzZXJ2ZUZvcmV2ZXIoKSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHptcTo6cG9sbGl0ZW1fdD4gaXRlbXMoc2V0dXBQb2xsKCkpOworICB3aGlsZSAodHJ1ZSkgeworICAgIHNlcnZlQWN0aXZlKGl0ZW1zLmdldCgpLCAtMSk7CisgIH0KK30KKworCit6bXE6OnBvbGxpdGVtX3QqIFRabXFNdWx0aVNlcnZlcjo6c2V0dXBQb2xsKCkgeworICB6bXE6OnBvbGxpdGVtX3QqIGl0ZW1zID0gbmV3IHptcTo6cG9sbGl0ZW1fdFtzZXJ2ZXJzXy5zaXplKCldOworICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnNfLnNpemUoKTsgKytpKSB7CisgICAgaXRlbXNbaV0uc29ja2V0ID0gc2VydmVyc19baV0tPmdldFNvY2tldCgpOworICAgIGl0ZW1zW2ldLmV2ZW50cyA9IFpNUV9QT0xMSU47CisgIH0KKyAgcmV0dXJuIGl0ZW1zOworfQorCit2b2lkIFRabXFNdWx0aVNlcnZlcjo6c2VydmVBY3RpdmUoem1xOjpwb2xsaXRlbV90KiBpdGVtcywgbG9uZyB0aW1lb3V0KSB7CisgIGludCByYyA9IHptcTo6cG9sbChpdGVtcywgc2VydmVyc18uc2l6ZSgpLCB0aW1lb3V0KTsKKyAgaWYgKHJjID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzXy5zaXplKCk7ICsraSkgeworICAgIGlmICgoaXRlbXNbaV0ucmV2ZW50cyAmIFpNUV9QT0xMSU4pICE9IDApIHsKKyAgICAgIC8vIFNob3VsZCB3ZSBwYXNzIFpNUV9OT0JMT0NLIGhlcmUgdG8gYmUgc2FmZT8KKyAgICAgIHNlcnZlcnNfW2ldLT5zZXJ2ZU9uZSgpOworICAgIH0KKyAgfQorfQorCisKK319fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmggYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkMTNiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFpNUVNFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UWk1RU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx6bXEuaHBwPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgeworCitjbGFzcyBUWm1xU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgeworIHB1YmxpYzoKKyAgVFptcVNlcnZlcigKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICB6bXE6OmNvbnRleHRfdCYgY3R4LCBjb25zdCBzdGQ6OnN0cmluZyYgZW5kcG9pbnQsIGludCB0eXBlKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3IpCisgICAgLCBwcm9jZXNzb3JfKHByb2Nlc3NvcikKKyAgICAsIHptcV90eXBlXyh0eXBlKQorICAgICwgc29ja18oY3R4LCB0eXBlKQorICB7CisgICAgaWYoem1xX3R5cGVfID09IFpNUV9TVUIpIHsKKyAgICAgIHNvY2tfLnNldHNvY2tvcHQoWk1RX1NVQlNDUklCRSwgIiIsIDApIDsgLy8gbGlzdGVuIHRvIGFsbCBtZXNzYWdlcworICAgICAgc29ja18uY29ubmVjdChlbmRwb2ludC5jX3N0cigpKSA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgc29ja18uYmluZChlbmRwb2ludC5jX3N0cigpKTsKKyAgICB9CisgIH0KKworICBib29sIHNlcnZlT25lKGludCByZWN2X2ZsYWdzID0gMCk7CisgIHZvaWQgc2VydmUoKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHNlcnZlT25lKCk7CisgICAgfQorICB9CisKKyAgem1xOjpzb2NrZXRfdCYgZ2V0U29ja2V0KCkgeworICAgIHJldHVybiBzb2NrXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIGludCB6bXFfdHlwZV87CisgIHptcTo6c29ja2V0X3Qgc29ja187Cit9OworCisKK2NsYXNzIFRabXFNdWx0aVNlcnZlciB7CisgcHVibGljOgorICB2b2lkIHNlcnZlT25lKGxvbmcgdGltZW91dCA9IC0xKTsKKyAgdm9pZCBzZXJ2ZUZvcmV2ZXIoKTsKKworICBzdGQ6OnZlY3RvcjxUWm1xU2VydmVyKj4mIHNlcnZlcnMoKSB7CisgICAgcmV0dXJuIHNlcnZlcnNfOworICB9CisKKyBwcml2YXRlOgorICB6bXE6OnBvbGxpdGVtX3QqIHNldHVwUG9sbCgpOworICB2b2lkIHNlcnZlQWN0aXZlKHptcTo6cG9sbGl0ZW1fdCogaXRlbXMsIGxvbmcgdGltZW91dCk7CisgIHN0ZDo6dmVjdG9yPFRabXFTZXJ2ZXIqPiBzZXJ2ZXJzXzsKK307CisKKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFpNUVNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5weSBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjMTU0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkKQEAgLTAsMCArMSw3OSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHptcQoraW1wb3J0IHRocmlmdC5zZXJ2ZXIuVFNlcnZlcgoraW1wb3J0IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydAorCisKK2NsYXNzIFRabXFTZXJ2ZXIodGhyaWZ0LnNlcnZlci5UU2VydmVyLlRTZXJ2ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGN0eCwgZW5kcG9pbnQsIHNvY2tfdHlwZSk6CisgICAgICAgIHRocmlmdC5zZXJ2ZXIuVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSkKKyAgICAgICAgc2VsZi56bXFfdHlwZSA9IHNvY2tfdHlwZQorICAgICAgICBzZWxmLnNvY2tldCA9IGN0eC5zb2NrZXQoc29ja190eXBlKQorICAgICAgICBzZWxmLnNvY2tldC5iaW5kKGVuZHBvaW50KQorCisgICAgZGVmIHNlcnZlT25lKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLnNvY2tldC5yZWN2KCkKKyAgICAgICAgaXRyYW5zID0gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIobXNnKQorICAgICAgICBvdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiKQorICAgICAgICAgICAgIyBGYWxsIHRocm91Z2ggYW5kIHNlbmQgYmFjayBhIHJlc3BvbnNlLCBldmVuIGlmIGVtcHR5IG9yIGluY29tcGxldGUuCisKKyAgICAgICAgaWYgc2VsZi56bXFfdHlwZSA9PSB6bXEuUkVQOgorICAgICAgICAgICAgbXNnID0gb3RyYW5zLmdldHZhbHVlKCkKKyAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQobXNnKQorCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi5zZXJ2ZU9uZSgpCisKKworY2xhc3MgVFptcU11bHRpU2VydmVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlcnMgPSBbXQorCisgICAgZGVmIHNlcnZlT25lKHNlbGYsIHRpbWVvdXQ9LTEpOgorICAgICAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShzZWxmLl9zZXR1cFBvbGwoKSwgdGltZW91dCkKKworICAgIGRlZiBzZXJ2ZUZvcmV2ZXIoc2VsZik6CisgICAgICAgIHBvbGxfaW5mbyA9IHNlbGYuX3NldHVwUG9sbCgpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShwb2xsX2luZm8sIC0xKQorCisgICAgZGVmIF9zZXR1cFBvbGwoc2VsZik6CisgICAgICAgIHNlcnZlcl9tYXAgPSB7fQorICAgICAgICBwb2xsZXIgPSB6bXEuUG9sbGVyKCkKKyAgICAgICAgZm9yIHNlcnZlciBpbiBzZWxmLnNlcnZlcnM6CisgICAgICAgICAgICBzZXJ2ZXJfbWFwW3NlcnZlci5zb2NrZXRdID0gc2VydmVyCisgICAgICAgICAgICBwb2xsZXIucmVnaXN0ZXIoc2VydmVyLnNvY2tldCwgem1xLlBPTExJTikKKyAgICAgICAgcmV0dXJuIChzZXJ2ZXJfbWFwLCBwb2xsZXIpCisKKyAgICBkZWYgX3NlcnZlQWN0aXZlKHNlbGYsIHBvbGxfaW5mbywgdGltZW91dCk6CisgICAgICAgIChzZXJ2ZXJfbWFwLCBwb2xsZXIpID0gcG9sbF9pbmZvCisgICAgICAgIHJlYWR5ID0gZGljdChwb2xsZXIucG9sbCgpKQorICAgICAgICBmb3Igc29jaywgc3RhdGUgaW4gcmVhZHkuaXRlbXMoKToKKyAgICAgICAgICAgIGFzc2VydCAoc3RhdGUgJiB6bXEuUE9MTElOKSAhPSAwCisgICAgICAgICAgICBzZXJ2ZXJfbWFwW3NvY2tdLnNlcnZlT25lKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9Bc3NlbWJseUluZm8uY3MgYi9jb250cmliL3plcm9tcS9jc2hhcnAvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyY2Q0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhc3NlbWJseSBpcyBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcy4KKy8vIENoYW5nZSB0aGVtIHRvIHRoZSB2YWx1ZXMgc3BlY2lmaWMgdG8geW91ciBwcm9qZWN0LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlptcVNlcnZlciIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJabXEgRXhhbXBsZXMiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFRoZSBhc3NlbWJseSB2ZXJzaW9uIGhhcyB0aGUgZm9ybWF0ICJ7TWFqb3J9LntNaW5vcn0ue0J1aWxkfS57UmV2aXNpb259Ii4KKy8vIFRoZSBmb3JtICJ7TWFqb3J9LntNaW5vcn0uKiIgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgYnVpbGQgYW5kIHJldmlzaW9uLAorLy8gYW5kICJ7TWFqb3J9LntNaW5vcn0ue0J1aWxkfS4qIiB3aWxsIHVwZGF0ZSBqdXN0IHRoZSByZXZpc2lvbi4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCisKKy8vIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzaWduaW5nIGtleSBmb3IgdGhlIGFzc2VtYmx5LAorLy8gaWYgZGVzaXJlZC4gU2VlIHRoZSBNb25vIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2lnbmluZy4KKworLy9bYXNzZW1ibHk6IEFzc2VtYmx5RGVsYXlTaWduKGZhbHNlKV0KKy8vW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIiIpXQorCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvTWFpbi5jcyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9NYWluLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmNmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvTWFpbi5jcwpAQCAtMCwwICsxLDYwIEBACit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgWk1ROwordXNpbmcgWm1xU2VydmVyOwordXNpbmcgWm1xQ2xpZW50OworCituYW1lc3BhY2UgWm1xU2VydmVyCit7CisJY2xhc3MgTWFpbkNsYXNzCisJeworCQlwdWJsaWMgc3RhdGljIHZvaWQgTWFpbiAoc3RyaW5nW10gYXJncykKKwkJeworCQkJbmV3IFRocmVhZChTZXJ2ZXIuc2VydmUpLlN0YXJ0KCk7CisJCQlDbGllbnQud29yaygpOworCQl9CisJCQorCQlzdGF0aWMgY2xhc3MgU2VydmVyeworCQkJcHVibGljIHN0YXRpYyB2b2lkIHNlcnZlKCl7CisJCQkJU3RvcmFnZUhhbmRsZXIgcz1uZXcgU3RvcmFnZUhhbmRsZXIoKTsKKwkJCQlTdG9yYWdlLlByb2Nlc3NvciBwPW5ldyBTdG9yYWdlLlByb2Nlc3NvcihzKTsKKwkJCQkKKwkJCQlaTVEuQ29udGV4dCBjPW5ldyBaTVEuQ29udGV4dCgpOworCQkJCQorCQkJCVRabXFTZXJ2ZXIgdHpzPW5ldyBUWm1xU2VydmVyKHAsYywidGNwOi8vMTI3LjAuMC4xOjkwOTAiLFpNUS5Tb2NrZXRUeXBlLlBBSVIpOworCQkJCXR6cy5TZXJ2ZSgpOworCQkJfQorCQkJCisJCQljbGFzcyBTdG9yYWdlSGFuZGxlcjpTdG9yYWdlLklmYWNleworCQkJCWludCB2YWw9MDsKKwkJCQkKKwkJCQlwdWJsaWMgdm9pZCBpbmNyKGludCBhbW91bnQpeworCQkJCQl2YWwrPWFtb3VudDsKKwkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoImluY3IoezB9KSIsYW1vdW50KTsKKwkJCQl9CisJCQkJCisJCQkJcHVibGljIGludCBnZXQoKXsKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCQl9IAorCQkJfQorCQl9CisJCQorCQlzdGF0aWMgY2xhc3MgQ2xpZW50eworCQkJcHVibGljIHN0YXRpYyB2b2lkIHdvcmsoKQorCQkJeworCQkJCUNvbnRleHQgY3R4PW5ldyBDb250ZXh0KCk7CisJCQkJVFptcUNsaWVudCB0emM9bmV3IFRabXFDbGllbnQoY3R4LCJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MCIsU29ja2V0VHlwZS5QQUlSKTsKKwkJCQlUQmluYXJ5UHJvdG9jb2wgcD1uZXcgVEJpbmFyeVByb3RvY29sKHR6Yyk7CisJCQkJCisJCQkJU3RvcmFnZS5DbGllbnQgY2xpZW50PW5ldyBTdG9yYWdlLkNsaWVudChwKTsKKwkJCQl0emMuT3BlbigpOworCQkJCQorCQkJCUNvbnNvbGUuV3JpdGVMaW5lKGNsaWVudC5AZ2V0KCkpOworCQkJCWNsaWVudC5pbmNyKDEpOworCQkJCWNsaWVudC5pbmNyKDQxKTsKKwkJCQlDb25zb2xlLldyaXRlTGluZShjbGllbnQuQGdldCgpKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RabXFDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhYjUxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzCkBAIC0wLDAgKzEsNzggQEAKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFpNUTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBabXFDbGllbnQKK3sKKwlwdWJsaWMgY2xhc3MgVFptcUNsaWVudCA6IFRUcmFuc3BvcnQKKwl7CisJCVNvY2tldCBfc29jazsKKwkJU3RyaW5nIF9lbmRwb2ludDsKKwkJTWVtb3J5U3RyZWFtIF93YnVmID0gbmV3IE1lbW9yeVN0cmVhbSAoKTsKKwkJTWVtb3J5U3RyZWFtIF9yYnVmID0gbmV3IE1lbW9yeVN0cmVhbSAoKTsKKworCQl2b2lkIGRlYnVnIChzdHJpbmcgbXNnKQorCQl7CisJCQkvL1VuY29tbWVudCB0byBlbmFibGUgZGVidWcKKy8vCQkJQ29uc29sZS5Xcml0ZUxpbmUgKG1zZyk7CisJCX0KKworCQlwdWJsaWMgVFptcUNsaWVudCAoQ29udGV4dCBjdHgsIFN0cmluZyBlbmRwb2ludCwgU29ja2V0VHlwZSBzb2NrVHlwZSkKKwkJeworCQkJX3NvY2sgPSBjdHguU29ja2V0IChzb2NrVHlwZSk7CisJCQlfZW5kcG9pbnQgPSBlbmRwb2ludDsKKwkJfQorCisJCXB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4gKCkKKwkJeworCQkJX3NvY2suQ29ubmVjdCAoX2VuZHBvaW50KTsKKwkJfQorCQkKKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UgKCkKKwkJeworCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uICgpOworCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuIHsKKwkJCWdldCB7CisJCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uICgpOworCQkJfQorCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkIChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorCQl7CisJCQlkZWJ1ZyAoIkNsaWVudF9SZWFkIik7CisJCQlpZiAob2ZmICE9IDAgfHwgbGVuICE9IGJ1Zi5MZW5ndGgpCisJCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uICgpOworCisJCQlpZiAoX3JidWYuTGVuZ3RoID09IDApIHsKKwkJCQkvL0ZpbGwgdGhlIEJ1ZmZlciB3aXRoIHRoZSBjb21wbGV0ZSBaTVEgTWVzc2FnZSB3aGljaCBuZWVkcyB0byBiZSg/ISkgdGhlIGNvbXBsZXRlIFRocmlmdCByZXNwb25zZQorCQkJCWRlYnVnICgiQ2xpZW50X1JlYWQgRmlsbGluZyBidWZmZXIuLiIpOworCQkJCWJ5dGVbXSB0bXBCdWYgPSBfc29jay5SZWN2ICgpOworCQkJCWRlYnVnIChzdHJpbmcuRm9ybWF0KCJDbGllbnRfUmVhZCBmaWxsZWQgd2l0aCB7MH1iIix0bXBCdWYuTGVuZ3RoKSk7CisJCQkJX3JidWYuV3JpdGUgKHRtcEJ1ZiwgMCwgdG1wQnVmLkxlbmd0aCk7CisJCQkJX3JidWYuUG9zaXRpb24gPSAwOwkvL0ZvciByZWFkaW5nCisJCQl9CisJCQlpbnQgcmV0ID0gX3JidWYuUmVhZCAoYnVmLCAwLCBsZW4pOworCQkJaWYgKF9yYnVmLkxlbmd0aCA9PSBfcmJ1Zi5Qb3NpdGlvbikJLy9GaW5pc2hlZCByZWFkaW5nCisJCQkJX3JidWYuU2V0TGVuZ3RoICgwKTsKKwkJCWRlYnVnIChzdHJpbmcuRm9ybWF0ICgiQ2xpZW50X1JlYWQgcmV0dXJuIHswfWIsIHJlbWFpbmluZyAgezF9YiIsIHJldCwgX3JidWYuTGVuZ3RoIC0gX3JidWYuUG9zaXRpb24pKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZSAoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKwkJeworCQkJZGVidWcgKCJDbGllbnRfV3JpdGUiKTsKKwkJCV93YnVmLldyaXRlIChidWYsIG9mZiwgbGVuKTsKKwkJfQorCisJCXB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoICgpCisJCXsKKwkJCWRlYnVnICgiQ2xpZW50X0ZsdXNoIik7CisJCQlfc29jay5TZW5kIChfd2J1Zi5HZXRCdWZmZXIgKCkpOworCQkJX3didWYgPSBuZXcgTWVtb3J5U3RyZWFtICgpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvVFptcVNlcnZlci5jcyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNWM2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvVFptcVNlcnZlci5jcwpAQCAtMCwwICsxLDU2IEBACit1c2luZyBTeXN0ZW07Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFpNUTsKK3VzaW5nIFN5c3RlbS5JTzsKKwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBabXFTZXJ2ZXIKK3sKKwlwdWJsaWMgY2xhc3MgVFptcVNlcnZlcgorCXsKKwkJU29ja2V0IF9zb2NrZXQgOworCQlUUHJvY2Vzc29yIF9wcm9jZXNzb3I7CisJCQorCQl2b2lkIGRlYnVnIChzdHJpbmcgbXNnKQorCQl7CisJCQkvL1VuY29tbWVudCB0byBlbmFibGUgZGVidWcKKy8vCQkJQ29uc29sZS5Xcml0ZUxpbmUgKG1zZyk7CisJCX0KKworCQlwdWJsaWMgVFptcVNlcnZlciAoVFByb2Nlc3NvciBwcm9jZXNzb3IsIENvbnRleHQgY3R4LCBTdHJpbmcgZW5kcG9pbnQsIFNvY2tldFR5cGUgc29ja1R5cGUpCisJCXsKKwkJCW5ldyBUU2ltcGxlU2VydmVyIChwcm9jZXNzb3IsbnVsbCk7CisJCQlfc29ja2V0ID0gY3R4LlNvY2tldCAoc29ja1R5cGUpOworCQkJX3NvY2tldC5CaW5kIChlbmRwb2ludCk7CisJCQlfcHJvY2Vzc29yID0gcHJvY2Vzc29yOworCQl9CisKKwkJcHVibGljIHZvaWQgU2VydmVPbmUgKCkKKwkJeworCQkJZGVidWcgKCJTZXJ2ZXJfU2VydmVPbmUiKTsKKwkJCUJ5dGVbXSBtc2cgPSBfc29ja2V0LlJlY3YgKCk7CisJCQlNZW1vcnlTdHJlYW0gaXN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0gKG1zZyk7CisJCQlNZW1vcnlTdHJlYW0gb3N0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0gKCk7CisJCQlUUHJvdG9jb2wgdFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCAobmV3IFRTdHJlYW1UcmFuc3BvcnQgKGlzdHJlYW0sIG9zdHJlYW0pKTsKKwkJCV9wcm9jZXNzb3IuUHJvY2VzcyAodFByb3RvY29sLCB0UHJvdG9jb2wpOworCisJCQlpZiAob3N0cmVhbS5MZW5ndGggIT0gMCkgeworCQkJCWJ5dGVbXSBuZXdCdWYgPSBuZXcgYnl0ZVtvc3RyZWFtLkxlbmd0aF07CisJCQkJQXJyYXkuQ29weSAob3N0cmVhbS5HZXRCdWZmZXIgKCksIG5ld0J1Ziwgb3N0cmVhbS5MZW5ndGgpOworCQkJCWRlYnVnIChzdHJpbmcuRm9ybWF0ICgiU2VydmVyX1NlcnZlT25lIHNlbmRpbmcgezB9YiIsIG9zdHJlYW0uTGVuZ3RoKSk7CisJCQkJX3NvY2tldC5TZW5kIChuZXdCdWYpOworCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgU2VydmUgKCkKKwkJeworCQkJd2hpbGUgKHRydWUpCisJCQkJU2VydmVPbmUgKCk7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODBhZDFkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qCkBAIC0wLDAgKzEsOTEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj54ODY8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8Um9vdE5hbWVzcGFjZT5abXFTZXJ2ZXI8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRaTVE8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfHg4NicgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1ZzwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPEV4dGVybmFsY29uc29sZT50cnVlPC9FeHRlcm5hbGNvbnNvbGU+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8eDg2JyAiPgorICAgIDxEZWJ1Z1R5cGU+bm9uZTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2U8L091dHB1dFBhdGg+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPEV4dGVybmFsY29uc29sZT50cnVlPC9FeHRlcm5hbGNvbnNvbGU+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iY2xyem1xLCBWZXJzaW9uPTIuMS4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPXg4NiI+CisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+CisgICAgICA8SGludFBhdGg+LlxjbHJ6bXEuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwiPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgICAgPEhpbnRQYXRoPi4uXC4uXC4uXGxpYlxjc2hhcnBcVGhyaWZ0LmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1haW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRabXFTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFptcUNsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFN0b3JhZ2UuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuc2xuIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5zbG4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmFmNTdiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuc2xuCkBAIC0wLDAgKzEsNDIgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFpNUSIsICJUaHJpZnRaTVEuY3Nwcm9qIiwgInsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfE1peGVkIFBsYXRmb3JtcyA9IERlYnVnfE1peGVkIFBsYXRmb3JtcworCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zID0gUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXx4ODYKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvc3RvcmFnZS50aHJpZnQgYi9jb250cmliL3plcm9tcS9zdG9yYWdlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVhOTY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvc3RvcmFnZS50aHJpZnQKQEAgLTAsMCArMSw0IEBACitzZXJ2aWNlIFN0b3JhZ2UgeworICBvbmV3YXkgdm9pZCBpbmNyKDE6IGkzMiBhbW91bnQpOworICBpMzIgZ2V0KCk7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5YzI1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcApAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisKKyNpbmNsdWRlICJ6bXEuaHBwIgorI2luY2x1ZGUgIlRabXFDbGllbnQuaCIKKyNpbmNsdWRlICJTdG9yYWdlLmgiCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUWm1xQ2xpZW50OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBjb25zdCBjaGFyKiBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MCI7CisgIGludCBzb2NrdHlwZSA9IFpNUV9SRVE7CisgIGludCBpbmNyID0gMDsKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgaW5jciA9IGF0b2koYXJndlsxXSk7CisgICAgaWYgKGluY3IpIHsKKyAgICAgIHNvY2t0eXBlID0gWk1RX1BVU0g7CisgICAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MSI7CisgICAgfQorICB9CisKKyAgem1xOjpjb250ZXh0X3QgY3R4KDEpOworICBzaGFyZWRfcHRyPFRabXFDbGllbnQ+IHRyYW5zcG9ydChuZXcgVFptcUNsaWVudChjdHgsIGVuZHBvaW50LCBzb2NrdHlwZSkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgU3RvcmFnZUNsaWVudCBjbGllbnQocHJvdG9jb2wpOworICB0cmFuc3BvcnQtPm9wZW4oKTsKKworICBpZiAoaW5jcikgeworICAgIGNsaWVudC5pbmNyKGluY3IpOworICAgIHVzbGVlcCg1MDAwMCk7CisgIH0gZWxzZSB7CisgICAgaW50IHZhbHVlID0gY2xpZW50LmdldCgpOworICAgIHN0ZDo6Y291dCA8PCB2YWx1ZSA8PCBzdGQ6OmVuZGw7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5IGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDUxMjE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5CkBAIC0wLDAgKzEsMzYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB6bXEKK2ltcG9ydCBUWm1xQ2xpZW50CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbAoraW1wb3J0IHN0b3JhZ2UudHR5cGVzCitpbXBvcnQgc3RvcmFnZS5TdG9yYWdlCisKKworZGVmIG1haW4oYXJncyk6CisgICAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTAiCisgICAgc29ja3R5cGUgPSB6bXEuUkVRCisgICAgaW5jciA9IDAKKyAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICBpbmNyID0gaW50KGFyZ3NbMV0pCisgICAgICAgIGlmIGluY3I6CisgICAgICAgICAgICBzb2NrdHlwZSA9IHptcS5QVVNICisgICAgICAgICAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MSIKKworICAgIGN0eCA9IHptcS5Db250ZXh0KCkKKyAgICB0cmFuc3BvcnQgPSBUWm1xQ2xpZW50LlRabXFDbGllbnQoY3R4LCBlbmRwb2ludCwgc29ja3R5cGUpCisgICAgcHJvdG9jb2wgPSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zcG9ydCkKKyAgICBjbGllbnQgPSBzdG9yYWdlLlN0b3JhZ2UuQ2xpZW50KHByb3RvY29sKQorICAgIHRyYW5zcG9ydC5vcGVuKCkKKworICAgIGlmIGluY3I6CisgICAgICAgIGNsaWVudC5pbmNyKGluY3IpCisgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKKyAgICBlbHNlOgorICAgICAgICB2YWx1ZSA9IGNsaWVudC5nZXQoKQorICAgICAgICBwcmludCh2YWx1ZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjViZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcApAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSAiem1xLmhwcCIKKyNpbmNsdWRlICJUWm1xU2VydmVyLmgiCisjaW5jbHVkZSAiU3RvcmFnZS5oIgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcU11bHRpU2VydmVyOworCitjbGFzcyBTdG9yYWdlSGFuZGxlciA6IHZpcnR1YWwgcHVibGljIFN0b3JhZ2VJZiB7CisgcHVibGljOgorICBTdG9yYWdlSGFuZGxlcigpCisgICAgOiB2YWx1ZV8oMCkKKyAge30KKworICB2b2lkIGluY3IoY29uc3QgaW50MzJfdCBhbW91bnQpIHsKKyAgICB2YWx1ZV8gKz0gYW1vdW50OworICAgIHByaW50ZigidmFsdWVfOiAlaVxuIiwgdmFsdWVfKSA7CisgIH0KKworICBpbnQzMl90IGdldCgpIHsKKyAgICByZXR1cm4gdmFsdWVfOworICB9CisKKyBwcml2YXRlOgorICBpbnQzMl90IHZhbHVlXzsKKworfTsKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgIHNoYXJlZF9wdHI8U3RvcmFnZUhhbmRsZXI+IGhhbmRsZXIobmV3IFN0b3JhZ2VIYW5kbGVyKCkpOworICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgU3RvcmFnZVByb2Nlc3NvcihoYW5kbGVyKSk7CisKKyAgem1xOjpjb250ZXh0X3QgY3R4KDEpOworICBUWm1xU2VydmVyIG9uZXdheV9zZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJlcGdtOi8vZXRoMDsyMzkuMTkyLjEuMTo1NTU1IiwgWk1RX1NVQik7CisgIG9uZXdheV9zZXJ2ZXIuc2VydmUoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzA4NmExCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZW5kZXIuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKworI2luY2x1ZGUgInptcS5ocHAiCisjaW5jbHVkZSAiVFptcUNsaWVudC5oIgorI2luY2x1ZGUgIlN0b3JhZ2UuaCIKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRabXFDbGllbnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGNvbnN0IGNoYXIqIGVuZHBvaW50ID0gImVwZ206Ly9ldGgwOzIzOS4xOTIuMS4xOjU1NTUiOworICBpbnQgc29ja3R5cGUgPSBaTVFfUFVCOworICBpbnQgaW5jciA9IDE7CisgIGlmIChhcmdjID4gMSkgeworICAgIGluY3IgPSBhdG9pKGFyZ3ZbMV0pOworICB9CisKKyAgem1xOjpjb250ZXh0X3QgY3R4KDEpOworICBzaGFyZWRfcHRyPFRabXFDbGllbnQ+IHRyYW5zcG9ydChuZXcgVFptcUNsaWVudChjdHgsIGVuZHBvaW50LCBzb2NrdHlwZSkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgU3RvcmFnZUNsaWVudCBjbGllbnQocHJvdG9jb2wpOworCisgIHRyYW5zcG9ydC0+b3BlbigpOworCisgIGNsaWVudC5pbmNyKGluY3IpOworICB1c2xlZXAoNTAwMDApOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjFiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5jcHAKQEAgLTAsMCArMSw0MyBAQAorI2luY2x1ZGUgInptcS5ocHAiCisjaW5jbHVkZSAiVFptcVNlcnZlci5oIgorI2luY2x1ZGUgIlN0b3JhZ2UuaCIKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcVNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFNdWx0aVNlcnZlcjsKKworY2xhc3MgU3RvcmFnZUhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyBTdG9yYWdlSWYgeworIHB1YmxpYzoKKyAgU3RvcmFnZUhhbmRsZXIoKQorICAgIDogdmFsdWVfKDApCisgIHt9CisKKyAgdm9pZCBpbmNyKGNvbnN0IGludDMyX3QgYW1vdW50KSB7CisgICAgdmFsdWVfICs9IGFtb3VudDsKKyAgfQorCisgIGludDMyX3QgZ2V0KCkgeworICAgIHJldHVybiB2YWx1ZV87CisgIH0KKworIHByaXZhdGU6CisgIGludDMyX3QgdmFsdWVfOworCit9OworCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgc2hhcmVkX3B0cjxTdG9yYWdlSGFuZGxlcj4gaGFuZGxlcihuZXcgU3RvcmFnZUhhbmRsZXIoKSk7CisgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBTdG9yYWdlUHJvY2Vzc29yKGhhbmRsZXIpKTsKKworICB6bXE6OmNvbnRleHRfdCBjdHgoMSk7CisgIFRabXFTZXJ2ZXIgcmVxcmVwX3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MCIsIFpNUV9SRVApOworICBUWm1xU2VydmVyIG9uZXdheV9zZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTEiLCBaTVFfUFVMTCk7CisgIFRabXFNdWx0aVNlcnZlciBtdWx0aXNlcnZlcjsKKyAgbXVsdGlzZXJ2ZXIuc2VydmVycygpLnB1c2hfYmFjaygmcmVxcmVwX3NlcnZlcik7CisgIG11bHRpc2VydmVyLnNlcnZlcnMoKS5wdXNoX2JhY2soJm9uZXdheV9zZXJ2ZXIpOworICBtdWx0aXNlcnZlci5zZXJ2ZUZvcmV2ZXIoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5IGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDg5YjM3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5CkBAIC0wLDAgKzEsMzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgoraW1wb3J0IHptcQoraW1wb3J0IFRabXFTZXJ2ZXIKK2ltcG9ydCBzdG9yYWdlLnR0eXBlcworaW1wb3J0IHN0b3JhZ2UuU3RvcmFnZQorCisKK2NsYXNzIFN0b3JhZ2VIYW5kbGVyKHN0b3JhZ2UuU3RvcmFnZS5JZmFjZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlID0gMAorCisgICAgZGVmIGluY3Ioc2VsZiwgYW1vdW50KToKKyAgICAgICAgc2VsZi52YWx1ZSArPSBhbW91bnQKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisKKworZGVmIG1haW4oKToKKyAgICBoYW5kbGVyID0gU3RvcmFnZUhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IHN0b3JhZ2UuU3RvcmFnZS5Qcm9jZXNzb3IoaGFuZGxlcikKKworICAgIGN0eCA9IHptcS5Db250ZXh0KCkKKyAgICByZXFyZXBfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkwIiwgem1xLlJFUCkKKyAgICBvbmV3YXlfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkxIiwgem1xLlBVTEwpCisgICAgbXVsdGlzZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFNdWx0aVNlcnZlcigpCisgICAgbXVsdGlzZXJ2ZXIuc2VydmVycy5hcHBlbmQocmVxcmVwX3NlcnZlcikKKyAgICBtdWx0aXNlcnZlci5zZXJ2ZXJzLmFwcGVuZChvbmV3YXlfc2VydmVyKQorICAgIG11bHRpc2VydmVyLnNlcnZlRm9yZXZlcigpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2RlYmlhbi9SRUFETUUubWQgYi9kZWJpYW4vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmZlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDEgQEAKKyMjIFNvbWUgdGlwcyBvbiBEZWJpYW4gUGFja2FnaW5nCisKKy0gRGViaWFuIE5ldyBNYWludGFpbmVycycgR3VpZGUgW2h0dHA6Ly93d3cuZGViaWFuLm9yZy9kb2MvZGViaWFuLXBvbGljeS9dCistIERlYmlhbiBQb2xpY3kgTWFudWFsIFtodHRwOi8vd3d3LmRlYmlhbi5vcmcvZG9jL21hbnVhbHMvbWFpbnQtZ3VpZGUvXQorLSBNYWNoaW5lLXJlYWRhYmxlIGRlYmlhbi9jb3B5cmlnaHQgZmlsZSBbaHR0cDovL2RlcC5kZWJpYW4ubmV0L2RlcHMvZGVwNS9dCistIERlYlNyYyAzLjAgZ3VpZGVsaW5lcyBbaHR0cHM6Ly93aWtpLmRlYmlhbi5vcmcvUHJvamVjdHMvRGViU3JjMy4wXQorCisKKyMjIEJ1aWxkIHVzaW5nIGRwa2ctYnVpbGRwYWNrYWdlOgorCitgYGBiYXNoCiskIGRwa2ctYnVpbGRwYWNrYWdlIC1kIC10YworICAtZCAgICMgZG8gbm90IGNoZWNrIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgY29uZmxpY3RzLgorICAtdGMgICMgY2xlYW4gc291cmNlIHRyZWUgd2hlbiBmaW5pc2hlZC4KK2BgYAorCisKKyMjIFVwZGF0ZSBjaGFuZ2Vsb2c6CisKK2BgYGJhc2gKKyQgZGF0ZSAtUgorYGBgCisKK09uZSBjYW4gYWxzbyBpbnN0YWxsIGBkZXZzY3JpcHRzYCBwYWNrYWdlIGFuZCBydW46CisKK2BgYGJhc2gKKyQgZGNoIC1pCitgYGAKKworCisjIyBDaGVjayBwYWNrYWdlczoKKworYGBgYmFzaAorJCBkcGtnIC1jICouZGViCiskIGxpbnRpYW4gKi5kZWIKK2BgYAorCisKKyMjIFRPRE8KKworTWFrZSBpdCBwZXJmZWN0IQpkaWZmIC0tZ2l0IGEvZGViaWFuL2NoYW5nZWxvZyBiL2RlYmlhbi9jaGFuZ2Vsb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliNWYyMAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9jaGFuZ2Vsb2cKQEAgLTAsMCArMSw4MyBAQAordGhyaWZ0ICgwLjEyLjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjEyLjAKKworIC0tIEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiAgV2VkLCAyOCBEZWMgMjAxOCAxMjowMDowMCAtMDUwMAorCit0aHJpZnQgKDAuMTEuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuMTEuMAorCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAwNyBEZWMgMjAxNyAyMDowNzowMCAtMDUwMAorCit0aHJpZnQgKDAuMTAuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuMTAuMAorCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAwMyBKYW4gMjAxNyAxNjo1MjowMCAtMDUwMAorCit0aHJpZnQgKDAuOS4zKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC45LjMKKworIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMTEgT2N0IDIwMTUgMTc6MjI6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjkuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuOS4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDEwIE9jdCAyMDEyIDEyOjAwOjAwIC0wNTAwCisKK3RocmlmdCAoMC43LjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjcuMAorCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgVHVlLCAxMCBBdWcgMjAxMSAxNzowMTo1MyAtMDUwMAorCit0aHJpZnQgKDAuNy4wLWRldjEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKyAgKiBhZGRlZCBnbGliCisgICogZml4IGxvY2F0aW9uIG9mIGxpYnRocmlmdC5qYXIKKworIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgVHVlLCAxMiBBcHIgMjAxMSAyMTo0MToxOCArMDIwMAorCit0aHJpZnQgKDAuNi4wLWRldjEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB2ZXJzaW9uIGZpZWxkCisgICogYWRkZWQgZGViaWFuIGZvbGRlciB0byB0aHJpZnQvY29udHJpYgorICAqIGNoYW5nZWQgYSBmZXcgZGV0YWlscyBpbiBjb250cm9sIGZpbGUKKyAgKiB1cGRhdGUgY29weXJpZ2h0IGZpbGUKKworIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgVHVlLCAxNCBEZWMgMjAxMCAxMjoxMjozMyAtMDgwMAorCit0aHJpZnQgKDAuNS4wK25tdTIpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5vbi1tYWludGFpbmVyIHVwbG9hZC4KKyAgKiBNZXJnZWQgVEhSSUZULTcxX3Y5LnBhdGNoIHRvIHNraXAgLi9ib290c3RyYXAuc2ggaWYgbm90IGV4aXN0cy4KKyAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvc2VjdXJlL2F0dGFjaG1lbnQvMTI0NjUzNjAvVEhSSUZULTcxX3Y5LnBhdGNoCisKKyAtLSBZYW1hc2hpdGEgWXV1IDx5YW1hc2hpdGFAZ2Vpc2hhdG9reW8uY29tPiAgVHVlLCAwNyBEZWMgMjAxMCAxNTowMDo1NSArMDkwMAorCit0aHJpZnQgKDAuNS4wK25tdTEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5vbi1tYWludGFpbmVyIHVwbG9hZC4KKyAgKiBJbXBvcnRlZCBwYWNrYWdlIGluZm9ybWF0aW9uIGZvciBwaHA1LXRocmlmdCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1wbGVnZW8vdGhyaWZ0LgorCisgLS0gWWFtYXNoaXRhIFl1dSA8eWFtYXNoaXRhQGdlaXNoYXRva3lvLmNvbT4gIFR1ZSwgMDcgRGVjIDIwMTAgMDE6MDA6MTcgKzA5MDAKKwordGhyaWZ0ICgwLjUuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuNS4wCisKKyAtLSBSb2dlciBNZWllciA8cm9nZXJAYXBhY2hlLm9yZz4gIEZyaSwgMDggT2N0IDIwMTAgMTE6MjM6NTMgKzAyMDAKKwordGhyaWZ0ICgwLjQuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuNC4wCisKKyAtLSBSb2dlciBNZWllciA8cm9nZXJAYnVmZmVyb3ZlcmZsb3cuY2g+ICBTdW4sIDIyIEF1ZyAyMDEwIDIxOjI2OjAwICswMTAwCisKK3RocmlmdCAoMC4yMDA4LjEyLjMwfjguMDQpIGhhcmR5OyB1cmdlbmN5PWxvdworCisgICogSW5pdGlhbCByZWxlYXNlLgorCisgLS0gRXN0ZXZlIEZlcm5hbmRleiA8ZXN0ZXZlQGZsdWlkaW5mby5jb20+ICBUaHUsIDE1IEphbiAyMDA5IDExOjM0OjI0ICswMTAwCmRpZmYgLS1naXQgYS9kZWJpYW4vY29tcGF0IGIvZGViaWFuL2NvbXBhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzYzNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2NvbXBhdApAQCAtMCwwICsxIEBACis5CmRpZmYgLS1naXQgYS9kZWJpYW4vY29udHJvbCBiL2RlYmlhbi9jb250cm9sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MThhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY29udHJvbApAQCAtMCwwICsxLDIwMiBAQAorU291cmNlOiB0aHJpZnQKK1NlY3Rpb246IGRldmVsCitQcmlvcml0eTogZXh0cmEKK0J1aWxkLURlcGVuZHM6IGRlYmhlbHBlciAoPj0gOSksIGJ1aWxkLWVzc2VudGlhbCwgbW9uby1tY3MsIHB5dGhvbi1kZXYsIGFudCwKKyAgICBtb25vLWRldmVsLCAgbGlibW9uby1zeXN0ZW0td2ViNC4wLWNpbCwgZXJsYW5nLWJhc2UsIHJ1YnktZGV2IHwgcnVieTEuOS4xLWRldiwgcnVieS1idW5kbGVyICxhdXRvY29uZiwgYXV0b21ha2UsCisgICAgcGtnLWNvbmZpZywgbGlidG9vbCwgYmlzb24sIGZsZXgsIGxpYmJvb3N0LWRldiB8IGxpYmJvb3N0MS41My1kZXYgfCBsaWJib29zdDEuNjMtYWxsLWRldiwKKyAgICBweXRob24tYWxsLCBweXRob24tc2V0dXB0b29scywgcHl0aG9uLWFsbC1kZXYsIHB5dGhvbi1hbGwtZGJnLAorICAgIHB5dGhvbjMtYWxsLCBweXRob24zLXNldHVwdG9vbHMsIHB5dGhvbjMtYWxsLWRldiwgcHl0aG9uMy1hbGwtZGJnLAorICAgIG9wZW5qZGstNy1qZGsgfCBvcGVuamRrLTgtamRrIHwgZGVmYXVsdC1qZGssCisgICAgbGliYm9vc3QtdGVzdC1kZXYgfCBsaWJib29zdC10ZXN0MS41My1kZXYgfCBsaWJib29zdC10ZXN0MS42My1kZXYsIGxpYmV2ZW50LWRldiwgbGlic3NsLWRldiwgcGVybCAoPj0gNS44LjAtNyksCisgICAgcGhwICg+PSA1KSwgcGhwLWRldiAoPj0gNSksIGxpYmdsaWIyLjAtZGV2LCBxdGNob29zZXIsIHF0YmFzZTUtZGV2LXRvb2xzCitNYWludGFpbmVyOiBUaHJpZnQgRGV2ZWxvcGVyJ3MgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvCitWY3MtR2l0OiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQKK1Zjcy1Ccm93c2VyOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorU3RhbmRhcmRzLVZlcnNpb246IDMuOS43CitYLVB5dGhvbi1WZXJzaW9uOiA+PSAyLjYKK1gtUHl0aG9uMy1WZXJzaW9uOiA+PSAzLjMKKworUGFja2FnZTogdGhyaWZ0LWNvbXBpbGVyCitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IENvbXBpbGVyIGZvciBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlcworIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBUaHJpZnQgY29tcGlsZXIgdGhhdCBpcyB1c2VkIGZvciB0cmFuc2xhdGluZworIGZyb20gLnRocmlmdCBmaWxlcyAoY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMpIHRvIHRoZSBsYW5ndWFnZSBiaW5kaW5nCisgZm9yIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLgorCitQYWNrYWdlOiBweXRob24tdGhyaWZ0CitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogcHl0aG9uCitEZXBlbmRzOiAke3B5dGhvbjpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgcHl0aG9uLXNpeAorUmVjb21tZW5kczogcHl0aG9uLXR3aXN0ZWQtd2ViLCBweXRob24tYmFja3BvcnRzLnNzbC1tYXRjaC1ob3N0bmFtZSwgcHl0aG9uLWlwYWRkcmVzcworUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChQeXRob24gMikKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUHl0aG9uCisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKyAuCisgVGhpcyBwYWNrYWdlIGluc3RhbGxzIHRoZSBsaWJyYXJ5IGZvciBQeXRob24gMi4KKworUGFja2FnZTogcHl0aG9uLXRocmlmdC1kYmcKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBkZWJ1ZworRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgcHl0aG9uLXRocmlmdCAoPSAke2JpbmFyeTpWZXJzaW9ufSksIHB5dGhvbi1hbGwtZGJnCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKGRlYnVnIHZlcnNpb24pCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IHdpdGggZGVidWdnaW5nIHN5bWJvbHMuCisgWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0IHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyCisgZGVmaW5pdGlvbiB0byBQeXRob24gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cKKyB5b3UgdG8gdXNlIHRob3NlIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKworUGFja2FnZTogcHl0aG9uMy10aHJpZnQKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBweXRob24KK0RlcGVuZHM6ICR7cHl0aG9uMzpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgcHl0aG9uMy1zaXgKK1JlY29tbWVuZHM6IHB5dGhvbjMtdHdpc3RlZC13ZWIKK1Byb3ZpZGVzOiAke3B5dGhvbjpQcm92aWRlc30KK0Rlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoUHl0aG9uIDMpCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFB5dGhvbgorIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisgLgorIFRoaXMgcGFja2FnZSBpbnN0YWxscyB0aGUgbGlicmFyeSBmb3IgUHl0aG9uIDMuCisKK1BhY2thZ2U6IHB5dGhvbjMtdGhyaWZ0LWRiZworQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IGRlYnVnCitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24zLXRocmlmdCAoPSAke2JpbmFyeTpWZXJzaW9ufSksIHB5dGhvbjMtYWxsLWRiZworUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChkZWJ1ZyB2ZXJzaW9uKQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCB3aXRoIGRlYnVnZ2luZyBzeW1ib2xzLgorIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdCB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91cgorIGRlZmluaXRpb24gdG8gUHl0aG9uIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93CisgeW91IHRvIHVzZSB0aG9zZSBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IHJ1YnktdGhyaWZ0CitBcmNoaXRlY3R1cmU6IGFsbAorU2VjdGlvbjogbGlicworRGVwZW5kczogcnVieSB8IHJ1YnktaW50ZXJwcmV0ZXIsICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KK1Byb3ZpZGVzOiBsaWJ0aHJpZnQtcnVieQorUmVwbGFjZXM6IGxpYnRocmlmdC1ydWJ5CitCcmVha3M6IGxpYnRocmlmdC1ydWJ5CitEZXNjcmlwdGlvbjogUnVieSBiaW5kaW5ncyBmb3IgVGhyaWZ0CisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFJ1YnkgYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBSdWJ5CisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKworUGFja2FnZTogbGlidGhyaWZ0LWphdmEKK0FyY2hpdGVjdHVyZTogYWxsCitTZWN0aW9uOiBqYXZhCitEZXBlbmRzOiAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBKYXZhIGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgSmF2YSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIEphdmEKKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBsaWJ0aHJpZnQtY2lsCitBcmNoaXRlY3R1cmU6IGFsbAorU2VjdGlvbjogY2xpLW1vbm8KK0RlcGVuZHM6IGNsaS1jb21tb24sIGxpYm1vbm8tY29ybGliNC4wLWNpbCAoPj0gMi4xMCkgfCBsaWJtb25vLWNvcmxpYjQuNS1jaWwgKD49My4yKSwgbGlibW9uby1zeXN0ZW00LjAtY2lsICg+PSAyLjEwKSwKKyAgICBsaWJtb25vLXN5c3RlbS13ZWI0LjAtY2lsICg+PSAyLjEwKSwgJHttaXNjOkRlcGVuZHN9CitEZXNjcmlwdGlvbjogQ0xJIGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgQ0xJIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gQyMKKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBsaWJ0aHJpZnQtcGVybAorQXJjaGl0ZWN0dXJlOiBhbGwKK1NlY3Rpb246IHBlcmwKK0RlcGVuZHM6IHBlcmwgKD49IDUuOC4wLTcpLCAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBQZXJsIGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUGVybCBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFBlcmwKKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBsaWJ0aHJpZnQwCitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IFRocmlmdCBDKysgbGlicmFyeQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBydW50aW1lIGxpYnJhcmllcyBuZWVkZWQgZm9yIEMrKyBhcHBsaWNhdGlvbnMKKyB1c2luZyBUaHJpZnQuCisKK1BhY2thZ2U6IGxpYnRocmlmdDAtZGJnCitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogZGVidWcKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAgKD0gJHtiaW5hcnk6VmVyc2lvbn0pCitEZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5IGRlYnVnIHN5bWJvbHMKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZGVidWcgc3ltYm9scyBmb3IgdGhlIFRocmlmdCBDKysgcnVudGltZSBsaWJyYXJpZXMuCisKK1BhY2thZ2U6IGxpYnRocmlmdC1kZXYKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBsaWJkZXZlbAorRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgbGlidGhyaWZ0MCAoPSAke2JpbmFyeTpWZXJzaW9ufSksIGxpYmdsaWIyLjAtZGV2CitEZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5IChkZXZlbG9wbWVudCBoZWFkZXJzKQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZXZlbG9wbWVudCBsaWJyYXJpZXMgcmVxdWlyZWQgZm9yIHdyaXRpbmcgQysrCisgYXBwbGljYXRpb25zIHVzaW5nIFRocmlmdC4KKworUGFja2FnZTogcGhwNS10aHJpZnQKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBwaHAKK0RlcGVuZHM6ICR7cGhwOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9CitQcm92aWRlczogJHtwaHA6UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUEhQIGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUEhQIGJpbmRpbmdzIGZvciBUaHJpZnQuCmRpZmYgLS1naXQgYS9kZWJpYW4vY29weXJpZ2h0IGIvZGViaWFuL2NvcHlyaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA2NDNjCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2NvcHlyaWdodApAQCAtMCwwICsxLDEyOSBAQAorVGhpcyBwYWNrYWdlIHdhcyBkZWJpYW5pemVkIGJ5IFRocmlmdCBEZXZlbG9wZXIncyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPi4KKworCitUaGlzIHBhY2thZ2UgYW5kIHRoZSBEZWJpYW4gcGFja2FnaW5nIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwKK3NlZSBgL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvQXBhY2hlLTIuMCcuCisKK1RoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gd2FzIGNvcGllZCBmcm9tIEFwYWNoZSBUaHJpZnQgTElDRU5TRSBmaWxlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU09GVFdBUkUgRElTVFJJQlVURUQgV0lUSCBUSFJJRlQ6CisKK1RoZSBBcGFjaGUgVGhyaWZ0IHNvZnR3YXJlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aAorc2VwYXJhdGUgY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuIFlvdXIgdXNlIG9mIHRoZSBzb3VyY2UKK2NvZGUgZm9yIHRoZSB0aGVzZSBzdWJjb21wb25lbnRzIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUG9ydGlvbnMgb2YgdGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlOgorCisgIGxpYi9lcmwvc3JjL01ha2VmaWxlLmFtCisKK1BsZWFzZSBzZWUgZG9jL290cC1iYXNlLWxpY2Vuc2UudHh0IGZvciB0aGUgZnVsbCB0ZXJtcyBvZiB0aGlzIGxpY2Vuc2UuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBmb2xsb3dpbmcgZmlsZXMgY29udGFpbiBzb21lIHBvcnRpb25zIG9mIGNvZGUgY29udHJpYnV0ZWQgdW5kZXIKK3RoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZSAoc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0KSwgYW5kIHJlbGljZW5zZWQKK3VuZGVyIHRoZSBBcGFjaGUgMi4wIExpY2Vuc2U6CisKKyAgY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9tYWluLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oCisgIGNvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9wcm9ncmFtLmgKKyAgY29tcGlsZXIvY3BwL3NyYy9wbGF0Zm9ybS5oCisgIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbAorICBjb21waWxlci9jcHAvc3JjL3RocmlmdHkueXkKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RGaWVsZC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWFwLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlVHlwZS5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU2V0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MKKyAgbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKKyAgbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MKKyAgbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCisgIGxpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcworICBsaWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCisgIGxpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KKyAgbGliL2NzaGFycC9zcmMvVFByb2Nlc3Nvci5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKKyAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdEJ1aWxkLmNzCisgIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qCisgIGxpYi9yYi9saWIvdGhyaWZ0LnJiCisgIGxpYi9zdC9SRUFETUUKKyAgbGliL3N0L3RocmlmdC5zdAorICB0ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcAorICB0ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorICB0ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIGFjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBhbmQgY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgY29tcG9uZW50czoKKworIyAgIENvcHlyaWdodCAoYykgMjAwNyBUaG9tYXMgUG9yc2NoYmVyZyA8dGhvbWFzQHJhbmRzcHJpbmdlci5kZT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQKKyMgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQKKyMgICB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgY29tcGlsZXIvY3BwL3NyYy9tZDUuW2NoXSBjb21wb25lbnRzOgorCisvKgorICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEwuIFBldGVyIERldXRzY2gKKyAgZ2hvc3RAYWxhZGRpbi5jb20KKworICovCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBsaWIvcmIvc2V0dXAucmI6IENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1pbmVybyBBb2tpLAorbGliL29jYW1sL09DYW1sTWFrZWZpbGUgYW5kIGxpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZSBjb21wb25lbnRzOgorICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDA3ICBNYXJrdXMgTW90dGwKKworTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgMi4xCisoc2VlIGRvYy9sZ3BsLTIuMS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZSkKZGlmZiAtLWdpdCBhL2RlYmlhbi9kaXJzIGIvZGViaWFuL2RpcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4ODJiYgotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9kaXJzCkBAIC0wLDAgKzEsMiBAQAordXNyL2JpbgordXNyL3NiaW4KZGlmZiAtLWdpdCBhL2RlYmlhbi9kb2NzIGIvZGViaWFuL2RvY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzYmY4NgotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9kb2NzCkBAIC0wLDAgKzEgQEAKK1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvZGViaWFuL2xpYnRocmlmdC1kZXYuaW5zdGFsbCBiL2RlYmlhbi9saWJ0aHJpZnQtZGV2Lmluc3RhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiNTIyMwotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9saWJ0aHJpZnQtZGV2Lmluc3RhbGwKQEAgLTAsMCArMSw0IEBACit1c3IvbGliLyouYQordXNyL2xpYi8qLmxhCit1c3IvbGliL3BrZ2NvbmZpZwordXNyL2luY2x1ZGUKZGlmZiAtLWdpdCBhL2RlYmlhbi9saWJ0aHJpZnQwLmluc3RhbGwgYi9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzRlZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsCkBAIC0wLDAgKzEsNSBAQAordXNyL2xpYi9saWJ0aHJpZnQuc28qCit1c3IvbGliL2xpYnRocmlmdC0qLnNvKgordXNyL2xpYi9saWJ0aHJpZnRuYiouc28qCit1c3IvbGliL2xpYnRocmlmdHF0Ki5zbyoKK3Vzci9saWIvbGlidGhyaWZ0eiouc28qCmRpZmYgLS1naXQgYS9kZWJpYW4vcGhwNS10aHJpZnQuZGlycyBiL2RlYmlhbi9waHA1LXRocmlmdC5kaXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTNhMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vcGhwNS10aHJpZnQuZGlycwpAQCAtMCwwICsxIEBACitldGMvcGhwNS9jb25mLmQKZGlmZiAtLWdpdCBhL2RlYmlhbi9ydWxlcyBiL2RlYmlhbi9ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YjQzNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL3J1bGVzCkBAIC0wLDAgKzEsMjI4IEBACisjIS91c3IvYmluL21ha2UgLWYKKyMgLSotIG1ha2VmaWxlIC0qLQorIyBTYW1wbGUgZGViaWFuL3J1bGVzIHRoYXQgdXNlcyBkZWJoZWxwZXIuCisjCisjIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEpvZXkgSGVzcyBhbmQgQ3JhaWcgU21hbGwuCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBkaC1tYWtlIGludG8gYQorIyBkaC1tYWtlIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCisjIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IENyYWlnIFNtYWxsIGluIHZlcnNpb24gMC4zNyBvZiBkaC1tYWtlLgorIworIyBNb2RpZmllZCB0byBtYWtlIGEgdGVtcGxhdGUgZmlsZSBmb3IgYSBtdWx0aS1iaW5hcnkgcGFja2FnZSB3aXRoIHNlcGFyYXRlZAorIyBidWlsZC1hcmNoIGFuZCBidWlsZC1pbmRlcCB0YXJnZXRzICBieSBCaWxsIEFsbG9tYmVydCAyMDAxCisKKyMgVW5jb21tZW50IHRoaXMgdG8gdHVybiBvbiB2ZXJib3NlIG1vZGUuCisjZXhwb3J0IERIX1ZFUkJPU0U9MQorCisjIFRoaXMgaGFzIHRvIGJlIGV4cG9ydGVkIHRvIG1ha2Ugc29tZSBtYWdpYyBiZWxvdyB3b3JrLgorZXhwb3J0IERIX09QVElPTlMKKworUFlWRVJTIDo9ICQoc2hlbGwgcHl2ZXJzaW9ucyAtcikKKworZXhwb3J0IENQUEZMQUdTOj0kKHNoZWxsIGRwa2ctYnVpbGRmbGFncyAtLWdldCBDUFBGTEFHUykKK2V4cG9ydCBDRkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IENGTEFHUykKK2V4cG9ydCBDWFhGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgQ1hYRkxBR1MpCitleHBvcnQgTERGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgTERGTEFHUykKKworY29uZmlndXJlOiBjb25maWd1cmUtc3RhbXAKK2NvbmZpZ3VyZS1zdGFtcDoKKwlkaF90ZXN0ZGlyCisKKwkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZS4KKwlpZiBbIC1mIGJvb3RzdHJhcC5zaCBdOyB0aGVuICQoQ1VSRElSKS9ib290c3RyYXAuc2g7IGZpCisJJChDVVJESVIpL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyIC0tZW5hYmxlLXBsdWdpbj1ubworCisJdG91Y2ggY29uZmlndXJlLXN0YW1wCisKKworI0FyY2hpdGVjdHVyZQorYnVpbGQ6IGJ1aWxkLWFyY2ggYnVpbGQtaW5kZXAKKwkjIFRlc3RzIGRpc2FibGVkCisJIyAkKE1BS0UpIC1DIHRlc3QgY2hlY2sKKworYnVpbGQtYXJjaDogYnVpbGQtYXJjaC1zdGFtcAorJChDVVJESVIpL2NvbXBpbGVyL2NwcC90aHJpZnQgYnVpbGQtYXJjaC1zdGFtcDogY29uZmlndXJlLXN0YW1wCisKKwkjIENvbXBpbGUgY29tcGlsZXIKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9jb21waWxlci9jcHAKKworCSMgQ29tcGlsZSBDKysgbGlicmFyeQorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jcHAKKworCSMgQ29tcGlsZSBDIChnbGliKSBsaWJyYXJ5CisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL2NfZ2xpYgorCisJIyBQeXRob24gbGlicmFyeQorCWNkICQoQ1VSRElSKS9saWIvcHkgJiYgXAorICAgIGZvciBweSBpbiAkKFBZVkVSUyk7IGRvICBcCisgICAgICAgICQkcHkgc2V0dXAucHkgYnVpbGQ7IFwKKyAgICAgICAgJCRweS1kYmcgc2V0dXAucHkgYnVpbGQ7IFwKKyAgICBkb25lCisKKwkjIFBIUAorCWNkICQoQ1VSRElSKS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sICYmIFwKKwkJcGhwaXplICYmIFwKKwkJLi9jb25maWd1cmUgJiYgJChNQUtFKQorCisJdG91Y2ggJEAKKworYnVpbGQtaW5kZXA6IGJ1aWxkLWluZGVwLXN0YW1wCitidWlsZC1pbmRlcC1zdGFtcDogY29uZmlndXJlLXN0YW1wICQoQ1VSRElSKS9jb21waWxlci9jcHAvdGhyaWZ0CisKKwkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGNvbXBpbGUgdGhlIGluZGVwIHBhcnQgb2YgdGhlIHBhY2thZ2UuCisJIyQoTUFLRSkgZG9jCisKKwkjIEphdmEKKwljZCAkKENVUkRJUikvbGliL2phdmEgJiYgXAorCQkuL2dyYWRsZXcgLS1uby1kYWVtb24gLVByZWxlYXNlPXRydWUgamFyCisKKwkjIEMjCisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL2NzaGFycAorCisJIyBSdWJ5CisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3JiCisKKwkjIFBlcmwKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvcGVybCBJTlNUQUxMRElSUz12ZW5kb3IKKworCXRvdWNoICRACisKK2NsZWFuOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCXJtIC1mIGJ1aWxkLWFyY2gtc3RhbXAgYnVpbGQtaW5kZXAtc3RhbXAgY29uZmlndXJlLXN0YW1wCisKKwljZCAkKENVUkRJUikvbGliL3B5ICYmIHB5dGhvbiBzZXR1cC5weSBjbGVhbiAtLWFsbAorCisJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjbGVhbiB1cCBhZnRlciB0aGUgYnVpbGQgcHJvY2Vzcy4KKwktJChNQUtFKSBjbGVhbgorCisJJChDVVJESVIpL2NsZWFudXAuc2gKKworCWRoX2NsZWFuCisKK2luc3RhbGw6IGluc3RhbGwtaW5kZXAgaW5zdGFsbC1hcmNoCitpbnN0YWxsLWluZGVwOgorCWRoX3Rlc3RkaXIKKwlkaF90ZXN0cm9vdAorCWRoX3ByZXAgLWkKKwlkaF9pbnN0YWxsZGlycyAtaQorCisJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBpbnN0YWxsIHRoZSBpbmRlcCBwYXJ0IG9mIHRoZSBwYWNrYWdlIGludG8KKwkjIGRlYmlhbi88cGFja2FnZT4tZG9jLgorCSNJTlNUQUxMRE9DIworCisJIyBKYXZhCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtamF2YS91c3Ivc2hhcmUvamF2YS8gJiYgXAorCWNwICQoQ1VSRElSKS9saWIvamF2YS9idWlsZC9saWJzL2xpYnRocmlmdCouamFyIFwKKwkJJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtamF2YS91c3Ivc2hhcmUvamF2YS8KKworCSMgUnVieQorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOS4xICYmIFwKKwljcCAkKENVUkRJUikvbGliL3JiL2xpYi90aHJpZnQucmIgXAorCQkkKENVUkRJUikvZGViaWFuL3J1YnktdGhyaWZ0L3Vzci9saWIvcnVieS8xLjkuMQorCWNwIC1yICQoQ1VSRElSKS9saWIvcmIvbGliL3RocmlmdCBcCisJCSQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOS4xCisKKwkjIEMjCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtY2lsL3Vzci9saWIvY2xpL3RocmlmdC8gJiYgXAorCWNwICQoQ1VSRElSKS9saWIvY3NoYXJwL1RocmlmdC5kbGwgXAorCQkkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1jaWwvdXNyL2xpYi9jbGkvdGhyaWZ0L1RocmlmdC5kbGwKKworCSMgUGVybAorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9wZXJsIGluc3RhbGwgREVTVERJUj0kKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3Ivc2hhcmUKKwltdiAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbC9saWIvcGVybDUgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3Ivc2hhcmUKKwlybWRpciAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbC9saWIKKwlybWRpciAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbAorCisJZGhfaW5zdGFsbCAtaQorCitpbnN0YWxsLWFyY2g6CisJZGhfdGVzdGRpcgorCWRoX3Rlc3Ryb290CisJZGhfY2xlYW4gLWsgLXMKKwlkaF9pbnN0YWxsZGlycyAtcworCisJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBpbnN0YWxsIHRoZSBhcmNoIHBhcnQgb2YgdGhlIHBhY2thZ2UgaW50bworCSMgZGViaWFuL3RtcC4KKwkjJChNQUtFKSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vdGhyaWZ0IGluc3RhbGwKKworCSMgQ29tcGlsZXIKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3RocmlmdC1jb21waWxlci91c3IvYmluICYmIFwKKwljcCAkKENVUkRJUikvY29tcGlsZXIvY3BwL3RocmlmdCBcCisJCSQoQ1VSRElSKS9kZWJpYW4vdGhyaWZ0LWNvbXBpbGVyL3Vzci9iaW4vdGhyaWZ0ICYmIFwKKwlybWRpciAkKENVUkRJUikvZGViaWFuL3RocmlmdC1jb21waWxlci91c3Ivc2JpbgorCisJIyBQeXRob24KKwljZCAkKENVUkRJUikvbGliL3B5ICYmIFwKKwlweXRob24yIHNldHVwLnB5IGluc3RhbGwgLS1pbnN0YWxsLWxheW91dD1kZWIgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQgJiYgXAorCXB5dGhvbjItZGJnIHNldHVwLnB5IGluc3RhbGwgLS1pbnN0YWxsLWxheW91dD1kZWIgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnICYmIFwKKwlweXRob24zIHNldHVwLnB5IGluc3RhbGwgLS1pbnN0YWxsLWxheW91dD1kZWIgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0ICYmIFwKKwlweXRob24zLWRiZyBzZXR1cC5weSBpbnN0YWxsIC0taW5zdGFsbC1sYXlvdXQ9ZGViIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcKKworCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0IC1uYW1lICIqLnB5W2NvXSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQgLW5hbWUgIl9fcHljYWNoZV9fIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWZyCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0LWRiZyAtbmFtZSAiKi5weSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLmVnZy1pbmZvIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLXJmCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1kZXB0aCAtdHlwZSBkIC1lbXB0eSAtZXhlYyBybWRpciB7fSBcOworCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0IC1uYW1lICIqLnB5W2NvXSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0IC1uYW1lICJfX3B5Y2FjaGVfXyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mcgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIl9fcHljYWNoZV9fIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWZyCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtbmFtZSAiKi5weVtjb10iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIioucHkiIC1wcmludDAgfCB4YXJncyAtMCBybSAtZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLW5hbWUgIiouZWdnLWluZm8iIC1wcmludDAgfCB4YXJncyAtMCBybSAtcmYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1kZXB0aCAtdHlwZSBkIC1lbXB0eSAtZXhlYyBybWRpciB7fSBcOworCisJIyBQSFAKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3BocDUtdGhyaWZ0CisJY2QgJChDVVJESVIpL2xpYi9waHAgJiYgXAorCQkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi9waHA1LXRocmlmdCBpbnN0YWxsCisKKwkjIEMrKyBhbmQgQyAoZ2xpYikKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3RtcDsgXAorCWNkICQoQ1VSRElSKS9saWIvY3BwICYmIFwKKwkJJChNQUtFKSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vdG1wIGluc3RhbGwKKwljZCAkKENVUkRJUikvbGliL2NfZ2xpYiAmJiBcCisJCSQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCisKKwlkaF9pbnN0YWxsIC0tc291cmNlZGlyPWRlYmlhbi90bXAgLXMKKworCisjIE11c3Qgbm90IGRlcGVuZCBvbiBhbnl0aGluZy4gVGhpcyBpcyB0byBiZSBjYWxsZWQgYnkKKyMgYmluYXJ5LWFyY2gvYmluYXJ5LWluZGVwCisjIGluIGFub3RoZXIgJ21ha2UnIHRocmVhZC4KK2JpbmFyeS1jb21tb246CisJZGhfdGVzdGRpcgorCWRoX3Rlc3Ryb290CisJZGhfaW5zdGFsbGNoYW5nZWxvZ3MKKwlkaF9pbnN0YWxsZG9jcworCWRoX2luc3RhbGxleGFtcGxlcworCWRoX2luc3RhbGxtYW4KKwlkaF9saW5rCisJZGhfc3RyaXAgLXBsaWJ0aHJpZnQwIC0tZGJnLXBhY2thZ2U9bGlidGhyaWZ0MC1kYmcKKwlkaF9zdHJpcCAtcHB5dGhvbi10aHJpZnQgLS1kYmctcGFja2FnZT1weXRob24tdGhyaWZ0LWRiZworCWRoX3N0cmlwIC1wcHl0aG9uMy10aHJpZnQgLS1kYmctcGFja2FnZT1weXRob24zLXRocmlmdC1kYmcKKwlkaF9zdHJpcCAtcHRocmlmdC1jb21waWxlcgorCWRoX2NvbXByZXNzCisJZGhfZml4cGVybXMKKwlkaF9tYWtlc2hsaWJzCisJZGhfaW5zdGFsbGRlYgorCWRoX3BlcmwKKwlkaF9zaGxpYmRlcHMKKwlkaF9nZW5jb250cm9sCisJZGhfbWQ1c3VtcworCWRoX2J1aWxkZGViCisjIEJ1aWxkIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBwYWNrYWdlcyB1c2luZyB0aGUgY29tbW9uIHRhcmdldC4KK2JpbmFyeS1pbmRlcDogYnVpbGQtaW5kZXAgaW5zdGFsbC1pbmRlcAorCSQoTUFLRSkgLWYgZGViaWFuL3J1bGVzIERIX09QVElPTlM9LWkgYmluYXJ5LWNvbW1vbgorCisjIEJ1aWxkIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCitiaW5hcnktYXJjaDogYnVpbGQtYXJjaCBpbnN0YWxsLWFyY2gKKwllY2hvICJwaHA6RGVwZW5kcz1waHBhcGktJChzaGVsbCBwaHAtY29uZmlnNSAtLXBocGFwaSkiID4gJChDVVJESVIpL2RlYmlhbi9zdWJzdHZhcnMKKwkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1zIGJpbmFyeS1jb21tb24KKworYmluYXJ5OiBiaW5hcnktYXJjaCBiaW5hcnktaW5kZXAKKy5QSE9OWTogYnVpbGQgY2xlYW4gYmluYXJ5LWluZGVwIGJpbmFyeS1hcmNoIGJpbmFyeSBpbnN0YWxsIGluc3RhbGwtaW5kZXAgaW5zdGFsbC1hcmNoIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvZGViaWFuL3N1YnN0dmFycyBiL2RlYmlhbi9zdWJzdHZhcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0MWYyZAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9zdWJzdHZhcnMKQEAgLTAsMCArMSBAQAorcGhwOkRlcGVuZHM9cGhwYXBpLTIwMTIxMjEyCmRpZmYgLS1naXQgYS9kZWJpYW4vdGhyaWZ0LWRvYy5kb2NzIGIvZGViaWFuL3RocmlmdC1kb2MuZG9jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk5NTBjCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL3RocmlmdC1kb2MuZG9jcwpAQCAtMCwwICsxLDIgQEAKKyNET0NTIworCmRpZmYgLS1naXQgYS9kZWJpYW4vdGhyaWZ0LWRvYy5pbnN0YWxsIGIvZGViaWFuL3RocmlmdC1kb2MuaW5zdGFsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk5NTBjCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL3RocmlmdC1kb2MuaW5zdGFsbApAQCAtMCwwICsxLDIgQEAKKyNET0NTIworCmRpZmYgLS1naXQgYS9kb2FwLnJkZiBiL2RvYXAucmRmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiNzZmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2FwLnJkZgpAQCAtMCwwICsxLDE1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIj8+Cis8cmRmOlJERiB4bWw6bGFuZz0iZW4iCisgICAgICAgICB4bWxucz0iaHR0cDovL3VzZWZ1bGluYy5jb20vbnMvZG9hcCMiIAorICAgICAgICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiAKKyAgICAgICAgIHhtbG5zOmFzZmV4dD0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvbnMvYXNmZXh0IyIKKyAgICAgICAgIHhtbG5zOmZvYWY9Imh0dHA6Ly94bWxucy5jb20vZm9hZi8wLjEvIj4KKzwhLS0KKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgICAKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgIDxQcm9qZWN0IHJkZjphYm91dD0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIj4KKyAgICA8Y3JlYXRlZD4yMDEyLTA0LTE0PC9jcmVhdGVkPgorICAgIDxsaWNlbnNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3VzZWZ1bGluYy5jb20vZG9hcC9saWNlbnNlcy9hc2wyMCIgLz4KKyAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgIDxob21lcGFnZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIgLz4KKyAgICA8YXNmZXh0OnBtYyByZGY6cmVzb3VyY2U9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIgLz4KKyAgICA8c2hvcnRkZXNjPkFwYWNoZSBUaHJpZnQgc29mdHdhcmUgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIEMrKywgSmF2YSwgUHl0aG9uLCBQSFAsIFJ1YnksIEVybGFuZywgUGVybCwgSGFza2VsbCwgQyMsIENvY29hLCBKYXZhU2NyaXB0LCBOb2RlLmpzLCBTbWFsbHRhbGssIE9DYW1sIGFuZCBEZWxwaGkgYW5kIG90aGVyIGxhbmd1YWdlcy4gPC9zaG9ydGRlc2M+CisgICAgPGRlc2NyaXB0aW9uPkFwYWNoZSBUaHJpZnQgYWxsb3dzIHlvdSB0byBkZWZpbmUgZGF0YSB0eXBlcyBhbmQgc2VydmljZSBpbnRlcmZhY2VzIGluIGEgc2ltcGxlIGRlZmluaXRpb24gZmlsZS4gVGFraW5nIHRoYXQgZmlsZSBhcyBpbnB1dCwgdGhlIGNvbXBpbGVyIGdlbmVyYXRlcyBjb2RlIHRvIGJlIHVzZWQgdG8gZWFzaWx5IGJ1aWxkIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzIHRoYXQgY29tbXVuaWNhdGUgc2VhbWxlc3NseSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBJbnN0ZWFkIG9mIHdyaXRpbmcgYSBsb2FkIG9mIGJvaWxlcnBsYXRlIGNvZGUgdG8gc2VyaWFsaXplIGFuZCB0cmFuc3BvcnQgeW91ciBvYmplY3RzIGFuZCBpbnZva2UgcmVtb3RlIG1ldGhvZHMsIHlvdSBjYW4gZ2V0IHJpZ2h0IGRvd24gdG8gYnVzaW5lc3MuIDwvZGVzY3JpcHRpb24+CisgICAgPGJ1Zy1kYXRhYmFzZSByZGY6cmVzb3VyY2U9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIiAvPgorICAgIDxtYWlsaW5nLWxpc3QgcmRmOnJlc291cmNlPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbWFpbGluZy8iIC8+CisgICAgPGRvd25sb2FkLXBhZ2UgcmRmOnJlc291cmNlPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG93bmxvYWQvIiAvPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5BY3Rpb25TY3JpcHQ8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5DPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+QyM8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5DKys8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5Db2NvYTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkQ8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5EYXJ0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RGVscGhpPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RXJsYW5nPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+R288L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5IYXNrZWxsPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SGF4ZTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkphdmE8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5KYXZhU2NyaXB0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+bm9kZS5qczwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPk9DYW1sPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UGVybDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlBIUDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlB5dGhvbjwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlJ1c3Q8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5TbWFsbFRhbGs8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L2h0dHAiIC8+CisgICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvY2F0ZWdvcnkvbGlicmFyeSIgLz4KKyAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9uZXR3b3JrLWNsaWVudCIgLz4KKyAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9uZXR3b3JrLXNlcnZlciIgLz4KKyAgICA8cmVsZWFzZSByZGY6cGFyc2VUeXBlPSJDb2xsZWN0aW9uIj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE4LTEyLTI4PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMi4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE3LTExLTMwPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMS4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE3LTAzLTAxPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMC4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE1LTA5LTI1PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC45LjM8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTQtMTEtMDU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjkuMjwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMy0wOC0yMjwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuOS4xPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDEyLTEwLTE1PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC45LjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTEtMTEtMjk8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjguMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMS0wOC0xMzwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuNy4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDExLTA0LTI1PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC42LjE8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTEtMDItMDg8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjYuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdCAoaW5jdWJhdGluZyk8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTAtMTAtMDc8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjUuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdCAoaW5jdWJhdGluZyk8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTAtMDgtMjM8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjQuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdCAoaW5jdWJhdGluZyk8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTAtMDgtMDQ8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjMuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdCAoaW5jdWJhdGluZyk8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMDktMTItMTE8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjIuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgPC9yZWxlYXNlPgorICAgIDxyZXBvc2l0b3J5PgorICAgICAgPEdpdFJlcG9zaXRvcnk+CisgICAgICAgIDxsb2NhdGlvbiByZGY6cmVzb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIvPgorICAgICAgICA8YnJvd3NlIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiLz4KKyAgICAgIDwvR2l0UmVwb3NpdG9yeT4KKyAgICA8L3JlcG9zaXRvcnk+CisgICAgPG1haW50YWluZXI+CisgICAgICA8Zm9hZjpQZXJzb24+CisgICAgICAgIDxmb2FmOm5hbWU+QXBhY2hlIFRocmlmdCBQTUM8L2ZvYWY6bmFtZT4KKyAgICAgICAgICA8Zm9hZjptYm94IHJkZjpyZXNvdXJjZT0ibWFpbHRvOmRldkB0aHJpZnQuYXBhY2hlLm9yZyIvPgorICAgICAgPC9mb2FmOlBlcnNvbj4KKyAgICA8L21haW50YWluZXI+CisgIDwvUHJvamVjdD4KKzwvcmRmOlJERj4KZGlmZiAtLWdpdCBhL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4MTAwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNDggQEAKKyMgVGhyaWZ0IENvZGluZyBTdGFuZGFyZHMKKworICAgQW55IGZvb2wgY2FuIHdyaXRlIGNvZGUgdGhhdCBhIGNvbXB1dGVyIGNhbiB1bmRlcnN0YW5kLgorICAgR29vZCBwcm9ncmFtbWVycyB3cml0ZSBjb2RlIHRoYXQgaHVtYW5zIGNhbiB1bmRlcnN0YW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIE1hcnRpbiBGb3dsZXIsIDE5OTkKKworVGhlIHB1cnBvc2Ugb2YgdGhpcyBkb2N1bWVudCBpcyB0byBtYWtlIGV2ZXJ5b25lJ3MgbGlmZSBlYXNpZXIuCisKK0l0J3MgZWFzaWVyIHdoZW4geW91IHJlYWQgZ29vZCwgd2VsbCBmb3JtYXR0ZWQsIHdpdGggY2xlYXJseSBkZWZpbmVkIHB1cnBvc2UsIGNvZGUuCitCdXQgdGhlIG9ubHkgd2F5IHRvIHJlYWQgY2xlYW4gY29kZSBpcyB0byB3cml0ZSBzdWNoLgorCitUaGlzIGRvY3VtZW50IGNhbiBoZWxwIGFjaGlldmUgdGhhdCwgYnV0IGtlZXAgaW4gbWluZCB0aGF0Cit0aG9zZSBhcmUgbm90IHNpbHZlci1idWxsZXQsIGZpeC1hbGwtYXQtb25jZSBydWxlcy4gSnVzdCB0aGluayBhYm91dCByZWFkYWJpbGl0eSB3aGlsZSB3cml0aW5nIGNvZGUuCitXcml0ZSBjb2RlIGxpa2UgeW91IHdvdWxkIGhhdmUgdG8gcmVhZCBpdCBpbiB0ZW4geWVhcnMgZnJvbSBub3cuCisKKyMjIEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkcworCitUaHJpZnQgaGFzIHNvbWUgaGlzdG9yeS4gTm90IGFsbCBleGlzdGluZyBjb2RlIGZvbGxvd3MgdGhvc2UgcnVsZXMuCitCdXQgd2Ugd2FudCB0byBpbXByb3ZlIG92ZXIgdGltZS4KK1doZW4gbWFraW5nIHNtYWxsIGNoYW5nZSAvIGJ1Z2ZpeCAtIGxpa2Ugc2luZ2xlIGxpbmUgZml4IC0gZG8gKm5vdCogcmVmYWN0b3Igd2hvbGUgZnVuY3Rpb24uCitUaGF0IGRpc3R1cmJzIGNvZGUgcmVwb3NpdG9yeSBoaXN0b3J5LgorV2hlbmV2ZXIgYWRkaW5nIHNvbWV0aGluZyBuZXcgYW5kIC8gb3IgbWFraW5nIGJpZ2dlciByZWZhY3RvcmluZworIC0gZm9sbG93IHRob3NlIHJ1bGVzIGFzIHN0cmljdGx5IGFzIHlvdSBjYW4uCisKK1doZW4gaW4gZG91YnQgLSBjb250YWN0IG90aGVyIGRldmVsb3BlcnMgKHVzaW5nIGRldkAgbWFpbGluZyBsaXN0IG9yIElSQykuCitDb2RlIHJldmlldyBpcyB0aGUgYmVzdCB3YXkgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKworIyMjIEJhc2ljcworICogVXNlIHNwYWNlcyBub3QgdGFicworICogVXNlIG9ubHkgQVNDSUkgY2hhcmFjdGVycyBpbiBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMKKyAqIENvbW1pdCB0byByZXBvc2l0b3J5IHVzaW5nIFVuaXgtc3R5bGUgbGluZSBlbmRpbmdzIChMRikKKyAgICAgT24gV2luZG93czoKKyAgICAgICBnaXQgY29uZmlnIGNvcmUuYXV0b2NybGYgdHJ1ZQorICogTWF4aW11bSBsaW5lIHdpZHRoIC0gMTAwIGNoYXJhY3RlcnMKKyAqIElmIG5vdCBzcGVjaWZpZWQgb3RoZXJ3aXNlIGluIGxhbmd1YWdlIHNwZWNpZmljIHN0YW5kYXJkIC0gdXNlIDIgc3BhY2VzIGFzIGluZGVudC90YWIKKworIyMjIENvbW1lbnRzCisgKiBFYWNoIGZpbGUgaGFzIHRvIHN0YXJ0IHdpdGggY29tbWVudCBjb250YWluaW5nIFtBcGFjaGUgTGljZW5zZV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKQorICogUHVibGljIEFQSSBvZiBsaWJyYXJ5IHNob3VsZCBiZSBkb2N1bWVudGVkLCBwcmVmZXJhYmx5IHVzaW5nIGZvcm1hdCBuYXRpdmUgZm9yIGxhbmd1YWdlIHNwZWNpZmljIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiB0b29scyAoSmF2YWRvYywgRG94eWdlbiBldGMuKQorICogT3RoZXIgY29tbWVudHMgYXJlIGRpc2NvdXJhZ2VkIC0gY29tbWVudHMgYXJlIGxpZXMuIFdoZW4gb25lIGhhcyB0byBtYWtlIGNvbW1lbnQgaXQgbWVhbnMgb25lIGZhaWxlZCB0byB3cml0ZSByZWFkYWJsZSBjb2RlLiBJbnN0ZWFkIG9mICJJIHNob3VsZCB3cml0ZSBhIGNvbW1lbnQgaGVyZSIgdGhpbmsgIkkgc2hvdWxkIGNsZWFuIGl0IHVwIgorICogRG8gbm90IGxlYXZlICJUT0RPL0ZJWE1FIiBjb21tZW50cyAtIGZpbGUgW0ppcmFdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpIGlzc3VlIGluc3RlYWQKKworIyMjIE5hbWluZworIEZpbmRpbmcgcHJvcGVyIG5hbWVzIGlzIHRoZSBtb3N0IGltcG9ydGFudCBhbmQgbW9zdCBkaWZmaWN1bHQgdGFzayBpbiBzb2Z0d2FyZSBkZXZlbG9wbWVudC4KKworIyMgTGFuZ3VhZ2UgU3BlY2lmaWMgQ29kaW5nIFN0YW5kYXJkcworCitGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlIGBsaWIvTEFORy9jb2Rpbmdfc3RhbmRhcmRzLm1kYApkaWZmIC0tZ2l0IGEvZG9jL2NvbW1pdHRlcnMubWQgYi9kb2MvY29tbWl0dGVycy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RkN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2NvbW1pdHRlcnMubWQKQEAgLTAsMCArMSw1NCBAQAorIyMgUHJvY2VzcyB1c2VkIGJ5IGNvbW1pdHRlcnMgdG8gcmV2aWV3IGFuZCBzdWJtaXQgcGF0Y2hlcworCisxLiBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBhbiBpc3N1ZSBmb3IgdGhlIHBhdGNoKHMpIHlvdSBhcmUgYWJvdXQgdG8gY29tbWl0IGluIG91ciBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKQorCisxLiBDaGVjayBvdXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgY29kZQorCisgICogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCB0aHJpZnQKKworMS4gQXBwbHkgdGhlIHBhdGNoCisKKyAgKiBjdXJsIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS8uLi4gfGdpdCBhcHBseSAtLWlnbm9yZS1zcGFjZS1jaGFuZ2UKKworICBvcgorCisgICogY3VybCBodHRwczovL2dpdGh1Yi5jb20vPEdpdEh1YiBVc2VyPi90aHJpZnQvY29tbWl0LzxDb21taXQgSUQ+LnBhdGNoIHxnaXQgYXBwbHkgLS1pZ25vcmUtc3BhY2UtY2hhbmdlCisKKworMS4gSW5zcGVjdCB0aGUgYXBwbGllZCBwYXRjaCB0byBlbnN1cmUgdGhhdCBhbGwgW0xlZ2FsIGFzcGVjdHMgb24gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zIChQYXRjaGVzKV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwjY29udHJpYnV0aW9ucykgYXJlIG1ldAorCisxLiBSdW4gdGhlIG5lY2Vzc2FyeSB1bml0IHRlc3RzIGFuZCBjcm9zcyBsYW5ndWFnZSB0ZXN0IGNhc2VzIHRvIHZlcmlmeSB0aGUgcGF0Y2gKKworMS4gQ29tbWl0IHRoZSBwYXRjaAorCisgICAgICAgIGdpdCAtLWNvbmZpZyB1c2VyLm5hbWUgIllvdXIgTmFtZSIKKyAgICAgICAgZ2l0IC0tY29uZmlnIHVzZXIuZW1haWwgIllvdXJBcGFjaGVJREBhcGFjaGUub3JnIgorICAgICAgICBnaXQgYWRkIC1BCisgICAgICAgIGdpdCBjb21taXQKKworMS4gVGhlIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBiZSBpbiB0aGUgZm9ybWF0OgorCisgICAgICAgVEhSSUZULSMjIzo8SmlyYSBkZXNjcmlwdGlvbj4KKyAgICAgICBDbGllbnQ6IDxjb21wb25lbnQ+CisgICAgICAgUGF0Y2g6IDxOYW1lIG9mIHBlcnNvbiBjb250cmlidXRpbmcgdGhlIHBhdGNoPgorCisgICAgICAgRGVzY3JpcHRpb24gb2Ygd2hhdCB3YXMgZml4ZWQgb3IgYWRkcmVzc2VkLgorCisgICAgICAgPCUKKyAgICAgICAgICAgaWYgdGhpcyBpcyBhIGdpdGh1YiBwdWxsIHJlcXVlc3QgdGhlbiBhZGQgYmVsb3cgY29tbWVudAorICAgICAgICAgICAgdG8gYXV0b21hdGljYWx5IGNsb3NlIEdpdEh1YiByZXF1ZXN0LgorICAgICAgICU+CisgICAgICAgVGhpcyBjbG9zZXMgI1hYCisKKworMS4gRG91YmxlIGNoZWNrIHRoZSBwYXRjaCBjb21taXR0ZWQgYW5kIHRoYXQgbm90aGluZyB3YXMgbWlzc2VkIHRoZW4gcHVzaCB0aGUgcGF0Y2gKKworICAgICAgIGdpdCBzdGF0dXMKKyAgICAgICBnaXQgc2hvdyBIRUFECisgICAgICAgZ2l0IHB1c2ggb3JpZ2luIG1hc3RlcgorCisKKzEuIFJlc29sdmUgdGhlIGppcmEgaXNzdWUgYW5kIHNldCB0aGUgZm9sbG93aW5nIGZvciB0aGUgY2hhbmdlbG9nCisKKyAgKiBDb21wb25lbnQgdGhlIHBhdGNoIGlzIGZvcgorICAqIGZpeFZlcnNpb24gdG8gdGhlIGN1cnJlbnQgdmVyc2lvbiBvbiBtYXN0ZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY2dybi5wbmcgYi9kb2MvaW1hZ2VzL2Nncm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDk2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2Nncm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3JlZC5wbmcgYi9kb2MvaW1hZ2VzL2NyZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmE1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2NyZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nIGIvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2NjQwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3llbC5wbmcgYi9kb2MvaW1hZ2VzL2N5ZWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMWRmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2N5ZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcgYi9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWNjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL1JFQURNRS5tZCBiL2RvYy9pbnN0YWxsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjIzMWNkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2luc3RhbGwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDMgQEAKKworIyMgQmFzaWMgcmVxdWlyZW1lbnRzCisqIEEgcmVsYXRpdmVseSBQT1NJWC1jb21wbGlhbnQgKk5JWCBzeXN0ZW0KKyAgICAqIEN5Z3dpbiBvciBNaW5HVyBjYW4gYmUgdXNlZCBvbiBXaW5kb3dzIChidXQgdGhlcmUgYXJlIGJldHRlciBvcHRpb25zLCBzZWUgYmVsb3cpCisqIGcrKyA0LjIKKyogYm9vc3QgMS41My4wCisqIFJ1bnRpbWUgbGlicmFyaWVzIGZvciBsZXggYW5kIHlhY2MgbWlnaHQgYmUgbmVlZGVkIGZvciB0aGUgY29tcGlsZXIuCisKKyMjIFJlcXVpcmVtZW50cyBmb3IgYnVpbGRpbmcgZnJvbSBzb3VyY2UKKyogR05VIGJ1aWxkIHRvb2xzOiAKKyAgICAqIGF1dG9jb25mIDIuNjUKKyAgICAqIGF1dG9tYWtlIDEuMTMKKyAgICAqIGxpYnRvb2wgMS41LjI0CisqIHBrZy1jb25maWcgYXV0b2NvbmYgbWFjcm9zIChwa2cubTQpCisqIGxleCBhbmQgeWFjYyAoZGV2ZWxvcGVkIHByaW1hcmlseSB3aXRoIGZsZXggYW5kIGJpc29uKQorKiBsaWJzc2wtZGV2CisKKyMjIFJlcXVpcmVtZW50cyBmb3IgYnVpbGRpbmcgdGhlIGNvbXBpbGVyIGZyb20gc291cmNlIG9uIFdpbmRvd3MKKyogVmlzdWFsIFN0dWRpbyBDKysKKyogRmxleCBhbmQgQmlzb24gKGUuZy4gdGhlIFdpbkZsZXhCaXNvbiBwYWNrYWdlKQorCisjIyBMYW5ndWFnZSByZXF1aXJlbWVudHMKK1RoZXNlIGFyZSBvbmx5IHJlcXVpcmVkIGlmIHlvdSBjaG9vc2UgdG8gYnVpbGQgdGhlIGxpYnJhcmllcyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCisKKyogQysrCisgICAgKiBCb29zdCAxLjUzLjAKKyAgICAqIGxpYmV2ZW50IChvcHRpb25hbCwgdG8gYnVpbGQgdGhlIG5vbmJsb2NraW5nIHNlcnZlcikKKyAgICAqIHpsaWIgKG9wdGlvbmFsKQorKiBKYXZhCisgICAgKiBKYXZhIDEuOAorICAgICogQXBhY2hlIEFudAorKiBDIzogTW9ubyAxLjIuNCAoYW5kIHBrZy1jb25maWcgdG8gZGV0ZWN0IGl0KSBvciBWaXN1YWwgU3R1ZGlvIDIwMDUrCisqIFB5dGhvbiAyLjYgKGluY2x1ZGluZyBoZWFkZXIgZmlsZXMgZm9yIGV4dGVuc2lvbiBtb2R1bGVzKQorKiBQSFAgNS4wIChvcHRpb25hbGx5IGluY2x1ZGluZyBoZWFkZXIgZmlsZXMgZm9yIGV4dGVuc2lvbiBtb2R1bGVzKQorKiBSdWJ5IDEuOAorICAgICogYnVuZGxlciBnZW0KKyogRXJsYW5nIFIxMiAoUjExIHdvcmtzIGJ1dCBub3QgcmVjb21tZW5kZWQpCisqIFBlcmwgNQorICAgICogQml0OjpWZWN0b3IKKyAgICAqIENsYXNzOjpBY2Nlc3NvcgorKiBIYXhlIDMuMS4zCisqIEdvIDEuNAorKiBEZWxwaGkgMjAxMApkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvY2VudG9zLm1kIGIvZG9jL2luc3RhbGwvY2VudG9zLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTMyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5zdGFsbC9jZW50b3MubWQKQEAgLTAsMCArMSw3NSBAQAorIyBCdWlsZGluZyBBcGFjaGUgVGhyaWZ0IG9uIENlbnRPUyA2LjUKKworU3RhcnRpbmcgd2l0aCBhIG1pbmltYWwgaW5zdGFsbGF0aW9uLCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSByZXF1aXJlZCB0byBidWlsZCBBcGFjaGUgVGhyaWZ0IG9uIENlbnRvcyA2LjUuIFRoaXMgZXhhbXBsZSBidWlsZHMgZnJvbSBzb3VyY2UsIHVzaW5nIHRoZSBjdXJyZW50IGRldmVsb3BtZW50IG1hc3RlciBicmFuY2guIFRoZXNlIGluc3RydWN0aW9ucyBzaG91bGQgYWxzbyB3b3JrIHdpdGggQXBhY2hlIFRocmlmdCByZWxlYXNlcyBiZWdpbm5pbmcgd2l0aCAwLjkuMi4KKworIyMgVXBkYXRlIHRoZSBTeXN0ZW0KKworCXN1ZG8geXVtIC15IHVwZGF0ZQorCisjIyBJbnN0YWxsIHRoZSBQbGF0Zm9ybSBEZXZlbG9wbWVudCBUb29scworCisJc3VkbyB5dW0gLXkgZ3JvdXBpbnN0YWxsICJEZXZlbG9wbWVudCBUb29scyIKKworIyMgVXBncmFkZSBhdXRvY29uZi9hdXRvbWFrZS9iaXNvbgorCisJc3VkbyB5dW0gaW5zdGFsbCAteSB3Z2V0CisKKyMjIyBVcGdyYWRlIGF1dG9jb25mCisKKwl3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b2NvbmYvYXV0b2NvbmYtMi42OS50YXIuZ3oKKwl0YXIgeHZmIGF1dG9jb25mLTIuNjkudGFyLmd6CisJY2QgYXV0b2NvbmYtMi42OQorCS4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKKwltYWtlCisJc3VkbyBtYWtlIGluc3RhbGwKKwljZCAuLgorCisjIyMgVXBncmFkZSBhdXRvbWFrZQorCisJd2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2F1dG9tYWtlL2F1dG9tYWtlLTEuMTQudGFyLmd6CisJdGFyIHh2ZiBhdXRvbWFrZS0xLjE0LnRhci5negorCWNkIGF1dG9tYWtlLTEuMTQKKwkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisJbWFrZQorCXN1ZG8gbWFrZSBpbnN0YWxsCisJY2QgLi4KKworIyMjIFVwZ3JhZGUgYmlzb24KKworCXdnZXQgaHR0cDovL2Z0cC5nbnUub3JnL2dudS9iaXNvbi9iaXNvbi0yLjUuMS50YXIuZ3oKKwl0YXIgeHZmIGJpc29uLTIuNS4xLnRhci5negorCWNkIGJpc29uLTIuNS4xCisJLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgorCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCWNkIC4uCisKKyMjIEFkZCBPcHRpb25hbCBDKysgTGFuZ3VhZ2UgTGlicmFyeSBEZXBlbmRlbmNpZXMKKworQWxsIGxhbmd1YWdlcyByZXF1aXJlIHRoZSBBcGFjaGUgVGhyaWZ0IElETCBDb21waWxlciBhbmQgYXQgdGhpcyBwb2ludCBldmVyeXRoaW5nIG5lZWRlZCB0byBtYWtlIHRoZSBJREwgQ29tcGlsZXIgaXMgaW5zdGFsbGVkIChpZiB5b3Ugb25seSBuZWVkIHRoZSBjb21waWxlciB5b3UgY2FuIHNraXAgdG8gdGhlIEJ1aWxkIHN0ZXApLiAKKworSWYgeW91IHdpbGwgYmUgZGV2ZWxvcGluZyBBcGFjaGUgVGhyaWZ0IGNsaWVudHMvc2VydmVycyBpbiBDKysgeW91IHdpbGwgYWxzbyBuZWVkIGFkZGl0aW9uYWwgcGFja2FnZXMgdG8gc3VwcG9ydCB0aGUgQysrIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkLgorCisjIyMgSW5zdGFsbCBDKysgTGliIERlcGVuZGVuY2llcworCisJc3VkbyB5dW0gLXkgaW5zdGFsbCBsaWJldmVudC1kZXZlbCB6bGliLWRldmVsIG9wZW5zc2wtZGV2ZWwKKworIyMjIFVwZ3JhZGUgQm9vc3QgPj0gMS41MworCisJd2dldCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Jvb3N0L2ZpbGVzL2Jvb3N0LzEuNTMuMC9ib29zdF8xXzUzXzAudGFyLmd6CisJdGFyIHh2ZiBib29zdF8xXzUzXzAudGFyLmd6CisJY2QgYm9vc3RfMV81M18wCisJLi9ib290c3RyYXAuc2gKKwlzdWRvIC4vYjIgaW5zdGFsbAorCisjIyBCdWlsZCBhbmQgSW5zdGFsbCB0aGUgQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIKKworCWdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQKKwljZCB0aHJpZnQKKwkuL2Jvb3RzdHJhcC5zaAorCS4vY29uZmlndXJlIC0td2l0aC1sdWE9bm8KKwltYWtlCisJc3VkbyBtYWtlIGluc3RhbGwKKworVGhpcyB3aWxsIGJ1aWxkIHRoZSBjb21waWxlciAodGhyaWZ0L2NvbXBpbGVyL2NwcC90aHJpZnQgLS12ZXJzaW9uKSBhbmQgYW55IGxhbmd1YWdlIGxpYnJhcmllcyBzdXBwb3J0ZWQuIFRoZSBtYWtlIGluc3RhbGwgc3RlcCBpbnN0YWxscyB0aGUgY29tcGlsZXIgb24gdGhlIHBhdGg6IC91c3IvbG9jYWwvYmluL3RocmlmdAorWW91IGNhbiB1c2UgdGhlIC4vY29uZmlndXJlIC0tZW5hYmxlLWxpYnM9bm8gc3dpdGNoIHRvIGJ1aWxkIHRoZSBBcGFjaGUgVGhyaWZ0IElETCBDb21waWxlciBvbmx5IHdpdGhvdXQgbGliIGJ1aWxkcy4gVG8gcnVuIHRlc3RzIHVzZSAibWFrZSBjaGVjayIuCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9kZWJpYW4ubWQgYi9kb2MvaW5zdGFsbC9kZWJpYW4ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmNjk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbnN0YWxsL2RlYmlhbi5tZApAQCAtMCwwICsxLDYyIEBACisjIyBEZWJpYW4vVWJ1bnR1IGluc3RhbGwKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCB3aWxsIGluc3RhbGwgdG9vbHMgYW5kIGxpYnJhcmllcyByZXF1aXJlZCB0byBidWlsZCBhbmQgaW5zdGFsbCB0aGUgQXBhY2hlIFRocmlmdCBjb21waWxlciBhbmQgQysrIGxpYnJhcmllcyBvbiBhIERlYmlhbi9VYnVudHUgTGludXggYmFzZWQgc3lzdGVtLgorCisJc3VkbyBhcHQtZ2V0IGluc3RhbGwgYXV0b21ha2UgYmlzb24gZmxleCBnKysgZ2l0IGxpYmJvb3N0LWFsbC1kZXYgbGliZXZlbnQtZGV2IGxpYnNzbC1kZXYgbGlidG9vbCBtYWtlIHBrZy1jb25maWcKKworRGViaWFuIDcvVWJ1bnR1IDEyIHVzZXJzIG5lZWQgdG8gbWFudWFsbHkgaW5zdGFsbCBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgYXV0b21ha2UgYW5kIChmb3IgQysrIGxpYnJhcnkgYW5kIHRlc3Qgc3VwcG9ydCkgYm9vc3Q6CisKKyAgICB3Z2V0IGh0dHA6Ly9mdHAuZGViaWFuLm9yZy9kZWJpYW4vcG9vbC9tYWluL2EvYXV0b21ha2UtMS4xNS9hdXRvbWFrZV8xLjE1LTNfYWxsLmRlYgorICAgIHN1ZG8gZHBrZyAtaSBhdXRvbWFrZV8xLjE1LTNfYWxsLmRlYgorCisgICAgd2dldCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Jvb3N0L2ZpbGVzL2Jvb3N0LzEuNjAuMC9ib29zdF8xXzYwXzAudGFyLmd6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhciB4dmYgYm9vc3RfMV82MF8wLnRhci5negorICAgIGNkIGJvb3N0XzFfNjBfMAorICAgIC4vYm9vdHN0cmFwLnNoCisgICAgc3VkbyAuL2IyIGluc3RhbGwKKworIyMgT3B0aW9uYWwgcGFja2FnZXMKKworSWYgeW91IHdvdWxkIGxpa2UgdG8gYnVpbGQgQXBhY2hlIFRocmlmdCBsaWJyYXJpZXMgZm9yIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcyB5b3UgbWF5IG5lZWQgdG8gaW5zdGFsbCBhZGRpdGlvbmFsIHBhY2thZ2VzLiBUaGUgZm9sbG93aW5nIGxhbmd1YWdlcyByZXF1aXJlIHRoZSBzcGVjaWZpZWQgYWRkaXRpb25hbCBwYWNrYWdlczoKKworICogSmF2YQorCSogcGFja2FnZXM6IGFudCAgCisJKiBZb3Ugd2lsbCBhbHNvIG5lZWQgSmF2YSBKREsgdjEuOCBvciBoaWdoZXIuIFR5cGUgKipqYXZhYyoqIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIHBhY2thZ2VzLCBwaWNrIHRoZSBvbmUgeW91IHByZWZlciBhbmQgKiphcHQtZ2V0IGluc3RhbGwqKiBpdCAoZS5nLiBkZWZhdWx0LWpkaykuCisgKiBSdWJ5CisJKiBydWJ5LWZ1bGwgcnVieS1kZXYgcnVieS1yc3BlYyByYWtlIHJ1YnlnZW1zIGJ1bmRsZXIKKyAqIFB5dGhvbgorCSogcHl0aG9uLWFsbCBweXRob24tYWxsLWRldiBweXRob24tYWxsLWRiZworICogUGVybAorCSogbGliYml0LXZlY3Rvci1wZXJsIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwKKyAqIFBocCwgaW5zdGFsbAorCSogcGhwNS1kZXYgcGhwNS1jbGkgcGhwdW5pdAorICogQ19nbGliCisJKiBsaWJnbGliMi4wLWRldgorICogRXJsYW5nCisJKiBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldiByZWJhcgorICogQ3NoYXJwCisJKiBtb25vLWdtY3MgbW9uby1kZXZlbCBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsIG51bml0IG51bml0LWNvbnNvbGUKKyAqIEhhc2tlbGwKKwkqIGdoYyBjYWJhbC1pbnN0YWxsIGxpYmdoYy1iaW5hcnktZGV2IGxpYmdoYy1uZXR3b3JrLWRldiBsaWJnaGMtaHR0cC1kZXYKKyAqIFRocmlmdCBDb21waWxlciBmb3IgV2luZG93cworCSogbWluZ3ctdzY0IG1pbmd3LXc2NC14ODYtNjQtZGV2IG5zaXMKKyAqIFJ1c3QKKwkqIHJ1c3RjIGNhcmdvCisgKiBIYXhlCisJKiBoYXhlCisgKiBMdWEKKyAgICAqIGx1YTUuMyBsaWJsdWE1LjMtZGV2CisgKiBOb2RlSnMKKyAgICAqIG5vZGVqcyBucG0KKyAqIGRvdG5ldGNvcmUKKyAgICAqIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vbmV0L2xlYXJuL2dldC1zdGFydGVkL2xpbnV4dWJ1bnR1CisgKiBkLWxhbmcKKyAgICAqIGN1cmwgLWZzUyBodHRwczovL2RsYW5nLm9yZy9pbnN0YWxsLnNoIHwgYmFzaCAtcyBkbWQKKyAqIGRhcnQgJiBwdWIKKyAgICAqIGh0dHBzOi8vd3d3LmRhcnRsYW5nLm9yZy9pbnN0YWxsL2xpbnV4CisgICAgKiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvdG9vbHMvcHViL2luc3RhbGxpbmcKKwkKKworIyMgQWRkaXRpb25hbCByZWFkaW5nCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXF1aXJlbWVudHMgc2VlOiBbQXBhY2hlIFRocmlmdCBSZXF1aXJlbWVudHNdKC9kb2NzL2luc3RhbGwpCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIFRocmlmdCBzZWU6IFtCdWlsZGluZyBmcm9tIHNvdXJjZV0oL2RvY3MvQnVpbGRpbmdGcm9tU291cmNlKQpkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvb3NfeC5tZCBiL2RvYy9pbnN0YWxsL29zX3gubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5OWVmNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbnN0YWxsL29zX3gubWQKQEAgLTAsMCArMSwyNyBAQAorIyMgT1MgWCBTZXR1cAorVGhlIGZvbGxvd2luZyBjb21tYW5kIGluc3RhbGwgYWxsIHRoZSByZXF1aXJlZCB0b29scyBhbmQgbGlicmFyaWVzIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIG9uIGEgT1MgWCBiYXNlZCBzeXN0ZW0uIAorCisjIyMgSW5zdGFsbCBCb29zdAorRG93bmxvYWQgdGhlIGJvb3N0IGxpYnJhcnkgZnJvbSBbYm9vc3Qub3JnXShodHRwOi8vd3d3LmJvb3N0Lm9yZykgdW50YXIgY29tcGlsZSB3aXRoCisKKwkuL2Jvb3RzdHJhcC5zaAorCXN1ZG8gLi9iMiB0aHJlYWRpbmc9bXVsdGkgYWRkcmVzcy1tb2RlbD02NCB2YXJpYW50PXJlbGVhc2Ugc3RhZ2UgaW5zdGFsbAorCisjIyMgSW5zdGFsbCBsaWJldmVudAorRG93bmxvYWQgW2xpYmV2ZW50XShodHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50KSwgdW50YXIgYW5kIGNvbXBpbGUgd2l0aAorCisJLi9jb25maWd1cmUgLS1wcmVmaXg9L3Vzci9sb2NhbCAKKwltYWtlCisJc3VkbyBtYWtlIGluc3RhbGwKKworIyMjIEJ1aWxkaW5nIEFwYWNoZSBUaHJpZnQKK0Rvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBbQXBhY2hlIFRocmlmdF0oL2Rvd25sb2FkKSwgdW50YXIgYW5kIGNvbXBpbGUgd2l0aAorCisJLi9jb25maWd1cmUgLS1wcmVmaXg9L3Vzci9sb2NhbC8gLS13aXRoLWJvb3N0PS91c3IvbG9jYWwgLS13aXRoLWxpYmV2ZW50PS91c3IvbG9jYWwKKworIyMgQWRkaXRpb25hbCByZWFkaW5nCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXF1aXJlbWVudHMgc2VlOiBbQXBhY2hlIFRocmlmdCBSZXF1aXJlbWVudHNdKC9kb2NzL2luc3RhbGwpCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIFRocmlmdCBzZWU6IFtCdWlsZGluZyBmcm9tIHNvdXJjZV0oL2RvY3MvQnVpbGRpbmdGcm9tU291cmNlKQorCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC93aW5kb3dzLm1kIGIvZG9jL2luc3RhbGwvd2luZG93cy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjE4OTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2luc3RhbGwvd2luZG93cy5tZApAQCAtMCwwICsxLDE4NiBAQAorIyMgV2luZG93cyBTZXR1cAorCitUaGUgVGhyaWZ0IGVudmlyb25tZW50IGNvbnNpc3RzIG9mIHR3byBtYWluIHBhcnRzOiBUaGUgVGhyaWZ0IGNvbXBpbGVyIEVYRSBhbmQgdGhlIGxhbmd1YWdlLWRlcGVuZGVudCBsaWJyYXJpZXMuIE1vc3Qgb2YgdGhlc2UgbGlicmFyaWVzIHdpbGwgcmVxdWlyZSBzb21lIGtpbmQgb2YgYnVpbGQgYW5kL29yIGluc3RhbGxhdGlvbi4gQnV0IHJlZ2FyZGluZyB0aGUgVGhyaWZ0IGNvbXBpbGVyIHV0aWxpdHkgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMuIAorCitUaGUgZmlyc3Qgb25lIG9mIHRoZXNlIGFsdGVybmF0aXZlcyBpcyB0byBkb3dubG9hZCB0aGUgKipwcmUtYnVpbHQgVGhyaWZ0IENvbXBpbGVyIEVYRSoqIGFuZCBvbmx5IGJ1aWxkIHRoZSBsaWJyYXJpZXMgbmVlZGVkIGZyb20gc291cmNlLCBmb2xsb3dpbmcgb25lIG9mIHRoZSAiU2V0dXAgZnJvbSBzb3VyY2UiIG1ldGhvZHMgb3V0bGluZWQgYmVsb3cuCisKK1RoZSBvdGhlciB0d28gb3B0aW9ucyBhcmUgdG8gYnVpbGQgdGhlIFRocmlmdCBjb21waWxlciBmcm9tIHNvdXJjZS4gVGhlIG1vc3QgcmVjb21tZW5kZWQgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyBieSBtZWFucyBvZiB0aGUgKipWaXN1YWwgU3R1ZGlvIEMrKyBidWlsZCBwcm9qZWN0KiouIEFsdGVybmF0aXZlbHksIHRoZSBUaHJpZnQgY29tcGlsZXIgY2FuIGFsc28gYmUgYnVpbHQgdmlhICoqQ3lnd2luKiogb3IgKipNaW5HVyoqIGJ1aWxkIGVudmlyb25tZW50cywgaG93ZXZlciB0aGlzIG1ldGhvZCBpcyBub3Qgb25seSBsZXNzIGNvbWZvcnRhYmxlLCBidXQgbW9yZSB0aW1lLWNvbnN1bWluZyBhbmQgcmVxdWlyZXMgbXVjaCBtb3JlIG1hbnVhbCBlZmZvcnQuIAorCisKKyMjIFByZWJ1aWx0IFRocmlmdCBjb21waWxlcgorCitUaGUgd2luZG93cyBUaHJpZnQgY29tcGlsZXIgaXMgYXZhaWxhYmxlIGFzIGEgcHJlYnVpbHQgZXhlIGF2YWlsYWJsZSBbaGVyZV0oL2Rvd25sb2FkKS4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGluc3RhbGxhdGlvbiB0b29sLCByYXRoZXIgdGhpcyBFWEUgZmlsZSAqaXMqIGFscmVhZHkgdGhlIFRocmlmdCBjb21waWxlciB1dGlsaXR5LiBEb3dubG9hZCB0aGUgZmlsZSBhbmQgcHV0IGl0IGludG8gc29tZSBzdWl0YWJsZSBsb2NhdGlvbiBvZiB5b3VyIGNob2ljZS4KKworTm93IHBpY2sgb25lIG9mIHRoZSAiQnVpbGQgYW5kIGluc3RhbGwgdGFyZ2V0IGxpYnJhcmllcyIgYmVsb3cgdG8gY29udGludWUuCisKKyAKKyMjIFNldHVwIGZyb20gc291cmNlIHZpYSBWaXN1YWwgU3R1ZGlvIEMrKyAocmVjb21tZW5kZWQpCisKKyMjIyBSZXF1aXJlbWVudHMKKworVGhyaWZ0J3MgY29tcGlsZXIgaXMgd3JpdHRlbiBpbiBDKysgYW5kIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlLCBidXQgdGhlcmUgYXJlIHNvbWUgc3lzdGVtIHJlcXVpcmVtZW50cy4gVGhyaWZ0J3MgcnVudGltZSBsaWJyYXJpZXMgYXJlIHdyaXR0ZW4gaW4gdmFyaW91cyBsYW5ndWFnZXMsIHdoaWNoIGFyZSBhbHNvIHJlcXVpcmVkIGZvciB0aGUgcGFydGljdWxhciBsYW5ndWFnZSBpbnRlcmZhY2UuCisKKyAqIFZpc3VhbCBTdHVkaW8gQysrLCBhbnkgcmVjZW50IHZlcnNpb24gc2hvdWxkIGRvCisgKiBGbGV4IGFuZCBCaXNvbiwgZS5nLiB0aGUgV2luRmxleEJpc29uIHBhY2thZ2UKKyAqIFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworIyMjIEJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBjb21waWxlcgorIAorQWZ0ZXIgYWxsIHJlcXVpcmVtZW50cyBhcmUgaW4gcGxhY2UsIHVzZSB0aGUgYGNvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qYCBidWlsZCBwcm9qZWN0IHRvIGJ1aWxkIHRoZSBUaHJpZnQgY29tcGlsZXIuIENvcHkgdGhlIHJlc3VsdGluZyBFWEUgZmlsZSB0byBhIGxvY2F0aW9uIG9mIHlvdXIgY2hvaWNlLiAKKworIyMjIEJ1aWxkIGFuZCBpbnN0YWxsIHRhcmdldCBsaWJyYXJpZXMKKworQSBmZXcgb2YgdGhlIHRhcmdldCBsYW5ndWFnZSBsaWJyYXJpZXMgYWxzbyBkbyBwcm92aWRlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlcywgc3VjaCBhcyBDKysgYW5kIEMjLiBUaGVzZSBhcmUgbG9jYXRlZCBpbiB0aGUgYGxpYi88bGFuZ3VhZ2U+L2AgZm9sZGVycy4gCisKK01vc3Qgb2YgdGhlIGxhbmd1YWdlIHBhY2thZ2VzIG11c3QgYmUgYnVpbHQgYW5kIGluc3RhbGxlZCBtYW51YWxseSB1c2luZyBidWlsZCB0b29scyBiZXR0ZXIgc3VpdGVkIHRvIHRob3NlIGxhbmd1YWdlcy4gVHlwaWNhbCBleGFtcGxlcyBhcmUgSmF2YSwgUnVieSwgRGVscGhpLCBvciBQSFAuIExvb2sgZm9yIHRoZSBgUkVBRE1FLm1kYCBmaWxlIGluIHRoZSBgbGliLzxsYW5ndWFnZT4vYCBmb2xkZXIgZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gYnVpbGQgYW5kIGluc3RhbGwgZWFjaCBsYW5ndWFnZSdzIGxpYnJhcnkgcGFja2FnZS4KKyAKKworIyMgU2V0dXAgZnJvbSBzb3VyY2UgdmlhIEN5Z3dpbgorCisjIyMgUmVxdWlyZW1lbnRzCisKK1RocmlmdCdzIGNvbXBpbGVyIGlzIHdyaXR0ZW4gaW4gQysrIGFuZCBkZXNpZ25lZCB0byBiZSBwb3J0YWJsZSwgYnV0IHRoZXJlIGFyZSBzb21lIHN5c3RlbSByZXF1aXJlbWVudHMuIFRocmlmdCdzIHJ1bnRpbWUgbGlicmFyaWVzIGFyZSB3cml0dGVuIGluIHZhcmlvdXMgbGFuZ3VhZ2VzLCB3aGljaCBhcmUgYWxzbyByZXF1aXJlZCBmb3IgdGhlIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgaW50ZXJmYWNlLgorCisgKiBDeWd3aW4gb3IgTWluR1cgCisgKiBbQXBhY2hlIFRocmlmdCBSZXF1aXJlbWVudHNdKC9kb2NzL2luc3RhbGwpCisKKyMjIyBJbnN0YWxsaW5nIGZyb20gc291cmNlCisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSB0aGUgZmlyc3QgdGltZSBvdXQgb2YgdGhlIHNvdXJjZSByZXBvc2l0b3J5LCB5b3Ugd2lsbCBuZWVkIHRvIGdlbmVyYXRlIHRoZSBjb25maWd1cmUgc2NyaXB0cy4gIChUaGlzIGlzIG5vdCBuZWNlc3NhcnkgaWYgeW91IGRvd25sb2FkZWQgYSB0YXJiYWxsLikgIEZyb20gdGhlIHRvcCBkaXJlY3RvcnksIGRvOgorCisJLi9ib290c3RyYXAuc2gKKworT25jZSB0aGUgY29uZmlndXJlIHNjcmlwdHMgYXJlIGdlbmVyYXRlZCwgdGhyaWZ0IGNhbiBiZSBjb25maWd1cmVkLiBGcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBkbzoKKworCWV4cG9ydCBDWFhGTEFHUz0iLUQgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlA9UFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUiCisJLi9jb25maWd1cmUKKworU2V0dGluZyB0aGUgQ1hYRkxBR1MgZW52aXJvbm1lbnRhbCB2YXJpYWJsZSB3b3JrcyBhcm91bmQgY29tcGlsZSBlcnJvcnMgd2l0aCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCBiZWluZyB1bmRlY2xhcmVkLCBieSByZXBsYWNpbmcgaXQgd2l0aCB0aGUgbmV3ZXIsIHBvcnRhYmxlIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFLiAoVGVzdGVkIG9uIGN5Z3dpbiAyMDEwMDMyMCwgVGhyaWZ0IHI3NjAxODQsIGxhdGVzdCBwdGhyZWFkLikKKworKipPcHRpb25hbDoqKiBZb3UgKiptYXkgbm90KiogYmUgYWJsZSB0byBtYWtlIGZyb20gdGhlIHJvb3QgIFRocmlmdCBkaXJlY3RvcnkgZHVlIHRvIGVycm9ycyAoc2VlIGJlbG93IHRvIHJlc29sdmUpLiBUbyBtYWtlIHRoZSBjb21waWxlciBvbmx5LCBjaGFuZ2UgdG8gdGhlIGNvbXBpbGVyIGRpcmVjdG9yeSBiZWZvcmUgcnVubmluZyBtYWtlOgorCisJY2QgY29tcGlsZXIvY3BwCisKK05vdyBtYWtlIHRoZSB0aHJpZnQgY29tcGlsZXIgKCYgcnVudGltZSBsaWJyYXJpZXMgaWYgbWFrZSBpcyBydW4gZnJvbSB0aGUgdGhyaWZ0IHJvb3QgZGlyZWN0b3J5KToKKworCW1ha2UKKwltYWtlIGluc3RhbGwKKworIyMjIEJ1aWxkIGFuZCBpbnN0YWxsIHRhcmdldCBsaWJyYXJpZXMKKworU29tZSBsYW5ndWFnZSBwYWNrYWdlcyBtdXN0IGJlIGluc3RhbGxlZCBtYW51YWxseSB1c2luZyBidWlsZCB0b29scyBiZXR0ZXIgc3VpdGVkIHRvIHRob3NlIGxhbmd1YWdlcy4gVHlwaWNhbCBleGFtcGxlcyBhcmUgSmF2YSwgUnVieSwgb3IgUEhQLiBMb29rIGZvciB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGBsaWIvPGxhbmd1YWdlPi9gIGZvbGRlciBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbnN0YWxsYXRpb24gb2YgZWFjaCBsYW5ndWFnZSBsaWJyYXJ5IHBhY2thZ2UuCisKKyMjIyBQb3NzaWJsZSBpc3N1ZXMgd2l0aCBDeWd3aW4gaW5zdGFsbAorCitTZWUgYWxzbyBQb3NzaWJsZSBpc3N1ZXMgd2l0aCBNaW5HVyBpbnN0YWxsLgorCisjIyMjIFN5bnRheCBlcnJvciBpbiAuL2NvbmZpZ3VyZQorCitUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycyBmb3Igc29tZSB1c2VycyB3aGVuIHJ1bm5pbmcgLi9jb25maWd1cmU6CisKKwkuL2NvbmZpZ3VyZTogbGluZSAyMTE4Mzogc3ludGF4IGVycm9yIG5lYXIgdW5leHBlY3RlZCB0b2tlbiBgTU9OTywnCisJLi9jb25maWd1cmU6IGxpbmUgMjExODM6IGAgIFBLR19DSEVDS19NT0RVTEVTKE1PTk8sIG1vbm8gPj0gMS4yLjYsIGhhdmVfbW9ubz15ZXMsIGhhdmVfbW9ubz1ubyknCisKK1RvIHJlc29sdmUgdGhpcywgeW91J2xsIG5lZWQgdG8gZmluZCB5b3VyIHBrZy5tNCAoaW5zdGFsbGVkIGJ5IHRoZSBwa2ctY29uZmlnIHBhY2thZ2UpIGZpbGUgYW5kIGNvcHkgaXQgdG8gdGhlIHRocmlmdC9hY2xvY2FsIGRpcmVjdG9yeS4gIEZyb20gdGhlIHRvcC1sZXZlbCB0aHJpZnQgZGlyZWN0b3J5LCB5b3UgY2FuIGNvcHkgdGhlIGZpbGUgYnkgcnVubmluZworCisJY3AgL3Vzci9zaGFyZS9hY2xvY2FsL3BrZy5tNCBhY2xvY2FsCisKK0ZpbmFsbHksIHJlLXJ1biAuL2Jvb3RzdHJhcC5zaCBhbmQgLi9jb25maWd1cmUuICAoTm90ZSB0aGF0IHBrZy5tNCBpcyBjcmVhdGVkIGJ5IHRoZSBwa2ctY29uZmlnIHRvb2wuICBJZiB5b3VyIC91c3Ivc2hhcmUvYWNsb2NhbCBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRoZSBwa2cubTQgZmlsZSwgeW91IG1heSBub3QgaGF2ZSBwa2ctY29uZmlnIGluc3RhbGxlZC4pCisKKyMjIyMgSW5zdGFsbGluZyBwZXJsIHJ1bnRpbWUgbGlicmFyaWVzCisKK1NvbWV0aW1lcywgdGhlcmUgd2lsbCBiZSBhbiBlcnJvciBkdXJpbmcgdGhlIGluc3RhbGwgb2YgdGhlIHBlcmwgbGlicmFyaWVzIHdpdGggY2htb2QuCisKK0Egd29ya2Fyb3VuZCBpcyB0byBhdm9pZCBpbnN0YWxsaW5nIHRoZSBwZXJsIGxpYnJhcmllcyBpZiB0aGV5IGFyZSBub3QgbmVlZGVkLgorCitJZiB5b3UgZG9uJ3QgbmVlZCBwZXJsLCBydW4gY29uZmlndXJlIHdpdGggLS13aXRob3V0LXBlcmwuCisKK0lmIHlvdSBuZWVkIHBlcmwsIGFuZCBhcmUgaGFwcHkgdG8gbWFudWFsbHkgaW5zdGFsbCBpdCwgcmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhyaWZ0L2xpYi9wZXJsL01ha2VmaWxlIHdpdGggdGhlIGZvbGxvd2luZywgYWZ0ZXIgYnVpbGRpbmcgdGhyaWZ0OgorCQorCVRPRE8KKworIyMjIyBMaW5raW5nIHRvIGluc3RhbGxlZCBDKysgcnVudGltZSBsaWJyYXJpZXMKKworU29tZXRpbWVzLCB0aGUgaW5zdGFsbGVkIGxpYnRocmlmdC5hIHdpbGwgbm90IGxpbmsgdXNpbmcgZysrLCB3aXRoIGxpbmtlciBlcnJvcnMgYWJvdXQgbWlzc2luZyB2dGFibGVzIGFuZCBleGNlcHRpb25zIGZvciBUaHJpZnQgY2xhc3Nlcy4KKworQSB3b3JrYXJvdW5kIGlzIHRvIGxpbmsgdGhlIGNvbXBpbGVkIG9iamVjdCBmaWxlcyBkaXJlY3RseSBmcm9tIHlvdXIgVGhyaWZ0IGJ1aWxkLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaXNzaW5nIGNsYXNzZXMuCisKK1RoaXMgY2FuIGJlIGltcGxlbWVudGVkIGluIGEgTWFrZWZpbGUgdXNpbmcgdGhlIGZvbGxvd2luZyBsaW5lczoKKworCVRIUklGVF9PPTxwYXRoIHRvPi90aHJpZnQvbGliL2NwcAorCUxUSFJJRlQ9JChUSFJJRlRfTykvVGhyaWZ0Lm8gJChUSFJJRlRfTykvVFNvY2tldC5vICQoVEhSSUZUX08pL1RCaW5hcnlQcm90b2NvbC5vICQoVEhSSUZUX08pL1RCdWZmZXJUcmFuc3BvcnRzLm8KKworVGhlbiBsaW5raW5nIHVzaW5nICQoTFRIUklGVCkgaW5zdGVhZCBvZiAtbHRocmlmdC4KKworCVRPRE8gLSBkaWFnbm9zZSBpc3N1ZSBmdXJ0aGVyCisKKyMjIyMgQysrIHJ1bnRpbWUgc2VnZmF1bHQgd2l0aCBjeWd3aW4gMS43LjUtMSwgZysrLTQuMy40LCBmb3JrKCkgYW5kIHRocm93CisKK0lmIHlvdXIgdGhyaWZ0IEMrKyBwcm9ncmFtcyBzZWdmYXVsdCBvbiB0aHJvdyBhZnRlciBmb3JrKClpbmcsIGNvbXBpbGUgdGhlbSB3aXRoIGcrKy0zLgorCitUaGUgaXNzdWUgYW5kIHBhdGNoIGFyZSBkZXNjcmliZWQgb24gdGhlIEN5Z3dpbiBtYWlsaW5nIGxpc3QgYXQgaHR0cDovL2N5Z3dpbi5jb20vbWwvY3lnd2luLzIwMTAtMDUvbXNnMDAyMDMuaHRtbAorCitUaGlzIGlzc3VlIHNob3VsZCBiZSBmaXhlZCBpbiBDeWd3aW4gdmVyc2lvbnMgYWZ0ZXIgMS43LjUtMSwgb3IgZysrIDQuNS4wLgorCisjIyBTZXR1cCBmcm9tIHNvdXJjZSB2aWEgTWluR1cKKworIyMjIFJlcXVpcmVtZW50cworCitUbyBjb21waWxlIHRoZSBUaHJpZnQgZ2VuZXJhdG9yICYgcnVudGltZSBsaWJyYXJpZXMgKHVudGVzdGVkKSB3aXRob3V0IHRoZSBjeWd3aW4uZGxsIGRlcGVuZGVuY3kgeW91IG5lZWQgdG8gaW5zdGFsbCBNaW5HVyAod3d3Lm1pbmd3Lm9yZykuIAorCisgKiBNaW5HVyAKKyAqIFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworSW4gYWRkaXRpb24geW91IG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgZW50cnkgdG8geW91ciB3aW5kb3dzIFBBVEggdmFyaWFibGUuCisKKwlDOlxNSU5HV1xCSU4KKwkKK05leHQsIG9wZW4gY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtIGFuZCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRocmlmdF9DWFhGTEFHUworCisJLURNSU5HVyAtbW5vLWN5Z3dpbiAtbGZsCisJCitSdW4gYm9vdHN0cmFwLnNoOgorCisJLi9ib290c3RyYXAuc2gKKworTWFrZSBzdXJlIHlvdSBoYXZlIGphdmEgaW4geW91ciAkUEFUSCB2YXJpYWJsZSwgaWYgbm90IGRvKGFkanVzdCBwYXRoIGlmIG5lY2Vzc2FyeSk6CisKKwlleHBvcnQgUEFUSD0kUEFUSDoiL2N5Z2RyaXZlL2MvcHJvZ3JhbSBmaWxlcy9qYXZhL2pyZTEuOC4wXzE5MS9iaW4iCisKK1J1biBjb25maWd1cmUgLSB1c2luZyBDWFhGTEFHUyB0byB3b3JrIGFyb3VuZCBhbiBpc3N1ZSB3aXRoIGFuIG9sZCBwdGhyZWFkcyBkZWZpbmUgKHVudGVzdGVkIG9uIE1pbkdXIC0gd29ya3Mgb24gQ3lnd2luKToKKworCWV4cG9ydCBDWFhGTEFHUz0iLUQgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlA9UFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUiCisJLi9jb25maWd1cmUKKworJydPcHRpb25hbDonJyBUbyBtYWtlIHRoZSBjb21waWxlciBvbmx5LCBjaGFuZ2UgdG8gdGhlIGNvbXBpbGVyICBkaXJlY3RvcnkgYmVmb3JlIHJ1bm5pbmcgbWFrZToKKworCWNkIGNvbXBpbGVyL2NwcAorCQorUnVuIG1ha2U6CisKKwltaW5ndzMyLW1ha2UuZXhlCisKKyMjIyBQb3NzaWJsZSBpc3N1ZXMgd2l0aCBNaW5HVyBpbnN0YWxsCisKK1NlZSBhbHNvIFBvc3NpYmxlIGlzc3VlcyB3aXRoIEN5Z3dpbiBpbnN0YWxsLCBpbmNsdWRpbmcgdGhlIGRpc2N1c3Npb24gYWJvdXQgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAuCisKKyMjIyMgeXl3cmFwIGlzIG5vdCBmb3VuZAorCitNYWtlIHN1cmUgeW91IGFkZCAtbGZsIGluIHlvdXIgY3h4ZmxhZ3MgaW4gTWFrZWZpbGUsIGFsc28gdHJ5IGFkZGluZyAtTGM6L2N5Z3dpbi9saWJzCisKKyMjIyMgYm9vc3QgaXMgbm90IGZvdW5kCisKK1RyeSBhbmQgY2hhbmdlIHRoZSBpbmNsdWRlIGRpciB0byB1c2UgdGhlIHdpbmRvd3MgcGF0aCBmcm9tIGMgbGlrZSB0aGlzOiBFZGl0IGNvbXBpbGVyL2NwcC9NYWtlZmlsZSwgbG9vayBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIEJPT1NUX0NQUEZMQUdTLCBjaGFuZ2UgdGhhdCBsaW5lIGZvcgorCisJQk9PU1RfQ1BQRkxBR1MgPSAtSWM6L2N5Z3dpbi91c3IvaW5jbHVkZS9ib29zdC0xXzUzXzAKKwkKKyMjIyMgcmVhbHBhdGggaXMgbm90IGZvdW5kCisKK2FkZCAtRE1JTkdXIC1tbm8tY3lnd2luIHRvIHRoZSBDWFhERUZTIHZhcmlhYmxlIGluIE1ha2VmaWxlCisKKyMjIEFkZGl0aW9uYWwgcmVhZGluZworCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVxdWlyZW1lbnRzIHNlZTogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBUaHJpZnQgc2VlOiBbQnVpbGRpbmcgZnJvbSBzb3VyY2VdKC9kb2NzL0J1aWxkaW5nRnJvbVNvdXJjZSkKKwpkaWZmIC0tZ2l0IGEvZG9jL2xncGwtMi4xLnR4dCBiL2RvYy9saWNlbnNlcy9sZ3BsLTIuMS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9sZ3BsLTIuMS50eHQKcmVuYW1lIHRvIGRvYy9saWNlbnNlcy9sZ3BsLTIuMS50eHQKZGlmZiAtLWdpdCBhL2RvYy9vdHAtYmFzZS1saWNlbnNlLnR4dCBiL2RvYy9saWNlbnNlcy9vdHAtYmFzZS1saWNlbnNlLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL290cC1iYXNlLWxpY2Vuc2UudHh0CnJlbmFtZSB0byBkb2MvbGljZW5zZXMvb3RwLWJhc2UtbGljZW5zZS50eHQKZGlmZiAtLWdpdCBhL2RvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGIvZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMDFhN2QuLjAwMDAwMDAKLS0tIGEvZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1UaHJpZnQgU29mdHdhcmUgTGljZW5zZQotQ29weXJpZ2h0IChjKSAyMDA2LSBGYWNlYm9vaywgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24KLW9idGFpbmluZyBhIGNvcHkgb2YgdGhlIHNvZnR3YXJlIGFuZCBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBjb3ZlcmVkIGJ5Ci10aGlzIGxpY2Vuc2UgKHRoZSAiU29mdHdhcmUiKSB0byB1c2UsIHJlcHJvZHVjZSwgZGlzcGxheSwgZGlzdHJpYnV0ZSwKLWV4ZWN1dGUsIGFuZCB0cmFuc21pdCB0aGUgU29mdHdhcmUsIGFuZCB0byBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlCi1Tb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCB0aGlyZC1wYXJ0aWVzIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0bwotZG8gc28sIGFsbCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmc6Ci0KLVRoZSBjb3B5cmlnaHQgbm90aWNlcyBpbiB0aGUgU29mdHdhcmUgYW5kIHRoaXMgZW50aXJlIHN0YXRlbWVudCwgaW5jbHVkaW5nCi10aGUgYWJvdmUgbGljZW5zZSBncmFudCwgdGhpcyByZXN0cmljdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgYW5kCi1hbGwgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU29mdHdhcmUsIHVubGVzcyBzdWNoIGNvcGllcyBvciBkZXJpdmF0aXZlCi13b3JrcyBhcmUgc29sZWx5IGluIHRoZSBmb3JtIG9mIG1hY2hpbmUtZXhlY3V0YWJsZSBvYmplY3QgY29kZSBnZW5lcmF0ZWQgYnkKLWEgc291cmNlIGxhbmd1YWdlIHByb2Nlc3Nvci4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVAotU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIEFOWU9ORSBESVNUUklCVVRJTkcgVEhFIFNPRlRXQVJFIEJFIExJQUJMRQotRk9SIEFOWSBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi1BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKLURFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQgYi9kb2Mvc3BlY3MvSGVhZGVyRm9ybWF0Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZWM3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvSGVhZGVyRm9ybWF0Lm1kCkBAIC0wLDAgKzEsODIgQEAKKzxsaW5rIGhyZWY9Imh0dHA6Ly9rZXZpbmJ1cmtlLmJpdGJ1Y2tldC5vcmcvbWFya2Rvd25jc3MvbWFya2Rvd24uY3NzIiByZWw9InN0eWxlc2hlZXQiPjwvbGluaz4KKworSGVhZGVyIGZvcm1hdCBmb3IgdGhlIFRIZWFkZXIuaAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IDB8ICAgICAgICAgICAgICAgICAgICAgICAgICBMRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IDB8ICAgICAgIEhFQURFUiBNQUdJQyAgICAgICAgICB8ICAgICAgICAgICAgRkxBR1MgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFNFUVVFTkNFIE5VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IDB8ICAgICBIZWFkZXIgU2l6ZSgvMzIpICAgICAgICB8IC4uLgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBpcyBvZiB2YXJpYWJsZSBzaXplOgorICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHN0YXJ0cyBhdCBvZmZzZXQgMTQpCisKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgUFJPVE9DT0wgSUQgICh2YXJpbnQpICB8ICAgTlVNIFRSQU5TRk9STVMgKHZhcmludCkgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgVFJBTlNGT1JNIDAgSUQgKHZhcmludCkgICB8ICAgICAgICBUUkFOU0ZPUk0gMCBEQVRBIC4uLgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgIElORk8gMCBJRCAodmFyaW50KSAgICAgIHwgICAgICAgSU5GTyAwICBEQVRBIC4uLgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCitUaGUgYExFTkdUSGAgZmllbGQgaXMgMzIgYml0cywgYW5kIGNvdW50cyB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZQorcGFja2V0LCBOT1QgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQuICBUaGUgaGVhZGVyIHNpemUgZmllbGQgaXMgMTYKK2JpdHMsIGFuZCBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgcmVtYWluaW5nIE5PVCBpbmNsdWRpbmcgdGhlCitgSEVBREVSIE1BR0lDYCwgYEZMQUdTYCwgYFNFUVVFTkNFIE5VTUJFUmAgYW5kIGhlYWRlciBzaXplIGZpZWxkcy4gIFRoZQorSGVhZGVyIHNpemUgZmllbGQgaXMgaW4gYnl0ZXMvNC4KKworVGhlIHRyYW5zZm9ybSBJRCdzIGFyZSB2YXJpbnRzLiAgVGhlIGRhdGEgZm9yIGVhY2ggdHJhbnNmb3JtIGlzCitkZWZpbmVkIGJ5IHRoZSB0cmFuc2Zvcm0gSUQgaW4gdGhlIGNvZGUgLSBubyBzaXplIGlzIGdpdmVuIGluIHRoZQoraGVhZGVyLiAgSWYgYSB0cmFuc2Zvcm0gSUQgaXMgc3BlY2lmaWVkIGZyb20gYSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIKK2RvZXNuJ3Qga25vdyBhYm91dCB0aGUgdHJhbnNmb3JtIElELCBhbiBlcnJvciBNVVNUIGJlIHJldHVybmVkIGFzIHdlCitkb24ndCBrbm93IGhvdyB0byB0cmFuc2Zvcm0gdGhlIGRhdGEuCisKK0NvbnZlcnNlbHksIGRhdGEgaW4gdGhlIGluZm8gaGVhZGVycyBpcyBpZ25vcmFibGUuICBUaGlzIHNob3VsZCBvbmx5CitiZSB0aGluZ3MgbGlrZSB0aW1lc3RhbXBzLCBkZWJ1Z2luZyB0cmFjaW5nLCBldGMuICBVc2luZyB0aGUgaGVhZGVyCitzaXplIHlvdSBzaG91bGQgYmUgYWJsZSB0byBza2lwIHRoaXMgZGF0YSBhbmQgcmVhZCB0aGUgcGF5bG9hZCBzYWZlbHkKK2lmIHlvdSBkb24ndCBrbm93IHRoZSBpbmZvIElELgorCitJbmZvJ3Mgc2hvdWxkIGJlIG9sZGVzdCBzdXBwb3J0ZWQgdG8gbmV3ZXN0IHN1cHBvcnRlZCBvcmRlciwgc28gdGhhdAoraWYgd2UgcmVhZCBhbiBpbmZvIElEIHdlIGRvbid0IHN1cHBvcnQsIG5vbmUgb2YgdGhlIHJlbWFpbmluZyBpbmZvCitJRCdzIHdpbGwgYmUgc3VwcG9ydGVkIGVpdGhlciwgYW5kIHdlIGNhbiBzYWZlbHkgc2tpcCB0byB0aGUgcGF5bG9hZC4KKworSW5mbyBJRCdzIGFuZCB0cmFuc2Zvcm0gSUQncyBzaG91bGQgc2hhcmUgdGhlIHNhbWUgSUQgc3BhY2UuCisKKyMjIyBQQURESU5HOgorCitIZWFkZXIgd2lsbCBiZSBwYWRkZWQgb3V0IHRvIG5leHQgNC1ieXRlIGJvdW5kYXJ5IHdpdGggYDB4MDBgLgorCitNYXggZnJhbWUgc2l6ZSBpcyBgMHgzRkZGRkZGRmAsIHdoaWNoIGlzIHNsaWdodGx5IGxlc3MgdGhhbiBgSFRUUF9NQUdJQ2AuCitUaGlzIGFsbG93cyB1cyB0byBkaXN0aW5ndXNoIGJldHdlZW4gZGlmZmVyZW50IChvbGRlcikgdHJhbnNwb3J0cy4KKworIyMjIFRyYW5zZm9ybSBJRHM6CisKKyAgICBaTElCX1RSQU5TRk9STSAweDAxIC0gTm8gZGF0YSBmb3IgdGhpcy4gIFVzZSB6bGliIHRvIChkZSljb21wcmVzcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS4KKworICAgIEhNQUNfVFJBTlNGT1JNIDB4MDIgLSBWYXJpYWJsZSBhbW91bnQgb2YgbWFjIGRhdGEuICBPbmUgYnl0ZSB0byBzcGVjaWZ5CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUuIE1hYyBkYXRhIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHBhY2tldC4KKyAgICBTTkFQUFlfVFJBTlNGT1JNICAweDAzICAtIE5vIGRhdGEgZm9yIHRoaXMuICBVc2Ugc25hcHB5IHRvIChkZSljb21wcmVzcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS4KKworCisjIyNJbmZvIElEczoKKworICAgIElORk9fS0VZVkFMVUUgMHgwMSAtIHZhcmludDMyIG51bWJlciBvZiBoZWFkZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAtIGtleS92YWx1ZSBwYWlycyBvZiB2YXJzdHJpbmdzICh2YXJpbnQxNiBsZW5ndGggcGx1cworICAgICAgICAgICAgICAgICAgICAgICAgIG5vLXRyYWlsaW5nLW51bGwgc3RyaW5nKS4KKwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL2lkbC5tZCBiL2RvYy9zcGVjcy9pZGwubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyMmY1NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy9pZGwubWQKQEAgLTAsMCArMSwyNzIgQEAKKyMjIFRocmlmdCBpbnRlcmZhY2UgZGVzY3JpcHRpb24gbGFuZ3VhZ2UKK1RoZSBUaHJpZnQgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UgKElETCkgYWxsb3dzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBbVGhyaWZ0IFR5cGVzXSgvZG9jcy90eXBlcykuIEEgVGhyaWZ0IElETCBmaWxlIGlzIHByb2Nlc3NlZCBieSB0aGUgVGhyaWZ0IGNvZGUgZ2VuZXJhdG9yIHRvIHByb2R1Y2UgY29kZSBmb3IgdGhlIHZhcmlvdXMgdGFyZ2V0IGxhbmd1YWdlcyB0byBzdXBwb3J0IHRoZSBkZWZpbmVkIHN0cnVjdHMgYW5kIHNlcnZpY2VzIGluIHRoZSBJREwgZmlsZS4KKworIyMgRGVzY3JpcHRpb24KKworKlVuZGVyIGNvbnN0cnVjdGlvbioKKworSGVyZSBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBUaHJpZnQgSURMLgorCisjIyBEb2N1bWVudAorCitFdmVyeSBUaHJpZnQgZG9jdW1lbnQgY29udGFpbnMgMCBvciBtb3JlIGhlYWRlcnMgZm9sbG93ZWQgYnkgMCBvciBtb3JlIGRlZmluaXRpb25zLgorCisgICAgWzFdICBEb2N1bWVudCAgICAgICAgOjo9ICBIZWFkZXIqIERlZmluaXRpb24qCisKKyMjIEhlYWRlcgorCitBIGhlYWRlciBpcyBlaXRoZXIgYSBUaHJpZnQgaW5jbHVkZSwgYSBDKysgaW5jbHVkZSwgb3IgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uCisKKyAgICBbMl0gIEhlYWRlciAgICAgICAgICA6Oj0gIEluY2x1ZGUgfCBDcHBJbmNsdWRlIHwgTmFtZXNwYWNlCisKKyMjIyBUaHJpZnQgSW5jbHVkZQorCitBbiBpbmNsdWRlIG1ha2VzIGFsbCB0aGUgc3ltYm9scyBmcm9tIGFub3RoZXIgZmlsZSB2aXNpYmxlICh3aXRoIGEgcHJlZml4KSBhbmQgYWRkcyBjb3JyZXNwb25kaW5nIGluY2x1ZGUgc3RhdGVtZW50cyBpbnRvIHRoZSBjb2RlIGdlbmVyYXRlZCBmb3IgdGhpcyBUaHJpZnQgZG9jdW1lbnQuCisKKyAgICBbM10gIEluY2x1ZGUgICAgICAgICA6Oj0gICdpbmNsdWRlJyBMaXRlcmFsCisKKyMjIyBDKysgSW5jbHVkZQorCitBIEMrKyBpbmNsdWRlIGFkZHMgYSBjdXN0b20gQysrIGluY2x1ZGUgdG8gdGhlIG91dHB1dCBvZiB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIGZvciB0aGlzIFRocmlmdCBkb2N1bWVudC4gCisKKyAgICBbNF0gIENwcEluY2x1ZGUgICAgICA6Oj0gICdjcHBfaW5jbHVkZScgTGl0ZXJhbAorCisjIyMgTmFtZXNwYWNlCisKK0EgbmFtZXNwYWNlIGRlY2xhcmVzIHdoaWNoIG5hbWVzcGFjZXMvcGFja2FnZS9tb2R1bGUvZXRjLiB0aGUgdHlwZSBkZWZpbml0aW9ucyBpbiB0aGlzIGZpbGUgd2lsbCBiZSBkZWNsYXJlZCBpbiBmb3IgdGhlIHRhcmdldCBsYW5ndWFnZXMuIFRoZSBuYW1lc3BhY2Ugc2NvcGUgaW5kaWNhdGVzIHdoaWNoIGxhbmd1YWdlIHRoZSBuYW1lc3BhY2UgYXBwbGllcyB0bzsgYSBzY29wZSBvZiAnKicgaW5kaWNhdGVzIHRoYXQgdGhlIG5hbWVzcGFjZSBhcHBsaWVzIHRvIGFsbCB0YXJnZXQgbGFuZ3VhZ2VzLgorCisgICAgWzVdICBOYW1lc3BhY2UgICAgICAgOjo9ICAoICduYW1lc3BhY2UnICggTmFtZXNwYWNlU2NvcGUgSWRlbnRpZmllciApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAnc21hbGx0YWxrLmNhdGVnb3J5JyBTVElkZW50aWZpZXIgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ3NtYWxsdGFsay5wcmVmaXgnIElkZW50aWZpZXIgKSApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ3BocF9uYW1lc3BhY2UnIExpdGVyYWwgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICd4c2RfbmFtZXNwYWNlJyBMaXRlcmFsICkKKworICAgIFs2XSAgTmFtZXNwYWNlU2NvcGUgIDo6PSAgJyonIHwgJ2NwcCcgfCAnamF2YScgfCAncHknIHwgJ3BlcmwnIHwgJ3JiJyB8ICdjb2NvYScgfCAnY3NoYXJwJworCitOLkIuOiBTbWFsbHRhbGsgaGFzIHR3byBkaXN0aW5jdCB0eXBlcyBvZiBuYW1lc3BhY2UgY29tbWFuZHM6CisKKy0gc21hbGx0YWxrLnByZWZpeDogUHJlcGVuZGVkIHRvIGdlbmVyYXRlZCBjbGFzc25hbWVzLgorICAtIFNtYWxsdGFsayBkb2VzIG5vdCBoYXZlIG5hbWVzcGFjZXMgZm9yIGNsYXNzZXMsIHNvIHByZWZpeGVzCisgICAgYXJlIHVzZWQgdG8gYXZvaWQgY2xhc3MtbmFtZSBjb2xsaXNpb25zLgorICAgIE9mdGVuLCB0aGUgcHJlZml4IGlzIHRoZSBhdXRob3IncyBpbml0aWFscywgbGlrZSAiS0IiIG9yICJKV1MiLAorICAgIG9yIGFuIGFiYnJldmlhdGlvbiBvZiB0aGUgcGFja2FnZSBuYW1lLCBsaWtlICJNQyIgZm9yICJNb250aWNlbGxvIi4KKy0gc21hbGx0YWxrLmNhdGVnb3J5OiBEZXRlcm1pbmVzIHRoZSBjYXRlZ29yeSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXMuCisgIEFueSBkb3RzIGluIHRoZSBpZGVudGlmaWVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBoeXBoZW5zIHdoZW4gZ2VuZXJhdGluZworICB0aGUgY2F0ZWdvcnkgbmFtZS4KKyAgSWYgbm90IHByb3ZpZGVkLCBkZWZhdWx0cyB0byAiR2VuZXJhdGVkLSIgKyB0aGUgcHJvZ3JhbSBuYW1lLgorICBNZXRob2RzIHdpbGwgbm90IGJlIGNhdGVnb3JpemVkIGJleW9uZCAiYXMgeWV0IHVuY2F0ZWdvcml6ZWQiLgorICAtIFNtYWxsdGFsayBhbGxvd3MgZmlsaW5nIGJvdGggY2xhc3NlcyBhbmQgbWV0aG9kcyB3aXRoaW4gY2xhc3NlcyBpbnRvIG5hbWVkCisgICAgZ3JvdXBzLiBUaGVzZSBuYW1lZCBncm91cHMgb2YgbWV0aG9kcyBhcmUgY2FsbGVkIGNhdGVnb3JpZXMuCisKK04uQi46IFRoZSBgcGhwX25hbWVzcGFjZWAgZGlyZWN0aXZlIHdpbGwgYmUgZGVwcmVjYXRlZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgaW4gZmF2b3Igb2YgdGhlIHNjb3BlZCBzeW50YXgsIGJ1dCB0aGUgc2NvcGVkIHN5bnRheCBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgUEhQLgorCitOLkIuOiBUaGUgYHhzZF9uYW1lc3BhY2VgIGRpcmVjdGl2ZSBoYXMgc29tZSBwdXJwb3NlIGludGVybmFsIHRvIEZhY2Vib29rIGJ1dCBzZXJ2ZXMgbm8gcHVycG9zZSBpbiBUaHJpZnQgaXRzZWxmLiBVc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkCisKKyMjIERlZmluaXRpb24KKworICAgIFs3XSAgRGVmaW5pdGlvbiAgICAgIDo6PSAgQ29uc3QgfCBUeXBlZGVmIHwgRW51bSB8IFNlbnVtIHwgU3RydWN0IHwgVW5pb24gfCBFeGNlcHRpb24gfCBTZXJ2aWNlCisKKyMjIyBDb25zdAorCisgICAgWzhdICBDb25zdCAgICAgICAgICAgOjo9ICAnY29uc3QnIEZpZWxkVHlwZSBJZGVudGlmaWVyICc9JyBDb25zdFZhbHVlIExpc3RTZXBhcmF0b3I/CisKKyMjIyBUeXBlZGVmCisKK0EgdHlwZWRlZiBjcmVhdGVzIGFuIGFsdGVybmF0ZSBuYW1lIGZvciBhIHR5cGUuCisKKyAgICBbOV0gIFR5cGVkZWYgICAgICAgICA6Oj0gICd0eXBlZGVmJyBEZWZpbml0aW9uVHlwZSBJZGVudGlmaWVyCisKKyMjIyBFbnVtCisKK0FuIGVudW0gY3JlYXRlcyBhbiBlbnVtZXJhdGVkIHR5cGUsIHdpdGggbmFtZWQgdmFsdWVzLiBJZiBubyBjb25zdGFudCB2YWx1ZSBpcyBzdXBwbGllZCwgdGhlIHZhbHVlIGlzIGVpdGhlciAwIGZvciB0aGUgZmlyc3QgZWxlbWVudCwgb3Igb25lIGdyZWF0ZXIgdGhhbiB0aGUgcHJlY2VkaW5nIHZhbHVlIGZvciBhbnkgc3Vic2VxdWVudCBlbGVtZW50LiBBbnkgY29uc3RhbnQgdmFsdWUgdGhhdCBpcyBzdXBwbGllZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KKworICAgIFsxMF0gRW51bSAgICAgICAgICAgIDo6PSAgJ2VudW0nIElkZW50aWZpZXIgJ3snIChJZGVudGlmaWVyICgnPScgSW50Q29uc3RhbnQpPyBMaXN0U2VwYXJhdG9yPykqICd9JworCisjIyMgU2VudW0KKworU2VudW0gKGFuZCBTbGlzdCkgYXJlIG5vdyBkZXByZWNhdGVkIGFuZCBzaG91bGQgYm90aCBiZSByZXBsYWNlZCB3aXRoIFN0cmluZy4KKworICAgIFsxMV0gU2VudW0gICAgICAgICAgIDo6PSAgJ3NlbnVtJyBJZGVudGlmaWVyICd7JyAoTGl0ZXJhbCBMaXN0U2VwYXJhdG9yPykqICd9JworCisjIyMgU3RydWN0CisKK1N0cnVjdHMgYXJlIHRoZSBmdW5kYW1lbnRhbCBjb21wb3NpdGlvbmFsIHR5cGUgaW4gVGhyaWZ0LiBUaGUgbmFtZSBvZiBlYWNoIGZpZWxkIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc3RydWN0LgorCisgICAgWzEyXSBTdHJ1Y3QgICAgICAgICAgOjo9ICAnc3RydWN0JyBJZGVudGlmaWVyICd4c2RfYWxsJz8gJ3snIEZpZWxkKiAnfScKKworTi5CLjogVGhlIGB4c2RfYWxsYCBrZXl3b3JkIGhhcyBzb21lIHB1cnBvc2UgaW50ZXJuYWwgdG8gRmFjZWJvb2sgYnV0IHNlcnZlcyBubyBwdXJwb3NlIGluIFRocmlmdCBpdHNlbGYuIFVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQKKworIyMjIFVuaW9uCisKK1VuaW9ucyBhcmUgc2ltaWxhciB0byBzdHJ1Y3RzLCBleGNlcHQgdGhhdCB0aGV5IHByb3ZpZGUgYSBtZWFucyB0byB0cmFuc3BvcnQgZXhhY3RseSBvbmUgZmllbGQgb2YgYSBwb3NzaWJsZSBzZXQgb2YgZmllbGRzLCBqdXN0IGxpa2UgdW5pb24ge30gaW4gQysrLiBDb25zZXF1ZW50bHksIHVuaW9uIG1lbWJlcnMgYXJlIGltcGxpY2l0bHkgY29uc2lkZXJlZCBvcHRpb25hbCAoc2VlIHJlcXVpcmVkbmVzcykuCisKKyAgICBbMTNdIFVuaW9uICAgICAgICAgIDo6PSAgJ3VuaW9uJyBJZGVudGlmaWVyICd4c2RfYWxsJz8gJ3snIEZpZWxkKiAnfScKKworTi5CLjogVGhlIGB4c2RfYWxsYCBrZXl3b3JkIGhhcyBzb21lIHB1cnBvc2UgaW50ZXJuYWwgdG8gRmFjZWJvb2sgYnV0IHNlcnZlcyBubyBwdXJwb3NlIGluIFRocmlmdCBpdHNlbGYuIFVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQKKworIyMjIEV4Y2VwdGlvbgorCitFeGNlcHRpb25zIGFyZSBzaW1pbGFyIHRvIHN0cnVjdHMgZXhjZXB0IHRoYXQgdGhleSBhcmUgaW50ZW5kZWQgdG8gaW50ZWdyYXRlIHdpdGggdGhlIG5hdGl2ZSBleGNlcHRpb24gaGFuZGxpbmcgbWVjaGFuaXNtcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlcy4gVGhlIG5hbWUgb2YgZWFjaCBmaWVsZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGV4Y2VwdGlvbi4KKworICAgIFsxNF0gRXhjZXB0aW9uICAgICAgIDo6PSAgJ2V4Y2VwdGlvbicgSWRlbnRpZmllciAneycgRmllbGQqICd9JworCisjIyMgU2VydmljZQorCitBIHNlcnZpY2UgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgYSBzZXQgb2YgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSBhIFRocmlmdCBzZXJ2ZXIuIFRoZSBpbnRlcmZhY2UgaXMgc2ltcGx5IGEgbGlzdCBvZiBmdW5jdGlvbnMuIEEgc2VydmljZSBjYW4gZXh0ZW5kIGFub3RoZXIgc2VydmljZSwgd2hpY2ggc2ltcGx5IG1lYW5zIHRoYXQgaXQgcHJvdmlkZXMgdGhlIGZ1bmN0aW9ucyBvZiB0aGUgZXh0ZW5kZWQgc2VydmljZSBpbiBhZGRpdGlvbiB0byBpdHMgb3duLgorCisgICAgWzE1XSBTZXJ2aWNlICAgICAgICAgOjo9ICAnc2VydmljZScgSWRlbnRpZmllciAoICdleHRlbmRzJyBJZGVudGlmaWVyICk/ICd7JyBGdW5jdGlvbiogJ30nCisKKyMjIEZpZWxkCisKKyAgICBbMTZdIEZpZWxkICAgICAgICAgICA6Oj0gIEZpZWxkSUQ/IEZpZWxkUmVxPyBGaWVsZFR5cGUgSWRlbnRpZmllciAoJz0gQ29uc3RWYWx1ZSk/IFhzZEZpZWxkT3B0aW9ucyBMaXN0U2VwYXJhdG9yPworCisjIyMgRmllbGQgSUQKKworICAgIFsxN10gRmllbGRJRCAgICAgICAgIDo6PSAgSW50Q29uc3RhbnQgJzonCisKKyMjIyBGaWVsZCBSZXF1aXJlZG5lc3MKKworVGhlcmUgYXJlIHR3byBleHBsaWNpdCByZXF1aXJlZG5lc3MgdmFsdWVzLCBhbmQgYSB0aGlyZCBvbmUgdGhhdCBpcyBhcHBsaWVkIGltcGxpY2l0eSBpZiBuZWl0aGVyICAqcmVxdWlyZWQqIG5vciAqb3B0aW9uYWwqIGFyZSBnaXZlbjogKmRlZmF1bHQqIHJlcXVpcmVkbmVzcy4KKworICAgIFsxOF0gRmllbGRSZXEgICAgICAgIDo6PSAgJ3JlcXVpcmVkJyB8ICdvcHRpb25hbCcgCisKK1RoZSBnZW5lcmFsIHJ1bGVzIGZvciByZXF1aXJlZG5lc3MgYXJlIGFzIGZvbGxvd3M6CisKKyMjIyMgcmVxdWlyZWQKKworLSBXcml0ZTogUmVxdWlyZWQgZmllbGRzIGFyZSBhbHdheXMgd3JpdHRlbiBhbmQgYXJlIGV4cGVjdGVkIHRvIGJlIHNldC4KKy0gUmVhZDogUmVxdWlyZWQgZmllbGRzIGFyZSBhbHdheXMgcmVhZCBhbmQgYXJlIGV4cGVjdGVkIHRvIGJlIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQgc3RyZWFtLgorLSBEZWZhdWx0cyB2YWx1ZXM6IGFyZSBhbHdheXMgd3JpdHRlbgorCitJZiBhIHJlcXVpcmVkIGZpZWxkIGlzIG1pc3NpbmcgZHVyaW5nIHJlYWQsIHRoZSBleHBlY3RlZCBiZWhhdmlvdXIgaXMgdG8gaW5kaWNhdGUgYW4gdW5zdWNjZXNzZnVsIHJlYWQgb3BlcmF0aW9uIHRvIHRoZSBjYWxsZXIsIGUuZy4gYnkgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIG9yIHJldHVybmluZyBhbiBlcnJvci4gCisKK0JlY2F1c2Ugb2YgdGhpcyBiZWhhdmlvdXIsIHJlcXVpcmVkIGZpZWxkcyBkcmFzdGljYWxseSBsaW1pdCB0aGUgb3B0aW9ucyB3aXRoIHJlZ2FyZCB0byBzb2Z0IHZlcnNpb25pbmcuIEJlY2F1c2UgdGhleSBtdXN0IGJlIHByZXNlbnQgb24gcmVhZCwgdGhlIGZpZWxkcyBjYW5ub3QgYmUgZGVwcmVjYXRlZC4gSWYgYSByZXF1aXJlZCBmaWVsZCB3b3VsZCBiZSByZW1vdmVkIChvciBjaGFuZ2VkIHRvIG9wdGlvbmFsKSwgdGhlIGRhdGEgYXJlIG5vIGxvbmdlciBjb21wYXRpYmxlIGJldHdlZW4gdmVyc2lvbnMuCisJCisjIyMjIG9wdGlvbmFsCisKKy0gV3JpdGU6IE9wdGlvbmFsIGZpZWxkcyBhcmUgb25seSB3cml0dGVuIHdoZW4gdGhleSBhcmUgc2V0CistIFJlYWQ6IE9wdGlvbmFsIGZpZWxkcyBtYXksIG9yIG1heSBub3QgYmUgcGFydCBvZiB0aGUgaW5wdXQgc3RyZWFtLiAKKy0gRGVmYXVsdCB2YWx1ZXM6IGFyZSB3cml0dGVuIHdoZW4gdGhlIGlzc2V0IGZsYWcgaXMgc2V0CisKK01vc3QgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb25zIHVzZSB0aGUgcmVjb21tZW5kZWQgcHJhdGljZSBvZiBzby1jYWxsZWQgImlzc2V0IiBmbGFncyB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgcGFydGljdWxhciBvcHRpb25hbCBmaWVsZCBpcyBzZXQgb3Igbm90LiBPbmx5IGZpZWxkcyB3aXRoIHRoaXMgZmxhZyBzZXQgYXJlIHdyaXR0ZW4sIGFuZCBjb252ZXJzZWx5IHRoZSBmbGFnIGlzIG9ubHkgc2V0IHdoZW4gYSBmaWVsZCB2YWx1ZSBoYXMgYmVlbiByZWFkIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gCisJCisjIyMjIGRlZmF1bHQgcmVxdWlyZWRuZXNzIChpbXBsaWNpdCkKKworLSBXcml0ZTogSW4gdGhlb3J5LCB0aGUgZmllbGRzIGFyZSBhbHdheXMgd3JpdHRlbi4gVGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucyB0byB0aGF0IHJ1bGUsIHNlZSBiZWxvdy4KKy0gUmVhZDogTGlrZSBvcHRpb25hbCwgdGhlIGZpZWxkIG1heSwgb3IgbWF5IG5vdCBiZSBwYXJ0IG9mIHRoZSBpbnB1dCBzdHJlYW0uIAorLSBEZWZhdWx0IHZhbHVlczogbWF5IG5vdCBiZSB3cml0dGVuIChzZWUgbmV4dCBzZWN0aW9uKQorCitEZWZhdWx0IHJlcXVpcmVkbmVzcyBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIFRoZSBkZXNpcmVkIGJlaGF2aW91ciBpcyBhIG1peCBvZiBvcHRpb25hbCBhbmQgcmVxdWlyZWQsIGhlbmNlIHRoZSBpbnRlcm5hbCBuYW1lICJvcHQtaW4sIHJlcS1vdXQiLiBBbHRob3VnaCBpbiB0aGVvcnkgdGhlc2UgZmllbGRzIGFyZSBzdXBwb3NlZCB0byBiZSB3cml0dGVuICgicmVxLW91dCIpLCBpbiByZWFsaXR5IHVuc2V0IGZpZWxkcyBhcmUgbm90IGFsd2F5cyB3cml0dGVuLiBUaGlzIGlzIGVzcGVjaWFsbHkgdGhlIGNhc2UsIHdoZW4gdGhlIGZpZWxkIGNvbnRhaW5zIGEgPG51bGw+IHZhbHVlLCB3aGljaCBieSBkZWZpbml0aW9uIGNhbm5vdCBiZSB0cmFuc3BvcnRlZCB0aHJvdWdoIHRocmlmdC4gVGhlIG9ubHkgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyBieSBub3Qgd3JpdGluZyB0aGF0IGZpZWxkIGF0IGFsbCwgYW5kIHRoYXQncyB3aGF0IG1vc3QgbGFuZ3VhZ2VzIGRvLgorCQorIyMjIyBTZW1hbnRpY3Mgb2YgRGVmYXVsdCBWYWx1ZXMKKworVGhlcmUgYXJlIG9uZ29pbmcgZGlzY3Vzc2lvbnMgYWJvdXQgdGhhdCB0b3BpYywgc2VlIEpJUkEgZm9yIGRldGFpbHMuIE5vdCBhbGwgaW1wbGVtZW50YXRpb25zIHRyZWF0IGRlZmF1bHQgdmFsdWVzIGluIHRoZSB2ZXJ5IHNhbWUgd2F5LCBidXQgdGhlIGN1cnJlbnQgc3RhdHVzIHF1byBpcyBtb3JlIG9yIGxlc3MgdGhhdCBkZWZhdWx0IGZpZWxkcyBhcmUgdHlwaWNhbGx5IHNldCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLiBUaGVyZWZvcmUsIGEgdmFsdWUgdGhhdCBlcXVhbHMgdGhlIGRlZmF1bHQgbWF5IG5vdCBiZSB3cml0dGVuLCBiZWNhdXNlIHRoZSByZWFkIGVuZCB3aWxsIHNldCB0aGUgdmFsdWUgaW1wbGljaXRseS4gT24gdGhlIG90aGVyIGhhbmQsIGFuIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gd3JpdGUgdGhlIGRlZmF1bHQgdmFsdWUgYW55d2F5cywgYXMgdGhlcmUgaXMgbm8gaGFyZCByZXN0cmljdGlvbiB0aGF0IHByZXZlbnRzIHRoaXMuIAorCitUaGUgbWFqb3IgcG9pbnQgdG8ga2VlcCBpbiBtaW5kIGhlcmUgaXMgdGhlIGZhY3QsIHRoYXQgYW55IHVud3JpdHRlbiBkZWZhdWx0IHZhbHVlIGltcGxpY2l0bHkgYmVjb21lcyBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgdmVyc2lvbi4gSWYgdGhhdCBkZWZhdWx0IGlzIGNoYW5nZWQsIHRoZSBpbnRlcmZhY2UgY2hhbmdlcy4gSWYsIGluIGNvbnRyYXN0LCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB3cml0dGVuIGludG8gdGhlIG91dHB1dCBkYXRhLCB0aGUgZGVmYXVsdCBpbiB0aGUgSURMIGNhbiBjaGFuZ2UgYXQgYW55IHRpbWUgd2l0aG91dCBhZmZlY3Rpbmcgc2VyaWFsaXplZCBkYXRhLgorCisjIyMgWFNEIE9wdGlvbnMKKworTi5CLjogVGhlc2UgaGF2ZSAgc29tZSBpbnRlcm5hbCBwdXJwb3NlIGF0IEZhY2Vib29rIGJ1dCBzZXJ2ZSBubyBjdXJyZW50IHB1cnBvc2UgaW4gVGhyaWZ0LiBVc2Ugb2YgdGhlc2Ugb3B0aW9ucyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZC4KKworICAgIFsxOV0gWHNkRmllbGRPcHRpb25zIDo6PSAgJ3hzZF9vcHRpb25hbCc/ICd4c2RfbmlsbGFibGUnPyBYc2RBdHRycz8KKworICAgIFsyMF0gWHNkQXR0cnMgICAgICAgIDo6PSAgJ3hzZF9hdHRycycgJ3snIEZpZWxkKiAnfScKKworIyMgRnVuY3Rpb25zCisKKyAgICBbMjFdIEZ1bmN0aW9uICAgICAgICA6Oj0gICdvbmV3YXknPyBGdW5jdGlvblR5cGUgSWRlbnRpZmllciAnKCcgRmllbGQqICcpJyBUaHJvd3M/IExpc3RTZXBhcmF0b3I/CisKKyAgICBbMjJdIEZ1bmN0aW9uVHlwZSAgICA6Oj0gIEZpZWxkVHlwZSB8ICd2b2lkJworCisgICAgWzIzXSBUaHJvd3MgICAgICAgICAgOjo9ICAndGhyb3dzJyAnKCcgRmllbGQqICcpJworCisjIyBUeXBlcworCisgICAgWzI0XSBGaWVsZFR5cGUgICAgICAgOjo9ICBJZGVudGlmaWVyIHwgQmFzZVR5cGUgfCBDb250YWluZXJUeXBlCisKKyAgICBbMjVdIERlZmluaXRpb25UeXBlICA6Oj0gIEJhc2VUeXBlIHwgQ29udGFpbmVyVHlwZQorCisgICAgWzI2XSBCYXNlVHlwZSAgICAgICAgOjo9ICAnYm9vbCcgfCAnYnl0ZScgfCAnaTgnIHwgJ2kxNicgfCAnaTMyJyB8ICdpNjQnIHwgJ2RvdWJsZScgfCAnc3RyaW5nJyB8ICdiaW5hcnknIHwgJ3NsaXN0JworCisgICAgWzI3XSBDb250YWluZXJUeXBlICAgOjo9ICBNYXBUeXBlIHwgU2V0VHlwZSB8IExpc3RUeXBlCisKKyAgICBbMjhdIE1hcFR5cGUgICAgICAgICA6Oj0gICdtYXAnIENwcFR5cGU/ICc8JyBGaWVsZFR5cGUgJywnIEZpZWxkVHlwZSAnPicKKworICAgIFsyOV0gU2V0VHlwZSAgICAgICAgIDo6PSAgJ3NldCcgQ3BwVHlwZT8gJzwnIEZpZWxkVHlwZSAnPicKKworICAgIFszMF0gTGlzdFR5cGUgICAgICAgIDo6PSAgJ2xpc3QnICc8JyBGaWVsZFR5cGUgJz4nIENwcFR5cGU/CisKKyAgICBbMzFdIENwcFR5cGUgICAgICAgICA6Oj0gICdjcHBfdHlwZScgTGl0ZXJhbAorCisjIyBDb25zdGFudCBWYWx1ZXMKKworICAgIFszMl0gQ29uc3RWYWx1ZSAgICAgIDo6PSAgSW50Q29uc3RhbnQgfCBEb3VibGVDb25zdGFudCB8IExpdGVyYWwgfCBJZGVudGlmaWVyIHwgQ29uc3RMaXN0IHwgQ29uc3RNYXAKKworICAgIFszM10gSW50Q29uc3RhbnQgICAgIDo6PSAgKCcrJyB8ICctJyk/IERpZ2l0KworCisgICAgWzM0XSBEb3VibGVDb25zdGFudCAgOjo9ICAoJysnIHwgJy0nKT8gRGlnaXQqICgnLicgRGlnaXQrKT8gKCAoJ0UnIHwgJ2UnKSBJbnRDb25zdGFudCApPworCisgICAgWzM1XSBDb25zdExpc3QgICAgICAgOjo9ICAnWycgKENvbnN0VmFsdWUgTGlzdFNlcGFyYXRvcj8pKiAnXScKKworICAgIFszNl0gQ29uc3RNYXAgICAgICAgIDo6PSAgJ3snIChDb25zdFZhbHVlICc6JyBDb25zdFZhbHVlIExpc3RTZXBhcmF0b3I/KSogJ30nCisKKyMjIEJhc2ljIERlZmluaXRpb25zCisKKyMjIyBMaXRlcmFsCisKKyAgICBbMzddIExpdGVyYWwgICAgICAgICA6Oj0gICgnIicgW14iXSogJyInKSB8ICgiJyIgW14nXSogIiciKQorCisjIyMgSWRlbnRpZmllcgorCisgICAgWzM4XSBJZGVudGlmaWVyICAgICAgOjo9ICAoIExldHRlciB8ICdfJyApICggTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnXycgKSoKKworICAgIFszOV0gU1RJZGVudGlmaWVyICAgIDo6PSAgKCBMZXR0ZXIgfCAnXycgKSAoIExldHRlciB8IERpZ2l0IHwgJy4nIHwgJ18nIHwgJy0nICkqCisKKyMjIyBMaXN0IFNlcGFyYXRvcgorCisgICAgWzQwXSBMaXN0U2VwYXJhdG9yICAgOjo9ICAnLCcgfCAnOycKKworIyMjIExldHRlcnMgYW5kIERpZ2l0cworCisgICAgWzQxXSBMZXR0ZXIgICAgICAgICAgOjo9ICBbJ0EnLSdaJ10gfCBbJ2EnLSd6J10KKworICAgIFs0Ml0gRGlnaXQgICAgICAgICAgIDo6PSAgWycwJy0nOSddCisKKyMjIEV4YW1wbGVzCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgVGhyaWZ0IGRlZmluaXRpb25zLCB1c2luZyB0aGUgVGhyaWZ0IElETDoKKworICogW1RocmlmdFRlc3QudGhyaWZ0XVtdIHVzZWQgYnkgdGhlIFRocmlmdCBUZXN0RnJhbWV3b3JrCisgKiBUaHJpZnQgW3R1dG9yaWFsXVtdCisgKiBGYWNlYm9vaydzIFtmYjMwMy50aHJpZnRdW10KKyAqIFtBcGFjaGUgQ2Fzc2FuZHJhJ3NdW10gVGhyaWZ0IElETDogW2Nhc3NhbmRyYS50aHJpZnRdW10KKyAqIFtFdmVybm90ZSBBUEldW10KKworIFtUaHJpZnRUZXN0LnRocmlmdF06ICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RocmlmdC9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorIFt0dXRvcmlhbF06ICAgICAgICAgICAvdHV0b3JpYWwvCisgW2ZiMzAzLnRocmlmdF06ICAgICAgIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcGFjaGUvdGhyaWZ0L21hc3Rlci9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdAorIFtBcGFjaGUgQ2Fzc2FuZHJhJ3NdOiBodHRwOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvCisgW2Nhc3NhbmRyYS50aHJpZnRdOiAgIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvY2Fzc2FuZHJhL3RydW5rL2ludGVyZmFjZS9jYXNzYW5kcmEudGhyaWZ0P3ZpZXc9Y28KKyBbRXZlcm5vdGUgQVBJXTogICAgICAgaHR0cDovL3d3dy5ldmVybm90ZS5jb20vYWJvdXQvZGV2ZWxvcGVyL2FwaS8KKworIyMgVG8gRG8vUXVlc3Rpb25zCisKK0luaXRpYWxpemF0aW9uIG9mIEJhc2UgVHlwZXMgZm9yIGFsbCBMYW5ndWFnZXM/CisKKyAqIERvIGFsbCBMYW5ndWFnZXMgaW5pdGlhbGl6ZSB0aGVtIHRvIDAsIGJvb2w9ZmFsc2UgYW5kIHN0cmluZz0iIj8gb3IgbnVsbCwgdW5kZWZpbmVkPworCitXaHkgZG9lcyBwb3NpdGlvbiBvZiBgQ3BwVHlwZWAgdmFyeSBiZXR3ZWVuIGBTZXRUeXBlYCBhbmQgYExpc3RUeXBlYD8KKworICogc3RkOjpzZXQgZG9lcyBzb3J0IHRoZSBlbGVtZW50cyBhdXRvbWF0aWNhbGx5LCB0aGF0J3MgdGhlIGRlc2lnbi4gc2VlIFtUaHJpZnQgVHlwZXNdKC9kb2NzL3R5cGVzKSBvciB0aGUgW0MrKyBzdGQ6c2V0IHJlZmVyZW5jZV1bXSBmb3IgZnVydGhlciBkZXRhaWxzCisgKiBUaGUgcXVlc3Rpb24gaXMsIGhvdyBvdGhlciBsYW5ndWFnZXMgYXJlIGRvaW5nIHRoYXQ/IFdoYXQgYWJvdXQgY3VzdG9tIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSBhIENvbXBhcmUgZnVuY3Rpb24gdGhlIHNldCB0aGUgb3JkZXIgY29ycmVjdGx5PworCisgW0MrKyBzdGQ6c2V0IHJlZmVyZW5jZV06IGh0dHA6Ly93d3cuY3BsdXNwbHVzLmNvbS9yZWZlcmVuY2Uvc3RsL3NldC8KKworV2h5IGNhbid0IGBEZWZpbml0aW9uVHlwZWAgYmUgdGhlIHNhbWUgYXMgYEZpZWxkVHlwZWAgKGkuZS4gaW5jbHVkZSBgSWRlbnRpZmllcmApPworCitFeGFtaW5lIHRoZSBgc21hbGx0YWxrLnByZWZpeGAgYW5kIGBzbWFsbHRhbGsuY2F0ZWdvcnlgIHN0YXR1cyAoZXNwIGBzbWFsbHRhbGsuY2F0ZWdvcnlgLCB3aGljaCB0YWtlcyBgU1RJZGVudGlmaWVyYCBhcyBpdHMgYXJndW1lbnQpLi4uCisKK1doYXQgdG8gZG8gYWJvdXQgYExpc3RTZXBhcmF0b3JgPyBEbyB3ZSByZWFsbHkgd2FudCB0byBiZSBhcyBsYXggYXMgd2UgY3VycmVudGx5IGFyZT8KKworU2hvdWxkIGBGaWVsZCpgIHJlYWxseSBiZSBgRmllbGQrYCBpbiBgU3RydWN0YCwgYEVudW1gLCBldGMuPworCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZCBiL2RvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTI2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZApAQCAtMCwwICsxLDI1NCBAQAorVGhyaWZ0IEJpbmFyeSBwcm90b2NvbCBlbmNvZGluZyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudHMgZGVzY3JpYmVzIHRoZSB3aXJlIGVuY29kaW5nIGZvciBSUEMgdXNpbmcgdGhlIG9sZGVyIFRocmlmdCAqYmluYXJ5IHByb3RvY29sKi4KKworVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgX21vc3RseV8gYmFzZWQgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gaW4gdGhlIEFwYWNoZSB0aHJpZnQgbGlicmFyeSAodmVyc2lvbiAwLjkuMSBhbmQKKzAuOS4zKS4gT3RoZXIgaW1wbGVtZW50YXRpb24gaG93ZXZlciwgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZS4KKworRm9yIGJhY2tncm91bmQgb24gVGhyaWZ0IHNlZSB0aGUgW1RocmlmdCB3aGl0ZXBhcGVyIChwZGYpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL3N0YXRpYy9maWxlcy90aHJpZnQtMjAwNzA0MDEucGRmKS4KKworIyBDb250ZW50cworCisqIEJpbmFyeSBwcm90b2NvbAorICAqIEJhc2UgdHlwZXMKKyAgKiBNZXNzYWdlCisgICogU3RydWN0CisgICogTGlzdCBhbmQgU2V0CisgICogTWFwCisqIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworIyBCaW5hcnkgcHJvdG9jb2wKKworIyMgQmFzZSB0eXBlcworCisjIyMgSW50ZWdlciBlbmNvZGluZworCitJbiB0aGUgX2JpbmFyeSBwcm90b2NvbF8gaW50ZWdlcnMgYXJlIGVuY29kZWQgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IChiaWcgZW5kaWFuIGJ5dGUgb3JkZXIsIGFrYSBuZXR3b3JrCitvcmRlcikuIEFuIGBpbnQ4YCBuZWVkcyAxIGJ5dGUsIGFuIGBpbnQxNmAgMiwgYW4gYGludDMyYCA0IGFuZCBhbiBgaW50NjRgIG5lZWRzIDggYnl0ZXMuCisKK1RoZSBDUFAgdmVyc2lvbiBoYXMgdGhlIG9wdGlvbiB0byB1c2UgdGhlIGJpbmFyeSBwcm90b2NvbCB3aXRoIGxpdHRsZSBlbmRpYW4gb3JkZXIuIExpdHRsZSBlbmRpYW4gZ2l2ZXMgYSBzbWFsbCBidXQKK25vdGljZWFibGUgcGVyZm9ybWFuY2UgYm9vc3QgYmVjYXVzZSBjb250ZW1wb3JhcnkgQ1BVcyB1c2UgbGl0dGxlIGVuZGlhbiB3aGVuIHN0b3JpbmcgaW50ZWdlcnMgdG8gUkFNLgorCisjIyMgRW51bSBlbmNvZGluZworCitUaGUgZ2VuZXJhdGVkIGNvZGUgZW5jb2RlcyBgRW51bWBzIGJ5IHRha2luZyB0aGUgb3JkaW5hbCB2YWx1ZSBhbmQgdGhlbiBlbmNvZGluZyB0aGF0IGFzIGFuIGludDMyLgorCisjIyMgQmluYXJ5IGVuY29kaW5nCisKK0JpbmFyeSBpcyBzZW50IGFzIGZvbGxvd3M6CisKK2BgYAorQmluYXJ5IHByb3RvY29sLCBiaW5hcnkgZGF0YSwgNCsgYnl0ZXM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfCBieXRlIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBieXRlIGxlbmd0aGAgaXMgdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZSBhcnJheSwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlciAobXVzdCBiZSA+PSAwKS4KKyogYGJ5dGVzYCBhcmUgdGhlIGJ5dGVzIG9mIHRoZSBieXRlIGFycmF5LgorCisjIyMgU3RyaW5nIGVuY29kaW5nCisKKypTdHJpbmcqcyBhcmUgZmlyc3QgZW5jb2RlZCB0byBVVEYtOCwgYW5kIHRoZW4gc2VuZCBhcyBiaW5hcnkuCisKKyMjIyBEb3VibGUgZW5jb2RpbmcKKworVmFsdWVzIG9mIHR5cGUgYGRvdWJsZWAgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBpbnQ2NCBhY2NvcmRpbmcgdG8gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50ICJkb3VibGUgZm9ybWF0IiBiaXQKK2xheW91dC4gTW9zdCBydW4tdGltZXMgcHJvdmlkZSBhIGxpYnJhcnkgdG8gbWFrZSB0aGlzIGNvbnZlcnNpb24uIEJvdGggdGhlIGJpbmFyeSBwcm90b2NvbCBhcyB0aGUgY29tcGFjdCBwcm90b2NvbCB0aGVuCitlbmNvZGUgdGhlIGludDY0IGluIDggYnl0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlci4KKworIyMjIEJvb2xlYW4gZW5jb2RpbmcKKworVmFsdWVzIG9mIGBib29sYCB0eXBlIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gaW50OC4gVHJ1ZSBpcyBjb252ZXJ0ZWQgdG8gYDFgLCBmYWxzZSB0byBgMGAuCisKKyMjIE1lc3NhZ2UKKworQSBgTWVzc2FnZWAgY2FuIGJlIGVuY29kZWQgaW4gdHdvIGRpZmZlcmVudCB3YXlzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBNZXNzYWdlLCBzdHJpY3QgZW5jb2RpbmcsIDEyKyBieXRlczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8MXZ2dnZ2dnZ8dnZ2dnZ2dnZ8dW51c2VkICB8MDAwMDBtbW18IG5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgfCBzZXEgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgdnZ2dnZ2dnZ2dnZ2dnZ2YCBpcyB0aGUgdmVyc2lvbiwgYW4gdW5zaWduZWQgMTUgYml0IG51bWJlciBmaXhlZCB0byBgMWAgKGluIGJpbmFyeTogYDAwMCAwMDAwIDAwMDAgMDAwMWApLgorICBUaGUgbGVhZGluZyBiaXQgaXMgYDFgLgorKiBgdW51c2VkYCBpcyBhbiBpZ25vcmVkIGJ5dGUuCisqIGBtbW1gIGlzIHRoZSBtZXNzYWdlIHR5cGUsIGFuIHVuc2lnbmVkIDMgYml0IGludGVnZXIuIFRoZSA1IGxlYWRpbmcgYml0cyBtdXN0IGJlIGAwYCBhcyBzb21lIGNsaWVudHMgKGNoZWNrZWQgZm9yCisgIGphdmEgaW4gMC45LjEpIHRha2UgdGhlIHdob2xlIGJ5dGUuCisqIGBuYW1lIGxlbmd0aGAgaXMgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGZpZWxkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyIChtdXN0IGJlID49IDApLgorKiBgbmFtZWAgaXMgdGhlIG1ldGhvZCBuYW1lLCBhIFVURi04IGVuY29kZWQgc3RyaW5nLgorKiBgc2VxIGlkYCBpcyB0aGUgc2VxdWVuY2UgaWQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIuCisKK1RoZSBzZWNvbmQsIG9sZGVyIGVuY29kaW5nIChha2Egbm9uLXN0cmljdCkgaXM6CisKK2BgYAorQmluYXJ5IHByb3RvY29sIE1lc3NhZ2UsIG9sZCBlbmNvZGluZywgOSsgYnl0ZXM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworfCBuYW1lIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgIHwwMDAwMG1tbXwgc2VxIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCitgYGAKKworV2hlcmUgYG5hbWUgbGVuZ3RoYCwgYG5hbWVgLCBgbW1tYCwgYHNlcSBpZGAgYXJlIGFzIGFib3ZlLgorCitCZWNhdXNlIGBuYW1lIGxlbmd0aGAgbXVzdCBiZSBwb3NpdGl2ZSAodGhlcmVmb3JlIHRoZSBmaXJzdCBiaXQgaXMgYWx3YXlzIGAwYCksIHRoZSBmaXJzdCBiaXQgYWxsb3dzIHRoZSByZWNlaXZlciB0byBzZWUKK3doZXRoZXIgdGhlIHN0cmljdCBmb3JtYXQgb3IgdGhlIG9sZCBmb3JtYXQgaXMgdXNlZC4gVGhlcmVmb3JlIGEgc2VydmVyIGFuZCBjbGllbnQgdXNpbmcgdGhlIGRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUKK2JpbmFyeSBwcm90b2NvbCBjYW4gdHJhbnNwYXJlbnRseSB0YWxrIHdpdGggZWFjaCBvdGhlci4gSG93ZXZlciwgd2hlbiBzdHJpY3QgbW9kZSBpcyBlbmZvcmNlZCwgdGhlIG9sZCBmb3JtYXQgaXMKK3JlamVjdGVkLgorCitNZXNzYWdlIHR5cGVzIGFyZSBlbmNvZGVkIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyogX0NhbGxfOiAxCisqIF9SZXBseV86IDIKKyogX0V4Y2VwdGlvbl86IDMKKyogX09uZXdheV86IDQKKworIyMgU3RydWN0CisKK0EgKlN0cnVjdCogaXMgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgZmllbGRzLCBmb2xsb3dlZCBieSBhIHN0b3AgZmllbGQuIEVhY2ggZmllbGQgc3RhcnRzIHdpdGggYSBmaWVsZCBoZWFkZXIgYW5kCitpcyBmb2xsb3dlZCBieSB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4gVGhlIGVuY29kaW5nIGNhbiBiZSBzdW1tYXJpemVkIGJ5IHRoZSBmb2xsb3dpbmcgQk5GOgorCitgYGAKK3N0cnVjdCAgICAgICAgOjo9ICggZmllbGQtaGVhZGVyIGZpZWxkLXZhbHVlICkqIHN0b3AtZmllbGQKK2ZpZWxkLWhlYWRlciAgOjo9IGZpZWxkLXR5cGUgZmllbGQtaWQKK2BgYAorCitCZWNhdXNlIGVhY2ggZmllbGQgaGVhZGVyIGNvbnRhaW5zIHRoZSBmaWVsZC1pZCAoYXMgZGVmaW5lZCBieSB0aGUgVGhyaWZ0IElETCBmaWxlKSwgdGhlIGZpZWxkcyBjYW4gYmUgZW5jb2RlZCBpbiBhbnkKK29yZGVyLiBUaHJpZnQncyB0eXBlIHN5c3RlbSBpcyBub3QgZXh0ZW5zaWJsZTsgeW91IGNhbiBvbmx5IGVuY29kZSB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBzdHJ1Y3RzLiBUaGVyZWZvcmUgaXMgYWxzbworcG9zc2libGUgdG8gaGFuZGxlIHVua25vd24gZmllbGRzIHdoaWxlIGRlY29kaW5nOyB0aGVzZSBhcmUgc2ltcGx5IGlnbm9yZWQuIFdoaWxlIGRlY29kaW5nIHRoZSBmaWVsZCB0eXBlIGNhbiBiZSB1c2VkIHRvCitkZXRlcm1pbmUgaG93IHRvIGRlY29kZSB0aGUgZmllbGQgdmFsdWUuCisKK05vdGUgdGhhdCB0aGUgZmllbGQgbmFtZSBpcyBub3QgZW5jb2RlZCBzbyBmaWVsZCByZW5hbWVzIGluIHRoZSBJREwgZG8gbm90IGFmZmVjdCBmb3J3YXJkIGFuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitUaGUgZGVmYXVsdCBKYXZhIGltcGxlbWVudGF0aW9uIChBcGFjaGUgVGhyaWZ0IDAuOS4xKSBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIHdoZW4gaXQgdHJpZXMgdG8gZGVjb2RlIGEgZmllbGQgdGhhdCBoYXMKK2Fub3RoZXIgZmllbGQtdHlwZSB0aGVuIHdoYXQgaXMgZXhwZWN0ZWQuIFRoZW9yZXRpY2FsbHkgdGhpcyBjb3VsZCBiZSBkZXRlY3RlZCBhdCB0aGUgY29zdCBvZiBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcuCitPdGhlciBpbXBsZW1lbnRhdGlvbiBtYXkgcGVyZm9ybSB0aGlzIGNoZWNrIGFuZCB0aGVuIGVpdGhlciBpZ25vcmUgdGhlIGZpZWxkLCBvciByZXR1cm4gYSBwcm90b2NvbCBleGNlcHRpb24uCisKK0EgKlVuaW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3Qgd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IGF0IG1vc3QgMSBmaWVsZCBtYXkgYmUgZW5jb2RlZC4KKworQW4gKkV4Y2VwdGlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0LgorCisjIyMgU3RydWN0IGVuY29kaW5nCisKK0luIHRoZSBiaW5hcnkgcHJvdG9jb2wgZmllbGQgaGVhZGVycyBhbmQgdGhlIHN0b3AgZmllbGQgYXJlIGVuY29kZWQgYXMgZm9sbG93czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgZmllbGQgaGVhZGVyIGFuZCBmaWVsZCB2YWx1ZToKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8dHR0dHR0dHR8IGZpZWxkIGlkICAgICAgICB8IGZpZWxkIHZhbHVlICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQmluYXJ5IHByb3RvY29sIHN0b3AgZmllbGQ6CisrLS0tLS0tLS0rCit8MDAwMDAwMDB8CisrLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHR0dHR0dHR0YCB0aGUgZmllbGQtdHlwZSwgYSBzaWduZWQgOCBiaXQgaW50ZWdlci4KKyogYGZpZWxkIGlkYCB0aGUgZmllbGQtaWQsIGEgc2lnbmVkIDE2IGJpdCBpbnRlZ2VyIGluIGJpZyBlbmRpYW4gb3JkZXIuCisqIGBmaWVsZC12YWx1ZWAgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuCisKK1RoZSBmb2xsb3dpbmcgZmllbGQtdHlwZXMgYXJlIHVzZWQ6CisKKyogYEJPT0xgLCBlbmNvZGVkIGFzIGAyYAorKiBgQllURWAsIGVuY29kZWQgYXMgYDNgCisqIGBET1VCTEVgLCBlbmNvZGVkIGFzIGA0YAorKiBgSTE2YCwgZW5jb2RlZCBhcyBgNmAKKyogYEkzMmAsIGVuY29kZWQgYXMgYDhgCisqIGBJNjRgLCBlbmNvZGVkIGFzIGAxMGAKKyogYFNUUklOR2AsIHVzZWQgZm9yIGJpbmFyeSBhbmQgc3RyaW5nIGZpZWxkcywgZW5jb2RlZCBhcyBgMTFgCisqIGBTVFJVQ1RgLCB1c2VkIGZvciBzdHJ1Y3RzIGFuZCB1bmlvbiBmaWVsZHMsIGVuY29kZWQgYXMgYDEyYAorKiBgTUFQYCwgZW5jb2RlZCBhcyBgMTNgCisqIGBTRVRgLCBlbmNvZGVkIGFzIGAxNGAKKyogYExJU1RgLCBlbmNvZGVkIGFzIGAxNWAKKworIyMgTGlzdCBhbmQgU2V0CisKK0xpc3QgYW5kIHNldHMgYXJlIGVuY29kZWQgdGhlIHNhbWU6IGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLCBmb2xsb3dlZCBieSB0aGUKK2VuY29kZWQgZWxlbWVudHMuCisKK2BgYAorQmluYXJ5IHByb3RvY29sIGxpc3QgKDUrIGJ5dGVzKSBhbmQgZWxlbWVudHM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHR0dHR0dHR0fCBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlbGVtZW50cyAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHR0dHR0dHR0YCBpcyB0aGUgZWxlbWVudC10eXBlLCBlbmNvZGVkIGFzIGFuIGludDgKKyogYHNpemVgIGlzIHRoZSBzaXplLCBlbmNvZGVkIGFzIGFuIGludDMyLCBwb3NpdGl2ZSB2YWx1ZXMgb25seQorKiBgZWxlbWVudHNgIHRoZSBlbGVtZW50IHZhbHVlcworCitUaGUgZWxlbWVudC10eXBlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgZmllbGQtdHlwZXMuIFRoZSBmdWxsIGxpc3QgaXMgaW5jbHVkZWQgaW4gdGhlIHN0cnVjdCBzZWN0aW9uIGFib3ZlLgorCitUaGUgbWF4aW11bSBsaXN0L3NldCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyMgTWFwCisKK01hcHMgYXJlIGVuY29kZWQgd2l0aCBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBzaXplLCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBrZXlzIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywKK2ZvbGxvd2VkIGJ5IHRoZSBlbmNvZGVkIGVsZW1lbnRzLiBUaGUgZW5jb2RpbmcgZm9sbG93cyB0aGlzIEJORjoKKworYGBgCittYXAgIDo6PSAga2V5LWVsZW1lbnQtdHlwZSB2YWx1ZS1lbGVtZW50LXR5cGUgc2l6ZSAoIGtleSB2YWx1ZSApKgorYGBgCisKK2BgYAorQmluYXJ5IHByb3RvY29sIG1hcCAoNisgYnl0ZXMpIGFuZCBrZXkgdmFsdWUgcGFpcnM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfGtra2tra2trfHZ2dnZ2dnZ2fCBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrZXkgdmFsdWUgcGFpcnMgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGtra2tra2trYCBpcyB0aGUga2V5IGVsZW1lbnQtdHlwZSwgZW5jb2RlZCBhcyBhbiBpbnQ4CisqIGB2dnZ2dnZ2dmAgaXMgdGhlIHZhbHVlIGVsZW1lbnQtdHlwZSwgZW5jb2RlZCBhcyBhbiBpbnQ4CisqIGBzaXplYCBpcyB0aGUgc2l6ZSBvZiB0aGUgbWFwLCBlbmNvZGVkIGFzIGFuIGludDMyLCBwb3NpdGl2ZSB2YWx1ZXMgb25seQorKiBga2V5IHZhbHVlIHBhaXJzYCBhcmUgdGhlIGVuY29kZWQga2V5cyBhbmQgdmFsdWVzCisKK1RoZSBlbGVtZW50LXR5cGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmaWVsZC10eXBlcy4gVGhlIGZ1bGwgbGlzdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RydWN0IHNlY3Rpb24gYWJvdmUuCisKK1RoZSBtYXhpbXVtIG1hcCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKK1RoZSBmb2xsb3dpbmcgQk5GIG5vdGF0aW9uIGlzIHVzZWQ6CisKKyogYSBwbHVzIGArYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMSBvciBtb3JlIHRpbWVzCisqIGEgc3RhciBgKmAgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIG9wdGlvbmFsIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDAgb3IgbW9yZSB0aW1lcworKiBhIHBpcGUgYHxgIGJldHdlZW4gaXRlbXMgcmVwcmVzZW50cyBjaG9pY2UsIHRoZSBmaXJzdCBtYXRjaGluZyBpdGVtIGlzIHNlbGVjdGVkCisqIHBhcmVudGhlc2lzIGAoYCBhbmQgYClgIGFyZSB1c2VkIGZvciBncm91cGluZyBtdWx0aXBsZSBpdGVtcwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDY3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQKQEAgLTAsMCArMSwyOTQgQEAKK1RocmlmdCBDb21wYWN0IHByb3RvY29sIGVuY29kaW5nIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudHMgZGVzY3JpYmVzIHRoZSB3aXJlIGVuY29kaW5nIGZvciBSUEMgdXNpbmcgdGhlIFRocmlmdCAqY29tcGFjdCBwcm90b2NvbCouCisKK1RoZSBpbmZvcm1hdGlvbiBoZXJlIGlzIF9tb3N0bHlfIGJhc2VkIG9uIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGluIHRoZSBBcGFjaGUgdGhyaWZ0IGxpYnJhcnkgKHZlcnNpb24gMC45LjEpIGFuZAorW1RIUklGVC0xMTAgQSBtb3JlIGNvbXBhY3QgZm9ybWF0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTApLiBPdGhlciBpbXBsZW1lbnRhdGlvbiBob3dldmVyLAorc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZS4KKworRm9yIGJhY2tncm91bmQgb24gVGhyaWZ0IHNlZSB0aGUgW1RocmlmdCB3aGl0ZXBhcGVyIChwZGYpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL3N0YXRpYy9maWxlcy90aHJpZnQtMjAwNzA0MDEucGRmKS4KKworIyBDb250ZW50cworCisqIENvbXBhY3QgcHJvdG9jb2wKKyAgKiBCYXNlIHR5cGVzCisgICogTWVzc2FnZQorICAqIFN0cnVjdAorICAqIExpc3QgYW5kIFNldAorICAqIE1hcAorKiBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKKyMgQ29tcGFjdCBwcm90b2NvbAorCisjIyBCYXNlIHR5cGVzCisKKyMjIyBJbnRlZ2VyIGVuY29kaW5nCisKK1RoZSBfY29tcGFjdCBwcm90b2NvbF8gdXNlcyBtdWx0aXBsZSBlbmNvZGluZ3MgZm9yIGludHM6IHRoZSBfemlnemFnIGludF8sIGFuZCB0aGUgX3ZhciBpbnRfLgorCitWYWx1ZXMgb2YgdHlwZSBgaW50MzJgIGFuZCBgaW50NjRgIGFyZSBmaXJzdCB0cmFuc2Zvcm1lZCB0byBhICp6aWd6YWcgaW50Ki4gQSB6aWd6YWcgaW50IGZvbGRzIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZQorbnVtYmVycyBpbnRvIHRoZSBwb3NpdGl2ZSBudW1iZXIgc3BhY2UuIFdoZW4gd2UgcmVhZCAwLCAxLCAyLCAzLCA0IG9yIDUgZnJvbSB0aGUgd2lyZSwgdGhpcyBpcyB0cmFuc2xhdGVkIHRvIDAsIC0xLCAxLAorLTIgb3IgMiByZXNwZWN0aXZlbHkuIEhlcmUgYXJlIHRoZSAoU2NhbGEpIGZvcm11bGFzIHRvIGNvbnZlcnQgZnJvbSBpbnQzMi9pbnQ2NCB0byBhIHppZ3phZyBpbnQgYW5kIGJhY2s6CisKK2BgYHNjYWxhCitkZWYgaW50VG9aaWdaYWcobjogSW50KTogSW50ID0gKG4gPDwgMSkgXiAobiA+PiAzMSkKK2RlZiB6aWd6YWdUb0ludChuOiBJbnQpOiBJbnQgPSAobiA+Pj4gMSkgXiAtIChuICYgMSkKK2RlZiBsb25nVG9aaWdaYWcobjogTG9uZyk6IExvbmcgPSAobiA8PCAxKSBeIChuID4+IDYzKQorZGVmIHppZ3phZ1RvTG9uZyhuOiBMb25nKTogTG9uZyA9IChuID4+PiAxKSBeIC0gKG4gJiAxKQorYGBgCisKK1RoZSB6aWd6YWcgaW50IGlzIHRoZW4gZW5jb2RlZCBhcyBhICp2YXIgaW50Ki4gVmFyIGludHMgdGFrZSAxIHRvIDUgYnl0ZXMgKGludDMyKSBvciAxIHRvIDEwIGJ5dGVzIChpbnQ2NCkuIFRoZSBtb3N0CitzaWduaWZpY2FudCBiaXQgb2YgZWFjaCBieXRlIGluZGljYXRlcyBpZiBtb3JlIGJ5dGVzIGZvbGxvdy4gVGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IDcgYml0cyBmcm9tIGVhY2gKK2J5dGUgZm9ybSB0aGUgbnVtYmVyLCB3aGVyZSB0aGUgZmlyc3QgYnl0ZSBoYXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyAoc28gdGhleSBhcmUgaW4gYmlnIGVuZGlhbiBvciBuZXR3b3JrIG9yZGVyKS4KKworVmFyIGludHMgYXJlIHNvbWV0aW1lcyB1c2VkIGRpcmVjdGx5IGluc2lkZSB0aGUgY29tcGFjdCBwcm90b2NvbCB0byByZXByZXNlbnQgcG9zaXRpdmUgbnVtYmVycy4KKworVG8gZW5jb2RlIGFuIGBpbnQxNmAgYXMgemlnemFnIGludCwgaXQgaXMgZmlyc3QgY29udmVydGVkIHRvIGFuIGBpbnQzMmAgYW5kIHRoZW4gZW5jb2RlZCBhcyBzdWNoLiBUaGUgdHlwZSBgaW50OGAgc2ltcGx5Cit1c2VzIGEgc2luZ2xlIGJ5dGUgYXMgaW4gdGhlIGJpbmFyeSBwcm90b2NvbC4KKworIyMjIEVudW0gZW5jb2RpbmcKKworVGhlIGdlbmVyYXRlZCBjb2RlIGVuY29kZXMgYEVudW1gcyBieSB0YWtpbmcgdGhlIG9yZGluYWwgdmFsdWUgYW5kIHRoZW4gZW5jb2RpbmcgdGhhdCBhcyBhbiBpbnQzMi4KKworIyMjIEJpbmFyeSBlbmNvZGluZworCitCaW5hcnkgaXMgc2VudCBhcyBmb2xsb3dzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCwgYmluYXJ5IGRhdGEsIDErIGJ5dGVzOgorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8IGJ5dGUgbGVuZ3RoICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBieXRlIGxlbmd0aGAgaXMgdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZSBhcnJheSwgdXNpbmcgdmFyIGludCBlbmNvZGluZyAobXVzdCBiZSA+PSAwKS4KKyogYGJ5dGVzYCBhcmUgdGhlIGJ5dGVzIG9mIHRoZSBieXRlIGFycmF5LgorCisjIyMgU3RyaW5nIGVuY29kaW5nCisKKypTdHJpbmcqcyBhcmUgZmlyc3QgZW5jb2RlZCB0byBVVEYtOCwgYW5kIHRoZW4gc2VuZCBhcyBiaW5hcnkuCisKKyMjIyBEb3VibGUgZW5jb2RpbmcKKworVmFsdWVzIG9mIHR5cGUgYGRvdWJsZWAgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBpbnQ2NCBhY2NvcmRpbmcgdG8gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50ICJkb3VibGUgZm9ybWF0IiBiaXQKK2xheW91dC4gTW9zdCBydW4tdGltZXMgcHJvdmlkZSBhIGxpYnJhcnkgdG8gbWFrZSB0aGlzIGNvbnZlcnNpb24uIEJvdGggdGhlIGJpbmFyeSBwcm90b2NvbCBhcyB0aGUgY29tcGFjdCBwcm90b2NvbCB0aGVuCitlbmNvZGUgdGhlIGludDY0IGluIDggYnl0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlci4KKworIyMjIEJvb2xlYW4gZW5jb2RpbmcKKworQm9vbGVhbnMgYXJlIGVuY29kZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgaXMgYSBmaWVsZCB2YWx1ZSAoaW4gYSBzdHJ1Y3QpIG9yIGFuIGVsZW1lbnQgdmFsdWUgKGluIGEgc2V0LAorbGlzdCBvciBtYXApLiBGaWVsZCB2YWx1ZXMgYXJlIGVuY29kZWQgZGlyZWN0bHkgaW4gdGhlIGZpZWxkIGhlYWRlci4gRWxlbWVudCB2YWx1ZXMgb2YgdHlwZSBgYm9vbGAgYXJlIHNlbnQgYXMgYW4gaW50ODsKK3RydWUgYXMgYDFgIGFuZCBmYWxzZSBhcyBgMGAuCisKKyMjIE1lc3NhZ2UKKworQSBgTWVzc2FnZWAgb24gdGhlIHdpcmUgbG9va3MgYXMgZm9sbG93czoKKworYGBgCitDb21wYWN0IHByb3RvY29sIE1lc3NhZ2UgKDQrIGJ5dGVzKToKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xwcHBwcHBwcHxtbW12dnZ2dnwgc2VxIGlkICAgICAgICAgICAgICB8IG5hbWUgbGVuZ3RoICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgcHBwcHBwcHBgIGlzIHRoZSBwcm90b2NvbCBpZCwgZml4ZWQgdG8gYDEwMDAgMDAxMGAsIDB4ODIuCisqIGBtbW1gIGlzIHRoZSBtZXNzYWdlIHR5cGUsIGFuIHVuc2lnbmVkIDMgYml0IGludGVnZXIuCisqIGB2dnZ2dmAgaXMgdGhlIHZlcnNpb24sIGFuIHVuc2lnbmVkIDUgYml0IGludGVnZXIsIGZpeGVkIHRvIGAwMDAwMWAuCisqIGBzZXEgaWRgIGlzIHRoZSBzZXF1ZW5jZSBpZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBhcyBhIHZhciBpbnQuCisqIGBuYW1lIGxlbmd0aGAgaXMgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGZpZWxkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGFzIGEgdmFyIGludCAobXVzdCBiZSA+PSAwKS4KKyogYG5hbWVgIGlzIHRoZSBtZXRob2QgbmFtZSB0byBpbnZva2UsIGEgVVRGLTggZW5jb2RlZCBzdHJpbmcuCisKK01lc3NhZ2UgdHlwZXMgYXJlIGVuY29kZWQgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworKiBfQ2FsbF86IDEKKyogX1JlcGx5XzogMgorKiBfRXhjZXB0aW9uXzogMworKiBfT25ld2F5XzogNAorCisjIyMgU3RydWN0CisKK0EgKlN0cnVjdCogaXMgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgZmllbGRzLCBmb2xsb3dlZCBieSBhIHN0b3AgZmllbGQuIEVhY2ggZmllbGQgc3RhcnRzIHdpdGggYSBmaWVsZCBoZWFkZXIgYW5kCitpcyBmb2xsb3dlZCBieSB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4gVGhlIGVuY29kaW5nIGNhbiBiZSBzdW1tYXJpemVkIGJ5IHRoZSBmb2xsb3dpbmcgQk5GOgorCitgYGAKK3N0cnVjdCAgICAgICAgOjo9ICggZmllbGQtaGVhZGVyIGZpZWxkLXZhbHVlICkqIHN0b3AtZmllbGQKK2ZpZWxkLWhlYWRlciAgOjo9IGZpZWxkLXR5cGUgZmllbGQtaWQKK2BgYAorCitCZWNhdXNlIGVhY2ggZmllbGQgaGVhZGVyIGNvbnRhaW5zIHRoZSBmaWVsZC1pZCAoYXMgZGVmaW5lZCBieSB0aGUgVGhyaWZ0IElETCBmaWxlKSwgdGhlIGZpZWxkcyBjYW4gYmUgZW5jb2RlZCBpbiBhbnkKK29yZGVyLiBUaHJpZnQncyB0eXBlIHN5c3RlbSBpcyBub3QgZXh0ZW5zaWJsZTsgeW91IGNhbiBvbmx5IGVuY29kZSB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBzdHJ1Y3RzLiBUaGVyZWZvcmUgaXMgYWxzbworcG9zc2libGUgdG8gaGFuZGxlIHVua25vd24gZmllbGRzIHdoaWxlIGRlY29kaW5nOyB0aGVzZSBhcmUgc2ltcGx5IGlnbm9yZWQuIFdoaWxlIGRlY29kaW5nIHRoZSBmaWVsZCB0eXBlIGNhbiBiZSB1c2VkIHRvCitkZXRlcm1pbmUgaG93IHRvIGRlY29kZSB0aGUgZmllbGQgdmFsdWUuCisKK05vdGUgdGhhdCB0aGUgZmllbGQgbmFtZSBpcyBub3QgZW5jb2RlZCBzbyBmaWVsZCByZW5hbWVzIGluIHRoZSBJREwgZG8gbm90IGFmZmVjdCBmb3J3YXJkIGFuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitUaGUgZGVmYXVsdCBKYXZhIGltcGxlbWVudGF0aW9uIChBcGFjaGUgVGhyaWZ0IDAuOS4xKSBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIHdoZW4gaXQgdHJpZXMgdG8gZGVjb2RlIGEgZmllbGQgdGhhdCBoYXMKK2Fub3RoZXIgZmllbGQtdHlwZSB0aGFuIHdoYXQgaXMgZXhwZWN0ZWQuIFRoZW9yZXRpY2FsbHkgdGhpcyBjb3VsZCBiZSBkZXRlY3RlZCBhdCB0aGUgY29zdCBvZiBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcuCitPdGhlciBpbXBsZW1lbnRhdGlvbiBtYXkgcGVyZm9ybSB0aGlzIGNoZWNrIGFuZCB0aGVuIGVpdGhlciBpZ25vcmUgdGhlIGZpZWxkLCBvciByZXR1cm4gYSBwcm90b2NvbCBleGNlcHRpb24uCisKK0EgKlVuaW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3Qgd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IGF0IG1vc3QgMSBmaWVsZCBtYXkgYmUgZW5jb2RlZC4KKworQW4gKkV4Y2VwdGlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0LgorCisjIyMgU3RydWN0IGVuY29kaW5nCisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBmaWVsZCBoZWFkZXIgKHNob3J0IGZvcm0pIGFuZCBmaWVsZCB2YWx1ZToKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8ZGRkZHR0dHR8IGZpZWxkIHZhbHVlICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBmaWVsZCBoZWFkZXIgKDEgdG8gMyBieXRlcywgbG9uZyBmb3JtKSBhbmQgZmllbGQgdmFsdWU6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wwMDAwdHR0dHwgZmllbGQgaWQgICAgICAgICAgICB8IGZpZWxkIHZhbHVlICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgc3RvcCBmaWVsZDoKKystLS0tLS0tLSsKK3wwMDAwMDAwMHwKKystLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgZGRkZGAgaXMgdGhlIGZpZWxkIGlkIGRlbHRhLCBhbiB1bnNpZ25lZCA0IGJpdHMgaW50ZWdlciwgc3RyaWN0bHkgcG9zaXRpdmUuCisqIGB0dHR0YCBpcyBmaWVsZC10eXBlIGlkLCBhbiB1bnNpZ25lZCA0IGJpdCBpbnRlZ2VyLgorKiBgZmllbGQgaWRgIHRoZSBmaWVsZCBpZCwgYSBzaWduZWQgMTYgYml0IGludGVnZXIgZW5jb2RlZCBhcyB6aWd6YWcgaW50LgorKiBgZmllbGQtdmFsdWVgIHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLgorCitUaGUgZmllbGQgaWQgZGVsdGEgY2FuIGJlIGNvbXB1dGVkIGJ5IGBjdXJyZW50LWZpZWxkLWlkIC0gcHJldmlvdXMtZmllbGQtaWRgLCBvciBqdXN0IGBjdXJyZW50LWZpZWxkLWlkYCBpZiB0aGlzIGlzIHRoZQorZmlyc3Qgb2YgdGhlIHN0cnVjdC4gVGhlIHNob3J0IGZvcm0gc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgZmllbGQgaWQgZGVsdGEgaXMgaW4gdGhlIHJhbmdlIDEgLSAxNSAoaW5jbHVzaXZlKS4KKworVGhlIGZvbGxvd2luZyBmaWVsZC10eXBlcyBjYW4gYmUgZW5jb2RlZDoKKworKiBgQk9PTEVBTl9UUlVFYCwgZW5jb2RlZCBhcyBgMWAKKyogYEJPT0xFQU5fRkFMU0VgLCBlbmNvZGVkIGFzIGAyYAorKiBgQllURWAsIGVuY29kZWQgYXMgYDNgCisqIGBJMTZgLCBlbmNvZGVkIGFzIGA0YAorKiBgSTMyYCwgZW5jb2RlZCBhcyBgNWAKKyogYEk2NGAsIGVuY29kZWQgYXMgYDZgCisqIGBET1VCTEVgLCBlbmNvZGVkIGFzIGA3YAorKiBgQklOQVJZYCwgdXNlZCBmb3IgYmluYXJ5IGFuZCBzdHJpbmcgZmllbGRzLCBlbmNvZGVkIGFzIGA4YAorKiBgTElTVGAsIGVuY29kZWQgYXMgYDlgCisqIGBTRVRgLCBlbmNvZGVkIGFzIGAxMGAKKyogYE1BUGAsIGVuY29kZWQgYXMgYDExYAorKiBgU1RSVUNUYCwgdXNlZCBmb3IgYm90aCBzdHJ1Y3RzIGFuZCB1bmlvbiBmaWVsZHMsIGVuY29kZWQgYXMgYDEyYAorCitOb3RlIHRoYXQgYmVjYXVzZSB0aGVyZSBhcmUgMiBzcGVjaWZpYyBmaWVsZCB0eXBlcyBmb3IgdGhlIGJvb2xlYW4gdmFsdWVzLCB0aGUgZW5jb2Rpbmcgb2YgYSBib29sZWFuIGZpZWxkIHZhbHVlIGhhcyBubworbGVuZ3RoICgwIGJ5dGVzKS4KKworIyMgTGlzdCBhbmQgU2V0CisKK0xpc3QgYW5kIHNldHMgYXJlIGVuY29kZWQgdGhlIHNhbWU6IGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLCBmb2xsb3dlZCBieSB0aGUKK2VuY29kZWQgZWxlbWVudHMuCisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBsaXN0IGhlYWRlciAoMSBieXRlLCBzaG9ydCBmb3JtKSBhbmQgZWxlbWVudHM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHNzc3N0dHR0fCBlbGVtZW50cyAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgbGlzdCBoZWFkZXIgKDIrIGJ5dGVzLCBsb25nIGZvcm0pIGFuZCBlbGVtZW50czoKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfDExMTF0dHR0fCBzaXplICAgICAgICAgICAgICAgIHwgZWxlbWVudHMgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgc3Nzc2AgaXMgdGhlIHNpemUsIDQgYml0IHVuc2lnbmVkIGludCwgdmFsdWVzIGAwYCAtIGAxNGAKKyogYHR0dHRgIGlzIHRoZSBlbGVtZW50LXR5cGUsIGEgNCBiaXQgdW5zaWduZWQgaW50CisqIGBzaXplYCBpcyB0aGUgc2l6ZSwgYSB2YXIgaW50IChpbnQzMiksIHBvc2l0aXZlIHZhbHVlcyBgMTVgIG9yIGhpZ2hlcgorKiBgZWxlbWVudHNgIGFyZSB0aGUgZW5jb2RlZCBlbGVtZW50cworCitUaGUgc2hvcnQgZm9ybSBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBsZW5ndGggaXMgaW4gdGhlIHJhbmdlIDAgLSAxNCAoaW5jbHVzaXZlKS4KKworVGhlIGZvbGxvd2luZyBlbGVtZW50LXR5cGVzIGFyZSB1c2VkIChub3RlIHRoYXQgdGhlc2UgYXJlIF9kaWZmZXJlbnRfIGZyb20gdGhlIGZpZWxkLXR5cGVzKToKKworKiBgQk9PTGAsIGVuY29kZWQgYXMgYDJgCisqIGBCWVRFYCwgZW5jb2RlZCBhcyBgM2AKKyogYERPVUJMRWAsIGVuY29kZWQgYXMgYDRgCisqIGBJMTZgLCBlbmNvZGVkIGFzIGA2YAorKiBgSTMyYCwgZW5jb2RlZCBhcyBgOGAKKyogYEk2NGAsIGVuY29kZWQgYXMgYDEwYAorKiBgU1RSSU5HYCwgdXNlZCBmb3IgYmluYXJ5IGFuZCBzdHJpbmcgZmllbGRzLCBlbmNvZGVkIGFzIGAxMWAKKyogYFNUUlVDVGAsIHVzZWQgZm9yIHN0cnVjdHMgYW5kIHVuaW9uIGZpZWxkcywgZW5jb2RlZCBhcyBgMTJgCisqIGBNQVBgLCBlbmNvZGVkIGFzIGAxM2AKKyogYFNFVGAsIGVuY29kZWQgYXMgYDE0YAorKiBgTElTVGAsIGVuY29kZWQgYXMgYDE1YAorCisKK1RoZSBtYXhpbXVtIGxpc3Qvc2V0IHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIyBNYXAKKworTWFwcyBhcmUgZW5jb2RlZCB3aXRoIGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUsIHRoZSB0eXBlIG9mIHRoZSBrZXlzIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywgZm9sbG93ZWQKK2J5IHRoZSBlbmNvZGVkIGVsZW1lbnRzLiBUaGUgZW5jb2RpbmcgZm9sbG93cyB0aGlzIEJORjoKKworYGBgCittYXAgICAgICAgICAgIDo6PSBlbXB0eS1tYXAgfCBub24tZW1wdHktbWFwCitlbXB0eS1tYXAgICAgIDo6PSBgMGAKK25vbi1lbXB0eS1tYXAgOjo9IHNpemUga2V5LWVsZW1lbnQtdHlwZSB2YWx1ZS1lbGVtZW50LXR5cGUgKGtleSB2YWx1ZSkrCitgYGAKKworYGBgCitDb21wYWN0IHByb3RvY29sIG1hcCBoZWFkZXIgKDEgYnl0ZSwgZW1wdHkgbWFwKToKKystLS0tLS0tLSsKK3wwMDAwMDAwMHwKKystLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBtYXAgaGVhZGVyICgyKyBieXRlcywgbm9uIGVtcHR5IG1hcCkgYW5kIGtleSB2YWx1ZSBwYWlyczoKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfCBzaXplICAgICAgICAgICAgICAgIHxra2trdnZ2dnwga2V5IHZhbHVlIHBhaXJzICAgICB8CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgc2l6ZWAgaXMgdGhlIHNpemUsIGEgdmFyIGludCAoaW50MzIpLCBzdHJpY3RseSBwb3NpdGl2ZSB2YWx1ZXMKKyogYGtra2tgIGlzIHRoZSBrZXkgZWxlbWVudC10eXBlLCBhIDQgYml0IHVuc2lnbmVkIGludAorKiBgdnZ2dmAgaXMgdGhlIHZhbHVlIGVsZW1lbnQtdHlwZSwgYSA0IGJpdCB1bnNpZ25lZCBpbnQKKyogYGtleSB2YWx1ZSBwYWlyc2AgYXJlIHRoZSBlbmNvZGVkIGtleXMgYW5kIHZhbHVlcworCitUaGUgZWxlbWVudC10eXBlcyBhcmUgdGhlIHNhbWUgYXMgZm9yIGxpc3RzLiBUaGUgZnVsbCBsaXN0IGlzIGluY2x1ZGVkIGluIHRoZSAnTGlzdCBhbmQgc2V0JyBzZWN0aW9uLgorCitUaGUgbWF4aW11bSBtYXAgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMgQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCitUaGUgZm9sbG93aW5nIEJORiBub3RhdGlvbiBpcyB1c2VkOgorCisqIGEgcGx1cyBgK2AgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDEgb3IgbW9yZSB0aW1lcworKiBhIHN0YXIgYCpgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyBvcHRpb25hbCByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAwIG9yIG1vcmUgdGltZXMKKyogYSBwaXBlIGB8YCBiZXR3ZWVuIGl0ZW1zIHJlcHJlc2VudHMgY2hvaWNlLCB0aGUgZmlyc3QgbWF0Y2hpbmcgaXRlbSBpcyBzZWxlY3RlZAorKiBwYXJlbnRoZXNpcyBgKGAgYW5kIGApYCBhcmUgdXNlZCBmb3IgZ3JvdXBpbmcgbXVsdGlwbGUgaXRlbXMKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtcHJvdG9jb2wtc3BlYy5tZCBiL2RvYy9zcGVjcy90aHJpZnQtcHJvdG9jb2wtc3BlYy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzFhNjFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1wcm90b2NvbC1zcGVjLm1kCkBAIC0wLDAgKzEsMTAxIEBACitUaHJpZnQgUHJvdG9jb2wgU3RydWN0dXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitMYXN0IE1vZGlmaWVkOiAyMDA3LUp1bi0yOQorCis8IS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wKK3dpdGhvdXQgc3BlY2lmeWluZyB0aGUgZW5jb2RpbmcuIFRodXMsIHRoZSBvcmRlciBvZiBlbGVtZW50cworY291bGQgaW4gc29tZSBjYXNlcyBiZSByZWFycmFuZ2VkIGRlcGVuZGluZyB1cG9uIHRoZSBUUHJvdG9jb2wKK2ltcGxlbWVudGF0aW9uLCBidXQgdGhpcyBkb2N1bWVudCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gcmVxdWlyZWQKK3N0cnVjdHVyZS4gVGhlcmUgYXJlIHNvbWUgImR1bWIiIHRlcm1pbmFscyBsaWtlIFNUUklORyBhbmQgSU5UCit0aGF0IHRha2UgdGhlIHBsYWNlIG9mIGFuIGFjdHVhbCBlbmNvZGluZyBzcGVjaWZpY2F0aW9uLgorCitUaGV5IGtleSBwb2ludCB0byBub3RpY2UgaXMgdGhhdCBBTEwgbWVzc2FnZXMgYXJlIGp1c3Qgb25lIHdyYXBwZWQKK2A8c3RydWN0PmAuIERlcGVuZGluZyB1cG9uIHRoZSBtZXNzYWdlIHR5cGUsIHRoZSBgPHN0cnVjdD5gIGNhbiBiZQoraW50ZXJwcmV0ZWQgYXMgdGhlIGFyZ3VtZW50IGxpc3QgdG8gYSBmdW5jdGlvbiwgdGhlIHJldHVybiB2YWx1ZQorb2YgYSBmdW5jdGlvbiwgb3IgYW4gZXhjZXB0aW9uLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitgYGAKKyAgICAgICA8bWVzc2FnZT4gOjo9IDxtZXNzYWdlLWJlZ2luPiA8c3RydWN0PiA8bWVzc2FnZS1lbmQ+CisKKyA8bWVzc2FnZS1iZWdpbj4gOjo9IDxtZXRob2QtbmFtZT4gPG1lc3NhZ2UtdHlwZT4gPG1lc3NhZ2Utc2VxaWQ+CisKKyAgIDxtZXRob2QtbmFtZT4gOjo9IFNUUklORworCisgIDxtZXNzYWdlLXR5cGU+IDo6PSBUX0NBTEwgfCBUX1JFUExZIHwgVF9FWENFUFRJT04gfCBUX09ORVdBWQorCisgPG1lc3NhZ2Utc2VxaWQ+IDo6PSBJMzIKKworICAgICAgICA8c3RydWN0PiA6Oj0gPHN0cnVjdC1iZWdpbj4gPGZpZWxkPiogPGZpZWxkLXN0b3A+IDxzdHJ1Y3QtZW5kPgorCisgIDxzdHJ1Y3QtYmVnaW4+IDo6PSA8c3RydWN0LW5hbWU+CisKKyAgIDxzdHJ1Y3QtbmFtZT4gOjo9IFNUUklORworCisgICAgPGZpZWxkLXN0b3A+IDo6PSBUX1NUT1AKKworICAgICAgICAgPGZpZWxkPiA6Oj0gPGZpZWxkLWJlZ2luPiA8ZmllbGQtZGF0YT4gPGZpZWxkLWVuZD4KKworICAgPGZpZWxkLWJlZ2luPiA6Oj0gPGZpZWxkLW5hbWU+IDxmaWVsZC10eXBlPiA8ZmllbGQtaWQ+CisKKyAgICA8ZmllbGQtbmFtZT4gOjo9IFNUUklORworCisgICAgPGZpZWxkLXR5cGU+IDo6PSBUX0JPT0wgfCBUX0JZVEUgfCBUX0k4IHwgVF9JMTYgfCBUX0kzMiB8IFRfSTY0IHwgVF9ET1VCTEUKKyAgICAgICAgICAgICAgICAgICAgIHwgVF9TVFJJTkcgfCBUX0JJTkFSWSB8IFRfU1RSVUNUIHwgVF9NQVAgfCBUX1NFVCB8IFRfTElTVAorCisgICAgICA8ZmllbGQtaWQ+IDo6PSBJMTYKKworICAgIDxmaWVsZC1kYXRhPiA6Oj0gSTggfCBJMTYgfCBJMzIgfCBJNjQgfCBET1VCTEUgfCBTVFJJTkcgfCBCSU5BUlkKKyAgICAgICAgICAgICAgICAgICAgIDxzdHJ1Y3Q+IHwgPG1hcD4gfCA8bGlzdD4gfCA8c2V0PgorCisgICAgICAgICAgIDxtYXA+IDo6PSA8bWFwLWJlZ2luPiA8ZmllbGQtZGF0dW0+KiA8bWFwLWVuZD4KKworICAgICA8bWFwLWJlZ2luPiA6Oj0gPG1hcC1rZXktdHlwZT4gPG1hcC12YWx1ZS10eXBlPiA8bWFwLXNpemU+CisKKyAgPG1hcC1rZXktdHlwZT4gOjo9IDxmaWVsZC10eXBlPgorCis8bWFwLXZhbHVlLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KKworICAgICAgPG1hcC1zaXplPiA6Oj0gSTMyCisKKyAgICAgICAgICA8bGlzdD4gOjo9IDxsaXN0LWJlZ2luPiA8ZmllbGQtZGF0YT4qIDxsaXN0LWVuZD4KKworICAgIDxsaXN0LWJlZ2luPiA6Oj0gPGxpc3QtZWxlbS10eXBlPiA8bGlzdC1zaXplPgorCis8bGlzdC1lbGVtLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KKworICAgICA8bGlzdC1zaXplPiA6Oj0gSTMyCisKKyAgICAgICAgICAgPHNldD4gOjo9IDxzZXQtYmVnaW4+IDxmaWVsZC1kYXRhPiogPHNldC1lbmQ+CisKKyAgICAgPHNldC1iZWdpbj4gOjo9IDxzZXQtZWxlbS10eXBlPiA8c2V0LXNpemU+CisKKyA8c2V0LWVsZW0tdHlwZT4gOjo9IDxmaWVsZC10eXBlPgorCisgICAgICA8c2V0LXNpemU+IDo6PSBJMzIKK2BgYApkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1ycGMubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LXJwYy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDVjMDZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1ycGMubWQKQEAgLTAsMCArMSwxNzggQEAKK1RocmlmdCBSZW1vdGUgUHJvY2VkdXJlIENhbGwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2ggbGV2ZWwgbWVzc2FnZSBleGNoYW5nZSBiZXR3ZWVuIHRoZSBUaHJpZnQgUlBDIGNsaWVudCBhbmQgc2VydmVyLgorU2VlIFt0aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kXSBhbmQgW3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kXSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhlIGV4Y2hhbmdlcyBhcmUgZW5jb2RlZCBvbgordGhlIHdpcmUuCisKK0luIGFkZGl0aW9uLCB0aGlzIGRvY3VtZW50IGNvbXBhcmVzIHRoZSBiaW5hcnkgcHJvdG9jb2wgd2l0aCB0aGUgY29tcGFjdCBwcm90b2NvbC4gRmluYWxseSBpdCBkZXNjcmliZXMgdGhlIGZyYW1lZCB2cy4KK3VuZnJhbWVkIHRyYW5zcG9ydC4KKworVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgX21vc3RseV8gYmFzZWQgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gaW4gdGhlIEFwYWNoZSB0aHJpZnQgbGlicmFyeSAodmVyc2lvbiAwLjkuMSBhbmQKKzAuOS4zKS4gT3RoZXIgaW1wbGVtZW50YXRpb24gaG93ZXZlciwgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZS4KKworRm9yIGJhY2tncm91bmQgb24gVGhyaWZ0IHNlZSB0aGUgW1RocmlmdCB3aGl0ZXBhcGVyIChwZGYpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL3N0YXRpYy9maWxlcy90aHJpZnQtMjAwNzA0MDEucGRmKS4KKworIyBDb250ZW50cworCisqIFRocmlmdCBNZXNzYWdlIGV4Y2hhbmdlIGZvciBSZW1vdGUgUHJvY2VkdXJlIENhbGwKKyAgKiBNZXNzYWdlCisgICogUmVxdWVzdCBzdHJ1Y3QKKyAgKiBSZXNwb25zZSBzdHJ1Y3QKKyogUHJvdG9jb2wgY29uc2lkZXJhdGlvbnMKKyAgKiBDb21wYXJpbmcgYmluYXJ5IGFuZCBjb21wYWN0IHByb3RvY29sCisgICogQ29tcGF0aWJpbGl0eQorICAqIEZyYW1lZCB2cyB1bmZyYW1lZCB0cmFuc3BvcnQKKworIyBUaHJpZnQgUmVtb3RlIFByb2NlZHVyZSBDYWxsIE1lc3NhZ2UgZXhjaGFuZ2UKKworQm90aCB0aGUgYmluYXJ5IHByb3RvY29sIGFuZCB0aGUgY29tcGFjdCBwcm90b2NvbCBhc3N1bWUgYSB0cmFuc3BvcnQgbGF5ZXIgdGhhdCBleHBvc2VzIGEgYmktZGlyZWN0aW9uYWwgYnl0ZSBzdHJlYW0sCitmb3IgZXhhbXBsZSBhIFRDUCBzb2NrZXQuIEJvdGggdXNlIHRoZSBmb2xsb3dpbmcgZXhjaGFuZ2U6CisKKzEuIENsaWVudCBzZW5kcyBhIGBNZXNzYWdlYCAodHlwZSBgQ2FsbGAgb3IgYE9uZXdheWApLiBUaGUgVE1lc3NhZ2UgY29udGFpbnMgc29tZSBtZXRhZGF0YSBhbmQgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAorICAgdG8gaW52b2tlLgorMi4gQ2xpZW50IHNlbmRzIG1ldGhvZCBhcmd1bWVudHMgKGEgc3RydWN0IGRlZmluZWQgYnkgdGhlIGdlbmVyYXRlIGNvZGUpLgorMy4gU2VydmVyIHNlbmRzIGEgYE1lc3NhZ2VgICh0eXBlIGBSZXBseWAgb3IgYEV4Y2VwdGlvbmApIHRvIHN0YXJ0IHRoZSByZXNwb25zZS4KKzQuIFNlcnZlciBzZW5kcyBhIHN0cnVjdCBjb250YWluaW5nIHRoZSBtZXRob2QgcmVzdWx0IG9yIGV4Y2VwdGlvbi4KKworVGhlIHBhdHRlcm4gaXMgYSBzaW1wbGUgaGFsZiBkdXBsZXggcHJvdG9jb2wgd2hlcmUgdGhlIHBhcnRpZXMgYWx0ZXJuYXRlIGluIHNlbmRpbmcgYSBgTWVzc2FnZWAgZm9sbG93ZWQgYnkgYSBzdHJ1Y3QuCitXaGF0IHRoZXNlIGFyZSBpcyBkZXNjcmliZWQgYmVsb3cuCisKK0FsdGhvdWdoIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0IEphdmEgY2xpZW50cyBkbyBub3Qgc3VwcG9ydCBwaXBlbGluaW5nIChzZW5kaW5nIG11bHRpcGxlIHJlcXVlc3RzIHdpdGhvdXQgd2FpdGluZworZm9yIGFuIHJlc3BvbnNlKSwgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQgSmF2YSBzZXJ2ZXJzIGRvIHN1cHBvcnQgaXQuCisKKyMjIE1lc3NhZ2UKKworQSAqTWVzc2FnZSogY29udGFpbnM6CisKKyogX05hbWVfLCBhIHN0cmluZyAoY2FuIGJlIGVtcHR5KS4KKyogX01lc3NhZ2UgdHlwZV8sIGEgbWVzc2FnZSB0eXBlcywgb25lIG9mIGBDYWxsYCwgYFJlcGx5YCwgYEV4Y2VwdGlvbmAgYW5kIGBPbmV3YXlgLgorKiBfU2VxdWVuY2UgaWRfLCBhIHNpZ25lZCBpbnQzMiBpbnRlZ2VyLgorCitUaGUgKnNlcXVlbmNlIGlkKiBpcyBhIHNpbXBsZSBtZXNzYWdlIGlkIGFzc2lnbmVkIGJ5IHRoZSBjbGllbnQuIFRoZSBzZXJ2ZXIgd2lsbCB1c2UgdGhlIHNhbWUgc2VxdWVuY2UgaWQgaW4gdGhlCittZXNzYWdlIG9mIHRoZSByZXNwb25zZS4gVGhlIGNsaWVudCB1c2VzIHRoaXMgbnVtYmVyIHRvIGRldGVjdCBvdXQgb2Ygb3JkZXIgcmVzcG9uc2VzLiBFYWNoIGNsaWVudCBoYXMgYW4gaW50MzIgZmllbGQKK3doaWNoIGlzIGluY3JlYXNlZCBmb3IgZWFjaCBtZXNzYWdlLiBUaGUgc2VxdWVuY2UgaWQgc2ltcGx5IHdyYXBzIGFyb3VuZCB3aGVuIGl0IG92ZXJmbG93cy4KKworVGhlICpuYW1lKiBpbmRpY2F0ZXMgdGhlIHNlcnZpY2UgbWV0aG9kIG5hbWUgdG8gaW52b2tlLiBUaGUgc2VydmVyIGNvcGllcyB0aGUgbmFtZSBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKworV2hlbiB0aGUgKm11bHRpcGxleGVkIHByb3RvY29sKiBpcyB1c2VkLCB0aGUgbmFtZSBjb250YWlucyB0aGUgc2VydmljZSBuYW1lLCBhIGNvbG9uIGA6YCBhbmQgdGhlIG1ldGhvZCBuYW1lLiBUaGUKK211bHRpcGxleGVkIHByb3RvY29sIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb3RoZXIgcHJvdG9jb2xzLgorCitUaGUgKm1lc3NhZ2UgdHlwZSogaW5kaWNhdGVzIHdoYXQga2luZCBvZiBtZXNzYWdlIGlzIHNlbnQuIENsaWVudHMgc2VuZCByZXF1ZXN0cyB3aXRoIFRNZXNzYWdlcyBvZiB0eXBlIGBDYWxsYCBvcgorYE9uZXdheWAgKHN0ZXAgMSBpbiB0aGUgcHJvdG9jb2wgZXhjaGFuZ2UpLiBTZXJ2ZXJzIHNlbmQgcmVzcG9uc2VzIHdpdGggbWVzc2FnZXMgb2YgdHlwZSBgRXhjZXB0aW9uYCBvciBgUmVwbHlgIChzdGVwCiszKS4KKworVHlwZSBgUmVwbHlgIGlzIHVzZWQgd2hlbiB0aGUgc2VydmljZSBtZXRob2QgY29tcGxldGVzIG5vcm1hbGx5LiBUaGF0IGlzLCBpdCByZXR1cm5zIGEgdmFsdWUgb3IgaXQgdGhyb3dzIG9uZSBvZiB0aGUKK2V4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETCBmaWxlLgorCitUeXBlIGBFeGNlcHRpb25gIGlzIHVzZWQgZm9yIG90aGVyIGV4Y2VwdGlvbnMuIFRoYXQgaXM6IHdoZW4gdGhlIHNlcnZpY2UgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gdGhhdCBpcyBub3QgZGVjbGFyZWQKK2luIHRoZSBUaHJpZnQgSURMIGZpbGUsIG9yIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgVGhyaWZ0IHN0YWNrIHRocm93cyBhbiBleGNlcHRpb24uIEZvciBleGFtcGxlIHdoZW4gdGhlIHNlcnZlciBjb3VsZAorbm90IGVuY29kZSBvciBkZWNvZGUgYSBtZXNzYWdlIG9yIHN0cnVjdC4KKworSW4gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gKDAuOS4zKSB0aGVyZSBpcyBkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIHRoZSBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHNlcnZlci4gSW4gdGhlIGFzeW5jCitzZXJ2ZXIgYWxsIGV4Y2VwdGlvbnMgYXJlIHNlbmQgYXMgYSBgVEFwcGxpY2F0aW9uRXhjZXB0aW9uYCAoc2VlICdSZXNwb25zZSBzdHJ1Y3QnIGJlbG93KS4gSW4gdGhlIHN5bmNocm9ub3VzIEphdmEKK2ltcGxlbWVudGF0aW9uIG9ubHkgKHVuZGVjbGFyZWQpIGV4Y2VwdGlvbnMgdGhhdCBleHRlbmQgYFRFeGNlcHRpb25gIGFyZSBzZW5kIGFzIGEgYFRBcHBsaWNhdGlvbkV4Y2VwdGlvbmAuIFVuY2hlY2tlZAorZXhjZXB0aW9ucyBsZWFkIHRvIGFuIGltbWVkaWF0ZSBjbG9zZSBvZiB0aGUgY29ubmVjdGlvbi4KKworVHlwZSBgT25ld2F5YCBpcyBvbmx5IHVzZWQgc3RhcnRpbmcgZnJvbSBBcGFjaGUgVGhyaWZ0IDAuOS4zLiBFYXJsaWVyIHZlcnNpb25zIGRvIF9ub3RfIHNlbmQgVE1lc3NhZ2VzIG9mIHR5cGUgYE9uZXdheWAsCitldmVuIGZvciBzZXJ2aWNlIG1ldGhvZHMgZGVmaW5lZCB3aXRoIHRoZSBgb25ld2F5YCBtb2RpZmllci4KKworV2hlbiBjbGllbnQgc2VuZHMgYSByZXF1ZXN0IHdpdGggdHlwZSBgT25ld2F5YCwgdGhlIHNlcnZlciBtdXN0IF9ub3RfIHNlbmQgYSByZXNwb25zZSAoc3RlcHMgMyBhbmQgNCBhcmUgc2tpcHBlZCkuIE5vdGUKK3RoYXQgdGhlIFRocmlmdCBJREwgZW5mb3JjZXMgYSByZXR1cm4gdHlwZSBvZiBgdm9pZGAgYW5kIGRvZXMgbm90IGFsbG93IGV4Y2VwdGlvbnMgZm9yIG9uZXdheSBzZXJ2aWNlcy4KKworIyMgUmVxdWVzdCBzdHJ1Y3QKKworVGhlIHN0cnVjdCB0aGF0IGZvbGxvd3MgdGhlIG1lc3NhZ2Ugb2YgdHlwZSBgQ2FsbGAgb3IgYE9uZXdheWAgY29udGFpbnMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgc2VydmljZSBtZXRob2QuIFRoZQorYXJndW1lbnQgaWRzIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIGlkcy4gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdpdGggYF9hcmdzYCBhcHBlbmRlZC4KK0ZvciBtZXRob2RzIHdpdGhvdXQgYXJndW1lbnRzIGFuIHN0cnVjdCBpcyBzZW50IHdpdGhvdXQgZmllbGRzLgorCisjIyBSZXNwb25zZSBzdHJ1Y3QKKworVGhlIHN0cnVjdCB0aGF0IGZvbGxvd3MgdGhlIG1lc3NhZ2Ugb2YgdHlwZSBgUmVwbHlgIGFyZSBzdHJ1Y3RzIGluIHdoaWNoIGV4YWN0bHkgMSBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyBpcyBlbmNvZGVkOgorCisqIEEgZmllbGQgd2l0aCBuYW1lIGBzdWNjZXNzYCBhbmQgaWQgYDBgLCB1c2VkIGluIGNhc2UgdGhlIG1ldGhvZCBjb21wbGV0ZWQgbm9ybWFsbHkuCisqIEFuIGV4Y2VwdGlvbiBmaWVsZCwgbmFtZSBhbmQgaWQgYXJlIGFzIGRlZmluZWQgaW4gdGhlIGB0aHJvd3NgIGNsYXVzZSBpbiB0aGUgVGhyaWZ0IElETCdzIHNlcnZpY2UgbWV0aG9kIGRlZmluaXRpb24uCisKK1doZW4gdGhlIG1lc3NhZ2UgaXMgb2YgdHlwZSBgRXhjZXB0aW9uYCB0aGUgc3RydWN0IGlzIGVuY29kZWQgYXMgaWYgaXQgd2FzIGRlY2xhcmVkIGJ5IHRoZSBmb2xsb3dpbmcgSURMOgorCitgYGAKK2V4Y2VwdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24geworICAxOiBzdHJpbmcgbWVzc2FnZSwKKyAgMjogaTMyIHR5cGUKK30KK2BgYAorCitUaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiB0eXBlcyBhcmUgZGVmaW5lZCBpbiB0aGUgamF2YSBpbXBsZW1lbnRhdGlvbiAoMC45LjMpOgorCisqIF91bmtub3duXzogMCwgdXNlZCBpbiBjYXNlIHRoZSB0eXBlIGZyb20gdGhlIHBlZXIgaXMgdW5rbm93bi4KKyogX3Vua25vd24gbWV0aG9kXzogMSwgdXNlZCBpbiBjYXNlIHRoZSBtZXRob2QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQgaXMgdW5rbm93biBieSB0aGUgc2VydmVyLgorKiBfaW52YWxpZCBtZXNzYWdlIHR5cGVfOiAyLCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF93cm9uZyBtZXRob2QgbmFtZV86IDMsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX2JhZCBzZXF1ZW5jZSBpZF86IDQsIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY2xpZW50IHRvIGluZGljYXRlIGEgd3Jvbmcgc2VxdWVuY2UgaWQgaW4gdGhlIHJlc3BvbnNlLgorKiBfbWlzc2luZyByZXN1bHRfOiA1LCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNsaWVudCB0byBpbmRpY2F0ZSBhIHJlc3BvbnNlIHdpdGhvdXQgYW55IGZpZWxkIChyZXN1bHQgbm9yIGV4Y2VwdGlvbikuCisqIF9pbnRlcm5hbCBlcnJvcl86IDYsIHVzZWQgd2hlbiB0aGUgc2VydmVyIHRocm93cyBhbiBleGNlcHRpb24gdGhhdCBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwgZmlsZS4gCisqIF9wcm90b2NvbCBlcnJvcl86IDcsIHVzZWQgd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZGVjb2RpbmcuIEZvciBleGFtcGxlIHdoZW4gYSBsaXN0IGlzIHRvbyBsb25nIG9yIGEgcmVxdWlyZWQKKyBmaWVsZCBpcyBtaXNzaW5nLiAKKyogX2ludmFsaWQgdHJhbnNmb3JtXzogOCwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfaW52YWxpZCBwcm90b2NvbF86IDksIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX3Vuc3VwcG9ydGVkIGNsaWVudCB0eXBlXzogMTAsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKworIyBQcm90b2NvbCBjb25zaWRlcmF0aW9ucworCisjIyBDb21wYXJpbmcgYmluYXJ5IGFuZCBjb21wYWN0IHByb3RvY29sCisKK1RoZSBiaW5hcnkgcHJvdG9jb2wgaXMgZmFpcmx5IHNpbXBsZSBhbmQgdGhlcmVmb3JlIGVhc3kgdG8gcHJvY2Vzcy4gVGhlIGNvbXBhY3QgcHJvdG9jb2wgbmVlZHMgbGVzcyBieXRlcyB0byBzZW5kIHRoZQorc2FtZSBkYXRhIGF0IHRoZSBjb3N0IG9mIGFkZGl0aW9uYWwgcHJvY2Vzc2luZy4gQXMgYmFuZHdpZHRoIGlzIHVzdWFsbHkgdGhlIGJvdHRsZW5lY2ssIHRoZSBjb21wYWN0IHByb3RvY29sIGlzIGFsbW9zdAorYWx3YXlzIHNsaWdodGx5IGZhc3Rlci4KKworIyMgQ29tcGF0aWJpbGl0eQorCitBIHNlcnZlciBjb3VsZCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB3aGV0aGVyIGEgY2xpZW50IHRhbGtzIHRoZSBiaW5hcnkgcHJvdG9jb2wgb3IgdGhlIGNvbXBhY3QgcHJvdG9jb2wgYnkKK2ludmVzdGlnYXRpbmcgdGhlIGZpcnN0IGJ5dGUuIElmIHRoZSB2YWx1ZSBpcyBgMTAwMCAwMDAxYCBvciBgMDAwMCAwMDAwYCAoYXNzdW1pbmcgYSBuYW1lIHNob3J0ZXIgdGhlbiDCsTE2IE1CKSBpdCBpcyB0aGUKK2JpbmFyeSBwcm90b2NvbC4gV2hlbiB0aGUgdmFsdWUgaXMgYDEwMDAgMDAxMGAgaXQgaXMgdGFsa2luZyB0aGUgY29tcGFjdCBwcm90b2NvbC4KKworIyMgRnJhbWVkIHZzLiB1bmZyYW1lZCB0cmFuc3BvcnQKKworVGhlIGZpcnN0IHRocmlmdCBiaW5hcnkgd2lyZSBmb3JtYXQgd2FzIHVuZnJhbWVkLiBUaGlzIG1lYW5zIHRoYXQgaW5mb3JtYXRpb24gaXMgc2VudCBvdXQgaW4gYSBzaW5nbGUgc3RyZWFtIG9mIGJ5dGVzLgorV2l0aCB1bmZyYW1lZCB0cmFuc3BvcnQgdGhlIChnZW5lcmF0ZWQpIHByb2Nlc3NvcnMgd2lsbCByZWFkIGRpcmVjdGx5IGZyb20gdGhlIHNvY2tldCAodGhvdWdoIEFwYWNoZSBUaHJpZnQgZG9lcyB0cnkgdG8KK2dyYWIgYWxsIGF2YWlsYWJsZSBieXRlcyBmcm9tIHRoZSBzb2NrZXQgaW4gYSBidWZmZXIgd2hlbiBpdCBjYW4pLgorCitMYXRlciwgVGhyaWZ0IGludHJvZHVjZWQgdGhlIGZyYW1lZCB0cmFuc3BvcnQuCisKK1dpdGggZnJhbWVkIHRyYW5zcG9ydCB0aGUgZnVsbCByZXF1ZXN0IGFuZCByZXNwb25zZSAodGhlIFRNZXNzYWdlIGFuZCB0aGUgZm9sbG93aW5nIHN0cnVjdCkgYXJlIGZpcnN0IHdyaXR0ZW4gdG8gYQorYnVmZmVyLiBUaGVuIHdoZW4gdGhlIHN0cnVjdCBpcyBjb21wbGV0ZSAodHJhbnNwb3J0IG1ldGhvZCBgZmx1c2hgIGlzIGhpamFja2VkIGZvciB0aGlzKSwgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzCit3cml0dGVuIHRvIHRoZSBzb2NrZXQgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBidWZmZXJlZCBieXRlcy4gVGhlIGNvbWJpbmF0aW9uIGlzIGNhbGxlZCBhIF9mcmFtZV8uIE9uIHRoZSByZWNlaXZlciBzaWRlCit0aGUgY29tcGxldGUgZnJhbWUgaXMgZmlyc3QgcmVhZCBpbiBhIGJ1ZmZlciBiZWZvcmUgdGhlIG1lc3NhZ2UgaXMgcGFzc2VkIHRvIGEgcHJvY2Vzc29yLgorCitUaGUgbGVuZ3RoIHByZWZpeCBpcyBhIDQgYnl0ZSBzaWduZWQgaW50LCBzZW5kIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyLgorVGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6IGAwYCA8PSBsZW5ndGggPD0gYDE2Mzg0MDAwYCAoMTZNKS4KKworRnJhbWVkIHRyYW5zcG9ydCB3YXMgaW50cm9kdWNlZCB0byBlYXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhc3luYyBwcm9jZXNzb3JzLiBBbiBhc3luYyBwcm9jZXNzb3IgaXMgb25seSBpbnZva2VkIHdoZW4KK2FsbCBkYXRhIGlzIHJlY2VpdmVkLiBVbmZvcnR1bmF0ZWx5LCBmcmFtZWQgdHJhbnNwb3J0IGlzIG5vdCBpZGVhbCBmb3IgbGFyZ2UgbWVzc2FnZXMgYXMgdGhlIGVudGlyZSBmcmFtZSBzdGF5cyBpbgorbWVtb3J5IHVudGlsIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHByb2Nlc3NlZC4gSW4gYWRkaXRpb24sIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uIG1lcmdlcyB0aGUgaW5jb21pbmcgZGF0YSB0byBhIHNpbmdsZSwKK2dyb3dpbmcgYnl0ZSBhcnJheS4gRXZlcnkgdGltZSB0aGUgYnl0ZSBhcnJheSBpcyBmdWxsIGl0IG5lZWRzIHRvIGJlIGNvcGllZCB0byBhIG5ldyBsYXJnZXIgYnl0ZSBhcnJheS4KKworRnJhbWVkIGFuZCB1bmZyYW1lZCB0cmFuc3BvcnRzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIuCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LXNhc2wtc3BlYy50eHQgYi9kb2Mvc3BlY3MvdGhyaWZ0LXNhc2wtc3BlYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjZjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtc2FzbC1zcGVjLnR4dApAQCAtMCwwICsxLDEwOCBAQAorQSBUaHJpZnQgU0FTTCBtZXNzYWdlIHNoYWxsIGJlIGEgYnl0ZSBhcnJheSBvZiB0aGUgZm9sbG93aW5nIGZvcm06CisKK3wgMS1ieXRlIHN0YXR1cyBjb2RlIHwgNC1ieXRlIHBheWxvYWQgbGVuZ3RoIHwgdmFyaWFibGUtbGVuZ3RoIHBheWxvYWQgfAorCitUaGUgbGVuZ3RoIGZpZWxkcyBzaGFsbCBiZSBpbnRlcnByZXRlZCBhcyBpbnRlZ2Vycywgd2l0aCB0aGUgaGlnaCBieXRlIHNlbnQKK2ZpcnN0LiBUaGlzIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgaXQsIG5vdAoraW5jbHVkaW5nIHRoZSBzdGF0dXMgY29kZSBvciB0aGUgbGVuZ3RoIGJ5dGVzLgorCitUaGUgcG9zc2libGUgc3RhdHVzIGNvZGVzIGFyZToKKworMHgwMSAtIFNUQVJUIC0gSGVsbG8sIGxldCdzIGdvIG9uIGEgZGF0ZS4KKzB4MDIgLSBPSyAtIEV2ZXJ5dGhpbmcncyBiZWVuIGdvaW5nIGFscmlnaHQgc28gZmFyLCBsZXQncyBzZWUgZWFjaCBvdGhlciBhZ2Fpbi4KKzB4MDMgLSBCQUQgLSBJIHVuZGVyc3RhbmQgd2hhdCB5b3UncmUgc2F5aW5nLiBJIHJlYWxseSBkby4gSSBqdXN0IGRvbid0IGxpa2UgaXQuIFdlIGhhdmUgdG8gYnJlYWsgdXAuCisweDA0IC0gRVJST1IgLSBXZSBjYW4ndCBnbyBvbiBsaWtlIHRoaXMuIEl0J3MgbGlrZSB5b3UncmUgc3BlYWtpbmcgYW5vdGhlciBsYW5ndWFnZS4KKzB4MDUgLSBDT01QTEVURSAtIFdpbGwgeW91IG1hcnJ5IG1lPworCitUaGUgVGhyaWZ0IFNBU0wgY29tbXVuaWNhdGlvbiB3aWxsIHByb2NlZWQgYXMgZm9sbG93czoKKworMS4gVGhlIGNsaWVudCBpcyBjb25maWd1cmVkIGF0IGluc3RhbnRpYXRpb24gb2YgdGhlIHRyYW5zcG9ydCB3aXRoIGEgc2luZ2xlCit1bmRlcmx5aW5nIFNBU0wgc2VjdXJpdHkgbWVjaGFuaXNtIHRoYXQgaXQgc3VwcG9ydHMuCisKKzIuIFRoZSBzZXJ2ZXIgaXMgY29uZmlndXJlZCB3aXRoIGEgbWFwcGluZyBvZiB1bmRlcmx5aW5nIHNlY3VyaXR5IG1lY2hhbmlzbQorbmFtZSAtPiBtZWNoYW5pc20gb3B0aW9ucy4KKworMy4gQXQgY29ubmVjdGlvbiB0aW1lLCB0aGUgY2xpZW50IHdpbGwgaW5pdGlhdGUgY29tbXVuaWNhdGlvbiBieSBzZW5kaW5nIHRoZQorc2VydmVyIGEgU1RBUlQgbWVzc2FnZS4gVGhlIHBheWxvYWQgb2YgdGhpcyBtZXNzYWdlIHdpbGwgYmUgdGhlIG5hbWUgb2YgdGhlCit1bmRlcmx5aW5nIHNlY3VyaXR5IG1lY2hhbmlzbSB0aGF0IHRoZSBjbGllbnQgd291bGQgbGlrZSB0byB1c2UuCitUaGlzIG1lY2hhbmlzbSBuYW1lIHNoYWxsIGJlIDEtMjAgY2hhcmFjdGVycyBpbiBsZW5ndGgsIGFuZCBmb2xsb3cgdGhlCitzcGVjaWZpY2F0aW9ucyBmb3IgU0FTTCBtZWNoYW5pc20gbmFtZXMgc3BlY2lmaWVkIGluIFJGQyAyMjIyLgorCis0LiBUaGUgc2VydmVyIHJlY2VpdmVzIHRoaXMgbWVzc2FnZSBhbmQsIGlmIHRoZSBtZWNoYW5pc20gbmFtZSBwcm92aWRlZCBpcworYW1vbmcgdGhlIHNldCBvZiBtZWNoYW5pc21zIHRoaXMgc2VydmVyIHRyYW5zcG9ydCBpcyBjb25maWd1cmVkIHRvIGFjY2VwdCwKK2FwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5IG1lY2hhbmlzbSBtYXkgdGFrZSBwbGFjZS4KK0lmIHRoZSBtZWNoYW5pc20gbmFtZSBpcyBub3Qgb25lIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgY29uZmlndXJlZCB0byBzdXBwb3J0LCB0aGUKK3NlcnZlciBzaGFsbCByZXR1cm4gdGhlIEJBRCBieXRlLCBmb2xsb3dlZCBieSBhIDQtYnl0ZSwgcG90ZW50aWFsbHkgemVyby12YWx1ZQorbWVzc2FnZSBsZW5ndGgsIGZvbGxvd2VkIGJ5IHRoZSBwb3RlbnRpYWxseSB6ZXJvLWxlbmd0aCBwYXlsb2FkIHdoaWNoIG1heSBiZSBhCitzdGF0dXMgY29kZSBvciBtZXNzYWdlIGluZGljYXRpbmcgZmFpbHVyZS4gTm8gZnVydGhlciBjb21tdW5pY2F0aW9uIG1heSB0YWtlCitwbGFjZSB2aWEgdGhpcyB0cmFuc3BvcnQuIElmIHRoZSBtZWNoYW5pc20gbmFtZSBpcyBvbmUgd2hpY2ggdGhlIHNlcnZlcgorc3VwcG9ydHMsIHRoZW4gcHJvY2VlZCB0byBzdGVwIDUuCisKKzUuIEZvbGxvd2luZyB0aGUgU1RBUlQgbWVzc2FnZSwgdGhlIGNsaWVudCBtdXN0IHNlbmQgYW5vdGhlciBtZXNzYWdlIGNvbnRhaW5pbmcKK3RoZSAiaW5pdGlhbCByZXNwb25zZSIgb2YgdGhlIGNob3NlbiBTQVNMIGltcGxlbWVudGF0aW9uLiBUaGUgY2xpZW50IG1heSBzZW5kCit0aGlzIG1lc3NhZ2UgcGlnZ3ktYmFja2VkIG9uIHRoZSAiU1RBUlQiIG1lc3NhZ2Ugb2Ygc3RlcCAzLiBUaGUgbWVzc2FnZSB0eXBlCitvZiB0aGlzIG1lc3NhZ2UgbXVzdCBiZSBlaXRoZXIgIk9LIiBvciAiQ09NUExFVEUiLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKK1NBU0wgaW1wbGVtZW50YXRpb24gaW5kaWNhdGVzIHRoYXQgdGhpcyBzaWRlIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBoYXMgYmVlbgorc2F0aXNmaWVkLgorCis2LiBUaGUgc2VydmVyIHRoZW4gcHJvdmlkZXMgdGhlIGJ5dGUgYXJyYXkgb2YgdGhlIHBheWxvYWQgcmVjZWl2ZWQgdG8gaXRzCit1bmRlcmx5aW5nIHNlY3VyaXR5IG1lY2hhbmlzbS4gQSBjaGFsbGVuZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSB1bmRlcmx5aW5nCitzZWN1cml0eSBtZWNoYW5pc20gb24gdGhlIHNlcnZlciwgYW5kIHRoaXMgaXMgdXNlZCBhcyB0aGUgcGF5bG9hZCBmb3IgYSBtZXNzYWdlCitzZW50IHRvIHRoZSBjbGllbnQuIFRoaXMgbWVzc2FnZSBzaGFsbCBjb25zaXN0IG9mIGFuIE9LIGJ5dGUsIGZvbGxvd2VkIGJ5IHRoZQorbm9uLXplcm8gbWVzc2FnZSBsZW5ndGggd29yZCwgZm9sbG93ZWQgYnkgdGhlIHBheWxvYWQuCisKKzcuIFRoZSBjbGllbnQgcmVjZWl2ZXMgdGhpcyBtZXNzYWdlIGZyb20gdGhlIHNlcnZlciBhbmQgcGFzc2VzIHRoZSBwYXlsb2FkIHRvCitpdHMgdW5kZXJseWluZyBzZWN1cml0eSBtZWNoYW5pc20gdG8gZ2VuZXJhdGUgYSByZXNwb25zZS4gVGhlIGNsaWVudCB0aGVuIHNlbmRzCit0aGUgc2VydmVyIGFuIE9LIGJ5dGUsIGZvbGxvd2VkIGJ5IHRoZSBub24temVyby12YWx1ZSBsZW5ndGggb2YgdGhlIHJlc3BvbnNlLAorZm9sbG93ZWQgYnkgdGhlIGJ5dGVzIG9mIHRoZSByZXNwb25zZSBhcyB0aGUgcGF5bG9hZC4KKworOC4gU3RlcHMgNiBhbmQgNyBhcmUgcmVwZWF0ZWQgdW50aWwgYm90aCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBzYXRpc2ZpZWQgd2l0aAordGhlIGNoYWxsZW5nZS9yZXNwb25zZSBleGNoYW5nZS4gV2hlbiBlaXRoZXIgc2lkZSBoYXMgY29tcGxldGVkIGl0cyBzZWN1cml0eQorcHJvdG9jb2wsIGl0cyBuZXh0IG1lc3NhZ2Ugc2hhbGwgYmUgdGhlIENPTVBMRVRFIGJ5dGUsIGZvbGxvd2VkIGJ5IGEgNC1ieXRlCitwb3RlbnRpYWxseSB6ZXJvLXZhbHVlIGxlbmd0aCB3b3JkLCBmb2xsb3dlZCBieSBhIHBvdGVudGlhbGx5IHplcm8tbGVuZ3RoCitwYXlsb2FkLiBUaGlzIHBheWxvYWQgd2lsbCBiZSBlbXB0eSBleGNlcHQgZm9yIHRob3NlIHVuZGVybHlpbmcgc2VjdXJpdHkKK21lY2hhbmlzbXMgd2hpY2ggcHJvdmlkZSBhZGRpdGlvbmFsIGRhdGEgd2l0aCBzdWNjZXNzLgorCitJZiBhdCBhbnkgcG9pbnQgaW4gdGltZSBlaXRoZXIgc2lkZSBpcyBhYmxlIHRvIGludGVycHJldCB0aGUgY2hhbGxlbmdlIG9yCityZXNwb25zZSBzZW50IGJ5IHRoZSBvdGhlciwgYnV0IGlzIGRpc3NhdGlzZmllZCB3aXRoIHRoZSBjb250ZW50cyB0aGVyZW9mLCB0aGlzCitzaWRlIHNob3VsZCBzZW5kIHRoZSBvdGhlciBhIEJBRCBieXRlLCBmb2xsb3dlZCBieSBhIDQtYnl0ZSBwb3RlbnRpYWxseQoremVyby12YWx1ZSBsZW5ndGggd29yZCwgZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwsIHBvdGVudGlhbGx5IHplcm8tbGVuZ3RoCittZXNzYWdlIGVuY29kZWQgaW4gVVRGLTggaW5kaWNhdGluZyBmYWlsdXJlLiBUaGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHBhc3NlZCB0bwordGhlIHByb3RvY29sIGFib3ZlIHRoZSB0aHJpZnQgdHJhbnNwb3J0IGJ5IHdoYXRldmVyIG1lY2hhbmlzbSBpcyBhcHByb3ByaWF0ZQorYW5kIGlkaW9tYXRpYyBmb3IgdGhlIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgdGhlc2UgdGhyaWZ0IGJpbmRpbmdzIGFyZSBmb3IuCisKK0lmIGF0IGFueSBwb2ludCBpbiB0aW1lIGVpdGhlciBzaWRlIGZhaWxzIHRvIGludGVycHJldCB0aGUgY2hhbGxlbmdlIG9yCityZXNwb25zZSBzZW50IGJ5IHRoZSBvdGhlciwgdGhpcyBzaWRlIHNob3VsZCBzZW5kIHRoZSBvdGhlciBhbiBFUlJPUiBieXRlLAorZm9sbG93ZWQgYnkgYSA0LWJ5dGUgcG90ZW50aWFsbHkgemVyby12YWx1ZSBsZW5ndGggd29yZCwgZm9sbG93ZWQgYnkgYW4KK29wdGlvbmFsLCBwb3RlbnRpYWxseSB6ZXJvLWxlbmd0aCBtZXNzYWdlIGVuY29kZWQgaW4gVVRGLTguIFRoaXMgbWVzc2FnZSBzaG91bGQKK2JlIHBhc3NlZCB0byB0aGUgcHJvdG9jb2wgYWJvdmUgdGhlIHRocmlmdCB0cmFuc3BvcnQgYnkgd2hhdGV2ZXIgbWVjaGFuaXNtIGlzCithcHByb3ByaWF0ZSBhbmQgaWRpb21hdGljIGZvciB0aGUgcGFydGljdWxhciBsYW5ndWFnZSB0aGVzZSB0aHJpZnQgYmluZGluZ3MgYXJlCitmb3IuCisKK0lmIHN0ZXAgOCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCB0aGVuIHRoZSBjb21tdW5pY2F0aW9uIGlzIGNvbnNpZGVyZWQKK2F1dGhlbnRpY2F0ZWQgYW5kIHN1YnNlcXVlbnQgY29tbXVuaWNhdGlvbiBtYXkgY29tbWVuY2UuCisKK0lmIHN0ZXAgOCBmYWlscyB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHksIHRoZW4gbm8gZnVydGhlciBjb21tdW5pY2F0aW9uIG1heQordGFrZSBwbGFjZSB2aWEgdGhpcyB0cmFuc3BvcnQuCisKKzguIEFsbCB3cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IG11c3QgYmUgcHJlZml4ZWQgYnkgdGhlIDQtYnl0ZSBsZW5ndGgKK29mIHRoZSBwYXlsb2FkIGRhdGEsIGZvbGxvd2VkIGJ5IHRoZSBwYXlsb2FkLiBBbGwgcmVhZHMgZnJvbSB0aGlzIHRyYW5zcG9ydAorc2hvdWxkIHJlYWQgdGhlIDQtYnl0ZSBsZW5ndGggd29yZCwgdGhlbiByZWFkIHRoZSBmdWxsIHF1YW50aXR5IG9mIGJ5dGVzCitzcGVjaWZpZWQgYnkgdGhpcyBsZW5ndGggd29yZC4KKworSWYgbm8gU0FTTCBRT1AgKHF1YWxpdHkgb2YgcHJvdGVjdGlvbikgaXMgbmVnb3RpYXRlZCBkdXJpbmcgc3RlcHMgNiBhbmQgNywgdGhlbgorYWxsIHN1YnNlcXVlbnQgd3JpdGVzIHRvL3JlYWRzIGZyb20gdGhpcyB0cmFuc3BvcnQgYXJlIHdyaXR0ZW4vcmVhZCB1bmFsdGVyZWQsCitzYXZlIGZvciB0aGUgbGVuZ3RoIHByZWZpeCwgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorCitJZiBhIFNBU0wgUU9QIGlzIG5lZ290aWF0ZWQsIHRoZW4gdGhpcyBtdXN0IGJlIHVzZWQgYnkgdGhlIFRocmlmdCB0cmFuc3BvcnQgZm9yCithbGwgc3Vic2VxdWVudCBjb21tdW5pY2F0aW9uLiBUaGlzIGlzIGRvbmUgYnkgd3JhcHBpbmcgc3Vic2VxdWVudCB3cml0ZXMgdG8gdGhlCit0cmFuc3BvcnQgdXNpbmcgdGhlIHVuZGVybHlpbmcgc2VjdXJpdHkgbWVjaGFuaXNtLCBhbmQgdW53cmFwcGluZyBzdWJzZXF1ZW50CityZWFkcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4gTm90ZSB0aGF0IGluIHRoaXMgY2FzZSwgdGhlIGxlbmd0aCBwcmVmaXgKK29mIHRoZSB3cml0ZSB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBhZnRlciBpdCBoYXMKK2JlZW4gd3JhcHBlZCBieSB0aGUgdW5kZXJseWluZyBzZWN1cml0eSBtZWNoYW5pc20uIE5vdGUgdGhhdCB0aGUgY29tcGxldGUKK21lc3NhZ2UgbXVzdCBiZSByZWFkIGJlZm9yZSBnaXZpbmcgdGhpcyBkYXRhIHRvIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5CittZWNoYW5pc20gZm9yIHVud3JhcHBpbmcuCisKK0lmIGF0IGFueSBwb2ludCBpbiB0aW1lIHJlYWRpbmcgb2YgYSBtZXNzYWdlIGZhaWxzIGVpdGhlciBiZWNhdXNlIG9mIGEKK21hbGZvcm1lZCBsZW5ndGggd29yZCBvciBmYWlsdXJlIHRvIHVud3JhcCBieSB0aGUgdW5kZXJseWluZyBzZWN1cml0eQorbWVjaGFuaXNtLCB0aGVuIGFsbCBmdXJ0aGVyIGNvbW11bmljYXRpb24gb24gdGhpcyB0cmFuc3BvcnQgbXVzdCBjZWFzZS4KZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQudGV4IGIvZG9jL3NwZWNzL3RocmlmdC50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwNmZjYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQudGV4CkBAIC0wLDAgKzEsMTA1NyBAQAorJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislCislICAgICAgICAgICAgICAgVGhyaWZ0IHdoaXRlcGFwZXIKKyUKKyUgTmFtZTogICAgICAgICB0aHJpZnQudGV4CislCislIEF1dGhvcnM6ICAgICAgTWFyayBTbGVlIChtY3NsZWVAZmFjZWJvb2suY29tKQorJQorJSBDcmVhdGVkOiAgICAgIDA1IE1hcmNoIDIwMDcKKyUKKyUgWW91IHdpbGwgbmVlZCBhIGNvcHkgb2Ygc2lncGxhbmNvbmYuY2xzIHRvIGZvcm1hdCB0aGlzIGRvY3VtZW50LgorJSBJdCBpcyBhdmFpbGFibGUgYXQgPGh0dHA6Ly93d3cuc2lncGxhbi5vcmcvYXV0aG9ySW5mb3JtYXRpb24uaHRtPi4KKyUKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1xkb2N1bWVudGNsYXNzW25vY29weXJpZ2h0c3BhY2UsYmxvY2tzdHlsZV17c2lncGxhbmNvbmZ9CisKK1x1c2VwYWNrYWdle2Ftc3N5bWJ9CitcdXNlcGFja2FnZXthbXNmb250c30KK1x1c2VwYWNrYWdle2Ftc21hdGh9CitcdXNlcGFja2FnZXt1cmx9CisKK1xiZWdpbntkb2N1bWVudH0KKworJSBcY29uZmVyZW5jZWluZm97V1hZWiAnMDV9e2RhdGUsIENpdHkufQorJSBcY29weXJpZ2h0eWVhcnsyMDA3fQorJSBcY29weXJpZ2h0ZGF0YXtbdG8gYmUgc3VwcGxpZWRdfQorCislIFx0aXRsZWJhbm5lcntiYW5uZXIgYWJvdmUgcGFwZXIgdGl0bGV9ICAgICAgICAlIFRoZXNlIGFyZSBpZ25vcmVkIHVubGVzcworJSBccHJlcHJpbnRmb290ZXJ7c2hvcnQgZGVzY3JpcHRpb24gb2YgcGFwZXJ9ICAgJSAncHJlcHJpbnQnIG9wdGlvbiBzcGVjaWZpZWQuCisKK1x0aXRsZXtUaHJpZnQ6IFNjYWxhYmxlIENyb3NzLUxhbmd1YWdlIFNlcnZpY2VzIEltcGxlbWVudGF0aW9ufQorXHN1YnRpdGxle30KKworXGF1dGhvcmluZm97TWFyayBTbGVlLCBBZGl0eWEgQWdhcndhbCBhbmQgTWFyYyBLd2lhdGtvd3NraX0KKyAgICAgICAgICAge0ZhY2Vib29rLCAxNTYgVW5pdmVyc2l0eSBBdmUsIFBhbG8gQWx0bywgQ0F9CisgICAgICAgICAgIHtce21jc2xlZSxhZGl0eWEsbWFyY1x9QGZhY2Vib29rLmNvbX0KKworXG1ha2V0aXRsZQorCitcYmVnaW57YWJzdHJhY3R9CitUaHJpZnQgaXMgYSBzb2Z0d2FyZSBsaWJyYXJ5IGFuZCBzZXQgb2YgY29kZS1nZW5lcmF0aW9uIHRvb2xzIGRldmVsb3BlZCBhdAorRmFjZWJvb2sgdG8gZXhwZWRpdGUgZGV2ZWxvcG1lbnQgYW5kIGltcGxlbWVudGF0aW9uIG9mIGVmZmljaWVudCBhbmQgc2NhbGFibGUKK2JhY2tlbmQgc2VydmljZXMuIEl0cyBwcmltYXJ5IGdvYWwgaXMgdG8gZW5hYmxlIGVmZmljaWVudCBhbmQgcmVsaWFibGUKK2NvbW11bmljYXRpb24gYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcyBieSBhYnN0cmFjdGluZyB0aGUgcG9ydGlvbnMgb2YgZWFjaAorbGFuZ3VhZ2UgdGhhdCB0ZW5kIHRvIHJlcXVpcmUgdGhlIG1vc3QgY3VzdG9taXphdGlvbiBpbnRvIGEgY29tbW9uIGxpYnJhcnkKK3RoYXQgaXMgaW1wbGVtZW50ZWQgaW4gZWFjaCBsYW5ndWFnZS4gU3BlY2lmaWNhbGx5LCBUaHJpZnQgYWxsb3dzIGRldmVsb3BlcnMgdG8KK2RlZmluZSBkYXRhdHlwZXMgYW5kIHNlcnZpY2UgaW50ZXJmYWNlcyBpbiBhIHNpbmdsZSBsYW5ndWFnZS1uZXV0cmFsIGZpbGUKK2FuZCBnZW5lcmF0ZSBhbGwgdGhlIG5lY2Vzc2FyeSBjb2RlIHRvIGJ1aWxkIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLgorCitUaGlzIHBhcGVyIGRldGFpbHMgdGhlIG1vdGl2YXRpb25zIGFuZCBkZXNpZ24gY2hvaWNlcyB3ZSBtYWRlIGluIFRocmlmdCwgYXMKK3dlbGwgYXMgc29tZSBvZiB0aGUgbW9yZSBpbnRlcmVzdGluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBJdCBpcyBub3QKK2ludGVuZGVkIHRvIGJlIHRha2VuIGFzIHJlc2VhcmNoLCBidXQgcmF0aGVyIGl0IGlzIGFuIGV4cG9zaXRpb24gb24gd2hhdCB3ZSBkaWQKK2FuZCB3aHkuCitcZW5ke2Fic3RyYWN0fQorCislIFxjYXRlZ29yeXtELjMuM317UHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzfXtMYW5ndWFnZSBjb25zdHJ1Y3RzIGFuZCBmZWF0dXJlc30KKworJVx0ZXJtcworJUxhbmd1YWdlcywgc2VyaWFsaXphdGlvbiwgcmVtb3RlIHByb2NlZHVyZSBjYWxsCisKKyVca2V5d29yZHMKKyVEYXRhIGRlc2NyaXB0aW9uIGxhbmd1YWdlLCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZSwgcmVtb3RlIHByb2NlZHVyZSBjYWxsCisKK1xzZWN0aW9ue0ludHJvZHVjdGlvbn0KK0FzIEZhY2Vib29rJ3MgdHJhZmZpYyBhbmQgbmV0d29yayBzdHJ1Y3R1cmUgaGF2ZSBzY2FsZWQsIHRoZSByZXNvdXJjZQorZGVtYW5kcyBvZiBtYW55IG9wZXJhdGlvbnMgb24gdGhlIHNpdGUgKGkuZS4gc2VhcmNoLAorYWQgc2VsZWN0aW9uIGFuZCBkZWxpdmVyeSwgZXZlbnQgbG9nZ2luZykgaGF2ZSBwcmVzZW50ZWQgdGVjaG5pY2FsIHJlcXVpcmVtZW50cworZHJhc3RpY2FsbHkgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlIExBTVAgZnJhbWV3b3JrLiBJbiBvdXIgaW1wbGVtZW50YXRpb24gb2YKK3RoZXNlIHNlcnZpY2VzLCB2YXJpb3VzIHByb2dyYW1taW5nIGxhbmd1YWdlcyBoYXZlIGJlZW4gc2VsZWN0ZWQgdG8KK29wdGltaXplIGZvciB0aGUgcmlnaHQgY29tYmluYXRpb24gb2YgcGVyZm9ybWFuY2UsIGVhc2UgYW5kIHNwZWVkIG9mCitkZXZlbG9wbWVudCwgYXZhaWxhYmlsaXR5IG9mIGV4aXN0aW5nIGxpYnJhcmllcywgZXRjLiBCeSBhbmQgbGFyZ2UsCitGYWNlYm9vaydzIGVuZ2luZWVyaW5nIGN1bHR1cmUgaGFzIHRlbmRlZCB0b3dhcmRzIGNob29zaW5nIHRoZSBiZXN0Cit0b29scyBhbmQgaW1wbGVtZW50YXRpb25zIGF2YWlsYWJsZSBvdmVyIHN0YW5kYXJkaXppbmcgb24gYW55IG9uZQorcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYW5kIGJlZ3J1ZGdpbmdseSBhY2NlcHRpbmcgaXRzIGluaGVyZW50IGxpbWl0YXRpb25zLgorCitHaXZlbiB0aGlzIGRlc2lnbiBjaG9pY2UsIHdlIHdlcmUgcHJlc2VudGVkIHdpdGggdGhlIGNoYWxsZW5nZSBvZiBidWlsZGluZworYSB0cmFuc3BhcmVudCwgaGlnaC1wZXJmb3JtYW5jZSBicmlkZ2UgYWNyb3NzIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorV2UgZm91bmQgdGhhdCBtb3N0IGF2YWlsYWJsZSBzb2x1dGlvbnMgd2VyZSBlaXRoZXIgdG9vIGxpbWl0ZWQsIGRpZCBub3Qgb2ZmZXIKK3N1ZmZpY2llbnQgZGF0YXR5cGUgZnJlZWRvbSwgb3Igc3VmZmVyZWQgZnJvbSBzdWJwYXIgcGVyZm9ybWFuY2UuCitcZm9vdG5vdGV7U2VlIEFwcGVuZGl4IEEgZm9yIGEgZGlzY3Vzc2lvbiBvZiBhbHRlcm5hdGl2ZSBzeXN0ZW1zLn0KKworVGhlIHNvbHV0aW9uIHRoYXQgd2UgaGF2ZSBpbXBsZW1lbnRlZCBjb21iaW5lcyBhIGxhbmd1YWdlLW5ldXRyYWwgc29mdHdhcmUKK3N0YWNrIGltcGxlbWVudGVkIGFjcm9zcyBudW1lcm91cyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgYW5kIGFuIGFzc29jaWF0ZWQgY29kZQorZ2VuZXJhdGlvbiBlbmdpbmUgdGhhdCB0cmFuc2Zvcm1zIGEgc2ltcGxlIGludGVyZmFjZSBhbmQgZGF0YSBkZWZpbml0aW9uCitsYW5ndWFnZSBpbnRvIGNsaWVudCBhbmQgc2VydmVyIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCBsaWJyYXJpZXMuCitDaG9vc2luZyBzdGF0aWMgY29kZSBnZW5lcmF0aW9uIG92ZXIgYSBkeW5hbWljIHN5c3RlbSBhbGxvd3MgdXMgdG8gY3JlYXRlCit2YWxpZGF0ZWQgY29kZSB0aGF0IGNhbiBiZSBydW4gd2l0aG91dCB0aGUgbmVlZCBmb3IKK2FueSBhZHZhbmNlZCBpbnRyb3NwZWN0aXZlIHJ1bi10aW1lIHR5cGUgY2hlY2tpbmcuIEl0IGlzIGFsc28gZGVzaWduZWQgdG8KK2JlIGFzIHNpbXBsZSBhcyBwb3NzaWJsZSBmb3IgdGhlIGRldmVsb3Blciwgd2hvIGNhbiB0eXBpY2FsbHkgZGVmaW5lIGFsbAordGhlIG5lY2Vzc2FyeSBkYXRhIHN0cnVjdHVyZXMgYW5kIGludGVyZmFjZXMgZm9yIGEgY29tcGxleCBzZXJ2aWNlIGluIGEgc2luZ2xlCitzaG9ydCBmaWxlLgorCitTdXJwcmlzZWQgdGhhdCBhIHJvYnVzdCBvcGVuIHNvbHV0aW9uIHRvIHRoZXNlIHJlbGF0aXZlbHkgY29tbW9uIHByb2JsZW1zCitkaWQgbm90IHlldCBleGlzdCwgd2UgY29tbWl0dGVkIGVhcmx5IG9uIHRvIG1ha2luZyB0aGUgVGhyaWZ0IGltcGxlbWVudGF0aW9uCitvcGVuIHNvdXJjZS4KKworSW4gZXZhbHVhdGluZyB0aGUgY2hhbGxlbmdlcyBvZiBjcm9zcy1sYW5ndWFnZSBpbnRlcmFjdGlvbiBpbiBhIG5ldHdvcmtlZAorZW52aXJvbm1lbnQsIHNvbWUga2V5IGNvbXBvbmVudHMgd2VyZSBpZGVudGlmaWVkOgorCitcdGV4dGl0e1R5cGVzLn0gQSBjb21tb24gdHlwZSBzeXN0ZW0gbXVzdCBleGlzdCBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzCit3aXRob3V0IHJlcXVpcmluZyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgdXNlIGN1c3RvbSBUaHJpZnQgZGF0YXR5cGVzCitvciB3cml0ZSB0aGVpciBvd24gc2VyaWFsaXphdGlvbiBjb2RlLiBUaGF0IGlzLAorYSBDKysgcHJvZ3JhbW1lciBzaG91bGQgYmUgYWJsZSB0byB0cmFuc3BhcmVudGx5IGV4Y2hhbmdlIGEgc3Ryb25nbHkgdHlwZWQKK1NUTCBtYXAgZm9yIGEgZHluYW1pYyBQeXRob24gZGljdGlvbmFyeS4gTmVpdGhlcgorcHJvZ3JhbW1lciBzaG91bGQgYmUgZm9yY2VkIHRvIHdyaXRlIGFueSBjb2RlIGJlbG93IHRoZSBhcHBsaWNhdGlvbiBsYXllcgordG8gYWNoaWV2ZSB0aGlzLiBTZWN0aW9uIDIgZGV0YWlscyB0aGUgVGhyaWZ0IHR5cGUgc3lzdGVtLgorCitcdGV4dGl0e1RyYW5zcG9ydC59IEVhY2ggbGFuZ3VhZ2UgbXVzdCBoYXZlIGEgY29tbW9uIGludGVyZmFjZSB0bworYmlkaXJlY3Rpb25hbCByYXcgZGF0YSB0cmFuc3BvcnQuIFRoZSBzcGVjaWZpY3Mgb2YgaG93IGEgZ2l2ZW4KK3RyYW5zcG9ydCBpcyBpbXBsZW1lbnRlZCBzaG91bGQgbm90IG1hdHRlciB0byB0aGUgc2VydmljZSBkZXZlbG9wZXIuCitUaGUgc2FtZSBhcHBsaWNhdGlvbiBjb2RlIHNob3VsZCBiZSBhYmxlIHRvIHJ1biBhZ2FpbnN0IFRDUCBzdHJlYW0gc29ja2V0cywKK3JhdyBkYXRhIGluIG1lbW9yeSwgb3IgZmlsZXMgb24gZGlzay4gU2VjdGlvbiAzIGRldGFpbHMgdGhlIFRocmlmdCBUcmFuc3BvcnQKK2xheWVyLgorCitcdGV4dGl0e1Byb3RvY29sLn0gRGF0YXR5cGVzIG11c3QgaGF2ZSBzb21lIHdheSBvZiB1c2luZyB0aGUgVHJhbnNwb3J0CitsYXllciB0byBlbmNvZGUgYW5kIGRlY29kZSB0aGVtc2VsdmVzLiBBZ2FpbiwgdGhlIGFwcGxpY2F0aW9uCitkZXZlbG9wZXIgbmVlZCBub3QgYmUgY29uY2VybmVkIGJ5IHRoaXMgbGF5ZXIuIFdoZXRoZXIgdGhlIHNlcnZpY2UgdXNlcworYW4gWE1MIG9yIGJpbmFyeSBwcm90b2NvbCBpcyBpbW1hdGVyaWFsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb2RlLgorQWxsIHRoYXQgbWF0dGVycyBpcyB0aGF0IHRoZSBkYXRhIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuIGluIGEgY29uc2lzdGVudCwKK2RldGVybWluaXN0aWMgbWF0dGVyLiBTZWN0aW9uIDQgZGV0YWlscyB0aGUgVGhyaWZ0IFByb3RvY29sIGxheWVyLgorCitcdGV4dGl0e1ZlcnNpb25pbmcufSBGb3Igcm9idXN0IHNlcnZpY2VzLCB0aGUgaW52b2x2ZWQgZGF0YXR5cGVzIG11c3QKK3Byb3ZpZGUgYSBtZWNoYW5pc20gZm9yIHZlcnNpb25pbmcgdGhlbXNlbHZlcy4gU3BlY2lmaWNhbGx5LAoraXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGFkZCBvciByZW1vdmUgZmllbGRzIGluIGFuIG9iamVjdCBvciBhbHRlciB0aGUKK2FyZ3VtZW50IGxpc3Qgb2YgYSBmdW5jdGlvbiB3aXRob3V0IGFueSBpbnRlcnJ1cHRpb24gaW4gc2VydmljZSAob3IsCit3b3JzZSB5ZXQsIG5hc3R5IHNlZ21lbnRhdGlvbiBmYXVsdHMpLiBTZWN0aW9uIDUgZGV0YWlscyBUaHJpZnQncyB2ZXJzaW9uaW5nCitzeXN0ZW0uCisKK1x0ZXh0aXR7UHJvY2Vzc29ycy59IEZpbmFsbHksIHdlIGdlbmVyYXRlIGNvZGUgY2FwYWJsZSBvZiBwcm9jZXNzaW5nIGRhdGEKK3N0cmVhbXMgdG8gYWNjb21wbGlzaCByZW1vdGUgcHJvY2VkdXJlIGNhbGxzLiBTZWN0aW9uIDYgZGV0YWlscyB0aGUgZ2VuZXJhdGVkCitjb2RlIGFuZCBUUHJvY2Vzc29yIHBhcmFkaWdtLgorCitTZWN0aW9uIDcgZGlzY3Vzc2VzIGltcGxlbWVudGF0aW9uIGRldGFpbHMsIGFuZCBTZWN0aW9uIDggZGVzY3JpYmVzCitvdXIgY29uY2x1c2lvbnMuCisKK1xzZWN0aW9ue1R5cGVzfQorCitUaGUgZ29hbCBvZiB0aGUgVGhyaWZ0IHR5cGUgc3lzdGVtIGlzIHRvIGVuYWJsZSBwcm9ncmFtbWVycyB0byBkZXZlbG9wIHVzaW5nCitjb21wbGV0ZWx5IG5hdGl2ZWx5IGRlZmluZWQgdHlwZXMsIG5vIG1hdHRlciB3aGF0IHByb2dyYW1taW5nIGxhbmd1YWdlIHRoZXkKK3VzZS4gQnkgZGVzaWduLCB0aGUgVGhyaWZ0IHR5cGUgc3lzdGVtIGRvZXMgbm90IGludHJvZHVjZSBhbnkgc3BlY2lhbCBkeW5hbWljCit0eXBlcyBvciB3cmFwcGVyIG9iamVjdHMuIEl0IGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZSBkZXZlbG9wZXIgd3JpdGUKK2FueSBjb2RlIGZvciBvYmplY3Qgc2VyaWFsaXphdGlvbiBvciB0cmFuc3BvcnQuIFRoZSBUaHJpZnQgSURMIChJbnRlcmZhY2UKK0RlZmluaXRpb24gTGFuZ3VhZ2UpIGZpbGUgaXMKK2xvZ2ljYWxseSBhIHdheSBmb3IgZGV2ZWxvcGVycyB0byBhbm5vdGF0ZSB0aGVpciBkYXRhIHN0cnVjdHVyZXMgd2l0aCB0aGUKK21pbmltYWwgYW1vdW50IG9mIGV4dHJhIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byB0ZWxsIGEgY29kZSBnZW5lcmF0b3IKK2hvdyB0byBzYWZlbHkgdHJhbnNwb3J0IHRoZSBvYmplY3RzIGFjcm9zcyBsYW5ndWFnZXMuCisKK1xzdWJzZWN0aW9ue0Jhc2UgVHlwZXN9CisKK1RoZSB0eXBlIHN5c3RlbSByZXN0cyB1cG9uIGEgZmV3IGJhc2UgdHlwZXMuIEluIGNvbnNpZGVyaW5nIHdoaWNoIHR5cGVzIHRvCitzdXBwb3J0LCB3ZSBhaW1lZCBmb3IgY2xhcml0eSBhbmQgc2ltcGxpY2l0eSBvdmVyIGFidW5kYW5jZSwgZm9jdXNpbmcKK29uIHRoZSBrZXkgdHlwZXMgYXZhaWxhYmxlIGluIGFsbCBwcm9ncmFtbWluZyBsYW5ndWFnZXMsIG9taXR0aW5nIGFueQorbmljaGUgdHlwZXMgYXZhaWxhYmxlIG9ubHkgaW4gc3BlY2lmaWMgbGFuZ3VhZ2VzLgorCitUaGUgYmFzZSB0eXBlcyBzdXBwb3J0ZWQgYnkgVGhyaWZ0IGFyZToKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHRleHR0dHtib29sfSBBIGJvb2xlYW4gdmFsdWUsIHRydWUgb3IgZmFsc2UKK1xpdGVtIFx0ZXh0dHR7Ynl0ZX0gQSBzaWduZWQgYnl0ZQorXGl0ZW0gXHRleHR0dHtpMTZ9IEEgMTYtYml0IHNpZ25lZCBpbnRlZ2VyCitcaXRlbSBcdGV4dHR0e2kzMn0gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIKK1xpdGVtIFx0ZXh0dHR7aTY0fSBBIDY0LWJpdCBzaWduZWQgaW50ZWdlcgorXGl0ZW0gXHRleHR0dHtkb3VibGV9IEEgNjQtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcgorXGl0ZW0gXHRleHR0dHtzdHJpbmd9IEFuIGVuY29kaW5nLWFnbm9zdGljIHRleHQgb3IgYmluYXJ5IHN0cmluZworXGl0ZW0gXHRleHR0dHtiaW5hcnl9IEEgYnl0ZSBhcnJheSByZXByZXNlbnRhdGlvbiBmb3IgYmxvYnMKK1xlbmR7aXRlbWl6ZX0KKworT2YgcGFydGljdWxhciBub3RlIGlzIHRoZSBhYnNlbmNlIG9mIHVuc2lnbmVkIGludGVnZXIgdHlwZXMuIEJlY2F1c2UgdGhlc2UKK3R5cGVzIGhhdmUgbm8gZGlyZWN0IHRyYW5zbGF0aW9uIHRvIG5hdGl2ZSBwcmltaXRpdmUgdHlwZXMgaW4gbWFueSBsYW5ndWFnZXMsCit0aGUgYWR2YW50YWdlcyB0aGV5IGFmZm9yZCBhcmUgbG9zdC4gRnVydGhlciwgdGhlcmUgaXMgbm8gd2F5IHRvIHByZXZlbnQgdGhlCithcHBsaWNhdGlvbiBkZXZlbG9wZXIgaW4gYSBsYW5ndWFnZSBsaWtlIFB5dGhvbiBmcm9tIGFzc2lnbmluZyBhIG5lZ2F0aXZlIHZhbHVlCit0byBhbiBpbnRlZ2VyIHZhcmlhYmxlLCBsZWFkaW5nIHRvIHVucHJlZGljdGFibGUgYmVoYXZpb3IuIEZyb20gYSBkZXNpZ24KK3N0YW5kcG9pbnQsIHdlIG9ic2VydmVkIHRoYXQgdW5zaWduZWQgaW50ZWdlcnMgd2VyZSB2ZXJ5IHJhcmVseSwgaWYgZXZlciwgdXNlZAorZm9yIGFyaXRobWV0aWMgcHVycG9zZXMsIGJ1dCBpbiBwcmFjdGljZSB3ZXJlIG11Y2ggbW9yZSBvZnRlbiB1c2VkIGFzIGtleXMgb3IKK2lkZW50aWZpZXJzLiBJbiB0aGlzIGNhc2UsIHRoZSBzaWduIGlzIGlycmVsZXZhbnQuIFNpZ25lZCBpbnRlZ2VycyBzZXJ2ZSB0aGlzCitzYW1lIHB1cnBvc2UgYW5kIGNhbiBiZSBzYWZlbHkgY2FzdCB0byB0aGVpciB1bnNpZ25lZCBjb3VudGVycGFydHMgKG1vc3QKK2NvbW1vbmx5IGluIEMrKykgd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KKworXHN1YnNlY3Rpb257U3RydWN0c30KKworQSBUaHJpZnQgc3RydWN0IGRlZmluZXMgYSBjb21tb24gb2JqZWN0IHRvIGJlIHVzZWQgYWNyb3NzIGxhbmd1YWdlcy4gQSBzdHJ1Y3QKK2lzIGVzc2VudGlhbGx5IGVxdWl2YWxlbnQgdG8gYSBjbGFzcyBpbiBvYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcKK2xhbmd1YWdlcy4gQSBzdHJ1Y3QgaGFzIGEgc2V0IG9mIHN0cm9uZ2x5IHR5cGVkIGZpZWxkcywgZWFjaCB3aXRoIGEgdW5pcXVlCituYW1lIGlkZW50aWZpZXIuIFRoZSBiYXNpYyBzeW50YXggZm9yIGRlZmluaW5nIGEgVGhyaWZ0IHN0cnVjdCBsb29rcyB2ZXJ5CitzaW1pbGFyIHRvIGEgQyBzdHJ1Y3QgZGVmaW5pdGlvbi4gRmllbGRzIG1heSBiZSBhbm5vdGF0ZWQgd2l0aCBhbiBpbnRlZ2VyIGZpZWxkCitpZGVudGlmaWVyICh1bmlxdWUgdG8gdGhlIHNjb3BlIG9mIHRoYXQgc3RydWN0KSBhbmQgb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZXMuCitGaWVsZCBpZGVudGlmaWVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgaWYgb21pdHRlZCwgdGhvdWdoIHRoZXkgYXJlCitzdHJvbmdseSBlbmNvdXJhZ2VkIGZvciB2ZXJzaW9uaW5nIHJlYXNvbnMgZGlzY3Vzc2VkIGxhdGVyLgorCitcc3Vic2VjdGlvbntDb250YWluZXJzfQorCitUaHJpZnQgY29udGFpbmVycyBhcmUgc3Ryb25nbHkgdHlwZWQgY29udGFpbmVycyB0aGF0IG1hcCB0byB0aGUgbW9zdCBjb21tb25seQordXNlZCBjb250YWluZXJzIGluIGNvbW1vbiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIFRoZXkgYXJlIGFubm90YXRlZCB1c2luZwordGhlIEMrKyB0ZW1wbGF0ZSAob3IgSmF2YSBHZW5lcmljcykgc3R5bGUuIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBhdmFpbGFibGU6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFx0ZXh0dHR7bGlzdDx0eXBlPn0gQW4gb3JkZXJlZCBsaXN0IG9mIGVsZW1lbnRzLiBUcmFuc2xhdGVzIGRpcmVjdGx5IGludG8KK2FuIFNUTCBcdGV4dHR0e3ZlY3Rvcn0sIEphdmEgXHRleHR0dHtBcnJheUxpc3R9LCBvciBuYXRpdmUgYXJyYXkgaW4gc2NyaXB0aW5nIGxhbmd1YWdlcy4gTWF5Citjb250YWluIGR1cGxpY2F0ZXMuCitcaXRlbSBcdGV4dHR0e3NldDx0eXBlPn0gQW4gdW5vcmRlcmVkIHNldCBvZiB1bmlxdWUgZWxlbWVudHMuIFRyYW5zbGF0ZXMgaW50bworYW4gU1RMIFx0ZXh0dHR7c2V0fSwgSmF2YSBcdGV4dHR0e0hhc2hTZXR9LCBcdGV4dHR0e3NldH0gaW4gUHl0aG9uLCBvciBuYXRpdmUKK2RpY3Rpb25hcnkgaW4gUEhQL1J1YnkuCitcaXRlbSBcdGV4dHR0e21hcDx0eXBlMSx0eXBlMj59IEEgbWFwIG9mIHN0cmljdGx5IHVuaXF1ZSBrZXlzIHRvIHZhbHVlcworVHJhbnNsYXRlcyBpbnRvIGFuIFNUTCBcdGV4dHR0e21hcH0sIEphdmEgXHRleHR0dHtIYXNoTWFwfSwgUEhQIGFzc29jaWF0aXZlCithcnJheSwgb3IgUHl0aG9uL1J1YnkgZGljdGlvbmFyeS4KK1xlbmR7aXRlbWl6ZX0KKworV2hpbGUgZGVmYXVsdHMgYXJlIHByb3ZpZGVkLCB0aGUgdHlwZSBtYXBwaW5ncyBhcmUgbm90IGV4cGxpY2l0bHkgZml4ZWQuIEN1c3RvbQorY29kZSBnZW5lcmF0b3IgZGlyZWN0aXZlcyBoYXZlIGJlZW4gYWRkZWQgdG8gc3Vic3RpdHV0ZSBjdXN0b20gdHlwZXMgaW4KK2Rlc3RpbmF0aW9uIGxhbmd1YWdlcyAoaS5lLgorXHRleHR0dHtoYXNoXF9tYXB9IG9yIEdvb2dsZSdzIHNwYXJzZSBoYXNoIG1hcCBjYW4gYmUgdXNlZCBpbiBDKyspLiBUaGUKK29ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB0aGUgY3VzdG9tIHR5cGVzIHN1cHBvcnQgYWxsIHRoZSBuZWNlc3NhcnkgaXRlcmF0aW9uCitwcmltaXRpdmVzLiBDb250YWluZXIgZWxlbWVudHMgbWF5IGJlIG9mIGFueSB2YWxpZCBUaHJpZnQgdHlwZSwgaW5jbHVkaW5nIG90aGVyCitjb250YWluZXJzIG9yIHN0cnVjdHMuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK3N0cnVjdCBFeGFtcGxlIHsKKyAgMTppMzIgbnVtYmVyPTEwLAorICAyOmk2NCBiaWdOdW1iZXIsCisgIDM6ZG91YmxlIGRlY2ltYWxzLAorICA0OnN0cmluZyBuYW1lPSJ0aHJpZnR5IgorfVxlbmR7dmVyYmF0aW19CisKK0luIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIGVhY2ggZGVmaW5pdGlvbiBnZW5lcmF0ZXMgYSB0eXBlIHdpdGggdHdvIG1ldGhvZHMsCitcdGV4dHR0e3JlYWR9IGFuZCBcdGV4dHR0e3dyaXRlfSwgd2hpY2ggcGVyZm9ybSBzZXJpYWxpemF0aW9uIGFuZCB0cmFuc3BvcnQKK29mIHRoZSBvYmplY3RzIHVzaW5nIGEgVGhyaWZ0IFRQcm90b2NvbCBvYmplY3QuCisKK1xzdWJzZWN0aW9ue0V4Y2VwdGlvbnN9CisKK0V4Y2VwdGlvbnMgYXJlIHN5bnRhY3RpY2FsbHkgYW5kIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHN0cnVjdHMgZXhjZXB0Cit0aGF0IHRoZXkgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBcdGV4dHR0e2V4Y2VwdGlvbn0ga2V5d29yZCBpbnN0ZWFkIG9mIHRoZQorXHRleHR0dHtzdHJ1Y3R9IGtleXdvcmQuCisKK1RoZSBnZW5lcmF0ZWQgb2JqZWN0cyBpbmhlcml0IGZyb20gYW4gZXhjZXB0aW9uIGJhc2UgY2xhc3MgYXMgYXBwcm9wcmlhdGUKK2luIGVhY2ggdGFyZ2V0IHByb2dyYW1taW5nIGxhbmd1YWdlLCBpbiBvcmRlciB0byBzZWFtbGVzc2x5CitpbnRlZ3JhdGUgd2l0aCBuYXRpdmUgZXhjZXB0aW9uIGhhbmRsaW5nIGluIGFueSBnaXZlbgorbGFuZ3VhZ2UuIEFnYWluLCB0aGUgZGVzaWduIGVtcGhhc2lzIGlzIG9uIG1ha2luZyB0aGUgY29kZSBmYW1pbGlhciB0byB0aGUKK2FwcGxpY2F0aW9uIGRldmVsb3Blci4KKworXHN1YnNlY3Rpb257U2VydmljZXN9CisKK1NlcnZpY2VzIGFyZSBkZWZpbmVkIHVzaW5nIFRocmlmdCB0eXBlcy4gRGVmaW5pdGlvbiBvZiBhIHNlcnZpY2UgaXMKK3NlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGRlZmluaW5nIGFuIGludGVyZmFjZSAob3IgYSBwdXJlIHZpcnR1YWwgYWJzdHJhY3QKK2NsYXNzKSBpbiBvYmplY3Qgb3JpZW50ZWQKK3Byb2dyYW1taW5nLiBUaGUgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlcyBmdWxseSBmdW5jdGlvbmFsIGNsaWVudCBhbmQKK3NlcnZlciBzdHVicyB0aGF0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlLiBTZXJ2aWNlcyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dzOgorCitcYmVnaW57dmVyYmF0aW19CitzZXJ2aWNlIDxuYW1lPiB7CisgIDxyZXR1cm50eXBlPiA8bmFtZT4oPGFyZ3VtZW50cz4pCisgICAgW3Rocm93cyAoPGV4Y2VwdGlvbnM+KV0KKyAgLi4uCit9XGVuZHt2ZXJiYXRpbX0KKworQW4gZXhhbXBsZToKKworXGJlZ2lue3ZlcmJhdGltfQorc2VydmljZSBTdHJpbmdDYWNoZSB7CisgIHZvaWQgc2V0KDE6aTMyIGtleSwgMjpzdHJpbmcgdmFsdWUpLAorICBzdHJpbmcgZ2V0KDE6aTMyIGtleSkgdGhyb3dzICgxOktleU5vdEZvdW5kIGtuZiksCisgIHZvaWQgZGVsZXRlKDE6aTMyIGtleSkKK30KK1xlbmR7dmVyYmF0aW19CisKK05vdGUgdGhhdCBcdGV4dHR0e3ZvaWR9IGlzIGEgdmFsaWQgdHlwZSBmb3IgYSBmdW5jdGlvbiByZXR1cm4sIGluIGFkZGl0aW9uIHRvCithbGwgb3RoZXIgZGVmaW5lZCBUaHJpZnQgdHlwZXMuIEFkZGl0aW9uYWxseSwgYW4gXHRleHR0dHthc3luY30gbW9kaWZpZXIKK2tleXdvcmQgbWF5IGJlIGFkZGVkIHRvIGEgXHRleHR0dHt2b2lkfSBmdW5jdGlvbiwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQgZG9lcworbm90IHdhaXQgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiBOb3RlIHRoYXQgYSBwdXJlIFx0ZXh0dHR7dm9pZH0KK2Z1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCB3aGljaCBndWFyYW50ZWVzIHRoYXQgdGhlCitvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCBvbiB0aGUgc2VydmVyIHNpZGUuIFdpdGggXHRleHR0dHthc3luY30gbWV0aG9kIGNhbGxzCit0aGUgY2xpZW50IHdpbGwgb25seSBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIHJlcXVlc3Qgc3VjY2VlZGVkIGF0IHRoZQordHJhbnNwb3J0IGxheWVyLiAoSW4gbWFueSB0cmFuc3BvcnQgc2NlbmFyaW9zIHRoaXMgaXMgaW5oZXJlbnRseSB1bnJlbGlhYmxlCitkdWUgdG8gdGhlIEJ5emFudGluZSBHZW5lcmFscycgUHJvYmxlbS4gVGhlcmVmb3JlLCBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzCitzaG91bGQgdGFrZSBjYXJlIG9ubHkgdG8gdXNlIHRoZSBhc3luYyBvcHRpbWl6YXRpb24gaW4gY2FzZXMgd2hlcmUgZHJvcHBlZAorbWV0aG9kIGNhbGxzIGFyZSBhY2NlcHRhYmxlIG9yIHRoZSB0cmFuc3BvcnQgaXMga25vd24gdG8gYmUgcmVsaWFibGUuKQorCitBbHNvIG9mIG5vdGUgaXMgdGhlIGZhY3QgdGhhdCBhcmd1bWVudCBsaXN0cyBhbmQgZXhjZXB0aW9uIGxpc3RzIGZvciBmdW5jdGlvbnMKK2FyZSBpbXBsZW1lbnRlZCBhcyBUaHJpZnQgc3RydWN0cy4gQWxsIHRocmVlIGNvbnN0cnVjdHMgYXJlIGlkZW50aWNhbCBpbiBib3RoCitub3RhdGlvbiBhbmQgYmVoYXZpb3IuCisKK1xzZWN0aW9ue1RyYW5zcG9ydH0KKworVGhlIHRyYW5zcG9ydCBsYXllciBpcyB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQgY29kZSB0byBmYWNpbGl0YXRlIGRhdGEgdHJhbnNmZXIuCisKK1xzdWJzZWN0aW9ue0ludGVyZmFjZX0KKworQSBrZXkgZGVzaWduIGNob2ljZSBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgVGhyaWZ0IHdhcyB0byBkZWNvdXBsZSB0aGUKK3RyYW5zcG9ydCBsYXllciBmcm9tIHRoZSBjb2RlIGdlbmVyYXRpb24gbGF5ZXIuIFRob3VnaCBUaHJpZnQgaXMgdHlwaWNhbGx5Cit1c2VkIG9uIHRvcCBvZiB0aGUgVENQL0lQIHN0YWNrIHdpdGggc3RyZWFtaW5nIHNvY2tldHMgYXMgdGhlIGJhc2UgbGF5ZXIgb2YKK2NvbW11bmljYXRpb24sIHRoZXJlIHdhcyBubyBjb21wZWxsaW5nIHJlYXNvbiB0byBidWlsZCB0aGF0IGNvbnN0cmFpbnQgaW50bwordGhlIHN5c3RlbS4gVGhlIHBlcmZvcm1hbmNlIHRyYWRlb2ZmIGluY3VycmVkIGJ5IGFuIGFic3RyYWN0ZWQgSS9PIGxheWVyCisocm91Z2hseSBvbmUgdmlydHVhbCBtZXRob2QgbG9va3VwIC8gZnVuY3Rpb24gY2FsbCBwZXIgb3BlcmF0aW9uKSB3YXMKK2ltbWF0ZXJpYWwgY29tcGFyZWQgdG8gdGhlIGNvc3Qgb2YgYWN0dWFsIEkvTyBvcGVyYXRpb25zICh0eXBpY2FsbHkgaW52b2tpbmcKK3N5c3RlbSBjYWxscykuCisKK0Z1bmRhbWVudGFsbHksIGdlbmVyYXRlZCBUaHJpZnQgY29kZSBvbmx5IG5lZWRzIHRvIGtub3cgaG93IHRvIHJlYWQgYW5kCit3cml0ZSBkYXRhLiBUaGUgb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBvZiB0aGUgZGF0YSBhcmUgaXJyZWxldmFudDsgaXQgbWF5IGJlIGEKK3NvY2tldCwgYSBzZWdtZW50IG9mIHNoYXJlZCBtZW1vcnksIG9yIGEgZmlsZSBvbiB0aGUgbG9jYWwgZGlzay4gVGhlIFRocmlmdAordHJhbnNwb3J0IGludGVyZmFjZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0gXHRleHR0dHtvcGVufSBPcGVucyB0aGUgdHJhbnNwb3J0CitcaXRlbSBcdGV4dHR0e2Nsb3NlfSBDbG9zZXMgdGhlIHRyYW5zcG9ydAorXGl0ZW0gXHRleHR0dHtpc09wZW59IEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc3BvcnQgaXMgb3BlbgorXGl0ZW0gXHRleHR0dHtyZWFkfSBSZWFkcyBmcm9tIHRoZSB0cmFuc3BvcnQKK1xpdGVtIFx0ZXh0dHR7d3JpdGV9IFdyaXRlcyB0byB0aGUgdHJhbnNwb3J0CitcaXRlbSBcdGV4dHR0e2ZsdXNofSBGb3JjZXMgYW55IHBlbmRpbmcgd3JpdGVzCitcZW5ke2l0ZW1pemV9CisKK1RoZXJlIGFyZSBhIGZldyBhZGRpdGlvbmFsIG1ldGhvZHMgbm90IGRvY3VtZW50ZWQgaGVyZSB3aGljaCBhcmUgdXNlZCB0byBhaWQKK2luIGJhdGNoaW5nIHJlYWRzIGFuZCBvcHRpb25hbGx5IHNpZ25hbGluZyB0aGUgY29tcGxldGlvbiBvZiBhIHJlYWQgb3IKK3dyaXRlIG9wZXJhdGlvbiBmcm9tIHRoZSBnZW5lcmF0ZWQgY29kZS4KKworSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlCitcdGV4dHR0e1RUcmFuc3BvcnR9IGludGVyZmFjZSwgdGhlcmUgaXMgYVxcCitcdGV4dHR0e1RTZXJ2ZXJUcmFuc3BvcnR9IGludGVyZmFjZQordXNlZCB0byBhY2NlcHQgb3IgY3JlYXRlIHByaW1pdGl2ZSB0cmFuc3BvcnQgb2JqZWN0cy4gSXRzIGludGVyZmFjZSBpcyBhcworZm9sbG93czoKKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdGV4dHR0e29wZW59IE9wZW5zIHRoZSB0cmFuc3BvcnQKK1xpdGVtIFx0ZXh0dHR7bGlzdGVufSBCZWdpbnMgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucworXGl0ZW0gXHRleHR0dHthY2NlcHR9IFJldHVybnMgYSBuZXcgY2xpZW50IHRyYW5zcG9ydAorXGl0ZW0gXHRleHR0dHtjbG9zZX0gQ2xvc2VzIHRoZSB0cmFuc3BvcnQKK1xlbmR7aXRlbWl6ZX0KKworXHN1YnNlY3Rpb257SW1wbGVtZW50YXRpb259CisKK1RoZSB0cmFuc3BvcnQgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIGZvciBzaW1wbGUgaW1wbGVtZW50YXRpb24gaW4gYW55Citwcm9ncmFtbWluZyBsYW5ndWFnZS4gTmV3IHRyYW5zcG9ydCBtZWNoYW5pc21zIGNhbiBiZSBlYXNpbHkgZGVmaW5lZCBhcyBuZWVkZWQKK2J5IGFwcGxpY2F0aW9uIGRldmVsb3BlcnMuCisKK1xzdWJzdWJzZWN0aW9ue1RTb2NrZXR9CisKK1RoZSBcdGV4dHR0e1RTb2NrZXR9IGNsYXNzIGlzIGltcGxlbWVudGVkIGFjcm9zcyBhbGwgdGFyZ2V0IGxhbmd1YWdlcy4gSXQKK3Byb3ZpZGVzIGEgY29tbW9uLCBzaW1wbGUgaW50ZXJmYWNlIHRvIGEgVENQL0lQIHN0cmVhbSBzb2NrZXQuCisKK1xzdWJzdWJzZWN0aW9ue1RGaWxlVHJhbnNwb3J0fQorCitUaGUgXHRleHR0dHtURmlsZVRyYW5zcG9ydH0gaXMgYW4gYWJzdHJhY3Rpb24gb2YgYW4gb24tZGlzayBmaWxlIHRvIGEgZGF0YQorc3RyZWFtLiBJdCBjYW4gYmUgdXNlZCB0byB3cml0ZSBvdXQgYSBzZXQgb2YgaW5jb21pbmcgVGhyaWZ0IHJlcXVlc3RzIHRvIGEgZmlsZQorb24gZGlzay4gVGhlIG9uLWRpc2sgZGF0YSBjYW4gdGhlbiBiZSByZXBsYXllZCBmcm9tIHRoZSBsb2csIGVpdGhlciBmb3IKK3Bvc3QtcHJvY2Vzc2luZyBvciBmb3IgcmVwcm9kdWN0aW9uIGFuZC9vciBzaW11bGF0aW9uIG9mIHBhc3QgZXZlbnRzLgorCitcc3Vic3Vic2VjdGlvbntVdGlsaXRpZXN9CisKK1RoZSBUcmFuc3BvcnQgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQgZWFzeSBleHRlbnNpb24gdXNpbmcgY29tbW9uCitPT1AgdGVjaG5pcXVlcywgc3VjaCBhcyBjb21wb3NpdGlvbi4gU29tZSBzaW1wbGUgdXRpbGl0aWVzIGluY2x1ZGUgdGhlCitcdGV4dHR0e1RCdWZmZXJlZFRyYW5zcG9ydH0sIHdoaWNoIGJ1ZmZlcnMgdGhlIHdyaXRlcyBhbmQgcmVhZHMgb24gYW4KK3VuZGVybHlpbmcgdHJhbnNwb3J0LCB0aGUgXHRleHR0dHtURnJhbWVkVHJhbnNwb3J0fSwgd2hpY2ggdHJhbnNtaXRzIGRhdGEgd2l0aCBmcmFtZQorc2l6ZSBoZWFkZXJzIGZvciBjaHVua2luZyBvcHRpbWl6YXRpb24gb3Igbm9uYmxvY2tpbmcgb3BlcmF0aW9uLCBhbmQgdGhlCitcdGV4dHR0e1RNZW1vcnlCdWZmZXJ9LCB3aGljaCBhbGxvd3MgcmVhZGluZyBhbmQgd3JpdGluZyBkaXJlY3RseSBmcm9tIHRoZSBoZWFwCitvciBzdGFjayBtZW1vcnkgb3duZWQgYnkgdGhlIHByb2Nlc3MuCisKK1xzZWN0aW9ue1Byb3RvY29sfQorCitBIHNlY29uZCBtYWpvciBhYnN0cmFjdGlvbiBpbiBUaHJpZnQgaXMgdGhlIHNlcGFyYXRpb24gb2YgZGF0YSBzdHJ1Y3R1cmUgZnJvbQordHJhbnNwb3J0IHJlcHJlc2VudGF0aW9uLiBUaHJpZnQgZW5mb3JjZXMgYSBjZXJ0YWluIG1lc3NhZ2luZyBzdHJ1Y3R1cmUgd2hlbgordHJhbnNwb3J0aW5nIGRhdGEsIGJ1dCBpdCBpcyBhZ25vc3RpYyB0byB0aGUgcHJvdG9jb2wgZW5jb2RpbmcgaW4gdXNlLiBUaGF0IGlzLAoraXQgZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIgZGF0YSBpcyBlbmNvZGVkIGFzIFhNTCwgaHVtYW4tcmVhZGFibGUgQVNDSUksIG9yIGEKK2RlbnNlIGJpbmFyeSBmb3JtYXQgYXMgbG9uZyBhcyB0aGUgZGF0YSBzdXBwb3J0cyBhIGZpeGVkIHNldCBvZiBvcGVyYXRpb25zCit0aGF0IGFsbG93IGl0IHRvIGJlIGRldGVybWluaXN0aWNhbGx5IHJlYWQgYW5kIHdyaXR0ZW4gYnkgZ2VuZXJhdGVkIGNvZGUuCisKK1xzdWJzZWN0aW9ue0ludGVyZmFjZX0KKworVGhlIFRocmlmdCBQcm90b2NvbCBpbnRlcmZhY2UgaXMgdmVyeSBzdHJhaWdodGZvcndhcmQuIEl0IGZ1bmRhbWVudGFsbHkKK3N1cHBvcnRzIHR3byB0aGluZ3M6IDEpIGJpZGlyZWN0aW9uYWwgc2VxdWVuY2VkIG1lc3NhZ2luZywgYW5kCisyKSBlbmNvZGluZyBvZiBiYXNlIHR5cGVzLCBjb250YWluZXJzLCBhbmQgc3RydWN0cy4KKworXGJlZ2lue3ZlcmJhdGltfQord3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxKQord3JpdGVNZXNzYWdlRW5kKCkKK3dyaXRlU3RydWN0QmVnaW4obmFtZSkKK3dyaXRlU3RydWN0RW5kKCkKK3dyaXRlRmllbGRCZWdpbihuYW1lLCB0eXBlLCBpZCkKK3dyaXRlRmllbGRFbmQoKQord3JpdGVGaWVsZFN0b3AoKQord3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCit3cml0ZU1hcEVuZCgpCit3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKK3dyaXRlTGlzdEVuZCgpCit3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQord3JpdGVTZXRFbmQoKQord3JpdGVCb29sKGJvb2wpCit3cml0ZUJ5dGUoYnl0ZSkKK3dyaXRlSTE2KGkxNikKK3dyaXRlSTMyKGkzMikKK3dyaXRlSTY0KGk2NCkKK3dyaXRlRG91YmxlKGRvdWJsZSkKK3dyaXRlU3RyaW5nKHN0cmluZykKKworbmFtZSwgdHlwZSwgc2VxID0gcmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgICAgICAgICAgICByZWFkTWVzc2FnZUVuZCgpCituYW1lID0gICAgICAgICAgICByZWFkU3RydWN0QmVnaW4oKQorICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdEVuZCgpCituYW1lLCB0eXBlLCBpZCA9ICByZWFkRmllbGRCZWdpbigpCisgICAgICAgICAgICAgICAgICByZWFkRmllbGRFbmQoKQoraywgdiwgc2l6ZSA9ICAgICAgcmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICAgICAgICAgIHJlYWRNYXBFbmQoKQorZXR5cGUsIHNpemUgPSAgICAgcmVhZExpc3RCZWdpbigpCisgICAgICAgICAgICAgICAgICByZWFkTGlzdEVuZCgpCitldHlwZSwgc2l6ZSA9ICAgICByZWFkU2V0QmVnaW4oKQorICAgICAgICAgICAgICAgICAgcmVhZFNldEVuZCgpCitib29sID0gICAgICAgICAgICByZWFkQm9vbCgpCitieXRlID0gICAgICAgICAgICByZWFkQnl0ZSgpCitpMTYgPSAgICAgICAgICAgICByZWFkSTE2KCkKK2kzMiA9ICAgICAgICAgICAgIHJlYWRJMzIoKQoraTY0ID0gICAgICAgICAgICAgcmVhZEk2NCgpCitkb3VibGUgPSAgICAgICAgICByZWFkRG91YmxlKCkKK3N0cmluZyA9ICAgICAgICAgIHJlYWRTdHJpbmcoKQorXGVuZHt2ZXJiYXRpbX0KKworTm90ZSB0aGF0IGV2ZXJ5IFx0ZXh0dHR7d3JpdGV9IGZ1bmN0aW9uIGhhcyBleGFjdGx5IG9uZSBcdGV4dHR0e3JlYWR9IGNvdW50ZXJwYXJ0LCB3aXRoCit0aGUgZXhjZXB0aW9uIG9mIFx0ZXh0dHR7d3JpdGVGaWVsZFN0b3AoKX0uIFRoaXMgaXMgYSBzcGVjaWFsIG1ldGhvZAordGhhdCBzaWduYWxzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuIFRoZSBwcm9jZWR1cmUgZm9yIHJlYWRpbmcgYSBzdHJ1Y3QgaXMgdG8KK1x0ZXh0dHR7cmVhZEZpZWxkQmVnaW4oKX0gdW50aWwgdGhlIHN0b3AgZmllbGQgaXMgZW5jb3VudGVyZWQsIGFuZCB0aGVuIHRvCitcdGV4dHR0e3JlYWRTdHJ1Y3RFbmQoKX0uICBUaGUKK2dlbmVyYXRlZCBjb2RlIHJlbGllcyB1cG9uIHRoaXMgY2FsbCBzZXF1ZW5jZSB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIHdyaXR0ZW4gYnkKK2EgcHJvdG9jb2wgZW5jb2RlciBjYW4gYmUgcmVhZCBieSBhIG1hdGNoaW5nIHByb3RvY29sIGRlY29kZXIuIEZ1cnRoZXIgbm90ZQordGhhdCB0aGlzIHNldCBvZiBmdW5jdGlvbnMgaXMgYnkgZGVzaWduIG1vcmUgcm9idXN0IHRoYW4gbmVjZXNzYXJ5LgorRm9yIGV4YW1wbGUsIFx0ZXh0dHR7d3JpdGVTdHJ1Y3RFbmQoKX0gaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYXMgdGhlIGVuZCBvZgorYSBzdHJ1Y3QgbWF5IGJlIGltcGxpZWQgYnkgdGhlIHN0b3AgZmllbGQuIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgZm9yCit2ZXJib3NlIHByb3RvY29scyBpbiB3aGljaCBpdCBpcyBjbGVhbmVyIHRvIHNlcGFyYXRlIHRoZXNlIGNhbGxzIChlLmcuIGEgY2xvc2luZworXHRleHR0dHs8L3N0cnVjdD59IHRhZyBpbiBYTUwpLgorCitcc3Vic2VjdGlvbntTdHJ1Y3R1cmV9CisKK1RocmlmdCBzdHJ1Y3R1cmVzIGFyZSBkZXNpZ25lZCB0byBzdXBwb3J0IGVuY29kaW5nIGludG8gYSBzdHJlYW1pbmcKK3Byb3RvY29sLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG5ldmVyIG5lZWQgdG8gZnJhbWUgb3IgY29tcHV0ZSB0aGUKK2VudGlyZSBkYXRhIGxlbmd0aCBvZiBhIHN0cnVjdHVyZSBwcmlvciB0byBlbmNvZGluZyBpdC4gVGhpcyBpcyBjcml0aWNhbCB0bworcGVyZm9ybWFuY2UgaW4gbWFueSBzY2VuYXJpb3MuIENvbnNpZGVyIGEgbG9uZyBsaXN0IG9mIHJlbGF0aXZlbHkgbGFyZ2UKK3N0cmluZ3MuIElmIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UgcmVxdWlyZWQgcmVhZGluZyBvciB3cml0aW5nIGEgbGlzdCB0byBiZSBhbgorYXRvbWljIG9wZXJhdGlvbiwgdGhlbiB0aGUgaW1wbGVtZW50YXRpb24gd291bGQgbmVlZCB0byBwZXJmb3JtIGEgbGluZWFyIHBhc3Mgb3ZlciB0aGUKK2VudGlyZSBsaXN0IGJlZm9yZSBlbmNvZGluZyBhbnkgZGF0YS4gSG93ZXZlciwgaWYgdGhlIGxpc3QgY2FuIGJlIHdyaXR0ZW4KK2FzIGl0ZXJhdGlvbiBpcyBwZXJmb3JtZWQsIHRoZSBjb3JyZXNwb25kaW5nIHJlYWQgbWF5IGJlZ2luIGluIHBhcmFsbGVsLAordGhlb3JldGljYWxseSBvZmZlcmluZyBhbiBlbmQtdG8tZW5kIHNwZWVkdXAgb2YgJChrTiAtIEMpJCwgd2hlcmUgJE4kIGlzIHRoZSBzaXplCitvZiB0aGUgbGlzdCwgJGskIHRoZSBjb3N0IGZhY3RvciBhc3NvY2lhdGVkIHdpdGggc2VyaWFsaXppbmcgYSBzaW5nbGUKK2VsZW1lbnQsIGFuZCAkQyQgaXMgZml4ZWQgb2Zmc2V0IGZvciB0aGUgZGVsYXkgYmV0d2VlbiBkYXRhIGJlaW5nIHdyaXR0ZW4KK2FuZCBiZWNvbWluZyBhdmFpbGFibGUgdG8gcmVhZC4KKworU2ltaWxhcmx5LCBzdHJ1Y3RzIGRvIG5vdCBlbmNvZGUgdGhlaXIgZGF0YSBsZW5ndGhzIGEgcHJpb3JpLiBJbnN0ZWFkLCB0aGV5IGFyZQorZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIGZpZWxkcywgd2l0aCBlYWNoIGZpZWxkIGhhdmluZyBhIHR5cGUgc3BlY2lmaWVyIGFuZCBhCit1bmlxdWUgZmllbGQgaWRlbnRpZmllci4gTm90ZSB0aGF0IHRoZSBpbmNsdXNpb24gb2YgdHlwZSBzcGVjaWZpZXJzIGFsbG93cwordGhlIHByb3RvY29sIHRvIGJlIHNhZmVseSBwYXJzZWQgYW5kIGRlY29kZWQgd2l0aG91dCBhbnkgZ2VuZXJhdGVkIGNvZGUKK29yIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgSURMIGZpbGUuIFN0cnVjdHMgYXJlIHRlcm1pbmF0ZWQgYnkgYSBmaWVsZCBoZWFkZXIKK3dpdGggYSBzcGVjaWFsIFx0ZXh0dHR7U1RPUH0gdHlwZS4gQmVjYXVzZSBhbGwgdGhlIGJhc2ljIHR5cGVzIGNhbiBiZSByZWFkCitkZXRlcm1pbmlzdGljYWxseSwgYWxsIHN0cnVjdHMgKGV2ZW4gdGhvc2UgY29udGFpbmluZyBvdGhlciBzdHJ1Y3RzKSBjYW4gYmUKK3JlYWQgZGV0ZXJtaW5pc3RpY2FsbHkuIFRoZSBUaHJpZnQgcHJvdG9jb2wgaXMgc2VsZi1kZWxpbWl0aW5nIHdpdGhvdXQgYW55CitmcmFtaW5nIGFuZCByZWdhcmRsZXNzIG9mIHRoZSBlbmNvZGluZyBmb3JtYXQuCisKK0luIHNpdHVhdGlvbnMgd2hlcmUgc3RyZWFtaW5nIGlzIHVubmVjZXNzYXJ5IG9yIGZyYW1pbmcgaXMgYWR2YW50YWdlb3VzLCBpdAorY2FuIGJlIHZlcnkgc2ltcGx5IGFkZGVkIGludG8gdGhlIHRyYW5zcG9ydCBsYXllciwgdXNpbmcgdGhlCitcdGV4dHR0e1RGcmFtZWRUcmFuc3BvcnR9IGFic3RyYWN0aW9uLgorCitcc3Vic2VjdGlvbntJbXBsZW1lbnRhdGlvbn0KKworRmFjZWJvb2sgaGFzIGltcGxlbWVudGVkIGFuZCBkZXBsb3llZCBhIHNwYWNlLWVmZmljaWVudCBiaW5hcnkgcHJvdG9jb2wgd2hpY2gKK2lzIHVzZWQgYnkgbW9zdCBiYWNrZW5kIHNlcnZpY2VzLiBFc3NlbnRpYWxseSwgaXQgd3JpdGVzIGFsbCBkYXRhCitpbiBhIGZsYXQgYmluYXJ5IGZvcm1hdC4gSW50ZWdlciB0eXBlcyBhcmUgY29udmVydGVkIHRvIG5ldHdvcmsgYnl0ZSBvcmRlciwKK3N0cmluZ3MgYXJlIHByZXBlbmRlZCB3aXRoIHRoZWlyIGJ5dGUgbGVuZ3RoLCBhbmQgYWxsIG1lc3NhZ2UgYW5kIGZpZWxkIGhlYWRlcnMKK2FyZSB3cml0dGVuIHVzaW5nIHRoZSBwcmltaXRpdmUgaW50ZWdlciBzZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMuIFN0cmluZyBuYW1lcworZm9yIGZpZWxkcyBhcmUgb21pdHRlZCAtIHdoZW4gdXNpbmcgZ2VuZXJhdGVkIGNvZGUsIGZpZWxkIGlkZW50aWZpZXJzIGFyZQorc3VmZmljaWVudC4KKworV2UgZGVjaWRlZCBhZ2FpbnN0IHNvbWUgZXh0cmVtZSBzdG9yYWdlIG9wdGltaXphdGlvbnMgKGkuZS4gcGFja2luZworc21hbGwgaW50ZWdlcnMgaW50byBBU0NJSSBvciB1c2luZyBhIDctYml0IGNvbnRpbnVhdGlvbiBmb3JtYXQpIGZvciB0aGUgc2FrZQorb2Ygc2ltcGxpY2l0eSBhbmQgY2xhcml0eSBpbiB0aGUgY29kZS4gVGhlc2UgYWx0ZXJhdGlvbnMgY2FuIGVhc2lseSBiZSBtYWRlCitpZiBhbmQgd2hlbiB3ZSBlbmNvdW50ZXIgYSBwZXJmb3JtYW5jZS1jcml0aWNhbCB1c2UgY2FzZSB0aGF0IGRlbWFuZHMgdGhlbS4KKworXHNlY3Rpb257VmVyc2lvbmluZ30KKworVGhyaWZ0IGlzIHJvYnVzdCBpbiB0aGUgZmFjZSBvZiB2ZXJzaW9uaW5nIGFuZCBkYXRhIGRlZmluaXRpb24gY2hhbmdlcy4gVGhpcworaXMgY3JpdGljYWwgdG8gZW5hYmxlIHN0YWdlZCByb2xsb3V0cyBvZiBjaGFuZ2VzIHRvIGRlcGxveWVkIHNlcnZpY2VzLiBUaGUKK3N5c3RlbSBtdXN0IGJlIGFibGUgdG8gc3VwcG9ydCByZWFkaW5nIG9mIG9sZCBkYXRhIGZyb20gbG9nIGZpbGVzLCBhcyB3ZWxsIGFzCityZXF1ZXN0cyBmcm9tIG91dC1vZi1kYXRlIGNsaWVudHMgdG8gbmV3IHNlcnZlcnMsIGFuZCB2aWNlIHZlcnNhLgorCitcc3Vic2VjdGlvbntGaWVsZCBJZGVudGlmaWVyc30KKworVmVyc2lvbmluZyBpbiBUaHJpZnQgaXMgaW1wbGVtZW50ZWQgdmlhIGZpZWxkIGlkZW50aWZpZXJzLiBUaGUgZmllbGQgaGVhZGVyCitmb3IgZXZlcnkgbWVtYmVyIG9mIGEgc3RydWN0IGluIFRocmlmdCBpcyBlbmNvZGVkIHdpdGggYSB1bmlxdWUgZmllbGQKK2lkZW50aWZpZXIuIFRoZSBjb21iaW5hdGlvbiBvZiB0aGlzIGZpZWxkIGlkZW50aWZpZXIgYW5kIGl0cyB0eXBlIHNwZWNpZmllcgoraXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgZmllbGQuIFRoZSBUaHJpZnQgZGVmaW5pdGlvbiBsYW5ndWFnZQorc3VwcG9ydHMgYXV0b21hdGljIGFzc2lnbm1lbnQgb2YgZmllbGQgaWRlbnRpZmllcnMsIGJ1dCBpdCBpcyBnb29kCitwcm9ncmFtbWluZyBwcmFjdGljZSB0byBhbHdheXMgZXhwbGljaXRseSBzcGVjaWZ5IGZpZWxkIGlkZW50aWZpZXJzLgorSWRlbnRpZmllcnMgYXJlIHNwZWNpZmllZCBhcyBmb2xsb3dzOgorCitcYmVnaW57dmVyYmF0aW19CitzdHJ1Y3QgRXhhbXBsZSB7CisgIDE6aTMyIG51bWJlcj0xMCwKKyAgMjppNjQgYmlnTnVtYmVyLAorICAzOmRvdWJsZSBkZWNpbWFscywKKyAgNDpzdHJpbmcgbmFtZT0idGhyaWZ0eSIKK31cZW5ke3ZlcmJhdGltfQorCitUbyBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiBtYW51YWxseSBhbmQgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZGVudGlmaWVycywKK2ZpZWxkcyB3aXRoIGlkZW50aWZpZXJzIG9taXR0ZWQgYXJlIGFzc2lnbmVkIGlkZW50aWZpZXJzCitkZWNyZW1lbnRpbmcgZnJvbSAtMSwgYW5kIHRoZSBsYW5ndWFnZSBvbmx5IHN1cHBvcnRzIHRoZSBtYW51YWwgYXNzaWdubWVudCBvZgorcG9zaXRpdmUgaWRlbnRpZmllcnMuCisKK1doZW4gZGF0YSBpcyBiZWluZyBkZXNlcmlhbGl6ZWQsIHRoZSBnZW5lcmF0ZWQgY29kZSBjYW4gdXNlIHRoZXNlIGlkZW50aWZpZXJzCit0byBwcm9wZXJseSBpZGVudGlmeSB0aGUgZmllbGQgYW5kIGRldGVybWluZSB3aGV0aGVyIGl0IGFsaWducyB3aXRoIGEgZmllbGQgaW4KK2l0cyBkZWZpbml0aW9uIGZpbGUuIElmIGEgZmllbGQgaWRlbnRpZmllciBpcyBub3QgcmVjb2duaXplZCwgdGhlIGdlbmVyYXRlZAorY29kZSBjYW4gdXNlIHRoZSB0eXBlIHNwZWNpZmllciB0byBza2lwIHRoZSB1bmtub3duIGZpZWxkIHdpdGhvdXQgYW55IGVycm9yLgorQWdhaW4sIHRoaXMgaXMgcG9zc2libGUgZHVlIHRvIHRoZSBmYWN0IHRoYXQgYWxsIGRhdGF0eXBlcyBhcmUgc2VsZgorZGVsaW1pdGluZy4KKworRmllbGQgaWRlbnRpZmllcnMgY2FuIChhbmQgc2hvdWxkKSBhbHNvIGJlIHNwZWNpZmllZCBpbiBmdW5jdGlvbiBhcmd1bWVudAorbGlzdHMuIEluIGZhY3QsIGFyZ3VtZW50IGxpc3RzIGFyZSBub3Qgb25seSByZXByZXNlbnRlZCBhcyBzdHJ1Y3RzIG9uIHRoZQorYmFja2VuZCwgYnV0IGFjdHVhbGx5IHNoYXJlIHRoZSBzYW1lIGNvZGUgaW4gdGhlIGNvbXBpbGVyIGZyb250ZW5kLiBUaGlzCithbGxvd3MgZm9yIHZlcnNpb24tc2FmZSBtb2RpZmljYXRpb24gb2YgbWV0aG9kIHBhcmFtZXRlcnMKKworXGJlZ2lue3ZlcmJhdGltfQorc2VydmljZSBTdHJpbmdDYWNoZSB7CisgIHZvaWQgc2V0KDE6aTMyIGtleSwgMjpzdHJpbmcgdmFsdWUpLAorICBzdHJpbmcgZ2V0KDE6aTMyIGtleSkgdGhyb3dzICgxOktleU5vdEZvdW5kIGtuZiksCisgIHZvaWQgZGVsZXRlKDE6aTMyIGtleSkKK30KK1xlbmR7dmVyYmF0aW19CisKK1RoZSBzeW50YXggZm9yIHNwZWNpZnlpbmcgZmllbGQgaWRlbnRpZmllcnMgd2FzIGNob3NlbiB0byBlY2hvIHRoZWlyIHN0cnVjdHVyZS4KK1N0cnVjdHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBkaWN0aW9uYXJ5IHdoZXJlIHRoZSBpZGVudGlmaWVycyBhcmUga2V5cywgYW5kCit0aGUgdmFsdWVzIGFyZSBzdHJvbmdseS10eXBlZCBuYW1lZCBmaWVsZHMuCisKK0ZpZWxkIGlkZW50aWZpZXJzIGludGVybmFsbHkgdXNlIHRoZSBcdGV4dHR0e2kxNn0gVGhyaWZ0IHR5cGUuIE5vdGUsIGhvd2V2ZXIsCit0aGF0IHRoZSBcdGV4dHR0e1RQcm90b2NvbH0gYWJzdHJhY3Rpb24gbWF5IGVuY29kZSBpZGVudGlmaWVycyBpbiBhbnkgZm9ybWF0LgorCitcc3Vic2VjdGlvbntJc3NldH0KKworV2hlbiBhbiB1bmV4cGVjdGVkIGZpZWxkIGlzIGVuY291bnRlcmVkLCBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgYW5kCitkaXNjYXJkZWQuIFdoZW4gYW4gZXhwZWN0ZWQgZmllbGQgaXMgbm90IGZvdW5kLCB0aGVyZSBtdXN0IGJlIHNvbWUgd2F5IHRvCitzaWduYWwgdG8gdGhlIGRldmVsb3BlciB0aGF0IGl0IHdhcyBub3QgcHJlc2VudC4gVGhpcyBpcyBpbXBsZW1lbnRlZCB2aWEgYW4KK2lubmVyIFx0ZXh0dHR7aXNzZXR9IHN0cnVjdHVyZSBpbnNpZGUgdGhlIGRlZmluZWQgb2JqZWN0cy4gKElzc2V0IGZ1bmN0aW9uYWxpdHkKK2lzIGltcGxpY2l0IHdpdGggYSBcdGV4dHR0e251bGx9IHZhbHVlIGluIFBIUCwgXHRleHR0dHtOb25lfSBpbiBQeXRob24KK2FuZCBcdGV4dHR0e25pbH0gaW4gUnVieS4pIEVzc2VudGlhbGx5LAordGhlIGlubmVyIFx0ZXh0dHR7aXNzZXR9IG9iamVjdCBvZiBlYWNoIFRocmlmdCBzdHJ1Y3QgY29udGFpbnMgYSBib29sZWFuIHZhbHVlCitmb3IgZWFjaCBmaWVsZCB3aGljaCBkZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoYXQgZmllbGQgaXMgcHJlc2VudCBpbiB0aGUKK3N0cnVjdC4gV2hlbiBhIHJlYWRlciByZWNlaXZlcyBhIHN0cnVjdCwgaXQgc2hvdWxkIGNoZWNrIGZvciBhIGZpZWxkIGJlaW5nIHNldAorYmVmb3JlIG9wZXJhdGluZyBkaXJlY3RseSBvbiBpdC4KKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgRXhhbXBsZSB7CisgcHVibGljOgorICBFeGFtcGxlKCkgOgorICAgIG51bWJlcigxMCksCisgICAgYmlnTnVtYmVyKDApLAorICAgIGRlY2ltYWxzKDApLAorICAgIG5hbWUoInRocmlmdHkiKSB7fQorCisgIGludDMyX3QgbnVtYmVyOworICBpbnQ2NF90IGJpZ051bWJlcjsKKyAgZG91YmxlIGRlY2ltYWxzOworICBzdGQ6OnN0cmluZyBuYW1lOworCisgIHN0cnVjdCBfX2lzc2V0IHsKKyAgICBfX2lzc2V0KCkgOgorICAgICAgbnVtYmVyKGZhbHNlKSwKKyAgICAgIGJpZ051bWJlcihmYWxzZSksCisgICAgICBkZWNpbWFscyhmYWxzZSksCisgICAgICBuYW1lKGZhbHNlKSB7fQorICAgIGJvb2wgbnVtYmVyOworICAgIGJvb2wgYmlnTnVtYmVyOworICAgIGJvb2wgZGVjaW1hbHM7CisgICAgYm9vbCBuYW1lOworICB9IF9faXNzZXQ7CisuLi4KK30KK1xlbmR7dmVyYmF0aW19CisKK1xzdWJzZWN0aW9ue0Nhc2UgQW5hbHlzaXN9CisKK1RoZXJlIGFyZSBmb3VyIGNhc2VzIGluIHdoaWNoIHZlcnNpb24gbWlzbWF0Y2hlcyBtYXkgb2NjdXIuCisKK1xiZWdpbntlbnVtZXJhdGV9CitcaXRlbSBcdGV4dGl0e0FkZGVkIGZpZWxkLCBvbGQgY2xpZW50LCBuZXcgc2VydmVyLn0gSW4gdGhpcyBjYXNlLCB0aGUgb2xkCitjbGllbnQgZG9lcyBub3Qgc2VuZCB0aGUgbmV3IGZpZWxkLiBUaGUgbmV3IHNlcnZlciByZWNvZ25pemVzIHRoYXQgdGhlIGZpZWxkCitpcyBub3Qgc2V0LCBhbmQgaW1wbGVtZW50cyBkZWZhdWx0IGJlaGF2aW9yIGZvciBvdXQtb2YtZGF0ZSByZXF1ZXN0cy4KK1xpdGVtIFx0ZXh0aXR7UmVtb3ZlZCBmaWVsZCwgb2xkIGNsaWVudCwgbmV3IHNlcnZlci59IEluIHRoaXMgY2FzZSwgdGhlIG9sZAorY2xpZW50IHNlbmRzIHRoZSByZW1vdmVkIGZpZWxkLiBUaGUgbmV3IHNlcnZlciBzaW1wbHkgaWdub3JlcyBpdC4KK1xpdGVtIFx0ZXh0aXR7QWRkZWQgZmllbGQsIG5ldyBjbGllbnQsIG9sZCBzZXJ2ZXIufSBUaGUgbmV3IGNsaWVudCBzZW5kcyBhCitmaWVsZCB0aGF0IHRoZSBvbGQgc2VydmVyIGRvZXMgbm90IHJlY29nbml6ZS4gVGhlIG9sZCBzZXJ2ZXIgc2ltcGx5IGlnbm9yZXMKK2l0IGFuZCBwcm9jZXNzZXMgYXMgbm9ybWFsLgorXGl0ZW0gXHRleHRpdHtSZW1vdmVkIGZpZWxkLCBuZXcgY2xpZW50LCBvbGQgc2VydmVyLn0gVGhpcyBpcyB0aGUgbW9zdAorZGFuZ2Vyb3VzIGNhc2UsIGFzIHRoZSBvbGQgc2VydmVyIGlzIHVubGlrZWx5IHRvIGhhdmUgc3VpdGFibGUgZGVmYXVsdAorYmVoYXZpb3IgaW1wbGVtZW50ZWQgZm9yIHRoZSBtaXNzaW5nIGZpZWxkLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGluIHRoaXMKK3NpdHVhdGlvbiB0aGUgbmV3IHNlcnZlciBiZSByb2xsZWQgb3V0IHByaW9yIHRvIHRoZSBuZXcgY2xpZW50cy4KK1xlbmR7ZW51bWVyYXRlfQorCitcc3Vic2VjdGlvbntQcm90b2NvbC9UcmFuc3BvcnQgVmVyc2lvbmluZ30KK1RoZSBcdGV4dHR0e1RQcm90b2NvbH0gYWJzdHJhY3Rpb25zIGFyZSBhbHNvIGRlc2lnbmVkIHRvIGdpdmUgcHJvdG9jb2wKK2ltcGxlbWVudGF0aW9ucyB0aGUgZnJlZWRvbSB0byB2ZXJzaW9uIHRoZW1zZWx2ZXMgaW4gd2hhdGV2ZXIgbWFubmVyIHRoZXkKK3NlZSBmaXQuIFNwZWNpZmljYWxseSwgYW55IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gc2VuZCB3aGF0ZXZlcgoraXQgbGlrZXMgaW4gdGhlIFx0ZXh0dHR7d3JpdGVNZXNzYWdlQmVnaW4oKX0gY2FsbC4gSXQgaXMgZW50aXJlbHkgdXAgdG8gdGhlCitpbXBsZW1lbnRvciBob3cgdG8gaGFuZGxlIHZlcnNpb25pbmcgYXQgdGhlIHByb3RvY29sIGxldmVsLiBUaGUga2V5IHBvaW50IGlzCit0aGF0IHByb3RvY29sIGVuY29kaW5nIGNoYW5nZXMgYXJlIHNhZmVseSBpc29sYXRlZCBmcm9tIGludGVyZmFjZSBkZWZpbml0aW9uCit2ZXJzaW9uIGNoYW5nZXMuCisKK05vdGUgdGhhdCB0aGUgZXhhY3Qgc2FtZSBpcyB0cnVlIG9mIHRoZSBcdGV4dHR0e1RUcmFuc3BvcnR9IGludGVyZmFjZS4gRm9yCitleGFtcGxlLCBpZiB3ZSB3aXNoZWQgdG8gYWRkIHNvbWUgbmV3IGNoZWNrc3VtbWluZyBvciBlcnJvciBkZXRlY3Rpb24gdG8gdGhlCitcdGV4dHR0e1RGaWxlVHJhbnNwb3J0fSwgd2UgY291bGQgc2ltcGx5IGFkZCBhIHZlcnNpb24gaGVhZGVyIGludG8gdGhlCitkYXRhIGl0IHdyaXRlcyB0byB0aGUgZmlsZSBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgd291bGQgc3RpbGwgYWNjZXB0IG9sZAorbG9nIGZpbGVzIHdpdGhvdXQgdGhlIGdpdmVuIGhlYWRlci4KKworXHNlY3Rpb257UlBDIEltcGxlbWVudGF0aW9ufQorCitcc3Vic2VjdGlvbntUUHJvY2Vzc29yfQorCitUaGUgbGFzdCBjb3JlIGludGVyZmFjZSBpbiB0aGUgVGhyaWZ0IGRlc2lnbiBpcyB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSwKK3BlcmhhcHMgdGhlIG1vc3Qgc2ltcGxlIG9mIHRoZSBjb25zdHJ1Y3RzLiBUaGUgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ludGVyZmFjZSBUUHJvY2Vzc29yIHsKKyAgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpbiwgVFByb3RvY29sIG91dCkKKyAgICB0aHJvd3MgVEV4Y2VwdGlvbgorfQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGtleSBkZXNpZ24gaWRlYSBoZXJlIGlzIHRoYXQgdGhlIGNvbXBsZXggc3lzdGVtcyB3ZSBidWlsZCBjYW4gZnVuZGFtZW50YWxseQorYmUgYnJva2VuIGRvd24gaW50byBhZ2VudHMgb3Igc2VydmljZXMgdGhhdCBvcGVyYXRlIG9uIGlucHV0cyBhbmQgb3V0cHV0cy4gSW4KK21vc3QgY2FzZXMsIHRoZXJlIGlzIGFjdHVhbGx5IGp1c3Qgb25lIGlucHV0IGFuZCBvdXRwdXQgKGFuIFJQQyBjbGllbnQpIHRoYXQKK25lZWRzIGhhbmRsaW5nLgorCitcc3Vic2VjdGlvbntHZW5lcmF0ZWQgQ29kZX0KKworV2hlbiBhIHNlcnZpY2UgaXMgZGVmaW5lZCwgd2UgZ2VuZXJhdGUgYQorXHRleHR0dHtUUHJvY2Vzc29yfSBpbnN0YW5jZSBjYXBhYmxlIG9mIGhhbmRsaW5nIFJQQyByZXF1ZXN0cyB0byB0aGF0IHNlcnZpY2UsCit1c2luZyBhIGZldyBoZWxwZXJzLiBUaGUgZnVuZGFtZW50YWwgc3RydWN0dXJlIChpbGx1c3RyYXRlZCBpbiBwc2V1ZG8tQysrKSBpcworYXMgZm9sbG93czoKKworXGJlZ2lue3ZlcmJhdGltfQorU2VydmljZS50aHJpZnQKKyA9PiBTZXJ2aWNlLmNwcAorICAgICBpbnRlcmZhY2UgU2VydmljZUlmCisgICAgIGNsYXNzIFNlcnZpY2VDbGllbnQgOiB2aXJ0dWFsIFNlcnZpY2VJZgorICAgICAgIFRQcm90b2NvbCBpbgorICAgICAgIFRQcm90b2NvbCBvdXQKKyAgICAgY2xhc3MgU2VydmljZVByb2Nlc3NvciA6IFRQcm9jZXNzb3IKKyAgICAgICBTZXJ2aWNlSWYgaGFuZGxlcgorCitTZXJ2aWNlSGFuZGxlci5jcHAKKyBjbGFzcyBTZXJ2aWNlSGFuZGxlciA6IHZpcnR1YWwgU2VydmljZUlmCisKK1RTZXJ2ZXIuY3BwCisgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdGZhY3RvcnksCisgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHBmYWN0b3J5KQorIHNlcnZlKCkKK1xlbmR7dmVyYmF0aW19CisKK0Zyb20gdGhlIFRocmlmdCBkZWZpbml0aW9uIGZpbGUsIHdlIGdlbmVyYXRlIHRoZSB2aXJ0dWFsIHNlcnZpY2UgaW50ZXJmYWNlLgorQSBjbGllbnQgY2xhc3MgaXMgZ2VuZXJhdGVkLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgYW5kCit1c2VzIHR3byBcdGV4dHR0e1RQcm90b2NvbH0gaW5zdGFuY2VzIHRvIHBlcmZvcm0gdGhlIEkvTyBvcGVyYXRpb25zLiBUaGUKK2dlbmVyYXRlZCBwcm9jZXNzb3IgaW1wbGVtZW50cyB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSBpbnRlcmZhY2UuIFRoZSBnZW5lcmF0ZWQKK2NvZGUgaGFzIGFsbCB0aGUgbG9naWMgdG8gaGFuZGxlIFJQQyBpbnZvY2F0aW9ucyB2aWEgdGhlIFx0ZXh0dHR7cHJvY2VzcygpfQorY2FsbCwgYW5kIHRha2VzIGFzIGEgcGFyYW1ldGVyIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGludGVyZmFjZSwgYXMKK2ltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIuCisKK1RoZSB1c2VyIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgaW4gc2VwYXJhdGUsCitub24tZ2VuZXJhdGVkIHNvdXJjZSBjb2RlLgorCitcc3Vic2VjdGlvbntUU2VydmVyfQorCitGaW5hbGx5LCB0aGUgVGhyaWZ0IGNvcmUgbGlicmFyaWVzIHByb3ZpZGUgYSBcdGV4dHR0e1RTZXJ2ZXJ9IGFic3RyYWN0aW9uLgorVGhlIFx0ZXh0dHR7VFNlcnZlcn0gb2JqZWN0IGdlbmVyYWxseSB3b3JrcyBhcyBmb2xsb3dzLgorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFVzZSB0aGUgXHRleHR0dHtUU2VydmVyVHJhbnNwb3J0fSB0byBnZXQgYSBcdGV4dHR0e1RUcmFuc3BvcnR9CitcaXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFRyYW5zcG9ydEZhY3Rvcnl9IHRvIG9wdGlvbmFsbHkgY29udmVydCB0aGUgcHJpbWl0aXZlCit0cmFuc3BvcnQgaW50byBhIHN1aXRhYmxlIGFwcGxpY2F0aW9uIHRyYW5zcG9ydCAodHlwaWNhbGx5IHRoZQorXHRleHR0dHtUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5fSBpcyB1c2VkIGhlcmUpCitcaXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFByb3RvY29sRmFjdG9yeX0gdG8gY3JlYXRlIGFuIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wKK2ZvciB0aGUgXHRleHR0dHtUVHJhbnNwb3J0fQorXGl0ZW0gSW52b2tlIHRoZSBcdGV4dHR0e3Byb2Nlc3MoKX0gbWV0aG9kIG9mIHRoZSBcdGV4dHR0e1RQcm9jZXNzb3J9IG9iamVjdAorXGVuZHtpdGVtaXplfQorCitUaGUgbGF5ZXJzIGFyZSBhcHByb3ByaWF0ZWx5IHNlcGFyYXRlZCBzdWNoIHRoYXQgdGhlIHNlcnZlciBjb2RlIG5lZWRzIHRvIGtub3cKK25vdGhpbmcgYWJvdXQgYW55IG9mIHRoZSB0cmFuc3BvcnRzLCBlbmNvZGluZ3MsIG9yIGFwcGxpY2F0aW9ucyBpbiBwbGF5LiBUaGUKK3NlcnZlciBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIGFyb3VuZCBjb25uZWN0aW9uIGhhbmRsaW5nLCB0aHJlYWRpbmcsIGV0Yy4KK3doaWxlIHRoZSBwcm9jZXNzb3IgZGVhbHMgd2l0aCBSUEMuIFRoZSBvbmx5IGNvZGUgd3JpdHRlbiBieSB0aGUgYXBwbGljYXRpb24KK2RldmVsb3BlciBsaXZlcyBpbiB0aGUgZGVmaW5pdGlvbmFsIFRocmlmdCBmaWxlIGFuZCB0aGUgaW50ZXJmYWNlCitpbXBsZW1lbnRhdGlvbi4KKworRmFjZWJvb2sgaGFzIGRlcGxveWVkIG11bHRpcGxlIFx0ZXh0dHR7VFNlcnZlcn0gaW1wbGVtZW50YXRpb25zLCBpbmNsdWRpbmcKK3RoZSBzaW5nbGUtdGhyZWFkZWQgXHRleHR0dHtUU2ltcGxlU2VydmVyfSwgdGhyZWFkLXBlci1jb25uZWN0aW9uCitcdGV4dHR0e1RUaHJlYWRlZFNlcnZlcn0sIGFuZCB0aHJlYWQtcG9vbGluZyBcdGV4dHR0e1RUaHJlYWRQb29sU2VydmVyfS4KKworVGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0gaW50ZXJmYWNlIGlzIHZlcnkgZ2VuZXJhbCBieSBkZXNpZ24uIFRoZXJlIGlzIG5vCityZXF1aXJlbWVudCB0aGF0IGEgXHRleHR0dHtUU2VydmVyfSB0YWtlIGEgZ2VuZXJhdGVkIFx0ZXh0dHR7VFByb2Nlc3Nvcn0KK29iamVjdC4gVGhyaWZ0IGFsbG93cyB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGVhc2lseSB3cml0ZSBhbnkgdHlwZSBvZgorc2VydmVyIHRoYXQgb3BlcmF0ZXMgb24gXHRleHR0dHtUUHJvdG9jb2x9IG9iamVjdHMgKGZvciBpbnN0YW5jZSwgYSBzZXJ2ZXIKK2NvdWxkIHNpbXBseSBzdHJlYW0gYSBjZXJ0YWluIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgYW55IGFjdHVhbCBSUEMgbWV0aG9kCitpbnZvY2F0aW9uKS4KKworXHNlY3Rpb257SW1wbGVtZW50YXRpb24gRGV0YWlsc30KK1xzdWJzZWN0aW9ue1RhcmdldCBMYW5ndWFnZXN9CitUaHJpZnQgY3VycmVudGx5IHN1cHBvcnRzIGZpdmUgdGFyZ2V0IGxhbmd1YWdlczogQysrLCBKYXZhLCBQeXRob24sIFJ1YnksIGFuZAorUEhQLiBBdCBGYWNlYm9vaywgd2UgaGF2ZSBkZXBsb3llZCBzZXJ2ZXJzIHByZWRvbWluYW50bHkgaW4gQysrLCBKYXZhLCBhbmQKK1B5dGhvbi4gVGhyaWZ0IHNlcnZpY2VzIGltcGxlbWVudGVkIGluIFBIUCBoYXZlIGFsc28gYmVlbiBlbWJlZGRlZCBpbnRvIHRoZQorQXBhY2hlIHdlYiBzZXJ2ZXIsIHByb3ZpZGluZyB0cmFuc3BhcmVudCBiYWNrZW5kIGFjY2VzcyB0byBtYW55IG9mIG91cgorZnJvbnRlbmQgY29uc3RydWN0cyB1c2luZyBhIFx0ZXh0dHR7VEh0dHBDbGllbnR9IGltcGxlbWVudGF0aW9uIG9mIHRoZQorXHRleHR0dHtUVHJhbnNwb3J0fSBpbnRlcmZhY2UuCisKK1Rob3VnaCBUaHJpZnQgd2FzIGV4cGxpY2l0bHkgZGVzaWduZWQgdG8gYmUgbXVjaCBtb3JlIGVmZmljaWVudCBhbmQgcm9idXN0Cit0aGFuIHR5cGljYWwgd2ViIHRlY2hub2xvZ2llcywgYXMgd2Ugd2VyZSBkZXNpZ25pbmcgb3VyIFhNTC1iYXNlZCBSRVNUIHdlYgorc2VydmljZXMgQVBJIHdlIG5vdGljZWQgdGhhdCBUaHJpZnQgY291bGQgYmUgZWFzaWx5IHVzZWQgdG8gZGVmaW5lIG91cgorc2VydmljZSBpbnRlcmZhY2UuIFRob3VnaCB3ZSBkbyBub3QgY3VycmVudGx5IGVtcGxveSBTT0FQIGVudmVsb3BlcyAoaW4gdGhlCithdXRob3JzJyBvcGluaW9ucyB0aGVyZSBpcyBhbHJlYWR5IGZhciB0b28gbXVjaCByZXBldGl0aXZlIGVudGVycHJpc2UgSmF2YQorc29mdHdhcmUgdG8gZG8gdGhhdCBzb3J0IG9mIHRoaW5nKSwgd2Ugd2VyZSBhYmxlIHRvIHF1aWNrbHkgZXh0ZW5kIFRocmlmdCB0bworZ2VuZXJhdGUgWE1MIFNjaGVtYSBEZWZpbml0aW9uIGZpbGVzIGZvciBvdXIgc2VydmljZSwgYXMgd2VsbCBhcyBhIGZyYW1ld29yaworZm9yIHZlcnNpb25pbmcgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBvdXIgd2ViIHNlcnZpY2UuIFRob3VnaCBwdWJsaWMKK3dlYiBzZXJ2aWNlcyBhcmUgYWRtaXR0ZWRseSB0YW5nZW50aWFsIHRvIFRocmlmdCdzIGNvcmUgdXNlIGNhc2UgYW5kIGRlc2lnbiwKK1RocmlmdCBmYWNpbGl0YXRlZCByYXBpZCBpdGVyYXRpb24gYW5kIGFmZm9yZHMgdXMgdGhlIGFiaWxpdHkgdG8gcXVpY2tseQorbWlncmF0ZSBvdXIgZW50aXJlIFhNTC1iYXNlZCB3ZWIgc2VydmljZSBvbnRvIGEgaGlnaGVyIHBlcmZvcm1hbmNlIHN5c3RlbQorc2hvdWxkIHRoZSBuZWVkIGFyaXNlLgorCitcc3Vic2VjdGlvbntHZW5lcmF0ZWQgU3RydWN0c30KK1dlIG1hZGUgYSBjb25zY2lvdXMgZGVjaXNpb24gdG8gbWFrZSBvdXIgZ2VuZXJhdGVkIHN0cnVjdHMgYXMgdHJhbnNwYXJlbnQgYXMKK3Bvc3NpYmxlLiBBbGwgZmllbGRzIGFyZSBwdWJsaWNseSBhY2Nlc3NpYmxlOyB0aGVyZSBhcmUgbm8gXHRleHR0dHtzZXQoKX0gYW5kCitcdGV4dHR0e2dldCgpfSBtZXRob2RzLiBTaW1pbGFybHksIHVzZSBvZiB0aGUgXHRleHR0dHtpc3NldH0gb2JqZWN0IGlzIG5vdAorZW5mb3JjZWQuIFdlIGRvIG5vdCBpbmNsdWRlIGFueSBcdGV4dHR0e0ZpZWxkTm90U2V0RXhjZXB0aW9ufSBjb25zdHJ1Y3QuCitEZXZlbG9wZXJzIGhhdmUgdGhlIG9wdGlvbiB0byB1c2UgdGhlc2UgZmllbGRzIHRvIHdyaXRlIG1vcmUgcm9idXN0IGNvZGUsIGJ1dAordGhlIHN5c3RlbSBpcyByb2J1c3QgdG8gdGhlIGRldmVsb3BlciBpZ25vcmluZyB0aGUgXHRleHR0dHtpc3NldH0gY29uc3RydWN0CitlbnRpcmVseSBhbmQgd2lsbCBwcm92aWRlIHN1aXRhYmxlIGRlZmF1bHQgYmVoYXZpb3IgaW4gYWxsIGNhc2VzLgorCitUaGlzIGNob2ljZSB3YXMgbW90aXZhdGVkIGJ5IHRoZSBkZXNpcmUgdG8gZWFzZSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudC4gT3VyIHN0YXRlZAorZ29hbCBpcyBub3QgdG8gbWFrZSBkZXZlbG9wZXJzIGxlYXJuIGEgcmljaCBuZXcgbGlicmFyeSBpbiB0aGVpciBsYW5ndWFnZSBvZgorY2hvaWNlLCBidXQgcmF0aGVyIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgY29uc3RydWN0cwordGhhdCBhcmUgbW9zdCBmYW1pbGlhciBpbiBlYWNoIGxhbmd1YWdlLgorCitXZSBhbHNvIG1hZGUgdGhlIFx0ZXh0dHR7cmVhZCgpfSBhbmQgXHRleHR0dHt3cml0ZSgpfSBtZXRob2RzIG9mIHRoZSBnZW5lcmF0ZWQKK29iamVjdHMgcHVibGljIHNvIHRoYXQgdGhlIG9iamVjdHMgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dAorb2YgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRocmlmdCBpcyBhIHVzZWZ1bCB0b29sIHNpbXBseSBmb3IgZ2VuZXJhdGluZworb2JqZWN0cyB0aGF0IGFyZSBlYXNpbHkgc2VyaWFsaXphYmxlIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCisKK1xzdWJzZWN0aW9ue1JQQyBNZXRob2QgSWRlbnRpZmljYXRpb259CitNZXRob2QgY2FsbHMgaW4gUlBDIGFyZSBpbXBsZW1lbnRlZCBieSBzZW5kaW5nIHRoZSBtZXRob2QgbmFtZSBhcyBhIHN0cmluZy4gT25lCitpc3N1ZSB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBsb25nZXIgbWV0aG9kIG5hbWVzIHJlcXVpcmUgbW9yZSBiYW5kd2lkdGguCitXZSBleHBlcmltZW50ZWQgd2l0aCB1c2luZyBmaXhlZC1zaXplIGhhc2hlcyB0byBpZGVudGlmeSBtZXRob2RzLCBidXQgaW4gdGhlCitlbmQgY29uY2x1ZGVkIHRoYXQgdGhlIHNhdmluZ3Mgd2VyZSBub3Qgd29ydGggdGhlIGhlYWRhY2hlcyBpbmN1cnJlZC4gUmVsaWFibHkKK2RlYWxpbmcgd2l0aCBjb25mbGljdHMgYWNyb3NzIHZlcnNpb25zIG9mIGFuIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGUgaXMKK2ltcG9zc2libGUgd2l0aG91dCBhIG1ldGEtc3RvcmFnZSBzeXN0ZW0gKGkuZS4gdG8gZ2VuZXJhdGUgbm9uLWNvbmZsaWN0aW5nCitoYXNoZXMgZm9yIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgYSBmaWxlLCB3ZSB3b3VsZCBoYXZlIHRvIGtub3cgYWJvdXQgYWxsCitjb25mbGljdHMgdGhhdCBldmVyIGV4aXN0ZWQgaW4gYW55IHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGZpbGUpLgorCitXZSB3YW50ZWQgdG8gYXZvaWQgdG9vIG1hbnkgdW5uZWNlc3Nhcnkgc3RyaW5nIGNvbXBhcmlzb25zIHVwb24KK21ldGhvZCBpbnZvY2F0aW9uLiBUbyBkZWFsIHdpdGggdGhpcywgd2UgZ2VuZXJhdGUgbWFwcyBmcm9tIHN0cmluZ3MgdG8gZnVuY3Rpb24KK3BvaW50ZXJzLCBzbyB0aGF0IGludm9jYXRpb24gaXMgZWZmZWN0aXZlbHkgYWNjb21wbGlzaGVkIHZpYSBhIGNvbnN0YW50LXRpbWUKK2hhc2ggbG9va3VwIGluIHRoZSBjb21tb24gY2FzZS4gVGhpcyByZXF1aXJlcyB0aGUgdXNlIG9mIGEgY291cGxlIGludGVyZXN0aW5nCitjb2RlIGNvbnN0cnVjdHMuIEJlY2F1c2UgSmF2YSBkb2VzIG5vdCBoYXZlIGZ1bmN0aW9uIHBvaW50ZXJzLCBwcm9jZXNzCitmdW5jdGlvbnMgYXJlIGFsbCBwcml2YXRlIG1lbWJlciBjbGFzc2VzIGltcGxlbWVudGluZyBhIGNvbW1vbiBpbnRlcmZhY2UuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK3ByaXZhdGUgY2xhc3MgcGluZyBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7CisgIHB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3Byb3QpCisgICAgdGhyb3dzIFRFeGNlcHRpb24KKyAgeyAuLi59Cit9CisKK0hhc2hNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPQorICBuZXcgSGFzaE1hcDxTdHJpbmcsUHJvY2Vzc0Z1bmN0aW9uPigpOworXGVuZHt2ZXJiYXRpbX0KKworSW4gQysrLCB3ZSB1c2UgYSByZWxhdGl2ZWx5IGVzb3RlcmljIGxhbmd1YWdlIGNvbnN0cnVjdDogbWVtYmVyIGZ1bmN0aW9uCitwb2ludGVycy4KKworXGJlZ2lue3ZlcmJhdGltfQorc3RkOjptYXA8c3RkOjpzdHJpbmcsCisgIHZvaWQgKEV4YW1wbGVTZXJ2aWNlUHJvY2Vzc29yOjoqKShpbnQzMl90LAorICBmYWNlYm9vazo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwKKyAgZmFjZWJvb2s6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCopPgorIHByb2Nlc3NNYXBfOworXGVuZHt2ZXJiYXRpbX0KKworVXNpbmcgdGhlc2UgdGVjaG5pcXVlcywgdGhlIGNvc3Qgb2Ygc3RyaW5nIHByb2Nlc3NpbmcgaXMgbWluaW1pemVkLCBhbmQgd2UKK3JlYXAgdGhlIGJlbmVmaXQgb2YgYmVpbmcgYWJsZSB0byBlYXNpbHkgZGVidWcgY29ycnVwdCBvciBtaXN1bmRlcnN0b29kIGRhdGEgYnkKK2luc3BlY3RpbmcgaXQgZm9yIGtub3duIHN0cmluZyBtZXRob2QgbmFtZXMuCisKK1xzdWJzZWN0aW9ue1NlcnZlcnMgYW5kIE11bHRpdGhyZWFkaW5nfQorVGhyaWZ0IHNlcnZpY2VzIHJlcXVpcmUgYmFzaWMgbXVsdGl0aHJlYWRpbmcgdG8gaGFuZGxlIHNpbXVsdGFuZW91cworcmVxdWVzdHMgZnJvbSBtdWx0aXBsZSBjbGllbnRzLiBGb3IgdGhlIFB5dGhvbiBhbmQgSmF2YSBpbXBsZW1lbnRhdGlvbnMgb2YKK1RocmlmdCBzZXJ2ZXIgbG9naWMsIHRoZSBzdGFuZGFyZCB0aHJlYWRpbmcgbGlicmFyaWVzIGRpc3RyaWJ1dGVkIHdpdGggdGhlCitsYW5ndWFnZXMgcHJvdmlkZSBhZGVxdWF0ZSBzdXBwb3J0LiBGb3IgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgbm8gc3RhbmRhcmQgbXVsdGl0aHJlYWQgcnVudGltZQorbGlicmFyeSBleGlzdHMuIFNwZWNpZmljYWxseSwgcm9idXN0LCBsaWdodHdlaWdodCwgYW5kIHBvcnRhYmxlCit0aHJlYWQgbWFuYWdlciBhbmQgdGltZXIgY2xhc3MgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBleGlzdC4gV2UgaW52ZXN0aWdhdGVkCitleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMsIG5hbWVseSBcdGV4dHR0e2Jvb3N0Ojp0aHJlYWR9LAorXHRleHR0dHtib29zdDo6dGhyZWFkcG9vbH0sIFx0ZXh0dHR7QUNFXF9UaHJlYWRcX01hbmFnZXJ9IGFuZAorXHRleHR0dHtBQ0VcX1RpbWVyfS4KKworV2hpbGUgXHRleHR0dHtib29zdDo6dGhyZWFkc31cY2l0ZXtib29zdC50aHJlYWRzfSAgcHJvdmlkZXMgY2xlYW4sCitsaWdodHdlaWdodCBhbmQgcm9idXN0IGltcGxlbWVudGF0aW9ucyBvZiBtdWx0aS10aHJlYWQgcHJpbWl0aXZlcyAobXV0ZXhlcywKK2NvbmRpdGlvbnMsIHRocmVhZHMpIGl0IGRvZXMgbm90IHByb3ZpZGUgYSB0aHJlYWQgbWFuYWdlciBvciB0aW1lcgoraW1wbGVtZW50YXRpb24uCisKK1x0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9XGNpdGV7Ym9vc3QudGhyZWFkcG9vbH0gYWxzbyBsb29rZWQgcHJvbWlzaW5nIGJ1dAord2FzIG5vdCBmYXIgZW5vdWdoIGFsb25nIGZvciBvdXIgcHVycG9zZXMuIFdlIHdhbnRlZCB0byBsaW1pdCB0aGUgZGVwZW5kZW5jeSBvbgordGhpcmQtcGFydHkgbGlicmFyaWVzIGFzIG11Y2ggYXMgcG9zc2libGUuIEJlY2F1c2VcXAorXHRleHR0dHtib29zdDo6dGhyZWFkcG9vbH0gaXMKK25vdCBhIHB1cmUgdGVtcGxhdGUgbGlicmFyeSBhbmQgcmVxdWlyZXMgcnVudGltZSBsaWJyYXJpZXMgYW5kIGJlY2F1c2UgaXQgaXMKK25vdCB5ZXQgcGFydCBvZiB0aGUgb2ZmaWNpYWwgQm9vc3QgZGlzdHJpYnV0aW9uIHdlIGZlbHQgaXQgd2FzIG5vdCByZWFkeSBmb3IKK3VzZSBpbiBUaHJpZnQuIEFzIFx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9IGV2b2x2ZXMgYW5kIGVzcGVjaWFsbHkgaWYgaXQgaXMKK2FkZGVkIHRvIHRoZSBCb29zdCBkaXN0cmlidXRpb24gd2UgbWF5IHJlY29uc2lkZXIgb3VyIGRlY2lzaW9uIHRvIG5vdCB1c2UgaXQuCisKK0FDRSBoYXMgYm90aCBhIHRocmVhZCBtYW5hZ2VyIGFuZCB0aW1lciBjbGFzcyBpbiBhZGRpdGlvbiB0byBtdWx0aS10aHJlYWQKK3ByaW1pdGl2ZXMuIFRoZSBiaWdnZXN0IHByb2JsZW0gd2l0aCBBQ0UgaXMgdGhhdCBpdCBpcyBBQ0UuIFVubGlrZSBCb29zdCwgQUNFCitBUEkgcXVhbGl0eSBpcyBwb29yLiBFdmVyeXRoaW5nIGluIEFDRSBoYXMgbGFyZ2UgbnVtYmVycyBvZiBkZXBlbmRlbmNpZXMgb24KK2V2ZXJ5dGhpbmcgZWxzZSBpbiBBQ0UgLSB0aHVzIGZvcmNpbmcgZGV2ZWxvcGVycyB0byB0aHJvdyBvdXQgc3RhbmRhcmQKK2NsYXNzZXMsIHN1Y2ggYXMgU1RMIGNvbGxlY3Rpb25zLCBpbiBmYXZvciBvZiBBQ0UncyBob21lYnJld2VkIGltcGxlbWVudGF0aW9ucy4gSW4KK2FkZGl0aW9uLCB1bmxpa2UgQm9vc3QsIEFDRSBpbXBsZW1lbnRhdGlvbnMgZGVtb25zdHJhdGUgbGl0dGxlIHVuZGVyc3RhbmRpbmcKK29mIHRoZSBwb3dlciBhbmQgcGl0ZmFsbHMgb2YgQysrIHByb2dyYW1taW5nIGFuZCB0YWtlIG5vIGFkdmFudGFnZSBvZiBtb2Rlcm4KK3RlbXBsYXRpbmcgdGVjaG5pcXVlcyB0byBlbnN1cmUgY29tcGlsZSB0aW1lIHNhZmV0eSBhbmQgcmVhc29uYWJsZSBjb21waWxlcgorZXJyb3IgbWVzc2FnZXMuIEZvciBhbGwgdGhlc2UgcmVhc29ucywgQUNFIHdhcyByZWplY3RlZC4gSW5zdGVhZCwgd2UgY2hvc2UKK3RvIGltcGxlbWVudCBvdXIgb3duIGxpYnJhcnksIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorCitcc3Vic2VjdGlvbntUaHJlYWQgUHJpbWl0aXZlc30KKworVGhlIFRocmlmdCB0aHJlYWQgbGlicmFyaWVzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgbmFtZXNwYWNlXFwKK1x0ZXh0dHR7ZmFjZWJvb2s6OnRocmlmdDo6Y29uY3VycmVuY3l9IGFuZCBoYXZlIHRocmVlIGNvbXBvbmVudHM6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIHByaW1pdGl2ZXMKK1xpdGVtIHRocmVhZCBwb29sIG1hbmFnZXIKK1xpdGVtIHRpbWVyIG1hbmFnZXIKK1xlbmR7aXRlbWl6ZX0KKworQXMgbWVudGlvbmVkIGFib3ZlLCB3ZSB3ZXJlIGhlc2l0YW50IHRvIGludHJvZHVjZSBhbnkgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKK29uIFRocmlmdC4gV2UgZGVjaWRlZCB0byB1c2UgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGJlY2F1c2UgaXQgaXMgc28KK3VzZWZ1bCBmb3IgbXVsdGl0aHJlYWRlZCBhcHBsaWNhdGlvbiwgaXQgcmVxdWlyZXMgbm8gbGluay10aW1lIG9yCitydW50aW1lIGxpYnJhcmllcyAoaS5lLiBpdCBpcyBhIHB1cmUgdGVtcGxhdGUgbGlicmFyeSkgYW5kIGl0IGlzIGR1ZQordG8gYmVjb21lIHBhcnQgb2YgdGhlIEMrKzB4IHN0YW5kYXJkLgorCitXZSBpbXBsZW1lbnQgc3RhbmRhcmQgXHRleHR0dHtNdXRleH0gYW5kIFx0ZXh0dHR7Q29uZGl0aW9ufSBjbGFzc2VzLCBhbmQgYQorIFx0ZXh0dHR7TW9uaXRvcn0gY2xhc3MuIFRoZSBsYXR0ZXIgaXMgc2ltcGx5IGEgY29tYmluYXRpb24gb2YgYSBtdXRleCBhbmQKK2NvbmRpdGlvbiB2YXJpYWJsZSBhbmQgaXMgYW5hbG9nb3VzIHRvIHRoZSBcdGV4dHR0e01vbml0b3J9IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGZvcgordGhlIEphdmEgXHRleHR0dHtPYmplY3R9IGNsYXNzLiBUaGlzIGlzIGFsc28gc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGEgYmFycmllci4gV2UKK3Byb3ZpZGUgYSBcdGV4dHR0e1N5bmNocm9uaXplZH0gZ3VhcmQgY2xhc3MgdG8gYWxsb3cgSmF2YS1saWtlIHN5bmNocm9uaXplZCBibG9ja3MuCitUaGlzIGlzIGp1c3QgYSBiaXQgb2Ygc3ludGFjdGljIHN1Z2FyLCBidXQsIGxpa2UgaXRzIEphdmEgY291bnRlcnBhcnQsIGNsZWFybHkKK2RlbGltaXRzIGNyaXRpY2FsIHNlY3Rpb25zIG9mIGNvZGUuIFVubGlrZSBpdHMgSmF2YSBjb3VudGVycGFydCwgd2Ugc3RpbGwKK2hhdmUgdGhlIGFiaWxpdHkgdG8gcHJvZ3JhbW1hdGljYWxseSBsb2NrLCB1bmxvY2ssIGJsb2NrLCBhbmQgc2lnbmFsIG1vbml0b3JzLgorCitcYmVnaW57dmVyYmF0aW19Cit2b2lkIHJ1bigpIHsKKyB7U3luY2hyb25pemVkIHMobWFuYWdlci0+bW9uaXRvcik7CisgIGlmIChtYW5hZ2VyLT5zdGF0ZSA9PSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKSB7CisgICAgbWFuYWdlci0+c3RhdGUgPSBUaW1lck1hbmFnZXI6OlNUQVJURUQ7CisgICAgbWFuYWdlci0+bW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgfQorIH0KK30KK1xlbmR7dmVyYmF0aW19CisKK1dlIGFnYWluIGJvcnJvd2VkIGZyb20gSmF2YSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhIHRocmVhZCBhbmQgYSBydW5uYWJsZQorY2xhc3MuIEEgXHRleHR0dHtUaHJlYWR9IGlzIHRoZSBhY3R1YWwgc2NoZWR1bGFibGUgb2JqZWN0LiBUaGUKK1x0ZXh0dHR7UnVubmFibGV9IGlzIHRoZSBsb2dpYyB0byBleGVjdXRlIHdpdGhpbiB0aGUgdGhyZWFkLgorVGhlIFx0ZXh0dHR7VGhyZWFkfSBpbXBsZW1lbnRhdGlvbiBkZWFscyB3aXRoIGFsbCB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgdGhyZWFkCitjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gaXNzdWVzLCB3aGlsZSB0aGUgXHRleHR0dHtSdW5uYWJsZX0gaW1wbGVtZW50YXRpb24gZGVhbHMKK3dpdGggdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHBlci10aHJlYWQgbG9naWMuIFRoZSBiZW5lZml0IG9mIHRoaXMgYXBwcm9hY2gKK2lzIHRoYXQgZGV2ZWxvcGVycyBjYW4gZWFzaWx5IHN1YmNsYXNzIHRoZSBSdW5uYWJsZSBjbGFzcyB3aXRob3V0IHB1bGxpbmcgaW4KK3BsYXRmb3JtLXNwZWNpZmljIHN1cGVyLWNsYXNzZXMuCisKK1xzdWJzZWN0aW9ue1RocmVhZCwgUnVubmFibGUsIGFuZCBzaGFyZWRcX3B0cn0KK1dlIHVzZSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gdGhyb3VnaG91dCB0aGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBhbmQKK1x0ZXh0dHR7VGltZXJNYW5hZ2VyfSBpbXBsZW1lbnRhdGlvbnMgdG8gZ3VhcmFudGVlIGNsZWFudXAgb2YgZGVhZCBvYmplY3RzIHRoYXQgY2FuCitiZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLiBGb3IgXHRleHR0dHtUaHJlYWR9IGNsYXNzIGltcGxlbWVudGF0aW9ucywKK1x0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB1c2FnZSByZXF1aXJlcyBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byBtYWtlIHN1cmUKK1x0ZXh0dHR7VGhyZWFkfSBvYmplY3RzIGFyZSBuZWl0aGVyIGxlYWtlZCBub3IgZGVyZWZlcmVuY2VkIHByZW1hdHVyZWx5IHdoaWxlCitjcmVhdGluZyBhbmQgc2h1dHRpbmcgZG93biB0aHJlYWRzLgorCitUaHJlYWQgY3JlYXRpb24gcmVxdWlyZXMgY2FsbGluZyBpbnRvIGEgQyBsaWJyYXJ5LiAoSW4gb3VyIGNhc2UgdGhlIFBPU0lYCit0aHJlYWQgbGlicmFyeSwgXHRleHR0dHtsaWJwdGhyZWFkfSwgYnV0IHRoZSBzYW1lIHdvdWxkIGJlIHRydWUgZm9yIFdJTjMyIHRocmVhZHMpLgorVHlwaWNhbGx5LCB0aGUgT1MgbWFrZXMgZmV3LCBpZiBhbnksIGd1YXJhbnRlZXMgYWJvdXQgd2hlbiBcdGV4dHR0e1RocmVhZE1haW59LCBhIEMgdGhyZWFkJ3MgZW50cnktcG9pbnQgZnVuY3Rpb24sIHdpbGwgYmUgY2FsbGVkLiBUaGVyZWZvcmUsIGl0IGlzCitwb3NzaWJsZSB0aGF0IG91ciB0aHJlYWQgY3JlYXRlIGNhbGwsCitcdGV4dHR0e1RocmVhZEZhY3Rvcnk6Om5ld1RocmVhZCgpfSBjb3VsZCByZXR1cm4gdG8gdGhlIGNhbGxlcgord2VsbCBiZWZvcmUgdGhhdCB0aW1lLiBUbyBlbnN1cmUgdGhhdCB0aGUgcmV0dXJuZWQgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBpcyBub3QKK3ByZW1hdHVyZWx5IGNsZWFuZWQgdXAgaWYgdGhlIGNhbGxlciBnaXZlcyB1cCBpdHMgcmVmZXJlbmNlIHByaW9yIHRvIHRoZQorXHRleHR0dHtUaHJlYWRNYWlufSBjYWxsLCB0aGUgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBtYWtlcyBhIHdlYWsgcmVmZXJlbmNlIHRvCitpdHNlbGYgaW4gaXRzIFx0ZXh0dHR7c3RhcnR9IG1ldGhvZC4KKworV2l0aCB0aGUgd2VhayByZWZlcmVuY2UgaW4gaGFuZCB0aGUgXHRleHR0dHtUaHJlYWRNYWlufSBmdW5jdGlvbiBjYW4gYXR0ZW1wdCB0byBnZXQKK2Egc3Ryb25nIHJlZmVyZW5jZSBiZWZvcmUgZW50ZXJpbmcgdGhlIFx0ZXh0dHR7UnVubmFibGU6OnJ1bn0gbWV0aG9kIG9mIHRoZQorXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0IGJvdW5kIHRvIHRoZSBcdGV4dHR0e1RocmVhZH0uIElmIG5vIHN0cm9uZyByZWZlcmVuY2VzIHRvIHRoZQordGhyZWFkIGFyZSBvYnRhaW5lZCBiZXR3ZWVuIGV4aXRpbmcgXHRleHR0dHtUaHJlYWQ6OnN0YXJ0fSBhbmQgZW50ZXJpbmcgXHRleHR0dHtUaHJlYWRNYWlufSwgdGhlIHdlYWsgcmVmZXJlbmNlIHJldHVybnMgXHRleHR0dHtudWxsfSBhbmQgdGhlIGZ1bmN0aW9uCitleGl0cyBpbW1lZGlhdGVseS4KKworVGhlIG5lZWQgZm9yIHRoZSBcdGV4dHR0e1RocmVhZH0gdG8gbWFrZSBhIHdlYWsgcmVmZXJlbmNlIHRvIGl0c2VsZiBoYXMgYQorc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBBUEkuIFNpbmNlIHJlZmVyZW5jZXMgYXJlIG1hbmFnZWQgdGhyb3VnaCB0aGUKK1x0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB0ZW1wbGF0ZXMsIHRoZSBcdGV4dHR0e1RocmVhZH0gb2JqZWN0IG11c3QgaGF2ZSBhIHJlZmVyZW5jZQordG8gaXRzZWxmIHdyYXBwZWQgYnkgdGhlIHNhbWUgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGVudmVsb3BlIHRoYXQgaXMgcmV0dXJuZWQKK3RvIHRoZSBjYWxsZXIuIFRoaXMgbmVjZXNzaXRhdGVkIHRoZSB1c2Ugb2YgdGhlIGZhY3RvcnkgcGF0dGVybi4KK1x0ZXh0dHR7VGhyZWFkRmFjdG9yeX0gY3JlYXRlcyB0aGUgcmF3IFx0ZXh0dHR7VGhyZWFkfSBvYmplY3QgYW5kIGEKK1x0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB3cmFwcGVyLCBhbmQgY2FsbHMgYSBwcml2YXRlIGhlbHBlciBtZXRob2Qgb2YgdGhlIGNsYXNzCitpbXBsZW1lbnRpbmcgdGhlIFx0ZXh0dHR7VGhyZWFkfSBpbnRlcmZhY2UgKGluIHRoaXMgY2FzZSwgXHRleHR0dHtQb3NpeFRocmVhZDo6d2Vha1JlZn0pCisgdG8gYWxsb3cgaXQgdG8gbWFrZSBhZGQgd2VhayByZWZlcmVuY2UgdG8gaXRzZWxmIHRocm91Z2ggdGhlCisgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGVudmVsb3BlLgorCitcdGV4dHR0e1RocmVhZH0gYW5kIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdHMgcmVmZXJlbmNlIGVhY2ggb3RoZXIuIEEgXHRleHR0dHtSdW5uYWJsZX0KK29iamVjdCBtYXkgbmVlZCB0byBrbm93IGFib3V0IHRoZSB0aHJlYWQgaW4gd2hpY2ggaXQgaXMgZXhlY3V0aW5nLCBhbmQgYSBUaHJlYWQsIG9idmlvdXNseSwKK25lZWRzIHRvIGtub3cgd2hhdCBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgaXQgaXMgaG9zdGluZy4gVGhpcyBpbnRlcmRlcGVuZGVuY3kgaXMKK2Z1cnRoZXIgY29tcGxpY2F0ZWQgYmVjYXVzZSB0aGUgbGlmZWN5Y2xlIG9mIGVhY2ggb2JqZWN0IGlzIGluZGVwZW5kZW50IG9mIHRoZQorb3RoZXIuIEFuIGFwcGxpY2F0aW9uIG1heSBjcmVhdGUgYSBzZXQgb2YgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0IHRvIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQgdGhyZWFkcywgb3IgaXQgbWF5IGNyZWF0ZSBhbmQgZm9yZ2V0IGEgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0CitvbmNlIGEgdGhyZWFkIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIHN0YXJ0ZWQgZm9yIGl0LgorCitUaGUgXHRleHR0dHtUaHJlYWR9IGNsYXNzIHRha2VzIGEgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IHJlZmVyZW5jZSB0byB0aGUgaG9zdGVkCitcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgaW4gaXRzIGNvbnN0cnVjdG9yLCB3aGlsZSB0aGUgXHRleHR0dHtSdW5uYWJsZX0gY2xhc3MgaGFzIGFuCitleHBsaWNpdCBcdGV4dHR0e3RocmVhZH0gbWV0aG9kIHRvIGFsbG93IGV4cGxpY2l0IGJpbmRpbmcgb2YgdGhlIGhvc3RlZCB0aHJlYWQuCitcdGV4dHR0e1RocmVhZEZhY3Rvcnk6Om5ld1RocmVhZH0gYmluZHMgdGhlIG9iamVjdHMgdG8gZWFjaCBvdGhlci4KKworXHN1YnNlY3Rpb257VGhyZWFkTWFuYWdlcn0KKworXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBjcmVhdGVzIGEgcG9vbCBvZiB3b3JrZXIgdGhyZWFkcyBhbmQKK2FsbG93cyBhcHBsaWNhdGlvbnMgdG8gc2NoZWR1bGUgdGFza3MgZm9yIGV4ZWN1dGlvbiBhcyBmcmVlIHdvcmtlciB0aHJlYWRzCitiZWNvbWUgYXZhaWxhYmxlLiBUaGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBkb2VzIG5vdCBpbXBsZW1lbnQgZHluYW1pYwordGhyZWFkIHBvb2wgcmVzaXppbmcsIGJ1dCBwcm92aWRlcyBwcmltaXRpdmVzIHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBhZGQKK2FuZCByZW1vdmUgdGhyZWFkcyBiYXNlZCBvbiBsb2FkLiBUaGlzIGFwcHJvYWNoIHdhcyBjaG9zZW4gYmVjYXVzZQoraW1wbGVtZW50aW5nIGxvYWQgbWV0cmljcyBhbmQgdGhyZWFkIHBvb2wgc2l6ZSBpcyB2ZXJ5IGFwcGxpY2F0aW9uCitzcGVjaWZpYy4gRm9yIGV4YW1wbGUgc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdhbnQgdG8gYWRqdXN0IHBvb2wgc2l6ZSBiYXNlZAorb24gcnVubmluZy1hdmVyYWdlIG9mIHdvcmsgYXJyaXZhbCByYXRlcyB0aGF0IGFyZSBtZWFzdXJlZCB2aWEgcG9sbGVkCitzYW1wbGVzLiBPdGhlcnMgbWF5IHNpbXBseSB3aXNoIHRvIHJlYWN0IGltbWVkaWF0ZWx5IHRvIHdvcmstcXVldWUKK2RlcHRoIGhpZ2ggYW5kIGxvdyB3YXRlciBtYXJrcy4gUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGNyZWF0ZSBhIGNvbXBsZXgKK0FQSSBhYnN0cmFjdCBlbm91Z2ggdG8gY2FwdHVyZSB0aGVzZSBkaWZmZXJlbnQgYXBwcm9hY2hlcywgd2UKK3NpbXBseSBsZWF2ZSBpdCB1cCB0byB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBhbmQgcHJvdmlkZSB0aGUKK3ByaW1pdGl2ZXMgdG8gZW5hY3QgdGhlIGRlc2lyZWQgcG9saWN5IGFuZCBzYW1wbGUgY3VycmVudCBzdGF0dXMuCisKK1xzdWJzZWN0aW9ue1RpbWVyTWFuYWdlcn0KKworXHRleHR0dHtUaW1lck1hbmFnZXJ9IGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gc2NoZWR1bGUKKyBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3RzIGZvciBleGVjdXRpb24gYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLiBJdHMgc3BlY2lmaWMgdGFzaworaXMgdG8gYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBzYW1wbGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBsb2FkIGF0IHJlZ3VsYXIKK2ludGVydmFscyBhbmQgbWFrZSBjaGFuZ2VzIHRvIHRoZSB0aHJlYWQgcG9vbCBzaXplIGJhc2VkIG9uIGFwcGxpY2F0aW9uIHBvbGljeS4KK09mIGNvdXJzZSwgaXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYW55IG51bWJlciBvZiB0aW1lciBvciBhbGFybSBldmVudHMuCisKK1RoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFx0ZXh0dHR7VGltZXJNYW5hZ2VyfSB1c2VzIGEgc2luZ2xlIHRocmVhZCB0bworZXhlY3V0ZSBleHBpcmVkIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdHMuIFRodXMsIGlmIGEgdGltZXIgb3BlcmF0aW9uIG5lZWRzIHRvCitkbyBhIGxhcmdlIGFtb3VudCBvZiB3b3JrIGFuZCBlc3BlY2lhbGx5IGlmIGl0IG5lZWRzIHRvIGRvIGJsb2NraW5nIEkvTywKK3RoYXQgc2hvdWxkIGJlIGRvbmUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisKK1xzdWJzZWN0aW9ue05vbmJsb2NraW5nIE9wZXJhdGlvbn0KK1Rob3VnaCB0aGUgVGhyaWZ0IHRyYW5zcG9ydCBpbnRlcmZhY2VzIG1hcCBtb3JlIGRpcmVjdGx5IHRvIGEgYmxvY2tpbmcgSS9PCittb2RlbCwgd2UgaGF2ZSBpbXBsZW1lbnRlZCBhIGhpZ2ggcGVyZm9ybWFuY2UgXHRleHR0dHtUTm9uQmxvY2tpbmdTZXJ2ZXJ9CitpbiBDKysgYmFzZWQgb24gXHRleHR0dHtsaWJldmVudH0gYW5kIHRoZSBcdGV4dHR0e1RGcmFtZWRUcmFuc3BvcnR9LiBXZQoraW1wbGVtZW50ZWQgdGhpcyBieSBtb3ZpbmcgYWxsIEkvTyBpbnRvIG9uZSB0aWdodCBldmVudCBsb29wIHVzaW5nIGEKK3N0YXRlIG1hY2hpbmUuIEVzc2VudGlhbGx5LCB0aGUgZXZlbnQgbG9vcCByZWFkcyBmcmFtZWQgcmVxdWVzdHMgaW50bworXHRleHR0dHtUTWVtb3J5QnVmZmVyfSBvYmplY3RzLiBPbmNlIGVudGlyZSByZXF1ZXN0cyBhcmUgcmVhZHksIHRoZXkgYXJlCitkaXNwYXRjaGVkIHRvIHRoZSBcdGV4dHR0e1RQcm9jZXNzb3J9IG9iamVjdCB3aGljaCBjYW4gcmVhZCBkaXJlY3RseSBmcm9tCit0aGUgZGF0YSBpbiBtZW1vcnkuCisKK1xzdWJzZWN0aW9ue0NvbXBpbGVyfQorVGhlIFRocmlmdCBjb21waWxlciBpcyBpbXBsZW1lbnRlZCBpbiBDKysgdXNpbmcgc3RhbmRhcmQgXHRleHR0dHtsZXh9L1x0ZXh0dHR7eWFjY30KK2xleGluZyBhbmQgcGFyc2luZy4gVGhvdWdoIGl0IGNvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCB3aXRoIGZld2VyCitsaW5lcyBvZiBjb2RlIGluIGFub3RoZXIgbGFuZ3VhZ2UgKGkuZS4gUHl0aG9uIExleC1ZYWNjIChQTFkpIG9yIFx0ZXh0dHR7b2NhbWx5YWNjfSksIHVzaW5nIEMrKworZm9yY2VzIGV4cGxpY2l0IGRlZmluaXRpb24gb2YgdGhlIGxhbmd1YWdlIGNvbnN0cnVjdHMuIFN0cm9uZ2x5IHR5cGluZyB0aGUKK3BhcnNlIHRyZWUgZWxlbWVudHMgKGRlYmF0YWJseSkgbWFrZXMgdGhlIGNvZGUgbW9yZSBhcHByb2FjaGFibGUgZm9yIG5ldworZGV2ZWxvcGVycy4KKworQ29kZSBnZW5lcmF0aW9uIGlzIGRvbmUgdXNpbmcgdHdvIHBhc3Nlcy4gVGhlIGZpcnN0IHBhc3MgbG9va3Mgb25seSBmb3IKK2luY2x1ZGUgZmlsZXMgYW5kIHR5cGUgZGVmaW5pdGlvbnMuIFR5cGUgZGVmaW5pdGlvbnMgYXJlIG5vdCBjaGVja2VkIGR1cmluZwordGhpcyBwaGFzZSwgc2luY2UgdGhleSBtYXkgZGVwZW5kIHVwb24gaW5jbHVkZSBmaWxlcy4gQWxsIGluY2x1ZGVkIGZpbGVzCithcmUgc2VxdWVudGlhbGx5IHNjYW5uZWQgaW4gYSBmaXJzdCBwYXNzLiBPbmNlIHRoZSBpbmNsdWRlIHRyZWUgaGFzIGJlZW4KK3Jlc29sdmVkLCBhIHNlY29uZCBwYXNzIG92ZXIgYWxsIGZpbGVzIGlzIHRha2VuIHRoYXQgaW5zZXJ0cyB0eXBlIGRlZmluaXRpb25zCitpbnRvIHRoZSBwYXJzZSB0cmVlIGFuZCByYWlzZXMgYW4gZXJyb3Igb24gYW55IHVuZGVmaW5lZCB0eXBlcy4gVGhlIHByb2dyYW0gaXMKK3RoZW4gZ2VuZXJhdGVkIGFnYWluc3QgdGhlIHBhcnNlIHRyZWUuCisKK0R1ZSB0byBpbmhlcmVudCBjb21wbGV4aXRpZXMgYW5kIHBvdGVudGlhbCBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLAord2UgZXhwbGljaXRseSBkaXNhbGxvdyBmb3J3YXJkIGRlY2xhcmF0aW9uLiBUd28gVGhyaWZ0IHN0cnVjdHMgY2Fubm90CitlYWNoIGNvbnRhaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIG90aGVyLiAoU2luY2Ugd2UgZG8gbm90IGFsbG93IFx0ZXh0dHR7bnVsbH0KK3N0cnVjdCBpbnN0YW5jZXMgaW4gdGhlIGdlbmVyYXRlZCBDKysgY29kZSwgdGhpcyB3b3VsZCBhY3R1YWxseSBiZSBpbXBvc3NpYmxlLikKKworXHN1YnNlY3Rpb257VEZpbGVUcmFuc3BvcnR9CitUaGUgXHRleHR0dHtURmlsZVRyYW5zcG9ydH0gbG9ncyBUaHJpZnQgcmVxdWVzdHMvc3RydWN0cyBieQorZnJhbWluZyBpbmNvbWluZyBkYXRhIHdpdGggaXRzIGxlbmd0aCBhbmQgd3JpdGluZyBpdCBvdXQgdG8gZGlzay4KK1VzaW5nIGEgZnJhbWVkIG9uLWRpc2sgZm9ybWF0IGFsbG93cyBmb3IgYmV0dGVyIGVycm9yIGNoZWNraW5nIGFuZAoraGVscHMgd2l0aCB0aGUgcHJvY2Vzc2luZyBvZiBhIGZpbml0ZSBudW1iZXIgb2YgZGlzY3JldGUgZXZlbnRzLiBUaGVcXAorXHRleHR0dHtURmlsZVdyaXRlclRyYW5zcG9ydH0gdXNlcyBhIHN5c3RlbSBvZiBzd2FwcGluZyBpbi1tZW1vcnkgYnVmZmVycwordG8gZW5zdXJlIGdvb2QgcGVyZm9ybWFuY2Ugd2hpbGUgbG9nZ2luZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEuCitBIFRocmlmdCBsb2cgZmlsZSBpcyBzcGxpdCB1cCBpbnRvIGNodW5rcyBvZiBhIHNwZWNpZmllZCBzaXplOyBsb2dnZWQgbWVzc2FnZXMKK2FyZSBub3QgYWxsb3dlZCB0byBjcm9zcyBjaHVuayBib3VuZGFyaWVzLiBBIG1lc3NhZ2UgdGhhdCB3b3VsZCBjcm9zcyBhIGNodW5rCitib3VuZGFyeSB3aWxsIGNhdXNlIHBhZGRpbmcgdG8gYmUgYWRkZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgY2h1bmsgYW5kIHRoZQorZmlyc3QgYnl0ZSBvZiB0aGUgbWVzc2FnZSBhcmUgYWxpZ25lZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGNodW5rLgorUGFydGl0aW9uaW5nIHRoZSBmaWxlIGludG8gY2h1bmtzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlYWQgYW5kIGludGVycHJldCBkYXRhCitmcm9tIGEgcGFydGljdWxhciBwb2ludCBpbiB0aGUgZmlsZS4KKworXHNlY3Rpb257RmFjZWJvb2sgVGhyaWZ0IFNlcnZpY2VzfQorVGhyaWZ0IGhhcyBiZWVuIGVtcGxveWVkIGluIGEgbGFyZ2UgbnVtYmVyIG9mIGFwcGxpY2F0aW9ucyBhdCBGYWNlYm9vaywgaW5jbHVkaW5nCitzZWFyY2gsIGxvZ2dpbmcsIG1vYmlsZSwgYWRzIGFuZCB0aGUgZGV2ZWxvcGVyIHBsYXRmb3JtLiBUd28gc3BlY2lmaWMgdXNhZ2VzIGFyZSBkaXNjdXNzZWQgYmVsb3cuCisKK1xzdWJzZWN0aW9ue1NlYXJjaH0KK1RocmlmdCBpcyB1c2VkIGFzIHRoZSB1bmRlcmx5aW5nIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgbGF5ZXIgZm9yIHRoZSBGYWNlYm9vayBTZWFyY2ggc2VydmljZS4KK1RoZSBtdWx0aS1sYW5ndWFnZSBjb2RlIGdlbmVyYXRpb24gaXMgd2VsbCBzdWl0ZWQgZm9yIHNlYXJjaCBiZWNhdXNlIGl0IGFsbG93cyBmb3IgYXBwbGljYXRpb24KK2RldmVsb3BtZW50IGluIGFuIGVmZmljaWVudCBzZXJ2ZXIgc2lkZSBsYW5ndWFnZSAoQysrKSBhbmQgYWxsb3dzIHRoZSBGYWNlYm9vayBQSFAtYmFzZWQgd2ViIGFwcGxpY2F0aW9uCit0byBtYWtlIGNhbGxzIHRvIHRoZSBzZWFyY2ggc2VydmljZSB1c2luZyBUaHJpZnQgUEhQIGxpYnJhcmllcy4gVGhlcmUgaXMgYWxzbyBhIGxhcmdlCit2YXJpZXR5IG9mIHNlYXJjaCBzdGF0cywgZGVwbG95bWVudCBhbmQgdGVzdGluZyBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgYnVpbHQgb24gdG9wCitvZiBnZW5lcmF0ZWQgUHl0aG9uIGNvZGUuIEFkZGl0aW9uYWxseSwgdGhlIFRocmlmdCBsb2cgZmlsZSBmb3JtYXQgaXMKK3VzZWQgYXMgYSByZWRvIGxvZyBmb3IgcHJvdmlkaW5nIHJlYWwtdGltZSBzZWFyY2ggaW5kZXggdXBkYXRlcy4gVGhyaWZ0IGhhcyBhbGxvd2VkIHRoZQorc2VhcmNoIHRlYW0gdG8gbGV2ZXJhZ2UgZWFjaCBsYW5ndWFnZSBmb3IgaXRzIHN0cmVuZ3RocyBhbmQgdG8gZGV2ZWxvcCBjb2RlIGF0IGEgcmFwaWQgcGFjZS4KKworXHN1YnNlY3Rpb257TG9nZ2luZ30KK1RoZSBUaHJpZnQgXHRleHR0dHtURmlsZVRyYW5zcG9ydH0gZnVuY3Rpb25hbGl0eSBpcyB1c2VkIGZvciBzdHJ1Y3R1cmVkIGxvZ2dpbmcuIEVhY2gKK3NlcnZpY2UgZnVuY3Rpb24gZGVmaW5pdGlvbiBhbG9uZyB3aXRoIGl0cyBwYXJhbWV0ZXJzIGNhbiBiZSBjb25zaWRlcmVkIHRvIGJlCithIHN0cnVjdHVyZWQgbG9nIGVudHJ5IGlkZW50aWZpZWQgYnkgdGhlIGZ1bmN0aW9uIG5hbWUuIFRoaXMgbG9nIGNhbiB0aGVuIGJlIHVzZWQgZm9yCithIHZhcmlldHkgb2YgcHVycG9zZXMsIGluY2x1ZGluZyBpbmxpbmUgYW5kIG9mZmxpbmUgcHJvY2Vzc2luZywgc3RhdHMgYWdncmVnYXRpb24gYW5kIGFzIGEgcmVkbyBsb2cuCisKK1xzZWN0aW9ue0NvbmNsdXNpb25zfQorVGhyaWZ0IGhhcyBlbmFibGVkIEZhY2Vib29rIHRvIGJ1aWxkIHNjYWxhYmxlIGJhY2tlbmQKK3NlcnZpY2VzIGVmZmljaWVudGx5IGJ5IGVuYWJsaW5nIGVuZ2luZWVycyB0byBkaXZpZGUgYW5kIGNvbnF1ZXIuIEFwcGxpY2F0aW9uCitkZXZlbG9wZXJzIGNhbiBmb2N1cyBvbiBhcHBsaWNhdGlvbiBjb2RlIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdGhlCitzb2NrZXRzIGxheWVyLiBXZSBhdm9pZCBkdXBsaWNhdGVkIHdvcmsgYnkgd3JpdGluZyBidWZmZXJpbmcgYW5kIEkvTyBsb2dpYworaW4gb25lIHBsYWNlLCByYXRoZXIgdGhhbiBpbnRlcnNwZXJzaW5nIGl0IGluIGVhY2ggYXBwbGljYXRpb24uCisKK1RocmlmdCBoYXMgYmVlbiBlbXBsb3llZCBpbiBhIHdpZGUgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMgYXQgRmFjZWJvb2ssCitpbmNsdWRpbmcgc2VhcmNoLCBsb2dnaW5nLCBtb2JpbGUsIGFkcywgYW5kIHRoZSBkZXZlbG9wZXIgcGxhdGZvcm0uIFdlIGhhdmUKK2ZvdW5kIHRoYXQgdGhlIG1hcmdpbmFsIHBlcmZvcm1hbmNlIGNvc3QgaW5jdXJyZWQgYnkgYW4gZXh0cmEgbGF5ZXIgb2YKK3NvZnR3YXJlIGFic3RyYWN0aW9uIGlzIGZhciBlY2xpcHNlZCBieSB0aGUgZ2FpbnMgaW4gZGV2ZWxvcGVyIGVmZmljaWVuY3kgYW5kCitzeXN0ZW1zIHJlbGlhYmlsaXR5LgorCitcYXBwZW5kaXgKKworXHNlY3Rpb257U2ltaWxhciBTeXN0ZW1zfQorVGhlIGZvbGxvd2luZyBhcmUgc29mdHdhcmUgc3lzdGVtcyBzaW1pbGFyIHRvIFRocmlmdC4gRWFjaCBpcyAodmVyeSEpIGJyaWVmbHkKK2Rlc2NyaWJlZDoKKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBcdGV4dGl0e1NPQVAufSBYTUwtYmFzZWQuIERlc2lnbmVkIGZvciB3ZWIgc2VydmljZXMgdmlhIEhUVFAsIGV4Y2Vzc2l2ZQorWE1MIHBhcnNpbmcgb3ZlcmhlYWQuCitcaXRlbSBcdGV4dGl0e0NPUkJBLn0gUmVsYXRpdmVseSBjb21wcmVoZW5zaXZlLCBkZWJhdGFibHkgb3ZlcmRlc2lnbmVkIGFuZAoraGVhdnl3ZWlnaHQuIENvbXBhcmFibHkgY3VtYmVyc29tZSBzb2Z0d2FyZSBpbnN0YWxsYXRpb24uCitcaXRlbSBcdGV4dGl0e0NPTS59IEVtYnJhY2VkIG1haW5seSBpbiBXaW5kb3dzIGNsaWVudCBzb2Z0d2FyZS4gTm90IGFuIGVudGlyZWx5CitvcGVuIHNvbHV0aW9uLgorXGl0ZW0gXHRleHRpdHtQaWxsYXIufSBMaWdodHdlaWdodCBhbmQgaGlnaC1wZXJmb3JtYW5jZSwgYnV0IG1pc3NpbmcgdmVyc2lvbmluZworYW5kIGFic3RyYWN0aW9uLgorXGl0ZW0gXHRleHRpdHtQcm90b2NvbCBCdWZmZXJzLn0gQ2xvc2VkLXNvdXJjZSwgb3duZWQgYnkgR29vZ2xlLiBEZXNjcmliZWQgaW4KK1Nhd3phbGwgcGFwZXIuCitcZW5ke2l0ZW1pemV9CisKK1xhY2tzCisKK01hbnkgdGhhbmtzIGZvciBmZWVkYmFjayBvbiBUaHJpZnQgKGFuZCBleHRyZW1lIHRyaWFsIGJ5IGZpcmUpIGFyZSBkdWUgdG8KK01hcnRpbiBTbWl0aCwgS2FybCBWb3NrdWlsIGFuZCBZaXNoYW4gV29uZy4KKworVGhyaWZ0IGlzIGEgc3VjY2Vzc29yIHRvIFBpbGxhciwgYSBzaW1pbGFyIHN5c3RlbSBkZXZlbG9wZWQKK2J5IEFkYW0gRCdBbmdlbG8sIGZpcnN0IHdoaWxlIGF0IENhbHRlY2ggYW5kIGNvbnRpbnVlZCBsYXRlciBhdCBGYWNlYm9vay4KK1RocmlmdCBzaW1wbHkgd291bGQgbm90IGhhdmUgaGFwcGVuZWQgd2l0aG91dCBBZGFtJ3MgaW5zaWdodHMuCisKK1xiZWdpbnt0aGViaWJsaW9ncmFwaHl9e30KKworXGJpYml0ZW17Ym9vc3QudGhyZWFkc30KK0tlbXBmLCBXaWxsaWFtLAorYGBCb29zdC5UaHJlYWRzJycsCitcdXJse2h0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9odG1sL3RocmVhZHMuaHRtbH0KKworXGJpYml0ZW17Ym9vc3QudGhyZWFkcG9vbH0KK0hlbmtlbCwgUGhpbGlwcCwKK2BgdGhyZWFkcG9vbCcnLAorXHVybHtodHRwOi8vdGhyZWFkcG9vbC5zb3VyY2Vmb3JnZS5uZXR9CisKK1xlbmR7dGhlYmlibGlvZ3JhcGh5fQorCitcZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvZG9jL3RocmlmdC5ibmYgYi9kb2MvdGhyaWZ0LmJuZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkODNmNi4uMDAwMDAwMAotLS0gYS9kb2MvdGhyaWZ0LmJuZgorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLVRocmlmdCBQcm90b2NvbCBTdHJ1Y3R1cmUKLQotTGFzdCBNb2RpZmllZDogMjAwNy1KdW4tMjkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFRocmlmdCBwcm90b2NvbAotd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZy4gVGh1cywgdGhlIG9yZGVyIG9mIGVsZW1lbnRzCi1jb3VsZCBpbiBzb21lIGNhc2VzIGJlIHJlYXJyYW5nZWQgZGVwZW5kaW5nIHVwb24gdGhlIFRQcm90b2NvbAotaW1wbGVtZW50YXRpb24sIGJ1dCB0aGlzIGRvY3VtZW50IHNwZWNpZmllcyB0aGUgbWluaW11bSByZXF1aXJlZAotc3RydWN0dXJlLiBUaGVyZSBhcmUgc29tZSAiZHVtYiIgdGVybWluYWxzIGxpa2UgU1RSSU5HIGFuZCBJTlQKLXRoYXQgdGFrZSB0aGUgcGxhY2Ugb2YgYW4gYWN0dWFsIGVuY29kaW5nIHNwZWNpZmljYXRpb24uCi0KLVRoZXkga2V5IHBvaW50IHRvIG5vdGljZSBpcyB0aGF0IEFMTCBtZXNzYWdlcyBhcmUganVzdCBvbmUgd3JhcHBlZAotPHN0cnVjdD4uIERlcGVuZGluZyB1cG9uIHRoZSBtZXNzYWdlIHR5cGUsIHRoZSA8c3RydWN0PiBjYW4gYmUKLWludGVycHJldGVkIGFzIHRoZSBhcmd1bWVudCBsaXN0IHRvIGEgZnVuY3Rpb24sIHRoZSByZXR1cm4gdmFsdWUKLW9mIGEgZnVuY3Rpb24sIG9yIGFuIGV4Y2VwdGlvbi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgIDxtZXNzYWdlPiA6Oj0gPG1lc3NhZ2UtYmVnaW4+IDxzdHJ1Y3Q+IDxtZXNzYWdlLWVuZD4KLQotIDxtZXNzYWdlLWJlZ2luPiA6Oj0gPG1ldGhvZC1uYW1lPiA8bWVzc2FnZS10eXBlPiA8bWVzc2FnZS1zZXFpZD4KLQotICAgPG1ldGhvZC1uYW1lPiA6Oj0gU1RSSU5HCi0KLSAgPG1lc3NhZ2UtdHlwZT4gOjo9IFRfQ0FMTCB8IFRfUkVQTFkgfCBUX0VYQ0VQVElPTgotCi0gPG1lc3NhZ2Utc2VxaWQ+IDo6PSBJMzIKLQotICAgICAgICA8c3RydWN0PiA6Oj0gPHN0cnVjdC1iZWdpbj4gPGZpZWxkPiogPGZpZWxkLXN0b3A+IDxzdHJ1Y3QtZW5kPgotCi0gIDxzdHJ1Y3QtYmVnaW4+IDo6PSA8c3RydWN0LW5hbWU+Ci0KLSAgIDxzdHJ1Y3QtbmFtZT4gOjo9IFNUUklORwotCi0gICAgPGZpZWxkLXN0b3A+IDo6PSBUX1NUT1AKLQotICAgICAgICAgPGZpZWxkPiA6Oj0gPGZpZWxkLWJlZ2luPiA8ZmllbGQtZGF0YT4gPGZpZWxkLWVuZD4KLQotICAgPGZpZWxkLWJlZ2luPiA6Oj0gPGZpZWxkLW5hbWU+IDxmaWVsZC10eXBlPiA8ZmllbGQtaWQ+Ci0KLSAgICA8ZmllbGQtbmFtZT4gOjo9IFNUUklORwotCi0gICAgPGZpZWxkLXR5cGU+IDo6PSBUX0JPT0wgfCBUX0JZVEUgfCBUX0k4IHwgVF9JMTYgfCBUX0kzMiB8IFRfSTY0IHwgVF9ET1VCTEUKLSAgICAgICAgICAgICAgICAgICAgIHwgVF9TVFJJTkcgfCBUX0JJTkFSWSB8IFRfU1RSVUNUIHwgVF9NQVAgfCBUX1NFVCB8IFRfTElTVAotCi0gICAgICA8ZmllbGQtaWQ+IDo6PSBJMTYKLQotICAgIDxmaWVsZC1kYXRhPiA6Oj0gSTggfCBJMTYgfCBJMzIgfCBJNjQgfCBET1VCTEUgfCBTVFJJTkcgfCBCSU5BUlkKLSAgICAgICAgICAgICAgICAgICAgIDxzdHJ1Y3Q+IHwgPG1hcD4gfCA8bGlzdD4gfCA8c2V0PgotCi0gICAgICAgICAgIDxtYXA+IDo6PSA8bWFwLWJlZ2luPiA8ZmllbGQtZGF0dW0+KiA8bWFwLWVuZD4KLQotICAgICA8bWFwLWJlZ2luPiA6Oj0gPG1hcC1rZXktdHlwZT4gPG1hcC12YWx1ZS10eXBlPiA8bWFwLXNpemU+Ci0KLSAgPG1hcC1rZXktdHlwZT4gOjo9IDxmaWVsZC10eXBlPgotCi08bWFwLXZhbHVlLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KLQotICAgICAgPG1hcC1zaXplPiA6Oj0gSTMyCi0KLSAgICAgICAgICA8bGlzdD4gOjo9IDxsaXN0LWJlZ2luPiA8ZmllbGQtZGF0YT4qIDxsaXN0LWVuZD4KLQotICAgIDxsaXN0LWJlZ2luPiA6Oj0gPGxpc3QtZWxlbS10eXBlPiA8bGlzdC1zaXplPgotCi08bGlzdC1lbGVtLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KLQotICAgICA8bGlzdC1zaXplPiA6Oj0gSTMyCi0KLSAgICAgICAgICAgPHNldD4gOjo9IDxzZXQtYmVnaW4+IDxmaWVsZC1kYXRhPiogPHNldC1lbmQ+Ci0KLSAgICAgPHNldC1iZWdpbj4gOjo9IDxzZXQtZWxlbS10eXBlPiA8c2V0LXNpemU+Ci0KLSA8c2V0LWVsZW0tdHlwZT4gOjo9IDxmaWVsZC10eXBlPgotCi0gICAgICA8c2V0LXNpemU+IDo6PSBJMzIKZGlmZiAtLWdpdCBhL2RvYy90aHJpZnQudGV4IGIvZG9jL3RocmlmdC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGI3MzcuLjAwMDAwMDAKLS0tIGEvZG9jL3RocmlmdC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU3ICswLDAgQEAKLSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJQotJSAgICAgICAgICAgICAgIFRocmlmdCB3aGl0ZXBhcGVyCi0lCi0lIE5hbWU6ICAgICAgICAgdGhyaWZ0LnRleAotJQotJSBBdXRob3JzOiAgICAgIE1hcmsgU2xlZSAobWNzbGVlQGZhY2Vib29rLmNvbSkKLSUKLSUgQ3JlYXRlZDogICAgICAwNSBNYXJjaCAyMDA3Ci0lCi0lIFlvdSB3aWxsIG5lZWQgYSBjb3B5IG9mIHNpZ3BsYW5jb25mLmNscyB0byBmb3JtYXQgdGhpcyBkb2N1bWVudC4KLSUgSXQgaXMgYXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnNpZ3BsYW4ub3JnL2F1dGhvckluZm9ybWF0aW9uLmh0bT4uCi0lCi0lLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1cZG9jdW1lbnRjbGFzc1tub2NvcHlyaWdodHNwYWNlLGJsb2Nrc3R5bGVde3NpZ3BsYW5jb25mfQotCi1cdXNlcGFja2FnZXthbXNzeW1ifQotXHVzZXBhY2thZ2V7YW1zZm9udHN9Ci1cdXNlcGFja2FnZXthbXNtYXRofQotXHVzZXBhY2thZ2V7dXJsfQotCi1cYmVnaW57ZG9jdW1lbnR9Ci0KLSUgXGNvbmZlcmVuY2VpbmZve1dYWVogJzA1fXtkYXRlLCBDaXR5Ln0KLSUgXGNvcHlyaWdodHllYXJ7MjAwN30KLSUgXGNvcHlyaWdodGRhdGF7W3RvIGJlIHN1cHBsaWVkXX0KLQotJSBcdGl0bGViYW5uZXJ7YmFubmVyIGFib3ZlIHBhcGVyIHRpdGxlfSAgICAgICAgJSBUaGVzZSBhcmUgaWdub3JlZCB1bmxlc3MKLSUgXHByZXByaW50Zm9vdGVye3Nob3J0IGRlc2NyaXB0aW9uIG9mIHBhcGVyfSAgICUgJ3ByZXByaW50JyBvcHRpb24gc3BlY2lmaWVkLgotCi1cdGl0bGV7VGhyaWZ0OiBTY2FsYWJsZSBDcm9zcy1MYW5ndWFnZSBTZXJ2aWNlcyBJbXBsZW1lbnRhdGlvbn0KLVxzdWJ0aXRsZXt9Ci0KLVxhdXRob3JpbmZve01hcmsgU2xlZSwgQWRpdHlhIEFnYXJ3YWwgYW5kIE1hcmMgS3dpYXRrb3dza2l9Ci0gICAgICAgICAgIHtGYWNlYm9vaywgMTU2IFVuaXZlcnNpdHkgQXZlLCBQYWxvIEFsdG8sIENBfQotICAgICAgICAgICB7XHttY3NsZWUsYWRpdHlhLG1hcmNcfUBmYWNlYm9vay5jb219Ci0KLVxtYWtldGl0bGUKLQotXGJlZ2lue2Fic3RyYWN0fQotVGhyaWZ0IGlzIGEgc29mdHdhcmUgbGlicmFyeSBhbmQgc2V0IG9mIGNvZGUtZ2VuZXJhdGlvbiB0b29scyBkZXZlbG9wZWQgYXQKLUZhY2Vib29rIHRvIGV4cGVkaXRlIGRldmVsb3BtZW50IGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBlZmZpY2llbnQgYW5kIHNjYWxhYmxlCi1iYWNrZW5kIHNlcnZpY2VzLiBJdHMgcHJpbWFyeSBnb2FsIGlzIHRvIGVuYWJsZSBlZmZpY2llbnQgYW5kIHJlbGlhYmxlCi1jb21tdW5pY2F0aW9uIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgYnkgYWJzdHJhY3RpbmcgdGhlIHBvcnRpb25zIG9mIGVhY2gKLWxhbmd1YWdlIHRoYXQgdGVuZCB0byByZXF1aXJlIHRoZSBtb3N0IGN1c3RvbWl6YXRpb24gaW50byBhIGNvbW1vbiBsaWJyYXJ5Ci10aGF0IGlzIGltcGxlbWVudGVkIGluIGVhY2ggbGFuZ3VhZ2UuIFNwZWNpZmljYWxseSwgVGhyaWZ0IGFsbG93cyBkZXZlbG9wZXJzIHRvCi1kZWZpbmUgZGF0YXR5cGVzIGFuZCBzZXJ2aWNlIGludGVyZmFjZXMgaW4gYSBzaW5nbGUgbGFuZ3VhZ2UtbmV1dHJhbCBmaWxlCi1hbmQgZ2VuZXJhdGUgYWxsIHRoZSBuZWNlc3NhcnkgY29kZSB0byBidWlsZCBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KLQotVGhpcyBwYXBlciBkZXRhaWxzIHRoZSBtb3RpdmF0aW9ucyBhbmQgZGVzaWduIGNob2ljZXMgd2UgbWFkZSBpbiBUaHJpZnQsIGFzCi13ZWxsIGFzIHNvbWUgb2YgdGhlIG1vcmUgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gSXQgaXMgbm90Ci1pbnRlbmRlZCB0byBiZSB0YWtlbiBhcyByZXNlYXJjaCwgYnV0IHJhdGhlciBpdCBpcyBhbiBleHBvc2l0aW9uIG9uIHdoYXQgd2UgZGlkCi1hbmQgd2h5LgotXGVuZHthYnN0cmFjdH0KLQotJSBcY2F0ZWdvcnl7RC4zLjN9e1Byb2dyYW1taW5nIExhbmd1YWdlc317TGFuZ3VhZ2UgY29uc3RydWN0cyBhbmQgZmVhdHVyZXN9Ci0KLSVcdGVybXMKLSVMYW5ndWFnZXMsIHNlcmlhbGl6YXRpb24sIHJlbW90ZSBwcm9jZWR1cmUgY2FsbAotCi0lXGtleXdvcmRzCi0lRGF0YSBkZXNjcmlwdGlvbiBsYW5ndWFnZSwgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UsIHJlbW90ZSBwcm9jZWR1cmUgY2FsbAotCi1cc2VjdGlvbntJbnRyb2R1Y3Rpb259Ci1BcyBGYWNlYm9vaydzIHRyYWZmaWMgYW5kIG5ldHdvcmsgc3RydWN0dXJlIGhhdmUgc2NhbGVkLCB0aGUgcmVzb3VyY2UKLWRlbWFuZHMgb2YgbWFueSBvcGVyYXRpb25zIG9uIHRoZSBzaXRlIChpLmUuIHNlYXJjaCwKLWFkIHNlbGVjdGlvbiBhbmQgZGVsaXZlcnksIGV2ZW50IGxvZ2dpbmcpIGhhdmUgcHJlc2VudGVkIHRlY2huaWNhbCByZXF1aXJlbWVudHMKLWRyYXN0aWNhbGx5IG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZSBMQU1QIGZyYW1ld29yay4gSW4gb3VyIGltcGxlbWVudGF0aW9uIG9mCi10aGVzZSBzZXJ2aWNlcywgdmFyaW91cyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgaGF2ZSBiZWVuIHNlbGVjdGVkIHRvCi1vcHRpbWl6ZSBmb3IgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIHBlcmZvcm1hbmNlLCBlYXNlIGFuZCBzcGVlZCBvZgotZGV2ZWxvcG1lbnQsIGF2YWlsYWJpbGl0eSBvZiBleGlzdGluZyBsaWJyYXJpZXMsIGV0Yy4gQnkgYW5kIGxhcmdlLAotRmFjZWJvb2sncyBlbmdpbmVlcmluZyBjdWx0dXJlIGhhcyB0ZW5kZWQgdG93YXJkcyBjaG9vc2luZyB0aGUgYmVzdAotdG9vbHMgYW5kIGltcGxlbWVudGF0aW9ucyBhdmFpbGFibGUgb3ZlciBzdGFuZGFyZGl6aW5nIG9uIGFueSBvbmUKLXByb2dyYW1taW5nIGxhbmd1YWdlIGFuZCBiZWdydWRnaW5nbHkgYWNjZXB0aW5nIGl0cyBpbmhlcmVudCBsaW1pdGF0aW9ucy4KLQotR2l2ZW4gdGhpcyBkZXNpZ24gY2hvaWNlLCB3ZSB3ZXJlIHByZXNlbnRlZCB3aXRoIHRoZSBjaGFsbGVuZ2Ugb2YgYnVpbGRpbmcKLWEgdHJhbnNwYXJlbnQsIGhpZ2gtcGVyZm9ybWFuY2UgYnJpZGdlIGFjcm9zcyBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcy4KLVdlIGZvdW5kIHRoYXQgbW9zdCBhdmFpbGFibGUgc29sdXRpb25zIHdlcmUgZWl0aGVyIHRvbyBsaW1pdGVkLCBkaWQgbm90IG9mZmVyCi1zdWZmaWNpZW50IGRhdGF0eXBlIGZyZWVkb20sIG9yIHN1ZmZlcmVkIGZyb20gc3VicGFyIHBlcmZvcm1hbmNlLgotXGZvb3Rub3Rle1NlZSBBcHBlbmRpeCBBIGZvciBhIGRpc2N1c3Npb24gb2YgYWx0ZXJuYXRpdmUgc3lzdGVtcy59Ci0KLVRoZSBzb2x1dGlvbiB0aGF0IHdlIGhhdmUgaW1wbGVtZW50ZWQgY29tYmluZXMgYSBsYW5ndWFnZS1uZXV0cmFsIHNvZnR3YXJlCi1zdGFjayBpbXBsZW1lbnRlZCBhY3Jvc3MgbnVtZXJvdXMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFuZCBhbiBhc3NvY2lhdGVkIGNvZGUKLWdlbmVyYXRpb24gZW5naW5lIHRoYXQgdHJhbnNmb3JtcyBhIHNpbXBsZSBpbnRlcmZhY2UgYW5kIGRhdGEgZGVmaW5pdGlvbgotbGFuZ3VhZ2UgaW50byBjbGllbnQgYW5kIHNlcnZlciByZW1vdGUgcHJvY2VkdXJlIGNhbGwgbGlicmFyaWVzLgotQ2hvb3Npbmcgc3RhdGljIGNvZGUgZ2VuZXJhdGlvbiBvdmVyIGEgZHluYW1pYyBzeXN0ZW0gYWxsb3dzIHVzIHRvIGNyZWF0ZQotdmFsaWRhdGVkIGNvZGUgdGhhdCBjYW4gYmUgcnVuIHdpdGhvdXQgdGhlIG5lZWQgZm9yCi1hbnkgYWR2YW5jZWQgaW50cm9zcGVjdGl2ZSBydW4tdGltZSB0eXBlIGNoZWNraW5nLiBJdCBpcyBhbHNvIGRlc2lnbmVkIHRvCi1iZSBhcyBzaW1wbGUgYXMgcG9zc2libGUgZm9yIHRoZSBkZXZlbG9wZXIsIHdobyBjYW4gdHlwaWNhbGx5IGRlZmluZSBhbGwKLXRoZSBuZWNlc3NhcnkgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBpbnRlcmZhY2VzIGZvciBhIGNvbXBsZXggc2VydmljZSBpbiBhIHNpbmdsZQotc2hvcnQgZmlsZS4KLQotU3VycHJpc2VkIHRoYXQgYSByb2J1c3Qgb3BlbiBzb2x1dGlvbiB0byB0aGVzZSByZWxhdGl2ZWx5IGNvbW1vbiBwcm9ibGVtcwotZGlkIG5vdCB5ZXQgZXhpc3QsIHdlIGNvbW1pdHRlZCBlYXJseSBvbiB0byBtYWtpbmcgdGhlIFRocmlmdCBpbXBsZW1lbnRhdGlvbgotb3BlbiBzb3VyY2UuCi0KLUluIGV2YWx1YXRpbmcgdGhlIGNoYWxsZW5nZXMgb2YgY3Jvc3MtbGFuZ3VhZ2UgaW50ZXJhY3Rpb24gaW4gYSBuZXR3b3JrZWQKLWVudmlyb25tZW50LCBzb21lIGtleSBjb21wb25lbnRzIHdlcmUgaWRlbnRpZmllZDoKLQotXHRleHRpdHtUeXBlcy59IEEgY29tbW9uIHR5cGUgc3lzdGVtIG11c3QgZXhpc3QgYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcwotd2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHVzZSBjdXN0b20gVGhyaWZ0IGRhdGF0eXBlcwotb3Igd3JpdGUgdGhlaXIgb3duIHNlcmlhbGl6YXRpb24gY29kZS4gVGhhdCBpcywKLWEgQysrIHByb2dyYW1tZXIgc2hvdWxkIGJlIGFibGUgdG8gdHJhbnNwYXJlbnRseSBleGNoYW5nZSBhIHN0cm9uZ2x5IHR5cGVkCi1TVEwgbWFwIGZvciBhIGR5bmFtaWMgUHl0aG9uIGRpY3Rpb25hcnkuIE5laXRoZXIKLXByb2dyYW1tZXIgc2hvdWxkIGJlIGZvcmNlZCB0byB3cml0ZSBhbnkgY29kZSBiZWxvdyB0aGUgYXBwbGljYXRpb24gbGF5ZXIKLXRvIGFjaGlldmUgdGhpcy4gU2VjdGlvbiAyIGRldGFpbHMgdGhlIFRocmlmdCB0eXBlIHN5c3RlbS4KLQotXHRleHRpdHtUcmFuc3BvcnQufSBFYWNoIGxhbmd1YWdlIG11c3QgaGF2ZSBhIGNvbW1vbiBpbnRlcmZhY2UgdG8KLWJpZGlyZWN0aW9uYWwgcmF3IGRhdGEgdHJhbnNwb3J0LiBUaGUgc3BlY2lmaWNzIG9mIGhvdyBhIGdpdmVuCi10cmFuc3BvcnQgaXMgaW1wbGVtZW50ZWQgc2hvdWxkIG5vdCBtYXR0ZXIgdG8gdGhlIHNlcnZpY2UgZGV2ZWxvcGVyLgotVGhlIHNhbWUgYXBwbGljYXRpb24gY29kZSBzaG91bGQgYmUgYWJsZSB0byBydW4gYWdhaW5zdCBUQ1Agc3RyZWFtIHNvY2tldHMsCi1yYXcgZGF0YSBpbiBtZW1vcnksIG9yIGZpbGVzIG9uIGRpc2suIFNlY3Rpb24gMyBkZXRhaWxzIHRoZSBUaHJpZnQgVHJhbnNwb3J0Ci1sYXllci4KLQotXHRleHRpdHtQcm90b2NvbC59IERhdGF0eXBlcyBtdXN0IGhhdmUgc29tZSB3YXkgb2YgdXNpbmcgdGhlIFRyYW5zcG9ydAotbGF5ZXIgdG8gZW5jb2RlIGFuZCBkZWNvZGUgdGhlbXNlbHZlcy4gQWdhaW4sIHRoZSBhcHBsaWNhdGlvbgotZGV2ZWxvcGVyIG5lZWQgbm90IGJlIGNvbmNlcm5lZCBieSB0aGlzIGxheWVyLiBXaGV0aGVyIHRoZSBzZXJ2aWNlIHVzZXMKLWFuIFhNTCBvciBiaW5hcnkgcHJvdG9jb2wgaXMgaW1tYXRlcmlhbCB0byB0aGUgYXBwbGljYXRpb24gY29kZS4KLUFsbCB0aGF0IG1hdHRlcnMgaXMgdGhhdCB0aGUgZGF0YSBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBpbiBhIGNvbnNpc3RlbnQsCi1kZXRlcm1pbmlzdGljIG1hdHRlci4gU2VjdGlvbiA0IGRldGFpbHMgdGhlIFRocmlmdCBQcm90b2NvbCBsYXllci4KLQotXHRleHRpdHtWZXJzaW9uaW5nLn0gRm9yIHJvYnVzdCBzZXJ2aWNlcywgdGhlIGludm9sdmVkIGRhdGF0eXBlcyBtdXN0Ci1wcm92aWRlIGEgbWVjaGFuaXNtIGZvciB2ZXJzaW9uaW5nIHRoZW1zZWx2ZXMuIFNwZWNpZmljYWxseSwKLWl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhZGQgb3IgcmVtb3ZlIGZpZWxkcyBpbiBhbiBvYmplY3Qgb3IgYWx0ZXIgdGhlCi1hcmd1bWVudCBsaXN0IG9mIGEgZnVuY3Rpb24gd2l0aG91dCBhbnkgaW50ZXJydXB0aW9uIGluIHNlcnZpY2UgKG9yLAotd29yc2UgeWV0LCBuYXN0eSBzZWdtZW50YXRpb24gZmF1bHRzKS4gU2VjdGlvbiA1IGRldGFpbHMgVGhyaWZ0J3MgdmVyc2lvbmluZwotc3lzdGVtLgotCi1cdGV4dGl0e1Byb2Nlc3NvcnMufSBGaW5hbGx5LCB3ZSBnZW5lcmF0ZSBjb2RlIGNhcGFibGUgb2YgcHJvY2Vzc2luZyBkYXRhCi1zdHJlYW1zIHRvIGFjY29tcGxpc2ggcmVtb3RlIHByb2NlZHVyZSBjYWxscy4gU2VjdGlvbiA2IGRldGFpbHMgdGhlIGdlbmVyYXRlZAotY29kZSBhbmQgVFByb2Nlc3NvciBwYXJhZGlnbS4KLQotU2VjdGlvbiA3IGRpc2N1c3NlcyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBhbmQgU2VjdGlvbiA4IGRlc2NyaWJlcwotb3VyIGNvbmNsdXNpb25zLgotCi1cc2VjdGlvbntUeXBlc30KLQotVGhlIGdvYWwgb2YgdGhlIFRocmlmdCB0eXBlIHN5c3RlbSBpcyB0byBlbmFibGUgcHJvZ3JhbW1lcnMgdG8gZGV2ZWxvcCB1c2luZwotY29tcGxldGVseSBuYXRpdmVseSBkZWZpbmVkIHR5cGVzLCBubyBtYXR0ZXIgd2hhdCBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGV5Ci11c2UuIEJ5IGRlc2lnbiwgdGhlIFRocmlmdCB0eXBlIHN5c3RlbSBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHNwZWNpYWwgZHluYW1pYwotdHlwZXMgb3Igd3JhcHBlciBvYmplY3RzLiBJdCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhhdCB0aGUgZGV2ZWxvcGVyIHdyaXRlCi1hbnkgY29kZSBmb3Igb2JqZWN0IHNlcmlhbGl6YXRpb24gb3IgdHJhbnNwb3J0LiBUaGUgVGhyaWZ0IElETCAoSW50ZXJmYWNlCi1EZWZpbml0aW9uIExhbmd1YWdlKSBmaWxlIGlzCi1sb2dpY2FsbHkgYSB3YXkgZm9yIGRldmVsb3BlcnMgdG8gYW5ub3RhdGUgdGhlaXIgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdGhlCi1taW5pbWFsIGFtb3VudCBvZiBleHRyYSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gdGVsbCBhIGNvZGUgZ2VuZXJhdG9yCi1ob3cgdG8gc2FmZWx5IHRyYW5zcG9ydCB0aGUgb2JqZWN0cyBhY3Jvc3MgbGFuZ3VhZ2VzLgotCi1cc3Vic2VjdGlvbntCYXNlIFR5cGVzfQotCi1UaGUgdHlwZSBzeXN0ZW0gcmVzdHMgdXBvbiBhIGZldyBiYXNlIHR5cGVzLiBJbiBjb25zaWRlcmluZyB3aGljaCB0eXBlcyB0bwotc3VwcG9ydCwgd2UgYWltZWQgZm9yIGNsYXJpdHkgYW5kIHNpbXBsaWNpdHkgb3ZlciBhYnVuZGFuY2UsIGZvY3VzaW5nCi1vbiB0aGUga2V5IHR5cGVzIGF2YWlsYWJsZSBpbiBhbGwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLCBvbW1pdHRpbmcgYW55Ci1uaWNoZSB0eXBlcyBhdmFpbGFibGUgb25seSBpbiBzcGVjaWZpYyBsYW5ndWFnZXMuCi0KLVRoZSBiYXNlIHR5cGVzIHN1cHBvcnRlZCBieSBUaHJpZnQgYXJlOgotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcdGV4dHR0e2Jvb2x9IEEgYm9vbGVhbiB2YWx1ZSwgdHJ1ZSBvciBmYWxzZQotXGl0ZW0gXHRleHR0dHtieXRlfSBBIHNpZ25lZCBieXRlCi1caXRlbSBcdGV4dHR0e2kxNn0gQSAxNi1iaXQgc2lnbmVkIGludGVnZXIKLVxpdGVtIFx0ZXh0dHR7aTMyfSBBIDMyLWJpdCBzaWduZWQgaW50ZWdlcgotXGl0ZW0gXHRleHR0dHtpNjR9IEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCi1caXRlbSBcdGV4dHR0e2RvdWJsZX0gQSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi1caXRlbSBcdGV4dHR0e3N0cmluZ30gQW4gZW5jb2RpbmctYWdub3N0aWMgdGV4dCBvciBiaW5hcnkgc3RyaW5nCi1caXRlbSBcdGV4dHR0e2JpbmFyeX0gQSBieXRlIGFycmF5IHJlcHJlc2VudGF0aW9uIGZvciBibG9icwotXGVuZHtpdGVtaXplfQotCi1PZiBwYXJ0aWN1bGFyIG5vdGUgaXMgdGhlIGFic2VuY2Ugb2YgdW5zaWduZWQgaW50ZWdlciB0eXBlcy4gQmVjYXVzZSB0aGVzZQotdHlwZXMgaGF2ZSBubyBkaXJlY3QgdHJhbnNsYXRpb24gdG8gbmF0aXZlIHByaW1pdGl2ZSB0eXBlcyBpbiBtYW55IGxhbmd1YWdlcywKLXRoZSBhZHZhbnRhZ2VzIHRoZXkgYWZmb3JkIGFyZSBsb3N0LiBGdXJ0aGVyLCB0aGVyZSBpcyBubyB3YXkgdG8gcHJldmVudCB0aGUKLWFwcGxpY2F0aW9uIGRldmVsb3BlciBpbiBhIGxhbmd1YWdlIGxpa2UgUHl0aG9uIGZyb20gYXNzaWduaW5nIGEgbmVnYXRpdmUgdmFsdWUKLXRvIGFuIGludGVnZXIgdmFyaWFibGUsIGxlYWRpbmcgdG8gdW5wcmVkaWN0YWJsZSBiZWhhdmlvci4gRnJvbSBhIGRlc2lnbgotc3RhbmRwb2ludCwgd2Ugb2JzZXJ2ZWQgdGhhdCB1bnNpZ25lZCBpbnRlZ2VycyB3ZXJlIHZlcnkgcmFyZWx5LCBpZiBldmVyLCB1c2VkCi1mb3IgYXJpdGhtZXRpYyBwdXJwb3NlcywgYnV0IGluIHByYWN0aWNlIHdlcmUgbXVjaCBtb3JlIG9mdGVuIHVzZWQgYXMga2V5cyBvcgotaWRlbnRpZmllcnMuIEluIHRoaXMgY2FzZSwgdGhlIHNpZ24gaXMgaXJyZWxldmFudC4gU2lnbmVkIGludGVnZXJzIHNlcnZlIHRoaXMKLXNhbWUgcHVycG9zZSBhbmQgY2FuIGJlIHNhZmVseSBjYXN0IHRvIHRoZWlyIHVuc2lnbmVkIGNvdW50ZXJwYXJ0cyAobW9zdAotY29tbW9ubHkgaW4gQysrKSB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgotCi1cc3Vic2VjdGlvbntTdHJ1Y3RzfQotCi1BIFRocmlmdCBzdHJ1Y3QgZGVmaW5lcyBhIGNvbW1vbiBvYmplY3QgdG8gYmUgdXNlZCBhY3Jvc3MgbGFuZ3VhZ2VzLiBBIHN0cnVjdAotaXMgZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byBhIGNsYXNzIGluIG9iamVjdCBvcmllbnRlZCBwcm9ncmFtbWluZwotbGFuZ3VhZ2VzLiBBIHN0cnVjdCBoYXMgYSBzZXQgb2Ygc3Ryb25nbHkgdHlwZWQgZmllbGRzLCBlYWNoIHdpdGggYSB1bmlxdWUKLW5hbWUgaWRlbnRpZmllci4gVGhlIGJhc2ljIHN5bnRheCBmb3IgZGVmaW5pbmcgYSBUaHJpZnQgc3RydWN0IGxvb2tzIHZlcnkKLXNpbWlsYXIgdG8gYSBDIHN0cnVjdCBkZWZpbml0aW9uLiBGaWVsZHMgbWF5IGJlIGFubm90YXRlZCB3aXRoIGFuIGludGVnZXIgZmllbGQKLWlkZW50aWZpZXIgKHVuaXF1ZSB0byB0aGUgc2NvcGUgb2YgdGhhdCBzdHJ1Y3QpIGFuZCBvcHRpb25hbCBkZWZhdWx0IHZhbHVlcy4KLUZpZWxkIGlkZW50aWZpZXJzIHdpbGwgYmUgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZiBvbWl0dGVkLCB0aG91Z2ggdGhleSBhcmUKLXN0cm9uZ2x5IGVuY291cmFnZWQgZm9yIHZlcnNpb25pbmcgcmVhc29ucyBkaXNjdXNzZWQgbGF0ZXIuCi0KLVxzdWJzZWN0aW9ue0NvbnRhaW5lcnN9Ci0KLVRocmlmdCBjb250YWluZXJzIGFyZSBzdHJvbmdseSB0eXBlZCBjb250YWluZXJzIHRoYXQgbWFwIHRvIHRoZSBtb3N0IGNvbW1vbmx5Ci11c2VkIGNvbnRhaW5lcnMgaW4gY29tbW9uIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gVGhleSBhcmUgYW5ub3RhdGVkIHVzaW5nCi10aGUgQysrIHRlbXBsYXRlIChvciBKYXZhIEdlbmVyaWNzKSBzdHlsZS4gVGhlcmUgYXJlIHRocmVlIHR5cGVzIGF2YWlsYWJsZToKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXHRleHR0dHtsaXN0PHR5cGU+fSBBbiBvcmRlcmVkIGxpc3Qgb2YgZWxlbWVudHMuIFRyYW5zbGF0ZXMgZGlyZWN0bHkgaW50bwotYW4gU1RMIFx0ZXh0dHR7dmVjdG9yfSwgSmF2YSBcdGV4dHR0e0FycmF5TGlzdH0sIG9yIG5hdGl2ZSBhcnJheSBpbiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiBNYXkKLWNvbnRhaW4gZHVwbGljYXRlcy4KLVxpdGVtIFx0ZXh0dHR7c2V0PHR5cGU+fSBBbiB1bm9yZGVyZWQgc2V0IG9mIHVuaXF1ZSBlbGVtZW50cy4gVHJhbnNsYXRlcyBpbnRvCi1hbiBTVEwgXHRleHR0dHtzZXR9LCBKYXZhIFx0ZXh0dHR7SGFzaFNldH0sIFx0ZXh0dHR7c2V0fSBpbiBQeXRob24sIG9yIG5hdGl2ZQotZGljdGlvbmFyeSBpbiBQSFAvUnVieS4KLVxpdGVtIFx0ZXh0dHR7bWFwPHR5cGUxLHR5cGUyPn0gQSBtYXAgb2Ygc3RyaWN0bHkgdW5pcXVlIGtleXMgdG8gdmFsdWVzCi1UcmFuc2xhdGVzIGludG8gYW4gU1RMIFx0ZXh0dHR7bWFwfSwgSmF2YSBcdGV4dHR0e0hhc2hNYXB9LCBQSFAgYXNzb2NpYXRpdmUKLWFycmF5LCBvciBQeXRob24vUnVieSBkaWN0aW9uYXJ5LgotXGVuZHtpdGVtaXplfQotCi1XaGlsZSBkZWZhdWx0cyBhcmUgcHJvdmlkZWQsIHRoZSB0eXBlIG1hcHBpbmdzIGFyZSBub3QgZXhwbGljaXRseSBmaXhlZC4gQ3VzdG9tCi1jb2RlIGdlbmVyYXRvciBkaXJlY3RpdmVzIGhhdmUgYmVlbiBhZGRlZCB0byBzdWJzdGl0dXRlIGN1c3RvbSB0eXBlcyBpbgotZGVzdGluYXRpb24gbGFuZ3VhZ2VzIChpLmUuCi1cdGV4dHR0e2hhc2hcX21hcH0gb3IgR29vZ2xlJ3Mgc3BhcnNlIGhhc2ggbWFwIGNhbiBiZSB1c2VkIGluIEMrKykuIFRoZQotb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSBjdXN0b20gdHlwZXMgc3VwcG9ydCBhbGwgdGhlIG5lY2Vzc2FyeSBpdGVyYXRpb24KLXByaW1pdGl2ZXMuIENvbnRhaW5lciBlbGVtZW50cyBtYXkgYmUgb2YgYW55IHZhbGlkIFRocmlmdCB0eXBlLCBpbmNsdWRpbmcgb3RoZXIKLWNvbnRhaW5lcnMgb3Igc3RydWN0cy4KLQotXGJlZ2lue3ZlcmJhdGltfQotc3RydWN0IEV4YW1wbGUgewotICAxOmkzMiBudW1iZXI9MTAsCi0gIDI6aTY0IGJpZ051bWJlciwKLSAgMzpkb3VibGUgZGVjaW1hbHMsCi0gIDQ6c3RyaW5nIG5hbWU9InRocmlmdHkiCi19XGVuZHt2ZXJiYXRpbX0KLQotSW4gdGhlIHRhcmdldCBsYW5ndWFnZSwgZWFjaCBkZWZpbml0aW9uIGdlbmVyYXRlcyBhIHR5cGUgd2l0aCB0d28gbWV0aG9kcywKLVx0ZXh0dHR7cmVhZH0gYW5kIFx0ZXh0dHR7d3JpdGV9LCB3aGljaCBwZXJmb3JtIHNlcmlhbGl6YXRpb24gYW5kIHRyYW5zcG9ydAotb2YgdGhlIG9iamVjdHMgdXNpbmcgYSBUaHJpZnQgVFByb3RvY29sIG9iamVjdC4KLQotXHN1YnNlY3Rpb257RXhjZXB0aW9uc30KLQotRXhjZXB0aW9ucyBhcmUgc3ludGFjdGljYWxseSBhbmQgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gc3RydWN0cyBleGNlcHQKLXRoYXQgdGhleSBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIFx0ZXh0dHR7ZXhjZXB0aW9ufSBrZXl3b3JkIGluc3RlYWQgb2YgdGhlCi1cdGV4dHR0e3N0cnVjdH0ga2V5d29yZC4KLQotVGhlIGdlbmVyYXRlZCBvYmplY3RzIGluaGVyaXQgZnJvbSBhbiBleGNlcHRpb24gYmFzZSBjbGFzcyBhcyBhcHByb3ByaWF0ZQotaW4gZWFjaCB0YXJnZXQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGluIG9yZGVyIHRvIHNlYW1sZXNzbHkKLWludGVncmF0ZSB3aXRoIG5hdGl2ZSBleGNlcHRpb24gaGFuZGxpbmcgaW4gYW55IGdpdmVuCi1sYW5ndWFnZS4gQWdhaW4sIHRoZSBkZXNpZ24gZW1waGFzaXMgaXMgb24gbWFraW5nIHRoZSBjb2RlIGZhbWlsaWFyIHRvIHRoZQotYXBwbGljYXRpb24gZGV2ZWxvcGVyLgotCi1cc3Vic2VjdGlvbntTZXJ2aWNlc30KLQotU2VydmljZXMgYXJlIGRlZmluZWQgdXNpbmcgVGhyaWZ0IHR5cGVzLiBEZWZpbml0aW9uIG9mIGEgc2VydmljZSBpcwotc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gZGVmaW5pbmcgYW4gaW50ZXJmYWNlIChvciBhIHB1cmUgdmlydHVhbCBhYnN0cmFjdAotY2xhc3MpIGluIG9iamVjdCBvcmllbnRlZAotcHJvZ3JhbW1pbmcuIFRoZSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVzIGZ1bGx5IGZ1bmN0aW9uYWwgY2xpZW50IGFuZAotc2VydmVyIHN0dWJzIHRoYXQgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UuIFNlcnZpY2VzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXNlcnZpY2UgPG5hbWU+IHsKLSAgPHJldHVybnR5cGU+IDxuYW1lPig8YXJndW1lbnRzPikKLSAgICBbdGhyb3dzICg8ZXhjZXB0aW9ucz4pXQotICAuLi4KLX1cZW5ke3ZlcmJhdGltfQotCi1BbiBleGFtcGxlOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zZXJ2aWNlIFN0cmluZ0NhY2hlIHsKLSAgdm9pZCBzZXQoMTppMzIga2V5LCAyOnN0cmluZyB2YWx1ZSksCi0gIHN0cmluZyBnZXQoMTppMzIga2V5KSB0aHJvd3MgKDE6S2V5Tm90Rm91bmQga25mKSwKLSAgdm9pZCBkZWxldGUoMTppMzIga2V5KQotfQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IFx0ZXh0dHR7dm9pZH0gaXMgYSB2YWxpZCB0eXBlIGZvciBhIGZ1bmN0aW9uIHJldHVybiwgaW4gYWRkaXRpb24gdG8KLWFsbCBvdGhlciBkZWZpbmVkIFRocmlmdCB0eXBlcy4gQWRkaXRpb25hbGx5LCBhbiBcdGV4dHR0e2FzeW5jfSBtb2RpZmllcgota2V5d29yZCBtYXkgYmUgYWRkZWQgdG8gYSBcdGV4dHR0e3ZvaWR9IGZ1bmN0aW9uLCB3aGljaCB3aWxsIGdlbmVyYXRlIGNvZGUgdGhhdCBkb2VzCi1ub3Qgd2FpdCBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIE5vdGUgdGhhdCBhIHB1cmUgXHRleHR0dHt2b2lkfQotZnVuY3Rpb24gd2lsbCByZXR1cm4gYSByZXNwb25zZSB0byB0aGUgY2xpZW50IHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB0aGUKLW9wZXJhdGlvbiBoYXMgY29tcGxldGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS4gV2l0aCBcdGV4dHR0e2FzeW5jfSBtZXRob2QgY2FsbHMKLXRoZSBjbGllbnQgd2lsbCBvbmx5IGJlIGd1YXJhbnRlZWQgdGhhdCB0aGUgcmVxdWVzdCBzdWNjZWVkZWQgYXQgdGhlCi10cmFuc3BvcnQgbGF5ZXIuIChJbiBtYW55IHRyYW5zcG9ydCBzY2VuYXJpb3MgdGhpcyBpcyBpbmhlcmVudGx5IHVucmVsaWFibGUKLWR1ZSB0byB0aGUgQnl6YW50aW5lIEdlbmVyYWxzJyBQcm9ibGVtLiBUaGVyZWZvcmUsIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMKLXNob3VsZCB0YWtlIGNhcmUgb25seSB0byB1c2UgdGhlIGFzeW5jIG9wdGltaXphdGlvbiBpbiBjYXNlcyB3aGVyZSBkcm9wcGVkCi1tZXRob2QgY2FsbHMgYXJlIGFjY2VwdGFibGUgb3IgdGhlIHRyYW5zcG9ydCBpcyBrbm93biB0byBiZSByZWxpYWJsZS4pCi0KLUFsc28gb2Ygbm90ZSBpcyB0aGUgZmFjdCB0aGF0IGFyZ3VtZW50IGxpc3RzIGFuZCBleGNlcHRpb24gbGlzdHMgZm9yIGZ1bmN0aW9ucwotYXJlIGltcGxlbWVudGVkIGFzIFRocmlmdCBzdHJ1Y3RzLiBBbGwgdGhyZWUgY29uc3RydWN0cyBhcmUgaWRlbnRpY2FsIGluIGJvdGgKLW5vdGF0aW9uIGFuZCBiZWhhdmlvci4KLQotXHNlY3Rpb257VHJhbnNwb3J0fQotCi1UaGUgdHJhbnNwb3J0IGxheWVyIGlzIHVzZWQgYnkgdGhlIGdlbmVyYXRlZCBjb2RlIHRvIGZhY2lsaXRhdGUgZGF0YSB0cmFuc2Zlci4KLQotXHN1YnNlY3Rpb257SW50ZXJmYWNlfQotCi1BIGtleSBkZXNpZ24gY2hvaWNlIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUaHJpZnQgd2FzIHRvIGRlY291cGxlIHRoZQotdHJhbnNwb3J0IGxheWVyIGZyb20gdGhlIGNvZGUgZ2VuZXJhdGlvbiBsYXllci4gVGhvdWdoIFRocmlmdCBpcyB0eXBpY2FsbHkKLXVzZWQgb24gdG9wIG9mIHRoZSBUQ1AvSVAgc3RhY2sgd2l0aCBzdHJlYW1pbmcgc29ja2V0cyBhcyB0aGUgYmFzZSBsYXllciBvZgotY29tbXVuaWNhdGlvbiwgdGhlcmUgd2FzIG5vIGNvbXBlbGxpbmcgcmVhc29uIHRvIGJ1aWxkIHRoYXQgY29uc3RyYWludCBpbnRvCi10aGUgc3lzdGVtLiBUaGUgcGVyZm9ybWFuY2UgdHJhZGVvZmYgaW5jdXJyZWQgYnkgYW4gYWJzdHJhY3RlZCBJL08gbGF5ZXIKLShyb3VnaGx5IG9uZSB2aXJ0dWFsIG1ldGhvZCBsb29rdXAgLyBmdW5jdGlvbiBjYWxsIHBlciBvcGVyYXRpb24pIHdhcwotaW1tYXRlcmlhbCBjb21wYXJlZCB0byB0aGUgY29zdCBvZiBhY3R1YWwgSS9PIG9wZXJhdGlvbnMgKHR5cGljYWxseSBpbnZva2luZwotc3lzdGVtIGNhbGxzKS4KLQotRnVuZGFtZW50YWxseSwgZ2VuZXJhdGVkIFRocmlmdCBjb2RlIG9ubHkgbmVlZHMgdG8ga25vdyBob3cgdG8gcmVhZCBhbmQKLXdyaXRlIGRhdGEuIFRoZSBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIG9mIHRoZSBkYXRhIGFyZSBpcnJlbGV2YW50OyBpdCBtYXkgYmUgYQotc29ja2V0LCBhIHNlZ21lbnQgb2Ygc2hhcmVkIG1lbW9yeSwgb3IgYSBmaWxlIG9uIHRoZSBsb2NhbCBkaXNrLiBUaGUgVGhyaWZ0Ci10cmFuc3BvcnQgaW50ZXJmYWNlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLQotXGJlZ2lue2l0ZW1pemV9Ci1caXRlbSBcdGV4dHR0e29wZW59IE9wZW5zIHRoZSB0cmFucHNvcnQKLVxpdGVtIFx0ZXh0dHR7Y2xvc2V9IENsb3NlcyB0aGUgdHJhbnBvcnQKLVxpdGVtIFx0ZXh0dHR7aXNPcGVufSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KLVxpdGVtIFx0ZXh0dHR7cmVhZH0gUmVhZHMgZnJvbSB0aGUgdHJhbnNwb3J0Ci1caXRlbSBcdGV4dHR0e3dyaXRlfSBXcml0ZXMgdG8gdGhlIHRyYW5zcG9ydAotXGl0ZW0gXHRleHR0dHtmbHVzaH0gRm9yY2VzIGFueSBwZW5kaW5nIHdyaXRlcwotXGVuZHtpdGVtaXplfQotCi1UaGVyZSBhcmUgYSBmZXcgYWRkaXRpb25hbCBtZXRob2RzIG5vdCBkb2N1bWVudGVkIGhlcmUgd2hpY2ggYXJlIHVzZWQgdG8gYWlkCi1pbiBiYXRjaGluZyByZWFkcyBhbmQgb3B0aW9uYWxseSBzaWduYWxpbmcgdGhlIGNvbXBsZXRpb24gb2YgYSByZWFkIG9yCi13cml0ZSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0KLUluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZQotXHRleHR0dHtUVHJhbnNwb3J0fSBpbnRlcmZhY2UsIHRoZXJlIGlzIGFcXAotXHRleHR0dHtUU2VydmVyVHJhbnNwb3J0fSBpbnRlcmZhY2UKLXVzZWQgdG8gYWNjZXB0IG9yIGNyZWF0ZSBwcmltaXRpdmUgdHJhbnNwb3J0IG9iamVjdHMuIEl0cyBpbnRlcmZhY2UgaXMgYXMKLWZvbGxvd3M6Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gXHRleHR0dHtvcGVufSBPcGVucyB0aGUgdHJhbnNwb3J0Ci1caXRlbSBcdGV4dHR0e2xpc3Rlbn0gQmVnaW5zIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMKLVxpdGVtIFx0ZXh0dHR7YWNjZXB0fSBSZXR1cm5zIGEgbmV3IGNsaWVudCB0cmFuc3BvcnQKLVxpdGVtIFx0ZXh0dHR7Y2xvc2V9IENsb3NlcyB0aGUgdHJhbnNwb3J0Ci1cZW5ke2l0ZW1pemV9Ci0KLVxzdWJzZWN0aW9ue0ltcGxlbWVudGF0aW9ufQotCi1UaGUgdHJhbnNwb3J0IGludGVyZmFjZSBpcyBkZXNpZ25lZCBmb3Igc2ltcGxlIGltcGxlbWVudGF0aW9uIGluIGFueQotcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIE5ldyB0cmFuc3BvcnQgbWVjaGFuaXNtcyBjYW4gYmUgZWFzaWx5IGRlZmluZWQgYXMgbmVlZGVkCi1ieSBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzLgotCi1cc3Vic3Vic2VjdGlvbntUU29ja2V0fQotCi1UaGUgXHRleHR0dHtUU29ja2V0fSBjbGFzcyBpcyBpbXBsZW1lbnRlZCBhY3Jvc3MgYWxsIHRhcmdldCBsYW5ndWFnZXMuIEl0Ci1wcm92aWRlcyBhIGNvbW1vbiwgc2ltcGxlIGludGVyZmFjZSB0byBhIFRDUC9JUCBzdHJlYW0gc29ja2V0LgotCi1cc3Vic3Vic2VjdGlvbntURmlsZVRyYW5zcG9ydH0KLQotVGhlIFx0ZXh0dHR7VEZpbGVUcmFuc3BvcnR9IGlzIGFuIGFic3RyYWN0aW9uIG9mIGFuIG9uLWRpc2sgZmlsZSB0byBhIGRhdGEKLXN0cmVhbS4gSXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgb3V0IGEgc2V0IG9mIGluY29taW5nIFRocmlmdCByZXF1ZXN0cyB0byBhIGZpbGUKLW9uIGRpc2suIFRoZSBvbi1kaXNrIGRhdGEgY2FuIHRoZW4gYmUgcmVwbGF5ZWQgZnJvbSB0aGUgbG9nLCBlaXRoZXIgZm9yCi1wb3N0LXByb2Nlc3Npbmcgb3IgZm9yIHJlcHJvZHVjdGlvbiBhbmQvb3Igc2ltdWxhdGlvbiBvZiBwYXN0IGV2ZW50cy4KLQotXHN1YnN1YnNlY3Rpb257VXRpbGl0aWVzfQotCi1UaGUgVHJhbnNwb3J0IGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGVhc3kgZXh0ZW5zaW9uIHVzaW5nIGNvbW1vbgotT09QIHRlY2huaXF1ZXMsIHN1Y2ggYXMgY29tcG9zaXRpb24uIFNvbWUgc2ltcGxlIHV0aWxpdGVzIGluY2x1ZGUgdGhlCi1cdGV4dHR0e1RCdWZmZXJlZFRyYW5zcG9ydH0sIHdoaWNoIGJ1ZmZlcnMgdGhlIHdyaXRlcyBhbmQgcmVhZHMgb24gYW4KLXVuZGVybHlpbmcgdHJhbnNwb3J0LCB0aGUgXHRleHR0dHtURnJhbWVkVHJhbnNwb3J0fSwgd2hpY2ggdHJhbnNtaXRzIGRhdGEgd2l0aCBmcmFtZQotc2l6ZSBoZWFkZXJzIGZvciBjaHVua2luZyBvcHRpbWl6YXRpb24gb3Igbm9uYmxvY2tpbmcgb3BlcmF0aW9uLCBhbmQgdGhlCi1cdGV4dHR0e1RNZW1vcnlCdWZmZXJ9LCB3aGljaCBhbGxvd3MgcmVhZGluZyBhbmQgd3JpdGluZyBkaXJlY3RseSBmcm9tIHRoZSBoZWFwCi1vciBzdGFjayBtZW1vcnkgb3duZWQgYnkgdGhlIHByb2Nlc3MuCi0KLVxzZWN0aW9ue1Byb3RvY29sfQotCi1BIHNlY29uZCBtYWpvciBhYnN0cmFjdGlvbiBpbiBUaHJpZnQgaXMgdGhlIHNlcGFyYXRpb24gb2YgZGF0YSBzdHJ1Y3R1cmUgZnJvbQotdHJhbnNwb3J0IHJlcHJlc2VudGF0aW9uLiBUaHJpZnQgZW5mb3JjZXMgYSBjZXJ0YWluIG1lc3NhZ2luZyBzdHJ1Y3R1cmUgd2hlbgotdHJhbnNwb3J0aW5nIGRhdGEsIGJ1dCBpdCBpcyBhZ25vc3RpYyB0byB0aGUgcHJvdG9jb2wgZW5jb2RpbmcgaW4gdXNlLiBUaGF0IGlzLAotaXQgZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIgZGF0YSBpcyBlbmNvZGVkIGFzIFhNTCwgaHVtYW4tcmVhZGFibGUgQVNDSUksIG9yIGEKLWRlbnNlIGJpbmFyeSBmb3JtYXQgYXMgbG9uZyBhcyB0aGUgZGF0YSBzdXBwb3J0cyBhIGZpeGVkIHNldCBvZiBvcGVyYXRpb25zCi10aGF0IGFsbG93IGl0IHRvIGJlIGRldGVybWluaXN0aWNhbGx5IHJlYWQgYW5kIHdyaXR0ZW4gYnkgZ2VuZXJhdGVkIGNvZGUuCi0KLVxzdWJzZWN0aW9ue0ludGVyZmFjZX0KLQotVGhlIFRocmlmdCBQcm90b2NvbCBpbnRlcmZhY2UgaXMgdmVyeSBzdHJhaWdodGZvcndhcmQuIEl0IGZ1bmRhbWVudGFsbHkKLXN1cHBvcnRzIHR3byB0aGluZ3M6IDEpIGJpZGlyZWN0aW9uYWwgc2VxdWVuY2VkIG1lc3NhZ2luZywgYW5kCi0yKSBlbmNvZGluZyBvZiBiYXNlIHR5cGVzLCBjb250YWluZXJzLCBhbmQgc3RydWN0cy4KLQotXGJlZ2lue3ZlcmJhdGltfQotd3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxKQotd3JpdGVNZXNzYWdlRW5kKCkKLXdyaXRlU3RydWN0QmVnaW4obmFtZSkKLXdyaXRlU3RydWN0RW5kKCkKLXdyaXRlRmllbGRCZWdpbihuYW1lLCB0eXBlLCBpZCkKLXdyaXRlRmllbGRFbmQoKQotd3JpdGVGaWVsZFN0b3AoKQotd3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCi13cml0ZU1hcEVuZCgpCi13cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKLXdyaXRlTGlzdEVuZCgpCi13cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQotd3JpdGVTZXRFbmQoKQotd3JpdGVCb29sKGJvb2wpCi13cml0ZUJ5dGUoYnl0ZSkKLXdyaXRlSTE2KGkxNikKLXdyaXRlSTMyKGkzMikKLXdyaXRlSTY0KGk2NCkKLXdyaXRlRG91YmxlKGRvdWJsZSkKLXdyaXRlU3RyaW5nKHN0cmluZykKLQotbmFtZSwgdHlwZSwgc2VxID0gcmVhZE1lc3NhZ2VCZWdpbigpCi0gICAgICAgICAgICAgICAgICByZWFkTWVzc2FnZUVuZCgpCi1uYW1lID0gICAgICAgICAgICByZWFkU3RydWN0QmVnaW4oKQotICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdEVuZCgpCi1uYW1lLCB0eXBlLCBpZCA9ICByZWFkRmllbGRCZWdpbigpCi0gICAgICAgICAgICAgICAgICByZWFkRmllbGRFbmQoKQotaywgdiwgc2l6ZSA9ICAgICAgcmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICAgICAgICAgIHJlYWRNYXBFbmQoKQotZXR5cGUsIHNpemUgPSAgICAgcmVhZExpc3RCZWdpbigpCi0gICAgICAgICAgICAgICAgICByZWFkTGlzdEVuZCgpCi1ldHlwZSwgc2l6ZSA9ICAgICByZWFkU2V0QmVnaW4oKQotICAgICAgICAgICAgICAgICAgcmVhZFNldEVuZCgpCi1ib29sID0gICAgICAgICAgICByZWFkQm9vbCgpCi1ieXRlID0gICAgICAgICAgICByZWFkQnl0ZSgpCi1pMTYgPSAgICAgICAgICAgICByZWFkSTE2KCkKLWkzMiA9ICAgICAgICAgICAgIHJlYWRJMzIoKQotaTY0ID0gICAgICAgICAgICAgcmVhZEk2NCgpCi1kb3VibGUgPSAgICAgICAgICByZWFkRG91YmxlKCkKLXN0cmluZyA9ICAgICAgICAgIHJlYWRTdHJpbmcoKQotXGVuZHt2ZXJiYXRpbX0KLQotTm90ZSB0aGF0IGV2ZXJ5IFx0ZXh0dHR7d3JpdGV9IGZ1bmN0aW9uIGhhcyBleGFjdGx5IG9uZSBcdGV4dHR0e3JlYWR9IGNvdW50ZXJwYXJ0LCB3aXRoCi10aGUgZXhjZXB0aW9uIG9mIFx0ZXh0dHR7d3JpdGVGaWVsZFN0b3AoKX0uIFRoaXMgaXMgYSBzcGVjaWFsIG1ldGhvZAotdGhhdCBzaWduYWxzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuIFRoZSBwcm9jZWR1cmUgZm9yIHJlYWRpbmcgYSBzdHJ1Y3QgaXMgdG8KLVx0ZXh0dHR7cmVhZEZpZWxkQmVnaW4oKX0gdW50aWwgdGhlIHN0b3AgZmllbGQgaXMgZW5jb3VudGVyZWQsIGFuZCB0aGVuIHRvCi1cdGV4dHR0e3JlYWRTdHJ1Y3RFbmQoKX0uICBUaGUKLWdlbmVyYXRlZCBjb2RlIHJlbGllcyB1cG9uIHRoaXMgY2FsbCBzZXF1ZW5jZSB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIHdyaXR0ZW4gYnkKLWEgcHJvdG9jb2wgZW5jb2RlciBjYW4gYmUgcmVhZCBieSBhIG1hdGNoaW5nIHByb3RvY29sIGRlY29kZXIuIEZ1cnRoZXIgbm90ZQotdGhhdCB0aGlzIHNldCBvZiBmdW5jdGlvbnMgaXMgYnkgZGVzaWduIG1vcmUgcm9idXN0IHRoYW4gbmVjZXNzYXJ5LgotRm9yIGV4YW1wbGUsIFx0ZXh0dHR7d3JpdGVTdHJ1Y3RFbmQoKX0gaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYXMgdGhlIGVuZCBvZgotYSBzdHJ1Y3QgbWF5IGJlIGltcGxpZWQgYnkgdGhlIHN0b3AgZmllbGQuIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgZm9yCi12ZXJib3NlIHByb3RvY29scyBpbiB3aGljaCBpdCBpcyBjbGVhbmVyIHRvIHNlcGFyYXRlIHRoZXNlIGNhbGxzIChlLmcuIGEgY2xvc2luZwotXHRleHR0dHs8L3N0cnVjdD59IHRhZyBpbiBYTUwpLgotCi1cc3Vic2VjdGlvbntTdHJ1Y3R1cmV9Ci0KLVRocmlmdCBzdHJ1Y3R1cmVzIGFyZSBkZXNpZ25lZCB0byBzdXBwb3J0IGVuY29kaW5nIGludG8gYSBzdHJlYW1pbmcKLXByb3RvY29sLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG5ldmVyIG5lZWQgdG8gZnJhbWUgb3IgY29tcHV0ZSB0aGUKLWVudGlyZSBkYXRhIGxlbmd0aCBvZiBhIHN0cnVjdHVyZSBwcmlvciB0byBlbmNvZGluZyBpdC4gVGhpcyBpcyBjcml0aWNhbCB0bwotcGVyZm9ybWFuY2UgaW4gbWFueSBzY2VuYXJpb3MuIENvbnNpZGVyIGEgbG9uZyBsaXN0IG9mIHJlbGF0aXZlbHkgbGFyZ2UKLXN0cmluZ3MuIElmIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UgcmVxdWlyZWQgcmVhZGluZyBvciB3cml0aW5nIGEgbGlzdCB0byBiZSBhbgotYXRvbWljIG9wZXJhdGlvbiwgdGhlbiB0aGUgaW1wbGVtZW50YXRpb24gd291bGQgbmVlZCB0byBwZXJmb3JtIGEgbGluZWFyIHBhc3Mgb3ZlciB0aGUKLWVudGlyZSBsaXN0IGJlZm9yZSBlbmNvZGluZyBhbnkgZGF0YS4gSG93ZXZlciwgaWYgdGhlIGxpc3QgY2FuIGJlIHdyaXR0ZW4KLWFzIGl0ZXJhdGlvbiBpcyBwZXJmb3JtZWQsIHRoZSBjb3JyZXNwb25kaW5nIHJlYWQgbWF5IGJlZ2luIGluIHBhcmFsbGVsLAotdGhlb3JldGljYWxseSBvZmZlcmluZyBhbiBlbmQtdG8tZW5kIHNwZWVkdXAgb2YgJChrTiAtIEMpJCwgd2hlcmUgJE4kIGlzIHRoZSBzaXplCi1vZiB0aGUgbGlzdCwgJGskIHRoZSBjb3N0IGZhY3RvciBhc3NvY2lhdGVkIHdpdGggc2VyaWFsaXppbmcgYSBzaW5nbGUKLWVsZW1lbnQsIGFuZCAkQyQgaXMgZml4ZWQgb2Zmc2V0IGZvciB0aGUgZGVsYXkgYmV0d2VlbiBkYXRhIGJlaW5nIHdyaXR0ZW4KLWFuZCBiZWNvbWluZyBhdmFpbGFibGUgdG8gcmVhZC4KLQotU2ltaWxhcmx5LCBzdHJ1Y3RzIGRvIG5vdCBlbmNvZGUgdGhlaXIgZGF0YSBsZW5ndGhzIGEgcHJpb3JpLiBJbnN0ZWFkLCB0aGV5IGFyZQotZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIGZpZWxkcywgd2l0aCBlYWNoIGZpZWxkIGhhdmluZyBhIHR5cGUgc3BlY2lmaWVyIGFuZCBhCi11bmlxdWUgZmllbGQgaWRlbnRpZmllci4gTm90ZSB0aGF0IHRoZSBpbmNsdXNpb24gb2YgdHlwZSBzcGVjaWZpZXJzIGFsbG93cwotdGhlIHByb3RvY29sIHRvIGJlIHNhZmVseSBwYXJzZWQgYW5kIGRlY29kZWQgd2l0aG91dCBhbnkgZ2VuZXJhdGVkIGNvZGUKLW9yIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgSURMIGZpbGUuIFN0cnVjdHMgYXJlIHRlcm1pbmF0ZWQgYnkgYSBmaWVsZCBoZWFkZXIKLXdpdGggYSBzcGVjaWFsIFx0ZXh0dHR7U1RPUH0gdHlwZS4gQmVjYXVzZSBhbGwgdGhlIGJhc2ljIHR5cGVzIGNhbiBiZSByZWFkCi1kZXRlcm1pbmlzdGljYWxseSwgYWxsIHN0cnVjdHMgKGV2ZW4gdGhvc2UgY29udGFpbmluZyBvdGhlciBzdHJ1Y3RzKSBjYW4gYmUKLXJlYWQgZGV0ZXJtaW5pc3RpY2FsbHkuIFRoZSBUaHJpZnQgcHJvdG9jb2wgaXMgc2VsZi1kZWxpbWl0aW5nIHdpdGhvdXQgYW55Ci1mcmFtaW5nIGFuZCByZWdhcmRsZXNzIG9mIHRoZSBlbmNvZGluZyBmb3JtYXQuCi0KLUluIHNpdHVhdGlvbnMgd2hlcmUgc3RyZWFtaW5nIGlzIHVubmVjZXNzYXJ5IG9yIGZyYW1pbmcgaXMgYWR2YW50YWdlb3VzLCBpdAotY2FuIGJlIHZlcnkgc2ltcGx5IGFkZGVkIGludG8gdGhlIHRyYW5zcG9ydCBsYXllciwgdXNpbmcgdGhlCi1cdGV4dHR0e1RGcmFtZWRUcmFuc3BvcnR9IGFic3RyYWN0aW9uLgotCi1cc3Vic2VjdGlvbntJbXBsZW1lbnRhdGlvbn0KLQotRmFjZWJvb2sgaGFzIGltcGxlbWVudGVkIGFuZCBkZXBsb3llZCBhIHNwYWNlLWVmZmljaWVudCBiaW5hcnkgcHJvdG9jb2wgd2hpY2gKLWlzIHVzZWQgYnkgbW9zdCBiYWNrZW5kIHNlcnZpY2VzLiBFc3NlbnRpYWxseSwgaXQgd3JpdGVzIGFsbCBkYXRhCi1pbiBhIGZsYXQgYmluYXJ5IGZvcm1hdC4gSW50ZWdlciB0eXBlcyBhcmUgY29udmVydGVkIHRvIG5ldHdvcmsgYnl0ZSBvcmRlciwKLXN0cmluZ3MgYXJlIHByZXBlbmRlZCB3aXRoIHRoZWlyIGJ5dGUgbGVuZ3RoLCBhbmQgYWxsIG1lc3NhZ2UgYW5kIGZpZWxkIGhlYWRlcnMKLWFyZSB3cml0dGVuIHVzaW5nIHRoZSBwcmltaXRpdmUgaW50ZWdlciBzZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMuIFN0cmluZyBuYW1lcwotZm9yIGZpZWxkcyBhcmUgb21pdHRlZCAtIHdoZW4gdXNpbmcgZ2VuZXJhdGVkIGNvZGUsIGZpZWxkIGlkZW50aWZpZXJzIGFyZQotc3VmZmljaWVudC4KLQotV2UgZGVjaWRlZCBhZ2FpbnN0IHNvbWUgZXh0cmVtZSBzdG9yYWdlIG9wdGltaXphdGlvbnMgKGkuZS4gcGFja2luZwotc21hbGwgaW50ZWdlcnMgaW50byBBU0NJSSBvciB1c2luZyBhIDctYml0IGNvbnRpbnVhdGlvbiBmb3JtYXQpIGZvciB0aGUgc2FrZQotb2Ygc2ltcGxpY2l0eSBhbmQgY2xhcml0eSBpbiB0aGUgY29kZS4gVGhlc2UgYWx0ZXJhdGlvbnMgY2FuIGVhc2lseSBiZSBtYWRlCi1pZiBhbmQgd2hlbiB3ZSBlbmNvdW50ZXIgYSBwZXJmb3JtYW5jZS1jcml0aWNhbCB1c2UgY2FzZSB0aGF0IGRlbWFuZHMgdGhlbS4KLQotXHNlY3Rpb257VmVyc2lvbmluZ30KLQotVGhyaWZ0IGlzIHJvYnVzdCBpbiB0aGUgZmFjZSBvZiB2ZXJzaW9uaW5nIGFuZCBkYXRhIGRlZmluaXRpb24gY2hhbmdlcy4gVGhpcwotaXMgY3JpdGljYWwgdG8gZW5hYmxlIHN0YWdlZCByb2xsb3V0cyBvZiBjaGFuZ2VzIHRvIGRlcGxveWVkIHNlcnZpY2VzLiBUaGUKLXN5c3RlbSBtdXN0IGJlIGFibGUgdG8gc3VwcG9ydCByZWFkaW5nIG9mIG9sZCBkYXRhIGZyb20gbG9nIGZpbGVzLCBhcyB3ZWxsIGFzCi1yZXF1ZXN0cyBmcm9tIG91dC1vZi1kYXRlIGNsaWVudHMgdG8gbmV3IHNlcnZlcnMsIGFuZCB2aWNlIHZlcnNhLgotCi1cc3Vic2VjdGlvbntGaWVsZCBJZGVudGlmaWVyc30KLQotVmVyc2lvbmluZyBpbiBUaHJpZnQgaXMgaW1wbGVtZW50ZWQgdmlhIGZpZWxkIGlkZW50aWZpZXJzLiBUaGUgZmllbGQgaGVhZGVyCi1mb3IgZXZlcnkgbWVtYmVyIG9mIGEgc3RydWN0IGluIFRocmlmdCBpcyBlbmNvZGVkIHdpdGggYSB1bmlxdWUgZmllbGQKLWlkZW50aWZpZXIuIFRoZSBjb21iaW5hdGlvbiBvZiB0aGlzIGZpZWxkIGlkZW50aWZpZXIgYW5kIGl0cyB0eXBlIHNwZWNpZmllcgotaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgZmllbGQuIFRoZSBUaHJpZnQgZGVmaW5pdGlvbiBsYW5ndWFnZQotc3VwcG9ydHMgYXV0b21hdGljIGFzc2lnbm1lbnQgb2YgZmllbGQgaWRlbnRpZmllcnMsIGJ1dCBpdCBpcyBnb29kCi1wcm9ncmFtbWluZyBwcmFjdGljZSB0byBhbHdheXMgZXhwbGljaXRseSBzcGVjaWZ5IGZpZWxkIGlkZW50aWZpZXJzLgotSWRlbnRpZmllcnMgYXJlIHNwZWNpZmllZCBhcyBmb2xsb3dzOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdHJ1Y3QgRXhhbXBsZSB7Ci0gIDE6aTMyIG51bWJlcj0xMCwKLSAgMjppNjQgYmlnTnVtYmVyLAotICAzOmRvdWJsZSBkZWNpbWFscywKLSAgNDpzdHJpbmcgbmFtZT0idGhyaWZ0eSIKLX1cZW5ke3ZlcmJhdGltfQotCi1UbyBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiBtYW51YWxseSBhbmQgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZGVudGlmaWVycywKLWZpZWxkcyB3aXRoIGlkZW50aWZpZXJzIG9taXR0ZWQgYXJlIGFzc2lnbmVkIGlkZW50aWZpZXJzCi1kZWNyZW1lbnRpbmcgZnJvbSAtMSwgYW5kIHRoZSBsYW5ndWFnZSBvbmx5IHN1cHBvcnRzIHRoZSBtYW51YWwgYXNzaWdubWVudCBvZgotcG9zaXRpdmUgaWRlbnRpZmllcnMuCi0KLVdoZW4gZGF0YSBpcyBiZWluZyBkZXNlcmlhbGl6ZWQsIHRoZSBnZW5lcmF0ZWQgY29kZSBjYW4gdXNlIHRoZXNlIGlkZW50aWZpZXJzCi10byBwcm9wZXJseSBpZGVudGlmeSB0aGUgZmllbGQgYW5kIGRldGVybWluZSB3aGV0aGVyIGl0IGFsaWducyB3aXRoIGEgZmllbGQgaW4KLWl0cyBkZWZpbml0aW9uIGZpbGUuIElmIGEgZmllbGQgaWRlbnRpZmllciBpcyBub3QgcmVjb2duaXplZCwgdGhlIGdlbmVyYXRlZAotY29kZSBjYW4gdXNlIHRoZSB0eXBlIHNwZWNpZmllciB0byBza2lwIHRoZSB1bmtub3duIGZpZWxkIHdpdGhvdXQgYW55IGVycm9yLgotQWdhaW4sIHRoaXMgaXMgcG9zc2libGUgZHVlIHRvIHRoZSBmYWN0IHRoYXQgYWxsIGRhdGF0eXBlcyBhcmUgc2VsZgotZGVsaW1pdGluZy4KLQotRmllbGQgaWRlbnRpZmllcnMgY2FuIChhbmQgc2hvdWxkKSBhbHNvIGJlIHNwZWNpZmllZCBpbiBmdW5jdGlvbiBhcmd1bWVudAotbGlzdHMuIEluIGZhY3QsIGFyZ3VtZW50IGxpc3RzIGFyZSBub3Qgb25seSByZXByZXNlbnRlZCBhcyBzdHJ1Y3RzIG9uIHRoZQotYmFja2VuZCwgYnV0IGFjdHVhbGx5IHNoYXJlIHRoZSBzYW1lIGNvZGUgaW4gdGhlIGNvbXBpbGVyIGZyb250ZW5kLiBUaGlzCi1hbGxvd3MgZm9yIHZlcnNpb24tc2FmZSBtb2RpZmljYXRpb24gb2YgbWV0aG9kIHBhcmFtZXRlcnMKLQotXGJlZ2lue3ZlcmJhdGltfQotc2VydmljZSBTdHJpbmdDYWNoZSB7Ci0gIHZvaWQgc2V0KDE6aTMyIGtleSwgMjpzdHJpbmcgdmFsdWUpLAotICBzdHJpbmcgZ2V0KDE6aTMyIGtleSkgdGhyb3dzICgxOktleU5vdEZvdW5kIGtuZiksCi0gIHZvaWQgZGVsZXRlKDE6aTMyIGtleSkKLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBzeW50YXggZm9yIHNwZWNpZnlpbmcgZmllbGQgaWRlbnRpZmllcnMgd2FzIGNob3NlbiB0byBlY2hvIHRoZWlyIHN0cnVjdHVyZS4KLVN0cnVjdHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBkaWN0aW9uYXJ5IHdoZXJlIHRoZSBpZGVudGlmaWVycyBhcmUga2V5cywgYW5kCi10aGUgdmFsdWVzIGFyZSBzdHJvbmdseS10eXBlZCBuYW1lZCBmaWVsZHMuCi0KLUZpZWxkIGlkZW50aWZpZXJzIGludGVybmFsbHkgdXNlIHRoZSBcdGV4dHR0e2kxNn0gVGhyaWZ0IHR5cGUuIE5vdGUsIGhvd2V2ZXIsCi10aGF0IHRoZSBcdGV4dHR0e1RQcm90b2NvbH0gYWJzdHJhY3Rpb24gbWF5IGVuY29kZSBpZGVudGlmaWVycyBpbiBhbnkgZm9ybWF0LgotCi1cc3Vic2VjdGlvbntJc3NldH0KLQotV2hlbiBhbiB1bmV4cGVjdGVkIGZpZWxkIGlzIGVuY291bnRlcmVkLCBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgYW5kCi1kaXNjYXJkZWQuIFdoZW4gYW4gZXhwZWN0ZWQgZmllbGQgaXMgbm90IGZvdW5kLCB0aGVyZSBtdXN0IGJlIHNvbWUgd2F5IHRvCi1zaWduYWwgdG8gdGhlIGRldmVsb3BlciB0aGF0IGl0IHdhcyBub3QgcHJlc2VudC4gVGhpcyBpcyBpbXBsZW1lbnRlZCB2aWEgYW4KLWlubmVyIFx0ZXh0dHR7aXNzZXR9IHN0cnVjdHVyZSBpbnNpZGUgdGhlIGRlZmluZWQgb2JqZWN0cy4gKElzc2V0IGZ1bmN0aW9uYWxpdHkKLWlzIGltcGxpY2l0IHdpdGggYSBcdGV4dHR0e251bGx9IHZhbHVlIGluIFBIUCwgXHRleHR0dHtOb25lfSBpbiBQeXRob24KLWFuZCBcdGV4dHR0e25pbH0gaW4gUnVieS4pIEVzc2VudGlhbGx5LAotdGhlIGlubmVyIFx0ZXh0dHR7aXNzZXR9IG9iamVjdCBvZiBlYWNoIFRocmlmdCBzdHJ1Y3QgY29udGFpbnMgYSBib29sZWFuIHZhbHVlCi1mb3IgZWFjaCBmaWVsZCB3aGljaCBkZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoYXQgZmllbGQgaXMgcHJlc2VudCBpbiB0aGUKLXN0cnVjdC4gV2hlbiBhIHJlYWRlciByZWNlaXZlcyBhIHN0cnVjdCwgaXQgc2hvdWxkIGNoZWNrIGZvciBhIGZpZWxkIGJlaW5nIHNldAotYmVmb3JlIG9wZXJhdGluZyBkaXJlY3RseSBvbiBpdC4KLQotXGJlZ2lue3ZlcmJhdGltfQotY2xhc3MgRXhhbXBsZSB7Ci0gcHVibGljOgotICBFeGFtcGxlKCkgOgotICAgIG51bWJlcigxMCksCi0gICAgYmlnTnVtYmVyKDApLAotICAgIGRlY2ltYWxzKDApLAotICAgIG5hbWUoInRocmlmdHkiKSB7fQotCi0gIGludDMyX3QgbnVtYmVyOwotICBpbnQ2NF90IGJpZ051bWJlcjsKLSAgZG91YmxlIGRlY2ltYWxzOwotICBzdGQ6OnN0cmluZyBuYW1lOwotCi0gIHN0cnVjdCBfX2lzc2V0IHsKLSAgICBfX2lzc2V0KCkgOgotICAgICAgbnVtYmVyKGZhbHNlKSwKLSAgICAgIGJpZ051bWJlcihmYWxzZSksCi0gICAgICBkZWNpbWFscyhmYWxzZSksCi0gICAgICBuYW1lKGZhbHNlKSB7fQotICAgIGJvb2wgbnVtYmVyOwotICAgIGJvb2wgYmlnTnVtYmVyOwotICAgIGJvb2wgZGVjaW1hbHM7Ci0gICAgYm9vbCBuYW1lOwotICB9IF9faXNzZXQ7Ci0uLi4KLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVxzdWJzZWN0aW9ue0Nhc2UgQW5hbHlzaXN9Ci0KLVRoZXJlIGFyZSBmb3VyIGNhc2VzIGluIHdoaWNoIHZlcnNpb24gbWlzbWF0Y2hlcyBtYXkgb2NjdXIuCi0KLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbSBcdGV4dGl0e0FkZGVkIGZpZWxkLCBvbGQgY2xpZW50LCBuZXcgc2VydmVyLn0gSW4gdGhpcyBjYXNlLCB0aGUgb2xkCi1jbGllbnQgZG9lcyBub3Qgc2VuZCB0aGUgbmV3IGZpZWxkLiBUaGUgbmV3IHNlcnZlciByZWNvZ25pemVzIHRoYXQgdGhlIGZpZWxkCi1pcyBub3Qgc2V0LCBhbmQgaW1wbGVtZW50cyBkZWZhdWx0IGJlaGF2aW9yIGZvciBvdXQtb2YtZGF0ZSByZXF1ZXN0cy4KLVxpdGVtIFx0ZXh0aXR7UmVtb3ZlZCBmaWVsZCwgb2xkIGNsaWVudCwgbmV3IHNlcnZlci59IEluIHRoaXMgY2FzZSwgdGhlIG9sZAotY2xpZW50IHNlbmRzIHRoZSByZW1vdmVkIGZpZWxkLiBUaGUgbmV3IHNlcnZlciBzaW1wbHkgaWdub3JlcyBpdC4KLVxpdGVtIFx0ZXh0aXR7QWRkZWQgZmllbGQsIG5ldyBjbGllbnQsIG9sZCBzZXJ2ZXIufSBUaGUgbmV3IGNsaWVudCBzZW5kcyBhCi1maWVsZCB0aGF0IHRoZSBvbGQgc2VydmVyIGRvZXMgbm90IHJlY29nbml6ZS4gVGhlIG9sZCBzZXJ2ZXIgc2ltcGx5IGlnbm9yZXMKLWl0IGFuZCBwcm9jZXNzZXMgYXMgbm9ybWFsLgotXGl0ZW0gXHRleHRpdHtSZW1vdmVkIGZpZWxkLCBuZXcgY2xpZW50LCBvbGQgc2VydmVyLn0gVGhpcyBpcyB0aGUgbW9zdAotZGFuZ2Vyb3VzIGNhc2UsIGFzIHRoZSBvbGQgc2VydmVyIGlzIHVubGlrZWx5IHRvIGhhdmUgc3VpdGFibGUgZGVmYXVsdAotYmVoYXZpb3IgaW1wbGVtZW50ZWQgZm9yIHRoZSBtaXNzaW5nIGZpZWxkLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGluIHRoaXMKLXNpdHVhdGlvbiB0aGUgbmV3IHNlcnZlciBiZSByb2xsZWQgb3V0IHByaW9yIHRvIHRoZSBuZXcgY2xpZW50cy4KLVxlbmR7ZW51bWVyYXRlfQotCi1cc3Vic2VjdGlvbntQcm90b2NvbC9UcmFuc3BvcnQgVmVyc2lvbmluZ30KLVRoZSBcdGV4dHR0e1RQcm90b2NvbH0gYWJzdHJhY3Rpb25zIGFyZSBhbHNvIGRlc2lnbmVkIHRvIGdpdmUgcHJvdG9jb2wKLWltcGxlbWVudGF0aW9ucyB0aGUgZnJlZWRvbSB0byB2ZXJzaW9uIHRoZW1zZWx2ZXMgaW4gd2hhdGV2ZXIgbWFubmVyIHRoZXkKLXNlZSBmaXQuIFNwZWNpZmljYWxseSwgYW55IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gc2VuZCB3aGF0ZXZlcgotaXQgbGlrZXMgaW4gdGhlIFx0ZXh0dHR7d3JpdGVNZXNzYWdlQmVnaW4oKX0gY2FsbC4gSXQgaXMgZW50aXJlbHkgdXAgdG8gdGhlCi1pbXBsZW1lbnRvciBob3cgdG8gaGFuZGxlIHZlcnNpb25pbmcgYXQgdGhlIHByb3RvY29sIGxldmVsLiBUaGUga2V5IHBvaW50IGlzCi10aGF0IHByb3RvY29sIGVuY29kaW5nIGNoYW5nZXMgYXJlIHNhZmVseSBpc29sYXRlZCBmcm9tIGludGVyZmFjZSBkZWZpbml0aW9uCi12ZXJzaW9uIGNoYW5nZXMuCi0KLU5vdGUgdGhhdCB0aGUgZXhhY3Qgc2FtZSBpcyB0cnVlIG9mIHRoZSBcdGV4dHR0e1RUcmFuc3BvcnR9IGludGVyZmFjZS4gRm9yCi1leGFtcGxlLCBpZiB3ZSB3aXNoZWQgdG8gYWRkIHNvbWUgbmV3IGNoZWNrc3VtbWluZyBvciBlcnJvciBkZXRlY3Rpb24gdG8gdGhlCi1cdGV4dHR0e1RGaWxlVHJhbnNwb3J0fSwgd2UgY291bGQgc2ltcGx5IGFkZCBhIHZlcnNpb24gaGVhZGVyIGludG8gdGhlCi1kYXRhIGl0IHdyaXRlcyB0byB0aGUgZmlsZSBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgd291bGQgc3RpbGwgYWNjZXB0IG9sZAotbG9nIGZpbGVzIHdpdGhvdXQgdGhlIGdpdmVuIGhlYWRlci4KLQotXHNlY3Rpb257UlBDIEltcGxlbWVudGF0aW9ufQotCi1cc3Vic2VjdGlvbntUUHJvY2Vzc29yfQotCi1UaGUgbGFzdCBjb3JlIGludGVyZmFjZSBpbiB0aGUgVGhyaWZ0IGRlc2lnbiBpcyB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSwKLXBlcmhhcHMgdGhlIG1vc3Qgc2ltcGxlIG9mIHRoZSBjb25zdHJ1Y3RzLiBUaGUgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWludGVyZmFjZSBUUHJvY2Vzc29yIHsKLSAgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpbiwgVFByb3RvY29sIG91dCkKLSAgICB0aHJvd3MgVEV4Y2VwdGlvbgotfQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIGtleSBkZXNpZ24gaWRlYSBoZXJlIGlzIHRoYXQgdGhlIGNvbXBsZXggc3lzdGVtcyB3ZSBidWlsZCBjYW4gZnVuZGFtZW50YWxseQotYmUgYnJva2VuIGRvd24gaW50byBhZ2VudHMgb3Igc2VydmljZXMgdGhhdCBvcGVyYXRlIG9uIGlucHV0cyBhbmQgb3V0cHV0cy4gSW4KLW1vc3QgY2FzZXMsIHRoZXJlIGlzIGFjdHVhbGx5IGp1c3Qgb25lIGlucHV0IGFuZCBvdXRwdXQgKGFuIFJQQyBjbGllbnQpIHRoYXQKLW5lZWRzIGhhbmRsaW5nLgotCi1cc3Vic2VjdGlvbntHZW5lcmF0ZWQgQ29kZX0KLQotV2hlbiBhIHNlcnZpY2UgaXMgZGVmaW5lZCwgd2UgZ2VuZXJhdGUgYQotXHRleHR0dHtUUHJvY2Vzc29yfSBpbnN0YW5jZSBjYXBhYmxlIG9mIGhhbmRsaW5nIFJQQyByZXF1ZXN0cyB0byB0aGF0IHNlcnZpY2UsCi11c2luZyBhIGZldyBoZWxwZXJzLiBUaGUgZnVuZGFtZW50YWwgc3RydWN0dXJlIChpbGx1c3RyYXRlZCBpbiBwc2V1ZG8tQysrKSBpcwotYXMgZm9sbG93czoKLQotXGJlZ2lue3ZlcmJhdGltfQotU2VydmljZS50aHJpZnQKLSA9PiBTZXJ2aWNlLmNwcAotICAgICBpbnRlcmZhY2UgU2VydmljZUlmCi0gICAgIGNsYXNzIFNlcnZpY2VDbGllbnQgOiB2aXJ0dWFsIFNlcnZpY2VJZgotICAgICAgIFRQcm90b2NvbCBpbgotICAgICAgIFRQcm90b2NvbCBvdXQKLSAgICAgY2xhc3MgU2VydmljZVByb2Nlc3NvciA6IFRQcm9jZXNzb3IKLSAgICAgICBTZXJ2aWNlSWYgaGFuZGxlcgotCi1TZXJ2aWNlSGFuZGxlci5jcHAKLSBjbGFzcyBTZXJ2aWNlSGFuZGxlciA6IHZpcnR1YWwgU2VydmljZUlmCi0KLVRTZXJ2ZXIuY3BwCi0gVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0LAotICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdGZhY3RvcnksCi0gICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHBmYWN0b3J5KQotIHNlcnZlKCkKLVxlbmR7dmVyYmF0aW19Ci0KLUZyb20gdGhlIFRocmlmdCBkZWZpbml0aW9uIGZpbGUsIHdlIGdlbmVyYXRlIHRoZSB2aXJ0dWFsIHNlcnZpY2UgaW50ZXJmYWNlLgotQSBjbGllbnQgY2xhc3MgaXMgZ2VuZXJhdGVkLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgYW5kCi11c2VzIHR3byBcdGV4dHR0e1RQcm90b2NvbH0gaW5zdGFuY2VzIHRvIHBlcmZvcm0gdGhlIEkvTyBvcGVyYXRpb25zLiBUaGUKLWdlbmVyYXRlZCBwcm9jZXNzb3IgaW1wbGVtZW50cyB0aGUgXHRleHR0dHtUUHJvY2Vzc29yfSBpbnRlcmZhY2UuIFRoZSBnZW5lcmF0ZWQKLWNvZGUgaGFzIGFsbCB0aGUgbG9naWMgdG8gaGFuZGxlIFJQQyBpbnZvY2F0aW9ucyB2aWEgdGhlIFx0ZXh0dHR7cHJvY2VzcygpfQotY2FsbCwgYW5kIHRha2VzIGFzIGEgcGFyYW1ldGVyIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGludGVyZmFjZSwgYXMKLWltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIuCi0KLVRoZSB1c2VyIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgaW4gc2VwYXJhdGUsCi1ub24tZ2VuZXJhdGVkIHNvdXJjZSBjb2RlLgotCi1cc3Vic2VjdGlvbntUU2VydmVyfQotCi1GaW5hbGx5LCB0aGUgVGhyaWZ0IGNvcmUgbGlicmFyaWVzIHByb3ZpZGUgYSBcdGV4dHR0e1RTZXJ2ZXJ9IGFic3RyYWN0aW9uLgotVGhlIFx0ZXh0dHR7VFNlcnZlcn0gb2JqZWN0IGdlbmVyYWxseSB3b3JrcyBhcyBmb2xsb3dzLgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFVzZSB0aGUgXHRleHR0dHtUU2VydmVyVHJhbnNwb3J0fSB0byBnZXQgYSBcdGV4dHR0e1RUcmFuc3BvcnR9Ci1caXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFRyYW5zcG9ydEZhY3Rvcnl9IHRvIG9wdGlvbmFsbHkgY29udmVydCB0aGUgcHJpbWl0aXZlCi10cmFuc3BvcnQgaW50byBhIHN1aXRhYmxlIGFwcGxpY2F0aW9uIHRyYW5zcG9ydCAodHlwaWNhbGx5IHRoZQotXHRleHR0dHtUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5fSBpcyB1c2VkIGhlcmUpCi1caXRlbSBVc2UgdGhlIFx0ZXh0dHR7VFByb3RvY29sRmFjdG9yeX0gdG8gY3JlYXRlIGFuIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wKLWZvciB0aGUgXHRleHR0dHtUVHJhbnNwb3J0fQotXGl0ZW0gSW52b2tlIHRoZSBcdGV4dHR0e3Byb2Nlc3MoKX0gbWV0aG9kIG9mIHRoZSBcdGV4dHR0e1RQcm9jZXNzb3J9IG9iamVjdAotXGVuZHtpdGVtaXplfQotCi1UaGUgbGF5ZXJzIGFyZSBhcHByb3ByaWF0ZWx5IHNlcGFyYXRlZCBzdWNoIHRoYXQgdGhlIHNlcnZlciBjb2RlIG5lZWRzIHRvIGtub3cKLW5vdGhpbmcgYWJvdXQgYW55IG9mIHRoZSB0cmFuc3BvcnRzLCBlbmNvZGluZ3MsIG9yIGFwcGxpY2F0aW9ucyBpbiBwbGF5LiBUaGUKLXNlcnZlciBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIGFyb3VuZCBjb25uZWN0aW9uIGhhbmRsaW5nLCB0aHJlYWRpbmcsIGV0Yy4KLXdoaWxlIHRoZSBwcm9jZXNzb3IgZGVhbHMgd2l0aCBSUEMuIFRoZSBvbmx5IGNvZGUgd3JpdHRlbiBieSB0aGUgYXBwbGljYXRpb24KLWRldmVsb3BlciBsaXZlcyBpbiB0aGUgZGVmaW5pdGlvbmFsIFRocmlmdCBmaWxlIGFuZCB0aGUgaW50ZXJmYWNlCi1pbXBsZW1lbnRhdGlvbi4KLQotRmFjZWJvb2sgaGFzIGRlcGxveWVkIG11bHRpcGxlIFx0ZXh0dHR7VFNlcnZlcn0gaW1wbGVtZW50YXRpb25zLCBpbmNsdWRpbmcKLXRoZSBzaW5nbGUtdGhyZWFkZWQgXHRleHR0dHtUU2ltcGxlU2VydmVyfSwgdGhyZWFkLXBlci1jb25uZWN0aW9uCi1cdGV4dHR0e1RUaHJlYWRlZFNlcnZlcn0sIGFuZCB0aHJlYWQtcG9vbGluZyBcdGV4dHR0e1RUaHJlYWRQb29sU2VydmVyfS4KLQotVGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0gaW50ZXJmYWNlIGlzIHZlcnkgZ2VuZXJhbCBieSBkZXNpZ24uIFRoZXJlIGlzIG5vCi1yZXF1aXJlbWVudCB0aGF0IGEgXHRleHR0dHtUU2VydmVyfSB0YWtlIGEgZ2VuZXJhdGVkIFx0ZXh0dHR7VFByb2Nlc3Nvcn0KLW9iamVjdC4gVGhyaWZ0IGFsbG93cyB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGVhc2lseSB3cml0ZSBhbnkgdHlwZSBvZgotc2VydmVyIHRoYXQgb3BlcmF0ZXMgb24gXHRleHR0dHtUUHJvdG9jb2x9IG9iamVjdHMgKGZvciBpbnN0YW5jZSwgYSBzZXJ2ZXIKLWNvdWxkIHNpbXBseSBzdHJlYW0gYSBjZXJ0YWluIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgYW55IGFjdHVhbCBSUEMgbWV0aG9kCi1pbnZvY2F0aW9uKS4KLQotXHNlY3Rpb257SW1wbGVtZW50YXRpb24gRGV0YWlsc30KLVxzdWJzZWN0aW9ue1RhcmdldCBMYW5ndWFnZXN9Ci1UaHJpZnQgY3VycmVudGx5IHN1cHBvcnRzIGZpdmUgdGFyZ2V0IGxhbmd1YWdlczogQysrLCBKYXZhLCBQeXRob24sIFJ1YnksIGFuZAotUEhQLiBBdCBGYWNlYm9vaywgd2UgaGF2ZSBkZXBsb3llZCBzZXJ2ZXJzIHByZWRvbWluYW50bHkgaW4gQysrLCBKYXZhLCBhbmQKLVB5dGhvbi4gVGhyaWZ0IHNlcnZpY2VzIGltcGxlbWVudGVkIGluIFBIUCBoYXZlIGFsc28gYmVlbiBlbWJlZGRlZCBpbnRvIHRoZQotQXBhY2hlIHdlYiBzZXJ2ZXIsIHByb3ZpZGluZyB0cmFuc3BhcmVudCBiYWNrZW5kIGFjY2VzcyB0byBtYW55IG9mIG91cgotZnJvbnRlbmQgY29uc3RydWN0cyB1c2luZyBhIFx0ZXh0dHR7VEh0dHBDbGllbnR9IGltcGxlbWVudGF0aW9uIG9mIHRoZQotXHRleHR0dHtUVHJhbnNwb3J0fSBpbnRlcmZhY2UuCi0KLVRob3VnaCBUaHJpZnQgd2FzIGV4cGxpY2l0bHkgZGVzaWduZWQgdG8gYmUgbXVjaCBtb3JlIGVmZmljaWVudCBhbmQgcm9idXN0Ci10aGFuIHR5cGljYWwgd2ViIHRlY2hub2xvZ2llcywgYXMgd2Ugd2VyZSBkZXNpZ25pbmcgb3VyIFhNTC1iYXNlZCBSRVNUIHdlYgotc2VydmljZXMgQVBJIHdlIG5vdGljZWQgdGhhdCBUaHJpZnQgY291bGQgYmUgZWFzaWx5IHVzZWQgdG8gZGVmaW5lIG91cgotc2VydmljZSBpbnRlcmZhY2UuIFRob3VnaCB3ZSBkbyBub3QgY3VycmVudGx5IGVtcGxveSBTT0FQIGVudmVsb3BlcyAoaW4gdGhlCi1hdXRob3JzJyBvcGluaW9ucyB0aGVyZSBpcyBhbHJlYWR5IGZhciB0b28gbXVjaCByZXBldGl0aXZlIGVudGVycHJpc2UgSmF2YQotc29mdHdhcmUgdG8gZG8gdGhhdCBzb3J0IG9mIHRoaW5nKSwgd2Ugd2VyZSBhYmxlIHRvIHF1aWNrbHkgZXh0ZW5kIFRocmlmdCB0bwotZ2VuZXJhdGUgWE1MIFNjaGVtYSBEZWZpbml0aW9uIGZpbGVzIGZvciBvdXIgc2VydmljZSwgYXMgd2VsbCBhcyBhIGZyYW1ld29yawotZm9yIHZlcnNpb25pbmcgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBvdXIgd2ViIHNlcnZpY2UuIFRob3VnaCBwdWJsaWMKLXdlYiBzZXJ2aWNlcyBhcmUgYWRtaXR0ZWRseSB0YW5nZW50aWFsIHRvIFRocmlmdCdzIGNvcmUgdXNlIGNhc2UgYW5kIGRlc2lnbiwKLVRocmlmdCBmYWNpbGl0YXRlZCByYXBpZCBpdGVyYXRpb24gYW5kIGFmZm9yZHMgdXMgdGhlIGFiaWxpdHkgdG8gcXVpY2tseQotbWlncmF0ZSBvdXIgZW50aXJlIFhNTC1iYXNlZCB3ZWIgc2VydmljZSBvbnRvIGEgaGlnaGVyIHBlcmZvcm1hbmNlIHN5c3RlbQotc2hvdWxkIHRoZSBuZWVkIGFyaXNlLgotCi1cc3Vic2VjdGlvbntHZW5lcmF0ZWQgU3RydWN0c30KLVdlIG1hZGUgYSBjb25zY2lvdXMgZGVjaXNpb24gdG8gbWFrZSBvdXIgZ2VuZXJhdGVkIHN0cnVjdHMgYXMgdHJhbnNwYXJlbnQgYXMKLXBvc3NpYmxlLiBBbGwgZmllbGRzIGFyZSBwdWJsaWNseSBhY2Nlc3NpYmxlOyB0aGVyZSBhcmUgbm8gXHRleHR0dHtzZXQoKX0gYW5kCi1cdGV4dHR0e2dldCgpfSBtZXRob2RzLiBTaW1pbGFybHksIHVzZSBvZiB0aGUgXHRleHR0dHtpc3NldH0gb2JqZWN0IGlzIG5vdAotZW5mb3JjZWQuIFdlIGRvIG5vdCBpbmNsdWRlIGFueSBcdGV4dHR0e0ZpZWxkTm90U2V0RXhjZXB0aW9ufSBjb25zdHJ1Y3QuCi1EZXZlbG9wZXJzIGhhdmUgdGhlIG9wdGlvbiB0byB1c2UgdGhlc2UgZmllbGRzIHRvIHdyaXRlIG1vcmUgcm9idXN0IGNvZGUsIGJ1dAotdGhlIHN5c3RlbSBpcyByb2J1c3QgdG8gdGhlIGRldmVsb3BlciBpZ25vcmluZyB0aGUgXHRleHR0dHtpc3NldH0gY29uc3RydWN0Ci1lbnRpcmVseSBhbmQgd2lsbCBwcm92aWRlIHN1aXRhYmxlIGRlZmF1bHQgYmVoYXZpb3IgaW4gYWxsIGNhc2VzLgotCi1UaGlzIGNob2ljZSB3YXMgbW90aXZhdGVkIGJ5IHRoZSBkZXNpcmUgdG8gZWFzZSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudC4gT3VyIHN0YXRlZAotZ29hbCBpcyBub3QgdG8gbWFrZSBkZXZlbG9wZXJzIGxlYXJuIGEgcmljaCBuZXcgbGlicmFyeSBpbiB0aGVpciBsYW5ndWFnZSBvZgotY2hvaWNlLCBidXQgcmF0aGVyIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgY29uc3RydWN0cwotdGhhdCBhcmUgbW9zdCBmYW1pbGlhciBpbiBlYWNoIGxhbmd1YWdlLgotCi1XZSBhbHNvIG1hZGUgdGhlIFx0ZXh0dHR7cmVhZCgpfSBhbmQgXHRleHR0dHt3cml0ZSgpfSBtZXRob2RzIG9mIHRoZSBnZW5lcmF0ZWQKLW9iamVjdHMgcHVibGljIHNvIHRoYXQgdGhlIG9iamVjdHMgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dAotb2YgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRocmlmdCBpcyBhIHVzZWZ1bCB0b29sIHNpbXBseSBmb3IgZ2VuZXJhdGluZwotb2JqZWN0cyB0aGF0IGFyZSBlYXNpbHkgc2VyaWFsaXphYmxlIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCi0KLVxzdWJzZWN0aW9ue1JQQyBNZXRob2QgSWRlbnRpZmljYXRpb259Ci1NZXRob2QgY2FsbHMgaW4gUlBDIGFyZSBpbXBsZW1lbnRlZCBieSBzZW5kaW5nIHRoZSBtZXRob2QgbmFtZSBhcyBhIHN0cmluZy4gT25lCi1pc3N1ZSB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBsb25nZXIgbWV0aG9kIG5hbWVzIHJlcXVpcmUgbW9yZSBiYW5kd2lkdGguCi1XZSBleHBlcmltZW50ZWQgd2l0aCB1c2luZyBmaXhlZC1zaXplIGhhc2hlcyB0byBpZGVudGlmeSBtZXRob2RzLCBidXQgaW4gdGhlCi1lbmQgY29uY2x1ZGVkIHRoYXQgdGhlIHNhdmluZ3Mgd2VyZSBub3Qgd29ydGggdGhlIGhlYWRhY2hlcyBpbmN1cnJlZC4gUmVsaWFibHkKLWRlYWxpbmcgd2l0aCBjb25mbGljdHMgYWNyb3NzIHZlcnNpb25zIG9mIGFuIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGUgaXMKLWltcG9zc2libGUgd2l0aG91dCBhIG1ldGEtc3RvcmFnZSBzeXN0ZW0gKGkuZS4gdG8gZ2VuZXJhdGUgbm9uLWNvbmZsaWN0aW5nCi1oYXNoZXMgZm9yIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgYSBmaWxlLCB3ZSB3b3VsZCBoYXZlIHRvIGtub3cgYWJvdXQgYWxsCi1jb25mbGljdHMgdGhhdCBldmVyIGV4aXN0ZWQgaW4gYW55IHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGZpbGUpLgotCi1XZSB3YW50ZWQgdG8gYXZvaWQgdG9vIG1hbnkgdW5uZWNlc3Nhcnkgc3RyaW5nIGNvbXBhcmlzb25zIHVwb24KLW1ldGhvZCBpbnZvY2F0aW9uLiBUbyBkZWFsIHdpdGggdGhpcywgd2UgZ2VuZXJhdGUgbWFwcyBmcm9tIHN0cmluZ3MgdG8gZnVuY3Rpb24KLXBvaW50ZXJzLCBzbyB0aGF0IGludm9jYXRpb24gaXMgZWZmZWN0aXZlbHkgYWNjb21wbGlzaGVkIHZpYSBhIGNvbnN0YW50LXRpbWUKLWhhc2ggbG9va3VwIGluIHRoZSBjb21tb24gY2FzZS4gVGhpcyByZXF1aXJlcyB0aGUgdXNlIG9mIGEgY291cGxlIGludGVyZXN0aW5nCi1jb2RlIGNvbnN0cnVjdHMuIEJlY2F1c2UgSmF2YSBkb2VzIG5vdCBoYXZlIGZ1bmN0aW9uIHBvaW50ZXJzLCBwcm9jZXNzCi1mdW5jdGlvbnMgYXJlIGFsbCBwcml2YXRlIG1lbWJlciBjbGFzc2VzIGltcGxlbWVudGluZyBhIGNvbW1vbiBpbnRlcmZhY2UuCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXByaXZhdGUgY2xhc3MgcGluZyBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7Ci0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLAotICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpcHJvdCwKLSAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3Byb3QpCi0gICAgdGhyb3dzIFRFeGNlcHRpb24KLSAgeyAuLi59Ci19Ci0KLUhhc2hNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPQotICBuZXcgSGFzaE1hcDxTdHJpbmcsUHJvY2Vzc0Z1bmN0aW9uPigpOwotXGVuZHt2ZXJiYXRpbX0KLQotSW4gQysrLCB3ZSB1c2UgYSByZWxhdGl2ZWx5IGVzb3RlcmljIGxhbmd1YWdlIGNvbnN0cnVjdDogbWVtYmVyIGZ1bmN0aW9uCi1wb2ludGVycy4KLQotXGJlZ2lue3ZlcmJhdGltfQotc3RkOjptYXA8c3RkOjpzdHJpbmcsCi0gIHZvaWQgKEV4YW1wbGVTZXJ2aWNlUHJvY2Vzc29yOjoqKShpbnQzMl90LAotICBmYWNlYm9vazo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwKLSAgZmFjZWJvb2s6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCopPgotIHByb2Nlc3NNYXBfOwotXGVuZHt2ZXJiYXRpbX0KLQotVXNpbmcgdGhlc2UgdGVjaG5pcXVlcywgdGhlIGNvc3Qgb2Ygc3RyaW5nIHByb2Nlc3NpbmcgaXMgbWluaW1pemVkLCBhbmQgd2UKLXJlYXAgdGhlIGJlbmVmaXQgb2YgYmVpbmcgYWJsZSB0byBlYXNpbHkgZGVidWcgY29ycnVwdCBvciBtaXN1bmRlcnN0b29kIGRhdGEgYnkKLWluc3BlY3RpbmcgaXQgZm9yIGtub3duIHN0cmluZyBtZXRob2QgbmFtZXMuCi0KLVxzdWJzZWN0aW9ue1NlcnZlcnMgYW5kIE11bHRpdGhyZWFkaW5nfQotVGhyaWZ0IHNlcnZpY2VzIHJlcXVpcmUgYmFzaWMgbXVsdGl0aHJlYWRpbmcgdG8gaGFuZGxlIHNpbXVsdGFuZW91cwotcmVxdWVzdHMgZnJvbSBtdWx0aXBsZSBjbGllbnRzLiBGb3IgdGhlIFB5dGhvbiBhbmQgSmF2YSBpbXBsZW1lbnRhdGlvbnMgb2YKLVRocmlmdCBzZXJ2ZXIgbG9naWMsIHRoZSBzdGFuZGFyZCB0aHJlYWRpbmcgbGlicmFyaWVzIGRpc3RyaWJ1dGVkIHdpdGggdGhlCi1sYW5ndWFnZXMgcHJvdmlkZSBhZGVxdWF0ZSBzdXBwb3J0LiBGb3IgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgbm8gc3RhbmRhcmQgbXVsdGl0aHJlYWQgcnVudGltZQotbGlicmFyeSBleGlzdHMuIFNwZWNpZmljYWxseSwgcm9idXN0LCBsaWdodHdlaWdodCwgYW5kIHBvcnRhYmxlCi10aHJlYWQgbWFuYWdlciBhbmQgdGltZXIgY2xhc3MgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBleGlzdC4gV2UgaW52ZXN0aWdhdGVkCi1leGlzdGluZyBpbXBsZW1lbnRhdGlvbnMsIG5hbWVseSBcdGV4dHR0e2Jvb3N0Ojp0aHJlYWR9LAotXHRleHR0dHtib29zdDo6dGhyZWFkcG9vbH0sIFx0ZXh0dHR7QUNFXF9UaHJlYWRcX01hbmFnZXJ9IGFuZAotXHRleHR0dHtBQ0VcX1RpbWVyfS4KLQotV2hpbGUgXHRleHR0dHtib29zdDo6dGhyZWFkc31cY2l0ZXtib29zdC50aHJlYWRzfSAgcHJvdmlkZXMgY2xlYW4sCi1saWdodHdlaWdodCBhbmQgcm9idXN0IGltcGxlbWVudGF0aW9ucyBvZiBtdWx0aS10aHJlYWQgcHJpbWl0aXZlcyAobXV0ZXhlcywKLWNvbmRpdGlvbnMsIHRocmVhZHMpIGl0IGRvZXMgbm90IHByb3ZpZGUgYSB0aHJlYWQgbWFuYWdlciBvciB0aW1lcgotaW1wbGVtZW50YXRpb24uCi0KLVx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9XGNpdGV7Ym9vc3QudGhyZWFkcG9vbH0gYWxzbyBsb29rZWQgcHJvbWlzaW5nIGJ1dAotd2FzIG5vdCBmYXIgZW5vdWdoIGFsb25nIGZvciBvdXIgcHVycG9zZXMuIFdlIHdhbnRlZCB0byBsaW1pdCB0aGUgZGVwZW5kZW5jeSBvbgotdGhpcmQtcGFydHkgbGlicmFyaWVzIGFzIG11Y2ggYXMgcG9zc2libGUuIEJlY2F1c2VcXAotXHRleHR0dHtib29zdDo6dGhyZWFkcG9vbH0gaXMKLW5vdCBhIHB1cmUgdGVtcGxhdGUgbGlicmFyeSBhbmQgcmVxdWlyZXMgcnVudGltZSBsaWJyYXJpZXMgYW5kIGJlY2F1c2UgaXQgaXMKLW5vdCB5ZXQgcGFydCBvZiB0aGUgb2ZmaWNpYWwgQm9vc3QgZGlzdHJpYnV0aW9uIHdlIGZlbHQgaXQgd2FzIG5vdCByZWFkeSBmb3IKLXVzZSBpbiBUaHJpZnQuIEFzIFx0ZXh0dHR7Ym9vc3Q6OnRocmVhZHBvb2x9IGV2b2x2ZXMgYW5kIGVzcGVjaWFsbHkgaWYgaXQgaXMKLWFkZGVkIHRvIHRoZSBCb29zdCBkaXN0cmlidXRpb24gd2UgbWF5IHJlY29uc2lkZXIgb3VyIGRlY2lzaW9uIHRvIG5vdCB1c2UgaXQuCi0KLUFDRSBoYXMgYm90aCBhIHRocmVhZCBtYW5hZ2VyIGFuZCB0aW1lciBjbGFzcyBpbiBhZGRpdGlvbiB0byBtdWx0aS10aHJlYWQKLXByaW1pdGl2ZXMuIFRoZSBiaWdnZXN0IHByb2JsZW0gd2l0aCBBQ0UgaXMgdGhhdCBpdCBpcyBBQ0UuIFVubGlrZSBCb29zdCwgQUNFCi1BUEkgcXVhbGl0eSBpcyBwb29yLiBFdmVyeXRoaW5nIGluIEFDRSBoYXMgbGFyZ2UgbnVtYmVycyBvZiBkZXBlbmRlbmNpZXMgb24KLWV2ZXJ5dGhpbmcgZWxzZSBpbiBBQ0UgLSB0aHVzIGZvcmNpbmcgZGV2ZWxvcGVycyB0byB0aHJvdyBvdXQgc3RhbmRhcmQKLWNsYXNzZXMsIHN1Y2ggYXMgU1RMIGNvbGxlY3Rpb25zLCBpbiBmYXZvciBvZiBBQ0UncyBob21lYnJld2VkIGltcGxlbWVudGF0aW9ucy4gSW4KLWFkZGl0aW9uLCB1bmxpa2UgQm9vc3QsIEFDRSBpbXBsZW1lbnRhdGlvbnMgZGVtb25zdHJhdGUgbGl0dGxlIHVuZGVyc3RhbmRpbmcKLW9mIHRoZSBwb3dlciBhbmQgcGl0ZmFsbHMgb2YgQysrIHByb2dyYW1taW5nIGFuZCB0YWtlIG5vIGFkdmFudGFnZSBvZiBtb2Rlcm4KLXRlbXBsYXRpbmcgdGVjaG5pcXVlcyB0byBlbnN1cmUgY29tcGlsZSB0aW1lIHNhZmV0eSBhbmQgcmVhc29uYWJsZSBjb21waWxlcgotZXJyb3IgbWVzc2FnZXMuIEZvciBhbGwgdGhlc2UgcmVhc29ucywgQUNFIHdhcyByZWplY3RlZC4gSW5zdGVhZCwgd2UgY2hvc2UKLXRvIGltcGxlbWVudCBvdXIgb3duIGxpYnJhcnksIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgotCi1cc3Vic2VjdGlvbntUaHJlYWQgUHJpbWl0aXZlc30KLQotVGhlIFRocmlmdCB0aHJlYWQgbGlicmFyaWVzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgbmFtZXNwYWNlXFwKLVx0ZXh0dHR7ZmFjZWJvb2s6OnRocmlmdDo6Y29uY3VycmVuY3l9IGFuZCBoYXZlIHRocmVlIGNvbXBvbmVudHM6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIHByaW1pdGl2ZXMKLVxpdGVtIHRocmVhZCBwb29sIG1hbmFnZXIKLVxpdGVtIHRpbWVyIG1hbmFnZXIKLVxlbmR7aXRlbWl6ZX0KLQotQXMgbWVudGlvbmVkIGFib3ZlLCB3ZSB3ZXJlIGhlc2l0YW50IHRvIGludHJvZHVjZSBhbnkgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKLW9uIFRocmlmdC4gV2UgZGVjaWRlZCB0byB1c2UgXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IGJlY2F1c2UgaXQgaXMgc28KLXVzZWZ1bCBmb3IgbXVsdGl0aHJlYWRlZCBhcHBsaWNhdGlvbiwgaXQgcmVxdWlyZXMgbm8gbGluay10aW1lIG9yCi1ydW50aW1lIGxpYnJhcmllcyAoaS5lLiBpdCBpcyBhIHB1cmUgdGVtcGxhdGUgbGlicmFyeSkgYW5kIGl0IGlzIGR1ZQotdG8gYmVjb21lIHBhcnQgb2YgdGhlIEMrKzB4IHN0YW5kYXJkLgotCi1XZSBpbXBsZW1lbnQgc3RhbmRhcmQgXHRleHR0dHtNdXRleH0gYW5kIFx0ZXh0dHR7Q29uZGl0aW9ufSBjbGFzc2VzLCBhbmQgYQotIFx0ZXh0dHR7TW9uaXRvcn0gY2xhc3MuIFRoZSBsYXR0ZXIgaXMgc2ltcGx5IGEgY29tYmluYXRpb24gb2YgYSBtdXRleCBhbmQKLWNvbmRpdGlvbiB2YXJpYWJsZSBhbmQgaXMgYW5hbG9nb3VzIHRvIHRoZSBcdGV4dHR0e01vbml0b3J9IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGZvcgotdGhlIEphdmEgXHRleHR0dHtPYmplY3R9IGNsYXNzLiBUaGlzIGlzIGFsc28gc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGEgYmFycmllci4gV2UKLXByb3ZpZGUgYSBcdGV4dHR0e1N5bmNocm9uaXplZH0gZ3VhcmQgY2xhc3MgdG8gYWxsb3cgSmF2YS1saWtlIHN5bmNocm9uaXplZCBibG9ja3MuCi1UaGlzIGlzIGp1c3QgYSBiaXQgb2Ygc3ludGFjdGljIHN1Z2FyLCBidXQsIGxpa2UgaXRzIEphdmEgY291bnRlcnBhcnQsIGNsZWFybHkKLWRlbGltaXRzIGNyaXRpY2FsIHNlY3Rpb25zIG9mIGNvZGUuIFVubGlrZSBpdHMgSmF2YSBjb3VudGVycGFydCwgd2Ugc3RpbGwKLWhhdmUgdGhlIGFiaWxpdHkgdG8gcHJvZ3JhbW1hdGljYWxseSBsb2NrLCB1bmxvY2ssIGJsb2NrLCBhbmQgc2lnbmFsIG1vbml0b3JzLgotCi1cYmVnaW57dmVyYmF0aW19Ci12b2lkIHJ1bigpIHsKLSB7U3luY2hyb25pemVkIHMobWFuYWdlci0+bW9uaXRvcik7Ci0gIGlmIChtYW5hZ2VyLT5zdGF0ZSA9PSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKSB7Ci0gICAgbWFuYWdlci0+c3RhdGUgPSBUaW1lck1hbmFnZXI6OlNUQVJURUQ7Ci0gICAgbWFuYWdlci0+bW9uaXRvci5ub3RpZnlBbGwoKTsKLSAgfQotIH0KLX0KLVxlbmR7dmVyYmF0aW19Ci0KLVdlIGFnYWluIGJvcnJvd2VkIGZyb20gSmF2YSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhIHRocmVhZCBhbmQgYSBydW5uYWJsZQotY2xhc3MuIEEgXHRleHR0dHtUaHJlYWR9IGlzIHRoZSBhY3R1YWwgc2NoZWR1bGFibGUgb2JqZWN0LiBUaGUKLVx0ZXh0dHR7UnVubmFibGV9IGlzIHRoZSBsb2dpYyB0byBleGVjdXRlIHdpdGhpbiB0aGUgdGhyZWFkLgotVGhlIFx0ZXh0dHR7VGhyZWFkfSBpbXBsZW1lbnRhdGlvbiBkZWFscyB3aXRoIGFsbCB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgdGhyZWFkCi1jcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gaXNzdWVzLCB3aGlsZSB0aGUgXHRleHR0dHtSdW5uYWJsZX0gaW1wbGVtZW50YXRpb24gZGVhbHMKLXdpdGggdGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHBlci10aHJlYWQgbG9naWMuIFRoZSBiZW5lZml0IG9mIHRoaXMgYXBwcm9hY2gKLWlzIHRoYXQgZGV2ZWxvcGVycyBjYW4gZWFzaWx5IHN1YmNsYXNzIHRoZSBSdW5uYWJsZSBjbGFzcyB3aXRob3V0IHB1bGxpbmcgaW4KLXBsYXRmb3JtLXNwZWNpZmljIHN1cGVyLWNsYXNzZXMuCi0KLVxzdWJzZWN0aW9ue1RocmVhZCwgUnVubmFibGUsIGFuZCBzaGFyZWRcX3B0cn0KLVdlIHVzZSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gdGhyb3VnaG91dCB0aGUgXHRleHR0dHtUaHJlYWRNYW5hZ2VyfSBhbmQKLVx0ZXh0dHR7VGltZXJNYW5hZ2VyfSBpbXBsZW1lbnRhdGlvbnMgdG8gZ3VhcmFudGVlIGNsZWFudXAgb2YgZGVhZCBvYmplY3RzIHRoYXQgY2FuCi1iZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLiBGb3IgXHRleHR0dHtUaHJlYWR9IGNsYXNzIGltcGxlbWVudGF0aW9ucywKLVx0ZXh0dHR7Ym9vc3Q6OnNoYXJlZFxfcHRyfSB1c2FnZSByZXF1aXJlcyBwYXJ0aWN1bGFyIGF0dGVudGlvbiB0byBtYWtlIHN1cmUKLVx0ZXh0dHR7VGhyZWFkfSBvYmplY3RzIGFyZSBuZWl0aGVyIGxlYWtlZCBub3IgZGVyZWZlcmVuY2VkIHByZW1hdHVyZWx5IHdoaWxlCi1jcmVhdGluZyBhbmQgc2h1dHRpbmcgZG93biB0aHJlYWRzLgotCi1UaHJlYWQgY3JlYXRpb24gcmVxdWlyZXMgY2FsbGluZyBpbnRvIGEgQyBsaWJyYXJ5LiAoSW4gb3VyIGNhc2UgdGhlIFBPU0lYCi10aHJlYWQgbGlicmFyeSwgXHRleHR0dHtsaWJwdGhyZWFkfSwgYnV0IHRoZSBzYW1lIHdvdWxkIGJlIHRydWUgZm9yIFdJTjMyIHRocmVhZHMpLgotVHlwaWNhbGx5LCB0aGUgT1MgbWFrZXMgZmV3LCBpZiBhbnksIGd1YXJhbnRlZXMgYWJvdXQgd2hlbiBcdGV4dHR0e1RocmVhZE1haW59LCBhIEMgdGhyZWFkJ3MgZW50cnktcG9pbnQgZnVuY3Rpb24sIHdpbGwgYmUgY2FsbGVkLiBUaGVyZWZvcmUsIGl0IGlzCi1wb3NzaWJsZSB0aGF0IG91ciB0aHJlYWQgY3JlYXRlIGNhbGwsCi1cdGV4dHR0e1RocmVhZEZhY3Rvcnk6Om5ld1RocmVhZCgpfSBjb3VsZCByZXR1cm4gdG8gdGhlIGNhbGxlcgotd2VsbCBiZWZvcmUgdGhhdCB0aW1lLiBUbyBlbnN1cmUgdGhhdCB0aGUgcmV0dXJuZWQgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBpcyBub3QKLXByZW1hdHVyZWx5IGNsZWFuZWQgdXAgaWYgdGhlIGNhbGxlciBnaXZlcyB1cCBpdHMgcmVmZXJlbmNlIHByaW9yIHRvIHRoZQotXHRleHR0dHtUaHJlYWRNYWlufSBjYWxsLCB0aGUgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBtYWtlcyBhIHdlYWsgcmVmZXJlbmVuY2UgdG8KLWl0c2VsZiBpbiBpdHMgXHRleHR0dHtzdGFydH0gbWV0aG9kLgotCi1XaXRoIHRoZSB3ZWFrIHJlZmVyZW5jZSBpbiBoYW5kIHRoZSBcdGV4dHR0e1RocmVhZE1haW59IGZ1bmN0aW9uIGNhbiBhdHRlbXB0IHRvIGdldAotYSBzdHJvbmcgcmVmZXJlbmNlIGJlZm9yZSBlbnRlcmluZyB0aGUgXHRleHR0dHtSdW5uYWJsZTo6cnVufSBtZXRob2Qgb2YgdGhlCi1cdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgYm91bmQgdG8gdGhlIFx0ZXh0dHR7VGhyZWFkfS4gSWYgbm8gc3Ryb25nIHJlZmVyZW5jZXMgdG8gdGhlCi10aHJlYWQgYXJlIG9idGFpbmVkIGJldHdlZW4gZXhpdGluZyBcdGV4dHR0e1RocmVhZDo6c3RhcnR9IGFuZCBlbnRlcmluZyBcdGV4dHR0e1RocmVhZE1haW59LCB0aGUgd2VhayByZWZlcmVuY2UgcmV0dXJucyBcdGV4dHR0e251bGx9IGFuZCB0aGUgZnVuY3Rpb24KLWV4aXRzIGltbWVkaWF0ZWx5LgotCi1UaGUgbmVlZCBmb3IgdGhlIFx0ZXh0dHR7VGhyZWFkfSB0byBtYWtlIGEgd2VhayByZWZlcmVuY2UgdG8gaXRzZWxmIGhhcyBhCi1zaWduaWZpY2FudCBpbXBhY3Qgb24gdGhlIEFQSS4gU2luY2UgcmVmZXJlbmNlcyBhcmUgbWFuYWdlZCB0aHJvdWdoIHRoZQotXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IHRlbXBsYXRlcywgdGhlIFx0ZXh0dHR7VGhyZWFkfSBvYmplY3QgbXVzdCBoYXZlIGEgcmVmZXJlbmNlCi10byBpdHNlbGYgd3JhcHBlZCBieSB0aGUgc2FtZSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gZW52ZWxvcGUgdGhhdCBpcyByZXR1cm5lZAotdG8gdGhlIGNhbGxlci4gVGhpcyBuZWNlc3NpdGF0ZWQgdGhlIHVzZSBvZiB0aGUgZmFjdG9yeSBwYXR0ZXJuLgotXHRleHR0dHtUaHJlYWRGYWN0b3J5fSBjcmVhdGVzIHRoZSByYXcgXHRleHR0dHtUaHJlYWR9IG9iamVjdCBhbmQgYQotXHRleHR0dHtib29zdDo6c2hhcmVkXF9wdHJ9IHdyYXBwZXIsIGFuZCBjYWxscyBhIHByaXZhdGUgaGVscGVyIG1ldGhvZCBvZiB0aGUgY2xhc3MKLWltcGxlbWVudGluZyB0aGUgXHRleHR0dHtUaHJlYWR9IGludGVyZmFjZSAoaW4gdGhpcyBjYXNlLCBcdGV4dHR0e1Bvc2l4VGhyZWFkOjp3ZWFrUmVmfSkKLSB0byBhbGxvdyBpdCB0byBtYWtlIGFkZCB3ZWFrIHJlZmVyZW5jZSB0byBpdHNlbGYgdGhyb3VnaCB0aGUKLSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gZW52ZWxvcGUuCi0KLVx0ZXh0dHR7VGhyZWFkfSBhbmQgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0cyByZWZlcmVuY2UgZWFjaCBvdGhlci4gQSBcdGV4dHR0e1J1bm5hYmxlfQotb2JqZWN0IG1heSBuZWVkIHRvIGtub3cgYWJvdXQgdGhlIHRocmVhZCBpbiB3aGljaCBpdCBpcyBleGVjdXRpbmcsIGFuZCBhIFRocmVhZCwgb2J2aW91c2x5LAotbmVlZHMgdG8ga25vdyB3aGF0IFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdCBpdCBpcyBob3N0aW5nLiBUaGlzIGludGVyZGVwZW5kZW5jeSBpcwotZnVydGhlciBjb21wbGljYXRlZCBiZWNhdXNlIHRoZSBsaWZlY3ljbGUgb2YgZWFjaCBvYmplY3QgaXMgaW5kZXBlbmRlbnQgb2YgdGhlCi1vdGhlci4gQW4gYXBwbGljYXRpb24gbWF5IGNyZWF0ZSBhIHNldCBvZiBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QgdG8gYmUgcmV1c2VkIGluIGRpZmZlcmVudCB0aHJlYWRzLCBvciBpdCBtYXkgY3JlYXRlIGFuZCBmb3JnZXQgYSBcdGV4dHR0e1J1bm5hYmxlfSBvYmplY3QKLW9uY2UgYSB0aHJlYWQgaGFzIGJlZW4gY3JlYXRlZCBhbmQgc3RhcnRlZCBmb3IgaXQuCi0KLVRoZSBcdGV4dHR0e1RocmVhZH0gY2xhc3MgdGFrZXMgYSBcdGV4dHR0e2Jvb3N0OjpzaGFyZWRcX3B0cn0gcmVmZXJlbmNlIHRvIHRoZSBob3N0ZWQKLVx0ZXh0dHR7UnVubmFibGV9IG9iamVjdCBpbiBpdHMgY29uc3RydWN0b3IsIHdoaWxlIHRoZSBcdGV4dHR0e1J1bm5hYmxlfSBjbGFzcyBoYXMgYW4KLWV4cGxpY2l0IFx0ZXh0dHR7dGhyZWFkfSBtZXRob2QgdG8gYWxsb3cgZXhwbGljaXQgYmluZGluZyBvZiB0aGUgaG9zdGVkIHRocmVhZC4KLVx0ZXh0dHR7VGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkfSBiaW5kcyB0aGUgb2JqZWN0cyB0byBlYWNoIG90aGVyLgotCi1cc3Vic2VjdGlvbntUaHJlYWRNYW5hZ2VyfQotCi1cdGV4dHR0e1RocmVhZE1hbmFnZXJ9IGNyZWF0ZXMgYSBwb29sIG9mIHdvcmtlciB0aHJlYWRzIGFuZAotYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBzY2hlZHVsZSB0YXNrcyBmb3IgZXhlY3V0aW9uIGFzIGZyZWUgd29ya2VyIHRocmVhZHMKLWJlY29tZSBhdmFpbGFibGUuIFRoZSBcdGV4dHR0e1RocmVhZE1hbmFnZXJ9IGRvZXMgbm90IGltcGxlbWVudCBkeW5hbWljCi10aHJlYWQgcG9vbCByZXNpemluZywgYnV0IHByb3ZpZGVzIHByaW1pdGl2ZXMgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGFkZAotYW5kIHJlbW92ZSB0aHJlYWRzIGJhc2VkIG9uIGxvYWQuIFRoaXMgYXBwcm9hY2ggd2FzIGNob3NlbiBiZWNhdXNlCi1pbXBsZW1lbnRpbmcgbG9hZCBtZXRyaWNzIGFuZCB0aHJlYWQgcG9vbCBzaXplIGlzIHZlcnkgYXBwbGljYXRpb24KLXNwZWNpZmljLiBGb3IgZXhhbXBsZSBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2FudCB0byBhZGp1c3QgcG9vbCBzaXplIGJhc2VkCi1vbiBydW5uaW5nLWF2ZXJhZ2Ugb2Ygd29yayBhcnJpdmFsIHJhdGVzIHRoYXQgYXJlIG1lYXN1cmVkIHZpYSBwb2xsZWQKLXNhbXBsZXMuIE90aGVycyBtYXkgc2ltcGx5IHdpc2ggdG8gcmVhY3QgaW1tZWRpYXRlbHkgdG8gd29yay1xdWV1ZQotZGVwdGggaGlnaCBhbmQgbG93IHdhdGVyIG1hcmtzLiBSYXRoZXIgdGhhbiB0cnlpbmcgdG8gY3JlYXRlIGEgY29tcGxleAotQVBJIGFic3RyYWN0IGVub3VnaCB0byBjYXB0dXJlIHRoZXNlIGRpZmZlcmVudCBhcHByb2FjaGVzLCB3ZQotc2ltcGx5IGxlYXZlIGl0IHVwIHRvIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGFuZCBwcm92aWRlIHRoZQotcHJpbWl0aXZlcyB0byBlbmFjdCB0aGUgZGVzaXJlZCBwb2xpY3kgYW5kIHNhbXBsZSBjdXJyZW50IHN0YXR1cy4KLQotXHN1YnNlY3Rpb257VGltZXJNYW5hZ2VyfQotCi1cdGV4dHR0e1RpbWVyTWFuYWdlcn0gYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBzY2hlZHVsZQotIFx0ZXh0dHR7UnVubmFibGV9IG9iamVjdHMgZm9yIGV4ZWN1dGlvbiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuIEl0cyBzcGVjaWZpYyB0YXNrCi1pcyB0byBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHNhbXBsZSBcdGV4dHR0e1RocmVhZE1hbmFnZXJ9IGxvYWQgYXQgcmVndWxhcgotaW50ZXJ2YWxzIGFuZCBtYWtlIGNoYW5nZXMgdG8gdGhlIHRocmVhZCBwb29sIHNpemUgYmFzZWQgb24gYXBwbGljYXRpb24gcG9saWN5LgotT2YgY291cnNlLCBpdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhbnkgbnVtYmVyIG9mIHRpbWVyIG9yIGFsYXJtIGV2ZW50cy4KLQotVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgXHRleHR0dHtUaW1lck1hbmFnZXJ9IHVzZXMgYSBzaW5nbGUgdGhyZWFkIHRvCi1leGVjdXRlIGV4cGlyZWQgXHRleHR0dHtSdW5uYWJsZX0gb2JqZWN0cy4gVGh1cywgaWYgYSB0aW1lciBvcGVyYXRpb24gbmVlZHMgdG8KLWRvIGEgbGFyZ2UgYW1vdW50IG9mIHdvcmsgYW5kIGVzcGVjaWFsbHkgaWYgaXQgbmVlZHMgdG8gZG8gYmxvY2tpbmcgSS9PLAotdGhhdCBzaG91bGQgYmUgZG9uZSBpbiBhIHNlcGFyYXRlIHRocmVhZC4KLQotXHN1YnNlY3Rpb257Tm9uYmxvY2tpbmcgT3BlcmF0aW9ufQotVGhvdWdoIHRoZSBUaHJpZnQgdHJhbnNwb3J0IGludGVyZmFjZXMgbWFwIG1vcmUgZGlyZWN0bHkgdG8gYSBibG9ja2luZyBJL08KLW1vZGVsLCB3ZSBoYXZlIGltcGxlbWVudGVkIGEgaGlnaCBwZXJmb3JtYW5jZSBcdGV4dHR0e1ROb25CbG9ja2luZ1NlcnZlcn0KLWluIEMrKyBiYXNlZCBvbiBcdGV4dHR0e2xpYmV2ZW50fSBhbmQgdGhlIFx0ZXh0dHR7VEZyYW1lZFRyYW5zcG9ydH0uIFdlCi1pbXBsZW1lbnRlZCB0aGlzIGJ5IG1vdmluZyBhbGwgSS9PIGludG8gb25lIHRpZ2h0IGV2ZW50IGxvb3AgdXNpbmcgYQotc3RhdGUgbWFjaGluZS4gRXNzZW50aWFsbHksIHRoZSBldmVudCBsb29wIHJlYWRzIGZyYW1lZCByZXF1ZXN0cyBpbnRvCi1cdGV4dHR0e1RNZW1vcnlCdWZmZXJ9IG9iamVjdHMuIE9uY2UgZW50aXJlIHJlcXVlc3RzIGFyZSByZWFkeSwgdGhleSBhcmUKLWRpc3BhdGNoZWQgdG8gdGhlIFx0ZXh0dHR7VFByb2Nlc3Nvcn0gb2JqZWN0IHdoaWNoIGNhbiByZWFkIGRpcmVjdGx5IGZyb20KLXRoZSBkYXRhIGluIG1lbW9yeS4KLQotXHN1YnNlY3Rpb257Q29tcGlsZXJ9Ci1UaGUgVGhyaWZ0IGNvbXBpbGVyIGlzIGltcGxlbWVudGVkIGluIEMrKyB1c2luZyBzdGFuZGFyZCBcdGV4dHR0e2xleH0vXHRleHR0dHt5YWNjfQotbGV4aW5nIGFuZCBwYXJzaW5nLiBUaG91Z2ggaXQgY291bGQgaGF2ZSBiZWVuIGltcGxlbWVudGVkIHdpdGggZmV3ZXIKLWxpbmVzIG9mIGNvZGUgaW4gYW5vdGhlciBsYW5ndWFnZSAoaS5lLiBQeXRob24gTGV4LVlhY2MgKFBMWSkgb3IgXHRleHR0dHtvY2FtbHlhY2N9KSwgdXNpbmcgQysrCi1mb3JjZXMgZXhwbGljaXQgZGVmaW5pdGlvbiBvZiB0aGUgbGFuZ3VhZ2UgY29uc3RydWN0cy4gU3Ryb25nbHkgdHlwaW5nIHRoZQotcGFyc2UgdHJlZSBlbGVtZW50cyAoZGViYXRhYmx5KSBtYWtlcyB0aGUgY29kZSBtb3JlIGFwcHJvYWNoYWJsZSBmb3IgbmV3Ci1kZXZlbG9wZXJzLgotCi1Db2RlIGdlbmVyYXRpb24gaXMgZG9uZSB1c2luZyB0d28gcGFzc2VzLiBUaGUgZmlyc3QgcGFzcyBsb29rcyBvbmx5IGZvcgotaW5jbHVkZSBmaWxlcyBhbmQgdHlwZSBkZWZpbml0aW9ucy4gVHlwZSBkZWZpbml0aW9ucyBhcmUgbm90IGNoZWNrZWQgZHVyaW5nCi10aGlzIHBoYXNlLCBzaW5jZSB0aGV5IG1heSBkZXBlbmQgdXBvbiBpbmNsdWRlIGZpbGVzLiBBbGwgaW5jbHVkZWQgZmlsZXMKLWFyZSBzZXF1ZW50aWFsbHkgc2Nhbm5lZCBpbiBhIGZpcnN0IHBhc3MuIE9uY2UgdGhlIGluY2x1ZGUgdHJlZSBoYXMgYmVlbgotcmVzb2x2ZWQsIGEgc2Vjb25kIHBhc3Mgb3ZlciBhbGwgZmlsZXMgaXMgdGFrZW4gdGhhdCBpbnNlcnRzIHR5cGUgZGVmaW5pdGlvbnMKLWludG8gdGhlIHBhcnNlIHRyZWUgYW5kIHJhaXNlcyBhbiBlcnJvciBvbiBhbnkgdW5kZWZpbmVkIHR5cGVzLiBUaGUgcHJvZ3JhbSBpcwotdGhlbiBnZW5lcmF0ZWQgYWdhaW5zdCB0aGUgcGFyc2UgdHJlZS4KLQotRHVlIHRvIGluaGVyZW50IGNvbXBsZXhpdGllcyBhbmQgcG90ZW50aWFsIGZvciBjaXJjdWxhciBkZXBlbmRlbmNpZXMsCi13ZSBleHBsaWNpdGx5IGRpc2FsbG93IGZvcndhcmQgZGVjbGFyYXRpb24uIFR3byBUaHJpZnQgc3RydWN0cyBjYW5ub3QKLWVhY2ggY29udGFpbiBhbiBpbnN0YW5jZSBvZiB0aGUgb3RoZXIuIChTaW5jZSB3ZSBkbyBub3QgYWxsb3cgXHRleHR0dHtudWxsfQotc3RydWN0IGluc3RhbmNlcyBpbiB0aGUgZ2VuZXJhdGVkIEMrKyBjb2RlLCB0aGlzIHdvdWxkIGFjdHVhbGx5IGJlIGltcG9zc2libGUuKQotCi1cc3Vic2VjdGlvbntURmlsZVRyYW5zcG9ydH0KLVRoZSBcdGV4dHR0e1RGaWxlVHJhbnNwb3J0fSBsb2dzIFRocmlmdCByZXF1ZXN0cy9zdHJ1Y3RzIGJ5Ci1mcmFtaW5nIGluY29taW5nIGRhdGEgd2l0aCBpdHMgbGVuZ3RoIGFuZCB3cml0aW5nIGl0IG91dCB0byBkaXNrLgotVXNpbmcgYSBmcmFtZWQgb24tZGlzayBmb3JtYXQgYWxsb3dzIGZvciBiZXR0ZXIgZXJyb3IgY2hlY2tpbmcgYW5kCi1oZWxwcyB3aXRoIHRoZSBwcm9jZXNzaW5nIG9mIGEgZmluaXRlIG51bWJlciBvZiBkaXNjcmV0ZSBldmVudHMuIFRoZVxcCi1cdGV4dHR0e1RGaWxlV3JpdGVyVHJhbnNwb3J0fSB1c2VzIGEgc3lzdGVtIG9mIHN3YXBwaW5nIGluLW1lbW9yeSBidWZmZXJzCi10byBlbnN1cmUgZ29vZCBwZXJmb3JtYW5jZSB3aGlsZSBsb2dnaW5nIGxhcmdlIGFtb3VudHMgb2YgZGF0YS4KLUEgVGhyaWZ0IGxvZyBmaWxlIGlzIHNwbGl0IHVwIGludG8gY2h1bmtzIG9mIGEgc3BlY2lmaWVkIHNpemU7IGxvZ2dlZCBtZXNzYWdlcwotYXJlIG5vdCBhbGxvd2VkIHRvIGNyb3NzIGNodW5rIGJvdW5kYXJpZXMuIEEgbWVzc2FnZSB0aGF0IHdvdWxkIGNyb3NzIGEgY2h1bmsKLWJvdW5kYXJ5IHdpbGwgY2F1c2UgcGFkZGluZyB0byBiZSBhZGRlZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjaHVuayBhbmQgdGhlCi1maXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlIGFyZSBhbGlnbmVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgY2h1bmsuCi1QYXJ0aXRpb25pbmcgdGhlIGZpbGUgaW50byBjaHVua3MgbWFrZXMgaXQgcG9zc2libGUgdG8gcmVhZCBhbmQgaW50ZXJwcmV0IGRhdGEKLWZyb20gYSBwYXJ0aWN1bGFyIHBvaW50IGluIHRoZSBmaWxlLgotCi1cc2VjdGlvbntGYWNlYm9vayBUaHJpZnQgU2VydmljZXN9Ci1UaHJpZnQgaGFzIGJlZW4gZW1wbG95ZWQgaW4gYSBsYXJnZSBudW1iZXIgb2YgYXBwbGljYXRpb25zIGF0IEZhY2Vib29rLCBpbmNsdWRpbmcKLXNlYXJjaCwgbG9nZ2luZywgbW9iaWxlLCBhZHMgYW5kIHRoZSBkZXZlbG9wZXIgcGxhdGZvcm0uIFR3byBzcGVjaWZpYyB1c2FnZXMgYXJlIGRpc2N1c3NlZCBiZWxvdy4KLQotXHN1YnNlY3Rpb257U2VhcmNofQotVGhyaWZ0IGlzIHVzZWQgYXMgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCBsYXllciBmb3IgdGhlIEZhY2Vib29rIFNlYXJjaCBzZXJ2aWNlLgotVGhlIG11bHRpLWxhbmd1YWdlIGNvZGUgZ2VuZXJhdGlvbiBpcyB3ZWxsIHN1aXRlZCBmb3Igc2VhcmNoIGJlY2F1c2UgaXQgYWxsb3dzIGZvciBhcHBsaWNhdGlvbgotZGV2ZWxvcG1lbnQgaW4gYW4gZWZmaWNpZW50IHNlcnZlciBzaWRlIGxhbmd1YWdlIChDKyspIGFuZCBhbGxvd3MgdGhlIEZhY2Vib29rIFBIUC1iYXNlZCB3ZWIgYXBwbGljYXRpb24KLXRvIG1ha2UgY2FsbHMgdG8gdGhlIHNlYXJjaCBzZXJ2aWNlIHVzaW5nIFRocmlmdCBQSFAgbGlicmFyaWVzLiBUaGVyZSBpcyBhbHNvIGEgbGFyZ2UKLXZhcmlldHkgb2Ygc2VhcmNoIHN0YXRzLCBkZXBsb3ltZW50IGFuZCB0ZXN0aW5nIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBidWlsdCBvbiB0b3AKLW9mIGdlbmVyYXRlZCBQeXRob24gY29kZS4gQWRkaXRpb25hbGx5LCB0aGUgVGhyaWZ0IGxvZyBmaWxlIGZvcm1hdCBpcwotdXNlZCBhcyBhIHJlZG8gbG9nIGZvciBwcm92aWRpbmcgcmVhbC10aW1lIHNlYXJjaCBpbmRleCB1cGRhdGVzLiBUaHJpZnQgaGFzIGFsbG93ZWQgdGhlCi1zZWFyY2ggdGVhbSB0byBsZXZlcmFnZSBlYWNoIGxhbmd1YWdlIGZvciBpdHMgc3RyZW5ndGhzIGFuZCB0byBkZXZlbG9wIGNvZGUgYXQgYSByYXBpZCBwYWNlLgotCi1cc3Vic2VjdGlvbntMb2dnaW5nfQotVGhlIFRocmlmdCBcdGV4dHR0e1RGaWxlVHJhbnNwb3J0fSBmdW5jdGlvbmFsaXR5IGlzIHVzZWQgZm9yIHN0cnVjdHVyZWQgbG9nZ2luZy4gRWFjaAotc2VydmljZSBmdW5jdGlvbiBkZWZpbml0aW9uIGFsb25nIHdpdGggaXRzIHBhcmFtZXRlcnMgY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUKLWEgc3RydWN0dXJlZCBsb2cgZW50cnkgaWRlbnRpZmllZCBieSB0aGUgZnVuY3Rpb24gbmFtZS4gVGhpcyBsb2cgY2FuIHRoZW4gYmUgdXNlZCBmb3IKLWEgdmFyaWV0eSBvZiBwdXJwb3NlcywgaW5jbHVkaW5nIGlubGluZSBhbmQgb2ZmbGluZSBwcm9jZXNzaW5nLCBzdGF0cyBhZ2dyZWdhdGlvbiBhbmQgYXMgYSByZWRvIGxvZy4KLQotXHNlY3Rpb257Q29uY2x1c2lvbnN9Ci1UaHJpZnQgaGFzIGVuYWJsZWQgRmFjZWJvb2sgdG8gYnVpbGQgc2NhbGFibGUgYmFja2VuZAotc2VydmljZXMgZWZmaWNpZW50bHkgYnkgZW5hYmxpbmcgZW5naW5lZXJzIHRvIGRpdmlkZSBhbmQgY29ucXVlci4gQXBwbGljYXRpb24KLWRldmVsb3BlcnMgY2FuIGZvY3VzIG9uIGFwcGxpY2F0aW9uIGNvZGUgd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUKLXNvY2tldHMgbGF5ZXIuIFdlIGF2b2lkIGR1cGxpY2F0ZWQgd29yayBieSB3cml0aW5nIGJ1ZmZlcmluZyBhbmQgSS9PIGxvZ2ljCi1pbiBvbmUgcGxhY2UsIHJhdGhlciB0aGFuIGludGVyc3BlcnNpbmcgaXQgaW4gZWFjaCBhcHBsaWNhdGlvbi4KLQotVGhyaWZ0IGhhcyBiZWVuIGVtcGxveWVkIGluIGEgd2lkZSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucyBhdCBGYWNlYm9vaywKLWluY2x1ZGluZyBzZWFyY2gsIGxvZ2dpbmcsIG1vYmlsZSwgYWRzLCBhbmQgdGhlIGRldmVsb3BlciBwbGF0Zm9ybS4gV2UgaGF2ZQotZm91bmQgdGhhdCB0aGUgbWFyZ2luYWwgcGVyZm9ybWFuY2UgY29zdCBpbmN1cnJlZCBieSBhbiBleHRyYSBsYXllciBvZgotc29mdHdhcmUgYWJzdHJhY3Rpb24gaXMgZmFyIGVjbGlwc2VkIGJ5IHRoZSBnYWlucyBpbiBkZXZlbG9wZXIgZWZmaWNpZW5jeSBhbmQKLXN5c3RlbXMgcmVsaWFiaWxpdHkuCi0KLVxhcHBlbmRpeAotCi1cc2VjdGlvbntTaW1pbGFyIFN5c3RlbXN9Ci1UaGUgZm9sbG93aW5nIGFyZSBzb2Z0d2FyZSBzeXN0ZW1zIHNpbWlsYXIgdG8gVGhyaWZ0LiBFYWNoIGlzICh2ZXJ5ISkgYnJpZWZseQotZGVzY3JpYmVkOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFx0ZXh0aXR7U09BUC59IFhNTC1iYXNlZC4gRGVzaWduZWQgZm9yIHdlYiBzZXJ2aWNlcyB2aWEgSFRUUCwgZXhjZXNzaXZlCi1YTUwgcGFyc2luZyBvdmVyaGVhZC4KLVxpdGVtIFx0ZXh0aXR7Q09SQkEufSBSZWxhdGl2ZWx5IGNvbXByZWhlbnNpdmUsIGRlYmF0YWJseSBvdmVyZGVzaWduZWQgYW5kCi1oZWF2eXdlaWdodC4gQ29tcGFyYWJseSBjdW1iZXJzb21lIHNvZnR3YXJlIGluc3RhbGxhdGlvbi4KLVxpdGVtIFx0ZXh0aXR7Q09NLn0gRW1icmFjZWQgbWFpbmx5IGluIFdpbmRvd3MgY2xpZW50IHNvZnRhcmUuIE5vdCBhbiBlbnRpcmVseQotb3BlbiBzb2x1dGlvbi4KLVxpdGVtIFx0ZXh0aXR7UGlsbGFyLn0gTGlnaHR3ZWlnaHQgYW5kIGhpZ2gtcGVyZm9ybWFuY2UsIGJ1dCBtaXNzaW5nIHZlcnNpb25pbmcKLWFuZCBhYnN0cmFjdGlvbi4KLVxpdGVtIFx0ZXh0aXR7UHJvdG9jb2wgQnVmZmVycy59IENsb3NlZC1zb3VyY2UsIG93bmVkIGJ5IEdvb2dsZS4gRGVzY3JpYmVkIGluCi1TYXd6YWxsIHBhcGVyLgotXGVuZHtpdGVtaXplfQotCi1cYWNrcwotCi1NYW55IHRoYW5rcyBmb3IgZmVlZGJhY2sgb24gVGhyaWZ0IChhbmQgZXh0cmVtZSB0cmlhbCBieSBmaXJlKSBhcmUgZHVlIHRvCi1NYXJ0aW4gU21pdGgsIEthcmwgVm9za3VpbCBhbmQgWWlzaGFuIFdvbmcuCi0KLVRocmlmdCBpcyBhIHN1Y2Nlc3NvciB0byBQaWxsYXIsIGEgc2ltaWxhciBzeXN0ZW0gZGV2ZWxvcGVkCi1ieSBBZGFtIEQnQW5nZWxvLCBmaXJzdCB3aGlsZSBhdCBDYWx0ZWNoIGFuZCBjb250aW51ZWQgbGF0ZXIgYXQgRmFjZWJvb2suCi1UaHJpZnQgc2ltcGx5IHdvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIHdpdGhvdXQgQWRhbSdzIGluc2lnaHRzLgotCi1cYmVnaW57dGhlYmlibGlvZ3JhcGh5fXt9Ci0KLVxiaWJpdGVte2Jvb3N0LnRocmVhZHN9Ci1LZW1wZiwgV2lsbGlhbSwKLWBgQm9vc3QuVGhyZWFkcycnLAotXHVybHtodHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvaHRtbC90aHJlYWRzLmh0bWx9Ci0KLVxiaWJpdGVte2Jvb3N0LnRocmVhZHBvb2x9Ci1IZW5rZWwsIFBoaWxpcHAsCi1gYHRocmVhZHBvb2wnJywKLVx1cmx7aHR0cDovL3RocmVhZHBvb2wuc291cmNlZm9yZ2UubmV0fQotCi1cZW5ke3RoZWJpYmxpb2dyYXBoeX0KLQotXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL2R1Yi5qc29uIGIvZHViLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3NmFmYwotLS0gL2Rldi9udWxsCisrKyBiL2R1Yi5qc29uCkBAIC0wLDAgKzEsMjggQEAKK3sKKyAgIm5hbWUiOiAiYXBhY2hlLXRocmlmdCIsCisgICJkZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IEQgbGlicmFyeSIsCisgICJhdXRob3JzIjogWworICAgICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iCisgIF0sCisgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAibGliZXZlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICJ+PjIuMC4yIgorICAgIH0sCisgICAgIm9wZW5zc2wiOiB7CisgICAgICAidmVyc2lvbiI6ICI+PTEuMS42IgorICAgIH0KKyAgfSwKKyAgInN5c3RlbURlcGVuZGVuY2llcyI6ICJPbiBzeXN0ZW1zIHdpdGggbmF0aXZlIG9wZW5zc2wgMS4wLnggdXNlIGR1YiBwYWNrYWdlIG9wZW5zc2x+PjEuMSwgb24gc3lzdGVtcyB3aXRoIG5hdGl2ZSBvcGVuc3NsIDEuMS54IHVzZSBkdWIgcGFja2FnZSBvcGVuc3Nsfj4yLjAiLAorICAidGFyZ2V0VHlwZSI6ICJsaWJyYXJ5IiwKKyAgInNvdXJjZVBhdGhzIjogWworICAgICJsaWIvZC9zcmMiIAorICBdLAorICAiaW1wb3J0UGF0aHMiOiBbCisgICAgImxpYi9kL3NyYyIKKyAgXSwKKyAgImV4Y2x1ZGVkU291cmNlRmlsZXMiOiBbCisgICAgImxpYi9kL3NyYy90aHJpZnQvaW5kZXguZCIKKyAgXQorfQpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlLmFtIGIvbGliL01ha2VmaWxlLmFtCmluZGV4IDdkZjY2ZDEuLmI2Y2UyMGUgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZS5hbQorKysgYi9saWIvTWFrZWZpbGUuYW0KQEAgLTE3LDggKzE3LDE5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0gXAotICBjcHAKK1NVQkRJUlMgPSBqc29uIHhtbAorUFJFQ1JPU1NfVEFSR0VUID0KKworaWYgV0lUSF9DUFAKKyMgY3BwIGRpciBpcyBwaWNrZWQgZGlyZWN0bHkgYnkgcGx1Z2luIGJ1aWxkCitpZiAhV0lUSF9QTFVHSU4KK1NVQkRJUlMgKz0gY3BwCitlbmRpZgorZW5kaWYKKworaWYgV0lUSF9DX0dMSUIKK1NVQkRJUlMgKz0gY19nbGliCitlbmRpZgogCiBpZiBXSVRIX01PTk8KIFNVQkRJUlMgKz0gY3NoYXJwCkBAIC0yNiw2ICszNywxMCBAQAogCiBpZiBXSVRIX0pBVkEKIFNVQkRJUlMgKz0gamF2YQorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWphdmEKKyMgSmF2YVNjcmlwdCB1bml0IHRlc3QgZGVwZW5kcyBvbiBqYXZhCisjIHNvIHRlc3Qgb25seSBpZiBqYXZhLCBhbnQgJiBjbyBpcyBhdmFpbGFibGUKK1NVQkRJUlMgKz0ganMKIGVuZGlmCiAKIGlmIFdJVEhfUFlUSE9OCkBAIC00MCw2ICs1NSwxMCBAQAogU1VCRElSUyArPSByYgogZW5kaWYKIAoraWYgV0lUSF9IQVNLRUxMCitTVUJESVJTICs9IGhzCitlbmRpZgorCiBpZiBXSVRIX1BFUkwKIFNVQkRJUlMgKz0gcGVybAogZW5kaWYKQEAgLTQ4LDE0ICs2Nyw2MCBAQAogU1VCRElSUyArPSBwaHAKIGVuZGlmCiAKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitlbmRpZgorCitpZiBXSVRIX0RPVE5FVENPUkUKK1NVQkRJUlMgKz0gbmV0Y29yZQorZW5kaWYKKworaWYgV0lUSF9HTworU1VCRElSUyArPSBnbworZW5kaWYKKworaWYgV0lUSF9ECitTVUJESVJTICs9IGQKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1kCitlbmRpZgorCitpZiBXSVRIX05PREVKUworU1VCRElSUyArPSBub2RlanMKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1ub2RlanMKK1NVQkRJUlMgKz0gbm9kZXRzCitlbmRpZgorCitpZiBXSVRIX0xVQQorU1VCRElSUyArPSBsdWEKK2VuZGlmCisKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK2VuZGlmCisKK2lmIFdJVEhfQ0wKK1NVQkRJUlMgKz0gY2wKK2VuZGlmCisKK2lmIFdJVEhfU1dJRlQKK1NVQkRJUlMgKz0gc3dpZnQKK2VuZGlmCisKICMgQWxsIG9mIHRoZSBsaWJzIHRoYXQgZG9uJ3QgdXNlIEF1dG9tYWtlIG5lZWQgdG8gZ28gaW4gaGVyZQogIyBzbyB0aGV5IHdpbGwgZW5kIHVwIGluIG91ciByZWxlYXNlIHRhcmJhbGxzLgogRVhUUkFfRElTVCA9IFwKLSAgY29jb2EgXAotICBocyAgICBcCi0gIG9jYW1sIFwKLSAgcGhwICAgXAotICBlcmwgICBcCi0gIGpzICAgIFwKLSAgYXMzICAgXAotICBzdAorCWFzMyBcCisJY29jb2EgXAorCWQgXAorCWRhcnQgXAorCWRlbHBoaSBcCisJaGF4ZSBcCisJamF2YW1lIFwKKwlqcyBcCisJb2NhbWwgXAorCXN0IFwKKwl0cworCitwcmVjcm9zcy0lOgorCSQoTUFLRSkgLUMgJCogcHJlY3Jvc3MKK3ByZWNyb3NzOiAkKFBSRUNST1NTX1RBUkdFVCkKZGlmZiAtLWdpdCBhL2xpYi9hczMvYnVpbGQucHJvcGVydGllcyBiL2xpYi9hczMvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYzNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2FzMy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorIyBNYXZlbiBBbnQgdGFza3MgSmFyIGRldGFpbHMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9saWIvYXMzL2J1aWxkLnhtbCBiL2xpYi9hczMvYnVpbGQueG1sCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMWI3YTU0NC4uYjBjNGM4NQotLS0gYS9saWIvYXMzL2J1aWxkLnhtbAorKysgYi9saWIvYXMzL2J1aWxkLnhtbApAQCAtOCw3ICs4LDcgQEAKICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCkBAIC0xNiw1MSArMTYsMTY3IEBACiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IG5hbWU9ImxpYnRocmlmdCIgZGVmYXVsdD0iY29tcGlsZSIgYmFzZWRpcj0iLiI+CisgLS0+Cis8cHJvamVjdCBuYW1lPSJsaWJ0aHJpZnQtYXMzIiBkZWZhdWx0PSJjb21waWxlIiBiYXNlZGlyPSIuIgorICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KIAotICA8ZGVzY3JpcHRpb24+VGhyaWZ0IEJ1aWxkIEZpbGU8L2Rlc2NyaXB0aW9uPgorICA8cHJvcGVydHkgbmFtZT0iYXMzLmFydGlmYWN0aWQiIHZhbHVlPSIke2FudC5wcm9qZWN0Lm5hbWV9Ii8+CiAKLSAgPHRhc2tkZWYgcmVzb3VyY2U9ImZsZXhUYXNrcy50YXNrcyIgY2xhc3NwYXRoPSIke0ZMRVhfSE9NRX0vYW50L2xpYi9mbGV4VGFza3MuamFyIiAvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnJvb3QiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uLyIvPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIvPgogCi0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSIke2Jhc2VkaXJ9L3NyYyIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiB2YWx1ZT0iJHtiYXNlZGlyfS9idWlsZCIgLz4KKyAgPCEtLSBpbmhlcml0IGZyb20gdGhlIGphdmEgYnVpbGQgZmlsZSBmb3IgdmVyc2lvbiBhbmQgb3RoZXIgcHJvcGVydGllcyAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9ncmFkbGUucHJvcGVydGllcyIgLz4KIAotICA8dGFyZ2V0IG5hbWU9ImNoZWNrRmxleEhvbWUiIHVubGVzcz0iRkxFWF9IT01FIj4KLSAgICA8ZmFpbCBtZXNzYWdlPSdZb3UgbXVzdCBzZXQgdGhlIHByb3BlcnR5IEZMRVhfSE9NRSB3aXRoIHRoZSBwYXRoIHRvIHlvdXIgZmxleCBTREssIGVnLiBhbnQgLURGTEVYX0hPTUU9Ii9BcHBsaWNhdGlvbnMvQWRvYmUgRmxleCBCdWlsZGVyIDMvc2Rrcy8zLjIuMCInLz4KKyAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KKworICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgorICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgorICA8L2NvbmRpdGlvbj4KKyAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1TTkFQU0hPVCIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJhczMuZmluYWwubmFtZSIgdmFsdWU9IiR7YXMzLmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KKworICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtiYXNlZGlyfS9zcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYXMzLnN3Yy5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7YXMzLmZpbmFsLm5hbWV9LnN3YyIvPgorICA8cHJvcGVydHkgbmFtZT0iYXMzLnBvbS54bWwiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHthczMuZmluYWwubmFtZX0ucG9tIi8+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJzZXR1cC5pbml0LGZsZXguaW5pdCIgdW5sZXNzPSJpbml0LmZpbmlzaGVkIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5pdC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJjaGVja0ZsZXhIb21lIj4KKyAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KKyAgICA8dHN0YW1wLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CiAKLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgorICA8dGFyZ2V0IG5hbWU9ImZsZXguY2hlY2siIHVubGVzcz0iRkxFWF9IT01FIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSdZb3UgbXVzdCBzZXQgdGhlIEZMRVhfSE9NRSBwcm9wZXJ0eSBwb2ludGluZyB0byB5b3VyIGZsZXggU0RLLCBlZy4gYW50IC1ERkxFWF9IT01FPSIvQXBwbGljYXRpb25zL0Fkb2JlIEZsZXggQnVpbGRlciAzL3Nka3MvMy4yLjAiJy8+CisgIDwvdGFyZ2V0PgogCi0gICAgPCEtLSBjb21wYyB0YWtlcyBhIGxpc3Qgb2YgY2xhc3NlcyBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBlZy4gInBrZy5DbGFzcyBwa2cuQ2xhc3MyIgotICAgICAgICAgVG8gZ2VuZXJhdGUgdGhpcywgd2UgaGF2ZSB0byBjcmVhdGUgYW4gYW50IHBhdGgsIHRoZW4gY29udmVydCBpdCB1c2luZwotICAgICAgICAgcGF0aGNvbnZlcnQsIHJlbW92aW5nIHRoZSBwcmVmaXggd2l0aCBhIG1hcCBhbmQgcmVtb3ZpbmcgdGhlIC5hcyBzdWZmaXggdXNpbmcKLSAgICAgICAgIGEgbWFwcGVyLiAgRnJvbSBodHRwOi8vc25pcHBldHMuZHpvbmUuY29tL3Bvc3RzL3Nob3cvMzYyNy4KLSAgICAtLT4KLSAgICA8cGF0aCBpZD0iY2xhc3Nlc1JhdyI+CisgIDx0YXJnZXQgbmFtZT0iZmxleC5pbml0IiBkZXBlbmRzPSJmbGV4LmNoZWNrIiB1bmxlc3M9ImZsZXguZmluaXNoZWQiPgorICAgIDx0YXNrZGVmIHJlc291cmNlPSJmbGV4VGFza3MudGFza3MiIGNsYXNzcGF0aD0iJHtGTEVYX0hPTUV9L2FudC9saWIvZmxleFRhc2tzLmphciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZmxleC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8cGF0aCBpZD0iYXMuc3JjLmZpbGVzIj4KICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9LyI+Ci0gICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmFzIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouYXMiLz4KICAgICAgIDwvZmlsZXNldD4KICAgICA8L3BhdGg+Ci0gICAgPHBhdGhjb252ZXJ0IAotICAgICAgcHJvcGVydHk9ImNsYXNzZXNDbGVhbiIgCi0gICAgICBwYXRoc2VwPSIgIiAKLSAgICAgIGRpcnNlcD0iLiIgCi0gICAgICByZWZpZD0iY2xhc3Nlc1JhdyI+CisgICAgPHBhdGhjb252ZXJ0CisgICAgICBwcm9wZXJ0eT0iYXMuc3JjLmNsYXNzZXMiCisgICAgICBwYXRoc2VwPSIgIgorICAgICAgZGlyc2VwPSIuIgorICAgICAgcmVmaWQ9ImFzLnNyYy5maWxlcyIKKyAgICA+CiAgICAgICA8bWFwIGZyb209IiR7c3JjfS8iIHRvPSIiLz4KICAgICAgIDxtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5hcyIgdG89IioiLz4KICAgICA8L3BhdGhjb252ZXJ0PgogCi0gICAgPGNvbXBjIG91dHB1dD0iJHtidWlsZH0vbGlidGhyaWZ0LnN3YyIgaW5jbHVkZS1jbGFzc2VzPSIke2NsYXNzZXNDbGVhbn0iPgorICAgIDxjb21wYyBvdXRwdXQ9IiR7YXMzLnN3Yy5maWxlfSIgaW5jbHVkZS1jbGFzc2VzPSIke2FzLnNyYy5jbGFzc2VzfSI+CiAgICAgICA8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke3NyY30iLz4KICAgICA8L2NvbXBjPgotCiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9InNldHVwLmluaXQsbXZuLmFudC50YXNrcy5jaGVjayIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CisgICAgPGVjaG8gbWVzc2FnZT0iJHttdm4uYW50LnRhc2suamFyfSIvPgorICAgIDwhLS0gRG93bmxvYWQgbXZuIGFudCB0YXNrcywgZG93bmxvYWQgZGVwZW5kZW5jaWVzLCBhbmQgc2V0dXAgcG9tIGZpbGUgLS0+CisgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iLz4KKworICAgIDwhLS0gcmVtb3RlIHJlcG9zaXRvcmllcyB1c2VkIHRvIGRvd25sb2FkIGRlcGVuZGVuY2llcyBmcm9tIC0tPgorICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJjZW50cmFsIiB1cmw9IiR7bXZuLnJlcG99Ii8+CisgICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImFwYWNoZSIgdXJsPSIke2FwYWNoZS5yZXBvfSIvPgorCisgICAgPCEtLSBQb20gZmlsZSBpbmZvcm1hdGlvbiAtLT4KKyAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iCisgICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIKKyAgICAgIGFydGlmYWN0SWQ9IiR7YXMzLmFydGlmYWN0aWR9IgorICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIKKyAgICAgIHVybD0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICAgICAgbmFtZT0iQXBhY2hlIFRocmlmdCIKKyAgICAgIGRlc2NyaXB0aW9uPSJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIKKyAgICAgIHBhY2thZ2luZz0ic3djIgorICAgID4KKyAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+CisgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+CisgICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KKyAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiCisgICAgICAvPgorICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJkcmVpc3MiIG5hbWU9IkRhdmlkIFJlaXNzIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJhZGl0eWEiIG5hbWU9IkFkaXR5YSBBZ2Fyd2FsIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJtYXJjayIgbmFtZT0iTWFyYyBLd2lhdGtvd3NraSIvPgorICAgICAgPGRldmVsb3BlciBpZD0iandhbmciIG5hbWU9IkphbWVzIFdhbmciLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImNwaXJvIiBuYW1lPSJDaHJpcyBQaXJvIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJibWF1cmVyIiBuYW1lPSJCZW4gTWF1cmVyIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJrY2xhcmsiIG5hbWU9IktldmluIENsYXJrIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJqYWtlIiBuYW1lPSJKYWtlIEx1Y2lhbmkiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImJyeWFuZHV4YnVyeSIgbmFtZT0iQnJ5YW4gRHV4YnVyeSIvPgorICAgICAgPGRldmVsb3BlciBpZD0iZXN0ZXZlIiBuYW1lPSJFc3RldmUgRmVybmFuZGV6Ii8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJ0b2RkIiBuYW1lPSJUb2RkIExpcGNvbiIvPgorICAgICAgPGRldmVsb3BlciBpZD0iZ2VlY2hvcmFtYSIgbmFtZT0iQW5kcmV3IE1jR2VhY2hpZSIvPgorICAgICAgPGRldmVsb3BlciBpZD0ibW9saW5hcm8iIG5hbWU9IkFudGhvbnkgTW9saW5hcm8iLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9InJvZ2VyIiBuYW1lPSJSb2dlciBNZWllciIvPgorICAgICAgPGRldmVsb3BlciBpZD0iamZhcnJlbGwiIG5hbWU9Ikpha2UgRmFycmVsbCIvPgorICAgICAgPGRldmVsb3BlciBpZD0iamVuc2ciIG5hbWU9IkplbnMgR2V5ZXIiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImNhcmwiIG5hbWU9IkNhcmwgWWVrc2lnaWFuIi8+CisgICAgPC9hcnRpZmFjdDpwb20+CisKKyAgICA8IS0tIEdlbmVyYXRlIHRoZSBwb20gZmlsZSAtLT4KKyAgICA8YXJ0aWZhY3Q6d3JpdGVwb20gcG9tUmVmSWQ9InBvbSIgZmlsZT0iJHthczMucG9tLnhtbH0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJzaWduQW5kRGVwbG95Ij4KKyAgICA8IS0tIFNpZ24gYW5kIGRlcGxveSBqYXJzIHRvIGFwYWNoZSByZXBvIC0tPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NpZmllciIgZGVmYXVsdD0iIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdpbmciIGRlZmF1bHQ9ImphciIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9tIiBkZWZhdWx0PSIiLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxhcnRpZmFjdDptdm4gZm9yaz0idHJ1ZSI+CisgICAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1ncGctcGx1Z2luOjEuMTpzaWduLWFuZC1kZXBsb3ktZmlsZSIvPgorICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke21hdmVuLXJlcG9zaXRvcnktaWR9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7bWF2ZW4tcmVwb3NpdG9yeS11cmx9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1EcG9tRmlsZT1Ae3BvbX0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLURmaWxlPUB7ZmlsZX0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLURjbGFzc2lmaWVyPUB7Y2xhc3NpZmllcn0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iLURwYWNrYWdpbmc9QHtwYWNrYWdpbmd9Ii8+CisgICAgICAgIDxhcmcgdmFsdWU9Ii1QZ3BnIi8+CisgICAgICA8L2FydGlmYWN0Om12bj4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIiBkZXBlbmRzPSJjbGVhbixjb21waWxlLG12bi5pbml0Ij4KKyAgICA8IS0tIENvbXBpbGUsIHBhY2thZ2VzIGFuZCB0aGVuIHNlbmQgcmVsZWFzZSB0byBhcGFjaGUgbWF2ZW4gcmVwbyAtLT4KKyAgICA8IS0tIHJ1biB3aXRoOiBhbnQgLURyZWxlYXNlPXRydWUgcHVibGlzaCAtLT4KKyAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2FzMy5wb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgorICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7YXMzLnN3Yy5maWxlfSIgcGFja2FnaW5nPSJzd2MiIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgorICA8L3RhcmdldD4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9hczMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9hczMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2FzMy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXJyb3IuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcwppbmRleCAwMzlkOWI5Li4zNDQ4ZmNlIDEwMDY0NAotLS0gYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcwpAQCAtNDAsMTEgKzQwLDE2IEBACiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBXUk9OR19NRVRIT0RfTkFNRTppbnQgPSAzOwogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgQkFEX1NFUVVFTkNFX0lEOmludCA9IDQ7CiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBNSVNTSU5HX1JFU1VMVDppbnQgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgSU5URVJOQUxfRVJST1I6aW50ID0gNjsKKyAgICBwdWJsaWMgc3RhdGljIGNvbnN0IFBST1RPQ09MX0VSUk9SOmludCA9IDc7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBJTlZBTElEX1RSQU5TRk9STTppbnQgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgSU5WQUxJRF9QUk9UT0NPTDppbnQgPSA5OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6aW50ID0gMTA7CiAKICAgICBwdWJsaWMgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXJyb3IodHlwZTppbnQgPSBVTktOT1dOLCBtZXNzYWdlOlN0cmluZyA9ICIiKSB7CiAgICAgICBzdXBlcihtZXNzYWdlLCB0eXBlKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKTpUQXBwbGljYXRpb25FcnJvciB7CiAgICAgICB2YXIgZmllbGQ6VEZpZWxkOwogICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuYXMKaW5kZXggNDQxMjQ3OS4uYjJmZjlkOCAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5hcwpAQCAtMzgsOSArMzgsNiBAQAogICAgIHByb3RlY3RlZCB2YXIgc3RyaWN0UmVhZF86Qm9vbGVhbiA9IGZhbHNlOwogICAgIHByb3RlY3RlZCB2YXIgc3RyaWN0V3JpdGVfOkJvb2xlYW4gPSB0cnVlOwogICAgIAotICAgIHByb3RlY3RlZCB2YXIgcmVhZExlbmd0aF86aW50OwotICAgIHByb3RlY3RlZCB2YXIgY2hlY2tSZWFkTGVuZ3RoXzpCb29sZWFuID0gZmFsc2U7Ci0KICAgLyoqCiAgICAqIEZhY3RvcnkKICAgICovCkBAIC0yOTgsNyArMjk1LDYgQEAKICAgCiAgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKTpCeXRlQXJyYXkgewogICAgICAgICB2YXIgc2l6ZTppbnQgPSByZWFkSTMyKCk7Ci0gICAgICAgIGNoZWNrUmVhZExlbmd0aChzaXplKTsKICAgICAgICAgdmFyIGJ1ZjpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7CiAgICAgICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CiAgICAgICAgIHJldHVybiBidWY7CkBAIC0zMDcsMjUgKzMwMywxMCBAQAogICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEFsbChsZW46aW50KTp2b2lkIHsKICAgICAgIHJlc2V0KGJ5dGVzKTsKICAgICAgIAotICAgICAgY2hlY2tSZWFkTGVuZ3RoKGxlbik7CiAgICAgICAgIHRyYW5zXy5yZWFkQWxsKGJ5dGVzLCAwLCBsZW4pOwogICAgICAgICAKICAgICAgICAgYnl0ZXMucG9zaXRpb24gPSAwOwogICAgICAgfQotICAKLSAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZExlbmd0aChyZWFkTGVuZ3RoOmludCk6dm9pZCB7Ci0gICAgICByZWFkTGVuZ3RoXyA9IHJlYWRMZW5ndGg7Ci0gICAgICBjaGVja1JlYWRMZW5ndGhfID0gdHJ1ZTsKLSAgICB9Ci0gIAotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjaGVja1JlYWRMZW5ndGgobGVuZ3RoOmludCk6dm9pZCB7Ci0gICAgICAgIGlmIChjaGVja1JlYWRMZW5ndGhfKSB7Ci0gICAgICAgICAgICByZWFkTGVuZ3RoXyAtPSBsZW5ndGg7Ci0gICAgICAgICAgICBpZiAocmVhZExlbmd0aF8gPCAwKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBURXJyb3IoIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHJlc2V0KGFycjpCeXRlQXJyYXkpOnZvaWQgewogICAgICAgYXJyLmxlbmd0aCA9IDA7CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzCmluZGV4IGM1Nzg4ZGIuLjlmZmY3MzAgMTAwNjQ0Ci0tLSBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBTSVpFX0xJTUlUOmludCA9IDM7CiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBCQURfVkVSU0lPTjppbnQgPSA0OwogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgTk9UX0lNUExFTUVOVEVEOmludCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBERVBUSF9MSU1JVDppbnQgPSA2OwogICAKICAgICBwdWJsaWMgZnVuY3Rpb24gVFByb3RvY29sRXJyb3IoZXJyb3I6aW50ID0gVU5LTk9XTiwgbWVzc2FnZTpTdHJpbmcgPSAiIikgewogICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3IpOwpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuYXMKaW5kZXggMzM3NDk4Ni4uODYzYzU5YiAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50LmFzCkBAIC0xOTUsNyArMTk1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSB0aGlzLnNvY2tldDsKICAgICAgICAgICAgIHRoaXMuaW5wdXQgPSB0aGlzLnNvY2tldDsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKCJDT05ORUNUICIgKyByZXNvdXJjZSArICIgSFRUUC8xLjFcbiIgKyAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIlxyXG4iICsgIlVzZXItQWdlbnQ6IEJhdHRsZU5ldFxyXG4iICsgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXHJcbiIgKyAiY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iICsgIkFjY2VwdDogKi8qXHJcblxyXG4iKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKCJDT05ORUNUICIgKyByZXNvdXJjZSArICIgSFRUUC8xLjFcbiIgKyAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIlxyXG4iICsgIlVzZXItQWdlbnQ6IFRocmlmdC9BUzNcclxuIiArICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG4iICsgImNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC10aHJpZnRcclxuIiArICJBY2NlcHQ6ICovKlxyXG5cclxuIik7CiAgICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuYXMKaW5kZXggYTYzZTMxNC4uNDM1ZjkxMSAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5hcwpAQCAtMjcsNiArMjcsNyBAQAogICBpbXBvcnQgZmxhc2gubmV0LlVSTExvYWRlckRhdGFGb3JtYXQ7CiAgIGltcG9ydCBmbGFzaC5uZXQuVVJMUmVxdWVzdDsKICAgaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0TWV0aG9kOworICBpbXBvcnQgZmxhc2guc3lzdGVtLkNhcGFiaWxpdGllczsKICAgaW1wb3J0IGZsYXNoLnV0aWxzLkJ5dGVBcnJheTsKICAgCiAgIC8qKgpAQCAtMzgsMTQgKzM5LDE5IEBACiAgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdF86VVJMUmVxdWVzdCA9IG51bGw7CiAgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdEJ1ZmZlcl86Qnl0ZUFycmF5ID0gbmV3IEJ5dGVBcnJheSgpOwogICAgIHByaXZhdGUgdmFyIHJlc3BvbnNlQnVmZmVyXzpCeXRlQXJyYXkgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHRyYWNlQnVmZmVyc186Qm9vbGVhbiA9IENhcGFiaWxpdGllcy5pc0RlYnVnZ2VyOworCiAgICAgCiAgICAgcHVibGljIGZ1bmN0aW9uIGdldEJ1ZmZlcigpOkJ5dGVBcnJheSB7CiAgICAgICByZXR1cm4gcmVxdWVzdEJ1ZmZlcl87CiAgICAgfQogICAgIAotICAgIHB1YmxpYyBmdW5jdGlvbiBUSHR0cENsaWVudChyZXF1ZXN0OlVSTFJlcXVlc3QpOnZvaWQgeworICAgIHB1YmxpYyBmdW5jdGlvbiBUSHR0cENsaWVudChyZXF1ZXN0OlVSTFJlcXVlc3QsIHRyYWNlQnVmZmVyczpCb29sZWFuPXRydWUpOnZvaWQgewogICAgICAgcmVxdWVzdC5jb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CiAgICAgICByZXF1ZXN0XyA9IHJlcXVlc3Q7CisgICAgICBpZih0cmFjZUJ1ZmZlcnMgPT0gZmFsc2UpIHsKKyAgICAgICAgdHJhY2VCdWZmZXJzXyA9IHRyYWNlQnVmZmVyczsKKyAgICAgIH0KICAgICB9CiAgICAgCiAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKTp2b2lkIHsKQEAgLTY0LDkgKzcwLDE2IEBACiAgICAgICB9CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXNwb25zZUJ1ZmZlcl8ucmVhZEJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKHRyYWNlQnVmZmVyc18pIHsKKyAgICAgICAgICAgICAgZHVtcEJ1ZmZlcihidWYsICJSRUFEIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbGVuOwogICAgICAgICAgIH0KICAgICAgICAgICBjYXRjaCAoZTpFT0ZFcnJvcikgeworICAgICAgICAgICAgaWYgKHRyYWNlQnVmZmVyc18pIHsKKyAgICAgICAgICAgICAgZHVtcEJ1ZmZlcihyZXF1ZXN0QnVmZmVyXywgIkZBSUxFRC1SRVNQT05TRS1SRVFVRVNUIik7CisgICAgICAgICAgICAgIGR1bXBCdWZmZXIocmVzcG9uc2VCdWZmZXJfLCAiRkFJTEVELVJFU1BPTlNFIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEVycm9yKFRUcmFuc3BvcnRFcnJvci5VTktOT1dOLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKQEAgLTgxLDYgKzk0LDkgQEAKICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgIGxvYWRlci5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNPTVBMRVRFLCBmdW5jdGlvbihldmVudDpFdmVudCk6dm9pZCB7CiAgICAgICAgICByZXNwb25zZUJ1ZmZlcl8gPSBVUkxMb2FkZXIoZXZlbnQudGFyZ2V0KS5kYXRhOworICAgICAgICAgaWYgKHRyYWNlQnVmZmVyc18pIHsKKyAgICAgICAgICAgZHVtcEJ1ZmZlcihyZXNwb25zZUJ1ZmZlcl8sICJSRVNQT05TRV9CVUZGRVIiKTsKKyAgICAgICAgIH0KICAgICAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICAgICAgcmVzcG9uc2VCdWZmZXJfID0gbnVsbDsKICAgICAgICAgfSk7CkBAIC05OSw1ICsxMTUsMjAgQEAKICAgICAgIHJlcXVlc3RfLmRhdGEgPSByZXF1ZXN0QnVmZmVyXzsKICAgICAgIGxvYWRlci5sb2FkKHJlcXVlc3RfKTsKICAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGR1bXBCdWZmZXIoYnVmOkJ5dGVBcnJheSwgcHJlZml4OlN0cmluZyk6U3RyaW5nIHsKKyAgICAgIHZhciBkZWJ1Z1N0cmluZyA6IFN0cmluZyA9IHByZWZpeCArICIgQlVGRkVSICI7CisgICAgICBpZiAoYnVmICE9IG51bGwpIHsKKyAgICAgICAgZGVidWdTdHJpbmcgKz0gImxlbmd0aDogIiArIGJ1Zi5sZW5ndGggKyAiLCAiOworICAgICAgICBmb3IgKHZhciBpIDogaW50ID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGRlYnVnU3RyaW5nICs9ICJbIiArIGJ1ZltpXS50b1N0cmluZygxNikgKyAiXSI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlYnVnU3RyaW5nID0gIm51bGwiOworICAgICAgfQorICAgICAgdHJhY2UoZGVidWdTdHJpbmcpOworICAgICAgcmV0dXJuIGRlYnVnU3RyaW5nOworICAgIH0KKwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGQ3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5hcwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKgkJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Cit7CisKKyAgaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuSU9FcnJvckV2ZW50OworICBpbXBvcnQgZmxhc2guZXZlbnRzLlByb2dyZXNzRXZlbnQ7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuU2VjdXJpdHlFcnJvckV2ZW50OworICBpbXBvcnQgZmxhc2guZXJyb3JzLkVPRkVycm9yOworICBpbXBvcnQgZmxhc2guZXJyb3JzLklPRXJyb3I7CisgIGltcG9ydCBmbGFzaC5uZXQuVVJMTG9hZGVyOworICBpbXBvcnQgZmxhc2gubmV0LlVSTExvYWRlckRhdGFGb3JtYXQ7CisgIGltcG9ydCBmbGFzaC5uZXQuVVJMUmVxdWVzdDsKKyAgaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0TWV0aG9kOworICBpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFJbnB1dDsKKyAgaW1wb3J0IGZsYXNoLnV0aWxzLklEYXRhT3V0cHV0OworICBpbXBvcnQgZmxhc2gudXRpbHMuQnl0ZUFycmF5OworICBpbXBvcnQgZmxhc2gubmV0LlNvY2tldDsKKworCisgIC8qKgorICAgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQorICAgKiBUaHJpZnQgU29ja2V0IFNlcnZlciBiYXNlZCBpbXBsZW1lbnRhdGlvbnMuCisgICAqLworCisgIHB1YmxpYyBjbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydAorICB7CisgICAgcHJpdmF0ZSB2YXIgc29ja2V0OlNvY2tldCA9IG51bGw7CisKKyAgICBwcml2YXRlIHZhciBob3N0OlN0cmluZzsKKworICAgIHByaXZhdGUgdmFyIHBvcnQ6aW50OworCisgICAgcHJpdmF0ZSB2YXIgb2J1ZmZlcjpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7CisKKyAgICBwcml2YXRlIHZhciBpbnB1dDpJRGF0YUlucHV0OworCisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0OklEYXRhT3V0cHV0OworCisgICAgcHJpdmF0ZSB2YXIgaW9DYWxsYmFjazpGdW5jdGlvbiA9IG51bGw7CisKKyAgICBwcml2YXRlIHZhciBldmVudERpc3BhdGNoZXI6RXZlbnREaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcigpOworCisgICAgcHVibGljIGZ1bmN0aW9uIFRTb2NrZXQoaG9zdDpTdHJpbmcsIHBvcnQ6aW50KTp2b2lkCisgICAgeworICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuaW5wdXQgPSBudWxsOworICAgICAgdGhpcy5vdXRwdXQgPSBudWxsOworICAgICAgc29ja2V0LmNsb3NlKCkKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcGVlaygpOkJvb2xlYW4KKyAgICB7CisgICAgICBpZihzb2NrZXQuY29ubmVjdGVkKQorICAgICAgeworICAgICAgICB0cmFjZSgiQnl0ZXMgcmVtYWluZWQ6IiArIHNvY2tldC5ieXRlc0F2YWlsYWJsZSk7CisgICAgICAgIHJldHVybiBzb2NrZXQuYnl0ZXNBdmFpbGFibGU+MDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVhZChidWY6Qnl0ZUFycmF5LCBvZmY6aW50LCBsZW46aW50KTppbnQKKyAgICB7CisgICAgICB2YXIgbjE6aW50ID0gMCwgbjI6aW50ID0gMCwgbjM6aW50ID0gMCwgbjQ6aW50ID0gMCwgY2lkeDppbnQgPSAyOworICAgICAgdmFyIGNodW5rU2l6ZTpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7CisKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICBpbnB1dC5yZWFkQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIHJldHVybiBsZW47CisgICAgICB9CisgICAgICBjYXRjaCAoZTpFT0ZFcnJvcikKKyAgICAgIHsKKyAgICAgICAgdHJhY2UoZSk7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoVFRyYW5zcG9ydEVycm9yLkVORF9PRl9GSUxFLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChlOklPRXJyb3IpCisgICAgICB7CisgICAgICAgIHRyYWNlKGUpOworICAgICAgICBpZihpc09wZW4oKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoVFRyYW5zcG9ydEVycm9yLlVOS05PV04sICJJTyBlcnJvciB3aGlsZSByZWFkaW5nOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuTk9UX09QRU4sICJTb2NrZXQgc2VlbSBub3QgdG8gYmUgb3BlbmVkOiAiICsgZSk7CisgICAgCX0KKyAgICAgIH0KKyAgICAgIGNhdGNoIChlOkVycm9yKQorICAgICAgeworICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuVU5LTk9XTiwgIkJhZCBJTyBlcnJvcjogIiArIGUpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZjpCeXRlQXJyYXksIG9mZjppbnQsIGxlbjppbnQpOnZvaWQKKyAgICB7CisgICAgICBvYnVmZmVyLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpTdHJpbmcsIGxpc3RlbmVyOkZ1bmN0aW9uLCB1c2VDYXB0dXJlOkJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6aW50ID0gMCwgdXNlV2Vha1JlZmVyZW5jZTpCb29sZWFuID0gZmFsc2UpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlLCBwcmlvcml0eSwgdXNlV2Vha1JlZmVyZW5jZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6U3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbiwgdXNlQ2FwdHVyZTpCb29sZWFuID0gZmFsc2UpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLnNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoRXZlbnQuQ09OTkVDVCwgc29ja2V0Q29ubmVjdGVkKTsKKyAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoSU9FcnJvckV2ZW50LklPX0VSUk9SLCBzb2NrZXRFcnJvcik7CisgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFNlY3VyaXR5RXJyb3JFdmVudC5TRUNVUklUWV9FUlJPUiwgc29ja2V0U2VjdXJpdHlFcnJvcik7CisgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFByb2dyZXNzRXZlbnQuU09DS0VUX0RBVEEsIHNvY2tldERhdGFIYW5kbGVyKTsKKyAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldENvbm5lY3RlZChldmVudDpFdmVudCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMub3V0cHV0ID0gdGhpcy5zb2NrZXQ7CisgICAgICB0aGlzLmlucHV0ID0gdGhpcy5zb2NrZXQ7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0RXJyb3IoZXZlbnQ6SU9FcnJvckV2ZW50KTp2b2lkCisgICAgeworICAgICAgdHJhY2UoIkVycm9yIENvbm5lY3Rpbmc6IiArIGV2ZW50KTsKKyAgICAgIHRoaXMuY2xvc2UoKTsKKyAgICAgIGlmIChpb0NhbGxiYWNrID09IG51bGwpCisgICAgICB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlvQ2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuVU5LTk9XTiwgIklPRXJyb3I6ICIgKyBldmVudC50ZXh0KSk7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0U2VjdXJpdHlFcnJvcihldmVudDpTZWN1cml0eUVycm9yRXZlbnQpOnZvaWQKKyAgICB7CisgICAgICB0cmFjZSgiU2VjdXJpdHkgRXJyb3IgQ29ubmVjdGluZzoiICsgZXZlbnQpOworICAgICAgdGhpcy5jbG9zZSgpOworICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldERhdGFIYW5kbGVyKGV2ZW50OlByb2dyZXNzRXZlbnQpOnZvaWQKKyAgICB7CisgICAgICBpZiAoaW9DYWxsYmFjayAhPSBudWxsKQorICAgICAgeworICAgICAgICBpb0NhbGxiYWNrKG51bGwpOworICAgICAgfQorICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuaW9DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgdGhpcy5vdXRwdXQud3JpdGVCeXRlcyh0aGlzLm9idWZmZXIpOworICAgICAgdGhpcy5zb2NrZXQuZmx1c2goKTsKKyAgICAgIHRoaXMub2J1ZmZlci5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKTpCb29sZWFuCisgICAgeworICAgICAgcmV0dXJuICh0aGlzLnNvY2tldCA9PSBudWxsID8gZmFsc2UgOiB0aGlzLnNvY2tldC5jb25uZWN0ZWQpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0M2E2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgRmluZCByZXF1aXJlZCBwYWNrYWdlcworZmluZF9wYWNrYWdlKEdMSUIgUkVRVUlSRUQgQ09NUE9ORU5UUyBnb2JqZWN0KQoraW5jbHVkZV9kaXJlY3Rvcmllcygke0dMSUJfSU5DTFVERV9ESVJTfSkKKworaW5jbHVkZV9kaXJlY3RvcmllcyhzcmMpCisKKyMgU1lTTElCUyBjb250YWlucyBsaWJyYXJpZXMgdGhhdCBuZWVkIHRvIGJlIGxpbmtlZCB0byBhbGwgbGliIHRhcmdldHMKK3NldChTWVNMSUJTICR7R0xJQl9MSUJSQVJJRVN9ICR7R0xJQl9HT0JKRUNUX0xJQlJBUklFU30pCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgQyBnbGliIGxpYnJhcnkKK3NldCh0aHJpZnRfY19nbGliX1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYworICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYworKQorCisjIElmIE9wZW5TU0wgaXMgbm90IGZvdW5kIGp1c3QgaWdub3JlIHRoZSBPcGVuU1NMIHN0dWZmCitmaW5kX3BhY2thZ2UoT3BlblNTTCkKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKKyAgICBsaXN0KCBBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKwkgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKKyAgICApCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7T1BFTlNTTF9JTkNMVURFX0RJUn0iKQorICAgIGxpc3QoQVBQRU5EIFNZU0xJQlMgIiR7T1BFTlNTTF9MSUJSQVJJRVN9IikKK2VuZGlmKCkKKworCisjIENvbnRhaW5zIHRoZSB0aHJpZnQgc3BlY2lmaWMgQUREX0xJQlJBUllfVEhSSUZUIGFuZCBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUCitpbmNsdWRlKFRocmlmdE1hY3JvcykKKworQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdF9jX2dsaWIgJHt0aHJpZnRfY19nbGliX1NPVVJDRVN9KQorVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRfY19nbGliICR7U1lTTElCU30pCisKKyMgSW5zdGFsbCB0aGUgaGVhZGVycworaW5zdGFsbChESVJFQ1RPUlkgInNyYy90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisjIENvcHkgY29uZmlnLmggZmlsZQoraW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQklOQVJZX0RJUn0vdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKKyAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0gYi9saWIvY19nbGliL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5YjViMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTE4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0FVVE9NQUtFX09QVElPTlMgPSBzZXJpYWwtdGVzdHMKK1NVQkRJUlMgPSAuIHRlc3QKKworcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZworCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJ0aHJpZnRfY19nbGliLmxhCitwa2djb25maWdfREFUQSA9IHRocmlmdF9jX2dsaWIucGMKKworQU1fQ1BQRkxBR1MgPSAtSXNyYyAtSSBzcmMvdGhyaWZ0L2NfZ2xpYgorQU1fQ0ZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKKworIyBEZWZpbmUgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIG1vZHVsZQorCitsaWJ0aHJpZnRfY19nbGliX2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCisKK2xpYnRocmlmdF9jX2dsaWJfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykKK2xpYnRocmlmdF9jX2dsaWJfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKSAKKworaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdC9jX2dsaWIKK2luY2x1ZGVfdGhyaWZ0X0hFQURFUlMgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmgKKworaW5jbHVkZV9wcm90b2NvbGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb3RvY29sCitpbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitpbmNsdWRlX3RyYW5zcG9ydGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3RyYW5zcG9ydAoraW5jbHVkZV90cmFuc3BvcnRfSEVBREVSUyA9IHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKKworaW5jbHVkZV9zZXJ2ZXJkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9zZXJ2ZXIKK2luY2x1ZGVfc2VydmVyX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaAorCitpbmNsdWRlX3Byb2Nlc3NvcmRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb2Nlc3NvcgoraW5jbHVkZV9wcm9jZXNzb3JfSEVBREVSUyA9IHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKKworCitFWFRSQV9ESVNUID0gXAorICAgICAgICAgICAgIENNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICBjb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKyAgICAgICAgICAgICBSRUFETUUubWQgXAorICAgICAgICAgICAgIHRlc3QvZ2xpYi5zdXBwcmVzcyBcCisgICAgICAgICAgICAgdGhyaWZ0X2NfZ2xpYi5wYy5pbgorCitDTEVBTkZJTEVTID0gXAorICAgICAgICAgICAgICouZ2NubyBcCisgICAgICAgICAgICAgKi5nY2RhCmRpZmYgLS1naXQgYS9saWIvY19nbGliL1JFQURNRS5tZCBiL2xpYi9jX2dsaWIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODRmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL1JFQURNRS5tZApAQCAtMCwwICsxLDQ5IEBACitUaHJpZnQgQyBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIEMKKz09PT09PT09PT09PT09PT09PT0KKworVGhlIFRocmlmdCBDIGxpYnJhcmllcyBhcmUgYnVpbHQgdXNpbmcgdGhlIEdOVSB0b29scy4gIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCitpbiB0aGUgdG9wLWxldmVsIFJFQURNRSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgTWFrZWZpbGVzLgorCitEZXBlbmRlbmNpZXMKKz09PT09PT09PT09PQorCitHTGliCitodHRwOi8vd3d3Lmd0ay5vcmcvCisKK0JyZWFraW5nIENoYW5nZXMKKz09PT09PT09PT09PT09PT0KKworMC4xMi4wCistLS0tLS0KKworVGhlIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyB3aGVuIGdlbmVyYXRpbmcgdGhlIG5hbWUgb2YgdHlwZXMsCitmdW5jdGlvbnMgYW5kIGhlYWRlciBmaWxlcyBoYXMgYmVlbiBpbXByb3ZlZC4gVGhpcyBtZWFucyBjb2RlIHdyaXR0ZW4gdG8gdXNlCitjbGFzc2VzIGdlbmVyYXRlZCBieSBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZCB0bworcmVmbGVjdCB0aGUgcHJvcGVyIGNvbnZlbnRpb24gZm9yIGNsYXNzIG5hbWVzLCB3aGljaCBpcworCistIEEgbG93ZXJjYXNlLCBbc25ha2UtY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU25ha2VfY2FzZSkKKyAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzJyBuYW1lc3BhY2UsIGZvbGxvd2VkIGJ5CistIEFuIHVuZGVyc2NvcmUgYW5kCistIEEgbG93ZXJjYXNlLCBzbmFrZS1jYXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGFzcycgbmFtZS4KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9jX2dsaWIvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGIzYTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNSBAQAorIyMgQyBHbGliIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbR05PTUUgQyBDb2RpbmcgU3R5bGVdKGh0dHBzOi8vaGVscC5nbm9tZS5vcmcvdXNlcnMvcHJvZ3JhbW1pbmctZ3VpZGVsaW5lcy9zdGFibGUvYy1jb2Rpbmctc3R5bGUuaHRtbC5lbikKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Q2MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaD4KKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRSAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKQorCitnYm9vbGVhbgordGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2NoYXIgKmZuYW1lOworICBUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsKKyAgZ2ludDMyIHNlcWlkOworICBUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqZGlzcGF0Y2hfcHJvY2Vzc29yID0KKyAgICBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SIChwcm9jZXNzb3IpOworCisgIC8qIFJlYWQgdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlLCB3aGljaCB3ZSBleHBlY3QgdG8gYmUgYSBtZXRob2QgY2FsbCAqLworICBpZiAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgPCAwKSB7CisgICAgZ193YXJuaW5nICgiZXJyb3IgcmVhZGluZyBzdGFydCBvZiBtZXNzYWdlOiAlcyIsCisgICAgICAgICAgICAgICAoZXJyb3IgIT0gTlVMTCkgPyAoKmVycm9yKS0+bWVzc2FnZSA6ICIobnVsbCkiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZWxzZSBpZiAobXR5cGUgIT0gVF9DQUxMICYmIG10eXBlICE9IFRfT05FV0FZKSB7CisgICAgZ193YXJuaW5nICgicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogRGlzcGF0Y2ggdGhlIG1ldGhvZCBjYWxsICovCisgIHJldHVybiBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0dFVF9DTEFTUyAoZGlzcGF0Y2hfcHJvY2Vzc29yKQorICAgIC0+ZGlzcGF0Y2hfY2FsbCAoZGlzcGF0Y2hfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgaW4sCisgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfcmVhbF9kaXNwYXRjaF9jYWxsIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uOworICBnY2hhciAqbWVzc2FnZTsKKyAgZ2ludDMyIHJlc3VsdDsKKyAgZ2Jvb2xlYW4gZGlzcGF0Y2hfcmVzdWx0ID0gRkFMU0U7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworCisgIC8qIEJ5IGRlZmF1bHQsIHJldHVybiBhbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZQorICAgICBtZXRob2QgbmFtZSBpcyBub3QgcmVjb2duaXplZC4gKi8KKworICBpZiAoKHRocmlmdF9wcm90b2NvbF9za2lwIChpbiwgVF9TVFJVQ1QsIGVycm9yKSA8IDApIHx8CisgICAgICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGluLCBlcnJvcikgPCAwKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgZ19vYmplY3RfZ2V0IChpbiwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsIE5VTEwpOworICByZXN1bHQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisgIGlmIChyZXN1bHQgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0VYQ0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgbWVzc2FnZSA9IGdfc3RyY29uY2F0ICgiSW52YWxpZCBtZXRob2QgbmFtZTogJyIsIGZuYW1lLCAiJyIsIE5VTEwpOworICBnX2ZyZWUgKGZuYW1lKTsKKyAgeGNlcHRpb24gPQorICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLAorICAgICAgICAgICAgICAgICAgInR5cGUiLCAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9ELAorICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfZnJlZSAobWVzc2FnZSk7CisgIHJlc3VsdCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7CisgIGlmICgocmVzdWx0IDwgMCkgfHwKKyAgICAgICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKG91dCwgZXJyb3IpIDwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdfb2JqZWN0X2dldCAob3V0LCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgIGRpc3BhdGNoX3Jlc3VsdCA9CisgICAgKCh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgPj0gMCkgJiYKKyAgICAgKHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgZXJyb3IpID49IDApKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgcmV0dXJuIGRpc3BhdGNoX3Jlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfaW5pdCAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnNlbGYpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzICpwcm9jZXNzb3JfY2xhc3MgPQorICAgIFRIUklGVF9QUk9DRVNTT1JfQ0xBU1MgKGtsYXNzKTsKKworICAvKiBJbXBsZW1lbnQgVGhyaWZ0UHJvY2Vzc29yJ3MgcHJvY2VzcyBtZXRob2QgKi8KKyAgcHJvY2Vzc29yX2NsYXNzLT5wcm9jZXNzID0gdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9wcm9jZXNzOworCisgIC8qIFByb3ZpZGUgYSBkZWZhdWx0IGltcGxlbWVudCBmb3IgZGlzcGF0Y2hfY2FsbCwgd2hpY2ggcmV0dXJucyBhbiBleGNlcHRpb24KKyAgICAgdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZSBtZXRob2QgbmFtZSB3YXMgbm90IHJlY29nbml6ZWQgKi8KKyAga2xhc3MtPmRpc3BhdGNoX2NhbGwgPSB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX3JlYWxfZGlzcGF0Y2hfY2FsbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWZiODVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9ICisjZGVmaW5lIF9USFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaAorICogIFxicmllZiBQYXJzZXMgYSBtZXRob2QtY2FsbCBtZXNzYWdlIGhlYWRlciBhbmQgaW52b2tlcyBhIGZ1bmN0aW9uCisgKiAgICAgICAgIHRvIGRpc3BhdGNoIHRoZSBjYWxsIGJ5IGZ1bmN0aW9uIG5hbWUuCisgKgorICogVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgaXMgYW4gYWJzdHJhY3QgaGVscGVyIGNsYXNzIHRoYXQgcGFyc2VzIHRoZQorICogaGVhZGVyIG9mIGEgbWV0aG9kLWNhbGwgbWVzc2FnZSBhbmQgaW52b2tlcyBhIG1lbWJlciBmdW5jdGlvbiwKKyAqIGRpc3BhdGNoX2NhbGwsIHdpdGggdGhlIG1ldGhvZCdzIG5hbWUuCisgKgorICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBkaXNwYXRjaF9jYWxsIHRvIGRpc3BhdGNoIHRoZSBtZXRob2QgY2FsbAorICogdG8gdGhlIGltcGxlbWVudGluZyBmdW5jdGlvbi4KKyAqLworCisvKiBUeXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IgKHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IsIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0RJU1BBVENIX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUiwgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19ESVNQQVRDSF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0RJU1BBVENIX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IsIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MpKQorCisvKiEKKyAqIFRocmlmdCBEaXNwYXRjaCBQcm9jZXNzb3Igb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yIHBhcmVudDsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3I7CisKKy8qIQorICogVGhyaWZ0IERpc3BhdGNoIFByb2Nlc3NvciBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgcGFyZW50OworCisgIC8qIHB1YmxpYyAqLworICBnYm9vbGVhbiAoKnByb2Nlc3MpIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdib29sZWFuICgqZGlzcGF0Y2hfY2FsbCkgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICpmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzczsKKworLyogVXNlZCBieSBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IgKi8KK0dUeXBlIHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfZ2V0X3R5cGUgKHZvaWQpOworCisvKiEKKyAqIFByb2Nlc3NlcyBhIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTBmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciwgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3NvciwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKQorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORAorfTsKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORF0gPSB7IE5VTEwsIH07CisKKworc3RhdGljIGdib29sZWFuCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcl9pbXBsKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIGdfaGFzaF90YWJsZV9yZXBsYWNlKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLAorCQkgICAgICAgZ19zdHJkdXAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUpLAorCQkgICAgICAgZ19vYmplY3RfcmVmIChtdWx0aXBsZXhlZF9wcm9jZXNzb3IpKTsKKworICAvKiBNYWtlIGZpcnN0IHJlZ2lzdGVyZWQgYmVjb21lIGRlZmF1bHQgKi8KKyAgaWYoIXNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpeworICAgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfc3RyZHVwKG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2Vzc19pbXBsIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAorCQkJCQkgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIGdib29sZWFuIHRva2VuX2Vycm9yID0gRkFMU0U7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZTsKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIFRocmlmdFByb2Nlc3NvciAqbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIGNoYXIgKnRva2VuPU5VTEw7CisgIGludCB0b2tlbl9pbmRleD0wOworICBjaGFyICpzdGF0ZT1OVUxMOworICBnY2hhciAqZm5hbWU9TlVMTDsKKyAgZ2ludDMyIHNlcWlkLCByZXN1bHQ7CisKKyAgLyogRklYTUUgSXQgc2VlbXMgdGhhdCBwcmV2aW91cyBwcm9jZXNzb3IgaXMgbm90IG1hbmFnaW5nIGVycm9yIGNvcnJlY3RseSAqLworICBpZigqZXJyb3IhPU5VTEwpIHsKKyAgICAgIGdfZGVidWcgKCJ0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yOiBsYXN0IGVycm9yIG5vdCByZW1vdmVkOiAlcyIsCisgICAgICAJCSAgICplcnJvciAhPSBOVUxMID8gKCplcnJvciktPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIH0KKworCisgIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MoaW4pLT5yZWFkX21lc3NhZ2VfYmVnaW4oaW4sICZmbmFtZSwgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLCBlcnJvcik7CisKKyAgaWYoIShtZXNzYWdlX3R5cGUgPT0gVF9DQUxMIHx8IG1lc3NhZ2VfdHlwZSA9PSBUX09ORVdBWSkpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisJCSAgICJtZXNzYWdlIHR5cGUgaW52YWxpZCBmb3IgdGhpcyBwcm9jZXNzb3IiKTsKKyAgfWVsc2V7CisgICAgICAvKiBTcGxpdCBieSB0aGUgdG9rZW4gKi8KKyAgICAgIGZvciAodG9rZW4gPSBzdHJ0b2tfcihmbmFtZSwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCAmc3RhdGUpLAorCSAgdG9rZW5faW5kZXg9MDsKKwkgIHRva2VuICE9IE5VTEwgJiYgIXRva2VuX2Vycm9yOworCSAgdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsICZzdGF0ZSksCisJICAgICAgdG9rZW5faW5kZXgrKykKKwl7CisJICBzd2l0Y2godG9rZW5faW5kZXgpeworCSAgICBjYXNlIDA6CisJICAgICAgLyogSXQgc2hvdWxkIGJlIHRoZSBzZXJ2aWNlIG5hbWUgKi8KKwkgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCB0b2tlbik7CisJICAgICAgaWYobXVsdGlwbGV4ZWRfcHJvY2Vzc29yPT1OVUxMKXsKKwkJICB0b2tlbl9lcnJvcj1UUlVFOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIC8qIEl0IHNob3VsZCBiZSB0aGUgZnVuY3Rpb24gbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCB0b2tlbiwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1dST05HTFlfTVVMVElQTEVYRUQsCisJCQkgICAidGhlIG1lc3NhZ2UgaGFzIG1vcmUgdG9rZW5zIHRoYW4gZXhwZWN0ZWQhIik7CisJICAgICAgdG9rZW5fZXJyb3I9VFJVRTsKKwkgICAgICBicmVhazsKKwkgIH0KKwl9CisgICAgICAvKiBTZXQgZGVmYXVsdCAqLworICAgICAgaWYoIXN0b3JlZF9tZXNzYWdlX3Byb3RvY29sICYmCisJICAhbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICYmCisJICB0b2tlbl9pbmRleD09MSAmJiBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKwkgIC8qIEl0IHNob3VsZCBiZSB0aGUgc2VydmljZSBuYW1lICovCisJICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKwkgIGlmKG11bHRpcGxleGVkX3Byb2Nlc3Nvcj09TlVMTCl7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKwkJCSAgICJzZXJ2aWNlICVzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwcm9jZXNzb3IiLAorCQkJICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisJICB9ZWxzZXsKKwkgICAgICAvKiBTZXQgdGhlIG1lc3NhZ2UgbmFtZSB0byB0aGUgb3JpZ2luYWwgbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCBmbmFtZSwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgIH0KKworICAgICAgfQorCisgICAgICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCAmJiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IhPU5VTEwpeworCSAgcmV0dmFsID0gVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciktPnByb2Nlc3MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciwgKFRocmlmdFByb3RvY29sICopIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sLCBvdXQsIGVycm9yKSA7CisgICAgICB9ZWxzZXsKKwkgIGlmKCFlcnJvcikKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgICAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCSAgICAgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisJCSAgICAgICAic2VydmljZSAlcyBpcyBub3QgbXVsdGlwbGV4ZWQgaW4gdGhpcyBwcm9jZXNzb3IiLAorCQkgICAgICAgZm5hbWUpOworICAgICAgfQorCisKKyAgfQorCisgIGlmKCFyZXR2YWwpeworICAgICAgLyogQnkgZGVmYXVsdCwgcmV0dXJuIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlCisgICAgICAgICAgbWV0aG9kIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuICovCisgICAgICAvKiBDb3BpZWQgZnJvbSBkaXNwYWNoIHByb2Nlc3NvciAqLworCisgICAgICBpZiAoKHRocmlmdF9wcm90b2NvbF9za2lwIChpbiwgVF9TVFJVQ1QsIGVycm9yKSA8IDApIHx8CisJICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGluLCBlcnJvcikgPCAwKSkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgICBnX29iamVjdF9nZXQgKGluLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKwkgIC8qIFdlIG11c3QgZnJlZSBmbmFtZSAqLworCSAgZ19mcmVlKGZuYW1lKTsKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKyAgICAgIGlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0LAorCQkJCQkgICAgICAgZm5hbWUsCisJCQkJCSAgICAgICBUX0VYQ0VQVElPTiwKKwkJCQkJICAgICAgIHNlcWlkLAorCQkJCQkgICAgICAgZXJyb3IpIDwgMCl7CisJICAvKiBXZSBtdXN0IGZyZWUgZm5hbWUgKi8KKwkgIGdfZnJlZShmbmFtZSk7CisKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKworICAgICAgeGNlcHRpb24gPQorCSAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sCisJCQkidHlwZSIsICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCisJCQkibWVzc2FnZSIsICgqZXJyb3IpLT5tZXNzYWdlLAorCQkJTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksCisJCQkJICAgIG91dCwKKwkJCQkgICAgZXJyb3IpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgICAgIGlmICgocmVzdWx0IDwgMCkgfHwKKwkgICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKG91dCwgZXJyb3IpIDwgMCkpCisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZ19vYmplY3RfZ2V0IChvdXQsICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJldHZhbCA9CisJICAoKHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSAmJgorCSAgICAgICh0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSk7CisgICAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgfWVsc2V7CisgICAgICAvKiBUaGUgcHJvdG9jb2wgbm93IGhhcyBhIGNvcHkgd2UgY2FuIGZyZWUgaXQgKi8KKyAgICAgIGdfZnJlZShmbmFtZSk7CisKKyAgfQorCisgIC8qCisgIEZJWE1FIFRoaXMgbWFrZXMgZXZlcnl0aGluZyBmYWlsLCBJIGRvbid0IGtub3cgd2h5LgorICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCl7CisJICAvLyBBZnRlciBpdHMgdXNlIHdlIG11c3QgZnJlZSBpdAorCSAgZ19vYmplY3RfdW5yZWYoc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wpOworICB9CisgICovCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMgKi8KK0dRdWFyawordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX0RPTUFJTik7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmplY3QpOworCisgIC8qIEZyZWUgb3VyIG11bHRpcGxleGVkIGhhc2ggdGFibGUgKi8KKyAgZ19oYXNoX3RhYmxlX3VucmVmIChzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcyk7CisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gTlVMTDsKKworICBpZihzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKyAgICAgIGdfZnJlZShzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKyAgICAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWU9TlVMTDsKKyAgfQorCisgIC8qIENoYWluIHVwIHRvIHBhcmVudCAqLworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpCisgICAgKCpHX09CSkVDVF9DTEFTUyAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkgKG9iamVjdCk7Cit9CisKKy8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcyAqY2xzKQoreworICAvKiBPdmVycmlkZSAqLworICBUSFJJRlRfUFJPQ0VTU09SX0NMQVNTKGNscyktPnByb2Nlc3MgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3Byb2Nlc3NfaW1wbDsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisKKyAgLyogT2JqZWN0IG1ldGhvZHMgKi8KKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZmluYWxpemU7CisKKyAgLyogQ2xhc3MgbWV0aG9kcyAqLworICBjbHMtPnJlZ2lzdGVyX3Byb2Nlc3NvciA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yX2ltcGw7CisKKworICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRlZmF1bHQiLAorICAgICAgICAgICJEZWZhdWx0IHNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIHdoZXJlIG5vIG11bHRpcGxleGVkIGNsaWVudCB1c2VkIiwKKyAgICAgICAgICAiU2V0IHRoZSBkZWZhdWx0IHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAoR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKGdvYmplY3RfY2xhc3MsCisJCQkJICAgICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRU5ELAorICAgICAgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9vYmpfcHJvcGVydGllcyk7CisKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYpCit7CisKKyAgLyogQ3JlYXRlIG91ciBtdWx0aXBsZXhlZCBzZXJ2aWNlcyBoYXNoIHRhYmxlICovCisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gZ19oYXNoX3RhYmxlX25ld19mdWxsICgKKyAgICAgIGdfc3RyX2hhc2gsCisgICAgICBnX3N0cl9lcXVhbCwKKyAgICAgIGdfZnJlZSwKKyAgICAgIGdfb2JqZWN0X3VucmVmKTsKKyAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IE5VTEw7Cit9CisKKworZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKHByb2Nlc3NvciktPnJlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBtdWx0aXBsZXhlZF9wcm9jZXNzb3IsIGVycm9yKTsKK30KKworCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNjYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAorICoKKyAqICBDcmVhdGVkIG9uOiAxNCBzZXB0LiAyMDE3CisgKiAgICAgIEF1dGhvcjogZ2FndWlsYXIKKyAqLworCisjaWZuZGVmIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCisgKiAgXGJyaWVmIFRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgZm9yIGNfZ2xpYi4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MpKQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfRE9NQUlOICJ0aHJpZnQtbXVsdGlwbGV4ZWQtcHJvY2Vzc29yLWVycm9yLXF1YXJrIgorCisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkUHJvY2Vzc29yIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yCit7CisgIFRocmlmdFByb2Nlc3NvciBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBnY2hhciAqIGRlZmF1bHRfcHJvY2Vzc29yX25hbWU7CisgIEdIYXNoVGFibGUgKm11bHRpcGxleGVkX3NlcnZpY2VzOworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWRQcm9jZXNzb3IgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzIHBhcmVudDsKKworICBnYm9vbGVhbiAoKiByZWdpc3Rlcl9wcm9jZXNzb3IpIChUaHJpZnRQcm9jZXNzb3IgKnNlbGYsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKTsKKworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3M7CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SICovCitHVHlwZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLCBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKworLyogUHVibGljIEFQSSAqLworCisvKioKKyAqIEBicmllZiBSZWdpc3RlcnMgYSBwcm9jZXNzb3IgaW4gdGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciB1bmRlciBpdHMgbmFtZS4gSXQKKyAqIHdpbGwgdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2Vzc29yIHNvIHJlZmNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQuCisgKiBJdCB3aWxsIGFsc28gYmUgZGVjcmVtZW50ZWQgb24gb2JqZWN0IGRlc3RydWN0aW9uLgorICoKKyAqIFRoZSBmaXJzdCByZWdpc3RlcmVkIHByb2Nlc3NvciBiZWNvbWVzIGRlZmF1bHQuIEJ1dCB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGgKKyAqICJkZWZhdWx0IiBwcm9wZXJ0eS4KKyAqCisgKiBJdCByZXR1cm5zIGEgY29tcGxpYW50IGVycm9yIGlmIGl0IGNhbm5vdCBiZSByZWdpc3RlcmVkLgorICoKKyAqIEBwYXJhbSBwcm9jZXNzb3IgUG9pbnRlciB0byB0aGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yLgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lIE5hbWUgb2YgdGhlIHByb2Nlc3NvciB5b3Ugd2FudCB0byByZWdpc3RlcgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3NvciBQb2ludGVyIHRvIGltcGxlbWVudGVkIHByb2Nlc3NvciB5b3Ugd2FudCBtdWx0aXBsZXguCisgKiBAcGFyYW0gZXJyb3IgRXJyb3Igb2JqZWN0IHdoZXJlIHdlIHNob3VsZCBzdG9yZSBlcnJvcnMuCisgKgorICogQHNlZSBodHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ2xpYi9zdGFibGUvZ2xpYi1FcnJvci1SZXBvcnRpbmcuaHRtbCNnLXNldC1lcnJvcgorICovCitnYm9vbGVhbiB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3NvcihUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9XUk9OR0xZX01VTFRJUExFWEVELAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFTkQsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfUkVDRUlWRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9DTE9TRQorfSBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckVycm9yOworCisKK0dRdWFyayB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAoKSkKKworCitHX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBfVEhSSUZUX01VTFRJUExFWEVEX01VTFRJUExFWEVEX1BST0NFU1NPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDJjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvY2Vzc29yLCB0aHJpZnRfcHJvY2Vzc29yLCBHX1RZUEVfT0JKRUNUKQorCitnYm9vbGVhbgordGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuCisgICAgVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKHByb2Nlc3NvciktPnByb2Nlc3MgKHByb2Nlc3NvciwgaW4sIG91dCwgZXJyb3IpOworfQorCisvKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0UHJvY2Vzc29yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb2Nlc3Nvcl9jbGFzc19pbml0IChUaHJpZnRQcm9jZXNzb3JDbGFzcyAqY2xzKQoreworICAvKiBzZXQgdGhlc2UgYXMgdmlydHVhbCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MgKi8KKyAgY2xzLT5wcm9jZXNzID0gdGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb2Nlc3Nvcl9pbml0IChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb2Nlc3Nvcik7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyZDJkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9DRVNTT1JfSAorI2RlZmluZSBfVEhSSUZUX1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3Byb2Nlc3Nvci5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgcHJvY2Vzc29ycy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9DRVNTT1IgKHRocmlmdF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsIFRocmlmdFByb2Nlc3NvcikpCisjZGVmaW5lIFRIUklGVF9JU19QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsIFRocmlmdFByb2Nlc3NvckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST0NFU1NPUiwgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MpKQorCisvKiEKKyAqIFRocmlmdCBQcm9jZXNzb3JvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnRQcm9jZXNzb3IKK3sKKyAgR09iamVjdCBwYXJlbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb2Nlc3NvciBUaHJpZnRQcm9jZXNzb3I7CisKKy8qIQorICogVGhyaWZ0IFByb2Nlc3NvciBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFByb2Nlc3NvckNsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIGdib29sZWFuICgqcHJvY2VzcykgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsIEdFcnJvciAqKmVycm9yKTsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgVGhyaWZ0UHJvY2Vzc29yQ2xhc3M7CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfUFJPQ0VTU09SICovCitHVHlwZSB0aHJpZnRfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRQcm9jZXNzb3JDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyZDAxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCkBAIC0wLDAgKzEsOTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdEJpbmFyeVByb3RvY29sLCB0aHJpZnRfYmluYXJ5X3Byb3RvY29sLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkKKworc3RhdGljIGd1aW50NjQKK3RocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAoZ2RvdWJsZSB2KQoreworICB1bmlvbiB7CisgICAgZ2RvdWJsZSBmcm9tOworICAgIGd1aW50NjQgdG87CisgIH0gdTsKKyAgdS5mcm9tID0gdjsKKyAgcmV0dXJuIHUudG87Cit9CisKK3N0YXRpYyBnZG91YmxlCit0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGd1aW50NjQgdikKK3sKKyAgdW5pb24geworICAgIGd1aW50NjQgZnJvbTsKKyAgICBnZG91YmxlIHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHZlcnNpb24gPSAoVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEpCisgICAgICAgICAgICAgICAgICAgfCAoKGdpbnQzMikgbWVzc2FnZV90eXBlKTsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCB2ZXJzaW9uLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgbmFtZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIHNlcWlkLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgZmllbGRfaWQsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIFRfU1RPUCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIChnaW50MzIpIHNpemUsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAoZ2ludDMyKSBzaXplLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50OCB0bXA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIHRtcCA9IHZhbHVlID8gMSA6IDA7CisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIHRtcCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKyAgIAorICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJnZhbHVlLCAxLCBlcnJvcikpCisgIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQxNiBuZXQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIG5ldCA9IGdfaHRvbnMgKHZhbHVlKTsKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZuZXQsIDIsIGVycm9yKSkKKyAgeworICAgIHJldHVybiAyOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIG5ldDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbmV0ID0gZ19odG9ubCAodmFsdWUpOworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJm5ldCwgNCwgZXJyb3IpKQorICB7CisgICAgcmV0dXJuIDQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50NjQgbmV0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBuZXQgPSBHVUlOVDY0X1RPX0JFICh2YWx1ZSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmbmV0LCA4LCBlcnJvcikpCisgIHsKKyAgICByZXR1cm4gODsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDY0IGJpdHM7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGJpdHMgPSBHVUlOVDY0X0ZST01fQkUgKHRocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAodmFsdWUpKTsKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZiaXRzLCA4LCBlcnJvcikpCisgIHsKKyAgICByZXR1cm4gODsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDMyIGxlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbGVuID0gc3RyICE9IE5VTEwgPyBzdHJsZW4gKHN0cikgOiAwOworICAvKiB3cml0ZSB0aGUgc3RyaW5nIGxlbmd0aCArIDEgd2hpY2ggaW5jbHVkZXMgdGhlIG51bGwgdGVybWluYXRvciAqLworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIChjb25zdCBncG9pbnRlcikgc3RyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBsZW4sIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChsZW4gPiAwKQorICB7CisgICAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgYnVmLCBsZW4sIGVycm9yKSA9PSBGQUxTRSkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gbGVuOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50MzIgc3o7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnN6LCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoc3ogPCAwKQorICB7CisgICAgLyogY2hlY2sgZm9yIHZlcnNpb24gKi8KKyAgICBndWludDMyIHZlcnNpb24gPSBzeiAmIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl9NQVNLOworICAgIGlmICh2ZXJzaW9uICE9IFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xKQorICAgIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdmVyc2lvbiAlZCwgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSwgdmVyc2lvbik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgKm1lc3NhZ2VfdHlwZSA9IChUaHJpZnRNZXNzYWdlVHlwZSkgKHN6ICYgMHgwMDAwMDBmZik7CisKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsIHNlcWlkLCBlcnJvcikpIDwgMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgICpuYW1lID0gTlVMTDsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDggdHlwZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ0eXBlLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgKmZpZWxkX3R5cGUgPSAoVGhyaWZ0VHlwZSkgdHlwZTsKKyAgaWYgKCpmaWVsZF90eXBlID09IFRfU1RPUCkKKyAgeworICAgICpmaWVsZF9pZCA9IDA7CisgICAgcmV0dXJuIHhmZXI7CisgIH0KKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCBmaWVsZF9pZCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDggaywgdjsKKyAgZ2ludDMyIHNpemVpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmaywgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgICprZXlfdHlwZSA9IChUaHJpZnRUeXBlKSBrOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2LCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgKnZhbHVlX3R5cGUgPSAoVGhyaWZ0VHlwZSkgdjsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZzaXplaSwgZXJyb3IpKSA8MCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoc2l6ZWkgPCAwKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBzaXplaSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgKnNpemUgPSAoZ3VpbnQzMikgc2l6ZWk7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdpbnQ4IGU7CisgIGdpbnQzMiBzaXplaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmUsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICAqZWxlbWVudF90eXBlID0gKFRocmlmdFR5cGUpIGU7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmc2l6ZWksIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChzaXplaSA8IDApCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHNpemVpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAqc2l6ZSA9IChndWludDMyKSBzaXplaTsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgZWxlbWVudF90eXBlLCBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBncG9pbnRlciBiWzFdOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IAorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gKihnaW50OCAqKSBiICE9IDA7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBncG9pbnRlciBiWzFdOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAxLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSAqKGdpbnQ4ICopIGI7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIHVuaW9uCisgIHsKKyAgICBnaW50OCBieXRlX2FycmF5WzJdOworICAgIGdpbnQxNiBpbnQxNjsKKyAgfSBiOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDIsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9IGdfbnRvaHMgKGIuaW50MTYpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbgorICB7CisgICAgZ2ludDggYnl0ZV9hcnJheVs0XTsKKyAgICBnaW50MzIgaW50MzI7CisgIH0gYjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCA0LCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSBnX250b2hsIChiLmludDMyKTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgdW5pb24KKyAgeworICAgIGdpbnQ4IGJ5dGVfYXJyYXlbOF07CisgICAgZ2ludDY0IGludDY0OworICB9IGI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgOCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gR1VJTlQ2NF9GUk9NX0JFIChiLmludDY0KTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIHVuaW9uCisgIHsKKyAgICBnaW50OCBieXRlX2FycmF5WzhdOworICAgIGd1aW50NjQgdWludDY0OworICB9IGI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgOCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gdGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlIChHVUlOVDY0X0ZST01fQkUgKGIudWludDY0KSk7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDMyIGxlbjsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50MzIgcmVhZF9sZW4gPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAocmVhZF9sZW4gPCAwKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCByZWFkX2xlbik7CisgICAgKnN0ciA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIHN0cmluZyAqLworICBsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW4gKyAxOyAvKiBzcGFjZSBmb3IgbnVsbCB0ZXJtaW5hdG9yICovCisgICpzdHIgPSBnX25ldzAgKGdjaGFyLCBsZW4pOworICBpZiAocmVhZF9sZW4gPiAwKSB7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHIsIHJlYWRfbGVuLCBlcnJvcikpIDwgMCkKKyAgICB7CisgICAgICBnX2ZyZWUgKCpzdHIpOworICAgICAgKnN0ciA9IE5VTEw7CisgICAgICBsZW4gPSAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqKnN0ciA9IDA7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciAqYnVmLCBndWludDMyICpsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50MzIgcmVhZF9sZW4gPSAwOworIAorICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgLyogcmVhZCB0aGUgbGVuZ3RoIGludG8gcmVhZF9sZW4gKi8KKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHJlYWRfbGVuID4gMCkKKyAgeworICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBnX25ldyAoZ3VjaGFyLCAqbGVuKTsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApCisgICAgeworICAgICAgZ19mcmVlICgqYnVmKTsKKyAgICAgICpidWYgPSBOVUxMOworICAgICAgKmxlbiA9IDA7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICpsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW47CisgICAgKmJ1ZiA9IE5VTEw7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnByb3RvY29sKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworfQorCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQ7CisgIGNscy0+d3JpdGVfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW47CisgIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW47CisgIGNscy0+d3JpdGVfZmllbGRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbjsKKyAgY2xzLT53cml0ZV9tYXBfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kOworICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kOworICBjbHMtPndyaXRlX3NldF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luOworICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbDsKKyAgY2xzLT53cml0ZV9ieXRlID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlOworICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyOworICBjbHMtPndyaXRlX2k2NCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0OworICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nOworICBjbHMtPndyaXRlX2JpbmFyeSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5OworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQ7CisgIGNscy0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luOworICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW47CisgIGNscy0+cmVhZF9maWVsZF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kOworICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2VuZDsKKyAgY2xzLT5yZWFkX2xpc3RfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbjsKKyAgY2xzLT5yZWFkX2xpc3RfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfZW5kOworICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9iZWdpbjsKKyAgY2xzLT5yZWFkX3NldF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2VuZDsKKyAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbDsKKyAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZTsKKyAgY2xzLT5yZWFkX2kxNiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTY7CisgIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyOworICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NDsKKyAgY2xzLT5yZWFkX2RvdWJsZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGU7CisgIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nOworICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzMGJjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCisgKiAgXGJyaWVmIEJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MpKQorCisvKiB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEgMHg4MDAxMDAwMAorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fTUFTSyAweGZmZmYwMDAwCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbCBUaHJpZnRCaW5hcnlQcm90b2NvbDsKKworLyohCisgKiBUaHJpZnQgQmluYXJ5IFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sIHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzIFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IEJpbmFyeSBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0ZTlhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKQorCitUaHJpZnRQcm90b2NvbCAqCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcyAqY2xzKQoreworICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyAqcHJvdG9jb2xfZmFjdG9yeV9jbGFzcyA9IFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTIChjbHMpOworCisgIHByb3RvY29sX2ZhY3RvcnlfY2xhc3MtPmdldF9wcm90b2NvbCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2w7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGRjMDczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9ICisjZGVmaW5lIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5IFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeTsKKworc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnkKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcyBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzczsKKworc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcworeworICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZICovCitHVHlwZSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlNDc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE2MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorCisvKgorICogKl90b196aWd6YWcgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHJpZ2h0IHNoaWZ0CisgKiBvcGVyYXRvciBvbiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIGFyaXRobWV0aWMgKHNpZ24tZXh0ZW5kaW5nKSBzaGlmdC4KKyAqIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCB3b3JrLgorICovCisjaWYgIWRlZmluZWQoU0lHTkVEX1JJR0hUX1NISUZUX0lTKSB8fCAhZGVmaW5lZChBUklUSE1FVElDX1JJR0hUX1NISUZUKQorIyBlcnJvciAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCisjZW5kaWYKKyNpZiBTSUdORURfUklHSFRfU0hJRlRfSVMgIT0gQVJJVEhNRVRJQ19SSUdIVF9TSElGVAorIyBlcnJvciAidGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wgb25seSB3b3JrcyBpZiBzaWduZWQgcmlnaHQgc2hpZnQgaXMgYXJpdGhtZXRpYyIKKyNlbmRpZgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0Q29tcGFjdFByb3RvY29sUHJvcGVydGllcworeworICAgIFBST1BfMCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sLCB0aHJpZnRfY29tcGFjdF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MKQorCitzdGF0aWMgY29uc3QgZ2ludDggUFJPVE9DT0xfSUQgPSAoZ2ludDgpMHg4MnU7CitzdGF0aWMgY29uc3QgZ2ludDggVkVSU0lPTl9OID0gMTsKK3N0YXRpYyBjb25zdCBnaW50OCBWRVJTSU9OX01BU0sgPSAweDFmOyAgICAgICAvKiAwMDAxIDExMTEgKi8KK3N0YXRpYyBjb25zdCBnaW50OCBUWVBFX01BU0sgPSAoZ2ludDgpMHhlMHU7ICAvKiAxMTEwIDAwMDAgKi8KK3N0YXRpYyBjb25zdCBnaW50OCBUWVBFX0JJVFMgPSAweDA3OyAgICAgICAgICAvKiAwMDAwIDAxMTEgKi8KK3N0YXRpYyBjb25zdCBnaW50MzIgVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCitlbnVtIFR5cGVzIHsKKyAgQ1RfU1RPUCAgICAgICAgICAgPSAweDAwLAorICBDVF9CT09MRUFOX1RSVUUgICA9IDB4MDEsCisgIENUX0JPT0xFQU5fRkFMU0UgID0gMHgwMiwKKyAgQ1RfQllURSAgICAgICAgICAgPSAweDAzLAorICBDVF9JMTYgICAgICAgICAgICA9IDB4MDQsCisgIENUX0kzMiAgICAgICAgICAgID0gMHgwNSwKKyAgQ1RfSTY0ICAgICAgICAgICAgPSAweDA2LAorICBDVF9ET1VCTEUgICAgICAgICA9IDB4MDcsCisgIENUX0JJTkFSWSAgICAgICAgID0gMHgwOCwKKyAgQ1RfTElTVCAgICAgICAgICAgPSAweDA5LAorICBDVF9TRVQgICAgICAgICAgICA9IDB4MEEsCisgIENUX01BUCAgICAgICAgICAgID0gMHgwQiwKKyAgQ1RfU1RSVUNUICAgICAgICAgPSAweDBDCit9OworCitzdGF0aWMgY29uc3QgZ2ludDggVFR5cGVUb0NUeXBlWzE2XSA9IHsKKyAgQ1RfU1RPUCwgLyogVF9TVE9QICovCisgIDAsIC8qIHVudXNlZCAqLworICBDVF9CT09MRUFOX1RSVUUsIC8qIFRfQk9PTCAqLworICBDVF9CWVRFLCAvKiBUX0JZVEUgKi8KKyAgQ1RfRE9VQkxFLCAvKiBUX0RPVUJMRSAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTE2LCAvKiBUX0kxNiAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTMyLCAvKiBUX0kzMiAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfSTY0LCAvKiBUX0k2NCAqLworICBDVF9CSU5BUlksIC8qIFRfU1RSSU5HICovCisgIENUX1NUUlVDVCwgLyogVF9TVFJVQ1QgKi8KKyAgQ1RfTUFQLCAvKiBUX01BUCAqLworICBDVF9TRVQsIC8qIFRfU0VUICovCisgIENUX0xJU1QsIC8qIFRfTElTVCAqLworfTsKKworc3RhdGljIGd1aW50NjQKK3RocmlmdF9iaXR3aXNlX2Nhc3RfZ3VpbnQ2NCAoY29uc3QgZ2RvdWJsZSB2KQoreworICB1bmlvbiB7CisgICAgZ2RvdWJsZSBmcm9tOworICAgIGd1aW50NjQgdG87CisgIH0gdTsKKyAgdS5mcm9tID0gdjsKKyAgcmV0dXJuIHUudG87Cit9CisKK3N0YXRpYyBnZG91YmxlCit0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGNvbnN0IGd1aW50NjQgdikKK3sKKyAgdW5pb24geworICAgIGd1aW50NjQgZnJvbTsKKyAgICBnZG91YmxlIHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCisvKioKKyAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGd1aW50NjQKK2k2NF90b196aWd6YWcgKGNvbnN0IGdpbnQ2NCBsKQoreworICByZXR1cm4gKCgoZ3VpbnQ2NClsKSA8PCAxKSBeIChsID4+IDYzKTsKK30KKworLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGd1aW50MzIKK2kzMl90b196aWd6YWcgKGNvbnN0IGdpbnQzMiBuKQoreworICByZXR1cm4gKCgoZ3VpbnQzMiluKSA8PCAxKSBeIChuID4+IDMxKTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK3N0YXRpYyBnaW50MzIKK3ppZ3phZ190b19pMzIgKGd1aW50MzIgbikKK3sKKyAgcmV0dXJuIChuID4+IDEpIF4gKGd1aW50MzIpICgtKGdpbnQzMikgKG4gJiAxKSk7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK3N0YXRpYyBnaW50NjQKK3ppZ3phZ190b19pNjQgKGd1aW50NjQgbikKK3sKKyAgcmV0dXJuIChuID4+IDEpIF4gKGd1aW50NjQpICgtKGdpbnQ2NCkgKG4gJiAxKSk7Cit9CisKK1RocmlmdFR5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4IHR5cGUsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVF9TVE9QOgorICAgICAgcmV0dXJuIFRfU1RPUDsKKyAgICBjYXNlIENUX0JPT0xFQU5fRkFMU0U6CisgICAgY2FzZSBDVF9CT09MRUFOX1RSVUU6CisgICAgICByZXR1cm4gVF9CT09MOworICAgIGNhc2UgQ1RfQllURToKKyAgICAgIHJldHVybiBUX0JZVEU7CisgICAgY2FzZSBDVF9JMTY6CisgICAgICByZXR1cm4gVF9JMTY7CisgICAgY2FzZSBDVF9JMzI6CisgICAgICByZXR1cm4gVF9JMzI7CisgICAgY2FzZSBDVF9JNjQ6CisgICAgICByZXR1cm4gVF9JNjQ7CisgICAgY2FzZSBDVF9ET1VCTEU6CisgICAgICByZXR1cm4gVF9ET1VCTEU7CisgICAgY2FzZSBDVF9CSU5BUlk6CisgICAgICByZXR1cm4gVF9TVFJJTkc7CisgICAgY2FzZSBDVF9MSVNUOgorICAgICAgcmV0dXJuIFRfTElTVDsKKyAgICBjYXNlIENUX1NFVDoKKyAgICAgIHJldHVybiBUX1NFVDsKKyAgICBjYXNlIENUX01BUDoKKyAgICAgIHJldHVybiBUX01BUDsKKyAgICBjYXNlIENUX1NUUlVDVDoKKyAgICAgIHJldHVybiBUX1NUUlVDVDsKKyAgICBkZWZhdWx0OgorICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggYnVmWzVdOworICBnaW50MzIgeGZlcjsKKyAgZ3VpbnQzMiBtOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgeGZlciA9IDA7CisgIG0gPSBuOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKChtICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KW07CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpKChtICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG0gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgeGZlciwgZXJyb3IpKSB7CisgICAgcmV0dXJuIHhmZXI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qKgorICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50NjQgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQ2NCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggYnVmWzEwXTsKKyAgZ2ludDMyIHhmZXI7CisgIGd1aW50NjQgbTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHhmZXIgPSAwOworICBtID0gbjsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGlmICgobSAmIH4weDdGTCkgPT0gMCkgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpbTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbeGZlcisrXSA9IChnaW50OCkoKG0gJiAweDdGKSB8IDB4ODApOworICAgICAgbSA+Pj0gNzsKKyAgICB9CisgIH0KKworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCktPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgYnVmLCB4ZmVyLCBlcnJvcikpIHsKKyAgICByZXR1cm4geGZlcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyoqCisgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgKmk2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbCAqdHA7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworICBndWludDY0IHZhbDsKKyAgZ2ludCBzaGlmdDsKKyAgZ3VpbnQ4IGJ5dGU7CisKKyAgdHAgPSBUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgeGZlciA9IDA7CisgIHZhbCA9IDA7CisgIHNoaWZ0ID0gMDsKKyAgYnl0ZSA9IDA7CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHRwLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpICZieXRlLCAxLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICArK3hmZXI7CisgICAgdmFsIHw9IChndWludDY0KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgc2hpZnQgKz0gNzsKKyAgICBpZiAoIShieXRlICYgMHg4MCkpIHsKKyAgICAgICppNjQgPSAoZ2ludDY0KSB2YWw7CisgICAgICByZXR1cm4geGZlcjsKKyAgICB9CisgICAgaWYgKEdfVU5MSUtFTFkgKHhmZXIgPT0gMTApKSB7IC8qIDcgKiA5IDwgNjQgPCA3ICogMTAgKi8KKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcyIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKmkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50NjQgdmFsOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKHByb3RvY29sLCAmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICppMzIgPSAoZ2ludDMyKXZhbDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCB0eXBlX292ZXJyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKyAgZ2ludDggdHlwZV90b193cml0ZTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgeGZlciA9IDA7CisKKyAgLyogaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LiAqLworICB0eXBlX3RvX3dyaXRlCisgICAgPSAodHlwZV9vdmVycmlkZSA9PSAtMSA/IFRUeXBlVG9DVHlwZVtmaWVsZF90eXBlXSA6IHR5cGVfb3ZlcnJpZGUpOworCisgIC8qIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZCAqLworICBpZiAoZmllbGRfaWQgPiBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQKKyAgICAgICYmIGZpZWxkX2lkIC0gcHJvdG9jb2wtPl9sYXN0X2ZpZWxkX2lkIDw9IDE1KSB7CisgICAgLyogd3JpdGUgdGhlbSB0b2dldGhlciAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKChmaWVsZF9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0IHwgdHlwZV90b193cml0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgLyogd3JpdGUgdGhlbSBzZXBhcmF0ZSAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fd3JpdGUsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCA9IGZpZWxkX2lkOworICByZXR1cm4geGZlcjsKK30KKworLyoqCisgKiBNZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgKi8KK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpIChzaXplIDw8IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUeXBlVG9DVHlwZVtlbGVtX3R5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICgweGYwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVHlwZVRvQ1R5cGVbZWxlbV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpbnQzMikgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCisvKgorICogcHVibGljIG1ldGhvZHMKKyAqLworCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDggdmVyc2lvbjsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB2ZXJzaW9uID0gKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykKKyAgICAgICAgICAgIHwgKCgoZ2ludDMyKSBtZXNzYWdlX3R5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKTsKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFBST1RPQ09MX0lELCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgdmVyc2lvbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWludDMyKSBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgbmFtZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworICBHUXVldWUgKnE7CisKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgZ19xdWV1ZV9wdXNoX3RhaWwgKHEsIEdJTlRfVE9fUE9JTlRFUiAoKGdpbnQpIGNwLT5fbGFzdF9maWVsZF9pZCkpOworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAwOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAoZ2ludDE2KSBHUE9JTlRFUl9UT19JTlQgKGdfcXVldWVfcG9wX3RhaWwgKHEpKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIGlmIChmaWVsZF90eXBlID09IFRfQk9PTCkgeworICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lID0gbmFtZTsKKyAgICBjcC0+X2Jvb2xfZmllbGRfdHlwZSA9IGZpZWxkX3R5cGU7CisgICAgY3AtPl9ib29sX2ZpZWxkX2lkID0gZmllbGRfaWQ7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luX2ludGVybmFsIChjcCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgVF9TVE9QLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwgKGd1aW50MzIpIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChzaXplID4gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKFRUeXBlVG9DVHlwZVtrZXlfdHlwZV0gPDwgNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFR5cGVUb0NUeXBlW3ZhbHVlX3R5cGVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9jb2xsZWN0aW9uX2JlZ2luIChjcCwgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoY3AsIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKGNwLT5fYm9vbF9maWVsZF9uYW1lICE9IE5VTEwpIHsKKyAgICAvKiB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luX2ludGVybmFsIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPl9ib29sX2ZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+X2Jvb2xfZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICh2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgY3AtPl9ib29sX2ZpZWxkX25hbWUgPSBOVUxMOworICB9IGVsc2UgeworICAgIC8qIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAodmFsdWUgPyBDVF9CT09MRUFOX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENUX0JPT0xFQU5fRkFMU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJnZhbHVlLCAxLCBlcnJvcikpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90b196aWd6YWcgKChnaW50MzIpIHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdG9femlnemFnICh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQ2NCAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RvX3ppZ3phZyAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50NjQgYml0czsKKworICBnX2Fzc2VydCAoc2l6ZW9mIChnZG91YmxlKSA9PSBzaXplb2YgKGd1aW50NjQpKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGJpdHMgPSBHVUlOVDY0X1RPX0xFICh0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKHZhbHVlKSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmYml0cywgOCwgZXJyb3IpKSB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBzaXplX3QgbGVuOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbGVuID0gc3RyICE9IE5VTEwgPyBzdHJsZW4gKHN0cikgOiAwOworICBpZiAobGVuID4gR19NQVhJTlQzMikgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgInN0cmluZyBzaXplIChndWVzczogJWx1KSBpcyB0b28gbGFyZ2UiLCAodW5zaWduZWQgbG9uZykgbGVuKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiB3cml0ZSB0aGUgc3RyaW5nIGxlbmd0aCArIDEgd2hpY2ggaW5jbHVkZXMgdGhlIG51bGwgdGVybWluYXRvciAqLworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIChjb25zdCBncG9pbnRlcikgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGd1aW50MzIpIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwgbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAobGVuID4gMCkgeworICAgIC8qIGNoZWNraW5nIGxlbiArIHhmZXIgPiB1aW50X21heCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gb3ZlcmZsb3cgd2hpbGUKKyAgICAgKiBjaGVja2luZyBmb3Igb3ZlcmZsb3dzLiB0cmFuc2Zvcm1pbmcgdG8gbGVuID4gdWludF9tYXggLSB4ZmVyLgorICAgICAqLworICAgIGlmIChsZW4gPiAoZ3VpbnQzMikgKEdfTUFYSU5UMzIgLSB4ZmVyKSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICAgInNpemUgJWQgKyAlZCBpcyB0b28gbGFyZ2UiLCBsZW4sIHhmZXIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgbGVuLCBlcnJvcikgPT0gRkFMU0UpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSBsZW47CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBwcm90b2NvbF9pZCwgdmVyc2lvbl9hbmRfdHlwZSwgdmVyc2lvbjsKKworICB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChwcm90b2NvbF9pZCAhPSBQUk9UT0NPTF9JRCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICJiYWQgcHJvdG9jb2wgaWQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmVyc2lvbl9hbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICB2ZXJzaW9uID0gKGdpbnQ4KSh2ZXJzaW9uX2FuZF90eXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl9OKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgImJhZCB2ZXJzaW9uIGFuZC9vciB0eXBlIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgKm1lc3NhZ2VfdHlwZQorICAgID0gKFRocmlmdE1lc3NhZ2VUeXBlKSgodmVyc2lvbl9hbmRfdHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsIHNlcWlkLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHEgPSAmKGNwLT5fbGFzdF9maWVsZCk7CisKKyAgKm5hbWUgPSBOVUxMOworCisgIGdfcXVldWVfcHVzaF90YWlsIChxLCBHSU5UX1RPX1BPSU5URVIgKChnaW50KSBjcC0+X2xhc3RfZmllbGRfaWQpKTsKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gMDsKKworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGNwLT5fbGFzdF9maWVsZF9pZCA9IChnaW50MTYpIEdQT0lOVEVSX1RPX0lOVCAoZ19xdWV1ZV9wb3BfdGFpbCAocSkpOworCisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDE2IG1vZGlmaWVyOworICBnaW50OCBieXRlOworICBnaW50OCB0eXBlOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmYnl0ZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgdHlwZSA9IChieXRlICYgMHgwZik7CisKKyAgLyogaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLiAqLworICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICAqZmllbGRfdHlwZSA9IFRfU1RPUDsKKyAgICAqZmllbGRfaWQgPSAwOworICAgIHJldHVybiB4ZmVyOworICB9CisKKyAgLyogbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4KKyAgICogaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICAgKi8KKyAgbW9kaWZpZXIgPSAoZ2ludDE2KSgoKGd1aW50OClieXRlICYgMHhmMCkgPj4gNCk7CisgIGlmIChtb2RpZmllciA9PSAwKSB7CisgICAgLyogbm90IGEgZGVsdGEsIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLiAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgZmllbGRfaWQsIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICpmaWVsZF9pZCA9IChnaW50MTYpKGNwLT5fbGFzdF9maWVsZF9pZCArIG1vZGlmaWVyKTsKKyAgfQorICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoY3AsIHR5cGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgICpmaWVsZF90eXBlID0gcmV0OworCisgIC8qIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlICovCisgIGlmICh0eXBlID09IENUX0JPT0xFQU5fVFJVRSB8fCB0eXBlID09IENUX0JPT0xFQU5fRkFMU0UpIHsKKyAgICAvKiBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4gKi8KKyAgICBjcC0+X2hhc19ib29sX3ZhbHVlID0gVFJVRTsKKyAgICBjcC0+X2Jvb2xfdmFsdWUgPQorICAgICAgKHR5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFID8gVFJVRSA6IEZBTFNFKTsKKyAgfQorCisgIC8qIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLiAqLworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAqZmllbGRfaWQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IGt2X3R5cGU7CisgIGdpbnQzMiBtc2l6ZTsKKworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAga3ZfdHlwZSA9IDA7CisgIG1zaXplID0gMDsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJm1zaXplLCBlcnJvcikpIDwwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIC8qIHN0aWxsIHJlYWQgdGhlIGt2IGJ5dGUgaWYgbmVnYXRpdmUgc2l6ZSAqLworICBpZiAobXNpemUgIT0gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZrdl90eXBlLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmIChjcC0+Y29udGFpbmVyX2xpbWl0ID4gMCAmJiBtc2l6ZSA+IGNwLT5jb250YWluZXJfbGltaXQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJnb3Qgc2l6ZSBvdmVyIGxpbWl0ICglZCA+ICVkKSIsIG1zaXplLCBjcC0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAobXNpemUgPiAwKSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpKChndWludDgpa3ZfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqa2V5X3R5cGUgPSByZXQ7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpKChndWludDgpa3ZfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnZhbHVlX3R5cGUgPSByZXQ7CisgICAgKnNpemUgPSAoZ3VpbnQzMikgbXNpemU7CisgIH0gZWxzZSBpZiAobXNpemUgPT0gMCkgeworICAgICprZXlfdHlwZSA9IDA7CisgICAgKnZhbHVlX3R5cGUgPSAwOworICAgICpzaXplID0gMDsKKyAgfSBlbHNlIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIG1zaXplKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IHNpemVfYW5kX3R5cGU7CisgIGdpbnQzMiBsc2l6ZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBzaXplX2FuZF90eXBlID0gMDsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmc2l6ZV9hbmRfdHlwZSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgbHNpemUgPSAoKGd1aW50OClzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKKyAgaWYgKGxzaXplID09IDE1KSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJmxzaXplLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmIChsc2l6ZSA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIGxzaXplKTsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAoY3AtPmNvbnRhaW5lcl9saW1pdCA+IDAgJiYgbHNpemUgPiBjcC0+Y29udGFpbmVyX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCBsc2l6ZSwgY3AtPmNvbnRhaW5lcl9saW1pdCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KShzaXplX2FuZF90eXBlICYgMHgwZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqZWxlbWVudF90eXBlID0gcmV0OworICAqc2l6ZSA9IChndWludDMyKSBsc2l6ZTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCBlbGVtZW50X3R5cGUsIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQ4IHZhbDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoY3AtPl9oYXNfYm9vbF92YWx1ZSA9PSBUUlVFKSB7CisgICAgKnZhbHVlID0gY3AtPl9ib29sX3ZhbHVlOworICAgIGNwLT5faGFzX2Jvb2xfdmFsdWUgPSBGQUxTRTsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgICp2YWx1ZSA9ICh2YWwgPT0gQ1RfQk9PTEVBTl9UUlVFKTsKKyAgICByZXR1cm4geGZlcjsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBncG9pbnRlciBiWzFdOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gKihnaW50OCAqKSBiOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHZhbDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgKnZhbHVlID0gKGdpbnQxNikgemlnemFnX3RvX2kzMiAoKGd1aW50MzIpIHZhbCk7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgdmFsOworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqdmFsdWUgPSB6aWd6YWdfdG9faTMyICgoZ3VpbnQzMikgdmFsKTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQ2NCB2YWw7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQ2NCAoY3AsICZ2YWwsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICp2YWx1ZSA9IHppZ3phZ190b19pNjQgKChndWludDY0KSB2YWwpOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbiB7CisgICAgZ3VpbnQ2NCBiaXRzOworICAgIGd1aW50OCBiWzhdOworICB9IHU7CisKKyAgZ19hc3NlcnQgKHNpemVvZiAoZ2RvdWJsZSkgPT0gc2l6ZW9mIChndWludDY0KSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmIsIDgsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHUuYml0cyA9IEdVSU5UNjRfRlJPTV9MRSAodS5iaXRzKTsKKyAgKnZhbHVlID0gdGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlICh1LmJpdHMpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQzMiByZWFkX2xlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKyAgcmVhZF9sZW4gPSAwOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoY3AtPnN0cmluZ19saW1pdCA+IDAgJiYgcmVhZF9sZW4gPiBjcC0+c3RyaW5nX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCByZWFkX2xlbiwgY3AtPnN0cmluZ19saW1pdCk7CisgICAgKnN0ciA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHJlYWRfbGVuIDwgMCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIHJlYWRfbGVuICsgMSk7CisgIGlmIChyZWFkX2xlbiA+IDApIHsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciwgcmVhZF9sZW4sIGVycm9yKSkgPCAwKSB7CisgICAgICBnX2ZyZWUgKCpzdHIpOworICAgICAgKnN0ciA9IE5VTEw7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgICoqc3RyID0gMDsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQzMiByZWFkX2xlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKyAgcmVhZF9sZW4gPSAwOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoY3AtPnN0cmluZ19saW1pdCA+IDAgJiYgcmVhZF9sZW4gPiBjcC0+c3RyaW5nX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCByZWFkX2xlbiwgY3AtPnN0cmluZ19saW1pdCk7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgKmxlbiA9IDA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHJlYWRfbGVuID4gMCkgeworICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBnX25ldyAoZ3VjaGFyLCAqbGVuKTsKKyAgICBpZiAoKHJldCA9CisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApIHsKKyAgICAgIGdfZnJlZSAoKmJ1Zik7CisgICAgICAqYnVmID0gTlVMTDsKKyAgICAgICpsZW4gPSAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICB9IGVsc2UgaWYgKHJlYWRfbGVuID09IDApIHsKKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBOVUxMOworCisgIH0gZWxzZSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCByZWFkX2xlbik7CisgICAgKmJ1ZiA9IE5VTEw7CisgICAgKmxlbiA9IDA7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGMgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX1NUUklOR19MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjLT5zdHJpbmdfbGltaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjLT5jb250YWluZXJfbGltaXQpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQ6CisgICAgICB0Yy0+c3RyaW5nX2xpbWl0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgdGMtPmNvbnRhaW5lcl9saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNsczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoInN0cmluZ19saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgc3RyaW5nIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IHN0cmluZyBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgiY29udGFpbmVyX2xpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggYWxsb3dlZCBjb250YWluZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBtYXggY29udGFpbmVyIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQ7CisgIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW47CisgIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGU7CisgIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQ7CisgIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnk7CisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW47CisgIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQ7CisgIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luOworICBjbHMtPnJlYWRfbGlzdF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kOworICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfZW5kOworICBjbHMtPnJlYWRfYm9vbCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbDsKKyAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNjsKKyAgY2xzLT5yZWFkX2kzMiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyOworICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZTsKKyAgY2xzLT5yZWFkX3N0cmluZyA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nOworICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnNlbGYpCit7CisgIGdfcXVldWVfaW5pdCAoJihzZWxmLT5fbGFzdF9maWVsZCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZmNhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaAorICogIFxicmllZiBDb21wYWN0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MpKQorCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2wgVGhyaWZ0Q29tcGFjdFByb3RvY29sOworCisvKiEKKyAqIFRocmlmdCBDb21wYWN0IFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQzMiBzdHJpbmdfbGltaXQ7CisgIGdpbnQzMiBjb250YWluZXJfbGltaXQ7CisKKyAgLyogcHJpdmF0ZSAqLworCisgIC8qKgorICAgKiAoV3JpdGluZykgSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUKKyAgICogc28gaXQgY2FuIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICovCisgIGNvbnN0IGdjaGFyKiBfYm9vbF9maWVsZF9uYW1lOworICBUaHJpZnRUeXBlIF9ib29sX2ZpZWxkX3R5cGU7CisgIGdpbnQxNiBfYm9vbF9maWVsZF9pZDsKKworICAvKioKKyAgICogKFJlYWRpbmcpIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZQorICAgKiB0aGUgYm9vbGVhbiB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZF9ib29sIGNhbiB1c2UgaXQuCisgICAqLworICBnYm9vbGVhbiBfaGFzX2Jvb2xfdmFsdWU7CisgIGdib29sZWFuIF9ib29sX3ZhbHVlOworCisgIC8qKgorICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgKi8KKworICBHUXVldWUgX2xhc3RfZmllbGQ7CisgIGdpbnQxNiBfbGFzdF9maWVsZF9pZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcyBUaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgQ29tcGFjdCBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyNWUxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlQcm9wZXJ0aWVzCit7CisgICAgUFJPUF8wLAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpCisKK1RocmlmdFByb3RvY29sICoKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKnRjZjsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICB0Y2YgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIChmYWN0b3J5KTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0IiwgdGNmLT5zdHJpbmdfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgdGNmLT5jb250YWluZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MICh0Yyk7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqdGNmOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGNmLT5zdHJpbmdfbGltaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGNmLT5jb250YWluZXJfbGltaXQpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBzcGVjKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICp0Y2Y7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0Y2YgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQ6CisgICAgICB0Y2YtPnN0cmluZ19saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ09OVEFJTkVSX0xJTUlUOgorICAgICAgdGNmLT5jb250YWluZXJfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2NsYXNzX2luaXQgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKmNsczsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscyA9IFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTIChrbGFzcyk7CisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoInN0cmluZ19saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgc3RyaW5nIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IHN0cmluZyBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX1NUUklOR19MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJjb250YWluZXJfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIGNvbnRhaW5lciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBjb250YWluZXIgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVCwgcGFyYW1fc3BlYyk7CisKKyAgY2xzLT5nZXRfcHJvdG9jb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY5NTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgXAorICAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWShvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlksIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OworCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgZ2ludDMyIHN0cmluZ19saW1pdDsKKyAgZ2ludDMyIGNvbnRhaW5lcl9saW1pdDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzOworCitzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzcworeworICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdmNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oPgorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5ECit9OworCitHX0RFRklORV9UWVBFKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKQorCisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfRU5EXSA9IHsgTlVMTCwgfTsKKworZ2ludDMyCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgY29uc3QgZ2NoYXIgKm5hbWUsIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnY2hhciAqc2VydmljZV9uYW1lID0gTlVMTDsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgKm11bHRpcGxleENsYXNzID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0dFVF9DTEFTUyhzZWxmKTsKKworICBpZiggKG1lc3NhZ2VfdHlwZSA9PSBUX0NBTEwgfHwgbWVzc2FnZV90eXBlID09IFRfT05FV0FZKSAmJiBzZWxmLT5zZXJ2aWNlX25hbWUgIT0gTlVMTCkgeworICAgIHNlcnZpY2VfbmFtZSA9IGdfc3RyZHVwX3ByaW50ZigiJXMlcyVzIiwgc2VsZi0+c2VydmljZV9uYW1lLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsIG5hbWUpOworICB9ZWxzZXsKKyAgICBzZXJ2aWNlX25hbWUgPSBnX3N0cmR1cChuYW1lKTsKKyAgfQorCisgIC8qIHJlbGF5IHRvIHRoZSBwcm90b2NvbF9kZWNvcmF0b3IgKi8KKyAgcmV0ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luKHByb3RvY29sLCBzZXJ2aWNlX25hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxaWQsIGVycm9yKTsKKworICBnX2ZyZWUoc2VydmljZV9uYW1lKTsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FOgorICAgIHNlbGYtPnNlcnZpY2VfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9TRVJWSUNFX05BTUU6CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+c2VydmljZV9uYW1lKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2luaXQgKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+c2VydmljZV9uYW1lID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAoZ29iamVjdCk7CisKKyAgaWYgKHNlbGYtPnNlcnZpY2VfbmFtZSkgeworICAgIGdfZnJlZShzZWxmLT5zZXJ2aWNlX25hbWUpOworICAgIHNlbGYtPnNlcnZpY2VfbmFtZSA9IE5VTEw7CisgIH0KKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgYXMgd2l0aCBkaXNwb3NlKCksIGZpbmFsaXplKCkKKyAgICogaXMgZ3VhcmFudGVlZCB0byBleGlzdCBvbiB0aGUgcGFyZW50J3MgY2xhc3MgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZShnb2JqZWN0KTsKK30KKworCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luOworCisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2ZpbmFsaXplOworCisgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9TRVJWSUNFX05BTUVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJzZXJ2aWNlLW5hbWUiLAorICAgICAgICAgICJTZXJ2aWNlIG5hbWUgdGhlIHByb3RvY29sIHBvaW50cyB0byIsCisgICAgICAgICAgIlNldCB0aGUgc2VydmljZSBuYW1lIiwKKyAgICAgICAgICBOVUxMLAorICAgICAgICAgIChHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKG9iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORCwKKyAgICAgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9vYmpfcHJvcGVydGllcyk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmUwOGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaAorICogIFxicmllZiBNdWx0aXBsZXhlZCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCAodGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MpKQorCisvKiBjb25zdGFudCAqLworI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IgIjoiCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2w7CisKKworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZCBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yIHBhcmVudDsKKworICBnY2hhciAqc2VydmljZV9uYW1lOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcyBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkIFByb3RvY29sIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTZhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ET01BSU4gInRocmlmdC1wcm90b2NvbC1lcnJvci1xdWFyayIKKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdFByb3RvY29sUHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVAorfTsKKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRQcm90b2NvbCwgdGhyaWZ0X3Byb3RvY29sLCBHX1RZUEVfT0JKRUNUKQorCit2b2lkCit0aHJpZnRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHByb3RvY29sLT50cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZAordGhyaWZ0X3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworCisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVDoKKyAgICAgIHByb3RvY29sLT50cmFuc3BvcnQgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2JlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvdG9jb2wsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLCB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tYXBfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zZXRfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9ib29sIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYnl0ZSAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfaTE2IChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2kzMiAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9pNjQgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc3RyaW5nIChwcm90b2NvbCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9maWVsZF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9tYXBfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9saXN0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc2V0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYm9vbCAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2J5dGUgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2kxNiAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9pMzIgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfaTY0IChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9kb3VibGUgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cmluZyAocHJvdG9jb2wsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9iaW5hcnkgKHByb3RvY29sLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfc2tpcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlIHR5cGUsIEdFcnJvciAqKmVycm9yKQoreworICBzd2l0Y2ggKHR5cGUpCisgIHsKKyAgICBjYXNlIFRfQk9PTDoKKyAgICAgIHsKKyAgICAgICAgZ2Jvb2xlYW4gYm9vbHY7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwgJmJvb2x2LCBlcnJvcik7CisgICAgICB9CisgICAgY2FzZSBUX0JZVEU6CisgICAgICB7CisgICAgICAgIGdpbnQ4IGJ5dGV2OworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZieXRldiwgZXJyb3IpOworICAgICAgfQorCisgICAgY2FzZSBUX0kxNjoKKyAgICAgIHsKKyAgICAgICAgZ2ludDE2IGkxNjsKKyAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZpMTYsIGVycm9yKTsKKyAgICAgIH0KKyAgICBjYXNlIFRfSTMyOgorICAgICAgeworICAgICAgICBnaW50MzIgaTMyOworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJmkzMiwgZXJyb3IpOworICAgICAgfQorICAgIGNhc2UgVF9JNjQ6CisgICAgICB7CisgICAgICAgIGdpbnQ2NCBpNjQ7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmaTY0LCBlcnJvcik7CisgICAgICB9CisgICAgY2FzZSBUX0RPVUJMRToKKyAgICAgIHsKKyAgICAgICAgZ2RvdWJsZSBkdWI7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLCAmZHViLCBlcnJvcik7CisgICAgICB9CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIHsKKyAgICAgICAgZ3BvaW50ZXIgZGF0YTsKKyAgICAgICAgZ3VpbnQzMiBsZW47CisgICAgICAgIGdpbnQzMiByZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmZGF0YSwgJmxlbiwgZXJyb3IpOworICAgICAgICBnX2ZyZWUgKGRhdGEpOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIGNhc2UgVF9TVFJVQ1Q6CisgICAgICB7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBnY2hhciAqbmFtZTsKKyAgICAgICAgZ2ludDE2IGZpZDsKKyAgICAgICAgVGhyaWZ0VHlwZSBmdHlwZTsKKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcik7CisKKyAgICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgJmZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZCwgZXJyb3IpOworICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7ICAKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKTsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIGNhc2UgVF9TRVQ6CisgICAgICB7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKKyAgICAgICAgZ3VpbnQzMiBpLCBzaXplOworICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1fdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGVsZW1fdHlwZSwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIGNhc2UgVF9NQVA6CisgICAgICB7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKKyAgICAgICAgVGhyaWZ0VHlwZSBrZXlfdHlwZTsKKyAgICAgICAgZ3VpbnQzMiBpLCBzaXplOworICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgJmtleV90eXBlLCAmZWxlbV90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwga2V5X3R5cGUsIGVycm9yKTsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBjYXNlIFRfTElTVDoKKyAgICAgIHsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CisgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOworICAgICAgICBndWludDMyIGksIHNpemU7CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1fdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCBlcnJvcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHByb3RvY29scyAqLworR1F1YXJrCit0aHJpZnRfcHJvdG9jb2xfZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoVEhSSUZUX1BST1RPQ09MX0VSUk9SX0RPTUFJTik7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9pbml0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wpCit7CisgIHByb3RvY29sLT50cmFuc3BvcnQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFByb3RvY29sICpzZWxmID0gVEhSSUZUX1BST1RPQ09MIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+dHJhbnNwb3J0KTsKKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZgorICAgKiB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudHMgdGhlIGRpc3Bvc2UoKSB2aXJ0dWFsIGZ1bmN0aW9uOiBpdCBpcworICAgKiBhbHdheXMgZ3VhcmFudGVlZCB0byBkbyBzbworICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9wcm90b2NvbF9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdFByb3RvY29sQ2xhc3MgKmNscykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9wcm90b2NvbF9kaXNwb3NlOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidHJhbnNwb3J0IiwgIlRyYW5zcG9ydCIsICJUaHJpZnQgVHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luOworICBjbHMtPndyaXRlX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW47CisgIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wOworICBjbHMtPndyaXRlX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kOworICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9saXN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luOworICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZDsKKyAgY2xzLT53cml0ZV9ib29sID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlOworICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMTY7CisgIGNscy0+d3JpdGVfaTMyID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTY0OworICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9kb3VibGU7CisgIGNscy0+d3JpdGVfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5OworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW47CisgIGNscy0+cmVhZF9tZXNzYWdlX2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luOworICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQ7CisgIGNscy0+cmVhZF9maWVsZF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kOworICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luOworICBjbHMtPnJlYWRfbWFwX2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbjsKKyAgY2xzLT5yZWFkX3NldF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kOworICBjbHMtPnJlYWRfYm9vbCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZTsKKyAgY2xzLT5yZWFkX2kxNiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNjsKKyAgY2xzLT5yZWFkX2kzMiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2k2NDsKKyAgY2xzLT5yZWFkX2RvdWJsZSA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2RvdWJsZTsKKyAgY2xzLT5yZWFkX3N0cmluZyA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZmU1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9ICisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3Byb3RvY29sLmgKKyAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLyoqCisgKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbCBzdXBwb3J0cy4KKyAqIFRha2Ugc3BlY2lhbCBub3RlIG9mIHRoZSBUX0VORCB0eXBlIHdoaWNoIGlzIHVzZWQgc3BlY2lmaWNhbGx5IHRvIG1hcmsKKyAqIHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSBvZiBmaWVsZHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFRfU1RPUCAgID0gMCwKKyAgVF9WT0lEICAgPSAxLAorICBUX0JPT0wgICA9IDIsCisgIFRfQllURSAgID0gMywKKyAgVF9JMDggICAgPSAzLAorICBUX0kxNiAgICA9IDYsCisgIFRfSTMyICAgID0gOCwKKyAgVF9VNjQgICAgPSA5LAorICBUX0k2NCAgICA9IDEwLAorICBUX0RPVUJMRSA9IDQsCisgIFRfU1RSSU5HID0gMTEsCisgIFRfVVRGNyAgID0gMTEsCisgIFRfU1RSVUNUID0gMTIsCisgIFRfTUFQICAgID0gMTMsCisgIFRfU0VUICAgID0gMTQsCisgIFRfTElTVCAgID0gMTUsCisgIFRfVVRGOCAgID0gMTYsCisgIFRfVVRGMTYgID0gMTcKK30gVGhyaWZ0VHlwZTsKKworLyoqCisgKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIG1lc3NhZ2UgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sCisgKiBzdXBwb3J0cy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgVF9DQUxMICAgICAgPSAxLAorICBUX1JFUExZICAgICA9IDIsCisgIFRfRVhDRVBUSU9OID0gMywKKyAgVF9PTkVXQVkgICAgPSA0Cit9IFRocmlmdE1lc3NhZ2VUeXBlOworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTCAodGhyaWZ0X3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwgVGhyaWZ0UHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIFRocmlmdFByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIFRocmlmdFByb3RvY29sQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2wgVGhyaWZ0UHJvdG9jb2w7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sCit7CisgIEdPYmplY3QgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbENsYXNzIFRocmlmdFByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIGdpbnQzMiAoKndyaXRlX21lc3NhZ2VfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX21lc3NhZ2VfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX3N0cnVjdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfc3RydWN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9maWVsZF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9maWVsZF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfZmllbGRfc3RvcCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9tYXBfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX21hcF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfbGlzdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2xpc3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX3NldF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9zZXRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2Jvb2wpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdib29sZWFuIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9ieXRlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfaTE2KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfaTMyKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfaTY0KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfZG91YmxlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnZG91YmxlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX3N0cmluZykgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9iaW5hcnkpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKworICBnaW50MzIgKCpyZWFkX21lc3NhZ2VfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqdGhyaWZ0X3Byb3RvY29sLCBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9tZXNzYWdlX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX3N0cnVjdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9zdHJ1Y3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfZmllbGRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfZmllbGRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbWFwX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9tYXBfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbGlzdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbGlzdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9zZXRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfc2V0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2Jvb2wpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2J5dGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2kxNikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2kzMikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2k2NCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2RvdWJsZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2RvdWJsZSAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX3N0cmluZykgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9iaW5hcnkpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbGVuLCBHRXJyb3IgKiplcnJvcik7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICp0aHJpZnRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICpidWYsIGd1aW50MzIgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9za2lwIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisvKiBkZWZpbmUgZXJyb3IgdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfVU5LTk9XTiwKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0lOVkFMSURfREFUQSwKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9OT1RfSU1QTEVNRU5URUQsCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ERVBUSF9MSU1JVAorfSBUaHJpZnRQcm90b2NvbEVycm9yOworCisvKiBkZWZpbmUgYW4gZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgdG8gdXNlICovCitHUXVhcmsgdGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0VSUk9SICh0aHJpZnRfcHJvdG9jb2xfZXJyb3JfcXVhcmsgKCkpCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmOTQyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jCkBAIC0wLDAgKzEsNjIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdFByb3RvY29sRGVjb3JhdG9yLCB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkKKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MID0gMSwKKyAgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfRU5ECit9OworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9FTkRdID0geyBOVUxMLCB9OworCisKKworCisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKnByb3RvID0gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworCisgIGdfZGVidWcoIkNvbmNyZXRlIHByb3RvY29sICVwIHwgJXAiLCAodm9pZCAqKXNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCAodm9pZCAqKXByb3RvKTsKKworICByZXR1cm4gcHJvdG8tPndyaXRlX21lc3NhZ2VfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc3RydWN0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3N0cnVjdF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfZmllbGRfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2ZpZWxkX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfZmllbGRfc3RvcCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX21hcF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX21hcF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbGlzdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbGlzdF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3NldF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zZXRfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfYm9vbCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9ieXRlIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfaTE2IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9pMzIgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2k2NCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2RvdWJsZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3N0cmluZyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9iaW5hcnkgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9tZXNzYWdlX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbWVzc2FnZV9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbWFwX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbWFwX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9saXN0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9saXN0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc2V0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zZXRfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfYm9vbCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9ieXRlIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfaTE2IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9pMzIgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2k2NCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2RvdWJsZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3N0cmluZyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfYmluYXJ5IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9DT05DUkVURV9QUk9UT0NPTDoKKyAgICBzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9DT05DUkVURV9QUk9UT0NPTDoKKyAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKworVGhyaWZ0UHJvdG9jb2wgKgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfY29uY3JldGVfcHJvdG9jb2woVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnByb3RvY29sKQoreworICBUaHJpZnRQcm90b2NvbCAqcmV0dmFsID0gTlVMTDsKKyAgaWYoIVRIUklGVF9JU19QUk9UT0NPTF9ERUNPUkFUT1IocHJvdG9jb2wpKXsKKyAgICBnX3dhcm5pbmcoIlRoZSB0eXBlIGlzIG5vdCBwcm90b2NvbCBkZWNvcmF0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IocHJvdG9jb2wpOworICBnX2RlYnVnKCJHZXR0aW5nIGNvbmNyZXRlIHByb3RvY29sIGZyb20gJXAgLT4gJXAiLCAodm9pZCAqKXNlbGYsICh2b2lkICopc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfaW5pdCAoVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+Y29uY3JldGVfcHJvdG9jb2wgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKGdvYmplY3QpOworCisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCk7CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYKKyAgICogdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBkaXNwb3NlKCkgdmlydHVhbCBmdW5jdGlvbjogaXQgaXMKKyAgICogYWx3YXlzIGd1YXJhbnRlZWQgdG8gZG8gc28KKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3BhcmVudF9jbGFzcyktPmRpc3Bvc2UoZ29iamVjdCk7Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9kaXNwb3NlOworCisgIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0xdID0KKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJwcm90b2NvbCIsCisgICAgICAgICAgIlByb3RvY29sIiwKKyAgICAgICAgICAiU2V0IHRoZSBwcm90b2NvbCB0byBiZSBpbXBsZW1lbnRlZCIsIFRIUklGVF9UWVBFX1BST1RPQ09MLAorICAgICAgICAgIChHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKG9iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0VORCwKKyAgICAgIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfb2JqX3Byb3BlcnRpZXMpOworCisgIGdfZGVidWcoIkN1cnJlbnQgZGVjb3JhdG9yIHdyaXRlX21lc3NhZ2VfYmVnaW4gYWRkciAlcCwgbmV3ICVwIiwgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luLCB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfYmVnaW4pOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9lbmQ7CisgIGNscy0+d3JpdGVfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJ1Y3RfYmVnaW47CisgIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfYmVnaW47CisgIGNscy0+d3JpdGVfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21hcF9iZWdpbjsKKyAgY2xzLT53cml0ZV9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfZW5kOworICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2xpc3RfZW5kOworICBjbHMtPndyaXRlX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc2V0X2JlZ2luOworICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYm9vbDsKKyAgY2xzLT53cml0ZV9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9ieXRlOworICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTMyOworICBjbHMtPndyaXRlX2k2NCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTY0OworICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RyaW5nOworICBjbHMtPndyaXRlX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYmluYXJ5OworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWVzc2FnZV9lbmQ7CisgIGNscy0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2JlZ2luOworICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZmllbGRfYmVnaW47CisgIGNscy0+cmVhZF9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZmllbGRfZW5kOworICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWFwX2VuZDsKKyAgY2xzLT5yZWFkX2xpc3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9iZWdpbjsKKyAgY2xzLT5yZWFkX2xpc3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2xpc3RfZW5kOworICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9iZWdpbjsKKyAgY2xzLT5yZWFkX3NldF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc2V0X2VuZDsKKyAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYm9vbDsKKyAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYnl0ZTsKKyAgY2xzLT5yZWFkX2kxNiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pMTY7CisgIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTMyOworICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2k2NDsKKyAgY2xzLT5yZWFkX2RvdWJsZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9kb3VibGU7CisgIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RyaW5nOworICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2JpbmFyeTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiNmFmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9ICisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oCisgKiAgXGJyaWVmIE11bHRpcGxleGVkIHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiAodGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfREVDT1JBVE9SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SLCBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0RFQ09SQVRPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvciBUaHJpZnRQcm90b2NvbERlY29yYXRvcjsKKworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBEZWNvcmF0b3IgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgcGFyZW50OworCisgIFRocmlmdFByb3RvY29sICpjb25jcmV0ZV9wcm90b2NvbDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIERlY29yYXRvciBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgcGFyZW50OworCit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiAqLworR1R5cGUgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmNDA4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRQcm90b2NvbEZhY3RvcnksIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5LCBHX1RZUEVfT0JKRUNUKQorCitUaHJpZnRQcm90b2NvbCAqCit0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2woVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChmYWN0b3J5KS0+Z2V0X3Byb3RvY29sIChmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyAqY2xzKQoreworICBjbHMtPmdldF9wcm90b2NvbCA9IHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE0NmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSAodGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeSBUaHJpZnRQcm90b2NvbEZhY3Rvcnk7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIEZhY3Rvcnkgb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Cit7CisgIEdPYmplY3QgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBGYWN0b3J5IGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICBUaHJpZnRQcm90b2NvbCAqKCpnZXRfcHJvdG9jb2wpIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCitUaHJpZnRQcm90b2NvbCAqdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSwgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDU2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmg+CisKKworZW51bQoreworICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUUgPSAxLAorICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX1RZUEUsCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1NFUVVFTkNFX0lELAorICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9UUkFOU1BPUlQsIC8qIFRPRE8gdWdseSBoYWNrICovCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0VORAorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wsIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKQorCisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfRU5EXSA9IHsgTlVMTCwgfTsKKworZ2ludDMyCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisJCQkJCSAgIGdjaGFyICoqbmFtZSwKKwkJCQkJICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKwkJCQkJICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQgPSAwOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICAvKiBXZSByZXR1cm4gdGhlIHN0b3JlZCB2YWx1ZXMgb24gY29uc3RydWN0aW9uICovCisgICpuYW1lID0gc2VsZi0+bmFtZTsKKyAgKm1lc3NhZ2VfdHlwZSA9IHNlbGYtPm10eXBlOworICAqc2VxaWQgPSBzZWxmLT5zZXFpZDsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKwkJCQkJICAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorCQkJCQkgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisJCQkJCSAgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRToKKyAgICAgIHNlbGYtPm5hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9UWVBFOgorICAgICAgc2VsZi0+bXR5cGUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfU0VRVUVOQ0VfSUQ6CisgICAgICBzZWxmLT5zZXFpZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKwkJCQkJICAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKwkJCQkJICAgICBHVmFsdWUgICAgICp2YWx1ZSwKKwkJCQkJICAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChvYmplY3QpOworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqZGVjb3JhdG9yID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAob2JqZWN0KTsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ9TlVMTDsKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+bmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1RSQU5TUE9SVDoKKyAgICAgIC8qIEZJWE1FIFNpbmNlIHdlIGRvbid0IG92ZXJyaWRlIHByb3BlcnRpZXMgaW4gdGhlIGRlY29yYXRvciBhcyBpdCBzaG91bGQKKyAgICAgICAgIHdlIGp1c3Qgb3ZlcnJpZGUgdGhlIHByb3BlcnRpZXMgdGhhdCB3ZSBrbm93IGFyZSB1c2VkICovCisgICAgICBnX29iamVjdF9nZXQoZGVjb3JhdG9yLT5jb25jcmV0ZV9wcm90b2NvbCxwc3BlYy0+bmFtZSwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX3ZhbHVlX3NldF9wb2ludGVyICh2YWx1ZSwgdHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9pbml0IChUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+bmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZmluYWxpemUgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAoZ29iamVjdCk7CisKKyAgaWYgKHNlbGYtPm5hbWUpIHsKKyAgICAgIGdfZnJlZShzZWxmLT5uYW1lKTsKKyAgICAgIHNlbGYtPm5hbWUgPSBOVUxMOworICB9CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IGFzIHdpdGggZGlzcG9zZSgpLCBmaW5hbGl6ZSgpCisgICAqIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3Qgb24gdGhlIHBhcmVudCdzIGNsYXNzIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUoZ29iamVjdCk7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKKworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9maW5hbGl6ZTsKKworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FXSA9CisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibmFtZSIsCisJCQkgICAiU2VydmljZSBuYW1lIHRoZSBwcm90b2NvbCBwb2ludHMgdG8iLAorCQkJICAgIlNldCB0aGUgc2VydmljZSBuYW1lIiwKKwkJCSAgIE5VTEwsCisJCQkgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX1RZUEVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0eXBlIiwKKwkJCSJNZXNzYWdlIHR5cGUgaW4gdGhlIHdpcmUiLAorCQkJIlNldCB0aGUgbWVzc2FnZSB0eXBlIGluIHRoZSB3aXJlIiwKKwkJCVRfQ0FMTCwgVF9PTkVXQVksCisJCQlUX0NBTEwsCisJCQkoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9TRVFVRU5DRV9JRF0gPQorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNlcWlkIiwKKwkJCSJTZXF1ZW5jZSBpZCB0eXBlIGluIHRoZSB3aXJlIiwKKwkJCSJTZXQgdGhlIFNlcXVlbmNlIGlkIGluIHRoZSB3aXJlIiwKKwkJCTAsIEdfTUFYSU5ULAorCQkJMCwKKwkJCShHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICAvKiBUT0RPIFVnbHkgaGFjaywgaW4gdGhlb3J5IHdlIG11c3Qgb3ZlcnJpZGUgYWxsIHByb3BlcnRpZXMgZnJvbSB1bmRlcmxheWluZworICAgICBwcm90b2NvbCAqLworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JUXSA9CisgICAgICBnX3BhcmFtX3NwZWNfcG9pbnRlciAoInRyYW5zcG9ydCIsCisJCQkiVHJhbnNwb3J0IG9uIHRoZSB1bmRlcmxheWluZyBpbXBsZW1lbnRhdGlvbiIsCisJCQkiVHJhbnNwb3J0IG9mIGRlY29yYXRlZCBwcm90b2NvbCIsCisJCQlHX1BBUkFNX1JFQURBQkxFKTsKKworCisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisJCQkJICAgICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkQsCisJCQkJICAgICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ODJhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKKyAqICBcYnJpZWYgU3RvcmVkTWVzc2FnZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIHByZS1zdG9yZWQgbWVzc2FnZSBoZWFkZXIKKyAqICBvbiBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZSBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19TVE9SRURfTUVTU0FHRV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzKSkKKworLyogY29uc3RhbnQgKi8KKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SICI6IgorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbDsKKworCisKKy8qIQorICogVGhyaWZ0IFN0b3JlZE1lc3NhZ2UgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yIHBhcmVudDsKKworICBnY2hhciAqbmFtZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7CisgIGdpbnQzMiBzZXFpZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcyBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgU3RvcmVkTWVzc2FnZSBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y5MTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgInRocmlmdF9zZXJ2ZXIuaCIKKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdFNlcnZlclByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SLAorICBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVCwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAorICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAorICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWSwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZCit9OworCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFNlcnZlciwgdGhyaWZ0X3NlcnZlciwgR19UWVBFX09CSkVDVCkKKwordm9pZAordGhyaWZ0X3NlcnZlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUiAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1I6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPnByb2Nlc3Nvcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JUOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfc2VydmVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBUSFJJRlRfU0VSVkVSIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUjoKKyAgICAgIHNlcnZlci0+cHJvY2Vzc29yID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JUOgorICAgICAgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWToKKyAgICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWToKKyAgICAgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZOgorICAgICAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWToKKyAgICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2dib29sZWFuCit0aHJpZnRfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlciwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoc2VydmVyKS0+c2VydmUgKHNlcnZlciwgZXJyb3IpOworfQorCit2b2lkCit0aHJpZnRfc2VydmVyX3N0b3AgKFRocmlmdFNlcnZlciAqc2VydmVyKQoreworICBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoc2VydmVyKS0+c3RvcCAoc2VydmVyKTsKK30KKworLyogaW5zdGFuY2UgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdCBTZXJ2ZXIgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2luaXQgKFRocmlmdFNlcnZlciAqc2VydmVyKQoreworICBzZXJ2ZXItPnByb2Nlc3NvciA9IE5VTEw7CisgIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBOVUxMOworICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IE5VTEw7CisgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IE5VTEw7CisgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRTZXJ2ZXIgKnNlbGYgPSBUSFJJRlRfU0VSVkVSIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+c2VydmVyX3RyYW5zcG9ydCk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5wcm9jZXNzb3IpOworCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmCisgICAqIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgZGlzcG9zZSgpIHZpcnR1YWwgZnVuY3Rpb246IGl0IGlzCisgICAqIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvIHNvCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NlcnZlcl9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCisvKgorICogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFNlcnZlcgorICogVE9ETzogaW1wbGVtZW50IFNlcnZlckV2ZW50SGFuZGxlciBhcyBhIEdDbG9zdXJlCisgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2NsYXNzX2luaXQgKFRocmlmdFNlcnZlckNsYXNzICpjbHMpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9zZXJ2ZXJfZGlzcG9zZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUiwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJwcm9jZXNzb3IiLCAiUHJvY2Vzc29yIiwgIlRocmlmdCBQcm9jZXNzb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVCwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJzZXJ2ZXJfdHJhbnNwb3J0IiwgIlNlcnZlciBUcmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgVHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJpbnB1dF90cmFuc3BvcnRfZmFjdG9yeSIsICJJbnB1dCBUcmFuc3BvcnQgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBJbnB1dCBUcmFuc3BvcnQgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJvdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91dHB1dCBUcmFuc3BvcnQgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBPdXRwdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImlucHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAiSW5wdXQgUHJvdG9jb2wgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBJbnB1dCBQcm90b2NvbCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSIsICJPdXRwdXQgUHJvdG9jb2wgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBPdXRwdXQgUHJvdG9jb2wgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisKKyAgLyogc2V0IHRoZXNlIGFzIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzICovCisgIGNscy0+c2VydmUgPSB0aHJpZnRfc2VydmVyX3NlcnZlOworICBjbHMtPnN0b3AgPSB0aHJpZnRfc2VydmVyX3N0b3A7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZWRkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfSAorI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc2VydmVyLmgKKyAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXJzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUiAodGhyaWZ0X3NlcnZlcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUiwgVGhyaWZ0U2VydmVyKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUikpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUiwgVGhyaWZ0U2VydmVyQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVIpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSLCBUaHJpZnRTZXJ2ZXJDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXIgVGhyaWZ0U2VydmVyOworCisvKiEKKyAqIFRocmlmdCBTZXJ2ZXIgb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0U2VydmVyCit7CisgIEdPYmplY3QgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvcjsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICppbnB1dF90cmFuc3BvcnRfZmFjdG9yeTsKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqb3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5OworICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmlucHV0X3Byb3RvY29sX2ZhY3Rvcnk7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSAqb3V0cHV0X3Byb3RvY29sX2ZhY3Rvcnk7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyQ2xhc3MgVGhyaWZ0U2VydmVyQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFNlcnZlciBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlckNsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIGdib29sZWFuICgqc2VydmUpIChUaHJpZnRTZXJ2ZXIgKnNlcnZlciwgR0Vycm9yICoqZXJyb3IpOworICB2b2lkICgqc3RvcCkgKFRocmlmdFNlcnZlciAqc2VydmVyKTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0VSVkVSICovCitHVHlwZSB0aHJpZnRfc2VydmVyX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlciwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFN0b3AgaGFuZGxpbmcgcmVxdWVzdHMuCisgKi8KK3ZvaWQgdGhyaWZ0X3NlcnZlcl9zdG9wIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1NFUlZFUl9IICovCisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTk2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdFNpbXBsZVNlcnZlciwgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIsIFRIUklGVF9UWVBFX1NFUlZFUikKKworZ2Jvb2xlYW4KK3RocmlmdF9zaW1wbGVfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFRyYW5zcG9ydCAqdCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqaW5wdXRfdHJhbnNwb3J0ID0gTlVMTCwgKm91dHB1dF90cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wgPSBOVUxMLCAqb3V0cHV0X3Byb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0U2ltcGxlU2VydmVyICp0c3MgPSBUSFJJRlRfU0lNUExFX1NFUlZFUihzZXJ2ZXIpOworICBHRXJyb3IgKnByb2Nlc3NfZXJyb3IgPSBOVUxMOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU0lNUExFX1NFUlZFUiAoc2VydmVyKSwgRkFMU0UpOworCisgIGlmICh0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCwgZXJyb3IpKSB7CisgICAgdHNzLT5ydW5uaW5nID0gVFJVRTsKKyAgICB3aGlsZSAodHNzLT5ydW5uaW5nID09IFRSVUUpCisgICAgeworICAgICAgdCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgaWYgKHQgIT0gTlVMTCAmJiB0c3MtPnJ1bm5pbmcpIHsKKyAgICAgICAgaW5wdXRfdHJhbnNwb3J0ID0KKyAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5KQorICAgICAgICAgIC0+Z2V0X3RyYW5zcG9ydCAoc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSwgdCk7CisgICAgICAgIG91dHB1dF90cmFuc3BvcnQgPQorICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5KQorICAgICAgICAgIC0+Z2V0X3RyYW5zcG9ydCAoc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnksIHQpOworICAgICAgICBpbnB1dF9wcm90b2NvbCA9CisgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkpCisgICAgICAgICAgLT5nZXRfcHJvdG9jb2wgKHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSwgaW5wdXRfdHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0X3Byb3RvY29sID0KKyAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpCisgICAgICAgICAgLT5nZXRfcHJvdG9jb2wgKHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnksIG91dHB1dF90cmFuc3BvcnQpOworCisgICAgICAgIHdoaWxlIChUSFJJRlRfUFJPQ0VTU09SX0dFVF9DTEFTUyAoc2VydmVyLT5wcm9jZXNzb3IpCisgICAgICAgICAgICAgICAtPnByb2Nlc3MgKHNlcnZlci0+cHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY2Vzc19lcnJvcikgJiYKKyAgICAgICAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcGVlayAoaW5wdXRfdHJhbnNwb3J0LCAmcHJvY2Vzc19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9jZXNzX2Vycm9yICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2ltcGxlX3NlcnZlcl9zZXJ2ZTogJXMiLCBwcm9jZXNzX2Vycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBnX2NsZWFyX2Vycm9yICgmcHJvY2Vzc19lcnJvcik7CisKKyAgICAgICAgICAvKiBOb3RlIHdlIGRvIG5vdCBwcm9wYWdhdGUgcHJvY2Vzc2luZyBlcnJvcnMgdG8gdGhlIGNhbGxlciBhcyB0aGV5CisgICAgICAgICAgICogbm9ybWFsbHkgYXJlIHRyYW5zaWVudCBhbmQgbm90IGZhdGFsIHRvIHRoZSBzZXJ2ZXIgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIFRPRE86IGhhbmRsZSBleGNlcHRpb25zICovCisgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTIChpbnB1dF90cmFuc3BvcnQpLT5jbG9zZSAoaW5wdXRfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAob3V0cHV0X3RyYW5zcG9ydCktPmNsb3NlIChvdXRwdXRfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhdHRlbXB0IHRvIHNodXRkb3duICovCisgICAgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQpCisgICAgICAtPmNsb3NlIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQsIE5VTEwpOworICB9CisKKyAgLyogU2luY2UgdGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gcnVuIGZvcmV2ZXIsIGl0IGNhbiBvbmx5IGV2ZXIgcmV0dXJuIG9uCisgICAqIGVycm9yICovCisgIHJldHVybiBGQUxTRTsKK30KKwordm9pZAordGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc3RvcCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpCit7CisgIGdfcmV0dXJuX2lmX2ZhaWwgKFRIUklGVF9JU19TSU1QTEVfU0VSVkVSIChzZXJ2ZXIpKTsKKyAgKFRIUklGVF9TSU1QTEVfU0VSVkVSIChzZXJ2ZXIpKS0+cnVubmluZyA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfaW5pdCAoVGhyaWZ0U2ltcGxlU2VydmVyICp0c3MpCit7CisgIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUih0c3MpOworCisgIHRzcy0+cnVubmluZyA9IEZBTFNFOworCisgIGlmIChzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID09IE5VTEwpCisgIHsKKyAgICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0KKyAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgTlVMTCk7CisgIH0KKyAgaWYgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID09IE5VTEwpCisgIHsKKyAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9CisgICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIE5VTEwpOworICB9CisgIGlmIChzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPT0gTlVMTCkKKyAgeworICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9CisgICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIE5VTEwpOworICB9CisgIGlmIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID09IE5VTEwpCisgIHsKKyAgICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0KKyAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgTlVMTCk7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2ltcGxlX3NlcnZlcl9jbGFzc19pbml0IChUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcyAqY2xhc3MpCit7CisgIFRocmlmdFNlcnZlckNsYXNzICpjbHMgPSBUSFJJRlRfU0VSVkVSX0NMQVNTKGNsYXNzKTsKKworICBjbHMtPnNlcnZlID0gdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc2VydmU7CisgIGNscy0+c3RvcCA9IHRocmlmdF9zaW1wbGVfc2VydmVyX3N0b3A7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI1MzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TSU1QTEVfU0VSVkVSX0gKKyNkZWZpbmUgX1RIUklGVF9TSU1QTEVfU0VSVkVSX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zaW1wbGVfc2VydmVyLmgKKyAqICBcYnJpZWYgQSBzaW1wbGUgVGhyaWZ0IHNlcnZlciwgc2luZ2xlLXRocmVhZGVkLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIgKHRocmlmdF9zaW1wbGVfc2VydmVyX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU0lNUExFX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsIFRocmlmdFNpbXBsZVNlcnZlcikpCisjZGVmaW5lIFRIUklGVF9JU19TSU1QTEVfU0VSVkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUikpCisjZGVmaW5lIFRIUklGVF9TSU1QTEVfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsIFRocmlmdFNpbXBsZVNlcnZlckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIpKQorI2RlZmluZSBUSFJJRlRfU0lNUExFX1NFUlZFUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsIFRocmlmdFNpbXBsZVNlcnZlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlciBUaHJpZnRTaW1wbGVTZXJ2ZXI7CisKKy8qKgorICogVGhyaWZ0IFNpbXBsZSBTZXJ2ZXIgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U2ltcGxlU2VydmVyCit7CisgIFRocmlmdFNlcnZlciBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICB2b2xhdGlsZSBnYm9vbGVhbiBydW5uaW5nOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlckNsYXNzIFRocmlmdFNpbXBsZVNlcnZlckNsYXNzOworCisvKioKKyAqIFRocmlmdCBTaW1wbGUgU2VydmVyIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlckNsYXNzCit7CisgIFRocmlmdFNlcnZlckNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiAqLworR1R5cGUgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9TSU1QTEVfU0VSVkVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlODY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisKKy8qKgorICogR0hhc2hUYWJsZSBjYWxsYmFjayB0byBhZGQga2V5cyB0byBhIEdMaXN0LgorICovCit2b2lkCit0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cyAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworICBHTGlzdCAqKmxpc3QgPSAoR0xpc3QgKiopIHVzZXJfZGF0YTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAodmFsdWUpOworCisgICpsaXN0ID0gZ19saXN0X2FwcGVuZCAoKmxpc3QsIGtleSk7Cit9Cit2b2lkIHRocmlmdF9zYWZlX2hhc2hfdGFibGVfZGVzdHJveShHSGFzaFRhYmxlKiBoYXNoX3RhYmxlKQoreworICBpZiAoaGFzaF90YWJsZSkKKyAgeworICAgIGdfaGFzaF90YWJsZV9kZXN0cm95KGhhc2hfdGFibGUpOworICB9Cit9CisKK2d1aW50IHRocmlmdF9ib29sZWFuX2hhc2goZ2NvbnN0cG9pbnRlciB2KQoreworICBjb25zdCBnYm9vbGVhbiogcCA9IHY7CisgIHJldHVybiBwICYmICpwID8gMSA6IDA7Cit9CitnYm9vbGVhbiB0aHJpZnRfYm9vbGVhbl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgaWYgKGEgPT0gYikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghYSB8fCAhYikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjb25zdCBnYm9vbGVhbiogcGEgPSBhOworICBjb25zdCBnYm9vbGVhbiogcGIgPSBiOworICByZXR1cm4gKnBhID09ICpwYjsKK30KKworZ3VpbnQgdGhyaWZ0X2ludDhfaGFzaChnY29uc3Rwb2ludGVyIHYpCit7CisgIGNvbnN0IGdpbnQ4KiBwID0gdjsKKyAgcmV0dXJuIHAgPyAqcCA6IDA7Cit9CitnYm9vbGVhbiB0aHJpZnRfaW50OF9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgaWYgKGEgPT0gYikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghYSB8fCAhYikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjb25zdCBnaW50OCogcGEgPSBhOworICBjb25zdCBnaW50OCogcGIgPSBiOworICByZXR1cm4gKnBhID09ICpwYjsKK30KKworZ3VpbnQgdGhyaWZ0X2ludDE2X2hhc2goZ2NvbnN0cG9pbnRlciB2KQoreworICBjb25zdCBnaW50MTYqIHAgPSB2OworICByZXR1cm4gcCA/ICpwIDogMDsKK30KK2dib29sZWFuIHRocmlmdF9pbnQxNl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYikKK3sKKyAgaWYgKGEgPT0gYikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghYSB8fCAhYikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjb25zdCBnaW50MTYqIHBhID0gYTsKKyAgY29uc3QgZ2ludDE2KiBwYiA9IGI7CisgIHJldHVybiAqcGEgPT0gKnBiOworfQorCit2b2lkCit0aHJpZnRfc3RyaW5nX2ZyZWUgKGdwb2ludGVyIHN0cikKK3sKKwlHQnl0ZUFycmF5KiBwdHIgPSBzdHI7CisJZ19ieXRlX2FycmF5X3VucmVmKHB0cik7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGE2NDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9ICisjZGVmaW5lIF9USFJJRlRfSAorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxnbGliLmg+CisKKy8qIHRoaXMgbWFjcm8gaXMgY2FsbGVkIHRvIHNhdGlzZnkgLVdhbGwgaGFyZGNvcmUgY29tcGlsYXRpb24gKi8KKyNpZm5kZWYgVEhSSUZUX1VOVVNFRF9WQVIKKyMgZGVmaW5lIFRIUklGVF9VTlVTRURfVkFSKHgpICgodm9pZCkgeCkKKyNlbmRpZgorCit2b2lkIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzIChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95KEdIYXNoVGFibGUqIGhhc2hfdGFibGUpOworCitndWludCB0aHJpZnRfYm9vbGVhbl9oYXNoKGdjb25zdHBvaW50ZXIgdik7CitnYm9vbGVhbiB0aHJpZnRfYm9vbGVhbl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK2d1aW50IHRocmlmdF9pbnQ4X2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9pbnQ4X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKworZ3VpbnQgdGhyaWZ0X2ludDE2X2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9pbnQxNl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK3ZvaWQgdGhyaWZ0X3N0cmluZ19mcmVlIChncG9pbnRlciBzdHIpOworCisjZW5kaWYgLyogI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzRjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYwpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fVFlQRSwKKyAgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX01FU1NBR0UKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24sIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24sIFRIUklGVF9UWVBFX1NUUlVDVCkKKworZ2ludDMyCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdjaGFyICpuYW1lOworICBUaHJpZnRUeXBlIGZ0eXBlOworICBnaW50MTYgZmlkOworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGhpcyA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7CisKKyAgLyogcmVhZCB0aGUgc3RydWN0IGJlZ2luIG1hcmtlciAqLworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpIDwgMCkKKyAgeworICAgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7CisKKyAgd2hpbGUgKDEpCisgIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlkLCBlcnJvcikpIDwgMCkKKyAgICB7CisgICAgICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgICAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7CisKKyAgICAvKiBicmVhayBpZiB3ZSBnZXQgYSBTVE9QIGZpZWxkICovCisgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKKyAgICB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpZCkKKyAgICB7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChmdHlwZSA9PSBUX1NUUklORykKKyAgICAgICAgeworICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnRoaXMtPm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIHhmZXIgKz0gcmV0OworICAgICAgICAgIHRoaXMtPl9faXNzZXRfbWVzc2FnZSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB4ZmVyICs9IHJldDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGZ0eXBlID09IFRfSTMyKQorICAgICAgICB7CisgICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdGhpcy0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgeGZlciArPSByZXQ7CisgICAgICAgICAgdGhpcy0+X19pc3NldF90eXBlID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIHhmZXIgKz0gcmV0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHhmZXIgKz0gcmV0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICAgIHJldHVybiAtMTsKKyAgICB4ZmVyICs9IHJldDsKKyAgfQorCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRoaXMgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAibWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1NUUklORywgMSwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgdGhpcy0+bWVzc2FnZSwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0kzMiwgMiwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgdGhpcy0+dHlwZSwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCisKKy8qIEdFcnJvciBkb21haW4gKi8KKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9ET01BSU4gInRocmlmdC1hcHBsaWNhdGlvbi1leGNlcHRpb24tZXJyb3ItcXVhcmsiCisKK0dRdWFyawordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0RPTUFJTik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0YWUgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9UWVBFOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdGFlLT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX01FU1NBR0U6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCB0YWUtPm1lc3NhZ2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRhZSA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX1RZUEU6CisgICAgICB0YWUtPnR5cGUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIHRhZS0+X19pc3NldF90eXBlID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX01FU1NBR0U6CisgICAgICBpZiAodGFlLT5tZXNzYWdlICE9IE5VTEwpCisgICAgICAgIGdfZnJlZSAodGFlLT5tZXNzYWdlKTsKKworICAgICAgdGFlLT5tZXNzYWdlID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICB0YWUtPl9faXNzZXRfbWVzc2FnZSA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2luaXQgKFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICpvYmplY3QpCit7CisgIG9iamVjdC0+dHlwZSA9IDA7CisgIG9iamVjdC0+X19pc3NldF90eXBlID0gRkFMU0U7CisgIG9iamVjdC0+bWVzc2FnZSA9IE5VTEw7CisgIG9iamVjdC0+X19pc3NldF9tZXNzYWdlID0gRkFMU0U7Cit9CisKK3ZvaWQKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRhZSA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7CisKKyAgaWYgKHRhZS0+X19pc3NldF9tZXNzYWdlKSB7CisJCWdfZnJlZSh0YWUtPm1lc3NhZ2UpOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fY2xhc3NfaW5pdCAoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcyAqY2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTKGNsYXNzKTsKKyAgVGhyaWZ0U3RydWN0Q2xhc3MgKmNscyA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xhc3MpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIGNscy0+cmVhZCA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fcmVhZDsKKyAgY2xzLT53cml0ZSA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fd3JpdGU7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2ZpbmFsaXplOworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJ0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiwgb25lIG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzIGRlZmluZWQgYnkgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkVycm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtZXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTiAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19zdHJpbmcgKCJtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gbWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXhjZXB0aW9uIHRoYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9jY3VycmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2Y3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaApAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fSAorI2RlZmluZSBfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgInRocmlmdF9zdHJ1Y3QuaCIKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oCisgKiAgXGJyaWVmIEMgSW1wbGVtZW50YXRpb24gb2YgYSBUQXBwbGljYXRpb25FeGNlcHRpb24uCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OICh0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikpCisjZGVmaW5lIFRIUklGVF9JU19BUFBMSUNBVElPTl9FWENFUFRJT04ob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04pKQorI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQVBQTElDQVRJT05fRVhDRVBUSU9OX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04pKQorI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uOworCitzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uCit7CisgIFRocmlmdFN0cnVjdCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBnaW50MzIgdHlwZTsKKyAgZ2Jvb2xlYW4gX19pc3NldF90eXBlOworICBnY2hhciAqbWVzc2FnZTsKKyAgZ2Jvb2xlYW4gX19pc3NldF9tZXNzYWdlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzczsKKworc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzCit7CisgIFRocmlmdFN0cnVjdENsYXNzIHBhcmVudDsKK307CisKK0dUeXBlIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZ2V0X3R5cGUgKHZvaWQpOworCisvKiBnZXJyb3IgY29kZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9NRVNTQUdFX1RZUEUsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfV1JPTkdfTUVUSE9EX05BTUUsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfQkFEX1NFUVVFTkNFX0lELAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX01JU1NJTkdfUkVTVUxULAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVEVSTkFMX0VSUk9SLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1BST1RPQ09MX0VSUk9SLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfVFJBTlNGT1JNLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfUFJPVE9DT0wsCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUsCisKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9OCit9IFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uRXJyb3I7CisKKy8qIGRlZmluZSBlcnJvciBkb21haW4gZm9yIEdFcnJvciAqLworR1F1YXJrIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKHZvaWQpOworI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SICh0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2Vycm9yX3F1YXJrICgpKQorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRmMmExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlICJ0aHJpZnRfc3RydWN0LmgiCisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0U3RydWN0LCB0aHJpZnRfc3RydWN0LCBHX1RZUEVfT0JKRUNUKQorCitnaW50MzIKK3RocmlmdF9zdHJ1Y3RfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU1RSVUNUIChvYmplY3QpLCAtMSk7CisgIHJldHVybiBUSFJJRlRfU1RSVUNUX0dFVF9DTEFTUyAob2JqZWN0KS0+cmVhZCAob2JqZWN0LCBwcm90b2NvbCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TVFJVQ1QgKG9iamVjdCksIC0xKTsKKyAgcmV0dXJuIFRIUklGVF9TVFJVQ1RfR0VUX0NMQVNTIChvYmplY3QpLT53cml0ZSAob2JqZWN0LCBwcm90b2NvbCwgZXJyb3IpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0cnVjdF9jbGFzc19pbml0IChUaHJpZnRTdHJ1Y3RDbGFzcyAqY2xzKQoreworICBjbHMtPnJlYWQgPSB0aHJpZnRfc3RydWN0X3JlYWQ7CisgIGNscy0+d3JpdGUgPSB0aHJpZnRfc3RydWN0X3dyaXRlOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0cnVjdF9pbml0IChUaHJpZnRTdHJ1Y3QgKnN0cnVjdHVyZSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHN0cnVjdHVyZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Y2ZjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1NUUlVDVF9ICisjZGVmaW5lIFRIUklGVF9TVFJVQ1RfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBUSFJJRlRfVFlQRV9TVFJVQ1QgKHRocmlmdF9zdHJ1Y3RfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TVFJVQ1Qob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdCkpCisjZGVmaW5lIFRIUklGVF9TVFJVQ1RfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NUUlVDVCwgVGhyaWZ0U3RydWN0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RSVUNUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1RSVUNUKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NUUlVDVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU1RSVUNUKSkKKyNkZWZpbmUgVEhSSUZUX1NUUlVDVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NUUlVDVCwgVGhyaWZ0U3RydWN0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RydWN0IFRocmlmdFN0cnVjdDsKKworLyogc3RydWN0ICovCitzdHJ1Y3QgX1RocmlmdFN0cnVjdAoreworICBHT2JqZWN0IHBhcmVudDsKKworICAvKiBwcml2YXRlICovCit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RydWN0Q2xhc3MgVGhyaWZ0U3RydWN0Q2xhc3M7CisKK3N0cnVjdCBfVGhyaWZ0U3RydWN0Q2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICAvKiBwdWJsaWMgKi8KKyAgZ2ludDMyICgqcmVhZCkgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlKSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Cit9OworCitHVHlwZSB0aHJpZnRfc3RydWN0X2dldF90eXBlICh2b2lkKTsKKworZ2ludDMyIHRocmlmdF9zdHJ1Y3RfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiM2U5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVCwKKyAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCisgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRQorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCwgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5pc19vcGVuICh0LT50cmFuc3BvcnQpOworfQorCisvKiBvdmVycmlkZXMgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuICh0LT5yX2J1Zi0+bGVuID4gMCkgfHwgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPm9wZW4gKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5jbG9zZSAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIHRoZSBhY3R1YWwgcmVhZCBpcyAic2xvdyIgYmVjYXVzZSBpdCBjYWxscyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgKi8KK2dpbnQzMgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX3Nsb3cgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQzMiB3YW50ID0gbGVuOworICBndWludDMyIGdvdCA9IDA7CisgIGd1Y2hhciAqdG1wZGF0YSA9IGdfYWxsb2NhIChsZW4pOworICBndWludDMyIGhhdmUgPSB0LT5yX2J1Zi0+bGVuOworCisgIC8qIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQgKi8KKyAgZ19hc3NlcnQgKHQtPnJfYnVmLT5sZW4gPCB3YW50KTsKKworICAvKiBmaXJzdCBjb3B5IHdoYXQgd2UgaGF2ZSBpbiBvdXIgYnVmZmVyLiAqLworICBpZiAoaGF2ZSA+IDApCisgIHsKKyAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYsIHQtPnJfYnVmLT5sZW4pOworICAgIHdhbnQgLT0gdC0+cl9idWYtPmxlbjsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCB0LT5yX2J1Zi0+bGVuKTsKKyAgfQorCisgIC8qIGlmIHRoZSBidWZmZXIgaXMgc3RpbGwgc21hbGxlciB0aGFuIHdoYXQgd2Ugd2FudCB0byByZWFkLCB0aGVuIGp1c3QKKyAgICogcmVhZCBpdCBkaXJlY3RseS4gIG90aGVyd2lzZSwgZmlsbCB0aGUgYnVmZmVyIGFuZCB0aGVuIGdpdmUgb3V0CisgICAqIGVub3VnaCB0byBzYXRpc2Z5IHRoZSByZWFkLiAqLworICBpZiAodC0+cl9idWZfc2l6ZSA8IHdhbnQpCisgIHsKKyAgICBpZiAoKHJldCA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBnb3QgKz0gcmV0OworCisgICAgLyogY29weSB0aGUgZGF0YSBzdGFydGluZyBmcm9tIHdoZXJlIHdlIGxlZnQgb2ZmICovCisgICAgbWVtY3B5ICgoZ3VpbnQ4ICopYnVmICsgaGF2ZSwgdG1wZGF0YSwgZ290KTsKKyAgICByZXR1cm4gZ290ICsgaGF2ZTsgCisgIH0gZWxzZSB7CisgICAgZ3VpbnQzMiBnaXZlOworCisgICAgaWYgKChyZXQgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+cmVhZCAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZ290ICs9IHJldDsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPnJfYnVmLCB0bXBkYXRhLCBnb3QpOworICAgIAorICAgIC8qIGhhbmQgb3ZlciB3aGF0IHdlIGhhdmUgdXAgdG8gd2hhdCB0aGUgY2FsbGVyIHdhbnRzICovCisgICAgZ2l2ZSA9IHdhbnQgPCB0LT5yX2J1Zi0+bGVuID8gd2FudCA6IHQtPnJfYnVmLT5sZW47CisKKworICAgIG1lbWNweSAoKGd1aW50OCAqKWJ1ZiArIGxlbiAtIHdhbnQsIHQtPnJfYnVmLT5kYXRhLCBnaXZlKTsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCBnaXZlKTsKKyAgICB3YW50IC09IGdpdmU7CisKKyAgICByZXR1cm4gKGxlbiAtIHdhbnQpOworICB9Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyAgLyogaWYgd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIGRhdGEgdG8gZnVsZmlsbCB0aGUgcmVhZCwganVzdCB1c2UKKyAgICogYSBtZW1jcHkgKi8KKyAgaWYgKGxlbiA8PSB0LT5yX2J1Zi0+bGVuKQorICB7CisgICAgbWVtY3B5IChidWYsIHQtPnJfYnVmLT5kYXRhLCBsZW4pOworICAgIGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCBsZW4pOworICAgIHJldHVybiBsZW47CisgIH0KKworICByZXR1cm4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgZ3VpbnQzMiBoYXZlX2J5dGVzID0gdC0+d19idWYtPmxlbjsKKyAgZ3VpbnQzMiBzcGFjZSA9IHQtPndfYnVmX3NpemUgLSB0LT53X2J1Zi0+bGVuOworCisgIC8qIHdlIG5lZWQgdHdvIHN5c2NhbGxzIGJlY2F1c2UgdGhlIGJ1ZmZlcmVkIGRhdGEgcGx1cyB0aGUgYnVmZmVyIGl0c2VsZgorICAgKiBpcyB0b28gYmlnLiAqLworICBpZiAoKGhhdmVfYnl0ZXMgKyBsZW4gPj0gMip0LT53X2J1Zl9zaXplKSB8fCAoaGF2ZV9ieXRlcyA9PSAwKSkKKyAgeworICAgIGlmIChoYXZlX2J5dGVzID4gMCkKKyAgICB7CisgICAgICBpZiAoIVRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIGhhdmVfYnl0ZXMpOworICAgIH0KKyAgICBpZiAoIVRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGxlbiwgZXJyb3IpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisKKyAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBzcGFjZSk7CisgIGlmICghVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCB0LT53X2J1Zi0+bGVuKTsKKyAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgKGd1aW50OCAqKWJ1ZiArIHNwYWNlLCBsZW4tc3BhY2UpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIC8qIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYnVmZmVyIHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBiZWluZyByZWFkICovCisgIGlmICh0LT53X2J1Zi0+bGVuICsgbGVuIDw9IHQtPndfYnVmX3NpemUpCisgIHsKKyAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIGxlbik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIHJldHVybiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIGlmICh0LT53X2J1ZiAhPSBOVUxMICYmIHQtPndfYnVmLT5sZW4gPiAwKQorICB7CisgICAgLyogd3JpdGUgdGhlIGJ1ZmZlciBhbmQgdGhlbiBlbXB0eSBpdCAqLworICAgIGlmICghVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7CisgIH0KKyAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmZsdXNoICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2luaXQgKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gTlVMTDsKKyAgdHJhbnNwb3J0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7CisgIHRyYW5zcG9ydC0+d19idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBpZiAodHJhbnNwb3J0LT5yX2J1ZiAhPSBOVUxMKQorICB7CisgICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+cl9idWYsIFRSVUUpOworICB9CisgIHRyYW5zcG9ydC0+cl9idWYgPSBOVUxMOworCisgIGlmICh0cmFuc3BvcnQtPndfYnVmICE9IE5VTEwpCisgIHsKKyAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT53X2J1ZiwgVFJVRSk7CisgIH0KKyAgdHJhbnNwb3J0LT53X2J1ZiA9IE5VTEw7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgdHJhbnNwb3J0LT50cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPnJfYnVmX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT53X2J1Zl9zaXplKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQ6CisgICAgICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKKyAgICAgIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFOgorICAgICAgdHJhbnNwb3J0LT53X2J1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0cmFuc3BvcnQiLCAidHJhbnNwb3J0IChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgdHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInJfYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkIGJ1ZmZlciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoIndfYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgd3JpdGUgYnVmZmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW47CisgIHR0Yy0+cGVlayA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcGVlazsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzN2Y0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaAorICogIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBidWZmZXJlZCB0cmFuc3BvcnQuICBTdWJjbGFzc2VzCisgKiAgICAgICAgIHRoZSBUaHJpZnRUcmFuc3BvcnQgY2xhc3MuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19CVUZGRVJFRF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQ7CisKKy8qIQorICogVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Cit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworCisgIC8qIHByaXZhdGUgKi8KKyAgR0J5dGVBcnJheSAqcl9idWY7CisgIEdCeXRlQXJyYXkgKndfYnVmOworICBndWludDMyIHJfYnVmX3NpemU7CisgIGd1aW50MzIgd19idWZfc2l6ZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjA1MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKQorCisvKiBXcmFwcyBhIHRyYW5zcG9ydCB3aXRoIGEgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQuICovCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKKworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9pbml0IChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgKnNlbGYpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnlDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyAqYmFzZV9jbGFzcyA9CisgICAgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTIChrbGFzcyk7CisKKyAgYmFzZV9jbGFzcy0+Z2V0X3RyYW5zcG9ydCA9CisgICAga2xhc3MtPmdldF90cmFuc3BvcnQgPQorICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0OworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNmNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oCisgKiAgXGJyaWVmIFdyYXBzIGEgdHJhbnNwb3J0IHdpdGggYSBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydC4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSAgICAgICAgICBcCisgICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CisKKy8qIFRocmlmdCBCdWZmZXJlZC1UcmFuc3BvcnQgRmFjdG9yeSBpbnN0YW5jZSAqLworc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3M7CisKKy8qIFRocmlmdCBCdWZmZXJlZC1UcmFuc3BvcnQgRmFjdG9yeSBjbGFzcyAqLworc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnlDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBUaHJpZnRUcmFuc3BvcnQgKigqZ2V0X3RyYW5zcG9ydCkgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWJmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliL2dzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0RkRUcmFuc3BvcnRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZECit9OworCitHX0RFRklORV9UWVBFIChUaHJpZnRGRFRyYW5zcG9ydCwgdGhyaWZ0X2ZkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIHQtPmZkID49IDAgJiYgISAoZmNudGwgKHQtPmZkLCBGX0dFVEZMKSA9PSAtMSAmJiBlcnJubyA9PSBFQkFERik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiB0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCk7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisjaWYgR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkKKyAgcmV0dXJuIGdfY2xvc2UgKHQtPmZkLCBlcnJvcik7CisjZWxzZQorICBpZiAoY2xvc2UgKHQtPmZkKSA9PSAwKSB7CisgICAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRSwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjZW5kaWYKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICBzc2l6ZV90IG47CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIG4gPSByZWFkICh0LT5mZCwgKGd1aW50OCAqKSBidWYsIGxlbik7CisgIGlmIChuID09IC0xKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1JFQ0VJVkUsCisgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBmcm9tIGZkOiAlcyIsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gbjsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RkRUcmFuc3BvcnQgKnQ7CisgIGd1aW50OCAqX2J1ZjsKKyAgZ3VpbnQzMiBfbGVuOworICBzc2l6ZV90IG47CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIF9idWYgPSAoZ3VpbnQ4ICopIGJ1ZjsKKyAgX2xlbiA9IGxlbjsKKyAgd2hpbGUgKF9sZW4gPiAwKSB7CisgICAgbiA9IHdyaXRlICh0LT5mZCwgX2J1ZiwgX2xlbik7CisgICAgaWYgKG4gPT0gLTEpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKyAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHdyaXRlIGZyb20gZmQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgX2J1ZiArPSBuOworICAgICAgX2xlbiAtPSBuOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgaWYgKGZzeW5jICh0LT5mZCkgPT0gLTEpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmbHVzaCBmZDogJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9pbml0IChUaHJpZnRGRFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICB0cmFuc3BvcnQtPmZkID0gLTE7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZEOgorICAgICAgZ192YWx1ZV9zZXRfaW50ICh2YWx1ZSwgdC0+ZmQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZEOgorICAgICAgdC0+ZmQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3M7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7CisKKyAgdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9mZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoImZkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGRlc2NyaXB0b3IgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgZmlsZSBkZXNjcmlwdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9NSU4sIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX01BWCwgLyogbWF4LCAxMDI0KjEwMjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRkRfVFJBTlNQT1JUX0ZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9mZF90cmFuc3BvcnRfaXNfb3BlbjsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmQ1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfRkRfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9GRF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgInRocmlmdF90cmFuc3BvcnQuaCIKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCisgKiAgXGJyaWVmIENsYXNzIGZvciBUaHJpZnQgZmlsZSBkZXNjcmlwdG9yIHRyYW5zcG9ydHMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUICh0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfRkRfVFJBTlNQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGRFRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19GRF9UUkFOU1BPUlQob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9GRF9UUkFOU1BPUlRfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19GRF9UUkFOU1BPUlRfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX0ZEX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGRFRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0IFRocmlmdEZEVHJhbnNwb3J0OworCitzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0Cit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQgZmQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcyBUaHJpZnRGRFRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydENsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JUICovCitHVHlwZSB0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfRkRfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDgyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCisgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRSwKKyAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRQorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRGcmFtZWRUcmFuc3BvcnQsIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmlzX29wZW4gKHQtPnRyYW5zcG9ydCk7Cit9CisKKy8qIG92ZXJyaWRlcyB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gKHQtPnJfYnVmLT5sZW4gPiAwKSB8fCB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+b3BlbiAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmNsb3NlICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogcmVhZHMgYSBmcmFtZSBhbmQgcHV0cyBpdCBpbnRvIHRoZSBidWZmZXIgKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2ZyYW1lIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgZ3VpbnQzMiBzejsKKyAgZ2ludDMyIGJ5dGVzOworICBnYm9vbGVhbiByZXN1bHQgPSBGQUxTRTsKKworICAvKiByZWFkIHRoZSBzaXplICovCisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHN6KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpID09IHNpemVvZiAoc3opKQorICB7CisgICAgZ3VjaGFyICp0bXBkYXRhOworCisgICAgc3ogPSBudG9obCAoc3opOworCisgICAgLyogY3JlYXRlIGEgYnVmZmVyIHRvIGhvbGQgdGhlIGRhdGEgYW5kIHJlYWQgdGhhdCBtdWNoIGRhdGEgKi8KKyAgICB0bXBkYXRhID0gZ19hbGxvY2EgKHN6KTsKKyAgICBieXRlcyA9IHRocmlmdF90cmFuc3BvcnRfcmVhZCAodC0+dHJhbnNwb3J0LCB0bXBkYXRhLCBzeiwgZXJyb3IpOworCisgICAgaWYgKGJ5dGVzID4gMCAmJiAoZXJyb3IgPT0gTlVMTCB8fCAqZXJyb3IgPT0gTlVMTCkpCisgICAgeworICAgICAgLyogYWRkIHRoZSBkYXRhIHRvIHRoZSBidWZmZXIgKi8KKyAgICAgIGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPnJfYnVmLCB0bXBkYXRhLCBieXRlcyk7CisKKyAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogdGhlIGFjdHVhbCByZWFkIGlzICJzbG93IiBiZWNhdXNlIGl0IGNhbGxzIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCAqLworZ2ludDMyCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX3Nsb3cgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGd1aW50MzIgd2FudCA9IGxlbjsKKyAgZ3VpbnQzMiBoYXZlID0gdC0+cl9idWYtPmxlbjsKKyAgZ2ludDMyIHJlc3VsdCA9IC0xOworCisgIC8qIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQgKi8KKyAgZ19hc3NlcnQgKHQtPnJfYnVmLT5sZW4gPCB3YW50KTsKKworICAvKiBmaXJzdCBjb3B5IHdoYXQgd2UgaGF2ZSBpbiBvdXIgYnVmZmVyLCBpZiB0aGVyZSBpcyBhbnl0aGluZyBsZWZ0ICovCisgIGlmIChoYXZlID4gMCkKKyAgeworICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1ZiwgdC0+cl9idWYtPmxlbik7CisgICAgd2FudCAtPSB0LT5yX2J1Zi0+bGVuOworICAgIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIHQtPnJfYnVmLT5sZW4pOworICB9CisKKyAgLyogcmVhZCBhIGZyYW1lIG9mIGlucHV0IGFuZCBidWZmZXIgaXQgKi8KKyAgaWYgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZnJhbWUgKHRyYW5zcG9ydCwgZXJyb3IpID09IFRSVUUpCisgIHsKKyAgICAvKiBoYW5kIG92ZXIgd2hhdCB3ZSBoYXZlIHVwIHRvIHdoYXQgdGhlIGNhbGxlciB3YW50cyAqLworICAgIGd1aW50MzIgZ2l2ZSA9IHdhbnQgPCB0LT5yX2J1Zi0+bGVuID8gd2FudCA6IHQtPnJfYnVmLT5sZW47CisKKyAgICAvKiBjb3B5IHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlciAqLworICAgIG1lbWNweSAoKGd1aW50OCAqKWJ1ZiArIGxlbiAtIHdhbnQsIHQtPnJfYnVmLT5kYXRhLCBnaXZlKTsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCBnaXZlKTsKKyAgICB3YW50IC09IGdpdmU7CisKKyAgICByZXN1bHQgPSBsZW4gLSB3YW50OworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyAgLyogaWYgd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIGRhdGEgdG8gZnVsZmlsbCB0aGUgcmVhZCwganVzdCB1c2UKKyAgICogYSBtZW1jcHkgZnJvbSB0aGUgYnVmZmVyICovCisgIGlmIChsZW4gPD0gdC0+cl9idWYtPmxlbikKKyAgeworICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1Zi0+ZGF0YSwgbGVuKTsKKyAgICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgbGVuKTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIC8qIGFwcGVuZCB0aGUgZGF0YSB0byB0aGUgYnVmZmVyIGFuZCB3ZSdyZSBkb25lICovCisgIGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIGxlbik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIC8qIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYnVmZmVyIHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBiZWluZyByZWFkICovCisgIGlmICh0LT53X2J1Zi0+bGVuICsgbGVuIDw9IHQtPndfYnVmX3NpemUpCisgIHsKKyAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIGxlbik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBnaW50MzIgc3pfaGJvLCBzel9uYm87CisgIGd1Y2hhciAqdG1wZGF0YTsKKworICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIGZyYW1lIGluIGhvc3QgYW5kIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworICBzel9oYm8gPSB0LT53X2J1Zi0+bGVuICsgc2l6ZW9mKHN6X25ibyk7CisgIHN6X25ibyA9IChnaW50MzIpIGh0b25sICgoZ3VpbnQzMikgdC0+d19idWYtPmxlbik7CisKKyAgLyogY29weSB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgYW5kIHRoZW4gdGhlIGZyYW1lIGl0c2VsZiAqLworICB0bXBkYXRhID0gZ19hbGxvY2EgKHN6X2hibyk7CisgIG1lbWNweSAodG1wZGF0YSwgKGd1aW50OCAqKSAmc3pfbmJvLCBzaXplb2YgKHN6X25ibykpOworCisgIGlmICh0LT53X2J1Zi0+bGVuID4gMCkKKyAgeworICAgIG1lbWNweSAodG1wZGF0YSArIHNpemVvZiAoc3pfbmJvKSwgdC0+d19idWYtPmRhdGEsIHQtPndfYnVmLT5sZW4pOworICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOworICB9CisgICAgCisgIC8qIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQgKi8KKyAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwgc3pfaGJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Zmx1c2ggKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IE5VTEw7CisgIHRyYW5zcG9ydC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICB0cmFuc3BvcnQtPndfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgaWYgKHRyYW5zcG9ydC0+cl9idWYgIT0gTlVMTCkKKyAgeworICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPnJfYnVmLCBUUlVFKTsKKyAgfQorICB0cmFuc3BvcnQtPnJfYnVmID0gTlVMTDsKKworICBpZiAodHJhbnNwb3J0LT53X2J1ZiAhPSBOVUxMKQorICB7CisgICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+d19idWYsIFRSVUUpOworICB9CisgIHRyYW5zcG9ydC0+d19idWYgPSBOVUxMOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgdHJhbnNwb3J0LT50cmFuc3BvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT5yX2J1Zl9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPndfYnVmX3NpemUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgorICAgICAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFOgorICAgICAgdHJhbnNwb3J0LT5yX2J1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFOgorICAgICAgdHJhbnNwb3J0LT53X2J1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidHJhbnNwb3J0IiwgInRyYW5zcG9ydCAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IHRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicl9idWZfc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHJlYWQgYnVmZmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoIndfYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgd3JpdGUgYnVmZmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuOworICB0dGMtPnBlZWsgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9wZWVrOworICB0dGMtPm9wZW4gPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQ7CisgIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKKyAgdHRjLT5mbHVzaCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjMDEyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaAorICogIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBmcmFtZWQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcworICogICAgICAgICB0aGUgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIFRocmlmdEZyYW1lZFRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydCBUaHJpZnRGcmFtZWRUcmFuc3BvcnQ7CisKKy8qIQorICogVGhyaWZ0RnJhbWVkVHJhbnNwb3J0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKworICAvKiBwcml2YXRlICovCisgIEdCeXRlQXJyYXkgKnJfYnVmOworICBHQnl0ZUFycmF5ICp3X2J1ZjsKKyAgZ3VpbnQzMiByX2J1Zl9zaXplOworICBndWludDMyIHdfYnVmX3NpemU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0RnJhbWVkVHJhbnNwb3J0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhmZTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkpCisKKy8qIFdyYXBzIGEgdHJhbnNwb3J0IHdpdGggYSBUaHJpZnRGcmFtZWRUcmFuc3BvcnQuICovCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworCisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfaW5pdCAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmJhc2VfY2xhc3MgPQorICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyAoa2xhc3MpOworCisgIGJhc2VfY2xhc3MtPmdldF90cmFuc3BvcnQgPQorICAgIGtsYXNzLT5nZXRfdHJhbnNwb3J0ID0KKyAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQ7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlOTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKKyAqICBcYnJpZWYgV3JhcHMgYSB0cmFuc3BvcnQgd2l0aCBhIFRocmlmdEZyYW1lZFRyYW5zcG9ydC4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkgICAgXAorICAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlksICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWShvYmopICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7CisKKy8qIFRocmlmdCBGcmFtZWQtVHJhbnNwb3J0IEZhY3RvcnkgaW5zdGFuY2UgKi8KK3N0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeQoreworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzOworCisvKiBUaHJpZnQgRnJhbWVkLVRyYW5zcG9ydCBGYWN0b3J5IGNsYXNzICovCitzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBUaHJpZnRUcmFuc3BvcnQgKigqZ2V0X3RyYW5zcG9ydCkgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTgxOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdE1lbW9yeUJ1ZmZlclByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUiwKKyAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUgorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRNZW1vcnlCdWZmZXIsIHRocmlmdF9tZW1vcnlfYnVmZmVyLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAodHJhbnNwb3J0KTsKKyAgZ3VpbnQzMiBnaXZlID0gbGVuOyAKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIC8qIGlmIHRoZSByZXF1ZXN0ZWQgYnl0ZXMgYXJlIG1vcmUgdGhhbiB3aGF0IHdlIGhhdmUgYXZhaWxhYmxlLAorICAgKiBqdXN0IGdpdmUgYWxsIHRoYXQgd2UgaGF2ZSB0aGUgYnVmZmVyICovCisgIGlmICh0LT5idWYtPmxlbiA8IGxlbikKKyAgeworICAgIGdpdmUgPSB0LT5idWYtPmxlbjsKKyAgfQorCisgIG1lbWNweSAoYnVmLCB0LT5idWYtPmRhdGEsIGdpdmUpOworICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5idWYsIDAsIGdpdmUpOworCisgIHJldHVybiBnaXZlOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSICh0cmFuc3BvcnQpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgLyogcmV0dXJuIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggc3BhY2UuICovCisgIGlmIChsZW4gPiB0LT5idWZfc2l6ZSAtIHQtPmJ1Zi0+bGVuKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gd3JpdGUgJWQgYnl0ZXMgdG8gYnVmZmVyIG9mIGxlbmd0aCAlZCIsCisgICAgICAgICAgICAgICAgIGxlbiwgdC0+YnVmX3NpemUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICB0LT5idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5idWYsIGJ1ZiwgbGVuKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbml0aWFsaXplcyBjbGFzcyBiZWZvcmUgY29uc3RydWN0b3IgcHJvcGVydGllcyBhcmUgc2V0ICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyICp0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodCk7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKworICBpZiAodC0+b3duZXIgJiYgdC0+YnVmICE9IE5VTEwpCisgIHsKKyAgICBnX2J5dGVfYXJyYXlfdW5yZWYgKHQtPmJ1Zik7CisgIH0KKyAgdC0+YnVmID0gTlVMTDsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9tZW1vcnlfYnVmZmVyX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRToKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0LT5idWZfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSOgorICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlciAodmFsdWUsIChncG9pbnRlcikgKHQtPmJ1ZikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSOgorICAgICAgZ192YWx1ZV9zZXRfYm9vbGVhbiAodmFsdWUsIHQtPm93bmVyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9tZW1vcnlfYnVmZmVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRToKKyAgICAgIHQtPmJ1Zl9zaXplID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUjoKKyAgICAgIHQtPmJ1ZiA9IChHQnl0ZUFycmF5KikgZ192YWx1ZV9nZXRfcG9pbnRlciAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSOgorICAgICAgdC0+b3duZXIgPSBnX3ZhbHVlX2dldF9ib29sZWFuICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyBjbGFzcyBhZnRlciBjb25zdHJ1Y3RvciBwcm9wZXJ0aWVzIGFyZSBzZXQgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jb25zdHJ1Y3RlZCAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKworICBpZiAodC0+YnVmID09IE5VTEwpIHsKKyAgICB0LT5idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICB9CisKKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3BhcmVudF9jbGFzcyktPmNvbnN0cnVjdGVkIChvYmplY3QpOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzc19pbml0IChUaHJpZnRNZW1vcnlCdWZmZXJDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgiYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZC93cml0ZSBidWZmZXIgc2l6ZSBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhVSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYVUlOVDMyLCAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3BvaW50ZXIgKCJidWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBidWZmZXIgKEdCeXRlQXJyYXkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBpbnRlcm5hbCBidWZmZXIgKEdCeXRlQXJyYXkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJvd25lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGJ1ZmZlciBtZW1vcnkgbWFuYWdlbWVudCBwb2xpY3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgd2hldGhlciBpbnRlcm5hbCBidWZmZXIgc2hvdWxkIGJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB1bnJlZmVyZW5jZWQgd2hlbiB0aHJpZnRfbWVtb3J5X2J1ZmZlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgZmluYWxpemVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+Y29uc3RydWN0ZWQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jb25zdHJ1Y3RlZDsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbjsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDQ3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX01FTU9SWV9CVUZGRVJfSAorI2RlZmluZSBfVEhSSUZUX01FTU9SWV9CVUZGRVJfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9tZW1vcnlfYnVmZmVyLmgKKyAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgbWVtb3J5IGJ1ZmZlciB0cmFuc3BvcnQuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiAodGhyaWZ0X21lbW9yeV9idWZmZXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9NRU1PUllfQlVGRkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgVGhyaWZ0TWVtb3J5QnVmZmVyKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01FTU9SWV9CVUZGRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSKSkKKyNkZWZpbmUgVEhSSUZUX01FTU9SWV9CVUZGRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01FTU9SWV9CVUZGRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIpCisjZGVmaW5lIFRIUklGVF9NRU1PUllfQlVGRkVSX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TWVtb3J5QnVmZmVyIFRocmlmdE1lbW9yeUJ1ZmZlcjsKKworLyohCisgKiBUaHJpZnRNZW1vcnlCdWZmZXIgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TWVtb3J5QnVmZmVyCit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBHQnl0ZUFycmF5ICpidWY7CisgIGd1aW50MzIgYnVmX3NpemU7CisgIGdib29sZWFuIG93bmVyOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlckNsYXNzIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzOworCisvKiEKKyAqIFRocmlmdE1lbW9yeUJ1ZmZlciBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXJDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIgKi8KK0dUeXBlIHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlNjBmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBjbGFuZy1mb3JtYXQgb2ZmICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisjICBkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisKKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA6OldTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgVEhSSUZUX0VSUk5PICgqX2Vycm5vKCkpCisjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjICBkZWZpbmUgVEhSSUZUX0VBR0FJTiBXU0FFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FSU5UUiBXU0FFSU5UUgorIyAgZGVmaW5lIFRIUklGVF9FQ09OTlJFU0VUIFdTQUVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfRU5PVENPTk4gV1NBRU5PVENPTk4KKyMgIGRlZmluZSBUSFJJRlRfRVRJTUVET1VUIFdTQUVUSU1FRE9VVAorIyAgZGVmaW5lIFRIUklGVF9FV09VTERCTE9DSyBXU0FFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FUElQRSBXU0FFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIFNPX0VYQ0xVU0lWRUFERFJVU0UKKyMgIGRlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgSU5WQUxJRF9TT0NLRVQKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiB0aHJpZnRfc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCB0aHJpZnRfZmNudGwKKyMgIGRlZmluZSBUSFJJRlRfT19OT05CTE9DSyAxCisjICBkZWZpbmUgVEhSSUZUX0ZfR0VURkwgMAorIyAgZGVmaW5lIFRIUklGVF9GX1NFVEZMIDEKKyMgIGRlZmluZSBUSFJJRlRfR0VUVElNRU9GREFZIHRocmlmdF9nZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2Vzb2NrZXQKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgX2Nsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gX29wZW4KKyMgIGRlZmluZSBUSFJJRlRfRlRSVU5DQVRFIF9jaHNpemVfcworIyAgZGVmaW5lIFRIUklGVF9GU1lOQyBfY29tbWl0CisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIF9sc2VlaworIyAgZGVmaW5lIFRIUklGVF9XUklURSBfd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCBfcmVhZAorIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBfZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfU1RBVCBfc3RhdAorIyAgaWZkZWYgX1dJTjMyX1dDRQorIyAgICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiguLi4pIHRocmlmdF93c3RyMnN0cihnYWlfc3RyZXJyb3JXKF9fVkFfQVJHU19fKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yQQorIyAgZW5kaWYKKyMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHB0cmRpZmZfdAorIyAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBfc25wcmludGYKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfU0VDIHRocmlmdF9zbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHRocmlmdF91c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGhyaWZ0X3RpbWVzcGVjCisjICBkZWZpbmUgVEhSSUZUX0NUSU1FX1IgdGhyaWZ0X2N0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCB0aHJpZnRfcG9sbAorIyAgaWYgV0lOVkVSIDw9IDB4MDUwMiAvKiBYUCwgU2VydmVyMjAwMyAqLworIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgdGhyaWZ0X3BvbGxmZAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgMHgwMzAwCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCAweDAwMTAKKyMgIGVsc2UgLyogVmlzdGEsIFdpbjcuLi4gKi8KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHBvbGxmZAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgUE9MTElOCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCBQT0xMT1VUCisjICBlbmRpZiAvKiBXSU5WRVIgKi8KKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNEX0JPVEgKKyNlbHNlIC8qIG5vdCBfV0lOMzIgKi8KKyMgIGluY2x1ZGUgPGVycm5vLmg+CisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgICAgICAgRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCAgRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiAgICBFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgICBFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOICAgICAgRUFHQUlOCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFICAgICAgIEVQSVBFCisjICBkZWZpbmUgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIFNPX1JFVVNFQUREUgorIyAgZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCAoLTEpCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCBmY250bAorIyAgZGVmaW5lIFRIUklGVF9PX05PTkJMT0NLIE9fTk9OQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRl9HRVRGTCBGX0dFVEZMCisjICBkZWZpbmUgVEhSSUZUX0ZfU0VURkwgRl9TRVRGTAorIyAgZGVmaW5lIFRIUklGVF9HRVRUSU1FT0ZEQVkgZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gb3BlbgorIyAgZGVmaW5lIFRIUklGVF9GVFJVTkNBVEUgZnRydW5jYXRlCisjICBkZWZpbmUgVEhSSUZUX0ZTWU5DIGZzeW5jCisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIGxzZWVrCisjICBkZWZpbmUgVEhSSUZUX1dSSVRFIHdyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgcmVhZAorIyAgZGVmaW5lIFRIUklGVF9TVEFUIHN0YXQKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvcgorIyAgZGVmaW5lIFRIUklGVF9TU0laRVQgc3NpemVfdAorIyAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBzbnByaW50ZgorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB1c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGltZXNwZWMKKyMgIGRlZmluZSBUSFJJRlRfQ1RJTUVfUiBjdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgcG9sbAorIyAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHBvbGxmZAorIyAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNIVVRfUkRXUgorI2VuZGlmCisKKyNlbmRpZiAvKiBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTg5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRTZXJ2ZXJTb2NrZXRQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JULAorICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0cKK307CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfRE9NQUlOICJ0aHJpZnQtc2VydmVyLXNvY2tldC1lcnJvci1xdWFyayIKKworR19ERUZJTkVfVFlQRShUaHJpZnRTZXJ2ZXJTb2NrZXQsIHRocmlmdF9zZXJ2ZXJfc29ja2V0LCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKQorCitnYm9vbGVhbgordGhyaWZ0X3NlcnZlcl9zb2NrZXRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGludCBlbmFibGVkID0gMTsgLyogZm9yIHNldHNvY2tvcHQoKSAqLworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGluOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICAvKiBjcmVhdGUgYSBhZGRyZXNzIHN0cnVjdHVyZSAqLworICBtZW1zZXQgKCZwaW4sIDAsIHNpemVvZihwaW4pKTsKKyAgcGluLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBwaW4uc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgcGluLnNpbl9wb3J0ID0gaHRvbnModHNvY2tldC0+cG9ydCk7CisKKyAgLyogY3JlYXRlIGEgc29ja2V0ICovCisgIGlmICgodHNvY2tldC0+c2QgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY3JlYXRlIHNvY2tldCAtICVzIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHNldHNvY2tvcHQodHNvY2tldC0+c2QsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJmVuYWJsZWQsCisgICAgICAgICAgICAgICAgIHNpemVvZihlbmFibGVkKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TRVRTT0NLT1BULAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHNldCBTT19SRVVTRUFERFIgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogYmluZCB0byB0aGUgc29ja2V0ICovCisgIGlmIChiaW5kKHRzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyICopICZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0JJTkQsCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gYmluZCB0byBwb3J0ICVkIC0gJXMiLAorICAgICAgICAgICAgICAgICB0c29ja2V0LT5wb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChsaXN0ZW4odHNvY2tldC0+c2QsIHRzb2NrZXQtPmJhY2tsb2cpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfTElTVEVOLAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGxpc3RlbiB0byBwb3J0ICVkIC0gJXMiLAorICAgICAgICAgICAgICAgICB0c29ja2V0LT5wb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X3NlcnZlcl9zb2NrZXRfYWNjZXB0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGludCBzZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgZ3VpbnQgYWRkcmxlbiA9IDA7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyZXNzOworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IE5VTEw7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYgKChzZCA9IGFjY2VwdCh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmVzcywgJmFkZHJsZW4pKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0FDQ0VQVCwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBhY2NlcHQgY29ubmVjdGlvbiAtICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgTlVMTCk7CisgIHNvY2tldC0+c2QgPSBzZDsKKworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVChzb2NrZXQpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xvc2UgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYgKGNsb3NlICh0c29ja2V0LT5zZCkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9DTE9TRSwKKyAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBjbG9zZSBzb2NrZXQgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHRzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIHRoaXMgaW1wbGVtZW50YXRpb24gKi8KK0dRdWFyawordGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyhUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9ET01BSU4pOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9pbml0IChUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCkKK3sKKyAgc29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdFNlcnZlclNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKG9iamVjdCk7CisKKyAgaWYgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKQorICB7CisgICAgY2xvc2UgKHNvY2tldC0+c2QpOworICB9CisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzb2NrZXQtPnBvcnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0c6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5iYWNrbG9nKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNlcnZlclNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JUOgorICAgICAgc29ja2V0LT5wb3J0ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0c6CisgICAgICBzb2NrZXQtPmJhY2tsb2cgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcyAqY2xzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyAqdHN0YyA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCB0byBsaXN0ZW4gdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkwLCAvKiBkZWZhdWx0IGJ5IGNvbnZlbnRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgiYmFja2xvZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tsb2cgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGFjY2VwdCBiYWNrbG9nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNCwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2ZpbmFsaXplOworCisgIHRzdGMtPmxpc3RlbiA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2xpc3RlbjsKKyAgdHN0Yy0+YWNjZXB0ID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfYWNjZXB0OworICB0c3RjLT5jbG9zZSA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2Nsb3NlOworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA0OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfU09DS0VUX0gKKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfU09DS0VUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc2VydmVyX3NvY2tldC5oCisgKiAgXGJyaWVmIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0LiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0IGNsYXNzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQgKHRocmlmdF9zZXJ2ZXJfc29ja2V0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsIFRocmlmdFNlcnZlclNvY2tldCkpCisjZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXQgVGhyaWZ0U2VydmVyU29ja2V0OworCisvKiEKKyAqIFRocmlmdCBTZXJ2ZXJTb2NrZXQgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U2VydmVyU29ja2V0Cit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBndWludCBwb3J0OworICBnc2hvcnQgYmFja2xvZzsKKyAgaW50IHNkOworICBndWludDggKmJ1ZjsKKyAgZ3VpbnQzMiBidWZfc2l6ZTsKKyAgZ3VpbnQzMiBidWZfbGVuOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldENsYXNzIFRocmlmdFNlcnZlclNvY2tldENsYXNzOworCisvKiEKKyAqIFRocmlmdCBTZXJ2ZXJTb2NrZXQgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUICovCitHVHlwZSB0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TT0NLRVQsCisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NFVFNPQ0tPUFQsCisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0JJTkQsCisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0xJU1RFTiwKKyAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQUNDRVBULAorICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9DTE9TRQorfSBUaHJpZnRTZXJ2ZXJTb2NrZXRFcnJvcjsKKworLyogZGVmaW5lIGEgZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgdG8gdXNlICovCitHUXVhcmsgdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKHZvaWQpOworI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiAodGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKCkpCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1ZDEzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQsIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LCBHX1RZUEVfT0JKRUNUKQorCisvKiBiYXNlIGluaXRpYWxpemVyIGZvciB0aGUgc2VydmVyIHRyYW5zcG9ydCBpbnRlcmZhY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcyAqYykKK3sKKyAgYy0+bGlzdGVuID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuOworICBjLT5hY2NlcHQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQ7CisgIGMtPmNsb3NlID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfY2xvc2U7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9pbml0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+bGlzdGVuICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmFjY2VwdCAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmNsb3NlICh0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE5MTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfdHJhbnNwb3J0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgKKyAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0cy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUICh0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0IFRocmlmdFNlcnZlclRyYW5zcG9ydDsKKworc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnQKK3sKKyAgR09iamVjdCBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFRyYW5zcG9ydCBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIGdib29sZWFuICgqbGlzdGVuKSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgVGhyaWZ0VHJhbnNwb3J0ICooKmFjY2VwdCkgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqY2xvc2UpIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUICovCitHVHlwZSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIQorICogTGlzdGVuIGZvciBuZXcgY29ubmVjdGlvbnMuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQWNjZXB0IGEgY29ubmVjdGlvbi4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCisgKi8KK1RocmlmdFRyYW5zcG9ydCAqdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0CisgICAgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDBmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0U29ja2V0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRSwKKyAgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U29ja2V0LCB0aHJpZnRfc29ja2V0LCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICByZXR1cm4gc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIG92ZXJyaWRlcyB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmVzdWx0ID0gRkFMU0U7CisgIGd1aW50OCBidWY7CisgIGludCByOworICBpbnQgZXJybm9fY29weTsKKworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSkKKyAgeworICAgIHIgPSByZWN2IChzb2NrZXQtPnNkLCAmYnVmLCAxLCBNU0dfUEVFSyk7CisgICAgaWYgKHIgPT0gLTEpCisgICAgeworICAgICAgZXJybm9fY29weSA9IGVycm5vOworCisgICAgICAjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fTUFDSF9fCisgICAgICAvKiBGcmVlQlNEIHJldHVybnMgLTEgYW5kIEVDT05OUkVTRVQgaWYgdGhlIHNvY2tldCB3YXMgY2xvc2VkIGJ5IHRoZSBvdGhlcgorICAgICAgICAgc2lkZSAqLworICAgICAgaWYgKGVycm5vX2NvcHkgPT0gRUNPTk5SRVNFVCkKKyAgICAgIHsKKyAgICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBlcnJvcik7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAjZW5kaWYKKworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBwZWVrIGF0IHNvY2tldCAtICVzIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm9fY29weSkpOworCisgICAgICAjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fTUFDSF9fCisgICAgICB9CisgICAgICAjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZiAociA+IDApCisgICAgeworICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmIChjbG9zZSAoc29ja2V0LT5zZCkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCisgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IC0gJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGluOworICBpbnQgZXJyOworI2lmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1IpCisgIHN0cnVjdCBob3N0ZW50IGhlOworICBjaGFyIGJ1ZlsxMDI0XTsKKyNlbmRpZgorCisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0c29ja2V0LT5zZCA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQsIEZBTFNFKTsKKworICAvKiBsb29rdXAgdGhlIGRlc3RpbmF0aW9uIGhvc3QgKi8KKyNpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorICBpZiAoZ2V0aG9zdGJ5bmFtZV9yICh0c29ja2V0LT5ob3N0bmFtZSwgJmhlLCBidWYsIDEwMjQsICZocCwgJmVycikgIT0gMCB8fCBocCA9PSBOVUxMKQorI2Vsc2UKKyAgaWYgKChocCA9IGdldGhvc3RieW5hbWUgKHRzb2NrZXQtPmhvc3RuYW1lKSkgPT0gTlVMTCAmJiAoZXJyID0gaF9lcnJubykpCisjZW5kaWYKKyAgeworICAgIC8qIGhvc3QgbG9va3VwIGZhaWxlZCwgYmFpbCBvdXQgd2l0aCBhbiBlcnJvciAqLworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9IT1NULAorICAgICAgICAgICAgICAgICAiaG9zdCBsb29rdXAgZmFpbGVkIGZvciAlczolZCAtICVzIiwKKyAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsCisgICAgICAgICAgICAgICAgIGhzdHJlcnJvciAoZXJyKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLworICBtZW1zZXQgKCZwaW4sIDAsIHNpemVvZihwaW4pKTsKKyAgcGluLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBwaW4uc2luX2FkZHIuc19hZGRyID0gKChzdHJ1Y3QgaW5fYWRkciAqKSAoaHAtPmhfYWRkcl9saXN0WzBdKSktPnNfYWRkcjsKKyAgcGluLnNpbl9wb3J0ID0gaHRvbnMgKHRzb2NrZXQtPnBvcnQpOworCisgIC8qIGNyZWF0ZSB0aGUgc29ja2V0ICovCisgIGlmICgodHNvY2tldC0+c2QgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU09DS0VULAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgZm9yIGhvc3QgJXM6JWQgLSAlcyIsCisgICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCisgIGlmIChjb25uZWN0ICh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcGluLCBzaXplb2YocGluKSkgPT0gLTEpCisgIHsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UodHNvY2tldCwgTlVMTCk7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjb25uZWN0IHRvIGhvc3QgJXM6JWQgLSAlcyIsCisgICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9zb2NrZXRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBnaW50IHJldCA9IDA7CisgIGd1aW50IGdvdCA9IDA7CisKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworCisgIHdoaWxlIChnb3QgPCBsZW4pCisgIHsKKyAgICByZXQgPSByZWN2IChzb2NrZXQtPnNkLCAoZ3VpbnQ4ICopYnVmICsgZ290LCBsZW4tZ290LCAwKTsKKyAgICBpZiAocmV0IDw9IDApCisgICAgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfUkVDRUlWRSwKKyAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgLSAlcyIsIGxlbiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZ290ICs9IHJldDsKKyAgfQorCisgIHJldHVybiBnb3Q7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludCByZXQgPSAwOworICBndWludCBzZW50ID0gMDsKKworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCwgRkFMU0UpOworCisgIHdoaWxlIChzZW50IDwgbGVuKQorICB7CisgICAgcmV0ID0gc2VuZCAoc29ja2V0LT5zZCwgKGd1aW50OCAqKWJ1ZiArIHNlbnQsIGxlbiAtIHNlbnQsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZW5kICVkIGJ5dGVzIC0gJXMiLCBsZW4sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHNlbnQgKz0gcmV0OworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2gKKyAqIGZsdXNoIHBlbmRpbmcgZGF0YS4gIHNpbmNlIHdlIGFyZSBub3QgYnVmZmVyZWQsIHRoaXMgaXMgYSBuby1vcCAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfaW5pdCAoVGhyaWZ0U29ja2V0ICpzb2NrZXQpCit7CisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAob2JqZWN0KTsKKworICBpZiAoc29ja2V0LT5ob3N0bmFtZSAhPSBOVUxMKQorICB7CisgICAgZ19mcmVlIChzb2NrZXQtPmhvc3RuYW1lKTsKKyAgfQorICBzb2NrZXQtPmhvc3RuYW1lID0gTlVMTDsKKworICBpZiAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpCisgIHsKKyAgICBjbG9zZSAoc29ja2V0LT5zZCk7CisgIH0KKyAgc29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUU6CisgICAgICBnX3ZhbHVlX3NldF9zdHJpbmcgKHZhbHVlLCBzb2NrZXQtPmhvc3RuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5wb3J0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9zb2NrZXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUU6CisgICAgICBpZiAoc29ja2V0LT5ob3N0bmFtZSkgeworICAgICAgICBnX2ZyZWUoc29ja2V0LT5ob3N0bmFtZSk7CisgICAgICB9CisgICAgICBzb2NrZXQtPmhvc3RuYW1lID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQ6CisgICAgICBzb2NrZXQtPnBvcnQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X2NsYXNzX2luaXQgKFRocmlmdFNvY2tldENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc29ja2V0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19zdHJpbmcgKCJob3N0bmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgaG9zdG5hbWUgb2YgdGhlIHJlbW90ZSBob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbGhvc3QiLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCBvZiB0aGUgcmVtb3RlIGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNXUsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwOTAsIC8qIGRlZmF1bHQgYnkgY29udmVudGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NvY2tldF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X3NvY2tldF9pc19vcGVuOworICB0dGMtPnBlZWsgPSB0aHJpZnRfc29ja2V0X3BlZWs7CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9zb2NrZXRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9zb2NrZXRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9zb2NrZXRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9zb2NrZXRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfc29ja2V0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9zb2NrZXRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X3NvY2tldF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZmNjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NPQ0tFVF9ICisjZGVmaW5lIF9USFJJRlRfU09DS0VUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zb2NrZXQuaAorICogIFxicmllZiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcyB0aGUKKyAqICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NPQ0tFVCAodGhyaWZ0X3NvY2tldF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU09DS0VUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU09DS0VULCBUaHJpZnRTb2NrZXRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTb2NrZXQgVGhyaWZ0U29ja2V0OworCisvKiEKKyAqIFRocmlmdCBTb2NrZXQgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U29ja2V0Cit7CisgIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBnY2hhciAqaG9zdG5hbWU7CisgIGd1aW50IHBvcnQ7CisgIGludCBzZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTb2NrZXRDbGFzcyBUaHJpZnRTb2NrZXRDbGFzczsKKworLyohCisgKiBUaHJpZnQgU29ja2V0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFNvY2tldENsYXNzCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU09DS0VUICovCitHVHlwZSB0aHJpZnRfc29ja2V0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTU1NDA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYwpAQCAtMCwwICsxLDgwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oPgorCisKKyNpZiBkZWZpbmVkKFdJTjMyKQorI2RlZmluZSBNVVRFWF9UWVBFICAgICAgICAgICAgSEFORExFCisjZGVmaW5lIE1VVEVYX1NFVFVQKHgpICAgICAgICAoeCkgPSBDcmVhdGVNdXRleChOVUxMLCBGQUxTRSwgTlVMTCkKKyNkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KSAgICAgIENsb3NlSGFuZGxlKHgpCisjZGVmaW5lIE1VVEVYX0xPQ0soeCkgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KCh4KSwgSU5GSU5JVEUpCisjZGVmaW5lIE1VVEVYX1VOTE9DSyh4KSAgICAgICBSZWxlYXNlTXV0ZXgoeCkKKyNlbHNlCisjZGVmaW5lIE1VVEVYX1RZUEUgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QKKyNkZWZpbmUgTVVURVhfU0VUVVAoeCkgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmKHgpLCBOVUxMKQorI2RlZmluZSBNVVRFWF9DTEVBTlVQKHgpICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCYoeCkpCisjZGVmaW5lIE1VVEVYX0xPQ0soeCkgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJih4KSkKKyNkZWZpbmUgTVVURVhfVU5MT0NLKHgpICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYoeCkpCisjZW5kaWYKKworI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEIDB4MTAwMDAwMDBMCisKKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdFNTTFNvY2tldFByb3BlcnRpZXMKK3sKKyAgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhUID0gMywKKyAgUFJPUF9USFJJRlRfU1NMX1NFTEZfU0lHTkVECit9OworCisvKiBUbyBob2xkIGEgZ2xvYmFsIHN0YXRlIG1hbmFnZW1lbnQgb2Ygb3BlbnNzbCBmb3IgYWxsIGluc3RhbmNlcyAqLworc3RhdGljIGdib29sZWFuIHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQ9RkFMU0U7CisvKiBUaGlzIGFycmF5IHdpbGwgc3RvcmUgYWxsIG9mIHRoZSBtdXRleGVzIGF2YWlsYWJsZSB0byBPcGVuU1NMLiAqLworc3RhdGljIE1VVEVYX1RZUEUgKnRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWY9TlVMTDsKKworCisvKioKKyAqIE9wZW5TU0wgdW5pcSBpZCBmdW5jdGlvbi4KKyAqCisgKiBAcmV0dXJuICAgIHRocmVhZCBpZAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfaWRfZnVuY3Rpb24odm9pZCkKK3sKKyNpZiBkZWZpbmVkKFdJTjMyKQorICByZXR1cm4gR2V0Q3VycmVudFRocmVhZElkKCk7CisjZWxzZQorICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKSBwdGhyZWFkX3NlbGYoKSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2xvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsIGludCBuLCBjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBpZiAobW9kZSAmIENSWVBUT19MT0NLKQorICAgIE1VVEVYX0xPQ0sodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltuXSk7CisgIGVsc2UKKyAgICBNVVRFWF9VTkxPQ0sodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltuXSk7Cit9CisKK3N0YXRpYyBpbnQgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9zZXR1cCh2b2lkKQoreworICBpbnQgaTsKKworICB0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmID0gbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZihNVVRFWF9UWVBFKSk7CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZikKKyAgICByZXR1cm4gMDsKKyAgZm9yIChpID0gMDsgIGkgPCBDUllQVE9fbnVtX2xvY2tzKCAgKTsgIGkrKykKKyAgICBNVVRFWF9TRVRVUCh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW2ldKTsKKyAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfaWRfZnVuY3Rpb24pOworICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2xvY2tpbmdfY2FsbGJhY2spOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX2NsZWFudXAodm9pZCkKK3sKKyAgaW50IGk7CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZikKKyAgICByZXR1cm4gMDsKKyAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworICBmb3IgKGkgPSAwOyAgaSA8IENSWVBUT19udW1fbG9ja3MoICApOyAgaSsrKQorICAgIE1VVEVYX0NMRUFOVVAodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltpXSk7CisgIGZyZWUodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1Zik7CisgIHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYgPSBOVUxMOworICByZXR1cm4gMTsKK30KKworLyoKK3N0YXRpYyB2b2lkKiB0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19jcmVhdGVfY2FsbGJhY2soY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgZ19wcmludCgiV2Ugc2hvdWxkIGNyZWF0ZSBhIGxvY2tcbiIpOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY2FsbGJhY2soaW50IG1vZGUsIHZvaWQqIGxvY2ssIGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGlmIChsb2NrICE9IE5VTEwpIHsKKyAgICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgICBnX3ByaW50ZigiV2Ugc2hvdWxkIGxvY2sgdGhyZWFkICVkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZ19wcmludGYoIldlIHNob3VsZCB1bmxvY2sgdGhyZWFkICVkXG4iKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfZGVzdHJveV9jYWxsYmFjayh2b2lkKiBsb2NrLCBjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBnX3ByaW50ZigiV2UgbXVzdCBkZXN0cm95IHRoZSBsb2NrXG4iKTsKK30KKyAqLworCisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U1NMU29ja2V0LCB0aHJpZnRfc3NsX3NvY2tldCwgVEhSSUZUX1RZUEVfU09DS0VUKQorCisKKworLyoqCisgKiBXaGVuIHRoZXJlJ3MgYSB0aHJlYWQgY29udGV4dCBhdHRhY2hlZCwgd2UgcGFzcyB0aGUgU1NMIHNvY2tldCBjb250ZXh0IHNvIGl0CisgKiBjYW4gY2hlY2sgaWYgdGhlIGVycm9yIGlzIG91dHNpZGUgU1NMLCBvbiBJL08gZm9yIGV4YW1wbGUKKyAqIEBwYXJhbSBzb2NrZXQKKyAqIEBwYXJhbSBlcnJvcl9tc2cKKyAqIEBwYXJhbSB0aHJpZnRfZXJyb3Jfbm8KKyAqIEBwYXJhbSBzc2xfZXJyb3IKKyAqIEBwYXJhbSBlcnJvcgorICovCitzdGF0aWMKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCwgY29uc3QgZ3VjaGFyICplcnJvcl9tc2csIGd1aW50IHRocmlmdF9lcnJvcl9ubywgaW50IHNzbF9lcnJvciwgR0Vycm9yICoqZXJyb3IpCit7CisgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKyAgY2hhciBidWZmZXJbMTAyNF07CisgIGludCBidWZmZXJfc2l6ZT0xMDI0OworICBnYm9vbGVhbiBmaXJzdF9lcnJvciA9IFRSVUU7CisgIGludCBzc2xfZXJyb3JfdHlwZSA9IFNTTF9nZXRfZXJyb3Ioc29ja2V0LT5zc2wsIHNzbF9lcnJvcik7CisgIGlmKHNzbF9lcnJvcl90eXBlPjApeworICAgICAgc3dpdGNoKHNzbF9lcnJvcl90eXBlKXsKKwljYXNlIFNTTF9FUlJPUl9TU0w6CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIlNTTCAlczogIiwgZXJyb3JfbXNnKTsKKwkgIHdoaWxlICgoZXJyb3JfY29kZSA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCAmJiBidWZmZXJfc2l6ZT4xKSB7CisJICAgICAgY29uc3QgY2hhciogcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyb3JfY29kZSk7CisJICAgICAgaWYocmVhc29uIT1OVUxMKXsKKwkJICBpZighZmlyc3RfZXJyb3IpIHsKKwkJICAgICAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiXG5cdCIpOworCQkgICAgICBmaXJzdF9lcnJvcj1GQUxTRTsKKwkJICB9CisJCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiJWxYKCVzKSAtPiAlcyIsIGVycm9yX2NvZGUsIHJlYXNvbiwgU1NMX3N0YXRlX3N0cmluZyhzb2NrZXQtPnNzbCkpOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiVzOiAiLCBlcnJvcl9tc2cpOworCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiJWxYIC0+ICVzIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiVzOiAiLCBlcnJvcl9tc2cpOworCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiJWxYIC0+ICVzIiwgc3NsX2Vycm9yX3R5cGUsICJFcnJvciB3aGlsZSByZWFkaW5nIGZyb20gdW5kZXJsYXlpbmcgbGF5ZXIiKTsKKwkgIGJyZWFrOworCWNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIiVzOiAiLCBlcnJvcl9tc2cpOworCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlcisoMTAyNC1idWZmZXJfc2l6ZSksIGJ1ZmZlcl9zaXplLCAiJWxYIC0+ICVzIiwgc3NsX2Vycm9yX3R5cGUsICJFcnJvciB3aGlsZSB3cml0dGluZyB0byB1bmRlcmxheWluZyBsYXllciIpOworCSAgYnJlYWs7CisKKyAgICAgIH0KKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgdGhyaWZ0X2Vycm9yX25vLCAiJXMiLCBidWZmZXIpOworICB9Cit9CisKKy8qKgorICogRm9yIGdsb2JhbCBTU0wgZXJyb3JzCisgKiBAcGFyYW0gZXJyb3JfbXNnCisgKiBAcGFyYW0gdGhyaWZ0X2Vycm9yX25vCisgKiBAcGFyYW0gZXJyb3IKKyAqLworc3RhdGljCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X2dldF9lcnJvcihjb25zdCBndWNoYXIgKmVycm9yX21zZywgZ3VpbnQgdGhyaWZ0X2Vycm9yX25vLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlOworICB3aGlsZSAoKGVycm9yX2NvZGUgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKKyAgICAgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGVycm9yX2NvZGUpOworICAgICAgaWYgKHJlYXNvbiA9PSBOVUxMKSB7CisJICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgICAgICB0aHJpZnRfZXJyb3Jfbm8sCisJCSAgICAgICAiU1NMIGVycm9yICVsWDogJXMiLCBlcnJvcl9jb2RlLCBlcnJvcl9tc2cpOworICAgICAgfWVsc2V7CisJICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgICAgICB0aHJpZnRfZXJyb3Jfbm8sCisJCSAgICAgICAiU1NMIGVycm9yICVsWCAlczogJXMiLCBlcnJvcl9jb2RlLHJlYXNvbiwgZXJyb3JfbXNnKTsKKyAgICAgIH0KKyAgfQorfQorCisKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIHRocmlmdF9zb2NrZXRfaXNfb3Blbih0cmFuc3BvcnQpOworfQorCisvKiBvdmVycmlkZXMgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGlmICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpKQorICAgIHsKKyAgICAgIGludCByYzsKKyAgICAgIGdjaGFyIGJ5dGU7CisgICAgICByYyA9IFNTTF9wZWVrKHNzbF9zb2NrZXQtPnNzbCwgJmJ5dGUsIDEpOworICAgICAgaWYgKHJjIDwgMCkgeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiQ2hlY2sgc29ja2V0IGRhdGEiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgcmMsIGVycm9yKTsKKyAgICAgIH0KKyAgICAgIGlmIChyYyA9PSAwKSB7CisJICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICAgIH0KKyAgICAgIHJldHZhbCA9IChyYyA+IDApOworICAgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIEVSUl9jbGVhcl9lcnJvcigpOworCisgIGlmICghdGhyaWZ0X3NvY2tldF9vcGVuKHRyYW5zcG9ydCwgZXJyb3IpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIVRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyh0cmFuc3BvcnQpLT5oYW5kbGVfaGFuZHNoYWtlKHRyYW5zcG9ydCwgZXJyb3IpKSB7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCh0cmFuc3BvcnQpOworICBpZihzc2xfc29ja2V0IT1OVUxMICYmIHNzbF9zb2NrZXQtPnNzbCkgeworICAgICAgaW50IHJjID0gU1NMX3NodXRkb3duKHNzbF9zb2NrZXQtPnNzbCk7CisvKiAgICAgIGlmIChyYyA8IDApIHsKKwkgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMOworICAgICAgfSovCisgICAgICBTU0xfZnJlZShzc2xfc29ja2V0LT5zc2wpOworICAgICAgc3NsX3NvY2tldC0+c3NsID0gTlVMTDsKKyAgICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIH0KKyAgcmV0dXJuIHRocmlmdF9zb2NrZXRfY2xvc2UodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9zc2xfc29ja2V0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisJCQlndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGd1aW50IG1heFJlY3ZSZXRyaWVzXyA9IDEwOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ3VpbnQgYnl0ZXMgPSAwOworICBndWludCByZXRyaWVzID0gMDsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMLCBGQUxTRSk7CisKKyAgZm9yIChyZXRyaWVzPTA7IHJldHJpZXMgPCBtYXhSZWN2UmV0cmllc187IHJldHJpZXMrKykgeworICAgICAgYnl0ZXMgPSBTU0xfcmVhZChzc2xfc29ja2V0LT5zc2wsIGJ1ZiwgbGVuKTsKKyAgICAgIGlmIChieXRlcyA+PSAwKQorCWJyZWFrOworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGlmIChTU0xfZ2V0X2Vycm9yKHNzbF9zb2NrZXQtPnNzbCwgYnl0ZXMpID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7CisJICBpZiAoRVJSX2dldF9lcnJvcigpID09IDAgJiYgZXJybm9fY29weSA9PSBUSFJJRlRfRUlOVFIpIHsKKwkgICAgICBjb250aW51ZTsKKwkgIH0KKyAgICAgIH1lbHNleworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiUmVjZWl2ZSBlcnJvciIsCisJCQkJCSAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLCBieXRlcywgZXJyb3IpOworCisgICAgICB9CisgICAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIGJ5dGVzOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKwkJCSBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBnaW50IHJldCA9IDA7CisgIGd1aW50IHNlbnQgPSAwOworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwsIEZBTFNFKTsKKworICB3aGlsZSAoc2VudCA8IGxlbikKKyAgICB7CisgICAgICByZXQgPSBTU0xfd3JpdGUgKHNzbF9zb2NrZXQtPnNzbCwgKGd1aW50OCAqKWJ1ZiArIHNlbnQsIGxlbiAtIHNlbnQpOworICAgICAgaWYgKHJldCA8IDApCisJeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiU2VuZCBlcnJvciIsCisJCQkJCSAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLCByZXQsIGVycm9yKTsKKwkgIHJldHVybiBGQUxTRTsKKwl9CisgICAgICBzZW50ICs9IHJldDsKKyAgICB9CisKKyAgcmV0dXJuIHNlbnQ9PWxlbjsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2gKKyAqIGZsdXNoIHBlbmRpbmcgZGF0YS4gIHNpbmNlIHdlIGFyZSBub3QgYnVmZmVyZWQsIHRoaXMgaXMgYSBuby1vcCAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBnaW50IHJldCA9IDA7CisgIGd1aW50IHNlbnQgPSAwOworCisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCwgRkFMU0UpOworCisgIEJJTyogYmlvID0gU1NMX2dldF93YmlvKHNzbF9zb2NrZXQtPnNzbCk7CisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisJCSAgICJmYWlsZWQgdG8gZmx1c2gsIHdiaW8gcmV0dXJuZWQgbnVsbCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChCSU9fZmx1c2goYmlvKSAhPSAxKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKwkJICAgImZhaWxlZCB0byBmbHVzaCBpdCByZXR1cm5lZCBlcnJvciIpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9oYW5kbGVfaGFuZHNoYWtlKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCksIEZBTFNFKTsKKworICBpZihUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1Moc3NsX3NvY2tldCktPmNyZWF0ZV9zc2xfY29udGV4dCh0cmFuc3BvcnQsIGVycm9yKSl7CisgICAgICAvKkNvbnRleHQgY3JlYXRlZCovCisgICAgICBTU0xfc2V0X2ZkKHNzbF9zb2NrZXQtPnNzbCwgc29ja2V0LT5zZCk7CisgICAgICBpbnQgcmM7CisgICAgICBpZihzc2xfc29ja2V0LT5zZXJ2ZXIpeworCSAgcmMgPSBTU0xfYWNjZXB0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICB9ZWxzZXsKKwkgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIH0KKyAgICAgIGlmIChyYyA8PSAwKSB7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJFcnJvciB3aGlsZSBjb25uZWN0L2JpbmQiLCBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DT05ORUNUX0JJTkQsIHJjLCBlcnJvcik7CisJICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH1lbHNlCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiB0aHJpZnRfc3NsX3NvY2tldF9hdXRob3JpemUodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9jcmVhdGVfc3NsX2NvbnRleHQoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZihzb2NrZXQtPmN0eCE9TlVMTCl7CisgICAgICBpZihzb2NrZXQtPnNzbCE9TlVMTCkgeworCSAgcmV0dXJuIFRSVUU7CisgICAgICB9CisKKyAgICAgIHNvY2tldC0+c3NsID0gU1NMX25ldyhzb2NrZXQtPmN0eCk7CisgICAgICBpZiAoc29ja2V0LT5zc2wgPT0gTlVMTCkgeworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfVFJBTlNQT1JULAorCQkgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgZGVmYXVsdCBTU0wgY29udGV4dCIpOworCSAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZ2Jvb2xlYW4gdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworICBjaGFyIGVycm9yX2J1ZmZlclsyNTVdOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQpIHsKKyAgICAgIGdfZXJyb3IoIk9wZW5TU0wgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCByYyA9IFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9zb2NrZXQtPmN0eCwgZmlsZV9uYW1lLCBOVUxMKTsKKyAgaWYgKHJjICE9IDEpIHsgLyp2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVzdWx0Ki8KKyAgICAgIEVSUl9lcnJvcl9zdHJpbmdfbihFUlJfZ2V0X2Vycm9yKCksIGVycm9yX2J1ZmZlciwgMjU0KTsKKyAgICAgIGdfd2FybmluZygiTG9hZCBvZiBjZXJ0aWZpY2F0ZXMgZmFpbGVkOiAlcyEiLCBlcnJvcl9idWZmZXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuIHRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fYnVmZmVyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciBjaGFpbl9jZXJ0c1tdKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgLyogTG9hZCBjaGFpbiBvZiBjZXJ0cyovCisgIFg1MDkgKmNhY2VydD1OVUxMOworICBCSU8gKm1lbSA9IEJJT19uZXdfbWVtX2J1ZihjaGFpbl9jZXJ0cyxzdHJsZW4oY2hhaW5fY2VydHMpKTsKKyAgWDUwOV9TVE9SRSAqY2VydF9zdG9yZSA9IFNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoc3NsX3NvY2tldC0+Y3R4KTsKKworICBpZihjZXJ0X3N0b3JlIT1OVUxMKXsKKyAgICAgIGludCBpbmRleCA9IDA7CisgICAgICB3aGlsZSAoKGNhY2VydCA9IFBFTV9yZWFkX2Jpb19YNTA5KG1lbSwgTlVMTCwgMCwgTlVMTCkpIT1OVUxMKSB7CisJICBpZihjYWNlcnQpIHsKKwkgICAgICBYNTA5X1NUT1JFX2FkZF9jZXJ0KGNlcnRfc3RvcmUsIGNhY2VydCk7CisJICAgICAgWDUwOV9mcmVlKGNhY2VydCk7CisJICAgICAgY2FjZXJ0PU5VTEw7CisJICB9IC8qIEZyZWUgaW1tZWRpYXRlbHkgKi8KKwkgIGluZGV4Kys7CisgICAgICB9CisgICAgICByZXR2YWw9VFJVRTsKKyAgfQorICBCSU9fZnJlZShtZW0pOworICByZXR1cm4gcmV0dmFsOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfYXV0aG9yaXplKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIFRocmlmdFNTTFNvY2tldENsYXNzICpjbHMgPSBUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1Moc3NsX3NvY2tldCk7CisgIGdib29sZWFuIGF1dGhvcml6YXRpb25fcmVzdWx0ID0gRkFMU0U7CisKKyAgaWYoY2xzIT1OVUxMICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCl7CisgICAgICBpbnQgcmMgPSBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIGlmIChyYyAhPSBYNTA5X1ZfT0spIHsgLyogdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdCAqLworCSAgaWYgKHJjID09IFg1MDlfVl9FUlJfREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUICYmIHNzbF9zb2NrZXQtPmFsbG93X3NlbGZzaWduZWQpIHsKKwkgICAgICBnX2RlYnVnKCJUaGUgY2VydGlmaWNhdGUgaXMgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBhbmQgY29uZmlndXJhdGlvbiBhbGxvd3MgaXQiKTsKKwkgIH0gZWxzZSB7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJCSAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTF9DRVJUX1ZBTElEQVRJT05fRkFJTEVELAorCQkJICAgIlRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAlcyAoJWQpIiwgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcocmMpLCByYyk7CisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgfQorICAgICAgfQorCisgICAgICBYNTA5KiBjZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICBpZiAoY2VydCA9PSBOVUxMKSB7CisJICBpZiAoU1NMX2dldF92ZXJpZnlfbW9kZShzc2xfc29ja2V0LT5zc2wpICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCQkgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0xfQ0VSVF9WQUxJREFUSU9OX0ZBSUxFRCwKKwkJCSAgICJObyBjZXJ0aWZpY2F0ZSBwcmVzZW50LiBBcmUgeW91IGNvbm5lY3RpbmcgU1NMIHNlcnZlcj8iKTsKKwkgICAgICByZXR1cm4gRkFMU0U7CisJICB9CisJICBnX2RlYnVnKCJObyBjZXJ0aWZpY2F0ZSByZXF1aXJlZCIpOworCSAgcmV0dXJuIFRSVUU7CisgICAgICB9CisKKyAgICAgIC8qIGNlcnRpZmljYXRlIGlzIHByZXNlbnQsIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgYWNjZXNzIG1hbmFnZXIgd2UgYXJlIGRvbmUgKi8KKyAgICAgIGlmIChjbHMtPmF1dGhvcml6ZV9wZWVyID09IE5VTEwpIHsKKwkgIFg1MDlfZnJlZShjZXJ0KTsKKwkgIGdfZGVidWcoIkNlcnRpZmljYXRlIHByZXNlbnRlZCBidXQgd2UncmUgbm90IGNoZWNraW5nIGl0Iik7CisJICByZXR1cm4gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisJICAvKiBib3RoIGNlcnRpZmljYXRlIGFuZCBhY2Nlc3MgbWFuYWdlciBhcmUgcHJlc2VudCAqLworCSAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisJICBzb2NrbGVuX3Qgc2FMZW5ndGggPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpOworCSAgaWYgKGdldHBlZXJuYW1lKHNvY2tldC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgJnNhTGVuZ3RoKSAhPSAwKSB7CisJICAgICAgc2Euc3NfZmFtaWx5ID0gQUZfVU5TUEVDOworCSAgfQorCSAgYXV0aG9yaXphdGlvbl9yZXN1bHQgPSBjbHMtPmF1dGhvcml6ZV9wZWVyKHRyYW5zcG9ydCwgY2VydCwgJnNhLCBlcnJvcik7CisgICAgICB9CisgICAgICBpZihjZXJ0ICE9IE5VTEwpIHsKKwkgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBhdXRob3JpemF0aW9uX3Jlc3VsdDsKK30KKworCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9pbml0IChUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCkKK3sKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIHNvY2tldC0+c3NsID0gTlVMTDsKKyAgc29ja2V0LT5jdHggPSB0aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoU1NMVExTLCAmZXJyb3IpOworICBpZihzb2NrZXQtPmN0eCA9PSBOVUxMKSB7CisgICAgICBnX2luZm8oIlRoZSBTU0wgY29udGV4dCB3YXMgbm90IGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQgd2l0aCBwcm90b2NvbCAlZCIsIFNTTFRMUyk7CisgICAgICBpZihlcnJvciE9TlVMTCl7CisJICBnX2luZm8oIlJlcG9ydGVkIHJlYXNvbiAlcyIsIGVycm9yLT5tZXNzYWdlKTsKKwkgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgfQorICB9CisgIHNvY2tldC0+c2VydmVyID0gRkFMU0U7CisgIHNvY2tldC0+YWxsb3dfc2VsZnNpZ25lZCA9IEZBTFNFOworCit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUIChvYmplY3QpOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisgIGlmKHNvY2tldCE9TlVMTCl7CisgICAgICBnX2RlYnVnKCJJbnN0YW5jZSAlcCBkZXN0cm95ZWQiLCAodm9pZCAqKXNvY2tldCk7CisgICAgICBpZihzb2NrZXQtPnNzbCAhPSBOVUxMKQorCXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlKFRIUklGVF9UUkFOU1BPUlQob2JqZWN0KSwgJmVycm9yKTsKKwkgIHNvY2tldC0+c3NsPU5VTEw7CisJfQorCisgICAgICBpZihzb2NrZXQtPmN0eCE9TlVMTCl7CisJICBnX2RlYnVnKCJGcmVlaW5nIHRoZSBjb250ZXh0IGZvciB0aGUgaW5zdGFuY2UiKTsKKwkgIFNTTF9DVFhfZnJlZShzb2NrZXQtPmN0eCk7CisJICBzb2NrZXQtPmN0eD1OVUxMOworICAgICAgfQorICB9CisKKyAgaWYgKEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfc3NsX3NvY2tldF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkKKyAgICAoKkdfT0JKRUNUX0NMQVNTICh0aHJpZnRfc3NsX3NvY2tldF9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkgKG9iamVjdCk7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisJCQkJR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKG9iamVjdCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhUOgorICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlciAodmFsdWUsIHNvY2tldC0+Y3R4KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKwkJCQljb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQ6CisgICAgICBpZihzb2NrZXQtPmN0eCE9TlVMTCl7CisJICBnX2RlYnVnKCJGcmVlaW5nIHRoZSBjb250ZXh0IHNpbmNlIHdlIGFyZSBzZXR0aW5nIGEgbmV3IG9uZSIpOworCSAgU1NMX0NUWF9mcmVlKHNvY2tldC0+Y3R4KTsKKyAgICAgIH0KKyAgICAgIHNvY2tldC0+Y3R4ID0gZ192YWx1ZV9nZXRfcG9pbnRlcih2YWx1ZSk7IC8qIFdlIGNvcHkgdGhlIGNvbnRleHQgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQUk9QX1RIUklGVF9TU0xfU0VMRl9TSUdORUQ6CisgICAgICBzb2NrZXQtPmFsbG93X3NlbGZzaWduZWQgPSBnX3ZhbHVlX2dldF9ib29sZWFuKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX3dhcm5pbmcoIlRyeWluZyB0byBzZXQgcHJvcGVydHkgJWkgdGhhdCBkb2Vzbid0IGV4aXN0cyEiLCBwcm9wZXJ0eV9pZCk7CisgICAgICAvKiAgICB0aHJpZnRfc29ja2V0X3NldF9wcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5X2lkLCB2YWx1ZSwgcHNwZWMpOyAqLworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKHZvaWQpCit7CisgIGlmKHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQpeworICAgICAgcmV0dXJuOworICB9CisgIHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQ9VFJVRTsKKyAgU1NMX2xpYnJhcnlfaW5pdCgpOworICBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisgIEVSUl9sb2FkX0JJT19zdHJpbmdzKCk7CisKKyAgLyogU2V0dXAgbG9ja2luZyAqLworICBnX2RlYnVnKCJXZSBzZXR1cCAlZCB0aHJlYWRzIGxvY2tzIiwgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9zZXR1cCgpKTsKKworICAvKiBkeW5hbWljIGxvY2tpbmcKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19jcmVhdGVfY2FsbGJhY2spOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19jYWxsYmFjayk7CisgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2Rlc3Ryb3lfY2FsbGJhY2spOworICAgKi8KK30KKworCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2wodm9pZCkKK3sKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKSB7CisgICAgICByZXR1cm47CisgIH0KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCA9IEZBTFNFOworCisgIGdfZGVidWcoIldlIGNsZWFyZWQgJWQgdGhyZWFkcyBsb2NrcyIsIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfY2xlYW51cCgpKTsKKyAgLyogTm90IHN1cHBvcnRlZAorICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhOVUxMKTsKKyAgICovCisgIEVSUl9mcmVlX3N0cmluZ3MoKTsKKyAgRVZQX2NsZWFudXAoKTsKKyAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKKyAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKK30KKworCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9jbGFzc19pbml0IChUaHJpZnRTU0xTb2NrZXRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIGdfZGVidWcoIkluaXRpYWxpemF0aW9uIG9mIFRocmlmdFNTTFNvY2tldENsYXNzIik7CisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc3NsX3NvY2tldF9zZXRfcHJvcGVydHk7CisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfcG9pbnRlciAoInNzbF9jb250ZXh0IiwKKwkJCQkgICAgICJTU0xDb250ZXh0IiwKKwkJCQkgICAgICJTZXQgdGhlIFNTTCBjb250ZXh0IGZvciBoYW5kc2hha2Ugd2l0aCB0aGUgcmVtb3RlIGhvc3QiLAorCQkJCSAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQsCisJCQkJICAgcGFyYW1fc3BlYyk7CisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoInNzbF9hY2NlcHRfc2VsZnNpZ25lZCIsCisJCQkJICAgICAiQWNjZXB0IFNlbGYgU2lnbmVkIiwKKwkJCQkgICAgICJXaGV0aGVyIG9yIG5vdCBhY2NlcHQgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUiLAorCQkJCSAgICAgRkFMU0UsCisJCQkJICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NTTF9TRUxGX1NJR05FRCwKKwkJCQkgICBwYXJhbV9zcGVjKTsKKyAgLyogQ2xhc3MgbWV0aG9kcyAqLworICBjbHMtPmhhbmRsZV9oYW5kc2hha2UgPSB0aHJpZnRfc3NsX3NvY2tldF9oYW5kbGVfaGFuZHNoYWtlOworICBjbHMtPmNyZWF0ZV9zc2xfY29udGV4dCA9IHRocmlmdF9zc2xfc29ja2V0X2NyZWF0ZV9zc2xfY29udGV4dDsKKworICAvKiBPdmVycmlkZSAqLworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuOworICB0dGMtPnBlZWsgPSB0aHJpZnRfc3NsX3NvY2tldF9wZWVrOworICB0dGMtPm9wZW4gPSB0aHJpZnRfc3NsX3NvY2tldF9vcGVuOworICB0dGMtPmNsb3NlID0gdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9zc2xfc29ja2V0X3JlYWQ7CisgIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfc3NsX3NvY2tldF9yZWFkX2VuZDsKKyAgdHRjLT53cml0ZSA9IHRocmlmdF9zc2xfc29ja2V0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9zc2xfc29ja2V0X3dyaXRlX2VuZDsKKyAgdHRjLT5mbHVzaCA9IHRocmlmdF9zc2xfc29ja2V0X2ZsdXNoOworfQorCisKKy8qCisgKiBQdWJsaWMgQVBJCisgKi8KK1RocmlmdFNTTFNvY2tldCoKK3RocmlmdF9zc2xfc29ja2V0X25ldyhUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRocmlmdFNTTFNvY2tldCA9IE5VTEw7CisgIFNTTF9DVFggKnNzbF9jb250ZXh0ID0gTlVMTDsKKyAgLyogQ3JlYXRlIHRoZSBjb250ZXh0ICovCisgIGlmKChzc2xfY29udGV4dD10aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoc3NsX3Byb3RvY29sLCBlcnJvcikpPT1OVUxMKXsKKyAgICAgIGdfd2FybmluZygiV2UgY2Fubm90IGluaXRpYWxpemUgY29udGV4dCBmb3IgcHJvdG9jb2wgJWQiLCBzc2xfcHJvdG9jb2wpOworICAgICAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKKyAgfQorCisgIC8qIEZJWE1FIGlmIHRoZSBwcm90b2NvbCBpcyBkaWZmZXJlbnQ/ICovCisgIHRocmlmdFNTTFNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgInNzbF9jb250ZXh0Iiwgc3NsX2NvbnRleHQsIE5VTEwpOworICByZXR1cm4gdGhyaWZ0U1NMU29ja2V0OworfQorCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgZ2NoYXIgKmhvc3RuYW1lLCBndWludCBwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0aHJpZnRTU0xTb2NrZXQgPSBOVUxMOworICBTU0xfQ1RYICpzc2xfY29udGV4dCA9IE5VTEw7CisgIC8qIENyZWF0ZSB0aGUgY29udGV4dCAqLworICBpZigoc3NsX2NvbnRleHQ9dGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKHNzbF9wcm90b2NvbCwgZXJyb3IpKT09TlVMTCl7CisgICAgICAvKiBGSVhNRSBEbyBlcnJvciBjb250cm9sICovCisgICAgICByZXR1cm4gdGhyaWZ0U1NMU29ja2V0OworICB9CisgIC8qIEZJWE1FIGlmIHRoZSBwcm90b2NvbCBpcyBkaWZmZXJlbnQ/ICovCisgIHRocmlmdFNTTFNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgInNzbF9jb250ZXh0Iiwgc3NsX2NvbnRleHQsICJob3N0bmFtZSIsIGhvc3RuYW1lLCAicG9ydCIsIHBvcnQsIE5VTEwpOworICByZXR1cm4gdGhyaWZ0U1NMU29ja2V0OworfQorCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X3NldF9tYW5hZ2VyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgQVVUSE9SSVpBVElPTl9NQU5BR0VSX0NBTExCQUNLIGNhbGxiYWNrKQoreworICBUaHJpZnRTU0xTb2NrZXRDbGFzcyAqc3NsU29ja2V0Q2xhc3MgPSBUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1MgKHNzbF9zb2NrZXQpOworICBpZihzc2xTb2NrZXRDbGFzcyl7CisgICAgICBzc2xTb2NrZXRDbGFzcy0+YXV0aG9yaXplX3BlZXIgPSBjYWxsYmFjazsKKyAgfQorfQorCisKK1NTTF9DVFgqCit0aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgU1NMX0NUWCogY29udGV4dCA9IE5VTEw7CisgIHN3aXRjaChzc2xfcHJvdG9jb2wpeworICAgIGNhc2UgU1NMVExTOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSk7CisgICAgICBicmVhazsKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisgICAgY2FzZSBTU0x2MzoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhTU0x2M19tZXRob2QoKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgVExTdjFfMDoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV9tZXRob2QoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRMU3YxXzE6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoVExTdjFfMV9tZXRob2QoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRMU3YxXzI6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoVExTdjFfMl9tZXRob2QoKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DSVBIRVJfTk9UX0FWQUlMQUJMRSwKKwkJICAgIlRoZSBTU0wgcHJvdG9jb2wgaXMgdW5rbm93biBmb3IgJWQiLCBzc2xfcHJvdG9jb2wpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChjb250ZXh0ID09IE5VTEwpIHsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X2dldF9lcnJvcigiTm8gY2lwaGVyIG92ZXJsYXkiLCBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DSVBIRVJfTk9UX0FWQUlMQUJMRSwgZXJyb3IpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgU1NMX0NUWF9zZXRfbW9kZShjb250ZXh0LCBTU0xfTU9ERV9BVVRPX1JFVFJZKTsKKworICAvKiBEaXNhYmxlIGhvcnJpYmx5IGluc2VjdXJlIFNTTHYyIGFuZCBTU0x2MyBwcm90b2NvbHMgYnV0IGFsbG93IGEgaGFuZHNoYWtlCisgICAgIHdpdGggb2xkZXIgY2xpZW50cyBzbyB0aGV5IGdldCBhIGdyYWNlZnVsIGRlbmlhbC4gKi8KKyAgaWYgKHNzbF9wcm90b2NvbCA9PSBTU0xUTFMpIHsKKyAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29udGV4dCwgU1NMX09QX05PX1NTTHYyKTsKKyAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29udGV4dCwgU1NMX09QX05PX1NTTHYzKTsgICAvKiBUSFJJRlQtMzE2NCAqLworICB9CisKKyAgcmV0dXJuIGNvbnRleHQ7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTQ2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TU0xfU09DS0VUX0gKKyNkZWZpbmUgX1RIUklGVF9TU0xfU09DS0VUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc3NsX3NvY2tldC5oCisgKiAgXGJyaWVmIFNTTCBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcyB0aGUKKyAqICAgICAgICAgVGhyaWZ0U29ja2V0IGNsYXNzLiBCYXNlZCBvbiBwbGFpbiBvcGVuc3NsLgorICogICAgICAgICBJbiB0aGUgZnV0dXJlIHdlIHNob3VsZCB0YWtlIGEgbG9vayB0byBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMDE2CisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCAodGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TU0xfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgVGhyaWZ0U1NMU29ja2V0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NTTF9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NTTF9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIFRocmlmdFNTTFNvY2tldENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NTTF9TT0NLRVRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIFRocmlmdFNTTFNvY2tldENsYXNzKSkKKworCisvKiBkZWZpbmUgZXJyb3IvZXhjZXB0aW9uIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfVFJBTlNQT1JUPTcsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NPTk5FQ1RfQklORCwKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMX0NFUlRfVkFMSURBVElPTl9GQUlMRUQKK30gVGhyaWZ0U1NMU29ja2V0RXJyb3I7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldCBUaHJpZnRTU0xTb2NrZXQ7CisKKy8qIQorICogVGhyaWZ0IFNTTCBTb2NrZXQgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U1NMU29ja2V0Cit7CisgIFRocmlmdFNvY2tldCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBTU0wgKnNzbDsKKyAgU1NMX0NUWCogY3R4OworICBnYm9vbGVhbiBzZXJ2ZXI7CisgIGdib29sZWFuIGFsbG93X3NlbGZzaWduZWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U1NMU29ja2V0Q2xhc3MgVGhyaWZ0U1NMU29ja2V0Q2xhc3M7Cit0eXBlZGVmIGdib29sZWFuICgqIEFVVEhPUklaQVRJT05fTUFOQUdFUl9DQUxMQkFDSykgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgWDUwOSAqY2VydCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBUaHJpZnQgU29ja2V0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldENsYXNzCit7CisgIFRocmlmdFNvY2tldENsYXNzIHBhcmVudDsKKworICBnYm9vbGVhbiAoKiBoYW5kbGVfaGFuZHNoYWtlKSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqIGNyZWF0ZV9zc2xfY29udGV4dCkgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKiBhdXRob3JpemVfcGVlcikgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgWDUwOSAqY2VydCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIEdFcnJvciAqKmVycm9yKTsKKworICAvKiBQYWRkaW5nIHRvIGFsbG93IGFkZGluZyB1cCB0byAxMiBuZXcgdmlydHVhbCBmdW5jdGlvbnMgd2l0aG91dAorICAgKiBicmVha2luZyBBQkkuICovCisgIGdwb2ludGVyIHBhZGRpbmdbMTJdOworfTsKKworZW51bSBfVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgeworICBTU0xUTFMgID0gMCwgIC8qIFN1cHBvcnRzIFNTTHYyIGFuZCBTU0x2MyBoYW5kc2hha2UgYnV0IG9ubHkgbmVnb3RpYXRlcyBhdCBUTFN2MV8wIG9yIGxhdGVyLiAqLworLypTU0x2MiAgID0gMSwgICBIT1JSSUJMWSBJTlNFQ1VSRSEgKi8KKyAgU1NMdjMgICA9IDIsICAvKiBTdXBwb3J0cyBTU0x2MyBvbmx5IC0gYWxzbyBob3JyaWJseSBpbnNlY3VyZSEgKi8KKyAgVExTdjFfMCA9IDMsICAvKiBTdXBwb3J0cyBUTFN2MV8wIG9yIGxhdGVyLiAqLworICBUTFN2MV8xID0gNCwgIC8qIFN1cHBvcnRzIFRMU3YxXzEgb3IgbGF0ZXIuICovCisgIFRMU3YxXzIgPSA1LCAgLyogU3VwcG9ydHMgVExTdjFfMiBvciBsYXRlci4gKi8KKyAgTEFURVNUICA9IFRMU3YxXzIKK307Cit0eXBlZGVmIGVudW0gX1RocmlmdFNTTFNvY2tldFByb3RvY29sIFRocmlmdFNTTFNvY2tldFByb3RvY29sOworCisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyAqLworU1NMX0NUWCoKK3RocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NTTF9TT0NLRVQgKi8KK0dUeXBlIHRocmlmdF9zc2xfc29ja2V0X2dldF90eXBlICh2b2lkKTsKKworLyogUHVibGljIEFQSSAqLworCisvKioKKyAqIEBicmllZiBTZXQgYSBwaW5uaW5nIG1hbmFnZXIgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmUuCisgKgorICogVGhlIHBpbm5pbmcgbWFuYWdlciB3aWxsIGJlIHVzZWQgZHVyaW5nIHRoZSBTU0wgaGFuZHNoYWtlIHRvIGNoZWNrIGNlcnRpZmljYXRlCisgKiBhbmQgcGlubmluZyBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSBzc2xfc29ja2V0IFNTTCBTb2NrZXQgdG8gb3BlcmF0ZSBvbi4KKyAqIEBwYXJhbSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgdGFrZSB0aGUgY29udHJvbCB3aGlsZSB2YWxpZGF0aW5nIHBpbm5pbmcKKyAqCisgKi8KK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X21hbmFnZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBBVVRIT1JJWkFUSU9OX01BTkFHRVJfQ0FMTEJBQ0sgY2FsbGJhY2spOworCisvKiBUaGlzIGlzIHRoZSBTU0wgQVBJICovCisvKioKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBTU0wgY29udGV4dCB3aXRoIHRoZSBwcm90b2NvbCBzcGVjaWZpZWQKKyAqIGFuZCBhc3NpZ24gdGhpcyBuZXcgY29udGV4dCB0byB0aGUgY3JlYXRlZCBUaHJpZnRTU0xTb2NrZXQgd2l0aCBzcGVjaWZpZWQgaG9zdDpwb3J0LgorICogQHBhcmFtIHNzbF9wcm90b2NvbAorICogQHBhcmFtIGhvc3RuYW1lCisgKiBAcGFyYW0gcG9ydAorICogQHBhcmFtIGVycm9yCisgKiBAcmV0dXJuCisgKi8KK1RocmlmdFNTTFNvY2tldCoKK3RocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBnY2hhciAqaG9zdG5hbWUsIGd1aW50IHBvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgU1NMIGNvbnRleHQgd2l0aCB0aGUgcHJvdG9jb2wgc3BlY2lmaWVkCisgKiBhbmQgYXNzaWduIHRoaXMgbmV3IGNvbnRleHQgdG8gdGhlIGNyZWF0ZWQgVGhyaWZ0U1NMU29ja2V0LgorICogQHBhcmFtIHNzbF9wcm90b2NvbAorICogQHBhcmFtIGVycm9yCisgKiBAcmV0dXJuCisgKi8KK1RocmlmdFNTTFNvY2tldCoKK3RocmlmdF9zc2xfc29ja2V0X25ldyhUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKworLyoqCisgKiBMb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBhIFBFTSBmaWxlLgorICogQHBhcmFtIHNzbF9zb2NrZXQgVGhlIHNzbCBzb2NrZXQKKyAqIEBwYXJhbSBmaWxlX25hbWUgVGhlIGZpbGUgbmFtZSBvZiB0aGUgUEVNIGNlcnRpZmljYXRlIGNoYWluCisgKiBAcmV0dXJuCisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2ZpbGUoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyICpmaWxlX25hbWUpOworCisvKioKKyAqIExvYWQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIG1lbW9yeQorICogQHBhcmFtIHNzbF9zb2NrZXQgdGhlIHNzbCBzb2NrZXQKKyAqIEBwYXJhbSBjaGFpbl9jZXJ0cyB0aGUgYnVmZmVyIHRvIGxvYWQgUEVNIGZyb20KKyAqIEByZXR1cm4KKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fYnVmZmVyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciBjaGFpbl9jZXJ0c1tdKTsKKworLyoqCisgKiBDaGVjayBpZiB0aGUgc3NsIHNvY2tldCBpcyBvcGVuIGFuZCByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlCisgKiBAcGFyYW0gdHJhbnNwb3J0CisgKiBAcmV0dXJuIHRydWUgaWYgb3BlbgorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCisKKy8qKgorICogT3BlbiBjb25uZWN0aW9uIGlmIHJlcXVpcmVkIGFuZCBzZXQgdGhlIHNvY2tldCB0byBiZSByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlCisgKiBAcGFyYW0gdHJhbnNwb3J0CisgKiBAcGFyYW0gZXJyb3IKKyAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVyYXRpb24gd2FzIGNvcnJlY3QKKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAqCisgKiBJdCB3aWxsIGluaXRpYWxpemUgT3BlblNTTCBmdW5jdGlvbi4gVGhpcyBpbml0aWFsaXphdGlvbiB3aWxsIGJlIGRvbmUgYXBwCisgKiB3aWRlLiBTbyBpZiB5b3Ugd2FudCB0byBpbml0aWFsaXplIGl0IGJ5IHlvdXJzZWxmIHlvdSBzaG91bGQgbm90IGNhbGwgaXQuCisgKiBCdXQgaXQgbWVhbnMgeW91IG11c3QgaGFuZGxlIE9wZW5TU0wgaW5pdGlhbGl6YXRpb24gYW5kIGhhbmRsZSBsb2NraW5nLgorICoKKyAqIEl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UuCisgKgorICoKKyAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKHZvaWQpOworLyoqCisgKiBAYnJpZWYgRmluYWxpemF0aW9uIGZ1bmN0aW9uCisgKgorICogSXQgY2xlYXJzIGFsbCByZXNvdXJjZXMgaW5pdGlhbGl6ZWQgaW4gaW5pdGlhbGl6ZSBmdW5jdGlvbi4KKyAqCisgKiBJdCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGFueXRoaW5nIGVsc2UuCisgKgorICoKKyAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCh2b2lkKTsKKworR19FTkRfREVDTFMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDI2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfRE9NQUlOICJ0aHJpZnQtdHJhbnNwb3J0LWVycm9yLXF1YXJrIgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFRyYW5zcG9ydCwgdGhyaWZ0X3RyYW5zcG9ydCwgR19UWVBFX09CSkVDVCkKKworZ2Jvb2xlYW4gCit0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmlzX29wZW4gKHRyYW5zcG9ydCk7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5wZWVrICh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPm9wZW4gKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmNsb3NlICh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkICh0cmFuc3BvcnQsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkX2VuZCAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPndyaXRlICh0cmFuc3BvcnQsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPndyaXRlX2VuZCAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmZsdXNoICh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPnJlYWRfYWxsICh0cmFuc3BvcnQsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKKy8qIGJ5IGRlZmF1bHQsIHBlZWsgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiAqLworc3RhdGljIGdib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+aXNfb3BlbiAodHJhbnNwb3J0KTsKK30KKworc3RhdGljIGdpbnQzMgordGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGM7CisgIGd1aW50MzIgaGF2ZTsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDggKmJ5dGVzOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisgIGhhdmUgPSAwOworICByZXQgPSAwOworICBieXRlcyA9IChnaW50OCopIGJ1ZjsKKworICB3aGlsZSAoaGF2ZSA8IGxlbikgeworICAgIGlmICgocmV0ID0gdHRjLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgKGJ5dGVzICsgaGF2ZSksIGxlbiAtIGhhdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBoYXZlICs9IHJldDsKKyAgfQorCisgIHJldHVybiBoYXZlOworfQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCB0cmFuc3BvcnRzICovCitHUXVhcmsKK3RocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9ET01BSU4pOworfQorCisvKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0VHJhbnNwb3J0ICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRUcmFuc3BvcnRDbGFzcyAqY2xzKQoreworICAvKiBzZXQgdGhlc2UgYXMgdmlydHVhbCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MgKi8KKyAgY2xzLT5pc19vcGVuID0gdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuOworICBjbHMtPm9wZW4gPSB0aHJpZnRfdHJhbnNwb3J0X29wZW47CisgIGNscy0+Y2xvc2UgPSB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlOworICBjbHMtPnJlYWQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWQ7CisgIGNscy0+cmVhZF9lbmQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kOworICBjbHMtPndyaXRlID0gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZTsKKyAgY2xzLT53cml0ZV9lbmQgPSB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKKyAgY2xzLT5mbHVzaCA9IHRocmlmdF90cmFuc3BvcnRfZmx1c2g7CisKKyAgLyogcHJvdmlkZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwZWVrIGFuZCByZWFkX2FsbCBtZXRob2RzICovCisgIGNscy0+cGVlayA9IHRocmlmdF90cmFuc3BvcnRfcmVhbF9wZWVrOworICBjbHMtPnJlYWRfYWxsID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3JlYWRfYWxsOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3RyYW5zcG9ydF9pbml0IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiYjZmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3RyYW5zcG9ydC5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgdHJhbnNwb3J0cy4KKyAqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyBpcyB1c2VkIGluc3RlYWQgb2YgYW4gaW50ZXJmYWNlIGJlY2F1c2U6CisgKiAgLSBpbnRlcmZhY2VzIGNhbid0IHNlZW0gdG8gYmUgdXNlZCBhcyBwcm9wZXJ0aWVzLiAgVGhyaWZ0UHJvdG9jb2wgaGFzCisgKiAgICBhIFRocmlmdFRyYW5zcG9ydCBhcyBhbiBvYmplY3QgcHJvcGVydHkuCisgKiAgLSBpZiBhIG1ldGhvZCBuZWVkcyB0byBiZSBhZGRlZCB0aGF0IGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UsIGEgY2xhc3MKKyAqICAgIGlzIG5lY2Vzc2FyeS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9UUkFOU1BPUlQgKHRocmlmdF90cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsIFRocmlmdFRyYW5zcG9ydCkpCisjZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsIFRocmlmdFRyYW5zcG9ydENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0IFRocmlmdFRyYW5zcG9ydDsKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0Cit7CisgIEdPYmplY3QgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydENsYXNzIFRocmlmdFRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBnYm9vbGVhbiAoKmlzX29wZW4pIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisgIGdib29sZWFuICgqcGVlaykgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqb3BlbikgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqY2xvc2UpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqcmVhZF9lbmQpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKndyaXRlKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKndyaXRlX2VuZCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqZmx1c2gpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2FsbCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfVFJBTlNQT1JUICovCitHVHlwZSB0aHJpZnRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworCisvKiEKKyAqIENoZWNrcyBpZiB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuZWQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKKy8qIQorICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nIGFuZCB3cml0aW5nLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBpcyBzdGlsbAorICogb3Blbi4gQnkgZGVmYXVsdCB0aGlzIGlzIHRydWUgd2hlbmV2ZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLCBidXQKKyAqIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYWRkIGxvZ2ljIHRvIHRlc3QgZm9yIHRoaXMgY29uZGl0aW9uIHdoZXJlIHBvc3NpYmxlCisgKiAoaS5lLiBvbiBhIHNvY2tldCkuCisgKgorICogVGhpcyBpcyB1c2VkIGJ5IGEgc2VydmVyIHRvIGNoZWNrIGlmIGl0IHNob3VsZCBsaXN0ZW4gZm9yIGFub3RoZXIgcmVxdWVzdC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGJ1ZmZlciBidWYuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2ludDMyIHRocmlmdF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQ2FsbGVkIHdoZW4gcmVhZCBpcyBjb21wbGV0ZWQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBXcml0ZXMgZGF0YSBmcm9tIGEgYnVmZmVyIHRvIHRoZSB0cmFuc3BvcnQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogQ2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGVkLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIHRvIGJlIHdyaXR0ZW4uICBUeXBpY2FsbHkgdXNlZCB3aXRoIGJ1ZmZlcmVkCisgKiB0cmFuc3BvcnQgbWVjaGFuaXNtcy4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFJlYWQgbGVuIGJ5dGVzIG9mIGRhdGEgaW50byB0aGUgYnVmZmVyIGJ1Zi4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnaW50MzIgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworCisvKiBkZWZpbmUgZXJyb3IvZXhjZXB0aW9uIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9VTktOT1dOLAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0hPU1QsCisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU09DS0VULAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NPTk5FQ1QsCisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9SRUNFSVZFLAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NMT1NFCit9IFRocmlmdFRyYW5zcG9ydEVycm9yOworCisvKiBkZWZpbmUgYW4gZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgdG8gdXNlICovCitHUXVhcmsgdGhyaWZ0X3RyYW5zcG9ydF9lcnJvcl9xdWFyayAodm9pZCk7CisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRVJST1IgKHRocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKCkpCisKKy8qIGRlZmluZSBtYWNybyBmb3IgaW52YWxpZCBzb2NrZXQgKi8KKyNkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUICgtMSkKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwMjVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSwgdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LCBHX1RZUEVfT0JKRUNUKQorCisvKiBidWlsZHMgYSB0cmFuc3BvcnQgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQuICovCitUaHJpZnRUcmFuc3BvcnQgKgordGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKKyAgcmV0dXJuIHRyYW5zcG9ydDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmNscykKK3sKKyAgY2xzLT5nZXRfdHJhbnNwb3J0ID0gdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQ7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTNkYTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfdHJhbnNwb3J0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCisgKiAgXGJyaWVmIEJhc2UgY2xhc3MgZm9yIFRocmlmdCBUcmFuc3BvcnQgRmFjdG9yaWVzLiAgVXNlZCBieSBUaHJpZnQgU2VydmVycworICogICAgICAgICB0byBvYnRhaW4gYSBjbGllbnQgdHJhbnNwb3J0IGZyb20gYW4gZXhpc3RpbmcgdHJhbnNwb3J0LiAgVGhlIGRlZmF1bHQKKyAqICAgICAgICAgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNsb25lcyB0aGUgcHJvdmlkZWQgdHJhbnNwb3J0LgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZICh0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5IFRocmlmdFRyYW5zcG9ydEZhY3Rvcnk7CisKKy8qIFRocmlmdCBUcmFuc3BvcnQgRmFjdG9yeSBpbnN0YW5jZSAqLworc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5Cit7CisgIEdPYmplY3QgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcyBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3M7CisKKy8qIFRocmlmdCBUcmFuc3BvcnQgRmFjdG9yeSBjbGFzcyAqLworc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICooKmdldF90cmFuc3BvcnQpIChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKKy8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KK1RocmlmdFRyYW5zcG9ydCAqdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90cmFuc3BvcnQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2U0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK3NldChURVNUX1BSRUZJWCAiY19nbGliIikKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtCb29zdF9JTkNMVURFX0RJUlN9KQorCisjTWFrZSBzdXJlIGdlbi1jcHAgYW5kIGdlbi1jX2dsaWIgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQorCisjIENyZWF0ZSB0aGUgdGhyaWZ0IEMgdGVzdCBsaWJyYXJ5CitzZXQodGVzdGdlbmNfU09VUkNFUworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCispCisKK2FkZF9saWJyYXJ5KHRlc3RnZW5jIFNUQVRJQyAke3Rlc3RnZW5jX1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RnZW5jIHRocmlmdF9jX2dsaWIpCisKKworYWRkX2V4ZWN1dGFibGUodGVzdHNlcmlhbGl6YXRpb24gdGVzdHNlcmlhbGl6YXRpb24uYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0c2VyaWFsaXphdGlvbiB0ZXN0Z2VuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0c2VyaWFsaXphdGlvbiB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0c2VyaWFsaXphdGlvbiBDT01NQU5EIHRlc3RzZXJpYWxpemF0aW9uKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiBDT01NQU5EIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbikKKworYWRkX2V4ZWN1dGFibGUodGVzdHRyYW5zcG9ydHNvY2tldCB0ZXN0dHJhbnNwb3J0c29ja2V0LmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdHRyYW5zcG9ydHNvY2tldCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0dHJhbnNwb3J0c29ja2V0IENPTU1BTkQgdGVzdHRyYW5zcG9ydHNvY2tldCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGJpbmFyeXByb3RvY29sIHRlc3RiaW5hcnlwcm90b2NvbC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RiaW5hcnlwcm90b2NvbCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0YmluYXJ5cHJvdG9jb2wgQ09NTUFORCB0ZXN0YmluYXJ5cHJvdG9jb2wpCisKK2FkZF9leGVjdXRhYmxlKHRlc3Rjb21wYWN0cHJvdG9jb2wgdGVzdGNvbXBhY3Rwcm90b2NvbC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3Rjb21wYWN0cHJvdG9jb2wgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGNvbXBhY3Rwcm90b2NvbCBDT01NQU5EIHRlc3Rjb21wYWN0cHJvdG9jb2wpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RidWZmZXJlZHRyYW5zcG9ydCB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IENPTU1BTkQgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0ZnJhbWVkdHJhbnNwb3J0IHRlc3RmcmFtZWR0cmFuc3BvcnQuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0ZnJhbWVkdHJhbnNwb3J0IHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RmcmFtZWR0cmFuc3BvcnQgQ09NTUFORCB0ZXN0ZnJhbWVkdHJhbnNwb3J0KQorCithZGRfZXhlY3V0YWJsZSh0ZXN0ZmR0cmFuc3BvcnQgdGVzdGZkdHJhbnNwb3J0LmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGZkdHJhbnNwb3J0IHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RmZHRyYW5zcG9ydCBDT01NQU5EIHRlc3RmZHRyYW5zcG9ydCkKKworYWRkX2V4ZWN1dGFibGUodGVzdG1lbW9yeWJ1ZmZlciB0ZXN0bWVtb3J5YnVmZmVyLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdG1lbW9yeWJ1ZmZlciB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0bWVtb3J5YnVmZmVyIENPTU1BTkQgdGVzdG1lbW9yeWJ1ZmZlcikKKworYWRkX2V4ZWN1dGFibGUodGVzdHNpbXBsZXNlcnZlciB0ZXN0c2ltcGxlc2VydmVyLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdHNpbXBsZXNlcnZlciB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0c2ltcGxlc2VydmVyIENPTU1BTkQgdGVzdHNpbXBsZXNlcnZlcikKKworYWRkX2V4ZWN1dGFibGUodGVzdGRlYnVncHJvdG8gdGVzdGRlYnVncHJvdG8uYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0ZGVidWdwcm90byB0ZXN0Z2VuYykKK2FkZF90ZXN0KE5BTUUgdGVzdGRlYnVncHJvdG8gQ09NTUFORCB0ZXN0ZGVidWdwcm90bykKKworYWRkX2V4ZWN1dGFibGUodGVzdG9wdGlvbmFscmVxdWlyZWQgdGVzdG9wdGlvbmFscmVxdWlyZWQuYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0b3B0aW9uYWxyZXF1aXJlZCB0ZXN0Z2VuYykKK2FkZF90ZXN0KE5BTUUgdGVzdG9wdGlvbmFscmVxdWlyZWQgQ09NTUFORCB0ZXN0b3B0aW9uYWxyZXF1aXJlZCkKKworaW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYyIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY19nbGliIikKKworYWRkX2V4ZWN1dGFibGUodGVzdHRocmlmdHRlc3QgdGVzdHRocmlmdHRlc3QuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3R0aHJpZnR0ZXN0IHRlc3RnZW5jKQorYWRkX3Rlc3QoTkFNRSB0ZXN0dGhyaWZ0dGVzdCBDT01NQU5EIHRlc3R0aHJpZnR0ZXN0KQorCisKK2lmKEJVSUxEX0NQUCkKKworICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9saWIvY3BwL3NyYyIpCisKKyAgICAjIENyZWF0ZSB0aGUgdGhyaWZ0IEMrKyB0ZXN0IGxpYnJhcnkKKyAgICBzZXQodGVzdGdlbmNfY3BwX1NPVVJDRVMKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5oCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorICAgICkKKworICAgIGFkZF9saWJyYXJ5KHRlc3RnZW5jX2NwcCBTVEFUSUMgJHt0ZXN0Z2VuY19jcHBfU09VUkNFU30pCisgICAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RnZW5jX2NwcCB0aHJpZnQpCisKKyAgICAjSEFDSzogdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwIGluY2x1ZGVzIFRocmlmdFRlc3QuaCB3aXRob3V0IGdlbi0qLyBwcmVmaXhlcworICAgICMgc28gd2UgaW5jbHVkZSBpdCBoZXJlCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNfZ2xpYiIpCisKKyAgICBhZGRfZXhlY3V0YWJsZSh0ZXN0dGhyaWZ0dGVzdGNsaWVudCB0ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHApCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3R0aHJpZnR0ZXN0Y2xpZW50IHRlc3RnZW5jIHRlc3RnZW5jX2NwcCAke1pMSUJfTElCUkFSSUVTfSkKKyAgICBhZGRfdGVzdChOQU1FIHRlc3R0aHJpZnR0ZXN0Y2xpZW50IENPTU1BTkQgdGVzdHRocmlmdHRlc3RjbGllbnQpCisKK2VuZGlmKEJVSUxEX0NQUCkKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRW51bVRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3QuaAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKKyMgVE9ETzogQWRkIG1lbW9yeSBjaGVja3MgdXNpbmcgY3Rlc3RfbWVtY2hlY2sgb3Igc2ltaWxhcgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L0NvbnRhaW5lclRlc3QudGhyaWZ0IGIvbGliL2NfZ2xpYi90ZXN0L0NvbnRhaW5lclRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MmE5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvQ29udGFpbmVyVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgY19nbGliIFRUZXN0CisKK3R5cGVkZWYgbGlzdDxzdHJpbmc+IFN0cmluZ0xpc3QKK3R5cGVkZWYgbGlzdDxTdHJpbmdMaXN0PiBMaXN0U3RyaW5nTGlzdAorCitzdHJ1Y3QgQ29udGFpbmVyc1dpdGhEZWZhdWx0VmFsdWVzIHsKKyAgMTogbGlzdDxzdHJpbmc+IFN0cmluZ0xpc3QgPSBbICJBcGFjaGUiLCAiVGhyaWZ0IiBdOworfQorCitzZXJ2aWNlIENvbnRhaW5lclNlcnZpY2UgeworICB2b2lkIHJlY2VpdmVTdHJpbmdMaXN0KDE6IGxpc3Q8c3RyaW5nPiBzdHJpbmdMaXN0KTsKKyAgbGlzdDxzdHJpbmc+IHJldHVyblN0cmluZ0xpc3QoKTsKKworICBsaXN0PGxpc3Q8c3RyaW5nPj4gcmV0dXJuTGlzdFN0cmluZ0xpc3QoKTsKKyAgTGlzdFN0cmluZ0xpc3QgcmV0dXJuVHlwZWRlZmRMaXN0U3RyaW5nTGlzdCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlOWQyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworU1VCRElSUyA9CisKK0JVSUxUX1NPVVJDRVMgPSBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCisKK0FNX0NQUEZMQUdTID0gLUkuLi9zcmMgLUkuL2dlbi1jX2dsaWIKK0FNX0NGTEFHUyA9IC1nIC1XYWxsIC1XZXh0cmEgLXBlZGFudGljICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykgXAorCUBHQ09WX0NGTEFHU0AKK0FNX0NYWEZMQUdTID0gJChBTV9DRkxBR1MpCitBTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAkKE9QRU5TU0xfTElCUykgQEdDT1ZfTERGTEFHU0AKKworY2hlY2tfUFJPR1JBTVMgPSBcCisgIHRlc3RzZXJpYWxpemF0aW9uIFwKKyAgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIFwKKyAgdGVzdGNvbnRhaW5lcnRlc3QgXAorICB0ZXN0dHJhbnNwb3J0c29ja2V0IFwKKyAgdGVzdHRyYW5zcG9ydHNzbHNvY2tldCBcCisgIHRlc3RiaW5hcnlwcm90b2NvbCBcCisgIHRlc3Rjb21wYWN0cHJvdG9jb2wgXAorICB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgXAorICB0ZXN0ZnJhbWVkdHJhbnNwb3J0IFwKKyAgdGVzdGZkdHJhbnNwb3J0IFwKKyAgdGVzdG1lbW9yeWJ1ZmZlciBcCisgIHRlc3RzdHJ1Y3QgXAorICB0ZXN0c2ltcGxlc2VydmVyIFwKKyAgdGVzdGRlYnVncHJvdG8gXAorICB0ZXN0b3B0aW9uYWxyZXF1aXJlZCBcCisgIHRlc3R0aHJpZnR0ZXN0CisKK2lmIFdJVEhfQ1BQCisgIEJVSUxUX1NPVVJDRVMgKz0gZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAorICBjaGVja19QUk9HUkFNUyArPSB0ZXN0dGhyaWZ0dGVzdGNsaWVudAorZW5kaWYKKwordGVzdHNlcmlhbGl6YXRpb25fU09VUkNFUyA9IHRlc3RzZXJpYWxpemF0aW9uLmMKK3Rlc3RzZXJpYWxpemF0aW9uX0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgbGlidGVzdGdlbmMubGEKKwordGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uX1NPVVJDRVMgPSB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYwordGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uX0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zdHJ1Y3QubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCisKK3Rlc3Rjb250YWluZXJ0ZXN0X1NPVVJDRVMgPSB0ZXN0Y29udGFpbmVydGVzdC5jCit0ZXN0Y29udGFpbmVydGVzdF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zdHJ1Y3QubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb2Nlc3Nvci5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXIubyBcCisJICBsaWJ0ZXN0Z2VuYy5sYQorCit0ZXN0dHJhbnNwb3J0c29ja2V0X1NPVVJDRVMgPSB0ZXN0dHJhbnNwb3J0c29ja2V0LmMKK3Rlc3R0cmFuc3BvcnRzb2NrZXRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKworCit0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0X1NPVVJDRVMgPSB0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKK3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCisKK3Rlc3RiaW5hcnlwcm90b2NvbF9TT1VSQ0VTID0gdGVzdGJpbmFyeXByb3RvY29sLmMKK3Rlc3RiaW5hcnlwcm90b2NvbF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCit0ZXN0Y29tcGFjdHByb3RvY29sX1NPVVJDRVMgPSB0ZXN0Y29tcGFjdHByb3RvY29sLmMKK3Rlc3Rjb21wYWN0cHJvdG9jb2xfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKwordGVzdGJ1ZmZlcmVkdHJhbnNwb3J0X1NPVVJDRVMgPSB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYwordGVzdGJ1ZmZlcmVkdHJhbnNwb3J0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisKK3Rlc3RmcmFtZWR0cmFuc3BvcnRfU09VUkNFUyA9IHRlc3RmcmFtZWR0cmFuc3BvcnQuYwordGVzdGZyYW1lZHRyYW5zcG9ydF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCit0ZXN0ZmR0cmFuc3BvcnRfU09VUkNFUyA9IHRlc3RmZHRyYW5zcG9ydC5jCit0ZXN0ZmR0cmFuc3BvcnRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfZmRfdHJhbnNwb3J0Lm8KKwordGVzdG1lbW9yeWJ1ZmZlcl9TT1VSQ0VTID0gdGVzdG1lbW9yeWJ1ZmZlci5jCit0ZXN0bWVtb3J5YnVmZmVyX0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubworCit0ZXN0c3RydWN0X1NPVVJDRVMgPSB0ZXN0c3RydWN0LmMKK3Rlc3RzdHJ1Y3RfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vCisKK3Rlc3RzaW1wbGVzZXJ2ZXJfU09VUkNFUyA9IHRlc3RzaW1wbGVzZXJ2ZXIuYwordGVzdHNpbXBsZXNlcnZlcl9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvY2Vzc29yLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYmluYXJ5X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlci5vCisKK3Rlc3RkZWJ1Z3Byb3RvX1NPVVJDRVMgPSB0ZXN0ZGVidWdwcm90by5jCit0ZXN0ZGVidWdwcm90b19MREFERCA9IGxpYnRlc3RnZW5jLmxhCisKK3Rlc3RvcHRpb25hbHJlcXVpcmVkX1NPVVJDRVMgPSB0ZXN0b3B0aW9uYWxyZXF1aXJlZC5jCit0ZXN0b3B0aW9uYWxyZXF1aXJlZF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgIGxpYnRlc3RnZW5jLmxhCisKK3Rlc3R0aHJpZnR0ZXN0X1NPVVJDRVMgPSB0ZXN0dGhyaWZ0dGVzdC5jCit0ZXN0dGhyaWZ0dGVzdF9MREFERCA9IGxpYnRlc3RnZW5jLmxhIFwKKyAgICAkKHRvcF9idWlsZGRpcikvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIubwordGVzdHRocmlmdHRlc3RfQ0ZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL3Rlc3QvY19nbGliL3NyYyAtSS4vZ2VuLWNfZ2xpYiAkKEdMSUJfQ0ZMQUdTKQorCit0ZXN0dGhyaWZ0dGVzdGNsaWVudF9TT1VSQ0VTID0gdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCit0ZXN0dGhyaWZ0dGVzdGNsaWVudF9DUFBGTEFHUyA9IC1JLi4vLi4vY3BwL3NyYyAkKEJPT1NUX0NQUEZMQUdTKSAtSS4vZ2VuLWNwcCAtSS4uL3NyYyAtSS4vZ2VuLWNfZ2xpYiAkKEdMSUJfQ0ZMQUdTKQordGVzdHRocmlmdHRlc3RjbGllbnRfTERBREQgPSAuLi8uLi9jcHAvLmxpYnMvbGlidGhyaWZ0LmxhIC4uL2xpYnRocmlmdF9jX2dsaWIubGEgbGlidGVzdGdlbmMubGEgbGlidGVzdGdlbmNwcC5sYQordGVzdHRocmlmdHRlc3RjbGllbnRfTERGTEFHUyA9IC1MLi4vLmxpYnMgLUwuLi8uLi9jcHAvLmxpYnMgJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKQorCitjaGVja19MVExJQlJBUklFUyA9IGxpYnRlc3RnZW5jLmxhCisKK2lmIFdJVEhfQ1BQCisgIGNoZWNrX0xUTElCUkFSSUVTICs9IGxpYnRlc3RnZW5jcHAubGEKK2VuZGlmCisKK25vZGlzdF9saWJ0ZXN0Z2VuY19sYV9TT1VSQ0VTID0gXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKK2xpYnRlc3RnZW5jX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKK2xpYnRlc3RnZW5jX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgLVduby11bnVzZWQtZnVuY3Rpb24KKworbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBcCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5oIFwKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oIFwKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKK2xpYnRlc3RnZW5jcHBfbGFfQ1BQRkxBR1MgPSAtSS4uLy4uL2NwcC9zcmMgJChCT09TVF9DUFBGTEFHUykgLUkuL2dlbi1jcHAKKworZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaDogQ29udGFpbmVyVGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAorCitnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYyBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oOiAuLi8uLi8uLi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CisKK2dlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaCA6IC4uLy4uLy4uL3Rlc3QvRW51bVRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKKworZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaDogLi4vLi4vLi4vdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAorCitnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaDogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CisKK2dlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcDogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK1RFU1RTID0gXAorICAkKGNoZWNrX1BST0dSQU1TKSBcCisgICQoY2hlY2tfU0NSSVBUUykKKworIyBnbG9iYWxseSBhZGRlZCB0byBhbGwgaW5zdGFuY2VzIG9mIHZhbGdyaW5kIGNhbGxzCisjIFZBTEdSSU5EX09QVFMgPSAtLXN1cHByZXNzaW9ucz1nbGliLnN1cHByZXNzCitWQUxHUklORF9PUFRTID0KKworIyBnbG9iYWxseSBhZGRlZCB0byBhbGwgbWVtY2hlY2sgY2FsbHMKK1ZBTEdSSU5EX01FTV9PUFRTID0gLS10b29sPW1lbWNoZWNrIFwKKyAgICAgICAgICAgICAgICAgICAgLS1udW0tY2FsbGVycz0xMCBcCisgICAgICAgICAgICAgICAgICAgICR7bXlleHRyYXZhbGdyaW5kbWVtb3B0c30KKworIyBnbG9iYWxseSBhZGRlZCB0byBhbGwgbGVha2NoZWNrIGNhbGxzCitWQUxHUklORF9MRUFLX09QVFMgPSAtLXRvb2w9bWVtY2hlY2sgXAorICAgICAgICAgICAgICAgICAgICAgLS1udW0tY2FsbGVycz0xMCBcCisgICAgICAgICAgICAgICAgICAgICAtLWxlYWstY2hlY2s9ZnVsbCBcCisgICAgICAgICAgICAgICAgICAgICAtLWxlYWstcmVzb2x1dGlvbj1oaWdoIFwKKyAgICAgICAgICAgICAgICAgICAgICR7bXlleHRyYXZhbGdyaW5kbGVha29wdHN9CisKK21lbWNoZWNrOiAkKGNoZWNrX1BST0dSQU1TKQorCUBmb3IgeCBpbiAkKGNoZWNrX1BST0dSQU1TKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAkKE1BS0UpIG1lbWNoZWNrLSQkeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgZG9uZQorCitsZWFrY2hlY2s6ICQoY2hlY2tfUFJPR1JBTVMpCisJQGZvciB4IGluICQoY2hlY2tfUFJPR1JBTVMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICQoTUFLRSkgbGVha2NoZWNrLSQkeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG9uZQorCittZW1jaGVjay0lOiAlCisJQGVjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIjsgICAgICAgICAgICAgICBcCisJZWNobyAiTUVNQ0hFQ0s6ICQ8IjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZWNobyAiQVJHUzogJHtWQUxHUklORF9PUFRTfSAke1ZBTEdSSU5EX01FTV9PUFRTfSAkeyQ8X1ZBTEdSSU5EX01FTV9PUFRTfSI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkkKExJQlRPT0wpIC0tbW9kZT1leGVjdXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgIHZhbGdyaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgJHtWQUxHUklORF9PUFRTfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgJHtWQUxHUklORF9NRU1fT1BUU30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgJHskPF9WQUxHUklORF9NRU1fT1BUU30gLi8kPAorCitsZWFrY2hlY2stJTogJQorCUBlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiI7ICAgICAgICAgICAgICBcCisJZWNobyAiTEVBS0NIRUNLOiAkPCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwllY2hvICJBUkdTOiAke1ZBTEdSSU5EX09QVFN9ICR7VkFMR1JJTkRfTEVBS19PUFRTfSAkeyQ8X1ZBTEdSSU5EX0xFQUtfT1BUU30iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJR19TTElDRT1hbHdheXMtbWFsbG9jICQoTElCVE9PTCkgLS1tb2RlPWV4ZWN1dGUgICAgICAgICAgICAgICAgIFwKKwkgIHZhbGdyaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAke1ZBTEdSSU5EX09QVFN9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICR7VkFMR1JJTkRfTEVBS19PUFRTfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgJHskPF9WQUxHUklORF9MRUFLX09QVFN9ICAuLyQ8CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIGdlbi1jX2dsaWIvKiBnZW4tY3BwLyoKKworQ0xFQU5GSUxFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqLmJiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKi5iYmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICouZGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqLmdjbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKi5nY2RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICouZ2NvdgorCitFWFRSQV9ESVNUID0gXAorICAgICAgICAgICAgIENNYWtlTGlzdHMudHh0IFwKKyAgICAgICAgICAgICBDb250YWluZXJUZXN0LnRocmlmdAorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvZ2xpYi5zdXBwcmVzcyBiL2xpYi9jX2dsaWIvdGVzdC9nbGliLnN1cHByZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMGU5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvZ2xpYi5zdXBwcmVzcwpAQCAtMCwwICsxLDY0IEBACit7CisgICBnX3R5cGVfaW5pdF8xCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46bWFsbG9jCisgICAuLi4KKyAgIGZ1bjpnX3R5cGVfaW5pdF93aXRoX2RlYnVnX2ZsYWdzCit9CisKK3sKKyAgIGdfdHlwZV9pbml0XzIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIC4uLgorICAgZnVuOmdfdHlwZV9pbml0X3dpdGhfZGVidWdfZmxhZ3MKK30KKworeworICAgZ190eXBlX2luaXRfMworICAgTWVtY2hlY2s6TGVhaworICAgZnVuOnJlYWxsb2MKKyAgIC4uLgorICAgZnVuOmdfdHlwZV9pbml0X3dpdGhfZGVidWdfZmxhZ3MKK30KKworeworICAgZ190eXBlX3JlZ2lzdGVyX3N0YXRpY18xCisgICBNZW1jaGVjazpMZWFrCisgICBmdW46cmVhbGxvYworICAgLi4uCisgICBmdW46Z190eXBlX3JlZ2lzdGVyX3N0YXRpYworfQorCit7CisgICBnX3R5cGVfcmVnaXN0ZXJfc3RhdHVjXzIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjptYWxsb2MKKyAgIGZ1bjpyZWFsbG9jCisgICBmdW46Z19yZWFsbG9jCisgICAuLi4KKyAgIGZ1bjpnX3R5cGVfcmVnaXN0ZXJfc3RhdGljCit9CisKK3sKKyAgIHR5cGVfY2xhc3NfaW5pdF9XbTEKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpnX21hbGxvYzAKKyAgIGZ1bjp0eXBlX2NsYXNzX2luaXRfV20KKyAgIGZ1bjpnX3R5cGVfY2xhc3NfcmVmCisgICAuLi4KKyAgIGZ1bjpnX29iamVjdF9uZXd2Cit9CisKK3sKKyAgIHR5cGVfY2xhc3NfaW5pdF9XbTIKKyAgIE1lbWNoZWNrOkxlYWsKKyAgIGZ1bjpjYWxsb2MKKyAgIGZ1bjpnX21hbGxvYzAKKyAgIGZ1bjp0eXBlX2NsYXNzX2luaXRfV20KKyAgIGZ1bjpnX3R5cGVfY2xhc3NfcmVmCisgICAuLi4KKyAgIGZ1bjp0eXBlX2NsYXNzX2luaXRfV20KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTM5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPgorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogQSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBjYW4gYmUgY3JlYXRlZC4uLiAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRIUklGVF9JU19BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCkpOworCisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2luaXRpYWxpemUgKHZvaWQpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbiA9IE5VTEw7CisgIGdpbnQzMiB0eXBlID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlRFUk5BTF9FUlJPUjsKKyAgZ2NoYXIgKm1lc3NhZ2UgPSAiRXhjZXB0aW9uIG1lc3NhZ2UiOworICBnaW50MzIgcmV0cmlldmVkX3R5cGUgPSAwOworICBnY2hhciAqcmV0cmlldmVkX21lc3NhZ2UgPSBOVUxMOworCisgIC8qIEEgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gaGFzICJ0eXBlIiBhbmQgIm1lc3NhZ2UiIHByb3BlcnRpZXMgdGhhdCBjYW4KKyAgICAgYmUgaW5pdGlhbGl6ZWQgYXQgb2JqZWN0IGNyZWF0aW9uICovCisgIHhjZXB0aW9uID0KKyAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0ICh4Y2VwdGlvbiAhPSBOVUxMKTsKKworICAvKiBBIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uJ3MgcHJvcGVydGllcyBjYW4gYmUgcmV0cmlldmVkICovCisgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sCisgICAgICAgICAgICAgICAgInR5cGUiLCAgICAmcmV0cmlldmVkX3R5cGUsCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAmcmV0cmlldmVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnQgKHJldHJpZXZlZF90eXBlID09IHR5cGUpOworICBnX2Fzc2VydCAocmV0cmlldmVkX21lc3NhZ2UgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAocmV0cmlldmVkX21lc3NhZ2UsID09LCBtZXNzYWdlKTsKKworICBnX2ZyZWUgKHJldHJpZXZlZF9tZXNzYWdlKTsKKyAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcHJvcGVydGllc190ZXN0ICh2b2lkKQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb24gPSBOVUxMOworICBnaW50MzIgcmV0cmlldmVkX3R5cGU7CisKKyAgeGNlcHRpb24gPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7CisKKyNkZWZpbmUgVEVTVF9UWVBFX1ZBTFVFKF90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHJpZXZlZF90eXBlID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAidHlwZSIsIF90eXBlLCBOVUxMKTsgICAgICAgICAgICAgICAgIFwKKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwgInR5cGUiLCAmcmV0cmlldmVkX3R5cGUsIE5VTEwpOyAgICAgICBcCisgIGdfYXNzZXJ0X2NtcGludCAocmV0cmlldmVkX3R5cGUsID09LCBfdHlwZSk7CisKKyAgLyogVGhlICJ0eXBlIiBwcm9wZXJ0eSBjYW4gYmUgc2V0IHRvIGFueSB2YWxpZCBUaHJpZnQgZXhjZXB0aW9uIHR5cGUgKi8KKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04pOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9NRVNTQUdFX1RZUEUpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfV1JPTkdfTUVUSE9EX05BTUUpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfQkFEX1NFUVVFTkNFX0lEKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX01JU1NJTkdfUkVTVUxUKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1BST1RPQ09MX0VSUk9SKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfVFJBTlNGT1JNKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfUFJPVE9DT0wpOworICBURVNUX1RZUEVfVkFMVUUgKFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUpOworCisvKiAiZ190ZXN0X2V4cGVjdF9tZXNzYWdlIiBpcyByZXF1aXJlZCBmb3IgdGhlIHByb3BlcnR5IHJhbmdlIHRlc3RzIGJlbG93IGJ1dCBpcworICAgbm90IHByZXNlbnQgaW4gR0xpYiBiZWZvcmUgdmVyc2lvbiAyLjM0ICovCisjaWYgKEdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzQsIDApKQorICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLAorICAgICAgICAgICAgICAgICJ0eXBlIiwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIFRoZSAidHlwZSIgcHJvcGVydHkgY2Fubm90IGJlIHNldCB0byBhIHZhbHVlIHRvbyBsb3cgKGxlc3MgdGhhbiB6ZXJvKSAqLworICBnX3Rlc3RfZXhwZWN0X21lc3NhZ2UgKCJHTGliLUdPYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdfTE9HX0xFVkVMX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlKm91dCBvZiByYW5nZSp0eXBlKiIpOworICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAidHlwZSIsIC0xLCBOVUxMKTsKKyAgZ190ZXN0X2Fzc2VydF9leHBlY3RlZF9tZXNzYWdlcyAoKTsKKworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLCAidHlwZSIsICZyZXRyaWV2ZWRfdHlwZSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0cmlldmVkX3R5cGUsICE9LCAtMSk7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0cmlldmVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgPT0sCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOKTsKKworICAvKiBUaGUgInR5cGUiIHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8gYSB2YWx1ZSB0b28gaGlnaCAoZ3JlYXRlciB0aGFuIHRoZQorICAgICBoaWdoZXN0IGRlZmluZWQgZXhjZXB0aW9uLXR5cGUgdmFsdWUpICovCisgIGdfdGVzdF9leHBlY3RfbWVzc2FnZSAoIkdMaWItR09iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR19MT0dfTEVWRUxfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUqb3V0IG9mIHJhbmdlKnR5cGUqIik7CisgIGdfb2JqZWN0X3NldCAoeGNlcHRpb24sICJ0eXBlIiwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9OLCBOVUxMKTsKKyAgZ190ZXN0X2Fzc2VydF9leHBlY3RlZF9tZXNzYWdlcyAoKTsKKworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLCAidHlwZSIsICZyZXRyaWV2ZWRfdHlwZSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAocmV0cmlldmVkX3R5cGUsICE9LCBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX04pOworICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLAorICAgICAgICAgICAgICAgICAgID09LAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTik7CisjZW5kaWYKKworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworfQorCitzdGF0aWMgdm9pZAordGVzdF9wcm9wZXJ0aWVzX21lc3NhZ2UgKHZvaWQpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbiA9IE5VTEw7CisgIGdjaGFyICptZXNzYWdlID0gIkV4Y2VwdGlvbiBtZXNzYWdlIjsKKyAgZ2NoYXIgKnJldHJpZXZlZF9tZXNzYWdlOworCisgIHhjZXB0aW9uID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIE5VTEwpOworCisgIC8qIFRoZSAibWVzc2FnZSIgcHJvcGVydHkgY2FuIGJlIHNldCB0byBOVUxMICovCisgIGdfb2JqZWN0X3NldCAoeGNlcHRpb24sICJtZXNzYWdlIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sICJtZXNzYWdlIiwgJnJldHJpZXZlZF9tZXNzYWdlLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHJldHJpZXZlZF9tZXNzYWdlID09IE5VTEwpOworCisgIC8qIFRoZSAibWVzc2FnZSIgcHJvcGVydHkgY2FuIGJlIHNldCB0byBhIHZhbGlkIHN0cmluZyAqLworICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAibWVzc2FnZSIsIG1lc3NhZ2UsIE5VTEwpOworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLCAibWVzc2FnZSIsICZyZXRyaWV2ZWRfbWVzc2FnZSwgTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoc3RyY21wIChyZXRyaWV2ZWRfbWVzc2FnZSwgbWVzc2FnZSksID09LCAwKTsKKworICBnX2ZyZWUgKHJldHJpZXZlZF9tZXNzYWdlKTsKKyAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi9Jbml0aWFsaXplIiwKKyAgICB0ZXN0X2luaXRpYWxpemUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uL1Byb3BlcnRpZXMvdGVzdCIsCisgICAgdGVzdF9wcm9wZXJ0aWVzX3Rlc3QpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uL1Byb3BlcnRpZXMvbWVzc2FnZSIsCisgICAgdGVzdF9wcm9wZXJ0aWVzX21lc3NhZ2UpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0ZjRmYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMKQEAgLTAsMCArMSw4NTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogRGlzYWJsZSBzdHJpbmctZnVuY3Rpb24gb3B0aW1pemF0aW9ucyB3aGVuIGdsaWJjIGlzIHVzZWQsIGFzIHRoZXNlIHByb2R1Y2UKKyAgIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHN0cmluZyBsZW5ndGggd2hlbiBhIHN0cmluZyBmdW5jdGlvbiBpcyB1c2VkIGluc2lkZQorICAgYSBjYWxsIHRvIGdfYXNzZXJ0ICgpICovCisjaWZkZWYgX19HTElCQ19fCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19OT19TVFJJTkdfSU5MSU5FUyAxCisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgorCisjZGVmaW5lIFRFU1RfQk9PTCBUUlVFCisjZGVmaW5lIFRFU1RfQllURSAxMjMKKyNkZWZpbmUgVEVTVF9JMTYgMTIzNDUKKyNkZWZpbmUgVEVTVF9JMzIgMTIzNDU2Nzg5MAorI2RlZmluZSBURVNUX0k2NCBHX0dJTlQ2NF9DT05TVEFOVCAoMTIzNDU2Nzg5MDEyMzQ1KQorI2RlZmluZSBURVNUX0RPVUJMRSAxMjM0NTY3ODkwLjEyMworI2RlZmluZSBURVNUX1NUUklORyAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIDEyMzQ1Njc4OTAhQCMkJV4mKigpIgorI2RlZmluZSBURVNUX1BPUlQgNTExOTkKKworc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKK2dpbnQzMgorbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaWYgKHRyYW5zcG9ydF9yZWFkX2NvdW50ICE9IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0CisgICAgICAmJiB0cmFuc3BvcnRfcmVhZF9lcnJvciA9PSAwKQorICB7CisgICAgdHJhbnNwb3J0X3JlYWRfY291bnQrKzsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKK2dib29sZWFuCitteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBpZiAodHJhbnNwb3J0X3dyaXRlX2NvdW50ICE9IHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdAorICAgICAgJiYgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID09IDApCisgIHsKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQrKzsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworI2RlZmluZSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIG15X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSBteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIgorI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKKyN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlCisKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChjb25zdCBpbnQgcG9ydCk7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIGNyZWF0ZSBhbiBvYmplY3QgYW5kIHRoZW4gZGVzdHJveSBpdCAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbml0aWFsaXplKHZvaWQpCit7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNvY2tldCAqdGVtcCA9IE5VTEw7CisKKyAgLyogY3JlYXRlIGEgVGhyaWZ0VHJhbnNwb3J0ICovCisgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOworICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgdXNpbmcgdGhlIFRyYW5zcG9ydCAqLworICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgIC8qIGZldGNoIHRoZSBwcm9wZXJ0aWVzICovCisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QocHJvdG9jb2wpLCAidHJhbnNwb3J0IiwgJnRlbXAsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodGVtcCk7CisKKyAgLyogY2xlYW4gdXAgbWVtb3J5ICovCisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfcHJpbWl0aXZlcyh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRiID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gKGdwb2ludGVyICopIFRFU1RfU1RSSU5HOworICBndWludDMyIGxlbiA9IHN0cmxlbiAoVEVTVF9TVFJJTkcpOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKHBvcnQpOworICAgIGV4aXQgKDApOworICB9IGVsc2UgeworICAgIC8qIHBhcmVudC4gIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKyAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5VHJhbnNwb3J0ICovCisgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworCisgICAgLyogdGVzdCB3cml0ZSBlcnJvcnMgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgVEVTVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCBiaW5hcnkgcGFydGlhbCBmYWlsdXJlICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2NvbXBsZXhfdHlwZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqdGIgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKHBvcnQpOworICAgIGV4aXQgKDApOworICB9IGVsc2UgeworICAgIC8qIHBhcmVudC4gIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKyAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5VHJhbnNwb3J0ICovCisgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogdGVzdCBzdHJ1Y3R1cmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IHdyaXRlIGVycm9yICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3IgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGZpZWxkICovCisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKKworICAgIC8qIHRlc3Qgd3JpdGVfZmllbGRfc3RvcCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBOVUxMKSA+IDApOworCisgICAgLyogd3JpdGUgYSBtYXAgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IDNyZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogdGVzdCAzcmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMjsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IG5lZ2F0aXZlIG1hcCBzaXplICovCisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEwLCBOVUxMKTsKKworICAgIC8qIHRlc3QgbGlzdCBvcGVyYXRpb25zICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbGlzdCAqLworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IG5lZ2F0aXZlIGxpc3Qgc2l6ZSAqLworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMTAsIE5VTEwpOworCisgICAgLyogdGVzdCBmaXJzdCB3cml0ZSBlcnJvciBvbiBhIGxpc3QgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3Igb24gYSBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbiBzKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiBpbnZhbGlkIHZlcnNpb24gKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMSwgTlVMTCkgPiAwKTsKKworICAgIC8qIHN6ID4gMCBmb3IgYSBtZXNzYWdlICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMSwgTlVMTCkgPiAwKTsKKworICAgIC8qIHNlbmQgYSB2YWxpZCBtZXNzYWdlICovCisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAweDgwMDEwMDAwLCBOVUxMKTsKKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICJ0ZXN0IiwgTlVMTCk7CisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAxLCBOVUxMKTsKKworICAgIC8qIGJyb2tlbiAybmQgcmVhZCAqLworICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMHg4MDAxMDAwMCwgTlVMTCk7CisKKyAgICAvKiBzZW5kIGEgYnJva2VuIDNyZCByZWFkICovCisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAweDgwMDEwMDAwLCBOVUxMKTsKKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICJ0ZXN0IiwgTlVMTCk7CisKKyAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPiAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiBzZW5kIGJyb2tlbiB3cml0ZXMgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDM7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9tYW55X2ZyYW1lcyAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqZnQgPSBOVUxMOworICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqdGIgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSAoZ3BvaW50ZXIgKikgVEVTVF9TVFJJTkc7CisgIGNvbnN0IGd1aW50MzIgbGVuID0gc3RybGVuIChURVNUX1NUUklORyk7CisgIGludCBwb3J0ID0gVEVTVF9QT1JUOworCisgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgIHRocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKHBvcnQpOworICAgIGV4aXQgKDApOworICB9IGVsc2UgeworICAgIC8qIHBhcmVudC4gIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKyAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisKKyAgICAvKiB3cmFwIGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICAgIGZ0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsIDEsIE5VTEwpOworICAgIGdfYXNzZXJ0IChmdCAhPSBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChmdCk7CisKKyAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgICAvKiBjcmVhdGUgYSBiaW5hcnkgcHJvdG9jb2wgKi8KKyAgICB0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGIpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPVUJMRSwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmIChmdCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmICh0Yik7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRicCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdib29sZWFuIHZhbHVlX2Jvb2xlYW4gPSBGQUxTRTsKKyAgZ2ludDggdmFsdWVfYnl0ZSA9IDA7CisgIGdpbnQxNiB2YWx1ZV8xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV8zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CisgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKKyAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOworICBndWludDMyIGxlbiA9IDA7CisgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRicCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworCisgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ieXRlLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfMTYsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgcGFydGlhbCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodGJwKTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRCaW5hcnlQcm90b2NvbCAqdGJwID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ2NoYXIgKnN0cnVjdF9uYW1lID0gTlVMTDsKKyAgZ2NoYXIgKmZpZWxkX25hbWUgPSBOVUxMOworICBnY2hhciAqbWVzc2FnZV9uYW1lID0gTlVMTDsKKyAgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsIGtleV90eXBlLCB2YWx1ZV90eXBlLCBmaWVsZF90eXBlOworICBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGU7CisgIGdpbnQ4IHZhbHVlID0gMDsKKyAgZ2ludDE2IGZpZWxkX2lkID0gMDsKKyAgZ3VpbnQzMiBzaXplID0gMDsKKyAgZ2ludDMyIHNlcWlkID0gMDsKKyAgZ2ludDMyIHZlcnNpb24gPSAwOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGJwKTsKKworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJnN0cnVjdF9uYW1lLCBOVUxMKTsKKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgZmlyc3QgcmVhZCBlcnJvciBvbiBhIGZpZWxkICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworCisgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGZpZWxkICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgZmllbGQgc3RvcCAqLworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKTsKKworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpOworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiB0ZXN0IDNyZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDI7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCAzcmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IG5lZ2F0aXZlIG1hcCBzaXplICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisKKyAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgTlVMTCk7CisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgcmVhZCBmYWlsdXJlICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgTlVMTCk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCBuZWdhdGl2ZSBsaXN0IHNpemUgZmFpbHVyZSAqLworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLCBOVUxMKTsKKworICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IHNldCBvcGVyYXRpb25zICovCisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgTlVMTCk7CisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogYnJva2VuIHJlYWQgKi8KKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIGludmFsaWQgcHJvdG9jb2wgdmVyc2lvbiAqLworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKworICAvKiBzeiA+IDAgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworCisgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19mcmVlIChtZXNzYWdlX25hbWUpOworCisgIC8qIGJyb2tlbiAybmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIGJyb2tlbiAzcmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDM7IC8qIHJlYWRfc3RyaW5nIGRvZXMgdHdvIHJlYWRzICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19mcmVlIChtZXNzYWdlX25hbWUpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAvKiBoYW5kbGUgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCisgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmVyc2lvbiwgTlVMTCk7CisKKyAgLyogaGFuZGxlIDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZlcnNpb24sIE5VTEwpOworICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIC8qIFRPRE86IGludmVzdGlnYXRlIGdfb2JqZWN0X3VucmVmICh0YnApOyAqLworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YnAgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwOworICBnaW50MTYgdmFsdWVfMTYgPSAwOworICBnaW50MzIgdmFsdWVfMzIgPSAwOworICBnaW50NjQgdmFsdWVfNjQgPSAwOworICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKKyAgZ3VpbnQzMiBsZW4gPSAwOworICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CisKKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDEsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGJwKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRicCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvSW5pdGlhbGl6ZSIsIHRlc3RfaW5pdGlhbGl6ZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlUHJpbWl0aXZlcyIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfcHJpbWl0aXZlcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlQ29tcGxleFR5cGVzIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9jb21wbGV4X3R5cGVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9SZWFkQW5kV3JpdGVNYW55RnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMDE4MDZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKworI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfQorCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyIKKworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CisKKy8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCit7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgZ3VpbnQgcl9idWZfc2l6ZSA9IDA7CisgIGd1aW50IHdfYnVmX3NpemUgPSAwOworCisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAob2JqZWN0KSwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsCisJCSJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCisJCSJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2Uodm9pZCkKK3sKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIHBpZF90IHBpZDsKKyAgaW50IHBvcnQgPSA1MTE5OTsKKyAgaW50IHN0YXR1czsKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwxKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisJLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCisJLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwkvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKKwkJCQlOVUxMKTsKKworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBpbnQgcG9ydCA9IDUxMTk5OworICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKwkvKiB3cml0ZSAxMCBieXRlcyAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisKKwkvKiB3cml0ZSAxIGJ5dGUgYXQgYSB0aW1lICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisKKwkvKiBvdmVyZmxvdyB0aGUgYnVmZmVyICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDIsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCisJLyogd3JpdGUgMSBieXRlIGFuZCBmbHVzaCAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCisJLyogd3JpdGUgYW5kIG92ZXJmbG93IGJ1ZmZlciB3aXRoIDIgc3lzdGVtIGNhbGxzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAzLCBOVUxMKTsKKworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGludCBpOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgaW50IGJ5dGVzID0gMDsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGd1Y2hhciBidWZbMTBdOyAvKiBhIGJ1ZmZlciAqLworICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKworICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCisJCQkgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorCQkJICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgLyogcmVhZCAxMCBieXRlcyAqLworICBieXRlcyA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KKyAgZ19hc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisKKyAgLyogcmVhZCAxIGJ5dGUgKi8KKyAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxLCBOVUxMKTsKKworICBieXRlcyA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDYsIE5VTEwpOworICBieXRlcyA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDIsIE5VTEwpOworICBieXRlcyA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEsIE5VTEwpOworCisgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3dyaXRlX2ZhaWwodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIGludCBwb3J0ID0gNTExOTg7CisgIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLworCisgIC8qIFNJR1BJUEUgd2hlbiBzZW5kIHRvIGRpc2Nvbm5lY3RlZCBzb2NrZXQgKi8KKyAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgICAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisKKyAgICAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJCSAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICAgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworCisgICAgICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLworICAgICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorCQkJICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisJCQkgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgICAgICAvKiBqdXN0IGNsb3NlIHNvY2tldCAqLworICAgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisKKworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKwkvKiByZWNvZ25pemUgZGlzY29ubmVjdGlvbiAqLworCXNsZWVwKDEpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IEZBTFNFKTsKKworCS8qIHdyaXRlIGFuZCBvdmVyZmxvdyBidWZmZXIgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CisKKwkvKiB3cml0ZSAxIGFuZCBmbHVzaCAqLworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOworCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YnVmZmVyZWR0cmFuc3BvcnQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RidWZmZXJlZHRyYW5zcG9ydC9PcGVuQW5kQ2xvc2UiLCB0ZXN0X29wZW5fYW5kX2Nsb3NlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RidWZmZXJlZHRyYW5zcG9ydC9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RidWZmZXJlZHRyYW5zcG9ydC9Xcml0ZUZhaWwiLCB0ZXN0X3dyaXRlX2ZhaWwpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNWFkNDkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYwpAQCAtMCwwICsxLDEyOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogRGlzYWJsZSBzdHJpbmctZnVuY3Rpb24gb3B0aW1pemF0aW9ucyB3aGVuIGdsaWJjIGlzIHVzZWQsIGFzIHRoZXNlIHByb2R1Y2UKKyAgIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHN0cmluZyBsZW5ndGggd2hlbiBhIHN0cmluZyBmdW5jdGlvbiBpcyB1c2VkIGluc2lkZQorICAgYSBjYWxsIHRvIGdfYXNzZXJ0ICgpICovCisjaWYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgXAorICAgICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZW5kaWYKKworI2lmZGVmIF9fR0xJQkNfXworI2RlZmluZSBfX05PX1NUUklOR19JTkxJTkVTIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisKKyNkZWZpbmUgVEVTVF9CT09MIFRSVUUKKyNkZWZpbmUgVEVTVF9CWVRFIDEyMworI2RlZmluZSBURVNUX0kxNiAxMjM0NQorI2RlZmluZSBURVNUX0kzMiAxMjM0NTY3ODkwCisjZGVmaW5lIFRFU1RfSTY0IDEyMzQ1Njc4OTAxMjM0NQorI2RlZmluZSBURVNUX05JMTYgKC0xMjM0NSkKKyNkZWZpbmUgVEVTVF9OSTMyICgtMTIzNDU2Nzg5MCkKKyNkZWZpbmUgVEVTVF9OSTY0ICgtMTIzNDU2Nzg5MDEyMzQ1KQorI2RlZmluZSBURVNUX0RPVUJMRSAxMjM0NTY3ODkwLjEyMworI2RlZmluZSBURVNUX1NUUklORyAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIDEyMzQ1Njc4OTAhQCMkJV4mKigpIgorI2RlZmluZSBURVNUX1BPUlQgNTExOTkKKworc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKK2dpbnQzMgorbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaWYgKHRyYW5zcG9ydF9yZWFkX2NvdW50ICE9IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0CisgICAgICAmJiB0cmFuc3BvcnRfcmVhZF9lcnJvciA9PSAwKQorICB7CisgICAgdHJhbnNwb3J0X3JlYWRfY291bnQrKzsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKK2dib29sZWFuCitteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBpZiAodHJhbnNwb3J0X3dyaXRlX2NvdW50ICE9IHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdAorICAgICAgJiYgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID09IDApCisgIHsKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQrKzsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworI2RlZmluZSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIG15X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSBteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYyIKKyN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCisjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpOworCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogY3JlYXRlIGFuIG9iamVjdCBhbmQgdGhlbiBkZXN0cm95IGl0ICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbml0aWFsaXplICh2b2lkKQoreworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0U29ja2V0ICp0ZW1wID0gTlVMTDsKKworICAvKiBjcmVhdGUgYSBUaHJpZnRUcmFuc3BvcnQgKi8KKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0UHJvdG9jb2wgdXNpbmcgdGhlIFRyYW5zcG9ydCAqLworICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICAvKiBmZXRjaCB0aGUgcHJvcGVydGllcyAqLworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChwcm90b2NvbCksICJ0cmFuc3BvcnQiLCAmdGVtcCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0ZW1wKTsKKworICAvKiBjbGVhbiB1cCBtZW1vcnkgKi8KKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9wcmltaXRpdmVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdENvbXBhY3RUcmFuc3BvcnQgKi8KKyAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfTkkxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX05JNjQsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworCisgICAgLyogdGVzdCB3cml0ZSBlcnJvcnMgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfTkkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX05JMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IGJpbmFyeSBwYXJ0aWFsIGZhaWx1cmUgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2NvbXBsZXhfdHlwZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdENvbXBhY3RUcmFuc3BvcnQgKi8KKyAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogdGVzdCBzdHJ1Y3R1cmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIGRlbHRhcyAqLworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLCAxLCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywgTlVMTCkgPT0gMSk7CisKKyAgICAvKiB0ZXN0IGZpZWxkcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIHN0cnVjdHMgKi8KKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBib29scyAqLworCisgICAgLyogZGVsdGFzICovCisgICAgLyogbm9uLWJvb2wgZmllbGQgLT4gYm9vbCBmaWVsZCAtPiBub24tYm9vbCBmaWVsZCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKworICAgIC8qIG5vIGRlbHRhcyAqLworICAgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisKKyAgICAvKiB0ZXN0IHdyaXRlIGVycm9yICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgZmllbGQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9ET1VCTEUsIE5VTEwpOworCisgICAgLyogdGVzdCB3cml0ZV9maWVsZF9zdG9wICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBOVUxMKSA+IDApOworCisgICAgLyogd3JpdGUgYSBtYXAgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IDFzdCByZWFkIGZhaWx1cmUgb24gbWFwLS0tbm90aGluZyB0byBkbyBvbiBvdXIgc2lkZSAqLworCisgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfRE9VQkxFLCBOVUxMKTsKKworICAgIC8qIHRlc3QgMXN0IHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IG5lZ2F0aXZlIG1hcCBzaXplICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKHRjLCAtMTAsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX0RPVUJMRSwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IGxpc3Qgb3BlcmF0aW9ucyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIGEgc21hbGwgbGlzdC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZCAqLworCisgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIGEgYmlnIGxpc3QtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGJpZyBsaXN0ICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHhmMCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IG5lZ2F0aXZlIGxpc3Qgc2l6ZSAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ZjAsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgLTEwLCBOVUxMKTsKKworICAgIC8qIHRlc3QgZmlyc3Qgd3JpdGUgZXJyb3Igb24gYSBzbWFsbCBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgYmlnIGxpc3QgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yIG9uIGEgYmlnIGxpc3QgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbiBzKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogaW52YWxpZCBwcm90b2NvbCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMCwgTlVMTCkgPiAwKTsKKworICAgIC8qIGludmFsaWQgdmVyc2lvbiAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAwLCBOVUxMKSA+IDApOworCisgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMHgwMXUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKHRjLCAxLCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAidGVzdCIsIE5VTEwpOworCisgICAgLyogYnJva2VuIDJuZCByZWFkICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsIE5VTEwpOworCisgICAgLyogc2VuZCBhIGJyb2tlbiAzcmQgcmVhZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMHgwMXUsIE5VTEwpOworCisgICAgLyogc2VuZCBhIGJyb2tlbiA0dGggcmVhZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMHgwMXUsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgMSwgTlVMTCk7CisKKyAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID4gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHNlbmQgYnJva2VuIHdyaXRlcyAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAyOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMzsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9tYW55X2ZyYW1lcyAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqZnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gKGdwb2ludGVyICopIFRFU1RfU1RSSU5HOworICBjb25zdCBndWludDMyIGxlbiA9IHN0cmxlbiAoVEVTVF9TVFJJTkcpOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCisgICAgLyogd3JhcCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgICBmdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgICBnX2Fzc2VydCAoZnQgIT0gTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZnQpOworCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgY29tcGFjdCBwcm90b2NvbCAqLworICAgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX05JMTYsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfTkk2NCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoZnQpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAodGMpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwLAorICAgIHppZ3phZ19wMTYgPSAwLCB6aWd6YWdfcDMyID0gMCwgemlnemFnX3A2NCA9IDAsCisgICAgemlnemFnX24xNiA9IDAsIHppZ3phZ19uMzIgPSAwLCB6aWd6YWdfbjY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlXzE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlXzMyID0gMDsKKyAgZ2ludDY0IHZhbHVlXzY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlX24xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV9uMzIgPSAwOworICBnaW50NjQgdmFsdWVfbjY0ID0gMDsKKyAgZ2RvdWJsZSB2YWx1ZV9kb3VibGUgPSAwOworICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2NoYXIgKmVtcHR5X3N0cmluZyA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IE5VTEw7CisgIGd1aW50MzIgbGVuID0gMDsKKyAgdm9pZCAqY29tcGFyYXRvciA9ICh2b2lkICopIFRFU1RfU1RSSU5HOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AzMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMzIgPT0gVEVTVF9OSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlX242NCA9PSBURVNUX05JNjQpOworICBnX2Fzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMzIgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDY0ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX24xNiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMzIgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjY0ID09IDMpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2J5dGUsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfMTYsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9uMTYsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlX24zMiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfbjY0LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogdGVzdCBwYXJ0aWFsIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKTsKKworICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh0Yyk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdjaGFyICpzdHJ1Y3RfbmFtZSA9IE5VTEw7CisgIGdjaGFyICpmaWVsZF9uYW1lID0gTlVMTDsKKyAgZ2NoYXIgKm1lc3NhZ2VfbmFtZSA9IE5VTEw7CisgIFRocmlmdFR5cGUgZWxlbWVudF90eXBlLCBrZXlfdHlwZSwgdmFsdWVfdHlwZSwgZmllbGRfdHlwZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIGdpbnQ4IHZhbHVlID0gMDsKKyAgZ2ludDE2IGZpZWxkX2lkID0gMDsKKyAgZ3VpbnQzMiBzaXplID0gMDsKKyAgZ2ludDMyIHNlcWlkID0gMDsKKyAgZ2ludDggdmVyc2lvbl9hbmRfdHlwZSA9IDA7CisgIGdpbnQ4IHByb3RvY29sX2lkID0gMDsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKworICAvKiB0ZXN0IHN0cnVjdCBvcGVyYXRpb25zICovCisKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmc3RydWN0X25hbWUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBkZWx0YXMgKi8KKworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDEpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE2KTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNyk7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNSk7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMzApOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gNDYpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDQ3KTsKKyAgZmllbGRfaWQgPSAwOworCisgIC8qIHRlc3QgZmllbGQgb3BlcmF0aW9ucyAqLworCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBzdHJ1Y3RzICovCisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxKTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNik7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RydWN0X25hbWUsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE3KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfbmFtZSwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTgpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE5KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTgpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDI1KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTcpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gYm9vbHMgKi8KKworICAvKiBkZWx0YXMgKi8KKyAgLyogbm9uLWJvb2wgZmllbGQgLT4gYm9vbCBmaWVsZCAtPiBub24tYm9vbCBmaWVsZCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisKKyAgLyogbm8gZGVsdGFzICovCisgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisKKyAgLyogdGVzdCBmaXJzdCByZWFkIGVycm9yIG9uIGEgZmllbGQgKi8KKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBmaWVsZCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCBmaWVsZCBzdG9wICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKTsKKworICAvKiB0ZXN0IG1hcCBvcGVyYXRpb25zICovCisKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLCAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIG1hcC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIHNpZGUgKi8KKworICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKworICAvKiB0ZXN0IGxpc3Qgb3BlcmF0aW9ucyAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3Qgc21hbGwgbGlzdCAxc3QgcmVhZCBmYWlsdXJlICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IGJpZyBsaXN0IDFzdCByZWFkIGZhaWx1cmUgKi8KKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgYmlnIGxpc3QgMm5kIHJlYWQgZmFpbHVyZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCBuZWdhdGl2ZSBsaXN0IHNpemUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiB0ZXN0IHNtYWxsIGxpc3QgMXN0IHdyaXRlIGZhaWx1cmUtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAvKiB0ZXN0IGJpZyBsaXN0IDFzdCB3cml0ZSBmYWlsdXJlLS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgLyogdGVzdCBiaWcgbGlzdCAybmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworCisgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbnMgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIGJyb2tlbiByZWFkICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogaW52YWxpZCBwcm90b2NvbCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisKKyAgLyogaW52YWxpZCB2ZXJzaW9uICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKworICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CisKKyAgLyogYnJva2VuIDJuZCByZWFkIG9uIGEgbWVzc2FnZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIGJyb2tlbiAzcmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDI7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiBicm9rZW4gNHRoIHJlYWQgb24gYSBtZXNzYWdlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAzOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19mcmVlIChtZXNzYWdlX25hbWUpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgLyogaGFuZGxlIDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIE5VTEwpOworCisgIC8qIGhhbmRsZSAzcmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZlcnNpb25fYW5kX3R5cGUsIE5VTEwpOworCisgIC8qIGhhbmRsZSA0dGggd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZlcnNpb25fYW5kX3R5cGUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyICh0YywgJnNlcWlkLCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjcCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIGdib29sZWFuIHZhbHVlX2Jvb2xlYW4gPSBGQUxTRTsKKyAgZ2ludDggdmFsdWVfYnl0ZSA9IDAsCisgICAgemlnemFnX3AxNiA9IDAsIHppZ3phZ19wMzIgPSAwLCB6aWd6YWdfcDY0ID0gMCwKKyAgICB6aWd6YWdfbjE2ID0gMCwgemlnemFnX24zMiA9IDAsIHppZ3phZ19uNjQgPSAwOworICBnaW50MTYgdmFsdWVfMTYgPSAwOworICBnaW50MzIgdmFsdWVfMzIgPSAwOworICBnaW50NjQgdmFsdWVfNjQgPSAwOworICBnaW50MTYgdmFsdWVfbjE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlX24zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV9uNjQgPSAwOworICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKKyAgZ3VpbnQzMiBsZW4gPSAwOworICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CisKKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDEsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRjcCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjcCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV9uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV9uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV9uNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AxNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworCisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMTYgPT0gVEVTVF9OSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlX24zMiA9PSBURVNUX05JMzIpOworICBnX2Fzc2VydCAodmFsdWVfbjY0ID09IFRFU1RfTkk2NCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDE2ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX3AzMiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wNjQgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjE2ID09IDMpOworICBnX2Fzc2VydCAoemlnemFnX24zMiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uNjQgPT0gMyk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKworICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh0Y3ApOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0Y29tcGFjdHByb3RvY29sL0luaXRpYWxpemUiLCB0ZXN0X2luaXRpYWxpemUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9SZWFkQW5kV3JpdGVQcmltaXRpdmVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX3ByaW1pdGl2ZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9SZWFkQW5kV3JpdGVDb21wbGV4VHlwZXMiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfcmVhZF9hbmRfd3JpdGVfY29tcGxleF90eXBlcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0Y29tcGFjdHByb3RvY29sL1JlYWRBbmRXcml0ZU1hbnlGcmFtZXMiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmM1MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaCIKKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNkZWZpbmUgVEVTVF9TRVJWRVJfSE9TVE5BTUUgImxvY2FsaG9zdCIKKyNkZWZpbmUgVEVTVF9TRVJWRVJfUE9SVCAgICAgOTA5MAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgVGhlIENvbnRhaW5lclNlcnZpY2UgaGFuZGxlciB3ZSdsbCB1c2UgZm9yIHRlc3RpbmcgKi8KKworR19CRUdJTl9ERUNMUworCitHVHlwZSB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfZ2V0X3R5cGUgKHZvaWQpOworCisjZGVmaW5lIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSIFwKKyAgKHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9nZXRfdHlwZSAoKSkKKworI2RlZmluZSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlcikpCisjZGVmaW5lIFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUl9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MpKQorI2RlZmluZSBJU19URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSKSkKKyNkZWZpbmUgSVNfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUl9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcykpCisKK3N0cnVjdCBfVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyIHsKKyAgVFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciBwYXJlbnRfaW5zdGFuY2U7CisKKyAgLyogcHJpdmF0ZSAqLworICBHUHRyQXJyYXkgKnN0cmluZ19saXN0OworfTsKK3R5cGVkZWYgc3RydWN0IF9UZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyOworCitzdHJ1Y3QgX1Rlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzIHsKKyAgVFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzIHBhcmVudF9jbGFzczsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MKKyAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3M7CisKK0dfRU5EX0RFQ0xTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0dfREVGSU5FX1RZUEUgKFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciwKKyAgICAgICAgICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlciwKKyAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIpCisKKy8qIEEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gYXBwZW5kIGNvcGllcyBvZiBzdHJpbmdzIHRvIGEgc3RyaW5nIGxpc3QgKi8KK3N0YXRpYyB2b2lkIGFwcGVuZF9zdHJpbmdfdG9fcHRyX2FycmF5IChncG9pbnRlciBlbGVtZW50LCBncG9pbnRlciBwdHJfYXJyYXkpCit7CisgIGdfcHRyX2FycmF5X2FkZCAoKEdQdHJBcnJheSAqKXB0cl9hcnJheSwgZ19zdHJkdXAgKChnY2hhciAqKWVsZW1lbnQpKTsKK30KKworLyogQWNjZXB0IGEgc3RyaW5nIGxpc3QgZnJvbSB0aGUgY2xpZW50IGFuZCBhcHBlbmQgaXRzIGNvbnRlbnRzIHRvIG91ciBpbnRlcm5hbAorICAgbGlzdCAqLworc3RhdGljIGdib29sZWFuCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmVjZWl2ZV9zdHJpbmdfbGlzdCAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdQdHJBcnJheSAqc3RyaW5nTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpzZWxmID0gVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSIChpZmFjZSk7CisKKyAgLyogQXBwZW5kIHRoZSBjbGllbnQncyBzdHJpbmdzIHRvIG91ciBvd24gaW50ZXJuYWwgc3RyaW5nIGxpc3QgKi8KKyAgZ19wdHJfYXJyYXlfZm9yZWFjaCAoKEdQdHJBcnJheSAqKXN0cmluZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9zdHJpbmdfdG9fcHRyX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdHJpbmdfbGlzdCk7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogUmV0dXJuIHRoZSBjb250ZW50cyBvZiBvdXIgaW50ZXJuYWwgc3RyaW5nIGxpc3QgdG8gdGhlIGNsaWVudCAqLworc3RhdGljIGdib29sZWFuCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX3N0cmluZ19saXN0IChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUHRyQXJyYXkgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAoaWZhY2UpOworCisgIC8qIFJldHVybiAoY29waWVzIG9mKSB0aGUgc3RyaW5ncyBjb250YWluZWQgaW4gb3VyIGxpc3QgKi8KKyAgZ19wdHJfYXJyYXlfZm9yZWFjaCAoc2VsZi0+c3RyaW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9zdHJpbmdfdG9fcHRyX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAqX3JldHVybik7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3QgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1B0ckFycmF5ICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAoaWZhY2UpOworICBHUHRyQXJyYXkgKm5lc3RlZF9saXN0OworCisgIC8qIFJldHVybiBhIGxpc3QgY29udGFpbmluZyBvdXIgbGlzdCBvZiBzdHJpbmdzICovCisgIG5lc3RlZF9saXN0CisgICAgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKChHRGVzdHJveU5vdGlmeSlnX3B0cl9hcnJheV91bnJlZik7CisgIGdfcHRyX2FycmF5X2FkZCAobmVzdGVkX2xpc3QsIHNlbGYtPnN0cmluZ19saXN0KTsKKyAgZ19wdHJfYXJyYXlfcmVmIChzZWxmLT5zdHJpbmdfbGlzdCk7CisKKyAgZ19wdHJfYXJyYXlfYWRkICgqX3JldHVybiwgbmVzdGVkX2xpc3QpOworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBnYm9vbGVhbgordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0IChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0TGlzdFN0cmluZ0xpc3QgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpzZWxmID0gVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSIChpZmFjZSk7CisgIFRUZXN0U3RyaW5nTGlzdCAqbmVzdGVkX2xpc3Q7CisKKyAgLyogUmV0dXJuIGEgbGlzdCBjb250YWluaW5nIG91ciBsaXN0IG9mIHN0cmluZ3MgKi8KKyAgbmVzdGVkX2xpc3QKKyAgICA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoKEdEZXN0cm95Tm90aWZ5KWdfcHRyX2FycmF5X3VucmVmKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChuZXN0ZWRfbGlzdCwgc2VsZi0+c3RyaW5nX2xpc3QpOworICBnX3B0cl9hcnJheV9yZWYgKHNlbGYtPnN0cmluZ19saXN0KTsKKworICBnX3B0cl9hcnJheV9hZGQgKCpfcmV0dXJuLCBuZXN0ZWRfbGlzdCk7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KSB7CisgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZiA9IFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiAob2JqZWN0KTsKKworICAvKiBEZXN0cm95IG91ciBpbnRlcm5hbCBjb250YWluZXJzICovCisgIGdfcHRyX2FycmF5X3VucmVmIChzZWxmLT5zdHJpbmdfbGlzdCk7CisgIHNlbGYtPnN0cmluZ19saXN0ID0gTlVMTDsKKworICBHX09CSkVDVF9DTEFTUyAodGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3BhcmVudF9jbGFzcyktPgorICAgIGZpbmFsaXplIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2luaXQgKFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqc2VsZikKK3sKKyAgLyogQ3JlYXRlIG91ciBpbnRlcm5hbCBjb250YWluZXJzICovCisgIHNlbGYtPnN0cmluZ19saXN0ID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jIChnX2ZyZWUpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2NsYXNzX2luaXQgKFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzICprbGFzcykKK3sKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgVFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzICpwYXJlbnRfY2xhc3MgPQorICAgIFRfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfZmluYWxpemU7CisKKyAgcGFyZW50X2NsYXNzLT5yZWNlaXZlX3N0cmluZ19saXN0ID0KKyAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmVjZWl2ZV9zdHJpbmdfbGlzdDsKKyAgcGFyZW50X2NsYXNzLT5yZXR1cm5fc3RyaW5nX2xpc3QgPQorICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fc3RyaW5nX2xpc3Q7CisgIHBhcmVudF9jbGFzcy0+cmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3QgPQorICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fbGlzdF9zdHJpbmdfbGlzdDsKKyAgcGFyZW50X2NsYXNzLT5yZXR1cm5fdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdCA9CisgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBPdXIgdGVzdCBzZXJ2ZXIsIGRlY2xhcmVkIGdsb2JhbGx5IHNvIHdlIGNhbiBhY2Nlc3MgaXQgd2l0aGluIGEgc2lnbmFsCisgICBoYW5kbGVyICovCitUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IE5VTEw7CisKKy8qIEEgc2lnbmFsIGhhbmRsZXIgdXNlZCB0byBkZXRlY3Qgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyAodGhlIHRlc3Qgc3VpdGUpIGhhcworICAgZXhpdGVkIHNvIHdlIGtub3cgdG8gc2h1dCBkb3duIHRoZSBzZXJ2ZXIgYW5kIHRlcm1pbmF0ZSBvdXJzZWx2ZXMgKi8KK3N0YXRpYyB2b2lkCitzaWdjaGxkX2hhbmRsZXIgKGludCBzaWduYWxfbnVtYmVyKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2lnbmFsX251bWJlcik7CisKKyAgLyogVGhlIGNoaWxkIHByb2Nlc3MgKHRoZSB0ZXN0cykgaGFzIGV4aXRlZCBvciBiZWVuIHRlcm1pbmF0ZWQ7IHNodXQgZG93biB0aGUKKyAgICAgc2VydmVyIGdyYWNlZnVsbHkgKi8KKyAgaWYgKHNlcnZlciAhPSBOVUxMKQorICAgIHRocmlmdF9zZXJ2ZXJfc3RvcCAoc2VydmVyKTsKK30KKworLyogQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyBhIHRlc3QgY2FzZSBhZ2FpbnN0IGEgbmV3bHkgY29uc3RydWN0ZWQKKyAgIHNlcnZpY2UgY2xpZW50ICovCitzdGF0aWMgdm9pZAorZXhlY3V0ZV93aXRoX3NlcnZpY2VfY2xpZW50ICh2b2lkICgqdGVzdF9jYXNlKShUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiopKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbDsKKworICBUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqY2xpZW50OworCisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIC8qIENyZWF0ZSBhIGNsaWVudCB3aXRoIHdoaWNoIHRvIGFjY2VzcyB0aGUgc2VydmVyICovCisgIHNvY2tldCAgICA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsIFRFU1RfU0VSVkVSX0hPU1ROQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIFRFU1RfU0VSVkVSX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHByb3RvY29sICA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcik7CisgIGdfYXNzZXJ0X25vX2Vycm9yIChlcnJvcik7CisKKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9DT05UQUlORVJfU0VSVklDRV9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgIHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBFeGVjdXRlIHRoZSB0ZXN0IGFnYWluc3QgdGhpcyBjbGllbnQgKi8KKyAgKCp0ZXN0X2Nhc2UpKGNsaWVudCwgJmVycm9yKTsKKyAgZ19hc3NlcnRfbm9fZXJyb3IgKGVycm9yKTsKKworICAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcnNfd2l0aF9kZWZhdWx0X3ZhbHVlcyAodm9pZCkKK3sKKyAgVFRlc3RDb250YWluZXJzV2l0aERlZmF1bHRWYWx1ZXMgKmRlZmF1bHRfdmFsdWVzOworICBHUHRyQXJyYXkgKnN0cmluZ19saXN0OworCisgIC8qIEZldGNoIGEgbmV3IENvbnRhaW5lcnNXaXRoRGVmYXVsdFZhbHVlcyBzdHJ1Y3QgYW5kIGl0cyBTdHJpbmdMaXN0IG1lbWJlciAqLworICBkZWZhdWx0X3ZhbHVlcyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQ09OVEFJTkVSU19XSVRIX0RFRkFVTFRfVkFMVUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoZGVmYXVsdF92YWx1ZXMsCisgICAgICAgICAgICAgICAgIlN0cmluZ0xpc3QiLCAmc3RyaW5nX2xpc3QsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBsaXN0IGhhcyBiZWVuIHBvcHVsYXRlZCB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlcyAqLworICBnX2Fzc2VydF9jbXBpbnQgKHN0cmluZ19saXN0LT5sZW4sID09LCAyKTsKKyAgZ19hc3NlcnRfY21wc3RyICgoKGdjaGFyICoqKXN0cmluZ19saXN0LT5wZGF0YSlbMF0sID09LCAiQXBhY2hlIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoKChnY2hhciAqKilzdHJpbmdfbGlzdC0+cGRhdGEpWzFdLCA9PSwgIlRocmlmdCIpOworCisgIGdfcHRyX2FycmF5X3VucmVmIChzdHJpbmdfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChkZWZhdWx0X3ZhbHVlcyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3N0cmluZ19saXN0X2lubmVyIChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdjaGFyICp0ZXN0X2RhdGFbXSA9IHsgIm9uZSIsICJ0d28iLCAidGhyZWUiIH07CisKKyAgR1B0ckFycmF5ICpvdXRnb2luZ19zdHJpbmdfbGlzdDsKKyAgR1B0ckFycmF5ICppbmNvbWluZ19zdHJpbmdfbGlzdDsKKyAgZ3VpbnQgaW5kZXg7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworCisgIC8qIFByZXBhcmUgb3VyIHRlc3QgZGF0YSAob3VyIHN0cmluZyBsaXN0IHRvIHNlbmQpICovCisgIG91dGdvaW5nX3N0cmluZ19saXN0ID0gZ19wdHJfYXJyYXlfbmV3ICgpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAzOyBpbmRleCArPSAxKQorICAgIGdfcHRyX2FycmF5X2FkZCAob3V0Z29pbmdfc3RyaW5nX2xpc3QsICZ0ZXN0X2RhdGFbaW5kZXhdKTsKKworICAvKiBTZW5kIG91ciBkYXRhIHRvIHRoZSBzZXJ2ZXIgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHNhbWUgZGF0YSBiYWNrIG9uCisgICAgIHJldHJpZXZlICovCisgIGdfYXNzZXJ0CisgICAgKHRfdGVzdF9jb250YWluZXJfc2VydmljZV9jbGllbnRfcmVjZWl2ZV9zdHJpbmdfbGlzdCAoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGdvaW5nX3N0cmluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSAmJgorICAgICAqZXJyb3IgPT0gTlVMTCk7CisKKyAgaW5jb21pbmdfc3RyaW5nX2xpc3QgPSBnX3B0cl9hcnJheV9uZXcgKCk7CisgIGdfYXNzZXJ0CisgICAgKHRfdGVzdF9jb250YWluZXJfc2VydmljZV9jbGllbnRfcmV0dXJuX3N0cmluZ19saXN0IChjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5jb21pbmdfc3RyaW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgJiYKKyAgICAgKmVycm9yID09IE5VTEwpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgdHdvIGxpc3RzIGFyZSBlcXVpdmFsZW50ICovCisgIGdfYXNzZXJ0X2NtcGludCAoaW5jb21pbmdfc3RyaW5nX2xpc3QtPmxlbiwgPT0sIG91dGdvaW5nX3N0cmluZ19saXN0LT5sZW4pOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpbmNvbWluZ19zdHJpbmdfbGlzdC0+bGVuOyBpbmRleCArPSAxKQorICAgIGdfYXNzZXJ0X2NtcHN0ciAoKChnY2hhciAqKilpbmNvbWluZ19zdHJpbmdfbGlzdC0+cGRhdGEpW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgID09LAorICAgICAgICAgICAgICAgICAgICAgKChnY2hhciAqKilvdXRnb2luZ19zdHJpbmdfbGlzdC0+cGRhdGEpW2luZGV4XSk7CisKKyAgLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGluY29taW5nX3N0cmluZ19saXN0KTsKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKG91dGdvaW5nX3N0cmluZ19saXN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2Vfc3RyaW5nX2xpc3QgKHZvaWQpCit7CisgICAgZXhlY3V0ZV93aXRoX3NlcnZpY2VfY2xpZW50ICh0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3N0cmluZ19saXN0X2lubmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfbGlzdF9zdHJpbmdfbGlzdF9pbm5lciAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIEdQdHJBcnJheSAqaW5jb21pbmdfbGlzdDsKKyAgR1B0ckFycmF5ICpuZXN0ZWRfbGlzdDsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisKKyAgLyogUmVjZWl2ZSBhIGxpc3Qgb2Ygc3RyaW5nIGxpc3RzIGZyb20gdGhlIHNlcnZlciAqLworICBpbmNvbWluZ19saXN0ID0KKyAgICBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKChHRGVzdHJveU5vdGlmeSlnX3B0cl9hcnJheV91bnJlZik7CisgIGdfYXNzZXJ0CisgICAgKHRfdGVzdF9jb250YWluZXJfc2VydmljZV9jbGllbnRfcmV0dXJuX2xpc3Rfc3RyaW5nX2xpc3QgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluY29taW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSAmJgorICAgICAqZXJyb3IgPT0gTlVMTCk7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBsaXN0IGFuZCBpdHMgY29udGVudHMgYXJlIHZhbGlkICovCisgIGdfYXNzZXJ0X2NtcGludCAoaW5jb21pbmdfbGlzdC0+bGVuLCA+LCAwKTsKKworICBuZXN0ZWRfbGlzdCA9IChHUHRyQXJyYXkgKilnX3B0cl9hcnJheV9pbmRleCAoaW5jb21pbmdfbGlzdCwgMCk7CisgIGdfYXNzZXJ0IChuZXN0ZWRfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChuZXN0ZWRfbGlzdC0+bGVuLCA+PSwgMCk7CisKKyAgLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGluY29taW5nX2xpc3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9saXN0X3N0cmluZ19saXN0ICh2b2lkKQoreworICBleGVjdXRlX3dpdGhfc2VydmljZV9jbGllbnQgKHRlc3RfY29udGFpbmVyX3NlcnZpY2VfbGlzdF9zdHJpbmdfbGlzdF9pbm5lcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3RfaW5uZXIgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICpjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUVGVzdExpc3RTdHJpbmdMaXN0ICppbmNvbWluZ19saXN0OworICBUVGVzdFN0cmluZ0xpc3QgKm5lc3RlZF9saXN0OworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKworICAvKiBSZWNlaXZlIGEgbGlzdCBvZiBzdHJpbmcgbGlzdHMgZnJvbSB0aGUgc2VydmVyICovCisgIGluY29taW5nX2xpc3QgPQorICAgIGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoKEdEZXN0cm95Tm90aWZ5KWdfcHRyX2FycmF5X3VucmVmKTsKKyAgZ19hc3NlcnQKKyAgICAodF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2NsaWVudF9yZXR1cm5fbGlzdF9zdHJpbmdfbGlzdCAoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5jb21pbmdfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpICYmCisgICAgICplcnJvciA9PSBOVUxMKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIGxpc3QgYW5kIGl0cyBjb250ZW50cyBhcmUgdmFsaWQgKi8KKyAgZ19hc3NlcnRfY21waW50IChpbmNvbWluZ19saXN0LT5sZW4sID4sIDApOworCisgIG5lc3RlZF9saXN0ID0gKFRUZXN0U3RyaW5nTGlzdCAqKWdfcHRyX2FycmF5X2luZGV4IChpbmNvbWluZ19saXN0LCAwKTsKKyAgZ19hc3NlcnQgKG5lc3RlZF9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKG5lc3RlZF9saXN0LT5sZW4sID49LCAwKTsKKworICAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworICBnX3B0cl9hcnJheV91bnJlZiAoaW5jb21pbmdfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3QgKHZvaWQpCit7CisgIGV4ZWN1dGVfd2l0aF9zZXJ2aWNlX2NsaWVudAorICAgICh0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3RfaW5uZXIpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgcGlkX3QgcGlkOworICBpbnQgc3RhdHVzOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICAvKiBGb3JrIHRvIHJ1biBvdXIgdGVzdCBzdWl0ZSBpbiBhIGNoaWxkIHByb2Nlc3MgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnRfY21waW50IChwaWQsID49LCAwKTsKKworICBpZiAocGlkID09IDApIHsgICAgLyogVGhlIGNoaWxkIHByb2Nlc3MgKi8KKyAgICAvKiBXYWl0IGEgbW9tZW50IGZvciB0aGUgc2VydmVyIHRvIGZpbmlzaCBzdGFydGluZyAqLworICAgIHNsZWVwICgxKTsKKworICAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgICAgZ190ZXN0X2FkZF9mdW5jCisgICAgICAoIi90ZXN0Y29udGFpbmVydGVzdC9Db250YWluZXJUZXN0L1N0cnVjdHMvQ29udGFpbmVyc1dpdGhEZWZhdWx0VmFsdWVzIiwKKyAgICAgICB0ZXN0X2NvbnRhaW5lcnNfd2l0aF9kZWZhdWx0X3ZhbHVlcyk7CisgICAgZ190ZXN0X2FkZF9mdW5jCisgICAgICAoIi90ZXN0Y29udGFpbmVydGVzdC9Db250YWluZXJUZXN0L1NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UvU3RyaW5nTGlzdCIsCisgICAgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9zdHJpbmdfbGlzdCk7CisgICAgZ190ZXN0X2FkZF9mdW5jCisgICAgICAoIi90ZXN0Y29udGFpbmVydGVzdC9Db250YWluZXJUZXN0L1NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UvTGlzdFN0cmluZ0xpc3QiLAorICAgICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfbGlzdF9zdHJpbmdfbGlzdCk7CisgICAgZ190ZXN0X2FkZF9mdW5jCisgICAgICAoIi90ZXN0Y29udGFpbmVydGVzdC9Db250YWluZXJUZXN0L1NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UvVHlwZWRlZmRMaXN0U3RyaW5nTGlzdCIsCisgICAgICAgdGVzdF9jb250YWluZXJfc2VydmljZV90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0KTsKKworICAgIC8qIFJ1biB0aGUgdGVzdHMgYW5kIG1ha2UgdGhlIHJlc3VsdCBhdmFpbGFibGUgdG8gb3VyIHBhcmVudCBwcm9jZXNzICovCisgICAgX2V4aXQgKGdfdGVzdF9ydW4gKCkpOworICB9CisgIGVsc2UgeworICAgIFRUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKmhhbmRsZXI7CisgICAgVFRlc3RDb250YWluZXJTZXJ2aWNlUHJvY2Vzc29yICpwcm9jZXNzb3I7CisKKyAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQ7CisgICAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqdHJhbnNwb3J0X2ZhY3Rvcnk7CisgICAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpwcm90b2NvbF9mYWN0b3J5OworCisgICAgc3RydWN0IHNpZ2FjdGlvbiBzaWdjaGxkX2FjdGlvbjsKKworICAgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICAgIGludCBleGl0X3N0YXR1cyA9IDE7CisKKyAgICAvKiBUcmFwIHRoZSBldmVudCBvZiB0aGUgY2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGluZyBzbyB3ZSBrbm93IHRvIHN0b3AgdGhlCisgICAgICAgc2VydmVyIGFuZCBleGl0ICovCisgICAgbWVtc2V0ICgmc2lnY2hsZF9hY3Rpb24sIDAsIHNpemVvZiAoc2lnY2hsZF9hY3Rpb24pKTsKKyAgICBzaWdjaGxkX2FjdGlvbi5zYV9oYW5kbGVyID0gc2lnY2hsZF9oYW5kbGVyOworICAgIHNpZ2NobGRfYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOworICAgIHNpZ2FjdGlvbiAoU0lHQ0hMRCwgJnNpZ2NobGRfYWN0aW9uLCBOVUxMKTsKKworICAgIC8qIENyZWF0ZSBvdXIgdGVzdCBzZXJ2ZXIgKi8KKyAgICBoYW5kbGVyID0gZ19vYmplY3RfbmV3IChUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBwcm9jZXNzb3IgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0NPTlRBSU5FUl9TRVJWSUNFX1BST0NFU1NPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGVyIiwgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBURVNUX1NFUlZFUl9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICBzZXJ2ZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc29yIiwgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl90cmFuc3BvcnQiLCAgICAgICAgIHNlcnZlcl90cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCAgdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSIsICAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSIsICBwcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAvKiBTdGFydCB0aGUgc2VydmVyICovCisgICAgdGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoc2VydmVyLCAmZXJyb3IpOworCisgICAgLyogTWFrZSBzdXJlIHRoZSBzZXJ2ZXIgc3RvcHBlZCBvbmx5IGJlY2F1c2UgaXQgd2FzIGludGVycnVwdGVkIChieSB0aGUKKyAgICAgICBjaGlsZCBwcm9jZXNzIHRlcm1pbmF0aW5nKSAqLworICAgIGdfYXNzZXJ0KCFlcnJvciB8fCBnX2Vycm9yX21hdGNoZXMoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0FDQ0VQVCkpOworCisgICAgLyogRnJlZSBvdXIgcmVzb3VyY2VzICovCisgICAgZ19jbGVhcl9vYmplY3QgKCZzZXJ2ZXIpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmcHJvdG9jb2xfZmFjdG9yeSk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZ0cmFuc3BvcnRfZmFjdG9yeSk7CisgICAgZ19jbGVhcl9vYmplY3QgKCZzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnByb2Nlc3Nvcik7CisgICAgZ19jbGVhcl9vYmplY3QgKCZoYW5kbGVyKTsKKworICAgIC8qIFdhaXQgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGNvbXBsZXRlIGFuZCByZXR1cm4gaXRzIGV4aXQgc3RhdHVzICovCisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgaWYgKFdJRkVYSVRFRCAoc3RhdHVzKSkKKyAgICAgIGV4aXRfc3RhdHVzID0gV0VYSVRTVEFUVVMgKHN0YXR1cyk7CisKKyAgICByZXR1cm4gZXhpdF9zdGF0dXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5YTQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90by5jCkBAIC0wLDAgKzEsOTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg1CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmgiCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmgiCisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfZG91Ymxlc19jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogQSBEb3VibGVzIHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZC4uLiAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0RPVUJMRVMsIE5VTEwpOworCisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfRE9VQkxFUyAob2JqZWN0KSk7CisKKyAgLyogLi4uYW5kIGRlc3Ryb3llZCAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19kb3VibGVzX2luaXRpYWxpemUgKHZvaWQpCit7CisgIFRUZXN0RG91YmxlcyAqZG91YmxlcyA9IE5VTEw7CisgIGdkb3VibGUgbmFuOworICBnZG91YmxlIGluZjsKKyAgZ2RvdWJsZSBuZWdpbmY7CisgIGdkb3VibGUgcmVwZWF0aW5nOworICBnZG91YmxlIGJpZzsKKyAgZ2RvdWJsZSB0aW55OworICBnZG91YmxlIHplcm87CisgIGdkb3VibGUgbmVnemVybzsKKworICAvKiBOb3RlIHRoZXJlIHNlZW1zIHRvIGJlIG5vIHdheSB0byBnZXQgbm90LWEtbnVtYmVyICgiTkFOIikgdmFsdWVzIHBhc3QKKyAgICAgR09iamVjdCdzIHJhbmdlLWNoZWNraW5nLCBzbyB0aGF0IHBvcnRpb24gb2YgdGhlIHRlc3QgaGFzIGJlZW4gY29tbWVudGVkCisgICAgIG91dCBiZWxvdy4gKi8KKworICAvKiBBIERvdWJsZXMgc3RydWN0dXJlJ3MgbWVtYmVycyBhcmUgYXZhaWxhYmxlIGFzIEdPYmplY3QgcHJvcGVydGllcworICAgICB0aGF0IGNhbiBiZSBpbml0aWFsaXplZCBhdCBjb25zdHJ1Y3Rpb24uLi4gKi8KKyAgZG91YmxlcyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfRE9VQkxFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIm5hbiIsICAgICAgMCAqIElORklOSVRZLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5mIiwgICAgICAgICAgSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdpbmYiLCAgICAgIC1JTkZJTklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGluZyIsICAgICAxLjAgLyAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYmlnIiwgICAgICAgR19NQVhET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW55IiwgICAgICAgICAgMTBFLTEwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInplcm8iLCAgICAgICAgICAxLjAgKiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnemVybyIsICAgICAgLTEuMCAqIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0IChkb3VibGVzICE9IE5VTEwpOworCisgIC8qIC4uLmFuZCBsYXRlciByZXRyaWV2ZWQgKi8KKyAgZ19vYmplY3RfZ2V0IChkb3VibGVzLAorICAgICAgICAgICAgICAgICJuYW4iLCAgICAgICAmbmFuLAorICAgICAgICAgICAgICAgICJpbmYiLCAgICAgICAmaW5mLAorICAgICAgICAgICAgICAgICJuZWdpbmYiLCAgICAmbmVnaW5mLAorICAgICAgICAgICAgICAgICJyZXBlYXRpbmciLCAmcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICJiaWciLCAgICAgICAmYmlnLAorICAgICAgICAgICAgICAgICJ0aW55IiwgICAgICAmdGlueSwKKyAgICAgICAgICAgICAgICAiemVybyIsICAgICAgJnplcm8sCisgICAgICAgICAgICAgICAgIm5lZ3plcm8iLCAgICZuZWd6ZXJvLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIGdfYXNzZXJ0X2NtcGludCAoaXNuYW4gKG5hbiksICAgICE9LCAgMCk7ICovCisgIGdfYXNzZXJ0X2NtcGludCAoaXNpbmYgKGluZiksICAgID09LCAgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoaXNpbmYgKG5lZ2luZiksID09LCAtMSk7CisKKyAgZ19hc3NlcnRfY21wZmxvYXQgKHJlcGVhdGluZywgPT0sICAgICAxLjAgLyAzKTsKKyAgZ19hc3NlcnRfY21wZmxvYXQgKGJpZywgICAgICAgPT0sIEdfTUFYRE9VQkxFKTsKKyAgZ19hc3NlcnRfY21wZmxvYXQgKHRpbnksICAgICAgPT0sICAgICAxMEUtMTAxKTsKKyAgZ19hc3NlcnRfY21wZmxvYXQgKHplcm8sICAgICAgPT0sICAgICAxLjAgKiAwKTsKKyAgZ19hc3NlcnRfY21wZmxvYXQgKG5lZ3plcm8sICAgPT0sICAgIC0xLjAgKiAwKTsKKworICBnX29iamVjdF91bnJlZiAoZG91Ymxlcyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgT25lT2ZFYWNoIHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZC4uLiAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX09ORV9PRl9FQUNIIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2luaXRpYWxpemVfZGVmYXVsdF92YWx1ZXMgKHZvaWQpCit7CisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaCA9IE5VTEw7CisgIGdpbnQgICBhX2JpdGU7CisgIGdpbnQgICBpbnRlZ2VyMTY7CisgIGdpbnQ2NCBpbnRlZ2VyNjQ7CisgIEdBcnJheSAqYnl0ZV9saXN0OworICBHQXJyYXkgKmkxNl9saXN0OworICBHQXJyYXkgKmk2NF9saXN0OworCisgIC8qIEEgT25lT2ZFYWNoIHN0cnVjdHVyZSBjcmVhdGVkIHdpdGggbm8gZXhwbGljaXQgcHJvcGVydHkgdmFsdWVzCisgICAgIHdpbGwgaG9sZCB0aGUgZGVmYXVsdCB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSAudGhyaWZ0IGZpbGUgKi8KKyAgb25lX29mX2VhY2ggPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKKworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgICJpbnRlZ2VyNjQiLCAmaW50ZWdlcjY0LAorICAgICAgICAgICAgICAgICJieXRlX2xpc3QiLCAmYnl0ZV9saXN0LAorICAgICAgICAgICAgICAgICJpMTZfbGlzdCIsICAmaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgImk2NF9saXN0IiwgICZpNjRfbGlzdCwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGFfYml0ZSwgICAgPT0sIDB4N2YpOworICBnX2Fzc2VydF9jbXBpbnQgKGludGVnZXIxNiwgPT0sIDB4N2ZmZik7CisgIGdfYXNzZXJ0X2NtcGludCAoaW50ZWdlcjY0LCA9PSwgR19HSU5UNjRfQ09OU1RBTlQgKDEwMDAwMDAwMDAwKSk7CisKKyAgZ19hc3NlcnQgKGJ5dGVfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChieXRlX2xpc3QtPmxlbiwgPT0sIDMpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGJ5dGVfbGlzdCwgZ2ludDgsIDApLCA9PSwgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoYnl0ZV9saXN0LCBnaW50OCwgMSksID09LCAyKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChieXRlX2xpc3QsIGdpbnQ4LCAyKSwgPT0sIDMpOworCisgIGdfYXNzZXJ0IChpMTZfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChpMTZfbGlzdC0+bGVuLCA9PSwgMyk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTE2X2xpc3QsIGdpbnQxNiwgMCksID09LCAxKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpMTZfbGlzdCwgZ2ludDE2LCAxKSwgPT0sIDIpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGkxNl9saXN0LCBnaW50MTYsIDIpLCA9PSwgMyk7CisKKyAgZ19hc3NlcnQgKGk2NF9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGk2NF9saXN0LT5sZW4sID09LCAzKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpNjRfbGlzdCwgZ2ludDY0LCAwKSwgPT0sIDEpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGk2NF9saXN0LCBnaW50NjQsIDEpLCA9PSwgMik7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTY0X2xpc3QsIGdpbnQ2NCwgMiksID09LCAzKTsKKworICBnX2FycmF5X3VucmVmIChpNjRfbGlzdCk7CisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgZ19hcnJheV91bnJlZiAoYnl0ZV9saXN0KTsKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9pbml0aWFsaXplX3NwZWNpZmllZF92YWx1ZXMgKHZvaWQpCit7CisgIHN0YXRpYyBjb25zdCBnaW50OCBpbml0aWFsX2J5dGVfbGlzdFs1XSA9IHsgMTMsIDIxLCAzNCwgNTUsIDg5IH07CisgIHN0YXRpYyBjb25zdCBnaW50MTYgaW5pdGlhbF9pMTZfbGlzdFs1XSA9IHsgNDE4MSwgNjc2NSwgMTA5NDYsIDE3NzExLCAyODY1NyB9OworICBzdGF0aWMgY29uc3QgZ2ludDY0IGluaXRpYWxfaTY0X2xpc3RbNV0gPQorICAgIHsKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgxMTAwMDg3Nzc4MzY2MTAxOTMxKSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgxNzc5OTc5NDE2MDA0NzE0MTg5KSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICgyODgwMDY3MTk0MzcwODE2MTIwKSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICg0NjYwMDQ2NjEwMzc1NTMwMzA5KSwKKyAgICAgIEdfR0lOVDY0X0NPTlNUQU5UICg3NTQwMTEzODA0NzQ2MzQ2NDI5KQorICAgIH07CisgIHN0YXRpYyBjb25zdCBndWludDggaW5pdGlhbF9iYXNlNjRbOF0gPQorICAgIHsKKyAgICAgIDB4NTYsIDB4NDcsIDB4NjgsIDB4NzksIDB4NjEsIDB4NTcsIDB4NWEsIDB4MzAKKyAgICB9OworCisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaDsKKyAgZ2Jvb2xlYW4gaW1fdHJ1ZTsKKyAgZ2Jvb2xlYW4gaW1fZmFsc2U7CisgIGdpbnQgYV9iaXRlOworICBnaW50IGludGVnZXIxNjsKKyAgZ2ludCBpbnRlZ2VyMzI7CisgIGdpbnQ2NCBpbnRlZ2VyNjQ7CisgIGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uOworICBnY2hhciAqc29tZV9jaGFyYWN0ZXJzOworICBnY2hhciAqem9tZ191bmljb2RlOworICBnYm9vbGVhbiB3aGF0X3dobzsKKyAgR0J5dGVBcnJheSAqYmFzZTY0OworICBHQXJyYXkgKmJ5dGVfbGlzdDsKKyAgR0FycmF5ICppMTZfbGlzdDsKKyAgR0FycmF5ICppNjRfbGlzdDsKKworICBiYXNlNjQgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICBnX2J5dGVfYXJyYXlfYXBwZW5kIChiYXNlNjQsIGluaXRpYWxfYmFzZTY0LCA4KTsKKworICBieXRlX2xpc3QgPSBnX2FycmF5X25ldyAoRkFMU0UsIEZBTFNFLCBzaXplb2YgKGdpbnQ4KSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGJ5dGVfbGlzdCwgaW5pdGlhbF9ieXRlX2xpc3QsIDUpOworCisgIGkxNl9saXN0ID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChnaW50MTYpKTsKKyAgZ19hcnJheV9hcHBlbmRfdmFscyAoaTE2X2xpc3QsIGluaXRpYWxfaTE2X2xpc3QsIDUpOworCisgIGk2NF9saXN0ID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChnaW50NjQpKTsKKyAgZ19hcnJheV9hcHBlbmRfdmFscyAoaTY0X2xpc3QsIGluaXRpYWxfaTY0X2xpc3QsIDUpOworCisgIC8qIEFsbCBvZiBPbmVPZkVhY2gncyBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgYXQgY29uc3RydWN0aW9uLi4uICovCisgIG9uZV9vZl9lYWNoID0KKyAgICBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILAorICAgICAgICAgICAgICAgICAgImltX3RydWUiLCAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgImltX2ZhbHNlIiwgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAgICAgICAgMHg1MCwKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAgICAgICAgMHg3ZTU3LAorICAgICAgICAgICAgICAgICAgImludGVnZXIzMiIsICAgICAgICAweGRlYWRiZWVmLAorICAgICAgICAgICAgICAgICAgImludGVnZXI2NCIsICAgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMHhmYTE1ZWZhY2FkZTE1YmFkKSwKKyAgICAgICAgICAgICAgICAgICJkb3VibGVfcHJlY2lzaW9uIiwgTV9QSSwKKyAgICAgICAgICAgICAgICAgICJzb21lX2NoYXJhY3RlcnMiLCAgIkRlYnVnIFRISVMhIiwKKyAgICAgICAgICAgICAgICAgICJ6b21nX3VuaWNvZGUiLCAgICAgIlx4ZDdcblxhXHQiLAorICAgICAgICAgICAgICAgICAgIndoYXRfd2hvIiwgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgImJhc2U2NCIsICAgICAgICAgICBiYXNlNjQsCisgICAgICAgICAgICAgICAgICAiYnl0ZV9saXN0IiwgICAgICAgIGJ5dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICJpMTZfbGlzdCIsICAgICAgICAgaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgICAiaTY0X2xpc3QiLCAgICAgICAgIGk2NF9saXN0LAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvbmVfb2ZfZWFjaCAhPSBOVUxMKTsKKworICBnX2FycmF5X3VucmVmIChpNjRfbGlzdCk7CisgIGk2NF9saXN0ID0gTlVMTDsKKyAgZ19hcnJheV91bnJlZiAoaTE2X2xpc3QpOworICBpMTZfbGlzdCA9IE5VTEw7CisgIGdfYXJyYXlfdW5yZWYgKGJ5dGVfbGlzdCk7CisgIGJ5dGVfbGlzdCA9IE5VTEw7CisgIGdfYnl0ZV9hcnJheV91bnJlZiAoYmFzZTY0KTsKKyAgYmFzZTY0ID0gTlVMTDsKKworICAvKiAuLi5hbmQgbGF0ZXIgcmV0cmlldmVkICovCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsCisgICAgICAgICAgICAgICAgImltX3RydWUiLCAgICAgICAgICAmaW1fdHJ1ZSwKKyAgICAgICAgICAgICAgICAiaW1fZmFsc2UiLCAgICAgICAgICZpbV9mYWxzZSwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgICAgICAgICZhX2JpdGUsCisgICAgICAgICAgICAgICAgImludGVnZXIxNiIsICAgICAgICAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMzIiLCAgICAgICAgJmludGVnZXIzMiwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjY0IiwgICAgICAgICZpbnRlZ2VyNjQsCisgICAgICAgICAgICAgICAgImRvdWJsZV9wcmVjaXNpb24iLCAmZG91YmxlX3ByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAic29tZV9jaGFyYWN0ZXJzIiwgICZzb21lX2NoYXJhY3RlcnMsCisgICAgICAgICAgICAgICAgInpvbWdfdW5pY29kZSIsICAgICAmem9tZ191bmljb2RlLAorICAgICAgICAgICAgICAgICJ3aGF0X3dobyIsICAgICAgICAgJndoYXRfd2hvLAorICAgICAgICAgICAgICAgICJiYXNlNjQiLCAgICAgICAgICAgJmJhc2U2NCwKKyAgICAgICAgICAgICAgICAiYnl0ZV9saXN0IiwgICAgICAgICZieXRlX2xpc3QsCisgICAgICAgICAgICAgICAgImkxNl9saXN0IiwgICAgICAgICAmaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgImk2NF9saXN0IiwgICAgICAgICAmaTY0X2xpc3QsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGltX3RydWUgID09IFRSVUUpOworICBnX2Fzc2VydCAoaW1fZmFsc2UgPT0gRkFMU0UpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg1MCk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHg3ZTU3KTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyMzIsID09LCAoZ2ludDMyKTB4ZGVhZGJlZWYpOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXI2NCwgPT0sIEdfR0lOVDY0X0NPTlNUQU5UICgweGZhMTVlZmFjYWRlMTViYWQpKTsKKworICBnX2Fzc2VydF9jbXBmbG9hdCAoZG91YmxlX3ByZWNpc2lvbiwgPT0sIE1fUEkpOworCisgIGdfYXNzZXJ0X2NtcHN0ciAoc29tZV9jaGFyYWN0ZXJzLCA9PSwgIkRlYnVnIFRISVMhIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoem9tZ191bmljb2RlLCAgICA9PSwgIlx4ZDdcblxhXHQiKTsKKworICBnX2Fzc2VydCAod2hhdF93aG8gPT0gVFJVRSk7CisKKyAgZ19hc3NlcnRfY21waW50IChiYXNlNjQtPmxlbiwgPT0sIDgpOworICBnX2Fzc2VydF9jbXBpbnQgKG1lbWNtcCAoYmFzZTY0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9iYXNlNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICogc2l6ZW9mIChndWludDgpKSwgPT0sIDApOworCisgIGdfYXNzZXJ0X2NtcGludCAoYnl0ZV9saXN0LT5sZW4sID09LCA1KTsKKyAgZ19hc3NlcnRfY21waW50IChtZW1jbXAgKGJ5dGVfbGlzdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfYnl0ZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAqIHNpemVvZiAoZ2ludDgpKSwgID09LCAwKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGkxNl9saXN0LT5sZW4sID09LCA1KTsKKyAgZ19hc3NlcnRfY21waW50IChtZW1jbXAgKGkxNl9saXN0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9pMTZfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgKiBzaXplb2YgKGdpbnQxNikpLCA9PSwgMCk7CisKKyAgZ19hc3NlcnRfY21waW50IChpNjRfbGlzdC0+bGVuLCA9PSwgNSk7CisgIGdfYXNzZXJ0X2NtcGludCAobWVtY21wIChpNjRfbGlzdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaTY0X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICogc2l6ZW9mIChnaW50NjQpKSwgPT0sIDApOworCisgIGdfYXJyYXlfdW5yZWYgKGk2NF9saXN0KTsKKyAgZ19hcnJheV91bnJlZiAoaTE2X2xpc3QpOworICBnX2FycmF5X3VucmVmIChieXRlX2xpc3QpOworICBnX2J5dGVfYXJyYXlfdW5yZWYgKGJhc2U2NCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2J5dGVfbGlzdCAodm9pZCkKK3sKKyAgVFRlc3RPbmVPZkVhY2ggKm9uZV9vZl9lYWNoOworICBHQXJyYXkgKmJ5dGVfbGlzdCA9IE5VTEw7CisKKyAgb25lX29mX2VhY2ggPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKKworICAvKiBPbmVPZkVhY2gncyAiYnl0ZV9saXN0IiBtZW1iZXIgaXMgYSBsaXN0IHRoYXQgaG9sZHMgZWlnaHQtYml0LXdpZGUgaW50ZWdlcgorICAgICB2YWx1ZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwgImJ5dGVfbGlzdCIsICZieXRlX2xpc3QsIE5VTEwpOworCisgIGdfYXNzZXJ0IChieXRlX2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9nZXRfZWxlbWVudF9zaXplIChieXRlX2xpc3QpLCA9PSwgc2l6ZW9mIChnaW50OCkpOworCisgIGdfYXJyYXlfdW5yZWYgKGJ5dGVfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19pMTZfbGlzdCAodm9pZCkKK3sKKyAgVFRlc3RPbmVPZkVhY2ggKm9uZV9vZl9lYWNoOworICBHQXJyYXkgKmkxNl9saXN0ID0gTlVMTDsKKworICBvbmVfb2ZfZWFjaCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsIE5VTEwpOworCisgIC8qIE9uZU9mRWFjaCdzICJpMTZfbGlzdCIgbWVtYmVyIGlzIGEgbGlzdCB0aGF0IGhvbGRzIHNpeHRlZW4tYml0LXdpZGUgaW50ZWdlcgorICAgICB2YWx1ZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwgImkxNl9saXN0IiwgJmkxNl9saXN0LCBOVUxMKTsKKworICBnX2Fzc2VydCAoaTE2X2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9nZXRfZWxlbWVudF9zaXplIChpMTZfbGlzdCksID09LCBzaXplb2YgKGdpbnQxNikpOworCisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2k2NF9saXN0ICh2b2lkKQoreworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2g7CisgIEdBcnJheSAqaTY0X2xpc3QgPSBOVUxMOworCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgLyogT25lT2ZFYWNoJ3MgImk2NF9saXN0IiBtZW1iZXIgaXMgYSBsaXN0IHRoYXQgaG9sZHMgc2l4dHktZm91ci1iaXQtd2lkZQorICAgICBpbnRlZ2VyIHZhbHVlcyAqLworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLCAiaTY0X2xpc3QiLCAmaTY0X2xpc3QsIE5VTEwpOworCisgIGdfYXNzZXJ0IChpNjRfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2dldF9lbGVtZW50X3NpemUgKGk2NF9saXN0KSwgPT0sIHNpemVvZiAoZ2ludDY0KSk7CisKKyAgZ19hcnJheV91bnJlZiAoaTY0X2xpc3QpOworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX25lc3RpbmdfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgTmVzdGluZyBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ORVNUSU5HLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX05FU1RJTkcgKG9iamVjdCkpOworCisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfbmVzdGluZ19wcm9wZXJ0aWVzX215X2JvbmsgKHZvaWQpCit7CisgIFRUZXN0TmVzdGluZyAqbmVzdGluZzsKKyAgVFRlc3RCb25rICpib25rID0gTlVMTDsKKyAgZ2ludCB0eXBlOworICBnY2hhciAqbWVzc2FnZTsKKworICBuZXN0aW5nID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ORVNUSU5HLCBOVUxMKTsKKworICAvKiBOZXN0aW5nJ3MgIm15X2JvbmsiIG1lbWJlciBpcyBpbml0aWFsaXplZCB3aXRoIGEgbmV3LCBkZWZhdWx0IEJvbmsgb2JqZWN0CisgICAgIGR1cmluZyBjb25zdHJ1Y3Rpb24gKi8KKyAgZ19vYmplY3RfZ2V0IChuZXN0aW5nLCAibXlfYm9uayIsICZib25rLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYm9uayAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19CT05LIChib25rKSk7CisKKyAgZ19vYmplY3RfZ2V0IChib25rLAorICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgJnR5cGUsCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKHR5cGUsID09LCAwKTsKKyAgZ19hc3NlcnQgKG1lc3NhZ2UgPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGJvbmspOworICBib25rID0gTlVMTDsKKworICAvKiBJdCBjYW4gYmUgcmVwbGFjZWQuLi4gKi8KKyAgYm9uayA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQk9OSywKKyAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiLCAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgIlJlcGxhY2VtZW50IEJvbmsiLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChuZXN0aW5nLCAibXlfYm9uayIsIGJvbmssIE5VTEwpOworICBnX29iamVjdF91bnJlZiAoYm9uayk7CisgIGJvbmsgPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X2JvbmsiLCAmYm9uaywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmsgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfQk9OSyAoYm9uaykpOworCisgIGdfb2JqZWN0X2dldCAoYm9uaywKKyAgICAgICAgICAgICAgICAidHlwZSIsICAgICZ0eXBlLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50ICh0eXBlLCA9PSwgMTAwKTsKKyAgZ19hc3NlcnRfY21wc3RyIChtZXNzYWdlLCA9PSwgIlJlcGxhY2VtZW50IEJvbmsiKTsKKworICBnX2ZyZWUgKG1lc3NhZ2UpOworICBnX29iamVjdF91bnJlZiAoYm9uayk7CisgIGJvbmsgPSBOVUxMOworCisgIC8qIC4uLm9yIHNldCB0byBudWxsICovCisgIGdfb2JqZWN0X3NldCAobmVzdGluZywgIm15X2JvbmsiLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChuZXN0aW5nLCAibXlfYm9uayIsICZib25rLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYm9uayA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAobmVzdGluZyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfbmVzdGluZ19wcm9wZXJ0aWVzX215X29vZSAodm9pZCkKK3sKKyAgVFRlc3ROZXN0aW5nICpuZXN0aW5nOworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2ggPSBOVUxMOworICBnaW50IGFfYml0ZTsKKyAgZ2ludCBpbnRlZ2VyMTY7CisKKyAgbmVzdGluZyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfTkVTVElORywgTlVMTCk7CisKKyAgLyogTmVzdGluZydzICJteV9vb2UiIG1lbWJlciBpcyBpbml0aWFsaXplZCB3aXRoIGEgbmV3LCBkZWZhdWx0IE9uZU9mRWFjaAorICAgICBvYmplY3QgZHVyaW5nIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9vb2UiLCAmb25lX29mX2VhY2gsIE5VTEwpOworCisgIGdfYXNzZXJ0IChvbmVfb2ZfZWFjaCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19PTkVfT0ZfRUFDSCAob25lX29mX2VhY2gpKTsKKworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg3Zik7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHg3ZmZmKTsKKworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworICBvbmVfb2ZfZWFjaCA9IE5VTEw7CisKKyAgLyogSXQgY2FuIGJlIHJlcGxhY2VkLi4uICovCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAweDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIxNiIsIDB4NTA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX29iamVjdF9zZXQgKG5lc3RpbmcsICJteV9vb2UiLCBvbmVfb2ZfZWFjaCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7CisgIG9uZV9vZl9lYWNoID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9vb2UiLCAmb25lX29mX2VhY2gsIE5VTEwpOworCisgIGdfYXNzZXJ0IChvbmVfb2ZfZWFjaCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19PTkVfT0ZfRUFDSCAob25lX29mX2VhY2gpKTsKKworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg1MCk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHg1MDUwKTsKKworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworICBvbmVfb2ZfZWFjaCA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIG51bGwgKi8KKyAgZ19vYmplY3Rfc2V0IChuZXN0aW5nLCAibXlfb29lIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X29vZSIsICZvbmVfb2ZfZWFjaCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9uZV9vZl9lYWNoID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChuZXN0aW5nKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19ob2x5X21vbGV5X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIEhvbHlNb2xleSBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9IT0xZX01PTEVZLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0hPTFlfTU9MRVkgKG9iamVjdCkpOworCisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2JpZyAodm9pZCkKK3sKKyAgVFRlc3RIb2x5TW9sZXkgKmhvbHlfbW9sZXk7CisgIEdQdHJBcnJheSAqYmlnID0gTlVMTDsKKyAgZ2ludCBhX2JpdGUgPSAwOworICBnaW50IGludGVnZXIxNiA9IDA7CisKKyAgaG9seV9tb2xleSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSE9MWV9NT0xFWSwgTlVMTCk7CisKKyAgLyogQSBIb2x5TW9sZXkncyAiYmlnIiBtZW1iZXIgaXMgaXMgaW5pdGlhbGl6ZWQgb24gY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJpZyIsICZiaWcsIE5VTEwpOworCisgIGdfYXNzZXJ0IChiaWcgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoYmlnLT5sZW4sID09LCAwKTsKKworICAvKiBJdCBjYW4gYmUgbW9kaWZpZWQuLi4gKi8KKyAgZ19wdHJfYXJyYXlfYWRkIChiaWcsCisgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAweDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIxNiIsIDB4NTA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKworICBnX3B0cl9hcnJheV91bnJlZiAoYmlnKTsKKyAgYmlnID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJiaWciLCAmYmlnLCBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGJpZy0+bGVuLCA9PSwgMSk7CisgIGdfb2JqZWN0X2dldCAoZ19wdHJfYXJyYXlfaW5kZXggKGJpZywgMCksCisgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICZhX2JpdGUsCisgICAgICAgICAgICAgICAgImludGVnZXIxNiIsICZpbnRlZ2VyMTYsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waGV4IChhX2JpdGUsICAgID09LCAweDUwKTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyMTYsID09LCAweDUwNTApOworCisgIGdfcHRyX2FycmF5X3VucmVmIChiaWcpOworICBiaWcgPSBOVUxMOworCisgIC8qIC4uLnJlcGxhY2VkLi4uICovCisgIGJpZyA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoZ19vYmplY3RfdW5yZWYpOworICBnX3B0cl9hcnJheV9hZGQgKGJpZywKKyAgICAgICAgICAgICAgICAgICBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgIDB4NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgMHgxNTQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworCisgIGdfb2JqZWN0X3NldCAoaG9seV9tb2xleSwgImJpZyIsIGJpZywgTlVMTCk7CisKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGJpZyk7CisgIGJpZyA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYmlnIiwgJmJpZywgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChiaWctPmxlbiwgPT0sIDEpOworICBnX29iamVjdF9nZXQgKGdfcHRyX2FycmF5X2luZGV4IChiaWcsIDApLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg2NCk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHgxNTQxKTsKKworICBnX3B0cl9hcnJheV91bnJlZiAoYmlnKTsKKyAgYmlnID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gTlVMTCAqLworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJiaWciLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYmlnIiwgJmJpZywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJpZyA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoaG9seV9tb2xleSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2NvbnRhaW4gKHZvaWQpCit7CisgIHN0YXRpYyBnY2hhciAqc3RyaW5nc1syXSA9IHsgIkFwYWNoZSIsICJUaHJpZnQiIH07CisKKyAgVFRlc3RIb2x5TW9sZXkgKmhvbHlfbW9sZXk7CisgIEdIYXNoVGFibGUgKmNvbnRhaW4gPSBOVUxMOworICBHUHRyQXJyYXkgKnN0cmluZ19saXN0OworICBHTGlzdCAqa2V5X2xpc3Q7CisKKyAgaG9seV9tb2xleSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSE9MWV9NT0xFWSwgTlVMTCk7CisKKyAgLyogQSBIb2x5TW9sZXkncyAiY29udGFpbiIgbWVtYmVyIGlzIGluaXRpYWxpemVkIG9uIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgJmNvbnRhaW4sIE5VTEwpOworCisgIGdfYXNzZXJ0IChjb250YWluICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfaGFzaF90YWJsZV9zaXplIChjb250YWluKSwgPT0sIDApOworCisgIC8qIEl0IGNhbiBiZSBtb2RpZmllZC4uLiAqLworICBzdHJpbmdfbGlzdCA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChzdHJpbmdfbGlzdCwgc3RyaW5nc1swXSk7CisgIGdfcHRyX2FycmF5X2FkZCAoc3RyaW5nX2xpc3QsIHN0cmluZ3NbMV0pOworCisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnRhaW4sIHN0cmluZ19saXN0LCBOVUxMKTsKKyAgc3RyaW5nX2xpc3QgPSBOVUxMOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoY29udGFpbik7CisgIGNvbnRhaW4gPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImNvbnRhaW4iLCAmY29udGFpbiwgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoY29udGFpbiksID09LCAxKTsKKworICBrZXlfbGlzdCA9IGdfaGFzaF90YWJsZV9nZXRfa2V5cyAoY29udGFpbik7CisgIHN0cmluZ19saXN0ID0gZ19saXN0X250aF9kYXRhIChrZXlfbGlzdCwgMCk7CisKKyAgZ19hc3NlcnRfY21waW50IChzdHJpbmdfbGlzdC0+bGVuLCA9PSwgMik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZ19wdHJfYXJyYXlfaW5kZXggKHN0cmluZ19saXN0LCAwKSwgPT0sICJBcGFjaGUiKTsKKyAgZ19hc3NlcnRfY21wc3RyIChnX3B0cl9hcnJheV9pbmRleCAoc3RyaW5nX2xpc3QsIDEpLCA9PSwgIlRocmlmdCIpOworCisgIGdfbGlzdF9mcmVlIChrZXlfbGlzdCk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAoY29udGFpbik7CisgIGNvbnRhaW4gPSBOVUxMOworCisgIC8qIC4uLnJlcGxhY2VkLi4uICovCisgIGNvbnRhaW4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfZGlyZWN0X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZGlyZWN0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsIGNvbnRhaW4sIE5VTEwpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKGNvbnRhaW4pOworICBjb250YWluID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgJmNvbnRhaW4sIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGNvbnRhaW4pLCA9PSwgMCk7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChjb250YWluKTsKKyAgY29udGFpbiA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIE5VTEwgKi8KKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgJmNvbnRhaW4sIE5VTEwpOworCisgIGdfYXNzZXJ0IChjb250YWluID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChob2x5X21vbGV5KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfYm9ua3MgKHZvaWQpCit7CisgIFRUZXN0SG9seU1vbGV5ICpob2x5X21vbGV5OworICBHSGFzaFRhYmxlICpib25rcyA9IE5VTEw7CisgIEdQdHJBcnJheSAqYm9ua19saXN0ID0gTlVMTDsKKyAgVFRlc3RCb25rICpib25rID0gTlVMTDsKKyAgZ2ludCB0eXBlOworICBnY2hhciAqbWVzc2FnZTsKKyAgR0xpc3QgKmtleV9saXN0OworCisgIGhvbHlfbW9sZXkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0hPTFlfTU9MRVksIE5VTEwpOworCisgIC8qIEEgSG9seU1vbGV5J3MgImJvbmtzIiBtZW1iZXIgaXMgaW5pdGlhbGl6ZWQgb24gY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJvbmtzIiwgJmJvbmtzLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYm9ua3MgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGJvbmtzKSwgPT0sIDApOworCisgIC8qIEl0IGNhbiBiZSBtb2RpZmllZC4uLiAqLworICBib25rID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9CT05LLAorICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIsICAgIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAiU2FtcGxlIEJvbmsiLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgYm9ua19saXN0ID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jIChnX29iamVjdF91bnJlZik7CisgIGdfcHRyX2FycmF5X2FkZCAoYm9ua19saXN0LCBib25rKTsKKyAgYm9uayA9IE5VTEw7CisKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoYm9ua3MsIGdfc3RyZHVwICgiU2FtcGxlIEJvbmtzIiksIGJvbmtfbGlzdCk7CisgIGJvbmtfbGlzdCA9IE5VTEw7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChib25rcyk7CisgIGJvbmtzID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJib25rcyIsICZib25rcywgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoYm9ua3MpLCA9PSwgMSk7CisKKyAga2V5X2xpc3QgPSBnX2hhc2hfdGFibGVfZ2V0X2tleXMgKGJvbmtzKTsKKyAgYm9ua19saXN0ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoYm9ua3MsIGdfbGlzdF9udGhfZGF0YSAoa2V5X2xpc3QsIDApKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGJvbmtfbGlzdC0+bGVuLCA9PSwgMSk7CisKKyAgYm9uayA9IChnX3B0cl9hcnJheV9pbmRleCAoYm9ua19saXN0LCAwKSk7CisgIGdfb2JqZWN0X2dldCAoYm9uaywKKyAgICAgICAgICAgICAgICAidHlwZSIsICAgICZ0eXBlLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50ICh0eXBlLCA9PSwgMTAwKTsKKyAgZ19hc3NlcnRfY21wc3RyIChtZXNzYWdlLCA9PSwgIlNhbXBsZSBCb25rIik7CisKKyAgYm9uayA9IE5VTEw7CisgIGdfZnJlZSAobWVzc2FnZSk7CisgIGdfbGlzdF9mcmVlIChrZXlfbGlzdCk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAoYm9ua3MpOworICBib25rcyA9IE5VTEw7CisKKyAgLyogLi4ucmVwbGFjZWQuLi4gKi8KKyAgYm9ua3MgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfc3RyX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3N0cl9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYpOworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJib25rcyIsIGJvbmtzLCBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChib25rcyk7CisgIGJvbmtzID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJib25rcyIsICZib25rcywgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoYm9ua3MpLCA9PSwgMCk7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChib25rcyk7CisgIGJvbmtzID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gTlVMTCAqLworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJib25rcyIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJib25rcyIsICZib25rcywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmtzID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChob2x5X21vbGV5KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19lbXB0eSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgR1BhcmFtU3BlYyAqKnByb3BlcnRpZXM7CisgIGd1aW50IHByb3BlcnR5X2NvdW50OworCisgIC8qIEFuIEVtcHR5IHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZCAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0VNUFRZLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0VNUFRZIChvYmplY3QpKTsKKworICAvKiBBbiBFbXB0eSBzdHJ1Y3R1cmUgaGFzIG5vIG1lbWJlcnMgYW5kIHRodXMgbm8gcHJvcGVydGllcyAqLworICBwcm9wZXJ0aWVzID0gZ19vYmplY3RfY2xhc3NfbGlzdF9wcm9wZXJ0aWVzIChHX09CSkVDVF9HRVRfQ0xBU1MgKG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9jb3VudCk7CisgIGdfYXNzZXJ0X2NtcGludCAocHJvcGVydHlfY291bnQsID09LCAwKTsKKyAgZ19mcmVlIChwcm9wZXJ0aWVzKTsKKworICAvKiBBbiBFbXB0eSBzdHJ1Y3R1cmUgY2FuIGJlIGRlc3Ryb3llZCAgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfd3JhcHBlcl9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogQSBXcmFwcGVyIHN0cnVjdHVyZSBjYW4gYmUgY3JlYXRlZC4uLiAqLworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0VNUFRZLCBOVUxMKTsKKworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0VNUFRZIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c193cmFwcGVyX3Byb3BlcnRpZXNfZm9vICh2b2lkKSB7CisgIFRUZXN0V3JhcHBlciAqd3JhcHBlcjsKKyAgVFRlc3RFbXB0eSAqZm9vOworCisgIHdyYXBwZXIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1dSQVBQRVIsIE5VTEwpOworCisgIC8qIEEgV3JhcHBlciBzdHJ1Y3R1cmUgaGFzIG9uZSBtZW1iZXIsICJmb28iLCB3aGljaCBpcyBhbiBFbXB0eQorICAgICBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKHdyYXBwZXIsICJmb28iLCAmZm9vLCBOVUxMKTsKKworICBnX2Fzc2VydCAoZm9vICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0VNUFRZIChmb28pKTsKKworICBnX29iamVjdF91bnJlZiAoZm9vKTsKKyAgZm9vID0gTlVMTDsKKworICAvKiBBIFdyYXBwZXIncyBmb28gcHJvcGVydHkgY2FuIGJlIHJlcGxhY2VkLi4uICovCisgIGZvbyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfRU1QVFksIE5VTEwpOworICBnX29iamVjdF9zZXQgKHdyYXBwZXIsICJmb28iLCBmb28sIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChmb28pOworICBmb28gPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAod3JhcHBlciwgImZvbyIsICZmb28sIE5VTEwpOworICBnX2Fzc2VydCAoZm9vICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0VNUFRZIChmb28pKTsKKworICBnX29iamVjdF91bnJlZiAoZm9vKTsKKyAgZm9vID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gTlVMTCAqLworICBnX29iamVjdF9zZXQgKHdyYXBwZXIsICJmb28iLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0ICh3cmFwcGVyLCAiZm9vIiwgJmZvbywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGZvbyA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAod3JhcHBlcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NlcnZpY2VzX2luaGVyaXRlZCAodm9pZCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sOworICBUVGVzdEluaGVyaXRlZENsaWVudCAqaW5oZXJpdGVkX2NsaWVudDsKKyAgR09iamVjdCAqaW5wdXRfcHJvdG9jb2wsICpvdXRwdXRfcHJvdG9jb2w7CisKKyAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgTlVMTCk7CisgIGluaGVyaXRlZF9jbGllbnQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIFRUZXN0SW5oZXJpdGVkQ2xpZW50IGluaGVyaXRzIGZyb20gVFRlc3RTcnZDbGllbnQgKi8KKyAgZ19hc3NlcnQgKGdfdHlwZV9pc19hIChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfVFlQRV9TUlZfQ0xJRU5UKSk7CisKKyAgLyogVFRlc3RJbmhlcml0ZWRDbGllbnQgaW1wbGVtZW50cyBUVGVzdFNydkNsaWVudCdzIGludGVyZmFjZSAqLworICBnX2Fzc2VydCAoZ190eXBlX2lzX2EgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCisgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX1NSVl9JRikpOworCisgIC8qIFRUZXN0SW5oZXJpdGVkQ2xpZW50J3MgaW5oZXJpdGVkIHByb3BlcnRpZXMgY2FuIGJlIHNldCBhbmQgcmV0cmlldmVkICovCisgIGdfb2JqZWN0X3NldCAoaW5oZXJpdGVkX2NsaWVudCwKKyAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19vYmplY3RfZ2V0IChpbmhlcml0ZWRfY2xpZW50LAorICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICZpbnB1dF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgJm91dHB1dF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydCAoaW5wdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKKyAgZ19hc3NlcnQgKG91dHB1dF9wcm90b2NvbCA9PSBHX09CSkVDVChwcm90b2NvbCkpOworCisgIGdfb2JqZWN0X3VucmVmIChvdXRwdXRfcHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAoaW5wdXRfcHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAoaW5oZXJpdGVkX2NsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0RvdWJsZXMvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgIHRlc3Rfc3RydWN0c19kb3VibGVzX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9Eb3VibGVzL0luaXRpYWxpemUiLAorICAgICB0ZXN0X3N0cnVjdHNfZG91Ymxlc19pbml0aWFsaXplKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvT25lT2ZFYWNoL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9Jbml0aWFsaXplL0RlZmF1bHRWYWx1ZXMiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfaW5pdGlhbGl6ZV9kZWZhdWx0X3ZhbHVlcyk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvSW5pdGlhbGl6ZS9TcGVjaWZpZWRWYWx1ZXMiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfaW5pdGlhbGl6ZV9zcGVjaWZpZWRfdmFsdWVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9Qcm9wZXJ0aWVzL2J5dGVfbGlzdCIsCisgICAgIHRlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2J5dGVfbGlzdCk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvUHJvcGVydGllcy9pMTZfbGlzdCIsCisgICAgIHRlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2kxNl9saXN0KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9Qcm9wZXJ0aWVzL2k2NF9saXN0IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX3Byb3BlcnRpZXNfaTY0X2xpc3QpOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9OZXN0aW5nL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfbmVzdGluZ19jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvTmVzdGluZy9Qcm9wZXJ0aWVzL215X2JvbmsiLAorICAgICB0ZXN0X3N0cnVjdHNfbmVzdGluZ19wcm9wZXJ0aWVzX215X2JvbmspOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvTmVzdGluZy9Qcm9wZXJ0aWVzL215X29vZSIsCisgICAgIHRlc3Rfc3RydWN0c19uZXN0aW5nX3Byb3BlcnRpZXNfbXlfb29lKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvSG9seU1vbGV5L0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvSG9seU1vbGV5L1Byb3BlcnRpZXMvYmlnIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfcHJvcGVydGllc19iaWcpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvSG9seU1vbGV5L1Byb3BlcnRpZXMvY29udGFpbiIsCisgICAgIHRlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfY29udGFpbik7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9Ib2x5TW9sZXkvUHJvcGVydGllcy9ib25rcyIsCisgICAgIHRlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfYm9ua3MpOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9FbXB0eSIsCisgICAgIHRlc3Rfc3RydWN0c19lbXB0eSk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL1dyYXBwZXIvQ3JlYXRlQW5kRGVzdHJveSIsCisgICAgIHRlc3Rfc3RydWN0c193cmFwcGVyX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9XcmFwcGVyL1Byb3BlcnRpZXMvZm9vIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX3dyYXBwZXJfcHJvcGVydGllc19mb28pOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU2VydmljZXMvSW5oZXJpdGVkIiwKKyAgICAgdGVzdF9zZXJ2aWNlc19pbmhlcml0ZWQpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlYTg5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWIvZ3N0ZGlvLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oPgorCitzdGF0aWMgY29uc3QgZ2NoYXIgVEVTVF9EQVRBWzEyXSA9ICJhYmNkZTAxMjM0ISI7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0OworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgImZkIiwgLTEsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2UgKHZvaWQpCit7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqa2xhc3M7CisgIEdFcnJvciAqZXJyb3I7CisgIGdpbnQgZmQ7CisgIGdjaGFyICpmaWxlbmFtZTsKKworICBlcnJvciA9IE5VTEw7CisgIGZpbGVuYW1lID0gTlVMTDsKKworICBmZCA9IGdfZmlsZV9vcGVuX3RtcCAoTlVMTCwgJmZpbGVuYW1lLCAmZXJyb3IpOworICBnX2Fzc2VydCAoZmQgPj0gMCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIiwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOworICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworCisgIC8qIG9wZW4gaXMgbm8tb3AgKi8KKyAgZ19hc3NlcnQgKGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPm9wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoISBrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICAvKiBhbHJlYWR5IGNsb3NlZCAqLworICBnX2Fzc2VydCAoY2xvc2UgKGZkKSAhPSAwKTsKKyAgZ19hc3NlcnQgKGVycm5vID09IEVCQURGKTsKKworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICBnX3JlbW92ZSAoZmlsZW5hbWUpOworICBnX2ZyZWUgKGZpbGVuYW1lKTsKKworICAvKiB0ZXN0IGJhZCBmZCAqLworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpOworICBlcnJvciA9IE5VTEw7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGUgKHZvaWQpCit7CisgIGdjaGFyIG91dF9idWZbOF07CisgIGdjaGFyICpiOworICBnaW50IHdhbnQsIGdvdDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICprbGFzczsKKyAgR0Vycm9yICplcnJvcjsKKyAgZ2ludCBmZDsKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIGVycm9yID0gTlVMTDsKKyAgZmlsZW5hbWUgPSBOVUxMOworCisgIGZkID0gZ19maWxlX29wZW5fdG1wIChOVUxMLCAmZmlsZW5hbWUsICZlcnJvcik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICAvKiB3cml0ZSAqLworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+d3JpdGUgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBURVNUX0RBVEEsIDExLCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5mbHVzaCAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisKKyAgLyogcmVhZCAqLworICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZLCBTX0lSVVNSIHwgU19JV1VTUik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgbWVtc2V0KG91dF9idWYsIDAsIDgpOworICBiID0gb3V0X2J1ZjsKKyAgd2FudCA9IDc7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IGtsYXNzLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgYiArPSBnb3Q7CisgICAgd2FudCAtPSBnb3Q7CisgIH0KKyAgZ19hc3NlcnQgKG1lbWNtcCAob3V0X2J1ZiwgVEVTVF9EQVRBLCA3KSA9PSAwKTsKKworICBtZW1zZXQob3V0X2J1ZiwgMCwgOCk7CisgIGIgPSBvdXRfYnVmOworICB3YW50ID0gNDsKKyAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgZ290ID0ga2xhc3MtPnJlYWQgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICBiICs9IGdvdDsKKyAgICB3YW50IC09IGdvdDsKKyAgfQorICBnX2Fzc2VydCAobWVtY21wIChvdXRfYnVmLCBURVNUX0RBVEEgKyA3LCA0KSA9PSAwKTsKKworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICAvKiBjbGVhbiB1cCAqLworCisgIGdfcmVtb3ZlIChmaWxlbmFtZSk7CisgIGdfZnJlZSAoZmlsZW5hbWUpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZkdHJhbnNwb3J0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMDhlNjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisKKyNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0KKworI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIgorCitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKTsKKworLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBndWludCByX2J1Zl9zaXplID0gMDsKKyAgZ3VpbnQgd19idWZfc2l6ZSA9IDA7CisKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAob2JqZWN0KSwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsCisJCSJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCisJCSJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2Uodm9pZCkKK3sKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIHBpZF90IHBpZDsKKyAgaW50IHBvcnQgPSA1MTE5OTsKKyAgaW50IHN0YXR1czsKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwxKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisJLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCS8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCisJLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCisJCQkJTlVMTCk7CisKKwkvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGUodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIGludCBwb3J0ID0gNTExOTk7CisgIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworLyogdGVzdCByZWFkaW5nIGZyb20gdGhlIHRyYW5zcG9ydCBhZnRlciB0aGUgcGVlciBoYXMgdW5leHBlY3RlZGx5CisgICBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYWZ0ZXJfcGVlcl9jbG9zZSh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworICAgICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnRfdHJhbnNwb3J0ID0gTlVMTDsKKworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkgICAgICAgInBvcnQiLCBwb3J0LAorCQkJCSAgICAgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChzZXJ2ZXJfdHJhbnNwb3J0ICE9IE5VTEwpOworCisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpOworICAgICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKworICAgICAgLyogd3JhcCB0aGUgY2xpZW50IHRyYW5zcG9ydCBpbiBhIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqLworICAgICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldworCSAgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpLAorCSAgICJyX2J1Zl9zaXplIiwgMCwKKwkgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKKworICAgICAgLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNsaWVudCBjb25uZWN0cyAqLworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwlUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworCVRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKwlndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorCQkJCSJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgICAgIHBvcnQsCisJCQkJTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsICBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgMCwKKwkJCQkgIE5VTEwpOworCisJZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworCS8qIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgdGhlIHBlZXIgaGFzIGNsb3NlZAorICAgICAgIHRoZSBjb25uZWN0aW9uIGZhaWxzIGdyYWNlZnVsbHkgd2l0aG91dCBnZW5lcmF0aW5nIGEgY3JpdGljYWwKKyAgICAgICB3YXJuaW5nIG9yIHNlZ21lbnRhdGlvbiBmYXVsdCAqLworCXRocmlmdF90cmFuc3BvcnRfcmVhZCAodHJhbnNwb3J0LCBidWYsIDEwLCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyICE9IE5VTEwpOworCisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwl0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisKKwl0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwlnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKwlnX2Fzc2VydCAoc3RhdHVzID09IDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgaW50IGJ5dGVzID0gMDsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGd1Y2hhciBidWZbMTJdOyAvKiBhIGJ1ZmZlciAqLworICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKworICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorCQkJIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KKyAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcCAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KKworICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCA2LCBOVUxMKTsKKyAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgNSwgTlVMTCk7CisgIGJ5dGVzID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEsIE5VTEwpOworCisgIGJ5dGVzID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEyLCBOVUxMKTsKKworICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZyYW1lZHRyYW5zcG9ydC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZyYW1lZHRyYW5zcG9ydC9PcGVuQW5kQ2xvc2UiLCB0ZXN0X29wZW5fYW5kX2Nsb3NlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmcmFtZWR0cmFuc3BvcnQvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZnJhbWVkdHJhbnNwb3J0L1JlYWRBZnRlclBlZXJDbG9zZSIsIHRlc3RfcmVhZF9hZnRlcl9wZWVyX2Nsb3NlKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmYjY4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisKK3N0YXRpYyBjb25zdCBnY2hhciBURVNUX0RBVEFbMTFdID0gImFiY2RlZmdoaWoiOworCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMiCisKKy8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1Zl9zaXplIiwgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfbGFyZ2UgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmX3NpemUiLCAxMCAqIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2RlZmF1bHQgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZXh0ZXJuYWwgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIEdCeXRlQXJyYXkgKmJ1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7CisgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmIiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X3Vub3duZWQgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIEdWYWx1ZSB2YWwgPSBHX1ZBTFVFX0lOSVQ7CisgIEdCeXRlQXJyYXkgKmJ1ZjsKKworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm93bmVyIiwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsLCBHX1RZUEVfUE9JTlRFUik7CisgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAob2JqZWN0LCAiYnVmIiwgJnZhbCk7CisgIGJ1ZiA9IChHQnl0ZUFycmF5KikgZ192YWx1ZV9nZXRfcG9pbnRlciAoJnZhbCk7CisgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisKKyAgZ19ieXRlX2FycmF5X3VucmVmIChidWYpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29wZW5fYW5kX2Nsb3NlICh2b2lkKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOworCisgIC8qIGNyZWF0ZSBhIFRocmlmdE1lbW9yeUJ1ZmZlciAqLworICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKKworICAvKiBuby1vcHMgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLCBOVUxMKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZSAodm9pZCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKKyAgZ2ludCBnb3QsIHdhbnQ7CisgIGdjaGFyIHJlYWRbMTBdOworICBnY2hhciAqYjsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgNSwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgJmVycm9yKSA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0IChlcnJvciAhPSBOVUxMKTsKKyAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgIGVycm9yID0gTlVMTDsKKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDE1LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsIDEwLCAmZXJyb3IpID09IFRSVUUpOworICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgbWVtc2V0KHJlYWQsIDAsIDEwKTsKKyAgYiA9IHJlYWQ7CisgIHdhbnQgPSAxMDsKKyAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgZ290ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgYiArPSBnb3Q7CisgICAgd2FudCAtPSBnb3Q7CisgIH0KKyAgZ19hc3NlcnQgKG1lbWNtcCAocmVhZCwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CisgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfZGVmYXVsdCAodm9pZCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKKyAgZ2ludCBnb3QsIHdhbnQsIGk7CisgIGdjaGFyIHJlYWRbMTBdOworICBnY2hhciAqYjsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CisgIGZvciAoaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsIDEwLCAmZXJyb3IpID09IFRSVUUpOworICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgIG1lbXNldChyZWFkLCAwLCAxMCk7CisgICAgYiA9IHJlYWQ7CisgICAgd2FudCA9IDEwOworICAgIHdoaWxlICh3YW50ID4gMCkgeworICAgICAgZ290ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7CisgICAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBiICs9IGdvdDsKKyAgICAgIHdhbnQgLT0gZ290OworICAgIH0KKyAgICBnX2Fzc2VydCAobWVtY21wIChyZWFkLCBURVNUX0RBVEEsIDEwKSA9PSAwKTsKKyAgfQorICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2V4dGVybmFsICh2b2lkKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOworICBnY2hhciAqYjsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIEdCeXRlQXJyYXkgKmJ1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7CisgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisKKyAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1ZiIsIGJ1ZiwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIGdfYXNzZXJ0IChtZW1jbXAgKGJ1Zi0+ZGF0YSwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CisgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95TGFyZ2UiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9sYXJnZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lVbmxpbWl0ZWQiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9kZWZhdWx0KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveUV4dGVybmFsIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZXh0ZXJuYWwpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95VW5vd25lZCIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X3Vub3duZWQpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9PcGVuQW5kQ2xvc2UiLCB0ZXN0X29wZW5fYW5kX2Nsb3NlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL1JlYWRBbmRXcml0ZVVubGltaXRlZCIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfZGVmYXVsdCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL1JlYWRBbmRXcml0ZUV4dGVybmFsIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9leHRlcm5hbCk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzNmMzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oPgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaCIKKworI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYyIKKworc3RhdGljIHZvaWQKK3dyaXRlX3RvX3JlYWQgKFRocmlmdFN0cnVjdCAqdywgVGhyaWZ0U3RydWN0ICpyLCBHRXJyb3IgKip3cml0ZV9lcnJvciwKKyAgICAgICAgICAgICAgIEdFcnJvciAqKnJlYWRfZXJyb3IpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisKKyAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CisgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJ1ZmZlciwgTlVMTCk7CisKKyAgdGhyaWZ0X3N0cnVjdF93cml0ZSAodywgcHJvdG9jb2wsIHdyaXRlX2Vycm9yKTsKKyAgdGhyaWZ0X3N0cnVjdF9yZWFkIChyLCBwcm90b2NvbCwgcmVhZF9lcnJvcik7CisKKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9vbGRfc2Nob29sMSAodm9pZCkKK3sKKyAgVFRlc3RPbGRTY2hvb2wgKm8gPSBOVUxMOworCisgIG8gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09MRF9TQ0hPT0wsIE5VTEwpOworICBvLT5pbV9pbnQgPSAxMDsKKyAgby0+aW1fc3RyID0gZ19zdHJkdXAgKCJ0ZXN0Iik7CisgIG8tPmltX2JpZyA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgZ19wdHJfYXJyYXlfZnJlZSAoby0+aW1fYmlnLCBUUlVFKTsKKyAgby0+aW1fYmlnID0gTlVMTDsKKyAgZ19mcmVlIChvLT5pbV9zdHIpOworICBvLT5pbV9zdHIgPSBOVUxMOworICBnX29iamVjdF91bnJlZiAobyk7Cit9CisKKy8qKgorICogV3JpdGUgdG8gcmVhZCB3aXRoIG9wdGlvbmFsIGZpZWxkcworICovCitzdGF0aWMgdm9pZAordGVzdF9zaW1wbGUgKHZvaWQpCit7CisgIFRUZXN0U2ltcGxlICpzMSA9IE5VTEwsICpzMiA9IE5VTEwsICpzMyA9IE5VTEw7CisKKyAgczEgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1NJTVBMRSwgTlVMTCk7CisgIHMyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9TSU1QTEUsIE5VTEwpOworICBzMyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0lNUExFLCBOVUxMKTsKKworICAvKiB3cml0ZS10by1yZWFkIHdpdGggb3B0aW9uYWwgZmllbGRzICovCisgIHMxLT5pbV9vcHRpb25hbCA9IDEwOworICBnX2Fzc2VydCAoczEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0IChzMS0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7ICAKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoczEpLCBUSFJJRlRfU1RSVUNUIChzMiksIE5VTEwsIE5VTEwpOworICBnX2Fzc2VydCAoczItPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHMyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHMyLT5pbV9vcHRpb25hbCA9PSAwKTsKKworICBzMS0+X19pc3NldF9pbV9vcHRpb25hbCA9IFRSVUU7CisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHMxKSwgVEhSSUZUX1NUUlVDVCAoczMpLCBOVUxMLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHMzLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMy0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHMzLT5pbV9vcHRpb25hbCA9PSAxMCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHMxKTsKKyAgZ19vYmplY3RfdW5yZWYgKHMyKTsKK30KKworLyoqCisgKiBXcml0aW5nIGJldHdlZW4gb3B0aW9uYWwgYW5kIGRlZmF1bHQKKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfdHJpY2t5MSAodm9pZCkKK3sKKyAgVFRlc3RUcmlja3kxICp0MSA9IE5VTEw7CisgIFRUZXN0VHJpY2t5MiAqdDIgPSBOVUxMOworCisgIHQxID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kxLCBOVUxMKTsKKyAgdDIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RSSUNLWTIsIE5VTEwpOworCisgIHQyLT5pbV9vcHRpb25hbCA9IDEwOworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MiksIFRIUklGVF9TVFJVQ1QgKHQxKSwgTlVMTCwgTlVMTCk7CisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQxKSwgVEhSSUZUX1NUUlVDVCAodDIpLCBOVUxMLCBOVUxMKTsKKworICBnX2Fzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHQxLT5pbV9kZWZhdWx0ID09IHQyLT5pbV9vcHRpb25hbCk7CisgIGdfYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSAwKTsKKworICBnX29iamVjdF91bnJlZiAodDEpOworICBnX29iamVjdF91bnJlZiAodDIpOworfQorCisvKioKKyAqIFdyaXRpbmcgYmV0d2VlbiBkZWZhdWx0IGFuZCByZXF1aXJlZC4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfdHJpY2t5MiAodm9pZCkKK3sKKyAgVFRlc3RUcmlja3kxICp0MSA9IE5VTEw7CisgIFRUZXN0VHJpY2t5MyAqdDMgPSBOVUxMOworCisgIHQxID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kxLCBOVUxMKTsKKyAgdDMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RSSUNLWTMsIE5VTEwpOworCisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQxKSwgVEhSSUZUX1NUUlVDVCAodDMpLCBOVUxMLCBOVUxMKTsKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDMpLCBUSFJJRlRfU1RSVUNUICh0MSksIE5VTEwsIE5VTEwpOworCisgIGdfYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOworCisgIGdfb2JqZWN0X3VucmVmICh0MSk7CisgIGdfb2JqZWN0X3VucmVmICh0Myk7Cit9CisKKy8qKgorICogV3JpdGluZyBiZXR3ZWVuIG9wdGlvbmFsIGFuZCByZXF1aXJlZC4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfdHJpY2t5MyAodm9pZCkKK3sKKyAgVFRlc3RUcmlja3kyICp0MiA9IE5VTEw7CisgIFRUZXN0VHJpY2t5MyAqdDMgPSBOVUxMOworCisgIHQyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kyLCBOVUxMKTsKKyAgdDMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RSSUNLWTMsIE5VTEwpOworCisgIHQyLT5fX2lzc2V0X2ltX29wdGlvbmFsID0gVFJVRTsKKworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MiksIFRIUklGVF9TVFJVQ1QgKHQzKSwgTlVMTCwgTlVMTCk7CisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQzKSwgVEhSSUZUX1NUUlVDVCAodDIpLCBOVUxMLCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodDIpOworICBnX29iamVjdF91bnJlZiAodDMpOworfQorCisvKioKKyAqIENhdGNoIGFuIG9wdGlvbmFsIG5vdCBzZXQgZXhjZXB0aW9uLiAgVG8gcXVvdGUgdGhlCisgKiBDKysgdGVzdCwgIk11LWh1LWhhLWhhLWhhISIKKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfdHJpY2t5NCAodm9pZCkKK3sKKyAgVFRlc3RUcmlja3kyICp0MiA9IE5VTEw7CisgIFRUZXN0VHJpY2t5MyAqdDMgPSBOVUxMOworICBHRXJyb3IgKnJlYWRfZXJyb3IgPSBOVUxMOworCisgIHQyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kyLCBOVUxMKTsKKyAgdDMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RSSUNLWTMsIE5VTEwpOworCisgIC8qIHRocm93cyBwcm90b2NvbCBleGNlcHRpb24gKi8KKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDIpLCBUSFJJRlRfU1RSVUNUICh0MyksIE5VTEwsICZyZWFkX2Vycm9yKTsKKyAgZ19hc3NlcnQgKHJlYWRfZXJyb3IgIT0gTlVMTCk7CisgIGdfZXJyb3JfZnJlZSAocmVhZF9lcnJvcik7CisKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDMpLCBUSFJJRlRfU1RSVUNUICh0MiksIE5VTEwsIE5VTEwpOworCisgIGdfYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHQyKTsKKyAgZ19vYmplY3RfdW5yZWYgKHQzKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfbm9uX3NldF9iaW5hcnkgKHZvaWQpCit7CisgIFRUZXN0QmluYXJpZXMgKmIxID0gTlVMTDsKKyAgVFRlc3RCaW5hcmllcyAqYjIgPSBOVUxMOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICBiMSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQklOQVJJRVMsIE5VTEwpOworICBiMiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQklOQVJJRVMsIE5VTEwpOworCisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKGIxKSwgVEhSSUZUX1NUUlVDVCAoYjIpLCBOVUxMLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChiMiksIFRIUklGVF9TVFJVQ1QgKGIxKSwgTlVMTCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgLyogT0suIE5vIHNlZ2ZhdWx0ICovCisKKyAgZ19vYmplY3RfdW5yZWYgKGIxKTsKKyAgZ19vYmplY3RfdW5yZWYgKGIyKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9PbGRTY2hvb2wiLCB0ZXN0X29sZF9zY2hvb2wxKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1NpbXBsZSIsIHRlc3Rfc2ltcGxlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1RyaWNreTEiLCB0ZXN0X3RyaWNreTEpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvVHJpY2t5MiIsIHRlc3RfdHJpY2t5Mik7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9Ucmlja3kzIiwgdGVzdF90cmlja3kzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1RyaWNreTQiLCB0ZXN0X3RyaWNreTQpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvQmluYXJ5IiwgdGVzdF9ub25fc2V0X2JpbmFyeSk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHNlcmlhbGl6YXRpb24uYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2VyaWFsaXphdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDQxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNlcmlhbGl6YXRpb24uYwpAQCAtMCwwICsxLDk1IEBACisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmgiCisKK3N0YXRpYyB2b2lkIGVudW1fY29uc3RhbnRzX3JlYWRfd3JpdGUoKSB7CisgIEdFcnJvciogZXJyb3IgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQqIHRyYW5zcG9ydAorICAgICAgPSBUSFJJRlRfVFJBTlNQT1JUKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCAxMDI0LCBOVUxMKSk7CisgIFRocmlmdFByb3RvY29sKiBwcm90b2NvbAorICAgICAgPSBUSFJJRlRfUFJPVE9DT0woZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwgTlVMTCkpOworICBUVGVzdEVudW1UZXN0U3RydWN0KiBzcmMgPSBUX1RFU1RfRU5VTV9URVNUOworICBUVGVzdEVudW1UZXN0U3RydWN0KiBkc3QgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfRU5VTV9URVNUX1NUUlVDVCwgTlVMTCk7CisgIFRUZXN0RW51bVRlc3RTdHJ1Y3RDbGFzcyogY2xzID0gVF9URVNUX0VOVU1fVEVTVF9TVFJVQ1RfR0VUX0NMQVNTKHNyYyk7CisgIGludCB3cml0ZV9sZW47CisgIGludCByZWFkX2xlbjsKKworICB3cml0ZV9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPndyaXRlKFRIUklGVF9TVFJVQ1Qoc3JjKSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0KHdyaXRlX2xlbiA+IDApOworCisgIHJlYWRfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT5yZWFkKFRIUklGVF9TVFJVQ1QoZHN0KSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0X2NtcGludCh3cml0ZV9sZW4sID09LCByZWFkX2xlbik7CisKKyAgZ19vYmplY3RfdW5yZWYoZHN0KTsKKyAgZ19vYmplY3RfdW5yZWYocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZih0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZCBzdHJ1Y3RfY29uc3RhbnRzX3JlYWRfd3JpdGUoKSB7CisgIEdFcnJvciogZXJyb3IgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQqIHRyYW5zcG9ydAorICAgICAgPSBUSFJJRlRfVFJBTlNQT1JUKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCA0MDk2LCBOVUxMKSk7CisgIFRocmlmdFByb3RvY29sKiBwcm90b2NvbAorICAgICAgPSBUSFJJRlRfUFJPVE9DT0woZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwgTlVMTCkpOworICBUVGVzdENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QqIHNyYyA9IFRfVEVTVF9DT01QQUNUX1RFU1Q7CisgIFRUZXN0Q29tcGFjdFByb3RvVGVzdFN0cnVjdCogZHN0ID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0NPTVBBQ1RfUFJPVE9fVEVTVF9TVFJVQ1QsIE5VTEwpOworICBUVGVzdENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RDbGFzcyogY2xzID0gVF9URVNUX0NPTVBBQ1RfUFJPVE9fVEVTVF9TVFJVQ1RfR0VUX0NMQVNTKHNyYyk7CisgIGludCB3cml0ZV9sZW47CisgIGludCByZWFkX2xlbjsKKworICB3cml0ZV9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPndyaXRlKFRIUklGVF9TVFJVQ1Qoc3JjKSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0KHdyaXRlX2xlbiA+IDApOworCisgIHJlYWRfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT5yZWFkKFRIUklGVF9TVFJVQ1QoZHN0KSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0X2NtcGludCh3cml0ZV9sZW4sID09LCByZWFkX2xlbik7CisKKyAgZ19vYmplY3RfdW5yZWYoZHN0KTsKKyAgZ19vYmplY3RfdW5yZWYocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZih0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZCBzdHJ1Y3RfcmVhZF93cml0ZV9sZW5ndGhfc2hvdWxkX2VxdWFsKCkgeworICBHRXJyb3IqIGVycm9yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0KiB0cmFuc3BvcnQKKyAgICAgID0gVEhSSUZUX1RSQU5TUE9SVChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgMjA0OCwgTlVMTCkpOworICBUaHJpZnRQcm90b2NvbCogcHJvdG9jb2wKKyAgICAgID0gVEhSSUZUX1BST1RPQ09MKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpKTsKKyAgVFRlc3RCb25rKiBzcmMgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfQk9OSywgTlVMTCk7CisgIFRUZXN0Qm9uayogZHN0ID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0JPTkssIE5VTEwpOworICBUVGVzdEJvbmtDbGFzcyogY2xzID0gVF9URVNUX0JPTktfR0VUX0NMQVNTKHNyYyk7CisgIGludCB3cml0ZV9sZW47CisgIGludCByZWFkX2xlbjsKKworICB3cml0ZV9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPndyaXRlKFRIUklGVF9TVFJVQ1Qoc3JjKSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0KHdyaXRlX2xlbiA+IDApOworCisgIHJlYWRfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT5yZWFkKFRIUklGVF9TVFJVQ1QoZHN0KSwgcHJvdG9jb2wsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIGdfYXNzZXJ0X2NtcGludCh3cml0ZV9sZW4sID09LCByZWFkX2xlbik7CisKKyAgZ19vYmplY3RfdW5yZWYoZHN0KTsKKyAgZ19vYmplY3RfdW5yZWYoc3JjKTsKKyAgZ19vYmplY3RfdW5yZWYocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZih0cmFuc3BvcnQpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04oMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisgIGdfdGVzdF9pbml0KCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jKCIvdGVzdHNlcmlhbGl6YXRpb24vU3RydWN0UmVhZFdyaXRlTGVuZ3RoU2hvdWxkRXF1YWwiLAorICAgICAgICAgICAgICAgICAgc3RydWN0X3JlYWRfd3JpdGVfbGVuZ3RoX3Nob3VsZF9lcXVhbCk7CisgIGdfdGVzdF9hZGRfZnVuYygiL3Rlc3RzZXJpYWxpemF0aW9uL1N0cnVjdENvbnN0YW50cyIsIHN0cnVjdF9jb25zdGFudHNfcmVhZF93cml0ZSk7CisgIGdfdGVzdF9hZGRfZnVuYygiL3Rlc3RzZXJpYWxpemF0aW9uL0VudW1Db25zdGFudHMiLCBlbnVtX2NvbnN0YW50c19yZWFkX3dyaXRlKTsKKyAgcmV0dXJuIGdfdGVzdF9ydW4oKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjNmYyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisKKyNkZWZpbmUgVEVTVF9QT1JUIDUxMTk5CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jPgorCisvKiBjcmVhdGUgYSBydWRpbWVudGFyeSBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgVEVTVF9QUk9DRVNTT1JfVFlQRSAodGVzdF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisKK3N0cnVjdCBfVGVzdFByb2Nlc3NvcgoreworICBUaHJpZnRQcm9jZXNzb3IgcGFyZW50OworfTsKK3R5cGVkZWYgc3RydWN0IF9UZXN0UHJvY2Vzc29yIFRlc3RQcm9jZXNzb3I7CisKK3N0cnVjdCBfVGVzdFByb2Nlc3NvckNsYXNzCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzIHBhcmVudDsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGVzdFByb2Nlc3NvckNsYXNzIFRlc3RQcm9jZXNzb3JDbGFzczsKKworR19ERUZJTkVfVFlQRShUZXN0UHJvY2Vzc29yLCB0ZXN0X3Byb2Nlc3NvciwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKQorCitnYm9vbGVhbgordGVzdF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvY2Vzc29yKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGluKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG91dCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZAordGVzdF9wcm9jZXNzb3JfaW5pdCAoVGVzdFByb2Nlc3NvciAqcCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHApOworfQorCitzdGF0aWMgdm9pZAordGVzdF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGVzdFByb2Nlc3NvckNsYXNzICpwcm9jKQoreworICAoVEhSSUZUX1BST0NFU1NPUl9DTEFTUyhwcm9jKSktPnByb2Nlc3MgPSB0ZXN0X3Byb2Nlc3Nvcl9wcm9jZXNzOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zZXJ2ZXIgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGVzdFByb2Nlc3NvciAqcCA9IE5VTEw7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNzID0gTlVMTDsKKyAgVGhyaWZ0U2ltcGxlU2VydmVyICpzcyA9IE5VTEw7CisKKyAgcCA9IGdfb2JqZWN0X25ldyAoVEVTVF9QUk9DRVNTT1JfVFlQRSwgTlVMTCk7CisgIHRzcyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgInBvcnQiLCBURVNUX1BPUlQsIE5VTEwpOworICBzcyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgInByb2Nlc3NvciIsIHAsCisgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3RyYW5zcG9ydCIsIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c3MpLCBOVUxMKTsKKworICAvKiBydW4gdGhlIHNlcnZlciBpbiBhIGNoaWxkIHByb2Nlc3MgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoVEhSSUZUX1NFUlZFUiAoc3MpKS0+c2VydmUgKFRIUklGVF9TRVJWRVIgKHNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGV4aXQgKDApOworICB9IGVsc2UgeworICAgIHNsZWVwICg1KTsKKyAgICBraWxsIChwaWQsIFNJR0lOVCk7CisKKyAgICBnX29iamVjdF91bnJlZiAoc3MpOworICAgIGdfb2JqZWN0X3VucmVmICh0c3MpOworICAgIGdfb2JqZWN0X3VucmVmIChwKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IFNJR0lOVCk7CisgIH0KK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0c2ltcGxlc2VydmVyL1NpbXBsZVNlcnZlciIsIHRlc3Rfc2VydmVyKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxMjBjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jIgorCisvKiB0ZXN0cyB0byBlbnN1cmUgd2UgY2FuIGV4dGVuZCBhIFRocmlmdFN0cnVjdCAqLworCitzdHJ1Y3QgX1RocmlmdFRlc3RTdHJ1Y3QKK3sKKyAgVGhyaWZ0U3RydWN0IHBhcmVudDsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VGVzdFN0cnVjdCBUaHJpZnRUZXN0U3RydWN0OworCitzdHJ1Y3QgX1RocmlmdFRlc3RTdHJ1Y3RDbGFzcworeworICBUaHJpZnRTdHJ1Y3RDbGFzcyBwYXJlbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRlc3RTdHJ1Y3RDbGFzcyBUaHJpZnRUZXN0U3RydWN0Q2xhc3M7CisKK0dUeXBlIHRocmlmdF90ZXN0X3N0cnVjdF9nZXRfdHlwZSAodm9pZCk7CisKKyNkZWZpbmUgVEhSSUZUX1RZUEVfVEVTVF9TVFJVQ1QgKHRocmlmdF90ZXN0X3N0cnVjdF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1RFU1RfU1RSVUNUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfVEVTVF9TVFJVQ1QsIFRocmlmdFRlc3RTdHJ1Y3QpKQorI2RlZmluZSBUSFJJRlRfVEVTVF9TVFJVQ1RfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1RFU1RfU1RSVUNULCBUaHJpZnRUZXN0U3RydWN0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfVEVTVF9TVFJVQ1Qob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9URVNUX1NUUlVDVCkpCisjZGVmaW5lIFRIUklGVF9JU19URVNUX1NUUlVDVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfVEVTVF9TVFJVQ1QpKQorI2RlZmluZSBUSFJJRlRfVEVTVF9TVFJVQ1RfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9URVNUX1NUUlVDVCwgVGhyaWZ0VGVzdFN0cnVjdENsYXNzKSkKKworR19ERUZJTkVfVFlQRShUaHJpZnRUZXN0U3RydWN0LCB0aHJpZnRfdGVzdF9zdHJ1Y3QsIFRIUklGVF9UWVBFX1NUUlVDVCkKKworZ2ludDMyCit0aHJpZnRfdGVzdF9zdHJ1Y3RfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Rlc3Rfc3RydWN0X3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfdGVzdF9zdHJ1Y3RfY2xhc3NfaW5pdCAoVGhyaWZ0VGVzdFN0cnVjdENsYXNzICpjbHMpCit7CisgIFRocmlmdFN0cnVjdENsYXNzICp0c19jbHMgPSBUSFJJRlRfU1RSVUNUX0NMQVNTIChjbHMpOworICB0c19jbHMtPnJlYWQgPSB0aHJpZnRfdGVzdF9zdHJ1Y3RfcmVhZDsKKyAgdHNfY2xzLT53cml0ZSA9IHRocmlmdF90ZXN0X3N0cnVjdF93cml0ZTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90ZXN0X3N0cnVjdF9pbml0IChUaHJpZnRUZXN0U3RydWN0ICpzKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2luaXRpYWxpemVfb2JqZWN0ICh2b2lkKQoreworICBUaHJpZnRUZXN0U3RydWN0ICp0ID0gTlVMTDsKKworICB0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9URVNUX1NUUlVDVCwgTlVMTCk7CisgIGdfYXNzZXJ0ICggVEhSSUZUX0lTX1NUUlVDVCAodCkpOworICB0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKKyAgdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAodCksIE5VTEwsIE5VTEwpOworICB0aHJpZnRfdGVzdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAodCksIE5VTEwsIE5VTEwpOworICB0aHJpZnRfdGVzdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHQpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RzdHJ1Y3QvSW5pdGlhbGl6ZU9iamVjdCIsIHRlc3RfaW5pdGlhbGl6ZV9vYmplY3QpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yM2E5MzRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMKQEAgLTAsMCArMSwxMTIgQEAKKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisKKyNpbmNsdWRlICJ0X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJ0aHJpZnRfdGVzdF9oYW5kbGVyLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIFRFU1RfQUREUkVTU1tdID0gImxvY2FsaG9zdCI7CitzdGF0aWMgY29uc3QgaW50IFRFU1RfUE9SVCA9IDY0NDQ0OworCitzdGF0aWMgdm9pZAordGVzdF90aHJpZnRfc2VydmVyICh2b2lkKQoreworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBURVNUX1BPUlQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3NldF9pbmRpY2F0b3IgKGdwb2ludGVyIGRhdGEsIEdPYmplY3QgKndoZXJlX3RoZV9vYmplY3Rfd2FzKSB7CisgIFRIUklGVF9VTlVTRURfVkFSKHdoZXJlX3RoZV9vYmplY3Rfd2FzKTsKKworICAqKGdib29sZWFuICopIGRhdGEgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAordGVzdF90aHJpZnRfaGFuZGxlciAodm9pZCkKK3sKKyAgR0Vycm9yICplcnJvcjsKKyAgR0hhc2hUYWJsZSAqX3JldHVybjsKKyAgVFRlc3RJbnNhbml0eSAqYXJndW1lbnQ7CisgIGdib29sZWFuIGluZGljYXRvcjsKKworICBUVGVzdFh0cnVjdCAgKnh0cnVjdCwgICp4dHJ1Y3QyOworICBUVGVzdE51bWJlcnogbnVtYmVyejsKKyAgVFRlc3ROdW1iZXJ6IG51bWJlcnoyOworICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHIsICp1c2VyX2lkX3B0cjI7CisgIEdIYXNoVGFibGUgKnVzZXJfbWFwOworICBHUHRyQXJyYXkgKnh0cnVjdHM7CisKKyAgZXJyb3IgPSBOVUxMOworICBpbmRpY2F0b3IgPSBGQUxTRTsKKworICB1c2VyX21hcCA9IE5VTEw7CisgIHh0cnVjdHMgPSBOVUxMOworCisgIGFyZ3VtZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTlNBTklUWSwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoYXJndW1lbnQsCisgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBudW1iZXJ6ID0gVF9URVNUX05VTUJFUlpfRklWRTsKKyAgbnVtYmVyejIgPSBUX1RFU1RfTlVNQkVSWl9FSUdIVDsKKyAgdXNlcl9pZF9wdHIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICp1c2VyX2lkX3B0ciA9IDU7CisgIHVzZXJfaWRfcHRyMiA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWRfcHRyKTsKKyAgKnVzZXJfaWRfcHRyMiA9IDg7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyeiwgdXNlcl9pZF9wdHIpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnoyLCB1c2VyX2lkX3B0cjIpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKworICB4dHJ1Y3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkhlbGxvMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDJMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgeHRydWN0MiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3QyKTsKKyAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3QpOworICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisKKyAgX3JldHVybiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnQ2NF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludDY0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRGVzdHJveU5vdGlmeSlnX2hhc2hfdGFibGVfdW5yZWYpOworCisgIGdfb2JqZWN0X3dlYWtfcmVmIChHX09CSkVDVCAoYXJndW1lbnQpLCBzZXRfaW5kaWNhdG9yLCAoZ3BvaW50ZXIpICZpbmRpY2F0b3IpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaW5zYW5pdHkgKE5VTEwsICZfcmV0dXJuLCBhcmd1bWVudCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0ICghIGluZGljYXRvcik7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChfcmV0dXJuKTsKKyAgZ19hc3NlcnQgKCEgaW5kaWNhdG9yKTsKKworICBnX29iamVjdF91bnJlZiAoYXJndW1lbnQpOworICBnX2Fzc2VydCAoaW5kaWNhdG9yKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dGhyaWZ0L1NlcnZlciIsIHRlc3RfdGhyaWZ0X3NlcnZlcik7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dGhyaWZ0L0hhbmRsZXIiLCB0ZXN0X3RocmlmdF9oYW5kbGVyKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5MTBjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCkBAIC0wLDAgKzEsNjM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIHRlc3QgYSBDIGNsaWVudCB3aXRoIGEgQysrIHNlcnZlciAgKHRoYXQgbWFrZXMgc2Vuc2UuLi4pICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSAiVGhyaWZ0VGVzdC5oIgorI2luY2x1ZGUgIlRocmlmdFRlc3RfdHlwZXMuaCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OworCit1c2luZyBzdGQ6OmNvdXQ7Cit1c2luZyBzdGQ6OmVuZGw7Cit1c2luZyBzdGQ6OmZpeGVkOwordXNpbmcgc3RkOjptYWtlX3BhaXI7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6c2V0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworI2RlZmluZSBURVNUX1BPUlQgOTk4MAorCisvLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIFRocmlmdFRlc3RfdHlwZXMgdG8gd29yaworbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0ZXN0IHsKKworYm9vbCBJbnNhbml0eTo6b3BlcmF0b3I8KHRocmlmdDo6dGVzdDo6SW5zYW5pdHkgY29uc3QmIG90aGVyKSBjb25zdCB7CisgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZzsKKyAgcmV0dXJuIFRocmlmdERlYnVnU3RyaW5nKCp0aGlzKSA8IFRocmlmdERlYnVnU3RyaW5nKG90aGVyKTsKK30KKworfX0KKworY2xhc3MgVGVzdEhhbmRsZXIgOiBwdWJsaWMgVGhyaWZ0VGVzdElmIHsKKyAgcHVibGljOgorICBUZXN0SGFuZGxlcigpIHt9CisKKyAgdm9pZCB0ZXN0Vm9pZCgpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RWb2lkKCkiIDw8IGVuZGw7CisgIH0KKworICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RTdHJpbmcoXCIiIDw8IHRoaW5nIDw8ICJcIikiIDw8IGVuZGw7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKworICBib29sIHRlc3RCb29sKGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RCb29sKCIgPDwgKHRoaW5nID8gInRydWUiIDogImZhbHNlIikgPDwgIikiIDw8IGVuZGw7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisgIGludDhfdCB0ZXN0Qnl0ZShjb25zdCBpbnQ4X3QgdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RCeXRlKCIgPDwgKGludCl0aGluZyA8PCAiKSIgPDwgZW5kbDsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKyAgaW50MzJfdCB0ZXN0STMyKGNvbnN0IGludDMyX3QgdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RJMzIoIiA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBpbnQ2NF90IHRlc3RJNjQoY29uc3QgaW50NjRfdCB0aGluZykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEk2NCgiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIGRvdWJsZSB0ZXN0RG91YmxlKGNvbnN0IGRvdWJsZSB0aGluZykgeworICAgIGNvdXQucHJlY2lzaW9uKDYpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdERvdWJsZSgiIDw8IGZpeGVkIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIHZvaWQgdGVzdEJpbmFyeShzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZ0aGluZykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEJpbmFyeShcIiIgPDwgdGhpbmcgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICBvdXQgPSB0aGluZzsKKyAgfQorCisgIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QmIG91dCwgY29uc3QgWHRydWN0ICZ0aGluZykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFN0cnVjdCh7XCIiIDw8IHRoaW5nLnN0cmluZ190aGluZyA8PCAiXCIsICIgPDwgKGludCl0aGluZy5ieXRlX3RoaW5nIDw8ICIsICIgPDwgdGhpbmcuaTMyX3RoaW5nIDw8ICIsICIgPDwgdGhpbmcuaTY0X3RoaW5nIDw8ICJ9KSIgPDwgZW5kbDsKKyAgICBvdXQgPSB0aGluZzsKKyAgfQorCisgIHZvaWQgdGVzdE5lc3QoWHRydWN0MiYgb3V0LCBjb25zdCBYdHJ1Y3QyJiBuZXN0KSB7CisgICAgY29uc3QgWHRydWN0ICZ0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE5lc3QoeyIgPDwgKGludCluZXN0LmJ5dGVfdGhpbmcgPDwgIiwge1wiIiA8PCB0aGluZy5zdHJpbmdfdGhpbmcgPDwgIlwiLCAiIDw8IChpbnQpdGhpbmcuYnl0ZV90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmkzMl90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmk2NF90aGluZyA8PCAifSwgIiA8PCBuZXN0LmkzMl90aGluZyA8PCAifSkiIDw8IGVuZGw7CisgICAgb3V0ID0gbmVzdDsKKyAgfQorCisgIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4gJm91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+ICZ0aGluZykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE1hcCh7IjsKKyAgICBtYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKG1faXRlciA9IHRoaW5nLmJlZ2luKCk7IG1faXRlciAhPSB0aGluZy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291dCA8PCAiLCAiOworICAgICAgfQorICAgICAgY291dCA8PCBtX2l0ZXItPmZpcnN0IDw8ICIgPT4gIiA8PCBtX2l0ZXItPnNlY29uZDsKKyAgICB9CisgICAgY291dCA8PCAifSkiIDw8IGVuZGw7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RTdHJpbmdNYXAobWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJm91dCwgY29uc3QgbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJnRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U3RyaW5nTWFwKHsiOworICAgIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBtX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIlwiIiA8PCBtX2l0ZXItPmZpcnN0IDw8ICJcIiA9PiBcIiIgPDwgbV9pdGVyLT5zZWNvbmQgPDwgIlwiIjsKKyAgICB9CisgICAgY291dCA8PCAifSkiIDw8IGVuZGw7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKworCisgIHZvaWQgdGVzdFNldChzZXQ8aW50MzJfdD4gJm91dCwgY29uc3Qgc2V0PGludDMyX3Q+ICZ0aGluZykgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFNldCh7IjsKKyAgICBzZXQ8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHNfaXRlciA9IHRoaW5nLmJlZ2luKCk7IHNfaXRlciAhPSB0aGluZy5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291dCA8PCAiLCAiOworICAgICAgfQorICAgICAgY291dCA8PCAqc19pdGVyOworICAgIH0KKyAgICBjb3V0IDw8ICJ9KSIgPDwgZW5kbDsKKyAgICBvdXQgPSB0aGluZzsKKyAgfQorCisgIHZvaWQgdGVzdExpc3QodmVjdG9yPGludDMyX3Q+ICZvdXQsIGNvbnN0IHZlY3RvcjxpbnQzMl90PiAmdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RMaXN0KHsiOworICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobF9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbF9pdGVyICE9IHRoaW5nLmVuZCgpOyArK2xfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBjb3V0IDw8ICpsX2l0ZXI7CisgICAgfQorICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOworICAgIG91dCA9IHRoaW5nOworICB9CisKKyAgTnVtYmVyejo6dHlwZSB0ZXN0RW51bShjb25zdCBOdW1iZXJ6Ojp0eXBlIHRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0RW51bSgiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIFVzZXJJZCB0ZXN0VHlwZWRlZihjb25zdCBVc2VySWQgdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RUeXBlZGVmKCIgPDwgdGhpbmcgPDwgIikiIDw8IGVuZGw7CisgICAgcmV0dXJuIHRoaW5nOyAgfQorCisgIHZvaWQgdGVzdE1hcE1hcChtYXA8aW50MzJfdCwgbWFwPGludDMyX3QsaW50MzJfdD4gPiAmbWFwbWFwLCBjb25zdCBpbnQzMl90IGhlbGxvKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TWFwTWFwKCIgPDwgaGVsbG8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBwb3M7CisgICAgbWFwPGludDMyX3QsaW50MzJfdD4gbmVnOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICBwb3MuaW5zZXJ0KG1ha2VfcGFpcihpLGkpKTsKKyAgICAgIG5lZy5pbnNlcnQobWFrZV9wYWlyKC1pLC1pKSk7CisgICAgfQorCisgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoNCwgcG9zKSk7CisgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoLTQsIG5lZykpOworCisgIH0KKworICB2b2lkIHRlc3RJbnNhbml0eShtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPiAmaW5zYW5lLCBjb25zdCBJbnNhbml0eSAmYXJndW1lbnQpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmd1bWVudCk7CisKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RJbnNhbml0eSgpIiA8PCBlbmRsOworCisgICAgWHRydWN0IGhlbGxvOworICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOworICAgIGhlbGxvLmkzMl90aGluZyA9IDI7CisgICAgaGVsbG8uaTY0X3RoaW5nID0gMjsKKworICAgIFh0cnVjdCBnb29kYnllOworICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKKyAgICBnb29kYnllLmJ5dGVfdGhpbmcgPSA0OworICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKKyAgICBnb29kYnllLmk2NF90aGluZyA9IDQ7CisKKyAgICBJbnNhbml0eSBjcmF6eTsKKyAgICBjcmF6eS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RUlHSFQsIDgpKTsKKyAgICBjcmF6eS54dHJ1Y3RzLnB1c2hfYmFjayhnb29kYnllKTsKKworICAgIEluc2FuaXR5IGxvb25leTsKKyAgICBjcmF6eS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RklWRSwgNSkpOworICAgIGNyYXp5Lnh0cnVjdHMucHVzaF9iYWNrKGhlbGxvKTsKKworICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gZmlyc3RfbWFwOworICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gc2Vjb25kX21hcDsKKworICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRXTywgY3JhenkpKTsKKyAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUSFJFRSwgY3JhenkpKTsKKworICAgIHNlY29uZF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpTSVgsIGxvb25leSkpOworCisgICAgaW5zYW5lLmluc2VydChtYWtlX3BhaXIoMSwgZmlyc3RfbWFwKSk7CisgICAgaW5zYW5lLmluc2VydChtYWtlX3BhaXIoMiwgc2Vjb25kX21hcCkpOworCisgICAgY291dCA8PCAicmV0dXJuID0geyI7CisgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKKyAgICBmb3IgKGlfaXRlciA9IGluc2FuZS5iZWdpbigpOyBpX2l0ZXIgIT0gaW5zYW5lLmVuZCgpOyArK2lfaXRlcikgeworICAgICAgY291dCA8PCBpX2l0ZXItPmZpcnN0IDw8ICIgPT4geyI7CisgICAgICBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7CisgICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOworICAgICAgICAgICBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOworICAgICAgICAgICArK2kyX2l0ZXIpIHsKKyAgICAgICAgY291dCA8PCBpMl9pdGVyLT5maXJzdCA8PCAiID0+IHsiOworICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPiB1c2VyTWFwID0gaTJfaXRlci0+c2Vjb25kLnVzZXJNYXA7CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+Ojpjb25zdF9pdGVyYXRvciB1bTsKKyAgICAgICAgY291dCA8PCAieyI7CisgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKKyAgICAgICAgICBjb3V0IDw8IHVtLT5maXJzdCA8PCAiID0+ICIgPDwgdW0tPnNlY29uZCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgIn0sICI7CisKKyAgICAgICAgdmVjdG9yPFh0cnVjdD4geHRydWN0cyA9IGkyX2l0ZXItPnNlY29uZC54dHJ1Y3RzOworICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKKyAgICAgICAgY291dCA8PCAieyI7CisgICAgICAgIGZvciAoeCA9IHh0cnVjdHMuYmVnaW4oKTsgeCAhPSB4dHJ1Y3RzLmVuZCgpOyArK3gpIHsKKyAgICAgICAgICBjb3V0IDw8ICJ7XCIiIDw8IHgtPnN0cmluZ190aGluZyA8PCAiXCIsICIgPDwgKGludCl4LT5ieXRlX3RoaW5nIDw8ICIsICIgPDwgeC0+aTMyX3RoaW5nIDw8ICIsICIgPDwgeC0+aTY0X3RoaW5nIDw8ICJ9LCAiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgIn0iOworCisgICAgICAgIGNvdXQgPDwgIn0sICI7CisgICAgICB9CisgICAgICBjb3V0IDw8ICJ9LCAiOworICAgIH0KKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworCisKKyAgfQorCisgIHZvaWQgdGVzdE11bHRpKFh0cnVjdCAmaGVsbG8sIGNvbnN0IGludDhfdCBhcmcwLCBjb25zdCBpbnQzMl90IGFyZzEsIGNvbnN0IGludDY0X3QgYXJnMiwgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+ICAmYXJnMywgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LCBjb25zdCBVc2VySWQgYXJnNSkgeworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUgKGFyZzMpOworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUgKGFyZzQpOworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUgKGFyZzUpOworCisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TXVsdGkoKSIgPDwgZW5kbDsKKworICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOworICAgIGhlbGxvLmkzMl90aGluZyA9IGFyZzE7CisgICAgaGVsbG8uaTY0X3RoaW5nID0gKGludDY0X3QpYXJnMjsKKyAgfQorCisgIHZvaWQgdGVzdEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmYXJnKQorICAgIHRocm93KFhjZXB0aW9uLCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbikKKyAgeworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEV4Y2VwdGlvbigiIDw8IGFyZyA8PCAiKSIgPDwgZW5kbDsKKyAgICBpZiAoYXJnLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgeworICAgICAgWGNlcHRpb24gZTsKKyAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIGUubWVzc2FnZSA9IGFyZzsKKyAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIGlmIChhcmcuY29tcGFyZSgiQXBwbGljYXRpb25FeGNlcHRpb24iKSA9PSAwKSB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiBlOworICAgICAgdGhyb3cgZTsKKyAgICB9IGVsc2UgeworICAgICAgWHRydWN0IHJlc3VsdDsKKyAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmc7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0ICZyZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcwLCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMSkgdGhyb3coWGNlcHRpb24sIFhjZXB0aW9uMikgeworCisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TXVsdGlFeGNlcHRpb24oIiA8PCBhcmcwIDw8ICIsICIgPDwgYXJnMSA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmIChhcmcwLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgeworICAgICAgWGNlcHRpb24gZTsKKyAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIGUubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIGlmIChhcmcwLmNvbXBhcmUoIlhjZXB0aW9uMiIpID09IDApIHsKKyAgICAgIFhjZXB0aW9uMiBlOworICAgICAgZS5lcnJvckNvZGUgPSAyMDAyOworICAgICAgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIHsKKyAgICBjb3V0IDw8ICJ0ZXN0T25ld2F5KCIgPDwgc2xlZXBGb3IgPDwgIik6IFNsZWVwaW5nLi4uIiA8PCBlbmRsOworICAgIHNsZWVwKHNsZWVwRm9yKTsKKyAgICBjb3V0IDw8ICJ0ZXN0T25ld2F5KCIgPDwgc2xlZXBGb3IgPDwgIik6IGRvbmUgc2xlZXBpbmchIiA8PCBlbmRsOworICB9Cit9OworCisvLyBDIENMSUVOVAorZXh0ZXJuICJDIiB7CisKKyN1bmRlZiBUSFJJRlRfU09DS0VUIC8qIGZyb20gbGliL2NwcCAqLworCisjaW5jbHVkZSAidF90ZXN0X3RocmlmdF90ZXN0LmgiCisjaW5jbHVkZSAidF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisKK3N0YXRpYyB2b2lkCit0ZXN0X3RocmlmdF9jbGllbnQgKHZvaWQpCit7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRUZXN0VGhyaWZ0VGVzdENsaWVudCAqY2xpZW50ID0gTlVMTDsKKyAgVFRlc3RUaHJpZnRUZXN0SWYgKmlmYWNlID0gTlVMTDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnaW50OCBieXRlID0gMDsKKyAgZ2ludDE2IGkxNiA9IDA7CisgIGdpbnQzMiBpMzIgPSAwLCBhbm90aGVyX2kzMiA9IDU2Nzg5OworICBnaW50NjQgaTY0ID0gMDsKKyAgZG91YmxlIGRibCA9IDAuMDsKKyAgVFRlc3RYdHJ1Y3QgKnh0cnVjdF9pbiwgKnh0cnVjdF9vdXQ7CisgIFRUZXN0WHRydWN0MiAqeHRydWN0Ml9pbiwgKnh0cnVjdDJfb3V0OworICBHSGFzaFRhYmxlICptYXBfaW4gPSBOVUxMLCAqbWFwX291dCA9IE5VTEw7CisgIEdIYXNoVGFibGUgKnNldF9pbiA9IE5VTEwsICpzZXRfb3V0ID0gTlVMTDsKKyAgR0FycmF5ICpsaXN0X2luID0gTlVMTCwgKmxpc3Rfb3V0ID0gTlVMTDsKKyAgVFRlc3ROdW1iZXJ6IGVudW1faW4sIGVudW1fb3V0OworICBUVGVzdFVzZXJJZCB1c2VyX2lkX2luLCB1c2VyX2lkX291dDsKKyAgR0hhc2hUYWJsZSAqaW5zYW5pdHlfaW4gPSBOVUxMOworICBUVGVzdFh0cnVjdCAqeHRydWN0MSwgKnh0cnVjdDI7CisgIFRUZXN0SW5zYW5pdHkgKmluc2FuaXR5X291dCA9IE5VTEw7CisgIFRUZXN0WHRydWN0ICptdWx0aV9pbiA9IE5VTEw7CisgIEdIYXNoVGFibGUgKm11bHRpX21hcF9vdXQgPSBOVUxMOworICBUVGVzdFhjZXB0aW9uICp4Y2VwdGlvbiA9IE5VTEw7CisgIFRUZXN0WGNlcHRpb24yICp4Y2VwdGlvbjIgPSBOVUxMOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgLy8gaW5pdGlhbGl6ZSBnb2JqZWN0CisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgLy8gY3JlYXRlIGEgQyBjbGllbnQKKyAgdHNvY2tldCA9IChUaHJpZnRTb2NrZXQgKikgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIFRFU1RfUE9SVCwgTlVMTCk7CisgIHByb3RvY29sID0gKFRocmlmdEJpbmFyeVByb3RvY29sICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgY2xpZW50ID0gKFRUZXN0VGhyaWZ0VGVzdENsaWVudCAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RIUklGVF9URVNUX0NMSUVOVCwgImlucHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsICJvdXRwdXRfcHJvdG9jb2wiLCBwcm90b2NvbCwgTlVMTCk7CisgIGlmYWNlID0gVF9URVNUX1RIUklGVF9URVNUX0lGIChjbGllbnQpOworCisgIC8vIG9wZW4gYW5kIHNlbmQKKyAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChUSFJJRlRfVFJBTlNQT1JUKHRzb2NrZXQpLCBOVUxMKTsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF92b2lkIChpZmFjZSwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9zdHJpbmcgKGlmYWNlLCAmc3RyaW5nLCAidGVzdDEyMyIsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoc3RyY21wIChzdHJpbmcsICJ0ZXN0MTIzIikgPT0gMCk7CisgIGdfZnJlZSAoc3RyaW5nKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9ieXRlIChpZmFjZSwgJmJ5dGUsIChnaW50OCkgNSwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChieXRlID09IDUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2kzMiAoaWZhY2UsICZpMzIsIDEyMywgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChpMzIgPT0gMTIzKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9pNjQgKGlmYWNlLCAmaTY0LCAxMjM0NSwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChpNjQgPT0gMTIzNDUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2RvdWJsZSAoaWZhY2UsICZkYmwsIDUuNiwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChkYmwgPT0gNS42KTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICB4dHJ1Y3Rfb3V0ID0gKFRUZXN0WHRydWN0ICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgeHRydWN0X291dC0+Ynl0ZV90aGluZyA9IDE7CisgIHh0cnVjdF9vdXQtPl9faXNzZXRfYnl0ZV90aGluZyA9IFRSVUU7CisgIHh0cnVjdF9vdXQtPmkzMl90aGluZyA9IDE1OworICB4dHJ1Y3Rfb3V0LT5fX2lzc2V0X2kzMl90aGluZyA9IFRSVUU7CisgIHh0cnVjdF9vdXQtPmk2NF90aGluZyA9IDE1MTsKKyAgeHRydWN0X291dC0+X19pc3NldF9pNjRfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3Rfb3V0LT5zdHJpbmdfdGhpbmcgPSBnX3N0cmR1cCAoImFiYzEyMyIpOworICB4dHJ1Y3Rfb3V0LT5fX2lzc2V0X3N0cmluZ190aGluZyA9IFRSVUU7CisgIHh0cnVjdF9pbiA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3Rfc3RydWN0IChpZmFjZSwgJnh0cnVjdF9pbiwgeHRydWN0X291dCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICB4dHJ1Y3QyX291dCA9IChUVGVzdFh0cnVjdDIgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QyLCBOVUxMKTsKKyAgeHRydWN0Ml9vdXQtPmJ5dGVfdGhpbmcgPSAxOworICB4dHJ1Y3QyX291dC0+X19pc3NldF9ieXRlX3RoaW5nID0gVFJVRTsKKyAgaWYgKHh0cnVjdDJfb3V0LT5zdHJ1Y3RfdGhpbmcgIT0gTlVMTCkKKyAgICBnX29iamVjdF91bnJlZih4dHJ1Y3QyX291dC0+c3RydWN0X3RoaW5nKTsKKyAgeHRydWN0Ml9vdXQtPnN0cnVjdF90aGluZyA9IHh0cnVjdF9vdXQ7CisgIHh0cnVjdDJfb3V0LT5fX2lzc2V0X3N0cnVjdF90aGluZyA9IFRSVUU7CisgIHh0cnVjdDJfb3V0LT5pMzJfdGhpbmcgPSAxMjM7CisgIHh0cnVjdDJfb3V0LT5fX2lzc2V0X2kzMl90aGluZyA9IFRSVUU7CisgIHh0cnVjdDJfaW4gPSAoVFRlc3RYdHJ1Y3QyICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNUMiwgTlVMTCk7CisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X25lc3QgKGlmYWNlLCAmeHRydWN0Ml9pbiwgeHRydWN0Ml9vdXQsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdDJfb3V0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdDJfaW4pOworICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKKworICBtYXBfb3V0ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOyAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgJmkzMiwgJmkzMik7CisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X21hcCAoaWZhY2UsICZtYXBfaW4sIG1hcF9vdXQsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGdfaGFzaF90YWJsZV9kZXN0cm95IChtYXBfb3V0KTsKKyAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKG1hcF9pbik7CisKKyAgbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOworICBtYXBfaW4gPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgZ19zdHJkdXAgKCJhIiksIGdfc3RyZHVwICgiMTIzIikpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChtYXBfb3V0LCBnX3N0cmR1cCAoImEgYiIpLCBnX3N0cmR1cCAoIndpdGggc3BhY2VzICIpKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgZ19zdHJkdXAgKCJzYW1lIiksIGdfc3RyZHVwICgic2FtZSIpKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAobWFwX291dCwgZ19zdHJkdXAgKCIwIiksIGdfc3RyZHVwICgibnVtZXJpYyBrZXkiKSk7CisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X3N0cmluZ19tYXAgKGlmYWNlLCAmbWFwX2luLCBtYXBfb3V0LCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWFwX291dCk7CisgIGdfaGFzaF90YWJsZV9kZXN0cm95IChtYXBfaW4pOworCisgIHNldF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgc2V0X2luID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHNldF9vdXQsICZpMzIsICZpMzIpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9zZXQgKGlmYWNlLCAmc2V0X2luLCBzZXRfb3V0LCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAoc2V0X291dCk7CisgIGdfaGFzaF90YWJsZV9kZXN0cm95IChzZXRfaW4pOworCisgIGxpc3Rfb3V0ID0gZ19hcnJheV9uZXcoVFJVRSwgVFJVRSwgc2l6ZW9mKGdpbnQzMikpOworICBsaXN0X2luID0gZ19hcnJheV9uZXcoVFJVRSwgVFJVRSwgc2l6ZW9mKGdpbnQzMikpOworICBhbm90aGVyX2kzMiA9IDQ1NjsKKyAgZ19hcnJheV9hcHBlbmRfdmFsIChsaXN0X291dCwgaTMyKTsKKyAgZ19hcnJheV9hcHBlbmRfdmFsIChsaXN0X291dCwgYW5vdGhlcl9pMzIpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9saXN0IChpZmFjZSwgJmxpc3RfaW4sIGxpc3Rfb3V0LCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX2FycmF5X2ZyZWUgKGxpc3Rfb3V0LCBUUlVFKTsKKyAgZ19hcnJheV9mcmVlIChsaXN0X2luLCBUUlVFKTsKKworICBlbnVtX291dCA9IFRfVEVTVF9OVU1CRVJaX09ORTsKKyAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfZW51bSAoaWZhY2UsICZlbnVtX2luLCBlbnVtX291dCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgYXNzZXJ0IChlbnVtX2luID09IGVudW1fb3V0KTsKKyAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICB1c2VyX2lkX291dCA9IDEyMzQ1OworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF90eXBlZGVmIChpZmFjZSwgJnVzZXJfaWRfaW4sIHVzZXJfaWRfb3V0LCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKHVzZXJfaWRfaW4gPT0gdXNlcl9pZF9vdXQpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tYXBfbWFwIChpZmFjZSwgJm1hcF9pbiwgaTMyLCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX2hhc2hfdGFibGVfZGVzdHJveSAobWFwX2luKTsKKworICAvLyBpbnNhbml0eQorICBpbnNhbml0eV9vdXQgPSAoVFRlc3RJbnNhbml0eSAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKKyAgaW5zYW5pdHlfb3V0LT51c2VyTWFwID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGluc2FuaXR5X291dC0+dXNlck1hcCwgR0lOVF9UT19QT0lOVEVSIChlbnVtX291dCksICZ1c2VyX2lkX291dCk7CisKKyAgeHRydWN0MSA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgIHh0cnVjdDEtPmJ5dGVfdGhpbmcgPSAxOworICB4dHJ1Y3QxLT5fX2lzc2V0X2J5dGVfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3QxLT5pMzJfdGhpbmcgPSAxNTsKKyAgeHRydWN0MS0+X19pc3NldF9pMzJfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3QxLT5pNjRfdGhpbmcgPSAxNTE7CisgIHh0cnVjdDEtPl9faXNzZXRfaTY0X3RoaW5nID0gVFJVRTsKKyAgeHRydWN0MS0+c3RyaW5nX3RoaW5nID0gZ19zdHJkdXAgKCJhYmMxMjMiKTsKKyAgeHRydWN0MS0+X19pc3NldF9zdHJpbmdfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3QyID0gKFRUZXN0WHRydWN0ICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgeHRydWN0Mi0+Ynl0ZV90aGluZyA9IDE7CisgIHh0cnVjdDItPl9faXNzZXRfYnl0ZV90aGluZyA9IFRSVUU7CisgIHh0cnVjdDItPmkzMl90aGluZyA9IDE1OworICB4dHJ1Y3QyLT5fX2lzc2V0X2kzMl90aGluZyA9IFRSVUU7CisgIHh0cnVjdDItPmk2NF90aGluZyA9IDE1MTsKKyAgeHRydWN0Mi0+X19pc3NldF9pNjRfdGhpbmcgPSBUUlVFOworICB4dHJ1Y3QyLT5zdHJpbmdfdGhpbmcgPSBnX3N0cmR1cCAoImFiYzEyMyIpOworICB4dHJ1Y3QyLT5fX2lzc2V0X3N0cmluZ190aGluZyA9IFRSVUU7CisKKyAgaW5zYW5pdHlfaW4gPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChpbnNhbml0eV9vdXQtPnh0cnVjdHMsIHh0cnVjdDEpOworICBnX3B0cl9hcnJheV9hZGQgKGluc2FuaXR5X291dC0+eHRydWN0cywgeHRydWN0Mik7CisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2luc2FuaXR5IChpZmFjZSwgJmluc2FuaXR5X2luLCBpbnNhbml0eV9vdXQsICZlcnJvcikgPT0gVFJVRSk7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChpbnNhbml0eV9pbik7CisgIGdfcHRyX2FycmF5X2ZyZWUgKGluc2FuaXR5X291dC0+eHRydWN0cywgVFJVRSk7CisKKyAgbXVsdGlfbWFwX291dCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOworICBzdHJpbmcgPSBnX3N0cmR1cCAoImFiYzEyMyIpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChtdWx0aV9tYXBfb3V0LCAmaTE2LCBzdHJpbmcpOworICBtdWx0aV9pbiA9IChUVGVzdFh0cnVjdCAqKSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X211bHRpIChpZmFjZSwgJm11bHRpX2luLCBieXRlLCBpMzIsIGk2NCwgbXVsdGlfbWFwX291dCwgZW51bV9vdXQsIHVzZXJfaWRfb3V0LCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKG11bHRpX2luLT5pMzJfdGhpbmcgPT0gaTMyKTsKKyAgYXNzZXJ0IChtdWx0aV9pbi0+aTY0X3RoaW5nID09IGk2NCk7CisgIGdfb2JqZWN0X3VucmVmIChtdWx0aV9pbik7CisgIGdfaGFzaF90YWJsZV91bnJlZiAobXVsdGlfbWFwX291dCk7CisgIGdfZnJlZSAoc3RyaW5nKTsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9leGNlcHRpb24gKGlmYWNlLCAiWGNlcHRpb24iLCAmeGNlcHRpb24sICZlcnJvcikgPT0gRkFMU0UpOworICBhc3NlcnQgKHhjZXB0aW9uLT5lcnJvckNvZGUgPT0gMTAwMSk7CisgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICBlcnJvciA9IE5VTEw7CisgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7CisgIHhjZXB0aW9uID0gTlVMTDsKKworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9leGNlcHRpb24gKGlmYWNlLCAiQXBwbGljYXRpb25FeGNlcHRpb24iLCAmeGNlcHRpb24sICZlcnJvcikgPT0gRkFMU0UpOworICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgZXJyb3IgPSBOVUxMOworICBhc3NlcnQgKHhjZXB0aW9uID09IE5VTEwpOworCisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2V4Y2VwdGlvbiAoaWZhY2UsICJUZXN0IiwgJnhjZXB0aW9uLCAmZXJyb3IpID09IFRSVUUpOworICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworCisgIG11bHRpX2luID0gKFRUZXN0WHRydWN0KikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aV9leGNlcHRpb24gKGlmYWNlLCAmbXVsdGlfaW4sICJYY2VwdGlvbiIsIE5VTEwsICZ4Y2VwdGlvbiwgJnhjZXB0aW9uMiwgJmVycm9yKSA9PSBGQUxTRSk7CisgIGFzc2VydCAoeGNlcHRpb24tPmVycm9yQ29kZSA9PSAxMDAxKTsKKyAgYXNzZXJ0ICh4Y2VwdGlvbjIgPT0gTlVMTCk7CisgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICBlcnJvciA9IE5VTEw7CisgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7CisgIGdfb2JqZWN0X3VucmVmIChtdWx0aV9pbik7CisgIHhjZXB0aW9uID0gTlVMTDsKKyAgbXVsdGlfaW4gPSBOVUxMOworCisgIG11bHRpX2luID0gKFRUZXN0WHRydWN0KikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aV9leGNlcHRpb24gKGlmYWNlLCAmbXVsdGlfaW4sICJYY2VwdGlvbjIiLCBOVUxMLCAmeGNlcHRpb24sICZ4Y2VwdGlvbjIsICZlcnJvcikgPT0gRkFMU0UpOworICBhc3NlcnQgKHhjZXB0aW9uMi0+ZXJyb3JDb2RlID09IDIwMDIpOworICBhc3NlcnQgKHhjZXB0aW9uID09IE5VTEwpOworICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgZXJyb3IgPSBOVUxMOworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKKyAgZ19vYmplY3RfdW5yZWYgKG11bHRpX2luKTsKKyAgeGNlcHRpb24yID0gTlVMTDsKKyAgbXVsdGlfaW4gPSBOVUxMOworCisgIG11bHRpX2luID0gKFRUZXN0WHRydWN0KikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworICBhc3NlcnQgKHRfdGVzdF90aHJpZnRfdGVzdF9jbGllbnRfdGVzdF9tdWx0aV9leGNlcHRpb24gKGlmYWNlLCAmbXVsdGlfaW4sIE5VTEwgLCBOVUxMLCAmeGNlcHRpb24sICZ4Y2VwdGlvbjIsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmKG11bHRpX2luKTsKKyAgbXVsdGlfaW4gPSBOVUxMOworCisgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X29uZXdheSAoaWZhY2UsIDEsICZlcnJvcikgPT0gVFJVRSk7CisgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgLyogc2xlZXAgdG8gbGV0IHRoZSBvbmV3YXkgY2FsbCBnbyB0aHJvdWdoICovCisgIHNsZWVwICg1KTsKKworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChUSFJJRlRfVFJBTlNQT1JUKHRzb2NrZXQpLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworCit9IC8qIGV4dGVybiAiQyIgKi8KKworCitzdGF0aWMgdm9pZAorYmFpbG91dCAoaW50IHNpZ251bSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSAoc2lnbnVtKTsKKworICBleGl0ICgxKTsKK30KKworaW50CittYWluICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBpbnQgcGlkID0gZm9yayAoKTsKKyAgYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKSAvKiBjaGlsZCAqLworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyaWZ0VGVzdFByb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvcihuZXcgVGhyaWZ0VGVzdFByb2Nlc3Nvcih0ZXN0SGFuZGxlcikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQoVEVTVF9QT1JUKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworICAgIFRTaW1wbGVTZXJ2ZXIgc2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzaWduYWwgKFNJR0FMUk0sIGJhaWxvdXQpOworICAgIGFsYXJtICg2MCk7CisgICAgc2ltcGxlU2VydmVyLnNlcnZlKCk7CisgIH0gZWxzZSB7CisgICAgc2xlZXAgKDEpOworICAgIHRlc3RfdGhyaWZ0X2NsaWVudCAoKTsKKyAgICBraWxsIChwaWQsIFNJR0lOVCk7CisgICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg5YzYxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKworI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfQorCisvKiBzdWJzdGl0dXRlZCBmdW5jdGlvbnMgdG8gdGVzdCBmYWlsdXJlcyBvZiBzeXN0ZW0gYW5kIGxpYnJhcnkgY2FsbHMgKi8KK3N0YXRpYyBpbnQgc29ja2V0X2Vycm9yID0gMDsKK2ludAorbXlfc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCit7CisgIGlmIChzb2NrZXRfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCByZWN2X2Vycm9yID0gMDsKK3NzaXplX3QKK215X3JlY3YoaW50IHNvY2tldCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisgIGlmIChyZWN2X2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHJlY3YgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzZW5kX2Vycm9yID0gMDsKK3NzaXplX3QKK215X3NlbmQoaW50IHNvY2tldCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCit7CisgIGlmIChzZW5kX2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworI2RlZmluZSBzb2NrZXQgbXlfc29ja2V0CisjZGVmaW5lIHJlY3YgbXlfcmVjdgorI2RlZmluZSBzZW5kIG15X3NlbmQKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jIgorI3VuZGVmIHNvY2tldAorI3VuZGVmIHJlY3YKKyN1bmRlZiBzZW5kCisKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKTsKKy8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCit7CisgIGdjaGFyICpob3N0bmFtZSA9IE5VTEw7CisgIGd1aW50IHBvcnQgPSAwOworCisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChvYmplY3QpLCAiaG9zdG5hbWUiLCAmaG9zdG5hbWUsICJwb3J0IiwgJnBvcnQsIE5VTEwpOworICBnX2ZyZWUgKGhvc3RuYW1lKTsKKworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2Uodm9pZCkKK3sKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIGludCBwb3J0ID0gNTExOTk7CisgIHBpZF90IHBpZDsKKyAgaW50IHN0YXR1czsKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwgMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCXRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKwkvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KKwl0c29ja2V0LT5zZCA9IC0xOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCisJLyogdHJ5IGEgaG9zdG5hbWUgbG9va3VwIGZhaWx1cmUgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKKwkJCQlOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwkvKiB0cnkgYW4gZXJyb3IgY2FsbCB0byBzb2NrZXQoKSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCXNvY2tldF9lcnJvciA9IDE7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJc29ja2V0X2Vycm9yID0gMDsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGUodm9pZCkKK3sKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIGludCBzdGF0dXM7CisgIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKworCS8qIHdyaXRlIGZhaWwgKi8KKwlzZW5kX2Vycm9yID0gMTsKKwl0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJc2VuZF9lcnJvciA9IDA7CisKKwl0aHJpZnRfc29ja2V0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfc29ja2V0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQorfQorCisvKiB0ZXN0IFRocmlmdFNvY2tldCdzIHBlZWsoKSBpbXBsZW1lbnRhdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3RfcGVlayh2b2lkKQoreworICBnaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBndWludCBwb3J0ID0gNTExOTk7CisgIGdjaGFyIGRhdGEgPSAnQSc7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50X3RyYW5zcG9ydDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorCQkJCSAgICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSAgICJwb3J0IiwgICAgIHBvcnQsCisJCQkJICAgTlVMTCk7CisKKyAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgRkFMU0Ugd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCAqLworICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgICAgeworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKKworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworCisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCSAgICAgICAicG9ydCIsIHBvcnQsCisJCQkJICAgICAgIE5VTEwpOworICAgICAgZ19hc3NlcnQgKHNlcnZlcl90cmFuc3BvcnQgIT0gTlVMTCk7CisKKyAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyX3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICAgICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldworCSAgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkgICAidHJhbnNwb3J0IiwgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoc2VydmVyX3RyYW5zcG9ydCwgJmVycm9yKSwKKwkgICAicl9idWZfc2l6ZSIsIDAsCisJICAgIndfYnVmX3NpemUiLCBzaXplb2YgZGF0YSwKKwkgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnRfdHJhbnNwb3J0ICE9IE5VTEwpOworCisgICAgICAvKiB3cml0ZSBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgdG8gdGhlIGNsaWVudCAqLworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKGNsaWVudF90cmFuc3BvcnQsCisJCQkJCSZkYXRhLAorCQkJCQlzaXplb2YgZGF0YSwKKwkJCQkJJmVycm9yKSA9PSBUUlVFKTsKKworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOworCisgICAgICBleGl0ICgwKTsKKyAgICB9CisgIGVsc2UgeworICAgICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKyAgICAgIHNsZWVwICgxKTsKKworICAgICAgLyogY29ubmVjdCB0byB0aGUgY2hpbGQgKi8KKyAgICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IFRSVUUpOworCisgICAgICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBUUlVFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGFuZCB0aGVyZSBpcworICAgICAgIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gVFJVRSk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgICAgIC8qIHJlYWQgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGZyb20gdGhlIHNlcnZlciAqLworICAgICAgZ19hc3NlcnRfY21waW50ICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudF90cmFuc3BvcnQsCisJCQkJCSAgICAgICZkYXRhLAorCQkJCQkgICAgICBzaXplb2YgZGF0YSwKKwkJCQkJICAgICAgJmVycm9yKSwgPT0sIHNpemVvZiBkYXRhKTsKKworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgRkFMU0Ugd2hlbiB0aGUgc29ja2V0IGlzIG9wZW4gYnV0IHRoZXJlIGlzCisgICAgICAgbm8gKG1vcmUpIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IFRSVUUpOworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfcGVlayAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworCisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisKKyAgICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGludCBpOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgaW50IGJ5dGVzID0gMDsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGd1Y2hhciBidWZbMTBdOyAvKiBhIGJ1ZmZlciAqLworICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KKyAgYnl0ZXMgPSB0aHJpZnRfc29ja2V0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7CisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisKKyAgLyogZmFpbGVkIHJlYWQgKi8KKyAgcmVjdl9lcnJvciA9IDE7CisgIHRocmlmdF9zb2NrZXRfcmVhZCAoY2xpZW50LCBidWYsIDEsIE5VTEwpOworICByZWN2X2Vycm9yID0gMDsKKworICB0aHJpZnRfc29ja2V0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzb2NrZXQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzb2NrZXQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c29ja2V0L1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNvY2tldC9QZWVrIiwgdGVzdF9wZWVrKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyNjQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKQEAgLTAsMCArMSw1NDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDIwMDExMkwgLyogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzc1NDE5ODUvc3RvcmFnZS1zaXplLW9mLWFkZHJpbmZvLWlzbnQta25vd24gKi8KKworCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0Lmg+CisKKy8qICNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0gKi8KKyNkZWZpbmUgVEVTVF9EQVRBIHsgIkdFVCAvIEhUVFAvMS4xXG5cbiIgfQorCisKKy8qIHN1YnN0aXR1dGVkIGZ1bmN0aW9ucyB0byB0ZXN0IGZhaWx1cmVzIG9mIHN5c3RlbSBhbmQgbGlicmFyeSBjYWxscyAqLworc3RhdGljIGludCBzb2NrZXRfZXJyb3IgPSAwOworaW50CitteV9zb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkKK3sKKyAgaWYgKHNvY2tldF9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBzb2NrZXQgKGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpOworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHJlY3ZfZXJyb3IgPSAwOworc3NpemVfdAorbXlfcmVjdihpbnQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKK3sKKyAgaWYgKHJlY3ZfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gcmVjdiAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNlbmRfZXJyb3IgPSAwOworc3NpemVfdAorbXlfc2VuZChpbnQgc29ja2V0LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKK3sKKyAgaWYgKHNlbmRfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gc2VuZCAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCisjZGVmaW5lIHNvY2tldCBteV9zb2NrZXQKKyNkZWZpbmUgcmVjdiBteV9yZWN2CisjZGVmaW5lIHNlbmQgbXlfc2VuZAorI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jIgorI3VuZGVmIHNvY2tldAorI3VuZGVmIHJlY3YKKyN1bmRlZiBzZW5kCisKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7CisKKy8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQoreworICBnY2hhciAqaG9zdG5hbWUgPSBOVUxMOworICBndWludCBwb3J0ID0gMDsKKworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKG9iamVjdCksICJob3N0bmFtZSIsICZob3N0bmFtZSwgInBvcnQiLCAmcG9ydCwgTlVMTCk7CisgIGdfZnJlZSAoaG9zdG5hbWUpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX2NyZWF0ZV9hbmRfc2V0X3Byb3BlcnRpZXModm9pZCkKK3sKKyAgZ2NoYXIgKmhvc3RuYW1lID0gTlVMTDsKKyAgZ3VpbnQgcG9ydCA9IDA7CisgIFNTTF9DVFgqIHNzbF9jdHg9IE5VTEw7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXcoU1NMVExTLCAmZXJyb3IpOworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKG9iamVjdCksICJob3N0bmFtZSIsICZob3N0bmFtZSwgInBvcnQiLCAmcG9ydCwgInNzbF9jb250ZXh0IiwgJnNzbF9jdHgsIE5VTEwpOworICBnX2Fzc2VydCAoc3NsX2N0eCE9TlVMTCk7CisKKyAgZ19mcmVlIChob3N0bmFtZSk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zc2xfb3Blbl9hbmRfY2xvc2Vfbm9uX3NzbF9zZXJ2ZXIodm9pZCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0U1NMU29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisgIHBpZF90IHBpZDsKKyAgaW50IG5vbl9zc2xfcG9ydCA9IDUxMTk4OworICBjaGFyIGVycm9ybXNnWzI1NV07CisKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgLyogVGhpcyBpcyBhIG5vbiBTU0wgc2VydmVyICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlciAobm9uX3NzbF9wb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisKKwkvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KKwl0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCBub25fc3NsX3BvcnQsICZlcnJvcik7CisKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKwlnX2Fzc2VydF9jbXBzdHIoZXJyb3ItPm1lc3NhZ2UsID09ICwiRXJyb3Igd2hpbGUgY29ubmVjdC9iaW5kOiA2OCAtPiBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKTsKKwlnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKwl0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKwkvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KKwlUSFJJRlRfU09DS0VUKHRTU0xTb2NrZXQpLT5zZCA9IC0xOworCXRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKKworCS8qIHRyeSBhIGhvc3RuYW1lIGxvb2t1cCBmYWlsdXJlICovCisJdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0LmJyb2tlbiIsIG5vbl9zc2xfcG9ydCwgJmVycm9yKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKwlzbnByaW50ZihlcnJvcm1zZywgMjU1LCAiaG9zdCBsb29rdXAgZmFpbGVkIGZvciBsb2NhbGhvc3QuYnJva2VuOiVkIC0gVW5rbm93biBob3N0Iiwgbm9uX3NzbF9wb3J0KTsKKwlnX2Fzc2VydF9jbXBzdHIoZXJyb3ItPm1lc3NhZ2UsID09LCBlcnJvcm1zZyk7CisJZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKwlnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7CisJZXJyb3IgPSBOVUxMOworCisJCS8qIHRyeSBhbiBlcnJvciBjYWxsIHRvIHNvY2tldCgpICovCisJLyoKKwkJdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0IiwgcG9ydCwgJmVycm9yKTsKKwkJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisJCXNvY2tldF9lcnJvciA9IDE7CisJCWFzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKwkJc29ja2V0X2Vycm9yID0gMDsKKwkJZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworCQlnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKwkgKi8KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF93cml0ZV9pbnZhbGlkX3NvY2tldCh2b2lkKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRTU0xTb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKyAgY2hhciBidWZmZXJbXSA9ICJ0aGlzIG11c3Qgbm90IGJyZWFrIjsKKworICAvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KKyAgdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0IiwgNTExODgrMSwgJmVycm9yKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKyAgLyogRklYTUUgVGhpcyBtdXN0IGJlIHRlc3RlZCBidXQgc2luY2UgdGhlIGFzc2VydGlvbiBpbnNpZGUgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgYnJlYWtzIHRoZSB0ZXN0IHVuaXQKKyAgIGl0J3MgZGlzYWJsZWQuIFRoZXkgaWRlYSBpcyB0byBkaXNhYmxlIHRyYXAvY29yZWR1bXAgZHVyaW5nIHRoaXMgdGVzdAorICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUodHJhbnNwb3J0LCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZXJyb3IpID09IEZBTFNFKTsKKyAgZ19tZXNzYWdlICgid3JpdGVfZmFpbGVkX3dpdGhfZXJyb3I6ICVzIiwKKwkgICAgIGVycm9yICE9IE5VTEwgPyBlcnJvci0+bWVzc2FnZSA6ICJObyIpOworICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAqLworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisgIC8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworICBUSFJJRlRfU09DS0VUKHRTU0xTb2NrZXQpLT5zZCA9IC0xOworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworfQorCisKKworLyoqCisgKiBQcmludCB0aGUgY29tbW9uIG5hbWUgb2YgY2VydGlmaWNhdGUKKyAqLwordW5zaWduZWQgY2hhciAqIGdldF9jbl9uYW1lKFg1MDlfTkFNRSogY29uc3QgbmFtZSkKK3sKKyAgaW50IGlkeCA9IC0xOworICB1bnNpZ25lZCBjaGFyICp1dGY4ID0gTlVMTDsKKworICBkbworICAgIHsKKyAgICAgIGlmKCFuYW1lKSBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIGlkeCA9IFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKG5hbWUsIE5JRF9jb21tb25OYW1lLCAtMSk7CisgICAgICBpZighKGlkeCA+IC0xKSkgIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgWDUwOV9OQU1FX0VOVFJZKiBlbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSwgaWR4KTsKKyAgICAgIGlmKCFlbnRyeSkgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBBU04xX1NUUklORyogZGF0YSA9IFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShlbnRyeSk7CisgICAgICBpZighZGF0YSkgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBpbnQgbGVuZ3RoID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmdXRmOCwgZGF0YSk7CisgICAgICBpZighdXRmOCB8fCAhKGxlbmd0aCA+IDApKSAgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgfSB3aGlsZSAoMCk7CisgIHJldHVybiB1dGY4OworfQorCisvKgorICogSGFuZGxlIElQVjQgYW5kIElQVjYgYWRkcgorICovCit2b2lkICpnZXRfaW5fYWRkcihzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworICBpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQorICAgIHJldHVybiAmKCgoc3RydWN0IHNvY2thZGRyX2luKilzYSktPnNpbl9hZGRyKTsKKyAgcmV0dXJuICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilzYSktPnNpbjZfYWRkcik7Cit9CisKK2ludCB2ZXJpZnlfaXAoY2hhciAqIGhvc3RuYW1lLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcikKK3sKKyAgc3RydWN0IGFkZHJpbmZvICphZGRyX2luZm8sKnA7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgaW50IHJlczsKKyAgaW50IHJldHZhbCA9IDA7CisKKworICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YgKHN0cnVjdCBhZGRyaW5mbykpOworICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7IC8qIHVzZSBBRl9JTkVUNiB0byBmb3JjZSBJUHY2ICovCisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisKKworICBpZiAoIChyZXMgPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgTlVMTCwgJmhpbnRzLCAmYWRkcl9pbmZvKSApICE9IDApCisgICAgeworICAgICAgLyogZ2V0IHRoZSBob3N0IGluZm8gKi8KKyAgICAgIGdfZXJyb3IoIkNhbm5vdCBnZXQgdGhlIGhvc3QgYWRkcmVzcyIpOworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgIC8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHJlc3VsdHMgYW5kIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHdlIGNhbiAqLworICBjaGFyIGRuc2hvc3RbSU5FVDZfQUREUlNUUkxFTl07IC8qIGJpZ2dlciBhZGRyIHN1cHBvcnRlZCBJUFY2ICovCisgIGNoYXIgc29ja2V0X2lwW0lORVQ2X0FERFJTVFJMRU5dOworICBpZihpbmV0X250b3AoYWRkci0+c3NfZmFtaWx5LCBnZXRfaW5fYWRkcihhZGRyKSwgc29ja2V0X2lwLCBJTkVUNl9BRERSU1RSTEVOKT09c29ja2V0X2lwKXsKKyAgICAgIGdfZGVidWcoIldlIGFyZSBjb25uZWN0ZWQgdG8gaG9zdCAlcyBjaGVja2luZyBhZ2FpbnN0IGNlcnRpZmljYXRlLi4uIiwgc29ja2V0X2lwKTsKKyAgICAgIGludCBzaXplaXAgPSBzb2NrZXRfaXAhPU5VTEwgPyBzdHJsZW4oc29ja2V0X2lwKSA6IDA7CisgICAgICBmb3IocCA9IGFkZHJfaW5mbzsgcCAhPSBOVUxMOyBwID0gcC0+YWlfbmV4dCkgeworCSAgaWYoaW5ldF9udG9wKHAtPmFpX2ZhbWlseSwgZ2V0X2luX2FkZHIoKHN0cnVjdCBzb2NrYWRkciAqKXAtPmFpX2FkZHIpLCBkbnNob3N0LCBJTkVUNl9BRERSU1RSTEVOKT09ZG5zaG9zdCl7CisJICAgICAgaWYoZG5zaG9zdCE9TlVMTCl7CisJCSAgZ19pbmZvKCJETlMgYWRkcmVzcyBbJWkgLT4gJXNdIiwgcC0+YWlfYWRkciwgZG5zaG9zdCk7CisJCSAgaWYoIXN0cm5jbXAoZG5zaG9zdCwgc29ja2V0X2lwLCBzaXplaXApKXsKKwkJICAgICAgcmV0dmFsPTE7CisJCSAgICAgIGJyZWFrOyAvKiBpZiB3ZSBnZXQgaGVyZSwgd2UgbXVzdCBoYXZlIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkgKi8KKwkJICB9CisJICAgICAgfQorCSAgfQorICAgICAgfQorICB9CisKKyAgaWYoYWRkcl9pbmZvKQorICAgIGZyZWVhZGRyaW5mbyhhZGRyX2luZm8pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX2Zyb21fZmlsZShjaGFyICpidWZmZXIsIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworICBjaGFyIGNoOworICBsb25nIGluZGV4PTA7CisgIEZJTEUgKmZwOworCisgIGZwID0gZm9wZW4oZmlsZV9uYW1lLCJyIik7IC8qIHJlYWQgbW9kZSAqLworCisgIGlmKCBmcCA9PSBOVUxMICkKKyAgICB7CisgICAgICBwZXJyb3IoIkVycm9yIHdoaWxlIG9wZW5pbmcgdGhlIGZpbGUuXG4iKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgcHJpbnRmKCJUaGUgY29udGVudHMgb2YgJXMgZmlsZSBhcmUgOlxuIiwgZmlsZV9uYW1lKTsKKworICB3aGlsZShpbmRleDxzaXplICYmICggY2ggPSBmZ2V0YyhmcCkgKSAhPSBFT0YgKXsKKyAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGNoOworICB9CisKKyAgZmNsb3NlKGZwKTsKK30KKworI2RlZmluZSBJU1NVRVJfQ05fUElOTklORyAiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIgorI2RlZmluZSBTVUJKRUNUX0NOX1BJTk5JTkcgImxvY2FsaG9zdCIKKyNkZWZpbmUgQ0VSVF9TRVJJQUxfTlVNQkVSICIxIgorCitnYm9vbGVhbiB2ZXJpZnlfY2VydGlmaWNhdGVfc24oWDUwOSAqY2VydCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2VyaWFsX251bWJlcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisKKyAgQVNOMV9JTlRFR0VSICpzZXJpYWwgPSBYNTA5X2dldF9zZXJpYWxOdW1iZXIoY2VydCk7CisKKyAgQklHTlVNICpibiA9IEFTTjFfSU5URUdFUl90b19CTihzZXJpYWwsIE5VTEwpOworICBpZiAoIWJuKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBjb252ZXJ0IEFTTjFJTlRFR0VSIHRvIEJOXG4iKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgY2hhciAqdG1wID0gQk5fYm4yZGVjKGJuKTsKKyAgaWYgKCF0bXApIHsKKyAgICAgIGdfd2FybmluZyhzdGRlcnIsICJ1bmFibGUgdG8gY29udmVydCBCTiB0byBkZWNpbWFsIHN0cmluZy5cbiIpOworICAgICAgQk5fZnJlZShibik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisgIC8qCisgICAgaWYgKHN0cmxlbih0bXApID49IGxlbikgeworICAgICAgZ193YXJuKHN0ZGVyciwgImJ1ZmZlciBsZW5ndGggc2hvcnRlciB0aGFuIHNlcmlhbCBudW1iZXJcbiIpOworICAgICAgQk5fZnJlZShibik7CisgICAgICBPUEVOU1NMX2ZyZWUodG1wKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAqLworICBpZighc3RybmNtcChzZXJpYWxfbnVtYmVyLCB0bXAsIHN0cmxlbihzZXJpYWxfbnVtYmVyKSkpeworICAgICAgcmV0dmFsPVRSVUU7CisgIH1lbHNleworICAgICAgZ193YXJuaW5nKCJTZXJpYWwgbnVtYmVyIGlzIG5vdCB2YWxpZCIpOworICB9CisKKyAgQk5fZnJlZShibik7CisgIE9QRU5TU0xfZnJlZSh0bXApOworICByZXR1cm4gcmV0dmFsOworfQorCitnYm9vbGVhbiBteV9hY2Nlc3NfbWFuYWdlcihUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xTb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBnX2luZm8oIlByb2Nlc3NpbmcgYWNjZXNzIHRvIHRoZSBzZXJ2ZXIiKTsKKyAgWDUwOV9OQU1FKiBpbmFtZSA9IGNlcnQgPyBYNTA5X2dldF9pc3N1ZXJfbmFtZShjZXJ0KSA6IE5VTEw7CisgIFg1MDlfTkFNRSogc25hbWUgPSBjZXJ0ID8gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpIDogTlVMTDsKKworICAvKiBJc3N1ZXIgaXMgdGhlIGF1dGhvcml0eSB3ZSB0cnVzdCB0aGF0IHdhcnJhbnRzIG5vdGhpbmcgdXNlZnVsICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBpc3N1ZXIgPSBnZXRfY25fbmFtZShpbmFtZSk7CisgIGlmKGlzc3Vlcil7CisgICAgICBnYm9vbGVhbiB2YWxpZCA9IFRSVUU7CisgICAgICBnX2luZm8oIklzc3VlciAoY24pICVzIiwgaXNzdWVyKTsKKworICAgICAgLyogSXNzdWVyIHBpbm5pbmcgKi8KKyAgICAgIGlmKHN0cm5jbXAoSVNTVUVSX0NOX1BJTk5JTkcsIGlzc3Vlciwgc3RybGVuKElTU1VFUl9DTl9QSU5OSU5HKSkpeworCSAgZ193YXJuaW5nKCJUaGUgSXNzdWVyIG9mIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQiKTsKKwkgIHZhbGlkPUZBTFNFOworICAgICAgfQorICAgICAgT1BFTlNTTF9mcmVlKGlzc3Vlcik7CisgICAgICBpZighdmFsaWQpCisJcmV0dXJuIHZhbGlkOworICB9CisKKworICAvKiBTdWJqZWN0IGlzIHdobyB0aGUgY2VydGlmaWNhdGUgaXMgaXNzdWVkIHRvIGJ5IHRoZSBhdXRob3JpdHkgICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzdWJqZWN0ID0gZ2V0X2NuX25hbWUoc25hbWUpOworICBpZihzdWJqZWN0KXsKKyAgICAgIGdfaW5mbygiU3ViamVjdCAoY24pICVzIiwgc3ViamVjdCk7CisgICAgICBnYm9vbGVhbiB2YWxpZCA9IFRSVUU7CisKKyAgICAgIC8qIFN1YmplY3QgcGlubmluZyAqLworICAgICAgaWYoc3RybmNtcChTVUJKRUNUX0NOX1BJTk5JTkcsIHN1YmplY3QsIHN0cmxlbihTVUJKRUNUX0NOX1BJTk5JTkcpKSl7CisJICBnX3dhcm5pbmcoIlRoZSBzdWJqZWN0IG9mIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQiKTsKKwkgIHZhbGlkPUZBTFNFOworICAgICAgfQorCisgICAgICBpZighdmFsaWQpCisJcmV0dXJuIHZhbGlkOworCisgICAgICAvKiBIb3N0IHBpbm5pbmcgICAgICAgKi8KKyAgICAgIGlmKHZlcmlmeV9pcChzdWJqZWN0LCBhZGRyKSl7CisJICBnX2luZm8oIlZlcmlmaWVkIHN1YmplY3QiKTsKKyAgICAgIH1lbHNleworCSAgZ19pbmZvKCJDYW5ub3QgdmVyaWZ5IHN1YmplY3QiKTsKKwkgIHZhbGlkPUZBTFNFOworICAgICAgfQorICAgICAgT1BFTlNTTF9mcmVlKHN1YmplY3QpOworCisgICAgICBpZighdmFsaWQpCisJcmV0dXJuIHZhbGlkOworICB9CisKKyAgaWYoIXZlcmlmeV9jZXJ0aWZpY2F0ZV9zbihjZXJ0LCBDRVJUX1NFUklBTF9OVU1CRVIpKXsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfWVsc2V7CisgICAgICBnX2luZm8oIlZlcmlmaWVkIHNlcmlhbCBudW1iZXIiKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCit9CisKKworCisKKyNpZmRlZiBCVUlMRF9TRVJWRVIKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9hdXRob3JpemF0aW9uX21hbmFnZXIodm9pZCkKK3sKKyAgaW50IHN0YXR1cz0wOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNTTFNvY2tldCAqdFNTTHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgLyogIGludCBwb3J0ID0gNTExOTk7ICovCisgIGludCBwb3J0ID0gNDQzOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisKKyAgZ3VjaGFyIGJ1ZlsxN10gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCisKKy8qCisgIHBpZCA9IGZvcmsgKCk7CisgICAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgICAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJKi8KKyAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKyAgc2xlZXAgKDEpOworCisgIC8qIFRlc3QgYWdhaW5zdCBsZXZlbDIgb3duY2xvdWQgY2VydGlmaWNhdGUgKi8KKyAgdFNTTHNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0IiwgcG9ydCwgJmVycm9yKTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X21hbmFnZXIodFNTTHNvY2tldCwgbXlfYWNjZXNzX21hbmFnZXIpOyAgICAgICAgICAgLyogSW5zdGFsbCBwaW5uaW5nIG1hbmFnZXIgKi8KKyAgLyogdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKHRTU0xzb2NrZXQsICIuL293bmNsb3VkLmxldmVsMmNybS5wZW0iKTsgKi8KKyAgdW5zaWduZWQgY2hhciBjZXJ0X2J1ZmZlcls2NTUzNF07CisgIHJlYWRfZnJvbV9maWxlKGNlcnRfYnVmZmVyLCA2NTUzNCwgIi4uLy4uL2tleXMvY2xpZW50LnBlbSIpOworICBpZighdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9idWZmZXIodFNTTHNvY2tldCwgY2VydF9idWZmZXIpKXsKKyAgICAgIGdfd2FybmluZygiQ2VydGlmaWNhdGVzIGNhbm5vdCBiZSBsb2FkZWQhIik7CisgIH0KKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMc29ja2V0KTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICB0aHJpZnRfc3NsX3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDE3LCBOVUxMKTsKKworICAvKiB3cml0ZSBmYWlsICovCisgIHNlbmRfZXJyb3IgPSAxOworICAvKgorICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKyAgICAgc2VuZF9lcnJvciA9IDA7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgICovCisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodFNTTHNvY2tldCk7CisKKyAgLyogICAgZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsgKi8KKyAgZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAvKiAgfSAqLworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgaW50IGJ5dGVzID0gMDsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGd1Y2hhciBidWZbMTBdOyAvKiBhIGJ1ZmZlciAqLworICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KKyAgYnl0ZXMgPSB0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworCisgIC8qIGZhaWxlZCByZWFkICovCisgIHJlY3ZfZXJyb3IgPSAxOworICB0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMSwgTlVMTCk7CisgIHJlY3ZfZXJyb3IgPSAwOworCisgIHRocmlmdF9zc2xfc29ja2V0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByZXR2YWw7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIHRocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCgpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X3NzbF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9DcmVhdGVBbmRTZXRQcm9wZXJ0aWVzIiwgdGVzdF9zc2xfY3JlYXRlX2FuZF9zZXRfcHJvcGVydGllcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L09wZW5BbmRDbG9zZU5vblNTTFNlcnZlciIsIHRlc3Rfc3NsX29wZW5fYW5kX2Nsb3NlX25vbl9zc2xfc2VydmVyKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvT3BlbkFuZFdyaXRlSW52YWxpZFNvY2tldCIsIHRlc3Rfc3NsX3dyaXRlX2ludmFsaWRfc29ja2V0KTsKKworCisKKworICByZXR2YWwgPSBnX3Rlc3RfcnVuICgpOworCisgIHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2woKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMuaW4gYi9saWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4YzdhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGhyaWZ0X2NfZ2xpYi5wYy5pbgpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IFRocmlmdAorRGVzY3JpcHRpb246IFRocmlmdCBDIEFQSQorVmVyc2lvbjogQFZFUlNJT05ACitSZXF1aXJlczogZ2xpYi0yLjAgZ29iamVjdC0yLjAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0X2NfZ2xpYgorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jbC9NYWtlZmlsZS5hbSBiL2xpYi9jbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGIzODg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCithbGwtbG9jYWw6CisJYmFzaCBlbnN1cmUtZXh0ZXJuYWxzLnNoCisKK3J1bi10ZXN0czogdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IHRlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCisKK2NoZWNrLWxvY2FsOiBydW4tdGVzdHMKKwkuL3J1bi10ZXN0cworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBydW4tdGVzdHMgcXVpY2tsaXNwLmxpc3AgYmFja3BvcnQtdXBkYXRlLnppcAorCSQoUk0pIC1yZiBsaWIgZXh0ZXJuYWxzIHF1aWNrbGlzcAorCitFWFRSQV9ESVNUID0gXAorCVJFQURNRS5tZCBcCisJUkVBRE1FUyBcCisJbG9hZC1sb2NhbGx5Lmxpc3AgXAorCXRlc3QgXAorCWVuc3VyZS1leHRlcm5hbHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUUubWQgYi9saWIvY2wvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmVhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjUzIEBACitUaHJpZnQgQ29tbW9uIExpc3AgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKKworVXNpbmcgVGhyaWZ0IHdpdGggQ29tbW9uIExpc3AKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIFRocmlmdCBpcyBhIHByb3RvY29sIGFuZCBsaWJyYXJ5IGZvciBsYW5ndWFnZS1pbmRlcGVuZGVudCBjb21tdW5pY2F0aW9uIGJldHdlZW4gY29vcGVyYXRpbmcKKyBwcm9jZXNzZXMuIFRoZSBjb21tdW5pY2F0aW9uIHRha2VzIHRoZSBmb3JtIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2VzLCBvZiB3aGljaCB0aGUgZm9ybXMKKyBhcmUgc3BlY2lmaWVkIGluIGFkdmFuY2UgdGhyb3VmaCBhIHNoYXJlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gQSBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlIGlzIHRyYW5zbGF0ZWQKKyBpbnRvIExpc3Agc291cmNlIGZpbGVzLCB3aGljaCBjb21wcmlzZSBzZXZlcmFsIGRlZmluaXRpb25zOgorCisgICogVGhyZWUgcGFja2FnZXMsIG9uZSBmb3IgdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb3BlcmF0b3JzLCBhbmQgb25lIGVhY2ggZm9yIHJlcXVlc3QgYW5kCisgIHJlc3BvbnNlIG9wZXJhdG9ycy4KKyAgKiBWYXJpb3VzIHR5cGUgZGVmaW5pdGlvbnMgYXMgaW1wbGVtZW50YXRpb25zIGZvciBUaHJpZnQgdHlwZWRlZiBhbmQgZW51bSBkZWZpbml0aW9ucy4KKyAgKiBERUYtU1RSVUNUIGFuZCBERUYtRVhDRVBUSU9OIGZvcm1zIGZvciBUaHJpZnQgc3RydWN0IGFuZCBleGNlcHRpb24gZGVmaW5pdGlvbnMuCisgICogREVGLVNFUlZJQ0UgZm9ybXMgZm9yIHRocmlmdCBzZXJ2aWNlIGRlZmluaXRpb25zLgorCisgRWFjaCBzZXJ2aWNlIGRlZmluaXRpb24gZXhwYW5kcyBpbiBhIGNvbGxlY3Rpb24gb2YgZ2VuZXJpYyBmdW5jdGlvbiBkZWZpbml0aW9ucy4gRm9yIGVhY2ggYG9wYAorIGluIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24sIHR3byBmdW5jdGlvbnMgYXJlIGRlZmluZWQKKworICAqIGBvcGAtcmVxdWVzdCBpcyBkZWZpbmVkIGZvciB1c2UgYnkgYSBjbGllbnQuIEl0IGFjY2VwdHMgYW4gYWRkaXRpb25hbCBpbml0aWFsIGBwcm90b2NvbGAgYXJndW1lbnQsCisgICAgdG8gYWN0IGFzIHRoZSBjbGllbnQgcHJveHkgZm9yIHRoZSBvcGVyYXRpb24gYW5kIG1lZGlhdGUgdGhlIGludGVyYWN0aW9uIHdpdGggYSByZW1vdGUgcHJvY2VzcworICAgIHRocm91Z2ggYSBUaHJpZnQtZW5jb2RlZCB0cmFuc3BvcnQgc3RyZWFtLgorICAqIGBvcGAtcmVzcG9uc2UgaXMgZGVmaW5lZCBmb3IgdXNlIGJ5IGEgc2VydmVyLiBJdCBhY2NlcHRzIGEgc2luZ2xlIGBwcm90b2NvbGAgYXJndW1lbnQuIEEgc2VydmVyCisgICAgdXNlcyBpdCB0byBkZWNvZGUgdGhlIHJlcXVlc3QgbWVzc2FnZSwgaW52b2tlIHRoZSBiYXNlIGBvcGAgZnVuY3Rpb24gd2l0aCB0aGUgbWVzc2FnZSBhcmd1bWVudHMsCisgICAgZW5jb2RlIGFuZCBzZW5kIHRoZSB0aGUgcmVzdWx0IGFzIGEgcmVzcG9uc2UsIGFuZCBoYW5kbGVzIGV4Y2VwdGlvbnMuCisKKyBUaGUgY2xpZW50IGludGVyZmFjZSBpcyBvbmUgb3BlcmF0b3IKKworICAqIGB3aXRoLWNsaWVudCAodmFyaWFibGUgbG9jYXRpb24pIC4gYm9keWAgOiBjcmVhdGVzIGEgY29ubmVjdGlvbiBpbiBhIGR5bmFtaWMgY29udGV4dCBhbmQgY2xvc2VzIGl0CisgICAgdXBvbiBleGl0LiBUaGUgdmFyaWFibGUgaXMgYm91bmQgdG8gYSBjbGllbnQgcHJveHkgc3RyZWFtL3Byb3RvY29sIGluc3RhbmNlLCB3aGljaCB3cmFwcyB0aGUKKyAgICBiYXNlIGkvbyBzdHJlYW0gLSBzb2NrZXQsIGZpbGUsIGV0Yywgd2l0aCBhbiBvcGVyYXRvcnMgd2hpY2ggaW1wbGVtZW50IHRoZSBUaHJpZnQgcHJvdG9jb2wKKyAgICBhbmQgdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisKKyBUaGUgc2VydmVyIGludGVyZmFjZSBjb21iaW5lcyBzZXJ2ZXIgYW5kIHNlcnZpY2Ugb2JqZWN0cworCisgICogYHNlcnZlIChsb2NhdGlvbiBzZXJ2aWNlKWAgOiBhY2NlcHRzIGNvbm5lY3Rpb25zIG9uIHRoZSBkZXNpZ25hdGVkIHBvcnQgYW5kIHJlc3BvbmRzIHRvCisgICAgcmVxdWVzdHMgb2YgdGhlIHNlcnZpY2UncyBvcGVyYXRpb25zLgorCisKK0J1aWxkaW5nIAorLS0tLS0tLS0KKworVGhlIFRocmlmdCBDb21tb24gTGlzcCBsaWJyYXJ5IGlzIHBhY2thZ2VkIGFzIHRoZSBBU0RGW1sxXV0gc3lzdGVtIGB0aHJpZnRgLgorSXQgZGVwZW5kcyBvbiB0aGUgc3lzdGVtcworCisqIHB1cmlbWzJdXSA6IGZvciB0aGUgdGhyaWZ0IHVyaSBjbGFzcworKiBjbG9zZXItbW9wW1szXV0gOiBmb3IgY2xhc3MgbWV0YWRhdGEKKyogdHJpdmlhbC11dGYtOFtbNF1dIDogZm9yIHN0cmluZyBjb2RlY3MKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKKworVGhlIGRlcGVuZGVuY2llcyBhcmUgYnVuZGxlZCBmb3IgbG9jYWwgYnVpbGRzIG9mIHRlc3RzIGFuZCB0dXRvcmlhbCBiaW5hcmllcyAtIAoraXQgaXMgcG9zc2libGUgdG8gdXNlIHRob3NlIGJ1bmRsZXMgdG8gbG9hZCB0aGUgbGlicmFyeSwgdG9vLgorCitJbiBvcmRlciB0byBidWlsZCBpdCwgcmVnaXN0ZXIgdGhvc2Ugc3lzdGVtcyB3aXRoIEFTREYgYW5kIGV2YWx1YXRlOgorCisgICAgKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKKworVGhpcyB3aWxsIGNvbXBpbGUgYW5kIGxvYWQgdGhlIExpc3AgY29tcGlsZXIgZm9yIFRocmlmdCBkZWZpbml0aW9uIGZpbGVzLCB0aGUKK3RyYW5zcG9ydCBhbmQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLCBhbmQgdGhlIGNsaWVudCBhbmQgc2VydmVyIGludGVyZmFjZQorZnVuY3Rpb25zLiBJbiBvcmRlciB0byB1c2UgVGhyaWZ0IGluIGFuIGFwcGxpY2F0aW9uLCBvbmUgbXVzdCBhbHNvIGF1dGhvciBhbmQvb3IKK2xvYWQgdGhlIGludGVyZmFjZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlbW90ZSBzZXJ2aWNlLltbOV1dIElmIG9uZSBpcyBpbXBsZW1lbnRpbmcgYSBzZXJ2aWNlLAorb25lIG11c3QgYWxzbyBkZWZpbmUgdGhlIGFjdHVhbCBmdW5jdGlvbnMgdG8gd2hpY2ggVGhyaWZ0IGlzIHRvIGFjdCBhcyB0aGUgcHJveHkKK2ludGVyZmFjZS4gVGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50IGZvbGxvd3MgdGhlIFRocmlmdCB0dXRvcmlhbCB0byBpbGx1c3RyYXRlIGhvdwordG8gcGVyZm9ybSB0aGUgc3RlcHMKKworICAqIGltcGxlbWVudCB0aGUgc2VydmljZQorICAqIHRyYW5zbGF0ZSB0aGUgVGhyaWZ0IElETAorICAqIGxvYWQgdGhlIExpc3Agc2VydmljZSBpbnRlcmZhY2VzCisgICogcnVuIGEgc2VydmVyIGZvciB0aGUgc2VydmljZQorICAqIHVzZSBhIGNsaWVudCB0byBhY2Nlc3MgdGhlIHNlcnZpY2UgcmVtb3RlbHkKKworTm90ZSB0aGF0LCBpZiBvbmUgaXMgdG8gaW1wbGVtZW50IGEgbmV3IHNlcnZpY2UsIG9uZSB3aWxsIGFsc28gbmVlZCB0byBhdXRob3IgdGhlCitJREwgZmlsZXMsIGFzIHRoZXJlIGlzIG5vIGZhY2lsaXR5IHRvIGdlbmVyYXRlIHRoZW0gZnJvbSBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCisKKworSW1wbGVtZW50IHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHR1dG9yaWFsIGNvbXByaXNlcyBzZXJ2ZXJhbCBmdW5jdGlvbnM6IGBhZGRgLCBgcGluZ2AsIGB6aXBgLCBhbmQgYGNhbGN1bGF0ZWAuCitFYWNoIHRyYW5zbGF0ZWQgSURMIGZpbGUgZ2VuZXJhdGVzIHRocmVlIHBhY2thZ2VzIGZvciBldmVyeSBzZXJ2aWNlLiBJbiB0aGUgY2FzZSBvZgordGhlIHR1dG9yaWFsIGZpbGUsIHRoZSByZWxldmFudCBwYWNrYWdlcyBhcmU6CisKKyAgKiB0dXRvcmlhbC5jYWxjdWxhdG9yCisgICogdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbgorICAqIHR1dG9yaWFsLmNhbGN1bGF0b3ItcmVzcG9uc2UKKyAgCitUaGlzIGlzIHRvIHNlcGFyYXRlIHRoZSByZXF1ZXN0IChnZW5lcmF0ZWQpLCByZXNwb25zZSAoZ2VuZXJhdGVkKSBhbmQgaW1wbGVtZW50YXRpb24KKyhtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcHJvZ3JhbW1lcikgZnVuY3Rpb25zIGZvciBkZWZpbmVkIFRocmlmdCBtZXRob2RzLgorCitJdCBpcyBzdWdnZXN0ZWQgdG8gd29yayBpbiB0aGUgYHR1dG9yaWFsLWltcGxlbWVudGF0aW9uYCBwYWNrYWdlIHdoaWxlIGltcGxlbWVudGluZwordGhlIHNlcnZpY2VzIC0gaXQgaW1wb3J0cyB0aGUgYGNvbW1vbi1saXNwYCBwYWNrYWdlLCB3aGlsZSB0aGUgc2VydmljZS1zcGVjaWZpYyBvbmVzCitkb24ndCAodG8gYXZvaWQgY29uZmxpY3RzIGJldHdlZW4gVGhyaWZ0IG1ldGhvZCBuYW1lcyBhbmQgZnVuY3Rpb24gbmFtZXMgaW4gYGNvbW1vbi1saXNwYCkuCisKKyAgICA7OyBkZWZpbmUgdGhlIGJhc2Ugb3BlcmF0aW9ucworICAgIAorICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbikKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjphZGQgKG51bTEgbnVtMikKKyAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBhZGQgfkEgYW5kIH5BLiIgbnVtMSBudW0yKQorICAgICAgKCsgbnVtMSBudW0yKSkKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpwaW5nICgpCisgICAgICAocHJpbnQgOnBpbmcpKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnppcCAoKQorICAgICAgKHByaW50IDp6aXApKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmNhbGN1bGF0ZSAobG9naWQgdGFzaykKKyAgICAgIChjYWxjdWxhdGUtb3AgKHdvcmstb3AgdGFzaykgKHdvcmstbnVtMSB0YXNrKSAod29yay1udW0yIHRhc2spKSkKKyAgICAKKyAgICAoZGVmZ2VuZXJpYyBjYWxjdWxhdGUtb3AgKG9wIGFyZzEgYXJnMikKKyAgICAgICg6bWV0aG9kIDphcm91bmQgKG9wIGFyZzEgYXJnMikKKyAgICAgICAgKGxldCAoKHJlc3VsdCAoY2FsbC1uZXh0LW1ldGhvZCkpKQorICAgICAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBjYWxjdWxhdGU6IH5kIG9uICB+QSBhbmQgfkEgPSB+ZC4iIG9wIGFyZzEgYXJnMiByZXN1bHQpCisgICAgICAgICAgcmVzdWx0KSkKKyAgICAKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24uYWRkKSkgYXJnMSBhcmcyKQorICAgICAgICAoKyBhcmcxIGFyZzIpKQorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5zdWJ0cmFjdCkpIGFyZzEgYXJnMikKKyAgICAgICAgKC0gYXJnMSBhcmcyKSkKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24ubXVsdGlwbHkpKSBhcmcxIGFyZzIpCisgICAgICAgICgqIGFyZzEgYXJnMikpCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLmRpdmlkZSkpIGFyZzEgYXJnMikKKyAgICAgICAgKC8gYXJnMSBhcmcyKSkpCisgICAgCisgICAgKGRlZnVuIHppcCAoKSAocHJpbnQgJ3ppcCkpCisKKworVHJhbnNsYXRlIHRoZSBUaHJpZnQgSURMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSURMIGZpbGVzIGVtcGxveSB0aGUgZmlsZSBleHRlbnNpb24gYHRocmlmdGAuIEluIHRoaXMgY2FzZSwgdGhlcmUgYXJlIHR3byBmaWxlcyB0byB0cmFuc2xhdGUKKyAgKiBgdHV0b3JpYWwudGhyaWZ0YAorICAqIGBzaGFyZWQudGhyaWZ0YAorQXMgdGhlIGZvcm1lciBpbmNsdWRlcyB0aGUgbGF0dGVyLCBvbmUgdXNlcyBpdCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJmYWNlczoKKworICAgICRUSFJJRlQvYmluL3RocmlmdCAtciAtLWdlbiBjbCAkVEhSSUZUL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorICAgIAorYC1yYCBzdGFuZHMgZm9yIHJlY3Vyc2lvbiwgd2hpbGUgYC0tZ2VuYCBsZXRzIG9uZSBjaG9vc2UgdGhlIGxhbmd1YWdlIHRvIHRyYW5zbGF0ZSB0by4KKworCitMb2FkIHRoZSBMaXNwIHRyYW5zbGF0ZWQgc2VydmljZSBpbnRlcmZhY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0cmFuc2xhdG9yIGdlbmVyYXRlcyB0aHJlZSBmaWxlcyBmb3IgZWFjaCBJREwgZmlsZS4gRm9yIGV4YW1wbGUgYHR1dG9yaWFsLXR5cGVzLmxpc3BgLAorYHR1dG9yaWFsLXZhcnMubGlzcGAgYW5kIGFuIGAuYXNkYCBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9hZCB0aGVtIGJvdGggYW5kIHB1bGwgaW4KK290aGVyIGluY2x1ZGVzIChsaWtlIGBzaGFyZWRgIHdpdGhpbiB0aGUgdHV0b3JpYWwpIGFzIGRlcGVuZGVuY2llcy4KKworCitSdW4gYSBTZXJ2ZXIgZm9yIHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhY3R1YWwgc2VydmljZSBuYW1lLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGBkZWYtc2VydmljZWAgZm9ybSBpbiBgdHV0b3JpYWwubGlzcGAsIGlzIGBjYWxjdWxhdG9yYC4gCitFYWNoIHNlcnZpY2UgZGVmaW5pdGlvbiBkZWZpbmVzIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBhbmQgYmluZHMgaXQgdG8gYQorc2VydmljZSBpbnN0YW5jZSB3aGNoIGRlc2NyaWJlcyB0aGUgb3BlcmF0aW9ucy4KKworSW4gb3JkZXIgdG8gc3RhcnQgYSBzZXJ2aWNlLCBzcGVjaWZ5IGEgbG9jYXRpb24gYW5kIHRoZSBzZXJ2aWNlIGluc3RhbmNlLiAKKworICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbCkKKyAgICAoc2VydmUgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiIGNhbGN1bGF0b3IpCisKKworVXNlIGEgQ2xpZW50IHRvIEFjY2VzcyB0aGUgU2VydmljZSBSZW1vdGVseQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1tpbiBzb21lIG90aGVyIHByb2Nlc3NdIHJ1biB0aGUgY2xpZW50CisKKyAgICAoaW4tcGFja2FnZSA6Y2wtdXNlcikKKworICAgIChtYWNyb2xldCAoKHNob3cgKGZvcm0pCisgICAgICAgICAgICAgICAgIGAoZm9ybWF0ICp0cmFjZS1vdXRwdXQqICJ+JX5zID0+fnsgfnN+fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyxmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtdWx0aXBsZS12YWx1ZS1saXN0IChpZ25vcmUtZXJyb3JzICxmb3JtKSkpKSkKKyAgICAgICh3aXRoLWNsaWVudCAocHJvdG9jb2wgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiKQorICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpwaW5nIHByb3RvY29sKSkKKyAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6YWRkIHByb3RvY29sIDEgMikpCisgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90b2NvbCAxIDQpKQorICAgIAorICAgICAgICAobGV0ICgodGFzayAobWFrZS1pbnN0YW5jZSAndHV0b3JpYWw6d29yaworICAgICAgICAgICAgICAgICAgICAgIDpvcCBvcGVyYXRpb24uc3VidHJhY3QgOm51bTEgMTUgOm51bTIgMTApKSkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkKKyAgICAgICAgCisgICAgICAgICAgKHNldGYgKHR1dG9yaWFsOndvcmstb3AgdGFzaykgb3BlcmF0aW9uLmRpdmlkZQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTEgdGFzaykgMQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTIgdGFzaykgMCkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkpCisgICAgICAgIAorICAgICAgICAoc2hvdyAoc2hhcmVkLnNoYXJlZC1zZXJ2aWNlOmdldC1zdHJ1Y3QgcHJvdG9jb2wgMSkpCisgICAgCisgICAgICAgIChzaG93ICh6aXAgcHJvdG9jb2wpKSkpCisKK0lzc3VlcworLS0tLS0tCisKKyMjIyBvcHRpb25hbCBmaWVsZHMgCisgV2hlcmUgdGhlIElETCBkZWNsYXJlcyBhIGZpZWxkIG9wdGlvbnMsIHRoZSBkZWYtc3RydWN0IGZvcm0gaW5jbHVkZXMgbm8KKyBpbml0Zm9ybSBmb3IgdGhlIHNsb3QgYW5kIHRoZSBlbmNvZGluZyBvcGVyYXRvciBza2lwcyBhbiB1bmJvdW5kIHNsb3QuIFRoaXMgbGVhdmUgc29tZSBhbWJpZ3VpdHkKKyB3aXRoIGJvb2wgZmllbGRzLgorCisjIyMgaW5zdGFudGlhdGlvbiBwcm90b2NvbCA6Cisgc3RydWN0IGNsYXNzZXMgYXJlIHN0YW5kYXJkIGNsYXNzZXMgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzIGFyZQorIHdoYXRldmVyIHRoZSBpbXBsZW1lbnRhdGlvbiBwcmVzY3JpYmVzLiBkZWNvZGVycyBhcHBseSBtYWtlLXN0cnVjdCB0byBhbiBpbml0YXJncyBsaXN0LgorIHBhcnRpY3VsYXJseSBhdCB0aGUgc2VydmljZSBlbmQsIHRoZXJlIGFyZSBhZHZhbnRhZ2VzIHRvIHJlc291cmNpbmcgc3RydWN0cyBhbmQgZGVjb2RpbmcKKyB3aXRoIGRpcmVjdCBzaWRlLWVmZmVjdHMgb24gc2xvdC12YWx1ZXMKKworIyMjIG1hcHM6CisgTWFwcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGhhc2ggdGFibGVzLiBBcyBkYXRhIHRocm91Z2ggdGhlIGNhbGwvcmVwbHkgaW50ZXJmYWNlIGlzIGFsbCBzdGF0aWNhbGx5CisgdHlwZWQsIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHRoZSBvYmplY3RzIHRvIHRoZW1zZWx2ZXMgaW5kaWNhdGUgdGhlIGNvZGluZyBmb3JtLiBBc3NvY2lhdGlvbiBsaXN0cworIHdvdWxkIGJlIHN1ZmZpY2llbnQuIEFzIHRoZSBrZXkgdHlwZSBpcyBhcmJpdHJhcnksIHByb3BlcnR5IGxpc3RzIG9mZmVyIG5vIGFkZGl0aW9uYWwgY29udmVuaWVuY2U6CisgYXMgYGdldGZgIG9wZXJhdGVzIHdpdGggYGVxYCBhIG5ldyBhY2Nlc3MgaW50ZXJmYWNlIHdvdWxkIGJlIG5lY2Vzc2FyeSBhbmQgdGhleSB3b3VsZCBub3QgYmUKKyBhdmFpbGFibGUgZm9yIGZ1bmN0aW9uIGFwcGxpY2F0aW9uLgorCisKKyBbMV06IHd3dy5jb21tb24tbGlzcC5uZXQvYXNkZgorIFsyXTogaHR0cDovL2dpdGh1Yi5jb20vbGlzcC9jb20uYjkucHVyaS5wcGNyZQorIFszXTogd3d3LmNvbW1vbi1saXNwLm5ldC9jbG9zZXItbW9wCisgWzRdOiB0cml2aWFsLXV0Zi04CisgWzVdOiBodHRwczovL2dpdGh1Yi5jb20vdXNvY2tldC91c29ja2V0CisgWzZdOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9pZWVlLWZsb2F0cworIFs3XTogaHR0cHM6Ly9naXRodWIuY29tL3RyaXZpYWwtZ3JheS1zdHJlYW1zL3RyaXZpYWwtZ3JheS1zdHJlYW1zCisgWzhdOiBodHRwczovL2dpdGxhYi5jb21tb24tbGlzcC5uZXQvYWxleGFuZHJpYS9hbGV4YW5kcmlhCisgWzldOiBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRHZW5lcmF0aW9uCisKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcCBiL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc0NGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL1JFQURNRVMvcmVhZG1lLWNhc3NhbmRyYS5saXNwCkBAIC0wLDAgKzEsNjQgQEAKKyhpbi1wYWNrYWdlIDpjbC11c2VyKQorCisjKyhvciBjY2wgc2JjbCkgL2RldmVsb3BtZW50L3NvdXJjZS9saWJyYXJ5LworKGxvYWQgImJ1aWxkLWluaXQubGlzcCIpCisKKzs7OyAhIGZpcnN0LCBzZWxlY3QgdGhlIGFwaSB2ZXJzaW9uIGluIHRoZSBjYXNzYW5kcmEgc3lzdGVtIGRlZmluaXRpb24KKzs7OyBhcyBvbmx5IG9uZSBzaG91bGQgYmUgbG9hZGVkIGF0IGEgdGltZS4KKyhhc2RmOmxvYWQtc3lzdGVtIDpkZS5zZXRmLmNhc3NhbmRyYSkKKworKGluLXBhY2thZ2UgOmRlLnNldGYuY2Fzc2FuZHJhKQorCisoZGVmcGFyYW1ldGVyICpjLWxvY2F0aW9uKgorICA7OyByZW1vdGUKKyAgOzsgI3UidGhyaWZ0Oi8vZWMyLTE3NC0xMjktNjYtMTQ4LmNvbXB1dGUtMS5hbWF6b25hd3MuY29tOjkxNjAiCisgIDs7IGxvY2FsCisgICN1InRocmlmdDovLzEyNy4wLjAuMTo5MTYwIgorICAiQSBjYXNzYW5kcmEgc2VydmljZSBsb2NhdGlvbiAtIGVpdGhlciB0aGUgbG9jYWwgb25lIG9yIGEgcmVtb3RlIHNlcnZpY2UgCisgLSBhbHdheXMgYSAndGhyaWZ0JyB1cmkuIikKKworKGRlZnBhcmFtZXRlciAqYyogKHRocmlmdDpjbGllbnQgKmMtbG9jYXRpb24qKSkKKworCisoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlcyAqYyopCis7OyA9PiAoIktleXNwYWNlMSIgInN5c3RlbSIpCisKKyhjYXNzYW5kcmE6ZGVzY3JpYmUtY2x1c3Rlci1uYW1lICpjKikKKzs7ID0+IlRlc3QgQ2x1c3RlciIKKworKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uICpjKikKKzs7ID0+ICIyLjEuMCIKKworKGxvb3AgZm9yIHNwYWNlIGluIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2VzICpjKikKKyAgICAgIGNvbGxlY3QgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2UgKmMqIHNwYWNlKQorICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkgb2YgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpCisKKworKGNsb3NlICpjKikKKworKGRlZnVuIGRlc2NyaWJlLWNhc3NhbmRyYSAobG9jYXRpb24gJm9wdGlvbmFsIChzdHJlYW0gKnN0YW5kYXJkLW91dHB1dCopKQorICAiUHJpbnQgdGhlIGZpcnN0LW9yZGVyIHN0b3JlIG1ldGFkYXRhIGZvciBhIGNhc3NhbmRyYSBMT0NBVElPTi4iCisKKyAgKHRocmlmdDp3aXRoLWNsaWVudCAoY2Fzc2FuZHJhIGxvY2F0aW9uKQorICAgIChsZXQqICgoa2V5c3BhY2UtbmFtZXMgKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZXMgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKGNsdXN0ZXIgKGNhc3NhbmRyYTpkZXNjcmliZS1jbHVzdGVyLW5hbWUgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKHZlcnNpb24gKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uIGNhc3NhbmRyYSkpCisgICAgICAgICAgIChrZXlzcGFjZS1kZXNjcmlwdGlvbnMgKGxvb3AgZm9yIHNwYWNlIGluIGtleXNwYWNlLW5hbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlIGNhc3NhbmRyYSBzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpKSkpCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZjb25uZWN0aW9uIHRvIDogfmEiIGNhc3NhbmRyYSkKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JnZlcnNpb24gOiB+YSIgdmVyc2lvbikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmNsdXN0ZXIgOiB+YSIgY2x1c3RlcikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmtleXNwYWNlc357fnt+JX4lc3BhY2U6IH5hfkB7fiUgIH57fmEgOn5Ae34yMHR+Ond+Xn4lfn1+fX59fn1+fSIga2V5c3BhY2UtZGVzY3JpcHRpb25zKSkpKQorCis7OzsgKGRlc2NyaWJlLWNhc3NhbmRyYSAqYy1sb2NhdGlvbiopCmRpZmYgLS1naXQgYS9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaCBiL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0OTVmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vYmFzaAorCitzZXQgLWUKKworaWYgW1sgISAtZSBxdWlja2xpc3AubGlzcCBdXTsgdGhlbiBjdXJsIC1PIGh0dHBzOi8vYmV0YS5xdWlja2xpc3Aub3JnL3F1aWNrbGlzcC5saXNwOyBmaQorc2JjbCAtLWxvYWQgcXVpY2tsaXNwLmxpc3AgXAorICAgICAtLWV2YWwgIihpZ25vcmUtZXJyb3JzIChxdWlja2xpc3AtcXVpY2tzdGFydDppbnN0YWxsIDpwYXRoIFwicXVpY2tsaXNwL1wiKSkiIFwKKyAgICAgLS1ldmFsICIobG9hZCBcInF1aWNrbGlzcC9zZXR1cC5saXNwXCIpIiBcCisgICAgIC0tZXZhbCAiKHF1aWNrbGlzcDpidW5kbGUtc3lzdGVtcyAnKCM6cHVyaSAjOnVzb2NrZXQgIzpjbG9zZXItbW9wICM6dHJpdmlhbC11dGYtOCAjOmllZWUtZmxvYXRzICM6dHJpdmlhbC1ncmF5LXN0cmVhbXMgIzphbGV4YW5kcmlhICM6Ym9yZGVhdXgtdGhyZWFkcyAjOmNsLXBwY3JlICM6Zmlhc2NvICM6bmV0LmRpZGllcnZlcm5hLmNsb24pIDp0byBcImV4dGVybmFscy9cIikiIFwKKyAgICAgLS1ldmFsICIocXVpdCkiIFwKKyAgICAgLS1uby11c2VyaW5pdAoraWYgW1sgISAtZSBiYWNrcG9ydC11cGRhdGUuemlwIF1dOyB0aGVuCisgICAgY3VybCAtTyAtTCBodHRwczovL2dpdGh1Yi5jb20vVHVydGxlV2FyZVBML2RlLnNldGYudGhyaWZ0L2FyY2hpdmUvYmFja3BvcnQtdXBkYXRlLnppcDsKK2ZpCitta2RpciAtcCBsaWIKK3VuemlwIC11IGJhY2twb3J0LXVwZGF0ZS56aXAgLWQgbGliCmRpZmYgLS1naXQgYS9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AgYi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyYzcwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcApAQCAtMCwwICsxLDIzIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBKdXN0IGEgc2NyaXB0IGZvciBsb2FkaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgdXNpbmcgYnVuZGxlZCBkZXBlbmRlbmNpZXMuCis7Ozs7IFRoaXMgaXMgaGVyZSBmb3Igd2hlbiB3ZSB3YW50IHRvIGJ1aWxkIHRoZSBzZWxmLXRlc3QgYW5kIGNyb3NzLXRlc3QKKzs7OzsgYmluYXJpZXMuCisKKyhyZXF1aXJlICJhc2RmIikKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiZXh0ZXJuYWxzL2J1bmRsZS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAibGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90aHJpZnQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKZGlmZiAtLWdpdCBhL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcCBiL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdhNThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL3Rlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCkBAIC0wLDAgKzEsMzEgQEAKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBUaGlzIGZpbGUgaXMgdXNlZCB0byBidWlsZCB0aGUgYmluYXJ5IHRoYXQgcnVucyBhbGwgc2VsZi10ZXN0cy4gVGhlCis7Ozs7IGJpbmFyeSBpcyB0aGVuIG1lYW50IHRvIGJlIGhvb2tlZCB1cCB0byBUaHJpZnQncyBgbWFrZSBjaGVja2AgZmFjaWxpdHksCis7Ozs7IGJ1dCBjYW4gZWFzaWx5IGJlIHJ1biBvbiBpdHMgb3duIGFzIHdlbGwuCisKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiLi4vbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICIuLi9saWIvZGUuc2V0Zi50aHJpZnQtYmFja3BvcnQtdXBkYXRlL3Rlc3QvdGhyaWZ0LXRlc3QuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10ZXN0KQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgKGxldCAoKHJlc3VsdCAoaWYgKGZpYXNjbzpydW4tdGVzdHMgJ3RocmlmdC10ZXN0KSAwIC0xKSkpCisgICAgKGNsb246ZXhpdCByZXN1bHQpKSkKKworKGNsb246ZHVtcCAicnVuLXRlc3RzIiBtYWluKQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL1JFQURNRSBiL2xpYi9jb2NvYS9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9jb2NvYS9SRUFETUUKcmVuYW1lIHRvIGxpYi9jb2NvYS9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2NvY29hL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTg4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKworZXh0ZXJuIE5TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvckRvbWFpbjsKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRBcHBsaWNhdGlvbkVycm9yKSB7CisgIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93biAgICAgICAgICAgICAgICA9IDAsCisgIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bk1ldGhvZCAgICAgICAgICA9IDEsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZE1lc3NhZ2VUeXBlICAgICA9IDIsCisgIFRBcHBsaWNhdGlvbkVycm9yV3JvbmdNZXRob2ROYW1lICAgICAgICA9IDMsCisgIFRBcHBsaWNhdGlvbkVycm9yQmFkU2VxdWVuY2VJZCAgICAgICAgICA9IDQsCisgIFRBcHBsaWNhdGlvbkVycm9yTWlzc2luZ1Jlc3VsdCAgICAgICAgICA9IDUsCisgIFRBcHBsaWNhdGlvbkVycm9ySW50ZXJuYWxFcnJvciAgICAgICAgICA9IDYsCisgIFRBcHBsaWNhdGlvbkVycm9yUHJvdG9jb2xFcnJvciAgICAgICAgICA9IDcsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFRyYW5zZm9ybSAgICAgICA9IDgsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFByb3RvY29sICAgICAgICA9IDksCisgIFRBcHBsaWNhdGlvbkVycm9yVW5zdXBwb3J0ZWRDbGllbnRUeXBlICA9IDEwLAorfTsKKworCitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTmFtZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXk7CitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OworCisKK0BpbnRlcmZhY2UgTlNFcnJvciAoVEFwcGxpY2F0aW9uRXJyb3IpCisKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIGNvcHkpIE5TU3RyaW5nICpuYW1lOworQHByb3BlcnR5IChyZWFkb25seSwgY29weSkgTlNTdHJpbmcgKnJlYXNvbjsKKworKyhpbnN0YW5jZXR5cGUpIGVycm9yV2l0aFR5cGU6KFRBcHBsaWNhdGlvbkVycm9yKXR5cGUgcmVhc29uOihOU1N0cmluZyAqKXJlYXNvbjsKKworKyhpbnN0YW5jZXR5cGUpIHJlYWQ6KGlkPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKKy0oQk9PTCkgd3JpdGU6KGlkPFRQcm90b2NvbD4pb3V0UHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0gYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwYmMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IubQpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUQXBwbGljYXRpb25FcnJvci5oIgorI2ltcG9ydCAiVFByb3RvY29sVXRpbC5oIgorCisKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvckRvbWFpbiA9IEAiVEFwcGxpY2F0aW9uRXJyb3JEb21haW4iOworCisKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck5hbWVLZXkgPSBAIm5hbWUiOworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yUmVhc29uS2V5ID0gQCJyZWFzb24iOworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5ID0gQCJtZXRob2QiOworCisKK0BpbXBsZW1lbnRhdGlvbiBOU0Vycm9yIChUQXBwbGljYXRpb25FcnJvcikKKworLShOU1N0cmluZyAqKSByZWFzb24KK3sKKyAgcmV0dXJuIHNlbGYudXNlckluZm9bVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXldOworfQorCistKE5TU3RyaW5nICopIG5hbWUKK3sKKyAgcmV0dXJuIHNlbGYudXNlckluZm9bVEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5XTsKK30KKworKyhpbnN0YW5jZXR5cGUpIGVycm9yV2l0aFR5cGU6KFRBcHBsaWNhdGlvbkVycm9yKXR5cGUgcmVhc29uOihOU1N0cmluZyAqKXJlYXNvbgoreworICBOU1N0cmluZyAqbmFtZTsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duTWV0aG9kOgorICAgIG5hbWUgPSBAIlVua25vd24gTWV0aG9kIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZE1lc3NhZ2VUeXBlOgorICAgIG5hbWUgPSBAIkludmFsaWQgTWVzc2FnZSBUeXBlIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yV3JvbmdNZXRob2ROYW1lOgorICAgIG5hbWUgPSBAIldyb25nIE1ldGhvZCBOYW1lIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yQmFkU2VxdWVuY2VJZDoKKyAgICBuYW1lID0gQCJCYWQgU2VxdWVuY2UgSUQiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JNaXNzaW5nUmVzdWx0OgorICAgIG5hbWUgPSBAIk1pc3NpbmcgUmVzdWx0IjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW50ZXJuYWxFcnJvcjoKKyAgICBuYW1lID0gQCJJbnRlcm5hbCBFcnJvciI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvclByb3RvY29sRXJyb3I6CisgICAgbmFtZSA9IEAiUHJvdG9jb2wgRXJyb3IiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JJbnZhbGlkVHJhbnNmb3JtOgorICAgIG5hbWUgPSBAIkludmFsaWQgVHJhbnNmb3JtIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFByb3RvY29sOgorICAgIG5hbWUgPSBAIkludmFsaWQgUHJvdG9jb2wiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JVbnN1cHBvcnRlZENsaWVudFR5cGU6CisgICAgbmFtZSA9IEAiVW5zdXBwb3J0ZWQgQ2xpZW50IFR5cGUiOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgbmFtZSA9IEAiVW5rbm93biI7CisgICAgYnJlYWs7CisgIH0KKworICBOU0RpY3Rpb25hcnkgKnVzZXJJbmZvOworICBpZiAocmVhc29uKSB7CisgICAgdXNlckluZm8gPSBAe1RBcHBsaWNhdGlvbkVycm9yTmFtZUtleTpuYW1lLAorICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FcnJvclJlYXNvbktleTpyZWFzb259OworICB9CisgIGVsc2UgeworICAgIHVzZXJJbmZvID0gQHtUQXBwbGljYXRpb25FcnJvck5hbWVLZXk6bmFtZX07CisgIH0KKworICByZXR1cm4gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRBcHBsaWNhdGlvbkVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOnVzZXJJbmZvXTsKK30KKworCisrKGluc3RhbmNldHlwZSkgcmVhZDooaWQ8VFByb3RvY29sPilwcm90b2NvbAoreworICBOU1N0cmluZyAqcmVhc29uID0gbmlsOworICBTSW50MzIgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bjsKKyAgU0ludDMyIGZpZWxkVHlwZTsKKyAgU0ludDMyIGZpZWxkSUQ7CisKKyAgTlNFcnJvciAqZXJyb3I7CisgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6TlVMTCBlcnJvcjomZXJyb3JdKSB7CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKyAgd2hpbGUgKHRydWUpIHsKKworICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTpOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiZmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6JmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6JmVycm9yXSkKKyAgICB7CisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUT1ApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgIGNhc2UgMToKKyAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVFJJTkcpIHsKKyAgICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cmluZzomcmVhc29uIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZUkzMikgeworICAgICAgICBpZiAoIVtwcm90b2NvbCByZWFkSTMyOiZ0eXBlIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZmllbGRUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6JmVycm9yXSkgeworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkRW5kOiZlcnJvcl0pIHsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmQ6JmVycm9yXSkgeworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIHJldHVybiBbTlNFcnJvciBlcnJvcldpdGhUeXBlOnR5cGUgcmVhc29uOnJlYXNvbl07Cit9CisKKworLShCT09MKSB3cml0ZTooaWQ8VFByb3RvY29sPilwcm90b2NvbCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOkAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoc2VsZi5sb2NhbGl6ZWREZXNjcmlwdGlvbiAhPSBuaWwpIHsKKyAgICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpAIm1lc3NhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6VFR5cGVTVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDoxIGVycm9yOmVycm9yXSkKKyAgICB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbcHJvdG9jb2wgd3JpdGVTdHJpbmc6c2VsZi5sb2NhbGl6ZWREZXNjcmlwdGlvbiBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkRW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOkAidHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6VFR5cGVJMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl0pCisgIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUkzMjooU0ludDMyKXNlbGYuY29kZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkRW5kOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRTdG9wOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlU3RydWN0RW5kOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjE2NDFkLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRQcm90b2NvbC5oIgotCi1lbnVtIHsKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV04gPSAwLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTl9NRVRIT0QgPSAxLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUUgPSAzLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fQkFEX1NFUVVFTkNFX0lEID0gNCwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxUID0gNQotfTsKLQotLy8gRklYTUUKLUBpbnRlcmZhY2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7Ci0gIGludCBtVHlwZTsKLX0KLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIHJlYWQ6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7Ci0KLS0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOwotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgZXhjZXB0aW9uV2l0aFR5cGU6IChpbnQpIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIG1lc3NhZ2U7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY4NzUzLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUQXBwbGljYXRpb25FeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRQcm90b2NvbFV0aWwuaCIKLQotQGltcGxlbWVudGF0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgotCi0tIChpZCkgaW5pdFdpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIG1UeXBlID0gdHlwZTsKLQotICBOU1N0cmluZyAqIG5hbWU7Ci0gIHN3aXRjaCAodHlwZSkgewotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOX01FVEhPRDoKLSAgICBuYW1lID0gQCJVbmtub3duIG1ldGhvZCI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfTUVTU0FHRV9UWVBFOgotICAgIG5hbWUgPSBAIkludmFsaWQgbWVzc2FnZSB0eXBlIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUU6Ci0gICAgbmFtZSA9IEAiV3JvbmcgbWV0aG9kIG5hbWUiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9CQURfU0VRVUVOQ0VfSUQ6Ci0gICAgbmFtZSA9IEAiQmFkIHNlcXVlbmNlIElEIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQ6Ci0gICAgbmFtZSA9IEAiTWlzc2luZyByZXN1bHQiOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG5hbWUgPSBAIlVua25vd24iOwotICAgIGJyZWFrOwotICB9Ci0KLSAgc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6IG5hbWUgcmVhc29uOiByZWFzb24gdXNlckluZm86IG5pbF07Ci0gIHJldHVybiBzZWxmOwotfQotCi0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCi17Ci0gIE5TU3RyaW5nICogcmVhc29uID0gbmlsOwotICBpbnQgdHlwZSA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOOwotICBpbnQgZmllbGRUeXBlOwotICBpbnQgZmllbGRJRDsKLQotICBbcHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTF07Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMCi0gICAgICAgICAgICAgIHR5cGU6ICZmaWVsZFR5cGUKLSAgICAgICAgICAgICAgZmllbGRJRDogJmZpZWxkSURdOwotICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RPUCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN3aXRjaCAoZmllbGRJRCkgewotICAgIGNhc2UgMToKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfU1RSSU5HKSB7Ci0gICAgICAgIHJlYXNvbiA9IFtwcm90b2NvbCByZWFkU3RyaW5nXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9JMzIpIHsKLSAgICAgICAgdHlwZSA9IFtwcm90b2NvbCByZWFkSTMyXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBmaWVsZFR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFtwcm90b2NvbCByZWFkRmllbGRFbmRdOwotICB9Ci0gIFtwcm90b2NvbCByZWFkU3RydWN0RW5kXTsKLQotICByZXR1cm4gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb25XaXRoVHlwZTogdHlwZSByZWFzb246IHJlYXNvbl07Ci19Ci0KLQotLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKLXsKLSAgW3Byb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQCJUQXBwbGljYXRpb25FeGNlcHRpb24iXTsKLQotICBpZiAoW3NlbGYgcmVhc29uXSAhPSBuaWwpIHsKLSAgICBbcHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6IEAibWVzc2FnZSIKLSAgICAgICAgICAgICAgICAgdHlwZTogVFR5cGVfU1RSSU5HCi0gICAgICAgICAgICAgICAgIGZpZWxkSUQ6IDFdOwotICAgIFtwcm90b2NvbCB3cml0ZVN0cmluZzogW3NlbGYgcmVhc29uXV07Ci0gICAgW3Byb3RvY29sIHdyaXRlRmllbGRFbmRdOwotICB9Ci0KLSAgW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAInR5cGUiCi0gICAgICAgICAgICAgICB0eXBlOiBUVHlwZV9JMzIKLSAgICAgICAgICAgICAgIGZpZWxkSUQ6IDJdOwotICBbcHJvdG9jb2wgd3JpdGVJMzI6IG1UeXBlXTsKLSAgW3Byb3RvY29sIHdyaXRlRmllbGRFbmRdOwotCi0gIFtwcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07Ci0gIFtwcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07Ci19Ci0KLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIGV4Y2VwdGlvbldpdGhUeXBlOiAoaW50KSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW1tbVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFsbG9jXSBpbml0V2l0aFR5cGU6IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiByZWFzb25dIGF1dG9yZWxlYXNlXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzNhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisKK0BpbnRlcmZhY2UgVEJhc2VDbGllbnQgOiBOU09iamVjdAorCistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDljYWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5tCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEJhc2VDbGllbnQuaCIKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisKKworQGludGVyZmFjZSBUQmFzZUNsaWVudCAoKQorQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUQmFzZUNsaWVudAorCistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4paW5Qcm90b2NvbAoreworICBOU0Vycm9yICp0aHJpZnRFcnJvcjsKKworICBTSW50MzIgbXNnVHlwZSA9IDA7CisgIGlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6bmlsIHR5cGU6Jm1zZ1R5cGUgc2VxdWVuY2VJRDpOVUxMIGVycm9yOiZ0aHJpZnRFcnJvcl0pIHsKKyAgICByZXR1cm4gdGhyaWZ0RXJyb3I7CisgIH0KKworICBpZiAobXNnVHlwZSA9PSBUTWVzc2FnZVR5cGVFWENFUFRJT04pIHsKKworICAgIHRocmlmdEVycm9yID0gW05TRXJyb3IgcmVhZDppblByb3RvY29sXTsKKworICAgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOk5VTExdOworCisgICAgcmV0dXJuIHRocmlmdEVycm9yOworICB9CisKKyAgcmV0dXJuIG5pbDsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTM2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RCaW5hcnkuc3dpZnQKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgc3RydWN0IFRCaW5hcnkgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuU1RSSU5HIH0KKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBOU0RhdGEKKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHNlbGYuc3RvcmFnZSA9IE5TRGF0YSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGNvbnRlbnRzT2ZGaWxlIGZpbGU6IFN0cmluZywgb3B0aW9uczogTlNEYXRhUmVhZGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSB0cnkgTlNEYXRhKGNvbnRlbnRzT2ZGaWxlOiBmaWxlLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgaW5pdChjb250ZW50c09mVVJMIFVSTDogTlNVUkwsIG9wdGlvbnM6IE5TRGF0YVJlYWRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgc2VsZi5zdG9yYWdlID0gdHJ5IE5TRGF0YShjb250ZW50c09mVVJMOiBVUkwsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0PyhiYXNlNjRFbmNvZGVkRGF0YSBiYXNlNjREYXRhOiBOU0RhdGEsIG9wdGlvbnM6IE5TRGF0YUJhc2U2NERlY29kaW5nT3B0aW9ucyA9IFtdKSB7CisgICAgZ3VhcmQgbGV0IHN0b3JhZ2UgPSBOU0RhdGEoYmFzZTY0RW5jb2RlZERhdGE6IGJhc2U2NERhdGEsIG9wdGlvbnM6IG9wdGlvbnMpIGVsc2UgeworICAgICAgcmV0dXJuIG5pbAorICAgIH0KKyAgICBzZWxmLnN0b3JhZ2UgPSBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGRhdGE6IE5TRGF0YSkgeworICAgIHNlbGYuc3RvcmFnZSA9IGRhdGEKKyAgfQorICAKKyAgcHVibGljIHZhciBsZW5ndGggOiBJbnQgeworICAgIHJldHVybiBzdG9yYWdlLmxlbmd0aAorICB9CisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaGFzaFZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgYnl0ZXMgOiBVbnNhZmVQb2ludGVyPFZvaWQ+IHsKKyAgICByZXR1cm4gc3RvcmFnZS5ieXRlcworICB9CisgIAorICBwdWJsaWMgZnVuYyBnZXRCeXRlcyhidWZmZXI6IFVuc2FmZU11dGFibGVQb2ludGVyPFZvaWQ+LCBsZW5ndGg6IEludCkgeworICAgIHN0b3JhZ2UuZ2V0Qnl0ZXMoYnVmZmVyLCBsZW5ndGg6IGxlbmd0aCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZ2V0Qnl0ZXMoYnVmZmVyOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxWb2lkPiwgcmFuZ2U6IFJhbmdlPEludD4pIHsKKyAgICBzdG9yYWdlLmdldEJ5dGVzKGJ1ZmZlciwgcmFuZ2U6IE5TUmFuZ2UocmFuZ2UpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzdWJCaW5hcnlXaXRoUmFuZ2UocmFuZ2U6IFJhbmdlPEludD4pIC0+IFRCaW5hcnkgeworICAgIHJldHVybiBUQmluYXJ5KGRhdGE6IHN0b3JhZ2Uuc3ViZGF0YVdpdGhSYW5nZShOU1JhbmdlKHJhbmdlKSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlVG9GaWxlKHBhdGg6IFN0cmluZywgb3B0aW9uczogTlNEYXRhV3JpdGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICB0cnkgc3RvcmFnZS53cml0ZVRvRmlsZShwYXRoLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVRvVVJMKHVybDogTlNVUkwsIG9wdGlvbnM6IE5TRGF0YVdyaXRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgdHJ5IHN0b3JhZ2Uud3JpdGVUb1VSTCh1cmwsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJhbmdlT2ZEYXRhKGRhdGFUb0ZpbmQgZGF0YTogTlNEYXRhLCBvcHRpb25zOiBOU0RhdGFTZWFyY2hPcHRpb25zLCByYW5nZTogUmFuZ2U8SW50PikgLT4gUmFuZ2U8SW50Pj8geworICAgIHJldHVybiBzdG9yYWdlLnJhbmdlT2ZEYXRhKGRhdGEsIG9wdGlvbnM6IG9wdGlvbnMsIHJhbmdlOiBOU1JhbmdlKHJhbmdlKSkudG9SYW5nZSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGVudW1lcmF0ZUJ5dGVSYW5nZXNVc2luZ0Jsb2NrKGJsb2NrOiAoVW5zYWZlUG9pbnRlcjxWb2lkPiwgUmFuZ2U8SW50PiwgaW5vdXQgQm9vbCkgLT4gVm9pZCkgeworICAgIHN0b3JhZ2UuZW51bWVyYXRlQnl0ZVJhbmdlc1VzaW5nQmxvY2sgeyBieXRlcywgcmFuZ2UsIHN0b3AgaW4KKyAgICAgIHZhciBzdG9wVG1wID0gQm9vbChzdG9wLm1lbW9yeSkKKyAgICAgIGJsb2NrKGJ5dGVzLCByYW5nZS50b1JhbmdlKCkhLCAmc3RvcFRtcCkKKyAgICAgIHN0b3AubWVtb3J5ID0gT2JqQ0Jvb2woc3RvcFRtcCkKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRCaW5hcnkgeworICAgIHZhciBkYXRhIDogTlNEYXRhPworICAgIHRyeSBwcm90by5yZWFkQmluYXJ5KCZkYXRhKQorICAgIHJldHVybiBUQmluYXJ5KGRhdGE6IGRhdGEhKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogVEJpbmFyeSwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJpbmFyeSh2YWx1ZS5zdG9yYWdlKQorICB9CisgIAorfQorCitleHRlbnNpb24gVEJpbmFyeSA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PShsaHM6IFRCaW5hcnksIHJoczogVEJpbmFyeSkgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URW51bS5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyYTUzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBURW51bSA6IFRTZXJpYWxpemFibGUgeworICAKK30KKworcHVibGljIGV4dGVuc2lvbiBURW51bSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gVFR5cGUuSTMyIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RFcnJvci5oIGIvbGliL2NvY29hL3NyYy9URXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI3MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9URXJyb3IuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisKK2V4dGVybiBOU1N0cmluZyAqVEVycm9yRG9tYWluOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3ZjkyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0KQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitOU1N0cmluZyAqVEVycm9yRG9tYWluID0gQCJURXJyb3JEb21haW4iOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2ZjRmYS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLUBpbnRlcmZhY2UgVEV4Y2VwdGlvbiA6IE5TRXhjZXB0aW9uIHsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZTsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uOwotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3I7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODQxOTkuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRFeGNlcHRpb24KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUgcmVhc29uOiBAInVua25vd24iIGVycm9yOiBuaWxdOwotfQotCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUgcmVhc29uOiByZWFzb24gZXJyb3I6IG5pbF07Ci19Ci0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi0gICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IG5hbWUKLSAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbgotICAgICAgICAgICAgICAgIHVzZXJJbmZvOiB1c2VySW5mb107Ci19Ci0KLQotLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KLXsKLSAgTlNNdXRhYmxlU3RyaW5nICogcmVzdWx0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBbc2VsZiBuYW1lXV07Ci0gIFtyZXN1bHQgYXBwZW5kRm9ybWF0OiBAIjogJUAiLCBbc2VsZiByZWFzb25dXTsKLSAgaWYgKFtzZWxmIHVzZXJJbmZvXSAhPSBuaWwpIHsKLSAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDogQCJcbiAgdXNlckluZm8gPSAlQCIsIFtzZWxmIHVzZXJJbmZvXV07Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVExpc3Quc3dpZnQgYi9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNWJkODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0CkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworCitwdWJsaWMgc3RydWN0IFRMaXN0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IE11dGFibGVDb2xsZWN0aW9uVHlwZSwgSGFzaGFibGUsIEFycmF5TGl0ZXJhbENvbnZlcnRpYmxlLCBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuTElTVCB9CisgIAorICB0eXBlYWxpYXMgU3RvcmFnZSA9IEFycmF5PEVsZW1lbnQ+CisKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleCA6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXggOiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXgKKyAgfQorCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBJbmRleCkgLT4gRWxlbWVudCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtwb3NpdGlvbl0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKHN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBhcHBlbmQobmV3RWxlbWVudDogRWxlbWVudCkgeworICAgIHNlbGYuc3RvcmFnZS5hcHBlbmQobmV3RWxlbWVudCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgYXBwZW5kQ29udGVudHNPZjxDIDogQ29sbGVjdGlvblR5cGUgd2hlcmUgQy5HZW5lcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50PihuZXdzdG9yYWdlOiBDKSB7CisgICAgc2VsZi5zdG9yYWdlLmFwcGVuZENvbnRlbnRzT2YobmV3c3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW5zZXJ0KG5ld0VsZW1lbnQ6IEVsZW1lbnQsIGF0SW5kZXggaW5kZXg6IEludCkgeworICAgIHNlbGYuc3RvcmFnZS5pbnNlcnQobmV3RWxlbWVudCwgYXRJbmRleDogaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydENvbnRlbnRzT2Y8QyA6IENvbGxlY3Rpb25UeXBlIHdoZXJlIEMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4obmV3RWxlbWVudHM6IEMsIGF0IGluZGV4OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UuaW5zZXJ0Q29udGVudHNPZihuZXdFbGVtZW50cywgYXQ6IGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IHRydWUpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVtb3ZlQWxsKGtlZXBDYXBhY2l0eToga2VlcENhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KGluZGV4OiBJbmRleCkgeworICAgIHNlbGYuc3RvcmFnZS5yZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVGaXJzdChuOiBJbnQgPSAwKSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZUZpcnN0KG4pCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUxhc3QoKSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc2VsZi5zdG9yYWdlLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVSYW5nZShzdWJSYW5nZTogUmFuZ2U8SW5kZXg+KSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZVJhbmdlKHN1YlJhbmdlKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZXNlcnZlQ2FwYWNpdHkobWluaW11bUNhcGFjaXR5OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVzZXJ2ZUNhcGFjaXR5KG1pbmltdW1DYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVExpc3QgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRMaXN0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuSW52YWxpZERhdGEucmF3VmFsdWUpLAorICAgICAgICB1c2VySW5mbzogW1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogTlNOdW1iZXIoaW50OiBUUHJvdG9jb2xFeHRlbmRlZEVycm9yLlVuZXhwZWN0ZWRUeXBlLnJhd1ZhbHVlKV0pCisgICAgfQorICAgIHZhciBsaXN0ID0gVExpc3QoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgbGlzdC5zdG9yYWdlLmFwcGVuZChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZExpc3RFbmQoKQorICAgIHJldHVybiBsaXN0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUTGlzdCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IHZhbHVlLmNvdW50KQorICAgIGZvciBlbGVtZW50IGluIHZhbHVlLnN0b3JhZ2UgeworICAgICAgdHJ5IEVsZW1lbnQud3JpdGVWYWx1ZShlbGVtZW50LCB0b1Byb3RvY29sOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEVuZCgpCisgIH0KK30KKworZXh0ZW5zaW9uIFRMaXN0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVExpc3Q8RWxlbWVudD4sIHJoczogVExpc3Q8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZlNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UTWFwLnN3aWZ0CkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUTWFwPEtleSA6IFRTZXJpYWxpemFibGUsIFZhbHVlIDogVFNlcmlhbGl6YWJsZT4gOiBDb2xsZWN0aW9uVHlwZSwgRGljdGlvbmFyeUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLk1BUCB9CisKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBEaWN0aW9uYXJ5PEtleSwgVmFsdWU+CisKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKworICBwdWJsaWMgdHlwZWFsaWFzIEVsZW1lbnQgPSBTdG9yYWdlLkVsZW1lbnQKKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisKKyAgcHVibGljIHZhciBzdGFydEluZGV4IDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXgKKyAgfQorICAKKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmVuZEluZGV4CisgIH0KKworICBwdWJsaWMgdmFyIGtleXM6IExhenlNYXBDb2xsZWN0aW9uPFtLZXkgOiBWYWx1ZV0sIEtleT4geworICAgIHJldHVybiBzdG9yYWdlLmtleXMKKyAgfQorICAKKyAgcHVibGljIHZhciB2YWx1ZXM6IExhenlNYXBDb2xsZWN0aW9uPFtLZXkgOiBWYWx1ZV0sIFZhbHVlPiB7CisgICAgcmV0dXJuIHN0b3JhZ2UudmFsdWVzCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIGluaXQoZGljdGlvbmFyeUxpdGVyYWwgZWxlbWVudHM6IChLZXksIFZhbHVlKS4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIGVsZW1lbnRzIHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICB9CisgIAorICBwdWJsaWMgaW5pdChtaW5pbXVtQ2FwYWNpdHk6IEludCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKG1pbmltdW1DYXBhY2l0eTogbWluaW11bUNhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4Rm9yS2V5KGtleTogS2V5KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4Rm9yS2V5KGtleSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAoa2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW2tleV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlVmFsdWUodmFsdWU6IFZhbHVlLCBmb3JLZXkga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHVwZGF0ZVZhbHVlKHZhbHVlLCBmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChpbmRleDogRGljdGlvbmFyeUluZGV4PEtleSwgVmFsdWU+KSAtPiAoS2V5LCBWYWx1ZSkgeworICAgIHJldHVybiByZW1vdmVBdEluZGV4KGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVWYWx1ZUZvcktleShrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVWYWx1ZUZvcktleShrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUFsbChrZWVwQ2FwYWNpdHkga2VlcENhcGFjaXR5OiBCb29sID0gZmFsc2UpIHsKKyAgICBzdG9yYWdlLnJlbW92ZUFsbChrZWVwQ2FwYWNpdHk6IGtlZXBDYXBhY2l0eSkKKyAgfQorCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsga2V5Lmhhc2hWYWx1ZQorICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB2YWx1ZS5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTWFwIHsKKyAgICBsZXQgKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZE1hcEJlZ2luKCkKKyAgICBpZiBrZXlUeXBlICE9IEtleS50aHJpZnRUeXBlIHx8IHZhbHVlVHlwZSAhPSBWYWx1ZS50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IE5TRXJyb3IoCisgICAgICAgIGRvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4sCisgICAgICAgIGNvZGU6IEludChUUHJvdG9jb2xFcnJvci5JbnZhbGlkRGF0YS5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBOU051bWJlcihpbnQ6IFRQcm90b2NvbEV4dGVuZGVkRXJyb3IuVW5leHBlY3RlZFR5cGUucmF3VmFsdWUpXSkKKyAgICB9CisgICAgdmFyIG1hcCA9IFRNYXAoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBrZXkgPSB0cnkgS2V5LnJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bykKKyAgICAgIGxldCB2YWx1ZSA9IHRyeSBWYWx1ZS5yZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG8pCisgICAgICBtYXAuc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRNYXBFbmQoKQorICAgIHJldHVybiBtYXAKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFRNYXAsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKEtleS50aHJpZnRUeXBlLCB2YWx1ZVR5cGU6IFZhbHVlLnRocmlmdFR5cGUsIHNpemU6IHZhbHVlLmNvdW50KQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gdmFsdWUuc3RvcmFnZSB7CisgICAgICB0cnkgS2V5LndyaXRlVmFsdWUoa2V5LCB0b1Byb3RvY29sOiBwcm90bykKKyAgICAgIHRyeSBWYWx1ZS53cml0ZVZhbHVlKHZhbHVlLCB0b1Byb3RvY29sOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTWFwRW5kKCkKKyAgfQorICAKK30KKworCitleHRlbnNpb24gVE1hcCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxLZXksIFZhbHVlPihsaHM6IFRNYXA8S2V5LFZhbHVlPiwgcmhzOiBUTWFwPEtleSwgVmFsdWU+KSAtPiBCb29sIHsKKyAgaWYgbGhzLmNvdW50ICE9IHJocy5jb3VudCB7CisgICAgcmV0dXJuIGZhbHNlCisgIH0KKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaCBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCmluZGV4IDk4MGJlOTQuLjIwYzcyZTIgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCkBAIC0yMCwxMCArMjAsMTYgQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKIAogQHByb3RvY29sIFRQcm9jZXNzb3IgPE5TT2JqZWN0PgogCi0tIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7CistKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KWluUHJvdG9jb2wKKyAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pb3V0UHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oIGIvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oCmluZGV4IDI5ZDEyYjMuLjg1MDIwYTUgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3NvckZhY3RvcnkuaAorKysgYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmgKQEAgLTIwLDggKzIwLDE0IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRQcm9jZXNzb3IuaCIKIAorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCiBAcHJvdG9jb2wgVFByb2Nlc3NvckZhY3RvcnkgPE5TT2JqZWN0PgogCi0tIChpZDxUUHJvY2Vzc29yPikgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OiAoaWQ8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKKy0oaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDooaWQ8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzU4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBleHRlbnNpb24gVFByb3RvY29sIHsKKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQpIHsKKyAgICAKKyAgICB2YXIgbmFtZSA6IE5TU3RyaW5nPworICAgIHZhciB0eXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzZXF1ZW5jZUlEIDogSW50MzIgPSAtMQorICAgIAorICAgIHRyeSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZSgmbmFtZSwgdHlwZTogJnR5cGUsIHNlcXVlbmNlSUQ6ICZzZXF1ZW5jZUlEKQorICAgIAorICAgIHJldHVybiAobmFtZSBhcyBTdHJpbmchLCBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IHR5cGUpISwgSW50KHNlcXVlbmNlSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKG5hbWU6IFN0cmluZywgdHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogdHlwZS5yYXdWYWx1ZSwgc2VxdWVuY2VJRDogSW50MzIoc2VxdWVuY2VJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nPykgeworICAgIAorICAgIHZhciBuYW1lIDogTlNTdHJpbmc/ID0gbmlsCisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWUoJm5hbWUpCisgICAgCisgICAgcmV0dXJuIChuYW1lIGFzIFN0cmluZz8pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmc/LCBUVHlwZSwgSW50KSB7CisgICAgCisgICAgdmFyIG5hbWUgOiBOU1N0cmluZz8gPSBuaWwKKyAgICB2YXIgdHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgZmllbGRJRCA6IEludDMyID0gLTEKKyAgICAKKyAgICB0cnkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lKCZuYW1lLCB0eXBlOiAmdHlwZSwgZmllbGRJRDogJmZpZWxkSUQpCisgICAgCisgICAgcmV0dXJuIChuYW1lIGFzIFN0cmluZz8sIFRUeXBlKHJhd1ZhbHVlOiB0eXBlKSEsIEludChmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWUobmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgZmllbGRJRDogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiB0eXBlLnJhd1ZhbHVlLCBmaWVsZElEOiBJbnQzMihmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGtleVR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHZhbHVlVHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgc2l6ZSA6IEludDMyID0gMAorICAgIAorICAgIHRyeSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlKCZrZXlUeXBlLCB2YWx1ZVR5cGU6ICZ2YWx1ZVR5cGUsIHNpemU6ICZzaXplKQorICAgIAorICAgIHJldHVybiAoVFR5cGUocmF3VmFsdWU6IGtleVR5cGUpISwgVFR5cGUocmF3VmFsdWU6IHZhbHVlVHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGUoa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKGtleVR5cGUucmF3VmFsdWUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLnJhd1ZhbHVlLCBzaXplOiBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICAKKyAgICB2YXIgZWxlbWVudFR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHNpemUgOiBJbnQzMiA9IDAKKyAgICAKKyAgICB0cnkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGUoJmVsZW1lbnRUeXBlLCBzaXplOiAmc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gKFRUeXBlKHJhd1ZhbHVlOiBlbGVtZW50VHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlLnJhd1ZhbHVlLCBzaXplOiBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGVsZW1lbnRUeXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzaXplIDogSW50MzIgPSAwCisgICAgCisgICAgdHJ5IHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZSgmZWxlbWVudFR5cGUsIHNpemU6ICZzaXplKQorICAgIAorICAgIHJldHVybiAoVFR5cGUocmF3VmFsdWU6IGVsZW1lbnRUeXBlKSEsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZS5yYXdWYWx1ZSwgc2l6ZTogSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRWYWx1ZTxUOiBUU2VyaWFsaXphYmxlPih2YWx1ZTogVCwgbmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgaWQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiB0eXBlLnJhd1ZhbHVlLCBmaWVsZElEOiBpZCkKKyAgICB0cnkgd3JpdGVWYWx1ZSh2YWx1ZSkKKyAgICB0cnkgd3JpdGVGaWVsZEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRWYWx1ZTxUOiBUU2VyaWFsaXphYmxlPigpIHRocm93cyAtPiBUIHsKKyAgICByZXR1cm4gdHJ5IFQucmVhZFZhbHVlRnJvbVByb3RvY29sKHNlbGYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlVmFsdWU8VDogVFNlcmlhbGl6YWJsZT4odmFsdWU6IFQpIHRocm93cyB7CisgICAgdHJ5IFQud3JpdGVWYWx1ZSh2YWx1ZSwgdG9Qcm90b2NvbDogc2VsZikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpIHRocm93cyB7CisgICAgCisgICAgbGV0IChfLCB0eXBlLCBfKSA9IHRyeSByZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgCisgICAgaWYgdHlwZSA9PSAuRVhDRVBUSU9OIHsKKyAgICAgIGxldCB4ID0gdHJ5IHJlYWRFeGNlcHRpb24oKQorICAgICAgdGhyb3cgeAorICAgIH0KKyAgICAKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQW55PywgbmFtZWQgbmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIAorICAgIGlmIHZhbHVlID09IG5pbCB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuVW5rbm93bi5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXk6IG5hbWVdKQorICAgIH0KKyAgICAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEV4Y2VwdGlvbigpIHRocm93cyAtPiBFcnJvclR5cGUgeworICAgIAorICAgIHZhciByZWFzb24gOiBTdHJpbmc/CisgICAgdmFyIHR5cGUgPSBUQXBwbGljYXRpb25FcnJvci5Vbmtub3duCisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RCZWdpbigpCisgICAgCisgICAgZmllbGRzOiB3aGlsZSAodHJ1ZSkgeworICAgICAgCisgICAgICBsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgcmVhZEZpZWxkQmVnaW4oKQorICAgICAgCisgICAgICBzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkgeworICAgICAgY2FzZSAoXywgLlNUT1ApOgorICAgICAgICBicmVhayBmaWVsZHMKKyAgICAgICAgCisgICAgICBjYXNlICgxLCAuU1RSSU5HKToKKyAgICAgICAgcmVhc29uID0gdHJ5IHJlYWRWYWx1ZSgpIGFzIFN0cmluZworICAgICAgICAKKyAgICAgIGNhc2UgKDIsIC5JMzIpOgorICAgICAgICBsZXQgdHlwZVZhbCA9IHRyeSByZWFkVmFsdWUoKSBhcyBJbnQzMgorICAgICAgICBpZiBsZXQgdG1wID0gVEFwcGxpY2F0aW9uRXJyb3IocmF3VmFsdWU6IHR5cGVWYWwpIHsKKyAgICAgICAgICB0eXBlID0gdG1wCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOgorICAgICAgICB0cnkgc2tpcFR5cGUodW5rbm93blR5cGUpCisgICAgICB9CisgICAgICAKKyAgICAgIHRyeSByZWFkRmllbGRFbmQoKQorICAgIH0KKyAgICAKKyAgICB0cnkgcmVhZFN0cnVjdEVuZCgpCisgICAgCisgICAgcmV0dXJuIE5TRXJyb3IodHlwZTp0eXBlLCByZWFzb246cmVhc29uID8/ICIiKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG5hbWU6IFN0cmluZywgc2VxdWVuY2VJRDogSW50LCBleDogTlNFcnJvcikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiAuRVhDRVBUSU9OLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIHRyeSBleC53cml0ZShzZWxmKQorICAgIHRyeSB3cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBza2lwVHlwZSh0eXBlOiBUVHlwZSkgdGhyb3dzIHsKKyAgICB0cnkgVFByb3RvY29sVXRpbC5za2lwVHlwZSh0eXBlLnJhd1ZhbHVlLCBvblByb3RvY29sOiBzZWxmKQorICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGZkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RTZXJpYWxpemFibGUuc3dpZnQKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVFNlcmlhbGl6YWJsZSA6IEhhc2hhYmxlIHsKKyAgCisgIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgZ2V0IH0KKyAgCisgIGluaXQoKQorICAKKyAgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTZWxmCisgIAorICBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBTZWxmLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cworICAKK30KKworCisKK2luZml4IG9wZXJhdG9yID89PSB7fQorCitwdWJsaWMgZnVuYyA/PT08VDogVFNlcmlhbGl6YWJsZT4obGhzOiBUPywgcmhzOiBUPykgLT4gQm9vbCB7CisgIGlmIGxldCBsID0gbGhzLCByID0gcmhzIHsKKyAgICByZXR1cm4gbCA9PSByCisgIH0KKyAgcmV0dXJuIGxocyA9PSByaHMKK30KKworcHVibGljIGZ1bmMgPz09PFQ6IFRTZXJpYWxpemFibGU+KGxoczogVCwgcmhzOiBUKSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocyA9PSByaHMKK30KKworCisKK2V4dGVuc2lvbiBCb29sIDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuQk9PTAorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgdmFyIHZhbHVlIDogT2JqQ0Jvb2wgPSBmYWxzZQorICAgIHRyeSBwcm90by5yZWFkQm9vbCgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlLmJvb2xWYWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogQm9vbCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJvb2wodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQ4IDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuQllURQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50OCB7CisgICAgdmFyIHZhbHVlID0gVUludDgoKQorICAgIHRyeSBwcm90by5yZWFkQnl0ZSgmdmFsdWUpCisgICAgcmV0dXJuIEludDgodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQ4LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlQnl0ZShVSW50OCh2YWx1ZSkpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQxNiA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkkxNgorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHZhciB2YWx1ZSA9IEludDE2KCkKKyAgICB0cnkgcHJvdG8ucmVhZEkxNigmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQxNiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUkxNih2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIEludCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkkzMgorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50IHsKKyAgICB2YXIgdmFsdWUgPSBJbnQzMigpCisgICAgdHJ5IHByb3RvLnJlYWRJMzIoJnZhbHVlKQorICAgIHJldHVybiBJbnQodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMzIoSW50MzIodmFsdWUpKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50MzIgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JMzIKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICB2YXIgdmFsdWUgPSBJbnQzMigpCisgICAgdHJ5IHByb3RvLnJlYWRJMzIoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50MzIsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMzIodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQ2NCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkk2NAorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHZhciB2YWx1ZSA9IEludDY0KCkKKyAgICB0cnkgcHJvdG8ucmVhZEk2NCgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQ2NCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUk2NCh2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIERvdWJsZSA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkRPVUJMRQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICB2YXIgdmFsdWUgPSBEb3VibGUoKQorICAgIHRyeSBwcm90by5yZWFkRG91YmxlKCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IERvdWJsZSwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZURvdWJsZSh2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIFN0cmluZyA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLlNUUklORworICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICB2YXIgdmFsdWUgOiBOU1N0cmluZz8KKyAgICB0cnkgcHJvdG8ucmVhZFN0cmluZygmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlIGFzISBTdHJpbmcKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFN0cmluZywgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVN0cmluZyh2YWx1ZSkKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTgzM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UU2V0LnN3aWZ0CkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUU2V0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IENvbGxlY3Rpb25UeXBlLCBBcnJheUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLlNFVCB9CisgIAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICAKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBTZXQ8RWxlbWVudD4KKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKGVsZW1lbnRzKQorICB9CisgIAorICBwdWJsaWMgaW5pdDxTIDogU2VxdWVuY2VUeXBlIHdoZXJlIFMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4oXyBzZXF1ZW5jZTogUykgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKSAgICAKKyAgfQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4IDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXggOiBJbmRleCB7IHJldHVybiBzdG9yYWdlLmVuZEluZGV4IH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChtZW1iZXI6IEVsZW1lbnQpIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbnNlcnQobWVtYmVyKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmUoZWxlbWVudDogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShlbGVtZW50KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlQWxsKGtlZXBDYXBhY2l0eToga2VlcENhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KGluZGV4OiBTZXRJbmRleDxFbGVtZW50PikgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IFNldEluZGV4PEVsZW1lbnQ+KSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdW5pb24ob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UudW5pb24ob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbnRlcnNlY3Qob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UuaW50ZXJzZWN0KG90aGVyKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZXhjbHVzaXZlT3Iob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UuZXhjbHVzaXZlT3Iob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzdWJ0cmFjdChvdGhlcjogVFNldCkgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZS5zdWJ0cmFjdChvdGhlcikpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGludGVyc2VjdEluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLmludGVyc2VjdEluUGxhY2Uob3RoZXIpCisgIH0KKworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBleGNsdXNpdmVPckluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLmV4Y2x1c2l2ZU9ySW5QbGFjZShvdGhlcikKKyAgfQorCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHN1YnRyYWN0SW5QbGFjZShvdGhlcjogVFNldCkgeworICAgIHN0b3JhZ2Uuc3VidHJhY3RJblBsYWNlKG90aGVyKQorICB9ICAKKworICBwdWJsaWMgZnVuYyBpc1N1YnNldE9mKG90aGVyOiBUU2V0KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pc1N1YnNldE9mKG90aGVyKQorICB9CisKKyAgcHVibGljIGZ1bmMgaXNEaXNqb2ludFdpdGgob3RoZXI6IFRTZXQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmlzRGlzam9pbnRXaXRoKG90aGVyKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpc1N1cGVyc2V0T2Yob3RoZXI6IFRTZXQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmlzU3VwZXJzZXRPZihvdGhlcikKKyAgfQorCisgIHB1YmxpYyB2YXIgaXNFbXB0eTogQm9vbCB7IHJldHVybiBzdG9yYWdlLmlzRW1wdHkgfQorCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGVsZW1lbnQuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVFNldCB7CisgICAgbGV0IChlbGVtZW50VHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZFNldEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgTlNFcnJvcigKKyAgICAgICAgZG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiwKKyAgICAgICAgY29kZTogSW50KFRQcm90b2NvbEVycm9yLkludmFsaWREYXRhLnJhd1ZhbHVlKSwKKyAgICAgICAgdXNlckluZm86IFtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IE5TTnVtYmVyKGludDogZWxlbWVudFR5cGUucmF3VmFsdWUpXSkKKyAgICB9CisgICAgdmFyIHNldCA9IFRTZXQoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgc2V0LnN0b3JhZ2UuaW5zZXJ0KGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU2V0RW5kKCkKKyAgICByZXR1cm4gc2V0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUU2V0LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGUoRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiB2YWx1ZS5jb3VudCkKKyAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZS5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlVmFsdWUoZWxlbWVudCwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZVNldEVuZCgpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBUU2V0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVFNldDxFbGVtZW50PiwgcmhzOiBUU2V0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKaW5kZXggZDNlNTVjNC4uYzc1ZmFkMSAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaApAQCAtMjAsOCArMjAsOSBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUUHJvY2Vzc29yRmFjdG9yeS5oIgogCi1AaW50ZXJmYWNlIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5IDogTlNPYmplY3QgPFRQcm9jZXNzb3JGYWN0b3J5PiB7Ci0gIGlkPFRQcm9jZXNzb3I+IG1TaGFyZWRQcm9jZXNzb3I7Ci19CisKK0BpbnRlcmZhY2UgVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkgOiBOU09iamVjdCA8VFByb2Nlc3NvckZhY3Rvcnk+CisKKy0oaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yOihpZDxUUHJvY2Vzc29yPilzaGFyZWRQcm9jZXNzb3I7CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubSBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubQppbmRleCBiMzhlNzNhLi4zZDU1ZjQ3IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0KKysrIGIvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5tCkBAIC0yMSwzMSArMjEsMjkgQEAKICNpbXBvcnQgIlRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgiCiAKIAorQGludGVyZmFjZSBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeSAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm9jZXNzb3I+IHNoYXJlZFByb2Nlc3NvcjsKKworQGVuZAorCisKIEBpbXBsZW1lbnRhdGlvbiBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeQogCiAKLS0gKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjogKGlkPFRQcm9jZXNzb3I+KSBzaGFyZWRQcm9jZXNzb3IKKy0oaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yOihpZDxUUHJvY2Vzc29yPilzaGFyZWRQcm9jZXNzb3IKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKCFzZWxmKSB7Ci0gICAgcmV0dXJuIG5pbDsKKyAgaWYgKHNlbGYpIHsKKyAgICBfc2hhcmVkUHJvY2Vzc29yID0gc2hhcmVkUHJvY2Vzc29yOwogICB9Ci0gIAotICBtU2hhcmVkUHJvY2Vzc29yID0gW3NoYXJlZFByb2Nlc3NvciByZXRhaW5dOworCiAgIHJldHVybiBzZWxmOwogfQogCi0KLS0gKHZvaWQpIGRlYWxsb2MKKy0oaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDooaWQ8VFRyYW5zcG9ydD4pdHJhbnNwb3J0CiB7Ci0gIFttU2hhcmVkUHJvY2Vzc29yIHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLQotLSAoaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDogKGlkPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLXsKLSAgcmV0dXJuIFtbbVNoYXJlZFByb2Nlc3NvciByZXRhaW5dIGF1dG9yZWxlYXNlXTsKKyAgcmV0dXJuIF9zaGFyZWRQcm9jZXNzb3I7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFN0cnVjdC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFN0cnVjdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWE3MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UU3RydWN0LnN3aWZ0CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVFN0cnVjdCA6IFRTZXJpYWxpemFibGUgeworfQorCisKK3B1YmxpYyBleHRlbnNpb24gVFN0cnVjdCB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gVFR5cGUuU1RSVUNUIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RocmlmdC5oIGIvbGliL2NvY29hL3NyYy9UaHJpZnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE4MjZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UaHJpZnQuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgVGhyaWZ0VmVyc2lvbiBAIjEuMC4wIgpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzVkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCYXNlLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisKK0Bwcm90b2NvbCBUQmFzZSA8TlNPYmplY3Q+CisKKy8qKgorICogRGUtc2VyaWFsaXplIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbAorICoKKyAqIEBwYXJhbSBpblByb3RvY29sIHByb3RvY29sIHVzZWQgZm9yIHJlYWRpbmcKKyAqLworLShCT09MKSByZWFkOihpZCA8VFByb3RvY29sPilpblByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworCisvKioKKyAqIFNlcmlhbGl6ZSBvYmplY3QgdG8gdGhlIGdpdmVuIHByb3RvY29sCisgKgorICogQHBhcmFtIG91dFByb3RvY29sIG91dHB1dCBwcm90b2NvbCB1c2VkIGZvciB3cml0aW5nCisgKi8KKy0oQk9PTCkgd3JpdGU6KGlkIDxUUHJvdG9jb2w+KW91dFByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworCisKKy8qKgorICogVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzCisgKi8KKy0oQk9PTCkgdmFsaWRhdGU6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3I7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmluZGV4IDUyY2YyNjYuLmJiOTBmYWQgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaApAQCAtMjEsMzEgKzIxLDI5IEBACiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAjaW1wb3J0ICJUUHJvdG9jb2xGYWN0b3J5LmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLUBpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4gewotICBpZCA8VFRyYW5zcG9ydD4gbVRyYW5zcG9ydDsKLSAgQk9PTCBtU3RyaWN0UmVhZDsKLSAgQk9PTCBtU3RyaWN0V3JpdGU7Ci0gIGludDMyX3QgbU1lc3NhZ2VTaXplTGltaXQ7Ci19CiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2wgOiBOU09iamVjdCA8VFByb3RvY29sPgogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotICAgICAgICAgICAgICBzdHJpY3RSZWFkOiAoQk9PTCkgc3RyaWN0UmVhZAotICAgICAgICAgICAgIHN0cmljdFdyaXRlOiAoQk9PTCkgc3RyaWN0V3JpdGU7CitAcHJvcGVydHkgKGFzc2lnbiwgbm9uYXRvbWljKSBVSW50MzIgbWVzc2FnZVNpemVMaW1pdDsKIAotLSAoaW50MzJfdCkgbWVzc2FnZVNpemVMaW1pdDsKLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQ7CistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKKyAgICAgICAgICAgICBzdHJpY3RSZWFkOihCT09MKXN0cmljdFJlYWQKKyAgICAgICAgICAgIHN0cmljdFdyaXRlOihCT09MKXN0cmljdFdyaXRlOwogCiBAZW5kOwogCiAKLUBpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvdG9jb2xGYWN0b3J5PiB7Ci19CitAaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgOiBOU09iamVjdCA8VFByb3RvY29sRmFjdG9yeT4KIAotKyAoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5OworKyhUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3Rvcnk7CiAKLS0gKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0KaW5kZXggNTk5OWUyNS4uMWY5ZTU3YSAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubQorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5tCkBAIC0xOCwxNyArMTgsMjAgQEAKICAqLwogCiAjaW1wb3J0ICJUQmluYXJ5UHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRQcm90b2NvbEV4Y2VwdGlvbi5oIgotCi1pbnQzMl90IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7Ci1pbnQzMl90IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisjaW1wb3J0ICJUUHJvdG9jb2xFcnJvci5oIgogCiAKLXN0YXRpYyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICogZ1NoYXJlZEZhY3RvcnkgPSBuaWw7CitzdGF0aWMgU0ludDMyIFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CitzdGF0aWMgU0ludDMyIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisKKworc3RhdGljIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKmdTaGFyZWRGYWN0b3J5ID0gbmlsOworCiAKIEBpbXBsZW1lbnRhdGlvbiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5CiAKLSsgKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeSB7CisrKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeQorewogICBpZiAoZ1NoYXJlZEZhY3RvcnkgPT0gbmlsKSB7CiAgICAgZ1NoYXJlZEZhY3RvcnkgPSBbW1RCaW5hcnlQcm90b2NvbEZhY3RvcnkgYWxsb2NdIGluaXRdOwogICB9CkBAIC0zNiwzNTggKzM5LDU1MyBAQAogICByZXR1cm4gZ1NoYXJlZEZhY3Rvcnk7CiB9CiAKLS0gKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQgewotICByZXR1cm4gW1tbVEJpbmFyeVByb3RvY29sIGFsbG9jXSBpbml0V2l0aFRyYW5zcG9ydDogdHJhbnNwb3J0XSBhdXRvcmVsZWFzZV07CistKE5TU3RyaW5nICopIHByb3RvY29sTmFtZQoreworICByZXR1cm4gQCJiaW5hcnkiOworfQorCistKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0Cit7CisgIHJldHVybiBbW1RCaW5hcnlQcm90b2NvbCBhbGxvY10gaW5pdFdpdGhUcmFuc3BvcnQ6dHJhbnNwb3J0XTsKIH0KIAogQGVuZAogCiAKK0BpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQgPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBCT09MIHN0cmljdFJlYWQ7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIEJPT0wgc3RyaWN0V3JpdGU7CisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmN1cnJlbnRNZXNzYWdlTmFtZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmN1cnJlbnRGaWVsZE5hbWU7CisKK0BlbmQKKwogCiBAaW1wbGVtZW50YXRpb24gVEJpbmFyeVByb3RvY29sCiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0CistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KWFUcmFuc3BvcnQKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVHJhbnNwb3J0OiB0cmFuc3BvcnQgc3RyaWN0UmVhZDogTk8gc3RyaWN0V3JpdGU6IE5PXTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVHJhbnNwb3J0OmFUcmFuc3BvcnQgc3RyaWN0UmVhZDpOTyBzdHJpY3RXcml0ZTpZRVNdOwogfQogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotICAgICAgICAgICAgICBzdHJpY3RSZWFkOiAoQk9PTCkgc3RyaWN0UmVhZAotICAgICAgICAgICAgIHN0cmljdFdyaXRlOiAoQk9PTCkgc3RyaWN0V3JpdGUKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0CisgICAgICAgICAgICAgc3RyaWN0UmVhZDooQk9PTClzdHJpY3RSZWFkCisgICAgICAgICAgICBzdHJpY3RXcml0ZTooQk9PTClzdHJpY3RXcml0ZQogewogICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBtVHJhbnNwb3J0ID0gW3RyYW5zcG9ydCByZXRhaW5dOwotICBtU3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7Ci0gIG1TdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlOworICBpZiAoc2VsZikgeworICAgIF90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgX3N0cmljdFJlYWQgPSBzdHJpY3RSZWFkOworICAgIF9zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlOworICB9CiAgIHJldHVybiBzZWxmOwogfQogCi0KLS0gKGludDMyX3QpIG1lc3NhZ2VTaXplTGltaXQKKy0oaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKIHsKLSAgcmV0dXJuIG1NZXNzYWdlU2l6ZUxpbWl0OworICByZXR1cm4gX3RyYW5zcG9ydDsKIH0KIAotCi0tICh2b2lkKSBzZXRNZXNzYWdlU2l6ZUxpbWl0OiAoaW50MzJfdCkgc2l6ZUxpbWl0CistKE5TU3RyaW5nICopIHJlYWRTdHJpbmdCb2R5OihpbnQpc2l6ZSBlcnJvcjooTlNFcnJvciAqKillcnJvcgogewotICBtTWVzc2FnZVNpemVMaW1pdCA9IHNpemVMaW1pdDsKLX0KLQotCi0tICh2b2lkKSBkZWFsbG9jCi17Ci0gIFttVHJhbnNwb3J0IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLQotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLXsKLSAgcmV0dXJuIG1UcmFuc3BvcnQ7Ci19Ci0KLQotLSAoTlNTdHJpbmcgKikgcmVhZFN0cmluZ0JvZHk6IChpbnQpIHNpemUKLXsKLSAgY2hhciAqIGJ1ZmZlciA9IG1hbGxvYyhzaXplKzEpOwotICBpZiAoIWJ1ZmZlcikgewotICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiAlcywgc2l6ZTogJWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVdXTs7CisgIE5TTXV0YWJsZURhdGEgKmRhdGEgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpzaXplXTsKKyAgaWYgKCFkYXRhKSB7CisgICAgUFJPVE9DT0xfRVJST1IobmlsLCBVbmtub3duLCBAIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyIsIHNpemUpOwogICB9Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZmZlciBvZmZzZXQ6IDAgbGVuZ3RoOiBzaXplXTsKLSAgYnVmZmVyW3NpemVdID0gMDsKLSAgTlNTdHJpbmcgKiByZXN1bHQgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6IGJ1ZmZlcl07Ci0gIGZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIHJlc3VsdDsKKworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6ZGF0YS5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKG5pbCwgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGEgZW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwogfQogCiAKLS0gKHZvaWQpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50ICopIHNlcXVlbmNlSUQKKy0oQk9PTCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMiAqKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludDMyX3Qgc2l6ZSA9IFtzZWxmIHJlYWRJMzJdOworICBTSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICA7CisKICAgaWYgKHNpemUgPCAwKSB7CiAgICAgaW50IHZlcnNpb24gPSBzaXplICYgVkVSU0lPTl9NQVNLOwogICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIkJhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4iXTsKKyAgICAgIFBST1RPQ09MX0VSUk9SKE5PLCBCYWRWZXJzaW9uLCBAIkJhZCBtZXNzYWdlIHZlcnNpb24iKTsKICAgICB9CiAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewotICAgICAgKnR5cGUgPSB2ZXJzaW9uICYgMHgwMEZGOworICAgICAgKnR5cGUgPSBzaXplICYgMHgwMEZGOwogICAgIH0KLSAgICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ107CisgICAgTlNTdHJpbmcgKm1lc3NhZ2VOYW1lOworICAgIGlmICghW3NlbGYgcmVhZFN0cmluZzombWVzc2FnZU5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmIChuYW1lICE9IG5pbCkgeworICAgICAgKm5hbWUgPSBtZXNzYWdlTmFtZTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisKKyAgICBpZiAoX3N0cmljdFJlYWQpIHsKKyAgICAgIFBST1RPQ09MX0VSUk9SKE5PLCBJbnZhbGlkRGF0YSwgQCJNaXNzaW5nIG1lc3NhZ2UgdmVyc2lvbiwgb2xkIGNsaWVudD8iKTsKKyAgICB9CisKKyAgICBpZiAoX21lc3NhZ2VTaXplTGltaXQgPiAwICYmIHNpemUgPiBfbWVzc2FnZVNpemVMaW1pdCkgeworICAgICAgUFJPVE9DT0xfRVJST1IoTk8sIFNpemVMaW1pdCwgQCJNZXNzYWdlIGV4Y2VlZWRzIHNpemUgbGltaXQgb2YgJWQiLCAoaW50KXNpemUpOworICAgIH0KKworICAgIE5TU3RyaW5nICptZXNzYWdlTmFtZSA9IFtzZWxmIHJlYWRTdHJpbmdCb2R5OnNpemUgZXJyb3I6ZXJyb3JdOworICAgIGlmICghbWVzc2FnZU5hbWUpIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKICAgICBpZiAobmFtZSAhPSBOVUxMKSB7CiAgICAgICAqbmFtZSA9IG1lc3NhZ2VOYW1lOwogICAgIH0KLSAgICBpbnQgc2VxSUQgPSBbc2VsZiByZWFkSTMyXTsKLSAgICBpZiAoc2VxdWVuY2VJRCAhPSBOVUxMKSB7Ci0gICAgICAqc2VxdWVuY2VJRCA9IHNlcUlEOworCisgICAgVUludDggbWVzc2FnZVR5cGU7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZTombWVzc2FnZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICB9IGVsc2UgewotICAgIGlmIChtU3RyaWN0UmVhZCkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyJdOwotICAgIH0KLSAgICBpZiAoW3NlbGYgbWVzc2FnZVNpemVMaW1pdF0gPiAwICYmIHNpemUgPiBbc2VsZiBtZXNzYWdlU2l6ZUxpbWl0XSkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIk1lc3NhZ2UgdG9vIGJpZy4gIFNpemUgbGltaXQgaXM6ICVkIE1lc3NhZ2Ugc2l6ZSBpczogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVzc2FnZVNpemVMaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOwotICAgIH0KLSAgICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ0JvZHk6IHNpemVdOwotICAgIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAgICpuYW1lID0gbWVzc2FnZU5hbWU7Ci0gICAgfQotICAgIGludCBtZXNzYWdlVHlwZSA9IFtzZWxmIHJlYWRCeXRlXTsKKwogICAgIGlmICh0eXBlICE9IE5VTEwpIHsKICAgICAgICp0eXBlID0gbWVzc2FnZVR5cGU7CiAgICAgfQotICAgIGludCBzZXFJRCA9IFtzZWxmIHJlYWRJMzJdOwotICAgIGlmIChzZXF1ZW5jZUlEICE9IE5VTEwpIHsKLSAgICAgICpzZXF1ZW5jZUlEID0gc2VxSUQ7Ci0gICAgfQogICB9CisKKyAgU0ludDMyIHNlcUlEOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNlcUlEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoc2VxdWVuY2VJRCAhPSBOVUxMKSB7CisgICAgKnNlcXVlbmNlSUQgPSBzZXFJRDsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQge30KLQotCi0tICh2b2lkKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAqbmFtZSA9IG5pbDsKLSAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RFbmQge30KLQotCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50ICopIGZpZWxkSUQKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKW5hbWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyICopZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChuYW1lICE9IG5pbCkgewogICAgICpuYW1lID0gbmlsOwogICB9Ci0gIGludCBmdCA9IFtzZWxmIHJlYWRCeXRlXTsKKworICBVSW50OCBmdDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZnQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CiAgIGlmIChmaWVsZFR5cGUgIT0gTlVMTCkgewogICAgICpmaWVsZFR5cGUgPSBmdDsKICAgfQotICBpZiAoZnQgIT0gVFR5cGVfU1RPUCkgewotICAgIGludCBmaWQgPSBbc2VsZiByZWFkSTE2XTsKKyAgaWYgKGZ0ICE9IFRUeXBlU1RPUCkgeworICAgIFNJbnQxNiBmaWQ7CisgICAgaWYgKCFbc2VsZiByZWFkSTE2OiZmaWQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICAgIGlmIChmaWVsZElEICE9IE5VTEwpIHsKICAgICAgICpmaWVsZElEID0gZmlkOwogICAgIH0KICAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRGaWVsZEVuZCB7fQotCi0KLS0gKGludDMyX3QpIHJlYWRJMzIKKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGkzMnJkWzRdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpMzJyZCBvZmZzZXQ6IDAgbGVuZ3RoOiA0XTsKLSAgcmV0dXJuCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFNJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgTlNTdHJpbmcgKnN0cmluZyA9IFtzZWxmIHJlYWRTdHJpbmdCb2R5OnNpemUgZXJyb3I6ZXJyb3JdOworICBpZiAoIXN0cmluZykgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgICp2YWx1ZSA9IHN0cmluZzsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEJvb2w6KEJPT0wgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnl0ZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomYnl0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICAqdmFsdWUgPSBieXRlID09IDE7CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzFdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0gYnVmZlswXTsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbMl07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpidWZmIG9mZnNldDowIGxlbmd0aDoyIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPQorICAgICgoU0ludDE2KShidWZmWzBdICYgMHhmZikgPDwgOCkgfAorICAgICgoU0ludDE2KShidWZmWzFdICYgMHhmZikpOworCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkSTMyOihTSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggaTMycmRbNF07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDppMzJyZCBvZmZzZXQ6MCBsZW5ndGg6NCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0KICAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKICAgICAoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKICAgICAoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKICAgICAoKGkzMnJkWzNdICYgMHhmZikpOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAoTlNTdHJpbmcgKikgcmVhZFN0cmluZworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IHNpemUgPSBbc2VsZiByZWFkSTMyXTsKLSAgcmV0dXJuIFtzZWxmIHJlYWRTdHJpbmdCb2R5OiBzaXplXTsKKyAgVUludDggYnVmZls4XTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgICp2YWx1ZSA9CisgICAgKChTSW50NjQpKGJ1ZmZbMF0gJiAweGZmKSA8PCA1NikgfAorICAgICgoU0ludDY0KShidWZmWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZlsyXSAmIDB4ZmYpIDw8IDQwKSB8CisgICAgKChTSW50NjQpKGJ1ZmZbM10gJiAweGZmKSA8PCAzMikgfAorICAgICgoU0ludDY0KShidWZmWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZls1XSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbNl0gJiAweGZmKSA8PCAgOCkgfAorICAgICgoU0ludDY0KShidWZmWzddICYgMHhmZikpOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAoQk9PTCkgcmVhZEJvb2wKLXsKLSAgcmV0dXJuIFtzZWxmIHJlYWRCeXRlXSA9PSAxOwotfQotCi0tICh1aW50OF90KSByZWFkQnl0ZQotewotICB1aW50OF90IG15Qnl0ZTsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogJm15Qnl0ZSBvZmZzZXQ6IDAgbGVuZ3RoOiAxXTsKLSAgcmV0dXJuIG15Qnl0ZTsKLX0KLQotLSAoc2hvcnQpIHJlYWRJMTYKLXsKLSAgdWludDhfdCBidWZmWzJdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDJdOwotICByZXR1cm4gKHNob3J0KQotICAgICgoKGJ1ZmZbMF0gJiAweGZmKSA8PCA4KSB8Ci0gICAgICgoYnVmZlsxXSAmIDB4ZmYpKSk7Ci0gIHJldHVybiAwOwotfQotCi0tIChpbnQ2NF90KSByZWFkSTY0OwotewotICB1aW50OF90IGk2NHJkWzhdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpNjRyZCBvZmZzZXQ6IDAgbGVuZ3RoOiA4XTsKLSAgcmV0dXJuCi0gICAgKChpbnQ2NF90KShpNjRyZFswXSAmIDB4ZmYpIDw8IDU2KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFsxXSAmIDB4ZmYpIDw8IDQ4KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFsyXSAmIDB4ZmYpIDw8IDQwKSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFszXSAmIDB4ZmYpIDw8IDMyKSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs0XSAmIDB4ZmYpIDw8IDI0KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs1XSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs2XSAmIDB4ZmYpIDw8ICA4KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs3XSAmIDB4ZmYpKTsKLX0KLQotLSAoZG91YmxlKSByZWFkRG91YmxlOworLShCT09MKSByZWFkRG91YmxlOihkb3VibGUgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKICAgLy8gRklYTUUgLSB3aWxsIHRoaXMgZ2V0IHVzIGludG8gdHJvdWJsZSBvbiBQb3dlclBDPwotICBpbnQ2NF90IGllZWU3NTQgPSBbc2VsZiByZWFkSTY0XTsKLSAgcmV0dXJuICooKGRvdWJsZSAqKSAmaWVlZTc1NCk7CisgIHJldHVybiBbc2VsZiByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKIAotLSAoTlNEYXRhICopIHJlYWRCaW5hcnkKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50MzJfdCBzaXplID0gW3NlbGYgcmVhZEkzMl07Ci0gIHVpbnQ4X3QgKiBidWZmID0gbWFsbG9jKHNpemUpOwotICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgICAgICAgICBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJPdXQgb2YgbWVtb3J5LiAgVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIHRyeWluZyB0byByZWFkIGJpbmFyeSBkYXRhLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOworICBTSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKICAgfQotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IHNpemVdOwotICByZXR1cm4gW05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5OiBidWZmIGxlbmd0aDogc2l6ZV07CisKKyAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOnNpemVdOworICBpZiAoIWRhdGEpIHsKKyAgICBQUk9UT0NPTF9FUlJPUihOTywgVW5rbm93biwgQCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMiLCAoaW50KXNpemUpOworICB9CisKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmRhdGEubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpzaXplIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPSBkYXRhOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogKGludCAqKSBrZXlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50ICopIHZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplCistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KFNJbnQzMiAqKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyICopdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGt0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgdnQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzID0gW3NlbGYgcmVhZEkzMl07CisgIFVJbnQ4IGt0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZrdCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB2dDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomdnQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHM7CisgIGlmICghW3NlbGYgcmVhZEkzMjomcyBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAoa2V5VHlwZSAhPSBOVUxMKSB7CiAgICAgKmtleVR5cGUgPSBrdDsKICAgfQorCiAgIGlmICh2YWx1ZVR5cGUgIT0gTlVMTCkgewogICAgICp2YWx1ZVR5cGUgPSB2dDsKICAgfQorCiAgIGlmIChzaXplICE9IE5VTEwpIHsKICAgICAqc2l6ZSA9IHM7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSByZWFkTWFwRW5kIHt9CiAKLQotLSAodm9pZCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZE1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGV0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgcyA9IFtzZWxmIHJlYWRJMzJdOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBldDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZXQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHM7CisgIGlmICghW3NlbGYgcmVhZEkzMjomcyBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAoZWxlbWVudFR5cGUgIT0gTlVMTCkgewogICAgICplbGVtZW50VHlwZSA9IGV0OwogICB9CisKICAgaWYgKHNpemUgIT0gTlVMTCkgewogICAgICpzaXplID0gczsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZFNldEVuZCB7fQotCi0KLS0gKHZvaWQpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGV0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgcyA9IFtzZWxmIHJlYWRJMzJdOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBldDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZXQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHM7CisgIGlmICghW3NlbGYgcmVhZEkzMjomcyBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAoZWxlbWVudFR5cGUgIT0gTlVMTCkgewogICAgICplbGVtZW50VHlwZSA9IGV0OwogICB9CisKICAgaWYgKHNpemUgIT0gTlVMTCkgewogICAgICpzaXplID0gczsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZExpc3RFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZUJ5dGU6ICh1aW50OF90KSB2YWx1ZQorLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW21UcmFuc3BvcnQgd3JpdGU6ICZ2YWx1ZSBvZmZzZXQ6IDAgbGVuZ3RoOiAxXTsKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgbWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQpIHNlcXVlbmNlSUQKKworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChtU3RyaWN0V3JpdGUpIHsKKyAgaWYgKF9zdHJpY3RXcml0ZSkgeworCiAgICAgaW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlVHlwZTsKLSAgICBbc2VsZiB3cml0ZUkzMjogdmVyc2lvbl07Ci0gICAgW3NlbGYgd3JpdGVTdHJpbmc6IG5hbWVdOwotICAgIFtzZWxmIHdyaXRlSTMyOiBzZXF1ZW5jZUlEXTsKLSAgfSBlbHNlIHsKLSAgICBbc2VsZiB3cml0ZVN0cmluZzogbmFtZV07Ci0gICAgW3NlbGYgd3JpdGVCeXRlOiBtZXNzYWdlVHlwZV07Ci0gICAgW3NlbGYgd3JpdGVJMzI6IHNlcXVlbmNlSURdOworCisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjp2ZXJzaW9uIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVTdHJpbmc6bmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICB9CisgIGVsc2UgeworCisgICAgaWYgKCFbc2VsZiB3cml0ZVN0cmluZzpuYW1lIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlOm1lc3NhZ2VUeXBlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6c2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZTsKKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUge30KLQotCi0tICh2b2lkKSB3cml0ZVN0cnVjdEVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQKKy0oQk9PTCkgd3JpdGVNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6IGZpZWxkVHlwZV07Ci0gIFtzZWxmIHdyaXRlSTE2OiBmaWVsZElEXTsKKyAgX2N1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbDsKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZUkzMjogKGludDMyX3QpIHZhbHVlCistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgdWludDhfdCBidWZmWzRdOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6ZmllbGRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3NlbGYgd3JpdGVJMTY6ZmllbGRJRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCeXRlOih2YWx1ZSA/IDEgOiAwKSBlcnJvcjplcnJvcl07Cit9CisKKworLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOiZ2YWx1ZSBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVJMTY6KHNob3J0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzJdOworICBidWZmWzBdID0gMHhmZiAmICh2YWx1ZSA+PiA4KTsKKyAgYnVmZlsxXSA9IDB4ZmYgJiB2YWx1ZTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjIgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnVmZls0XTsKICAgYnVmZlswXSA9IDB4RkYgJiAodmFsdWUgPj4gMjQpOwogICBidWZmWzFdID0gMHhGRiAmICh2YWx1ZSA+PiAxNik7CiAgIGJ1ZmZbMl0gPSAweEZGICYgKHZhbHVlID4+IDgpOwogICBidWZmWzNdID0gMHhGRiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiA0XTsKLX0KIAotLSAodm9pZCkgd3JpdGVJMTY6IChzaG9ydCkgdmFsdWUKLXsKLSAgdWludDhfdCBidWZmWzJdOwotICBidWZmWzBdID0gMHhmZiAmICh2YWx1ZSA+PiA4KTsKLSAgYnVmZlsxXSA9IDB4ZmYgJiB2YWx1ZTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogMl07CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6NCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVJNjQ6IChpbnQ2NF90KSB2YWx1ZQorLShCT09MKSB3cml0ZUk2NDooU0ludDY0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGJ1ZmZbOF07CisgIFVJbnQ4IGJ1ZmZbOF07CiAgIGJ1ZmZbMF0gPSAweEZGICYgKHZhbHVlID4+IDU2KTsKICAgYnVmZlsxXSA9IDB4RkYgJiAodmFsdWUgPj4gNDgpOwogICBidWZmWzJdID0gMHhGRiAmICh2YWx1ZSA+PiA0MCk7CkBAIC0zOTYsODIgKzU5NCwxNDcgQEAKICAgYnVmZls1XSA9IDB4RkYgJiAodmFsdWUgPj4gMTYpOwogICBidWZmWzZdID0gMHhGRiAmICh2YWx1ZSA+PiA4KTsKICAgYnVmZls3XSA9IDB4RkYgJiB2YWx1ZTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogOF07CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpidWZmIG9mZnNldDowIGxlbmd0aDo4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVEb3VibGU6IChkb3VibGUpIHZhbHVlCisKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgLy8gc3BpdCBvdXQgSUVFRSA3NTQgYml0cyAtIEZJWE1FIC0gd2lsbCB0aGlzIGdldCB1cyBpbiB0cm91YmxlIG9uCi0gIC8vIFBvd2VyUEM/Ci0gIFtzZWxmIHdyaXRlSTY0OiAqKChpbnQ2NF90ICopICZ2YWx1ZSldOworICAvLyBGSVhNRSAtIHdpbGwgdGhpcyBnZXQgdXMgaW4gdHJvdWJsZSBvbiBQb3dlclBDPworICBpZiAoIVtzZWxmIHdyaXRlSTY0OiooU0ludDY0ICopJnZhbHVlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVTdHJpbmc6IChOU1N0cmluZyAqKSB2YWx1ZQorLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKICAgaWYgKHZhbHVlICE9IG5pbCkgewotICAgIGNvbnN0IGNoYXIgKiB1dGY4Qnl0ZXMgPSBbdmFsdWUgVVRGOFN0cmluZ107Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbih1dGY4Qnl0ZXMpOwotICAgIFtzZWxmIHdyaXRlSTMyOiBsZW5ndGhdOwotICAgIFttVHJhbnNwb3J0IHdyaXRlOiAodWludDhfdCAqKSB1dGY4Qnl0ZXMgb2Zmc2V0OiAwIGxlbmd0aDogbGVuZ3RoXTsKLSAgfSBlbHNlIHsKKworICAgIGNvbnN0IGNoYXIgKnV0ZjhCeXRlcyA9IFt2YWx1ZSBVVEY4U3RyaW5nXTsKKworICAgIFNJbnQzMiBsZW5ndGggPSAoU0ludDMyKXN0cmxlbih1dGY4Qnl0ZXMpOworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6bGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopdXRmOEJ5dGVzIG9mZnNldDowIGxlbmd0aDooaW50KWxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICAgIH0KKworICB9CisgIGVsc2UgeworCiAgICAgLy8gaW5zdGVhZCBvZiBjcmFzaGluZyB3aGVuIHdlIGdldCBudWxsLCBsZXQncyB3cml0ZSBvdXQgYSB6ZXJvCiAgICAgLy8gbGVuZ3RoIHN0cmluZwotICAgIFtzZWxmIHdyaXRlSTMyOiAwXTsKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOjAgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlQmluYXJ5OiAoTlNEYXRhICopIGRhdGEKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlSTMyOiBbZGF0YSBsZW5ndGhdXTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IFtkYXRhIGJ5dGVzXSBvZmZzZXQ6IDAgbGVuZ3RoOiBbZGF0YSBsZW5ndGhdXTsKLX0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjooU0ludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQogCi0tICh2b2lkKSB3cml0ZUZpZWxkU3RvcAotewotICBbc2VsZiB3cml0ZUJ5dGU6IFRUeXBlX1NUT1BdOworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmRhdGEuYnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihVSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6IChpbnQpIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCkgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZToga2V5VHlwZV07Ci0gIFtzZWxmIHdyaXRlQnl0ZTogdmFsdWVUeXBlXTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTpUVHlwZVNUT1AgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVNYXBFbmQge30KIAotCi0tICh2b2lkKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6IGVsZW1lbnRUeXBlXTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZVNldEVuZCB7fQogCi0KLS0gKHZvaWQpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogZWxlbWVudFR5cGVdOwotICBbc2VsZiB3cml0ZUkzMjogc2l6ZV07CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOmtleVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOnZhbHVlVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjooaW50KXNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHdyaXRlTGlzdEVuZCB7fQogCi0KLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIHZhbHVlCistKEJPT0wpIHdyaXRlTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6ICh2YWx1ZSA/IDEgOiAwKV07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6ZWxlbWVudFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVJMzI6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOmVsZW1lbnRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlSTMyOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUxpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2YWNjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUUHJvdG9jb2xGYWN0b3J5LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4KKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKK0BlbmQKKworQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvdG9jb2xGYWN0b3J5PgorCisrKFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3Rvcnk7CisKKy0oVENvbXBhY3RQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBlYmIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLm0KQEAgLTAsMCArMSw5ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVENvbXBhY3RQcm90b2NvbC5oIgorI2ltcG9ydCAiVFByb3RvY29sRXJyb3IuaCIKKworc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfUFJPVE9DT0xfSUQgPSAweDgyOworc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVkVSU0lPTiA9IDE7CitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9WRVJTSU9OX01BU0sgPSAweDFGOyAvLyAwMDAxIDExMTEKK3N0YXRpYyBjb25zdCBVSW50OCBDT01QQUNUX1RZUEVfTUFTSyA9IDB4RTA7IC8vIDExMTAgMDAwMAorc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCitzdGF0aWMgY29uc3QgaW50IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCitlbnVtIHsKKyAgVENUeXBlX1NUT1AgPSAweDAwLAorICBUQ1R5cGVfQk9PTEVBTl9UUlVFID0gMHgwMSwKKyAgVENUeXBlX0JPT0xFQU5fRkFMU0UgPSAweDAyLAorICBUQ1R5cGVfQllURSA9IDB4MDMsCisgIFRDVHlwZV9JMTYgPSAweDA0LAorICBUQ1R5cGVfSTMyID0gMHgwNSwKKyAgVENUeXBlX0k2NCA9IDB4MDYsCisgIFRDVHlwZV9ET1VCTEUgPSAweDA3LAorICBUQ1R5cGVfQklOQVJZID0gMHgwOCwKKyAgVENUeXBlX0xJU1QgPSAweDA5LAorICBUQ1R5cGVfU0VUID0gMHgwQSwKKyAgVENUeXBlX01BUCA9IDB4MEIsCisgIFRDVHlwZV9TVFJVQ1QgPSAweDBDLAorfTsKKworQGltcGxlbWVudGF0aW9uIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5CisKKysoVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeQoreworICBzdGF0aWMgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKmdTaGFyZWRGYWN0b3J5ID0gbmlsOworICBpZiAoZ1NoYXJlZEZhY3RvcnkgPT0gbmlsKSB7CisgICAgZ1NoYXJlZEZhY3RvcnkgPSBbW1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGFsbG9jXSBpbml0XTsKKyAgfQorCisgIHJldHVybiBnU2hhcmVkRmFjdG9yeTsKK30KKworLShOU1N0cmluZyAqKSBwcm90b2NvbE5hbWUKK3sKKyAgcmV0dXJuIEAiY29tcGFjdCI7Cit9CisKKy0oVENvbXBhY3RQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0Cit7CisgIHJldHVybiBbW1RDb21wYWN0UHJvdG9jb2wgYWxsb2NdIGluaXRXaXRoVHJhbnNwb3J0OnRyYW5zcG9ydF07Cit9CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRDb21wYWN0UHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZCA8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZUFycmF5ICpsYXN0RmllbGQ7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIHNob3J0IGxhc3RGaWVsZElkOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpib29sRmllbGROYW1lOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbEZpZWxkVHlwZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNOdW1iZXIgKmJvb2xGaWVsZElkOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbGVhblZhbHVlOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpjdXJyZW50TWVzc2FnZU5hbWU7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVENvbXBhY3RQcm90b2NvbAorCistKGlkKSBpbml0Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisKKyAgaWYgKHNlbGYgIT0gbmlsKSB7CisgICAgX2xhc3RGaWVsZCA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworICB9CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pYVRyYW5zcG9ydAoreworICBzZWxmID0gW3NlbGYgaW5pdF07CisKKyAgaWYgKHNlbGYgIT0gbmlsKSB7CisgICAgX3RyYW5zcG9ydCA9IGFUcmFuc3BvcnQ7CisgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAoreworICByZXR1cm4gX3RyYW5zcG9ydDsKK30KKworLShCT09MKSB3cml0ZUJ5dGVEaXJlY3Q6KFVJbnQ4KW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopJm4gb2Zmc2V0OjAgbGVuZ3RoOjEgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVZhcmludDMyOihVSW50MzIpbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggaTMyYnVmWzVdID0gezB9OworICBVSW50MzIgaWR4ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBpMzJidWZbaWR4KytdID0gKFVJbnQ4KW47CisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpMzJidWZbaWR4KytdID0gKFVJbnQ4KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6aTMyYnVmIG9mZnNldDowIGxlbmd0aDppZHggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpbWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6Q09NUEFDVF9QUk9UT0NPTF9JRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6KFVJbnQ4KSgoQ09NUEFDVF9WRVJTSU9OICYgQ09NUEFDVF9WRVJTSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoVUludDMyKW1lc3NhZ2VUeXBlKSA8PCBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9NQVNLKSkgZXJyb3I6ZXJyb3JdKQorICB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKXNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVTdHJpbmc6bmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZTsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX2xhc3RGaWVsZCBhZGRPYmplY3Q6QChfbGFzdEZpZWxkSWQpXTsKKyAgX2xhc3RGaWVsZElkID0gMDsKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgX2xhc3RGaWVsZElkID0gW19sYXN0RmllbGQubGFzdE9iamVjdCBzaG9ydFZhbHVlXTsKKyAgW19sYXN0RmllbGQgcmVtb3ZlTGFzdE9iamVjdF07CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVCT09MKSB7CisgICAgX2Jvb2xGaWVsZE5hbWUgPSBbbmFtZSBjb3B5XTsKKyAgICBfYm9vbEZpZWxkVHlwZSA9IEAoZmllbGRUeXBlKTsKKyAgICBfYm9vbEZpZWxkSWQgPSBAKGZpZWxkSUQpOworICAgIHJldHVybiBZRVM7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIFtzZWxmIHdyaXRlRmllbGRCZWdpbkludGVybmFsV2l0aE5hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOmZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZToweEZGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworICB9Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTooVUludDgpdHlwZU92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOmZpZWxkVHlwZV0gOiB0eXBlT3ZlcnJpZGU7CisKKyAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgIGlmIChmaWVsZElEID4gX2xhc3RGaWVsZElkICYmIGZpZWxkSUQgLSBfbGFzdEZpZWxkSWQgPD0gMTUpIHsKKyAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6KGZpZWxkSUQgLSBfbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OnR5cGVUb1dyaXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpZiAoIVtzZWxmIHdyaXRlSTE2OmZpZWxkSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgX2xhc3RGaWVsZElkID0gZmllbGRJRDsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlRmllbGRTdG9wOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCeXRlRGlyZWN0OlRDVHlwZV9TVE9QIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKHNpemUgPT0gMCkgeworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OjAgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKXNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OltzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6a2V5VHlwZV0gPDwgNCB8IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6dmFsdWVUeXBlXSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUNvbGxlY3Rpb25CZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQm9vbDooQk9PTCliIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBCT09MIHJlc3VsdDsKKyAgaWYgKF9ib29sRmllbGRJZCAhPSBuaWwgJiYgX2Jvb2xGaWVsZE5hbWUgIT0gbmlsICYmIF9ib29sRmllbGRUeXBlICE9IG5pbCkgeworICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgIHJlc3VsdCA9IFtzZWxmIHdyaXRlRmllbGRCZWdpbkludGVybmFsV2l0aE5hbWU6X2Jvb2xGaWVsZE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOl9ib29sRmllbGRUeXBlLmludFZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpfYm9vbEZpZWxkSWQuaW50VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOmIgPyBUQ1R5cGVfQk9PTEVBTl9UUlVFIDogVENUeXBlX0JPT0xFQU5fRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKKyAgICBfYm9vbEZpZWxkSWQgPSBuaWw7CisgICAgX2Jvb2xGaWVsZE5hbWUgPSBuaWw7CisgICAgX2Jvb2xGaWVsZFR5cGUgPSBuaWw7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgcmVzdWx0ID0gW3NlbGYgd3JpdGVCeXRlRGlyZWN0OmIgPyBUQ1R5cGVfQk9PTEVBTl9UUlVFIDogVENUeXBlX0JPT0xFQU5fRkFMU0UgZXJyb3I6ZXJyb3JdOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy0oQk9PTCkgd3JpdGVCeXRlOihVSW50OCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVJMTY6KFNJbnQxNil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlVmFyaW50MzI6W3NlbGYgaTMyVG9aaWdaYWc6dmFsdWVdIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVWYXJpbnQzMjpbc2VsZiBpMzJUb1ppZ1phZzp2YWx1ZV0gZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZVZhcmludDY0OltzZWxmIGk2NFRvWmlnWmFnOnZhbHVlXSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgLy8gU2FmZSBiaXQtY2FzdGluZyBkb3VibGUtPnVpbnQ2NAorCisgIFVJbnQ2NCBiaXRzID0gMDsKKyAgbWVtY3B5KCZiaXRzLCAmdmFsdWUsIDgpOworCisgIGJpdHMgPSBPU1N3YXBIb3N0VG9MaXR0bGVJbnQ2NChiaXRzKTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOihVSW50OCAqKSZiaXRzIG9mZnNldDowIGxlbmd0aDo4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQmluYXJ5Olt2YWx1ZSBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ10gZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQmluYXJ5OihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlVmFyaW50MzI6KFVJbnQzMilkYXRhLmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpkYXRhLmJ5dGVzIG9mZnNldDowIGxlbmd0aDooVUludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBjdHlwZUVsZW1lbnQgPSBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOmVsZW1lbnRUeXBlXTsKKworICBpZiAoc2l6ZSA8PSAxNCkgeworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OnNpemUgPDwgNCB8IGN0eXBlRWxlbWVudCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6MHhmMCB8IGN0eXBlRWxlbWVudCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaWYgKCFbc2VsZiB3cml0ZVZhcmludDMyOihVSW50MzIpc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVZhcmludDY0OihVSW50NjQpbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggdmFyaW50NjRvdXRbMTBdID0gezB9OworICBpbnQgaWR4ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgeworICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKFVJbnQ4KW47CisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoVUludDgpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTp2YXJpbnQ2NG91dCBvZmZzZXQ6MCBsZW5ndGg6aWR4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShVSW50MzIpIGkzMlRvWmlnWmFnOihTSW50MzIpbgoreworICAvKgorICAgICBaaWdaYWcgZW5jb2RpbmcgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQgaW50ZWdlcnMgc28gdGhhdAorICAgICBudW1iZXJzIHdpdGggYSBzbWFsbCBhYnNvbHV0ZSB2YWx1ZSAoZm9yIGluc3RhbmNlLCAtMSkgaGF2ZQorICAgICBhIHNtYWxsIHZhcmludCBlbmNvZGVkIHZhbHVlIHRvby4gSXQgZG9lcyB0aGlzIGluIGEgd2F5IHRoYXQKKyAgICAgInppZy16YWdzIiBiYWNrIGFuZCBmb3J0aCB0aHJvdWdoIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaW50ZWdlcnMsCisgICAgIHNvIHRoYXQgLTEgaXMgZW5jb2RlZCBhcyAxLCAxIGlzIGVuY29kZWQgYXMgMiwgLTIgaXMgZW5jb2RlZCBhcyAzLCBhbmQgc28KKyAgICAgICAgIG9uCisgICAqLworICByZXR1cm4gKFVJbnQzMikobiA8PCAxKSBeIChVSW50MzIpKG4gPj4gMzEpOworfQorCistKFVJbnQ2NCkgaTY0VG9aaWdaYWc6KFNJbnQ2NCluCit7CisgIHJldHVybiAoVUludDY0KShuIDw8IDEpIF4gKFVJbnQ2NCkobiA+PiA2Myk7Cit9CisKKy0oQk9PTCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKXBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilwdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyICopcHNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IHByb3RvY29sSWQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnByb3RvY29sSWQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHByb3RvY29sSWQgIT0gQ09NUEFDVF9QUk9UT0NPTF9JRCkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IEAoVFByb3RvY29sRXh0ZW5kZWRFcnJvck1pc21hdGNoZWRQcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvckV4cGVjdGVkSWRLZXk6IEAoQ09NUEFDVF9QUk9UT0NPTF9JRCl9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdmVyc2lvbkFuZFR5cGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnZlcnNpb25BbmRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHZlcnNpb24gPSB2ZXJzaW9uQW5kVHlwZSAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLOworICBpZiAodmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04pIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yQmFkVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFByb3RvY29sRXJyb3JFeHBlY3RlZFZlcnNpb25LZXk6IEAoQ09NUEFDVF9WRVJTSU9OKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBpbnQgdHlwZSA9ICh2ZXJzaW9uQW5kVHlwZSA+PiBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9CSVRTOworICBVSW50MzIgc2VxdWVuY2VJRDsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIE5TU3RyaW5nICpuYW1lOworICBpZiAoIVtzZWxmIHJlYWRTdHJpbmc6Jm5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHB0eXBlICE9IE5VTEwpIHsKKyAgICAqcHR5cGUgPSB0eXBlOworICB9CisgIGlmIChwc2VxdWVuY2VJRCAhPSBOVUxMKSB7CisgICAgKnBzZXF1ZW5jZUlEID0gc2VxdWVuY2VJRDsKKyAgfQorICBpZiAocG5hbWUgIT0gTlVMTCkgeworICAgICpwbmFtZSA9IG5hbWU7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKilwbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW19sYXN0RmllbGQgYWRkT2JqZWN0OkAoX2xhc3RGaWVsZElkKV07CisgIF9sYXN0RmllbGRJZCA9IDA7CisKKyAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAqcG5hbWUgPSBAIiI7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIF9sYXN0RmllbGRJZCA9IFtfbGFzdEZpZWxkLmxhc3RPYmplY3Qgc2hvcnRWYWx1ZV07CisgIFtfbGFzdEZpZWxkIHJlbW92ZUxhc3RPYmplY3RdOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopcG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilwZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyICopcGZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBieXRlOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHR5cGUgPSBieXRlICYgMHgwZjsKKworICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgIGlmICh0eXBlID09IFRDVHlwZV9TVE9QKSB7CisgICAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAgICpwbmFtZSA9IEAiIjsKKyAgICB9CisgICAgaWYgKHBmaWVsZFR5cGUgIT0gTlVMTCkgeworICAgICAgKnBmaWVsZFR5cGUgPSBUVHlwZVNUT1A7CisgICAgfQorICAgIGlmIChwZmllbGRJRCAhPSBOVUxMKSB7CisgICAgICAqcGZpZWxkSUQgPSAwOworICAgIH0KKyAgICByZXR1cm4gWUVTOworICB9CisKKyAgc2hvcnQgZmllbGRJZCA9IDA7CisKKyAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICBzaG9ydCBtb2RpZmllciA9IChieXRlICYgMHhmMCkgPj4gNDsKKyAgaWYgKG1vZGlmaWVyID09IDApIHsKKyAgICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgaWYgKCFbc2VsZiByZWFkSTE2OiZmaWVsZElkIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBoYXMgYSBkZWx0YS4gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorICAgIGZpZWxkSWQgPSBfbGFzdEZpZWxkSWQgKyBtb2RpZmllcjsKKyAgfQorCisgIFVJbnQ4IGZpZWxkVHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZTomZmllbGRUeXBlIGZvckNvbXBhY3RUeXBlOnR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAqcG5hbWUgPSBAIiI7CisgIH0KKyAgaWYgKHBmaWVsZFR5cGUgIT0gTlVMTCkgeworICAgICpwZmllbGRUeXBlID0gZmllbGRUeXBlOworICB9CisgIGlmIChwZmllbGRJRCAhPSBOVUxMKSB7CisgICAgKnBmaWVsZElEID0gZmllbGRJZDsKKyAgfQorCisgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisgIGlmICh0eXBlID09IFRDVHlwZV9CT09MRUFOX1RSVUUgfHwKKyAgICAgIHR5cGUgPT0gVENUeXBlX0JPT0xFQU5fRkFMU0UpCisgIHsKKyAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICBfYm9vbGVhblZhbHVlID0gW05TTnVtYmVyIG51bWJlcldpdGhCb29sOnR5cGUgPT0gVENUeXBlX0JPT0xFQU5fVFJVRV07CisgIH0KKworICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgX2xhc3RGaWVsZElkID0gZmllbGRJZDsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KFNJbnQzMiAqKXBrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMiAqKXB2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopcHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDgga2V5QW5kVmFsdWVUeXBlID0gMDsKKyAgVUludDMyIHNpemU7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZToma2V5QW5kVmFsdWVUeXBlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIFVJbnQ4IGtleVR5cGU7CisgIGlmICghW3NlbGYgdHR5cGU6JmtleVR5cGUgZm9yQ29tcGFjdFR5cGU6a2V5QW5kVmFsdWVUeXBlID4+IDQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdmFsdWVUeXBlOworICBpZiAoIVtzZWxmIHR0eXBlOiZ2YWx1ZVR5cGUgZm9yQ29tcGFjdFR5cGU6a2V5QW5kVmFsdWVUeXBlICYgMHhmIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChwa2V5VHlwZSAhPSBOVUxMKSB7CisgICAgKnBrZXlUeXBlID0ga2V5VHlwZTsKKyAgfQorICBpZiAocHZhbHVlVHlwZSAhPSBOVUxMKSB7CisgICAgKnB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisgIH0KKyAgaWYgKHBzaXplICE9IE5VTEwpIHsKKyAgICAqcHNpemUgPSBzaXplOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKXBlbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggc2l6ZUFuZFR5cGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnNpemVBbmRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQzMiBzaXplID0gKHNpemVBbmRUeXBlID4+IDQpICYgMHgwZjsKKyAgaWYgKHNpemUgPT0gMTUpIHsKKyAgICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBVSW50OCBlbGVtZW50VHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZTomZWxlbWVudFR5cGUgZm9yQ29tcGFjdFR5cGU6c2l6ZUFuZFR5cGUgJiAweDBmIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChwZWxlbWVudFR5cGUgIT0gTlVMTCkgeworICAgICpwZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgfQorICBpZiAocHNpemUgIT0gTlVMTCkgeworICAgICpwc2l6ZSA9IHNpemU7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKilwZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOnBlbGVtZW50VHlwZSBzaXplOnBzaXplIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoX2Jvb2xlYW5WYWx1ZSAhPSBuaWwpIHsKKworICAgIEJPT0wgcmVzdWx0ID0gX2Jvb2xlYW5WYWx1ZS5ib29sVmFsdWU7CisgICAgX2Jvb2xlYW5WYWx1ZSA9IG5pbDsKKworICAgICp2YWx1ZSA9IHJlc3VsdDsKKyAgfQorICBlbHNlIHsKKworICAgIFVJbnQ4IHJlc3VsdDsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZyZXN1bHQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgKnZhbHVlID0gcmVzdWx0ID09IFRDVHlwZV9CT09MRUFOX1RSVUU7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6dmFsdWUgb2Zmc2V0OjAgbGVuZ3RoOjEgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgdjsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gKFNJbnQxNilbc2VsZiB6aWdaYWdUb2kzMjp2XTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiB2OworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomdiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSBbc2VsZiB6aWdaYWdUb2kzMjp2XTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ2NCB2OworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQ2NDomdiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSBbc2VsZiB6aWdaYWdUb2k2NDp2XTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ2NCBiaXRzOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6KFVJbnQ4ICopJmJpdHMgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgIGJpdHMgPSBPU1N3YXBMaXR0bGVUb0hvc3RJbnQ2NChiaXRzKTsKKworICBpZiAodmFsdWUpIHsKKyAgICBtZW1jcHkodmFsdWUsICZiaXRzLCBzaXplb2YoYml0cykpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBsZW5ndGg7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgTlNTdHJpbmcgKnJlc3VsdDsKKworICBpZiAobGVuZ3RoICE9IDApIHsKKworICAgIE5TRGF0YSAqZGF0YTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCaW5hcnlPZkxlbmd0aDpsZW5ndGggZGF0YTomZGF0YSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICByZXN1bHQgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107CisgIH0KKyAgZWxzZSB7CisgICAgcmVzdWx0ID0gQCIiOworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkQmluYXJ5OihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgbGVuZ3RoOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjombGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBbc2VsZiByZWFkQmluYXJ5T2ZMZW5ndGg6bGVuZ3RoIGRhdGE6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCaW5hcnlPZkxlbmd0aDooVUludDMyKWxlbmd0aCBkYXRhOihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU0RhdGEgKnJlc3VsdDsKKworICBpZiAobGVuZ3RoICE9IDApIHsKKworICAgIE5TTXV0YWJsZURhdGEgKmJ1ZiA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOmxlbmd0aF07CisgICAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1Zi5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgICAgfQorCisgICAgcmVzdWx0ID0gYnVmOworICB9CisgIGVsc2UgeworCisgICAgcmVzdWx0ID0gW05TRGF0YSBkYXRhXTsKKworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkVmFyaW50MzI6KFVJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgcmVzdWx0ID0gMDsKKyAgaW50IHNoaWZ0ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworCisgICAgVUludDggYnl0ZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCB8PSAoVUludDMyKShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzaGlmdCArPSA3OworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkVmFyaW50NjQ6KFVJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpbnQgc2hpZnQgPSAwOworICBVSW50NjQgcmVzdWx0ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworCisgICAgVUludDggYnl0ZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCB8PSAoVUludDY0KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzaGlmdCArPSA3OworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShTSW50MzIpIHppZ1phZ1RvaTMyOihVSW50MzIpbgoreworICByZXR1cm4gKFNJbnQzMikobiA+PiAxKSBeICgtKFNJbnQzMikobiAmIDEpKTsKK30KKworLShTSW50NjQpIHppZ1phZ1RvaTY0OihVSW50NjQpbgoreworICByZXR1cm4gKFNJbnQ2NCkobiA+PiAxKSBeICgtKFNJbnQ2NCkobiAmIDEpKTsKK30KKworLShCT09MKSB0dHlwZTooVUludDggKil0dHlwZSBmb3JDb21wYWN0VHlwZTooVUludDgpY3R5cGUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHN3aXRjaCAoY3R5cGUgJiAweDBmKSB7CisgIGNhc2UgVENUeXBlX1NUT1A6CisgICAgKnR0eXBlID0gVFR5cGVTVE9QOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfQk9PTEVBTl9GQUxTRToKKyAgY2FzZSBUQ1R5cGVfQk9PTEVBTl9UUlVFOgorICAgICp0dHlwZSA9IFRUeXBlQk9PTDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0JZVEU6CisgICAgKnR0eXBlID0gVFR5cGVCWVRFOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfSTE2OgorICAgICp0dHlwZSA9IFRUeXBlSTE2OworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfSTMyOgorICAgICp0dHlwZSA9IFRUeXBlSTMyOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfSTY0OgorICAgICp0dHlwZSA9IFRUeXBlSTY0OworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfRE9VQkxFOgorICAgICp0dHlwZSA9IFRUeXBlRE9VQkxFOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfQklOQVJZOgorICAgICp0dHlwZSA9IFRUeXBlU1RSSU5HOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfTElTVDoKKyAgICAqdHR5cGUgPSBUVHlwZUxJU1Q7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9TRVQ6CisgICAgKnR0eXBlID0gVFR5cGVTRVQ7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9NQVA6CisgICAgKnR0eXBlID0gVFR5cGVNQVA7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9TVFJVQ1Q6CisgICAgKnR0eXBlID0gVFR5cGVTVFJVQ1Q7CisgICAgcmV0dXJuIFlFUzsKKworICBkZWZhdWx0OgorICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUUHJvdG9jb2xFcnJvclR5cGVLZXk6IEAoKFVJbnQ4KShjdHlwZSAmIDB4MEYpKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KK30KKworLShVSW50OCkgY29tcGFjdFR5cGVGb3JUVHlwZTooVUludDgpdHR5cGUKK3sKKyAgc3RhdGljIFVJbnQ4IHR0eXBlVG9Db21wYWN0VHlwZVtdID0geworICAgIFtUVHlwZVNUT1BdID0gVENUeXBlX1NUT1AsCisgICAgW1RUeXBlQk9PTF0gPSBUQ1R5cGVfQk9PTEVBTl9GQUxTRSwKKyAgICBbVFR5cGVCWVRFXSA9IFRDVHlwZV9CWVRFLAorICAgIFtUVHlwZURPVUJMRV0gPSBUQ1R5cGVfRE9VQkxFLAorICAgIFtUVHlwZUkxNl0gPSBUQ1R5cGVfSTE2LAorICAgIFtUVHlwZUkzMl0gPSBUQ1R5cGVfSTMyLAorICAgIFtUVHlwZUk2NF0gPSBUQ1R5cGVfSTY0LAorICAgIFtUVHlwZVNUUklOR10gPSBUQ1R5cGVfQklOQVJZLAorICAgIFtUVHlwZVNUUlVDVF0gPSBUQ1R5cGVfU1RSVUNULAorICAgIFtUVHlwZU1BUF0gPSBUQ1R5cGVfTUFQLAorICAgIFtUVHlwZVNFVF0gPSBUQ1R5cGVfU0VULAorICAgIFtUVHlwZUxJU1RdID0gVENUeXBlX0xJU1QKKyAgfTsKKworICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlW3R0eXBlXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Y2UzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2ltcG9ydCAiVFByb3RvY29sRGVjb3JhdG9yLmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworZXh0ZXJuIE5TU3RyaW5nICpUTXVsdGlwbGV4ZWRQcm90b2NvbFNlcGVyYXRvcjsKKworCitAaW50ZXJmYWNlIFRNdWx0aXBsZXhlZFByb3RvY29sIDogVFByb3RvY29sRGVjb3JhdG9yCisKKy0oaWQpIGluaXRXaXRoUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sCisgICAgICAgICAgIHNlcnZpY2VOYW1lOihOU1N0cmluZyAqKW5hbWU7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzOGM1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRNdWx0aXBsZXhlZFByb3RvY29sLmgiCisKKyNpbXBvcnQgIlRQcm90b2NvbC5oIgorCitOU1N0cmluZyAqVE11bHRpcGxleGVkUHJvdG9jb2xTZXBlcmF0b3IgPSBAIjoiOworCisKK0BpbnRlcmZhY2UgVE11bHRpcGxleGVkUHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqc2VydmljZU5hbWU7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVE11bHRpcGxleGVkUHJvdG9jb2wKKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKKyAgICAgICAgICAgc2VydmljZU5hbWU6KE5TU3RyaW5nICopbmFtZQoreworICBzZWxmID0gW3N1cGVyIGluaXRXaXRoUHJvdG9jb2w6cHJvdG9jb2xdOworICBpZiAoc2VsZikgeworICAgIF9zZXJ2aWNlTmFtZSA9IG5hbWU7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7CisgIGNhc2UgVE1lc3NhZ2VUeXBlQ0FMTDoKKyAgY2FzZSBUTWVzc2FnZVR5cGVPTkVXQVk6IHsKKyAgICBOU011dGFibGVTdHJpbmcgKnNlcnZpY2VGdW5jdGlvbiA9IFtbTlNNdXRhYmxlU3RyaW5nIGFsbG9jXSBpbml0V2l0aFN0cmluZzpfc2VydmljZU5hbWVdOworICAgIFtzZXJ2aWNlRnVuY3Rpb24gYXBwZW5kU3RyaW5nOlRNdWx0aXBsZXhlZFByb3RvY29sU2VwZXJhdG9yXTsKKyAgICBbc2VydmljZUZ1bmN0aW9uIGFwcGVuZFN0cmluZzpuYW1lXTsKKyAgICByZXR1cm4gW3N1cGVyIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6c2VydmljZUZ1bmN0aW9uIHR5cGU6bWVzc2FnZVR5cGUgc2VxdWVuY2VJRDpzZXF1ZW5jZUlEIGVycm9yOmVycm9yXTsKKyAgfQorICBicmVhazsKKworICBkZWZhdWx0OgorICAgIHJldHVybiBbc3VwZXIgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpuYW1lIHR5cGU6bWVzc2FnZVR5cGUgc2VxdWVuY2VJRDpzZXF1ZW5jZUlEIGVycm9yOmVycm9yXTsKKyAgfQorfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaAppbmRleCAyODEyMzlkLi44NDEwNTlmIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKQEAgLTIyLDEyNyArMjIsMTQzIEBACiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKIAotZW51bSB7Ci0gIFRNZXNzYWdlVHlwZV9DQUxMID0gMSwKLSAgVE1lc3NhZ2VUeXBlX1JFUExZID0gMiwKLSAgVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTiA9IDMsCi0gIFRNZXNzYWdlVHlwZV9PTkVXQVkgPSA0CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUTWVzc2FnZVR5cGUpIHsKKyAgVE1lc3NhZ2VUeXBlQ0FMTCA9IDEsCisgIFRNZXNzYWdlVHlwZVJFUExZID0gMiwKKyAgVE1lc3NhZ2VUeXBlRVhDRVBUSU9OID0gMywKKyAgVE1lc3NhZ2VUeXBlT05FV0FZID0gNAogfTsKIAotZW51bSB7Ci0gIFRUeXBlX1NUT1AgICA9IDAsCi0gIFRUeXBlX1ZPSUQgICA9IDEsCi0gIFRUeXBlX0JPT0wgICA9IDIsCi0gIFRUeXBlX0JZVEUgICA9IDMsCi0gIFRUeXBlX0RPVUJMRSA9IDQsCi0gIFRUeXBlX0kxNiAgICA9IDYsCi0gIFRUeXBlX0kzMiAgICA9IDgsCi0gIFRUeXBlX0k2NCAgICA9IDEwLAotICBUVHlwZV9TVFJJTkcgPSAxMSwKLSAgVFR5cGVfU1RSVUNUID0gMTIsCi0gIFRUeXBlX01BUCAgICA9IDEzLAotICBUVHlwZV9TRVQgICAgPSAxNCwKLSAgVFR5cGVfTElTVCAgID0gMTUKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUVHlwZSkgeworICBUVHlwZVNUT1AgICA9IDAsCisgIFRUeXBlVk9JRCAgID0gMSwKKyAgVFR5cGVCT09MICAgPSAyLAorICBUVHlwZUJZVEUgICA9IDMsCisgIFRUeXBlRE9VQkxFID0gNCwKKyAgVFR5cGVJMTYgICAgPSA2LAorICBUVHlwZUkzMiAgICA9IDgsCisgIFRUeXBlSTY0ICAgID0gMTAsCisgIFRUeXBlU1RSSU5HID0gMTEsCisgIFRUeXBlU1RSVUNUID0gMTIsCisgIFRUeXBlTUFQICAgID0gMTMsCisgIFRUeXBlU0VUICAgID0gMTQsCisgIFRUeXBlTElTVCAgID0gMTUKIH07CiAKIAogQHByb3RvY29sIFRQcm90b2NvbCA8TlNPYmplY3Q+CiAKLS0gKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQgKikgc2VxdWVuY2VJRDsKLS0gKHZvaWQpIHJlYWRNZXNzYWdlRW5kOworLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KG51bGxhYmxlIFNJbnQzMiAqKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZTsKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RFbmQ7CistKEJPT0wpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX251bGxhYmxlIF9fYXV0b3JlbGVhc2luZyAqX19udWxsYWJsZSluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCAqKSBmaWVsZElEOwotLSAodm9pZCkgcmVhZEZpZWxkRW5kOworLShCT09MKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX251bGxhYmxlIF9fYXV0b3JlbGVhc2luZyAqX19udWxsYWJsZSluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDoobnVsbGFibGUgU0ludDMyICopZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nOworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19ub25udWxsIF9fYXV0b3JlbGVhc2luZyAqX19ub25udWxsKXZhbHVlIGVycm9yOihOU0Vycm9yICoqKWVycm9yOwogCi0tIChCT09MKSByZWFkQm9vbDsKKy0oQk9PTCkgcmVhZEJvb2w6KEJPT0wgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHVuc2lnbmVkIGNoYXIpIHJlYWRCeXRlOworLShCT09MKSByZWFkQnl0ZTooVUludDggKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHNob3J0KSByZWFkSTE2OworLShCT09MKSByZWFkSTE2OihTSW50MTYgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKGludDMyX3QpIHJlYWRJMzI7CistKEJPT0wpIHJlYWRJMzI6KFNJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoaW50NjRfdCkgcmVhZEk2NDsKKy0oQk9PTCkgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChkb3VibGUpIHJlYWREb3VibGU7CistKEJPT0wpIHJlYWREb3VibGU6KGRvdWJsZSAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoTlNEYXRhICopIHJlYWRCaW5hcnk7CistKEJPT0wpIHJlYWRCaW5hcnk6KE5TRGF0YSAqX19ub25udWxsIF9fYXV0b3JlbGVhc2luZyAqX19ub25udWxsKXZhbHVlIGVycm9yOihOU0Vycm9yICoqKWVycm9yOwogCi0tICh2b2lkKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAoaW50ICopIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemU7Ci0tICh2b2lkKSByZWFkTWFwRW5kOworLShCT09MKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOihudWxsYWJsZSBTSW50MzIgKilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAogCi0tICh2b2lkKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRTZXRFbmQ7CistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihudWxsYWJsZSBTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemU7Ci0tICh2b2lkKSByZWFkTGlzdEVuZDsKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihudWxsYWJsZSBTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZExpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBtZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCkgc2VxdWVuY2VJRDsKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUVuZDsKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgd3JpdGVNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZTsKLS0gKHZvaWQpIHdyaXRlU3RydWN0RW5kOworLShCT09MKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50KSBmaWVsZElEOworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlSTMyOiAoaW50MzJfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlSTMyOihTSW50MzIpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUk2NDogKGludDY0X3QpIHZhbHVlOworLShCT09MKSB3cml0ZUk2NDooU0ludDY0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVJMTY6IChzaG9ydCkgdmFsdWU7CistKEJPT0wpIHdyaXRlSTE2OihzaG9ydCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlQnl0ZTogKHVpbnQ4X3QpIHZhbHVlOworLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVTdHJpbmc6IChOU1N0cmluZyAqKSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVTdHJpbmc6KE5TU3RyaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZURvdWJsZTogKGRvdWJsZSkgdmFsdWU7CistKEJPT0wpIHdyaXRlRG91YmxlOihkb3VibGUpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUJvb2w6IChCT09MKSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVCaW5hcnk6IChOU0RhdGEgKikgZGF0YTsKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUZpZWxkU3RvcDsKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUZpZWxkRW5kOworLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOiAoaW50KSBrZXlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQpIHZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplOwotLSAodm9pZCkgd3JpdGVNYXBFbmQ7CistKEJPT0wpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTooU0ludDMyKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIpdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgd3JpdGVNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplOwotLSAodm9pZCkgd3JpdGVTZXRFbmQ7CistKEJPT0wpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7CistKEJPT0wpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVMaXN0RW5kOworLShCT09MKSB3cml0ZUxpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKIEBlbmQKIAorCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OWI2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpbXBvcnQgIlRQcm90b2NvbC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVFByb3RvY29sRGVjb3JhdG9yIDogTlNPYmplY3QgPFRQcm90b2NvbD4KKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMThmOTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IubQpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2xEZWNvcmF0b3IuaCIKKworCitAaW50ZXJmYWNlIFRQcm90b2NvbERlY29yYXRvciAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm90b2NvbD4gY29uY3JldGVQcm90b2NvbDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IKKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfY29uY3JldGVQcm90b2NvbCA9IHByb3RvY29sOworICB9CisgIHJldHVybiBzZWxmOworfQorCistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Cit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgdHJhbnNwb3J0XTsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOm5hbWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cnVjdEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyICopZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorLShCT09MKSByZWFkRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEZpZWxkRW5kOmVycm9yXTsKK30KKworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cmluZzp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEJvb2w6KEJPT0wgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkQm9vbDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEJ5dGU6KFVJbnQ4ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEJ5dGU6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRJMTY6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRJMzI6KFNJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRJMzI6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRJNjQ6KFNJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRJNjQ6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWREb3VibGU6KGRvdWJsZSAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWREb3VibGU6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCaW5hcnk6KE5TRGF0YSAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEJpbmFyeTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTooU0ludDMyICopa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIgKil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6a2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6dmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZE1hcEVuZDplcnJvcl07Cit9CisKKworLShCT09MKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorLShCT09MKSByZWFkU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRTZXRFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHJlYWRMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRMaXN0RW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTptZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6bmFtZSBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHdyaXRlU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU3RydWN0RW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlSTMyOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUk2NDooU0ludDY0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlSTY0OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUkxNjooU0ludDE2KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlSTE2OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlQnl0ZTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTdHJpbmc6KE5TU3RyaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJpbmc6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlRG91YmxlOihkb3VibGUpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVEb3VibGU6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQm9vbDooQk9PTCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUJvb2w6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQmluYXJ5OihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlQmluYXJ5OmRhdGEgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlRmllbGRTdG9wOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlRmllbGRTdG9wOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlRmllbGRFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTooU0ludDMyKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIpdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTprZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOnZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZU1hcEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU2V0RW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUxpc3RFbmQ6ZXJyb3JdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwYmM0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRFcnJvci5oIgorCisKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JEb21haW47CisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUUHJvdG9jb2xFcnJvcikgeworICBUUHJvdG9jb2xFcnJvclVua25vd24gICAgICAgICAgICAgICAgICAgPSAwLAorICBUUHJvdG9jb2xFcnJvckludmFsaWREYXRhICAgICAgICAgICAgICAgPSAxLAorICBUUHJvdG9jb2xFcnJvck5lZ2F0aXZlU2l6ZSAgICAgICAgICAgICAgPSAyLAorICBUUHJvdG9jb2xFcnJvclNpemVMaW1pdCAgICAgICAgICAgICAgICAgPSAzLAorICBUUHJvdG9jb2xFcnJvckJhZFZlcnNpb24gICAgICAgICAgICAgICAgPSA0LAorICBUUHJvdG9jb2xFcnJvck5vdEltcGxlbWVudGVkICAgICAgICAgICAgPSA1LAorICBUUHJvdG9jb2xFcnJvckRlcHRoTGltaXQgICAgICAgICAgICAgICAgPSA2LAorfTsKKworCit0eXBlZGVmIE5TX0VOVU0oaW50LCBUUHJvdG9jb2xFeHRlbmRlZEVycm9yKSB7CisgIFRQcm90b2NvbEV4dGVuZGVkRXJyb3JNaXNzaW5nUmVxdWlyZWRGaWVsZCAgPSAxMDAxLAorICBUUHJvdG9jb2xFeHRlbmRlZEVycm9yVW5leHBlY3RlZFR5cGUgICAgICAgID0gMTAwMiwKKyAgVFByb3RvY29sRXh0ZW5kZWRFcnJvck1pc21hdGNoZWRQcm90b2NvbCAgICA9IDEwMDMsCit9OworCitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRJZEtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHBlY3RlZFZlcnNpb25LZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yVHlwZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VMaW5lS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZUZpbGVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlTWV0aG9kS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvck1lc3NhZ2VOYW1lS2V5OworCisKKyNkZWZpbmUgUFJPVE9DT0xfRVJST1IocmV0LCBlcnIsIC4uLikgXAorICBpZiAoZXJyb3IpIHsgIFwKKyAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvciAjIyBlcnIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe05TTG9jYWxpemVkRGVzY3JpcHRpb25LZXk6IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0Ol9fVkFfQVJHU19fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiU291cmNlRmlsZSI6IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpfX0ZJTEVfX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlNvdXJjZUxpbmUiOiBAKF9fTElORV9fKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiU291cmNlRnVuY3Rpb24iOiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6X19QUkVUVFlfRlVOQ1RJT05fX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIk1lc3NhZ2UiOiBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA/IHNlbGYuY3VycmVudE1lc3NhZ2VOYW1lIDogQCIifV07IFwKKyAgfSBcCisgIHJldHVybiByZXQKKworI2RlZmluZSBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IocmV0LCBlcnJvclB0ciwgLi4uKSBcCisgIGlmIChlcnJvclB0cikgeyBcCisgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JVbmtub3duIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtOU0xvY2FsaXplZERlc2NyaXB0aW9uS2V5OiBbW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6X19WQV9BUkdTX19dIHN0cmluZ0J5QXBwZW5kaW5nRm9ybWF0OkAiOiAlQCIsIFsoKmVycm9yUHRyKSBsb2NhbGl6ZWREZXNjcmlwdGlvbl1dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JTb3VyY2VGaWxlS2V5OiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6X19GSUxFX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JTb3VyY2VMaW5lS2V5OiBAKF9fTElORV9fKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yU291cmNlTWV0aG9kS2V5OiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6X19QUkVUVFlfRlVOQ1RJT05fX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvck1lc3NhZ2VOYW1lS2V5OiBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA/IHNlbGYuY3VycmVudE1lc3NhZ2VOYW1lIDogQCIiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNVbmRlcmx5aW5nRXJyb3JLZXk6ICplcnJvclB0cn1dOyBcCisgIH0gXAorICByZXR1cm4gcmV0CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzNjczYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IubQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRQcm90b2NvbEVycm9yLmgiCisKKworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRG9tYWluID0gQCJUUHJvdG9jb2xFcnJvckRvbWFpbiI7CisKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXkgPSBAImV4dGVuZGVkRXJyb3IiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRmllbGROYW1lS2V5ID0gQCJmaWVsZCI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHBlY3RlZElkS2V5ID0gQCJleHBlY3RlZElkIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4cGVjdGVkVmVyc2lvbktleSA9IEAiZXhwZWN0ZWRWZXJzaW9uIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvclR5cGVLZXkgPSBAInR5cGUiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlTGluZUtleSA9IEAic291cmNlTGluZSI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VGaWxlS2V5ID0gQCJzb3VyY2VGaWxlIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZU1ldGhvZEtleSA9IEAic291cmNlTWV0aG9kIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvck1lc3NhZ2VOYW1lS2V5ID0gQCJtZXNzYWdlTmFtZSI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNTRmYy4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0KLUBpbnRlcmZhY2UgVFByb3RvY29sRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODE0ODdhLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRQcm90b2NvbEV4Y2VwdGlvbi5oIgotCi1AaW1wbGVtZW50YXRpb24gVFByb3RvY29sRXhjZXB0aW9uCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oCmluZGV4IGYyMDBhNmQuLmEwMjJhN2YgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oCkBAIC0yMSw5ICsyMSwxNiBAQAogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKIAogQHByb3RvY29sIFRQcm90b2NvbEZhY3RvcnkgPE5TT2JqZWN0PgogCi0tIChpZCA8VFByb3RvY29sPikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworQHByb3BlcnR5IChyZWFkb25seSwgbm9uYXRvbWljKSBOU1N0cmluZyAqcHJvdG9jb2xOYW1lOworCistKGlkPFRQcm90b2NvbD4pIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaAppbmRleCBjMmQyNTIxLi44MjUxMGNmIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaApAQCAtMjAsMTAgKzIwLDE0IEBACiAjaW1wb3J0ICJUUHJvdG9jb2wuaCIKICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUUHJvdG9jb2xVdGlsIDogTlNPYmplY3QgeworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KIAotfQogCi0rICh2b2lkKSBza2lwVHlwZTogKGludCkgdHlwZSBvblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOworQGludGVyZmFjZSBUUHJvdG9jb2xVdGlsIDogTlNPYmplY3QKKworKyhCT09MKSBza2lwVHlwZTooaW50KXR5cGUgb25Qcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKIEBlbmQ7CisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubQppbmRleCAxM2Q3MDk1Li5jMGQ2NWFjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubQorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubQpAQCAtMjEsODQgKzIxLDE1MSBAQAogCiBAaW1wbGVtZW50YXRpb24gVFByb3RvY29sVXRpbAogCi0rICh2b2lkKSBza2lwVHlwZTogKGludCkgdHlwZSBvblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCisrKEJPT0wpIHNraXBUeXBlOihpbnQpdHlwZSBvblByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcgogewogICBzd2l0Y2ggKHR5cGUpIHsKLSAgY2FzZSBUVHlwZV9CT09MOgotICAgIFtwcm90b2NvbCByZWFkQm9vbF07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfQllURToKLSAgICBbcHJvdG9jb2wgcmVhZEJ5dGVdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0kxNjoKLSAgICBbcHJvdG9jb2wgcmVhZEkxNl07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfSTMyOgotICAgIFtwcm90b2NvbCByZWFkSTMyXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9JNjQ6Ci0gICAgW3Byb3RvY29sIHJlYWRJNjRdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0RPVUJMRToKLSAgICBbcHJvdG9jb2wgcmVhZERvdWJsZV07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfU1RSSU5HOgotICAgIFtwcm90b2NvbCByZWFkU3RyaW5nXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9TVFJVQ1Q6Ci0gICAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOworICBjYXNlIFRUeXBlQk9PTDogeworICAgIEJPT0wgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRCb29sOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVCWVRFOiB7CisgICAgVUludDggdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRCeXRlOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVJMTY6IHsKKyAgICBTSW50MTYgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRJMTY6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUkzMjogeworICAgIFNJbnQzMiB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEkzMjomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlSTY0OiB7CisgICAgU0ludDY0IHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkSTY0OiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVET1VCTEU6IHsKKyAgICBkb3VibGUgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWREb3VibGU6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZVNUUklORzogeworICAgIE5TU3RyaW5nICp2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cmluZzomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlU1RSVUNUOiB7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTpOVUxMIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgaW50IGZpZWxkVHlwZTsKLSAgICAgIFtwcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IG5pbCB0eXBlOiAmZmllbGRUeXBlIGZpZWxkSUQ6IG5pbF07Ci0gICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUT1ApIHsKKyAgICAgIFNJbnQzMiBmaWVsZFR5cGU7CisgICAgICBpZiAoIVtwcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6bmlsIHR5cGU6JmZpZWxkVHlwZSBmaWVsZElEOm5pbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQorICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUT1ApIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIFtwcm90b2NvbCByZWFkRmllbGRFbmRdOworICAgICAgaWYgKCFbc2VsZiBza2lwVHlwZTpmaWVsZFR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQorICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkRW5kOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CiAgICAgfQotICAgIFtwcm90b2NvbCByZWFkU3RydWN0RW5kXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9NQVA6Ci0gIHsKLSAgICBpbnQga2V5VHlwZTsKLSAgICBpbnQgdmFsdWVUeXBlOwotICAgIGludCBzaXplOwotICAgIFtwcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAma2V5VHlwZSB2YWx1ZVR5cGU6ICZ2YWx1ZVR5cGUgc2l6ZTogJnNpemVdOworICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVNQVA6IHsKKyAgICBTSW50MzIga2V5VHlwZTsKKyAgICBTSW50MzIgdmFsdWVUeXBlOworICAgIFNJbnQzMiBzaXplOworICAgIGlmICghW3Byb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6JmtleVR5cGUgdmFsdWVUeXBlOiZ2YWx1ZVR5cGUgc2l6ZTomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGtleVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IHZhbHVlVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgfQotICAgIFtwcm90b2NvbCByZWFkTWFwRW5kXTsKLSAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgVFR5cGVfU0VUOgotICAgIHsKLSAgICAgIGludCBlbGVtVHlwZTsKLSAgICAgIGludCBzaXplOwotICAgICAgW3Byb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAmZWxlbVR5cGUgc2l6ZTogJnNpemVdOwotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBlbGVtVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmtleVR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POwogICAgICAgfQotICAgICAgW3Byb3RvY29sIHJlYWRTZXRFbmRdOwotICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFR5cGVfTElTVDoKLSAgICB7Ci0gICAgICBpbnQgZWxlbVR5cGU7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIFtwcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ICZlbGVtVHlwZSBzaXplOiAmc2l6ZV07Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGVsZW1UeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6dmFsdWVUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKICAgICAgIH0KLSAgICAgIFtwcm90b2NvbCByZWFkTGlzdEVuZF07CiAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkTWFwRW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlU0VUOiB7CisgICAgU0ludDMyIGVsZW1UeXBlOworICAgIFNJbnQzMiBzaXplOworICAgIGlmICghW3Byb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiZlbGVtVHlwZSBzaXplOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmVsZW1UeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFNldEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUxJU1Q6IHsKKyAgICBTSW50MzIgZWxlbVR5cGU7CisgICAgU0ludDMyIHNpemU7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiZlbGVtVHlwZSBzaXplOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmVsZW1UeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZExpc3RFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIH0KKworICByZXR1cm4gWUVTOwogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmggYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmgKaW5kZXggMGQ2NjQwNC4uOTViMGQzYyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaApAQCAtMjcsMjQgKzI3LDI1IEBACiAjaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CiAjZW5kaWYKIAotZXh0ZXJuIE5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uOwotZXh0ZXJuIE5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yS2V5OwotZXh0ZXJuIE5TU3RyaW5nICogY29uc3Qga1RTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0S2V5OworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KIAogCi1AaW50ZXJmYWNlIFRTb2NrZXRTZXJ2ZXIgOiBOU09iamVjdCB7Ci0gIE5TU29ja2V0UG9ydCAqIG1TZXJ2ZXJTb2NrZXQ7Ci0gIE5TRmlsZUhhbmRsZSAqIG1Tb2NrZXRGaWxlSGFuZGxlOwotICBpZCA8VFByb3RvY29sRmFjdG9yeT4gbUlucHV0UHJvdG9jb2xGYWN0b3J5OwotICBpZCA8VFByb3RvY29sRmFjdG9yeT4gbU91dHB1dFByb3RvY29sRmFjdG9yeTsKLSAgaWQgPFRQcm9jZXNzb3JGYWN0b3J5PiBtUHJvY2Vzc29yRmFjdG9yeTsKLX0KK2V4dGVybiBOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZDsKK2V4dGVybiBOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlclByb2Nlc3NvcktleTsKK2V4dGVybiBOU1N0cmluZyAqY29uc3QgVFNvY2tlclNlcnZlclRyYW5zcG9ydEtleTsKIAotLSAoaWQpIGluaXRXaXRoUG9ydDogKGludCkgcG9ydAotICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5Ci0gICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeTsKKworQGludGVyZmFjZSBUU29ja2V0U2VydmVyIDogTlNPYmplY3QKKworLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoUG9ydDooaW50KXBvcnQKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3Rvcnk6KGlkIDxUUHJvdG9jb2xGYWN0b3J5Pilwcm90b2NvbEZhY3RvcnkKKyAgICAgICAgICAgIHByb2Nlc3NvckZhY3Rvcnk6KGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pcHJvY2Vzc29yRmFjdG9yeTsKKworLSAoaW5zdGFuY2V0eXBlKSBpbml0V2l0aFBhdGg6IChOU1N0cmluZyAqKSBwYXRoCisgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5CisgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3Rvcnk7CiAKIEBlbmQKIAogCi0KK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tCmluZGV4IDIzYjNkMTAuLjA5YjYwM2MgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubQorKysgYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0KQEAgLTIxLDM1ICsyMSw5MiBAQAogI2ltcG9ydCAiVFNvY2tldFNlcnZlci5oIgogI2ltcG9ydCAiVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oIgogI2ltcG9ydCAiVFByb3RvY29sLmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKwogI2ltcG9ydCA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KIAogCitOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCA9IEAiVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCI7CitOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlclByb2Nlc3NvcktleSA9IEAiVFNvY2tldFNlcnZlclByb2Nlc3NvciI7CitOU1N0cmluZyAqY29uc3QgVFNvY2tlclNlcnZlclRyYW5zcG9ydEtleSA9IEAiVFNvY2tlclNlcnZlclRyYW5zcG9ydCI7CiAKLU5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uID0gQCJUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbiI7Ci1OU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleSA9IEAiVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3IiOwotTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXkgPSBAIlRTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0IjsKKworQGludGVyZmFjZSBUU29ja2V0U2VydmVyICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3Rvcnk7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TRmlsZUhhbmRsZSAqc29ja2V0RmlsZUhhbmRsZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgZGlzcGF0Y2hfcXVldWVfdCBwcm9jZXNzaW5nUXVldWU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpkb21haW5Tb2NrZXRQYXRoOworCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFRTb2NrZXRTZXJ2ZXIKIAotLSAoaWQpIGluaXRXaXRoUG9ydDogKGludCkgcG9ydAotICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5Ci0gICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeTsKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aFNvY2tldDooQ0ZTb2NrZXRSZWYpc29ja2V0CisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5OihpZCA8VFByb3RvY29sRmFjdG9yeT4pcHJvdG9jb2xGYWN0b3J5CisgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5OihpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KXByb2Nlc3NvckZhY3Rvcnk7CiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CiAKLSAgbUlucHV0UHJvdG9jb2xGYWN0b3J5ID0gW3Byb3RvY29sRmFjdG9yeSByZXRhaW5dOwotICBtT3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gW3Byb3RvY29sRmFjdG9yeSByZXRhaW5dOwotICBtUHJvY2Vzc29yRmFjdG9yeSA9IFtwcm9jZXNzb3JGYWN0b3J5IHJldGFpbl07CisgIF9pbnB1dFByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsKKyAgX291dHB1dFByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsKKyAgX3Byb2Nlc3NvckZhY3RvcnkgPSBwcm9jZXNzb3JGYWN0b3J5OworCisgIGRpc3BhdGNoX3F1ZXVlX2F0dHJfdCBwcm9jZXNzaW5nUXVldWVBdHRyID0KKyAgICBkaXNwYXRjaF9xdWV1ZV9hdHRyX21ha2Vfd2l0aF9xb3NfY2xhc3MoRElTUEFUQ0hfUVVFVUVfQ09OQ1VSUkVOVCwgUU9TX0NMQVNTX0JBQ0tHUk9VTkQsIDApOworCisgIF9wcm9jZXNzaW5nUXVldWUgPSBkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoIlRTb2NrZXRTZXJ2ZXIucHJvY2Vzc2luZyIsIHByb2Nlc3NpbmdRdWV1ZUF0dHIpOwogCiAgIC8vIGNyZWF0ZSBhIHNvY2tldC4KLSAgaW50IGZkID0gLTE7CisgIGludCBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CisKKyAgLy8gd3JhcCBpdCBpbiBhIGZpbGUgaGFuZGxlIHNvIHdlIGNhbiBnZXQgbWVzc2FnZXMgZnJvbSBpdAorICBfc29ja2V0RmlsZUhhbmRsZSA9IFtbTlNGaWxlSGFuZGxlIGFsbG9jXSBpbml0V2l0aEZpbGVEZXNjcmlwdG9yOmZkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPbkRlYWxsb2M6WUVTXTsKKworICAvLyB0aHJvdyBhd2F5IG91ciBzb2NrZXQKKyAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CisgIENGUmVsZWFzZShzb2NrZXQpOworCisgIC8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIG9mIGFjY2VwdGVkIGluY29taW5nIGNvbm5lY3Rpb25zCisgIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6c2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOkBzZWxlY3Rvcihjb25uZWN0aW9uQWNjZXB0ZWQ6KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOk5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZE5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ol9zb2NrZXRGaWxlSGFuZGxlXTsKKworICAvLyB0ZWxsIHNvY2tldCB0byBsaXN0ZW4KKyAgW19zb2NrZXRGaWxlSGFuZGxlIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOworCisgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhQb3J0OiAoaW50KSBwb3J0CisgICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKKyAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5Cit7CisgIENGU29ja2V0UmVmIHNvY2tldCA9IFtbc2VsZiBjbGFzc10gY3JlYXRlU29ja2V0V2l0aFBvcnQ6cG9ydF07CisgIGlmIChzb2NrZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBuaWw7CisgIH0KKworICBpZiAoc2VsZiA9IFtzZWxmIGluaXRXaXRoU29ja2V0OnNvY2tldCBwcm90b2NvbEZhY3Rvcnk6cHJvdG9jb2xGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk6cHJvY2Vzc29yRmFjdG9yeV0pIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IExpc3RlbmluZyBvbiBUQ1AgcG9ydCAlZCIsIHBvcnQpOworICB9CisgIHJldHVybiBzZWxmOworfQorCisKKysoQ0ZTb2NrZXRSZWYpIGNyZWF0ZVNvY2tldFdpdGhQb3J0OihpbnQpcG9ydAorewogICBDRlNvY2tldFJlZiBzb2NrZXQgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIDAsIE5VTEwsIE5VTEwpOwogICBpZiAoc29ja2V0KSB7CiAgICAgQ0ZTb2NrZXRTZXRTb2NrZXRGbGFncyhzb2NrZXQsIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29ja2V0KSAmIH5rQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZSk7Ci0gICAgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOworICAgIGludCBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CiAgICAgaW50IHllcyA9IDE7CiAgICAgc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAodm9pZCAqKSZ5ZXMsIHNpemVvZih5ZXMpKTsKIApAQCAtNjAsMTAxICsxMTcsMTIzIEBACiAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwogICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CiAgICAgTlNEYXRhICphZGRyZXNzID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOiZhZGRyIGxlbmd0aDpzaXplb2YoYWRkcildOwotICAgIGlmIChDRlNvY2tldFNldEFkZHJlc3Moc29ja2V0LCAoQ0ZEYXRhUmVmKWFkZHJlc3MpICE9IGtDRlNvY2tldFN1Y2Nlc3MpIHsKKyAgICBpZiAoQ0ZTb2NrZXRTZXRBZGRyZXNzKHNvY2tldCwgKF9fYnJpZGdlIENGRGF0YVJlZilhZGRyZXNzKSAhPSBrQ0ZTb2NrZXRTdWNjZXNzKSB7CiAgICAgICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKICAgICAgIENGUmVsZWFzZShzb2NrZXQpOwotICAgICAgTlNMb2coQCIqKiogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpOwotICAgICAgcmV0dXJuIG5pbDsKKyAgICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpOworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICB9IGVsc2UgewotICAgIE5TTG9nKEAiKioqIE5vIHNlcnZlciBzb2NrZXQiKTsKKworICAgIHJldHVybiBzb2NrZXQ7CisgIH0KKyAgZWxzZSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBObyBzZXJ2ZXIgc29ja2V0Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLSAoaWQpIGluaXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKKyAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3RvcnkKK3sKKyAgX2RvbWFpblNvY2tldFBhdGggPSBwYXRoOworICBDRlNvY2tldFJlZiBzb2NrZXQgPSBbW3NlbGYgY2xhc3NdIGNyZWF0ZVNvY2tldFdpdGhQYXRoOnBhdGhdOworICBpZiAoc29ja2V0ID09IE5VTEwpIHsKICAgICByZXR1cm4gbmlsOwogICB9Ci0gIAotICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0Ci0gIG1Tb2NrZXRGaWxlSGFuZGxlID0gW1tOU0ZpbGVIYW5kbGUgYWxsb2NdIGluaXRXaXRoRmlsZURlc2NyaXB0b3I6IGZkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPbkRlYWxsb2M6IFlFU107Ci0gIAotICAvLyB0aHJvdyBhd2F5IG91ciBzb2NrZXQKLSAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7Ci0gIENGUmVsZWFzZShzb2NrZXQpOwotICAKLSAgICAvLyByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyBvZiBhY2NlcHRlZCBpbmNvbWluZyBjb25uZWN0aW9ucwotICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIGFkZE9ic2VydmVyOiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IEBzZWxlY3Rvcihjb25uZWN0aW9uQWNjZXB0ZWQ6KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBOU0ZpbGVIYW5kbGVDb25uZWN0aW9uQWNjZXB0ZWROb3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogbVNvY2tldEZpbGVIYW5kbGVdOwotICAKLSAgLy8gdGVsbCBzb2NrZXQgdG8gbGlzdGVuCi0gIFttU29ja2V0RmlsZUhhbmRsZSBhY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5XTsKLSAgCi0gIE5TTG9nKEAiTGlzdGVuaW5nIG9uIFRDUCBwb3J0ICVkIiwgcG9ydCk7Ci0gIAorCisgIGlmIChzZWxmID0gW3NlbGYgaW5pdFdpdGhTb2NrZXQ6c29ja2V0IHByb3RvY29sRmFjdG9yeTpwcm90b2NvbEZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTpwcm9jZXNzb3JGYWN0b3J5XSkgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTGlzdGVuaW5nIG9uIHBhdGggJUAiLCBwYXRoKTsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAotCi0tICh2b2lkKSBkZWFsbG9jIHsKLSAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSByZW1vdmVPYmplY3Q6IHNlbGZdOwotICBbbUlucHV0UHJvdG9jb2xGYWN0b3J5IHJlbGVhc2VdOwotICBbbU91dHB1dFByb3RvY29sRmFjdG9yeSByZWxlYXNlXTsKLSAgW21Qcm9jZXNzb3JGYWN0b3J5IHJlbGVhc2VdOwotICBbbVNvY2tldEZpbGVIYW5kbGUgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotCi0tICh2b2lkKSBjb25uZWN0aW9uQWNjZXB0ZWQ6IChOU05vdGlmaWNhdGlvbiAqKSBhTm90aWZpY2F0aW9uCisrIChDRlNvY2tldFJlZikgY3JlYXRlU29ja2V0V2l0aFBhdGg6IChOU1N0cmluZyAqKSBwYXRoCiB7Ci0gIE5TRmlsZUhhbmRsZSAqIHNvY2tldCA9IFtbYU5vdGlmaWNhdGlvbiB1c2VySW5mb10gb2JqZWN0Rm9yS2V5OiBOU0ZpbGVIYW5kbGVOb3RpZmljYXRpb25GaWxlSGFuZGxlSXRlbV07CisgIENGU29ja2V0UmVmIHNvY2tldCA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCwgMCwgTlVMTCwgTlVMTCk7CisgIGlmIChzb2NrZXQpIHsKKyAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2tldCwgIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29ja2V0KSAmIH5rQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZSk7CisgICAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKKyAgICBpbnQgeWVzID0gMTsKKyAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkICopJnllcywgc2l6ZW9mKHllcykpOwogCi0gIC8vIG5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnQgY29ubmVjdGVkLCBzcGluIG9mZiBhIHRocmVhZCB0byBoYW5kbGUgYWN0aXZpdHkKLSAgW05TVGhyZWFkIGRldGFjaE5ld1RocmVhZFNlbGVjdG9yOiBAc2VsZWN0b3IoaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b1RhcmdldDogc2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhPYmplY3Q6IHNvY2tldF07CisgICAgc2l6ZV90IG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoICsgMTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKyAgICBpZiAobnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoPiBzaXplb2YoYWRkci5zdW5fcGF0aCkpIHsKKyAgICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQgYXQgcGF0aCAlQC4gUGF0aCBpcyB0b28gbG9uZy4iLCBwYXRoKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICBbW2FOb3RpZmljYXRpb24gb2JqZWN0XSBhY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5XTsKKyAgICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9MT0NBTDsKKyAgICBtZW1jcHkoYWRkci5zdW5fcGF0aCwgcGF0aC5VVEY4U3RyaW5nLCBudWxsVGVybWluYXRlZFBhdGhMZW5ndGgpOworICAgIGFkZHIuc3VuX2xlbiA9IFNVTl9MRU4oJmFkZHIpOworCisgICAgTlNEYXRhICphZGRyZXNzID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOiZhZGRyIGxlbmd0aDpzaXplb2YoYWRkcildOworICAgIGlmIChDRlNvY2tldFNldEFkZHJlc3Moc29ja2V0LCAoX19icmlkZ2UgQ0ZEYXRhUmVmKWFkZHJlc3MpICE9IGtDRlNvY2tldFN1Y2Nlc3MpIHsKKyAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOworICAgICAgQ0ZSZWxlYXNlKHNvY2tldCk7CisgICAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzb2NrZXQ7CisgIH0gZWxzZSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBObyBzZXJ2ZXIgc29ja2V0Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KIH0KIAotCi0tICh2b2lkKSBoYW5kbGVDbGllbnRDb25uZWN0aW9uOiAoTlNGaWxlSGFuZGxlICopIGNsaWVudFNvY2tldAorLSh2b2lkKSBkZWFsbG9jCiB7Ci0gIE5TQXV0b3JlbGVhc2VQb29sICogcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOwotICAKLSAgVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCAqIHRyYW5zcG9ydCA9IFtbVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCBhbGxvY10gaW5pdFdpdGhGaWxlSGFuZGxlOiBjbGllbnRTb2NrZXRdOwotICBpZDxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBbbVByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OiB0cmFuc3BvcnRdOwotICAKLSAgaWQgPFRQcm90b2NvbD4gaW5Qcm90b2NvbCA9IFttSW5wdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XTsKLSAgaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2wgPSBbbU91dHB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiB0cmFuc3BvcnRdOworICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHJlbW92ZU9ic2VydmVyOnNlbGZdOwogCi0gIEB0cnkgewotICAgIEJPT0wgcmVzdWx0ID0gTk87Ci0gICAgZG8gewotICAgICAgTlNBdXRvcmVsZWFzZVBvb2wgKiBteVBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLSAgICAgIHJlc3VsdCA9IFtwcm9jZXNzb3IgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogaW5Qcm90b2NvbCBvdXRwdXRQcm90b2NvbDogb3V0UHJvdG9jb2xdOwotICAgICAgW215UG9vbCByZWxlYXNlXTsKLSAgICB9IHdoaWxlIChyZXN1bHQpOworICBpZiAoX2RvbWFpblNvY2tldFBhdGggIT0gbmlsKSB7CisgICAgdW5saW5rKF9kb21haW5Tb2NrZXRQYXRoLlVURjhTdHJpbmcpOwogICB9Ci0gIEBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAqIHRlKSB7Ci0gICAgLy9OU0xvZyhAIkNhdWdodCB0cmFuc3BvcnQgZXhjZXB0aW9uLCBhYmFuZG9uaW5nIGNsaWVudCBjb25uZWN0aW9uOiAlQCIsIHRlKTsKLSAgfQotCi0gIE5TTm90aWZpY2F0aW9uICogbiA9IFtOU05vdGlmaWNhdGlvbiBub3RpZmljYXRpb25XaXRoTmFtZToga1RTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogc2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IFtOU0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3RzQW5kS2V5czogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsXV07Ci0gIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcGVyZm9ybVNlbGVjdG9yT25NYWluVGhyZWFkOiBAc2VsZWN0b3IocG9zdE5vdGlmaWNhdGlvbjopIHdpdGhPYmplY3Q6IG4gd2FpdFVudGlsRG9uZTogWUVTXTsKLSAgCi0gIFtwb29sIHJlbGVhc2VdOwogfQogCiAKKy0odm9pZCkgY29ubmVjdGlvbkFjY2VwdGVkOihOU05vdGlmaWNhdGlvbiAqKW5vdGlmaWNhdGlvbgoreworICBOU0ZpbGVIYW5kbGUgKnNvY2tldCA9IFtub3RpZmljYXRpb24udXNlckluZm8gb2JqZWN0Rm9yS2V5Ok5TRmlsZUhhbmRsZU5vdGlmaWNhdGlvbkZpbGVIYW5kbGVJdGVtXTsKKworICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgY2xpZW50IGNvbm5lY3RlZCwgaGFuZGxlIHJlcXVlc3Qgb24gcXVldWUKKyAgZGlzcGF0Y2hfYXN5bmMoX3Byb2Nlc3NpbmdRdWV1ZSwgXnsKKworICAgIFtzZWxmIGhhbmRsZUNsaWVudENvbm5lY3Rpb246c29ja2V0XTsKKworICB9KTsKKworICAvLyBDb250aW51ZSBhY2NlcHRpbmcgY29ubmVjdGlvbnMKKyAgW19zb2NrZXRGaWxlSGFuZGxlIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOworfQorCisKKy0odm9pZCkgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjooTlNGaWxlSGFuZGxlICopY2xpZW50U29ja2V0Cit7CisgIEBhdXRvcmVsZWFzZXBvb2wgeworCisgICAgVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gW1tUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZpbGVIYW5kbGU6Y2xpZW50U29ja2V0XTsKKyAgICBpZDxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBbX3Byb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OnRyYW5zcG9ydF07CisKKyAgICBpZCA8VFByb3RvY29sPiBpblByb3RvY29sID0gW19pbnB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07CisgICAgaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2wgPSBbX291dHB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OnRyYW5zcG9ydF07CisKKyAgICBOU0Vycm9yICplcnJvcjsKKyAgICBpZiAoIVtwcm9jZXNzb3IgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDppblByb3RvY29sIG91dHB1dFByb3RvY29sOm91dFByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgIC8vIEhhbmRsZSBlcnJvcgorICAgICAgTlNMb2coQCJFcnJvciBwcm9jZXNzaW5nIHJlcXVlc3Q6ICVAIiwgZXJyb3IpOworICAgIH0KKworICAgIGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIF57CisKKyAgICAgIFtOU05vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0Q2VudGVyIHBvc3ROb3RpZmljYXRpb25OYW1lOlRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OnNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFNvY2tldFNlcnZlclByb2Nlc3NvcktleTogcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU29ja2VyU2VydmVyVHJhbnNwb3J0S2V5OiB0cmFuc3BvcnR9XTsKKyAgICB9KTsKKworICB9Cit9CiAKIEBlbmQKLQotCi0KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RBc3luY1RyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEFzeW5jVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiNGZiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RBc3luY1RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0Bwcm90b2NvbCBUQXN5bmNUcmFuc3BvcnQ7CisKKworQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydEZhY3RvcnkgPE5TT2JqZWN0PgorCistKGlkPFRBc3luY1RyYW5zcG9ydD4pIG5ld1RyYW5zcG9ydDsKKworQGVuZAorCisKK3R5cGVkZWYgdm9pZCAoXlRBc3luY0NvbXBsZXRpb25CbG9jaykoKTsKK3R5cGVkZWYgdm9pZCAoXlRBc3luY0ZhaWx1cmVCbG9jaykoTlNFcnJvciAqIF9fbm9ubnVsbCk7CisKKworQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydCA8VFRyYW5zcG9ydD4KKworLSh2b2lkKSBmbHVzaFdpdGhDb21wbGV0aW9uOihUQXN5bmNDb21wbGV0aW9uQmxvY2spY29tcGxldGVkIGZhaWx1cmU6KFRBc3luY0ZhaWx1cmVCbG9jaylmYWlsdXJlOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjhhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRGcmFtZWRUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI2NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRGcmFtZWRUcmFuc3BvcnQuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisjZGVmaW5lIEhFQURFUl9TSVpFIDQKKyNkZWZpbmUgSU5JVF9GUkFNRV9TSVpFIDEwMjQKKworCitAaW50ZXJmYWNlIFRGcmFtZWRUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZURhdGEgKndyaXRlQnVmZmVyOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpyZWFkQnVmZmVyOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBOU1VJbnRlZ2VyIHJlYWRPZmZzZXQ7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVEZyYW1lZFRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KWFUcmFuc3BvcnQKK3sKKyAgaWYgKChzZWxmID0gW3NlbGYgaW5pdF0pKSB7CisgICAgX3RyYW5zcG9ydCA9IGFUcmFuc3BvcnQ7CisgICAgX3JlYWRCdWZmZXIgPSBuaWw7CisgICAgX3JlYWRPZmZzZXQgPSAwOworICAgIF93cml0ZUJ1ZmZlciA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOkhFQURFUl9TSVpFXTsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KKworLShCT09MKSBmbHVzaDooTlNFcnJvciAqKillcnJvcgoreworICBpbnQgbGVuID0gKGludClbX3dyaXRlQnVmZmVyIGxlbmd0aF07CisgIGludCBkYXRhX2xlbiA9IGxlbiAtIEhFQURFUl9TSVpFOworICBpZiAoZGF0YV9sZW4gPCAwKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IGkzMnJkW0hFQURFUl9TSVpFXTsKKyAgaTMycmRbMF0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMjQpKTsKKyAgaTMycmRbMV0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMTYpKTsKKyAgaTMycmRbMl0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gOCkpOworICBpMzJyZFszXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbikpOworCisgIC8vIHNob3VsZCB3ZSBtYWtlIGEgY29weSBvZiB0aGUgd3JpdGVCdWZmZXIgaW5zdGVhZD8gQmV0dGVyIGZvciB0aHJlYWRlZAorICAvLyAgb3BlcmF0aW9ucyEKKyAgW193cml0ZUJ1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIEhFQURFUl9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQnl0ZXM6aTMycmQgbGVuZ3RoOkhFQURFUl9TSVpFXTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOl93cml0ZUJ1ZmZlci5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOmxlbiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtfdHJhbnNwb3J0IGZsdXNoOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIF93cml0ZUJ1ZmZlci5sZW5ndGggPSBIRUFERVJfU0laRTsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW193cml0ZUJ1ZmZlciBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbmd0aCkgeworCisgICAgTlNVSW50ZWdlciBhdmFpbCA9IF9yZWFkQnVmZmVyLmxlbmd0aCAtIF9yZWFkT2Zmc2V0OworICAgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgICBpZiAoIVtzZWxmIHJlYWRGcmFtZTplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBhdmFpbCA9IF9yZWFkQnVmZmVyLmxlbmd0aDsKKyAgICB9CisKKyAgICBOU1JhbmdlIHJhbmdlOworICAgIHJhbmdlLmxvY2F0aW9uID0gX3JlYWRPZmZzZXQ7CisgICAgcmFuZ2UubGVuZ3RoID0gTUlOKGxlbmd0aCAtIGdvdCwgYXZhaWwpOworCisgICAgW19yZWFkQnVmZmVyIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQrZ290IHJhbmdlOnJhbmdlXTsKKyAgICBfcmVhZE9mZnNldCArPSByYW5nZS5sZW5ndGg7CisgICAgZ290ICs9IHJhbmdlLmxlbmd0aDsKKyAgfQorCisgIHJldHVybiBnb3Q7Cit9CisKKy0oQk9PTCkgcmVhZEZyYW1lOihOU0Vycm9yICoqKWVycm9yCit7CisgIFVJbnQ4IGkzMnJkW0hFQURFUl9TSVpFXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmkzMnJkIG9mZnNldDowIGxlbmd0aDpIRUFERVJfU0laRSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBTSW50MzIgc2l6ZSA9CisgICAgKChpMzJyZFswXSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgKChpMzJyZFsxXSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgKChpMzJyZFsyXSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgKChpMzJyZFszXSAmIDB4ZmYpKTsKKworICBpZiAoX3JlYWRCdWZmZXIgPT0gbmlsKSB7CisKKyAgICBfcmVhZEJ1ZmZlciA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOnNpemVdOworCisgIH0KKyAgZWxzZSB7CisKKyAgICBTSW50MzIgbGVuID0gKFNJbnQzMilfcmVhZEJ1ZmZlci5sZW5ndGg7CisgICAgaWYgKGxlbiA+PSBzaXplKSB7CisKKyAgICAgIF9yZWFkQnVmZmVyLmxlbmd0aCA9IHNpemU7CisKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgIC8vIGluY3JlYXNlIGxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICAgICAgW19yZWFkQnVmZmVyIGluY3JlYXNlTGVuZ3RoQnk6c2l6ZS1sZW5dOworCisgICAgfQorCisgIH0KKworICAvLyBjb3B5IGludG8gaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlcgorICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6X3JlYWRCdWZmZXIubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDU3ODQwLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRIVFRQQ2xpZW50IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNVUkwgKiBtVVJMOwotICBOU011dGFibGVVUkxSZXF1ZXN0ICogbVJlcXVlc3Q7Ci0gIE5TTXV0YWJsZURhdGEgKiBtUmVxdWVzdERhdGE7Ci0gIE5TRGF0YSAqIG1SZXNwb25zZURhdGE7Ci0gIGludCBtUmVzcG9uc2VEYXRhT2Zmc2V0OwotICBOU1N0cmluZyAqIG1Vc2VyQWdlbnQ7Ci0gIGludCBtVGltZW91dDsKLX0KLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTDsKLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTAotICAgICAgICAgdXNlckFnZW50OiAoTlNTdHJpbmcgKikgdXNlckFnZW50Ci0gICAgICAgICAgIHRpbWVvdXQ6IChpbnQpIHRpbWVvdXQ7Ci0KLS0gKHZvaWQpIHNldFVSTDogKE5TVVJMICopIGFVUkw7Ci0KLUBlbmQKLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MTFhMGEuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRIVFRQQ2xpZW50LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUSFRUUENsaWVudAotCi0KLS0gKHZvaWQpIHNldHVwUmVxdWVzdAotewotICBpZiAobVJlcXVlc3QgIT0gbmlsKSB7Ci0gICAgW21SZXF1ZXN0IHJlbGVhc2VdOwotICB9Ci0KLSAgLy8gc2V0IHVwIG91ciByZXF1ZXN0IG9iamVjdCB0aGF0IHdlJ2xsIHVzZSBmb3IgZWFjaCByZXF1ZXN0Ci0gIG1SZXF1ZXN0ID0gW1tOU011dGFibGVVUkxSZXF1ZXN0IGFsbG9jXSBpbml0V2l0aFVSTDogbVVSTF07Ci0gIFttUmVxdWVzdCBzZXRIVFRQTWV0aG9kOiBAIlBPU1QiXTsKLSAgW21SZXF1ZXN0IHNldFZhbHVlOiBAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiQ29udGVudC1UeXBlIl07Ci0gIFttUmVxdWVzdCBzZXRWYWx1ZTogQCJhcHBsaWNhdGlvbi94LXRocmlmdCIgZm9ySFRUUEhlYWRlckZpZWxkOiBAIkFjY2VwdCJdOwotCi0gIE5TU3RyaW5nICogdXNlckFnZW50ID0gbVVzZXJBZ2VudDsKLSAgaWYgKCF1c2VyQWdlbnQpIHsKLSAgICB1c2VyQWdlbnQgPSBAIkNvY29hL1RIVFRQQ2xpZW50IjsKLSAgfQotICBbbVJlcXVlc3Qgc2V0VmFsdWU6IHVzZXJBZ2VudCBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiVXNlci1BZ2VudCJdOwotCi0gIFttUmVxdWVzdCBzZXRDYWNoZVBvbGljeTogTlNVUkxSZXF1ZXN0UmVsb2FkSWdub3JpbmdDYWNoZURhdGFdOwotICBpZiAobVRpbWVvdXQpIHsKLSAgICBbbVJlcXVlc3Qgc2V0VGltZW91dEludGVydmFsOiBtVGltZW91dF07Ci0gIH0KLX0KLQotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMCi17Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFVSTDogYVVSTAotICAgICAgICAgICAgICAgICB1c2VyQWdlbnQ6IG5pbAotICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDBdOwotfQotCi0KLS0gKGlkKSBpbml0V2l0aFVSTDogKE5TVVJMICopIGFVUkwKLSAgICAgICAgIHVzZXJBZ2VudDogKE5TU3RyaW5nICopIHVzZXJBZ2VudAotICAgICAgICAgICB0aW1lb3V0OiAoaW50KSB0aW1lb3V0Ci17Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmICghc2VsZikgewotICAgIHJldHVybiBuaWw7Ci0gIH0KLQotICBtVGltZW91dCA9IHRpbWVvdXQ7Ci0gIGlmICh1c2VyQWdlbnQpIHsKLSAgICBtVXNlckFnZW50ID0gW3VzZXJBZ2VudCByZXRhaW5dOwotICB9Ci0gIG1VUkwgPSBbYVVSTCByZXRhaW5dOwotCi0gIFtzZWxmIHNldHVwUmVxdWVzdF07Ci0KLSAgLy8gY3JlYXRlIG91ciByZXF1ZXN0IGRhdGEgYnVmZmVyCi0gIG1SZXF1ZXN0RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogMTAyNF07Ci0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLQotLSAodm9pZCkgc2V0VVJMOiAoTlNVUkwgKikgYVVSTAotewotICBbYVVSTCByZXRhaW5dOwotICBbbVVSTCByZWxlYXNlXTsKLSAgbVVSTCA9IGFVUkw7Ci0KLSAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKLX0KLQotCi0tICh2b2lkKSBkZWFsbG9jCi17Ci0gIFttVVJMIHJlbGVhc2VdOwotICBbbVVzZXJBZ2VudCByZWxlYXNlXTsKLSAgW21SZXF1ZXN0IHJlbGVhc2VdOwotICBbbVJlcXVlc3REYXRhIHJlbGVhc2VdOwotICBbbVJlc3BvbnNlRGF0YSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0KLS0gKGludCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKGludCkgb2ZmIGxlbmd0aDogKGludCkgbGVuCi17Ci0gIE5TUmFuZ2UgcjsKLSAgci5sb2NhdGlvbiA9IG1SZXNwb25zZURhdGFPZmZzZXQ7Ci0gIHIubGVuZ3RoID0gbGVuOwotCi0gIFttUmVzcG9uc2VEYXRhIGdldEJ5dGVzOiBidWYrb2ZmIHJhbmdlOiByXTsKLSAgbVJlc3BvbnNlRGF0YU9mZnNldCArPSBsZW47Ci0KLSAgcmV0dXJuIGxlbjsKLX0KLQotCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6ICh1bnNpZ25lZCBpbnQpIG9mZnNldCBsZW5ndGg6ICh1bnNpZ25lZCBpbnQpIGxlbmd0aAotewotICBbbVJlcXVlc3REYXRhIGFwcGVuZEJ5dGVzOiBkYXRhK29mZnNldCBsZW5ndGg6IGxlbmd0aF07Ci19Ci0KLQotLSAodm9pZCkgZmx1c2gKLXsKLSAgW21SZXF1ZXN0IHNldEhUVFBCb2R5OiBtUmVxdWVzdERhdGFdOyAvLyBub3Qgc3VyZSBpZiBpdCBjb3BpZXMgdGhlIGRhdGEKLQotICAvLyBtYWtlIHRoZSBIVFRQIHJlcXVlc3QKLSAgTlNVUkxSZXNwb25zZSAqIHJlc3BvbnNlOwotICBOU0Vycm9yICogZXJyb3I7Ci0gIE5TRGF0YSAqIHJlc3BvbnNlRGF0YSA9Ci0gICAgW05TVVJMQ29ubmVjdGlvbiBzZW5kU3luY2hyb25vdXNSZXF1ZXN0OiBtUmVxdWVzdCByZXR1cm5pbmdSZXNwb25zZTogJnJlc3BvbnNlIGVycm9yOiAmZXJyb3JdOwotCi0gIFttUmVxdWVzdERhdGEgc2V0TGVuZ3RoOiAwXTsKLQotICBpZiAocmVzcG9uc2VEYXRhID09IG5pbCkgewotICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiQ291bGQgbm90IG1ha2UgSFRUUCByZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JdOwotICB9Ci0gIGlmICghW3Jlc3BvbnNlIGlzS2luZE9mQ2xhc3M6IFtOU0hUVFBVUkxSZXNwb25zZSBjbGFzc11dKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJVbmV4cGVjdGVkIE5TVVJMUmVzcG9uc2UgdHlwZTogJUAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNwb25zZSBjbGFzc05hbWVdXV07Ci0gIH0KLQotICBOU0hUVFBVUkxSZXNwb25zZSAqIGh0dHBSZXNwb25zZSA9IChOU0hUVFBVUkxSZXNwb25zZSAqKSByZXNwb25zZTsKLSAgaWYgKFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV0gIT0gMjAwKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJCYWQgcmVzcG9uc2UgZnJvbSBIVFRQIHNlcnZlcjogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV1dXTsKLSAgfQotCi0gIC8vIHBoZXchCi0gIFttUmVzcG9uc2VEYXRhIHJlbGVhc2VdOwotICBtUmVzcG9uc2VEYXRhID0gW3Jlc3BvbnNlRGF0YSByZXRhaW5dOwotICBtUmVzcG9uc2VEYXRhT2Zmc2V0ID0gMDsKLX0KLQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzQ5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVEFzeW5jVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwordHlwZWRlZiBOU0Vycm9yICpfX251bGxhYmxlICheVEhUVFBTZXNzaW9uVHJhbnNwb3J0UmVzcG9uc2VWYWxpZGF0ZUJsb2NrKSAoTlNIVFRQVVJMUmVzcG9uc2UgKnJlc3BvbnNlLCBOU0RhdGEgKnJlc3BvbnNlRGF0YSk7CisKKworQGludGVyZmFjZSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5IDogTlNPYmplY3Q8VEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4KKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgVEhUVFBTZXNzaW9uVHJhbnNwb3J0UmVzcG9uc2VWYWxpZGF0ZUJsb2NrIHJlc3BvbnNlVmFsaWRhdGU7CisKKysodm9pZCkgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uOihOU1VSTFNlc3Npb25Db25maWd1cmF0aW9uICopY29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFByb3RvY29sTmFtZTooTlNTdHJpbmcgKilwcm90b2NvbE5hbWU7CisKKy0oaWQpIGluaXRXaXRoU2Vzc2lvbjooTlNVUkxTZXNzaW9uICopc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgVVJMOihOU1VSTCAqKWFVUkw7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUQXN5bmNUcmFuc3BvcnQ+CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwYjdmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRIVFRQU2Vzc2lvblRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworQGludGVyZmFjZSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMU2Vzc2lvbiAqc2Vzc2lvbjsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMICp1cmw7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydCAoKQorCitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVxdWVzdERhdGE7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0RhdGEgKnJlc3BvbnNlRGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVzcG9uc2VEYXRhT2Zmc2V0OworCistKGluc3RhbmNldHlwZSkgaW5pdFdpdGhGYWN0b3J5OihUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5ICopZmFjdG9yeTsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFNlc3Npb25UcmFuc3BvcnRGYWN0b3J5CisKKysodm9pZCkgc2V0dXBEZWZhdWx0c0ZvclNlc3Npb25Db25maWd1cmF0aW9uOihOU1VSTFNlc3Npb25Db25maWd1cmF0aW9uICopY29uZmlnIHdpdGhQcm90b2NvbE5hbWU6KE5TU3RyaW5nICopcHJvdG9jb2xOYW1lCit7CisgIE5TU3RyaW5nICp0aHJpZnRDb250ZW50VHlwZSA9IEAiYXBwbGljYXRpb24veC10aHJpZnQiOworICBpZiAocHJvdG9jb2xOYW1lLmxlbmd0aCkgeworICAgIHRocmlmdENvbnRlbnRUeXBlID0gW3RocmlmdENvbnRlbnRUeXBlIHN0cmluZ0J5QXBwZW5kaW5nRm9ybWF0OkAiOyBwPSVAIiwgcHJvdG9jb2xOYW1lXTsKKyAgfQorCisgIGNvbmZpZy5yZXF1ZXN0Q2FjaGVQb2xpY3kgPSBOU1VSTFJlcXVlc3RSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YTsKKyAgY29uZmlnLkhUVFBTaG91bGRVc2VQaXBlbGluaW5nID0gWUVTOworICBjb25maWcuSFRUUFNob3VsZFNldENvb2tpZXMgPSBOTzsKKyAgY29uZmlnLlVSTENhY2hlID0gbmlsOworICBjb25maWcuSFRUUEFkZGl0aW9uYWxIZWFkZXJzID0gQHtAIkNvbnRlbnQtVHlwZSI6dGhyaWZ0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiQWNjZXB0Ijp0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJVc2VyLUFnZW50IjpAIlRocmlmdC9Db2NvYSAoU2Vzc2lvbikifTsKK30KKworCistKGlkKSBpbml0V2l0aFNlc3Npb246KE5TVVJMU2Vzc2lvbiAqKXNlc3Npb24gVVJMOihOU1VSTCAqKXVybAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoc2VsZikgeworICAgIF9zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBfdXJsID0gdXJsOworICB9CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQ8VEFzeW5jVHJhbnNwb3J0PikgbmV3VHJhbnNwb3J0Cit7CisgIHJldHVybiBbW1RIVFRQU2Vzc2lvblRyYW5zcG9ydCBhbGxvY10gaW5pdFdpdGhGYWN0b3J5OnNlbGZdOworfQorCistKE5TVVJMU2Vzc2lvbkRhdGFUYXNrICopIHRhc2tXaXRoUmVxdWVzdDooTlNVUkxSZXF1ZXN0ICopcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXI6KHZvaWQgKF4pKE5TRGF0YSAqZGF0YSwgTlNVUkxSZXNwb25zZSAqcmVzcG9uc2UsIE5TRXJyb3IgKmVycm9yKSljb21wbGV0aW9uSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVVJMU2Vzc2lvbkRhdGFUYXNrICpuZXdUYXNrID0gW19zZXNzaW9uIGRhdGFUYXNrV2l0aFJlcXVlc3Q6cmVxdWVzdCBjb21wbGV0aW9uSGFuZGxlcjpjb21wbGV0aW9uSGFuZGxlcl07CisgIGlmICghbmV3VGFzaykgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe05TTG9jYWxpemVkRGVzY3JpcHRpb25LZXk6QCJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24gZGF0YSB0YXNrIn1dOworICAgIH0KKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgcmV0dXJuIG5ld1Rhc2s7Cit9CisKKy0oTlNFcnJvciAqKSB2YWxpZGF0ZVJlc3BvbnNlOihOU0hUVFBVUkxSZXNwb25zZSAqKXJlc3BvbnNlIGRhdGE6KE5TRGF0YSAqKWRhdGEKK3sKKyAgaWYgKF9yZXNwb25zZVZhbGlkYXRlKSB7CisgICAgcmV0dXJuIF9yZXNwb25zZVZhbGlkYXRlKHJlc3BvbnNlLCBkYXRhKTsKKyAgfQorICByZXR1cm4gbmlsOworfQorCitAZW5kCisKKworCitAaW1wbGVtZW50YXRpb24gVEhUVFBTZXNzaW9uVHJhbnNwb3J0CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aEZhY3Rvcnk6KFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKilmYWN0b3J5Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2ZhY3RvcnkgPSBmYWN0b3J5OworICB9CisgIHJldHVybiBzZWxmOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU1VJbnRlZ2VyIGF2YWlsID0gX3Jlc3BvbnNlRGF0YS5sZW5ndGggLSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX3Jlc3BvbnNlRGF0YU9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfcmVzcG9uc2VEYXRhIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQgcmFuZ2U6cmFuZ2VdOworICBfcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKworICByZXR1cm4gKFVJbnQzMilyYW5nZS5sZW5ndGg7Cit9CisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIV9yZXF1ZXN0RGF0YSkgeworICAgIF9yZXF1ZXN0RGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoQ2FwYWNpdHk6MjU2XTsKKyAgfQorCisgIFtfcmVxdWVzdERhdGEgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworLSh2b2lkKSBmbHVzaFdpdGhDb21wbGV0aW9uOihUQXN5bmNDb21wbGV0aW9uQmxvY2spY29tcGxldGVkIGZhaWx1cmU6KFRBc3luY0ZhaWx1cmVCbG9jaylmYWlsdXJlCit7CisgIE5TRXJyb3IgKmVycm9yOworCisgIE5TTXV0YWJsZVVSTFJlcXVlc3QgKnJlcXVlc3QgPSBbW05TTXV0YWJsZVVSTFJlcXVlc3QgYWxsb2NdIGluaXRXaXRoVVJMOl9mYWN0b3J5LnVybF07CisgIHJlcXVlc3QuSFRUUE1ldGhvZCA9IEAiUE9TVCI7CisgIHJlcXVlc3QuSFRUUEJvZHkgPSBfcmVxdWVzdERhdGE7CisKKyAgX3JlcXVlc3REYXRhID0gbmlsOworCisgIE5TVVJMU2Vzc2lvbkRhdGFUYXNrICp0YXNrID0gW19mYWN0b3J5IHRhc2tXaXRoUmVxdWVzdDpyZXF1ZXN0IGNvbXBsZXRpb25IYW5kbGVyOl4oTlNEYXRhICpkYXRhLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSwgTlNFcnJvciAqZXJyb3IpIHsKKworICAgIC8vIENoZWNrIHJlc3BvbnNlIHR5cGUKKyAgICBpZiAoIWVycm9yICYmICFbcmVzcG9uc2UgaXNLaW5kT2ZDbGFzczpOU0hUVFBVUkxSZXNwb25zZS5jbGFzc10pIHsKKworICAgICAgZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UpfV07CisKKyAgICB9CisKKyAgICAvLyBDaGVjayBzdGF0dXMgY29kZQorICAgIE5TSFRUUFVSTFJlc3BvbnNlICpodHRwUmVzcG9uc2UgPSAoaWQpcmVzcG9uc2U7CisgICAgaWYgKCFlcnJvciAmJiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSAyMDApIHsKKworICAgICAgVEh0dHBUcmFuc3BvcnRFcnJvciBjb2RlOworICAgICAgaWYgKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlID09IDQwMSkgeworICAgICAgICBjb2RlID0gVEh0dHBUcmFuc3BvcnRFcnJvckF1dGhlbnRpY2F0aW9uOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFN0YXR1czsKKyAgICAgIH0KKworICAgICAgZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTogQChjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzdGF0dXNDb2RlIjpAKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKX1dOworICAgIH0KKworICAgIC8vIEFsbG93IGZhY3RvcnkgdG8gY2hlY2sKKyAgICBpZiAoIWVycm9yKSB7CisgICAgICBlcnJvciA9IFtfZmFjdG9yeSB2YWxpZGF0ZVJlc3BvbnNlOmh0dHBSZXNwb25zZSBkYXRhOmRhdGFdOworICAgIH0KKworICAgIF9yZXNwb25zZURhdGFPZmZzZXQgPSAwOworCisgICAgaWYgKGVycm9yKSB7CisKKyAgICAgIF9yZXNwb25zZURhdGEgPSBuaWw7CisKKyAgICAgIGZhaWx1cmUoZXJyb3IpOworCisgICAgfQorICAgIGVsc2UgeworCisgICAgICBpZiAoZGF0YSA9PSBuaWwpIHsKKyAgICAgICAgZGF0YSA9IFtOU0RhdGEgZGF0YV07CisgICAgICB9CisKKyAgICAgIF9yZXNwb25zZURhdGEgPSBkYXRhOworCisgICAgICBjb21wbGV0ZWQoc2VsZik7CisgICAgfQorCisgIH0gZXJyb3I6JmVycm9yXTsKKworICBpZiAoIXRhc2spIHsKKyAgICBmYWlsdXJlKGVycm9yKTsKKyAgICByZXR1cm47CisgIH0KKworICBbdGFzayByZXN1bWVdOworfQorCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBkaXNwYXRjaF9zZW1hcGhvcmVfdCBjb21wbGV0ZWQgPSBkaXNwYXRjaF9zZW1hcGhvcmVfY3JlYXRlKDApOworCisgIF9fYmxvY2sgQk9PTCByZXN1bHQ7CisgIF9fYmxvY2sgTlNFcnJvciAqaW50ZXJuYWxFcnJvcjsKKworICBbc2VsZiBmbHVzaFdpdGhDb21wbGV0aW9uOl4oaWQgPCBUQXN5bmNUcmFuc3BvcnQgPiB0cmFuc3BvcnQpIHsKKworICAgIHJlc3VsdCA9IFlFUzsKKworICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoY29tcGxldGVkKTsKKworICB9IGZhaWx1cmU6XihOU0Vycm9yICplcnJvcikgeworCisgICAgaW50ZXJuYWxFcnJvciA9IGVycm9yOworCisgICAgcmVzdWx0ID0gTk87CisKKyAgICBkaXNwYXRjaF9zZW1hcGhvcmVfc2lnbmFsKGNvbXBsZXRlZCk7CisKKyAgfV07CisKKyAgZGlzcGF0Y2hfc2VtYXBob3JlX3dhaXQoY29tcGxldGVkLCBESVNQQVRDSF9USU1FX0ZPUkVWRVIpOworCisgIGlmIChlcnJvcikgeworICAgICplcnJvciA9IGludGVybmFsRXJyb3I7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzM1ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVEhUVFBUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTDsKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAorICAgICAgICB1c2VyQWdlbnQ6KG51bGxhYmxlIE5TU3RyaW5nICopdXNlckFnZW50CisgICAgICAgICAgdGltZW91dDooaW50KXRpbWVvdXQ7CisKKy0odm9pZCkgc2V0VVJMOihOU1VSTCAqKWFVUkw7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDQ2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRIVFRQVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFRIVFRQVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TVVJMICp1cmw7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVVUkxSZXF1ZXN0ICpyZXF1ZXN0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVxdWVzdERhdGE7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0RhdGEgKnJlc3BvbnNlRGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVUludGVnZXIgcmVzcG9uc2VEYXRhT2Zmc2V0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKnVzZXJBZ2VudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE5TVGltZUludGVydmFsIHRpbWVvdXQ7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVEhUVFBUcmFuc3BvcnQKKworLSh2b2lkKSBzZXR1cFJlcXVlc3QKK3sKKyAgLy8gc2V0IHVwIG91ciByZXF1ZXN0IG9iamVjdCB0aGF0IHdlJ2xsIHVzZSBmb3IgZWFjaCByZXF1ZXN0CisgIF9yZXF1ZXN0ID0gW1tOU011dGFibGVVUkxSZXF1ZXN0IGFsbG9jXSBpbml0V2l0aFVSTDpfdXJsXTsKKyAgW19yZXF1ZXN0IHNldEhUVFBNZXRob2Q6QCJQT1NUIl07CisgIFtfcmVxdWVzdCBzZXRWYWx1ZTpAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6QCJDb250ZW50LVR5cGUiXTsKKyAgW19yZXF1ZXN0IHNldFZhbHVlOkAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDpAIkFjY2VwdCJdOworCisgIE5TU3RyaW5nICp1c2VyQWdlbnQgPSBfdXNlckFnZW50OworICBpZiAoIXVzZXJBZ2VudCkgeworICAgIHVzZXJBZ2VudCA9IEAiVGhyaWZ0L0NvY29hIjsKKyAgfQorICBbX3JlcXVlc3Qgc2V0VmFsdWU6dXNlckFnZW50IGZvckhUVFBIZWFkZXJGaWVsZDpAIlVzZXItQWdlbnQiXTsKKworICBbX3JlcXVlc3Qgc2V0Q2FjaGVQb2xpY3k6TlNVUkxSZXF1ZXN0UmVsb2FkSWdub3JpbmdDYWNoZURhdGFdOworICBpZiAoX3RpbWVvdXQpIHsKKyAgICBbX3JlcXVlc3Qgc2V0VGltZW91dEludGVydmFsOl90aW1lb3V0XTsKKyAgfQorfQorCisKKy0oaWQpIGluaXRXaXRoVVJMOihOU1VSTCAqKWFVUkwKK3sKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVVJMOmFVUkwKKyAgICAgICAgICAgICAgICAgdXNlckFnZW50Om5pbAorICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6MF07Cit9CisKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAorICAgICAgICB1c2VyQWdlbnQ6KE5TU3RyaW5nICopYVVzZXJBZ2VudAorICAgICAgICAgIHRpbWVvdXQ6KGludClhVGltZW91dAoreworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoIXNlbGYpIHsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgX3RpbWVvdXQgPSBhVGltZW91dDsKKyAgX3VzZXJBZ2VudCA9IGFVc2VyQWdlbnQ7CisgIF91cmwgPSBhVVJMOworCisgIFtzZWxmIHNldHVwUmVxdWVzdF07CisKKyAgLy8gY3JlYXRlIG91ciByZXF1ZXN0IGRhdGEgYnVmZmVyCisgIF9yZXF1ZXN0RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToxMDI0XTsKKworICByZXR1cm4gc2VsZjsKK30KKworLSh2b2lkKSBzZXRVUkw6KE5TVVJMICopYVVSTAoreworICBfdXJsID0gYVVSTDsKKworICBbc2VsZiBzZXR1cFJlcXVlc3RdOworfQorCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSBbc2VsZiByZWFkQXZhaWw6b3V0QnVmZmVyIG9mZnNldDpvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl07CisgIGlmIChnb3QgIT0gbGVuZ3RoKSB7CisKKyAgICAvLyBSZXBvcnQgdW5kZXJmbG93IG9ubHkgaWYgcmVhZEF2YWlsIGRpZG4ndCByZXBvcnQgZXJyb3IgYWxyZWFkeQorICAgIGlmIChlcnJvciAmJiAhKmVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU1VJbnRlZ2VyIGF2YWlsID0gX3Jlc3BvbnNlRGF0YS5sZW5ndGggLSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX3Jlc3BvbnNlRGF0YU9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfcmVzcG9uc2VEYXRhIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQgcmFuZ2U6cmFuZ2VdOworICBfcmVzcG9uc2VEYXRhT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKworICByZXR1cm4gKFVJbnQzMilyYW5nZS5sZW5ndGg7Cit9CisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX3JlcXVlc3REYXRhIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfcmVxdWVzdCBzZXRIVFRQQm9keTpfcmVxdWVzdERhdGFdOworCisgIF9yZXNwb25zZURhdGFPZmZzZXQgPSAwOworCisgIC8vIG1ha2UgdGhlIEhUVFAgcmVxdWVzdAorICBOU1VSTFJlc3BvbnNlICpyZXNwb25zZTsKKyAgX3Jlc3BvbnNlRGF0YSA9IFtOU1VSTENvbm5lY3Rpb24gc2VuZFN5bmNocm9ub3VzUmVxdWVzdDpfcmVxdWVzdCByZXR1cm5pbmdSZXNwb25zZTomcmVzcG9uc2UgZXJyb3I6ZXJyb3JdOworICBpZiAoIV9yZXNwb25zZURhdGEpIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBbX3JlcXVlc3REYXRhIHNldExlbmd0aDowXTsKKworICBpZiAoIVtyZXNwb25zZSBpc0tpbmRPZkNsYXNzOk5TSFRUUFVSTFJlc3BvbnNlLmNsYXNzXSkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTogQChUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFJlc3BvbnNlKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBOU0hUVFBVUkxSZXNwb25zZSAqaHR0cFJlc3BvbnNlID0gKE5TSFRUUFVSTFJlc3BvbnNlICopcmVzcG9uc2U7CisgIGlmIChbaHR0cFJlc3BvbnNlIHN0YXR1c0NvZGVdICE9IDIwMCkgeworICAgIGlmIChlcnJvcikgeworCisgICAgICBUSHR0cFRyYW5zcG9ydEVycm9yIGNvZGU7CisgICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxKSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb247CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkU3RhdHVzOworICAgICAgfQorCisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzdGF0dXNDb2RlIjpAKGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmgKaW5kZXggNDVhNWUxNy4uNjI0OWQzMiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaApAQCAtMjAsOSArMjAsMTggQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotCU5TTXV0YWJsZURhdGEgKm1CdWZmZXI7Ci0JTlNVSW50ZWdlciBtT2Zmc2V0OwotfQotLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhOworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShOU0RhdGEgKikgYnVmZmVyOworCistKGlkKSBpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGE7CisKKy0oaWQpIGluaXRXaXRoRGF0YU5vQ29weTooTlNNdXRhYmxlRGF0YSAqKWRhdGE7CisKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubQppbmRleCA3OTEyYmNkLi5lYzE5Y2M4IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5tCkBAIC0xOCw0MiArMTgsMTA0IEBACiAgKi8KIAogI2ltcG9ydCAiVE1lbW9yeUJ1ZmZlci5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKIAogI2RlZmluZSBHQVJCQUdFX0JVRkZFUl9TSVpFIDQwOTYgLy8gNEtpQgogCisKK0BpbnRlcmZhY2UgVE1lbW9yeUJ1ZmZlciAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZURhdGEgKmJ1ZmZlcjsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgVUludDMyIGJ1ZmZlck9mZnNldDsKKworQGVuZAorCisKIEBpbXBsZW1lbnRhdGlvbiBUTWVtb3J5QnVmZmVyCi0tIChpZClpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGEgewotCWlmIChzZWxmID0gW3N1cGVyIGluaXRdKSB7Ci0JCW1CdWZmZXIgPSBbZGF0YSBtdXRhYmxlQ29weV07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gc2VsZjsKKworLShpZCkgaW5pdAoreworICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7CisgICAgX2J1ZmZlciA9IFtOU011dGFibGVEYXRhIG5ld107CisgICAgX2J1ZmZlck9mZnNldCA9IDA7CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKGludClyZWFkQWxsOih1aW50OF90ICopYnVmIG9mZnNldDooaW50KW9mZiBsZW5ndGg6KGludClsZW4gewotCWlmIChbbUJ1ZmZlciBsZW5ndGhdIC0gbU9mZnNldCA8IGxlbikgewotCQlAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjpAIk5vdCBlbm91Z2ggYnl0ZXMgcmVtYWluIGluIGJ1ZmZlciJdOwotCX0KLQlbbUJ1ZmZlciBnZXRCeXRlczpidWYgcmFuZ2U6TlNNYWtlUmFuZ2UobU9mZnNldCwgbGVuKV07Ci0JbU9mZnNldCArPSBsZW47Ci0JaWYgKG1PZmZzZXQgPj0gR0FSQkFHRV9CVUZGRVJfU0laRSkgewotCQlbbUJ1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIG1PZmZzZXQpIHdpdGhCeXRlczpOVUxMIGxlbmd0aDowXTsKLQkJbU9mZnNldCA9IDA7Ci0JfQotCXJldHVybiBsZW47CistKGlkKSBpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGEKK3sKKyAgaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKKyAgICBfYnVmZmVyID0gW2RhdGEgbXV0YWJsZUNvcHldOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisgIHJldHVybiBzZWxmOwogfQogCi0tICh2b2lkKXdyaXRlOihjb25zdCB1aW50OF90ICopZGF0YSBvZmZzZXQ6KHVuc2lnbmVkIGludClvZmZzZXQgbGVuZ3RoOih1bnNpZ25lZCBpbnQpbGVuZ3RoIHsKLQlbbUJ1ZmZlciBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKy0oaWQpIGluaXRXaXRoRGF0YU5vQ29weTooTlNNdXRhYmxlRGF0YSAqKWRhdGEKK3sKKyAgaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKKyAgICBfYnVmZmVyID0gZGF0YTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorICByZXR1cm4gc2VsZjsKIH0KIAotLSAodm9pZClmbHVzaCB7Ci0JLy8gbm9vcAorLShCT09MKSByZWFkQWxsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gW3NlbGYgcmVhZEF2YWlsOm91dEJ1ZmZlciBvZmZzZXQ6b3V0QnVmZmVyT2Zmc2V0IG1heExlbmd0aDpsZW5ndGggZXJyb3I6ZXJyb3JdOworICBpZiAoZ290ICE9IGxlbmd0aCkgeworCisgICAgLy8gUmVwb3J0IHVuZGVyZmxvdyBvbmx5IGlmIHJlYWRBdmFpbCBkaWRuJ3QgcmVwb3J0IGVycm9yIGFscmVhZHkKKyAgICBpZiAoZXJyb3IgJiYgISplcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorCisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZClkZWFsbG9jIHsKLQlbbUJ1ZmZlciByZWxlYXNlXTsKLQlbc3VwZXIgZGVhbGxvY107CistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbWF4TGVuZ3RoOihVSW50MzIpbWF4TGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgYXZhaWwgPSAoVUludDMyKV9idWZmZXIubGVuZ3RoIC0gX2J1ZmZlck9mZnNldDsKKyAgaWYgKGF2YWlsID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIE5TUmFuZ2UgcmFuZ2U7CisgIHJhbmdlLmxvY2F0aW9uID0gX2J1ZmZlck9mZnNldDsKKyAgcmFuZ2UubGVuZ3RoID0gTUlOKG1heExlbmd0aCwgYXZhaWwpOworCisgIFtfYnVmZmVyIGdldEJ5dGVzOm91dEJ1ZmZlciArIG91dEJ1ZmZlck9mZnNldCByYW5nZTpyYW5nZV07CisgIF9idWZmZXJPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworCisgIGlmIChfYnVmZmVyT2Zmc2V0ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUpIHsKKyAgICBbX2J1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIF9idWZmZXJPZmZzZXQpIHdpdGhCeXRlczpOVUxMIGxlbmd0aDowXTsKKyAgICBfYnVmZmVyT2Zmc2V0ID0gMDsKKyAgfQorCisgIHJldHVybiAoVUludDMyKXJhbmdlLmxlbmd0aDsKIH0KKworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilpbkJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilpbkJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfYnVmZmVyIGFwcGVuZEJ5dGVzOmluQnVmZmVyICsgaW5CdWZmZXJPZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShOU0RhdGEgKikgYnVmZmVyCit7CisgIHJldHVybiBfYnVmZmVyOworfQorCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgKaW5kZXggYmEyYTIwOS4uZGI2ZWRmMyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaApAQCAtMjEsMTUgKzIxLDE4IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNGaWxlSGFuZGxlICogbUlucHV0RmlsZUhhbmRsZTsKLSAgTlNGaWxlSGFuZGxlICogbU91dHB1dEZpbGVIYW5kbGU7Ci19CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi0tIChpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGZpbGVIYW5kbGU7CiAKLS0gKGlkKSBpbml0V2l0aElucHV0RmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBpbnB1dEZpbGVIYW5kbGUKLSAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBvdXRwdXRGaWxlSGFuZGxlOworQGludGVyZmFjZSBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CisKKy0oaWQpIGluaXRXaXRoRmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopZmlsZUhhbmRsZTsKKworLShpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWlucHV0RmlsZUhhbmRsZQorICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKW91dHB1dEZpbGVIYW5kbGU7CiAKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tCmluZGV4IGIyMTgyMTguLmM5MDdmODcgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQubQorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0KQEAgLTE5LDczICsxOSwxMDAgQEAKIAogCiAjaW1wb3J0ICJUTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU0ZpbGVIYW5kbGUgKmlucHV0RmlsZUhhbmRsZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNGaWxlSGFuZGxlICpvdXRwdXRGaWxlSGFuZGxlOworCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQKIAotLSAoaWQpIGluaXRXaXRoRmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBmaWxlSGFuZGxlCistKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWZpbGVIYW5kbGUKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZV07CisgIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0RmlsZUhhbmRsZTpmaWxlSGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTpmaWxlSGFuZGxlXTsKIH0KIAogCi0tIChpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgaW5wdXRGaWxlSGFuZGxlCi0gICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgb3V0cHV0RmlsZUhhbmRsZQorLShpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWFJbnB1dEZpbGVIYW5kbGUKKyAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilhT3V0cHV0RmlsZUhhbmRsZQogewogICBzZWxmID0gW3N1cGVyIGluaXRdOwotCi0gIG1JbnB1dEZpbGVIYW5kbGUgPSBbaW5wdXRGaWxlSGFuZGxlIHJldGFpbl07Ci0gIG1PdXRwdXRGaWxlSGFuZGxlID0gW291dHB1dEZpbGVIYW5kbGUgcmV0YWluXTsKLQorICBpZiAoc2VsZikgeworICAgIF9pbnB1dEZpbGVIYW5kbGUgPSBhSW5wdXRGaWxlSGFuZGxlOworICAgIF9vdXRwdXRGaWxlSGFuZGxlID0gYU91dHB1dEZpbGVIYW5kbGU7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKIAotLSAodm9pZCkgZGVhbGxvYyB7Ci0gIFttSW5wdXRGaWxlSGFuZGxlIHJlbGVhc2VdOwotICBbbU91dHB1dEZpbGVIYW5kbGUgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IDA7CisgIHdoaWxlIChnb3QgPCBsZW4pIHsKKworICAgIE5TRGF0YSAqZCA9IFtfaW5wdXRGaWxlSGFuZGxlIHJlYWREYXRhT2ZMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKGQubGVuZ3RoID09IDApIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgW2QgZ2V0Qnl0ZXM6YnVmK2dvdCBsZW5ndGg6ZC5sZW5ndGhdOworICAgIGdvdCArPSBkLmxlbmd0aDsKKyAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKGludCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKGludCkgb2ZmIGxlbmd0aDogKGludCkgbGVuCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbWF4TGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgZ290ID0gMDsKKyAgVUludDMyIGdvdCA9IDA7CiAgIHdoaWxlIChnb3QgPCBsZW4pIHsKLSAgICBOU0RhdGEgKiBkID0gW21JbnB1dEZpbGVIYW5kbGUgcmVhZERhdGFPZkxlbmd0aDogbGVuLWdvdF07Ci0gICAgaWYgKFtkIGxlbmd0aF0gPT0gMCkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIkNhbm5vdCByZWFkLiBObyBtb3JlIGRhdGEuIl07CisKKyAgICBOU0RhdGEgKmQgPSBbX2lucHV0RmlsZUhhbmRsZSByZWFkRGF0YU9mTGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChkLmxlbmd0aCA9PSAwKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgW2QgZ2V0Qnl0ZXM6IGJ1Zitnb3RdOwotICAgIGdvdCArPSBbZCBsZW5ndGhdOworCisgICAgW2QgZ2V0Qnl0ZXM6YnVmK2dvdCBsZW5ndGg6ZC5sZW5ndGhdOworICAgIGdvdCArPSBkLmxlbmd0aDsKICAgfQogICByZXR1cm4gZ290OwogfQogCiAKLS0gKHZvaWQpIHdyaXRlOiAodWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgTlNEYXRhICogZGF0YU9iamVjdCA9IFtbTlNEYXRhIGFsbG9jXSBpbml0V2l0aEJ5dGVzTm9Db3B5OiBkYXRhK29mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlV2hlbkRvbmU6IE5PXTsKKyAgdm9pZCAqcG9zID0gKHZvaWQgKilkYXRhICsgb2Zmc2V0OwogCiAgIEB0cnkgewotICAgIFttT3V0cHV0RmlsZUhhbmRsZSB3cml0ZURhdGE6IGRhdGFPYmplY3RdOwotICB9IEBjYXRjaCAoTlNFeGNlcHRpb24gKiBlKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCIlczogVW5hYmxlIHRvIHdyaXRlIGRhdGE6ICVAIiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZV1dOworICAgIFtfb3V0cHV0RmlsZUhhbmRsZSB3cml0ZURhdGE6W05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5OnBvcyBsZW5ndGg6bGVuZ3RoIGZyZWVXaGVuRG9uZTpOT11dOworICB9CisgIEBjYXRjaCAoTlNFeGNlcHRpb24gKmUpIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JOb3RPcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POwogICB9CiAKLSAgW2RhdGFPYmplY3QgcmVsZWFzZV07CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgZmx1c2gKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0KKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaAppbmRleCBkN2JlNDBiLi41NGM0ODg0IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQuaApAQCAtMjAsMTkgKzIwLDI0IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUTlNTdHJlYW1UcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotICBOU0lucHV0U3RyZWFtICogbUlucHV0OwotICBOU091dHB1dFN0cmVhbSAqIG1PdXRwdXQ7Ci19CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0OwogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQ7CitAaW50ZXJmYWNlIFROU1N0cmVhbVRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PgogCi0tIChpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQ7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0lucHV0U3RyZWFtICppbnB1dDsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TT3V0cHV0U3RyZWFtICpvdXRwdXQ7CisKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KG51bGxhYmxlIE5TSW5wdXRTdHJlYW0gKilpbnB1dAorICAgICAgICAgICAgIG91dHB1dFN0cmVhbToobnVsbGFibGUgTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQ7CisKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KE5TSW5wdXRTdHJlYW0gKilpbnB1dDsKKworLShpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0OworCistKHZvaWQpIGNsb3NlOwogCiBAZW5kCiAKIAotCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KaW5kZXggMWQ0Y2ZlZS4uMThjNDFkMyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KQEAgLTE4LDcyICsxOCwxMzYgQEAKICAqLwogCiAjaW1wb3J0ICJUTlNTdHJlYW1UcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0ICgpCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFROU1N0cmVhbVRyYW5zcG9ydAogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQKKyAgICAgICAgICAgICBvdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0CiB7Ci0gIFtzdXBlciBpbml0XTsKLSAgbUlucHV0ID0gW2lucHV0IHJldGFpbl07Ci0gIG1PdXRwdXQgPSBbb3V0cHV0IHJldGFpbl07CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2lucHV0ID0gaW5wdXQ7CisgICAgX291dHB1dCA9IG91dHB1dDsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06IChOU0lucHV0U3RyZWFtICopIGlucHV0CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06IGlucHV0IG91dHB1dFN0cmVhbTogbmlsXTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXQgb3V0cHV0U3RyZWFtOm5pbF07CiB9CiAKLS0gKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTogKE5TT3V0cHV0U3RyZWFtICopIG91dHB1dAorLShpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0CiB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0U3RyZWFtOiBuaWwgb3V0cHV0U3RyZWFtOiBvdXRwdXRdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTpuaWwgb3V0cHV0U3RyZWFtOm91dHB1dF07CiB9CiAKLS0gKHZvaWQpIGRlYWxsb2MKKy0odm9pZCkgZGVhbGxvYwogewotICBbbUlucHV0IHJlbGVhc2VdOwotICBbbU91dHB1dCByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOworICBbc2VsZiBjbG9zZV07CiB9CiAKLQotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW4KKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGdvdCA9IDA7Ci0gIGludCByZXQgPSAwOworICBVSW50MzIgZ290ID0gMDsKICAgd2hpbGUgKGdvdCA8IGxlbikgewotICAgIHJldCA9IFttSW5wdXQgcmVhZDogYnVmK29mZitnb3QgbWF4TGVuZ3RoOiBsZW4tZ290XTsKLSAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiJdOworCisgICAgVUludDMyIHJlYWQgPSAoVUludDMyKVtfaW5wdXQgcmVhZDpidWYrb2ZmK2dvdCBtYXhMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKHJlYWQgPD0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvck5vdE9wZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICAgIGdvdCArPSByZXQ7CisKKyAgICBnb3QgKz0gcmVhZDsKICAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIG1heExlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IDA7CisgIHdoaWxlIChnb3QgPCBsZW4pIHsKKworICAgIFVJbnQzMiByZWFkID0gKFVJbnQzMilbX2lucHV0IHJlYWQ6YnVmK29mZitnb3QgbWF4TGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChyZWFkIDw9IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGdvdCArPSByZWFkOworICB9CisKICAgcmV0dXJuIGdvdDsKIH0KIAogCi0tICh2b2lkKSB3cml0ZTogKHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6ICh1bnNpZ25lZCBpbnQpIG9mZnNldCBsZW5ndGg6ICh1bnNpZ25lZCBpbnQpIGxlbmd0aAorLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBnb3QgPSAwOwotICBpbnQgcmVzdWx0ID0gMDsKKyAgVUludDMyIGdvdCA9IDA7CisgIE5TSW50ZWdlciB0b3RhbCA9IDA7CiAgIHdoaWxlIChnb3QgPCBsZW5ndGgpIHsKLSAgICByZXN1bHQgPSBbbU91dHB1dCB3cml0ZTogZGF0YStvZmZzZXQrZ290IG1heExlbmd0aDogbGVuZ3RoLWdvdF07Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiRXJyb3Igd3JpdGluZyB0byB0cmFuc3BvcnQgb3V0cHV0IHN0cmVhbS4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogW21PdXRwdXQgc3RyZWFtRXJyb3JdXTsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjogQCJFbmQgb2Ygb3V0cHV0IHN0cmVhbS4iXTsKKworICAgIHRvdGFsID0gW19vdXRwdXQgd3JpdGU6ZGF0YStvZmZzZXQrZ290IG1heExlbmd0aDpsZW5ndGgtZ290XTsKKyAgICBpZiAodG90YWwgPT0gLTEpIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JOb3RPcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOworICAgICAgfQorICAgICAgcmV0dXJuIE5POwogICAgIH0KLSAgICBnb3QgKz0gcmVzdWx0OworICAgIGVsc2UgaWYgKHRvdGFsID09IDApIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgZ290ICs9IHRvdGFsOwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgZmx1c2gKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIC8vIG5vIGZsdXNoIGZvciB5b3UhCisgIHJldHVybiBZRVM7Cit9CisKKy0odm9pZCkgY2xvc2UKK3sKKyAgTlNJbnB1dFN0cmVhbSAqaW5wdXQgPSBzZWxmLmlucHV0OworICBpZiAoaW5wdXQpIHsKKyAgICAvLyBDbG9zZSBhbmQgcmVzZXQgaW5wdXRzdHJlYW0KKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eSgoX19icmlkZ2UgQ0ZSZWFkU3RyZWFtUmVmKShpbnB1dCksIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgICBbaW5wdXQgc2V0RGVsZWdhdGU6bmlsXTsKKyAgICBbaW5wdXQgY2xvc2VdOworICAgIFtpbnB1dCByZW1vdmVGcm9tUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBpbnB1dCA9IG5pbDsKKyAgfQorCisgIE5TT3V0cHV0U3RyZWFtICpvdXRwdXQgPSBzZWxmLm91dHB1dDsKKyAgaWYgKG91dHB1dCkgeworICAgIC8vIENsb3NlIGFuZCByZXNldCBvdXRwdXRzdHJlYW0KKyAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkoKF9fYnJpZGdlIENGV3JpdGVTdHJlYW1SZWYpKG91dHB1dCksIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgICBbb3V0cHV0IHNldERlbGVnYXRlOm5pbF07CisgICAgW291dHB1dCBjbG9zZV07CisgICAgW291dHB1dCByZW1vdmVGcm9tUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBvdXRwdXQgPSBuaWw7CisgIH0KIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDZjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVFNTTFNvY2tldFRyYW5zcG9ydCA6IFROU1N0cmVhbVRyYW5zcG9ydCA8TlNTdHJlYW1EZWxlZ2F0ZT4KKworLShpZCkgaW5pdFdpdGhIb3N0bmFtZTooTlNTdHJpbmcgKilob3N0bmFtZQorICAgICAgICAgICAgICAgICAgcG9ydDooaW50KXBvcnQKKyAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CisKKy0oQk9PTCkgaXNPcGVuOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxMjE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubQpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0IDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydC5oIgorI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgiCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaWYgIVRBUkdFVF9PU19JUEhPTkUKKyNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KKyNlbHNlCisjaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CisjZW5kaWYKKworQGludGVyZmFjZSBUU1NMU29ja2V0VHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKnNzbEhvc3RuYW1lOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBpbnQgc2Q7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVFNTTFNvY2tldFRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydAorICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcgoreworICBfc3NsSG9zdG5hbWUgPSBob3N0bmFtZTsKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKworCisgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KKyAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKKyAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisKKworCisgICAgaWYgKChocCA9IGdldGhvc3RieW5hbWUoW2hvc3RuYW1lIFVURjhTdHJpbmddKSkgPT0gTlVMTCkgeworICAgICAgTlNMb2coQCJmYWlsZWQgdG8gcmVzb2x2ZSBob3N0bmFtZSAlQCIsIGhvc3RuYW1lKTsKKyAgICAgIGhlcnJvcigicmVzb2x2Iik7CisgICAgICBpZiAoaSA9PSA5KSB7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9ySG9zdGFuYW1lUmVzb2x1dGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuaWw7CisgICAgICB9CisgICAgICBbTlNUaHJlYWQgc2xlZXBGb3JUaW1lSW50ZXJ2YWw6MC4yXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBtZW1zZXQoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOworICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIG1lbWNweSgmcGluLnNpbl9hZGRyLCBocC0+aF9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgcGluLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKyAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KKyAgaWYgKChfc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsKKyAgICBOU0xvZyhAImZhaWxlZCB0byBjcmVhdGUgc29ja2V0IGZvciBob3N0ICVAOiVkIiwgaG9zdG5hbWUsIHBvcnQpOworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvclNvY2tldENyZWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKworICAvKiBvcGVuIGEgY29ubmVjdGlvbiAqLworICBpZiAoY29ubmVjdChfc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcGluLCBzaXplb2YocGluKSkgPT0gLTEpIHsKKyAgICBOU0xvZyhAImZhaWxlZCB0byBjcmVhdGUgY29uZW5jdCB0byBob3N0ICVAOiVkIiwgaG9zdG5hbWUsIHBvcnQpOworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckNvbm5lY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKyAgICByZXR1cm4gbmlsOworICB9CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgX3NkLCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKworICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworCisgIE5TSW5wdXRTdHJlYW0gKmlucHV0U3RyZWFtOworICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtOworCisgIGlmIChyZWFkU3RyZWFtICYmIHdyaXRlU3RyZWFtKSB7CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVByb3BlcnR5U29ja2V0U2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsVExTdjEpOworCisgICAgTlNEaWN0aW9uYXJ5ICpzZXR0aW5ncyA9IEB7KF9fYnJpZGdlIE5TU3RyaW5nICopa0NGU3RyZWFtU1NMVmFsaWRhdGVzQ2VydGlmaWNhdGVDaGFpbjogQFlFU307CisKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZSZWFkU3RyZWFtUmVmKXJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZUeXBlUmVmKXNldHRpbmdzKTsKKworICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZXcml0ZVN0cmVhbVJlZil3cml0ZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGVHlwZVJlZilzZXR0aW5ncyk7CisKKyAgICBpbnB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU0lucHV0U3RyZWFtICopcmVhZFN0cmVhbTsKKyAgICBbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW2lucHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtpbnB1dFN0cmVhbSBvcGVuXTsKKworICAgIG91dHB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU091dHB1dFN0cmVhbSAqKXdyaXRlU3RyZWFtOworICAgIFtvdXRwdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBbb3V0cHV0U3RyZWFtIG9wZW5dOworCisgICAgQ0ZSZWxlYXNlKHJlYWRTdHJlYW0pOworICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7CisgIH0KKworICBzZWxmID0gW3N1cGVyIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOm91dHB1dFN0cmVhbV07CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0odm9pZCkgZGVhbGxvYworeworICBbc2VsZiBjbG9zZV07Cit9CisKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgTlNTdHJlYW1EZWxlZ2F0ZQorCistKHZvaWQpIHN0cmVhbTooTlNTdHJlYW0gKilhU3RyZWFtCisgICBoYW5kbGVFdmVudDooTlNTdHJlYW1FdmVudClldmVudENvZGUKK3sKKyAgc3dpdGNoIChldmVudENvZGUpIHsKKyAgY2FzZSBOU1N0cmVhbUV2ZW50Tm9uZToKKyAgICBicmVhazsKKworICBjYXNlIE5TU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZToKKyAgICBicmVhazsKKworICBjYXNlIE5TU3RyZWFtRXZlbnRPcGVuQ29tcGxldGVkOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEhhc1NwYWNlQXZhaWxhYmxlOiB7CisKKyAgICBCT09MIHByb2NlZWQgPSBOTzsKKyAgICBTZWNUcnVzdFJlc3VsdFR5cGUgdHJ1c3RSZXN1bHQgPSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOworICAgIENGTXV0YWJsZUFycmF5UmVmIG5ld1BvbGljaWVzID0gTlVMTDsKKworICAgIGRvIHsKKworICAgICAgU2VjVHJ1c3RSZWYgdHJ1c3QgPSAoX19icmlkZ2UgU2VjVHJ1c3RSZWYpW2FTdHJlYW0gcHJvcGVydHlGb3JLZXk6KE5TU3RyaW5nICopa0NGU3RyZWFtUHJvcGVydHlTU0xQZWVyVHJ1c3RdOworCisgICAgICAvLyBBZGQgbmV3IHBvbGljeSB0byBjdXJyZW50IGxpc3Qgb2YgcG9saWNpZXMKKyAgICAgIFNlY1BvbGljeVJlZiBwb2xpY3kgPSBTZWNQb2xpY3lDcmVhdGVTU0woTk8sIChfX2JyaWRnZSBDRlN0cmluZ1JlZikoX3NzbEhvc3RuYW1lKSk7CisgICAgICBpZiAoIXBvbGljeSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgQ0ZBcnJheVJlZiBwb2xpY2llczsKKyAgICAgIGlmIChTZWNUcnVzdENvcHlQb2xpY2llcyh0cnVzdCwgJnBvbGljaWVzKSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICAgIENGUmVsZWFzZShwb2xpY3kpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgbmV3UG9saWNpZXMgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkoTlVMTCwgMCwgcG9saWNpZXMpOworICAgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKG5ld1BvbGljaWVzLCBwb2xpY3kpOworCisgICAgICBDRlJlbGVhc2UocG9saWNpZXMpOworICAgICAgQ0ZSZWxlYXNlKHBvbGljeSk7CisKKyAgICAgIC8vIFVwZGF0ZSB0cnVzdCBwb2xpY2llcworICAgICAgaWYgKFNlY1RydXN0U2V0UG9saWNpZXModHJ1c3QsIG5ld1BvbGljaWVzKSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBFdmFsdWF0ZSB0aGUgdHJ1c3QgY2hhaW4KKyAgICAgIGlmIChTZWNUcnVzdEV2YWx1YXRlKHRydXN0LCAmdHJ1c3RSZXN1bHQpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAodHJ1c3RSZXN1bHQpIHsKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0UHJvY2VlZDoKKyAgICAgICAgLy8gTlNMb2coQCJUcnVzdGVkIGJ5IFVTRVIiKTsKKyAgICAgICAgcHJvY2VlZCA9IFlFUzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQ6CisgICAgICAgIC8vIE5TTG9nKEAiVHJ1c3RlZCBieSBPUyIpOworICAgICAgICBwcm9jZWVkID0gWUVTOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRSZWNvdmVyYWJsZVRydXN0RmFpbHVyZToKKyAgICAgICAgcHJvY2VlZCA9IHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKHRydXN0LCB0cnVzdFJlc3VsdCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdERlbnk6CisgICAgICAgIC8vIE5TTG9nKEAiRGVueSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRGYXRhbFRydXN0RmFpbHVyZToKKyAgICAgICAgLy8gTlNMb2coQCJGYXRhbFRydXN0RmFpbHVyZSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRPdGhlckVycm9yOgorICAgICAgICAvLyBOU0xvZyhAIk90aGVyRXJyb3IiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0SW52YWxpZDoKKyAgICAgICAgLy8gTlNMb2coQCJJbnZhbGlkIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBOU0xvZyhAIkRlZmF1bHQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9CisgICAgd2hpbGUgKE5PKTsKKworICAgIGlmICghcHJvY2VlZCkgeworICAgICAgTlNMb2coQCJUU1NMU29ja2V0VHJhbnNwb3J0OiBDYW5ub3QgdHJ1c3QgY2VydGlmaWNhdGUuIFJlc3VsdDogJXUiLCB0cnVzdFJlc3VsdCk7CisgICAgICBbYVN0cmVhbSBjbG9zZV07CisgICAgfQorCisgICAgaWYgKG5ld1BvbGljaWVzKSB7CisgICAgICBDRlJlbGVhc2UobmV3UG9saWNpZXMpOworICAgIH0KKworICB9CisgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6IHsKKyAgICBOU0xvZyhAIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IEVycm9yIG9jY3VycmVkIG9wZW5pbmcgc3RyZWFtOiAlQCIsIFthU3RyZWFtIHN0cmVhbUVycm9yXSk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIE5TU3RyZWFtRXZlbnRFbmRFbmNvdW50ZXJlZDoKKyAgICBicmVhazsKKyAgfQorfQorCitCT09MIHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKFNlY1RydXN0UmVmIG15VHJ1c3QsIFNlY1RydXN0UmVzdWx0VHlwZSBsYXN0VHJ1c3RSZXN1bHQpCit7CisgIENGQWJzb2x1dGVUaW1lIHRydXN0VGltZSA9IFNlY1RydXN0R2V0VmVyaWZ5VGltZShteVRydXN0KTsKKyAgQ0ZBYnNvbHV0ZVRpbWUgY3VycmVudFRpbWUgPSBDRkFic29sdXRlVGltZUdldEN1cnJlbnQoKTsKKworICBDRkFic29sdXRlVGltZSB0aW1lSW5jcmVtZW50ID0gMzE1MzYwMDA7CisgIENGQWJzb2x1dGVUaW1lIG5ld1RpbWUgPSBjdXJyZW50VGltZSAtIHRpbWVJbmNyZW1lbnQ7CisKKyAgaWYgKHRydXN0VGltZSAtIG5ld1RpbWUpIHsKKworICAgIENGRGF0ZVJlZiBuZXdEYXRlID0gQ0ZEYXRlQ3JlYXRlKE5VTEwsIG5ld1RpbWUpOworICAgIFNlY1RydXN0U2V0VmVyaWZ5RGF0ZShteVRydXN0LCBuZXdEYXRlKTsKKyAgICBDRlJlbGVhc2UobmV3RGF0ZSk7CisKKyAgICBpZiAoU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCAmbGFzdFRydXN0UmVzdWx0KSAhPSBlcnJTZWNTdWNjZXNzKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgIH0KKworICBpZiAobGFzdFRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFByb2NlZWQgfHwgbGFzdFRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFVuc3BlY2lmaWVkKSB7CisgICAgcmV0dXJuIFlFUzsKKyAgfQorCisgIE5TTG9nKEAiVFNTTFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIHJlY292ZXIgY2VydGlmaWNhdGUgdHJ1c3QgZmFpbHVyZSIpOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIGlzT3BlbgoreworICBpZiAoX3NkID4gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxN2YzOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK2V4dGVybiBOU1N0cmluZyAqVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluOworCisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IpIHsKKyAgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9ySG9zdGFuYW1lUmVzb2x1dGlvbiAgPSAtMTAwMDAsCisgIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvclNvY2tldENyZWF0ZSAgICAgICAgID0gLTEwMDAxLAorICBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JDb25uZWN0ICAgICAgICAgICAgICA9IC0xMDAwMiwKK307CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjk0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IubQpAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oIgorCisKK05TU3RyaW5nICpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW4gPSBAIlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbiI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYTk1N2QuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRTb2NrZXRDbGllbnQgOiBUTlNTdHJlYW1UcmFuc3BvcnQgewotfQotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydDsKLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ0YWY5Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbXBvcnQgIlRTb2NrZXRDbGllbnQuaCIKLQotI2lmICFUQVJHRVRfT1NfSVBIT05FCi0jaW1wb3J0IDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jZWxzZQotI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgotI2VuZGlmCi0KLUBpbXBsZW1lbnRhdGlvbiBUU29ja2V0Q2xpZW50Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0Ci17Ci0JTlNJbnB1dFN0cmVhbSAqIGlucHV0U3RyZWFtID0gTlVMTDsKLQlOU091dHB1dFN0cmVhbSAqIG91dHB1dFN0cmVhbSA9IE5VTEw7Ci0JQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOwotCUNGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOwotCUNGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXRUb0hvc3Qoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKENGU3RyaW5nUmVmKWhvc3RuYW1lLCBwb3J0LCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKLQlpZiAocmVhZFN0cmVhbSAmJiB3cml0ZVN0cmVhbSkgewotCQlDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7Ci0JCUNGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotCQkKLQkJaW5wdXRTdHJlYW0gPSAoTlNJbnB1dFN0cmVhbSAqKXJlYWRTdHJlYW07Ci0JCVtpbnB1dFN0cmVhbSByZXRhaW5dOwotCQlbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07Ci0JCVtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW2lucHV0U3RyZWFtIG9wZW5dOwotCQkKLQkJb3V0cHV0U3RyZWFtID0gKE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07Ci0JCVtvdXRwdXRTdHJlYW0gcmV0YWluXTsKLQkJW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKLQkJW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW291dHB1dFN0cmVhbSBvcGVuXTsKLQl9Ci0JCi0Jc2VsZiA9IFtzdXBlciBpbml0V2l0aElucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbV07Ci0JCi0JcmV0dXJuIHNlbGY7Ci19Ci0KLQotQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjkxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgIlROU1N0cmVhbVRyYW5zcG9ydC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVFNvY2tldFRyYW5zcG9ydCA6IFROU1N0cmVhbVRyYW5zcG9ydAorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydDsKKworLShpZCkgaW5pdFdpdGhQYXRoOihOU1N0cmluZyAqKXBhdGg7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU4YWJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW1wb3J0ICJUU29ja2V0VHJhbnNwb3J0LmgiCisKKyNpZiAhVEFSR0VUX09TX0lQSE9ORQorI2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2Vsc2UKKyNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KKworQGludGVyZmFjZSBUU29ja2V0VHJhbnNwb3J0ICgpIDxOU1N0cmVhbURlbGVnYXRlPgorQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUU29ja2V0VHJhbnNwb3J0CisKKy0gKGlkKSBpbml0V2l0aFJlYWRTdHJlYW06IChDRlJlYWRTdHJlYW1SZWYpIHJlYWRTdHJlYW0gd3JpdGVTdHJlYW06IChDRldyaXRlU3RyZWFtUmVmKSB3cml0ZVN0cmVhbQoreworICBOU0lucHV0U3RyZWFtICppbnB1dFN0cmVhbSA9IG5pbDsKKyAgTlNPdXRwdXRTdHJlYW0gKm91dHB1dFN0cmVhbSA9IG5pbDsKKworICBpZiAocmVhZFN0cmVhbSAmJiB3cml0ZVN0cmVhbSkgeworCisgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworCisgICAgaW5wdXRTdHJlYW0gPSAoX19icmlkZ2UgTlNJbnB1dFN0cmVhbSAqKXJlYWRTdHJlYW07CisgICAgW2lucHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOworICAgIFtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpOU1J1bkxvb3AuY3VycmVudFJ1bkxvb3AgZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgW2lucHV0U3RyZWFtIG9wZW5dOworCisgICAgb3V0cHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07CisgICAgW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOk5TUnVuTG9vcC5jdXJyZW50UnVuTG9vcCBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKKyAgICBbb3V0cHV0U3RyZWFtIG9wZW5dOworICB9CisgIGVsc2UgeworCisgICAgaWYgKHJlYWRTdHJlYW0pIHsKKyAgICAgIENGUmVsZWFzZShyZWFkU3RyZWFtKTsKKyAgICB9CisKKyAgICBpZiAod3JpdGVTdHJlYW0pIHsKKyAgICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7CisgICAgfQorCisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIHJldHVybiBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06b3V0cHV0U3RyZWFtXTsKK30KKworLSAoaWQpIGluaXRXaXRoSG9zdG5hbWU6IChOU1N0cmluZyAqKSBob3N0bmFtZQorICAgICAgICAgICAgICAgICAgIHBvcnQ6IChpbnQpIHBvcnQKK3sKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKyAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldFRvSG9zdChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoX19icmlkZ2UgQ0ZTdHJpbmdSZWYpaG9zdG5hbWUsIHBvcnQsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhSZWFkU3RyZWFtOnJlYWRTdHJlYW0gd3JpdGVTdHJlYW06d3JpdGVTdHJlYW1dOworfQorCistIChpZCkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAoreworICBDRlNvY2tldE5hdGl2ZUhhbmRsZSBzb2NrZmQgPSBzb2NrZXQoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAgaW50IHllcyA9IDE7CisgIGlmIChzZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzLCBzaXplb2YoeWVzKSkgPCAwKQorICB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gc2V0IFJFVVNFQUREUiBwcm9wZXJ0eSBvZiBzb2NrZXQuIik7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIE5TRGF0YSAqc2VydmVyQWRkcmVzcyA9IFtbc2VsZiBjbGFzc10gY3JlYXRlQWRkcmVzc1dpdGhQYXRoOnBhdGhdOworCisgIENGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKKyAgQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc29ja2ZkLCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKyAgaWYgKCFyZWFkU3RyZWFtIHx8ICF3cml0ZVN0cmVhbSkKKyAgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIGNyZWF0ZSByZWFkL3dyaXRlIHN0cmVhbSBwYWlyIGZvciBzb2NrZXQuIik7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGlmIChjb25uZWN0KHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKXNlcnZlckFkZHJlc3MuYnl0ZXMsIChzb2NrbGVuX3QpIHNlcnZlckFkZHJlc3MubGVuZ3RoKSA8IDApCisgIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IENvbm5lY3QgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhSZWFkU3RyZWFtOnJlYWRTdHJlYW0gd3JpdGVTdHJlYW06d3JpdGVTdHJlYW1dOworfQorCisrIChOU0RhdGEgKikgY3JlYXRlQWRkcmVzc1dpdGhQYXRoOiAoTlNTdHJpbmcgKilwYXRoCit7CisgIHN0cnVjdCBzb2NrYWRkcl91biBzZXJ2YWRkcjsKKworICBzaXplX3QgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggKyAxOworICBpZiAobnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoPiBzaXplb2Yoc2VydmFkZHIuc3VuX3BhdGgpKSB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gY3JlYXRlIHNvY2tldCBhdCBwYXRoICVALiBQYXRoIGlzIHRvbyBsb25nLiIsIHBhdGgpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICBiemVybygmc2VydmFkZHIsc2l6ZW9mKHNlcnZhZGRyKSk7CisgIHNlcnZhZGRyLnN1bl9mYW1pbHkgPSBBRl9MT0NBTDsKKyAgbWVtY3B5KHNlcnZhZGRyLnN1bl9wYXRoLCBwYXRoLlVURjhTdHJpbmcsIG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCk7CisgIHNlcnZhZGRyLnN1bl9sZW4gPSBTVU5fTEVOKCZzZXJ2YWRkcik7CisKKyAgcmV0dXJuIFtOU0RhdGEgZGF0YVdpdGhCeXRlczomc2VydmFkZHIgbGVuZ3RoOnNpemVvZihzZXJ2YWRkcildOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaAppbmRleCA2MWViYmQyLi41NThjZjYwIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCkBAIC0xNywyMCArMTcsMzIgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwogQHByb3RvY29sIFRUcmFuc3BvcnQgPE5TT2JqZWN0PgogCi0gIC8qKgotICAgKiBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIGxlbiBieXRlcyBhcmUgcmVhZAotICAgKgotICAgKiBAcGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGludG8KLSAgICogQHBhcmFtIG9mZiBJbmRleCBpbiBidWZmZXIgdG8gc3RhcnQgc3RvcmluZyBieXRlcyBhdAotICAgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGVuCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCi0gICAqLwotLSAoaW50KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoaW50KSBvZmYgbGVuZ3RoOiAoaW50KSBsZW47CisvKioKKyAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSByZWFkCisgKgorICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBpbnRvCisgKiBAcGFyYW0gb2ZmIEluZGV4IGluIGJ1ZmZlciB0byBzdGFydCBzdG9yaW5nIGJ5dGVzIGF0CisgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEByZXR1cm4gWUVTIGlmIHN1Y2NlZWRlZCwgTk8gaWYgZmFpbGVkCisgKiBAdGhyb3dzIFRUcmFuc3BvcnRFcnJvciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgKi8KKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoOworLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIG1heExlbmd0aDooVUludDMyKW1heExlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIGZsdXNoOworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKwogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGM5ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitleHRlcm4gTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckRvbWFpbjsKKworCit0eXBlZGVmIE5TX0VOVU0gKGludCwgVFRyYW5zcG9ydEVycm9yKSB7CisgIFRUcmFuc3BvcnRFcnJvclVua25vd24gICAgICAgID0gMCwKKyAgVFRyYW5zcG9ydEVycm9yTm90T3BlbiAgICAgICAgPSAxLAorICBUVHJhbnNwb3J0RXJyb3JBbHJlYWR5T3BlbiAgICA9IDIsCisgIFRUcmFuc3BvcnRFcnJvclRpbWVkT3V0ICAgICAgID0gMywKKyAgVFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlICAgICAgPSA0LAorfTsKKworCitleHRlcm4gTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckV4dGVuZGVkRXJyb3JLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckh0dHBFcnJvcktleTsKKworCit0eXBlZGVmIE5TX0VOVU0oaW50LCBUSHR0cFRyYW5zcG9ydEVycm9yKSB7CisgIFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UgID0gMTAwMSwKKyAgVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRTdGF0dXMgICAgPSAxMDAyLAorICBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb24gICA9IDEwMDMsCit9OwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXJyb3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFmMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLm0KQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9yRG9tYWluID0gQCJUVHJhbnNwb3J0RXJyb3JEb21haW4iOworCisKK05TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JFeHRlbmRlZEVycm9yS2V5ID0gQCJleHRlbmRlZEVycm9yIjsKK05TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXkgPSBAImh0dHBFcnJvciI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDlmZTIuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0KLUBpbnRlcmZhY2UgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotfQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yOwotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbjsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTY3MTQ5Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24ubQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotCi1AaW1wbGVtZW50YXRpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbgotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aFJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY3BwLzNyZHBhcnR5LnByb3BzIGIvbGliL2NwcC8zcmRwYXJ0eS5wcm9wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjhkNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC8zcmRwYXJ0eS5wcm9wcwpAQCAtMCwwICsxLDI1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiAvPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyI+CisgICAgPEJPT1NUX1JPT1Q+JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wPC9CT09TVF9ST09UPgorICAgIDxPUEVOU1NMX1JPT1RfRElSPiQoVEhJUkRfUEFSVFkpXG9wZW5zc2xcT3BlblNTTC1XaW4zMjwvT1BFTlNTTF9ST09UX0RJUj4KKyAgICA8TElCRVZFTlRfUk9PVD4kKFRISVJEX1BBUlRZKVxsaWJldmVudC0yLjAuMjEtc3RhYmxlPC9MSUJFVkVOVF9ST09UPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIC8+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIC8+CisgIDxJdGVtR3JvdXA+CisgICAgPEJ1aWxkTWFjcm8gSW5jbHVkZT0iQk9PU1RfUk9PVCI+CisgICAgICA8VmFsdWU+JChCT09TVF9ST09UKTwvVmFsdWU+CisgICAgICA8RW52aXJvbm1lbnRWYXJpYWJsZT50cnVlPC9FbnZpcm9ubWVudFZhcmlhYmxlPgorICAgIDwvQnVpbGRNYWNybz4KKyAgICA8QnVpbGRNYWNybyBJbmNsdWRlPSJPUEVOU1NMX1JPT1RfRElSIj4KKyAgICAgIDxWYWx1ZT4kKE9QRU5TU0xfUk9PVF9ESVIpPC9WYWx1ZT4KKyAgICAgIDxFbnZpcm9ubWVudFZhcmlhYmxlPnRydWU8L0Vudmlyb25tZW50VmFyaWFibGU+CisgICAgPC9CdWlsZE1hY3JvPgorICAgIDxCdWlsZE1hY3JvIEluY2x1ZGU9IkxJQkVWRU5UX1JPT1QiPgorICAgICAgPFZhbHVlPiQoTElCRVZFTlRfUk9PVCk8L1ZhbHVlPgorICAgICAgPEVudmlyb25tZW50VmFyaWFibGU+dHJ1ZTwvRW52aXJvbm1lbnRWYXJpYWJsZT4KKyAgICA8L0J1aWxkTWFjcm8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQgYi9saWIvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllYTgyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjEyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKHNyYykKKworIyBTWVNMSUJTIGNvbnRhaW5zIGxpYnJhcmllcyB0aGF0IG5lZWQgdG8gYmUgbGlua2VkIHRvIGFsbCBsaWIgdGFyZ2V0cworc2V0KFNZU0xJQlMgIiIpCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgQysrIGxpYnJhcnkKK3NldCggdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgIHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcAorICAgc3JjL3RocmlmdC9UT3V0cHV0LmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKKyAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oCisgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwCisgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCisgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKKyAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKKyAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcAorICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcAorICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKKykKKworIyBUaGVzZSBmaWxlcyBkb24ndCB3b3JrIG9uIFdpbmRvd3MgQ0UgYXMgdGhlcmUgaXMgbm8gcGlwZSBzdXBwb3J0CisjIFRPRE86IFRoZXNlIGZpbGVzIHdvbid0IHdvcmsgd2l0aCBVTklDT0RFIHN1cHBvcnQgb24gd2luZG93cy4gSWYgZml4ZWQgdGhpcyBjYW4gYmUgcmUtYWRkZWQuCitpZiAoTk9UIFdJTkNFKQorICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwCisgICAgKQorZW5kaWYoKQorCisKK2lmIChXSU4zMikKKyAgICBsaXN0KEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUworICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCisgICAgKQorICAgIGlmKE5PVCBXSU5DRSkKKyAgICAgICAgIyBUaGlzIGZpbGUgdXNlcyBwaXBlcyBzbyBpdCBjdXJyZW50bHkgd29uJ3Qgd29yayBvbiBXaW5kb3dzIENFCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwCisgICAgICAgICkKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICAjIFRoZXNlIGZpbGVzIGV2YWx1YXRlIHRvIG5vdGhpbmcgb24gV2luZG93cywgc28gb21pdCB0aGVtIGZyb20gdGhlCisgICAgIyBXaW5kb3dzIGJ1aWxkCisgICAgbGlzdChBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcAorICAgICkKK2VuZGlmKCkKKworIyBJZiBPcGVuU1NMIGlzIG5vdCBmb3VuZCBqdXN0IGlnbm9yZSB0aGUgT3BlblNTTCBzdHVmZgorZmluZF9wYWNrYWdlKE9wZW5TU0wpCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCisgICAgbGlzdCggQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcAorICAgICkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtPUEVOU1NMX0lOQ0xVREVfRElSfSIpCisgICAgbGlzdChBUFBFTkQgU1lTTElCUyAiJHtPUEVOU1NMX0xJQlJBUklFU30iKQorZW5kaWYoKQorCisjIFdJVEhfKlRIUkVBRFMgc2VsZWN0cyB3aGljaCB0aHJlYWRpbmcgbGlicmFyeSB0byB1c2UKK2lmKFVOSVggQU5EIE5PVCBXSVRIX1NURFRIUkVBRFMpCisgICAgaWYoQU5EUk9JRCkKKyAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1wdGhyZWFkIikKKyAgICBlbHNlKCkKKyAgICAgICAgbGlzdChBUFBFTkQgU1lTTElCUyBwdGhyZWFkKQorICAgIGVuZGlmKCkKKyAgICBzZXQoIHRocmlmdGNwcF90aHJlYWRzX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKKyAgICApCitlbHNlKCkKKyAgICBpZihVTklYKQorICAgICAgICBpZihBTkRST0lEKQorICAgICAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1wdGhyZWFkIikKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBsaXN0KEFQUEVORCBTWVNMSUJTIHB0aHJlYWQpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgICAgc2V0KCB0aHJpZnRjcHBfdGhyZWFkc19TT1VSQ0VTCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcAorICAgICkKK2VuZGlmKCkKKworIyBUaHJpZnQgbm9uIGJsb2NraW5nIHNlcnZlcgorc2V0KCB0aHJpZnRjcHBuYl9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCisgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcAorICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCispCisKKyMgVGhyaWZ0IHpsaWIgc2VydmVyCitzZXQoIHRocmlmdGNwcHpfU09VUkNFUworICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAorICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwCisgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKKykKKworIyBUaHJpZnQgUXQ0IHNlcnZlcgorc2V0KCB0aHJpZnRjcHBxdF9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAorICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCispCisKKyMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBBRERfTElCUkFSWV9USFJJRlQgYW5kIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQKK2luY2x1ZGUoVGhyaWZ0TWFjcm9zKQorCitBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0ICR7dGhyaWZ0Y3BwX1NPVVJDRVN9ICR7dGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFU30pCitpZihXSU4zMikKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdCAke1NZU0xJQlN9IHdzMl8zMikKK2Vsc2UoKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0ICR7U1lTTElCU30pCitlbmRpZigpCisKK2lmKFdJVEhfTElCRVZFTlQpCisgICAgZmluZF9wYWNrYWdlKExpYmV2ZW50IFJFUVVJUkVEKSAgIyBMaWJldmVudCBjb21lcyB3aXRoIENNYWtlIHN1cHBvcnQgZm9ybSB1cHN0cmVhbQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKKworICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRuYiAke3RocmlmdGNwcG5iX1NPVVJDRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0bmIgJHtTWVNMSUJTfSAke0xJQkVWRU5UX0xJQlJBUklFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdG5iIHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9aTElCKQorICAgIGZpbmRfcGFja2FnZShaTElCIFJFUVVJUkVEKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7WkxJQl9JTkNMVURFX0RJUlN9KQorCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHogJHt0aHJpZnRjcHB6X1NPVVJDRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0eiAke1NZU0xJQlN9ICR7WkxJQl9MSUJSQVJJRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnR6IHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9RVDQpCisgICAgc2V0KENNQUtFX0FVVE9NT0MgT04pCisgICAgZmluZF9wYWNrYWdlKFF0NCBSRVFVSVJFRCBDT01QT05FTlRTIFF0Q29yZSBRdE5ldHdvcmspCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHF0ICR7dGhyaWZ0Y3BwcXRfU09VUkNFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRxdCAke1NZU0xJQlN9IFF0NDo6UXRDb3JlIFF0NDo6UXROZXR3b3JrKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRxdCB0aHJpZnQpCitlbmRpZigpCisKK2lmKFdJVEhfUVQ1KQorICAgICMgUXQ1IGhhcyBpdHMgb3duIGRpcmVjdG9yeSB0byBhdm9pZCBjb25mbGljdCB3aXRoIFF0NCBjYXVzZWQgYnkgQ01BS0VfQVVUT01PQworICAgIGFkZF9zdWJkaXJlY3Rvcnkoc3JjL3RocmlmdC9xdCkKK2VuZGlmKCkKKworaWYoTVNWQykKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi1EVU5JQ09ERSAtRF9VTklDT0RFIikKK2VuZGlmKCkKKworYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19MSU1JVF9NQUNST1MiKQorCisjIEluc3RhbGwgdGhlIGhlYWRlcnMKK2luc3RhbGwoRElSRUNUT1JZICJzcmMvdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKKyAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiIFBBVFRFUk4gIioudGNjIikKKyMgQ29weSBjb25maWcuaCBmaWxlCitpbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9CSU5BUllfRElSfS90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9NYWtlZmlsZS5hbSBiL2xpYi9jcHAvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA1NzkxNDBjLi44NWJiOWFiCi0tLSBhL2xpYi9jcHAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NwcC9NYWtlZmlsZS5hbQpAQCAtMTcsMTIgKzE3LDMwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1BQ0xPQ0FMX0FNRkxBR1MgPSAtSSAuL2FjbG9jYWwKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCittb2NfJS5jcHA6ICUuaAorCSQoUVRfTU9DKSAkKFFUX0NGTEFHUykgJDwgLW8gJEAKKworbW9jX18lLmNwcDogJS5oCisJJChRVDVfTU9DKSAkKFFUNV9DRkxBR1MpICQ8IC1vICRACisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKKyMgVGhpcyBmaWxlIGlzIG5lZWRlZCBieSBjb21waWxlciB3aXRoIHBsdWdpbiwgd2hpbGUgdGVzdC9NYWtlZmlsZS5hbSBuZWVkcyBjb21waWxlcgorIyBTbyB0ZXN0IGRpcmVjdG9yeSBpcyBkaXJlY3RseSBwaWNrZWQgYnkgdG9wIGxldmVsIE1ha2VmaWxlLmFtIGZvciBwbHVnaW4gYnVpbGQKK2lmICFXSVRIX1BMVUdJTgorU1VCRElSUyArPSB0ZXN0CitlbmRpZgorZW5kaWYKIAogcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZwogCiBsaWJfTFRMSUJSQVJJRVMgPSBsaWJ0aHJpZnQubGEKIHBrZ2NvbmZpZ19EQVRBID0gdGhyaWZ0LnBjCitsaWJ0aHJpZnRfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikKK2xpYnRocmlmdF9sYV9MSUJBREQgPSAkKEJPT1NUX0xERkxBR1MpICQoT1BFTlNTTF9MREZMQUdTKSAkKE9QRU5TU0xfTElCUykKIAogIyMgV2Ugb25seSBidWlsZCB0aGUgZXh0cmEgbGlicmFyaWVzIGlmIHdlIGhhdmUgdGhlIGRlcGVuZGVuY2llcywKICMjIGJ1dCB3ZSBpbnN0YWxsIGFsbCBvZiB0aGUgaGVhZGVycyB1bmNvbmRpdGlvbmFsbHkuCkBAIC0zNCwxMjcgKzUyLDIzMSBAQAogbGliX0xUTElCUkFSSUVTICs9IGxpYnRocmlmdHoubGEKIHBrZ2NvbmZpZ19EQVRBICs9IHRocmlmdC16LnBjCiBlbmRpZgoraWYgQU1YX0hBVkVfUVQKK2xpYl9MVExJQlJBUklFUyArPSBsaWJ0aHJpZnRxdC5sYQorcGtnY29uZmlnX0RBVEEgKz0gdGhyaWZ0LXF0LnBjCitlbmRpZgoraWYgQU1YX0hBVkVfUVQ1CitsaWJfTFRMSUJSQVJJRVMgKz0gbGlidGhyaWZ0cXQ1LmxhCitwa2djb25maWdfREFUQSArPSB0aHJpZnQtcXQ1LnBjCitlbmRpZgogCi1BTV9DWFhGTEFHUyA9IC1XYWxsCi1BTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpIC1JJChzcmNkaXIpL3NyYworQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIC1JJChzcmNkaXIpL3NyYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUwogCiAjIERlZmluZSB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgbW9kdWxlCiAKLWxpYnRocmlmdF9sYV9TT1VSQ0VTID0gc3JjL1RocmlmdC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9NdXRleC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1V0aWwuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1REZW5zZVByb3RvY29sLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFNlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCitsaWJ0aHJpZnRfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVE91dHB1dC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCiAKLWxpYnRocmlmdG5iX2xhX1NPVVJDRVMgPSBzcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKK2xpYnRocmlmdF9sYV9TT1VSQ0VTICs9IHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCiAKLWxpYnRocmlmdHpfbGFfU09VUkNFUyA9IHNyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCitsaWJ0aHJpZnRuYl9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKIAorbGlidGhyaWZ0el9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcAorCisKK2xpYnRocmlmdHF0X2xhX01PQyA9IHNyYy90aHJpZnQvcXQvbW9jX1RRVGNwU2VydmVyLmNwcAorbm9kaXN0X2xpYnRocmlmdHF0X2xhX1NPVVJDRVMgPSAkKGxpYnRocmlmdHF0X2xhX01PQykKK2xpYnRocmlmdHF0X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcAorQ0xFQU5GSUxFUyA9ICQobGlidGhyaWZ0cXRfbGFfTU9DKQorCitsaWJ0aHJpZnRxdDVfbGFfTU9DID0gc3JjL3RocmlmdC9xdC9tb2NfX1RRVGNwU2VydmVyLmNwcAorbm9kaXN0X2xpYnRocmlmdHF0NV9sYV9TT1VSQ0VTID0gJChsaWJ0aHJpZnRxdDVfbGFfTU9DKQorbGlidGhyaWZ0cXQ1X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKK0NMRUFORklMRVMgKz0gJChsaWJ0aHJpZnRxdDVfbGFfTU9DKQogCiAjIEZsYWdzIGZvciB0aGUgdmFyaW91cyBsaWJyYXJpZXMKIGxpYnRocmlmdG5iX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykKIGxpYnRocmlmdHpfbGFfQ1BQRkxBR1MgID0gJChBTV9DUFBGTEFHUykgJChaTElCX0NQUEZMQUdTKQotCitsaWJ0aHJpZnRxdF9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoUVRfQ0ZMQUdTKQorbGlidGhyaWZ0cXQ1X2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChRVDVfQ0ZMQUdTKQoraWYgUVQ1X1JFRFVDRV9SRUxPQ0FUSU9OUworbGlidGhyaWZ0cXQ1X2xhX0NQUEZMQUdTICs9IC1mUElDCitlbmRpZgorbGlidGhyaWZ0bmJfbGFfQ1hYRkxBR1MgPSAkKEFNX0NYWEZMQUdTKQorbGlidGhyaWZ0el9sYV9DWFhGTEFHUyAgPSAkKEFNX0NYWEZMQUdTKQorbGlidGhyaWZ0cXRfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKK2xpYnRocmlmdHF0NV9sYV9DWFhGTEFHUyAgPSAkKEFNX0NYWEZMQUdTKQorbGlidGhyaWZ0bmJfbGFfTERGTEFHUyAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykKK2xpYnRocmlmdHpfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoWkxJQl9MSUJTKQorbGlidGhyaWZ0cXRfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoUVRfTElCUykKK2xpYnRocmlmdHF0NV9sYV9MREZMQUdTICAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykgJChRVDVfTElCUykKIAogaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdAogaW5jbHVkZV90aHJpZnRfSEVBREVSUyA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvY29uZmlnLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9UaHJpZnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL1RSZWZsZWN0aW9uTG9jYWwuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL1RQcm9jZXNzb3IuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvVExvZ2dpbmcuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdGhyaWZ0LWNvbmZpZy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RocmlmdC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RPdXRwdXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVExvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UVG9TdHJpbmcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UQmFzZS5oCiAKIGluY2x1ZGVfY29uY3VycmVuY3lkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9jb25jdXJyZW5jeQogaW5jbHVkZV9jb25jdXJyZW5jeV9IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L011dGV4LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvbmN1cnJlbmN5L1RocmVhZC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvVXRpbC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaAogCiBpbmNsdWRlX3Byb3RvY29sZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcHJvdG9jb2wKIGluY2x1ZGVfcHJvdG9jb2xfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RPbmVXYXlQcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKIAogaW5jbHVkZV90cmFuc3BvcnRkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS90cmFuc3BvcnQKIGluY2x1ZGVfdHJhbnNwb3J0X0hFQURFUlMgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RTb2NrZXQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaAogCiBpbmNsdWRlX3NlcnZlcmRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3NlcnZlcgogaW5jbHVkZV9zZXJ2ZXJfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvc2VydmVyL1RTZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCiAKIGluY2x1ZGVfcHJvY2Vzc29yZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcHJvY2Vzc29yCiBpbmNsdWRlX3Byb2Nlc3Nvcl9IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oCiAKLW5vaW5zdF9QUk9HUkFNUyA9IGNvbmN1cnJlbmN5X3Rlc3QKK2luY2x1ZGVfYXN5bmNkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9hc3luYworaW5jbHVkZV9hc3luY19IRUFERVJTID0gXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmggXAorICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCiAKLWNvbmN1cnJlbmN5X3Rlc3RfU09VUkNFUyA9IHNyYy9jb25jdXJyZW5jeS90ZXN0L1Rlc3RzLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRGYWN0b3J5VGVzdHMuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRNYW5hZ2VyVGVzdHMuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29uY3VycmVuY3kvdGVzdC9UaW1lck1hbmFnZXJUZXN0cy5oCitpbmNsdWRlX3F0ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcXQKK2luY2x1ZGVfcXRfSEVBREVSUyA9IFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaAogCi1jb25jdXJyZW5jeV90ZXN0X0xEQUREID0gbGlidGhyaWZ0LmxhCitXSU5ET1dTX0RJU1QgPSBcCisgICAgICAgICAgICAgc3JjL3RocmlmdC93aW5kb3dzIFwKKyAgICAgICAgICAgICB0aHJpZnQuc2xuIFwKKyAgICAgICAgICAgICBsaWJ0aHJpZnQudmN4cHJvaiBcCisgICAgICAgICAgICAgbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycyBcCisgICAgICAgICAgICAgbGlidGhyaWZ0bmIudmN4cHJvaiBcCisgICAgICAgICAgICAgbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzIFwKKyAgICAgICAgICAgICAzcmRwYXJ0eS5wcm9wcwogCiBFWFRSQV9ESVNUID0gXAotICAgICAgICAgICAgIFJFQURNRSBcCisgICAgICAgICAgICAgQ01ha2VMaXN0cy50eHQgXAorICAgICAgICAgICAgIGNvZGluZ19zdGFuZGFyZHMubWQgXAorICAgICAgICAgICAgIFJFQURNRS5tZCBcCiAgICAgICAgICAgICAgdGhyaWZ0LW5iLnBjLmluIFwKICAgICAgICAgICAgICB0aHJpZnQucGMuaW4gXAotICAgICAgICAgICAgIHRocmlmdC16LnBjLmluCisgICAgICAgICAgICAgdGhyaWZ0LXoucGMuaW4gXAorICAgICAgICAgICAgIHRocmlmdC1xdC5wYy5pbiBcCisgICAgICAgICAgICAgdGhyaWZ0LXF0NS5wYy5pbiBcCisgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgJChXSU5ET1dTX0RJU1QpCisKK3N0eWxlLWxvY2FsOgorCSQoQ1BQU1RZTEVfQ01EKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9SRUFETUUgYi9saWIvY3BwL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZDAxNy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLVRocmlmdCBDKysgU29mdHdhcmUgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBDKysKLT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgVGhyaWZ0IEMrKyBsaWJyYXJpZXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBHTlUgdG9vbHMuIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCi1pbiB0aGUgdG9wLWxldmVsIFJFQURNRSwgb3IgcnVuIGJvb3RzdHJhcC5zaCBpbiB0aGlzIGZvbGRlciB0byBnZW5lcmF0ZSB0aGUKLU1ha2VmaWxlcy4KLQotSW4gY2FzZSB5b3UgZG8gbm90IHdhbnQgdG8gb3BlbiBhbm90aGVyIFJFQURNRSBmaWxlLCBkbyB0aGlzOgotICAuL2Jvb3RzdHJhcC5zaAotICAuL2NvbmZpZ3VyZSAoLS13aXRoLWJvb3N0PS91c3IvbG9jYWwpCi0gIG1ha2UKLSAgc3VkbyBtYWtlIGluc3RhbGwKLQotVGhyaWZ0IGlzIGRpdmlkZWQgaW50byB0d28gbGlicmFyaWVzLgotCi1saWJ0aHJpZnQKLSAgVGhlIGNvcmUgVGhyaWZ0IGxpYnJhcnkgY29udGFpbnMgYWxsIHRoZSBjb3JlIFRocmlmdCBjb2RlLiBJdCByZXF1aXJlcwotICBib29zdCBzaGFyZWQgcG9pbnRlcnMsIHB0aHJlYWRzLCBhbmQgbGlicnQuCi0KLWxpYnRocmlmdG5iCi0gIFRoaXMgbGlicmFyeSBjb250YWlucyB0aGUgVGhyaWZ0IG5vbmJsb2NraW5nIHNlcnZlciwgd2hpY2ggdXNlcyBsaWJldmVudC4KLSAgVG8gbGluayB0aGlzIGxpYnJhcnkgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGxpbmsgbGliZXZlbnQuCi0KLUxpbmtpbmcgQWdhaW5zdCBUaHJpZnQKLT09PT09PT09PT09PT09PT09PT09PT0KLQotQWZ0ZXIgeW91IGJ1aWxkIGFuZCBpbnN0YWxsIFRocmlmdCB0aGUgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgdG8KLS91c3IvbG9jYWwvbGliIGJ5IGRlZmF1bHQuIE1ha2Ugc3VyZSB0aGlzIGlzIGluIHlvdXIgTERQQVRILgotCi1PbiBMaW51eCwgdGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgL3Vzci9sb2NhbC9saWIgaXMgaW4KLXlvdXIgL2V0Yy9sZC5zby5jb25mIGFuZCB0aGVuIHJ1biAvc2Jpbi9sZGNvbmZpZy4KLQotRGVwZW5kaW5nIHVwb24gd2hldGhlciB5b3UgYXJlIGxpbmtpbmcgZHluYW1pY2FsbHkgb3Igc3RhdGljYWxseSBhbmQgaG93Ci15b3VyIGJ1aWxkIGVudmlyb25tZW50IGl0IHNldCB1cCwgeW91IG1heSBuZWVkIHRvIGluY2x1ZGUgYWRkaXRpb25hbAotbGlicmFyaWVzIHdoZW4gbGlua2luZyBhZ2FpbnN0IHRocmlmdCwgc3VjaCBhcyBsaWJydCBhbmQvb3IgbGlicHRocmVhZC4gSWYKLXlvdSBhcmUgdXNpbmcgbGlidGhyaWZ0bmIgeW91IHdpbGwgYWxzbyBuZWVkIGxpYmV2ZW50LgotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotCi1ib29zdCBzaGFyZWQgcG9pbnRlcnMKLWh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvc21hcnRfcHRyL3NtYXJ0X3B0ci5odG0KLQotbGliZXZlbnQgKGZvciBsaWJ0aHJpZnRuYiBvbmx5KQotaHR0cDovL21vbmtleS5vcmcvfnByb3Zvcy9saWJldmVudC8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvUkVBRE1FLm1kIGIvbGliL2NwcC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTc0NGE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjk2IEBACitUaHJpZnQgQysrIFNvZnR3YXJlIExpYnJhcnkKKworIyBMaWNlbnNlCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisjIFVzaW5nIFRocmlmdCB3aXRoIEMrKworCitUaGUgVGhyaWZ0IEMrKyBsaWJyYXJpZXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBHTlUgdG9vbHMuIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCitpbiB0aGUgdG9wLWxldmVsIFJFQURNRS5tZAorCitJbiBjYXNlIHlvdSBkbyBub3Qgd2FudCB0byBvcGVuIGFub3RoZXIgUkVBRE1FLm1kIGZpbGUsIGRvIHRoaXMgdGhyaWZ0IHNyYzoKKworICAgIC4vYm9vdHN0cmFwLnNoCisgICAgLi9jb25maWd1cmUgKC0td2l0aC1ib29zdD0vdXNyL2xvY2FsKQorICAgIG1ha2UKKyAgICBzdWRvIG1ha2UgaW5zdGFsbAorCitUaHJpZnQgaXMgZGl2aWRlZCBpbnRvIHR3byBsaWJyYXJpZXMuCisKKyogbGlidGhyaWZ0IC0gVGhlIGNvcmUgVGhyaWZ0IGxpYnJhcnkgY29udGFpbnMgYWxsIHRoZSBjb3JlIFRocmlmdCBjb2RlLiBJdCByZXF1aXJlcworICBib29zdCBzaGFyZWQgcG9pbnRlcnMsIHB0aHJlYWRzLCBhbmQgbGlicnQuCisKKyogbGlidGhyaWZ0bmIgLSBUaGlzIGxpYnJhcnkgY29udGFpbnMgdGhlIFRocmlmdCBub25ibG9ja2luZyBzZXJ2ZXIsIHdoaWNoIHVzZXMgbGliZXZlbnQuCisgIFRvIGxpbmsgdGhpcyBsaWJyYXJ5IHlvdSB3aWxsIGFsc28gbmVlZCB0byBsaW5rIGxpYmV2ZW50LgorCisjIyBMaW5raW5nIEFnYWluc3QgVGhyaWZ0CisKK0FmdGVyIHlvdSBidWlsZCBhbmQgaW5zdGFsbCBUaHJpZnQgdGhlIGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHRvCisvdXNyL2xvY2FsL2xpYiBieSBkZWZhdWx0LiBNYWtlIHN1cmUgdGhpcyBpcyBpbiB5b3VyIExEUEFUSC4KKworT24gTGludXgsIHRoZSBiZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGVuc3VyZSB0aGF0IC91c3IvbG9jYWwvbGliIGlzIGluCit5b3VyIC9ldGMvbGQuc28uY29uZiBhbmQgdGhlbiBydW4gL3NiaW4vbGRjb25maWcuCisKK0RlcGVuZGluZyB1cG9uIHdoZXRoZXIgeW91IGFyZSBsaW5raW5nIGR5bmFtaWNhbGx5IG9yIHN0YXRpY2FsbHkgYW5kIGhvdworeW91ciBidWlsZCBlbnZpcm9ubWVudCBpdCBzZXQgdXAsIHlvdSBtYXkgbmVlZCB0byBpbmNsdWRlIGFkZGl0aW9uYWwKK2xpYnJhcmllcyB3aGVuIGxpbmtpbmcgYWdhaW5zdCB0aHJpZnQsIHN1Y2ggYXMgbGlicnQgYW5kL29yIGxpYnB0aHJlYWQuIElmCit5b3UgYXJlIHVzaW5nIGxpYnRocmlmdG5iIHlvdSB3aWxsIGFsc28gbmVlZCBsaWJldmVudC4KKworIyMgRGVwZW5kZW5jaWVzCisKK0lmIHlvdXIgQysrIGVudmlyb25tZW50IGltcGxlbWVudHMgQysrMTEgb3IgbGF0ZXIsIHRocmlmdCB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlCitzdGQ6OnNoYXJlZF9wdHIuICBPdGhlcndpc2UgeW91IHdpbGwgbmVlZCB0aGUgYm9vc3QgbGlicmFyeSB0byBwcm92aWRlIGEgc2hhcmVkX3B0cgoraW1wbGVtZW50YXRpb24gZm9yIEMrKyBlbnZpcm9ubWVudHMgcHJlLUMrKzExLiAgSWYgeW91IGFyZSBsaW5raW5nIGFnYWluc3QgY29kZQordGhhdCBleHBlY3RzIHRvIGJlIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyLCB5b3UgY2FuIGRlZmluZSB0aGUgcHJlcHJvY2Vzc29yCit2YXJpYWJsZSBGT1JDRV9CT09TVF9TTUFSVF9QVFIgZm9yIHlvdXIgYnVpbGQgb2YgdGhyaWZ0IHRvIG1ha2UgaXQgdXNlIGJvb3N0IGluc3RlYWQKK29mIHN0ZCBmb3IgYSBudW1iZXIgb2YgbWVtb3J5IHJlbGF0ZWQgY2xhc3Nlcy4gIFNlZSB0aHJpZnQvc3RkY3h4LmggZm9yIG1vcmUuCisKK2xpYmV2ZW50IChmb3IgbGlidGhyaWZ0bmIgb25seSkKK2h0dHA6Ly9tb25rZXkub3JnL35wcm92b3MvbGliZXZlbnQvCisKKyMgVXNpbmcgVGhyaWZ0IHdpdGggQysrIG9uIFdpbmRvd3MKKworQm90aCB0aGUgYXV0b2NvbmYgYW5kIGNtYWtlIGJ1aWxkIHN5c3RlbXMgYXJlIGFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgbWFueQorc3lzdGVtIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3BlY2lmeSBsaWJyYXJ5IGxvY2F0aW9ucywgaG93ZXZlciBpZgoreW91IHJ1biBpbnRvIHByb2JsZW1zIG9yIHdhbnQgdG8gcmVkaXJlY3QgdGhyaWZ0IHRvIGJ1aWxkIGFuZCBsaW5rIGFnYWluc3QgeW91cgorb3duIHByb3ZpZGVkIHRoaXJkIHBhcnR5IGxpYnJhcmllczoKKworQk9PU1RfUk9PVCA6IEZvciBib29zdCwgZS5nLiBEOlxib29zdF8xXzU1XzAKK09QRU5TU0xfUk9PVF9ESVIgOiBGb3IgT3BlblNTTCwgZS5nLiBEOlxPcGVuU1NMLVdpbjMyCisKK29ubHkgcmVxdWlyZWQgYnkgbGlidGhyaWZ0bmI6CisKK0xJQkVWRU5UX1JPT1RfRElSIDogRm9yIExpYmV2ZW50IGUuZy4gRDpcbGliZXZlbnQtMi4wLjIxLXN0YWJsZQorCitTZWUgLzNyZHBhcnR5LnVzZXIgZm9yIG1vcmUgZGV0YWlscy4KKworVGhlIHNhbWUgbGlua2luZyBndWlkZWxpbmVzIGRlc2NyaWJlZCBhYm92ZSBmb3IgbGlidGhyaWZ0bmIgYXBwbHkgdG8gd2luZG93cyBhcyB3ZWxsLgorCisjIyBMaW5raW5nIEFnYWluc3QgVGhyaWZ0CisKK1lvdSBuZWVkIHRvIGxpbmsgeW91ciBwcm9qZWN0IHRoYXQgdXNlcyB0aHJpZnQgYWdhaW5zdCBhbGwgdGhlIHRocmlmdAorZGVwZW5kZW5jaWVzOyBpbiB0aGUgY2FzZSBvZiBsaWJ0aHJpZnQsIGJvb3N0IGFuZCBmb3IKK2xpYnRocmlmdG5iLCBsaWJldmVudC4KKworSW4gdGhlIHByb2plY3QgcHJvcGVydGllcyB5b3UgbXVzdCBhbHNvIHNldCBIQVZFX0NPTkZJR19IIGFzIGZvcmNlIGluY2x1ZGUKK3RoZSBjb25maWcgaGVhZGVyOiAid2luZG93cy9jb25mZy5oIgorCisjIyBEZXBlbmRlbmNpZXMKKworVGhlIHNhbWUgZGVwZW5kZW5jaWVzIGZvciBzaGFyZWRfcHRyIGFzIGRlc2NyaWJlZCBhYm92ZSBhcHBseSB0byB3aW5kb3dzIGFzIHdlbGwuCisKK2Jvb3N0IHRocmVhZAoraHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvcmVsZWFzZS9kb2MvaHRtbC90aHJlYWQuaHRtbAorCitsaWJldmVudCAoZm9yIGxpYnRocmlmdG5iIG9ubHkpCitodHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50LworCisjIyBOb3RlcyBvbiBib29zdCB0aHJlYWQgKHN0YXRpYyB2cyBzaGFyZWQpOgorCitCeSBkZWZhdWx0IGxpYi9jcHAvd2luZG93cy9mb3JjZV9pbmMuaCBkZWZpbmVzOgorCisgICAgI2RlZmluZSBCT09TVF9BTExfTk9fTElCIDEKKyAgICAjZGVmaW5lIEJPT1NUX1RIUkVBRF9OT19MSUIgMQorCitUaGlzIGhhcyBmb3IgZWZmZWN0IHRvIGhhdmUgdGhlIGhvc3QgYXBwbGljYXRpb24gbGlua2luZyBhZ2FpbnN0IFRocmlmdAordG8gaGF2ZSB0byBsaW5rIHdpdGggYm9vc3QgdGhyZWFkIGFzIGEgc3RhdGljIGxpYnJhcnkuCisKK0lmIHlvdSB3YW50ZWQgaW5zdGVhZCB0byBsaW5rIHdpdGggYm9vc3QgdGhyZWFkIGFzIGEgc2hhcmVkIGxpYnJhcnksCit5b3UnbGwgbmVlZCB0byB1bmNvbW1lbnQgdGhvc2UgdHdvIGxpbmVzLCBhbmQgcmVjb21waWxlLgorCisjIyBXaW5kb3dzIHZlcnNpb24gY29tcGF0aWJpbGl0eQorCitUaGUgVGhyaWZ0IGxpYnJhcnkgdGFyZ2V0cyBXaW5kb3dzIFhQIGZvciBicm9hZGVzdCBjb21wYXRiaWxpdHkuIEEgbm90YWJsZQorZGlmZmVyZW5jZSBpcyBpbiB0aGUgV2luZG93cy1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc29ja2V0IHBvbGwKK2Z1bmN0aW9uLiBUbyB0YXJnZXQgVmlzdGEsIFdpbjcgb3Igb3RoZXIgdmVyc2lvbnMsIGNvbW1lbnQgb3V0IHRoZSBsaW5lCisKKyAgICAjZGVmaW5lIFRBUkdFVF9XSU5fWFAuCisKKyMjIE5hbWVkIFBpcGVzCisKK05hbWVkIFBpcGUgdHJhbnNwb3J0IGhhcyBiZWVuIGFkZGVkIGluIHRoZSBUUGlwZSBhbmQgVFBpcGVTZXJ2ZXIgY2xhc3Nlcy4gVGhpcworaXMgY3VycmVudGx5IFdpbmRvd3Mtb25seS4gTmFtZWQgcGlwZSB0cmFuc3BvcnQgZm9yICpOSVggaGFzIG5vdCBiZWVuCitpbXBsZW1lbnRlZC4gRG9tYWluIHNvY2tldHMgYXJlIGEgYmV0dGVyIGNob2ljZSBmb3IgbG9jYWwgSVBDIHVuZGVyIG5vbi1XaW5kb3dzCitPUydzLiAqTklYIG5hbWVkIHBpcGVzIG9ubHkgc3VwcG9ydCAxOjEgY2xpZW50LXNlcnZlciBjb25uZWN0aW9uLgorCisjIFRocmlmdC9TU0wKKworIyMgU2NvcGUKKworVGhpcyBTU0wgb25seSBzdXBwb3J0cyBibG9ja2luZyBtb2RlIHNvY2tldCBJL08uIEl0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aAorVFNpbXBsZVNlcnZlciwgVFRocmVhZGVkU2VydmVyLCBhbmQgVFRocmVhZFBvb2xTZXJ2ZXIuCisKKyMjIEltcGxlbWVudGF0aW9uCisKK1RoZXJlJ3JlIHR3byBtYWluIGNsYXNzZXMgVFNTTFNvY2tldEZhY3RvcnkgYW5kIFRTU0xTb2NrZXQuIEluc3RhbmNlcyBvZgorVFNTTFNvY2tldCBhcmUgYWx3YXlzIGNyZWF0ZWQgZnJvbSBUU1NMU29ja2V0RmFjdG9yeS4KKworUG9zaXhTU0xUaHJlYWRGYWN0b3J5IGNyZWF0ZXMgUG9zaXhTU0xUaHJlYWQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbSB0aGUKK1B0aHJlYWRUaHJlYWQgdHlwZSBpcyB0aGF0IGl0IGNsZWFudXBzIE9wZW5TU0wgZXJyb3IgcXVldWUgdXBvbiBleGl0aW5nCit0aGUgdGhyZWFkLiBJZGVhbGx5LCBPcGVuU1NMIEFQSXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gUG9zaXhTU0xUaHJlYWQuCisKKyMjIEhvdyB0byB1c2UgU1NMIEFQSXMKKworVGhpcyBpcyBmb3IgZGVtby4gSW4gcmVhbCBjb2RlLCB0eXBpY2FsbHkgb25seSBvbmUgVFNTTFNvY2tldEZhY3RvcnkKK2luc3RhbmNlIGlzIG5lZWRlZC4KKworICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGdldFNTTFNvY2tldEZhY3RvcnkoKSB7CisgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKKyAgICAgIC8vIGNsaWVudDogbG9hZCB0cnVzdGVkIGNlcnRpZmljYXRlcworICAgICAgZmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIm15LXRydXN0ZWQtY2EtY2VydGlmaWNhdGVzLnBlbSIpOworICAgICAgLy8gY2xpZW50OiBvcHRpb25hbGx5IHNldCB5b3VyIG93biBhY2Nlc3MgbWFuYWdlciwgb3RoZXJ3aXNlLAorICAgICAgLy8gICAgICAgICB0aGUgZGVmYXVsdCBjbGllbnQgYWNjZXNzIG1hbmFnZXIgd2lsbCBiZSBsb2FkZWQuCisKKyAgICAgIGZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZSgibXktY2VydGlmaWNhdGUtc2lnbmVkLWJ5LWNhLnBlbSIpOworICAgICAgZmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoIm15LXByaXZhdGUta2V5LnBlbSIpOworICAgICAgLy8gc2VydmVyOiBvcHRpb25hbGx5IHNldHVwIGFjY2VzcyBtYW5hZ2VyCisgICAgICAvLyBzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc01hbmFnZXIobmV3IE15QWNjZXNzTWFuYWdlcik7CisgICAgICAvLyBmYWN0b3J5LT5hY2Nlc3MoYWNjZXNzTWFuYWdlcik7CisgICAgICAuLi4KKyAgICB9CisKKworY2xpZW50IGNvZGUgc2FtcGxlCisKKyAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5ID0gZ2V0U1NMU29ja2V0RmFjdG9yeSgpOworICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0ID0gZmFjdG9yeS5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgc2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICAgIC4uLgorCisKK3NlcnZlciBjb2RlIHNhbXBsZQorCisgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSA9IGdldFNTTFNvY2tldEZhY3RvcnkoKTsKKyAgICBzaGFyZWRfcHRyPFRTU0xTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBmYWN0b3J5KSk7CisgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkpOworICAgIC4uLgorCisjIyBBY2Nlc3NNYW5hZ2VyCisKK0FjY2Vzc01hbmFnZXIgZGVmaW5lcyBhIGNhbGxiYWNrIGludGVyZmFjZS4gSXQgaGFzIHRocmVlIGNhbGxiYWNrIG1ldGhvZHM6CisKKyhhKSBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpOworCisoYikgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0cmluZyYgaG9zdCwgY29uc3QgY2hhciogbmFtZSwgaW50IHNpemUpOworCisoYykgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSk7CisKK0FmdGVyIFNTTCBoYW5kc2hha2UgY29tcGxldGVzLCBhZGRpdGlvbmFsIGNoZWNrcyBhcmUgY29uZHVjdGVkLiBBcHBsaWNhdGlvbgoraXMgZ2l2ZW4gdGhlIGNoYW5jZSB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gY29udGludWUgdGhlIGNvbnZlcnNhdGlvbgord2l0aCB0aGUgcmVtb3RlLiBBcHBsaWNhdGlvbiBpcyBxdWVyaWVkIHRocm91Z2ggdGhlIGFib3ZlIHRocmVlICJ2ZXJpZnkiCittZXRob2QuIFRoZXkgYXJlIGNhbGxlZCBhdCBkaWZmZXJlbnQgcG9pbnRzIG9mIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KKworRGVjaXNpb25zIGNhbiBiZSBvbmUgb2YgQUxMT1csIERFTlksIGFuZCBTS0lQLiBBTExPVyBhbmQgREVOWSBtZWFucyB0aGUKK2NvbnZlcnNhdGlvbiBzaG91bGQgYmUgY29udGludWVkIG9yIGRpc2Nvbm5lY3RlZCwgcmVzcGVjdGl2ZWx5LiBBTExPVyBhbmQKK0RFTlkgZGVjaXNpb24gc3RvcHMgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBTS0lQIG1lYW5zIHRoZXJlJ3Mgbm8gZGVjaXNpb24KK2Jhc2VkIG9uIHRoZSBnaXZlbiBpbnB1dCwgY29udGludWUgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLgorCitGaXJzdCwgKGEpIGlzIGNhbGxlZCB3aXRoIHRoZSByZW1vdGUgSVAuIEl0IGlzIGNhbGxlZCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcuCisic2EiIGlzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgcGVlci4KKworVGhlbiwgdGhlIGNlcnRpZmljYXRlIG9mIHJlbW90ZSBwZWVyIGlzIGxvYWRlZC4gU3ViamVjdEFsdE5hbWUgZXh0ZW5zaW9ucworYXJlIGV4dHJhY3RlZCBhbmQgc2VudCB0byBhcHBsaWNhdGlvbiBmb3IgdmVyaWZpY2F0aW9uLiBXaGVuIGEgRE5TCitzdWJqZWN0QWx0TmFtZSBmaWVsZCBpcyBleHRyYWN0ZWQsIChiKSBpcyBjYWxsZWQuIFdoZW4gYW4gSVAgc3ViamVjdEFsdE5hbWUKK2ZpZWxkIGlzIGV4dHJhY3RlZCwgKGMpIGlzIGNhbGxlZC4KKworVGhlICJob3N0IiBpbiAoYikgaXMgdGhlIHZhbHVlIGZyb20gVFNvY2tldDo6Z2V0SG9zdCgpIGlmIHRoaXMgaXMgYSBjbGllbnQKK3NpZGUgc29ja2V0LCBvciBUU29ja2V0OjpnZXRQZWVySG9zdCgpIGlmIHRoaXMgaXMgYSBzZXJ2ZXIgc2lkZSBzb2NrZXQuIFRoZQorcmVhc29uIGlzIGNsaWVudCBzaWRlIHNvY2tldCBpbml0aWF0ZXMgdGhlIGNvbm5lY3Rpb24uIFRTb2NrZXQ6OmdldEhvc3QoKQoraXMgdGhlIHJlbW90ZSBob3N0IG5hbWUuIE9uIHNlcnZlciBzaWRlLCB0aGUgcmVtb3RlIGhvc3QgbmFtZSBpcyB1bmtub3duCit1bmxlc3MgaXQncyByZXRyaWV2ZWQgdGhyb3VnaCBUU29ja2V0OjpnZXRQZWVySG9zdCgpLiBFaXRoZXIgd2F5LCAiaG9zdCIKK3Nob3VsZCBiZSB0aGUgcmVtb3RlIGhvc3QgbmFtZS4gS2VlcCBpbiBtaW5kLCBpZiBUU29ja2V0OjpnZXRQZWVySG9zdCgpCitmYWlsZWQsIGl0IHdvdWxkIHJldHVybiB0aGUgcmVtb3RlIGhvc3QgbmFtZSBpbiBudW1lcmljIGZvcm1hdC4KKworSWYgYWxsIHN1YmplY3RBbHROYW1lIGV4dGVuc2lvbnMgd2VyZSAic2tpcHBlZCIsIHRoZSBjb21tb24gbmFtZSBmaWVsZCB3b3VsZAorYmUgY2hlY2tlZC4gSXQgaXMgc2VudCB0byBhcHBsaWNhdGlvbiB0aHJvdWdoIChjKSwgd2hlcmUgInNhIiBpcyB0aGUgcmVtb3RlCitJUCBhZGRyZXNzLiAiZGF0YSIgaXMgdGhlIElQIGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gc3ViamVjdEFsdE5hbWUgSVAKK2V4dGVuc2lvbiwgYW5kICJzaXplIiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBleHRlbnNpb24gZGF0YS4KKworSWYgYW55IG9mIHRoZSBhYm92ZSAidmVyaWZ5IiBtZXRob2RzIHJldHVybmVkIGEgZGVjaXNpb24gQUxMT1cgb3IgREVOWSwgdGhlCit2ZXJpZmljYXRpb24gcHJvY2VzcyB3b3VsZCBiZSBzdG9wcGVkLgorCitJZiBhbnkgb2YgdGhlIGFib3ZlICJ2ZXJpZnkiIG1ldGhvZHMgcmV0dXJuZWQgU0tJUCwgdGhhdCBkZWNpc2lvbiB3b3VsZCBiZQoraWdub3JlZCBhbmQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIHdvdWxkIG1vdmUgb24gdGlsbCB0aGUgbGFzdCBpdGVtIGlzCitleGFtaW5lZC4gQXQgdGhhdCBwb2ludCwgaWYgdGhlcmUncyBzdGlsbCBubyBkZWNpc2lvbiwgdGhlIGNvbm5lY3Rpb24gaXMKK3Rlcm1pbmF0ZWQuCisKK1RocmVhZCBzYWZldHksIGFuIGFjY2VzcyBtYW5hZ2VyIHNob3VsZCBub3Qgc3RvcmUgc3RhdGUgaW5mb3JtYXRpb24gaWYgaXQncwordG8gYmUgdXNlZCBieSBtYW55IFNTTCBzb2NrZXRzLgorCisjIyBTSUdQSVBFIHNpZ25hbAorCitBcHBsaWNhdGlvbnMgcnVubmluZyBPcGVuU1NMIG92ZXIgbmV0d29yayBjb25uZWN0aW9ucyBtYXkgY3Jhc2ggaWYgU0lHUElQRQoraXMgbm90IGlnbm9yZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZXkgcmVjZWl2ZSBhIGNvbm5lY3Rpb24gcmVzZXQgYnkgcmVtb3RlCitwZWVyIGV4Y2VwdGlvbiwgd2hpY2ggc29tZWhvdyB0cmlnZ2VycyBhIFNJR1BJUEUgc2lnbmFsLiBJZiBub3QgaGFuZGxlZCwKK3RoaXMgc2lnbmFsIHdvdWxkIGtpbGwgdGhlIGFwcGxpY2F0aW9uLgorCisjIyBIb3cgdG8gcnVuIHRlc3QgY2xpZW50L3NlcnZlciBpbiBTU0wgbW9kZQorCitUaGUgc2VydmVyIGFuZCBjbGllbnQgZXhwZWN0cyB0aGUgZm9sbG93aW5ncyBmcm9tIHRoZSBkaXJlY3RvcnkgL3Rlc3QvCisKKy0ga2V5cy9zZXJ2ZXIuY3J0CistIGtleXMvc2VydmVyLmtleQorLSBrZXlzL0NBLnBlbQorCitUaGUgZmlsZSBuYW1lcyBhcmUgaGFyZCBjb2RlZCBpbiB0aGUgc291cmNlIGNvZGUuIFlvdSBuZWVkIHRvIGNyZWF0ZSB0aGVzZQorY2VydGlmaWNhdGVzIGJlZm9yZSB5b3UgY2FuIHJ1biB0aGUgdGVzdCBjb2RlIGluIFNTTCBtb2RlLiBNYWtlIHN1cmUgYXQgbGVhc3QKK29uZSBvZiB0aGUgZm9sbG93aW5ncyBpcyBpbmNsdWRlZCBpbiAia2V5cy9zZXJ2ZXIuY3J0IiwKKworLSBzdWJqZWN0QWx0TmFtZSwgRE5TIGxvY2FsaG9zdAorLSBzdWJqZWN0QWx0TmFtZSwgSVAgIDEyNy4wLjAuMQorLSBjb21tb24gbmFtZSwgICAgbG9jYWxob3N0CisKK1J1biB3aXRoaW4gL3Rlc3QvIGZvbGRlciwKKworICAgICAgICAgLi9jcHAvVGVzdFNlcnZlciAtLXNzbCAmCisgICAgICAgICAuL2NwcC9UZXN0Q2xpZW50IC0tc3NsCisKK0lmICItaCA8aG9zdD4iIGlzIHVzZWQgdG8gcnVuIGNsaWVudCwgdGhlIGFib3ZlICJsb2NhbGhvc3QiIGluIHRoZSBhYm92ZQora2V5cy9zZXJ2ZXIuY3J0IGhhcyB0byBiZSByZXBsYWNlZCB3aXRoIHRoYXQgaG9zdCBuYW1lLgorCisjIyBUU1NMU29ja2V0RmFjdG9yeTo6cmFuZG9taXplKCkKKworVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgT3BlblNTTFNvY2tldEZhY3Rvcnk6OnJhbmRvbWl6ZSgpIHNpbXBseSBjYWxscworT3BlblNTTCdzIFJBTkRfcG9sbCgpIHdoZW4gT3BlblNTTCBsaWJyYXJ5IGlzIGZpcnN0IGluaXRpYWxpemVkLgorCitUaGUgUFJORyBzZWVkIGlzIGtleSB0byB0aGUgYXBwbGljYXRpb24gc2VjdXJpdHkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQorb3ZlcnJpZGRlbiBpZiBpdCdzIG5vdCBzdHJvbmcgZW5vdWdoIGZvciB5b3UuCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjExLjAKKworT2xkZXIgdmVyc2lvbnMgb2YgdGhyaWZ0IGRlcGVuZGVkIG9uIHRoZSA8Ym9vc3Qvc21hcnRfcHRyLmhwcD4gY2xhc3NlcyB3aGljaAord2VyZSB1c2VkIGluIHRocmlmdCBoZWFkZXJzIHRvIGRlZmluZSBpbnRlcmZhY2VzLiAgVGhyaWZ0IG5vdyBkZXRlY3RzIEMrKzExCithdCBidWlsZCB0aW1lIGFuZCB3aWxsIHByZWZlciB0byB1c2UgPG1lbW9yeT4gY2xhc3NlcyBmcm9tIEMrKzExIGluc3RlYWQuCitZb3UgY2FuIGZvcmNlIHRoZSBsaWJyYXJ5IHRvIGJ1aWxkIHdpdGggYm9vc3QgbWVtb3J5IGNsYXNzZXMgYnkgZGVmaW5pbmcgdGhlCitwcmVwcm9jZXNzb3IgbWFjcm8gYEZPUkNFX0JPT1NUX1NNQVJUX1BUUmAuICAoVEhSSUZULTIyMjEpCisKK0luIHRoZSBwdGhyZWFkIG11dGV4IGltcGxlbWVudGF0aW9uLCB0aGUgY29udGVudGlvbiBwcm9maWxpbmcgY29kZSB3YXMgZW5hYmxlZAorYnkgZGVmYXVsdCBpbiBhbGwgYnVpbGRzLiAgVGhpcyBjaGFuZ2VkIHRvIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuICAoVEhSSUZULTQxNTEpCisKK0luIG9sZGVyIHJlbGVhc2VzLCBpZiBhIFRTU0xTb2NrZXRGYWN0b3J5J3MgbGlmZXRpbWUgd2FzIG5vdCBhdCBsZWFzdCBhcyBsb25nCithcyB0aGUgVFNTTFNvY2tldHMgaXQgY3JlYXRlZCwgd2Ugc2lsZW50bHkgcmV2ZXJ0ZWQgb3BlbnNzbCB0byB1bnNhZmUgbXVsdGl0aHJlYWQgYmVoYXZpb3IKK2FuZCBzbyB0aGUgcmVzdWx0cyB3ZXJlIHVuZGVmaW5lZC4gIENoYW5nZXMgd2VyZSBtYWRlIGluIDAuMTEuMCB0aGF0IGNhdXNlIGVpdGhlciBhbgorYXNzZXJ0aW9uIG9yIGEgY29yZSBpbnN0ZWFkIG9mIHVuZGVmaW5lZCBiZWhhdmlvci4gIFRoZSBsaWZldGltZSBvZiBhIFRTU0xTb2NrZXRGYWN0b3J5CisqbXVzdCogYmUgbG9uZ2VyIHRoYW4gYW55IFRTU0xTb2NrZXQgdGhhdCBpdCBjcmVhdGVzLCBvdGhlcndpc2Ugb3BlbnNzbCB3aWxsIGJlIGNsZWFuZWQKK3VwIHRvbyBlYXJseS4gIElmIHRoZSBzdGF0aWMgYm9vbGVhbiBpcyBzZXQgdG8gZGlzYWJsZSBvcGVuc3NsIGluaXRpYWxpemF0aW9uIGFuZAorY2xlYW51cCBhbmQgbGVhdmUgaXQgdXAgdG8gdGhlIGNvbnN1bWluZyBhcHBsaWNhdGlvbiwgdGhpcyByZXF1aXJlbWVudCBpcyBub3QgbmVlZGVkLgorKFRIUklGVC00MTY0KQorCmRpZmYgLS1naXQgYS9saWIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxOGM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDQgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorCisgKiBzZWUgLmNsYW5nLWZvcm1hdCBpbiByb290IGRpciBmb3Igc2V0dGluZ3Mgb2YgYWNjZXB0ZWQgZm9ybWF0CisgKiBjbGFuZy1mb3JtYXQgKDMuNSBvciBuZXdlcikgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWx5IHJlZm9ybWF0IGNvZGUgKCdtYWtlIHN0eWxlJyBjb21tYW5kKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvaiBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwOTdlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2oKQEAgLTAsMCArMSwzNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWctbXR8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWctbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnLW10fHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1Zy1tdDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlLW10fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UtbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UtbXR8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UtbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jQ2hhbm5lbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNb25pdG9yLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNdXRleC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFN0ZFRocmVhZEZhY3RvcnkuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxUaHJlYWRNYW5hZ2VyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxUaW1lck1hbmFnZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFV0aWwuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb2Nlc3NvclxQZWVrUHJvY2Vzc29yLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmFzZTY0VXRpbHMuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVidWdQcm90b2NvbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFByb3RvY29sLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTaW1wbGVTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRDb25uZWN0ZWRDbGllbnQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2VydmVyRnJhbWV3b3JrLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cENsaWVudC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cFNlcnZlci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cFRyYW5zcG9ydC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlU2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURmlsZVRyYW5zcG9ydC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU29ja2V0LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNTTFNvY2tldC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnRFeGNlcHRpb24uY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0VXRpbHMuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcR2V0VGltZU9mRGF5LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU29ja2V0UGFpci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVFdpbnNvY2tTaW5nbGV0b24uY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFdpbkZjbnRsLmNwcCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdFRocmVhZEZhY3RvcnkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcU3RkVGhyZWFkRmFjdG9yeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxFeGNlcHRpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb2Nlc3NvclxQZWVrUHJvY2Vzc29yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb2Nlc3NvclxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFREZWJ1Z1Byb3RvY29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFByb3RvY29sLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRWaXJ0dWFsUHJvdG9jb2wuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTaW1wbGVTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRocmlmdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUT3V0cHV0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRQcm9jZXNzb3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRCdWZmZXJUcmFuc3BvcnRzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURkRUcmFuc3BvcnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGaWxlVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cENsaWVudC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZVNlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNlcnZlclNvY2tldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTU0xTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnRFeGNlcHRpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnRVdGlscy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFZpcnR1YWxUcmFuc3BvcnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xHZXRUaW1lT2ZEYXkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xPcGVyYXRvcnMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFNvY2tldFBhaXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUV2luc29ja1NpbmdsZXRvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFdpbkZjbnRsLmgiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLnRjYyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4KKyAgICA8UHJvamVjdEd1aWQ+e0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn08L1Byb2plY3RHdWlkPgorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4KKyAgICA8Um9vdE5hbWVzcGFjZT50aHJpZnQ8L1Jvb3ROYW1lc3BhY2U+CisgICAgPFByb2plY3ROYW1lPmxpYnRocmlmdDwvUHJvamVjdE5hbWU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdC5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0LnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdC5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgorICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnQucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjRmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSwyODMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXA+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVE91dHB1dC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmNwcCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnRFeGNlcHRpb24uY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcR2V0VGltZU9mRGF5LmNwcCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVGhyZWFkTWFuYWdlci5jcHAiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxUaW1lck1hbmFnZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVXRpbC5jcHAiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVidWdQcm90b2NvbC5jcHAiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmFzZTY0VXRpbHMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcHAiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZEVHJhbnNwb3J0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZpbGVUcmFuc3BvcnQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwVHJhbnNwb3J0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEh0dHBDbGllbnQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cFNlcnZlci5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTU0xTb2NrZXQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0VXRpbHMuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3BwIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuY3BwIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5jcHAiPgorICAgICAgPEZpbHRlcj5wcm9jZXNzb3I8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuY3BwIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU29ja2V0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRXaW5zb2NrU2luZ2xldG9uLmNwcCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTb2NrZXRQYWlyLmNwcCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNb25pdG9yLmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0TXV0ZXguY3BwIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RUaHJlYWRGYWN0b3J5LmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFN0ZFRocmVhZEZhY3RvcnkuY3BwIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xXaW5GY250bC5jcHAiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUUGlwZS5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRQaXBlU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRCdWZmZXJUcmFuc3BvcnRzLmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuaCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRocmlmdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUUHJvY2Vzc29yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRhcmdldFZlcnNpb24uaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcRXhjZXB0aW9uLmgiPgorICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFZpcnR1YWxUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xHZXRUaW1lT2ZEYXkuaCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTZXJ2ZXJUcmFuc3BvcnQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGNvbmZpZy5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUUHJvdG9jb2wuaCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRWaXJ0dWFsUHJvdG9jb2wuaCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTaW1wbGVTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmgiPgorICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jQ2hhbm5lbC5oIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuaCI+CisgICAgICA8RmlsdGVyPnByb2Nlc3NvcjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcVE11bHRpcGxleGVkUHJvY2Vzc29yLmgiPgorICAgICAgPEZpbHRlcj5wcm9jZXNzb3I8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURmlsZVRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cENsaWVudC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cFNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU1NMU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnRVdGlscy5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2ltcGxlRmlsZVRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuaCI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRNdWx0aXBsZXhlZFByb3RvY29sLmgiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVidWdQcm90b2NvbC5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXE9wZXJhdG9ycy5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFRXaW5zb2NrU2luZ2xldG9uLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU29ja2V0UGFpci5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdFRocmVhZEZhY3RvcnkuaCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFN0ZFRocmVhZEZhY3RvcnkuaCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFBsYXRmb3JtVGhyZWFkRmFjdG9yeS5oIj4KKyAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xXaW5GY250bC5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGUuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGVTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InByb3RvY29sIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswN2NlZDE5Yi1iNzJhLTQxMDUtOWZmYi02ZDJiY2Y2NDQ5N2V9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0idHJhbnNwb3J0Ij4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntlOWY2MTQwNC0xMTQ4LTQxMDMtYmQ2Zi1lNTg2OWQzN2ZhNzl9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93cyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MjgxNDAwMmEtM2M2OC00MjdlLWIwZWItMzNhY2QyZjQwNmFlfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9ImNvbmN1cnJlbmN5Ij4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnthZGRkNDcwNy1kYmFhLTRkMGMtYmVmNi1mZmY4YmU3YjQ5NWF9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0ic2VydmVyIj4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPntmNTVhOGU5Yi02OTU5LTQ4N2YtYTM5Ni1jMzFiNGQ2YzYxZDZ9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0iYXN5bmMiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2Q1MjY4ODViLTFiM2UtNGVlMy04MDI3LWU2OTRmZTk4YWQ2M308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJwcm9jZXNzb3IiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezhmNDI4ZGE4LTVhODMtNDRmYi05NTc4LWRlOTM1ZmI0MTVlMX08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJ3aW5kb3dzXHRyMSI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZWVhMTA0MDYtMzM4MC00ZjJkLTkzNjUtYzI2ZmEyODc1ZGFlfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wudGNjIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KKyAgICA8L05vbmU+CisgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXHRyMVxmdW5jdGlvbmFsIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93c1x0cjE8L0ZpbHRlcj4KKyAgICA8L05vbmU+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qIGIvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhNmZmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2oKQEAgLTAsMCArMSwyOTggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWctbXR8V2luMzIiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWctbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnLW10fHg2NCI+CisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1Zy1tdDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPgorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlLW10fFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UtbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UtbXR8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2UtbXQ8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVGFyZ2V0VmVyc2lvbi5oIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgorICAgIDxQcm9qZWN0R3VpZD57RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfTwvUHJvamVjdEd1aWQ+CisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPgorICAgIDxSb290TmFtZXNwYWNlPmxpYnRocmlmdG5iPC9Sb290TmFtZXNwYWNlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz50cnVlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+dHJ1ZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPnRydWU8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPgorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4KKyAgICA8VXNlRGVidWdMaWJyYXJpZXM+ZmFsc2U8L1VzZURlYnVnTGlicmFyaWVzPgorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPgorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+CisgICAgPFVzZURlYnVnTGlicmFyaWVzPmZhbHNlPC9Vc2VEZWJ1Z0xpYnJhcmllcz4KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+CisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPgorICAgIDxVc2VEZWJ1Z0xpYnJhcmllcz5mYWxzZTwvVXNlRGVidWdMaWJyYXJpZXM+CisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+CisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBMYWJlbD0iUHJvcGVydHlTaGVldHMiIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CisgIDwvSW1wb3J0R3JvdXA+CisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KKyAgPC9JbXBvcnRHcm91cD4KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgorICA8L0ltcG9ydEdyb3VwPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdG5iLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0bmIucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5PgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+CisgICAgPENsQ29tcGlsZT4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0bmIucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0bmIucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8TGluaz4KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPgorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CisgICAgPC9MaW5rPgorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KKyAgICA8Q2xDb21waWxlPgorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxMaW5rPgorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+CisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4KKyAgICA8L0xpbms+CisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPgorICAgIDxDbENvbXBpbGU+CisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPgorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KKyAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CisgICAgPC9DbENvbXBpbGU+CisgICAgPExpbms+CisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPgorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgorICAgIDwvTGluaz4KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgorICA8L0ltcG9ydEdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzIGIvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3MDNkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsNzUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxJdGVtR3JvdXA+CisgICAgPEZpbHRlciBJbmNsdWRlPSJzZXJ2ZXIiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2JmNDQ5ZDkyLTRiZTgtNGY2Zi1hMDEwLWM1MzZmNTdjNmYxM308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJhc3luYyI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MDI5NGQwYTYtY2U0Ni00YmU4LWE2NTktODI2ZDZlOThhZTQxfTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9IndpbmRvd3MiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezYwZmM5ZTVlLTA4NjYtNGFiYS04NjYyLTQzOWJiNGE0NjFkM308L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgICAgPEZpbHRlciBJbmNsdWRlPSJ0cmFuc3BvcnQiPgorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezIzZmUyZmRlLWE3YzktNDNlYy1hNDA5LTdmNTNkZjVlZWU2NH08L1VuaXF1ZUlkZW50aWZpZXI+CisgICAgPC9GaWx0ZXI+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmNwcCI+CisgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuaCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5oIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmgiPgorICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVGFyZ2V0VmVyc2lvbi5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oIj4KKyAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAgYi9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjIzOGZiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxUQXBwbGljYXRpb25FeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2wuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi11aW50MzJfdCBUQXBwbGljYXRpb25FeGNlcHRpb246OnJlYWQoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSB7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotICBzdGQ6OnN0cmluZyBmbmFtZTsKLSAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsKLSAgaW50MTZfdCBmaWQ7Ci0KLSAgeGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEJlZ2luKGZuYW1lKTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsKLSAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzd2l0Y2ggKGZpZCkgewotICAgIGNhc2UgMToKLSAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HKSB7Ci0gICAgICAgIHhmZXIgKz0gaXByb3QtPnJlYWRTdHJpbmcobWVzc2FnZV8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMikgewotICAgICAgICBpbnQzMl90IHR5cGU7Ci0gICAgICAgIHhmZXIgKz0gaXByb3QtPnJlYWRJMzIodHlwZSk7Ci0gICAgICAgIHR5cGVfID0gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUpdHlwZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEVuZCgpOwotICB9Ci0KLSAgeGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEVuZCgpOwotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjp3cml0ZShhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0IHsKLSAgdWludDMyX3QgeGZlciA9IDA7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0QmVnaW4oIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOwotICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIm1lc3NhZ2UiLCBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HLCAxKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVTdHJpbmcobWVzc2FnZV8pOwotICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkRW5kKCk7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigidHlwZSIsIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIsIDIpOwotICB4ZmVyICs9IG9wcm90LT53cml0ZUkzMih0eXBlXyk7Ci0gIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRFbmQoKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsKLSAgeGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTI1YzUyLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RBUFBMSUNBVElPTkVYQ0VQVElPTl9IXwotI2RlZmluZSBfVEhSSUZUX1RBUFBMSUNBVElPTkVYQ0VQVElPTl9IXyAxCi0KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci0KLW5hbWVzcGFjZSBwcm90b2NvbCB7Ci0gIGNsYXNzIFRQcm90b2NvbDsKLX0KLQotY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogcHVibGljIFRFeGNlcHRpb24gewotIHB1YmxpYzoKLQotICAvKioKLSAgICogRXJyb3IgY29kZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGV4Y2VwdGlvbnMuCi0gICAqLwotICBlbnVtIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgewotICAgIFVOS05PV04gPSAwLAotICAgIFVOS05PV05fTUVUSE9EID0gMSwKLSAgICBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDIsCi0gICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzLAotICAgIEJBRF9TRVFVRU5DRV9JRCA9IDQsCi0gICAgTUlTU0lOR19SRVNVTFQgPSA1Ci0gIH07Ci0KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgOgotICAgIFRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQotCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUpIDoKLSAgICBURXhjZXB0aW9uKCksCi0gICAgdHlwZV8odHlwZSkge30KLQotICBUQXBwbGljYXRpb25FeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKFVOS05PV04pIHt9Ci0KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgVEV4Y2VwdGlvbihtZXNzYWdlKSwKLSAgICB0eXBlXyh0eXBlKSB7fQotCi0gIHZpcnR1YWwgflRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHRocm93KCkge30KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKLSAgICogdGhhdCBoYXMgb2NjdXJyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gRXJyb3IgY29kZQotICAgKi8KLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgewotICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7Ci0gICAgICBzd2l0Y2ggKHR5cGVfKSB7Ci0gICAgICAgIGNhc2UgVU5LTk9XTiAgICAgICAgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iOwotICAgICAgICBjYXNlIFVOS05PV05fTUVUSE9EICAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVua25vd24gbWV0aG9kIjsKLSAgICAgICAgY2FzZSBJTlZBTElEX01FU1NBR0VfVFlQRSA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnZhbGlkIG1lc3NhZ2UgdHlwZSI7Ci0gICAgICAgIGNhc2UgV1JPTkdfTUVUSE9EX05BTUUgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogV3JvbmcgbWV0aG9kIG5hbWUiOwotICAgICAgICBjYXNlIEJBRF9TRVFVRU5DRV9JRCAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEJhZCBzZXF1ZW5jZSBpZGVudGlmaWVyIjsKLSAgICAgICAgY2FzZSBNSVNTSU5HX1JFU1VMVCAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBNaXNzaW5nIHJlc3VsdCI7Ci0gICAgICAgIGRlZmF1bHQgICAgICAgICAgICAgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKLSAgICAgIH07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwotICAgIH0KLSAgfQotCi0gIHVpbnQzMl90IHJlYWQocHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpOwotICB1aW50MzJfdCB3cml0ZShwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBFcnJvciBjb2RlCi0gICAqLwotICBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGVfOwotCi19OwotCi19fSAvLyBhcGFjaGU6OnRocmlmdAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBUFBMSUNBVElPTkVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvVExvZ2dpbmcuaCBiL2xpYi9jcHAvc3JjL1RMb2dnaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjgyZGQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvVExvZ2dpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UTE9HR0lOR19IXwotI2RlZmluZSBfVEhSSUZUX1RMT0dHSU5HX0hfIDEKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0vKioKLSAqIENvbnRhaW5zIHV0aWxpdHkgbWFjcm9zIGZvciBkZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcuCi0gKgotICovCi0KLSNpZm5kZWYgSEFWRV9DTE9DS19HRVRUSU1FCi0jaW5jbHVkZSA8dGltZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURElOVF9ICi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLQotLyoqCi0gKiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPSAwOiBhbGwgZGVidWdnaW5nIHR1cm5lZCBvZmYsIGRlYnVnIG1hY3JvcyB1bmRlZmluZWQKLSAqIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA9IDE6IGFsbCBkZWJ1Z2dpbmcgdHVybmVkIG9uCi0gKi8KLSNkZWZpbmUgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMIDAKLQotCi0vKioKLSAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAwOiBhbGwgbG9nZ2luZyB0dXJuZWQgb2ZmLCBsb2dnaW5nIG1hY3JvcyB1bmRlZmluZWQKLSAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAxOiBhbGwgbG9nZ2luZyB0dXJuZWQgb24KLSAqLwotI2RlZmluZSBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMICAgMQotCi0KLS8qKgotICogU3RhbmRhcmQgd3JhcHBlciBhcm91bmQgZnByaW50ZiB3aGF0IHdpbGwgcHJlZml4IHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUKLSAqIG51bWJlciB0byB0aGUgbGluZS4gVXNlcyBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgdG8gY29udHJvbCB3aGV0aGVyIGl0IGlzCi0gKiB0dXJuZWQgb24gb3Igb2ZmLgotICoKLSAqIEBwYXJhbSBmb3JtYXRfc3RyaW5nCi0gKi8KLSNpZiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwCi0gICNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdICIgI2Zvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywjI19fVkFfQVJHU19fKTsgXAotICB9Ci0jZWxzZQotICAjZGVmaW5lIFRfREVCVUcoZm9ybWF0X3N0cmluZywuLi4pCi0jZW5kaWYKLQotCi0vKioKLSAqIGFuYWxhZ291cyB0byBUX0RFQlVHIGJ1dCBhbHNvIHByaW50cyB0aGUgdGltZQotICoKLSAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCi0gKi8KLSNpZiBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwCi0gICNkZWZpbmUgVF9ERUJVR19UKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2hhciBkYmd0aW1lWzI2XSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGN0aW1lX3IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiWyVzLCVkXSBbJXNdICIgI2Zvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyxkYmd0aW1lLCMjX19WQV9BUkdTX18pOyBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0jZWxzZQotICAjZGVmaW5lIFRfREVCVUdfVChmb3JtYXRfc3RyaW5nLC4uLikKLSNlbmRpZgotCi0KLS8qKgotICogYW5hbGFnb3VzIHRvIFRfREVCVUcgYnV0IHVzZXMgaW5wdXQgbGV2ZWwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcKLSAqIHNob3VsZCBiZSBsb2dnZWQuCi0gKgotICogQHBhcmFtIGludCAgICAgbGV2ZWw6IHNwZWNpZmllZCBkZWJ1ZyBsZXZlbAotICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogZm9ybWF0IHN0cmluZwotICovCi0jZGVmaW5lIFRfREVCVUdfTChsZXZlbCwgZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKChsZXZlbCkgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdICIgI2Zvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywjI19fVkFfQVJHU19fKTsgXAotICB9Ci0KLQotLyoqCi0gKiBFeHBsaWNpdCBlcnJvciBsb2dnaW5nLiBQcmludHMgdGltZSwgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgotICoKLSAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCi0gKi8KLSNkZWZpbmUgVF9FUlJPUihmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyIGRiZ3RpbWVbMjZdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjdGltZV9yKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcHJpbnRmKHN0ZGVyciwiWyVzLCVkXSBbJXNdIEVSUk9SOiAiICNmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sZGJndGltZSwjI19fVkFfQVJHU19fKTsgXAotICB9Ci0KLQotLyoqCi0gKiBBbmFsYWdvdXMgdG8gVF9FUlJPUiwgYWRkaXRpb25hbGx5IGFib3J0aW5nIHRoZSBwcm9jZXNzLgotICogV0FSTklORzogbWFjcm8gY2FsbHMgYWJvcnQoKSwgZW5kaW5nIHByb2dyYW0gZXhlY3V0aW9uCi0gKgotICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKLSAqLwotI2RlZmluZSBUX0VSUk9SX0FCT1JUKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgZGJndGltZVsyNl0gOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN0aW1lX3IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdIFslc10gRVJST1I6IEdvaW5nIHRvIGFib3J0ICIgI2Zvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyxkYmd0aW1lLCMjX19WQV9BUkdTX18pOyBcCi0gICAgZXhpdCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotCi0vKioKLSAqIExvZyBpbnB1dCBtZXNzYWdlCi0gKgotICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKLSAqLwotI2lmIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPiAwCi0gICNkZWZpbmUgVF9MT0dfT1BFUihmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoVF9HTE9CQUxfTE9HR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNoYXIgZGJndGltZVsyNl0gOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGN0aW1lX3IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCJbJXNdICIgI2Zvcm1hdF9zdHJpbmcgIiBcbiIsIGRiZ3RpbWUsIyNfX1ZBX0FSR1NfXyk7ICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotI2Vsc2UKLSAgI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsLi4uKQotI2VuZGlmCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVExPR0dJTkdfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1RQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL1RQcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkNTI3OS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9UUHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUFJPQ0VTU09SX0hfCi0jZGVmaW5lIF9USFJJRlRfVFBST0NFU1NPUl9IXyAxCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotLyoqCi0gKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHRoYXQgYWN0cyB1cG9uIHR3byBzdHJlYW1zIG9mIGRhdGEsIG9uZQotICogYW4gaW5wdXQgYW5kIHRoZSBvdGhlciBhbiBvdXRwdXQuIFRoZSBkZWZpbml0aW9uIG9mIHRoaXMgb2JqZWN0IGlzIGxvb3NlLAotICogdGhvdWdoIHRoZSB0eXBpY2FsIGNhc2UgaXMgZm9yIHNvbWUgc29ydCBvZiBzZXJ2ZXIgdGhhdCBlaXRoZXIgZ2VuZXJhdGVzCi0gKiByZXNwb25zZXMgdG8gYW4gaW5wdXQgc3RyZWFtIG9yIGZvcndhcmRzIGRhdGEgZnJvbSBvbmUgcGlwZSBvbnRvIGFub3RoZXIuCi0gKgotICovCi1jbGFzcyBUUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRQcm9jZXNzb3IoKSB7fQotCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpID0gMDsKLQotICBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlvKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3MoaW8sIGlvKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBUUHJvY2Vzc29yKCkge30KLX07Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9UUmVmbGVjdGlvbkxvY2FsLmggYi9saWIvY3BwL3NyYy9UUmVmbGVjdGlvbkxvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4M2U0NzUuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvVFJlZmxlY3Rpb25Mb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJFRkxFQ1RJT05MT0NBTF9IXwotI2RlZmluZSBfVEhSSUZUX1RSRUZMRUNUSU9OTE9DQUxfSF8gMQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxwcm90b2NvbC9UUHJvdG9jb2wuaD4KLQotLyoqCi0gKiBMb2NhbCBSZWZsZWN0aW9uIGlzIGEgYmxhbmtldCB0ZXJtIHJlZmVycmluZyB0byB0aGUgdGhlIHN0cnVjdHVyZQotICogYW5kIGdlbmVyYXRpb24gb2YgdGhpcyBwYXJ0aWN1bGFyIHJlcHJlc2VudGF0aW9uIG9mIFRocmlmdCB0eXBlcy4KLSAqIChJdCBpcyBjYWxsZWQgbG9jYWwgYmVjYXVzZSBpdCBjYW5ub3QgYmUgc2VyaWFsaXplZCBieSBUaHJpZnQpLgotICoKLSAqLwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSByZWZsZWN0aW9uIHsgbmFtZXNwYWNlIGxvY2FsIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZTsKLQotLy8gV2UgaW5jbHVkZSB0aGlzIG1hbnkgYnl0ZXMgb2YgdGhlIHN0cnVjdHVyZSdzIGZpbmdlcnByaW50IHdoZW4gc2VyaWFsaXppbmcKLS8vIGEgdG9wLWxldmVsIHN0cnVjdHVyZS4gIExvbmcgZW5vdWdoIHRvIG1ha2UgY29sbGlzaW9ucyB1bmxpa2VseSwgc2hvcnQKLS8vIGVub3VnaCB0byBub3Qgc2lnbmlmaWNhbnRseSBhZmZlY3QgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZC4KLWNvbnN0IGludCBGUF9QUkVGSVhfTEVOID0gNDsKLQotc3RydWN0IEZpZWxkTWV0YSB7Ci0gIGludDE2X3QgdGFnOwotICBib29sIGlzX29wdGlvbmFsOwotfTsKLQotc3RydWN0IFR5cGVTcGVjIHsKLSAgVFR5cGUgdHR5cGU7Ci0gIHVpbnQ4X3QgICAgZnBfcHJlZml4W0ZQX1BSRUZJWF9MRU5dOwotCi0gIC8vIFVzZSBhbiBhbm9ueW1vdXMgdW5pb24gaGVyZSBzbyB3ZSBjYW4gZml0IHR3byBUeXBlU3BlY3MgaW4gb25lIGNhY2hlIGxpbmUuCi0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgLy8gVXNlIHBhcmFsbGVsIGFycmF5cyBoZXJlIGZvciBkZW5zZXIgcGFja2luZyAob2YgdGhlIGFycmF5cykuCi0gICAgICBGaWVsZE1ldGEqIG1ldGFzOwotICAgICAgVHlwZVNwZWMqKiBzcGVjczsKLSAgICB9IHRzdHJ1Y3Q7Ci0gICAgc3RydWN0IHsKLSAgICAgIFR5cGVTcGVjICpzdWJ0eXBlMTsKLSAgICAgIFR5cGVTcGVjICpzdWJ0eXBlMjsKLSAgICB9IHRjb250YWluZXI7Ci0gIH07Ci0KLSAgLy8gU3RhdGljIGluaXRpYWxpemF0aW9uIG9mIHVuaW9ucyBpc24ndCByZWFsbHkgcG9zc2libGUsCi0gIC8vIHNvIHRha2UgdGhlIHBsdW5nZSBhbmQgdXNlIGNvbnN0cnVjdG9ycy4KLSAgLy8gSG9wZWZ1bGx5IHRoZXknbGwgYmUgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZS4KLQotICBUeXBlU3BlYyhUVHlwZSB0dHlwZSkgOiB0dHlwZSh0dHlwZSkgewotICAgIHN0ZDo6bWVtc2V0KGZwX3ByZWZpeCwgMCwgRlBfUFJFRklYX0xFTik7Ci0gIH0KLQotICBUeXBlU3BlYyhUVHlwZSB0dHlwZSwKLSAgICAgICAgICAgY29uc3QgdWludDhfdCogZmluZ2VycHJpbnQsCi0gICAgICAgICAgIEZpZWxkTWV0YSogbWV0YXMsCi0gICAgICAgICAgIFR5cGVTcGVjKiogc3BlY3MpIDoKLSAgICB0dHlwZSh0dHlwZSkKLSAgewotICAgIHN0ZDo6bWVtY3B5KGZwX3ByZWZpeCwgZmluZ2VycHJpbnQsIEZQX1BSRUZJWF9MRU4pOwotICAgIHRzdHJ1Y3QubWV0YXMgPSBtZXRhczsKLSAgICB0c3RydWN0LnNwZWNzID0gc3BlY3M7Ci0gIH0KLQotICBUeXBlU3BlYyhUVHlwZSB0dHlwZSwgVHlwZVNwZWMqIHN1YnR5cGUxLCBUeXBlU3BlYyogc3VidHlwZTIpIDoKLSAgICB0dHlwZSh0dHlwZSkKLSAgewotICAgIHN0ZDo6bWVtc2V0KGZwX3ByZWZpeCwgMCwgRlBfUFJFRklYX0xFTik7Ci0gICAgdGNvbnRhaW5lci5zdWJ0eXBlMSA9IHN1YnR5cGUxOwotICAgIHRjb250YWluZXIuc3VidHlwZTIgPSBzdWJ0eXBlMjsKLSAgfQotCi19OwotCi19fX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpyZWZsZWN0aW9uOjpsb2NhbAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSRUZMRUNUSU9OTE9DQUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL1RocmlmdC5jcHAgYi9saWIvY3BwL3NyYy9UaHJpZnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBhMDFiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1RocmlmdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi1UT3V0cHV0IEdsb2JhbE91dHB1dDsKLQotdm9pZCBUT3V0cHV0OjpwcmludGYoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKSB7Ci0gIC8vIFRyeSB0byByZWR1Y2UgaGVhcCB1c2FnZSwgZXZlbiBpZiBwcmludGYgaXMgY2FsbGVkIHJhcmVseS4KLSAgc3RhdGljIGNvbnN0IGludCBTVEFDS19CVUZfU0laRSA9IDI1NjsKLSAgY2hhciBzdGFja19idWZbU1RBQ0tfQlVGX1NJWkVdOwotICB2YV9saXN0IGFwOwotCi0gIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKLSAgaW50IG5lZWQgPSB2c25wcmludGYoc3RhY2tfYnVmLCBTVEFDS19CVUZfU0laRSwgbWVzc2FnZSwgYXApOwotICB2YV9lbmQoYXApOwotCi0gIGlmIChuZWVkIDwgU1RBQ0tfQlVGX1NJWkUpIHsKLSAgICBmXyhzdGFja19idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNoYXIgKmhlYXBfYnVmID0gKGNoYXIqKW1hbGxvYygobmVlZCsxKSAqIHNpemVvZihjaGFyKSk7Ci0gIGlmIChoZWFwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgLy8gTWFsbG9jIGZhaWxlZC4gIFdlIG1pZ2h0IGFzIHdlbGwgcHJpbnQgdGhlIHN0YWNrIGJ1ZmZlci4KLSAgICBmXyhzdGFja19idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKLSAgaW50IHJ2YWwgPSB2c25wcmludGYoaGVhcF9idWYsIG5lZWQrMSwgbWVzc2FnZSwgYXApOwotICB2YV9lbmQoYXApOwotICAvLyBUT0RPKHNoaWdpbik6IGluZm9ybSB1c2VyCi0gIGlmIChydmFsICE9IC0xKSB7Ci0gICAgZl8oaGVhcF9idWYpOwotICB9Ci0gIGZyZWUoaGVhcF9idWYpOwotfQotCi12b2lkIFRPdXRwdXQ6OnBlcnJvcihjb25zdCBjaGFyICptZXNzYWdlLCBpbnQgZXJybm9fY29weSkgewotICBzdGQ6OnN0cmluZyBvdXQgPSBtZXNzYWdlICsgc3RyZXJyb3JfcyhlcnJub19jb3B5KTsKLSAgZl8ob3V0LmNfc3RyKCkpOwotfQotCi1zdGQ6OnN0cmluZyBUT3V0cHV0OjpzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KSB7Ci0jaWZuZGVmIEhBVkVfU1RSRVJST1JfUgotICByZXR1cm4gImVycm5vID0gIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGVycm5vX2NvcHkpOwotI2Vsc2UgIC8vIEhBVkVfU1RSRVJST1JfUgotCi0gIGNoYXIgYl9lcnJidWZbMTAyNF0gPSB7ICdcMCcgfTsKLSNpZmRlZiBTVFJFUlJPUl9SX0NIQVJfUAotICBjaGFyICpiX2Vycm9yID0gc3RyZXJyb3JfcihlcnJub19jb3B5LCBiX2VycmJ1Ziwgc2l6ZW9mKGJfZXJyYnVmKSk7Ci0jZWxzZQotICBjaGFyICpiX2Vycm9yID0gYl9lcnJidWY7Ci0gIGludCBydiA9IHN0cmVycm9yX3IoZXJybm9fY29weSwgYl9lcnJidWYsIHNpemVvZihiX2VycmJ1ZikpOwotICBpZiAocnYgPT0gLTEpIHsKLSAgICAvLyBzdHJlcnJvcl9yIGZhaWxlZC4gIG9tZ3d0ZmJicS4KLSAgICByZXR1cm4gIlhTSS1jb21wbGlhbnQgc3RyZXJyb3JfcigpIGZhaWxlZCB3aXRoIGVycm5vID0gIiArCi0gICAgICBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihlcnJub19jb3B5KTsKLSAgfQotI2VuZGlmCi0gIC8vIENhbiBhbnlvbmUgcHJvdmUgdGhhdCBleHBsaWNpdCBjYXN0IGlzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkKLSAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIHN0cmluZyBvYmplY3QgaXMgY29uc3RydWN0ZWQgYmVmb3JlCi0gIC8vIGJfZXJyb3IgYmVjb21lcyBpbnZhbGlkPwotICByZXR1cm4gc3RkOjpzdHJpbmcoYl9lcnJvcik7Ci0KLSNlbmRpZiAgLy8gSEFWRV9TVFJFUlJPUl9SCi19Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9UaHJpZnQuaCBiL2xpYi9jcHAvc3JjL1RocmlmdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmNlMjNmLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL1RocmlmdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IXwotI2RlZmluZSBfVEhSSUZUX1RIUklGVF9IXyAxCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxleGNlcHRpb24+Ci0KLSNpbmNsdWRlICJUTG9nZ2luZy5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7Ci0KLWNsYXNzIFRPdXRwdXQgewotIHB1YmxpYzoKLSAgVE91dHB1dCgpIDogZl8oJmVycm9yVGltZVdyYXBwZXIpIHt9Ci0KLSAgaW5saW5lIHZvaWQgc2V0T3V0cHV0RnVuY3Rpb24odm9pZCAoKmZ1bmN0aW9uKShjb25zdCBjaGFyICopKXsKLSAgICBmXyA9IGZ1bmN0aW9uOwotICB9Ci0KLSAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShjb25zdCBjaGFyICptZXNzYWdlKXsKLSAgICBmXyhtZXNzYWdlKTsKLSAgfQotCi0gIC8vIEl0IGlzIGltcG9ydGFudCB0byBoYXZlIGEgY29uc3QgY2hhciogb3ZlcmxvYWQgaGVyZSBpbnN0ZWFkIG9mCi0gIC8vIGp1c3QgdGhlIHN0cmluZyB2ZXJzaW9uLCBvdGhlcndpc2UgZXJybm8gY291bGQgYmUgY29ycnVwdGVkCi0gIC8vIGlmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSBhbGxvY2F0aW5nIG1lbW9yeSB3aGVuIGNvbnN0cnVjdGluZwotICAvLyB0aGUgc3RyaW5nLgotICB2b2lkIHBlcnJvcihjb25zdCBjaGFyICptZXNzYWdlLCBpbnQgZXJybm9fY29weSk7Ci0gIGlubGluZSB2b2lkIHBlcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKLSAgICBwZXJyb3IobWVzc2FnZS5jX3N0cigpLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIHZvaWQgcHJpbnRmKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLik7Ci0KLSAgaW5saW5lIHN0YXRpYyB2b2lkIGVycm9yVGltZVdyYXBwZXIoY29uc3QgY2hhciogbXNnKSB7Ci0gICAgdGltZV90IG5vdzsKLSAgICBjaGFyIGRiZ3RpbWVbMjZdOwotICAgIHRpbWUoJm5vdyk7Ci0gICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsKLSAgICBkYmd0aW1lWzI0XSA9IDA7Ci0gICAgZnByaW50ZihzdGRlcnIsICJUaHJpZnQ6ICVzICVzXG4iLCBkYmd0aW1lLCBtc2cpOwotICB9Ci0KLSAgLyoqIEp1c3QgbGlrZSBzdHJlcnJvcl9yIGJ1dCByZXR1cm5zIGEgQysrIHN0cmluZyBvYmplY3QuICovCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgKCpmXykoY29uc3QgY2hhciAqKTsKLX07Ci0KLWV4dGVybiBUT3V0cHV0IEdsb2JhbE91dHB1dDsKLQotY2xhc3MgVEV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7Ci0gcHVibGljOgotICBURXhjZXB0aW9uKCkge30KLQotICBURXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgbWVzc2FnZV8obWVzc2FnZSkge30KLQotICB2aXJ0dWFsIH5URXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgewotICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gIkRlZmF1bHQgVEV4Y2VwdGlvbi4iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKLSAgICB9Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgc3RkOjpzdHJpbmcgbWVzc2FnZV87Ci0KLX07Ci0KLQotLy8gRm9yd2FyZCBkZWNsYXJlIHRoaXMgc3RydWN0dXJlIHVzZWQgYnkgVERlbnNlUHJvdG9jb2wKLW5hbWVzcGFjZSByZWZsZWN0aW9uIHsgbmFtZXNwYWNlIGxvY2FsIHsKLXN0cnVjdCBUeXBlU3BlYzsKLX19Ci0KLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9USFJJRlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDY2MjkuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9FWENFUFRJT05fSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9FWENFUFRJT05fSF8gMQotCi0jaW5jbHVkZSA8ZXhjZXB0aW9uPgotI2luY2x1ZGUgPFRocmlmdC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLWNsYXNzIE5vU3VjaFRhc2tFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24ge307Ci0KLWNsYXNzIFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHt9OwotCi1jbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24ge307Ci0KLWNsYXNzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKLQotY2xhc3MgVGltZWRPdXRFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24gewotcHVibGljOgotICBUaW1lZE91dEV4Y2VwdGlvbigpOlRFeGNlcHRpb24oIlRpbWVkT3V0RXhjZXB0aW9uIil7fTsKLSAgVGltZWRPdXRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UgKSA6Ci0gICAgVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQotfTsKLQotY2xhc3MgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7Ci1wdWJsaWM6Ci0gIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKTpURXhjZXB0aW9uKCJUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIil7fTsKLSAgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSApIDoKLSAgICBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9Ci19OwotCi1jbGFzcyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7Ci1wdWJsaWM6Ci0gICAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oKSB7fQotCi0gICAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICAgICAgVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGNkM2QuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9GVU5DVElPTl9SVU5ORVJfSAotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9IIDEKLQotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotI2luY2x1ZGUgInRocmlmdC9saWIvY3BwL2NvbmN1cnJlbmN5L1RocmVhZC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogQ29udmVuaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBSdW5uYWJsZSB0aGF0IHdpbGwgZXhlY3V0ZSBhcmJpdHJhcnkgY2FsbGJhY2tzLgotICogSW50ZXJmYWNlcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXB0IGJvdGggYSBnZW5lcmljICd2b2lkKHZvaWQpJyBjYWxsYmFjaywgYW5kCi0gKiBhICd2b2lkKiAodm9pZCopJyBwdGhyZWFkX2NyZWF0ZS1zdHlsZSBjYWxsYmFjay4KLSAqCi0gKiBFeGFtcGxlIHVzZToKLSAqICB2b2lkKiBteV90aHJlYWRfbWFpbih2b2lkKiBhcmcpOwotICogIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gZmFjdG9yeSA9IC4uLjsKLSAqICAvLyBUbyBjcmVhdGUgYSB0aHJlYWQgdGhhdCBleGVjdXRlcyBteV90aHJlYWRfbWFpbiBvbmNlOgotICogIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPQotICogICAgZmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+KAotICogICAgICBuZXcgRnVuY3Rpb25SdW5uZXIobXlfdGhyZWFkX21haW4sIHNvbWVfYXJndW1lbnQpKSk7Ci0gKiAgdGhyZWFkLT5zdGFydCgpOwotICoKLSAqICBib29sIEE6OmZvbygpOwotICogIEEqIGEgPSBuZXcgQSgpOwotICogIC8vIFRvIGNyZWF0ZSBhIHRocmVhZCB0aGF0IGV4ZWN1dGVzIGEuZm9vKCkgZXZlcnkgMTAwIG1pbGxpc2Vjb25kczoKLSAqICBmYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4oCi0gKiAgICBuZXcgRnVuY3Rpb25SdW5uZXIoc3RkOjp0cjE6OmJpbmQoJkE6OmZvbywgYSksIDEwMCkpKS0+c3RhcnQoKTsKLSAqCi0gKi8KLQotY2xhc3MgRnVuY3Rpb25SdW5uZXIgOiBwdWJsaWMgUnVubmFibGUgewotIHB1YmxpYzoKLSAgLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBjYWxsYmFjayAncHRocmVhZF9jcmVhdGUoKScgZXhwZWN0cy4KLSAgdHlwZWRlZiB2b2lkKiAoKlB0aHJlYWRGdW5jUHRyKSh2b2lkICphcmcpOwotICAvLyBUaGlzIGEgZnVsbHktZ2VuZXJpYyB2b2lkKHZvaWQpIGNhbGxiYWNrIGZvciBjdXN0b20gYmluZGluZ3MuCi0gIHR5cGVkZWYgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZEZ1bmM7Ci0KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6ZnVuY3Rpb248Ym9vbCgpPiBCb29sRnVuYzsKLQotICAvKioKLSAgICogR2l2ZW4gYSAncHRocmVhZF9jcmVhdGUnIHN0eWxlIGNhbGxiYWNrLCB0aGlzIEZ1bmN0aW9uUnVubmVyIHdpbGwKLSAgICogZXhlY3V0ZSB0aGUgZ2l2ZW4gY2FsbGJhY2suICBOb3RlIHRoYXQgdGhlICd2b2lkKicgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCi0gICAqLwotICBGdW5jdGlvblJ1bm5lcihQdGhyZWFkRnVuY1B0ciBmdW5jLCB2b2lkKiBhcmcpCi0gICA6IGZ1bmNfKHN0ZDo6dHIxOjpiaW5kKGZ1bmMsIGFyZykpLCByZXBGdW5jXygwKQotICB7IH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBnZW5lcmljIGNhbGxiYWNrLCB0aGlzIEZ1bmN0aW9uUnVubmVyIHdpbGwgZXhlY3V0ZSBpdC4KLSAgICovCi0gIEZ1bmN0aW9uUnVubmVyKGNvbnN0IFZvaWRGdW5jJiBjb2IpCi0gICA6IGZ1bmNfKGNvYiksIHJlcEZ1bmNfKDApCi0gIHsgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIGJvb2wgZm9vKC4uLikgdHlwZSBjYWxsYmFjaywgRnVuY3Rpb25SdW5uZXIgd2lsbCBleGVjdXRlCi0gICAqIHRoZSBjYWxsYmFjayByZXBlYXRlZGx5IHdpdGggJ2ludGVydmFsTXMnIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZSBjYWxscywKLSAgICogdW50aWwgaXQgcmV0dXJucyBmYWxzZS4gTm90ZSB0aGF0IHRoZSBhY3R1YWwgaW50ZXJ2YWwgYmV0d2VlbiBjYWxscyB3aWxsCi0gICAqIGJlIGludGVydmFsTXMgcGx1cyBleGVjdXRpb24gdGltZSBvZiB0aGUgY2FsbGJhY2suCi0gICAqLwotICBGdW5jdGlvblJ1bm5lcihjb25zdCBCb29sRnVuYyYgY29iLCBpbnQgaW50ZXJ2YWxNcykKLSAgIDogZnVuY18oMCksIHJlcEZ1bmNfKGNvYiksIGludGVydmFsTXNfKGludGVydmFsTXMpCi0gIHsgfQotCi0gIHZvaWQgcnVuKCkgewotICAgIGlmIChyZXBGdW5jXykgewotICAgICAgd2hpbGUocmVwRnVuY18oKSkgewotICAgICAgICB1c2xlZXAoaW50ZXJ2YWxNc18qMTAwMCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZ1bmNfKCk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBWb2lkRnVuYyBmdW5jXzsKLSAgQm9vbEZ1bmMgcmVwRnVuY187Ci0gIGludCBpbnRlcnZhbE1zXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9GVU5DVElPTl9SVU5ORVJfSApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk0M2VmNy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNb25pdG9yLmgiCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiVXRpbC5oIgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotdXNpbmcgYm9vc3Q6OnNjb3BlZF9wdHI7Ci0KLS8qKgotICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgUE9TSVggcHRocmVhZCBsaWJyYXJ5Ci0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgTW9uaXRvcjo6SW1wbCB7Ci0KLSBwdWJsaWM6Ci0KLSAgSW1wbCgpCi0gICAgIDogb3duZWRNdXRleF8obmV3IE11dGV4KCkpLAotICAgICAgIG11dGV4XyhOVUxMKSwKLSAgICAgICBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0gICAgaW5pdChvd25lZE11dGV4Xy5nZXQoKSk7Ci0gIH0KLQotICBJbXBsKE11dGV4KiBtdXRleCkKLSAgICAgOiBtdXRleF8oTlVMTCksCi0gICAgICAgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgewotICAgIGluaXQobXV0ZXgpOwotICB9Ci0KLSAgSW1wbChNb25pdG9yKiBtb25pdG9yKQotICAgICA6IG11dGV4XyhOVUxMKSwKLSAgICAgICBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0gICAgaW5pdCgmKG1vbml0b3ItPm11dGV4KCkpKTsKLSAgfQotCi0gIH5JbXBsKCkgeyBjbGVhbnVwKCk7IH0KLQotICBNdXRleCYgbXV0ZXgoKSB7IHJldHVybiAqbXV0ZXhfOyB9Ci0gIHZvaWQgbG9jaygpIHsgbXV0ZXgoKS5sb2NrKCk7IH0KLSAgdm9pZCB1bmxvY2soKSB7IG11dGV4KCkudW5sb2NrKCk7IH0KLQotICB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0KSBjb25zdCB7Ci0gICAgYXNzZXJ0KG11dGV4Xyk7Ci0gICAgcHRocmVhZF9tdXRleF90KiBtdXRleEltcGwgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxwdGhyZWFkX211dGV4X3QqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOwotICAgIGFzc2VydChtdXRleEltcGwpOwotCi0gICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKLSAgICBhc3NlcnQodGltZW91dCA+PSAwTEwpOwotICAgIGlmICh0aW1lb3V0ID09IDBMTCkgewotICAgICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfd2FpdCgmcHRocmVhZF9jb25kXywgbXV0ZXhJbXBsKTsKLSAgICAgIGFzc2VydChpcmV0ID09IDApOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKLSAgICAgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICAgIFV0aWw6OnRvVGltZXNwZWMoYWJzdGltZSwgbm93ICsgdGltZW91dCk7Ci0gICAgICBpbnQgcmVzdWx0ID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmcHRocmVhZF9jb25kXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4SW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhYnN0aW1lKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gRVRJTUVET1VUKSB7Ci0gICAgICAgIC8vIHB0aHJlYWRfY29uZF90aW1lZHdhaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdG8gcmV0dXJuIGVhcmx5IG9uCi0gICAgICAgIC8vIHZhcmlvdXMgcGxhdGZvcm1zLCBzbyBjb21tZW50IG91dCB0aGlzIGFzc2VydC4KLSAgICAgICAgLy9hc3NlcnQoVXRpbDo6Y3VycmVudFRpbWUoKSA+PSAobm93ICsgdGltZW91dCkpOwotICAgICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgbm90aWZ5KCkgewotICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4Ci0gICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZwdGhyZWFkX2NvbmRfKTsKLSAgICBhc3NlcnQoaXJldCA9PSAwKTsKLSAgfQotCi0gIHZvaWQgbm90aWZ5QWxsKCkgewotICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4Ci0gICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZwdGhyZWFkX2NvbmRfKTsKLSAgICBhc3NlcnQoaXJldCA9PSAwKTsKLSAgfQotCi0gcHJpdmF0ZToKLQotICB2b2lkIGluaXQoTXV0ZXgqIG11dGV4KSB7Ci0gICAgbXV0ZXhfID0gbXV0ZXg7Ci0KLSAgICBpZiAocHRocmVhZF9jb25kX2luaXQoJnB0aHJlYWRfY29uZF8sIE5VTEwpID09IDApIHsKLSAgICAgIGNvbmRJbml0aWFsaXplZF8gPSB0cnVlOwotICAgIH0KLQotICAgIGlmICghY29uZEluaXRpYWxpemVkXykgewotICAgICAgY2xlYW51cCgpOwotICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGNsZWFudXAoKSB7Ci0gICAgaWYgKGNvbmRJbml0aWFsaXplZF8pIHsKLSAgICAgIGNvbmRJbml0aWFsaXplZF8gPSBmYWxzZTsKLSAgICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koJnB0aHJlYWRfY29uZF8pOwotICAgICAgYXNzZXJ0KGlyZXQgPT0gMCk7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVkX3B0cjxNdXRleD4gb3duZWRNdXRleF87Ci0gIE11dGV4KiBtdXRleF87Ci0KLSAgbXV0YWJsZSBwdGhyZWFkX2NvbmRfdCBwdGhyZWFkX2NvbmRfOwotICBtdXRhYmxlIGJvb2wgY29uZEluaXRpYWxpemVkXzsKLX07Ci0KLU1vbml0b3I6Ok1vbml0b3IoKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKCkpIHt9Ci1Nb25pdG9yOjpNb25pdG9yKE11dGV4KiBtdXRleCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtdXRleCkpIHt9Ci1Nb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHt9Ci0KLU1vbml0b3I6On5Nb25pdG9yKCkgeyBkZWxldGUgaW1wbF87IH0KLQotTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPm11dGV4KCk7IH0KLQotdm9pZCBNb25pdG9yOjpsb2NrKCkgY29uc3QgeyBpbXBsXy0+bG9jaygpOyB9Ci0KLXZvaWQgTW9uaXRvcjo6dW5sb2NrKCkgY29uc3QgeyBpbXBsXy0+dW5sb2NrKCk7IH0KLQotdm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeyBpbXBsXy0+d2FpdCh0aW1lb3V0KTsgfQotCi12b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsgaW1wbF8tPm5vdGlmeSgpOyB9Ci0KLXZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgeyBpbXBsXy0+bm90aWZ5QWxsKCk7IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTW9uaXRvci5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTW9uaXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkxMTlkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L01vbml0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfIDEKLQotI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgIk11dGV4LmgiCi0KLSNpbmNsdWRlIDxib29zdC91dGlsaXR5LmhwcD4KLQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogQSBtb25pdG9yIGlzIGEgY29tYmluYXRpb24gbXV0ZXggYW5kIGNvbmRpdGlvbi1ldmVudC4gIFdhaXRpbmcgYW5kCi0gKiBub3RpZnlpbmcgY29uZGl0aW9uIGV2ZW50cyByZXF1aXJlcyB0aGF0IHRoZSBjYWxsZXIgb3duIHRoZSBtdXRleC4gIE11dGV4Ci0gKiBsb2NrIGFuZCB1bmxvY2sgb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIGluZGVwZW5kZW50bHkgb2YgY29uZGl0aW9uCi0gKiBldmVudHMuICBUaGlzIGlzIG1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLk9iamVjdCBtdWx0aS10aHJlYWQKLSAqIG9wZXJhdGlvbnMuCi0gKgotICogTm90ZSB0aGUgTW9uaXRvciBjYW4gY3JlYXRlIGEgbmV3LCBpbnRlcm5hbCBtdXRleDsgYWx0ZXJuYXRpdmVseSwgYQotICogc2VwYXJhdGUgTXV0ZXggY2FuIGJlIHBhc3NlZCBpbiBhbmQgdGhlIE1vbml0b3Igd2lsbCByZS11c2UgaXQgd2l0aG91dAotICogdGFraW5nIG93bmVyc2hpcC4gIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGUKLSAqIE11dGV4IGlzIG5vdCBkZWFsbG9jYXRlZCBiZWZvcmUgdGhlIE1vbml0b3IuCi0gKgotICogTm90ZSB0aGF0IGFsbCBtZXRob2RzIGFyZSBjb25zdC4gIE1vbml0b3JzIGltcGxlbWVudCBsb2dpY2FsIGNvbnN0bmVzcywgbm90Ci0gKiBiaXQgY29uc3RuZXNzLiAgVGhpcyBhbGxvd3MgY29uc3QgbWV0aG9kcyB0byBjYWxsIG1vbml0b3IgbWV0aG9kcyB3aXRob3V0Ci0gKiBuZWVkaW5nIHRvIGNhc3QgYXdheSBjb25zdG5lc3Mgb3IgY2hhbmdlIHRvIG5vbi1jb25zdCBzaWduYXR1cmVzLgotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE1vbml0b3IgOiBib29zdDo6bm9uY29weWFibGUgewotIHB1YmxpYzoKLSAgLyoqIENyZWF0ZXMgYSBuZXcgbXV0ZXgsIGFuZCB0YWtlcyBvd25lcnNoaXAgb2YgaXQuICovCi0gIE1vbml0b3IoKTsKLQotICAvKiogVXNlcyB0aGUgcHJvdmlkZWQgbXV0ZXggd2l0aG91dCB0YWtpbmcgb3duZXJzaGlwLiAqLwotICBleHBsaWNpdCBNb25pdG9yKE11dGV4KiBtdXRleCk7Ci0KLSAgLyoqIFVzZXMgdGhlIG11dGV4IGluc2lkZSB0aGUgcHJvdmlkZWQgTW9uaXRvciB3aXRob3V0IHRha2luZyBvd25lcnNoaXAuICovCi0gIGV4cGxpY2l0IE1vbml0b3IoTW9uaXRvciogbW9uaXRvcik7Ci0KLSAgLyoqIERlYWxsb2NhdGVzIHRoZSBtdXRleCBvbmx5IGlmIHdlIG93biBpdC4gKi8KLSAgdmlydHVhbCB+TW9uaXRvcigpOwotCi0gIE11dGV4JiBtdXRleCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCBsb2NrKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkIHVubG9jaygpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dD0wTEwpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCBub3RpZnkoKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgbm90aWZ5QWxsKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotCi0gIGNsYXNzIEltcGw7Ci0KLSAgSW1wbCogaW1wbF87Ci19OwotCi1jbGFzcyBTeW5jaHJvbml6ZWQgewotIHB1YmxpYzoKLSBTeW5jaHJvbml6ZWQoY29uc3QgTW9uaXRvciogbW9uaXRvcikgOiBnKG1vbml0b3ItPm11dGV4KCkpIHsgfQotIFN5bmNocm9uaXplZChjb25zdCBNb25pdG9yJiBtb25pdG9yKSA6IGcobW9uaXRvci5tdXRleCgpKSB7IH0KLQotIHByaXZhdGU6Ci0gIEd1YXJkIGc7Ci19OwotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9NdXRleC5jcHAgYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9NdXRleC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNzE3MTAuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTXV0ZXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIk11dGV4LmgiCi0jaW5jbHVkZSAiVXRpbC5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotCi1zdGF0aWMgc2lnX2F0b21pY190IG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IDA7Ci1zdGF0aWMgTXV0ZXhXYWl0Q2FsbGJhY2sgbXV0ZXhQcm9maWxpbmdDYWxsYmFjayA9IDA7Ci0KLXZvbGF0aWxlIHN0YXRpYyBzaWdfYXRvbWljX3QgbXV0ZXhQcm9maWxpbmdDb3VudGVyID0gMDsKLQotdm9pZCBlbmFibGVNdXRleFByb2ZpbGluZyhpbnQzMl90IHByb2ZpbGluZ1NhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4V2FpdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gIG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IHByb2ZpbGluZ1NhbXBsZVJhdGU7Ci0gIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2sgPSBjYWxsYmFjazsKLX0KLQotI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKSBcCi0gICAgaW50NjRfdCBfbG9ja19zdGFydFRpbWUgPSBtYXliZUdldFByb2ZpbGluZ1N0YXJ0VGltZSgpOwotCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpIFwKLSAgZG8geyBcCi0gICAgaWYgKF9sb2NrX3N0YXJ0VGltZSA+IDApIHsgXAotICAgICAgaW50NjRfdCBlbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCk7IFwKLSAgICAgICgqbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykodGhpcywgZW5kVGltZSAtIF9sb2NrX3N0YXJ0VGltZSk7IFwKLSAgICB9IFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpIFwKLSAgZG8geyBcCi0gICAgcHJvZmlsZVRpbWVfID0gX2xvY2tfc3RhcnRUaW1lOyBcCi0gICAgaWYgKHByb2ZpbGVUaW1lXyA+IDApIHsgXAotICAgICAgcHJvZmlsZVRpbWVfID0gVXRpbDo6Y3VycmVudFRpbWVVc2VjKCkgLSBwcm9maWxlVGltZV87IFwKLSAgICB9IFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpIFwKLSAgaW50NjRfdCBfdGVtcF9wcm9maWxlVGltZSA9IHByb2ZpbGVUaW1lXzsgXAotICBwcm9maWxlVGltZV8gPSAwOwotCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKSBcCi0gIGRvIHsgXAotICAgIGlmIChfdGVtcF9wcm9maWxlVGltZSA+IDApIHsgXAotICAgICAgKCptdXRleFByb2ZpbGluZ0NhbGxiYWNrKSh0aGlzLCBfdGVtcF9wcm9maWxlVGltZSk7IFwKLSAgICB9IFwKLSAgfSB3aGlsZSAoMCkKLQotc3RhdGljIGlubGluZSBpbnQ2NF90IG1heWJlR2V0UHJvZmlsaW5nU3RhcnRUaW1lKCkgewotICBpZiAobXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlICYmIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2spIHsKLSAgICAvLyBUaGlzIGJsb2NrIGlzIHVuc3luY2hyb25pemVkLCBidXQgc2hvdWxkIHByb2R1Y2UgYSByZWFzb25hYmxlIHNhbXBsaW5nCi0gICAgLy8gcmF0ZSBvbiBtb3N0IGFyY2hpdGVjdHVyZXMuICBUaGUgbWFpbiByYWNlIGNvbmRpdGlvbnMgYXJlIHRoZSBnYXAKLSAgICAvLyBiZXR3ZWVuIHRoZSBkZWNyZW1lbnQgYW5kIHRoZSB0ZXN0LCB0aGUgbm9uLWF0b21pY2l0eSBvZiBkZWNyZW1lbnQsIGFuZAotICAgIC8vIHBvdGVudGlhbCBjYWNoaW5nIG9mIGRpZmZlcmVudCB2YWx1ZXMgYXQgZGlmZmVyZW50IENQVXMuCi0gICAgLy8KLSAgICAvLyAtIGlmIHR3byBkZWNyZW1lbnRzIHJhY2UsIHRoZSBsaWtlbGllc3QgcmVzdWx0IGlzIHRoYXQgdGhlIGNvdW50ZXIKLSAgICAvLyAgICAgIGRlY3JlbWVudHMgc2xvd2x5IChwZXJoYXBzIG11Y2ggbW9yZSBzbG93bHkpIHRoYW4gaW50ZW5kZWQuCi0gICAgLy8KLSAgICAvLyAtIG1hbnkgdGhyZWFkcyBjb3VsZCBwb3RlbnRpYWxseSBkZWNyZW1lbnQgYmVmb3JlIHJlc2V0dGluZyB0aGUgY291bnRlcgotICAgIC8vICAgICAgdG8gaXRzIGxhcmdlIHZhbHVlLCBjYXVzaW5nIGVhY2ggYWRkaXRpb25hbCBpbmNvbWluZyB0aHJlYWQgdG8KLSAgICAvLyAgICAgIHByb2ZpbGUgZXZlcnkgY2FsbC4gIFRoaXMgc2l0dWF0aW9uIGlzIHVubGlrZWx5IHRvIHBlcnNpc3QgZm9yIGxvbmcKLSAgICAvLyAgICAgIGFzIHRoZSBjcml0aWNhbCBnYXAgaXMgcXVpdGUgc2hvcnQsIGJ1dCBwcm9maWxpbmcgY291bGQgYmUgYnVyc3R5LgotICAgIHNpZ19hdG9taWNfdCBsb2NhbFZhbHVlID0gLS1tdXRleFByb2ZpbGluZ0NvdW50ZXI7Ci0gICAgaWYgKGxvY2FsVmFsdWUgPD0gMCkgewotICAgICAgbXV0ZXhQcm9maWxpbmdDb3VudGVyID0gbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlOwotICAgICAgcmV0dXJuIFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0jZWxzZQotIyAgZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCkKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKQotIyAgZGVmaW5lIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKQotI2VuZGlmIC8vIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIFBPU0lYIG11dGV4Ci0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgTXV0ZXg6OmltcGwgewotIHB1YmxpYzoKLSAgaW1wbChJbml0aWFsaXplciBpbml0KSA6IGluaXRpYWxpemVkXyhmYWxzZSkgewotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLSAgICBwcm9maWxlVGltZV8gPSAwOwotI2VuZGlmCi0gICAgaW5pdCgmcHRocmVhZF9tdXRleF8pOwotICAgIGluaXRpYWxpemVkXyA9IHRydWU7Ci0gIH0KLQotICB+aW1wbCgpIHsKLSAgICBpZiAoaW5pdGlhbGl6ZWRfKSB7Ci0gICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKLSAgICAgIGludCByZXQgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnB0aHJlYWRfbXV0ZXhfKTsKLSAgICAgIGFzc2VydChyZXQgPT0gMCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb2NrKCkgY29uc3QgewotICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcHRocmVhZF9tdXRleF8pOwotICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7Ci0gIH0KLQotICBib29sIHRyeWxvY2soKSBjb25zdCB7IHJldHVybiAoMCA9PSBwdGhyZWFkX211dGV4X3RyeWxvY2soJnB0aHJlYWRfbXV0ZXhfKSk7IH0KLQotICBib29sIHRpbWVkbG9jayhpbnQ2NF90IG1pbGxpc2Vjb25kcykgY29uc3QgewotI2lmIGRlZmluZWQoX1BPU0lYX1RJTUVPVVRTKSAmJiBfUE9TSVhfVElNRU9VVFMgPj0gMjAwMTEyTAotICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotCi0gICAgc3RydWN0IHRpbWVzcGVjIHRzOwotICAgIFV0aWw6OnRvVGltZXNwZWModHMsIG1pbGxpc2Vjb25kcyk7Ci0gICAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKCZwdGhyZWFkX211dGV4XywgJnRzKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIC8vIElmIHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIGlzbid0IHN1cHBvcnRlZCwgdGhlIHNhZmVzdCB0aGluZyB0byBkbwotICAgIC8vIGlzIGp1c3QgZG8gYSBub25ibG9ja2luZyB0cnlsb2NrLgotICAgIHJldHVybiB0cnlsb2NrKCk7Ci0jZW5kaWYKLSAgfQotCi0gIHZvaWQgdW5sb2NrKCkgY29uc3QgewotICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnB0aHJlYWRfbXV0ZXhfKTsKLSAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7Ci0gIH0KLQotICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsgcmV0dXJuICh2b2lkKikgJnB0aHJlYWRfbXV0ZXhfOyB9Ci0KLSBwcml2YXRlOgotICBtdXRhYmxlIHB0aHJlYWRfbXV0ZXhfdCBwdGhyZWFkX211dGV4XzsKLSAgbXV0YWJsZSBib29sIGluaXRpYWxpemVkXzsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0gIG11dGFibGUgaW50NjRfdCBwcm9maWxlVGltZV87Ci0jZW5kaWYKLX07Ci0KLU11dGV4OjpNdXRleChJbml0aWFsaXplciBpbml0KSA6IGltcGxfKG5ldyBNdXRleDo6aW1wbChpbml0KSkge30KLQotdm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldFVuZGVybHlpbmdJbXBsKCk7IH0KLQotdm9pZCBNdXRleDo6bG9jaygpIGNvbnN0IHsgaW1wbF8tPmxvY2soKTsgfQotCi1ib29sIE11dGV4Ojp0cnlsb2NrKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPnRyeWxvY2soKTsgfQotCi1ib29sIE11dGV4Ojp0aW1lZGxvY2soaW50NjRfdCBtcykgY29uc3QgeyByZXR1cm4gaW1wbF8tPnRpbWVkbG9jayhtcyk7IH0KLQotdm9pZCBNdXRleDo6dW5sb2NrKCkgY29uc3QgeyBpbXBsXy0+dW5sb2NrKCk7IH0KLQotdm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKLSAgcHRocmVhZF9tdXRleF90KiBwdGhyZWFkX211dGV4ID0gKHB0aHJlYWRfbXV0ZXhfdCopYXJnOwotICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXgsIE5VTEwpOwotICBhc3NlcnQocmV0ID09IDApOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X3dpdGhfa2luZChwdGhyZWFkX211dGV4X3QqIG11dGV4LCBpbnQga2luZCkgewotICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4YXR0cjsKLSAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4YXR0cik7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgLy8gQXBwYXJlbnRseSwgdGhpcyBjYW4gZmFpbC4gIFNob3VsZCB3ZSByZWFsbHkgYmUgYWJvcnRpbmc/Ci0gIHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4YXR0ciwga2luZCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgcmV0ID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhhdHRyKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICByZXQgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleGF0dHIpOwotICBhc3NlcnQocmV0ID09IDApOwotfQotCi0jaWZkZWYgUFRIUkVBRF9BREFQVElWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAotdm9pZCBNdXRleDo6QURBUFRJVkVfSU5JVElBTElaRVIodm9pZCogYXJnKSB7Ci0gIC8vIEZyb20gbXlzcWwgc291cmNlOiBteXN5cy9teV90aHJfaW5pdC5jCi0gIC8vIFNldCBtdXRleCB0eXBlIHRvICJmYXN0IiBhLmsuYSAiYWRhcHRpdmUiCi0gIC8vCi0gIC8vIEluIHRoaXMgY2FzZSB0aGUgdGhyZWFkIG1heSBzdGVhbCB0aGUgbXV0ZXggZnJvbSBzb21lIG90aGVyIHRocmVhZAotICAvLyB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoZSBzYW1lIG11dGV4LiBUaGlzIHdpbGwgc2F2ZSB1cyBzb21lCi0gIC8vIGNvbnRleHQgc3dpdGNoZXMgYnV0IG1heSBjYXVzZSBhIHRocmVhZCB0byAnc3RhcnZlIGZvcmV2ZXInIHdoaWxlCi0gIC8vIHdhaXRpbmcgZm9yIHRoZSBtdXRleCAobm90IGxpa2VseSBpZiB0aGUgY29kZSB3aXRoaW4gdGhlIG11dGV4IGlzCi0gIC8vIHNob3J0KS4KLSAgaW5pdF93aXRoX2tpbmQoKHB0aHJlYWRfbXV0ZXhfdCopYXJnLCBQVEhSRUFEX01VVEVYX0FEQVBUSVZFX05QKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKLXZvaWQgTXV0ZXg6OlJFQ1VSU0lWRV9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKLSAgaW5pdF93aXRoX2tpbmQoKHB0aHJlYWRfbXV0ZXhfdCopYXJnLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCk7Ci19Ci0jZW5kaWYKLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIFJlYWRXcml0ZU11dGV4IGNsYXNzIHVzaW5nIFBPU0lYIHJ3IGxvY2sKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBSZWFkV3JpdGVNdXRleDo6aW1wbCB7Ci1wdWJsaWM6Ci0gIGltcGwoKSA6IGluaXRpYWxpemVkXyhmYWxzZSkgewotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKLSAgICBwcm9maWxlVGltZV8gPSAwOwotI2VuZGlmCi0gICAgaW50IHJldCA9IHB0aHJlYWRfcndsb2NrX2luaXQoJnJ3X2xvY2tfLCBOVUxMKTsKLSAgICBhc3NlcnQocmV0ID09IDApOwotICAgIGluaXRpYWxpemVkXyA9IHRydWU7Ci0gIH0KLQotICB+aW1wbCgpIHsKLSAgICBpZihpbml0aWFsaXplZF8pIHsKLSAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgICAgaW50IHJldCA9IHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3koJnJ3X2xvY2tfKTsKLSAgICAgIGFzc2VydChyZXQgPT0gMCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBhY3F1aXJlUmVhZCgpIGNvbnN0IHsKLSAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLSAgICBwdGhyZWFkX3J3bG9ja19yZGxvY2soJnJ3X2xvY2tfKTsKLSAgICBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKTsgIC8vIG5vdCBleGNsdXNpdmUsIHNvIHVzZSBub3QtbG9ja2VkIHBhdGgKLSAgfQotCi0gIHZvaWQgYWNxdWlyZVdyaXRlKCkgY29uc3QgewotICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotICAgIHB0aHJlYWRfcndsb2NrX3dybG9jaygmcndfbG9ja18pOwotICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7Ci0gIH0KLQotICBib29sIGF0dGVtcHRSZWFkKCkgY29uc3QgeyByZXR1cm4gcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKCZyd19sb2NrXyk7IH0KLQotICBib29sIGF0dGVtcHRXcml0ZSgpIGNvbnN0IHsgcmV0dXJuIHB0aHJlYWRfcndsb2NrX3RyeXdybG9jaygmcndfbG9ja18pOyB9Ci0KLSAgdm9pZCByZWxlYXNlKCkgY29uc3QgewotICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCk7Ci0gICAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZyd19sb2NrXyk7Ci0gICAgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpOwotICB9Ci0KLXByaXZhdGU6Ci0gIG11dGFibGUgcHRocmVhZF9yd2xvY2tfdCByd19sb2NrXzsKLSAgbXV0YWJsZSBib29sIGluaXRpYWxpemVkXzsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0gIG11dGFibGUgaW50NjRfdCBwcm9maWxlVGltZV87Ci0jZW5kaWYKLX07Ci0KLVJlYWRXcml0ZU11dGV4OjpSZWFkV3JpdGVNdXRleCgpIDogaW1wbF8obmV3IFJlYWRXcml0ZU11dGV4OjppbXBsKCkpIHt9Ci0KLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVSZWFkKCkgY29uc3QgeyBpbXBsXy0+YWNxdWlyZVJlYWQoKTsgfQotCi12b2lkIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlV3JpdGUoKSBjb25zdCB7IGltcGxfLT5hY3F1aXJlV3JpdGUoKTsgfQotCi1ib29sIFJlYWRXcml0ZU11dGV4OjphdHRlbXB0UmVhZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5hdHRlbXB0UmVhZCgpOyB9Ci0KLWJvb2wgUmVhZFdyaXRlTXV0ZXg6OmF0dGVtcHRXcml0ZSgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5hdHRlbXB0V3JpdGUoKTsgfQotCi12b2lkIFJlYWRXcml0ZU11dGV4OjpyZWxlYXNlKCkgY29uc3QgeyBpbXBsXy0+cmVsZWFzZSgpOyB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTXV0ZXguaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L011dGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWRiZTMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvTXV0ZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfIDEKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCi0KLS8qKgotICogRGV0ZXJtaW5lcyBpZiB0aGUgVGhyaWZ0IE11dGV4IGFuZCBSZWFkV3JpdGVNdXRleCBjbGFzc2VzIHdpbGwgYXR0ZW1wdCB0bwotICogcHJvZmlsZSB0aGVpciBibG9ja2luZyBhY3F1aXJlIG1ldGhvZHMuIElmIHRoaXMgdmFsdWUgaXMgc2V0IHRvIG5vbi16ZXJvLAotICogVGhyaWZ0IHdpbGwgYXR0ZW1wdCB0byBpbnZva2UgdGhlIGNhbGxiYWNrIG9uY2UgZXZlcnkgcHJvZmlsaW5nU2FtcGxlUmF0ZQotICogdGltZXMuICBIb3dldmVyLCBhcyB0aGUgc2FtcGxpbmcgaXMgbm90IHN5bmNocm9uaXplZCB0aGUgcmF0ZSBpcyBub3QKLSAqIGd1cmFuYXRlZWQsIGFuZCBjb3VsZCBiZSBzdWJqZWN0IHRvIGJpZyBidXJzdHMgYW5kIHN3aW5ncy4gIFBsZWFzZSBlbnN1cmUKLSAqIHlvdXIgc2FtcGxpbmcgY2FsbGJhY2sgaXMgYXMgcGVyZm9ybWFudCBhcyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzLgotICoKLSAqIFRoZSBjYWxsYmFjayB3aWxsIGdldCBjYWxsZWQgd2l0aCB0aGUgd2FpdCB0aW1lIHRha2VuIHRvIGxvY2sgdGhlIG11dGV4IGluCi0gKiB1c2VjIGFuZCBhICh2b2lkKikgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBNdXRleCAob3IgUmVhZFdyaXRlTXV0ZXgpCi0gKiBiZWluZyBsb2NrZWQuCi0gKgotICogVGhlIGVuYWJsZU11dGV4UHJvZmlsaW5nKCkgZnVuY3Rpb24gaXMgdW5zeW5jaHJvbml6ZWQ7IGNhbGxpbmcgdGhpcyBmdW5jdGlvbgotICogd2hpbGUgcHJvZmlsaW5nIGlzIGFscmVhZHkgZW5hYmxlZCBtYXkgcmVzdWx0IGluIHJhY2UgY29uZGl0aW9ucy4gIE9uCi0gKiBhcmNoaXRlY3R1cmVzIHdoZXJlIGEgcG9pbnRlciBhc3NpZ25tZW50IGlzIGF0b21pYywgdGhpcyBpcyBzYWZlIGJ1dCB0aGVyZQotICogaXMgbm8gZ3VhcmFudGVlIHRocmVhZHMgd2lsbCBhZ3JlZSBvbiBhIHNpbmdsZSBjYWxsYmFjayB3aXRoaW4gYW55Ci0gKiBwYXJ0aWN1bGFyIHRpbWUgcGVyaW9kLgotICovCi10eXBlZGVmIHZvaWQgKCpNdXRleFdhaXRDYWxsYmFjaykoY29uc3Qgdm9pZCogaWQsIGludDY0X3Qgd2FpdFRpbWVNaWNyb3MpOwotdm9pZCBlbmFibGVNdXRleFByb2ZpbGluZyhpbnQzMl90IHByb2ZpbGluZ1NhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4V2FpdENhbGxiYWNrIGNhbGxiYWNrKTsKLQotI2VuZGlmCi0KLS8qKgotICogQSBzaW1wbGUgbXV0ZXggY2xhc3MKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBNdXRleCB7Ci0gcHVibGljOgotICB0eXBlZGVmIHZvaWQgKCpJbml0aWFsaXplcikodm9pZCopOwotCi0gIE11dGV4KEluaXRpYWxpemVyIGluaXQgPSBERUZBVUxUX0lOSVRJQUxJWkVSKTsKLSAgdmlydHVhbCB+TXV0ZXgoKSB7fQotICB2aXJ0dWFsIHZvaWQgbG9jaygpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgdHJ5bG9jaygpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgdGltZWRsb2NrKGludDY0X3QgbWlsbGlzZWNvbmRzKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIHVubG9jaygpIGNvbnN0OwotCi0gIHZvaWQqIGdldFVuZGVybHlpbmdJbXBsKCkgY29uc3Q7Ci0KLSAgc3RhdGljIHZvaWQgREVGQVVMVF9JTklUSUFMSVpFUih2b2lkKik7Ci0gIHN0YXRpYyB2b2lkIEFEQVBUSVZFX0lOSVRJQUxJWkVSKHZvaWQqKTsKLSAgc3RhdGljIHZvaWQgUkVDVVJTSVZFX0lOSVRJQUxJWkVSKHZvaWQqKTsKLQotIHByaXZhdGU6Ci0KLSAgY2xhc3MgaW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87Ci19OwotCi1jbGFzcyBSZWFkV3JpdGVNdXRleCB7Ci1wdWJsaWM6Ci0gIFJlYWRXcml0ZU11dGV4KCk7Ci0gIHZpcnR1YWwgflJlYWRXcml0ZU11dGV4KCkge30KLQotICAvLyB0aGVzZSBnZXQgdGhlIGxvY2sgYW5kIGJsb2NrIHVudGlsIGl0IGlzIGRvbmUgc3VjY2Vzc2Z1bGx5Ci0gIHZpcnR1YWwgdm9pZCBhY3F1aXJlUmVhZCgpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgYWNxdWlyZVdyaXRlKCkgY29uc3Q7Ci0KLSAgLy8gdGhlc2UgYXR0ZW1wdCB0byBnZXQgdGhlIGxvY2ssIHJldHVybmluZyBmYWxzZSBpbW1lZGlhdGVseSBpZiB0aGV5IGZhaWwKLSAgdmlydHVhbCBib29sIGF0dGVtcHRSZWFkKCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdDsKLQotICAvLyB0aGlzIHJlbGVhc2VzIGJvdGggcmVhZCBhbmQgd3JpdGUgbG9ja3MKLSAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdDsKLQotcHJpdmF0ZToKLQotICBjbGFzcyBpbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKLX07Ci0KLWNsYXNzIEd1YXJkIHsKLSBwdWJsaWM6Ci0gIEd1YXJkKGNvbnN0IE11dGV4JiB2YWx1ZSwgaW50NjRfdCB0aW1lb3V0ID0gMCkgOiBtdXRleF8oJnZhbHVlKSB7Ci0gICAgaWYgKHRpbWVvdXQgPT0gMCkgewotICAgICAgdmFsdWUubG9jaygpOwotICAgIH0gZWxzZSBpZiAodGltZW91dCA8IDApIHsKLSAgICAgIGlmICghdmFsdWUudHJ5bG9jaygpKSB7Ci0gICAgICAgIG11dGV4XyA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghdmFsdWUudGltZWRsb2NrKHRpbWVvdXQpKSB7Ci0gICAgICAgIG11dGV4XyA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIH5HdWFyZCgpIHsKLSAgICBpZiAobXV0ZXhfKSB7Ci0gICAgICBtdXRleF8tPnVubG9jaygpOwotICAgIH0KLSAgfQotCi0gIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7Ci0gICAgcmV0dXJuIChtdXRleF8gIT0gTlVMTCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IE11dGV4KiBtdXRleF87Ci19OwotCi0vLyBDYW4gYmUgdXNlZCBhcyBzZWNvbmQgYXJndW1lbnQgdG8gUldHdWFyZCB0byBtYWtlIGNvZGUgbW9yZSByZWFkYWJsZQotLy8gYXMgdG8gd2hldGhlciB3ZSdyZSBkb2luZyBhY3F1aXJlUmVhZCgpIG9yIGFjcXVpcmVXcml0ZSgpLgotZW51bSBSV0d1YXJkVHlwZSB7Ci0gIFJXX1JFQUQgPSAwLAotICBSV19XUklURSA9IDEsCi19OwotCi0KLWNsYXNzIFJXR3VhcmQgewotICBwdWJsaWM6Ci0gICAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIGJvb2wgd3JpdGUgPSBmYWxzZSkKLSAgICAgICAgIDogcndfbXV0ZXhfKHZhbHVlKSB7Ci0gICAgICBpZiAod3JpdGUpIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVXcml0ZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIFJXR3VhcmRUeXBlIHR5cGUpCi0gICAgICAgICA6IHJ3X211dGV4Xyh2YWx1ZSkgewotICAgICAgaWYgKHR5cGUgPT0gUldfV1JJVEUpIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVXcml0ZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIH5SV0d1YXJkKCkgewotICAgICAgcndfbXV0ZXhfLnJlbGVhc2UoKTsKLSAgICB9Ci0gIHByaXZhdGU6Ci0gICAgY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHJ3X211dGV4XzsKLX07Ci0KLQotLy8gQSBsaXR0bGUgaGFjayB0byBwcmV2ZW50IHNvbWVvbmUgZnJvbSB0cnlpbmcgdG8gZG8gIkd1YXJkKG0pOyIKLS8vIFN1Y2ggYSB1c2UgaXMgaW52YWxpZCBiZWNhdXNlIHRoZSB0ZW1wb3JhcnkgR3VhcmQgb2JqZWN0IGlzCi0vLyBkZXN0b3J5ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgcmVsZWFzaW5nIHRoZSBsb2NrLgotLy8gU29ycnkgZm9yIHBvbGx1dGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgYnV0IEkgdGhpbmsgaXQncyB3b3J0aCBpdC4KLSNkZWZpbmUgR3VhcmQobSkgaW5jb3JyZWN0X3VzZV9vZl9HdWFyZChtKQotI2RlZmluZSBSV0d1YXJkKG0pIGluY29ycmVjdF91c2Vfb2ZfUldHdWFyZChtKQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjI4OGMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJQb3NpeFRocmVhZEZhY3RvcnkuaCIKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLQotI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECi0jICBpbmNsdWRlIDxnb29nbGUvcHJvZmlsZXIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6d2Vha19wdHI7Ci0KLS8qKgotICogVGhlIFBPU0lYIHRocmVhZCBjbGFzcy4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBQdGhyZWFkVGhyZWFkOiBwdWJsaWMgVGhyZWFkIHsKLSBwdWJsaWM6Ci0KLSAgZW51bSBTVEFURSB7Ci0gICAgdW5pbml0aWFsaXplZCwKLSAgICBzdGFydGluZywKLSAgICBzdGFydGVkLAotICAgIHN0b3BwaW5nLAotICAgIHN0b3BwZWQKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgaW50IE1CID0gMTAyNCAqIDEwMjQ7Ci0KLSAgc3RhdGljIHZvaWQqIHRocmVhZE1haW4odm9pZCogYXJnKTsKLQotIHByaXZhdGU6Ci0gIHB0aHJlYWRfdCBwdGhyZWFkXzsKLSAgU1RBVEUgc3RhdGVfOwotICBpbnQgcG9saWN5XzsKLSAgaW50IHByaW9yaXR5XzsKLSAgaW50IHN0YWNrU2l6ZV87Ci0gIHdlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGZfOwotICBib29sIGRldGFjaGVkXzsKLQotIHB1YmxpYzoKLQotICBQdGhyZWFkVGhyZWFkKGludCBwb2xpY3ksIGludCBwcmlvcml0eSwgaW50IHN0YWNrU2l6ZSwgYm9vbCBkZXRhY2hlZCwgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIDoKLSAgICBwdGhyZWFkXygwKSwKLSAgICBzdGF0ZV8odW5pbml0aWFsaXplZCksCi0gICAgcG9saWN5Xyhwb2xpY3kpLAotICAgIHByaW9yaXR5Xyhwcmlvcml0eSksCi0gICAgc3RhY2tTaXplXyhzdGFja1NpemUpLAotICAgIGRldGFjaGVkXyhkZXRhY2hlZCkgewotCi0gICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7Ci0gIH0KLQotICB+UHRocmVhZFRocmVhZCgpIHsKLSAgICAvKiBOb3RoaW5nIHJlZmVyZW5jZXMgdGhpcyB0aHJlYWQsIGlmIGlzIGlzIG5vdCBkZXRhY2hlZCwgZG8gYSBqb2luCi0gICAgICAgbm93LCBvdGhlcndpc2UgdGhlIHRocmVhZC1pZCBhbmQsIHBvc3NpYmx5LCBvdGhlciByZXNvdXJjZXMgd2lsbAotICAgICAgIGJlIGxlYWtlZC4gKi8KLSAgICBpZighZGV0YWNoZWRfKSB7Ci0gICAgICB0cnkgewotICAgICAgICBqb2luKCk7Ci0gICAgICB9IGNhdGNoKC4uLikgewotICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBpZiAoc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKLSAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKSAhPSAwKSB7Ci0gICAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfaW5pdCBmYWlsZWQiKTsKLSAgICB9Ci0KLSAgICBpZihwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnRocmVhZF9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZF8gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKSAhPSAwKSB7Ci0gICAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUgZmFpbGVkIik7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRocmVhZCBzdGFjayBzaXplCi0gICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJnRocmVhZF9hdHRyLCBNQiAqIHN0YWNrU2l6ZV8pICE9IDApIHsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplIGZhaWxlZCIpOwotICAgIH0KLQotICAgIC8vIFNldCB0aHJlYWQgcG9saWN5Ci0gICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSgmdGhyZWFkX2F0dHIsIHBvbGljeV8pICE9IDApIHsKLSAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgZmFpbGVkIik7Ci0gICAgfQotCi0gICAgc3RydWN0IHNjaGVkX3BhcmFtIHNjaGVkX3BhcmFtOwotICAgIHNjaGVkX3BhcmFtLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHlfOwotCi0gICAgLy8gU2V0IHRocmVhZCBwcmlvcml0eQotICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSgmdGhyZWFkX2F0dHIsICZzY2hlZF9wYXJhbSkgIT0gMCkgewotICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtIGZhaWxlZCIpOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSByZWZlcmVuY2UKLSAgICBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4oKTsKLSAgICAqc2VsZlJlZiA9IHNlbGZfLmxvY2soKTsKLQotICAgIHN0YXRlXyA9IHN0YXJ0aW5nOwotCi0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZwdGhyZWFkXywgJnRocmVhZF9hdHRyLCB0aHJlYWRNYWluLCAodm9pZCopc2VsZlJlZikgIT0gMCkgewotICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfY3JlYXRlIGZhaWxlZCIpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgam9pbigpIHsKLSAgICBpZiAoIWRldGFjaGVkXyAmJiBzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgewotICAgICAgdm9pZCogaWdub3JlOwotICAgICAgLyogWFhYCi0gICAgICAgICBJZiBqb2luIGZhaWxzIGl0IGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgZmFjdAotICAgICAgICAgdGhhdCB0aGUgbGFzdCByZWZlcmVuY2Ugd2FzIHRoZSB0aHJlYWQgaXRzZWxmIGFuZCBjYW5ub3QKLSAgICAgICAgIGpvaW4uICBUaGlzIHJlc3VsdHMgaW4gbGVha2VkIHRocmVhZHMgYW5kIHdpbGwgZXZlbnR1YWxseQotICAgICAgICAgY2F1c2UgdGhlIHByb2Nlc3MgdG8gcnVuIG91dCBvZiB0aHJlYWQgcmVzb3VyY2VzLgotICAgICAgICAgV2UncmUgYmV5b25kIHRoZSBwb2ludCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24uICBOb3QgY2xlYXIgaG93Ci0gICAgICAgICBiZXN0IHRvIGhhbmRsZSB0aGlzLiAqLwotICAgICAgZGV0YWNoZWRfID0gcHRocmVhZF9qb2luKHB0aHJlYWRfLCAmaWdub3JlKSA9PSAwOwotICAgIH0KLSAgfQotCi0gIFRocmVhZDo6aWRfdCBnZXRJZCgpIHsKLSAgICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkXzsKLSAgfQotCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9Ci0KLSAgdm9pZCBydW5uYWJsZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQotCi0gIHZvaWQgd2Vha1JlZihzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGYpIHsKLSAgICBhc3NlcnQoc2VsZi5nZXQoKSA9PSB0aGlzKTsKLSAgICBzZWxmXyA9IHdlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+KHNlbGYpOwotICB9Ci19OwotCi12b2lkKiBQdGhyZWFkVGhyZWFkOjp0aHJlYWRNYWluKHZvaWQqIGFyZykgewotICBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHRocmVhZCA9ICooc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiopYXJnOwotICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kj4oYXJnKTsKLQotICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICByZXR1cm4gKHZvaWQqKTA7Ci0gIH0KLQotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RhcnRpbmcpIHsKLSAgICByZXR1cm4gKHZvaWQqKTA7Ci0gIH0KLQotI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECi0gIFByb2ZpbGVyUmVnaXN0ZXJUaHJlYWQoKTsKLSNlbmRpZgotCi0gIHRocmVhZC0+c3RhdGVfID0gc3RhcnRpbmc7Ci0gIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7Ci0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGVkKSB7Ci0gICAgdGhyZWFkLT5zdGF0ZV8gPSBzdG9wcGluZzsKLSAgfQotCi0gIHJldHVybiAodm9pZCopMDsKLX0KLQotLyoqCi0gKiBQT1NJWCBUaHJlYWQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICovCi1jbGFzcyBQb3NpeFRocmVhZEZhY3Rvcnk6OkltcGwgewotCi0gcHJpdmF0ZToKLSAgUE9MSUNZIHBvbGljeV87Ci0gIFBSSU9SSVRZIHByaW9yaXR5XzsKLSAgaW50IHN0YWNrU2l6ZV87Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBnZW5lcmljIHBvc2l4IHRocmVhZCBzY2hlZHVsZSBwb2xpY3kgZW51bXMgaW50byBwdGhyZWFkCi0gICAqIEFQSSB2YWx1ZXMuCi0gICAqLwotICBzdGF0aWMgaW50IHRvUHRocmVhZFBvbGljeShQT0xJQ1kgcG9saWN5KSB7Ci0gICAgc3dpdGNoIChwb2xpY3kpIHsKLSAgICBjYXNlIE9USEVSOgotICAgICAgcmV0dXJuIFNDSEVEX09USEVSOwotICAgIGNhc2UgRklGTzoKLSAgICAgIHJldHVybiBTQ0hFRF9GSUZPOwotICAgIGNhc2UgUk9VTkRfUk9CSU46Ci0gICAgICByZXR1cm4gU0NIRURfUlI7Ci0gICAgfQotICAgIHJldHVybiBTQ0hFRF9PVEhFUjsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyByZWxhdGl2ZSB0aHJlYWQgcHJpb3JpdGllcyB0byBhYnNvbHV0ZSB2YWx1ZSBiYXNlZCBvbiBwb3NpeAotICAgKiB0aHJlYWQgc2NoZWR1bGVyIHBvbGljeQotICAgKgotICAgKiAgVGhlIGlkZWEgaXMgc2ltcGx5IHRvIGRpdmlkZSB1cCB0aGUgcHJpb3JpdHkgcmFuZ2UgZm9yIHRoZSBnaXZlbiBwb2xpY3kKLSAgICogaW50byB0aGUgY29ycmVwc29uZGluZyByZWxhdGl2ZSBwcmlvcml0eSBsZXZlbCAobG93ZXN0Li5oaWdoZXN0KSBhbmQKLSAgICogdGhlbiBwcm8tcmF0ZSBhY2NvcmRpbmdseS4KLSAgICovCi0gIHN0YXRpYyBpbnQgdG9QdGhyZWFkUHJpb3JpdHkoUE9MSUNZIHBvbGljeSwgUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgICBpbnQgcHRocmVhZF9wb2xpY3kgPSB0b1B0aHJlYWRQb2xpY3kocG9saWN5KTsKLSAgICBpbnQgbWluX3ByaW9yaXR5ID0gMDsKLSAgICBpbnQgbWF4X3ByaW9yaXR5ID0gMDsKLSNpZmRlZiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NSU4KLSAgICBtaW5fcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHB0aHJlYWRfcG9saWN5KTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01BWAotICAgIG1heF9wcmlvcml0eSA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgocHRocmVhZF9wb2xpY3kpOwotI2VuZGlmCi0gICAgaW50IHF1YW50YSA9IChISUdIRVNUIC0gTE9XRVNUKSArIDE7Ci0gICAgZmxvYXQgc3RlcHNwZXJxdWFudGEgPSAobWF4X3ByaW9yaXR5IC0gbWluX3ByaW9yaXR5KSAvIHF1YW50YTsKLQotICAgIGlmIChwcmlvcml0eSA8PSBISUdIRVNUKSB7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBwcmlvcml0eSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZSBmb3IgcHJpb3JpdHkgaW5jcmVtZW50cy4KLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBOT1JNQUwpOwotICAgIH0KLSAgfQotCi0gcHVibGljOgotCi0gIEltcGwoUE9MSUNZIHBvbGljeSwgUFJJT1JJVFkgcHJpb3JpdHksIGludCBzdGFja1NpemUsIGJvb2wgZGV0YWNoZWQpIDoKLSAgICBwb2xpY3lfKHBvbGljeSksCi0gICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKLSAgICBzdGFja1NpemVfKHN0YWNrU2l6ZSksCi0gICAgZGV0YWNoZWRfKGRldGFjaGVkKSB7fQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFBPU0lYIHRocmVhZCB0byBydW4gdGhlIHJ1bm5hYmxlIG9iamVjdAotICAgKgotICAgKiBAcGFyYW0gcnVubmFibGUgQSBydW5uYWJsZSBvYmplY3QKLSAgICovCi0gIHNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKLSAgICBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHJlc3VsdCA9IHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4obmV3IFB0aHJlYWRUaHJlYWQodG9QdGhyZWFkUG9saWN5KHBvbGljeV8pLCB0b1B0aHJlYWRQcmlvcml0eShwb2xpY3lfLCBwcmlvcml0eV8pLCBzdGFja1NpemVfLCBkZXRhY2hlZF8sIHJ1bm5hYmxlKSk7Ci0gICAgcmVzdWx0LT53ZWFrUmVmKHJlc3VsdCk7Ci0gICAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBpbnQgZ2V0U3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhY2tTaXplXzsgfQotCi0gIHZvaWQgc2V0U3RhY2tTaXplKGludCB2YWx1ZSkgeyBzdGFja1NpemVfID0gdmFsdWU7IH0KLQotICBQUklPUklUWSBnZXRQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIHByaW9yaXR5XzsgfQotCi0gIC8qKgotICAgKiBTZXRzIHByaW9yaXR5LgotICAgKgotICAgKiAgWFhYCi0gICAqICBOZWVkIHRvIGhhbmRsZSBpbmNyZW1lbnRhbCBwcmlvcml0aWVzIHByb3Blcmx5LgotICAgKi8KLSAgdm9pZCBzZXRQcmlvcml0eShQUklPUklUWSB2YWx1ZSkgeyBwcmlvcml0eV8gPSB2YWx1ZTsgfQotCi0gIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGRldGFjaGVkXzsgfQotCi0gIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgeyBkZXRhY2hlZF8gPSB2YWx1ZTsgfQotCi0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCk7Ci0gIH0KLQotfTsKLQotUG9zaXhUaHJlYWRGYWN0b3J5OjpQb3NpeFRocmVhZEZhY3RvcnkoUE9MSUNZIHBvbGljeSwgUFJJT1JJVFkgcHJpb3JpdHksIGludCBzdGFja1NpemUsIGJvb2wgZGV0YWNoZWQpIDoKLSAgaW1wbF8obmV3IFBvc2l4VGhyZWFkRmFjdG9yeTo6SW1wbChwb2xpY3ksIHByaW9yaXR5LCBzdGFja1NpemUsIGRldGFjaGVkKSkge30KLQotc2hhcmVkX3B0cjxUaHJlYWQ+IFBvc2l4VGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7IHJldHVybiBpbXBsXy0+bmV3VGhyZWFkKHJ1bm5hYmxlKTsgfQotCi1pbnQgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRTdGFja1NpemUoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Z2V0U3RhY2tTaXplKCk7IH0KLQotdm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFN0YWNrU2l6ZShpbnQgdmFsdWUpIHsgaW1wbF8tPnNldFN0YWNrU2l6ZSh2YWx1ZSk7IH0KLQotUG9zaXhUaHJlYWRGYWN0b3J5OjpQUklPUklUWSBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldFByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldFByaW9yaXR5KCk7IH0KLQotdm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgdmFsdWUpIHsgaW1wbF8tPnNldFByaW9yaXR5KHZhbHVlKTsgfQotCi1ib29sIFBvc2l4VGhyZWFkRmFjdG9yeTo6aXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5pc0RldGFjaGVkKCk7IH0KLQotdm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsgaW1wbF8tPnNldERldGFjaGVkKHZhbHVlKTsgfQotCi1UaHJlYWQ6OmlkX3QgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+Z2V0Q3VycmVudFRocmVhZElkKCk7IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkODNhMy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8gMQotCi0jaW5jbHVkZSAiVGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHBvc2l4IHRocmVhZHMKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBQb3NpeFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7Ci0KLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIFBPU0lYIFRocmVhZCBzY2hlZHVsZXIgcG9saWNpZXMKLSAgICovCi0gIGVudW0gUE9MSUNZIHsKLSAgICBPVEhFUiwKLSAgICBGSUZPLAotICAgIFJPVU5EX1JPQklOCi0gIH07Ci0KLSAgLyoqCi0gICAqIFBPU0lYIFRocmVhZCBzY2hlZHVsZXIgcmVsYXRpdmUgcHJpb3JpdGllcywKLSAgICoKLSAgICogQWJzb2x1dGUgcHJpb3JpdHkgaXMgZGV0ZXJtaW5lZCBieSBzY2hlZHVsZXIgcG9saWN5IGFuZCBPUy4gVGhpcwotICAgKiBlbnVtZXJhdGlvbiBzcGVjaWZpZXMgcmVsYXRpdmUgcHJpb3JpdGllcyBzdWNoIHRoYXQgb25lIGNhbiBzcGVjaWZ5IGEKLSAgICogcHJpb3JpdHkgd2l0aGluZyBhIGdpdmluZyBzY2hlZHVsZXIgcG9saWN5IHdpdGhvdXQga25vd2luZyB0aGUgYWJzb2x1dGUKLSAgICogdmFsdWUgb2YgdGhlIHByaW9yaXR5LgotICAgKi8KLSAgZW51bSBQUklPUklUWSB7Ci0gICAgTE9XRVNUID0gMCwKLSAgICBMT1dFUiA9IDEsCi0gICAgTE9XID0gMiwKLSAgICBOT1JNQUwgPSAzLAotICAgIEhJR0ggPSA0LAotICAgIEhJR0hFUiA9IDUsCi0gICAgSElHSEVTVCA9IDYsCi0gICAgSU5DUkVNRU5UID0gNywKLSAgICBERUNSRU1FTlQgPSA4Ci0gIH07Ci0KLSAgLyoqCi0gICAqIFBvc2l4IHRocmVhZCAocHRocmVhZCkgZmFjdG9yeS4gIEFsbCB0aHJlYWRzIGNyZWF0ZWQgYnkgYSBmYWN0b3J5IGFyZSByZWZlcmVuY2UtY291bnRlZAotICAgKiB2aWEgYm9vc3Q6OnNoYXJlZF9wdHIgYW5kIGJvb3N0Ojp3ZWFrX3B0ci4gIFRoZSBmYWN0b3J5IGd1YXJhbnRlZXMgdGhhdCB0aHJlYWRzIGFuZAotICAgKiB0aGUgUnVubmFibGUgdGFza3MgdGhleSBob3N0IHdpbGwgYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBvbmNlIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UKLSAgICogdG8gYm90aCBpcyBnaXZlbiB1cC4KLSAgICoKLSAgICogVGhyZWFkcyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcG9saWN5LCBwcmlvcml0eSwgc3RhY2stc2l6ZSBhbmQgZGV0YWNoYWJsZS1tb2RlCi0gICAqIGRldGFjaGVkIG1lYW5zIHRoZSB0aHJlYWQgaXMgZnJlZS1ydW5uaW5nIGFuZCB3aWxsIHJlbGVhc2UgYWxsIHN5c3RlbSByZXNvdXJjZXMgdGhlCi0gICAqIHdoZW4gaXQgY29tcGxldGVzLiAgQSBkZXRhY2hhYmxlIHRocmVhZCBpcyBub3Qgam9pbmFibGUuICBUaGUgam9pbiBtZXRob2QKLSAgICogb2YgYSBkZXRhY2hhYmxlIHRocmVhZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSB3aXRoIG5vIGVycm9yLgotICAgKgotICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KLSAgICovCi0KLSAgUG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3k9Uk9VTkRfUk9CSU4sIFBSSU9SSVRZIHByaW9yaXR5PU5PUk1BTCwgaW50IHN0YWNrU2l6ZT0xLCBib29sIGRldGFjaGVkPXRydWUpOwotCi0gIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKLQotICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdDsKLQotICAvKioKLSAgICogR2V0cyBzdGFjayBzaXplIGZvciBjcmVhdGVkIHRocmVhZHMKLSAgICoKLSAgICogQHJldHVybiBpbnQgc2l6ZSBpbiBtZWdhYnl0ZXMKLSAgICovCi0gIHZpcnR1YWwgaW50IGdldFN0YWNrU2l6ZSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIHN0YWNrIHNpemUgZm9yIGNyZWF0ZWQgdGhyZWFkcwotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgc2l6ZSBpbiBtZWdhYnl0ZXMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXRTdGFja1NpemUoaW50IHZhbHVlKTsKLQotICAvKioKLSAgICogR2V0cyBwcmlvcml0eSByZWxhdGl2ZSB0byBjdXJyZW50IHBvbGljeQotICAgKi8KLSAgdmlydHVhbCBQUklPUklUWSBnZXRQcmlvcml0eSgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIHByaW9yaXR5IHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9saWN5Ci0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0UHJpb3JpdHkoUFJJT1JJVFkgcHJpb3JpdHkpOwotCi0gIC8qKgotICAgKiBTZXRzIGRldGFjaGVkIG1vZGUgb2YgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldERldGFjaGVkKGJvb2wgZGV0YWNoZWQpOwotCi0gIC8qKgotICAgKiBHZXRzIGN1cnJlbnQgZGV0YWNoZWQgbW9kZQotICAgKi8KLSAgdmlydHVhbCBib29sIGlzRGV0YWNoZWQoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNsYXNzIEltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEltcGw+IGltcGxfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyODJhZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8gMQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvd2Vha19wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLWNsYXNzIFRocmVhZDsKLQotLyoqCi0gKiBNaW5pbWFsIHJ1bm5hYmxlIGNsYXNzLiAgTW9yZSBvciBsZXNzIGFuYWxvZ291cyB0byBqYXZhLmxhbmcuUnVubmFibGUuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgUnVubmFibGUgewotCi0gcHVibGljOgotICB2aXJ0dWFsIH5SdW5uYWJsZSgpIHt9OwotICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB0aHJlYWQgb2JqZWN0IHRoYXQgaXMgaG9zdGluZyB0aGlzIHJ1bm5hYmxlIG9iamVjdCAgLSBjYW4gcmV0dXJuCi0gICAqIGFuIGVtcHR5IGJvb3N0OjpzaGFyZWQgcG9pbnRlciBpZiBubyByZWZlcmVuY2VzIHJlbWFpbiBvbiB0aGV0IHRocmVhZCAgb2JqZWN0Ci0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkKCkgeyByZXR1cm4gdGhyZWFkXy5sb2NrKCk7IH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdGhyZWFkIHRoYXQgaXMgZXhlY3V0aW5nIHRoaXMgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IG1lYW50IGZvcgotICAgKiB1c2UgYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIFRocmVhZC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB2YWx1ZSkgeyB0aHJlYWRfID0gdmFsdWU7IH0KLQotIHByaXZhdGU6Ci0gIGJvb3N0Ojp3ZWFrX3B0cjxUaHJlYWQ+IHRocmVhZF87Ci19OwotCi0vKioKLSAqIE1pbmltYWwgdGhyZWFkIGNsYXNzLiBSZXR1cm5lZCBieSB0aHJlYWQgZmFjdG9yeSBib3VuZCB0byBhIFJ1bm5hYmxlIG9iamVjdAotICogYW5kIHJlYWR5IHRvIHN0YXJ0IGV4ZWN1dGlvbi4gIE1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLlRocmVhZAotICogKG1pbnVzIGFsbCB0aGUgdGhyZWFkIGdyb3VwLCBwcmlvcml0eSwgbW9kZSBhbmQgb3RoZXIgYmFnZ2FnZSwgc2luY2UgdGhhdAotICogaXMgZGlmZmljdWx0IHRvIGFic3RyYWN0IGFjcm9zcyBwbGF0Zm9ybXMgYW5kIGlzIGxlZnQgZm9yIHBsYXRmb3JtLXNwZWNpZmljCi0gKiBUaHJlYWRGYWN0b3J5IGltcGxlbXRhdGlvbnMgdG8gZGVhbCB3aXRoCi0gKgotICogQHNlZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3RvcnkpCi0gKi8KLWNsYXNzIFRocmVhZCB7Ci0KLSBwdWJsaWM6Ci0KLSAgdHlwZWRlZiB1aW50NjRfdCBpZF90OwotCi0gIHZpcnR1YWwgflRocmVhZCgpIHt9OwotCi0gIC8qKgotICAgKiBTdGFydHMgdGhlIHRocmVhZC4gRG9lcyBwbGF0Zm9ybSBzcGVjaWZpYyB0aHJlYWQgY3JlYXRpb24gYW5kCi0gICAqIGNvbmZpZ3VyYXRpb24gdGhlbiBpbnZva2VzIHRoZSBydW4gbWV0aG9kIG9mIHRoZSBSdW5uYWJsZSBvYmplY3QgYm91bmQKLSAgICogdG8gdGhpcyB0aHJlYWQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEpvaW4gdGhpcyB0aHJlYWQuIEN1cnJlbnQgdGhyZWFkIGJsb2NrcyB1bnRpbCB0aGlzIHRhcmdldCB0aHJlYWQKLSAgICogY29tcGxldGVzLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGpvaW4oKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHRocmVhZCdzIHBsYXRmb3JtLXNwZWNpZmljIElECi0gICAqLwotICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHJ1bm5hYmxlIG9iamVjdCB0aGlzIHRocmVhZCBpcyBob3N0aW5nCi0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9ydW5uYWJsZTsgfQotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgcnVubmFibGUoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IF9ydW5uYWJsZSA9IHZhbHVlOyB9Ci0KLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gX3J1bm5hYmxlOwotCi19OwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIHBsYXRmb3JtLXNwZWNpZmljIHRocmVhZCBvYmplY3QgYW5kIGJpbmQgdGhlbSB0byBSdW5uYWJsZQotICogb2JqZWN0IGZvciBleGVjdXRpb24KLSAqLwotY2xhc3MgVGhyZWFkRmFjdG9yeSB7Ci0KLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflRocmVhZEZhY3RvcnkoKSB7fQotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgPSAwOwotCi0gIC8qKiBHZXRzIHRoZSBjdXJyZW50IHRocmVhZCBpZCBvciB1bmtub3duX3RocmVhZF9pZCBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdGhyaWZ0IHRocmVhZCAqLwotCi0gIHN0YXRpYyBjb25zdCBUaHJlYWQ6OmlkX3QgdW5rbm93bl90aHJlYWRfaWQ7Ci0KLSAgdmlydHVhbCBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgPSAwOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAgYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlNTdmMy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUaHJlYWRNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiTW9uaXRvci5oIgotI2luY2x1ZGUgIlV0aWwuaCIKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8c2V0PgotCi0jaWYgZGVmaW5lZChERUJVRykKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNlbmRpZiAvL2RlZmluZWQoREVCVUcpCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q7Ci0KLS8qKgotICogVGhyZWFkTWFuYWdlciBjbGFzcwotICoKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIHBvb2wgb2YgdGhyZWFkcy4gSXQgdXNlcyBhIFRocmVhZEZhY3RvcnkgdG8gY3JlYXRlCi0gKiB0aHJlYWRzLiAgSXQgbmV2ZXIgYWN0dWFsbHkgY3JlYXRlcyBvciBkZXN0cm95cyB3b3JrZXIgdGhyZWFkcywgcmF0aGVyCi0gKiBpdCBtYWludGFpbnMgc3RhdGlzdGljcyBvbiBudW1iZXIgb2YgaWRsZSB0aHJlYWRzLCBudW1iZXIgb2YgYWN0aXZlIHRocmVhZHMsCi0gKiB0YXNrIGJhY2tsb2csIGFuZCBhdmVyYWdlIHdhaXQgYW5kIHNlcnZpY2UgdGltZXMuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVGhyZWFkTWFuYWdlcjo6SW1wbCA6IHB1YmxpYyBUaHJlYWRNYW5hZ2VyICB7Ci0KLSBwdWJsaWM6Ci0gIEltcGwoKSA6Ci0gICAgd29ya2VyQ291bnRfKDApLAotICAgIHdvcmtlck1heENvdW50XygwKSwKLSAgICBpZGxlQ291bnRfKDApLAotICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfKDApLAotICAgIGV4cGlyZWRDb3VudF8oMCksCi0gICAgc3RhdGVfKFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAotICAgIG1vbml0b3JfKCZtdXRleF8pLAotICAgIG1heE1vbml0b3JfKCZtdXRleF8pIHt9Ci0KLSAgfkltcGwoKSB7IHN0b3AoKTsgfQotCi0gIHZvaWQgc3RhcnQoKTsKLQotICB2b2lkIHN0b3AoKSB7IHN0b3BJbXBsKGZhbHNlKTsgfQotCi0gIHZvaWQgam9pbigpIHsgc3RvcEltcGwodHJ1ZSk7IH0KLQotICBjb25zdCBUaHJlYWRNYW5hZ2VyOjpTVEFURSBzdGF0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGVfOwotICB9Ci0KLSAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICByZXR1cm4gdGhyZWFkRmFjdG9yeV87Ci0gIH0KLQotICB2b2lkIHRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICB0aHJlYWRGYWN0b3J5XyA9IHZhbHVlOwotICB9Ci0KLSAgdm9pZCBhZGRXb3JrZXIoc2l6ZV90IHZhbHVlKTsKLQotICB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpOwotCi0gIHNpemVfdCBpZGxlV29ya2VyQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlkbGVDb3VudF87Ci0gIH0KLQotICBzaXplX3Qgd29ya2VyQ291bnQoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHJldHVybiB3b3JrZXJDb3VudF87Ci0gIH0KLQotICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgcmV0dXJuIHRhc2tzXy5zaXplKCk7Ci0gIH0KLQotICBzaXplX3QgdG90YWxUYXNrQ291bnQoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHJldHVybiB0YXNrc18uc2l6ZSgpICsgd29ya2VyQ291bnRfIC0gaWRsZUNvdW50XzsKLSAgfQotCi0gIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICByZXR1cm4gcGVuZGluZ1Rhc2tDb3VudE1heF87Ci0gIH0KLQotICBzaXplX3QgZXhwaXJlZFRhc2tDb3VudCgpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgc2l6ZV90IHJlc3VsdCA9IGV4cGlyZWRDb3VudF87Ci0gICAgZXhwaXJlZENvdW50XyA9IDA7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHZvaWQgcGVuZGluZ1Rhc2tDb3VudE1heChjb25zdCBzaXplX3QgdmFsdWUpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgcGVuZGluZ1Rhc2tDb3VudE1heF8gPSB2YWx1ZTsKLSAgfQotCi0gIGJvb2wgY2FuU2xlZXAoKTsKLQotICB2b2lkIGFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSwgaW50NjRfdCB0aW1lb3V0LCBpbnQ2NF90IGV4cGlyYXRpb24pOwotCi0gIHZvaWQgcmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOwotCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJlbW92ZU5leHRQZW5kaW5nKCk7Ci0KLSAgdm9pZCByZW1vdmVFeHBpcmVkVGFza3MoKTsKLQotICB2b2lkIHNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKTsKLQotcHJpdmF0ZToKLSAgdm9pZCBzdG9wSW1wbChib29sIGpvaW4pOwotCi0gIHNpemVfdCB3b3JrZXJDb3VudF87Ci0gIHNpemVfdCB3b3JrZXJNYXhDb3VudF87Ci0gIHNpemVfdCBpZGxlQ291bnRfOwotICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heF87Ci0gIHNpemVfdCBleHBpcmVkQ291bnRfOwotICBFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFja187Ci0KLSAgVGhyZWFkTWFuYWdlcjo6U1RBVEUgc3RhdGVfOwotICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwotCi0KLSAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OlRhc2s7Ci0gIHN0ZDo6cXVldWU8c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tzXzsKLSAgTXV0ZXggbXV0ZXhfOwotICBNb25pdG9yIG1vbml0b3JfOwotICBNb25pdG9yIG1heE1vbml0b3JfOwotICBNb25pdG9yIHdvcmtlck1vbml0b3JfOwotCi0gIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7Ci0gIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHdvcmtlcnNfOwotICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBkZWFkV29ya2Vyc187Ci0gIHN0ZDo6bWFwPGNvbnN0IFRocmVhZDo6aWRfdCwgc2hhcmVkX3B0cjxUaHJlYWQ+ID4gaWRNYXBfOwotfTsKLQotY2xhc3MgVGhyZWFkTWFuYWdlcjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSBwdWJsaWM6Ci0gIGVudW0gU1RBVEUgewotICAgIFdBSVRJTkcsCi0gICAgRVhFQ1VUSU5HLAotICAgIENBTkNFTExFRCwKLSAgICBDT01QTEVURQotICB9OwotCi0gIFRhc2soc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUsIGludDY0X3QgZXhwaXJhdGlvbj0wTEwpICA6Ci0gICAgcnVubmFibGVfKHJ1bm5hYmxlKSwKLSAgICBzdGF0ZV8oV0FJVElORyksCi0gICAgZXhwaXJlVGltZV8oZXhwaXJhdGlvbiAhPSAwTEwgPyBVdGlsOjpjdXJyZW50VGltZSgpICsgZXhwaXJhdGlvbiA6IDBMTCkge30KLQotICB+VGFzaygpIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgaWYgKHN0YXRlXyA9PSBFWEVDVVRJTkcpIHsKLSAgICAgIHJ1bm5hYmxlXy0+cnVuKCk7Ci0gICAgICBzdGF0ZV8gPSBDT01QTEVURTsKLSAgICB9Ci0gIH0KLQotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBnZXRSdW5uYWJsZSgpIHsKLSAgICByZXR1cm4gcnVubmFibGVfOwotICB9Ci0KLSAgaW50NjRfdCBnZXRFeHBpcmVUaW1lKCkgY29uc3QgewotICAgIHJldHVybiBleHBpcmVUaW1lXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGVfOwotICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOwotICBTVEFURSBzdGF0ZV87Ci0gIGludDY0X3QgZXhwaXJlVGltZV87Ci19OwotCi1jbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gIGVudW0gU1RBVEUgewotICAgIFVOSU5JVElBTElaRUQsCi0gICAgU1RBUlRJTkcsCi0gICAgU1RBUlRFRCwKLSAgICBTVE9QUElORywKLSAgICBTVE9QUEVECi0gIH07Ci0KLSBwdWJsaWM6Ci0gIFdvcmtlcihUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyKSA6Ci0gICAgbWFuYWdlcl8obWFuYWdlciksCi0gICAgc3RhdGVfKFVOSU5JVElBTElaRUQpLAotICAgIGlkbGVfKGZhbHNlKSB7fQotCi0gIH5Xb3JrZXIoKSB7fQotCi0gcHJpdmF0ZToKLSAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4KLSAgICAgIChtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDw9IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pIHx8Ci0gICAgICAobWFuYWdlcl8tPnN0YXRlXyA9PSBKT0lOSU5HICYmICFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpOwotICB9Ci0KLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBXb3JrZXIgZW50cnkgcG9pbnQKLSAgICoKLSAgICogQXMgbG9uZyBhcyB3b3JrZXIgdGhyZWFkIGlzIHJ1bm5pbmcsIHB1bGwgdGFza3Mgb2ZmIHRoZSB0YXNrIHF1ZXVlIGFuZAotICAgKiBleGVjdXRlLgotICAgKi8KLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKLSAgICBib29sIG5vdGlmeU1hbmFnZXIgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB3b3JrZXIgc2VtYXBob3JlIGFuZCBub3RpZnkgbWFuYWdlciBpZiB3b3JrZXIgY291bnQgcmVhY2hlZAotICAgICAqIGRlc2lyZWQgbWF4Ci0gICAgICoKLSAgICAgKiBOb3RlOiBXZSBoYXZlIHRvIHJlbGVhc2UgdGhlIG1vbml0b3IgYW5kIGFjcXVpcmUgdGhlIHdvcmtlck1vbml0b3IKLSAgICAgKiBzaW5jZSB0aGF0IGlzIHdoYXQgdGhlIG1hbmFnZXIgYmxvY2tzIG9uIGZvciB3b3JrZXIgYWRkL3JlbW92ZQotICAgICAqLwotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7Ci0gICAgICBhY3RpdmUgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDwgbWFuYWdlcl8tPndvcmtlck1heENvdW50XzsKLSAgICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgbWFuYWdlcl8tPndvcmtlckNvdW50XysrOwotICAgICAgICBub3RpZnlNYW5hZ2VyID0gbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChub3RpZnlNYW5hZ2VyKSB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8pOwotICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgbm90aWZ5TWFuYWdlciA9IGZhbHNlOwotICAgIH0KLQotICAgIHdoaWxlIChhY3RpdmUpIHsKLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzazsKLQotICAgICAgLyoqCi0gICAgICAgKiBXaGlsZSBob2xkaW5nIG1hbmFnZXIgbW9uaXRvciBibG9jayBmb3Igbm9uLWVtcHR5IHRhc2sgcXVldWUgKEFsc28KLSAgICAgICAqIGNoZWNrIHRoYXQgdGhlIHRocmVhZCBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgdG8gc3RvcCkuIE9uY2UgdGhlIHF1ZXVlCi0gICAgICAgKiBpcyBub24tZW1wdHksIGRlcXVldWUgYSB0YXNrLCByZWxlYXNlIG1vbml0b3IsIGFuZCBleGVjdXRlLiBJZiB0aGUKLSAgICAgICAqIHdvcmtlciBtYXggY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgc3VjaCB0aGF0IHdlIGV4Y2VlZCBpdCwgbWFyawotICAgICAgICogb3Vyc2VsZiBpbmFjdGl2ZSwgZGVjcmVtZW50IHRoZSB3b3JrZXIgY291bnQgYW5kIG5vdGlmeSB0aGUgbWFuYWdlcgotICAgICAgICogKHRlY2huaWNhbGx5IHdlJ3JlIG5vdGlmeWluZyB0aGUgbmV4dCBibG9ja2VkIHRocmVhZCBidXQgZXZlbnR1YWxseQotICAgICAgICogdGhlIG1hbmFnZXIgd2lsbCBzZWUgaXQuCi0gICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgR3VhcmQgZyhtYW5hZ2VyXy0+bXV0ZXhfKTsKLSAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKLQotICAgICAgICB3aGlsZSAoYWN0aXZlICYmIG1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgewotICAgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfKys7Ci0gICAgICAgICAgaWRsZV8gPSB0cnVlOwotICAgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0KCk7Ci0gICAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKLSAgICAgICAgICBpZGxlXyA9IGZhbHNlOwotICAgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfLS07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0aXZlKSB7Ci0gICAgICAgICAgbWFuYWdlcl8tPnJlbW92ZUV4cGlyZWRUYXNrcygpOwotCi0gICAgICAgICAgaWYgKCFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHRhc2sgPSBtYW5hZ2VyXy0+dGFza3NfLmZyb250KCk7Ci0gICAgICAgICAgICBtYW5hZ2VyXy0+dGFza3NfLnBvcCgpOwotICAgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpXQUlUSU5HKSB7Ci0gICAgICAgICAgICAgIHRhc2stPnN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgdGFzayBtYXggYW5kIHdlIGp1c3QgZHJvcHBlZCBiZWxvdyBpdCwgd2FrZXVwIGFueQotICAgICAgICAgICAgICAgdGhyZWFkIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBvbiBhZGQuICovCi0gICAgICAgICAgICBpZiAobWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfICE9IDAgJiYKLSAgICAgICAgICAgICAgICBtYW5hZ2VyXy0+dGFza3NfLnNpemUoKSA8PSBtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gLSAxKSB7Ci0gICAgICAgICAgICAgIG1hbmFnZXJfLT5tYXhNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWRsZV8gPSB0cnVlOwotICAgICAgICAgIG1hbmFnZXJfLT53b3JrZXJDb3VudF8tLTsKLSAgICAgICAgICBub3RpZnlNYW5hZ2VyID0gKG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPT0gbWFuYWdlcl8tPndvcmtlck1heENvdW50Xyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHRhc2sgIT0gTlVMTCkgewotICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORykgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0YXNrLT5ydW4oKTsKLSAgICAgICAgICB9IGNhdGNoKC4uLikgewotICAgICAgICAgICAgLy8gWFhYIG5lZWQgdG8gbG9nIHRoaXMKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8pOwotICAgICAgbWFuYWdlcl8tPmRlYWRXb3JrZXJzXy5pbnNlcnQodGhpcy0+dGhyZWFkKCkpOwotICAgICAgaWYgKG5vdGlmeU1hbmFnZXIpIHsKLSAgICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLSAgfQotCi0gIHByaXZhdGU6Ci0gICAgVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcl87Ci0gICAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OkltcGw7Ci0gICAgU1RBVEUgc3RhdGVfOwotICAgIGJvb2wgaWRsZV87Ci19OwotCi0KLSAgdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGRXb3JrZXIoc2l6ZV90IHZhbHVlKSB7Ci0gIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IG5ld1RocmVhZHM7Ci0gIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB2YWx1ZTsgaXgrKykgewotICAgIGNsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlcjsKLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyID0gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXIodGhpcykpOwotICAgIG5ld1RocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQod29ya2VyKSk7Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHdvcmtlck1heENvdW50XyArPSB2YWx1ZTsKLSAgICB3b3JrZXJzXy5pbnNlcnQobmV3VGhyZWFkcy5iZWdpbigpLCBuZXdUaHJlYWRzLmVuZCgpKTsKLSAgfQotCi0gIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gbmV3VGhyZWFkcy5iZWdpbigpOyBpeCAhPSBuZXdUaHJlYWRzLmVuZCgpOyBpeCsrKSB7Ci0gICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+IHdvcmtlciA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PFRocmVhZE1hbmFnZXI6OldvcmtlciwgUnVubmFibGU+KCgqaXgpLT5ydW5uYWJsZSgpKTsKLSAgICB3b3JrZXItPnN0YXRlXyA9IFRocmVhZE1hbmFnZXI6Oldvcmtlcjo6U1RBUlRJTkc7Ci0gICAgKCppeCktPnN0YXJ0KCk7Ci0gICAgaWRNYXBfLmluc2VydChzdGQ6OnBhaXI8Y29uc3QgVGhyZWFkOjppZF90LCBzaGFyZWRfcHRyPFRocmVhZD4gPigoKml4KS0+Z2V0SWQoKSwgKml4KSk7Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMod29ya2VyTW9uaXRvcl8pOwotICAgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKSB7Ci0KLSAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKLSAgICAgIGlmICh0aHJlYWRGYWN0b3J5XyA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRDsKLSAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOwotICAgIH0KLQotICAgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKLSAgICAgIG1vbml0b3JfLndhaXQoKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdG9wSW1wbChib29sIGpvaW4pIHsKLSAgYm9vbCBkb1N0b3AgPSBmYWxzZTsKLSAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQSU5HICYmCi0gICAgICAgIHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpKT0lOSU5HICYmCi0gICAgICAgIHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEKSB7Ci0gICAgICBkb1N0b3AgPSB0cnVlOwotICAgICAgc3RhdGVfID0gam9pbiA/IFRocmVhZE1hbmFnZXI6OkpPSU5JTkcgOiBUaHJlYWRNYW5hZ2VyOjpTVE9QUElORzsKLSAgICB9Ci0gIH0KLQotICBpZiAoZG9TdG9wKSB7Ci0gICAgcmVtb3ZlV29ya2VyKHdvcmtlckNvdW50Xyk7Ci0gIH0KLQotICAvLyBYWFgKLSAgLy8gc2hvdWxkIGJlIGFibGUgdG8gYmxvY2sgaGVyZSBmb3IgdHJhbnNpdGlvbiB0byBTVE9QUEVEIHNpbmNlIHdlJ3JlIG5vCi0gIC8vIHVzaW5nIHNoYXJlZF9wdHJzCi0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEOwotICB9Ci0KLX0KLQotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlKSB7Ci0gIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHJlbW92ZWRUaHJlYWRzOwotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmICh2YWx1ZSA+IHdvcmtlck1heENvdW50XykgewotICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgd29ya2VyTWF4Q291bnRfIC09IHZhbHVlOwotCi0gICAgaWYgKGlkbGVDb3VudF8gPCB2YWx1ZSkgewotICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGlkbGVDb3VudF87IGl4KyspIHsKLSAgICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOwotICAgIH0KLSAgfQotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyh3b3JrZXJNb25pdG9yXyk7Ci0KLSAgICB3aGlsZSAod29ya2VyQ291bnRfICE9IHdvcmtlck1heENvdW50XykgewotICAgICAgd29ya2VyTW9uaXRvcl8ud2FpdCgpOwotICAgIH0KLQotICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gZGVhZFdvcmtlcnNfLmJlZ2luKCk7IGl4ICE9IGRlYWRXb3JrZXJzXy5lbmQoKTsgaXgrKykgewotICAgICAgd29ya2Vyc18uZXJhc2UoKml4KTsKLSAgICAgIGlkTWFwXy5lcmFzZSgoKml4KS0+Z2V0SWQoKSk7Ci0gICAgfQotCi0gICAgZGVhZFdvcmtlcnNfLmNsZWFyKCk7Ci0gIH0KLX0KLQotICBib29sIFRocmVhZE1hbmFnZXI6OkltcGw6OmNhblNsZWVwKCkgewotICAgIGNvbnN0IFRocmVhZDo6aWRfdCBpZCA9IHRocmVhZEZhY3RvcnlfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsKLSAgICByZXR1cm4gaWRNYXBfLmZpbmQoaWQpID09IGlkTWFwXy5lbmQoKTsKLSAgfQotCi0gIHZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXhwaXJhdGlvbikgewotICAgIEd1YXJkIGcobXV0ZXhfLCB0aW1lb3V0KTsKLQotICAgIGlmICghZykgewotICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHJlbW92ZUV4cGlyZWRUYXNrcygpOwotICAgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7Ci0gICAgICBpZiAoY2FuU2xlZXAoKSAmJiB0aW1lb3V0ID49IDApIHsKLSAgICAgICAgd2hpbGUgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiB0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSB7Ci0gICAgICAgICAgLy8gVGhpcyBpcyB0aHJlYWQgc2FmZSBiZWNhdXNlIHRoZSBtdXRleCBpcyBzaGFyZWQgYmV0d2VlbiBtb25pdG9ycy4KLSAgICAgICAgICBtYXhNb25pdG9yXy53YWl0KHRpbWVvdXQpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdGFza3NfLnB1c2goc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlcjo6VGFzayh2YWx1ZSwgZXhwaXJhdGlvbikpKTsKLQotICAgIC8vIElmIGlkbGUgdGhyZWFkIGlzIGF2YWlsYWJsZSBub3RpZnkgaXQsIG90aGVyd2lzZSBhbGwgd29ya2VyIHRocmVhZHMgYXJlCi0gICAgLy8gcnVubmluZyBhbmQgd2lsbCBnZXQgYXJvdW5kIHRvIHRoaXMgdGFzayBpbiB0aW1lLgotICAgIGlmIChpZGxlQ291bnRfID4gMCkgewotICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgfQotICB9Ci0KLXZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKLSAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgfQotfQotCi1ib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcoKSB7Ci0gIEd1YXJkIGcobXV0ZXhfKTsKLSAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBpZiAodGFza3NfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+KCk7Ci0gIH0KLQotICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2sgPSB0YXNrc18uZnJvbnQoKTsKLSAgdGFza3NfLnBvcCgpOwotICAKLSAgcmV0dXJuIHRhc2stPmdldFJ1bm5hYmxlKCk7Ci19Ci0KLXZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlRXhwaXJlZFRhc2tzKCkgewotICBpbnQ2NF90IG5vdyA9IDBMTDsgLy8gd2Ugd29uJ3QgYXNrIGZvciB0aGUgdGltZSB1bnRpbGUgd2UgbmVlZCBpdAotCi0gIC8vIG5vdGUgdGhhdCB0aGlzIGxvb3AgYnJlYWtzIGF0IHRoZSBmaXJzdCBub24tZXhwaXJpbmcgdGFzawotICB3aGlsZSAoIXRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrID0gdGFza3NfLmZyb250KCk7Ci0gICAgaWYgKHRhc2stPmdldEV4cGlyZVRpbWUoKSA9PSAwTEwpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAobm93ID09IDBMTCkgewotICAgICAgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICB9Ci0gICAgaWYgKHRhc2stPmdldEV4cGlyZVRpbWUoKSA+IG5vdykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChleHBpcmVDYWxsYmFja18pIHsKLSAgICAgIGV4cGlyZUNhbGxiYWNrXyh0YXNrLT5nZXRSdW5uYWJsZSgpKTsKLSAgICB9Ci0gICAgdGFza3NfLnBvcCgpOwotICAgIGV4cGlyZWRDb3VudF8rKzsKLSAgfQotfQotCi0KLXZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spIHsKLSAgZXhwaXJlQ2FsbGJhY2tfID0gZXhwaXJlQ2FsbGJhY2s7Ci19Ci0KLWNsYXNzIFNpbXBsZVRocmVhZE1hbmFnZXIgOiBwdWJsaWMgVGhyZWFkTWFuYWdlcjo6SW1wbCB7Ci0KLSBwdWJsaWM6Ci0gIFNpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IHdvcmtlckNvdW50PTQsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4PTApIDoKLSAgICB3b3JrZXJDb3VudF8od29ya2VyQ291bnQpLAotICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfKHBlbmRpbmdUYXNrQ291bnRNYXgpLAotICAgIGZpcnN0VGltZV8odHJ1ZSkgewotICB9Ci0KLSAgdm9pZCBzdGFydCgpIHsKLSAgICBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpwZW5kaW5nVGFza0NvdW50TWF4KHBlbmRpbmdUYXNrQ291bnRNYXhfKTsKLSAgICBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdGFydCgpOwotICAgIGFkZFdvcmtlcih3b3JrZXJDb3VudF8pOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBzaXplX3Qgd29ya2VyQ291bnRfOwotICBjb25zdCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heF87Ci0gIGJvb2wgZmlyc3RUaW1lXzsKLSAgTW9uaXRvciBtb25pdG9yXzsKLX07Ci0KLQotc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdUaHJlYWRNYW5hZ2VyKCkgewotICByZXR1cm4gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPihuZXcgVGhyZWFkTWFuYWdlcjo6SW1wbCgpKTsKLX0KLQotc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgpIHsKLSAgcmV0dXJuIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4obmV3IFNpbXBsZVRocmVhZE1hbmFnZXIoY291bnQsIHBlbmRpbmdUYXNrQ291bnRNYXgpKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzQ5MDYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfIDEKLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgIlRocmVhZC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogVGhyZWFkIFBvb2wgTWFuYWdlciBhbmQgcmVsYXRlZCBjbGFzc2VzCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVGhyZWFkTWFuYWdlcjsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyIGNsYXNzCi0gKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGEgcG9vbCBvZiB0aHJlYWRzLiBJdCB1c2VzIGEgVGhyZWFkRmFjdG9yeSB0byBjcmVhdGUKLSAqIHRocmVhZHMuIEl0IG5ldmVyIGFjdHVhbGx5IGNyZWF0ZXMgb3IgZGVzdHJveXMgd29ya2VyIHRocmVhZHMsIHJhdGhlcgotICogSXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAotICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzIGFuZCBpbmZvcm1zIHRoZSBQb29sUG9saWN5Ci0gKiBvYmplY3QgYm91bmQgdG8gaW5zdGFuY2VzIG9mIHRoaXMgbWFuYWdlciBvZiBpbnRlcmVzdGluZyB0cmFuc2l0aW9ucy4gSXQgaXMKLSAqIHRoZW4gdXAgdGhlIFBvb2xQb2xpY3kgb2JqZWN0IHRvIGRlY2lkZSBpZiB0aGUgdGhyZWFkIHBvb2wgc2l6ZSBuZWVkcyB0byBiZQotICogYWRqdXN0ZWQgYW5kIGNhbGwgdGhpcyBvYmplY3QgYWRkV29ya2VyIGFuZCByZW1vdmVXb3JrZXIgbWV0aG9kcyB0byBtYWtlCi0gKiBjaGFuZ2VzLgotICoKLSAqIFRoaXMgZGVzaWduIGFsbG93cyBkaWZmZXJlbnQgcG9saWN5IGltcGxlbWVudGF0aW9ucyB0byB1c2VkIHRoaXMgY29kZSB0bwotICogaGFuZGxlIGJhc2ljIHdvcmtlciB0aHJlYWQgbWFuYWdlbWVudCBhbmQgd29ya2VyIHRhc2sgZXhlY3V0aW9uIGFuZCBmb2N1cyBvbgotICogcG9saWN5IGlzc3Vlcy4gVGhlIHNpbXBsZXN0IHBvbGljeSwgU3RhdGljUG9saWN5LCBkb2VzIG5vdGhpbmcgb3RoZXIgdGhhbgotICogY3JlYXRlIGEgZml4ZWQgbnVtYmVyIG9mIHRocmVhZHMuCi0gKi8KLWNsYXNzIFRocmVhZE1hbmFnZXIgewotCi0gcHJvdGVjdGVkOgotICBUaHJlYWRNYW5hZ2VyKCkge30KLQotIHB1YmxpYzoKLSAgY2xhc3MgVGFzazsKLSAgdHlwZWRlZiBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4pPiBFeHBpcmVDYWxsYmFjazsKLQotICB2aXJ0dWFsIH5UaHJlYWRNYW5hZ2VyKCkge30KLQotICAvKioKLSAgICogU3RhcnRzIHRoZSB0aHJlYWQgbWFuYWdlci4gVmVyaWZpZXMgYWxsIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHByb3Blcmx5Ci0gICAqIGluaXRpYWxpemVkLCB0aGVuIGFsbG9jYXRlcyBuZWNlc3NhcnkgcmVzb3VyY2VzIHRvIGJlZ2luIG9wZXJhdGlvbgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOwotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgdGhyZWFkIG1hbmFnZXIuIEFib3J0cyBhbGwgcmVtYWluaW5nIHVucHJvY2Vzc2VkIHRhc2ssIHNodXRzCi0gICAqIGRvd24gYWxsIGNyZWF0ZWQgd29ya2VyIHRocmVhZHMsIGFuZCByZWFsZWFzZXMgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMuCi0gICAqIFRoaXMgbWV0aG9kIGJsb2NrcyBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIGNvbXBsZXRlLCB0aHVzIGl0IGNhbgotICAgKiBwb3RlbnRpYWxseSBibG9jayBmb3JldmVyIGlmIGEgd29ya2VyIHRocmVhZCBpcyBydW5uaW5nIGEgdGFzayB0aGF0Ci0gICAqIHdvbid0IHRlcm1pbmF0ZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzdG9wKCkgPSAwOwotCi0gIC8qKgotICAgKiBKb2lucyB0aGUgdGhyZWFkIG1hbmFnZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgc3RvcCwgZXhjZXB0IHRoYXQgaXQgd2lsbAotICAgKiBibG9jayB1bnRpbCBhbGwgdGhlIHdvcmtlcnMgaGF2ZSBmaW5pc2hlZCB0aGVpciB3b3JrLiBBdCB0aGF0IHBvaW50Ci0gICAqIHRoZSBUaHJlYWRNYW5hZ2VyIHdpbGwgdHJhbnNpdGlvbiBpbnRvIHRoZSBTVE9QUEVEIHN0YXRlLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGpvaW4oKSA9IDA7Ci0KLSAgZW51bSBTVEFURSB7Ci0gICAgVU5JTklUSUFMSVpFRCwKLSAgICBTVEFSVElORywKLSAgICBTVEFSVEVELAotICAgIEpPSU5JTkcsCi0gICAgU1RPUFBJTkcsCi0gICAgU1RPUFBFRAotICB9OwotCi0gIHZpcnR1YWwgY29uc3QgU1RBVEUgc3RhdGUoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHZhbHVlKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIGFkZFdvcmtlcihzaXplX3QgdmFsdWU9MSkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCByZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlPTEpID0gMDsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgaWRsZSB3b3JrZXIgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiB0b3RhbCB3b3JrZXIgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCBzaXplX3Qgd29ya2VyQ291bnQoKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBlbmRpbmcgdGFza3MKLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnQoKSBjb25zdCAgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiBwZW5kaW5nIGFuZCBleGVjdXRpbmcgdGFza3MKLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IHRvdGFsVGFza0NvdW50KCkgY29uc3QgPSAwOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBtYXhpbXVtIHBlbmRpbmcgdGFzayBjb3VudC4gIDAgaW5kaWNhdGVzIG5vIG1heGltdW0KLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCA9IDA7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG51bWJlciBvZiB0YXNrcyB3aGljaCBoYXZlIGJlZW4gZXhwaXJlZCB3aXRob3V0IGJlaW5nIHJ1bi4KLSAgICovCi0gIHZpcnR1YWwgc2l6ZV90IGV4cGlyZWRUYXNrQ291bnQoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KLSAgICoKLSAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayBpZiBwZW5kaW5nVGFza0NvdW50TWF4KCkgaW4gbm90IHplcm8gYW5kIHBlbmRpbmdUYXNrQ291bnQoKQotICAgKiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWx0IHRvIHBlbmRpbmdUYXNrQ291bnRNYXgoKS4gIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0aGUKLSAgICogY29udGV4dCBvZiBhIFRocmVhZE1hbmFnZXIgd29ya2VyIHRocmVhZCBpdCB3aWxsIHRocm93IGEKLSAgICogVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbgotICAgKgotICAgKiBAcGFyYW0gdGFzayAgVGhlIHRhc2sgdG8gcXVldWUgZm9yIGV4ZWN1dGlvbgotICAgKgotICAgKiBAcGFyYW0gdGltZW91dCBUaW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFkZCBhIHRhc2sgd2hlbiBhIHBlbmRpbmctdGFzay1jb3VudAotICAgKiBpcyBzcGVjaWZpZWQuIFNwZWNpZmljIGNhc2VzOgotICAgKiB0aW1lb3V0ID0gMCAgOiBXYWl0IGZvcmV2ZXIgdG8gcXVldWUgdGFzay4KLSAgICogdGltZW91dCA9IC0xIDogUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIHNwZWNpZmllZCBtYXgKLSAgICogQHBhcmFtIGV4cGlyYXRpb24gd2hlbiBub256ZXJvLCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgdGFzayBpcyB2YWxpZAotICAgKiB0byBiZSBydW47IGlmIGV4Y2VlZGVkLCB0aGUgdGFzayB3aWxsIGJlIGRyb3BwZWQgb2ZmIHRoZSBxdWV1ZSBhbmQgbm90IHJ1bi4KLSAgICoKLSAgICogQHRocm93cyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIFBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIG1heCBwZW5kaW5nIHRhc2sgY291bnQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+dGFzaywKLSAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXQ9MExMLAotICAgICAgICAgICAgICAgICAgIGludDY0X3QgZXhwaXJhdGlvbj0wTEwpID0gMDsKLQotICAvKioKLSAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzawotICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOwotCi0gIC8qKgotICAgKiBSZW1vdmUgdGhlIG5leHQgcGVuZGluZyB0YXNrIHdoaWNoIHdvdWxkIGJlIHJ1bi4KLSAgICoKLSAgICogQHJldHVybiB0aGUgdGFzayByZW1vdmVkLgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSB0YXNrcyBmcm9tIGZyb250IG9mIHRhc2sgcXVldWUgdGhhdCBoYXZlIGV4cGlyZWQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlRXhwaXJlZFRhc2tzKCkgPSAwOwotCi0gIC8qKgotICAgKiBTZXQgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIHRhc2sgaXMgZXhwaXJlZCBhbmQgbm90IHJ1bi4KLSAgICoKLSAgICogQHBhcmFtIGV4cGlyZUNhbGxiYWNrIGEgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIHNoYXJlZF9wdHI8UnVubmFibGU+IGZvcgotICAgKiB0aGUgZXhwaXJlZCB0YXNrLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKSA9IDA7Ci0KLSAgc3RhdGljIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1RocmVhZE1hbmFnZXIoKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHNpbXBsZSB0aHJlYWQgbWFuYWdlciB0aGUgdXNlcyBjb3VudCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIGhhcwotICAgKiBhIHBlbmRpbmdUYXNrQ291bnRNYXggbWF4aW11bSBwZW5kaW5nIHRhc2tzLiBUaGUgZGVmYXVsdCwgMCwgc3BlY2lmaWVkIG5vIGxpbWl0Ci0gICAqIG9uIHBlbmRpbmcgdGFza3MKLSAgICovCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudD00LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heD0wKTsKLQotICBjbGFzcyBUYXNrOwotCi0gIGNsYXNzIFdvcmtlcjsKLQotICBjbGFzcyBJbXBsOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAgYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQwZDljLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVGltZXJNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiVXRpbC5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi0vKioKLSAqIFRpbWVyTWFuYWdlciBjbGFzcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFRpbWVyTWFuYWdlcjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSBwdWJsaWM6Ci0gIGVudW0gU1RBVEUgewotICAgIFdBSVRJTkcsCi0gICAgRVhFQ1VUSU5HLAotICAgIENBTkNFTExFRCwKLSAgICBDT01QTEVURQotICB9OwotCi0gIFRhc2soc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIDoKLSAgICBydW5uYWJsZV8ocnVubmFibGUpLAotICAgIHN0YXRlXyhXQUlUSU5HKSB7fQotCi0gIH5UYXNrKCkgewotICB9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgaWYgKHN0YXRlXyA9PSBFWEVDVVRJTkcpIHsKLSAgICAgIHJ1bm5hYmxlXy0+cnVuKCk7Ci0gICAgICBzdGF0ZV8gPSBDT01QTEVURTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlXzsKLSAgY2xhc3MgVGltZXJNYW5hZ2VyOjpEaXNwYXRjaGVyOwotICBmcmllbmQgY2xhc3MgVGltZXJNYW5hZ2VyOjpEaXNwYXRjaGVyOwotICBTVEFURSBzdGF0ZV87Ci19OwotCi1jbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXI6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSBwdWJsaWM6Ci0gIERpc3BhdGNoZXIoVGltZXJNYW5hZ2VyKiBtYW5hZ2VyKSA6Ci0gICAgbWFuYWdlcl8obWFuYWdlcikge30KLQotICB+RGlzcGF0Y2hlcigpIHt9Ci0KLSAgLyoqCi0gICAqIERpc3BhdGNoZXIgZW50cnkgcG9pbnQKLSAgICoKLSAgICogQXMgbG9uZyBhcyBkaXNwYXRjaGVyIHRocmVhZCBpcyBydW5uaW5nLCBwdWxsIHRhc2tzIG9mZiB0aGUgdGFzayB0YXNrTWFwXwotICAgKiBhbmQgZXhlY3V0ZS4KLSAgICovCi0gIHZvaWQgcnVuKCkgewotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7Ci0gICAgICBpZiAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJUSU5HKSB7Ci0gICAgICAgIG1hbmFnZXJfLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUQVJURUQ7Ci0gICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy5ub3RpZnlBbGwoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkbyB7Ci0gICAgICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gPiBleHBpcmVkVGFza3M7Ci0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7Ci0gICAgICAgIHRhc2tfaXRlcmF0b3IgZXhwaXJlZFRhc2tFbmQ7Ci0gICAgICAgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICAgICAgd2hpbGUgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEICYmCi0gICAgICAgICAgICAgICAoZXhwaXJlZFRhc2tFbmQgPSBtYW5hZ2VyXy0+dGFza01hcF8udXBwZXJfYm91bmQobm93KSkgPT0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCkpIHsKLSAgICAgICAgICBpbnQ2NF90IHRpbWVvdXQgPSAwTEw7Ci0gICAgICAgICAgaWYgKCFtYW5hZ2VyXy0+dGFza01hcF8uZW1wdHkoKSkgewotICAgICAgICAgICAgdGltZW91dCA9IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpLT5maXJzdCAtIG5vdzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXNzZXJ0KCh0aW1lb3V0ICE9IDAgJiYgbWFuYWdlcl8tPnRhc2tDb3VudF8gPiAwKSB8fCAodGltZW91dCA9PSAwICYmIG1hbmFnZXJfLT50YXNrQ291bnRfID09IDApKTsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLndhaXQodGltZW91dCk7Ci0gICAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24gJmUpIHt9Ci0gICAgICAgICAgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgewotICAgICAgICAgIGZvciAodGFza19pdGVyYXRvciBpeCA9IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpOyBpeCAhPSBleHBpcmVkVGFza0VuZDsgaXgrKykgewotICAgICAgICAgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+IHRhc2sgPSBpeC0+c2Vjb25kOwotICAgICAgICAgICAgZXhwaXJlZFRhc2tzLmluc2VydCh0YXNrKTsKLSAgICAgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpUYXNrOjpXQUlUSU5HKSB7Ci0gICAgICAgICAgICAgIHRhc2stPnN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFuYWdlcl8tPnRhc2tDb3VudF8tLTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbWFuYWdlcl8tPnRhc2tNYXBfLmVyYXNlKG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpLCBleHBpcmVkVGFza0VuZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gIGV4cGlyZWRUYXNrcy5iZWdpbigpOyBpeCAhPSBleHBpcmVkVGFza3MuZW5kKCk7IGl4KyspIHsKLSAgICAgICAgKCppeCktPnJ1bigpOwotICAgICAgfQotCi0gICAgfSB3aGlsZSAobWFuYWdlcl8tPnN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOwotCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKLSAgICAgIGlmIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RPUFBJTkcpIHsKLSAgICAgICAgbWFuYWdlcl8tPnN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RPUFBFRDsKLSAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFRpbWVyTWFuYWdlciogbWFuYWdlcl87Ci0gIGZyaWVuZCBjbGFzcyBUaW1lck1hbmFnZXI7Ci19OwotCi1UaW1lck1hbmFnZXI6OlRpbWVyTWFuYWdlcigpIDoKLSAgdGFza0NvdW50XygwKSwKLSAgc3RhdGVfKFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCksCi0gIGRpc3BhdGNoZXJfKHNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4obmV3IERpc3BhdGNoZXIodGhpcykpKSB7Ci19Ci0KLQotVGltZXJNYW5hZ2VyOjp+VGltZXJNYW5hZ2VyKCkgewotCi0gIC8vIElmIHdlIGhhdmVuJ3QgYmVlbiBleHBsaWNpdGx5IHN0b3BwZWQsIGRvIHNvIG5vdy4gIFdlIGRvbid0IG5lZWQgdG8gZ3JhYgotICAvLyB0aGUgbW9uaXRvciBoZXJlLCBzaW5jZSBzdG9wIGFscmVhZHkgdGFrZXMgY2FyZSBvZiByZWVudHJhbmN5LgotCi0gIGlmIChzdGF0ZV8gIT0gU1RPUFBFRCkgewotICAgIHRyeSB7Ci0gICAgICBzdG9wKCk7Ci0gICAgfSBjYXRjaCguLi4pIHsKLSAgICAgIHRocm93OwotICAgICAgLy8gdWhvaAotICAgIH0KLSAgfQotfQotCi12b2lkIFRpbWVyTWFuYWdlcjo6c3RhcnQoKSB7Ci0gIGJvb2wgZG9TdGFydCA9IGZhbHNlOwotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmICh0aHJlYWRGYWN0b3J5XyA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgaWYgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKLSAgICAgIHN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkc7Ci0gICAgICBkb1N0YXJ0ID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZG9TdGFydCkgewotICAgIGRpc3BhdGNoZXJUaHJlYWRfID0gdGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChkaXNwYXRjaGVyXyk7Ci0gICAgZGlzcGF0Y2hlclRocmVhZF8tPnN0YXJ0KCk7Ci0gIH0KLQotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHdoaWxlIChzdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORykgewotICAgICAgbW9uaXRvcl8ud2FpdCgpOwotICAgIH0KLSAgICBhc3NlcnQoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkcpOwotICB9Ci19Ci0KLXZvaWQgVGltZXJNYW5hZ2VyOjpzdG9wKCkgewotICBib29sIGRvU3RvcCA9IGZhbHNlOwotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7Ci0gICAgICBzdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUT1BQRUQ7Ci0gICAgfSBlbHNlIGlmIChzdGF0ZV8gIT0gU1RPUFBJTkcgJiYgIHN0YXRlXyAhPSBTVE9QUEVEKSB7Ci0gICAgICBkb1N0b3AgPSB0cnVlOwotICAgICAgc3RhdGVfID0gU1RPUFBJTkc7Ci0gICAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKLSAgICB9Ci0gICAgd2hpbGUgKHN0YXRlXyAhPSBTVE9QUEVEKSB7Ci0gICAgICBtb25pdG9yXy53YWl0KCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGRvU3RvcCkgewotICAgIC8vIENsZWFuIHVwIGFueSBvdXRzdGFuZGluZyB0YXNrcwotICAgIHRhc2tNYXBfLmNsZWFyKCk7Ci0KLSAgICAvLyBSZW1vdmUgZGlzcGF0Y2hlcidzIHJlZmVyZW5jZSB0byB1cy4KLSAgICBkaXNwYXRjaGVyXy0+bWFuYWdlcl8gPSBOVUxMOwotICB9Ci19Ci0KLXNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gVGltZXJNYW5hZ2VyOjp0aHJlYWRGYWN0b3J5KCkgY29uc3QgewotICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gIHJldHVybiB0aHJlYWRGYWN0b3J5XzsKLX0KLQotdm9pZCBUaW1lck1hbmFnZXI6OnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiAgdmFsdWUpIHsKLSAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICB0aHJlYWRGYWN0b3J5XyA9IHZhbHVlOwotfQotCi1zaXplX3QgVGltZXJNYW5hZ2VyOjp0YXNrQ291bnQoKSBjb25zdCB7Ci0gIHJldHVybiB0YXNrQ291bnRfOwotfQotCi12b2lkIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCkgewotICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gIHRpbWVvdXQgKz0gbm93OwotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8vIElmIHRoZSB0YXNrIG1hcCBpcyBlbXB0eSwgd2Ugd2lsbCBraWNrIHRoZSBkaXNwYXRjaGVyIGZvciBzdXJlLiBPdGhlcndpc2UsIHdlIGtpY2sgaGltCi0gICAgLy8gaWYgdGhlIGV4cGlyYXRpb24gdGltZSBpcyBzaG9ydGVyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUuIE5lZWQgdG8gdGVzdCBiZWZvcmUgd2UgaW5zZXJ0LAotICAgIC8vIGJlY2F1c2UgdGhlIG5ldyB0YXNrIG1pZ2h0IGluc2VydCBhdCB0aGUgZnJvbnQuCi0gICAgYm9vbCBub3RpZnlSZXF1aXJlZCA9ICh0YXNrQ291bnRfID09IDApID8gdHJ1ZSA6IHRpbWVvdXQgPCB0YXNrTWFwXy5iZWdpbigpLT5maXJzdDsKLQotICAgIHRhc2tDb3VudF8rKzsKLSAgICB0YXNrTWFwXy5pbnNlcnQoc3RkOjpwYWlyPGludDY0X3QsIHNoYXJlZF9wdHI8VGFzaz4gPih0aW1lb3V0LCBzaGFyZWRfcHRyPFRhc2s+KG5ldyBUYXNrKHRhc2spKSkpOwotCi0gICAgLy8gSWYgdGhlIHRhc2sgbWFwIHdhcyBlbXB0eSwgb3IgaWYgd2UgaGF2ZSBhbiBleHBpcmF0aW9uIHRoYXQgaXMgZWFybGllcgotICAgIC8vIHRoYW4gYW55IHByZXZpb3VzbHkgc2Vlbiwga2ljayB0aGUgZGlzcGF0Y2hlciBzbyBpdCBjYW4gdXBkYXRlIGl0cwotICAgIC8vIHRpbWVvdXQKLSAgICBpZiAobm90aWZ5UmVxdWlyZWQpIHsKLSAgICAgIG1vbml0b3JfLm5vdGlmeSgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyYgdmFsdWUpIHsKLQotICBpbnQ2NF90IGV4cGlyYXRpb247Ci0gIFV0aWw6OnRvTWlsbGlzZWNvbmRzKGV4cGlyYXRpb24sIHZhbHVlKTsKLQotICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgaWYgKGV4cGlyYXRpb24gPCBub3cpIHsKLSAgICB0aHJvdyAgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gIH0KLQotICBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7Ci19Ci0KLQotdm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Ci0gIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgfQotfQotCi1jb25zdCBUaW1lck1hbmFnZXI6OlNUQVRFIFRpbWVyTWFuYWdlcjo6c3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0ZV87IH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmJmMGVhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXyAxCi0KLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJNb25pdG9yLmgiCi0jaW5jbHVkZSAiVGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogVGltZXIgTWFuYWdlcgotICoKLSAqIFRoaXMgY2xhc3MgZGlzcGF0Y2hlcyB0aW1lciB0YXNrcyB3aGVuIHRoZXkgZmFsbCBkdWUuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVGltZXJNYW5hZ2VyIHsKLQotIHB1YmxpYzoKLQotICBUaW1lck1hbmFnZXIoKTsKLQotICB2aXJ0dWFsIH5UaW1lck1hbmFnZXIoKTsKLQotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0cyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIE1pc3NpbmcgdGhyZWFkIGZhY3RvcnkgYXR0cmlidXRlCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKLQotICAvKioKLSAgICogU3RvcHMgdGhlIHRpbWVyIG1hbmFnZXIgc2VydmljZQotICAgKi8KLSAgdmlydHVhbCB2b2lkIHN0b3AoKTsKLQotICB2aXJ0dWFsIHNpemVfdCB0YXNrQ291bnQoKSBjb25zdCA7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KLSAgICoKLSAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQotICAgKiBAcGFyYW0gdGltZW91dCBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBkZWxheSBiZWZvcmUgZXhlY3V0aW5nIHRhc2sKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCk7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KLSAgICoKLSAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQotICAgKiBAcGFyYW0gdGltZW91dCBBYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZXhlY3V0ZSB0YXNrLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgY29uc3Qgc3RydWN0IHRpbWVzcGVjJiB0aW1lb3V0KTsKLQotICAvKioKLSAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzawotICAgKgotICAgKiBAdGhyb3dzIE5vU3VjaFRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgZG9lc24ndCBleGlzdC4gSXQgd2FzIGVpdGhlcgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGFscmVhZHkgb3IgdGhpcyBjYWxsIHdhcyBtYWRlIGZvciBhCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHRoYXQgd2FzIG5ldmVyIGFkZGVkIHRvIHRoaXMgdGltZXIKLSAgICoKLSAgICogQHRocm93cyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBpcyBhbHJlYWR5IGJlaW5nCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgb3IgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKLQotICBlbnVtIFNUQVRFIHsKLSAgICBVTklOSVRJQUxJWkVELAotICAgIFNUQVJUSU5HLAotICAgIFNUQVJURUQsCi0gICAgU1RPUFBJTkcsCi0gICAgU1RPUFBFRAotICB9OwotCi0gIHZpcnR1YWwgY29uc3QgU1RBVEUgc3RhdGUoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwotICBjbGFzcyBUYXNrOwotICBmcmllbmQgY2xhc3MgVGFzazsKLSAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBib29zdDo6c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tNYXBfOwotICBzaXplX3QgdGFza0NvdW50XzsKLSAgTW9uaXRvciBtb25pdG9yXzsKLSAgU1RBVEUgc3RhdGVfOwotICBjbGFzcyBEaXNwYXRjaGVyOwotICBmcmllbmQgY2xhc3MgRGlzcGF0Y2hlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gZGlzcGF0Y2hlclRocmVhZF87Ci0gIHR5cGVkZWYgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBib29zdDo6c2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+ID46Oml0ZXJhdG9yIHRhc2tfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgc3RkOjpwYWlyPHRhc2tfaXRlcmF0b3IsIHRhc2tfaXRlcmF0b3I+IHRhc2tfcmFuZ2U7Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS9VdGlsLmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1V0aWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzJhNDYwLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1V0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVXRpbC5oIgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZW5kaWYgLy8gZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUUpCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotY29uc3QgaW50NjRfdCBVdGlsOjpjdXJyZW50VGltZVRpY2tzKGludDY0X3QgdGlja3NQZXJTZWMpIHsKLSAgaW50NjRfdCByZXN1bHQ7Ci0KLSNpZiBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkKLSAgc3RydWN0IHRpbWVzcGVjIG5vdzsKLSAgaW50IHJldCA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpOwotICBhc3NlcnQocmV0ID09IDApOwotICB0b1RpY2tzKHJlc3VsdCwgbm93LCB0aWNrc1BlclNlYyk7Ci0jZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQotICBzdHJ1Y3QgdGltZXZhbCBub3c7Ci0gIGludCByZXQgPSBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0gIHRvVGlja3MocmVzdWx0LCBub3csIHRpY2tzUGVyU2VjKTsKLSNlbHNlCi0jZXJyb3IgIk5vIGhpZ2gtcHJlY2lzaW9uIGNsb2NrIGlzIGF2YWlsYWJsZS4iCi0jZW5kaWYgLy8gZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUUpCi0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5oIGIvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvVXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGEyMjFkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L1V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfCi0jZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVVRJTF9IXyAxCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcwotICoKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYmFzaWMgdXRpbGl0eSBtZXRob2RzIGZvciBjb252ZXJ0aW5nIHRpbWUgZm9ybWF0cywKLSAqIGFuZCBvdGhlciBjb21tb24gcGxhdGZvcm0tZGVwZW5kZW50IGNvbmN1cnJlbmN5IG9wZXJhdGlvbnMuCi0gKiBJdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIEFQSSBoZWFkZXJzIGZvciBvdGhlciBjb25jdXJyZW5jeSBsaWJyYXJ5Ci0gKiBoZWFkZXJzLCBzaW5jZSBpdCB3aWxsLCBieSBkZWZpbml0aW9uLCBwdWxsIGluIGFsbCBzb3J0cyBvZiBob3JyaWQKLSAqIHBsYXRmb3JtIGRlcGVuZGVudCBzdHVmZi4gIFJhdGhlciBpdCBzaG91bGQgYmUgaW5sdWRlZCBkaXJlY3RseSBpbgotICogY29uY3VycmVuY3kgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiBzb3VyY2UuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVXRpbCB7Ci0KLSAgc3RhdGljIGNvbnN0IGludDY0X3QgTlNfUEVSX1MgPSAxMDAwMDAwMDAwTEw7Ci0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IFVTX1BFUl9TID0gMTAwMDAwMExMOwotICBzdGF0aWMgY29uc3QgaW50NjRfdCBNU19QRVJfUyA9IDEwMDBMTDsKLQotICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfTVMgPSBOU19QRVJfUyAvIE1TX1BFUl9TOwotICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfVVMgPSBOU19QRVJfUyAvIFVTX1BFUl9TOwotICBzdGF0aWMgY29uc3QgaW50NjRfdCBVU19QRVJfTVMgPSBVU19QRVJfUyAvIE1TX1BFUl9TOwotCi0gcHVibGljOgotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBtaWxsaXNlY29uZCB0aW1lc3RhbXAgaW50byBhIHRpbWVzcGVjIHN0cnVjdAotICAgKgotICAgKiBAcGFyYW0gc3RydWN0IHRpbWVzcGVjJiByZXN1bHQKLSAgICogQHBhcmFtIHRpbWUgb3IgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCi0gICAqLwotICBzdGF0aWMgdm9pZCB0b1RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyYgcmVzdWx0LCBpbnQ2NF90IHZhbHVlKSB7Ci0gICAgcmVzdWx0LnR2X3NlYyA9IHZhbHVlIC8gTVNfUEVSX1M7IC8vIG1zIHRvIHMKLSAgICByZXN1bHQudHZfbnNlYyA9ICh2YWx1ZSAlIE1TX1BFUl9TKSAqIE5TX1BFUl9NUzsgLy8gbXMgdG8gbnMKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHRvVGltZXZhbChzdHJ1Y3QgdGltZXZhbCYgcmVzdWx0LCBpbnQ2NF90IHZhbHVlKSB7Ci0gICAgcmVzdWx0LnR2X3NlYyA9IHZhbHVlIC8gTVNfUEVSX1M7IC8vIG1zIHRvIHMKLSAgICByZXN1bHQudHZfdXNlYyA9ICh2YWx1ZSAlIE1TX1BFUl9TKSAqIFVTX1BFUl9NUzsgLy8gbXMgdG8gdXMKLSAgfQotCi0gIHN0YXRpYyBjb25zdCB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LCBpbnQ2NF90IHNlY3MsIGludDY0X3Qgb2xkVGlja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvbGRUaWNrc1BlclNlYywgaW50NjRfdCBuZXdUaWNrc1BlclNlYykgewotICAgIHJlc3VsdCA9IHNlY3MgKiBuZXdUaWNrc1BlclNlYzsKLSAgICByZXN1bHQgKz0gb2xkVGlja3MgKiBuZXdUaWNrc1BlclNlYyAvIG9sZFRpY2tzUGVyU2VjOwotCi0gICAgaW50NjRfdCBvbGRQZXJOZXcgPSBvbGRUaWNrc1BlclNlYyAvIG5ld1RpY2tzUGVyU2VjOwotICAgIGlmIChvbGRQZXJOZXcgJiYgKChvbGRUaWNrcyAlIG9sZFBlck5ldykgPj0gKG9sZFBlck5ldyAvIDIpKSkgewotICAgICAgKytyZXN1bHQ7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXNwZWMgdG8gYXJiaXRyYXJ5LXNpemVkIHRpY2tzIHNpbmNlIGVwb2NoCi0gICAqLwotICBzdGF0aWMgY29uc3Qgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGlja3NQZXJTZWMpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLnR2X3NlYywgdmFsdWUudHZfbnNlYywgTlNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKLSAgICovCi0gIHN0YXRpYyBjb25zdCB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZS50dl9zZWMsIHZhbHVlLnR2X3VzZWMsIFVTX1BFUl9TLCB0aWNrc1BlclNlYyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IHRpbWVzcGVjIHRvIG1pbGxpc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIGNvbnN0IHZvaWQgdG9NaWxsaXNlY29uZHMoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgTVNfUEVSX1MpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1ldmFsIHRvIG1pbGxpc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIGNvbnN0IHZvaWQgdG9NaWxsaXNlY29uZHMoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUpIHsKLSAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBNU19QRVJfUyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgc3RydWN0IHRpbWVzcGVjIHRvIG1pY3Jvc2Vjb25kcwotICAgKi8KLSAgc3RhdGljIGNvbnN0IHZvaWQgdG9Vc2VjKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjJiB2YWx1ZSkgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIFVTX1BFUl9TKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBtaWNyb3NlY29uZHMKLSAgICovCi0gIHN0YXRpYyBjb25zdCB2b2lkIHRvVXNlYyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgewotICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIFVTX1BFUl9TKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgY3VycmVudCB0aW1lIGFzIGEgbnVtYmVyIG9mIGFyYml0cmFyeS1zaXplIHRpY2tzIGZyb20gZXBvY2gKLSAgICovCi0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lVGlja3MoaW50NjRfdCB0aWNrc1BlclNlYyk7Ci0KLSAgLyoqCi0gICAqIEdldCBjdXJyZW50IHRpbWUgYXMgbWlsbGlzZWNvbmRzIGZyb20gZXBvY2gKLSAgICovCi0gIHN0YXRpYyBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lKCkgeyByZXR1cm4gY3VycmVudFRpbWVUaWNrcyhNU19QRVJfUyk7IH0KLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgdGltZSBhcyBtaWNyb3MgZnJvbSBlcG9jaAotICAgKi8KLSAgc3RhdGljIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVVc2VjKCkgeyByZXR1cm4gY3VycmVudFRpbWVUaWNrcyhVU19QRVJfUyk7IH0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1Rlc3RzLmNwcCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGVzdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODBiYjg4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJUaHJlYWRGYWN0b3J5VGVzdHMuaCIKLSNpbmNsdWRlICJUaW1lck1hbmFnZXJUZXN0cy5oIgotI2luY2x1ZGUgIlRocmVhZE1hbmFnZXJUZXN0cy5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLQotICBzdGQ6OnN0cmluZyBhcmc7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICBhcmdzKGFyZ2MgLSAxID4gMSA/IGFyZ2MgLSAxIDogMSk7Ci0KLSAgYXJnc1swXSA9ICJhbGwiOwotCi0gIGZvciAoaW50IGl4ID0gMTsgaXggPCBhcmdjOyBpeCsrKSB7Ci0gICAgYXJnc1tpeCAtIDFdID0gc3RkOjpzdHJpbmcoYXJndltpeF0pOwotICB9Ci0KLSAgYm9vbCBydW5BbGwgPSBhcmdzWzBdLmNvbXBhcmUoImFsbCIpID09IDA7Ci0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1mYWN0b3J5IikgPT0gMCkgewotCi0gICAgVGhyZWFkRmFjdG9yeVRlc3RzIHRocmVhZEZhY3RvcnlUZXN0czsKLQotICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkRmFjdG9yeSB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgc2l6ZV90IGNvdW50ID0gIDEwMDA7Ci0gICAgc2l6ZV90IGZsb29kTG9vcHMgPSAgMTsKLSAgICBzaXplX3QgZmxvb2RDb3VudCA9ICAxMDAwMDA7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGNvdW50IDw8IHN0ZDo6ZW5kbDsKLQotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKGNvdW50KSk7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IGZsb29kTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGZsb29kQ291bnQgPDwgc3RkOjplbmRsOwotCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKTsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3Rvcnkgc3luY2hyb25vdXMgc3RhcnQgdGVzdCIgPDwgc3RkOjplbmRsOwotCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5zeW5jaFN0YXJ0VGVzdCgpKTsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgbW9uaXRvciB0aW1lb3V0IHRlc3QiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMubW9uaXRvclRpbWVvdXRUZXN0KCkpOwotICB9Ci0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInV0aWwiKSA9PSAwKSB7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlV0aWwgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFV0aWwgbWluaW11bSB0aW1lIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBpbnQ2NF90IHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgaW50NjRfdCB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRNaW5pbXVtIHRpbWU6ICIgPDwgdGltZTAxIC0gdGltZTAwIDw8ICJtcyIgPDwgc3RkOjplbmRsOwotCi0gICAgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICB0aW1lMDEgPSB0aW1lMDA7Ci0gICAgc2l6ZV90IGNvdW50ID0gMDsKLQotICAgIHdoaWxlICh0aW1lMDEgPCB0aW1lMDAgKyAxMCkgewotICAgICAgY291bnQrKzsKLSAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0gICAgfQotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRzY2FsbCBwZXIgbXM6ICIgPDwgY291bnQgLyAodGltZTAxIC0gdGltZTAwKSA8PCBzdGQ6OmVuZGw7Ci0gIH0KLQotCi0gIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aW1lci1tYW5hZ2VyIikgPT0gMCkgewotCi0gICAgc3RkOjpjb3V0IDw8ICJUaW1lck1hbmFnZXIgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDAiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIFRpbWVyTWFuYWdlclRlc3RzIHRpbWVyTWFuYWdlclRlc3RzOwotCi0gICAgYXNzZXJ0KHRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKTsKLSAgfQotCi0gIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aHJlYWQtbWFuYWdlciIpID09IDApIHsKLQotICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwotCi0gICAgewotCi0gICAgICBzaXplX3Qgd29ya2VyQ291bnQgPSAxMDA7Ci0KLSAgICAgIHNpemVfdCB0YXNrQ291bnQgPSAxMDAwMDA7Ci0KLSAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOwotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7Ci0KLSAgICAgIGFzc2VydCh0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKTsKLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9jayB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgIGFzc2VydCh0aHJlYWRNYW5hZ2VyVGVzdHMuYmxvY2tUZXN0KGRlbGF5LCB3b3JrZXJDb3VudCkpOwotCi0gICAgfQotICB9Ci0KLSAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1tYW5hZ2VyLWJlbmNobWFyayIpID09IDApIHsKLQotICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciBiZW5jaG1hcmsgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHsKLQotICAgICAgc2l6ZV90IG1pbldvcmtlckNvdW50ID0gMjsKLQotICAgICAgc2l6ZV90IG1heFdvcmtlckNvdW50ID0gNTEyOwotCi0gICAgICBzaXplX3QgdGFza3NQZXJXb3JrZXIgPSAxMDAwOwotCi0gICAgICBpbnQ2NF90IGRlbGF5ID0gMTBMTDsKLQotICAgICAgZm9yIChzaXplX3Qgd29ya2VyQ291bnQgPSBtaW5Xb3JrZXJDb3VudDsgd29ya2VyQ291bnQgPCBtYXhXb3JrZXJDb3VudDsgd29ya2VyQ291bnQqPSAyKSB7Ci0KLSAgICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IHdvcmtlckNvdW50ICogdGFza3NQZXJXb3JrZXI7Ci0KLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudCA8PCAiIHRhc2sgY291bnQ6ICIgPDwgdGFza0NvdW50IDw8ICIgZGVsYXk6ICIgPDwgZGVsYXkgPDwgc3RkOjplbmRsOwotCi0gICAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7Ci0KLSAgICAgICAgdGhyZWFkTWFuYWdlclRlc3RzLmxvYWRUZXN0KHRhc2tDb3VudCwgZGVsYXksIHdvcmtlckNvdW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkRmFjdG9yeVRlc3RzLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RocmVhZEZhY3RvcnlUZXN0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGY5OGE5Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkRmFjdG9yeVRlc3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1V0aWwuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeyBuYW1lc3BhY2UgdGVzdCB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLQotLyoqCi0gKiBUaHJlYWRNYW5hZ2VyVGVzdHMgY2xhc3MKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBUaHJlYWRGYWN0b3J5VGVzdHMgewotCi1wdWJsaWM6Ci0KLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBFUlJPUjsKLQotICBjbGFzcyBUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gIHB1YmxpYzoKLQotICAgIFRhc2soKSB7fQotCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdEhlbGxvIFdvcmxkIiA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICB9OwotCi0gIC8qKgotICAgKiBIZWxsbyB3b3JsZCB0ZXN0Ci0gICAqLwotICBib29sIGhlbGxvV29ybGRUZXN0KCkgewotCi0gICAgUG9zaXhUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQb3NpeFRocmVhZEZhY3RvcnkoKTsKLQotICAgIHNoYXJlZF9wdHI8VGFzaz4gdGFzayA9IHNoYXJlZF9wdHI8VGFzaz4obmV3IFRocmVhZEZhY3RvcnlUZXN0czo6VGFzaygpKTsKLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKLQotICAgIHRocmVhZC0+c3RhcnQoKTsKLQotICAgIHRocmVhZC0+am9pbigpOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRTdWNjZXNzISIgPDwgc3RkOjplbmRsOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUmVhcCBOIHRocmVhZHMKLSAgICovCi0gIGNsYXNzIFJlYXBOVGFzazogcHVibGljIFJ1bm5hYmxlIHsKLQotICAgcHVibGljOgotCi0gICAgUmVhcE5UYXNrKE1vbml0b3ImIG1vbml0b3IsIGludCYgYWN0aXZlQ291bnQpIDoKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX2NvdW50KGFjdGl2ZUNvdW50KSB7fQotCi0gICAgdm9pZCBydW4oKSB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgIF9jb3VudC0tOwotCi0gICAgICAvL3N0ZDo6Y291dCA8PCAiXHRcdFx0dGhyZWFkIGNvdW50OiAiIDw8IF9jb3VudCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgIGlmIChfY291bnQgPT0gMCkgewotICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLQotICAgIGludCYgX2NvdW50OwotICB9OwotCi0gIGJvb2wgcmVhcE5UaHJlYWRzKGludCBsb29wPTEsIGludCBjb3VudD0xMCkgewotCi0gICAgUG9zaXhUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSAgUG9zaXhUaHJlYWRGYWN0b3J5KCk7Ci0KLSAgICBNb25pdG9yKiBtb25pdG9yID0gbmV3IE1vbml0b3IoKTsKLQotICAgIGZvcihpbnQgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKLQotICAgICAgaW50KiBhY3RpdmVDb3VudCAgPSBuZXcgaW50KGNvdW50KTsKLQotICAgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gdGhyZWFkczsKLQotICAgICAgaW50IHRpeDsKLQotICAgICAgZm9yICh0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICB0aHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgUmVhcE5UYXNrKCptb25pdG9yLCAqYWN0aXZlQ291bnQpKSkpOwotICAgICAgICB9IGNhdGNoKFN5c3RlbVJlc291cmNlRXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gY3JlYXRlICIgPDwgbGl4ICogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0aXggPSAwOwotICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gdGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gdGhyZWFkcy5lbmQoKTsgdGl4KyssICsrdGhyZWFkKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAoKnRocmVhZCktPnN0YXJ0KCk7Ci0gICAgICAgIH0gY2F0Y2goU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXggKiBjb3VudCArIHRpeCA8PCAiIHRocmVhZCAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoKm1vbml0b3IpOwotICAgICAgICB3aGlsZSAoKmFjdGl2ZUNvdW50ID4gMCkgewotICAgICAgICAgIG1vbml0b3ItPndhaXQoMTAwMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRyZWFwZWQgIiA8PCBsaXggKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNsYXNzIFN5bmNoU3RhcnRUYXNrOiBwdWJsaWMgUnVubmFibGUgewotCi0gICBwdWJsaWM6Ci0KLSAgICBlbnVtIFNUQVRFIHsKLSAgICAgIFVOSU5JVElBTElaRUQsCi0gICAgICBTVEFSVElORywKLSAgICAgIFNUQVJURUQsCi0gICAgICBTVE9QUElORywKLSAgICAgIFNUT1BQRUQKLSAgICB9OwotCi0gICAgU3luY2hTdGFydFRhc2soTW9uaXRvciYgbW9uaXRvciwgdm9sYXRpbGUgIFNUQVRFJiBzdGF0ZSkgOgotICAgICAgX21vbml0b3IobW9uaXRvciksCi0gICAgICBfc3RhdGUoc3RhdGUpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICBpZiAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgewotICAgICAgICAgIF9zdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEOwotICAgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICB3aGlsZSAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEKSB7Ci0gICAgICAgICAgX21vbml0b3Iud2FpdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBJTkcpIHsKLSAgICAgICAgICBfc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRDsKLSAgICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgICB2b2xhdGlsZSAgU1RBVEUmIF9zdGF0ZTsKLSAgfTsKLQotICBib29sIHN5bmNoU3RhcnRUZXN0KCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgU3luY2hTdGFydFRhc2s6OlNUQVRFIHN0YXRlID0gU3luY2hTdGFydFRhc2s6OlVOSU5JVElBTElaRUQ7Ci0KLSAgICBzaGFyZWRfcHRyPFN5bmNoU3RhcnRUYXNrPiB0YXNrID0gc2hhcmVkX3B0cjxTeW5jaFN0YXJ0VGFzaz4obmV3IFN5bmNoU3RhcnRUYXNrKG1vbml0b3IsIHN0YXRlKSk7Ci0KLSAgICBQb3NpeFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9ICBQb3NpeFRocmVhZEZhY3RvcnkoKTsKLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKLQotICAgIGlmIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6VU5JTklUSUFMSVpFRCkgewotCi0gICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORzsKLQotICAgICAgdGhyZWFkLT5zdGFydCgpOwotICAgIH0KLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotICAgICAgd2hpbGUgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgewotICAgICAgICBtb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhc3NlcnQoc3RhdGUgIT0gU3luY2hTdGFydFRhc2s6OlNUQVJUSU5HKTsKLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICB0cnkgewotICAgICAgICAgIG1vbml0b3Iud2FpdCgxMDApOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgfQotCi0gICAgICBpZiAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUQVJURUQpIHsKLQotICAgICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVE9QUElORzsKLQotICAgICAgICBtb25pdG9yLm5vdGlmeSgpOwotICAgICAgfQotCi0gICAgICB3aGlsZSAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUT1BQSU5HKSB7Ci0gICAgICAgIG1vbml0b3Iud2FpdCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGFzc2VydChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRCk7Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwotCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiogU2VlIGhvdyBhY2N1cmF0ZSBtb25pdG9yIHRpbWVvdXQgaXMuICovCi0KLSAgYm9vbCBtb25pdG9yVGltZW91dFRlc3Qoc2l6ZV90IGNvdW50PTEwMDAsIGludDY0X3QgdGltZW91dD0xMCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgaW50NjRfdCBzdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7Ci0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbW9uaXRvci53YWl0KHRpbWVvdXQpOwotICAgICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgZG91YmxlIGVycm9yID0gKChlbmRUaW1lIC0gc3RhcnRUaW1lKSAtIChjb3VudCAqIHRpbWVvdXQpKSAvIChkb3VibGUpKGNvdW50ICogdGltZW91dCk7Ci0KLSAgICBpZiAoZXJyb3IgPCAwLjApICB7Ci0KLSAgICAgIGVycm9yICo9IDEuMDsKLSAgICB9Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBlcnJvciA8IFRocmVhZEZhY3RvcnlUZXN0czo6RVJST1I7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHN1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIGV4cGVjdGVkIHRpbWU6ICIgPDwgY291bnQgKiB0aW1lb3V0IDw8ICJtcyBlbGFwc2VkIHRpbWU6ICI8PCBlbmRUaW1lIC0gc3RhcnRUaW1lIDw8ICJtcyBlcnJvciU6ICIgPDwgZXJyb3IgKiAxMDAuMCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gc3VjY2VzczsKLSAgfQotCi0KLSAgY2xhc3MgRmxvb2RUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKLSAgcHVibGljOgotCi0gICAgRmxvb2RUYXNrKGNvbnN0IHNpemVfdCBpZCkgOl9pZChpZCkge30KLSAgICB+Rmxvb2RUYXNrKCl7Ci0gICAgICBpZihfaWQgJSAxMDAwID09IDApIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgZG9uZSIgPDwgc3RkOjplbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcnVuKCl7Ci0gICAgICBpZihfaWQgJSAxMDAwID09IDApIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgc3RhcnRlZCIgPDwgc3RkOjplbmRsOwotICAgICAgfQotCi0gICAgICB1c2xlZXAoMSk7Ci0gICAgfQotICAgIGNvbnN0IHNpemVfdCBfaWQ7Ci0gIH07Ci0KLSAgdm9pZCBmb28oUG9zaXhUaHJlYWRGYWN0b3J5ICp0ZikgewotICB9Ci0KLSAgYm9vbCBmbG9vZE5UZXN0KHNpemVfdCBsb29wPTEsIHNpemVfdCBjb3VudD0xMDAwMDApIHsKLQotICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgZm9yKHNpemVfdCBsaXggPSAwOyBsaXggPCBsb29wOyBsaXgrKykgewotCi0gICAgICBQb3NpeFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBvc2l4VGhyZWFkRmFjdG9yeSgpOwotICAgICAgdGhyZWFkRmFjdG9yeS5zZXREZXRhY2hlZCh0cnVlKTsKLQotICAgICAgICBmb3Ioc2l6ZV90IHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgewotCi0gICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgc2hhcmVkX3B0cjxGbG9vZFRhc2s+IHRhc2sobmV3IEZsb29kVGFzayhsaXggKiBjb3VudCArIHRpeCApKTsKLQotICAgICAgICAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOwotCi0gICAgICAgICAgICB0aHJlYWQtPnN0YXJ0KCk7Ci0KLSAgICAgICAgICAgIHVzbGVlcCgxKTsKLQotICAgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGUpIHsKLQotICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gc3RhcnQgICIgPDwgbGl4ICogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmxvb2RlZCAiIDw8IChsaXggKyAxKSAqIGNvdW50IDw8ICIgdGhyZWFkcyIgPDwgc3RkOjplbmRsOwotCi0gICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBzdWNjZXNzOwotICB9Ci19OwotCi1jb25zdCBkb3VibGUgVGhyZWFkRmFjdG9yeVRlc3RzOjpFUlJPUiA9IC4yMDsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3QKLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvc3JjL2NvbmN1cnJlbmN5L3Rlc3QvVGhyZWFkTWFuYWdlclRlc3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWE5YTIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UaHJlYWRNYW5hZ2VyVGVzdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1V0aWwuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsgbmFtZXNwYWNlIHRlc3QgewotCi11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotCi0vKioKLSAqIFRocmVhZE1hbmFnZXJUZXN0cyBjbGFzcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIFRocmVhZE1hbmFnZXJUZXN0cyB7Ci0KLXB1YmxpYzoKLQotICBzdGF0aWMgY29uc3QgZG91YmxlIEVSUk9SOwotCi0gIGNsYXNzIFRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSAgcHVibGljOgotCi0gICAgVGFzayhNb25pdG9yJiBtb25pdG9yLCBzaXplX3QmIGNvdW50LCBpbnQ2NF90IHRpbWVvdXQpIDoKLSAgICAgIF9tb25pdG9yKG1vbml0b3IpLAotICAgICAgX2NvdW50KGNvdW50KSwKLSAgICAgIF90aW1lb3V0KHRpbWVvdXQpLAotICAgICAgX2RvbmUoZmFsc2UpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLQotICAgICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX3NsZWVwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgIF9zbGVlcC53YWl0KF90aW1lb3V0KTsKLSAgICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgICAgIDsKLSAgICAgICAgfWNhdGNoKC4uLikgewotICAgICAgICAgIGFzc2VydCgwKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICAgIF9kb25lID0gdHJ1ZTsKLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJUaHJlYWQgIiA8PCBfY291bnQgPDwgIiBjb21wbGV0ZWQgIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgX2NvdW50LS07Ci0KLSAgICAgICAgaWYgKF9jb3VudCA9PSAwKSB7Ci0KLSAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIE1vbml0b3ImIF9tb25pdG9yOwotICAgIHNpemVfdCYgX2NvdW50OwotICAgIGludDY0X3QgX3RpbWVvdXQ7Ci0gICAgaW50NjRfdCBfc3RhcnRUaW1lOwotICAgIGludDY0X3QgX2VuZFRpbWU7Ci0gICAgYm9vbCBfZG9uZTsKLSAgICBNb25pdG9yIF9zbGVlcDsKLSAgfTsKLQotICAvKioKLSAgICogRGlzcGF0Y2ggY291bnQgdGFza3MsIGVhY2ggb2Ygd2hpY2ggYmxvY2tzIGZvciB0aW1lb3V0IG1pbGxpc2Vjb25kcyB0aGVuCi0gICAqIGNvbXBsZXRlcy4gVmVyaWZ5IHRoYXQgYWxsIHRhc2tzIGNvbXBsZXRlZCBhbmQgdGhhdCB0aHJlYWQgbWFuYWdlciBjbGVhbnMKLSAgICogdXAgcHJvcGVybHkgb24gZGVsZXRlLgotICAgKi8KLSAgYm9vbCBsb2FkVGVzdChzaXplX3QgY291bnQ9MTAwLCBpbnQ2NF90IHRpbWVvdXQ9MTAwTEwsIHNpemVfdCB3b3JrZXJDb3VudD00KSB7Ci0KLSAgICBNb25pdG9yIG1vbml0b3I7Ci0KLSAgICBzaXplX3QgYWN0aXZlQ291bnQgPSBjb3VudDsKLQotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwotCi0gICAgc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPSBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKTsKLQotICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7Ci0KLSAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwotCi0gICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKLQotICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+IHRhc2tzOwotCi0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7Ci0KLSAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhtb25pdG9yLCBhY3RpdmVDb3VudCwgdGltZW91dCkpKTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7IGl4ICE9IHRhc2tzLmVuZCgpOyBpeCsrKSB7Ci0KLSAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7Ci0gICAgfQotCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgIHdoaWxlKGFjdGl2ZUNvdW50ID4gMCkgewotCi0gICAgICAgIG1vbml0b3Iud2FpdCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludDY0X3QgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgIGludDY0X3QgZmlyc3RUaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwotICAgIGludDY0X3QgbGFzdFRpbWUgPSAwOwotCi0gICAgZG91YmxlIGF2ZXJhZ2VUaW1lID0gMDsKLSAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7Ci0gICAgaW50NjRfdCBtYXhUaW1lID0gMDsKLQotICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsgaXggIT0gdGFza3MuZW5kKCk7IGl4KyspIHsKLQotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sgPSAqaXg7Ci0KLSAgICAgIGludDY0X3QgZGVsdGEgPSB0YXNrLT5fZW5kVGltZSAtIHRhc2stPl9zdGFydFRpbWU7Ci0KLSAgICAgIGFzc2VydChkZWx0YSA+IDApOwotCi0gICAgICBpZiAodGFzay0+X3N0YXJ0VGltZSA8IGZpcnN0VGltZSkgewotICAgICAgICBmaXJzdFRpbWUgPSB0YXNrLT5fc3RhcnRUaW1lOwotICAgICAgfQotCi0gICAgICBpZiAodGFzay0+X2VuZFRpbWUgPiBsYXN0VGltZSkgewotICAgICAgICBsYXN0VGltZSA9IHRhc2stPl9lbmRUaW1lOwotICAgICAgfQotCi0gICAgICBpZiAoZGVsdGEgPCBtaW5UaW1lKSB7Ci0gICAgICAgIG1pblRpbWUgPSBkZWx0YTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlbHRhID4gbWF4VGltZSkgewotICAgICAgICBtYXhUaW1lID0gZGVsdGE7Ci0gICAgICB9Ci0KLSAgICAgIGF2ZXJhZ2VUaW1lKz0gZGVsdGE7Ci0gICAgfQotCi0gICAgYXZlcmFnZVRpbWUgLz0gY291bnQ7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZpcnN0IHN0YXJ0OiAiIDw8IGZpcnN0VGltZSA8PCAibXMgTGFzdCBlbmQ6ICIgPDwgbGFzdFRpbWUgPDwgIm1zIG1pbjogIiA8PCBtaW5UaW1lIDw8ICJtcyBtYXg6ICIgPDwgbWF4VGltZSA8PCAibXMgYXZlcmFnZTogIiA8PCBhdmVyYWdlVGltZSA8PCAibXMiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIGRvdWJsZSBleHBlY3RlZFRpbWUgPSAoKGNvdW50ICsgKHdvcmtlckNvdW50IC0gMSkpIC8gd29ya2VyQ291bnQpICogdGltZW91dDsKLQotICAgIGRvdWJsZSBlcnJvciA9ICgodGltZTAxIC0gdGltZTAwKSAtIGV4cGVjdGVkVGltZSkgLyBleHBlY3RlZFRpbWU7Ci0KLSAgICBpZiAoZXJyb3IgPCAwKSB7Ci0gICAgICBlcnJvcio9IC0xLjA7Ci0gICAgfQotCi0gICAgYm9vbCBzdWNjZXNzID0gZXJyb3IgPCBFUlJPUjsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgIiEgZXhwZWN0ZWQgdGltZTogIiA8PCBleHBlY3RlZFRpbWUgPDwgIm1zIGVsYXBzZWQgdGltZTogIjw8IHRpbWUwMSAtIHRpbWUwMCA8PCAibXMgZXJyb3IlOiAiIDw8IGVycm9yICogMTAwLjAgPDwgc3RkOjplbmRsOwotCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gIH0KLQotICBjbGFzcyBCbG9ja1Rhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLSAgcHVibGljOgotCi0gICAgQmxvY2tUYXNrKE1vbml0b3ImIG1vbml0b3IsIE1vbml0b3ImIGJtb25pdG9yLCBzaXplX3QmIGNvdW50KSA6Ci0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9ibW9uaXRvcihibW9uaXRvciksCi0gICAgICBfY291bnQoY291bnQpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX2Jtb25pdG9yKTsKLQotICAgICAgICBfYm1vbml0b3Iud2FpdCgpOwotCi0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotCi0gICAgICAgIF9jb3VudC0tOwotCi0gICAgICAgIGlmIChfY291bnQgPT0gMCkgewotCi0gICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgICBNb25pdG9yJiBfYm1vbml0b3I7Ci0gICAgc2l6ZV90JiBfY291bnQ7Ci0gIH07Ci0KLSAgLyoqCi0gICAqIEJsb2NrIHRlc3QuICBDcmVhdGUgcGVuZGluZ1Rhc2tDb3VudE1heCB0YXNrcy4gIFZlcmlmeSB0aGF0IHdlIGJsb2NrIGFkZGluZyB0aGUKLSAgICogcGVuZGluZ1Rhc2tDb3VudE1heCArIDF0aCB0YXNrLiAgVmVyaWZ5IHRoYXQgd2UgdW5ibG9jayB3aGVuIGEgdGFzayBjb21wbGV0ZXMgKi8KLQotICBib29sIGJsb2NrVGVzdChpbnQ2NF90IHRpbWVvdXQ9MTAwTEwsIHNpemVfdCB3b3JrZXJDb3VudD0yKSB7Ci0KLSAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLQotICAgIHRyeSB7Ci0KLSAgICAgIE1vbml0b3IgYm1vbml0b3I7Ci0gICAgICBNb25pdG9yIG1vbml0b3I7Ci0KLSAgICAgIHNpemVfdCBwZW5kaW5nVGFza01heENvdW50ID0gd29ya2VyQ291bnQ7Ci0KLSAgICAgIHNpemVfdCBhY3RpdmVDb3VudHNbXSA9IHt3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCwgMX07Ci0KLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQsIHBlbmRpbmdUYXNrTWF4Q291bnQpOwotCi0gICAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotCi0gICAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOwotCi0gICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwotCi0gICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotCi0gICAgICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiA+IHRhc2tzOwotCi0gICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgd29ya2VyQ291bnQ7IGl4KyspIHsKLQotICAgICAgICB0YXNrcy5pbnNlcnQoc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4obmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKG1vbml0b3IsIGJtb25pdG9yLGFjdGl2ZUNvdW50c1swXSkpKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHBlbmRpbmdUYXNrTWF4Q291bnQ7IGl4KyspIHsKLQotICAgICAgICB0YXNrcy5pbnNlcnQoc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4obmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKG1vbml0b3IsIGJtb25pdG9yLGFjdGl2ZUNvdW50c1sxXSkpKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7IGl4ICE9IHRhc2tzLmVuZCgpOyBpeCsrKSB7Ci0gICAgICAgIHRocmVhZE1hbmFnZXItPmFkZCgqaXgpOwotICAgICAgfQotCi0gICAgICBpZighKHN1Y2Nlc3MgPSAodGhyZWFkTWFuYWdlci0+dG90YWxUYXNrQ291bnQoKSA9PSBwZW5kaW5nVGFza01heENvdW50ICsgd29ya2VyQ291bnQpKSkgewotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfQotCi0gICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiBleHRyYVRhc2sobmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKG1vbml0b3IsIGJtb25pdG9yLCBhY3RpdmVDb3VudHNbMl0pKTsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4dHJhVGFzaywgMSk7Ci0gICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3VjY2VzcyBhZGRpbmcgdGFzayBpbiBleGNlc3Mgb2YgcGVuZGluZyB0YXNrIGNvdW50Iik7Ci0gICAgICB9IGNhdGNoKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiU2hvdWxkIGhhdmUgdGltZWQgb3V0IGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHRocmVhZE1hbmFnZXItPmFkZChleHRyYVRhc2ssIC0xKTsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWNjZXNzIGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0aW1lb3V0IGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgewotICAgICAgICAvLyBFeHBlY3RlZCByZXN1bHQKLSAgICAgIH0KLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICJQZW5kaW5nIHRhc2tzICIgPDwgdGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpICA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICAgIHdoaWxlKGFjdGl2ZUNvdW50c1swXSAhPSAwKSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICJQZW5kaW5nIHRhc2tzICIgPDwgdGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4dHJhVGFzaywgMSk7Ci0gICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAiYWRkIHRpbWVkIG91dCB1bmV4cGVjdGVkbHkiICA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGltZW91dCBhZGRpbmcgdGFzayIpOwotCi0gICAgICB9IGNhdGNoKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICJhZGQgZW5jb3VudGVyZWQgdG9vIG1hbnkgcGVuZGluZyBleGVwY3Rpb25zIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGltZW91dCBhZGRpbmcgdGFzayIpOwotICAgICAgfQotCi0gICAgICAvLyBXYWtlIHVwIHRhc2tzIHRoYXQgd2VyZSBwZW5kaW5nIGJlZm9yZSBhbmQgd2FpdCBmb3IgdGhlbSB0byBjb21wbGV0ZQotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKGJtb25pdG9yKTsKLQotICAgICAgICBibW9uaXRvci5ub3RpZnlBbGwoKTsKLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKLQotICAgICAgICB3aGlsZShhY3RpdmVDb3VudHNbMV0gIT0gMCkgewotICAgICAgICAgIG1vbml0b3Iud2FpdCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdha2UgdXAgdGhlIGV4dHJhIHRhc2sgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlCi0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICAgIHdoaWxlKGFjdGl2ZUNvdW50c1syXSAhPSAwKSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoIShzdWNjZXNzID0gKHRocmVhZE1hbmFnZXItPnRvdGFsVGFza0NvdW50KCkgPT0gMCkpKSB7Ci0gICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcGVuZGluZyB0YXNrIGNvdW50Iik7Ci0gICAgICB9Ci0KLSAgICB9IGNhdGNoKFRFeGNlcHRpb24mIGUpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiRVJST1I6ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotICAgIH0KLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiBzdWNjZXNzOwotIH0KLX07Ci0KLWNvbnN0IGRvdWJsZSBUaHJlYWRNYW5hZ2VyVGVzdHM6OkVSUk9SID0gLjIwOwotCi19fX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ojp0ZXN0OwotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RpbWVyTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3NyYy9jb25jdXJyZW5jeS90ZXN0L1RpbWVyTWFuYWdlclRlc3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTA3NGMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvY29uY3VycmVuY3kvdGVzdC9UaW1lck1hbmFnZXJUZXN0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9VdGlsLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeyBuYW1lc3BhY2UgdGVzdCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci0KLS8qKgotICogVGhyZWFkTWFuYWdlclRlc3RzIGNsYXNzCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgVGltZXJNYW5hZ2VyVGVzdHMgewotCi0gcHVibGljOgotCi0gIHN0YXRpYyBjb25zdCBkb3VibGUgRVJST1I7Ci0KLSAgY2xhc3MgVGFzazogcHVibGljIFJ1bm5hYmxlIHsKLSAgIHB1YmxpYzoKLQotICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50NjRfdCB0aW1lb3V0KSA6Ci0gICAgICBfdGltZW91dCh0aW1lb3V0KSwKLSAgICAgIF9zdGFydFRpbWUoVXRpbDo6Y3VycmVudFRpbWUoKSksCi0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9zdWNjZXNzKGZhbHNlKSwKLSAgICAgIF9kb25lKGZhbHNlKSB7fQotCi0gICAgflRhc2soKSB7IHN0ZDo6Y2VyciA8PCB0aGlzIDw8IHN0ZDo6ZW5kbDsgfQotCi0gICAgdm9pZCBydW4oKSB7Ci0KLSAgICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgICAgLy8gRmlndXJlIG91dCBlcnJvciBwZXJjZW50YWdlCi0KLSAgICAgIGludDY0X3QgZGVsdGEgPSBfZW5kVGltZSAtIF9zdGFydFRpbWU7Ci0KLQotICAgICAgZGVsdGEgPSBkZWx0YSA+IF90aW1lb3V0ID8gIGRlbHRhIC0gX3RpbWVvdXQgOiBfdGltZW91dCAtIGRlbHRhOwotCi0gICAgICBmbG9hdCBlcnJvciA9IGRlbHRhIC8gX3RpbWVvdXQ7Ci0KLSAgICAgIGlmKGVycm9yIDwgRVJST1IpIHsKLSAgICAgICAgX3N1Y2Nlc3MgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBfZG9uZSA9IHRydWU7Ci0KLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2tbIiA8PCB0aGlzIDw8ICJdIGRvbmUiIDw8IHN0ZDo6ZW5kbDsgLy9kZWJ1ZwotCi0gICAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IF90aW1lb3V0OwotICAgIGludDY0X3QgX3N0YXJ0VGltZTsKLSAgICBpbnQ2NF90IF9lbmRUaW1lOwotICAgIE1vbml0b3ImIF9tb25pdG9yOwotICAgIGJvb2wgX3N1Y2Nlc3M7Ci0gICAgYm9vbCBfZG9uZTsKLSAgfTsKLQotICAvKioKLSAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzIGFuZCB3YWl0cyBmb3IgdGhlIGZpcnN0IHRvIGV4cGlyZSB3aXRoaW4gMTAlCi0gICAqIG9mIHRoZSBleHBlY3RlZCBleHBpcmF0aW9uIHRpbWUuIEl0IHRoZW4gdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlcgotICAgKiBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dCB0YXNrIHdoZW4gdGhlCi0gICAqIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KLSAgICovCi0gIGJvb2wgdGVzdDAwKGludDY0X3QgdGltZW91dD0xMDAwTEwpIHsKLQotICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IG9ycGhhblRhc2sgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIDEwICogdGltZW91dCkpOwotCi0gICAgewotCi0gICAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOwotCi0gICAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKSk7Ci0KLSAgICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOwotCi0gICAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKLQotICAgICAgLy8gRG9uJ3QgY3JlYXRlIHRhc2sgeWV0LCBiZWNhdXNlIGl0cyBjb25zdHJ1Y3RvciBzZXRzIHRoZSBleHBlY3RlZCBjb21wbGV0aW9uIHRpbWUsIGFuZCB3ZQotICAgICAgLy8gbmVlZCB0byBkZWxheSBiZXR3ZWVuIGluc2VydGluZyB0aGUgdHdvIHRhc2tzIGludG8gdGhlIHJ1biBxdWV1ZS4KLSAgICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2s7Ci0KLSAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotCi0gICAgICAgIHRpbWVyTWFuYWdlci5hZGQob3JwaGFuVGFzaywgMTAgKiB0aW1lb3V0KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgIC8vIFdhaXQgZm9yIDEgc2Vjb25kIGluIG9yZGVyIHRvIGdpdmUgdGltZXJNYW5hZ2VyIGEgY2hhbmNlIHRvIHN0YXJ0IHNsZWVwaW5nIGluIHJlc3BvbnNlCi0gICAgICAgICAgLy8gdG8gYWRkaW5nIG9ycGhhblRhc2suIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB3ZSBjYW4gdmVyaWZ5IHRoYXQgYWRkaW5nIHRoZSBzZWNvbmQgdGFzawotICAgICAgICAgIC8vIGtpY2tzIHRoZSBkaXNwYXRjaGVyIG91dCBvZiB0aGUgY3VycmVudCB3YWl0IGFuZCBzdGFydHMgdGhlIG5ldyAxIHNlY29uZCB3YWl0LgotICAgICAgICAgIF9tb25pdG9yLndhaXQgKDEwMDApOwotICAgICAgICAgIGFzc2VydCAoMCA9PSAiRVJST1I6IFRoaXMgd2FpdCBzaG91bGQgdGltZSBvdXQuIFRpbWVyTWFuYWdlciBkaXNwYXRjaGVyIG1heSBoYXZlIGEgcHJvYmxlbS4iKTsKLSAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24gJmV4KSB7Ci0gICAgICAgIH0KLQotICAgICAgICB0YXNrLnJlc2V0IChuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKLQotICAgICAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRpbWVvdXQpOwotCi0gICAgICAgIF9tb25pdG9yLndhaXQoKTsKLSAgICAgIH0KLQotICAgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKLQotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHRhc2stPl9zdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOwotICAgIH0KLQotICAgIC8vIHRpbWVyTWFuYWdlci5zdG9wKCk7IFRoaXMgaXMgd2hlcmUgaXQgaGFwcGVucyB2aWEgZGVzdHJ1Y3RvcgotCi0gICAgYXNzZXJ0KCFvcnBoYW5UYXNrLT5fZG9uZSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGZyaWVuZCBjbGFzcyBUZXN0VGFzazsKLQotICBNb25pdG9yIF9tb25pdG9yOwotfTsKLQotY29uc3QgZG91YmxlIFRpbWVyTWFuYWdlclRlc3RzOjpFUlJPUiA9IC4yMDsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwIGIvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzIxODYxLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJQZWVrUHJvY2Vzc29yLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvY2Vzc29yIHsKLQotUGVla1Byb2Nlc3Nvcjo6UGVla1Byb2Nlc3NvcigpIHsKLSAgbWVtb3J5QnVmZmVyXy5yZXNldChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgdGFyZ2V0VHJhbnNwb3J0XyA9IG1lbW9yeUJ1ZmZlcl87Ci19Ci1QZWVrUHJvY2Vzc29yOjp+UGVla1Byb2Nlc3NvcigpIHt9Ci0KLXZvaWQgUGVla1Byb2Nlc3Nvcjo6aW5pdGlhbGl6ZShib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpIHsKLSAgYWN0dWFsUHJvY2Vzc29yXyA9IGFjdHVhbFByb2Nlc3NvcjsKLSAgcGlwZWRQcm90b2NvbF8gPSBwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKHRhcmdldFRyYW5zcG9ydF8pOwotICB0cmFuc3BvcnRGYWN0b3J5XyA9IHRyYW5zcG9ydEZhY3Rvcnk7Ci0gIHRyYW5zcG9ydEZhY3RvcnlfLT5pbml0aWFsaXplVGFyZ2V0VHJhbnNwb3J0KHRhcmdldFRyYW5zcG9ydF8pOwotfQotCi1ib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBQZWVrUHJvY2Vzc29yOjpnZXRQaXBlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbikgewotICByZXR1cm4gdHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChpbik7Ci19Ci0KLXZvaWQgUGVla1Byb2Nlc3Nvcjo6c2V0VGFyZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCkgewotICB0YXJnZXRUcmFuc3BvcnRfID0gdGFyZ2V0VHJhbnNwb3J0OwotICBpZiAoYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydF8pKSB7Ci0gICAgbWVtb3J5QnVmZmVyXyA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnQpOwotICB9IGVsc2UgaWYgKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pKSB7Ci0gICAgbWVtb3J5QnVmZmVyXyA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPihib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKS0+Z2V0VGFyZ2V0VHJhbnNwb3J0KCkpOwotICB9Ci0KLSAgaWYgKCFtZW1vcnlCdWZmZXJfKSB7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVGFyZ2V0IHRyYW5zcG9ydCBtdXN0IGJlIGEgVE1lbW9yeUJ1ZmZlciBvciBhIFRQaXBlZFRyYW5zcG9ydCB3aXRoIFRNZW1vcnlCdWZmZXIiKTsKLSAgfQotfQotCi1ib29sIFBlZWtQcm9jZXNzb3I6OnByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dCkgewotCi0gIHN0ZDo6c3RyaW5nIGZuYW1lOwotICBUTWVzc2FnZVR5cGUgbXR5cGU7Ci0gIGludDMyX3Qgc2VxaWQ7Ci0gIGluLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOwotCi0gIGlmIChtdHlwZSAhPSBUX0NBTEwpIHsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOwotICB9Ci0KLSAgLy8gUGVlayBhdCB0aGUgbmFtZQotICBwZWVrTmFtZShmbmFtZSk7Ci0KLSAgVFR5cGUgZnR5cGU7Ci0gIGludDE2X3QgZmlkOwotICB3aGlsZSAodHJ1ZSkgewotICAgIGluLT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7Ci0gICAgaWYgKGZ0eXBlID09IFRfU1RPUCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gUGVlayBhdCB0aGUgdmFyaWFibGUKLSAgICBwZWVrKGluLCBmdHlwZSwgZmlkKTsKLSAgICBpbi0+cmVhZEZpZWxkRW5kKCk7Ci0gIH0KLSAgaW4tPnJlYWRNZXNzYWdlRW5kKCk7Ci0gIGluLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOwotCi0gIC8vCi0gIC8vIEFsbCB0aGUgZGF0YSBpcyBub3cgaW4gbWVtb3J5QnVmZmVyXyBhbmQgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkCi0gIC8vCi0KLSAgLy8gTGV0J3MgZmlyc3QgdGFrZSBhIHBlZWsgYXQgdGhlIGZ1bGwgZGF0YSBpbiBtZW1vcnkKLSAgdWludDhfdCogYnVmZmVyOwotICB1aW50MzJfdCBzaXplOwotICBtZW1vcnlCdWZmZXJfLT5nZXRCdWZmZXIoJmJ1ZmZlciwgJnNpemUpOwotICBwZWVrQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7Ci0KLSAgLy8gRG9uZSBwZWVraW5nIGF0IHZhcmlhYmxlcwotICBwZWVrRW5kKCk7Ci0KLSAgYm9vbCByZXQgPSBhY3R1YWxQcm9jZXNzb3JfLT5wcm9jZXNzKHBpcGVkUHJvdG9jb2xfLCBvdXQpOwotICBtZW1vcnlCdWZmZXJfLT5yZXNldEJ1ZmZlcigpOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSkgewotfQotCi12b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWtCdWZmZXIodWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBzaXplKSB7Ci19Ci0KLXZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVlayhib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlIGZ0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgZmlkKSB7Ci0gIGluLT5za2lwKGZ0eXBlKTsKLX0KLQotdm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrRW5kKCkge30KLQotfX19CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3YzAxNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBFRUtQUk9DRVNTT1JfSAotI2RlZmluZSBQRUVLUFJPQ0VTU09SX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb2Nlc3NvciB7Ci0KLS8qCi0gKiBDbGFzcyBmb3IgcGVla2luZyBhdCB0aGUgcmF3IGRhdGEgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzb3IKLSAqIGFuZCBnaXZlcyB0aGUgZGVyaXZlZCBjbGFzcyBhIGNoYW5jZSB0byBjaGFuZ2UgYmVoYXZpb3IgYWNjb3JkaW5nbHkKLSAqCi0gKi8KLWNsYXNzIFBlZWtQcm9jZXNzb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3IgewotCi0gcHVibGljOgotICBQZWVrUHJvY2Vzc29yKCk7Ci0gIHZpcnR1YWwgflBlZWtQcm9jZXNzb3IoKTsKLQotICAvLyBJbnB1dCBoZXJlOiBhY3R1YWxQcm9jZXNzb3IgIC0gdGhlIHVuZGVybHlpbmcgcHJvY2Vzc29yCi0gIC8vICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSAgLSB0aGUgcHJvdG9jb2wgZmFjdG9yeSB1c2VkIHRvIHdyYXAgdGhlIG1lbW9yeSBidWZmZXIKLSAgLy8gICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSAtIHRoaXMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSBpcyB1c2VkIHRvIHdyYXAgdGhlIHNvdXJjZSB0cmFuc3BvcnQKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBhIGNhbGwgdG8gZ2V0UGlwZWRUcmFuc3BvcnQKLSAgdm9pZCBpbml0aWFsaXplKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGdldFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluKTsKLQotICB2b2lkIHNldFRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpOwotCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG91dCk7Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgY2FuIGJlIG92ZXJsb2FkZWQgYnkgY2hpbGQgY2xhc3NlcyB0bwotICAvLyBhY2hpZXZlIGRlc2lyZWQgcGVla2luZyBiZWhhdmlvcgotICB2aXJ0dWFsIHZvaWQgcGVla05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lKTsKLSAgdmlydHVhbCB2b2lkIHBlZWtCdWZmZXIodWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBzaXplKTsKLSAgdmlydHVhbCB2b2lkIHBlZWsoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlLAotICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGZpZCk7Ci0gIHZpcnR1YWwgdm9pZCBwZWVrRW5kKCk7Ci0KLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcGVkUHJvdG9jb2xfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gbWVtb3J5QnVmZmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0XzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvY2Vzc29yCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwYjNhZC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1RBVFNQUk9DRVNTT1JfSAotI2RlZmluZSBTVEFUU1BST0NFU1NPUl9ICi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RQcm90b2NvbC5oPgotI2luY2x1ZGUgPFRQcm9jZXNzb3IuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvY2Vzc29yIHsKLQotLyoKLSAqIENsYXNzIGZvciBrZWVwaW5nIHRyYWNrIG9mIGZ1bmN0aW9uIGNhbGwgc3RhdGlzdGljcyBhbmQgcHJpbnRpbmcgdGhlbSBpZiBkZXNpcmVkCi0gKgotICovCi1jbGFzcyBTdGF0c1Byb2Nlc3NvciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvciB7Ci1wdWJsaWM6Ci0gIFN0YXRzUHJvY2Vzc29yKGJvb2wgcHJpbnQsIGJvb2wgZnJlcXVlbmN5KQotICAgIDogcHJpbnRfKHByaW50KSwKLSAgICAgIGZyZXF1ZW5jeV8oZnJlcXVlbmN5KQotICB7fQotICB2aXJ0dWFsIH5TdGF0c1Byb2Nlc3NvcigpIHt9OwotCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3QpIHsKLQotICAgIHBpcHJvdF8gPSBwaXByb3Q7Ci0KLSAgICBzdGQ6OnN0cmluZyBmbmFtZTsKLSAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKLSAgICBpbnQzMl90IHNlcWlkOwotCi0gICAgcGlwcm90Xy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKLSAgICBpZiAobXR5cGUgIT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NBTEwpIHsKLSAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgcHJpbnRmKCJVbmtub3duIG1lc3NhZ2UgdHlwZVxuIik7Ci0gICAgICB9Ci0gICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigiVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUiKTsKLSAgICB9Ci0gICAgaWYgKHByaW50XykgewotICAgICAgcHJpbnRmKCIlcyAoIiwgZm5hbWUuY19zdHIoKSk7Ci0gICAgfQotICAgIGlmIChmcmVxdWVuY3lfKSB7Ci0gICAgICBpZiAoZnJlcXVlbmN5X21hcF8uZmluZChmbmFtZSkgIT0gZnJlcXVlbmN5X21hcF8uZW5kKCkpIHsKLSAgICAgICAgZnJlcXVlbmN5X21hcF9bZm5hbWVdKys7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcmVxdWVuY3lfbWFwX1tmbmFtZV0gPSAxOwotICAgICAgfQotICAgIH0KLQotICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7Ci0gICAgaW50MTZfdCBmaWQ7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOwotICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihmdHlwZSk7Ci0gICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocHJpbnRfKSB7Ci0gICAgICBwcmludGYoIlxiXGIpXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50NjRfdD4mIGdldF9mcmVxdWVuY3lfbWFwKCkgewotICAgIHJldHVybiBmcmVxdWVuY3lfbWFwXzsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIHZvaWQgcHJpbnRBbmRQYXNzVG9CdWZmZXIoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZSkgewotICAgIHN3aXRjaCAoZnR5cGUpIHsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JPT0w6Ci0gICAgICAgIHsKLSAgICAgICAgICBib29sIGJvb2x2OwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRCb29sKGJvb2x2KTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVkIiwgYm9vbHYpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEU6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQ4X3QgYnl0ZXY7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEJ5dGUoYnl0ZXYpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQiLCBieXRldik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTE2OgotICAgICAgICB7Ci0gICAgICAgICAgaW50MTZfdCBpMTY7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEkxNihpMTYpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQiLCBpMTYpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMjoKLSAgICAgICAgewotICAgICAgICAgIGludDMyX3QgaTMyOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRJMzIoaTMyKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVkIiwgaTMyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQ2NF90IGk2NDsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkSTY0KGk2NCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlbGQiLCBpNjQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0RPVUJMRToKLSAgICAgICAgewotICAgICAgICAgIGRvdWJsZSBkdWI7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZERvdWJsZShkdWIpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWYiLCBkdWIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORzoKLSAgICAgICAgewotICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkU3RyaW5nKHN0cik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlcyIsIHN0ci5jX3N0cigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1Q6Ci0gICAgICAgIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOwotICAgICAgICAgIGludDE2X3QgZmlkOwotICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiPCIpOwotICAgICAgICAgIH0KLSAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7Ci0gICAgICAgICAgICBpZiAoZnR5cGUgPT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihmdHlwZSk7Ci0gICAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICAgIHByaW50ZigiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlxiPiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX01BUDoKLSAgICAgICAgewotICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUga2V5VHlwZTsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIHZhbFR5cGU7Ci0gICAgICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJ7Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGtleVR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIj0+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcih2YWxUeXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCIsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHBpcHJvdF8tPnJlYWRNYXBFbmQoKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlxifSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NFVDoKLSAgICAgICAgewotICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZWxlbVR5cGU7Ci0gICAgICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigieyIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihlbGVtVHlwZSk7Ci0gICAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICAgIHByaW50ZigiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBwaXByb3RfLT5yZWFkU2V0RW5kKCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJcYn0iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9MSVNUOgotICAgICAgICB7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBlbGVtVHlwZTsKLSAgICAgICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiWyIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihlbGVtVHlwZSk7Ci0gICAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICAgIHByaW50ZigiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBwaXByb3RfLT5yZWFkTGlzdEVuZCgpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiXGJdIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdF87Ci0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PiBmcmVxdWVuY3lfbWFwXzsKLQotICBib29sIHByaW50XzsKLSAgYm9vbCBmcmVxdWVuY3lfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm9jZXNzb3IKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0ODFjNC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVEJhc2U2NFV0aWxzLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotCi1zdGF0aWMgY29uc3QgdWludDhfdCAqa0Jhc2U2NEVuY29kZVRhYmxlID0gKGNvbnN0IHVpbnQ4X3QgKikKLSAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi12b2lkICBiYXNlNjRfZW5jb2RlKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QgKmJ1ZikgewotICBidWZbMF0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzBdID4+IDIpICYgMHgzRl07Ci0gIGlmIChsZW4gPT0gMykgewotICAgIGJ1ZlsxXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoKGluWzBdIDw8IDQpICsgKGluWzFdID4+IDQpKSAmIDB4M2ZdOwotICAgIGJ1ZlsyXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoKGluWzFdIDw8IDIpICsgKGluWzJdID4+IDYpKSAmIDB4M2ZdOwotICAgIGJ1ZlszXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVtpblsyXSAmIDB4M2ZdOwotICB9IGVsc2UgaWYgKGxlbiA9PSAyKSB7Ci0gICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMF0gPDwgNCkgKyAoaW5bMV0gPj4gNCkpICYgMHgzZl07Ci0gICAgYnVmWzJdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblsxXSA8PCAyKSAmIDB4M2ZdOwotICB9IGVsc2UgIHsgLy8gbGVuID09IDEKLSAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzBdIDw8IDQpICYgMHgzZl07Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0Jhc2U2NERlY29kZVRhYmxlWzI1Nl0gPXsKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSw2MiwtMSwtMSwtMSw2MywKLSAgNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LDEwLDExLDEyLDEzLDE0LAotICAxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsCi0gIDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0gIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLSAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi19OwotCi12b2lkIGJhc2U2NF9kZWNvZGUodWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgYnVmWzBdID0gKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMF1dIDw8IDIpIHwKLSAgICAgICAgICAgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMV1dID4+IDQpOwotICBpZiAobGVuID4gMikgewotICAgIGJ1ZlsxXSA9ICgoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsxXV0gPDwgNCkgJiAweGYwKSB8Ci0gICAgICAgICAgICAgIChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzJdXSA+PiAyKTsKLSAgICBpZiAobGVuID4gMykgewotICAgICAgYnVmWzJdID0gKChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzJdXSA8PCA2KSAmIDB4YzApIHwKLSAgICAgICAgICAgICAgICAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlszXV0pOwotICAgIH0KLSAgfQotfQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCYXNlNjRVdGlscy5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZWY3MzMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQkFTRTY0VVRJTFNfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQkFTRTY0VVRJTFNfSF8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vLyBpbiBtdXN0IGJlIGF0IGxlYXN0IGxlbiBieXRlcwotLy8gbGVuIG11c3QgYmUgMSwgMiwgb3IgMwotLy8gYnVmIG11c3QgYmUgYSBidWZmZXIgb2YgYXQgbGVhc3QgNCBieXRlcyBhbmQgbWF5IG5vdCBvdmVybGFwIGluCi0vLyB0aGUgZGF0YSBpcyBub3QgcGFkZGVkIHdpdGggJz0nOyB0aGUgY2FsbGVyIGNhbiBkbyB0aGlzIGlmIGRlc2lyZWQKLXZvaWQgYmFzZTY0X2VuY29kZShjb25zdCB1aW50OF90ICppbiwgdWludDMyX3QgbGVuLCB1aW50OF90ICpidWYpOwotCi0vLyBidWYgbXVzdCBiZSBhIGJ1ZmZlciBvZiBhdCBsZWFzdCA0IGJ5dGVzIGFuZCBjb250YWluIGJhc2U2NCBlbmNvZGVkIHZhbHVlcwotLy8gYnVmIHdpbGwgYmUgY2hhbmdlZCB0byBjb250YWluIG91dHB1dCBieXRlcwotLy8gbGVuIGlzIG51bWJlciBvZiBieXRlcyB0byBjb25zdW1lIGZyb20gaW5wdXQgKG11c3QgYmUgMiwgMywgb3IgNCkKLS8vIG5vICc9JyBwYWRkaW5nIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgaW5wdXQKLXZvaWQgYmFzZTY0X2RlY29kZSh1aW50OF90ICpidWYsIHVpbnQzMl90IGxlbik7Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQkFTRTY0VVRJTFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ4MzhiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVEJpbmFyeVByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICBpZiAoc3RyaWN0X3dyaXRlXykgewotICAgIGludDMyX3QgdmVyc2lvbiA9IChWRVJTSU9OXzEpIHwgKChpbnQzMl90KW1lc3NhZ2VUeXBlKTsKLSAgICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gICAgd3NpemUgKz0gd3JpdGVJMzIodmVyc2lvbik7Ci0gICAgd3NpemUgKz0gd3JpdGVTdHJpbmcobmFtZSk7Ci0gICAgd3NpemUgKz0gd3JpdGVJMzIoc2VxaWQpOwotICAgIHJldHVybiB3c2l6ZTsKLSAgfSBlbHNlIHsKLSAgICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gICAgd3NpemUgKz0gd3JpdGVTdHJpbmcobmFtZSk7Ci0gICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpbWVzc2FnZVR5cGUpOwotICAgIHdzaXplICs9IHdyaXRlSTMyKHNlcWlkKTsKLSAgICByZXR1cm4gd3NpemU7Ci0gIH0KLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdClmaWVsZFR5cGUpOwotICB3c2l6ZSArPSB3cml0ZUkxNihmaWVsZElkKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgewotICByZXR1cm4KLSAgICB3cml0ZUJ5dGUoKGludDhfdClUX1NUT1ApOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdClrZXlUeXBlKTsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpdmFsVHlwZSk7Ci0gIHdzaXplICs9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpIGVsZW1UeXBlKTsKLSAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWVsZW1UeXBlKTsKLSAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgdWludDhfdCB0bXAgPSAgdmFsdWUgPyAxIDogMDsKLSAgdHJhbnNfLT53cml0ZSgmdG1wLCAxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZieXRlLCAxKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgaW50MTZfdCBuZXQgPSAoaW50MTZfdClodG9ucyhpMTYpOwotICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCAyKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgaW50MzJfdCBuZXQgPSAoaW50MzJfdClodG9ubChpMzIpOwotICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCA0KTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgaW50NjRfdCBuZXQgPSAoaW50NjRfdClodG9ubGwoaTY0KTsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgOCk7Ci0gIHJldHVybiA4OwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7Ci0KLSAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKLSAgYml0cyA9IGh0b25sbChiaXRzKTsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopJmJpdHMsIDgpOwotICByZXR1cm4gODsKLX0KLQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHNpemUgPSBzdHIuc2l6ZSgpOwotICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKLSAgaWYgKHNpemUgPiAwKSB7Ci0gICAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArIHNpemU7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6d3JpdGVCaW5hcnkoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6d3JpdGVTdHJpbmcoc3RyKTsKLX0KLQotLyoqCi0gKiBSZWFkaW5nIGZ1bmN0aW9ucwotICovCi0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDMyX3Qgc3o7Ci0gIHJlc3VsdCArPSByZWFkSTMyKHN6KTsKLQotICBpZiAoc3ogPCAwKSB7Ci0gICAgLy8gQ2hlY2sgZm9yIGNvcnJlY3QgdmVyc2lvbiBudW1iZXIKLSAgICBpbnQzMl90IHZlcnNpb24gPSBzeiAmIFZFUlNJT05fTUFTSzsKLSAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKLSAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaWRlbnRpZmllciIpOwotICAgIH0KLSAgICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpKHN6ICYgMHgwMDAwMDBmZik7Ci0gICAgcmVzdWx0ICs9IHJlYWRTdHJpbmcobmFtZSk7Ci0gICAgcmVzdWx0ICs9IHJlYWRJMzIoc2VxaWQpOwotICB9IGVsc2UgewotICAgIGlmIChzdHJpY3RfcmVhZF8pIHsKLSAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiTm8gdmVyc2lvbiBpZGVudGlmaWVyLi4uIG9sZCBwcm90b2NvbCBjbGllbnQgaW4gc3RyaWN0IG1vZGU/Iik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0Ci0gICAgICBpbnQ4X3QgdHlwZTsKLSAgICAgIHJlc3VsdCArPSByZWFkU3RyaW5nQm9keShuYW1lLCBzeik7Ci0gICAgICByZXN1bHQgKz0gcmVhZEJ5dGUodHlwZSk7Ci0gICAgICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpdHlwZTsKLSAgICAgIHJlc3VsdCArPSByZWFkSTMyKHNlcWlkKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZFN0cnVjdEJlZ2luKHN0cmluZyYgbmFtZSkgewotICBuYW1lID0gIiI7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICB1aW50MzJfdCByZXN1bHQgPSAwOwotICBpbnQ4X3QgdHlwZTsKLSAgcmVzdWx0ICs9IHJlYWRCeXRlKHR5cGUpOwotICBmaWVsZFR5cGUgPSAoVFR5cGUpdHlwZTsKLSAgaWYgKGZpZWxkVHlwZSA9PSBUX1NUT1ApIHsKLSAgICBmaWVsZElkID0gMDsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIHJlc3VsdCArPSByZWFkSTE2KGZpZWxkSWQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBpbnQ4X3QgaywgdjsKLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgcmVzdWx0ICs9IHJlYWRCeXRlKGspOwotICBrZXlUeXBlID0gKFRUeXBlKWs7Ci0gIHJlc3VsdCArPSByZWFkQnl0ZSh2KTsKLSAgdmFsVHlwZSA9IChUVHlwZSl2OwotICByZXN1bHQgKz0gcmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0gIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZE1hcEVuZCgpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgaW50OF90IGU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHJlc3VsdCArPSByZWFkQnl0ZShlKTsKLSAgZWxlbVR5cGUgPSAoVFR5cGUpZTsKLSAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRMaXN0RW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgaW50OF90IGU7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHJlc3VsdCArPSByZWFkQnl0ZShlKTsKLSAgZWxlbVR5cGUgPSAoVFR5cGUpZTsKLSAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOwotICBpZiAoc2l6ZWkgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRTZXRFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gIHVpbnQ4X3QgYlsxXTsKLSAgdHJhbnNfLT5yZWFkQWxsKGIsIDEpOwotICB2YWx1ZSA9ICooaW50OF90KiliICE9IDA7Ci0gIHJldHVybiAxOwotfQotCi11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICB1aW50OF90IGJbMV07Ci0gIHRyYW5zXy0+cmVhZEFsbChiLCAxKTsKLSAgYnl0ZSA9ICooaW50OF90KiliOwotICByZXR1cm4gMTsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkSTE2KGludDE2X3QmIGkxNikgewotICB1aW50OF90IGJbMl07Ci0gIHRyYW5zXy0+cmVhZEFsbChiLCAyKTsKLSAgaTE2ID0gKihpbnQxNl90KiliOwotICBpMTYgPSAoaW50MTZfdCludG9ocyhpMTYpOwotICByZXR1cm4gMjsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkSTMyKGludDMyX3QmIGkzMikgewotICB1aW50OF90IGJbNF07Ci0gIHRyYW5zXy0+cmVhZEFsbChiLCA0KTsKLSAgaTMyID0gKihpbnQzMl90KiliOwotICBpMzIgPSAoaW50MzJfdCludG9obChpMzIpOwotICByZXR1cm4gNDsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkSTY0KGludDY0X3QmIGk2NCkgewotICB1aW50OF90IGJbOF07Ci0gIHRyYW5zXy0+cmVhZEFsbChiLCA4KTsKLSAgaTY0ID0gKihpbnQ2NF90KiliOwotICBpNjQgPSAoaW50NjRfdCludG9obGwoaTY0KTsKLSAgcmV0dXJuIDg7Ci19Ci0KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKLQotICB1aW50NjRfdCBiaXRzOwotICB1aW50OF90IGJbOF07Ci0gIHRyYW5zXy0+cmVhZEFsbChiLCA4KTsKLSAgYml0cyA9ICoodWludDY0X3QqKWI7Ci0gIGJpdHMgPSBudG9obGwoYml0cyk7Ci0gIGR1YiA9IGJpdHdpc2VfY2FzdDxkb3VibGU+KGJpdHMpOwotICByZXR1cm4gODsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkU3RyaW5nKHN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHJlc3VsdDsKLSAgaW50MzJfdCBzaXplOwotICByZXN1bHQgPSByZWFkSTMyKHNpemUpOwotICByZXR1cm4gcmVzdWx0ICsgcmVhZFN0cmluZ0JvZHkoc3RyLCBzaXplKTsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkQmluYXJ5KHN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RyKTsKLX0KLQotdWludDMyX3QgVEJpbmFyeVByb3RvY29sOjpyZWFkU3RyaW5nQm9keShzdHJpbmcmIHN0ciwgaW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0KLSAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKLSAgaWYgKHNpemUgPCAwKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0KLSAgaWYgKHN0cmluZ19saW1pdF8gPiAwICYmIHNpemUgPiBzdHJpbmdfbGltaXRfKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLQotICAvLyBDYXRjaCBlbXB0eSBzdHJpbmcgY2FzZQotICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgc3RyID0gIiI7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFVzZSB0aGUgaGVhcCBoZXJlIHRvIHByZXZlbnQgc3RhY2sgb3ZlcmZsb3cgZm9yIHYuIGxhcmdlIHN0cmluZ3MKLSAgaWYgKHNpemUgPiBzdHJpbmdfYnVmX3NpemVfIHx8IHN0cmluZ19idWZfID09IE5VTEwpIHsKLSAgICB2b2lkKiBuZXdfc3RyaW5nX2J1ZiA9IHN0ZDo6cmVhbGxvYyhzdHJpbmdfYnVmXywgKHVpbnQzMl90KXNpemUpOwotICAgIGlmIChuZXdfc3RyaW5nX2J1ZiA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAiT3V0IG9mIG1lbW9yeSBpbiBUQmluYXJ5UHJvdG9jb2w6OnJlYWRTdHJpbmciKTsKLSAgICB9Ci0gICAgc3RyaW5nX2J1Zl8gPSAodWludDhfdCopbmV3X3N0cmluZ19idWY7Ci0gICAgc3RyaW5nX2J1Zl9zaXplXyA9IHNpemU7Ci0gIH0KLSAgdHJhbnNfLT5yZWFkQWxsKHN0cmluZ19idWZfLCBzaXplKTsKLSAgc3RyID0gc3RyaW5nKChjaGFyKilzdHJpbmdfYnVmXywgc2l6ZSk7Ci0gIHJldHVybiAodWludDMyX3Qpc2l6ZTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkM2RlNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVFByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGJpbmFyeSBwcm90b2NvbCBmb3IgdGhyaWZ0LiBXcml0ZXMgYWxsIGRhdGEgaW4gYSB2ZXJ5IGJhc2ljCi0gKiBiaW5hcnkgZm9ybWF0LCBlc3NlbnRpYWxseSBqdXN0IHNwaXR0aW5nIG91dCB0aGUgcmF3IGJ5dGVzLgotICoKLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sIDogcHVibGljIFRQcm90b2NvbCB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwotICAvLyBWRVJTSU9OXzIgKDB4ODAwMjAwMDApICBpcyB0YWtlbiBieSBURGVuc2VQcm90b2NvbC4KLQotIHB1YmxpYzoKLSAgVEJpbmFyeVByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSA6Ci0gICAgVFByb3RvY29sKHRyYW5zKSwKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCi0gICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHRydWUpLAotICAgIHN0cmluZ19idWZfKE5VTEwpLAotICAgIHN0cmluZ19idWZfc2l6ZV8oMCkge30KLQotICBUQmluYXJ5UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3RfcmVhZCwKLSAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3dyaXRlKSA6Ci0gICAgVFByb3RvY29sKHRyYW5zKSwKLSAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCi0gICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpLAotICAgIHN0cmljdF9yZWFkXyhzdHJpY3RfcmVhZCksCi0gICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpLAotICAgIHN0cmluZ19idWZfKE5VTEwpLAotICAgIHN0cmluZ19idWZfc2l6ZV8oMCkge30KLQotICB+VEJpbmFyeVByb3RvY29sKCkgewotICAgIGlmIChzdHJpbmdfYnVmXyAhPSBOVUxMKSB7Ci0gICAgICBzdGQ6OmZyZWUoc3RyaW5nX2J1Zl8pOwotICAgICAgc3RyaW5nX2J1Zl9zaXplXyA9IDA7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsKLSAgICBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsKLSAgICBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRTdHJpY3QoYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIHsKLSAgICBzdHJpY3RfcmVhZF8gPSBzdHJpY3RfcmVhZDsKLSAgICBzdHJpY3Rfd3JpdGVfID0gc3RyaWN0X3dyaXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRpbmcgZnVuY3Rpb25zLgotICAgKi8KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOwotCi0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOwotCi0gIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOwotCi0gIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKLQotICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgLyoqCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKTsKLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKLQotICB1aW50MzJfdCByZWFkRmllbGRFbmQoKTsKLQotICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTWFwRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkU2V0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOwotCi0gIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7Ci0KLSAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOwotCi0gIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKTsKLQotICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCk7Ci0KLSAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7Ci0KLSAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gcHJvdGVjdGVkOgotICB1aW50MzJfdCByZWFkU3RyaW5nQm9keShzdGQ6OnN0cmluZyYgc3RyLCBpbnQzMl90IHN6KTsKLQotICBpbnQzMl90IHN0cmluZ19saW1pdF87Ci0gIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKLQotICAvLyBFbmZvcmNlIHByZXNlbmNlIG9mIHZlcnNpb24gaWRlbnRpZmllcgotICBib29sIHN0cmljdF9yZWFkXzsKLSAgYm9vbCBzdHJpY3Rfd3JpdGVfOwotCi0gIC8vIEJ1ZmZlciBmb3IgcmVhZGluZyBzdHJpbmdzLCBzYXZlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb3RvY29sIHRvCi0gIC8vIGF2b2lkIG1lbW9yeSBjaHVybiBhbGxvY2F0aW5nIG1lbW9yeSBvbiBldmVyeSBzdHJpbmcgcmVhZAotICB1aW50OF90KiBzdHJpbmdfYnVmXzsKLSAgaW50MzJfdCBzdHJpbmdfYnVmX3NpemVfOwotCi19OwotCi0vKioKLSAqIENvbnN0cnVjdHMgYmluYXJ5IHByb3RvY29sIGhhbmRsZXJzCi0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgotICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkgOgotICAgIHN0cmluZ19saW1pdF8oMCksCi0gICAgY29udGFpbmVyX2xpbWl0XygwKSwKLSAgICBzdHJpY3RfcmVhZF8oZmFsc2UpLAotICAgIHN0cmljdF93cml0ZV8odHJ1ZSkge30KLQotICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwgYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIDoKLSAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCi0gICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpLAotICAgIHN0cmljdF9yZWFkXyhzdHJpY3RfcmVhZCksCi0gICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpIHt9Ci0KLSAgdmlydHVhbCB+VEJpbmFyeVByb3RvY29sRmFjdG9yeSgpIHt9Ci0KLSAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsKLSAgICBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsKLSAgICBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRTdHJpY3QoYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIHsKLSAgICBzdHJpY3RfcmVhZF8gPSBzdHJpY3RfcmVhZDsKLSAgICBzdHJpY3Rfd3JpdGVfID0gc3RyaWN0X3dyaXRlOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmluZ19saW1pdF8sIGNvbnRhaW5lcl9saW1pdF8sIHN0cmljdF9yZWFkXywgc3RyaWN0X3dyaXRlXykpOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnQzMl90IHN0cmluZ19saW1pdF87Ci0gIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKLSAgYm9vbCBzdHJpY3RfcmVhZF87Ci0gIGJvb2wgc3RyaWN0X3dyaXRlXzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyZWU1NC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDczNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUQ29tcGFjdFByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLS8qCi0gKiBUQ29tcGFjdFByb3RvY29sOjppKlRvWmlnemFnIGRlcGVuZCBvbiB0aGUgZmFjdCB0aGF0IHRoZSByaWdodCBzaGlmdAotICogb3BlcmF0b3Igb24gYSBzaWduZWQgaW50ZWdlciBpcyBhbiBhcml0aG1ldGljIChzaWduLWV4dGVuZGluZykgc2hpZnQuCi0gKiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBub3Qgd29yay4KLSAqIElmIGFueW9uZSBlbmNvdW50ZXJzIHRoaXMgZXJyb3IsIHdlIGNhbiB0cnkgdG8gZmlndXJlIG91dCB0aGUgYmVzdAotICogd2F5IHRvIGltcGxlbWVudCBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IG9uIHRoZWlyIHBsYXRmb3JtLgotICovCi0jaWYgIWRlZmluZWQoU0lHTkVEX1JJR0hUX1NISUZUX0lTKSB8fCAhZGVmaW5lZChBUklUSE1FVElDX1JJR0hUX1NISUZUKQotIyBlcnJvciAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCi0jZW5kaWYKLSNpZiBTSUdORURfUklHSFRfU0hJRlRfSVMgIT0gQVJJVEhNRVRJQ19SSUdIVF9TSElGVAotIyBlcnJvciAiVENvbXBhY3RQcm90b2NvbCBjdXJyZW5seSBvbmx5IHdvcmtzIGlmIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IGlzIGFyaXRobWV0aWMiCi0jZW5kaWYKLQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIFVOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQotI2Vsc2UKLSNkZWZpbmUgVU5MSUtFTFkodmFsKSAodmFsKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotY29uc3QgaW50OF90IFRDb21wYWN0UHJvdG9jb2w6OlRUeXBlVG9DVHlwZVsxNl0gPSB7Ci0gICAgQ1RfU1RPUCwgLy8gVF9TVE9QCi0gICAgMCwgLy8gdW51c2VkCi0gICAgQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKLSAgICBDVF9CWVRFLCAvLyBUX0JZVEUKLSAgICBDVF9ET1VCTEUsIC8vIFRfRE9VQkxFCi0gICAgMCwgLy8gdW51c2VkCi0gICAgQ1RfSTE2LCAvLyBUX0kxNgotICAgIDAsIC8vIHVudXNlZAotICAgIENUX0kzMiwgLy8gVF9JMzIKLSAgICAwLCAvLyB1bnVzZWQKLSAgICBDVF9JNjQsIC8vIFRfSTY0Ci0gICAgQ1RfQklOQVJZLCAvLyBUX1NUUklORwotICAgIENUX1NUUlVDVCwgLy8gVF9TVFJVQ1QKLSAgICBDVF9NQVAsIC8vIFRfTUFQCi0gICAgQ1RfU0VULCAvLyBUX1NFVAotICAgIENUX0xJU1QsIC8vIFRfTElTVAotICB9OwotCi0KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZShQUk9UT0NPTF9JRCk7Ci0gIHdzaXplICs9IHdyaXRlQnl0ZSgoVkVSU0lPTl9OICYgVkVSU0lPTl9NQVNLKSB8ICgoKGludDMyX3QpbWVzc2FnZVR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSk7Ci0gIHdzaXplICs9IHdyaXRlVmFyaW50MzIoc2VxaWQpOwotICB3c2l6ZSArPSB3cml0ZVN0cmluZyhuYW1lKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi0vKioKLSAqIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKLSAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKLSAqIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKLSAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgaWYgKGZpZWxkVHlwZSA9PSBUX0JPT0wpIHsKLSAgICBib29sZWFuRmllbGRfLm5hbWUgPSBuYW1lOwotICAgIGJvb2xlYW5GaWVsZF8uZmllbGRUeXBlID0gZmllbGRUeXBlOwotICAgIGJvb2xlYW5GaWVsZF8uZmllbGRJZCA9IGZpZWxkSWQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCwgLTEpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vKioKLSAqIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybiB3cml0ZUJ5dGUoVF9TVE9QKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKLSAqIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAotICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICBsYXN0RmllbGRfLnB1c2gobGFzdEZpZWxkSWRfKTsKLSAgbGFzdEZpZWxkSWRfID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKLSAqIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgotICogb2YgdGhlIGZpZWxkIHN0YWNrLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKLSAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy50b3AoKTsKLSAgbGFzdEZpZWxkXy5wb3AoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBMaXN0IGhlYWRlci4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHJldHVybiB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBzZXQgaGVhZGVyLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHJldHVybiB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKLSAqIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLQotICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgd3NpemUgKz0gd3JpdGVCeXRlKDApOwotICB9IGVsc2UgewotICAgIHdzaXplICs9IHdyaXRlVmFyaW50MzIoc2l6ZSk7Ci0gICAgd3NpemUgKz0gd3JpdGVCeXRlKGdldENvbXBhY3RUeXBlKGtleVR5cGUpIDw8IDQgfCBnZXRDb21wYWN0VHlwZSh2YWxUeXBlKSk7Ci0gIH0KLSAgcmV0dXJuIHdzaXplOwotfQotCi0vKioKLSAqIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgotICogd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKLSAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gd3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KLSAqIE90aGVyd2lzZSwgd3JpdGUgYSBzaW5nbGUgYnl0ZS4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotCi0gIGlmIChib29sZWFuRmllbGRfLm5hbWUgIT0gTlVMTCkgewotICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAotICAgIHdzaXplICs9IHdyaXRlRmllbGRCZWdpbkludGVybmFsKGJvb2xlYW5GaWVsZF8ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfLmZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfLmZpZWxkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKTsKLSAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOwotICB9IGVsc2UgewotICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlCi0gICAgd3NpemUgKz0gd3JpdGVCeXRlKHZhbHVlID8gQ1RfQk9PTEVBTl9UUlVFIDogQ1RfQk9PTEVBTl9GQUxTRSk7Ci0gIH0KLSAgcmV0dXJuIHdzaXplOwotfQotCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopJmJ5dGUsIDEpOwotICByZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpMTYgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICByZXR1cm4gd3JpdGVWYXJpbnQzMihpMzJUb1ppZ3phZyhpMTYpKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gd3JpdGVWYXJpbnQzMihpMzJUb1ppZ3phZyhpMzIpKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICByZXR1cm4gd3JpdGVWYXJpbnQ2NChpNjRUb1ppZ3phZyhpNjQpKTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOwotCi0gIHVpbnQ2NF90IGJpdHMgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KGR1Yik7Ci0gIGJpdHMgPSBodG9sZWxsKGJpdHMpOwotICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmYml0cywgOCk7Ci0gIHJldHVybiA4OwotfQotCi0vKioKLSAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWVkaW5nLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiB3cml0ZUJpbmFyeShzdHIpOwotfQotCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHNzaXplID0gc3RyLnNpemUoKTsKLSAgdWludDMyX3Qgd3NpemUgPSB3cml0ZVZhcmludDMyKHNzaXplKSArIHNzaXplOwotICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzc2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotLy8KLS8vIEludGVybmFsIFdyaXRpbmcgbWV0aG9kcwotLy8KLQotLyoqCi0gKiBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQotICogJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKLSAqIGJvb2xlYW4gZmllbGQgY2FzZS4KLSAqLwotaW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHR5cGVPdmVycmlkZSkgewotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0KLSAgLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgotICBpbnQ4X3QgdHlwZVRvV3JpdGUgPSAodHlwZU92ZXJyaWRlID09IC0xID8gZ2V0Q29tcGFjdFR5cGUoZmllbGRUeXBlKSA6IHR5cGVPdmVycmlkZSk7Ci0KLSAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCi0gIGlmIChmaWVsZElkID4gbGFzdEZpZWxkSWRfICYmIGZpZWxkSWQgLSBsYXN0RmllbGRJZF8gPD0gMTUpIHsKLSAgICAvLyB3cml0ZSB0aGVtIHRvZ2V0aGVyCi0gICAgd3NpemUgKz0gd3JpdGVCeXRlKChmaWVsZElkIC0gbGFzdEZpZWxkSWRfKSA8PCA0IHwgdHlwZVRvV3JpdGUpOwotICB9IGVsc2UgewotICAgIC8vIHdyaXRlIHRoZW0gc2VwYXJhdGUKLSAgICB3c2l6ZSArPSB3cml0ZUJ5dGUodHlwZVRvV3JpdGUpOwotICAgIHdzaXplICs9IHdyaXRlSTE2KGZpZWxkSWQpOwotICB9Ci0KLSAgbGFzdEZpZWxkSWRfID0gZmllbGRJZDsKLSAgcmV0dXJuIHdzaXplOwotfQotCi0vKioKLSAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KLSAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6d3JpdGVDb2xsZWN0aW9uQmVnaW4oaW50OF90IGVsZW1UeXBlLCBpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICBpZiAoc2l6ZSA8PSAxNCkgewotICAgIHdzaXplICs9IHdyaXRlQnl0ZShzaXplIDw8IDQgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOwotICB9IGVsc2UgewotICAgIHdzaXplICs9IHdyaXRlQnl0ZSgweGYwIHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKLSAgICB3c2l6ZSArPSB3cml0ZVZhcmludDMyKHNpemUpOwotICB9Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotLyoqCi0gKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZVZhcmludDMyKHVpbnQzMl90IG4pIHsKLSAgdWludDhfdCBidWZbNV07Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOwotICAgICAgbiA+Pj0gNzsKLSAgICB9Ci0gIH0KLSAgdHJhbnNfLT53cml0ZShidWYsIHdzaXplKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi0vKioKLSAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjp3cml0ZVZhcmludDY0KHVpbnQ2NF90IG4pIHsKLSAgdWludDhfdCBidWZbMTBdOwotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKLSAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSB7Ci0gICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICBuID4+PSA3OwotICAgIH0KLSAgfQotICB0cmFuc18tPndyaXRlKGJ1Ziwgd3NpemUpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLS8qKgotICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQotICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgotICovCi11aW50NjRfdCBUQ29tcGFjdFByb3RvY29sOjppNjRUb1ppZ3phZyhjb25zdCBpbnQ2NF90IGwpIHsKLSAgcmV0dXJuIChsIDw8IDEpIF4gKGwgPj4gNjMpOwotfQotCi0vKioKLSAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQotICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjppMzJUb1ppZ3phZyhjb25zdCBpbnQzMl90IG4pIHsKLSAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOwotfQotCi0vKioKLSAqIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZSB2YWx1ZQotICovCi1pbnQ4X3QgVENvbXBhY3RQcm90b2NvbDo6Z2V0Q29tcGFjdFR5cGUoaW50OF90IHR0eXBlKSB7Ci0gIHJldHVybiBUVHlwZVRvQ1R5cGVbdHR5cGVdOwotfQotCi0vLwotLy8gUmVhZGluZyBNZXRob2RzCi0vLwotCi0vKioKLSAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgdWludDMyX3QgcnNpemUgPSAwOwotICBpbnQ4X3QgcHJvdG9jb2xJZDsKLSAgaW50OF90IHZlcnNpb25BbmRUeXBlOwotICBpbnQ4X3QgdmVyc2lvbjsKLQotICByc2l6ZSArPSByZWFkQnl0ZShwcm90b2NvbElkKTsKLSAgaWYgKHByb3RvY29sSWQgIT0gUFJPVE9DT0xfSUQpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCBpZGVudGlmaWVyIik7Ci0gIH0KLQotICByc2l6ZSArPSByZWFkQnl0ZSh2ZXJzaW9uQW5kVHlwZSk7Ci0gIHZlcnNpb24gPSAoaW50OF90KSh2ZXJzaW9uQW5kVHlwZSAmIFZFUlNJT05fTUFTSyk7Ci0gIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fTikgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHByb3RvY29sIHZlcnNpb24iKTsKLSAgfQotCi0gIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSkoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIDB4MDMpOwotICByc2l6ZSArPSByZWFkVmFyaW50MzIoc2VxaWQpOwotICByc2l6ZSArPSByZWFkU3RyaW5nKG5hbWUpOwotCi0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKLSAqIG9wcG9ydHVuaXR5IHRvIHB1c2ggYSBuZXcgc3RydWN0IGJlZ2luIG1hcmtlciBvbiB0aGUgZmllbGQgc3RhY2suCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICBuYW1lID0gIiI7Ci0gIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOwotICBsYXN0RmllbGRJZF8gPSAwOwotICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgotICogdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7Ci0gIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8udG9wKCk7Ci0gIGxhc3RGaWVsZF8ucG9wKCk7Ci0gIHJldHVybiAwOwotfQotCi0vKioKLSAqIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gIHVpbnQzMl90IHJzaXplID0gMDsKLSAgaW50OF90IGJ5dGU7Ci0gIGludDhfdCB0eXBlOwotCi0gIHJzaXplICs9IHJlYWRCeXRlKGJ5dGUpOwotICB0eXBlID0gKGJ5dGUgJiAweDBmKTsKLQotICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCi0gIGlmICh0eXBlID09IFRfU1RPUCkgewotICAgIGZpZWxkVHlwZSA9IFRfU1RPUDsKLSAgICBmaWVsZElkID0gMDsKLSAgICByZXR1cm4gcnNpemU7Ci0gIH0KLQotICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCi0gIGludDE2X3QgbW9kaWZpZXIgPSAoaW50MTZfdCkoKCh1aW50OF90KWJ5dGUgJiAweGYwKSA+PiA0KTsKLSAgaWYgKG1vZGlmaWVyID09IDApIHsKLSAgICAvLyBub3QgYSBkZWx0YSwgbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCi0gICAgcnNpemUgKz0gcmVhZEkxNihmaWVsZElkKTsKLSAgfSBlbHNlIHsKLSAgICBmaWVsZElkID0gKGludDE2X3QpKGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsKLSAgfQotICBmaWVsZFR5cGUgPSBnZXRUVHlwZSh0eXBlKTsKLQotICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQotICBpZiAodHlwZSA9PSBDVF9CT09MRUFOX1RSVUUgfHwgdHlwZSA9PSBDVF9CT09MRUFOX0ZBTFNFKSB7Ci0gICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCi0gICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSB0cnVlOwotICAgIGJvb2xWYWx1ZV8uYm9vbFZhbHVlID0gKHR5cGUgPT0gQ1RfQk9PTEVBTl9UUlVFID8gdHJ1ZSA6IGZhbHNlKTsKLSAgfQotCi0gIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgotICBsYXN0RmllbGRJZF8gPSBmaWVsZElkOwotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIHJlYWRpbmcgdGhlIGtleQotICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKLSAqICJjb3JyZWN0IiB0eXBlcy4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIHVpbnQzMl90IHJzaXplID0gMDsKLSAgaW50OF90IGt2VHlwZSA9IDA7Ci0gIGludDMyX3QgbXNpemUgPSAwOwotCi0gIHJzaXplICs9IHJlYWRWYXJpbnQzMihtc2l6ZSk7Ci0gIGlmIChtc2l6ZSAhPSAwKQotICAgIHJzaXplICs9IHJlYWRCeXRlKGt2VHlwZSk7Ci0KLSAgaWYgKG1zaXplIDwgMCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgbXNpemUgPiBjb250YWluZXJfbGltaXRfKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLQotICBrZXlUeXBlID0gZ2V0VFR5cGUoKGludDhfdCkoKHVpbnQ4X3Qpa3ZUeXBlID4+IDQpKTsKLSAgdmFsVHlwZSA9IGdldFRUeXBlKChpbnQ4X3QpKCh1aW50OF90KWt2VHlwZSAmIDB4ZikpOwotICBzaXplID0gKHVpbnQzMl90KW1zaXplOwotCi0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKLSAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgotICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQotICogdHJ1ZSBzaXplLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgaW50OF90IHNpemVfYW5kX3R5cGU7Ci0gIHVpbnQzMl90IHJzaXplID0gMDsKLSAgaW50MzJfdCBsc2l6ZTsKLQotICByc2l6ZSArPSByZWFkQnl0ZShzaXplX2FuZF90eXBlKTsKLQotICBsc2l6ZSA9ICgodWludDhfdClzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKLSAgaWYgKGxzaXplID09IDE1KSB7Ci0gICAgcnNpemUgKz0gcmVhZFZhcmludDMyKGxzaXplKTsKLSAgfQotCi0gIGlmIChsc2l6ZSA8IDApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIGxzaXplID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0KLSAgZWxlbVR5cGUgPSBnZXRUVHlwZSgoaW50OF90KShzaXplX2FuZF90eXBlICYgMHgwZikpOwotICBzaXplID0gKHVpbnQzMl90KWxzaXplOwotCi0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCi0gKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgotICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQotICogdHJ1ZSBzaXplLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIHJldHVybiByZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLX0KLQotLyoqCi0gKiBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCi0gKiBhbHJlYWR5IGhhdmUgYmVlbiByZWFkIGR1cmluZyByZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQotICogcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCByZWFkIGEgYnl0ZS4KLSAqLwotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgaWYgKGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID09IHRydWUpIHsKLSAgICB2YWx1ZSA9IGJvb2xWYWx1ZV8uYm9vbFZhbHVlOwotICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7Ci0gICAgcmV0dXJuIDA7Ci0gIH0gZWxzZSB7Ci0gICAgaW50OF90IHZhbDsKLSAgICByZWFkQnl0ZSh2YWwpOwotICAgIHZhbHVlID0gKHZhbCA9PSBDVF9CT09MRUFOX1RSVUUpOwotICAgIHJldHVybiAxOwotICB9Ci19Ci0KLS8qKgotICogUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgdWludDhfdCBiWzFdOwotICB0cmFuc18tPnJlYWRBbGwoYiwgMSk7Ci0gIGJ5dGUgPSAqKGludDhfdCopYjsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRJMTYoaW50MTZfdCYgaTE2KSB7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDMyKHZhbHVlKTsKLSAgaTE2ID0gKGludDE2X3QpemlnemFnVG9JMzIodmFsdWUpOwotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRJMzIoaW50MzJfdCYgaTMyKSB7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDMyKHZhbHVlKTsKLSAgaTMyID0gemlnemFnVG9JMzIodmFsdWUpOwotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIHVpbnQzMl90IHJzaXplID0gcmVhZFZhcmludDY0KHZhbHVlKTsKLSAgaTY0ID0gemlnemFnVG9JNjQodmFsdWUpOwotICByZXR1cm4gcnNpemU7Ci19Ci0KLS8qKgotICogTm8gbWFnaWMgaGVyZSAtIGp1c3QgcmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7Ci0KLSAgdWludDY0X3QgYml0czsKLSAgdWludDhfdCBiWzhdOwotICB0cmFuc18tPnJlYWRBbGwoYiwgOCk7Ci0gIGJpdHMgPSAqKHVpbnQ2NF90KiliOwotICBiaXRzID0gbGV0b2hsbChiaXRzKTsKLSAgZHViID0gYml0d2lzZV9jYXN0PGRvdWJsZT4oYml0cyk7Ci0gIHJldHVybiA4OwotfQotCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIHJlYWRCaW5hcnkoc3RyKTsKLX0KLQotLyoqCi0gKiBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCi0gKi8KLXVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgewotICBpbnQzMl90IHJzaXplID0gMDsKLSAgaW50MzJfdCBzaXplOwotCi0gIHJzaXplICs9IHJlYWRWYXJpbnQzMihzaXplKTsKLSAgLy8gQ2F0Y2ggZW1wdHkgc3RyaW5nIGNhc2UKLSAgaWYgKHNpemUgPT0gMCkgewotICAgIHN0ciA9ICIiOwotICAgIHJldHVybiByc2l6ZTsKLSAgfQotCi0gIC8vIENhdGNoIGVycm9yIGNhc2VzCi0gIGlmIChzaXplIDwgMCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOwotICB9Ci0gIGlmIChzdHJpbmdfbGltaXRfID4gMCAmJiBzaXplID4gc3RyaW5nX2xpbWl0XykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB9Ci0KLSAgLy8gVXNlIHRoZSBoZWFwIGhlcmUgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvdyBmb3Igdi4gbGFyZ2Ugc3RyaW5ncwotICBpZiAoc2l6ZSA+IHN0cmluZ19idWZfc2l6ZV8gfHwgc3RyaW5nX2J1Zl8gPT0gTlVMTCkgewotICAgIHZvaWQqIG5ld19zdHJpbmdfYnVmID0gc3RkOjpyZWFsbG9jKHN0cmluZ19idWZfLCAodWludDMyX3Qpc2l6ZSk7Ci0gICAgaWYgKG5ld19zdHJpbmdfYnVmID09IE5VTEwpIHsKLSAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICJPdXQgb2YgbWVtb3J5IGluIFRDb21wYWN0UHJvdG9jb2w6OnJlYWRTdHJpbmciKTsKLSAgICB9Ci0gICAgc3RyaW5nX2J1Zl8gPSAodWludDhfdCopbmV3X3N0cmluZ19idWY7Ci0gICAgc3RyaW5nX2J1Zl9zaXplXyA9IHNpemU7Ci0gIH0KLSAgdHJhbnNfLT5yZWFkQWxsKHN0cmluZ19idWZfLCBzaXplKTsKLSAgc3RyLmFzc2lnbigoY2hhciopc3RyaW5nX2J1Zl8sIHNpemUpOwotCi0gIHJldHVybiByc2l6ZSArICh1aW50MzJfdClzaXplOwotfQotCi0vKioKLSAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAotICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkVmFyaW50MzIoaW50MzJfdCYgaTMyKSB7Ci0gIGludDY0X3QgdmFsOwotICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQ2NCh2YWwpOwotICBpMzIgPSAoaW50MzJfdCl2YWw7Ci0gIHJldHVybiByc2l6ZTsKLX0KLQotLyoqCi0gKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0Ci0gKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgotICovCi11aW50MzJfdCBUQ29tcGFjdFByb3RvY29sOjpyZWFkVmFyaW50NjQoaW50NjRfdCYgaTY0KSB7Ci0gIHVpbnQzMl90IHJzaXplID0gMDsKLSAgdWludDY0X3QgdmFsID0gMDsKLSAgaW50IHNoaWZ0ID0gMDsKLSAgdWludDhfdCBidWZbMTBdOyAgLy8gNjQgYml0cyAvICg3IGJpdHMvYnl0ZSkgPSAxMCBieXRlcy4KLSAgdWludDMyX3QgYnVmX3NpemUgPSBzaXplb2YoYnVmKTsKLSAgY29uc3QgdWludDhfdCogYm9ycm93ZWQgPSB0cmFuc18tPmJvcnJvdyhidWYsICZidWZfc2l6ZSk7Ci0KLSAgLy8gRmFzdCBwYXRoLgotICBpZiAoYm9ycm93ZWQgIT0gTlVMTCkgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB1aW50OF90IGJ5dGUgPSBib3Jyb3dlZFtyc2l6ZV07Ci0gICAgICByc2l6ZSsrOwotICAgICAgdmFsIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OwotICAgICAgc2hpZnQgKz0gNzsKLSAgICAgIGlmICghKGJ5dGUgJiAweDgwKSkgewotICAgICAgICBpNjQgPSB2YWw7Ci0gICAgICAgIHRyYW5zXy0+Y29uc3VtZShyc2l6ZSk7Ci0gICAgICAgIHJldHVybiByc2l6ZTsKLSAgICAgIH0KLSAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGludmFsaWQgZGF0YSBzbyB3ZSBkb24ndCBjcmFzaC4KLSAgICAgIGlmIChVTkxJS0VMWShyc2l6ZSA9PSBzaXplb2YoYnVmKSkpIHsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFNsb3cgcGF0aC4KLSAgZWxzZSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHVpbnQ4X3QgYnl0ZTsKLSAgICAgIHJzaXplICs9IHRyYW5zXy0+cmVhZEFsbCgmYnl0ZSwgMSk7Ci0gICAgICB2YWwgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7Ci0gICAgICBzaGlmdCArPSA3OwotICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICAgIGk2NCA9IHZhbDsKLSAgICAgICAgcmV0dXJuIHJzaXplOwotICAgICAgfQotICAgICAgLy8gTWlnaHQgYXMgd2VsbCBjaGVjayBmb3IgaW52YWxpZCBkYXRhIG9uIHRoZSBzbG93IHBhdGggdG9vLgotICAgICAgaWYgKFVOTElLRUxZKHJzaXplID49IHNpemVvZihidWYpKSkgewotICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgotICovCi1pbnQzMl90IFRDb21wYWN0UHJvdG9jb2w6OnppZ3phZ1RvSTMyKHVpbnQzMl90IG4pIHsKLSAgcmV0dXJuIChuID4+IDEpIF4gLShuICYgMSk7Ci19Ci0KLS8qKgotICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCi0gKi8KLWludDY0X3QgVENvbXBhY3RQcm90b2NvbDo6emlnemFnVG9JNjQodWludDY0X3QgbikgewotICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKTsKLX0KLQotVFR5cGUgVENvbXBhY3RQcm90b2NvbDo6Z2V0VFR5cGUoaW50OF90IHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgICByZXR1cm4gVF9TVE9QOwotICAgIGNhc2UgQ1RfQk9PTEVBTl9GQUxTRToKLSAgICBjYXNlIENUX0JPT0xFQU5fVFJVRToKLSAgICAgIHJldHVybiBUX0JPT0w7Ci0gICAgY2FzZSBDVF9CWVRFOgotICAgICAgcmV0dXJuIFRfQllURTsKLSAgICBjYXNlIENUX0kxNjoKLSAgICAgIHJldHVybiBUX0kxNjsKLSAgICBjYXNlIENUX0kzMjoKLSAgICAgIHJldHVybiBUX0kzMjsKLSAgICBjYXNlIENUX0k2NDoKLSAgICAgIHJldHVybiBUX0k2NDsKLSAgICBjYXNlIENUX0RPVUJMRToKLSAgICAgIHJldHVybiBUX0RPVUJMRTsKLSAgICBjYXNlIENUX0JJTkFSWToKLSAgICAgIHJldHVybiBUX1NUUklORzsKLSAgICBjYXNlIENUX0xJU1Q6Ci0gICAgICByZXR1cm4gVF9MSVNUOwotICAgIGNhc2UgQ1RfU0VUOgotICAgICAgcmV0dXJuIFRfU0VUOwotICAgIGNhc2UgQ1RfTUFQOgotICAgICAgcmV0dXJuIFRfTUFQOwotICAgIGNhc2UgQ1RfU1RSVUNUOgotICAgICAgcmV0dXJuIFRfU1RSVUNUOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJkb24ndCBrbm93IHdoYXQgdHlwZTogIiArIHR5cGUpOwotICB9Ci0gIHJldHVybiBUX1NUT1A7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5NDBhMi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVFByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0vKioKLSAqIEMrKyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tcGFjdCBQcm90b2NvbCBhcyBkZXNjcmliZWQgaW4gVEhSSUZULTExMAotICovCi1jbGFzcyBUQ29tcGFjdFByb3RvY29sIDogcHVibGljIFRQcm90b2NvbCB7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyBjb25zdCBpbnQ4X3QgIFBST1RPQ09MX0lEID0gMHg4MjsKLSAgc3RhdGljIGNvbnN0IGludDhfdCAgVkVSU0lPTl9OID0gMTsKLSAgc3RhdGljIGNvbnN0IGludDhfdCAgVkVSU0lPTl9NQVNLID0gMHgxZjsgLy8gMDAwMSAxMTExCi0gIHN0YXRpYyBjb25zdCBpbnQ4X3QgIFRZUEVfTUFTSyA9IDB4RTA7IC8vIDExMTAgMDAwMAotICBzdGF0aWMgY29uc3QgaW50MzJfdCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7Ci0KLSAgLyoqCi0gICAqIChXcml0aW5nKSBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZQotICAgKiBzbyBpdCBjYW4gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgotICAgKi8KLSAgc3RydWN0IHsKLSAgICBjb25zdCBjaGFyKiBuYW1lOwotICAgIFRUeXBlIGZpZWxkVHlwZTsKLSAgICBpbnQxNl90IGZpZWxkSWQ7Ci0gIH0gYm9vbGVhbkZpZWxkXzsKLQotICAvKioKLSAgICogKFJlYWRpbmcpIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZQotICAgKiB0aGUgYm9vbGVhbiB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZEJvb2wgY2FuIHVzZSBpdC4KLSAgICovCi0gIHN0cnVjdCB7Ci0gICAgYm9vbCBoYXNCb29sVmFsdWU7Ci0gICAgYm9vbCBib29sVmFsdWU7Ci0gIH0gYm9vbFZhbHVlXzsKLQotICAvKioKLSAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKLSAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KLSAgICovCi0KLSAgc3RkOjpzdGFjazxpbnQxNl90PiBsYXN0RmllbGRfOwotICBpbnQxNl90IGxhc3RGaWVsZElkXzsKLQotICBlbnVtIFR5cGVzIHsKLSAgICBDVF9TVE9QICAgICAgICAgICA9IDB4MDAsCi0gICAgQ1RfQk9PTEVBTl9UUlVFICAgPSAweDAxLAotICAgIENUX0JPT0xFQU5fRkFMU0UgID0gMHgwMiwKLSAgICBDVF9CWVRFICAgICAgICAgICA9IDB4MDMsCi0gICAgQ1RfSTE2ICAgICAgICAgICAgPSAweDA0LAotICAgIENUX0kzMiAgICAgICAgICAgID0gMHgwNSwKLSAgICBDVF9JNjQgICAgICAgICAgICA9IDB4MDYsCi0gICAgQ1RfRE9VQkxFICAgICAgICAgPSAweDA3LAotICAgIENUX0JJTkFSWSAgICAgICAgID0gMHgwOCwKLSAgICBDVF9MSVNUICAgICAgICAgICA9IDB4MDksCi0gICAgQ1RfU0VUICAgICAgICAgICAgPSAweDBBLAotICAgIENUX01BUCAgICAgICAgICAgID0gMHgwQiwKLSAgICBDVF9TVFJVQ1QgICAgICAgICA9IDB4MEMsCi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IGludDhfdCBUVHlwZVRvQ1R5cGVbMTZdOwotCi0gcHVibGljOgotICBUQ29tcGFjdFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSA6Ci0gICAgVFByb3RvY29sKHRyYW5zKSwKLSAgICBsYXN0RmllbGRJZF8oMCksCi0gICAgc3RyaW5nX2xpbWl0XygwKSwKLSAgICBzdHJpbmdfYnVmXyhOVUxMKSwKLSAgICBzdHJpbmdfYnVmX3NpemVfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCkgewotICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7Ci0gICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKLSAgfQotCi0gIFRDb21wYWN0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpbmdfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250YWluZXJfbGltaXQpIDoKLSAgICBUUHJvdG9jb2wodHJhbnMpLAotICAgIGxhc3RGaWVsZElkXygwKSwKLSAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCi0gICAgc3RyaW5nX2J1Zl8oTlVMTCksCi0gICAgc3RyaW5nX2J1Zl9zaXplXygwKSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkgewotICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7Ci0gICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKLSAgfQotCi0gIH5UQ29tcGFjdFByb3RvY29sKCkgewotICAgIGZyZWUoc3RyaW5nX2J1Zl8pOwotICB9Ci0KLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8qKgotICAqIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZWQKLSAgKiBvdXRwdXQgb3IgcHVycG9zZQotICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpIHsgcmV0dXJuIDA7IH0KLSAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKSB7IHJldHVybiAwOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGludDMyX3Qgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCB0eXBlT3ZlcnJpZGUpOwotICB1aW50MzJfdCB3cml0ZUNvbGxlY3Rpb25CZWdpbihpbnQ4X3QgZWxlbVR5cGUsIGludDMyX3Qgc2l6ZSk7Ci0gIHVpbnQzMl90IHdyaXRlVmFyaW50MzIodWludDMyX3Qgbik7Ci0gIHVpbnQzMl90IHdyaXRlVmFyaW50NjQodWludDY0X3Qgbik7Ci0gIHVpbnQ2NF90IGk2NFRvWmlnemFnKGNvbnN0IGludDY0X3QgbCk7Ci0gIHVpbnQzMl90IGkzMlRvWmlnemFnKGNvbnN0IGludDMyX3Qgbik7Ci0gIGlubGluZSBpbnQ4X3QgZ2V0Q29tcGFjdFR5cGUoaW50OF90IHR0eXBlKTsKLQotIHB1YmxpYzoKLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOwotCi0gIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7Ci0KLSAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpOwotCi0gIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKTsKLQotICB1aW50MzJfdCByZWFkSTY0KGludDY0X3QmIGk2NCk7Ci0KLSAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1Yik7Ci0KLSAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8qCi0gICAqVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQotICAgKiBlbmNvZGluZy4KLSAgICovCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCByZWFkRmllbGRFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7IHJldHVybiAwOyB9Ci0gIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgeyByZXR1cm4gMDsgfQotICB1aW50MzJfdCByZWFkU2V0RW5kKCkgeyByZXR1cm4gMDsgfQotCi0gcHJvdGVjdGVkOgotICB1aW50MzJfdCByZWFkVmFyaW50MzIoaW50MzJfdCYgaTMyKTsKLSAgdWludDMyX3QgcmVhZFZhcmludDY0KGludDY0X3QmIGk2NCk7Ci0gIGludDMyX3QgemlnemFnVG9JMzIodWludDMyX3Qgbik7Ci0gIGludDY0X3QgemlnemFnVG9JNjQodWludDY0X3Qgbik7Ci0gIFRUeXBlIGdldFRUeXBlKGludDhfdCB0eXBlKTsKLQotICAvLyBCdWZmZXIgZm9yIHJlYWRpbmcgc3RyaW5ncywgc2F2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm90b2NvbCB0bwotICAvLyBhdm9pZCBtZW1vcnkgY2h1cm4gYWxsb2NhdGluZyBtZW1vcnkgb24gZXZlcnkgc3RyaW5nIHJlYWQKLSAgaW50MzJfdCBzdHJpbmdfbGltaXRfOwotICB1aW50OF90KiBzdHJpbmdfYnVmXzsKLSAgaW50MzJfdCBzdHJpbmdfYnVmX3NpemVfOwotICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87Ci19OwotCi0vKioKLSAqIENvbnN0cnVjdHMgY29tcGFjdCBwcm90b2NvbCBoYW5kbGVycwotICovCi1jbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkgOgotICAgIHN0cmluZ19saW1pdF8oMCksCi0gICAgY29udGFpbmVyX2xpbWl0XygwKSB7fQotCi0gIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgOgotICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkge30KLQotICB2aXJ0dWFsIH5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpIHt9Ci0KLSAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsKLSAgICBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OwotICB9Ci0KLSAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsKLSAgICBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zLCBzdHJpbmdfbGltaXRfLCBjb250YWluZXJfbGltaXRfKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKLSAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGFhMzZiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJURGVidWdQcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotCi1zdGF0aWMgc3RyaW5nIGJ5dGVfdG9faGV4KGNvbnN0IHVpbnQ4X3QgYnl0ZSkgewotICBjaGFyIGJ1ZlszXTsKLSAgaW50IHJldCA9IHN0ZDo6c3ByaW50ZihidWYsICIlMDJ4IiwgKGludClieXRlKTsKLSAgYXNzZXJ0KHJldCA9PSAyKTsKLSAgYXNzZXJ0KGJ1ZlsyXSA9PSAnXDAnKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7Ci0KLXN0cmluZyBURGVidWdQcm90b2NvbDo6ZmllbGRUeXBlTmFtZShUVHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVF9TVE9QICAgOiByZXR1cm4gInN0b3AiICAgOwotICAgIGNhc2UgVF9WT0lEICAgOiByZXR1cm4gInZvaWQiICAgOwotICAgIGNhc2UgVF9CT09MICAgOiByZXR1cm4gImJvb2wiICAgOwotICAgIGNhc2UgVF9CWVRFICAgOiByZXR1cm4gImJ5dGUiICAgOwotICAgIGNhc2UgVF9JMTYgICAgOiByZXR1cm4gImkxNiIgICAgOwotICAgIGNhc2UgVF9JMzIgICAgOiByZXR1cm4gImkzMiIgICAgOwotICAgIGNhc2UgVF9VNjQgICAgOiByZXR1cm4gInU2NCIgICAgOwotICAgIGNhc2UgVF9JNjQgICAgOiByZXR1cm4gImk2NCIgICAgOwotICAgIGNhc2UgVF9ET1VCTEUgOiByZXR1cm4gImRvdWJsZSIgOwotICAgIGNhc2UgVF9TVFJJTkcgOiByZXR1cm4gInN0cmluZyIgOwotICAgIGNhc2UgVF9TVFJVQ1QgOiByZXR1cm4gInN0cnVjdCIgOwotICAgIGNhc2UgVF9NQVAgICAgOiByZXR1cm4gIm1hcCIgICAgOwotICAgIGNhc2UgVF9TRVQgICAgOiByZXR1cm4gInNldCIgICAgOwotICAgIGNhc2UgVF9MSVNUICAgOiByZXR1cm4gImxpc3QiICAgOwotICAgIGNhc2UgVF9VVEY4ICAgOiByZXR1cm4gInV0ZjgiICAgOwotICAgIGNhc2UgVF9VVEYxNiAgOiByZXR1cm4gInV0ZjE2IiAgOwotICAgIGRlZmF1bHQ6IHJldHVybiAidW5rbm93biI7Ci0gIH0KLX0KLQotdm9pZCBURGVidWdQcm90b2NvbDo6aW5kZW50VXAoKSB7Ci0gIGluZGVudF9zdHJfICs9IHN0cmluZyhpbmRlbnRfaW5jLCAnICcpOwotfQotCi12b2lkIFREZWJ1Z1Byb3RvY29sOjppbmRlbnREb3duKCkgewotICBpZiAoaW5kZW50X3N0cl8ubGVuZ3RoKCkgPCAoc3RyaW5nOjpzaXplX3R5cGUpaW5kZW50X2luYykgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gIH0KLSAgaW5kZW50X3N0cl8uZXJhc2UoaW5kZW50X3N0cl8ubGVuZ3RoKCkgLSBpbmRlbnRfaW5jKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlUGxhaW4oY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc3RyLmxlbmd0aCgpKTsKLSAgcmV0dXJuIHN0ci5sZW5ndGgoKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSW5kZW50ZWQoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgdHJhbnNfLT53cml0ZSgodWludDhfdCopaW5kZW50X3N0cl8uZGF0YSgpLCBpbmRlbnRfc3RyXy5sZW5ndGgoKSk7Ci0gIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHN0ci5sZW5ndGgoKSk7Ci0gIHJldHVybiBpbmRlbnRfc3RyXy5sZW5ndGgoKSArIHN0ci5sZW5ndGgoKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OnN0YXJ0SXRlbSgpIHsKLSAgdWludDMyX3Qgc2l6ZTsKLQotICBzd2l0Y2ggKHdyaXRlX3N0YXRlXy5iYWNrKCkpIHsKLSAgICBjYXNlIFVOSU5JVDoKLSAgICAgIC8vIFhYWCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZS4KLSAgICAgIC8vdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgIC8vcmV0dXJuIHdyaXRlSW5kZW50ZWQoc3RyKTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgU1RSVUNUOgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBTRVQ6Ci0gICAgICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiIik7Ci0gICAgY2FzZSBNQVBfS0VZOgotICAgICAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoIiIpOwotICAgIGNhc2UgTUFQX1ZBTFVFOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIiAtPiAiKTsKLSAgICBjYXNlIExJU1Q6Ci0gICAgICBzaXplID0gd3JpdGVJbmRlbnRlZCgKLSAgICAgICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4obGlzdF9pZHhfLmJhY2soKSkgKyAiXSA9ICIpOwotICAgICAgbGlzdF9pZHhfLmJhY2soKSsrOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkludmFsaWQgZW51bSB2YWx1ZS4iKTsKLSAgfQotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6ZW5kSXRlbSgpIHsKLSAgLy91aW50MzJfdCBzaXplOwotCi0gIHN3aXRjaCAod3JpdGVfc3RhdGVfLmJhY2soKSkgewotICAgIGNhc2UgVU5JTklUOgotICAgICAgLy8gWFhYIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBoZXJlLgotICAgICAgLy90aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgLy9yZXR1cm4gd3JpdGVJbmRlbnRlZChzdHIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBTVFJVQ1Q6Ci0gICAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7Ci0gICAgY2FzZSBTRVQ6Ci0gICAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7Ci0gICAgY2FzZSBNQVBfS0VZOgotICAgICAgd3JpdGVfc3RhdGVfLmJhY2soKSA9IE1BUF9WQUxVRTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgTUFQX1ZBTFVFOgotICAgICAgd3JpdGVfc3RhdGVfLmJhY2soKSA9IE1BUF9LRVk7Ci0gICAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7Ci0gICAgY2FzZSBMSVNUOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7Ci0gIH0KLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSXRlbShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBzaXplICs9IHN0YXJ0SXRlbSgpOwotICBzaXplICs9IHdyaXRlUGxhaW4oc3RyKTsKLSAgc2l6ZSArPSBlbmRJdGVtKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgc3RyaW5nIG10eXBlOwotICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7Ci0gICAgY2FzZSBUX0NBTEwgICAgICA6IG10eXBlID0gImNhbGwiICA7IGJyZWFrOwotICAgIGNhc2UgVF9SRVBMWSAgICAgOiBtdHlwZSA9ICJyZXBseSIgOyBicmVhazsKLSAgICBjYXNlIFRfRVhDRVBUSU9OIDogbXR5cGUgPSAiZXhuIiAgIDsgYnJlYWs7Ci0gIH0KLQotICB1aW50MzJfdCBzaXplID0gd3JpdGVJbmRlbnRlZCgiKCIgKyBtdHlwZSArICIpICIgKyBuYW1lICsgIigiKTsKLSAgaW5kZW50VXAoKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gIGluZGVudERvd24oKTsKLSAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoIilcbiIpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBzaXplICs9IHN0YXJ0SXRlbSgpOwotICBzaXplICs9IHdyaXRlUGxhaW4oc3RyaW5nKG5hbWUpICsgIiB7XG4iKTsKLSAgaW5kZW50VXAoKTsKLSAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhTVFJVQ1QpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgewotICBpbmRlbnREb3duKCk7Ci0gIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOwotICB1aW50MzJfdCBzaXplID0gMDsKLSAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7Ci0gIHNpemUgKz0gZW5kSXRlbSgpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewotICAvLyBzcHJpbnRmKGlkX3N0ciwgIiUwMmQiLCBmaWVsZElkKTsKLSAgc3RyaW5nIGlkX3N0ciA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihmaWVsZElkKTsKLSAgaWYgKGlkX3N0ci5sZW5ndGgoKSA9PSAxKSBpZF9zdHIgPSAnMCcgKyBpZF9zdHI7Ci0KLSAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoCi0gICAgICBpZF9zdHIgKyAiOiAiICsKLSAgICAgIG5hbWUgKyAiICgiICsKLSAgICAgIGZpZWxkVHlwZU5hbWUoZmllbGRUeXBlKSArICIpID0gIik7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUZpZWxkRW5kKCkgewotICBhc3NlcnQod3JpdGVfc3RhdGVfLmJhY2soKSA9PSBTVFJVQ1QpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgewotICByZXR1cm4gMDsKLSAgICAvL3dyaXRlSW5kZW50ZWQoIioqKlNUT1AqKipcbiIpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgLy8gVE9ETyhkcmVpc3MpOiBPcHRpbWl6ZSBzaG9ydCBtYXBzPwotICB1aW50MzJfdCBic2l6ZSA9IDA7Ci0gIGJzaXplICs9IHN0YXJ0SXRlbSgpOwotICBic2l6ZSArPSB3cml0ZVBsYWluKAotICAgICAgIm1hcDwiICsgZmllbGRUeXBlTmFtZShrZXlUeXBlKSArICIsIiArIGZpZWxkVHlwZU5hbWUodmFsVHlwZSkgKyAiPiIKLSAgICAgICJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzaXplKSArICJdIHtcbiIpOwotICBpbmRlbnRVcCgpOwotICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKE1BUF9LRVkpOwotICByZXR1cm4gYnNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKLSAgaW5kZW50RG93bigpOwotICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKLSAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOwotICBzaXplICs9IGVuZEl0ZW0oKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgYXJyYXlzLgotICB1aW50MzJfdCBic2l6ZSA9IDA7Ci0gIGJzaXplICs9IHN0YXJ0SXRlbSgpOwotICBic2l6ZSArPSB3cml0ZVBsYWluKAotICAgICAgImxpc3Q8IiArIGZpZWxkVHlwZU5hbWUoZWxlbVR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKLSAgaW5kZW50VXAoKTsKLSAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhMSVNUKTsKLSAgbGlzdF9pZHhfLnB1c2hfYmFjaygwKTsKLSAgcmV0dXJuIGJzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVMaXN0RW5kKCkgewotICBpbmRlbnREb3duKCk7Ci0gIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOwotICBsaXN0X2lkeF8ucG9wX2JhY2soKTsKLSAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOwotICBzaXplICs9IGVuZEl0ZW0oKTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICAvLyBUT0RPKGRyZWlzcyk6IE9wdGltaXplIHNob3J0IHNldHMuCi0gIHVpbnQzMl90IGJzaXplID0gMDsKLSAgYnNpemUgKz0gc3RhcnRJdGVtKCk7Ci0gIGJzaXplICs9IHdyaXRlUGxhaW4oCi0gICAgICAic2V0PCIgKyBmaWVsZFR5cGVOYW1lKGVsZW1UeXBlKSArICI+IgotICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHNpemUpICsgIl0ge1xuIik7Ci0gIGluZGVudFVwKCk7Ci0gIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soU0VUKTsKLSAgcmV0dXJuIGJzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTZXRFbmQoKSB7Ci0gIGluZGVudERvd24oKTsKLSAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKLSAgc2l6ZSArPSBlbmRJdGVtKCk7Ci0gIHJldHVybiBzaXplOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbSh2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oIjB4IiArIGJ5dGVfdG9faGV4KGJ5dGUpKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGkxNikpOwotfQotCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTMyKSk7Ci19Ci0KLXVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpNjQpKTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oZHViKSk7Ci19Ci0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIC8vIFhYWCBSYXcvVVRGLTg/Ci0KLSAgc3RyaW5nIHRvX3Nob3cgPSBzdHI7Ci0gIGlmICh0b19zaG93Lmxlbmd0aCgpID4gKHN0cmluZzo6c2l6ZV90eXBlKXN0cmluZ19saW1pdF8pIHsKLSAgICB0b19zaG93ID0gc3RyLnN1YnN0cigwLCBzdHJpbmdfcHJlZml4X3NpemVfKTsKLSAgICB0b19zaG93ICs9ICJbLi4uXSgiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHN0ci5sZW5ndGgoKSkgKyAiKSI7Ci0gIH0KLQotICBzdHJpbmcgb3V0cHV0ID0gIlwiIjsKLQotICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0b19zaG93LmJlZ2luKCk7IGl0ICE9IHRvX3Nob3cuZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoKml0ID09ICdcXCcpIHsKLSAgICAgIG91dHB1dCArPSAiXFxcXCI7Ci0gICAgfSBlbHNlIGlmICgqaXQgPT0gJyInKSB7Ci0gICAgICBvdXRwdXQgKz0gIlxcXCIiOwotICAgIH0gZWxzZSBpZiAoc3RkOjppc3ByaW50KCppdCkpIHsKLSAgICAgIG91dHB1dCArPSAqaXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN3aXRjaCAoKml0KSB7Ci0gICAgICAgIGNhc2UgJ1xhJzogb3V0cHV0ICs9ICJcXGEiOyBicmVhazsKLSAgICAgICAgY2FzZSAnXGInOiBvdXRwdXQgKz0gIlxcYiI7IGJyZWFrOwotICAgICAgICBjYXNlICdcZic6IG91dHB1dCArPSAiXFxmIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzogb3V0cHV0ICs9ICJcXG4iOyBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiBvdXRwdXQgKz0gIlxcciI7IGJyZWFrOwotICAgICAgICBjYXNlICdcdCc6IG91dHB1dCArPSAiXFx0IjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1x2Jzogb3V0cHV0ICs9ICJcXHYiOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBvdXRwdXQgKz0gIlxceCI7Ci0gICAgICAgICAgb3V0cHV0ICs9IGJ5dGVfdG9faGV4KCppdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgb3V0cHV0ICs9ICdcIic7Ci0gIHJldHVybiB3cml0ZUl0ZW0ob3V0cHV0KTsKLX0KLQotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlQmluYXJ5KGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIC8vIFhYWCBIZXg/Ci0gIHJldHVybiBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoc3RyKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjllMGMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVCVUdQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfIDEKLQotI2luY2x1ZGUgIlRQcm90b2NvbC5oIgotI2luY2x1ZGUgIlRPbmVXYXlQcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoKLQotISEhIEVYUEVSSU1FTlRBTCBDT0RFICEhIQotCi1UaGlzIHByb3RvY29sIGlzIHZlcnkgbXVjaCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCi1JdCBkb2Vzbid0IGhhbmRsZSBtYW55IGNhc2VzIHByb3Blcmx5LgotSXQgdGhyb3dzIGV4Y2VwdGlvbnMgaW4gbWFueSBjYXNlcy4KLUl0IHByb2JhYmx5IHNlZ2ZhdWx0cyBpbiBtYW55IGNhc2VzLgotQnVnIHJlcG9ydHMgYW5kIGZlYXR1cmUgcmVxdWVzdHMgYXJlIHdlbGNvbWUuCi1Db21wbGFpbnRzIGFyZSBub3QuIDpSCi0KLSovCi0KLQotLyoqCi0gKiBQcm90b2NvbCB0aGF0IHByaW50cyB0aGUgcGF5bG9hZCBpbiBhIG5pY2UgaHVtYW4tcmVhZGFibGUgZm9ybWF0LgotICogUmVhZGluZyBmcm9tIHRoaXMgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZC4KLSAqCi0gKi8KLWNsYXNzIFREZWJ1Z1Byb3RvY29sIDogcHVibGljIFRXcml0ZU9ubHlQcm90b2NvbCB7Ci0gcHJpdmF0ZToKLSAgZW51bSB3cml0ZV9zdGF0ZV90Ci0gIHsgVU5JTklUCi0gICwgU1RSVUNUCi0gICwgTElTVAotICAsIFNFVAotICAsIE1BUF9LRVkKLSAgLCBNQVBfVkFMVUUKLSAgfTsKLQotIHB1YmxpYzoKLSAgVERlYnVnUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpCi0gICAgOiBUV3JpdGVPbmx5UHJvdG9jb2wodHJhbnMsICJURGVidWdQcm90b2NvbCIpCi0gICAgLCBzdHJpbmdfbGltaXRfKERFRkFVTFRfU1RSSU5HX0xJTUlUKQotICAgICwgc3RyaW5nX3ByZWZpeF9zaXplXyhERUZBVUxUX1NUUklOR19QUkVGSVhfU0laRSkKLSAgewotICAgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soVU5JTklUKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfU1RSSU5HX0xJTUlUID0gMjU2OwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1NUUklOR19QUkVGSVhfU0laRSA9IDE2OwotCi0gIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7Ci0gICAgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsKLSAgfQotCi0gIHZvaWQgc2V0U3RyaW5nUHJlZml4U2l6ZShpbnQzMl90IHN0cmluZ19wcmVmaXhfc2l6ZSkgewotICAgIHN0cmluZ19wcmVmaXhfc2l6ZV8gPSBzdHJpbmdfcHJlZml4X3NpemU7Ci0gIH0KLQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7Ci0KLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKLQotICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOwotCi0gIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKLQotICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotCi0gcHJpdmF0ZToKLSAgdm9pZCBpbmRlbnRVcCgpOwotICB2b2lkIGluZGVudERvd24oKTsKLSAgdWludDMyX3Qgd3JpdGVQbGFpbihjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLSAgdWludDMyX3Qgd3JpdGVJbmRlbnRlZChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLSAgdWludDMyX3Qgc3RhcnRJdGVtKCk7Ci0gIHVpbnQzMl90IGVuZEl0ZW0oKTsKLSAgdWludDMyX3Qgd3JpdGVJdGVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBmaWVsZFR5cGVOYW1lKFRUeXBlIHR5cGUpOwotCi0gIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKLSAgaW50MzJfdCBzdHJpbmdfcHJlZml4X3NpemVfOwotCi0gIHN0ZDo6c3RyaW5nIGluZGVudF9zdHJfOwotICBzdGF0aWMgY29uc3QgaW50IGluZGVudF9pbmMgPSAyOwotCi0gIHN0ZDo6dmVjdG9yPHdyaXRlX3N0YXRlX3Q+IHdyaXRlX3N0YXRlXzsKLSAgc3RkOjp2ZWN0b3I8aW50PiBsaXN0X2lkeF87Ci19OwotCi0vKioKLSAqIENvbnN0cnVjdHMgZGVidWcgcHJvdG9jb2wgaGFuZGxlcnMKLSAqLwotY2xhc3MgVERlYnVnUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KLSAgdmlydHVhbCB+VERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFREZWJ1Z1Byb3RvY29sKHRyYW5zKSk7Ci0gIH0KLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0KLS8vIFRPRE8oZHJlaXNzKTogTW92ZSAocGFydCBvZikgVGhyaWZ0RGVidWdTdHJpbmcgaW50byBhIC5jcHAgZmlsZSBhbmQgcmVtb3ZlIHRoaXMuCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVGhyaWZ0U3RydWN0Pgotc3RkOjpzdHJpbmcgVGhyaWZ0RGVidWdTdHJpbmcoY29uc3QgVGhyaWZ0U3RydWN0JiB0cykgewotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLSAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7Ci0gIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKLQotICB0cy53cml0ZSgmcHJvdG9jb2wpOwotCi0gIHVpbnQ4X3QqIGJ1ZjsKLSAgdWludDMyX3Qgc2l6ZTsKLSAgYnVmZmVyLT5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOwotICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHVuc2lnbmVkIGludClzaXplKTsKLX0KLQotLy8gVE9ETyhkcmVpc3MpOiBUaGlzIGlzIGJhZGx5IGJyb2tlbi4gIERvbid0IHVzZSBpdCB1bmxlc3MgeW91IGFyZSBtZS4KLSNpZiAwCi10ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3Q+Ci1zdGQ6OnN0cmluZyBEZWJ1Z1N0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxPYmplY3Q+JiB2ZWMpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0gIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOwotICBURGVidWdQcm90b2NvbCBwcm90b2NvbCh0cmFucyk7Ci0KLSAgLy8gSSBhbSBncm9zcyEKLSAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbigiU29tZVJhbmRvbVZlY3RvciIpOwotCi0gIC8vIFRPRE86IEZpeCB0aGlzIHdpdGggYSB0cmFpdC4KLSAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4oKFRUeXBlKTk5LCB2ZWMuc2l6ZSgpKTsKLSAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8T2JqZWN0Pjo6Y29uc3RfaXRlcmF0b3IgaXQ7Ci0gIGZvciAoaXQgPSB2ZWMuYmVnaW4oKTsgaXQgIT0gdmVjLmVuZCgpOyArK2l0KSB7Ci0gICAgaXQtPndyaXRlKCZwcm90b2NvbCk7Ci0gIH0KLSAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7Ci0KLSAgdWludDhfdCogYnVmOwotICB1aW50MzJfdCBzaXplOwotICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOwotfQotI2VuZGlmIC8vIDAKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKLQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWEzZDFmLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1REZW5zZVByb3RvY29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0KLUlNUExFTUVOVEFUSU9OIERFVEFJTFMKLQotVERlbnNlUHJvdG9jb2wgd2FzIGRlc2lnbmVkIHRvIGhhdmUgYSBzbWFsbGVyIHNlcmlhbGl6ZWQgZm9ybSB0aGFuCi1UQmluYXJ5UHJvdG9jb2wuICBUaGlzIGlzIGFjY29tcGxpc2hlZCB1c2luZyB0d28gdGVjaG5pcXVlcy4gIFRoZSBmaXJzdCBpcwotdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgZW5jb2RpbmcuICBXZSB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlIHRoYXQgdGhlIFN0YW5kYXJkCi1NSURJIEZpbGUgZm9ybWF0IHVzZXMgZm9yICJ2YXJpYWJsZS1sZW5ndGggcXVhbnRpdGllcyIKLShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhYmxlLWxlbmd0aF9xdWFudGl0eSkuCi1BbGwgaW50ZWdlcnMgKGluY2x1ZGluZyBpMTYsIGJ1dCBub3QgYnl0ZSkgYXJlIGZpcnN0IGNhc3QgdG8gdWludDY0X3QsCi10aGVuIHdyaXR0ZW4gb3V0IGFzIHZhcmlhYmxlLWxlbmd0aCBxdWFudGl0aWVzLiAgVGhpcyBoYXMgdGhlIHVuZm9ydHVuYXRlIHNpZGUKLWVmZmVjdCB0aGF0IGFsbCBuZWdhdGl2ZSBudW1iZXJzIHJlcXVpcmUgMTAgYnl0ZXMsIGJ1dCBuZWdhdGl2ZSBudW1iZXJzIHRlbmQKLXRvIGJlIGZhciBsZXNzIGNvbW1vbiB0aGFuIHBvc2l0aXZlIG9uZXMuCi0KLVRoZSBzZWNvbmQgdGVjaG5pcXVlIGVsaW1pbmF0aW5nIHRoZSBmaWVsZCBpZHMgdXNlZCBieSBUQmluYXJ5UHJvdG9jb2wuICBUaGlzCi1kZWNpc2lvbiByZXF1aXJlZCBzdXBwb3J0IGZyb20gdGhlIFRocmlmdCBjb21waWxlciBhbmQgYWxzbyBzYWNyaWZpY2VzIHNvbWUgb2YKLXRoZSBiYWNrd2FyZCBhbmQgZm9yd2FyZCBjb21wYXRpYmlsaXR5IG9mIFRCaW5hcnlQcm90b2NvbC4KLQotV2UgY29uc2lkZXJlZCBpbXBsZW1lbnRpbmcgdGhpcyB0ZWNobmlxdWUgYnkgZ2VuZXJhdGluZyBzZXBhcmF0ZSByZWFkZXJzIGFuZAotd3JpdGVycyBmb3IgdGhlIGRlbnNlIHByb3RvY29sICh0aGlzIGlzIGhvdyBQaWxsYXIsIFRocmlmdCdzIHByZWRlY2Vzc29yLAotd29ya2VkKSwgYnV0IHRoaXMgaWRlYSBoYWQgYSBmZXcgcHJvYmxlbXM6Ci0tIE91ciBhYnN0cmFjdGlvbnMgZ28gb3V0IHRoZSB3aW5kb3cuCi0tIFdlIHdvdWxkIGhhdmUgdG8gbWFpbnRhaW4gYSBzZWNvbmQgY29kZSBnZW5lcmF0b3IuCi0tIFByZXNlcnZpbmcgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucyBvZiB0aGUgc3RydWN0dXJlcyB3b3VsZCBiZSBhCi0gIG5pZ2h0bWFyZS4KLQotVGhlcmVmb3JlLCB3ZSBjaG9zZSBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gdGhhdCBzdG9yZWQgdGhlIGRlc2NyaXB0aW9uIG9mCi10aGUgZGF0YSBuZWl0aGVyIGluIHRoZSBkYXRhIGl0c2VsZiAobGlrZSBUQmluYXJ5UHJvdG9jb2wpIG5vciBpbiB0aGUKLXNlcmlhbGl6YXRpb24gY29kZSAobGlrZSBQaWxsYXIpLCBidXQgaW5zdGVhZCBpbiBhIHNlcGFyYXRlIGRhdGEgc3RydWN0dXJlLAotY2FsbGVkIGEgVHlwZVNwZWMuICBUeXBlU3BlY3MgYXJlIGdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCi0oc3BlY2lmaWNhbGx5IGluIHRoZSB0X2NwcF9nZW5lcmF0b3IpLCBhbmQgdGhlaXIgc3RydWN0dXJlIHNob3VsZCBiZQotZG9jdW1lbnRlZCB0aGVyZSAoVE9ETyhkcmVpc3MpOiBzL3Nob3VsZCBiZS9pcy8pLgotCi1XZSBtYWludGFpbiBhIHN0YWNrIG9mIFR5cGVTcGVjcyB3aXRoaW4gdGhlIHByb3RvY29sIHNvIGl0IGtub3dzIHdoZXJlIHRoZQotZ2VuZXJhdGVkIGNvZGUgaXMgaW4gdGhlIHJlYWRpbmcvd3JpdGluZyBwcm9jZXNzLiAgRm9yIGV4YW1wbGUsIGlmIHdlIGFyZQotd3JpdGluZyBhbiBpMzIgY29udGFpbmVkIGluIGEgc3RydWN0IGJhciwgY29udGFpbmVkIGluIGEgc3RydWN0IGZvbywgdGhlbiB0aGUKLXN0YWNrIHdvdWxkIGxvb2sgbGlrZTogVE9QICwgaTMyICwgc3RydWN0IGJhciAsIHN0cnVjdCBmb28gLCBCT1RUT00uCi1UaGUgZm9sbG93aW5nIGludmFyaWFudDogd2hlbmV2ZXIgd2UgYXJlIGFib3V0IHRvIHJlYWQvd3JpdGUgYW4gb2JqZWN0Ci0oc3RydWN0QmVnaW4sIGNvbnRhaW5lckJlZ2luLCBvciBhIHNjYWxhciksIHRoZSBUeXBlU3BlYyBvbiB0aGUgdG9wIG9mIHRoZQotc3RhY2sgbXVzdCBtYXRjaCB0aGUgdHlwZSBiZWluZyByZWFkL3dyaXR0ZW4uICBUaGUgbWFpbiByZWFzb25zIHRoYXQgdGhpcwotaW52YXJpYW50IG11c3QgYmUgbWFpbnRhaW5lZCBpcyB0aGF0IGlmIHdlIGV2ZXIgc3RhcnQgcmVhZGluZyBhIHN0cnVjdHVyZSwgd2UKLW11c3QgaGF2ZSBpdHMgZXhhY3QgVHlwZVNwZWMgaW4gb3JkZXIgdG8gcGFzcyB0aGUgcmlnaHQgdGFncyB0byB0aGUKLWRlc2VyaWFsaXplci4KLQotV2UgdXNlIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ2llcyBmb3IgbWFpbnRhaW5pbmcgdGhpcyBpbnZhcmlhbnQ6Ci0KLS0gRm9yIHN0cnVjdHVyZXMsIHdlIGhhdmUgYSBzZXBhcmF0ZSBzdGFjayBvZiBpbmRleGVzLCBvbmUgZm9yIGVhY2ggc3RydWN0dXJlCi0gIG9uIHRoZSBUeXBlU3BlYyBzdGFjay4gIFRoZXNlIGFyZSBpbmRleGVzIGludG8gdGhlIGxpc3Qgb2YgZmllbGRzIGluIHRoZQotICBzdHJ1Y3R1cmUncyBUeXBlU3BlYy4gIFdoZW4gd2Uge3JlYWQsd3JpdGV9RmllbGRCZWdpbiwgd2UgcHVzaCBvbiB0aGUKLSAgVHlwZVNwZWMgZm9yIHRoZSBmaWVsZC4KLS0gV2hlbiB3ZSBiZWdpbiB3cml0aW5nIGEgbGlzdCBvciBzZXQsIHdlIHB1c2ggb24gdGhlIFR5cGVTcGVjIGZvciB0aGUKLSAgZWxlbWVudCB0eXBlLgotLSBGb3IgbWFwcywgd2UgaGF2ZSBhIHNlcGFyYXRlIHN0YWNrIG9mIGJvb2xlYW5zLCBvbmUgZm9yIGVhY2ggbWFwIG9uIHRoZQotICBUeXBlU3BlYyBzdGFjay4gIFRoZSBib29sZWFuIGlzIHRydWUgaWYgd2UgYXJlIHdyaXRpbmcgdGhlIGtleSBmb3IgdGhhdAotICBtYXAsIGFuZCBmYWxzZSBpZiB3ZSBhcmUgd3JpdGluZyB0aGUgdmFsdWUuICBNYXBzIGFyZSB0aGUgdHJpY2tpZXN0IGNhc2UKLSAgYmVjYXVzZSB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgY2FsbCBhbnkgcHJvdG9jb2wgbWV0aG9kIGJldHdlZW4KLSAgdGhlIGtleSBhbmQgdGhlIHZhbHVlLiAgQXMgYSByZXN1bHQsIHdlIHBvdGVudGlhbGx5IGhhdmUgdG8gc3dpdGNoCi0gIGJldHdlZW4gbWFwIGtleSBzdGF0ZSBhbmQgbWFwIHZhbHVlIHN0YXRlIGFmdGVyIHJlYWRpbmcvd3JpdGluZyBhbnkgb2JqZWN0LgotLSBUaGlzIGpvYiBpcyBoYW5kbGVkIGJ5IHRoZSBzdGF0ZVRyYW5zaXRpb24gbWV0aG9kLiAgSXQgaXMgY2FsbGVkIGFmdGVyCi0gIHJlYWRpbmcvd3JpdGluZyBldmVyeSBvYmplY3QuICBJdCBwb3BzIHRoZSBjdXJyZW50IFR5cGVTcGVjIG9mZiB0aGUgc3RhY2ssCi0gIHRoZW4gb3B0aW9uYWxseSBwdXNoZXMgYSBuZXcgb25lIG9uLCBkZXBlbmRpbmcgb24gd2hhdCB0aGUgbmV4dCBUeXBlU3BlYyBpcy4KLSAgSWYgaXQgaXMgYSBzdHJ1Y3QsIHRoZSBqb2IgaXMgbGVmdCB0byB0aGUgbmV4dCB3cml0ZUZpZWxkQmVnaW4uICBJZiBpdCBpcyBhCi0gIHNldCBvciBsaXN0LCB0aGUganVzdC1wb3BwZWQgdHlwZXNwZWMgaXMgcHVzaGVkIGJhY2sgb24uICBJZiBpdCBpcyBhIG1hcCwKLSAgdGhlIHRvcCBvZiB0aGUga2V5L3ZhbHVlIHN0YWNrIGlzIHRvZ2dsZWQsIGFuZCB0aGUgYXBwcm9wcmlhdGUgVHlwZVNwZWMKLSAgaXMgcHVzaGVkLgotCi1PcHRpb25hbCBmaWVsZHMgYXJlIGEgbGl0dGxlIHRyaWNreSBhbHNvLiAgV2Ugd3JpdGUgYSB6ZXJvIGJ5dGUgaWYgdGhleSBhcmUKLWFic2VudCBhbmQgcHJlZml4IHRoZW0gd2l0aCBhbiAweDAxIGJ5dGUgaWYgdGhleSBhcmUgcHJlc2VudAotKi8KLQotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAiVERlbnNlUHJvdG9jb2wuaCIKLSNpbmNsdWRlICJUUmVmbGVjdGlvbkxvY2FsLmgiCi0KLS8vIExlYXZpbmcgdGhpcyBvbiBmb3Igbm93LiAgRGlzYWJsaW5nIGl0IHdpbGwgdHVybiBvZmYgYXNzZXJ0cywgd2hpY2ggc2hvdWxkCi0vLyBnaXZlIGEgcGVyZm9ybWFuY2UgYm9vc3QuICBXaGVuIHdlIGhhdmUgKnJlYWxseSogdGhvcm91Z2ggdGVzdCBjYXNlcywKLS8vIHdlIHNob3VsZCBkcm9wIHRoaXMuCi0jZGVmaW5lIERFQlVHX1RERU5TRVBST1RPQ09MCi0KLS8vIE5PVEU6IEFzc2VydGlvbnMgc2hvdWxkICpvbmx5KiBiZSB1c2VkIHRvIGRldGVjdCBidWdzIGluIGNvZGUsCi0vLyAgICAgICBlaXRoZXIgaW4gVERlbnNlUHJvdG9jb2wgaXRzZWxmLCBvciBpbiBjb2RlIHVzaW5nIGl0LgotLy8gICAgICAgKEZvciBleGFtcGxlLCB1c2luZyB0aGUgd3JvbmcgVHlwZVNwZWMuKQotLy8gICAgICAgSW52YWxpZCBkYXRhIHNob3VsZCBORVZFUiBjYXVzZSBhbiBhc3NlcnRpb24gZmFpbHVyZSwKLS8vICAgICAgIG5vIG1hdHRlciBob3cgZ3Jvc3NseSBjb3JydXB0ZWQsIG5vciBob3cgaW5nZW5pb3VzbHkgY3JhZnRlZC4KLSNpZmRlZiBERUJVR19UREVOU0VQUk9UT0NPTAotI3VuZGVmIE5ERUJVRwotI2Vsc2UKLSNkZWZpbmUgTkRFQlVHCi0jZW5kaWYKLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIFVOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQotI2Vsc2UKLSNkZWZpbmUgVU5MSUtFTFkodmFsKSAodmFsKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotY29uc3QgaW50IFREZW5zZVByb3RvY29sOjpGUF9QUkVGSVhfTEVOID0KLSAgYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpGUF9QUkVGSVhfTEVOOwotCi0vLyBUb3AgVHlwZVNwZWMuICBUeXBlU3BlYyBvZiB0aGUgc3RydWN0dXJlIGJlaW5nIGVuY29kZWQuCi0jZGVmaW5lIFRUUyAgKHRzX3N0YWNrXy5iYWNrKCkpICAvLyB0eXBlID0gVHlwZVNwZWMqCi0vLyBJbkRlWC4gIEluZGV4IGludG8gVFRTIG9mIHRoZSBjdXJyZW50L25leHQgZmllbGQgdG8gZW5jb2RlLgotI2RlZmluZSBJRFggKGlkeF9zdGFja18uYmFjaygpKSAgLy8gdHlwZSA9IGludAotLy8gRmllbGQgVHlwZVNwZWMuICBUeXBlU3BlYyBvZiB0aGUgY3VycmVudC9uZXh0IGZpZWxkIHRvIGVuY29kZS4KLSNkZWZpbmUgRlRTIChUVFMtPnRzdHJ1Y3Quc3BlY3NbSURYXSkgIC8vIHR5cGUgPSBUeXBlU3BlYyoKLS8vIEZpZWxkIE1lVGEuICBNZXRhZGF0YSBvZiB0aGUgY3VycmVudC9uZXh0IGZpZWxkIHRvIGVuY29kZS4KLSNkZWZpbmUgRk1UIChUVFMtPnRzdHJ1Y3QubWV0YXNbSURYXSkgIC8vIHR5cGUgPSBGaWVsZE1ldGEKLS8vIFN1YlR5cGUgMS8yLiAgVHlwZVNwZWMgb2YgdGhlIGZpcnN0L3NlY29uZCBzdWJ0eXBlIG9mIHRoaXMgY29udGFpbmVyLgotI2RlZmluZSBTVDEgKFRUUy0+dGNvbnRhaW5lci5zdWJ0eXBlMSkKLSNkZWZpbmUgU1QyIChUVFMtPnRjb250YWluZXIuc3VidHlwZTIpCi0KLQotLyoqCi0gKiBDaGVja3MgdGhhdCBAYyB0dHlwZSBpcyBpbmRlZWQgdGhlIHR0eXBlIHRoYXQgd2Ugc2hvdWxkIGJlIHdyaXRpbmcsCi0gKiBhY2NvcmRpbmcgdG8gb3VyIHR5cGVzcGVjLiAgQWJvcnRzIGlmIHRoZSB0ZXN0IGZhaWxzIGFuZCBkZWJ1Z2dpbmcgaW4gb24uCi0gKi8KLWlubGluZSB2b2lkIFREZW5zZVByb3RvY29sOjpjaGVja1RUeXBlKGNvbnN0IFRUeXBlIHR0eXBlKSB7Ci0gIGFzc2VydCghdHNfc3RhY2tfLmVtcHR5KCkpOwotICBhc3NlcnQoVFRTLT50dHlwZSA9PSB0dHlwZSk7Ci19Ci0KLS8qKgotICogTWFrZXMgc3VyZSB0aGF0IHRoZSBUeXBlU3BlYyBzdGFjayBpcyBjb3JyZWN0IGZvciB0aGUgbmV4dCBvYmplY3QuCi0gKiBTZWUgdG9wLW9mLWZpbGUgY29tbWVudHMuCi0gKi8KLWlubGluZSB2b2lkIFREZW5zZVByb3RvY29sOjpzdGF0ZVRyYW5zaXRpb24oKSB7Ci0gIFR5cGVTcGVjKiBvbGRfdHRzID0gdHNfc3RhY2tfLmJhY2soKTsKLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0KLSAgLy8gSWYgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSB0b3AtbGV2ZWwgd3JpdGUsIHdlIHNob3VsZCBoYXZlIGp1c3QgcG9wcGVkCi0gIC8vIHRoZSBUeXBlU3BlYyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgotICBpZiAodHNfc3RhY2tfLmVtcHR5KCkpIHsKLSAgICBhc3NlcnQob2xkX3R0cyA9IHR5cGVfc3BlY18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAoVFRTLT50dHlwZSkgewotCi0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICAgIGFzc2VydChvbGRfdHRzID09IEZUUyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9MSVNUOgotICAgIGNhc2UgVF9TRVQ6Ci0gICAgICBhc3NlcnQob2xkX3R0cyA9PSBTVDEpOwotICAgICAgdHNfc3RhY2tfLnB1c2hfYmFjayhvbGRfdHRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX01BUDoKLSAgICAgIGFzc2VydChvbGRfdHRzID09IChta3Zfc3RhY2tfLmJhY2soKSA/IFNUMSA6IFNUMikpOwotICAgICAgbWt2X3N0YWNrXy5iYWNrKCkgPSAhbWt2X3N0YWNrXy5iYWNrKCk7Ci0gICAgICB0c19zdGFja18ucHVzaF9iYWNrKG1rdl9zdGFja18uYmFjaygpID8gU1QxIDogU1QyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCghIkludmFsaWQgVFR5cGUgaW4gc3RhdGVUcmFuc2l0aW9uLiIpOwotICAgICAgYnJlYWs7Ci0KLSAgfQotfQotCi0KLS8qCi0gKiBWYXJpYWJsZS1sZW5ndGggcXVhbnRpdHkgZnVuY3Rpb25zLgotICovCi0KLWlubGluZSB1aW50MzJfdCBURGVuc2VQcm90b2NvbDo6dmxxUmVhZCh1aW50NjRfdCYgdmxxKSB7Ci0gIHVpbnQzMl90IHVzZWQgPSAwOwotICB1aW50NjRfdCB2YWwgPSAwOwotICB1aW50OF90IGJ1ZlsxMF07ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgotICB1aW50MzJfdCBidWZfc2l6ZSA9IHNpemVvZihidWYpOwotICBjb25zdCB1aW50OF90KiBib3Jyb3dlZCA9IHRyYW5zXy0+Ym9ycm93KGJ1ZiwgJmJ1Zl9zaXplKTsKLQotICAvLyBGYXN0IHBhdGguICBUT0RPKGRyZWlzcyk6IE1ha2UgaXQgZmFzdGVyLgotICBpZiAoYm9ycm93ZWQgIT0gTlVMTCkgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB1aW50OF90IGJ5dGUgPSBib3Jyb3dlZFt1c2VkXTsKLSAgICAgIHVzZWQrKzsKLSAgICAgIHZhbCA9ICh2YWwgPDwgNykgfCAoYnl0ZSAmIDB4N2YpOwotICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICAgIHZscSA9IHZhbDsKLSAgICAgICAgdHJhbnNfLT5jb25zdW1lKHVzZWQpOwotICAgICAgICByZXR1cm4gdXNlZDsKLSAgICAgIH0KLSAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGludmFsaWQgZGF0YSBzbyB3ZSBkb24ndCBjcmFzaC4KLSAgICAgIGlmIChVTkxJS0VMWSh1c2VkID09IHNpemVvZihidWYpKSkgewotICAgICAgICByZXNldFN0YXRlKCk7Ci0gICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBTbG93IHBhdGguCi0gIGVsc2UgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB1aW50OF90IGJ5dGU7Ci0gICAgICB1c2VkICs9IHRyYW5zXy0+cmVhZEFsbCgmYnl0ZSwgMSk7Ci0gICAgICB2YWwgPSAodmFsIDw8IDcpIHwgKGJ5dGUgJiAweDdmKTsKLSAgICAgIGlmICghKGJ5dGUgJiAweDgwKSkgewotICAgICAgICB2bHEgPSB2YWw7Ci0gICAgICAgIHJldHVybiB1c2VkOwotICAgICAgfQotICAgICAgLy8gTWlnaHQgYXMgd2VsbCBjaGVjayBmb3IgaW52YWxpZCBkYXRhIG9uIHRoZSBzbG93IHBhdGggdG9vLgotICAgICAgaWYgKFVOTElLRUxZKHVzZWQgPj0gc2l6ZW9mKGJ1ZikpKSB7Ci0gICAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1pbmxpbmUgdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnZscVdyaXRlKHVpbnQ2NF90IHZscSkgewotICB1aW50OF90IGJ1ZlsxMF07ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgotICBpbnQzMl90IHBvcyA9IHNpemVvZihidWYpIC0gMTsKLQotICAvLyBXcml0ZSB0aGUgdGhpbmcgZnJvbSBiYWNrIHRvIGZyb250LgotICBidWZbcG9zXSA9IHZscSAmIDB4N2Y7Ci0gIHZscSA+Pj0gNzsKLSAgcG9zLS07Ci0KLSAgd2hpbGUgKHZscSA+IDApIHsKLSAgICBhc3NlcnQocG9zID49IDApOwotICAgIGJ1Zltwb3NdID0gKHZscSB8IDB4ODApOwotICAgIHZscSA+Pj0gNzsKLSAgICBwb3MtLTsKLSAgfQotCi0gIC8vIEJhY2sgdXAgb25lIHN0ZXAgYmVmb3JlIHdyaXRpbmcuCi0gIHBvcysrOwotCi0gIHRyYW5zXy0+d3JpdGUoYnVmK3Bvcywgc2l6ZW9mKGJ1ZikgLSBwb3MpOwotICByZXR1cm4gc2l6ZW9mKGJ1ZikgLSBwb3M7Ci19Ci0KLQotCi0vKgotICogV3JpdGluZyBmdW5jdGlvbnMuCi0gKi8KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gIHRocm93IFRFeGNlcHRpb24oIlREZW5zZVByb3RvY29sIGRvZXNuJ3Qgd29yayB3aXRoIG1lc3NhZ2VzICh5ZXQpLiIpOwotCi0gIGludDMyX3QgdmVyc2lvbiA9IChWRVJTSU9OXzIpIHwgKChpbnQzMl90KW1lc3NhZ2VUeXBlKTsKLSAgdWludDMyX3Qgd3NpemUgPSAwOwotICB3c2l6ZSArPSBzdWJXcml0ZUkzMih2ZXJzaW9uKTsKLSAgd3NpemUgKz0gc3ViV3JpdGVTdHJpbmcobmFtZSk7Ci0gIHdzaXplICs9IHN1YldyaXRlSTMyKHNlcWlkKTsKLSAgcmV0dXJuIHdzaXplOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICB1aW50MzJfdCB4ZmVyID0gMDsKLQotICAvLyBUaGUgVHlwZVNwZWMgc3RhY2sgc2hvdWxkIGJlIGVtcHR5IGlmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCByZWFkL3dyaXRlLgotICAvLyBJZiBpdCBpcywgd2UgcHVzaCB0aGUgVHlwZVNwZWMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAgaWYgKHRzX3N0YWNrXy5lbXB0eSgpKSB7Ci0gICAgYXNzZXJ0KHN0YW5kYWxvbmVfKTsKLQotICAgIGlmICh0eXBlX3NwZWNfID09IE5VTEwpIHsKLSAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlREZW5zZVByb3RvY29sOiBObyB0eXBlIHNwZWNpZmllZC4iKTsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KHR5cGVfc3BlY18tPnR0eXBlID09IFRfU1RSVUNUKTsKLSAgICAgIHRzX3N0YWNrXy5wdXNoX2JhY2sodHlwZV9zcGVjXyk7Ci0gICAgICAvLyBXcml0ZSBvdXQgYSBwcmVmaXggb2YgdGhlIHN0cnVjdHVyZSBmaW5nZXJwcmludC4KLSAgICAgIHRyYW5zXy0+d3JpdGUodHlwZV9zcGVjXy0+ZnBfcHJlZml4LCBGUF9QUkVGSVhfTEVOKTsKLSAgICAgIHhmZXIgKz0gRlBfUFJFRklYX0xFTjsKLSAgICB9Ci0gIH0KLQotICAvLyBXZSBuZWVkIGEgbmV3IGZpZWxkIGluZGV4IGZvciB0aGlzIHN0cnVjdHVyZS4KLSAgaWR4X3N0YWNrXy5wdXNoX2JhY2soMCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gIGlkeF9zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIC8vIFNraXAgb3ZlciBvcHRpb25hbCBmaWVsZHMuCi0gIHdoaWxlIChGTVQudGFnICE9IGZpZWxkSWQpIHsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IE9sZCBtZXRhIGhlcmUuCi0gICAgYXNzZXJ0KEZUUy0+dHR5cGUgIT0gVF9TVE9QKTsKLSAgICBhc3NlcnQoRk1ULmlzX29wdGlvbmFsKTsKLSAgICAvLyBXcml0ZSBhIHplcm8gYnl0ZSBzbyB0aGUgcmVhZGVyIGNhbiBza2lwIGl0LgotICAgIHhmZXIgKz0gc3ViV3JpdGVCb29sKGZhbHNlKTsKLSAgICAvLyBBbmQgYWR2YW5jZSB0byB0aGUgbmV4dCBmaWVsZC4KLSAgICBJRFgrKzsKLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogZ2l2ZSBhIGJldHRlciBleGNlcHRpb24uCi0gIGFzc2VydChGVFMtPnR0eXBlID09IGZpZWxkVHlwZSk7Ci0KLSAgaWYgKEZNVC5pc19vcHRpb25hbCkgewotICAgIHN1YldyaXRlQm9vbCh0cnVlKTsKLSAgICB4ZmVyICs9IDE7Ci0gIH0KLQotICAvLyB3cml0ZUZpZWxkU3RvcCBzaGFyZXMgYWxsIGxvdCBvZiBsb2dpYyB1cCB0byB0aGlzIHBvaW50LgotICAvLyBJbnN0ZWFkIG9mIHJlcGxpY2F0aW5nIGl0IGFsbCwgd2UganVzdCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhhdCBvbmUKLSAgLy8gYW5kIHVzZSBhIGdyb3NzIHNwZWNpYWwgY2FzZSBoZXJlLgotICBpZiAoVU5MSUtFTFkoRlRTLT50dHlwZSAhPSBUX1NUT1ApKSB7Ci0gICAgLy8gRm9yIG5vcm1hbCBmaWVsZHMsIHB1c2ggdGhlIFR5cGVTcGVjIHRoYXQgd2UncmUgYWJvdXQgdG8gdXNlLgotICAgIHRzX3N0YWNrXy5wdXNoX2JhY2soRlRTKTsKLSAgfQotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7Ci0gIC8vIEp1c3QgbW92ZSBvbiB0byB0aGUgbmV4dCBmaWVsZC4KLSAgSURYKys7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7Ci0gIHJldHVybiBURGVuc2VQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKCIiLCBUX1NUT1AsIDApOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgY2hlY2tUVHlwZShUX01BUCk7Ci0KLSAgYXNzZXJ0KGtleVR5cGUgPT0gU1QxLT50dHlwZSk7Ci0gIGFzc2VydCh2YWxUeXBlID09IFNUMi0+dHR5cGUpOwotCi0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLSAgbWt2X3N0YWNrXy5wdXNoX2JhY2sodHJ1ZSk7Ci0KLSAgcmV0dXJuIHN1YldyaXRlSTMyKChpbnQzMl90KXNpemUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7Ci0gIC8vIFBvcCBvZmYgdGhlIHZhbHVlIHR5cGUsIGFzIHdlbGwgYXMgb3VyIGVudHJ5IGluIHRoZSBtYXAga2V5L3ZhbHVlIHN0YWNrLgotICAvLyBzdGF0ZVRyYW5zaXRpb24gdGFrZXMgY2FyZSBvZiBwb3BwaW5nIG9mZiBvdXIgVHlwZVNwZWMuCi0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBta3Zfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgY2hlY2tUVHlwZShUX0xJU1QpOwotCi0gIGFzc2VydChlbGVtVHlwZSA9PSBTVDEtPnR0eXBlKTsKLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotICByZXR1cm4gc3ViV3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7Ci0gIC8vIFBvcCBvZmYgdGhlIGVsZW1lbnQgdHlwZS4gIHN0YXRlVHJhbnNpdGlvbiB0YWtlcyBjYXJlIG9mIHBvcHBpbmcgb2ZmIG91cnMuCi0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfU0VUKTsKLQotICBhc3NlcnQoZWxlbVR5cGUgPT0gU1QxLT50dHlwZSk7Ci0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLSAgcmV0dXJuIHN1YldyaXRlSTMyKChpbnQzMl90KXNpemUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTZXRFbmQoKSB7Ci0gIC8vIFBvcCBvZmYgdGhlIGVsZW1lbnQgdHlwZS4gIHN0YXRlVHJhbnNpdGlvbiB0YWtlcyBjYXJlIG9mIHBvcHBpbmcgb2ZmIG91cnMuCi0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICBjaGVja1RUeXBlKFRfQk9PTCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjp3cml0ZUJvb2wodmFsdWUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIGNoZWNrVFR5cGUoVF9CWVRFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlQnl0ZShieXRlKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7Ci0gIGNoZWNrVFR5cGUoVF9JMTYpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHZscVdyaXRlKGkxNik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICBjaGVja1RUeXBlKFRfSTMyKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiB2bHFXcml0ZShpMzIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgY2hlY2tUVHlwZShUX0k2NCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gdmxxV3JpdGUoaTY0KTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgY2hlY2tUVHlwZShUX0RPVUJMRSk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjp3cml0ZURvdWJsZShkdWIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBjaGVja1RUeXBlKFRfU1RSSU5HKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBzdWJXcml0ZVN0cmluZyhzdHIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICByZXR1cm4gVERlbnNlUHJvdG9jb2w6OndyaXRlU3RyaW5nKHN0cik7Ci19Ci0KLWlubGluZSB1aW50MzJfdCBURGVuc2VQcm90b2NvbDo6c3ViV3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgcmV0dXJuIHZscVdyaXRlKGkzMik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJXcml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHNpemUgPSBzdHIuc2l6ZSgpOwotICB1aW50MzJfdCB4ZmVyID0gc3ViV3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci0gIGlmIChzaXplID4gMCkgewotICAgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHNpemUpOwotICB9Ci0gIHJldHVybiB4ZmVyICsgc2l6ZTsKLX0KLQotCi0KLS8qCi0gKiBSZWFkaW5nIGZ1bmN0aW9ucwotICoKLSAqIFRoZXNlIGhhdmUgYSBsb3Qgb2YgdGhlIHNhbWUgbG9naWMgYXMgdGhlIHdyaXRpbmcgZnVuY3Rpb25zLCBzbyBpZgotICogc29tZXRoaW5nIGlzIGNvbmZ1c2luZywgbG9vayBmb3IgY29tbWVudHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGVyLgotICovCi0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gIHRocm93IFRFeGNlcHRpb24oIlREZW5zZVByb3RvY29sIGRvZXNuJ3Qgd29yayB3aXRoIG1lc3NhZ2VzICh5ZXQpLiIpOwotCi0gIHVpbnQzMl90IHhmZXIgPSAwOwotICBpbnQzMl90IHN6OwotICB4ZmVyICs9IHN1YlJlYWRJMzIoc3opOwotCi0gIGlmIChzeiA8IDApIHsKLSAgICAvLyBDaGVjayBmb3IgY29ycmVjdCB2ZXJzaW9uIG51bWJlcgotICAgIGludDMyX3QgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwotICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMikgewotICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpZGVudGlmaWVyIik7Ci0gICAgfQotICAgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSkoc3ogJiAweDAwMDAwMGZmKTsKLSAgICB4ZmVyICs9IHN1YlJlYWRTdHJpbmcobmFtZSk7Ci0gICAgeGZlciArPSBzdWJSZWFkSTMyKHNlcWlkKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOwotICB9Ci0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZE1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZFN0cnVjdEJlZ2luKHN0cmluZyYgbmFtZSkgewotICB1aW50MzJfdCB4ZmVyID0gMDsKLQotICBpZiAodHNfc3RhY2tfLmVtcHR5KCkpIHsKLSAgICBhc3NlcnQoc3RhbmRhbG9uZV8pOwotCi0gICAgaWYgKHR5cGVfc3BlY18gPT0gTlVMTCkgewotICAgICAgcmVzZXRTdGF0ZSgpOwotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVERlbnNlUHJvdG9jb2w6IE5vIHR5cGUgc3BlY2lmaWVkLiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnQodHlwZV9zcGVjXy0+dHR5cGUgPT0gVF9TVFJVQ1QpOwotICAgICAgdHNfc3RhY2tfLnB1c2hfYmFjayh0eXBlX3NwZWNfKTsKLQotICAgICAgLy8gQ2hlY2sgdGhlIGZpbmdlcnByaW50IHByZWZpeC4KLSAgICAgIHVpbnQ4X3QgYnVmW0ZQX1BSRUZJWF9MRU5dOwotICAgICAgeGZlciArPSB0cmFuc18tPnJlYWQoYnVmLCBGUF9QUkVGSVhfTEVOKTsKLSAgICAgIGlmIChzdGQ6Om1lbWNtcChidWYsIHR5cGVfc3BlY18tPmZwX3ByZWZpeCwgRlBfUFJFRklYX0xFTikgIT0gMCkgewotICAgICAgICByZXNldFN0YXRlKCk7Ci0gICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICJGaW5nZXJwcmludCBpbiBkYXRhIGRvZXMgbm90IG1hdGNoIHR5cGVfc3BlYy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBXZSBuZWVkIGEgbmV3IGZpZWxkIGluZGV4IGZvciB0aGlzIHN0cnVjdHVyZS4KLSAgaWR4X3N0YWNrXy5wdXNoX2JhY2soMCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZFN0cnVjdEVuZCgpIHsKLSAgaWR4X3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIC8vIEZvciBvcHRpb25hbCBmaWVsZHMsIGNoZWNrIHRvIHNlZSBpZiB0aGV5IGFyZSB0aGVyZS4KLSAgd2hpbGUgKEZNVC5pc19vcHRpb25hbCkgewotICAgIGJvb2wgaXNfcHJlc2VudDsKLSAgICB4ZmVyICs9IHN1YlJlYWRCb29sKGlzX3ByZXNlbnQpOwotICAgIGlmIChpc19wcmVzZW50KSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgSURYKys7Ci0gIH0KLQotICAvLyBPbmNlIHdlIGhpdCBhIG1hbmRhdG9yeSBmaWVsZCwgb3IgYW4gb3B0aW9uYWwgZmllbGQgdGhhdCBpcyBwcmVzZW50LAotICAvLyB3ZSBrbm93IHRoYXQgRk1UIGFuZCBGVFMgcG9pbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGZpZWxkLgotCi0gIGZpZWxkSWQgICA9IEZNVC50YWc7Ci0gIGZpZWxkVHlwZSA9IEZUUy0+dHR5cGU7Ci0KLSAgLy8gTm9ybWFsbHksIHdlIHB1c2ggdGhlIFR5cGVTcGVjIHRoYXQgd2UgYXJlIGFib3V0IHRvIHJlYWQsCi0gIC8vIGJ1dCBubyByZWFkaW5nIGlzIGRvbmUgZm9yIFRfU1RPUC4KLSAgaWYgKEZUUy0+dHR5cGUgIT0gVF9TVE9QKSB7Ci0gICAgdHNfc3RhY2tfLnB1c2hfYmFjayhGVFMpOwotICB9Ci0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEZpZWxkRW5kKCkgewotICBJRFgrKzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTUFQKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHNpemVpKTsKLSAgaWYgKHNpemVpIDwgMCkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotCi0gIGtleVR5cGUgPSBTVDEtPnR0eXBlOwotICB2YWxUeXBlID0gU1QyLT50dHlwZTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0gIG1rdl9zdGFja18ucHVzaF9iYWNrKHRydWUpOwotCi0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZE1hcEVuZCgpIHsKLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIG1rdl9zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTElTVCk7Ci0KLSAgdWludDMyX3QgeGZlciA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHhmZXIgKz0gc3ViUmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLSAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKLQotICBlbGVtVHlwZSA9IFNUMS0+dHR5cGU7Ci0KLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotCi0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7Ci0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfU0VUKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHNpemVpKTsKLSAgaWYgKHNpemVpIDwgMCkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotCi0gIGVsZW1UeXBlID0gU1QxLT50dHlwZTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU2V0RW5kKCkgewotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgY2hlY2tUVHlwZShUX0JPT0wpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6cmVhZEJvb2wodmFsdWUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gIGNoZWNrVFR5cGUoVF9CWVRFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWRCeXRlKGJ5dGUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKLSAgY2hlY2tUVHlwZShUX0kxNik7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICB1aW50NjRfdCB1NjQ7Ci0gIHVpbnQzMl90IHJ2ID0gdmxxUmVhZCh1NjQpOwotICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXU2NDsKLSAgaWYgKFVOTElLRUxZKHZhbCA+IElOVDE2X01BWCB8fCB2YWwgPCBJTlQxNl9NSU4pKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkxNiBvdXQgb2YgcmFuZ2UuIik7Ci0gIH0KLSAgaTE2ID0gKGludDE2X3QpdmFsOwotICByZXR1cm4gcnY7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkSTMyKGludDMyX3QmIGkzMikgewotICBjaGVja1RUeXBlKFRfSTMyKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHVpbnQ2NF90IHU2NDsKLSAgdWludDMyX3QgcnYgPSB2bHFSZWFkKHU2NCk7Ci0gIGludDY0X3QgdmFsID0gKGludDY0X3QpdTY0OwotICBpZiAoVU5MSUtFTFkodmFsID4gSU5UMzJfTUFYIHx8IHZhbCA8IElOVDMyX01JTikpIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyIG91dCBvZiByYW5nZS4iKTsKLSAgfQotICBpMzIgPSAoaW50MzJfdCl2YWw7Ci0gIHJldHVybiBydjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gIGNoZWNrVFR5cGUoVF9JNjQpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgdWludDY0X3QgdTY0OwotICB1aW50MzJfdCBydiA9IHZscVJlYWQodTY0KTsKLSAgaW50NjRfdCB2YWwgPSAoaW50NjRfdCl1NjQ7Ci0gIGlmIChVTkxJS0VMWSh2YWwgPiBJTlQ2NF9NQVggfHwgdmFsIDwgSU5UNjRfTUlOKSkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQgb3V0IG9mIHJhbmdlLiIpOwotICB9Ci0gIGk2NCA9IChpbnQ2NF90KXZhbDsKLSAgcmV0dXJuIHJ2OwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBjaGVja1RUeXBlKFRfRE9VQkxFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWREb3VibGUoZHViKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICBjaGVja1RUeXBlKFRfU1RSSU5HKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBzdWJSZWFkU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFREZW5zZVByb3RvY29sOjpyZWFkU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJSZWFkSTMyKGludDMyX3QmIGkzMikgewotICB1aW50NjRfdCB1NjQ7Ci0gIHVpbnQzMl90IHJ2ID0gdmxxUmVhZCh1NjQpOwotICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXU2NDsKLSAgaWYgKFVOTElLRUxZKHZhbCA+IElOVDMyX01BWCB8fCB2YWwgPCBJTlQzMl9NSU4pKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMiBvdXQgb2YgcmFuZ2UuIik7Ci0gIH0KLSAgaTMyID0gKGludDMyX3QpdmFsOwotICByZXR1cm4gcnY7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJSZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3QgeGZlcjsKLSAgaW50MzJfdCBzaXplOwotICB4ZmVyID0gc3ViUmVhZEkzMihzaXplKTsKLSAgcmV0dXJuIHhmZXIgKyByZWFkU3RyaW5nQm9keShzdHIsIHNpemUpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1NWE0Ny4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERU5TRVBST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVERFTlNFUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVEJpbmFyeVByb3RvY29sLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoqCi0gKiAhISFXQVJOSU5HISEhCi0gKiBUaGlzIGNsYXNzIGlzIHN0aWxsIGhpZ2hseSBleHBlcmltZW50YWwuICBJbmNvbXBhdGlibGUgY2hhbmdlcwotICogV0lMTCBiZSBtYWRlIHRvIGl0IHdpdGhvdXQgbm90aWNlLiAgRE8gTk9UIFVTRSBJVCBZRVQgdW5sZXNzCi0gKiB5b3UgYXJlIGNvb3JkaW5hdGluZyB5b3VyIHRlc3Rpbmcgd2l0aCB0aGUgYXV0aG9yLgotICoKLSAqIFRoZSBkZW5zZSBwcm90b2NvbCBpcyBkZXNpZ25lZCB0byB1c2UgYXMgbGl0dGxlIHNwYWNlIGFzIHBvc3NpYmxlLgotICoKLSAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgZGVuc2UgcHJvdG9jb2wgaW5zdGFuY2VzLiAgU3RhbmRhbG9uZSBpbnN0YW5jZXMKLSAqIGFyZSBub3QgdXNlZCBmb3IgUlBDIGFuZCBqdXN0IGVuY29kZWQgYW5kIGRlY29kZSBzdHJ1Y3R1cmVzIG9mCi0gKiBhIHByZWRldGVybWluZWQgdHlwZS4gIE5vbi1zdGFuZGFsb25lIGluc3RhbmNlcyBhcmUgdXNlZCBmb3IgUlBDLgotICogQ3VycmVudGx5LCBvbmx5IHN0YW5kYWxvbmUgaW5zdGFuY2VzIGV4aXN0LgotICoKLSAqIFRvIHVzZSBhIHN0YW5kYWxvbmUgZGVuc2UgcHJvdG9jb2wgb2JqZWN0LCB5b3UgbXVzdCBzZXQgdGhlIHR5cGVfc3BlYwotICogcHJvcGVydHkgKGVpdGhlciBpbiB0aGUgY29uc3RydWN0b3IsIG9yIHdpdGggc2V0VHlwZVNwZWMpIHRvIHRoZSBsb2NhbAotICogcmVmbGVjdGlvbiBUeXBlU3BlYyBvZiB0aGUgc3RydWN0dXJlcyB5b3Ugd2lsbCB3cml0ZSB0byAob3IgcmVhZCBmcm9tKSB0aGUKLSAqIHByb3RvY29sIGluc3RhbmNlLgotICoKLSAqIEJFU1QgUFJBQ1RJQ0VTOgotICogLSBOZXZlciB1c2Ugb3B0aW9uYWwgZm9yIHByaW1pdGl2ZXMgb3IgY29udGFpbmVycy4KLSAqIC0gT25seSB1c2Ugb3B0aW9uYWwgZm9yIHN0cnVjdHVyZXMgaWYgdGhleSBhcmUgdmVyeSBiaWcgYW5kIHZlcnkgcmFyZWx5IHNldC4KLSAqIC0gQWxsIGludGVnZXJzIGFyZSB2YXJpYWJsZS1sZW5ndGgsIHNvIHlvdSBjYW4gdXNlIGk2NCB3aXRob3V0IGJsb2F0aW5nLgotICogLSBORVZFUiBFVkVSIGNoYW5nZSB0aGUgc3RydWN0IGRlZmluaXRpb25zIElOIEFOWSBXQVkgd2l0aG91dCBlaXRoZXIKLSAqICAgY2hhbmdpbmcgeW91ciBjYWNoZSBrZXlzIG9yIHRhbGtpbmcgdG8gZHJlaXNzLgotICoKLSAqIFRPRE8oZHJlaXNzKTogTmV3IGNsYXNzIHdyaXRlIHdpdGggb2xkIG1ldGEuCi0gKgotICogV2Ugb3ZlcnJpZGUgYWxsIG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMuCi0gKiBXZSBpbmhlcml0IHNvIHRoYXQgd2UgY2FuIGNhbiBleHBsaWNpdGx5IGNhbGwgVEJQcydzIHByaW1pdGl2ZS13cml0aW5nCi0gKiBtZXRob2RzIHdpdGhpbiBvdXIgdmVyc2lvbnMuCi0gKgotICovCi1jbGFzcyBURGVuc2VQcm90b2NvbCA6IHB1YmxpYyBUQmluYXJ5UHJvdG9jb2wgewotIHByb3RlY3RlZDoKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKLSAgLy8gVkVSU0lPTl8xICgweDgwMDEwMDAwKSAgaXMgdGFrZW4gYnkgVEJpbmFyeVByb3RvY29sLgotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzIgPSAweDgwMDIwMDAwOwotCi0gcHVibGljOgotICB0eXBlZGVmIGFwYWNoZTo6dGhyaWZ0OjpyZWZsZWN0aW9uOjpsb2NhbDo6VHlwZVNwZWMgVHlwZVNwZWM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRlBfUFJFRklYX0xFTjsKLQotICAvKioKLSAgICogQHBhcmFtIHRyYW4gICAgICAgVGhlIHRyYW5zcG9ydCB0byB1c2UuCi0gICAqIEBwYXJhbSB0eXBlX3NwZWMgIFRoZSBUeXBlU3BlYyBvZiB0aGUgc3RydWN0dXJlcyB1c2luZyB0aGlzIHByb3RvY29sLgotICAgKi8KLSAgVERlbnNlUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMsCi0gICAgICAgICAgICAgICAgIFR5cGVTcGVjKiB0eXBlX3NwZWMgPSBOVUxMKSA6Ci0gICAgVEJpbmFyeVByb3RvY29sKHRyYW5zKSwKLSAgICB0eXBlX3NwZWNfKHR5cGVfc3BlYyksCi0gICAgc3RhbmRhbG9uZV8odHJ1ZSkKLSAge30KLQotICB2b2lkIHNldFR5cGVTcGVjKFR5cGVTcGVjKiB0eXBlX3NwZWMpIHsKLSAgICB0eXBlX3NwZWNfID0gdHlwZV9zcGVjOwotICB9Ci0gIFR5cGVTcGVjKiBnZXRUeXBlU3BlYygpIHsKLSAgICByZXR1cm4gdHlwZV9zcGVjXzsKLSAgfQotCi0KLSAgLyoKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7Ci0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0KLSAgLyoKLSAgICogSGVscGVyIHdyaXRpbmcgZnVuY3Rpb25zIChkb24ndCBkbyBzdGF0ZSB0cmFuc2l0aW9ucykuCi0gICAqLwotICBpbmxpbmUgdWludDMyX3Qgc3ViV3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOwotCi0gIGlubGluZSB1aW50MzJfdCBzdWJXcml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCBzdWJXcml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlQm9vbCh2YWx1ZSk7Ci0gIH0KLQotCi0gIC8qCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCk7Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOwotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKLQotICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOwotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKLQotICAvKgotICAgKiBIZWxwZXIgcmVhZGluZyBmdW5jdGlvbnMgKGRvbid0IGRvIHN0YXRlIHRyYW5zaXRpb25zKS4KLSAgICovCi0gIGlubGluZSB1aW50MzJfdCBzdWJSZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHN1YlJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgc3ViUmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjpyZWFkQm9vbCh2YWx1ZSk7Ci0gIH0KLQotCi0gcHJpdmF0ZToKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMsIGRvY3VtZW50ZWQgaW4gdGhlIC5jcHAuCi0gIGlubGluZSB2b2lkIGNoZWNrVFR5cGUoY29uc3QgVFR5cGUgdHR5cGUpOwotICBpbmxpbmUgdm9pZCBzdGF0ZVRyYW5zaXRpb24oKTsKLQotICAvLyBSZWFkIGFuZCB3cml0ZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMuCi0gIC8vIFVzZXMgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIHRoZSBNSURJIGZpbGUgZm9ybWF0LgotICBpbmxpbmUgdWludDMyX3QgdmxxUmVhZCh1aW50NjRfdCYgdmxxKTsKLSAgaW5saW5lIHVpbnQzMl90IHZscVdyaXRlKHVpbnQ2NF90IHZscSk7Ci0KLSAgLy8gQ2FsbGVkIGJlZm9yZSB0aHJvd2luZyBhbiBleGNlcHRpb24gdG8gbWFrZSB0aGUgb2JqZWN0IHJldXNhYmxlLgotICB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0gICAgdHNfc3RhY2tfLmNsZWFyKCk7Ci0gICAgaWR4X3N0YWNrXy5jbGVhcigpOwotICAgIG1rdl9zdGFja18uY2xlYXIoKTsKLSAgfQotCi0gIC8vIFR5cGVTcGVjIG9mIHRoZSB0b3AtbGV2ZWwgc3RydWN0dXJlIHRvIHdyaXRlLAotICAvLyBmb3Igc3RhbmRhbG9uZSBwcm90b2NvbCBvYmplY3RzLgotICBUeXBlU3BlYyogdHlwZV9zcGVjXzsKLQotICBzdGQ6OnZlY3RvcjxUeXBlU3BlYyo+IHRzX3N0YWNrXzsgICAvLyBUeXBlU3BlYyBzdGFjay4KLSAgc3RkOjp2ZWN0b3I8aW50PiAgICAgICBpZHhfc3RhY2tfOyAgLy8gSW5EZVggc3RhY2suCi0gIHN0ZDo6dmVjdG9yPGJvb2w+ICAgICAgbWt2X3N0YWNrXzsgIC8vIE1hcCBLZXkvVmx1ZSBzdGFjay4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ1ZSA9IGtleSwgRmFsc2UgPSB2YWx1ZS4KLQotICAvLyBUcnVlIGlmZiB0aGlzIGlzIGEgc3RhbmRhbG9uZSBpbnN0YW5jZSAobm8gUlBDKS4KLSAgYm9vbCBzdGFuZGFsb25lXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVOU0VQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5YzhmMC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUSlNPTlByb3RvY29sLmgiCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLSNpbmNsdWRlICJUQmFzZTY0VXRpbHMuaCIKLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotCi11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi0KLS8vIFN0YXRpYyBkYXRhCi0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OT2JqZWN0U3RhcnQgPSAneyc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTk9iamVjdEVuZCA9ICd9JzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQXJyYXlTdGFydCA9ICdbJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQXJyYXlFbmQgPSAnXSc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTk5ld2xpbmUgPSAnXG4nOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05QYWlyU2VwYXJhdG9yID0gJzonOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05FbGVtU2VwYXJhdG9yID0gJywnOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05CYWNrc2xhc2ggPSAnXFwnOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05TdHJpbmdEZWxpbWl0ZXIgPSAnIic7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlplcm9DaGFyID0gJzAnOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05Fc2NhcGVDaGFyID0gJ3UnOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0pTT05Fc2NhcGVQcmVmaXgoIlxcdTAwIik7Ci0KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrVGhyaWZ0VmVyc2lvbjEgPSAxOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RocmlmdE5hbigiTmFOIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RocmlmdEluZmluaXR5KCJJbmZpbml0eSIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUaHJpZnROZWdhdGl2ZUluZmluaXR5KCItSW5maW5pdHkiKTsKLQotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUJvb2woInRmIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lQnl0ZSgiaTgiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVJMTYoImkxNiIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUkzMigiaTMyIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lSTY0KCJpNjQiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVEb3VibGUoImRibCIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZVN0cnVjdCgicmVjIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lU3RyaW5nKCJzdHIiKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVNYXAoIm1hcCIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUxpc3QoImxzdCIpOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZVNldCgic2V0Iik7Ci0KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0VHlwZU5hbWVGb3JUeXBlSUQoVFR5cGUgdHlwZUlEKSB7Ci0gIHN3aXRjaCAodHlwZUlEKSB7Ci0gIGNhc2UgVF9CT09MOgotICAgIHJldHVybiBrVHlwZU5hbWVCb29sOwotICBjYXNlIFRfQllURToKLSAgICByZXR1cm4ga1R5cGVOYW1lQnl0ZTsKLSAgY2FzZSBUX0kxNjoKLSAgICByZXR1cm4ga1R5cGVOYW1lSTE2OwotICBjYXNlIFRfSTMyOgotICAgIHJldHVybiBrVHlwZU5hbWVJMzI7Ci0gIGNhc2UgVF9JNjQ6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZUk2NDsKLSAgY2FzZSBUX0RPVUJMRToKLSAgICByZXR1cm4ga1R5cGVOYW1lRG91YmxlOwotICBjYXNlIFRfU1RSSU5HOgotICAgIHJldHVybiBrVHlwZU5hbWVTdHJpbmc7Ci0gIGNhc2UgVF9TVFJVQ1Q6Ci0gICAgcmV0dXJuIGtUeXBlTmFtZVN0cnVjdDsKLSAgY2FzZSBUX01BUDoKLSAgICByZXR1cm4ga1R5cGVOYW1lTWFwOwotICBjYXNlIFRfU0VUOgotICAgIHJldHVybiBrVHlwZU5hbWVTZXQ7Ci0gIGNhc2UgVF9MSVNUOgotICAgIHJldHVybiBrVHlwZU5hbWVMaXN0OwotICBkZWZhdWx0OgotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlIik7Ci0gIH0KLX0KLQotc3RhdGljIFRUeXBlIGdldFR5cGVJREZvclR5cGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7Ci0gIFRUeXBlIHJlc3VsdCA9IFRfU1RPUDsgLy8gU2VudGluZWwgdmFsdWUKLSAgaWYgKG5hbWUubGVuZ3RoKCkgPiAxKSB7Ci0gICAgc3dpdGNoIChuYW1lWzBdKSB7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICByZXN1bHQgPSBUX0RPVUJMRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgc3dpdGNoIChuYW1lWzFdKSB7Ci0gICAgICBjYXNlICc4JzoKLSAgICAgICAgcmVzdWx0ID0gVF9CWVRFOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJzEnOgotICAgICAgICByZXN1bHQgPSBUX0kxNjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICczJzoKLSAgICAgICAgcmVzdWx0ID0gVF9JMzI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnNic6Ci0gICAgICAgIHJlc3VsdCA9IFRfSTY0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2wnOgotICAgICAgcmVzdWx0ID0gVF9MSVNUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICByZXN1bHQgPSBUX01BUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3InOgotICAgICAgcmVzdWx0ID0gVF9TVFJVQ1Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdzJzoKLSAgICAgIGlmIChuYW1lWzFdID09ICd0JykgewotICAgICAgICByZXN1bHQgPSBUX1NUUklORzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5hbWVbMV0gPT0gJ2UnKSB7Ci0gICAgICAgIHJlc3VsdCA9IFRfU0VUOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndCc6Ci0gICAgICByZXN1bHQgPSBUX0JPT0w7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKHJlc3VsdCA9PSBUX1NUT1ApIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSIpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLy8gVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGhhbmRsaW5nIGZvciB0aGUgZmlyc3QgMHgzMCBjaGFyYWN0ZXJzCi0vLyAgMCA6IGVzY2FwZSB1c2luZyAiXHUwMHh4IiBub3RhdGlvbgotLy8gIDEgOiBqdXN0IG91dHB1dCBpbmRleAotLy8gPG90aGVyPiA6IGVzY2FwZSB1c2luZyAiXDxvdGhlcj4iIG5vdGF0aW9uCi1zdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkNoYXJUYWJsZVsweDMwXSA9IHsKLS8vICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsJ2InLCd0JywnbicsICAwLCdmJywncicsICAwLCAgMCwgLy8gMAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8vIDEKLSAgICAxLCAgMSwnIicsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAvLyAyCi19OwotCi0KLS8vIFRoaXMgc3RyaW5nJ3MgY2hhcmFjdGVycyBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIGVsZW1lbnRzIGluIGtFc2NhcGVDaGFyVmFscy4KLS8vIEkgZG9uJ3QgaGF2ZSAnLycgb24gdGhpcyBsaXN0IGV2ZW4gdGhvdWdoIGl0IGFwcGVhcnMgb24gd3d3Lmpzb24ub3JnIC0tCi0vLyBpdCBpcyBub3QgaW4gdGhlIFJGQwotY29uc3Qgc3RhdGljIHN0ZDo6c3RyaW5nIGtFc2NhcGVDaGFycygiXCJcXGJmbnJ0Iik7Ci0KLS8vIFRoZSBlbGVtZW50cyBvZiB0aGlzIGFycmF5IG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbgotLy8ga0VzY2FwZUNoYXJzCi1jb25zdCBzdGF0aWMgdWludDhfdCBrRXNjYXBlQ2hhclZhbHNbN10gPSB7Ci0gICciJywgJ1xcJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0JywKLX07Ci0KLQotLy8gU3RhdGljIGhlbHBlciBmdW5jdGlvbnMKLQotLy8gUmVhZCAxIGNoYXJhY3RlciBmcm9tIHRoZSB0cmFuc3BvcnQgdHJhbnMgYW5kIHZlcmlmeSB0aGF0IGl0IGlzIHRoZQotLy8gZXhwZWN0ZWQgY2hhcmFjdGVyIGNoLgotLy8gVGhyb3cgYSBwcm90b2NvbCBleGNlcHRpb24gaWYgaXQgaXMgbm90Lgotc3RhdGljIHVpbnQzMl90IHJlYWRTeW50YXhDaGFyKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2gpIHsKLSAgdWludDhfdCBjaDIgPSByZWFkZXIucmVhZCgpOwotICBpZiAoY2gyICE9IGNoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIgKikmY2gsIDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwnOyBnb3QgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIgKikmY2gyLCAxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcJy4iKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8gUmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgaGV4IGNoYXJhY3RlciBjaC4KLS8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IFswLTlhLWZdLgotc3RhdGljIHVpbnQ4X3QgaGV4VmFsKHVpbnQ4X3QgY2gpIHsKLSAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKSB7Ci0gICAgcmV0dXJuIGNoIC0gJzAnOwotICB9Ci0gIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7Ci0gICAgcmV0dXJuIGNoIC0gJ2EnOwotICB9Ci0gIGVsc2UgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhleCB2YWwgKFswLTlhLWZdKTsgZ290IFwnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkOjpzdHJpbmcoKGNoYXIgKikmY2gsIDEpICsgIlwnLiIpOwotICB9Ci19Ci0KLS8vIFJldHVybiB0aGUgaGV4IGNoYXJhY3RlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgdmFsLiBUaGUgdmFsdWUgaXMgbWFza2VkCi0vLyB0byBtYWtlIHN1cmUgaXQgaXMgaW4gdGhlIGNvcnJlY3QgcmFuZ2UuCi1zdGF0aWMgdWludDhfdCBoZXhDaGFyKHVpbnQ4X3QgdmFsKSB7Ci0gIHZhbCAmPSAweDBGOwotICBpZiAodmFsIDwgMTApIHsKLSAgICByZXR1cm4gdmFsICsgJzAnOwotICB9Ci0gIGVsc2UgewotICAgIHJldHVybiB2YWwgKyAnYSc7Ci0gIH0KLX0KLQotLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNoYXJhY3RlciBjaCBpcyBpbiBbLSswLTkuRWVdOyBmYWxzZSBvdGhlcndpc2UKLXN0YXRpYyBib29sIGlzSlNPTk51bWVyaWModWludDhfdCBjaCkgewotICBzd2l0Y2ggKGNoKSB7Ci0gIGNhc2UgJysnOgotICBjYXNlICctJzoKLSAgY2FzZSAnLic6Ci0gIGNhc2UgJzAnOgotICBjYXNlICcxJzoKLSAgY2FzZSAnMic6Ci0gIGNhc2UgJzMnOgotICBjYXNlICc0JzoKLSAgY2FzZSAnNSc6Ci0gIGNhc2UgJzYnOgotICBjYXNlICc3JzoKLSAgY2FzZSAnOCc6Ci0gIGNhc2UgJzknOgotICBjYXNlICdFJzoKLSAgY2FzZSAnZSc6Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qKgotICogQ2xhc3MgdG8gc2VydmUgYXMgYmFzZSBKU09OIGNvbnRleHQgYW5kIGFzIGJhc2UgY2xhc3MgZm9yIG90aGVyIGNvbnRleHQKLSAqIGltcGxlbWVudGF0aW9ucwotICovCi1jbGFzcyBUSlNPTkNvbnRleHQgewotCi0gcHVibGljOgotCi0gIFRKU09OQ29udGV4dCgpIHt9OwotCi0gIHZpcnR1YWwgflRKU09OQ29udGV4dCgpIHt9OwotCi0gIC8qKgotICAgKiBXcml0ZSBjb250ZXh0IGRhdGEgdG8gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZShUVHJhbnNwb3J0ICZ0cmFucykgewotICAgIHJldHVybiAwOwotICB9OwotCi0gIC8qKgotICAgKiBSZWFkIGNvbnRleHQgZGF0YSBmcm9tIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlcikgewotICAgIHJldHVybiAwOwotICB9OwotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiBudW1iZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBhcyBzdHJpbmdzIGluIHRoaXMgY29udGV4dC4KLSAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gZmFsc2UuCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgZXNjYXBlTnVtKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfTsKLQotLy8gQ29udGV4dCBjbGFzcyBmb3Igb2JqZWN0IG1lbWJlciBrZXktdmFsdWUgcGFpcnMKLWNsYXNzIEpTT05QYWlyQ29udGV4dCA6IHB1YmxpYyBUSlNPTkNvbnRleHQgewotCi1wdWJsaWM6Ci0KLSAgSlNPTlBhaXJDb250ZXh0KCkgOgotICAgIGZpcnN0Xyh0cnVlKSwKLSAgICBjb2xvbl8odHJ1ZSkgewotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCAmdHJhbnMpIHsKLSAgICBpZiAoZmlyc3RfKSB7Ci0gICAgICBmaXJzdF8gPSBmYWxzZTsKLSAgICAgIGNvbG9uXyA9IHRydWU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB0cmFucy53cml0ZShjb2xvbl8gPyAma0pTT05QYWlyU2VwYXJhdG9yIDogJmtKU09ORWxlbVNlcGFyYXRvciwgMSk7Ci0gICAgICBjb2xvbl8gPSAhY29sb25fOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0KLSAgdWludDMyX3QgcmVhZChUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXIgJnJlYWRlcikgewotICAgIGlmIChmaXJzdF8pIHsKLSAgICAgIGZpcnN0XyA9IGZhbHNlOwotICAgICAgY29sb25fID0gdHJ1ZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHVpbnQ4X3QgY2ggPSAoY29sb25fID8ga0pTT05QYWlyU2VwYXJhdG9yIDoga0pTT05FbGVtU2VwYXJhdG9yKTsKLSAgICAgIGNvbG9uXyA9ICFjb2xvbl87Ci0gICAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyLCBjaCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTnVtYmVycyBtdXN0IGJlIHR1cm5lZCBpbnRvIHN0cmluZ3MgaWYgdGhleSBhcmUgdGhlIGtleSBwYXJ0IG9mIGEgcGFpcgotICB2aXJ0dWFsIGJvb2wgZXNjYXBlTnVtKCkgewotICAgIHJldHVybiBjb2xvbl87Ci0gIH0KLQotICBwcml2YXRlOgotCi0gICAgYm9vbCBmaXJzdF87Ci0gICAgYm9vbCBjb2xvbl87Ci19OwotCi0vLyBDb250ZXh0IGNsYXNzIGZvciBsaXN0cwotY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogcHVibGljIFRKU09OQ29udGV4dCB7Ci0KLXB1YmxpYzoKLQotICBKU09OTGlzdENvbnRleHQoKSA6Ci0gICAgZmlyc3RfKHRydWUpIHsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQgJnRyYW5zKSB7Ci0gICAgaWYgKGZpcnN0XykgewotICAgICAgZmlyc3RfID0gZmFsc2U7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB0cmFucy53cml0ZSgma0pTT05FbGVtU2VwYXJhdG9yLCAxKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCi0gIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyICZyZWFkZXIpIHsKLSAgICBpZiAoZmlyc3RfKSB7Ci0gICAgICBmaXJzdF8gPSBmYWxzZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXIsIGtKU09ORWxlbVNlcGFyYXRvcik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBib29sIGZpcnN0XzsKLX07Ci0KLQotVEpTT05Qcm90b2NvbDo6VEpTT05Qcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpIDoKLSAgVFByb3RvY29sKHB0cmFucyksCi0gIGNvbnRleHRfKG5ldyBUSlNPTkNvbnRleHQoKSksCi0gIHJlYWRlcl8oKnB0cmFucykgewotfQotCi1USlNPTlByb3RvY29sOjp+VEpTT05Qcm90b2NvbCgpIHt9Ci0KLXZvaWQgVEpTT05Qcm90b2NvbDo6cHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKSB7Ci0gIGNvbnRleHRzXy5wdXNoKGNvbnRleHRfKTsKLSAgY29udGV4dF8gPSBjOwotfQotCi12b2lkIFRKU09OUHJvdG9jb2w6OnBvcENvbnRleHQoKSB7Ci0gIGNvbnRleHRfID0gY29udGV4dHNfLnRvcCgpOwotICBjb250ZXh0c18ucG9wKCk7Ci19Ci0KLS8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgYSBKU09OIGVzY2FwZSBzZXF1ZW5jZSAoIlx1MDB4eCIpCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgY2gpIHsKLSAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCAqKWtKU09ORXNjYXBlUHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgICAgICAga0pTT05Fc2NhcGVQcmVmaXgubGVuZ3RoKCkpOwotICB1aW50OF90IG91dENoID0gaGV4Q2hhcihjaCA+PiA0KTsKLSAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOwotICBvdXRDaCA9IGhleENoYXIoY2gpOwotICB0cmFuc18tPndyaXRlKCZvdXRDaCwgMSk7Ci0gIHJldHVybiA2OwotfQotCi0vLyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIHBhcnQgb2YgYSBKU09OIHN0cmluZywgZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05DaGFyKHVpbnQ4X3QgY2gpIHsKLSAgaWYgKGNoID49IDB4MzApIHsKLSAgICBpZiAoY2ggPT0ga0pTT05CYWNrc2xhc2gpIHsgLy8gT25seSBzcGVjaWFsIGNoYXJhY3RlciA+PSAweDMwIGlzICdcJwotICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOwotICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIHVpbnQ4X3Qgb3V0Q2ggPSBrSlNPTkNoYXJUYWJsZVtjaF07Ci0gICAgLy8gQ2hlY2sgaWYgcmVndWxhciBjaGFyYWN0ZXIsIGJhY2tzbGFzaCBlc2NhcGVkLCBvciBKU09OIGVzY2FwZWQKLSAgICBpZiAob3V0Q2ggPT0gMSkgewotICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKG91dENoID4gMSkgewotICAgICAgdHJhbnNfLT53cml0ZSgma0pTT05CYWNrc2xhc2gsIDEpOwotICAgICAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcmV0dXJuIHdyaXRlSlNPTkVzY2FwZUNoYXIoY2gpOwotICAgIH0KLSAgfQotfQotCi0vLyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgc3RyIGFzIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nCi0vLyBjaGFyYWN0ZXJzIGFzIGFwcHJvcHJpYXRlLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICByZXN1bHQgKz0gMjsgLy8gRm9yIHF1b3RlcwotICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdGVyKHN0ci5iZWdpbigpKTsKLSAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGVuZChzdHIuZW5kKCkpOwotICB3aGlsZSAoaXRlciAhPSBlbmQpIHsKLSAgICByZXN1bHQgKz0gd3JpdGVKU09OQ2hhcigqaXRlcisrKTsKLSAgfQotICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIFdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBhcyBKU09OIHN0cmluZywgYmFzZTY0LWVuY29kaW5nCi0vLyB0aGUgc3RyaW5nJ3MgY29udGVudHMsIGFuZCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICByZXN1bHQgKz0gMjsgLy8gRm9yIHF1b3RlcwotICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gIHVpbnQ4X3QgYls0XTsKLSAgY29uc3QgdWludDhfdCAqYnl0ZXMgPSAoY29uc3QgdWludDhfdCAqKXN0ci5jX3N0cigpOwotICB1aW50MzJfdCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gIHdoaWxlIChsZW4gPj0gMykgewotICAgIC8vIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQotICAgIGJhc2U2NF9lbmNvZGUoYnl0ZXMsIDMsIGIpOwotICAgIHRyYW5zXy0+d3JpdGUoYiwgNCk7Ci0gICAgcmVzdWx0ICs9IDQ7Ci0gICAgYnl0ZXMgKz0gMzsKLSAgICBsZW4gLT0zOwotICB9Ci0gIGlmIChsZW4pIHsgLy8gSGFuZGxlIHJlbWFpbmRlcgotICAgIGJhc2U2NF9lbmNvZGUoYnl0ZXMsIGxlbiwgYik7Ci0gICAgdHJhbnNfLT53cml0ZShiLCBsZW4gKyAxKTsKLSAgICByZXN1bHQgKz0gbGVuICsgMTsKLSAgfQotICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIENvbnZlcnQgdGhlIGdpdmVuIGludGVnZXIgdHlwZSB0byBhIEpTT04gbnVtYmVyLCBvciBhIHN0cmluZwotLy8gaWYgdGhlIGNvbnRleHQgcmVxdWlyZXMgaXQgKGVnOiBrZXkgaW4gYSBtYXAgcGFpcikuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICBzdGQ6OnN0cmluZyB2YWwoYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obnVtKSk7Ci0gIGJvb2wgZXNjYXBlTnVtID0gY29udGV4dF8tPmVzY2FwZU51bSgpOwotICBpZiAoZXNjYXBlTnVtKSB7Ci0gICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwotICAgIHJlc3VsdCArPSAxOwotICB9Ci0gIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QgKil2YWwuY19zdHIoKSwgdmFsLmxlbmd0aCgpKTsKLSAgcmVzdWx0ICs9IHZhbC5sZW5ndGgoKTsKLSAgaWYgKGVzY2FwZU51bSkgewotICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgICByZXN1bHQgKz0gMTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBDb252ZXJ0IHRoZSBnaXZlbiBkb3VibGUgdG8gYSBKU09OIHN0cmluZywgd2hpY2ggaXMgZWl0aGVyIHRoZSBudW1iZXIsCi0vLyAiTmFOIiBvciAiSW5maW5pdHkiIG9yICItSW5maW5pdHkiLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICBzdGQ6OnN0cmluZyB2YWwoYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obnVtKSk7Ci0KLSAgLy8gTm9ybWFsaXplIG91dHB1dCBvZiBib29zdDo6bGV4aWNhbF9jYXN0IGZvciBOYU5zIGFuZCBJbmZpbml0aWVzCi0gIGJvb2wgc3BlY2lhbCA9IGZhbHNlOwotICBzd2l0Y2ggKHZhbFswXSkgewotICBjYXNlICdOJzoKLSAgY2FzZSAnbic6Ci0gICAgdmFsID0ga1RocmlmdE5hbjsKLSAgICBzcGVjaWFsID0gdHJ1ZTsKLSAgICBicmVhazsKLSAgY2FzZSAnSSc6Ci0gIGNhc2UgJ2knOgotICAgIHZhbCA9IGtUaHJpZnRJbmZpbml0eTsKLSAgICBzcGVjaWFsID0gdHJ1ZTsKLSAgICBicmVhazsKLSAgY2FzZSAnLSc6Ci0gICAgaWYgKCh2YWxbMV0gPT0gJ0knKSB8fCAodmFsWzFdID09ICdpJykpIHsKLSAgICAgIHZhbCA9IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5OwotICAgICAgc3BlY2lhbCA9IHRydWU7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgYm9vbCBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHRfLT5lc2NhcGVOdW0oKTsKLSAgaWYgKGVzY2FwZU51bSkgewotICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKLSAgICByZXN1bHQgKz0gMTsKLSAgfQotICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90ICopdmFsLmNfc3RyKCksIHZhbC5sZW5ndGgoKSk7Ci0gIHJlc3VsdCArPSB2YWwubGVuZ3RoKCk7Ci0gIGlmIChlc2NhcGVOdW0pIHsKLSAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7Ci0gICAgcmVzdWx0ICs9IDE7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OT2JqZWN0U3RhcnQoKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKLSAgdHJhbnNfLT53cml0ZSgma0pTT05PYmplY3RTdGFydCwgMSk7Ci0gIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7Ci0gIHJldHVybiByZXN1bHQgKyAxOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05PYmplY3RFbmQoKSB7Ci0gIHBvcENvbnRleHQoKTsKLSAgdHJhbnNfLT53cml0ZSgma0pTT05PYmplY3RFbmQsIDEpOwotICByZXR1cm4gMTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQXJyYXlTdGFydCgpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICB0cmFuc18tPndyaXRlKCZrSlNPTkFycmF5U3RhcnQsIDEpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOwotICByZXR1cm4gcmVzdWx0ICsgMTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQXJyYXlFbmQoKSB7Ci0gIHBvcENvbnRleHQoKTsKLSAgdHJhbnNfLT53cml0ZSgma0pTT05BcnJheUVuZCwgMSk7Ci0gIHJldHVybiAxOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihrVGhyaWZ0VmVyc2lvbjEpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKG5hbWUpOwotICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlVHlwZSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKHNlcWlkKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgewotICByZXR1cm4gd3JpdGVKU09OQXJyYXlFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gIHJldHVybiB3cml0ZUpTT05PYmplY3RTdGFydCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdEVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkludGVnZXIoZmllbGRJZCk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05PYmplY3RTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkVHlwZSkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUZpZWxkRW5kKCkgewotICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChrZXlUeXBlKSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQodmFsVHlwZSkpOwotICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgewotICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCkgKyB3cml0ZUpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGVsZW1UeXBlKSk7Ci0gIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChlbGVtVHlwZSkpOwotICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTZXRFbmQoKSB7Ci0gIHJldHVybiB3cml0ZUpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcih2YWx1ZSk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICAvLyB3cml0ZUJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5IGJlY3Vhc2UgYm9vc3Q6OmxleGljYWwgY2FzdCBzZWVzCi0gIC8vIGludDhfdCBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQotICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcigoaW50MTZfdClieXRlKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTE2KTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTMyKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTY0KTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICByZXR1cm4gd3JpdGVKU09ORG91YmxlKGR1Yik7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTlN0cmluZyhzdHIpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiB3cml0ZUpTT05CYXNlNjQoc3RyKTsKLX0KLQotICAvKioKLSAgICogUmVhZGluZyBmdW5jdGlvbnMKLSAgICovCi0KLS8vIFJlYWRzIDEgYnl0ZSBhbmQgdmVyaWZpZXMgdGhhdCBpdCBtYXRjaGVzIGNoLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TeW50YXhDaGFyKHVpbnQ4X3QgY2gpIHsKLSAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlcl8sIGNoKTsKLX0KLQotLy8gRGVjb2RlcyB0aGUgZm91ciBoZXggcGFydHMgb2YgYSBKU09OIGVzY2FwZWQgc3RyaW5nIGNoYXJhY3RlciBhbmQgcmV0dXJucwotLy8gdGhlIGNoYXJhY3RlciB2aWEgb3V0LiBUaGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgbXVzdCBiZSAiMDAiLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgKm91dCkgewotICB1aW50OF90IGJbMl07Ci0gIHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlplcm9DaGFyKTsKLSAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OWmVyb0NoYXIpOwotICBiWzBdID0gcmVhZGVyXy5yZWFkKCk7Ci0gIGJbMV0gPSByZWFkZXJfLnJlYWQoKTsKLSAgKm91dCA9IChoZXhWYWwoYlswXSkgPDwgNCkgKyBoZXhWYWwoYlsxXSk7Ci0gIHJldHVybiA0OwotfQotCi0vLyBEZWNvZGVzIGEgSlNPTiBzdHJpbmcsIGluY2x1ZGluZyB1bmVzY2FwaW5nLCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHZpYSBzdHIKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OU3RyaW5nKHN0ZDo6c3RyaW5nICZzdHIsIGJvb2wgc2tpcENvbnRleHQpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gKHNraXBDb250ZXh0ID8gMCA6IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7Ci0gIHVpbnQ4X3QgY2g7Ci0gIHN0ci5jbGVhcigpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7Ci0gICAgKytyZXN1bHQ7Ci0gICAgaWYgKGNoID09IGtKU09OU3RyaW5nRGVsaW1pdGVyKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGNoID09IGtKU09OQmFja3NsYXNoKSB7Ci0gICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOwotICAgICAgKytyZXN1bHQ7Ci0gICAgICBpZiAoY2ggPT0ga0pTT05Fc2NhcGVDaGFyKSB7Ci0gICAgICAgIHJlc3VsdCArPSByZWFkSlNPTkVzY2FwZUNoYXIoJmNoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzaXplX3QgcG9zID0ga0VzY2FwZUNoYXJzLmZpbmQoY2gpOwotICAgICAgICBpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygoY29uc3QgY2hhciAqKSZjaCwgMSkgICsgIicuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2ggPSBrRXNjYXBlQ2hhclZhbHNbcG9zXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3RyICs9IGNoOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIFJlYWRzIGEgYmxvY2sgb2YgYmFzZTY0IGNoYXJhY3RlcnMsIGRlY29kaW5nIGl0LCBhbmQgcmV0dXJucyB2aWEgc3RyCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyAmc3RyKSB7Ci0gIHN0ZDo6c3RyaW5nIHRtcDsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05TdHJpbmcodG1wKTsKLSAgdWludDhfdCAqYiA9ICh1aW50OF90ICopdG1wLmNfc3RyKCk7Ci0gIHVpbnQzMl90IGxlbiA9IHRtcC5sZW5ndGgoKTsKLSAgc3RyLmNsZWFyKCk7Ci0gIHdoaWxlIChsZW4gPj0gNCkgewotICAgIGJhc2U2NF9kZWNvZGUoYiwgNCk7Ci0gICAgc3RyLmFwcGVuZCgoY29uc3QgY2hhciAqKWIsIDMpOwotICAgIGIgKz0gNDsKLSAgICBsZW4gLT0gNDsKLSAgfQotICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKLSAgLy8gYmFzZTY0IGJ1dCBsZWdhbCBmb3Igc2tpcCBvZiByZWd1bGFyIHN0cmluZyB0eXBlKQotICBpZiAobGVuID4gMSkgewotICAgIGJhc2U2NF9kZWNvZGUoYiwgbGVuKTsKLSAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyICopYiwgbGVuIC0gMSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCBzdG9wcGluZyBhdCB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgbm90Ci0vLyBhIHZhbGlkIEpTT04gbnVtZXJpYyBjaGFyYWN0ZXIuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk51bWVyaWNDaGFycyhzdGQ6OnN0cmluZyAmc3RyKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIHN0ci5jbGVhcigpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIHVpbnQ4X3QgY2ggPSByZWFkZXJfLnBlZWsoKTsKLSAgICBpZiAoIWlzSlNPTk51bWVyaWMoY2gpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcmVhZGVyXy5yZWFkKCk7Ci0gICAgc3RyICs9IGNoOwotICAgICsrcmVzdWx0OwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhbmQgYXNzZW1ibGVzIHRoZW0gaW50byBhIG51bWJlciwKLS8vIHJldHVybmluZyB0aGVtIHZpYSBudW0KLXRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUgJm51bSkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKLSAgaWYgKGNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOwotICB9Ci0gIHN0ZDo6c3RyaW5nIHN0cjsKLSAgcmVzdWx0ICs9IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0cik7Ci0gIHRyeSB7Ci0gICAgbnVtID0gYm9vc3Q6OmxleGljYWxfY2FzdDxOdW1iZXJUeXBlPihzdHIpOwotICB9Ci0gIGNhdGNoIChib29zdDo6YmFkX2xleGljYWxfY2FzdCBlKSB7Ci0gICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKTsKLSAgfQotICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gUmVhZHMgYSBKU09OIG51bWJlciBvciBzdHJpbmcgYW5kIGludGVycHJldHMgaXQgYXMgYSBkb3VibGUuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkRvdWJsZShkb3VibGUgJm51bSkgewotICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKLSAgc3RkOjpzdHJpbmcgc3RyOwotICBpZiAocmVhZGVyXy5wZWVrKCkgPT0ga0pTT05TdHJpbmdEZWxpbWl0ZXIpIHsKLSAgICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcoc3RyLCB0cnVlKTsKLSAgICAvLyBDaGVjayBmb3IgTmFOLCBJbmZpbml0eSBhbmQgLUluZmluaXR5Ci0gICAgaWYgKHN0ciA9PSBrVGhyaWZ0TmFuKSB7Ci0gICAgICBudW0gPSBIVUdFX1ZBTC9IVUdFX1ZBTDsgLy8gZ2VuZXJhdGVzIE5hTgotICAgIH0KLSAgICBlbHNlIGlmIChzdHIgPT0ga1RocmlmdEluZmluaXR5KSB7Ci0gICAgICBudW0gPSBIVUdFX1ZBTDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyID09IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5KSB7Ci0gICAgICBudW0gPSAtSFVHRV9WQUw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaWYgKCFjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCi0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBudW0gPSBib29zdDo6bGV4aWNhbF9jYXN0PGRvdWJsZT4oc3RyKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChib29zdDo6YmFkX2xleGljYWxfY2FzdCBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIpOwotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQotICAgICAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0cik7Ci0gICAgdHJ5IHsKLSAgICAgIG51bSA9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8ZG91YmxlPihzdHIpOwotICAgIH0KLSAgICBjYXRjaCAoYm9vc3Q6OmJhZF9sZXhpY2FsX2Nhc3QgZSkgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05PYmplY3RTdGFydCgpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05PYmplY3RTdGFydCk7Ci0gIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OT2JqZWN0RW5kKCkgewotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05PYmplY3RFbmQpOwotICBwb3BDb250ZXh0KCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQXJyYXlTdGFydCgpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05BcnJheVN0YXJ0KTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05BcnJheUVuZCgpIHsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OQXJyYXlFbmQpOwotICBwb3BDb250ZXh0KCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOwotICB1aW50NjRfdCB0bXBWYWwgPSAwOwotICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIGlmICh0bXBWYWwgIT0ga1RocmlmdFZlcnNpb24xKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKLSAgfQotICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcobmFtZSk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKXRtcFZhbDsKLSAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBzZXFpZCA9IHRtcFZhbDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICByZXR1cm4gcmVhZEpTT05PYmplY3RTdGFydCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU3RydWN0RW5kKCkgewotICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAvLyBDaGVjayBpZiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotICB1aW50OF90IGNoID0gcmVhZGVyXy5wZWVrKCk7Ci0gIGlmIChjaCA9PSBrSlNPTk9iamVjdEVuZCkgewotICAgIGZpZWxkVHlwZSA9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QOwotICB9Ci0gIGVsc2UgewotICAgIHVpbnQ2NF90IHRtcFZhbCA9IDA7Ci0gICAgc3RkOjpzdHJpbmcgdG1wU3RyOwotICAgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgICBmaWVsZElkID0gdG1wVmFsOwotICAgIHJlc3VsdCArPSByZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7Ci0gICAgZmllbGRUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkRmllbGRFbmQoKSB7Ci0gIHJldHVybiByZWFkSlNPTk9iamVjdEVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgdWludDY0X3QgdG1wVmFsID0gMDsKLSAgc3RkOjpzdHJpbmcgdG1wU3RyOwotICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKLSAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7Ci0gIGtleVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOwotICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKLSAgdmFsVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7Ci0gIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgc2l6ZSA9IHRtcFZhbDsKLSAgcmVzdWx0ICs9IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1hcEVuZCgpIHsKLSAgcmV0dXJuIHJlYWRKU09OT2JqZWN0RW5kKCkgKyByZWFkSlNPTkFycmF5RW5kKCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICB1aW50NjRfdCB0bXBWYWwgPSAwOwotICBzdGQ6OnN0cmluZyB0bXBTdHI7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OQXJyYXlTdGFydCgpOwotICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKLSAgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOwotICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIHNpemUgPSB0bXBWYWw7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRMaXN0RW5kKCkgewotICByZXR1cm4gcmVhZEpTT05BcnJheUVuZCgpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gIHVpbnQ2NF90IHRtcFZhbCA9IDA7Ci0gIHN0ZDo6c3RyaW5nIHRtcFN0cjsKLSAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwotICBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7Ci0gIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgc2l6ZSA9IHRtcFZhbDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFNldEVuZCgpIHsKLSAgcmV0dXJuIHJlYWRKU09OQXJyYXlFbmQoKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcih2YWx1ZSk7Ci19Ci0KLS8vIHJlYWRCeXRlKCkgbXVzdCBiZSBoYW5kbGVkIHByb3Blcmx5IGJlY3Vhc2UgYm9vc3Q6OmxleGljYWwgY2FzdCBzZWVzIGludDhfdAotLy8gYXMgYSB0ZXh0IHR5cGUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyIHR5cGUKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICBpbnQxNl90IHRtcCA9IChpbnQxNl90KSBieXRlOwotICB1aW50MzJfdCByZXN1bHQgPSAgcmVhZEpTT05JbnRlZ2VyKHRtcCk7Ci0gIGFzc2VydCh0bXAgPCAyNTYpOwotICBieXRlID0gKGludDhfdCl0bXA7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRJMTYoaW50MTZfdCYgaTE2KSB7Ci0gIHJldHVybiByZWFkSlNPTkludGVnZXIoaTE2KTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcihpMzIpOwotfQotCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSTY0KGludDY0X3QmIGk2NCkgewotICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKGk2NCk7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgcmV0dXJuIHJlYWRKU09ORG91YmxlKGR1Yik7Ci19Ci0KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcgJnN0cikgewotICByZXR1cm4gcmVhZEpTT05TdHJpbmcoc3RyKTsKLX0KLQotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyAmc3RyKSB7Ci0gIHJldHVybiByZWFkSlNPTkJhc2U2NChzdHIpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjQ5OWEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9USlNPTlBST1RPQ09MX0hfIDEKLQotI2luY2x1ZGUgIlRQcm90b2NvbC5oIgotCi0jaW5jbHVkZSA8c3RhY2s+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbgotY2xhc3MgVEpTT05Db250ZXh0OwotCi0vKioKLSAqIEpTT04gcHJvdG9jb2wgZm9yIFRocmlmdC4KLSAqCi0gKiBJbXBsZW1lbnRzIGEgcHJvdG9jb2wgd2hpY2ggdXNlcyBKU09OIGFzIHRoZSB3aXJlLWZvcm1hdC4KLSAqCi0gKiBUaHJpZnQgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGFzIGRlc2NyaWJlZCBiZWxvdzoKLSAqCi0gKiAxLiBFdmVyeSBUaHJpZnQgaW50ZWdlciB0eXBlIGlzIHJlcHJlc2VudGVkIGFzIGEgSlNPTiBudW1iZXIuCi0gKgotICogMi4gVGhyaWZ0IGRvdWJsZXMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gbnVtYmVycy4gU29tZSBzcGVjaWFsIHZhbHVlcyBhcmUKLSAqICAgIHJlcHJlc2VudGVkIGFzIHN0cmluZ3M6Ci0gKiAgICBhLiAiTmFOIiBmb3Igbm90LWEtbnVtYmVyIHZhbHVlcwotICogICAgYi4gIkluZmluaXR5IiBmb3IgcG9zdGl2ZSBpbmZpbml0eQotICogICAgYy4gIi1JbmZpbml0eSIgZm9yIG5lZ2F0aXZlIGluZmluaXR5Ci0gKgotICogMy4gVGhyaWZ0IHN0cmluZyB2YWx1ZXMgYXJlIGVtaXR0ZWQgYXMgSlNPTiBzdHJpbmdzLCB3aXRoIGFwcHJvcHJpYXRlCi0gKiAgICBlc2NhcGluZy4KLSAqCi0gKiA0LiBUaHJpZnQgYmluYXJ5IHZhbHVlcyBhcmUgZW5jb2RlZCBpbnRvIEJhc2U2NCBhbmQgZW1pdHRlZCBhcyBKU09OIHN0cmluZ3MuCi0gKiAgICBUaGUgcmVhZEJpbmFyeSgpIG1ldGhvZCBpcyB3cml0dGVuIHN1Y2ggdGhhdCBpdCB3aWxsIHByb3Blcmx5IHNraXAgaWYKLSAqICAgIGNhbGxlZCBvbiBhIFRocmlmdCBzdHJpbmcgKGFsdGhvdWdoIGl0IHdpbGwgZGVjb2RlIGdhcmJhZ2UgZGF0YSkuCi0gKgotICogNS4gVGhyaWZ0IHN0cnVjdHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gb2JqZWN0cywgd2l0aCB0aGUgZmllbGQgSUQgYXMgdGhlCi0gKiAgICBrZXksIGFuZCB0aGUgZmllbGQgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYSBKU09OIG9iamVjdCB3aXRoIGEgc2luZ2xlCi0gKiAgICBrZXktdmFsdWUgcGFpci4gVGhlIGtleSBpcyBhIHNob3J0IHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGF0IHR5cGUsCi0gKiAgICBmb2xsb3dlZCBieSB0aGUgdmFsdWUuIFRoZSB2YWxpZCB0eXBlIGlkZW50aWZpZXJzIGFyZTogInRmIiBmb3IgYm9vbCwKLSAqICAgICJpOCIgZm9yIGJ5dGUsICJpMTYiIGZvciAxNi1iaXQgaW50ZWdlciwgImkzMiIgZm9yIDMyLWJpdCBpbnRlZ2VyLCAiaTY0IgotICogICAgZm9yIDY0LWJpdCBpbnRlZ2VyLCAiZGJsIiBmb3IgZG91YmxlLXByZWNpc2lvbiBsb2F0aW5nIHBvaW50LCAic3RyIiBmb3IKLSAqICAgIHN0cmluZyAoaW5jbHVkaW5nIGJpbmFyeSksICJyZWMiIGZvciBzdHJ1Y3QgKCJyZWNvcmRzIiksICJtYXAiIGZvciBtYXAsCi0gKiAgICAibHN0IiBmb3IgbGlzdCwgInNldCIgZm9yIHNldC4KLSAqCi0gKiA2LiBUaHJpZnQgbGlzdHMgYW5kIHNldHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gYXJyYXlzLCB3aXRoIHRoZSBmaXJzdAotICogICAgZWxlbWVudCBvZiB0aGUgSlNPTiBhcnJheSBiZWluZyB0aGUgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBUaHJpZnQKLSAqICAgIGVsZW1lbnQgdHlwZSBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBKU09OIGFycmF5IGJlaW5nIHRoZSBjb3VudCBvZgotICogICAgdGhlIFRocmlmdCBlbGVtZW50cy4gVGhlIFRocmlmdCBlbGVtZW50cyB0aGVuIGZvbGxvdy4KLSAqCi0gKiA3LiBUaHJpZnQgbWFwcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIGZpcnN0IHR3byBlbGVtZW50cwotICogICAgb2YgdGhlIEpTT04gYXJyYXkgYmVpbmcgdGhlIHN0cmluZyBpZGVudGlmaWVycyBmb3IgdGhlIFRocmlmdCBrZXkgdHlwZQotICogICAgYW5kIHZhbHVlIHR5cGUsIGZvbGxvd2VkIGJ5IHRoZSBjb3VudCBvZiB0aGUgVGhyaWZ0IHBhaXJzLCBmb2xsb3dlZCBieSBhCi0gKiAgICBKU09OIG9iamVjdCBjb250YWluaW5nIHRoZSBrZXktdmFsdWUgcGFpcnMuIE5vdGUgdGhhdCBKU09OIGtleXMgY2FuIG9ubHkKLSAqICAgIGJlIHN0cmluZ3MsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGtleSB0eXBlIG9mIHRoZSBUaHJpZnQgbWFwIHNob3VsZCBiZQotICogICAgcmVzdHJpY3RlZCB0byBudW1lcmljIG9yIHN0cmluZyB0eXBlcyAtLSBpbiB0aGUgY2FzZSBvZiBudW1lcmljcywgdGhleQotICogICAgYXJlIHNlcmlhbGl6ZWQgYXMgc3RyaW5ncy4KLSAqCi0gKiA4LiBUaHJpZnQgbWVzc2FnZXMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gYXJyYXlzLCB3aXRoIHRoZSBwcm90b2NvbAotICogICAgdmVyc2lvbiAjLCB0aGUgbWVzc2FnZSBuYW1lLCB0aGUgbWVzc2FnZSB0eXBlLCBhbmQgdGhlIHNlcXVlbmNlIElEIGFzCi0gKiAgICB0aGUgZmlyc3QgNCBlbGVtZW50cy4KLSAqCi0gKiBNb3JlIGRpc2N1c3Npb24gb2YgdGhlIGRvdWJsZSBoYW5kbGluZyBpcyBwcm9iYWJseSB3YXJyYW50ZWQuIFRoZSBhaW0gb2YKLSAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRvIG1hdGNoIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgdGhlIGJlaGF2aW9yCi0gKiBvZiBKYXZhJ3MgRG91YmxlLnRvU3RyaW5nKCksIHdoaWNoIGhhcyBubyBwcmVjaXNpb24gbG9zcy4gIEltcGxlbWVudG9ycyBpbgotICogb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBzdHJpdmUgdG8gYWNoaWV2ZSB0aGF0IHdoZXJlIHBvc3NpYmxlLiBJIGhhdmUgbm90Ci0gKiB5ZXQgdmVyaWZpZWQgd2hldGhlciBib29zdDpsZXhpY2FsX2Nhc3QsIHdoaWNoIGlzIGRvaW5nIHRoYXQgd29yayBmb3IgbWUgaW4KLSAqIEMrKywgbG9zZXMgYW55IHByZWNpc2lvbiwgYnV0IEkgYW0gbGVhdmluZyB0aGlzIGFzIGEgZnV0dXJlIGltcHJvdmVtZW50LiBJCi0gKiBtYXkgdHJ5IHRvIHByb3ZpZGUgYSBDIGNvbXBvbmVudCBmb3IgdGhpcywgc28gdGhhdCBvdGhlciBsYW5ndWFnZXMgY291bGQKLSAqIGJpbmQgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgbWF4aW11bSBjb25zaXN0ZW5jeS4KLSAqCi0gKiBOb3RlIGZ1cnRoZXIgdGhhdCBKYXZhU2NyaXB0IGl0c2VsZiBpcyBub3QgY2FwYWJsZSBvZiByZXByZXNlbnRpbmcKLSAqIGZsb2F0aW5nIHBvaW50IGluZmluaXRpZXMgLS0gcHJlc3VtYWJseSB3aGVuIHdlIGhhdmUgYSBKYXZhU2NyaXB0IFRocmlmdAotICogY2xpZW50LCB0aGlzIHdvdWxkIG1lYW4gdGhhdCBpbmZpbml0aWVzIGdldCBjb252ZXJ0ZWQgdG8gbm90LWEtbnVtYmVyIGluCi0gKiB0cmFuc21pc3Npb24uIEkgZG9uJ3Qga25vdyBvZiBhbnkgd29yay1hcm91bmQgZm9yIHRoaXMgaXNzdWUuCi0gKgotICovCi1jbGFzcyBUSlNPTlByb3RvY29sIDogcHVibGljIFRQcm90b2NvbCB7Ci0gcHVibGljOgotCi0gIFRKU09OUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKTsKLQotICB+VEpTT05Qcm90b2NvbCgpOwotCi0gcHJpdmF0ZToKLQotICB2b2lkIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7Ci0KLSAgdm9pZCBwb3BDb250ZXh0KCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVKU09ORXNjYXBlQ2hhcih1aW50OF90IGNoKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05DaGFyKHVpbnQ4X3QgY2gpOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cik7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Ci0gIHVpbnQzMl90IHdyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pOwotCi0gIHVpbnQzMl90IHdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RTdGFydCgpIDsKLQotICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVKU09OQXJyYXlFbmQoKTsKLQotICB1aW50MzJfdCByZWFkSlNPTlN5bnRheENoYXIodWludDhfdCBjaCk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgKm91dCk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcgJnN0ciwgYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKTsKLQotICB1aW50MzJfdCByZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB1aW50MzJfdCByZWFkSlNPTk51bWVyaWNDaGFycyhzdGQ6OnN0cmluZyAmc3RyKTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KLSAgdWludDMyX3QgcmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUgJm51bSk7Ci0KLSAgdWludDMyX3QgcmVhZEpTT05Eb3VibGUoZG91YmxlICZudW0pOwotCi0gIHVpbnQzMl90IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLQotICB1aW50MzJfdCByZWFkSlNPTk9iamVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OQXJyYXlTdGFydCgpOwotCi0gIHVpbnQzMl90IHJlYWRKU09OQXJyYXlFbmQoKTsKLQotIHB1YmxpYzoKLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7Ci0KLSAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpOwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpOwotCi0gIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRFbmQoKTsKLQotICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7Ci0KLSAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKLQotICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7Ci0KLSAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOwotCi0gIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKLQotICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKLQotICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKLQotICAgcHVibGljOgotCi0gICAgTG9va2FoZWFkUmVhZGVyKFRUcmFuc3BvcnQgJnRyYW5zKSA6Ci0gICAgICB0cmFuc18oJnRyYW5zKSwKLSAgICAgIGhhc0RhdGFfKGZhbHNlKSB7Ci0gICAgfQotCi0gICAgdWludDhfdCByZWFkKCkgewotICAgICAgaWYgKGhhc0RhdGFfKSB7Ci0gICAgICAgIGhhc0RhdGFfID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgdHJhbnNfLT5yZWFkQWxsKCZkYXRhXywgMSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZGF0YV87Ci0gICAgfQotCi0gICAgdWludDhfdCBwZWVrKCkgewotICAgICAgaWYgKCFoYXNEYXRhXykgewotICAgICAgICB0cmFuc18tPnJlYWRBbGwoJmRhdGFfLCAxKTsKLSAgICAgIH0KLSAgICAgIGhhc0RhdGFfID0gdHJ1ZTsKLSAgICAgIHJldHVybiBkYXRhXzsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgVFRyYW5zcG9ydCAqdHJhbnNfOwotICAgIGJvb2wgaGFzRGF0YV87Ci0gICAgdWludDhfdCBkYXRhXzsKLSAgfTsKLQotIHByaXZhdGU6Ci0KLSAgc3RkOjpzdGFjazxib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+ID4gY29udGV4dHNfOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGNvbnRleHRfOwotICBMb29rYWhlYWRSZWFkZXIgcmVhZGVyXzsKLX07Ci0KLS8qKgotICogQ29uc3RydWN0cyBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sIG9iamVjdHMgZ2l2ZW4gdHJhbnNwb3J0cy4KLSAqLwotY2xhc3MgVEpTT05Qcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgotICBUSlNPTlByb3RvY29sRmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCB+VEpTT05Qcm90b2NvbEZhY3RvcnkoKSB7fQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVEpTT05Qcm90b2NvbCh0cmFucykpOwotICB9Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLQotLy8gVE9ETyhkcmVpc3MpOiBNb3ZlIHBhcnQgb2YgVGhyaWZ0SlNPTlN0cmluZyBpbnRvIGEgLmNwcCBmaWxlIGFuZCByZW1vdmUgdGhpcy4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUaHJpZnRTdHJ1Y3Q+Ci0gIHN0ZDo6c3RyaW5nIFRocmlmdEpTT05TdHJpbmcoY29uc3QgVGhyaWZ0U3RydWN0JiB0cykgewotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLSAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7Ci0gIFRKU09OUHJvdG9jb2wgcHJvdG9jb2wodHJhbnMpOwotCi0gIHRzLndyaXRlKCZwcm90b2NvbCk7Ci0KLSAgdWludDhfdCogYnVmOwotICB1aW50MzJfdCBzaXplOwotICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOwotfQotCi19fSAvLyBhcGFjaGU6OnRocmlmdAotCi0jZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVE9uZVdheVByb3RvY29sLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UT25lV2F5UHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOGZlMS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UT25lV2F5UHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UT05FV0FZUFJPVE9DT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UT05FV0FZUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVFByb3RvY29sLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIGEgcHJvdG9jb2wgdGhhdCBjYW4gb25seSBiZSB3cml0dGVuLAotICogbm90IHJlYWQuCi0gKgotICovCi1jbGFzcyBUV3JpdGVPbmx5UHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBAcGFyYW0gc3ViY2xhc3NfbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGNvbmNyZXRlIHN1YmNsYXNzLgotICAgKi8KLSAgVFdyaXRlT25seVByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1YmNsYXNzX25hbWUpCi0gICAgOiBUUHJvdG9jb2wodHJhbnMpCi0gICAgLCBzdWJjbGFzc18oc3ViY2xhc3NfbmFtZSkKLSAge30KLQotICAvLyBBbGwgd3JpdGluZyBmdW5jdGlvbnMgcmVtYWluIGFic3RyYWN0LgotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucyBhbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgKi8KLQotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkRmllbGRFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZE1hcEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU2V0RW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgc3ViY2xhc3NfOwotfTsKLQotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgYSBwcm90b2NvbCB0aGF0IGNhbiBvbmx5IGJlIHJlYWQsCi0gKiBub3Qgd3JpdHRlbi4KLSAqCi0gKi8KLWNsYXNzIFRSZWFkT25seVByb3RvY29sIDogcHVibGljIFRQcm90b2NvbCB7Ci0gcHVibGljOgotICAvKioKLSAgICogQHBhcmFtIHN1YmNsYXNzX25hbWUgIFRoZSBuYW1lIG9mIHRoZSBjb25jcmV0ZSBzdWJjbGFzcy4KLSAgICovCi0gIFRSZWFkT25seVByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3ViY2xhc3NfbmFtZSkKLSAgICA6IFRQcm90b2NvbCh0cmFucykKLSAgICAsIHN1YmNsYXNzXyhzdWJjbGFzc19uYW1lKQotICB7fQotCi0gIC8vIEFsbCByZWFkaW5nIGZ1bmN0aW9ucyByZW1haW4gYWJzdHJhY3QuCi0KLSAgLyoqCi0gICAqIFdyaXRpbmcgZnVuY3Rpb25zIGFsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAqLwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotCi0gIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgc3ViY2xhc3NfICsgIiBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7Ci0gIH0KLQotICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICBzdWJjbGFzc18gKyAiIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKLSAgfQotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgIHN1YmNsYXNzXyArICIgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBzdWJjbGFzc187Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCi0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDdiMDY1Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXyAxCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oPgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+Ci0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPG1hcD4KLQotCi0vLyBVc2UgdGhpcyB0byBnZXQgYXJvdW5kIHN0cmljdCBhbGlhc2luZyBydWxlcy4KLS8vIEZvciBleGFtcGxlLCB1aW50NjRfdCBpID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihyZXR1cm5zX2RvdWJsZSgpKTsKLS8vIFRoZSBtb3N0IG9idmlvdXMgaW1wbGVtZW50YXRpb24gaXMgdG8ganVzdCBjYXN0IGEgcG9pbnRlciwKLS8vIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yay4KLS8vIEZvciBhIHByZXR0eSBpbi1kZXB0aCBleHBsYW5hdGlvbiBvZiB0aGUgcHJvYmxlbSwgc2VlCi0vLyBodHRwOi8vd3d3LmNlbGxwZXJmb3JtYW5jZS5jb20vbWlrZV9hY3Rvbi8yMDA2LzA2LyAoLi4uKQotLy8gdW5kZXJzdGFuZGluZ19zdHJpY3RfYWxpYXNpbmcuaHRtbAotdGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgotc3RhdGljIGlubGluZSBUbyBiaXR3aXNlX2Nhc3QoRnJvbSBmcm9tKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKEZyb20pID09IHNpemVvZihUbykpOwotCi0gIC8vIEJBRCEhISAgVGhlc2UgYXJlIGFsbCBicm9rZW4gd2l0aCAtTzIuCi0gIC8vcmV0dXJuICpyZWludGVycHJldF9jYXN0PFRvKj4oJmZyb20pOyAgLy8gQkFEISEhCi0gIC8vcmV0dXJuICpzdGF0aWNfY2FzdDxUbyo+KHN0YXRpY19jYXN0PHZvaWQqPigmZnJvbSkpOyAgLy8gQkFEISEhCi0gIC8vcmV0dXJuICooVG8qKSh2b2lkKikmZnJvbTsgIC8vIEJBRCEhIQotCi0gIC8vIFN1cGVyIGNsZWFuIGFuZCBwYXJpdGFsbHkgYmxlc3NlZCBieSBzZWN0aW9uIDMuOSBvZiB0aGUgc3RhbmRhcmQuCi0gIC8vdW5zaWduZWQgY2hhciBjW3NpemVvZihmcm9tKV07Ci0gIC8vbWVtY3B5KGMsICZmcm9tLCBzaXplb2YoZnJvbSkpOwotICAvL1RvIHRvOwotICAvL21lbWNweSgmdG8sIGMsIHNpemVvZihjKSk7Ci0gIC8vcmV0dXJuIHRvOwotCi0gIC8vIFNsaWdodGx5IG1vcmUgcXVlc3Rpb25hYmxlLgotICAvLyBTYW1lIGNvZGUgZW1pdHRlZCBieSBHQ0MuCi0gIC8vVG8gdG87Ci0gIC8vbWVtY3B5KCZ0bywgJmZyb20sIHNpemVvZihmcm9tKSk7Ci0gIC8vcmV0dXJuIHRvOwotCi0gIC8vIFRlY2huaWNhbGx5IHVuZGVmaW5lZCwgYnV0IGFsbW9zdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQsCi0gIC8vIGFuZCB0aGUgbW9zdCBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24uCi0gIHVuaW9uIHsKLSAgICBGcm9tIGY7Ci0gICAgVG8gdDsKLSAgfSB1OwotICB1LmYgPSBmcm9tOwotICByZXR1cm4gdS50OwotfQotCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKLQotI2lmZGVmIEhBVkVfRU5ESUFOX0gKLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9fQllURV9PUkRFUgotIyBpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoTElUVExFX0VORElBTikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKQotIyAgZGVmaW5lIF9fQllURV9PUkRFUiBCWVRFX09SREVSCi0jICBkZWZpbmUgX19MSVRUTEVfRU5ESUFOIExJVFRMRV9FTkRJQU4KLSMgIGRlZmluZSBfX0JJR19FTkRJQU4gQklHX0VORElBTgotIyBlbHNlCi0jICBpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgotIyAgZGVmaW5lIF9fQllURV9PUkRFUiBCT09TVF9CWVRFX09SREVSCi0jICBkZWZpbmUgX19MSVRUTEVfRU5ESUFOIEJPT1NUX0xJVFRMRV9FTkRJQU4KLSMgIGRlZmluZSBfX0JJR19FTkRJQU4gQk9PU1RfQklHX0VORElBTgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jICBkZWZpbmUgbnRvaGxsKG4pIChuKQotIyAgZGVmaW5lIGh0b25sbChuKSAobikKLSMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCi0jICBpbmNsdWRlIDxieXRlc3dhcC5oPgotIyAgZGVmaW5lIGh0b2xlbGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBsZXRvaGxsKG4pIGJzd2FwXzY0KG4pCi0jIGVsc2UgLyogR05VQyAmIEdMSUJDICovCi0jICBkZWZpbmUgYnN3YXBfNjQobikgXAotICAgICAgKCAoKChuKSAmIDB4ZmYwMDAwMDAwMDAwMDAwMHVsbCkgPj4gNTYpIFwKLSAgICAgIHwgKCgobikgJiAweDAwZmYwMDAwMDAwMDAwMDB1bGwpID4+IDQwKSBcCi0gICAgICB8ICgoKG4pICYgMHgwMDAwZmYwMDAwMDAwMDAwdWxsKSA+PiAyNCkgXAotICAgICAgfCAoKChuKSAmIDB4MDAwMDAwZmYwMDAwMDAwMHVsbCkgPj4gOCkgIFwKLSAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwZmYwMDAwMDB1bGwpIDw8IDgpICBcCi0gICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwZmYwMDAwdWxsKSA8PCAyNCkgXAotICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMDAwZmYwMHVsbCkgPDwgNDApIFwKLSAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDAwMDAwZmZ1bGwpIDw8IDU2KSApCi0jICBkZWZpbmUgaHRvbGVsbChuKSBic3dhcF82NChuKQotIyAgZGVmaW5lIGxldG9obGwobikgYnN3YXBfNjQobikKLSMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCi0jZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgaHRvbGVsbChuKSAobikKLSMgIGRlZmluZSBsZXRvaGxsKG4pIChuKQotIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKLSMgIGluY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jICBkZWZpbmUgbnRvaGxsKG4pIGJzd2FwXzY0KG4pCi0jICBkZWZpbmUgaHRvbmxsKG4pIGJzd2FwXzY0KG4pCi0jIGVsc2UgLyogR05VQyAmIEdMSUJDICovCi0jICBkZWZpbmUgbnRvaGxsKG4pICggKCgodW5zaWduZWQgbG9uZyBsb25nKW50b2hsKG4pKSA8PCAzMikgKyBudG9obChuID4+IDMyKSApCi0jICBkZWZpbmUgaHRvbmxsKG4pICggKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSApCi0jIGVuZGlmIC8qIEdOVUMgJiBHTElCQyAqLwotI2Vsc2UgLyogX19CWVRFX09SREVSICovCi0jIGVycm9yICJDYW4ndCBkZWZpbmUgaHRvbmxsIG9yIG50b2hsbCEiCi0jZW5kaWYKLQotLyoqCi0gKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbCBzdXBwb3J0cy4KLSAqIFRha2Ugc3BlY2lhbCBub3RlIG9mIHRoZSBUX0VORCB0eXBlIHdoaWNoIGlzIHVzZWQgc3BlY2lmaWNhbGx5IHRvIG1hcmsKLSAqIHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSBvZiBmaWVsZHMuCi0gKi8KLWVudW0gVFR5cGUgewotICBUX1NUT1AgICAgICAgPSAwLAotICBUX1ZPSUQgICAgICAgPSAxLAotICBUX0JPT0wgICAgICAgPSAyLAotICBUX0JZVEUgICAgICAgPSAzLAotICBUX0kwOCAgICAgICAgPSAzLAotICBUX0kxNiAgICAgICAgPSA2LAotICBUX0kzMiAgICAgICAgPSA4LAotICBUX1U2NCAgICAgICAgPSA5LAotICBUX0k2NCAgICAgICAgPSAxMCwKLSAgVF9ET1VCTEUgICAgID0gNCwKLSAgVF9TVFJJTkcgICAgID0gMTEsCi0gIFRfVVRGNyAgICAgICA9IDExLAotICBUX1NUUlVDVCAgICAgPSAxMiwKLSAgVF9NQVAgICAgICAgID0gMTMsCi0gIFRfU0VUICAgICAgICA9IDE0LAotICBUX0xJU1QgICAgICAgPSAxNSwKLSAgVF9VVEY4ICAgICAgID0gMTYsCi0gIFRfVVRGMTYgICAgICA9IDE3Ci19OwotCi0vKioKLSAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgbWVzc2FnZSB0eXBlcyB0aGF0IHRoZSBUaHJpZnQgcHJvdG9jb2wKLSAqIHN1cHBvcnRzLgotICovCi1lbnVtIFRNZXNzYWdlVHlwZSB7Ci0gIFRfQ0FMTCAgICAgICA9IDEsCi0gIFRfUkVQTFkgICAgICA9IDIsCi0gIFRfRVhDRVBUSU9OICA9IDMsCi0gIFRfT05FV0FZICAgICA9IDQKLX07Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIGEgdGhyaWZ0IHByb3RvY29sIGRyaXZlci4gVGhlc2UgYXJlIGFsbCB0aGUgbWV0aG9kcyB0aGF0Ci0gKiBhIHByb3RvY29sIG11c3QgaW1wbGVtZW50LiBFc3NlbnRpYWxseSwgdGhlcmUgbXVzdCBiZSBzb21lIHdheSBvZiByZWFkaW5nCi0gKiBhbmQgd3JpdGluZyBhbGwgdGhlIGJhc2UgdHlwZXMsIHBsdXMgYSBtZWNoYW5pc20gZm9yIHdyaXRpbmcgb3V0IHN0cnVjdHMKLSAqIHdpdGggaW5kZXhlZCBmaWVsZHMuCi0gKgotICogVFByb3RvY29sIG9iamVjdHMgc2hvdWxkIG5vdCBiZSBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIGVuY29kaW5nIGNvbnRleHRzLAotICogYXMgdGhleSBtYXkgbmVlZCB0byBtYWludGFpbiBpbnRlcm5hbCBzdGF0ZSBpbiBzb21lIHByb3RvY29scyAoaS5lLiBYTUwpLgotICogTm90ZSB0aGF0IGlzIGlzIGFjY2VwdGFibGUgZm9yIHRoZSBUUHJvdG9jb2wgbW9kdWxlIHRvIGRvIGl0cyBvd24gaW50ZXJuYWwKLSAqIGJ1ZmZlcmVkIHJlYWRzL3dyaXRlcyB0byB0aGUgdW5kZXJseWluZyBUVHJhbnNwb3J0IHdoZXJlIGFwcHJvcHJpYXRlIChpLmUuCi0gKiB3aGVuIHBhcnNpbmcgYW4gaW5wdXQgWE1MIHN0cmVhbSwgcmVhZGluZyBzaG91bGQgYmUgYmF0Y2hlZCByYXRoZXIgdGhhbgotICogbG9va2luZyBhaGVhZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyIGZvciBhIGNsb3NlIHRhZykuCi0gKgotICovCi1jbGFzcyBUUHJvdG9jb2wgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+VFByb3RvY29sKCkge30KLQotICAvKioKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpID0gMDsKLQotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgPSAwOwotCi0gIC8qKgotICAgKiBSZWFkaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0RW5kKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRFbmQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZCgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRFbmQoKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgPSAwOwotCi0gIHVpbnQzMl90IHJlYWRCb29sKHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgcmVmKSB7Ci0gICAgYm9vbCB2YWx1ZTsKLSAgICB1aW50MzJfdCBydiA9IHJlYWRCb29sKHZhbHVlKTsKLSAgICByZWYgPSB2YWx1ZTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhLgotICAgKi8KLSAgdWludDMyX3Qgc2tpcChUVHlwZSB0eXBlKSB7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBUX0JPT0w6Ci0gICAgICB7Ci0gICAgICAgIGJvb2wgYm9vbHY7Ci0gICAgICAgIHJldHVybiByZWFkQm9vbChib29sdik7Ci0gICAgICB9Ci0gICAgY2FzZSBUX0JZVEU6Ci0gICAgICB7Ci0gICAgICAgIGludDhfdCBieXRldjsKLSAgICAgICAgcmV0dXJuIHJlYWRCeXRlKGJ5dGV2KTsKLSAgICAgIH0KLSAgICBjYXNlIFRfSTE2OgotICAgICAgewotICAgICAgICBpbnQxNl90IGkxNjsKLSAgICAgICAgcmV0dXJuIHJlYWRJMTYoaTE2KTsKLSAgICAgIH0KLSAgICBjYXNlIFRfSTMyOgotICAgICAgewotICAgICAgICBpbnQzMl90IGkzMjsKLSAgICAgICAgcmV0dXJuIHJlYWRJMzIoaTMyKTsKLSAgICAgIH0KLSAgICBjYXNlIFRfSTY0OgotICAgICAgewotICAgICAgICBpbnQ2NF90IGk2NDsKLSAgICAgICAgcmV0dXJuIHJlYWRJNjQoaTY0KTsKLSAgICAgIH0KLSAgICBjYXNlIFRfRE9VQkxFOgotICAgICAgewotICAgICAgICBkb3VibGUgZHViOwotICAgICAgICByZXR1cm4gcmVhZERvdWJsZShkdWIpOwotICAgICAgfQotICAgIGNhc2UgVF9TVFJJTkc6Ci0gICAgICB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKLSAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoc3RyKTsKLSAgICAgIH0KLSAgICBjYXNlIFRfU1RSVUNUOgotICAgICAgewotICAgICAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOwotICAgICAgICBpbnQxNl90IGZpZDsKLSAgICAgICAgVFR5cGUgZnR5cGU7Ci0gICAgICAgIHJlc3VsdCArPSByZWFkU3RydWN0QmVnaW4obmFtZSk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgcmVzdWx0ICs9IHJlYWRGaWVsZEJlZ2luKG5hbWUsIGZ0eXBlLCBmaWQpOwotICAgICAgICAgIGlmIChmdHlwZSA9PSBUX1NUT1ApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXN1bHQgKz0gc2tpcChmdHlwZSk7Ci0gICAgICAgICAgcmVzdWx0ICs9IHJlYWRGaWVsZEVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSByZWFkU3RydWN0RW5kKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUX01BUDoKLSAgICAgIHsKLSAgICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgICAgVFR5cGUga2V5VHlwZTsKLSAgICAgICAgVFR5cGUgdmFsVHlwZTsKLSAgICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgICAgcmVzdWx0ICs9IHJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgIHJlc3VsdCArPSBza2lwKGtleVR5cGUpOwotICAgICAgICAgIHJlc3VsdCArPSBza2lwKHZhbFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSByZWFkTWFwRW5kKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUX1NFVDoKLSAgICAgIHsKLSAgICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgICAgVFR5cGUgZWxlbVR5cGU7Ci0gICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgIHJlc3VsdCArPSByZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgcmVzdWx0ICs9IHNraXAoZWxlbVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSByZWFkU2V0RW5kKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUX0xJU1Q6Ci0gICAgICB7Ci0gICAgICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgICAgIFRUeXBlIGVsZW1UeXBlOwotICAgICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgICByZXN1bHQgKz0gcmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICByZXN1bHQgKz0gc2tpcChlbGVtVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IHJlYWRMaXN0RW5kKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIGlubGluZSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHB0cmFuc187Ci0gIH0KLQotICAvLyBUT0RPOiByZW1vdmUgdGhlc2UgdHdvIGNhbGxzLCB0aGV5IGFyZSBmb3IgYmFja3dhcmRzCi0gIC8vIGNvbXBhdGliaWxpdHkKLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldElucHV0VHJhbnNwb3J0KCkgewotICAgIHJldHVybiBwdHJhbnNfOwotICB9Ci0gIGlubGluZSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRPdXRwdXRUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHB0cmFuc187Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgVFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucyk6Ci0gICAgcHRyYW5zXyhwdHJhbnMpIHsKLSAgICB0cmFuc18gPSBwdHJhbnMuZ2V0KCk7Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnNfOwotICBUVHJhbnNwb3J0KiB0cmFuc187Ci0KLSBwcml2YXRlOgotICBUUHJvdG9jb2woKSB7fQotfTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wgb2JqZWN0cyBnaXZlbiB0cmFuc3BvcnRzLgotICovCi1jbGFzcyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRQcm90b2NvbEZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgflRQcm90b2NvbEZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgPSAwOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNkM2M4Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXwotI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXyAxCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoqCi0gKiBDbGFzcyB0byBlbmNhcHN1bGF0ZSBhbGwgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIHByb3RvY29sIGVycm9ycyB0aGF0IG1heQotICogb2NjdXIgaW4gdmFyaW91cyBwcm90b2NvbCBzeXN0ZW1zLiBUaGlzIHByb3ZpZGVzIGEgc29ydCBvZiBnZW5lcmljCi0gKiB3cmFwcGVyIGFyb3VuZCB0aGUgdmFndWUgVU5JWCBFXyBlcnJvciBjb2RlcyB0aGF0IGxldHMgYSBjb21tb24gY29kZQotICogYmFzZSBvZiBlcnJvciBoYW5kbGluZyB0byBiZSB1c2VkIGZvciB2YXJpb3VzIHR5cGVzIG9mIHByb3RvY29scywgaS5lLgotICogcGlwZXMgZXRjLgotICoKLSAqLwotY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgotICAgKi8KLSAgZW51bSBUUHJvdG9jb2xFeGNlcHRpb25UeXBlCi0gIHsgVU5LTk9XTiA9IDAKLSAgLCBJTlZBTElEX0RBVEEgPSAxCi0gICwgTkVHQVRJVkVfU0laRSA9IDIKLSAgLCBTSVpFX0xJTUlUID0gMwotICAsIEJBRF9WRVJTSU9OID0gNAotICAsIE5PVF9JTVBMRU1FTlRFRCA9IDUKLSAgfTsKLQotICBUUHJvdG9jb2xFeGNlcHRpb24oKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQotCi0gIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGUpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgVFByb3RvY29sRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8oVU5LTk9XTikge30KLQotICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgdmlydHVhbCB+VFByb3RvY29sRXhjZXB0aW9uKCkgdGhyb3coKSB7fQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgotICAgKiB0aGF0IGhhcyBvY2N1cnJlZC4KLSAgICoKLSAgICogQHJldHVybiBFcnJvciBjb2RlCi0gICAqLwotICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIGdldFR5cGUoKSB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7Ci0gICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKLSAgICAgIHN3aXRjaCAodHlwZV8pIHsKLSAgICAgICAgY2FzZSBVTktOT1dOICAgICAgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogVW5rbm93biBwcm90b2NvbCBleGNlcHRpb24iOwotICAgICAgICBjYXNlIElOVkFMSURfREFUQSAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBJbnZhbGlkIGRhdGEiOwotICAgICAgICBjYXNlIE5FR0FUSVZFX1NJWkUgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBOZWdhdGl2ZSBzaXplIjsKLSAgICAgICAgY2FzZSBTSVpFX0xJTUlUICAgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogRXhjZWVkZWQgc2l6ZSBsaW1pdCI7Ci0gICAgICAgIGNhc2UgQkFEX1ZFUlNJT04gICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IEludmFsaWQgdmVyc2lvbiI7Ci0gICAgICAgIGNhc2UgTk9UX0lNUExFTUVOVEVEIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IE5vdCBpbXBsZW1lbnRlZCI7Ci0gICAgICAgIGRlZmF1bHQgICAgICAgICAgICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwotICAgIH0KLSAgfQotCi0gcHJvdGVjdGVkOgotICAvKioKLSAgICogRXJyb3IgY29kZQotICAgKi8KLSAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlXzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggYi9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4MDIxNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUQVBfSF8KLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUQVBfSF8gMQotCi0jaW5jbHVkZSA8cHJvdG9jb2wvVE9uZVdheVByb3RvY29sLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKLQotLyoqCi0gKiBQdXRzIGEgd2lyZXRhcCBvbiBhIHByb3RvY29sIG9iamVjdC4gIEFueSByZWFkcyB0byB0aGlzIGNsYXNzIGFyZSBwYXNzZWQKLSAqIHRocm91Z2ggdG8gYW4gZW5jbG9zZWQgcHJvdG9jb2wgb2JqZWN0LCBidXQgYWxzbyBtaXJyb3JlZCBhcyB3cml0ZSB0byBhCi0gKiBzZWNvbmQgcHJvdG9jb2wgb2JqZWN0LgotICoKLSAqLwotY2xhc3MgVFByb3RvY29sVGFwIDogcHVibGljIFRSZWFkT25seVByb3RvY29sIHsKLSBwdWJsaWM6Ci0gICBUUHJvdG9jb2xUYXAoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rKQotICAgICA6IFRSZWFkT25seVByb3RvY29sKHNvdXJjZS0+Z2V0VHJhbnNwb3J0KCksICJUUHJvdG9jb2xUYXAiKQotICAgICAsIHNvdXJjZV8oc291cmNlKQotICAgICAsIHNpbmtfKHNpbmspCi0gIHt9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7Ci0gICAgc2lua18tPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgc2lua18tPndyaXRlTWVzc2FnZUVuZCgpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7Ci0gICAgc2lua18tPndyaXRlU3RydWN0QmVnaW4obmFtZS5jX3N0cigpKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgc2lua18tPndyaXRlU3RydWN0RW5kKCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7Ci0gICAgaWYgKGZpZWxkVHlwZSA9PSBUX1NUT1ApIHsKLSAgICAgIHNpbmtfLT53cml0ZUZpZWxkU3RvcCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzaW5rXy0+d3JpdGVGaWVsZEJlZ2luKG5hbWUuY19zdHIoKSwgZmllbGRUeXBlLCBmaWVsZElkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRGaWVsZEVuZCgpOwotICAgIHNpbmtfLT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICAgIHNpbmtfLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kKCkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1hcEVuZCgpOwotICAgIHNpbmtfLT53cml0ZU1hcEVuZCgpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgc2lua18tPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTGlzdEVuZCgpOwotICAgIHNpbmtfLT53cml0ZUxpc3RFbmQoKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwotICAgIHNpbmtfLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZCgpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTZXRFbmQoKTsKLSAgICBzaW5rXy0+d3JpdGVTZXRFbmQoKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQm9vbCh2YWx1ZSk7Ci0gICAgc2lua18tPndyaXRlQm9vbCh2YWx1ZSk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRCeXRlKGJ5dGUpOwotICAgIHNpbmtfLT53cml0ZUJ5dGUoYnl0ZSk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEkxNihpMTYpOwotICAgIHNpbmtfLT53cml0ZUkxNihpMTYpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRJMzIoaTMyKTsKLSAgICBzaW5rXy0+d3JpdGVJMzIoaTMyKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkSTY0KGk2NCk7Ci0gICAgc2lua18tPndyaXRlSTY0KGk2NCk7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRG91YmxlKGR1Yik7Ci0gICAgc2lua18tPndyaXRlRG91YmxlKGR1Yik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTdHJpbmcoc3RyKTsKLSAgICBzaW5rXy0+d3JpdGVTdHJpbmcoc3RyKTsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgewotICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEJpbmFyeShzdHIpOwotICAgIHNpbmtfLT53cml0ZUJpbmFyeShzdHIpOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2VfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmtfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRBUF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWIzZTY5Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlROb25ibG9ja2luZ1NlcnZlci5oIgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpZm5kZWYgQUZfTE9DQUwKLSNkZWZpbmUgQUZfTE9DQUwgQUZfVU5JWAotI2VuZGlmCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Ci0KLWNsYXNzIFRDb25uZWN0aW9uOjpUYXNrOiBwdWJsaWMgUnVubmFibGUgewotIHB1YmxpYzoKLSAgVGFzayhib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKLSAgICAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbikgOgotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBpbnB1dF8oaW5wdXQpLAotICAgIG91dHB1dF8ob3V0cHV0KSwKLSAgICBjb25uZWN0aW9uXyhjb25uZWN0aW9uKSB7fQotCi0gIHZvaWQgcnVuKCkgewotICAgIHRyeSB7Ci0gICAgICB3aGlsZSAocHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dF8sIG91dHB1dF8pKSB7Ci0gICAgICAgIGlmICghaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIGNlcnIgPDwgIlROb25ibG9ja2luZ1NlcnZlciBjbGllbnQgZGllZDogIiA8PCB0dHgud2hhdCgpIDw8IGVuZGw7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgeCkgewotICAgICAgY2VyciA8PCAiVE5vbmJsb2NraW5nU2VydmVyIGV4Y2VwdGlvbjogIiA8PCB4LndoYXQoKSA8PCBlbmRsOwotICAgIH0gY2F0Y2ggKGJhZF9hbGxvYyYpIHsKLSAgICAgIGNlcnIgPDwgIlROb25ibG9ja2luZ1NlcnZlciBjYXVnaHQgYmFkX2FsbG9jIGV4Y2VwdGlvbi4iOwotICAgICAgZXhpdCgtMSk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBjZXJyIDw8ICJUTm9uYmxvY2tpbmdTZXJ2ZXIgdW5jYXVnaHQgZXhjZXB0aW9uLiIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBTaWduYWwgY29tcGxldGlvbiBiYWNrIHRvIHRoZSBsaWJldmVudCB0aHJlYWQgdmlhIGEgcGlwZQotICAgIGlmICghY29ubmVjdGlvbl8tPm5vdGlmeVNlcnZlcigpKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRhc2s6OnJ1bjogZmFpbGVkIHdyaXRlIG9uIG5vdGlmeSBwaXBlIik7Ci0gICAgfQotICB9Ci0KLSAgVENvbm5lY3Rpb24qIGdldFRDb25uZWN0aW9uKCkgewotICAgIHJldHVybiBjb25uZWN0aW9uXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0XzsKLSAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb25fOwotfTsKLQotdm9pZCBUQ29ubmVjdGlvbjo6aW5pdChpbnQgc29ja2V0LCBzaG9ydCBldmVudEZsYWdzLCBUTm9uYmxvY2tpbmdTZXJ2ZXIqIHMpIHsKLSAgc29ja2V0XyA9IHNvY2tldDsKLSAgc2VydmVyXyA9IHM7Ci0gIGFwcFN0YXRlXyA9IEFQUF9JTklUOwotICBldmVudEZsYWdzXyA9IDA7Ci0KLSAgcmVhZEJ1ZmZlclBvc18gPSAwOwotICByZWFkV2FudF8gPSAwOwotCi0gIHdyaXRlQnVmZmVyXyA9IE5VTEw7Ci0gIHdyaXRlQnVmZmVyU2l6ZV8gPSAwOwotICB3cml0ZUJ1ZmZlclBvc18gPSAwOwotCi0gIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9SRUNWOwotICBhcHBTdGF0ZV8gPSBBUFBfSU5JVDsKLQotICAvLyBTZXQgZmxhZ3MsIHdoaWNoIGFsc28gcmVnaXN0ZXJzIHRoZSBldmVudAotICBzZXRGbGFncyhldmVudEZsYWdzKTsKLQotICAvLyBnZXQgaW5wdXQvdHJhbnNwb3J0cwotICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfID0gcy0+Z2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCktPmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOwotICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XyA9IHMtPmdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKS0+Z2V0VHJhbnNwb3J0KG91dHB1dFRyYW5zcG9ydF8pOwotCi0gIC8vIENyZWF0ZSBwcm90b2NvbAotICBpbnB1dFByb3RvY29sXyA9IHMtPmdldElucHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8pOwotICBvdXRwdXRQcm90b2NvbF8gPSBzLT5nZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOwotfQotCi12b2lkIFRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCkgewotICBpbnQgZmxhZ3M9MCwgZ290PTAsIGxlZnQ9MCwgc2VudD0wOwotICB1aW50MzJfdCBmZXRjaCA9IDA7Ci0KLSAgc3dpdGNoIChzb2NrZXRTdGF0ZV8pIHsKLSAgY2FzZSBTT0NLRVRfUkVDVjoKLSAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBiZSBpbiB0aGlzIHN0YXRlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGRhdGEKLSAgICBhc3NlcnQocmVhZEJ1ZmZlclBvc18gPCByZWFkV2FudF8pOwotCi0gICAgLy8gRG91YmxlIHRoZSBidWZmZXIgc2l6ZSB1bnRpbCBpdCBpcyBiaWcgZW5vdWdoCi0gICAgaWYgKHJlYWRXYW50XyA+IHJlYWRCdWZmZXJTaXplXykgewotICAgICAgdWludDMyX3QgbmV3U2l6ZSA9IHJlYWRCdWZmZXJTaXplXzsKLSAgICAgIHdoaWxlIChyZWFkV2FudF8gPiBuZXdTaXplKSB7Ci0gICAgICAgIG5ld1NpemUgKj0gMjsKLSAgICAgIH0KLSAgICAgIHVpbnQ4X3QqIG5ld0J1ZmZlciA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MocmVhZEJ1ZmZlcl8sIG5ld1NpemUpOwotICAgICAgaWYgKG5ld0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIEdsb2JhbE91dHB1dCgiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKSByZWFsbG9jIik7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHJlYWRCdWZmZXJfID0gbmV3QnVmZmVyOwotICAgICAgcmVhZEJ1ZmZlclNpemVfID0gbmV3U2l6ZTsKLSAgICB9Ci0KLSAgICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAotICAgIGZldGNoID0gcmVhZFdhbnRfIC0gcmVhZEJ1ZmZlclBvc187Ci0gICAgZ290ID0gcmVjdihzb2NrZXRfLCByZWFkQnVmZmVyXyArIHJlYWRCdWZmZXJQb3NfLCBmZXRjaCwgMCk7Ci0KLSAgICBpZiAoZ290ID4gMCkgewotICAgICAgLy8gTW92ZSBhbG9uZyBpbiB0aGUgYnVmZmVyCi0gICAgICByZWFkQnVmZmVyUG9zXyArPSBnb3Q7Ci0KLSAgICAgIC8vIENoZWNrIHRoYXQgd2UgZGlkIG5vdCBvdmVyZG8gaXQKLSAgICAgIGFzc2VydChyZWFkQnVmZmVyUG9zXyA8PSByZWFkV2FudF8pOwotCi0gICAgICAvLyBXZSBhcmUgZG9uZSByZWFkaW5nLCBtb3ZlIG9udG8gdGhlIG5leHQgc3RhdGUKLSAgICAgIGlmIChyZWFkQnVmZmVyUG9zXyA9PSByZWFkV2FudF8pIHsKLSAgICAgICAgdHJhbnNpdGlvbigpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoZ290ID09IC0xKSB7Ci0gICAgICAvLyBCbG9ja2luZyBlcnJvcnMgYXJlIG9rYXksIGp1c3QgbW92ZSBvbgotICAgICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmIChlcnJubyAhPSBFQ09OTlJFU0VUKSB7Ci0gICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCkgcmVjdiAtMSAiLCBlcnJubyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2hlbmV2ZXIgd2UgZ2V0IGRvd24gaGVyZSBpdCBtZWFucyBhIHJlbW90ZSBkaXNjb25uZWN0Ci0gICAgY2xvc2UoKTsKLQotICAgIHJldHVybjsKLQotICBjYXNlIFNPQ0tFVF9TRU5EOgotICAgIC8vIFNob3VsZCBuZXZlciBoYXZlIHBvc2l0aW9uIHBhc3Qgc2l6ZQotICAgIGFzc2VydCh3cml0ZUJ1ZmZlclBvc18gPD0gd3JpdGVCdWZmZXJTaXplXyk7Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIHRvIHNlbmQsIHRoZW4gbGV0IHVzIG1vdmUgb24KLSAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyU2l6ZV8pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiV0FSTklORzogU2VuZCBzdGF0ZSB3aXRoIG5vIGRhdGEgdG8gc2VuZFxuIik7Ci0gICAgICB0cmFuc2l0aW9uKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxhZ3MgPSAwOwotICAgICNpZmRlZiBNU0dfTk9TSUdOQUwKLSAgICAvLyBOb3RlIHRoZSB1c2Ugb2YgTVNHX05PU0lHTkFMIHRvIHN1cHByZXNzIFNJR1BJUEUgZXJyb3JzLCBpbnN0ZWFkIHdlCi0gICAgLy8gY2hlY2sgZm9yIHRoZSBFUElQRSByZXR1cm4gY29uZGl0aW9uIGFuZCBjbG9zZSB0aGUgc29ja2V0IGluIHRoYXQgY2FzZQotICAgIGZsYWdzIHw9IE1TR19OT1NJR05BTDsKLSAgICAjZW5kaWYgLy8gaWZkZWYgTVNHX05PU0lHTkFMCi0KLSAgICBsZWZ0ID0gd3JpdGVCdWZmZXJTaXplXyAtIHdyaXRlQnVmZmVyUG9zXzsKLSAgICBzZW50ID0gc2VuZChzb2NrZXRfLCB3cml0ZUJ1ZmZlcl8gKyB3cml0ZUJ1ZmZlclBvc18sIGxlZnQsIGZsYWdzKTsKLQotICAgIGlmIChzZW50IDw9IDApIHsKLSAgICAgIC8vIEJsb2NraW5nIGVycm9ycyBhcmUgb2theSwganVzdCBtb3ZlIG9uCi0gICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChlcnJubyAhPSBFUElQRSkgewotICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpIHNlbmQgLTEgIiwgZXJybm8pOwotICAgICAgfQotICAgICAgY2xvc2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3cml0ZUJ1ZmZlclBvc18gKz0gc2VudDsKLQotICAgIC8vIERpZCB3ZSBvdmVyZG8gaXQ/Ci0gICAgYXNzZXJ0KHdyaXRlQnVmZmVyUG9zXyA8PSB3cml0ZUJ1ZmZlclNpemVfKTsKLQotICAgIC8vIFdlIGFyZSBkb25lIQotICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJTaXplXykgewotICAgICAgdHJhbnNpdGlvbigpOwotICAgIH0KLQotICAgIHJldHVybjsKLQotICBkZWZhdWx0OgotICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlVuZXhwZWN0ZWQgU29ja2V0IFN0YXRlICVkIiwgc29ja2V0U3RhdGVfKTsKLSAgICBhc3NlcnQoMCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCi0gKiBhbm90aGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgaGFzIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQKLSAqIHRvLCBvciBmaW5pc2hlZCByZWNlaXZpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQgdG8uCi0gKi8KLXZvaWQgVENvbm5lY3Rpb246OnRyYW5zaXRpb24oKSB7Ci0KLSAgaW50IHN6ID0gMDsKLQotICAvLyBTd2l0Y2ggdXBvbiB0aGUgc3RhdGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGluIGFuZCBtb3ZlIHRvIGEgbmV3IHN0YXRlCi0gIHN3aXRjaCAoYXBwU3RhdGVfKSB7Ci0KLSAgY2FzZSBBUFBfUkVBRF9SRVFVRVNUOgotICAgIC8vIFdlIGFyZSBkb25lIHJlYWRpbmcgdGhlIHJlcXVlc3QsIHBhY2thZ2UgdGhlIHJlYWQgYnVmZmVyIGludG8gdHJhbnNwb3J0Ci0gICAgLy8gYW5kIGdldCBiYWNrIHNvbWUgZGF0YSBmcm9tIHRoZSBkaXNwYXRjaCBmdW5jdGlvbgotICAgIC8vIElmIHdlJ3ZlIHVzZWQgdGhlc2UgdHJhbnNwb3J0IGJ1ZmZlcnMgZW5vdWdoIHRpbWVzLCByZXNldCB0aGVtIHRvIGF2b2lkIGJsb2F0aW5nCi0KLSAgICBpbnB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyUG9zXyk7Ci0gICAgKytudW1SZWFkc1NpbmNlUmVzZXRfOwotICAgIGlmIChudW1Xcml0ZXNTaW5jZVJlc2V0XyA8IDUxMikgewotICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gcmVzZXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBvdXRwdXQgdHJhbnNwb3J0IGlmIHdlIHVzZWQgaXQgZW5vdWdoIHRpbWVzIHRoYXQgaXQgbWlnaHQgYmUgYmxvYXRlZAotICAgICAgdHJ5IHsKLSAgICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIodHJ1ZSk7Ci0gICAgICAgIG51bVdyaXRlc1NpbmNlUmVzZXRfID0gMDsKLSAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJnR0eCkgewotICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUTWVtb3J5QnVmZmVyOjpyZXNldEJ1ZmZlcigpICVzIiwgdHR4LndoYXQoKSk7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KLSAgICAvLyB3cml0ZSB0aGUgZnJhbWUgc2l6ZSB0aGVyZSBsYXRlci4KLSAgICBvdXRwdXRUcmFuc3BvcnRfLT5nZXRXcml0ZVB0cig0KTsKLSAgICBvdXRwdXRUcmFuc3BvcnRfLT53cm90ZUJ5dGVzKDQpOwotCi0gICAgc2VydmVyXy0+aW5jcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwotCi0gICAgaWYgKHNlcnZlcl8tPmlzVGhyZWFkUG9vbFByb2Nlc3NpbmcoKSkgewotICAgICAgLy8gV2UgYXJlIHNldHRpbmcgdXAgYSBUYXNrIHRvIGRvIHRoaXMgd29yayBhbmQgd2Ugd2lsbCB3YWl0IG9uIGl0Ci0KLSAgICAgIC8vIENyZWF0ZSB0YXNrIGFuZCBkaXNwYXRjaCB0byB0aGUgdGhyZWFkIG1hbmFnZXIKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0KLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+KG5ldyBUYXNrKHNlcnZlcl8tPmdldFByb2Nlc3NvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7Ci0gICAgICAvLyBUaGUgYXBwbGljYXRpb24gaXMgbm93IHdhaXRpbmcgb24gdGhlIHRhc2sgdG8gZmluaXNoCi0gICAgICBhcHBTdGF0ZV8gPSBBUFBfV0FJVF9UQVNLOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgc2VydmVyXy0+YWRkVGFzayh0YXNrKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uICYgaXNlKSB7Ci0gICAgICAgICAgLy8gVGhlIFRocmVhZE1hbmFnZXIgaXMgbm90IHJlYWR5IHRvIGhhbmRsZSBhbnkgbW9yZSB0YXNrcyAoaXQncyBwcm9iYWJseSBzaHV0dGluZyBkb3duKS4KLSAgICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgaXNlLndoYXQoKSk7Ci0gICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAvLyBTZXQgdGhpcyBjb25uZWN0aW9uIGlkbGUgc28gdGhhdCBsaWJldmVudCBkb2Vzbid0IHByb2Nlc3MgbW9yZQotICAgICAgLy8gZGF0YSBvbiBpdCB3aGlsZSB3ZSdyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgdGhyZWFkbWFuYWdlciB0bwotICAgICAgLy8gZmluaXNoIHRoaXMgdGFzawotICAgICAgc2V0SWRsZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICB0cnkgewotICAgICAgICAvLyBJbnZva2UgdGhlIHByb2Nlc3NvcgotICAgICAgICBzZXJ2ZXJfLT5nZXRQcm9jZXNzb3IoKS0+cHJvY2VzcyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKLSAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJnR0eCkgewotICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUVHJhbnNwb3J0RXhjZXB0aW9uOiBTZXJ2ZXI6OnByb2Nlc3MoKSAlcyIsIHR0eC53aGF0KCkpOwotICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJngpIHsKLSAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVEV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCB4LndoYXQoKSk7Ci0gICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlNlcnZlcjo6cHJvY2VzcygpIHVua25vd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIGhlcmUsIHRoZSBjYWxsIHRvIHByb2Nlc3MgaGFzIHdyaXR0ZW4gaW50bwotICAgIC8vIHRoZSB3cml0ZUJ1ZmZlcl8KLQotICBjYXNlIEFQUF9XQUlUX1RBU0s6Ci0gICAgLy8gV2UgaGF2ZSBub3cgZmluaXNoZWQgcHJvY2Vzc2luZyBhIHRhc2sgYW5kIHRoZSByZXN1bHQgaGFzIGJlZW4gd3JpdHRlbgotICAgIC8vIGludG8gdGhlIG91dHB1dFRyYW5zcG9ydF8sIHNvIHdlIGdyYWIgaXRzIGNvbnRlbnRzIGFuZCBwbGFjZSB0aGVtIGludG8KLSAgICAvLyB0aGUgd3JpdGVCdWZmZXJfIGZvciBhY3R1YWwgd3JpdGluZyBieSB0aGUgbGliZXZlbnQgdGhyZWFkCi0KLSAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7Ci0gICAgLy8gR2V0IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgotICAgIG91dHB1dFRyYW5zcG9ydF8tPmdldEJ1ZmZlcigmd3JpdGVCdWZmZXJfLCAmd3JpdGVCdWZmZXJTaXplXyk7Ci0KLSAgICAvLyBJZiB0aGUgZnVuY3Rpb24gY2FsbCBnZW5lcmF0ZWQgcmV0dXJuIGRhdGEsIHRoZW4gbW92ZSBpbnRvIHRoZSBzZW5kCi0gICAgLy8gc3RhdGUgYW5kIGdldCBnb2luZwotICAgIC8vIDQgYnl0ZXMgd2VyZSByZXNlcnZlZCBmb3IgZnJhbWUgc2l6ZQotICAgIGlmICh3cml0ZUJ1ZmZlclNpemVfID4gNCkgewotCi0gICAgICAvLyBNb3ZlIGludG8gd3JpdGUgc3RhdGUKLSAgICAgIHdyaXRlQnVmZmVyUG9zXyA9IDA7Ci0gICAgICBzb2NrZXRTdGF0ZV8gPSBTT0NLRVRfU0VORDsKLQotICAgICAgLy8gUHV0IHRoZSBmcmFtZSBzaXplIGludG8gdGhlIHdyaXRlIGJ1ZmZlcgotICAgICAgaW50MzJfdCBmcmFtZVNpemUgPSAoaW50MzJfdClodG9ubCh3cml0ZUJ1ZmZlclNpemVfIC0gNCk7Ci0gICAgICBtZW1jcHkod3JpdGVCdWZmZXJfLCAmZnJhbWVTaXplLCA0KTsKLQotICAgICAgLy8gU29ja2V0IGludG8gd3JpdGUgbW9kZQotICAgICAgYXBwU3RhdGVfID0gQVBQX1NFTkRfUkVTVUxUOwotICAgICAgc2V0V3JpdGUoKTsKLQotICAgICAgLy8gVHJ5IHRvIHdvcmsgdGhlIHNvY2tldCBpbW1lZGlhdGVseQotICAgICAgLy8gd29ya1NvY2tldCgpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgcmVxdWVzdCB3YXMgb25ld2F5IGFuZCB3ZSBzaG91bGQgZmFsbCB0aHJvdWdoCi0gICAgLy8gcmlnaHQgYmFjayBpbnRvIHRoZSByZWFkIGZyYW1lIGhlYWRlciBzdGF0ZQotICAgIGdvdG8gTEFCRUxfQVBQX0lOSVQ7Ci0KLSAgY2FzZSBBUFBfU0VORF9SRVNVTFQ6Ci0KLSAgICArK251bVdyaXRlc1NpbmNlUmVzZXRfOwotCi0gICAgLy8gTi5CLjogV2UgYWxzbyBpbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlIGludG8gdGhlIElOSVQgc3RhdGUhCi0KLSAgTEFCRUxfQVBQX0lOSVQ6Ci0gIGNhc2UgQVBQX0lOSVQ6Ci0KLSAgICAvLyByZXNldCB0aGUgaW5wdXQgYnVmZmVyIGlmIHdlIHVzZWQgaXQgZW5vdWdoIHRpbWVzIHRoYXQgaXQgbWlnaHQgYmUgYmxvYXRlZAotICAgIGlmIChudW1SZWFkc1NpbmNlUmVzZXRfID4gNTEyKQotICAgIHsKLSAgICAgIHZvaWQgKiBuZXdfYnVmZmVyID0gc3RkOjpyZWFsbG9jKHJlYWRCdWZmZXJfLCAxMDI0KTsKLSAgICAgIGlmIChuZXdfYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6dHJhbnNpdGlvbigpIHJlYWxsb2MiKTsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcmVhZEJ1ZmZlcl8gPSAodWludDhfdCopIG5ld19idWZmZXI7Ci0gICAgICByZWFkQnVmZmVyU2l6ZV8gPSAxMDI0OwotICAgICAgbnVtUmVhZHNTaW5jZVJlc2V0XyA9IDA7Ci0gICAgfQotCi0gICAgLy8gQ2xlYXIgd3JpdGUgYnVmZmVyIHZhcmlhYmxlcwotICAgIHdyaXRlQnVmZmVyXyA9IE5VTEw7Ci0gICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKLSAgICB3cml0ZUJ1ZmZlclNpemVfID0gMDsKLQotICAgIC8vIFNldCB1cCByZWFkIGJ1ZmZlciBmb3IgZ2V0dGluZyA0IGJ5dGVzCi0gICAgcmVhZEJ1ZmZlclBvc18gPSAwOwotICAgIHJlYWRXYW50XyA9IDQ7Ci0KLSAgICAvLyBJbnRvIHJlYWQ0IHN0YXRlIHdlIGdvCi0gICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1Y7Ci0gICAgYXBwU3RhdGVfID0gQVBQX1JFQURfRlJBTUVfU0laRTsKLQotICAgIC8vIFJlZ2lzdGVyIHJlYWQgZXZlbnQKLSAgICBzZXRSZWFkKCk7Ci0KLSAgICAvLyBUcnkgdG8gd29yayB0aGUgc29ja2V0IHJpZ2h0IGF3YXkKLSAgICAvLyB3b3JrU29ja2V0KCk7Ci0KLSAgICByZXR1cm47Ci0KLSAgY2FzZSBBUFBfUkVBRF9GUkFNRV9TSVpFOgotICAgIC8vIFdlIGp1c3QgcmVhZCB0aGUgcmVxdWVzdCBsZW5ndGgsIGRlc2VyaWFsaXplIGl0Ci0gICAgc3ogPSAqKGludDMyX3QqKXJlYWRCdWZmZXJfOwotICAgIHN6ID0gKGludDMyX3QpbnRvaGwoc3opOwotCi0gICAgaWYgKHN6IDw9IDApIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOnRyYW5zaXRpb24oKSBOZWdhdGl2ZSBmcmFtZSBzaXplICVkLCByZW1vdGUgc2lkZSBub3QgdXNpbmcgVEZyYW1lZFRyYW5zcG9ydD8iLCBzeik7Ci0gICAgICBjbG9zZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFJlc2V0IHRoZSByZWFkIGJ1ZmZlcgotICAgIHJlYWRXYW50XyA9ICh1aW50MzJfdClzejsKLSAgICByZWFkQnVmZmVyUG9zXz0gMDsKLQotICAgIC8vIE1vdmUgaW50byByZWFkIHJlcXVlc3Qgc3RhdGUKLSAgICBhcHBTdGF0ZV8gPSBBUFBfUkVBRF9SRVFVRVNUOwotCi0gICAgLy8gV29yayB0aGUgc29ja2V0IHJpZ2h0IGF3YXkKLSAgICAvLyB3b3JrU29ja2V0KCk7Ci0KLSAgICByZXR1cm47Ci0KLSAgY2FzZSBBUFBfQ0xPU0VfQ09OTkVDVElPTjoKLSAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7Ci0gICAgY2xvc2UoKTsKLSAgICByZXR1cm47Ci0KLSAgZGVmYXVsdDoKLSAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIFN0YXRlICVkIiwgYXBwU3RhdGVfKTsKLSAgICBhc3NlcnQoMCk7Ci0gIH0KLX0KLQotdm9pZCBUQ29ubmVjdGlvbjo6c2V0RmxhZ3Moc2hvcnQgZXZlbnRGbGFncykgewotICAvLyBDYXRjaCB0aGUgZG8gbm90aGluZyBjYXNlCi0gIGlmIChldmVudEZsYWdzXyA9PSBldmVudEZsYWdzKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gRGVsZXRlIGEgcHJldmlvdXNseSBleGlzdGluZyBldmVudAotICBpZiAoZXZlbnRGbGFnc18gIT0gMCkgewotICAgIGlmIChldmVudF9kZWwoJmV2ZW50XykgPT0gLTEpIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVENvbm5lY3Rpb246OnNldEZsYWdzIGV2ZW50X2RlbCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIC8vIFVwZGF0ZSBpbiBtZW1vcnkgc3RydWN0dXJlCi0gIGV2ZW50RmxhZ3NfID0gZXZlbnRGbGFnczsKLQotICAvLyBEbyBub3QgY2FsbCBldmVudF9zZXQgaWYgdGhlcmUgYXJlIG5vIGZsYWdzCi0gIGlmICghZXZlbnRGbGFnc18pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKgotICAgKiBldmVudF9zZXQ6Ci0gICAqCi0gICAqIFByZXBhcmVzIHRoZSBldmVudCBzdHJ1Y3R1cmUgJmV2ZW50IHRvIGJlIHVzZWQgaW4gZnV0dXJlIGNhbGxzIHRvCi0gICAqIGV2ZW50X2FkZCgpIGFuZCBldmVudF9kZWwoKS4gIFRoZSBldmVudCB3aWxsIGJlIHByZXBhcmVkIHRvIGNhbGwgdGhlCi0gICAqIGV2ZW50SGFuZGxlciB1c2luZyB0aGUgJ3NvY2snIGZpbGUgZGVzY3JpcHRvciB0byBtb25pdG9yIGV2ZW50cy4KLSAgICoKLSAgICogVGhlIGV2ZW50cyBjYW4gYmUgZWl0aGVyIEVWX1JFQUQsIEVWX1dSSVRFLCBvciBib3RoLCBpbmRpY2F0aW5nCi0gICAqIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIHJlYWQgb3Igd3JpdGUgZnJvbSB0aGUgZmlsZSByZXNwZWN0aXZlbHkgd2l0aG91dAotICAgKiBibG9ja2luZy4KLSAgICoKLSAgICogVGhlIGV2ZW50SGFuZGxlciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB0cmlnZ2VyZWQKLSAgICogdGhlIGV2ZW50IGFuZCB0aGUgdHlwZSBvZiBldmVudCB3aGljaCB3aWxsIGJlIG9uZSBvZjogRVZfVElNRU9VVCwKLSAgICogRVZfU0lHTkFMLCBFVl9SRUFELCBFVl9XUklURS4KLSAgICoKLSAgICogVGhlIGFkZGl0aW9uYWwgZmxhZyBFVl9QRVJTSVNUIG1ha2VzIGFuIGV2ZW50X2FkZCgpIHBlcnNpc3RlbnQgdW50aWwKLSAgICogZXZlbnRfZGVsKCkgaGFzIGJlZW4gY2FsbGVkLgotICAgKgotICAgKiBPbmNlIGluaXRpYWxpemVkLCB0aGUgJmV2ZW50IHN0cnVjdCBjYW4gYmUgdXNlZCByZXBlYXRlZGx5IHdpdGgKLSAgICogZXZlbnRfYWRkKCkgYW5kIGV2ZW50X2RlbCgpIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlaW5pdGlhbGl6ZWQgdW5sZXNzCi0gICAqIHRoZSBldmVudEhhbmRsZXIgYW5kL29yIHRoZSBhcmd1bWVudCB0byBpdCBhcmUgdG8gYmUgY2hhbmdlZC4gIEhvd2V2ZXIsCi0gICAqIHdoZW4gYW4gZXYgc3RydWN0dXJlIGhhcyBiZWVuIGFkZGVkIHRvIGxpYmV2ZW50IHVzaW5nIGV2ZW50X2FkZCgpIHRoZQotICAgKiBzdHJ1Y3R1cmUgbXVzdCBwZXJzaXN0IHVudGlsIHRoZSBldmVudCBvY2N1cnMgKGFzc3VtaW5nIEVWX1BFUlNJU1QKLSAgICogaXMgbm90IHNldCkgb3IgaXMgcmVtb3ZlZCB1c2luZyBldmVudF9kZWwoKS4gIFlvdSBtYXkgbm90IHJldXNlIHRoZSBzYW1lCi0gICAqIGV2IHN0cnVjdHVyZSBmb3IgbXVsdGlwbGUgbW9uaXRvcmVkIGRlc2NyaXB0b3JzOyBlYWNoIGRlc2NyaXB0b3IgbmVlZHMKLSAgICogaXRzIG93biBldi4KLSAgICovCi0gIGV2ZW50X3NldCgmZXZlbnRfLCBzb2NrZXRfLCBldmVudEZsYWdzXywgVENvbm5lY3Rpb246OmV2ZW50SGFuZGxlciwgdGhpcyk7Ci0gIGV2ZW50X2Jhc2Vfc2V0KHNlcnZlcl8tPmdldEV2ZW50QmFzZSgpLCAmZXZlbnRfKTsKLQotICAvLyBBZGQgdGhlIGV2ZW50Ci0gIGlmIChldmVudF9hZGQoJmV2ZW50XywgMCkgPT0gLTEpIHsKLSAgICBHbG9iYWxPdXRwdXQoIlRDb25uZWN0aW9uOjpzZXRGbGFncygpOiBjb3VsZCBub3QgZXZlbnRfYWRkIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBDbG9zZXMgYSBjb25uZWN0aW9uCi0gKi8KLXZvaWQgVENvbm5lY3Rpb246OmNsb3NlKCkgewotICAvLyBEZWxldGUgdGhlIHJlZ2lzdGVyZWQgbGliZXZlbnQKLSAgaWYgKGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgewotICAgIEdsb2JhbE91dHB1dCgiVENvbm5lY3Rpb246OmNsb3NlKCkgZXZlbnRfZGVsIik7Ci0gIH0KLQotICAvLyBDbG9zZSB0aGUgc29ja2V0Ci0gIGlmIChzb2NrZXRfID49IDApIHsKLSAgICA6OmNsb3NlKHNvY2tldF8pOwotICB9Ci0gIHNvY2tldF8gPSAtMTsKLQotICAvLyBjbG9zZSBhbnkgZmFjdG9yeSBwcm9kdWNlZCB0cmFuc3BvcnRzCi0gIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfLT5jbG9zZSgpOwotCi0gIC8vIEdpdmUgdGhpcyBvYmplY3QgYmFjayB0byB0aGUgc2VydmVyIHRoYXQgb3ducyBpdAotICBzZXJ2ZXJfLT5yZXR1cm5Db25uZWN0aW9uKHRoaXMpOwotfQotCi12b2lkIFRDb25uZWN0aW9uOjpjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgbGltaXQpIHsKLSAgaWYgKHJlYWRCdWZmZXJTaXplXyA+IGxpbWl0KSB7Ci0gICAgcmVhZEJ1ZmZlclNpemVfID0gbGltaXQ7Ci0gICAgcmVhZEJ1ZmZlcl8gPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyU2l6ZV8pOwotICAgIGlmIChyZWFkQnVmZmVyXyA9PSBOVUxMKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRDb25uZWN0aW9uOjpjaGVja0lkbGVCdWZmZXJNZW1MaW1pdCgpIHJlYWxsb2MiKTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGVpdGhlciBieSByZXVzaW5nIGFuIG9iamVjdCBvZmYgdGhlIHN0YWNrIG9yCi0gKiBieSBhbGxvY2F0aW5nIGEgbmV3IG9uZSBlbnRpcmVseQotICovCi1UQ29ubmVjdGlvbiogVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVDb25uZWN0aW9uKGludCBzb2NrZXQsIHNob3J0IGZsYWdzKSB7Ci0gIC8vIENoZWNrIHRoZSBzdGFjawotICBpZiAoY29ubmVjdGlvblN0YWNrXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIG5ldyBUQ29ubmVjdGlvbihzb2NrZXQsIGZsYWdzLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgICBUQ29ubmVjdGlvbiogcmVzdWx0ID0gY29ubmVjdGlvblN0YWNrXy50b3AoKTsKLSAgICBjb25uZWN0aW9uU3RhY2tfLnBvcCgpOwotICAgIHJlc3VsdC0+aW5pdChzb2NrZXQsIGZsYWdzLCB0aGlzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIGNvbm5lY3Rpb24gdG8gdGhlIHN0YWNrCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpyZXR1cm5Db25uZWN0aW9uKFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKSB7Ci0gIGlmIChjb25uZWN0aW9uU3RhY2tMaW1pdF8gJiYKLSAgICAgIChjb25uZWN0aW9uU3RhY2tfLnNpemUoKSA+PSBjb25uZWN0aW9uU3RhY2tMaW1pdF8pKSB7Ci0gICAgZGVsZXRlIGNvbm5lY3Rpb247Ci0gIH0gZWxzZSB7Ci0gICAgY29ubmVjdGlvbi0+Y2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoaWRsZUJ1ZmZlck1lbUxpbWl0Xyk7Ci0gICAgY29ubmVjdGlvblN0YWNrXy5wdXNoKGNvbm5lY3Rpb24pOwotICB9Ci19Ci0KLS8qKgotICogU2VydmVyIHNvY2tldCBoYWQgc29tZXRoaW5nIGhhcHBlbi4gIFdlIGFjY2VwdCBhbGwgd2FpdGluZyBjbGllbnQKLSAqIGNvbm5lY3Rpb25zIG9uIGZkIGFuZCBhc3NpZ24gVENvbm5lY3Rpb24gb2JqZWN0cyB0byBoYW5kbGUgdGhvc2UgcmVxdWVzdHMuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpoYW5kbGVFdmVudChpbnQgZmQsIHNob3J0IHdoaWNoKSB7Ci0gIC8vIE1ha2Ugc3VyZSB0aGF0IGxpYmV2ZW50IGRpZG4ndCBtZXNzIHVwIHRoZSBzb2NrZXQgaGFuZGxlcwotICBhc3NlcnQoZmQgPT0gc2VydmVyU29ja2V0Xyk7Ci0KLSAgLy8gU2VydmVyIHNvY2tldCBhY2NlcHRlZCBhIG5ldyBjb25uZWN0aW9uCi0gIHNvY2tsZW5fdCBhZGRyTGVuOwotICBzdHJ1Y3Qgc29ja2FkZHIgYWRkcjsKLSAgYWRkckxlbiA9IHNpemVvZihhZGRyKTsKLQotICAvLyBHb2luZyB0byBhY2NlcHQgYSBuZXcgY2xpZW50IHNvY2tldAotICBpbnQgY2xpZW50U29ja2V0OwotCi0gIC8vIEFjY2VwdCBhcyBtYW55IG5ldyBjbGllbnRzIGFzIHBvc3NpYmxlLCBldmVuIHRob3VnaCBsaWJldmVudCBzaWduYWxlZCBvbmx5Ci0gIC8vIG9uZSwgdGhpcyBoZWxwcyB1cyB0byBhdm9pZCBoYXZpbmcgdG8gZ28gYmFjayBpbnRvIHRoZSBsaWJldmVudCBlbmdpbmUgc28KLSAgLy8gbWFueSB0aW1lcwotICB3aGlsZSAoKGNsaWVudFNvY2tldCA9IGFjY2VwdChmZCwgJmFkZHIsICZhZGRyTGVuKSkgIT0gLTEpIHsKLSAgICAvLyBJZiB3ZSdyZSBvdmVybG9hZGVkLCB0YWtlIGFjdGlvbiBoZXJlCi0gICAgaWYgKG92ZXJsb2FkQWN0aW9uXyAhPSBUX09WRVJMT0FEX05PX0FDVElPTiAmJiBzZXJ2ZXJPdmVybG9hZGVkKCkpIHsKLSAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfKys7Ci0gICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKys7Ci0gICAgICBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfQ0xPU0VfT05fQUNDRVBUKSB7Ci0gICAgICAgIGNsb3NlKGNsaWVudFNvY2tldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSkgewotICAgICAgICBpZiAoIWRyYWluUGVuZGluZ1Rhc2soKSkgewotICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBkaXNjYXJkLCBzbyB3ZSBkcm9wIGNvbm5lY3Rpb24gaW5zdGVhZC4KLSAgICAgICAgICBjbG9zZShjbGllbnRTb2NrZXQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBFeHBsaWNpdGx5IHNldCB0aGlzIHNvY2tldCB0byBOT05CTE9DSyBtb2RlCi0gICAgaW50IGZsYWdzOwotICAgIGlmICgoZmxhZ3MgPSBmY250bChjbGllbnRTb2NrZXQsIEZfR0VURkwsIDApKSA8IDAgfHwKLSAgICAgICAgZmNudGwoY2xpZW50U29ja2V0LCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spIDwgMCkgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBzZXQgT19OT05CTE9DSyAoZmNudGwpICIsIGVycm5vKTsKLSAgICAgIGNsb3NlKGNsaWVudFNvY2tldCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGEgbmV3IFRDb25uZWN0aW9uIGZvciB0aGlzIGNsaWVudCBzb2NrZXQuCi0gICAgVENvbm5lY3Rpb24qIGNsaWVudENvbm5lY3Rpb24gPQotICAgICAgY3JlYXRlQ29ubmVjdGlvbihjbGllbnRTb2NrZXQsIEVWX1JFQUQgfCBFVl9QRVJTSVNUKTsKLQotICAgIC8vIEZhaWwgZmFzdCBpZiB3ZSBjb3VsZCBub3QgY3JlYXRlIGEgVENvbm5lY3Rpb24gb2JqZWN0Ci0gICAgaWYgKGNsaWVudENvbm5lY3Rpb24gPT0gTlVMTCkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBmYWlsZWQgVENvbm5lY3Rpb24gZmFjdG9yeSIpOwotICAgICAgY2xvc2UoY2xpZW50U29ja2V0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBQdXQgdGhpcyBjbGllbnQgY29ubmVjdGlvbiBpbnRvIHRoZSBwcm9wZXIgc3RhdGUKLSAgICBjbGllbnRDb25uZWN0aW9uLT50cmFuc2l0aW9uKCk7Ci0KLSAgICAvLyBhZGRyTGVuIGlzIHdyaXR0ZW4gYnkgdGhlIGFjY2VwdCgpIGNhbGwsIHNvIG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgdGhlIG5leHQgY2FsbC4KLSAgICBhZGRyTGVuID0gc2l6ZW9mKGFkZHIpOwotICB9Ci0KLSAgLy8gRG9uZSBsb29waW5nIGFjY2VwdCwgbm93IHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZSBlcnJvciBpcyBkdWUgdG8KLSAgLy8gYmxvY2tpbmcuIEFueSBvdGhlciBlcnJvciBpcyBhIHByb2JsZW0KLSAgaWYgKGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFV09VTERCTE9DSykgewotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogYWNjZXB0KCkgIiwgZXJybm8pOwotICB9Ci19Ci0KLS8qKgotICogQ3JlYXRlcyBhIHNvY2tldCB0byBsaXN0ZW4gb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBsb2NhbCBwb3J0LgotICovCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6bGlzdGVuU29ja2V0KCkgewotICBpbnQgczsKLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKLSAgaW50IGVycm9yOwotCi0gIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM2IikgKyAxXTsKLSAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0gIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLSAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLSAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKLSAgc3ByaW50Zihwb3J0LCAiJWQiLCBwb3J0Xyk7Ci0KLSAgLy8gV2lsZGNhcmQgYWRkcmVzcwotICBlcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsIHBvcnQsICZoaW50cywgJnJlczApOwotICBpZiAoZXJyb3IpIHsKLSAgICBzdHJpbmcgZXJyU3RyID0gIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBnZXRhZGRyaW5mbyAiICsgc3RyaW5nKGdhaV9zdHJlcnJvcihlcnJvcikpOwotICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gUGljayB0aGUgaXB2NiBhZGRyZXNzIGZpcnN0IHNpbmNlIGlwdjQgYWRkcmVzc2VzIGNhbiBiZSBtYXBwZWQKLSAgLy8gaW50byBpcHY2IHNwYWNlLgotICBmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7Ci0gICAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2IHx8IHJlcy0+YWlfbmV4dCA9PSBOVUxMKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBDcmVhdGUgdGhlIHNlcnZlciBzb2NrZXQKLSAgcyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7Ci0gIGlmIChzID09IC0xKSB7Ci0gICAgZnJlZWFkZHJpbmZvKHJlczApOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBzb2NrZXQoKSAtMSIpOwotICB9Ci0KLSAgI2lmZGVmIElQVjZfVjZPTkxZCi0gIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNikgewotICAgIGludCB6ZXJvID0gMDsKLSAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzLCBJUFBST1RPX0lQVjYsIElQVjZfVjZPTkxZLCAmemVybywgc2l6ZW9mKHplcm8pKSkgewotICAgICAgR2xvYmFsT3V0cHV0KCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSIpOwotICAgIH0KLSAgfQotICAjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCi0KLQotICBpbnQgb25lID0gMTsKLQotICAvLyBTZXQgcmV1c2VhZGRyIHRvIGF2b2lkIDJNU0wgZGVsYXkgb24gc2VydmVyIHJlc3RhcnQKLSAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbmUsIHNpemVvZihvbmUpKTsKLQotICBpZiAoYmluZChzLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbikgPT0gLTEpIHsKLSAgICBjbG9zZShzKTsKLSAgICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGJpbmQiKTsKLSAgfQotCi0gIC8vIERvbmUgd2l0aCB0aGUgYWRkciBpbmZvCi0gIGZyZWVhZGRyaW5mbyhyZXMwKTsKLQotICAvLyBTZXQgdXAgdGhpcyBmaWxlIGRlc2NyaXB0b3IgZm9yIGxpc3RlbmluZwotICBsaXN0ZW5Tb2NrZXQocyk7Ci19Ci0KLS8qKgotICogVGFrZXMgYSBzb2NrZXQgY3JlYXRlZCBieSBsaXN0ZW5Tb2NrZXQoKSBhbmQgc2V0cyB2YXJpb3VzIG9wdGlvbnMgb24gaXQKLSAqIHRvIHByZXBhcmUgZm9yIHVzZSBpbiB0aGUgc2VydmVyLgotICovCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6bGlzdGVuU29ja2V0KGludCBzKSB7Ci0gIC8vIFNldCBzb2NrZXQgdG8gbm9uYmxvY2tpbmcgbW9kZQotICBpbnQgZmxhZ3M7Ci0gIGlmICgoZmxhZ3MgPSBmY250bChzLCBGX0dFVEZMLCAwKSkgPCAwIHx8Ci0gICAgICBmY250bChzLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spIDwgMCkgewotICAgIGNsb3NlKHMpOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBPX05PTkJMT0NLIik7Ci0gIH0KLQotICBpbnQgb25lID0gMTsKLSAgc3RydWN0IGxpbmdlciBsaW5nID0gezAsIDB9OwotCi0gIC8vIEtlZXBhbGl2ZSB0byBlbnN1cmUgZnVsbCByZXN1bHQgZmx1c2hpbmcKLSAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsICZvbmUsIHNpemVvZihvbmUpKTsKLQotICAvLyBUdXJuIGxpbmdlciBvZmYgdG8gYXZvaWQgaHVuZyBzb2NrZXRzCi0gIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAmbGluZywgc2l6ZW9mKGxpbmcpKTsKLQotICAvLyBTZXQgVENQIG5vZGVsYXkgaWYgYXZhaWxhYmxlLCBNQUMgT1MgWCBIYWNrCi0gIC8vIFNlZSBodHRwOi8vbGlzdHMuZGFuZ2EuY29tL3BpcGVybWFpbC9tZW1jYWNoZWQvMjAwNS1NYXJjaC8wMDEyNDAuaHRtbAotICAjaWZuZGVmIFRDUF9OT1BVU0gKLSAgc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZvbmUsIHNpemVvZihvbmUpKTsKLSAgI2VuZGlmCi0KLSAgI2lmZGVmIFRDUF9MT1dfTUlOX1JUTwotICBpZiAoVFNvY2tldDo6Z2V0VXNlTG93TWluUnRvKCkpIHsKLSAgICBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sICZvbmUsIHNpemVvZihvbmUpKTsKLSAgfQotICAjZW5kaWYKLQotICBpZiAobGlzdGVuKHMsIExJU1RFTl9CQUNLTE9HKSA9PSAtMSkgewotICAgIGNsb3NlKHMpOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBsaXN0ZW4iKTsKLSAgfQotCi0gIC8vIENvb2wsIHRoaXMgc29ja2V0IGlzIGdvb2QgdG8gZ28sIHNldCBpdCBhcyB0aGUgc2VydmVyU29ja2V0XwotICBzZXJ2ZXJTb2NrZXRfID0gczsKLX0KLQotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSB7Ci0gIGlmIChwaXBlKG5vdGlmaWNhdGlvblBpcGVGRHNfKSAhPSAwKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlICIsIGVycm5vKTsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oImNhbid0IGNyZWF0ZSBub3RpZmljYXRpb24gcGlwZSIpOwotICB9Ci0gIGludCBmbGFnczsKLSAgaWYgKChmbGFncyA9IGZjbnRsKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdLCBGX0dFVEZMLCAwKSkgPCAwIHx8Ci0gICAgICBmY250bChub3RpZmljYXRpb25QaXBlRkRzX1swXSwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA8IDApIHsKLSAgICBjbG9zZShub3RpZmljYXRpb25QaXBlRkRzX1swXSk7Ci0gICAgY2xvc2Uobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpIE9fTk9OQkxPQ0siKTsKLSAgfQotfQotCi0vKioKLSAqIFJlZ2lzdGVyIHRoZSBjb3JlIGxpYmV2ZW50IGV2ZW50cyBvbnRvIHRoZSBwcm9wZXIgYmFzZS4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnJlZ2lzdGVyRXZlbnRzKGV2ZW50X2Jhc2UqIGJhc2UpIHsKLSAgYXNzZXJ0KHNlcnZlclNvY2tldF8gIT0gLTEpOwotICBhc3NlcnQoIWV2ZW50QmFzZV8pOwotICBldmVudEJhc2VfID0gYmFzZTsKLQotICAvLyBQcmludCBzb21lIGxpYmV2ZW50IHN0YXRzCi0gIEdsb2JhbE91dHB1dC5wcmludGYoImxpYmV2ZW50ICVzIG1ldGhvZCAlcyIsCi0gICAgICAgICAgZXZlbnRfZ2V0X3ZlcnNpb24oKSwKLSAgICAgICAgICBldmVudF9nZXRfbWV0aG9kKCkpOwotCi0gIC8vIFJlZ2lzdGVyIHRoZSBzZXJ2ZXIgZXZlbnQKLSAgZXZlbnRfc2V0KCZzZXJ2ZXJFdmVudF8sCi0gICAgICAgICAgICBzZXJ2ZXJTb2NrZXRfLAotICAgICAgICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QsCi0gICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV2ZW50SGFuZGxlciwKLSAgICAgICAgICAgIHRoaXMpOwotICBldmVudF9iYXNlX3NldChldmVudEJhc2VfLCAmc2VydmVyRXZlbnRfKTsKLQotICAvLyBBZGQgdGhlIGV2ZW50IGFuZCBzdGFydCB1cCB0aGUgc2VydmVyCi0gIGlmICgtMSA9PSBldmVudF9hZGQoJnNlcnZlckV2ZW50XywgMCkpIHsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCk6IGNvdWx0IG5vdCBldmVudF9hZGQiKTsKLSAgfQotICBpZiAodGhyZWFkUG9vbFByb2Nlc3NpbmdfKSB7Ci0gICAgLy8gQ3JlYXRlIGFuIGV2ZW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gYSB0YXNrIGZpbmlzaGVzCi0gICAgZXZlbnRfc2V0KCZub3RpZmljYXRpb25FdmVudF8sCi0gICAgICAgICAgICAgIGdldE5vdGlmaWNhdGlvblJlY3ZGRCgpLAotICAgICAgICAgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCwKLSAgICAgICAgICAgICAgVENvbm5lY3Rpb246OnRhc2tIYW5kbGVyLAotICAgICAgICAgICAgICB0aGlzKTsKLQotICAgIC8vIEF0dGFjaCB0byB0aGUgYmFzZQotICAgIGV2ZW50X2Jhc2Vfc2V0KGV2ZW50QmFzZV8sICZub3RpZmljYXRpb25FdmVudF8pOwotCi0gICAgLy8gQWRkIHRoZSBldmVudCBhbmQgc3RhcnQgdXAgdGhlIHNlcnZlcgotICAgIGlmICgtMSA9PSBldmVudF9hZGQoJm5vdGlmaWNhdGlvbkV2ZW50XywgMCkpIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogbm90aWZpY2F0aW9uIGV2ZW50X2FkZCBmYWlsIik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXRUaHJlYWRNYW5hZ2VyKGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpIHsKLSAgdGhyZWFkTWFuYWdlcl8gPSB0aHJlYWRNYW5hZ2VyOwotICBpZiAodGhyZWFkTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soc3RkOjp0cjE6OmJpbmQoJlROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2UsIHRoaXMsIHN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8xKSk7Ci0gICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSBmYWxzZTsKLSAgfQotfQotCi1ib29sICBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlck92ZXJsb2FkZWQoKSB7Ci0gIHNpemVfdCBhY3RpdmVDb25uZWN0aW9ucyA9IG51bVRDb25uZWN0aW9uc18gLSBjb25uZWN0aW9uU3RhY2tfLnNpemUoKTsKLSAgaWYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfID4gbWF4QWN0aXZlUHJvY2Vzc29yc18gfHwKLSAgICAgIGFjdGl2ZUNvbm5lY3Rpb25zID4gbWF4Q29ubmVjdGlvbnNfKSB7Ci0gICAgaWYgKCFvdmVybG9hZGVkXykgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigidGhyaWZ0IG5vbi1ibG9ja2luZyBzZXJ2ZXIgb3ZlcmxvYWQgY29uZGl0aW9uIik7Ci0gICAgICBvdmVybG9hZGVkXyA9IHRydWU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChvdmVybG9hZGVkXyAmJgotICAgICAgICAobnVtQWN0aXZlUHJvY2Vzc29yc18gPD0gb3ZlcmxvYWRIeXN0ZXJlc2lzXyAqIG1heEFjdGl2ZVByb2Nlc3NvcnNfKSAmJgotICAgICAgICAoYWN0aXZlQ29ubmVjdGlvbnMgPD0gb3ZlcmxvYWRIeXN0ZXJlc2lzXyAqIG1heENvbm5lY3Rpb25zXykpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInRocmlmdCBub24tYmxvY2tpbmcgc2VydmVyIG92ZXJsb2FkIGVuZGVkOyAldSBkcm9wcGVkICglbGx1IHRvdGFsKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfLCBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKTsKLSAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfID0gMDsKLSAgICAgIG92ZXJsb2FkZWRfID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG92ZXJsb2FkZWRfOwotfQotCi1ib29sIFROb25ibG9ja2luZ1NlcnZlcjo6ZHJhaW5QZW5kaW5nVGFzaygpIHsKLSAgaWYgKHRocmVhZE1hbmFnZXJfKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSB0aHJlYWRNYW5hZ2VyXy0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKLSAgICBpZiAodGFzaykgewotICAgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPQotICAgICAgICBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOwotICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkKLSAgICAgICAgICAgICAmJiBjb25uZWN0aW9uLT5nZXRTdGF0ZSgpID09IEFQUF9XQUlUX1RBU0spOwotICAgICAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Ci0gIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0KLSAgICBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOwotICBhc3NlcnQoY29ubmVjdGlvbiAmJiBjb25uZWN0aW9uLT5nZXRTZXJ2ZXIoKQotCSAmJiBjb25uZWN0aW9uLT5nZXRTdGF0ZSgpID09IEFQUF9XQUlUX1RBU0spOwotICBjb25uZWN0aW9uLT5mb3JjZUNsb3NlKCk7Ci19Ci0KLS8qKgotICogTWFpbiB3b3JraG9yc2UgZnVuY3Rpb24sIHN0YXJ0cyB1cCB0aGUgc2VydmVyIGxpc3RlbmluZyBvbiBhIHBvcnQgYW5kCi0gKiBsb29wcyBvdmVyIHRoZSBsaWJldmVudCBoYW5kbGVyLgotICovCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSB7Ci0gIC8vIEluaXQgc29ja2V0Ci0gIGxpc3RlblNvY2tldCgpOwotCi0gIGlmICh0aHJlYWRQb29sUHJvY2Vzc2luZ18pIHsKLSAgICAvLyBJbml0IHRhc2sgY29tcGxldGlvbiBub3RpZmljYXRpb24gcGlwZQotICAgIGNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgbGliZXZlbnQgY29yZQotICByZWdpc3RlckV2ZW50cyhzdGF0aWNfY2FzdDxldmVudF9iYXNlKj4oZXZlbnRfaW5pdCgpKSk7Ci0KLSAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAotICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKLSAgfQotCi0gIC8vIFJ1biBsaWJldmVudCBlbmdpbmUsIG5ldmVyIHJldHVybnMsIGludm9rZXMgY2FsbHMgdG8gZXZlbnRIYW5kbGVyCi0gIGV2ZW50X2Jhc2VfbG9vcChldmVudEJhc2VfLCAwKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmNDZjNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU0VSVkVSX1ROT05CTE9DS0lOR1NFUlZFUl9IXwotI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8gMQotCi0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGV2ZW50Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI7Ci0KLS8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgY2xhc3MKLWNsYXNzIFRDb25uZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgc2VydmVyIGluIEMrKyBmb3IgaGlnaCBwZXJmb3JtYW5jZSB0aGF0IG9wZXJhdGVzIGEKLSAqIHNpbmdsZSBJTyB0aHJlYWQuIEl0IGFzc3VtZXMgdGhhdCBhbGwgaW5jb21pbmcgcmVxdWVzdHMgYXJlIGZyYW1lZCB3aXRoIGEKLSAqIDQgYnl0ZSBsZW5ndGggaW5kaWNhdG9yIGFuZCB3cml0ZXMgb3V0IHJlc3BvbnNlcyB1c2luZyB0aGUgc2FtZSBmcmFtaW5nLgotICoKLSAqIEl0IGRvZXMgbm90IHVzZSB0aGUgVFNlcnZlclRyYW5zcG9ydCBmcmFtZXdvcmssIGJ1dCByYXRoZXIgaGFzIHNvY2tldAotICogb3BlcmF0aW9ucyBoYXJkY29kZWQgZm9yIHVzZSB3aXRoIHNlbGVjdC4KLSAqCi0gKi8KLQotCi0vLy8gT3ZlcmxvYWQgY29uZGl0aW9uIGFjdGlvbnMuCi1lbnVtIFRPdmVybG9hZEFjdGlvbiB7Ci0gIFRfT1ZFUkxPQURfTk9fQUNUSU9OLCAgICAgICAgLy8vPCBEb24ndCBoYW5kbGUgb3ZlcmxvYWQgKi8KLSAgVF9PVkVSTE9BRF9DTE9TRV9PTl9BQ0NFUFQsICAvLy88IERyb3AgbmV3IGNvbm5lY3Rpb25zIGltbWVkaWF0ZWx5ICovCi0gIFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSAgLy8vPCBEcm9wIHNvbWUgdGFza3MgZnJvbSBoZWFkIG9mIHRhc2sgcXVldWUgKi8KLX07Ci0KLWNsYXNzIFROb25ibG9ja2luZ1NlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKLSBwcml2YXRlOgotICAvLy8gTGlzdGVuIGJhY2tsb2cKLSAgc3RhdGljIGNvbnN0IGludCBMSVNURU5fQkFDS0xPRyA9IDEwMjQ7Ci0KLSAgLy8vIERlZmF1bHQgbGltaXQgb24gc2l6ZSBvZiBpZGxlIGNvbm5lY3Rpb24gcG9vbAotICBzdGF0aWMgY29uc3Qgc2l6ZV90IENPTk5FQ1RJT05fU1RBQ0tfTElNSVQgPSAxMDI0OwotCi0gIC8vLyBNYXhpbXVtIHNpemUgb2YgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIGNvbm5lY3Rpb24KLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IElETEVfQlVGRkVSX01FTV9MSU1JVCA9IDgxOTI7Ci0KLSAgLy8vIERlZmF1bHQgbGltaXQgb24gdG90YWwgbnVtYmVyIG9mIGNvbm5lY3RlZCBzb2NrZXRzCi0gIHN0YXRpYyBjb25zdCBpbnQgTUFYX0NPTk5FQ1RJT05TID0gSU5UX01BWDsKLQotICAvLy8gRGVmYXVsdCBsaW1pdCBvbiBjb25uZWN0aW9ucyBpbiBoYW5kbGVyL3Rhc2sgcHJvY2Vzc2luZwotICBzdGF0aWMgY29uc3QgaW50IE1BWF9BQ1RJVkVfUFJPQ0VTU09SUyA9IElOVF9NQVg7Ci0KLSAgLy8vIFNlcnZlciBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCi0gIGludCBzZXJ2ZXJTb2NrZXRfOwotCi0gIC8vLyBQb3J0IHNlcnZlciBydW5zIG9uCi0gIGludCBwb3J0XzsKLQotICAvLy8gRm9yIHByb2Nlc3NpbmcgdmlhIHRocmVhZCBwb29sLCBtYXkgYmUgTlVMTAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKLQotICAvLy8gSXMgdGhyZWFkIHBvb2wgcHJvY2Vzc2luZz8KLSAgYm9vbCB0aHJlYWRQb29sUHJvY2Vzc2luZ187Ci0KLSAgLy8vIFRoZSBldmVudCBiYXNlIGZvciBsaWJldmVudAotICBldmVudF9iYXNlKiBldmVudEJhc2VfOwotCi0gIC8vLyBFdmVudCBzdHJ1Y3QsIHVzZWQgd2l0aCBldmVudEJhc2VfIGZvciBjb25uZWN0aW9uIGV2ZW50cwotICBzdHJ1Y3QgZXZlbnQgc2VydmVyRXZlbnRfOwotCi0gIC8vLyBFdmVudCBzdHJ1Y3QsIHVzZWQgd2l0aCBldmVudEJhc2VfIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uCi0gIHN0cnVjdCBldmVudCBub3RpZmljYXRpb25FdmVudF87Ci0KLSAgLy8vIE51bWJlciBvZiBUQ29ubmVjdGlvbiBvYmplY3Qgd2UndmUgY3JlYXRlZAotICBzaXplX3QgbnVtVENvbm5lY3Rpb25zXzsKLQotICAvLy8gTnVtYmVyIG9mIENvbm5lY3Rpb25zIHByb2Nlc3Npbmcgb3Igd2FpdGluZyB0byBwcm9jZXNzCi0gIHNpemVfdCBudW1BY3RpdmVQcm9jZXNzb3JzXzsKLQotICAvLy8gTGltaXQgZm9yIGhvdyBtYW55IFRDb25uZWN0aW9uIG9iamVjdHMgdG8gY2FjaGUKLSAgc2l6ZV90IGNvbm5lY3Rpb25TdGFja0xpbWl0XzsKLQotICAvLy8gTGltaXQgZm9yIG51bWJlciBvZiBjb25uZWN0aW9ucyBwcm9jZXNzaW5nIG9yIHdhaXRpbmcgdG8gcHJvY2VzcwotICBzaXplX3QgbWF4QWN0aXZlUHJvY2Vzc29yc187Ci0KLSAgLy8vIExpbWl0IGZvciBudW1iZXIgb2Ygb3BlbiBjb25uZWN0aW9ucwotICBzaXplX3QgbWF4Q29ubmVjdGlvbnNfOwotCi0gIC8vLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgYW4gdW5wZXJmb3JtZWQgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KLSAgaW50NjRfdCB0YXNrRXhwaXJlVGltZV87Ci0KLSAgLyoqCi0gICAqIEh5c3RlcmVzaXMgZm9yIG92ZXJsb2FkIHN0YXRlLiAgVGhpcyBpcyB0aGUgZnJhY3Rpb24gb2YgdGhlIG92ZXJsb2FkCi0gICAqIHZhbHVlIHRoYXQgbmVlZHMgdG8gYmUgcmVhY2hlZCBiZWZvcmUgdGhlIG92ZXJsb2FkIHN0YXRlIGlzIGNsZWFyZWQ7Ci0gICAqIG11c3QgYmUgPD0gMS4wLgotICAgKi8KLSAgZG91YmxlIG92ZXJsb2FkSHlzdGVyZXNpc187Ci0KLSAgLy8vIEFjdGlvbiB0byB0YWtlIHdoZW4gd2UncmUgb3ZlcmxvYWRlZC4KLSAgVE92ZXJsb2FkQWN0aW9uIG92ZXJsb2FkQWN0aW9uXzsKLQotICAvKioKLSAgICogTWF4IHJlYWQgYnVmZmVyIHNpemUgZm9yIGFuIGlkbGUgY29ubmVjdGlvbi4gIFdoZW4gd2UgcGxhY2UgYW4gaWRsZQotICAgKiBUQ29ubmVjdGlvbiBpbnRvIGNvbm5lY3Rpb25TdGFja18sIHdlIGluc3VyZSB0aGF0IGl0cyByZWFkIGJ1ZmZlciBpcwotICAgKiByZWR1Y2VkIHRvIHRoaXMgc2l6ZSB0byBpbnN1cmUgdGhhdCBpZGxlIGNvbm5lY3Rpb25zIGRvbid0IGhvZyBtZW1vcnkuCi0gICAqLwotICBzaXplX3QgaWRsZUJ1ZmZlck1lbUxpbWl0XzsKLQotICAvLy8gU2V0IGlmIHdlIGFyZSBjdXJyZW50bHkgaW4gYW4gb3ZlcmxvYWRlZCBzdGF0ZS4KLSAgYm9vbCBvdmVybG9hZGVkXzsKLQotICAvLy8gQ291bnQgb2YgY29ubmVjdGlvbnMgZHJvcHBlZCBzaW5jZSBvdmVybG9hZCBzdGFydGVkCi0gIHVpbnQzMl90IG5Db25uZWN0aW9uc0Ryb3BwZWRfOwotCi0gIC8vLyBDb3VudCBvZiBjb25uZWN0aW9ucyBkcm9wcGVkIG9uIG92ZXJsb2FkIHNpbmNlIHNlcnZlciBzdGFydGVkCi0gIHVpbnQ2NF90IG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF87Ci0KLSAgLy8vIEZpbGUgZGVzY3JpcHRvcnMgZm9yIHBpcGUgdXNlZCBmb3IgdGFzayBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4KLSAgaW50IG5vdGlmaWNhdGlvblBpcGVGRHNfWzJdOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIGEgc3RhY2sgb2YgYWxsIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgYnV0IHRoYXQKLSAgICogYXJlIE5PVCBjdXJyZW50bHkgaW4gdXNlLiBXaGVuIHdlIGNsb3NlIGEgY29ubmVjdGlvbiwgd2UgcGxhY2UgaXQgb24gdGhpcwotICAgKiBzdGFjayBzbyB0aGF0IHRoZSBvYmplY3QgY2FuIGJlIHJldXNlZCBsYXRlciwgcmF0aGVyIHRoYW4gZnJlZWluZyB0aGUKLSAgICogbWVtb3J5IGFuZCByZWFsbG9jYXRpbmcgYSBuZXcgb2JqZWN0IGxhdGVyLgotICAgKi8KLSAgc3RkOjpzdGFjazxUQ29ubmVjdGlvbio+IGNvbm5lY3Rpb25TdGFja187Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIHNlcnZlciBzb2NrZXQgaGFkIHNvbWV0aGluZyBoYXBwZW4uICBXZSBhY2NlcHQgYWxsIHdhaXRpbmcKLSAgICogY2xpZW50IGNvbm5lY3Rpb25zIG9uIGxpc3RlbiBzb2NrZXQgZmQgYW5kIGFzc2lnbiBUQ29ubmVjdGlvbiBvYmplY3RzCi0gICAqIHRvIGhhbmRsZSB0aG9zZSByZXF1ZXN0cy4KLSAgICoKLSAgICogQHBhcmFtIGZkIHRoZSBsaXN0ZW4gc29ja2V0LgotICAgKiBAcGFyYW0gd2hpY2ggdGhlIGV2ZW50IGZsYWcgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIuCi0gICAqLwotICB2b2lkIGhhbmRsZUV2ZW50KGludCBmZCwgc2hvcnQgd2hpY2gpOwotCi0gcHVibGljOgotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvciksCi0gICAgc2VydmVyU29ja2V0XygtMSksCi0gICAgcG9ydF8ocG9ydCksCi0gICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfKGZhbHNlKSwKLSAgICBldmVudEJhc2VfKE5VTEwpLAotICAgIG51bVRDb25uZWN0aW9uc18oMCksCi0gICAgbnVtQWN0aXZlUHJvY2Vzc29yc18oMCksCi0gICAgY29ubmVjdGlvblN0YWNrTGltaXRfKENPTk5FQ1RJT05fU1RBQ0tfTElNSVQpLAotICAgIG1heEFjdGl2ZVByb2Nlc3NvcnNfKE1BWF9BQ1RJVkVfUFJPQ0VTU09SUyksCi0gICAgbWF4Q29ubmVjdGlvbnNfKE1BWF9DT05ORUNUSU9OUyksCi0gICAgdGFza0V4cGlyZVRpbWVfKDApLAotICAgIG92ZXJsb2FkSHlzdGVyZXNpc18oMC44KSwKLSAgICBvdmVybG9hZEFjdGlvbl8oVF9PVkVSTE9BRF9OT19BQ1RJT04pLAotICAgIGlkbGVCdWZmZXJNZW1MaW1pdF8oSURMRV9CVUZGRVJfTUVNX0xJTUlUKSwKLSAgICBvdmVybG9hZGVkXyhmYWxzZSksCi0gICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8oMCksCi0gICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXygwKSB7fQotCi0gIFROb25ibG9ja2luZ1NlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IpLAotICAgIHNlcnZlclNvY2tldF8oLTEpLAotICAgIHBvcnRfKHBvcnQpLAotICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAotICAgIGV2ZW50QmFzZV8oTlVMTCksCi0gICAgbnVtVENvbm5lY3Rpb25zXygwKSwKLSAgICBudW1BY3RpdmVQcm9jZXNzb3JzXygwKSwKLSAgICBjb25uZWN0aW9uU3RhY2tMaW1pdF8oQ09OTkVDVElPTl9TVEFDS19MSU1JVCksCi0gICAgbWF4QWN0aXZlUHJvY2Vzc29yc18oTUFYX0FDVElWRV9QUk9DRVNTT1JTKSwKLSAgICBtYXhDb25uZWN0aW9uc18oTUFYX0NPTk5FQ1RJT05TKSwKLSAgICB0YXNrRXhwaXJlVGltZV8oMCksCi0gICAgb3ZlcmxvYWRIeXN0ZXJlc2lzXygwLjgpLAotICAgIG92ZXJsb2FkQWN0aW9uXyhUX09WRVJMT0FEX05PX0FDVElPTiksCi0gICAgaWRsZUJ1ZmZlck1lbUxpbWl0XyhJRExFX0JVRkZFUl9NRU1fTElNSVQpLAotICAgIG92ZXJsb2FkZWRfKGZhbHNlKSwKLSAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXygwKSwKLSAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKDApIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOwotICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7Ci0gIH0KLQotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IpLAotICAgIHNlcnZlclNvY2tldF8oLTEpLAotICAgIHBvcnRfKHBvcnQpLAotICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAotICAgIGV2ZW50QmFzZV8oTlVMTCksCi0gICAgbnVtVENvbm5lY3Rpb25zXygwKSwKLSAgICBudW1BY3RpdmVQcm9jZXNzb3JzXygwKSwKLSAgICBjb25uZWN0aW9uU3RhY2tMaW1pdF8oQ09OTkVDVElPTl9TVEFDS19MSU1JVCksCi0gICAgbWF4QWN0aXZlUHJvY2Vzc29yc18oTUFYX0FDVElWRV9QUk9DRVNTT1JTKSwKLSAgICBtYXhDb25uZWN0aW9uc18oTUFYX0NPTk5FQ1RJT05TKSwKLSAgICB0YXNrRXhwaXJlVGltZV8oMCksCi0gICAgb3ZlcmxvYWRIeXN0ZXJlc2lzXygwLjgpLAotICAgIG92ZXJsb2FkQWN0aW9uXyhUX09WRVJMT0FEX05PX0FDVElPTiksCi0gICAgaWRsZUJ1ZmZlck1lbUxpbWl0XyhJRExFX0JVRkZFUl9NRU1fTElNSVQpLAotICAgIG92ZXJsb2FkZWRfKGZhbHNlKSwKLSAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXygwKSwKLSAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKDApIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoaW5wdXRUcmFuc3BvcnRGYWN0b3J5KTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGlucHV0UHJvdG9jb2xGYWN0b3J5KTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkob3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKLSAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwotICB9Ci0KLSAgflROb25ibG9ja2luZ1NlcnZlcigpIHt9Ci0KLSAgdm9pZCBzZXRUaHJlYWRNYW5hZ2VyKGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSB7Ci0gICAgcmV0dXJuIHRocmVhZE1hbmFnZXJfOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIFRDb25uZWN0aW9uIHdlIHdpbGwgaG9sZCBpbiByZXNlcnZlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGxpbWl0IG9uIFRDb25uZWN0aW9uIHBvb2wgc2l6ZS4KLSAgICovCi0gIHNpemVfdCBnZXRDb25uZWN0aW9uU3RhY2tMaW1pdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY29ubmVjdGlvblN0YWNrTGltaXRfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIFRDb25uZWN0aW9uIHdlIHdpbGwgaG9sZCBpbiByZXNlcnZlLgotICAgKgotICAgKiBAcGFyYW0gc3ogdGhlIG5ldyBsaW1pdCBmb3IgVENvbm5lY3Rpb24gcG9vbCBzaXplLgotICAgKi8KLSAgdm9pZCBzZXRDb25uZWN0aW9uU3RhY2tMaW1pdChzaXplX3Qgc3opIHsKLSAgICBjb25uZWN0aW9uU3RhY2tMaW1pdF8gPSBzejsKLSAgfQotCi0gIGJvb2wgaXNUaHJlYWRQb29sUHJvY2Vzc2luZygpIGNvbnN0IHsKLSAgICByZXR1cm4gdGhyZWFkUG9vbFByb2Nlc3NpbmdfOwotICB9Ci0KLSAgdm9pZCBhZGRUYXNrKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Ci0gICAgdGhyZWFkTWFuYWdlcl8tPmFkZCh0YXNrLCAwTEwsIHRhc2tFeHBpcmVUaW1lXyk7Ci0gIH0KLQotICBldmVudF9iYXNlKiBnZXRFdmVudEJhc2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGV2ZW50QmFzZV87Ci0gIH0KLQotICAvLy8gSW5jcmVtZW50IG91ciBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBzb2NrZXRzLgotICB2b2lkIGluY3JlbWVudE51bUNvbm5lY3Rpb25zKCkgewotICAgICsrbnVtVENvbm5lY3Rpb25zXzsKLSAgfQotCi0gIC8vLyBEZWNyZW1lbnQgb3VyIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIHNvY2tldHMuCi0gIHZvaWQgZGVjcmVtZW50TnVtQ29ubmVjdGlvbnMoKSB7Ci0gICAgLS1udW1UQ29ubmVjdGlvbnNfOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY291bnQgb2Ygc29ja2V0cyBjdXJyZW50bHkgY29ubmVjdGVkIHRvLgotICAgKgotICAgKiBAcmV0dXJuIGNvdW50IG9mIGNvbm5lY3RlZCBzb2NrZXRzLgotICAgKi8KLSAgc2l6ZV90IGdldE51bUNvbm5lY3Rpb25zKCkgY29uc3QgewotICAgIHJldHVybiBudW1UQ29ubmVjdGlvbnNfOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY291bnQgb2YgY29ubmVjdGlvbiBvYmplY3RzIGFsbG9jYXRlZCBidXQgbm90IGluIHVzZS4KLSAgICoKLSAgICogQHJldHVybiBjb3VudCBvZiBpZGxlIGNvbm5lY3Rpb24gb2JqZWN0cy4KLSAgICovCi0gIHNpemVfdCBnZXROdW1JZGxlQ29ubmVjdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBjb3VudCBvZiBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nLgotICAgKiBUaGlzIGlzIGRlZmluZWQgYXMgYSBjb25uZWN0aW9uIHdoZXJlIGFsbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIGFuZAotICAgKiBlaXRoZXIgYXNzaWduZWQgYSB0YXNrICh3aGVuIHRocmVhZGluZykgb3IgcGFzc2VkIHRvIGEgaGFuZGxlciAod2hlbgotICAgKiBub3QgdGhyZWFkaW5nKSwgYW5kIHdoZXJlIHRoZSBoYW5kbGVyIGhhcyBub3QgeWV0IHJldHVybmVkLgotICAgKgotICAgKiBAcmV0dXJuICMgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCi0gICAqLwotICBzaXplX3QgZ2V0TnVtQWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtQWN0aXZlUHJvY2Vzc29yc187Ci0gIH0KLQotICAvLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KLSAgdm9pZCBpbmNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCkgewotICAgICsrbnVtQWN0aXZlUHJvY2Vzc29yc187Ci0gIH0KLQotICAvLy8gRGVjcmVtZW50IHRoZSBjb3VudCBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KLSAgdm9pZCBkZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCkgewotICAgIGlmIChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IDApIHsKLSAgICAgIC0tbnVtQWN0aXZlUHJvY2Vzc29yc187Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgYmVmb3JlIG92ZXJsb2FkLgotICAgKgotICAgKiBAcmV0dXJuIGN1cnJlbnQgc2V0dGluZy4KLSAgICovCi0gIHNpemVfdCBnZXRNYXhDb25uZWN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbWF4Q29ubmVjdGlvbnNfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgYmVmb3JlIG92ZXJsb2FkLgotICAgKgotICAgKiBAcGFyYW0gbWF4Q29ubmVjdGlvbnMgbmV3IHNldHRpbmcgZm9yIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucy4KLSAgICovCi0gIHZvaWQgc2V0TWF4Q29ubmVjdGlvbnMoc2l6ZV90IG1heENvbm5lY3Rpb25zKSB7Ci0gICAgbWF4Q29ubmVjdGlvbnNfID0gbWF4Q29ubmVjdGlvbnM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgd2FpdGluZyBpbiBoYW5kbGVyL3Rhc2sgYmVmb3JlIG92ZXJsb2FkLgotICAgKgotICAgKiBAcmV0dXJuIGN1cnJlbnQgc2V0dGluZy4KLSAgICovCi0gIHNpemVfdCBnZXRNYXhBY3RpdmVQcm9jZXNzb3JzKCkgY29uc3QgewotICAgIHJldHVybiBtYXhBY3RpdmVQcm9jZXNzb3JzXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyB3YWl0aW5nIGluIGhhbmRsZXIvdGFzayBiZWZvcmUgb3ZlcmxvYWQuCi0gICAqCi0gICAqIEBwYXJhbSBtYXhBY3RpdmVQcm9jZXNzb3JzIG5ldyBzZXR0aW5nIGZvciBtYXhpbXVtICMgb2YgYWN0aXZlIHByb2Nlc3Nlcy4KLSAgICovCi0gIHZvaWQgc2V0TWF4QWN0aXZlUHJvY2Vzc29ycyhzaXplX3QgbWF4QWN0aXZlUHJvY2Vzc29ycykgewotICAgIG1heEFjdGl2ZVByb2Nlc3NvcnNfID0gbWF4QWN0aXZlUHJvY2Vzc29yczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgZnJhY3Rpb24gb2YgbWF4aW11bSBsaW1pdHMgYmVmb3JlIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpcyBjbGVhcmVkLgotICAgKgotICAgKiBAcmV0dXJuIGh5c3RlcmVzaXMgZnJhY3Rpb24KLSAgICovCi0gIGRvdWJsZSBnZXRPdmVybG9hZEh5c3RlcmVzaXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG92ZXJsb2FkSHlzdGVyZXNpc187Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGZyYWN0aW9uIG9mIG1heGltdW0gbGltaXRzIGJlZm9yZSBhbiBvdmVybG9hZCBjb25kaXRpb24gaXMgY2xlYXJlZC4KLSAgICogQSBnb29kIHZhbHVlIHdvdWxkIHByb2JhYmx5IGJlIGJldHdlZW4gMC41IGFuZCAwLjkuCi0gICAqCi0gICAqIEBwYXJhbSBoeXN0ZXJlc2lzRnJhY3Rpb24gZnJhY3Rpb24gPD0gMS4wLgotICAgKi8KLSAgdm9pZCBzZXRPdmVybG9hZEh5c3RlcmVzaXMoZG91YmxlIGh5c3RlcmVzaXNGcmFjdGlvbikgewotICAgIGlmIChoeXN0ZXJlc2lzRnJhY3Rpb24gPD0gMS4wICYmIGh5c3RlcmVzaXNGcmFjdGlvbiA+IDAuMCkgewotICAgICAgb3ZlcmxvYWRIeXN0ZXJlc2lzXyA9IGh5c3RlcmVzaXNGcmFjdGlvbjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBhY3Rpb24gdGhlIHNlcnZlciB3aWxsIHRha2Ugb24gb3ZlcmxvYWQuCi0gICAqCi0gICAqIEByZXR1cm4gYSBUT3ZlcmxvYWRBY3Rpb24gZW51bSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnRseSBzZXQgYWN0aW9uLgotICAgKi8KLSAgVE92ZXJsb2FkQWN0aW9uIGdldE92ZXJsb2FkQWN0aW9uKCkgY29uc3QgewotICAgIHJldHVybiBvdmVybG9hZEFjdGlvbl87Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBhY3Rpb24gdGhlIHNlcnZlciBpcyB0byB0YWtlIG9uIG92ZXJsb2FkLgotICAgKgotICAgKiBAcGFyYW0gb3ZlcmxvYWRBY3Rpb24gYSBUT3ZlcmxvYWRBY3Rpb24gZW51bSB2YWx1ZSBmb3IgdGhlIGFjdGlvbi4KLSAgICovCi0gIHZvaWQgc2V0T3ZlcmxvYWRBY3Rpb24oVE92ZXJsb2FkQWN0aW9uIG92ZXJsb2FkQWN0aW9uKSB7Ci0gICAgb3ZlcmxvYWRBY3Rpb25fID0gb3ZlcmxvYWRBY3Rpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCBhIHRhc2sgZXhwaXJlcyAoMCA9PSBpbmZpbml0ZSkuCi0gICAqCi0gICAqIEByZXR1cm4gYSA2NC1iaXQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gICAqLwotICBpbnQ2NF90IGdldFRhc2tFeHBpcmVUaW1lKCkgY29uc3QgewotICAgIHJldHVybiB0YXNrRXhwaXJlVGltZV87Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCBhIHRhc2sgZXhwaXJlcyAoMCA9PSBpbmZpbml0ZSkuCi0gICAqCi0gICAqIEBwYXJhbSB0YXNrRXhwaXJlVGltZSBhIDY0LWJpdCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIHZvaWQgc2V0VGFza0V4cGlyZVRpbWUoaW50NjRfdCB0YXNrRXhwaXJlVGltZSkgewotICAgIHRhc2tFeHBpcmVUaW1lXyA9IHRhc2tFeHBpcmVUaW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBvdmVybG9hZGVkLgotICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgbWF4aW11bXMgZm9yIG9wZW4gY29ubmVjdGlvbnMgYW5kIGNvbm5lY3Rpb25zCi0gICAqIGN1cnJlbnRseSBpbiBwcm9jZXNzaW5nLCBhbmQgc2V0cyBhbiBvdmVybG9hZCBjb25kaXRpb24gaWYgdGhleSBhcmUKLSAgICogZXhjZWVkZWQuICBUaGUgb3ZlcmxvYWQgd2lsbCBwZXJzaXN0IHVudGlsIGJvdGggdmFsdWVzIGFyZSBiZWxvdyB0aGUKLSAgICogY3VycmVudCBoeXN0ZXJlc2lzIGZyYWN0aW9uIG9mIHRoZWlyIG1heGltdW1zLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGV4aXN0cywgZmFsc2UgaWYgbm90LgotICAgKi8KLSAgYm9vbCBzZXJ2ZXJPdmVybG9hZGVkKCk7Ci0KLSAgLyoqIFBvcCBhbmQgZGlzY2FyZCBuZXh0IHRhc2sgb24gdGhyZWFkcG9vbCB3YWl0IHF1ZXVlLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgYSB0YXNrIHdhcyBkaXNjYXJkZWQsIGZhbHNlIGlmIHRoZSB3YWl0IHF1ZXVlIHdhcyBlbXB0eS4KLSAgICovCi0gIGJvb2wgZHJhaW5QZW5kaW5nVGFzaygpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1heGltdW0gbGltaXQgb2YgbWVtb3J5IGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCi0gICAqCi0gICAqIEByZXR1cm4gIyBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBzaHJpbmsgYnVmZmVycyB3aGVuIGlkbGUuCi0gICAqLwotICBzaXplX3QgZ2V0SWRsZUJ1ZmZlck1lbUxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlQnVmZmVyTWVtTGltaXRfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWF4aW11bSBsaW1pdCBvZiBtZW1vcnkgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KLSAgICogSWYgYSBUQ29ubmVjdGlvbiBvYmplY3QgZ29lcyBpZGxlIHdpdGggbW9yZSB0aGFuIHRoaXMgbXVjaCBtZW1vcnkKLSAgICogYWxsb2NhdGVkIHRvIGl0cyBidWZmZXIsIHdlIHNocmluayBpdCB0byB0aGlzIHZhbHVlLgotICAgKgotICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBpZGxlLgotICAgKi8KLSAgdm9pZCBzZXRJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IGxpbWl0KSB7Ci0gICAgaWRsZUJ1ZmZlck1lbUxpbWl0XyA9IGxpbWl0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhbiBpbml0aWFsaXplZCBjb25uZWN0aW9uIG9iamVjdC4gIENyZWF0ZXMgb3IgcmVjb3ZlcnMgZnJvbQotICAgKiBwb29sIGEgVENvbm5lY3Rpb24gYW5kIGluaXRpYWxpemVzIGl0IHdpdGggdGhlIHByb3ZpZGVkIHNvY2tldCBGRAotICAgKiBhbmQgZmxhZ3MuCi0gICAqCi0gICAqIEBwYXJhbSBzb2NrZXQgRkQgb2Ygc29ja2V0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24uCi0gICAqIEBwYXJhbSBmbGFncyBpbml0aWFsIGxpYl9ldmVudCBmbGFncyBmb3IgdGhpcyBjb25uZWN0aW9uLgotICAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZWQgVENvbm5lY3Rpb24gb2JqZWN0LgotICAgKi8KLSAgVENvbm5lY3Rpb24qIGNyZWF0ZUNvbm5lY3Rpb24oaW50IHNvY2tldCwgc2hvcnQgZmxhZ3MpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byBwb29sIG9yIGRlbGV0aW9uLiAgSWYgdGhlIGNvbm5lY3Rpb24gcG9vbAotICAgKiAoYSBzdGFjaykgaXNuJ3QgZnVsbCwgcGxhY2UgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IG9uIGl0LCBvdGhlcndpc2UKLSAgICoganVzdCBkZWxldGUgaXQuCi0gICAqCi0gICAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBUQ29uZWN0aW9uIGJlaW5nIHJldHVybmVkLgotICAgKi8KLSAgdm9pZCByZXR1cm5Db25uZWN0aW9uKFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKTsKLQotICAvKioKLSAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB0aGUgdGhyZWFkbWFuYWdlciBjYWxscyB3aGVuIGEgdGFzayByZWFjaGVzCi0gICAqIGl0cyBleHBpcmF0aW9uIHRpbWUuICBJdCBpcyBuZWVkZWQgdG8gY2xlYW4gdXAgdGhlIGV4cGlyZWQgY29ubmVjdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIHRhc2sgdGhlIHJ1bm5hYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhwaXJlZCB0YXNrLgotICAgKi8KLSAgdm9pZCBleHBpcmVDbG9zZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7Ci0KLSAgLyoqCi0gICAqIEMtY2FsbGFibGUgZXZlbnQgaGFuZGxlciBmb3IgbGlzdGVuZXIgZXZlbnRzLiAgUHJvdmlkZXMgYSBjYWxsYmFjawotICAgKiB0aGF0IGxpYmV2ZW50IGNhbiB1bmRlcnN0YW5kIHdoaWNoIGludm9rZXMgc2VydmVyLT5oYW5kbGVFdmVudCgpLgotICAgKgotICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgdGhlIGV2ZW50IG9jY3VyZWQgb24uCi0gICAqIEBwYXJhbSB3aGljaCB0aGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KLSAgICogQHBhcmFtIHYgdm9pZCogY2FsbGJhY2sgYXJnIHdoZXJlIHdlIHBsYWNlZCBUTm9uYmxvY2tpbmdTZXJ2ZXIncyAidGhpcyIuCi0gICAqLwotICBzdGF0aWMgdm9pZCBldmVudEhhbmRsZXIoaW50IGZkLCBzaG9ydCB3aGljaCwgdm9pZCogdikgewotICAgICgoVE5vbmJsb2NraW5nU2VydmVyKil2KS0+aGFuZGxlRXZlbnQoZmQsIHdoaWNoKTsKLSAgfQotCi0gIC8vLyBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCi0gIHZvaWQgbGlzdGVuU29ja2V0KCk7Ci0KLSAgLyoqCi0gICAqIFRha2VzIGEgc29ja2V0IGNyZWF0ZWQgYnkgbGlzdGVuU29ja2V0KCkgYW5kIHNldHMgdmFyaW91cyBvcHRpb25zIG9uIGl0Ci0gICAqIHRvIHByZXBhcmUgZm9yIHVzZSBpbiB0aGUgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gZmQgZGVzY3JpcHRvciBvZiBzb2NrZXQgdG8gYmUgaW5pdGlhbGl6ZWQvCi0gICAqLwotICB2b2lkIGxpc3RlblNvY2tldChpbnQgZmQpOwotCi0gIC8vLyBDcmVhdGUgdGhlIHBpcGUgdXNlZCB0byBub3RpZnkgSS9PIHByb2Nlc3Mgb2YgdGFzayBjb21wbGV0aW9uLgotICB2b2lkIGNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKTsKLQotICAvKioKLSAgICogR2V0IG5vdGlmaWNhdGlvbiBwaXBlIHNlbmQgZGVzY3JpcHRvci4KLSAgICoKLSAgICogQHJldHVybiB3cml0ZSBmZCBmb3IgcGlwZS4KLSAgICovCi0gIGludCBnZXROb3RpZmljYXRpb25TZW5kRkQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBub3RpZmljYXRpb24gcGlwZSByZWNlaXZlIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqIEByZXR1cm4gcmVhZCBmZCBvZiBwaXBlLgotICAgKi8KLSAgaW50IGdldE5vdGlmaWNhdGlvblJlY3ZGRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbm90aWZpY2F0aW9uUGlwZUZEc19bMF07Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhlIGNvcmUgbGliZXZlbnQgZXZlbnRzIG9udG8gdGhlIHByb3BlciBiYXNlLgotICAgKgotICAgKiBAcGFyYW0gYmFzZSBwb2ludGVyIHRvIHRoZSBldmVudCBiYXNlIHRvIGJlIGluaXRpYWxpemVkLgotICAgKi8KLSAgdm9pZCByZWdpc3RlckV2ZW50cyhldmVudF9iYXNlKiBiYXNlKTsKLQotICAvKioKLSAgICogTWFpbiB3b3JraG9yc2UgZnVuY3Rpb24sIHN0YXJ0cyB1cCB0aGUgc2VydmVyIGxpc3RlbmluZyBvbiBhIHBvcnQgYW5kCi0gICAqIGxvb3BzIG92ZXIgdGhlIGxpYmV2ZW50IGhhbmRsZXIuCi0gICAqLwotICB2b2lkIHNlcnZlKCk7Ci19OwotCi0vLy8gVHdvIHN0YXRlcyBmb3Igc29ja2V0cywgcmVjdiBhbmQgc2VuZCBtb2RlCi1lbnVtIFRTb2NrZXRTdGF0ZSB7Ci0gIFNPQ0tFVF9SRUNWLAotICBTT0NLRVRfU0VORAotfTsKLQotLyoqCi0gKiBGaXZlIHN0YXRlcyBmb3IgdGhlIG5vbmJsb2NraW5nIHNlcnZyOgotICogIDEpIGluaXRpYWxpemUKLSAqICAyKSByZWFkIDQgYnl0ZSBmcmFtZSBzaXplCi0gKiAgMykgcmVhZCBmcmFtZSBvZiBkYXRhCi0gKiAgNCkgc2VuZCBiYWNrIGRhdGEgKGlmIGFueSkKLSAqICA1KSBmb3JjZSBpbW1lZGlhdGUgY29ubmVjdGlvbiBjbG9zZQotICovCi1lbnVtIFRBcHBTdGF0ZSB7Ci0gIEFQUF9JTklULAotICBBUFBfUkVBRF9GUkFNRV9TSVpFLAotICBBUFBfUkVBRF9SRVFVRVNULAotICBBUFBfV0FJVF9UQVNLLAotICBBUFBfU0VORF9SRVNVTFQsCi0gIEFQUF9DTE9TRV9DT05ORUNUSU9OCi19OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBjb25uZWN0aW9uIHRoYXQgaXMgaGFuZGxlZCB2aWEgbGliZXZlbnQuIFRoaXMgY29ubmVjdGlvbgotICogZXNzZW50aWFsbHkgZW5jYXBzdWxhdGVzIGEgc29ja2V0IHRoYXQgaGFzIHNvbWUgYXNzb2NpYXRlZCBsaWJldmVudCBzdGF0ZS4KLSAqLwotY2xhc3MgVENvbm5lY3Rpb24gewotIHByaXZhdGU6Ci0KLSAgLy8vIFN0YXJ0aW5nIHNpemUgZm9yIG5ldyBjb25uZWN0aW9uIGJ1ZmZlcgotICBzdGF0aWMgY29uc3QgaW50IFNUQVJUSU5HX0NPTk5FQ1RJT05fQlVGRkVSX1NJWkUgPSAxMDI0OwotCi0gIC8vLyBTZXJ2ZXIgaGFuZGxlCi0gIFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyXzsKLQotICAvLy8gU29ja2V0IGhhbmRsZQotICBpbnQgc29ja2V0XzsKLQotICAvLy8gTGliZXZlbnQgb2JqZWN0Ci0gIHN0cnVjdCBldmVudCBldmVudF87Ci0KLSAgLy8vIExpYmV2ZW50IGZsYWdzCi0gIHNob3J0IGV2ZW50RmxhZ3NfOwotCi0gIC8vLyBTb2NrZXQgbW9kZQotICBUU29ja2V0U3RhdGUgc29ja2V0U3RhdGVfOwotCi0gIC8vLyBBcHBsaWNhdGlvbiBzdGF0ZQotICBUQXBwU3RhdGUgYXBwU3RhdGVfOwotCi0gIC8vLyBIb3cgbXVjaCBkYXRhIG5lZWRlZCB0byByZWFkCi0gIHVpbnQzMl90IHJlYWRXYW50XzsKLQotICAvLy8gV2hlcmUgaW4gdGhlIHJlYWQgYnVmZmVyIGFyZSB3ZQotICB1aW50MzJfdCByZWFkQnVmZmVyUG9zXzsKLQotICAvLy8gUmVhZCBidWZmZXIKLSAgdWludDhfdCogcmVhZEJ1ZmZlcl87Ci0KLSAgLy8vIFJlYWQgYnVmZmVyIHNpemUKLSAgdWludDMyX3QgcmVhZEJ1ZmZlclNpemVfOwotCi0gIC8vLyBXcml0ZSBidWZmZXIKLSAgdWludDhfdCogd3JpdGVCdWZmZXJfOwotCi0gIC8vLyBXcml0ZSBidWZmZXIgc2l6ZQotICB1aW50MzJfdCB3cml0ZUJ1ZmZlclNpemVfOwotCi0gIC8vLyBIb3cgZmFyIHRocm91Z2ggd3JpdGluZyBhcmUgd2U/Ci0gIHVpbnQzMl90IHdyaXRlQnVmZmVyUG9zXzsKLQotICAvLy8gSG93IG1hbnkgdGltZXMgaGF2ZSB3ZSByZWFkIHNpbmNlIG91ciBsYXN0IGJ1ZmZlciByZXNldD8KLSAgdWludDMyX3QgbnVtUmVhZHNTaW5jZVJlc2V0XzsKLQotICAvLy8gSG93IG1hbnkgdGltZXMgaGF2ZSB3ZSB3cml0dGVuIHNpbmNlIG91ciBsYXN0IGJ1ZmZlciByZXNldD8KLSAgdWludDMyX3QgbnVtV3JpdGVzU2luY2VSZXNldF87Ci0KLSAgLy8vIFRhc2sgaGFuZGxlCi0gIGludCB0YXNrSGFuZGxlXzsKLQotICAvLy8gVGFzayBldmVudAotICBzdHJ1Y3QgZXZlbnQgdGFza0V2ZW50XzsKLQotICAvLy8gVHJhbnNwb3J0IHRvIHJlYWQgZnJvbQotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBpbnB1dFRyYW5zcG9ydF87Ci0KLSAgLy8vIFRyYW5zcG9ydCB0aGF0IHByb2Nlc3NvciB3cml0ZXMgdG8KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gb3V0cHV0VHJhbnNwb3J0XzsKLQotICAvLy8gZXh0cmEgdHJhbnNwb3J0IGdlbmVyYXRlZCBieSB0cmFuc3BvcnQgZmFjdG9yeSAoZS5nLiBCdWZmZXJlZFJvdXRlclRyYW5zcG9ydCkKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeUlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87Ci0KLSAgLy8vIFByb3RvY29sIGRlY29kZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKLQotICAvLy8gUHJvdG9jb2wgZW5jb2RlcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sXzsKLQotICAvLy8gR28gaW50byByZWFkIG1vZGUKLSAgdm9pZCBzZXRSZWFkKCkgewotICAgIHNldEZsYWdzKEVWX1JFQUQgfCBFVl9QRVJTSVNUKTsKLSAgfQotCi0gIC8vLyBHbyBpbnRvIHdyaXRlIG1vZGUKLSAgdm9pZCBzZXRXcml0ZSgpIHsKLSAgICBzZXRGbGFncyhFVl9XUklURSB8IEVWX1BFUlNJU1QpOwotICB9Ci0KLSAgLy8vIFNldCBzb2NrZXQgaWRsZQotICB2b2lkIHNldElkbGUoKSB7Ci0gICAgc2V0RmxhZ3MoMCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGV2ZW50IGZsYWdzIGZvciB0aGlzIGNvbm5lY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBldmVudEZsYWdzIGZsYWdzIHdlIHBhc3MgdG8gbGliZXZlbnQgZm9yIHRoZSBjb25uZWN0aW9uLgotICAgKi8KLSAgdm9pZCBzZXRGbGFncyhzaG9ydCBldmVudEZsYWdzKTsKLQotICAvKioKLSAgICogTGliZXZlbnQgaGFuZGxlciBjYWxsZWQgKHZpYSBvdXIgc3RhdGljIHdyYXBwZXIpIHdoZW4gdGhlIGNvbm5lY3Rpb24KLSAgICogc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgUmF0aGVyIHRoYW4gdXNlIHRoZSBmbGFncyBsaWJldmVudCBwYXNzZWQsCi0gICAqIHdlIHVzZSB0aGUgY29ubmVjdGlvbiBzdGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIHJlYWQgb3IKLSAgICogd3JpdGUgdGhlIHNvY2tldC4KLSAgICovCi0gIHZvaWQgd29ya1NvY2tldCgpOwotCi0gIC8vLyBDbG9zZSB0aGlzIGNvbm5lY3Rpb24gYW5kIGZyZWUgb3IgcmVzZXQgaXRzIHJlc291cmNlcy4KLSAgdm9pZCBjbG9zZSgpOwotCi0gcHVibGljOgotCi0gIGNsYXNzIFRhc2s7Ci0KLSAgLy8vIENvbnN0cnVjdG9yCi0gIFRDb25uZWN0aW9uKGludCBzb2NrZXQsIHNob3J0IGV2ZW50RmxhZ3MsIFROb25ibG9ja2luZ1NlcnZlciAqcykgewotICAgIHJlYWRCdWZmZXJfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKFNUQVJUSU5HX0NPTk5FQ1RJT05fQlVGRkVSX1NJWkUpOwotICAgIGlmIChyZWFkQnVmZmVyXyA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBuZXcgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIk91dCBvZiBtZW1vcnkuIik7Ci0gICAgfQotICAgIHJlYWRCdWZmZXJTaXplXyA9IFNUQVJUSU5HX0NPTk5FQ1RJT05fQlVGRkVSX1NJWkU7Ci0KLSAgICBudW1SZWFkc1NpbmNlUmVzZXRfID0gMDsKLSAgICBudW1Xcml0ZXNTaW5jZVJlc2V0XyA9IDA7Ci0KLSAgICAvLyBBbGxvY2F0ZSBpbnB1dCBhbmQgb3V0cHV0IHRyYW5wc29ydHMKLSAgICAvLyB0aGVzZSBvbmx5IG5lZWQgdG8gYmUgYWxsb2NhdGVkIG9uY2UgcGVyIFRDb25uZWN0aW9uICh0aGV5IGRvbid0IG5lZWQgdG8gYmUKLSAgICAvLyByZWFsbG9jYXRlZCBvbiBpbml0KCkgY2FsbCkKLSAgICBpbnB1dFRyYW5zcG9ydF8gPSBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPihuZXcgVE1lbW9yeUJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclNpemVfKSk7Ci0gICAgb3V0cHV0VHJhbnNwb3J0XyA9IGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+KG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotCi0gICAgaW5pdChzb2NrZXQsIGV2ZW50RmxhZ3MsIHMpOwotICAgIHNlcnZlcl8tPmluY3JlbWVudE51bUNvbm5lY3Rpb25zKCk7Ci0gIH0KLQotICB+VENvbm5lY3Rpb24oKSB7Ci0gICAgc3RkOjpmcmVlKHJlYWRCdWZmZXJfKTsKLSAgICBzZXJ2ZXJfLT5kZWNyZW1lbnROdW1Db25uZWN0aW9ucygpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHJlYWQgYnVmZmVyIGFnYWluc3QgYSBnaXZlbiBsaW1pdCBhbmQgc2hyaW5rIGl0IGlmIGV4Y2VlZGVkLgotICAgKgotICAgKiBAcGFyYW0gbGltaXQgd2UgbGltaXQgYnVmZmVyIHNpemUgdG8uCi0gICAqLwotICB2b2lkIGNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KHNpemVfdCBsaW1pdCk7Ci0KLSAgLy8vIEluaXRpYWxpemUKLSAgdm9pZCBpbml0KGludCBzb2NrZXQsIHNob3J0IGV2ZW50RmxhZ3MsIFROb25ibG9ja2luZ1NlcnZlciAqcyk7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHRyYW5zaXRpb25zIGZyb20gb25lIHN0YXRlIGludG8KLSAgICogYW5vdGhlci4gVGhpcyBtZWFucyB0aGF0IGl0IGhhcyBmaW5pc2hlZCB3cml0aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkCi0gICAqIHRvLCBvciBmaW5pc2hlZCByZWNlaXZpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQgdG8uCi0gICAqLwotICB2b2lkIHRyYW5zaXRpb24oKTsKLQotICAvKioKLSAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBjb25uZWN0aW9uIGV2ZW50cy4gIFByb3ZpZGVzIGEgY2FsbGJhY2sKLSAgICogdGhhdCBsaWJldmVudCBjYW4gdW5kZXJzdGFuZCB3aGljaCBpbnZva2VzIGNvbm5lY3Rpb25fLT53b3JrU29ja2V0KCkuCi0gICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJlZCBvbi4KLSAgICogQHBhcmFtIHdoaWNoIHRoZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LgotICAgKiBAcGFyYW0gdiB2b2lkKiBjYWxsYmFjayBhcmcgd2hlcmUgd2UgcGxhY2VkIFRDb25uZWN0aW9uJ3MgInRoaXMiLgotICAgKi8KLSAgc3RhdGljIHZvaWQgZXZlbnRIYW5kbGVyKGludCBmZCwgc2hvcnQgLyogd2hpY2ggKi8sIHZvaWQqIHYpIHsKLSAgICBhc3NlcnQoZmQgPT0gKChUQ29ubmVjdGlvbiopdiktPnNvY2tldF8pOwotICAgICgoVENvbm5lY3Rpb24qKXYpLT53b3JrU29ja2V0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBzaWduYWxpbmcgdGFzayBjb21wbGV0aW9uLiAgUHJvdmlkZXMgYQotICAgKiBjYWxsYmFjayB0aGF0IGxpYmV2ZW50IGNhbiB1bmRlcnN0YW5kIHRoYXQgd2lsbCByZWFkIGEgY29ubmVjdGlvbgotICAgKiBvYmplY3QncyBhZGRyZXNzIGZyb20gYSBwaXBlIGFuZCBjYWxsIGNvbm5lY3Rpb24tPnRyYW5zaXRpb24oKSBmb3IKLSAgICogdGhhdCBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJlZCBvbi4KLSAgICovCi0gIHN0YXRpYyB2b2lkIHRhc2tIYW5kbGVyKGludCBmZCwgc2hvcnQgLyogd2hpY2ggKi8sIHZvaWQqIC8qIHYgKi8pIHsKLSAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbjsKLSAgICBzc2l6ZV90IG5CeXRlczsKLSAgICB3aGlsZSAoKG5CeXRlcyA9IHJlYWQoZmQsICh2b2lkKikmY29ubmVjdGlvbiwgc2l6ZW9mKFRDb25uZWN0aW9uKikpKQotICAgICAgICA9PSBzaXplb2YoVENvbm5lY3Rpb24qKSkgewotICAgICAgY29ubmVjdGlvbi0+dHJhbnNpdGlvbigpOwotICAgIH0KLSAgICBpZiAobkJ5dGVzID4gMCkgewotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVENvbm5lY3Rpb246OnRhc2tIYW5kbGVyIHVuZXhwZWN0ZWQgcGFydGlhbCByZWFkIik7Ci0gICAgfQotICAgIGlmIChlcnJubyAhPSBFV09VTERCTE9DSyAmJiBlcnJubyAhPSBFQUdBSU4pIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjp0YXNrSGFuZGxlciByZWFkIGZhaWxlZCwgcmVzb3VyY2UgbGVhayIsIGVycm5vKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTm90aWZpY2F0aW9uIHRvIHNlcnZlciB0aGF0IHByb2Nlc3NpbmcgaGFzIGVuZGVkIG9uIHRoaXMgcmVxdWVzdC4KLSAgICogQ2FuIGJlIGNhbGxlZCBlaXRoZXIgd2hlbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlZCBvciB3aGVuIGEgd2FpdGluZwotICAgKiB0YXNrIGhhcyBiZWVuIHByZWVtcHRpdmVseSB0ZXJtaW5hdGVkIChvbiBvdmVybG9hZCkuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB1bmFibGUgdG8gbm90aWZ5IChjaGVjayBlcnJubykuCi0gICAqLwotICBib29sIG5vdGlmeVNlcnZlcigpIHsKLSAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9IHRoaXM7Ci0gICAgaWYgKHdyaXRlKHNlcnZlcl8tPmdldE5vdGlmaWNhdGlvblNlbmRGRCgpLCAoY29uc3Qgdm9pZCopJmNvbm5lY3Rpb24sCi0gICAgICAgICAgICAgc2l6ZW9mKFRDb25uZWN0aW9uKikpICE9IHNpemVvZihUQ29ubmVjdGlvbiopKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLy8gRm9yY2UgY29ubmVjdGlvbiBzaHV0ZG93biBmb3IgdGhpcyBjb25uZWN0aW9uLgotICB2b2lkIGZvcmNlQ2xvc2UoKSB7Ci0gICAgYXBwU3RhdGVfID0gQVBQX0NMT1NFX0NPTk5FQ1RJT047Ci0gICAgaWYgKCFub3RpZnlTZXJ2ZXIoKSkgewotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVENvbm5lY3Rpb246OmZvcmNlQ2xvc2U6IGZhaWxlZCB3cml0ZSBvbiBub3RpZnkgcGlwZSIpOwotICAgIH0KLSAgfQotCi0gIC8vLyByZXR1cm4gdGhlIHNlcnZlciB0aGlzIGNvbm5lY3Rpb24gd2FzIGluaXRpYWxpemVkIGZvci4KLSAgVE5vbmJsb2NraW5nU2VydmVyKiBnZXRTZXJ2ZXIoKSB7Ci0gICAgcmV0dXJuIHNlcnZlcl87Ci0gIH0KLQotICAvLy8gZ2V0IHN0YXRlIG9mIGNvbm5lY3Rpb24uCi0gIFRBcHBTdGF0ZSBnZXRTdGF0ZSgpIHsKLSAgICByZXR1cm4gYXBwU3RhdGVfOwotICB9Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNjkyYWIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RTZXJ2ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotaW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHM9KDE8PDI0KSkgIHsKLSAgc3RydWN0IHJsaW1pdCBmZG1heHJsOwotCi0gIGZvcihmZG1heHJsLnJsaW1fY3VyID0gbWF4X2ZkcywgZmRtYXhybC5ybGltX21heCA9IG1heF9mZHM7Ci0gICAgICBtYXhfZmRzICYmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJmZkbWF4cmwpIDwgMCk7Ci0gICAgICBmZG1heHJsLnJsaW1fY3VyID0gbWF4X2ZkcywgZmRtYXhybC5ybGltX21heCA9IG1heF9mZHMpIHsKLSAgICBtYXhfZmRzIC89IDI7Ci0gIH0KLQotICByZXR1cm4gIGZkbWF4cmwucmxpbV9jdXI7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNlcnZlci5oIGIvbGliL2NwcC9zcmMvc2VydmVyL1RTZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0YzU4OC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSX0hfCi0jZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJfSF8gMQotCi0jaW5jbHVkZSA8VFByb2Nlc3Nvci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci0KLS8qKgotICogVmlydHVhbCBpbnRlcmZhY2UgY2xhc3MgdGhhdCBjYW4gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIgY29yZS4gVG8KLSAqIHVzZSB0aGlzIHlvdSBzaG91bGQgc3ViY2xhc3MgaXQgYW5kIGltcGxlbWVudCB0aGUgbWV0aG9kcyB0aGF0IHlvdSBjYXJlCi0gKiBhYm91dC4gWW91ciBzdWJjbGFzcyBjYW4gYWxzbyBzdG9yZSBsb2NhbCBkYXRhIHRoYXQgeW91IG1heSBjYXJlIGFib3V0LAotICogc3VjaCBhcyBhZGRpdGlvbmFsICJhcmd1bWVudHMiIHRvIHRoZXNlIG1ldGhvZHMgKHN0b3JlZCBpbiB0aGUgb2JqZWN0Ci0gKiBpbnN0YW5jZSdzIHN0YXRlKS4KLSAqLwotY2xhc3MgVFNlcnZlckV2ZW50SGFuZGxlciB7Ci0gcHVibGljOgotCi0gIHZpcnR1YWwgflRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7fQotCi0gIC8qKgotICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkge30KLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgY2xpZW50QmVnaW4oYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiAvKiBpbnB1dCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gLyogb3V0cHV0ICovKSB7fQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgbWFraW5nIHJlcXVlc3RzLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGNsaWVudEVuZChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IC8qIGlucHV0ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gLyogb3V0cHV0ICovKSB7fQotCi0gcHJvdGVjdGVkOgotCi0gIC8qKgotICAgKiBQcmV2ZW50IGRpcmVjdCBpbnN0YW50aWF0aW9uLgotICAgKi8KLSAgVFNlcnZlckV2ZW50SGFuZGxlcigpIHt9Ci0KLX07Ci0KLS8qKgotICogVGhyaWZ0IHNlcnZlci4KLSAqCi0gKi8KLWNsYXNzIFRTZXJ2ZXIgOiBwdWJsaWMgY29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKLSBwdWJsaWM6Ci0KLSAgdmlydHVhbCB+VFNlcnZlcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIHNlcnZlKCkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBzdG9wKCkge30KLQotICAvLyBBbGxvd3MgcnVubmluZyB0aGUgc2VydmVyIGFzIGEgUnVubmFibGUgdGhyZWFkCi0gIHZpcnR1YWwgdm9pZCBydW4oKSB7Ci0gICAgc2VydmUoKTsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3NvcigpIHsKLSAgICByZXR1cm4gcHJvY2Vzc29yXzsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IGdldFNlcnZlclRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsKLSAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0gIH0KLQotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpIHsKLSAgICByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgewotICAgIHJldHVybiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgewotICAgIHJldHVybiBldmVudEhhbmRsZXJfOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgVFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IpOgotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gIH0KLQotICBUU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQpOgotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICB9Ci0KLSAgVFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSk6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAotICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAotICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQotCi0gIFRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSk6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8ob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSksCi0gICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KLQotCi0gIC8vIENsYXNzIHZhcmlhYmxlcwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Ci0KLXB1YmxpYzoKLSAgdm9pZCBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeSkgewotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gIH0KLQotICB2b2lkIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gIH0KLQotICB2b2lkIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIH0KLQotICB2b2lkIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotICB9Ci0KLSAgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7Ci0gICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKLSAgfQotCi19OwotCi0vKioKLSAqIEhlbHBlciBmdW5jdGlvbiB0byBpbmNyZWFzZSB0aGUgbWF4IGZpbGUgZGVzY3JpcHRvcnMgbGltaXQKLSAqIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLgotICogQnkgZGVmYXVsdCwgdHJpZXMgdG8gaW5jcmVhc2UgaXQgdG8gYXMgbXVjaCBhcyAyXjI0LgotICovCi0gaW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHM9KDE8PDI0KSk7Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRjZTIxLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KLS8qKgotICogQSBzaW1wbGUgc2luZ2xlLXRocmVhZGVkIGFwcGxpY2F0aW9uIHNlcnZlci4gUGVyZmVjdCBmb3IgdW5pdCB0ZXN0cyEKLSAqCi0gKi8KLXZvaWQgVFNpbXBsZVNlcnZlcjo6c2VydmUoKSB7Ci0KLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOwotCi0gIHRyeSB7Ci0gICAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgY2VyciA8PCAiVFNpbXBsZVNlcnZlcjo6cnVuKCkgbGlzdGVuKCk6ICIgPDwgdHR4LndoYXQoKSA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKLSAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7Ci0gIH0KLQotICAvLyBGZXRjaCBjbGllbnQgZnJvbSBzZXJ2ZXIKLSAgd2hpbGUgKCFzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKLSAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0gICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgICAgIGV2ZW50SGFuZGxlcl8tPmNsaWVudEJlZ2luKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHdoaWxlIChwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkgewotICAgICAgICAgIC8vIFBlZWsgYWhlYWQsIGlzIHRoZSByZW1vdGUgc2lkZSBjbG9zZWQ/Ci0gICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC0+cGVlaygpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgICBjZXJyIDw8ICJUU2ltcGxlU2VydmVyIGNsaWVudCBkaWVkOiAiIDw8IHR0eC53aGF0KCkgPDwgZW5kbDsKLSAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHR4KSB7Ci0gICAgICAgIGNlcnIgPDwgIlRTaW1wbGVTZXJ2ZXIgZXhjZXB0aW9uOiAiIDw8IHR4LndoYXQoKSA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgICAgICBldmVudEhhbmRsZXJfLT5jbGllbnRFbmQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotICAgICAgfQotICAgICAgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7Ci0gICAgICBjbGllbnQtPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgY2VyciA8PCAiVFNlcnZlclRyYW5zcG9ydCBkaWVkIG9uIGFjY2VwdDogIiA8PCB0dHgud2hhdCgpIDw8IGVuZGw7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIGNlcnIgPDwgIlNvbWUga2luZCBvZiBhY2NlcHQgZXhjZXB0aW9uOiAiIDw8IHR4LndoYXQoKSA8PCBlbmRsOwotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoc3RyaW5nIHMpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBjZXJyIDw8ICJUVGhyZWFkUG9vbFNlcnZlcjogVW5rbm93biBleGNlcHRpb246ICIgPDwgcyA8PCBlbmRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlcnZlclRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAmdHR4KSB7Ci0gICAgICBjZXJyIDw8ICJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiA8PCB0dHgud2hhdCgpIDw8IGVuZGw7Ci0gICAgfQotICAgIHN0b3BfID0gZmFsc2U7Ci0gIH0KLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmggYi9saWIvY3BwL3NyYy9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZjOTFjLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UU2ltcGxlU2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXwotI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgInNlcnZlci9UU2VydmVyLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHNpbXBsZSBzZXJ2ZXIuIEl0IGlzIHNpbmdsZS10aHJlYWRlZCBhbmQgcnVucyBhCi0gKiBjb250aW51b3VzIGxvb3Agb2YgYWNjZXB0aW5nIGEgc2luZ2xlIGNvbm5lY3Rpb24sIHByb2Nlc3NpbmcgcmVxdWVzdHMgb24KLSAqIHRoYXQgY29ubmVjdGlvbiB1bnRpbCBpdCBjbG9zZXMsIGFuZCB0aGVuIHJlcGVhdGluZy4gSXQgaXMgYSBnb29kIGV4YW1wbGUKLSAqIG9mIGhvdyB0byBleHRlbmQgdGhlIFRTZXJ2ZXIgaW50ZXJmYWNlLgotICoKLSAqLwotY2xhc3MgVFNpbXBsZVNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKLSBwdWJsaWM6Ci0gIFRTaW1wbGVTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAotICAgIHN0b3BfKGZhbHNlKSB7fQotCi0gIFRTaW1wbGVTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSk6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAotICAgIHN0b3BfKGZhbHNlKSB7fQotCi0gIH5UU2ltcGxlU2VydmVyKCkge30KLQotICB2b2lkIHNlcnZlKCk7Ci0KLSAgdm9pZCBzdG9wKCkgewotICAgIHN0b3BfID0gdHJ1ZTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBib29sIHN0b3BfOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlYTNkYi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvVGhyZWFkLmgiCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0KLWNsYXNzIFRUaHJlYWRQb29sU2VydmVyOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKLQotcHVibGljOgotCi0gIFRhc2soVFRocmVhZFBvb2xTZXJ2ZXIgJnNlcnZlciwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgOgotICAgIHNlcnZlcl8oc2VydmVyKSwKLSAgICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gICAgaW5wdXRfKGlucHV0KSwKLSAgICBvdXRwdXRfKG91dHB1dCkgewotICB9Ci0KLSAgflRhc2soKSB7fQotCi0gIHZvaWQgcnVuKCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlciA9Ci0gICAgICBzZXJ2ZXJfLmdldEV2ZW50SGFuZGxlcigpOwotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgZXZlbnRIYW5kbGVyLT5jbGllbnRCZWdpbihpbnB1dF8sIG91dHB1dF8pOwotICAgIH0KLSAgICB0cnkgewotICAgICAgd2hpbGUgKHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRfLCBvdXRwdXRfKSkgewotICAgICAgICBpZiAoIWlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPnBlZWsoKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICAvLyBUaGlzIGlzIHJlYXNvbmFibHkgZXhwZWN0ZWQsIGNsaWVudCBkaWRuJ3Qgc2VuZCBhIGZ1bGwgcmVxdWVzdCBzbyBqdXN0Ci0gICAgICAvLyBpZ25vcmUgaGltCi0gICAgICAvLyBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlciBjbGllbnQgZGllZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgLy8gR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlciBleGNlcHRpb246ICIpICsgeC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICZ4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlciwgc3RkOjpleGNlcHRpb246ICIpICsgeC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgR2xvYmFsT3V0cHV0KCJUVGhyZWFkUG9vbFNlcnZlciwgdW5leHBlY3RlZCBleGNlcHRpb24gaW4gIgotICAgICAgICAgICAgICAgICAgICJUVGhyZWFkUG9vbFNlcnZlcjo6VGFzazo6cnVuKCkiKTsKLSAgICB9Ci0KLSAgICBpZiAoZXZlbnRIYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgIGV2ZW50SGFuZGxlci0+Y2xpZW50RW5kKGlucHV0Xywgb3V0cHV0Xyk7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlciBpbnB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBvdXRwdXRfLT5nZXRUcmFuc3BvcnQoKS0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRQb29sU2VydmVyIG91dHB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotCi0gIH0KLQotIHByaXZhdGU6Ci0gIFRTZXJ2ZXImIHNlcnZlcl87Ci0gIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87Ci0KLX07Ci0KLVRUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcikgOgotICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAotICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKLSAgc3RvcF8oZmFsc2UpLCB0aW1lb3V0XygwKSB7fQotCi1UVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpIDoKLSAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAotICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKLSAgc3RvcF8oZmFsc2UpLCB0aW1lb3V0XygwKSB7fQotCi0KLVRUaHJlYWRQb29sU2VydmVyOjp+VFRocmVhZFBvb2xTZXJ2ZXIoKSB7fQotCi12b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXJ2ZSgpIHsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjbGllbnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sOwotCi0gIHRyeSB7Ci0gICAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXI6OnJ1bigpIGxpc3RlbigpOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50Ci0gIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOwotICB9Ci0KLSAgd2hpbGUgKCFzdG9wXykgewotICAgIHRyeSB7Ci0gICAgICBjbGllbnQucmVzZXQoKTsKLSAgICAgIGlucHV0VHJhbnNwb3J0LnJlc2V0KCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQucmVzZXQoKTsKLSAgICAgIGlucHV0UHJvdG9jb2wucmVzZXQoKTsKLSAgICAgIG91dHB1dFByb3RvY29sLnJlc2V0KCk7Ci0KLSAgICAgIC8vIEZldGNoIGNsaWVudCBmcm9tIHNlcnZlcgotICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0KLSAgICAgIC8vIE1ha2UgSU8gdHJhbnNwb3J0cwotICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQotICAgICAgLy8gQWRkIHRvIHRocmVhZG1hbmFnZXIgcG9vbAotICAgICAgdGhyZWFkTWFuYWdlcl8tPmFkZChzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyOjpUYXNrPihuZXcgVFRocmVhZFBvb2xTZXJ2ZXI6OlRhc2soKnRoaXMsIHByb2Nlc3Nvcl8sIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSksIHRpbWVvdXRfKTsKLQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmICghc3RvcF8gfHwgdHR4LmdldFR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCkgewotICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjogVFNlcnZlclRyYW5zcG9ydCBkaWVkIG9uIGFjY2VwdDogIikgKyB0dHgud2hhdCgpOwotICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjogQ2F1Z2h0IFRFeGNlcHRpb246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9ICJUVGhyZWFkUG9vbFNlcnZlcjogVW5rbm93biBleGNlcHRpb246ICIgKyBzOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHN0b3BwZWQgbWFudWFsbHksIGpvaW4gdGhlIGV4aXN0aW5nIHRocmVhZHMKLSAgaWYgKHN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlcnZlclRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgICB0aHJlYWRNYW5hZ2VyXy0+am9pbigpOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjogRXhjZXB0aW9uIHNodXR0aW5nIGRvd246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgc3RvcF8gPSBmYWxzZTsKLSAgfQotCi19Ci0KLWludDY0X3QgVFRocmVhZFBvb2xTZXJ2ZXI6OmdldFRpbWVvdXQoKSBjb25zdCB7Ci0gIHJldHVybiB0aW1lb3V0XzsKLX0KLQotdm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6c2V0VGltZW91dChpbnQ2NF90IHZhbHVlKSB7Ci0gIHRpbWVvdXRfID0gdmFsdWU7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjdlOTA2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfCi0jZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwotCi1jbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKLSBwdWJsaWM6Ci0gIGNsYXNzIFRhc2s7Ci0KLSAgVFRocmVhZFBvb2xTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpOwotCi0gIFRUaHJlYWRQb29sU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcik7Ci0KLSAgdmlydHVhbCB+VFRocmVhZFBvb2xTZXJ2ZXIoKTsKLQotICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKLQotICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZW91dCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgdm9pZCBzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpOwotCi0gIHZpcnR1YWwgdm9pZCBzdG9wKCkgewotICAgIHN0b3BfID0gdHJ1ZTsKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHQoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOwotCi0gIHZvbGF0aWxlIGJvb2wgc3RvcF87Ci0KLSAgdm9sYXRpbGUgaW50NjRfdCB0aW1lb3V0XzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMzBmOGYuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic2VydmVyL1RUaHJlYWRlZFNlcnZlci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotCi1jbGFzcyBUVGhyZWFkZWRTZXJ2ZXI6OlRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0KLXB1YmxpYzoKLQotICBUYXNrKFRUaHJlYWRlZFNlcnZlciYgc2VydmVyLAotICAgICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSA6Ci0gICAgc2VydmVyXyhzZXJ2ZXIpLAotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBpbnB1dF8oaW5wdXQpLAotICAgIG91dHB1dF8ob3V0cHV0KSB7Ci0gIH0KLQotICB+VGFzaygpIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyID0KLSAgICAgIHNlcnZlcl8uZ2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICBldmVudEhhbmRsZXItPmNsaWVudEJlZ2luKGlucHV0Xywgb3V0cHV0Xyk7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICB3aGlsZSAocHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dF8sIG91dHB1dF8pKSB7Ci0gICAgICAgIGlmICghaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlciBjbGllbnQgZGllZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uJiB4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXIgZXhjZXB0aW9uOiAiKSArIHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFRocmVhZGVkU2VydmVyIHVuY2F1Z2h0IGV4Y2VwdGlvbi4iKTsKLSAgICB9Ci0gICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICBldmVudEhhbmRsZXItPmNsaWVudEVuZChpbnB1dF8sIG91dHB1dF8pOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIGlucHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIG91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIG91dHB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlIHRoaXMgdGFzayBmcm9tIHBhcmVudCBib29ra2VlcGluZwotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKHNlcnZlcl8udGFza3NNb25pdG9yXyk7Ci0gICAgICBzZXJ2ZXJfLnRhc2tzXy5lcmFzZSh0aGlzKTsKLSAgICAgIGlmIChzZXJ2ZXJfLnRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgICAgIHNlcnZlcl8udGFza3NNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gcHJpdmF0ZToKLSAgVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXJfOwotICBmcmllbmQgY2xhc3MgVFRocmVhZGVkU2VydmVyOwotCi0gIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87Ci19OwotCi0KLVRUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkpOgotICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAotICBzdG9wXyhmYWxzZSkgewotICB0aHJlYWRGYWN0b3J5XyA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotfQotCi1UVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkpOgotICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAotICB0aHJlYWRGYWN0b3J5Xyh0aHJlYWRGYWN0b3J5KSwKLSAgc3RvcF8oZmFsc2UpIHsKLX0KLQotVFRocmVhZGVkU2VydmVyOjp+VFRocmVhZGVkU2VydmVyKCkge30KLQotdm9pZCBUVGhyZWFkZWRTZXJ2ZXI6OnNlcnZlKCkgewotCi0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY2xpZW50OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2w7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbDsKLQotICB0cnkgewotICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgbGlzdGVuaW5nCi0gICAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7Ci0gIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjo6cnVuKCkgbGlzdGVuKCk6ICIpICt0dHgud2hhdCgpOwotICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAotICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKLSAgfQotCi0gIHdoaWxlICghc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgY2xpZW50LnJlc2V0KCk7Ci0gICAgICBpbnB1dFRyYW5zcG9ydC5yZXNldCgpOwotICAgICAgb3V0cHV0VHJhbnNwb3J0LnJlc2V0KCk7Ci0gICAgICBpbnB1dFByb3RvY29sLnJlc2V0KCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbC5yZXNldCgpOwotCi0gICAgICAvLyBGZXRjaCBjbGllbnQgZnJvbSBzZXJ2ZXIKLSAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAvLyBNYWtlIElPIHRyYW5zcG9ydHMKLSAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0KLSAgICAgIFRUaHJlYWRlZFNlcnZlcjo6VGFzayogdGFzayA9IG5ldyBUVGhyZWFkZWRTZXJ2ZXI6OlRhc2soKnRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sKTsKLQotICAgICAgLy8gQ3JlYXRlIGEgdGFzawotICAgICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUgPQotICAgICAgICBzaGFyZWRfcHRyPFJ1bm5hYmxlPih0YXNrKTsKLQotICAgICAgLy8gQ3JlYXRlIGEgdGhyZWFkIGZvciB0aGlzIHRhc2sKLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPQotICAgICAgICBzaGFyZWRfcHRyPFRocmVhZD4odGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChydW5uYWJsZSkpOwotCi0gICAgICAvLyBJbnNlcnQgdGhyZWFkIGludG8gdGhlIHNldCBvZiB0aHJlYWRzCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKHRhc2tzTW9uaXRvcl8pOwotICAgICAgICB0YXNrc18uaW5zZXJ0KHRhc2spOwotICAgICAgfQotCi0gICAgICAvLyBTdGFydCB0aGUgdGhyZWFkIQotICAgICAgdGhyZWFkLT5zdGFydCgpOwotCi0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKCFzdG9wXyB8fCB0dHguZ2V0VHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKSB7Ci0gICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogVFNlcnZlclRyYW5zcG9ydCBkaWVkIG9uIGFjY2VwdDogIikgKyB0dHgud2hhdCgpOwotICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6IENhdWdodCBURXhjZXB0aW9uOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChzdHJpbmcgcykgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFRocmVhZGVkU2VydmVyOiBVbmtub3duIGV4Y2VwdGlvbjogIiArIHM7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgc3RvcHBlZCBtYW51YWxseSwgbWFrZSBzdXJlIHRvIGNsb3NlIHNlcnZlciB0cmFuc3BvcnQKLSAgaWYgKHN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlcnZlclRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogRXhjZXB0aW9uIHNodXR0aW5nIGRvd246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIFN5bmNocm9uaXplZCBzKHRhc2tzTW9uaXRvcl8pOwotICAgICAgd2hpbGUgKCF0YXNrc18uZW1wdHkoKSkgewotICAgICAgICB0YXNrc01vbml0b3JfLndhaXQoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyOiBFeGNlcHRpb24gam9pbmluZyB3b3JrZXJzOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHN0b3BfID0gZmFsc2U7Ci0gIH0KLQotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oIGIvbGliL2NwcC9zcmMvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA4MTFhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8KLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfIDEKLQotI2luY2x1ZGUgPHNlcnZlci9UU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKLQotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7Ci0KLWNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKLQotIHB1YmxpYzoKLSAgY2xhc3MgVGFzazsKLQotICBUVGhyZWFkZWRTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkpOwotCi0gIFRUaHJlYWRlZFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkpOwotCi0gIHZpcnR1YWwgflRUaHJlYWRlZFNlcnZlcigpOwotCi0gIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOwotCi0gIHZvaWQgc3RvcCgpIHsKLSAgICBzdG9wXyA9IHRydWU7Ci0gICAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87Ci0gIHZvbGF0aWxlIGJvb2wgc3RvcF87Ci0KLSAgTW9uaXRvciB0YXNrc01vbml0b3JfOwotICBzdGQ6OnNldDxUYXNrKj4gdGFza3NfOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxNDY1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3VpbnQzMl90IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6cmVhZChhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpIHsKKyAgdWludDMyX3QgeGZlciA9IDA7CisgIHN0ZDo6c3RyaW5nIGZuYW1lOworICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOworICBpbnQxNl90IGZpZDsKKworICB4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0QmVnaW4oZm5hbWUpOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgeGZlciArPSBpcHJvdC0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOworICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAoZmlkKSB7CisgICAgY2FzZSAxOgorICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkcpIHsKKyAgICAgICAgeGZlciArPSBpcHJvdC0+cmVhZFN0cmluZyhtZXNzYWdlXyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyKSB7CisgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgeGZlciArPSBpcHJvdC0+cmVhZEkzMih0eXBlKTsKKyAgICAgICAgdHlwZV8gPSAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSl0eXBlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgeGZlciArPSBpcHJvdC0+cmVhZEZpZWxkRW5kKCk7CisgIH0KKworICB4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0RW5kKCk7CisgIHJldHVybiB4ZmVyOworfQorCit1aW50MzJfdCBUQXBwbGljYXRpb25FeGNlcHRpb246OndyaXRlKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeworICB1aW50MzJfdCB4ZmVyID0gMDsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbigiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigibWVzc2FnZSIsIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkcsIDEpOworICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cmluZyhtZXNzYWdlXyk7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRFbmQoKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCJ0eXBlIiwgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiwgMik7CisgIHhmZXIgKz0gb3Byb3QtPndyaXRlSTMyKHR5cGVfKTsKKyAgeGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOworICB4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOworICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOworICByZXR1cm4geGZlcjsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDYxOGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8KKyNkZWZpbmUgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCituYW1lc3BhY2UgcHJvdG9jb2wgeworY2xhc3MgVFByb3RvY29sOworfQorCitjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBwdWJsaWMgVEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIC8qKgorICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KKyAgICovCisgIGVudW0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgVU5LTk9XTl9NRVRIT0QgPSAxLAorICAgIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMiwKKyAgICBXUk9OR19NRVRIT0RfTkFNRSA9IDMsCisgICAgQkFEX1NFUVVFTkNFX0lEID0gNCwKKyAgICBNSVNTSU5HX1JFU1VMVCA9IDUsCisgICAgSU5URVJOQUxfRVJST1IgPSA2LAorICAgIFBST1RPQ09MX0VSUk9SID0gNywKKyAgICBJTlZBTElEX1RSQU5TRk9STSA9IDgsCisgICAgSU5WQUxJRF9QUk9UT0NPTCA9IDksCisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAorICB9OworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIDogVEV4Y2VwdGlvbigpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUpIDogVEV4Y2VwdGlvbigpLCB0eXBlXyh0eXBlKSB7fQorCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOiBURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogVEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8odHlwZSkge30KKworICB2aXJ0dWFsIH5UQXBwbGljYXRpb25FeGNlcHRpb24oKSBub2V4Y2VwdCB7fQorCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgorICAgKiB0aGF0IGhhcyBvY2N1cnJlZC4KKyAgICoKKyAgICogQHJldHVybiBFcnJvciBjb2RlCisgICAqLworICBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgeworICAgICAgc3dpdGNoICh0eXBlXykgeworICAgICAgY2FzZSBVTktOT1dOOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iOworICAgICAgY2FzZSBVTktOT1dOX01FVEhPRDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVua25vd24gbWV0aG9kIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9NRVNTQUdFX1RZUEU6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnZhbGlkIG1lc3NhZ2UgdHlwZSI7CisgICAgICBjYXNlIFdST05HX01FVEhPRF9OQU1FOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogV3JvbmcgbWV0aG9kIG5hbWUiOworICAgICAgY2FzZSBCQURfU0VRVUVOQ0VfSUQ6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBCYWQgc2VxdWVuY2UgaWRlbnRpZmllciI7CisgICAgICBjYXNlIE1JU1NJTkdfUkVTVUxUOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogTWlzc2luZyByZXN1bHQiOworICAgICAgY2FzZSBJTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludGVybmFsIGVycm9yIjsKKyAgICAgIGNhc2UgUFJPVE9DT0xfRVJST1I6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBQcm90b2NvbCBlcnJvciI7CisgICAgICBjYXNlIElOVkFMSURfVFJBTlNGT1JNOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW52YWxpZCB0cmFuc2Zvcm0iOworICAgICAgY2FzZSBJTlZBTElEX1BST1RPQ09MOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW52YWxpZCBwcm90b2NvbCI7CisgICAgICBjYXNlIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5zdXBwb3J0ZWQgY2xpZW50IHR5cGUiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CisgICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKKyAgICB9CisgIH0KKworICB1aW50MzJfdCByZWFkKHByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsKKyAgdWludDMyX3Qgd3JpdGUocHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBFcnJvciBjb2RlCisgICAqLworICBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGVfOworfTsKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3NGJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RCQVNFX0hfCisjZGVmaW5lIF9USFJJRlRfVEJBU0VfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVEJhc2UgeworcHVibGljOgorICB2aXJ0dWFsIH5UQmFzZSgpe307CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZChwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKHByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCA9IDA7Cit9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RCQVNFX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkMzQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1RESVNQQVRDSFBST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX1RESVNQQVRDSFBST0NFU1NPUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCisvKioKKyAqIFREaXNwYXRjaFByb2Nlc3NvciBpcyBhIGhlbHBlciBjbGFzcyB0byBwYXJzZSB0aGUgbWVzc2FnZSBoZWFkZXIgdGhlbiBjYWxsCisgKiBhbm90aGVyIGZ1bmN0aW9uIHRvIGRpc3BhdGNoIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBuYW1lLgorICoKKyAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgZGlzcGF0Y2hDYWxsKCkgdG8gZGlzcGF0Y2ggb24gdGhlIGZ1bmN0aW9uIG5hbWUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+CitjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3JUIDogcHVibGljIFRQcm9jZXNzb3IgeworcHVibGljOgorICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogaW5SYXcgPSBpbi5nZXQoKTsKKyAgICBwcm90b2NvbDo6VFByb3RvY29sKiBvdXRSYXcgPSBvdXQuZ2V0KCk7CisKKyAgICAvLyBUcnkgdG8gZHluYW1pYyBjYXN0IHRvIHRoZSB0ZW1wbGF0ZSBwcm90b2NvbCB0eXBlCisgICAgUHJvdG9jb2xfKiBzcGVjaWZpY0luID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KGluUmF3KTsKKyAgICBQcm90b2NvbF8qIHNwZWNpZmljT3V0ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG91dFJhdyk7CisgICAgaWYgKHNwZWNpZmljSW4gJiYgc3BlY2lmaWNPdXQpIHsKKyAgICAgIHJldHVybiBwcm9jZXNzRmFzdChzcGVjaWZpY0luLCBzcGVjaWZpY091dCwgY29ubmVjdGlvbkNvbnRleHQpOworICAgIH0KKworICAgIC8vIExvZyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgdG8gdXNlIHRoZSBzbG93IHBhdGgKKyAgICBUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgaW5SYXcsIHNwZWNpZmljSW4pOworICAgIFRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvdXRSYXcsIHNwZWNpZmljT3V0KTsKKworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKyAgICBpblJhdy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICAgIC8vIElmIHRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSB2YWxpZCBjYWxsLCBsb2cgYW4gZXJyb3IgYW5kIHJldHVybiBmYWxzZSBzbworICAgIC8vIHRoYXQgdGhlIHNlcnZlciB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgIC8vCisgICAgLy8gKFRoZSBvbGQgZ2VuZXJhdGVkIHByb2Nlc3NvciBjb2RlIHVzZWQgdG8gdHJ5IHRvIHNraXAgYSBUX1NUUlVDVCBhbmQKKyAgICAvLyBjb250aW51ZS4gIEhvd2V2ZXIsIHRoYXQgc2VlbXMgdW5zYWZlLikKKyAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGwoaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkLCBjb25uZWN0aW9uQ29udGV4dCk7CisgIH0KKworcHJvdGVjdGVkOgorICBib29sIHByb2Nlc3NGYXN0KFByb3RvY29sXyogaW4sIFByb3RvY29sXyogb3V0LCB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKyAgICBpbi0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXMtPmRpc3BhdGNoQ2FsbFRlbXBsYXRlZChpbiwgb3V0LCBmbmFtZSwgc2VxaWQsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgfQorCisgIC8qKgorICAgKiBkaXNwYXRjaENhbGwoKSBtZXRob2RzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcworICAgKi8KKyAgdmlydHVhbCBib29sIGRpc3BhdGNoQ2FsbChhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYWxsQ29udGV4dCkgPSAwOworCisgIHZpcnR1YWwgYm9vbCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoUHJvdG9jb2xfKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYWxsQ29udGV4dCkgPSAwOworfTsKKworLyoqCisgKiBOb24tdGVtcGxhdGl6ZWQgdmVyc2lvbiBvZiBURGlzcGF0Y2hQcm9jZXNzb3IsIHRoYXQgZG9lc24ndCBib3RoZXIgdHJ5aW5nIHRvCisgKiBwZXJmb3JtIGEgZHluYW1pY19jYXN0LgorICovCitjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3IgOiBwdWJsaWMgVFByb2Nlc3NvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgICAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBkaXNwYXRjaENhbGwoaW4uZ2V0KCksIG91dC5nZXQoKSwgZm5hbWUsIHNlcWlkLCBjb25uZWN0aW9uQ29udGV4dCk7CisgIH0KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIGJvb2wgZGlzcGF0Y2hDYWxsKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxDb250ZXh0KSA9IDA7Cit9OworCisvLyBTcGVjaWFsaXplIFREaXNwYXRjaFByb2Nlc3NvclQgZm9yIFRQcm90b2NvbCBhbmQgVER1bW15UHJvdG9jb2wganVzdCB0byB1c2UKKy8vIHRoZSBnZW5lcmljIFREaXNwYXRjaFByb2Nlc3Nvci4KK3RlbXBsYXRlIDw+CitjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpURHVtbXlQcm90b2NvbD4gOiBwdWJsaWMgVERpc3BhdGNoUHJvY2Vzc29yIHt9OwordGVtcGxhdGUgPD4KK2NsYXNzIFREaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlRQcm90b2NvbD4gOiBwdWJsaWMgVERpc3BhdGNoUHJvY2Vzc29yIHt9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gX1RIUklGVF9URElTUEFUQ0hQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UTG9nZ2luZy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RMb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdmZjAzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UTG9nZ2luZy5oCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UTE9HR0lOR19IXworI2RlZmluZSBfVEhSSUZUX1RMT0dHSU5HX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKy8qKgorICogQ29udGFpbnMgdXRpbGl0eSBtYWNyb3MgZm9yIGRlYnVnZ2luZyBhbmQgbG9nZ2luZy4KKyAqCisgKi8KKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvKioKKyAqIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA9IDA6IGFsbCBkZWJ1Z2dpbmcgdHVybmVkIG9mZiwgZGVidWcgbWFjcm9zIHVuZGVmaW5lZAorICogVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID0gMTogYWxsIGRlYnVnZ2luZyB0dXJuZWQgb24KKyAqLworI2RlZmluZSBUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgMAorCisvKioKKyAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAwOiBhbGwgbG9nZ2luZyB0dXJuZWQgb2ZmLCBsb2dnaW5nIG1hY3JvcyB1bmRlZmluZWQKKyAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAxOiBhbGwgbG9nZ2luZyB0dXJuZWQgb24KKyAqLworI2RlZmluZSBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMIDEKKworLyoqCisgKiBTdGFuZGFyZCB3cmFwcGVyIGFyb3VuZCBmcHJpbnRmIHdoYXQgd2lsbCBwcmVmaXggdGhlIGZpbGUgbmFtZSBhbmQgbGluZQorICogbnVtYmVyIHRvIHRoZSBsaW5lLiBVc2VzIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCB0byBjb250cm9sIHdoZXRoZXIgaXQgaXMKKyAqIHR1cm5lZCBvbiBvciBvZmYuCisgKgorICogQHBhcmFtIGZvcm1hdF9zdHJpbmcKKyAqLworI2lmIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDAKKyNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlslcywlZF0gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLCAuLi4pCisjZW5kaWYKKworLyoqCisgKiBhbmFsb2dvdXMgdG8gVF9ERUJVRyBidXQgYWxzbyBwcmludHMgdGhlIHRpbWUKKyAqCisgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZworICovCisjaWYgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMAorI2RlZmluZSBUX0RFQlVHX1QoZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hhciBkYmd0aW1lWzI2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAiWyVzLCVkXSBbJXNdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBkYmd0aW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZWxzZQorI2RlZmluZSBUX0RFQlVHX1QoZm9ybWF0X3N0cmluZywgLi4uKQorI2VuZGlmCisKKy8qKgorICogYW5hbG9nb3VzIHRvIFRfREVCVUcgYnV0IHVzZXMgaW5wdXQgbGV2ZWwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcKKyAqIHNob3VsZCBiZSBsb2dnZWQuCisgKgorICogQHBhcmFtIGludCAgICAgbGV2ZWw6IHNwZWNpZmllZCBkZWJ1ZyBsZXZlbAorICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogZm9ybWF0IHN0cmluZworICovCisjZGVmaW5lIFRfREVCVUdfTChsZXZlbCwgZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgobGV2ZWwpID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICJbJXMsJWRdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICBcCisgIH0KKworLyoqCisgKiBFeHBsaWNpdCBlcnJvciBsb2dnaW5nLiBQcmludHMgdGltZSwgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgorICoKKyAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCisgKi8KKyNkZWZpbmUgVF9FUlJPUihmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyIGRiZ3RpbWVbMjZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJbJXMsJWRdIFslc10gRVJST1I6ICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRiZ3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvKioKKyAqIEFuYWxvZ291cyB0byBUX0VSUk9SLCBhZGRpdGlvbmFsbHkgYWJvcnRpbmcgdGhlIHByb2Nlc3MuCisgKiBXQVJOSU5HOiBtYWNybyBjYWxscyBhYm9ydCgpLCBlbmRpbmcgcHJvZ3JhbSBleGVjdXRpb24KKyAqCisgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZworICovCisjZGVmaW5lIFRfRVJST1JfQUJPUlQoZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciBkYmd0aW1lWzI2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiWyVzLCVkXSBbJXNdIEVSUk9SOiBHb2luZyB0byBhYm9ydCAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkYmd0aW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXhpdCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyoqCisgKiBMb2cgaW5wdXQgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCisgKi8KKyNpZiBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMAorI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hhciBkYmd0aW1lWzI2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICJbJXNdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgZGJndGltZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZWxzZQorI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsIC4uLikKKyNlbmRpZgorCisvKioKKyAqIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPSAwIG9yIHVuc2V0OiBub3JtYWwgb3BlcmF0aW9uLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgY2FsbCBkZWJ1ZyBtZXNzYWdlcyBkaXNhYmxlZAorICogVF9HTE9CQUxfREVCVUdfVklSVFVBTCA9IDE6ICAgICAgICAgIGxvZyBhIGRlYnVnIG1lc3NhZ2VzIHdoZW5ldmVyIGFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWRhYmxlIHZpcnR1YWwgY2FsbCBpcyBtYWRlCisgKiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID0gMjogICAgICAgICAgcmVjb3JkIGRldGFpbGVkIGluZm8gdGhhdCBjYW4gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGVkIGJ5IGNhbGxpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvZmlsZV9wcmludF9pbmZvKCkKKyAqLworI2lmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPiAxCisjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkgOjphcGFjaGU6OnRocmlmdDo6cHJvZmlsZV92aXJ0dWFsX2NhbGwodHlwZWlkKCp0aGlzKSkKKyNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShzcGVjaWZpY19wcm90KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbCh0eXBlaWQoKnRlbXBsYXRlX2NsYXNzKSwgdHlwZWlkKCpnZW5lcmljX3Byb3QpKTsgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbGlmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPT0gMQorI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpIGZwcmludGYoc3RkZXJyLCAiWyVzLCVkXSB2aXJ0dWFsIGNhbGxcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShzcGVjaWZpY19wcm90KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzLCVkXSBmYWlsZWQgdG8gY2FzdCB0byBzcGVjaWZpYyBwcm90b2NvbCB0eXBlXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkKKyNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpCisjZW5kaWYKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UTE9HR0lOR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlM2E5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK1RPdXRwdXQgR2xvYmFsT3V0cHV0OworCit2b2lkIFRPdXRwdXQ6OnByaW50Zihjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pIHsKKyNpZm5kZWYgVEhSSUZUX1NRVUVMQ0hfQ09OU09MRV9PVVRQVVQKKyAgLy8gVHJ5IHRvIHJlZHVjZSBoZWFwIHVzYWdlLCBldmVuIGlmIHByaW50ZiBpcyBjYWxsZWQgcmFyZWx5LgorICBzdGF0aWMgY29uc3QgaW50IFNUQUNLX0JVRl9TSVpFID0gMjU2OworICBjaGFyIHN0YWNrX2J1ZltTVEFDS19CVUZfU0laRV07CisgIHZhX2xpc3QgYXA7CisKKyNpZmRlZiBfTVNDX1ZFUgorICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgIGludCBuZWVkID0gX3ZzY3ByaW50ZihtZXNzYWdlLCBhcCk7CisgIHZhX2VuZChhcCk7CisKKyAgaWYgKG5lZWQgPCBTVEFDS19CVUZfU0laRSkgeworICAgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgICB2c25wcmludGZfcyhzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBfVFJVTkNBVEUsIG1lc3NhZ2UsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIGZfKHN0YWNrX2J1Zik7CisgICAgcmV0dXJuOworICB9CisjZWxzZQorICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgIGludCBuZWVkID0gdnNucHJpbnRmKHN0YWNrX2J1ZiwgU1RBQ0tfQlVGX1NJWkUsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKworICBpZiAobmVlZCA8IFNUQUNLX0JVRl9TSVpFKSB7CisgICAgZl8oc3RhY2tfYnVmKTsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorCisgIGNoYXIqIGhlYXBfYnVmID0gKGNoYXIqKW1hbGxvYygobmVlZCArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgaWYgKGhlYXBfYnVmID09IE5VTEwpIHsKKyNpZmRlZiBfTVNDX1ZFUgorICAgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgICB2c25wcmludGZfcyhzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBfVFJVTkNBVEUsIG1lc3NhZ2UsIGFwKTsKKyAgICB2YV9lbmQoYXApOworI2VuZGlmCisgICAgLy8gTWFsbG9jIGZhaWxlZC4gIFdlIG1pZ2h0IGFzIHdlbGwgcHJpbnQgdGhlIHN0YWNrIGJ1ZmZlci4KKyAgICBmXyhzdGFja19idWYpOworICAgIHJldHVybjsKKyAgfQorCisgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgaW50IHJ2YWwgPSB2c25wcmludGYoaGVhcF9idWYsIG5lZWQgKyAxLCBtZXNzYWdlLCBhcCk7CisgIHZhX2VuZChhcCk7CisgIC8vIFRPRE8oc2hpZ2luKTogaW5mb3JtIHVzZXIKKyAgaWYgKHJ2YWwgIT0gLTEpIHsKKyAgICBmXyhoZWFwX2J1Zik7CisgIH0KKyAgZnJlZShoZWFwX2J1Zik7CisjZW5kaWYKK30KKwordm9pZCBUT3V0cHV0OjplcnJvclRpbWVXcmFwcGVyKGNvbnN0IGNoYXIqIG1zZykgeworI2lmbmRlZiBUSFJJRlRfU1FVRUxDSF9DT05TT0xFX09VVFBVVAorICB0aW1lX3Qgbm93OworICBjaGFyIGRiZ3RpbWVbMjZdOworICB0aW1lKCZub3cpOworICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsKKyAgZGJndGltZVsyNF0gPSAwOworICBmcHJpbnRmKHN0ZGVyciwgIlRocmlmdDogJXMgJXNcbiIsIGRiZ3RpbWUsIG1zZyk7CisjZW5kaWYKK30KKwordm9pZCBUT3V0cHV0OjpwZXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKKyAgc3RkOjpzdHJpbmcgb3V0ID0gbWVzc2FnZSArIHN0ZDo6c3RyaW5nKCI6ICIpICsgc3RyZXJyb3JfcyhlcnJub19jb3B5KTsKKyAgZl8ob3V0LmNfc3RyKCkpOworfQorCitzdGQ6OnN0cmluZyBUT3V0cHV0OjpzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KSB7CisjaWZuZGVmIEhBVkVfU1RSRVJST1JfUgorICByZXR1cm4gImVycm5vID0gIiArIHRvX3N0cmluZyhlcnJub19jb3B5KTsKKyNlbHNlIC8vIEhBVkVfU1RSRVJST1JfUgorCisgIGNoYXIgYl9lcnJidWZbMTAyNF0gPSB7J1wwJ307CisjaWZkZWYgU1RSRVJST1JfUl9DSEFSX1AKKyAgY2hhciogYl9lcnJvciA9IHN0cmVycm9yX3IoZXJybm9fY29weSwgYl9lcnJidWYsIHNpemVvZihiX2VycmJ1ZikpOworI2Vsc2UKKyAgY2hhciogYl9lcnJvciA9IGJfZXJyYnVmOworICBpbnQgcnYgPSBzdHJlcnJvcl9yKGVycm5vX2NvcHksIGJfZXJyYnVmLCBzaXplb2YoYl9lcnJidWYpKTsKKyAgaWYgKHJ2ID09IC0xKSB7CisgICAgLy8gc3RyZXJyb3JfciBmYWlsZWQuICBvbWd3dGZiYnEuCisgICAgcmV0dXJuICJYU0ktY29tcGxpYW50IHN0cmVycm9yX3IoKSBmYWlsZWQgd2l0aCBlcnJubyA9ICIKKyAgICAgICAgICAgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CisgIH0KKyNlbmRpZgorICAvLyBDYW4gYW55b25lIHByb3ZlIHRoYXQgZXhwbGljaXQgY2FzdCBpcyBwcm9iYWJseSBub3QgbmVjZXNzYXJ5CisgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGJlZm9yZQorICAvLyBiX2Vycm9yIGJlY29tZXMgaW52YWxpZD8KKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJfZXJyb3IpOworCisjZW5kaWYgLy8gSEFWRV9TVFJFUlJPUl9SCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzc1ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9PVVRQVVRfSF8KKyNkZWZpbmUgX1RIUklGVF9PVVRQVVRfSF8gMQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitjbGFzcyBUT3V0cHV0IHsKK3B1YmxpYzoKKyAgVE91dHB1dCgpIDogZl8oJmVycm9yVGltZVdyYXBwZXIpIHt9CisKKyAgaW5saW5lIHZvaWQgc2V0T3V0cHV0RnVuY3Rpb24odm9pZCAoKmZ1bmN0aW9uKShjb25zdCBjaGFyKikpIHsgZl8gPSBmdW5jdGlvbjsgfQorCisgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3QgY2hhciogbWVzc2FnZSkgeyBmXyhtZXNzYWdlKTsgfQorCisgIC8vIEl0IGlzIGltcG9ydGFudCB0byBoYXZlIGEgY29uc3QgY2hhciogb3ZlcmxvYWQgaGVyZSBpbnN0ZWFkIG9mCisgIC8vIGp1c3QgdGhlIHN0cmluZyB2ZXJzaW9uLCBvdGhlcndpc2UgZXJybm8gY291bGQgYmUgY29ycnVwdGVkCisgIC8vIGlmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSBhbGxvY2F0aW5nIG1lbW9yeSB3aGVuIGNvbnN0cnVjdGluZworICAvLyB0aGUgc3RyaW5nLgorICB2b2lkIHBlcnJvcihjb25zdCBjaGFyKiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSk7CisgIGlubGluZSB2b2lkIHBlcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKKyAgICBwZXJyb3IobWVzc2FnZS5jX3N0cigpLCBlcnJub19jb3B5KTsKKyAgfQorCisgIHZvaWQgcHJpbnRmKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLik7CisKKyAgc3RhdGljIHZvaWQgZXJyb3JUaW1lV3JhcHBlcihjb25zdCBjaGFyKiBtc2cpOworCisgIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLworICBzdGF0aWMgc3RkOjpzdHJpbmcgc3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSk7CisKK3ByaXZhdGU6CisgIHZvaWQgKCpmXykoY29uc3QgY2hhciopOworfTsKKworZXh0ZXJuIFRPdXRwdXQgR2xvYmFsT3V0cHV0OworfQorfSAvLyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vX1RIUklGVF9PVVRQVVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNDY0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfVFBST0NFU1NPUl9IXyAxCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCisvKioKKyAqIFZpcnR1YWwgaW50ZXJmYWNlIGNsYXNzIHRoYXQgY2FuIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgcHJvY2Vzc29yLiBUbworICogdXNlIHRoaXMgeW91IHNob3VsZCBzdWJjbGFzcyBpdCBhbmQgaW1wbGVtZW50IHRoZSBtZXRob2RzIHRoYXQgeW91IGNhcmUKKyAqIGFib3V0LiBZb3VyIHN1YmNsYXNzIGNhbiBhbHNvIHN0b3JlIGxvY2FsIGRhdGEgdGhhdCB5b3UgbWF5IGNhcmUgYWJvdXQsCisgKiBzdWNoIGFzIGFkZGl0aW9uYWwgImFyZ3VtZW50cyIgdG8gdGhlc2UgbWV0aG9kcyAoc3RvcmVkIGluIHRoZSBvYmplY3QKKyAqIGluc3RhbmNlJ3Mgc3RhdGUpLgorICovCitjbGFzcyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFByb2Nlc3NvckV2ZW50SGFuZGxlcigpIHt9CisKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgY2FsbGluZyBvdGhlciBjYWxsYmFjayBtZXRob2RzLgorICAgKiBFeHBlY3RlZCB0byByZXR1cm4gc29tZSBzb3J0IG9mIGNvbnRleHQgb2JqZWN0LgorICAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZCB0byBhbGwgb3RoZXIgY2FsbGJhY2tzCisgICAqIGZvciB0aGF0IGZ1bmN0aW9uIGludm9jYXRpb24uCisgICAqLworICB2aXJ0dWFsIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgeworICAgICh2b2lkKWZuX25hbWU7CisgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8qKgorICAgKiBFeHBlY3RlZCB0byBmcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBjb250ZXh0LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGZyZWVDb250ZXh0KHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgcmVhZGluZyBhcmd1bWVudHMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYmV0d2VlbiByZWFkaW5nIGFyZ3VtZW50cyBhbmQgY2FsbGluZyB0aGUgaGFuZGxlci4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgICAgKHZvaWQpYnl0ZXM7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJldHdlZW4gY2FsbGluZyB0aGUgaGFuZGxlciBhbmQgd3JpdGluZyB0aGUgcmVzcG9uc2UuCisgICAqLworICB2aXJ0dWFsIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGFmdGVyIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHBvc3RXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgICAgKHZvaWQpYnl0ZXM7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYW4gYXN5bmMgZnVuY3Rpb24gY2FsbCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGFzeW5jQ29tcGxldGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbi4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVyRXJyb3Iodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CisgIH0KKworcHJvdGVjdGVkOgorICBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkge30KK307CisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8gZnJlZSBlYWNoIGNvbnRleHQuCisgKi8KK2NsYXNzIFRQcm9jZXNzb3JDb250ZXh0RnJlZXIgeworcHVibGljOgorICBUUHJvY2Vzc29yQ29udGV4dEZyZWVyKFRQcm9jZXNzb3JFdmVudEhhbmRsZXIqIGhhbmRsZXIsIHZvaWQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1ldGhvZCkKKyAgICA6IGhhbmRsZXJfKGhhbmRsZXIpLCBjb250ZXh0Xyhjb250ZXh0KSwgbWV0aG9kXyhtZXRob2QpIHt9CisgIH5UUHJvY2Vzc29yQ29udGV4dEZyZWVyKCkgeworICAgIGlmIChoYW5kbGVyXyAhPSBOVUxMKQorICAgICAgaGFuZGxlcl8tPmZyZWVDb250ZXh0KGNvbnRleHRfLCBtZXRob2RfKTsKKyAgfQorICB2b2lkIHVucmVnaXN0ZXIoKSB7IGhhbmRsZXJfID0gTlVMTDsgfQorCitwcml2YXRlOgorICBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckV2ZW50SGFuZGxlciogaGFuZGxlcl87CisgIHZvaWQqIGNvbnRleHRfOworICBjb25zdCBjaGFyKiBtZXRob2RfOworfTsKKworLyoqCisgKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHRoYXQgYWN0cyB1cG9uIHR3byBzdHJlYW1zIG9mIGRhdGEsIG9uZQorICogYW4gaW5wdXQgYW5kIHRoZSBvdGhlciBhbiBvdXRwdXQuIFRoZSBkZWZpbml0aW9uIG9mIHRoaXMgb2JqZWN0IGlzIGxvb3NlLAorICogdGhvdWdoIHRoZSB0eXBpY2FsIGNhc2UgaXMgZm9yIHNvbWUgc29ydCBvZiBzZXJ2ZXIgdGhhdCBlaXRoZXIgZ2VuZXJhdGVzCisgKiByZXNwb25zZXMgdG8gYW4gaW5wdXQgc3RyZWFtIG9yIGZvcndhcmRzIGRhdGEgZnJvbSBvbmUgcGlwZSBvbnRvIGFub3RoZXIuCisgKgorICovCitjbGFzcyBUUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFByb2Nlc3NvcigpIHt9CisKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgPSAwOworCisgIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlvLCB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICAgIHJldHVybiBwcm9jZXNzKGlvLCBpbywgY29ubmVjdGlvbkNvbnRleHQpOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KKworICB2b2lkIHNldEV2ZW50SGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFRQcm9jZXNzb3IoKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworfTsKKworLyoqCisgKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGFsbG93IHN0ZDo6c2hhcmVkX3B0ciB0byBiZSB1c2VkIHdpdGggaGFuZGxlcgorICogcG9pbnRlcnMgcmV0dXJuZWQgYnkgdGhlIGdlbmVyYXRlZCBoYW5kbGVyIGZhY3Rvcmllcy4KKyAqCisgKiBUaGUgaGFuZGxlciBmYWN0b3J5IGNsYXNzZXMgZ2VuZXJhdGVkIGJ5IHRoZSB0aHJpZnQgY29tcGlsZXIgcmV0dXJuIHJhdworICogcG9pbnRlcnMsIGFuZCBmYWN0b3J5LT5yZWxlYXNlSGFuZGxlcigpIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIGhhbmRsZXIgaXMKKyAqIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogQSBSZWxlYXNlSGFuZGxlciBvYmplY3QgY2FuIGJlIGluc3RhbnRpYXRlZCBhbmQgcGFzc2VkIGFzIHRoZSBzZWNvbmQKKyAqIHBhcmFtZXRlciB0byBhIHNoYXJlZF9wdHIsIHNvIHRoYXQgZmFjdG9yeS0+cmVsZWFzZUhhbmRsZXIoKSB3aWxsIGJlIGNhbGxlZAorICogd2hlbiB0aGUgb2JqZWN0IGlzIG5vIGxvbmdlciBuZWVkZWQsIGluc3RlYWQgb2YgZGVsZXRpbmcgdGhlIHBvaW50ZXIuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyRmFjdG9yeV8+CitjbGFzcyBSZWxlYXNlSGFuZGxlciB7CitwdWJsaWM6CisgIFJlbGVhc2VIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+JiBoYW5kbGVyRmFjdG9yeSkKKyAgICA6IGhhbmRsZXJGYWN0b3J5XyhoYW5kbGVyRmFjdG9yeSkge30KKworICB2b2lkIG9wZXJhdG9yKCkodHlwZW5hbWUgSGFuZGxlckZhY3RvcnlfOjpIYW5kbGVyKiBoYW5kbGVyKSB7CisgICAgaWYgKGhhbmRsZXIpIHsKKyAgICAgIGhhbmRsZXJGYWN0b3J5Xy0+cmVsZWFzZUhhbmRsZXIoaGFuZGxlcik7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+IGhhbmRsZXJGYWN0b3J5XzsKK307CisKK3N0cnVjdCBUQ29ubmVjdGlvbkluZm8geworICAvLyBUaGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OworICAvLyBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24KKyAgLy8gVGhpcyBpcyB0aGUgdHJhbnNwb3J0IHRoYXQgd2FzIHJldHVybmVkIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQ6OmFjY2VwdCgpLAorICAvLyBhbmQgaXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSB0cmFuc3BvcnQgcG9pbnRlZCB0byBieSB0aGUgaW5wdXQgYW5kCisgIC8vIG91dHB1dCBwcm90b2NvbHMuCisgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKK307CisKK2NsYXNzIFRQcm9jZXNzb3JGYWN0b3J5IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFByb2Nlc3NvckZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBHZXQgdGhlIFRQcm9jZXNzb3IgdG8gdXNlIGZvciBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbi4KKyAgICoKKyAgICogVGhpcyBtZXRob2QgaXMgYWx3YXlzIGludm9rZWQgaW4gdGhlIHNhbWUgdGhyZWFkIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzCisgICAqIGFjY2VwdGVkIG9uLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgbmVlZCB0byBiZQorICAgKiB0aHJlYWQgc2FmZSwgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7Cit9OworCitjbGFzcyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSA6IHB1YmxpYyBUUHJvY2Vzc29yRmFjdG9yeSB7CitwdWJsaWM6CisgIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IpIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mKSB7IHJldHVybiBwcm9jZXNzb3JfOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworfTsKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3ODBmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UVG9TdHJpbmcuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVE9TVFJJTkdfSF8KKyNkZWZpbmUgX1RIUklGVF9UT1NUUklOR19IXyAxCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IFQmIHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKKy8vIFRPRE86IHJlcGxhY2UgdGhlIGNvbXB1dGF0aW9ucyBiZWxvdyB3aXRoIHN0ZDo6bnVtZXJpY19saW1pdHM6Om1heF9kaWdpdHMxMCBvbmNlIEMrKzExCisvLyBpcyBlbmFibGVkLgoraW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBmbG9hdCYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0cyAqIHN0ZDo6bG9nMTAoMi4wZikgKyAxKSkpKTsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBsb25nIGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6Om1hcDxLLCBWPiYgbSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6c2V0PFQ+JiBzKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHQpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCB0eXBlbmFtZSBzdGQ6OnBhaXI8SywgVj4mIHYpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgdG9fc3RyaW5nKHYuZmlyc3QpIDw8ICI6ICIgPDwgdG9fc3RyaW5nKHYuc2Vjb25kKTsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IFQmIGJlZywgY29uc3QgVCYgZW5kKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBmb3IgKFQgaXQgPSBiZWc7IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpdCAhPSBiZWcpCisgICAgICBvIDw8ICIsICI7CisgICAgbyA8PCB0b19zdHJpbmcoKml0KTsKKyAgfQorICByZXR1cm4gby5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgIlsiIDw8IHRvX3N0cmluZyh0LmJlZ2luKCksIHQuZW5kKCkpIDw8ICJdIjsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6bWFwPEssIFY+JiBtKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvIDw8ICJ7IiA8PCB0b19zdHJpbmcobS5iZWdpbigpLCBtLmVuZCgpKSA8PCAifSI7CisgIHJldHVybiBvLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6OnNldDxUPiYgcykgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgbyA8PCAieyIgPDwgdG9fc3RyaW5nKHMuYmVnaW4oKSwgcy5lbmQoKSkgPDwgIn0iOworICByZXR1cm4gby5zdHIoKTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vIF9USFJJRlRfVE9TVFJJTkdfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzIyNzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9USFJJRlRfSF8KKyNkZWZpbmUgX1RIUklGVF9USFJJRlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8dHlwZWluZm8+CisKKyNpbmNsdWRlIDx0aHJpZnQvVExvZ2dpbmcuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVE91dHB1dC5oPgorCisjZGVmaW5lIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoeCkgKCh2b2lkKSh4KSkKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVEVudW1JdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhcio+ID4geworcHVibGljOgorICBURW51bUl0ZXJhdG9yKGludCBuLCBpbnQqIGVudW1zLCBjb25zdCBjaGFyKiogbmFtZXMpCisgICAgOiBpaV8oMCksIG5fKG4pLCBlbnVtc18oZW51bXMpLCBuYW1lc18obmFtZXMpIHt9CisKKyAgaW50IG9wZXJhdG9yKysoKSB7IHJldHVybiArK2lpXzsgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBURW51bUl0ZXJhdG9yJiBlbmQpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGVuZCk7CisgICAgYXNzZXJ0KGVuZC5uXyA9PSAtMSk7CisgICAgcmV0dXJuIChpaV8gIT0gbl8pOworICB9CisKKyAgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhcio+IG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGVudW1zX1tpaV9dLCBuYW1lc19baWlfXSk7IH0KKworcHJpdmF0ZToKKyAgaW50IGlpXzsKKyAgY29uc3QgaW50IG5fOworICBpbnQqIGVudW1zXzsKKyAgY29uc3QgY2hhcioqIG5hbWVzXzsKK307CisKK2NsYXNzIFRFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24geworcHVibGljOgorICBURXhjZXB0aW9uKCkgOiBtZXNzYWdlXygpIHt9CisKKyAgVEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOiBtZXNzYWdlXyhtZXNzYWdlKSB7fQorCisgIHZpcnR1YWwgflRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQorCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgeworICAgICAgcmV0dXJuICJEZWZhdWx0IFRFeGNlcHRpb24uIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZV87Cit9OworCitjbGFzcyBURGVsYXllZEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBFPgorICBzdGF0aWMgVERlbGF5ZWRFeGNlcHRpb24qIGRlbGF5RXhjZXB0aW9uKGNvbnN0IEUmIGUpOworICB2aXJ0dWFsIHZvaWQgdGhyb3dfaXQoKSA9IDA7CisgIHZpcnR1YWwgflREZWxheWVkRXhjZXB0aW9uKCl7fTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBFPgorY2xhc3MgVEV4Y2VwdGlvbldyYXBwZXIgOiBwdWJsaWMgVERlbGF5ZWRFeGNlcHRpb24geworcHVibGljOgorICBURXhjZXB0aW9uV3JhcHBlcihjb25zdCBFJiBlKSA6IGVfKGUpIHt9CisgIHZpcnR1YWwgdm9pZCB0aHJvd19pdCgpIHsKKyAgICBFIHRlbXAoZV8pOworICAgIGRlbGV0ZSB0aGlzOworICAgIHRocm93IHRlbXA7CisgIH0KKworcHJpdmF0ZToKKyAgRSBlXzsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBFPgorVERlbGF5ZWRFeGNlcHRpb24qIFREZWxheWVkRXhjZXB0aW9uOjpkZWxheUV4Y2VwdGlvbihjb25zdCBFJiBlKSB7CisgIHJldHVybiBuZXcgVEV4Y2VwdGlvbldyYXBwZXI8RT4oZSk7Cit9CisKKyNpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID4gMQordm9pZCBwcm9maWxlX3ZpcnR1YWxfY2FsbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgaW5mbyk7Cit2b2lkIHByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGVtcGxhdGVfdHlwZSwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHByb3RfdHlwZSk7Cit2b2lkIHByb2ZpbGVfcHJpbnRfaW5mbyhGSUxFKiBmKTsKK3ZvaWQgcHJvZmlsZV9wcmludF9pbmZvKCk7Cit2b2lkIHByb2ZpbGVfd3JpdGVfcHByb2YoRklMRSogZ2VuX2NhbGxzX2YsIEZJTEUqIHZpcnR1YWxfY2FsbHNfZik7CisjZW5kaWYKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9USFJJRlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2UzNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisKKy8vIERvIG5vdGhpbmcgaWYgdmlydHVhbCBjYWxsIHByb2ZpbGluZyBpcyBub3QgZW5hYmxlZAorI2lmIFRfR0xPQkFMX0RFQlVHX1ZJUlRVQUwgPiAxCisKKy8vIFRPRE86IFRoaXMgY29kZSBvbmx5IHdvcmtzIHdpdGggZysrIChzaW5jZSB3ZSByZWx5IG9uIHRoZSBmYWN0CisvLyB0aGF0IGFsbCBzdGQ6OnR5cGVfaW5mbyBpbnN0YW5jZXMgcmVmZXJyaW5nIHRvIGEgcGFydGljdWxhciB0eXBlCisvLyBhbHdheXMgcmV0dXJuIHRoZSBleGFjdCBzYW1lIHBvaW50ZXIgdmFsdWUgZnJvbSBuYW1lKCkuKQorI2lmbmRlZiBfX0dOVUdfXworI2Vycm9yICJUaHJpZnQgdmlydHVhbCBmdW5jdGlvbiBwcm9maWxpbmcgY3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBnY2MiCisjZW5kaWYgLy8gIV9fR05VR19fCisKKy8vIFRPRE86IFdlIGFsc28gcmVxdWlyZSBnbGliYyBmb3IgdGhlIGJhY2t0cmFjZSgpIGFuZCBiYWNrdHJhY2Vfc3ltYm9scygpCisvLyBmdW5jdGlvbnMuCisjaWZuZGVmIF9fR0xJQkNfXworI2Vycm9yICJUaHJpZnQgdmlydHVhbCBmdW5jdGlvbiBwcm9maWxpbmcgY3VycmVudGx5IHJlcXVpcmVzIGdsaWJjIgorI2VuZGlmIC8vICFfX0dMSUJDX18KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorCisjaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgorI2luY2x1ZGUgPGV4ZWNpbmZvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE1BWF9TVEFDS19ERVBUSCA9IDE1OworCisvKioKKyAqIEEgc3RhY2sgdHJhY2UKKyAqLworY2xhc3MgQmFja3RyYWNlIHsKK3B1YmxpYzoKKyAgQmFja3RyYWNlKGludCBza2lwID0gMCk7CisgIEJhY2t0cmFjZShCYWNrdHJhY2UgY29uc3QmIGJ0KTsKKworICB2b2lkIG9wZXJhdG9yPShCYWNrdHJhY2UgY29uc3QmIGJ0KSB7CisgICAgbnVtQ2FsbGVyc18gPSBidC5udW1DYWxsZXJzXzsKKyAgICBpZiAobnVtQ2FsbGVyc18gPj0gMCkgeworICAgICAgbWVtY3B5KGNhbGxlcnNfLCBidC5jYWxsZXJzXywgbnVtQ2FsbGVyc18gKiBzaXplb2Yodm9pZCopKTsKKyAgICB9CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oQmFja3RyYWNlIGNvbnN0JiBidCkgY29uc3QgeyByZXR1cm4gKGNtcChidCkgPT0gMCk7IH0KKworICBzaXplX3QgaGFzaCgpIGNvbnN0IHsKKyAgICBpbnRwdHJfdCByZXQgPSAwOworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ2FsbGVyc187ICsrbikgeworICAgICAgcmV0IF49IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGNhbGxlcnNfW25dKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KTsKKyAgfQorCisgIGludCBjbXAoQmFja3RyYWNlIGNvbnN0JiBidCkgY29uc3QgeworICAgIGludCBkZXB0aF9kaWZmID0gKG51bUNhbGxlcnNfIC0gYnQubnVtQ2FsbGVyc18pOworICAgIGlmIChkZXB0aF9kaWZmICE9IDApIHsKKyAgICAgIHJldHVybiBkZXB0aF9kaWZmOworICAgIH0KKworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ2FsbGVyc187ICsrbikgeworICAgICAgaW50IGRpZmYgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihjYWxsZXJzX1tuXSkKKyAgICAgICAgICAgICAgICAgLSByZWludGVycHJldF9jYXN0PGludHB0cl90PihidC5jYWxsZXJzX1tuXSk7CisgICAgICBpZiAoZGlmZiAhPSAwKSB7CisgICAgICAgIHJldHVybiBkaWZmOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworICB9CisKKyAgdm9pZCBwcmludChGSUxFKiBmLCBpbnQgaW5kZW50ID0gMCwgaW50IHN0YXJ0ID0gMCkgY29uc3QgeworICAgIGNoYXIqKiBzdHJpbmdzID0gYmFja3RyYWNlX3N5bWJvbHMoY2FsbGVyc18sIG51bUNhbGxlcnNfKTsKKyAgICBpZiAoc3RyaW5ncykgeworICAgICAgc3RhcnQgKz0gc2tpcF87CisgICAgICBpZiAoc3RhcnQgPCAwKSB7CisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IG4gPSBzdGFydDsgbiA8IG51bUNhbGxlcnNfOyArK24pIHsKKyAgICAgICAgZnByaW50ZihmLCAiJSpzIyUtMmQgJXNcbiIsIGluZGVudCwgIiIsIG4sIHN0cmluZ3Nbbl0pOworICAgICAgfQorICAgICAgZnJlZShzdHJpbmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihmLCAiJSpzPGZhaWxlZCB0byBkZXRlcm1pbmUgc3ltYm9scz5cbiIsIGluZGVudCwgIiIpOworICAgIH0KKyAgfQorCisgIGludCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIG51bUNhbGxlcnNfIC0gc2tpcF87IH0KKworICB2b2lkKiBnZXRGcmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICBpbnQgYWRqdXN0ZWRfaW5kZXggPSBpbmRleCArIHNraXBfOworICAgIGlmIChhZGp1c3RlZF9pbmRleCA8IDAgfHwgYWRqdXN0ZWRfaW5kZXggPj0gbnVtQ2FsbGVyc18pIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gY2FsbGVyc19bYWRqdXN0ZWRfaW5kZXhdOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQqIGNhbGxlcnNfW01BWF9TVEFDS19ERVBUSF07CisgIGludCBudW1DYWxsZXJzXzsKKyAgaW50IHNraXBfOworfTsKKworLy8gRGVmaW5lIHRoZSBjb25zdHJ1Y3RvcnMgbm9uLWlubGluZSwgc28gdGhleSBjb25zaXN0ZW50bHkgYWRkIGEgc2luZ2xlCisvLyBmcmFtZSB0byB0aGUgc3RhY2sgdHJhY2UsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZAorQmFja3RyYWNlOjpCYWNrdHJhY2UoaW50IHNraXApCisgIDogc2tpcF8oc2tpcCArIDEpIC8vIGlnbm9yZSB0aGUgY29uc3RydWN0b3IgaXRzZWxmCit7CisgIG51bUNhbGxlcnNfID0gYmFja3RyYWNlKGNhbGxlcnNfLCBNQVhfU1RBQ0tfREVQVEgpOworICBpZiAoc2tpcF8gPiBudW1DYWxsZXJzXykgeworICAgIHNraXBfID0gbnVtQ2FsbGVyc187CisgIH0KK30KKworQmFja3RyYWNlOjpCYWNrdHJhY2UoQmFja3RyYWNlIGNvbnN0JiBidCkgOiBudW1DYWxsZXJzXyhidC5udW1DYWxsZXJzXyksIHNraXBfKGJ0LnNraXBfKSB7CisgIGlmIChudW1DYWxsZXJzXyA+PSAwKSB7CisgICAgbWVtY3B5KGNhbGxlcnNfLCBidC5jYWxsZXJzXywgbnVtQ2FsbGVyc18gKiBzaXplb2Yodm9pZCopKTsKKyAgfQorfQorCisvKioKKyAqIEEgYmFja3RyYWNlLCBwbHVzIG9uZSBvciB0d28gdHlwZSBuYW1lcworICovCitjbGFzcyBLZXkgeworcHVibGljOgorICBjbGFzcyBIYXNoIHsKKyAgcHVibGljOgorICAgIHNpemVfdCBvcGVyYXRvcigpKEtleSBjb25zdCYgaykgY29uc3QgeyByZXR1cm4gay5oYXNoKCk7IH0KKyAgfTsKKworICBLZXkoY29uc3QgQmFja3RyYWNlKiBidCwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbykKKyAgICA6IGJhY2t0cmFjZV8oYnQpLCB0eXBlTmFtZTFfKHR5cGVfaW5mby5uYW1lKCkpLCB0eXBlTmFtZTJfKE5VTEwpIHt9CisKKyAgS2V5KGNvbnN0IEJhY2t0cmFjZSogYnQsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2luZm8xLCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZV9pbmZvMikKKyAgICA6IGJhY2t0cmFjZV8oYnQpLCB0eXBlTmFtZTFfKHR5cGVfaW5mbzEubmFtZSgpKSwgdHlwZU5hbWUyXyh0eXBlX2luZm8yLm5hbWUoKSkge30KKworICBLZXkoY29uc3QgS2V5JiBrKQorICAgIDogYmFja3RyYWNlXyhrLmJhY2t0cmFjZV8pLCB0eXBlTmFtZTFfKGsudHlwZU5hbWUxXyksIHR5cGVOYW1lMl8oay50eXBlTmFtZTJfKSB7fQorCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEtleSYgaykgeworICAgIGJhY2t0cmFjZV8gPSBrLmJhY2t0cmFjZV87CisgICAgdHlwZU5hbWUxXyA9IGsudHlwZU5hbWUxXzsKKyAgICB0eXBlTmFtZTJfID0gay50eXBlTmFtZTJfOworICB9CisKKyAgY29uc3QgQmFja3RyYWNlKiBnZXRCYWNrdHJhY2UoKSBjb25zdCB7IHJldHVybiBiYWNrdHJhY2VfOyB9CisKKyAgY29uc3QgY2hhciogZ2V0VHlwZU5hbWUoKSBjb25zdCB7IHJldHVybiB0eXBlTmFtZTFfOyB9CisKKyAgY29uc3QgY2hhciogZ2V0VHlwZU5hbWUyKCkgY29uc3QgeyByZXR1cm4gdHlwZU5hbWUyXzsgfQorCisgIHZvaWQgbWFrZVBlcnNpc3RlbnQoKSB7CisgICAgLy8gQ29weSB0aGUgQmFja3RyYWNlIG9iamVjdAorICAgIGJhY2t0cmFjZV8gPSBuZXcgQmFja3RyYWNlKCpiYWNrdHJhY2VfKTsKKworICAgIC8vIE5PVEU6IFdlIGRvbid0IGNvcHkgdGhlIHR5cGUgbmFtZS4KKyAgICAvLyBUaGUgR05VIGxpYnN0ZGMrKyBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlX2luZm86Om5hbWUoKSByZXR1cm5zIGEgdmFsdWUKKyAgICAvLyB0aGF0IHdpbGwgYmUgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvZ3JhbS4gIChBbHRob3VnaCB0aGUgQysrCisgICAgLy8gc3RhbmRhcmQgZG9lc24ndCBndWFyYW50ZWUgdGhpcyB3aWxsIGJlIHRydWUgb24gYWxsIGltcGxlbWVudGF0aW9ucy4pCisgIH0KKworICAvKioKKyAgICogQ2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRlZCBieSBtYWtlUGVyc2lzdGVudCgpCisgICAqCisgICAqIFNob3VsZCBvbmx5IGJlIGludm9rZWQgaWYgbWFrZVBlcnNpc3RlbnQoKSBoYXMgcHJldmlvdXNseSBiZWVuIGNhbGxlZC4KKyAgICogVGhlIEtleSBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQgYWZ0ZXIgY2xlYW51cCgpIGlzIGNhbGxlZC4KKyAgICovCisgIHZvaWQgY2xlYW51cCgpIHsKKyAgICBkZWxldGUgYmFja3RyYWNlXzsKKyAgICBiYWNrdHJhY2VfID0gTlVMTDsKKyAgfQorCisgIGludCBjbXAoY29uc3QgS2V5JiBrKSBjb25zdCB7CisgICAgaW50IHJldCA9IGJhY2t0cmFjZV8tPmNtcCgqay5iYWNrdHJhY2VfKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gTk9URTogV2UgY29tcGFyZSBqdXN0IHRoZSBuYW1lIHBvaW50ZXJzLgorICAgIC8vIFdpdGggR05VIGxpYnN0ZGMrKywgZXZlcnkgdHlwZV9pbmZvIG9iamVjdCBmb3IgdGhlIHNhbWUgdHlwZSBwb2ludHMgdG8KKyAgICAvLyBleGFjdGx5IHRoZSBzYW1lIG5hbWUgc3RyaW5nLiAgKEFsdGhvdWdoIHRoaXMgaXNuJ3QgZ3VhcmFudGVlZCBieSB0aGUKKyAgICAvLyBDKysgc3RhbmRhcmQuKQorICAgIHJldCA9IGsudHlwZU5hbWUxXyAtIHR5cGVOYW1lMV87CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gay50eXBlTmFtZTJfIC0gdHlwZU5hbWUyXzsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXkmIGspIGNvbnN0IHsgcmV0dXJuIGNtcChrKSA9PSAwOyB9CisKKyAgc2l6ZV90IGhhc2goKSBjb25zdCB7CisgICAgLy8gTk9URTogQXMgYWJvdmUsIHdlIGp1c3QgdXNlIHRoZSBuYW1lIHBvaW50ZXIgdmFsdWUuCisgICAgLy8gV29ya3Mgd2l0aCBHTlUgbGlic3RkYysrLCBidXQgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCBvbiBhbGwKKyAgICAvLyBpbXBsZW1lbnRhdGlvbnMuCisgICAgcmV0dXJuIGJhY2t0cmFjZV8tPmhhc2goKSBeIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih0eXBlTmFtZTFfKQorICAgICAgICAgICBeIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih0eXBlTmFtZTJfKTsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBCYWNrdHJhY2UqIGJhY2t0cmFjZV87CisgIGNvbnN0IGNoYXIqIHR5cGVOYW1lMV87CisgIGNvbnN0IGNoYXIqIHR5cGVOYW1lMl87Cit9OworCisvKioKKyAqIEEgZnVuY3RvciB0aGF0IGRldGVybWluZXMgd2hpY2ggb2YgdHdvIEJhY2t0cmFjZU1hcCBlbnRyaWVzCisgKiBoYXMgYSBoaWdoZXIgY291bnQuCisgKi8KK2NsYXNzIENvdW50R3JlYXRlciB7CitwdWJsaWM6CisgIGJvb2wgb3BlcmF0b3IoKShzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+IGJ0MSwgc3RkOjpwYWlyPEtleSwgc2l6ZV90PiBidDIpIGNvbnN0IHsKKyAgICByZXR1cm4gYnQxLnNlY29uZCA+IGJ0Mi5zZWNvbmQ7CisgIH0KK307CisKK3R5cGVkZWYgX19nbnVfY3h4OjpoYXNoX21hcDxLZXksIHNpemVfdCwgS2V5OjpIYXNoPiBCYWNrdHJhY2VNYXA7CisKKy8qKgorICogQSBtYXAgZGVzY3JpYmluZyBob3cgbWFueSB0aW1lcyBUX1ZJUlRVQUxfQ0FMTCgpIGhhcyBiZWVuIGludm9rZWQuCisgKi8KK0JhY2t0cmFjZU1hcCB2aXJ0dWFsX2NhbGxzOworTXV0ZXggdmlydHVhbF9jYWxsc19tdXRleDsKKworLyoqCisgKiBBIG1hcCBkZXNjcmliaW5nIGhvdyBtYW55IHRpbWVzIFRfR0VORVJJQ19QUk9UT0NPTCgpIGhhcyBiZWVuIGludm9rZWQuCisgKi8KK0JhY2t0cmFjZU1hcCBnZW5lcmljX2NhbGxzOworTXV0ZXggZ2VuZXJpY19jYWxsc19tdXRleDsKKwordm9pZCBfcmVjb3JkX2JhY2t0cmFjZShCYWNrdHJhY2VNYXAqIG1hcCwgY29uc3QgTXV0ZXgmIG11dGV4LCBLZXkqIGspIHsKKyAgR3VhcmQgZ3VhcmQobXV0ZXgpOworCisgIEJhY2t0cmFjZU1hcDo6aXRlcmF0b3IgaXQgPSBtYXAtPmZpbmQoKmspOworICBpZiAoaXQgPT0gbWFwLT5lbmQoKSkgeworICAgIGstPm1ha2VQZXJzaXN0ZW50KCk7CisgICAgbWFwLT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmssIDEpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBpbmNyZW1lbnQgdGhlIGNvdW50CisgICAgLy8gTk9URTogd2UgY291bGQgYXNzZXJ0IGlmIGl0LT5zZWNvbmQgaXMgMCBhZnRlcndhcmRzLCBzaW5jZSB0aGF0IHdvdWxkCisgICAgLy8gbWVhbiB3ZSd2ZSB3cmFwcGVkLgorICAgICsrKGl0LT5zZWNvbmQpOworICB9Cit9CisKKy8qKgorICogUmVjb3JkIGFuIHVubmVjZXNzYXJ5IHZpcnR1YWwgZnVuY3Rpb24gY2FsbC4KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBUX1ZJUlRVQUxfQ0FMTCgpIG1hY3JvLgorICovCit2b2lkIHByb2ZpbGVfdmlydHVhbF9jYWxsKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlKSB7CisgIGludCBjb25zdCBza2lwID0gMTsgLy8gaWdub3JlIHRoaXMgZnJhbWUKKyAgQmFja3RyYWNlIGJ0KHNraXApOworICBLZXkgaygmYnQsIHR5cGUpOworICBfcmVjb3JkX2JhY2t0cmFjZSgmdmlydHVhbF9jYWxscywgdmlydHVhbF9jYWxsc19tdXRleCwgJmspOworfQorCisvKioKKyAqIFJlY29yZCBhIGNhbGwgdG8gYSB0ZW1wbGF0ZSBwcm9jZXNzb3Igd2l0aCBhIHByb3RvY29sIHRoYXQgaXMgbm90IHRoZSBvbmUKKyAqIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICoKKyAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIFRfR0VORVJJQ19QUk9UT0NPTCgpIG1hY3JvLgorICovCit2b2lkIHByb2ZpbGVfZ2VuZXJpY19wcm90b2NvbChjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdGVtcGxhdGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBwcm90X3R5cGUpIHsKKyAgaW50IGNvbnN0IHNraXAgPSAxOyAvLyBpZ25vcmUgdGhpcyBmcmFtZQorICBCYWNrdHJhY2UgYnQoc2tpcCk7CisgIEtleSBrKCZidCwgdGVtcGxhdGVfdHlwZSwgcHJvdF90eXBlKTsKKyAgX3JlY29yZF9iYWNrdHJhY2UoJmdlbmVyaWNfY2FsbHMsIGdlbmVyaWNfY2FsbHNfbXV0ZXgsICZrKTsKK30KKworLyoqCisgKiBQcmludCB0aGUgcmVjb3JkZWQgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KKyAqLwordm9pZCBwcm9maWxlX3ByaW50X2luZm8oRklMRSogZikgeworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gPiBCYWNrdHJhY2VWZWN0b3I7CisKKyAgQ291bnRHcmVhdGVyIGlzX2dyZWF0ZXI7CisKKyAgLy8gR3JhYiBib3RoIGxvY2tzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHByaW50IG9wZXJhdGlvbiwKKyAgLy8gdG8gZW5zdXJlIHRoZSBvdXRwdXQgaXMgYSBjb25zaXN0ZW50IHNuYXBzaG90IG9mIGEgc2luZ2xlIHBvaW50IGluIHRpbWUKKyAgR3VhcmQgZ2VuZXJpY19jYWxsc19ndWFyZChnZW5lcmljX2NhbGxzX211dGV4KTsKKyAgR3VhcmQgdmlydHVhbF9jYWxsc19ndWFyZCh2aXJ0dWFsX2NhbGxzX211dGV4KTsKKworICAvLyBwcmludCB0aGUgaW5mbyBmcm9tIGdlbmVyaWNfY2FsbHMsIHNvcnRlZCBieSBmcmVxdWVuY3kKKyAgLy8KKyAgLy8gV2UgcHJpbnQgdGhlIGdlbmVyaWNfY2FsbHMgaW5mbyBhaGVhZCBvZiB2aXJ0dWFsX2NhbGxzLCBzaW5jZSBpdCBpcyBtb3JlCisgIC8vIHVzZWZ1bCBpbiBzb21lIGNhc2VzLiAgQWxsIFRfR0VORVJJQ19QUk9UT0NPTCBjYWxscyBjYW4gYmUgZWxpbWluYXRlZAorICAvLyBmcm9tIG1vc3QgcHJvZ3JhbXMuICBOb3QgYWxsIFRfVklSVFVBTF9DQUxMcyB3aWxsIGJlIGVsaW1pbmF0ZWQgYnkKKyAgLy8gY29udmVydGluZyB0byB0ZW1wbGF0ZXMuCisgIEJhY2t0cmFjZVZlY3RvciBncF9zb3J0ZWQoZ2VuZXJpY19jYWxscy5iZWdpbigpLCBnZW5lcmljX2NhbGxzLmVuZCgpKTsKKyAgc3RkOjpzb3J0KGdwX3NvcnRlZC5iZWdpbigpLCBncF9zb3J0ZWQuZW5kKCksIGlzX2dyZWF0ZXIpOworCisgIGZvciAoQmFja3RyYWNlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IGdwX3NvcnRlZC5iZWdpbigpOyBpdCAhPSBncF9zb3J0ZWQuZW5kKCk7ICsraXQpIHsKKyAgICBLZXkgY29uc3QmIGtleSA9IGl0LT5maXJzdDsKKyAgICBzaXplX3QgY29uc3QgY291bnQgPSBpdC0+c2Vjb25kOworICAgIGZwcmludGYoZiwKKyAgICAgICAgICAgICJUX0dFTkVSSUNfUFJPVE9DT0w6ICV6dSBjYWxscyB0byAlcyB3aXRoIGEgJXM6XG4iLAorICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICBrZXkuZ2V0VHlwZU5hbWUoKSwKKyAgICAgICAgICAgIGtleS5nZXRUeXBlTmFtZTIoKSk7CisgICAga2V5LmdldEJhY2t0cmFjZSgpLT5wcmludChmLCAyKTsKKyAgICBmcHJpbnRmKGYsICJcbiIpOworICB9CisKKyAgLy8gcHJpbnQgdGhlIGluZm8gZnJvbSB2aXJ0dWFsX2NhbGxzLCBzb3J0ZWQgYnkgZnJlcXVlbmN5CisgIEJhY2t0cmFjZVZlY3RvciB2Y19zb3J0ZWQodmlydHVhbF9jYWxscy5iZWdpbigpLCB2aXJ0dWFsX2NhbGxzLmVuZCgpKTsKKyAgc3RkOjpzb3J0KHZjX3NvcnRlZC5iZWdpbigpLCB2Y19zb3J0ZWQuZW5kKCksIGlzX2dyZWF0ZXIpOworCisgIGZvciAoQmFja3RyYWNlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IHZjX3NvcnRlZC5iZWdpbigpOyBpdCAhPSB2Y19zb3J0ZWQuZW5kKCk7ICsraXQpIHsKKyAgICBLZXkgY29uc3QmIGtleSA9IGl0LT5maXJzdDsKKyAgICBzaXplX3QgY29uc3QgY291bnQgPSBpdC0+c2Vjb25kOworICAgIGZwcmludGYoZiwgIlRfVklSVFVBTF9DQUxMOiAlenUgY2FsbHMgb24gJXM6XG4iLCBjb3VudCwga2V5LmdldFR5cGVOYW1lKCkpOworICAgIGtleS5nZXRCYWNrdHJhY2UoKS0+cHJpbnQoZiwgMik7CisgICAgZnByaW50ZihmLCAiXG4iKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50IHRoZSByZWNvcmRlZCBwcm9maWxpbmcgaW5mb3JtYXRpb24gdG8gc3Rkb3V0LgorICovCit2b2lkIHByb2ZpbGVfcHJpbnRfaW5mbygpIHsKKyAgcHJvZmlsZV9wcmludF9pbmZvKHN0ZG91dCk7Cit9CisKKy8qKgorICogV3JpdGUgYSBCYWNrdHJhY2VNYXAgYXMgR29vZ2xlIENQVSBwcm9maWxlciBiaW5hcnkgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKEZJTEUqIGYsIEJhY2t0cmFjZU1hcCBjb25zdCYgbWFwKSB7CisgIC8vIFdyaXRlIHRoZSBoZWFkZXIKKyAgdWludHB0cl90IGhlYWRlcls1XSA9IHswLCAzLCAwLCAwLCAwfTsKKyAgZndyaXRlKCZoZWFkZXIsIHNpemVvZihoZWFkZXIpLCAxLCBmKTsKKworICAvLyBXcml0ZSB0aGUgcHJvZmlsZSByZWNvcmRzCisgIGZvciAoQmFja3RyYWNlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1hcC5iZWdpbigpOyBpdCAhPSBtYXAuZW5kKCk7ICsraXQpIHsKKyAgICB1aW50cHRyX3QgY291bnQgPSBpdC0+c2Vjb25kOworICAgIGZ3cml0ZSgmY291bnQsIHNpemVvZihjb3VudCksIDEsIGYpOworCisgICAgQmFja3RyYWNlIGNvbnN0KiBidCA9IGl0LT5maXJzdC5nZXRCYWNrdHJhY2UoKTsKKyAgICB1aW50cHRyX3QgbnVtX3BjcyA9IGJ0LT5nZXREZXB0aCgpOworICAgIGZ3cml0ZSgmbnVtX3Bjcywgc2l6ZW9mKG51bV9wY3MpLCAxLCBmKTsKKworICAgIGZvciAodWludHB0cl90IG4gPSAwOyBuIDwgbnVtX3BjczsgKytuKSB7CisgICAgICB2b2lkKiBwYyA9IGJ0LT5nZXRGcmFtZShuKTsKKyAgICAgIGZ3cml0ZSgmcGMsIHNpemVvZihwYyksIDEsIGYpOworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlIHRoZSB0cmFpbGVyCisgIHVpbnRwdHJfdCB0cmFpbGVyWzNdID0gezAsIDEsIDB9OworICBmd3JpdGUoJnRyYWlsZXIsIHNpemVvZih0cmFpbGVyKSwgMSwgZik7CisKKyAgLy8gV3JpdGUgL3Byb2Mvc2VsZi9tYXBzCisgIC8vIFRPRE8oc2ltcGtpbnMpOiBUaGlzIG9ubHkgd29ya3Mgb24gbGludXgKKyAgRklMRSogcHJvY19tYXBzID0gZm9wZW4oIi9wcm9jL3NlbGYvbWFwcyIsICJyIik7CisgIGlmIChwcm9jX21hcHMpIHsKKyAgICB1aW50OF90IGJ1Zls0MDk2XTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc2l6ZV90IGJ5dGVzX3JlYWQgPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBwcm9jX21hcHMpOworICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZ3cml0ZShidWYsIDEsIGJ5dGVzX3JlYWQsIGYpOworICAgIH0KKyAgICBmY2xvc2UocHJvY19tYXBzKTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIHRoZSByZWNvcmRlZCBwcm9maWxpbmcgaW5mb3JtYXRpb24gYXMgcHByb2YgZmlsZXMuCisgKgorICogVGhpcyB3cml0ZXMgdGhlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBHb29nbGUgQ1BVIHByb2ZpbGVyIGJpbmFyeSBkYXRhCisgKiBmb3JtYXQsIHNvIGl0IGNhbiBiZSBhbmFseXplZCB3aXRoIHBwcm9mLiAgTm90ZSB0aGF0IGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogcHJvdG9jb2wvdHJhbnNwb3J0IGRhdGEgdHlwZXMgY2Fubm90IGJlIHN0b3JlZCBpbiB0aGlzIGZpbGUgZm9ybWF0LgorICoKKyAqIFNlZSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLXBlcmZ0b29scy8gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gZ2VuX2NhbGxzX2YgICAgIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBjYWxscyB0bworICogICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2dlbmVyaWNfcHJvdG9jb2woKSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcworICogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLgorICogQHBhcmFtIHZpcnR1YWxfY2FsbHNfZiBUaGUgaW5mb3JtYXRpb24gYWJvdXQgY2FsbHMgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV92aXJ0dWFsX2NhbGwoKSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcyBmaWxlLgorICovCit2b2lkIHByb2ZpbGVfd3JpdGVfcHByb2YoRklMRSogZ2VuX2NhbGxzX2YsIEZJTEUqIHZpcnR1YWxfY2FsbHNfZikgeworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gPiBCYWNrdHJhY2VWZWN0b3I7CisKKyAgQ291bnRHcmVhdGVyIGlzX2dyZWF0ZXI7CisKKyAgLy8gR3JhYiBib3RoIGxvY2tzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHByaW50IG9wZXJhdGlvbiwKKyAgLy8gdG8gZW5zdXJlIHRoZSBvdXRwdXQgaXMgYSBjb25zaXN0ZW50IHNuYXBzaG90IG9mIGEgc2luZ2xlIHBvaW50IGluIHRpbWUKKyAgR3VhcmQgZ2VuZXJpY19jYWxsc19ndWFyZChnZW5lcmljX2NhbGxzX211dGV4KTsKKyAgR3VhcmQgdmlydHVhbF9jYWxsc19ndWFyZCh2aXJ0dWFsX2NhbGxzX211dGV4KTsKKworICAvLyB3cml0ZSB0aGUgaW5mbyBmcm9tIGdlbmVyaWNfY2FsbHMKKyAgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKGdlbl9jYWxsc19mLCBnZW5lcmljX2NhbGxzKTsKKworICAvLyB3cml0ZSB0aGUgaW5mbyBmcm9tIHZpcnR1YWxfY2FsbHMKKyAgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKHZpcnR1YWxfY2FsbHNfZiwgdmlydHVhbF9jYWxscyk7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyBUX0dMT0JBTF9QUk9GSUxFX1ZJUlRVQUwgPiAwCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5NmIxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX1RBU1lOQ19CVUZGRVJfUFJPQ0VTU09SX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitjbGFzcyBUQXN5bmNCdWZmZXJQcm9jZXNzb3IgeworcHVibGljOgorICAvLyBQcm9jZXNzIGRhdGEgaW4gImluIiwgcHV0dGluZyB0aGUgcmVzdWx0IGluICJvdXQiLgorICAvLyBDYWxsIF9yZXR1cm4odHJ1ZSkgd2hlbiBkb25lLCBvciBfcmV0dXJuKGZhbHNlKSB0bworICAvLyBmb3JjZWZ1bGx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIChpZiBhcHBsaWNhYmxlKS4KKyAgLy8gImluIiBhbmQgIm91dCIgc2hvdWxkIGJlIFRNZW1vcnlCdWZmZXIgb3Igc2ltaWxhciwKKyAgLy8gbm90IGEgd3JhcHBlciBhcm91bmQgYSBzb2NrZXQuCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpID0gMDsKKyAgdmlydHVhbCB+VEFzeW5jQnVmZmVyUHJvY2Vzc29yKCkge30KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ19CVUZGRVJfUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiOTExMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKwordm9pZCBUQXN5bmNDaGFubmVsOjpzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlciogcmVjdkJ1ZikgeworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gc2VuZF9kb25lCisgICAgICA9IHN0ZDo6YmluZCgmVEFzeW5jQ2hhbm5lbDo6cmVjdk1lc3NhZ2UsIHRoaXMsIGNvYiwgcmVjdkJ1Zik7CisKKyAgc2VuZE1lc3NhZ2Uoc2VuZF9kb25lLCBzZW5kQnVmKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FjZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9BU1lOQ19UQVNZTkNDSEFOTkVMX0hfCisjZGVmaW5lIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXyAxCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKK2NsYXNzIFRNZW1vcnlCdWZmZXI7Cit9Cit9Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKKworY2xhc3MgVEFzeW5jQ2hhbm5lbCB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRDYWxsYmFjazsKKworICB2aXJ0dWFsIH5UQXN5bmNDaGFubmVsKCkge30KKworICAvLyBpcyB0aGUgY2hhbm5lbCBpbiBhIGdvb2Qgc3RhdGU/CisgIHZpcnR1YWwgYm9vbCBnb29kKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgZXJyb3IoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCB0aW1lZE91dCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogU2VuZCBhIG1lc3NhZ2Ugb3ZlciB0aGUgY2hhbm5lbC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKKworICAvKioKKyAgICogUmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgY2hhbm5lbC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCByZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKKworICAvKioKKyAgICogU2VuZCBhIG1lc3NhZ2Ugb3ZlciB0aGUgY2hhbm5lbCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRiNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9BU1lOQ19UQVNZTkNESVNQQVRDSFBST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX0FTWU5DX1RBU1lOQ0RJU1BBVENIUFJPQ0VTU09SX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKKy8qKgorICogVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IgaXMgYSBoZWxwZXIgY2xhc3MgdG8gcGFyc2UgdGhlIG1lc3NhZ2UgaGVhZGVyIHRoZW4KKyAqIGNhbGwgYW5vdGhlciBmdW5jdGlvbiB0byBkaXNwYXRjaCBiYXNlZCBvbiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqCisgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGRpc3BhdGNoQ2FsbCgpIHRvIGRpc3BhdGNoIG9uIHRoZSBmdW5jdGlvbiBuYW1lLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgorY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUIDogcHVibGljIFRBc3luY1Byb2Nlc3NvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpIHsKKyAgICBwcm90b2NvbDo6VFByb3RvY29sKiBpblJhdyA9IGluLmdldCgpOworICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIG91dFJhdyA9IG91dC5nZXQoKTsKKworICAgIC8vIFRyeSB0byBkeW5hbWljIGNhc3QgdG8gdGhlIHRlbXBsYXRlIHByb3RvY29sIHR5cGUKKyAgICBQcm90b2NvbF8qIHNwZWNpZmljSW4gPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4oaW5SYXcpOworICAgIFByb3RvY29sXyogc3BlY2lmaWNPdXQgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3V0UmF3KTsKKyAgICBpZiAoc3BlY2lmaWNJbiAmJiBzcGVjaWZpY091dCkgeworICAgICAgcmV0dXJuIHByb2Nlc3NGYXN0KF9yZXR1cm4sIHNwZWNpZmljSW4sIHNwZWNpZmljT3V0KTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIHRvIHVzZSB0aGUgc2xvdyBwYXRoCisgICAgVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIGluUmF3LCBzcGVjaWZpY0luKTsKKyAgICBUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3V0UmF3LCBzcGVjaWZpY091dCk7CisKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgICAgaW5SYXctPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgICAvLyBJZiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgY2FsbCwgbG9nIGFuIGVycm9yIGFuZCByZXR1cm4gZmFsc2Ugc28KKyAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAvLworICAgIC8vIChUaGUgb2xkIGdlbmVyYXRlZCBwcm9jZXNzb3IgY29kZSB1c2VkIHRvIHRyeSB0byBza2lwIGEgVF9TVFJVQ1QgYW5kCisgICAgLy8gY29udGludWUuICBIb3dldmVyLCB0aGF0IHNlZW1zIHVuc2FmZS4pCisgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKKyAgICAgIF9yZXR1cm4oZmFsc2UpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGwoX3JldHVybiwgaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkKTsKKyAgfQorCisgIHZvaWQgcHJvY2Vzc0Zhc3Qoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBpbiwKKyAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIG91dCkgeworICAgIHN0ZDo6c3RyaW5nIGZuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKyAgICBpbi0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKKworICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CisgICAgICBfcmV0dXJuKGZhbHNlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpcy0+ZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKF9yZXR1cm4sIGluLCBvdXQsIGZuYW1lLCBzZXFpZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQpID0gMDsKK307CisKKy8qKgorICogTm9uLXRlbXBsYXRpemVkIHZlcnNpb24gb2YgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IsCisgKiB0aGF0IGRvZXNuJ3QgYm90aGVyIHRyeWluZyB0byBwZXJmb3JtIGEgZHluYW1pY19jYXN0LgorICovCitjbGFzcyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciA6IHB1YmxpYyBUQXN5bmNQcm9jZXNzb3IgeworcHVibGljOgorICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSB7CisgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogaW5SYXcgPSBpbi5nZXQoKTsKKyAgICBwcm90b2NvbDo6VFByb3RvY29sKiBvdXRSYXcgPSBvdXQuZ2V0KCk7CisKKyAgICBzdGQ6OnN0cmluZyBmbmFtZTsKKyAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgICAgaW5SYXctPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisKKyAgICAvLyBJZiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgY2FsbCwgbG9nIGFuIGVycm9yIGFuZCByZXR1cm4gZmFsc2Ugc28KKyAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAvLworICAgIC8vIChUaGUgb2xkIGdlbmVyYXRlZCBwcm9jZXNzb3IgY29kZSB1c2VkIHRvIHRyeSB0byBza2lwIGEgVF9TVFJVQ1QgYW5kCisgICAgLy8gY29udGludWUuICBIb3dldmVyLCB0aGF0IHNlZW1zIHVuc2FmZS4pCisgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKKyAgICAgIF9yZXR1cm4oZmFsc2UpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldHVybiBkaXNwYXRjaENhbGwoX3JldHVybiwgaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGwoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkKSA9IDA7Cit9OworCisvLyBTcGVjaWFsaXplIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVCBmb3IgVFByb3RvY29sIGFuZCBURHVtbXlQcm90b2NvbCBqdXN0IHRvCisvLyB1c2UgdGhlIGdlbmVyaWMgVERpc3BhdGNoUHJvY2Vzc29yLgordGVtcGxhdGUgPD4KK2NsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VER1bW15UHJvdG9jb2w+IDogcHVibGljIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIHt9OwordGVtcGxhdGUgPD4KK2NsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VFByb3RvY29sPiA6IHB1YmxpYyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciB7fTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyBfVEhSSUZUX0FTWU5DX1RBU1lOQ0RJU1BBVENIUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiOTc2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8KKyNkZWZpbmUgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworLyoqCisgKiBBc3luYyB2ZXJzaW9uIG9mIGEgVFByb2Nlc3Nvci4gIEl0IGlzIG5vdCBleHBlY3RlZCB0byBjb21wbGV0ZSBieSB0aGUgdGltZQorICogdGhlIGNhbGwgdG8gcHJvY2VzcyByZXR1cm5zLiAgSW5zdGVhZCwgaXQgY2FsbHMgYSBjb2IgdG8gc2lnbmFsIGNvbXBsZXRpb24uCisgKi8KKworY2xhc3MgVEFzeW5jUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VEFzeW5jUHJvY2Vzc29yKCkge30KKworICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSA9IDA7CisKKyAgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlvKSB7CisgICAgcmV0dXJuIHByb2Nlc3MoX3JldHVybiwgaW8sIGlvKTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CisKKyAgdm9pZCBzZXRFdmVudEhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgeworICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CisgIH0KKworcHJvdGVjdGVkOgorICBUQXN5bmNQcm9jZXNzb3IoKSB7fQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworfTsKKworY2xhc3MgVEFzeW5jUHJvY2Vzc29yRmFjdG9yeSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRBc3luY1Byb2Nlc3NvckZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBHZXQgdGhlIFRBc3luY1Byb2Nlc3NvciB0byB1c2UgZm9yIGEgcGFydGljdWxhciBjb25uZWN0aW9uLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBpcyBhbHdheXMgaW52b2tlZCBpbiB0aGUgc2FtZSB0aHJlYWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMKKyAgICogYWNjZXB0ZWQgb24uICBUaGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IHRoaXMgY2FsbCBkb2VzIG5vdCBuZWVkIHRvIGJlCisgICAqIHRocmVhZCBzYWZlLCBhcyBpdCB3aWxsIGFsd2F5cyBiZSBpbnZva2VkIGZyb20gYSBzaW5nbGUgdGhyZWFkLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jUHJvY2Vzc29yOworfQorfQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ1BST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1MjAxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmg+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCit2b2lkIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gb2J1ZikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdChwZmFjdF8tPmdldFByb3RvY29sKGlidWYpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3QocGZhY3RfLT5nZXRQcm90b2NvbChvYnVmKSk7CisgIHJldHVybiB1bmRlcmx5aW5nXworICAgICAgLT5wcm9jZXNzKHN0ZDo6YmluZCgmVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OmZpbmlzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgaXByb3QsCisgICAgICAgICAgICAgICAgb3Byb3QpOworfQorCisvKiBzdGF0aWMgKi8gdm9pZCBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoKAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAorICAgIGJvb2wgaGVhbHRoeSkgeworICAodm9pZClvcHJvdDsKKyAgLy8gVGhpcyBpcyBhIHN0dWIgZnVuY3Rpb24gdG8gaG9sZCBhIHJlZmVyZW5jZSB0byBvcHJvdC4KKyAgcmV0dXJuIF9yZXR1cm4oaGVhbHRoeSk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDUyY2YzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVE5BTUVfTUVfSF8KKyNkZWZpbmUgX1RIUklGVF9UTkFNRV9NRV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yIDogcHVibGljIFRBc3luY0J1ZmZlclByb2Nlc3NvciB7CitwdWJsaWM6CisgIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0KQorICAgIDogdW5kZXJseWluZ18odW5kZXJseWluZyksIHBmYWN0XyhwZmFjdCkge30KKworICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpOworCisgIHZpcnR1YWwgflRBc3luY1Byb3RvY29sUHJvY2Vzc29yKCkge30KKworcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgZmluaXNoKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVhbHRoeSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdW5kZXJseWluZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1ROQU1FX01FX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlMjdjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaD4KKyNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6VENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbygpIDoKKyAgc3RvcF8oZmFsc2UpLAorICBzZXFpZE11dGV4XygpLAorICAvLyB0ZXN0IHJvbGxvdmVyIGFsbCB0aGUgdGltZQorICBuZXh0c2VxaWRfKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCktMTApLAorICBzZXFpZFRvTW9uaXRvck1hcF8oKSwKKyAgZnJlZU1vbml0b3JzXygpLAorICB3cml0ZU11dGV4XygpLAorICByZWFkTXV0ZXhfKCksCisgIHJlY3ZQZW5kaW5nXyhmYWxzZSksCisgIHdha2V1cFNvbWVvbmVfKGZhbHNlKSwKKyAgc2VxaWRQZW5kaW5nXygwKSwKKyAgZm5hbWVQZW5kaW5nXygpLAorICBtdHlwZVBlbmRpbmdfKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NBTEwpCit7CisgIGZyZWVNb25pdG9yc18ucmVzZXJ2ZShNT05JVE9SX0NBQ0hFX1NJWkUpOworfQorCitib29sIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OmdldFBlbmRpbmcoCisgIHN0ZDo6c3RyaW5nICZmbmFtZSwKKyAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSAmbXR5cGUsCisgIGludDMyX3QgJnJzZXFpZCkKK3sKKyAgaWYoc3RvcF8pCisgICAgdGhyb3dEZWFkQ29ubmVjdGlvbl8oKTsKKyAgd2FrZXVwU29tZW9uZV8gPSBmYWxzZTsKKyAgaWYocmVjdlBlbmRpbmdfKQorICB7CisgICAgcmVjdlBlbmRpbmdfID0gZmFsc2U7CisgICAgcnNlcWlkID0gc2VxaWRQZW5kaW5nXzsKKyAgICBmbmFtZSAgPSBmbmFtZVBlbmRpbmdfOworICAgIG10eXBlICA9IG10eXBlUGVuZGluZ187CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OnVwZGF0ZVBlbmRpbmcoCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZmbmFtZSwKKyAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZSwKKyAgaW50MzJfdCByc2VxaWQpCit7CisgIHJlY3ZQZW5kaW5nXyA9IHRydWU7CisgIHNlcWlkUGVuZGluZ18gPSByc2VxaWQ7CisgIGZuYW1lUGVuZGluZ18gPSBmbmFtZTsKKyAgbXR5cGVQZW5kaW5nXyA9IG10eXBlOworICBNb25pdG9yUHRyIG1vbml0b3I7CisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHNlcWlkTXV0ZXhfKTsKKyAgICBNb25pdG9yTWFwOjppdGVyYXRvciBpID0gc2VxaWRUb01vbml0b3JNYXBfLmZpbmQocnNlcWlkKTsKKyAgICBpZihpID09IHNlcWlkVG9Nb25pdG9yTWFwXy5lbmQoKSkKKyAgICAgIHRocm93QmFkU2VxSWRfKCk7CisgICAgbW9uaXRvciA9IGktPnNlY29uZDsKKyAgfQorICBtb25pdG9yLT5ub3RpZnkoKTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp3YWl0Rm9yV29yayhpbnQzMl90IHNlcWlkKQoreworICBNb25pdG9yUHRyIG07CisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHNlcWlkTXV0ZXhfKTsKKyAgICBtID0gc2VxaWRUb01vbml0b3JNYXBfW3NlcWlkXTsKKyAgfQorICB3aGlsZSh0cnVlKQorICB7CisgICAgLy8gYmUgdmVyeSBjYXJlZnVsIGFib3V0IHNldHRpbmcgc3RhdGUgaW4gdGhpcyBsb29wIHRoYXQgYWZmZWN0cyB3YWtpbmcgdXAuICBZb3UgbWF5IGV4aXQKKyAgICAvLyB0aGlzIGZ1bmN0aW9uLCBhdHRlbXB0IHRvIGdyYWIgc29tZSB3b3JrLCBhbmQgc29tZW9uZSBlbHNlIGNvdWxkIGhhdmUgYmVhdGVuIHlvdSAob3Igbm90CisgICAgLy8gbGVmdCkgdGhlIHJlYWQgbXV0ZXgsIGFuZCB0aGF0IHdpbGwgcHV0IHlvdSByaWdodCBiYWNrIGluIHRoaXMgbG9vcCwgd2l0aCB0aGUgbWFuZ2xlZAorICAgIC8vIHN0YXRlIHlvdSBsZWZ0IGJlaGluZC4KKyAgICBpZihzdG9wXykKKyAgICAgIHRocm93RGVhZENvbm5lY3Rpb25fKCk7CisgICAgaWYod2FrZXVwU29tZW9uZV8pCisgICAgICByZXR1cm47CisgICAgaWYocmVjdlBlbmRpbmdfICYmIHNlcWlkUGVuZGluZ18gPT0gc2VxaWQpCisgICAgICByZXR1cm47CisgICAgbS0+d2FpdEZvcmV2ZXIoKTsKKyAgfQorfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OnRocm93QmFkU2VxSWRfKCkKK3sKKyAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICBUQXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCwKKyAgICAic2VydmVyIHNlbnQgYSBiYWQgc2VxaWQiKTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp0aHJvd0RlYWRDb25uZWN0aW9uXygpCit7CisgIHRocm93IGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgInRoaXMgY2xpZW50IGRpZWQgb24gYW5vdGhlciB0aHJlYWQsIGFuZCBpcyBub3cgaW4gYW4gdW51c2FibGUgc3RhdGUiKTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp3YWtldXBBbnlvbmVfKGNvbnN0IEd1YXJkICYpCit7CisgIHdha2V1cFNvbWVvbmVfID0gdHJ1ZTsKKyAgaWYoIXNlcWlkVG9Nb25pdG9yTWFwXy5lbXB0eSgpKQorICB7CisgICAgLy8gVGhlIG1vbml0b3IgbWFwIG1hcHMgaW50ZWdlcnMgdG8gbW9uaXRvcnMuICBMYXJnZXIgaW50ZWdlcnMgYXJlIG1vcmUgcmVjZW50CisgICAgLy8gbWVzc2FnZXMuICBTaW5jZSB0aGlzIGlzIG9yZGVyZWQsIGl0IG1lYW5zIHRoYXQgdGhlIGxhc3QgZWxlbWVudCBpcyB0aGUgbW9zdCByZWNlbnQuCisgICAgLy8gV2UgYXJlIHRyeWluZyB0byBndWVzcyB3aGljaCB0aHJlYWQgd2lsbCBoYXZlIGl0cyBtZXNzYWdlIGNvbXBsZXRlIG5leHQsIHNvIHdlIGFyZSBwaWNraW5nCisgICAgLy8gdGhlIG1vc3QgcmVjZW50LiBUaGUgb2xkZXN0IG1lc3NhZ2UgaXMgbGlrZWx5IHRvIGJlIHNvbWUgcG9sbGluZywgbG9uZyBsaXZlZCBtZXNzYWdlLgorICAgIC8vIElmIHdlIGd1ZXNzIHJpZ2h0LCB0aGUgdGhyZWFkIHdlIHdha2UgdXAgd2lsbCBoYW5kbGUgdGhlIG1lc3NhZ2UgdGhhdCBjb21lcyBpbi4KKyAgICAvLyBJZiB3ZSBndWVzcyB3cm9uZywgdGhlIHRocmVhZCB3ZSB3YWtlIHVwIHdpbGwgaGFuZCBvZmYgdGhlIHdvcmsgdG8gdGhlIGNvcnJlY3QgdGhyZWFkLAorICAgIC8vIGNvc3RpbmcgdXMgYW4gZXh0cmEgY29udGV4dCBzd2l0Y2guCisgICAgc2VxaWRUb01vbml0b3JNYXBfLnJiZWdpbigpLT5zZWNvbmQtPm5vdGlmeSgpOworICB9Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6bWFya0JhZF8oY29uc3QgR3VhcmQgJikKK3sKKyAgd2FrZXVwU29tZW9uZV8gPSB0cnVlOworICBzdG9wXyA9IHRydWU7CisgIGZvcihNb25pdG9yTWFwOjppdGVyYXRvciBpID0gc2VxaWRUb01vbml0b3JNYXBfLmJlZ2luKCk7IGkgIT0gc2VxaWRUb01vbml0b3JNYXBfLmVuZCgpOyArK2kpCisgICAgaS0+c2Vjb25kLT5ub3RpZnkoKTsKK30KKworVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6TW9uaXRvclB0cgorVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6bmV3TW9uaXRvcl8oY29uc3QgR3VhcmQgJikKK3sKKyAgaWYoZnJlZU1vbml0b3JzXy5lbXB0eSgpKQorICAgIHJldHVybiBNb25pdG9yUHRyKG5ldyBNb25pdG9yKCZyZWFkTXV0ZXhfKSk7CisgIE1vbml0b3JQdHIgcmV0dmFsOworICAvL3N3YXBwaW5nIHRvIGF2b2lkIGFuIGF0b21pYyBvcGVyYXRpb24KKyAgcmV0dmFsLnN3YXAoZnJlZU1vbml0b3JzXy5iYWNrKCkpOworICBmcmVlTW9uaXRvcnNfLnBvcF9iYWNrKCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6ZGVsZXRlTW9uaXRvcl8oCisgIGNvbnN0IEd1YXJkICYsCisgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86Ok1vbml0b3JQdHIgJm0pIC8qbm9leGNlcHQqLworeworICBpZihmcmVlTW9uaXRvcnNfLnNpemUoKSA+IE1PTklUT1JfQ0FDSEVfU0laRSkKKyAgeworICAgIG0ucmVzZXQoKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy9mcmVlTW9uaXRvcnNfIHdhcyByZXNlcnZlZCB1cCB0byBNT05JVE9SX0NBQ0hFX1NJWkUgaW4gdGhlIGN0b3IsCisgIC8vc28gdGhpcyBzaG91bGRuJ3QgdGhyb3cKKyAgZnJlZU1vbml0b3JzXy5wdXNoX2JhY2soVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6TW9uaXRvclB0cigpKTsKKyAgLy9zd2FwcGluZyB0byBhdm9pZCBhbiBhdG9taWMgb3BlcmF0aW9uCisgIG0uc3dhcChmcmVlTW9uaXRvcnNfLmJhY2soKSk7Cit9CisKK2ludDMyX3QgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6Z2VuZXJhdGVTZXFJZCgpCit7CisgIEd1YXJkIHNlcWlkR3VhcmQoc2VxaWRNdXRleF8pOworICBpZihzdG9wXykKKyAgICB0aHJvd0RlYWRDb25uZWN0aW9uXygpOworCisgIGlmKCFzZXFpZFRvTW9uaXRvck1hcF8uZW1wdHkoKSkKKyAgICBpZihuZXh0c2VxaWRfID09IHNlcWlkVG9Nb25pdG9yTWFwXy5iZWdpbigpLT5maXJzdCkKKyAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lELAorICAgICAgICAiYWJvdXQgdG8gcmVwZWF0IGEgc2VxaWQiKTsKKyAgaW50MzJfdCBuZXdTZXFJZCA9IG5leHRzZXFpZF8rKzsKKyAgc2VxaWRUb01vbml0b3JNYXBfW25ld1NlcUlkXSA9IG5ld01vbml0b3JfKHNlcWlkR3VhcmQpOworICByZXR1cm4gbmV3U2VxSWQ7Cit9CisKK1RDb25jdXJyZW50UmVjdlNlbnRyeTo6VENvbmN1cnJlbnRSZWN2U2VudHJ5KFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gKnN5bmMsIGludDMyX3Qgc2VxaWQpIDoKKyAgc3luY18oKnN5bmMpLAorICBzZXFpZF8oc2VxaWQpLAorICBjb21taXR0ZWRfKGZhbHNlKQoreworICBzeW5jXy5nZXRSZWFkTXV0ZXgoKS5sb2NrKCk7Cit9CisKK1RDb25jdXJyZW50UmVjdlNlbnRyeTo6flRDb25jdXJyZW50UmVjdlNlbnRyeSgpCit7CisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHN5bmNfLnNlcWlkTXV0ZXhfKTsKKyAgICBzeW5jXy5kZWxldGVNb25pdG9yXyhzZXFpZEd1YXJkLCBzeW5jXy5zZXFpZFRvTW9uaXRvck1hcF9bc2VxaWRfXSk7CisKKyAgICBzeW5jXy5zZXFpZFRvTW9uaXRvck1hcF8uZXJhc2Uoc2VxaWRfKTsKKyAgICBpZihjb21taXR0ZWRfKQorICAgICAgc3luY18ud2FrZXVwQW55b25lXyhzZXFpZEd1YXJkKTsKKyAgICBlbHNlCisgICAgICBzeW5jXy5tYXJrQmFkXyhzZXFpZEd1YXJkKTsKKyAgfQorICBzeW5jXy5nZXRSZWFkTXV0ZXgoKS51bmxvY2soKTsKK30KKwordm9pZCBUQ29uY3VycmVudFJlY3ZTZW50cnk6OmNvbW1pdCgpCit7CisgIGNvbW1pdHRlZF8gPSB0cnVlOworfQorCitUQ29uY3VycmVudFNlbmRTZW50cnk6OlRDb25jdXJyZW50U2VuZFNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvICpzeW5jKSA6CisgIHN5bmNfKCpzeW5jKSwKKyAgY29tbWl0dGVkXyhmYWxzZSkKK3sKKyAgc3luY18uZ2V0V3JpdGVNdXRleCgpLmxvY2soKTsKK30KKworVENvbmN1cnJlbnRTZW5kU2VudHJ5Ojp+VENvbmN1cnJlbnRTZW5kU2VudHJ5KCkKK3sKKyAgaWYoIWNvbW1pdHRlZF8pCisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHN5bmNfLnNlcWlkTXV0ZXhfKTsKKyAgICBzeW5jXy5tYXJrQmFkXyhzZXFpZEd1YXJkKTsKKyAgfQorICBzeW5jXy5nZXRXcml0ZU11dGV4KCkudW5sb2NrKCk7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRTZW5kU2VudHJ5Ojpjb21taXQoKQoreworICBjb21taXR0ZWRfID0gdHJ1ZTsKK30KKworCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM1ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1RDT05DVVJSRU5UQ0xJRU5UU1lOQ0lORk9fSF8KKyNkZWZpbmUgX1RIUklGVF9UQ09OQ1VSUkVOVENMSUVOVFNZTkNJTkZPX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm87CisKK2NsYXNzIFRDb25jdXJyZW50U2VuZFNlbnRyeSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRDb25jdXJyZW50U2VuZFNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvKiBzeW5jKTsKKyAgflRDb25jdXJyZW50U2VuZFNlbnRyeSgpOworCisgIHZvaWQgY29tbWl0KCk7CisKK3ByaXZhdGU6CisgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8mIHN5bmNfOworICBib29sIGNvbW1pdHRlZF87Cit9OworCitjbGFzcyBUQ29uY3VycmVudFJlY3ZTZW50cnkgeworcHVibGljOgorICBUQ29uY3VycmVudFJlY3ZTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyogc3luYywgaW50MzJfdCBzZXFpZCk7CisgIH5UQ29uY3VycmVudFJlY3ZTZW50cnkoKTsKKworICB2b2lkIGNvbW1pdCgpOworCitwcml2YXRlOgorICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvJiBzeW5jXzsKKyAgaW50MzJfdCBzZXFpZF87CisgIGJvb2wgY29tbWl0dGVkXzsKK307CisKK2NsYXNzIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8geworcHJpdmF0ZTogLy8gdHlwZWRlZnMKKyAgdHlwZWRlZiBzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yPiBNb25pdG9yUHRyOworICB0eXBlZGVmIHN0ZDo6bWFwPGludDMyX3QsIE1vbml0b3JQdHI+IE1vbml0b3JNYXA7CisKK3B1YmxpYzoKKyAgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbygpOworCisgIGludDMyX3QgZ2VuZXJhdGVTZXFJZCgpOworCisgIGJvb2wgZ2V0UGVuZGluZyhzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlJiBtdHlwZSwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIHJzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKworICB2b2lkIHVwZGF0ZVBlbmRpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcnNlcWlkKTsgLyogcmVxdWlyZXMgcmVhZE11dGV4XyAqLworCisgIHZvaWQgd2FpdEZvcldvcmsoaW50MzJfdCBzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKworICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXgmIGdldFJlYWRNdXRleCgpIHsgcmV0dXJuIHJlYWRNdXRleF87IH0KKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4JiBnZXRXcml0ZU11dGV4KCkgeyByZXR1cm4gd3JpdGVNdXRleF87IH0KKworcHJpdmF0ZTogLy8gY29uc3RhbnRzCisgIGVudW0geyBNT05JVE9SX0NBQ0hFX1NJWkUgPSAxMCB9OworCitwcml2YXRlOiAvLyBmdW5jdGlvbnMKKyAgTW9uaXRvclB0ciBuZXdNb25pdG9yXygKKyAgICAgIGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCk7IC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgIHZvaWQgZGVsZXRlTW9uaXRvcl8oY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkLCBNb25pdG9yUHRyJiBtKTsKKyAgICAgIC8qbm9leGNlcHQqLyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIHdha2V1cEFueW9uZV8oCisgICAgICBjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQpOyAgICAgICAgICAgLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgdm9pZCBtYXJrQmFkXyhjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQpOyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIHRocm93QmFkU2VxSWRfKCk7CisgIHZvaWQgdGhyb3dEZWFkQ29ubmVjdGlvbl8oKTsKKworcHJpdmF0ZTogLy8gZGF0YSBtZW1iZXJzCisgIHZvbGF0aWxlIGJvb2wgc3RvcF87CisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4IHNlcWlkTXV0ZXhfOworICAvLyBiZWdpbiBzZXFpZE11dGV4XyBwcm90ZWN0ZWQgbWVtYmVycworICBpbnQzMl90IG5leHRzZXFpZF87CisgIE1vbml0b3JNYXAgc2VxaWRUb01vbml0b3JNYXBfOworICBzdGQ6OnZlY3RvcjxNb25pdG9yUHRyPiBmcmVlTW9uaXRvcnNfOworICAvLyBlbmQgc2VxaWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKworICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXggd3JpdGVNdXRleF87CisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4IHJlYWRNdXRleF87CisgIC8vIGJlZ2luIHJlYWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKyAgYm9vbCByZWN2UGVuZGluZ187CisgIGJvb2wgd2FrZXVwU29tZW9uZV87CisgIGludDMyX3Qgc2VxaWRQZW5kaW5nXzsKKyAgc3RkOjpzdHJpbmcgZm5hbWVQZW5kaW5nXzsKKyAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZVBlbmRpbmdfOworICAvLyBlbmQgcmVhZE11dGV4XyBwcm90ZWN0ZWQgbWVtYmVycworCisgIGZyaWVuZCBjbGFzcyBUQ29uY3VycmVudFNlbmRTZW50cnk7CisgIGZyaWVuZCBjbGFzcyBUQ29uY3VycmVudFJlY3ZTZW50cnk7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vIF9USFJJRlRfVENPTkNVUlJFTlRDTElFTlRTWU5DSU5GT19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmODEwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oPgorI2luY2x1ZGUgPGV2aHR0cC5oPgorI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXIuaD4KKyNpbmNsdWRlIDxldmVudDIvYnVmZmVyX2NvbXBhdC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK1RFdmh0dHBDbGllbnRDaGFubmVsOjpURXZodHRwQ2xpZW50Q2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZkbnNfYmFzZSogZG5zYmFzZSkKKworICA6IGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSwgY29ubl8oTlVMTCkgeworICBjb25uXyA9IGV2aHR0cF9jb25uZWN0aW9uX2Jhc2VfbmV3KGViLCBkbnNiYXNlLCBhZGRyZXNzLCBwb3J0KTsKKyAgaWYgKGNvbm5fID09IE5VTEwpIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfY29ubmVjdGlvbl9uZXcgZmFpbGVkIik7CisgIH0KK30KKworVEV2aHR0cENsaWVudENoYW5uZWw6On5URXZodHRwQ2xpZW50Q2hhbm5lbCgpIHsKKyAgaWYgKGNvbm5fICE9IE5VTEwpIHsKKyAgICBldmh0dHBfY29ubmVjdGlvbl9mcmVlKGNvbm5fKTsKKyAgfQorfQorCit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7CisgIHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxID0gZXZodHRwX3JlcXVlc3RfbmV3KHJlc3BvbnNlLCB0aGlzKTsKKyAgaWYgKHJlcSA9PSBOVUxMKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX3JlcXVlc3RfbmV3IGZhaWxlZCIpOworICB9CisKKyAgaW50IHJ2OworCisgIHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIocmVxLT5vdXRwdXRfaGVhZGVycywgIkhvc3QiLCBob3N0Xy5jX3N0cigpKTsKKyAgaWYgKHJ2ICE9IDApIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfYWRkX2hlYWRlciBmYWlsZWQiKTsKKyAgfQorCisgIHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIocmVxLT5vdXRwdXRfaGVhZGVycywgIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOworICBpZiAocnYgIT0gMCkgeworICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9hZGRfaGVhZGVyIGZhaWxlZCIpOworICB9CisKKyAgdWludDhfdCogb2J1ZjsKKyAgdWludDMyX3Qgc3o7CisgIHNlbmRCdWYtPmdldEJ1ZmZlcigmb2J1ZiwgJnN6KTsKKyAgcnYgPSBldmJ1ZmZlcl9hZGQocmVxLT5vdXRwdXRfYnVmZmVyLCBvYnVmLCBzeik7CisgIGlmIChydiAhPSAwKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZidWZmZXJfYWRkIGZhaWxlZCIpOworICB9CisKKyAgcnYgPSBldmh0dHBfbWFrZV9yZXF1ZXN0KGNvbm5fLCByZXEsIEVWSFRUUF9SRVFfUE9TVCwgcGF0aF8uY19zdHIoKSk7CisgIGlmIChydiAhPSAwKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX21ha2VfcmVxdWVzdCBmYWlsZWQiKTsKKyAgfQorCisgIGNvbXBsZXRpb25RdWV1ZV8ucHVzaChDb21wbGV0aW9uKGNvYiwgcmVjdkJ1ZikpOworfQorCit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpIHsKKyAgKHZvaWQpY29iOworICAodm9pZCltZXNzYWdlOworICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kTWVzc2FnZSIpOworfQorCit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpIHsKKyAgKHZvaWQpY29iOworICAodm9pZCltZXNzYWdlOworICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZWN2TWVzc2FnZSIpOworfQorCit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpmaW5pc2goc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpIHsKKyAgYXNzZXJ0KCFjb21wbGV0aW9uUXVldWVfLmVtcHR5KCkpOworICBDb21wbGV0aW9uIGNvbXBsZXRpb24gPSBjb21wbGV0aW9uUXVldWVfLmZyb250KCk7CisgIGNvbXBsZXRpb25RdWV1ZV8ucG9wKCk7CisgIGlmIChyZXEgPT0gTlVMTCkgeworICAgIHRyeSB7CisgICAgICBjb21wbGV0aW9uLmZpcnN0KCk7CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgeworICAgICAgaWYgKGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKQorICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJjb25uZWN0IGZhaWxlZCIpOworICAgICAgZWxzZQorICAgICAgICB0aHJvdzsKKyAgICB9CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHJlcS0+cmVzcG9uc2VfY29kZSAhPSAyMDApIHsKKyAgICB0cnkgeworICAgICAgY29tcGxldGlvbi5maXJzdCgpOworICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIGUpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgInNlcnZlciByZXR1cm5lZCBjb2RlICIgPDwgcmVxLT5yZXNwb25zZV9jb2RlOworICAgICAgaWYgKHJlcS0+cmVzcG9uc2VfY29kZV9saW5lKQorICAgICAgICBzcyA8PCAiOiAiIDw8IHJlcS0+cmVzcG9uc2VfY29kZV9saW5lOworICAgICAgaWYgKGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKQorICAgICAgICB0aHJvdyBURXhjZXB0aW9uKHNzLnN0cigpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdGhyb3c7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBjb21wbGV0aW9uLnNlY29uZC0+cmVzZXRCdWZmZXIoRVZCVUZGRVJfREFUQShyZXEtPmlucHV0X2J1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRVZCVUZGRVJfTEVOR1RIKHJlcS0+aW5wdXRfYnVmZmVyKSkpOworICBjb21wbGV0aW9uLmZpcnN0KCk7CisgIHJldHVybjsKK30KKworLyogc3RhdGljICovIHZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpIHsKKyAgVEV2aHR0cENsaWVudENoYW5uZWwqIHNlbGYgPSAoVEV2aHR0cENsaWVudENoYW5uZWwqKWFyZzsKKyAgdHJ5IHsKKyAgICBzZWxmLT5maW5pc2gocmVxKTsKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICAvLyBkb24ndCBwcm9wYWdhdGUgYSBDKysgZXhjZXB0aW9uIGluIEMgY29kZSAoZS5nLiBsaWJldmVudCkKKyAgICBzdGQ6OmNlcnIgPDwgIlRFdmh0dHBDbGllbnRDaGFubmVsOjpyZXNwb25zZSBleGNlcHRpb24gdGhyb3duIChpZ25vcmVkKTogIiA8PCBlLndoYXQoKQorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjFmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfCisjZGVmaW5lIF9USFJJRlRfVEVWSFRUUF9DTElFTlRfQ0hBTk5FTF9IXyAxCisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaD4KKworc3RydWN0IGV2ZW50X2Jhc2U7CitzdHJ1Y3QgZXZkbnNfYmFzZTsKK3N0cnVjdCBldmh0dHBfY29ubmVjdGlvbjsKK3N0cnVjdCBldmh0dHBfcmVxdWVzdDsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworY2xhc3MgVE1lbW9yeUJ1ZmZlcjsKK30KK30KK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRFdmh0dHBDbGllbnRDaGFubmVsIDogcHVibGljIFRBc3luY0NoYW5uZWwgeworcHVibGljOgorICB1c2luZyBUQXN5bmNDaGFubmVsOjpWb2lkQ2FsbGJhY2s7CisKKyAgVEV2aHR0cENsaWVudENoYW5uZWwoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZkbnNfYmFzZSAqZG5zYmFzZSA9IDApOworICB+VEV2aHR0cENsaWVudENoYW5uZWwoKTsKKworICB2aXJ0dWFsIHZvaWQgc2VuZEFuZFJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogcmVjdkJ1Zik7CisKKyAgdmlydHVhbCB2b2lkIHNlbmRNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSk7CisgIHZpcnR1YWwgdm9pZCByZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOworCisgIHZvaWQgZmluaXNoKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKKworICAvLyBYWFgKKyAgdmlydHVhbCBib29sIGdvb2QoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIHZpcnR1YWwgYm9vbCBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCB0aW1lZE91dCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIHJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpOworCisgIHN0ZDo6c3RyaW5nIGhvc3RfOworICBzdGQ6OnN0cmluZyBwYXRoXzsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Vm9pZENhbGxiYWNrLCBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKj4gQ29tcGxldGlvbjsKKyAgdHlwZWRlZiBzdGQ6OnF1ZXVlPENvbXBsZXRpb24+IENvbXBsZXRpb25RdWV1ZTsKKyAgQ29tcGxldGlvblF1ZXVlIGNvbXBsZXRpb25RdWV1ZV87CisgIHN0cnVjdCBldmh0dHBfY29ubmVjdGlvbiogY29ubl87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjMzI2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxldmh0dHAuaD4KKyNpbmNsdWRlIDxldmVudDIvYnVmZmVyLmg+CisjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlcl9jb21wYXQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2lmbmRlZiBIVFRQX0lOVEVSTkFMIC8vIGxpYmV2ZW50IDwgMgorI2RlZmluZSBIVFRQX0lOVEVSTkFMIDUwMAorI2VuZGlmCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitzdHJ1Y3QgVEV2aHR0cFNlcnZlcjo6UmVxdWVzdENvbnRleHQgeworICBzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcTsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGlidWY7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvYnVmOworCisgIFJlcXVlc3RDb250ZXh0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKK307CisKK1RFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgZWJfKE5VTEwpLCBlaF8oTlVMTCkgeworfQorCitURXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLCBlYl8oTlVMTCksIGVoXyhOVUxMKSB7CisgIC8vIENyZWF0ZSBldmVudF9iYXNlIGFuZCBldmh0dHAuCisgIGViXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgIGlmIChlYl8gPT0gTlVMTCkgeworICAgIHRocm93IFRFeGNlcHRpb24oImV2ZW50X2Jhc2VfbmV3IGZhaWxlZCIpOworICB9CisgIGVoXyA9IGV2aHR0cF9uZXcoZWJfKTsKKyAgaWYgKGVoXyA9PSBOVUxMKSB7CisgICAgZXZlbnRfYmFzZV9mcmVlKGViXyk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX25ldyBmYWlsZWQiKTsKKyAgfQorCisgIC8vIEJpbmQgdG8gcG9ydC4KKyAgaW50IHJldCA9IGV2aHR0cF9iaW5kX3NvY2tldChlaF8sIE5VTEwsIHBvcnQpOworICBpZiAocmV0IDwgMCkgeworICAgIGV2aHR0cF9mcmVlKGVoXyk7CisgICAgZXZlbnRfYmFzZV9mcmVlKGViXyk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX2JpbmRfc29ja2V0IGZhaWxlZCIpOworICB9CisKKyAgLy8gUmVnaXN0ZXIgYSBoYW5kbGVyLiAgSWYgeW91IHVzZSB0aGUgb3RoZXIgY29uc3RydWN0b3IsCisgIC8vIHlvdSB3aWxsIHdhbnQgdG8gZG8gdGhpcyB5b3Vyc2VsZi4KKyAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHVucmVnaXN0ZXIgYmVmb3JlIGRlc3RvcnlpbmcgdGhpcyBURXZodHRwU2VydmVyLgorICBldmh0dHBfc2V0X2NiKGVoXywgIi8iLCByZXF1ZXN0LCAodm9pZCopdGhpcyk7Cit9CisKK1RFdmh0dHBTZXJ2ZXI6On5URXZodHRwU2VydmVyKCkgeworICBpZiAoZWhfICE9IE5VTEwpIHsKKyAgICBldmh0dHBfZnJlZShlaF8pOworICB9CisgIGlmIChlYl8gIT0gTlVMTCkgeworICAgIGV2ZW50X2Jhc2VfZnJlZShlYl8pOworICB9Cit9CisKK2ludCBURXZodHRwU2VydmVyOjpzZXJ2ZSgpIHsKKyAgaWYgKGViXyA9PSBOVUxMKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBTZXJ2ZXI6OnNlcnZlIik7CisgIH0KKyAgcmV0dXJuIGV2ZW50X2Jhc2VfZGlzcGF0Y2goZWJfKTsKK30KKworVEV2aHR0cFNlcnZlcjo6UmVxdWVzdENvbnRleHQ6OlJlcXVlc3RDb250ZXh0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKQorICA6IHJlcShyZXEpLAorICAgIGlidWYobmV3IFRNZW1vcnlCdWZmZXIoRVZCVUZGRVJfREFUQShyZXEtPmlucHV0X2J1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRVZCVUZGRVJfTEVOR1RIKHJlcS0+aW5wdXRfYnVmZmVyKSkpKSwKKyAgICBvYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpIHsKK30KKwordm9pZCBURXZodHRwU2VydmVyOjpyZXF1ZXN0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBzZWxmKSB7CisgIHRyeSB7CisgICAgc3RhdGljX2Nhc3Q8VEV2aHR0cFNlcnZlcio+KHNlbGYpLT5wcm9jZXNzKHJlcSk7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgZXZodHRwX3NlbmRfcmVwbHkocmVxLCBIVFRQX0lOVEVSTkFMLCBlLndoYXQoKSwgMCk7CisgIH0KK30KKwordm9pZCBURXZodHRwU2VydmVyOjpwcm9jZXNzKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKSB7CisgIFJlcXVlc3RDb250ZXh0KiBjdHggPSBuZXcgUmVxdWVzdENvbnRleHQocmVxKTsKKyAgcmV0dXJuIHByb2Nlc3Nvcl8tPnByb2Nlc3Moc3RkOjpiaW5kKCZURXZodHRwU2VydmVyOjpjb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmlidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b2J1Zik7Cit9CisKK3ZvaWQgVEV2aHR0cFNlcnZlcjo6Y29tcGxldGUoUmVxdWVzdENvbnRleHQqIGN0eCwgYm9vbCBzdWNjZXNzKSB7CisgICh2b2lkKXN1Y2Nlc3M7CisgIHN0ZDo6dW5pcXVlX3B0cjxSZXF1ZXN0Q29udGV4dD4gcHRyKGN0eCk7CisKKyAgaW50IGNvZGUgPSBzdWNjZXNzID8gMjAwIDogNDAwOworICBjb25zdCBjaGFyKiByZWFzb24gPSBzdWNjZXNzID8gIk9LIiA6ICJCYWQgUmVxdWVzdCI7CisKKyAgaW50IHJ2ID0gZXZodHRwX2FkZF9oZWFkZXIoY3R4LT5yZXEtPm91dHB1dF9oZWFkZXJzLCAiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisgIGlmIChydiAhPSAwKSB7CisgICAgLy8gVE9ETzogTG9nIGFuIGVycm9yLgorICAgIHN0ZDo6Y2VyciA8PCAiZXZodHRwX2FkZF9oZWFkZXIgZmFpbGVkICIgPDwgX19GSUxFX18gPDwgIjoiIDw8IF9fTElORV9fIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIHN0cnVjdCBldmJ1ZmZlciogYnVmID0gZXZidWZmZXJfbmV3KCk7CisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIC8vIFRPRE86IExvZyBhbiBlcnJvci4KKyAgICBzdGQ6OmNlcnIgPDwgImV2YnVmZmVyX25ldyBmYWlsZWQgIiA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgX19MSU5FX18gPDwgc3RkOjplbmRsOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIG9idWY7CisgICAgdWludDMyX3Qgc3o7CisgICAgY3R4LT5vYnVmLT5nZXRCdWZmZXIoJm9idWYsICZzeik7CisgICAgaW50IHJldCA9IGV2YnVmZmVyX2FkZChidWYsIG9idWYsIHN6KTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIC8vIFRPRE86IExvZyBhbiBlcnJvci4KKyAgICAgIHN0ZDo6Y2VyciA8PCAiZXZodHRwX2FkZCBmYWlsZWQgd2l0aCAiIDw8IHJldCA8PCAiICIgPDwgX19GSUxFX18gPDwgIjoiIDw8IF9fTElORV9fCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIH0KKyAgfQorCisgIGV2aHR0cF9zZW5kX3JlcGx5KGN0eC0+cmVxLCBjb2RlLCByZWFzb24sIGJ1Zik7CisgIGlmIChidWYgIT0gTlVMTCkgeworICAgIGV2YnVmZmVyX2ZyZWUoYnVmKTsKKyAgfQorfQorCitzdHJ1Y3QgZXZlbnRfYmFzZSogVEV2aHR0cFNlcnZlcjo6Z2V0RXZlbnRCYXNlKCkgeworICByZXR1cm4gZWJfOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmYzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfVEVWSFRUUF9TRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorCitzdHJ1Y3QgZXZlbnRfYmFzZTsKK3N0cnVjdCBldmh0dHA7CitzdHJ1Y3QgZXZodHRwX3JlcXVlc3Q7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgeworCitjbGFzcyBUQXN5bmNCdWZmZXJQcm9jZXNzb3I7CisKK2NsYXNzIFRFdmh0dHBTZXJ2ZXIgeworcHVibGljOgorICAvKioKKyAgICogQ3JlYXRlIGEgVEV2aHR0cFNlcnZlciBmb3IgdXNlIHdpdGggYW4gZXh0ZXJuYWwgZXZodHRwIGluc3RhbmNlLgorICAgKiBNdXN0IGJlIG1hbnVhbGx5IGluc3RhbGxlZCB3aXRoIGV2aHR0cF9zZXRfY2IsIHVzaW5nCisgICAqIFRFdmh0dHBTZXJ2ZXI6OnJlcXVlc3QgYXMgdGhlIGNhbGxiYWNrIGFuZCB0aGUKKyAgICogYWRkcmVzcyBvZiB0aGUgc2VydmVyIGFzIHRoZSBleHRyYSBhcmcuCisgICAqIERvIG5vdCBjYWxsICJzZXJ2ZSIgb24gdGhpcyBzZXJ2ZXIuCisgICAqLworICBURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcik7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRFdmh0dHBTZXJ2ZXIgd2l0aCBhbiBlbWJlZGRlZCBldmVudF9iYXNlIGFuZCBldmh0dHAsCisgICAqIGxpc3RlbmluZyBvbiBwb3J0IGFuZCByZXNwb25kaW5nIG9uIHRoZSBlbmRwb2ludCAiLyIuCisgICAqIENhbGwgInNlcnZlIiBvbiB0aGlzIHNlcnZlciB0byBzZXJ2ZSBmb3JldmVyLgorICAgKi8KKyAgVEV2aHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IsIGludCBwb3J0KTsKKworICB+VEV2aHR0cFNlcnZlcigpOworCisgIHN0YXRpYyB2b2lkIHJlcXVlc3Qoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEsIHZvaWQqIHNlbGYpOworICBpbnQgc2VydmUoKTsKKworICBzdHJ1Y3QgZXZlbnRfYmFzZSogZ2V0RXZlbnRCYXNlKCk7CisKK3ByaXZhdGU6CisgIHN0cnVjdCBSZXF1ZXN0Q29udGV4dDsKKworICB2b2lkIHByb2Nlc3Moc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpOworICB2b2lkIGNvbXBsZXRlKFJlcXVlc3RDb250ZXh0KiBjdHgsIGJvb2wgc3VjY2Vzcyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RydWN0IGV2ZW50X2Jhc2UqIGViXzsKKyAgc3RydWN0IGV2aHR0cCogZWhfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9TRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDM4ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXyAxCisKKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworY2xhc3MgTm9TdWNoVGFza0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKKworY2xhc3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24ge307CisKK2NsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKKworY2xhc3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkge30KKyAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KK307CisKK2NsYXNzIFRpbWVkT3V0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVGltZWRPdXRFeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oIlRpbWVkT3V0RXhjZXB0aW9uIil7fTsKKyAgVGltZWRPdXRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQorfTsKKworY2xhc3MgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oIlRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24iKXt9OworICBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KK307CisKK2NsYXNzIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oKSB7fQorCisgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0VYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQxNzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0ggMQorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogQ29udmVuaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBSdW5uYWJsZSB0aGF0IHdpbGwgZXhlY3V0ZSBhcmJpdHJhcnkgY2FsbGJhY2tzLgorICogSW50ZXJmYWNlcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXB0IGJvdGggYSBnZW5lcmljICd2b2lkKHZvaWQpJyBjYWxsYmFjaywgYW5kCisgKiBhICd2b2lkKiAodm9pZCopJyBwdGhyZWFkX2NyZWF0ZS1zdHlsZSBjYWxsYmFjay4KKyAqCisgKiBFeGFtcGxlIHVzZToKKyAqICB2b2lkKiBteV90aHJlYWRfbWFpbih2b2lkKiBhcmcpOworICogIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gZmFjdG9yeSA9IC4uLjsKKyAqICAvLyBUbyBjcmVhdGUgYSB0aHJlYWQgdGhhdCBleGVjdXRlcyBteV90aHJlYWRfbWFpbiBvbmNlOgorICogIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSBmYWN0b3J5LT5uZXdUaHJlYWQoCisgKiAgICBGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKG15X3RocmVhZF9tYWluLCBzb21lX2FyZ3VtZW50KSk7CisgKiAgdGhyZWFkLT5zdGFydCgpOworICoKKyAqICBib29sIEE6OmZvbygpOworICogIEEqIGEgPSBuZXcgQSgpOworICogIC8vIFRvIGNyZWF0ZSBhIHRocmVhZCB0aGF0IGV4ZWN1dGVzIGEuZm9vKCkgZXZlcnkgMTAwIG1pbGxpc2Vjb25kczoKKyAqICBmYWN0b3J5LT5uZXdUaHJlYWQoRnVuY3Rpb25SdW5uZXI6OmNyZWF0ZSgKKyAqICAgIHN0ZDo6YmluZCgmQTo6Zm9vLCBhKSwgMTAwKSktPnN0YXJ0KCk7CisgKgorICovCisKK2NsYXNzIEZ1bmN0aW9uUnVubmVyIDogcHVibGljIFJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBjYWxsYmFjayAncHRocmVhZF9jcmVhdGUoKScgZXhwZWN0cy4KKyAgdHlwZWRlZiB2b2lkKiAoKlB0aHJlYWRGdW5jUHRyKSh2b2lkKiBhcmcpOworICAvLyBUaGlzIGEgZnVsbHktZ2VuZXJpYyB2b2lkKHZvaWQpIGNhbGxiYWNrIGZvciBjdXN0b20gYmluZGluZ3MuCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRGdW5jOworCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxib29sKCk+IEJvb2xGdW5jOworCisgIC8qKgorICAgKiBTeW50YWN0aWMgc3VnYXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY3JlYXRlIG5ldyBGdW5jdGlvblJ1bm5lcgorICAgKiBvYmplY3RzIHdyYXBwZWQgaW4gc2hhcmVkX3B0ci4KKyAgICovCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+IGNyZWF0ZShjb25zdCBWb2lkRnVuYyYgY29iKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGNvYikpOworICB9CisKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4gY3JlYXRlKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+KG5ldyBGdW5jdGlvblJ1bm5lcihmdW5jLCBhcmcpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCBwdGhyZWFkX2Z1bmNfd3JhcHBlcihQdGhyZWFkRnVuY1B0ciBmdW5jLCB2b2lkKiBhcmcpIHsKKyAgICAvLyBkaXNjYXJkIHJldHVybiB2YWx1ZQorICAgIGZ1bmMoYXJnKTsKKyAgfQorCitwdWJsaWM6CisgIC8qKgorICAgKiBHaXZlbiBhICdwdGhyZWFkX2NyZWF0ZScgc3R5bGUgY2FsbGJhY2ssIHRoaXMgRnVuY3Rpb25SdW5uZXIgd2lsbAorICAgKiBleGVjdXRlIHRoZSBnaXZlbiBjYWxsYmFjay4gIE5vdGUgdGhhdCB0aGUgJ3ZvaWQqJyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KKyAgICovCisgIEZ1bmN0aW9uUnVubmVyKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykKKyAgICA6IGZ1bmNfKHN0ZDo6YmluZChwdGhyZWFkX2Z1bmNfd3JhcHBlciwgZnVuYywgYXJnKSksIGludGVydmFsTXNfKC0xKSB7fQorCisgIC8qKgorICAgKiBHaXZlbiBhIGdlbmVyaWMgY2FsbGJhY2ssIHRoaXMgRnVuY3Rpb25SdW5uZXIgd2lsbCBleGVjdXRlIGl0LgorICAgKi8KKyAgRnVuY3Rpb25SdW5uZXIoY29uc3QgVm9pZEZ1bmMmIGNvYikgOiBmdW5jXyhjb2IpLCBpbnRlcnZhbE1zXygtMSkge30KKworICAvKioKKyAgICogR2l2ZW4gYSBib29sIGZvbyguLi4pIHR5cGUgY2FsbGJhY2ssIEZ1bmN0aW9uUnVubmVyIHdpbGwgZXhlY3V0ZQorICAgKiB0aGUgY2FsbGJhY2sgcmVwZWF0ZWRseSB3aXRoICdpbnRlcnZhbE1zJyBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgY2FsbHMsCisgICAqIHVudGlsIGl0IHJldHVybnMgZmFsc2UuIE5vdGUgdGhhdCB0aGUgYWN0dWFsIGludGVydmFsIGJldHdlZW4gY2FsbHMgd2lsbAorICAgKiBiZSBpbnRlcnZhbE1zIHBsdXMgZXhlY3V0aW9uIHRpbWUgb2YgdGhlIGNhbGxiYWNrLgorICAgKi8KKyAgRnVuY3Rpb25SdW5uZXIoY29uc3QgQm9vbEZ1bmMmIGNvYiwgaW50IGludGVydmFsTXMpIDogcmVwRnVuY18oY29iKSwgaW50ZXJ2YWxNc18oaW50ZXJ2YWxNcykge30KKworICB2b2lkIHJ1bigpIHsKKyAgICBpZiAocmVwRnVuY18pIHsKKyAgICAgIHdoaWxlIChyZXBGdW5jXygpKSB7CisgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKGludGVydmFsTXNfICogMTAwMCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZ1bmNfKCk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIFZvaWRGdW5jIGZ1bmNfOworICBCb29sRnVuYyByZXBGdW5jXzsKKyAgaW50IGludGVydmFsTXNfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0gKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcwY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgc3RkOjp1bmlxdWVfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIE1vbml0b3IgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIFBPU0lYIHB0aHJlYWQgbGlicmFyeQorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE1vbml0b3I6OkltcGwgeworCitwdWJsaWM6CisgIEltcGwoKSA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwgbXV0ZXhfKE5VTEwpLCBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7CisgICAgaW5pdChvd25lZE11dGV4Xy5nZXQoKSk7CisgIH0KKworICBJbXBsKE11dGV4KiBtdXRleCkgOiBtdXRleF8oTlVMTCksIGNvbmRJbml0aWFsaXplZF8oZmFsc2UpIHsgaW5pdChtdXRleCk7IH0KKworICBJbXBsKE1vbml0b3IqIG1vbml0b3IpIDogbXV0ZXhfKE5VTEwpLCBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7IGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7IH0KKworICB+SW1wbCgpIHsgY2xlYW51cCgpOyB9CisKKyAgTXV0ZXgmIG11dGV4KCkgeyByZXR1cm4gKm11dGV4XzsgfQorICB2b2lkIGxvY2soKSB7IG11dGV4KCkubG9jaygpOyB9CisgIHZvaWQgdW5sb2NrKCkgeyBtdXRleCgpLnVubG9jaygpOyB9CisKKyAgLyoqCisgICAqIEV4Y2VwdGlvbi10aHJvd2luZyB2ZXJzaW9uIG9mIHdhaXRGb3JUaW1lUmVsYXRpdmUoKSwgY2FsbGVkIHNpbXBseQorICAgKiB3YWl0KGludDY0KSBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiAgVGltZW91dCBpcyBpbiBtaWxsaXNlY29uZHMuCisgICAqCisgICAqIElmIHRoZSBjb25kaXRpb24gb2NjdXJzLCAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGNsZWFubHk7IG9uIHRpbWVvdXQgb3IKKyAgICogZXJyb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICovCisgIHZvaWQgd2FpdChpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gd2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKKyAgICBpZiAocmVzdWx0ID09IFRIUklGVF9FVElNRURPVVQpIHsKKyAgICAgIC8vIHB0aHJlYWRfY29uZF90aW1lZHdhaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdG8gcmV0dXJuIGVhcmx5IG9uCisgICAgICAvLyB2YXJpb3VzIHBsYXRmb3Jtcywgc28gY29tbWVudCBvdXQgdGhpcyBhc3NlcnQuCisgICAgICAvLyBhc3NlcnQoVXRpbDo6Y3VycmVudFRpbWUoKSA+PSAobm93ICsgdGltZW91dCkpOworICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJwdGhyZWFkX2NvbmRfd2FpdCgpIG9yIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoKSBmYWlsZWQiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGNvbmRpdGlvbiB0bworICAgKiBvY2N1ciwgb3Igd2FpdHMgZm9yZXZlciBpZiB0aW1lb3V0X21zID09IDAuCisgICAqCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKKyAgICBpZiAodGltZW91dF9tcyA9PSAwTEwpIHsKKyAgICAgIHJldHVybiB3YWl0Rm9yZXZlcigpOworICAgIH0KKworICAgIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgYWJzdGltZTsKKyAgICBVdGlsOjp0b1RpbWVzcGVjKGFic3RpbWUsIFV0aWw6OmN1cnJlbnRUaW1lKCkgKyB0aW1lb3V0X21zKTsKKyAgICByZXR1cm4gd2FpdEZvclRpbWUoJmFic3RpbWUpOworICB9CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3QgeworICAgIGFzc2VydChtdXRleF8pOworICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXhJbXBsID0gcmVpbnRlcnByZXRfY2FzdDxwdGhyZWFkX211dGV4X3QqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIGFzc2VydChtdXRleEltcGwpOworCisgICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKKyAgICByZXR1cm4gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmcHRocmVhZF9jb25kXywgbXV0ZXhJbXBsLCBhYnN0aW1lKTsKKyAgfQorCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCogYWJzdGltZSkgY29uc3QgeworICAgIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdGVtcDsKKyAgICB0ZW1wLnR2X3NlYyA9IGFic3RpbWUtPnR2X3NlYzsKKyAgICB0ZW1wLnR2X25zZWMgPSBhYnN0aW1lLT50dl91c2VjICogMTAwMDsKKyAgICByZXR1cm4gd2FpdEZvclRpbWUoJnRlbXApOworICB9CisgIC8qKgorICAgKiBXYWl0cyBmb3JldmVyIHVudGlsIHRoZSBjb25kaXRpb24gb2NjdXJzLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3Vycywgb3IgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAqLworICBpbnQgd2FpdEZvcmV2ZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KG11dGV4Xyk7CisgICAgcHRocmVhZF9tdXRleF90KiBtdXRleEltcGwgPSByZWludGVycHJldF9jYXN0PHB0aHJlYWRfbXV0ZXhfdCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7CisgICAgYXNzZXJ0KG11dGV4SW1wbCk7CisgICAgcmV0dXJuIHB0aHJlYWRfY29uZF93YWl0KCZwdGhyZWFkX2NvbmRfLCBtdXRleEltcGwpOworICB9CisKKyAgdm9pZCBub3RpZnkoKSB7CisgICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKKyAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9zaWduYWwoJnB0aHJlYWRfY29uZF8pOworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoaXJldCk7CisgICAgYXNzZXJ0KGlyZXQgPT0gMCk7CisgIH0KKworICB2b2lkIG5vdGlmeUFsbCgpIHsKKyAgICAvLyBYWFggTmVlZCB0byBhc3NlcnQgdGhhdCBjYWxsZXIgb3ducyBtdXRleAorICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmcHRocmVhZF9jb25kXyk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShpcmV0KTsKKyAgICBhc3NlcnQoaXJldCA9PSAwKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIGluaXQoTXV0ZXgqIG11dGV4KSB7CisgICAgbXV0ZXhfID0gbXV0ZXg7CisKKyAgICBpZiAocHRocmVhZF9jb25kX2luaXQoJnB0aHJlYWRfY29uZF8sIE5VTEwpID09IDApIHsKKyAgICAgIGNvbmRJbml0aWFsaXplZF8gPSB0cnVlOworICAgIH0KKworICAgIGlmICghY29uZEluaXRpYWxpemVkXykgeworICAgICAgY2xlYW51cCgpOworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICB2b2lkIGNsZWFudXAoKSB7CisgICAgaWYgKGNvbmRJbml0aWFsaXplZF8pIHsKKyAgICAgIGNvbmRJbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgICAgIGludCBpcmV0ID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koJnB0aHJlYWRfY29uZF8pOworICAgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShpcmV0KTsKKyAgICAgIGFzc2VydChpcmV0ID09IDApOworICAgIH0KKyAgfQorCisgIHVuaXF1ZV9wdHI8TXV0ZXg+IG93bmVkTXV0ZXhfOworICBNdXRleCogbXV0ZXhfOworCisgIG11dGFibGUgcHRocmVhZF9jb25kX3QgcHRocmVhZF9jb25kXzsKKyAgbXV0YWJsZSBib29sIGNvbmRJbml0aWFsaXplZF87Cit9OworCitNb25pdG9yOjpNb25pdG9yKCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbCgpKSB7Cit9CitNb25pdG9yOjpNb25pdG9yKE11dGV4KiBtdXRleCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtdXRleCkpIHsKK30KK01vbml0b3I6Ok1vbml0b3IoTW9uaXRvciogbW9uaXRvcikgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtb25pdG9yKSkgeworfQorCitNb25pdG9yOjp+TW9uaXRvcigpIHsKKyAgZGVsZXRlIGltcGxfOworfQorCitNdXRleCYgTW9uaXRvcjo6bXV0ZXgoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+bXV0ZXgoKTsKK30KKwordm9pZCBNb25pdG9yOjpsb2NrKCkgY29uc3QgeworICBpbXBsXy0+bG9jaygpOworfQorCit2b2lkIE1vbml0b3I6OnVubG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPnVubG9jaygpOworfQorCit2b2lkIE1vbml0b3I6OndhaXQoaW50NjRfdCB0aW1lb3V0KSBjb25zdCB7CisgIGltcGxfLT53YWl0KHRpbWVvdXQpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+d2FpdEZvclRpbWUoYWJzdGltZSk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCB0aW1ldmFsKiBhYnN0aW1lKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+d2FpdEZvclRpbWUoYWJzdGltZSk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgY29uc3QgeworICByZXR1cm4gaW1wbF8tPndhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yZXZlcigpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT53YWl0Rm9yZXZlcigpOworfQorCit2b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsKKyAgaW1wbF8tPm5vdGlmeSgpOworfQorCit2b2lkIE1vbml0b3I6Om5vdGlmeUFsbCgpIGNvbnN0IHsKKyAgaW1wbF8tPm5vdGlmeUFsbCgpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTlhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXyAxCisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisKKyNpbmNsdWRlIDxib29zdC91dGlsaXR5LmhwcD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogQSBtb25pdG9yIGlzIGEgY29tYmluYXRpb24gbXV0ZXggYW5kIGNvbmRpdGlvbi1ldmVudC4gIFdhaXRpbmcgYW5kCisgKiBub3RpZnlpbmcgY29uZGl0aW9uIGV2ZW50cyByZXF1aXJlcyB0aGF0IHRoZSBjYWxsZXIgb3duIHRoZSBtdXRleC4gIE11dGV4CisgKiBsb2NrIGFuZCB1bmxvY2sgb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIGluZGVwZW5kZW50bHkgb2YgY29uZGl0aW9uCisgKiBldmVudHMuICBUaGlzIGlzIG1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLk9iamVjdCBtdWx0aS10aHJlYWQKKyAqIG9wZXJhdGlvbnMuCisgKgorICogTm90ZSB0aGUgTW9uaXRvciBjYW4gY3JlYXRlIGEgbmV3LCBpbnRlcm5hbCBtdXRleDsgYWx0ZXJuYXRpdmVseSwgYQorICogc2VwYXJhdGUgTXV0ZXggY2FuIGJlIHBhc3NlZCBpbiBhbmQgdGhlIE1vbml0b3Igd2lsbCByZS11c2UgaXQgd2l0aG91dAorICogdGFraW5nIG93bmVyc2hpcC4gIEl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGUKKyAqIE11dGV4IGlzIG5vdCBkZWFsbG9jYXRlZCBiZWZvcmUgdGhlIE1vbml0b3IuCisgKgorICogTm90ZSB0aGF0IGFsbCBtZXRob2RzIGFyZSBjb25zdC4gIE1vbml0b3JzIGltcGxlbWVudCBsb2dpY2FsIGNvbnN0bmVzcywgbm90CisgKiBiaXQgY29uc3RuZXNzLiAgVGhpcyBhbGxvd3MgY29uc3QgbWV0aG9kcyB0byBjYWxsIG1vbml0b3IgbWV0aG9kcyB3aXRob3V0CisgKiBuZWVkaW5nIHRvIGNhc3QgYXdheSBjb25zdG5lc3Mgb3IgY2hhbmdlIHRvIG5vbi1jb25zdCBzaWduYXR1cmVzLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE1vbml0b3IgOiBib29zdDo6bm9uY29weWFibGUgeworcHVibGljOgorICAvKiogQ3JlYXRlcyBhIG5ldyBtdXRleCwgYW5kIHRha2VzIG93bmVyc2hpcCBvZiBpdC4gKi8KKyAgTW9uaXRvcigpOworCisgIC8qKiBVc2VzIHRoZSBwcm92aWRlZCBtdXRleCB3aXRob3V0IHRha2luZyBvd25lcnNoaXAuICovCisgIGV4cGxpY2l0IE1vbml0b3IoTXV0ZXgqIG11dGV4KTsKKworICAvKiogVXNlcyB0aGUgbXV0ZXggaW5zaWRlIHRoZSBwcm92aWRlZCBNb25pdG9yIHdpdGhvdXQgdGFraW5nIG93bmVyc2hpcC4gKi8KKyAgZXhwbGljaXQgTW9uaXRvcihNb25pdG9yKiBtb25pdG9yKTsKKworICAvKiogRGVhbGxvY2F0ZXMgdGhlIG11dGV4IG9ubHkgaWYgd2Ugb3duIGl0LiAqLworICB2aXJ0dWFsIH5Nb25pdG9yKCk7CisKKyAgTXV0ZXgmIG11dGV4KCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgdW5sb2NrKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIFdhaXRzIGEgbWF4aW11bSBvZiB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgY29uZGl0aW9uCisgICAqIHRvIG9jY3VyLCBvciB3YWl0cyBmb3JldmVyIGlmIHRpbWVvdXRfbXMgPT0gMC4KKyAgICoKKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgY29uc3Q7CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgdGltZXZhbC4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCogYWJzdGltZSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICovCisgIGludCB3YWl0Rm9yZXZlcigpIGNvbnN0OworCisgIC8qKgorICAgKiBFeGNlcHRpb24tdGhyb3dpbmcgdmVyc2lvbiBvZiB3YWl0Rm9yVGltZVJlbGF0aXZlKCksIGNhbGxlZCBzaW1wbHkKKyAgICogd2FpdChpbnQ2NCkgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gIFRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLgorICAgKgorICAgKiBJZiB0aGUgY29uZGl0aW9uIG9jY3VycywgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjbGVhbmx5OyBvbiB0aW1lb3V0IG9yCisgICAqIGVycm9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqLworICB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0X21zID0gMExMKSBjb25zdDsKKworICAvKiogV2FrZXMgdXAgb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgbW9uaXRvci4gKi8KKyAgdmlydHVhbCB2b2lkIG5vdGlmeSgpIGNvbnN0OworCisgIC8qKiBXYWtlcyB1cCBhbGwgd2FpdGluZyB0aHJlYWRzIG9uIHRoaXMgbW9uaXRvci4gKi8KKyAgdmlydHVhbCB2b2lkIG5vdGlmeUFsbCgpIGNvbnN0OworCitwcml2YXRlOgorICBjbGFzcyBJbXBsOworCisgIEltcGwqIGltcGxfOworfTsKKworY2xhc3MgU3luY2hyb25pemVkIHsKK3B1YmxpYzoKKyAgU3luY2hyb25pemVkKGNvbnN0IE1vbml0b3IqIG1vbml0b3IpIDogZyhtb25pdG9yLT5tdXRleCgpKSB7fQorICBTeW5jaHJvbml6ZWQoY29uc3QgTW9uaXRvciYgbW9uaXRvcikgOiBnKG1vbml0b3IubXV0ZXgoKSkge30KKworcHJpdmF0ZToKKyAgR3VhcmQgZzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjY0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG5lZWRlZCB0byB0ZXN0IGZvciBwdGhyZWFkIGltcGxlbWVudGF0aW9uIGNhcGFiaWxpdGllczoKKyNkZWZpbmUgX19VU0VfR05VCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8vIEVuYWJsZSB0aGlzIHRvIHR1cm4gb24gbXV0ZXggY29udGVudGlvbiBwcm9maWxpbmcgc3VwcG9ydAorLy8gI2RlZmluZSBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORworCisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKworc3RhdGljIGludDMyX3QgbXV0ZXhQcm9maWxpbmdDb3VudGVyID0gMDsKK3N0YXRpYyBpbnQzMl90IG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IDA7CitzdGF0aWMgTXV0ZXhXYWl0Q2FsbGJhY2sgbXV0ZXhQcm9maWxpbmdDYWxsYmFjayA9IDA7CisKK3ZvaWQgZW5hYmxlTXV0ZXhQcm9maWxpbmcoaW50MzJfdCBwcm9maWxpbmdTYW1wbGVSYXRlLCBNdXRleFdhaXRDYWxsYmFjayBjYWxsYmFjaykgeworICBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSBwcm9maWxpbmdTYW1wbGVSYXRlOworICBtdXRleFByb2ZpbGluZ0NhbGxiYWNrID0gY2FsbGJhY2s7Cit9CisKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCkgaW50NjRfdCBfbG9ja19zdGFydFRpbWUgPSBtYXliZUdldFByb2ZpbGluZ1N0YXJ0VGltZSgpOworCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9sb2NrX3N0YXJ0VGltZSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIGVuZFRpbWUgLSBfbG9ja19zdGFydFRpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9MT0NLRUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcm9maWxlVGltZV8gPSBfbG9ja19zdGFydFRpbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocHJvZmlsZVRpbWVfID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHByb2ZpbGVUaW1lXyA9IFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpIC0gcHJvZmlsZVRpbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQ2NF90IF90ZW1wX3Byb2ZpbGVUaW1lID0gcHJvZmlsZVRpbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwcm9maWxlVGltZV8gPSAwOworCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF90ZW1wX3Byb2ZpbGVUaW1lID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIF90ZW1wX3Byb2ZpbGVUaW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBtYXliZUdldFByb2ZpbGluZ1N0YXJ0VGltZSgpIHsKKyAgaWYgKG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSAmJiBtdXRleFByb2ZpbGluZ0NhbGxiYWNrKSB7CisgICAgLy8gVGhpcyBibG9jayBpcyB1bnN5bmNocm9uaXplZCwgYnV0IHNob3VsZCBwcm9kdWNlIGEgcmVhc29uYWJsZSBzYW1wbGluZworICAgIC8vIHJhdGUgb24gbW9zdCBhcmNoaXRlY3R1cmVzLiAgVGhlIG1haW4gcmFjZSBjb25kaXRpb25zIGFyZSB0aGUgZ2FwCisgICAgLy8gYmV0d2VlbiB0aGUgZGVjcmVtZW50IGFuZCB0aGUgdGVzdCwgdGhlIG5vbi1hdG9taWNpdHkgb2YgZGVjcmVtZW50LCBhbmQKKyAgICAvLyBwb3RlbnRpYWwgY2FjaGluZyBvZiBkaWZmZXJlbnQgdmFsdWVzIGF0IGRpZmZlcmVudCBDUFVzLgorICAgIC8vCisgICAgLy8gLSBpZiB0d28gZGVjcmVtZW50cyByYWNlLCB0aGUgbGlrZWxpZXN0IHJlc3VsdCBpcyB0aGF0IHRoZSBjb3VudGVyCisgICAgLy8gICAgICBkZWNyZW1lbnRzIHNsb3dseSAocGVyaGFwcyBtdWNoIG1vcmUgc2xvd2x5KSB0aGFuIGludGVuZGVkLgorICAgIC8vCisgICAgLy8gLSBtYW55IHRocmVhZHMgY291bGQgcG90ZW50aWFsbHkgZGVjcmVtZW50IGJlZm9yZSByZXNldHRpbmcgdGhlIGNvdW50ZXIKKyAgICAvLyAgICAgIHRvIGl0cyBsYXJnZSB2YWx1ZSwgY2F1c2luZyBlYWNoIGFkZGl0aW9uYWwgaW5jb21pbmcgdGhyZWFkIHRvCisgICAgLy8gICAgICBwcm9maWxlIGV2ZXJ5IGNhbGwuICBUaGlzIHNpdHVhdGlvbiBpcyB1bmxpa2VseSB0byBwZXJzaXN0IGZvciBsb25nCisgICAgLy8gICAgICBhcyB0aGUgY3JpdGljYWwgZ2FwIGlzIHF1aXRlIHNob3J0LCBidXQgcHJvZmlsaW5nIGNvdWxkIGJlIGJ1cnN0eS4KKyAgICBzaWdfYXRvbWljX3QgbG9jYWxWYWx1ZSA9IC0tbXV0ZXhQcm9maWxpbmdDb3VudGVyOworICAgIGlmIChsb2NhbFZhbHVlIDw9IDApIHsKKyAgICAgIG11dGV4UHJvZmlsaW5nQ291bnRlciA9IG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZTsKKyAgICAgIHJldHVybiBVdGlsOjpjdXJyZW50VGltZVVzZWMoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCkKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCkKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9MT0NLRUQoKQorI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKQorI2VuZGlmIC8vIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisKKyNkZWZpbmUgRUlOVFJfTE9PUChfQ0FMTCkgICAgICAgICAgaW50IHJldDsgZG8geyByZXQgPSBfQ0FMTDsgfSB3aGlsZSAocmV0ID09IEVJTlRSKQorI2RlZmluZSBBQk9SVF9PTkZBSUwoX0NBTEwpICAgICAgeyBFSU5UUl9MT09QKF9DQUxMKTsgaWYgKHJldCkgeyBhYm9ydCgpOyB9IH0KKyNkZWZpbmUgVEhST1dfU1JFKF9DQUxMU1RSLCBSRVQpIHsgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oYm9vc3Q6OnN0cihib29zdDo6Zm9ybWF0KCIlMSUgcmV0dXJuZWQgJTIlICglMyUpIikgJSBfQ0FMTFNUUiAlIFJFVCAlIDo6c3RyZXJyb3IoUkVUKSkpOyB9CisjZGVmaW5lIFRIUk9XX1NSRV9PTkZBSUwoX0NBTEwpICB7IEVJTlRSX0xPT1AoX0NBTEwpOyBpZiAocmV0KSB7IFRIUk9XX1NSRSgjX0NBTEwsIHJldCk7IH0gfQorI2RlZmluZSBUSFJPV19TUkVfVFJZRkFJTChfQ0FMTCkgeyBFSU5UUl9MT09QKF9DQUxMKTsgaWYgKHJldCA9PSAwKSB7IHJldHVybiB0cnVlOyB9IGVsc2UgaWYgKHJldCA9PSBFQlVTWSkgeyByZXR1cm4gZmFsc2U7IH0gVEhST1dfU1JFKCNfQ0FMTCwgcmV0KTsgfQorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIFBPU0lYIG11dGV4CisgKgorICogVGhyb3dzIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3lzdGVtUmVzb3VyY2VFeGNlcHRpb24gb24gZXJyb3IuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgTXV0ZXg6OmltcGwgeworcHVibGljOgorICBpbXBsKEluaXRpYWxpemVyIGluaXQpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7CisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKyAgICBwcm9maWxlVGltZV8gPSAwOworI2VuZGlmCisgICAgaW5pdCgmcHRocmVhZF9tdXRleF8pOworICAgIGluaXRpYWxpemVkXyA9IHRydWU7CisgIH0KKworICB+aW1wbCgpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZWRfKSB7CisgICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKKyAgICAgIEFCT1JUX09ORkFJTChwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnB0aHJlYWRfbXV0ZXhfKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb2NrKCkgY29uc3QgeworICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF9sb2NrKCZwdGhyZWFkX211dGV4XykpOworICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7CisgIH0KKworICBib29sIHRyeWxvY2soKSBjb25zdCB7CisgICAgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9tdXRleF90cnlsb2NrKCZwdGhyZWFkX211dGV4XykpOworICB9CisKKyAgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0IHsKKyNpZiBkZWZpbmVkKF9QT1NJWF9USU1FT1VUUykgJiYgX1BPU0lYX1RJTUVPVVRTID49IDIwMDExMkwKKyAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKKworICAgIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdHM7CisgICAgVXRpbDo6dG9UaW1lc3BlYyh0cywgbWlsbGlzZWNvbmRzICsgVXRpbDo6Y3VycmVudFRpbWUoKSk7CisgICAgRUlOVFJfTE9PUChwdGhyZWFkX211dGV4X3RpbWVkbG9jaygmcHRocmVhZF9tdXRleF8sICZ0cykpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmV0ID09IEVUSU1FRE9VVCkgeworICAgICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVEhST1dfU1JFKCJwdGhyZWFkX211dGV4X3RpbWVkbG9jaygmcHRocmVhZF9tdXRleF8sICZ0cykiLCByZXQpOworI2Vsc2UKKyAgICAvKiBPdGhlcndpc2UgZm9sbG93IHNvbHV0aW9uIHVzZWQgYnkgTW9ubyBmb3IgQW5kcm9pZCAqLworICAgIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgc2xlZXB5dGltZSwgbm93LCB0bzsKKworICAgIC8qIFRoaXMgaXMganVzdCB0byBhdm9pZCBhIGNvbXBsZXRlbHkgYnVzeSB3YWl0ICovCisgICAgc2xlZXB5dGltZS50dl9zZWMgPSAwOworICAgIHNsZWVweXRpbWUudHZfbnNlYyA9IDEwMDAwMDAwTDsgLyogMTBtcyAqLworCisgICAgVXRpbDo6dG9UaW1lc3BlYyh0bywgbWlsbGlzZWNvbmRzICsgVXRpbDo6Y3VycmVudFRpbWUoKSk7CisKKyAgICB3aGlsZSAoKHRyeWxvY2soKSkgPT0gZmFsc2UpIHsKKyAgICAgIFV0aWw6OnRvVGltZXNwZWMobm93LCBVdGlsOjpjdXJyZW50VGltZSgpKTsKKyAgICAgIGlmIChub3cudHZfc2VjID49IHRvLnR2X3NlYyAmJiBub3cudHZfbnNlYyA+PSB0by50dl9uc2VjKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIG5hbm9zbGVlcCgmc2xlZXB5dGltZSwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKKyAgfQorCisgIHZvaWQgdW5sb2NrKCkgY29uc3QgeworICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X3VubG9jaygmcHRocmVhZF9tdXRleF8pKTsKKyAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7CisgIH0KKworICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsgcmV0dXJuICh2b2lkKikmcHRocmVhZF9tdXRleF87IH0KKworcHJpdmF0ZToKKyAgbXV0YWJsZSBwdGhyZWFkX211dGV4X3QgcHRocmVhZF9tdXRleF87CisgIG11dGFibGUgYm9vbCBpbml0aWFsaXplZF87CisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKyAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKKyNlbmRpZgorfTsKKworTXV0ZXg6Ok11dGV4KEluaXRpYWxpemVyIGluaXQpIDogaW1wbF8obmV3IE11dGV4OjppbXBsKGluaXQpKSB7Cit9CisKK3ZvaWQqIE11dGV4OjpnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5nZXRVbmRlcmx5aW5nSW1wbCgpOworfQorCit2b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeworICBpbXBsXy0+bG9jaygpOworfQorCitib29sIE11dGV4Ojp0cnlsb2NrKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPnRyeWxvY2soKTsKK30KKworYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50aW1lZGxvY2sobXMpOworfQorCit2b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7CisgIGltcGxfLT51bmxvY2soKTsKK30KKwordm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgcHRocmVhZF9tdXRleF90KiBwdGhyZWFkX211dGV4ID0gKHB0aHJlYWRfbXV0ZXhfdCopYXJnOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4LCBOVUxMKSk7Cit9CisKKyNpZiBkZWZpbmVkKFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlApIHx8IGRlZmluZWQoUFRIUkVBRF9FUlJPUkNIRUNLX01VVEVYX0lOSVRJQUxJWkVSX05QKSB8fCBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQorc3RhdGljIHZvaWQgaW5pdF93aXRoX2tpbmQocHRocmVhZF9tdXRleF90KiBtdXRleCwgaW50IGtpbmQpIHsKKyAgcHRocmVhZF9tdXRleGF0dHJfdCBtdXRleGF0dHI7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbXV0ZXhhdHRyKSk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhhdHRyLCBraW5kKSk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhhdHRyKSk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSgmbXV0ZXhhdHRyKSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKK3ZvaWQgTXV0ZXg6OkFEQVBUSVZFX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICAvLyBGcm9tIG15c3FsIHNvdXJjZTogbXlzeXMvbXlfdGhyX2luaXQuYworICAvLyBTZXQgbXV0ZXggdHlwZSB0byAiZmFzdCIgYS5rLmEgImFkYXB0aXZlIgorICAvLworICAvLyBJbiB0aGlzIGNhc2UgdGhlIHRocmVhZCBtYXkgc3RlYWwgdGhlIG11dGV4IGZyb20gc29tZSBvdGhlciB0aHJlYWQKKyAgLy8gdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgc2FtZSBtdXRleC4gVGhpcyB3aWxsIHNhdmUgdXMgc29tZQorICAvLyBjb250ZXh0IHN3aXRjaGVzIGJ1dCBtYXkgY2F1c2UgYSB0aHJlYWQgdG8gJ3N0YXJ2ZSBmb3JldmVyJyB3aGlsZQorICAvLyB3YWl0aW5nIGZvciB0aGUgbXV0ZXggKG5vdCBsaWtlbHkgaWYgdGhlIGNvZGUgd2l0aGluIHRoZSBtdXRleCBpcworICAvLyBzaG9ydCkuCisgIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFBUSFJFQURfRVJST1JDSEVDS19NVVRFWF9JTklUSUFMSVpFUl9OUAordm9pZCBNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgaW5pdF93aXRoX2tpbmQoKHB0aHJlYWRfbXV0ZXhfdCopYXJnLCBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0spOworfQorI2VuZGlmCisKKyNpZmRlZiBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAordm9pZCBNdXRleDo6UkVDVVJTSVZFX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsKK30KKyNlbmRpZgorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIFJlYWRXcml0ZU11dGV4IGNsYXNzIHVzaW5nIFBPU0lYIHJ3IGxvY2sKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBSZWFkV3JpdGVNdXRleDo6aW1wbCB7CitwdWJsaWM6CisgIGltcGwoKSA6IGluaXRpYWxpemVkXyhmYWxzZSkgeworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisgICAgcHJvZmlsZVRpbWVfID0gMDsKKyNlbmRpZgorICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfaW5pdCgmcndfbG9ja18sIE5VTEwpKTsKKyAgICBpbml0aWFsaXplZF8gPSB0cnVlOworICB9CisKKyAgfmltcGwoKSB7CisgICAgaWYgKGluaXRpYWxpemVkXykgeworICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisgICAgICBBQk9SVF9PTkZBSUwocHRocmVhZF9yd2xvY2tfZGVzdHJveSgmcndfbG9ja18pKTsKKyAgICB9CisgIH0KKworICB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3QgeworICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfcmRsb2NrKCZyd19sb2NrXykpOworICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOyAvLyBub3QgZXhjbHVzaXZlLCBzbyB1c2Ugbm90LWxvY2tlZCBwYXRoCisgIH0KKworICB2b2lkIGFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKKyAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX3dybG9jaygmcndfbG9ja18pKTsKKyAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOworICB9CisKKyAgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0IHsgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKCZyd19sb2NrXykpOyB9CisKKyAgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdCB7IFRIUk9XX1NSRV9UUllGQUlMKHB0aHJlYWRfcndsb2NrX3RyeXdybG9jaygmcndfbG9ja18pKTsgfQorCisgIHZvaWQgcmVsZWFzZSgpIGNvbnN0IHsKKyAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfdW5sb2NrKCZyd19sb2NrXykpOworICAgIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKTsKKyAgfQorCitwcml2YXRlOgorICBtdXRhYmxlIHB0aHJlYWRfcndsb2NrX3QgcndfbG9ja187CisgIG11dGFibGUgYm9vbCBpbml0aWFsaXplZF87CisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKyAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKKyNlbmRpZgorfTsKKworUmVhZFdyaXRlTXV0ZXg6OlJlYWRXcml0ZU11dGV4KCkgOiBpbXBsXyhuZXcgUmVhZFdyaXRlTXV0ZXg6OmltcGwoKSkgeworfQorCit2b2lkIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpIGNvbnN0IHsKKyAgaW1wbF8tPmFjcXVpcmVSZWFkKCk7Cit9CisKK3ZvaWQgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKKyAgaW1wbF8tPmFjcXVpcmVXcml0ZSgpOworfQorCitib29sIFJlYWRXcml0ZU11dGV4OjphdHRlbXB0UmVhZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5hdHRlbXB0UmVhZCgpOworfQorCitib29sIFJlYWRXcml0ZU11dGV4OjphdHRlbXB0V3JpdGUoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+YXR0ZW1wdFdyaXRlKCk7Cit9CisKK3ZvaWQgUmVhZFdyaXRlTXV0ZXg6OnJlbGVhc2UoKSBjb25zdCB7CisgIGltcGxfLT5yZWxlYXNlKCk7Cit9CisKK05vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6Ok5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSA6IHdyaXRlcldhaXRpbmdfKGZhbHNlKSB7Cit9CisKK3ZvaWQgTm9TdGFydmVSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKSBjb25zdCB7CisgIGlmICh3cml0ZXJXYWl0aW5nXykgeworICAgIC8vIHdyaXRlciBpcyB3YWl0aW5nLCBibG9jayBvbiB0aGUgd3JpdGVyJ3MgbXV0ZXggdW50aWwgaGUncyBkb25lIHdpdGggaXQKKyAgICBtdXRleF8ubG9jaygpOworICAgIG11dGV4Xy51bmxvY2soKTsKKyAgfQorCisgIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpOworfQorCit2b2lkIE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKKyAgLy8gaWYgd2UgY2FuIGFjcXVpcmUgdGhlIHJ3bG9jayB0aGUgZWFzeSB3YXksIHdlJ3JlIGRvbmUKKyAgaWYgKGF0dGVtcHRXcml0ZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZmFpbGVkIHRvIGdldCB0aGUgcndsb2NrLCBkbyBpdCB0aGUgaGFyZCB3YXk6CisgIC8vIGxvY2tpbmcgdGhlIG11dGV4IGFuZCBzZXR0aW5nIHdyaXRlcldhaXRpbmcgd2lsbCBjYXVzZSBhbGwgbmV3IHJlYWRlcnMgdG8KKyAgLy8gYmxvY2sgb24gdGhlIG11dGV4IHJhdGhlciB0aGFuIG9uIHRoZSByd2xvY2suCisgIG11dGV4Xy5sb2NrKCk7CisgIHdyaXRlcldhaXRpbmdfID0gdHJ1ZTsKKyAgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVXcml0ZSgpOworICB3cml0ZXJXYWl0aW5nXyA9IGZhbHNlOworICBtdXRleF8udW5sb2NrKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY1Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKyNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisKKy8qKgorICogRGV0ZXJtaW5lcyBpZiB0aGUgVGhyaWZ0IE11dGV4IGFuZCBSZWFkV3JpdGVNdXRleCBjbGFzc2VzIHdpbGwgYXR0ZW1wdCB0bworICogcHJvZmlsZSB0aGVpciBibG9ja2luZyBhY3F1aXJlIG1ldGhvZHMuIElmIHRoaXMgdmFsdWUgaXMgc2V0IHRvIG5vbi16ZXJvLAorICogVGhyaWZ0IHdpbGwgYXR0ZW1wdCB0byBpbnZva2UgdGhlIGNhbGxiYWNrIG9uY2UgZXZlcnkgcHJvZmlsaW5nU2FtcGxlUmF0ZQorICogdGltZXMuICBIb3dldmVyLCBhcyB0aGUgc2FtcGxpbmcgaXMgbm90IHN5bmNocm9uaXplZCB0aGUgcmF0ZSBpcyBub3QKKyAqIGd1cmFuYXRlZWQsIGFuZCBjb3VsZCBiZSBzdWJqZWN0IHRvIGJpZyBidXJzdHMgYW5kIHN3aW5ncy4gIFBsZWFzZSBlbnN1cmUKKyAqIHlvdXIgc2FtcGxpbmcgY2FsbGJhY2sgaXMgYXMgcGVyZm9ybWFudCBhcyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzLgorICoKKyAqIFRoZSBjYWxsYmFjayB3aWxsIGdldCBjYWxsZWQgd2l0aCB0aGUgd2FpdCB0aW1lIHRha2VuIHRvIGxvY2sgdGhlIG11dGV4IGluCisgKiB1c2VjIGFuZCBhICh2b2lkKikgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBNdXRleCAob3IgUmVhZFdyaXRlTXV0ZXgpCisgKiBiZWluZyBsb2NrZWQuCisgKgorICogVGhlIGVuYWJsZU11dGV4UHJvZmlsaW5nKCkgZnVuY3Rpb24gaXMgdW5zeW5jaHJvbml6ZWQ7IGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogd2hpbGUgcHJvZmlsaW5nIGlzIGFscmVhZHkgZW5hYmxlZCBtYXkgcmVzdWx0IGluIHJhY2UgY29uZGl0aW9ucy4gIE9uCisgKiBhcmNoaXRlY3R1cmVzIHdoZXJlIGEgcG9pbnRlciBhc3NpZ25tZW50IGlzIGF0b21pYywgdGhpcyBpcyBzYWZlIGJ1dCB0aGVyZQorICogaXMgbm8gZ3VhcmFudGVlIHRocmVhZHMgd2lsbCBhZ3JlZSBvbiBhIHNpbmdsZSBjYWxsYmFjayB3aXRoaW4gYW55CisgKiBwYXJ0aWN1bGFyIHRpbWUgcGVyaW9kLgorICovCit0eXBlZGVmIHZvaWQgKCpNdXRleFdhaXRDYWxsYmFjaykoY29uc3Qgdm9pZCogaWQsIGludDY0X3Qgd2FpdFRpbWVNaWNyb3MpOwordm9pZCBlbmFibGVNdXRleFByb2ZpbGluZyhpbnQzMl90IHByb2ZpbGluZ1NhbXBsZVJhdGUsIE11dGV4V2FpdENhbGxiYWNrIGNhbGxiYWNrKTsKKworI2VuZGlmCisKKy8qKgorICogTk9URTogQWxsIG11dGV4IGltcGxlbWVudGF0aW9ucyB0aHJvdyBhbiBleGNlcHRpb24gb24gZmFpbHVyZS4gIFNlZSBlYWNoCisgKiAgICAgICBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBleGNlcHRpb24gdHlwZShzKSB1c2VkLgorICovCisKKy8qKgorICogQSBzaW1wbGUgbXV0ZXggY2xhc3MKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBNdXRleCB7CitwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoKkluaXRpYWxpemVyKSh2b2lkKik7CisKKyAgTXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCA9IERFRkFVTFRfSU5JVElBTElaRVIpOworICB2aXJ0dWFsIH5NdXRleCgpIHt9CisKKyAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKKyAgdmlydHVhbCBib29sIHRyeWxvY2soKSBjb25zdDsKKyAgdmlydHVhbCBib29sIHRpbWVkbG9jayhpbnQ2NF90IG1pbGxpc2Vjb25kcykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB1bmxvY2soKSBjb25zdDsKKworICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0OworCisgIC8vIElmIHlvdSBhdHRlbXB0IHRvIHVzZSBvbmUgb2YgdGhlc2UgYW5kIGl0IGZhaWxzIHRvIGxpbmssIGl0IG1lYW5zCisgIC8vIHlvdXIgdmVyc2lvbiBvZiBwdGhyZWFkcyBkb2VzIG5vdCBzdXBwb3J0IGl0IC0gdHJ5IGFub3RoZXIgb25lLgorICBzdGF0aWMgdm9pZCBBREFQVElWRV9JTklUSUFMSVpFUih2b2lkKik7CisgIHN0YXRpYyB2b2lkIERFRkFVTFRfSU5JVElBTElaRVIodm9pZCopOworICBzdGF0aWMgdm9pZCBFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgc3RhdGljIHZvaWQgUkVDVVJTSVZFX0lOSVRJQUxJWkVSKHZvaWQqKTsKKworcHJpdmF0ZToKKyAgY2xhc3MgaW1wbDsKKyAgc3RkOjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOworfTsKKworY2xhc3MgUmVhZFdyaXRlTXV0ZXggeworcHVibGljOgorICBSZWFkV3JpdGVNdXRleCgpOworICB2aXJ0dWFsIH5SZWFkV3JpdGVNdXRleCgpIHt9CisKKyAgLy8gdGhlc2UgZ2V0IHRoZSBsb2NrIGFuZCBibG9jayB1bnRpbCBpdCBpcyBkb25lIHN1Y2Nlc3NmdWxseQorICB2aXJ0dWFsIHZvaWQgYWNxdWlyZVJlYWQoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIGFjcXVpcmVXcml0ZSgpIGNvbnN0OworCisgIC8vIHRoZXNlIGF0dGVtcHQgdG8gZ2V0IHRoZSBsb2NrLCByZXR1cm5pbmcgZmFsc2UgaW1tZWRpYXRlbHkgaWYgdGhleSBmYWlsCisgIHZpcnR1YWwgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgYXR0ZW1wdFdyaXRlKCkgY29uc3Q7CisKKyAgLy8gdGhpcyByZWxlYXNlcyBib3RoIHJlYWQgYW5kIHdyaXRlIGxvY2tzCisgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGNsYXNzIGltcGw7CisgIHN0ZDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKK307CisKKy8qKgorICogQSBSZWFkV3JpdGVNdXRleCB0aGF0IGd1YXJhbnRlZXMgd3JpdGVycyB3aWxsIG5vdCBiZSBzdGFydmVkIGJ5IHJlYWRlcnM6CisgKiBXaGVuIGEgd3JpdGVyIGF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIG11dGV4LCBhbGwgbmV3IHJlYWRlcnMgd2lsbCBiZQorICogYmxvY2tlZCBmcm9tIGFjcXVpcmluZyB0aGUgbXV0ZXggdW50aWwgdGhlIHdyaXRlciBoYXMgYWNxdWlyZWQgYW5kCisgKiByZWxlYXNlZCBpdC4gSW4gc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgdGhpcyBtYXkgYWxyZWFkeSBiZSBndWFyYW50ZWVkCisgKiBieSBhIHJlZ3VsYXIgUmVhZFdyaXRlTXV0ZXguCisgKi8KK2NsYXNzIE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXggOiBwdWJsaWMgUmVhZFdyaXRlTXV0ZXggeworcHVibGljOgorICBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4KCk7CisKKyAgdmlydHVhbCB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgTXV0ZXggbXV0ZXhfOworICBtdXRhYmxlIHZvbGF0aWxlIGJvb2wgd3JpdGVyV2FpdGluZ187Cit9OworCitjbGFzcyBHdWFyZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIEd1YXJkKGNvbnN0IE11dGV4JiB2YWx1ZSwgaW50NjRfdCB0aW1lb3V0ID0gMCkgOiBtdXRleF8oJnZhbHVlKSB7CisgICAgaWYgKHRpbWVvdXQgPT0gMCkgeworICAgICAgdmFsdWUubG9jaygpOworICAgIH0gZWxzZSBpZiAodGltZW91dCA8IDApIHsKKyAgICAgIGlmICghdmFsdWUudHJ5bG9jaygpKSB7CisgICAgICAgIG11dGV4XyA9IE5VTEw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghdmFsdWUudGltZWRsb2NrKHRpbWVvdXQpKSB7CisgICAgICAgIG11dGV4XyA9IE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisgIH5HdWFyZCgpIHsKKyAgICBpZiAobXV0ZXhfKSB7CisgICAgICBtdXRleF8tPnVubG9jaygpOworICAgIH0KKyAgfQorCisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAobXV0ZXhfICE9IE5VTEwpOyB9CisKK3ByaXZhdGU6CisgIGNvbnN0IE11dGV4KiBtdXRleF87Cit9OworCisvLyBDYW4gYmUgdXNlZCBhcyBzZWNvbmQgYXJndW1lbnQgdG8gUldHdWFyZCB0byBtYWtlIGNvZGUgbW9yZSByZWFkYWJsZQorLy8gYXMgdG8gd2hldGhlciB3ZSdyZSBkb2luZyBhY3F1aXJlUmVhZCgpIG9yIGFjcXVpcmVXcml0ZSgpLgorZW51bSBSV0d1YXJkVHlwZSB7IFJXX1JFQUQgPSAwLCBSV19XUklURSA9IDEgfTsKKworY2xhc3MgUldHdWFyZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIFJXR3VhcmQoY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHZhbHVlLCBib29sIHdyaXRlID0gZmFsc2UpIDogcndfbXV0ZXhfKHZhbHVlKSB7CisgICAgaWYgKHdyaXRlKSB7CisgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlUmVhZCgpOworICAgIH0KKyAgfQorCisgIFJXR3VhcmQoY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHZhbHVlLCBSV0d1YXJkVHlwZSB0eXBlKSA6IHJ3X211dGV4Xyh2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFJXX1dSSVRFKSB7CisgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlUmVhZCgpOworICAgIH0KKyAgfQorICB+UldHdWFyZCgpIHsgcndfbXV0ZXhfLnJlbGVhc2UoKTsgfQorCitwcml2YXRlOgorICBjb25zdCBSZWFkV3JpdGVNdXRleCYgcndfbXV0ZXhfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWI0NDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BMQVRGT1JNVEhSRUFERkFDVE9SWV9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1BMQVRGT1JNVEhSRUFERkFDVE9SWV9IXyAxCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2lmIFVTRV9TVERfVEhSRUFECisjICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KKyNlbmRpZgorLy8gY2xhbmctZm9ybWF0IG9uCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaWYgVVNFX1NURF9USFJFQUQKKyAgdHlwZWRlZiBTdGRUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKKyNlbHNlCisgIHR5cGVkZWYgUG9zaXhUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKKyNlbmRpZgorLy8gY2xhbmctZm9ybWF0IG9uCisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUExBVEZPUk1USFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTkyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcApAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KKworI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECisjaW5jbHVkZSA8Z29vZ2xlL3Byb2ZpbGVyLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBUaGUgUE9TSVggdGhyZWFkIGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFB0aHJlYWRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IHVuaW5pdGlhbGl6ZWQsIHN0YXJ0aW5nLCBzdGFydGVkLCBzdG9wcGluZywgc3RvcHBlZCB9OworCisgIHN0YXRpYyBjb25zdCBpbnQgTUIgPSAxMDI0ICogMTAyNDsKKworICBzdGF0aWMgdm9pZCogdGhyZWFkTWFpbih2b2lkKiBhcmcpOworCitwcml2YXRlOgorICBwdGhyZWFkX3QgcHRocmVhZF87CisgIE1vbml0b3IgbW9uaXRvcl87CQkvLyBndWFyZCB0byBwcm90ZWN0IHN0YXRlXyBhbmQgYWxzbyBub3RpZmljYXRpb24KKyAgU1RBVEUgc3RhdGVfOyAgICAgICAgIC8vIHRvIHByb3RlY3QgcHJvcGVyIHRocmVhZCBzdGFydCBiZWhhdmlvcgorICBpbnQgcG9saWN5XzsKKyAgaW50IHByaW9yaXR5XzsKKyAgaW50IHN0YWNrU2l6ZV87CisgIHN0ZDo6d2Vha19wdHI8UHRocmVhZFRocmVhZD4gc2VsZl87CisgIGJvb2wgZGV0YWNoZWRfOworCitwdWJsaWM6CisgIFB0aHJlYWRUaHJlYWQoaW50IHBvbGljeSwKKyAgICAgICAgICAgICAgICBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgaW50IHN0YWNrU2l6ZSwKKyAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCisgICAgOgorCisjaWZuZGVmIF9XSU4zMgorICAgICAgcHRocmVhZF8oMCksCisjZW5kaWYgLy8gX1dJTjMyCisgICAgICBzdGF0ZV8odW5pbml0aWFsaXplZCksCisgICAgICBwb2xpY3lfKHBvbGljeSksCisgICAgICBwcmlvcml0eV8ocHJpb3JpdHkpLAorICAgICAgc3RhY2tTaXplXyhzdGFja1NpemUpLAorICAgICAgZGV0YWNoZWRfKGRldGFjaGVkKSB7CisKKyAgICB0aGlzLT5UaHJlYWQ6OnJ1bm5hYmxlKHJ1bm5hYmxlKTsKKyAgfQorCisgIH5QdGhyZWFkVGhyZWFkKCkgeworICAgIC8qIE5vdGhpbmcgcmVmZXJlbmNlcyB0aGlzIHRocmVhZCwgaWYgaXMgaXMgbm90IGRldGFjaGVkLCBkbyBhIGpvaW4KKyAgICAgICBub3csIG90aGVyd2lzZSB0aGUgdGhyZWFkLWlkIGFuZCwgcG9zc2libHksIG90aGVyIHJlc291cmNlcyB3aWxsCisgICAgICAgYmUgbGVha2VkLiAqLworICAgIGlmICghZGV0YWNoZWRfKSB7CisgICAgICB0cnkgeworICAgICAgICBqb2luKCk7CisgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgLy8gV2UncmUgcmVhbGx5IGhvc2VkLgorICAgICAgfQorICAgIH0KKyAgfQorCisgIFNUQVRFIGdldFN0YXRlKCkgY29uc3QKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICByZXR1cm4gc3RhdGVfOworICB9CisKKyAgdm9pZCBzZXRTdGF0ZShTVEFURSBuZXdTdGF0ZSkKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICBzdGF0ZV8gPSBuZXdTdGF0ZTsKKworICAgIC8vIHVuYmxvY2sgc3RhcnQoKSB3aXRoIHRoZSBrbm93bGVkZ2UgdGhhdCB0aGUgdGhyZWFkIGhhcyBhY3R1YWxseQorICAgIC8vIHN0YXJ0ZWQgcnVubmluZywgd2hpY2ggYXZvaWRzIGEgcmFjZSBpbiBkZXRhY2hlZCB0aHJlYWRzLgorICAgIGlmIChuZXdTdGF0ZSA9PSBzdGFydGVkKSB7CisJICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CisgIH0KKworICB2b2lkIHN0YXJ0KCkgeworICAgIGlmIChnZXRTdGF0ZSgpICE9IHVuaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKKyAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKSAhPSAwKSB7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX2luaXQgZmFpbGVkIik7CisgICAgfQorCisgICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZF8gPyBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCA6IFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKQorICAgICAgICAhPSAwKSB7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlIGZhaWxlZCIpOworICAgIH0KKworICAgIC8vIFNldCB0aHJlYWQgc3RhY2sgc2l6ZQorICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZ0aHJlYWRfYXR0ciwgTUIgKiBzdGFja1NpemVfKSAhPSAwKSB7CisgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSBmYWlsZWQiKTsKKyAgICB9CisKKy8vIFNldCB0aHJlYWQgcG9saWN5CisjaWZkZWYgX1dJTjMyCisgICAgLy8gV0lOMzIgUHRocmVhZCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCBzaGVkdWxpbmcgcG9saWNpZXMgb3RoZXIgdGhlbgorICAgIC8vIFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIgLSBydW50aW1lIGVycm9yCisgICAgcG9saWN5XyA9IFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVI7CisjZW5kaWYKKworI2lmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyA+IDAKKyAgICBpZiAocHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KCZ0aHJlYWRfYXR0ciwgcG9saWN5XykgIT0gMCkgeworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSBmYWlsZWQiKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZF9wYXJhbTsKKyAgICBzY2hlZF9wYXJhbS5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5XzsKKworICAgIC8vIFNldCB0aHJlYWQgcHJpb3JpdHkKKyAgICBpZiAocHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oJnRocmVhZF9hdHRyLCAmc2NoZWRfcGFyYW0pICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgcmVmZXJlbmNlCisgICAgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPigpOworICAgICpzZWxmUmVmID0gc2VsZl8ubG9jaygpOworCisgICAgc2V0U3RhdGUoc3RhcnRpbmcpOworCisJU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworCQorICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmcHRocmVhZF8sICZ0aHJlYWRfYXR0ciwgdGhyZWFkTWFpbiwgKHZvaWQqKXNlbGZSZWYpICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2NyZWF0ZSBmYWlsZWQiKTsKKyAgICB9CisgICAgCisgICAgLy8gVGhlIGNhbGxlciBtYXkgbm90IGNob29zZSB0byBndWFyYW50ZWUgdGhlIHNjb3BlIG9mIHRoZSBSdW5uYWJsZQorICAgIC8vIGJlaW5nIHVzZWQgaW4gdGhlIHRocmVhZCwgc28gd2UgbXVzdCBhY3R1YWxseSB3YWl0IHVudGlsIHRoZSB0aHJlYWQKKyAgICAvLyBzdGFydHMgYmVmb3JlIHdlIHJldHVybi4gIElmIHdlIGRvIG5vdCB3YWl0LCBpdCB3b3VsZCBiZSBwb3NzaWJsZQorICAgIC8vIGZvciB0aGUgY2FsbGVyIHRvIHN0YXJ0IGRlc3RydWN0aW5nIHRoZSBSdW5uYWJsZSBhbmQgdGhlIFRocmVhZCwKKyAgICAvLyBhbmQgd2Ugd291bGQgZW5kIHVwIGluIGEgcmFjZS4gIFRoaXMgd2FzIGlkZW50aWZpZWQgd2l0aCB2YWxncmluZC4KKyAgICBtb25pdG9yXy53YWl0KCk7CisgIH0KKworICB2b2lkIGpvaW4oKSB7CisgICAgaWYgKCFkZXRhY2hlZF8gJiYgZ2V0U3RhdGUoKSAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgICB2b2lkKiBpZ25vcmU7CisgICAgICAvKiBYWFgKKyAgICAgICAgIElmIGpvaW4gZmFpbHMgaXQgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBmYWN0CisgICAgICAgICB0aGF0IHRoZSBsYXN0IHJlZmVyZW5jZSB3YXMgdGhlIHRocmVhZCBpdHNlbGYgYW5kIGNhbm5vdAorICAgICAgICAgam9pbi4gIFRoaXMgcmVzdWx0cyBpbiBsZWFrZWQgdGhyZWFkcyBhbmQgd2lsbCBldmVudHVhbGx5CisgICAgICAgICBjYXVzZSB0aGUgcHJvY2VzcyB0byBydW4gb3V0IG9mIHRocmVhZCByZXNvdXJjZXMuCisgICAgICAgICBXZSdyZSBiZXlvbmQgdGhlIHBvaW50IG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIE5vdCBjbGVhciBob3cKKyAgICAgICAgIGJlc3QgdG8gaGFuZGxlIHRoaXMuICovCisgICAgICBpbnQgcmVzID0gcHRocmVhZF9qb2luKHB0aHJlYWRfLCAmaWdub3JlKTsKKyAgICAgIGRldGFjaGVkXyA9IChyZXMgPT0gMCk7CisgICAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiUHRocmVhZFRocmVhZDo6am9pbigpOiBmYWlsIHdpdGggY29kZSAlZCIsIHJlcyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgVGhyZWFkOjppZF90IGdldElkKCkgeworCisjaWZuZGVmIF9XSU4zMgorICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfOworI2Vsc2UKKyAgICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkXy5wOworI2VuZGlmIC8vIF9XSU4zMgorICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQorCisgIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQorCisgIHZvaWQgd2Vha1JlZihzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gc2VsZikgeworICAgIGFzc2VydChzZWxmLmdldCgpID09IHRoaXMpOworICAgIHNlbGZfID0gc3RkOjp3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPihzZWxmKTsKKyAgfQorfTsKKwordm9pZCogUHRocmVhZFRocmVhZDo6dGhyZWFkTWFpbih2b2lkKiBhcmcpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHRocmVhZCA9ICooc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kilhcmc7CisgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPio+KGFyZyk7CisKKyNpZiBHT09HTEVfUEVSRlRPT0xTX1JFR0lTVEVSX1RIUkVBRAorICBQcm9maWxlclJlZ2lzdGVyVGhyZWFkKCk7CisjZW5kaWYKKworICB0aHJlYWQtPnNldFN0YXRlKHN0YXJ0ZWQpOworCisgIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7CisKKyAgU1RBVEUgX3MgPSB0aHJlYWQtPmdldFN0YXRlKCk7CisgIGlmIChfcyAhPSBzdG9wcGluZyAmJiBfcyAhPSBzdG9wcGVkKSB7CisgICAgdGhyZWFkLT5zZXRTdGF0ZShzdG9wcGluZyk7CisgIH0KKworICByZXR1cm4gKHZvaWQqKTA7Cit9CisKKy8qKgorICogQ29udmVydHMgZ2VuZXJpYyBwb3NpeCB0aHJlYWQgc2NoZWR1bGUgcG9saWN5IGVudW1zIGludG8gcHRocmVhZAorICogQVBJIHZhbHVlcy4KKyAqLworc3RhdGljIGludCB0b1B0aHJlYWRQb2xpY3koUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KSB7CisgIHN3aXRjaCAocG9saWN5KSB7CisgIGNhc2UgUG9zaXhUaHJlYWRGYWN0b3J5OjpPVEhFUjoKKyAgICByZXR1cm4gU0NIRURfT1RIRVI7CisgIGNhc2UgUG9zaXhUaHJlYWRGYWN0b3J5OjpGSUZPOgorICAgIHJldHVybiBTQ0hFRF9GSUZPOworICBjYXNlIFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU46CisgICAgcmV0dXJuIFNDSEVEX1JSOworICB9CisgIHJldHVybiBTQ0hFRF9PVEhFUjsKK30KKworLyoqCisgKiBDb252ZXJ0cyByZWxhdGl2ZSB0aHJlYWQgcHJpb3JpdGllcyB0byBhYnNvbHV0ZSB2YWx1ZSBiYXNlZCBvbiBwb3NpeAorICogdGhyZWFkIHNjaGVkdWxlciBwb2xpY3kKKyAqCisgKiAgVGhlIGlkZWEgaXMgc2ltcGx5IHRvIGRpdmlkZSB1cCB0aGUgcHJpb3JpdHkgcmFuZ2UgZm9yIHRoZSBnaXZlbiBwb2xpY3kKKyAqIGludG8gdGhlIGNvcnJlcHNvbmRpbmcgcmVsYXRpdmUgcHJpb3JpdHkgbGV2ZWwgKGxvd2VzdC4uaGlnaGVzdCkgYW5kCisgKiB0aGVuIHByby1yYXRlIGFjY29yZGluZ2x5LgorICovCitzdGF0aWMgaW50IHRvUHRocmVhZFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6UE9MSUNZIHBvbGljeSwgUG9zaXhUaHJlYWRGYWN0b3J5OjpQUklPUklUWSBwcmlvcml0eSkgeworICBpbnQgcHRocmVhZF9wb2xpY3kgPSB0b1B0aHJlYWRQb2xpY3kocG9saWN5KTsKKyAgaW50IG1pbl9wcmlvcml0eSA9IDA7CisgIGludCBtYXhfcHJpb3JpdHkgPSAwOworI2lmZGVmIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01JTgorICBtaW5fcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHB0aHJlYWRfcG9saWN5KTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01BWAorICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KHB0aHJlYWRfcG9saWN5KTsKKyNlbmRpZgorICBpbnQgcXVhbnRhID0gKFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCAtIFBvc2l4VGhyZWFkRmFjdG9yeTo6TE9XRVNUKSArIDE7CisgIGZsb2F0IHN0ZXBzcGVycXVhbnRhID0gKGZsb2F0KShtYXhfcHJpb3JpdHkgLSBtaW5fcHJpb3JpdHkpIC8gcXVhbnRhOworCisgIGlmIChwcmlvcml0eSA8PSBQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpIHsKKyAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBwcmlvcml0eSk7CisgIH0gZWxzZSB7CisgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlIGZvciBwcmlvcml0eSBpbmNyZW1lbnRzLgorICAgIGFzc2VydChmYWxzZSk7CisgICAgcmV0dXJuIChpbnQpKG1pbl9wcmlvcml0eSArIHN0ZXBzcGVycXVhbnRhICogUG9zaXhUaHJlYWRGYWN0b3J5OjpOT1JNQUwpOworICB9Cit9CisKK1Bvc2l4VGhyZWFkRmFjdG9yeTo6UG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWSBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkKQorICA6IFRocmVhZEZhY3RvcnkoZGV0YWNoZWQpLAorICAgIHBvbGljeV8ocG9saWN5KSwKKyAgICBwcmlvcml0eV8ocHJpb3JpdHkpLAorICAgIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSB7Cit9CisKK1Bvc2l4VGhyZWFkRmFjdG9yeTo6UG9zaXhUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpCisgIDogVGhyZWFkRmFjdG9yeShkZXRhY2hlZCksCisgICAgcG9saWN5XyhST1VORF9ST0JJTiksCisgICAgcHJpb3JpdHlfKE5PUk1BTCksCisgICAgc3RhY2tTaXplXygxKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IFBvc2l4VGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKKyAgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHJlc3VsdAorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4obmV3IFB0aHJlYWRUaHJlYWQodG9QdGhyZWFkUG9saWN5KHBvbGljeV8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUHRocmVhZFByaW9yaXR5KHBvbGljeV8sIHByaW9yaXR5XyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tTaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RldGFjaGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmFibGUpKTsKKyAgcmVzdWx0LT53ZWFrUmVmKHJlc3VsdCk7CisgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0U3RhY2tTaXplKCkgY29uc3QgeworICByZXR1cm4gc3RhY2tTaXplXzsKK30KKwordm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFN0YWNrU2l6ZShpbnQgdmFsdWUpIHsKKyAgc3RhY2tTaXplXyA9IHZhbHVlOworfQorCitQb3NpeFRocmVhZEZhY3Rvcnk6OlBSSU9SSVRZIFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0UHJpb3JpdHkoKSBjb25zdCB7CisgIHJldHVybiBwcmlvcml0eV87Cit9CisKK3ZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRQcmlvcml0eShQUklPUklUWSB2YWx1ZSkgeworICBwcmlvcml0eV8gPSB2YWx1ZTsKK30KKworVGhyZWFkOjppZF90IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeworI2lmbmRlZiBfV0lOMzIKKyAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCk7CisjZWxzZQorICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkX3NlbGYoKS5wOworI2VuZGlmIC8vIF9XSU4zMgorfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2IxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1BPU0lYVEhSRUFERkFDVE9SWV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHBvc2l4IHRocmVhZHMKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBQb3NpeFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIFBPU0lYIFRocmVhZCBzY2hlZHVsZXIgcG9saWNpZXMKKyAgICovCisgIGVudW0gUE9MSUNZIHsgT1RIRVIsIEZJRk8sIFJPVU5EX1JPQklOIH07CisKKyAgLyoqCisgICAqIFBPU0lYIFRocmVhZCBzY2hlZHVsZXIgcmVsYXRpdmUgcHJpb3JpdGllcywKKyAgICoKKyAgICogQWJzb2x1dGUgcHJpb3JpdHkgaXMgZGV0ZXJtaW5lZCBieSBzY2hlZHVsZXIgcG9saWN5IGFuZCBPUy4gVGhpcworICAgKiBlbnVtZXJhdGlvbiBzcGVjaWZpZXMgcmVsYXRpdmUgcHJpb3JpdGllcyBzdWNoIHRoYXQgb25lIGNhbiBzcGVjaWZ5IGEKKyAgICogcHJpb3JpdHkgd2l0aGluIGEgZ2l2aW5nIHNjaGVkdWxlciBwb2xpY3kgd2l0aG91dCBrbm93aW5nIHRoZSBhYnNvbHV0ZQorICAgKiB2YWx1ZSBvZiB0aGUgcHJpb3JpdHkuCisgICAqLworICBlbnVtIFBSSU9SSVRZIHsKKyAgICBMT1dFU1QgPSAwLAorICAgIExPV0VSID0gMSwKKyAgICBMT1cgPSAyLAorICAgIE5PUk1BTCA9IDMsCisgICAgSElHSCA9IDQsCisgICAgSElHSEVSID0gNSwKKyAgICBISUdIRVNUID0gNiwKKyAgICBJTkNSRU1FTlQgPSA3LAorICAgIERFQ1JFTUVOVCA9IDgKKyAgfTsKKworICAvKioKKyAgICogUG9zaXggdGhyZWFkIChwdGhyZWFkKSBmYWN0b3J5LiAgQWxsIHRocmVhZHMgY3JlYXRlZCBieSBhIGZhY3RvcnkgYXJlIHJlZmVyZW5jZS1jb3VudGVkCisgICAqIHZpYSBzdGQ6OnNoYXJlZF9wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQgdGhlIFJ1bm5hYmxlIHRhc2tzIAorICAgKiB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSB0byBib3RoIGlzCisgICAqIGdpdmVuIHVwLgorICAgKgorICAgKiBUaHJlYWRzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwb2xpY3ksIHByaW9yaXR5LCBzdGFjay1zaXplIGFuZCBkZXRhY2hhYmxlLW1vZGUKKyAgICogZGV0YWNoZWQgbWVhbnMgdGhlIHRocmVhZCBpcyBmcmVlLXJ1bm5pbmcgYW5kIHdpbGwgcmVsZWFzZSBhbGwgc3lzdGVtIHJlc291cmNlcyB0aGUKKyAgICogd2hlbiBpdCBjb21wbGV0ZXMuICBBIGRldGFjaGFibGUgdGhyZWFkIGlzIG5vdCBqb2luYWJsZS4gIFRoZSBqb2luIG1ldGhvZAorICAgKiBvZiBhIGRldGFjaGFibGUgdGhyZWFkIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGggbm8gZXJyb3IuCisgICAqCisgICAqIEJ5IGRlZmF1bHQgdGhyZWFkcyBhcmUgbm90IGpvaW5hYmxlLgorICAgKi8KKyAgUG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3kgPSBST1VORF9ST0JJTiwKKyAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZIHByaW9yaXR5ID0gTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YWNrU2l6ZSA9IDEsCisgICAgICAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkID0gdHJ1ZSk7CisKKyAgLyoqCisgICAqIFByb3ZpZGUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggdGhlIG90aGVyIGZhY3RvcmllcworICAgKiBUaGUgZGVmYXVsdCBwb2xpY3kgaXMgUE9MSUNZOjpST1VORF9ST0JJTi4KKyAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgUFJJT1JJVFk6Ok5PUk1BTC4KKyAgICogVGhlIGRlZmF1bHQgc3RhY2tTaXplIGlzIDEuCisgICAqLworICBQb3NpeFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCk7CisKKyAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7CisKKyAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OworICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEdldHMgc3RhY2sgc2l6ZSBmb3IgbmV3bHkgY3JlYXRlZCB0aHJlYWRzCisgICAqCisgICAqIEByZXR1cm4gaW50IHNpemUgaW4gbWVnYWJ5dGVzCisgICAqLworICB2aXJ0dWFsIGludCBnZXRTdGFja1NpemUoKSBjb25zdDsKKworICAvKioKKyAgICogU2V0cyBzdGFjayBzaXplIGZvciBuZXdseSBjcmVhdGVkIHRocmVhZHMKKyAgICoKKyAgICogQHBhcmFtIHZhbHVlIHNpemUgaW4gbWVnYWJ5dGVzCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2V0U3RhY2tTaXplKGludCB2YWx1ZSk7CisKKyAgLyoqCisgICAqIEdldHMgcHJpb3JpdHkgcmVsYXRpdmUgdG8gY3VycmVudCBwb2xpY3kKKyAgICovCisgIHZpcnR1YWwgUFJJT1JJVFkgZ2V0UHJpb3JpdHkoKSBjb25zdDsKKworICAvKioKKyAgICogU2V0cyBwcmlvcml0eSByZWxhdGl2ZSB0byBjdXJyZW50IHBvbGljeQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNldFByaW9yaXR5KFBSSU9SSVRZIHByaW9yaXR5KTsKKworcHJpdmF0ZToKKyAgUE9MSUNZIHBvbGljeV87CisgIFBSSU9SSVRZIHByaW9yaXR5XzsKKyAgaW50IHN0YWNrU2l6ZV87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QT1NJWFRIUkVBREZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNiMjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE1vbml0b3IuY3BwCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgc3RkIHRocmVhZCBsaWJyYXJ5CisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgTW9uaXRvcjo6SW1wbCB7CisKK3B1YmxpYzoKKyAgSW1wbCgpIDogb3duZWRNdXRleF8obmV3IE11dGV4KCkpLCBjb25kaXRpb25WYXJpYWJsZV8oKSwgbXV0ZXhfKE5VTEwpIHsgaW5pdChvd25lZE11dGV4Xy5nZXQoKSk7IH0KKworICBJbXBsKE11dGV4KiBtdXRleCkgOiBvd25lZE11dGV4XygpLCBjb25kaXRpb25WYXJpYWJsZV8oKSwgbXV0ZXhfKE5VTEwpIHsgaW5pdChtdXRleCk7IH0KKworICBJbXBsKE1vbml0b3IqIG1vbml0b3IpIDogb3duZWRNdXRleF8oKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7CisgICAgaW5pdCgmKG1vbml0b3ItPm11dGV4KCkpKTsKKyAgfQorCisgIE11dGV4JiBtdXRleCgpIHsgcmV0dXJuICptdXRleF87IH0KKyAgdm9pZCBsb2NrKCkgeyBtdXRleF8tPmxvY2soKTsgfQorICB2b2lkIHVubG9jaygpIHsgbXV0ZXhfLT51bmxvY2soKTsgfQorCisgIC8qKgorICAgKiBFeGNlcHRpb24tdGhyb3dpbmcgdmVyc2lvbiBvZiB3YWl0Rm9yVGltZVJlbGF0aXZlKCksIGNhbGxlZCBzaW1wbHkKKyAgICogd2FpdChpbnQ2NCkgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gIFRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLgorICAgKgorICAgKiBJZiB0aGUgY29uZGl0aW9uIG9jY3VycywgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjbGVhbmx5OyBvbiB0aW1lb3V0IG9yCisgICAqIGVycm9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqLworICB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0X21zKSB7CisgICAgaW50IHJlc3VsdCA9IHdhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7CisgICAgaWYgKHJlc3VsdCA9PSBUSFJJRlRfRVRJTUVET1VUKSB7CisgICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOworICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oIk1vbml0b3I6OndhaXQoKSBmYWlsZWQiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGNvbmRpdGlvbiB0bworICAgKiBvY2N1ciwgb3Igd2FpdHMgZm9yZXZlciBpZiB0aW1lb3V0X21zID09IDAuCisgICAqCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIHsKKyAgICBpZiAodGltZW91dF9tcyA9PSAwTEwpIHsKKyAgICAgIHJldHVybiB3YWl0Rm9yZXZlcigpOworICAgIH0KKworICAgIGFzc2VydChtdXRleF8pOworICAgIHN0ZDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9IHN0YXRpY19jYXN0PHN0ZDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIGFzc2VydChtdXRleEltcGwpOworCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnRpbWVkX211dGV4PiBsb2NrKCptdXRleEltcGwsIHN0ZDo6YWRvcHRfbG9jayk7CisgICAgYm9vbCB0aW1lZG91dCA9IChjb25kaXRpb25WYXJpYWJsZV8ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyh0aW1lb3V0X21zKSkKKyAgICAgICAgICAgICAgICAgICAgID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KTsKKyAgICBsb2NrLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gKHRpbWVkb3V0ID8gVEhSSUZUX0VUSU1FRE9VVCA6IDApOworICB9CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgeworICAgIHN0cnVjdCB0aW1ldmFsIHRlbXA7CisgICAgdGVtcC50dl9zZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9zZWMpOworICAgIHRlbXAudHZfdXNlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X25zZWMpIC8gMTAwMDsKKyAgICByZXR1cm4gd2FpdEZvclRpbWUoJnRlbXApOworICB9CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgdGltZXZhbC4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCogYWJzdGltZSkgeworICAgIGFzc2VydChtdXRleF8pOworICAgIHN0ZDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9IHN0YXRpY19jYXN0PHN0ZDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIGFzc2VydChtdXRleEltcGwpOworCisgICAgc3RydWN0IHRpbWV2YWwgY3VycmVudHRpbWU7CisgICAgVXRpbDo6dG9UaW1ldmFsKGN1cnJlbnR0aW1lLCBVdGlsOjpjdXJyZW50VGltZSgpKTsKKworICAgIGxvbmcgdHZfc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjIC0gY3VycmVudHRpbWUudHZfc2VjKTsKKyAgICBsb25nIHR2X3VzZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl91c2VjIC0gY3VycmVudHRpbWUudHZfdXNlYyk7CisgICAgaWYgKHR2X3NlYyA8IDApCisgICAgICB0dl9zZWMgPSAwOworICAgIGlmICh0dl91c2VjIDwgMCkKKyAgICAgIHR2X3VzZWMgPSAwOworCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnRpbWVkX211dGV4PiBsb2NrKCptdXRleEltcGwsIHN0ZDo6YWRvcHRfbG9jayk7CisgICAgYm9vbCB0aW1lZG91dCA9IChjb25kaXRpb25WYXJpYWJsZV8ud2FpdF9mb3IobG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c2Vjb25kcyh0dl9zZWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKHR2X3VzZWMpKQorICAgICAgICAgICAgICAgICAgICAgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpOworICAgIGxvY2sucmVsZWFzZSgpOworICAgIHJldHVybiAodGltZWRvdXQgPyBUSFJJRlRfRVRJTUVET1VUIDogMCk7CisgIH0KKworICAvKioKKyAgICogV2FpdHMgZm9yZXZlciB1bnRpbCB0aGUgY29uZGl0aW9uIG9jY3Vycy4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgKi8KKyAgaW50IHdhaXRGb3JldmVyKCkgeworICAgIGFzc2VydChtdXRleF8pOworICAgIHN0ZDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9IHN0YXRpY19jYXN0PHN0ZDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIGFzc2VydChtdXRleEltcGwpOworCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnRpbWVkX211dGV4PiBsb2NrKCptdXRleEltcGwsIHN0ZDo6YWRvcHRfbG9jayk7CisgICAgY29uZGl0aW9uVmFyaWFibGVfLndhaXQobG9jayk7CisgICAgbG9jay5yZWxlYXNlKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2b2lkIG5vdGlmeSgpIHsgY29uZGl0aW9uVmFyaWFibGVfLm5vdGlmeV9vbmUoKTsgfQorCisgIHZvaWQgbm90aWZ5QWxsKCkgeyBjb25kaXRpb25WYXJpYWJsZV8ubm90aWZ5X2FsbCgpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsgbXV0ZXhfID0gbXV0ZXg7IH0KKworICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8TXV0ZXg+IG93bmVkTXV0ZXhfOworICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkgY29uZGl0aW9uVmFyaWFibGVfOworICBNdXRleCogbXV0ZXhfOworfTsKKworTW9uaXRvcjo6TW9uaXRvcigpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwoKSkgeworfQorTW9uaXRvcjo6TW9uaXRvcihNdXRleCogbXV0ZXgpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobXV0ZXgpKSB7Cit9CitNb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHsKK30KKworTW9uaXRvcjo6fk1vbml0b3IoKSB7CisgIGRlbGV0ZSBpbXBsXzsKK30KKworTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgeworICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5tdXRleCgpOworfQorCit2b2lkIE1vbml0b3I6OmxvY2soKSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bG9jaygpOworfQorCit2b2lkIE1vbml0b3I6OnVubG9jaygpIGNvbnN0IHsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT51bmxvY2soKTsKK30KKwordm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXQodGltZW91dCk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWUoYWJzdGltZSk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCB0aW1ldmFsKiBhYnN0aW1lKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lKGFic3RpbWUpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JldmVyKCkgY29uc3QgeworICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yZXZlcigpOworfQorCit2b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5ub3RpZnkoKTsKK30KKwordm9pZCBNb25pdG9yOjpub3RpZnlBbGwoKSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5QWxsKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmNzlmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgQysrMTEgc3RkOjp0aW1lZF9tdXRleAorICoKKyAqIE1ldGhvZHMgdGhyb3cgc3RkOjpzeXN0ZW1fZXJyb3Igb24gZXJyb3IuCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgTXV0ZXg6OmltcGwgOiBwdWJsaWMgc3RkOjp0aW1lZF9tdXRleCB7fTsKKworTXV0ZXg6Ok11dGV4KEluaXRpYWxpemVyIGluaXQpIDogaW1wbF8obmV3IE11dGV4OjppbXBsKCkpIHsKKyAgKCh2b2lkKWluaXQpOworfQorCit2b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy5nZXQoKTsKK30KKwordm9pZCBNdXRleDo6bG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPmxvY2soKTsKK30KKworYm9vbCBNdXRleDo6dHJ5bG9jaygpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50cnlfbG9jaygpOworfQorCitib29sIE11dGV4Ojp0aW1lZGxvY2soaW50NjRfdCBtcykgY29uc3QgeworICByZXR1cm4gaW1wbF8tPnRyeV9sb2NrX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKG1zKSk7Cit9CisKK3ZvaWQgTXV0ZXg6OnVubG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPnVubG9jaygpOworfQorCit2b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICAoKHZvaWQpYXJnKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4NWYzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2lmIFVTRV9TVERfVEhSRUFECisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBUaGUgQysrMTEgdGhyZWFkIGNsYXNzLgorICoKKyAqIE5vdGUgdGhhdCB3ZSB1c2UgYm9vc3Qgc2hhcmVkX3B0ciByYXRoZXIgdGhhbiBzdGQgc2hhcmVkX3B0cnMgaGVyZQorICogYmVjYXVzZSB0aGUgVGhyZWFkL1J1bm5hYmxlIGNsYXNzZXMgdXNlIHRob3NlIGFuZCB3ZSBkb24ndCB3YW50IHRvCisgKiBtaXggdGhlbS4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBTdGRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkLCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTdGRUaHJlYWQ+IHsKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IHVuaW5pdGlhbGl6ZWQsIHN0YXJ0aW5nLCBzdGFydGVkLCBzdG9wcGluZywgc3RvcHBlZCB9OworCisgIHN0YXRpYyB2b2lkIHRocmVhZE1haW4oc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gdGhyZWFkKTsKKworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dGhyZWFkPiB0aHJlYWRfOworICBNb25pdG9yIG1vbml0b3JfOworICBTVEFURSBzdGF0ZV87CisgIGJvb2wgZGV0YWNoZWRfOworCitwdWJsaWM6CisgIFN0ZFRocmVhZChib29sIGRldGFjaGVkLCBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKQorICAgIDogc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLCBkZXRhY2hlZF8oZGV0YWNoZWQpIHsKKyAgICB0aGlzLT5UaHJlYWQ6OnJ1bm5hYmxlKHJ1bm5hYmxlKTsKKyAgfQorCisgIH5TdGRUaHJlYWQoKSB7CisgICAgaWYgKCFkZXRhY2hlZF8gJiYgdGhyZWFkXy0+am9pbmFibGUoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgam9pbigpOworICAgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBTVEFURSBnZXRTdGF0ZSgpIGNvbnN0CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgcmV0dXJuIHN0YXRlXzsKKyAgfQorCisgIHZvaWQgc2V0U3RhdGUoU1RBVEUgbmV3U3RhdGUpCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgc3RhdGVfID0gbmV3U3RhdGU7CisKKyAgICAvLyB1bmJsb2NrIHN0YXJ0KCkgd2l0aCB0aGUga25vd2xlZGdlIHRoYXQgdGhlIHRocmVhZCBoYXMgYWN0dWFsbHkKKyAgICAvLyBzdGFydGVkIHJ1bm5pbmcsIHdoaWNoIGF2b2lkcyBhIHJhY2UgaW4gZGV0YWNoZWQgdGhyZWFkcy4KKyAgICBpZiAobmV3U3RhdGUgPT0gc3RhcnRlZCkgeworCSAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzdGFydCgpIHsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gc2VsZlJlZiA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgICBzZXRTdGF0ZShzdGFydGluZyk7CisKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgdGhyZWFkXyA9IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnRocmVhZD4obmV3IHN0ZDo6dGhyZWFkKHRocmVhZE1haW4sIHNlbGZSZWYpKTsKKworICAgIGlmIChkZXRhY2hlZF8pCisgICAgICB0aHJlYWRfLT5kZXRhY2goKTsKKyAgICAKKyAgICAvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0IGFuZCBnZXQgZmFyIGVub3VnaCB0byBncmFiIGV2ZXJ5dGhpbmcKKyAgICAvLyB0aGF0IGl0IG5lZWRzIGZyb20gdGhlIGNhbGxpbmcgY29udGV4dCwgdGh1cyBhYnNvbHZpbmcgdGhlIGNhbGxlcgorICAgIC8vIGZyb20gYmVpbmcgcmVxdWlyZWQgdG8gaG9sZCBvbiB0byBydW5uYWJsZSBpbmRlZmluaXRlbHkuCisgICAgbW9uaXRvcl8ud2FpdCgpOworICB9CisKKyAgdm9pZCBqb2luKCkgeworICAgIGlmICghZGV0YWNoZWRfICYmIHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgICB0aHJlYWRfLT5qb2luKCk7CisgICAgfQorICB9CisKKyAgVGhyZWFkOjppZF90IGdldElkKCkgeyByZXR1cm4gdGhyZWFkXy5nZXQoKSA/IHRocmVhZF8tPmdldF9pZCgpIDogc3RkOjp0aHJlYWQ6OmlkKCk7IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9CisKKyAgdm9pZCBydW5uYWJsZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9Cit9OworCit2b2lkIFN0ZFRocmVhZDo6dGhyZWFkTWFpbihzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiB0aHJlYWQpIHsKKyNpZiBHT09HTEVfUEVSRlRPT0xTX1JFR0lTVEVSX1RIUkVBRAorICBQcm9maWxlclJlZ2lzdGVyVGhyZWFkKCk7CisjZW5kaWYKKworICB0aHJlYWQtPnNldFN0YXRlKHN0YXJ0ZWQpOworICB0aHJlYWQtPnJ1bm5hYmxlKCktPnJ1bigpOworCisgIGlmICh0aHJlYWQtPmdldFN0YXRlKCkgIT0gc3RvcHBpbmcgJiYgdGhyZWFkLT5nZXRTdGF0ZSgpICE9IHN0b3BwZWQpIHsKKyAgICB0aHJlYWQtPnNldFN0YXRlKHN0b3BwaW5nKTsKKyAgfQorfQorCitTdGRUaHJlYWRGYWN0b3J5OjpTdGRUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpIDogVGhyZWFkRmFjdG9yeShkZXRhY2hlZCkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBTdGRUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeworICBzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiByZXN1bHQgPSBzdGQ6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPihuZXcgU3RkVGhyZWFkKGlzRGV0YWNoZWQoKSwgcnVubmFibGUpKTsKKyAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCitUaHJlYWQ6OmlkX3QgU3RkVGhyZWFkRmFjdG9yeTo6Z2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeworICByZXR1cm4gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gVVNFX1NURF9USFJFQUQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDA0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1NURFRIUkVBREZBQ1RPUllfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9TVERUSFJFQURGQUNUT1JZX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgc3RkOjp0aHJlYWRzLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFN0ZFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIFN0ZCB0aHJlYWQgZmFjdG9yeS4gIEFsbCB0aHJlYWRzIGNyZWF0ZWQgYnkgYSBmYWN0b3J5IGFyZSByZWZlcmVuY2UtY291bnRlZAorICAgKiB2aWEgc3RkOjpzaGFyZWRfcHRyLiAgVGhlIGZhY3RvcnkgZ3VhcmFudGVlcyB0aGF0IHRocmVhZHMgYW5kIHRoZSBSdW5uYWJsZSB0YXNrcworICAgKiB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZQorICAgKiB0byBib3RoIGlzIGdpdmVuIHVwLgorICAgKgorICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KKyAgICovCisKKyAgU3RkVGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkID0gdHJ1ZSk7CisKKyAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7CisKKyAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OworICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7Cit9OworCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1NURFRIUkVBREZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmVhNGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8gMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2lmIFVTRV9TVERfVEhSRUFECisjaW5jbHVkZSA8dGhyZWFkPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1BUSFJFQURfSAorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCitjbGFzcyBUaHJlYWQ7CisKKy8qKgorICogTWluaW1hbCBydW5uYWJsZSBjbGFzcy4gIE1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLlJ1bm5hYmxlLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFJ1bm5hYmxlIHsKKworcHVibGljOgorICB2aXJ0dWFsIH5SdW5uYWJsZSgpe307CisgIHZpcnR1YWwgdm9pZCBydW4oKSA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIHRocmVhZCBvYmplY3QgdGhhdCBpcyBob3N0aW5nIHRoaXMgcnVubmFibGUgb2JqZWN0ICAtIGNhbiByZXR1cm4KKyAgICogYW4gZW1wdHkgYm9vc3Q6OnNoYXJlZCBwb2ludGVyIGlmIG5vIHJlZmVyZW5jZXMgcmVtYWluIG9uIHRoYXQgdGhyZWFkIG9iamVjdAorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQoKSB7IHJldHVybiB0aHJlYWRfLmxvY2soKTsgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSB0aHJlYWQgdGhhdCBpcyBleGVjdXRpbmcgdGhpcyBvYmplY3QuICBUaGlzIGlzIG9ubHkgbWVhbnQgZm9yCisgICAqIHVzZSBieSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgVGhyZWFkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB2YWx1ZSkgeyB0aHJlYWRfID0gdmFsdWU7IH0KKworcHJpdmF0ZToKKyAgc3RkOjp3ZWFrX3B0cjxUaHJlYWQ+IHRocmVhZF87Cit9OworCisvKioKKyAqIE1pbmltYWwgdGhyZWFkIGNsYXNzLiBSZXR1cm5lZCBieSB0aHJlYWQgZmFjdG9yeSBib3VuZCB0byBhIFJ1bm5hYmxlIG9iamVjdAorICogYW5kIHJlYWR5IHRvIHN0YXJ0IGV4ZWN1dGlvbi4gIE1vcmUgb3IgbGVzcyBhbmFsb2dvdXMgdG8gamF2YS5sYW5nLlRocmVhZAorICogKG1pbnVzIGFsbCB0aGUgdGhyZWFkIGdyb3VwLCBwcmlvcml0eSwgbW9kZSBhbmQgb3RoZXIgYmFnZ2FnZSwgc2luY2UgdGhhdAorICogaXMgZGlmZmljdWx0IHRvIGFic3RyYWN0IGFjcm9zcyBwbGF0Zm9ybXMgYW5kIGlzIGxlZnQgZm9yIHBsYXRmb3JtLXNwZWNpZmljCisgKiBUaHJlYWRGYWN0b3J5IGltcGxlbXRhdGlvbnMgdG8gZGVhbCB3aXRoCisgKgorICogQHNlZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3RvcnkpCisgKi8KK2NsYXNzIFRocmVhZCB7CisKK3B1YmxpYzoKKyNpZiBVU0VfU1REX1RIUkVBRAorICB0eXBlZGVmIHN0ZDo6dGhyZWFkOjppZCBpZF90OworCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19jdXJyZW50KGlkX3QgdCkgeyByZXR1cm4gdCA9PSBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsgfQorICBzdGF0aWMgaW5saW5lIGlkX3QgZ2V0X2N1cnJlbnQoKSB7IHJldHVybiBzdGQ6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKTsgfQorI2Vsc2UKKyAgdHlwZWRlZiBwdGhyZWFkX3QgaWRfdDsKKworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfY3VycmVudChpZF90IHQpIHsgcmV0dXJuIHB0aHJlYWRfZXF1YWwocHRocmVhZF9zZWxmKCksIHQpOyB9CisgIHN0YXRpYyBpbmxpbmUgaWRfdCBnZXRfY3VycmVudCgpIHsgcmV0dXJuIHB0aHJlYWRfc2VsZigpOyB9CisjZW5kaWYKKworICB2aXJ0dWFsIH5UaHJlYWQoKXt9OworCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHRocmVhZC4gRG9lcyBwbGF0Zm9ybSBzcGVjaWZpYyB0aHJlYWQgY3JlYXRpb24gYW5kCisgICAqIGNvbmZpZ3VyYXRpb24gdGhlbiBpbnZva2VzIHRoZSBydW4gbWV0aG9kIG9mIHRoZSBSdW5uYWJsZSBvYmplY3QgYm91bmQKKyAgICogdG8gdGhpcyB0aHJlYWQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CisKKyAgLyoqCisgICAqIEpvaW4gdGhpcyB0aHJlYWQuIElmIHRoaXMgdGhyZWFkIGlzIGpvaW5hYmxlLCB0aGUgY2FsbGluZyB0aHJlYWQgYmxvY2tzCisgICAqIHVudGlsIHRoaXMgdGhyZWFkIGNvbXBsZXRlcy4gIElmIHRoZSB0YXJnZXQgdGhyZWFkIGlzIG5vdCBqb2luYWJsZSwgdGhlbgorICAgKiBub3RoaW5nIGhhcHBlbnMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgam9pbigpID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgdGhyZWFkJ3MgcGxhdGZvcm0tc3BlY2lmaWMgSUQKKyAgICovCisgIHZpcnR1YWwgaWRfdCBnZXRJZCgpID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgcnVubmFibGUgb2JqZWN0IHRoaXMgdGhyZWFkIGlzIGhvc3RpbmcKKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9ydW5uYWJsZTsgfQorCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBydW5uYWJsZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IF9ydW5uYWJsZSA9IHZhbHVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gX3J1bm5hYmxlOworfTsKKworLyoqCisgKiBGYWN0b3J5IHRvIGNyZWF0ZSBwbGF0Zm9ybS1zcGVjaWZpYyB0aHJlYWQgb2JqZWN0IGFuZCBiaW5kIHRoZW0gdG8gUnVubmFibGUKKyAqIG9iamVjdCBmb3IgZXhlY3V0aW9uCisgKi8KK2NsYXNzIFRocmVhZEZhY3RvcnkgeworcHJvdGVjdGVkOgorICBUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpIDogZGV0YWNoZWRfKGRldGFjaGVkKSB7IH0KKworcHVibGljOgorICB2aXJ0dWFsIH5UaHJlYWRGYWN0b3J5KCkgeyB9CisKKyAgLyoqCisgICAqIEdldHMgY3VycmVudCBkZXRhY2hlZCBtb2RlCisgICAqLworICBib29sIGlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBkZXRhY2hlZF87IH0KKworICAvKioKKyAgICogU2V0cyB0aGUgZGV0YWNoZWQgZGlzcG9zaXRpb24gb2YgbmV3bHkgY3JlYXRlZCB0aHJlYWRzLgorICAgKi8KKyAgdm9pZCBzZXREZXRhY2hlZChib29sIGRldGFjaGVkKSB7IGRldGFjaGVkXyA9IGRldGFjaGVkOyB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB0aHJlYWQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgdGhyZWFkIGlkIG9yIHVua25vd25fdGhyZWFkX2lkIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB0aHJpZnQgdGhyZWFkCisgICAqLworICB2aXJ0dWFsIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEZvciBjb2RlIHJlYWRhYmlsaXR5IGRlZmluZSB0aGUgdW5rbm93bi91bmRlZmluZWQgdGhyZWFkIGlkCisgICAqLworICBzdGF0aWMgY29uc3QgVGhyZWFkOjppZF90IHVua25vd25fdGhyZWFkX2lkOworCitwcml2YXRlOgorICBib29sIGRldGFjaGVkXzsKK307CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFEX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMjVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDU4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0OworCisvKioKKyAqIFRocmVhZE1hbmFnZXIgY2xhc3MKKyAqCisgKiBUaGlzIGNsYXNzIG1hbmFnZXMgYSBwb29sIG9mIHRocmVhZHMuIEl0IHVzZXMgYSBUaHJlYWRGYWN0b3J5IHRvIGNyZWF0ZQorICogdGhyZWFkcy4gIEl0IG5ldmVyIGFjdHVhbGx5IGNyZWF0ZXMgb3IgZGVzdHJveXMgd29ya2VyIHRocmVhZHMsIHJhdGhlcgorICogaXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAorICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzLgorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgbW9uaXRvcnMgdXNlZCBmb3Igc2lnbmFsaW5nIGRpZmZlcmVudCBjb25kaXRpb25zCisgKiBob3dldmVyIHRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lIG11dGV4Xy4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsIDogcHVibGljIFRocmVhZE1hbmFnZXIgeworCitwdWJsaWM6CisgIEltcGwoKQorICAgIDogd29ya2VyQ291bnRfKDApLAorICAgICAgd29ya2VyTWF4Q291bnRfKDApLAorICAgICAgaWRsZUNvdW50XygwKSwKKyAgICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfKDApLAorICAgICAgZXhwaXJlZENvdW50XygwKSwKKyAgICAgIHN0YXRlXyhUaHJlYWRNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSwKKyAgICAgIG1vbml0b3JfKCZtdXRleF8pLAorICAgICAgbWF4TW9uaXRvcl8oJm11dGV4XyksCisgICAgICB3b3JrZXJNb25pdG9yXygmbXV0ZXhfKSB7fQorCisgIH5JbXBsKCkgeyBzdG9wKCk7IH0KKworICB2b2lkIHN0YXJ0KCk7CisgIHZvaWQgc3RvcCgpOworCisgIFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfOyB9CisKKyAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gdGhyZWFkRmFjdG9yeV87CisgIH0KKworICB2b2lkIHRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICBpZiAodGhyZWFkRmFjdG9yeV8gJiYgdGhyZWFkRmFjdG9yeV8tPmlzRGV0YWNoZWQoKSAhPSB2YWx1ZS0+aXNEZXRhY2hlZCgpKSB7CisgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhyZWFkRmFjdG9yeV8gPSB2YWx1ZTsKKyAgfQorCisgIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZSk7CisKKyAgdm9pZCByZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlKTsKKworICBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgeyByZXR1cm4gaWRsZUNvdW50XzsgfQorCisgIHNpemVfdCB3b3JrZXJDb3VudCgpIGNvbnN0IHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIHdvcmtlckNvdW50XzsKKyAgfQorCisgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50KCkgY29uc3QgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gdGFza3NfLnNpemUoKTsKKyAgfQorCisgIHNpemVfdCB0b3RhbFRhc2tDb3VudCgpIGNvbnN0IHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIHRhc2tzXy5zaXplKCkgKyB3b3JrZXJDb3VudF8gLSBpZGxlQ291bnRfOworICB9CisKKyAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiBwZW5kaW5nVGFza0NvdW50TWF4XzsKKyAgfQorCisgIHNpemVfdCBleHBpcmVkVGFza0NvdW50KCkgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gZXhwaXJlZENvdW50XzsKKyAgfQorCisgIHZvaWQgcGVuZGluZ1Rhc2tDb3VudE1heChjb25zdCBzaXplX3QgdmFsdWUpIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcGVuZGluZ1Rhc2tDb3VudE1heF8gPSB2YWx1ZTsKKyAgfQorCisgIHZvaWQgYWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQsIGludDY0X3QgZXhwaXJhdGlvbik7CisKKyAgdm9pZCByZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisKKyAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKTsKKworICB2b2lkIHJlbW92ZUV4cGlyZWRUYXNrcygpIHsKKyAgICByZW1vdmVFeHBpcmVkKGZhbHNlKTsKKyAgfQorCisgIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spOworCitwcml2YXRlOgorICAvKioKKyAgICogUmVtb3ZlIG9uZSBvciBtb3JlIGV4cGlyZWQgdGFza3MuCisgICAqIFxwYXJhbVtpbl0gIGp1c3RPbmUgIGlmIHRydWUsIHRyeSB0byByZW1vdmUganVzdCBvbmUgdGFzayBhbmQgcmV0dXJuCisgICAqLworICB2b2lkIHJlbW92ZUV4cGlyZWQoYm9vbCBqdXN0T25lKTsKKworICAvKioKKyAgICogXHJldHVybnMgd2hldGhlciBpdCBpcyBhY2NlcHRhYmxlIHRvIGJsb2NrLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdGhyZWFkIGlkCisgICAqLworICBib29sIGNhblNsZWVwKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIExvd2VycyB0aGUgbWF4aW11bSB3b3JrZXIgY291bnQgYW5kIGJsb2NrcyB1bnRpbCBlbm91Z2ggd29ya2VyIHRocmVhZHMgY29tcGxldGUKKyAgICogdG8gZ2V0IHRvIHRoZSBuZXcgbWF4aW11bSB3b3JrZXIgbGltaXQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhY3F1aXJpbmcKKyAgICogYSBsb2NrIG9uIHRoZSBjbGFzcyBtdXRleF8uCisgICAqLworICB2b2lkIHJlbW92ZVdvcmtlcnNVbmRlckxvY2soc2l6ZV90IHZhbHVlKTsKKworICBzaXplX3Qgd29ya2VyQ291bnRfOworICBzaXplX3Qgd29ya2VyTWF4Q291bnRfOworICBzaXplX3QgaWRsZUNvdW50XzsKKyAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXhfOworICBzaXplX3QgZXhwaXJlZENvdW50XzsKKyAgRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2tfOworCisgIFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlXzsKKyAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKKworICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6VGFzazsKKyAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNoYXJlZF9wdHI8VGFzaz4gPiBUYXNrUXVldWU7CisgIFRhc2tRdWV1ZSB0YXNrc187CisgIE11dGV4IG11dGV4XzsKKyAgTW9uaXRvciBtb25pdG9yXzsKKyAgTW9uaXRvciBtYXhNb25pdG9yXzsKKyAgTW9uaXRvciB3b3JrZXJNb25pdG9yXzsgICAgICAgLy8gdXNlZCB0byBzeW5jaHJvbml6ZSBjaGFuZ2VzIGluIHdvcmtlciBjb3VudAorCisgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7CisgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHdvcmtlcnNfOworICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBkZWFkV29ya2Vyc187CisgIHN0ZDo6bWFwPGNvbnN0IFRocmVhZDo6aWRfdCwgc2hhcmVkX3B0cjxUaHJlYWQ+ID4gaWRNYXBfOworfTsKKworY2xhc3MgVGhyZWFkTWFuYWdlcjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IFdBSVRJTkcsIEVYRUNVVElORywgVElNRURPVVQsIENPTVBMRVRFIH07CisKKyAgVGFzayhzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSwgaW50NjRfdCBleHBpcmF0aW9uID0gMExMKQorICAgIDogcnVubmFibGVfKHJ1bm5hYmxlKSwKKyAgICAgIHN0YXRlXyhXQUlUSU5HKSwKKyAgICAgIGV4cGlyZVRpbWVfKGV4cGlyYXRpb24gIT0gMExMID8gVXRpbDo6Y3VycmVudFRpbWUoKSArIGV4cGlyYXRpb24gOiAwTEwpIHt9CisKKyAgflRhc2soKSB7fQorCisgIHZvaWQgcnVuKCkgeworICAgIGlmIChzdGF0ZV8gPT0gRVhFQ1VUSU5HKSB7CisgICAgICBydW5uYWJsZV8tPnJ1bigpOworICAgICAgc3RhdGVfID0gQ09NUExFVEU7CisgICAgfQorICB9CisKKyAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gZ2V0UnVubmFibGUoKSB7IHJldHVybiBydW5uYWJsZV87IH0KKworICBpbnQ2NF90IGdldEV4cGlyZVRpbWUoKSBjb25zdCB7IHJldHVybiBleHBpcmVUaW1lXzsgfQorCitwcml2YXRlOgorICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87CisgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7CisgIFNUQVRFIHN0YXRlXzsKKyAgaW50NjRfdCBleHBpcmVUaW1lXzsKK307CisKK2NsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlciA6IHB1YmxpYyBSdW5uYWJsZSB7CisgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKKworcHVibGljOgorICBXb3JrZXIoVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcikgOiBtYW5hZ2VyXyhtYW5hZ2VyKSwgc3RhdGVfKFVOSU5JVElBTElaRUQpIHt9CisKKyAgfldvcmtlcigpIHt9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNBY3RpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIChtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDw9IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pCisgICAgICAgICAgIHx8IChtYW5hZ2VyXy0+c3RhdGVfID09IEpPSU5JTkcgJiYgIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSk7CisgIH0KKworcHVibGljOgorICAvKioKKyAgICogV29ya2VyIGVudHJ5IHBvaW50CisgICAqCisgICAqIEFzIGxvbmcgYXMgd29ya2VyIHRocmVhZCBpcyBydW5uaW5nLCBwdWxsIHRhc2tzIG9mZiB0aGUgdGFzayBxdWV1ZSBhbmQKKyAgICogZXhlY3V0ZS4KKyAgICovCisgIHZvaWQgcnVuKCkgeworICAgIEd1YXJkIGcobWFuYWdlcl8tPm11dGV4Xyk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhyZWUgcGFydHM7IG9uZSBpcyB0byBjaGVjayBmb3IgYW5kIGFjY291bnQgZm9yCisgICAgICogYWRtaXR0aW5nIGEgdGFzayB3aGljaCBoYXBwZW5zIHVuZGVyIGEgbG9jay4gIFRoZW4gdGhlIGxvY2sgaXMgcmVsZWFzZWQKKyAgICAgKiBhbmQgdGhlIHRhc2sgaXRzZWxmIGlzIGV4ZWN1dGVkLiAgRmluYWxseSB3ZSBkbyBzb21lIGFjY291bnRpbmcKKyAgICAgKiB1bmRlciBsb2NrIGFnYWluIHdoZW4gdGhlIHRhc2sgY29tcGxldGVzLgorICAgICAqLworCisgICAgLyoqCisgICAgICogQWRtaXR0aW5nCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgd29ya2VyIHNlbWFwaG9yZSBhbmQgbm90aWZ5IG1hbmFnZXIgaWYgd29ya2VyIGNvdW50IHJlYWNoZWQKKyAgICAgKiBkZXNpcmVkIG1heAorICAgICAqLworICAgIGJvb2wgYWN0aXZlID0gbWFuYWdlcl8tPndvcmtlckNvdW50XyA8IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF87CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgaWYgKCsrbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKSB7CisgICAgICAgIG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoYWN0aXZlKSB7CisgICAgICAvKioKKyAgICAgICAgKiBXaGlsZSBob2xkaW5nIG1hbmFnZXIgbW9uaXRvciBibG9jayBmb3Igbm9uLWVtcHR5IHRhc2sgcXVldWUgKEFsc28KKyAgICAgICAgKiBjaGVjayB0aGF0IHRoZSB0aHJlYWQgaGFzbid0IGJlZW4gcmVxdWVzdGVkIHRvIHN0b3ApLiBPbmNlIHRoZSBxdWV1ZQorICAgICAgICAqIGlzIG5vbi1lbXB0eSwgZGVxdWV1ZSBhIHRhc2ssIHJlbGVhc2UgbW9uaXRvciwgYW5kIGV4ZWN1dGUuIElmIHRoZQorICAgICAgICAqIHdvcmtlciBtYXggY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgc3VjaCB0aGF0IHdlIGV4Y2VlZCBpdCwgbWFyaworICAgICAgICAqIG91cnNlbGYgaW5hY3RpdmUsIGRlY3JlbWVudCB0aGUgd29ya2VyIGNvdW50IGFuZCBub3RpZnkgdGhlIG1hbmFnZXIKKyAgICAgICAgKiAodGVjaG5pY2FsbHkgd2UncmUgbm90aWZ5aW5nIHRoZSBuZXh0IGJsb2NrZWQgdGhyZWFkIGJ1dCBldmVudHVhbGx5CisgICAgICAgICogdGhlIG1hbmFnZXIgd2lsbCBzZWUgaXQuCisgICAgICAgICovCisgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOworCisgICAgICB3aGlsZSAoYWN0aXZlICYmIG1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgeworICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50XysrOworICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCgpOworICAgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOworICAgICAgICBtYW5hZ2VyXy0+aWRsZUNvdW50Xy0tOworICAgICAgfQorCisgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2s7CisKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgaWYgKCFtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKKyAgICAgICAgICB0YXNrID0gbWFuYWdlcl8tPnRhc2tzXy5mcm9udCgpOworICAgICAgICAgIG1hbmFnZXJfLT50YXNrc18ucG9wX2Zyb250KCk7CisgICAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpXQUlUSU5HKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgY2hhbmdlZCB0byBhbnl0aGluZyBvdGhlciB0aGFuIEVYRUNVVElORyBvciBUSU1FRE9VVCBoZXJlCisgICAgICAgICAgICAvLyB0aGVuIHRoZSBleGVjdXRpb24gbG9vcCBuZWVkcyB0byBiZSBjaGFuZ2VkIGJlbG93LgorICAgICAgICAgICAgdGFzay0+c3RhdGVfID0KKyAgICAgICAgICAgICAgICAodGFzay0+Z2V0RXhwaXJlVGltZSgpICYmIHRhc2stPmdldEV4cGlyZVRpbWUoKSA8IFV0aWw6OmN1cnJlbnRUaW1lKCkpID8KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkTWFuYWdlcjo6VGFzazo6VElNRURPVVQgOgorICAgICAgICAgICAgICAgICAgICBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkc7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgdGFzayBtYXggYW5kIHdlIGp1c3QgZHJvcHBlZCBiZWxvdyBpdCwgd2FrZXVwIGFueQorICAgICAgICAgICAgdGhyZWFkIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBvbiBhZGQuICovCisgICAgICAgIGlmIChtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gIT0gMAorICAgICAgICAgICAgJiYgbWFuYWdlcl8tPnRhc2tzXy5zaXplKCkgPD0gbWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfIC0gMSkgeworICAgICAgICAgIG1hbmFnZXJfLT5tYXhNb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEV4ZWN1dGlvbiAtIG5vdCBob2xkaW5nIGEgbG9jaworICAgICAgICovCisgICAgICBpZiAodGFzaykgeworICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORykgeworCisgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgbG9jayBzbyB3ZSBjYW4gcnVuIHRoZSB0YXNrIHdpdGhvdXQgYmxvY2tpbmcgdGhlIHRocmVhZCBtYW5hZ2VyCisgICAgICAgICAgbWFuYWdlcl8tPm11dGV4Xy51bmxvY2soKTsKKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXNrLT5ydW4oKTsKKyAgICAgICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiW0VSUk9SXSB0YXNrLT5ydW4oKSByYWlzZWQgYW4gZXhjZXB0aW9uOiAlcyIsIGUud2hhdCgpKTsKKyAgICAgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gdGFzay0+cnVuKCkgcmFpc2VkIGFuIHVua25vd24gZXhjZXB0aW9uIik7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gUmUtYWNxdWlyZSB0aGUgbG9jayB0byBwcm9jZWVkIGluIHRoZSB0aHJlYWQgbWFuYWdlcgorICAgICAgICAgIG1hbmFnZXJfLT5tdXRleF8ubG9jaygpOworCisgICAgICAgIH0gZWxzZSBpZiAobWFuYWdlcl8tPmV4cGlyZUNhbGxiYWNrXykgeworICAgICAgICAgIC8vIFRoZSBvbmx5IG90aGVyIHN0YXRlIHRoZSB0YXNrIGNvdWxkIGhhdmUgYmVlbiBpbiBpcyBUSU1FRE9VVCAoc2VlIGFib3ZlKQorICAgICAgICAgIG1hbmFnZXJfLT5leHBpcmVDYWxsYmFja18odGFzay0+Z2V0UnVubmFibGUoKSk7CisgICAgICAgICAgbWFuYWdlcl8tPmV4cGlyZWRDb3VudF8rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmFsIGFjY291bnRpbmcgZm9yIHRoZSB3b3JrZXIgdGhyZWFkIHRoYXQgaXMgZG9uZSB3b3JraW5nCisgICAgICovCisgICAgbWFuYWdlcl8tPmRlYWRXb3JrZXJzXy5pbnNlcnQodGhpcy0+dGhyZWFkKCkpOworICAgIGlmICgtLW1hbmFnZXJfLT53b3JrZXJDb3VudF8gPT0gbWFuYWdlcl8tPndvcmtlck1heENvdW50XykgeworICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyXzsKKyAgZnJpZW5kIGNsYXNzIFRocmVhZE1hbmFnZXI6OkltcGw7CisgIFNUQVRFIHN0YXRlXzsKK307CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkV29ya2VyKHNpemVfdCB2YWx1ZSkgeworICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBuZXdUaHJlYWRzOworICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgdmFsdWU7IGl4KyspIHsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyCisgICAgICAgID0gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXIodGhpcykpOworICAgIG5ld1RocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQod29ya2VyKSk7CisgIH0KKworICBHdWFyZCBnKG11dGV4Xyk7CisgIHdvcmtlck1heENvdW50XyArPSB2YWx1ZTsKKyAgd29ya2Vyc18uaW5zZXJ0KG5ld1RocmVhZHMuYmVnaW4oKSwgbmV3VGhyZWFkcy5lbmQoKSk7CisKKyAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBuZXdUaHJlYWRzLmJlZ2luKCk7IGl4ICE9IG5ld1RocmVhZHMuZW5kKCk7CisgICAgICAgKytpeCkgeworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPiB3b3JrZXIKKyAgICAgICAgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxUaHJlYWRNYW5hZ2VyOjpXb3JrZXIsIFJ1bm5hYmxlPigoKml4KS0+cnVubmFibGUoKSk7CisgICAgd29ya2VyLT5zdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI6OlNUQVJUSU5HOworICAgICgqaXgpLT5zdGFydCgpOworICAgIGlkTWFwXy5pbnNlcnQoc3RkOjpwYWlyPGNvbnN0IFRocmVhZDo6aWRfdCwgc2hhcmVkX3B0cjxUaHJlYWQ+ID4oKCppeCktPmdldElkKCksICppeCkpOworICB9CisKKyAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKKyAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7CisgIH0KK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdGFydCgpIHsKKyAgR3VhcmQgZyhtdXRleF8pOworICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlfKSB7CisgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRDsKKyAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKKyAgfQorCisgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKKyAgICBtb25pdG9yXy53YWl0KCk7CisgIH0KK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdG9wKCkgeworICBHdWFyZCBnKG11dGV4Xyk7CisgIGJvb2wgZG9TdG9wID0gZmFsc2U7CisKKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUElORyAmJiBzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6Sk9JTklORworICAgICAgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKKyAgICBkb1N0b3AgPSB0cnVlOworICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkc7CisgIH0KKworICBpZiAoZG9TdG9wKSB7CisgICAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh3b3JrZXJDb3VudF8pOworICB9CisKKyAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRDsKK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh2YWx1ZSk7Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlV29ya2Vyc1VuZGVyTG9jayhzaXplX3QgdmFsdWUpIHsKKyAgaWYgKHZhbHVlID4gd29ya2VyTWF4Q291bnRfKSB7CisgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgIH0KKworICB3b3JrZXJNYXhDb3VudF8gLT0gdmFsdWU7CisKKyAgaWYgKGlkbGVDb3VudF8gPiB2YWx1ZSkgeworICAgIC8vIFRoZXJlIGFyZSBtb3JlIGlkbGUgd29ya2VycyB0aGFuIHdlIG5lZWQgdG8gcmVtb3ZlLAorICAgIC8vIHNvIG5vdGlmeSBlbm91Z2ggb2YgdGhlbSBzbyB0aGV5IGNhbiB0ZXJtaW5hdGUuCisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHZhbHVlOyBpeCsrKSB7CisgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gVGhlcmUgYXJlIGFzIG1hbnkgb3IgbGVzcyBpZGxlIHdvcmtlcnMgdGhhbiB3ZSBuZWVkIHRvIHJlbW92ZSwKKyAgICAvLyBzbyBqdXN0IG5vdGlmeSB0aGVtIGFsbCBzbyB0aGV5IGNhbiB0ZXJtaW5hdGUuCisgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7CisgIH0KKworICB3aGlsZSAod29ya2VyQ291bnRfICE9IHdvcmtlck1heENvdW50XykgeworICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKKyAgfQorCisgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gZGVhZFdvcmtlcnNfLmJlZ2luKCk7CisgICAgICAgaXggIT0gZGVhZFdvcmtlcnNfLmVuZCgpOworICAgICAgICsraXgpIHsKKworICAgIC8vIHdoZW4gdXNlZCB3aXRoIGEgam9pbmFibGUgdGhyZWFkIGZhY3RvcnksIHdlIGpvaW4gdGhlIHRocmVhZHMgYXMgd2UgcmVtb3ZlIHRoZW0KKyAgICBpZiAoIXRocmVhZEZhY3RvcnlfLT5pc0RldGFjaGVkKCkpIHsKKyAgICAgICgqaXgpLT5qb2luKCk7CisgICAgfQorCisgICAgaWRNYXBfLmVyYXNlKCgqaXgpLT5nZXRJZCgpKTsKKyAgICB3b3JrZXJzXy5lcmFzZSgqaXgpOworICB9CisKKyAgZGVhZFdvcmtlcnNfLmNsZWFyKCk7Cit9CisKK2Jvb2wgVGhyZWFkTWFuYWdlcjo6SW1wbDo6Y2FuU2xlZXAoKSBjb25zdCB7CisgIGNvbnN0IFRocmVhZDo6aWRfdCBpZCA9IHRocmVhZEZhY3RvcnlfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgcmV0dXJuIGlkTWFwXy5maW5kKGlkKSA9PSBpZE1hcF8uZW5kKCk7Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQsIGludDY0X3QgZXhwaXJhdGlvbikgeworICBHdWFyZCBnKG11dGV4XywgdGltZW91dCk7CisKKyAgaWYgKCFnKSB7CisgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKKyAgfQorCisgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRCkgeworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgIlRocmVhZE1hbmFnZXI6OkltcGw6OmFkZCBUaHJlYWRNYW5hZ2VyICIKKyAgICAgICAgIm5vdCBzdGFydGVkIik7CisgIH0KKworICAvLyBpZiB3ZSdyZSBhdCBhIGxpbWl0LCByZW1vdmUgYW4gZXhwaXJlZCB0YXNrIHRvIHNlZSBpZiB0aGUgbGltaXQgY2xlYXJzCisgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7CisgICAgcmVtb3ZlRXhwaXJlZCh0cnVlKTsKKyAgfQorCisgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7CisgICAgaWYgKGNhblNsZWVwKCkgJiYgdGltZW91dCA+PSAwKSB7CisgICAgICB3aGlsZSAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmIHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aHJlYWQgc2FmZSBiZWNhdXNlIHRoZSBtdXRleCBpcyBzaGFyZWQgYmV0d2VlbiBtb25pdG9ycy4KKyAgICAgICAgbWF4TW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIHRhc2tzXy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlcjo6VGFzayh2YWx1ZSwgZXhwaXJhdGlvbikpKTsKKworICAvLyBJZiBpZGxlIHRocmVhZCBpcyBhdmFpbGFibGUgbm90aWZ5IGl0LCBvdGhlcndpc2UgYWxsIHdvcmtlciB0aHJlYWRzIGFyZQorICAvLyBydW5uaW5nIGFuZCB3aWxsIGdldCBhcm91bmQgdG8gdGhpcyB0YXNrIGluIHRpbWUuCisgIGlmIChpZGxlQ291bnRfID4gMCkgeworICAgIG1vbml0b3JfLm5vdGlmeSgpOworICB9Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKKyAgR3VhcmQgZyhtdXRleF8pOworICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICJUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUgVGhyZWFkTWFuYWdlciBub3QgIgorICAgICAgICAic3RhcnRlZCIpOworICB9CisKKyAgZm9yIChUYXNrUXVldWU6Oml0ZXJhdG9yIGl0ID0gdGFza3NfLmJlZ2luKCk7IGl0ICE9IHRhc2tzXy5lbmQoKTsgKytpdCkKKyAgeworICAgIGlmICgoKml0KS0+Z2V0UnVubmFibGUoKSA9PSB0YXNrKQorICAgIHsKKyAgICAgIHRhc2tzXy5lcmFzZShpdCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcoKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAiVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcgIgorICAgICAgICAiVGhyZWFkTWFuYWdlciBub3Qgc3RhcnRlZCIpOworICB9CisKKyAgaWYgKHRhc2tzXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oKTsKKyAgfQorCisgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzayA9IHRhc2tzXy5mcm9udCgpOworICB0YXNrc18ucG9wX2Zyb250KCk7CisKKyAgcmV0dXJuIHRhc2stPmdldFJ1bm5hYmxlKCk7Cit9CisKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlRXhwaXJlZChib29sIGp1c3RPbmUpIHsKKyAgLy8gdGhpcyBpcyBhbHdheXMgY2FsbGVkIHVuZGVyIGEgbG9jaworICBpbnQ2NF90IG5vdyA9IDBMTDsKKworICBmb3IgKFRhc2tRdWV1ZTo6aXRlcmF0b3IgaXQgPSB0YXNrc18uYmVnaW4oKTsgaXQgIT0gdGFza3NfLmVuZCgpOyApCisgIHsKKyAgICBpZiAobm93ID09IDBMTCkgeworICAgICAgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICB9CisKKyAgICBpZiAoKCppdCktPmdldEV4cGlyZVRpbWUoKSA+IDBMTCAmJiAoKml0KS0+Z2V0RXhwaXJlVGltZSgpIDwgbm93KSB7CisgICAgICBpZiAoZXhwaXJlQ2FsbGJhY2tfKSB7CisgICAgICAgIGV4cGlyZUNhbGxiYWNrXygoKml0KS0+Z2V0UnVubmFibGUoKSk7CisgICAgICB9CisgICAgICBpdCA9IHRhc2tzXy5lcmFzZShpdCk7CisgICAgICArK2V4cGlyZWRDb3VudF87CisgICAgICBpZiAoanVzdE9uZSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICArK2l0OworICAgIH0KKyAgfQorfQorCit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnNldEV4cGlyZUNhbGxiYWNrKEV4cGlyZUNhbGxiYWNrIGV4cGlyZUNhbGxiYWNrKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgZXhwaXJlQ2FsbGJhY2tfID0gZXhwaXJlQ2FsbGJhY2s7Cit9CisKK2NsYXNzIFNpbXBsZVRocmVhZE1hbmFnZXIgOiBwdWJsaWMgVGhyZWFkTWFuYWdlcjo6SW1wbCB7CisKK3B1YmxpYzoKKyAgU2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3Qgd29ya2VyQ291bnQgPSA0LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCA9IDApCisgICAgOiB3b3JrZXJDb3VudF8od29ya2VyQ291bnQpLCBwZW5kaW5nVGFza0NvdW50TWF4XyhwZW5kaW5nVGFza0NvdW50TWF4KSB7fQorCisgIHZvaWQgc3RhcnQoKSB7CisgICAgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cGVuZGluZ1Rhc2tDb3VudE1heChwZW5kaW5nVGFza0NvdW50TWF4Xyk7CisgICAgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKTsKKyAgICBhZGRXb3JrZXIod29ya2VyQ291bnRfKTsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBzaXplX3Qgd29ya2VyQ291bnRfOworICBjb25zdCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heF87Cit9OworCitzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IFRocmVhZE1hbmFnZXI6Om5ld1RocmVhZE1hbmFnZXIoKSB7CisgIHJldHVybiBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpJbXBsKCkpOworfQorCitzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4KSB7CisgIHJldHVybiBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KG5ldyBTaW1wbGVUaHJlYWRNYW5hZ2VyKGNvdW50LCBwZW5kaW5nVGFza0NvdW50TWF4KSk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwZmMwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRE1BTkFHRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfIDEKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogVGhyZWFkIFBvb2wgTWFuYWdlciBhbmQgcmVsYXRlZCBjbGFzc2VzCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgVGhyZWFkTWFuYWdlcjsKKworLyoqCisgKiBUaHJlYWRNYW5hZ2VyIGNsYXNzCisgKgorICogVGhpcyBjbGFzcyBtYW5hZ2VzIGEgcG9vbCBvZiB0aHJlYWRzLiBJdCB1c2VzIGEgVGhyZWFkRmFjdG9yeSB0byBjcmVhdGUKKyAqIHRocmVhZHMuIEl0IG5ldmVyIGFjdHVhbGx5IGNyZWF0ZXMgb3IgZGVzdHJveXMgd29ya2VyIHRocmVhZHMsIHJhdGhlcgorICogaXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAorICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzIGFuZCBpbmZvcm1zIHRoZSBQb29sUG9saWN5CisgKiBvYmplY3QgYm91bmQgdG8gaW5zdGFuY2VzIG9mIHRoaXMgbWFuYWdlciBvZiBpbnRlcmVzdGluZyB0cmFuc2l0aW9ucy4gSXQgaXMKKyAqIHRoZW4gdXAgdGhlIFBvb2xQb2xpY3kgb2JqZWN0IHRvIGRlY2lkZSBpZiB0aGUgdGhyZWFkIHBvb2wgc2l6ZSBuZWVkcyB0byBiZQorICogYWRqdXN0ZWQgYW5kIGNhbGwgdGhpcyBvYmplY3QgYWRkV29ya2VyIGFuZCByZW1vdmVXb3JrZXIgbWV0aG9kcyB0byBtYWtlCisgKiBjaGFuZ2VzLgorICoKKyAqIFRoaXMgZGVzaWduIGFsbG93cyBkaWZmZXJlbnQgcG9saWN5IGltcGxlbWVudGF0aW9ucyB0byB1c2UgdGhpcyBjb2RlIHRvCisgKiBoYW5kbGUgYmFzaWMgd29ya2VyIHRocmVhZCBtYW5hZ2VtZW50IGFuZCB3b3JrZXIgdGFzayBleGVjdXRpb24gYW5kIGZvY3VzIG9uCisgKiBwb2xpY3kgaXNzdWVzLiBUaGUgc2ltcGxlc3QgcG9saWN5LCBTdGF0aWNQb2xpY3ksIGRvZXMgbm90aGluZyBvdGhlciB0aGFuCisgKiBjcmVhdGUgYSBmaXhlZCBudW1iZXIgb2YgdGhyZWFkcy4KKyAqLworY2xhc3MgVGhyZWFkTWFuYWdlciB7CisKK3Byb3RlY3RlZDoKKyAgVGhyZWFkTWFuYWdlcigpIHt9CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPik+IEV4cGlyZUNhbGxiYWNrOworCisgIHZpcnR1YWwgflRocmVhZE1hbmFnZXIoKSB7fQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHRocmVhZCBtYW5hZ2VyLiBWZXJpZmllcyBhbGwgYXR0cmlidXRlcyBoYXZlIGJlZW4gcHJvcGVybHkKKyAgICogaW5pdGlhbGl6ZWQsIHRoZW4gYWxsb2NhdGVzIG5lY2Vzc2FyeSByZXNvdXJjZXMgdG8gYmVnaW4gb3BlcmF0aW9uCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CisKKyAgLyoqCisgICAqIFN0b3BzIHRoZSB0aHJlYWQgbWFuYWdlci4gQWJvcnRzIGFsbCByZW1haW5pbmcgdW5wcm9jZXNzZWQgdGFzaywgc2h1dHMKKyAgICogZG93biBhbGwgY3JlYXRlZCB3b3JrZXIgdGhyZWFkcywgYW5kIHJlbGVhc2VzIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzLgorICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBjb21wbGV0ZSwgdGh1cyBpdCBjYW4KKyAgICogcG90ZW50aWFsbHkgYmxvY2sgZm9yZXZlciBpZiBhIHdvcmtlciB0aHJlYWQgaXMgcnVubmluZyBhIHRhc2sgdGhhdAorICAgKiB3b24ndCB0ZXJtaW5hdGUuCisgICAqCisgICAqIFdvcmtlciB0aHJlYWRzIHdpbGwgYmUgam9pbmVkIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkRmFjdG9yeSdzIGRldGFjaGVkCisgICAqIGRpc3Bvc2l0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHN0b3AoKSA9IDA7CisKKyAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBKT0lOSU5HLCBTVE9QUElORywgU1RPUFBFRCB9OworCisgIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIFxyZXR1cm5zIHRoZSBjdXJyZW50IHRocmVhZCBmYWN0b3J5CisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBTZXQgdGhlIHRocmVhZCBmYWN0b3J5LgorICAgKiBcdGhyb3dzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmV3IHRocmVhZCBmYWN0b3J5IGhhcyBhIGRpZmZlcmVudAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZCBkaXNwb3NpdGlvbiB0aGFuIHRoZSBvbmUgcmVwbGFjaW5nIGl0CisgICAqLworICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpID0gMDsKKworICAvKioKKyAgICogQWRkcyB3b3JrZXIgdGhyZWFkKHMpLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGFkZFdvcmtlcihzaXplX3QgdmFsdWUgPSAxKSA9IDA7CisKKyAgLyoqCisgICAqIFJlbW92ZXMgd29ya2VyIHRocmVhZChzKS4KKyAgICogVGhyZWFkcyBhcmUgam9pbmVkIGlmIHRoZSB0aHJlYWQgZmFjdG9yeSBkZXRhY2hlZCBkaXNwb3NpdGlvbiBhbGxvd3MgaXQuCisgICAqIEJsb2NrcyB1bnRpbCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHJlYWNoZXMgdGhlIG5ldyBsaW1pdC4KKyAgICogXHBhcmFtW2luXSAgdmFsdWUgIHRoZSBudW1iZXIgdG8gcmVtb3ZlCisgICAqIFx0aHJvd3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB3b3JrZXJzCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZSA9IDEpID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgaWRsZSB3b3JrZXIgdGhyZWFkcworICAgKi8KKyAgdmlydHVhbCBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgPSAwOworCisgIC8qKgorICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiB0b3RhbCB3b3JrZXIgdGhyZWFkcworICAgKi8KKyAgdmlydHVhbCBzaXplX3Qgd29ya2VyQ291bnQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBlbmRpbmcgdGFza3MKKyAgICovCisgIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBlbmRpbmcgYW5kIGV4ZWN1dGluZyB0YXNrcworICAgKi8KKyAgdmlydHVhbCBzaXplX3QgdG90YWxUYXNrQ291bnQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIG1heGltdW0gcGVuZGluZyB0YXNrIGNvdW50LiAgMCBpbmRpY2F0ZXMgbm8gbWF4aW11bQorICAgKi8KKyAgdmlydHVhbCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBleHBpcmVkIHdpdGhvdXQgYmVpbmcgcnVuCisgICAqIHNpbmNlIHN0YXJ0KCkgd2FzIGNhbGxlZC4KKyAgICovCisgIHZpcnR1YWwgc2l6ZV90IGV4cGlyZWRUYXNrQ291bnQoKSA9IDA7CisKKyAgLyoqCisgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KKyAgICoKKyAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayBpZiBwZW5kaW5nVGFza0NvdW50TWF4KCkgaW4gbm90IHplcm8gYW5kIHBlbmRpbmdUYXNrQ291bnQoKQorICAgKiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWx0IHRvIHBlbmRpbmdUYXNrQ291bnRNYXgoKS4gIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbiB0aGUKKyAgICogY29udGV4dCBvZiBhIFRocmVhZE1hbmFnZXIgd29ya2VyIHRocmVhZCBpdCB3aWxsIHRocm93IGEKKyAgICogVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbgorICAgKgorICAgKiBAcGFyYW0gdGFzayAgVGhlIHRhc2sgdG8gcXVldWUgZm9yIGV4ZWN1dGlvbgorICAgKgorICAgKiBAcGFyYW0gdGltZW91dCBUaW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFkZCBhIHRhc2sgd2hlbiBhIHBlbmRpbmctdGFzay1jb3VudAorICAgKiBpcyBzcGVjaWZpZWQuIFNwZWNpZmljIGNhc2VzOgorICAgKiB0aW1lb3V0ID0gMCAgOiBXYWl0IGZvcmV2ZXIgdG8gcXVldWUgdGFzay4KKyAgICogdGltZW91dCA9IC0xIDogUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIHNwZWNpZmllZCBtYXgKKyAgICogQHBhcmFtIGV4cGlyYXRpb24gd2hlbiBub256ZXJvLCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgdGFzayBpcyB2YWxpZAorICAgKiB0byBiZSBydW47IGlmIGV4Y2VlZGVkLCB0aGUgdGFzayB3aWxsIGJlIGRyb3BwZWQgb2ZmIHRoZSBxdWV1ZSBhbmQgbm90IHJ1bi4KKyAgICoKKyAgICogQHRocm93cyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIFBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIG1heCBwZW5kaW5nIHRhc2sgY291bnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTCwKKyAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb24gPSAwTEwpID0gMDsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzaworICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spID0gMDsKKworICAvKioKKyAgICogUmVtb3ZlIHRoZSBuZXh0IHBlbmRpbmcgdGFzayB3aGljaCB3b3VsZCBiZSBydW4uCisgICAqCisgICAqIEByZXR1cm4gdGhlIHRhc2sgcmVtb3ZlZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpID0gMDsKKworICAvKioKKyAgICogUmVtb3ZlIHRhc2tzIGZyb20gZnJvbnQgb2YgdGFzayBxdWV1ZSB0aGF0IGhhdmUgZXhwaXJlZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCByZW1vdmVFeHBpcmVkVGFza3MoKSA9IDA7CisKKyAgLyoqCisgICAqIFNldCBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgdGFzayBpcyBleHBpcmVkIGFuZCBub3QgcnVuLgorICAgKgorICAgKiBAcGFyYW0gZXhwaXJlQ2FsbGJhY2sgYSBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgc2hhcmVkX3B0cjxSdW5uYWJsZT4gZm9yCisgICAqIHRoZSBleHBpcmVkIHRhc2suCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spID0gMDsKKworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1RocmVhZE1hbmFnZXIoKTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIHNpbXBsZSB0aHJlYWQgbWFuYWdlciB0aGUgdXNlcyBjb3VudCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIGhhcworICAgKiBhIHBlbmRpbmdUYXNrQ291bnRNYXggbWF4aW11bSBwZW5kaW5nIHRhc2tzLiBUaGUgZGVmYXVsdCwgMCwgc3BlY2lmaWVkIG5vIGxpbWl0CisgICAqIG9uIHBlbmRpbmcgdGFza3MKKyAgICovCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3U2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3QgY291bnQgPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCA9IDApOworCisgIGNsYXNzIFRhc2s7CisKKyAgY2xhc3MgV29ya2VyOworCisgIGNsYXNzIEltcGw7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTM0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjp3ZWFrX3B0cjsKKworLyoqCisgKiBUaW1lck1hbmFnZXIgY2xhc3MKKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBUaW1lck1hbmFnZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworCitwdWJsaWM6CisgIGVudW0gU1RBVEUgeyBXQUlUSU5HLCBFWEVDVVRJTkcsIENBTkNFTExFRCwgQ09NUExFVEUgfTsKKworICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6IHJ1bm5hYmxlXyhydW5uYWJsZSksIHN0YXRlXyhXQUlUSU5HKSB7fQorCisgIH5UYXNrKCkge30KKworICB2b2lkIHJ1bigpIHsKKyAgICBpZiAoc3RhdGVfID09IEVYRUNVVElORykgeworICAgICAgcnVubmFibGVfLT5ydW4oKTsKKyAgICAgIHN0YXRlXyA9IENPTVBMRVRFOworICAgIH0KKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzaGFyZWRfcHRyPFJ1bm5hYmxlPiAmIHJ1bm5hYmxlKSBjb25zdCB7IHJldHVybiBydW5uYWJsZV8gPT0gcnVubmFibGU7IH0KKworICB0YXNrX2l0ZXJhdG9yIGl0XzsKKworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGVfOworICBmcmllbmQgY2xhc3MgVGltZXJNYW5hZ2VyOjpEaXNwYXRjaGVyOworICBTVEFURSBzdGF0ZV87Cit9OworCitjbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXIgOiBwdWJsaWMgUnVubmFibGUgeworCitwdWJsaWM6CisgIERpc3BhdGNoZXIoVGltZXJNYW5hZ2VyKiBtYW5hZ2VyKSA6IG1hbmFnZXJfKG1hbmFnZXIpIHt9CisKKyAgfkRpc3BhdGNoZXIoKSB7fQorCisgIC8qKgorICAgKiBEaXNwYXRjaGVyIGVudHJ5IHBvaW50CisgICAqCisgICAqIEFzIGxvbmcgYXMgZGlzcGF0Y2hlciB0aHJlYWQgaXMgcnVubmluZywgcHVsbCB0YXNrcyBvZmYgdGhlIHRhc2sgdGFza01hcF8KKyAgICogYW5kIGV4ZWN1dGUuCisgICAqLworICB2b2lkIHJ1bigpIHsKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOworICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORykgeworICAgICAgICBtYW5hZ2VyXy0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEOworICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ubm90aWZ5QWxsKCk7CisgICAgICB9CisgICAgfQorCisgICAgZG8geworICAgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+ID4gZXhwaXJlZFRhc2tzOworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOworICAgICAgICB0YXNrX2l0ZXJhdG9yIGV4cGlyZWRUYXNrRW5kOworICAgICAgICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICAgIHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRAorICAgICAgICAgICAgICAgJiYgKGV4cGlyZWRUYXNrRW5kID0gbWFuYWdlcl8tPnRhc2tNYXBfLnVwcGVyX2JvdW5kKG5vdykpCisgICAgICAgICAgICAgICAgICA9PSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKSkgeworICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTDsKKyAgICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrTWFwXy5lbXB0eSgpKSB7CisgICAgICAgICAgICB0aW1lb3V0ID0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCktPmZpcnN0IC0gbm93OworICAgICAgICAgIH0KKyAgICAgICAgICBhc3NlcnQoKHRpbWVvdXQgIT0gMCAmJiBtYW5hZ2VyXy0+dGFza0NvdW50XyA+IDApCisgICAgICAgICAgICAgICAgIHx8ICh0aW1lb3V0ID09IDAgJiYgbWFuYWdlcl8tPnRhc2tDb3VudF8gPT0gMCkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKKyAgICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgICB9CisgICAgICAgICAgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgeworICAgICAgICAgIGZvciAodGFza19pdGVyYXRvciBpeCA9IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpOyBpeCAhPSBleHBpcmVkVGFza0VuZDsgaXgrKykgeworICAgICAgICAgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+IHRhc2sgPSBpeC0+c2Vjb25kOworICAgICAgICAgICAgZXhwaXJlZFRhc2tzLmluc2VydCh0YXNrKTsKKyAgICAgICAgICAgIHRhc2stPml0XyA9IG1hbmFnZXJfLT50YXNrTWFwXy5lbmQoKTsKKyAgICAgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpUYXNrOjpXQUlUSU5HKSB7CisgICAgICAgICAgICAgIHRhc2stPnN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFuYWdlcl8tPnRhc2tDb3VudF8tLTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWFuYWdlcl8tPnRhc2tNYXBfLmVyYXNlKG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpLCBleHBpcmVkVGFza0VuZCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gZXhwaXJlZFRhc2tzLmJlZ2luKCk7CisgICAgICAgICAgIGl4ICE9IGV4cGlyZWRUYXNrcy5lbmQoKTsKKyAgICAgICAgICAgKytpeCkgeworICAgICAgICAoKml4KS0+cnVuKCk7CisgICAgICB9CisKKyAgICB9IHdoaWxlIChtYW5hZ2VyXy0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+bW9uaXRvcl8pOworICAgICAgaWYgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVE9QUElORykgeworICAgICAgICBtYW5hZ2VyXy0+c3RhdGVfID0gVGltZXJNYW5hZ2VyOjpTVE9QUEVEOworICAgICAgICBtYW5hZ2VyXy0+bW9uaXRvcl8ubm90aWZ5KCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCitwcml2YXRlOgorICBUaW1lck1hbmFnZXIqIG1hbmFnZXJfOworICBmcmllbmQgY2xhc3MgVGltZXJNYW5hZ2VyOworfTsKKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDM1NSkgLy8gJ3RoaXMnIHVzZWQgaW4gYmFzZSBtZW1iZXIgaW5pdGlhbGl6ZXIgbGlzdAorI2VuZGlmCisKK1RpbWVyTWFuYWdlcjo6VGltZXJNYW5hZ2VyKCkKKyAgOiB0YXNrQ291bnRfKDApLAorICAgIHN0YXRlXyhUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAorICAgIGRpc3BhdGNoZXJfKHNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4obmV3IERpc3BhdGNoZXIodGhpcykpKSB7Cit9CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCitUaW1lck1hbmFnZXI6On5UaW1lck1hbmFnZXIoKSB7CisKKyAgLy8gSWYgd2UgaGF2ZW4ndCBiZWVuIGV4cGxpY2l0bHkgc3RvcHBlZCwgZG8gc28gbm93LiAgV2UgZG9uJ3QgbmVlZCB0byBncmFiCisgIC8vIHRoZSBtb25pdG9yIGhlcmUsIHNpbmNlIHN0b3AgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHJlZW50cmFuY3kuCisKKyAgaWYgKHN0YXRlXyAhPSBTVE9QUEVEKSB7CisgICAgdHJ5IHsKKyAgICAgIHN0b3AoKTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KKyAgICB9CisgIH0KK30KKwordm9pZCBUaW1lck1hbmFnZXI6OnN0YXJ0KCkgeworICBib29sIGRvU3RhcnQgPSBmYWxzZTsKKyAgeworICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlfKSB7CisgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaWYgKHN0YXRlXyA9PSBUaW1lck1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKKyAgICAgIHN0YXRlXyA9IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkc7CisgICAgICBkb1N0YXJ0ID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAoZG9TdGFydCkgeworICAgIGRpc3BhdGNoZXJUaHJlYWRfID0gdGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChkaXNwYXRjaGVyXyk7CisgICAgZGlzcGF0Y2hlclRocmVhZF8tPnN0YXJ0KCk7CisgIH0KKworICB7CisgICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIHdoaWxlIChzdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVElORykgeworICAgICAgbW9uaXRvcl8ud2FpdCgpOworICAgIH0KKyAgICBhc3NlcnQoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRJTkcpOworICB9Cit9CisKK3ZvaWQgVGltZXJNYW5hZ2VyOjpzdG9wKCkgeworICBib29sIGRvU3RvcCA9IGZhbHNlOworICB7CisgICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIGlmIChzdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7CisgICAgICBzdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUT1BQRUQ7CisgICAgfSBlbHNlIGlmIChzdGF0ZV8gIT0gU1RPUFBJTkcgJiYgc3RhdGVfICE9IFNUT1BQRUQpIHsKKyAgICAgIGRvU3RvcCA9IHRydWU7CisgICAgICBzdGF0ZV8gPSBTVE9QUElORzsKKyAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOworICAgIH0KKyAgICB3aGlsZSAoc3RhdGVfICE9IFNUT1BQRUQpIHsKKyAgICAgIG1vbml0b3JfLndhaXQoKTsKKyAgICB9CisgIH0KKworICBpZiAoZG9TdG9wKSB7CisgICAgLy8gQ2xlYW4gdXAgYW55IG91dHN0YW5kaW5nIHRhc2tzCisgICAgdGFza01hcF8uY2xlYXIoKTsKKworICAgIC8vIFJlbW92ZSBkaXNwYXRjaGVyJ3MgcmVmZXJlbmNlIHRvIHVzLgorICAgIGRpc3BhdGNoZXJfLT5tYW5hZ2VyXyA9IE5VTEw7CisgIH0KK30KKworc2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiBUaW1lck1hbmFnZXI6OnRocmVhZEZhY3RvcnkoKSBjb25zdCB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOworfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6dGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgdGhyZWFkRmFjdG9yeV8gPSB2YWx1ZTsKK30KKworc2l6ZV90IFRpbWVyTWFuYWdlcjo6dGFza0NvdW50KCkgY29uc3QgeworICByZXR1cm4gdGFza0NvdW50XzsKK30KKworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpIHsKKyAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICB0aW1lb3V0ICs9IG5vdzsKKworICB7CisgICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgdGFzayBtYXAgaXMgZW1wdHksIHdlIHdpbGwga2ljayB0aGUgZGlzcGF0Y2hlciBmb3Igc3VyZS4gT3RoZXJ3aXNlLCB3ZSBraWNrIGhpbQorICAgIC8vIGlmIHRoZSBleHBpcmF0aW9uIHRpbWUgaXMgc2hvcnRlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlLiBOZWVkIHRvIHRlc3QgYmVmb3JlIHdlIGluc2VydCwKKyAgICAvLyBiZWNhdXNlIHRoZSBuZXcgdGFzayBtaWdodCBpbnNlcnQgYXQgdGhlIGZyb250LgorICAgIGJvb2wgbm90aWZ5UmVxdWlyZWQgPSAodGFza0NvdW50XyA9PSAwKSA/IHRydWUgOiB0aW1lb3V0IDwgdGFza01hcF8uYmVnaW4oKS0+Zmlyc3Q7CisKKyAgICBzaGFyZWRfcHRyPFRhc2s+IHRpbWVyKG5ldyBUYXNrKHRhc2spKTsKKyAgICB0YXNrQ291bnRfKys7CisgICAgdGltZXItPml0XyA9IHRhc2tNYXBfLmluc2VydChzdGQ6OnBhaXI8aW50NjRfdCwgc2hhcmVkX3B0cjxUYXNrPiA+KHRpbWVvdXQsIHRpbWVyKSk7CisKKyAgICAvLyBJZiB0aGUgdGFzayBtYXAgd2FzIGVtcHR5LCBvciBpZiB3ZSBoYXZlIGFuIGV4cGlyYXRpb24gdGhhdCBpcyBlYXJsaWVyCisgICAgLy8gdGhhbiBhbnkgcHJldmlvdXNseSBzZWVuLCBraWNrIHRoZSBkaXNwYXRjaGVyIHNvIGl0IGNhbiB1cGRhdGUgaXRzCisgICAgLy8gdGltZW91dAorICAgIGlmIChub3RpZnlSZXF1aXJlZCkgeworICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRpbWVyOworICB9Cit9CisKK1RpbWVyTWFuYWdlcjo6VGltZXIgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywKKyAgICBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgeworCisgIGludDY0X3QgZXhwaXJhdGlvbjsKKyAgVXRpbDo6dG9NaWxsaXNlY29uZHMoZXhwaXJhdGlvbiwgdmFsdWUpOworCisgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICBpZiAoZXhwaXJhdGlvbiA8IG5vdykgeworICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICB9CisKKyAgcmV0dXJuIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKK30KKworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgeworCisgIGludDY0X3QgZXhwaXJhdGlvbjsKKyAgVXRpbDo6dG9NaWxsaXNlY29uZHMoZXhwaXJhdGlvbiwgdmFsdWUpOworCisgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICBpZiAoZXhwaXJhdGlvbiA8IG5vdykgeworICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICB9CisKKyAgcmV0dXJuIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKK30KKwordm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorICBib29sIGZvdW5kID0gZmFsc2U7CisgIGZvciAodGFza19pdGVyYXRvciBpeCA9IHRhc2tNYXBfLmJlZ2luKCk7IGl4ICE9IHRhc2tNYXBfLmVuZCgpOykgeworICAgIGlmICgqaXgtPnNlY29uZCA9PSB0YXNrKSB7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgICB0YXNrQ291bnRfLS07CisgICAgICB0YXNrTWFwXy5lcmFzZShpeCsrKTsKKyAgICB9IGVsc2UgeworICAgICAgKytpeDsKKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkgeworICAgIHRocm93IE5vU3VjaFRhc2tFeGNlcHRpb24oKTsKKyAgfQorfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKFRpbWVyIGhhbmRsZSkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICBzaGFyZWRfcHRyPFRhc2s+IHRhc2sgPSBoYW5kbGUubG9jaygpOworICBpZiAoIXRhc2spIHsKKyAgICB0aHJvdyBOb1N1Y2hUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICBpZiAodGFzay0+aXRfID09IHRhc2tNYXBfLmVuZCgpKSB7CisgICAgLy8gVGFzayBpcyBiZWluZyBleGVjdXRlZAorICAgIHRocm93IFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICB0YXNrTWFwXy5lcmFzZSh0YXNrLT5pdF8pOworICB0YXNrQ291bnRfLS07Cit9CisKK1RpbWVyTWFuYWdlcjo6U1RBVEUgVGltZXJNYW5hZ2VyOjpzdGF0ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRlXzsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3OTIyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVElNRVJNQU5BR0VSX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dGltZS5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBUaW1lciBNYW5hZ2VyCisgKgorICogVGhpcyBjbGFzcyBkaXNwYXRjaGVzIHRpbWVyIHRhc2tzIHdoZW4gdGhleSBmYWxsIGR1ZS4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBUaW1lck1hbmFnZXIgeworCitwdWJsaWM6CisgIGNsYXNzIFRhc2s7CisgIHR5cGVkZWYgc3RkOjp3ZWFrX3B0cjxUYXNrPiBUaW1lcjsKKworICBUaW1lck1hbmFnZXIoKTsKKworICB2aXJ0dWFsIH5UaW1lck1hbmFnZXIoKTsKKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIHRocmVhZEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKTsKKworICAvKioKKyAgICogU3RhcnRzIHRoZSB0aW1lciBtYW5hZ2VyIHNlcnZpY2UKKyAgICoKKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gTWlzc2luZyB0aHJlYWQgZmFjdG9yeSBhdHRyaWJ1dGUKKyAgICovCisgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworCisgIC8qKgorICAgKiBTdG9wcyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworCisgIHZpcnR1YWwgc2l6ZV90IHRhc2tDb3VudCgpIGNvbnN0OworCisgIC8qKgorICAgKiBBZGRzIGEgdGFzayB0byBiZSBleGVjdXRlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSBieSBhIHdvcmtlciB0aHJlYWQuCisgICAqCisgICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHRvIGV4ZWN1dGUKKyAgICogQHBhcmFtIHRpbWVvdXQgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIGV4ZWN1dGluZyB0YXNrCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIHRoZSB0aW1lciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSB0aW1lci4KKyAgICovCisgIHZpcnR1YWwgVGltZXIgYWRkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KTsKKworICAvKioKKyAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgorICAgKgorICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCisgICAqIEBwYXJhbSB0aW1lb3V0IEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIHRoZSB0aW1lciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSB0aW1lci4KKyAgICovCisgIHZpcnR1YWwgVGltZXIgYWRkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdGltZW91dCk7CisKKyAgLyoqCisgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KKyAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQorICAgKiBAcGFyYW0gdGltZW91dCBBYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZXhlY3V0ZSB0YXNrLgorICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCisgICAqLworICB2aXJ0dWFsIFRpbWVyIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB0aW1lb3V0KTsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzaworICAgKgorICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byByZW1vdmUuIEFsbCB0aW1lcnMgd2hpY2ggZXhlY3V0ZSB0aGlzIHRhc2sgd2lsbAorICAgKiBiZSByZW1vdmVkLgorICAgKiBAdGhyb3dzIE5vU3VjaFRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgZG9lc24ndCBleGlzdC4gSXQgd2FzIGVpdGhlcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGFscmVhZHkgb3IgdGhpcyBjYWxsIHdhcyBtYWRlIGZvciBhCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHRoYXQgd2FzIG5ldmVyIGFkZGVkIHRvIHRoaXMgdGltZXIKKyAgICoKKyAgICogQHRocm93cyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBpcyBhbHJlYWR5IGJlaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgb3IgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCisgICAqLworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSBzaW5nbGUgcGVuZGluZyB0YXNrCisgICAqCisgICAqIEBwYXJhbSB0aW1lciBUaGUgdGltZXIgdG8gcmVtb3ZlLiBUaGUgdGltZXIgaXMgcmV0dXJuZWQgd2hlbiBjYWxsaW5nIHRoZQorICAgKiBhZGQoKSBtZXRob2QuCisgICAqIEB0aHJvd3MgTm9TdWNoVGFza0V4Y2VwdGlvbiBTcGVjaWZpZWQgdGFzayBkb2Vzbid0IGV4aXN0LiBJdCB3YXMgZWl0aGVyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgYWxyZWFkeSBvciB0aGlzIGNhbGwgd2FzIG1hZGUgZm9yIGEKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgdGhhdCB3YXMgbmV2ZXIgYWRkZWQgdG8gdGhpcyB0aW1lcgorICAgKgorICAgKiBAdGhyb3dzIFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGlzIGFscmVhZHkgYmVpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBvciBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbi4KKyAgICovCisgIHZpcnR1YWwgdm9pZCByZW1vdmUoVGltZXIgdGltZXIpOworCisgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKKworICB2aXJ0dWFsIFNUQVRFIHN0YXRlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKKyAgZnJpZW5kIGNsYXNzIFRhc2s7CisgIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPFRhc2s+ID4gdGFza01hcF87CisgIHNpemVfdCB0YXNrQ291bnRfOworICBNb25pdG9yIG1vbml0b3JfOworICBTVEFURSBzdGF0ZV87CisgIGNsYXNzIERpc3BhdGNoZXI7CisgIGZyaWVuZCBjbGFzcyBEaXNwYXRjaGVyOworICBzdGQ6OnNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGRpc3BhdGNoZXJUaHJlYWRfOworICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gPjo6aXRlcmF0b3IgdGFza19pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8dGFza19pdGVyYXRvciwgdGFza19pdGVyYXRvcj4gdGFza19yYW5nZTsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNmQxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaWYgZGVmaW5lZChIQVZFX1NZU19USU1FX0gpCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworaW50NjRfdCBVdGlsOjpjdXJyZW50VGltZVRpY2tzKGludDY0X3QgdGlja3NQZXJTZWMpIHsKKyAgaW50NjRfdCByZXN1bHQ7CisgIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgaW50IHJldCA9IFRIUklGVF9HRVRUSU1FT0ZEQVkoJm5vdywgTlVMTCk7CisgIGFzc2VydChyZXQgPT0gMCk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsgLy8gc3F1ZWxjaGluZyAidW51c2VkIHZhcmlhYmxlIiB3YXJuaW5nCisgIHRvVGlja3MocmVzdWx0LCBub3csIHRpY2tzUGVyU2VjKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTkxNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVVRJTF9IXworI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8gMQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMKKyAqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGJhc2ljIHV0aWxpdHkgbWV0aG9kcyBmb3IgY29udmVydGluZyB0aW1lIGZvcm1hdHMsCisgKiBhbmQgb3RoZXIgY29tbW9uIHBsYXRmb3JtLWRlcGVuZGVudCBjb25jdXJyZW5jeSBvcGVyYXRpb25zLgorICogSXQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBBUEkgaGVhZGVycyBmb3Igb3RoZXIgY29uY3VycmVuY3kgbGlicmFyeQorICogaGVhZGVycywgc2luY2UgaXQgd2lsbCwgYnkgZGVmaW5pdGlvbiwgcHVsbCBpbiBhbGwgc29ydHMgb2YgaG9ycmlkCisgKiBwbGF0Zm9ybSBkZXBlbmRlbnQgc3R1ZmYuICBSYXRoZXIgaXQgc2hvdWxkIGJlIGlubHVkZWQgZGlyZWN0bHkgaW4KKyAqIGNvbmN1cnJlbmN5IGxpYnJhcnkgaW1wbGVtZW50YXRpb24gc291cmNlLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFV0aWwgeworCisgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5TX1BFUl9TID0gMTAwMDAwMDAwMExMOworICBzdGF0aWMgY29uc3QgaW50NjRfdCBVU19QRVJfUyA9IDEwMDAwMDBMTDsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgTVNfUEVSX1MgPSAxMDAwTEw7CisKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgTlNfUEVSX01TID0gTlNfUEVSX1MgLyBNU19QRVJfUzsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgTlNfUEVSX1VTID0gTlNfUEVSX1MgLyBVU19QRVJfUzsKKyAgc3RhdGljIGNvbnN0IGludDY0X3QgVVNfUEVSX01TID0gVVNfUEVSX1MgLyBNU19QRVJfUzsKKworcHVibGljOgorICAvKioKKyAgICogQ29udmVydHMgbWlsbGlzZWNvbmQgdGltZXN0YW1wIGludG8gYSBUSFJJRlRfVElNRVNQRUMgc3RydWN0CisgICAqCisgICAqIEBwYXJhbSBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiByZXN1bHQKKyAgICogQHBhcmFtIHRpbWUgb3IgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCisgICAqLworICBzdGF0aWMgdm9pZCB0b1RpbWVzcGVjKHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHJlc3VsdCwgaW50NjRfdCB2YWx1ZSkgeworICAgIHJlc3VsdC50dl9zZWMgPSB2YWx1ZSAvIE1TX1BFUl9TOyAgICAgICAgICAgICAgICAvLyBtcyB0byBzCisgICAgcmVzdWx0LnR2X25zZWMgPSAodmFsdWUgJSBNU19QRVJfUykgKiBOU19QRVJfTVM7IC8vIG1zIHRvIG5zCisgIH0KKworICBzdGF0aWMgdm9pZCB0b1RpbWV2YWwoc3RydWN0IHRpbWV2YWwmIHJlc3VsdCwgaW50NjRfdCB2YWx1ZSkgeworICAgIHJlc3VsdC50dl9zZWMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUgLyBNU19QRVJfUyk7ICAgICAgICAgICAgICAgIC8vIG1zIHRvIHMKKyAgICByZXN1bHQudHZfdXNlYyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigodmFsdWUgJSBNU19QRVJfUykgKiBVU19QRVJfTVMpOyAvLyBtcyB0byB1cworICB9CisKKyAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzZWNzLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2xkVGlja3MsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvbGRUaWNrc1BlclNlYywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG5ld1RpY2tzUGVyU2VjKSB7CisgICAgcmVzdWx0ID0gc2VjcyAqIG5ld1RpY2tzUGVyU2VjOworICAgIHJlc3VsdCArPSBvbGRUaWNrcyAqIG5ld1RpY2tzUGVyU2VjIC8gb2xkVGlja3NQZXJTZWM7CisKKyAgICBpbnQ2NF90IG9sZFBlck5ldyA9IG9sZFRpY2tzUGVyU2VjIC8gbmV3VGlja3NQZXJTZWM7CisgICAgaWYgKG9sZFBlck5ldyAmJiAoKG9sZFRpY2tzICUgb2xkUGVyTmV3KSA+PSAob2xkUGVyTmV3IC8gMikpKSB7CisgICAgICArK3Jlc3VsdDsKKyAgICB9CisgIH0KKyAgLyoqCisgICAqIENvbnZlcnRzIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdG8gYXJiaXRyYXJ5LXNpemVkIHRpY2tzIHNpbmNlIGVwb2NoCisgICAqLworICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUsIGludDY0X3QgdGlja3NQZXJTZWMpIHsKKyAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLnR2X3NlYywgdmFsdWUudHZfbnNlYywgTlNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUsIGludDY0X3QgdGlja3NQZXJTZWMpIHsKKyAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsICh1bnNpZ25lZCBsb25nKXZhbHVlLnR2X3NlYywgKHVuc2lnbmVkIGxvbmcpdmFsdWUudHZfdXNlYywgVVNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRvIG1pbGxpc2Vjb25kcworICAgKi8KKyAgc3RhdGljIHZvaWQgdG9NaWxsaXNlY29uZHMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgeworICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIE1TX1BFUl9TKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBtaWxsaXNlY29uZHMKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvTWlsbGlzZWNvbmRzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CisgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgTVNfUEVSX1MpOworICB9CisKKyAgLyoqCisgICAqIENvbnZlcnRzIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdG8gbWljcm9zZWNvbmRzCisgICAqLworICBzdGF0aWMgdm9pZCB0b1VzZWMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgeworICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIFVTX1BFUl9TKTsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBtaWNyb3NlY29uZHMKKyAgICovCisgIHN0YXRpYyB2b2lkIHRvVXNlYyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgeworICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIFVTX1BFUl9TKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgY3VycmVudCB0aW1lIGFzIGEgbnVtYmVyIG9mIGFyYml0cmFyeS1zaXplIHRpY2tzIGZyb20gZXBvY2gKKyAgICovCisgIHN0YXRpYyBpbnQ2NF90IGN1cnJlbnRUaW1lVGlja3MoaW50NjRfdCB0aWNrc1BlclNlYyk7CisKKyAgLyoqCisgICAqIEdldCBjdXJyZW50IHRpbWUgYXMgbWlsbGlzZWNvbmRzIGZyb20gZXBvY2gKKyAgICovCisgIHN0YXRpYyBpbnQ2NF90IGN1cnJlbnRUaW1lKCkgeyByZXR1cm4gY3VycmVudFRpbWVUaWNrcyhNU19QRVJfUyk7IH0KKworICAvKioKKyAgICogR2V0IGN1cnJlbnQgdGltZSBhcyBtaWNyb3MgZnJvbSBlcG9jaAorICAgKi8KKyAgc3RhdGljIGludDY0X3QgY3VycmVudFRpbWVVc2VjKCkgeyByZXR1cm4gY3VycmVudFRpbWVUaWNrcyhVU19QRVJfUyk7IH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjZiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb2Nlc3NvciB7CisKK1BlZWtQcm9jZXNzb3I6OlBlZWtQcm9jZXNzb3IoKSB7CisgIG1lbW9yeUJ1ZmZlcl8ucmVzZXQobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHRhcmdldFRyYW5zcG9ydF8gPSBtZW1vcnlCdWZmZXJfOworfQorUGVla1Byb2Nlc3Nvcjo6flBlZWtQcm9jZXNzb3IoKSB7Cit9CisKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6aW5pdGlhbGl6ZShzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpIHsKKyAgYWN0dWFsUHJvY2Vzc29yXyA9IGFjdHVhbFByb2Nlc3NvcjsKKyAgcGlwZWRQcm90b2NvbF8gPSBwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKHRhcmdldFRyYW5zcG9ydF8pOworICB0cmFuc3BvcnRGYWN0b3J5XyA9IHRyYW5zcG9ydEZhY3Rvcnk7CisgIHRyYW5zcG9ydEZhY3RvcnlfLT5pbml0aWFsaXplVGFyZ2V0VHJhbnNwb3J0KHRhcmdldFRyYW5zcG9ydF8pOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gUGVla1Byb2Nlc3Nvcjo6Z2V0UGlwZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluKSB7CisgIHJldHVybiB0cmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGluKTsKK30KKwordm9pZCBQZWVrUHJvY2Vzc29yOjpzZXRUYXJnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCkgeworICB0YXJnZXRUcmFuc3BvcnRfID0gdGFyZ2V0VHJhbnNwb3J0OworICBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnRfKSkgeworICAgIG1lbW9yeUJ1ZmZlcl8gPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pKSB7CisgICAgbWVtb3J5QnVmZmVyXyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4oCisgICAgICAgIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKS0+Z2V0VGFyZ2V0VHJhbnNwb3J0KCkpOworICB9CisKKyAgaWYgKCFtZW1vcnlCdWZmZXJfKSB7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigKKyAgICAgICAgIlRhcmdldCB0cmFuc3BvcnQgbXVzdCBiZSBhIFRNZW1vcnlCdWZmZXIgb3IgYSBUUGlwZWRUcmFuc3BvcnQgd2l0aCBUTWVtb3J5QnVmZmVyIik7CisgIH0KK30KKworYm9vbCBQZWVrUHJvY2Vzc29yOjpwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworCisgIHN0ZDo6c3RyaW5nIGZuYW1lOworICBUTWVzc2FnZVR5cGUgbXR5cGU7CisgIGludDMyX3Qgc2VxaWQ7CisgIGluLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOworCisgIGlmIChtdHlwZSAhPSBUX0NBTEwgJiYgbXR5cGUgIT0gVF9PTkVXQVkpIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOworICB9CisKKyAgLy8gUGVlayBhdCB0aGUgbmFtZQorICBwZWVrTmFtZShmbmFtZSk7CisKKyAgVFR5cGUgZnR5cGU7CisgIGludDE2X3QgZmlkOworICB3aGlsZSAodHJ1ZSkgeworICAgIGluLT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7CisgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gUGVlayBhdCB0aGUgdmFyaWFibGUKKyAgICBwZWVrKGluLCBmdHlwZSwgZmlkKTsKKyAgICBpbi0+cmVhZEZpZWxkRW5kKCk7CisgIH0KKyAgaW4tPnJlYWRNZXNzYWdlRW5kKCk7CisgIGluLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOworCisgIC8vCisgIC8vIEFsbCB0aGUgZGF0YSBpcyBub3cgaW4gbWVtb3J5QnVmZmVyXyBhbmQgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkCisgIC8vCisKKyAgLy8gTGV0J3MgZmlyc3QgdGFrZSBhIHBlZWsgYXQgdGhlIGZ1bGwgZGF0YSBpbiBtZW1vcnkKKyAgdWludDhfdCogYnVmZmVyOworICB1aW50MzJfdCBzaXplOworICBtZW1vcnlCdWZmZXJfLT5nZXRCdWZmZXIoJmJ1ZmZlciwgJnNpemUpOworICBwZWVrQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7CisKKyAgLy8gRG9uZSBwZWVraW5nIGF0IHZhcmlhYmxlcworICBwZWVrRW5kKCk7CisKKyAgYm9vbCByZXQgPSBhY3R1YWxQcm9jZXNzb3JfLT5wcm9jZXNzKHBpcGVkUHJvdG9jb2xfLCBvdXQsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgbWVtb3J5QnVmZmVyXy0+cmVzZXRCdWZmZXIoKTsKKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUpIHsKKyAgKHZvaWQpZm5hbWU7Cit9CisKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla0J1ZmZlcih1aW50OF90KiBidWZmZXIsIHVpbnQzMl90IHNpemUpIHsKKyAgKHZvaWQpYnVmZmVyOworICAodm9pZClzaXplOworfQorCit2b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWsoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sIFRUeXBlIGZ0eXBlLCBpbnQxNl90IGZpZCkgeworICAodm9pZClmaWQ7CisgIGluLT5za2lwKGZ0eXBlKTsKK30KKwordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrRW5kKCkgeworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFjMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFBFRUtQUk9DRVNTT1JfSAorI2RlZmluZSBQRUVLUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm9jZXNzb3IgeworCisvKgorICogQ2xhc3MgZm9yIHBlZWtpbmcgYXQgdGhlIHJhdyBkYXRhIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkIGJ5IGFub3RoZXIgcHJvY2Vzc29yCisgKiBhbmQgZ2l2ZXMgdGhlIGRlcml2ZWQgY2xhc3MgYSBjaGFuY2UgdG8gY2hhbmdlIGJlaGF2aW9yIGFjY29yZGluZ2x5CisgKgorICovCitjbGFzcyBQZWVrUHJvY2Vzc29yIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yIHsKKworcHVibGljOgorICBQZWVrUHJvY2Vzc29yKCk7CisgIHZpcnR1YWwgflBlZWtQcm9jZXNzb3IoKTsKKworICAvLyBJbnB1dCBoZXJlOiBhY3R1YWxQcm9jZXNzb3IgIC0gdGhlIHVuZGVybHlpbmcgcHJvY2Vzc29yCisgIC8vICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSAgLSB0aGUgcHJvdG9jb2wgZmFjdG9yeSB1c2VkIHRvIHdyYXAgdGhlIG1lbW9yeSBidWZmZXIKKyAgLy8gICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSAtIHRoaXMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSBpcyB1c2VkIHRvIHdyYXAgdGhlIHNvdXJjZSB0cmFuc3BvcnQKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBhIGNhbGwgdG8gZ2V0UGlwZWRUcmFuc3BvcnQKKyAgdm9pZCBpbml0aWFsaXplKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGdldFBpcGVkVHJhbnNwb3J0KAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluKTsKKworICB2b2lkIHNldFRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KTsKKworICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGNhbiBiZSBvdmVybG9hZGVkIGJ5IGNoaWxkIGNsYXNzZXMgdG8KKyAgLy8gYWNoaWV2ZSBkZXNpcmVkIHBlZWtpbmcgYmVoYXZpb3IKKyAgdmlydHVhbCB2b2lkIHBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSk7CisgIHZpcnR1YWwgdm9pZCBwZWVrQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3Qgc2l6ZSk7CisgIHZpcnR1YWwgdm9pZCBwZWVrKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGUsCisgICAgICAgICAgICAgICAgICAgIGludDE2X3QgZmlkKTsKKyAgdmlydHVhbCB2b2lkIHBlZWtFbmQoKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcGVkUHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBtZW1vcnlCdWZmZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm9jZXNzb3IKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4ZWZiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQVRTUFJPQ0VTU09SX0gKKyNkZWZpbmUgU1RBVFNQUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvY2Vzc29yIHsKKworLyoKKyAqIENsYXNzIGZvciBrZWVwaW5nIHRyYWNrIG9mIGZ1bmN0aW9uIGNhbGwgc3RhdGlzdGljcyBhbmQgcHJpbnRpbmcgdGhlbSBpZiBkZXNpcmVkCisgKgorICovCitjbGFzcyBTdGF0c1Byb2Nlc3NvciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvciB7CitwdWJsaWM6CisgIFN0YXRzUHJvY2Vzc29yKGJvb2wgcHJpbnQsIGJvb2wgZnJlcXVlbmN5KSA6IHByaW50XyhwcmludCksIGZyZXF1ZW5jeV8oZnJlcXVlbmN5KSB7fQorICB2aXJ0dWFsIH5TdGF0c1Byb2Nlc3Nvcigpe307CisKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcG9wcm90LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7CisKKyAgICBwaXByb3RfID0gcGlwcm90OworCisgICAgc3RkOjpzdHJpbmcgZm5hbWU7CisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CisgICAgaW50MzJfdCBzZXFpZDsKKworICAgIHBpcHJvdF8tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CisgICAgaWYgKG10eXBlICE9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJVbmtub3duIG1lc3NhZ2UgdHlwZVxuIik7CisgICAgICB9CisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigiVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUiKTsKKyAgICB9CisgICAgaWYgKHByaW50XykgeworICAgICAgcHJpbnRmKCIlcyAoIiwgZm5hbWUuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChmcmVxdWVuY3lfKSB7CisgICAgICBpZiAoZnJlcXVlbmN5X21hcF8uZmluZChmbmFtZSkgIT0gZnJlcXVlbmN5X21hcF8uZW5kKCkpIHsKKyAgICAgICAgZnJlcXVlbmN5X21hcF9bZm5hbWVdKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcmVxdWVuY3lfbWFwX1tmbmFtZV0gPSAxOworICAgICAgfQorICAgIH0KKworICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7CisgICAgaW50MTZfdCBmaWQ7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkQmVnaW4oZm5hbWUsIGZ0eXBlLCBmaWQpOworICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihmdHlwZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJpbnRfKSB7CisgICAgICBwcmludGYoIlxiXGIpXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50NjRfdD4mIGdldF9mcmVxdWVuY3lfbWFwKCkgeyByZXR1cm4gZnJlcXVlbmN5X21hcF87IH0KKworcHJvdGVjdGVkOgorICB2b2lkIHByaW50QW5kUGFzc1RvQnVmZmVyKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGUpIHsKKyAgICBzd2l0Y2ggKGZ0eXBlKSB7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQk9PTDogeworICAgICAgYm9vbCBib29sdjsKKyAgICAgIHBpcHJvdF8tPnJlYWRCb29sKGJvb2x2KTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGJvb2x2KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEU6IHsKKyAgICAgIGludDhfdCBieXRldjsKKyAgICAgIHBpcHJvdF8tPnJlYWRCeXRlKGJ5dGV2KTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGJ5dGV2KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNjogeworICAgICAgaW50MTZfdCBpMTY7CisgICAgICBwaXByb3RfLT5yZWFkSTE2KGkxNik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWQiLCBpMTYpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyOiB7CisgICAgICBpbnQzMl90IGkzMjsKKyAgICAgIHBpcHJvdF8tPnJlYWRJMzIoaTMyKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGkzMik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQ6IHsKKyAgICAgIGludDY0X3QgaTY0OworICAgICAgcGlwcm90Xy0+cmVhZEk2NChpNjQpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVsZCIsIGk2NCk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSBkdWI7CisgICAgICBwaXByb3RfLT5yZWFkRG91YmxlKGR1Yik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWYiLCBkdWIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HOiB7CisgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICBwaXByb3RfLT5yZWFkU3RyaW5nKHN0cik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJXMiLCBzdHIuY19zdHIoKSk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1Q6IHsKKyAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICBpbnQxNl90IGZpZDsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7CisgICAgICBwaXByb3RfLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiPCIpOworICAgICAgfQorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7CisgICAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGZ0eXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICB9CisgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZFN0cnVjdEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxiPiIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQOiB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGtleVR5cGU7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIHZhbFR5cGU7CisgICAgICB1aW50MzJfdCBpLCBzaXplOworICAgICAgcGlwcm90Xy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoInsiKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoa2V5VHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIj0+Iik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIodmFsVHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZE1hcEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxifSIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUOiB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGVsZW1UeXBlOworICAgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICAgIHBpcHJvdF8tPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigieyIpOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihlbGVtVHlwZSk7CisgICAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZFNldEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxifSIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVDogeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBlbGVtVHlwZTsKKyAgICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgICBwaXByb3RfLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJbIik7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGVsZW1UeXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBwaXByb3RfLT5yZWFkTGlzdEVuZCgpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlxiXSIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90XzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+IGZyZXF1ZW5jeV9tYXBfOworCisgIGJvb2wgcHJpbnRfOworICBib29sIGZyZXF1ZW5jeV87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvY2Vzc29yCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhN2Y3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfVE1VTFRJUExFWEVEUFJPQ0VTU09SX0hfCisjZGVmaW5lIFRIUklGVF9UTVVMVElQTEVYRURQUk9DRVNTT1JfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvKioKKyAqICBUbyBiZSBhYmxlIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wsIHdlIG5lZWRlZAorICogIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgKi8KK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IgeworcHVibGljOgorICBTdG9yZWRNZXNzYWdlUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgX3NlcWlkKQorICAgIDogVFByb3RvY29sRGVjb3JhdG9yKF9wcm90b2NvbCksIG5hbWUoX25hbWUpLCB0eXBlKF90eXBlKSwgc2VxaWQoX3NlcWlkKSB7fQorCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgX25hbWUsIFRNZXNzYWdlVHlwZSYgX3R5cGUsIGludDMyX3QmIF9zZXFpZCkgeworCisgICAgX25hbWUgPSBuYW1lOworICAgIF90eXBlID0gdHlwZTsKKyAgICBfc2VxaWQgPSBzZXFpZDsKKworICAgIHJldHVybiAwOyAvLyAoTm9ybWFsIFRQcm90b2NvbCByZWFkIGZ1bmN0aW9ucyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQpCisgIH0KKworICBzdGQ6OnN0cmluZyBuYW1lOworICBUTWVzc2FnZVR5cGUgdHlwZTsKKyAgaW50MzJfdCBzZXFpZDsKK307Cit9IC8vIG5hbWVzcGFjZSBwcm90b2NvbAorCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4gaXMgYSA8Y29kZT5UUHJvY2Vzc29yPC9jb2RlPiBhbGxvd2luZworICogYSBzaW5nbGUgPGNvZGU+VFNlcnZlcjwvY29kZT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqCisgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgIHN0ZDo6c2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCkpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiQ2FsY3VsYXRvciIsCisgKiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiggbmV3IENhbGN1bGF0b3JQcm9jZXNzb3IoCisgKiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FsY3VsYXRvckhhbmRsZXI+KCBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAqICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+KCBuZXcgV2VhdGhlclJlcG9ydFByb2Nlc3NvcigKKyAqICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxXZWF0aGVyUmVwb3J0SGFuZGxlcj4oIG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSkpKTsKKyAqCisgKiAgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVFNlcnZlclNvY2tldCg5MDkwKSk7CisgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQpOworICoKKyAqICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKi8KK2NsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvciA6IHB1YmxpYyBUUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+ID4gc2VydmljZXNfdDsKKworICAvKioKKyAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcworICAgICogYWxsb3dzIHVzIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlCisgICAgKiBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAqCisgICAgKiBccGFyYW0gW2luXSBzZXJ2aWNlTmFtZSBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICogXHBhcmFtIFtpbl0gcHJvY2Vzc29yICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhcyAiaGFuZGxlcnMiLCBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyLAorICAgICogICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnRJZiBpbnRlcmZhY2UuCisgICAgKi8KKyAgdm9pZCByZWdpc3RlclByb2Nlc3Nvcihjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZU5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IpIHsKKyAgICBzZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3I7CisgIH0KKworICAvKioKKyAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHRvIGJlIGNhbGxlZCB0byBwcm9jZXNzIHF1ZXJpZXMgd2l0aG91dCBzZXJ2aWNlIG5hbWUKKyAgICogXHBhcmFtIFtpbl0gcHJvY2Vzc29yICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLgorICAgKi8KKyAgdm9pZCByZWdpc3RlckRlZmF1bHQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IpIHsKKyAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICB9CisKKyAgLyoqCisgICAqIENoZXcgdXAgaW52YWxpZCBpbnB1dCBhbmQgcmV0dXJuIGFuIGV4Y2VwdGlvbiB0byB0aHJvdy4KKyAgICovCisgIFRFeGNlcHRpb24gcHJvdG9jb2xfZXJyb3Ioc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIGNvbnN0IHsKKyAgICBpbi0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOworICAgIGluLT5yZWFkTWVzc2FnZUVuZCgpOworICAgIGluLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOworICAgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICAgICAgeCg6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OlBST1RPQ09MX0VSUk9SLAorICAgICAgICAiVE11bHRpcGxleGVkUHJvY2Vzc29yOiAiICsgbXNnKTsKKyAgICBvdXQtPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOworICAgIHgud3JpdGUob3V0LmdldCgpKTsKKyAgICBvdXQtPndyaXRlTWVzc2FnZUVuZCgpOworICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7CisgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsKKyAgICByZXR1cm4gVEV4Y2VwdGlvbihtc2cpOworfQorICAgCisgIC8qKgorICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnByb2Nlc3M8L2NvZGU+IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAqCisgICAqIDxvbD4KKyAgICogICAgIDxsaT5SZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuPC9saT4KKyAgICogICAgIDxsaT5FeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS48L2xpPgorICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KKyAgICogICAgIDxsaT5EaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgKiAgICAgICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLjwvbGk+CisgICAqIDwvb2w+CisgICAqCisgICAqIFx0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBUX0NBTEwgb3IgVF9PTkVXQVksIGlmCisgICAqIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IgaWYgdGhlIHNlcnZpY2UKKyAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4KKyAgICovCisgIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgdHlwZTsKKyAgICBpbnQzMl90IHNlcWlkOworCisgICAgLy8gVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCisgICAgLy8gbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgIC8vIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgorICAgIGluLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKTsKKworICAgIGlmICh0eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKKyAgICAgIC8vIFVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlLgorICAgICAgdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsICJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgIGJvb3N0Ojp0b2tlbml6ZXI8Ym9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+ID4gdG9rKG5hbWUsIGJvb3N0OjpjaGFyX3NlcGFyYXRvcjxjaGFyPigiOiIpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0b2tlbnM7CisgICAgc3RkOjpjb3B5KHRvay5iZWdpbigpLCB0b2suZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcih0b2tlbnMpKTsKKworICAgIC8vIEEgdmFsaWQgbWVzc2FnZSBzaG91bGQgY29uc2lzdCBvZiB0d28gdG9rZW5zOiB0aGUgc2VydmljZQorICAgIC8vIG5hbWUgYW5kIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbC4KKyAgICBpZiAodG9rZW5zLnNpemUoKSA9PSAyKSB7CisgICAgICAvLyBTZWFyY2ggZm9yIGEgcHJvY2Vzc29yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgbmFtZS4KKyAgICAgIHNlcnZpY2VzX3Q6Oml0ZXJhdG9yIGl0ID0gc2VydmljZXMuZmluZCh0b2tlbnNbMF0pOworCisgICAgICBpZiAoaXQgIT0gc2VydmljZXMuZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIC8vIExldCB0aGUgcHJvY2Vzc29yIHJlZ2lzdGVyZWQgZm9yIHRoaXMgc2VydmljZSBuYW1lCisgICAgICAgIC8vIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCisgICAgICAgIHJldHVybiBwcm9jZXNzb3IKKyAgICAgICAgICAgIC0+cHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBwcm90b2NvbDo6U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCB0b2tlbnNbMV0sIHR5cGUsIHNlcWlkKSksCisgICAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVua25vd24gc2VydmljZS4KKyAgICAgICAgdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsIAorICAgICAgICAgICAgIlVua25vd24gc2VydmljZTogIiArIHRva2Vuc1swXSArCisJCQkJIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodG9rZW5zLnNpemUoKSA9PSAxKSB7CisJICBpZiAoZGVmYXVsdFByb2Nlc3NvcikgeworICAgICAgICAvLyBub24tbXVsdGlwbGV4ZWQgY2xpZW50IGZvcndhcmRzIHRvIGRlZmF1bHQgcHJvY2Vzc29yCisgICAgICAgIHJldHVybiBkZWZhdWx0UHJvY2Vzc29yICAgICAgICAgICAgCisgICAgICAgICAgICAtPnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgcHJvdG9jb2w6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdG9rZW5zWzBdLCB0eXBlLCBzZXFpZCkpLAorICAgICAgICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCk7CisJICB9IGVsc2UgeworCQl0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwKKwkJCSJOb24tbXVsdGlwbGV4ZWQgY2xpZW50IHJlcXVlc3QgZHJvcHBlZC4gIgorCQkJIkRpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgZGVmYXVsdFByb2Nlc3NvcigpPyIpOworCSAgfQorICAgIH0gZWxzZSB7CisJCXRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLAorCQkgICAgIldyb25nIG51bWJlciBvZiB0b2tlbnMuIik7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIC8qKiBNYXAgb2Ygc2VydmljZSBwcm9jZXNzb3Igb2JqZWN0cywgaW5kZXhlZCBieSBzZXJ2aWNlIG5hbWVzLiAqLworICBzZXJ2aWNlc190IHNlcnZpY2VzOworICAKKyAgLy8hIElmIGEgbm9uLW11bHRpIGNsaWVudCByZXF1ZXN0cyBzb21ldGhpbmcsIGl0IGdvZXMgdG8gdGhlCisgIC8vISBkZWZhdWx0IHByb2Nlc3NvciAoaWYgb25lIGlzIGRlZmluZWQpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGRlZmF1bHRQcm9jZXNzb3I7Cit9OworfQorfQorCisjZW5kaWYgLy8gVEhSSUZUX1RNVUxUSVBMRVhFRFBST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc0ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCitzdGF0aWMgY29uc3QgdWludDhfdCoga0Jhc2U2NEVuY29kZVRhYmxlCisgICAgPSAoY29uc3QgdWludDhfdCopIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCit2b2lkIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCogaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCogYnVmKSB7CisgIGJ1ZlswXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoaW5bMF0gPj4gMikgJiAweDNmXTsKKyAgaWYgKGxlbiA9PSAzKSB7CisgICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMF0gPDwgNCkgJiAweDMwKSB8ICgoaW5bMV0gPj4gNCkgJiAweDBmKV07CisgICAgYnVmWzJdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMV0gPDwgMikgJiAweDNjKSB8ICgoaW5bMl0gPj4gNikgJiAweDAzKV07CisgICAgYnVmWzNdID0ga0Jhc2U2NEVuY29kZVRhYmxlW2luWzJdICYgMHgzZl07CisgIH0gZWxzZSBpZiAobGVuID09IDIpIHsKKyAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKChpblswXSA8PCA0KSAmIDB4MzApIHwgKChpblsxXSA+PiA0KSAmIDB4MGYpXTsKKyAgICBidWZbMl0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzFdIDw8IDIpICYgMHgzY107CisgIH0gZWxzZSB7IC8vIGxlbiA9PSAxCisgICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblswXSA8PCA0KSAmIDB4MzBdOworICB9Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtCYXNlNjREZWNvZGVUYWJsZVsyNTZdID0geworICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgzZSwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweDNmLAorICAgIDB4MzQsCisgICAgMHgzNSwKKyAgICAweDM2LAorICAgIDB4MzcsCisgICAgMHgzOCwKKyAgICAweDM5LAorICAgIDB4M2EsCisgICAgMHgzYiwKKyAgICAweDNjLAorICAgIDB4M2QsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweDAwLAorICAgIDB4MDEsCisgICAgMHgwMiwKKyAgICAweDAzLAorICAgIDB4MDQsCisgICAgMHgwNSwKKyAgICAweDA2LAorICAgIDB4MDcsCisgICAgMHgwOCwKKyAgICAweDA5LAorICAgIDB4MGEsCisgICAgMHgwYiwKKyAgICAweDBjLAorICAgIDB4MGQsCisgICAgMHgwZSwKKyAgICAweDBmLAorICAgIDB4MTAsCisgICAgMHgxMSwKKyAgICAweDEyLAorICAgIDB4MTMsCisgICAgMHgxNCwKKyAgICAweDE1LAorICAgIDB4MTYsCisgICAgMHgxNywKKyAgICAweDE4LAorICAgIDB4MTksCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgxYSwKKyAgICAweDFiLAorICAgIDB4MWMsCisgICAgMHgxZCwKKyAgICAweDFlLAorICAgIDB4MWYsCisgICAgMHgyMCwKKyAgICAweDIxLAorICAgIDB4MjIsCisgICAgMHgyMywKKyAgICAweDI0LAorICAgIDB4MjUsCisgICAgMHgyNiwKKyAgICAweDI3LAorICAgIDB4MjgsCisgICAgMHgyOSwKKyAgICAweDJhLAorICAgIDB4MmIsCisgICAgMHgyYywKKyAgICAweDJkLAorICAgIDB4MmUsCisgICAgMHgyZiwKKyAgICAweDMwLAorICAgIDB4MzEsCisgICAgMHgzMiwKKyAgICAweDMzLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCit9OworCit2b2lkIGJhc2U2NF9kZWNvZGUodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgYnVmWzBdID0gKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMF1dIDw8IDIpIHwgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMV1dID4+IDQpOworICBpZiAobGVuID4gMikgeworICAgIGJ1ZlsxXSA9ICgoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsxXV0gPDwgNCkgJiAweGYwKSB8IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzJdXSA+PiAyKTsKKyAgICBpZiAobGVuID4gMykgeworICAgICAgYnVmWzJdID0gKChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzJdXSA8PCA2KSAmIDB4YzApIHwgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbM11dKTsKKyAgICB9CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhNjc0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQkFTRTY0VVRJTFNfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQkFTRTY0VVRJTFNfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8vIGluIG11c3QgYmUgYXQgbGVhc3QgbGVuIGJ5dGVzCisvLyBsZW4gbXVzdCBiZSAxLCAyLCBvciAzCisvLyBidWYgbXVzdCBiZSBhIGJ1ZmZlciBvZiBhdCBsZWFzdCA0IGJ5dGVzIGFuZCBtYXkgbm90IG92ZXJsYXAgaW4KKy8vIHRoZSBkYXRhIGlzIG5vdCBwYWRkZWQgd2l0aCAnPSc7IHRoZSBjYWxsZXIgY2FuIGRvIHRoaXMgaWYgZGVzaXJlZAordm9pZCBiYXNlNjRfZW5jb2RlKGNvbnN0IHVpbnQ4X3QqIGluLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QqIGJ1Zik7CisKKy8vIGJ1ZiBtdXN0IGJlIGEgYnVmZmVyIG9mIGF0IGxlYXN0IDQgYnl0ZXMgYW5kIGNvbnRhaW4gYmFzZTY0IGVuY29kZWQgdmFsdWVzCisvLyBidWYgd2lsbCBiZSBjaGFuZ2VkIHRvIGNvbnRhaW4gb3V0cHV0IGJ5dGVzCisvLyBsZW4gaXMgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnN1bWUgZnJvbSBpbnB1dCAobXVzdCBiZSAyLCAzLCBvciA0KQorLy8gbm8gJz0nIHBhZGRpbmcgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBpbnB1dAordm9pZCBiYXNlNjRfZGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJBU0U2NFVUSUxTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2Nzc1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaApAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoqCisgKiBUaGUgZGVmYXVsdCBiaW5hcnkgcHJvdG9jb2wgZm9yIHRocmlmdC4gV3JpdGVzIGFsbCBkYXRhIGluIGEgdmVyeSBiYXNpYworICogYmluYXJ5IGZvcm1hdCwgZXNzZW50aWFsbHkganVzdCBzcGl0dGluZyBvdXQgdGhlIHJhdyBieXRlcy4KKyAqCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfID0gVE5ldHdvcmtCaWdFbmRpYW4+CitjbGFzcyBUQmluYXJ5UHJvdG9jb2xUIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl9NQVNLID0gKChpbnQzMl90KTB4ZmZmZjAwMDApOworICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzEgPSAoKGludDMyX3QpMHg4MDAxMDAwMCk7CisgIC8vIFZFUlNJT05fMiAoMHg4MDAyMDAwMCkgd2FzIHRha2VuIGJ5IFREZW5zZVByb3RvY29sICh3aGljaCBoYXMgc2luY2UgYmVlbiByZW1vdmVkKQorCisgIFRCaW5hcnlQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+ID4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIHN0cmluZ19saW1pdF8oMCksCisgICAgICBjb250YWluZXJfbGltaXRfKDApLAorICAgICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKKyAgICAgIHN0cmljdF93cml0ZV8odHJ1ZSkge30KKworICBUQmluYXJ5UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICBib29sIHN0cmljdF9yZWFkLAorICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3dyaXRlKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+ID4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKKyAgICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSwKKyAgICAgIHN0cmljdF9yZWFkXyhzdHJpY3RfcmVhZCksCisgICAgICBzdHJpY3Rfd3JpdGVfKHN0cmljdF93cml0ZSkge30KKworICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgeyBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OyB9CisKKyAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsgfQorCisgIHZvaWQgc2V0U3RyaWN0KGJvb2wgc3RyaWN0X3JlYWQsIGJvb2wgc3RyaWN0X3dyaXRlKSB7CisgICAgc3RyaWN0X3JlYWRfID0gc3RyaWN0X3JlYWQ7CisgICAgc3RyaWN0X3dyaXRlXyA9IHN0cmljdF93cml0ZTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KKyAgICovCisKKyAgLypvbCovIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7CisKKyAgLypvbCovIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZVNldEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOworCisgIGlubGluZSB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJUeXBlPgorICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3QgU3RyVHlwZSYgc3RyKTsKKworICBpbmxpbmUgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLyoqCisgICAqIFJlYWRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIC8qb2wqLyB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCk7CisKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkRmllbGRFbmQoKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkTWFwRW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRMaXN0RW5kKCk7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZFNldEVuZCgpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7CisgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KKyAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+ID46OnJlYWRCb29sOworCisgIGlubGluZSB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7CisKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOworCisgIGlubGluZSB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KKyAgaW5saW5lIHVpbnQzMl90IHJlYWRTdHJpbmcoU3RyVHlwZSYgc3RyKTsKKworICBpbmxpbmUgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKKworcHJvdGVjdGVkOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KKyAgdWludDMyX3QgcmVhZFN0cmluZ0JvZHkoU3RyVHlwZSYgc3RyLCBpbnQzMl90IHN6KTsKKworICBUcmFuc3BvcnRfKiB0cmFuc187CisKKyAgaW50MzJfdCBzdHJpbmdfbGltaXRfOworICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87CisKKyAgLy8gRW5mb3JjZSBwcmVzZW5jZSBvZiB2ZXJzaW9uIGlkZW50aWZpZXIKKyAgYm9vbCBzdHJpY3RfcmVhZF87CisgIGJvb2wgc3RyaWN0X3dyaXRlXzsKK307CisKK3R5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0PiBUQmluYXJ5UHJvdG9jb2w7Cit0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydCwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IFRMRUJpbmFyeVByb3RvY29sOworCisvKioKKyAqIENvbnN0cnVjdHMgYmluYXJ5IHByb3RvY29sIGhhbmRsZXJzCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfID0gVE5ldHdvcmtCaWdFbmRpYW4+CitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKQorICAgIDogc3RyaW5nX2xpbWl0XygwKSwgY29udGFpbmVyX2xpbWl0XygwKSwgc3RyaWN0X3JlYWRfKGZhbHNlKSwgc3RyaWN0X3dyaXRlXyh0cnVlKSB7fQorCisgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3RfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpCisgICAgOiBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCisgICAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCksCisgICAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAorICAgICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpIHt9CisKKyAgdmlydHVhbCB+VEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKSB7fQorCisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KKworICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgeyBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OyB9CisKKyAgdm9pZCBzZXRTdHJpY3QoYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIHsKKyAgICBzdHJpY3RfcmVhZF8gPSBzdHJpY3RfcmVhZDsKKyAgICBzdHJpY3Rfd3JpdGVfID0gc3RyaWN0X3dyaXRlOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CisgICAgVFByb3RvY29sKiBwcm90OworICAgIGlmIChzcGVjaWZpY190cmFucykgeworICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+KHNwZWNpZmljX3RyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcmVhZF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3dyaXRlXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0LCBCeXRlT3JkZXJfPih0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3JlYWRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF93cml0ZV8pOworICAgIH0KKworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihwcm90KTsKKyAgfQorCitwcml2YXRlOgorICBpbnQzMl90IHN0cmluZ19saW1pdF87CisgIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKKyAgYm9vbCBzdHJpY3RfcmVhZF87CisgIGJvb2wgc3RyaWN0X3dyaXRlXzsKK307CisKK3R5cGVkZWYgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQ8VFRyYW5zcG9ydD4gVEJpbmFyeVByb3RvY29sRmFjdG9yeTsKK3R5cGVkZWYgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQ8VFRyYW5zcG9ydCwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IFRMRUJpbmFyeVByb3RvY29sRmFjdG9yeTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYz4KKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3Mzk5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfVENDXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9UQ0NfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgIGlmICh0aGlzLT5zdHJpY3Rfd3JpdGVfKSB7CisgICAgaW50MzJfdCB2ZXJzaW9uID0gKFZFUlNJT05fMSkgfCAoKGludDMyX3QpbWVzc2FnZVR5cGUpOworICAgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgICB3c2l6ZSArPSB3cml0ZUkzMih2ZXJzaW9uKTsKKyAgICB3c2l6ZSArPSB3cml0ZVN0cmluZyhuYW1lKTsKKyAgICB3c2l6ZSArPSB3cml0ZUkzMihzZXFpZCk7CisgICAgcmV0dXJuIHdzaXplOworICB9IGVsc2UgeworICAgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgICB3c2l6ZSArPSB3cml0ZVN0cmluZyhuYW1lKTsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCltZXNzYWdlVHlwZSk7CisgICAgd3NpemUgKz0gd3JpdGVJMzIoc2VxaWQpOworICAgIHJldHVybiB3c2l6ZTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgICh2b2lkKW5hbWU7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RydWN0RW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICh2b2lkKW5hbWU7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZmllbGRUeXBlKTsKKyAgd3NpemUgKz0gd3JpdGVJMTYoZmllbGRJZCk7CisgIHJldHVybiB3c2l6ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkRW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkU3RvcCgpIHsKKyAgcmV0dXJuIHdyaXRlQnl0ZSgoaW50OF90KVRfU1RPUCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3Qpa2V5VHlwZSk7CisgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KXZhbFR5cGUpOworICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKKyAgcmV0dXJuIHdzaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTWFwRW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCllbGVtVHlwZSk7CisgIHdzaXplICs9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVMaXN0RW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZWxlbVR5cGUpOworICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKKyAgcmV0dXJuIHdzaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU2V0RW5kKCkgeworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICB1aW50OF90IHRtcCA9IHZhbHVlID8gMSA6IDA7CisgIHRoaXMtPnRyYW5zXy0+d3JpdGUoJnRtcCwgMSk7CisgIHJldHVybiAxOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmYnl0ZSwgMSk7CisgIHJldHVybiAxOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7CisgIGludDE2X3QgbmV0ID0gKGludDE2X3QpQnl0ZU9yZGVyXzo6dG9XaXJlMTYoaTE2KTsKKyAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgMik7CisgIHJldHVybiAyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgIGludDMyX3QgbmV0ID0gKGludDMyX3QpQnl0ZU9yZGVyXzo6dG9XaXJlMzIoaTMyKTsKKyAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgNCk7CisgIHJldHVybiA0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIGludDY0X3QgbmV0ID0gKGludDY0X3QpQnl0ZU9yZGVyXzo6dG9XaXJlNjQoaTY0KTsKKyAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopJm5ldCwgOCk7CisgIHJldHVybiA4OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKKworICB1aW50NjRfdCBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOworICBiaXRzID0gQnl0ZU9yZGVyXzo6dG9XaXJlNjQoYml0cyk7CisgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZiaXRzLCA4KTsKKyAgcmV0dXJuIDg7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordGVtcGxhdGUgPHR5cGVuYW1lIFN0clR5cGU+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVN0cmluZyhjb25zdCBTdHJUeXBlJiBzdHIpIHsKKyAgaWYgKHN0ci5zaXplKCkgPiBzdGF0aWNfY2FzdDxzaXplX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB1aW50MzJfdCBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5zaXplKCkpOworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKKyAgaWYgKHNpemUgPiAwKSB7CisgICAgdGhpcy0+dHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc2l6ZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArIHNpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTdHJpbmcoc3RyKTsKK30KKworLyoqCisgKiBSZWFkaW5nIGZ1bmN0aW9ucworICovCisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgaW50MzJfdCBzejsKKyAgcmVzdWx0ICs9IHJlYWRJMzIoc3opOworCisgIGlmIChzeiA8IDApIHsKKyAgICAvLyBDaGVjayBmb3IgY29ycmVjdCB2ZXJzaW9uIG51bWJlcgorICAgIGludDMyX3QgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOworICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpZGVudGlmaWVyIik7CisgICAgfQorICAgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSkoc3ogJiAweDAwMDAwMGZmKTsKKyAgICByZXN1bHQgKz0gcmVhZFN0cmluZyhuYW1lKTsKKyAgICByZXN1bHQgKz0gcmVhZEkzMihzZXFpZCk7CisgIH0gZWxzZSB7CisgICAgaWYgKHRoaXMtPnN0cmljdF9yZWFkXykgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAorICAgICAgaW50OF90IHR5cGU7CisgICAgICByZXN1bHQgKz0gcmVhZFN0cmluZ0JvZHkobmFtZSwgc3opOworICAgICAgcmVzdWx0ICs9IHJlYWRCeXRlKHR5cGUpOworICAgICAgbWVzc2FnZVR5cGUgPSAoVE1lc3NhZ2VUeXBlKXR5cGU7CisgICAgICByZXN1bHQgKz0gcmVhZEkzMihzZXFpZCk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZE1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgeworICBuYW1lID0gIiI7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgaW50OF90IHR5cGU7CisgIHJlc3VsdCArPSByZWFkQnl0ZSh0eXBlKTsKKyAgZmllbGRUeXBlID0gKFRUeXBlKXR5cGU7CisgIGlmIChmaWVsZFR5cGUgPT0gVF9TVE9QKSB7CisgICAgZmllbGRJZCA9IDA7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICByZXN1bHQgKz0gcmVhZEkxNihmaWVsZElkKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkRmllbGRFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgeworICBpbnQ4X3QgaywgdjsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgaW50MzJfdCBzaXplaTsKKyAgcmVzdWx0ICs9IHJlYWRCeXRlKGspOworICBrZXlUeXBlID0gKFRUeXBlKWs7CisgIHJlc3VsdCArPSByZWFkQnl0ZSh2KTsKKyAgdmFsVHlwZSA9IChUVHlwZSl2OworICByZXN1bHQgKz0gcmVhZEkzMihzaXplaSk7CisgIGlmIChzaXplaSA8IDApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKKyAgfSBlbHNlIGlmICh0aGlzLT5jb250YWluZXJfbGltaXRfICYmIHNpemVpID4gdGhpcy0+Y29udGFpbmVyX2xpbWl0XykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB9CisgIHNpemUgPSAodWludDMyX3Qpc2l6ZWk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZE1hcEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIGludDhfdCBlOworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBpbnQzMl90IHNpemVpOworICByZXN1bHQgKz0gcmVhZEJ5dGUoZSk7CisgIGVsZW1UeXBlID0gKFRUeXBlKWU7CisgIHJlc3VsdCArPSByZWFkSTMyKHNpemVpKTsKKyAgaWYgKHNpemVpIDwgMCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOworICB9IGVsc2UgaWYgKHRoaXMtPmNvbnRhaW5lcl9saW1pdF8gJiYgc2l6ZWkgPiB0aGlzLT5jb250YWluZXJfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKyAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTGlzdEVuZCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgaW50OF90IGU7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgIGludDMyX3Qgc2l6ZWk7CisgIHJlc3VsdCArPSByZWFkQnl0ZShlKTsKKyAgZWxlbVR5cGUgPSAoVFR5cGUpZTsKKyAgcmVzdWx0ICs9IHJlYWRJMzIoc2l6ZWkpOworICBpZiAoc2l6ZWkgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0gZWxzZSBpZiAodGhpcy0+Y29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IHRoaXMtPmNvbnRhaW5lcl9saW1pdF8pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgfQorICBzaXplID0gKHVpbnQzMl90KXNpemVpOworICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTZXRFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgIHVpbnQ4X3QgYlsxXTsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKGIsIDEpOworICB2YWx1ZSA9ICooaW50OF90KiliICE9IDA7CisgIHJldHVybiAxOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICB1aW50OF90IGJbMV07CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCAxKTsKKyAgYnl0ZSA9ICooaW50OF90KiliOworICByZXR1cm4gMTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgeworICB1bmlvbiBieXRlcyB7CisgICAgdWludDhfdCBiWzJdOworICAgIGludDE2X3QgYWxsOworICB9IHRoZUJ5dGVzOworICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgMik7CisgIGkxNiA9IChpbnQxNl90KUJ5dGVPcmRlcl86OmZyb21XaXJlMTYodGhlQnl0ZXMuYWxsKTsKKyAgcmV0dXJuIDI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgdW5pb24gYnl0ZXMgeworICAgIHVpbnQ4X3QgYls0XTsKKyAgICBpbnQzMl90IGFsbDsKKyAgfSB0aGVCeXRlczsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoZUJ5dGVzLmIsIDQpOworICBpMzIgPSAoaW50MzJfdClCeXRlT3JkZXJfOjpmcm9tV2lyZTMyKHRoZUJ5dGVzLmFsbCk7CisgIHJldHVybiA0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgIHVuaW9uIGJ5dGVzIHsKKyAgICB1aW50OF90IGJbOF07CisgICAgaW50NjRfdCBhbGw7CisgIH0gdGhlQnl0ZXM7CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGVCeXRlcy5iLCA4KTsKKyAgaTY0ID0gKGludDY0X3QpQnl0ZU9yZGVyXzo6ZnJvbVdpcmU2NCh0aGVCeXRlcy5hbGwpOworICByZXR1cm4gODsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CisKKyAgdW5pb24gYnl0ZXMgeworICAgIHVpbnQ4X3QgYls4XTsKKyAgICB1aW50NjRfdCBhbGw7CisgIH0gdGhlQnl0ZXM7CisgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGVCeXRlcy5iLCA4KTsKKyAgdGhlQnl0ZXMuYWxsID0gQnl0ZU9yZGVyXzo6ZnJvbVdpcmU2NCh0aGVCeXRlcy5hbGwpOworICBkdWIgPSBiaXR3aXNlX2Nhc3Q8ZG91YmxlPih0aGVCeXRlcy5hbGwpOworICByZXR1cm4gODsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmcoU3RyVHlwZSYgc3RyKSB7CisgIHVpbnQzMl90IHJlc3VsdDsKKyAgaW50MzJfdCBzaXplOworICByZXN1bHQgPSByZWFkSTMyKHNpemUpOworICByZXR1cm4gcmVzdWx0ICsgcmVhZFN0cmluZ0JvZHkoc3RyLCBzaXplKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmcoc3RyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmdCb2R5KFN0clR5cGUmIHN0ciwgaW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisKKyAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0KKyAgaWYgKHRoaXMtPnN0cmluZ19saW1pdF8gPiAwICYmIHNpemUgPiB0aGlzLT5zdHJpbmdfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKworICAvLyBDYXRjaCBlbXB0eSBzdHJpbmcgY2FzZQorICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgc3RyLmNsZWFyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIFRyeSB0byBib3Jyb3cgZmlyc3QKKyAgY29uc3QgdWludDhfdCogYm9ycm93X2J1ZjsKKyAgdWludDMyX3QgZ290ID0gc2l6ZTsKKyAgaWYgKChib3Jyb3dfYnVmID0gdGhpcy0+dHJhbnNfLT5ib3Jyb3coTlVMTCwgJmdvdCkpKSB7CisgICAgc3RyLmFzc2lnbigoY29uc3QgY2hhciopYm9ycm93X2J1Ziwgc2l6ZSk7CisgICAgdGhpcy0+dHJhbnNfLT5jb25zdW1lKHNpemUpOworICAgIHJldHVybiBzaXplOworICB9CisKKyAgc3RyLnJlc2l6ZShzaXplKTsKKyAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzdHJbMF0pLCBzaXplKTsKKyAgcmV0dXJuICh1aW50MzJfdClzaXplOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfVENDXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmYjQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQ09NUEFDVFBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvKioKKyAqIEMrKyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tcGFjdCBQcm90b2NvbCBhcyBkZXNjcmliZWQgaW4gVEhSSUZULTExMAorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xUIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQ4X3QgUFJPVE9DT0xfSUQgPSAoaW50OF90KTB4ODJ1OworICBzdGF0aWMgY29uc3QgaW50OF90IFZFUlNJT05fTiA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVkVSU0lPTl9NQVNLID0gMHgxZjsgICAgICAgLy8gMDAwMSAxMTExCisKK3Byb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludDhfdCBUWVBFX01BU0sgPSAoaW50OF90KTB4RTB1OyAvLyAxMTEwIDAwMDAKKyAgc3RhdGljIGNvbnN0IGludDhfdCBUWVBFX0JJVFMgPSAweDA3OyAgICAgICAgICAvLyAwMDAwIDAxMTEKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCisgIFRyYW5zcG9ydF8qIHRyYW5zXzsKKworICAvKioKKyAgICogKFdyaXRpbmcpIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlCisgICAqIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAqLworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgVFR5cGUgZmllbGRUeXBlOworICAgIGludDE2X3QgZmllbGRJZDsKKyAgfSBib29sZWFuRmllbGRfOworCisgIC8qKgorICAgKiAoUmVhZGluZykgSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlCisgICAqIHRoZSBib29sZWFuIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgKi8KKyAgc3RydWN0IHsKKyAgICBib29sIGhhc0Jvb2xWYWx1ZTsKKyAgICBib29sIGJvb2xWYWx1ZTsKKyAgfSBib29sVmFsdWVfOworCisgIC8qKgorICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgKi8KKworICBzdGQ6OnN0YWNrPGludDE2X3Q+IGxhc3RGaWVsZF87CisgIGludDE2X3QgbGFzdEZpZWxkSWRfOworCitwdWJsaWM6CisgIFRDb21wYWN0UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgbGFzdEZpZWxkSWRfKDApLAorICAgICAgc3RyaW5nX2xpbWl0XygwKSwKKyAgICAgIHN0cmluZ19idWZfKE5VTEwpLAorICAgICAgc3RyaW5nX2J1Zl9zaXplXygwKSwKKyAgICAgIGNvbnRhaW5lcl9saW1pdF8oMCkgeworICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7CisgICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKKyAgfQorCisgIFRDb21wYWN0UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpbmdfbGltaXQsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0KQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+KHRyYW5zKSwKKyAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCisgICAgICBsYXN0RmllbGRJZF8oMCksCisgICAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCisgICAgICBzdHJpbmdfYnVmXyhOVUxMKSwKKyAgICAgIHN0cmluZ19idWZfc2l6ZV8oMCksCisgICAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkgeworICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IE5VTEw7CisgICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKKyAgfQorCisgIH5UQ29tcGFjdFByb3RvY29sVCgpIHsgZnJlZShzdHJpbmdfYnVmXyk7IH0KKworICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKKworICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOworCisgIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKKworICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7CisKKyAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOworCisgIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOworCisgIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8qKgorICAqIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZWQKKyAgKiBvdXRwdXQgb3IgcHVycG9zZQorICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKSB7IHJldHVybiAwOyB9CisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKSB7IHJldHVybiAwOyB9CisKK3Byb3RlY3RlZDoKKyAgaW50MzJfdCB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IHR5cGVPdmVycmlkZSk7CisgIHVpbnQzMl90IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZVZhcmludDMyKHVpbnQzMl90IG4pOworICB1aW50MzJfdCB3cml0ZVZhcmludDY0KHVpbnQ2NF90IG4pOworICB1aW50NjRfdCBpNjRUb1ppZ3phZyhjb25zdCBpbnQ2NF90IGwpOworICB1aW50MzJfdCBpMzJUb1ppZ3phZyhjb25zdCBpbnQzMl90IG4pOworICBpbmxpbmUgaW50OF90IGdldENvbXBhY3RUeXBlKGNvbnN0IFRUeXBlIHR0eXBlKTsKKworcHVibGljOgorICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOworCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOworCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7CisgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KKyAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+OjpyZWFkQm9vbDsKKworICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOworCisgIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKKworICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7CisKKyAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOworCisgIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOworCisgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvKgorICAgKlRoZXNlIG1ldGhvZHMgYXJlIGhlcmUgZm9yIHRoZSBzdHJ1Y3QgdG8gY2FsbCwgYnV0IGRvbid0IGhhdmUgYW55IHdpcmUKKyAgICogZW5jb2RpbmcuCisgICAqLworICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCByZWFkTWFwRW5kKCkgeyByZXR1cm4gMDsgfQorICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsgcmV0dXJuIDA7IH0KKyAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsgcmV0dXJuIDA7IH0KKworcHJvdGVjdGVkOgorICB1aW50MzJfdCByZWFkVmFyaW50MzIoaW50MzJfdCYgaTMyKTsKKyAgdWludDMyX3QgcmVhZFZhcmludDY0KGludDY0X3QmIGk2NCk7CisgIGludDMyX3QgemlnemFnVG9JMzIodWludDMyX3Qgbik7CisgIGludDY0X3QgemlnemFnVG9JNjQodWludDY0X3Qgbik7CisgIFRUeXBlIGdldFRUeXBlKGludDhfdCB0eXBlKTsKKworICAvLyBCdWZmZXIgZm9yIHJlYWRpbmcgc3RyaW5ncywgc2F2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm90b2NvbCB0bworICAvLyBhdm9pZCBtZW1vcnkgY2h1cm4gYWxsb2NhdGluZyBtZW1vcnkgb24gZXZlcnkgc3RyaW5nIHJlYWQKKyAgaW50MzJfdCBzdHJpbmdfbGltaXRfOworICB1aW50OF90KiBzdHJpbmdfYnVmXzsKKyAgaW50MzJfdCBzdHJpbmdfYnVmX3NpemVfOworICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87Cit9OworCit0eXBlZGVmIFRDb21wYWN0UHJvdG9jb2xUPFRUcmFuc3BvcnQ+IFRDb21wYWN0UHJvdG9jb2w7CisKKy8qKgorICogQ29uc3RydWN0cyBjb21wYWN0IHByb3RvY29sIGhhbmRsZXJzCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgorY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUIDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgeworcHVibGljOgorICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoKSA6IHN0cmluZ19saW1pdF8oMCksIGNvbnRhaW5lcl9saW1pdF8oMCkge30KKworICBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoaW50MzJfdCBzdHJpbmdfbGltaXQsIGludDMyX3QgY29udGFpbmVyX2xpbWl0KQorICAgIDogc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLCBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkge30KKworICB2aXJ0dWFsIH5UQ29tcGFjdFByb3RvY29sRmFjdG9yeVQoKSB7fQorCisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KKworICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgeyBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CisgICAgVFByb3RvY29sKiBwcm90OworICAgIGlmIChzcGVjaWZpY190cmFucykgeworICAgICAgcHJvdCA9IG5ldyBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPihzcGVjaWZpY190cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOworICB9CisKK3ByaXZhdGU6CisgIGludDMyX3Qgc3RyaW5nX2xpbWl0XzsKKyAgaW50MzJfdCBjb250YWluZXJfbGltaXRfOworfTsKKwordHlwZWRlZiBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQ8VFRyYW5zcG9ydD4gVENvbXBhY3RQcm90b2NvbEZhY3Rvcnk7Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWZlYzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjCkBAIC0wLDAgKzEsODI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9UQ0NfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9UQ0NfIDEKKworI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgInRocmlmdC9jb25maWcuaCIKKworLyoKKyAqIFRDb21wYWN0UHJvdG9jb2w6OmkqVG9aaWd6YWcgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHJpZ2h0IHNoaWZ0CisgKiBvcGVyYXRvciBvbiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIGFyaXRobWV0aWMgKHNpZ24tZXh0ZW5kaW5nKSBzaGlmdC4KKyAqIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCB3b3JrLgorICogSWYgYW55b25lIGVuY291bnRlcnMgdGhpcyBlcnJvciwgd2UgY2FuIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBiZXN0CisgKiB3YXkgdG8gaW1wbGVtZW50IGFuIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgb24gdGhlaXIgcGxhdGZvcm0uCisgKi8KKyNpZiAhZGVmaW5lZChTSUdORURfUklHSFRfU0hJRlRfSVMpIHx8ICFkZWZpbmVkKEFSSVRITUVUSUNfUklHSFRfU0hJRlQpCisjIGVycm9yICJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiBhIHNpZ25lZCByaWdodCBzaGlmdCIKKyNlbmRpZgorI2lmIFNJR05FRF9SSUdIVF9TSElGVF9JUyAhPSBBUklUSE1FVElDX1JJR0hUX1NISUZUCisjIGVycm9yICJUQ29tcGFjdFByb3RvY29sIGN1cnJlbnRseSBvbmx5IHdvcmtzIGlmIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IGlzIGFyaXRobWV0aWMiCisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFVOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQorI2Vsc2UKKyNkZWZpbmUgVU5MSUtFTFkodmFsKSAodmFsKQorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKKworbmFtZXNwYWNlIGRldGFpbCB7IG5hbWVzcGFjZSBjb21wYWN0IHsKKworZW51bSBUeXBlcyB7CisgIENUX1NUT1AgICAgICAgICAgID0gMHgwMCwKKyAgQ1RfQk9PTEVBTl9UUlVFICAgPSAweDAxLAorICBDVF9CT09MRUFOX0ZBTFNFICA9IDB4MDIsCisgIENUX0JZVEUgICAgICAgICAgID0gMHgwMywKKyAgQ1RfSTE2ICAgICAgICAgICAgPSAweDA0LAorICBDVF9JMzIgICAgICAgICAgICA9IDB4MDUsCisgIENUX0k2NCAgICAgICAgICAgID0gMHgwNiwKKyAgQ1RfRE9VQkxFICAgICAgICAgPSAweDA3LAorICBDVF9CSU5BUlkgICAgICAgICA9IDB4MDgsCisgIENUX0xJU1QgICAgICAgICAgID0gMHgwOSwKKyAgQ1RfU0VUICAgICAgICAgICAgPSAweDBBLAorICBDVF9NQVAgICAgICAgICAgICA9IDB4MEIsCisgIENUX1NUUlVDVCAgICAgICAgID0gMHgwQworfTsKKworY29uc3QgaW50OF90IFRUeXBlVG9DVHlwZVsxNl0gPSB7CisgIENUX1NUT1AsIC8vIFRfU1RPUAorICAwLCAvLyB1bnVzZWQKKyAgQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKKyAgQ1RfQllURSwgLy8gVF9CWVRFCisgIENUX0RPVUJMRSwgLy8gVF9ET1VCTEUKKyAgMCwgLy8gdW51c2VkCisgIENUX0kxNiwgLy8gVF9JMTYKKyAgMCwgLy8gdW51c2VkCisgIENUX0kzMiwgLy8gVF9JMzIKKyAgMCwgLy8gdW51c2VkCisgIENUX0k2NCwgLy8gVF9JNjQKKyAgQ1RfQklOQVJZLCAvLyBUX1NUUklORworICBDVF9TVFJVQ1QsIC8vIFRfU1RSVUNUCisgIENUX01BUCwgLy8gVF9NQVAKKyAgQ1RfU0VULCAvLyBUX1NFVAorICBDVF9MSVNULCAvLyBUX0xJU1QKK307CisKK319IC8vIGVuZCBkZXRhaWw6OmNvbXBhY3QgbmFtZXNwYWNlCisKKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNZXNzYWdlQmVnaW4oCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoUFJPVE9DT0xfSUQpOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykgfCAoKChpbnQzMl90KW1lc3NhZ2VUeXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOworICB3c2l6ZSArPSB3cml0ZVZhcmludDMyKHNlcWlkKTsKKyAgd3NpemUgKz0gd3JpdGVTdHJpbmcobmFtZSk7CisgIHJldHVybiB3c2l6ZTsKK30KKworLyoqCisgKiBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCisgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCisgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCisgKiBmaWVsZCBpZCB3aWxsIGZvbGxvdyB0aGUgdHlwZSBoZWFkZXIgYXMgYSB6aWd6YWcgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgaWYgKGZpZWxkVHlwZSA9PSBUX0JPT0wpIHsKKyAgICBib29sZWFuRmllbGRfLm5hbWUgPSBuYW1lOworICAgIGJvb2xlYW5GaWVsZF8uZmllbGRUeXBlID0gZmllbGRUeXBlOworICAgIGJvb2xlYW5GaWVsZF8uZmllbGRJZCA9IGZpZWxkSWQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCwgLTEpOworICB9CisgIHJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVGaWVsZFN0b3AoKSB7CisgIHJldHVybiB3cml0ZUJ5dGUoVF9TVE9QKTsKK30KKworLyoqCisgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKKyAqIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAorICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICAodm9pZCkgbmFtZTsKKyAgbGFzdEZpZWxkXy5wdXNoKGxhc3RGaWVsZElkXyk7CisgIGxhc3RGaWVsZElkXyA9IDA7CisgIHJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCisgKiB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHBvcCB0aGUgbGFzdCBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHN0cnVjdCBvZmYKKyAqIG9mIHRoZSBmaWVsZCBzdGFjay4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJ1Y3RFbmQoKSB7CisgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8udG9wKCk7CisgIGxhc3RGaWVsZF8ucG9wKCk7CisgIHJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlIGEgTGlzdCBoZWFkZXIuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgcmV0dXJuIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKworLyoqCisgKiBXcml0ZSBhIHNldCBoZWFkZXIuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHJldHVybiB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKKy8qKgorICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAqIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIGlmIChzaXplID09IDApIHsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoMCk7CisgIH0gZWxzZSB7CisgICAgd3NpemUgKz0gd3JpdGVWYXJpbnQzMihzaXplKTsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkgPDwgNCB8IGdldENvbXBhY3RUeXBlKHZhbFR5cGUpKTsKKyAgfQorICByZXR1cm4gd3NpemU7Cit9CisKKy8qKgorICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisgKiB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICogT3RoZXJ3aXNlLCB3cml0ZSBhIHNpbmdsZSBieXRlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgaWYgKGJvb2xlYW5GaWVsZF8ubmFtZSAhPSBOVUxMKSB7CisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgd3NpemUKKyAgICAgICs9IHdyaXRlRmllbGRCZWdpbkludGVybmFsKGJvb2xlYW5GaWVsZF8ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8uZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbkZpZWxkXy5maWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50OF90Pih2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRldGFpbDo6Y29tcGFjdDo6Q1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX0ZBTFNFKSk7CisgICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZQorICAgIHdzaXplCisgICAgICArPSB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90Pih2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpKTsKKyAgfQorICByZXR1cm4gd3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICB0cmFuc18tPndyaXRlKCh1aW50OF90KikmYnl0ZSwgMSk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIFdyaXRlIGFuIGkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7CisgIHJldHVybiB3cml0ZVZhcmludDMyKGkzMlRvWmlnemFnKGkxNikpOworfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgIHJldHVybiB3cml0ZVZhcmludDMyKGkzMlRvWmlnemFnKGkzMikpOworfQorCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHppZ3phZyB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIHJldHVybiB3cml0ZVZhcmludDY0KGk2NFRvWmlnemFnKGk2NCkpOworfQorCisvKioKKyAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKKworICB1aW50NjRfdCBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOworICBiaXRzID0gVEhSSUZUX2h0b2xlbGwoYml0cyk7CisgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZiaXRzLCA4KTsKKyAgcmV0dXJuIDg7Cit9CisKKy8qKgorICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gd3JpdGVCaW5hcnkoc3RyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBpZihzdHIuc2l6ZSgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHVpbnQzMl90IHNzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5zaXplKCkpOworICB1aW50MzJfdCB3c2l6ZSA9IHdyaXRlVmFyaW50MzIoc3NpemUpIDsKKyAgLy8gY2hlY2tpbmcgc3NpemUgKyB3c2l6ZSA+IHVpbnRfbWF4LCBidXQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyZmxvdyB3aGlsZSBjaGVja2luZyBmb3Igb3ZlcmZsb3dzLgorICAvLyB0cmFuc2Zvcm1pbmcgdGhlIGNoZWNrIHRvIHNzaXplID4gdWludF9tYXggLSB3c2l6ZQorICBpZihzc2l6ZSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpIC0gd3NpemUpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHdzaXplICs9IHNzaXplOworICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzc2l6ZSk7CisgIHJldHVybiB3c2l6ZTsKK30KKworLy8KKy8vIEludGVybmFsIFdyaXRpbmcgbWV0aG9kcworLy8KKworLyoqCisgKiBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICogJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKKyAqIGJvb2xlYW4gZmllbGQgY2FzZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CitpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbCgKKyAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQsCisgICAgaW50OF90IHR5cGVPdmVycmlkZSkgeworICAodm9pZCkgbmFtZTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgaW50OF90IHR5cGVUb1dyaXRlID0gKHR5cGVPdmVycmlkZSA9PSAtMSA/IGdldENvbXBhY3RUeXBlKGZpZWxkVHlwZSkgOiB0eXBlT3ZlcnJpZGUpOworCisgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICBpZiAoZmllbGRJZCA+IGxhc3RGaWVsZElkXyAmJiBmaWVsZElkIC0gbGFzdEZpZWxkSWRfIDw9IDE1KSB7CisgICAgLy8gd3JpdGUgdGhlbSB0b2dldGhlcgorICAgIHdzaXplICs9IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxpbnQ4X3Q+KChmaWVsZElkIC0gbGFzdEZpZWxkSWRfKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDQgfCB0eXBlVG9Xcml0ZSkpOworICB9IGVsc2UgeworICAgIC8vIHdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUodHlwZVRvV3JpdGUpOworICAgIHdzaXplICs9IHdyaXRlSTE2KGZpZWxkSWQpOworICB9CisKKyAgbGFzdEZpZWxkSWRfID0gZmllbGRJZDsKKyAgcmV0dXJuIHdzaXplOworfQorCisvKioKKyAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKyAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVDb2xsZWN0aW9uQmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90PihzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSkpOworICB9IGVsc2UgeworICAgIHdzaXplICs9IHdyaXRlQnl0ZSgweGYwIHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICB3c2l6ZSArPSB3cml0ZVZhcmludDMyKHNpemUpOworICB9CisgIHJldHVybiB3c2l6ZTsKK30KKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVZhcmludDMyKHVpbnQzMl90IG4pIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKyAgdHJhbnNfLT53cml0ZShidWYsIHdzaXplKTsKKyAgcmV0dXJuIHdzaXplOworfQorCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVZhcmludDY0KHVpbnQ2NF90IG4pIHsKKyAgdWludDhfdCBidWZbMTBdOworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorICB0cmFuc18tPndyaXRlKGJ1Ziwgd3NpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKKy8qKgorICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQ2NF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjppNjRUb1ppZ3phZyhjb25zdCBpbnQ2NF90IGwpIHsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4obCkgPDwgMSkgXiAobCA+PiA2Myk7Cit9CisKKy8qKgorICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OmkzMlRvWmlnemFnKGNvbnN0IGludDMyX3QgbikgeworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQzMl90PihuKSA8PCAxKSBeIChuID4+IDMxKTsKK30KKworLyoqCisgKiBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBkZXRhaWw6OmNvbXBhY3Q6OlR5cGVzIHZhbHVlCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgoraW50OF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpnZXRDb21wYWN0VHlwZShjb25zdCBUVHlwZSB0dHlwZSkgeworICByZXR1cm4gZGV0YWlsOjpjb21wYWN0OjpUVHlwZVRvQ1R5cGVbdHR5cGVdOworfQorCisvLworLy8gUmVhZGluZyBNZXRob2RzCisvLworCisvKioKKyAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZE1lc3NhZ2VCZWdpbigKKyAgICBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgIGludDMyX3QmIHNlcWlkKSB7CisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgaW50OF90IHByb3RvY29sSWQ7CisgIGludDhfdCB2ZXJzaW9uQW5kVHlwZTsKKyAgaW50OF90IHZlcnNpb247CisKKyAgcnNpemUgKz0gcmVhZEJ5dGUocHJvdG9jb2xJZCk7CisgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgaWRlbnRpZmllciIpOworICB9CisKKyAgcnNpemUgKz0gcmVhZEJ5dGUodmVyc2lvbkFuZFR5cGUpOworICB2ZXJzaW9uID0gKGludDhfdCkodmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0spOworICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OX04pIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCB2ZXJzaW9uIik7CisgIH0KKworICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOworICByc2l6ZSArPSByZWFkVmFyaW50MzIoc2VxaWQpOworICByc2l6ZSArPSByZWFkU3RyaW5nKG5hbWUpOworCisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKyAqIG9wcG9ydHVuaXR5IHRvIHB1c2ggYSBuZXcgc3RydWN0IGJlZ2luIG1hcmtlciBvbiB0aGUgZmllbGQgc3RhY2suCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgeworICBuYW1lID0gIiI7CisgIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gPSAwOworICByZXR1cm4gMDsKK30KKworLyoqCisgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICogdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8udG9wKCk7CisgIGxhc3RGaWVsZF8ucG9wKCk7CisgIHJldHVybiAwOworfQorCisvKioKKyAqIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgKHZvaWQpIG5hbWU7CisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgaW50OF90IGJ5dGU7CisgIGludDhfdCB0eXBlOworCisgIHJzaXplICs9IHJlYWRCeXRlKGJ5dGUpOworICB0eXBlID0gKGJ5dGUgJiAweDBmKTsKKworICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgIGZpZWxkVHlwZSA9IFRfU1RPUDsKKyAgICBmaWVsZElkID0gMDsKKyAgICByZXR1cm4gcnNpemU7CisgIH0KKworICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgIGludDE2X3QgbW9kaWZpZXIgPSAoaW50MTZfdCkoKCh1aW50OF90KWJ5dGUgJiAweGYwKSA+PiA0KTsKKyAgaWYgKG1vZGlmaWVyID09IDApIHsKKyAgICAvLyBub3QgYSBkZWx0YSwgbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgcnNpemUgKz0gcmVhZEkxNihmaWVsZElkKTsKKyAgfSBlbHNlIHsKKyAgICBmaWVsZElkID0gKGludDE2X3QpKGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsKKyAgfQorICBmaWVsZFR5cGUgPSBnZXRUVHlwZSh0eXBlKTsKKworICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICBpZiAodHlwZSA9PSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRSB8fAorICAgICAgdHlwZSA9PSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpIHsKKyAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICBib29sVmFsdWVfLmhhc0Jvb2xWYWx1ZSA9IHRydWU7CisgICAgYm9vbFZhbHVlXy5ib29sVmFsdWUgPQorICAgICAgKHR5cGUgPT0gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2UpOworICB9CisKKyAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCisgIGxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgcmVhZGluZyB0aGUga2V5CisgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICogImNvcnJlY3QiIHR5cGVzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgeworICB1aW50MzJfdCByc2l6ZSA9IDA7CisgIGludDhfdCBrdlR5cGUgPSAwOworICBpbnQzMl90IG1zaXplID0gMDsKKworICByc2l6ZSArPSByZWFkVmFyaW50MzIobXNpemUpOworICBpZiAobXNpemUgIT0gMCkKKyAgICByc2l6ZSArPSByZWFkQnl0ZShrdlR5cGUpOworCisgIGlmIChtc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKKyAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIG1zaXplID4gY29udGFpbmVyX2xpbWl0XykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB9CisKKyAga2V5VHlwZSA9IGdldFRUeXBlKChpbnQ4X3QpKCh1aW50OF90KWt2VHlwZSA+PiA0KSk7CisgIHZhbFR5cGUgPSBnZXRUVHlwZSgoaW50OF90KSgodWludDhfdClrdlR5cGUgJiAweGYpKTsKKyAgc2l6ZSA9ICh1aW50MzJfdCltc2l6ZTsKKworICByZXR1cm4gcnNpemU7Cit9CisKKy8qKgorICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAqIHRydWUgc2l6ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgeworICBpbnQ4X3Qgc2l6ZV9hbmRfdHlwZTsKKyAgdWludDMyX3QgcnNpemUgPSAwOworICBpbnQzMl90IGxzaXplOworCisgIHJzaXplICs9IHJlYWRCeXRlKHNpemVfYW5kX3R5cGUpOworCisgIGxzaXplID0gKCh1aW50OF90KXNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmOworICBpZiAobHNpemUgPT0gMTUpIHsKKyAgICByc2l6ZSArPSByZWFkVmFyaW50MzIobHNpemUpOworICB9CisKKyAgaWYgKGxzaXplIDwgMCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5FR0FUSVZFX1NJWkUpOworICB9IGVsc2UgaWYgKGNvbnRhaW5lcl9saW1pdF8gJiYgbHNpemUgPiBjb250YWluZXJfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKworICBlbGVtVHlwZSA9IGdldFRUeXBlKChpbnQ4X3QpKHNpemVfYW5kX3R5cGUgJiAweDBmKSk7CisgIHNpemUgPSAodWludDMyX3QpbHNpemU7CisKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgKiB0cnVlIHNpemUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgIHJldHVybiByZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKworLyoqCisgKiBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCisgKiBhbHJlYWR5IGhhdmUgYmVlbiByZWFkIGR1cmluZyByZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQorICogcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCByZWFkIGEgYnl0ZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgaWYgKGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID09IHRydWUpIHsKKyAgICB2YWx1ZSA9IGJvb2xWYWx1ZV8uYm9vbFZhbHVlOworICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgaW50OF90IHZhbDsKKyAgICByZWFkQnl0ZSh2YWwpOworICAgIHZhbHVlID0gKHZhbCA9PSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRSk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLyoqCisgKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICB1aW50OF90IGJbMV07CisgIHRyYW5zXy0+cmVhZEFsbChiLCAxKTsKKyAgYnl0ZSA9ICooaW50OF90KiliOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgaW50MzJfdCB2YWx1ZTsKKyAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50MzIodmFsdWUpOworICBpMTYgPSAoaW50MTZfdCl6aWd6YWdUb0kzMih2YWx1ZSk7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgaW50MzJfdCB2YWx1ZTsKKyAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50MzIodmFsdWUpOworICBpMzIgPSB6aWd6YWdUb0kzMih2YWx1ZSk7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKKyAgaW50NjRfdCB2YWx1ZTsKKyAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50NjQodmFsdWUpOworICBpNjQgPSB6aWd6YWdUb0k2NCh2YWx1ZSk7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBObyBtYWdpYyBoZXJlIC0ganVzdCByZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOworCisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCBiaXRzOworICAgIHVpbnQ4X3QgYls4XTsKKyAgfSB1OworICB0cmFuc18tPnJlYWRBbGwodS5iLCA4KTsKKyAgdS5iaXRzID0gVEhSSUZUX2xldG9obGwodS5iaXRzKTsKKyAgZHViID0gYml0d2lzZV9jYXN0PGRvdWJsZT4odS5iaXRzKTsKKyAgcmV0dXJuIDg7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgordWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICByZXR1cm4gcmVhZEJpbmFyeShzdHIpOworfQorCisvKioKKyAqIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgIGludDMyX3QgcnNpemUgPSAwOworICBpbnQzMl90IHNpemU7CisKKyAgcnNpemUgKz0gcmVhZFZhcmludDMyKHNpemUpOworICAvLyBDYXRjaCBlbXB0eSBzdHJpbmcgY2FzZQorICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgc3RyID0gIiI7CisgICAgcmV0dXJuIHJzaXplOworICB9CisKKyAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7CisgIH0KKyAgaWYgKHN0cmluZ19saW1pdF8gPiAwICYmIHNpemUgPiBzdHJpbmdfbGltaXRfKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIH0KKworICAvLyBVc2UgdGhlIGhlYXAgaGVyZSB0byBwcmV2ZW50IHN0YWNrIG92ZXJmbG93IGZvciB2LiBsYXJnZSBzdHJpbmdzCisgIGlmIChzaXplID4gc3RyaW5nX2J1Zl9zaXplXyB8fCBzdHJpbmdfYnVmXyA9PSBOVUxMKSB7CisgICAgdm9pZCogbmV3X3N0cmluZ19idWYgPSBzdGQ6OnJlYWxsb2Moc3RyaW5nX2J1Zl8sICh1aW50MzJfdClzaXplKTsKKyAgICBpZiAobmV3X3N0cmluZ19idWYgPT0gTlVMTCkgeworICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgICB9CisgICAgc3RyaW5nX2J1Zl8gPSAodWludDhfdCopbmV3X3N0cmluZ19idWY7CisgICAgc3RyaW5nX2J1Zl9zaXplXyA9IHNpemU7CisgIH0KKyAgdHJhbnNfLT5yZWFkQWxsKHN0cmluZ19idWZfLCBzaXplKTsKKyAgc3RyLmFzc2lnbigoY2hhciopc3RyaW5nX2J1Zl8sIHNpemUpOworCisgIHJldHVybiByc2l6ZSArICh1aW50MzJfdClzaXplOworfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkVmFyaW50MzIoaW50MzJfdCYgaTMyKSB7CisgIGludDY0X3QgdmFsOworICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQ2NCh2YWwpOworICBpMzIgPSAoaW50MzJfdCl2YWw7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkVmFyaW50NjQoaW50NjRfdCYgaTY0KSB7CisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgdWludDY0X3QgdmFsID0gMDsKKyAgaW50IHNoaWZ0ID0gMDsKKyAgdWludDhfdCBidWZbMTBdOyAgLy8gNjQgYml0cyAvICg3IGJpdHMvYnl0ZSkgPSAxMCBieXRlcy4KKyAgdWludDMyX3QgYnVmX3NpemUgPSBzaXplb2YoYnVmKTsKKyAgY29uc3QgdWludDhfdCogYm9ycm93ZWQgPSB0cmFuc18tPmJvcnJvdyhidWYsICZidWZfc2l6ZSk7CisKKyAgLy8gRmFzdCBwYXRoLgorICBpZiAoYm9ycm93ZWQgIT0gTlVMTCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB1aW50OF90IGJ5dGUgPSBib3Jyb3dlZFtyc2l6ZV07CisgICAgICByc2l6ZSsrOworICAgICAgdmFsIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgc2hpZnQgKz0gNzsKKyAgICAgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgICAgICBpNjQgPSB2YWw7CisgICAgICAgIHRyYW5zXy0+Y29uc3VtZShyc2l6ZSk7CisgICAgICAgIHJldHVybiByc2l6ZTsKKyAgICAgIH0KKyAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGludmFsaWQgZGF0YSBzbyB3ZSBkb24ndCBjcmFzaC4KKyAgICAgIGlmIChVTkxJS0VMWShyc2l6ZSA9PSBzaXplb2YoYnVmKSkpIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFNsb3cgcGF0aC4KKyAgZWxzZSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHVpbnQ4X3QgYnl0ZTsKKyAgICAgIHJzaXplICs9IHRyYW5zXy0+cmVhZEFsbCgmYnl0ZSwgMSk7CisgICAgICB2YWwgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICBzaGlmdCArPSA3OworICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAgIGk2NCA9IHZhbDsKKyAgICAgICAgcmV0dXJuIHJzaXplOworICAgICAgfQorICAgICAgLy8gTWlnaHQgYXMgd2VsbCBjaGVjayBmb3IgaW52YWxpZCBkYXRhIG9uIHRoZSBzbG93IHBhdGggdG9vLgorICAgICAgaWYgKFVOTElLRUxZKHJzaXplID49IHNpemVvZihidWYpKSkgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJWYXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMuIik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK2ludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnppZ3phZ1RvSTMyKHVpbnQzMl90IG4pIHsKKyAgcmV0dXJuIChuID4+IDEpIF4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC1zdGF0aWNfY2FzdDxpbnQzMl90PihuICYgMSkpOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK2ludDY0X3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnppZ3phZ1RvSTY0KHVpbnQ2NF90IG4pIHsKKyAgcmV0dXJuIChuID4+IDEpIF4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KC1zdGF0aWNfY2FzdDxpbnQ2NF90PihuICYgMSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK1RUeXBlIFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpnZXRUVHlwZShpbnQ4X3QgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICAgIHJldHVybiBUX1NUT1A7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0U6CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRToKKyAgICAgIHJldHVybiBUX0JPT0w7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JZVEU6CisgICAgICByZXR1cm4gVF9CWVRFOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9JMTY6CisgICAgICByZXR1cm4gVF9JMTY7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0kzMjoKKyAgICAgIHJldHVybiBUX0kzMjsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfSTY0OgorICAgICAgcmV0dXJuIFRfSTY0OworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9ET1VCTEU6CisgICAgICByZXR1cm4gVF9ET1VCTEU7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JJTkFSWToKKyAgICAgIHJldHVybiBUX1NUUklORzsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfTElTVDoKKyAgICAgIHJldHVybiBUX0xJU1Q7CisgICAgY2FzZSBkZXRhaWw6OmNvbXBhY3Q6OkNUX1NFVDoKKyAgICAgIHJldHVybiBUX1NFVDsKKyAgICBjYXNlIGRldGFpbDo6Y29tcGFjdDo6Q1RfTUFQOgorICAgICAgcmV0dXJuIFRfTUFQOworICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9TVFJVQ1Q6CisgICAgICByZXR1cm4gVF9TVFJVQ1Q7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IFRFeGNlcHRpb24oc3RkOjpzdHJpbmcoImRvbid0IGtub3cgd2hhdCB0eXBlOiAiKSArIChjaGFyKXR5cGUpOworICB9Cit9CisKK319fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9UQ0NfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZkNGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK3N0YXRpYyBzdHJpbmcgYnl0ZV90b19oZXgoY29uc3QgdWludDhfdCBieXRlKSB7CisgIGNoYXIgYnVmWzNdOworICBpbnQgcmV0ID0gc3RkOjpzcHJpbnRmKGJ1ZiwgIiUwMngiLCAoaW50KWJ5dGUpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7CisgIGFzc2VydChyZXQgPT0gMik7CisgIGFzc2VydChidWZbMl0gPT0gJ1wwJyk7CisgIHJldHVybiBidWY7Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCitzdHJpbmcgVERlYnVnUHJvdG9jb2w6OmZpZWxkVHlwZU5hbWUoVFR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX1NUT1A6CisgICAgcmV0dXJuICJzdG9wIjsKKyAgY2FzZSBUX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSBUX0JPT0w6CisgICAgcmV0dXJuICJib29sIjsKKyAgY2FzZSBUX0JZVEU6CisgICAgcmV0dXJuICJieXRlIjsKKyAgY2FzZSBUX0kxNjoKKyAgICByZXR1cm4gImkxNiI7CisgIGNhc2UgVF9JMzI6CisgICAgcmV0dXJuICJpMzIiOworICBjYXNlIFRfVTY0OgorICAgIHJldHVybiAidTY0IjsKKyAgY2FzZSBUX0k2NDoKKyAgICByZXR1cm4gImk2NCI7CisgIGNhc2UgVF9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBjYXNlIFRfU1RSSU5HOgorICAgIHJldHVybiAic3RyaW5nIjsKKyAgY2FzZSBUX1NUUlVDVDoKKyAgICByZXR1cm4gInN0cnVjdCI7CisgIGNhc2UgVF9NQVA6CisgICAgcmV0dXJuICJtYXAiOworICBjYXNlIFRfU0VUOgorICAgIHJldHVybiAic2V0IjsKKyAgY2FzZSBUX0xJU1Q6CisgICAgcmV0dXJuICJsaXN0IjsKKyAgY2FzZSBUX1VURjg6CisgICAgcmV0dXJuICJ1dGY4IjsKKyAgY2FzZSBUX1VURjE2OgorICAgIHJldHVybiAidXRmMTYiOworICBkZWZhdWx0OgorICAgIHJldHVybiAidW5rbm93biI7CisgIH0KK30KKwordm9pZCBURGVidWdQcm90b2NvbDo6aW5kZW50VXAoKSB7CisgIGluZGVudF9zdHJfICs9IHN0cmluZyhpbmRlbnRfaW5jLCAnICcpOworfQorCit2b2lkIFREZWJ1Z1Byb3RvY29sOjppbmRlbnREb3duKCkgeworICBpZiAoaW5kZW50X3N0cl8ubGVuZ3RoKCkgPCAoc3RyaW5nOjpzaXplX3R5cGUpaW5kZW50X2luYykgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgIH0KKyAgaW5kZW50X3N0cl8uZXJhc2UoaW5kZW50X3N0cl8ubGVuZ3RoKCkgLSBpbmRlbnRfaW5jKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlUGxhaW4oY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgaWYgKHN0ci5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSW5kZW50ZWQoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgaWYgKHN0ci5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICBpZiAoaW5kZW50X3N0cl8ubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdWludDY0X3QgdG90YWxfbGVuID0gaW5kZW50X3N0cl8ubGVuZ3RoKCkgKyBzdHIubGVuZ3RoKCk7CisgIGlmICh0b3RhbF9sZW4gPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdHJhbnNfLT53cml0ZSgodWludDhfdCopaW5kZW50X3N0cl8uZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZW50X3N0cl8ubGVuZ3RoKCkpKTsKKyAgdHJhbnNfLT53cml0ZSgodWludDhfdCopc3RyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5sZW5ndGgoKSkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGVudF9zdHJfLmxlbmd0aCgpICsgc3RyLmxlbmd0aCgpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OnN0YXJ0SXRlbSgpIHsKKyAgdWludDMyX3Qgc2l6ZTsKKworICBzd2l0Y2ggKHdyaXRlX3N0YXRlXy5iYWNrKCkpIHsKKyAgY2FzZSBVTklOSVQ6CisgICAgLy8gWFhYIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBoZXJlLgorICAgIC8vIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgLy8gcmV0dXJuIHdyaXRlSW5kZW50ZWQoc3RyKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBTVFJVQ1Q6CisgICAgcmV0dXJuIDA7CisgIGNhc2UgU0VUOgorICAgIHJldHVybiB3cml0ZUluZGVudGVkKCIiKTsKKyAgY2FzZSBNQVBfS0VZOgorICAgIHJldHVybiB3cml0ZUluZGVudGVkKCIiKTsKKyAgY2FzZSBNQVBfVkFMVUU6CisgICAgcmV0dXJuIHdyaXRlUGxhaW4oIiAtPiAiKTsKKyAgY2FzZSBMSVNUOgorICAgIHNpemUgPSB3cml0ZUluZGVudGVkKCJbIiArIHRvX3N0cmluZyhsaXN0X2lkeF8uYmFjaygpKSArICJdID0gIik7CisgICAgbGlzdF9pZHhfLmJhY2soKSsrOworICAgIHJldHVybiBzaXplOworICBkZWZhdWx0OgorICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkludmFsaWQgZW51bSB2YWx1ZS4iKTsKKyAgfQorfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6ZW5kSXRlbSgpIHsKKyAgLy8gdWludDMyX3Qgc2l6ZTsKKworICBzd2l0Y2ggKHdyaXRlX3N0YXRlXy5iYWNrKCkpIHsKKyAgY2FzZSBVTklOSVQ6CisgICAgLy8gWFhYIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBoZXJlLgorICAgIC8vIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgLy8gcmV0dXJuIHdyaXRlSW5kZW50ZWQoc3RyKTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBTVFJVQ1Q6CisgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOworICBjYXNlIFNFVDoKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7CisgIGNhc2UgTUFQX0tFWToKKyAgICB3cml0ZV9zdGF0ZV8uYmFjaygpID0gTUFQX1ZBTFVFOworICAgIHJldHVybiAwOworICBjYXNlIE1BUF9WQUxVRToKKyAgICB3cml0ZV9zdGF0ZV8uYmFjaygpID0gTUFQX0tFWTsKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7CisgIGNhc2UgTElTVDoKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiSW52YWxpZCBlbnVtIHZhbHVlLiIpOworICB9Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUl0ZW0oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSBzdGFydEl0ZW0oKTsKKyAgc2l6ZSArPSB3cml0ZVBsYWluKHN0cik7CisgIHNpemUgKz0gZW5kSXRlbSgpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgICh2b2lkKXNlcWlkOworICBzdHJpbmcgbXR5cGU7CisgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHsKKyAgY2FzZSBUX0NBTEw6CisgICAgbXR5cGUgPSAiY2FsbCI7CisgICAgYnJlYWs7CisgIGNhc2UgVF9SRVBMWToKKyAgICBtdHlwZSA9ICJyZXBseSI7CisgICAgYnJlYWs7CisgIGNhc2UgVF9FWENFUFRJT046CisgICAgbXR5cGUgPSAiZXhuIjsKKyAgICBicmVhazsKKyAgY2FzZSBUX09ORVdBWToKKyAgICBtdHlwZSA9ICJvbmV3YXkiOworICAgIGJyZWFrOworICB9CisKKyAgdWludDMyX3Qgc2l6ZSA9IHdyaXRlSW5kZW50ZWQoIigiICsgbXR5cGUgKyAiKSAiICsgbmFtZSArICIoIik7CisgIGluZGVudFVwKCk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgeworICBpbmRlbnREb3duKCk7CisgIHJldHVybiB3cml0ZUluZGVudGVkKCIpXG4iKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSBzdGFydEl0ZW0oKTsKKyAgc2l6ZSArPSB3cml0ZVBsYWluKHN0cmluZyhuYW1lKSArICIge1xuIik7CisgIGluZGVudFVwKCk7CisgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soU1RSVUNUKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKKyAgaW5kZW50RG93bigpOworICB3cml0ZV9zdGF0ZV8ucG9wX2JhY2soKTsKKyAgdWludDMyX3Qgc2l6ZSA9IDA7CisgIHNpemUgKz0gd3JpdGVJbmRlbnRlZCgifSIpOworICBzaXplICs9IGVuZEl0ZW0oKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgLy8gc3ByaW50ZihpZF9zdHIsICIlMDJkIiwgZmllbGRJZCk7CisgIHN0cmluZyBpZF9zdHIgPSB0b19zdHJpbmcoZmllbGRJZCk7CisgIGlmIChpZF9zdHIubGVuZ3RoKCkgPT0gMSkKKyAgICBpZF9zdHIgPSAnMCcgKyBpZF9zdHI7CisKKyAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoaWRfc3RyICsgIjogIiArIG5hbWUgKyAiICgiICsgZmllbGRUeXBlTmFtZShmaWVsZFR5cGUpICsgIikgPSAiKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7CisgIGFzc2VydCh3cml0ZV9zdGF0ZV8uYmFjaygpID09IFNUUlVDVCk7CisgIHJldHVybiAwOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVGaWVsZFN0b3AoKSB7CisgIHJldHVybiAwOworICAvLyB3cml0ZUluZGVudGVkKCIqKipTVE9QKioqXG4iKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgbWFwcz8KKyAgdWludDMyX3QgYnNpemUgPSAwOworICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKKyAgYnNpemUgKz0gd3JpdGVQbGFpbigKKyAgICAgICJtYXA8IiArIGZpZWxkVHlwZU5hbWUoa2V5VHlwZSkgKyAiLCIgKyBmaWVsZFR5cGVOYW1lKHZhbFR5cGUpICsgIj4iCisgICAgICAiWyIgKyB0b19zdHJpbmcoc2l6ZSkgKyAiXSB7XG4iKTsKKyAgaW5kZW50VXAoKTsKKyAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhNQVBfS0VZKTsKKyAgcmV0dXJuIGJzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7CisgIGluZGVudERvd24oKTsKKyAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7CisgIHVpbnQzMl90IHNpemUgPSAwOworICBzaXplICs9IHdyaXRlSW5kZW50ZWQoIn0iKTsKKyAgc2l6ZSArPSBlbmRJdGVtKCk7CisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgLy8gVE9ETyhkcmVpc3MpOiBPcHRpbWl6ZSBzaG9ydCBhcnJheXMuCisgIHVpbnQzMl90IGJzaXplID0gMDsKKyAgYnNpemUgKz0gc3RhcnRJdGVtKCk7CisgIGJzaXplICs9IHdyaXRlUGxhaW4oCisgICAgICAibGlzdDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOworICBpbmRlbnRVcCgpOworICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKExJU1QpOworICBsaXN0X2lkeF8ucHVzaF9iYWNrKDApOworICByZXR1cm4gYnNpemU7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUxpc3RFbmQoKSB7CisgIGluZGVudERvd24oKTsKKyAgd3JpdGVfc3RhdGVfLnBvcF9iYWNrKCk7CisgIGxpc3RfaWR4Xy5wb3BfYmFjaygpOworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7CisgIHNpemUgKz0gZW5kSXRlbSgpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgLy8gVE9ETyhkcmVpc3MpOiBPcHRpbWl6ZSBzaG9ydCBzZXRzLgorICB1aW50MzJfdCBic2l6ZSA9IDA7CisgIGJzaXplICs9IHN0YXJ0SXRlbSgpOworICBic2l6ZSArPSB3cml0ZVBsYWluKAorICAgICAgInNldDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOworICBpbmRlbnRVcCgpOworICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFNFVCk7CisgIHJldHVybiBic2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlU2V0RW5kKCkgeworICBpbmRlbnREb3duKCk7CisgIHdyaXRlX3N0YXRlXy5wb3BfYmFjaygpOworICB1aW50MzJfdCBzaXplID0gMDsKKyAgc2l6ZSArPSB3cml0ZUluZGVudGVkKCJ9Iik7CisgIHNpemUgKz0gZW5kSXRlbSgpOworICByZXR1cm4gc2l6ZTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgIHJldHVybiB3cml0ZUl0ZW0odmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICByZXR1cm4gd3JpdGVJdGVtKCIweCIgKyBieXRlX3RvX2hleChieXRlKSk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhpMTYpKTsKK30KKwordWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGkzMikpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTY0KSk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGR1YikpOworfQorCit1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgLy8gWFhYIFJhdy9VVEYtOD8KKworICBzdHJpbmcgdG9fc2hvdyA9IHN0cjsKKyAgaWYgKHRvX3Nob3cubGVuZ3RoKCkgPiAoc3RyaW5nOjpzaXplX3R5cGUpc3RyaW5nX2xpbWl0XykgeworICAgIHRvX3Nob3cgPSBzdHIuc3Vic3RyKDAsIHN0cmluZ19wcmVmaXhfc2l6ZV8pOworICAgIHRvX3Nob3cgKz0gIlsuLi5dKCIgKyB0b19zdHJpbmcoc3RyLmxlbmd0aCgpKSArICIpIjsKKyAgfQorCisgIHN0cmluZyBvdXRwdXQgPSAiXCIiOworCisgIGZvciAoc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IHRvX3Nob3cuYmVnaW4oKTsgaXQgIT0gdG9fc2hvdy5lbmQoKTsgKytpdCkgeworICAgIGlmICgqaXQgPT0gJ1xcJykgeworICAgICAgb3V0cHV0ICs9ICJcXFxcIjsKKyAgICB9IGVsc2UgaWYgKCppdCA9PSAnIicpIHsKKyAgICAgIG91dHB1dCArPSAiXFxcIiI7CisgICAgICAvLyBwYXNzaW5nIGNoYXJhY3RlcnMgPDAgdG8gc3RkOjppc3ByaW50IGNhdXNlcyBhc3NlcnRzLiBpc3ByaW50IHRha2VzIGFuCisgICAgICAvLyBpbnQsIHNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzaWduIGV4dGVuc2lvbgorICAgIH0gZWxzZSBpZiAoc3RkOjppc3ByaW50KCh1bnNpZ25lZCBjaGFyKSppdCkpIHsKKyAgICAgIG91dHB1dCArPSAqaXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoKml0KSB7CisgICAgICBjYXNlICdcYSc6CisgICAgICAgIG91dHB1dCArPSAiXFxhIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcYic6CisgICAgICAgIG91dHB1dCArPSAiXFxiIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcZic6CisgICAgICAgIG91dHB1dCArPSAiXFxmIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcbic6CisgICAgICAgIG91dHB1dCArPSAiXFxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdccic6CisgICAgICAgIG91dHB1dCArPSAiXFxyIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcdCc6CisgICAgICAgIG91dHB1dCArPSAiXFx0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcdic6CisgICAgICAgIG91dHB1dCArPSAiXFx2IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBvdXRwdXQgKz0gIlxceCI7CisgICAgICAgIG91dHB1dCArPSBieXRlX3RvX2hleCgqaXQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG91dHB1dCArPSAnXCInOworICByZXR1cm4gd3JpdGVJdGVtKG91dHB1dCk7Cit9CisKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdHJpbmcmIHN0cikgeworICAvLyBYWFggSGV4PworICByZXR1cm4gVERlYnVnUHJvdG9jb2w6OndyaXRlU3RyaW5nKHN0cik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDc5NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8qCisKKyEhISBFWFBFUklNRU5UQUwgQ09ERSAhISEKKworVGhpcyBwcm90b2NvbCBpcyB2ZXJ5IG11Y2ggYSB3b3JrIGluIHByb2dyZXNzLgorSXQgZG9lc24ndCBoYW5kbGUgbWFueSBjYXNlcyBwcm9wZXJseS4KK0l0IHRocm93cyBleGNlcHRpb25zIGluIG1hbnkgY2FzZXMuCitJdCBwcm9iYWJseSBzZWdmYXVsdHMgaW4gbWFueSBjYXNlcy4KK0J1ZyByZXBvcnRzIGFuZCBmZWF0dXJlIHJlcXVlc3RzIGFyZSB3ZWxjb21lLgorQ29tcGxhaW50cyBhcmUgbm90LiA6UgorCisqLworCisvKioKKyAqIFByb3RvY29sIHRoYXQgcHJpbnRzIHRoZSBwYXlsb2FkIGluIGEgbmljZSBodW1hbi1yZWFkYWJsZSBmb3JtYXQuCisgKiBSZWFkaW5nIGZyb20gdGhpcyBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkLgorICoKKyAqLworY2xhc3MgVERlYnVnUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxURGVidWdQcm90b2NvbD4geworcHJpdmF0ZToKKyAgZW51bSB3cml0ZV9zdGF0ZV90IHsgVU5JTklULCBTVFJVQ1QsIExJU1QsIFNFVCwgTUFQX0tFWSwgTUFQX1ZBTFVFIH07CisKK3B1YmxpYzoKKyAgVERlYnVnUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKQorICAgIDogVFZpcnR1YWxQcm90b2NvbDxURGVidWdQcm90b2NvbD4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIHN0cmluZ19saW1pdF8oREVGQVVMVF9TVFJJTkdfTElNSVQpLAorICAgICAgc3RyaW5nX3ByZWZpeF9zaXplXyhERUZBVUxUX1NUUklOR19QUkVGSVhfU0laRSkgeworICAgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soVU5JTklUKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfU1RSSU5HX0xJTUlUID0gMjU2OworICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1NUUklOR19QUkVGSVhfU0laRSA9IDE2OworCisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KKworICB2b2lkIHNldFN0cmluZ1ByZWZpeFNpemUoaW50MzJfdCBzdHJpbmdfcHJlZml4X3NpemUpIHsgc3RyaW5nX3ByZWZpeF9zaXplXyA9IHN0cmluZ19wcmVmaXhfc2l6ZTsgfQorCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOworCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOworCisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7CisKKyAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOworCisgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKKworICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworcHJpdmF0ZToKKyAgdm9pZCBpbmRlbnRVcCgpOworICB2b2lkIGluZGVudERvd24oKTsKKyAgdWludDMyX3Qgd3JpdGVQbGFpbihjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKyAgdWludDMyX3Qgd3JpdGVJbmRlbnRlZChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKyAgdWludDMyX3Qgc3RhcnRJdGVtKCk7CisgIHVpbnQzMl90IGVuZEl0ZW0oKTsKKyAgdWludDMyX3Qgd3JpdGVJdGVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBmaWVsZFR5cGVOYW1lKFRUeXBlIHR5cGUpOworCisgIFRUcmFuc3BvcnQqIHRyYW5zXzsKKworICBpbnQzMl90IHN0cmluZ19saW1pdF87CisgIGludDMyX3Qgc3RyaW5nX3ByZWZpeF9zaXplXzsKKworICBzdGQ6OnN0cmluZyBpbmRlbnRfc3RyXzsKKyAgc3RhdGljIGNvbnN0IGludCBpbmRlbnRfaW5jID0gMjsKKworICBzdGQ6OnZlY3Rvcjx3cml0ZV9zdGF0ZV90PiB3cml0ZV9zdGF0ZV87CisgIHN0ZDo6dmVjdG9yPGludD4gbGlzdF9pZHhfOworfTsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGRlYnVnIHByb3RvY29sIGhhbmRsZXJzCisgKi8KK2NsYXNzIFREZWJ1Z1Byb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KKyAgdmlydHVhbCB+VERlYnVnUHJvdG9jb2xGYWN0b3J5KCkge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFREZWJ1Z1Byb3RvY29sKHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisvLyBUT0RPKGRyZWlzcyk6IE1vdmUgKHBhcnQgb2YpIFRocmlmdERlYnVnU3RyaW5nIGludG8gYSAuY3BwIGZpbGUgYW5kIHJlbW92ZSB0aGlzLgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRocmlmdFN0cnVjdD4KK3N0ZDo6c3RyaW5nIFRocmlmdERlYnVnU3RyaW5nKGNvbnN0IFRocmlmdFN0cnVjdCYgdHMpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CisgIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgVERlYnVnUHJvdG9jb2wgcHJvdG9jb2wodHJhbnMpOworCisgIHRzLndyaXRlKCZwcm90b2NvbCk7CisKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBzaXplOworICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7CisgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOworfQorCisvLyBUT0RPKGRyZWlzcyk6IFRoaXMgaXMgYmFkbHkgYnJva2VuLiAgRG9uJ3QgdXNlIGl0IHVubGVzcyB5b3UgYXJlIG1lLgorI2lmIDAKK3RlbXBsYXRlPHR5cGVuYW1lIE9iamVjdD4KK3N0ZDo6c3RyaW5nIERlYnVnU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPE9iamVjdD4mIHZlYykgeworICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKKyAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOworICBURGVidWdQcm90b2NvbCBwcm90b2NvbCh0cmFucyk7CisKKyAgLy8gSSBhbSBncm9zcyEKKyAgcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbigiU29tZVJhbmRvbVZlY3RvciIpOworCisgIC8vIFRPRE86IEZpeCB0aGlzIHdpdGggYSB0cmFpdC4KKyAgcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4oKFRUeXBlKTk5LCB2ZWMuc2l6ZSgpKTsKKyAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8T2JqZWN0Pjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSB2ZWMuYmVnaW4oKTsgaXQgIT0gdmVjLmVuZCgpOyArK2l0KSB7CisgICAgaXQtPndyaXRlKCZwcm90b2NvbCk7CisgIH0KKyAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBzaXplOworICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7CisgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOworfQorI2VuZGlmIC8vIDAKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVCVUdQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQyZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9DUFBfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfQ1BQXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordm9pZCBUSGVhZGVyUHJvdG9jb2w6OnJlc2V0UHJvdG9jb2woKSB7CisgIGlmIChwcm90b18gJiYgcHJvdG9JZF8gPT0gdHJhbnNfLT5nZXRQcm90b2NvbElkKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBwcm90b0lkXyA9IHRyYW5zXy0+Z2V0UHJvdG9jb2xJZCgpOworCisgIHN3aXRjaCAocHJvdG9JZF8pIHsKKyAgY2FzZSBUX0JJTkFSWV9QUk9UT0NPTDoKKyAgICBwcm90b18gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOworICAgIGJyZWFrOworCisgIGNhc2UgVF9DT01QQUNUX1BST1RPQ09MOgorICAgIHByb3RvXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VENvbXBhY3RQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcHJvdG9jb2wgcmVxdWVzdGVkIik7CisgIH0KK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcUlkKSB7CisgIHJlc2V0UHJvdG9jb2woKTsgLy8gUmVzZXQgaW4gY2FzZSB3ZSBjaGFuZ2VkIHByb3RvY29scworICB0cmFuc18tPnNldFNlcXVlbmNlTnVtYmVyKHNlcUlkKTsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcUlkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWVzc2FnZUVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVN0cnVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRmllbGRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVGaWVsZFN0b3AoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWFwRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVMaXN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTZXRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUJvb2wodmFsdWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUJ5dGUoYnl0ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVJMTYoaTE2KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUkzMihpMzIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIHJldHVybiBwcm90b18tPndyaXRlSTY0KGk2NCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZURvdWJsZShkdWIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTdHJpbmcoc3RyKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlQmluYXJ5KHN0cik7Cit9CisKKy8qKgorICogUmVhZGluZyBmdW5jdGlvbnMKKyAqLworCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFJZCkgeworICAvLyBSZWFkIHRoZSBuZXh0IGZyYW1lLCBhbmQgY2hhbmdlIHByb3RvY29scyBpZiBuZWVkZWQKKyAgdHJ5IHsKKyAgICB0cmFuc18tPnJlc2V0UHJvdG9jb2woKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYgZXgpIHsKKyAgICB3cml0ZU1lc3NhZ2VCZWdpbigiIiwgVF9FWENFUFRJT04sIDApOworICAgIGV4LndyaXRlKChUUHJvdG9jb2wqKXRoaXMpOworICAgIHdyaXRlTWVzc2FnZUVuZCgpOworICAgIHRyYW5zXy0+Zmx1c2goKTsKKworICAgIC8vIFRoZSBmcmFtaW5nIGlzIHN0aWxsIGdvb2QsIGJ1dCB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMgcHJvdG9jb2wuCisgICAgLy8gSW4gdGhlIGZ1dHVyZSwgdGhpcyBjb3VsZCBiZSBtYWRlIGEgY2xpZW50LXNpZGUgb25seSBlcnJvciBpZgorICAgIC8vIGNvbm5lY3Rpb24gcG9vbGluZyBpcyB1c2VkLgorICAgIHRocm93IGV4OworICB9CisgIHJldHVybiBwcm90b18tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcUlkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRTdHJ1Y3RFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEZpZWxkRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNYXBFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRNYXBFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRMaXN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU2V0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkU2V0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEJvb2wodmFsdWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkQnl0ZShieXRlKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkSTE2KGludDE2X3QmIGkxNikgeworICByZXR1cm4gcHJvdG9fLT5yZWFkSTE2KGkxNik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEkzMihpMzIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgIHJldHVybiBwcm90b18tPnJlYWRJNjQoaTY0KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgIHJldHVybiBwcm90b18tPnJlYWREb3VibGUoZHViKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFN0cmluZyhzdHIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIGJpbmFyeSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkQmluYXJ5KGJpbmFyeSk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0NQUF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWUyYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXworI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSGVhZGVyVHJhbnNwb3J0OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoqCisgKiBUaGUgaGVhZGVyIHByb3RvY29sIGZvciB0aHJpZnQuIFJlYWRzIHVuZnJhbWVkLCBmcmFtZWQsIGhlYWRlciBmb3JtYXQsCisgKiBhbmQgaHR0cAorICoKKyAqLworY2xhc3MgVEhlYWRlclByb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPiB7Citwcm90ZWN0ZWQ6CitwdWJsaWM6CisgIHZvaWQgcmVzZXRQcm90b2NvbCgpOworCisgIGV4cGxpY2l0IFRIZWFkZXJQcm90b2NvbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvdG9JZCA9IFRfQ09NUEFDVF9QUk9UT0NPTCkKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIZWFkZXJUcmFuc3BvcnQodHJhbnMpKSksCisgICAgICB0cmFuc18oc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUSGVhZGVyVHJhbnNwb3J0PihnZXRUcmFuc3BvcnQoKSkpLAorICAgICAgcHJvdG9JZF8ocHJvdG9JZCkgeworICAgIHRyYW5zXy0+c2V0UHJvdG9jb2xJZChwcm90b0lkKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0KKworICBUSGVhZGVyUHJvdG9jb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBpblRyYW5zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBvdXRUcmFucywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvSWQgPSBUX0NPTVBBQ1RfUFJPVE9DT0wpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD4oCisgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KGluVHJhbnMsIG91dFRyYW5zKSkpLAorICAgICAgdHJhbnNfKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEhlYWRlclRyYW5zcG9ydD4oZ2V0VHJhbnNwb3J0KCkpKSwKKyAgICAgIHByb3RvSWRfKHByb3RvSWQpIHsKKyAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CisgICAgcmVzZXRQcm90b2NvbCgpOworICB9CisKKyAgflRIZWFkZXJQcm90b2NvbCgpIHt9CisKKyAgLyoqCisgICAqIEZ1bmN0aW9ucyB0byB3b3JrIHdpdGggaGVhZGVycyBieSBjYWxsaW5nIGludG8gVEhlYWRlclRyYW5zcG9ydAorICAgKi8KKyAgdm9pZCBzZXRQcm90b2NvbElkKHVpbnQxNl90IHByb3RvSWQpIHsKKyAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CisgICAgcmVzZXRQcm90b2NvbCgpOworICB9CisKKyAgdHlwZWRlZiBUSGVhZGVyVHJhbnNwb3J0OjpTdHJpbmdUb1N0cmluZ01hcCBTdHJpbmdUb1N0cmluZ01hcDsKKworICAvLyB0aGVzZSB3b3JrIHdpdGggd3JpdGUgaGVhZGVycworICB2b2lkIHNldEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICB0cmFuc18tPnNldEhlYWRlcihrZXksIHZhbHVlKTsKKyAgfQorCisgIHZvaWQgY2xlYXJIZWFkZXJzKCkgeyB0cmFuc18tPmNsZWFySGVhZGVycygpOyB9CisKKyAgU3RyaW5nVG9TdHJpbmdNYXAmIGdldFdyaXRlSGVhZGVycygpIHsgcmV0dXJuIHRyYW5zXy0+Z2V0V3JpdGVIZWFkZXJzKCk7IH0KKworICAvLyB0aGVzZSB3b3JrIHdpdGggcmVhZCBoZWFkZXJzCisgIGNvbnN0IFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRIZWFkZXJzKCkgY29uc3QgeyByZXR1cm4gdHJhbnNfLT5nZXRIZWFkZXJzKCk7IH0KKworICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMuCisgICAqLworCisgIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxSWQpOworCisgIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKKworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOworCisgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOworCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKKworICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7CisKKyAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLyoqCisgICAqIFJlYWRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIC8qb2wqLyB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFJZCk7CisKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOworCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTWFwRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkU2V0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOworICAvLyBQcm92aWRlIHRoZSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6dmVjdG9yPGJvb2w+CisgIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPjo6cmVhZEJvb2w7CisKKyAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOworCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIGJpbmFyeSk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRIZWFkZXJUcmFuc3BvcnQ+IHRyYW5zXzsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b187CisgIHVpbnQzMl90IHByb3RvSWRfOworfTsKKworY2xhc3MgVEhlYWRlclByb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFucykgeworICAgIFRIZWFkZXJQcm90b2NvbCogaGVhZGVyUHJvdG9jb2wKKyAgICAgICAgPSBuZXcgVEhlYWRlclByb3RvY29sKHRyYW5zLCB0cmFucywgVF9CSU5BUllfUFJPVE9DT0wpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihoZWFkZXJQcm90b2NvbCk7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gaW5UcmFucywKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IG91dFRyYW5zKSB7CisgICAgVEhlYWRlclByb3RvY29sKiBoZWFkZXJQcm90b2NvbCA9IG5ldyBUSGVhZGVyUHJvdG9jb2woaW5UcmFucywgb3V0VHJhbnMsIFRfQklOQVJZX1BST1RPQ09MKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4oaGVhZGVyUHJvdG9jb2wpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzZmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKQEAgLTAsMCArMSwxMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorCisjaW5jbHVkZSA8Ym9vc3QvbG9jYWxlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zL2ZwY2xhc3NpZnkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L21hdGgvc3BlY2lhbF9mdW5jdGlvbnMvc2lnbi5ocHA+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCisvLyBTdGF0aWMgZGF0YQorCitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTk9iamVjdFN0YXJ0ID0gJ3snOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05PYmplY3RFbmQgPSAnfSc7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5U3RhcnQgPSAnWyc7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5RW5kID0gJ10nOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05QYWlyU2VwYXJhdG9yID0gJzonOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05FbGVtU2VwYXJhdG9yID0gJywnOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05CYWNrc2xhc2ggPSAnXFwnOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05TdHJpbmdEZWxpbWl0ZXIgPSAnIic7CitzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkVzY2FwZUNoYXIgPSAndSc7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrSlNPTkVzY2FwZVByZWZpeCgiXFx1MDAiKTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtUaHJpZnRWZXJzaW9uMSA9IDE7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGhyaWZ0TmFuKCJOYU4iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVGhyaWZ0SW5maW5pdHkoIkluZmluaXR5Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1RocmlmdE5lZ2F0aXZlSW5maW5pdHkoIi1JbmZpbml0eSIpOworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lQm9vbCgidGYiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVCeXRlKCJpOCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUkxNigiaTE2Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lSTMyKCJpMzIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVJNjQoImk2NCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZURvdWJsZSgiZGJsIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lU3RydWN0KCJyZWMiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVHlwZU5hbWVTdHJpbmcoInN0ciIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZU1hcCgibWFwIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lTGlzdCgibHN0Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1R5cGVOYW1lU2V0KCJzZXQiKTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRUeXBlTmFtZUZvclR5cGVJRChUVHlwZSB0eXBlSUQpIHsKKyAgc3dpdGNoICh0eXBlSUQpIHsKKyAgY2FzZSBUX0JPT0w6CisgICAgcmV0dXJuIGtUeXBlTmFtZUJvb2w7CisgIGNhc2UgVF9CWVRFOgorICAgIHJldHVybiBrVHlwZU5hbWVCeXRlOworICBjYXNlIFRfSTE2OgorICAgIHJldHVybiBrVHlwZU5hbWVJMTY7CisgIGNhc2UgVF9JMzI6CisgICAgcmV0dXJuIGtUeXBlTmFtZUkzMjsKKyAgY2FzZSBUX0k2NDoKKyAgICByZXR1cm4ga1R5cGVOYW1lSTY0OworICBjYXNlIFRfRE9VQkxFOgorICAgIHJldHVybiBrVHlwZU5hbWVEb3VibGU7CisgIGNhc2UgVF9TVFJJTkc6CisgICAgcmV0dXJuIGtUeXBlTmFtZVN0cmluZzsKKyAgY2FzZSBUX1NUUlVDVDoKKyAgICByZXR1cm4ga1R5cGVOYW1lU3RydWN0OworICBjYXNlIFRfTUFQOgorICAgIHJldHVybiBrVHlwZU5hbWVNYXA7CisgIGNhc2UgVF9TRVQ6CisgICAgcmV0dXJuIGtUeXBlTmFtZVNldDsKKyAgY2FzZSBUX0xJU1Q6CisgICAgcmV0dXJuIGtUeXBlTmFtZUxpc3Q7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgfQorfQorCitzdGF0aWMgVFR5cGUgZ2V0VHlwZUlERm9yVHlwZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgVFR5cGUgcmVzdWx0ID0gVF9TVE9QOyAvLyBTZW50aW5lbCB2YWx1ZQorICBpZiAobmFtZS5sZW5ndGgoKSA+IDEpIHsKKyAgICBzd2l0Y2ggKG5hbWVbMF0pIHsKKyAgICBjYXNlICdkJzoKKyAgICAgIHJlc3VsdCA9IFRfRE9VQkxFOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaSc6CisgICAgICBzd2l0Y2ggKG5hbWVbMV0pIHsKKyAgICAgIGNhc2UgJzgnOgorICAgICAgICByZXN1bHQgPSBUX0JZVEU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnMSc6CisgICAgICAgIHJlc3VsdCA9IFRfSTE2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzMnOgorICAgICAgICByZXN1bHQgPSBUX0kzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc2JzoKKyAgICAgICAgcmVzdWx0ID0gVF9JNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICByZXN1bHQgPSBUX0xJU1Q7CisgICAgICBicmVhazsKKyAgICBjYXNlICdtJzoKKyAgICAgIHJlc3VsdCA9IFRfTUFQOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CisgICAgICByZXN1bHQgPSBUX1NUUlVDVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3MnOgorICAgICAgaWYgKG5hbWVbMV0gPT0gJ3QnKSB7CisgICAgICAgIHJlc3VsdCA9IFRfU1RSSU5HOworICAgICAgfSBlbHNlIGlmIChuYW1lWzFdID09ICdlJykgeworICAgICAgICByZXN1bHQgPSBUX1NFVDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3QnOgorICAgICAgcmVzdWx0ID0gVF9CT09MOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChyZXN1bHQgPT0gVF9TVE9QKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaGFuZGxpbmcgZm9yIHRoZSBmaXJzdCAweDMwIGNoYXJhY3RlcnMKKy8vICAwIDogZXNjYXBlIHVzaW5nICJcdTAweHgiIG5vdGF0aW9uCisvLyAgMSA6IGp1c3Qgb3V0cHV0IGluZGV4CisvLyA8b3RoZXI+IDogZXNjYXBlIHVzaW5nICJcPG90aGVyPiIgbm90YXRpb24KK3N0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQ2hhclRhYmxlWzB4MzBdID0geworICAgIC8vICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgICdiJywKKyAgICAndCcsCisgICAgJ24nLAorICAgIDAsCisgICAgJ2YnLAorICAgICdyJywKKyAgICAwLAorICAgIDAsIC8vIDAKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLCAvLyAxCisgICAgMSwKKyAgICAxLAorICAgICciJywKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLCAvLyAyCit9OworCisvLyBUaGlzIHN0cmluZydzIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbGVtZW50cyBpbiBrRXNjYXBlQ2hhclZhbHMuCisvLyBJIGRvbid0IGhhdmUgJy8nIG9uIHRoaXMgbGlzdCBldmVuIHRob3VnaCBpdCBhcHBlYXJzIG9uIHd3dy5qc29uLm9yZyAtLQorLy8gaXQgaXMgbm90IGluIHRoZSBSRkMKK2NvbnN0IHN0YXRpYyBzdGQ6OnN0cmluZyBrRXNjYXBlQ2hhcnMoIlwiXFxiZm5ydCIpOworCisvLyBUaGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KKy8vIGtFc2NhcGVDaGFycworY29uc3Qgc3RhdGljIHVpbnQ4X3Qga0VzY2FwZUNoYXJWYWxzWzddID0geworICAgICciJywKKyAgICAnXFwnLAorICAgICdcYicsCisgICAgJ1xmJywKKyAgICAnXG4nLAorICAgICdccicsCisgICAgJ1x0JywKK307CisKKy8vIFN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCisKKy8vIFJlYWQgMSBjaGFyYWN0ZXIgZnJvbSB0aGUgdHJhbnNwb3J0IHRyYW5zIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyB0aGUKKy8vIGV4cGVjdGVkIGNoYXJhY3RlciBjaC4KKy8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIGl0IGlzIG5vdC4KK3N0YXRpYyB1aW50MzJfdCByZWFkU3ludGF4Q2hhcihUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXImIHJlYWRlciwgdWludDhfdCBjaCkgeworICB1aW50OF90IGNoMiA9IHJlYWRlci5yZWFkKCk7CisgIGlmIChjaDIgIT0gY2gpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBcJyIgKyBzdGQ6OnN0cmluZygoY2hhciopJmNoLCAxKSArICJcJzsgZ290IFwnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ZDo6c3RyaW5nKChjaGFyKikmY2gyLCAxKSArICJcJy4iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gUmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgaGV4IGNoYXJhY3RlciBjaC4KKy8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IFswLTlhLWZdLgorc3RhdGljIHVpbnQ4X3QgaGV4VmFsKHVpbnQ4X3QgY2gpIHsKKyAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKSB7CisgICAgcmV0dXJuIGNoIC0gJzAnOworICB9IGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7CisgICAgcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pOyBnb3QgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIqKSZjaCwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCcuIik7CisgIH0KK30KKworLy8gUmV0dXJuIHRoZSBoZXggY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgaW50ZWdlciB2YWwuIFRoZSB2YWx1ZSBpcyBtYXNrZWQKKy8vIHRvIG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgY29ycmVjdCByYW5nZS4KK3N0YXRpYyB1aW50OF90IGhleENoYXIodWludDhfdCB2YWwpIHsKKyAgdmFsICY9IDB4MEY7CisgIGlmICh2YWwgPCAxMCkgeworICAgIHJldHVybiB2YWwgKyAnMCc7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHZhbCAtIDEwICsgJ2EnOworICB9Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgY2ggaXMgaW4gWy0rMC05LkVlXTsgZmFsc2Ugb3RoZXJ3aXNlCitzdGF0aWMgYm9vbCBpc0pTT05OdW1lcmljKHVpbnQ4X3QgY2gpIHsKKyAgc3dpdGNoIChjaCkgeworICBjYXNlICcrJzoKKyAgY2FzZSAnLSc6CisgIGNhc2UgJy4nOgorICBjYXNlICcwJzoKKyAgY2FzZSAnMSc6CisgIGNhc2UgJzInOgorICBjYXNlICczJzoKKyAgY2FzZSAnNCc6CisgIGNhc2UgJzUnOgorICBjYXNlICc2JzoKKyAgY2FzZSAnNyc6CisgIGNhc2UgJzgnOgorICBjYXNlICc5JzoKKyAgY2FzZSAnRSc6CisgIGNhc2UgJ2UnOgorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvZGUgdW5pdCBpcyBoaWdoIHN1cnJvZ2F0ZQorc3RhdGljIGJvb2wgaXNIaWdoU3Vycm9nYXRlKHVpbnQxNl90IHZhbCkgeworICByZXR1cm4gdmFsID49IDB4RDgwMCAmJiB2YWwgPD0gMHhEQkZGOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29kZSB1bml0IGlzIGxvdyBzdXJyb2dhdGUKK3N0YXRpYyBib29sIGlzTG93U3Vycm9nYXRlKHVpbnQxNl90IHZhbCkgeworICByZXR1cm4gdmFsID49IDB4REMwMCAmJiB2YWwgPD0gMHhERkZGOworfQorCisvKioKKyAqIENsYXNzIHRvIHNlcnZlIGFzIGJhc2UgSlNPTiBjb250ZXh0IGFuZCBhcyBiYXNlIGNsYXNzIGZvciBvdGhlciBjb250ZXh0CisgKiBpbXBsZW1lbnRhdGlvbnMKKyAqLworY2xhc3MgVEpTT05Db250ZXh0IHsKKworcHVibGljOgorICBUSlNPTkNvbnRleHQoKXt9OworCisgIHZpcnR1YWwgflRKU09OQ29udGV4dCgpe307CisKKyAgLyoqCisgICAqIFdyaXRlIGNvbnRleHQgZGF0YSB0byB0aGUgdHJhbnNwb3J0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQmIHRyYW5zKSB7CisgICAgKHZvaWQpdHJhbnM7CisgICAgcmV0dXJuIDA7CisgIH07CisKKyAgLyoqCisgICAqIFJlYWQgY29udGV4dCBkYXRhIGZyb20gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciYgcmVhZGVyKSB7CisgICAgKHZvaWQpcmVhZGVyOworICAgIHJldHVybiAwOworICB9OworCisgIC8qKgorICAgKiBSZXR1cm4gdHJ1ZSBpZiBudW1iZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBhcyBzdHJpbmdzIGluIHRoaXMgY29udGV4dC4KKyAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gZmFsc2UuCisgICAqLworICB2aXJ0dWFsIGJvb2wgZXNjYXBlTnVtKCkgeyByZXR1cm4gZmFsc2U7IH0KK307CisKKy8vIENvbnRleHQgY2xhc3MgZm9yIG9iamVjdCBtZW1iZXIga2V5LXZhbHVlIHBhaXJzCitjbGFzcyBKU09OUGFpckNvbnRleHQgOiBwdWJsaWMgVEpTT05Db250ZXh0IHsKKworcHVibGljOgorICBKU09OUGFpckNvbnRleHQoKSA6IGZpcnN0Xyh0cnVlKSwgY29sb25fKHRydWUpIHt9CisKKyAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCYgdHJhbnMpIHsKKyAgICBpZiAoZmlyc3RfKSB7CisgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgdHJhbnMud3JpdGUoY29sb25fID8gJmtKU09OUGFpclNlcGFyYXRvciA6ICZrSlNPTkVsZW1TZXBhcmF0b3IsIDEpOworICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIpIHsKKyAgICBpZiAoZmlyc3RfKSB7CisgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgdWludDhfdCBjaCA9IChjb2xvbl8gPyBrSlNPTlBhaXJTZXBhcmF0b3IgOiBrSlNPTkVsZW1TZXBhcmF0b3IpOworICAgICAgY29sb25fID0gIWNvbG9uXzsKKyAgICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXIsIGNoKTsKKyAgICB9CisgIH0KKworICAvLyBOdW1iZXJzIG11c3QgYmUgdHVybmVkIGludG8gc3RyaW5ncyBpZiB0aGV5IGFyZSB0aGUga2V5IHBhcnQgb2YgYSBwYWlyCisgIHZpcnR1YWwgYm9vbCBlc2NhcGVOdW0oKSB7IHJldHVybiBjb2xvbl87IH0KKworcHJpdmF0ZToKKyAgYm9vbCBmaXJzdF87CisgIGJvb2wgY29sb25fOworfTsKKworLy8gQ29udGV4dCBjbGFzcyBmb3IgbGlzdHMKK2NsYXNzIEpTT05MaXN0Q29udGV4dCA6IHB1YmxpYyBUSlNPTkNvbnRleHQgeworCitwdWJsaWM6CisgIEpTT05MaXN0Q29udGV4dCgpIDogZmlyc3RfKHRydWUpIHt9CisKKyAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCYgdHJhbnMpIHsKKyAgICBpZiAoZmlyc3RfKSB7CisgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICB0cmFucy53cml0ZSgma0pTT05FbGVtU2VwYXJhdG9yLCAxKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIpIHsKKyAgICBpZiAoZmlyc3RfKSB7CisgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyLCBrSlNPTkVsZW1TZXBhcmF0b3IpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBib29sIGZpcnN0XzsKK307CisKK1RKU09OUHJvdG9jb2w6OlRKU09OUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKKyAgOiBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+KHB0cmFucyksCisgICAgdHJhbnNfKHB0cmFucy5nZXQoKSksCisgICAgY29udGV4dF8obmV3IFRKU09OQ29udGV4dCgpKSwKKyAgICByZWFkZXJfKCpwdHJhbnMpIHsKK30KKworVEpTT05Qcm90b2NvbDo6flRKU09OUHJvdG9jb2woKSB7Cit9CisKK3ZvaWQgVEpTT05Qcm90b2NvbDo6cHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYykgeworICBjb250ZXh0c18ucHVzaChjb250ZXh0Xyk7CisgIGNvbnRleHRfID0gYzsKK30KKwordm9pZCBUSlNPTlByb3RvY29sOjpwb3BDb250ZXh0KCkgeworICBjb250ZXh0XyA9IGNvbnRleHRzXy50b3AoKTsKKyAgY29udGV4dHNfLnBvcCgpOworfQorCisvLyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIGEgSlNPTiBlc2NhcGUgc2VxdWVuY2UgKCJcdTAweHgiKQordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09ORXNjYXBlQ2hhcih1aW50OF90IGNoKSB7CisgIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKWtKU09ORXNjYXBlUHJlZml4LmNfc3RyKCksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGtKU09ORXNjYXBlUHJlZml4Lmxlbmd0aCgpKSk7CisgIHVpbnQ4X3Qgb3V0Q2ggPSBoZXhDaGFyKGNoID4+IDQpOworICB0cmFuc18tPndyaXRlKCZvdXRDaCwgMSk7CisgIG91dENoID0gaGV4Q2hhcihjaCk7CisgIHRyYW5zXy0+d3JpdGUoJm91dENoLCAxKTsKKyAgcmV0dXJuIDY7Cit9CisKKy8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgcGFydCBvZiBhIEpTT04gc3RyaW5nLCBlc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkNoYXIodWludDhfdCBjaCkgeworICBpZiAoY2ggPj0gMHgzMCkgeworICAgIGlmIChjaCA9PSBrSlNPTkJhY2tzbGFzaCkgeyAvLyBPbmx5IHNwZWNpYWwgY2hhcmFjdGVyID49IDB4MzAgaXMgJ1wnCisgICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7CisgICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7CisgICAgICByZXR1cm4gMjsKKyAgICB9IGVsc2UgeworICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9IGVsc2UgeworICAgIHVpbnQ4X3Qgb3V0Q2ggPSBrSlNPTkNoYXJUYWJsZVtjaF07CisgICAgLy8gQ2hlY2sgaWYgcmVndWxhciBjaGFyYWN0ZXIsIGJhY2tzbGFzaCBlc2NhcGVkLCBvciBKU09OIGVzY2FwZWQKKyAgICBpZiAob3V0Q2ggPT0gMSkgeworICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOworICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChvdXRDaCA+IDEpIHsKKyAgICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQmFja3NsYXNoLCAxKTsKKyAgICAgIHRyYW5zXy0+d3JpdGUoJm91dENoLCAxKTsKKyAgICAgIHJldHVybiAyOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gd3JpdGVKU09ORXNjYXBlQ2hhcihjaCk7CisgICAgfQorICB9Cit9CisKKy8vIFdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBzdHIgYXMgYSBKU09OIHN0cmluZywgZXNjYXBpbmcKKy8vIGNoYXJhY3RlcnMgYXMgYXBwcm9wcmlhdGUuCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHJlc3VsdCArPSAyOyAvLyBGb3IgcXVvdGVzCisgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIoc3RyLmJlZ2luKCkpOworICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgZW5kKHN0ci5lbmQoKSk7CisgIHdoaWxlIChpdGVyICE9IGVuZCkgeworICAgIHJlc3VsdCArPSB3cml0ZUpTT05DaGFyKCppdGVyKyspOworICB9CisgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGFzIEpTT04gc3RyaW5nLCBiYXNlNjQtZW5jb2RpbmcKKy8vIHRoZSBzdHJpbmcncyBjb250ZW50cywgYW5kIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHJlc3VsdCArPSAyOyAvLyBGb3IgcXVvdGVzCisgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgdWludDhfdCBiWzRdOworICBjb25zdCB1aW50OF90KiBieXRlcyA9IChjb25zdCB1aW50OF90KilzdHIuY19zdHIoKTsKKyAgaWYgKHN0ci5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICB1aW50MzJfdCBsZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKKyAgd2hpbGUgKGxlbiA+PSAzKSB7CisgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgYmFzZTY0X2VuY29kZShieXRlcywgMywgYik7CisgICAgdHJhbnNfLT53cml0ZShiLCA0KTsKKyAgICByZXN1bHQgKz0gNDsKKyAgICBieXRlcyArPSAzOworICAgIGxlbiAtPSAzOworICB9CisgIGlmIChsZW4pIHsgLy8gSGFuZGxlIHJlbWFpbmRlcgorICAgIGJhc2U2NF9lbmNvZGUoYnl0ZXMsIGxlbiwgYik7CisgICAgdHJhbnNfLT53cml0ZShiLCBsZW4gKyAxKTsKKyAgICByZXN1bHQgKz0gbGVuICsgMTsKKyAgfQorICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENvbnZlcnQgdGhlIGdpdmVuIGludGVnZXIgdHlwZSB0byBhIEpTT04gbnVtYmVyLCBvciBhIHN0cmluZworLy8gaWYgdGhlIGNvbnRleHQgcmVxdWlyZXMgaXQgKGVnOiBrZXkgaW4gYSBtYXAgcGFpcikuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOworICBzdGQ6OnN0cmluZyB2YWwodG9fc3RyaW5nKG51bSkpOworICBib29sIGVzY2FwZU51bSA9IGNvbnRleHRfLT5lc2NhcGVOdW0oKTsKKyAgaWYgKGVzY2FwZU51bSkgeworICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgICByZXN1bHQgKz0gMTsKKyAgfQorICBpZiAodmFsLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKXZhbC5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsLmxlbmd0aCgpKSk7CisgIHJlc3VsdCArPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsLmxlbmd0aCgpKTsKKyAgaWYgKGVzY2FwZU51bSkgeworICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKKyAgICByZXN1bHQgKz0gMTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCituYW1lc3BhY2Ugeworc3RkOjpzdHJpbmcgZG91YmxlVG9TdHJpbmcoZG91YmxlIGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cjsKKyAgc3RyLmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOworICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgbWF4X2RpZ2l0czEwID0gMiArIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTA7CisgIHN0ci5wcmVjaXNpb24obWF4X2RpZ2l0czEwKTsKKyAgc3RyIDw8IGQ7CisgIHJldHVybiBzdHIuc3RyKCk7Cit9Cit9CisKKy8vIENvbnZlcnQgdGhlIGdpdmVuIGRvdWJsZSB0byBhIEpTT04gc3RyaW5nLCB3aGljaCBpcyBlaXRoZXIgdGhlIG51bWJlciwKKy8vICJOYU4iIG9yICJJbmZpbml0eSIgb3IgIi1JbmZpbml0eSIuCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHN0ZDo6c3RyaW5nIHZhbDsKKworICBib29sIHNwZWNpYWwgPSBmYWxzZTsKKyAgc3dpdGNoIChib29zdDo6bWF0aDo6ZnBjbGFzc2lmeShudW0pKSB7CisgIGNhc2UgRlBfSU5GSU5JVEU6CisgICAgaWYgKGJvb3N0OjptYXRoOjpzaWduYml0KG51bSkpIHsKKyAgICAgIHZhbCA9IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5OworICAgIH0gZWxzZSB7CisgICAgICB2YWwgPSBrVGhyaWZ0SW5maW5pdHk7CisgICAgfQorICAgIHNwZWNpYWwgPSB0cnVlOworICAgIGJyZWFrOworICBjYXNlIEZQX05BTjoKKyAgICB2YWwgPSBrVGhyaWZ0TmFuOworICAgIHNwZWNpYWwgPSB0cnVlOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHZhbCA9IGRvdWJsZVRvU3RyaW5nKG51bSk7CisgICAgYnJlYWs7CisgIH0KKworICBib29sIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgY29udGV4dF8tPmVzY2FwZU51bSgpOworICBpZiAoZXNjYXBlTnVtKSB7CisgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICAgIHJlc3VsdCArPSAxOworICB9CisgIGlmICh2YWwubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCopdmFsLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpKTsKKyAgcmVzdWx0ICs9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpOworICBpZiAoZXNjYXBlTnVtKSB7CisgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOworICAgIHJlc3VsdCArPSAxOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTk9iamVjdFN0YXJ0KCkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHRyYW5zXy0+d3JpdGUoJmtKU09OT2JqZWN0U3RhcnQsIDEpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKKyAgcmV0dXJuIHJlc3VsdCArIDE7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTk9iamVjdEVuZCgpIHsKKyAgcG9wQ29udGV4dCgpOworICB0cmFuc18tPndyaXRlKCZrSlNPTk9iamVjdEVuZCwgMSk7CisgIHJldHVybiAxOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05BcnJheVN0YXJ0KCkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CisgIHRyYW5zXy0+d3JpdGUoJmtKU09OQXJyYXlTdGFydCwgMSk7CisgIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOworICByZXR1cm4gcmVzdWx0ICsgMTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQXJyYXlFbmQoKSB7CisgIHBvcENvbnRleHQoKTsKKyAgdHJhbnNfLT53cml0ZSgma0pTT05BcnJheUVuZCwgMSk7CisgIHJldHVybiAxOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihrVGhyaWZ0VmVyc2lvbjEpOworICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKG5hbWUpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlVHlwZSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKHNlcWlkKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNZXNzYWdlRW5kKCkgeworICByZXR1cm4gd3JpdGVKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgICh2b2lkKW5hbWU7CisgIHJldHVybiB3cml0ZUpTT05PYmplY3RTdGFydCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVN0cnVjdEVuZCgpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICh2b2lkKW5hbWU7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkludGVnZXIoZmllbGRJZCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkVHlwZSkpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUZpZWxkRW5kKCkgeworICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgeworICByZXR1cm4gMDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChrZXlUeXBlKSk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQodmFsVHlwZSkpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgeworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkFycmF5RW5kKCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChlbGVtVHlwZSkpOworICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVMaXN0RW5kKCkgeworICByZXR1cm4gd3JpdGVKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZWxlbVR5cGUpKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkludGVnZXIoKGludDY0X3Qpc2l6ZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU2V0RW5kKCkgeworICByZXR1cm4gd3JpdGVKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIodmFsdWUpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgLy8gd3JpdGVCeXRlKCkgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseSBiZWNhdXNlIHRvX3N0cmluZyBzZWVzCisgIC8vIGludDhfdCBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQorICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcigoaW50MTZfdClieXRlKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTE2KTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTMyKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoaTY0KTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICByZXR1cm4gd3JpdGVKU09ORG91YmxlKGR1Yik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHdyaXRlSlNPTlN0cmluZyhzdHIpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiB3cml0ZUpTT05CYXNlNjQoc3RyKTsKK30KKworLyoqCisgKiBSZWFkaW5nIGZ1bmN0aW9ucworICovCisKKy8vIFJlYWRzIDEgYnl0ZSBhbmQgdmVyaWZpZXMgdGhhdCBpdCBtYXRjaGVzIGNoLgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TeW50YXhDaGFyKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlcl8sIGNoKTsKK30KKworLy8gRGVjb2RlcyB0aGUgZm91ciBoZXggcGFydHMgb2YgYSBKU09OIGVzY2FwZWQgc3RyaW5nIGNoYXJhY3RlciBhbmQgcmV0dXJucworLy8gdGhlIFVURi0xNiBjb2RlIHVuaXQgdmlhIG91dC4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09ORXNjYXBlQ2hhcih1aW50MTZfdCogb3V0KSB7CisgIHVpbnQ4X3QgYls0XTsKKyAgYlswXSA9IHJlYWRlcl8ucmVhZCgpOworICBiWzFdID0gcmVhZGVyXy5yZWFkKCk7CisgIGJbMl0gPSByZWFkZXJfLnJlYWQoKTsKKyAgYlszXSA9IHJlYWRlcl8ucmVhZCgpOworCisgICpvdXQgPSAoaGV4VmFsKGJbMF0pIDw8IDEyKQorICAgICsgKGhleFZhbChiWzFdKSA8PCA4KSArIChoZXhWYWwoYlsyXSkgPDwgNCkgKyBoZXhWYWwoYlszXSk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8vIERlY29kZXMgYSBKU09OIHN0cmluZywgaW5jbHVkaW5nIHVuZXNjYXBpbmcsIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgdmlhIHN0cgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBza2lwQ29udGV4dCkgeworICB1aW50MzJfdCByZXN1bHQgPSAoc2tpcENvbnRleHQgPyAwIDogY29udGV4dF8tPnJlYWQocmVhZGVyXykpOworICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKKyAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNvZGV1bml0czsKKyAgdWludDhfdCBjaDsKKyAgc3RyLmNsZWFyKCk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICArK3Jlc3VsdDsKKyAgICBpZiAoY2ggPT0ga0pTT05TdHJpbmdEZWxpbWl0ZXIpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY2ggPT0ga0pTT05CYWNrc2xhc2gpIHsKKyAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgICArK3Jlc3VsdDsKKyAgICAgIGlmIChjaCA9PSBrSlNPTkVzY2FwZUNoYXIpIHsKKyAgICAgICAgdWludDE2X3QgY3A7CisgICAgICAgIHJlc3VsdCArPSByZWFkSlNPTkVzY2FwZUNoYXIoJmNwKTsKKyAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShjcCkpIHsKKyAgICAgICAgICBjb2RldW5pdHMucHVzaF9iYWNrKGNwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoaXNMb3dTdXJyb2dhdGUoY3ApCisgICAgICAgICAgICAgICAmJiBjb2RldW5pdHMuZW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIFVURi0xNiBoaWdoIHN1cnJvZ2F0ZSBwYWlyLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb2RldW5pdHMucHVzaF9iYWNrKGNwKTsKKyAgICAgICAgICBjb2RldW5pdHMucHVzaF9iYWNrKDApOworICAgICAgICAgIHN0ciArPSBib29zdDo6bG9jYWxlOjpjb252Ojp1dGZfdG9fdXRmPGNoYXI+KGNvZGV1bml0cy5kYXRhKCkpOworICAgICAgICAgIGNvZGV1bml0cy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9IGtFc2NhcGVDaGFycy5maW5kKGNoKTsKKyAgICAgICAgaWYgKHBvcyA9PSBrRXNjYXBlQ2hhcnMubnBvcykgeworICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciwgZ290ICciICsgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKSZjaCwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJy4iKTsKKyAgICAgICAgfQorICAgICAgICBjaCA9IGtFc2NhcGVDaGFyVmFsc1twb3NdOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWNvZGV1bml0cy5lbXB0eSgpKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUgcGFpci4iKTsKKyAgICB9CisgICAgc3RyICs9IGNoOworICB9CisKKyAgaWYgKCFjb2RldW5pdHMuZW1wdHkoKSkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUgcGFpci4iKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZWFkcyBhIGJsb2NrIG9mIGJhc2U2NCBjaGFyYWN0ZXJzLCBkZWNvZGluZyBpdCwgYW5kIHJldHVybnMgdmlhIHN0cgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05CYXNlNjQoc3RkOjpzdHJpbmcmIHN0cikgeworICBzdGQ6OnN0cmluZyB0bXA7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OU3RyaW5nKHRtcCk7CisgIHVpbnQ4X3QqIGIgPSAodWludDhfdCopdG1wLmNfc3RyKCk7CisgIGlmICh0bXAubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdWludDMyX3QgbGVuID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcC5sZW5ndGgoKSk7CisgIHN0ci5jbGVhcigpOworICAvLyBJZ25vcmUgcGFkZGluZworICBpZiAobGVuID49IDIpICB7CisgICAgdWludDMyX3QgYm91bmQgPSBsZW4gLSAyOworICAgIGZvciAodWludDMyX3QgaSA9IGxlbiAtIDE7IGkgPj0gYm91bmQgJiYgYltpXSA9PSAnPSc7IC0taSkgeworICAgICAgLS1sZW47CisgICAgfQorICB9CisgIHdoaWxlIChsZW4gPj0gNCkgeworICAgIGJhc2U2NF9kZWNvZGUoYiwgNCk7CisgICAgc3RyLmFwcGVuZCgoY29uc3QgY2hhciopYiwgMyk7CisgICAgYiArPSA0OworICAgIGxlbiAtPSA0OworICB9CisgIC8vIERvbid0IGRlY29kZSBpZiB3ZSBoaXQgdGhlIGVuZCBvciBnb3QgYSBzaW5nbGUgbGVmdG92ZXIgYnl0ZSAoaW52YWxpZAorICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCisgIGlmIChsZW4gPiAxKSB7CisgICAgYmFzZTY0X2RlY29kZShiLCBsZW4pOworICAgIHN0ci5hcHBlbmQoKGNvbnN0IGNoYXIqKWIsIGxlbiAtIDEpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIG5vdAorLy8gYSB2YWxpZCBKU09OIG51bWVyaWMgY2hhcmFjdGVyLgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05OdW1lcmljQ2hhcnMoc3RkOjpzdHJpbmcmIHN0cikgeworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBzdHIuY2xlYXIoKTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB1aW50OF90IGNoID0gcmVhZGVyXy5wZWVrKCk7CisgICAgaWYgKCFpc0pTT05OdW1lcmljKGNoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHJlYWRlcl8ucmVhZCgpOworICAgIHN0ciArPSBjaDsKKyAgICArK3Jlc3VsdDsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCituYW1lc3BhY2UgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIGZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgVCB0OworICBzdGQ6OmlzdHJpbmdzdHJlYW0gc3RyKHMpOworICBzdHIuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7CisgIHN0ciA+PiB0OworICBpZiAoc3RyLmJhZCgpIHx8ICFzdHIuZW9mKCkpCisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKHMpOworICByZXR1cm4gdDsKK30KK30KKworLy8gUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgbnVtYmVyLAorLy8gcmV0dXJuaW5nIHRoZW0gdmlhIG51bQordGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkludGVnZXIoTnVtYmVyVHlwZSYgbnVtKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOworICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7CisgIH0KKyAgc3RkOjpzdHJpbmcgc3RyOworICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKKyAgdHJ5IHsKKyAgICBudW0gPSBmcm9tU3RyaW5nPE51bWJlclR5cGU+KHN0cik7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6cnVudGltZV9lcnJvciYpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CisgIH0KKyAgaWYgKGNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFJlYWRzIGEgSlNPTiBudW1iZXIgb3Igc3RyaW5nIGFuZCBpbnRlcnByZXRzIGl0IGFzIGEgZG91YmxlLgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Eb3VibGUoZG91YmxlJiBudW0pIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CisgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgaWYgKHJlYWRlcl8ucGVlaygpID09IGtKU09OU3RyaW5nRGVsaW1pdGVyKSB7CisgICAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHN0ciwgdHJ1ZSk7CisgICAgLy8gQ2hlY2sgZm9yIE5hTiwgSW5maW5pdHkgYW5kIC1JbmZpbml0eQorICAgIGlmIChzdHIgPT0ga1RocmlmdE5hbikgeworICAgICAgbnVtID0gSFVHRV9WQUwgLyBIVUdFX1ZBTDsgLy8gZ2VuZXJhdGVzIE5hTgorICAgIH0gZWxzZSBpZiAoc3RyID09IGtUaHJpZnRJbmZpbml0eSkgeworICAgICAgbnVtID0gSFVHRV9WQUw7CisgICAgfSBlbHNlIGlmIChzdHIgPT0ga1RocmlmdE5lZ2F0aXZlSW5maW5pdHkpIHsKKyAgICAgIG51bSA9IC1IVUdFX1ZBTDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIG51bSA9IGZyb21TdHJpbmc8ZG91YmxlPihzdHIpOworICAgICAgfSBjYXRjaCAoc3RkOjpydW50aW1lX2Vycm9yJiBlKSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoY29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKKyAgICB9CisgICAgcmVzdWx0ICs9IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0cik7CisgICAgdHJ5IHsKKyAgICAgIG51bSA9IGZyb21TdHJpbmc8ZG91YmxlPihzdHIpOworICAgIH0gY2F0Y2ggKHN0ZDo6cnVudGltZV9lcnJvciYgZSkgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk9iamVjdFN0YXJ0KCkgeworICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdFN0YXJ0KTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OT2JqZWN0RW5kKCkgeworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05PYmplY3RFbmQpOworICBwb3BDb250ZXh0KCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQXJyYXlTdGFydCgpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CisgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05BcnJheVN0YXJ0KTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05MaXN0Q29udGV4dCgpKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OQXJyYXlFbmQoKSB7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTkFycmF5RW5kKTsKKyAgcG9wQ29udGV4dCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgeworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgdWludDY0X3QgdG1wVmFsID0gMDsKKyAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOworICBpZiAodG1wVmFsICE9IGtUaHJpZnRWZXJzaW9uMSkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgIH0KKyAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKG5hbWUpOworICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CisgIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSl0bXBWYWw7CisgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgaWYgKHRtcFZhbCA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgc2VxaWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0bXBWYWwpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIHJlYWRKU09OQXJyYXlFbmQoKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICh2b2lkKW5hbWU7CisgIHJldHVybiByZWFkSlNPTk9iamVjdFN0YXJ0KCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiByZWFkSlNPTk9iamVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAodm9pZCluYW1lOworICB1aW50MzJfdCByZXN1bHQgPSAwOworICAvLyBDaGVjayBpZiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorICB1aW50OF90IGNoID0gcmVhZGVyXy5wZWVrKCk7CisgIGlmIChjaCA9PSBrSlNPTk9iamVjdEVuZCkgeworICAgIGZpZWxkVHlwZSA9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QOworICB9IGVsc2UgeworICAgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CisgICAgc3RkOjpzdHJpbmcgdG1wU3RyOworICAgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgICBpZiAodG1wVmFsID4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgpKCkpKQorICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgICAgZmllbGRJZCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KHRtcFZhbCk7CisgICAgcmVzdWx0ICs9IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICByZXN1bHQgKz0gcmVhZEpTT05TdHJpbmcodG1wU3RyKTsKKyAgICBmaWVsZFR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIHJlYWRKU09OT2JqZWN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CisgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOworICBrZXlUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7CisgIHZhbFR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZSh0bXBTdHIpOworICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CisgIGlmICh0bXBWYWwgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBWYWwpOworICByZXN1bHQgKz0gcmVhZEpTT05PYmplY3RTdGFydCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwRW5kKCkgeworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTk9iamVjdEVuZCgpOworICByZXN1bHQgKz0gcmVhZEpTT05BcnJheUVuZCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgdWludDY0X3QgdG1wVmFsID0gMDsKKyAgc3RkOjpzdHJpbmcgdG1wU3RyOworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHRtcFN0cik7CisgIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOworICBpZiAodG1wVmFsID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CisgIHNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wVmFsKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7CisgIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CisgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOworICBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7CisgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKKyAgaWYgKHRtcFZhbCA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOworICBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcFZhbCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTZXRFbmQoKSB7CisgIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgIHJldHVybiByZWFkSlNPTkludGVnZXIodmFsdWUpOworfQorCisvLyByZWFkQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBwcm9wZXJseSBiZWNhdXNlIGJvb3N0OjpsZXhpY2FsIGNhc3Qgc2VlcyBpbnQ4X3QKKy8vIGFzIGEgdGV4dCB0eXBlIGluc3RlYWQgb2YgYW4gaW50ZWdlciB0eXBlCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKKyAgaW50MTZfdCB0bXAgPSAoaW50MTZfdClieXRlOworICB1aW50MzJfdCByZXN1bHQgPSByZWFkSlNPTkludGVnZXIodG1wKTsKKyAgYXNzZXJ0KHRtcCA8IDI1Nik7CisgIGJ5dGUgPSAoaW50OF90KXRtcDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcihpMTYpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSTMyKGludDMyX3QmIGkzMikgeworICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKGkzMik7Cit9CisKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgIHJldHVybiByZWFkSlNPTkludGVnZXIoaTY0KTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICByZXR1cm4gcmVhZEpTT05Eb3VibGUoZHViKTsKK30KKwordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiByZWFkSlNPTlN0cmluZyhzdHIpOworfQorCit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHJlYWRKU09OQmFzZTY0KHN0cik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyZjg3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8KKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9USlNPTlBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CisKKyNpbmNsdWRlIDxzdGFjaz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb24KK2NsYXNzIFRKU09OQ29udGV4dDsKKworLyoqCisgKiBKU09OIHByb3RvY29sIGZvciBUaHJpZnQuCisgKgorICogSW1wbGVtZW50cyBhIHByb3RvY29sIHdoaWNoIHVzZXMgSlNPTiBhcyB0aGUgd2lyZS1mb3JtYXQuCisgKgorICogVGhyaWZ0IHR5cGVzIGFyZSByZXByZXNlbnRlZCBhcyBkZXNjcmliZWQgYmVsb3c6CisgKgorICogMS4gRXZlcnkgVGhyaWZ0IGludGVnZXIgdHlwZSBpcyByZXByZXNlbnRlZCBhcyBhIEpTT04gbnVtYmVyLgorICoKKyAqIDIuIFRocmlmdCBkb3VibGVzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIG51bWJlcnMuIFNvbWUgc3BlY2lhbCB2YWx1ZXMgYXJlCisgKiAgICByZXByZXNlbnRlZCBhcyBzdHJpbmdzOgorICogICAgYS4gIk5hTiIgZm9yIG5vdC1hLW51bWJlciB2YWx1ZXMKKyAqICAgIGIuICJJbmZpbml0eSIgZm9yIHBvc2l0aXZlIGluZmluaXR5CisgKiAgICBjLiAiLUluZmluaXR5IiBmb3IgbmVnYXRpdmUgaW5maW5pdHkKKyAqCisgKiAzLiBUaHJpZnQgc3RyaW5nIHZhbHVlcyBhcmUgZW1pdHRlZCBhcyBKU09OIHN0cmluZ3MsIHdpdGggYXBwcm9wcmlhdGUKKyAqICAgIGVzY2FwaW5nLgorICoKKyAqIDQuIFRocmlmdCBiaW5hcnkgdmFsdWVzIGFyZSBlbmNvZGVkIGludG8gQmFzZTY0IGFuZCBlbWl0dGVkIGFzIEpTT04gc3RyaW5ncy4KKyAqICAgIFRoZSByZWFkQmluYXJ5KCkgbWV0aG9kIGlzIHdyaXR0ZW4gc3VjaCB0aGF0IGl0IHdpbGwgcHJvcGVybHkgc2tpcCBpZgorICogICAgY2FsbGVkIG9uIGEgVGhyaWZ0IHN0cmluZyAoYWx0aG91Z2ggaXQgd2lsbCBkZWNvZGUgZ2FyYmFnZSBkYXRhKS4KKyAqCisgKiAgICBOT1RFOiBCYXNlNjQgcGFkZGluZyBpcyBvcHRpb25hbCBmb3IgVGhyaWZ0IGJpbmFyeSB2YWx1ZSBlbmNvZGluZy4gU28KKyAqICAgIHRoZSByZWFkQmluYXJ5KCkgbWV0aG9kIG5lZWRzIHRvIGRlY29kZSBib3RoIGlucHV0IHN0cmluZ3Mgd2l0aCBwYWRkaW5nCisgKiAgICBhbmQgdGhvc2Ugd2l0aG91dCBvbmUuCisgKgorICogNS4gVGhyaWZ0IHN0cnVjdHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gb2JqZWN0cywgd2l0aCB0aGUgZmllbGQgSUQgYXMgdGhlCisgKiAgICBrZXksIGFuZCB0aGUgZmllbGQgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYSBKU09OIG9iamVjdCB3aXRoIGEgc2luZ2xlCisgKiAgICBrZXktdmFsdWUgcGFpci4gVGhlIGtleSBpcyBhIHNob3J0IHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGF0IHR5cGUsCisgKiAgICBmb2xsb3dlZCBieSB0aGUgdmFsdWUuIFRoZSB2YWxpZCB0eXBlIGlkZW50aWZpZXJzIGFyZTogInRmIiBmb3IgYm9vbCwKKyAqICAgICJpOCIgZm9yIGJ5dGUsICJpMTYiIGZvciAxNi1iaXQgaW50ZWdlciwgImkzMiIgZm9yIDMyLWJpdCBpbnRlZ2VyLCAiaTY0IgorICogICAgZm9yIDY0LWJpdCBpbnRlZ2VyLCAiZGJsIiBmb3IgZG91YmxlLXByZWNpc2lvbiBsb2F0aW5nIHBvaW50LCAic3RyIiBmb3IKKyAqICAgIHN0cmluZyAoaW5jbHVkaW5nIGJpbmFyeSksICJyZWMiIGZvciBzdHJ1Y3QgKCJyZWNvcmRzIiksICJtYXAiIGZvciBtYXAsCisgKiAgICAibHN0IiBmb3IgbGlzdCwgInNldCIgZm9yIHNldC4KKyAqCisgKiA2LiBUaHJpZnQgbGlzdHMgYW5kIHNldHMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gYXJyYXlzLCB3aXRoIHRoZSBmaXJzdAorICogICAgZWxlbWVudCBvZiB0aGUgSlNPTiBhcnJheSBiZWluZyB0aGUgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBUaHJpZnQKKyAqICAgIGVsZW1lbnQgdHlwZSBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBKU09OIGFycmF5IGJlaW5nIHRoZSBjb3VudCBvZgorICogICAgdGhlIFRocmlmdCBlbGVtZW50cy4gVGhlIFRocmlmdCBlbGVtZW50cyB0aGVuIGZvbGxvdy4KKyAqCisgKiA3LiBUaHJpZnQgbWFwcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBhcnJheXMsIHdpdGggdGhlIGZpcnN0IHR3byBlbGVtZW50cworICogICAgb2YgdGhlIEpTT04gYXJyYXkgYmVpbmcgdGhlIHN0cmluZyBpZGVudGlmaWVycyBmb3IgdGhlIFRocmlmdCBrZXkgdHlwZQorICogICAgYW5kIHZhbHVlIHR5cGUsIGZvbGxvd2VkIGJ5IHRoZSBjb3VudCBvZiB0aGUgVGhyaWZ0IHBhaXJzLCBmb2xsb3dlZCBieSBhCisgKiAgICBKU09OIG9iamVjdCBjb250YWluaW5nIHRoZSBrZXktdmFsdWUgcGFpcnMuIE5vdGUgdGhhdCBKU09OIGtleXMgY2FuIG9ubHkKKyAqICAgIGJlIHN0cmluZ3MsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGtleSB0eXBlIG9mIHRoZSBUaHJpZnQgbWFwIHNob3VsZCBiZQorICogICAgcmVzdHJpY3RlZCB0byBudW1lcmljIG9yIHN0cmluZyB0eXBlcyAtLSBpbiB0aGUgY2FzZSBvZiBudW1lcmljcywgdGhleQorICogICAgYXJlIHNlcmlhbGl6ZWQgYXMgc3RyaW5ncy4KKyAqCisgKiA4LiBUaHJpZnQgbWVzc2FnZXMgYXJlIHJlcHJlc2VudGVkIGFzIEpTT04gYXJyYXlzLCB3aXRoIHRoZSBwcm90b2NvbAorICogICAgdmVyc2lvbiAjLCB0aGUgbWVzc2FnZSBuYW1lLCB0aGUgbWVzc2FnZSB0eXBlLCBhbmQgdGhlIHNlcXVlbmNlIElEIGFzCisgKiAgICB0aGUgZmlyc3QgNCBlbGVtZW50cy4KKyAqCisgKiBNb3JlIGRpc2N1c3Npb24gb2YgdGhlIGRvdWJsZSBoYW5kbGluZyBpcyBwcm9iYWJseSB3YXJyYW50ZWQuIFRoZSBhaW0gb2YKKyAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRvIG1hdGNoIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgdGhlIGJlaGF2aW9yCisgKiBvZiBKYXZhJ3MgRG91YmxlLnRvU3RyaW5nKCksIHdoaWNoIGhhcyBubyBwcmVjaXNpb24gbG9zcy4gIEltcGxlbWVudG9ycyBpbgorICogb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBzdHJpdmUgdG8gYWNoaWV2ZSB0aGF0IHdoZXJlIHBvc3NpYmxlLiBJIGhhdmUgbm90CisgKiB5ZXQgdmVyaWZpZWQgd2hldGhlciBzdGQ6OmlzdHJpbmdzdHJlYW06Om9wZXJhdG9yPj4sIHdoaWNoIGlzIGRvaW5nIHRoYXQKKyAqIHdvcmsgZm9yIG1lIGluIEMrKywgbG9zZXMgYW55IHByZWNpc2lvbiwgYnV0IEkgYW0gbGVhdmluZyB0aGlzIGFzIGEgZnV0dXJlCisgKiBpbXByb3ZlbWVudC4gSSBtYXkgdHJ5IHRvIHByb3ZpZGUgYSBDIGNvbXBvbmVudCBmb3IgdGhpcywgc28gdGhhdCBvdGhlcgorICogbGFuZ3VhZ2VzIGNvdWxkIGJpbmQgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgbWF4aW11bQorICogY29uc2lzdGVuY3kuCisgKgorICovCitjbGFzcyBUSlNPTlByb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD4geworcHVibGljOgorICBUSlNPTlByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpOworCisgIH5USlNPTlByb3RvY29sKCk7CisKK3ByaXZhdGU6CisgIHZvaWQgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7CisKKyAgdm9pZCBwb3BDb250ZXh0KCk7CisKKyAgdWludDMyX3Qgd3JpdGVKU09ORXNjYXBlQ2hhcih1aW50OF90IGNoKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05DaGFyKHVpbnQ4X3QgY2gpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE51bWJlclR5cGU+CisgIHVpbnQzMl90IHdyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pOworCisgIHVpbnQzMl90IHdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RTdGFydCgpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTk9iamVjdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKworICB1aW50MzJfdCB3cml0ZUpTT05BcnJheUVuZCgpOworCisgIHVpbnQzMl90IHJlYWRKU09OU3ludGF4Q2hhcih1aW50OF90IGNoKTsKKworICB1aW50MzJfdCByZWFkSlNPTkVzY2FwZUNoYXIodWludDE2X3QqIG91dCk7CisKKyAgdWludDMyX3QgcmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKTsKKworICB1aW50MzJfdCByZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCByZWFkSlNPTk51bWVyaWNDaGFycyhzdGQ6OnN0cmluZyYgc3RyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KKyAgdWludDMyX3QgcmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUmIG51bSk7CisKKyAgdWludDMyX3QgcmVhZEpTT05Eb3VibGUoZG91YmxlJiBudW0pOworCisgIHVpbnQzMl90IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKworICB1aW50MzJfdCByZWFkSlNPTk9iamVjdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRKU09OQXJyYXlTdGFydCgpOworCisgIHVpbnQzMl90IHJlYWRKU09OQXJyYXlFbmQoKTsKKworcHVibGljOgorICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMuCisgICAqLworCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOworCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOworCisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKTsKKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNik7CisKKyAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOworCisgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KTsKKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKTsKKworICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvKioKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpOworCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOworCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTWFwRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkU2V0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOworCisgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KKyAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPjo6cmVhZEJvb2w7CisKKyAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOworCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKKworICBwdWJsaWM6CisgICAgTG9va2FoZWFkUmVhZGVyKFRUcmFuc3BvcnQmIHRyYW5zKSA6IHRyYW5zXygmdHJhbnMpLCBoYXNEYXRhXyhmYWxzZSkge30KKworICAgIHVpbnQ4X3QgcmVhZCgpIHsKKyAgICAgIGlmIChoYXNEYXRhXykgeworICAgICAgICBoYXNEYXRhXyA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhbnNfLT5yZWFkQWxsKCZkYXRhXywgMSk7CisgICAgICB9CisgICAgICByZXR1cm4gZGF0YV87CisgICAgfQorCisgICAgdWludDhfdCBwZWVrKCkgeworICAgICAgaWYgKCFoYXNEYXRhXykgeworICAgICAgICB0cmFuc18tPnJlYWRBbGwoJmRhdGFfLCAxKTsKKyAgICAgIH0KKyAgICAgIGhhc0RhdGFfID0gdHJ1ZTsKKyAgICAgIHJldHVybiBkYXRhXzsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBUVHJhbnNwb3J0KiB0cmFuc187CisgICAgYm9vbCBoYXNEYXRhXzsKKyAgICB1aW50OF90IGRhdGFfOworICB9OworCitwcml2YXRlOgorICBUVHJhbnNwb3J0KiB0cmFuc187CisKKyAgc3RkOjpzdGFjazxzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiA+IGNvbnRleHRzXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gY29udGV4dF87CisgIExvb2thaGVhZFJlYWRlciByZWFkZXJfOworfTsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wgb2JqZWN0cyBnaXZlbiB0cmFuc3BvcnRzLgorICovCitjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRKU09OUHJvdG9jb2xGYWN0b3J5KCkge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRKU09OUHJvdG9jb2wodHJhbnMpKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKy8vIFRPRE8oZHJlaXNzKTogTW92ZSBwYXJ0IG9mIFRocmlmdEpTT05TdHJpbmcgaW50byBhIC5jcHAgZmlsZSBhbmQgcmVtb3ZlIHRoaXMuCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGhyaWZ0U3RydWN0Pgorc3RkOjpzdHJpbmcgVGhyaWZ0SlNPTlN0cmluZyhjb25zdCBUaHJpZnRTdHJ1Y3QmIHRzKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOworICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CisgIFRKU09OUHJvdG9jb2wgcHJvdG9jb2wodHJhbnMpOworCisgIHRzLndyaXRlKCZwcm90b2NvbCk7CisKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBzaXplOworICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7CisgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkYzY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewordWludDMyX3QgVE11bHRpcGxleGVkUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpIHsKKyAgaWYgKF90eXBlID09IFRfQ0FMTCB8fCBfdHlwZSA9PSBUX09ORVdBWSkgeworICAgIHJldHVybiBUUHJvdG9jb2xEZWNvcmF0b3I6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoc2VydmljZU5hbWUgKyBzZXBhcmF0b3IgKyBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlcWlkKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVFByb3RvY29sRGVjb3JhdG9yOjp3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KF9uYW1lLCBfdHlwZSwgX3NlcWlkKTsKKyAgfQorfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGJkODJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9UTVVMVElQTEVYRURQUk9UT0NPTF9IXworI2RlZmluZSBUSFJJRlRfVE1VTFRJUExFWEVEUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworLyoqCisgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm90b2NvbDwvY29kZT4gaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKKyAqIHRoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCisgKiBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICoKKyAqIFxub3RlIFRISVMgSVMgTk9UIFVTRUQgQlkgU0VSVkVSUy4gIE9uIHRoZSBzZXJ2ZXIsIHVzZQorICoge0BsaW5rIGFwYWNoZTo6dGhyaWZ0OjpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yfSB0byBoYW5kbGUgcmVxdWVzdHMKKyAqIGZyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgorICoKKyAqIFRoaXMgZXhhbXBsZSB1c2VzIGEgc2luZ2xlIHNvY2tldCB0cmFuc3BvcnQgdG8gaW52b2tlIHR3byBzZXJ2aWNlczoKKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHRyYW5zcG9ydChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCkpOworICogICAgIHRyYW5zcG9ydC0+b3BlbigpOworICoKKyAqICAgICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAqCisgKiAgICAgc2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm90b2NvbD4gbXAxKG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKSk7CisgKiAgICAgc2hhcmVkX3B0cjxDYWxjdWxhdG9yQ2xpZW50PiBzZXJ2aWNlMShuZXcgQ2FsY3VsYXRvckNsaWVudChtcDEpKTsKKyAqCisgKiAgICAgc2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm90b2NvbD4gbXAyKG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKSk7CisgKiAgICAgc2hhcmVkX3B0cjxXZWF0aGVyUmVwb3J0Q2xpZW50PiBzZXJ2aWNlMihuZXcgV2VhdGhlclJlcG9ydENsaWVudChtcDIpKTsKKyAqCisgKiAgICAgc2VydmljZTEtPmFkZCgyLDIpOworICogICAgIGludCB0ZW1wID0gc2VydmljZTItPmdldFRlbXBlcmF0dXJlKCk7CisgKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgorICoKKyAqIEBzZWUgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xEZWNvcmF0b3IKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgKgorICAgKiBccGFyYW0gX3Byb3RvY29sICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPGNvZGU+VEJpbmFyeVByb3RvY29sPC9jb2RlPi4KKyAgICogXHBhcmFtIF9zZXJ2aWNlTmFtZSBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAqLworICBUTXVsdGlwbGV4ZWRQcm90b2NvbChzaGFyZWRfcHRyPFRQcm90b2NvbD4gX3Byb3RvY29sLCBjb25zdCBzdGQ6OnN0cmluZyYgX3NlcnZpY2VOYW1lKQorICAgIDogVFByb3RvY29sRGVjb3JhdG9yKF9wcm90b2NvbCksIHNlcnZpY2VOYW1lKF9zZXJ2aWNlTmFtZSksIHNlcGFyYXRvcigiOiIpIHt9CisgIHZpcnR1YWwgflRNdWx0aXBsZXhlZFByb3RvY29sKCkge30KKworICAvKioKKyAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IuCisgICAqCisgICAqIFxwYXJhbSBbaW5dIF9uYW1lICAgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSBjYWxsZWQgaW4gdGhlIHNlcnZpY2UuCisgICAqIFxwYXJhbSBbaW5dIF90eXBlICAgVGhlIHR5cGUgb2YgbWVzc2FnZQorICAgKiBccGFyYW0gW2luXSBfbmFtZSAgIFRoZSBzZXF1ZW50aWFsIGlkIG9mIHRoZSBtZXNzYWdlCisgICAqCisgICAqIFx0aHJvd3MgVEV4Y2VwdGlvbiAgUGFzc2VkIHRocm91Z2ggZnJvbSB3cmFwcGVkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UuCisgICAqLworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpOworCitwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyBzZXJ2aWNlTmFtZTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgc2VwYXJhdG9yOworfTsKK30KK30KK30KKworI2VuZGlmIC8vIFRIUklGVF9UTVVMVElQTEVYRURQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc4YWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworVFByb3RvY29sOjp+VFByb3RvY29sKCkge30KK3VpbnQzMl90IFRQcm90b2NvbDo6c2tpcF92aXJ0KFRUeXBlIHR5cGUpIHsKKyAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsKK30KKworVFByb3RvY29sRmFjdG9yeTo6flRQcm90b2NvbEZhY3RvcnkoKSB7fQorCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjNjgxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaApAQCAtMCwwICsxLDc2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKKworI2lmZGVmIF9XSU4zMgorLy8gTmVlZCB0byBjb21lIGJlZm9yZSBhbnkgV2luZG93cy5oIGluY2x1ZGVzCisjaW5jbHVkZSA8V2luc29jazIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjbGltaXRzPgorCisvLyBVc2UgdGhpcyB0byBnZXQgYXJvdW5kIHN0cmljdCBhbGlhc2luZyBydWxlcy4KKy8vIEZvciBleGFtcGxlLCB1aW50NjRfdCBpID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihyZXR1cm5zX2RvdWJsZSgpKTsKKy8vIFRoZSBtb3N0IG9idmlvdXMgaW1wbGVtZW50YXRpb24gaXMgdG8ganVzdCBjYXN0IGEgcG9pbnRlciwKKy8vIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yay4KKy8vIEZvciBhIHByZXR0eSBpbi1kZXB0aCBleHBsYW5hdGlvbiBvZiB0aGUgcHJvYmxlbSwgc2VlCisvLyBodHRwOi8vY2VsbHBlcmZvcm1hbmNlLmJleW9uZDNkLmNvbS9hcnRpY2xlcy8yMDA2LzA2L3VuZGVyc3RhbmRpbmctc3RyaWN0LWFsaWFzaW5nLmh0bWwKK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KK3N0YXRpYyBpbmxpbmUgVG8gYml0d2lzZV9jYXN0KEZyb20gZnJvbSkgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pLCAic2l6ZW9mKEZyb20pID09IHNpemVvZihUbykiKTsKKworICAvLyBCQUQhISEgIFRoZXNlIGFyZSBhbGwgYnJva2VuIHdpdGggLU8yLgorICAvL3JldHVybiAqcmVpbnRlcnByZXRfY2FzdDxUbyo+KCZmcm9tKTsgIC8vIEJBRCEhIQorICAvL3JldHVybiAqc3RhdGljX2Nhc3Q8VG8qPihzdGF0aWNfY2FzdDx2b2lkKj4oJmZyb20pKTsgIC8vIEJBRCEhIQorICAvL3JldHVybiAqKFRvKikodm9pZCopJmZyb207ICAvLyBCQUQhISEKKworICAvLyBTdXBlciBjbGVhbiBhbmQgcGFyaXRhbGx5IGJsZXNzZWQgYnkgc2VjdGlvbiAzLjkgb2YgdGhlIHN0YW5kYXJkLgorICAvL3Vuc2lnbmVkIGNoYXIgY1tzaXplb2YoZnJvbSldOworICAvL21lbWNweShjLCAmZnJvbSwgc2l6ZW9mKGZyb20pKTsKKyAgLy9UbyB0bzsKKyAgLy9tZW1jcHkoJnRvLCBjLCBzaXplb2YoYykpOworICAvL3JldHVybiB0bzsKKworICAvLyBTbGlnaHRseSBtb3JlIHF1ZXN0aW9uYWJsZS4KKyAgLy8gU2FtZSBjb2RlIGVtaXR0ZWQgYnkgR0NDLgorICAvL1RvIHRvOworICAvL21lbWNweSgmdG8sICZmcm9tLCBzaXplb2YoZnJvbSkpOworICAvL3JldHVybiB0bzsKKworICAvLyBUZWNobmljYWxseSB1bmRlZmluZWQsIGJ1dCBhbG1vc3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkLAorICAvLyBhbmQgdGhlIG1vc3QgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uLgorICB1bmlvbiB7CisgICAgRnJvbSBmOworICAgIFRvIHQ7CisgIH0gdTsKKyAgdS5mID0gZnJvbTsKKyAgcmV0dXJuIHUudDsKK30KKworCisjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX19USFJJRlRfQllURV9PUkRFUgorIyBpZiBkZWZpbmVkKEJZVEVfT1JERVIpICYmIGRlZmluZWQoTElUVExFX0VORElBTikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKQorIyAgZGVmaW5lIF9fVEhSSUZUX0JZVEVfT1JERVIgQllURV9PUkRFUgorIyAgZGVmaW5lIF9fVEhSSUZUX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgorIyAgZGVmaW5lIF9fVEhSSUZUX0JJR19FTkRJQU4gQklHX0VORElBTgorIyBlbHNlCisjICBpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgorIyAgaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL2VuZGlhbi5ocHA+CisjICBkZWZpbmUgX19USFJJRlRfQllURV9PUkRFUiBCT09TVF9CWVRFX09SREVSCisjICBpZmRlZiBCT09TVF9MSVRUTEVfRU5ESUFOCisjICAgZGVmaW5lIF9fVEhSSUZUX0xJVFRMRV9FTkRJQU4gX19USFJJRlRfQllURV9PUkRFUgorIyAgIGRlZmluZSBfX1RIUklGVF9CSUdfRU5ESUFOIDAKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19USFJJRlRfTElUVExFX0VORElBTiAwCisjICAgZGVmaW5lIF9fVEhSSUZUX0JJR19FTkRJQU4gX19USFJJRlRfQllURV9PUkRFUgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgX19USFJJRlRfQllURV9PUkRFUiA9PSBfX1RIUklGVF9CSUdfRU5ESUFOCisjIGlmICFkZWZpbmVkKFRIUklGVF9udG9obGwpCisjICBkZWZpbmUgVEhSSUZUX250b2hsbChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbmxsKG4pIChuKQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKKyMgIGluY2x1ZGUgPGJ5dGVzd2FwLmg+CisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWwobikgYnN3YXBfMzIobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsKG4pIGJzd2FwXzMyKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlcyhuKSBic3dhcF8xNihuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaHMobikgYnN3YXBfMTYobikKKyMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KKyMgIGRlZmluZSBic3dhcF82NChuKSBcCisgICAgICAoICgoKG4pICYgMHhmZjAwMDAwMDAwMDAwMDAwdWxsKSA+PiA1NikgXAorICAgICAgfCAoKChuKSAmIDB4MDBmZjAwMDAwMDAwMDAwMHVsbCkgPj4gNDApIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDBmZjAwMDAwMDAwMDB1bGwpID4+IDI0KSBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwMDBmZjAwMDAwMDAwdWxsKSA+PiA4KSAgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDBmZjAwMDAwMHVsbCkgPDwgOCkgIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDBmZjAwMDB1bGwpIDw8IDI0KSBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwMDBmZjAwdWxsKSA8PCA0MCkgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMDAwMDBmZnVsbCkgPDwgNTYpICkKKyMgIGRlZmluZSBic3dhcF8zMihuKSBcCisgICAgICAoICgoKG4pICYgMHhmZjAwMDAwMHVsKSA+PiAyNCkgXAorICAgICAgfCAoKChuKSAmIDB4MDBmZjAwMDB1bCkgPj4gOCkgIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDBmZjAwdWwpIDw8IDgpICBcCisgICAgICB8ICgoKG4pICYgMHgwMDAwMDBmZnVsKSA8PCAyNCkgKQorIyAgZGVmaW5lIGJzd2FwXzE2KG4pIFwKKyAgICAgICggKCgobikgJiAoKHVuc2lnbmVkIHNob3J0KTB4ZmYwMHVsKSkgPj4gOCkgIFwKKyAgICAgIHwgKCgobikgJiAoKHVuc2lnbmVkIHNob3J0KTB4MDBmZnVsKSkgPDwgOCkgICkKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbChuKSBic3dhcF8zMihuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGwobikgYnN3YXBfMzIobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVzKG4pIGJzd2FwXzE2KG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9ocyhuKSBic3dhcF8xNihuKQorIyBlbmRpZiAvKiBHTlVDICYgR0xJQkMgKi8KKyNlbGlmIF9fVEhSSUZUX0JZVEVfT1JERVIgPT0gX19USFJJRlRfTElUVExFX0VORElBTgorIyAgZGVmaW5lIFRIUklGVF9odG9sZWxsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGxsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVzKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaHMobikgKG4pCisjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQorIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyMgIGRlZmluZSBUSFJJRlRfbnRvaGxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b25sbChuKSBic3dhcF82NChuKQorIyBlbGlmIGRlZmluZWQoX01TQ19WRVIpIC8qIE1pY3Jvc29mdCBWaXN1YWwgQysrICovCisjICBkZWZpbmUgVEhSSUZUX250b2hsbChuKSAoIF9ieXRlc3dhcF91aW50NjQoKHVpbnQ2NF90KW4pICkKKyMgIGRlZmluZSBUSFJJRlRfaHRvbmxsKG4pICggX2J5dGVzd2FwX3VpbnQ2NCgodWludDY0X3QpbikgKQorIyBlbGlmICFkZWZpbmVkKFRIUklGVF9udG9obGwpIC8qIE5vdCBHTlVDL0dMSUJDIG9yIE1TVkMgKi8KKyMgIGRlZmluZSBUSFJJRlRfbnRvaGxsKG4pICggKCgodWludDY0X3QpbnRvaGwoKHVpbnQzMl90KW4pKSA8PCAzMikgKyBudG9obCgodWludDMyX3QpKG4gPj4gMzIpKSApCisjICBkZWZpbmUgVEhSSUZUX2h0b25sbChuKSAoICgoKHVpbnQ2NF90KWh0b25sKCh1aW50MzJfdCluKSkgPDwgMzIpICsgaHRvbmwoKHVpbnQzMl90KShuID4+IDMyKSkgKQorIyBlbmRpZiAvKiBHTlVDL0dMSUJDIG9yIE1TVkMgb3Igc29tZXRoaW5nIGVsc2UgKi8KKyNlbHNlIC8qIF9fVEhSSUZUX0JZVEVfT1JERVIgKi8KKyMgZXJyb3IgIkNhbid0IGRlZmluZSBUSFJJRlRfaHRvbmxsIG9yIFRIUklGVF9udG9obGwhIgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OworCisvKioKKyAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sIHN1cHBvcnRzLgorICogVGFrZSBzcGVjaWFsIG5vdGUgb2YgdGhlIFRfRU5EIHR5cGUgd2hpY2ggaXMgdXNlZCBzcGVjaWZpY2FsbHkgdG8gbWFyaworICogdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIGZpZWxkcy4KKyAqLworZW51bSBUVHlwZSB7CisgIFRfU1RPUCAgICAgICA9IDAsCisgIFRfVk9JRCAgICAgICA9IDEsCisgIFRfQk9PTCAgICAgICA9IDIsCisgIFRfQllURSAgICAgICA9IDMsCisgIFRfSTA4ICAgICAgICA9IDMsCisgIFRfSTE2ICAgICAgICA9IDYsCisgIFRfSTMyICAgICAgICA9IDgsCisgIFRfVTY0ICAgICAgICA9IDksCisgIFRfSTY0ICAgICAgICA9IDEwLAorICBUX0RPVUJMRSAgICAgPSA0LAorICBUX1NUUklORyAgICAgPSAxMSwKKyAgVF9VVEY3ICAgICAgID0gMTEsCisgIFRfU1RSVUNUICAgICA9IDEyLAorICBUX01BUCAgICAgICAgPSAxMywKKyAgVF9TRVQgICAgICAgID0gMTQsCisgIFRfTElTVCAgICAgICA9IDE1LAorICBUX1VURjggICAgICAgPSAxNiwKKyAgVF9VVEYxNiAgICAgID0gMTcKK307CisKKy8qKgorICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSBtZXNzYWdlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbAorICogc3VwcG9ydHMuCisgKi8KK2VudW0gVE1lc3NhZ2VUeXBlIHsKKyAgVF9DQUxMICAgICAgID0gMSwKKyAgVF9SRVBMWSAgICAgID0gMiwKKyAgVF9FWENFUFRJT04gID0gMywKKyAgVF9PTkVXQVkgICAgID0gNAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUID0gNjQ7CisKKy8qKgorICogQWJzdHJhY3QgY2xhc3MgZm9yIGEgdGhyaWZ0IHByb3RvY29sIGRyaXZlci4gVGhlc2UgYXJlIGFsbCB0aGUgbWV0aG9kcyB0aGF0CisgKiBhIHByb3RvY29sIG11c3QgaW1wbGVtZW50LiBFc3NlbnRpYWxseSwgdGhlcmUgbXVzdCBiZSBzb21lIHdheSBvZiByZWFkaW5nCisgKiBhbmQgd3JpdGluZyBhbGwgdGhlIGJhc2UgdHlwZXMsIHBsdXMgYSBtZWNoYW5pc20gZm9yIHdyaXRpbmcgb3V0IHN0cnVjdHMKKyAqIHdpdGggaW5kZXhlZCBmaWVsZHMuCisgKgorICogVFByb3RvY29sIG9iamVjdHMgc2hvdWxkIG5vdCBiZSBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIGVuY29kaW5nIGNvbnRleHRzLAorICogYXMgdGhleSBtYXkgbmVlZCB0byBtYWludGFpbiBpbnRlcm5hbCBzdGF0ZSBpbiBzb21lIHByb3RvY29scyAoaS5lLiBYTUwpLgorICogTm90ZSB0aGF0IGlzIGlzIGFjY2VwdGFibGUgZm9yIHRoZSBUUHJvdG9jb2wgbW9kdWxlIHRvIGRvIGl0cyBvd24gaW50ZXJuYWwKKyAqIGJ1ZmZlcmVkIHJlYWRzL3dyaXRlcyB0byB0aGUgdW5kZXJseWluZyBUVHJhbnNwb3J0IHdoZXJlIGFwcHJvcHJpYXRlIChpLmUuCisgKiB3aGVuIHBhcnNpbmcgYW4gaW5wdXQgWE1MIHN0cmVhbSwgcmVhZGluZyBzaG91bGQgYmUgYmF0Y2hlZCByYXRoZXIgdGhhbgorICogbG9va2luZyBhaGVhZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyIGZvciBhIGNsb3NlIHRhZykuCisgKgorICovCitjbGFzcyBUUHJvdG9jb2wgeworcHVibGljOgorICB2aXJ0dWFsIH5UUHJvdG9jb2woKTsKKworICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMuCisgICAqLworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW5fdmlydChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkKKyAgICAgID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQnl0ZV92aXJ0KGNvbnN0IGludDhfdCBieXRlKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkxNl92aXJ0KGNvbnN0IGludDE2X3QgaTE2KSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkzMl92aXJ0KGNvbnN0IGludDMyX3QgaTMyKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUk2NF92aXJ0KGNvbnN0IGludDY0X3QgaTY0KSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZURvdWJsZV92aXJ0KGNvbnN0IGRvdWJsZSBkdWIpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RyaW5nX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnlfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA9IDA7CisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQobmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZU1lc3NhZ2VFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KG5hbWUpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVTdHJ1Y3RFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVGaWVsZEJlZ2luX3ZpcnQobmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVGaWVsZEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUZpZWxkU3RvcF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZU1hcEJlZ2luX3ZpcnQoa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZU1hcEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlTGlzdEJlZ2luX3ZpcnQoZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlTGlzdEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVTZXRCZWdpbl92aXJ0KGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlU2V0RW5kX3ZpcnQoKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVCb29sX3ZpcnQodmFsdWUpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVCeXRlX3ZpcnQoYnl0ZSk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlSTE2X3ZpcnQoaTE2KTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVJMzJfdmlydChpMzIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUk2NF92aXJ0KGk2NCk7CisgIH0KKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gd3JpdGVEb3VibGVfdmlydChkdWIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHdyaXRlU3RyaW5nX3ZpcnQoc3RyKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiB3cml0ZUJpbmFyeV92aXJ0KHN0cik7CisgIH0KKworICAvKioKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZF92aXJ0KCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0RW5kX3ZpcnQoKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KGJvb2wmIHZhbHVlKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCeXRlX3ZpcnQoaW50OF90JiBieXRlKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyX3ZpcnQoaW50MzJfdCYgaTMyKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTY0X3ZpcnQoaW50NjRfdCYgaTY0KSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRG91YmxlX3ZpcnQoZG91YmxlJiBkdWIpID0gMDsKKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJpbmdfdmlydChzdGQ6OnN0cmluZyYgc3RyKSA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQmluYXJ5X3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgPSAwOworCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CisgIH0KKworICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkTWVzc2FnZUVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkU3RydWN0QmVnaW5fdmlydChuYW1lKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZFN0cnVjdEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRGaWVsZEJlZ2luX3ZpcnQobmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkRmllbGRFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkTWFwQmVnaW5fdmlydChrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZE1hcEVuZF92aXJ0KCk7CisgIH0KKworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkTGlzdEJlZ2luX3ZpcnQoZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZExpc3RFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkU2V0QmVnaW5fdmlydChlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB1aW50MzJfdCByZWFkU2V0RW5kKCkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRTZXRFbmRfdmlydCgpOworICB9CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkQm9vbF92aXJ0KHZhbHVlKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRCeXRlX3ZpcnQoYnl0ZSk7CisgIH0KKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRJMTZfdmlydChpMTYpOworICB9CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkSTMyX3ZpcnQoaTMyKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZEk2NF92aXJ0KGk2NCk7CisgIH0KKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gcmVhZERvdWJsZV92aXJ0KGR1Yik7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkU3RyaW5nX3ZpcnQoc3RyKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRCaW5hcnlfdmlydChzdHIpOworICB9CisKKyAgLyoKKyAgICogc3RkOjp2ZWN0b3IgaXMgc3BlY2lhbGl6ZWQgZm9yIGJvb2wsIGFuZCBpdHMgZWxlbWVudHMgYXJlIGluZGl2aWR1YWwgYml0cworICAgKiByYXRoZXIgdGhhbiBib29scy4gICBXZSBuZWVkIHRvIGRlZmluZSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHJlYWRCb29sKCkKKyAgICogdG8gd29yayB3aXRoIHN0ZDo6dmVjdG9yPGJvb2w+LgorICAgKi8KKyAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRCb29sX3ZpcnQodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIE1ldGhvZCB0byBhcmJpdHJhcmlseSBza2lwIG92ZXIgZGF0YS4KKyAgICovCisgIHVpbnQzMl90IHNraXAoVFR5cGUgdHlwZSkgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHNraXBfdmlydCh0eXBlKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKTsKKworICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKworICAvLyBUT0RPOiByZW1vdmUgdGhlc2UgdHdvIGNhbGxzLCB0aGV5IGFyZSBmb3IgYmFja3dhcmRzCisgIC8vIGNvbXBhdGliaWxpdHkKKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRJbnB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRPdXRwdXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CisKKyAgLy8gaW5wdXQgYW5kIG91dHB1dCByZWN1cnNpb24gZGVwdGggYXJlIGtlcHQgc2VwYXJhdGUgc28gdGhhdCBvbmUgcHJvdG9jb2wKKyAgLy8gY2FuIGJlIHVzZWQgY29uY3VycmVudGx5IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCisgIHZvaWQgaW5jcmVtZW50SW5wdXRSZWN1cnNpb25EZXB0aCgpIHsKKyAgICBpZiAocmVjdXJzaW9uX2xpbWl0XyA8ICsraW5wdXRfcmVjdXJzaW9uX2RlcHRoXykgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6REVQVEhfTElNSVQpOworICAgIH0KKyAgfQorICB2b2lkIGRlY3JlbWVudElucHV0UmVjdXJzaW9uRGVwdGgoKSB7IC0taW5wdXRfcmVjdXJzaW9uX2RlcHRoXzsgfQorCisgIHZvaWQgaW5jcmVtZW50T3V0cHV0UmVjdXJzaW9uRGVwdGgoKSB7CisgICAgaWYgKHJlY3Vyc2lvbl9saW1pdF8gPCArK291dHB1dF9yZWN1cnNpb25fZGVwdGhfKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpERVBUSF9MSU1JVCk7CisgICAgfQorICB9CisgIHZvaWQgZGVjcmVtZW50T3V0cHV0UmVjdXJzaW9uRGVwdGgoKSB7IC0tb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF87IH0KKworICB1aW50MzJfdCBnZXRSZWN1cnNpb25MaW1pdCgpIGNvbnN0IHtyZXR1cm4gcmVjdXJzaW9uX2xpbWl0Xzt9CisgIHZvaWQgc2V0UmVjdXJpc2lvbkxpbWl0KHVpbnQzMl90IGRlcHRoKSB7cmVjdXJzaW9uX2xpbWl0XyA9IGRlcHRoO30KKworcHJvdGVjdGVkOgorICBUUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKKyAgICA6IHB0cmFuc18ocHRyYW5zKSwgaW5wdXRfcmVjdXJzaW9uX2RlcHRoXygwKSwgb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF8oMCksIHJlY3Vyc2lvbl9saW1pdF8oREVGQVVMVF9SRUNVUlNJT05fTElNSVQpCisgIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFuc187CisKK3ByaXZhdGU6CisgIFRQcm90b2NvbCgpIHt9CisgIHVpbnQzMl90IGlucHV0X3JlY3Vyc2lvbl9kZXB0aF87CisgIHVpbnQzMl90IG91dHB1dF9yZWN1cnNpb25fZGVwdGhfOworICB1aW50MzJfdCByZWN1cnNpb25fbGltaXRfOworfTsKKworLyoqCisgKiBDb25zdHJ1Y3RzIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wgb2JqZWN0cyBnaXZlbiB0cmFuc3BvcnRzLgorICovCitjbGFzcyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVFByb3RvY29sRmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VFByb3RvY29sRmFjdG9yeSgpOworCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluVHJhbnMsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnMpIHsKKyAgICAodm9pZClvdXRUcmFuczsKKyAgICByZXR1cm4gZ2V0UHJvdG9jb2woaW5UcmFucyk7CisgIH0KK307CisKKy8qKgorICogRHVtbXkgcHJvdG9jb2wgY2xhc3MuCisgKgorICogVGhpcyBjbGFzcyBkb2VzIG5vdGhpbmcsIGFuZCBzaG91bGQgbmV2ZXIgYmUgaW5zdGFudGlhdGVkLgorICogSXQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBnZW5lcmF0b3IgY29kZS4KKyAqLworY2xhc3MgVER1bW15UHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHt9OworCisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IC8gbGVnYWN5IGNob2ljZQorc3RydWN0IFROZXR3b3JrQmlnRW5kaWFuCit7CisgIHN0YXRpYyB1aW50MTZfdCB0b1dpcmUxNih1aW50MTZfdCB4KSAgIHtyZXR1cm4gaHRvbnMoeCk7fQorICBzdGF0aWMgdWludDMyX3QgdG9XaXJlMzIodWludDMyX3QgeCkgICB7cmV0dXJuIGh0b25sKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IHRvV2lyZTY0KHVpbnQ2NF90IHgpICAge3JldHVybiBUSFJJRlRfaHRvbmxsKHgpO30KKyAgc3RhdGljIHVpbnQxNl90IGZyb21XaXJlMTYodWludDE2X3QgeCkge3JldHVybiBudG9ocyh4KTt9CisgIHN0YXRpYyB1aW50MzJfdCBmcm9tV2lyZTMyKHVpbnQzMl90IHgpIHtyZXR1cm4gbnRvaGwoeCk7fQorICBzdGF0aWMgdWludDY0X3QgZnJvbVdpcmU2NCh1aW50NjRfdCB4KSB7cmV0dXJuIFRIUklGVF9udG9obGwoeCk7fQorfTsKKworLy8gT24gbW9zdCBzeXN0ZW1zLCB0aGlzIHdpbGwgYmUgYSBiaXQgZmFzdGVyIHRoYW4gVE5ldHdvcmtCaWdFbmRpYW4KK3N0cnVjdCBUTmV0d29ya0xpdHRsZUVuZGlhbgoreworICBzdGF0aWMgdWludDE2X3QgdG9XaXJlMTYodWludDE2X3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9sZXMoeCk7fQorICBzdGF0aWMgdWludDMyX3QgdG9XaXJlMzIodWludDMyX3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9sZWwoeCk7fQorICBzdGF0aWMgdWludDY0X3QgdG9XaXJlNjQodWludDY0X3QgeCkgICB7cmV0dXJuIFRIUklGVF9odG9sZWxsKHgpO30KKyAgc3RhdGljIHVpbnQxNl90IGZyb21XaXJlMTYodWludDE2X3QgeCkge3JldHVybiBUSFJJRlRfbGV0b2hzKHgpO30KKyAgc3RhdGljIHVpbnQzMl90IGZyb21XaXJlMzIodWludDMyX3QgeCkge3JldHVybiBUSFJJRlRfbGV0b2hsKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IGZyb21XaXJlNjQodWludDY0X3QgeCkge3JldHVybiBUSFJJRlRfbGV0b2hsbCh4KTt9Cit9OworCitzdHJ1Y3QgVE91dHB1dFJlY3Vyc2lvblRyYWNrZXIgeworICBUUHJvdG9jb2wgJnByb3RfOworICBUT3V0cHV0UmVjdXJzaW9uVHJhY2tlcihUUHJvdG9jb2wgJnByb3QpIDogcHJvdF8ocHJvdCkgeworICAgIHByb3RfLmluY3JlbWVudE91dHB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KKyAgflRPdXRwdXRSZWN1cnNpb25UcmFja2VyKCkgeworICAgIHByb3RfLmRlY3JlbWVudE91dHB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KK307CisKK3N0cnVjdCBUSW5wdXRSZWN1cnNpb25UcmFja2VyIHsKKyAgVFByb3RvY29sICZwcm90XzsKKyAgVElucHV0UmVjdXJzaW9uVHJhY2tlcihUUHJvdG9jb2wgJnByb3QpIDogcHJvdF8ocHJvdCkgeworICAgIHByb3RfLmluY3JlbWVudElucHV0UmVjdXJzaW9uRGVwdGgoKTsKKyAgfQorICB+VElucHV0UmVjdXJzaW9uVHJhY2tlcigpIHsKKyAgICBwcm90Xy5kZWNyZW1lbnRJbnB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KK307CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgVFByb3RvY29sOjpza2lwKCkuCisgKgorICogVGVtcGxhdGl6ZWQgdG8gYXZvaWQgaGF2aW5nIHRvIG1ha2UgdmlydHVhbCBmdW5jdGlvbiBjYWxscy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KK3VpbnQzMl90IHNraXAoUHJvdG9jb2xfJiBwcm90LCBUVHlwZSB0eXBlKSB7CisgIFRJbnB1dFJlY3Vyc2lvblRyYWNrZXIgdHJhY2tlcihwcm90KTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX0JPT0w6IHsKKyAgICBib29sIGJvb2x2OworICAgIHJldHVybiBwcm90LnJlYWRCb29sKGJvb2x2KTsKKyAgfQorICBjYXNlIFRfQllURTogeworICAgIGludDhfdCBieXRldiA9IDA7CisgICAgcmV0dXJuIHByb3QucmVhZEJ5dGUoYnl0ZXYpOworICB9CisgIGNhc2UgVF9JMTY6IHsKKyAgICBpbnQxNl90IGkxNjsKKyAgICByZXR1cm4gcHJvdC5yZWFkSTE2KGkxNik7CisgIH0KKyAgY2FzZSBUX0kzMjogeworICAgIGludDMyX3QgaTMyOworICAgIHJldHVybiBwcm90LnJlYWRJMzIoaTMyKTsKKyAgfQorICBjYXNlIFRfSTY0OiB7CisgICAgaW50NjRfdCBpNjQ7CisgICAgcmV0dXJuIHByb3QucmVhZEk2NChpNjQpOworICB9CisgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICBkb3VibGUgZHViOworICAgIHJldHVybiBwcm90LnJlYWREb3VibGUoZHViKTsKKyAgfQorICBjYXNlIFRfU1RSSU5HOiB7CisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIHJldHVybiBwcm90LnJlYWRCaW5hcnkoc3RyKTsKKyAgfQorICBjYXNlIFRfU1RSVUNUOiB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGludDE2X3QgZmlkOworICAgIFRUeXBlIGZ0eXBlOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgcmVzdWx0ICs9IHByb3QucmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7CisgICAgICBpZiAoZnR5cGUgPT0gVF9TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZnR5cGUpOworICAgICAgcmVzdWx0ICs9IHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgIHJlc3VsdCArPSBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGNhc2UgVF9NQVA6IHsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIFRUeXBlIGtleVR5cGU7CisgICAgVFR5cGUgdmFsVHlwZTsKKyAgICB1aW50MzJfdCBpLCBzaXplOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBrZXlUeXBlKTsKKyAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIHZhbFR5cGUpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfU0VUOiB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBUVHlwZSBlbGVtVHlwZTsKKyAgICB1aW50MzJfdCBpLCBzaXplOworICAgIHJlc3VsdCArPSBwcm90LnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZWxlbVR5cGUpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkU2V0RW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfTElTVDogeworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgVFR5cGUgZWxlbVR5cGU7CisgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBlbGVtVHlwZSk7CisgICAgfQorICAgIHJlc3VsdCArPSBwcm90LnJlYWRMaXN0RW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VNjQ6CisgIGNhc2UgVF9VVEY4OgorICBjYXNlIFRfVVRGMTY6CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQzYTBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9UUFJPVE9DT0xERUNPUkFUT1JfSF8KKyNkZWZpbmUgVEhSSUZUX1RQUk9UT0NPTERFQ09SQVRPUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworLyoqCisgKiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZAorICogPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZSwgcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlCisgKiBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4KKyAqCisgKiA8cD5TZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pPC9wPgorICoKKyAqIEBzZWUgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTXVsdGlwbGV4ZWRQcm90b2NvbAorICovCitjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBwdWJsaWMgVFByb3RvY29sIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VFByb3RvY29sRGVjb3JhdG9yKCkge30KKworICAvLyBEZXNjOiBJbml0aWFsaXplcyB0aGUgcHJvdG9jb2wgZGVjb3JhdG9yIG9iamVjdC4KKyAgVFByb3RvY29sRGVjb3JhdG9yKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bykKKyAgICA6IFRQcm90b2NvbChwcm90by0+Z2V0VHJhbnNwb3J0KCkpLCBwcm90b2NvbChwcm90bykge30KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVNZXNzYWdlRW5kKCk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVTdHJ1Y3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZUZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRFbmQoKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVGaWVsZFN0b3AoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVNYXBFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVMaXN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU2V0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQm9vbF92aXJ0KGNvbnN0IGJvb2wgdmFsdWUpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJvb2wodmFsdWUpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUJ5dGUoYnl0ZSk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkxNl92aXJ0KGNvbnN0IGludDE2X3QgaTE2KSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVJMTYoaTE2KTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTMyX3ZpcnQoY29uc3QgaW50MzJfdCBpMzIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUkzMihpMzIpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTY0KGk2NCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRG91YmxlX3ZpcnQoY29uc3QgZG91YmxlIGR1YikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRG91YmxlKGR1Yik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZVN0cmluZyhzdHIpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCaW5hcnlfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCaW5hcnkoc3RyKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0QmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRTdHJ1Y3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRGaWVsZEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZE1hcEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRMaXN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTZXRCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZFNldEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KGJvb2wmIHZhbHVlKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJvb2wodmFsdWUpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkQm9vbCh2YWx1ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCeXRlX3ZpcnQoaW50OF90JiBieXRlKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJ5dGUoYnl0ZSk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMTZfdmlydChpbnQxNl90JiBpMTYpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTE2KGkxNik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTMyX3ZpcnQoaW50MzJfdCYgaTMyKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEkzMihpMzIpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NF92aXJ0KGludDY0X3QmIGk2NCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRJNjQoaTY0KTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZERvdWJsZV92aXJ0KGRvdWJsZSYgZHViKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZERvdWJsZShkdWIpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RyaW5nX3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRTdHJpbmcoc3RyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnlfdmlydChzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEJpbmFyeShzdHIpOyB9CisKK3ByaXZhdGU6CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDsKK307Cit9Cit9Cit9CisKKyNlbmRpZiAvLyBUSFJJRlRfVFBST1RPQ09MREVDT1JBVE9SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxNzhlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MRVhDRVBUSU9OX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MRVhDRVBUSU9OX0hfIDEKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8qKgorICogQ2xhc3MgdG8gZW5jYXBzdWxhdGUgYWxsIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBwcm90b2NvbCBlcnJvcnMgdGhhdCBtYXkKKyAqIG9jY3VyIGluIHZhcmlvdXMgcHJvdG9jb2wgc3lzdGVtcy4gVGhpcyBwcm92aWRlcyBhIHNvcnQgb2YgZ2VuZXJpYworICogd3JhcHBlciBhcm91bmQgdGhlIHZhZ3VlIFVOSVggRV8gZXJyb3IgY29kZXMgdGhhdCBsZXRzIGEgY29tbW9uIGNvZGUKKyAqIGJhc2Ugb2YgZXJyb3IgaGFuZGxpbmcgdG8gYmUgdXNlZCBmb3IgdmFyaW91cyB0eXBlcyBvZiBwcm90b2NvbHMsIGkuZS4KKyAqIHBpcGVzIGV0Yy4KKyAqCisgKi8KK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIC8qKgorICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KKyAgICovCisgIGVudW0gVFByb3RvY29sRXhjZXB0aW9uVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgSU5WQUxJRF9EQVRBID0gMSwKKyAgICBORUdBVElWRV9TSVpFID0gMiwKKyAgICBTSVpFX0xJTUlUID0gMywKKyAgICBCQURfVkVSU0lPTiA9IDQsCisgICAgTk9UX0lNUExFTUVOVEVEID0gNSwKKyAgICBERVBUSF9MSU1JVCA9IDYKKyAgfTsKKworICBUUHJvdG9jb2xFeGNlcHRpb24oKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKFVOS05PV04pIHt9CisKKyAgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZSkgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLCB0eXBlXyh0eXBlKSB7fQorCisgIFRQcm90b2NvbEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKHR5cGUpIHt9CisKKyAgdmlydHVhbCB+VFByb3RvY29sRXhjZXB0aW9uKCkgbm9leGNlcHQge30KKworICAvKioKKyAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKKyAgICogdGhhdCBoYXMgb2NjdXJyZWQuCisgICAqCisgICAqIEByZXR1cm4gRXJyb3IgY29kZQorICAgKi8KKyAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCB7CisgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKKyAgICAgIHN3aXRjaCAodHlwZV8pIHsKKyAgICAgIGNhc2UgVU5LTk9XTjoKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IFVua25vd24gcHJvdG9jb2wgZXhjZXB0aW9uIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9EQVRBOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCBkYXRhIjsKKyAgICAgIGNhc2UgTkVHQVRJVkVfU0laRToKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IE5lZ2F0aXZlIHNpemUiOworICAgICAgY2FzZSBTSVpFX0xJTUlUOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogRXhjZWVkZWQgc2l6ZSBsaW1pdCI7CisgICAgICBjYXNlIEJBRF9WRVJTSU9OOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCB2ZXJzaW9uIjsKKyAgICAgIGNhc2UgTk9UX0lNUExFTUVOVEVEOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogTm90IGltcGxlbWVudGVkIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogRXJyb3IgY29kZQorICAgKi8KKyAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTEVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDBiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRBUF9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRBUF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKKworLyoqCisgKiBQdXRzIGEgd2lyZXRhcCBvbiBhIHByb3RvY29sIG9iamVjdC4gIEFueSByZWFkcyB0byB0aGlzIGNsYXNzIGFyZSBwYXNzZWQKKyAqIHRocm91Z2ggdG8gYW4gZW5jbG9zZWQgcHJvdG9jb2wgb2JqZWN0LCBidXQgYWxzbyBtaXJyb3JlZCBhcyB3cml0ZSB0byBhCisgKiBzZWNvbmQgcHJvdG9jb2wgb2JqZWN0LgorICoKKyAqLworY2xhc3MgVFByb3RvY29sVGFwIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VFByb3RvY29sVGFwPiB7CitwdWJsaWM6CisgIFRQcm90b2NvbFRhcChzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2UsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmspCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD4oc291cmNlLT5nZXRUcmFuc3BvcnQoKSksIHNvdXJjZV8oc291cmNlKSwgc2lua18oc2luaykge30KKworICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICAgIHNpbmtfLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICBzaW5rXy0+d3JpdGVNZXNzYWdlRW5kKCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7CisgICAgc2lua18tPndyaXRlU3RydWN0QmVnaW4obmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFN0cnVjdEVuZCgpOworICAgIHNpbmtfLT53cml0ZVN0cnVjdEVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICAgIGlmIChmaWVsZFR5cGUgPT0gVF9TVE9QKSB7CisgICAgICBzaW5rXy0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9IGVsc2UgeworICAgICAgc2lua18tPndyaXRlRmllbGRCZWdpbihuYW1lLmNfc3RyKCksIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgICAgfQorICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRGaWVsZEVuZCgpOworICAgIHNpbmtfLT53cml0ZUZpZWxkRW5kKCk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgICBzaW5rXy0+d3JpdGVNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkTWFwRW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZE1hcEVuZCgpOworICAgIHNpbmtfLT53cml0ZU1hcEVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgc2lua18tPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkTGlzdEVuZCgpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRMaXN0RW5kKCk7CisgICAgc2lua18tPndyaXRlTGlzdEVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIHNpbmtfLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkU2V0RW5kKCkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZFNldEVuZCgpOworICAgIHNpbmtfLT53cml0ZVNldEVuZCgpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQm9vbCh2YWx1ZSk7CisgICAgc2lua18tPndyaXRlQm9vbCh2YWx1ZSk7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgorICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD46OnJlYWRCb29sOworCisgIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEJ5dGUoYnl0ZSk7CisgICAgc2lua18tPndyaXRlQnl0ZShieXRlKTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNikgeworICAgIHVpbnQzMl90IHJ2ID0gc291cmNlXy0+cmVhZEkxNihpMTYpOworICAgIHNpbmtfLT53cml0ZUkxNihpMTYpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJMzIoaW50MzJfdCYgaTMyKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkSTMyKGkzMik7CisgICAgc2lua18tPndyaXRlSTMyKGkzMik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKKyAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRJNjQoaTY0KTsKKyAgICBzaW5rXy0+d3JpdGVJNjQoaTY0KTsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRG91YmxlKGR1Yik7CisgICAgc2lua18tPndyaXRlRG91YmxlKGR1Yik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkU3RyaW5nKHN0cik7CisgICAgc2lua18tPndyaXRlU3RyaW5nKHN0cik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkQmluYXJ5KHN0cik7CisgICAgc2lua18tPndyaXRlQmluYXJ5KHN0cik7CisgICAgcmV0dXJuIHJ2OworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmtfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVEFQX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5OGIyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVFlQRVNfSF8KKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRZUEVTX0hfIDEKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK2VudW0gUFJPVE9DT0xfVFlQRVMgeworICBUX0JJTkFSWV9QUk9UT0NPTCA9IDAsCisgIFRfSlNPTl9QUk9UT0NPTCA9IDEsCisgIFRfQ09NUEFDVF9QUk9UT0NPTCA9IDIsCit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUWVBFU19IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWVhNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaApAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFZJUlRVQUxQUk9UT0NPTF9IXworI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RWSVJUVUFMUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBwcm92aWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBUUHJvdG9jb2wgbWV0aG9kcy4KKyAqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBub24tdmlydHVhbCBUUHJvdG9jb2wKKyAqIG1ldGhvZHMuICBJdCBleGlzdHMgcHJpbWFyaWx5IHNvIFRWaXJ0dWFsUHJvdG9jb2wgY2FuIGRlcml2ZSBmcm9tIGl0LiAgSXQKKyAqIHByZXZlbnRzIFRWaXJ0dWFsUHJvdG9jb2wgbWV0aG9kcyBmcm9tIGNhdXNpbmcgaW5maW5pdGUgcmVjdXJzaW9uIGlmIHRoZQorICogbm9uLXZpcnR1YWwgbWV0aG9kcyBhcmUgbm90IG92ZXJyaWRkZW4gYnkgdGhlIFRWaXJ0dWFsUHJvdG9jb2wgc3ViY2xhc3MuCisgKgorICogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuICBVc2UgVFZpcnR1YWxQcm90b2NvbAorICogaW5zdGVhZC4KKyAqLworY2xhc3MgVFByb3RvY29sRGVmYXVsdHMgOiBwdWJsaWMgVFByb3RvY29sIHsKK3B1YmxpYzoKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpIHsKKyAgICAodm9pZCluYW1lOworICAgICh2b2lkKW1lc3NhZ2VUeXBlOworICAgICh2b2lkKXNlcWlkOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICAodm9pZCluYW1lOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICAodm9pZClmaWVsZFR5cGU7CisgICAgKHZvaWQpZmllbGRJZDsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgKHZvaWQpa2V5VHlwZTsKKyAgICAodm9pZCl2YWxUeXBlOworICAgICh2b2lkKXNpemU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkTWFwRW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgKHZvaWQpZWxlbVR5cGU7CisgICAgKHZvaWQpc2l6ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICAodm9pZCllbGVtVHlwZTsKKyAgICAodm9pZClzaXplOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKSB7CisgICAgKHZvaWQpdmFsdWU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkQm9vbChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7CisgICAgKHZvaWQpdmFsdWU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpIHsKKyAgICAodm9pZClieXRlOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZEkxNihpbnQxNl90JiBpMTYpIHsKKyAgICAodm9pZClpMTY7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMikgeworICAgICh2b2lkKWkzMjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgICAgKHZvaWQpaTY0OworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3QgcmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICAgICh2b2lkKWR1YjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICAgICh2b2lkKXN0cjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIHN0cikgeworICAgICh2b2lkKXN0cjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgICAodm9pZCluYW1lOworICAgICh2b2lkKW1lc3NhZ2VUeXBlOworICAgICh2b2lkKXNlcWlkOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICAodm9pZClmaWVsZFR5cGU7CisgICAgKHZvaWQpZmllbGRJZDsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgICh2b2lkKWtleVR5cGU7CisgICAgKHZvaWQpdmFsVHlwZTsKKyAgICAodm9pZClzaXplOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgICh2b2lkKWVsZW1UeXBlOworICAgICh2b2lkKXNpemU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgKHZvaWQpZWxlbVR5cGU7CisgICAgKHZvaWQpc2l6ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgeworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKKyAgICAodm9pZCl2YWx1ZTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICAgICh2b2lkKWJ5dGU7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgeworICAgICh2b2lkKWkxNjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7CisgICAgKHZvaWQpaTMyOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKKyAgICAodm9pZClpNjQ7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgICAgKHZvaWQpZHViOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOworICB9CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgICh2b2lkKXN0cjsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKKyAgfQorCisgIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICAodm9pZClzdHI7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CisgIH0KKworICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsgfQorCitwcm90ZWN0ZWQ6CisgIFRQcm90b2NvbERlZmF1bHRzKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpIDogVFByb3RvY29sKHB0cmFucykge30KK307CisKKy8qKgorICogQ29uY3JldGUgVFByb3RvY29sIGNsYXNzZXMgc2hvdWxkIGluaGVyaXQgZnJvbSBUVmlydHVhbFByb3RvY29sCisgKiBzbyB0aGV5IGRvbid0IGhhdmUgdG8gbWFudWFsbHkgb3ZlcnJpZGUgdmlydHVhbCBtZXRob2RzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfLCBjbGFzcyBTdXBlcl8gPSBUUHJvdG9jb2xEZWZhdWx0cz4KK2NsYXNzIFRWaXJ0dWFsUHJvdG9jb2wgOiBwdWJsaWMgU3VwZXJfIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIFdyaXRpbmcgZnVuY3Rpb25zLgorICAgKi8KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmRfdmlydCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWVzc2FnZUVuZCgpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cnVjdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRTdG9wKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWFwRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVMaXN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0QmVnaW5fdmlydChjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTZXRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCb29sX3ZpcnQoY29uc3QgYm9vbCB2YWx1ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVCb29sKHZhbHVlKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCeXRlX3ZpcnQoY29uc3QgaW50OF90IGJ5dGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlQnl0ZShieXRlKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJMTYoaTE2KTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMzJfdmlydChjb25zdCBpbnQzMl90IGkzMikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJMzIoaTMyKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJNjRfdmlydChjb25zdCBpbnQ2NF90IGk2NCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVJNjQoaTY0KTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVEb3VibGVfdmlydChjb25zdCBkb3VibGUgZHViKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZURvdWJsZShkdWIpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cmluZ192aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RyaW5nKHN0cik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQmluYXJ5X3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVCaW5hcnkoc3RyKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkaW5nIGZ1bmN0aW9ucworICAgKi8KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWVzc2FnZUVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0QmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU3RydWN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFN0cnVjdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRmllbGRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1hcEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTZXRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJvb2wodmFsdWUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQm9vbF92aXJ0KHN0ZDo6dmVjdG9yPGJvb2w+OjpyZWZlcmVuY2UgdmFsdWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCb29sKHZhbHVlKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJ5dGVfdmlydChpbnQ4X3QmIGJ5dGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCeXRlKGJ5dGUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkSTE2KGkxNik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJMzJfdmlydChpbnQzMl90JiBpMzIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRJMzIoaTMyKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEk2NF92aXJ0KGludDY0X3QmIGk2NCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEk2NChpNjQpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRG91YmxlX3ZpcnQoZG91YmxlJiBkdWIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWREb3VibGUoZHViKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJpbmcoc3RyKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJpbmFyeV92aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRCaW5hcnkoc3RyKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3Qgc2tpcF92aXJ0KFRUeXBlIHR5cGUpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5za2lwKHR5cGUpOyB9CisKKyAgLyoKKyAgICogUHJvdmlkZSBhIGRlZmF1bHQgc2tpcCgpIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBub24tdmlydHVhbCByZWFkCisgICAqIG1ldGhvZHMuCisgICAqCisgICAqIE5vdGU6IHN1YmNsYXNzZXMgdGhhdCB1c2UgVFZpcnR1YWxQcm90b2NvbCB0byBkZXJpdmUgZnJvbSBhbm90aGVyIHByb3RvY29sCisgICAqIGltcGxlbWVudGF0aW9uIChpLmUuLCBub3QgVFByb3RvY29sRGVmYXVsdHMpIHNob3VsZCBiZXdhcmUgdGhhdCB0aGlzIG1heQorICAgKiBvdmVycmlkZSBhbnkgbm9uLWRlZmF1bHQgc2tpcCgpIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBwYXJlbnQKKyAgICogdHJhbnNwb3J0IGNsYXNzLiAgVGhleSBtYXkgbmVlZCB0byBleHBsaWNpdGx5IHJlZGVmaW5lIHNraXAoKSB0byBjYWxsIHRoZQorICAgKiBjb3JyZWN0IHBhcmVudCBpbXBsZW1lbnRhdGlvbiwgaWYgZGVzaXJlZC4KKyAgICovCisgIHVpbnQzMl90IHNraXAoVFR5cGUgdHlwZSkgeworICAgIFByb3RvY29sXyogY29uc3QgcHJvdCA9IHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpOworICAgIHJldHVybiA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6c2tpcCgqcHJvdCwgdHlwZSk7CisgIH0KKworICAvKgorICAgKiBQcm92aWRlIGEgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciB1c2Ugd2l0aAorICAgKiBzdGQ6OnZlY3Rvcjxib29sPiwgdGhhdCBiZWhhdmVzIHRoZSBzYW1lIGFzIHJlYWRpbmcgaW50byBhIG5vcm1hbCBib29sLgorICAgKgorICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIGlmIGRlc2lyZWQsIGJ1dCB0aGVyZSBub3JtYWxseSBzaG91bGRuJ3QKKyAgICogYmUgYSBuZWVkIHRvLgorICAgKi8KKyAgdWludDMyX3QgcmVhZEJvb2woc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICAgIGJvb2wgYiA9IGZhbHNlOworICAgIHVpbnQzMl90IHJldCA9IHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQm9vbChiKTsKKyAgICB2YWx1ZSA9IGI7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICB1c2luZyBTdXBlcl86OnJlYWRCb29sOyAvLyBzbyB3ZSBkb24ndCBoaWRlIHJlYWRCb29sKGJvb2wmKQorCitwcm90ZWN0ZWQ6CisgIFRWaXJ0dWFsUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOiBTdXBlcl8ocHRyYW5zKSB7fQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCisKKyNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFZJUlRVQUxQUk9UT0NPTF9IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhOWEzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0KCB0aHJpZnRjcHBxdDVfU09VUkNFUworICAgIFRRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCisgICAgVFFUY3BTZXJ2ZXIuY3BwCispCitzZXQoQ01BS0VfQVVUT01PQyBPTikKK2ZpbmRfcGFja2FnZShRdDUgUkVRVUlSRUQgQ09NUE9ORU5UUyBDb3JlIE5ldHdvcmspCitBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0cXQ1ICR7dGhyaWZ0Y3BwcXQ1X1NPVVJDRVN9KQorVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRxdDUgUXQ1OjpDb3JlIFF0NTo6TmV0d29yaykKK1RBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRxdDUgdGhyaWZ0KQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3N2M5OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxRQWJzdHJhY3RTb2NrZXQ+CisjaW5jbHVkZSA8UUlPRGV2aWNlPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVFFJT0RldmljZVRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydChzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KSA6IGRldl8oZGV2KSB7Cit9CisKK1RRSU9EZXZpY2VUcmFuc3BvcnQ6On5UUUlPRGV2aWNlVHJhbnNwb3J0KCkgeworICBkZXZfLT5jbG9zZSgpOworfQorCit2b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6Om9wZW4oKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZW4oKTogdW5kZXJseWluZyBRSU9EZXZpY2UgaXNuJ3Qgb3BlbiIpOworICB9Cit9CisKK2Jvb2wgVFFJT0RldmljZVRyYW5zcG9ydDo6aXNPcGVuKCkgeworICByZXR1cm4gZGV2Xy0+aXNPcGVuKCk7Cit9CisKK2Jvb2wgVFFJT0RldmljZVRyYW5zcG9ydDo6cGVlaygpIHsKKyAgcmV0dXJuIGRldl8tPmJ5dGVzQXZhaWxhYmxlKCkgPiAwOworfQorCit2b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmNsb3NlKCkgeworICBkZXZfLT5jbG9zZSgpOworfQorCit1aW50MzJfdCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpyZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IHJlcXVlc3RMZW4gPSBsZW47CisgIHdoaWxlIChsZW4pIHsKKyAgICB1aW50MzJfdCByZWFkU2l6ZTsKKyAgICB0cnkgeworICAgICAgcmVhZFNpemUgPSByZWFkKGJ1ZiwgbGVuKTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIGlmIChsZW4gIT0gcmVxdWVzdExlbikgeworICAgICAgICAvLyBzb21ldGhpbmcgcmVhZCBhbHJlYWR5CisgICAgICAgIHJldHVybiByZXF1ZXN0TGVuIC0gbGVuOworICAgICAgfQorICAgICAgLy8gZXJyb3IgYnV0IG5vdGhpbmcgcmVhZCB5ZXQKKyAgICAgIHRocm93OworICAgIH0KKyAgICBpZiAocmVhZFNpemUgPT0gMCkgeworICAgICAgZGV2Xy0+d2FpdEZvclJlYWR5UmVhZCg1MCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1ZiArPSByZWFkU2l6ZTsKKyAgICAgIGxlbiAtPSByZWFkU2l6ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlcXVlc3RMZW47Cit9CisKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgYWN0dWFsU2l6ZTsKKyAgcWludDY0IHJlYWRTaXplOworCisgIGlmICghZGV2Xy0+aXNPcGVuKCkpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQoKTogdW5kZXJseWluZyBRSU9EZXZpY2UgaXMgbm90IG9wZW4iKTsKKyAgfQorCisgIGFjdHVhbFNpemUgPSAodWludDMyX3QpKHN0ZDo6bWluKSgocWludDY0KWxlbiwgZGV2Xy0+Ynl0ZXNBdmFpbGFibGUoKSk7CisgIHJlYWRTaXplID0gZGV2Xy0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPihidWYpLCBhY3R1YWxTaXplKTsKKworICBpZiAocmVhZFNpemUgPCAwKSB7CisgICAgUUFic3RyYWN0U29ja2V0KiBzb2NrZXQ7CisgICAgaWYgKChzb2NrZXQgPSBxb2JqZWN0X2Nhc3Q8UUFic3RyYWN0U29ja2V0Kj4oZGV2Xy5nZXQoKSkpKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCgpIGZyb20gUUFic3RyYWN0U29ja2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5lcnJvcigpKTsKKyAgICB9CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiRmFpbGVkIHRvIHJlYWQgZnJvbSBmcm9tIFFJT0RldmljZSIpOworICB9CisKKyAgcmV0dXJuICh1aW50MzJfdClyZWFkU2l6ZTsKK30KKwordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB3aGlsZSAobGVuKSB7CisgICAgdWludDMyX3Qgd3JpdHRlbiA9IHdyaXRlX3BhcnRpYWwoYnVmLCBsZW4pOworICAgIGxlbiAtPSB3cml0dGVuOworICAgIGRldl8tPndhaXRGb3JCeXRlc1dyaXR0ZW4oNTApOworICB9Cit9CisKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OndyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgcWludDY0IHdyaXR0ZW47CisKKyAgaWYgKCFkZXZfLT5pc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGFydGlhbCgpOiB1bmRlcmx5aW5nIFFJT0RldmljZSBpcyBub3Qgb3BlbiIpOworICB9CisKKyAgd3JpdHRlbiA9IGRldl8tPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZiksIGxlbik7CisgIGlmICh3cml0dGVuIDwgMCkgeworICAgIFFBYnN0cmFjdFNvY2tldCogc29ja2V0OworICAgIGlmICgoc29ja2V0ID0gcW9iamVjdF9jYXN0PFFBYnN0cmFjdFNvY2tldCo+KGRldl8uZ2V0KCkpKSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGFydGlhbCgpOiBmYWlsZWQgdG8gd3JpdGUgdG8gUUFic3RyYWN0U29ja2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5lcnJvcigpKTsKKyAgICB9CisKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGFydGlhbCgpOiBmYWlsZWQgdG8gd3JpdGUgdG8gdW5kZXJseWluZyBRSU9EZXZpY2UiKTsKKyAgfQorCisgIHJldHVybiAodWludDMyX3Qpd3JpdHRlbjsKK30KKwordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgaWYgKCFkZXZfLT5pc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2goKTogdW5kZXJseWluZyBRSU9EZXZpY2UgaXMgbm90IG9wZW4iKTsKKyAgfQorCisgIFFBYnN0cmFjdFNvY2tldCogc29ja2V0OworCisgIGlmICgoc29ja2V0ID0gcW9iamVjdF9jYXN0PFFBYnN0cmFjdFNvY2tldCo+KGRldl8uZ2V0KCkpKSkgeworICAgIHNvY2tldC0+Zmx1c2goKTsKKyAgfSBlbHNlIHsKKyAgICBkZXZfLT53YWl0Rm9yQnl0ZXNXcml0dGVuKDEpOworICB9Cit9CisKK3VpbnQ4X3QqIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgKHZvaWQpYnVmOworICAodm9pZClsZW47CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmNvbnN1bWUodWludDMyX3QgbGVuKSB7CisgICh2b2lkKWxlbjsKKyAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjZThkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQVNZTkNfVFFJT0RFVklDRV9UUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9BU1lOQ19UUUlPREVWSUNFX1RSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK2NsYXNzIFFJT0RldmljZTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqICBUcmFuc3BvcnQgdGhhdCBvcGVyYXRlcyBvbiBhIFFJT0RldmljZSAoc29ja2V0LCBmaWxlLCBldGMpLgorICovCitjbGFzcyBUUUlPRGV2aWNlVHJhbnNwb3J0CisgICAgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFZpcnR1YWxUcmFuc3BvcnQ8VFFJT0RldmljZVRyYW5zcG9ydD4geworcHVibGljOgorICBleHBsaWNpdCBUUUlPRGV2aWNlVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldik7CisgIHZpcnR1YWwgflRRSU9EZXZpY2VUcmFuc3BvcnQoKTsKKworICB2b2lkIG9wZW4oKTsKKyAgYm9vbCBpc09wZW4oKTsKKyAgYm9vbCBwZWVrKCk7CisgIHZvaWQgY2xvc2UoKTsKKworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgZmx1c2goKTsKKworICB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKKyAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbik7CisKK3ByaXZhdGU6CisgIFRRSU9EZXZpY2VUcmFuc3BvcnQoY29uc3QgVFFJT0RldmljZVRyYW5zcG9ydCYpOworICBUUUlPRGV2aWNlVHJhbnNwb3J0JiBvcGVyYXRvcj0oY29uc3QgVFFJT0RldmljZVRyYW5zcG9ydCYpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldl87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVFFJT0RFVklDRV9UUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWFkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHRocmlmdC9xdC9UUVRjcFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxRTWV0YVR5cGU+CisjaW5jbHVkZSA8UVRjcFNvY2tldD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmg+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0OwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpmdW5jdGlvbjsKK3VzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMTsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworUVRfVVNFX05BTUVTUEFDRQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKKworc3RydWN0IFRRVGNwU2VydmVyOjpDb25uZWN0aW9uQ29udGV4dCB7CisgIHNoYXJlZF9wdHI8UVRjcFNvY2tldD4gY29ubmVjdGlvbl87CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlwcm90XzsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90XzsKKworICBleHBsaWNpdCBDb25uZWN0aW9uQ29udGV4dChzaGFyZWRfcHRyPFFUY3BTb2NrZXQ+IGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaXByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdCkKKyAgICA6IGNvbm5lY3Rpb25fKGNvbm5lY3Rpb24pLCB0cmFuc3BvcnRfKHRyYW5zcG9ydCksIGlwcm90XyhpcHJvdCksIG9wcm90XyhvcHJvdCkge30KK307CisKK1RRVGNwU2VydmVyOjpUUVRjcFNlcnZlcihzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcGZhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUU9iamVjdCogcGFyZW50KQorICA6IFFPYmplY3QocGFyZW50KSwgc2VydmVyXyhzZXJ2ZXIpLCBwcm9jZXNzb3JfKHByb2Nlc3NvciksIHBmYWN0XyhwZmFjdCkgeworICBxUmVnaXN0ZXJNZXRhVHlwZTxRVGNwU29ja2V0Kj4oIlFUY3BTb2NrZXQqIik7CisgIGNvbm5lY3Qoc2VydmVyLmdldCgpLCBTSUdOQUwobmV3Q29ubmVjdGlvbigpKSwgU0xPVChwcm9jZXNzSW5jb21pbmcoKSkpOworfQorCitUUVRjcFNlcnZlcjo6flRRVGNwU2VydmVyKCkgeworfQorCit2b2lkIFRRVGNwU2VydmVyOjpwcm9jZXNzSW5jb21pbmcoKSB7CisgIHdoaWxlIChzZXJ2ZXJfLT5oYXNQZW5kaW5nQ29ubmVjdGlvbnMoKSkgeworICAgIC8vIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBRVGNwU29ja2V0OyB0ZWNobmljYWxseSBpdCBjb3VsZCBiZSBkZWxldGVkCisgICAgLy8gd2hlbiB0aGUgUVRjcFNlcnZlciBpcyBkZXN0cm95ZWQsIGJ1dCBhbnkgcmVhbCBhcHAgc2hvdWxkIGRlbGV0ZSB0aGlzCisgICAgLy8gY2xhc3MgYmVmb3JlIGRlbGV0aW5nIHRoZSBRVGNwU2VydmVyIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgc2hhcmVkX3B0cjxRVGNwU29ja2V0PiBjb25uZWN0aW9uKHNlcnZlcl8tPm5leHRQZW5kaW5nQ29ubmVjdGlvbigpKTsKKworICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdDsKKyAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3Q7CisKKyAgICB0cnkgeworICAgICAgdHJhbnNwb3J0ID0gc2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFFJT0RldmljZVRyYW5zcG9ydChjb25uZWN0aW9uKSk7CisgICAgICBpcHJvdCA9IHNoYXJlZF9wdHI8VFByb3RvY29sPihwZmFjdF8tPmdldFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgb3Byb3QgPSBzaGFyZWRfcHRyPFRQcm90b2NvbD4ocGZhY3RfLT5nZXRQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIEZhaWxlZCB0byBpbml0aWFsaXplIHRyYW5zcG9ydHMvcHJvdG9jb2xzIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjdHhNYXBfW2Nvbm5lY3Rpb24uZ2V0KCldCisgICAgICAgID0gc2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4obmV3IENvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24sIHRyYW5zcG9ydCwgaXByb3QsIG9wcm90KSk7CisKKyAgICBjb25uZWN0KGNvbm5lY3Rpb24uZ2V0KCksIFNJR05BTChyZWFkeVJlYWQoKSksIFNMT1QoYmVnaW5EZWNvZGUoKSkpOworCisgICAgY29ubmVjdChjb25uZWN0aW9uLmdldCgpLCBTSUdOQUwoZGlzY29ubmVjdGVkKCkpLCBTTE9UKHNvY2tldENsb3NlZCgpKSk7CisgIH0KK30KKwordm9pZCBUUVRjcFNlcnZlcjo6YmVnaW5EZWNvZGUoKSB7CisgIFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24ocW9iamVjdF9jYXN0PFFUY3BTb2NrZXQqPihzZW5kZXIoKSkpOworICBRX0FTU0VSVChjb25uZWN0aW9uKTsKKworICBpZiAoY3R4TWFwXy5maW5kKGNvbm5lY3Rpb24pID09IGN0eE1hcF8uZW5kKCkpIHsKKyAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBHb3QgZGF0YSBvbiBhbiB1bmtub3duIFFUY3BTb2NrZXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHggPSBjdHhNYXBfW2Nvbm5lY3Rpb25dOworCisgIHRyeSB7CisgICAgcHJvY2Vzc29yXworICAgICAgICAtPnByb2Nlc3MoYmluZCgmVFFUY3BTZXJ2ZXI6OmZpbmlzaCwgdGhpcywgY3R4LCBfMSksCisgICAgICAgICAgICAgICAgICBjdHgtPmlwcm90XywKKyAgICAgICAgICAgICAgICAgIGN0eC0+b3Byb3RfKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKKyAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBUVHJhbnNwb3J0RXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nOiAnJXMnIiwgZXgud2hhdCgpKTsKKyAgICBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24pOworICB9IGNhdGNoICguLi4pIHsKKyAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBVbmtub3duIHByb2Nlc3NvciBleGNlcHRpb24iKTsKKyAgICBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24pOworICB9Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXI6OnNvY2tldENsb3NlZCgpIHsKKyAgUVRjcFNvY2tldCogY29ubmVjdGlvbihxb2JqZWN0X2Nhc3Q8UVRjcFNvY2tldCo+KHNlbmRlcigpKSk7CisgIFFfQVNTRVJUKGNvbm5lY3Rpb24pOworICBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24pOworfQorCit2b2lkIFRRVGNwU2VydmVyOjpkZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKSB7CisgIGNvbnN0IENvbm5lY3Rpb25Db250ZXh0TWFwOjpzaXplX3R5cGUgZGVsZXRlZCA9IGN0eE1hcF8uZXJhc2UoY29ubmVjdGlvbik7CisgIGlmICgwID09IGRlbGV0ZWQpIHsKKyAgICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFVua25vd24gUVRjcFNvY2tldCIpOworICB9Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXI6OnNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoUVRjcFNvY2tldCogY29ubmVjdGlvbikgeworICBRTWV0YU9iamVjdDo6aW52b2tlTWV0aG9kKHRoaXMsICJkZWxldGVDb25uZWN0aW9uQ29udGV4dCIsIFF0OjpRdWV1ZWRDb25uZWN0aW9uLCBRX0FSRyhRVGNwU29ja2V0KiwgY29ubmVjdGlvbikpOworfQorCit2b2lkIFRRVGNwU2VydmVyOjpmaW5pc2goc2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gY3R4LCBib29sIGhlYWx0aHkpIHsKKyAgaWYgKCFoZWFsdGh5KSB7CisgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gUHJvY2Vzc29yIGZhaWxlZCB0byBwcm9jZXNzIGRhdGEgc3VjY2Vzc2Z1bGx5Iik7CisgICAgZGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY3R4LT5jb25uZWN0aW9uXy5nZXQoKSk7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlM2ZlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UQVNZTkNfUVRDUF9TRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9UQVNZTkNfUVRDUF9TRVJWRVJfSF8KKworI2luY2x1ZGUgPFFPYmplY3Q+CisjaW5jbHVkZSA8UVRjcFNlcnZlcj4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CitjbGFzcyBUUHJvdG9jb2xGYWN0b3J5OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRBc3luY1Byb2Nlc3NvcjsKKworLyoqCisgKiAgU2VydmVyIHRoYXQgdXNlcyBRdCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zLgorICogIFNpbXBseSBnaXZlIGl0IGEgUVRjcFNlcnZlciB0aGF0IGlzIGxpc3RlbmluZywgYWxvbmcgd2l0aCBhbiBhc3luYworICogIHByb2Nlc3NvciBhbmQgYSBwcm90b2NvbCBmYWN0b3J5LCBhbmQgdGhlbiBydW4gdGhlIFF0IGV2ZW50IGxvb3AuCisgKi8KK2NsYXNzIFRRVGNwU2VydmVyIDogcHVibGljIFFPYmplY3QgeworICBRX09CSkVDVAorcHVibGljOgorICBUUVRjcFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgUU9iamVjdCogcGFyZW50ID0gTlVMTCk7CisgIHZpcnR1YWwgflRRVGNwU2VydmVyKCk7CisKK3ByaXZhdGUgUV9TTE9UUzoKKyAgdm9pZCBwcm9jZXNzSW5jb21pbmcoKTsKKyAgdm9pZCBiZWdpbkRlY29kZSgpOworICB2b2lkIHNvY2tldENsb3NlZCgpOworICB2b2lkIGRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pOworCitwcml2YXRlOgorICBRX0RJU0FCTEVfQ09QWShUUVRjcFNlcnZlcikKKworICBzdHJ1Y3QgQ29ubmVjdGlvbkNvbnRleHQ7CisKKyAgdm9pZCBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pOworICB2b2lkIGZpbmlzaChzdGQ6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCwgYm9vbCBoZWFsdGh5KTsKKworICBzdGQ6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3RfOworCisgIHR5cGVkZWYgc3RkOjptYXA8UVRjcFNvY2tldCosIHN0ZDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gPiBDb25uZWN0aW9uQ29udGV4dE1hcDsKKyAgQ29ubmVjdGlvbkNvbnRleHRNYXAgY3R4TWFwXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ19RVENQX1NFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkYWE3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworVENvbm5lY3RlZENsaWVudDo6VENvbm5lY3RlZENsaWVudChjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sPiYgaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2w+JiBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiYgZXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBjbGllbnQpCisKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCisgICAgaW5wdXRQcm90b2NvbF8oaW5wdXRQcm90b2NvbCksCisgICAgb3V0cHV0UHJvdG9jb2xfKG91dHB1dFByb3RvY29sKSwKKyAgICBldmVudEhhbmRsZXJfKGV2ZW50SGFuZGxlciksCisgICAgY2xpZW50XyhjbGllbnQpLAorICAgIG9wYXF1ZUNvbnRleHRfKDApIHsKK30KKworVENvbm5lY3RlZENsaWVudDo6flRDb25uZWN0ZWRDbGllbnQoKSB7Cit9CisKK3ZvaWQgVENvbm5lY3RlZENsaWVudDo6cnVuKCkgeworICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgIG9wYXF1ZUNvbnRleHRfID0gZXZlbnRIYW5kbGVyXy0+Y3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgfQorCisgIGZvciAoYm9vbCBkb25lID0gZmFsc2U7ICFkb25lOykgeworICAgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgICBldmVudEhhbmRsZXJfLT5wcm9jZXNzQ29udGV4dChvcGFxdWVDb250ZXh0XywgY2xpZW50Xyk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGlmICghcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCBvcGFxdWVDb250ZXh0XykpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICBzd2l0Y2ggKHR0eC5nZXRUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRToKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRDoKKyAgICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQ6CisgICAgICAgICAgLy8gQ2xpZW50IGRpc2Nvbm5lY3RlZCBvciB3YXMgaW50ZXJydXB0ZWQgb3IgZGlkIG5vdCByZXNwb25kIHdpdGhpbiB0aGUgcmVjZWl2ZSB0aW1lb3V0LgorICAgICAgICAgIC8vIE5vIGxvZ2dpbmcgbmVlZGVkLiAgRG9uZS4KKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgLy8gQWxsIG90aGVyIHRyYW5zcG9ydCBleGNlcHRpb25zIGFyZSBsb2dnZWQuCisgICAgICAgICAgLy8gU3RhdGUgb2YgY29ubmVjdGlvbiBpcyB1bmtub3duLiAgRG9uZS4KKyAgICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYgdGV4KSB7CisgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IHByb2Nlc3NpbmcgZXhjZXB0aW9uOiAiKSArIHRleC53aGF0KCk7CisgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgLy8gRGlzY29ubmVjdCBmcm9tIGNsaWVudCwgYmVjYXVzZSB3ZSBjb3VsZCBub3QgcHJvY2VzcyB0aGUgbWVzc2FnZS4KKyAgICAgIGRvbmUgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGNsZWFudXAoKTsKK30KKwordm9pZCBUQ29ubmVjdGVkQ2xpZW50OjpjbGVhbnVwKCkgeworICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgIGV2ZW50SGFuZGxlcl8tPmRlbGV0ZUNvbnRleHQob3BhcXVlQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICB9CisKKyAgdHJ5IHsKKyAgICBpbnB1dFByb3RvY29sXy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgaW5wdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgfQorCisgIHRyeSB7CisgICAgb3V0cHV0UHJvdG9jb2xfLT5nZXRUcmFuc3BvcnQoKS0+Y2xvc2UoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBvdXRwdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgfQorCisgIHRyeSB7CisgICAgY2xpZW50Xy0+Y2xvc2UoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBjbGllbnQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTcwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVENPTk5FQ1RFRENMSUVOVF9IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworLyoqCisgKiBUaGlzIHJlcHJlc2VudHMgYSBjbGllbnQgY29ubmVjdGVkIHRvIGEgVFNlcnZlci4gIFRoZQorICogcHJvY2Vzc2luZyBsb29wIGZvciBhIGNsaWVudCBtdXN0IHByb3ZpZGUgc29tZSByZXF1aXJlZAorICogZnVuY3Rpb25hbGl0eSBjb21tb24gdG8gYWxsIGltcGxlbWVudGF0aW9ucyBzbyBpdCBpcworICogZW5jYXBzdWxhdGVkIGhlcmUuCisgKi8KKworY2xhc3MgVENvbm5lY3RlZENsaWVudCA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW1baW5dIHByb2Nlc3NvciAgICAgIHRoZSBUUHJvY2Vzc29yCisgICAqIEBwYXJhbVtpbl0gaW5wdXRQcm90b2NvbCAgdGhlIGlucHV0IFRQcm90b2NvbAorICAgKiBAcGFyYW1baW5dIG91dHB1dFByb3RvY29sIHRoZSBvdXRwdXQgVFByb3RvY29sCisgICAqIEBwYXJhbVtpbl0gZXZlbnRIYW5kbGVyICAgdGhlIHNlcnZlciBldmVudCBoYW5kbGVyCisgICAqIEBwYXJhbVtpbl0gY2xpZW50ICAgICAgICAgdGhlIFRUcmFuc3BvcnQgcmVwcmVzZW50aW5nIHRoZSBjbGllbnQKKyAgICovCisgIFRDb25uZWN0ZWRDbGllbnQoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+JiBpbnB1dFByb3RvY29sLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiYgb3V0cHV0UHJvdG9jb2wsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4mIGV2ZW50SGFuZGxlciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiYgY2xpZW50KTsKKworICAvKioKKyAgICogRGVzdHJ1Y3Rvci4KKyAgICovCisgIHZpcnR1YWwgflRDb25uZWN0ZWRDbGllbnQoKTsKKworICAvKioKKyAgICogRHJpdmUgdGhlIGNsaWVudCB1bnRpbCBpdCBpcyBkb25lLgorICAgKiBUaGUgY2xpZW50IHByb2Nlc3NpbmcgbG9vcCBpczoKKyAgICoKKyAgICogW29wdGlvbmFsXSBjYWxsIGV2ZW50SGFuZGxlci0+Y3JlYXRlQ29udGV4dCBvbmNlCisgICAqIFtvcHRpb25hbF0gY2FsbCBldmVudEhhbmRsZXItPnByb2Nlc3NDb250ZXh0IHBlciByZXF1ZXN0CisgICAqICAgICAgICAgICAgY2FsbCBwcm9jZXNzb3ItPnByb2Nlc3MgcGVyIHJlcXVlc3QKKyAgICogICAgICAgICAgICAgIGhhbmRsZSBleHBlY3RlZCB0cmFuc3BvcnQgZXhjZXB0aW9uczoKKyAgICogICAgICAgICAgICAgICAgRU5EX09GX0ZJTEUgbWVhbnMgdGhlIGNsaWVudCBpcyBnb25lCisgICAqICAgICAgICAgICAgICAgIElOVEVSUlVQVEVEIG1lYW5zIHRoZSBjbGllbnQgd2FzIGludGVycnVwdGVkCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQ6OmludGVycnVwdENoaWxkcmVuKCkKKyAgICogICAgICAgICAgICAgIGhhbmRsZSB1bmV4cGVjdGVkIHRyYW5zcG9ydCBleGNlcHRpb25zIGJ5IGxvZ2dpbmcKKyAgICogICAgICAgICAgICAgIGhhbmRsZSBzdGFuZGFyZCBleGNlcHRpb25zIGJ5IGxvZ2dpbmcKKyAgICogICAgICAgICAgICAgIGhhbmRsZSB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgYnkgbG9nZ2luZworICAgKiAgICAgICAgICAgIGNsZWFudXAoKQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJ1bigpIC8qIG92ZXJyaWRlICovOworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBDbGVhbnVwIGFmdGVyIGEgY2xpZW50LiAgVGhpcyBoYXBwZW5zIGlmIHRoZSBjbGllbnQgZGlzY29ubmVjdHMsCisgICAqIG9yIGlmIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZCwgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICoKKyAgICogVGhlIGNsZWFudXAgcHJvY2Vzc2luZyBpczoKKyAgICogW29wdGlvbmFsXSBjYWxsIGV2ZW50SGFuZGxlci0+ZGVsZXRlQ29udGV4dCBvbmNlCisgICAqICAgICAgICAgICAgY2xvc2UgdGhlIGlucHV0UHJvdG9jb2wncyBUVHJhbnNwb3J0CisgICAqICAgICAgICAgICAgY2xvc2UgdGhlIG91dHB1dFByb3RvY29sJ3MgVFRyYW5zcG9ydAorICAgKiAgICAgICAgICAgIGNsb3NlIHRoZSBjbGllbnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbGVhbnVwKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gY2xpZW50XzsKKworICAvKioKKyAgICogQ29udGV4dCBhY3F1aXJlZCBmcm9tIHRoZSBldmVudEhhbmRsZXJfIGlmIG9uZSBleGlzdHMuCisgICAqLworICB2b2lkKiBvcGFxdWVDb250ZXh0XzsKK307Cit9Cit9Cit9CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZmY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTUyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpZmRlZiBIQVZFX1BPTExfSAorI2luY2x1ZGUgPHBvbGwuaD4KKyNlbGlmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZWxpZiBIQVZFX1NZU19TRUxFQ1RfSAorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpZmRlZiBIQVZFX1NDSEVEX0gKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgQUZfTE9DQUwKKyNkZWZpbmUgQUZfTE9DQUwgQUZfVU5JWAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKKy8vLyBUaHJlZSBzdGF0ZXMgZm9yIHNvY2tldHM6IHJlY3YgZnJhbWUgc2l6ZSwgcmVjdiBkYXRhLCBhbmQgc2VuZCBtb2RlCitlbnVtIFRTb2NrZXRTdGF0ZSB7IFNPQ0tFVF9SRUNWX0ZSQU1JTkcsIFNPQ0tFVF9SRUNWLCBTT0NLRVRfU0VORCB9OworCisvKioKKyAqIEZpdmUgc3RhdGVzIGZvciB0aGUgbm9uYmxvY2tpbmcgc2VydmVyOgorICogIDEpIGluaXRpYWxpemUKKyAqICAyKSByZWFkIDQgYnl0ZSBmcmFtZSBzaXplCisgKiAgMykgcmVhZCBmcmFtZSBvZiBkYXRhCisgKiAgNCkgc2VuZCBiYWNrIGRhdGEgKGlmIGFueSkKKyAqICA1KSBmb3JjZSBpbW1lZGlhdGUgY29ubmVjdGlvbiBjbG9zZQorICovCitlbnVtIFRBcHBTdGF0ZSB7CisgIEFQUF9JTklULAorICBBUFBfUkVBRF9GUkFNRV9TSVpFLAorICBBUFBfUkVBRF9SRVFVRVNULAorICBBUFBfV0FJVF9UQVNLLAorICBBUFBfU0VORF9SRVNVTFQsCisgIEFQUF9DTE9TRV9DT05ORUNUSU9OCit9OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjb25uZWN0aW9uIHRoYXQgaXMgaGFuZGxlZCB2aWEgbGliZXZlbnQuIFRoaXMgY29ubmVjdGlvbgorICogZXNzZW50aWFsbHkgZW5jYXBzdWxhdGVzIGEgc29ja2V0IHRoYXQgaGFzIHNvbWUgYXNzb2NpYXRlZCBsaWJldmVudCBzdGF0ZS4KKyAqLworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiB7Citwcml2YXRlOgorICAvLy8gU2VydmVyIElPIFRocmVhZCBoYW5kbGluZyB0aGlzIGNvbm5lY3Rpb24KKyAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkXzsKKworICAvLy8gU2VydmVyIGhhbmRsZQorICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIHNlcnZlcl87CisKKyAgLy8vIFRQcm9jZXNzb3IKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisKKyAgLy8vIE9iamVjdCB3cmFwcGluZyBuZXR3b3JrIHNvY2tldAorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gdFNvY2tldF87CisKKyAgLy8vIExpYmV2ZW50IG9iamVjdAorICBzdHJ1Y3QgZXZlbnQgZXZlbnRfOworCisgIC8vLyBMaWJldmVudCBmbGFncworICBzaG9ydCBldmVudEZsYWdzXzsKKworICAvLy8gU29ja2V0IG1vZGUKKyAgVFNvY2tldFN0YXRlIHNvY2tldFN0YXRlXzsKKworICAvLy8gQXBwbGljYXRpb24gc3RhdGUKKyAgVEFwcFN0YXRlIGFwcFN0YXRlXzsKKworICAvLy8gSG93IG11Y2ggZGF0YSBuZWVkZWQgdG8gcmVhZAorICB1aW50MzJfdCByZWFkV2FudF87CisKKyAgLy8vIFdoZXJlIGluIHRoZSByZWFkIGJ1ZmZlciBhcmUgd2UKKyAgdWludDMyX3QgcmVhZEJ1ZmZlclBvc187CisKKyAgLy8vIFJlYWQgYnVmZmVyCisgIHVpbnQ4X3QqIHJlYWRCdWZmZXJfOworCisgIC8vLyBSZWFkIGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IHJlYWRCdWZmZXJTaXplXzsKKworICAvLy8gV3JpdGUgYnVmZmVyCisgIHVpbnQ4X3QqIHdyaXRlQnVmZmVyXzsKKworICAvLy8gV3JpdGUgYnVmZmVyIHNpemUKKyAgdWludDMyX3Qgd3JpdGVCdWZmZXJTaXplXzsKKworICAvLy8gSG93IGZhciB0aHJvdWdoIHdyaXRpbmcgYXJlIHdlPworICB1aW50MzJfdCB3cml0ZUJ1ZmZlclBvc187CisKKyAgLy8vIExhcmdlc3Qgc2l6ZSBvZiB3cml0ZSBidWZmZXIgc2VlbiBzaW5jZSBidWZmZXIgd2FzIGNvbnN0cnVjdGVkCisgIHNpemVfdCBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXzsKKworICAvLy8gQ291bnQgb2YgdGhlIG51bWJlciBvZiBjYWxscyBmb3IgdXNlIHdpdGggZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkuCisgIGludDMyX3QgY2FsbHNGb3JSZXNpemVfOworCisgIC8vLyBUcmFuc3BvcnQgdG8gcmVhZCBmcm9tCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBpbnB1dFRyYW5zcG9ydF87CisKKyAgLy8vIFRyYW5zcG9ydCB0aGF0IHByb2Nlc3NvciB3cml0ZXMgdG8KKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG91dHB1dFRyYW5zcG9ydF87CisKKyAgLy8vIGV4dHJhIHRyYW5zcG9ydCBnZW5lcmF0ZWQgYnkgdHJhbnNwb3J0IGZhY3RvcnkgKGUuZy4gQnVmZmVyZWRSb3V0ZXJUcmFuc3BvcnQpCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87CisKKyAgLy8vIFByb3RvY29sIGRlY29kZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87CisKKyAgLy8vIFByb3RvY29sIGVuY29kZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOworCisgIC8vLyBTZXJ2ZXIgZXZlbnQgaGFuZGxlciwgaWYgYW55CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworCisgIC8vLyBUaHJpZnQgY2FsbCBjb250ZXh0LCBpZiBhbnkKKyAgdm9pZCogY29ubmVjdGlvbkNvbnRleHRfOworCisgIC8vLyBHbyBpbnRvIHJlYWQgbW9kZQorICB2b2lkIHNldFJlYWQoKSB7IHNldEZsYWdzKEVWX1JFQUQgfCBFVl9QRVJTSVNUKTsgfQorCisgIC8vLyBHbyBpbnRvIHdyaXRlIG1vZGUKKyAgdm9pZCBzZXRXcml0ZSgpIHsgc2V0RmxhZ3MoRVZfV1JJVEUgfCBFVl9QRVJTSVNUKTsgfQorCisgIC8vLyBTZXQgc29ja2V0IGlkbGUKKyAgdm9pZCBzZXRJZGxlKCkgeyBzZXRGbGFncygwKTsgfQorCisgIC8qKgorICAgKiBTZXQgZXZlbnQgZmxhZ3MgZm9yIHRoaXMgY29ubmVjdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIGV2ZW50RmxhZ3MgZmxhZ3Mgd2UgcGFzcyB0byBsaWJldmVudCBmb3IgdGhlIGNvbm5lY3Rpb24uCisgICAqLworICB2b2lkIHNldEZsYWdzKHNob3J0IGV2ZW50RmxhZ3MpOworCisgIC8qKgorICAgKiBMaWJldmVudCBoYW5kbGVyIGNhbGxlZCAodmlhIG91ciBzdGF0aWMgd3JhcHBlcikgd2hlbiB0aGUgY29ubmVjdGlvbgorICAgKiBzb2NrZXQgaGFkIHNvbWV0aGluZyBoYXBwZW4uICBSYXRoZXIgdGhhbiB1c2UgdGhlIGZsYWdzIGxpYmV2ZW50IHBhc3NlZCwKKyAgICogd2UgdXNlIHRoZSBjb25uZWN0aW9uIHN0YXRlIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gcmVhZCBvcgorICAgKiB3cml0ZSB0aGUgc29ja2V0LgorICAgKi8KKyAgdm9pZCB3b3JrU29ja2V0KCk7CisKK3B1YmxpYzoKKyAgY2xhc3MgVGFzazsKKworICAvLy8gQ29uc3RydWN0b3IKKyAgVENvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCwKKyAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CisgICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOworICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CisKKyAgICBpb1RocmVhZF8gPSBpb1RocmVhZDsKKyAgICBzZXJ2ZXJfID0gaW9UaHJlYWQtPmdldFNlcnZlcigpOworCisgICAgLy8gQWxsb2NhdGUgaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzIHRoZXNlIG9ubHkgbmVlZCB0byBiZSBhbGxvY2F0ZWQKKyAgICAvLyBvbmNlIHBlciBUQ29ubmVjdGlvbiAodGhleSBkb24ndCBuZWVkIHRvIGJlIHJlYWxsb2NhdGVkIG9uIGluaXQoKSBjYWxsKQorICAgIGlucHV0VHJhbnNwb3J0Xy5yZXNldChuZXcgVE1lbW9yeUJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclNpemVfKSk7CisgICAgb3V0cHV0VHJhbnNwb3J0Xy5yZXNldCgKKyAgICAgICAgbmV3IFRNZW1vcnlCdWZmZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcnZlcl8tPmdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSkpKTsKKworICAgIHRTb2NrZXRfID0gIHNvY2tldDsKKworICAgIGluaXQoaW9UaHJlYWQpOworICB9CisKKyAgflRDb25uZWN0aW9uKCkgeyBzdGQ6OmZyZWUocmVhZEJ1ZmZlcl8pOyB9CisKKyAgLy8vIENsb3NlIHRoaXMgY29ubmVjdGlvbiBhbmQgZnJlZSBvciByZXNldCBpdHMgcmVzb3VyY2VzLgorICB2b2lkIGNsb3NlKCk7CisKKyAgLyoqCisgICAgKiBDaGVjayBidWZmZXJzIGFnYWluc3QgYW55IHNpemUgbGltaXRzIGFuZCBzaHJpbmsgaXQgaWYgZXhjZWVkZWQuCisgICAgKgorICAgICogQHBhcmFtIHJlYWRMaW1pdCB3ZSByZWR1Y2UgcmVhZCBidWZmZXIgc2l6ZSB0byB0aGlzIChpZiBub256ZXJvKS4KKyAgICAqIEBwYXJhbSB3cml0ZUxpbWl0IGlmIG5vbnplcm8gYW5kIHdyaXRlIGJ1ZmZlciBpcyBsYXJnZXIsIHJlcGxhY2UgaXQuCisgICAgKi8KKyAgdm9pZCBjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCk7CisKKyAgLy8vIEluaXRpYWxpemUKKyAgdm9pZCBpbml0KFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCk7CisKKyAgLy8vIHNldCBzb2NrZXQgZm9yIGNvbm5lY3Rpb24KKyAgdm9pZCBzZXRTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCk7CisKKyAgLyoqCisgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHRyYW5zaXRpb25zIGZyb20gb25lIHN0YXRlIGludG8KKyAgICogYW5vdGhlci4gVGhpcyBtZWFucyB0aGF0IGl0IGhhcyBmaW5pc2hlZCB3cml0aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkCisgICAqIHRvLCBvciBmaW5pc2hlZCByZWNlaXZpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQgdG8uCisgICAqLworICB2b2lkIHRyYW5zaXRpb24oKTsKKworICAvKioKKyAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBjb25uZWN0aW9uIGV2ZW50cy4gIFByb3ZpZGVzIGEgY2FsbGJhY2sKKyAgICogdGhhdCBsaWJldmVudCBjYW4gdW5kZXJzdGFuZCB3aGljaCBpbnZva2VzIGNvbm5lY3Rpb25fLT53b3JrU29ja2V0KCkuCisgICAqCisgICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJyZWQgb24uCisgICAqIEBwYXJhbSB3aGljaCB0aGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KKyAgICogQHBhcmFtIHYgdm9pZCogY2FsbGJhY2sgYXJnIHdoZXJlIHdlIHBsYWNlZCBUQ29ubmVjdGlvbidzICJ0aGlzIi4KKyAgICovCisgIHN0YXRpYyB2b2lkIGV2ZW50SGFuZGxlcihldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IC8qIHdoaWNoICovLCB2b2lkKiB2KSB7CisgICAgYXNzZXJ0KGZkID09IHN0YXRpY19jYXN0PGV2dXRpbF9zb2NrZXRfdD4oKChUQ29ubmVjdGlvbiopdiktPmdldFRTb2NrZXQoKS0+Z2V0U29ja2V0RkQoKSkpOworICAgICgoVENvbm5lY3Rpb24qKXYpLT53b3JrU29ja2V0KCk7CisgIH0KKworICAvKioKKyAgICogTm90aWZpY2F0aW9uIHRvIHNlcnZlciB0aGF0IHByb2Nlc3NpbmcgaGFzIGVuZGVkIG9uIHRoaXMgcmVxdWVzdC4KKyAgICogQ2FuIGJlIGNhbGxlZCBlaXRoZXIgd2hlbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlZCBvciB3aGVuIGEgd2FpdGluZworICAgKiB0YXNrIGhhcyBiZWVuIHByZWVtcHRpdmVseSB0ZXJtaW5hdGVkIChvbiBvdmVybG9hZCkuCisgICAqCisgICAqIERvbid0IGNhbGwgdGhpcyBmcm9tIHRoZSBJTyB0aHJlYWQgaXRzZWxmLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdW5hYmxlIHRvIG5vdGlmeSAoY2hlY2sgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpLgorICAgKi8KKyAgYm9vbCBub3RpZnlJT1RocmVhZCgpIHsgcmV0dXJuIGlvVGhyZWFkXy0+bm90aWZ5KHRoaXMpOyB9CisKKyAgLyoKKyAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoaXMgY29ubmVjdGlvbidzIGN1cnJlbnRseSBhc3NpZ25lZCBJTworICAgKiB0aHJlYWQuCisgICAqLworICBpbnQgZ2V0SU9UaHJlYWROdW1iZXIoKSBjb25zdCB7IHJldHVybiBpb1RocmVhZF8tPmdldFRocmVhZE51bWJlcigpOyB9CisKKyAgLy8vIEZvcmNlIGNvbm5lY3Rpb24gc2h1dGRvd24gZm9yIHRoaXMgY29ubmVjdGlvbi4KKyAgdm9pZCBmb3JjZUNsb3NlKCkgeworICAgIGFwcFN0YXRlXyA9IEFQUF9DTE9TRV9DT05ORUNUSU9OOworICAgIGlmICghbm90aWZ5SU9UaHJlYWQoKSkgeworICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oIlRDb25uZWN0aW9uOjpmb3JjZUNsb3NlOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKKyAgICB9CisgIH0KKworICAvLy8gcmV0dXJuIHRoZSBzZXJ2ZXIgdGhpcyBjb25uZWN0aW9uIHdhcyBpbml0aWFsaXplZCBmb3IuCisgIFROb25ibG9ja2luZ1NlcnZlciogZ2V0U2VydmVyKCkgY29uc3QgeyByZXR1cm4gc2VydmVyXzsgfQorCisgIC8vLyBnZXQgc3RhdGUgb2YgY29ubmVjdGlvbi4KKyAgVEFwcFN0YXRlIGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gYXBwU3RhdGVfOyB9CisKKyAgLy8vIHJldHVybiB0aGUgVFNvY2tldCB0cmFuc3BvcnQgd3JhcHBpbmcgdGhpcyBuZXR3b3JrIGNvbm5lY3Rpb24KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGdldFRTb2NrZXQoKSBjb25zdCB7IHJldHVybiB0U29ja2V0XzsgfQorCisgIC8vLyByZXR1cm4gdGhlIHNlcnZlciBldmVudCBoYW5kbGVyIGlmIGFueQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsgfQorCisgIC8vLyByZXR1cm4gdGhlIFRocmlmdCBjb25uZWN0aW9uIGNvbnRleHQgaWYgYW55CisgIHZvaWQqIGdldENvbm5lY3Rpb25Db250ZXh0KCkgeyByZXR1cm4gY29ubmVjdGlvbkNvbnRleHRfOyB9Cit9OworCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgVGFzayhzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKKyAgICAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbikKKyAgICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICAgIGlucHV0XyhpbnB1dCksCisgICAgICBvdXRwdXRfKG91dHB1dCksCisgICAgICBjb25uZWN0aW9uXyhjb25uZWN0aW9uKSwKKyAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8oY29ubmVjdGlvbl8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpKSwKKyAgICAgIGNvbm5lY3Rpb25Db250ZXh0Xyhjb25uZWN0aW9uXy0+Z2V0Q29ubmVjdGlvbkNvbnRleHQoKSkge30KKworICB2b2lkIHJ1bigpIHsKKyAgICB0cnkgeworICAgICAgZm9yICg7OykgeworICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgeworICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8tPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0XywgY29ubmVjdGlvbl8tPmdldFRTb2NrZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XywgY29ubmVjdGlvbkNvbnRleHRfKQorICAgICAgICAgICAgfHwgIWlucHV0Xy0+Z2V0VHJhbnNwb3J0KCktPnBlZWsoKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNsaWVudCBkaWVkOiAlcyIsIHR0eC53aGF0KCkpOworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2FsbG9jJikgeworICAgICAgR2xvYmFsT3V0cHV0KCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNhdWdodCBiYWRfYWxsb2MgZXhjZXB0aW9uLiIpOworICAgICAgZXhpdCgxKTsKKyAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgeCkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBwcm9jZXNzKCkgZXhjZXB0aW9uOiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlaWQoeCkubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4LndoYXQoKSk7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IHVua25vd24gZXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcuIik7CisgICAgfQorCisgICAgLy8gU2lnbmFsIGNvbXBsZXRpb24gYmFjayB0byB0aGUgbGliZXZlbnQgdGhyZWFkIHZpYSBhIHBpcGUKKyAgICBpZiAoIWNvbm5lY3Rpb25fLT5ub3RpZnlJT1RocmVhZCgpKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGZhaWxlZCB0byBub3RpZnlJT1RocmVhZCwgY2xvc2luZy4iKTsKKyAgICAgIGNvbm5lY3Rpb25fLT5zZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICBjb25uZWN0aW9uXy0+Y2xvc2UoKTsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6VGFzazo6cnVuOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKKyAgICB9CisgIH0KKworICBUQ29ubmVjdGlvbiogZ2V0VENvbm5lY3Rpb24oKSB7IHJldHVybiBjb25uZWN0aW9uXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOworICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dF87Cit9OworCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmluaXQoVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CisgIGlvVGhyZWFkXyA9IGlvVGhyZWFkOworICBzZXJ2ZXJfID0gaW9UaHJlYWQtPmdldFNlcnZlcigpOworICBhcHBTdGF0ZV8gPSBBUFBfSU5JVDsKKyAgZXZlbnRGbGFnc18gPSAwOworCisgIHJlYWRCdWZmZXJQb3NfID0gMDsKKyAgcmVhZFdhbnRfID0gMDsKKworICB3cml0ZUJ1ZmZlcl8gPSBOVUxMOworICB3cml0ZUJ1ZmZlclNpemVfID0gMDsKKyAgd3JpdGVCdWZmZXJQb3NfID0gMDsKKyAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSAwOworCisgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9SRUNWX0ZSQU1JTkc7CisgIGNhbGxzRm9yUmVzaXplXyA9IDA7CisKKyAgLy8gZ2V0IGlucHV0L3RyYW5zcG9ydHMKKyAgZmFjdG9yeUlucHV0VHJhbnNwb3J0XyA9IHNlcnZlcl8tPmdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQoaW5wdXRUcmFuc3BvcnRfKTsKKyAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8gPSBzZXJ2ZXJfLT5nZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCktPmdldFRyYW5zcG9ydChvdXRwdXRUcmFuc3BvcnRfKTsKKworICAvLyBDcmVhdGUgcHJvdG9jb2wKKyAgaWYgKHNlcnZlcl8tPmdldEhlYWRlclRyYW5zcG9ydCgpKSB7CisgICAgaW5wdXRQcm90b2NvbF8gPSBzZXJ2ZXJfLT5nZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworICAgIG91dHB1dFByb3RvY29sXyA9IGlucHV0UHJvdG9jb2xfOworICB9IGVsc2UgeworICAgIGlucHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CisgICAgb3V0cHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKyAgfQorCisgIC8vIFNldCB1cCBmb3IgYW55IHNlcnZlciBldmVudCBoYW5kbGVyCisgIHNlcnZlckV2ZW50SGFuZGxlcl8gPSBzZXJ2ZXJfLT5nZXRFdmVudEhhbmRsZXIoKTsKKyAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8pIHsKKyAgICBjb25uZWN0aW9uQ29udGV4dF8gPSBzZXJ2ZXJFdmVudEhhbmRsZXJfLT5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICB9IGVsc2UgeworICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9IE5VTEw7CisgIH0KKworICAvLyBHZXQgdGhlIHByb2Nlc3NvcgorICBwcm9jZXNzb3JfID0gc2VydmVyXy0+Z2V0UHJvY2Vzc29yKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHRTb2NrZXRfKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpzZXRTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCkgeworICB0U29ja2V0XyA9IHNvY2tldDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCkgeworICBpbnQgZ290ID0gMCwgbGVmdCA9IDAsIHNlbnQgPSAwOworICB1aW50MzJfdCBmZXRjaCA9IDA7CisKKyAgc3dpdGNoIChzb2NrZXRTdGF0ZV8pIHsKKyAgY2FzZSBTT0NLRVRfUkVDVl9GUkFNSU5HOgorICAgIHVuaW9uIHsKKyAgICAgIHVpbnQ4X3QgYnVmW3NpemVvZih1aW50MzJfdCldOworICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB9IGZyYW1pbmc7CisKKyAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHJlY2VpdmVkIHNvbWUgYnl0ZXMgd2Uga2VwdCB0aGVtIGhlcmUKKyAgICBmcmFtaW5nLnNpemUgPSByZWFkV2FudF87CisgICAgLy8gZGV0ZXJtaW5lIHNpemUgb2YgdGhpcyBmcmFtZQorICAgIHRyeSB7CisgICAgICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAorICAgICAgZmV0Y2ggPSB0U29ja2V0Xy0+cmVhZCgmZnJhbWluZy5idWZbcmVhZEJ1ZmZlclBvc19dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdChzaXplb2YoZnJhbWluZy5zaXplKSAtIHJlYWRCdWZmZXJQb3NfKSk7CisgICAgICBpZiAoZmV0Y2ggPT0gMCkgeworICAgICAgICAvLyBXaGVuZXZlciB3ZSBnZXQgaGVyZSBpdCBtZWFucyBhIHJlbW90ZSBkaXNjb25uZWN0CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGZldGNoOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgICAvL0luIE5vbmJsb2NraW5nIFNTTFNvY2tldCBzb21lIG9wZXJhdGlvbnMgbmVlZCB0byBiZSByZXRyaWVkIGFnYWluLgorICAgICAgLy9DdXJyZW50IGFwcHJvYWNoIGlzIHBhcnNpbmcgZXhjZXB0aW9uIG1lc3NhZ2UsIGJ1dCBhIGJldHRlciBzb2x1dGlvbiBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQuCisgICAgICBpZighc3Ryc3RyKHRlLndoYXQoKSwgInJldHJ5IikpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOworICAgICAgICBjbG9zZSgpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVhZEJ1ZmZlclBvc18gPCBzaXplb2YoZnJhbWluZy5zaXplKSkgeworICAgICAgLy8gbW9yZSBuZWVkZWQgYmVmb3JlIGZyYW1lIHNpemUgaXMga25vd24gLS0gc2F2ZSB3aGF0IHdlIGhhdmUgc28gZmFyCisgICAgICByZWFkV2FudF8gPSBmcmFtaW5nLnNpemU7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVhZFdhbnRfID0gbnRvaGwoZnJhbWluZy5zaXplKTsKKyAgICBpZiAocmVhZFdhbnRfID4gc2VydmVyXy0+Z2V0TWF4RnJhbWVTaXplKCkpIHsKKyAgICAgIC8vIERvbid0IGFsbG93IGdpYW50IGZyYW1lIHNpemVzLiAgVGhpcyBwcmV2ZW50cyBiYWQgY2xpZW50cyBmcm9tCisgICAgICAvLyBjYXVzaW5nIHVzIHRvIHRyeSBhbmQgYWxsb2NhdGUgYSBnaWFudCBidWZmZXIuCisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGZyYW1lIHNpemUgdG9vIGxhcmdlICIKKyAgICAgICAgICAiKCUiIFBSSXUzMiAiID4gJSIgUFJJdTY0CisgICAgICAgICAgIikgZnJvbSBjbGllbnQgJXMuICIKKyAgICAgICAgICAiUmVtb3RlIHNpZGUgbm90IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQ/IiwKKyAgICAgICAgICByZWFkV2FudF8sCisgICAgICAgICAgKHVpbnQ2NF90KXNlcnZlcl8tPmdldE1heEZyYW1lU2l6ZSgpLAorICAgICAgICAgIHRTb2NrZXRfLT5nZXRTb2NrZXRJbmZvKCkuY19zdHIoKSk7CisgICAgICBjbG9zZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBzaXplIGtub3duOyBub3cgZ2V0IHRoZSByZXN0IG9mIHRoZSBmcmFtZQorICAgIHRyYW5zaXRpb24oKTsKKworICAgIC8vIElmIHRoZSBzb2NrZXQgaGFzIG1vcmUgZGF0YSB0aGFuIHRoZSBmcmFtZSBoZWFkZXIsIGNvbnRpbnVlIHRvIHdvcmsgb24gaXQuIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBmb3IKKyAgICAvLyByZWd1bGFyIHNvY2tldHMsIGJlY2F1c2UgaWYgdGhlcmUgaXMgbW9yZSBkYXRhLCBsaWJldmVudCB3aWxsIGZpcmUgdGhlIGV2ZW50IGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgcmVhZAorICAgIC8vIHJlYWRpbmVzcywgd2hpY2ggd2lsbCBpbiB0dXJuIGNhbGwgd29ya1NvY2tldCgpLiBIb3dldmVyLCBzb21lIHNvY2tldCB0eXBlcyAoc3VjaCBhcyBUU1NMU29ja2V0KSBtYXkgaGF2ZSB0aGUKKyAgICAvLyBkYXRhIHNpdHRpbmcgaW4gdGhlaXIgaW50ZXJuYWwgYnVmZmVycyBhbmQgZnJvbSBsaWJldmVudCdzIHBlcnNwZWN0aXZlLCB0aGVyZSBpcyBubyBmdXJ0aGVyIGRhdGEgYXZhaWxhYmxlLiBJbgorICAgIC8vIHRoYXQgY2FzZSwgbm90IGhhdmluZyB0aGlzIHdvcmtTb2NrZXQoKSBjYWxsIGhlcmUgd291bGQgcmVzdWx0IGluIGEgaGFuZyBhcyB3ZSB3aWxsIG5ldmVyIGdldCB0byB3b3JrIHRoZSBzb2NrZXQsCisgICAgLy8gZGVzcGl0ZSBoYXZpbmcgbW9yZSBkYXRhLgorICAgIGlmICh0U29ja2V0Xy0+aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSkKKyAgICB7CisgICAgICAgIHdvcmtTb2NrZXQoKTsKKyAgICB9CisKKyAgICByZXR1cm47CisKKyAgY2FzZSBTT0NLRVRfUkVDVjoKKyAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBiZSBpbiB0aGlzIHN0YXRlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGRhdGEKKyAgICBhc3NlcnQocmVhZEJ1ZmZlclBvc18gPCByZWFkV2FudF8pOworCisgICAgdHJ5IHsKKyAgICAgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0CisgICAgICBmZXRjaCA9IHJlYWRXYW50XyAtIHJlYWRCdWZmZXJQb3NfOworICAgICAgZ290ID0gdFNvY2tldF8tPnJlYWQocmVhZEJ1ZmZlcl8gKyByZWFkQnVmZmVyUG9zXywgZmV0Y2gpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgICAvL0luIE5vbmJsb2NraW5nIFNTTFNvY2tldCBzb21lIG9wZXJhdGlvbnMgbmVlZCB0byBiZSByZXRyaWVkIGFnYWluLgorICAgICAgLy9DdXJyZW50IGFwcHJvYWNoIGlzIHBhcnNpbmcgZXhjZXB0aW9uIG1lc3NhZ2UsIGJ1dCBhIGJldHRlciBzb2x1dGlvbiBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQuCisgICAgICBpZighc3Ryc3RyKHRlLndoYXQoKSwgInJldHJ5IikpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOworICAgICAgICBjbG9zZSgpOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgIC8vIE1vdmUgYWxvbmcgaW4gdGhlIGJ1ZmZlcgorICAgICAgcmVhZEJ1ZmZlclBvc18gKz0gZ290OworCisgICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZCBub3Qgb3ZlcmRvIGl0CisgICAgICBhc3NlcnQocmVhZEJ1ZmZlclBvc18gPD0gcmVhZFdhbnRfKTsKKworICAgICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZywgbW92ZSBvbnRvIHRoZSBuZXh0IHN0YXRlCisgICAgICBpZiAocmVhZEJ1ZmZlclBvc18gPT0gcmVhZFdhbnRfKSB7CisgICAgICAgIHRyYW5zaXRpb24oKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXaGVuZXZlciB3ZSBnZXQgZG93biBoZXJlIGl0IG1lYW5zIGEgcmVtb3RlIGRpc2Nvbm5lY3QKKyAgICBjbG9zZSgpOworCisgICAgcmV0dXJuOworCisgIGNhc2UgU09DS0VUX1NFTkQ6CisgICAgLy8gU2hvdWxkIG5ldmVyIGhhdmUgcG9zaXRpb24gcGFzdCBzaXplCisgICAgYXNzZXJ0KHdyaXRlQnVmZmVyUG9zXyA8PSB3cml0ZUJ1ZmZlclNpemVfKTsKKworICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2VuZCwgdGhlbiBsZXQgdXMgbW92ZSBvbgorICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJTaXplXykgeworICAgICAgR2xvYmFsT3V0cHV0KCJXQVJOSU5HOiBTZW5kIHN0YXRlIHdpdGggbm8gZGF0YSB0byBzZW5kIik7CisgICAgICB0cmFuc2l0aW9uKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGxlZnQgPSB3cml0ZUJ1ZmZlclNpemVfIC0gd3JpdGVCdWZmZXJQb3NfOworICAgICAgc2VudCA9IHRTb2NrZXRfLT53cml0ZV9wYXJ0aWFsKHdyaXRlQnVmZmVyXyArIHdyaXRlQnVmZmVyUG9zXywgbGVmdCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzICIsIHRlLndoYXQoKSk7CisgICAgICBjbG9zZSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdyaXRlQnVmZmVyUG9zXyArPSBzZW50OworCisgICAgLy8gRGlkIHdlIG92ZXJkbyBpdD8KKyAgICBhc3NlcnQod3JpdGVCdWZmZXJQb3NfIDw9IHdyaXRlQnVmZmVyU2l6ZV8pOworCisgICAgLy8gV2UgYXJlIGRvbmUhCisgICAgaWYgKHdyaXRlQnVmZmVyUG9zXyA9PSB3cml0ZUJ1ZmZlclNpemVfKSB7CisgICAgICB0cmFuc2l0aW9uKCk7CisgICAgfQorCisgICAgcmV0dXJuOworCisgIGRlZmF1bHQ6CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVW5leHBlY3RlZCBTb2NrZXQgU3RhdGUgJWQiLCBzb2NrZXRTdGF0ZV8pOworICAgIGFzc2VydCgwKTsKKyAgfQorfQorCitib29sIFROb25ibG9ja2luZ1NlcnZlcjo6Z2V0SGVhZGVyVHJhbnNwb3J0KCkgeworICAvLyBDdXJyZW50bHkgaWYgdGhlcmUgaXMgbm8gb3V0cHV0IHByb3RvY29sIGZhY3RvcnksCisgIC8vIHdlIGFzc3VtZSBoZWFkZXIgdHJhbnNwb3J0ICh3aXRob3V0IGhhdmluZyB0byBjcmVhdGUKKyAgLy8gYSBuZXcgdHJhbnNwb3J0IGFuZCBjaGVjaykKKyAgcmV0dXJuIGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpID09IE5VTEw7Cit9CisKKy8qKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gdHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgaW50bworICogYW5vdGhlci4gVGhpcyBtZWFucyB0aGF0IGl0IGhhcyBmaW5pc2hlZCB3cml0aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkCisgKiB0bywgb3IgZmluaXNoZWQgcmVjZWl2aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkIHRvLgorICovCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OnRyYW5zaXRpb24oKSB7CisgIC8vIGVuc3VyZSB0aGlzIGNvbm5lY3Rpb24gaXMgYWN0aXZlIHJpZ2h0IG5vdworICBhc3NlcnQoaW9UaHJlYWRfKTsKKyAgYXNzZXJ0KHNlcnZlcl8pOworCisgIC8vIFN3aXRjaCB1cG9uIHRoZSBzdGF0ZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gYW5kIG1vdmUgdG8gYSBuZXcgc3RhdGUKKyAgc3dpdGNoIChhcHBTdGF0ZV8pIHsKKworICBjYXNlIEFQUF9SRUFEX1JFUVVFU1Q6CisgICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZyB0aGUgcmVxdWVzdCwgcGFja2FnZSB0aGUgcmVhZCBidWZmZXIgaW50byB0cmFuc3BvcnQKKyAgICAvLyBhbmQgZ2V0IGJhY2sgc29tZSBkYXRhIGZyb20gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uCisgICAgaWYgKHNlcnZlcl8tPmdldEhlYWRlclRyYW5zcG9ydCgpKSB7CisgICAgICBpbnB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyUG9zXyk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcigpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBzYXZlZCByb29tIGZvciB0aGUgZnJhbWluZyBzaXplIGluIGNhc2UgaGVhZGVyIHRyYW5zcG9ydCBuZWVkZWQgaXQsCisgICAgICAvLyBidXQganVzdCBza2lwIGl0IGZvciB0aGUgbm9uLWhlYWRlciBjYXNlCisgICAgICBpbnB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHJlYWRCdWZmZXJfICsgNCwgcmVhZEJ1ZmZlclBvc18gLSA0KTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKCk7CisKKyAgICAgIC8vIFByZXBlbmQgZm91ciBieXRlcyBvZiBibGFuayBzcGFjZSB0byB0aGUgYnVmZmVyIHNvIHdlIGNhbgorICAgICAgLy8gd3JpdGUgdGhlIGZyYW1lIHNpemUgdGhlcmUgbGF0ZXIuCisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT5nZXRXcml0ZVB0cig0KTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydF8tPndyb3RlQnl0ZXMoNCk7CisgICAgfQorCisgICAgc2VydmVyXy0+aW5jcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworCisgICAgaWYgKHNlcnZlcl8tPmlzVGhyZWFkUG9vbFByb2Nlc3NpbmcoKSkgeworICAgICAgLy8gV2UgYXJlIHNldHRpbmcgdXAgYSBUYXNrIHRvIGRvIHRoaXMgd29yayBhbmQgd2Ugd2lsbCB3YWl0IG9uIGl0CisKKyAgICAgIC8vIENyZWF0ZSB0YXNrIGFuZCBkaXNwYXRjaCB0byB0aGUgdGhyZWFkIG1hbmFnZXIKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9IHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oCisgICAgICAgICAgbmV3IFRhc2socHJvY2Vzc29yXywgaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgdGhpcykpOworICAgICAgLy8gVGhlIGFwcGxpY2F0aW9uIGlzIG5vdyB3YWl0aW5nIG9uIHRoZSB0YXNrIHRvIGZpbmlzaAorICAgICAgYXBwU3RhdGVfID0gQVBQX1dBSVRfVEFTSzsKKworICAgICAgLy8gU2V0IHRoaXMgY29ubmVjdGlvbiBpZGxlIHNvIHRoYXQgbGliZXZlbnQgZG9lc24ndCBwcm9jZXNzIG1vcmUKKyAgICAgIC8vIGRhdGEgb24gaXQgd2hpbGUgd2UncmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHRocmVhZG1hbmFnZXIgdG8KKyAgICAgIC8vIGZpbmlzaCB0aGlzIHRhc2sKKyAgICAgIHNldElkbGUoKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgc2VydmVyXy0+YWRkVGFzayh0YXNrKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiYgaXNlKSB7CisgICAgICAgIC8vIFRoZSBUaHJlYWRNYW5hZ2VyIGlzIG5vdCByZWFkeSB0byBoYW5kbGUgYW55IG1vcmUgdGFza3MgKGl0J3MgcHJvYmFibHkgc2h1dHRpbmcgZG93bikuCisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCBpc2Uud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgICBjbG9zZSgpOworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mIHRvKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gVGltZWRPdXRFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgdG8ud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgICBjbG9zZSgpOworICAgICAgfQorCisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CisgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+cHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHRfLCBnZXRUU29ja2V0KCkpOworICAgICAgICB9CisgICAgICAgIC8vIEludm9rZSB0aGUgcHJvY2Vzc29yCisgICAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgY29ubmVjdGlvbkNvbnRleHRfKTsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlciB0cmFuc3BvcnQgZXJyb3IgaW4gIgorICAgICAgICAgICAgInByb2Nlc3MoKTogJXMiLAorICAgICAgICAgICAgdHR4LndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIHgpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiU2VydmVyOjpwcm9jZXNzKCkgdW5jYXVnaHQgZXhjZXB0aW9uOiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVpZCh4KS5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC53aGF0KCkpOworICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJTZXJ2ZXI6OnByb2Nlc3MoKSB1bmtub3duIGV4Y2VwdGlvbiIpOworICAgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gZmFsbHRocm91Z2gKKworICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlLCB0aGUgY2FsbCB0byBwcm9jZXNzIGhhcyB3cml0dGVuIGludG8KKyAgLy8gdGhlIHdyaXRlQnVmZmVyXworCisgIGNhc2UgQVBQX1dBSVRfVEFTSzoKKyAgICAvLyBXZSBoYXZlIG5vdyBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgdGFzayBhbmQgdGhlIHJlc3VsdCBoYXMgYmVlbiB3cml0dGVuCisgICAgLy8gaW50byB0aGUgb3V0cHV0VHJhbnNwb3J0Xywgc28gd2UgZ3JhYiBpdHMgY29udGVudHMgYW5kIHBsYWNlIHRoZW0gaW50bworICAgIC8vIHRoZSB3cml0ZUJ1ZmZlcl8gZm9yIGFjdHVhbCB3cml0aW5nIGJ5IHRoZSBsaWJldmVudCB0aHJlYWQKKworICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCisgICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0QnVmZmVyKCZ3cml0ZUJ1ZmZlcl8sICZ3cml0ZUJ1ZmZlclNpemVfKTsKKworICAgIC8vIElmIHRoZSBmdW5jdGlvbiBjYWxsIGdlbmVyYXRlZCByZXR1cm4gZGF0YSwgdGhlbiBtb3ZlIGludG8gdGhlIHNlbmQKKyAgICAvLyBzdGF0ZSBhbmQgZ2V0IGdvaW5nCisgICAgLy8gNCBieXRlcyB3ZXJlIHJlc2VydmVkIGZvciBmcmFtZSBzaXplCisgICAgaWYgKHdyaXRlQnVmZmVyU2l6ZV8gPiA0KSB7CisKKyAgICAgIC8vIE1vdmUgaW50byB3cml0ZSBzdGF0ZQorICAgICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKKyAgICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9TRU5EOworCisgICAgICAvLyBQdXQgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgd3JpdGUgYnVmZmVyCisgICAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IChpbnQzMl90KWh0b25sKHdyaXRlQnVmZmVyU2l6ZV8gLSA0KTsKKyAgICAgIG1lbWNweSh3cml0ZUJ1ZmZlcl8sICZmcmFtZVNpemUsIDQpOworCisgICAgICAvLyBTb2NrZXQgaW50byB3cml0ZSBtb2RlCisgICAgICBhcHBTdGF0ZV8gPSBBUFBfU0VORF9SRVNVTFQ7CisgICAgICBzZXRXcml0ZSgpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgcmVxdWVzdCB3YXMgb25ld2F5IGFuZCB3ZSBzaG91bGQgZmFsbCB0aHJvdWdoCisgICAgLy8gcmlnaHQgYmFjayBpbnRvIHRoZSByZWFkIGZyYW1lIGhlYWRlciBzdGF0ZQorICAgIGdvdG8gTEFCRUxfQVBQX0lOSVQ7CisKKyAgY2FzZSBBUFBfU0VORF9SRVNVTFQ6CisgICAgLy8gaXQncyBub3cgc2FmZSB0byBwZXJmb3JtIGJ1ZmZlciBzaXplIGhvdXNla2VlcGluZy4KKyAgICBpZiAod3JpdGVCdWZmZXJTaXplXyA+IGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfKSB7CisgICAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IHdyaXRlQnVmZmVyU2l6ZV87CisgICAgfQorICAgIGlmIChzZXJ2ZXJfLT5nZXRSZXNpemVCdWZmZXJFdmVyeU4oKSA+IDAKKyAgICAgICAgJiYgKytjYWxsc0ZvclJlc2l6ZV8gPj0gc2VydmVyXy0+Z2V0UmVzaXplQnVmZmVyRXZlcnlOKCkpIHsKKyAgICAgIGNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KHNlcnZlcl8tPmdldElkbGVSZWFkQnVmZmVyTGltaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl8tPmdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkpOworICAgICAgY2FsbHNGb3JSZXNpemVfID0gMDsKKyAgICB9CisgICAgLy8gZmFsbHRocm91Z2gKKworICAvLyBOLkIuOiBXZSBhbHNvIGludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIGhlcmUgaW50byB0aGUgSU5JVCBzdGF0ZSEKKworICBMQUJFTF9BUFBfSU5JVDoKKyAgY2FzZSBBUFBfSU5JVDoKKworICAgIC8vIENsZWFyIHdyaXRlIGJ1ZmZlciB2YXJpYWJsZXMKKyAgICB3cml0ZUJ1ZmZlcl8gPSBOVUxMOworICAgIHdyaXRlQnVmZmVyUG9zXyA9IDA7CisgICAgd3JpdGVCdWZmZXJTaXplXyA9IDA7CisKKyAgICAvLyBJbnRvIHJlYWQ0IHN0YXRlIHdlIGdvCisgICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1ZfRlJBTUlORzsKKyAgICBhcHBTdGF0ZV8gPSBBUFBfUkVBRF9GUkFNRV9TSVpFOworCisgICAgcmVhZEJ1ZmZlclBvc18gPSAwOworCisgICAgLy8gUmVnaXN0ZXIgcmVhZCBldmVudAorICAgIHNldFJlYWQoKTsKKworICAgIHJldHVybjsKKworICBjYXNlIEFQUF9SRUFEX0ZSQU1FX1NJWkU6CisgICAgcmVhZFdhbnRfICs9IDQ7CisKKyAgICAvLyBXZSBqdXN0IHJlYWQgdGhlIHJlcXVlc3QgbGVuZ3RoCisgICAgLy8gRG91YmxlIHRoZSBidWZmZXIgc2l6ZSB1bnRpbCBpdCBpcyBiaWcgZW5vdWdoCisgICAgaWYgKHJlYWRXYW50XyA+IHJlYWRCdWZmZXJTaXplXykgeworICAgICAgaWYgKHJlYWRCdWZmZXJTaXplXyA9PSAwKSB7CisgICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IDE7CisgICAgICB9CisgICAgICB1aW50MzJfdCBuZXdTaXplID0gcmVhZEJ1ZmZlclNpemVfOworICAgICAgd2hpbGUgKHJlYWRXYW50XyA+IG5ld1NpemUpIHsKKyAgICAgICAgbmV3U2l6ZSAqPSAyOworICAgICAgfQorCisgICAgICB1aW50OF90KiBuZXdCdWZmZXIgPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJlYWRCdWZmZXJfLCBuZXdTaXplKTsKKyAgICAgIGlmIChuZXdCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBub3RoaW5nIGVsc2UgdG8gYmUgZG9uZS4uLgorICAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgICAgfQorICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXdCdWZmZXI7CisgICAgICByZWFkQnVmZmVyU2l6ZV8gPSBuZXdTaXplOworICAgIH0KKworICAgIHJlYWRCdWZmZXJQb3NfID0gNDsKKyAgICAqKCh1aW50MzJfdCopcmVhZEJ1ZmZlcl8pID0gaHRvbmwocmVhZFdhbnRfIC0gNCk7CisKKyAgICAvLyBNb3ZlIGludG8gcmVhZCByZXF1ZXN0IHN0YXRlCisgICAgc29ja2V0U3RhdGVfID0gU09DS0VUX1JFQ1Y7CisgICAgYXBwU3RhdGVfID0gQVBQX1JFQURfUkVRVUVTVDsKKworICAgIHJldHVybjsKKworICBjYXNlIEFQUF9DTE9TRV9DT05ORUNUSU9OOgorICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICBjbG9zZSgpOworICAgIHJldHVybjsKKworICBkZWZhdWx0OgorICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlVuZXhwZWN0ZWQgQXBwbGljYXRpb24gU3RhdGUgJWQiLCBhcHBTdGF0ZV8pOworICAgIGFzc2VydCgwKTsKKyAgfQorfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OnNldEZsYWdzKHNob3J0IGV2ZW50RmxhZ3MpIHsKKyAgLy8gQ2F0Y2ggdGhlIGRvIG5vdGhpbmcgY2FzZQorICBpZiAoZXZlbnRGbGFnc18gPT0gZXZlbnRGbGFncykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIERlbGV0ZSBhIHByZXZpb3VzbHkgZXhpc3RpbmcgZXZlbnQKKyAgaWYgKGV2ZW50RmxhZ3NfICYmIGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjpzZXRGbGFncygpIGV2ZW50X2RlbCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBVcGRhdGUgaW4gbWVtb3J5IHN0cnVjdHVyZQorICBldmVudEZsYWdzXyA9IGV2ZW50RmxhZ3M7CisKKyAgLy8gRG8gbm90IGNhbGwgZXZlbnRfc2V0IGlmIHRoZXJlIGFyZSBubyBmbGFncworICBpZiAoIWV2ZW50RmxhZ3NfKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLyoKKyAgICogZXZlbnRfc2V0OgorICAgKgorICAgKiBQcmVwYXJlcyB0aGUgZXZlbnQgc3RydWN0dXJlICZldmVudCB0byBiZSB1c2VkIGluIGZ1dHVyZSBjYWxscyB0bworICAgKiBldmVudF9hZGQoKSBhbmQgZXZlbnRfZGVsKCkuICBUaGUgZXZlbnQgd2lsbCBiZSBwcmVwYXJlZCB0byBjYWxsIHRoZQorICAgKiBldmVudEhhbmRsZXIgdXNpbmcgdGhlICdzb2NrJyBmaWxlIGRlc2NyaXB0b3IgdG8gbW9uaXRvciBldmVudHMuCisgICAqCisgICAqIFRoZSBldmVudHMgY2FuIGJlIGVpdGhlciBFVl9SRUFELCBFVl9XUklURSwgb3IgYm90aCwgaW5kaWNhdGluZworICAgKiB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiByZWFkIG9yIHdyaXRlIGZyb20gdGhlIGZpbGUgcmVzcGVjdGl2ZWx5IHdpdGhvdXQKKyAgICogYmxvY2tpbmcuCisgICAqCisgICAqIFRoZSBldmVudEhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRoYXQgdHJpZ2dlcmVkCisgICAqIHRoZSBldmVudCBhbmQgdGhlIHR5cGUgb2YgZXZlbnQgd2hpY2ggd2lsbCBiZSBvbmUgb2Y6IEVWX1RJTUVPVVQsCisgICAqIEVWX1NJR05BTCwgRVZfUkVBRCwgRVZfV1JJVEUuCisgICAqCisgICAqIFRoZSBhZGRpdGlvbmFsIGZsYWcgRVZfUEVSU0lTVCBtYWtlcyBhbiBldmVudF9hZGQoKSBwZXJzaXN0ZW50IHVudGlsCisgICAqIGV2ZW50X2RlbCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICoKKyAgICogT25jZSBpbml0aWFsaXplZCwgdGhlICZldmVudCBzdHJ1Y3QgY2FuIGJlIHVzZWQgcmVwZWF0ZWRseSB3aXRoCisgICAqIGV2ZW50X2FkZCgpIGFuZCBldmVudF9kZWwoKSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSByZWluaXRpYWxpemVkIHVubGVzcworICAgKiB0aGUgZXZlbnRIYW5kbGVyIGFuZC9vciB0aGUgYXJndW1lbnQgdG8gaXQgYXJlIHRvIGJlIGNoYW5nZWQuICBIb3dldmVyLAorICAgKiB3aGVuIGFuIGV2IHN0cnVjdHVyZSBoYXMgYmVlbiBhZGRlZCB0byBsaWJldmVudCB1c2luZyBldmVudF9hZGQoKSB0aGUKKyAgICogc3RydWN0dXJlIG11c3QgcGVyc2lzdCB1bnRpbCB0aGUgZXZlbnQgb2NjdXJzIChhc3N1bWluZyBFVl9QRVJTSVNUCisgICAqIGlzIG5vdCBzZXQpIG9yIGlzIHJlbW92ZWQgdXNpbmcgZXZlbnRfZGVsKCkuICBZb3UgbWF5IG5vdCByZXVzZSB0aGUgc2FtZQorICAgKiBldiBzdHJ1Y3R1cmUgZm9yIG11bHRpcGxlIG1vbml0b3JlZCBkZXNjcmlwdG9yczsgZWFjaCBkZXNjcmlwdG9yIG5lZWRzCisgICAqIGl0cyBvd24gZXYuCisgICAqLworICBldmVudF9zZXQoJmV2ZW50XywgdFNvY2tldF8tPmdldFNvY2tldEZEKCksIGV2ZW50RmxhZ3NfLCBUQ29ubmVjdGlvbjo6ZXZlbnRIYW5kbGVyLCB0aGlzKTsKKyAgZXZlbnRfYmFzZV9zZXQoaW9UaHJlYWRfLT5nZXRFdmVudEJhc2UoKSwgJmV2ZW50Xyk7CisKKyAgLy8gQWRkIHRoZSBldmVudAorICBpZiAoZXZlbnRfYWRkKCZldmVudF8sIDApID09IC0xKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OnNldEZsYWdzKCk6IGNvdWxkIG5vdCBldmVudF9hZGQiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgIH0KK30KKworLyoqCisgKiBDbG9zZXMgYSBjb25uZWN0aW9uCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6Y2xvc2UoKSB7CisgIHNldElkbGUoKTsKKworICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgeworICAgIHNlcnZlckV2ZW50SGFuZGxlcl8tPmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHRfLCBpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgfQorICBpb1RocmVhZF8gPSBOVUxMOworCisgIC8vIENsb3NlIHRoZSBzb2NrZXQKKyAgdFNvY2tldF8tPmNsb3NlKCk7CisKKyAgLy8gY2xvc2UgYW55IGZhY3RvcnkgcHJvZHVjZWQgdHJhbnNwb3J0cworICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfLT5jbG9zZSgpOworICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKworICAvLyByZWxlYXNlIHByb2Nlc3NvciBhbmQgaGFuZGxlcgorICBwcm9jZXNzb3JfLnJlc2V0KCk7CisKKyAgLy8gR2l2ZSB0aGlzIG9iamVjdCBiYWNrIHRvIHRoZSBzZXJ2ZXIgdGhhdCBvd25zIGl0CisgIHNlcnZlcl8tPnJldHVybkNvbm5lY3Rpb24odGhpcyk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6Y2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IHJlYWRMaW1pdCwgc2l6ZV90IHdyaXRlTGltaXQpIHsKKyAgaWYgKHJlYWRMaW1pdCA+IDAgJiYgcmVhZEJ1ZmZlclNpemVfID4gcmVhZExpbWl0KSB7CisgICAgZnJlZShyZWFkQnVmZmVyXyk7CisgICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOworICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CisgIH0KKworICBpZiAod3JpdGVMaW1pdCA+IDAgJiYgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPiB3cml0ZUxpbWl0KSB7CisgICAgLy8ganVzdCBzdGFydCBvdmVyCisgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcnZlcl8tPmdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSkpOworICAgIGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfID0gMDsKKyAgfQorfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXI6On5UTm9uYmxvY2tpbmdTZXJ2ZXIoKSB7CisgIC8vIENsb3NlIGFueSBhY3RpdmUgY29ubmVjdGlvbnMgKG1vdmVzIHRoZW0gdG8gdGhlIGlkbGUgY29ubmVjdGlvbiBzdGFjaykKKyAgd2hpbGUgKGFjdGl2ZUNvbm5lY3Rpb25zXy5zaXplKCkpIHsKKyAgICBhY3RpdmVDb25uZWN0aW9uc18uZnJvbnQoKS0+Y2xvc2UoKTsKKyAgfQorICAvLyBDbGVhbiB1cCB1bnVzZWQgVENvbm5lY3Rpb24gb2JqZWN0cyBpbiBjb25uZWN0aW9uU3RhY2tfCisgIHdoaWxlICghY29ubmVjdGlvblN0YWNrXy5lbXB0eSgpKSB7CisgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uU3RhY2tfLnRvcCgpOworICAgIGNvbm5lY3Rpb25TdGFja18ucG9wKCk7CisgICAgZGVsZXRlIGNvbm5lY3Rpb247CisgIH0KKyAgLy8gVGhlIFROb25ibG9ja2luZ0lPVGhyZWFkIG9iamVjdHMgaGF2ZSBzaGFyZWRfcHRycyB0byB0aGUgVGhyZWFkCisgIC8vIG9iamVjdHMgYW5kIHRoZSBUaHJlYWQgb2JqZWN0cyBoYXZlIHNoYXJlZF9wdHJzIHRvIHRoZSBUTm9uYmxvY2tpbmdJT1RocmVhZAorICAvLyBvYmplY3RzIChhcyBydW5uYWJsZSkgc28gdGhlc2Ugb2JqZWN0cyB3aWxsIG5ldmVyIGRlYWxsb2NhdGUgd2l0aG91dCBoZWxwLgorICB3aGlsZSAoIWlvVGhyZWFkc18uZW1wdHkoKSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gaW90ID0gaW9UaHJlYWRzXy5iYWNrKCk7CisgICAgaW9UaHJlYWRzXy5wb3BfYmFjaygpOworICAgIGlvdC0+c2V0VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+KCkpOworICB9Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGVpdGhlciBieSByZXVzaW5nIGFuIG9iamVjdCBvZmYgdGhlIHN0YWNrIG9yCisgKiBieSBhbGxvY2F0aW5nIGEgbmV3IG9uZSBlbnRpcmVseQorICovCitUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUNvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCkgeworICAvLyBDaGVjayB0aGUgc3RhY2sKKyAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKKworICAvLyBwaWNrIGFuIElPIHRocmVhZCB0byBoYW5kbGUgdGhpcyBjb25uZWN0aW9uIC0tIGN1cnJlbnRseSByb3VuZCByb2JpbgorICBhc3NlcnQobmV4dElPVGhyZWFkXyA8IGlvVGhyZWFkc18uc2l6ZSgpKTsKKyAgaW50IHNlbGVjdGVkVGhyZWFkSWR4ID0gbmV4dElPVGhyZWFkXzsKKyAgbmV4dElPVGhyZWFkXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigobmV4dElPVGhyZWFkXyArIDEpICUgaW9UaHJlYWRzXy5zaXplKCkpOworCisgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCA9IGlvVGhyZWFkc19bc2VsZWN0ZWRUaHJlYWRJZHhdLmdldCgpOworCisgIC8vIENoZWNrIHRoZSBjb25uZWN0aW9uIHN0YWNrIHRvIHNlZSBpZiB3ZSBjYW4gcmUtdXNlCisgIFRDb25uZWN0aW9uKiByZXN1bHQgPSBOVUxMOworICBpZiAoY29ubmVjdGlvblN0YWNrXy5lbXB0eSgpKSB7CisgICAgcmVzdWx0ID0gbmV3IFRDb25uZWN0aW9uKHNvY2tldCwgaW9UaHJlYWQpOworICAgICsrbnVtVENvbm5lY3Rpb25zXzsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBjb25uZWN0aW9uU3RhY2tfLnRvcCgpOworICAgIGNvbm5lY3Rpb25TdGFja18ucG9wKCk7CisgICAgcmVzdWx0LT5zZXRTb2NrZXQoc29ja2V0KTsKKyAgICByZXN1bHQtPmluaXQoaW9UaHJlYWQpOworICB9CisgIGFjdGl2ZUNvbm5lY3Rpb25zXy5wdXNoX2JhY2socmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byB0aGUgc3RhY2sKKyAqLwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnJldHVybkNvbm5lY3Rpb24oVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pIHsKKyAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKKworICBhY3RpdmVDb25uZWN0aW9uc18uZXJhc2Uoc3RkOjpyZW1vdmUoYWN0aXZlQ29ubmVjdGlvbnNfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvbm5lY3Rpb25zXy5lbmQoKSk7CisKKyAgaWYgKGNvbm5lY3Rpb25TdGFja0xpbWl0XyAmJiAoY29ubmVjdGlvblN0YWNrXy5zaXplKCkgPj0gY29ubmVjdGlvblN0YWNrTGltaXRfKSkgeworICAgIGRlbGV0ZSBjb25uZWN0aW9uOworICAgIC0tbnVtVENvbm5lY3Rpb25zXzsKKyAgfSBlbHNlIHsKKyAgICBjb25uZWN0aW9uLT5jaGVja0lkbGVCdWZmZXJNZW1MaW1pdChpZGxlUmVhZEJ1ZmZlckxpbWl0XywgaWRsZVdyaXRlQnVmZmVyTGltaXRfKTsKKyAgICBjb25uZWN0aW9uU3RhY2tfLnB1c2goY29ubmVjdGlvbik7CisgIH0KK30KKworLyoqCisgKiBTZXJ2ZXIgc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgV2UgYWNjZXB0IGFsbCB3YWl0aW5nIGNsaWVudAorICogY29ubmVjdGlvbnMgb24gZmQgYW5kIGFzc2lnbiBUQ29ubmVjdGlvbiBvYmplY3RzIHRvIGhhbmRsZSB0aG9zZSByZXF1ZXN0cy4KKyAqLwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmhhbmRsZUV2ZW50KFRIUklGVF9TT0NLRVQgZmQsIHNob3J0IHdoaWNoKSB7CisgICh2b2lkKXdoaWNoOworICAvLyBNYWtlIHN1cmUgdGhhdCBsaWJldmVudCBkaWRuJ3QgbWVzcyB1cCB0aGUgc29ja2V0IGhhbmRsZXMKKyAgYXNzZXJ0KGZkID09IHNlcnZlclNvY2tldF8pOworCisgIC8vIEdvaW5nIHRvIGFjY2VwdCBhIG5ldyBjbGllbnQgc29ja2V0CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjbGllbnRTb2NrZXQ7CisKKyAgY2xpZW50U29ja2V0ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7CisgIGlmIChjbGllbnRTb2NrZXQpIHsKKyAgICAvLyBJZiB3ZSdyZSBvdmVybG9hZGVkLCB0YWtlIGFjdGlvbiBoZXJlCisgICAgaWYgKG92ZXJsb2FkQWN0aW9uXyAhPSBUX09WRVJMT0FEX05PX0FDVElPTiAmJiBzZXJ2ZXJPdmVybG9hZGVkKCkpIHsKKyAgICAgIEd1YXJkIGcoY29ubk11dGV4Xyk7CisgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXysrOworICAgICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXysrOworICAgICAgaWYgKG92ZXJsb2FkQWN0aW9uXyA9PSBUX09WRVJMT0FEX0NMT1NFX09OX0FDQ0VQVCkgeworICAgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSkgeworICAgICAgICBpZiAoIWRyYWluUGVuZGluZ1Rhc2soKSkgeworICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBkaXNjYXJkLCBzbyB3ZSBkcm9wIGNvbm5lY3Rpb24gaW5zdGVhZC4KKyAgICAgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRDb25uZWN0aW9uIGZvciB0aGlzIGNsaWVudCBzb2NrZXQuCisgICAgVENvbm5lY3Rpb24qIGNsaWVudENvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKGNsaWVudFNvY2tldCk7CisKKyAgICAvLyBGYWlsIGZhc3QgaWYgd2UgY291bGQgbm90IGNyZWF0ZSBhIFRDb25uZWN0aW9uIG9iamVjdAorICAgIGlmIChjbGllbnRDb25uZWN0aW9uID09IE5VTEwpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogZmFpbGVkIFRDb25uZWN0aW9uIGZhY3RvcnkiKTsKKyAgICAgIGNsaWVudFNvY2tldC0+Y2xvc2UoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEVpdGhlciBub3RpZnkgdGhlIGlvVGhyZWFkIHRoYXQgaXMgYXNzaWduZWQgdGhpcyBjb25uZWN0aW9uIHRvCisgICAgICogc3RhcnQgcHJvY2Vzc2luZywgb3IgaWYgaXQgaXMgdXMsIHdlJ2xsIGp1c3QgYXNrIHRoaXMKKyAgICAgKiBjb25uZWN0aW9uIHRvIGRvIGl0cyBpbml0aWFsIHN0YXRlIGNoYW5nZSBoZXJlLgorICAgICAqCisgICAgICogKFdlIG5lZWQgdG8gYXZvaWQgd3JpdGluZyB0byBvdXIgb3duIG5vdGlmaWNhdGlvbiBwaXBlLCB0bworICAgICAqIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2NrcyBpZiB0aGUgcGlwZSBpcyBmdWxsLikKKyAgICAgKgorICAgICAqIFRoZSBJTyB0aHJlYWQgIzAgaXMgdGhlIG9ubHkgb25lIHRoYXQgaGFuZGxlcyB0aGVzZSBsaXN0ZW4KKyAgICAgKiBldmVudHMsIHNvIHVubGVzcyB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aHJlYWQgIzAKKyAgICAgKiB3ZSBrbm93IGl0J3Mgbm90IG9uIG91ciB0aHJlYWQuCisgICAgICovCisgICAgaWYgKGNsaWVudENvbm5lY3Rpb24tPmdldElPVGhyZWFkTnVtYmVyKCkgPT0gMCkgeworICAgICAgY2xpZW50Q29ubmVjdGlvbi0+dHJhbnNpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWNsaWVudENvbm5lY3Rpb24tPm5vdGlmeUlPVGhyZWFkKCkpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiW0VSUk9SXSBub3RpZnlJT1RocmVhZCBmYWlsZWQgb24gZnJlc2ggY29ubmVjdGlvbiwgY2xvc2luZyIsIGVycm5vKTsKKyAgICAgICAgY2xpZW50Q29ubmVjdGlvbi0+Y2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgKiBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVBbmRMaXN0ZW5PblNvY2tldCgpIHsKKyAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisgIHNlcnZlclNvY2tldF8gPSBzZXJ2ZXJUcmFuc3BvcnRfLT5nZXRTb2NrZXRGRCgpOworfQorCisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXRUaHJlYWRNYW5hZ2VyKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSB7CisgIHRocmVhZE1hbmFnZXJfID0gdGhyZWFkTWFuYWdlcjsKKyAgaWYgKHRocmVhZE1hbmFnZXIpIHsKKyAgICB0aHJlYWRNYW5hZ2VyLT5zZXRFeHBpcmVDYWxsYmFjaygKKyAgICAgICAgc3RkOjpiaW5kKCZUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSBmYWxzZTsKKyAgfQorfQorCitib29sIFROb25ibG9ja2luZ1NlcnZlcjo6c2VydmVyT3ZlcmxvYWRlZCgpIHsKKyAgc2l6ZV90IGFjdGl2ZUNvbm5lY3Rpb25zID0gbnVtVENvbm5lY3Rpb25zXyAtIGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpOworICBpZiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPiBtYXhBY3RpdmVQcm9jZXNzb3JzXyB8fCBhY3RpdmVDb25uZWN0aW9ucyA+IG1heENvbm5lY3Rpb25zXykgeworICAgIGlmICghb3ZlcmxvYWRlZF8pIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogb3ZlcmxvYWQgY29uZGl0aW9uIGJlZ3VuLiIpOworICAgICAgb3ZlcmxvYWRlZF8gPSB0cnVlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAob3ZlcmxvYWRlZF8gJiYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzXykKKyAgICAgICAgJiYgKGFjdGl2ZUNvbm5lY3Rpb25zIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhDb25uZWN0aW9uc18pKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6IG92ZXJsb2FkIGVuZGVkOyAiCisgICAgICAgICAgIiV1IGRyb3BwZWQgKCVsbHUgdG90YWwpIiwKKyAgICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXywKKyAgICAgICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKTsKKyAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfID0gMDsKKyAgICAgIG92ZXJsb2FkZWRfID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG92ZXJsb2FkZWRfOworfQorCitib29sIFROb25ibG9ja2luZ1NlcnZlcjo6ZHJhaW5QZW5kaW5nVGFzaygpIHsKKyAgaWYgKHRocmVhZE1hbmFnZXJfKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0gdGhyZWFkTWFuYWdlcl8tPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKHRhc2spIHsKKyAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKKyAgICAgIGFzc2VydChjb25uZWN0aW9uICYmIGNvbm5lY3Rpb24tPmdldFNlcnZlcigpICYmIGNvbm5lY3Rpb24tPmdldFN0YXRlKCkgPT0gQVBQX1dBSVRfVEFTSyk7CisgICAgICBjb25uZWN0aW9uLT5mb3JjZUNsb3NlKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2Uoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKKyAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKKyAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c3RvcCgpIHsKKyAgLy8gQnJlYWtzIHRoZSBldmVudCBsb29wIGluIGFsbCB0aHJlYWRzIHNvIHRoYXQgdGhleSBlbmQgQVNBUC4KKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGlvVGhyZWFkc18uc2l6ZSgpOyArK2kpIHsKKyAgICBpb1RocmVhZHNfW2ldLT5zdG9wKCk7CisgIH0KK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnJlZ2lzdGVyRXZlbnRzKGV2ZW50X2Jhc2UqIHVzZXJfZXZlbnRfYmFzZSkgeworICB1c2VyRXZlbnRCYXNlXyA9IHVzZXJfZXZlbnRfYmFzZTsKKworICAvLyBpbml0IGxpc3RlbiBzb2NrZXQKKyAgaWYgKHNlcnZlclNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKQorICAgIGNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCk7CisKKyAgLy8gc2V0IHVwIHRoZSBJTyB0aHJlYWRzCisgIGFzc2VydChpb1RocmVhZHNfLmVtcHR5KCkpOworICBpZiAoIW51bUlPVGhyZWFkc18pIHsKKyAgICBudW1JT1RocmVhZHNfID0gREVGQVVMVF9JT19USFJFQURTOworICB9CisgIC8vIFVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSBkb2Vzbid0IHdvcmtzIGZvciBtdWx0aS10aHJlYWRlZCBzZXJ2ZXJzCisgIGFzc2VydChudW1JT1RocmVhZHNfID09IDEgfHwgIXVzZXJFdmVudEJhc2VfKTsKKworICBmb3IgKHVpbnQzMl90IGlkID0gMDsgaWQgPCBudW1JT1RocmVhZHNfOyArK2lkKSB7CisgICAgLy8gdGhlIGZpcnN0IElPIHRocmVhZCBhbHNvIGRvZXMgdGhlIGxpc3RlbmluZyBvbiBzZXJ2ZXIgc29ja2V0CisgICAgVEhSSUZUX1NPQ0tFVCBsaXN0ZW5GZCA9IChpZCA9PSAwID8gc2VydmVyU29ja2V0XyA6IFRIUklGVF9JTlZBTElEX1NPQ0tFVCk7CisKKyAgICBzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiB0aHJlYWQoCisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdJT1RocmVhZCh0aGlzLCBpZCwgbGlzdGVuRmQsIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18pKTsKKyAgICBpb1RocmVhZHNfLnB1c2hfYmFjayh0aHJlYWQpOworICB9CisKKyAgLy8gTm90aWZ5IGhhbmRsZXIgb2YgdGhlIHByZVNlcnZlIGV2ZW50CisgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKKyAgfQorCisgIC8vIFN0YXJ0IGFsbCBvZiBvdXIgaGVscGVyIElPIHRocmVhZHMuIE5vdGUgdGhhdCB0aGUgdGhyZWFkcyBydW4gZm9yZXZlciwKKyAgLy8gb25seSB0ZXJtaW5hdGluZyBpZiBzdG9wKCkgaXMgY2FsbGVkLgorICBhc3NlcnQoaW9UaHJlYWRzXy5zaXplKCkgPT0gbnVtSU9UaHJlYWRzXyk7CisgIGFzc2VydChpb1RocmVhZHNfLnNpemUoKSA+IDApOworCisgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogU2VydmluZyB3aXRoICVkIGlvIHRocmVhZHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpb1RocmVhZHNfLnNpemUoKSk7CisKKyAgLy8gTGF1bmNoIGFsbCB0aGUgc2Vjb25kYXJ5IElPIHRocmVhZHMgaW4gc2VwYXJhdGUgdGhyZWFkcworICBpZiAoaW9UaHJlYWRzXy5zaXplKCkgPiAxKSB7CisgICAgaW9UaHJlYWRGYWN0b3J5Xy5yZXNldChuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KAorI2lmICFVU0VfU1REX1RIUkVBRAorICAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok9USEVSLCAgLy8gc2NoZWR1bGVyCisgICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLCAvLyBwcmlvcml0eQorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhY2sgc2l6ZSAoTUIpCisjZW5kaWYKKyAgICAgICAgZmFsc2UgLy8gZGV0YWNoZWQKKyAgICAgICAgKSk7CisKKyAgICBhc3NlcnQoaW9UaHJlYWRGYWN0b3J5Xy5nZXQoKSk7CisKKyAgICAvLyBpbnRlbnRpb25hbGx5IHN0YXJ0aW5nIGF0IHRocmVhZCAxLCBub3QgMAorICAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCBpb1RocmVhZHNfLnNpemUoKTsgKytpKSB7CisgICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gaW9UaHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKGlvVGhyZWFkc19baV0pOworICAgICAgaW9UaHJlYWRzX1tpXS0+c2V0VGhyZWFkKHRocmVhZCk7CisgICAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgfQorICB9CisKKyAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50cyBmb3IgdGhlIHByaW1hcnkgKGxpc3RlbmVyKSBJTyB0aHJlYWQKKyAgaW9UaHJlYWRzX1swXS0+cmVnaXN0ZXJFdmVudHMoKTsKK30KKworLyoqCisgKiBNYWluIHdvcmtob3JzZSBmdW5jdGlvbiwgc3RhcnRzIHVwIHRoZSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgcG9ydCBhbmQKKyAqIGxvb3BzIG92ZXIgdGhlIGxpYmV2ZW50IGhhbmRsZXIuCisgKi8KK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIHsKKworICBpZiAoaW9UaHJlYWRzXy5lbXB0eSgpKQorICAgIHJlZ2lzdGVyRXZlbnRzKE5VTEwpOworCisgIC8vIFJ1biB0aGUgcHJpbWFyeSAobGlzdGVuZXIpIElPIHRocmVhZCBsb29wIGluIG91ciBtYWluIHRocmVhZDsgdGhpcyB3aWxsCisgIC8vIG9ubHkgcmV0dXJuIHdoZW4gdGhlIHNlcnZlciBpcyBzaHV0dGluZyBkb3duLgorICBpb1RocmVhZHNfWzBdLT5ydW4oKTsKKworICAvLyBFbnN1cmUgYWxsIHRocmVhZHMgYXJlIGZpbmlzaGVkIGJlZm9yZSBleGl0aW5nIHNlcnZlKCkKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGlvVGhyZWFkc18uc2l6ZSgpOyArK2kpIHsKKyAgICBpb1RocmVhZHNfW2ldLT5qb2luKCk7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nOiBqb2luIGRvbmUgZm9yIElPIHRocmVhZCAjJWQiLCBpKTsKKyAgfQorfQorCitUTm9uYmxvY2tpbmdJT1RocmVhZDo6VE5vbmJsb2NraW5nSU9UaHJlYWQoVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU09DS0VUIGxpc3RlblNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUhpZ2hQcmlvcml0eSkKKyAgOiBzZXJ2ZXJfKHNlcnZlciksCisgICAgbnVtYmVyXyhudW1iZXIpLAorICAgIGxpc3RlblNvY2tldF8obGlzdGVuU29ja2V0KSwKKyAgICB1c2VIaWdoUHJpb3JpdHlfKHVzZUhpZ2hQcmlvcml0eSksCisgICAgZXZlbnRCYXNlXyhOVUxMKSwKKyAgICBvd25FdmVudEJhc2VfKGZhbHNlKSB7CisgIG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdID0gLTE7CisgIG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdID0gLTE7Cit9CisKK1ROb25ibG9ja2luZ0lPVGhyZWFkOjp+VE5vbmJsb2NraW5nSU9UaHJlYWQoKSB7CisgIC8vIG1ha2Ugc3VyZSBvdXIgYXNzb2NpYXRlZCB0aHJlYWQgaXMgZnVsbHkgZmluaXNoZWQKKyAgam9pbigpOworCisgIGlmIChldmVudEJhc2VfICYmIG93bkV2ZW50QmFzZV8pIHsKKyAgICBldmVudF9iYXNlX2ZyZWUoZXZlbnRCYXNlXyk7CisgICAgb3duRXZlbnRCYXNlXyA9IGZhbHNlOworICB9CisKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaWYgKDAgIT0gOjpUSFJJRlRfQ0xPU0VTT0NLRVQobGlzdGVuU29ja2V0XykpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkIGxpc3RlblNvY2tldF8gY2xvc2UoKTogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIH0KKyAgICBsaXN0ZW5Tb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBpZiAobm90aWZpY2F0aW9uUGlwZUZEc19baV0gPj0gMCkgeworICAgICAgaWYgKDAgIT0gOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19baV0pKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkIG5vdGlmaWNhdGlvblBpcGUgY2xvc2UoKTogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgICB9CisgICAgICBub3RpZmljYXRpb25QaXBlRkRzX1tpXSA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICB9CisgIH0KK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpIHsKKyAgaWYgKGV2dXRpbF9zb2NrZXRwYWlyKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgbm90aWZpY2F0aW9uUGlwZUZEc18pID09IC0xKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlICIsIEVWVVRJTF9TT0NLRVRfRVJST1IoKSk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiY2FuJ3QgY3JlYXRlIG5vdGlmaWNhdGlvbiBwaXBlIik7CisgIH0KKyAgaWYgKGV2dXRpbF9tYWtlX3NvY2tldF9ub25ibG9ja2luZyhub3RpZmljYXRpb25QaXBlRkRzX1swXSkgPCAwCisgICAgICB8fCBldnV0aWxfbWFrZV9zb2NrZXRfbm9uYmxvY2tpbmcobm90aWZpY2F0aW9uUGlwZUZEc19bMV0pIDwgMCkgeworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdKTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1sxXSk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgVEhSSUZUX09fTk9OQkxPQ0siKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSIDwgMHgwMjAwMDAwMAorICAgIGludCBmbGFnczsKKyAgICBpZiAoKGZsYWdzID0gVEhSSUZUX0ZDTlRMKG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldLCBGX0dFVEZELCAwKSkgPCAwCisgICAgICAgIHx8IFRIUklGVF9GQ05UTChub3RpZmljYXRpb25QaXBlRkRzX1tpXSwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKSA8IDApIHsKKyNlbHNlCisgICAgaWYgKGV2dXRpbF9tYWtlX3NvY2tldF9jbG9zZW9uZXhlYyhub3RpZmljYXRpb25QaXBlRkRzX1tpXSkgPCAwKSB7CisjZW5kaWYKKyAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdKTsKKyAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdKTsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oCisgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpICIKKyAgICAgICAgICAiRkRfQ0xPRVhFQyIpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJlZ2lzdGVyIHRoZSBjb3JlIGxpYmV2ZW50IGV2ZW50cyBvbnRvIHRoZSBwcm9wZXIgYmFzZS4KKyAqLwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6cmVnaXN0ZXJFdmVudHMoKSB7CisgIHRocmVhZElkXyA9IFRocmVhZDo6Z2V0X2N1cnJlbnQoKTsKKworICBhc3NlcnQoZXZlbnRCYXNlXyA9PSAwKTsKKyAgZXZlbnRCYXNlXyA9IGdldFNlcnZlcigpLT5nZXRVc2VyRXZlbnRCYXNlKCk7CisgIGlmIChldmVudEJhc2VfID09IE5VTEwpIHsKKyAgICBldmVudEJhc2VfID0gZXZlbnRfYmFzZV9uZXcoKTsKKyAgICBvd25FdmVudEJhc2VfID0gdHJ1ZTsKKyAgfQorCisgIC8vIFByaW50IHNvbWUgbGliZXZlbnQgc3RhdHMKKyAgaWYgKG51bWJlcl8gPT0gMCkgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogdXNpbmcgbGliZXZlbnQgJXMgbWV0aG9kICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2dldF92ZXJzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9iYXNlX2dldF9tZXRob2QoZXZlbnRCYXNlXykpOworICB9CisKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZlciBldmVudAorICAgIGV2ZW50X3NldCgmc2VydmVyRXZlbnRfLAorICAgICAgICAgICAgICBsaXN0ZW5Tb2NrZXRfLAorICAgICAgICAgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCwKKyAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQ6Omxpc3RlbkhhbmRsZXIsCisgICAgICAgICAgICAgIHNlcnZlcl8pOworICAgIGV2ZW50X2Jhc2Vfc2V0KGV2ZW50QmFzZV8sICZzZXJ2ZXJFdmVudF8pOworCisgICAgLy8gQWRkIHRoZSBldmVudCBhbmQgc3RhcnQgdXAgdGhlIHNlcnZlcgorICAgIGlmICgtMSA9PSBldmVudF9hZGQoJnNlcnZlckV2ZW50XywgMCkpIHsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oCisgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKTogIgorICAgICAgICAgICJldmVudF9hZGQoKSBmYWlsZWQgb24gc2VydmVyIGxpc3RlbiBldmVudCIpOworICAgIH0KKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmc6IElPIHRocmVhZCAjJWQgcmVnaXN0ZXJlZCBmb3IgbGlzdGVuLiIsIG51bWJlcl8pOworICB9CisKKyAgY3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpOworCisgIC8vIENyZWF0ZSBhbiBldmVudCB0byBiZSBub3RpZmllZCB3aGVuIGEgdGFzayBmaW5pc2hlcworICBldmVudF9zZXQoJm5vdGlmaWNhdGlvbkV2ZW50XywKKyAgICAgICAgICAgIGdldE5vdGlmaWNhdGlvblJlY3ZGRCgpLAorICAgICAgICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QsCisgICAgICAgICAgICBUTm9uYmxvY2tpbmdJT1RocmVhZDo6bm90aWZ5SGFuZGxlciwKKyAgICAgICAgICAgIHRoaXMpOworCisgIC8vIEF0dGFjaCB0byB0aGUgYmFzZQorICBldmVudF9iYXNlX3NldChldmVudEJhc2VfLCAmbm90aWZpY2F0aW9uRXZlbnRfKTsKKworICAvLyBBZGQgdGhlIGV2ZW50IGFuZCBzdGFydCB1cCB0aGUgc2VydmVyCisgIGlmICgtMSA9PSBldmVudF9hZGQoJm5vdGlmaWNhdGlvbkV2ZW50XywgMCkpIHsKKyAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpOiAiCisgICAgICAgICJldmVudF9hZGQoKSBmYWlsZWQgb24gdGFzay1kb25lIG5vdGlmaWNhdGlvbiBldmVudCIpOworICB9CisgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZzogSU8gdGhyZWFkICMlZCByZWdpc3RlcmVkIGZvciBub3RpZnkuIiwgbnVtYmVyXyk7Cit9CisKK2Jvb2wgVE5vbmJsb2NraW5nSU9UaHJlYWQ6Om5vdGlmeShUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uKSB7CisgIFRIUklGVF9TT0NLRVQgZmQgPSBnZXROb3RpZmljYXRpb25TZW5kRkQoKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludCByZXQgPSAtMTsKKyAgbG9uZyBrU2l6ZSA9IHNpemVvZihjb25uKTsKKyAgY29uc3QgY2hhciAqIHBvcyA9IChjb25zdCBjaGFyICopY29uc3RfY2FzdF9zb2Nrb3B0KCZjb25uKTsKKworI2lmIGRlZmluZWQoSEFWRV9QT0xMX0gpIHx8IGRlZmluZWQoSEFWRV9TWVNfUE9MTF9IKQorICBzdHJ1Y3QgcG9sbGZkIHBmZCA9IHtmZCwgUE9MTE9VVCwgMH07CisKKyAgd2hpbGUgKGtTaXplID4gMCkgeworICAgIHBmZC5yZXZlbnRzID0gMDsKKyAgICByZXQgPSBwb2xsKCZwZmQsIDEsIC0xKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChwZmQucmV2ZW50cyAmIFBPTExIVVAgfHwgcGZkLnJldmVudHMgJiBQT0xMRVJSKSB7CisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHBmZC5yZXZlbnRzICYgUE9MTE9VVCkgeworICAgICAgcmV0ID0gc2VuZChmZCwgcG9zLCBrU2l6ZSwgMCk7CisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAga1NpemUgLT0gcmV0OworICAgICAgcG9zICs9IHJldDsKKyAgICB9CisgIH0KKyNlbHNlCisgIGZkX3NldCB3ZmRzLCBlZmRzOworCisgIHdoaWxlIChrU2l6ZSA+IDApIHsKKyAgICBGRF9aRVJPKCZ3ZmRzKTsKKyAgICBGRF9aRVJPKCZlZmRzKTsKKyAgICBGRF9TRVQoZmQsICZ3ZmRzKTsKKyAgICBGRF9TRVQoZmQsICZlZmRzKTsKKyAgICByZXQgPSBzZWxlY3Qoc3RhdGljX2Nhc3Q8aW50PihmZCArIDEpLCBOVUxMLCAmd2ZkcywgJmVmZHMsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKEZEX0lTU0VUKGZkLCAmZWZkcykpIHsKKyAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoRkRfSVNTRVQoZmQsICZ3ZmRzKSkgeworICAgICAgcmV0ID0gc2VuZChmZCwgcG9zLCBrU2l6ZSwgMCk7CisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAga1NpemUgLT0gcmV0OworICAgICAgcG9zICs9IHJldDsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiB0cnVlOworfQorCisvKiBzdGF0aWMgKi8KK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6Om5vdGlmeUhhbmRsZXIoZXZ1dGlsX3NvY2tldF90IGZkLCBzaG9ydCB3aGljaCwgdm9pZCogdikgeworICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQgPSAoVE5vbmJsb2NraW5nSU9UaHJlYWQqKXY7CisgIGFzc2VydChpb1RocmVhZCk7CisgICh2b2lkKXdoaWNoOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9IDA7CisgICAgY29uc3QgaW50IGtTaXplID0gc2l6ZW9mKGNvbm5lY3Rpb24pOworICAgIGxvbmcgbkJ5dGVzID0gcmVjdihmZCwgY2FzdF9zb2Nrb3B0KCZjb25uZWN0aW9uKSwga1NpemUsIDApOworICAgIGlmIChuQnl0ZXMgPT0ga1NpemUpIHsKKyAgICAgIGlmIChjb25uZWN0aW9uID09IE5VTEwpIHsKKyAgICAgICAgLy8gdGhpcyBpcyB0aGUgY29tbWFuZCB0byBzdG9wIG91ciB0aHJlYWQsIGV4aXQgdGhlIGhhbmRsZXIhCisgICAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AoZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjb25uZWN0aW9uLT50cmFuc2l0aW9uKCk7CisgICAgfSBlbHNlIGlmIChuQnl0ZXMgPiAwKSB7CisgICAgICAvLyB0aHJvdyBhd2F5IHRoZXNlIGJ5dGVzIGFuZCBob3BlIHRoYXQgbmV4dCB0aW1lIHdlIGdldCBhIHNvbGlkIHJlYWQKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIm5vdGlmeUhhbmRsZXI6IEJhZCByZWFkIG9mICVkIGJ5dGVzLCB3YW50ZWQgJWQiLCBuQnl0ZXMsIGtTaXplKTsKKyAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AodHJ1ZSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChuQnl0ZXMgPT0gMCkgeworICAgICAgR2xvYmFsT3V0cHV0LnByaW50Zigibm90aWZ5SGFuZGxlcjogTm90aWZ5IHNvY2tldCBjbG9zZWQhIik7CisgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKGZhbHNlKTsKKyAgICAgIC8vIGV4aXQgdGhlIGxvb3AKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7IC8vIG5CeXRlcyA8IDAKKyAgICAgIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRVdPVUxEQkxPQ0sKKyAgICAgICAgICAmJiBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRUFHQUlOKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZzogbm90aWZ5SGFuZGxlciByZWFkKCkgZmFpbGVkOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AodHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8vIGV4aXQgdGhlIGxvb3AKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpicmVha0xvb3AoYm9vbCBlcnJvcikgeworICBpZiAoZXJyb3IpIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgZXhpdGluZyB3aXRoIGVycm9yLiIsIG51bWJlcl8pOworICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgc29tZXRoaW5nIGJldHRlciB0byBkbyBoZXJlLCBidXQgZm9yIG5vdyBraWxsIHRoZQorICAgIC8vIHdob2xlIHByb2Nlc3MuCisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBhYm9ydGluZyBwcm9jZXNzLiIpOworICAgIDo6YWJvcnQoKTsKKyAgfQorCisgIC8vIElmIHdlJ3JlIHJ1bm5pbmcgaW4gdGhlIHNhbWUgdGhyZWFkLCB3ZSBjYW4ndCB1c2UgdGhlIG5vdGlmeSgwKQorICAvLyBtZWNoYW5pc20gdG8gc3RvcCB0aGUgdGhyZWFkLCBidXQgaGFwcGlseSBpZiB3ZSdyZSBydW5uaW5nIGluIHRoZQorICAvLyBzYW1lIHRocmVhZCwgdGhpcyBtZWFucyB0aGUgdGhyZWFkIGNhbid0IGJlIGJsb2NraW5nIGluIHRoZSBldmVudAorICAvLyBsb29wIGVpdGhlci4KKyAgaWYgKCFUaHJlYWQ6OmlzX2N1cnJlbnQodGhyZWFkSWRfKSkgeworICAgIG5vdGlmeShOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBjYXVzZSB0aGUgbG9vcCB0byBzdG9wIEFTQVAgLSBldmVuIGlmIGl0IGhhcyB0aGluZ3MgdG8gZG8gaW4gaXQKKyAgICBldmVudF9iYXNlX2xvb3BicmVhayhldmVudEJhc2VfKTsKKyAgfQorfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGJvb2wgdmFsdWUpIHsKKyNpZmRlZiBIQVZFX1NDSEVEX0gKKyAgLy8gU3RhcnQgb3V0IHdpdGggYSBzdGFuZGFyZCwgbG93LXByaW9yaXR5IHNldHVwIGZvciB0aGUgc2NoZWQgcGFyYW1zLgorICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3A7CisgIGJ6ZXJvKCh2b2lkKikmc3AsIHNpemVvZihzcCkpOworICBpbnQgcG9saWN5ID0gU0NIRURfT1RIRVI7CisKKyAgLy8gSWYgZGVzaXJlZCwgc2V0IHVwIGhpZ2gtcHJpb3JpdHkgc2NoZWQgcGFyYW1zIHN0cnVjdHVyZS4KKyAgaWYgKHZhbHVlKSB7CisgICAgLy8gRklGTyBzY2hlZHVsZXIsIHJhbmtlZCBhYm92ZSBkZWZhdWx0IFNDSEVEX09USEVSIHF1ZXVlCisgICAgcG9saWN5ID0gU0NIRURfRklGTzsKKyAgICAvLyBUaGUgcHJpb3JpdHkgb25seSBjb21wYXJlcyB1cyB0byBvdGhlciBTQ0hFRF9GSUZPIHRocmVhZHMsIHNvIHdlCisgICAgLy8ganVzdCBwaWNrIGEgcmFuZG9tIHByaW9yaXR5IGhhbGZ3YXkgYmV0d2VlbiBtaW4gJiBtYXguCisgICAgY29uc3QgaW50IHByaW9yaXR5ID0gKHNjaGVkX2dldF9wcmlvcml0eV9tYXgocG9saWN5KSArIHNjaGVkX2dldF9wcmlvcml0eV9taW4ocG9saWN5KSkgLyAyOworCisgICAgc3Auc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgfQorCisgIC8vIEFjdHVhbGx5IHNldCB0aGUgc2NoZWQgcGFyYW1zIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgIGlmICgwID09IHB0aHJlYWRfc2V0c2NoZWRwYXJhbShwdGhyZWFkX3NlbGYoKSwgcG9saWN5LCAmc3ApKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nOiBJTyBUaHJlYWQgIyVkIHVzaW5nIGhpZ2gtcHJpb3JpdHkgc2NoZWR1bGVyISIsIG51bWJlcl8pOworICB9IGVsc2UgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZzogcHRocmVhZF9zZXRzY2hlZHBhcmFtKCk6ICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgfQorI2Vsc2UKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSh2YWx1ZSk7CisjZW5kaWYKK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6cnVuKCkgeworICBpZiAoZXZlbnRCYXNlXyA9PSBOVUxMKSB7CisgICAgcmVnaXN0ZXJFdmVudHMoKTsKKyAgfQorICBpZiAodXNlSGlnaFByaW9yaXR5XykgeworICAgIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkodHJ1ZSk7CisgIH0KKworICBpZiAoZXZlbnRCYXNlXyAhPSBOVUxMKQorICB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGVudGVyaW5nIGxvb3AuLi4iLCBudW1iZXJfKTsKKyAgICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCBuZXZlciByZXR1cm5zLCBpbnZva2VzIGNhbGxzIHRvIGV2ZW50SGFuZGxlcgorICAgIGV2ZW50X2Jhc2VfbG9vcChldmVudEJhc2VfLCAwKTsKKworICAgIGlmICh1c2VIaWdoUHJpb3JpdHlfKSB7CisgICAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBjbGVhbnMgdXAgb3VyIHJlZ2lzdGVyZWQgZXZlbnRzCisgICAgY2xlYW51cEV2ZW50cygpOworICB9CisKKyAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIHJ1bigpIGRvbmUhIiwgbnVtYmVyXyk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmNsZWFudXBFdmVudHMoKSB7CisgIC8vIHN0b3AgdGhlIGxpc3RlbiBzb2NrZXQsIGlmIGFueQorICBpZiAobGlzdGVuU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpZiAoZXZlbnRfZGVsKCZzZXJ2ZXJFdmVudF8pID09IC0xKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZDo6c3RvcCgpIGV2ZW50X2RlbDogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIH0KKyAgfQorCisgIGV2ZW50X2RlbCgmbm90aWZpY2F0aW9uRXZlbnRfKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6c3RvcCgpIHsKKyAgLy8gVGhpcyBzaG91bGQgY2F1c2UgdGhlIHRocmVhZCB0byBmYWxsIG91dCBvZiBpdHMgZXZlbnQgbG9vcCBBU0FQLgorICBicmVha0xvb3AoZmFsc2UpOworfQorCit2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpqb2luKCkgeworICAvLyBJZiB0aGlzIHdhcyBhIHRocmVhZCBjcmVhdGVkIGJ5IGEgZmFjdG9yeSAobm90IHRoZSB0aHJlYWQgdGhhdCBjYWxsZWQKKyAgLy8gc2VydmUoKSksIHdlIGpvaW4oKSBpdCB0byBtYWtlIHN1cmUgd2Ugc2h1dCBkb3duIGZ1bGx5LgorICBpZiAodGhyZWFkXykgeworICAgIHRyeSB7CisgICAgICAvLyBOb3RlIHRoYXQgaXQgaXMgc2FmZSB0byBib3RoIGpvaW4oKSBvdXJzZWx2ZXMgdHdpY2UsIGFzIHdlbGwgYXMgam9pbgorICAgICAgLy8gdGhlIGN1cnJlbnQgdGhyZWFkIGFzIHRoZSBwdGhyZWFkIGltcGxlbWVudGF0aW9uIGNoZWNrcyBmb3IgZGVhZGxvY2suCisgICAgICB0aHJlYWRfLT5qb2luKCk7CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAvLyBzd2FsbG93IGV2ZXJ5dGhpbmcKKyAgICB9CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5YzI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKQEAgLTAsMCArMSw4NjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxldmVudC5oPgorI2luY2x1ZGUgPGV2ZW50Mi9ldmVudF9jb21wYXQuaD4KKyNpbmNsdWRlIDxldmVudDIvZXZlbnRfc3RydWN0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQ7CisKKyNpZmRlZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUgorI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01BSk9SIChMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA+PiAyNCkKKyNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9NSU5PUiAoKExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID4+IDE2KSAmIDB4RkYpCisjZGVmaW5lIExJQkVWRU5UX1ZFUlNJT05fUkVMICgoTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPj4gOCkgJiAweEZGKQorI2Vsc2UKKy8vIGFzc3VtZSBsYXRlc3QgdmVyc2lvbiAxIHNlcmllcworI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01BSk9SIDEKKyNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9NSU5PUiAxNAorI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX1JFTCAxMworI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgPDwgMjQpIHwgKExJQkVWRU5UX1ZFUlNJT05fTUlOT1IgPDwgMTYpIHwgKExJQkVWRU5UX1ZFUlNJT05fUkVMIDw8IDgpKQorI2VuZGlmCisKKyNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA8IDB4MDIwMDAwMDAKK3R5cGVkZWYgVEhSSUZUX1NPQ0tFVCBldnV0aWxfc29ja2V0X3Q7CisjZW5kaWYKKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKworLyoqCisgKiBUaGlzIGlzIGEgbm9uLWJsb2NraW5nIHNlcnZlciBpbiBDKysgZm9yIGhpZ2ggcGVyZm9ybWFuY2UgdGhhdAorICogb3BlcmF0ZXMgYSBzZXQgb2YgSU8gdGhyZWFkcyAoYnkgZGVmYXVsdCBvbmx5IG9uZSkuIEl0IGFzc3VtZXMgdGhhdAorICogYWxsIGluY29taW5nIHJlcXVlc3RzIGFyZSBmcmFtZWQgd2l0aCBhIDQgYnl0ZSBsZW5ndGggaW5kaWNhdG9yIGFuZAorICogd3JpdGVzIG91dCByZXNwb25zZXMgdXNpbmcgdGhlIHNhbWUgZnJhbWluZy4KKyAqLworCisvLy8gT3ZlcmxvYWQgY29uZGl0aW9uIGFjdGlvbnMuCitlbnVtIFRPdmVybG9hZEFjdGlvbiB7CisgIFRfT1ZFUkxPQURfTk9fQUNUSU9OLCAgICAgICAvLy88IERvbid0IGhhbmRsZSBvdmVybG9hZCAqLworICBUX09WRVJMT0FEX0NMT1NFX09OX0FDQ0VQVCwgLy8vPCBEcm9wIG5ldyBjb25uZWN0aW9ucyBpbW1lZGlhdGVseSAqLworICBUX09WRVJMT0FEX0RSQUlOX1RBU0tfUVVFVUUgLy8vPCBEcm9wIHNvbWUgdGFza3MgZnJvbSBoZWFkIG9mIHRhc2sgcXVldWUgKi8KK307CisKK2NsYXNzIFROb25ibG9ja2luZ0lPVGhyZWFkOworCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7Citwcml2YXRlOgorICBjbGFzcyBUQ29ubmVjdGlvbjsKKworICBmcmllbmQgY2xhc3MgVE5vbmJsb2NraW5nSU9UaHJlYWQ7CisKK3ByaXZhdGU6CisgIC8vLyBMaXN0ZW4gYmFja2xvZworICBzdGF0aWMgY29uc3QgaW50IExJU1RFTl9CQUNLTE9HID0gMTAyNDsKKworICAvLy8gRGVmYXVsdCBsaW1pdCBvbiBzaXplIG9mIGlkbGUgY29ubmVjdGlvbiBwb29sCisgIHN0YXRpYyBjb25zdCBzaXplX3QgQ09OTkVDVElPTl9TVEFDS19MSU1JVCA9IDEwMjQ7CisKKyAgLy8vIERlZmF1bHQgbGltaXQgb24gZnJhbWUgc2l6ZQorICBzdGF0aWMgY29uc3QgaW50IE1BWF9GUkFNRV9TSVpFID0gMjU2ICogMTAyNCAqIDEwMjQ7CisKKyAgLy8vIERlZmF1bHQgbGltaXQgb24gdG90YWwgbnVtYmVyIG9mIGNvbm5lY3RlZCBzb2NrZXRzCisgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0NPTk5FQ1RJT05TID0gSU5UX01BWDsKKworICAvLy8gRGVmYXVsdCBsaW1pdCBvbiBjb25uZWN0aW9ucyBpbiBoYW5kbGVyL3Rhc2sgcHJvY2Vzc2luZworICBzdGF0aWMgY29uc3QgaW50IE1BWF9BQ1RJVkVfUFJPQ0VTU09SUyA9IElOVF9NQVg7CisKKyAgLy8vIERlZmF1bHQgc2l6ZSBvZiB3cml0ZSBidWZmZXIKKyAgc3RhdGljIGNvbnN0IGludCBXUklURV9CVUZGRVJfREVGQVVMVF9TSVpFID0gMTAyNDsKKworICAvLy8gTWF4aW11bSBzaXplIG9mIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIGNvbm5lY3Rpb24gKDAgPSB1bmxpbWl0ZWQpCisgIHN0YXRpYyBjb25zdCBpbnQgSURMRV9SRUFEX0JVRkZFUl9MSU1JVCA9IDEwMjQ7CisKKyAgLy8vIE1heGltdW0gc2l6ZSBvZiB3cml0ZSBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgY29ubmVjdGlvbiAoMCA9IHVubGltaXRlZCkKKyAgc3RhdGljIGNvbnN0IGludCBJRExFX1dSSVRFX0JVRkZFUl9MSU1JVCA9IDEwMjQ7CisKKyAgLy8vICMgb2YgY2FsbHMgYmVmb3JlIHJlc2l6aW5nIG92ZXJzaXplZCBidWZmZXJzICgwID0gY2hlY2sgb25seSBvbiBjbG9zZSkKKyAgc3RhdGljIGNvbnN0IGludCBSRVNJWkVfQlVGRkVSX0VWRVJZX04gPSA1MTI7CisKKyAgLy8vICMgb2YgSU8gdGhyZWFkcyB0byB1c2UgYnkgZGVmYXVsdAorICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfSU9fVEhSRUFEUyA9IDE7CisKKyAgLy8vICMgb2YgSU8gdGhyZWFkcyB0aGlzIHNlcnZlciB3aWxsIHVzZQorICBzaXplX3QgbnVtSU9UaHJlYWRzXzsKKworICAvLy8gV2hldGhlciB0byBzZXQgaGlnaCBzY2hlZHVsaW5nIHByaW9yaXR5IGZvciBJTyB0aHJlYWRzCisgIGJvb2wgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXzsKKworICAvLy8gU2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAgVEhSSUZUX1NPQ0tFVCBzZXJ2ZXJTb2NrZXRfOworCisgIC8vLyBUaGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKQorICBldmVudF9iYXNlKiB1c2VyRXZlbnRCYXNlXzsKKworICAvLy8gRm9yIHByb2Nlc3NpbmcgdmlhIHRocmVhZCBwb29sLCBtYXkgYmUgTlVMTAorICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87CisKKyAgLy8vIElzIHRocmVhZCBwb29sIHByb2Nlc3Npbmc/CisgIGJvb2wgdGhyZWFkUG9vbFByb2Nlc3NpbmdfOworCisgIC8vIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBJTyB0aHJlYWRzCisgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IGlvVGhyZWFkRmFjdG9yeV87CisKKyAgLy8gVmVjdG9yIG9mIElPVGhyZWFkIG9iamVjdHMgdGhhdCB3aWxsIGhhbmRsZSBvdXIgSU8KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiA+IGlvVGhyZWFkc187CisKKyAgLy8gSW5kZXggb2YgbmV4dCBJTyBUaHJlYWQgdG8gYmUgdXNlZCAoZm9yIHJvdW5kLXJvYmluKQorICB1aW50MzJfdCBuZXh0SU9UaHJlYWRfOworCisgIC8vIFN5bmNocm9uaXplcyBhY2Nlc3MgdG8gY29ubmVjdGlvbiBzdGFjayBhbmQgc2ltaWxhciBkYXRhCisgIE11dGV4IGNvbm5NdXRleF87CisKKyAgLy8vIE51bWJlciBvZiBUQ29ubmVjdGlvbiBvYmplY3Qgd2UndmUgY3JlYXRlZAorICBzaXplX3QgbnVtVENvbm5lY3Rpb25zXzsKKworICAvLy8gTnVtYmVyIG9mIENvbm5lY3Rpb25zIHByb2Nlc3Npbmcgb3Igd2FpdGluZyB0byBwcm9jZXNzCisgIHNpemVfdCBudW1BY3RpdmVQcm9jZXNzb3JzXzsKKworICAvLy8gTGltaXQgZm9yIGhvdyBtYW55IFRDb25uZWN0aW9uIG9iamVjdHMgdG8gY2FjaGUKKyAgc2l6ZV90IGNvbm5lY3Rpb25TdGFja0xpbWl0XzsKKworICAvLy8gTGltaXQgZm9yIG51bWJlciBvZiBjb25uZWN0aW9ucyBwcm9jZXNzaW5nIG9yIHdhaXRpbmcgdG8gcHJvY2VzcworICBzaXplX3QgbWF4QWN0aXZlUHJvY2Vzc29yc187CisKKyAgLy8vIExpbWl0IGZvciBudW1iZXIgb2Ygb3BlbiBjb25uZWN0aW9ucworICBzaXplX3QgbWF4Q29ubmVjdGlvbnNfOworCisgIC8vLyBMaW1pdCBmb3IgZnJhbWUgc2l6ZQorICBzaXplX3QgbWF4RnJhbWVTaXplXzsKKworICAvLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGFuIHVucGVyZm9ybWVkIHRhc2sgZXhwaXJlcyAoMCA9PSBpbmZpbml0ZSkuCisgIGludDY0X3QgdGFza0V4cGlyZVRpbWVfOworCisgIC8qKgorICAgKiBIeXN0ZXJlc2lzIGZvciBvdmVybG9hZCBzdGF0ZS4gIFRoaXMgaXMgdGhlIGZyYWN0aW9uIG9mIHRoZSBvdmVybG9hZAorICAgKiB2YWx1ZSB0aGF0IG5lZWRzIHRvIGJlIHJlYWNoZWQgYmVmb3JlIHRoZSBvdmVybG9hZCBzdGF0ZSBpcyBjbGVhcmVkOworICAgKiBtdXN0IGJlIDw9IDEuMC4KKyAgICovCisgIGRvdWJsZSBvdmVybG9hZEh5c3RlcmVzaXNfOworCisgIC8vLyBBY3Rpb24gdG8gdGFrZSB3aGVuIHdlJ3JlIG92ZXJsb2FkZWQuCisgIFRPdmVybG9hZEFjdGlvbiBvdmVybG9hZEFjdGlvbl87CisKKyAgLyoqCisgICAqIFRoZSB3cml0ZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgKGFuZCB3aGVuIGlkbGVXcml0ZUJ1ZmZlckxpbWl0XyBpcyBjaGVja2VkCisgICAqIGFuZCBmb3VuZCB0byBiZSBleGNlZWRlZCwgcmVpbml0aWFsaXplZCkgdG8gdGhpcyBzaXplLgorICAgKi8KKyAgc2l6ZV90IHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfOworCisgIC8qKgorICAgKiBNYXggcmVhZCBidWZmZXIgc2l6ZSBmb3IgYW4gaWRsZSBUQ29ubmVjdGlvbi4gIFdoZW4gd2UgcGxhY2UgYW4gaWRsZQorICAgKiBUQ29ubmVjdGlvbiBpbnRvIGNvbm5lY3Rpb25TdGFja18gb3Igb24gZXZlcnkgcmVzaXplQnVmZmVyRXZlcnlOXyBjYWxscywKKyAgICogd2Ugd2lsbCBmcmVlIHRoZSBidWZmZXIgKHN1Y2ggdGhhdCBpdCB3aWxsIGJlIHJlaW5pdGlhbGl6ZWQgYnkgdGhlIG5leHQKKyAgICogcmVjZWl2ZWQgZnJhbWUpIGlmIGl0IGhhcyBleGNlZWRlZCB0aGlzIGxpbWl0LiAgMCBkaXNhYmxlcyB0aGlzIGNoZWNrLgorICAgKi8KKyAgc2l6ZV90IGlkbGVSZWFkQnVmZmVyTGltaXRfOworCisgIC8qKgorICAgKiBNYXggd3JpdGUgYnVmZmVyIHNpemUgZm9yIGFuIGlkbGUgY29ubmVjdGlvbi4gIFdoZW4gd2UgcGxhY2UgYW4gaWRsZQorICAgKiBUQ29ubmVjdGlvbiBpbnRvIGNvbm5lY3Rpb25TdGFja18gb3Igb24gZXZlcnkgcmVzaXplQnVmZmVyRXZlcnlOXyBjYWxscywKKyAgICogd2UgaW5zdXJlIHRoYXQgaXRzIHdyaXRlIGJ1ZmZlciBpcyA8PSB0byB0aGlzIHNpemU7IG90aGVyd2lzZSB3ZQorICAgKiByZXBsYWNlIGl0IHdpdGggYSBuZXcgb25lIG9mIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfIGJ5dGVzIHRvIGluc3VyZSB0aGF0CisgICAqIGlkbGUgY29ubmVjdGlvbnMgZG9uJ3QgaG9nIG1lbW9yeS4gMCBkaXNhYmxlcyB0aGlzIGNoZWNrLgorICAgKi8KKyAgc2l6ZV90IGlkbGVXcml0ZUJ1ZmZlckxpbWl0XzsKKworICAvKioKKyAgICogRXZlcnkgTiBjYWxscyB3ZSBjaGVjayB0aGUgYnVmZmVyIHNpemUgbGltaXRzIG9uIGEgY29ubmVjdGVkIFRDb25uZWN0aW9uLgorICAgKiAwIGRpc2FibGVzIChpLmUuIHRoZSBjaGVja3MgYXJlIG9ubHkgZG9uZSB3aGVuIGEgY29ubmVjdGlvbiBjbG9zZXMpLgorICAgKi8KKyAgaW50MzJfdCByZXNpemVCdWZmZXJFdmVyeU5fOworCisgIC8vLyBTZXQgaWYgd2UgYXJlIGN1cnJlbnRseSBpbiBhbiBvdmVybG9hZGVkIHN0YXRlLgorICBib29sIG92ZXJsb2FkZWRfOworCisgIC8vLyBDb3VudCBvZiBjb25uZWN0aW9ucyBkcm9wcGVkIHNpbmNlIG92ZXJsb2FkIHN0YXJ0ZWQKKyAgdWludDMyX3QgbkNvbm5lY3Rpb25zRHJvcHBlZF87CisKKyAgLy8vIENvdW50IG9mIGNvbm5lY3Rpb25zIGRyb3BwZWQgb24gb3ZlcmxvYWQgc2luY2Ugc2VydmVyIHN0YXJ0ZWQKKyAgdWludDY0X3QgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXzsKKworICAvKioKKyAgICogVGhpcyBpcyBhIHN0YWNrIG9mIGFsbCB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGJ1dCB0aGF0CisgICAqIGFyZSBOT1QgY3VycmVudGx5IGluIHVzZS4gV2hlbiB3ZSBjbG9zZSBhIGNvbm5lY3Rpb24sIHdlIHBsYWNlIGl0IG9uIHRoaXMKKyAgICogc3RhY2sgc28gdGhhdCB0aGUgb2JqZWN0IGNhbiBiZSByZXVzZWQgbGF0ZXIsIHJhdGhlciB0aGFuIGZyZWVpbmcgdGhlCisgICAqIG1lbW9yeSBhbmQgcmVhbGxvY2F0aW5nIGEgbmV3IG9iamVjdCBsYXRlci4KKyAgICovCisgIHN0ZDo6c3RhY2s8VENvbm5lY3Rpb24qPiBjb25uZWN0aW9uU3RhY2tfOworCisgIC8qKgorICAgKiBUaGlzIGNvbnRhaW5lciBob2xkcyBwb2ludGVycyB0byBhbGwgYWN0aXZlIGNvbm5lY3Rpb25zLiBUaGlzIGNvbnRhaW5lcgorICAgKiBhbGxvd3MgdGhlIHNlcnZlciB0byBjbGVhbiB1cCB1bmxjb3NlZCBjb25uZWN0aW9uIG9iamVjdHMgYXQgZGVzdHJ1Y3Rpb24sCisgICAqIHdoaWNoIGluIHR1cm4gYWxsb3dzIHRoZWlyIHRyYW5zcG9ydHMsIHByb3RvY29scywgcHJvY2Vzc29ycyBhbmQgaGFuZGxlcnMKKyAgICogdG8gZGVhbGxvY2F0ZSBhbmQgY2xlYW4gdXAgY29ycmVjdGx5LgorICAgKi8KKyAgc3RkOjp2ZWN0b3I8VENvbm5lY3Rpb24qPiBhY3RpdmVDb25uZWN0aW9uc187CisKKyAgLyoKKyAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0XzsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gc2VydmVyIHNvY2tldCBoYWQgc29tZXRoaW5nIGhhcHBlbi4gIFdlIGFjY2VwdCBhbGwgd2FpdGluZworICAgKiBjbGllbnQgY29ubmVjdGlvbnMgb24gbGlzdGVuIHNvY2tldCBmZCBhbmQgYXNzaWduIFRDb25uZWN0aW9uIG9iamVjdHMKKyAgICogdG8gaGFuZGxlIHRob3NlIHJlcXVlc3RzLgorICAgKgorICAgKiBAcGFyYW0gd2hpY2ggdGhlIGV2ZW50IGZsYWcgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIuCisgICAqLworICB2b2lkIGhhbmRsZUV2ZW50KFRIUklGVF9TT0NLRVQgZmQsIHNob3J0IHdoaWNoKTsKKworICB2b2lkIGluaXQoKSB7CisgICAgc2VydmVyU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICBudW1JT1RocmVhZHNfID0gREVGQVVMVF9JT19USFJFQURTOworICAgIG5leHRJT1RocmVhZF8gPSAwOworICAgIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18gPSBmYWxzZTsKKyAgICB1c2VyRXZlbnRCYXNlXyA9IE5VTEw7CisgICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfID0gZmFsc2U7CisgICAgbnVtVENvbm5lY3Rpb25zXyA9IDA7CisgICAgbnVtQWN0aXZlUHJvY2Vzc29yc18gPSAwOworICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0XyA9IENPTk5FQ1RJT05fU1RBQ0tfTElNSVQ7CisgICAgbWF4QWN0aXZlUHJvY2Vzc29yc18gPSBNQVhfQUNUSVZFX1BST0NFU1NPUlM7CisgICAgbWF4Q29ubmVjdGlvbnNfID0gTUFYX0NPTk5FQ1RJT05TOworICAgIG1heEZyYW1lU2l6ZV8gPSBNQVhfRlJBTUVfU0laRTsKKyAgICB0YXNrRXhwaXJlVGltZV8gPSAwOworICAgIG92ZXJsb2FkSHlzdGVyZXNpc18gPSAwLjg7CisgICAgb3ZlcmxvYWRBY3Rpb25fID0gVF9PVkVSTE9BRF9OT19BQ1RJT047CisgICAgd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV8gPSBXUklURV9CVUZGRVJfREVGQVVMVF9TSVpFOworICAgIGlkbGVSZWFkQnVmZmVyTGltaXRfID0gSURMRV9SRUFEX0JVRkZFUl9MSU1JVDsKKyAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdF8gPSBJRExFX1dSSVRFX0JVRkZFUl9MSU1JVDsKKyAgICByZXNpemVCdWZmZXJFdmVyeU5fID0gUkVTSVpFX0JVRkZFUl9FVkVSWV9OOworICAgIG92ZXJsb2FkZWRfID0gZmFsc2U7CisgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8gPSAwOworICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8gPSAwOworICB9CisKK3B1YmxpYzoKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CisgIH0KKworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogVFNlcnZlcihwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKKyAgfQorCisKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKKworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKKyAgfQorCisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CisKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOworICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CisgIH0KKworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CisKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoaW5wdXRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGlucHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkob3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOworICB9CisKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOworCisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGlucHV0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShpbnB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKKyAgfQorCisgIH5UTm9uYmxvY2tpbmdTZXJ2ZXIoKTsKKworICB2b2lkIHNldFRocmVhZE1hbmFnZXIoc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpOworCisgIGludCBnZXRMaXN0ZW5Qb3J0KCkgeyByZXR1cm4gc2VydmVyVHJhbnNwb3J0Xy0+Z2V0TGlzdGVuUG9ydCgpOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSB7IHJldHVybiB0aHJlYWRNYW5hZ2VyXzsgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgSU8gdGhyZWFkcyB1c2VkIGJ5IHRoaXMgc2VydmVyLiBDYW4gb25seSBiZSB1c2VkIGJlZm9yZQorICAgKiB0aGUgY2FsbCB0byBzZXJ2ZSgpIGFuZCBoYXMgbm8gZWZmZWN0IGFmdGVyd2FyZHMuICBXZSBhbHdheXMgdXNlIGEKKyAgICogUG9zaXhUaHJlYWRGYWN0b3J5IGZvciB0aGUgSU8gd29ya2VyIHRocmVhZHMsIGJlY2F1c2UgdGhleSBtdXN0IGpvaW5hYmxlCisgICAqIGZvciBjbGVhbiBzaHV0ZG93bi4KKyAgICovCisgIHZvaWQgc2V0TnVtSU9UaHJlYWRzKHNpemVfdCBudW1UaHJlYWRzKSB7CisgICAgbnVtSU9UaHJlYWRzXyA9IG51bVRocmVhZHM7CisgICAgLy8gVXNlci1wcm92aWRlZCBldmVudC1iYXNlIGRvZXNuJ3Qgd29ya3MgZm9yIG11bHRpLXRocmVhZGVkIHNlcnZlcnMKKyAgICBhc3NlcnQobnVtSU9UaHJlYWRzXyA8PSAxIHx8ICF1c2VyRXZlbnRCYXNlXyk7CisgIH0KKworICAvKiogUmV0dXJuIHdoZXRoZXIgdGhlIElPIHRocmVhZHMgd2lsbCBnZXQgaGlnaCBzY2hlZHVsaW5nIHByaW9yaXR5ICovCisgIGJvb2wgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzKCkgY29uc3QgeyByZXR1cm4gdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXzsgfQorCisgIC8qKiBTZXQgd2hldGhlciB0aGUgSU8gdGhyZWFkcyB3aWxsIGdldCBoaWdoIHNjaGVkdWxpbmcgcHJpb3JpdHkuICovCisgIHZvaWQgc2V0VXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzKGJvb2wgdmFsKSB7IHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18gPSB2YWw7IH0KKworICAvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgSU8gdGhyZWFkcyB1c2VkIGJ5IHRoaXMgc2VydmVyLiAqLworICBzaXplX3QgZ2V0TnVtSU9UaHJlYWRzKCkgY29uc3QgeyByZXR1cm4gbnVtSU9UaHJlYWRzXzsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVudXNlZCBUQ29ubmVjdGlvbiB3ZSB3aWxsIGhvbGQgaW4gcmVzZXJ2ZS4KKyAgICoKKyAgICogQHJldHVybiB0aGUgY3VycmVudCBsaW1pdCBvbiBUQ29ubmVjdGlvbiBwb29sIHNpemUuCisgICAqLworICBzaXplX3QgZ2V0Q29ubmVjdGlvblN0YWNrTGltaXQoKSBjb25zdCB7IHJldHVybiBjb25uZWN0aW9uU3RhY2tMaW1pdF87IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnVzZWQgVENvbm5lY3Rpb24gd2Ugd2lsbCBob2xkIGluIHJlc2VydmUuCisgICAqCisgICAqIEBwYXJhbSBzeiB0aGUgbmV3IGxpbWl0IGZvciBUQ29ubmVjdGlvbiBwb29sIHNpemUuCisgICAqLworICB2b2lkIHNldENvbm5lY3Rpb25TdGFja0xpbWl0KHNpemVfdCBzeikgeyBjb25uZWN0aW9uU3RhY2tMaW1pdF8gPSBzejsgfQorCisgIGJvb2wgaXNUaHJlYWRQb29sUHJvY2Vzc2luZygpIGNvbnN0IHsgcmV0dXJuIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsgfQorCisgIHZvaWQgYWRkVGFzayhzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKKyAgICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHRhc2ssIDBMTCwgdGFza0V4cGlyZVRpbWVfKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGNvdW50IG9mIHNvY2tldHMgY3VycmVudGx5IGNvbm5lY3RlZCB0by4KKyAgICoKKyAgICogQHJldHVybiBjb3VudCBvZiBjb25uZWN0ZWQgc29ja2V0cy4KKyAgICovCisgIHNpemVfdCBnZXROdW1Db25uZWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG51bVRDb25uZWN0aW9uc187IH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBjb3VudCBvZiBzb2NrZXRzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8uCisgICAqCisgICAqIEByZXR1cm4gY291bnQgb2YgY29ubmVjdGVkIHNvY2tldHMuCisgICAqLworICBzaXplX3QgZ2V0TnVtQWN0aXZlQ29ubmVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBnZXROdW1Db25uZWN0aW9ucygpIC0gZ2V0TnVtSWRsZUNvbm5lY3Rpb25zKCk7IH0KKworICAvKioKKyAgICogUmV0dXJuIHRoZSBjb3VudCBvZiBjb25uZWN0aW9uIG9iamVjdHMgYWxsb2NhdGVkIGJ1dCBub3QgaW4gdXNlLgorICAgKgorICAgKiBAcmV0dXJuIGNvdW50IG9mIGlkbGUgY29ubmVjdGlvbiBvYmplY3RzLgorICAgKi8KKyAgc2l6ZV90IGdldE51bUlkbGVDb25uZWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpOyB9CisKKyAgLyoqCisgICAqIFJldHVybiBjb3VudCBvZiBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICAgKiBUaGlzIGlzIGRlZmluZWQgYXMgYSBjb25uZWN0aW9uIHdoZXJlIGFsbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIGFuZAorICAgKiBlaXRoZXIgYXNzaWduZWQgYSB0YXNrICh3aGVuIHRocmVhZGluZykgb3IgcGFzc2VkIHRvIGEgaGFuZGxlciAod2hlbgorICAgKiBub3QgdGhyZWFkaW5nKSwgYW5kIHdoZXJlIHRoZSBoYW5kbGVyIGhhcyBub3QgeWV0IHJldHVybmVkLgorICAgKgorICAgKiBAcmV0dXJuICMgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgICAqLworICBzaXplX3QgZ2V0TnVtQWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG51bUFjdGl2ZVByb2Nlc3NvcnNfOyB9CisKKyAgLy8vIEluY3JlbWVudCB0aGUgY291bnQgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCisgIHZvaWQgaW5jcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpIHsKKyAgICBHdWFyZCBnKGNvbm5NdXRleF8pOworICAgICsrbnVtQWN0aXZlUHJvY2Vzc29yc187CisgIH0KKworICAvLy8gRGVjcmVtZW50IHRoZSBjb3VudCBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgdm9pZCBkZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCkgeworICAgIEd1YXJkIGcoY29ubk11dGV4Xyk7CisgICAgaWYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfID4gMCkgeworICAgICAgLS1udW1BY3RpdmVQcm9jZXNzb3JzXzsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBiZWZvcmUgb3ZlcmxvYWQuCisgICAqCisgICAqIEByZXR1cm4gY3VycmVudCBzZXR0aW5nLgorICAgKi8KKyAgc2l6ZV90IGdldE1heENvbm5lY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gbWF4Q29ubmVjdGlvbnNfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgYmVmb3JlIG92ZXJsb2FkLgorICAgKgorICAgKiBAcGFyYW0gbWF4Q29ubmVjdGlvbnMgbmV3IHNldHRpbmcgZm9yIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucy4KKyAgICovCisgIHZvaWQgc2V0TWF4Q29ubmVjdGlvbnMoc2l6ZV90IG1heENvbm5lY3Rpb25zKSB7IG1heENvbm5lY3Rpb25zXyA9IG1heENvbm5lY3Rpb25zOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIHdhaXRpbmcgaW4gaGFuZGxlci90YXNrIGJlZm9yZSBvdmVybG9hZC4KKyAgICoKKyAgICogQHJldHVybiBjdXJyZW50IHNldHRpbmcuCisgICAqLworICBzaXplX3QgZ2V0TWF4QWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIG1heEFjdGl2ZVByb2Nlc3NvcnNfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIHdhaXRpbmcgaW4gaGFuZGxlci90YXNrIGJlZm9yZSBvdmVybG9hZC4KKyAgICoKKyAgICogQHBhcmFtIG1heEFjdGl2ZVByb2Nlc3NvcnMgbmV3IHNldHRpbmcgZm9yIG1heGltdW0gIyBvZiBhY3RpdmUgcHJvY2Vzc2VzLgorICAgKi8KKyAgdm9pZCBzZXRNYXhBY3RpdmVQcm9jZXNzb3JzKHNpemVfdCBtYXhBY3RpdmVQcm9jZXNzb3JzKSB7CisgICAgbWF4QWN0aXZlUHJvY2Vzc29yc18gPSBtYXhBY3RpdmVQcm9jZXNzb3JzOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSBhbGxvd2VkIGZyYW1lIHNpemUuCisgICAqCisgICAqIElmIGEgY2xpZW50IHRyaWVzIHRvIHNlbmQgYSBtZXNzYWdlIGxhcmdlciB0aGFuIHRoaXMgbGltaXQsCisgICAqIGl0cyBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkLgorICAgKgorICAgKiBAcmV0dXJuIE1heGl1bSBmcmFtZSBzaXplLCBpbiBieXRlcy4KKyAgICovCisgIHNpemVfdCBnZXRNYXhGcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBtYXhGcmFtZVNpemVfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBhbGxvd2VkIGZyYW1lIHNpemUuCisgICAqCisgICAqIEBwYXJhbSBtYXhGcmFtZVNpemUgVGhlIG5ldyBtYXhpbXVtIGZyYW1lIHNpemUuCisgICAqLworICB2b2lkIHNldE1heEZyYW1lU2l6ZShzaXplX3QgbWF4RnJhbWVTaXplKSB7IG1heEZyYW1lU2l6ZV8gPSBtYXhGcmFtZVNpemU7IH0KKworICAvKioKKyAgICogR2V0IGZyYWN0aW9uIG9mIG1heGltdW0gbGltaXRzIGJlZm9yZSBhbiBvdmVybG9hZCBjb25kaXRpb24gaXMgY2xlYXJlZC4KKyAgICoKKyAgICogQHJldHVybiBoeXN0ZXJlc2lzIGZyYWN0aW9uCisgICAqLworICBkb3VibGUgZ2V0T3ZlcmxvYWRIeXN0ZXJlc2lzKCkgY29uc3QgeyByZXR1cm4gb3ZlcmxvYWRIeXN0ZXJlc2lzXzsgfQorCisgIC8qKgorICAgKiBTZXQgZnJhY3Rpb24gb2YgbWF4aW11bSBsaW1pdHMgYmVmb3JlIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpcyBjbGVhcmVkLgorICAgKiBBIGdvb2QgdmFsdWUgd291bGQgcHJvYmFibHkgYmUgYmV0d2VlbiAwLjUgYW5kIDAuOS4KKyAgICoKKyAgICogQHBhcmFtIGh5c3RlcmVzaXNGcmFjdGlvbiBmcmFjdGlvbiA8PSAxLjAuCisgICAqLworICB2b2lkIHNldE92ZXJsb2FkSHlzdGVyZXNpcyhkb3VibGUgaHlzdGVyZXNpc0ZyYWN0aW9uKSB7CisgICAgaWYgKGh5c3RlcmVzaXNGcmFjdGlvbiA8PSAxLjAgJiYgaHlzdGVyZXNpc0ZyYWN0aW9uID4gMC4wKSB7CisgICAgICBvdmVybG9hZEh5c3RlcmVzaXNfID0gaHlzdGVyZXNpc0ZyYWN0aW9uOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGFjdGlvbiB0aGUgc2VydmVyIHdpbGwgdGFrZSBvbiBvdmVybG9hZC4KKyAgICoKKyAgICogQHJldHVybiBhIFRPdmVybG9hZEFjdGlvbiBlbnVtIHZhbHVlIGZvciB0aGUgY3VycmVudGx5IHNldCBhY3Rpb24uCisgICAqLworICBUT3ZlcmxvYWRBY3Rpb24gZ2V0T3ZlcmxvYWRBY3Rpb24oKSBjb25zdCB7IHJldHVybiBvdmVybG9hZEFjdGlvbl87IH0KKworICAvKioKKyAgICogU2V0IHRoZSBhY3Rpb24gdGhlIHNlcnZlciBpcyB0byB0YWtlIG9uIG92ZXJsb2FkLgorICAgKgorICAgKiBAcGFyYW0gb3ZlcmxvYWRBY3Rpb24gYSBUT3ZlcmxvYWRBY3Rpb24gZW51bSB2YWx1ZSBmb3IgdGhlIGFjdGlvbi4KKyAgICovCisgIHZvaWQgc2V0T3ZlcmxvYWRBY3Rpb24oVE92ZXJsb2FkQWN0aW9uIG92ZXJsb2FkQWN0aW9uKSB7IG92ZXJsb2FkQWN0aW9uXyA9IG92ZXJsb2FkQWN0aW9uOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggYSB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgorICAgKgorICAgKiBAcmV0dXJuIGEgNjQtYml0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICAgKi8KKyAgaW50NjRfdCBnZXRUYXNrRXhwaXJlVGltZSgpIGNvbnN0IHsgcmV0dXJuIHRhc2tFeHBpcmVUaW1lXzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIGEgdGFzayBleHBpcmVzICgwID09IGluZmluaXRlKS4KKyAgICoKKyAgICogQHBhcmFtIHRhc2tFeHBpcmVUaW1lIGEgNjQtYml0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICAgKi8KKyAgdm9pZCBzZXRUYXNrRXhwaXJlVGltZShpbnQ2NF90IHRhc2tFeHBpcmVUaW1lKSB7IHRhc2tFeHBpcmVUaW1lXyA9IHRhc2tFeHBpcmVUaW1lOyB9CisKKyAgLyoqCisgICAqIERldGVybWluZSBpZiB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBvdmVybG9hZGVkLgorICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgbWF4aW11bXMgZm9yIG9wZW4gY29ubmVjdGlvbnMgYW5kIGNvbm5lY3Rpb25zCisgICAqIGN1cnJlbnRseSBpbiBwcm9jZXNzaW5nLCBhbmQgc2V0cyBhbiBvdmVybG9hZCBjb25kaXRpb24gaWYgdGhleSBhcmUKKyAgICogZXhjZWVkZWQuICBUaGUgb3ZlcmxvYWQgd2lsbCBwZXJzaXN0IHVudGlsIGJvdGggdmFsdWVzIGFyZSBiZWxvdyB0aGUKKyAgICogY3VycmVudCBoeXN0ZXJlc2lzIGZyYWN0aW9uIG9mIHRoZWlyIG1heGltdW1zLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgYW4gb3ZlcmxvYWQgY29uZGl0aW9uIGV4aXN0cywgZmFsc2UgaWYgbm90LgorICAgKi8KKyAgYm9vbCBzZXJ2ZXJPdmVybG9hZGVkKCk7CisKKyAgLyoqIFBvcCBhbmQgZGlzY2FyZCBuZXh0IHRhc2sgb24gdGhyZWFkcG9vbCB3YWl0IHF1ZXVlLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgYSB0YXNrIHdhcyBkaXNjYXJkZWQsIGZhbHNlIGlmIHRoZSB3YWl0IHF1ZXVlIHdhcyBlbXB0eS4KKyAgICovCisgIGJvb2wgZHJhaW5QZW5kaW5nVGFzaygpOworCisgIC8qKgorICAgKiBHZXQgdGhlIHN0YXJ0aW5nIHNpemUgb2YgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIuCisgICAqCisgICAqIEByZXR1cm4gIyBieXRlcyB3ZSBpbml0aWFsaXplIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyIHRvLgorICAgKi8KKyAgc2l6ZV90IGdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSBjb25zdCB7IHJldHVybiB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXzsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIHN0YXJ0aW5nIHNpemUgb2YgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIuCisgICAqCisgICAqIEBwYXJhbSBzaXplICMgYnl0ZXMgd2UgaW5pdGlhbGl6ZSBhIFRDb25uZWN0aW9uIG9iamVjdCdzIHdyaXRlIGJ1ZmZlciB0by4KKyAgICovCisgIHZvaWQgc2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZShzaXplX3Qgc2l6ZSkgeyB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyA9IHNpemU7IH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KKyAgICoKKyAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIGRlYWxsb2MgaWRsZSBidWZmZXIuCisgICAqLworICBzaXplX3QgZ2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGlkbGVSZWFkQnVmZmVyTGltaXRfOyB9CisKKyAgLyoqCisgICAqIFtOT1RFOiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIGdldElkbGVSZWFkQnVmZmVyTGltaXQoKS5dCisgICAqIEdldCB0aGUgbWF4aW11bSBzaXplIG9mIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCisgICAqCisgICAqIEByZXR1cm4gIyBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBkZWFsbG9jIGlkbGUgYnVmZmVyLgorICAgKi8KKyAgc2l6ZV90IGdldElkbGVCdWZmZXJNZW1MaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGlkbGVSZWFkQnVmZmVyTGltaXRfOyB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIHJlYWQgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCisgICAqIElmIGEgVENvbm5lY3Rpb24gb2JqZWN0IGlzIGZvdW5kIChlaXRoZXIgb24gY29ubmVjdGlvbiBjbG9zZSBvciBiZXR3ZWVuCisgICAqIGNhbGxzIHdoZW4gcmVzaXplQnVmZmVyRXZlcnlOXyBpcyBzZXQpIHdpdGggbW9yZSB0aGFuIHRoaXMgbXVjaCBtZW1vcnkKKyAgICogYWxsb2NhdGVkIHRvIGl0cyByZWFkIGJ1ZmZlciwgd2UgZnJlZSBpdCBhbmQgYWxsb3cgaXQgdG8gYmUgcmVpbml0aWFsaXplZAorICAgKiBvbiB0aGUgbmV4dCByZWNlaXZlZCBmcmFtZS4KKyAgICoKKyAgICogQHBhcmFtIGxpbWl0IG9mIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gY2hlY2tlZC4KKyAgICovCisgIHZvaWQgc2V0SWRsZVJlYWRCdWZmZXJMaW1pdChzaXplX3QgbGltaXQpIHsgaWRsZVJlYWRCdWZmZXJMaW1pdF8gPSBsaW1pdDsgfQorCisgIC8qKgorICAgKiBbTk9URTogVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHVzZSBzZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCkuXQorICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgorICAgKiBJZiBhIFRDb25uZWN0aW9uIG9iamVjdCBpcyBmb3VuZCAoZWl0aGVyIG9uIGNvbm5lY3Rpb24gY2xvc2Ugb3IgYmV0d2VlbgorICAgKiBjYWxscyB3aGVuIHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gaXMgc2V0KSB3aXRoIG1vcmUgdGhhbiB0aGlzIG11Y2ggbWVtb3J5CisgICAqIGFsbG9jYXRlZCB0byBpdHMgcmVhZCBidWZmZXIsIHdlIGZyZWUgaXQgYW5kIGFsbG93IGl0IHRvIGJlIHJlaW5pdGlhbGl6ZWQKKyAgICogb24gdGhlIG5leHQgcmVjZWl2ZWQgZnJhbWUuCisgICAqCisgICAqIEBwYXJhbSBsaW1pdCBvZiBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCBzaHJpbmsgYnVmZmVycyB3aGVuIGNoZWNrZWQuCisgICAqLworICB2b2lkIHNldElkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgbGltaXQpIHsgaWRsZVJlYWRCdWZmZXJMaW1pdF8gPSBsaW1pdDsgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB3cml0ZSBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KKyAgICoKKyAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHJlYWxsb2NhdGUgYnVmZmVycyB3aGVuIGNoZWNrZWQuCisgICAqLworICBzaXplX3QgZ2V0SWRsZVdyaXRlQnVmZmVyTGltaXQoKSBjb25zdCB7IHJldHVybiBpZGxlV3JpdGVCdWZmZXJMaW1pdF87IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgd3JpdGUgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCisgICAqIElmIGEgVENvbm5lY3Rpb24gb2JqZWN0IGlzIGZvdW5kIChlaXRoZXIgb24gY29ubmVjdGlvbiBjbG9zZSBvciBiZXR3ZWVuCisgICAqIGNhbGxzIHdoZW4gcmVzaXplQnVmZmVyRXZlcnlOXyBpcyBzZXQpIHdpdGggbW9yZSB0aGFuIHRoaXMgbXVjaCBtZW1vcnkKKyAgICogYWxsb2NhdGVkIHRvIGl0cyB3cml0ZSBidWZmZXIsIHdlIGRlc3Ryb3kgYW5kIGNvbnN0cnVjdCB0aGF0IGJ1ZmZlciB3aXRoCisgICAqIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfIGJ5dGVzLgorICAgKgorICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBpZGxlLgorICAgKi8KKyAgdm9pZCBzZXRJZGxlV3JpdGVCdWZmZXJMaW1pdChzaXplX3QgbGltaXQpIHsgaWRsZVdyaXRlQnVmZmVyTGltaXRfID0gbGltaXQ7IH0KKworICAvKioKKyAgICogR2V0ICMgb2YgY2FsbHMgbWFkZSBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4gIDAgbWVhbnMgZGlzYWJsZWQuCisgICAqCisgICAqIEByZXR1cm4gIyBvZiBjYWxscyBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4KKyAgICovCisgIGludDMyX3QgZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkgY29uc3QgeyByZXR1cm4gcmVzaXplQnVmZmVyRXZlcnlOXzsgfQorCisgIC8qKgorICAgKiBDaGVjayBidWZmZXIgc2l6ZXMgZXZlcnkgImNvdW50IiBjYWxscy4gIFRoaXMgYWxsb3dzIGJ1ZmZlciBsaW1pdHMKKyAgICogdG8gYmUgZW5mb3JjZWQgZm9yIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2l0aCBhIGNvbnRyb2xsYWJsZSBkZWdyZWUKKyAgICogb2Ygb3ZlcmhlYWQuIDAgZGlzYWJsZXMgY2hlY2tzIGV4Y2VwdCBhdCBjb25uZWN0aW9uIGNsb3NlLgorICAgKgorICAgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiBjYWxscyBiZXR3ZWVuIGNoZWNrcywgb3IgMCB0byBkaXNhYmxlCisgICAqLworICB2b2lkIHNldFJlc2l6ZUJ1ZmZlckV2ZXJ5TihpbnQzMl90IGNvdW50KSB7IHJlc2l6ZUJ1ZmZlckV2ZXJ5Tl8gPSBjb3VudDsgfQorCisgIC8qKgorICAgKiBNYWluIHdvcmtob3JzZSBmdW5jdGlvbiwgc3RhcnRzIHVwIHRoZSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgcG9ydCBhbmQKKyAgICogbG9vcHMgb3ZlciB0aGUgbGliZXZlbnQgaGFuZGxlci4KKyAgICovCisgIHZvaWQgc2VydmUoKTsKKworICAvKioKKyAgICogQ2F1c2VzIHRoZSBzZXJ2ZXIgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgKGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkKS4KKyAgICovCisgIHZvaWQgc3RvcCgpOworCisgIC8vLyBDcmVhdGVzIGEgc29ja2V0IHRvIGxpc3RlbiBvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGxvY2FsIHBvcnQuCisgIHZvaWQgY3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKTsKKworICAvKioKKyAgICogUmVnaXN0ZXIgdGhlIG9wdGlvbmFsIHVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSAoZm9yIHNpbmdsZS10aHJlYWQgc2VydmVycykKKyAgICoKKyAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgaW4gYSBzaW5nbGUtdGhyZWFkCisgICAqIG1vZGUsIGFuZCB0aGUgZXZlbnQgYmFzZSBpcyBwcm92aWRlZCBieSB0aGUgdXNlciAoaS5lLiwgdGhlIGNhbGxlcikuCisgICAqCisgICAqIEBwYXJhbSB1c2VyX2V2ZW50X2Jhc2UgdGhlIHVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZS4gVGhlIHVzZXIgaXMKKyAgICogcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIGV2ZW50IGJhc2UgbWVtb3J5LgorICAgKi8KKyAgdm9pZCByZWdpc3RlckV2ZW50cyhldmVudF9iYXNlKiB1c2VyX2V2ZW50X2Jhc2UpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCB1c2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgKGZvciBzaW5nbGUtdGhyZWFkIHNlcnZlcnMpLgorICAgKi8KKyAgZXZlbnRfYmFzZSogZ2V0VXNlckV2ZW50QmFzZSgpIGNvbnN0IHsgcmV0dXJuIHVzZXJFdmVudEJhc2VfOyB9CisKKyAgLyoqIFNvbWUgdHJhbnNwb3J0cywgbGlrZSBUSGVhZGVyVHJhbnNwb3J0LCByZXF1aXJlIHBhc3NpbmcgdGhyb3VnaAorICAgKiB0aGUgZnJhbWluZyBzaXplIGluc3RlYWQgb2Ygc3RyaXBwaW5nIGl0LgorICAgKi8KKyAgYm9vbCBnZXRIZWFkZXJUcmFuc3BvcnQoKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlIHRocmVhZG1hbmFnZXIgY2FsbHMgd2hlbiBhIHRhc2sgcmVhY2hlcworICAgKiBpdHMgZXhwaXJhdGlvbiB0aW1lLiAgSXQgaXMgbmVlZGVkIHRvIGNsZWFuIHVwIHRoZSBleHBpcmVkIGNvbm5lY3Rpb24uCisgICAqCisgICAqIEBwYXJhbSB0YXNrIHRoZSBydW5uYWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4cGlyZWQgdGFzay4KKyAgICovCisgIHZvaWQgZXhwaXJlQ2xvc2Uoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKKworICAvKioKKyAgICogUmV0dXJuIGFuIGluaXRpYWxpemVkIGNvbm5lY3Rpb24gb2JqZWN0LiAgQ3JlYXRlcyBvciByZWNvdmVycyBmcm9tCisgICAqIHBvb2wgYSBUQ29ubmVjdGlvbiBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgc29ja2V0IEZECisgICAqIGFuZCBmbGFncy4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBGRCBvZiBzb2NrZXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbi4KKyAgICogQHBhcmFtIGFkZHIgdGhlIHNvY2thZGRyIG9mIHRoZSBjbGllbnQKKyAgICogQHBhcmFtIGFkZHJMZW4gdGhlIGxlbmd0aCBvZiBhZGRyCisgICAqIEByZXR1cm4gcG9pbnRlciB0byBpbml0aWFsaXplZCBUQ29ubmVjdGlvbiBvYmplY3QuCisgICAqLworICBUQ29ubmVjdGlvbiogY3JlYXRlQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KTsKKworICAvKioKKyAgICogUmV0dXJucyBhIGNvbm5lY3Rpb24gdG8gcG9vbCBvciBkZWxldGlvbi4gIElmIHRoZSBjb25uZWN0aW9uIHBvb2wKKyAgICogKGEgc3RhY2spIGlzbid0IGZ1bGwsIHBsYWNlIHRoZSBjb25uZWN0aW9uIG9iamVjdCBvbiBpdCwgb3RoZXJ3aXNlCisgICAqIGp1c3QgZGVsZXRlIGl0LgorICAgKgorICAgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgVENvbmVjdGlvbiBiZWluZyByZXR1cm5lZC4KKyAgICovCisgIHZvaWQgcmV0dXJuQ29ubmVjdGlvbihUQ29ubmVjdGlvbiogY29ubmVjdGlvbik7Cit9OworCitjbGFzcyBUTm9uYmxvY2tpbmdJT1RocmVhZCA6IHB1YmxpYyBSdW5uYWJsZSB7CitwdWJsaWM6CisgIC8vIENyZWF0ZXMgYW4gSU8gdGhyZWFkIGFuZCBzZXRzIHVwIHRoZSBldmVudCBiYXNlLiAgVGhlIGxpc3RlblNvY2tldCBzaG91bGQKKyAgLy8gYmUgYSB2YWxpZCBGRCBvbiB3aGljaCBsaXN0ZW4oKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4gIElmIHRoZQorICAvLyBsaXN0ZW5Tb2NrZXQgaXMgPCAwLCBhY2NlcHRpbmcgd2lsbCBub3QgYmUgZG9uZS4KKyAgVE5vbmJsb2NraW5nSU9UaHJlYWQoVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TT0NLRVQgbGlzdGVuU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUhpZ2hQcmlvcml0eSk7CisKKyAgflROb25ibG9ja2luZ0lPVGhyZWFkKCk7CisKKyAgLy8gUmV0dXJucyB0aGUgZXZlbnQtYmFzZSBmb3IgdGhpcyB0aHJlYWQuCisgIGV2ZW50X2Jhc2UqIGdldEV2ZW50QmFzZSgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50QmFzZV87IH0KKworICAvLyBSZXR1cm5zIHRoZSBzZXJ2ZXIgZm9yIHRoaXMgdGhyZWFkLgorICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIGdldFNlcnZlcigpIGNvbnN0IHsgcmV0dXJuIHNlcnZlcl87IH0KKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhpcyBJTyB0aHJlYWQuCisgIGludCBnZXRUaHJlYWROdW1iZXIoKSBjb25zdCB7IHJldHVybiBudW1iZXJfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgdGhyZWFkIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gIFRoaXMgc2hvdWxkCisgIC8vIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSB0aHJlYWQgaGFzIGJlZW4gc3RhcnRlZC4KKyAgVGhyZWFkOjppZF90IGdldFRocmVhZElkKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkSWRfOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgc2VuZC1mZCBmb3IgdGFzayBjb21wbGV0ZSBub3RpZmljYXRpb25zLgorICBldnV0aWxfc29ja2V0X3QgZ2V0Tm90aWZpY2F0aW9uU2VuZEZEKCkgY29uc3QgeyByZXR1cm4gbm90aWZpY2F0aW9uUGlwZUZEc19bMV07IH0KKworICAvLyBSZXR1cm5zIHRoZSByZWFkLWZkIGZvciB0YXNrIGNvbXBsZXRlIG5vdGlmaWNhdGlvbnMuCisgIGV2dXRpbF9zb2NrZXRfdCBnZXROb3RpZmljYXRpb25SZWN2RkQoKSBjb25zdCB7IHJldHVybiBub3RpZmljYXRpb25QaXBlRkRzX1swXTsgfQorCisgIC8vIFJldHVybnMgdGhlIGFjdHVhbCB0aHJlYWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElPIHRocmVhZC4KKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gZ2V0VGhyZWFkKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkXzsgfQorCisgIC8vIFNldHMgdGhlIGFjdHVhbCB0aHJlYWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElPIHRocmVhZC4KKyAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4mIHQpIHsgdGhyZWFkXyA9IHQ7IH0KKworICAvLyBVc2VkIGJ5IFRDb25uZWN0aW9uIG9iamVjdHMgdG8gaW5kaWNhdGUgcHJvY2Vzc2luZyBoYXMgZmluaXNoZWQuCisgIGJvb2wgbm90aWZ5KFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIGNvbm4pOworCisgIC8vIEVudGVycyB0aGUgZXZlbnQgbG9vcCBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIGEgY2FsbCB0byBzdG9wKCkuCisgIHZpcnR1YWwgdm9pZCBydW4oKTsKKworICAvLyBFeGl0cyB0aGUgZXZlbnQgbG9vcCBhcyBzb29uIGFzIHBvc3NpYmxlLgorICB2b2lkIHN0b3AoKTsKKworICAvLyBFbnN1cmVzIHRoYXQgdGhlIGV2ZW50LWxvb3AgdGhyZWFkIGlzIGZ1bGx5IGZpbmlzaGVkIGFuZCBzaHV0IGRvd24uCisgIHZvaWQgam9pbigpOworCisgIC8vLyBSZWdpc3RlcnMgdGhlIGV2ZW50cyBmb3IgdGhlIG5vdGlmaWNhdGlvbiAmIGxpc3RlbiBzb2NrZXRzCisgIHZvaWQgcmVnaXN0ZXJFdmVudHMoKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEMtY2FsbGFibGUgZXZlbnQgaGFuZGxlciBmb3Igc2lnbmFsaW5nIHRhc2sgY29tcGxldGlvbi4gIFByb3ZpZGVzIGEKKyAgICogY2FsbGJhY2sgdGhhdCBsaWJldmVudCBjYW4gdW5kZXJzdGFuZCB0aGF0IHdpbGwgcmVhZCBhIGNvbm5lY3Rpb24KKyAgICogb2JqZWN0J3MgYWRkcmVzcyBmcm9tIGEgcGlwZSBhbmQgY2FsbCBjb25uZWN0aW9uLT50cmFuc2l0aW9uKCkgZm9yCisgICAqIHRoYXQgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgdGhlIGV2ZW50IG9jY3VycmVkIG9uLgorICAgKi8KKyAgc3RhdGljIHZvaWQgbm90aWZ5SGFuZGxlcihldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IHdoaWNoLCB2b2lkKiB2KTsKKworICAvKioKKyAgICogQy1jYWxsYWJsZSBldmVudCBoYW5kbGVyIGZvciBsaXN0ZW5lciBldmVudHMuICBQcm92aWRlcyBhIGNhbGxiYWNrCisgICAqIHRoYXQgbGliZXZlbnQgY2FuIHVuZGVyc3RhbmQgd2hpY2ggaW52b2tlcyBzZXJ2ZXItPmhhbmRsZUV2ZW50KCkuCisgICAqCisgICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciB0aGUgZXZlbnQgb2NjdXJyZWQgb24uCisgICAqIEBwYXJhbSB3aGljaCB0aGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KKyAgICogQHBhcmFtIHYgdm9pZCogY2FsbGJhY2sgYXJnIHdoZXJlIHdlIHBsYWNlZCBUTm9uYmxvY2tpbmdTZXJ2ZXIncyAidGhpcyIuCisgICAqLworICBzdGF0aWMgdm9pZCBsaXN0ZW5IYW5kbGVyKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQqIHYpIHsKKyAgICAoKFROb25ibG9ja2luZ1NlcnZlciopdiktPmhhbmRsZUV2ZW50KGZkLCB3aGljaCk7CisgIH0KKworICAvLy8gRXhpdHMgdGhlIGxvb3AgQVNBUCBpbiBjYXNlIG9mIHNodXRkb3duIG9yIGVycm9yLgorICB2b2lkIGJyZWFrTG9vcChib29sIGVycm9yKTsKKworICAvLy8gQ3JlYXRlIHRoZSBwaXBlIHVzZWQgdG8gbm90aWZ5IEkvTyBwcm9jZXNzIG9mIHRhc2sgY29tcGxldGlvbi4KKyAgdm9pZCBjcmVhdGVOb3RpZmljYXRpb25QaXBlKCk7CisKKyAgLy8vIFVucmVnaXN0ZXJzIG91ciBldmVudHMgZm9yIG5vdGlmaWNhdGlvbiBhbmQgbGlzdGVuIHNvY2tldHMuCisgIHZvaWQgY2xlYW51cEV2ZW50cygpOworCisgIC8vLyBTZXRzIChvciBjbGVhcnMpIGhpZ2ggcHJpb3JpdHkgc2NoZWR1bGluZyBzdGF0dXMgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgdm9pZCBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGJvb2wgdmFsdWUpOworCitwcml2YXRlOgorICAvLy8gYXNzb2NpYXRlZCBzZXJ2ZXIKKyAgVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXJfOworCisgIC8vLyB0aHJlYWQgbnVtYmVyIChmb3IgZGVidWdnaW5nKS4KKyAgY29uc3QgaW50IG51bWJlcl87CisKKyAgLy8vIFRoZSBhY3R1YWwgcGh5c2ljYWwgdGhyZWFkIGlkLgorICBUaHJlYWQ6OmlkX3QgdGhyZWFkSWRfOworCisgIC8vLyBJZiBsaXN0ZW5Tb2NrZXRfID49IDAsIGFkZHMgYW4gZXZlbnQgb24gdGhlIGV2ZW50X2Jhc2UgdG8gYWNjZXB0IGNvbm5zCisgIFRIUklGVF9TT0NLRVQgbGlzdGVuU29ja2V0XzsKKworICAvLy8gU2V0cyBhIGhpZ2ggc2NoZWR1bGluZyBwcmlvcml0eSB3aGVuIHJ1bm5pbmcKKyAgYm9vbCB1c2VIaWdoUHJpb3JpdHlfOworCisgIC8vLyBwb2ludGVyIHRvIGV2ZW50YmFzZSB0byBiZSB1c2VkIGZvciBsb29waW5nCisgIGV2ZW50X2Jhc2UqIGV2ZW50QmFzZV87CisKKyAgLy8vIFNldCB0byB0cnVlIGlmIHRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIGV2ZW50IGJhc2UKKyAgLy8vIG1lbW9yeS4KKyAgYm9vbCBvd25FdmVudEJhc2VfOworCisgIC8vLyBVc2VkIHdpdGggZXZlbnRCYXNlXyBmb3IgY29ubmVjdGlvbiBldmVudHMgKG9ubHkgaW4gbGlzdGVuZXIgdGhyZWFkKQorICBzdHJ1Y3QgZXZlbnQgc2VydmVyRXZlbnRfOworCisgIC8vLyBVc2VkIHdpdGggZXZlbnRCYXNlXyBmb3IgdGFzayBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbgorICBzdHJ1Y3QgZXZlbnQgbm90aWZpY2F0aW9uRXZlbnRfOworCisgIC8vLyBGaWxlIGRlc2NyaXB0b3JzIGZvciBwaXBlIHVzZWQgZm9yIHRhc2sgY29tcGxldGlvbiBub3RpZmljYXRpb24uCisgIGV2dXRpbF9zb2NrZXRfdCBub3RpZmljYXRpb25QaXBlRkRzX1syXTsKKworICAvLy8gQWN0dWFsIElPIFRocmVhZAorICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzMxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAoraW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHMgPSAoMSA8PCAyNCkpIHsKKyAgc3RydWN0IHJsaW1pdCBmZG1heHJsOworCisgIGZvciAoZmRtYXhybC5ybGltX2N1ciA9IG1heF9mZHMsIGZkbWF4cmwucmxpbV9tYXggPSBtYXhfZmRzOworICAgICAgIG1heF9mZHMgJiYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmZmRtYXhybCkgPCAwKTsKKyAgICAgICBmZG1heHJsLnJsaW1fY3VyID0gbWF4X2ZkcywgZmRtYXhybC5ybGltX21heCA9IG1heF9mZHMpIHsKKyAgICBtYXhfZmRzIC89IDI7CisgIH0KKworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihmZG1heHJsLnJsaW1fY3VyKTsKK30KKyNlbmRpZgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmQ4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJfSF8KKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7CisKKy8qKgorICogVmlydHVhbCBpbnRlcmZhY2UgY2xhc3MgdGhhdCBjYW4gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIgY29yZS4gVG8KKyAqIHVzZSB0aGlzIHlvdSBzaG91bGQgc3ViY2xhc3MgaXQgYW5kIGltcGxlbWVudCB0aGUgbWV0aG9kcyB0aGF0IHlvdSBjYXJlCisgKiBhYm91dC4gWW91ciBzdWJjbGFzcyBjYW4gYWxzbyBzdG9yZSBsb2NhbCBkYXRhIHRoYXQgeW91IG1heSBjYXJlIGFib3V0LAorICogc3VjaCBhcyBhZGRpdGlvbmFsICJhcmd1bWVudHMiIHRvIHRoZXNlIG1ldGhvZHMgKHN0b3JlZCBpbiB0aGUgb2JqZWN0CisgKiBpbnN0YW5jZSdzIHN0YXRlKS4KKyAqLworY2xhc3MgVFNlcnZlckV2ZW50SGFuZGxlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7fQorCisgIC8qKgorICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkge30KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQqIGNyZWF0ZUNvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICAodm9pZClpbnB1dDsKKyAgICAodm9pZClvdXRwdXQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gZGVsZXRlIHNlcnZlcgorICAgKiBjb250ZXh0LgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGRlbGV0ZUNvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGEgY2xpZW50IGlzIGFib3V0IHRvIGNhbGwgdGhlIHByb2Nlc3Nvci4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CisgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKKyAgICAodm9pZCl0cmFuc3BvcnQ7CisgIH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogUHJldmVudCBkaXJlY3QgaW5zdGFudGlhdGlvbi4KKyAgICovCisgIFRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7fQorfTsKKworLyoqCisgKiBUaHJpZnQgc2VydmVyLgorICoKKyAqLworY2xhc3MgVFNlcnZlciA6IHB1YmxpYyBjb25jdXJyZW5jeTo6UnVubmFibGUgeworcHVibGljOgorICB2aXJ0dWFsIH5UU2VydmVyKCkge30KKworICB2aXJ0dWFsIHZvaWQgc2VydmUoKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIHN0b3AoKSB7fQorCisgIC8vIEFsbG93cyBydW5uaW5nIHRoZSBzZXJ2ZXIgYXMgYSBSdW5uYWJsZSB0aHJlYWQKKyAgdmlydHVhbCB2b2lkIHJ1bigpIHsgc2VydmUoKTsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gZ2V0UHJvY2Vzc29yRmFjdG9yeSgpIHsgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IGdldFNlcnZlclRyYW5zcG9ydCgpIHsgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldElucHV0UHJvdG9jb2xGYWN0b3J5KCkgeyByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpIHsgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQorCitwcm90ZWN0ZWQ6CisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIH0KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yKQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIH0KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIH0KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIH0KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSkge30KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQorCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyhvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KKworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyhvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCisgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KKworICAvKioKKyAgICogR2V0IGEgVFByb2Nlc3NvciB0byBoYW5kbGUgY2FsbHMgb24gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24uCisgICAqCisgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBjb25uZWN0aW9uIChuZXZlciBvbmNlIHBlcgorICAgKiBjYWxsKS4gIFRoaXMgYWxsb3dzIHRoZSBUUHJvY2Vzc29yRmFjdG9yeSB0byByZXR1cm4gYSBkaWZmZXJlbnQgcHJvY2Vzc29yCisgICAqIGZvciBlYWNoIGNvbm5lY3Rpb24gaWYgaXQgZGVzaXJlcy4KKyAgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICAgIFRDb25uZWN0aW9uSW5mbyBjb25uSW5mbzsKKyAgICBjb25uSW5mby5pbnB1dCA9IGlucHV0UHJvdG9jb2w7CisgICAgY29ubkluZm8ub3V0cHV0ID0gb3V0cHV0UHJvdG9jb2w7CisgICAgY29ubkluZm8udHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIHJldHVybiBwcm9jZXNzb3JGYWN0b3J5Xy0+Z2V0UHJvY2Vzc29yKGNvbm5JbmZvKTsKKyAgfQorCisgIC8vIENsYXNzIHZhcmlhYmxlcworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0XzsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CisKK3B1YmxpYzoKKyAgdm9pZCBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKKyAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICB9CisKKyAgdm9pZCBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkgeworICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgfQorCisgIHZvaWQgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgIH0KKworICB2b2lkIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgfQorCisgIHZvaWQgc2V0U2VydmVyRXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKKyAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOworICB9Cit9OworCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBpbmNyZWFzZSB0aGUgbWF4IGZpbGUgZGVzY3JpcHRvcnMgbGltaXQKKyAqIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLgorICogQnkgZGVmYXVsdCwgdHJpZXMgdG8gaW5jcmVhc2UgaXQgdG8gYXMgbXVjaCBhcyAyXjI0LgorICovCisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAoraW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHMgPSAoMSA8PCAyNCkpOworI2VuZGlmCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlYWEyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIHN0ZDo6YmluZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgc3RkOjpzdHJpbmc7CisKK1RTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICBjbGllbnRzXygwKSwKKyAgICBod21fKDApLAorICAgIGxpbWl0XyhJTlQ2NF9NQVgpIHsKK30KKworVFNlcnZlckZyYW1ld29yazo6VFNlcnZlckZyYW1ld29yayhjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAorICAgIGNsaWVudHNfKDApLAorICAgIGh3bV8oMCksCisgICAgbGltaXRfKElOVDY0X01BWCkgeworfQorCitUU2VydmVyRnJhbWV3b3JrOjpUU2VydmVyRnJhbWV3b3JrKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgY2xpZW50c18oMCksCisgICAgaHdtXygwKSwKKyAgICBsaW1pdF8oSU5UNjRfTUFYKSB7Cit9CisKK1RTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXIocHJvY2Vzc29yLAorICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICBjbGllbnRzXygwKSwKKyAgICBod21fKDApLAorICAgIGxpbWl0XyhJTlQ2NF9NQVgpIHsKK30KKworVFNlcnZlckZyYW1ld29yazo6flRTZXJ2ZXJGcmFtZXdvcmsoKSB7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgcmVsZWFzZU9uZURlc2NyaXB0b3IoY29uc3Qgc3RyaW5nJiBuYW1lLCBUJiBwVHJhbnNwb3J0KSB7CisgIGlmIChwVHJhbnNwb3J0KSB7CisgICAgdHJ5IHsKKyAgICAgIHBUcmFuc3BvcnQtPmNsb3NlKCk7CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2VydmVyRnJhbWV3b3JrICIgKyBuYW1lICsgIiBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6c2VydmUoKSB7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY2xpZW50OworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0OworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydDsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2w7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbDsKKworICAvLyBTdGFydCB0aGUgc2VydmVyIGxpc3RlbmluZworICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKKworICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50IHRvIGluZGljYXRlIHNlcnZlciBpcyBub3cgbGlzdGVuaW5nCisgIC8vIGFuZCB0aGF0IGl0IGlzIHNhZmUgdG8gY29ubmVjdC4KKyAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOworICB9CisKKyAgLy8gRmV0Y2ggY2xpZW50IGZyb20gc2VydmVyCisgIGZvciAoOzspIHsKKyAgICB0cnkgeworICAgICAgLy8gRGVyZWZlcmVuY2UgYW55IHJlc291cmNlcyBmcm9tIGFueSBwcmV2aW91cyBjbGllbnQgY3JlYXRpb24KKyAgICAgIC8vIHN1Y2ggdGhhdCBhIGJsb2NraW5nIGFjY2VwdCBkb2VzIG5vdCBob2xkIHRoZW0gaW5kZWZpbml0ZWx5LgorICAgICAgb3V0cHV0UHJvdG9jb2wucmVzZXQoKTsKKyAgICAgIGlucHV0UHJvdG9jb2wucmVzZXQoKTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydC5yZXNldCgpOworICAgICAgaW5wdXRUcmFuc3BvcnQucmVzZXQoKTsKKyAgICAgIGNsaWVudC5yZXNldCgpOworCisgICAgICAvLyBJZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY29uY3VycmVudAorICAgICAgLy8gY2xpZW50cyBhbGxvd2VkLCB3YWl0IGZvciBvbmUgb3IgbW9yZSBjbGllbnRzIHRvIGRyYWluIGJlZm9yZQorICAgICAgLy8gYWNjZXB0aW5nIGFub3RoZXIuCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICAgICAgICB3aGlsZSAoY2xpZW50c18gPj0gbGltaXRfKSB7CisgICAgICAgICAgbW9uXy53YWl0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy0+YWNjZXB0KCk7CisKKyAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICBpZiAoIW91dHB1dFByb3RvY29sRmFjdG9yeV8pIHsKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQsIG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworICAgICAgfQorCisgICAgICBuZXdseUNvbm5lY3RlZENsaWVudChzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+KAorICAgICAgICAgIG5ldyBUQ29ubmVjdGVkQ2xpZW50KGdldFByb2Nlc3NvcihpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSwKKyAgICAgICAgICBiaW5kKCZUU2VydmVyRnJhbWV3b3JrOjpkaXNwb3NlQ29ubmVjdGVkQ2xpZW50LCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKSk7CisKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICAgIHJlbGVhc2VPbmVEZXNjcmlwdG9yKCJpbnB1dFRyYW5zcG9ydCIsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgIHJlbGVhc2VPbmVEZXNjcmlwdG9yKCJvdXRwdXRUcmFuc3BvcnQiLCBvdXRwdXRUcmFuc3BvcnQpOworICAgICAgcmVsZWFzZU9uZURlc2NyaXB0b3IoImNsaWVudCIsIGNsaWVudCk7CisgICAgICBpZiAodHR4LmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpIHsKKyAgICAgICAgLy8gQWNjZXB0IHRpbWVvdXQgLSBjb250aW51ZSBwcm9jZXNzaW5nLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZiAodHR4LmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRQorICAgICAgICAgICAgICAgICB8fCB0dHguZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKSB7CisgICAgICAgIC8vIFNlcnZlciB3YXMgaW50ZXJydXB0ZWQuICBUaGlzIG9ubHkgaGFwcGVucyB3aGVuIHN0b3BwaW5nLgorICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFsbCBvdGhlciB0cmFuc3BvcnQgZXhjZXB0aW9ucyBhcmUgbG9nZ2VkLgorICAgICAgICAvLyBTdGF0ZSBvZiBjb25uZWN0aW9uIGlzIHVua25vd24uICBEb25lLgorICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2VydmVyVHJhbnNwb3J0IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKKyAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmVsZWFzZU9uZURlc2NyaXB0b3IoInNlcnZlclRyYW5zcG9ydCIsIHNlcnZlclRyYW5zcG9ydF8pOworfQorCitpbnQ2NF90IFRTZXJ2ZXJGcmFtZXdvcms6OmdldENvbmN1cnJlbnRDbGllbnRMaW1pdCgpIGNvbnN0IHsKKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIHJldHVybiBsaW1pdF87Cit9CisKK2ludDY0X3QgVFNlcnZlckZyYW1ld29yazo6Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkgY29uc3QgeworICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgcmV0dXJuIGNsaWVudHNfOworfQorCitpbnQ2NF90IFRTZXJ2ZXJGcmFtZXdvcms6OmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpIGNvbnN0IHsKKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIHJldHVybiBod21fOworfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdChpbnQ2NF90IG5ld0xpbWl0KSB7CisgIGlmIChuZXdMaW1pdCA8IDEpIHsKKyAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIm5ld0xpbWl0IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKKyAgfQorICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgbGltaXRfID0gbmV3TGltaXQ7CisgIGlmIChsaW1pdF8gLSBjbGllbnRzXyA+IDApIHsKKyAgICBtb25fLm5vdGlmeSgpOworICB9Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6c3RvcCgpIHsKKyAgLy8gT3JkZXIgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc2VydmUoKSByZWxlYXNlcyBzZXJ2ZXJUcmFuc3BvcnRfIHdoZW4gaXQgaXMKKyAgLy8gaW50ZXJydXB0ZWQsIHdoaWNoIGNsb3NlcyB0aGUgc29ja2V0IHRoYXQgaW50ZXJydXB0Q2hpbGRyZW4gdXNlcy4KKyAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6bmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgeworICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgICAgKytjbGllbnRzXzsKKyAgICBod21fID0gKHN0ZDo6bWF4KShod21fLCBjbGllbnRzXyk7CisgIH0KKworICBvbkNsaWVudENvbm5lY3RlZChwQ2xpZW50KTsKK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpkaXNwb3NlQ29ubmVjdGVkQ2xpZW50KFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIHsKKyAgb25DbGllbnREaXNjb25uZWN0ZWQocENsaWVudCk7CisgIGRlbGV0ZSBwQ2xpZW50OworCisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICBpZiAobGltaXRfIC0gLS1jbGllbnRzXyA+IDApIHsKKyAgICBtb25fLm5vdGlmeSgpOworICB9Cit9CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWFjY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSRlJBTUVXT1JLX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJGUkFNRVdPUktfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCisvKioKKyAqIFRTZXJ2ZXJGcmFtZXdvcmsgcHJvdmlkZXMgYSBzaW5nbGUgY29uc29saWRhdGVkIHByb2Nlc3NpbmcgbG9vcCBmb3IKKyAqIHNlcnZlcnMuICBCeSBoYXZpbmcgYSBzaW5nbGUgcHJvY2Vzc2luZyBsb29wLCBiZWhhdmlvciBiZXR3ZWVuIHNlcnZlcnMKKyAqIGlzIG1vcmUgcHJlZGljdGFibGUgYW5kIG1haW50ZW5hbmNlIGNvc3QgaXMgbG93ZXJlZC4gIEltcGxlbWVudGF0aW9ucworICogb2YgVFNlcnZlckZyYW1ld29yayBtdXN0IHByb3ZpZGUgYSBtZXRob2QgdG8gZGVhbCB3aXRoIGEgY2xpZW50IHRoYXQKKyAqIGNvbm5lY3RzIGFuZCBvbmUgdGhhdCBkaXNjb25uZWN0cy4KKyAqCisgKiBXaGlsZSB0aGlzIGZ1bmN0aW9uYWxpdHkgY291bGQgYmUgcm9sbGVkIGRpcmVjdGx5IGludG8gVFNlcnZlciwgYW5kCisgKiBwcm9iYWJseSBzaG91bGQgYmUsIGl0IHdvdWxkIGJyZWFrIHRoZSBUU2VydmVyIGludGVyZmFjZSBjb250cmFjdCBzbworICogdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHRoaXJkIHBhcnR5IHNlcnZlcnMsIG5vIFRTZXJ2ZXJzCisgKiB3ZXJlIGhhcm1lZCBpbiB0aGUgbWFraW5nIG9mIHRoaXMgY2xhc3MuCisgKi8KK2NsYXNzIFRTZXJ2ZXJGcmFtZXdvcmsgOiBwdWJsaWMgVFNlcnZlciB7CitwdWJsaWM6CisgIFRTZXJ2ZXJGcmFtZXdvcmsoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworCisgIFRTZXJ2ZXJGcmFtZXdvcmsoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKKworICBUU2VydmVyRnJhbWV3b3JrKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKworICBUU2VydmVyRnJhbWV3b3JrKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisKKyAgdmlydHVhbCB+VFNlcnZlckZyYW1ld29yaygpOworCisgIC8qKgorICAgKiBBY2NlcHQgY2xpZW50cyBmcm9tIHRoZSBUU2VydmVyVHJhbnNwb3J0IGFuZCBhZGQgdGhlbSBmb3IgcHJvY2Vzc2luZy4KKyAgICogQ2FsbCBzdG9wKCkgb24gYW5vdGhlciB0aHJlYWQgdG8gaW50ZXJydXB0IHByb2Nlc3NpbmcKKyAgICogYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBjYWxsZXIuCisgICAqIFBvc3QtY29uZGl0aW9ucyAocmV0dXJuIGd1YXJhbnRlZXMpOgorICAgKiAgIFRoZSBzZXJ2ZXJUcmFuc3BvcnQgd2lsbCBiZSBjbG9zZWQuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKKworICAvKioKKyAgICogSW50ZXJydXB0IHNlcnZlKCkgc28gdGhhdCBpdCBtZWV0cyBwb3N0LWNvbmRpdGlvbnMgYW5kIHJldHVybnMuCisgICAqLworICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworCisgIC8qKgorICAgKiBHZXQgdGhlIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0LgorICAgKiBccmV0dXJucyB0aGUgY29uY3VycmVudCBjbGllbnQgbGltaXQKKyAgICovCisgIHZpcnR1YWwgaW50NjRfdCBnZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSBjb25zdDsKKworICAvKioKKyAgICogR2V0IHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBjbGllbnRzLgorICAgKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cworICAgKi8KKyAgdmlydHVhbCBpbnQ2NF90IGdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpIGNvbnN0OworCisgIC8qKgorICAgKiBHZXQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICogXHJldHVybnMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cworICAgKi8KKyAgdmlydHVhbCBpbnQ2NF90IGdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpIGNvbnN0OworCisgIC8qKgorICAgKiBTZXQgdGhlIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0LiAgVGhpcyBjYW4gYmUgY2hhbmdlZCB3aGlsZQorICAgKiB0aGUgc2VydmVyIGlzIHNlcnZpbmcgaG93ZXZlciBpdCB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZQorICAgKiBlbmZvcmNlZCB1bnRpbCB0aGUgbmV4dCBjbGllbnQgaXMgYWNjZXB0ZWQgYW5kIGFkZGVkLiAgSWYgdGhlCisgICAqIGxpbWl0IGlzIGxvd2VyZWQgYmVsb3cgdGhlIG51bWJlciBvZiBjb25uZWN0ZWQgY2xpZW50cywgbm8KKyAgICogYWN0aW9uIGlzIHRha2VuIHRvIGRpc2Nvbm5lY3QgdGhlIGNsaWVudHMuCisgICAqIFRoZSBkZWZhdWx0IHZhbHVlIHVzZWQgaWYgdGhpcyBpcyBub3QgY2FsbGVkIGlzIElOVDY0X01BWC4KKyAgICogXHBhcmFtW2luXSAgbmV3TGltaXQgIHRoZSBuZXcgbGltaXQgb2YgY29uY3VycmVudCBjbGllbnRzCisgICAqIFx0aHJvd3Mgc3RkOjppbnZhbGlkX2FyZ3VtZW50IGlmIG5ld0xpbWl0IGlzIGxlc3MgdGhhbiAxCisgICAqLworICB2aXJ0dWFsIHZvaWQgc2V0Q29uY3VycmVudENsaWVudExpbWl0KGludDY0X3QgbmV3TGltaXQpOworCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBBIGNsaWVudCBoYXMgY29ubmVjdGVkLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKyAgICogbGlmZXRpbWUgb2YgdGhlIGNsaWVudCBvYmplY3QuICBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHNlcnZlKCkgdGhyZWFkLAorICAgKiB0aGVyZWZvcmUgYSBmYWlsdXJlIHRvIHJldHVybiBxdWlja2x5IHdpbGwgcmVzdWx0IGluIG5ldyBjbGllbnQgY29ubmVjdGlvbgorICAgKiBkZWxheXMuCisgICAqCisgICAqIFxwYXJhbVtpbl0gIHBDbGllbnQgIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50CisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSA9IDA7CisKKyAgLyoqCisgICAqIEEgY2xpZW50IGhhcyBkaXNjb25uZWN0ZWQuCisgICAqIFdoZW4gY2FsbGVkOgorICAgKiAgIFRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIHRyYWNrcyB0aGUgY2xpZW50LgorICAgKiAgIFRoZSBjbGllbnQgVFRyYW5zcG9ydCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KKyAgICogICBUaGUgaW1wbGVtZW50YXRpb24gbXVzdCBub3QgZGVsZXRlIHRoZSBwb2ludGVyLgorICAgKgorICAgKiBccGFyYW1baW5dICBwQ2xpZW50ICB0aGUgZGlzY29ubmVjdGVkIGNsaWVudAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpID0gMDsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIENvbW1vbiBoYW5kbGluZyBmb3IgbmV3IGNvbm5lY3RlZCBjbGllbnRzLiAgSW1wbGVtZW50cyBjb25jdXJyZW50CisgICAqIGNsaWVudCByYXRlIGxpbWl0aW5nIGFmdGVyIG9uQ2xpZW50Q29ubmVjdGVkIHJldHVybnMgYnkgYmxvY2tpbmcgdGhlCisgICAqIHNlcnZlKCkgdGhyZWFkIGlmIHRoZSBsaW1pdCBoYXMgYmVlbiByZWFjaGVkLgorICAgKi8KKyAgdm9pZCBuZXdseUNvbm5lY3RlZENsaWVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpOworCisgIC8qKgorICAgKiBTbWFydCBwb2ludGVyIGNsaWVudCBkZWxldGlvbi4KKyAgICogQ2FsbHMgb25DbGllbnREaXNjb25uZWN0ZWQgYW5kIHRoZW4gZGVsZXRlcyBwQ2xpZW50LgorICAgKi8KKyAgdm9pZCBkaXNwb3NlQ29ubmVjdGVkQ2xpZW50KFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpOworCisgIC8qKgorICAgKiBNb25pdG9yIGZvciBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICovCisgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBtb25fOworCisgIC8qKgorICAgKiBUaGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICovCisgIGludDY0X3QgY2xpZW50c187CisKKyAgLyoqCisgICAqIFRoZSBoaWdoIHdhdGVyIG1hcmsgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKi8KKyAgaW50NjRfdCBod21fOworCisgIC8qKgorICAgKiBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqLworICBpbnQ2NF90IGxpbWl0XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUkZSQU1FV09SS19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2MjM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworVFNpbXBsZVNlcnZlcjo6VFNpbXBsZVNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KDEpOworfQorCitUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMSk7Cit9CisKK1RTaW1wbGVTZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgxKTsKK30KKworVFNpbXBsZVNlcnZlcjo6VFNpbXBsZVNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KDEpOworfQorCitUU2ltcGxlU2VydmVyOjp+VFNpbXBsZVNlcnZlcigpIHsKK30KKworLyoqCisgKiBUaGUgbWFpbiBib2R5IG9mIGN1c3RvbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIFRTaW1wbGVTZXJ2ZXIgaXMgcXVpdGUgc2ltcGxlOgorICogV2hlbiBhIGNsaWVudCBjb25uZWN0cywgdXNlIHRoZSBzZXJ2ZSgpIHRocmVhZCB0byBkcml2ZSBpdCB0byBjb21wbGV0aW9uIHRodXMKKyAqIGJsb2NraW5nIG5ldyBjb25uZWN0aW9ucy4KKyAqLwordm9pZCBUU2ltcGxlU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIHBDbGllbnQtPnJ1bigpOworfQorCisvKioKKyAqIFRTaW1wbGVTZXJ2ZXIgZG9lcyBub3QgdHJhY2sgY2xpZW50cyBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuCisgKi8KK3ZvaWQgVFNpbXBsZVNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCopIHsKK30KKworLyoqCisgKiBUaGlzIG1ha2VzIGxpdHRsZSBzZW5zZSB0byB0aGUgc2ltcGxlIHNlcnZlciBiZWNhdXNlIGl0IGlzIG5vdCBjYXBhYmxlCisgKiBvZiBoYXZpbmcgbW9yZSB0aGFuIG9uZSBjbGllbnQgYXQgYSB0aW1lLCBzbyB3ZSBoaWRlIGl0LgorICovCit2b2lkIFRTaW1wbGVTZXJ2ZXI6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdChpbnQ2NF90KSB7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0OTIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHNpbXBsZSBzZXJ2ZXIuIEl0IGlzIHNpbmdsZS10aHJlYWRlZCBhbmQgcnVucyBhCisgKiBjb250aW51b3VzIGxvb3Agb2YgYWNjZXB0aW5nIGEgc2luZ2xlIGNvbm5lY3Rpb24sIHByb2Nlc3NpbmcgcmVxdWVzdHMgb24KKyAqIHRoYXQgY29ubmVjdGlvbiB1bnRpbCBpdCBjbG9zZXMsIGFuZCB0aGVuIHJlcGVhdGluZy4KKyAqLworY2xhc3MgVFNpbXBsZVNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKK3B1YmxpYzoKKyAgVFNpbXBsZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNpbXBsZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworCisgIFRTaW1wbGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworCisgIFRTaW1wbGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKworICB2aXJ0dWFsIH5UU2ltcGxlU2VydmVyKCk7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKworcHJpdmF0ZToKKyAgdm9pZCBzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCBuZXdMaW1pdCk7IC8vIGhpZGUKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTM0NWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CisKK1RUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCisgICAgdGltZW91dF8oMCksCisgICAgdGFza0V4cGlyYXRpb25fKDApIHsKK30KKworVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQorCitUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQorCitUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyKQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQorCitUVGhyZWFkUG9vbFNlcnZlcjo6flRUaHJlYWRQb29sU2VydmVyKCkgeworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXJ2ZSgpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2VydmUoKTsKKyAgdGhyZWFkTWFuYWdlcl8tPnN0b3AoKTsKK30KKworaW50NjRfdCBUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGltZW91dCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRpbWVvdXRfOworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpIHsKKyAgdGltZW91dF8gPSB2YWx1ZTsKK30KKworaW50NjRfdCBUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGFza0V4cGlyYXRpb24oKSBjb25zdCB7CisgIHJldHVybiB0YXNrRXhwaXJhdGlvbl87Cit9CisKK3ZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6OnNldFRhc2tFeHBpcmF0aW9uKGludDY0X3QgdmFsdWUpIHsKKyAgdGFza0V4cGlyYXRpb25fID0gdmFsdWU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+CitUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGhyZWFkTWFuYWdlcigpIGNvbnN0IHsKKyAgcmV0dXJuIHRocmVhZE1hbmFnZXJfOworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIHRocmVhZE1hbmFnZXJfLT5hZGQocENsaWVudCwgZ2V0VGltZW91dCgpLCBnZXRUYXNrRXhwaXJhdGlvbigpKTsKK30KKwordm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCopIHsKK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxOTk4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfIDEKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKKy8qKgorICogTWFuYWdlIGNsaWVudHMgdXNpbmcgYSB0aHJlYWQgcG9vbC4KKyAqLworY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CitwdWJsaWM6CisgIFRUaHJlYWRQb29sU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOworCisgIFRUaHJlYWRQb29sU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKKworICBUVGhyZWFkUG9vbFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKKworICBUVGhyZWFkUG9vbFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CisKKyAgdmlydHVhbCB+VFRocmVhZFBvb2xTZXJ2ZXIoKTsKKworICAvKioKKyAgICogUG9zdC1jb25kaXRpb25zIChyZXR1cm4gZ3VhcmFudGVlcyk6CisgICAqICAgVGhlcmUgd2lsbCBiZSBubyBjbGllbnRzIGNvbm5lY3RlZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOworCisgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lb3V0KCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpOworCisgIHZpcnR1YWwgaW50NjRfdCBnZXRUYXNrRXhwaXJhdGlvbigpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgc2V0VGFza0V4cGlyYXRpb24oaW50NjRfdCB2YWx1ZSk7CisKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKKyAgc3RkOjphdG9taWM8aW50NjRfdD4gdGltZW91dF87CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IHRhc2tFeHBpcmF0aW9uXzsKK307CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjRkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIHN0ZDo6bWFrZV9zaGFyZWQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKKworVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRGYWN0b3J5Xyh0aHJlYWRGYWN0b3J5KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKK30KKworVFRocmVhZGVkU2VydmVyOjp+VFRocmVhZGVkU2VydmVyKCkgeworfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6c2VydmUoKSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKCk7CisKKyAgLy8gRW5zdXJlIHBvc3QtY29uZGl0aW9uIG9mIG5vIGFjdGl2ZSBjbGllbnRzCisgIFN5bmNocm9uaXplZCBzKGNsaWVudE1vbml0b3JfKTsKKyAgd2hpbGUgKCFhY3RpdmVDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBjbGllbnRNb25pdG9yXy53YWl0KCk7CisgIH0KKworICBkcmFpbkRlYWRDbGllbnRzKCk7Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpkcmFpbkRlYWRDbGllbnRzKCkgeworICAvLyB3ZSdyZSBpbiBhIG1vbml0b3IgaGVyZQorICB3aGlsZSAoIWRlYWRDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBDbGllbnRNYXA6Oml0ZXJhdG9yIGl0ID0gZGVhZENsaWVudE1hcF8uYmVnaW4oKTsKKyAgICBpdC0+c2Vjb25kLT5qb2luKCk7CisgICAgZGVhZENsaWVudE1hcF8uZXJhc2UoaXQpOworICB9Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIFN5bmNocm9uaXplZCBzeW5jKGNsaWVudE1vbml0b3JfKTsKKyAgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50UnVubmVyPiBwUnVubmFibGUgPSBtYWtlX3NoYXJlZDxUQ29ubmVjdGVkQ2xpZW50UnVubmVyPihwQ2xpZW50KTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHBUaHJlYWQgPSB0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKHBSdW5uYWJsZSk7CisgIHBSdW5uYWJsZS0+dGhyZWFkKHBUaHJlYWQpOworICBhY3RpdmVDbGllbnRNYXBfLmluc2VydChDbGllbnRNYXA6OnZhbHVlX3R5cGUocENsaWVudC5nZXQoKSwgcFRocmVhZCkpOworICBwVGhyZWFkLT5zdGFydCgpOworfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgeworICBTeW5jaHJvbml6ZWQgc3luYyhjbGllbnRNb25pdG9yXyk7CisgIGRyYWluRGVhZENsaWVudHMoKTsgLy8gdXNlIHRoZSBvdXRnb2luZyB0aHJlYWQgdG8gZG8gc29tZSBtYWludGVuYW5jZSBvbiBvdXIgZGVhZCBjbGllbnQgYmFja2xvZworICBDbGllbnRNYXA6Oml0ZXJhdG9yIGl0ID0gYWN0aXZlQ2xpZW50TWFwXy5maW5kKHBDbGllbnQpOworICBpZiAoaXQgIT0gYWN0aXZlQ2xpZW50TWFwXy5lbmQoKSkgeworICAgIENsaWVudE1hcDo6aXRlcmF0b3IgZW5kID0gaXQ7CisgICAgZGVhZENsaWVudE1hcF8uaW5zZXJ0KGl0LCArK2VuZCk7CisgICAgYWN0aXZlQ2xpZW50TWFwXy5lcmFzZShpdCk7CisgIH0KKyAgaWYgKGFjdGl2ZUNsaWVudE1hcF8uZW1wdHkoKSkgeworICAgIGNsaWVudE1vbml0b3JfLm5vdGlmeSgpOworICB9Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcihjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KQorICA6IHBDbGllbnRfKHBDbGllbnQpIHsKK30KKworVFRocmVhZGVkU2VydmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyOjp+VENvbm5lY3RlZENsaWVudFJ1bm5lcigpIHsKK30KKwordm9pZCBUVGhyZWFkZWRTZXJ2ZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXI6OnJ1bigpIC8qIG92ZXJyaWRlICovIHsKKyAgcENsaWVudF8tPnJ1bigpOyAgLy8gUnVuIHRoZSBjbGllbnQKKyAgcENsaWVudF8ucmVzZXQoKTsgLy8gVGhlIGNsaWVudCBpcyBkb25lIC0gcmVsZWFzZSBpdCBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBkZXN0cnVjdG9yIGZvciBzYWZldHkKK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWNjZDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8gMQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCisvKioKKyAqIE1hbmFnZSBjbGllbnRzIHVzaW5nIHRocmVhZHMgLSB0aHJlYWRzIGFyZSBjcmVhdGVkIG9uZSBmb3IgZWFjaCBjbGllbnQgYW5kIGFyZQorICogcmVsZWFzZWQgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiAgVGhpcyBzZXJ2ZXIgaXMgdXNlZCB0byBtYWtlIGEgZHluYW1pY2FsbHkKKyAqIHNjYWxhYmxlIHNlcnZlciB1cCB0byB0aGUgY29uY3VycmVudCBjb25uZWN0aW9uIGxpbWl0LgorICovCitjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CitwdWJsaWM6CisgIFRUaHJlYWRlZFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKKworICBUVGhyZWFkZWRTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOworCisgIFRUaHJlYWRlZFNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKKworICBUVGhyZWFkZWRTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOworCisgIHZpcnR1YWwgflRUaHJlYWRlZFNlcnZlcigpOworCisgIC8qKgorICAgKiBQb3N0LWNvbmRpdGlvbnMgKHJldHVybiBndWFyYW50ZWVzKToKKyAgICogICBUaGVyZSB3aWxsIGJlIG5vIGNsaWVudHMgY29ubmVjdGVkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNlcnZlKCk7CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIERyYWluIHJlY2VudGx5IGNvbm5lY3RlZCBjbGllbnRzIGJ5IGpvaW5pbmcgdGhlaXIgdGhyZWFkcyAtIHRoaXMgaXMgZG9uZSBsYXppbHkgYmVjYXVzZQorICAgKiB3ZSBjYW5ub3QgZG8gaXQgaW5zaWRlIHRoZSB0aHJlYWQgY29udGV4dCB0aGF0IGlzIGRpc2Nvbm5lY3RpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQgZHJhaW5EZWFkQ2xpZW50cygpOworCisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyRnJhbWV3b3JrOjpvbkNsaWVudENvbm5lY3RlZAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJGcmFtZXdvcms6Om9uQ2xpZW50RGlzY29ubmVjdGVkCisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCAqcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87CisKKyAgLyoqCisgICAqIEEgaGVscGVyIHdyYXBwZXIgdXNlZCB0byB3cmFwIHRoZSBjbGllbnQgaW4gc29tZXRoaW5nIHdlIGNhbiB1c2UgdG8gbWFpbnRhaW4KKyAgICogdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0ZWQgY2xpZW50IHdpdGhpbiBhIGRldGFjaGVkIHRocmVhZC4gIFdlIGNhbm5vdCBzaW1wbHkKKyAgICogdHJhY2sgdGhlIHRocmVhZHMgYmVjYXVzZSBhIHNoYXJlZF9wdHI8VGhyZWFkPiBoYW5ncyBvbiB0byB0aGUgUnVubmFibGUgaXQgaXMKKyAgICogcGFzc2VkLCBhbmQgVFNlcnZlckZyYW1ld29yayByZXF1aXJlcyB0aGUgcnVubmFibGUgKFRDb25uZWN0ZWRDbGllbnQpIHRvIGJlCisgICAqIGRlc3Ryb3llZCBpbiBvcmRlciB0byB3b3JrIHByb3Blcmx5LgorICAgKi8KKyAgY2xhc3MgVENvbm5lY3RlZENsaWVudFJ1bm5lciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlCisgIHsKKyAgcHVibGljOgorICAgIFRDb25uZWN0ZWRDbGllbnRSdW5uZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KTsKKyAgICB2aXJ0dWFsIH5UQ29ubmVjdGVkQ2xpZW50UnVubmVyKCk7CisgICAgdm9pZCBydW4oKSAvKiBvdmVycmlkZSAqLzsKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4gcENsaWVudF87CisgIH07CisKKyAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGNsaWVudE1vbml0b3JfOworCisgIHR5cGVkZWYgc3RkOjptYXA8VENvbm5lY3RlZENsaWVudCAqLCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+ID4gQ2xpZW50TWFwOworCisgIC8qKgorICAgKiBBIG1hcCBvZiBhY3RpdmUgY2xpZW50cworICAgKi8KKyAgQ2xpZW50TWFwIGFjdGl2ZUNsaWVudE1hcF87CisKKyAgLyoqCisgICAqIEEgbWFwIG9mIGNsaWVudHMgdGhhdCBoYXZlIGRpc2Nvbm5lY3RlZCBidXQgdGhlaXIgdGhyZWFkcyBoYXZlIG5vdCBiZWVuIGpvaW5lZAorICAgKi8KKyAgQ2xpZW50TWFwIGRlYWRDbGllbnRNYXBfOworfTsKKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90aHJpZnQtY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0ODcwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90aHJpZnQtY29uZmlnLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvY29uZmlnLmg+CisjZWxzZQorI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTEwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworIyAgZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworCisjaWZkZWYgX1dJTjMyCisjICBpbmNsdWRlIDx3aW5zb2NrMi5oPgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIDo6V1NBR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gKCpfZXJybm8oKSkKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgV1NBRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSIFdTQUVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiBXU0FFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgV1NBRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFIFdTQUVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgU09fRVhDTFVTSVZFQUREUlVTRQorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVQgU09DS0VUCisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUIElOVkFMSURfU09DS0VUCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgdGhyaWZ0X3NvY2tldHBhaXIKKyMgIGRlZmluZSBUSFJJRlRfRkNOVEwgdGhyaWZ0X2ZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgMQorIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIDAKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCAxCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSB0aHJpZnRfZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3Nlc29ja2V0CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIF9jbG9zZQorIyAgZGVmaW5lIFRIUklGVF9PUEVOIF9vcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBfY2hzaXplX3MKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgX2NvbW1pdAorIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBfbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgX3dyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgX3JlYWQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUIGlvY3Rsc29ja2V0CisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSB1X2xvbmcKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgX2ZzdGF0CisjICBkZWZpbmUgVEhSSUZUX1NUQVQgX3N0YXQKKyMgIGlmZGVmIF9XSU4zMl9XQ0UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IoLi4uKSB0aHJpZnRfd3N0cjJzdHIoZ2FpX3N0cmVycm9yVyhfX1ZBX0FSR1NfXykpCisjICBlbHNlCisjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvckEKKyMgIGVuZGlmCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBwdHJkaWZmX3QKKyMgIGlmIChfTVNDX1ZFUiA8IDE5MDApCisjICAgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgX3NucHJpbnRmCisjICBlbHNlCisjICAgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgc25wcmludGYKKyMgIGVuZGlmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyB0aHJpZnRfc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB0aHJpZnRfdXNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRocmlmdF90aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIHRocmlmdF9jdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgdGhyaWZ0X3BvbGwKKyMgIGlmIFdJTlZFUiA8PSAweDA1MDIgLy9YUCwgU2VydmVyMjAwMworIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgdGhyaWZ0X3BvbGxmZAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgMHgwMzAwCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCAweDAwMTAKKyMgIGVsc2UgLy9WaXN0YSwgV2luNy4uLgorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICBQT0xMSU4KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGVuZGlmIC8vV0lOVkVSCisjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTRF9CT1RICisjICBpZiAhZGVmaW5lZChBSV9BRERSQ09ORklHKQorIyAgICBkZWZpbmUgQUlfQUREUkNPTkZJRyAweDAwMDAwNDAwCisjICBlbmRpZgorI2Vsc2UgLy9ub3QgX1dJTjMyCisjICBpbmNsdWRlIDxlcnJuby5oPgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VSUk5PIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSICAgICAgIEVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIEVJTlBST0dSRVNTCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgIEVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfRU5PVENPTk4gICAgRU5PVENPTk4KKyMgIGRlZmluZSBUSFJJRlRfRVRJTUVET1VUICAgRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIEVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VBR0FJTiAgICAgIEVBR0FJTgorIyAgZGVmaW5lIFRIUklGVF9FUElQRSAgICAgICBFUElQRQorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19SRVVTRUFERFIKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUIGludAorIyAgZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCAoLTEpCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCBmY250bAorIyAgZGVmaW5lIFRIUklGVF9PX05PTkJMT0NLIE9fTk9OQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRl9HRVRGTCBGX0dFVEZMCisjICBkZWZpbmUgVEhSSUZUX0ZfU0VURkwgRl9TRVRGTAorIyAgZGVmaW5lIFRIUklGVF9HRVRUSU1FT0ZEQVkgZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gb3BlbgorIyAgZGVmaW5lIFRIUklGVF9GVFJVTkNBVEUgZnRydW5jYXRlCisjICBkZWZpbmUgVEhSSUZUX0ZTWU5DIGZzeW5jCisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIGxzZWVrCisjICBkZWZpbmUgVEhSSUZUX1dSSVRFIHdyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgcmVhZAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVQgaW9jdGwKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUX05VTV9CWVRFU19UWVBFIGludAorIyAgZGVmaW5lIFRIUklGVF9TVEFUIHN0YXQKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvcgorIyAgZGVmaW5lIFRIUklGVF9TU0laRVQgc3NpemVfdAorIyAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBzbnByaW50ZgorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB1c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGltZXNwZWMKKyMgIGRlZmluZSBUSFJJRlRfQ1RJTUVfUiBjdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgcG9sbAorIyAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHBvbGxmZAorIyAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNIVVRfUkRXUgorI2VuZGlmCisKKyNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjMmY4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordWludDMyX3QgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBoYXZlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCb3VuZF8gLSByQmFzZV8pOworCisgIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBzYXRpc2Z5IHRoZSByZWFkCisgIC8vIHdpdGggdGhlIGRhdGEgYWxyZWFkeSBpbiB0aGUgYnVmZmVyLgorICBhc3NlcnQoaGF2ZSA8IGxlbik7CisKKyAgLy8gSWYgd2UgaGF2ZSBzb21lIGRhdGEgaW4gdGhlIGJ1ZmZlciwgY29weSBpdCBvdXQgYW5kIHJldHVybiBpdC4KKyAgLy8gV2UgaGF2ZSB0byByZXR1cm4gaXQgd2l0aG91dCBhdHRlbXB0aW5nIHRvIHJlYWQgbW9yZSwgc2luY2Ugd2UgYXJlbid0CisgIC8vIGd1YXJhbnRlZWQgdGhhdCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgYWN0dWFsbHkgaGFzIG1vcmUgZGF0YSwgc28KKyAgLy8gYXR0ZW1wdGluZyB0byByZWFkIGZyb20gaXQgY291bGQgYmxvY2suCisgIGlmIChoYXZlID4gMCkgeworICAgIG1lbWNweShidWYsIHJCYXNlXywgaGF2ZSk7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7CisgICAgcmV0dXJuIGhhdmU7CisgIH0KKworICAvLyBObyBkYXRhIGlzIGF2YWlsYWJsZSBpbiBvdXIgYnVmZmVyLgorICAvLyBHZXQgbW9yZSBmcm9tIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVwIHRvIGJ1ZmZlciBzaXplLgorICAvLyBOb3RlIHRoYXQgdGhpcyBtYWtlcyBhIGxvdCBvZiBzZW5zZSBpZiBsZW4gPCByQnVmU2l6ZV8KKyAgLy8gYW5kIGFsbW9zdCBubyBzZW5zZSBvdGhlcndpc2UuICBUT0RPKGRyZWlzcyk6IEZpeCB0aGF0CisgIC8vIGNhc2UgKHBvc3NpYmx5IGluY2x1ZGluZyBzb21lIHJlYWR2IGhvdG5lc3MpLgorICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCB0cmFuc3BvcnRfLT5yZWFkKHJCdWZfLmdldCgpLCByQnVmU2l6ZV8pKTsKKworICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZS4KKyAgdWludDMyX3QgZ2l2ZSA9IChzdGQ6Om1pbikobGVuLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXykpOworICBtZW1jcHkoYnVmLCByQmFzZV8sIGdpdmUpOworICByQmFzZV8gKz0gZ2l2ZTsKKworICByZXR1cm4gZ2l2ZTsKK30KKwordm9pZCBUQnVmZmVyZWRUcmFuc3BvcnQ6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBoYXZlX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKKyAgdWludDMyX3Qgc3BhY2UgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0JvdW5kXyAtIHdCYXNlXyk7CisgIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBhY2NvbW1vZGF0ZSB0aGUgd3JpdGUKKyAgLy8gd2l0aCB0aGUgZnJlZSBzcGFjZSBhbHJlYWR5IGluIHRoZSBidWZmZXIuCisgIGFzc2VydCh3Qm91bmRfIC0gd0Jhc2VfIDwgc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihsZW4pKTsKKworICAvLyBOb3cgaGVyZSdzIHRoZSB0cmlja3kgcXVlc3Rpb246IHNob3VsZCB3ZSBjb3B5IGRhdGEgZnJvbSBidWYgaW50byBvdXIKKyAgLy8gaW50ZXJuYWwgYnVmZmVyIGFuZCB3cml0ZSBpdCBmcm9tIHRoZXJlLCBvciBzaG91bGQgd2UganVzdCB3cml0ZSBvdXQKKyAgLy8gdGhlIGN1cnJlbnQgaW50ZXJuYWwgYnVmZmVyIGluIG9uZSBzeXNjYWxsIGFuZCB3cml0ZSBvdXQgYnVmIGluIGFub3RoZXIuCisgIC8vIElmIG91ciBjdXJyZW50bHkgYnVmZmVyZWQgZGF0YSBwbHVzIGJ1ZiBpcyBhdCBsZWFzdCBkb3VibGUgb3VyIGJ1ZmZlcgorICAvLyBzaXplLCB3ZSB3aWxsIGhhdmUgdG8gZG8gdHdvIHN5c2NhbGxzIG5vIG1hdHRlciB3aGF0IChleGNlcHQgaW4gdGhlCisgIC8vIGRlZ2VuZXJhdGUgY2FzZSB3aGVuIG91ciBidWZmZXIgaXMgZW1wdHkpLCBzbyB0aGVyZSBpcyBubyB1c2UgY29weWluZy4KKyAgLy8gT3RoZXJ3aXNlLCB0aGVyZSBpcyBzb3J0IG9mIGEgc2xpZGluZyBzY2FsZS4gIElmIHdlIGhhdmUgTi0xIGJ5dGVzCisgIC8vIGJ1ZmZlcmVkIGFuZCBuZWVkIHRvIHdyaXRlIDIsIGl0IHdvdWxkIGJlIGNyYXp5IHRvIGRvIHR3byBzeXNjYWxscy4KKyAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIGhhdmUgMiBieXRlcyBidWZmZXJlZCBhbmQgYXJlIHdyaXRpbmcgMk4tMywKKyAgLy8gd2UgY2FuIHNhdmUgYSBzeXNjYWxsIGluIHRoZSBzaG9ydCB0ZXJtIGJ5IGxvYWRpbmcgdXAgb3VyIGJ1ZmZlciwgd3JpdGluZworICAvLyBpdCBvdXQsIGFuZCBjb3B5aW5nIHRoZSByZXN0IG9mIHRoZSBieXRlcyBpbnRvIG91ciBidWZmZXIuICBPZiBjb3Vyc2UsCisgIC8vIGlmIHdlIGdldCBhbm90aGVyIDItYnl0ZSB3cml0ZSwgd2UgaGF2ZW4ndCBzYXZlZCBhbnkgc3lzY2FsbHMgYXQgYWxsLAorICAvLyBhbmQgaGF2ZSBqdXN0IGNvcGllZCBuZWFybHkgMk4gYnl0ZXMgZm9yIG5vdGhpbmcuICBGaW5kaW5nIGEgcGVyZmVjdAorICAvLyBwb2xpY3kgd291bGQgcmVxdWlyZSBwcmVkaWN0aW5nIHRoZSBzaXplIG9mIGZ1dHVyZSB3cml0ZXMsIHNvIHdlJ3JlIGp1c3QKKyAgLy8gZ29pbmcgdG8gYWx3YXlzIGVzY2hldyBzeXNjYWxscyBpZiB3ZSBoYXZlIGxlc3MgdGhhbiAyTiBieXRlcyB0byB3cml0ZS4KKworICAvLyBUaGUgY2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGRvIHR3byBzeXNjYWxscy4KKyAgLy8gVGhpcyBjYXNlIGFsc28gY292ZXJzIHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgaXMgZW1wdHksCisgIC8vIGJ1dCBpdCBpcyBjbGVhcmVyIChJIHRoaW5rKSB0byB0aGluayBvZiBpdCBhcyB0d28gc2VwYXJhdGUgY2FzZXMuCisgIGlmICgoaGF2ZV9ieXRlcyArIGxlbiA+PSAyICogd0J1ZlNpemVfKSB8fCAoaGF2ZV9ieXRlcyA9PSAwKSkgeworICAgIC8vIFRPRE8oZHJlaXNzKTogd3JpdGV2CisgICAgaWYgKGhhdmVfYnl0ZXMgPiAwKSB7CisgICAgICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZV9ieXRlcyk7CisgICAgfQorICAgIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKKyAgICB3QmFzZV8gPSB3QnVmXy5nZXQoKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBGaWxsIHVwIG91ciBpbnRlcm5hbCBidWZmZXIgZm9yIGEgd3JpdGUuCisgIG1lbWNweSh3QmFzZV8sIGJ1Ziwgc3BhY2UpOworICBidWYgKz0gc3BhY2U7CisgIGxlbiAtPSBzcGFjZTsKKyAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisKKyAgLy8gQ29weSB0aGUgcmVzdCBpbnRvIG91ciBidWZmZXIuCisgIGFzc2VydChsZW4gPCB3QnVmU2l6ZV8pOworICBtZW1jcHkod0J1Zl8uZ2V0KCksIGJ1ZiwgbGVuKTsKKyAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBsZW47CisgIHJldHVybjsKK30KKworY29uc3QgdWludDhfdCogVEJ1ZmZlcmVkVHJhbnNwb3J0Ojpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAodm9pZClidWY7CisgICh2b2lkKWxlbjsKKyAgLy8gU2ltcGx5IHJldHVybiBOVUxMLiAgV2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBhY3R1YWxseSBkYXRhIGF2YWlsYWJsZSBvbgorICAvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHNvIGNhbGxpbmcgcmVhZCgpIG1pZ2h0IGJsb2NrLgorICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBUQnVmZmVyZWRUcmFuc3BvcnQ6OmZsdXNoKCkgeworICAvLyBXcml0ZSBvdXQgYW55IGRhdGEgd2FpdGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLgorICB1aW50MzJfdCBoYXZlX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKKyAgaWYgKGhhdmVfYnl0ZXMgPiAwKSB7CisgICAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpOworICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlX2J5dGVzKTsKKyAgfQorCisgIC8vIEZsdXNoIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKK30KKwordWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3Qgd2FudCA9IGxlbjsKKyAgdWludDMyX3QgaGF2ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKTsKKworICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3Qgc2F0aXNmeSB0aGUgcmVhZAorICAvLyB3aXRoIHRoZSBkYXRhIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KKyAgYXNzZXJ0KGhhdmUgPCB3YW50KTsKKworICAvLyBJZiB3ZSBoYXZlIHNvbWUgZGF0YSBpbiB0aGUgYnVmZmVyLCBjb3B5IGl0IG91dCBhbmQgcmV0dXJuIGl0LgorICAvLyBXZSBoYXZlIHRvIHJldHVybiBpdCB3aXRob3V0IGF0dGVtcHRpbmcgdG8gcmVhZCBtb3JlLCBzaW5jZSB3ZSBhcmVuJ3QKKyAgLy8gZ3VhcmFudGVlZCB0aGF0IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBhY3R1YWxseSBoYXMgbW9yZSBkYXRhLCBzbworICAvLyBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSBpdCBjb3VsZCBibG9jay4KKyAgaWYgKGhhdmUgPiAwKSB7CisgICAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBoYXZlKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCAwKTsKKyAgICByZXR1cm4gaGF2ZTsKKyAgfQorCisgIC8vIFJlYWQgYW5vdGhlciBmcmFtZS4KKyAgaWYgKCFyZWFkRnJhbWUoKSkgeworICAgIC8vIEVPRi4gIE5vIGZyYW1lIGF2YWlsYWJsZS4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFRPRE8oZHJlaXNzKTogU2hvdWxkIHdlIHdhcm4gd2hlbiByZWFkcyBjcm9zcyBmcmFtZXM/CisKKyAgLy8gSGFuZCBvdmVyIHdoYXRldmVyIHdlIGhhdmUuCisgIHVpbnQzMl90IGdpdmUgPSAoc3RkOjptaW4pKHdhbnQsIHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKSk7CisgIG1lbWNweShidWYsIHJCYXNlXywgZ2l2ZSk7CisgIHJCYXNlXyArPSBnaXZlOworICB3YW50IC09IGdpdmU7CisKKyAgcmV0dXJuIChsZW4gLSB3YW50KTsKK30KKworYm9vbCBURnJhbWVkVHJhbnNwb3J0OjpyZWFkRnJhbWUoKSB7CisgIC8vIFRPRE8oZHJlaXNzKTogVGhpbmsgYWJvdXQgdXNpbmcgcmVhZHYgaGVyZSwgZXZlbiB0aG91Z2ggaXQgd291bGQKKyAgLy8gcmVzdWx0IGluIChnYXNwKSByZWFkLWFoZWFkLgorCisgIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIG5leHQgZnJhbWUuCisgIC8vIFdlIGNhbid0IHVzZSByZWFkQWxsKCZzeiwgc2l6ZW9mKHN6KSksIHNpbmNlIHRoYXQgYWx3YXlzIHRocm93cyBhbgorICAvLyBleGNlcHRpb24gb24gRU9GLiAgV2Ugd2FudCB0byB0aHJvdyBhbiBleGNlcHRpb24gb25seSBpZiBFT0Ygb2NjdXJzIGFmdGVyCisgIC8vIHBhcnRpYWwgc2l6ZSBkYXRhLgorICBpbnQzMl90IHN6ID0gLTE7CisgIHVpbnQzMl90IHNpemVfYnl0ZXNfcmVhZCA9IDA7CisgIHdoaWxlIChzaXplX2J5dGVzX3JlYWQgPCBzaXplb2Yoc3opKSB7CisgICAgdWludDhfdCogc3pwID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN6KSArIHNpemVfYnl0ZXNfcmVhZDsKKyAgICB1aW50MzJfdCBieXRlc19yZWFkCisgICAgICAgID0gdHJhbnNwb3J0Xy0+cmVhZChzenAsIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplb2Yoc3opKSAtIHNpemVfYnl0ZXNfcmVhZCk7CisgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgeworICAgICAgaWYgKHNpemVfYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVPRiBhZnRlciBhIHBhcnRpYWwgZnJhbWUgaGVhZGVyLiAgUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwgZnJhbWUgaGVhZGVyLiIpOworICAgICAgfQorICAgIH0KKyAgICBzaXplX2J5dGVzX3JlYWQgKz0gYnl0ZXNfcmVhZDsKKyAgfQorCisgIHN6ID0gbnRvaGwoc3opOworCisgIGlmIChzeiA8IDApIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplIGhhcyBuZWdhdGl2ZSB2YWx1ZSIpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG92ZXJzaXplZCBmcmFtZQorICBpZiAoc3ogPiBzdGF0aWNfY2FzdDxpbnQzMl90PihtYXhGcmFtZVNpemVfKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLCAiUmVjZWl2ZWQgYW4gb3ZlcnNpemVkIGZyYW1lIik7CisKKyAgLy8gUmVhZCB0aGUgZnJhbWUgcGF5bG9hZCwgYW5kIHJlc2V0IG1hcmtlcnMuCisgIGlmIChzeiA+IHN0YXRpY19jYXN0PGludDMyX3Q+KHJCdWZTaXplXykpIHsKKyAgICByQnVmXy5yZXNldChuZXcgdWludDhfdFtzel0pOworICAgIHJCdWZTaXplXyA9IHN6OworICB9CisgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCksIHN6KTsKKyAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBURnJhbWVkVHJhbnNwb3J0Ojp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgLy8gRG91YmxlIGJ1ZmZlciBzaXplIHVudGlsIHN1ZmZpY2llbnQuCisgIHVpbnQzMl90IGhhdmUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworICB1aW50MzJfdCBuZXdfc2l6ZSA9IHdCdWZTaXplXzsKKyAgaWYgKGxlbiArIGhhdmUgPCBoYXZlIC8qIG92ZXJmbG93ICovIHx8IGxlbiArIGhhdmUgPiAweDdmZmZmZmZmKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gd3JpdGUgb3ZlciAyIEdCIHRvIFRGcmFtZWRUcmFuc3BvcnQuIik7CisgIH0KKyAgd2hpbGUgKG5ld19zaXplIDwgbGVuICsgaGF2ZSkgeworICAgIG5ld19zaXplID0gbmV3X3NpemUgPiAwID8gbmV3X3NpemUgKiAyIDogMTsKKyAgfQorCisgIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbW9kaWZ5aW5nIHRoaXMgY2xhc3MgdG8gdXNlIG1hbGxvYy9mcmVlCisgIC8vIHNvIHdlIGNhbiB1c2UgcmVhbGxvYyBoZXJlLgorCisgIC8vIEFsbG9jYXRlIG5ldyBidWZmZXIuCisgIHVpbnQ4X3QqIG5ld19idWYgPSBuZXcgdWludDhfdFtuZXdfc2l6ZV07CisKKyAgLy8gQ29weSB0aGUgb2xkIGJ1ZmZlciB0byB0aGUgbmV3IG9uZS4KKyAgbWVtY3B5KG5ld19idWYsIHdCdWZfLmdldCgpLCBoYXZlKTsKKworICAvLyBOb3cgcG9pbnQgYnVmIHRvIHRoZSBuZXcgb25lLgorICB3QnVmXy5yZXNldChuZXdfYnVmKTsKKyAgd0J1ZlNpemVfID0gbmV3X3NpemU7CisgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgaGF2ZTsKKyAgd0JvdW5kXyA9IHdCdWZfLmdldCgpICsgd0J1ZlNpemVfOworCisgIC8vIENvcHkgdGhlIGRhdGEgaW50byB0aGUgbmV3IGJ1ZmZlci4KKyAgbWVtY3B5KHdCYXNlXywgYnVmLCBsZW4pOworICB3QmFzZV8gKz0gbGVuOworfQorCit2b2lkIFRGcmFtZWRUcmFuc3BvcnQ6OmZsdXNoKCkgeworICBpbnQzMl90IHN6X2hibywgc3pfbmJvOworICBhc3NlcnQod0J1ZlNpemVfID4gc2l6ZW9mKHN6X25ibykpOworCisgIC8vIFNsaXAgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKyAgc3pfaGJvID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtICh3QnVmXy5nZXQoKSArIHNpemVvZihzel9uYm8pKSk7CisgIHN6X25ibyA9IChpbnQzMl90KWh0b25sKCh1aW50MzJfdCkoc3pfaGJvKSk7CisgIG1lbWNweSh3QnVmXy5nZXQoKSwgKHVpbnQ4X3QqKSZzel9uYm8sIHNpemVvZihzel9uYm8pKTsKKworICBpZiAoc3pfaGJvID4gMCkgeworICAgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3QmFzZV8gKHdpdGggYSBwYWQgZm9yIHRoZSBmcmFtZSBzaXplKQorICAgIC8vIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUKKyAgICAvLyAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkgaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzCisgICAgLy8gdXAgYW4gZXhjZXB0aW9uCisgICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzaXplb2Yoc3pfbmJvKTsKKworICAgIC8vIFdyaXRlIHNpemUgYW5kIGZyYW1lIGJvZHkuCisgICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplb2Yoc3pfbmJvKSkgKyBzel9oYm8pOworICB9CisKKyAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICB0cmFuc3BvcnRfLT5mbHVzaCgpOworCisgIC8vIHJlY2xhaW0gd3JpdGUgYnVmZmVyCisgIGlmICh3QnVmU2l6ZV8gPiBidWZSZWNsYWltVGhyZXNoXykgeworICAgIHdCdWZTaXplXyA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgd0J1Zl8ucmVzZXQobmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSk7CisgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisKKyAgICAvLyByZXNldCB3QmFzZV8gd2l0aCBhIHBhZCBmb3IgdGhlIGZyYW1lIHNpemUKKyAgICBpbnQzMl90IHBhZCA9IDA7CisgICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzaXplb2YocGFkKTsKKyAgfQorfQorCit1aW50MzJfdCBURnJhbWVkVHJhbnNwb3J0Ojp3cml0ZUVuZCgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7Cit9CisKK2NvbnN0IHVpbnQ4X3QqIFRGcmFtZWRUcmFuc3BvcnQ6OmJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICh2b2lkKWJ1ZjsKKyAgKHZvaWQpbGVuOworICAvLyBEb24ndCB0cnkgdG8gYmUgY2xldmVyIHdpdGggc2hpZnRpbmcgYnVmZmVycy4KKyAgLy8gSWYgdGhlIGZhc3QgcGF0aCBmYWlsZWQgbGV0IHRoZSBwcm90b2NvbCB1c2UgaXRzIHNsb3cgcGF0aC4KKyAgLy8gQmVzaWRlcywgd2hvIGlzIGdvaW5nIHRvIHRyeSB0byBib3Jyb3cgYWNyb3NzIG1lc3NhZ2VzPworICByZXR1cm4gTlVMTDsKK30KKwordWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZEVuZCgpIHsKKyAgLy8gaW5jbHVkZSBmcmFtaW5nIGJ5dGVzCisgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCdWZfLmdldCgpICsgc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgaWYgKHJCdWZTaXplXyA+IGJ1ZlJlY2xhaW1UaHJlc2hfKSB7CisgICAgckJ1ZlNpemVfID0gMDsKKyAgICByQnVmXy5yZXNldCgpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHJCdWZTaXplXyk7CisgIH0KKworICByZXR1cm4gYnl0ZXNfcmVhZDsKK30KKwordm9pZCBUTWVtb3J5QnVmZmVyOjpjb21wdXRlUmVhZCh1aW50MzJfdCBsZW4sIHVpbnQ4X3QqKiBvdXRfc3RhcnQsIHVpbnQzMl90KiBvdXRfZ2l2ZSkgeworICAvLyBDb3JyZWN0IHJCb3VuZF8gc28gd2UgY2FuIHVzZSB0aGUgZmFzdCBwYXRoIGluIHRoZSBmdXR1cmUuCisgIHJCb3VuZF8gPSB3QmFzZV87CisKKyAgLy8gRGVjaWRlIGhvdyBtdWNoIHRvIGdpdmUuCisgIHVpbnQzMl90IGdpdmUgPSAoc3RkOjptaW4pKGxlbiwgYXZhaWxhYmxlX3JlYWQoKSk7CisKKyAgKm91dF9zdGFydCA9IHJCYXNlXzsKKyAgKm91dF9naXZlID0gZ2l2ZTsKKworICAvLyBQcmVpbmNyZW1lbnQgckJhc2VfIHNvIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIHRvLgorICByQmFzZV8gKz0gZ2l2ZTsKK30KKwordWludDMyX3QgVE1lbW9yeUJ1ZmZlcjo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDhfdCogc3RhcnQ7CisgIHVpbnQzMl90IGdpdmU7CisgIGNvbXB1dGVSZWFkKGxlbiwgJnN0YXJ0LCAmZ2l2ZSk7CisKKyAgLy8gQ29weSBpbnRvIHRoZSBwcm92aWRlZCBidWZmZXIuCisgIG1lbWNweShidWYsIHN0YXJ0LCBnaXZlKTsKKworICByZXR1cm4gZ2l2ZTsKK30KKwordWludDMyX3QgVE1lbW9yeUJ1ZmZlcjo6cmVhZEFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQzMl90IGxlbikgeworICAvLyBEb24ndCBnZXQgc29tZSBzdHVwaWQgYXNzZXJ0aW9uIGZhaWx1cmUuCisgIGlmIChidWZmZXJfID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ4X3QqIHN0YXJ0OworICB1aW50MzJfdCBnaXZlOworICBjb21wdXRlUmVhZChsZW4sICZzdGFydCwgJmdpdmUpOworCisgIC8vIEFwcGVuZCB0byB0aGUgcHJvdmlkZWQgc3RyaW5nLgorICBzdHIuYXBwZW5kKChjaGFyKilzdGFydCwgZ2l2ZSk7CisKKyAgcmV0dXJuIGdpdmU7Cit9CisKK3ZvaWQgVE1lbW9yeUJ1ZmZlcjo6ZW5zdXJlQ2FuV3JpdGUodWludDMyX3QgbGVuKSB7CisgIC8vIENoZWNrIGF2YWlsYWJsZSBzcGFjZQorICB1aW50MzJfdCBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpOworICBpZiAobGVuIDw9IGF2YWlsKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCFvd25lcl8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJJbnN1ZmZpY2llbnQgc3BhY2UgaW4gZXh0ZXJuYWwgTWVtb3J5QnVmZmVyIik7CisgIH0KKworICAvLyBHcm93IHRoZSBidWZmZXIgYXMgbmVjZXNzYXJ5LgorICB1aW50NjRfdCBuZXdfc2l6ZSA9IGJ1ZmZlclNpemVfOworICB3aGlsZSAobGVuID4gYXZhaWwpIHsKKyAgICBuZXdfc2l6ZSA9IG5ld19zaXplID4gMCA/IG5ld19zaXplICogMiA6IDE7CisgICAgaWYgKG5ld19zaXplID4gbWF4QnVmZmVyU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcm5hbCBidWZmZXIgc2l6ZSBvdmVyZmxvdyIpOworICAgIH0KKyAgICBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpICsgKHN0YXRpY19jYXN0PHVpbnQzMl90PihuZXdfc2l6ZSkgLSBidWZmZXJTaXplXyk7CisgIH0KKworICAvLyBBbGxvY2F0ZSBpbnRvIGEgbmV3IHBvaW50ZXIgc28gd2UgZG9uJ3QgYm9yayBvdXJzIGlmIGl0IGZhaWxzLgorICB1aW50OF90KiBuZXdfYnVmZmVyID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KHN0ZDo6cmVhbGxvYyhidWZmZXJfLCBuZXdfc2l6ZSkpOworICBpZiAobmV3X2J1ZmZlciA9PSBOVUxMKSB7CisgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgfQorCisgIHJCYXNlXyA9IG5ld19idWZmZXIgKyAockJhc2VfIC0gYnVmZmVyXyk7CisgIHJCb3VuZF8gPSBuZXdfYnVmZmVyICsgKHJCb3VuZF8gLSBidWZmZXJfKTsKKyAgd0Jhc2VfID0gbmV3X2J1ZmZlciArICh3QmFzZV8gLSBidWZmZXJfKTsKKyAgd0JvdW5kXyA9IG5ld19idWZmZXIgKyBuZXdfc2l6ZTsKKyAgYnVmZmVyXyA9IG5ld19idWZmZXI7CisgIGJ1ZmZlclNpemVfID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG5ld19zaXplKTsKK30KKwordm9pZCBUTWVtb3J5QnVmZmVyOjp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgZW5zdXJlQ2FuV3JpdGUobGVuKTsKKworICAvLyBDb3B5IGludG8gdGhlIGJ1ZmZlciBhbmQgaW5jcmVtZW50IHdCYXNlXy4KKyAgbWVtY3B5KHdCYXNlXywgYnVmLCBsZW4pOworICB3QmFzZV8gKz0gbGVuOworfQorCit2b2lkIFRNZW1vcnlCdWZmZXI6Ondyb3RlQnl0ZXModWludDMyX3QgbGVuKSB7CisgIHVpbnQzMl90IGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCk7CisgIGlmIChsZW4gPiBhdmFpbCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNsaWVudCB3cm90ZSBtb3JlIGJ5dGVzIHRoYW4gc2l6ZSBvZiBidWZmZXIuIik7CisgIH0KKyAgd0Jhc2VfICs9IGxlbjsKK30KKworY29uc3QgdWludDhfdCogVE1lbW9yeUJ1ZmZlcjo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgKHZvaWQpYnVmOworICByQm91bmRfID0gd0Jhc2VfOworICBpZiAoYXZhaWxhYmxlX3JlYWQoKSA+PSAqbGVuKSB7CisgICAgKmxlbiA9IGF2YWlsYWJsZV9yZWFkKCk7CisgICAgcmV0dXJuIHJCYXNlXzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjNmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKQEAgLTAsMCArMSw3NDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UQlVGRkVSVFJBTlNQT1JUU19IXyAxCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9hcnJheS5ocHA+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBUREJfTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDEpKQorI2RlZmluZSBUREJfVU5MSUtFTFkodmFsKSAoX19idWlsdGluX2V4cGVjdCgodmFsKSwgMCkpCisjZWxzZQorI2RlZmluZSBUREJfTElLRUxZKHZhbCkgKHZhbCkKKyNkZWZpbmUgVERCX1VOTElLRUxZKHZhbCkgKHZhbCkKKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYWxsIHRyYW5zcG9ydHMgdGhhdCB1c2UgcmVhZC93cml0ZSBidWZmZXJzIGZvciBwZXJmb3JtYW5jZS4KKyAqCisgKiBUQnVmZmVyQmFzZSBpcyBkZXNpZ25lZCB0byBpbXBsZW1lbnQgdGhlIGZhc3QtcGF0aCAibWVtY3B5IiBzdHlsZQorICogb3BlcmF0aW9ucyB0aGF0IHdvcmsgaW4gdGhlIGNvbW1vbiBjYXNlLiAgSXQgZG9lcyBzbyB3aXRoIHNtYWxsIGFuZAorICogKGV2ZW50dWFsbHkpIG5vbnZpcnR1YWwsIGlubGluYWJsZSBtZXRob2RzLiAgVEJ1ZmZlckJhc2UgaXMgYW4gYWJzdHJhY3QKKyAqIGNsYXNzLiAgU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gZGVmaW5lIHRoZSAic2xvdyBwYXRoIiBvcGVyYXRpb25zCisgKiB0aGF0IGhhdmUgdG8gYmUgZG9uZSB3aGVuIHRoZSBidWZmZXJzIGFyZSBmdWxsIG9yIGVtcHR5LgorICoKKyAqLworY2xhc3MgVEJ1ZmZlckJhc2UgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEJ1ZmZlckJhc2U+IHsKKworcHVibGljOgorICAvKioKKyAgICogRmFzdC1wYXRoIHJlYWQuCisgICAqCisgICAqIFdoZW4gd2UgaGF2ZSBlbm91Z2ggZGF0YSBidWZmZXJlZCB0byBmdWxmaWxsIHRoZSByZWFkLCB3ZSBjYW4gc2F0aXNmeSBpdAorICAgKiB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLiAgSWYgdGhlIGJ1ZmZlcgorICAgKiBpcyBlbXB0eSwgd2UgY2FsbCBvdXQgdG8gb3VyIHNsb3cgcGF0aCwgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KKyAgICogVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gZXZlbnR1YWxseSBiZSBub252aXJ0dWFsIGFuZCBpbmxpbmFibGUuCisgICAqLworICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgdWludDhfdCogbmV3X3JCYXNlID0gckJhc2VfICsgbGVuOworICAgIGlmIChUREJfTElLRUxZKG5ld19yQmFzZSA8PSByQm91bmRfKSkgeworICAgICAgc3RkOjptZW1jcHkoYnVmLCByQmFzZV8sIGxlbik7CisgICAgICByQmFzZV8gPSBuZXdfckJhc2U7CisgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgICByZXR1cm4gcmVhZFNsb3coYnVmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIFNob3J0Y3V0dGVkIHZlcnNpb24gb2YgcmVhZEFsbC4KKyAgICovCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICB1aW50OF90KiBuZXdfckJhc2UgPSByQmFzZV8gKyBsZW47CisgICAgaWYgKFREQl9MSUtFTFkobmV3X3JCYXNlIDw9IHJCb3VuZF8pKSB7CisgICAgICBzdGQ6Om1lbWNweShidWYsIHJCYXNlXywgbGVuKTsKKyAgICAgIHJCYXNlXyA9IG5ld19yQmFzZTsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorICAgIHJldHVybiBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0aGlzLCBidWYsIGxlbik7CisgIH0KKworICAvKioKKyAgICogRmFzdC1wYXRoIHdyaXRlLgorICAgKgorICAgKiBXaGVuIHdlIGhhdmUgZW5vdWdoIGVtcHR5IHNwYWNlIGluIG91ciBidWZmZXIgdG8gYWNjb21tb2RhdGUgdGhlIHdyaXRlLCB3ZQorICAgKiBjYW4gc2F0aXNmeSBpdCB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLgorICAgKiBJZiB0aGUgYnVmZmVyIGlzIGZ1bGwsIHdlIGNhbGwgb3V0IHRvIG91ciBzbG93IHBhdGgsIGltcGxlbWVudGVkIGJ5IGEKKyAgICogc3ViY2xhc3MuICBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBldmVudHVhbGx5IGJlIG5vbnZpcnR1YWwgYW5kCisgICAqIGlubGluYWJsZS4KKyAgICovCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICB1aW50OF90KiBuZXdfd0Jhc2UgPSB3QmFzZV8gKyBsZW47CisgICAgaWYgKFREQl9MSUtFTFkobmV3X3dCYXNlIDw9IHdCb3VuZF8pKSB7CisgICAgICBzdGQ6Om1lbWNweSh3QmFzZV8sIGJ1ZiwgbGVuKTsKKyAgICAgIHdCYXNlXyA9IG5ld193QmFzZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd3JpdGVTbG93KGJ1ZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBGYXN0LXBhdGggYm9ycm93LiAgQSBsb3QgbGlrZSB0aGUgZmFzdC1wYXRoIHJlYWQuCisgICAqLworICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICAgaWYgKFREQl9MSUtFTFkoc3RhdGljX2Nhc3Q8cHRyZGlmZl90PigqbGVuKSA8PSByQm91bmRfIC0gckJhc2VfKSkgeworICAgICAgLy8gV2l0aCBzdHJpY3QgYWxpYXNpbmcsIHdyaXRpbmcgdG8gbGVuIHNob3VsZG4ndCBmb3JjZSB1cyB0bworICAgICAgLy8gcmVmZXRjaCByQmFzZV8gZnJvbSBtZW1vcnkuICBUT0RPKGRyZWlzcyk6IFZlcmlmeSB0aGlzLgorICAgICAgKmxlbiA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKTsKKyAgICAgIHJldHVybiByQmFzZV87CisgICAgfQorICAgIHJldHVybiBib3Jyb3dTbG93KGJ1ZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdW1lIGRvZXNuJ3QgcmVxdWlyZSBhIHNsb3cgcGF0aC4KKyAgICovCisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsKKyAgICBpZiAoVERCX0xJS0VMWShzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KGxlbikgPD0gckJvdW5kXyAtIHJCYXNlXykpIHsKKyAgICAgIHJCYXNlXyArPSBsZW47CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJjb25zdW1lIGRpZCBub3QgZm9sbG93IGEgYm9ycm93LiIpOworICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vLyBTbG93IHBhdGggcmVhZC4KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOworCisgIC8vLyBTbG93IHBhdGggd3JpdGUuCisgIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKKworICAvKioKKyAgICogU2xvdyBwYXRoIGJvcnJvdy4KKyAgICoKKyAgICogUE9TVENPTkRJVElPTjogcmV0dXJuID09IE5VTEwgfHwgckJvdW5kXyAtIHJCYXNlXyA+PSAqbGVuCisgICAqLworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSA9IDA7CisKKyAgLyoqCisgICAqIFRyaXZpYWwgY29uc3RydWN0b3IuCisgICAqCisgICAqIEluaXRpYWxpemUgcG9pbnRlcnMgc2FmZWx5LiAgQ29uc3RydWN0aW5nIGlzIG5vdCBhIHZlcnkKKyAgICogcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIG9wZXJhdGlvbiwgc28gaXQgaXMgb2theSB0byBqdXN0IGxlYXZlIGl0IHRvCisgICAqIHRoZSBjb25jcmV0ZSBjbGFzcyB0byBzZXQgdXAgcG9pbnRlcnMgY29ycmVjdGx5LgorICAgKi8KKyAgVEJ1ZmZlckJhc2UoKSA6IHJCYXNlXyhOVUxMKSwgckJvdW5kXyhOVUxMKSwgd0Jhc2VfKE5VTEwpLCB3Qm91bmRfKE5VTEwpIHt9CisKKyAgLy8vIENvbnZlbmllbmNlIG11dGF0b3IgZm9yIHNldHRpbmcgdGhlIHJlYWQgYnVmZmVyLgorICB2b2lkIHNldFJlYWRCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICByQmFzZV8gPSBidWY7CisgICAgckJvdW5kXyA9IGJ1ZiArIGxlbjsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBtdXRhdG9yIGZvciBzZXR0aW5nIHRoZSB3cml0ZSBidWZmZXIuCisgIHZvaWQgc2V0V3JpdGVCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICB3QmFzZV8gPSBidWY7CisgICAgd0JvdW5kXyA9IGJ1ZiArIGxlbjsKKyAgfQorCisgIHZpcnR1YWwgflRCdWZmZXJCYXNlKCkge30KKworICAvLy8gUmVhZHMgYmVnaW4gaGVyZS4KKyAgdWludDhfdCogckJhc2VfOworICAvLy8gUmVhZHMgbWF5IGV4dGVuZCB0byBqdXN0IGJlZm9yZSBoZXJlLgorICB1aW50OF90KiByQm91bmRfOworCisgIC8vLyBXcml0ZXMgYmVnaW4gaGVyZS4KKyAgdWludDhfdCogd0Jhc2VfOworICAvLy8gV3JpdGVzIG1heSBleHRlbmQgdG8ganVzdCBiZWZvcmUgaGVyZS4KKyAgdWludDhfdCogd0JvdW5kXzsKK307CisKKy8qKgorICogQnVmZmVyZWQgdHJhbnNwb3J0LiBGb3IgcmVhZHMgaXQgd2lsbCByZWFkIG1vcmUgZGF0YSB0aGFuIGlzIHJlcXVlc3RlZAorICogYW5kIHdpbGwgc2VydmUgZnV0dXJlIGRhdGEgb3V0IG9mIGEgbG9jYWwgYnVmZmVyLiBGb3Igd3JpdGVzLCBkYXRhIGlzCisgKiBzdG9yZWQgdG8gYW4gaW4gbWVtb3J5IGJ1ZmZlciBiZWZvcmUgYmVpbmcgd3JpdHRlbiBvdXQuCisgKgorICovCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBUQnVmZmVyQmFzZT4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA1MTI7CisKKyAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIC8vLyBVc2Ugc3BlY2lmaWVkIGJ1ZmZlciBzaXplcy4KKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKHN6KSwKKyAgICAgIHdCdWZTaXplXyhzeiksCisgICAgICByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIC8vLyBVc2Ugc3BlY2lmaWVkIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlciBzaXplcy4KKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHJzeiwgdWludDMyX3Qgd3N6KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKHJzeiksCisgICAgICB3QnVmU2l6ZV8od3N6KSwKKyAgICAgIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkgeworICAgIGluaXRQb2ludGVycygpOworICB9CisKKyAgdm9pZCBvcGVuKCkgeyB0cmFuc3BvcnRfLT5vcGVuKCk7IH0KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CisKKyAgYm9vbCBwZWVrKCkgeworICAgIGlmIChyQmFzZV8gPT0gckJvdW5kXykgeworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgdHJhbnNwb3J0Xy0+cmVhZChyQnVmXy5nZXQoKSwgckJ1ZlNpemVfKSk7CisgICAgfQorICAgIHJldHVybiAockJvdW5kXyA+IHJCYXNlXyk7CisgIH0KKworICB2b2lkIGNsb3NlKCkgeworICAgIGZsdXNoKCk7CisgICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgZmx1c2goKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgKi8KKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsgfQorCisgIC8qKgorICAgKiBUaGUgZm9sbG93aW5nIGJlaGF2aW9yIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBieSBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAqIGJ1dCB0aGF0IG1heSBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbjoKKyAgICogMS8gSWYgbGVuIGlzIGF0IG1vc3QgckJ1ZlNpemVfLCBib3Jyb3cgd2lsbCBuZXZlciByZXR1cm4gTlVMTC4KKyAgICogICAgRGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgaXQgY291bGQgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAqICAgIG9yIGhhbmcgZm9yZXZlci4KKyAgICogMi8gU29tZSBib3Jyb3cgcmVxdWVzdHMgbWF5IGNvcHkgYnl0ZXMgaW50ZXJuYWxseS4gIEhvd2V2ZXIsCisgICAqICAgIGlmIGxlbiBpcyBhdCBtb3N0IHJCdWZTaXplXy8yLCBub25lIG9mIHRoZSBjb3BpZWQgYnl0ZXMKKyAgICogICAgd2lsbCBldmVyIGhhdmUgdG8gYmUgY29waWVkIGFnYWluLiAgRm9yIG9wdGltaWFsIHBlcmZvcm1hbmNlLAorICAgKiAgICBzdGF5IHVuZGVyIHRoaXMgbGltaXQuCisgICAqLworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KKworICAvKgorICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgorICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgorICAgKi8KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBpbml0UG9pbnRlcnMoKSB7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7CisgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisgICAgLy8gV3JpdGUgc2l6ZSBuZXZlciBjaGFuZ2VzLgorICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisKKyAgdWludDMyX3QgckJ1ZlNpemVfOworICB1aW50MzJfdCB3QnVmU2l6ZV87CisgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gckJ1Zl87CisgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gd0J1Zl87Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBidWZmZXJlZCBvbmUuCisgKgorICovCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpKTsKKyAgfQorfTsKKworLyoqCisgKiBGcmFtZWQgdHJhbnNwb3J0LiBBbGwgd3JpdGVzIGdvIGludG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciB1bnRpbCBmbHVzaCBpcworICogY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNwb3J0IHdyaXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKKyAqIGJpbmFyeSBjaHVuayBmb2xsb3dlZCBieSB0aGUgZGF0YSBwYXlsb2FkLiBUaGlzIGFsbG93cyB0aGUgcmVjZWl2ZXIgb24gdGhlCisgKiBvdGhlciBlbmQgdG8gYWx3YXlzIGRvIGZpeGVkLWxlbmd0aCByZWFkcy4KKyAqCisgKi8KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEZyYW1lZFRyYW5zcG9ydCwgVEJ1ZmZlckJhc2U+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOworICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUgPSAyNTYgKiAxMDI0ICogMTAyNDsKKworICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgorICBURnJhbWVkVHJhbnNwb3J0KCkKKyAgICA6IHRyYW5zcG9ydF8oKSwKKyAgICAgIHJCdWZTaXplXygwKSwKKyAgICAgIHdCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKKyAgICAgIHJCdWZfKCksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSwKKyAgICAgIGJ1ZlJlY2xhaW1UaHJlc2hfKChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKSB7CisgICAgaW5pdFBvaW50ZXJzKCk7CisgIH0KKworICBURnJhbWVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICByQnVmXygpLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSksCisgICAgICBidWZSZWNsYWltVGhyZXNoXygoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSksCisgICAgICBtYXhGcmFtZVNpemVfKERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUpIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIFRGcmFtZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeiwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZSZWNsYWltVGhyZXNoID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oc3opLAorICAgICAgckJ1Zl8oKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pLAorICAgICAgYnVmUmVjbGFpbVRocmVzaF8oYnVmUmVjbGFpbVRocmVzaCksCisgICAgICBtYXhGcmFtZVNpemVfKERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUpIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQorCisgIGJvb2wgcGVlaygpIHsgcmV0dXJuIChyQmFzZV8gPCByQm91bmRfKSB8fCB0cmFuc3BvcnRfLT5wZWVrKCk7IH0KKworICB2b2lkIGNsb3NlKCkgeworICAgIGZsdXNoKCk7CisgICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworCisgIHVpbnQzMl90IHJlYWRFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZUVuZCgpOworCisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KKworICAvKgorICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgorICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgorICAgKi8KKyAgdXNpbmcgVEJ1ZmZlckJhc2U6OnJlYWRBbGw7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG9yaWdpbiBvZiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICovCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+Z2V0T3JpZ2luKCk7IH0KKworICAvKioKKyAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGZyYW1lIGF0IHJlYWQKKyAgICovCisgIHZvaWQgc2V0TWF4RnJhbWVTaXplKHVpbnQzMl90IG1heEZyYW1lU2l6ZSkgeyBtYXhGcmFtZVNpemVfID0gbWF4RnJhbWVTaXplOyB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBmcmFtZSBhdCByZWFkCisgICAqLworICB1aW50MzJfdCBnZXRNYXhGcmFtZVNpemUoKSB7IHJldHVybiBtYXhGcmFtZVNpemVfOyB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFJlYWRzIGEgZnJhbWUgb2YgaW5wdXQgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAqCisgICAqIFJldHVybnMgdHJ1ZSBpZiBhIGZyYW1lIHdhcyByZWFkIHN1Y2Nlc3NmdWxseSwgb3IgZmFsc2Ugb24gRU9GLgorICAgKiAoUmFpc2VzIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBFT0Ygb2NjdXJzIGFmdGVyIGEgcGFydGlhbCBmcmFtZS4pCisgICAqLworICB2aXJ0dWFsIGJvb2wgcmVhZEZyYW1lKCk7CisKKyAgdm9pZCBpbml0UG9pbnRlcnMoKSB7CisgICAgc2V0UmVhZEJ1ZmZlcihOVUxMLCAwKTsKKyAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKKworICAgIC8vIFBhZCB0aGUgYnVmZmVyIHNvIHdlIGNhbiBpbnNlcnQgdGhlIHNpemUgbGF0ZXIuCisgICAgaW50MzJfdCBwYWQgPSAwOworICAgIHRoaXMtPndyaXRlKCh1aW50OF90KikmcGFkLCBzaXplb2YocGFkKSk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKworICB1aW50MzJfdCByQnVmU2l6ZV87CisgIHVpbnQzMl90IHdCdWZTaXplXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiByQnVmXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB3QnVmXzsKKyAgdWludDMyX3QgYnVmUmVjbGFpbVRocmVzaF87CisgIHVpbnQzMl90IG1heEZyYW1lU2l6ZV87Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBmcmFtZWQgb25lLgorICoKKyAqLworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIC8qKgorICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBmcmFtZWQgb25lLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpKTsKKyAgfQorfTsKKworLyoqCisgKiBBIG1lbW9yeSBidWZmZXIgaXMgYSB0cmFucHNvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuCisgKiBpbiBtZW1vcnkgYnVmZmVyLiBBbnl0aW1lIHlvdSBjYWxsIHdyaXRlIG9uIGl0LCB0aGUgZGF0YSBpcyBzaW1wbHkgcGxhY2VkCisgKiBpbnRvIGEgYnVmZmVyLCBhbmQgYW55dGltZSB5b3UgY2FsbCByZWFkLCBkYXRhIGlzIHJlYWQgZnJvbSB0aGF0IGJ1ZmZlci4KKyAqCisgKiBUaGUgYnVmZmVycyBhcmUgYWxsb2NhdGVkIHVzaW5nIEMgY29uc3RydWN0cyBtYWxsb2MscmVhbGxvYywgYW5kIHRoZSBzaXplCisgKiBkb3VibGVzIGFzIG5lY2Vzc2FyeS4gIFdlJ3ZlIGNvbnNpZGVyZWQgdXNpbmcgc2NvcGVkCisgKgorICovCitjbGFzcyBUTWVtb3J5QnVmZmVyIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRNZW1vcnlCdWZmZXIsIFRCdWZmZXJCYXNlPiB7Citwcml2YXRlOgorICAvLyBDb21tb24gaW5pdGlhbGl6YXRpb24gZG9uZSBieSBhbGwgY29uc3RydWN0b3JzLgorICB2b2lkIGluaXRDb21tb24odWludDhfdCogYnVmLCB1aW50MzJfdCBzaXplLCBib29sIG93bmVyLCB1aW50MzJfdCB3UG9zKSB7CisKKyAgICBtYXhCdWZmZXJTaXplXyA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpOworCisgICAgaWYgKGJ1ZiA9PSBOVUxMICYmIHNpemUgIT0gMCkgeworICAgICAgYXNzZXJ0KG93bmVyKTsKKyAgICAgIGJ1ZiA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplKTsKKyAgICAgIGlmIChidWYgPT0gTlVMTCkgeworCXRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyXyA9IGJ1ZjsKKyAgICBidWZmZXJTaXplXyA9IHNpemU7CisKKyAgICByQmFzZV8gPSBidWZmZXJfOworICAgIHJCb3VuZF8gPSBidWZmZXJfICsgd1BvczsKKyAgICAvLyBUT0RPKGRyZWlzcyk6IEludmVzdGlnYXRlIE5VTEwtaW5nIHRoaXMgaWYgIW93bmVyLgorICAgIHdCYXNlXyA9IGJ1ZmZlcl8gKyB3UG9zOworICAgIHdCb3VuZF8gPSBidWZmZXJfICsgYnVmZmVyU2l6ZV87CisKKyAgICBvd25lcl8gPSBvd25lcjsKKworICAgIC8vIHJCb3VuZF8gaXMgcmVhbGx5IGFuIGFydGlmYWN0LiAgSW4gcHJpbmNpcGxlLCBpdCBzaG91bGQgYWx3YXlzIGJlCisgICAgLy8gZXF1YWwgdG8gd0Jhc2VfLiAgV2UgdXBkYXRlIGl0IGluIGEgZmV3IHBsYWNlcyAoY29tcHV0ZVJlYWQsIGV0Yy4pLgorICB9CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGRlZmF1bHRTaXplID0gMTAyNDsKKworICAvKioKKyAgICogVGhpcyBlbnVtIHNwZWNpZmllcyBob3cgYSBUTWVtb3J5QnVmZmVyIHNob3VsZCB0cmVhdAorICAgKiBtZW1vcnkgcGFzc2VkIHRvIGl0IHZpYSBjb25zdHJ1Y3RvcnMgb3IgcmVzZXRCdWZmZXIuCisgICAqCisgICAqIE9CU0VSVkU6CisgICAqICAgVE1lbW9yeUJ1ZmZlciB3aWxsIHNpbXBseSBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIG1lbW9yeS4KKyAgICogICBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgcG9pbnRlcgorICAgKiAgIHJlbWFpbnMgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgVE1lbW9yeUJ1ZmZlciwKKyAgICogICBhbmQgdGhhdCBpdCBpcyBwcm9wZXJseSBjbGVhbmVkIHVwLgorICAgKiAgIE5vdGUgdGhhdCBubyBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIG9ic2VydmVkIGJ1ZmZlcnMuCisgICAqCisgICAqIENPUFk6CisgICAqICAgVE1lbW9yeUJ1ZmZlciB3aWxsIG1ha2UgYW4gaW50ZXJuYWwgY29weSBvZiB0aGUgYnVmZmVyLgorICAgKiAgIFRoZSBjYWxsZXIgaGFzIG5vIHJlc3BvbnNpYmlsaXRpZXMuCisgICAqCisgICAqIFRBS0VfT1dORVJTSElQOgorICAgKiAgIFRNZW1vcnlCdWZmZXIgd2lsbCBiZWNvbWUgdGhlICJvd25lciIgb2YgdGhlIGJ1ZmZlciwKKyAgICogICBhbmQgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdC4KKyAgICogICBUaGUgbWVtYm9yeSBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MuCisgICAqLworICBlbnVtIE1lbW9yeVBvbGljeSB7IE9CU0VSVkUgPSAxLCBDT1BZID0gMiwgVEFLRV9PV05FUlNISVAgPSAzIH07CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhIGRlZmF1bHQtc2l6ZWQgYnVmZmVyLAorICAgKiBvd25lZCBieSB0aGUgVE1lbW9yeUJ1ZmZlciBvYmplY3QuCisgICAqLworICBUTWVtb3J5QnVmZmVyKCkgeyBpbml0Q29tbW9uKE5VTEwsIGRlZmF1bHRTaXplLCB0cnVlLCAwKTsgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYSBidWZmZXIgb2YgYSBzcGVjaWZpZWQgc2l6ZSwKKyAgICogb3duZWQgYnkgdGhlIFRNZW1vcnlCdWZmZXIgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gc3ogIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAgICovCisgIFRNZW1vcnlCdWZmZXIodWludDMyX3Qgc3opIHsgaW5pdENvbW1vbihOVUxMLCBzeiwgdHJ1ZSwgMCk7IH0KKworICAvKioKKyAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGJ1ZiBhcyBpdHMgaW5pdGlhbCBjb250ZW50cy4KKyAgICoKKyAgICogQHBhcmFtIGJ1ZiAgICBUaGUgaW5pdGlhbCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgorICAgKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCwgd2hpbGUgYnVmIGlzIGEgbm9uLWNvbnN0IHBvaW50ZXIsCisgICAqICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlciB3aWxsIG5vdCB3cml0ZSB0byBpdCBpZiBwb2xpY3kgPT0gT0JTRVJWRSwKKyAgICogICAgICAgICAgICAgICBzbyBpdCBpcyBzYWZlIHRvIGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdoYXRldmVyKS4KKyAgICogQHBhcmFtIHN6ICAgICBUaGUgc2l6ZSBvZiBAYyBidWYuCisgICAqIEBwYXJhbSBwb2xpY3kgU2VlIEBsaW5rIE1lbW9yeVBvbGljeSBAZW5kbGluayAuCisgICAqLworICBUTWVtb3J5QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc3osIE1lbW9yeVBvbGljeSBwb2xpY3kgPSBPQlNFUlZFKSB7CisgICAgaWYgKGJ1ZiA9PSBOVUxMICYmIHN6ICE9IDApIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUTWVtb3J5QnVmZmVyIGdpdmVuIG51bGwgYnVmZmVyIHdpdGggbm9uLXplcm8gc2l6ZS4iKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBvbGljeSkgeworICAgIGNhc2UgT0JTRVJWRToKKyAgICBjYXNlIFRBS0VfT1dORVJTSElQOgorICAgICAgaW5pdENvbW1vbihidWYsIHN6LCBwb2xpY3kgPT0gVEFLRV9PV05FUlNISVAsIHN6KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09QWToKKyAgICAgIGluaXRDb21tb24oTlVMTCwgc3osIHRydWUsIDApOworICAgICAgdGhpcy0+d3JpdGUoYnVmLCBzeik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgTWVtb3J5UG9saWN5IGZvciBUTWVtb3J5QnVmZmVyIik7CisgICAgfQorICB9CisKKyAgflRNZW1vcnlCdWZmZXIoKSB7CisgICAgaWYgKG93bmVyXykgeworICAgICAgc3RkOjpmcmVlKGJ1ZmZlcl8pOworICAgIH0KKyAgfQorCisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGJvb2wgcGVlaygpIHsgcmV0dXJuIChyQmFzZV8gPCB3QmFzZV8pOyB9CisKKyAgdm9pZCBvcGVuKCkge30KKworICB2b2lkIGNsb3NlKCkge30KKworICAvLyBUT0RPKGRyZWlzcyk6IE1ha2UgYnVmUHRyIGNvbnN0LgorICB2b2lkIGdldEJ1ZmZlcih1aW50OF90KiogYnVmUHRyLCB1aW50MzJfdCogc3opIHsKKyAgICAqYnVmUHRyID0gckJhc2VfOworICAgICpzeiA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSByQmFzZV8pOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QnVmZmVyQXNTdHJpbmcoKSB7CisgICAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICB1aW50OF90KiBidWY7CisgICAgdWludDMyX3Qgc3o7CisgICAgZ2V0QnVmZmVyKCZidWYsICZzeik7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilidWYsIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlKXN6KTsKKyAgfQorCisgIHZvaWQgYXBwZW5kQnVmZmVyVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgeworICAgIGlmIChidWZmZXJfID09IE5VTEwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDhfdCogYnVmOworICAgIHVpbnQzMl90IHN6OworICAgIGdldEJ1ZmZlcigmYnVmLCAmc3opOworICAgIHN0ci5hcHBlbmQoKGNoYXIqKWJ1Ziwgc3opOworICB9CisKKyAgdm9pZCByZXNldEJ1ZmZlcigpIHsKKyAgICByQmFzZV8gPSBidWZmZXJfOworICAgIHJCb3VuZF8gPSBidWZmZXJfOworICAgIHdCYXNlXyA9IGJ1ZmZlcl87CisgICAgLy8gSXQgaXNuJ3Qgc2FmZSB0byB3cml0ZSBpbnRvIGEgYnVmZmVyIHdlIGRvbid0IG93bi4KKyAgICBpZiAoIW93bmVyXykgeworICAgICAgd0JvdW5kXyA9IHdCYXNlXzsKKyAgICAgIGJ1ZmZlclNpemVfID0gMDsKKyAgICB9CisgIH0KKworICAvLy8gU2VlIGNvbnN0cnVjdG9yIGRvY3VtZW50YXRpb24uCisgIHZvaWQgcmVzZXRCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBzeiwgTWVtb3J5UG9saWN5IHBvbGljeSA9IE9CU0VSVkUpIHsKKyAgICAvLyBVc2UgYSB2YXJpYW50IG9mIHRoZSBjb3B5LWFuZC1zd2FwIHRyaWNrIGZvciBhc3NpZ25tZW50IG9wZXJhdG9ycy4KKyAgICAvLyBUaGlzIGlzIHN1Yi1vcHRpbWFsIGluIHRlcm1zIG9mIHBlcmZvcm1hbmNlIGZvciB0d28gcmVhc29uczoKKyAgICAvLyAgIDEvIFRoZSBjb25zdHJ1Y3RpbmcgYW5kIHN3YXBwaW5nIG9mIHRoZSAoc21hbGwpIHZhbHVlcworICAgIC8vICAgICAgaW4gdGhlIHRlbXBvcmFyeSBvYmplY3QgdGFrZXMgc29tZSB0aW1lLCBhbmQgaXMgbm90IG5lY2Vzc2FyeS4KKyAgICAvLyAgIDIvIElmIHBvbGljeSA9PSBDT1BZLCB3ZSBhbGxvY2F0ZSB0aGUgbmV3IGJ1ZmZlciBiZWZvcmUKKyAgICAvLyAgICAgIGZyZWVpbmcgdGhlIG9sZCBvbmUsIHByZWNsdWRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mCisgICAgLy8gICAgICByZXVzaW5nIHRoYXQgbWVtb3J5LgorICAgIC8vIEkgZG91YnQgdGhhdCBlaXRoZXIgb2YgdGhlc2UgcHJvYmxlbXMgY291bGQgYmUgb3B0aW1pemVkIGF3YXksCisgICAgLy8gYnV0IHRoZSBzZWNvbmQgaXMgcHJvYmFibHkgbm8gYSBjb21tb24gY2FzZSwgYW5kIHRoZSBmaXJzdCBpcyBtaW5vci4KKyAgICAvLyBJIGRvbid0IGV4cGVjdCByZXNldEJ1ZmZlciB0byBiZSBhIGNvbW1vbiBvcGVyYXRpb24sIHNvIEknbSB3aWxsaW5nIHRvCisgICAgLy8gYml0ZSB0aGUgcGVyZm9ybWFuY2UgYnVsbGV0IHRvIG1ha2UgdGhlIG1ldGhvZCB0aGlzIHNpbXBsZS4KKworICAgIC8vIENvbnN0cnVjdCB0aGUgbmV3IGJ1ZmZlci4KKyAgICBUTWVtb3J5QnVmZmVyIG5ld19idWZmZXIoYnVmLCBzeiwgcG9saWN5KTsKKyAgICAvLyBNb3ZlIGl0IGludG8gb3Vyc2VsZi4KKyAgICB0aGlzLT5zd2FwKG5ld19idWZmZXIpOworICAgIC8vIE91ciBvbGQgc2VsZiBnZXRzIGRlc3Ryb3llZC4KKyAgfQorCisgIC8vLyBTZWUgY29uc3RydWN0b3IgZG9jdW1lbnRhdGlvbi4KKyAgdm9pZCByZXNldEJ1ZmZlcih1aW50MzJfdCBzeikgeworICAgIC8vIENvbnN0cnVjdCB0aGUgbmV3IGJ1ZmZlci4KKyAgICBUTWVtb3J5QnVmZmVyIG5ld19idWZmZXIoc3opOworICAgIC8vIE1vdmUgaXQgaW50byBvdXJzZWxmLgorICAgIHRoaXMtPnN3YXAobmV3X2J1ZmZlcik7CisgICAgLy8gT3VyIG9sZCBzZWxmIGdldHMgZGVzdHJveWVkLgorICB9CisKKyAgc3RkOjpzdHJpbmcgcmVhZEFzU3RyaW5nKHVpbnQzMl90IGxlbikgeworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICAodm9pZClyZWFkQXBwZW5kVG9TdHJpbmcoc3RyLCBsZW4pOworICAgIHJldHVybiBzdHI7CisgIH0KKworICB1aW50MzJfdCByZWFkQXBwZW5kVG9TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgdWludDMyX3QgbGVuKTsKKworICAvLyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAgdWludDMyX3QgcmVhZEVuZCgpIHsKKyAgICAvLyBUaGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUsIGJlY2F1c2UgYnVmZmVyXydzIHNpemUgaXMgYSB1aW50MzJfdAorICAgIHVpbnQzMl90IGJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCYXNlXyAtIGJ1ZmZlcl8pOworICAgIGlmIChyQmFzZV8gPT0gd0Jhc2VfKSB7CisgICAgICByZXNldEJ1ZmZlcigpOworICAgIH0KKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICAvLyBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4KKyAgdWludDMyX3Qgd3JpdGVFbmQoKSB7CisgICAgLy8gVGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLCBiZWNhdXNlIGJ1ZmZlcl8ncyBzaXplIGlzIGEgdWludDMyX3QKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIGJ1ZmZlcl8pOworICB9CisKKyAgdWludDMyX3QgYXZhaWxhYmxlX3JlYWQoKSBjb25zdCB7CisgICAgLy8gUmVtZW1iZXIsIHdCYXNlXyBpcyB0aGUgcmVhbCByQm91bmRfLgorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gckJhc2VfKTsKKyAgfQorCisgIHVpbnQzMl90IGF2YWlsYWJsZV93cml0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3Qm91bmRfIC0gd0Jhc2VfKTsgfQorCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBjbGllbnQgY2FuIHdyaXRlIGRhdGEgdG8gYXBwZW5kIHRvCisgIC8vIHRoZSBUTWVtb3J5QnVmZmVyLCBhbmQgZW5zdXJlcyB0aGUgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gYWNjb21tb2RhdGUgYQorICAvLyB3cml0ZSBvZiB0aGUgcHJvdmlkZWQgbGVuZ3RoLiAgVGhlIHJldHVybmVkIHBvaW50ZXIgaXMgdmVyeSBjb252ZW5pZW50IGZvcgorICAvLyBwYXNzaW5nIHRvIHJlYWQoKSwgcmVjdigpLCBvciBzaW1pbGFyLiBZb3UgbXVzdCBjYWxsIHdyb3RlQnl0ZXMoKSBhcyBzb29uCisgIC8vIGFzIGRhdGEgaXMgd3JpdHRlbiBvciB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIGF3YXJlIHRoYXQgZGF0YSBoYXMgY2hhbmdlZC4KKyAgdWludDhfdCogZ2V0V3JpdGVQdHIodWludDMyX3QgbGVuKSB7CisgICAgZW5zdXJlQ2FuV3JpdGUobGVuKTsKKyAgICByZXR1cm4gd0Jhc2VfOworICB9CisKKyAgLy8gSW5mb3JtcyB0aGUgYnVmZmVyIHRoYXQgdGhlIGNsaWVudCBoYXMgd3JpdHRlbiAnbGVuJyBieXRlcyBpbnRvIHN0b3JhZ2UKKyAgLy8gdGhhdCBoYWQgYmVlbiBwcm92aWRlZCBieSBnZXRXcml0ZVB0cigpLgorICB2b2lkIHdyb3RlQnl0ZXModWludDMyX3QgbGVuKTsKKworICAvKgorICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgorICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgorICAgKi8KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CisKKyAgLy8hIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IGdldEJ1ZmZlclNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1ZmZlclNpemVfOworICB9CisKKyAgLy8hIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgbWF4aW11bSBidWZmZXIgc2l6ZQorICAvLyEgXHJldHVybnMgdGhlIGN1cnJlbnQgbWF4aW11bSBidWZmZXIgc2l6ZQorICB1aW50MzJfdCBnZXRNYXhCdWZmZXJTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtYXhCdWZmZXJTaXplXzsKKyAgfQorCisgIC8vISBcYnJpZWYgQ2hhbmdlIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplCisgIC8vISBccGFyYW1baW5dICBtYXhTaXplICB0aGUgbmV3IG1heGltdW0gYnVmZmVyIHNpemUgYWxsb3dlZCB0byBncm93IHRvCisgIC8vISBcdGhyb3dzICBUVHJhbnNwb3J0RXhjZXB0aW9uKEJBRF9BUkdTKSBpZiBtYXhTaXplIGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBidWZmZXIgc2l6ZQorICB2b2lkIHNldE1heEJ1ZmZlclNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIGlmIChtYXhTaXplIDwgYnVmZmVyU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXhpbXVtIGJ1ZmZlciBzaXplIHdvdWxkIGJlIGxlc3MgdGhhbiBjdXJyZW50IGJ1ZmZlciBzaXplIik7CisgICAgfQorICAgIG1heEJ1ZmZlclNpemVfID0gbWF4U2l6ZTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgc3dhcChUTWVtb3J5QnVmZmVyJiB0aGF0KSB7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIHN3YXAoYnVmZmVyXywgdGhhdC5idWZmZXJfKTsKKyAgICBzd2FwKGJ1ZmZlclNpemVfLCB0aGF0LmJ1ZmZlclNpemVfKTsKKworICAgIHN3YXAockJhc2VfLCB0aGF0LnJCYXNlXyk7CisgICAgc3dhcChyQm91bmRfLCB0aGF0LnJCb3VuZF8pOworICAgIHN3YXAod0Jhc2VfLCB0aGF0LndCYXNlXyk7CisgICAgc3dhcCh3Qm91bmRfLCB0aGF0LndCb3VuZF8pOworCisgICAgc3dhcChvd25lcl8sIHRoYXQub3duZXJfKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSdzIGF0IGxlYXN0ICdsZW4nIGJ5dGVzIGF2YWlsYWJsZSBmb3Igd3JpdGluZy4KKyAgdm9pZCBlbnN1cmVDYW5Xcml0ZSh1aW50MzJfdCBsZW4pOworCisgIC8vIENvbXB1dGUgdGhlIHBvc2l0aW9uIGFuZCBhdmFpbGFibGUgZGF0YSBmb3IgcmVhZGluZy4KKyAgdm9pZCBjb21wdXRlUmVhZCh1aW50MzJfdCBsZW4sIHVpbnQ4X3QqKiBvdXRfc3RhcnQsIHVpbnQzMl90KiBvdXRfZ2l2ZSk7CisKKyAgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgd3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CisKKyAgLy8gRGF0YSBidWZmZXIKKyAgdWludDhfdCogYnVmZmVyXzsKKworICAvLyBBbGxvY2F0ZWQgYnVmZmVyIHNpemUKKyAgdWludDMyX3QgYnVmZmVyU2l6ZV87CisKKyAgLy8gTWF4aW11bSBhbGxvd2VkIHNpemUKKyAgdWludDMyX3QgbWF4QnVmZmVyU2l6ZV87CisKKyAgLy8gSXMgdGhpcyBvYmplY3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXI/CisgIGJvb2wgb3duZXJfOworCisgIC8vIERvbid0IGZvcmdldCB0byB1cGRhdGUgY29uc3RyY3RvcnMsIGluaXRDb21tb24sIGFuZCBzd2FwIGlmCisgIC8vIHlvdSBhZGQgbmV3IG1lbWJlcnMuCit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkZDEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordm9pZCBURkRUcmFuc3BvcnQ6OmNsb3NlKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IHJ2ID0gOjpUSFJJRlRfQ0xPU0UoZmRfKTsKKyAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgIGZkXyA9IC0xOworICAvLyBIYXZlIHRvIGNoZWNrIHVuY2F1Z2h0X2V4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGluIHRoZSBkZXN0cnVjdG9yLgorICBpZiAocnYgPCAwICYmICFzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVEZEVHJhbnNwb3J0OjpjbG9zZSgpIiwgZXJybm9fY29weSk7CisgIH0KK30KKwordWludDMyX3QgVEZEVHJhbnNwb3J0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHVuc2lnbmVkIGludCBtYXhSZXRyaWVzID0gNTsgLy8gc2FtZSBhcyB0aGUgVFNvY2tldCBkZWZhdWx0CisgIHVuc2lnbmVkIGludCByZXRyaWVzID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBUSFJJRlRfU1NJWkVUIHJ2ID0gOjpUSFJJRlRfUkVBRChmZF8sIGJ1ZiwgbGVuKTsKKyAgICBpZiAocnYgPCAwKSB7CisgICAgICBpZiAoVEhSSUZUX0VSUk5PID09IFRIUklGVF9FSU5UUiAmJiByZXRyaWVzIDwgbWF4UmV0cmllcykgeworICAgICAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCisgICAgICAgICsrcmV0cmllczsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRGRFRyYW5zcG9ydDo6cmVhZCgpIiwgZXJybm9fY29weSk7CisgICAgfQorICAgIC8vIHRoaXMgc2hvdWxkIGJlIGZpbmUsIHNpbmNlIHdlIGFscmVhZHkgY2hlY2tlZCBmb3IgbmVnYXRpdmUgdmFsdWVzLAorICAgIC8vIGFuZCA6OnJlYWQgc2hvdWxkIG9ubHkgcmV0dXJuIGEgMzItYml0IHZhbHVlIHNpbmNlIGxlbiBpcyAzMi1iaXQuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pihydik7CisgIH0KK30KKwordm9pZCBURkRUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgVEhSSUZUX1NTSVpFVCBydiA9IDo6VEhSSUZUX1dSSVRFKGZkXywgYnVmLCBsZW4pOworCisgICAgaWYgKHJ2IDwgMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiLCBlcnJub19jb3B5KTsKKyAgICB9IGVsc2UgaWYgKHJ2ID09IDApIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiKTsKKyAgICB9CisKKyAgICBidWYgKz0gcnY7CisgICAgLy8gdGhpcyBzaG91bGQgYmUgZmluZSwgYXMgd2UndmUgYWxyZWFkeSBjaGVja2VkIGZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFuZAorICAgIC8vOjp3cml0ZSBzaG91bGRuJ3QgcmV0dXJuIG1vcmUgdGhhbiBhIHVpbnQzMl90IHNpbmNlIGxlbiBpcyBhIHVpbnQzMl90CisgICAgbGVuIC09IHN0YXRpY19jYXN0PHVpbnQzMl90Pihydik7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5M2Q0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9URkRUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIERlYWQtc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGEgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqLworY2xhc3MgVEZEVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRGRFRyYW5zcG9ydD4geworcHVibGljOgorICBlbnVtIENsb3NlUG9saWN5IHsgTk9fQ0xPU0VfT05fREVTVFJPWSA9IDAsIENMT1NFX09OX0RFU1RST1kgPSAxIH07CisKKyAgVEZEVHJhbnNwb3J0KGludCBmZCwgQ2xvc2VQb2xpY3kgY2xvc2VfcG9saWN5ID0gTk9fQ0xPU0VfT05fREVTVFJPWSkKKyAgICA6IGZkXyhmZCksIGNsb3NlX3BvbGljeV8oY2xvc2VfcG9saWN5KSB7fQorCisgIH5URkRUcmFuc3BvcnQoKSB7CisgICAgaWYgKGNsb3NlX3BvbGljeV8gPT0gQ0xPU0VfT05fREVTVFJPWSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIn5URkRUcmFuc3BvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbjogJyVzJyIsIGV4LndoYXQoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiBmZF8gPj0gMDsgfQorCisgIHZvaWQgb3BlbigpIHt9CisKKyAgdm9pZCBjbG9zZSgpOworCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgc2V0RkQoaW50IGZkKSB7IGZkXyA9IGZkOyB9CisgIGludCBnZXRGRCgpIHsgcmV0dXJuIGZkXzsgfQorCitwcm90ZWN0ZWQ6CisgIGludCBmZF87CisgIENsb3NlUG9saWN5IGNsb3NlX3BvbGljeV87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmI0NDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSwxMDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oPgorCisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2Vsc2UKKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y2VycjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK1RGaWxlVHJhbnNwb3J0OjpURmlsZVRyYW5zcG9ydChzdHJpbmcgcGF0aCwgYm9vbCByZWFkT25seSkKKyAgOiByZWFkU3RhdGVfKCksCisgICAgcmVhZEJ1ZmZfKE5VTEwpLAorICAgIGN1cnJlbnRFdmVudF8oTlVMTCksCisgICAgcmVhZEJ1ZmZTaXplXyhERUZBVUxUX1JFQURfQlVGRl9TSVpFKSwKKyAgICByZWFkVGltZW91dF8oTk9fVEFJTF9SRUFEX1RJTUVPVVQpLAorICAgIGNodW5rU2l6ZV8oREVGQVVMVF9DSFVOS19TSVpFKSwKKyAgICBldmVudEJ1ZmZlclNpemVfKERFRkFVTFRfRVZFTlRfQlVGRkVSX1NJWkUpLAorICAgIGZsdXNoTWF4VXNfKERFRkFVTFRfRkxVU0hfTUFYX1VTKSwKKyAgICBmbHVzaE1heEJ5dGVzXyhERUZBVUxUX0ZMVVNIX01BWF9CWVRFUyksCisgICAgbWF4RXZlbnRTaXplXyhERUZBVUxUX01BWF9FVkVOVF9TSVpFKSwKKyAgICBtYXhDb3JydXB0ZWRFdmVudHNfKERFRkFVTFRfTUFYX0NPUlJVUFRFRF9FVkVOVFMpLAorICAgIGVvZlNsZWVwVGltZV8oREVGQVVMVF9FT0ZfU0xFRVBfVElNRV9VUyksCisgICAgY29ycnVwdGVkRXZlbnRTbGVlcFRpbWVfKERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMpLAorICAgIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKERFRkFVTFRfV1JJVEVSX1RIUkVBRF9TTEVFUF9USU1FX1VTKSwKKyAgICBkZXF1ZXVlQnVmZmVyXyhOVUxMKSwKKyAgICBlbnF1ZXVlQnVmZmVyXyhOVUxMKSwKKyAgICBub3RGdWxsXygmbXV0ZXhfKSwKKyAgICBub3RFbXB0eV8oJm11dGV4XyksCisgICAgY2xvc2luZ18oZmFsc2UpLAorICAgIGZsdXNoZWRfKCZtdXRleF8pLAorICAgIGZvcmNlRmx1c2hfKGZhbHNlKSwKKyAgICBmaWxlbmFtZV8ocGF0aCksCisgICAgZmRfKDApLAorICAgIGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXyhmYWxzZSksCisgICAgb2Zmc2V0XygwKSwKKyAgICBsYXN0QmFkQ2h1bmtfKDApLAorICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfKDApLAorICAgIHJlYWRPbmx5XyhyZWFkT25seSkgeworICB0aHJlYWRGYWN0b3J5Xy5zZXREZXRhY2hlZChmYWxzZSk7CisgIG9wZW5Mb2dGaWxlKCk7Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OnJlc2V0T3V0cHV0RmlsZShpbnQgZmQsIHN0cmluZyBmaWxlbmFtZSwgb2ZmX3Qgb2Zmc2V0KSB7CisgIGZpbGVuYW1lXyA9IGZpbGVuYW1lOworICBvZmZzZXRfID0gb2Zmc2V0OworCisgIC8vIGNoZWNrIGlmIGN1cnJlbnQgZmlsZSBpcyBzdGlsbCBvcGVuCisgIGlmIChmZF8gPiAwKSB7CisgICAgLy8gZmx1c2ggYW55IGV2ZW50cyBpbiB0aGUgcXVldWUKKyAgICBmbHVzaCgpOworICAgIEdsb2JhbE91dHB1dC5wcmludGYoImVycm9yLCBjdXJyZW50IGZpbGUgKCVzKSBub3QgY2xvc2VkIiwgZmlsZW5hbWVfLmNfc3RyKCkpOworICAgIGlmICgtMSA9PSA6OlRIUklGVF9DTE9TRShmZF8pKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiByZXNldE91dHB1dEZpbGUoKSA6OmNsb3NlKCkgIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDogZXJyb3IgaW4gZmlsZSBjbG9zZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBzdWNjZXNzZnVsbHkgY2xvc2VkIGZkCisgICAgICBmZF8gPSAwOworICAgIH0KKyAgfQorCisgIGlmIChmZCkgeworICAgIGZkXyA9IGZkOworICB9IGVsc2UgeworICAgIC8vIG9wZW4gZmlsZSBpZiB0aGUgaW5wdXQgZmQgaXMgMAorICAgIG9wZW5Mb2dGaWxlKCk7CisgIH0KK30KKworVEZpbGVUcmFuc3BvcnQ6On5URmlsZVRyYW5zcG9ydCgpIHsKKyAgLy8gZmx1c2ggdGhlIGJ1ZmZlciBpZiBhIHdyaXRlciB0aHJlYWQgaXMgYWN0aXZlCisgIGlmICh3cml0ZXJUaHJlYWRfLmdldCgpKSB7CisgICAgLy8gc2V0IHN0YXRlIHRvIGNsb3NpbmcKKyAgICBjbG9zaW5nXyA9IHRydWU7CisKKyAgICAvLyB3YWtlIHVwIHRoZSB3cml0ZXIgdGhyZWFkCisgICAgLy8gU2luY2UgY2xvc2luZ18gaXMgdHJ1ZSwgaXQgd2lsbCBhdHRlbXB0IHRvIGZsdXNoIGFsbCBkYXRhLCB0aGVuIGV4aXQuCisgICAgbm90RW1wdHlfLm5vdGlmeSgpOworCisgICAgd3JpdGVyVGhyZWFkXy0+am9pbigpOworICAgIHdyaXRlclRocmVhZF8ucmVzZXQoKTsKKyAgfQorCisgIGlmIChkZXF1ZXVlQnVmZmVyXykgeworICAgIGRlbGV0ZSBkZXF1ZXVlQnVmZmVyXzsKKyAgICBkZXF1ZXVlQnVmZmVyXyA9IE5VTEw7CisgIH0KKworICBpZiAoZW5xdWV1ZUJ1ZmZlcl8pIHsKKyAgICBkZWxldGUgZW5xdWV1ZUJ1ZmZlcl87CisgICAgZW5xdWV1ZUJ1ZmZlcl8gPSBOVUxMOworICB9CisKKyAgaWYgKHJlYWRCdWZmXykgeworICAgIGRlbGV0ZVtdIHJlYWRCdWZmXzsKKyAgICByZWFkQnVmZl8gPSBOVUxMOworICB9CisKKyAgaWYgKGN1cnJlbnRFdmVudF8pIHsKKyAgICBkZWxldGUgY3VycmVudEV2ZW50XzsKKyAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKKyAgfQorCisgIC8vIGNsb3NlIGxvZ2ZpbGUKKyAgaWYgKGZkXyA+IDApIHsKKyAgICBpZiAoLTEgPT0gOjpUSFJJRlRfQ0xPU0UoZmRfKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IH5URmlsZVRyYW5zcG9ydCgpIDo6Y2xvc2UoKSAiLCBUSFJJRlRfRVJSTk8pOworICAgIH0gZWxzZSB7CisgICAgICAvLyBzdWNjZXNzZnVsbHkgY2xvc2VkIGZkCisgICAgICBmZF8gPSAwOworICAgIH0KKyAgfQorfQorCitib29sIFRGaWxlVHJhbnNwb3J0Ojppbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKSB7CisgIGlmIChidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8pIHsKKyAgICBUX0VSUk9SKCIlcyIsICJUcnlpbmcgdG8gZG91YmxlLWluaXQgVEZpbGVUcmFuc3BvcnQiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIXdyaXRlclRocmVhZF8uZ2V0KCkpIHsKKyAgICB3cml0ZXJUaHJlYWRfID0gdGhyZWFkRmFjdG9yeV8ubmV3VGhyZWFkKAorICAgICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OkZ1bmN0aW9uUnVubmVyOjpjcmVhdGUoc3RhcnRXcml0ZXJUaHJlYWQsIHRoaXMpKTsKKyAgICB3cml0ZXJUaHJlYWRfLT5zdGFydCgpOworICB9CisKKyAgZGVxdWV1ZUJ1ZmZlcl8gPSBuZXcgVEZpbGVUcmFuc3BvcnRCdWZmZXIoZXZlbnRCdWZmZXJTaXplXyk7CisgIGVucXVldWVCdWZmZXJfID0gbmV3IFRGaWxlVHJhbnNwb3J0QnVmZmVyKGV2ZW50QnVmZmVyU2l6ZV8pOworICBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8gPSB0cnVlOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAocmVhZE9ubHlfKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVEZpbGVUcmFuc3BvcnQ6IGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gZmlsZSBvcGVuZWQgcmVhZG9ubHkiKTsKKyAgfQorCisgIGVucXVldWVFdmVudChidWYsIGxlbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVD4KK3N0cnVjdCB1bmlxdWVEZWxldGVyCit7CisgIHZvaWQgb3BlcmF0b3IoKShfVCAqcHRyKSBjb25zdCB7IGRlbGV0ZSBwdHI7IH0KK307CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OmVucXVldWVFdmVudChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGV2ZW50TGVuKSB7CisgIC8vIGNhbid0IGVucXVldWUgbW9yZSBldmVudHMgaWYgZmlsZSBpcyBnb2luZyB0byBjbG9zZQorICBpZiAoY2xvc2luZ18pIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBtYWtlIHN1cmUgdGhhdCBldmVudCBzaXplIGlzIHZhbGlkCisgIGlmICgobWF4RXZlbnRTaXplXyA+IDApICYmIChldmVudExlbiA+IG1heEV2ZW50U2l6ZV8pKSB7CisgICAgVF9FUlJPUigibXNnIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1heCBldmVudCBzaXplOiAldSA+ICV1XG4iLCBldmVudExlbiwgbWF4RXZlbnRTaXplXyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGV2ZW50TGVuID09IDApIHsKKyAgICBUX0VSUk9SKCIlcyIsICJjYW5ub3QgZW5xdWV1ZSBhbiBlbXB0eSBldmVudCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxldmVudEluZm8sIHVuaXF1ZURlbGV0ZXI8ZXZlbnRJbmZvPiA+IHRvRW5xdWV1ZShuZXcgZXZlbnRJbmZvKCkpOworICB0b0VucXVldWUtPmV2ZW50QnVmZl8gPSBuZXcgdWludDhfdFsoc2l6ZW9mKHVpbnQ4X3QpICogZXZlbnRMZW4pICsgNF07CisKKyAgLy8gZmlyc3QgNCBieXRlcyBpcyB0aGUgZXZlbnQgbGVuZ3RoCisgIG1lbWNweSh0b0VucXVldWUtPmV2ZW50QnVmZl8sICh2b2lkKikoJmV2ZW50TGVuKSwgNCk7CisgIC8vIGFjdHVhbCBldmVudCBjb250ZW50cworICBtZW1jcHkodG9FbnF1ZXVlLT5ldmVudEJ1ZmZfICsgNCwgYnVmLCBldmVudExlbik7CisgIHRvRW5xdWV1ZS0+ZXZlbnRTaXplXyA9IGV2ZW50TGVuICsgNDsKKworICAvLyBsb2NrIG11dGV4CisgIEd1YXJkIGcobXV0ZXhfKTsKKworICAvLyBtYWtlIHN1cmUgdGhhdCBlbnF1ZXVlIGJ1ZmZlciBpcyBpbml0aWFsaXplZCBhbmQgd3JpdGVyIHRocmVhZCBpcyBydW5uaW5nCisgIGlmICghYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7CisgICAgaWYgKCFpbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIENhbid0IGVucXVldWUgd2hpbGUgYnVmZmVyIGlzIGZ1bGwKKyAgd2hpbGUgKGVucXVldWVCdWZmZXJfLT5pc0Z1bGwoKSkgeworICAgIG5vdEZ1bGxfLndhaXQoKTsKKyAgfQorCisgIC8vIFdlIHNob3VsZG4ndCBiZSB0cnlpbmcgdG8gZW5xdWV1ZSBuZXcgZGF0YSB3aGlsZSBhIGZvcmNlZCBmbHVzaCBpcworICAvLyByZXF1ZXN0ZWQuICAoT3RoZXJ3aXNlIHRoZSB3cml0ZXIgdGhyZWFkIG1pZ2h0IG5vdCBldmVyIGJlIGFibGUgdG8gZmluaXNoCisgIC8vIHRoZSBmbHVzaCBpZiBtb3JlIGRhdGEga2VlcHMgYmVpbmcgZW5xdWV1ZWQuKQorICBhc3NlcnQoIWZvcmNlRmx1c2hfKTsKKworICAvLyBhZGQgdG8gdGhlIGJ1ZmZlcgorICBldmVudEluZm8qIHBFdmVudCA9IHRvRW5xdWV1ZS5yZWxlYXNlKCk7CisgIGlmICghZW5xdWV1ZUJ1ZmZlcl8tPmFkZEV2ZW50KHBFdmVudCkpIHsKKyAgICBkZWxldGUgcEV2ZW50OworICAgIHJldHVybjsKKyAgfQorCisgIC8vIHNpZ25hbCBhbnlib2R5IHdobydzIHdhaXRpbmcgZm9yIHRoZSBidWZmZXIgdG8gYmUgbm9uLWVtcHR5CisgIG5vdEVtcHR5Xy5ub3RpZnkoKTsKKworICAvLyB0aGlzIHJlYWxseSBzaG91bGQgYmUgYSBsb29wIHdoZXJlIGl0IG1ha2VzIHN1cmUgaXQgZ290IGZsdXNoZWQKKyAgLy8gYmVjYXVzZSBjb25kaXRpb24gdmFyaWFibGVzIGNhbiBnZXQgdHJpZ2dlcmVkIGJ5IHRoZSBvcyBmb3Igbm8gcmVhc29uCisgIC8vIGl0IGlzIHByb2JhYmx5IGEgbm9uLWZhY3RvciBmb3IgdGhlIHRpbWUgYmVpbmcKK30KKworYm9vbCBURmlsZVRyYW5zcG9ydDo6c3dhcEV2ZW50QnVmZmVycyhzdHJ1Y3QgdGltZXZhbCogZGVhZGxpbmUpIHsKKyAgYm9vbCBzd2FwOworICBHdWFyZCBnKG11dGV4Xyk7CisKKyAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7CisgICAgc3dhcCA9IHRydWU7CisgIH0gZWxzZSBpZiAoY2xvc2luZ18pIHsKKyAgICAvLyBldmVuIHRob3VnaCB0aGVyZSBpcyBubyBkYXRhIHRvIHdyaXRlLAorICAgIC8vIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgdHJhbnNwb3J0IGlzIGNsb3NpbmcKKyAgICBzd2FwID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgaWYgKGRlYWRsaW5lICE9IE5VTEwpIHsKKyAgICAgIC8vIGlmIHdlIHdlcmUgaGFuZGVkIGEgZGVhZGxpbmUgdGltZSBzdHJ1Y3QsIGRvIGEgdGltZWQgd2FpdAorICAgICAgbm90RW1wdHlfLndhaXRGb3JUaW1lKGRlYWRsaW5lKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8ganVzdCB3YWl0IHVudGlsIHRoZSBidWZmZXIgZ2V0cyBhbiBpdGVtCisgICAgICBub3RFbXB0eV8ud2FpdCgpOworICAgIH0KKworICAgIC8vIGNvdWxkIGJlIGVtcHR5IGlmIHdlIHRpbWVkIG91dAorICAgIHN3YXAgPSBlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpOworICB9CisKKyAgaWYgKHN3YXApIHsKKyAgICBURmlsZVRyYW5zcG9ydEJ1ZmZlciogdGVtcCA9IGVucXVldWVCdWZmZXJfOworICAgIGVucXVldWVCdWZmZXJfID0gZGVxdWV1ZUJ1ZmZlcl87CisgICAgZGVxdWV1ZUJ1ZmZlcl8gPSB0ZW1wOworICB9CisKKyAgaWYgKHN3YXApIHsKKyAgICBub3RGdWxsXy5ub3RpZnkoKTsKKyAgfQorCisgIHJldHVybiBzd2FwOworfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0Ojp3cml0ZXJUaHJlYWQoKSB7CisgIGJvb2wgaGFzSU9FcnJvciA9IGZhbHNlOworCisgIC8vIG9wZW4gZmlsZSBpZiBpdCBpcyBub3Qgb3BlbgorICBpZiAoIWZkXykgeworICAgIHRyeSB7CisgICAgICBvcGVuTG9nRmlsZSgpOworICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgb3BlbkxvZ0ZpbGUoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIGZkXyA9IDA7CisgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBzZXQgdGhlIG9mZnNldCB0byB0aGUgY29ycmVjdCB2YWx1ZSAoRU9GKQorICBpZiAoIWhhc0lPRXJyb3IpIHsKKyAgICB0cnkgeworICAgICAgc2Vla1RvRW5kKCk7CisgICAgICAvLyB0aHJvdyBhd2F5IGFueSBwYXJ0aWFsIGV2ZW50cworICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl87CisgICAgICBpZiAoMCA9PSBUSFJJRlRfRlRSVU5DQVRFKGZkXywgb2Zmc2V0XykpIHsKKyAgICAgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSB0cnVuY2F0ZSAiLCBlcnJub19jb3B5KTsKKyAgICAgICAgaGFzSU9FcnJvciA9IHRydWU7CisgICAgICB9CisgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBpbml0aWFsaXphdGlvbiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIEZpZ3VyZSBvdXQgdGhlIG5leHQgdGltZSBieSB3aGljaCBhIGZsdXNoIG11c3QgdGFrZSBwbGFjZQorICBzdHJ1Y3QgdGltZXZhbCB0c19uZXh0X2ZsdXNoOworICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKKyAgdWludDMyX3QgdW5mbHVzaGVkID0gMDsKKworICB3aGlsZSAoMSkgeworICAgIC8vIHRoaXMgd2lsbCBvbmx5IGJlIHRydWUgd2hlbiB0aGUgZGVzdHJ1Y3RvciBpcyBiZWluZyBpbnZva2VkCisgICAgaWYgKGNsb3NpbmdfKSB7CisgICAgICBpZiAoaGFzSU9FcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIFRyeSB0byBlbXB0eSBidWZmZXJzIGJlZm9yZSBleGl0CisgICAgICBpZiAoZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSAmJiBkZXF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7CisgICAgICAgIDo6VEhSSUZUX0ZTWU5DKGZkXyk7CisgICAgICAgIGlmICgtMSA9PSA6OlRIUklGVF9DTE9TRShmZF8pKSB7CisgICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CisgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIDo6Y2xvc2UoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBmZCBzdWNjZXNzZnVsbHkgY2xvc2VkCisgICAgICAgICAgZmRfID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN3YXBFdmVudEJ1ZmZlcnMoJnRzX25leHRfZmx1c2gpKSB7CisgICAgICBldmVudEluZm8qIG91dEV2ZW50OworICAgICAgd2hpbGUgKE5VTEwgIT0gKG91dEV2ZW50ID0gZGVxdWV1ZUJ1ZmZlcl8tPmdldE5leHQoKSkpIHsKKyAgICAgICAgLy8gUmVtb3ZlIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlciBhbmQgd3JpdGUgaXQgb3V0IHRvIGRpc2suIElmIHRoZXJlIGlzIGFueSBJTyBlcnJvciwgZm9yCisgICAgICAgIC8vIGluc3RhbmNlLAorICAgICAgICAvLyB0aGUgb3V0cHV0IGZpbGUgaXMgdW5tb3VudGVkIG9yIGRlbGV0ZWQsIHRoZW4gdGhpcyBldmVudCBpcyBkcm9wcGVkLiBIb3dldmVyLCB0aGUgd3JpdGVyCisgICAgICAgIC8vIHRocmVhZAorICAgICAgICAvLyB3aWxsOiAoMSkgc2xlZXAgZm9yIGEgc2hvcnQgd2hpbGU7ICgyKSB0cnkgdG8gcmVvcGVuIHRoZSBmaWxlOyAoMykgaWYgc3VjY2Vzc2Z1bCB0aGVuCisgICAgICAgIC8vIHN0YXJ0IHdyaXRpbmcKKyAgICAgICAgLy8gZnJvbSB0aGUgZW5kLgorCisgICAgICAgIHdoaWxlIChoYXNJT0Vycm9yKSB7CisgICAgICAgICAgVF9FUlJPUigKKyAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXIgdGhyZWFkIGdvaW5nIHRvIHNsZWVwIGZvciAldSBtaWNyb3NlY29uZHMgZHVlIHRvIElPIGVycm9ycyIsCisgICAgICAgICAgICAgIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKKyAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyh3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7CisgICAgICAgICAgaWYgKGNsb3NpbmdfKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghZmRfKSB7CisgICAgICAgICAgICA6OlRIUklGVF9DTE9TRShmZF8pOworICAgICAgICAgICAgZmRfID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wZW5Mb2dGaWxlKCk7CisgICAgICAgICAgICBzZWVrVG9FbmQoKTsKKyAgICAgICAgICAgIHVuZmx1c2hlZCA9IDA7CisgICAgICAgICAgICBoYXNJT0Vycm9yID0gZmFsc2U7CisgICAgICAgICAgICBUX0xPR19PUEVSKAorICAgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDogbG9nIGZpbGUgJXMgcmVvcGVuZWQgYnkgd3JpdGVyIHRocmVhZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkiLAorICAgICAgICAgICAgICAgIGZpbGVuYW1lXy5jX3N0cigpKTsKKyAgICAgICAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiB1bmFibGUgdG8gcmVvcGVuIGxvZyBmaWxlICVzIGR1cmluZyBlcnJvciByZWNvdmVyeSIsCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lXy5jX3N0cigpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzYW5pdHkgY2hlY2sgb24gZXZlbnQKKyAgICAgICAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKG91dEV2ZW50LT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKKyAgICAgICAgICBUX0VSUk9SKCJtc2cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemU6ICV1ID4gJXVcbiIsCisgICAgICAgICAgICAgICAgICBvdXRFdmVudC0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgICAgICAgIG1heEV2ZW50U2l6ZV8pOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgY2h1bmtpbmcgaXMgcmVxdWlyZWQsIHRoZW4gbWFrZSBzdXJlIHRoYXQgbXNnIGRvZXMgbm90IGNyb3NzIGNodW5rIGJvdW5kYXJ5CisgICAgICAgIGlmICgob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiAwKSAmJiAoY2h1bmtTaXplXyAhPSAwKSkgeworICAgICAgICAgIC8vIGV2ZW50IHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gY2h1bmsgc2l6ZQorICAgICAgICAgIGlmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IGNodW5rU2l6ZV8pIHsKKyAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiBldmVudCBzaXplKCV1KSA+IGNodW5rIHNpemUoJXUpOiBza2lwcGluZyBldmVudCIsCisgICAgICAgICAgICAgICAgICAgIG91dEV2ZW50LT5ldmVudFNpemVfLAorICAgICAgICAgICAgICAgICAgICBjaHVua1NpemVfKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGludDY0X3QgY2h1bmsxID0gb2Zmc2V0XyAvIGNodW5rU2l6ZV87CisgICAgICAgICAgaW50NjRfdCBjaHVuazIgPSAob2Zmc2V0XyArIG91dEV2ZW50LT5ldmVudFNpemVfIC0gMSkgLyBjaHVua1NpemVfOworCisgICAgICAgICAgLy8gaWYgYWRkaW5nIHRoaXMgZXZlbnQgd2lsbCBjcm9zcyBhIGNodW5rIGJvdW5kYXJ5LCBwYWQgdGhlIGNodW5rIHdpdGggemVyb3MKKyAgICAgICAgICBpZiAoY2h1bmsxICE9IGNodW5rMikgeworICAgICAgICAgICAgLy8gcmVmZXRjaCB0aGUgb2Zmc2V0IHRvIGtlZXAgaW4gc3luYworICAgICAgICAgICAgb2Zmc2V0XyA9IFRIUklGVF9MU0VFSyhmZF8sIDAsIFNFRUtfQ1VSKTsKKyAgICAgICAgICAgIGludDMyX3QgcGFkZGluZyA9IChpbnQzMl90KSgob2Zmc2V0XyAvIGNodW5rU2l6ZV8gKyAxKSAqIGNodW5rU2l6ZV8gLSBvZmZzZXRfKTsKKworICAgICAgICAgICAgdWludDhfdCogemVyb3MgPSBuZXcgdWludDhfdFtwYWRkaW5nXTsKKyAgICAgICAgICAgIG1lbXNldCh6ZXJvcywgJ1wwJywgcGFkZGluZyk7CisgICAgICAgICAgICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IGFycmF5KHplcm9zKTsKKyAgICAgICAgICAgIGlmICgtMSA9PSA6OndyaXRlKGZkXywgemVyb3MsIHBhZGRpbmcpKSB7CisgICAgICAgICAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyVGhyZWFkKCkgZXJyb3Igd2hpbGUgcGFkZGluZyB6ZXJvcyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgICAgICAgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmZsdXNoZWQgKz0gcGFkZGluZzsKKyAgICAgICAgICAgIG9mZnNldF8gKz0gcGFkZGluZzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSB0aGUgZGVxdWV1ZWQgZXZlbnQgdG8gdGhlIGZpbGUKKyAgICAgICAgaWYgKG91dEV2ZW50LT5ldmVudFNpemVfID4gMCkgeworICAgICAgICAgIGlmICgtMSA9PSA6OlRIUklGVF9XUklURShmZF8sIG91dEV2ZW50LT5ldmVudEJ1ZmZfLCBvdXRFdmVudC0+ZXZlbnRTaXplXykpIHsKKyAgICAgICAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHdyaXRpbmcgZXZlbnQgIiwgZXJybm9fY29weSk7CisgICAgICAgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB1bmZsdXNoZWQgKz0gb3V0RXZlbnQtPmV2ZW50U2l6ZV87CisgICAgICAgICAgb2Zmc2V0XyArPSBvdXRFdmVudC0+ZXZlbnRTaXplXzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVxdWV1ZUJ1ZmZlcl8tPnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKGhhc0lPRXJyb3IpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIExvY2FsIHZhcmlhYmxlIHRvIGNhY2hlIHRoZSBzdGF0ZSBvZiBmb3JjZUZsdXNoXy4KKyAgICAvLworICAgIC8vIFdlIG9ubHkgd2FudCB0byBjaGVjayB0aGUgdmFsdWUgb2YgZm9yY2VGbHVzaF8gb25jZSBlYWNoIHRpbWUgYXJvdW5kIHRoZQorICAgIC8vIGxvb3AuICBJZiB3ZSBjaGVjayBpdCBtb3JlIHRoYW4gb25jZSB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2sgdGhlIGVudGlyZQorICAgIC8vIHRpbWUsIGl0IGNvdWxkIGhhdmUgY2hhbmdlZCBzdGF0ZSBpbiBiZXR3ZWVuLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiB1cworICAgIC8vIG1ha2luZyBpbmNvbnNpc3RlbnQgZGVjaXNpb25zLgorICAgIGJvb2wgZm9yY2VkX2ZsdXNoID0gZmFsc2U7CisgICAgeworICAgICAgR3VhcmQgZyhtdXRleF8pOworICAgICAgaWYgKGZvcmNlRmx1c2hfKSB7CisgICAgICAgIGlmICghZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSkgeworICAgICAgICAgIC8vIElmIGZvcmNlRmx1c2hfIGlzIHRydWUsIHdlIG5lZWQgdG8gZmx1c2ggYWxsIGF2YWlsYWJsZSBkYXRhLgorICAgICAgICAgIC8vIElmIGVucXVldWVCdWZmZXJfIGlzIG5vdCBlbXB0eSwgZ28gYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxvb3AgdG8KKyAgICAgICAgICAvLyB3cml0ZSBpdCBvdXQuCisgICAgICAgICAgLy8KKyAgICAgICAgICAvLyBXZSBrbm93IHRoZSBtYWluIHRocmVhZCBpcyB3YWl0aW5nIG9uIGZvcmNlRmx1c2hfIHRvIGJlIGNsZWFyZWQsCisgICAgICAgICAgLy8gc28gbm8gbmV3IGV2ZW50cyB3aWxsIGJlIGFkZGVkIHRvIGVucXVldWVCdWZmZXJfIHVudGlsIHdlIGNsZWFyCisgICAgICAgICAgLy8gZm9yY2VGbHVzaF8uICBUaGVyZWZvcmUgdGhlIG5leHQgdGltZSBhcm91bmQgdGhlIGxvb3AgZW5xdWV1ZUJ1ZmZlcl8KKyAgICAgICAgICAvLyBpcyBndWFyYW50ZWVkIHRvIGJlIGVtcHR5LiAgKEkuZS4sIHdlJ3JlIGd1YXJhbnRlZWQgdG8gbWFrZSBwcm9ncmVzcworICAgICAgICAgIC8vIGFuZCBjbGVhciBmb3JjZUZsdXNoXyB0aGUgbmV4dCB0aW1lIGFyb3VuZCB0aGUgbG9vcC4pCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yY2VkX2ZsdXNoID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBwZXJmb3JtIGFuIGZzeW5jCisgICAgYm9vbCBmbHVzaCA9IGZhbHNlOworICAgIGlmIChmb3JjZWRfZmx1c2ggfHwgdW5mbHVzaGVkID4gZmx1c2hNYXhCeXRlc18pIHsKKyAgICAgIGZsdXNoID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgc3RydWN0IHRpbWV2YWwgY3VycmVudF90aW1lOworICAgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmY3VycmVudF90aW1lLCBOVUxMKTsKKyAgICAgIGlmIChjdXJyZW50X3RpbWUudHZfc2VjID4gdHNfbmV4dF9mbHVzaC50dl9zZWMKKyAgICAgICAgICB8fCAoY3VycmVudF90aW1lLnR2X3NlYyA9PSB0c19uZXh0X2ZsdXNoLnR2X3NlYworICAgICAgICAgICAgICAmJiBjdXJyZW50X3RpbWUudHZfdXNlYyA+IHRzX25leHRfZmx1c2gudHZfdXNlYykpIHsKKyAgICAgICAgaWYgKHVuZmx1c2hlZCA+IDApIHsKKyAgICAgICAgICBmbHVzaCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbmV3IGRhdGEgc2luY2UgdGhlIGxhc3QgZnN5bmMsCisgICAgICAgICAgLy8gZG9uJ3QgcGVyZm9ybSB0aGUgZnN5bmMsIGJ1dCBkbyByZXNldCB0aGUgdGltZXIuCisgICAgICAgICAgZ2V0TmV4dEZsdXNoVGltZSgmdHNfbmV4dF9mbHVzaCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmx1c2gpIHsKKyAgICAgIC8vIHN5bmMgKGZvcmNlIGZsdXNoKSBmaWxlIHRvIGRpc2sKKyAgICAgIFRIUklGVF9GU1lOQyhmZF8pOworICAgICAgdW5mbHVzaGVkID0gMDsKKyAgICAgIGdldE5leHRGbHVzaFRpbWUoJnRzX25leHRfZmx1c2gpOworCisgICAgICAvLyBub3RpZnkgYW55Ym9keSB3YWl0aW5nIGZvciBmbHVzaCBjb21wbGV0aW9uCisgICAgICBpZiAoZm9yY2VkX2ZsdXNoKSB7CisgICAgICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICAgICAgZm9yY2VGbHVzaF8gPSBmYWxzZTsKKyAgICAgICAgYXNzZXJ0KGVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnQoZGVxdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSk7CisgICAgICAgIGZsdXNoZWRfLm5vdGlmeUFsbCgpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgLy8gZmlsZSBtdXN0IGJlIG9wZW4gZm9yIHdyaXRpbmcgZm9yIGFueSBmbHVzaGluZyB0byB0YWtlIHBsYWNlCisgIGlmICghd3JpdGVyVGhyZWFkXy5nZXQoKSkgeworICAgIHJldHVybjsKKyAgfQorICAvLyB3YWl0IGZvciBmbHVzaCB0byB0YWtlIHBsYWNlCisgIEd1YXJkIGcobXV0ZXhfKTsKKworICAvLyBJbmRpY2F0ZSB0aGF0IHdlIGFyZSByZXF1ZXN0aW5nIGEgZmx1c2gKKyAgZm9yY2VGbHVzaF8gPSB0cnVlOworICAvLyBXYWtlIHVwIHRoZSB3cml0ZXIgdGhyZWFkIHNvIGl0IHdpbGwgcGVyZm9ybSB0aGUgZmx1c2ggaW1tZWRpYXRlbHkKKyAgbm90RW1wdHlfLm5vdGlmeSgpOworCisgIHdoaWxlIChmb3JjZUZsdXNoXykgeworICAgIGZsdXNoZWRfLndhaXQoKTsKKyAgfQorfQorCit1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBoYXZlID0gMDsKKyAgdWludDMyX3QgZ2V0ID0gMDsKKworICB3aGlsZSAoaGF2ZSA8IGxlbikgeworICAgIGdldCA9IHJlYWQoYnVmICsgaGF2ZSwgbGVuIC0gaGF2ZSk7CisgICAgaWYgKGdldCA8PSAwKSB7CisgICAgICB0aHJvdyBURU9GRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGhhdmUgKz0gZ2V0OworICB9CisKKyAgcmV0dXJuIGhhdmU7Cit9CisKK2Jvb2wgVEZpbGVUcmFuc3BvcnQ6OnBlZWsoKSB7CisgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFuIGV2ZW50IHJlYWR5IHRvIGJlIHJlYWQKKyAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgY3VycmVudEV2ZW50XyA9IHJlYWRFdmVudCgpOworICB9CisKKyAgLy8gZGlkIG5vdCBtYW5hZ2UgdG8gcmVhZCBhbiBldmVudCBmcm9tIHRoZSBmaWxlLiBUaGlzIGNvdWxkIGhhdmUgaGFwcGVuZWQKKyAgLy8gaWYgdGhlIHRpbWVvdXQgZXhwaXJlZCBvciB0aGVyZSB3YXMgc29tZSBvdGhlciBlcnJvcgorICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byByZWFkCisgIHJldHVybiAoY3VycmVudEV2ZW50Xy0+ZXZlbnRTaXplXyAtIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18pID4gMDsKK30KKwordWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgLy8gY2hlY2sgaWYgdGhlcmUgYW4gZXZlbnQgaXMgcmVhZHkgdG8gYmUgcmVhZAorICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7CisgIH0KKworICAvLyBkaWQgbm90IG1hbmFnZSB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGZpbGUuIFRoaXMgY291bGQgaGF2ZSBoYXBwZW5lZAorICAvLyBpZiB0aGUgdGltZW91dCBleHBpcmVkIG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yCisgIGlmICghY3VycmVudEV2ZW50XykgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gcmVhZCBhcyBtdWNoIG9mIHRoZSBjdXJyZW50IGV2ZW50IGFzIHBvc3NpYmxlCisgIGludDMyX3QgcmVtYWluaW5nID0gY3VycmVudEV2ZW50Xy0+ZXZlbnRTaXplXyAtIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc187CisgIGlmIChyZW1haW5pbmcgPD0gKGludDMyX3QpbGVuKSB7CisgICAgLy8gY29weSBvdmVyIGFueXRoaW5nIHRoYXRzIHJlbWFpbmluZworICAgIGlmIChyZW1haW5pbmcgPiAwKSB7CisgICAgICBtZW1jcHkoYnVmLCBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZfICsgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmUG9zXywgcmVtYWluaW5nKTsKKyAgICB9CisgICAgZGVsZXRlIChjdXJyZW50RXZlbnRfKTsKKyAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKKyAgICByZXR1cm4gcmVtYWluaW5nOworICB9CisKKyAgLy8gcmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlCisgIG1lbWNweShidWYsIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZl8gKyBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfLCBsZW4pOworICBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfICs9IGxlbjsKKyAgcmV0dXJuIGxlbjsKK30KKworLy8gbm90ZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgcmV0dXJuZWQgZXZlbnRzCitldmVudEluZm8qIFRGaWxlVHJhbnNwb3J0OjpyZWFkRXZlbnQoKSB7CisgIGludCByZWFkVHJpZXMgPSAwOworCisgIGlmICghcmVhZEJ1ZmZfKSB7CisgICAgcmVhZEJ1ZmZfID0gbmV3IHVpbnQ4X3RbcmVhZEJ1ZmZTaXplX107CisgIH0KKworICB3aGlsZSAoMSkgeworICAgIC8vIHJlYWQgZnJvbSB0aGUgZmlsZSBpZiByZWFkIGJ1ZmZlciBpcyBleGhhdXN0ZWQKKyAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJQdHJfID09IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgeworICAgICAgLy8gYWR2YW5jZSB0aGUgb2Zmc2V0IHBvaW50ZXIKKyAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5idWZmZXJMZW5fOworICAgICAgcmVhZFN0YXRlXy5idWZmZXJMZW5fID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDo6VEhSSUZUX1JFQUQoZmRfLCByZWFkQnVmZl8sIHJlYWRCdWZmU2l6ZV8pKTsKKyAgICAgIC8vICAgICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKKyAgICAgIC8vICAgICAgICAgVF9ERUJVR19MKDEsICJBbW91bnQgcmVhZDogJXUgKG9mZnNldDogJWx1KSIsIHJlYWRTdGF0ZV8uYnVmZmVyTGVuXywgb2Zmc2V0Xyk7CisgICAgICAvLyAgICAgICB9CisgICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPSAwOworICAgICAgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfID0gMDsKKworICAgICAgLy8gcmVhZCBlcnJvcgorICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9PSAtMSkgeworICAgICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgICAgICAgIEdsb2JhbE91dHB1dCgiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIik7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRGaWxlVHJhbnNwb3J0OiBlcnJvciB3aGlsZSByZWFkaW5nIGZyb20gZmlsZSIpOworICAgICAgfSBlbHNlIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPT0gMCkgeyAvLyBFT0YKKyAgICAgICAgLy8gd2FpdCBpbmRlZmluaXRlbHkgaWYgdGhlcmUgaXMgbm8gdGltZW91dAorICAgICAgICBpZiAocmVhZFRpbWVvdXRfID09IFRBSUxfUkVBRF9USU1FT1VUKSB7CisgICAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoZW9mU2xlZXBUaW1lXyk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID09IE5PX1RBSUxfUkVBRF9USU1FT1VUKSB7CisgICAgICAgICAgLy8gcmVzZXQgc3RhdGUKKyAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUoMCk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZFRpbWVvdXRfID4gMCkgeworICAgICAgICAgIC8vIHRpbWVvdXQgYWxyZWFkeSBleHBpcmVkIG9uY2UKKyAgICAgICAgICBpZiAocmVhZFRyaWVzID4gMCkgeworICAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKDApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKHJlYWRUaW1lb3V0XyAqIDEwMDApOworICAgICAgICAgICAgcmVhZFRyaWVzKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZWFkVHJpZXMgPSAwOworCisgICAgLy8gYXR0ZW1wdCB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlcgorICAgIHdoaWxlIChyZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPCByZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKKyAgICAgIGlmIChyZWFkU3RhdGVfLnJlYWRpbmdTaXplXykgeworICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSAwKSB7CisgICAgICAgICAgaWYgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfKSAvIGNodW5rU2l6ZV8KKyAgICAgICAgICAgICAgIT0gKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgMykgLyBjaHVua1NpemVfKSkgeworICAgICAgICAgICAgLy8gc2tpcCBvbmUgYnl0ZSB0b3dhcmRzIGNodW5rIGJvdW5kYXJ5CisgICAgICAgICAgICAvLyAgICAgICAgICAgIFRfREVCVUdfTCgxLCAiU2tpcHBpbmcgYSBieXRlIik7CisgICAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8rKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZl9bcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXysrXQorICAgICAgICAgICAgPSByZWFkQnVmZl9bcmVhZFN0YXRlXy5idWZmZXJQdHJfKytdOworCisgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfID09IDQpIHsKKyAgICAgICAgICBpZiAocmVhZFN0YXRlXy5nZXRFdmVudFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyAwIGxlbmd0aCBldmVudCBpbmRpY2F0ZXMgcGFkZGluZworICAgICAgICAgICAgLy8gICAgICAgICAgICBUX0RFQlVHX0woMSwgIkdvdCBwYWRkaW5nIik7CisgICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBnb3QgYSB2YWxpZCBldmVudAorICAgICAgICAgIHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfID0gZmFsc2U7CisgICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfKSB7CisgICAgICAgICAgICBkZWxldGUgKHJlYWRTdGF0ZV8uZXZlbnRfKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBuZXcgZXZlbnRJbmZvKCk7CisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPSByZWFkU3RhdGVfLmdldEV2ZW50U2l6ZSgpOworCisgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGV2ZW50IGlzIGNvcnJ1cHRlZCBhbmQgcGVyZm9ybSByZWNvdmVyeSBpZiByZXF1aXJlZAorICAgICAgICAgIGlmIChpc0V2ZW50Q29ycnVwdGVkKCkpIHsKKyAgICAgICAgICAgIHBlcmZvcm1SZWNvdmVyeSgpOworICAgICAgICAgICAgLy8gc3RhcnQgZnJvbSB0aGUgdG9wCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZl8pIHsKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXyA9IG5ldyB1aW50OF90W3JlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfXTsKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGFrZSBlaXRoZXIgdGhlIGVudGlyZSBldmVudCBvciB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAgICAgICAgaW50IHJlY2xhaW1CdWZmZXIgPSAoc3RkOjptaW4pKCh1aW50MzJfdCkocmVhZFN0YXRlXy5idWZmZXJMZW5fIC0gcmVhZFN0YXRlXy5idWZmZXJQdHJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18pOworCisgICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIHJlYWQgYnVmZmVyIGludG8gZXZlbnQgYnVmZmVyCisgICAgICAgIG1lbWNweShyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfLAorICAgICAgICAgICAgICAgcmVhZEJ1ZmZfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfLAorICAgICAgICAgICAgICAgcmVjbGFpbUJ1ZmZlcik7CisKKyAgICAgICAgLy8gaW5jcmVtZW50IHBvc2l0aW9uIHB0cnMKKyAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gKz0gcmVjbGFpbUJ1ZmZlcjsKKyAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQdHJfICs9IHJlY2xhaW1CdWZmZXI7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGV2ZW50IGhhcyBiZWVuIHJlYWQgaW4gZnVsbAorICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gPT0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8pIHsKKyAgICAgICAgICAvLyBzZXQgdGhlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgY3VycmVudCBldmVudAorICAgICAgICAgIGV2ZW50SW5mbyogY29tcGxldGVFdmVudCA9IHJlYWRTdGF0ZV8uZXZlbnRfOworICAgICAgICAgIGNvbXBsZXRlRXZlbnQtPmV2ZW50QnVmZlBvc18gPSAwOworCisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBOVUxMOworICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmJ1ZmZlclB0cl8pOworCisgICAgICAgICAgLy8gZXhpdCBjcml0ZXJpYQorICAgICAgICAgIHJldHVybiBjb21wbGV0ZUV2ZW50OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Jvb2wgVEZpbGVUcmFuc3BvcnQ6OmlzRXZlbnRDb3JydXB0ZWQoKSB7CisgIC8vIGFuIGVycm9yIGlzIHRyaWdnZXJlZCBpZjoKKyAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKKyAgICAvLyAxLiBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIHVzZXItc3BlZmljaWVkIG1heC1ldmVudCBzaXplCisgICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBzaXplKCV1KSBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemUgKCV1KSIsCisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgIG1heEV2ZW50U2l6ZV8pOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gY2h1bmtTaXplXykgeworICAgIC8vIDIuIEV2ZW50IHNpemUgaXMgbGFyZ2VyIHRoYW4gY2h1bmsgc2l6ZQorICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgc2l6ZSgldSkgZ3JlYXRlciB0aGFuIGNodW5rIHNpemUgKCV1KSIsCisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgIGNodW5rU2l6ZV8pOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKCgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyAtIDQpIC8gY2h1bmtTaXplXykKKyAgICAgICAgICAgICAhPSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIDEpCisgICAgICAgICAgICAgICAgIC8gY2h1bmtTaXplXykpIHsKKyAgICAvLyAzLiBzaXplIGluZGljYXRlcyB0aGF0IGV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkKKyAgICBUX0VSUk9SKCJSZWFkIGNvcnJ1cHQgZXZlbnQuIEV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkuIEV2ZW50IHNpemU6JXUgIE9mZnNldDolbHUiLAorICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8sCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgNCkpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OnBlcmZvcm1SZWNvdmVyeSgpIHsKKyAgLy8gcGVyZm9ybSBzb21lIGtpY2thc3MgcmVjb3ZlcnkKKyAgdWludDMyX3QgY3VyQ2h1bmsgPSBnZXRDdXJDaHVuaygpOworICBpZiAobGFzdEJhZENodW5rXyA9PSBjdXJDaHVuaykgeworICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfKys7CisgIH0gZWxzZSB7CisgICAgbGFzdEJhZENodW5rXyA9IGN1ckNodW5rOworICAgIG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfID0gMTsKKyAgfQorCisgIGlmIChudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXyA8IG1heENvcnJ1cHRlZEV2ZW50c18pIHsKKyAgICAvLyBtYXliZSB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcmVhZGluZyB0aGUgZmlsZSBmcm9tIGRpc2sKKyAgICAvLyBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgY2h1bmsgYW5kIHRyeSBhZ2FpbgorICAgIHNlZWtUb0NodW5rKGN1ckNodW5rKTsKKyAgfSBlbHNlIHsKKworICAgIC8vIGp1c3Qgc2tpcCBhaGVhZCB0byB0aGUgbmV4dCBjaHVuayBpZiB3ZSBub3QgYWxyZWFkeSBhdCB0aGUgbGFzdCBjaHVuaworICAgIGlmIChjdXJDaHVuayAhPSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgeworICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmsgKyAxKTsKKyAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA9PSBUQUlMX1JFQURfVElNRU9VVCkgeworICAgICAgLy8gaWYgdGFpbGluZyB0aGUgZmlsZSwgd2FpdCB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggZGF0YSB0byBzdGFydAorICAgICAgLy8gdGhlIG5leHQgY2h1bmsKKyAgICAgIHdoaWxlIChjdXJDaHVuayA9PSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgeworICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyhjb3JydXB0ZWRFdmVudFNsZWVwVGltZV8pOworICAgICAgfQorICAgICAgc2Vla1RvQ2h1bmsoY3VyQ2h1bmsgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gcHJldHR5IGhvc2VkIGF0IHRoaXMgc3RhZ2UsIHJld2luZCB0aGUgZmlsZSBiYWNrIHRvIHRoZSBsYXN0IHN1Y2Nlc3NmdWwKKyAgICAgIC8vIHBvaW50IGFuZCBwdW50IG9uIHRoZSBlcnJvcgorICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXyk7CisgICAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKKyAgICAgIGNoYXIgZXJyb3JNc2dbMTAyNF07CisgICAgICBzcHJpbnRmKGVycm9yTXNnLAorICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlIGNvcnJ1cHRlZCBhdCBvZmZzZXQ6ICVsdSIsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG9mZnNldF8gKyByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8pKTsKKworICAgICAgR2xvYmFsT3V0cHV0KGVycm9yTXNnKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oZXJyb3JNc2cpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRGaWxlVHJhbnNwb3J0OjpzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSB7CisgIGlmIChmZF8gPD0gMCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZpbGUgbm90IG9wZW4iKTsKKyAgfQorCisgIGludDMyX3QgbnVtQ2h1bmtzID0gZ2V0TnVtQ2h1bmtzKCk7CisKKyAgLy8gZmlsZSBpcyBlbXB0eSwgc2Vla2luZyB0byBjaHVuayBpcyBwb2ludGxlc3MKKyAgaWYgKG51bUNodW5rcyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gbmVnYXRpdmUgaW5kaWNhdGVzIHJldmVyc2Ugc2VlayAoZnJvbSB0aGUgZW5kKQorICBpZiAoY2h1bmsgPCAwKSB7CisgICAgY2h1bmsgKz0gbnVtQ2h1bmtzOworICB9CisKKyAgLy8gdG9vIGxhcmdlIGEgdmFsdWUgZm9yIHJldmVyc2Ugc2VlaywganVzdCBzZWVrIHRvIGJlZ2lubmluZworICBpZiAoY2h1bmsgPCAwKSB7CisgICAgVF9ERUJVRygiJXMiLCAiSW5jb3JyZWN0IHZhbHVlIGZvciByZXZlcnNlIHNlZWsuIFNlZWtpbmcgdG8gYmVnaW5uaW5nLi4uIik7CisgICAgY2h1bmsgPSAwOworICB9CisKKyAgLy8gY2Fubm90IHNlZWsgcGFzdCBFT0YKKyAgYm9vbCBzZWVrVG9FbmQgPSBmYWxzZTsKKyAgb2ZmX3QgbWluRW5kT2Zmc2V0ID0gMDsKKyAgaWYgKGNodW5rID49IG51bUNodW5rcykgeworICAgIFRfREVCVUcoIiVzIiwgIlRyeWluZyB0byBzZWVrIHBhc3QgRU9GLiBTZWVraW5nIHRvIEVPRiBpbnN0ZWFkLi4uIik7CisgICAgc2Vla1RvRW5kID0gdHJ1ZTsKKyAgICBjaHVuayA9IG51bUNodW5rcyAtIDE7CisgICAgLy8gdGhpcyBpcyB0aGUgbWluIG9mZnNldCB0byBwcm9jZXNzIGV2ZW50cyB0aWxsCisgICAgbWluRW5kT2Zmc2V0ID0gOjpUSFJJRlRfTFNFRUsoZmRfLCAwLCBTRUVLX0VORCk7CisgIH0KKworICBvZmZfdCBuZXdPZmZzZXQgPSBvZmZfdChjaHVuaykgKiBjaHVua1NpemVfOworICBvZmZzZXRfID0gOjpUSFJJRlRfTFNFRUsoZmRfLCBuZXdPZmZzZXQsIFNFRUtfU0VUKTsKKyAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICBjdXJyZW50RXZlbnRfID0gTlVMTDsKKyAgaWYgKG9mZnNldF8gPT0gLTEpIHsKKyAgICBHbG9iYWxPdXRwdXQoIlRGaWxlVHJhbnNwb3J0OiBsc2VlayBlcnJvciBpbiBzZWVrVG9DaHVuayIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRGaWxlVHJhbnNwb3J0OiBsc2VlayBlcnJvciBpbiBzZWVrVG9DaHVuayIpOworICB9CisKKyAgLy8gc2VlayB0byBFT0YgaWYgdXNlciB3YW50ZWQgdG8gZ28gdG8gbGFzdCBjaHVuaworICBpZiAoc2Vla1RvRW5kKSB7CisgICAgdWludDMyX3Qgb2xkUmVhZFRpbWVvdXQgPSBnZXRSZWFkVGltZW91dCgpOworICAgIHNldFJlYWRUaW1lb3V0KE5PX1RBSUxfUkVBRF9USU1FT1VUKTsKKyAgICAvLyBrZWVwIG9uIHJlYWRpbmcgdW50aSB0aGUgbGFzdCBldmVudCBhdCBwb2ludCBvZiBzZWVrQ2h1bmsgY2FsbAorICAgIHNoYXJlZF9wdHI8ZXZlbnRJbmZvPiBldmVudDsKKyAgICB3aGlsZSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pIDwgbWluRW5kT2Zmc2V0KSB7CisgICAgICBldmVudC5yZXNldChyZWFkRXZlbnQoKSk7CisgICAgICBpZiAoZXZlbnQuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc2V0UmVhZFRpbWVvdXQob2xkUmVhZFRpbWVvdXQpOworICB9Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OnNlZWtUb0VuZCgpIHsKKyAgc2Vla1RvQ2h1bmsoZ2V0TnVtQ2h1bmtzKCkpOworfQorCit1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6Z2V0TnVtQ2h1bmtzKCkgeworICBpZiAoZmRfIDw9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHN0cnVjdCBUSFJJRlRfU1RBVCBmX2luZm87CisgIGludCBydiA9IDo6VEhSSUZUX0ZTVEFUKGZkXywgJmZfaW5mbyk7CisKKyAgaWYgKHJ2IDwgMCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDo6Z2V0TnVtQ2h1bmtzKCkgKGZzdGF0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmIChmX2luZm8uc3Rfc2l6ZSA+IDApIHsKKyAgICBzaXplX3QgbnVtQ2h1bmtzID0gKChmX2luZm8uc3Rfc2l6ZSkgLyBjaHVua1NpemVfKSArIDE7CisgICAgaWYgKG51bUNodW5rcyA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVG9vIG1hbnkgY2h1bmtzIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1DaHVua3MpOworICB9CisKKyAgLy8gZW1wdHkgZmlsZSBoYXMgbm8gY2h1bmtzCisgIHJldHVybiAwOworfQorCit1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6Z2V0Q3VyQ2h1bmsoKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob2Zmc2V0XyAvIGNodW5rU2l6ZV8pOworfQorCisvLyBVdGlsaXR5IEZ1bmN0aW9ucwordm9pZCBURmlsZVRyYW5zcG9ydDo6b3BlbkxvZ0ZpbGUoKSB7CisjaWZuZGVmIF9XSU4zMgorICBtb2RlX3QgbW9kZSA9IHJlYWRPbmx5XyA/IFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCA6IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CisgIGludCBmbGFncyA9IHJlYWRPbmx5XyA/IE9fUkRPTkxZIDogT19SRFdSIHwgT19DUkVBVCB8IE9fQVBQRU5EOworI2Vsc2UKKyAgaW50IG1vZGUgPSByZWFkT25seV8gPyBfU19JUkVBRCA6IF9TX0lSRUFEIHwgX1NfSVdSSVRFOworICBpbnQgZmxhZ3MgPSByZWFkT25seV8gPyBfT19SRE9OTFkgOiBfT19SRFdSIHwgX09fQ1JFQVQgfCBfT19BUFBFTkQ7CisjZW5kaWYKKyAgZmRfID0gOjpUSFJJRlRfT1BFTihmaWxlbmFtZV8uY19zdHIoKSwgZmxhZ3MsIG1vZGUpOworICBvZmZzZXRfID0gMDsKKworICAvLyBtYWtlIHN1cmUgb3BlbiBjYWxsIHdhcyBzdWNjZXNzZnVsCisgIGlmIChmZF8gPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogb3BlbkxvZ0ZpbGUoKSA6Om9wZW4oKSBmaWxlOiAiICsgZmlsZW5hbWVfLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCBmaWxlbmFtZV8sIGVycm5vX2NvcHkpOworICB9Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OmdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWV2YWwqIHRzX25leHRfZmx1c2gpIHsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSh0c19uZXh0X2ZsdXNoLCBOVUxMKTsKKworICB0c19uZXh0X2ZsdXNoLT50dl91c2VjICs9IGZsdXNoTWF4VXNfOworICBpZiAodHNfbmV4dF9mbHVzaC0+dHZfdXNlYyA+IDEwMDAwMDApIHsKKyAgICBsb25nIGV4dHJhX3NlY3MgPSB0c19uZXh0X2ZsdXNoLT50dl91c2VjIC8gMTAwMDAwMDsKKyAgICB0c19uZXh0X2ZsdXNoLT50dl91c2VjICU9IDEwMDAwMDA7CisgICAgdHNfbmV4dF9mbHVzaC0+dHZfc2VjICs9IGV4dHJhX3NlY3M7CisgIH0KK30KKworVEZpbGVUcmFuc3BvcnRCdWZmZXI6OlRGaWxlVHJhbnNwb3J0QnVmZmVyKHVpbnQzMl90IHNpemUpCisgIDogYnVmZmVyTW9kZV8oV1JJVEUpLCB3cml0ZVBvaW50XygwKSwgcmVhZFBvaW50XygwKSwgc2l6ZV8oc2l6ZSkgeworICBidWZmZXJfID0gbmV3IGV2ZW50SW5mbyogW3NpemVdOworfQorCitURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6flRGaWxlVHJhbnNwb3J0QnVmZmVyKCkgeworICBpZiAoYnVmZmVyXykgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZVBvaW50XzsgaSsrKSB7CisgICAgICBkZWxldGUgYnVmZmVyX1tpXTsKKyAgICB9CisgICAgZGVsZXRlW10gYnVmZmVyXzsKKyAgICBidWZmZXJfID0gTlVMTDsKKyAgfQorfQorCitib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjphZGRFdmVudChldmVudEluZm8qIGV2ZW50KSB7CisgIGlmIChidWZmZXJNb2RlXyA9PSBSRUFEKSB7CisgICAgR2xvYmFsT3V0cHV0KCJUcnlpbmcgdG8gd3JpdGUgdG8gYSBidWZmZXIgaW4gcmVhZCBtb2RlIik7CisgIH0KKyAgaWYgKHdyaXRlUG9pbnRfIDwgc2l6ZV8pIHsKKyAgICBidWZmZXJfW3dyaXRlUG9pbnRfKytdID0gZXZlbnQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gYnVmZmVyIGlzIGZ1bGwKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworZXZlbnRJbmZvKiBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6Z2V0TmV4dCgpIHsKKyAgaWYgKGJ1ZmZlck1vZGVfID09IFdSSVRFKSB7CisgICAgYnVmZmVyTW9kZV8gPSBSRUFEOworICB9CisgIGlmIChyZWFkUG9pbnRfIDwgd3JpdGVQb2ludF8pIHsKKyAgICByZXR1cm4gYnVmZmVyX1tyZWFkUG9pbnRfKytdOworICB9IGVsc2UgeworICAgIC8vIG5vIG1vcmUgZW50cmllcworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3ZvaWQgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OnJlc2V0KCkgeworICBpZiAoYnVmZmVyTW9kZV8gPT0gV1JJVEUgfHwgd3JpdGVQb2ludF8gPiByZWFkUG9pbnRfKSB7CisgICAgVF9ERUJVRygiJXMiLCAiUmVzZXR0aW5nIGEgYnVmZmVyIHdpdGggdW5yZWFkIGVudHJpZXMiKTsKKyAgfQorICAvLyBDbGVhbiB1cCB0aGUgb2xkIGVudHJpZXMKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdyaXRlUG9pbnRfOyBpKyspIHsKKyAgICBkZWxldGUgYnVmZmVyX1tpXTsKKyAgfQorICBidWZmZXJNb2RlXyA9IFdSSVRFOworICB3cml0ZVBvaW50XyA9IDA7CisgIHJlYWRQb2ludF8gPSAwOworfQorCitib29sIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjppc0Z1bGwoKSB7CisgIHJldHVybiB3cml0ZVBvaW50XyA9PSBzaXplXzsKK30KKworYm9vbCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6aXNFbXB0eSgpIHsKKyAgcmV0dXJuIHdyaXRlUG9pbnRfID09IDA7Cit9CisKK1RGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCkKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCkgeworCisgIC8vIGRlZmF1bHQgdGhlIG91dHB1dCB0cmFuc3BvcnQgdG8gYSBudWxsIHRyYW5zcG9ydCAoY29tbW9uIGNhc2UpCisgIG91dHB1dFRyYW5zcG9ydF8gPSBzaGFyZWRfcHRyPFROdWxsVHJhbnNwb3J0PihuZXcgVE51bGxUcmFuc3BvcnQoKSk7Cit9CisKK1RGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KQorICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpIHsKKworICAvLyBkZWZhdWx0IHRoZSBvdXRwdXQgdHJhbnNwb3J0IHRvIGEgbnVsbCB0cmFuc3BvcnQgKGNvbW1vbiBjYXNlKQorICBvdXRwdXRUcmFuc3BvcnRfID0gc2hhcmVkX3B0cjxUTnVsbFRyYW5zcG9ydD4obmV3IFROdWxsVHJhbnNwb3J0KCkpOworfQorCitURmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpLAorICAgIG91dHB1dFRyYW5zcG9ydF8ob3V0cHV0VHJhbnNwb3J0KSB7Cit9CisKK3ZvaWQgVEZpbGVQcm9jZXNzb3I6OnByb2Nlc3ModWludDMyX3QgbnVtRXZlbnRzLCBib29sIHRhaWwpIHsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydF8pOworCisgIC8vIHNldCB0aGUgcmVhZCB0aW1lb3V0IHRvIDAgaWYgdGFpbGluZyBpcyByZXF1aXJlZAorICBpbnQzMl90IG9sZFJlYWRUaW1lb3V0ID0gaW5wdXRUcmFuc3BvcnRfLT5nZXRSZWFkVGltZW91dCgpOworICBpZiAodGFpbCkgeworICAgIC8vIHNhdmUgb2xkIHJlYWQgdGltZW91dCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQKKyAgICBpbnB1dFRyYW5zcG9ydF8tPnNldFJlYWRUaW1lb3V0KFRGaWxlVHJhbnNwb3J0OjpUQUlMX1JFQURfVElNRU9VVCk7CisgIH0KKworICB1aW50MzJfdCBudW1Qcm9jZXNzZWQgPSAwOworICB3aGlsZSAoMSkgeworICAgIC8vIGJhZCBmb3JtIHRvIHVzZSBleGNlcHRpb25zIGZvciBmbG93IGNvbnRyb2wgYnV0IHRoZXJlIGlzIHJlYWxseQorICAgIC8vIG5vIG90aGVyIHdheSBhcm91bmQgaXQKKyAgICB0cnkgeworICAgICAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgTlVMTCk7CisgICAgICBudW1Qcm9jZXNzZWQrKzsKKyAgICAgIGlmICgobnVtRXZlbnRzID4gMCkgJiYgKG51bVByb2Nlc3NlZCA9PSBudW1FdmVudHMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChURU9GRXhjZXB0aW9uJikgeworICAgICAgaWYgKCF0YWlsKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHRlKSB7CisgICAgICBjZXJyIDw8IHRlLndoYXQoKSA8PCBlbmRsOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gcmVzdG9yZSBvbGQgcmVhZCB0aW1lb3V0CisgIGlmICh0YWlsKSB7CisgICAgaW5wdXRUcmFuc3BvcnRfLT5zZXRSZWFkVGltZW91dChvbGRSZWFkVGltZW91dCk7CisgIH0KK30KKwordm9pZCBURmlsZVByb2Nlc3Nvcjo6cHJvY2Vzc0NodW5rKCkgeworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnRfKTsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0Xyk7CisKKyAgdWludDMyX3QgY3VyQ2h1bmsgPSBpbnB1dFRyYW5zcG9ydF8tPmdldEN1ckNodW5rKCk7CisKKyAgd2hpbGUgKDEpIHsKKyAgICAvLyBiYWQgZm9ybSB0byB1c2UgZXhjZXB0aW9ucyBmb3IgZmxvdyBjb250cm9sIGJ1dCB0aGVyZSBpcyByZWFsbHkKKyAgICAvLyBubyBvdGhlciB3YXkgYXJvdW5kIGl0CisgICAgdHJ5IHsKKyAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIE5VTEwpOworICAgICAgaWYgKGN1ckNodW5rICE9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0Q3VyQ2h1bmsoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChURU9GRXhjZXB0aW9uJikgeworICAgICAgYnJlYWs7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIGNlcnIgPDwgdGUud2hhdCgpIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzdiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7CisKKy8vIERhdGEgcGVydGFpbmluZyB0byBhIHNpbmdsZSBldmVudAordHlwZWRlZiBzdHJ1Y3QgZXZlbnRJbmZvIHsKKyAgdWludDhfdCogZXZlbnRCdWZmXzsKKyAgdWludDMyX3QgZXZlbnRTaXplXzsKKyAgdWludDMyX3QgZXZlbnRCdWZmUG9zXzsKKworICBldmVudEluZm8oKSA6IGV2ZW50QnVmZl8oTlVMTCksIGV2ZW50U2l6ZV8oMCksIGV2ZW50QnVmZlBvc18oMCl7fTsKKyAgfmV2ZW50SW5mbygpIHsKKyAgICBpZiAoZXZlbnRCdWZmXykgeworICAgICAgZGVsZXRlW10gZXZlbnRCdWZmXzsKKyAgICB9CisgIH0KK30gZXZlbnRJbmZvOworCisvLyBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHJlYWQgc3RhdGUKK3R5cGVkZWYgc3RydWN0IHJlYWRTdGF0ZSB7CisgIGV2ZW50SW5mbyogZXZlbnRfOworCisgIC8vIGtlZXAgdHJhY2sgb2YgZXZlbnQgc2l6ZQorICB1aW50OF90IGV2ZW50U2l6ZUJ1ZmZfWzRdOworICB1aW50OF90IGV2ZW50U2l6ZUJ1ZmZQb3NfOworICBib29sIHJlYWRpbmdTaXplXzsKKworICAvLyByZWFkIGJ1ZmZlciB2YXJpYWJsZXMKKyAgaW50MzJfdCBidWZmZXJQdHJfOworICBpbnQzMl90IGJ1ZmZlckxlbl87CisKKyAgLy8gbGFzdCBzdWNjZXNzZnVsIGRpc3BhdGNoIHBvaW50CisgIGludDMyX3QgbGFzdERpc3BhdGNoUHRyXzsKKworICB2b2lkIHJlc2V0U3RhdGUodWludDMyX3QgbGFzdERpc3BhdGNoUHRyKSB7CisgICAgcmVhZGluZ1NpemVfID0gdHJ1ZTsKKyAgICBldmVudFNpemVCdWZmUG9zXyA9IDA7CisgICAgbGFzdERpc3BhdGNoUHRyXyA9IGxhc3REaXNwYXRjaFB0cjsKKyAgfQorCisgIHZvaWQgcmVzZXRBbGxWYWx1ZXMoKSB7CisgICAgcmVzZXRTdGF0ZSgwKTsKKyAgICBidWZmZXJQdHJfID0gMDsKKyAgICBidWZmZXJMZW5fID0gMDsKKyAgICBpZiAoZXZlbnRfKSB7CisgICAgICBkZWxldGUgKGV2ZW50Xyk7CisgICAgfQorICAgIGV2ZW50XyA9IDA7CisgIH0KKworICBpbmxpbmUgdWludDMyX3QgZ2V0RXZlbnRTaXplKCkgeworICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KGV2ZW50U2l6ZUJ1ZmZfKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihidWZmZXIpOworICB9CisKKyAgcmVhZFN0YXRlKCkgeworICAgIGV2ZW50XyA9IDA7CisgICAgcmVzZXRBbGxWYWx1ZXMoKTsKKyAgfQorCisgIH5yZWFkU3RhdGUoKSB7CisgICAgaWYgKGV2ZW50XykgeworICAgICAgZGVsZXRlIChldmVudF8pOworICAgIH0KKyAgfQorCit9IHJlYWRTdGF0ZTsKKworLyoqCisgKiBURmlsZVRyYW5zcG9ydEJ1ZmZlciAtIGJ1ZmZlciBjbGFzcyB1c2VkIGJ5IFRGaWxlVHJhbnNwb3J0IGZvciBxdWV1ZWluZyB1cCBldmVudHMKKyAqIHRvIGJlIHdyaXR0ZW4gdG8gZGlzay4gIFNob3VsZCBiZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICogIDEpIEJ1ZmZlciBjcmVhdGVkCisgKiAgMikgQnVmZmVyIHdyaXR0ZW4gdG8gKGFkZEV2ZW50KQorICogIDMpIEJ1ZmZlciByZWFkIGZyb20gKGdldE5leHQpCisgKiAgNCkgQnVmZmVyIHJlc2V0IChyZXNldCkKKyAqICA1KSBHbyBiYWNrIHRvIDIsIG9yIGRlc3Ryb3kgYnVmZmVyCisgKgorICogVGhlIGJ1ZmZlciBzaG91bGQgbmV2ZXIgYmUgd3JpdHRlbiB0byBhZnRlciBpdCBpcyByZWFkIGZyb20sIHVubGVzcyBpdCBpcyByZXNldCBmaXJzdC4KKyAqIE5vdGU6IFRoZSBhYm92ZSBydWxlcyBhcmUgZW5mb3JjZWQgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgaXRzIHNvbGUgY2xpZW50IFRGaWxlVHJhbnNwb3J0CisgKiAgICAgICB3aGljaCB1c2VzIHRoZSBidWZmZXIgaW4gdGhpcyB3YXkuCisgKgorICovCitjbGFzcyBURmlsZVRyYW5zcG9ydEJ1ZmZlciB7CitwdWJsaWM6CisgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKHVpbnQzMl90IHNpemUpOworICB+VEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsKKworICBib29sIGFkZEV2ZW50KGV2ZW50SW5mbyogZXZlbnQpOworICBldmVudEluZm8qIGdldE5leHQoKTsKKyAgdm9pZCByZXNldCgpOworICBib29sIGlzRnVsbCgpOworICBib29sIGlzRW1wdHkoKTsKKworcHJpdmF0ZToKKyAgVEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsgLy8gc2hvdWxkIG5vdCBiZSB1c2VkCisKKyAgZW51bSBtb2RlIHsgV1JJVEUsIFJFQUQgfTsKKyAgbW9kZSBidWZmZXJNb2RlXzsKKworICB1aW50MzJfdCB3cml0ZVBvaW50XzsKKyAgdWludDMyX3QgcmVhZFBvaW50XzsKKyAgdWludDMyX3Qgc2l6ZV87CisgIGV2ZW50SW5mbyoqIGJ1ZmZlcl87Cit9OworCisvKioKKyAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cyB1c2VkIHRvIHJlYWQgZmlsZXMKKyAqLworY2xhc3MgVEZpbGVSZWFkZXJUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgPSAwOworICB2aXJ0dWFsIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TnVtQ2h1bmtzKCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEN1ckNodW5rKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgc2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuaykgPSAwOworICB2aXJ0dWFsIHZvaWQgc2Vla1RvRW5kKCkgPSAwOworfTsKKworLyoqCisgKiBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHRyYW5zcG9ydHMgdXNlZCB0byB3cml0ZSBmaWxlcworICovCitjbGFzcyBURmlsZVdyaXRlclRyYW5zcG9ydCA6IHZpcnR1YWwgcHVibGljIFRUcmFuc3BvcnQgeworcHVibGljOgorICB2aXJ0dWFsIHVpbnQzMl90IGdldENodW5rU2l6ZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpID0gMDsKK307CisKKy8qKgorICogRmlsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHRyYW5zcG9ydC4gUmVhZHMgYW5kIHdyaXRlcyBhcmUgZG9uZSB0byBhCisgKiBmaWxlIG9uIGRpc2suCisgKgorICovCitjbGFzcyBURmlsZVRyYW5zcG9ydCA6IHB1YmxpYyBURmlsZVJlYWRlclRyYW5zcG9ydCwgcHVibGljIFRGaWxlV3JpdGVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVEZpbGVUcmFuc3BvcnQoc3RkOjpzdHJpbmcgcGF0aCwgYm9vbCByZWFkT25seSA9IGZhbHNlKTsKKyAgflRGaWxlVHJhbnNwb3J0KCk7CisKKyAgLy8gVE9ETzogd2hhdCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvdXIgZm9yIHRoaXM/CisgIC8vIHRoZSBsb2cgZmlsZSBpcyBnZW5lcmFsbHkgYWx3YXlzIG9wZW4KKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZvaWQgZmx1c2goKTsKKworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIGJvb2wgcGVlaygpOworCisgIC8vIGxvZy1maWxlIHNwZWNpZmljIGZ1bmN0aW9ucworICB2b2lkIHNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspOworICB2b2lkIHNlZWtUb0VuZCgpOworICB1aW50MzJfdCBnZXROdW1DaHVua3MoKTsKKyAgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKTsKKworICAvLyBmb3IgY2hhbmdpbmcgdGhlIG91dHB1dCBmaWxlCisgIHZvaWQgcmVzZXRPdXRwdXRGaWxlKGludCBmZCwgc3RkOjpzdHJpbmcgZmlsZW5hbWUsIG9mZl90IG9mZnNldCk7CisKKyAgLy8gU2V0dGVyL0dldHRlciBmdW5jdGlvbnMgZm9yIHVzZXItY29udHJvbGxhYmxlIG9wdGlvbnMKKyAgdm9pZCBzZXRSZWFkQnVmZlNpemUodWludDMyX3QgcmVhZEJ1ZmZTaXplKSB7CisgICAgaWYgKHJlYWRCdWZmU2l6ZSkgeworICAgICAgcmVhZEJ1ZmZTaXplXyA9IHJlYWRCdWZmU2l6ZTsKKyAgICB9CisgIH0KKyAgdWludDMyX3QgZ2V0UmVhZEJ1ZmZTaXplKCkgeyByZXR1cm4gcmVhZEJ1ZmZTaXplXzsgfQorCisgIHN0YXRpYyBjb25zdCBpbnQzMl90IFRBSUxfUkVBRF9USU1FT1VUID0gLTE7CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IE5PX1RBSUxfUkVBRF9USU1FT1VUID0gMDsKKyAgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSB7IHJlYWRUaW1lb3V0XyA9IHJlYWRUaW1lb3V0OyB9CisgIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKSB7IHJldHVybiByZWFkVGltZW91dF87IH0KKworICB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpIHsKKyAgICBpZiAoY2h1bmtTaXplKSB7CisgICAgICBjaHVua1NpemVfID0gY2h1bmtTaXplOworICAgIH0KKyAgfQorICB1aW50MzJfdCBnZXRDaHVua1NpemUoKSB7IHJldHVybiBjaHVua1NpemVfOyB9CisKKyAgdm9pZCBzZXRFdmVudEJ1ZmZlclNpemUodWludDMyX3QgYnVmZmVyU2l6ZSkgeworICAgIGlmIChidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8pIHsKKyAgICAgIEdsb2JhbE91dHB1dCgiQ2Fubm90IGNoYW5nZSB0aGUgYnVmZmVyIHNpemUgYWZ0ZXIgd3JpdGVyIHRocmVhZCBzdGFydGVkIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGV2ZW50QnVmZmVyU2l6ZV8gPSBidWZmZXJTaXplOworICB9CisKKyAgdWludDMyX3QgZ2V0RXZlbnRCdWZmZXJTaXplKCkgeyByZXR1cm4gZXZlbnRCdWZmZXJTaXplXzsgfQorCisgIHZvaWQgc2V0Rmx1c2hNYXhVcyh1aW50MzJfdCBmbHVzaE1heFVzKSB7CisgICAgaWYgKGZsdXNoTWF4VXMpIHsKKyAgICAgIGZsdXNoTWF4VXNfID0gZmx1c2hNYXhVczsKKyAgICB9CisgIH0KKyAgdWludDMyX3QgZ2V0Rmx1c2hNYXhVcygpIHsgcmV0dXJuIGZsdXNoTWF4VXNfOyB9CisKKyAgdm9pZCBzZXRGbHVzaE1heEJ5dGVzKHVpbnQzMl90IGZsdXNoTWF4Qnl0ZXMpIHsKKyAgICBpZiAoZmx1c2hNYXhCeXRlcykgeworICAgICAgZmx1c2hNYXhCeXRlc18gPSBmbHVzaE1heEJ5dGVzOworICAgIH0KKyAgfQorICB1aW50MzJfdCBnZXRGbHVzaE1heEJ5dGVzKCkgeyByZXR1cm4gZmx1c2hNYXhCeXRlc187IH0KKworICB2b2lkIHNldE1heEV2ZW50U2l6ZSh1aW50MzJfdCBtYXhFdmVudFNpemUpIHsgbWF4RXZlbnRTaXplXyA9IG1heEV2ZW50U2l6ZTsgfQorICB1aW50MzJfdCBnZXRNYXhFdmVudFNpemUoKSB7IHJldHVybiBtYXhFdmVudFNpemVfOyB9CisKKyAgdm9pZCBzZXRNYXhDb3JydXB0ZWRFdmVudHModWludDMyX3QgbWF4Q29ycnVwdGVkRXZlbnRzKSB7CisgICAgbWF4Q29ycnVwdGVkRXZlbnRzXyA9IG1heENvcnJ1cHRlZEV2ZW50czsKKyAgfQorICB1aW50MzJfdCBnZXRNYXhDb3JydXB0ZWRFdmVudHMoKSB7IHJldHVybiBtYXhDb3JydXB0ZWRFdmVudHNfOyB9CisKKyAgdm9pZCBzZXRFb2ZTbGVlcFRpbWVVcyh1aW50MzJfdCBlb2ZTbGVlcFRpbWUpIHsKKyAgICBpZiAoZW9mU2xlZXBUaW1lKSB7CisgICAgICBlb2ZTbGVlcFRpbWVfID0gZW9mU2xlZXBUaW1lOworICAgIH0KKyAgfQorICB1aW50MzJfdCBnZXRFb2ZTbGVlcFRpbWVVcygpIHsgcmV0dXJuIGVvZlNsZWVwVGltZV87IH0KKworICAvKgorICAgKiBPdmVycmlkZSBUVHJhbnNwb3J0ICpfdmlydCgpIGZ1bmN0aW9ucyB0byBpbnZva2Ugb3VyIGltcGxlbWVudGF0aW9ucy4KKyAgICogV2UgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBwcm92aWRlIHRoZXNlLCBzaW5jZSB3ZSBuZWVkIHRvIGluaGVyaXQKKyAgICogdmlydHVhbGx5IGZyb20gVFRyYW5zcG9ydC4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZEFsbChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOyB9CisKK3ByaXZhdGU6CisgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIHdyaXRpbmcgdG8gYSBmaWxlCisgIHZvaWQgZW5xdWV1ZUV2ZW50KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgZXZlbnRMZW4pOworICBib29sIHN3YXBFdmVudEJ1ZmZlcnMoc3RydWN0IHRpbWV2YWwqIGRlYWRsaW5lKTsKKyAgYm9vbCBpbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKTsKKworICAvLyBjb250cm9sIGZvciB3cml0ZXIgdGhyZWFkCisgIHN0YXRpYyB2b2lkKiBzdGFydFdyaXRlclRocmVhZCh2b2lkKiBwdHIpIHsKKyAgICBzdGF0aWNfY2FzdDxURmlsZVRyYW5zcG9ydCo+KHB0ciktPndyaXRlclRocmVhZCgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHZvaWQgd3JpdGVyVGhyZWFkKCk7CisKKyAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBmcm9tIGEgZmlsZQorICBldmVudEluZm8qIHJlYWRFdmVudCgpOworCisgIC8vIGV2ZW50IGNvcnJ1cHRpb24tcmVsYXRlZCBmdW5jdGlvbnMKKyAgYm9vbCBpc0V2ZW50Q29ycnVwdGVkKCk7CisgIHZvaWQgcGVyZm9ybVJlY292ZXJ5KCk7CisKKyAgLy8gVXRpbGl0eSBmdW5jdGlvbnMKKyAgdm9pZCBvcGVuTG9nRmlsZSgpOworICB2b2lkIGdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWV2YWwqIHRzX25leHRfZmx1c2gpOworCisgIC8vIENsYXNzIHZhcmlhYmxlcworICByZWFkU3RhdGUgcmVhZFN0YXRlXzsKKyAgdWludDhfdCogcmVhZEJ1ZmZfOworICBldmVudEluZm8qIGN1cnJlbnRFdmVudF87CisKKyAgdWludDMyX3QgcmVhZEJ1ZmZTaXplXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfUkVBRF9CVUZGX1NJWkUgPSAxICogMTAyNCAqIDEwMjQ7CisKKyAgaW50MzJfdCByZWFkVGltZW91dF87CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IERFRkFVTFRfUkVBRF9USU1FT1VUX01TID0gMjAwOworCisgIC8vIHNpemUgb2YgY2h1bmtzIHRoYXQgZmlsZSB3aWxsIGJlIHNwbGl0IHVwIGludG8KKyAgdWludDMyX3QgY2h1bmtTaXplXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfQ0hVTktfU0laRSA9IDE2ICogMTAyNCAqIDEwMjQ7CisKKyAgLy8gc2l6ZSBvZiBldmVudCBidWZmZXJzCisgIHVpbnQzMl90IGV2ZW50QnVmZmVyU2l6ZV87CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFID0gMTAwMDA7CisKKyAgLy8gbWF4IG51bWJlciBvZiBtaWNyb3NlY29uZHMgdGhhdCBjYW4gcGFzcyB3aXRob3V0IGZsdXNoaW5nCisgIHVpbnQzMl90IGZsdXNoTWF4VXNfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9GTFVTSF9NQVhfVVMgPSAzMDAwMDAwOworCisgIC8vIG1heCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB3aXRob3V0IGZsdXNoaW5nCisgIHVpbnQzMl90IGZsdXNoTWF4Qnl0ZXNfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9GTFVTSF9NQVhfQllURVMgPSAxMDAwICogMTAyNDsKKworICAvLyBtYXggZXZlbnQgc2l6ZQorICB1aW50MzJfdCBtYXhFdmVudFNpemVfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9NQVhfRVZFTlRfU0laRSA9IDA7CisKKyAgLy8gbWF4IG51bWJlciBvZiBjb3JydXB0ZWQgZXZlbnRzIHBlciBjaHVuaworICB1aW50MzJfdCBtYXhDb3JydXB0ZWRFdmVudHNfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9NQVhfQ09SUlVQVEVEX0VWRU5UUyA9IDA7CisKKyAgLy8gc2xlZXAgZHVyYXRpb24gd2hlbiBFT0YgaXMgaGl0CisgIHVpbnQzMl90IGVvZlNsZWVwVGltZV87CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0VPRl9TTEVFUF9USU1FX1VTID0gNTAwICogMTAwMDsKKworICAvLyBzbGVlcCBkdXJhdGlvbiB3aGVuIGEgY29ycnVwdGVkIGV2ZW50IGlzIGVuY291bnRlcmVkCisgIHVpbnQzMl90IGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfQ09SUlVQVEVEX1NMRUVQX1RJTUVfVVMgPSAxICogMTAwMCAqIDEwMDA7CisKKyAgLy8gc2xlZXAgZHVyYXRpb24gaW4gc2Vjb25kcyB3aGVuIGFuIElPIGVycm9yIGlzIGVuY291bnRlcmVkIGluIHRoZSB3cml0ZXIgdGhyZWFkCisgIHVpbnQzMl90IHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9XUklURVJfVEhSRUFEX1NMRUVQX1RJTUVfVVMgPSA2MCAqIDEwMDAgKiAxMDAwOworCisgIC8vIHdyaXRlciB0aHJlYWQKKyAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gd3JpdGVyVGhyZWFkXzsKKworICAvLyBidWZmZXJzIHRvIGhvbGQgZGF0YSBiZWZvcmUgaXQgaXMgZmx1c2hlZC4gRWFjaCBlbGVtZW50IG9mIHRoZSBidWZmZXIgc3RvcmVzIGEgbXNnIHRoYXQKKyAgLy8gbmVlZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4gIFRoZSBidWZmZXJzIGFyZSBzd2FwcGVkIGJ5IHRoZSB3cml0ZXIgdGhyZWFkLgorICBURmlsZVRyYW5zcG9ydEJ1ZmZlciogZGVxdWV1ZUJ1ZmZlcl87CisgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKiBlbnF1ZXVlQnVmZmVyXzsKKworICAvLyBjb25kaXRpb25zIHVzZWQgdG8gYmxvY2sgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IgZW1wdHkKKyAgTW9uaXRvciBub3RGdWxsXywgbm90RW1wdHlfOworICBzdGQ6OmF0b21pYzxib29sPiBjbG9zaW5nXzsKKworICAvLyBUbyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkCisgIE1vbml0b3IgZmx1c2hlZF87CisgIHN0ZDo6YXRvbWljPGJvb2w+IGZvcmNlRmx1c2hfOworCisgIC8vIE11dGV4IHRoYXQgaXMgZ3JhYmJlZCB3aGVuIGVucXVldWVpbmcgYW5kIHN3YXBwaW5nIHRoZSByZWFkL3dyaXRlIGJ1ZmZlcnMKKyAgTXV0ZXggbXV0ZXhfOworCisgIC8vIEZpbGUgaW5mb3JtYXRpb24KKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWVfOworICBpbnQgZmRfOworCisgIC8vIFdoZXRoZXIgdGhlIHdyaXRlciB0aHJlYWQgYW5kIGJ1ZmZlcnMgaGF2ZSBiZWVuIGluaXRpYWxpemVkCisgIGJvb2wgYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfOworCisgIC8vIE9mZnNldCB3aXRoaW4gdGhlIGZpbGUKKyAgb2ZmX3Qgb2Zmc2V0XzsKKworICAvLyBldmVudCBjb3JydXB0aW9uIGluZm9ybWF0aW9uCisgIHVpbnQzMl90IGxhc3RCYWRDaHVua187CisgIHVpbnQzMl90IG51bUNvcnJ1cHRlZEV2ZW50c0luQ2h1bmtfOworCisgIGJvb2wgcmVhZE9ubHlfOworfTsKKworLy8gRXhjZXB0aW9uIHRocm93biB3aGVuIEVPRiBpcyBoaXQKK2NsYXNzIFRFT0ZFeGNlcHRpb24gOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRFT0ZFeGNlcHRpb24oKSA6IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpe307Cit9OworCisvLyB3cmFwcGVyIGNsYXNzIHRvIHByb2Nlc3MgZXZlbnRzIGZyb20gYSBmaWxlIGNvbnRhaW5pbmcgdGhyaWZ0IGV2ZW50cworY2xhc3MgVEZpbGVQcm9jZXNzb3IgeworcHVibGljOgorICAvKioKKyAgICogQ29uc3RydWN0b3IgdGhhdCBkZWZhdWx0cyBvdXRwdXQgdHJhbnNwb3J0IHRvIG51bGwgdHJhbnNwb3J0CisgICAqCisgICAqIEBwYXJhbSBwcm9jZXNzb3IgcHJvY2Vzc2VzIGxvZy1maWxlIGV2ZW50cworICAgKiBAcGFyYW0gcHJvdG9jb2xGYWN0b3J5IHByb3RvY29sIGZhY3RvcnkKKyAgICogQHBhcmFtIGlucHV0VHJhbnNwb3J0IGZpbGUgdHJhbnNwb3J0CisgICAqLworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKKworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gcHJvY2Vzc29yIHByb2Nlc3NlcyBsb2ctZmlsZSBldmVudHMKKyAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBwcm90b2NvbCBmYWN0b3J5CisgICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBpbnB1dCBmaWxlIHRyYW5zcG9ydAorICAgKiBAcGFyYW0gb3V0cHV0IG91dHB1dCB0cmFuc3BvcnQKKyAgICovCisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOworCisgIC8qKgorICAgKiBwcm9jZXNzZXMgZXZlbnRzIGZyb20gdGhlIGZpbGUKKyAgICoKKyAgICogQHBhcmFtIG51bUV2ZW50cyBudW1iZXIgb2YgZXZlbnRzIHRvIHByb2Nlc3MgKDAgZm9yIHVubGltaXRlZCkKKyAgICogQHBhcmFtIHRhaWwgdGFpbHMgdGhlIGZpbGUgaWYgdHJ1ZQorICAgKi8KKyAgdm9pZCBwcm9jZXNzKHVpbnQzMl90IG51bUV2ZW50cywgYm9vbCB0YWlsKTsKKworICAvKioKKyAgICogcHJvY2VzcyBldmVudHMgdW50aWwgdGhlIGVuZCBvZiB0aGUgY2h1bmsKKyAgICoKKyAgICovCisgIHZvaWQgcHJvY2Vzc0NodW5rKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnRfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gX1RIUklGVF9UUkFOU1BPUlRfVEZJTEVUUkFOU1BPUlRfSF8KKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwODRlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKQEAgLTAsMCArMSw2MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOworCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QpIHsKKyAgICByZXR1cm4gdHJhbnNwb3J0Xy0+cmVhZChidWYsIGxlbik7CisgIH0KKworICByZXR1cm4gVEZyYW1lZFRyYW5zcG9ydDo6cmVhZFNsb3coYnVmLCBsZW4pOworfQorCit1aW50MTZfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRQcm90b2NvbElkKCkgY29uc3QgeworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSB7CisgICAgcmV0dXJuIHByb3RvSWQ7CisgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCB8fCBjbGllbnRUeXBlID09IFRIUklGVF9GUkFNRURfQ09NUEFDVCkgeworICAgIHJldHVybiBUX0NPTVBBQ1RfUFJPVE9DT0w7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFRfQklOQVJZX1BST1RPQ09MOyAvLyBBc3N1bWUgb3RoZXIgdHJhbnNwb3J0cyB1c2UgVEJpbmFyeQorICB9Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6ZW5zdXJlUmVhZEJ1ZmZlcih1aW50MzJfdCBzeikgeworICBpZiAoc3ogPiByQnVmU2l6ZV8pIHsKKyAgICByQnVmXy5yZXNldChuZXcgdWludDhfdFtzel0pOworICAgIHJCdWZTaXplXyA9IHN6OworICB9Cit9CisKK2Jvb2wgVEhlYWRlclRyYW5zcG9ydDo6cmVhZEZyYW1lKCkgeworICAvLyBzek4gaXMgbmV0d29yayBieXRlIG9yZGVyIG9mIHN6CisgIHVpbnQzMl90IHN6TjsKKyAgdWludDMyX3Qgc3o7CisKKyAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBmcmFtZS4KKyAgLy8gV2UgY2FuJ3QgdXNlIHJlYWRBbGwoJnN6LCBzaXplb2Yoc3opKSwgc2luY2UgdGhhdCBhbHdheXMgdGhyb3dzIGFuCisgIC8vIGV4Y2VwdGlvbiBvbiBFT0YuICBXZSB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBvbmx5IGlmIEVPRiBvY2N1cnMgYWZ0ZXIKKyAgLy8gcGFydGlhbCBzaXplIGRhdGEuCisgIHVpbnQzMl90IHNpemVCeXRlc1JlYWQgPSAwOworICB3aGlsZSAoc2l6ZUJ5dGVzUmVhZCA8IHNpemVvZihzek4pKSB7CisgICAgdWludDhfdCogc3pwID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN6TikgKyBzaXplQnl0ZXNSZWFkOworICAgIHVpbnQzMl90IGJ5dGVzUmVhZCA9IHRyYW5zcG9ydF8tPnJlYWQoc3pwLCBzaXplb2Yoc3pOKSAtIHNpemVCeXRlc1JlYWQpOworICAgIGlmIChieXRlc1JlYWQgPT0gMCkgeworICAgICAgaWYgKHNpemVCeXRlc1JlYWQgPT0gMCkgeworICAgICAgICAvLyBFT0YgYmVmb3JlIGFueSBkYXRhIHdhcyByZWFkLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBFT0YgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lIGhlYWRlci4gIFJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSBkYXRhIHRvIHJlYWQgYWZ0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0aWFsIGZyYW1lIGhlYWRlci4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2l6ZUJ5dGVzUmVhZCArPSBieXRlc1JlYWQ7CisgIH0KKworICBzeiA9IG50b2hsKHN6Tik7CisKKyAgZW5zdXJlUmVhZEJ1ZmZlcig0KTsKKworICBpZiAoKHN6ICYgVEJpbmFyeVByb3RvY29sOjpWRVJTSU9OX01BU0spID09ICh1aW50MzJfdClUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fMSkgeworICAgIC8vIHVuZnJhbWVkCisgICAgY2xpZW50VHlwZSA9IFRIUklGVF9VTkZSQU1FRF9CSU5BUlk7CisgICAgbWVtY3B5KHJCdWZfLmdldCgpLCAmc3pOLCBzaXplb2Yoc3pOKSk7CisgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgNCk7CisgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8aW50OF90PihzeiA+PiAyNCkgPT0gVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQKKyAgICAgICAgICAgICAmJiAoc3RhdGljX2Nhc3Q8aW50OF90PihzeiA+PiAxNikgJiBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX01BU0spCisgICAgICAgICAgICAgICAgICAgID09IFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTikgeworICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVDsKKyAgICBtZW1jcHkockJ1Zl8uZ2V0KCksICZzek4sIHNpemVvZihzek4pKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCA0KTsKKyAgfSBlbHNlIHsKKyAgICAvLyBDb3VsZCBiZSBoZWFkZXIgZm9ybWF0IG9yIGZyYW1lZC4gQ2hlY2sgbmV4dCB1aW50MzIKKyAgICB1aW50MzJfdCBtYWdpY19uOworICAgIHVpbnQzMl90IG1hZ2ljOworCisgICAgaWYgKHN6ID4gTUFYX0ZSQU1FX1NJWkUpIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgdHJhbnNwb3J0IGZyYW1lIGlzIHRvbyBsYXJnZSIpOworICAgIH0KKworICAgIGVuc3VyZVJlYWRCdWZmZXIoc3opOworCisgICAgLy8gV2UgY2FuIHVzZSByZWFkQWxsIGhlcmUsIGJlY2F1c2UgaXQgd291bGQgYmUgYW4gaW52YWxpZCBmcmFtZSBvdGhlcndpc2UKKyAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZtYWdpY19uKSwgc2l6ZW9mKG1hZ2ljX24pKTsKKyAgICBtZW1jcHkockJ1Zl8uZ2V0KCksICZtYWdpY19uLCBzaXplb2YobWFnaWNfbikpOworICAgIG1hZ2ljID0gbnRvaGwobWFnaWNfbik7CisKKyAgICBpZiAoKG1hZ2ljICYgVEJpbmFyeVByb3RvY29sOjpWRVJTSU9OX01BU0spID09ICh1aW50MzJfdClUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fMSkgeworICAgICAgLy8gZnJhbWVkCisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX0ZSQU1FRF9CSU5BUlk7CisgICAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpICsgNCwgc3ogLSA0KTsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgaWYgKHN0YXRpY19jYXN0PGludDhfdD4obWFnaWMgPj4gMjQpID09IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lECisgICAgICAgICAgICAgICAmJiAoc3RhdGljX2Nhc3Q8aW50OF90PihtYWdpYyA+PiAxNikgJiBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgPT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9OKSB7CisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUOworICAgICAgdHJhbnNwb3J0Xy0+cmVhZEFsbChyQnVmXy5nZXQoKSArIDQsIHN6IC0gNCk7CisgICAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIGlmIChIRUFERVJfTUFHSUMgPT0gKG1hZ2ljICYgSEVBREVSX01BU0spKSB7CisgICAgICBpZiAoc3ogPCAxMCkgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgdHJhbnNwb3J0IGZyYW1lIGlzIHRvbyBzbWFsbCIpOworICAgICAgfQorCisgICAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpICsgNCwgc3ogLSA0KTsKKworICAgICAgLy8gaGVhZGVyIGZvcm1hdAorICAgICAgY2xpZW50VHlwZSA9IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEU7CisgICAgICAvLyBmbGFncworICAgICAgZmxhZ3MgPSBtYWdpYyAmIEZMQUdTX01BU0s7CisgICAgICAvLyBzZXFJZAorICAgICAgdWludDMyX3Qgc2VxSWRfbjsKKyAgICAgIG1lbWNweSgmc2VxSWRfbiwgckJ1Zl8uZ2V0KCkgKyA0LCBzaXplb2Yoc2VxSWRfbikpOworICAgICAgc2VxSWQgPSBudG9obChzZXFJZF9uKTsKKyAgICAgIC8vIGhlYWRlciBzaXplCisgICAgICB1aW50MTZfdCBoZWFkZXJTaXplX247CisgICAgICBtZW1jcHkoJmhlYWRlclNpemVfbiwgckJ1Zl8uZ2V0KCkgKyA4LCBzaXplb2YoaGVhZGVyU2l6ZV9uKSk7CisgICAgICB1aW50MTZfdCBoZWFkZXJTaXplID0gbnRvaHMoaGVhZGVyU2l6ZV9uKTsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgICAgIHJlYWRIZWFkZXJGb3JtYXQoaGVhZGVyU2l6ZSwgc3opOworICAgIH0gZWxzZSB7CisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX1VOS05PV05fQ0xJRU5UX1RZUEU7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVjdCBjbGllbnQgdHJhbnNwb3J0IHR5cGUiKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBSZWFkcyBhIHN0cmluZyBmcm9tIHB0ciwgdGFraW5nIGNhcmUgbm90IHRvIHJlYWNoIGhlYWRlckJvdW5kYXJ5CisgKiBBZHZhbmNlcyBwdHIgb24gc3VjY2VzcworICoKKyAqIEBwYXJhbSAgIHN0ciAgICAgICAgICAgICBvdXRwdXQgc3RyaW5nCisgKiBAdGhyb3dzICBDT1JSVVBURURfREFUQSAgaWYgc2l6ZSBvZiBzdHJpbmcgZXhjZWVkcyBib3VuZGFyeQorICovCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRTdHJpbmcodWludDhfdComIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8gc3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb25zdCogaGVhZGVyQm91bmRhcnkpIHsKKyAgaW50MzJfdCBzdHJMZW47CisKKyAgdWludDMyX3QgYnl0ZXMgPSByZWFkVmFyaW50MzIocHRyLCAmc3RyTGVuLCBoZWFkZXJCb3VuZGFyeSk7CisgIGlmIChzdHJMZW4gPiBoZWFkZXJCb3VuZGFyeSAtIHB0cikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5mbyBoZWFkZXIgbGVuZ3RoIGV4Y2VlZHMgaGVhZGVyIHNpemUiKTsKKyAgfQorICBwdHIgKz0gYnl0ZXM7CisgIHN0ci5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocHRyKSwgc3RyTGVuKTsKKyAgcHRyICs9IHN0ckxlbjsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkSGVhZGVyRm9ybWF0KHVpbnQxNl90IGhlYWRlclNpemUsIHVpbnQzMl90IHN6KSB7CisgIHJlYWRUcmFuc18uY2xlYXIoKTsgICAvLyBDbGVhciBvdXQgYW55IHByZXZpb3VzIHRyYW5zZm9ybXMuCisgIHJlYWRIZWFkZXJzXy5jbGVhcigpOyAvLyBDbGVhciBvdXQgYW55IHByZXZpb3VzIGhlYWRlcnMuCisKKyAgLy8gc2tpcCBvdmVyIGFscmVhZHkgcHJvY2Vzc2VkIG1hZ2ljKDQpLCBzZXFJZCg0KSwgaGVhZGVyU2l6ZSgyKQorICB1aW50OF90KiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihyQnVmXy5nZXQoKSArIDEwKTsKKworICAvLyBDYXRjaCBpbnRlZ2VyIG92ZXJmbG93LCBjaGVjayBmb3IgcmVhc29uYWJsZSBoZWFkZXIgc2l6ZQorICBpZiAoaGVhZGVyU2l6ZSA+PSAxNjM4NCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNpemUgaXMgdW5yZWFzb25hYmxlIik7CisgIH0KKyAgaGVhZGVyU2l6ZSAqPSA0OworICBjb25zdCB1aW50OF90KiBjb25zdCBoZWFkZXJCb3VuZGFyeSA9IHB0ciArIGhlYWRlclNpemU7CisgIGlmIChoZWFkZXJTaXplID4gc3opIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciBzaXplIGlzIGxhcmdlciB0aGFuIGZyYW1lIik7CisgIH0KKyAgdWludDhfdCogZGF0YSA9IHB0ciArIGhlYWRlclNpemU7CisgIHB0ciArPSByZWFkVmFyaW50MTYocHRyLCAmcHJvdG9JZCwgaGVhZGVyQm91bmRhcnkpOworICBpbnQxNl90IG51bVRyYW5zZm9ybXM7CisgIHB0ciArPSByZWFkVmFyaW50MTYocHRyLCAmbnVtVHJhbnNmb3JtcywgaGVhZGVyQm91bmRhcnkpOworCisgIC8vIEZvciBub3cgYWxsIHRyYW5zZm9ybXMgY29uc2lzdCBvZiBvbmx5IHRoZSBJRCwgbm90IGRhdGEuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVHJhbnNmb3JtczsgaSsrKSB7CisgICAgaW50MzJfdCB0cmFuc0lkOworICAgIHB0ciArPSByZWFkVmFyaW50MzIocHRyLCAmdHJhbnNJZCwgaGVhZGVyQm91bmRhcnkpOworCisgICAgcmVhZFRyYW5zXy5wdXNoX2JhY2sodHJhbnNJZCk7CisgIH0KKworICAvLyBJbmZvIGhlYWRlcnMKKyAgd2hpbGUgKHB0ciA8IGhlYWRlckJvdW5kYXJ5KSB7CisgICAgaW50MzJfdCBpbmZvSWQ7CisgICAgcHRyICs9IHJlYWRWYXJpbnQzMihwdHIsICZpbmZvSWQsIGhlYWRlckJvdW5kYXJ5KTsKKworICAgIGlmIChpbmZvSWQgPT0gMCkgeworICAgICAgLy8gaGVhZGVyIHBhZGRpbmcKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaW5mb0lkID49IGluZm9JZFR5cGU6OkVORCkgeworICAgICAgLy8gY2Fubm90IGhhbmRsZSBpbmZvSWQKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKGluZm9JZCkgeworICAgIGNhc2UgaW5mb0lkVHlwZTo6S0VZVkFMVUU6CisgICAgICAvLyBQcm9jZXNzIGtleS12YWx1ZSBoZWFkZXJzCisgICAgICB1aW50MzJfdCBudW1LVkhlYWRlcnM7CisgICAgICBwdHIgKz0gcmVhZFZhcmludDMyKHB0ciwgKGludDMyX3QqKSZudW1LVkhlYWRlcnMsIGhlYWRlckJvdW5kYXJ5KTsKKyAgICAgIC8vIGNvbnRpbnVlIHVudGlsIHdlIHJlYWNoIChwYWRkZWQpIGVuZCBvZiBwYWNrZXQKKyAgICAgIHdoaWxlIChudW1LVkhlYWRlcnMtLSAmJiBwdHIgPCBoZWFkZXJCb3VuZGFyeSkgeworICAgICAgICAvLyBmb3JtYXQ6IGtleTsgdmFsdWUKKyAgICAgICAgLy8gYm90aDogbGVuZ3RoICh2YXJpbnQzMik7IHZhbHVlIChzdHJpbmcpCisgICAgICAgIHN0cmluZyBrZXksIHZhbHVlOworICAgICAgICByZWFkU3RyaW5nKHB0ciwga2V5LCBoZWFkZXJCb3VuZGFyeSk7CisgICAgICAgIC8vIHZhbHVlCisgICAgICAgIHJlYWRTdHJpbmcocHRyLCB2YWx1ZSwgaGVhZGVyQm91bmRhcnkpOworICAgICAgICAvLyBzYXZlIHRvIGhlYWRlcnMKKyAgICAgICAgcmVhZEhlYWRlcnNfW2tleV0gPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIFVudHJhbnNmb3JtIHRoZSBkYXRhIHNlY3Rpb24uICByQnVmIHdpbGwgY29udGFpbiByZXN1bHQuCisgIHVudHJhbnNmb3JtKGRhdGEsIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KHN6KSAtIChkYXRhIC0gckJ1Zl8uZ2V0KCkpKSk7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6dW50cmFuc2Zvcm0odWludDhfdCogcHRyLCB1aW50MzJfdCBzeikgeworICAvLyBVcGRhdGUgdGhlIHRyYW5zZm9ybSBidWZmZXIgc2l6ZSBpZiBuZWVkZWQKKyAgcmVzaXplVHJhbnNmb3JtQnVmZmVyKCk7CisKKyAgZm9yICh2ZWN0b3I8dWludDE2X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJlYWRUcmFuc18uYmVnaW4oKTsgaXQgIT0gcmVhZFRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgIGNvbnN0IHVpbnQxNl90IHRyYW5zSWQgPSAqaXQ7CisKKyAgICBpZiAodHJhbnNJZCA9PSBaTElCX1RSQU5TRk9STSkgeworICAgICAgel9zdHJlYW0gc3RyZWFtOworICAgICAgaW50IGVycjsKKworICAgICAgc3RyZWFtLm5leHRfaW4gPSBwdHI7CisgICAgICBzdHJlYW0uYXZhaWxfaW4gPSBzejsKKworICAgICAgLy8gU2V0dGluZyB0aGVzZSB0byAwIG1lYW5zIHVzZSB0aGUgZGVmYXVsdCBmcmVlL2FsbG9jIGZ1bmN0aW9ucworICAgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworICAgICAgZXJyID0gaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlSW5pdCIpOworICAgICAgfQorICAgICAgc3RyZWFtLm5leHRfb3V0ID0gdEJ1Zl8uZ2V0KCk7CisgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gdEJ1ZlNpemVfOworICAgICAgZXJyID0gaW5mbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCB8fCBzdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlIik7CisgICAgICB9CisgICAgICBzeiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICAgIGVyciA9IGluZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlRW5kIik7CisgICAgICB9CisKKyAgICAgIG1lbWNweShwdHIsIHRCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULCAiVW5rbm93biB0cmFuc2Zvcm0iKTsKKyAgICB9CisgIH0KKworICBzZXRSZWFkQnVmZmVyKHB0ciwgc3opOworfQorCisvKioKKyAqIFdlIG1heSBoYXZlIHVwZGF0ZWQgdGhlIHdCdWYgc2l6ZSwgdXBkYXRlIHRoZSB0QnVmIHNpemUgdG8gbWF0Y2guCisgKiBTaG91bGQgYmUgY2FsbGVkIGluIHRyYW5zZm9ybS4KKyAqCisgKiBUaGUgYnVmZmVyIHNob3VsZCBiZSBzbGlnaHRseSBsYXJnZXIgdGhhbiB3cml0ZSBidWZmZXIgc2l6ZSBkdWUgdG8KKyAqIGNvbXByZXNzaW9uIHRyYW5zZm9ybXMgKHRoYXQgbWF5IHNsaWdodGx5IGdyb3cgb24gc21hbGwgZnJhbWUgc2l6ZXMpCisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVzaXplVHJhbnNmb3JtQnVmZmVyKHVpbnQzMl90IGFkZGl0aW9uYWxTaXplKSB7CisgIGlmICh0QnVmU2l6ZV8gPCB3QnVmU2l6ZV8gKyBERUZBVUxUX0JVRkZFUl9TSVpFKSB7CisgICAgdWludDMyX3QgbmV3X3NpemUgPSB3QnVmU2l6ZV8gKyBERUZBVUxUX0JVRkZFUl9TSVpFICsgYWRkaXRpb25hbFNpemU7CisgICAgdWludDhfdCogbmV3X2J1ZiA9IG5ldyB1aW50OF90W25ld19zaXplXTsKKyAgICB0QnVmXy5yZXNldChuZXdfYnVmKTsKKyAgICB0QnVmU2l6ZV8gPSBuZXdfc2l6ZTsKKyAgfQorfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KSB7CisgIC8vIFVwZGF0ZSB0aGUgdHJhbnNmb3JtIGJ1ZmZlciBzaXplIGlmIG5lZWRlZAorICByZXNpemVUcmFuc2Zvcm1CdWZmZXIoKTsKKworICBmb3IgKHZlY3Rvcjx1aW50MTZfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gd3JpdGVUcmFuc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVUcmFuc18uZW5kKCk7ICsraXQpIHsKKyAgICBjb25zdCB1aW50MTZfdCB0cmFuc0lkID0gKml0OworCisgICAgaWYgKHRyYW5zSWQgPT0gWkxJQl9UUkFOU0ZPUk0pIHsKKyAgICAgIHpfc3RyZWFtIHN0cmVhbTsKKyAgICAgIGludCBlcnI7CisKKyAgICAgIHN0cmVhbS5uZXh0X2luID0gcHRyOworICAgICAgc3RyZWFtLmF2YWlsX2luID0gc3o7CisKKyAgICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgICAgc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgICAgc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICAgIGVyciA9IGRlZmxhdGVJbml0KCZzdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlSW5pdCIpOworICAgICAgfQorICAgICAgdWludDMyX3QgdGJ1Zl9zaXplID0gMDsKKyAgICAgIHdoaWxlIChlcnIgPT0gWl9PSykgeworICAgICAgICByZXNpemVUcmFuc2Zvcm1CdWZmZXIodGJ1Zl9zaXplKTsKKworICAgICAgICBzdHJlYW0ubmV4dF9vdXQgPSB0QnVmXy5nZXQoKTsKKyAgICAgICAgc3RyZWFtLmF2YWlsX291dCA9IHRCdWZTaXplXzsKKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgICAgIHRidWZfc2l6ZSArPSBERUZBVUxUX0JVRkZFUl9TSVpFOworICAgICAgfQorICAgICAgc3ogPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgICBlcnIgPSBkZWZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgaWYgKGVyciAhPSBaX09LKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHpsaWIgZGVmbGF0ZUVuZCIpOworICAgICAgfQorCisgICAgICBtZW1jcHkocHRyLCB0QnVmXy5nZXQoKSwgc3opOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLCAiVW5rbm93biB0cmFuc2Zvcm0iKTsKKyAgICB9CisgIH0KKworICB3QmFzZV8gPSB3QnVmXy5nZXQoKSArIHN6OworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlc2V0UHJvdG9jb2woKSB7CisgIC8vIFNldCB0byBhbnl0aGluZyBleGNlcHQgSFRUUCB0eXBlIHNvIHdlIGRvbid0IGZsdXNoIGFnYWluCisgIGNsaWVudFR5cGUgPSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFOworCisgIC8vIFJlYWQgdGhlIGhlYWRlciBhbmQgZGVjaWRlIHdoaWNoIHByb3RvY29sIHRvIGdvIHdpdGgKKyAgcmVhZEZyYW1lKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OmdldFdyaXRlQnl0ZXMoKSB7CisgIHJldHVybiBzYWZlX251bWVyaWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworfQorCisvKioKKyAqIFdyaXRlcyBhIHN0cmluZyB0byBhIGJ5dGUgYnVmZmVyLCBhcyBzaXplICh2YXJpbnQzMikgKyBzdHJpbmcgKG5vbi1udWxsCisgKiB0ZXJtaW5hdGVkKQorICogQXV0b21hdGljYWxseSBhZHZhbmNlcyBwdHIgdG8gYWZ0ZXIgdGhlIHdyaXR0ZW4gcG9ydGlvbgorICovCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlU3RyaW5nKHVpbnQ4X3QqJiBwdHIsIGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIGludDMyX3Qgc3RyTGVuID0gc2FmZV9udW1lcmljX2Nhc3Q8aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKKyAgcHRyICs9IHdyaXRlVmFyaW50MzIoc3RyTGVuLCBwdHIpOworICBtZW1jcHkocHRyLCBzdHIuY19zdHIoKSwgc3RyTGVuKTsgLy8gbm8gbmVlZCB0byB3cml0ZSBcMAorICBwdHIgKz0gc3RyTGVuOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnNldEhlYWRlcihjb25zdCBzdHJpbmcmIGtleSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICB3cml0ZUhlYWRlcnNfW2tleV0gPSB2YWx1ZTsKK30KKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6Z2V0TWF4V3JpdGVIZWFkZXJzU2l6ZSgpIGNvbnN0IHsKKyAgc2l6ZV90IG1heFdyaXRlSGVhZGVyc1NpemUgPSAwOworICBUSGVhZGVyVHJhbnNwb3J0OjpTdHJpbmdUb1N0cmluZ01hcDo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSB3cml0ZUhlYWRlcnNfLmJlZ2luKCk7IGl0ICE9IHdyaXRlSGVhZGVyc18uZW5kKCk7ICsraXQpIHsKKyAgICAvLyBhZGQgc2l6ZXMgb2Yga2V5IGFuZCB2YWx1ZSB0byBtYXhXcml0ZUhlYWRlcnNTaXplCisgICAgLy8gMiB2YXJpbnRzMzIgKyB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzCisgICAgbWF4V3JpdGVIZWFkZXJzU2l6ZSArPSA1ICsgNSArIChpdC0+Zmlyc3QpLmxlbmd0aCgpICsgKGl0LT5zZWNvbmQpLmxlbmd0aCgpOworICB9CisgIHJldHVybiBzYWZlX251bWVyaWNfY2FzdDx1aW50MzJfdD4obWF4V3JpdGVIZWFkZXJzU2l6ZSk7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6Y2xlYXJIZWFkZXJzKCkgeworICB3cml0ZUhlYWRlcnNfLmNsZWFyKCk7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6Zmx1c2goKSB7CisgIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIuCisgIHVpbnQzMl90IGhhdmVCeXRlcyA9IGdldFdyaXRlQnl0ZXMoKTsKKworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSB7CisgICAgdHJhbnNmb3JtKHdCdWZfLmdldCgpLCBoYXZlQnl0ZXMpOworICAgIGhhdmVCeXRlcyA9IGdldFdyaXRlQnl0ZXMoKTsgLy8gdHJhbnNmb3JtIG1heSBoYXZlIGNoYW5nZWQgdGhlIHNpemUKKyAgfQorCisgIC8vIE5vdGUgdGhhdCB3ZSByZXNldCB3QmFzZV8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICB3QmFzZV8gPSB3QnVmXy5nZXQoKTsKKworICBpZiAoaGF2ZUJ5dGVzID4gTUFYX0ZSQU1FX1NJWkUpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gc2VuZCBmcmFtZSB0aGF0IGlzIHRvbyBsYXJnZSIpOworICB9CisKKyAgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSkgeworICAgIC8vIGhlYWRlciBzaXplIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIGF0IHRoZSBlbmQgYmVjYXVzZSBvZiB2YXJpbnRzLgorICAgIC8vIE1ha2UgaXQgYmlnIGVub3VnaCBoZXJlIGZvciBtYXggdmFyaW50IHNpemUsIHBsdXMgNCBmb3IgcGFkZGluZy4KKyAgICB1aW50MzJfdCBoZWFkZXJTaXplID0gKDIgKyBnZXROdW1UcmFuc2Zvcm1zKCkpICogVEhSSUZUX01BWF9WQVJJTlQzMl9CWVRFUyArIDQ7CisgICAgLy8gYWRkIGFwcHJveGltYXRlIHNpemUgb2YgaW5mbyBoZWFkZXJzCisgICAgaGVhZGVyU2l6ZSArPSBnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCk7CisKKyAgICAvLyBQa3Qgc2l6ZQorICAgIHVpbnQzMl90IG1heFN6SGJvID0gaGVhZGVyU2l6ZSArIGhhdmVCeXRlcyAvLyB0aHJpZnQgaGVhZGVyICsgcGF5bG9hZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAxMDsgICAgICAgICAgICAgICAgICAvLyBjb21tb24gaGVhZGVyIHNlY3Rpb24KKyAgICB1aW50OF90KiBwa3QgPSB0QnVmXy5nZXQoKTsKKyAgICB1aW50OF90KiBoZWFkZXJTdGFydDsKKyAgICB1aW50OF90KiBoZWFkZXJTaXplUHRyOworICAgIHVpbnQ4X3QqIHBrdFN0YXJ0ID0gcGt0OworCisgICAgaWYgKG1heFN6SGJvID4gdEJ1ZlNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBoZWFkZXIgZnJhbWUgdGhhdCBpcyB0b28gbGFyZ2UiKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzekhibzsKKyAgICB1aW50MzJfdCBzek5ibzsKKyAgICB1aW50MTZfdCBoZWFkZXJTaXplTjsKKworICAgIC8vIEZpeHVwIHN6SGJvIGxhdGVyCisgICAgcGt0ICs9IHNpemVvZihzek5ibyk7CisgICAgdWludDE2X3QgaGVhZGVyTiA9IGh0b25zKEhFQURFUl9NQUdJQyA+PiAxNik7CisgICAgbWVtY3B5KHBrdCwgJmhlYWRlck4sIHNpemVvZihoZWFkZXJOKSk7CisgICAgcGt0ICs9IHNpemVvZihoZWFkZXJOKTsKKyAgICB1aW50MTZfdCBmbGFnc04gPSBodG9ucyhmbGFncyk7CisgICAgbWVtY3B5KHBrdCwgJmZsYWdzTiwgc2l6ZW9mKGZsYWdzTikpOworICAgIHBrdCArPSBzaXplb2YoZmxhZ3NOKTsKKyAgICB1aW50MzJfdCBzZXFJZE4gPSBodG9ubChzZXFJZCk7CisgICAgbWVtY3B5KHBrdCwgJnNlcUlkTiwgc2l6ZW9mKHNlcUlkTikpOworICAgIHBrdCArPSBzaXplb2Yoc2VxSWROKTsKKyAgICBoZWFkZXJTaXplUHRyID0gcGt0OworICAgIC8vIEZpeHVwIGhlYWRlclNpemVOIGxhdGVyCisgICAgcGt0ICs9IHNpemVvZihoZWFkZXJTaXplTik7CisgICAgaGVhZGVyU3RhcnQgPSBwa3Q7CisKKyAgICBwa3QgKz0gd3JpdGVWYXJpbnQzMihwcm90b0lkLCBwa3QpOworICAgIHBrdCArPSB3cml0ZVZhcmludDMyKGdldE51bVRyYW5zZm9ybXMoKSwgcGt0KTsKKworICAgIC8vIEZvciBub3csIGVhY2ggdHJhbnNmb3JtIGlzIG9ubHkgdGhlIElELCBubyBmb2xsb3dpbmcgZGF0YS4KKyAgICBmb3IgKHZlY3Rvcjx1aW50MTZfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gd3JpdGVUcmFuc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVUcmFuc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKCppdCwgcGt0KTsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBpbmZvIGhlYWRlcnMKKworICAgIC8vIGZvciBub3cgb25seSB3cml0ZSBrdi1oZWFkZXJzCisgICAgaW50MzJfdCBoZWFkZXJDb3VudCA9IHNhZmVfbnVtZXJpY19jYXN0PGludDMyX3Q+KHdyaXRlSGVhZGVyc18uc2l6ZSgpKTsKKyAgICBpZiAoaGVhZGVyQ291bnQgPiAwKSB7CisgICAgICBwa3QgKz0gd3JpdGVWYXJpbnQzMihpbmZvSWRUeXBlOjpLRVlWQUxVRSwgcGt0KTsKKyAgICAgIC8vIFdyaXRlIGtleS12YWx1ZSBoZWFkZXJzIGNvdW50CisgICAgICBwa3QgKz0gd3JpdGVWYXJpbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihoZWFkZXJDb3VudCksIHBrdCk7CisgICAgICAvLyBXcml0ZSBpbmZvIGhlYWRlcnMKKyAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0OworICAgICAgZm9yIChpdCA9IHdyaXRlSGVhZGVyc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVIZWFkZXJzXy5lbmQoKTsgKytpdCkgeworICAgICAgICB3cml0ZVN0cmluZyhwa3QsIGl0LT5maXJzdCk7ICAvLyBrZXkKKyAgICAgICAgd3JpdGVTdHJpbmcocGt0LCBpdC0+c2Vjb25kKTsgLy8gdmFsdWUKKyAgICAgIH0KKyAgICAgIHdyaXRlSGVhZGVyc18uY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBGaXh1cHMgYWZ0ZXIgdmFyaW50IHNpemUgY2FsY3VsYXRpb25zCisgICAgaGVhZGVyU2l6ZSA9IHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90Pihwa3QgLSBoZWFkZXJTdGFydCk7CisgICAgdWludDhfdCBwYWRkaW5nID0gNCAtIChoZWFkZXJTaXplICUgNCk7CisgICAgaGVhZGVyU2l6ZSArPSBwYWRkaW5nOworCisgICAgLy8gUGFkIG91dCBwa3Qgd2l0aCAweDAwCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWRkaW5nOyBpKyspIHsKKyAgICAgICoocGt0KyspID0gMHgwMDsKKyAgICB9CisKKyAgICAvLyBQa3Qgc2l6ZQorICAgIHB0cmRpZmZfdCBzekhicCA9IChoZWFkZXJTdGFydCAtIHBrdFN0YXJ0IC0gNCk7CisgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzekhicCkgPiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+KCkubWF4KSgpKSAtIChoZWFkZXJTaXplICsgaGF2ZUJ5dGVzKSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciBzZWN0aW9uIHNpemUgaXMgdW5yZWFzb25hYmxlIik7CisgICAgfQorICAgIHN6SGJvID0gaGVhZGVyU2l6ZSArIGhhdmVCeXRlcyAgICAgICAgICAvLyB0aHJpZnQgaGVhZGVyICsgcGF5bG9hZAorICAgICAgICAgICAgKyBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3pIYnApOyAvLyBjb21tb24gaGVhZGVyIHNlY3Rpb24KKyAgICBoZWFkZXJTaXplTiA9IGh0b25zKGhlYWRlclNpemUgLyA0KTsKKyAgICBtZW1jcHkoaGVhZGVyU2l6ZVB0ciwgJmhlYWRlclNpemVOLCBzaXplb2YoaGVhZGVyU2l6ZU4pKTsKKworICAgIC8vIFNldCBmcmFtaW5nIHNpemUuCisgICAgc3pOYm8gPSBodG9ubChzekhibyk7CisgICAgbWVtY3B5KHBrdFN0YXJ0LCAmc3pOYm8sIHNpemVvZihzek5ibykpOworCisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUocGt0U3RhcnQsIHN6SGJvIC0gaGF2ZUJ5dGVzICsgNCk7CisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfRlJBTUVEX0JJTkFSWSB8fCBjbGllbnRUeXBlID09IFRIUklGVF9GUkFNRURfQ09NUEFDVCkgeworICAgIHVpbnQzMl90IHN6SGJvID0gKHVpbnQzMl90KWhhdmVCeXRlczsKKyAgICB1aW50MzJfdCBzek5ibyA9IGh0b25sKHN6SGJvKTsKKworICAgIG91dFRyYW5zcG9ydF8tPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzek5ibyksIDQpOworICAgIG91dFRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlQnl0ZXMpOworICB9IGVsc2UgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0JJTkFSWSB8fCBjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUKSB7CisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlVua25vd24gY2xpZW50IHR5cGUiKTsKKyAgfQorCisgIC8vIEZsdXNoIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgb3V0VHJhbnNwb3J0Xy0+Zmx1c2goKTsKK30KKworLyoqCisgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMyBieXRlcy4KKyAqLwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFZhcmludDE2KHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MTZfdCogaTE2LCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSkgeworICBpbnQzMl90IHZhbDsKKyAgdWludDMyX3QgcnNpemUgPSByZWFkVmFyaW50MzIocHRyLCAmdmFsLCBib3VuZGFyeSk7CisgICppMTYgPSAoaW50MTZfdCl2YWw7CisgIHJldHVybiByc2l6ZTsKK30KKworLyoqCisgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KKyAqLwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFZhcmludDMyKHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MzJfdCogaTMyLCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSkgeworCisgIHVpbnQzMl90IHJzaXplID0gMDsKKyAgdWludDMyX3QgdmFsID0gMDsKKyAgaW50IHNoaWZ0ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChwdHIgPT0gYm91bmRhcnkpIHsKKyAgICAgIHRocm93IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnlpbmcgdG8gcmVhZCBwYXN0IGhlYWRlciBib3VuZGFyeSIpOworICAgIH0KKyAgICB1aW50OF90IGJ5dGUgPSAqKHB0cisrKTsKKyAgICByc2l6ZSsrOworICAgIHZhbCB8PSAodWludDY0X3QpKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKKyAgICBzaGlmdCArPSA3OworICAgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgICAgKmkzMiA9IHZhbDsKKyAgICAgIHJldHVybiByc2l6ZTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0Ojp3cml0ZVZhcmludDMyKGludDMyX3QgbiwgdWludDhfdCogcGt0KSB7CisgIHVpbnQ4X3QgYnVmWzVdOworICB1aW50MzJfdCB3c2l6ZSA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCluOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgLy8gQ2FsbGVyIHdpbGwgYWR2YW5jZSBwa3QuCisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3c2l6ZTsgaSsrKSB7CisgICAgcGt0W2ldID0gYnVmW2ldOworICB9CisKKyAgcmV0dXJuIHdzaXplOworfQorCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0Ojp3cml0ZVZhcmludDE2KGludDE2X3QgbiwgdWludDhfdCogcGt0KSB7CisgIHJldHVybiB3cml0ZVZhcmludDMyKG4sIHBrdCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjNTdlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfVEhFQURFUlRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbGlmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9hcnJheS5ocHA+CisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorCitlbnVtIENMSUVOVF9UWVBFIHsKKyAgVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSA9IDAsCisgIFRIUklGVF9GUkFNRURfQklOQVJZID0gMSwKKyAgVEhSSUZUX1VORlJBTUVEX0JJTkFSWSA9IDIsCisgIFRIUklGVF9GUkFNRURfQ09NUEFDVCA9IDMsCisgIFRIUklGVF9VTkZSQU1FRF9DT01QQUNUID0gNCwKKyAgVEhSSUZUX1VOS05PV05fQ0xJRU5UX1RZUEUgPSA1LAorfTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQ09NUEFDVF9QUk9UT0NPTDsKKworLyoqCisgKiBIZWFkZXIgdHJhbnNwb3J0LiBBbGwgd3JpdGVzIGdvIGludG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciB1bnRpbCBmbHVzaCBpcworICogY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNwb3J0IHdyaXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKKyAqIGJpbmFyeSBjaHVuayBmb2xsb3dlZCBieSB0aGUgZGF0YSBwYXlsb2FkLiBUaGlzIGFsbG93cyB0aGUgcmVjZWl2ZXIgb24gdGhlCisgKiBvdGhlciBlbmQgdG8gYWx3YXlzIGRvIGZpeGVkLWxlbmd0aCByZWFkcy4KKyAqCisgKiBTdWJjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGJlY2F1c2UgbW9zdCBvZiB0aGUgcmVhZC93cml0ZSBtZXRob2RzIGFyZSBzaW1pbGFyCisgKiBhbmQgbmVlZCBzaW1pbGFyIGJ1ZmZlcnMuICBNYWpvciBjaGFuZ2VzIGFyZSByZWFkRnJhbWUgJiBmbHVzaC4KKyAqCisgKiBIZWFkZXIgVHJhbnNwb3J0ICptdXN0KiBiZSB0aGUgc2FtZSB0cmFuc3BvcnQgZm9yIGJvdGggaW5wdXQgYW5kCisgKiBvdXRwdXQgd2hlbiB1c2VkIG9uIHRoZSBzZXJ2ZXIgc2lkZSAtIGNsaWVudCByZXNwb25zZXMgc2hvdWxkIGJlCisgKiB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aG9zZSBpbiB0aGUgcmVxdWVzdC4KKyAqLworY2xhc3MgVEhlYWRlclRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUSGVhZGVyVHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDUxMnU7CisgIHN0YXRpYyBjb25zdCBpbnQgVEhSSUZUX01BWF9WQVJJTlQzMl9CWVRFUyA9IDU7CisKKyAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KKyAgZXhwbGljaXQgVEhlYWRlclRyYW5zcG9ydChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCkKKyAgICA6IFRWaXJ0dWFsVHJhbnNwb3J0KHRyYW5zcG9ydCksCisgICAgICBvdXRUcmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICBwcm90b0lkKFRfQ09NUEFDVF9QUk9UT0NPTCksCisgICAgICBjbGllbnRUeXBlKFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpLAorICAgICAgc2VxSWQoMCksCisgICAgICBmbGFncygwKSwKKyAgICAgIHRCdWZTaXplXygwKSwKKyAgICAgIHRCdWZfKE5VTEwpIHsKKyAgICBpZiAoIXRyYW5zcG9ydF8pIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgidHJhbnNwb3J0IGlzIGVtcHR5Iik7CisgICAgaW5pdEJ1ZmZlcnMoKTsKKyAgfQorCisgIFRIZWFkZXJUcmFuc3BvcnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRUcmFuc3BvcnQpCisgICAgOiBUVmlydHVhbFRyYW5zcG9ydChpblRyYW5zcG9ydCksCisgICAgICBvdXRUcmFuc3BvcnRfKG91dFRyYW5zcG9ydCksCisgICAgICBwcm90b0lkKFRfQ09NUEFDVF9QUk9UT0NPTCksCisgICAgICBjbGllbnRUeXBlKFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpLAorICAgICAgc2VxSWQoMCksCisgICAgICBmbGFncygwKSwKKyAgICAgIHRCdWZTaXplXygwKSwKKyAgICAgIHRCdWZfKE5VTEwpIHsKKyAgICBpZiAoIXRyYW5zcG9ydF8pIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiaW5UcmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpZiAoIW91dFRyYW5zcG9ydF8pIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgib3V0VHJhbnNwb3J0IGlzIGVtcHR5Iik7CisgICAgaW5pdEJ1ZmZlcnMoKTsKKyAgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKKworICB2b2lkIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcih1aW50MzJfdCBhZGRpdGlvbmFsU2l6ZSA9IDApOworCisgIHVpbnQxNl90IGdldFByb3RvY29sSWQoKSBjb25zdDsKKyAgdm9pZCBzZXRQcm90b2NvbElkKHVpbnQxNl90IHByb3RvSWQpIHsgdGhpcy0+cHJvdG9JZCA9IHByb3RvSWQ7IH0KKworICB2b2lkIHJlc2V0UHJvdG9jb2woKTsKKworICAvKioKKyAgICogV2Uga25vdyB3ZSBnb3QgYSBwYWNrZXQgaW4gaGVhZGVyIGZvcm1hdCBoZXJlLCB0cnkgdG8gcGFyc2UgdGhlIGhlYWRlcgorICAgKgorICAgKiBAcGFyYW0gaGVhZGVyU2l6ZSBzaXplIG9mIHRoZSBoZWFkZXIgcG9ydGlvbgorICAgKiBAcGFyYW0gc3ogU2l6ZSBvZiB0aGUgd2hvbGUgbWVzc2FnZSwgaW5jbHVkaW5nIGhlYWRlcgorICAgKi8KKyAgdm9pZCByZWFkSGVhZGVyRm9ybWF0KHVpbnQxNl90IGhlYWRlclNpemUsIHVpbnQzMl90IHN6KTsKKworICAvKioKKyAgICogVW50cmFuc2Zvcm0gdGhlIGRhdGEgYmFzZWQgb24gdGhlIHJlY2VpdmVkIGhlYWRlciBmbGFncworICAgKiBPbiBjb25jbHVzaW9uIG9mIGZ1bmN0aW9uLCBzZXRSZWFkQnVmZmVyIGlzIGNhbGxlZCB3aXRoIHRoZQorICAgKiB1bnRyYW5zZm9ybWVkIGRhdGEuCisgICAqCisgICAqIEBwYXJhbSBwdHIgcHRyIHRvIGRhdGEKKyAgICogQHBhcmFtIHNpemUgb2YgZGF0YQorICAgKi8KKyAgdm9pZCB1bnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KTsKKworICAvKioKKyAgICogVHJhbnNmb3JtIHRoZSBkYXRhIGJhc2VkIG9uIG91ciB3cml0ZSB0cmFuc2Zvcm0gZmxhZ3MKKyAgICogQXQgY29uY2x1c2lvbiBvZiBmdW5jdGlvbiB0aGUgd3JpdGUgYnVmZmVyIGlzIHNldCB0byB0aGUKKyAgICogdHJhbnNmb3JtZWQgZGF0YS4KKyAgICoKKyAgICogQHBhcmFtIHB0ciBQdHIgdG8gZGF0YSB0byB0cmFuc2Zvcm0KKyAgICogQHBhcmFtIHN6IFNpemUgb2YgZGF0YSBidWZmZXIKKyAgICovCisgIHZvaWQgdHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opOworCisgIHVpbnQxNl90IGdldE51bVRyYW5zZm9ybXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQxNl90Pih3cml0ZVRyYW5zXy5zaXplKCkpOworICB9CisKKyAgdm9pZCBzZXRUcmFuc2Zvcm0odWludDE2X3QgdHJhbnNJZCkgeyB3cml0ZVRyYW5zXy5wdXNoX2JhY2sodHJhbnNJZCk7IH0KKworICAvLyBJbmZvIGhlYWRlcnMKKworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gU3RyaW5nVG9TdHJpbmdNYXA7CisKKyAgLy8gdGhlc2Ugd29yayB3aXRoIHdyaXRlIGhlYWRlcnMKKyAgdm9pZCBzZXRIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKworICB2b2lkIGNsZWFySGVhZGVycygpOworCisgIFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRXcml0ZUhlYWRlcnMoKSB7IHJldHVybiB3cml0ZUhlYWRlcnNfOyB9CisKKyAgLy8gdGhlc2Ugd29yayB3aXRoIHJlYWQgaGVhZGVycworICBjb25zdCBTdHJpbmdUb1N0cmluZ01hcCYgZ2V0SGVhZGVycygpIGNvbnN0IHsgcmV0dXJuIHJlYWRIZWFkZXJzXzsgfQorCisgIC8vIGFjY2Vzc29ycyBmb3Igc2VxSWQKKyAgaW50MzJfdCBnZXRTZXF1ZW5jZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIHNlcUlkOyB9CisgIHZvaWQgc2V0U2VxdWVuY2VOdW1iZXIoaW50MzJfdCBzZXFJZCkgeyB0aGlzLT5zZXFJZCA9IHNlcUlkOyB9CisKKyAgZW51bSBUUkFOU0ZPUk1TIHsKKyAgICBaTElCX1RSQU5TRk9STSA9IDB4MDEsCisgIH07CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIFJlYWRzIGEgZnJhbWUgb2YgaW5wdXQgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAqCisgICAqIFJldHVybnMgdHJ1ZSBpZiBhIGZyYW1lIHdhcyByZWFkIHN1Y2Nlc3NmdWxseSwgb3IgZmFsc2Ugb24gRU9GLgorICAgKiAoUmFpc2VzIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBFT0Ygb2NjdXJzIGFmdGVyIGEgcGFydGlhbCBmcmFtZS4pCisgICAqLworICB2aXJ0dWFsIGJvb2wgcmVhZEZyYW1lKCk7CisKKyAgdm9pZCBlbnN1cmVSZWFkQnVmZmVyKHVpbnQzMl90IHN6KTsKKyAgdWludDMyX3QgZ2V0V3JpdGVCeXRlcygpOworCisgIHZvaWQgaW5pdEJ1ZmZlcnMoKSB7CisgICAgc2V0UmVhZEJ1ZmZlcihOVUxMLCAwKTsKKyAgICBzZXRXcml0ZUJ1ZmZlcih3QnVmXy5nZXQoKSwgd0J1ZlNpemVfKTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRUcmFuc3BvcnRfOworCisgIC8vIDAgYW5kIDE2dGggYml0cyBtdXN0IGJlIDAgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGZyYW1lZCAmIHVuZnJhbWVkCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBIRUFERVJfTUFHSUMgPSAweDBGRkYwMDAwOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgSEVBREVSX01BU0sgPSAweEZGRkYwMDAwOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgRkxBR1NfTUFTSyA9IDB4MDAwMEZGRkY7CisKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9GUkFNRV9TSVpFID0gMHgzRkZGRkZGRjsKKworICBpbnQxNl90IHByb3RvSWQ7CisgIHVpbnQxNl90IGNsaWVudFR5cGU7CisgIHVpbnQzMl90IHNlcUlkOworICB1aW50MTZfdCBmbGFnczsKKworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gcmVhZFRyYW5zXzsKKyAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IHdyaXRlVHJhbnNfOworCisgIC8vIE1hcCB0byB1c2UgZm9yIGhlYWRlcnMKKyAgU3RyaW5nVG9TdHJpbmdNYXAgcmVhZEhlYWRlcnNfOworICBTdHJpbmdUb1N0cmluZ01hcCB3cml0ZUhlYWRlcnNfOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHdyaXRlIGsvdiBoZWFkZXJzIGNhbiB0YWtlCisgICAqLworICB1aW50MzJfdCBnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCkgY29uc3Q7CisKKyAgc3RydWN0IGluZm9JZFR5cGUgeworICAgIGVudW0gaWRUeXBlIHsKKyAgICAgIC8vIHN0YXJ0IGF0IDEgdG8gYXZvaWQgY29uZnVzaW5nIGhlYWRlciBwYWRkaW5nIGZvciBhbiBpbmZvSWQKKyAgICAgIEtFWVZBTFVFID0gMSwKKyAgICAgIEVORCAvLyBzaWduYWwgdGhlIGVuZCBvZiBpbmZvSWRzIHdlIGNhbiBoYW5kbGUKKyAgICB9OworICB9OworCisgIC8vIEJ1ZmZlcnMgdG8gdXNlIGZvciB0cmFuc2Zvcm0gcHJvY2Vzc2luZworICB1aW50MzJfdCB0QnVmU2l6ZV87CisgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gdEJ1Zl87CisKKyAgdm9pZCByZWFkU3RyaW5nKHVpbnQ4X3QqJiBwdHIsIC8qIG91dCAqLyBzdGQ6OnN0cmluZyYgc3RyLCB1aW50OF90IGNvbnN0KiBoZWFkZXJCb3VuZGFyeSk7CisKKyAgdm9pZCB3cml0ZVN0cmluZyh1aW50OF90KiYgcHRyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAvLyBWYXJpbnQgdXRpbHMKKyAgLyoqCisgICAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDMgYnl0ZXMuCisgICAqLworICB1aW50MzJfdCByZWFkVmFyaW50MTYodWludDhfdCBjb25zdCogcHRyLCBpbnQxNl90KiBpMTYsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KTsKKworICAvKioKKyAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KKyAgICovCisgIHVpbnQzMl90IHJlYWRWYXJpbnQzMih1aW50OF90IGNvbnN0KiBwdHIsIGludDMyX3QqIGkzMiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpOworCisgIC8qKgorICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgKi8KKyAgdWludDMyX3Qgd3JpdGVWYXJpbnQzMihpbnQzMl90IG4sIHVpbnQ4X3QqIHBrdCk7CisKKyAgLyoqCisgICAqIFdyaXRlIGFuIGkxNiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTMgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAqLworICB1aW50MzJfdCB3cml0ZVZhcmludDE2KGludDE2X3QgbiwgdWludDhfdCogcGt0KTsKK307CisKKy8qKgorICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIGhlYWRlciBvbmUuCisgKgorICovCitjbGFzcyBUSGVhZGVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIH5USGVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGhlYWRlciBvbmUuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEhlYWRlclRyYW5zcG9ydCh0cmFucykpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIFRIUklGVF9UUkFOU1BPUlRfVEhFQURFUlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTUyMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitUSHR0cENsaWVudDo6VEh0dHBDbGllbnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgpCisgIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKK30KKworVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIHBhdGgpCisgIDogVEh0dHBUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpKSksCisgICAgaG9zdF8oaG9zdCksCisgICAgcGF0aF8ocGF0aCkgeworfQorCitUSHR0cENsaWVudDo6flRIdHRwQ2xpZW50KCkgeworfQorCit2b2lkIFRIdHRwQ2xpZW50OjpwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIHsKKyAgY2hhciogY29sb24gPSBzdHJjaHIoaGVhZGVyLCAnOicpOworICBpZiAoY29sb24gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorICBjaGFyKiB2YWx1ZSA9IGNvbG9uICsgMTsKKworICBpZiAoYm9vc3Q6OmlzdGFydHNfd2l0aChoZWFkZXIsICJUcmFuc2Zlci1FbmNvZGluZyIpKSB7CisgICAgaWYgKGJvb3N0OjppZW5kc193aXRoKHZhbHVlLCAiY2h1bmtlZCIpKSB7CisgICAgICBjaHVua2VkXyA9IHRydWU7CisgICAgfQorICB9IGVsc2UgaWYgKGJvb3N0Ojppc3RhcnRzX3dpdGgoaGVhZGVyLCAiQ29udGVudC1MZW5ndGgiKSkgeworICAgIGNodW5rZWRfID0gZmFsc2U7CisgICAgY29udGVudExlbmd0aF8gPSBhdG9pKHZhbHVlKTsKKyAgfQorfQorCitib29sIFRIdHRwQ2xpZW50OjpwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKSB7CisgIGNoYXIqIGh0dHAgPSBzdGF0dXM7CisKKyAgY2hhciogY29kZSA9IHN0cmNocihodHRwLCAnICcpOworICBpZiAoY29kZSA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKKyAgfQorCisgICpjb2RlID0gJ1wwJzsKKyAgd2hpbGUgKCooY29kZSsrKSA9PSAnICcpIHsKKyAgfTsKKworICBjaGFyKiBtc2cgPSBzdHJjaHIoY29kZSwgJyAnKTsKKyAgaWYgKG1zZyA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKKyAgfQorICAqbXNnID0gJ1wwJzsKKworICBpZiAoc3RyY21wKGNvZGUsICIyMDAiKSA9PSAwKSB7CisgICAgLy8gSFRUUCAyMDAgPSBPSywgd2UgZ290IHRoZSByZXNwb25zZQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHN0cmNtcChjb2RlLCAiMTAwIikgPT0gMCkgeworICAgIC8vIEhUVFAgMTAwID0gY29udGludWUsIGp1c3Qga2VlcCByZWFkaW5nCisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7CisgIH0KK30KKwordm9pZCBUSHR0cENsaWVudDo6Zmx1c2goKSB7CisgIC8vIEZldGNoIHRoZSBjb250ZW50cyBvZiB0aGUgd3JpdGUgYnVmZmVyCisgIHVpbnQ4X3QqIGJ1ZjsKKyAgdWludDMyX3QgbGVuOworICB3cml0ZUJ1ZmZlcl8uZ2V0QnVmZmVyKCZidWYsICZsZW4pOworCisgIC8vIENvbnN0cnVjdCB0aGUgSFRUUCBoZWFkZXIKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGg7CisgIGggPDwgIlBPU1QgIiA8PCBwYXRoXyA8PCAiIEhUVFAvMS4xIiA8PCBDUkxGIDw8ICJIb3N0OiAiIDw8IGhvc3RfIDw8IENSTEYKKyAgICA8PCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiQ29udGVudC1MZW5ndGg6ICIgPDwgbGVuIDw8IENSTEYKKyAgICA8PCAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiVXNlci1BZ2VudDogVGhyaWZ0LyIgPDwgUEFDS0FHRV9WRVJTSU9OCisgICAgPDwgIiAoQysrL1RIdHRwQ2xpZW50KSIgPDwgQ1JMRiA8PCBDUkxGOworICBzdHJpbmcgaGVhZGVyID0gaC5zdHIoKTsKKworICBpZiAoaGVhZGVyLnNpemUoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkhlYWRlciB0b28gYmlnIik7CisgIC8vIFdyaXRlIHRoZSBoZWFkZXIsIHRoZW4gdGhlIGRhdGEsIHRoZW4gZmx1c2gKKyAgdHJhbnNwb3J0Xy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKWhlYWRlci5jX3N0cigpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaGVhZGVyLnNpemUoKSkpOworICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7CisgIHRyYW5zcG9ydF8tPmZsdXNoKCk7CisKKyAgLy8gUmVzZXQgdGhlIGJ1ZmZlciBhbmQgaGVhZGVyIHZhcmlhYmxlcworICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKKyAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmIxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQQ0xJRU5UX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUSHR0cENsaWVudCA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7CitwdWJsaWM6CisgIFRIdHRwQ2xpZW50KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nIGhvc3QsIHN0ZDo6c3RyaW5nIHBhdGggPSAiIik7CisKKyAgVEh0dHBDbGllbnQoc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c3RyaW5nIHBhdGggPSAiIik7CisKKyAgdmlydHVhbCB+VEh0dHBDbGllbnQoKTsKKworICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnN0cmluZyBob3N0XzsKKyAgc3RkOjpzdHJpbmcgcGF0aF87CisKKyAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7CisgIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKTsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiMjQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uZmlnLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisgICNpbmNsdWRlIDxTaGx3YXBpLmg+CisjZW5kaWYKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVEh0dHBTZXJ2ZXI6OlRIdHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSB7Cit9CisKK1RIdHRwU2VydmVyOjp+VEh0dHBTZXJ2ZXIoKSB7Cit9CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAjZGVmaW5lIFRIUklGVF9HTVRJTUUoVE0sIFRJTUUpICAgICAgICAgICAgIGdtdGltZV9zKCZUTSwgJlRJTUUpCisgICNkZWZpbmUgVEhSSUZUX3N0cm5jYXNlY21wKHN0cjEsIHN0cjIsIGxlbikgX3N0cm5pY21wKHN0cjEsIHN0cjIsIGxlbikKKyAgI2RlZmluZSBUSFJJRlRfc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKSBTdHJTdHJJQShoYXlzdGFjaywgbmVlZGxlKQorI2Vsc2UKKyAgI2RlZmluZSBUSFJJRlRfR01USU1FKFRNLCBUSU1FKSAgICAgICAgICAgICBnbXRpbWVfcigmVElNRSwgJlRNKQorICAjZGVmaW5lIFRIUklGVF9zdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pIHN0cm5jYXNlY21wKHN0cjEsIHN0cjIsIGxlbikKKyAgI2RlZmluZSBUSFJJRlRfc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKSBzdHJjYXNlc3RyKGhheXN0YWNrLCBuZWVkbGUpCisjZW5kaWYKKwordm9pZCBUSHR0cFNlcnZlcjo6cGFyc2VIZWFkZXIoY2hhciogaGVhZGVyKSB7CisgIGNoYXIqIGNvbG9uID0gc3RyY2hyKGhlYWRlciwgJzonKTsKKyAgaWYgKGNvbG9uID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2l6ZV90IHN6ID0gY29sb24gLSBoZWFkZXI7CisgIGNoYXIqIHZhbHVlID0gY29sb24gKyAxOworCisgIGlmIChUSFJJRlRfc3RybmNhc2VjbXAoaGVhZGVyLCAiVHJhbnNmZXItRW5jb2RpbmciLCBzeikgPT0gMCkgeworICAgIGlmIChUSFJJRlRfc3RyY2FzZXN0cih2YWx1ZSwgImNodW5rZWQiKSAhPSBOVUxMKSB7CisgICAgICBjaHVua2VkXyA9IHRydWU7CisgICAgfQorICB9IGVsc2UgaWYgKFRIUklGVF9zdHJuY2FzZWNtcChoZWFkZXIsICJDb250ZW50LWxlbmd0aCIsIHN6KSA9PSAwKSB7CisgICAgY2h1bmtlZF8gPSBmYWxzZTsKKyAgICBjb250ZW50TGVuZ3RoXyA9IGF0b2kodmFsdWUpOworICB9IGVsc2UgaWYgKHN0cm5jbXAoaGVhZGVyLCAiWC1Gb3J3YXJkZWQtRm9yIiwgc3opID09IDApIHsKKyAgICBvcmlnaW5fID0gdmFsdWU7CisgIH0KK30KKworYm9vbCBUSHR0cFNlcnZlcjo6cGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cykgeworICBjaGFyKiBtZXRob2QgPSBzdGF0dXM7CisKKyAgY2hhciogcGF0aCA9IHN0cmNocihtZXRob2QsICcgJyk7CisgIGlmIChwYXRoID09IE5VTEwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOworICB9CisKKyAgKnBhdGggPSAnXDAnOworICB3aGlsZSAoKigrK3BhdGgpID09ICcgJykgeworICB9OworCisgIGNoYXIqIGh0dHAgPSBzdHJjaHIocGF0aCwgJyAnKTsKKyAgaWYgKGh0dHAgPT0gTlVMTCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzOiAiKSArIHN0YXR1cyk7CisgIH0KKyAgKmh0dHAgPSAnXDAnOworCisgIGlmIChzdHJjbXAobWV0aG9kLCAiUE9TVCIpID09IDApIHsKKyAgICAvLyBQT1NUIG1ldGhvZCBvaywgbG9va2luZyBmb3IgY29udGVudC4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChzdHJjbXAobWV0aG9kLCAiT1BUSU9OUyIpID09IDApIHsKKyAgICAvLyBwcmVmbGlnaHQgT1BUSU9OUyBtZXRob2QsIHdlIGRvbid0IG5lZWQgZnVydGhlciBjb250ZW50LgorICAgIC8vIGhvdyB0byBncmFjaW91c2x5IGNsb3NlIGNvbm5lY3Rpb24/CisgICAgdWludDhfdCogYnVmOworICAgIHVpbnQzMl90IGxlbjsKKyAgICB3cml0ZUJ1ZmZlcl8uZ2V0QnVmZmVyKCZidWYsICZsZW4pOworCisgICAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBoOworICAgIGggPDwgIkhUVFAvMS4xIDIwMCBPSyIgPDwgQ1JMRiA8PCAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYKKyAgICAgIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIDw8IENSTEYgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHM6IFBPU1QsIE9QVElPTlMiCisgICAgICA8PCBDUkxGIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzOiBDb250ZW50LVR5cGUiIDw8IENSTEYgPDwgQ1JMRjsKKyAgICBzdHJpbmcgaGVhZGVyID0gaC5zdHIoKTsKKworICAgIC8vIFdyaXRlIHRoZSBoZWFkZXIsIHRoZW4gdGhlIGRhdGEsIHRoZW4gZmx1c2gKKyAgICB0cmFuc3BvcnRfLT53cml0ZSgoY29uc3QgdWludDhfdCopaGVhZGVyLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihoZWFkZXIuc2l6ZSgpKSk7CisgICAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOworICAgIHRyYW5zcG9ydF8tPmZsdXNoKCk7CisKKyAgICAvLyBSZXNldCB0aGUgYnVmZmVyIGFuZCBoZWFkZXIgdmFyaWFibGVzCisgICAgd3JpdGVCdWZmZXJfLnJlc2V0QnVmZmVyKCk7CisgICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1cyAodW5zdXBwb3J0ZWQgbWV0aG9kKTogIikgKyBzdGF0dXMpOworfQorCit2b2lkIFRIdHRwU2VydmVyOjpmbHVzaCgpIHsKKyAgLy8gRmV0Y2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB3cml0ZSBidWZmZXIKKyAgdWludDhfdCogYnVmOworICB1aW50MzJfdCBsZW47CisgIHdyaXRlQnVmZmVyXy5nZXRCdWZmZXIoJmJ1ZiwgJmxlbik7CisKKyAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgorICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKKyAgaCA8PCAiSFRUUC8xLjEgMjAwIE9LIiA8PCBDUkxGIDw8ICJEYXRlOiAiIDw8IGdldFRpbWVSRkMxMTIzKCkgPDwgQ1JMRiA8PCAiU2VydmVyOiBUaHJpZnQvIgorICAgIDw8IFBBQ0tBR0VfVkVSU0lPTiA8PCBDUkxGIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIDw8IENSTEYKKyAgICA8PCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiQ29udGVudC1MZW5ndGg6ICIgPDwgbGVuIDw8IENSTEYKKyAgICA8PCAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgPDwgQ1JMRiA8PCBDUkxGOworICBzdHJpbmcgaGVhZGVyID0gaC5zdHIoKTsKKworICAvLyBXcml0ZSB0aGUgaGVhZGVyLCB0aGVuIHRoZSBkYXRhLCB0aGVuIGZsdXNoCisgIC8vIGNhc3Qgc2hvdWxkIGJlIGZpbmUsIGJlY2F1c2Ugbm9uZSBvZiAiaGVhZGVyIiBpcyB1bmRlciBhdHRhY2tlciBjb250cm9sCisgIHRyYW5zcG9ydF8tPndyaXRlKChjb25zdCB1aW50OF90KiloZWFkZXIuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGhlYWRlci5zaXplKCkpKTsKKyAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOworICB0cmFuc3BvcnRfLT5mbHVzaCgpOworCisgIC8vIFJlc2V0IHRoZSBidWZmZXIgYW5kIGhlYWRlciB2YXJpYWJsZXMKKyAgd3JpdGVCdWZmZXJfLnJlc2V0QnVmZmVyKCk7CisgIHJlYWRIZWFkZXJzXyA9IHRydWU7Cit9CisKK3N0ZDo6c3RyaW5nIFRIdHRwU2VydmVyOjpnZXRUaW1lUkZDMTEyMygpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIERheXNbXSA9IHsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0In07CisgIHN0YXRpYyBjb25zdCBjaGFyKiBNb250aHNbXQorICAgICAgPSB7IkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIn07CisgIGNoYXIgYnVmZlsxMjhdOworCisgIHRpbWVfdCB0ID0gdGltZShOVUxMKTsKKyAgc3RydWN0IHRtIHRtYjsKKyAgVEhSSUZUX0dNVElNRSh0bWIsIHQpOworCisgIHNwcmludGYoYnVmZiwKKyAgICAgICAgICAiJXMsICVkICVzICVkICVkOiVkOiVkIEdNVCIsCisgICAgICAgICAgRGF5c1t0bWIudG1fd2RheV0sCisgICAgICAgICAgdG1iLnRtX21kYXksCisgICAgICAgICAgTW9udGhzW3RtYi50bV9tb25dLAorICAgICAgICAgIHRtYi50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICB0bWIudG1faG91ciwKKyAgICAgICAgICB0bWIudG1fbWluLAorICAgICAgICAgIHRtYi50bV9zZWMpOworICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZik7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzg2MDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUFNFUlZFUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVEh0dHBTZXJ2ZXIgOiBwdWJsaWMgVEh0dHBUcmFuc3BvcnQgeworcHVibGljOgorICBUSHR0cFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKKworICB2aXJ0dWFsIH5USHR0cFNlcnZlcigpOworCisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgcmVhZEhlYWRlcnMoKTsKKyAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7CisgIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKTsKKyAgc3RkOjpzdHJpbmcgZ2V0VGltZVJGQzExMjMoKTsKK307CisKKy8qKgorICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBIVFRQIHByb3RvY29sCisgKi8KK2NsYXNzIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIdHRwU2VydmVyKHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjYzAzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvLyBZZWFoLCB5ZWFoLCBoYWNreSB0byBwdXQgdGhlc2UgaGVyZSwgSSBrbm93LgorY29uc3QgY2hhciogVEh0dHBUcmFuc3BvcnQ6OkNSTEYgPSAiXHJcbiI7Citjb25zdCBpbnQgVEh0dHBUcmFuc3BvcnQ6OkNSTEZfTEVOID0gMjsKKworVEh0dHBUcmFuc3BvcnQ6OlRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgIG9yaWdpbl8oIiIpLAorICAgIHJlYWRIZWFkZXJzXyh0cnVlKSwKKyAgICBjaHVua2VkXyhmYWxzZSksCisgICAgY2h1bmtlZERvbmVfKGZhbHNlKSwKKyAgICBjaHVua1NpemVfKDApLAorICAgIGNvbnRlbnRMZW5ndGhfKDApLAorICAgIGh0dHBCdWZfKE5VTEwpLAorICAgIGh0dHBQb3NfKDApLAorICAgIGh0dHBCdWZMZW5fKDApLAorICAgIGh0dHBCdWZTaXplXygxMDI0KSB7CisgIGluaXQoKTsKK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6aW5pdCgpIHsKKyAgaHR0cEJ1Zl8gPSAoY2hhciopc3RkOjptYWxsb2MoaHR0cEJ1ZlNpemVfICsgMSk7CisgIGlmIChodHRwQnVmXyA9PSBOVUxMKSB7CisgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKyAgfQorICBodHRwQnVmX1todHRwQnVmTGVuX10gPSAnXDAnOworfQorCitUSHR0cFRyYW5zcG9ydDo6flRIdHRwVHJhbnNwb3J0KCkgeworICBpZiAoaHR0cEJ1Zl8gIT0gTlVMTCkgeworICAgIHN0ZDo6ZnJlZShodHRwQnVmXyk7CisgIH0KK30KKwordWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKHJlYWRCdWZmZXJfLmF2YWlsYWJsZV9yZWFkKCkgPT0gMCkgeworICAgIHJlYWRCdWZmZXJfLnJlc2V0QnVmZmVyKCk7CisgICAgdWludDMyX3QgZ290ID0gcmVhZE1vcmVEYXRhKCk7CisgICAgaWYgKGdvdCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlYWRCdWZmZXJfLnJlYWQoYnVmLCBsZW4pOworfQorCit1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZEVuZCgpIHsKKyAgLy8gUmVhZCBhbnkgcGVuZGluZyBjaHVua2VkIGRhdGEgKGZvb3RlcnMgZXRjLikKKyAgaWYgKGNodW5rZWRfKSB7CisgICAgd2hpbGUgKCFjaHVua2VkRG9uZV8pIHsKKyAgICAgIHJlYWRDaHVua2VkKCk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCit1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZE1vcmVEYXRhKCkgeworICB1aW50MzJfdCBzaXplOworCisgIGlmIChodHRwUG9zXyA9PSBodHRwQnVmTGVuXykgeworICAgIC8vIEdldCBtb3JlIGRhdGEhCisgICAgcmVmaWxsKCk7CisgIH0KKworICBpZiAocmVhZEhlYWRlcnNfKSB7CisgICAgcmVhZEhlYWRlcnMoKTsKKyAgfQorCisgIGlmIChjaHVua2VkXykgeworICAgIHNpemUgPSByZWFkQ2h1bmtlZCgpOworICB9IGVsc2UgeworICAgIHNpemUgPSByZWFkQ29udGVudChjb250ZW50TGVuZ3RoXyk7CisgICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBzaXplOworfQorCit1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZENodW5rZWQoKSB7CisgIHVpbnQzMl90IGxlbmd0aCA9IDA7CisKKyAgY2hhciogbGluZSA9IHJlYWRMaW5lKCk7CisgIHVpbnQzMl90IGNodW5rU2l6ZSA9IHBhcnNlQ2h1bmtTaXplKGxpbmUpOworICBpZiAoY2h1bmtTaXplID09IDApIHsKKyAgICByZWFkQ2h1bmtlZEZvb3RlcnMoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBSZWFkIGRhdGEgY29udGVudAorICAgIGxlbmd0aCArPSByZWFkQ29udGVudChjaHVua1NpemUpOworICAgIC8vIFJlYWQgdHJhaWxpbmcgQ1JMRiBhZnRlciBjb250ZW50CisgICAgcmVhZExpbmUoKTsKKyAgfQorICByZXR1cm4gbGVuZ3RoOworfQorCit2b2lkIFRIdHRwVHJhbnNwb3J0OjpyZWFkQ2h1bmtlZEZvb3RlcnMoKSB7CisgIC8vIEVuZCBvZiBkYXRhLCByZWFkIGZvb3RlciBsaW5lcyB1bnRpbCBhIGJsYW5rIG9uZSBhcHBlYXJzCisgIHdoaWxlICh0cnVlKSB7CisgICAgY2hhciogbGluZSA9IHJlYWRMaW5lKCk7CisgICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwKSB7CisgICAgICBjaHVua2VkRG9uZV8gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3VpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpwYXJzZUNodW5rU2l6ZShjaGFyKiBsaW5lKSB7CisgIGNoYXIqIHNlbWkgPSBzdHJjaHIobGluZSwgJzsnKTsKKyAgaWYgKHNlbWkgIT0gTlVMTCkgeworICAgICpzZW1pID0gJ1wwJzsKKyAgfQorICB1aW50MzJfdCBzaXplID0gMDsKKyAgc3NjYW5mKGxpbmUsICIleCIsICZzaXplKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKK3VpbnQzMl90IFRIdHRwVHJhbnNwb3J0OjpyZWFkQ29udGVudCh1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IG5lZWQgPSBzaXplOworICB3aGlsZSAobmVlZCA+IDApIHsKKyAgICB1aW50MzJfdCBhdmFpbCA9IGh0dHBCdWZMZW5fIC0gaHR0cFBvc187CisgICAgaWYgKGF2YWlsID09IDApIHsKKyAgICAgIC8vIFdlIGhhdmUgZ2l2ZW4gYWxsIHRoZSBkYXRhLCByZXNldCBwb3NpdGlvbiB0byBoZWFkIG9mIHRoZSBidWZmZXIKKyAgICAgIGh0dHBQb3NfID0gMDsKKyAgICAgIGh0dHBCdWZMZW5fID0gMDsKKyAgICAgIHJlZmlsbCgpOworCisgICAgICAvLyBOb3cgaGF2ZSBhdmFpbGFibGUgaG93ZXZlciBtdWNoIHdlIHJlYWQKKyAgICAgIGF2YWlsID0gaHR0cEJ1Zkxlbl87CisgICAgfQorICAgIHVpbnQzMl90IGdpdmUgPSBhdmFpbDsKKyAgICBpZiAobmVlZCA8IGdpdmUpIHsKKyAgICAgIGdpdmUgPSBuZWVkOworICAgIH0KKyAgICByZWFkQnVmZmVyXy53cml0ZSgodWludDhfdCopKGh0dHBCdWZfICsgaHR0cFBvc18pLCBnaXZlKTsKKyAgICBodHRwUG9zXyArPSBnaXZlOworICAgIG5lZWQgLT0gZ2l2ZTsKKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworY2hhciogVEh0dHBUcmFuc3BvcnQ6OnJlYWRMaW5lKCkgeworICB3aGlsZSAodHJ1ZSkgeworICAgIGNoYXIqIGVvbCA9IE5VTEw7CisKKyAgICBlb2wgPSBzdHJzdHIoaHR0cEJ1Zl8gKyBodHRwUG9zXywgQ1JMRik7CisKKyAgICAvLyBObyBDUkxGIHlldD8KKyAgICBpZiAoZW9sID09IE5VTEwpIHsKKyAgICAgIC8vIFNoaWZ0IHdoYXRldmVyIHdlIGhhdmUgbm93IHRvIGZyb250IGFuZCByZWZpbGwKKyAgICAgIHNoaWZ0KCk7CisgICAgICByZWZpbGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gUmV0dXJuIHBvaW50ZXIgdG8gbmV4dCBsaW5lCisgICAgICAqZW9sID0gJ1wwJzsKKyAgICAgIGNoYXIqIGxpbmUgPSBodHRwQnVmXyArIGh0dHBQb3NfOworICAgICAgaHR0cFBvc18gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKGVvbCAtIGh0dHBCdWZfKSArIENSTEZfTEVOKTsKKyAgICAgIHJldHVybiBsaW5lOworICAgIH0KKyAgfQorfQorCit2b2lkIFRIdHRwVHJhbnNwb3J0OjpzaGlmdCgpIHsKKyAgaWYgKGh0dHBCdWZMZW5fID4gaHR0cFBvc18pIHsKKyAgICAvLyBTaGlmdCBkb3duIHJlbWFpbmluZyBkYXRhIGFuZCByZWFkIG1vcmUKKyAgICB1aW50MzJfdCBsZW5ndGggPSBodHRwQnVmTGVuXyAtIGh0dHBQb3NfOworICAgIG1lbW1vdmUoaHR0cEJ1Zl8sIGh0dHBCdWZfICsgaHR0cFBvc18sIGxlbmd0aCk7CisgICAgaHR0cEJ1Zkxlbl8gPSBsZW5ndGg7CisgIH0gZWxzZSB7CisgICAgaHR0cEJ1Zkxlbl8gPSAwOworICB9CisgIGh0dHBQb3NfID0gMDsKKyAgaHR0cEJ1Zl9baHR0cEJ1Zkxlbl9dID0gJ1wwJzsKK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6cmVmaWxsKCkgeworICB1aW50MzJfdCBhdmFpbCA9IGh0dHBCdWZTaXplXyAtIGh0dHBCdWZMZW5fOworICBpZiAoYXZhaWwgPD0gKGh0dHBCdWZTaXplXyAvIDQpKSB7CisgICAgaHR0cEJ1ZlNpemVfICo9IDI7CisgICAgY2hhciogdG1wQnVmID0gKGNoYXIqKXN0ZDo6cmVhbGxvYyhodHRwQnVmXywgaHR0cEJ1ZlNpemVfICsgMSk7CisgICAgaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgICBodHRwQnVmXyA9IHRtcEJ1ZjsKKyAgfQorCisgIC8vIFJlYWQgbW9yZSBkYXRhCisgIHVpbnQzMl90IGdvdCA9IHRyYW5zcG9ydF8tPnJlYWQoKHVpbnQ4X3QqKShodHRwQnVmXyArIGh0dHBCdWZMZW5fKSwgaHR0cEJ1ZlNpemVfIC0gaHR0cEJ1Zkxlbl8pOworICBodHRwQnVmTGVuXyArPSBnb3Q7CisgIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7CisKKyAgaWYgKGdvdCA9PSAwKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgIkNvdWxkIG5vdCByZWZpbGwgYnVmZmVyIik7CisgIH0KK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6cmVhZEhlYWRlcnMoKSB7CisgIC8vIEluaXRpYWxpemUgaGVhZGVycyBzdGF0ZSB2YXJpYWJsZXMKKyAgY29udGVudExlbmd0aF8gPSAwOworICBjaHVua2VkXyA9IGZhbHNlOworICBjaHVua2VkRG9uZV8gPSBmYWxzZTsKKyAgY2h1bmtTaXplXyA9IDA7CisKKyAgLy8gQ29udHJvbCBzdGF0ZSBmbG93CisgIGJvb2wgc3RhdHVzTGluZSA9IHRydWU7CisgIGJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKworICAvLyBMb29wIHVudGlsIGhlYWRlcnMgYXJlIGZpbmlzaGVkCisgIHdoaWxlICh0cnVlKSB7CisgICAgY2hhciogbGluZSA9IHJlYWRMaW5lKCk7CisKKyAgICBpZiAoc3RybGVuKGxpbmUpID09IDApIHsKKyAgICAgIGlmIChmaW5pc2hlZCkgeworICAgICAgICByZWFkSGVhZGVyc18gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTXVzdCBoYXZlIGJlZW4gYW4gSFRUUCAxMDAsIGtlZXAgZ29pbmcgZm9yIGFub3RoZXIgc3RhdHVzIGxpbmUKKyAgICAgICAgc3RhdHVzTGluZSA9IHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdGF0dXNMaW5lKSB7CisgICAgICAgIHN0YXR1c0xpbmUgPSBmYWxzZTsKKyAgICAgICAgZmluaXNoZWQgPSBwYXJzZVN0YXR1c0xpbmUobGluZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJzZUhlYWRlcihsaW5lKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBUSHR0cFRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgd3JpdGVCdWZmZXJfLndyaXRlKGJ1ZiwgbGVuKTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcgVEh0dHBUcmFuc3BvcnQ6OmdldE9yaWdpbigpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgaWYgKCFvcmlnaW5fLmVtcHR5KCkpIHsKKyAgICBvc3MgPDwgb3JpZ2luXyA8PCAiLCAiOworICB9CisgIG9zcyA8PCB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsKKyAgcmV0dXJuIG9zcy5zdHIoKTsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDZhYjdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBUUkFOU1BPUlRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRocmlmdCB0cmFuc3BvcnQuIFRoaXMgd2FzIGlycml0YXRpbmcKKyAqIHRvIHdyaXRlLCBidXQgdGhlIGFsdGVybmF0aXZlcyBpbiBDKysgbGFuZCBhcmUgZGF1bnRpbmcuIExpbmtpbmcgQ1VSTAorICogcmVxdWlyZXMgMjMgZHluYW1pYyBsaWJyYXJpZXMgbGFzdCB0aW1lIEkgY2hlY2tlZCAoV1RGPyE/KS4gQWxsIHdlIGhhdmUKKyAqIGhlcmUgaXMgYSBWRVJZIGJhc2ljIEhUVFAvMS4xIGNsaWVudCB3aGljaCBzdXBwb3J0cyBIVFRQIDEwMCBDb250aW51ZSwKKyAqIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcsIGtlZXBhbGl2ZSwgZXRjLiBUZXN0ZWQgYWdhaW5zdCBBcGFjaGUuCisgKi8KK2NsYXNzIFRIdHRwVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRIdHRwVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIFRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpOworCisgIHZpcnR1YWwgflRIdHRwVHJhbnNwb3J0KCk7CisKKyAgdm9pZCBvcGVuKCkgeyB0cmFuc3BvcnRfLT5vcGVuKCk7IH0KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CisKKyAgYm9vbCBwZWVrKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+cGVlaygpOyB9CisKKyAgdm9pZCBjbG9zZSgpIHsgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsgfQorCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHVpbnQzMl90IHJlYWRFbmQoKTsKKworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7CisKKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzdHJpbmcgb3JpZ2luXzsKKworICBUTWVtb3J5QnVmZmVyIHdyaXRlQnVmZmVyXzsKKyAgVE1lbW9yeUJ1ZmZlciByZWFkQnVmZmVyXzsKKworICBib29sIHJlYWRIZWFkZXJzXzsKKyAgYm9vbCBjaHVua2VkXzsKKyAgYm9vbCBjaHVua2VkRG9uZV87CisgIHVpbnQzMl90IGNodW5rU2l6ZV87CisgIHVpbnQzMl90IGNvbnRlbnRMZW5ndGhfOworCisgIGNoYXIqIGh0dHBCdWZfOworICB1aW50MzJfdCBodHRwUG9zXzsKKyAgdWludDMyX3QgaHR0cEJ1Zkxlbl87CisgIHVpbnQzMl90IGh0dHBCdWZTaXplXzsKKworICB2aXJ0dWFsIHZvaWQgaW5pdCgpOworCisgIHVpbnQzMl90IHJlYWRNb3JlRGF0YSgpOworICBjaGFyKiByZWFkTGluZSgpOworCisgIHZvaWQgcmVhZEhlYWRlcnMoKTsKKyAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcikgPSAwOworICB2aXJ0dWFsIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cykgPSAwOworCisgIHVpbnQzMl90IHJlYWRDaHVua2VkKCk7CisgIHZvaWQgcmVhZENodW5rZWRGb290ZXJzKCk7CisgIHVpbnQzMl90IHBhcnNlQ2h1bmtTaXplKGNoYXIqIGxpbmUpOworCisgIHVpbnQzMl90IHJlYWRDb250ZW50KHVpbnQzMl90IHNpemUpOworCisgIHZvaWQgcmVmaWxsKCk7CisgIHZvaWQgc2hpZnQoKTsKKworICBzdGF0aWMgY29uc3QgY2hhciogQ1JMRjsKKyAgc3RhdGljIGNvbnN0IGludCBDUkxGX0xFTjsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGVjNWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBOb25ibG9ja2luZyBTU0wgc2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KKyAqLworVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGFkZHJlc3MsIHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN2VGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0LCBzZW5kVGltZW91dCwgcmVjdlRpbWVvdXQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gdFNTTFNvY2tldDsKKyAgdFNTTFNvY2tldCA9IGZhY3RvcnlfLT5jcmVhdGVTb2NrZXQoY2xpZW50KTsKKyAgdFNTTFNvY2tldC0+c2V0TGliZXZlbnRTYWZlKCk7CisgIHJldHVybiB0U1NMU29ja2V0OworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1YzQwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NTTFNFUlZFUlNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTU0xTRVJWRVJTT0NLRVRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUU1NMU29ja2V0RmFjdG9yeTsKKworLyoqCisgKiBOb25ibG9ja2luZyBTZXJ2ZXIgc29ja2V0IHRoYXQgYWNjZXB0cyBTU0wgY29ubmVjdGlvbnMuCisgKi8KK2NsYXNzIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldCA6IHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgeworcHVibGljOgorICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byBhbGwgaW50ZXJmYWNlcy4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIGZhY3RvcnkgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICAgKgorICAgKiBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHBvcnQgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIGZhY3RvcnkgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byBhbGwgaW50ZXJmYWNlcy4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAqIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAqIEBwYXJhbSBmYWN0b3J5ICAgICBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeV87Cit9OworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDM0Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19VTl9ICisjaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19QT0xMX0gKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUREJfSAorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpZm5kZWYgQUZfTE9DQUwKKyNkZWZpbmUgQUZfTE9DQUwgQUZfVU5JWAorI2VuZGlmCisKKyNpZm5kZWYgU09DS09QVF9DQVNUX1QKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKKyNlbHNlCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIGNoYXIKKyNlbmRpZiAvLyBfV0lOMzIKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBjb25zdCBTT0NLT1BUX0NBU1RfVCogY29uc3RfY2FzdF9zb2Nrb3B0KGNvbnN0IFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU09DS09QVF9DQVNUX1QqPih2KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgU09DS09QVF9DQVNUX1QqIGNhc3Rfc29ja29wdChUKiB2KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFNPQ0tPUFRfQ0FTVF9UKj4odik7Cit9CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0KQorICA6IHBvcnRfKHBvcnQpLAorICAgIGxpc3RlblBvcnRfKHBvcnQpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpCisgIDogcG9ydF8ocG9ydCksCisgICAgbGlzdGVuUG9ydF8ocG9ydCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKHNlbmRUaW1lb3V0KSwKKyAgICByZWN2VGltZW91dF8ocmVjdlRpbWVvdXQpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpIHsKK30KKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCkKKyAgOiBwb3J0Xyhwb3J0KSwKKyAgICBsaXN0ZW5Qb3J0Xyhwb3J0KSwKKyAgICBhZGRyZXNzXyhhZGRyZXNzKSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpIHsKK30KKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBwYXRoKQorICA6IHBvcnRfKDApLAorICAgIGxpc3RlblBvcnRfKDApLAorICAgIHBhdGhfKHBhdGgpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6On5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoKSB7CisgIGNsb3NlKCk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpIHsKKyAgc2VuZFRpbWVvdXRfID0gc2VuZFRpbWVvdXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRSZWN2VGltZW91dChpbnQgcmVjdlRpbWVvdXQpIHsKKyAgcmVjdlRpbWVvdXRfID0gcmVjdlRpbWVvdXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRBY2NlcHRCYWNrbG9nKGludCBhY2NCYWNrbG9nKSB7CisgIGFjY2VwdEJhY2tsb2dfID0gYWNjQmFja2xvZzsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpIHsKKyAgcmV0cnlMaW1pdF8gPSByZXRyeUxpbWl0OworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0UmV0cnlEZWxheShpbnQgcmV0cnlEZWxheSkgeworICByZXRyeURlbGF5XyA9IHJldHJ5RGVsYXk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKSB7CisgIHRjcFNlbmRCdWZmZXJfID0gdGNwU2VuZEJ1ZmZlcjsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpIHsKKyAgdGNwUmVjdkJ1ZmZlcl8gPSB0Y3BSZWN2QnVmZmVyOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgeworICBsaXN0ZW5pbmdfID0gdHJ1ZTsKKyNpZmRlZiBfV0lOMzIKKyAgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmIC8vIF9XSU4zMgorICAKKyAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKKyAgaWYgKHBvcnRfIDwgMCB8fCBwb3J0XyA+IDB4RkZGRikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7CisgIH0KKworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnJlczsKKyAgaW50IGVycm9yOworICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKKyAgVEhSSUZUX1NOUFJJTlRGKHBvcnQsIHNpemVvZihwb3J0KSwgIiVkIiwgcG9ydF8pOworCisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOworCisgIC8vIElmIGFkZHJlc3MgaXMgbm90IHNwZWNpZmllZCB1c2Ugd2lsZGNhcmQgYWRkcmVzcyAoTlVMTCkKKyAgVEdldEFkZHJJbmZvV3JhcHBlciBpbmZvKGFkZHJlc3NfLmVtcHR5KCkgPyBOVUxMIDogJmFkZHJlc3NfWzBdLCBwb3J0LCAmaGludHMpOworCisgIGVycm9yID0gaW5mby5pbml0KCk7CisgIGlmIChlcnJvcikgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoImdldGFkZHJpbmZvICVkOiAlcyIsIGVycm9yLCBUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIHNlcnZlciBzb2NrZXQuIik7CisgIH0KKworICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAorICAvLyBpbnRvIGlwdjYgc3BhY2UuCisgIGZvciAocmVzID0gaW5mby5yZXMoKTsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOworICB9IGVsc2UgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIH0KKworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc29ja2V0KCkgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHNvY2tldC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICAvLyBTZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIHRvIHByZXZlbnQgMk1TTCBkZWxheSBvbiBhY2NlcHQKKyAgaW50IG9uZSA9IDE7CisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORywKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZvbmUpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob25lKSkpIHsKKy8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQgb24gV2luZG93cy4gIFRoaXMgaXMgYmVjYXVzZQorLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKy8vIHdhbnQgdG8gZm9yY2Ugc2VydmVycyB0byBiZSBhbiBhZG1pbi4KKyNpZm5kZWYgX1dJTjMyCisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyNlbmRpZgorICB9CisKKyAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKKyAgaWYgKHRjcFNlbmRCdWZmZXJfID4gMCkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT19TTkRCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BTZW5kQnVmZmVyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcFNlbmRCdWZmZXJfKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19TTkRCVUYgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgU09fU05EQlVGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisKKyAgaWYgKHRjcFJlY3ZCdWZmZXJfID4gMCkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT19SQ1ZCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BSZWN2QnVmZmVyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcFJlY3ZCdWZmZXJfKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SQ1ZCVUYgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgU09fUkNWQlVGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisKKyNpZmRlZiBJUFY2X1Y2T05MWQorICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgJiYgcGF0aF8uZW1wdHkoKSkgeworICAgIGludCB6ZXJvID0gMDsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIElQUFJPVE9fSVBWNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJUFY2X1Y2T05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnplcm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih6ZXJvKSkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkgIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIH0KKyAgfQorI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQorCisgIC8vIFR1cm4gbGluZ2VyIG9mZiwgZG9uJ3Qgd2FudCB0byBibG9jayBvbiBjYWxscyB0byBjbG9zZQorICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07CisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgY2FzdF9zb2Nrb3B0KCZsaW5nKSwgc2l6ZW9mKGxpbmcpKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fTElOR0VSICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgU09fTElOR0VSIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBLZWVwYWxpdmUgdG8gZW5zdXJlIGZ1bGwgcmVzdWx0IGZsdXNoaW5nCisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX0tFRVBBTElWRSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNldCBUQ1Agbm9kZWxheSBpZiBhdmFpbGFibGUsIE1BQyBPUyBYIEhhY2sKKyAgLy8gU2VlIGh0dHA6Ly9saXN0cy5kYW5nYS5jb20vcGlwZXJtYWlsL21lbWNhY2hlZC8yMDA1LU1hcmNoLzAwMTI0MC5odG1sCisjaWZuZGVmIFRDUF9OT1BVU0gKKyAgLy8gVW5peCBTb2NrZXRzIGRvIG5vdCBuZWVkIHRoYXQKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICAvLyBUQ1AgTm9kZWxheSwgc3BlZWQgb3ZlciBiYW5kd2lkdGgKKyAgICBpZiAoLTEKKyAgICAgICAgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIGNhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX05PREVMQVkgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX05PREVMQVkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIC8vIFNldCBOT05CTE9DSyBvbiB0aGUgYWNjZXB0IHNvY2tldAorICBpbnQgZmxhZ3MgPSBUSFJJRlRfRkNOVEwoc2VydmVyU29ja2V0XywgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc2VydmVyU29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9PX05PTkJMT0NLICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCBUSFJJRlRfT19OT05CTE9DSyBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworI2lmZGVmIFRDUF9MT1dfTUlOX1JUTworICBpZiAoVFNvY2tldDo6Z2V0VXNlTG93TWluUnRvKCkpIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX0xPV19NSU5fUlRPLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9MT1dfTUlOX1JUTyAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLy8gcHJlcGFyZSB0aGUgcG9ydCBpbmZvcm1hdGlvbgorICAvLyB3ZSBtYXkgd2FudCB0byB0cnkgdG8gYmluZCBtb3JlIHRoYW4gb25jZSwgc2luY2UgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIGRvZXNuJ3QKKyAgLy8gYWx3YXlzIHNlZW0gdG8gd29yay4gVGhlIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSByZXRyeSB2YXJpYWJsZXMuCisgIGludCByZXRyaWVzID0gMDsKKyAgaW50IGVycm5vX2NvcHkgPSAwOworCisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworCisjaWZuZGVmIF9XSU4zMgorCisgICAgLy8gVW5peCBEb21haW4gU29ja2V0CisgICAgc2l6ZV90IGxlbiA9IHBhdGhfLnNpemUoKSArIDE7CisgICAgaWYgKGxlbiA+IHNpemVvZigoKHNvY2thZGRyX3VuKilOVUxMKS0+c3VuX3BhdGgpKSB7CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpsaXN0ZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCB0b28gbG9uZyIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorCisgICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHJlc3M7CisgICAgYWRkcmVzcy5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgICBtZW1jcHkoYWRkcmVzcy5zdW5fcGF0aCwgcGF0aF8uY19zdHIoKSwgbGVuKTsKKworICAgIHNvY2tsZW5fdCBzdHJ1Y3RsZW4gPSBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHNpemVvZihhZGRyZXNzKSk7CisKKyAgICBpZiAoIWFkZHJlc3Muc3VuX3BhdGhbMF0pIHsgLy8gYWJzdHJhY3QgbmFtZXNwYWNlIHNvY2tldAorI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gc3VuX3BhdGggaXMgbm90IG51bGwtdGVybWluYXRlZCBpbiB0aGlzIGNhc2UgYW5kIHN0cnVjdGxlbiBkZXRlcm1pbmVzIGl0cyBsZW5ndGgKKyAgICAgIHN0cnVjdGxlbiAtPSBzaXplb2YoYWRkcmVzcy5zdW5fcGF0aCkgLSBsZW47CisjZWxzZQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0cyBvbmx5IHN1cHBvcnRlZCBvbiBsaW51eDogIiwgLTk5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgICB9CisKKyAgICBkbyB7CisgICAgICBpZiAoMCA9PSA6OmJpbmQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHN0cnVjdGxlbikpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworI2Vsc2UKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCBvbiB3aW5kb3dzIiwgLTk5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBkbyB7CisgICAgICBpZiAoMCA9PSA6OmJpbmQoc2VydmVyU29ja2V0XywgcmVzLT5haV9hZGRyLCBzdGF0aWNfY2FzdDxpbnQ+KHJlcy0+YWlfYWRkcmxlbikpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgLy8gdXNlIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBoZXJlIHRvIG9ubHkgc2xlZXAgaWYgd2UgbmVlZCB0bworICAgIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKFRIUklGVF9TTEVFUF9TRUMocmV0cnlEZWxheV8pID09IDApKTsKKworICAgIC8vIHJldHJpZXZlIGJpbmQgaW5mbworICAgIGlmIChwb3J0XyA9PSAwICYmIHJldHJpZXMgPD0gcmV0cnlMaW1pdF8pIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworICAgICAgc29ja2xlbl90IGxlbiA9IHNpemVvZihzYSk7CisgICAgICBzdGQ6Om1lbXNldCgmc2EsIDAsIGxlbik7CisgICAgICBpZiAoOjpnZXRzb2NrbmFtZShzZXJ2ZXJTb2NrZXRfLCByZWludGVycHJldF9jYXN0PHN0cnVjdCBzb2NrYWRkcio+KCZzYSksICZsZW4pIDwgMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Z2V0UG9ydCgpIGdldHNvY2tuYW1lKCkgIiwgZXJybm9fY29weSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2Euc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oJnNhKTsKKyAgICAgICAgICBsaXN0ZW5Qb3J0XyA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luKj4oJnNhKTsKKyAgICAgICAgICBsaXN0ZW5Qb3J0XyA9IG50b2hzKHNpbi0+c2luX3BvcnQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZmFpbGVkIHRvIGJpbmQgcHJvcGVybHkKKyAgaWYgKHJldHJpZXMgPiByZXRyeUxpbWl0XykgeworICAgIGNoYXIgZXJyYnVmWzEwMjRdOworICAgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFBBVEggJXMiLCBwYXRoXy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIEJJTkQgJWQiLCBwb3J0Xyk7CisgICAgfQorICAgIEdsb2JhbE91dHB1dChlcnJidWYpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYmluZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmIChsaXN0ZW5DYWxsYmFja18pCisgICAgbGlzdGVuQ2FsbGJhY2tfKHNlcnZlclNvY2tldF8pOworCisgIC8vIENhbGwgbGlzdGVuCisgIGlmICgtMSA9PSA6Omxpc3RlbihzZXJ2ZXJTb2NrZXRfLCBhY2NlcHRCYWNrbG9nXykpIHsKKyAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBsaXN0ZW4oKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgbGlzdGVuIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBUaGUgc29ja2V0IGlzIG5vdyBsaXN0ZW5pbmchCit9CisKK2ludCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmdldFBvcnQoKSB7CisgIHJldHVybiBwb3J0XzsKK30KKworaW50IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Z2V0TGlzdGVuUG9ydCgpIHsKKyAgcmV0dXJuIGxpc3RlblBvcnRfOworfQorCitzaGFyZWRfcHRyPFRTb2NrZXQ+IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHsKKyAgaWYgKHNlcnZlclNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldCBub3QgbGlzdGVuaW5nIik7CisgIH0KKyAgCisgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGNsaWVudEFkZHJlc3M7CisgIGludCBzaXplID0gc2l6ZW9mKGNsaWVudEFkZHJlc3MpOworICBUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldAorICAgICAgPSA6OmFjY2VwdChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmY2xpZW50QWRkcmVzcywgKHNvY2tsZW5fdCopJnNpemUpOworCisgIGlmIChjbGllbnRTb2NrZXQgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSA6OmFjY2VwdCgpICIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgImFjY2VwdCgpIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBFeHBsaWNpdGx5IHNldCB0aGlzIHNvY2tldCB0byBOT05CTE9DSyBtb2RlCisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX0dFVEZMLCAwKTsKKyAgaWYgKGZsYWdzID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMICIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoVEhSSUZUX0ZfR0VURkwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKKyAgICBHbG9iYWxPdXRwdXQKKyAgICAgICAgLnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfU0VURkwgflRIUklGVF9PX05PTkJMT0NLICIsCisgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9TRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IGNsaWVudCA9IGNyZWF0ZVNvY2tldChjbGllbnRTb2NrZXQpOworICBpZiAoc2VuZFRpbWVvdXRfID4gMCkgeworICAgIGNsaWVudC0+c2V0U2VuZFRpbWVvdXQoc2VuZFRpbWVvdXRfKTsKKyAgfQorICBpZiAocmVjdlRpbWVvdXRfID4gMCkgeworICAgIGNsaWVudC0+c2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKKyAgfQorICBpZiAoa2VlcEFsaXZlXykgeworICAgIGNsaWVudC0+c2V0S2VlcEFsaXZlKGtlZXBBbGl2ZV8pOworICB9CisgIGNsaWVudC0+c2V0Q2FjaGVkQWRkcmVzcygoc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCBzaXplKTsKKworICBpZiAoYWNjZXB0Q2FsbGJhY2tfKQorICAgIGFjY2VwdENhbGxiYWNrXyhjbGllbnRTb2NrZXQpOworCisgIHJldHVybiBjbGllbnQ7Cit9CisKK3NoYXJlZF9wdHI8VFNvY2tldD4gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQpIHsKKyAgcmV0dXJuIHNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoY2xpZW50U29ja2V0KSk7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpjbG9zZSgpIHsKKyAgaWYgKHNlcnZlclNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgc2h1dGRvd24oc2VydmVyU29ja2V0XywgVEhSSUZUX1NIVVRfUkRXUik7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoc2VydmVyU29ja2V0Xyk7CisgIH0KKyAgc2VydmVyU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgbGlzdGVuaW5nXyA9IGZhbHNlOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTg2ZmYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJTT0NLRVRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFNvY2tldDsKKworLyoqCisgKiBOb25ibG9ja2luZyBTZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC4gV3JhcHBlciBhcm91bmQgYSB1bml4CisgKiBzb2NrZXQgbGlzdGVuIGFuZCBhY2NlcHQgY2FsbHMuCisgKgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoVEhSSUZUX1NPQ0tFVCBmZCk+IHNvY2tldF9mdW5jX3Q7CisKKyAgY29uc3Qgc3RhdGljIGludCBERUZBVUxUX0JBQ0tMT0cgPSAxMDI0OworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgKi8KKyAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgICAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAqIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgdXNlZCBmb3IgdW5peCBzb2NrZXRzLgorICAgKgorICAgKiBAcGFyYW0gcGF0aCBQYXRobmFtZSBmb3IgdW5peCBzb2NrZXQuCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgIHZpcnR1YWwgflROb25ibG9ja2luZ1NlcnZlclNvY2tldCgpOworCisgIHZvaWQgc2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KTsKKyAgdm9pZCBzZXRSZWN2VGltZW91dChpbnQgcmVjdlRpbWVvdXQpOworCisgIHZvaWQgc2V0QWNjZXB0QmFja2xvZyhpbnQgYWNjQmFja2xvZyk7CisKKyAgdm9pZCBzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KTsKKyAgdm9pZCBzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KTsKKworICB2b2lkIHNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgeyBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOyB9CisKKyAgdm9pZCBzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKTsKKyAgdm9pZCBzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKTsKKworICAvLyBsaXN0ZW5DYWxsYmFjayBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSBsaXN0ZW4sIGFuZCBhZnRlciBhbGwgVGhyaWZ0CisgIC8vIHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZSBjdXN0b20gc2V0c29ja29wdAorICAvLyB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgIHZvaWQgc2V0TGlzdGVuQ2FsbGJhY2soY29uc3Qgc29ja2V0X2Z1bmNfdCYgbGlzdGVuQ2FsbGJhY2spIHsgbGlzdGVuQ2FsbGJhY2tfID0gbGlzdGVuQ2FsbGJhY2s7IH0KKworICAvLyBhY2NlcHRDYWxsYmFjayBnZXRzIGNhbGxlZCBhZnRlciBlYWNoIGFjY2VwdCBjYWxsLCBvbiB0aGUgbmV3bHkgY3JlYXRlZCBzb2NrZXQuCisgIC8vIEl0IGlzIGNhbGxlZCBhZnRlciBhbGwgVGhyaWZ0IHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZQorICAvLyBjdXN0b20gc2V0c29ja29wdCB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgYWNjZXB0ZWQKKyAgLy8gc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRBY2NlcHRDYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBhY2NlcHRDYWxsYmFjaykgeyBhY2NlcHRDYWxsYmFja18gPSBhY2NlcHRDYWxsYmFjazsgfQorCisgIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSB7IHJldHVybiBzZXJ2ZXJTb2NrZXRfOyB9CisKKyAgaW50IGdldFBvcnQoKTsKKyAgCisgIGludCBnZXRMaXN0ZW5Qb3J0KCk7CisKKyAgdm9pZCBsaXN0ZW4oKTsKKyAgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBhY2NlcHRJbXBsKCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudCk7CisKK3ByaXZhdGU6CisgIGludCBwb3J0XzsKKyAgaW50IGxpc3RlblBvcnRfOworICBzdGQ6OnN0cmluZyBhZGRyZXNzXzsKKyAgc3RkOjpzdHJpbmcgcGF0aF87CisgIFRIUklGVF9TT0NLRVQgc2VydmVyU29ja2V0XzsKKyAgaW50IGFjY2VwdEJhY2tsb2dfOworICBpbnQgc2VuZFRpbWVvdXRfOworICBpbnQgcmVjdlRpbWVvdXRfOworICBpbnQgcmV0cnlMaW1pdF87CisgIGludCByZXRyeURlbGF5XzsKKyAgaW50IHRjcFNlbmRCdWZmZXJfOworICBpbnQgdGNwUmVjdkJ1ZmZlcl87CisgIGJvb2wga2VlcEFsaXZlXzsKKyAgYm9vbCBsaXN0ZW5pbmdfOworCisgIHNvY2tldF9mdW5jX3QgbGlzdGVuQ2FsbGJhY2tfOworICBzb2NrZXRfZnVuY190IGFjY2VwdENhbGxiYWNrXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSU09DS0VUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQyZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBTZXJ2ZXIgdHJhbnNwb3J0IGZyYW1ld29yay4gQSBzZXJ2ZXIgbmVlZHMgdG8gaGF2ZSBzb21lIGZhY2lsaXR5IGZvcgorICogY3JlYXRpbmcgYmFzZSB0cmFuc3BvcnRzIHRvIHJlYWQvd3JpdGUgZnJvbS4gIFRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQKKyAqIHRvIGtlZXAgdHJhY2sgb2YgVFRyYW5zcG9ydCBjaGlsZHJlbiB0aGF0IGl0IGNyZWF0ZXMgZm9yIHB1cnBvc2VzIG9mCisgKiBjb250cm9sbGluZyB0aGVpciBsaWZldGltZS4KKyAqLworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0KCkge30KKworICAvKioKKyAgICogU3RhcnRzIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLiBQcmlvciB0byB0aGlzCisgICAqIGNhbGwgbW9zdCB0cmFuc3BvcnRzIHdpbGwgbm90IHJldHVybiBhbnl0aGluZyB3aGVuIGFjY2VwdCBpcyBjYWxsZWQuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBsaXN0ZW4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKSB7fQorCisgIC8qKgorICAgKiBHZXRzIGEgbmV3IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0cmFuc3BvcnQgb2JqZWN0IGFuZCBwYXNzZXMgaXQgdG8gdGhlCisgICAqIGNhbGxlci4gTm90ZSB0aGF0IGl0IGlzIHRoZSBleHBsaWNpdCBkdXR5IG9mIHRoZSBjYWxsZXIgdG8gZnJlZSB0aGUKKyAgICogYWxsb2NhdGVkIG9iamVjdC4gVGhlIHJldHVybmVkIFRUcmFuc3BvcnQgb2JqZWN0IG11c3QgYWx3YXlzIGJlIGluIHRoZQorICAgKiBvcGVuZWQgc3RhdGUuIE5VTEwgc2hvdWxkIG5ldmVyIGJlIHJldHVybmVkLCBpbnN0ZWFkIGFuIEV4Y2VwdGlvbiBzaG91bGQKKyAgICogYWx3YXlzIGJlIHRocm93bi4KKyAgICoKKyAgICogQHJldHVybiBBIG5ldyBUVHJhbnNwb3J0IG9iamVjdAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICovCisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBhY2NlcHQoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHJlc3VsdCA9IGFjY2VwdEltcGwoKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICogVXRpbGl0eSBtZXRob2QKKyAgKiAKKyAgKiBAcmV0dXJuIHNlcnZlciBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yIAorICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAqLworCisgIHZpcnR1YWwgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpID0gMDsKKworICB2aXJ0dWFsIGludCBnZXRQb3J0KCkgPSAwOworCisgIHZpcnR1YWwgaW50IGdldExpc3RlblBvcnQoKSA9IDA7CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGlzIHRyYW5zcG9ydCBzdWNoIHRoYXQgZnV0dXJlIGNhbGxzIHRvIGFjY2VwdCB3aWxsIGRvIG5vdGhpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0KCkge30KKworICAvKioKKyAgICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gZm9yIGFjY2VwdC4KKyAgICoKKyAgICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCBUVHJhbnNwb3J0IG9iamVjdAorICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdEltcGwoKSA9IDA7CisKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODQ0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmNwcApAQCAtMCwwICsxLDM5OCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1N5bmMuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorKiBUUGlwZSBpbXBsZW1lbnRhdGlvbi4KKyovCisKKyNpZmRlZiBfV0lOMzIKKwordWludDMyX3QgcGlwZV9yZWFkKEhBTkRMRSBwaXBlLCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Cit2b2lkIHBpcGVfd3JpdGUoSEFORExFIHBpcGUsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKwordWludDMyX3QgcHNldWRvX3N5bmNfcmVhZChIQU5ETEUgcGlwZSwgSEFORExFIGV2ZW50LCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Cit2b2lkIHBzZXVkb19zeW5jX3dyaXRlKEhBTkRMRSBwaXBlLCBIQU5ETEUgZXZlbnQsIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworY2xhc3MgVFBpcGVJbXBsIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgVFBpcGVJbXBsKCkge30KKyAgdmlydHVhbCB+VFBpcGVJbXBsKCkge30KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgPSAwOyAvLyBkb3VibGVzIGFzIHRoZSByZWFkIGhhbmRsZSBmb3IgYW5vbiBwaXBlCisgIHZpcnR1YWwgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorICB2aXJ0dWFsIHZvaWQgc2V0V3J0UGlwZUhhbmRsZShIQU5ETEUpIHt9CisgIHZpcnR1YWwgYm9vbCBpc0J1ZmZlcmVkRGF0YUF2YWlsYWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorfTsKKworY2xhc3MgVE5hbWVkUGlwZUltcGwgOiBwdWJsaWMgVFBpcGVJbXBsIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVE5hbWVkUGlwZUltcGwoVEF1dG9IYW5kbGUgJnBpcGVoYW5kbGUpIDogUGlwZV8ocGlwZWhhbmRsZS5yZWxlYXNlKCkpIHt9CisgIHZpcnR1YWwgflROYW1lZFBpcGVJbXBsKCkge30KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcmV0dXJuIHBzZXVkb19zeW5jX3JlYWQoUGlwZV8uaCwgcmVhZF9ldmVudF8uaCwgYnVmLCBsZW4pOworICB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHBzZXVkb19zeW5jX3dyaXRlKFBpcGVfLmgsIHdyaXRlX2V2ZW50Xy5oLCBidWYsIGxlbik7CisgIH0KKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQorICB2aXJ0dWFsIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeyBQaXBlXy5yZXNldChwaXBlaGFuZGxlKTsgfQorCitwcml2YXRlOgorICBUTWFudWFsUmVzZXRFdmVudCByZWFkX2V2ZW50XzsKKyAgVE1hbnVhbFJlc2V0RXZlbnQgd3JpdGVfZXZlbnRfOworICBUQXV0b0hhbmRsZSBQaXBlXzsKK307CisKK2NsYXNzIFRBbm9uUGlwZUltcGwgOiBwdWJsaWMgVFBpcGVJbXBsIHsKK3B1YmxpYzoKKyAgVEFub25QaXBlSW1wbChIQU5ETEUgUGlwZVJkLCBIQU5ETEUgUGlwZVdydCkgOiBQaXBlUmRfKFBpcGVSZCksIFBpcGVXcnRfKFBpcGVXcnQpIHt9CisgIHZpcnR1YWwgflRBbm9uUGlwZUltcGwoKSB7fQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHBpcGVfcmVhZChQaXBlUmRfLmgsIGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcGlwZV93cml0ZShQaXBlV3J0Xy5oLCBidWYsIGxlbik7IH0KKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZVJkXy5oOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBQaXBlUmQpIHsgUGlwZVJkXy5yZXNldChQaXBlUmQpOyB9CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlV3J0Xy5oOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRXcnRQaXBlSGFuZGxlKEhBTkRMRSBQaXBlV3J0KSB7IFBpcGVXcnRfLnJlc2V0KFBpcGVXcnQpOyB9CisKK3ByaXZhdGU6CisgIFRBdXRvSGFuZGxlIFBpcGVSZF87CisgIFRBdXRvSGFuZGxlIFBpcGVXcnRfOworfTsKKworLy8gSWYgeW91IHdhbnQgYSBzZWxlY3QtbGlrZSBsb29wIHRvIHdvcmssIHVzZSB0aGlzIHN1YmNsYXNzLiAgQmUgd2FybmVkLi4uCisvLyB0aGUgcmVhZCBpbXBsZW1lbnRhdGlvbiBoYXMgc2V2ZXJhbCBjb250ZXh0IHN3aXRjaGVzLCBzbyB0aGlzIGlzIHNsb3dlcgorLy8gdGhhbiB1c2luZyB0aGUgcmVndWxhciBuYW1lZCBwaXBlIGltcGxlbWVudGF0aW9uCitjbGFzcyBUV2FpdGFibGVOYW1lZFBpcGVJbXBsIDogcHVibGljIFRQaXBlSW1wbCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRXYWl0YWJsZU5hbWVkUGlwZUltcGwoVEF1dG9IYW5kbGUgJnBpcGVoYW5kbGUpCisgICAgOiBiZWdpbl91bnJlYWRfaWR4XygwKSwgZW5kX3VucmVhZF9pZHhfKDApIHsKKyAgICByZWFkT3ZlcmxhcF8uYWN0aW9uID0gVE92ZXJsYXBwZWRXb3JrSXRlbTo6UkVBRDsKKyAgICByZWFkT3ZlcmxhcF8uaCA9IHBpcGVoYW5kbGUuaDsKKyAgICBjYW5jZWxPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpDQU5DRUxJTzsKKyAgICBjYW5jZWxPdmVybGFwXy5oID0gcGlwZWhhbmRsZS5oOworICAgIGJ1ZmZlcl8ucmVzaXplKDEwMjQgLyphcmJpdHJhcnkgYnVmZmVyIHNpemUqLywgJ1wwJyk7CisgICAgYmVnaW5Bc3luY1JlYWQoJmJ1ZmZlcl9bMF0sIHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJfLnNpemUoKSkpOworICAgIFBpcGVfLnJlc2V0KHBpcGVoYW5kbGUucmVsZWFzZSgpKTsKKyAgfQorICB2aXJ0dWFsIH5UV2FpdGFibGVOYW1lZFBpcGVJbXBsKCkgeworICAgIC8vIHNlZSBpZiB0aGVyZSBpcyBhbiBvdXRzdGFuZGluZyByZWFkIHJlcXVlc3QKKyAgICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gPT0gZW5kX3VucmVhZF9pZHhfKSB7CisgICAgICAvLyBpZiBzbywgY2FuY2VsIGl0LCBhbmQgd2FpdCBmb3IgdGhlIGRlYWQgY29tcGxldGlvbgorICAgICAgdGhyZWFkXy0+YWRkV29ya0l0ZW0oJmNhbmNlbE92ZXJsYXBfKTsKKyAgICAgIHJlYWRPdmVybGFwXy5vdmVybGFwcGVkUmVzdWx0cyhmYWxzZSAvKmlnbm9yZSBlcnJvcnMqLyk7CisgICAgfQorICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHBzZXVkb19zeW5jX3dyaXRlKFBpcGVfLmgsIHdyaXRlX2V2ZW50Xy5oLCBidWYsIGxlbik7CisgIH0KKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQorICB2aXJ0dWFsIHZvaWQgc2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeyBQaXBlXy5yZXNldChwaXBlaGFuZGxlKTsgfQorICB2aXJ0dWFsIGJvb2wgaXNCdWZmZXJlZERhdGFBdmFpbGFibGUoKSB7IHJldHVybiBiZWdpbl91bnJlYWRfaWR4XyA8IGVuZF91bnJlYWRfaWR4XzsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgeyByZXR1cm4gcmVhZHlfZXZlbnRfLmg7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBiZWdpbkFzeW5jUmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IGVuZEFzeW5jUmVhZCgpOworCisgIFRBdXRvT3ZlcmxhcFRocmVhZCB0aHJlYWRfOworICBUQXV0b0hhbmRsZSBQaXBlXzsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSByZWFkT3ZlcmxhcF87CisgIFRPdmVybGFwcGVkV29ya0l0ZW0gY2FuY2VsT3ZlcmxhcF87CisgIFRNYW51YWxSZXNldEV2ZW50IHJlYWR5X2V2ZW50XzsKKyAgVE1hbnVhbFJlc2V0RXZlbnQgd3JpdGVfZXZlbnRfOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXJfOworICB1aW50MzJfdCBiZWdpbl91bnJlYWRfaWR4XzsKKyAgdWludDMyX3QgZW5kX3VucmVhZF9pZHhfOworfTsKKwordm9pZCBUV2FpdGFibGVOYW1lZFBpcGVJbXBsOjpiZWdpbkFzeW5jUmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBiZWdpbl91bnJlYWRfaWR4XyA9IGVuZF91bnJlYWRfaWR4XyA9IDA7CisgIHJlYWRPdmVybGFwXy5yZXNldChidWYsIGxlbiwgcmVhZHlfZXZlbnRfLmgpOworICB0aHJlYWRfLT5hZGRXb3JrSXRlbSgmcmVhZE92ZXJsYXBfKTsKKyAgaWYgKHJlYWRPdmVybGFwXy5zdWNjZXNzID09IEZBTFNFICYmIHJlYWRPdmVybGFwXy5sYXN0X2Vycm9yICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OlJlYWRGaWxlIGVycm9yZWQgR0xFPSIsIHJlYWRPdmVybGFwXy5sYXN0X2Vycm9yKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogUmVhZEZpbGUgZmFpbGVkIik7CisgIH0KK30KKwordWludDMyX3QgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbDo6ZW5kQXN5bmNSZWFkKCkgeworICByZXR1cm4gcmVhZE92ZXJsYXBfLm92ZXJsYXBwZWRSZXN1bHRzKCk7Cit9CisKK3VpbnQzMl90IFRXYWl0YWJsZU5hbWVkUGlwZUltcGw6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaWYgKGJlZ2luX3VucmVhZF9pZHhfID09IGVuZF91bnJlYWRfaWR4XykgeworICAgIGVuZF91bnJlYWRfaWR4XyA9IGVuZEFzeW5jUmVhZCgpOworICB9CisKKyAgdWludDMyX3QgX19pZHhzaXplID0gZW5kX3VucmVhZF9pZHhfIC0gYmVnaW5fdW5yZWFkX2lkeF87CisgIHVpbnQzMl90IGJ5dGVzX3RvX2NvcHkgPSAobGVuIDwgX19pZHhzaXplKSA/IGxlbiA6IF9faWR4c2l6ZTsKKyAgbWVtY3B5KGJ1ZiwgJmJ1ZmZlcl9bYmVnaW5fdW5yZWFkX2lkeF9dLCBieXRlc190b19jb3B5KTsKKyAgYmVnaW5fdW5yZWFkX2lkeF8gKz0gYnl0ZXNfdG9fY29weTsKKyAgaWYgKGJlZ2luX3VucmVhZF9pZHhfICE9IGVuZF91bnJlYWRfaWR4XykgeworICAgIGFzc2VydChsZW4gPT0gYnl0ZXNfdG9fY29weSk7CisgICAgLy8gd2Ugd2VyZSBhYmxlIHRvIGZ1bGZpbGwgdGhlIHJlYWQgd2l0aCBqdXN0IHRoZSBieXRlcyBpbiBvdXIKKyAgICAvLyBidWZmZXIsIGFuZCB3ZSBzdGlsbCBoYXZlIGJ1ZmZlciBsZWZ0CisgICAgcmV0dXJuIGJ5dGVzX3RvX2NvcHk7CisgIH0KKyAgdWludDMyX3QgYnl0ZXNfY29waWVkID0gYnl0ZXNfdG9fY29weTsKKworICAvLyBhbGwgb2YgdGhlIHJlcXVlc3RlZCBkYXRhIGhhcyBiZWVuIHJlYWQuICBLaWNrIG9mZiBhbiBhc3luYyByZWFkIGZvciB0aGUgbmV4dCByb3VuZC4KKyAgYmVnaW5Bc3luY1JlYWQoJmJ1ZmZlcl9bMF0sIHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJfLnNpemUoKSkpOworCisgIHJldHVybiBieXRlc19jb3BpZWQ7Cit9CisKK3ZvaWQgcHNldWRvX3N5bmNfd3JpdGUoSEFORExFIHBpcGUsIEhBTkRMRSBldmVudCwgY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgT1ZFUkxBUFBFRCB0ZW1wT3ZlcmxhcDsKKyAgbWVtc2V0KCZ0ZW1wT3ZlcmxhcCwgMCwgc2l6ZW9mKHRlbXBPdmVybGFwKSk7CisgIHRlbXBPdmVybGFwLmhFdmVudCA9IGV2ZW50OworCisgIHVpbnQzMl90IHdyaXR0ZW4gPSAwOworICB3aGlsZSAod3JpdHRlbiA8IGxlbikgeworICAgIEJPT0wgcmVzdWx0ID0gOjpXcml0ZUZpbGUocGlwZSwgYnVmICsgd3JpdHRlbiwgbGVuIC0gd3JpdHRlbiwgTlVMTCwgJnRlbXBPdmVybGFwKTsKKworICAgIGlmIChyZXN1bHQgPT0gRkFMU0UgJiYgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9JT19QRU5ESU5HKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OldyaXRlRmlsZSBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiB3cml0ZSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBEV09SRCBieXRlcyA9IDA7CisgICAgcmVzdWx0ID0gOjpHZXRPdmVybGFwcGVkUmVzdWx0KHBpcGUsICZ0ZW1wT3ZlcmxhcCwgJmJ5dGVzLCBUUlVFKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGUgOjpHZXRPdmVybGFwcGVkUmVzdWx0IGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IEdldE92ZXJsYXBwZWRSZXN1bHQgZmFpbGVkIik7CisgICAgfQorICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgIH0KK30KKwordWludDMyX3QgcHNldWRvX3N5bmNfcmVhZChIQU5ETEUgcGlwZSwgSEFORExFIGV2ZW50LCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBPVkVSTEFQUEVEIHRlbXBPdmVybGFwOworICBtZW1zZXQoJnRlbXBPdmVybGFwLCAwLCBzaXplb2YodGVtcE92ZXJsYXApKTsKKyAgdGVtcE92ZXJsYXAuaEV2ZW50ID0gZXZlbnQ7CisKKyAgQk9PTCByZXN1bHQgPSA6OlJlYWRGaWxlKHBpcGUsIGJ1ZiwgbGVuLCBOVUxMLCAmdGVtcE92ZXJsYXApOworCisgIGlmIChyZXN1bHQgPT0gRkFMU0UgJiYgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9JT19QRU5ESU5HKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGUgOjpSZWFkRmlsZSBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgIERXT1JEIGJ5dGVzID0gMDsKKyAgcmVzdWx0ID0gOjpHZXRPdmVybGFwcGVkUmVzdWx0KHBpcGUsICZ0ZW1wT3ZlcmxhcCwgJmJ5dGVzLCBUUlVFKTsKKyAgaWYgKCFyZXN1bHQpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OkdldE92ZXJsYXBwZWRSZXN1bHQgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IEdldE92ZXJsYXBwZWRSZXN1bHQgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIGJ5dGVzOworfQorCisvLy0tLS0gQ29uc3RydWN0b3JzIC0tLS0KK1RQaXBlOjpUUGlwZShUQXV0b0hhbmRsZSAmUGlwZSkKKyAgOiBpbXBsXyhuZXcgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbChQaXBlKSksIFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7Cit9CisKK1RQaXBlOjpUUGlwZShIQU5ETEUgUGlwZSkKKyAgOiBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyhmYWxzZSkKK3sKKyAgVEF1dG9IYW5kbGUgcGlwZUhhbmRsZShQaXBlKTsKKyAgaW1wbF8ucmVzZXQobmV3IFRXYWl0YWJsZU5hbWVkUGlwZUltcGwocGlwZUhhbmRsZSkpOworfQorCitUUGlwZTo6VFBpcGUoY29uc3QgY2hhciogcGlwZW5hbWUpIDogVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZTo6VFBpcGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CisgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKK30KKworVFBpcGU6OlRQaXBlKEhBTkRMRSBQaXBlUmQsIEhBTkRMRSBQaXBlV3J0KQorICA6IGltcGxfKG5ldyBUQW5vblBpcGVJbXBsKFBpcGVSZCwgUGlwZVdydCkpLCBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyh0cnVlKSB7Cit9CisKK1RQaXBlOjpUUGlwZSgpIDogVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpIHsKK30KKworVFBpcGU6On5UUGlwZSgpIHsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zcG9ydCBjYWxsYmFja3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitib29sIFRQaXBlOjppc09wZW4oKSB7CisgIHJldHVybiBpbXBsXy5nZXQoKSAhPSBOVUxMOworfQorCitib29sIFRQaXBlOjpwZWVrKCkgeworICByZXR1cm4gaXNPcGVuKCk7Cit9CisKK3ZvaWQgVFBpcGU6Om9wZW4oKSB7CisgIGlmIChpc09wZW4oKSkKKyAgICByZXR1cm47CisKKyAgVEF1dG9IYW5kbGUgaFBpcGU7CisgIGRvIHsKKyAgICBEV09SRCBmbGFncyA9IEZJTEVfRkxBR19PVkVSTEFQUEVEOyAvLyBhc3luYyBtb2RlLCBzbyB3ZSBjYW4gZG8gcmVhZHMgYXQgdGhlIHNhbWUgdGltZSBhcyB3cml0ZXMKKyAgICBoUGlwZS5yZXNldChDcmVhdGVGaWxlQShwaXBlbmFtZV8uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgIC8vIG5vIHNoYXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAvLyBkZWZhdWx0IHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLCAvLyBvcGVucyBleGlzdGluZyBwaXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOyAvLyBubyB0ZW1wbGF0ZSBmaWxlCisKKyAgICBpZiAoaFBpcGUuaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgIGJyZWFrOyAvLyBzdWNjZXNzIQorCisgICAgaWYgKDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfUElQRV9CVVNZKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZTo6b3BlbiA6OkNyZWF0ZUZpbGUgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVW5hYmxlIHRvIG9wZW4gcGlwZSIpOworICAgIH0KKyAgfSB3aGlsZSAoOjpXYWl0TmFtZWRQaXBlQShwaXBlbmFtZV8uY19zdHIoKSwgVGltZW91dFNlY29uZHNfICogMTAwMCkpOworCisgIGlmIChoUGlwZS5oID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGU6Om9wZW4gOjpDcmVhdGVGaWxlIGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJVbmFibGUgdG8gb3BlbiBwaXBlIik7CisgIH0KKworICBpbXBsXy5yZXNldChuZXcgVE5hbWVkUGlwZUltcGwoaFBpcGUpKTsKK30KKwordm9pZCBUUGlwZTo6Y2xvc2UoKSB7CisgIGltcGxfLnJlc2V0KCk7Cit9CisKK3VpbnQzMl90IFRQaXBlOjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmICghaXNPcGVuKCkpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUiKTsKKyAgcmV0dXJuIGltcGxfLT5yZWFkKGJ1ZiwgbGVuKTsKK30KKwordWludDMyX3QgcGlwZV9yZWFkKEhBTkRMRSBwaXBlLCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBEV09SRCBjYlJlYWQ7CisgIGludCBmU3VjY2VzcyA9IFJlYWRGaWxlKHBpcGUsICAgIC8vIHBpcGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgICAgIC8vIGJ1ZmZlciB0byByZWNlaXZlIHJlcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgICAgIC8vIHNpemUgb2YgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYlJlYWQsIC8vIG51bWJlciBvZiBieXRlcyByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgIC8vIG5vdCBvdmVybGFwcGVkCisKKyAgaWYgKCFmU3VjY2VzcyAmJiBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9NT1JFX0RBVEEpCisgICAgcmV0dXJuIDA7IC8vIE5vIG1vcmUgZGF0YSwgcG9zc2libHkgYmVjYXVzZSBjbGllbnQgZGlzY29ubmVjdGVkLgorCisgIHJldHVybiBjYlJlYWQ7Cit9CisKK3ZvaWQgVFBpcGU6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmICghaXNPcGVuKCkpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBwaXBlIik7CisgIGltcGxfLT53cml0ZShidWYsIGxlbik7Cit9CisKK3ZvaWQgcGlwZV93cml0ZShIQU5ETEUgcGlwZSwgY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgRFdPUkQgY2JXcml0dGVuOworICBpbnQgZlN1Y2Nlc3MgPSBXcml0ZUZpbGUocGlwZSwgICAgICAgLy8gcGlwZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgICAgICAgIC8vIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgICAgICAgIC8vIG1lc3NhZ2UgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JXcml0dGVuLCAvLyBieXRlcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAvLyBub3Qgb3ZlcmxhcHBlZAorCisgIGlmICghZlN1Y2Nlc3MpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIldyaXRlIHRvIHBpcGUgZmFpbGVkIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBY2Nlc3NvcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0ZDo6c3RyaW5nIFRQaXBlOjpnZXRQaXBlbmFtZSgpIHsKKyAgcmV0dXJuIHBpcGVuYW1lXzsKK30KKwordm9pZCBUUGlwZTo6c2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSB7CisgIGlmIChwaXBlbmFtZS5maW5kKCJcXFxcIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgcGlwZW5hbWVfID0gIlxcXFwuXFxwaXBlXFwiICsgcGlwZW5hbWU7CisgIGVsc2UKKyAgICBwaXBlbmFtZV8gPSBwaXBlbmFtZTsKK30KKworSEFORExFIFRQaXBlOjpnZXRQaXBlSGFuZGxlKCkgeworICBpZiAoaW1wbF8pCisgICAgcmV0dXJuIGltcGxfLT5nZXRQaXBlSGFuZGxlKCk7CisgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKwordm9pZCBUUGlwZTo6c2V0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeworICBpZiAoaXNBbm9ueW1vdXNfKQorICAgIGltcGxfLT5zZXRQaXBlSGFuZGxlKHBpcGVoYW5kbGUpOworICBlbHNlCisgIHsKKyAgICBUQXV0b0hhbmRsZSBwaXBlKHBpcGVoYW5kbGUpOworICAgIGltcGxfLnJlc2V0KG5ldyBUTmFtZWRQaXBlSW1wbChwaXBlKSk7CisgIH0KK30KKworSEFORExFIFRQaXBlOjpnZXRXcnRQaXBlSGFuZGxlKCkgeworICBpZiAoaW1wbF8pCisgICAgcmV0dXJuIGltcGxfLT5nZXRXcnRQaXBlSGFuZGxlKCk7CisgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKwordm9pZCBUUGlwZTo6c2V0V3J0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgeworICBpZiAoaW1wbF8pCisgICAgaW1wbF8tPnNldFdydFBpcGVIYW5kbGUocGlwZWhhbmRsZSk7Cit9CisKK0hBTkRMRSBUUGlwZTo6Z2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsKKyAgaWYgKGltcGxfKQorICAgIHJldHVybiBpbXBsXy0+Z2V0TmF0aXZlV2FpdEhhbmRsZSgpOworICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CisKK2xvbmcgVFBpcGU6OmdldENvbm5UaW1lb3V0KCkgeworICByZXR1cm4gVGltZW91dFNlY29uZHNfOworfQorCit2b2lkIFRQaXBlOjpzZXRDb25uVGltZW91dChsb25nIHNlY29uZHMpIHsKKyAgVGltZW91dFNlY29uZHNfID0gc2Vjb25kczsKK30KKworI2VuZGlmIC8vX1dJTjMyCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTE0Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFBJUEVfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFBJUEVfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1N5bmMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFdpbmRvd3MgUGlwZXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICogRG9uJ3QgZGVzdHJveSBhIFRQaXBlIGF0IGdsb2JhbCBzY29wZSwgYXMgdGhhdCB3aWxsIGNhdXNlIGEgdGhyZWFkIGpvaW4KKyAqIGR1cmluZyBETExNYWluLiAgVGhhdCBhbHNvIG1lYW5zIHRoYXQgY2xpZW50IG9iamVjdHMgdXNpbmcgVFBpcGUgc2hvdWxkbid0IGJlIGF0IGdsb2JhbAorICogc2NvcGUuCisgKi8KKyNpZmRlZiBfV0lOMzIKK2NsYXNzIFRQaXBlSW1wbDsKKworY2xhc3MgVFBpcGUgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFBpcGU+IHsKK3B1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIG5ldyBwaXBlIG9iamVjdC4KKyAgVFBpcGUoKTsKKyAgLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcnMgLQorICBleHBsaWNpdCBUUGlwZShIQU5ETEUgUGlwZSk7ICAgICAgIC8vIEhBTkRMRSBpcyBhIHZvaWQqCisgIGV4cGxpY2l0IFRQaXBlKFRBdXRvSGFuZGxlJiBQaXBlKTsgLy8gdGhpcyBjdG9yIHdpbGwgY2xlYXIgb3V0IC8gbW92ZSBmcm9tIFBpcGUKKyAgLy8gbmVlZCBhIGNvbnN0IGNoYXIgKiBvdmVybG9hZCBzbyBzdHJpbmcgbGl0ZXJhbHMgZG9uJ3QgZ28gdG8gdGhlIEhBTkRMRSBvdmVybG9hZAorICBleHBsaWNpdCBUUGlwZShjb25zdCBjaGFyKiBwaXBlbmFtZSk7CisgIGV4cGxpY2l0IFRQaXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSk7CisgIC8vIEFub255bW91cyBwaXBlIC0KKyAgVFBpcGUoSEFORExFIFBpcGVSZCwgSEFORExFIFBpcGVXcnQpOworCisgIC8vIERlc3Ryb3lzIHRoZSBwaXBlIG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCisgIHZpcnR1YWwgflRQaXBlKCk7CisKKyAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwaXBlIGlzIG9wZW4gJiB2YWxpZC4KKyAgdmlydHVhbCBib29sIGlzT3BlbigpOworCisgIC8vIENoZWNrcyB3aGV0aGVyIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHBpcGUuCisgIHZpcnR1YWwgYm9vbCBwZWVrKCk7CisKKyAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIG5hbWVkL2Fub255bW91cyBwaXBlLgorICB2aXJ0dWFsIHZvaWQgb3BlbigpOworCisgIC8vIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHBpcGUuCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworCisgIC8vIFJlYWRzIGZyb20gdGhlIHBpcGUuCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgLy8gV3JpdGVzIHRvIHRoZSBwaXBlLgorICB2aXJ0dWFsIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIC8vIEFjY2Vzc29ycworICBzdGQ6OnN0cmluZyBnZXRQaXBlbmFtZSgpOworICB2b2lkIHNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSk7CisgIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCk7IC8vIGRvdWJsZXMgYXMgdGhlIHJlYWQgaGFuZGxlIGZvciBhbm9uIHBpcGUKKyAgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKTsKKyAgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKTsKKyAgdm9pZCBzZXRXcnRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKTsKKyAgbG9uZyBnZXRDb25uVGltZW91dCgpOworICB2b2lkIHNldENvbm5UaW1lb3V0KGxvbmcgc2Vjb25kcyk7CisKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGdlbmVyaWMgLyB0ZW1wbGF0ZSBzaXR1YXRpb25zLAorICAvLyBzbyBpdHMgbmFtZSBuZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBUUGlwZVNlcnZlcidzCisgIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZUltcGw+IGltcGxfOworCisgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKKworICBsb25nIFRpbWVvdXRTZWNvbmRzXzsKKyAgYm9vbCBpc0Fub255bW91c187Cit9OworCisjZWxzZQordHlwZWRlZiBUU29ja2V0IFRQaXBlOworI2VuZGlmCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFBJUEVfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjMzU4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oPgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmg+CisjaW5jbHVkZSA8QWNjQ3RybC5oPgorI2luY2x1ZGUgPEFjbGFwaS5oPgorI2VuZGlmIC8vX1dJTjMyCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworI2lmZGVmIF9XSU4zMgorCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK2NsYXNzIFRQaXBlU2VydmVySW1wbCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIFRQaXBlU2VydmVySW1wbCgpIHt9CisgIHZpcnR1YWwgflRQaXBlU2VydmVySW1wbCgpIHt9CisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7CisKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgPSAwOworICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgeyByZXR1cm4gTlVMTDsgfQorfTsKKworY2xhc3MgVEFub25QaXBlU2VydmVyIDogcHVibGljIFRQaXBlU2VydmVySW1wbCB7CitwdWJsaWM6CisgIFRBbm9uUGlwZVNlcnZlcigpIHsKKyAgICAvLyBUaGUgYW5vbnltb3VzIHBpcGUgbmVlZHMgdG8gYmUgY3JlYXRlZCBmaXJzdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuCisgICAgLy8gcGFzcyB0aGUgaGFuZGxlcyBvbiB0byB0aGUgY2xpZW50IGJlZm9yZSB0aGUgc2VydmUgKGFjY2VwdEltcGwpCisgICAgLy8gYmxvY2tpbmcgY2FsbC4KKyAgICBpZiAoIWNyZWF0ZUFub25QaXBlKCkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZShBbm9uKVBpcGUgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUUGlwZVNlcnZlciBDcmVhdGUoQW5vbilQaXBlIGZhaWxlZCIpOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgflRBbm9uUGlwZVNlcnZlcigpIHsKKyAgICBQaXBlUl8ucmVzZXQoKTsKKyAgICBQaXBlV18ucmVzZXQoKTsKKyAgICBDbGllbnRBbm9uUmVhZF8ucmVzZXQoKTsKKyAgICBDbGllbnRBbm9uV3JpdGVfLnJlc2V0KCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30gLy8gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZAorCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZVJfLmg7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVXXy5oOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpIHsgcmV0dXJuIENsaWVudEFub25SZWFkXy5oOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBDbGllbnRBbm9uV3JpdGVfLmg7IH0KKworcHJpdmF0ZToKKyAgYm9vbCBjcmVhdGVBbm9uUGlwZSgpOworCisgIFRBdXRvSGFuZGxlIFBpcGVSXzsgLy8gQW5vbnltb3VzIFBpcGUgKFIpCisgIFRBdXRvSGFuZGxlIFBpcGVXXzsgLy8gQW5vbnltb3VzIFBpcGUgKFcpCisKKyAgLy8gQ2xpZW50IHNpZGUgYW5vbnltb3VzIHBpcGUgaGFuZGxlcworICAvLz8gRG8gd2UgbmVlZCBkdXBsaWNhdGVzIHRvIHNlbmQgdG8gY2xpZW50PworICBUQXV0b0hhbmRsZSBDbGllbnRBbm9uUmVhZF87CisgIFRBdXRvSGFuZGxlIENsaWVudEFub25Xcml0ZV87Cit9OworCitjbGFzcyBUTmFtZWRQaXBlU2VydmVyIDogcHVibGljIFRQaXBlU2VydmVySW1wbCB7CitwdWJsaWM6CisgIFROYW1lZFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucykKKyAgICA6IHN0b3BwaW5nXyhmYWxzZSksIHBpcGVuYW1lXyhwaXBlbmFtZSksIGJ1ZnNpemVfKGJ1ZnNpemUpLCBtYXhjb25uc18obWF4Y29ubmVjdGlvbnMpCisgIHsKKyAgICBjb25uZWN0T3ZlcmxhcF8uYWN0aW9uID0gVE92ZXJsYXBwZWRXb3JrSXRlbTo6Q09OTkVDVDsKKyAgICBjYW5jZWxPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpDQU5DRUxJTzsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsKKyAgICBpbml0aWF0ZU5hbWVkQ29ubmVjdChsb2NrKTsKKyAgfQorICB2aXJ0dWFsIH5UTmFtZWRQaXBlU2VydmVyKCkge30KKworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkgeworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOworICAgIGNhY2hlZF9jbGllbnRfLnJlc2V0KCk7CisgICAgaWYgKFBpcGVfLmggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgIHN0b3BwaW5nXyA9IHRydWU7CisgICAgICBjYW5jZWxPdmVybGFwXy5oID0gUGlwZV8uaDsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIHdha2UgdXAgR2V0T3ZlcmxhcHBlZFJlc3VsdAorICAgICAgdGhyZWFkXy0+YWRkV29ya0l0ZW0oJmNhbmNlbE92ZXJsYXBfKTsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisKKyAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVfLmg7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCkgeyByZXR1cm4gbGlzdGVuX2V2ZW50Xy5oOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgY3JlYXRlTmFtZWRQaXBlKGNvbnN0IFRBdXRvQ3JpdCAmbG9ja1Byb29mKTsKKyAgdm9pZCBpbml0aWF0ZU5hbWVkQ29ubmVjdChjb25zdCBUQXV0b0NyaXQgJmxvY2tQcm9vZik7CisKKyAgVEF1dG9PdmVybGFwVGhyZWFkIHRocmVhZF87CisgIFRPdmVybGFwcGVkV29ya0l0ZW0gY29ubmVjdE92ZXJsYXBfOworICBUT3ZlcmxhcHBlZFdvcmtJdGVtIGNhbmNlbE92ZXJsYXBfOworCisgIGJvb2wgc3RvcHBpbmdfOworICBzdGQ6OnN0cmluZyBwaXBlbmFtZV87CisgIHVpbnQzMl90IGJ1ZnNpemVfOworICB1aW50MzJfdCBtYXhjb25uc187CisgIFRNYW51YWxSZXNldEV2ZW50IGxpc3Rlbl9ldmVudF87CisKKyAgVENyaXRpY2FsU2VjdGlvbiBwaXBlX3Byb3RlY3RfOworICAvLyBvbmx5IHJlYWQgb3Igd3JpdGUgdGhlc2UgdmFyaWFibGVzIHVuZGVybmVhdGggYSBsb2NrZWQgcGlwZV9wcm90ZWN0XworICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGU+IGNhY2hlZF9jbGllbnRfOworICBUQXV0b0hhbmRsZSBQaXBlXzsKK307CisKK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsKKyAgaWYgKGltcGxfKQorICAgIHJldHVybiBpbXBsXy0+Z2V0TmF0aXZlV2FpdEhhbmRsZSgpOworICByZXR1cm4gTlVMTDsKK30KKworLy8tLS0tIENvbnN0cnVjdG9ycyAtLS0tCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKQorICA6IGJ1ZnNpemVfKGJ1ZnNpemUpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUKTsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucykKKyAgOiBidWZzaXplXyhidWZzaXplKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CisgIHNldE1heENvbm5lY3Rpb25zKG1heGNvbm5lY3Rpb25zKTsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSA6IGJ1ZnNpemVfKDEwMjQpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUKTsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoaW50IGJ1ZnNpemUpIDogYnVmc2l6ZV8oYnVmc2l6ZSksIGlzQW5vbnltb3VzXyh0cnVlKSB7CisgIHNldE1heENvbm5lY3Rpb25zKDEpOworICBpbXBsXy5yZXNldChuZXcgVEFub25QaXBlU2VydmVyKTsKK30KKworVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKCkgOiBidWZzaXplXygxMDI0KSwgaXNBbm9ueW1vdXNfKHRydWUpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoMSk7CisgIGltcGxfLnJlc2V0KG5ldyBUQW5vblBpcGVTZXJ2ZXIpOworfQorCisvLy0tLS0gRGVzdHJ1Y3RvciAtLS0tCitUUGlwZVNlcnZlcjo6flRQaXBlU2VydmVyKCkge30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zcG9ydCBjYWxsYmFja3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFRQaXBlU2VydmVyOjpsaXN0ZW4oKSB7CisgIGlmIChpc0Fub255bW91c18pCisgICAgcmV0dXJuOworICBpbXBsXy5yZXNldChuZXcgVE5hbWVkUGlwZVNlcnZlcihwaXBlbmFtZV8sIGJ1ZnNpemVfLCBtYXhjb25uc18pKTsKK30KKworc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBUUGlwZVNlcnZlcjo6YWNjZXB0SW1wbCgpIHsKKyAgcmV0dXJuIGltcGxfLT5hY2NlcHRJbXBsKCk7Cit9CisKK3NoYXJlZF9wdHI8VFRyYW5zcG9ydD4gVEFub25QaXBlU2VydmVyOjphY2NlcHRJbXBsKCkgeworICAvLyBUaGlzIDAtYnl0ZSByZWFkIHNlcnZlcyBtZXJlbHkgYXMgYSBibG9ja2luZyBjYWxsLgorICBieXRlIGJ1ZjsKKyAgRFdPUkQgYnI7CisgIGludCBmU3VjY2VzcyA9IFJlYWRGaWxlKFBpcGVSXy5oLCAvLyBwaXBlIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCAgICAgLy8gYnVmZmVyIHRvIHJlY2VpdmUgcmVwbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIHNpemUgb2YgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiciwgICAgICAvLyBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgLy8gbm90IG92ZXJsYXBwZWQKKworICBpZiAoIWZTdWNjZXNzICYmIEdldExhc3RFcnJvcigpICE9IEVSUk9SX01PUkVfREFUQSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIHVuYWJsZSB0byBpbml0aWF0ZSBwaXBlIGNvbW1zLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRQaXBlU2VydmVyIHVuYWJsZSB0byBpbml0aWF0ZSBwaXBlIGNvbW1zIik7CisgIH0KKyAgc2hhcmVkX3B0cjxUUGlwZT4gY2xpZW50KG5ldyBUUGlwZShQaXBlUl8uaCwgUGlwZVdfLmgpKTsKKyAgcmV0dXJuIGNsaWVudDsKK30KKwordm9pZCBUTmFtZWRQaXBlU2VydmVyOjppbml0aWF0ZU5hbWVkQ29ubmVjdChjb25zdCBUQXV0b0NyaXQgJmxvY2tQcm9vZikgeworICBpZiAoc3RvcHBpbmdfKQorICAgIHJldHVybjsKKyAgaWYgKCFjcmVhdGVOYW1lZFBpcGUobG9ja1Byb29mKSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZU5hbWVkUGlwZSBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIiBUUGlwZVNlcnZlciBDcmVhdGVOYW1lZFBpcGUgZmFpbGVkIik7CisgIH0KKworICAvLyBUaGUgcHJpb3IgY29ubmVjdGlvbiBoYXMgYmVlbiBoYW5kbGVkLCBzbyBjbG9zZSB0aGUgZ2F0ZQorICBSZXNldEV2ZW50KGxpc3Rlbl9ldmVudF8uaCk7CisgIGNvbm5lY3RPdmVybGFwXy5yZXNldChOVUxMLCAwLCBsaXN0ZW5fZXZlbnRfLmgpOworICBjb25uZWN0T3ZlcmxhcF8uaCA9IFBpcGVfLmg7CisgIHRocmVhZF8tPmFkZFdvcmtJdGVtKCZjb25uZWN0T3ZlcmxhcF8pOworCisgIC8vIFdhaXQgZm9yIHRoZSBjbGllbnQgdG8gY29ubmVjdDsgaWYgaXQgc3VjY2VlZHMsIHRoZQorICAvLyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uemVybyB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgLy8gemVybywgR2V0TGFzdEVycm9yIHNob3VsZCByZXR1cm4gRVJST1JfUElQRV9DT05ORUNURUQuCisgIGlmIChjb25uZWN0T3ZlcmxhcF8uc3VjY2VzcykgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIkNsaWVudCBjb25uZWN0ZWQuIik7CisgICAgY2FjaGVkX2NsaWVudF8ucmVzZXQobmV3IFRQaXBlKFBpcGVfKSk7CisgICAgLy8gbWFrZSBzdXJlIHBlb3BsZSBrbm93IHRoYXQgYSBjb25uZWN0aW9uIGlzIHJlYWR5CisgICAgU2V0RXZlbnQobGlzdGVuX2V2ZW50Xy5oKTsKKyAgICByZXR1cm47CisgIH0KKworICBEV09SRCBkd0VyciA9IGNvbm5lY3RPdmVybGFwXy5sYXN0X2Vycm9yOworICBzd2l0Y2ggKGR3RXJyKSB7CisgIGNhc2UgRVJST1JfUElQRV9DT05ORUNURUQ6CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiQ2xpZW50IGNvbm5lY3RlZC4iKTsKKyAgICBjYWNoZWRfY2xpZW50Xy5yZXNldChuZXcgVFBpcGUoUGlwZV8pKTsKKyAgICAvLyBtYWtlIHN1cmUgcGVvcGxlIGtub3cgdGhhdCBhIGNvbm5lY3Rpb24gaXMgcmVhZHkKKyAgICBTZXRFdmVudChsaXN0ZW5fZXZlbnRfLmgpOworICAgIHJldHVybjsKKyAgY2FzZSBFUlJPUl9JT19QRU5ESU5HOgorICAgIHJldHVybjsgLy8gYWNjZXB0SW1wbCB3aWxsIGRvIHRoZSBhcHByb3ByaWF0ZSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCisgIGRlZmF1bHQ6CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBmYWlsZWQsIEdMRT0iLCBkd0Vycik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBmYWlsZWQiKTsKKyAgfQorfQorCitzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFROYW1lZFBpcGVTZXJ2ZXI6OmFjY2VwdEltcGwoKSB7CisgIHsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsKKyAgICBpZiAoY2FjaGVkX2NsaWVudF8uZ2V0KCkgIT0gTlVMTCkgeworICAgICAgc2hhcmVkX3B0cjxUUGlwZT4gY2xpZW50OworICAgICAgLy8gemVybyBvdXQgY2FjaGVkX2NsaWVudCwgc2luY2Ugd2UgYXJlIGFib3V0IHRvIHJldHVybiBpdC4KKyAgICAgIGNsaWVudC5zd2FwKGNhY2hlZF9jbGllbnRfKTsKKworICAgICAgLy8ga2ljayBvZmYgdGhlIG5leHQgY29ubmVjdGlvbiBiZWZvcmUgcmV0dXJuaW5nCisgICAgICBpbml0aWF0ZU5hbWVkQ29ubmVjdChsb2NrKTsKKyAgICAgIHJldHVybiBjbGllbnQ7IC8vIHN1Y2Nlc3MhCisgICAgfQorICB9CisKKyAgaWYgKFBpcGVfLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlROYW1lZFBpcGVTZXJ2ZXI6IHNvbWVvbmUgY2FsbGVkIGFjY2VwdCBvbiBhIGNsb3NlZCBwaXBlIHNlcnZlciIpOworICB9CisKKyAgRFdPUkQgZHdEdW1teSA9IDA7CisKKyAgLy8gRm9yIHRoZSBtb3N0IHBhcnQsIFBpcGVfIHNob3VsZCBiZSBwcm90ZWN0ZWQgd2l0aCBwaXBlX3Byb3RlY3RfLiAgV2UgY2FuJ3QKKyAgLy8gcmVhc29uYWJseSBkbyB0aGF0IGhlcmUgdGhvdWdoIHdpdGhvdXQgYnJlYWtpbmcgaW50ZXJydXB0YWJpbGl0eS4gIEhvd2V2ZXIsCisgIC8vIHRoaXMgc2hvdWxkIGJlIHNhZmUsIHRob3VnaCBJJ20gbm90IGhhcHB5IGFib3V0IGl0LiAgV2Ugb25seSBuZWVkIHRvIGVuc3VyZQorICAvLyB0aGF0IG5vIG9uZSB3cml0ZXMgLyBtb2RpZmllcyBQaXBlXy5oIHdoaWxlIHdlIGFyZSByZWFkaW5nIGl0LiAgV2VsbCwgdGhlCisgIC8vIG9ubHkgdHdvIHRoaW5ncyB0aGF0IHNob3VsZCBiZSBtb2RpZnlpbmcgUGlwZV8gYXJlIGFjY2VwdEltcGwsIHRoZQorICAvLyBmdW5jdGlvbnMgaXQgY2FsbHMsIGFuZCB0aGUgZGVzdHJ1Y3Rvci4gIFRob3NlIHRoaW5ncyBzaG91bGRuJ3QgYmUgcnVuCisgIC8vIGNvbmN1cnJlbnRseSBhbnl3YXkuICBTbyB0aGlzIGNhbGwgaXMgJ3JlYWxseScganVzdCBhIHJlYWQgdGhhdCBtYXkgaGFwcGVuCisgIC8vIGNvbmN1cnJlbnRseSB3aXRoIGludGVycnVwdCwgYW5kIHRoYXQgc2hvdWxkIGJlIGZpbmUuCisgIGlmIChHZXRPdmVybGFwcGVkUmVzdWx0KFBpcGVfLmgsICZjb25uZWN0T3ZlcmxhcF8ub3ZlcmxhcCwgJmR3RHVtbXksIFRSVUUpKSB7CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiQ2xpZW50IGNvbm5lY3RlZC4iKTsKKyAgICBzaGFyZWRfcHRyPFRQaXBlPiBjbGllbnQobmV3IFRQaXBlKFBpcGVfKSk7CisgICAgLy8ga2ljayBvZmYgdGhlIG5leHQgY29ubmVjdGlvbiBiZWZvcmUgcmV0dXJuaW5nCisgICAgaW5pdGlhdGVOYW1lZENvbm5lY3QobG9jayk7CisgICAgcmV0dXJuIGNsaWVudDsgLy8gc3VjY2VzcyEKKyAgfQorICAvLyBpZiB3ZSBnb3QgaGVyZSwgdGhlbiB3ZSBhcmUgaW4gYW4gZXJyb3IgLyBzaHV0ZG93biBjYXNlCisgIERXT1JEIGdsZSA9IEdldExhc3RFcnJvcigpOyAvLyBzYXZlIGVycm9yIGJlZm9yZSBkb2luZyBjbGVhbnVwCisgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENvbm5lY3ROYW1lZFBpcGUgR0xFPSIsIGdsZSk7CisgIGlmKGdsZSA9PSBFUlJPUl9PUEVSQVRJT05fQUJPUlRFRCkgeworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOyAgICAJLy8gTmVlZGVkIHRvIGluc3VyZSBjb25jdXJyZW50IHRocmVhZCB0byBiZSBvdXQgb2YgaW50ZXJydXB0LgorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsICJUUGlwZVNlcnZlcjogc2VydmVyIGludGVydXB0ZWQiKTsKKyAgfQorICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVFBpcGVTZXJ2ZXI6IGNsaWVudCBjb25uZWN0aW9uIGZhaWxlZCIpOworfQorCit2b2lkIFRQaXBlU2VydmVyOjppbnRlcnJ1cHQoKSB7CisgIGlmIChpbXBsXykKKyAgICBpbXBsXy0+aW50ZXJydXB0KCk7Cit9CisKK3ZvaWQgVFBpcGVTZXJ2ZXI6OmNsb3NlKCkgeworICBpbXBsXy5yZXNldCgpOworfQorCitib29sIFROYW1lZFBpcGVTZXJ2ZXI6OmNyZWF0ZU5hbWVkUGlwZShjb25zdCBUQXV0b0NyaXQgJiAvKmxvY2tQcm9vZiovKSB7CisKKyAgLy8gV2luZG93cyAtIHNldCBzZWN1cml0eSB0byBhbGxvdyBub24tZWxldmF0ZWQgYXBwcworICAvLyB0byBhY2Nlc3MgcGlwZXMgY3JlYXRlZCBieSBlbGV2YXRlZCBhcHBzLgorICBTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgU0lEQXV0aFdvcmxkID0gU0VDVVJJVFlfV09STERfU0lEX0FVVEhPUklUWTsKKyAgUFNJRCBldmVyeW9uZV9zaWQgPSBOVUxMOworICBBbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoCisgICAgICAmU0lEQXV0aFdvcmxkLCAxLCBTRUNVUklUWV9XT1JMRF9SSUQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICZldmVyeW9uZV9zaWQpOworCisgIEVYUExJQ0lUX0FDQ0VTUyBlYTsKKyAgWmVyb01lbW9yeSgmZWEsIHNpemVvZihFWFBMSUNJVF9BQ0NFU1MpKTsKKyAgZWEuZ3JmQWNjZXNzUGVybWlzc2lvbnMgPSBTUEVDSUZJQ19SSUdIVFNfQUxMIHwgU1RBTkRBUkRfUklHSFRTX0FMTDsKKyAgZWEuZ3JmQWNjZXNzTW9kZSA9IFNFVF9BQ0NFU1M7CisgIGVhLmdyZkluaGVyaXRhbmNlID0gTk9fSU5IRVJJVEFOQ0U7CisgIGVhLlRydXN0ZWUuVHJ1c3RlZUZvcm0gPSBUUlVTVEVFX0lTX1NJRDsKKyAgZWEuVHJ1c3RlZS5UcnVzdGVlVHlwZSA9IFRSVVNURUVfSVNfV0VMTF9LTk9XTl9HUk9VUDsKKyAgZWEuVHJ1c3RlZS5wdHN0ck5hbWUgPSBzdGF0aWNfY2FzdDxMUFRTVFI+KGV2ZXJ5b25lX3NpZCk7CisKKyAgUEFDTCBhY2wgPSBOVUxMOworICBTZXRFbnRyaWVzSW5BY2woMSwgJmVhLCBOVUxMLCAmYWNsKTsKKworICBQU0VDVVJJVFlfREVTQ1JJUFRPUiBzZCA9IChQU0VDVVJJVFlfREVTQ1JJUFRPUilMb2NhbEFsbG9jKExQVFIsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCk7CisgIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3Ioc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pOworICBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKHNkLCBUUlVFLCBhY2wsIEZBTFNFKTsKKworICBTRUNVUklUWV9BVFRSSUJVVEVTIHNhOworICBzYS5uTGVuZ3RoID0gc2l6ZW9mKFNFQ1VSSVRZX0FUVFJJQlVURVMpOworICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA9IHNkOworICBzYS5iSW5oZXJpdEhhbmRsZSA9IEZBTFNFOworCisgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmFtZWQgcGlwZQorICBUQXV0b0hhbmRsZSBoUGlwZShDcmVhdGVOYW1lZFBpcGVBKHBpcGVuYW1lXy5jX3N0cigpLCAgICAvLyBwaXBlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX0FDQ0VTU19EVVBMRVggfCAgLy8gcmVhZC93cml0ZSBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCwgLy8gYXN5bmMgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVfVFlQRV9CWVRFIHwgICAgICAvLyBieXRlIHR5cGUgcGlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVfUkVBRE1PREVfQllURSwgICAvLyBieXRlIHJlYWQgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvbm5zXywgICAgICAgICAgICAvLyBtYXguIGluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemVfLCAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplXywgICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IHRpbWUtb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhKSk7ICAgICAgICAgICAgICAgIC8vIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKworICBEV09SRCBsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgTG9jYWxGcmVlKHNkKTsKKyAgTG9jYWxGcmVlKGFjbCk7CisgIEZyZWVTaWQoZXZlcnlvbmVfc2lkKTsKKworICBpZiAoaFBpcGUuaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIFBpcGVfLnJlc2V0KCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXI6OlRDcmVhdGVOYW1lZFBpcGUoKSBHTEU9IiwgbGFzdEVycm9yKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgIGxhc3RFcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgUGlwZV8ucmVzZXQoaFBpcGUucmVsZWFzZSgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVEFub25QaXBlU2VydmVyOjpjcmVhdGVBbm9uUGlwZSgpIHsKKyAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYTsKKyAgU0VDVVJJVFlfREVTQ1JJUFRPUiBzZDsgLy8gc2VjdXJpdHkgaW5mb3JtYXRpb24gZm9yIHBpcGVzCisKKyAgSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcigmc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pOworICBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKCZzZCwgdHJ1ZSwgTlVMTCwgZmFsc2UpOworICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA9ICZzZDsKKyAgc2Eubkxlbmd0aCA9IHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKTsKKyAgc2EuYkluaGVyaXRIYW5kbGUgPSB0cnVlOyAvLyBhbGxvdyBwYXNzaW5nIGhhbmRsZSB0byBjaGlsZAorCisgIEhBTkRMRSBDbGllbnRBbm9uUmVhZEgsIFBpcGVXX0gsIENsaWVudEFub25Xcml0ZUgsIFBpcGVfSDsKKyAgaWYgKCFDcmVhdGVQaXBlKCZDbGllbnRBbm9uUmVhZEgsICZQaXBlV19ILCAmc2EsIDApKSAvLyBjcmVhdGUgc3RkaW4gcGlwZQorICB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUNyZWF0ZVBpcGUoJlBpcGVfSCwgJkNsaWVudEFub25Xcml0ZUgsICZzYSwgMCkpIC8vIGNyZWF0ZSBzdGRvdXQgcGlwZQorICB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgIENsb3NlSGFuZGxlKENsaWVudEFub25SZWFkSCk7CisgICAgQ2xvc2VIYW5kbGUoUGlwZVdfSCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQ2xpZW50QW5vblJlYWRfLnJlc2V0KENsaWVudEFub25SZWFkSCk7CisgIENsaWVudEFub25Xcml0ZV8ucmVzZXQoQ2xpZW50QW5vbldyaXRlSCk7CisgIFBpcGVSXy5yZXNldChQaXBlX0gpOworICBQaXBlV18ucmVzZXQoUGlwZVdfSCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBY2Nlc3NvcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGQ6OnN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CisgIHJldHVybiBwaXBlbmFtZV87Cit9CisKK3ZvaWQgVFBpcGVTZXJ2ZXI6OnNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSkgeworICBpZiAocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIHBpcGVuYW1lXyA9ICJcXFxcLlxccGlwZVxcIiArIHBpcGVuYW1lOworICBlbHNlCisgICAgcGlwZW5hbWVfID0gcGlwZW5hbWU7Cit9CisKK2ludCBUUGlwZVNlcnZlcjo6Z2V0QnVmZmVyU2l6ZSgpIHsKKyAgcmV0dXJuIGJ1ZnNpemVfOworfQordm9pZCBUUGlwZVNlcnZlcjo6c2V0QnVmZmVyU2l6ZShpbnQgYnVmc2l6ZSkgeworICBidWZzaXplXyA9IGJ1ZnNpemU7Cit9CisKK0hBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0UGlwZUhhbmRsZSgpIHsKKyAgcmV0dXJuIGltcGxfID8gaW1wbF8tPmdldFBpcGVIYW5kbGUoKSA6IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorSEFORExFIFRQaXBlU2VydmVyOjpnZXRXcnRQaXBlSGFuZGxlKCkgeworICByZXR1cm4gaW1wbF8gPyBpbXBsXy0+Z2V0V3J0UGlwZUhhbmRsZSgpIDogSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CitIQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldENsaWVudFJkUGlwZUhhbmRsZSgpIHsKKyAgcmV0dXJuIGltcGxfID8gaW1wbF8tPmdldENsaWVudFJkUGlwZUhhbmRsZSgpIDogSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CitIQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldENsaWVudFdydFBpcGVIYW5kbGUoKSB7CisgIHJldHVybiBpbXBsXyA/IGltcGxfLT5nZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgOiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKworYm9vbCBUUGlwZVNlcnZlcjo6Z2V0QW5vbnltb3VzKCkgeworICByZXR1cm4gaXNBbm9ueW1vdXNfOworfQordm9pZCBUUGlwZVNlcnZlcjo6c2V0QW5vbnltb3VzKGJvb2wgYW5vbikgeworICBpc0Fub255bW91c18gPSBhbm9uOworfQorCit2b2lkIFRQaXBlU2VydmVyOjpzZXRNYXhDb25uZWN0aW9ucyh1aW50MzJfdCBtYXhjb25uZWN0aW9ucykgeworICBpZiAobWF4Y29ubmVjdGlvbnMgPT0gMCkKKyAgICBtYXhjb25uc18gPSAxOworICBlbHNlIGlmIChtYXhjb25uZWN0aW9ucyA+IFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUykKKyAgICBtYXhjb25uc18gPSBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVM7CisgIGVsc2UKKyAgICBtYXhjb25uc18gPSBtYXhjb25uZWN0aW9uczsKK30KKworI2VuZGlmIC8vX1dJTjMyCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWIxM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUldJTlBJUEVTX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJXSU5QSVBFU19IXyAxCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2VuZGlmCisKKyNkZWZpbmUgVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUIFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogV2luZG93cyBQaXBlcyBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0LgorICogRG9uJ3QgZGVzdHJveSBhIFRQaXBlU2VydmVyIGF0IGdsb2JhbCBzY29wZSwgYXMgdGhhdCB3aWxsIGNhdXNlIGEgdGhyZWFkIGpvaW4KKyAqIGR1cmluZyBETExNYWluLiAgVGhhdCBhbHNvIG1lYW5zIHRoYXQgVFNlcnZlcidzIHVzaW5nIFRQaXBlU2VydmVyIHNob3VsZG4ndCBiZSBhdCBnbG9iYWwKKyAqIHNjb3BlLgorICovCisjaWZkZWYgX1dJTjMyCitjbGFzcyBUUGlwZVNlcnZlckltcGw7CitjbGFzcyBUUGlwZTsKKworY2xhc3MgVFBpcGVTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9ycworICAvLyBOYW1lZCBQaXBlIC0KKyAgVFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKTsKKyAgVFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucyk7CisgIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSk7CisgIC8vIEFub255bW91cyBwaXBlIC0KKyAgVFBpcGVTZXJ2ZXIoaW50IGJ1ZnNpemUpOworICBUUGlwZVNlcnZlcigpOworCisgIC8vIERlc3RydWN0b3IKKyAgdmlydHVhbCB+VFBpcGVTZXJ2ZXIoKTsKKworICAvLyBTdGFuZGFyZCB0cmFuc3BvcnQgY2FsbGJhY2tzCisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisgIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKTsKKworICAvLyBBY2Nlc3NvcnMKKyAgc3RkOjpzdHJpbmcgZ2V0UGlwZW5hbWUoKTsKKyAgdm9pZCBzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOworICBpbnQgZ2V0QnVmZmVyU2l6ZSgpOworICB2b2lkIHNldEJ1ZmZlclNpemUoaW50IGJ1ZnNpemUpOworICBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpOyAvLyBOYW1lZCBQaXBlIFIvVyAtb3ItIEFub255bW91cyBwaXBlIFJlYWQgaGFuZGxlCisgIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCk7CisgIEhBTkRMRSBnZXRDbGllbnRSZFBpcGVIYW5kbGUoKTsKKyAgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKTsKKyAgYm9vbCBnZXRBbm9ueW1vdXMoKTsKKyAgdm9pZCBzZXRBbm9ueW1vdXMoYm9vbCBhbm9uKTsKKyAgdm9pZCBzZXRNYXhDb25uZWN0aW9ucyh1aW50MzJfdCBtYXhjb25uZWN0aW9ucyk7CisKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGdlbmVyaWMgLyB0ZW1wbGF0ZSBzaXR1YXRpb25zLAorICAvLyBzbyBpdHMgbmFtZSBuZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBUUGlwZSdzCisgIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCk7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVTZXJ2ZXJJbXBsPiBpbXBsXzsKKworICBzdGQ6OnN0cmluZyBwaXBlbmFtZV87CisgIHVpbnQzMl90IGJ1ZnNpemVfOworICB1aW50MzJfdCBtYXhjb25uc187CisgIGJvb2wgaXNBbm9ueW1vdXNfOworfTsKKyNlbHNlIC8vX1dJTjMyCisvLypOSVggbmFtZWQgcGlwZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGRvbWFpbiBzb2NrZXQKK3R5cGVkZWYgVFNlcnZlclNvY2tldCBUUGlwZVNlcnZlcjsKKyNlbmRpZgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJXSU5QSVBFU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2MDVjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBTU0wgc2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KKyAqLworVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFRTZXJ2ZXJTb2NrZXQocG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUU2VydmVyU29ja2V0KGFkZHJlc3MsIHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK1RTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVFNlcnZlclNvY2tldChwb3J0LCBzZW5kVGltZW91dCwgcmVjdlRpbWVvdXQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKKyAgaWYgKGludGVycnVwdGFibGVDaGlsZHJlbl8pIHsKKyAgICAgIHJldHVybiBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCwgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8pOworCisgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQpOworICB9Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzVkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNFUlZFUlNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU0VSVkVSU09DS0VUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRTU0xTb2NrZXRGYWN0b3J5OworCisvKioKKyAqIFNlcnZlciBzb2NrZXQgdGhhdCBhY2NlcHRzIFNTTCBjb25uZWN0aW9ucy4KKyAqLworY2xhc3MgVFNTTFNlcnZlclNvY2tldCA6IHB1YmxpYyBUU2VydmVyU29ja2V0IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFRTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byBhbGwgaW50ZXJmYWNlcy4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIExpc3RlbmluZyBwb3J0CisgICAqIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAqIEBwYXJhbSByZWN2VGltZW91dCBTb2NrZXQgcmVjZWl2ZSB0aW1lb3V0CisgICAqIEBwYXJhbSBmYWN0b3J5ICAgICBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgaW50IHNlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgIGludCByZWN2VGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnlfOworfTsKK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MThlOWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcApAQCAtMCwwICsxLDExMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfRkNOVExfSAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEX0JFRk9SRSAgICAweDEwMDAwMDAwTAorI2RlZmluZSBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSAweDEwMTAwMDAwTAorCisjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgeworICBNdXRleCBtdXRleDsKK307CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLy8gT3BlblNTTCBpbml0aWFsaXphdGlvbi9jbGVhbnVwCisKK3N0YXRpYyBib29sIG9wZW5TU0xJbml0aWFsaXplZCA9IGZhbHNlOworc3RhdGljIGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+IG11dGV4ZXM7CisKK3N0YXRpYyB2b2lkIGNhbGxiYWNrTG9ja2luZyhpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIqLCBpbnQpIHsKKyAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgIC8vIGFzc2VydGlvbiBvZiAocHggIT0gMCkgaGVyZSB0eXBpY2FsbHkgbWVhbnMgdGhhdCBhIFRTU0xTb2NrZXQncyBsaWZldGltZQorICAgIC8vIGV4Y2VlZGVkIHRoZSBsaWZldGltZSBvZiB0aGUgVFNTTFNvY2tldEZhY3RvcnkgdGhhdCBjcmVhdGVkIGl0LCBhbmQgdGhlCisgICAgLy8gVFNTTFNvY2tldEZhY3RvcnkgYWxyZWFkeSByYW4gY2xlYW51cE9wZW5TU0woKSwgd2hpY2ggZGVsZXRlZCAibXV0ZXhlcyIuCisgICAgbXV0ZXhlc1tuXS5sb2NrKCk7CisgIH0gZWxzZSB7CisgICAgbXV0ZXhlc1tuXS51bmxvY2soKTsKKyAgfQorfQorCisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEX0JFRk9SRSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGxiYWNrVGhyZWFkSUQoKSB7CisjaWZkZWYgX1dJTjMyCisgIHJldHVybiAodW5zaWduZWQgbG9uZylHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyNlbHNlCisgIHJldHVybiAodW5zaWduZWQgbG9uZylwdGhyZWFkX3NlbGYoKTsKKyNlbmRpZgorfQorI2VuZGlmCisKK3N0YXRpYyBDUllQVE9fZHlubG9ja192YWx1ZSogZHluX2NyZWF0ZShjb25zdCBjaGFyKiwgaW50KSB7CisgIHJldHVybiBuZXcgQ1JZUFRPX2R5bmxvY2tfdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGR5bl9sb2NrKGludCBtb2RlLCBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGxvY2ssIGNvbnN0IGNoYXIqLCBpbnQpIHsKKyAgaWYgKGxvY2sgIT0gTlVMTCkgeworICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAgIGxvY2stPm11dGV4LmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgbG9jay0+bXV0ZXgudW5sb2NrKCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGR5bl9kZXN0cm95KHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSogbG9jaywgY29uc3QgY2hhciosIGludCkgeworICBkZWxldGUgbG9jazsKK30KKwordm9pZCBpbml0aWFsaXplT3BlblNTTCgpIHsKKyAgaWYgKG9wZW5TU0xJbml0aWFsaXplZCkgeworICAgIHJldHVybjsKKyAgfQorICBvcGVuU1NMSW5pdGlhbGl6ZWQgPSB0cnVlOworICBTU0xfbGlicmFyeV9pbml0KCk7CisgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworICAvLyBzdGF0aWMgbG9ja2luZworICAvLyBuZXdlciB2ZXJzaW9ucyBvZiBPcGVuU1NMIGNoYW5nZWQgQ1JZUFRPX251bV9sb2NrcyAtIHNlZSBUSFJJRlQtMzg3OAorI2lmZGVmIENSWVBUT19udW1fbG9ja3MKKyAgbXV0ZXhlcyA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+KG5ldyBNdXRleFtDUllQVE9fbnVtX2xvY2tzKCldKTsKKyNlbHNlCisgIG11dGV4ZXMgPSBib29zdDo6c2hhcmVkX2FycmF5PE11dGV4PihuZXcgTXV0ZXhbIDo6Q1JZUFRPX251bV9sb2NrcygpXSk7CisjZW5kaWYKKworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soY2FsbGJhY2tUaHJlYWRJRCk7CisjZW5kaWYKKworICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soY2FsbGJhY2tMb2NraW5nKTsKKworICAvLyBkeW5hbWljIGxvY2tpbmcKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhkeW5fY3JlYXRlKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZHluX2xvY2spOworICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhkeW5fZGVzdHJveSk7Cit9CisKK3ZvaWQgY2xlYW51cE9wZW5TU0woKSB7CisgIGlmICghb3BlblNTTEluaXRpYWxpemVkKSB7CisgICAgcmV0dXJuOworICB9CisgIG9wZW5TU0xJbml0aWFsaXplZCA9IGZhbHNlOworCisgIC8vIGh0dHBzOi8vd2lraS5vcGVuc3NsLm9yZy9pbmRleC5waHAvTGlicmFyeV9Jbml0aWFsaXphdGlvbiNDbGVhbnVwCisgIC8vIHdlIHB1cnBvc2VmdWxseSBkbyBOT1QgY2FsbCBGSVBTX21vZGVfc2V0KDApIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgZW5jbG9zaW5nIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBGSVBTIGVudGlyZWx5CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyAgRU5HSU5FX2NsZWFudXAoKTsgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9tYW4xLjEuMC9jcnlwdG8vRU5HSU5FX2NsZWFudXAuaHRtbCAtIGNsZWFudXAgY2FsbCBpcyBuZWVkZWQgYmVmb3JlIDEuMS4wCisjZW5kaWYKKyAgQ09ORl9tb2R1bGVzX3VubG9hZCgxKTsKKyAgRVZQX2NsZWFudXAoKTsKKyAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKKyAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworCisgIG11dGV4ZXMucmVzZXQoKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSA9IDAsIGludCBzc2xlcnJubyA9IDApOworc3RhdGljIGJvb2wgbWF0Y2hOYW1lKGNvbnN0IGNoYXIqIGhvc3QsIGNvbnN0IGNoYXIqIHBhdHRlcm4sIGludCBzaXplKTsKK3N0YXRpYyBjaGFyIHVwcGVyY2FzZShjaGFyIGMpOworCisvLyBTU0xDb250ZXh0IGltcGxlbWVudGF0aW9uCitTU0xDb250ZXh0OjpTU0xDb250ZXh0KGNvbnN0IFNTTFByb3RvY29sJiBwcm90b2NvbCkgeworICBpZiAocHJvdG9jb2wgPT0gU1NMVExTKSB7CisgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMworICB9IGVsc2UgaWYgKHByb3RvY29sID09IFNTTHYzKSB7CisgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFNTTHYzX21ldGhvZCgpKTsKKyNlbmRpZgorICB9IGVsc2UgaWYgKHByb3RvY29sID09IFRMU3YxXzApIHsKKyAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOworICB9IGVsc2UgaWYgKHByb3RvY29sID09IFRMU3YxXzEpIHsKKyAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfMV9tZXRob2QoKSk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gVExTdjFfMikgeworICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFN2MV8yX21ldGhvZCgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLy8gVU5LTk9XTiBQUk9UT0NPTCEKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX25ldzogVW5rbm93biBwcm90b2NvbCIpOworICB9CisKKyAgaWYgKGN0eF8gPT0gTlVMTCkgeworICAgIHN0cmluZyBlcnJvcnM7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzKTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX25ldzogIiArIGVycm9ycyk7CisgIH0KKyAgU1NMX0NUWF9zZXRfbW9kZShjdHhfLCBTU0xfTU9ERV9BVVRPX1JFVFJZKTsKKworICAvLyBEaXNhYmxlIGhvcnJpYmx5IGluc2VjdXJlIFNTTHYyIGFuZCBTU0x2MyBwcm90b2NvbHMgYnV0IGFsbG93IGEgaGFuZHNoYWtlCisgIC8vIHdpdGggb2xkZXIgY2xpZW50cyBzbyB0aGV5IGdldCBhIGdyYWNlZnVsIGRlbmlhbC4KKyAgaWYgKHByb3RvY29sID09IFNTTFRMUykgeworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjIpOworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjMpOyAgIC8vIFRIUklGVC0zMTY0CisgIH0KK30KKworU1NMQ29udGV4dDo6flNTTENvbnRleHQoKSB7CisgIGlmIChjdHhfICE9IE5VTEwpIHsKKyAgICBTU0xfQ1RYX2ZyZWUoY3R4Xyk7CisgICAgY3R4XyA9IE5VTEw7CisgIH0KK30KKworU1NMKiBTU0xDb250ZXh0OjpjcmVhdGVTU0woKSB7CisgIFNTTCogc3NsID0gU1NMX25ldyhjdHhfKTsKKyAgaWYgKHNzbCA9PSBOVUxMKSB7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9uZXc6ICIgKyBlcnJvcnMpOworICB9CisgIHJldHVybiBzc2w7Cit9CisKKy8vIFRTU0xTb2NrZXQgaW1wbGVtZW50YXRpb24KK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCkKKyAgOiBUU29ja2V0KCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoKSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKKyAgaW50ZXJydXB0TGlzdGVuZXJfID0gaW50ZXJydXB0TGlzdGVuZXI7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpCisgIDogVFNvY2tldChzb2NrZXQpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworfQorCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCisgICAgICAgIDogVFNvY2tldChzb2NrZXQsIGludGVycnVwdExpc3RlbmVyKSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKK30KKworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdHJpbmcgaG9zdCwgaW50IHBvcnQpCisgIDogVFNvY2tldChob3N0LCBwb3J0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKK30KKworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgICAgICAgOiBUU29ja2V0KGhvc3QsIHBvcnQpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworICBpbnRlcnJ1cHRMaXN0ZW5lcl8gPSBpbnRlcnJ1cHRMaXN0ZW5lcjsKK30KKworVFNTTFNvY2tldDo6flRTU0xTb2NrZXQoKSB7CisgIGNsb3NlKCk7Cit9CisKK2Jvb2wgVFNTTFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiVFNTTFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQ6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CisgIC8vIGRhdGEgbWF5IGJlIGF2YWlsYWJsZSBpbiBTU0wgYnVmZmVycyAobm90ZTogU1NMX3BlbmRpbmcgZG9lcyBub3QgaGF2ZSBhIGZhaWx1cmUgbW9kZSkKKyAgcmV0dXJuIFNTTF9wZW5kaW5nKHNzbF8pID4gMCB8fCBUU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OmluaXQoKSB7CisgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSBmYWxzZTsKKyAgcmVhZFJldHJ5Q291bnRfID0gMDsKKyAgZXZlbnRTYWZlXyA9IGZhbHNlOworfQorCitib29sIFRTU0xTb2NrZXQ6OmlzT3BlbigpIHsKKyAgaWYgKHNzbF8gPT0gTlVMTCB8fCAhVFNvY2tldDo6aXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW50IHNodXRkb3duID0gU1NMX2dldF9zaHV0ZG93bihzc2xfKTsKKyAgLy8gIiEhIiBpcyBzcXVlbGNoaW5nIEM0ODAwICJmb3JjaW5nIGJvb2wgLT4gdHJ1ZSBvciBmYWxzZSIgcGVyZm9ybWFuY2Ugd2FybmluZworICBib29sIHNodXRkb3duUmVjZWl2ZWQgPSAhIShzaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTik7CisgIGJvb2wgc2h1dGRvd25TZW50ID0gISEoc2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTik7CisgIGlmIChzaHV0ZG93blJlY2VpdmVkICYmIHNodXRkb3duU2VudCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KK2Jvb2wgVFNTTFNvY2tldDo6cGVlaygpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcGVlazogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKKyAgaW50IHJjOworICB1aW50OF90IGJ5dGU7CisgIGRvIHsKKyAgICByYyA9IFNTTF9wZWVrKHNzbF8sICZieXRlLCAxKTsKKyAgICBpZiAocmMgPCAwKSB7CisKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpbnQgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiByZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgfQorICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3BlZWs6ICIgKyBlcnJvcnMpOworICAgIH0gZWxzZSBpZiAocmMgPT0gMCkgeworICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKHRydWUpOworICByZXR1cm4gKHJjID4gMCk7Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6b3BlbigpIHsKKyAgaWYgKGlzT3BlbigpIHx8IHNlcnZlcigpKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUyk7CisgIH0KKyAgVFNvY2tldDo6b3BlbigpOworfQorCisvKgorICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IGxpYmV2ZW50IHNhZmUuCisqLwordm9pZCBUU1NMU29ja2V0OjpjbG9zZSgpIHsKKyAgaWYgKHNzbF8gIT0gTlVMTCkgeworICAgIHRyeSB7CisgICAgICBpbnQgcmM7CisgICAgICBpbnQgZXJybm9fY29weSA9IDA7CisgICAgICBpbnQgZXJyb3IgPSAwOworCisgICAgICBkbyB7CisgICAgICAgIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOworICAgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAocmMgPT0gMik7CisKKyAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICAgIEdsb2JhbE91dHB1dCgoIlNTTF9zaHV0ZG93bjogIiArIGVycm9ycykuY19zdHIoKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKKyAgICAgIC8vIERvbid0IGVtaXQgYW4gZXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZQorICAgICAgLy8gZGVzdHJ1Y3Rvci4gVGhlcmUncyBhbHNvIG5vdCBtdWNoIHRoYXQgYSB1c2VyIGNhbiBkbyB0byByZWNvdmVyLCBzbworICAgICAgLy8ganVzdCBjbGVhbiB1cCBhcyBtdWNoIGFzIHBvc3NpYmxlIHdpdGhvdXQgdGhyb3dpbmcsIHNpbWlsYXIgdG8gdGhlIHJjCisgICAgICAvLyA8IDAgY2FzZSBhYm92ZS4KKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlNTTF9zaHV0ZG93bjogJXMiLCB0ZS53aGF0KCkpOworICAgIH0KKyAgICBTU0xfZnJlZShzc2xfKTsKKyAgICBzc2xfID0gTlVMTDsKKyAgICBoYW5kc2hha2VDb21wbGV0ZWRfID0gZmFsc2U7CisgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorICBUU29ja2V0OjpjbG9zZSgpOworfQorCisvKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbiBTU0wgU29ja2V0LgorICogSWYgZXZlbnRTYWZlIGlzIHNldCwgYW5kIGl0IG1heSByZXR1cm5zIDAgYnl0ZXMgdGhlbiByZWFkIG1ldGhvZAorICogbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluIHVudGlsIGl0IGlzIHN1Y2Nlc3NmdWxsIG9yIGl0IHRocm93cworICogZXhjZXB0aW9uIGluY2FzZSBvZiBmYWlsdXJlLgorKi8KK3VpbnQzMl90IFRTU0xTb2NrZXQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAicmV0cnkgYWdhaW4iKTsKKyAgaW50MzJfdCBieXRlcyA9IDA7CisgIHdoaWxlIChyZWFkUmV0cnlDb3VudF8gPCBtYXhSZWN2UmV0cmllc18pIHsKKyAgICBieXRlcyA9IFNTTF9yZWFkKHNzbF8sIGJ1ZiwgbGVuKTsKKyAgICBpbnQzMl90IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBpbnQzMl90IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgcmVhZFJldHJ5Q291bnRfKys7CisgICAgaWYgKGVycm9yID09IFNTTF9FUlJPUl9OT05FKSB7CisgICAgICByZWFkUmV0cnlDb3VudF8gPSAwOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHVuc2lnbmVkIGludCB3YWl0RXZlbnRSZXR1cm47CisgICAgYm9vbCBicmVha291dCA9IGZhbHNlOworICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLCAiY2xpZW50IGRpc2Nvbm5lY3RlZCIpOworCisgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICBpZiAoZXJybm9fY29weSA9PSAwICYmIEVSUl9wZWVrX2Vycm9yKCkgPT0gMCkgeworICAgICAgICAgIGJyZWFrb3V0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWRSZXRyeUNvdW50XyA+PSBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAvLyBmYWxsdGhyb3VnaAorCisgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgIGlmIChyZWFkUmV0cnlDb3VudF8gPCBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKKyAgICAgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgInJldHJ5IGFnYWluIik7CisgICAgICAgICAgfQorICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsICJ0b28gbXVjaCByZWN2IHJldHJpZXMiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHJlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgZWxzZSBpZiAoKHdhaXRFdmVudFJldHVybiA9IHdhaXRGb3JFdmVudChlcnJvciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSkpID09IFRTU0xfRUlOVFIgKSB7CisgICAgICAgICAgLy8gcmVwZWF0IG9wZXJhdGlvbgorICAgICAgICAgIGlmIChyZWFkUmV0cnlDb3VudF8gPCBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKKyAgICAgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAidG9vIG11Y2ggcmVjdiByZXRyaWVzIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAod2FpdEV2ZW50UmV0dXJuID09IFRTU0xfREFUQSkgeworICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBTU0wgYW5kIGh1Z2UgdGhyaWZ0IHBhY2tldHMsIHRoZXJlIG1heSBiZSBhIG51bWJlciBvZgorICAgICAgICAgICAgLy8gc29ja2V0IG9wZXJhdGlvbnMsIGJlZm9yZSBhbnkgZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSBieSBTU0xfcmVhZCgpLgorICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHRoZSBudW1iZXIgb2YgcmV0cmllcyBzaG91bGQgbm90IGJlIGluY3JlYXNlZCBhbmQKKyAgICAgICAgICAgIC8vIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHJlcGVhdGVkLgorICAgICAgICAgICAgcmVhZFJldHJ5Q291bnRfLS07CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAidW5rb3duIHdhaXRGb3JFdmVudCByZXR1cm4gdmFsdWUiKTsKKyAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICB9CisgICAgaWYgKGJyZWFrb3V0KSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcmVhZDogIiArIGVycm9ycyk7CisgIH0KKyAgcmV0dXJuIGJ5dGVzOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHJldHVybjsKKyAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgorICB1aW50MzJfdCB3cml0dGVuID0gMDsKKyAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2ggICAgICAgIAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlIGV2ZW50IGFnYWluCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF93cml0ZTogIiArIGVycm9ycyk7CisgICAgfQorICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgIH0KK30KKworLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW4gU1NMIFNvY2tldC4KKyAqIElmIGV2ZW50U2FmZSBpcyBzZXQsIGFuZCBpdCBtYXkgcmV0dXJucyAwIGJ5dGVzIHRoZW4gd3JpdGUgbWV0aG9kCisgKiBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdW50aWwgaXQgaXMgc3VjY2Vzc2Z1bGwgb3IgaXQgdGhyb3dzCisgKiBleGNlcHRpb24gaW5jYXNlIG9mIGZhaWx1cmUuCisqLwordWludDMyX3QgVFNTTFNvY2tldDo6d3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgorICB1aW50MzJfdCB3cml0dGVuID0gMDsKKyAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlIGV2ZW50IGFnYWluCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF93cml0ZTogIiArIGVycm9ycyk7CisgICAgfQorICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgIH0KKyAgcmV0dXJuIHdyaXR0ZW47Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6Zmx1c2goKSB7CisgIC8vIERvbid0IHRocm93IGV4Y2VwdGlvbiBpZiBub3Qgb3Blbi4gVGhyaWZ0IHNlcnZlcnMgY2xvc2Ugc29ja2V0IHR3aWNlLgorICBpZiAoc3NsXyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19mbHVzaDogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKKyAgQklPKiBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7CisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfd2JpbyByZXR1cm5zIE5VTEwiKTsKKyAgfQorICBpZiAoQklPX2ZsdXNoKGJpbykgIT0gMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19mbHVzaDogIiArIGVycm9ycyk7CisgIH0KK30KKwordm9pZCBUU1NMU29ja2V0Ojppbml0aWFsaXplSGFuZHNoYWtlUGFyYW1zKCkgeworICAvLyBzZXQgdW5kZXJseWluZyBzb2NrZXQgdG8gbm9uLWJsb2NraW5nCisgIGludCBmbGFnczsKKyAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCkpIDwgMAorICAgICAgfHwgVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSA8IDApIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IHNldCBUSFJJRlRfT19OT05CTE9DSyAoVEhSSUZUX0ZDTlRMKSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNvY2tldF8pOworICAgIHJldHVybjsKKyAgfQorICBzc2xfID0gY3R4Xy0+Y3JlYXRlU1NMKCk7CisKKyAgU1NMX3NldF9mZChzc2xfLCBzdGF0aWNfY2FzdDxpbnQ+KHNvY2tldF8pKTsKK30KKworYm9vbCBUU1NMU29ja2V0OjpjaGVja0hhbmRzaGFrZSgpIHsKKyAgcmV0dXJuIGhhbmRzaGFrZUNvbXBsZXRlZF87Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6aW5pdGlhbGl6ZUhhbmRzaGFrZSgpIHsKKyAgaWYgKCFUU29ja2V0Ojppc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICB9CisgIGlmIChjaGVja0hhbmRzaGFrZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNzbF8gPT0gTlVMTCkgeworICAgIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgfQorCisgIGludCByYzsKKyAgaW50IGVycm5vX2NvcHkgPSAwOworICBpbnQgZXJyb3IgPSAwOworICBpZiAoc2VydmVyKCkpIHsKKyAgICBkbyB7CisgICAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CisgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKHJjID09IDIpOworICB9IGVsc2UgeworICAgIC8vIE9wZW5TU0wgPCAwLjkuOGYgZG9lcyBub3QgaGF2ZSBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKQorICAgICNpZiBkZWZpbmVkKFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSkKKyAgICAgIC8vIHNldCB0aGUgU05JIGhvc3RuYW1lCisgICAgICBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoc3NsXywgZ2V0SG9zdCgpLmNfc3RyKCkpOworICAgICNlbmRpZgorICAgIGRvIHsKKyAgICAgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsXyk7CisgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKHJjID09IDIpOworICB9CisgIGlmIChyYyA8PSAwKSB7CisgICAgc3RyaW5nIGZuYW1lKHNlcnZlcigpID8gIlNTTF9hY2NlcHQiIDogIlNTTF9jb25uZWN0Iik7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKGZuYW1lICsgIjogIiArIGVycm9ycyk7CisgIH0KKyAgYXV0aG9yaXplKCk7CisgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSB0cnVlOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OmF1dGhvcml6ZSgpIHsKKyAgaW50IHJjID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNzbF8pOworICBpZiAocmMgIT0gWDUwOV9WX09LKSB7IC8vIHZlcmlmeSBhdXRoZW50aWNhdGlvbiByZXN1bHQKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKHN0cmluZygiU1NMX2dldF92ZXJpZnlfcmVzdWx0KCksICIpICsgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcocmMpKTsKKyAgfQorCisgIFg1MDkqIGNlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsXyk7CisgIGlmIChjZXJ0ID09IE5VTEwpIHsKKyAgICAvLyBjZXJ0aWZpY2F0ZSBpcyBub3QgcHJlc2VudAorICAgIGlmIChTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbF8pICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkgeworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiYXV0aG9yaXplOiByZXF1aXJlZCBjZXJ0aWZpY2F0ZSBub3QgcHJlc2VudCIpOworICAgIH0KKyAgICAvLyBjZXJ0aWZpY2F0ZSB3YXMgb3B0aW9uYWw6IGRpZG4ndCBpbnRlbmQgdG8gYXV0aG9yaXplIHJlbW90ZQorICAgIGlmIChzZXJ2ZXIoKSAmJiBhY2Nlc3NfICE9IE5VTEwpIHsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogY2VydGlmaWNhdGUgcmVxdWlyZWQgZm9yIGF1dGhvcml6YXRpb24iKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIC8vIGNlcnRpZmljYXRlIGlzIHByZXNlbnQKKyAgaWYgKGFjY2Vzc18gPT0gTlVMTCkgeworICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gYm90aCBjZXJ0aWZpY2F0ZSBhbmQgYWNjZXNzIG1hbmFnZXIgYXJlIHByZXNlbnQKKworICBzdHJpbmcgaG9zdDsKKyAgc29ja2FkZHJfc3RvcmFnZSBzYTsKKyAgc29ja2xlbl90IHNhTGVuZ3RoID0gc2l6ZW9mKHNhKTsKKworICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0XywgKHNvY2thZGRyKikmc2EsICZzYUxlbmd0aCkgIT0gMCkgeworICAgIHNhLnNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgfQorCisgIEFjY2Vzc01hbmFnZXI6OkRlY2lzaW9uIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KHNhKTsKKworICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6U0tJUCkgeworICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6QUxMT1cpIHsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogYWNjZXNzIGRlbmllZCBiYXNlZCBvbiByZW1vdGUgSVAiKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZXh0cmFjdCBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lCisgIFNUQUNLX09GKEdFTkVSQUxfTkFNRSkqIGFsdGVybmF0aXZlcworICAgICAgPSAoU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSopWDUwOV9nZXRfZXh0X2QyaShjZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgTlVMTCwgTlVMTCk7CisgIGlmIChhbHRlcm5hdGl2ZXMgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBjb3VudCA9IHNrX0dFTkVSQUxfTkFNRV9udW0oYWx0ZXJuYXRpdmVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgZGVjaXNpb24gPT0gQWNjZXNzTWFuYWdlcjo6U0tJUCAmJiBpIDwgY291bnQ7IGkrKykgeworICAgICAgY29uc3QgR0VORVJBTF9OQU1FKiBuYW1lID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGFsdGVybmF0aXZlcywgaSk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2hhciogZGF0YSA9IChjaGFyKilBU04xX1NUUklOR19kYXRhKG5hbWUtPmQuaWE1KTsKKyAgICAgIGludCBsZW5ndGggPSBBU04xX1NUUklOR19sZW5ndGgobmFtZS0+ZC5pYTUpOworICAgICAgc3dpdGNoIChuYW1lLT50eXBlKSB7CisgICAgICBjYXNlIEdFTl9ETlM6CisgICAgICAgIGlmIChob3N0LmVtcHR5KCkpIHsKKyAgICAgICAgICBob3N0ID0gKHNlcnZlcigpID8gZ2V0UGVlckhvc3QoKSA6IGdldEhvc3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVjaXNpb24gPSBhY2Nlc3NfLT52ZXJpZnkoaG9zdCwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdFTl9JUEFERDoKKyAgICAgICAgZGVjaXNpb24gPSBhY2Nlc3NfLT52ZXJpZnkoc2EsIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoYWx0ZXJuYXRpdmVzLCBHRU5FUkFMX05BTUVfZnJlZSk7CisgIH0KKworICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6U0tJUCkgeworICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICBpZiAoZGVjaXNpb24gIT0gQWNjZXNzTWFuYWdlcjo6QUxMT1cpIHsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogYWNjZXNzIGRlbmllZCIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBleHRyYWN0IGNvbW1vbk5hbWUKKyAgWDUwOV9OQU1FKiBuYW1lID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpOworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgWDUwOV9OQU1FX0VOVFJZKiBlbnRyeTsKKyAgICB1bnNpZ25lZCBjaGFyKiB1dGY4OworICAgIGludCBsYXN0ID0gLTE7CisgICAgd2hpbGUgKGRlY2lzaW9uID09IEFjY2Vzc01hbmFnZXI6OlNLSVApIHsKKyAgICAgIGxhc3QgPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgbGFzdCk7CisgICAgICBpZiAobGFzdCA9PSAtMSkKKyAgICAgICAgYnJlYWs7CisgICAgICBlbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSwgbGFzdCk7CisgICAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgY29udGludWU7CisgICAgICBBU04xX1NUUklORyogY29tbW9uID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGVudHJ5KTsKKyAgICAgIGludCBzaXplID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmdXRmOCwgY29tbW9uKTsKKyAgICAgIGlmIChob3N0LmVtcHR5KCkpIHsKKyAgICAgICAgaG9zdCA9IChzZXJ2ZXIoKSA/IGdldFBlZXJIb3N0KCkgOiBnZXRIb3N0KCkpOworICAgICAgfQorICAgICAgZGVjaXNpb24gPSBhY2Nlc3NfLT52ZXJpZnkoaG9zdCwgKGNoYXIqKXV0ZjgsIHNpemUpOworICAgICAgT1BFTlNTTF9mcmVlKHV0ZjgpOworICAgIH0KKyAgfQorICBYNTA5X2ZyZWUoY2VydCk7CisgIGlmIChkZWNpc2lvbiAhPSBBY2Nlc3NNYW5hZ2VyOjpBTExPVykgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oImF1dGhvcml6ZTogY2Fubm90IGF1dGhvcml6ZSBwZWVyIik7CisgIH0KK30KKworLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KK3Vuc2lnbmVkIGludCBUU1NMU29ja2V0Ojp3YWl0Rm9yRXZlbnQoYm9vbCB3YW50UmVhZCkgeworICBpbnQgZmRTb2NrZXQ7CisgIEJJTyogYmlvOworCisgIGlmICh3YW50UmVhZCkgeworICAgIGJpbyA9IFNTTF9nZXRfcmJpbyhzc2xfKTsKKyAgfSBlbHNlIHsKKyAgICBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7CisgIH0KKworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0Xz9iaW8gcmV0dXJuZWQgTlVMTCIpOworICB9CisKKyAgaWYgKEJJT19nZXRfZmQoYmlvLCAmZmRTb2NrZXQpIDw9IDApIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJCSU9fZ2V0X2ZkIGZhaWxlZCIpOworICB9CisKKyAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworICBtZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CisgIGZkc1swXS5mZCA9IGZkU29ja2V0OworICAvLyB1c2UgUE9MTElOIGFsc28gb24gd3JpdGUgb3BlcmF0aW9ucyB0b28sIHRoaXMgaXMgbmVlZGVkIGZvciBvcGVyYXRpb25zCisgIC8vIHdoaWNoIHJlcXVpcmVzIHJlYWQgYW5kIHdyaXRlIG9uIHRoZSBzb2NrZXQuCisgIGZkc1swXS5ldmVudHMgPSB3YW50UmVhZCA/IFRIUklGVF9QT0xMSU4gOiBUSFJJRlRfUE9MTElOIHwgVEhSSUZUX1BPTExPVVQ7CisKKyAgaWYgKGludGVycnVwdExpc3RlbmVyXykgeworICAgIGZkc1sxXS5mZCA9ICooaW50ZXJydXB0TGlzdGVuZXJfLmdldCgpKTsKKyAgICBmZHNbMV0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgfQorCisgIGludCB0aW1lb3V0ID0gLTE7CisgIGlmICh3YW50UmVhZCAmJiByZWN2VGltZW91dF8pIHsKKyAgICB0aW1lb3V0ID0gcmVjdlRpbWVvdXRfOworICB9CisgIGlmICghd2FudFJlYWQgJiYgc2VuZFRpbWVvdXRfKSB7CisgICAgdGltZW91dCA9IHNlbmRUaW1lb3V0XzsKKyAgfQorCisgIGludCByZXQgPSBUSFJJRlRfUE9MTChmZHMsIGludGVycnVwdExpc3RlbmVyXyA/IDIgOiAxLCB0aW1lb3V0KTsKKworICBpZiAocmV0IDwgMCkgeworICAgIC8vIGVycm9yIGNhc2VzCisgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SID09IFRIUklGVF9FSU5UUikgeworICAgICAgcmV0dXJuIFRTU0xfRUlOVFI7IC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICB9CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU1NMU29ja2V0OjpyZWFkIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICB9IGVsc2UgaWYgKHJldCA+IDApeworICAgIGlmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsICJJbnRlcnJ1cHRlZCIpOworICAgIH0KKyAgICByZXR1cm4gVFNTTF9EQVRBOworICB9IGVsc2UgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX1BPTEwgKHRpbWVkIG91dCkiKTsKKyAgfQorfQorCisvLyBUU1NMU29ja2V0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbgordWludDY0X3QgVFNTTFNvY2tldEZhY3Rvcnk6OmNvdW50XyA9IDA7CitNdXRleCBUU1NMU29ja2V0RmFjdG9yeTo6bXV0ZXhfOworYm9vbCBUU1NMU29ja2V0RmFjdG9yeTo6bWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyA9IGZhbHNlOworCitUU1NMU29ja2V0RmFjdG9yeTo6VFNTTFNvY2tldEZhY3RvcnkoU1NMUHJvdG9jb2wgcHJvdG9jb2wpIDogc2VydmVyXyhmYWxzZSkgeworICBHdWFyZCBndWFyZChtdXRleF8pOworICBpZiAoY291bnRfID09IDApIHsKKyAgICBpZiAoIW1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8pIHsKKyAgICAgIGluaXRpYWxpemVPcGVuU1NMKCk7CisgICAgfQorICAgIHJhbmRvbWl6ZSgpOworICB9CisgIGNvdW50XysrOworICBjdHhfID0gc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+KG5ldyBTU0xDb250ZXh0KHByb3RvY29sKSk7Cit9CisKK1RTU0xTb2NrZXRGYWN0b3J5Ojp+VFNTTFNvY2tldEZhY3RvcnkoKSB7CisgIEd1YXJkIGd1YXJkKG11dGV4Xyk7CisgIGN0eF8ucmVzZXQoKTsKKyAgY291bnRfLS07CisgIGlmIChjb3VudF8gPT0gMCAmJiAhbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXykgeworICAgIGNsZWFudXBPcGVuU1NMKCk7CisgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XykpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCkpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4Xywgc29ja2V0LCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaG9zdCwgcG9ydCkpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBob3N0LCBwb3J0LCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworICBzZXR1cChzc2wpOworICByZXR1cm4gc3NsOworfQorCisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OnNldHVwKHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpIHsKKyAgc3NsLT5zZXJ2ZXIoc2VydmVyKCkpOworICBpZiAoYWNjZXNzXyA9PSBOVUxMICYmICFzZXJ2ZXIoKSkgeworICAgIGFjY2Vzc18gPSBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4obmV3IERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyKTsKKyAgfQorICBpZiAoYWNjZXNzXyAhPSBOVUxMKSB7CisgICAgc3NsLT5hY2Nlc3MoYWNjZXNzXyk7CisgIH0KK30KKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6Y2lwaGVycyhjb25zdCBzdHJpbmcmIGVuYWJsZSkgeworICBpbnQgcmMgPSBTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjdHhfLT5nZXQoKSwgZW5hYmxlLmNfc3RyKCkpOworICBpZiAoRVJSX3BlZWtfZXJyb3IoKSAhPSAwKSB7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfc2V0X2NpcGhlcl9saXN0OiAiICsgZXJyb3JzKTsKKyAgfQorICBpZiAocmMgPT0gMCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIk5vbmUgb2Ygc3BlY2lmaWVkIGNpcGhlcnMgYXJlIHN1cHBvcnRlZCIpOworICB9Cit9CisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmF1dGhlbnRpY2F0ZShib29sIHJlcXVpcmVkKSB7CisgIGludCBtb2RlOworICBpZiAocmVxdWlyZWQpIHsKKyAgICBtb2RlID0gU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IFNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisgIH0gZWxzZSB7CisgICAgbW9kZSA9IFNTTF9WRVJJRllfTk9ORTsKKyAgfQorICBTU0xfQ1RYX3NldF92ZXJpZnkoY3R4Xy0+Z2V0KCksIG1vZGUsIE5VTEwpOworfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkQ2VydGlmaWNhdGUoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogZm9ybWF0KSB7CisgIGlmIChwYXRoID09IE5VTEwgfHwgZm9ybWF0ID09IE5VTEwpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRDZXJ0aWZpY2F0ZUNoYWluOiBlaXRoZXIgPHBhdGg+IG9yIDxmb3JtYXQ+IGlzIE5VTEwiKTsKKyAgfQorICBpZiAoc3RyY21wKGZvcm1hdCwgIlBFTSIpID09IDApIHsKKyAgICBpZiAoU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShjdHhfLT5nZXQoKSwgcGF0aCkgPT0gMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZTogIiArIGVycm9ycyk7CisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGNlcnRpZmljYXRlIGZvcm1hdDogIiArIHN0cmluZyhmb3JtYXQpKTsKKyAgfQorfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkUHJpdmF0ZUtleShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQpIHsKKyAgaWYgKHBhdGggPT0gTlVMTCB8fCBmb3JtYXQgPT0gTlVMTCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZFByaXZhdGVLZXk6IGVpdGhlciA8cGF0aD4gb3IgPGZvcm1hdD4gaXMgTlVMTCIpOworICB9CisgIGlmIChzdHJjbXAoZm9ybWF0LCAiUEVNIikgPT0gMCkgeworICAgIGlmIChTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY3R4Xy0+Z2V0KCksIHBhdGgsIFNTTF9GSUxFVFlQRV9QRU0pID09IDApIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZTogIiArIGVycm9ycyk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGNhcGF0aCkgeworICBpZiAocGF0aCA9PSBOVUxMKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkVHJ1c3RlZENlcnRpZmljYXRlczogPHBhdGg+IGlzIE5VTEwiKTsKKyAgfQorICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4Xy0+Z2V0KCksIHBhdGgsIGNhcGF0aCkgPT0gMCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgc3RyaW5nIGVycm9yczsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zOiAiICsgZXJyb3JzKTsKKyAgfQorfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpyYW5kb21pemUoKSB7CisgIFJBTkRfcG9sbCgpOworfQorCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpvdmVycmlkZURlZmF1bHRQYXNzd29yZENhbGxiYWNrKCkgeworICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihjdHhfLT5nZXQoKSwgcGFzc3dvcmRDYWxsYmFjayk7CisgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKGN0eF8tPmdldCgpLCB0aGlzKTsKK30KKworaW50IFRTU0xTb2NrZXRGYWN0b3J5OjpwYXNzd29yZENhbGxiYWNrKGNoYXIqIHBhc3N3b3JkLCBpbnQgc2l6ZSwgaW50LCB2b2lkKiBkYXRhKSB7CisgIFRTU0xTb2NrZXRGYWN0b3J5KiBmYWN0b3J5ID0gKFRTU0xTb2NrZXRGYWN0b3J5KilkYXRhOworICBzdHJpbmcgdXNlclBhc3N3b3JkOworICBmYWN0b3J5LT5nZXRQYXNzd29yZCh1c2VyUGFzc3dvcmQsIHNpemUpOworICBpbnQgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50Pih1c2VyUGFzc3dvcmQuc2l6ZSgpKTsKKyAgaWYgKGxlbmd0aCA+IHNpemUpIHsKKyAgICBsZW5ndGggPSBzaXplOworICB9CisgIHN0cm5jcHkocGFzc3dvcmQsIHVzZXJQYXNzd29yZC5jX3N0cigpLCBsZW5ndGgpOworICB1c2VyUGFzc3dvcmQuYXNzaWduKHVzZXJQYXNzd29yZC5zaXplKCksICcqJyk7CisgIHJldHVybiBsZW5ndGg7Cit9CisKKy8vIGV4dHJhY3QgZXJyb3IgbWVzc2FnZXMgZnJvbSBlcnJvciBxdWV1ZQordm9pZCBidWlsZEVycm9ycyhzdHJpbmcmIGVycm9ycywgaW50IGVycm5vX2NvcHksIGludCBzc2xlcnJubykgeworICB1bnNpZ25lZCBsb25nIGVycm9yQ29kZTsKKyAgY2hhciBtZXNzYWdlWzI1Nl07CisKKyAgZXJyb3JzLnJlc2VydmUoNTEyKTsKKyAgd2hpbGUgKChlcnJvckNvZGUgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKKyAgICBpZiAoIWVycm9ycy5lbXB0eSgpKSB7CisgICAgICBlcnJvcnMgKz0gIjsgIjsKKyAgICB9CisgICAgY29uc3QgY2hhciogcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyb3JDb2RlKTsKKyAgICBpZiAocmVhc29uID09IE5VTEwpIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihtZXNzYWdlLCBzaXplb2YobWVzc2FnZSkgLSAxLCAiU1NMIGVycm9yICMgJWx1IiwgZXJyb3JDb2RlKTsKKyAgICAgIHJlYXNvbiA9IG1lc3NhZ2U7CisgICAgfQorICAgIGVycm9ycyArPSByZWFzb247CisgIH0KKyAgaWYgKGVycm9ycy5lbXB0eSgpKSB7CisgICAgaWYgKGVycm5vX2NvcHkgIT0gMCkgeworICAgICAgZXJyb3JzICs9IFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSk7CisgICAgfQorICB9CisgIGlmIChlcnJvcnMuZW1wdHkoKSkgeworICAgIGVycm9ycyA9ICJlcnJvciBjb2RlOiAiICsgdG9fc3RyaW5nKGVycm5vX2NvcHkpOworICB9CisgIGlmIChzc2xlcnJubykgeworICAgIGVycm9ycyArPSAiIChTU0xfZXJyb3JfY29kZSA9ICIgKyB0b19zdHJpbmcoc3NsZXJybm8pICsgIikiOworICAgIGlmIChzc2xlcnJubyA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworICAgICAgY2hhciBidWZbNDA5Nl07CisgICAgICBpbnQgZXJyOworICAgICAgd2hpbGUgKChlcnIgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKKyAgICAgICAgZXJyb3JzICs9ICIgIjsKKyAgICAgICAgZXJyb3JzICs9IEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBidWYpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQWNjZXNzTWFuYWdlcgorICovCitEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSBub2V4Y2VwdCB7CisgICh2b2lkKXNhOworICByZXR1cm4gU0tJUDsKK30KKworRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzdHJpbmcmIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSBub2V4Y2VwdCB7CisgIGlmIChob3N0LmVtcHR5KCkgfHwgbmFtZSA9PSBOVUxMIHx8IHNpemUgPD0gMCkgeworICAgIHJldHVybiBTS0lQOworICB9CisgIHJldHVybiAobWF0Y2hOYW1lKGhvc3QuY19zdHIoKSwgbmFtZSwgc2l6ZSkgPyBBTExPVyA6IFNLSVApOworfQorCitEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgbm9leGNlcHQgeworICBib29sIG1hdGNoID0gZmFsc2U7CisgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVCAmJiBzaXplID09IHNpemVvZihpbl9hZGRyKSkgeworICAgIG1hdGNoID0gKG1lbWNtcCgmKChzb2NrYWRkcl9pbiopJnNhKS0+c2luX2FkZHIsIGRhdGEsIHNpemUpID09IDApOworICB9IGVsc2UgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBzaXplID09IHNpemVvZihpbjZfYWRkcikpIHsKKyAgICBtYXRjaCA9IChtZW1jbXAoJigoc29ja2FkZHJfaW42Kikmc2EpLT5zaW42X2FkZHIsIGRhdGEsIHNpemUpID09IDApOworICB9CisgIHJldHVybiAobWF0Y2ggPyBBTExPVyA6IFNLSVApOworfQorCisvKioKKyAqIE1hdGNoIGEgbmFtZSB3aXRoIGEgcGF0dGVybi4gVGhlIHBhdHRlcm4gbWF5IGluY2x1ZGUgd2lsZGNhcmQuIEEgc2luZ2xlCisgKiB3aWxkY2FyZCAiKiIgY2FuIG1hdGNoIHVwIHRvIG9uZSBjb21wb25lbnQgaW4gdGhlIGRvbWFpbiBuYW1lLgorICoKKyAqIEBwYXJhbSAgaG9zdCAgICBIb3N0IG5hbWUsIHR5cGljYWxseSB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QKKyAqIEBwYXJhbSAgcGF0dGVybiBOYW1lIHJldHJpZXZlZCBmcm9tIGNlcnRpZmljYXRlCisgKiBAcGFyYW0gIHNpemUgICAgU2l6ZSBvZiAicGF0dGVybiIKKyAqIEByZXR1cm4gVHJ1ZSwgaWYgImhvc3QiIG1hdGNoZXMgInBhdHRlcm4iLiBGYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgbWF0Y2hOYW1lKGNvbnN0IGNoYXIqIGhvc3QsIGNvbnN0IGNoYXIqIHBhdHRlcm4sIGludCBzaXplKSB7CisgIGJvb2wgbWF0Y2ggPSBmYWxzZTsKKyAgaW50IGkgPSAwLCBqID0gMDsKKyAgd2hpbGUgKGkgPCBzaXplICYmIGhvc3Rbal0gIT0gJ1wwJykgeworICAgIGlmICh1cHBlcmNhc2UocGF0dGVybltpXSkgPT0gdXBwZXJjYXNlKGhvc3Rbal0pKSB7CisgICAgICBpKys7CisgICAgICBqKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHBhdHRlcm5baV0gPT0gJyonKSB7CisgICAgICB3aGlsZSAoaG9zdFtqXSAhPSAnLicgJiYgaG9zdFtqXSAhPSAnXDAnKSB7CisgICAgICAgIGorKzsKKyAgICAgIH0KKyAgICAgIGkrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBpZiAoaSA9PSBzaXplICYmIGhvc3Rbal0gPT0gJ1wwJykgeworICAgIG1hdGNoID0gdHJ1ZTsKKyAgfQorICByZXR1cm4gbWF0Y2g7Cit9CisKKy8vIFRoaXMgaXMgdG8gd29yayBhcm91bmQgdGhlIFR1cmtpc2ggbG9jYWxlIGlzc3VlLCBpLmUuLAorLy8gdG91cHBlcignaScpICE9IHRvdXBwZXIoJ0knKSBpZiBsb2NhbGUgaXMgInRyX1RSIgorY2hhciB1cHBlcmNhc2UoY2hhciBjKSB7CisgIGlmICgnYScgPD0gYyAmJiBjIDw9ICd6JykgeworICAgIHJldHVybiBjICsgKCdBJyAtICdhJyk7CisgIH0KKyAgcmV0dXJuIGM7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODdkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaApAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTT0NLRVRfSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNPQ0tFVF9IXyAxCisKKy8vIFB1dCB0aGlzIGZpcnN0IHRvIGF2b2lkIFdJTjMyIGJ1aWxkIGZhaWx1cmUKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIEFjY2Vzc01hbmFnZXI7CitjbGFzcyBTU0xDb250ZXh0OworCitlbnVtIFNTTFByb3RvY29sIHsKKyAgU1NMVExTICA9IDAsICAvLyBTdXBwb3J0cyBTU0x2MiBhbmQgU1NMdjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZXMgYXQgVExTdjFfMCBvciBsYXRlci4KKy8vU1NMdjIgICA9IDEsICAvLyBIT1JSSUJMWSBJTlNFQ1VSRSEKKyAgU1NMdjMgICA9IDIsICAvLyBTdXBwb3J0cyBTU0x2MyBvbmx5IC0gYWxzbyBob3JyaWJseSBpbnNlY3VyZSEKKyAgVExTdjFfMCA9IDMsICAvLyBTdXBwb3J0cyBUTFN2MV8wIG9yIGxhdGVyLgorICBUTFN2MV8xID0gNCwgIC8vIFN1cHBvcnRzIFRMU3YxXzEgb3IgbGF0ZXIuCisgIFRMU3YxXzIgPSA1LCAgLy8gU3VwcG9ydHMgVExTdjFfMiBvciBsYXRlci4KKyAgTEFURVNUICA9IFRMU3YxXzIKK307CisKKyNkZWZpbmUgVFNTTF9FSU5UUiAwCisjZGVmaW5lIFRTU0xfREFUQSAxCisKKy8qKgorICogSW5pdGlhbGl6ZSBPcGVuU1NMIGxpYnJhcnkuICBUaGlzIGZ1bmN0aW9uLCBvciBzb21lIG90aGVyCisgKiBlcXVpdmFsZW50IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgT3BlblNTTCwgbXVzdCBiZSBjYWxsZWQgYmVmb3JlCisgKiBUU1NMU29ja2V0IGlzIHVzZWQuICBJZiB5b3Ugc2V0IFRTU0xTb2NrZXRGYWN0b3J5IHRvIHVzZSBtYW51YWwKKyAqIE9wZW5TU0wgaW5pdGlhbGl6YXRpb24sIHlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIG9yIG90aGVyd2lzZQorICogZW5zdXJlIE9wZW5TU0wgaXMgaW5pdGlhbGl6ZWQgeW91cnNlbGYuCisgKi8KK3ZvaWQgaW5pdGlhbGl6ZU9wZW5TU0woKTsKKy8qKgorICogQ2xlYW51cCBPcGVuU1NMIGxpYnJhcnkuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgdG8gY2xlYW4KKyAqIHVwIE9wZW5TU0wgYWZ0ZXIgdXNlIG9mIE9wZW5TU0wgZnVuY3Rpb25hbGl0eSBpcyBmaW5pc2hlZC4gIElmIHlvdQorICogc2V0IFRTU0xTb2NrZXRGYWN0b3J5IHRvIHVzZSBtYW51YWwgT3BlblNTTCBpbml0aWFsaXphdGlvbiwgeW91CisgKiBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHlvdXJzZWxmIG9yIGVuc3VyZSB0aGF0IHdoYXRldmVyCisgKiBpbml0aWFsaXplZCBPcGVuU1NMIGNsZWFucyBpdCB1cCB0b28uCisgKi8KK3ZvaWQgY2xlYW51cE9wZW5TU0woKTsKKworLyoqCisgKiBPcGVuU1NMIGltcGxlbWVudGF0aW9uIGZvciBTU0wgc29ja2V0IGludGVyZmFjZS4KKyAqLworY2xhc3MgVFNTTFNvY2tldCA6IHB1YmxpYyBUU29ja2V0IHsKK3B1YmxpYzoKKyAgflRTU0xTb2NrZXQoKTsKKyAgLyoqCisgICAqIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgKi8KKyAgYm9vbCBpc09wZW4oKTsKKyAgYm9vbCBwZWVrKCk7CisgIHZvaWQgb3BlbigpOworICB2b2lkIGNsb3NlKCk7CisgIGJvb2wgaGFzUGVuZGluZ0RhdGFUb1JlYWQoKTsKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdm9pZCBmbHVzaCgpOworICAvKioKKyAgKiBTZXQgd2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCisgICoKKyAgKiBAcGFyYW0gZmxhZyAgVXNlIHNlcnZlciBzaWRlIGhhbmRzaGFrZSBwcm90b2NvbCBpZiB0cnVlLgorICAqLworICB2b2lkIHNlcnZlcihib29sIGZsYWcpIHsgc2VydmVyXyA9IGZsYWc7IH0KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBTU0wgc29ja2V0IGlzIHNlcnZlciBvciBjbGllbnQgbW9kZS4KKyAgICovCisgIGJvb2wgc2VydmVyKCkgY29uc3QgeyByZXR1cm4gc2VydmVyXzsgfQorICAvKioKKyAgICogU2V0IEFjY2Vzc01hbmFnZXIuCisgICAqCisgICAqIEBwYXJhbSBtYW5hZ2VyICBJbnN0YW5jZSBvZiBBY2Nlc3NNYW5hZ2VyCisgICAqLworICB2aXJ0dWFsIHZvaWQgYWNjZXNzKHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CisgIC8qKgorICAgKiBTZXQgZXZlbnRTYWZlIGZsYWcgaWYgbGliZXZlbnQgaXMgdXNlZC4KKyAgICovCisgIHZvaWQgc2V0TGliZXZlbnRTYWZlKCkgeyBldmVudFNhZmVfID0gdHJ1ZTsgfQorICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIFNTTCBTb2NrZXQgaXMgbGliZXZlbnQgc2FmZSBvciBub3QuCisgICAqLworICBib29sIGlzTGliZXZlbnRTYWZlKCkgY29uc3QgeyByZXR1cm4gZXZlbnRTYWZlXzsgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCk7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB3aXRoIGFuIGludGVycnVwdCBzaWduYWwuCisgICAqLworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgZ2l2ZW4gYW4gZXhpc3Rpbmcgc29ja2V0LgorICAgKgorICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldAorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgZ2l2ZW4gYW4gZXhpc3Rpbmcgc29ja2V0IHRoYXQgY2FuIGJlIGludGVycnVwdGVkLgorICAgKgorICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldAorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IG5hbWUKKyAgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IG51bWJlcgorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCk7CisgICAgLyoqCisgICogQ29uc3RydWN0b3Igd2l0aCBhbiBpbnRlcnJ1cHQgc2lnbmFsLgorICAqCisgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IG5hbWUKKyAgKiBAcGFyYW0gcG9ydCAgUmVtb3RlIHBvcnQgbnVtYmVyCisgICovCisgICAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgLyoqCisgICAqIEF1dGhvcml6ZSBwZWVyIGFjY2VzcyBhZnRlciBTU0wgaGFuZHNoYWtlIGNvbXBsZXRlcy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBhdXRob3JpemUoKTsKKyAgLyoqCisgICAqIEluaXRpYXRlIFNTTCBoYW5kc2hha2UgaWYgbm90IGFscmVhZHkgaW5pdGlhdGVkLgorICAgKi8KKyAgdm9pZCBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIC8qKgorICAgKiBJbml0aWF0ZSBTU0wgaGFuZHNoYWtlIHBhcmFtcy4KKyAgICovCisgIHZvaWQgaW5pdGlhbGl6ZUhhbmRzaGFrZVBhcmFtcygpOworICAvKioKKyAgICogQ2hlY2sgaWYgIFNTTCBoYW5kc2hha2UgaXMgY29tcGxldGVkIG9yIG5vdC4KKyAgICovCisgIGJvb2wgY2hlY2tIYW5kc2hha2UoKTsKKyAgLyoqCisgICAqIFdhaXRzIGZvciBhbiBzb2NrZXQgb3Igc2h1dGRvd24gZXZlbnQuCisgICAqCisgICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCBpZiBpbnRlcnJ1cHRlZCBpcyBzaWduYWxlZC4KKyAgICoKKyAgICogQHJldHVybiBUU1NMX0VJTlRSIGlmIEVJTlRSIGhhcHBlbmVkIG9uIHRoZSB1bmRlcmx5aW5nIHNvY2tldAorICAgKiAgICAgICAgIFRTU0xfREFUQSAgaWYgZGF0YSBpcyBhdmFpbGFibGUgb24gdGhlIHNvY2tldC4KKyAgICovCisgIHVuc2lnbmVkIGludCB3YWl0Rm9yRXZlbnQoYm9vbCB3YW50UmVhZCk7CisKKyAgYm9vbCBzZXJ2ZXJfOworICBTU0wqIHNzbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOworICBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKKyAgZnJpZW5kIGNsYXNzIFRTU0xTb2NrZXRGYWN0b3J5OworCitwcml2YXRlOgorICBib29sIGhhbmRzaGFrZUNvbXBsZXRlZF87CisgIGludCByZWFkUmV0cnlDb3VudF87CisgIGJvb2wgZXZlbnRTYWZlXzsKKworICB2b2lkIGluaXQoKTsKK307CisKKy8qKgorICogU1NMIHNvY2tldCBmYWN0b3J5LiBTU0wgc29ja2V0cyBzaG91bGQgYmUgY3JlYXRlZCB2aWEgU1NMIGZhY3RvcnkuCisgKiBUaGUgZmFjdG9yeSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZSBhbmQgY2xlYW51cCBvcGVuc3NsIGFzIGxvbmcgYXMKKyAqIHRoZXJlIGlzIGEgVFNTTFNvY2tldEZhY3RvcnkgaW5zdGFudGlhdGVkLCBhbmQgYXMgbG9uZyBhcyB0aGUgc3RhdGljCisgKiBib29sZWFuIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gaXMgc2V0IHRvIGZhbHNlLCB0aGUgZGVmYXVsdC4KKyAqCisgKiBJZiB5b3Ugd291bGQgbGlrZSB0byBpbml0aWFsaXplIGFuZCBjbGVhbnVwIG9wZW5zc2wgeW91cnNlbGYsIHNldAorICogbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyB0byB0cnVlIGFuZCBUU1NMU29ja2V0RmFjdG9yeSB3aWxsIG5vCisgKiBsb25nZXIgYmUgcmVzcG9uc2libGUgZm9yIG9wZW5zc2wgaW5pdGlhbGl6YXRpb24gYW5kIHRlYXJkb3duLgorICoKKyAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY29kZSB1c2luZyBUU1NMU29ja2V0RmFjdG9yeSB0bworICogZW5zdXJlIHRoYXQgdGhlIGZhY3RvcnkgbGlmZXRpbWUgZXhjZWVkcyB0aGUgbGlmZXRpbWUgb2YgYW55IHNvY2tldHMKKyAqIGl0IG1pZ2h0IGNyZWF0ZS4gIElmIHRoaXMgaXMgbm90IGd1YXJhbnRlZWQsIGEgc29ja2V0IG1heSBjYWxsIGludG8KKyAqIG9wZW5zc2wgYWZ0ZXIgdGhlIHNvY2tldCBmYWN0b3J5IGhhcyBjbGVhbmVkIHVwIG9wZW5zc2whICBUaGlzCisgKiBndWFyYW50ZWUgaXMgdW5uZWNlc3NhcnkgaWYgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyBpcyB0cnVlLAorICogaG93ZXZlciwgc2luY2UgaXQgd291bGQgYmUgdXAgdG8gdGhlIGNvbnN1bWluZyBhcHBsaWNhdGlvbiBpbnN0ZWFkLgorICovCitjbGFzcyBUU1NMU29ja2V0RmFjdG9yeSB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci9EZXN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgU1NML1RMUyBwcm90b2NvbCB0byB1c2UuCisgICAqLworICBUU1NMU29ja2V0RmFjdG9yeShTU0xQcm90b2NvbCBwcm90b2NvbCA9IFNTTFRMUyk7CisgIHZpcnR1YWwgflRTU0xTb2NrZXRGYWN0b3J5KCk7CisgIC8qKgorICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIGEgZnJlc2ggbmV3IHNvY2tldC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldCgpOworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCBhIGZyZXNoIG5ldyBzb2NrZXQsIHdoaWNoIGlzIGludGVycnVwdGFibGUuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgLyoqCisgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggdGhlIGdpdmVuIHNvY2tldC4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCB0aGUgZ2l2ZW4gc29ja2V0IHdoaWNoIGlzIGludGVycnVwdGFibGUuCisgICAqCisgICAqIEBwYXJhbSBzb2NrZXQgQW4gZXhpc3Rpbmcgc29ja2V0LgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworICAvKioKKyAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldC4KKyAgKgorICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKiBAcGFyYW0gcG9ydCAgUmVtb3RlIHBvcnQgdG8gYmUgY29ubmVjdGVkIHRvCisgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOworICAvKioKKyAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldC4KKyAgKgorICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKiBAcGFyYW0gcG9ydCAgUmVtb3RlIHBvcnQgdG8gYmUgY29ubmVjdGVkIHRvCisgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIC8qKgorICAgKiBTZXQgY2lwaGVycyB0byBiZSB1c2VkIGluIFNTTCBoYW5kc2hha2UgcHJvY2Vzcy4KKyAgICoKKyAgICogQHBhcmFtIGNpcGhlcnMgIEEgbGlzdCBvZiBjaXBoZXJzCisgICAqLworICB2aXJ0dWFsIHZvaWQgY2lwaGVycyhjb25zdCBzdGQ6OnN0cmluZyYgZW5hYmxlKTsKKyAgLyoqCisgICAqIEVuYWJsZS9EaXNhYmxlIGF1dGhlbnRpY2F0aW9uLgorICAgKgorICAgKiBAcGFyYW0gcmVxdWlyZWQgUmVxdWlyZSBwZWVyIHRvIHByZXNlbnQgdmFsaWQgY2VydGlmaWNhdGUgaWYgdHJ1ZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIGF1dGhlbnRpY2F0ZShib29sIHJlcXVpcmVkKTsKKyAgLyoqCisgICAqIExvYWQgc2VydmVyIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBAcGFyYW0gcGF0aCAgIFBhdGggdG8gdGhlIGNlcnRpZmljYXRlIGZpbGUKKyAgICogQHBhcmFtIGZvcm1hdCBDZXJ0aWZpY2F0ZSBmaWxlIGZvcm1hdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxvYWRDZXJ0aWZpY2F0ZShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQgPSAiUEVNIik7CisgIC8qKgorICAgKiBMb2FkIHByaXZhdGUga2V5LgorICAgKgorICAgKiBAcGFyYW0gcGF0aCAgIFBhdGggdG8gdGhlIHByaXZhdGUga2V5IGZpbGUKKyAgICogQHBhcmFtIGZvcm1hdCBQcml2YXRlIGtleSBmaWxlIGZvcm1hdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxvYWRQcml2YXRlS2V5KGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGZvcm1hdCA9ICJQRU0iKTsKKyAgLyoqCisgICAqIExvYWQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgZnJvbSBzcGVjaWZpZWQgZmlsZS4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0cnVzdGVkIGNlcnRpZmljYXRlIGZpbGUKKyAgICovCisgIHZpcnR1YWwgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGggPSBOVUxMKTsKKyAgLyoqCisgICAqIERlZmF1bHQgcmFuZG9taXplIG1ldGhvZC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCByYW5kb21pemUoKTsKKyAgLyoqCisgICAqIE92ZXJyaWRlIGRlZmF1bHQgT3BlblNTTCBwYXNzd29yZCBjYWxsYmFjayB3aXRoIGdldFBhc3N3b3JkKCkuCisgICAqLworICB2b2lkIG92ZXJyaWRlRGVmYXVsdFBhc3N3b3JkQ2FsbGJhY2soKTsKKyAgLyoqCisgICAqIFNldC9VbnNldCBzZXJ2ZXIgbW9kZS4KKyAgICoKKyAgICogQHBhcmFtIGZsYWcgIFNlcnZlciBtb2RlIGlmIHRydWUKKyAgICovCisgIHZpcnR1YWwgdm9pZCBzZXJ2ZXIoYm9vbCBmbGFnKSB7IHNlcnZlcl8gPSBmbGFnOyB9CisgIC8qKgorICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc29ja2V0IGlzIGluIHNlcnZlciBvciBjbGllbnQgbW9kZS4KKyAgICoKKyAgICogQHJldHVybiB0cnVlLCBpZiBzZXJ2ZXIgbW9kZSwgb3IsIGZhbHNlLCBpZiBjbGllbnQgbW9kZQorICAgKi8KKyAgdmlydHVhbCBib29sIHNlcnZlcigpIGNvbnN0IHsgcmV0dXJuIHNlcnZlcl87IH0KKyAgLyoqCisgICAqIFNldCBBY2Nlc3NNYW5hZ2VyLgorICAgKgorICAgKiBAcGFyYW0gbWFuYWdlciAgVGhlIEFjY2Vzc01hbmFnZXIgaW5zdGFuY2UKKyAgICovCisgIHZpcnR1YWwgdm9pZCBhY2Nlc3Moc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IG1hbmFnZXIpIHsgYWNjZXNzXyA9IG1hbmFnZXI7IH0KKyAgc3RhdGljIHZvaWQgc2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKGJvb2wgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKSB7CisgICAgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyA9IG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbjsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOworCisgIC8qKgorICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgY3VzdG9tIHBhc3N3b3JkIGNhbGxiYWNrLiBJdCBtYXkgYmUgY2FsbGVkCisgICAqIG11bHRpcGxlIHRpbWVzIGF0IGFueSB0aW1lIGR1cmluZyBhIHNlc3Npb24gYXMgbmVjZXNzYXJ5LgorICAgKgorICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzcyBjb2xsZWN0ZWQgcGFzc3dvcmQgdG8gT3BlblNTTAorICAgKiBAcGFyYW0gc2l6ZSAgICAgTWF4aW11bSBsZW5ndGggb2YgcGFzc3dvcmQgaW5jbHVkaW5nIE5VTEwgY2hhcmFjdGVyCisgICAqLworICB2aXJ0dWFsIHZvaWQgZ2V0UGFzc3dvcmQoc3RkOjpzdHJpbmcmIC8qIHBhc3N3b3JkICovLCBpbnQgLyogc2l6ZSAqLykge30KKworcHJpdmF0ZToKKyAgYm9vbCBzZXJ2ZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKKyAgc3RhdGljIGNvbmN1cnJlbmN5OjpNdXRleCBtdXRleF87CisgIHN0YXRpYyB1aW50NjRfdCBjb3VudF87CisgIHN0YXRpYyBib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl87CisgIHZvaWQgc2V0dXAoc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbCk7CisgIHN0YXRpYyBpbnQgcGFzc3dvcmRDYWxsYmFjayhjaGFyKiBwYXNzd29yZCwgaW50IHNpemUsIGludCwgdm9pZCogZGF0YSk7Cit9OworCisvKioKKyAqIFNTTCBleGNlcHRpb24uCisgKi8KK2NsYXNzIFRTU0xFeGNlcHRpb24gOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CitwdWJsaWM6CisgIFRTU0xFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlKSB7fQorCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgeworICAgICAgcmV0dXJuICJUU1NMRXhjZXB0aW9uIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7CisgICAgfQorICB9Cit9OworCisvKioKKyAqIFdyYXAgT3BlblNTTCBTU0xfQ1RYIGludG8gYSBjbGFzcy4KKyAqLworY2xhc3MgU1NMQ29udGV4dCB7CitwdWJsaWM6CisgIFNTTENvbnRleHQoY29uc3QgU1NMUHJvdG9jb2wmIHByb3RvY29sID0gU1NMVExTKTsKKyAgdmlydHVhbCB+U1NMQ29udGV4dCgpOworICBTU0wqIGNyZWF0ZVNTTCgpOworICBTU0xfQ1RYKiBnZXQoKSB7IHJldHVybiBjdHhfOyB9CisKK3ByaXZhdGU6CisgIFNTTF9DVFgqIGN0eF87Cit9OworCisvKioKKyAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgYWNjZXNzIGNvbnRyb2wuIEl0J3MgbWVhbnQgdG8gdmVyaWZ5IHRoZSByZW1vdGUgaG9zdC4KKyAqIEl0J3MgY29uc3RydWN0ZWQgd2hlbiBhcHBsaWNhdGlvbiBzdGFydHMgYW5kIHNldCB0byBUU1NMU29ja2V0RmFjdG9yeQorICogaW5zdGFuY2UuIEl0J3MgcGFzc2VkIG9udG8gYWxsIFRTU0xTb2NrZXQgaW5zdGFuY2VzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5CisgKiBvYmplY3QuCisgKi8KK2NsYXNzIEFjY2Vzc01hbmFnZXIgeworcHVibGljOgorICBlbnVtIERlY2lzaW9uIHsKKyAgICBERU5ZID0gLTEsIC8vIGRlbnkgYWNjZXNzCisgICAgU0tJUCA9IDAsICAvLyBjYW5ub3QgbWFrZSBkZWNpc2lvbiwgbW92ZSBvbiB0byBuZXh0IChpZiBhbnkpCisgICAgQUxMT1cgPSAxICAvLyBhbGxvdyBhY2Nlc3MKKyAgfTsKKyAgLyoqCisgICAqIERlc3RydWN0b3IKKyAgICovCisgIHZpcnR1YWwgfkFjY2Vzc01hbmFnZXIoKSB7fQorICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKKyAgICogb25jZSBhZnRlciB0aGUgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCBiZWZvcmUgcGVlciBjZXJ0aWZpY2F0ZQorICAgKiBpcyBleGFtaW5lZC4KKyAgICoKKyAgICogSWYgYSB2YWxpZCBkZWNpc2lvbiAoQUxMT1cgb3IgREVOWSkgaXMgcmV0dXJuZWQsIHRoZSBwZWVyIGNlcnRpZmljYXRlIGlzCisgICAqIG5vdCB0byBiZSB2ZXJpZmllZC4KKyAgICoKKyAgICogQHBhcmFtICBzYSBQZWVyIElQIGFkZHJlc3MKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8pIG5vZXhjZXB0IHsgcmV0dXJuIERFTlk7IH0KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCisgICAqIGV2ZXJ5IHRpbWUgYSBETlMgc3ViamVjdEFsdE5hbWUvY29tbW9uIG5hbWUgaXMgZXh0cmFjdGVkIGZyb20gcGVlcidzCisgICAqIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBAcGFyYW0gIGhvc3QgQ2xpZW50IG1vZGU6IGhvc3QgbmFtZSByZXR1cm5lZCBieSBUU29ja2V0OjpnZXRIb3N0KCkKKyAgICogICAgICAgICAgICAgIFNlcnZlciBtb2RlOiBob3N0IG5hbWUgcmV0dXJuZWQgYnkgVFNvY2tldDo6Z2V0UGVlckhvc3QoKQorICAgKiBAcGFyYW0gIG5hbWUgU3ViamVjdEFsdE5hbWUgb3IgY29tbW9uIG5hbWUgZXh0cmFjdGVkIGZyb20gcGVlciBjZXJ0aWZpY2F0ZQorICAgKiBAcGFyYW0gIHNpemUgTGVuZ3RoIG9mIG5hbWUKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgKgorICAgKiBOb3RlOiBUaGUgIm5hbWUiIHBhcmFtZXRlciBtYXkgYmUgVVRGOCBlbmNvZGVkLgorICAgKi8KKyAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGhvc3QgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIERFTlk7CisgIH0KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCisgICAqIGV2ZXJ5IHRpbWUgYW4gSVAgc3ViamVjdEFsdE5hbWUgaXMgZXh0cmFjdGVkIGZyb20gcGVlcidzIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBAcGFyYW0gIHNhICAgUGVlciBJUCBhZGRyZXNzIHJldHJpZXZlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvY2tldAorICAgKiBAcGFyYW0gIGRhdGEgSVAgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSBjZXJ0aWZpY2F0ZQorICAgKiBAcGFyYW0gIHNpemUgTGVuZ3RoIG9mIHRoZSBJUCBhZGRyZXNzCisgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIC8qIHNhICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBkYXRhICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2l6ZSAqLykgbm9leGNlcHQgeworICAgIHJldHVybiBERU5ZOworICB9Cit9OworCit0eXBlZGVmIEFjY2Vzc01hbmFnZXI6OkRlY2lzaW9uIERlY2lzaW9uOworCitjbGFzcyBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlciA6IHB1YmxpYyBBY2Nlc3NNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgLy8gQWNjZXNzTWFuYWdlciBpbnRlcmZhY2UKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSBub2V4Y2VwdDsKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSkgbm9leGNlcHQ7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpIG5vZXhjZXB0OworfTsKK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThiOTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcApAQCAtMCwwICsxLDY5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVU5fSAorI2luY2x1ZGUgPHN5cy91bi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUSU5FVF9JTl9ICisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVERCX0gKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmbmRlZiBBRl9MT0NBTAorI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCisjZW5kaWYKKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKwordm9pZCBkZXN0cm95ZXJfb2ZfZmluZV9zb2NrZXRzKFRIUklGVF9TT0NLRVQqIHNzb2NrKSB7CisgIDo6VEhSSUZUX0NMT1NFU09DS0VUKCpzc29jayk7CisgIGRlbGV0ZSBzc29jazsKK30KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitUR2V0QWRkckluZm9XcmFwcGVyOjpUR2V0QWRkckluZm9XcmFwcGVyKGNvbnN0IGNoYXIqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHMpCisgIDogbm9kZV8obm9kZSksIHNlcnZpY2VfKHNlcnZpY2UpLCBoaW50c18oaGludHMpLCByZXNfKE5VTEwpIHt9CisKK1RHZXRBZGRySW5mb1dyYXBwZXI6On5UR2V0QWRkckluZm9XcmFwcGVyKCkgeworICBpZiAodGhpcy0+cmVzXyAhPSBOVUxMKQorICAgIGZyZWVhZGRyaW5mbyh0aGlzLT5yZXNfKTsKK30KKworaW50IFRHZXRBZGRySW5mb1dyYXBwZXI6OmluaXQoKSB7CisgIGlmICh0aGlzLT5yZXNfID09IE5VTEwpCisgICAgcmV0dXJuIGdldGFkZHJpbmZvKHRoaXMtPm5vZGVfLCB0aGlzLT5zZXJ2aWNlXywgdGhpcy0+aGludHNfLCAmKHRoaXMtPnJlc18pKTsKKyAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBhZGRyaW5mbyogVEdldEFkZHJJbmZvV3JhcHBlcjo6cmVzKCkgeworICByZXR1cm4gdGhpcy0+cmVzXzsKK30KKworVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChpbnQgcG9ydCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XyhzZW5kVGltZW91dCksCisgICAgcmVjdlRpbWVvdXRfKHJlY3ZUaW1lb3V0KSwKKyAgICBhY2NUaW1lb3V0XygtMSksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSksCisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7Cit9CisKK1RTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIGFkZHJlc3NfKGFkZHJlc3MpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGNvbnN0IHN0cmluZyYgcGF0aCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKDApLAorICAgIHBhdGhfKHBhdGgpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0Ojp+VFNlcnZlclNvY2tldCgpIHsKKyAgY2xvc2UoKTsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpIHsKKyAgc2VuZFRpbWVvdXRfID0gc2VuZFRpbWVvdXQ7Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0UmVjdlRpbWVvdXQoaW50IHJlY3ZUaW1lb3V0KSB7CisgIHJlY3ZUaW1lb3V0XyA9IHJlY3ZUaW1lb3V0OworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdFRpbWVvdXQoaW50IGFjY1RpbWVvdXQpIHsKKyAgYWNjVGltZW91dF8gPSBhY2NUaW1lb3V0OworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpIHsKKyAgYWNjZXB0QmFja2xvZ18gPSBhY2NCYWNrbG9nOworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpIHsKKyAgcmV0cnlMaW1pdF8gPSByZXRyeUxpbWl0OworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpIHsKKyAgcmV0cnlEZWxheV8gPSByZXRyeURlbGF5OworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpIHsKKyAgdGNwU2VuZEJ1ZmZlcl8gPSB0Y3BTZW5kQnVmZmVyOworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpIHsKKyAgdGNwUmVjdkJ1ZmZlcl8gPSB0Y3BSZWN2QnVmZmVyOworfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldEludGVycnVwdGFibGVDaGlsZHJlbihib29sIGVuYWJsZSkgeworICBpZiAobGlzdGVuaW5nXykgeworICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoInNldEludGVycnVwdGFibGVDaGlsZHJlbiBjYW5ub3QgYmUgY2FsbGVkIGFmdGVyIGxpc3RlbigpIik7CisgIH0KKyAgaW50ZXJydXB0YWJsZUNoaWxkcmVuXyA9IGVuYWJsZTsKK30KKwordm9pZCBUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7CisgIGxpc3RlbmluZ18gPSB0cnVlOworI2lmZGVmIF9XSU4zMgorICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYgLy8gX1dJTjMyCisgIFRIUklGVF9TT0NLRVQgc3ZbMl07CisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQKKyAgaWYgKC0xID09IFRIUklGVF9TT0NLRVRQQUlSKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgc3YpKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc29ja2V0cGFpcigpIGludGVycnVwdCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IHN2WzFdOworICAgIGludGVycnVwdFNvY2tSZWFkZXJfID0gc3ZbMF07CisgIH0KKworICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0IGFsbCBjbGllbnRzCisgIGlmICgtMSA9PSBUSFJJRlRfU09DS0VUUEFJUihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIHN2KSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldHBhaXIoKSBjaGlsZEludGVycnVwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXy5yZXNldCgpOworICB9IGVsc2UgeworICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gPSBzdlsxXTsKKyAgICBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXworICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPihuZXcgVEhSSUZUX1NPQ0tFVChzdlswXSksIGRlc3Ryb3llcl9vZl9maW5lX3NvY2tldHMpOworICB9CisKKyAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKKyAgaWYgKHBvcnRfIDwgMCB8fCBwb3J0XyA+IDB4RkZGRikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7CisgIH0KKworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnJlczsKKyAgaW50IGVycm9yOworICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNSIpXTsKKyAgVEhSSUZUX1NOUFJJTlRGKHBvcnQsIHNpemVvZihwb3J0KSwgIiVkIiwgcG9ydF8pOworCisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOworCisgIC8vIElmIGFkZHJlc3MgaXMgbm90IHNwZWNpZmllZCB1c2Ugd2lsZGNhcmQgYWRkcmVzcyAoTlVMTCkKKyAgVEdldEFkZHJJbmZvV3JhcHBlciBpbmZvKGFkZHJlc3NfLmVtcHR5KCkgPyBOVUxMIDogJmFkZHJlc3NfWzBdLCBwb3J0LCAmaGludHMpOworCisgIGVycm9yID0gaW5mby5pbml0KCk7CisgIGlmIChlcnJvcikgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoImdldGFkZHJpbmZvICVkOiAlcyIsIGVycm9yLCBUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIHNlcnZlciBzb2NrZXQuIik7CisgIH0KKworICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAorICAvLyBpbnRvIGlwdjYgc3BhY2UuCisgIGZvciAocmVzID0gaW5mby5yZXMoKTsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOworICB9IGVsc2UgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIH0KKworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldCgpICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBzb2NrZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gU2V0IFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyB0byBwcmV2ZW50IDJNU0wgZGVsYXkgb24gYWNjZXB0CisgIGludCBvbmUgPSAxOworICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLAorICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcsCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uZSkpKSB7CisvLyBpZ25vcmUgZXJyb3JzIGNvbWluZyBvdXQgb2YgdGhpcyBzZXRzb2Nrb3B0IG9uIFdpbmRvd3MuICBUaGlzIGlzIGJlY2F1c2UKKy8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisvLyB3YW50IHRvIGZvcmNlIHNlcnZlcnMgdG8gYmUgYW4gYWRtaW4uCisjaWZuZGVmIF9XSU4zMgorICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworI2VuZGlmCisgIH0KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiAodGNwU2VuZEJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1NOREJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFNlbmRCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwU2VuZEJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19TTkRCVUYgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgU09fU05EQlVGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisKKyAgaWYgKHRjcFJlY3ZCdWZmZXJfID4gMCkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT19SQ1ZCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BSZWN2QnVmZmVyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcFJlY3ZCdWZmZXJfKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fUkNWQlVGICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFNPX1JDVkJVRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorCisvLyBEZWZlciBhY2NlcHQKKyNpZmRlZiBUQ1BfREVGRVJfQUNDRVBUCisgIGlmIChwYXRoXy5lbXB0eSgpKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9ERUZFUl9BQ0NFUFQsICZvbmUsIHNpemVvZihvbmUpKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfREVGRVJfQUNDRVBUICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9ERUZFUl9BQ0NFUFQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKyNlbmRpZiAvLyAjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAorCisjaWZkZWYgSVBWNl9WNk9OTFkKKyAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2ICYmIHBhdGhfLmVtcHR5KCkpIHsKKyAgICBpbnQgemVybyA9IDA7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJUFBST1RPX0lQVjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBWNl9WNk9OTFksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ6ZXJvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoemVybykpKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICB9CisjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fTElOR0VSICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgU09fTElOR0VSIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBVbml4IFNvY2tldHMgZG8gbm90IG5lZWQgdGhhdAorICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICAgIGlmICgtMQorICAgICAgICA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX05PREVMQVkgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX05PREVMQVkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworICAvLyBTZXQgTk9OQkxPQ0sgb24gdGhlIGFjY2VwdCBzb2NrZXQKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKHNlcnZlclNvY2tldF8sIFRIUklGVF9GX0dFVEZMLCAwKTsKKyAgaWYgKGZsYWdzID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9PX05PTkJMT0NLICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCBUSFJJRlRfT19OT05CTE9DSyBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAorICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KKyAgaW50IHJldHJpZXMgPSAwOworICBpbnQgZXJybm9fY29weSA9IDA7CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisKKyNpZm5kZWYgX1dJTjMyCisKKyAgICAvLyBVbml4IERvbWFpbiBTb2NrZXQKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKKyAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KKworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CisjZWxzZQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworCisgICAgLy8gcmV0cmlldmUgYmluZCBpbmZvCisgICAgaWYgKHBvcnRfID09IDAgJiYgcmV0cmllcyA8PSByZXRyeUxpbWl0XykgeworICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgICAgICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNhKTsKKyAgICAgIHN0ZDo6bWVtc2V0KCZzYSwgMCwgbGVuKTsKKyAgICAgIGlmICg6OmdldHNvY2tuYW1lKHNlcnZlclNvY2tldF8sIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyKj4oJnNhKSwgJmxlbikgPCAwKSB7CisgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6Z2V0UG9ydCgpIGdldHNvY2tuYW1lKCkgIiwgZXJybm9fY29weSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2Euc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oJnNhKTsKKyAgICAgICAgICBwb3J0XyA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luKj4oJnNhKTsKKyAgICAgICAgICBwb3J0XyA9IG50b2hzKHNpbi0+c2luX3BvcnQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZmFpbGVkIHRvIGJpbmQgcHJvcGVybHkKKyAgaWYgKHJldHJpZXMgPiByZXRyeUxpbWl0XykgeworICAgIGNoYXIgZXJyYnVmWzEwMjRdOworICAgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBQQVRIICVzIiwgcGF0aF8uY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgQklORCAlZCIsIHBvcnRfKTsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0KGVycmJ1Zik7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBiaW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKGxpc3RlbkNhbGxiYWNrXykKKyAgICBsaXN0ZW5DYWxsYmFja18oc2VydmVyU29ja2V0Xyk7CisKKyAgLy8gQ2FsbCBsaXN0ZW4KKyAgaWYgKC0xID09IDo6bGlzdGVuKHNlcnZlclNvY2tldF8sIGFjY2VwdEJhY2tsb2dfKSkgeworICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBsaXN0ZW4oKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgbGlzdGVuIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBUaGUgc29ja2V0IGlzIG5vdyBsaXN0ZW5pbmchCit9CisKK2ludCBUU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgeworICByZXR1cm4gcG9ydF87Cit9CisKK3NoYXJlZF9wdHI8VFRyYW5zcG9ydD4gVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHsKKyAgaWYgKHNlcnZlclNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRTZXJ2ZXJTb2NrZXQgbm90IGxpc3RlbmluZyIpOworICB9CisKKyAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworCisgIGludCBtYXhFaW50cnMgPSA1OworICBpbnQgbnVtRWludHJzID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIHN0ZDo6bWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICAgIGZkc1swXS5mZCA9IHNlcnZlclNvY2tldF87CisgICAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgaWYgKGludGVycnVwdFNvY2tSZWFkZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgICAgZmRzWzFdLmZkID0gaW50ZXJydXB0U29ja1JlYWRlcl87CisgICAgICBmZHNbMV0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgICB9CisgICAgLyoKKyAgICAgIFRPRE86IGlmIFRIUklGVF9FSU5UUiBpcyByZWNlaXZlZCwgd2UnbGwgcmVzdGFydCB0aGUgdGltZW91dC4KKyAgICAgIFRvIGJlIGFjY3VyYXRlLCB3ZSBuZWVkIHRvIGZpeCB0aGlzIGluIHRoZSBmdXR1cmUuCisgICAgICovCisgICAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgMiwgYWNjVGltZW91dF8pOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICBpZiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgPT0gVEhSSUZUX0VJTlRSICYmIChudW1FaW50cnMrKyA8IG1heEVpbnRycykpIHsKKyAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfUE9MTCgpICIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgeworICAgICAgLy8gQ2hlY2sgZm9yIGFuIGludGVycnVwdCBzaWduYWwKKyAgICAgIGlmIChpbnRlcnJ1cHRTb2NrUmVhZGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikpIHsKKyAgICAgICAgaW50OF90IGJ1ZjsKKyAgICAgICAgaWYgKC0xID09IHJlY3YoaW50ZXJydXB0U29ja1JlYWRlcl8sIGNhc3Rfc29ja29wdCgmYnVmKSwgc2l6ZW9mKGludDhfdCksIDApKSB7CisgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHJlY3YoKSBpbnRlcnJ1cHQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhY3R1YWwgc2VydmVyIHNvY2tldCBiZWluZyByZWFkeQorICAgICAgaWYgKGZkc1swXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgR2xvYmFsT3V0cHV0KCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX1BPTEwgMCIpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKKyAgICB9CisgIH0KKworICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBjbGllbnRBZGRyZXNzOworICBpbnQgc2l6ZSA9IHNpemVvZihjbGllbnRBZGRyZXNzKTsKKyAgVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQKKyAgICAgID0gOjphY2NlcHQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIChzb2NrbGVuX3QqKSZzaXplKTsKKworICBpZiAoY2xpZW50U29ja2V0ID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSBjbGllbnQgc29ja2V0IGlzIGJsb2NraW5nCisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX0dFVEZMLCAwKTsKKyAgaWYgKGZsYWdzID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX0dFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoY2xpZW50U29ja2V0LCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgJiB+VEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dAorICAgICAgICAucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfU0VURkwgflRIUklGVF9PX05PTkJMT0NLICIsCisgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9TRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IGNsaWVudCA9IGNyZWF0ZVNvY2tldChjbGllbnRTb2NrZXQpOworICBpZiAoc2VuZFRpbWVvdXRfID4gMCkgeworICAgIGNsaWVudC0+c2V0U2VuZFRpbWVvdXQoc2VuZFRpbWVvdXRfKTsKKyAgfQorICBpZiAocmVjdlRpbWVvdXRfID4gMCkgeworICAgIGNsaWVudC0+c2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKKyAgfQorICBpZiAoa2VlcEFsaXZlXykgeworICAgIGNsaWVudC0+c2V0S2VlcEFsaXZlKGtlZXBBbGl2ZV8pOworICB9CisgIGNsaWVudC0+c2V0Q2FjaGVkQWRkcmVzcygoc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCBzaXplKTsKKworICBpZiAoYWNjZXB0Q2FsbGJhY2tfKQorICAgIGFjY2VwdENhbGxiYWNrXyhjbGllbnRTb2NrZXQpOworCisgIHJldHVybiBjbGllbnQ7Cit9CisKK3NoYXJlZF9wdHI8VFNvY2tldD4gVFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0KSB7CisgIGlmIChpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKSB7CisgICAgcmV0dXJuIHNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoY2xpZW50U29ja2V0LCBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXykpOworICB9IGVsc2UgeworICAgIHJldHVybiBzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGNsaWVudFNvY2tldCkpOworICB9Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6bm90aWZ5KFRIUklGVF9TT0NLRVQgbm90aWZ5U29ja2V0KSB7CisgIGlmIChub3RpZnlTb2NrZXQgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaW50OF90IGJ5dGUgPSAwOworICAgIGlmICgtMSA9PSBzZW5kKG5vdGlmeVNvY2tldCwgY2FzdF9zb2Nrb3B0KCZieXRlKSwgc2l6ZW9mKGludDhfdCksIDApKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0Ojpub3RpZnkoKSBzZW5kKCkgIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OmludGVycnVwdCgpIHsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOworICBpZiAoaW50ZXJydXB0U29ja1dyaXRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgbm90aWZ5KGludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OmludGVycnVwdENoaWxkcmVuKCkgeworICBjb25jdXJyZW5jeTo6R3VhcmQgZyhyd011dGV4Xyk7CisgIGlmIChjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIG5vdGlmeShjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OmNsb3NlKCkgeworICBjb25jdXJyZW5jeTo6R3VhcmQgZyhyd011dGV4Xyk7CisgIGlmIChzZXJ2ZXJTb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHNodXRkb3duKHNlcnZlclNvY2tldF8sIFRIUklGVF9TSFVUX1JEV1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNlcnZlclNvY2tldF8pOworICB9CisgIGlmIChpbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChpbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KKyAgaWYgKGludGVycnVwdFNvY2tSZWFkZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGludGVycnVwdFNvY2tSZWFkZXJfKTsKKyAgfQorICBpZiAoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgfQorICBzZXJ2ZXJTb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgaW50ZXJydXB0U29ja1JlYWRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfLnJlc2V0KCk7CisgIGxpc3RlbmluZ18gPSBmYWxzZTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjNkMmMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVERCX0gKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY2xhc3MgVFNvY2tldDsKKworY2xhc3MgVEdldEFkZHJJbmZvV3JhcHBlciB7CitwdWJsaWM6CisgIFRHZXRBZGRySW5mb1dyYXBwZXIoY29uc3QgY2hhciogbm9kZSwgY29uc3QgY2hhciogc2VydmljZSwgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBoaW50cyk7CisKKyAgdmlydHVhbCB+VEdldEFkZHJJbmZvV3JhcHBlcigpOworCisgIGludCBpbml0KCk7CisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogcmVzKCk7CisKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIqIG5vZGVfOworICBjb25zdCBjaGFyKiBzZXJ2aWNlXzsKKyAgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBoaW50c187CisgIHN0cnVjdCBhZGRyaW5mbyogcmVzXzsKK307CisKKy8qKgorICogU2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0LiBXcmFwcGVyIGFyb3VuZCBhIHVuaXgKKyAqIHNvY2tldCBsaXN0ZW4gYW5kIGFjY2VwdCBjYWxscy4KKyAqCisgKi8KK2NsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVFNlcnZlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKFRIUklGVF9TT0NLRVQgZmQpPiBzb2NrZXRfZnVuY190OworCisgIGNvbnN0IHN0YXRpYyBpbnQgREVGQVVMVF9CQUNLTE9HID0gMTAyNDsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICovCisgIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICovCisgIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHVzZWQgZm9yIHVuaXggc29ja2V0cy4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggUGF0aG5hbWUgZm9yIHVuaXggc29ja2V0LgorICAgKi8KKyAgVFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgdmlydHVhbCB+VFNlcnZlclNvY2tldCgpOworCisgIHZvaWQgc2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KTsKKyAgdm9pZCBzZXRSZWN2VGltZW91dChpbnQgcmVjdlRpbWVvdXQpOworCisgIHZvaWQgc2V0QWNjZXB0VGltZW91dChpbnQgYWNjVGltZW91dCk7CisgIHZvaWQgc2V0QWNjZXB0QmFja2xvZyhpbnQgYWNjQmFja2xvZyk7CisKKyAgdm9pZCBzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KTsKKyAgdm9pZCBzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KTsKKworICB2b2lkIHNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgeyBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOyB9CisKKyAgdm9pZCBzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKTsKKyAgdm9pZCBzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKTsKKworICAvLyBsaXN0ZW5DYWxsYmFjayBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSBsaXN0ZW4sIGFuZCBhZnRlciBhbGwgVGhyaWZ0CisgIC8vIHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZSBjdXN0b20gc2V0c29ja29wdAorICAvLyB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgIHZvaWQgc2V0TGlzdGVuQ2FsbGJhY2soY29uc3Qgc29ja2V0X2Z1bmNfdCYgbGlzdGVuQ2FsbGJhY2spIHsgbGlzdGVuQ2FsbGJhY2tfID0gbGlzdGVuQ2FsbGJhY2s7IH0KKworICAvLyBhY2NlcHRDYWxsYmFjayBnZXRzIGNhbGxlZCBhZnRlciBlYWNoIGFjY2VwdCBjYWxsLCBvbiB0aGUgbmV3bHkgY3JlYXRlZCBzb2NrZXQuCisgIC8vIEl0IGlzIGNhbGxlZCBhZnRlciBhbGwgVGhyaWZ0IHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZQorICAvLyBjdXN0b20gc2V0c29ja29wdCB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgYWNjZXB0ZWQKKyAgLy8gc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRBY2NlcHRDYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBhY2NlcHRDYWxsYmFjaykgeyBhY2NlcHRDYWxsYmFja18gPSBhY2NlcHRDYWxsYmFjazsgfQorCisgIC8vIFdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLCBuZXcgY2hpbGRyZW4gVFNvY2tldHMgd2lsbCBiZSBjb25zdHJ1Y3RlZCBzbworICAvLyB0aGV5IGNhbiBiZSBpbnRlcnJ1cHRlZCBieSBUU2VydmVyVHJhbnNwb3J0OjppbnRlcnJ1cHRDaGlsZHJlbigpLgorICAvLyBUaGlzIGlzIG1vcmUgZXhwZW5zaXZlIGluIHRlcm1zIG9mIHN5c3RlbSBjYWxscyAocG9sbCArIHJlY3YpIGhvd2V2ZXIKKyAgLy8gZW5zdXJlcyBhIGNvbm5lY3RlZCBjbGllbnQgY2Fubm90IGludGVyZmVyZSB3aXRoIFRTZXJ2ZXI6OnN0b3AoKS4KKyAgLy8KKyAgLy8gV2hlbiBkaXNhYmxlZCwgVFNvY2tldCBjaGlsZHJlbiBkbyBub3QgaW5jdXIgYW4gYWRkaXRpb25hbCBwb2xsKCkgY2FsbC4KKyAgLy8gU2VydmVyLXNpZGUgcmVhZHMgYXJlIG1vcmUgZWZmaWNpZW50LCBob3dldmVyIGEgY2xpZW50IGNhbiBpbnRlcmZlcmUgd2l0aAorICAvLyB0aGUgc2VydmVyJ3MgYWJpbGl0eSB0byBzaHV0ZG93biBwcm9wZXJseSBieSBzdGF5aW5nIGNvbm5lY3RlZC4KKyAgLy8KKyAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxpc3RlbigpOyBtb2RlIGNhbm5vdCBiZSBzd2l0Y2hlZCBhZnRlciB0aGF0LgorICAvLyBcdGhyb3dzIHN0ZDo6bG9naWNfZXJyb3IgaWYgbGlzdGVuKCkgaGFzIGJlZW4gY2FsbGVkCisgIHZvaWQgc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGJvb2wgZW5hYmxlKTsKKworICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gc2VydmVyU29ja2V0XzsgfQorCisgIGludCBnZXRQb3J0KCk7CisKKyAgdm9pZCBsaXN0ZW4oKTsKKyAgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgdm9pZCBpbnRlcnJ1cHRDaGlsZHJlbigpOworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKyAgYm9vbCBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fOworICBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl87IC8vIGlmIGludGVycnVwdGFibGVDaGlsZHJlbl8gdGhpcyBpcyBzaGFyZWQgd2l0aCBjaGlsZCBUU29ja2V0cworCitwcml2YXRlOgorICB2b2lkIG5vdGlmeShUSFJJRlRfU09DS0VUIG5vdGlmeVNvY2spOworCisgIGludCBwb3J0XzsKKyAgc3RkOjpzdHJpbmcgYWRkcmVzc187CisgIHN0ZDo6c3RyaW5nIHBhdGhfOworICBUSFJJRlRfU09DS0VUIHNlcnZlclNvY2tldF87CisgIGludCBhY2NlcHRCYWNrbG9nXzsKKyAgaW50IHNlbmRUaW1lb3V0XzsKKyAgaW50IHJlY3ZUaW1lb3V0XzsKKyAgaW50IGFjY1RpbWVvdXRfOworICBpbnQgcmV0cnlMaW1pdF87CisgIGludCByZXRyeURlbGF5XzsKKyAgaW50IHRjcFNlbmRCdWZmZXJfOworICBpbnQgdGNwUmVjdkJ1ZmZlcl87CisgIGJvb2wga2VlcEFsaXZlXzsKKyAgYm9vbCBsaXN0ZW5pbmdfOworCisgIGNvbmN1cnJlbmN5OjpNdXRleCByd011dGV4XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWQtc2FmZSBpbnRlcnJ1cHQKKyAgVEhSSUZUX1NPQ0tFVCBpbnRlcnJ1cHRTb2NrV3JpdGVyXzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIGludGVycnVwdCgpCisgIFRIUklGVF9TT0NLRVQgaW50ZXJydXB0U29ja1JlYWRlcl87ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1c2VkIGluIHNlbGVjdC9wb2xsIHdpdGggc2VydmVyU29ja2V0XyBmb3IgaW50ZXJydXB0YWJpbGl0eQorICBUSFJJRlRfU09DS0VUIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl87ICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gaW50ZXJydXB0Q2hpbGRyZW4oKQorCisgIHNvY2tldF9mdW5jX3QgbGlzdGVuQ2FsbGJhY2tfOworICBzb2NrZXRfZnVuY190IGFjY2VwdENhbGxiYWNrXzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc2MzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBTZXJ2ZXIgdHJhbnNwb3J0IGZyYW1ld29yay4gQSBzZXJ2ZXIgbmVlZHMgdG8gaGF2ZSBzb21lIGZhY2lsaXR5IGZvcgorICogY3JlYXRpbmcgYmFzZSB0cmFuc3BvcnRzIHRvIHJlYWQvd3JpdGUgZnJvbS4gIFRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQKKyAqIHRvIGtlZXAgdHJhY2sgb2YgVFRyYW5zcG9ydCBjaGlsZHJlbiB0aGF0IGl0IGNyZWF0ZXMgZm9yIHB1cnBvc2VzIG9mCisgKiBjb250cm9sbGluZyB0aGVpciBsaWZldGltZS4KKyAqLworY2xhc3MgVFNlcnZlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHNlcnZlciB0cmFuc3BvcnQgbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMuIFByaW9yIHRvIHRoaXMKKyAgICogY2FsbCBtb3N0IHRyYW5zcG9ydHMgd2lsbCBub3QgcmV0dXJuIGFueXRoaW5nIHdoZW4gYWNjZXB0IGlzIGNhbGxlZC4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdlIHdlcmUgdW5hYmxlIHRvIGxpc3RlbgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxpc3RlbigpIHt9CisKKyAgLyoqCisgICAqIEdldHMgYSBuZXcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHRyYW5zcG9ydCBvYmplY3QgYW5kIHBhc3NlcyBpdCB0byB0aGUKKyAgICogY2FsbGVyLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGV4cGxpY2l0IGR1dHkgb2YgdGhlIGNhbGxlciB0byBmcmVlIHRoZQorICAgKiBhbGxvY2F0ZWQgb2JqZWN0LiBUaGUgcmV0dXJuZWQgVFRyYW5zcG9ydCBvYmplY3QgbXVzdCBhbHdheXMgYmUgaW4gdGhlCisgICAqIG9wZW5lZCBzdGF0ZS4gTlVMTCBzaG91bGQgbmV2ZXIgYmUgcmV0dXJuZWQsIGluc3RlYWQgYW4gRXhjZXB0aW9uIHNob3VsZAorICAgKiBhbHdheXMgYmUgdGhyb3duLgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3IFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogRm9yICJzbWFydCIgVFNlcnZlclRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3b3JrIGluIGEgbXVsdGkKKyAgICogdGhyZWFkZWQgY29udGV4dCB0aGlzIGNhbiBiZSB1c2VkIHRvIGJyZWFrIG91dCBvZiBhbiBhY2NlcHQoKSBjYWxsLgorICAgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSB0cmFuc3BvcnQgd2lsbCB0aHJvdyBhIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICogd2l0aCB0aGUgSU5URVJSVVBURUQgZXJyb3IgY29kZS4KKyAgICoKKyAgICogVGhpcyB3aWxsIG5vdCBtYWtlIGFuIGF0dGVtcHQgdG8gaW50ZXJydXB0IGFueSBUVHJhbnNwb3J0IGNoaWxkcmVuLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGludGVycnVwdCgpIHt9CisKKyAgLyoqCisgICAqIFRoaXMgd2lsbCBpbnRlcnJ1cHQgdGhlIGNoaWxkcmVuIGNyZWF0ZWQgYnkgdGhlIHNlcnZlciB0cmFuc3BvcnQuCisgICAqIGFsbG93aW5nIHRoZW0gdG8gYnJlYWsgb3V0IG9mIGFueSBibG9ja2luZyBkYXRhIHJlY2VwdGlvbiBjYWxsLgorICAgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBjaGlsZHJlbiB3aWxsIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBJTlRFUlJVUFRFRCBlcnJvciBjb2RlLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGludGVycnVwdENoaWxkcmVuKCkge30KKworICAvKioKKyAgKiBVdGlsaXR5IG1ldGhvZAorICAqCisgICogQHJldHVybiBzZXJ2ZXIgc29ja2V0IGZpbGUgZGVzY3JpcHRvcgorICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAqLworCisgIHZpcnR1YWwgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIC0xOyB9CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGlzIHRyYW5zcG9ydCBzdWNoIHRoYXQgZnV0dXJlIGNhbGxzIHRvIGFjY2VwdCB3aWxsIGRvIG5vdGhpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgVFNlcnZlclRyYW5zcG9ydCgpIHt9CisKKyAgLyoqCisgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGZvciBhY2NlcHQuCisgICAqCisgICAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgVFRyYW5zcG9ydCBvYmplY3QKKyAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgPSAwOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODI1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNIT1JUUkVBRFRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPGNzdGRsaWI+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcuICBJdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydC4KKyAqIENhbGxzIHRvIHJlYWQgYXJlIHBhc3NlZCB0aHJvdWdoIHdpdGggc29tZSBwcm9iYWJpbGl0eS4gIE90aGVyd2lzZSwKKyAqIHRoZSByZWFkIGFtb3VudCBpcyByYW5kb21seSByZWR1Y2VkIGJlZm9yZSBiZWluZyBwYXNzZWQgdGhyb3VnaC4KKyAqCisgKi8KK2NsYXNzIFRTaG9ydFJlYWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFNob3J0UmVhZFRyYW5zcG9ydD4geworcHVibGljOgorICBUU2hvcnRSZWFkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIGRvdWJsZSBmdWxsX3Byb2IpCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksIGZ1bGxQcm9iXyhmdWxsX3Byb2IpIHt9CisKKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQorCisgIGJvb2wgcGVlaygpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPnBlZWsoKTsgfQorCisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisKKyAgdm9pZCBjbG9zZSgpIHsgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsgfQorCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChyYW5kKCkgLyAoZG91YmxlKVJBTkRfTUFYID49IGZ1bGxQcm9iXykgeworICAgICAgbGVuID0gMSArIHJhbmQoKSAlIGxlbjsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zcG9ydF8tPnJlYWQoYnVmLCBsZW4pOworICB9CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7IH0KKworICB2b2lkIGZsdXNoKCkgeyB0cmFuc3BvcnRfLT5mbHVzaCgpOyB9CisKKyAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeyByZXR1cm4gdHJhbnNwb3J0Xy0+Ym9ycm93KGJ1ZiwgbGVuKTsgfQorCisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmNvbnN1bWUobGVuKTsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworICBkb3VibGUgZnVsbFByb2JfOworfTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6dGVzdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTM5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVFNpbXBsZUZpbGVUcmFuc3BvcnQ6OlRTaW1wbGVGaWxlVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBib29sIHJlYWQsIGJvb2wgd3JpdGUpCisgIDogVEZEVHJhbnNwb3J0KC0xLCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpIHsKKyAgaW50IGZsYWdzID0gMDsKKyAgaWYgKHJlYWQgJiYgd3JpdGUpIHsKKyAgICBmbGFncyA9IE9fUkRXUjsKKyAgfSBlbHNlIGlmIChyZWFkKSB7CisgICAgZmxhZ3MgPSBPX1JET05MWTsKKyAgfSBlbHNlIGlmICh3cml0ZSkgeworICAgIGZsYWdzID0gT19XUk9OTFk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTmVpdGhlciBSRUFEIG5vciBXUklURSBzcGVjaWZpZWQiKTsKKyAgfQorICBpZiAod3JpdGUpIHsKKyAgICBmbGFncyB8PSBPX0NSRUFUIHwgT19BUFBFTkQ7CisgIH0KKyNpZm5kZWYgX1dJTjMyCisgIG1vZGVfdCBtb2RlID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKyNlbHNlCisgIGludCBtb2RlID0gX1NfSVJFQUQgfCBfU19JV1JJVEU7CisjZW5kaWYKKyAgaW50IGZkID0gOjpUSFJJRlRfT1BFTihwYXRoLmNfc3RyKCksIGZsYWdzLCBtb2RlKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oImZhaWxlZCB0byBvcGVuIGZpbGUgZm9yIHdyaXRpbmc6ICIgKyBwYXRoKTsKKyAgfQorICBzZXRGRChmZCk7CisgIG9wZW4oKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTE4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBEZWFkLXNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIGZpbGUuCisgKgorICogV3JpdGVhYmxlIGZpbGVzIGFyZSBvcGVuZWQgd2l0aCBPX0NSRUFUIGFuZCBPX0FQUEVORAorICovCitjbGFzcyBUU2ltcGxlRmlsZVRyYW5zcG9ydCA6IHB1YmxpYyBURkRUcmFuc3BvcnQgeworcHVibGljOgorICBUU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgYm9vbCByZWFkID0gdHJ1ZSwgYm9vbCB3cml0ZSA9IGZhbHNlKTsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICBfVEhSSUZUX1RSQU5TUE9SVF9UU0lNUExFRklMRVRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMmJmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAKQEAgLTAsMCArMSw5NTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaWZkZWYgSEFWRV9TWVNfSU9DVExfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19VTl9ICisjaW5jbHVkZSA8c3lzL3VuLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19QT0xMX0gKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBUU29ja2V0IGltcGxlbWVudGF0aW9uLgorICoKKyAqLworCitUU29ja2V0OjpUU29ja2V0KGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpCisgIDogaG9zdF8oaG9zdCksCisgICAgcG9ydF8ocG9ydCksCisgICAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgeworfQorCitUU29ja2V0OjpUU29ja2V0KGNvbnN0IHN0cmluZyYgcGF0aCkKKyAgOiBwb3J0XygwKSwKKyAgICBwYXRoXyhwYXRoKSwKKyAgICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgcGVlclBvcnRfKDApLAorICAgIGNvbm5UaW1lb3V0XygwKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpbmdlck9uXygxKSwKKyAgICBsaW5nZXJWYWxfKDApLAorICAgIG5vRGVsYXlfKDEpLAorICAgIG1heFJlY3ZSZXRyaWVzXyg1KSB7CisgIGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7Cit9CisKK1RTb2NrZXQ6OlRTb2NrZXQoKQorICA6IHBvcnRfKDApLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKKyAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKK30KKworVFNvY2tldDo6VFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCkKKyAgOiBwb3J0XygwKSwKKyAgICBzb2NrZXRfKHNvY2tldCksCisgICAgcGVlclBvcnRfKDApLAorICAgIGNvbm5UaW1lb3V0XygwKSwKKyAgICBzZW5kVGltZW91dF8oMCksCisgICAgcmVjdlRpbWVvdXRfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpbmdlck9uXygxKSwKKyAgICBsaW5nZXJWYWxfKDApLAorICAgIG5vRGVsYXlfKDEpLAorICAgIG1heFJlY3ZSZXRyaWVzXyg1KSB7CisgIGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkgPSBBRl9VTlNQRUM7CisjaWZkZWYgU09fTk9TSUdQSVBFCisgIHsKKyAgICBpbnQgb25lID0gMTsKKyAgICBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgJm9uZSwgc2l6ZW9mKG9uZSkpOworICB9CisjZW5kaWYKK30KKworVFNvY2tldDo6VFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICA6IHBvcnRfKDApLAorICAgIHNvY2tldF8oc29ja2V0KSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgaW50ZXJydXB0TGlzdGVuZXJfKGludGVycnVwdExpc3RlbmVyKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgeworICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOworI2lmZGVmIFNPX05PU0lHUElQRQorICB7CisgICAgaW50IG9uZSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19OT1NJR1BJUEUsICZvbmUsIHNpemVvZihvbmUpKTsKKyAgfQorI2VuZGlmCit9CisKK1RTb2NrZXQ6On5UU29ja2V0KCkgeworICBjbG9zZSgpOworfQorCitib29sIFRTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW50MzJfdCByZXRyaWVzID0gMDsKKyAgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSBudW1CeXRlc0F2YWlsYWJsZTsKK3RyeV9hZ2FpbjoKKyAgaW50IHIgPSBUSFJJRlRfSU9DVExfU09DS0VUKHNvY2tldF8sIEZJT05SRUFELCAmbnVtQnl0ZXNBdmFpbGFibGUpOworICBpZiAociA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICBnb3RvIHRyeV9hZ2FpbjsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSBUSFJJRlRfSU9DVExfU09DS0VUKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICB9CisgIHJldHVybiBudW1CeXRlc0F2YWlsYWJsZSA+IDA7Cit9CisKK2Jvb2wgVFNvY2tldDo6aXNPcGVuKCkgeworICByZXR1cm4gKHNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKTsKK30KKworYm9vbCBUU29ja2V0OjpwZWVrKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChpbnRlcnJ1cHRMaXN0ZW5lcl8pIHsKKyAgICBmb3IgKGludCByZXRyaWVzID0gMDs7KSB7CisgICAgICBzdHJ1Y3QgVEhSSUZUX1BPTExGRCBmZHNbMl07CisgICAgICBzdGQ6Om1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgICAgIGZkc1swXS5mZCA9IHNvY2tldF87CisgICAgICBmZHNbMF0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgICAgIGZkc1sxXS5mZCA9ICooaW50ZXJydXB0TGlzdGVuZXJfLmdldCgpKTsKKyAgICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICAgICAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgMiwgKHJlY3ZUaW1lb3V0XyA9PSAwKSA/IC0xIDogcmVjdlRpbWVvdXRfKTsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRUlOVFIgJiYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpwZWVrKCkgVEhSSUZUX1BPTEwoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgIC8vIENoZWNrIHRoZSBpbnRlcnJ1cHRMaXN0ZW5lcgorICAgICAgICBpZiAoZmRzWzFdLnJldmVudHMgJiBUSFJJRlRfUE9MTElOKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZGF0YSBvciBhIGRpc2Nvbm5lY3Rpb24sIGZhbGwgdGhyb3VnaCB0byB0aGUgUEVFSworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRpbWVvdXQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiBkYXRhIGlzIGF2YWlsYWJsZSBvciBpZiB0aGUgcmVtb3RlIHNpZGUgY2xvc2VkCisgIHVpbnQ4X3QgYnVmOworICBpbnQgciA9IHN0YXRpY19jYXN0PGludD4ocmVjdihzb2NrZXRfLCBjYXN0X3NvY2tvcHQoJmJ1ZiksIDEsIE1TR19QRUVLKSk7CisgIGlmIChyID09IC0xKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KKyAgICAvKiBzaGlnaW46CisgICAgICogZnJlZWJzZCByZXR1cm5zIC0xIGFuZCBUSFJJRlRfRUNPTk5SRVNFVCBpZiBzb2NrZXQgd2FzIGNsb3NlZCBieQorICAgICAqIHRoZSBvdGhlciBzaWRlCisgICAgICovCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpwZWVrKCkgcmVjdigpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgInJlY3YoKSIsIGVycm5vX2NvcHkpOworICB9CisgIHJldHVybiAociA+IDApOworfQorCit2b2lkIFRTb2NrZXQ6Om9wZW5Db25uZWN0aW9uKHN0cnVjdCBhZGRyaW5mbyogcmVzKSB7CisKKyAgaWYgKGlzT3BlbigpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgc29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIH0gZWxzZSB7CisgICAgc29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CisgIH0KKworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBzb2NrZXQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAic29ja2V0KCkiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNlbmQgdGltZW91dAorICBpZiAoc2VuZFRpbWVvdXRfID4gMCkgeworICAgIHNldFNlbmRUaW1lb3V0KHNlbmRUaW1lb3V0Xyk7CisgIH0KKworICAvLyBSZWN2IHRpbWVvdXQKKyAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKKyAgICBzZXRSZWN2VGltZW91dChyZWN2VGltZW91dF8pOworICB9CisKKyAgaWYgKGtlZXBBbGl2ZV8pIHsKKyAgICBzZXRLZWVwQWxpdmUoa2VlcEFsaXZlXyk7CisgIH0KKworICAvLyBMaW5nZXIKKyAgc2V0TGluZ2VyKGxpbmdlck9uXywgbGluZ2VyVmFsXyk7CisKKyAgLy8gTm8gZGVsYXkKKyAgc2V0Tm9EZWxheShub0RlbGF5Xyk7CisKKyNpZmRlZiBTT19OT1NJR1BJUEUKKyAgeworICAgIGludCBvbmUgPSAxOworICAgIHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCAmb25lLCBzaXplb2Yob25lKSk7CisgIH0KKyNlbmRpZgorCisvLyBVc2VzIGEgbG93IG1pbiBSVE8gaWYgYXNrZWQgdG8uCisjaWZkZWYgVENQX0xPV19NSU5fUlRPCisgIGlmIChnZXRVc2VMb3dNaW5SdG8oKSkgeworICAgIGludCBvbmUgPSAxOworICAgIHNldHNvY2tvcHQoc29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9MT1dfTUlOX1JUTywgJm9uZSwgc2l6ZW9mKG9uZSkpOworICB9CisjZW5kaWYKKworICAvLyBTZXQgdGhlIHNvY2tldCB0byBiZSBub24gYmxvY2tpbmcgZm9yIGNvbm5lY3QgaWYgYSB0aW1lb3V0IGV4aXN0cworICBpbnQgZmxhZ3MgPSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoY29ublRpbWVvdXRfID4gMCkgeworICAgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFRIUklGVF9GQ05UTCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyAmIH5USFJJRlRfT19OT05CTE9DSykpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVEhSSUZUX0ZDTlRMICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorCisgIC8vIENvbm5lY3QgdGhlIHNvY2tldAorICBpbnQgcmV0OworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKworI2lmbmRlZiBfV0lOMzIKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciKTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKKyAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldCA9IGNvbm5lY3Qoc29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHN0cnVjdGxlbik7CisjZWxzZQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisgIH0gZWxzZSB7CisgICAgcmV0ID0gY29ubmVjdChzb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSk7CisgIH0KKworICAvLyBzdWNjZXNzIGNhc2UKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgZ290byBkb25lOworICB9CisKKyAgaWYgKChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRUlOUFJPR1JFU1MpCisgICAgICAmJiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VXT1VMREJMT0NLKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGNvbm5lY3QoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiY29ubmVjdCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICB9CisKKyAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzFdOworICBzdGQ6Om1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgZmRzWzBdLmZkID0gc29ja2V0XzsKKyAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMT1VUOworICByZXQgPSBUSFJJRlRfUE9MTChmZHMsIDEsIGNvbm5UaW1lb3V0Xyk7CisKKyAgaWYgKHJldCA+IDApIHsKKyAgICAvLyBFbnN1cmUgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIGVycm9ycyBzZXQKKyAgICBpbnQgdmFsOworICAgIHNvY2tsZW5fdCBsb247CisgICAgbG9uID0gc2l6ZW9mKGludCk7CisgICAgaW50IHJldDIgPSBnZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCBjYXN0X3NvY2tvcHQoJnZhbCksICZsb24pOworICAgIGlmIChyZXQyID09IC0xKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGdldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJnZXRzb2Nrb3B0KCkiLCBlcnJub19jb3B5KTsKKyAgICB9CisgICAgLy8gbm8gZXJyb3JzIG9uIHNvY2tldCwgZ28gdG8gdG93bgorICAgIGlmICh2YWwgPT0gMCkgeworICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgZXJyb3Igb24gc29ja2V0IChhZnRlciBUSFJJRlRfUE9MTCkgIiArIGdldFNvY2tldEluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgInNvY2tldCBvcGVuKCkgZXJyb3IiLCB2YWwpOworICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgLy8gc29ja2V0IHRpbWVkIG91dAorICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldDo6b3BlbigpIHRpbWVkIG91dCAiICsgZ2V0U29ja2V0SW5mbygpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIm9wZW4oKSB0aW1lZCBvdXQiKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBlcnJvciBvbiBUSFJJRlRfUE9MTCgpCisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVEhSSUZUX1BPTEwoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVEhSSUZUX1BPTEwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKKyAgfQorCitkb25lOgorICAvLyBTZXQgc29ja2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgKGJsb2NraW5nKQorICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBUSFJJRlRfRkNOVEwgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICBzZXRDYWNoZWRBZGRyZXNzKHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8c29ja2xlbl90PihyZXMtPmFpX2FkZHJsZW4pKTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXQ6Om9wZW4oKSB7CisgIGlmIChpc09wZW4oKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKKyAgICB1bml4X29wZW4oKTsKKyAgfSBlbHNlIHsKKyAgICBsb2NhbF9vcGVuKCk7CisgIH0KK30KKwordm9pZCBUU29ja2V0Ojp1bml4X29wZW4oKSB7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgeworICAgIC8vIFVuaXggRG9tYWluIFNPY2tldCBkb2VzIG5vdCBuZWVkIGFkZHJpbmZvIHN0cnVjdCwgc28gd2UgcGFzcyBOVUxMCisgICAgb3BlbkNvbm5lY3Rpb24oTlVMTCk7CisgIH0KK30KKwordm9pZCBUU29ja2V0Ojpsb2NhbF9vcGVuKCkgeworCisjaWZkZWYgX1dJTjMyCisgIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZiAvLyBfV0lOMzIKKworICBpZiAoaXNPcGVuKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAocG9ydF8gPCAwIHx8IHBvcnRfID4gMHhGRkZGKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKKyAgfQorCisgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlczA7CisgIHJlcyA9IE5VTEw7CisgIHJlczAgPSBOVUxMOworICBpbnQgZXJyb3I7CisgIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOworICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7CisgIHNwcmludGYocG9ydCwgIiVkIiwgcG9ydF8pOworCisgIGVycm9yID0gZ2V0YWRkcmluZm8oaG9zdF8uY19zdHIoKSwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7CisKKyNpZmRlZiBfV0lOMzIKKyAgaWYgKGVycm9yID09IFdTQU5PX0RBVEEpIHsKKyAgICBoaW50cy5haV9mbGFncyAmPSB+QUlfQUREUkNPTkZJRzsKKyAgICBlcnJvciA9IGdldGFkZHJpbmZvKGhvc3RfLmNfc3RyKCksIHBvcnQsICZoaW50cywgJnJlczApOworICB9CisjZW5kaWYKKworICBpZiAoZXJyb3IpIHsKKyAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXQ6Om9wZW4oKSBnZXRhZGRyaW5mbygpICIgKyBnZXRTb2NrZXRJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcoVEhSSUZUX0dBSV9TVFJFUlJPUihlcnJvcikpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIGNsaWVudCBzb2NrZXQuIik7CisgIH0KKworICAvLyBDeWNsZSB0aHJvdWdoIGFsbCB0aGUgcmV0dXJuZWQgYWRkcmVzc2VzIHVudGlsIG9uZQorICAvLyBjb25uZWN0cyBvciBwdXNoIHRoZSBleGNlcHRpb24gdXAuCisgIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgICB0cnkgeworICAgICAgb3BlbkNvbm5lY3Rpb24ocmVzKTsKKyAgICAgIGJyZWFrOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICBpZiAocmVzLT5haV9uZXh0KSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBmcmVlYWRkcmluZm8ocmVzMCk7IC8vIGNsZWFudXAgb24gZmFpbHVyZQorICAgICAgICB0aHJvdzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBGcmVlIGFkZHJlc3Mgc3RydWN0dXJlIG1lbW9yeQorICBmcmVlYWRkcmluZm8ocmVzMCk7Cit9CisKK3ZvaWQgVFNvY2tldDo6Y2xvc2UoKSB7CisgIGlmIChzb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHNodXRkb3duKHNvY2tldF8sIFRIUklGVF9TSFVUX1JEV1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNvY2tldF8pOworICB9CisgIHNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0U29ja2V0RkQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpIHsKKyAgaWYgKHNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgY2xvc2UoKTsKKyAgfQorICBzb2NrZXRfID0gc29ja2V0OworfQorCit1aW50MzJfdCBUU29ja2V0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBzb2NrZXQiKTsKKyAgfQorCisgIGludDMyX3QgcmV0cmllcyA9IDA7CisKKyAgLy8gVEhSSUZUX0VBR0FJTiBjYW4gYmUgc2lnbmFsbGVkIGJvdGggd2hlbiBhIHRpbWVvdXQgaGFzIG9jY3VycmVkIGFuZCB3aGVuCisgIC8vIHRoZSBzeXN0ZW0gaXMgb3V0IG9mIHJlc291cmNlcyAoYW4gYXdlc29tZSB1bmRvY3VtZW50ZWQgZmVhdHVyZSkuCisgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgdGltZSBpbnRlcnZhbCB1bmRlciB3aGljaAorICAvLyBUSFJJRlRfRUFHQUlOIGlzIHRha2VuIHRvIGluZGljYXRlIGFuIG91dCBvZiByZXNvdXJjZXMgZXJyb3IuCisgIHVpbnQzMl90IGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IDA7CisgIGlmIChyZWN2VGltZW91dF8pIHsKKyAgICAvLyBpZiBhIHJlYWRUaW1lb3V0IGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGEgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMsIHRoZW4KKyAgICAvLyB0aGUgdGhyZXNob2xkIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlYWQgdGltZW91dCBpcyBub3QgZXhjZWVkZWQgZXZlbiBpbiB0aGUKKyAgICAvLyBjYXNlIG9mIHJlc291cmNlIGVycm9ycworICAgIGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IChyZWN2VGltZW91dF8gKiAxMDAwKSAvICgobWF4UmVjdlJldHJpZXNfID4gMCkgPyBtYXhSZWN2UmV0cmllc18gOiAyKTsKKyAgfQorCit0cnlfYWdhaW46CisgIC8vIFJlYWQgZnJvbSB0aGUgc29ja2V0CisgIHN0cnVjdCB0aW1ldmFsIGJlZ2luOworICBpZiAocmVjdlRpbWVvdXRfID4gMCkgeworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmJlZ2luLCBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBpZiB0aGVyZSBpcyBubyByZWFkIHRpbWVvdXQgd2UgZG9uJ3QgbmVlZCB0aGUgVE9EIHRvIGRldGVybWluZSB3aGV0aGVyCisgICAgLy8gYW4gVEhSSUZUX0VBR0FJTiBpcyBkdWUgdG8gYSB0aW1lb3V0IG9yIGFuIG91dC1vZi1yZXNvdXJjZSBjb25kaXRpb24uCisgICAgYmVnaW4udHZfc2VjID0gYmVnaW4udHZfdXNlYyA9IDA7CisgIH0KKworICBpbnQgZ290ID0gMDsKKworICBpZiAoaW50ZXJydXB0TGlzdGVuZXJfKSB7CisgICAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworICAgIHN0ZDo6bWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICAgIGZkc1swXS5mZCA9IHNvY2tldF87CisgICAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgZmRzWzFdLmZkID0gKihpbnRlcnJ1cHRMaXN0ZW5lcl8uZ2V0KCkpOworICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworCisgICAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgMiwgKHJlY3ZUaW1lb3V0XyA9PSAwKSA/IC0xIDogcmVjdlRpbWVvdXRfKTsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgICAgfQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgIGlmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgIkludGVycnVwdGVkIik7CisgICAgICB9CisgICAgfSBlbHNlIC8qIHJldCA9PSAwICovIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX0VBR0FJTiAodGltZWQgb3V0KSIpOworICAgIH0KKworICAgIC8vIGZhbGxpbmcgdGhyb3VnaCBtZWFucyB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVjdiBhbmQgaXQgY2Fubm90IGJsb2NrCisgIH0KKworICBnb3QgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlY3Yoc29ja2V0XywgY2FzdF9zb2Nrb3B0KGJ1ZiksIGxlbiwgMCkpOworICAvLyBUSFJJRlRfR0VUVElNRU9GREFZIGNhbiBjaGFuZ2UgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IKKyAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKworICAvLyBDaGVjayBmb3IgZXJyb3Igb24gcmVhZAorICBpZiAoZ290IDwgMCkgeworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQUdBSU4pIHsKKyAgICAgIC8vIGlmIG5vIHRpbWVvdXQgd2UgY2FuIGFzc3VtZSB0aGF0IHJlc291cmNlIGV4aGF1c3Rpb24gaGFzIG9jY3VycmVkLgorICAgICAgaWYgKHJlY3ZUaW1lb3V0XyA9PSAwKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpIik7CisgICAgICB9CisgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsYWNrIG9mIHJlc291cmNlcyBvciB0aW1lb3V0IGNhc2UKKyAgICAgIHN0cnVjdCB0aW1ldmFsIGVuZDsKKyAgICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmVuZCwgTlVMTCk7CisgICAgICB1aW50MzJfdCByZWFkRWxhcHNlZE1pY3JvcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigoKGVuZC50dl9zZWMgLSBiZWdpbi50dl9zZWMpICogMTAwMCAqIDEwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChlbmQudHZfdXNlYyAtIGJlZ2luLnR2X3VzZWMpKTsKKworICAgICAgaWYgKCFlYWdhaW5UaHJlc2hvbGRNaWNyb3MgfHwgKHJlYWRFbGFwc2VkTWljcm9zIDwgZWFnYWluVGhyZXNob2xkTWljcm9zKSkgeworICAgICAgICBpZiAocmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoNTApOworICAgICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9FQUdBSU4gKHVuYXZhaWxhYmxlIHJlc291cmNlcykiKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gaW5mZXIgdGhhdCB0aW1lb3V0IGhhcyBiZWVuIGhpdAorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIlRIUklGVF9FQUdBSU4gKHRpbWVkIG91dCkiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgZ290byB0cnlfYWdhaW47CisgICAgfQorCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFRoaXMgaXNoIGlzbid0IG9wZW4KKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRU5PVENPTk4pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfRU5PVENPTk4iKTsKKyAgICB9CisKKyAgICAvLyBUaW1lZCBvdXQhCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VUSU1FRE9VVCkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJUSFJJRlRfRVRJTUVET1VUIik7CisgICAgfQorCisgICAgLy8gTm93IGl0J3Mgbm90IGEgdHJ5IGFnYWluIGNhc2UsIGJ1dCBhIHJlYWwgcHJvYmJsZXoKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpyZWFkKCkgcmVjdigpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworCisgICAgLy8gU29tZSBvdGhlciBlcnJvciwgd2hhdGV2egorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgfQorCisgIHJldHVybiBnb3Q7Cit9CisKK3ZvaWQgVFNvY2tldDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3Qgc2VudCA9IDA7CisKKyAgd2hpbGUgKHNlbnQgPCBsZW4pIHsKKyAgICB1aW50MzJfdCBiID0gd3JpdGVfcGFydGlhbChidWYgKyBzZW50LCBsZW4gLSBzZW50KTsKKyAgICBpZiAoYiA9PSAwKSB7CisgICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGUgdGltZW91dCBzZXQgd2l0aCBTT19TTkRUSU1FTyBleHBpcmVkLgorICAgICAgLy8gUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJzZW5kIHRpbWVvdXQgZXhwaXJlZCIpOworICAgIH0KKyAgICBzZW50ICs9IGI7CisgIH0KK30KKwordWludDMyX3QgVFNvY2tldDo6d3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHNvY2tldCIpOworICB9CisKKyAgdWludDMyX3Qgc2VudCA9IDA7CisKKyAgaW50IGZsYWdzID0gMDsKKyNpZmRlZiBNU0dfTk9TSUdOQUwKKyAgLy8gTm90ZSB0aGUgdXNlIG9mIE1TR19OT1NJR05BTCB0byBzdXBwcmVzcyBTSUdQSVBFIGVycm9ycywgaW5zdGVhZCB3ZQorICAvLyBjaGVjayBmb3IgdGhlIFRIUklGVF9FUElQRSByZXR1cm4gY29uZGl0aW9uIGFuZCBjbG9zZSB0aGUgc29ja2V0IGluIHRoYXQgY2FzZQorICBmbGFncyB8PSBNU0dfTk9TSUdOQUw7CisjZW5kaWYgLy8gaWZkZWYgTVNHX05PU0lHTkFMCisKKyAgaW50IGIgPSBzdGF0aWNfY2FzdDxpbnQ+KHNlbmQoc29ja2V0XywgY29uc3RfY2FzdF9zb2Nrb3B0KGJ1ZiArIHNlbnQpLCBsZW4gLSBzZW50LCBmbGFncykpOworCisgIGlmIChiIDwgMCkgeworICAgIGlmIChUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA9PSBUSFJJRlRfRVdPVUxEQkxPQ0sgfHwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgPT0gVEhSSUZUX0VBR0FJTikgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIEZhaWwgb24gYSBzZW5kIGVycm9yCisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0Ojp3cml0ZV9wYXJ0aWFsKCkgc2VuZCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworCisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VQSVBFIHx8IGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQKKyAgICAgICAgfHwgZXJybm9fY29weSA9PSBUSFJJRlRfRU5PVENPTk4pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJ3cml0ZSgpIHNlbmQoKSIsIGVycm5vX2NvcHkpOworICAgIH0KKworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIndyaXRlKCkgc2VuZCgpIiwgZXJybm9fY29weSk7CisgIH0KKworICAvLyBGYWlsIG9uIGJsb2NrZWQgc2VuZAorICBpZiAoYiA9PSAwKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlNvY2tldCBzZW5kIHJldHVybmVkIDAuIik7CisgIH0KKyAgcmV0dXJuIGI7Cit9CisKK3N0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldEhvc3QoKSB7CisgIHJldHVybiBob3N0XzsKK30KKworaW50IFRTb2NrZXQ6OmdldFBvcnQoKSB7CisgIHJldHVybiBwb3J0XzsKK30KKwordm9pZCBUU29ja2V0OjpzZXRIb3N0KHN0cmluZyBob3N0KSB7CisgIGhvc3RfID0gaG9zdDsKK30KKwordm9pZCBUU29ja2V0OjpzZXRQb3J0KGludCBwb3J0KSB7CisgIHBvcnRfID0gcG9ydDsKK30KKwordm9pZCBUU29ja2V0OjpzZXRMaW5nZXIoYm9vbCBvbiwgaW50IGxpbmdlcikgeworICBsaW5nZXJPbl8gPSBvbjsKKyAgbGluZ2VyVmFsXyA9IGxpbmdlcjsKKyAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgcmV0dXJuOworICB9CisKKyNpZm5kZWYgX1dJTjMyCisgIHN0cnVjdCBsaW5nZXIgbCA9IHsobGluZ2VyT25fID8gMSA6IDApLCBsaW5nZXJWYWxffTsKKyNlbHNlCisgIHN0cnVjdCBsaW5nZXIgbCA9IHtzdGF0aWNfY2FzdDx1X3Nob3J0PihsaW5nZXJPbl8gPyAxIDogMCksIHN0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlclZhbF8pfTsKKyNlbmRpZgorCisgIGludCByZXQgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgY2FzdF9zb2Nrb3B0KCZsKSwgc2l6ZW9mKGwpKTsKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRMaW5nZXIoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgIH0KK30KKwordm9pZCBUU29ja2V0OjpzZXROb0RlbGF5KGJvb2wgbm9EZWxheSkgeworICBub0RlbGF5XyA9IG5vRGVsYXk7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCB8fCAhcGF0aF8uZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNldCBzb2NrZXQgdG8gTk9ERUxBWQorICBpbnQgdiA9IG5vRGVsYXlfID8gMSA6IDA7CisgIGludCByZXQgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY2FzdF9zb2Nrb3B0KCZ2KSwgc2l6ZW9mKHYpKTsKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXROb0RlbGF5KCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0Q29ublRpbWVvdXQoaW50IG1zKSB7CisgIGNvbm5UaW1lb3V0XyA9IG1zOworfQorCit2b2lkIHNldEdlbmVyaWNUaW1lb3V0KFRIUklGVF9TT0NLRVQgcywgaW50IHRpbWVvdXRfbXMsIGludCBvcHRuYW1lKSB7CisgIGlmICh0aW1lb3V0X21zIDwgMCkgeworICAgIGNoYXIgZXJyQnVmWzUxMl07CisgICAgc3ByaW50ZihlcnJCdWYsICJUU29ja2V0OjpzZXRHZW5lcmljVGltZW91dCB3aXRoIG5lZ2F0aXZlIGlucHV0OiAlZFxuIiwgdGltZW91dF9tcyk7CisgICAgR2xvYmFsT3V0cHV0KGVyckJ1Zik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHMgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgcmV0dXJuOworICB9CisKKyNpZmRlZiBfV0lOMzIKKyAgRFdPUkQgcGxhdGZvcm1fdGltZSA9IHN0YXRpY19jYXN0PERXT1JEPih0aW1lb3V0X21zKTsKKyNlbHNlCisgIHN0cnVjdCB0aW1ldmFsIHBsYXRmb3JtX3RpbWUgPSB7KGludCkodGltZW91dF9tcyAvIDEwMDApLCAoaW50KSgodGltZW91dF9tcyAlIDEwMDApICogMTAwMCl9OworI2VuZGlmCisKKyAgaW50IHJldCA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgb3B0bmFtZSwgY2FzdF9zb2Nrb3B0KCZwbGF0Zm9ybV90aW1lKSwgc2l6ZW9mKHBsYXRmb3JtX3RpbWUpKTsKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRHZW5lcmljVGltZW91dCgpIHNldHNvY2tvcHQoKSAiLCBlcnJub19jb3B5KTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCBtcykgeworICBzZXRHZW5lcmljVGltZW91dChzb2NrZXRfLCBtcywgU09fUkNWVElNRU8pOworICByZWN2VGltZW91dF8gPSBtczsKK30KKwordm9pZCBUU29ja2V0OjpzZXRTZW5kVGltZW91dChpbnQgbXMpIHsKKyAgc2V0R2VuZXJpY1RpbWVvdXQoc29ja2V0XywgbXMsIFNPX1NORFRJTUVPKTsKKyAgc2VuZFRpbWVvdXRfID0gbXM7Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKSB7CisgIGtlZXBBbGl2ZV8gPSBrZWVwQWxpdmU7CisKKyAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IHZhbHVlID0ga2VlcEFsaXZlXzsKKyAgaW50IHJldAorICAgICAgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZ2YWx1ZSksIHNpemVvZih2YWx1ZSkpOworCisgIGlmIChyZXQgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weQorICAgICAgICA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAvLyBDb3B5IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0S2VlcEFsaXZlKCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICB9Cit9CisKK3ZvaWQgVFNvY2tldDo6c2V0TWF4UmVjdlJldHJpZXMoaW50IG1heFJlY3ZSZXRyaWVzKSB7CisgIG1heFJlY3ZSZXRyaWVzXyA9IG1heFJlY3ZSZXRyaWVzOworfQorCitzdHJpbmcgVFNvY2tldDo6Z2V0U29ja2V0SW5mbygpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICBpZiAoaG9zdF8uZW1wdHkoKSB8fCBwb3J0XyA9PSAwKSB7CisgICAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGdldFBlZXJBZGRyZXNzKCk7CisgICAgICBvc3MgPDwgIiBQb3J0OiAiIDw8IGdldFBlZXJQb3J0KCkgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGhvc3RfIDw8ICIgUG9ydDogIiA8PCBwb3J0XyA8PCAiPiI7CisgICAgfQorICB9IGVsc2UgeworICAgIG9zcyA8PCAiPFBhdGg6ICIgPDwgcGF0aF8gPDwgIj4iOworICB9CisgIHJldHVybiBvc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldFBlZXJIb3N0KCkgeworICBpZiAocGVlckhvc3RfLmVtcHR5KCkgJiYgcGF0aF8uZW1wdHkoKSkgeworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyKiBhZGRyUHRyOworICAgIHNvY2tsZW5fdCBhZGRyTGVuOworCisgICAgaWYgKHNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgICByZXR1cm4gaG9zdF87CisgICAgfQorCisgICAgYWRkclB0ciA9IGdldENhY2hlZEFkZHJlc3MoJmFkZHJMZW4pOworCisgICAgaWYgKGFkZHJQdHIgPT0gTlVMTCkgeworICAgICAgYWRkckxlbiA9IHNpemVvZihhZGRyKTsKKyAgICAgIGlmIChnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSZhZGRyLCAmYWRkckxlbikgIT0gMCkgeworICAgICAgICByZXR1cm4gcGVlckhvc3RfOworICAgICAgfQorICAgICAgYWRkclB0ciA9IChzb2NrYWRkciopJmFkZHI7CisKKyAgICAgIHNldENhY2hlZEFkZHJlc3MoYWRkclB0ciwgYWRkckxlbik7CisgICAgfQorCisgICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOworICAgIGNoYXIgY2xpZW50c2VydmljZVtOSV9NQVhTRVJWXTsKKworICAgIGdldG5hbWVpbmZvKChzb2NrYWRkciopYWRkclB0ciwKKyAgICAgICAgICAgICAgICBhZGRyTGVuLAorICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudGhvc3QpLAorICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudHNlcnZpY2UpLAorICAgICAgICAgICAgICAgIDApOworCisgICAgcGVlckhvc3RfID0gY2xpZW50aG9zdDsKKyAgfQorICByZXR1cm4gcGVlckhvc3RfOworfQorCitzdGQ6OnN0cmluZyBUU29ja2V0OjpnZXRQZWVyQWRkcmVzcygpIHsKKyAgaWYgKHBlZXJBZGRyZXNzXy5lbXB0eSgpICYmIHBhdGhfLmVtcHR5KCkpIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworICAgIHN0cnVjdCBzb2NrYWRkciogYWRkclB0cjsKKyAgICBzb2NrbGVuX3QgYWRkckxlbjsKKworICAgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgICAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKKyAgICB9CisKKyAgICBhZGRyUHRyID0gZ2V0Q2FjaGVkQWRkcmVzcygmYWRkckxlbik7CisKKyAgICBpZiAoYWRkclB0ciA9PSBOVUxMKSB7CisgICAgICBhZGRyTGVuID0gc2l6ZW9mKGFkZHIpOworICAgICAgaWYgKGdldHBlZXJuYW1lKHNvY2tldF8sIChzb2NrYWRkciopJmFkZHIsICZhZGRyTGVuKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBwZWVyQWRkcmVzc187CisgICAgICB9CisgICAgICBhZGRyUHRyID0gKHNvY2thZGRyKikmYWRkcjsKKworICAgICAgc2V0Q2FjaGVkQWRkcmVzcyhhZGRyUHRyLCBhZGRyTGVuKTsKKyAgICB9CisKKyAgICBjaGFyIGNsaWVudGhvc3RbTklfTUFYSE9TVF07CisgICAgY2hhciBjbGllbnRzZXJ2aWNlW05JX01BWFNFUlZdOworCisgICAgZ2V0bmFtZWluZm8oYWRkclB0ciwKKyAgICAgICAgICAgICAgICBhZGRyTGVuLAorICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudGhvc3QpLAorICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNsaWVudHNlcnZpY2UpLAorICAgICAgICAgICAgICAgIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpOworCisgICAgcGVlckFkZHJlc3NfID0gY2xpZW50aG9zdDsKKyAgICBwZWVyUG9ydF8gPSBzdGQ6OmF0b2koY2xpZW50c2VydmljZSk7CisgIH0KKyAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKK30KKworaW50IFRTb2NrZXQ6OmdldFBlZXJQb3J0KCkgeworICBnZXRQZWVyQWRkcmVzcygpOworICByZXR1cm4gcGVlclBvcnRfOworfQorCit2b2lkIFRTb2NrZXQ6OnNldENhY2hlZEFkZHJlc3MoY29uc3Qgc29ja2FkZHIqIGFkZHIsIHNvY2tsZW5fdCBsZW4pIHsKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKKyAgY2FzZSBBRl9JTkVUOgorICAgIGlmIChsZW4gPT0gc2l6ZW9mKHNvY2thZGRyX2luKSkgeworICAgICAgbWVtY3B5KCh2b2lkKikmY2FjaGVkUGVlckFkZHJfLmlwdjQsICh2b2lkKilhZGRyLCBsZW4pOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIEFGX0lORVQ2OgorICAgIGlmIChsZW4gPT0gc2l6ZW9mKHNvY2thZGRyX2luNikpIHsKKyAgICAgIG1lbWNweSgodm9pZCopJmNhY2hlZFBlZXJBZGRyXy5pcHY2LCAodm9pZCopYWRkciwgbGVuKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcGVlckFkZHJlc3NfLmNsZWFyKCk7CisgIHBlZXJIb3N0Xy5jbGVhcigpOworfQorCitzb2NrYWRkciogVFNvY2tldDo6Z2V0Q2FjaGVkQWRkcmVzcyhzb2NrbGVuX3QqIGxlbikgY29uc3QgeworICBzd2l0Y2ggKGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkpIHsKKyAgY2FzZSBBRl9JTkVUOgorICAgICpsZW4gPSBzaXplb2Yoc29ja2FkZHJfaW4pOworICAgIHJldHVybiAoc29ja2FkZHIqKSZjYWNoZWRQZWVyQWRkcl8uaXB2NDsKKworICBjYXNlIEFGX0lORVQ2OgorICAgICpsZW4gPSBzaXplb2Yoc29ja2FkZHJfaW42KTsKKyAgICByZXR1cm4gKHNvY2thZGRyKikmY2FjaGVkUGVlckFkZHJfLmlwdjY7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitib29sIFRTb2NrZXQ6OnVzZUxvd01pblJ0b18gPSBmYWxzZTsKK3ZvaWQgVFNvY2tldDo6c2V0VXNlTG93TWluUnRvKGJvb2wgdXNlTG93TWluUnRvKSB7CisgIHVzZUxvd01pblJ0b18gPSB1c2VMb3dNaW5SdG87Cit9Citib29sIFRTb2NrZXQ6OmdldFVzZUxvd01pblJ0bygpIHsKKyAgcmV0dXJuIHVzZUxvd01pblJ0b187Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nIFRTb2NrZXQ6OmdldE9yaWdpbigpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgb3NzIDw8IGdldFBlZXJIb3N0KCkgPDwgIjoiIDw8IGdldFBlZXJQb3J0KCk7CisgIHJldHVybiBvc3Muc3RyKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzMGQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfIDEKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisKKyNpZmRlZiBIQVZFX0FSUEFfSU5FVF9ICisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogVENQIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICovCitjbGFzcyBUU29ja2V0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRTb2NrZXQ+IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgKiBzb2NrZXQuCisgICAqCisgICAqLworICBUU29ja2V0KCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgKiBzb2NrZXQuCisgICAqCisgICAqIEBwYXJhbSBob3N0IEFuIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUgdG8gY29ubmVjdCB0bworICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAqLworICBUU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgVW5peCBkb21haW4gc29ja2V0LgorICAgKiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZSBzb2NrZXQuCisgICAqCisgICAqIEBwYXJhbSBwYXRoIFRoZSBVbml4IGRvbWFpbiBzb2NrZXQgZS5nLiAiL3RtcC9UaHJpZnRUZXN0LmJpbmFyeS50aHJpZnQiCisgICAqLworICBUU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKworICAvKioKKyAgICogRGVzdHJveWVzIHRoZSBzb2NrZXQgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KKyAgICovCisgIHZpcnR1YWwgflRTb2NrZXQoKTsKKworICAvKioKKyAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGFsaXZlLgorICAgKgorICAgKiBAcmV0dXJuIElzIHRoZSBzb2NrZXQgYWxpdmU/CisgICAqLworICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCk7CisKKyAgLyoqCisgICAqIENoZWNrcyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUgaW4gdGhlIHNvY2tldCB0byByZWFkLgorICAgKgorICAgKiBUaGlzIGNhbGwgYmxvY2tzIHVudGlsIGF0IGxlYXN0IG9uZSBieXRlIGlzIGF2YWlsYWJsZSBvciB0aGUgc29ja2V0IGlzIGNsb3NlZC4KKyAgICovCisgIHZpcnR1YWwgYm9vbCBwZWVrKCk7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBVTklYIHNvY2tldC4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIHRoZSBzb2NrZXQgY291bGQgbm90IGNvbm5lY3QKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvcGVuKCk7CisKKyAgLyoqCisgICAqIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHNvY2tldC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworCisgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgaXMgcGVuZGluZyBkYXRhIHRvIHJlYWQgb3Igbm90LgorICAgKgorICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgYmxvY2suCisgICAqIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICogICAgICAgICAgIE5PVF9PUEVOIG1lYW5zIHRoZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkCisgICAqICAgICAgICAgICBVTktOT1dOIG1lYW5zIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbmVkCisgICAqIFxyZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgcGVuZGluZyBkYXRhIHRvIHJlYWQsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCBib29sIGhhc1BlbmRpbmdEYXRhVG9SZWFkKCk7CisKKyAgLyoqCisgICAqIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0LgorICAgKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgMCBpbmRpY2F0ZXMgRU9GCisgICAqIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICogICAgICAgICAgIElOVEVSUlVQVEVEIG1lYW5zIHRoZSBzb2NrZXQgd2FzIGludGVycnVwdGVkCisgICAqICAgICAgICAgICAgICAgICAgICAgICBvdXQgb2YgYSBibG9ja2luZyBjYWxsCisgICAqICAgICAgICAgICBOT1RfT1BFTiBtZWFucyB0aGUgc29ja2V0IGhhcyBiZWVuIGNsb3NlZAorICAgKiAgICAgICAgICAgVElNRURfT1VUIG1lYW5zIHRoZSByZWNlaXZlIHRpbWVvdXQgZXhwaXJlZAorICAgKiAgICAgICAgICAgVU5LTk9XTiBtZWFucyBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZAorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICAvKioKKyAgICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIExvb3BzIHVudGlsIGRvbmUgb3IgZmFpbC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgLyoqCisgICAqIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBEb2VzIHNpbmdsZSBzZW5kKCkgYW5kIHJldHVybnMgcmVzdWx0LgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKworICAvKioKKyAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICoKKyAgICogQHJldHVybiBzdHJpbmcgaG9zdCBpZGVudGlmaWVyCisgICAqLworICBzdGQ6OnN0cmluZyBnZXRIb3N0KCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgcG9ydCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAqCisgICAqIEByZXR1cm4gaW50IHBvcnQgbnVtYmVyCisgICAqLworICBpbnQgZ2V0UG9ydCgpOworCisgIC8qKgorICAgKiBTZXQgdGhlIGhvc3QgdGhhdCBzb2NrZXQgd2lsbCBjb25uZWN0IHRvCisgICAqCisgICAqIEBwYXJhbSBob3N0IGhvc3QgaWRlbnRpZmllcgorICAgKi8KKyAgdm9pZCBzZXRIb3N0KHN0ZDo6c3RyaW5nIGhvc3QpOworCisgIC8qKgorICAgKiBTZXQgdGhlIHBvcnQgdGhhdCBzb2NrZXQgd2lsbCBjb25uZWN0IHRvCisgICAqCisgICAqIEBwYXJhbSBwb3J0IHBvcnQgbnVtYmVyCisgICAqLworICB2b2lkIHNldFBvcnQoaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBsaW5nZXIgb3B0aW9uIGlzIHNldCBvbiB0aGUgc29ja2V0LgorICAgKgorICAgKiBAcGFyYW0gb24gICAgICBXaGV0aGVyIFNPX0xJTkdFUiBpcyBvbgorICAgKiBAcGFyYW0gbGluZ2VyICBJZiBsaW5nZXIgaXMgYWN0aXZlLCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gbGluZ2VyIGZvcgorICAgKi8KKyAgdm9pZCBzZXRMaW5nZXIoYm9vbCBvbiwgaW50IGxpbmdlcik7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gZW5hYmxlL2Rpc2FibGUgTmFnbGUncyBhbGdvcml0aG0uCisgICAqCisgICAqIEBwYXJhbSBub0RlbGF5IFdoZXRoZXIgb3Igbm90IHRvIGRpc2FibGUgdGhlIGFsZ29yaXRobS4KKyAgICogQHJldHVybgorICAgKi8KKyAgdm9pZCBzZXROb0RlbGF5KGJvb2wgbm9EZWxheSk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgY29ubmVjdCB0aW1lb3V0CisgICAqLworICB2b2lkIHNldENvbm5UaW1lb3V0KGludCBtcyk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgcmVjZWl2ZSB0aW1lb3V0CisgICAqLworICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCBtcyk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgc2VuZCB0aW1lb3V0CisgICAqLworICB2b2lkIHNldFNlbmRUaW1lb3V0KGludCBtcyk7CisKKyAgLyoqCisgICAqIFNldCB0aGUgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMgaW4gY2FzZSBvZiBhbiBUSFJJRlRfRUFHQUlOCisgICAqIGVycm9yCisgICAqLworICB2b2lkIHNldE1heFJlY3ZSZXRyaWVzKGludCBtYXhSZWN2UmV0cmllcyk7CisKKyAgLyoqCisgICAqIFNldCBTT19LRUVQQUxJVkUKKyAgICovCisgIHZvaWQgc2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKTsKKworICAvKioKKyAgICogR2V0IHNvY2tldCBpbmZvcm1hdGlvbiBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KKyAgICovCisgIHN0ZDo6c3RyaW5nIGdldFNvY2tldEluZm8oKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgRE5TIG5hbWUgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICovCisgIHN0ZDo6c3RyaW5nIGdldFBlZXJIb3N0KCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICovCisgIHN0ZDo6c3RyaW5nIGdldFBlZXJBZGRyZXNzKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHBvcnQgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICoqLworICBpbnQgZ2V0UGVlclBvcnQoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yLgorICAgKi8KKyAgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIHNvY2tldF87IH0KKworICAvKioKKyAgICogKFJlLSlpbml0aWFsaXplIGEgVFNvY2tldCBmb3IgdGhlIHN1cHBsaWVkIGRlc2NyaXB0b3IuICBUaGlzIGlzIG9ubHkKKyAgICogaW50ZW5kZWQgZm9yIHVzZSBieSBUTm9uYmxvY2tpbmdTZXJ2ZXIgLS0gb3RoZXIgdXNlIG1heSByZXN1bHQgaW4KKyAgICogdW5mb3J0dW5hdGUgc3VycHJpc2VzLgorICAgKgorICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGFscmVhZHktY29ubmVjdGVkIHNvY2tldAorICAgKi8KKyAgdm9pZCBzZXRTb2NrZXRGRChUSFJJRlRfU09DS0VUIGZkKTsKKworICAvKgorICAgKiBSZXR1cm5zIGEgY2FjaGVkIGNvcHkgb2YgdGhlIHBlZXIgYWRkcmVzcy4KKyAgICovCisgIHNvY2thZGRyKiBnZXRDYWNoZWRBZGRyZXNzKHNvY2tsZW5fdCogbGVuKSBjb25zdDsKKworICAvKioKKyAgICogU2V0cyB3aGV0aGVyIHRvIHVzZSBhIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0LgorICAgKi8KKyAgc3RhdGljIHZvaWQgc2V0VXNlTG93TWluUnRvKGJvb2wgdXNlTG93TWluUnRvKTsKKworICAvKioKKyAgICogR2V0cyB3aGV0aGVyIHRvIHVzZSBhIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0LgorICAgKi8KKyAgc3RhdGljIGJvb2wgZ2V0VXNlTG93TWluUnRvKCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgb3JpZ2luIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAqCisgICAqIEByZXR1cm4gc3RyaW5nIHBlZXIgaG9zdCBpZGVudGlmaWVyIGFuZCBwb3J0CisgICAqLworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gZmlsZSBkZXNjcmlwdG9yLgorICAgKi8KKyAgVFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBmaWxlIGRlc2NyaXB0b3IgdGhhdAorICAgKiBjYW4gYmUgaW50ZXJydXB0ZWQgc2FmZWx5LgorICAgKi8KKyAgVFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKworICAvKioKKyAgICogU2V0IGEgY2FjaGUgb2YgdGhlIHBlZXIgYWRkcmVzcyAodXNlZCB3aGVuIHRyaXZpYWxseSBhdmFpbGFibGU6IGUuZy4KKyAgICogYWNjZXB0KCkgb3IgY29ubmVjdCgpKS4gT25seSBjYWNoZXMgSVBWNCBhbmQgSVBWNjsgdW5zZXQgZm9yIG90aGVycy4KKyAgICovCisgIHZvaWQgc2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGxlbik7CisKK3Byb3RlY3RlZDoKKyAgLyoqIGNvbm5lY3QsIGNhbGxlZCBieSBvcGVuICovCisgIHZvaWQgb3BlbkNvbm5lY3Rpb24oc3RydWN0IGFkZHJpbmZvKiByZXMpOworCisgIC8qKiBIb3N0IHRvIGNvbm5lY3QgdG8gKi8KKyAgc3RkOjpzdHJpbmcgaG9zdF87CisKKyAgLyoqIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3Qgb24gKi8KKyAgaW50IHBvcnRfOworCisgIC8qKiBVTklYIGRvbWFpbiBzb2NrZXQgcGF0aCAqLworICBzdGQ6OnN0cmluZyBwYXRoXzsKKworICAvKiogVW5kZXJseWluZyBzb2NrZXQgaGFuZGxlICovCisgIFRIUklGVF9TT0NLRVQgc29ja2V0XzsKKworICAvKiogUGVlciBob3N0bmFtZSAqLworICBzdGQ6OnN0cmluZyBwZWVySG9zdF87CisKKyAgLyoqIFBlZXIgYWRkcmVzcyAqLworICBzdGQ6OnN0cmluZyBwZWVyQWRkcmVzc187CisKKyAgLyoqIFBlZXIgcG9ydCAqLworICBpbnQgcGVlclBvcnRfOworCisgIC8qKgorICAgKiBBIHNoYXJlZCBzb2NrZXQgcG9pbnRlciB0aGF0IHdpbGwgaW50ZXJydXB0IGEgYmxvY2tpbmcgcmVhZCBpZiBkYXRhCisgICAqIGJlY29tZXMgYXZhaWxhYmxlIG9uIGl0CisgICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXJfOworCisgIC8qKiBDb25uZWN0IHRpbWVvdXQgaW4gbXMgKi8KKyAgaW50IGNvbm5UaW1lb3V0XzsKKworICAvKiogU2VuZCB0aW1lb3V0IGluIG1zICovCisgIGludCBzZW5kVGltZW91dF87CisKKyAgLyoqIFJlY3YgdGltZW91dCBpbiBtcyAqLworICBpbnQgcmVjdlRpbWVvdXRfOworCisgIC8qKiBLZWVwIGFsaXZlIG9uICovCisgIGJvb2wga2VlcEFsaXZlXzsKKworICAvKiogTGluZ2VyIG9uICovCisgIGJvb2wgbGluZ2VyT25fOworCisgIC8qKiBMaW5nZXIgdmFsICovCisgIGludCBsaW5nZXJWYWxfOworCisgIC8qKiBOb2RlbGF5ICovCisgIGJvb2wgbm9EZWxheV87CisKKyAgLyoqIFJlY3YgRUdBSU4gcmV0cmllcyAqLworICBpbnQgbWF4UmVjdlJldHJpZXNfOworCisgIC8qKiBDYWNoZWQgcGVlciBhZGRyZXNzICovCisgIHVuaW9uIHsKKyAgICBzb2NrYWRkcl9pbiBpcHY0OworICAgIHNvY2thZGRyX2luNiBpcHY2OworICB9IGNhY2hlZFBlZXJBZGRyXzsKKworICAvKiogV2hldGhlciB0byB1c2UgbG93IG1pbmltdW0gVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgKi8KKyAgc3RhdGljIGJvb2wgdXNlTG93TWluUnRvXzsKKworcHJpdmF0ZToKKyAgdm9pZCB1bml4X29wZW4oKTsKKyAgdm9pZCBsb2NhbF9vcGVuKCk7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3N2JiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTcwM0wKKyNpbmNsdWRlIDxyYW5kb20+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaD4KKwordXNpbmcgc3RkOjpwYWlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKKy8qKgorICogVFNvY2tldFBvb2xTZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAqCisgKi8KK1RTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcigpCisgIDogaG9zdF8oIiIpLCBwb3J0XygwKSwgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLCBsYXN0RmFpbFRpbWVfKDApLCBjb25zZWN1dGl2ZUZhaWx1cmVzXygwKSB7Cit9CisKKy8qKgorICogQ29uc3RydWN0b3IgZm9yIFRTb2NrZXRQb29sIHNlcnZlcgorICovCitUU29ja2V0UG9vbFNlcnZlcjo6VFNvY2tldFBvb2xTZXJ2ZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkKKyAgOiBob3N0Xyhob3N0KSwKKyAgICBwb3J0Xyhwb3J0KSwKKyAgICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgbGFzdEZhaWxUaW1lXygwKSwKKyAgICBjb25zZWN1dGl2ZUZhaWx1cmVzXygwKSB7Cit9CisKKy8qKgorICogVFNvY2tldFBvb2wgaW1wbGVtZW50YXRpb24uCisgKgorICovCisKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbCgpCisgIDogVFNvY2tldCgpLAorICAgIG51bVJldHJpZXNfKDEpLAorICAgIHJldHJ5SW50ZXJ2YWxfKDYwKSwKKyAgICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKKyAgICByYW5kb21pemVfKHRydWUpLAorICAgIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKK30KKworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBob3N0cywgY29uc3QgdmVjdG9yPGludD4mIHBvcnRzKQorICA6IFRTb2NrZXQoKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7CisgIGlmIChob3N0cy5zaXplKCkgIT0gcG9ydHMuc2l6ZSgpKSB7CisgICAgR2xvYmFsT3V0cHV0KCJUU29ja2V0UG9vbDo6VFNvY2tldFBvb2w6IGhvc3RzLnNpemUgIT0gcG9ydHMuc2l6ZSIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBob3N0cy5zaXplKCk7ICsraSkgeworICAgIGFkZFNlcnZlcihob3N0c1tpXSwgcG9ydHNbaV0pOworICB9Cit9CisKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4gPiYgc2VydmVycykKKyAgOiBUU29ja2V0KCksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgeworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2VydmVycy5zaXplKCk7ICsraSkgeworICAgIGFkZFNlcnZlcihzZXJ2ZXJzW2ldLmZpcnN0LCBzZXJ2ZXJzW2ldLnNlY29uZCk7CisgIH0KK30KKworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKQorICA6IFRTb2NrZXQoKSwKKyAgICBzZXJ2ZXJzXyhzZXJ2ZXJzKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7Cit9CisKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KQorICA6IFRTb2NrZXQoKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7CisgIGFkZFNlcnZlcihob3N0LCBwb3J0KTsKK30KKworVFNvY2tldFBvb2w6On5UU29ja2V0UG9vbCgpIHsKKyAgdmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzZXJ2ZXJzXy5iZWdpbigpOworICB2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlckVuZCA9IHNlcnZlcnNfLmVuZCgpOworICBmb3IgKDsgaXRlciAhPSBpdGVyRW5kOyArK2l0ZXIpIHsKKyAgICBzZXRDdXJyZW50U2VydmVyKCppdGVyKTsKKyAgICBUU29ja2V0UG9vbDo6Y2xvc2UoKTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXRQb29sOjphZGRTZXJ2ZXIoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkgeworICBzZXJ2ZXJzXy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4obmV3IFRTb2NrZXRQb29sU2VydmVyKGhvc3QsIHBvcnQpKSk7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OmFkZFNlcnZlcihzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyKSB7CisgIGlmIChzZXJ2ZXIpIHsKKyAgICBzZXJ2ZXJzXy5wdXNoX2JhY2soc2VydmVyKTsKKyAgfQorfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXRTZXJ2ZXJzKGNvbnN0IHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSB7CisgIHNlcnZlcnNfID0gc2VydmVyczsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6Z2V0U2VydmVycyh2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykgeworICBzZXJ2ZXJzID0gc2VydmVyc187Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldE51bVJldHJpZXMoaW50IG51bVJldHJpZXMpIHsKKyAgbnVtUmV0cmllc18gPSBudW1SZXRyaWVzOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKSB7CisgIHJldHJ5SW50ZXJ2YWxfID0gcmV0cnlJbnRlcnZhbDsKK30KKwordm9pZCBUU29ja2V0UG9vbDo6c2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcyhpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlcykgeworICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IG1heENvbnNlY3V0aXZlRmFpbHVyZXM7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldFJhbmRvbWl6ZShib29sIHJhbmRvbWl6ZSkgeworICByYW5kb21pemVfID0gcmFuZG9taXplOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpzZXRBbHdheXNUcnlMYXN0KGJvb2wgYWx3YXlzVHJ5TGFzdCkgeworICBhbHdheXNUcnlMYXN0XyA9IGFsd2F5c1RyeUxhc3Q7Cit9CisKK3ZvaWQgVFNvY2tldFBvb2w6OnNldEN1cnJlbnRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcikgeworICBjdXJyZW50U2VydmVyXyA9IHNlcnZlcjsKKyAgaG9zdF8gPSBzZXJ2ZXItPmhvc3RfOworICBwb3J0XyA9IHNlcnZlci0+cG9ydF87CisgIHNvY2tldF8gPSBzZXJ2ZXItPnNvY2tldF87Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHNvY2tldCBvcGVuIGZhaWxzLiBXaGVuIHNvY2tldAorICogb3BlbnMgZmFpbHMsIHRoZSBzb2NrZXQgaW4gdGhlIGN1cnJlbnQgc2VydmVyIGlzIHJlc2V0LgorICovCisvKiBUT0RPOiB3aXRob3V0IGFwYyB3ZSBpZ25vcmUgYSBsb3Qgb2YgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBwaHAgdmVyc2lvbiAqLwordm9pZCBUU29ja2V0UG9vbDo6b3BlbigpIHsKKworICBzaXplX3QgbnVtU2VydmVycyA9IHNlcnZlcnNfLnNpemUoKTsKKyAgaWYgKG51bVNlcnZlcnMgPT0gMCkgeworICAgIHNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgIH0KKworICBpZiAoaXNPcGVuKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocmFuZG9taXplXyAmJiBudW1TZXJ2ZXJzID4gMSkgeworI2lmIF9fY3BsdXNwbHVzID49IDIwMTcwM0wKKyAgICBzdGQ6OnJhbmRvbV9kZXZpY2Ugcm5nOworICAgIHN0ZDo6bXQxOTkzNyB1cm5nKHJuZygpKTsKKyAgICBzdGQ6OnNodWZmbGUoc2VydmVyc18uYmVnaW4oKSwgc2VydmVyc18uZW5kKCksIHVybmcpOworI2Vsc2UKKyAgICBzdGQ6OnJhbmRvbV9zaHVmZmxlKHNlcnZlcnNfLmJlZ2luKCksIHNlcnZlcnNfLmVuZCgpKTsKKyNlbmRpZgorICB9CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TZXJ2ZXJzOyArK2kpIHsKKworICAgIHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIgPSBzZXJ2ZXJzX1tpXTsKKyAgICAvLyBJbXBlcnNvbmF0ZSB0aGUgc2VydmVyIHNvY2tldAorICAgIHNldEN1cnJlbnRTZXJ2ZXIoc2VydmVyKTsKKworICAgIGlmIChpc09wZW4oKSkgeworICAgICAgLy8gYWxyZWFkeSBvcGVuIG1lYW5zIHdlJ3JlIGRvbmUKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSAoc2VydmVyLT5sYXN0RmFpbFRpbWVfID09IDApOworICAgIGJvb2wgaXNMYXN0U2VydmVyID0gYWx3YXlzVHJ5TGFzdF8gPyAoaSA9PSAobnVtU2VydmVycyAtIDEpKSA6IGZhbHNlOworCisgICAgaWYgKHNlcnZlci0+bGFzdEZhaWxUaW1lXyA+IDApIHsKKyAgICAgIC8vIFRoZSBzZXJ2ZXIgd2FzIG1hcmtlZCBhcyBkb3duLCBzbyBjaGVjayBpZiBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCB0byByZXRyeQorICAgICAgdGltZV90IGVsYXBzZWRUaW1lID0gdGltZShOVUxMKSAtIHNlcnZlci0+bGFzdEZhaWxUaW1lXzsKKyAgICAgIGlmIChlbGFwc2VkVGltZSA+IHJldHJ5SW50ZXJ2YWxfKSB7CisgICAgICAgIHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXRyeUludGVydmFsUGFzc2VkIHx8IGlzTGFzdFNlcnZlcikgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1SZXRyaWVzXzsgKytqKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgVFNvY2tldDo6b3BlbigpOworICAgICAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uICZlKSB7CisgICAgICAgICAgc3RyaW5nIGVyclN0ciA9ICJUU29ja2V0UG9vbDo6b3BlbiBmYWlsZWQgIiArIGdldFNvY2tldEluZm8oKSArICI6ICIgKyBlLndoYXQoKTsKKyAgICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgICAgICAgIHNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IG92ZXIgdGhlIG9wZW5lZCBzb2NrZXQgc28gdGhhdCB3ZSBjYW4ga2VlcCBpdCBwZXJzaXN0ZW50CisgICAgICAgIHNlcnZlci0+c29ja2V0XyA9IHNvY2tldF87CisgICAgICAgIC8vIHJlc2V0IGxhc3RGYWlsVGltZV8gaXMgcmVxdWlyZWQKKyAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gMDsKKyAgICAgICAgLy8gc3VjY2VzcworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgICsrc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXzsKKyAgICAgIGlmIChzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID4gbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKKyAgICAgICAgLy8gTWFyayBzZXJ2ZXIgYXMgZG93bgorICAgICAgICBzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID0gMDsKKyAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gdGltZShOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBHbG9iYWxPdXRwdXQoIlRTb2NrZXRQb29sOjpvcGVuOiBhbGwgY29ubmVjdGlvbnMgZmFpbGVkIik7CisgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworfQorCit2b2lkIFRTb2NrZXRQb29sOjpjbG9zZSgpIHsKKyAgVFNvY2tldDo6Y2xvc2UoKTsKKyAgaWYgKGN1cnJlbnRTZXJ2ZXJfKSB7CisgICAgY3VycmVudFNlcnZlcl8tPnNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjEwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUUE9PTF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUUE9PTF9IXyAxCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLyoqCisgKiBDbGFzcyB0byBob2xkIHNlcnZlciBpbmZvcm1hdGlvbiBmb3IgVFNvY2tldFBvb2wKKyAqCisgKi8KK2NsYXNzIFRTb2NrZXRQb29sU2VydmVyIHsKKworcHVibGljOgorICAvKioKKyAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc2VydmVyIGluZm8KKyAgICovCisgIFRTb2NrZXRQb29sU2VydmVyKCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIGZvciBUU29ja2V0UG9vbCBzZXJ2ZXIKKyAgICovCisgIFRTb2NrZXRQb29sU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisKKyAgLy8gSG9zdCBuYW1lCisgIHN0ZDo6c3RyaW5nIGhvc3RfOworCisgIC8vIFBvcnQgdG8gY29ubmVjdCBvbgorICBpbnQgcG9ydF87CisKKyAgLy8gU29ja2V0IGZvciB0aGUgc2VydmVyCisgIFRIUklGVF9TT0NLRVQgc29ja2V0XzsKKworICAvLyBMYXN0IHRpbWUgY29ubmVjdGluZyB0byB0aGlzIHNlcnZlciBmYWlsZWQKKyAgdGltZV90IGxhc3RGYWlsVGltZV87CisKKyAgLy8gTnVtYmVyIG9mIGNvbnNlY3V0aXZlIHRpbWVzIGNvbm5lY3RpbmcgdG8gdGhpcyBzZXJ2ZXIgZmFpbGVkCisgIGludCBjb25zZWN1dGl2ZUZhaWx1cmVzXzsKK307CisKKy8qKgorICogVENQIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICovCitjbGFzcyBUU29ja2V0UG9vbCA6IHB1YmxpYyBUU29ja2V0IHsKKworcHVibGljOgorICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICovCisgIFRTb2NrZXRQb29sKCk7CisKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBob3N0cyBsaXN0IG9mIGhvc3QgbmFtZXMKKyAgICogQHBhcmFtIHBvcnRzIGxpc3Qgb2YgcG9ydCBuYW1lcworICAgKi8KKyAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBob3N0cywgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcG9ydHMpOworCisgIC8qKgorICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIHBhaXJzIG9mIGhvc3QgbmFtZSBhbmQgcG9ydAorICAgKi8KKyAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+ID4mIHNlcnZlcnMpOworCisgIC8qKgorICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIFRTb2NrZXRQb29sU2VydmVycworICAgKi8KKyAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKKworICAvKioKKyAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIGhvc3Qgc2luZ2xlIGhvc3QKKyAgICogQHBhcmFtIHBvcnQgc2luZ2xlIHBvcnQKKyAgICovCisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIERlc3Ryb3llcyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCisgICAqLworICB2aXJ0dWFsIH5UU29ja2V0UG9vbCgpOworCisgIC8qKgorICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKKyAgICovCisgIHZvaWQgYWRkU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAorICAgKi8KKyAgdm9pZCBhZGRTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiYgc2VydmVyKTsKKworICAvKioKKyAgICogU2V0IGxpc3Qgb2Ygc2VydmVycyBpbiB0aGlzIHBvb2wKKyAgICovCisgIHZvaWQgc2V0U2VydmVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworCisgIC8qKgorICAgKiBHZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAorICAgKi8KKyAgdm9pZCBnZXRTZXJ2ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisKKyAgLyoqCisgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCisgICAqLworICB2b2lkIHNldE51bVJldHJpZXMoaW50IG51bVJldHJpZXMpOworCisgIC8qKgorICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgorICAgKi8KKyAgdm9pZCBzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKTsKKworICAvKioKKyAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgorICAgKi8KKyAgdm9pZCBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKTsKKworICAvKioKKyAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KKyAgICovCisgIHZvaWQgc2V0UmFuZG9taXplKGJvb2wgcmFuZG9taXplKTsKKworICAvKioKKyAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KKyAgICovCisgIHZvaWQgc2V0QWx3YXlzVHJ5TGFzdChib29sIGFsd2F5c1RyeUxhc3QpOworCisgIC8qKgorICAgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgVU5JWCBzb2NrZXQuCisgICAqLworICB2b2lkIG9wZW4oKTsKKworICAvKgorICAgKiBDbG9zZXMgdGhlIFVOSVggc29ja2V0CisgICAqLworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBzZXRDdXJyZW50U2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CisKKyAgLyoqIExpc3Qgb2Ygc2VydmVycyB0byBjb25uZWN0IHRvICovCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiBzZXJ2ZXJzXzsKKworICAvKiogQ3VycmVudCBzZXJ2ZXIgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiBjdXJyZW50U2VydmVyXzsKKworICAvKiogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QgKi8KKyAgaW50IG51bVJldHJpZXNfOworCisgIC8qKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgorICAgKiBtYXJrZWQgYXMgZG93bi4KKyAgICovCisgIHRpbWVfdCByZXRyeUludGVydmFsXzsKKworICAvKiogTWF4IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGJlZm9yZSBtYXJraW5nIGEgaG9zdCBkb3duLiAqLworICBpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc187CisKKyAgLyoqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8gKi8KKyAgYm9vbCByYW5kb21pemVfOworCisgIC8qKiBBbHdheXMgdHJ5IGxhc3QgaG9zdCwgZXZlbiBpZiBtYXJrZWQgZG93bj8gKi8KKyAgYm9vbCBhbHdheXNUcnlMYXN0XzsKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0NDIzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIHRvIGhvaXN0IHJlYWRBbGwgaW1wbGVtZW50YXRpb24gb3V0IG9mIFRUcmFuc3BvcnQKKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Cit1aW50MzJfdCByZWFkQWxsKFRyYW5zcG9ydF8mIHRyYW5zLCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBoYXZlID0gMDsKKyAgdWludDMyX3QgZ2V0ID0gMDsKKworICB3aGlsZSAoaGF2ZSA8IGxlbikgeworICAgIGdldCA9IHRyYW5zLnJlYWQoYnVmICsgaGF2ZSwgbGVuIC0gaGF2ZSk7CisgICAgaWYgKGdldCA8PSAwKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLCAiTm8gbW9yZSBkYXRhIHRvIHJlYWQuIik7CisgICAgfQorICAgIGhhdmUgKz0gZ2V0OworICB9CisKKyAgcmV0dXJuIGhhdmU7Cit9CisKKy8qKgorICogR2VuZXJpYyBpbnRlcmZhY2UgZm9yIGEgbWV0aG9kIG9mIHRyYW5zcG9ydGluZyBkYXRhLiBBIFRUcmFuc3BvcnQgbWF5IGJlCisgKiBjYXBhYmxlIG9mIGVpdGhlciByZWFkaW5nIG9yIHdyaXRpbmcsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYm90aC4KKyAqCisgKi8KK2NsYXNzIFRUcmFuc3BvcnQgeworcHVibGljOgorICAvKioKKyAgICogVmlydHVhbCBkZWNvbnN0cnVjdG9yLgorICAgKi8KKyAgdmlydHVhbCB+VFRyYW5zcG9ydCgpIHt9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICovCisgIHZpcnR1YWwgYm9vbCBpc09wZW4oKSB7IHJldHVybiBmYWxzZTsgfQorCisgIC8qKgorICAgKiBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBpcworICAgKiBzdGlsbCBvcGVuLiBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSB3aGVuZXZlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sCisgICAqIGJ1dCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFkZCBsb2dpYyB0byB0ZXN0IGZvciB0aGlzIGNvbmRpdGlvbiB3aGVyZQorICAgKiBwb3NzaWJsZSAoaS5lLiBvbiBhIHNvY2tldCkuCisgICAqIFRoaXMgaXMgdXNlZCBieSBhIHNlcnZlciB0byBjaGVjayBpZiBpdCBzaG91bGQgbGlzdGVuIGZvciBhbm90aGVyCisgICAqIHJlcXVlc3QuCisgICAqLworICB2aXJ0dWFsIGJvb2wgcGVlaygpIHsgcmV0dXJuIGlzT3BlbigpOyB9CisKKyAgLyoqCisgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIGNvbW11bmljYXRpb25zLgorICAgKgorICAgKiBAcmV0dXJuIGJvb2wgV2hldGhlciB0aGUgdHJhbnNwb3J0IHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBvcGVuaW5nIGZhaWxlZAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9wZW4oKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhc2UgVFRyYW5zcG9ydC4iKTsKKyAgfQorCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2Fubm90IGNsb3NlIGJhc2UgVFRyYW5zcG9ydC4iKTsKKyAgfQorCisgIC8qKgorICAgKiBBdHRlbXB0IHRvIHJlYWQgdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgaW50byB0aGUgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gYnVmICBSZWZlcmVuY2UgdG8gdGhlIGxvY2F0aW9uIHRvIHdyaXRlIHRoZSBkYXRhCisgICAqIEBwYXJhbSBsZW4gIEhvdyBtYW55IGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBIb3cgbWFueSBieXRlcyB3ZXJlIGFjdHVhbGx5IHJlYWQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIFRfVklSVFVBTF9DQUxMKCk7CisgICAgcmV0dXJuIHJlYWRfdmlydChidWYsIGxlbik7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCAvKiBsZW4gKi8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCByZWFkLiIpOworICB9CisKKyAgLyoqCisgICAqIFJlYWRzIHRoZSBnaXZlbiBhbW91bnQgb2YgZGF0YSBpbiBpdHMgZW50aXJldHkgbm8gbWF0dGVyIHdoYXQuCisgICAqCisgICAqIEBwYXJhbSBzICAgICBSZWZlcmVuY2UgdG8gbG9jYXRpb24gZm9yIHJlYWQgZGF0YQorICAgKiBAcGFyYW0gbGVuICAgSG93IG1hbnkgYnl0ZXMgdG8gcmVhZAorICAgKiBAcmV0dXJuIEhvdyBtYW55IGJ5dGVzIHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gc2l6ZQorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgaW5zdWZmaWNpZW50IGRhdGEgd2FzIHJlYWQKKyAgICovCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBUX1ZJUlRVQUxfQ0FMTCgpOworICAgIHJldHVybiByZWFkQWxsX3ZpcnQoYnVmLCBsZW4pOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcmV0dXJuIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnJlYWRBbGwoKnRoaXMsIGJ1ZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlZC4KKyAgICogVGhpcyBjYW4gYmUgb3Zlci1yaWRkZW4gdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24KKyAgICogZS5nLiBsb2dnaW5nIHRoZSByZXF1ZXN0IHRvIGEgZmlsZQorICAgKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRFbmQoKSB7CisgICAgLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZG8gbm90aGluZworICAgIHJldHVybiAwOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgc3RyaW5nIGluIGl0cyBlbnRpcmV0eSB0byB0aGUgYnVmZmVyLgorICAgKgorICAgKiBOb3RlOiBZb3UgbXVzdCBjYWxsIGZsdXNoKCkgdG8gZW5zdXJlIHRoZSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4sCisgICAqIGFuZCBhdmFpbGFibGUgdG8gYmUgcmVhZCBiYWNrIGluIHRoZSBmdXR1cmUuICBEZXN0cm95aW5nIGEgVFRyYW5zcG9ydAorICAgKiBvYmplY3QgZG9lcyBub3QgYXV0b21hdGljYWxseSBmbHVzaCBwZW5kaW5nIGRhdGEtLWlmIHlvdSBkZXN0cm95IGEKKyAgICogVFRyYW5zcG9ydCBvYmplY3Qgd2l0aCB3cml0dGVuIGJ1dCB1bmZsdXNoZWQgZGF0YSwgdGhhdCBkYXRhIG1heSBiZQorICAgKiBkaXNjYXJkZWQuCisgICAqCisgICAqIEBwYXJhbSBidWYgIFRoZSBkYXRhIHRvIHdyaXRlIG91dAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICB3cml0ZV92aXJ0KGJ1ZiwgbGVuKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IHdyaXRlLiIpOworICB9CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlZC4KKyAgICogVGhpcyBjYW4gYmUgb3Zlci1yaWRkZW4gdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24KKyAgICogYXQgdGhlIGVuZCBvZiBhIHJlcXVlc3QuCisgICAqCisgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUVuZCgpIHsKKyAgICAvLyBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkbyBub3RoaW5nCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKioKKyAgICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIHRvIGJlIHdyaXR0ZW4uIFR5cGljYWxseSB1c2VkIHdpdGggYnVmZmVyZWQKKyAgICogdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICovCisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpIHsKKyAgICAvLyBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkbyBub3RoaW5nCisgIH0KKworICAvKioKKyAgICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgcG9pbnRlciB0byBcYyBsZW4gYnl0ZXMsIHBvc3NpYmx5IGNvcGllZCBpbnRvIFxjIGJ1Zi4KKyAgICogRG9lcyBub3QgY29uc3VtZSB0aGUgYnl0ZXMgcmVhZCAoaS5lLjogYSBsYXRlciByZWFkIHdpbGwgcmV0dXJuIHRoZSBzYW1lCisgICAqIGRhdGEpLiAgVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gc3VwcG9ydCBwcm90b2NvbHMgdGhhdCBuZWVkIHRvIHJlYWQKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcy4gIFRoZXkgY2FuIGF0dGVtcHQgdG8gYm9ycm93IHRoZSBtYXhpbXVtIGFtb3VudCBvZgorICAgKiBkYXRhIHRoYXQgdGhleSB3aWxsIG5lZWQsIHRoZW4gY29uc3VtZSAoc2VlIG5leHQgbWV0aG9kKSB3aGF0IHRoZXkKKyAgICogYWN0dWFsbHkgdXNlLiAgU29tZSB0cmFuc3BvcnRzIHdpbGwgbm90IHN1cHBvcnQgdGhpcyBtZXRob2QgYW5kIG90aGVycworICAgKiB3aWxsIGZhaWwgb2NjYXNpb25hbGx5LCBzbyBwcm90b2NvbHMgbXVzdCBiZSBwcmVwYXJlZCB0byB1c2UgcmVhZCBpZgorICAgKiBib3Jyb3cgZmFpbHMuCisgICAqCisgICAqIEBvYXJhbSBidWYgIEEgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIGNhbiBiZSBzdG9yZWQgaWYgbmVlZGVkLgorICAgKiAgICAgICAgICAgICBJZiBib3Jyb3cgZG9lc24ndCByZXR1cm4gYnVmLCB0aGVuIHRoZSBjb250ZW50cyBvZgorICAgKiAgICAgICAgICAgICBidWYgYWZ0ZXIgdGhlIGNhbGwgYXJlIHVuZGVmaW5lZC4gIFRoaXMgcGFyYW1ldGVyIG1heSBiZQorICAgKiAgICAgICAgICAgICBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBpcyBub3Qgc3VwcGx5aW5nIHN0b3JhZ2UsCisgICAqICAgICAgICAgICAgIGJ1dCB3b3VsZCBsaWtlIGEgcG9pbnRlciBpbnRvIGFuIGludGVybmFsIGJ1ZmZlciwgaWYKKyAgICogICAgICAgICAgICAgYXZhaWxhYmxlLgorICAgKiBAcGFyYW0gbGVuICAqbGVuIHNob3VsZCBpbml0aWFsbHkgY29udGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJvcnJvdy4KKyAgICogICAgICAgICAgICAgSWYgYm9ycm93IHN1Y2NlZWRzLCAqbGVuIHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICAqICAgICAgICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgcmV0dXJuZWQgcG9pbnRlci4gIFRoaXMgd2lsbCBiZSBhdCBsZWFzdAorICAgKiAgICAgICAgICAgICB3aGF0IHdhcyByZXF1ZXN0ZWQsIGJ1dCBtYXkgYmUgbW9yZSBpZiBib3Jyb3cgcmV0dXJucworICAgKiAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgYnVmZmVyLCByYXRoZXIgdGhhbiBidWYuCisgICAqICAgICAgICAgICAgIElmIGJvcnJvdyBmYWlscywgdGhlIGNvbnRlbnRzIG9mICpsZW4gYXJlIHVuZGVmaW5lZC4KKyAgICogQHJldHVybiBJZiB0aGUgYm9ycm93IHN1Y2NlZWRzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBib3Jyb3dlZCBkYXRhLgorICAgKiAgICAgICAgIFRoaXMgbWlnaHQgYmUgZXF1YWwgdG8gXGMgYnVmLCBvciBpdCBtaWdodCBiZSBhIHBvaW50ZXIgaW50bworICAgKiAgICAgICAgIHRoZSB0cmFuc3BvcnQncyBpbnRlcm5hbCBidWZmZXJzLgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICByZXR1cm4gYm9ycm93X3ZpcnQoYnVmLCBsZW4pOworICB9CisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93X3ZpcnQodWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCogLyogbGVuICovKSB7IHJldHVybiBOVUxMOyB9CisKKyAgLyoqCisgICAqIFJlbW92ZSBsZW4gYnl0ZXMgZnJvbSB0aGUgdHJhbnNwb3J0LiAgVGhpcyBzaG91bGQgYWx3YXlzIGZvbGxvdyBhIGJvcnJvdworICAgKiBvZiBhdCBsZWFzdCBsZW4gYnl0ZXMsIGFuZCBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuCisgICAqIFRPRE8oZHJlaXNzKTogSXMgdGhlcmUgYW55IHRyYW5zcG9ydCB0aGF0IGNvdWxkIGJvcnJvdyBidXQgZmFpbCB0bworICAgKiBjb25zdW1lLCBvciB0aGF0IHdvdWxkIHJlcXVpcmUgYSBidWZmZXIgdG8gZHVtcCB0aGUgY29uc3VtZWQgZGF0YT8KKyAgICoKKyAgICogQHBhcmFtIGxlbiAgSG93IG1hbnkgYnl0ZXMgdG8gY29uc3VtZQorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAqLworICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7CisgICAgVF9WSVJUVUFMX0NBTEwoKTsKKyAgICBjb25zdW1lX3ZpcnQobGVuKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgY29uc3VtZV92aXJ0KHVpbnQzMl90IC8qIGxlbiAqLykgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IGNvbnN1bWUuIik7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSB0cmFuc3BvcnRzIGNhbGwuIFRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZQorICAgKiB0cmFuc3BvcnQgdXNlZC4gQW4gSVAgYmFzZWQgdHJhbnNwb3J0IGZvciBleGFtcGxlIHdpbGwgcmV0dXJuIHRoZQorICAgKiBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgbWFraW5nIHRoZSByZXF1ZXN0LgorICAgKiBJZiB0aGUgdHJhbnNwb3J0IGRvZXNuJ3Qga25vdyB0aGUgb3JpZ2luIFVua25vd24gaXMgcmV0dXJuZWQuCisgICAqCisgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgdXNlZCBpbiBhIGxvZyBtZXNzYWdlIGZvciBleGFtcGxlCisgICAqLworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsgcmV0dXJuICJVbmtub3duIjsgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBTaW1wbGUgY29uc3RydWN0b3IuCisgICAqLworICBUVHJhbnNwb3J0KCkge30KK307CisKKy8qKgorICogR2VuZXJpYyBmYWN0b3J5IGNsYXNzIHRvIG1ha2UgYW4gaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnQgb3V0IG9mIGEKKyAqIHNvdXJjZSB0cmFuc3BvcnQuIENvbW1vbmx5IHVzZWQgaW5zaWRlIHNlcnZlcnMgdG8gbWFrZSBpbnB1dCBhbmQgb3V0cHV0CisgKiBzdHJlYW1zIG91dCBvZiByYXcgY2xpZW50cy4KKyAqCisgKi8KK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVFRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcsIGp1c3QgcmV0dXJucyB0aGUgdHJhbnNwb3J0IGdpdmVuLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiB0cmFuczsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI3MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcApAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKKyAgICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBVTktOT1dOOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBVbmtub3duIHRyYW5zcG9ydCBleGNlcHRpb24iOworICAgIGNhc2UgTk9UX09QRU46CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRyYW5zcG9ydCBub3Qgb3BlbiI7CisgICAgY2FzZSBUSU1FRF9PVVQ6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRpbWVkIG91dCI7CisgICAgY2FzZSBFTkRfT0ZfRklMRToKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogRW5kIG9mIGZpbGUiOworICAgIGNhc2UgSU5URVJSVVBURUQ6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVycnVwdGVkIjsKKyAgICBjYXNlIEJBRF9BUkdTOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnZhbGlkIGFyZ3VtZW50cyI7CisgICAgY2FzZSBDT1JSVVBURURfREFUQToKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogQ29ycnVwdGVkIERhdGEiOworICAgIGNhc2UgSU5URVJOQUxfRVJST1I6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVybmFsIGVycm9yIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNWYwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXyAxCisKKyNpbmNsdWRlIDxib29zdC9udW1lcmljL2NvbnZlcnNpb24vY2FzdC5ocHA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aGUgcG9zc2libGUgdHlwZXMgb2YgdHJhbnNwb3J0IGVycm9ycyB0aGF0IG1heQorICogb2NjdXIgaW4gdmFyaW91cyB0cmFuc3BvcnQgc3lzdGVtcy4gVGhpcyBwcm92aWRlcyBhIHNvcnQgb2YgZ2VuZXJpYworICogd3JhcHBlciBhcm91bmQgdGhlIHZhZ3VlIFVOSVggRV8gZXJyb3IgY29kZXMgdGhhdCBsZXRzIGEgY29tbW9uIGNvZGUKKyAqIGJhc2Ugb2YgZXJyb3IgaGFuZGxpbmcgdG8gYmUgdXNlZCBmb3IgdmFyaW91cyB0eXBlcyBvZiB0cmFuc3BvcnRzLCBpLmUuCisgKiBwaXBlcyBldGMuCisgKgorICovCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgorICAgKi8KKyAgZW51bSBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgTk9UX09QRU4gPSAxLAorICAgIFRJTUVEX09VVCA9IDIsCisgICAgRU5EX09GX0ZJTEUgPSAzLAorICAgIElOVEVSUlVQVEVEID0gNCwKKyAgICBCQURfQVJHUyA9IDUsCisgICAgQ09SUlVQVEVEX0RBVEEgPSA2LAorICAgIElOVEVSTkFMX0VSUk9SID0gNworICB9OworCisgIFRUcmFuc3BvcnRFeGNlcHRpb24oKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKFVOS05PV04pIHt9CisKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKHR5cGUpIHt9CisKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyhVTktOT1dOKSB7fQorCisgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8odHlwZSkge30KKworICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UgKyAiOiAiICsgVE91dHB1dDo6c3RyZXJyb3JfcyhlcnJub19jb3B5KSksIHR5cGVfKHR5cGUpIHt9CisKKyAgdmlydHVhbCB+VFRyYW5zcG9ydEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CisKKyAgLyoqCisgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCisgICAqIHRoYXQgaGFzIG9jY3VycmVkLgorICAgKgorICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKKyAgICovCisgIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiB0eXBlXzsgfQorCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0OworCitwcm90ZWN0ZWQ6CisgIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLworICBzdGQ6OnN0cmluZyBzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KTsKKworICAvKiogRXJyb3IgY29kZSAqLworICBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlXzsKK307CisKKy8qKgorICogTGVnYWN5IGNvZGUgaW4gdHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyBoYXZlIG92ZXJmbG93IGlzc3VlcworICogdGhhdCBuZWVkIHRvIGJlIGVuZm9yY2VkLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+IFRvIHNhZmVfbnVtZXJpY19jYXN0KEZyb20gaSkgeworICB0cnkgeworICAgIHJldHVybiBib29zdDo6bnVtZXJpY19jYXN0PFRvPihpKTsKKyAgfQorICBjYXRjaCAoY29uc3Qgc3RkOjpiYWRfY2FzdCYgYmMpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMud2hhdCgpKTsKKyAgfQorfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDdjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VpbnQzMl90IFRQaXBlZFRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICB1aW50MzJfdCBuZWVkID0gbGVuOworCisgIC8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgeWV0CisgIGlmIChyTGVuXyAtIHJQb3NfIDwgbmVlZCkgeworICAgIC8vIENvcHkgb3V0IHdoYXRldmVyIHdlIGhhdmUKKyAgICBpZiAockxlbl8gLSByUG9zXyA+IDApIHsKKyAgICAgIG1lbWNweShidWYsIHJCdWZfICsgclBvc18sIHJMZW5fIC0gclBvc18pOworICAgICAgbmVlZCAtPSByTGVuXyAtIHJQb3NfOworICAgICAgYnVmICs9IHJMZW5fIC0gclBvc187CisgICAgICByUG9zXyA9IHJMZW5fOworICAgIH0KKworICAgIC8vIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBidWZmZXIgaWYgaXQgaXMgZnVsbAorICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKKyAgICAgIHJCdWZTaXplXyAqPSAyOworICAgICAgdWludDhfdCAqdG1wQnVmID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICAgIGlmICh0bXBCdWYgPT0gTlVMTCkgeworICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgICB9CisgICAgICByQnVmXyA9IHRtcEJ1ZjsKKyAgICB9CisKKyAgICAvLyB0cnkgdG8gZmlsbCB1cCB0aGUgYnVmZmVyCisgICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfICsgclBvc18sIHJCdWZTaXplXyAtIHJQb3NfKTsKKyAgfQorCisgIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlCisgIHVpbnQzMl90IGdpdmUgPSBuZWVkOworICBpZiAockxlbl8gLSByUG9zXyA8IGdpdmUpIHsKKyAgICBnaXZlID0gckxlbl8gLSByUG9zXzsKKyAgfQorICBpZiAoZ2l2ZSA+IDApIHsKKyAgICBtZW1jcHkoYnVmLCByQnVmXyArIHJQb3NfLCBnaXZlKTsKKyAgICByUG9zXyArPSBnaXZlOworICAgIG5lZWQgLT0gZ2l2ZTsKKyAgfQorCisgIHJldHVybiAobGVuIC0gbmVlZCk7Cit9CisKK3ZvaWQgVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAobGVuID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBNYWtlIHRoZSBidWZmZXIgYXMgYmlnIGFzIGl0IG5lZWRzIHRvIGJlCisgIGlmICgobGVuICsgd0xlbl8pID49IHdCdWZTaXplXykgeworICAgIHVpbnQzMl90IG5ld0J1ZlNpemUgPSB3QnVmU2l6ZV8gKiAyOworICAgIHdoaWxlICgobGVuICsgd0xlbl8pID49IG5ld0J1ZlNpemUpIHsKKyAgICAgIG5ld0J1ZlNpemUgKj0gMjsKKyAgICB9CisgICAgdWludDhfdCAqdG1wQnVmPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHdCdWZfLCBzaXplb2YodWludDhfdCkgKiBuZXdCdWZTaXplKTsKKyAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIHdCdWZfID0gdG1wQnVmOworCisgICAgd0J1ZlNpemVfID0gbmV3QnVmU2l6ZTsKKyAgfQorCisgIC8vIENvcHkgaW50byB0aGUgYnVmZmVyCisgIG1lbWNweSh3QnVmXyArIHdMZW5fLCBidWYsIGxlbik7CisgIHdMZW5fICs9IGxlbjsKK30KKwordm9pZCBUUGlwZWRUcmFuc3BvcnQ6OmZsdXNoKCkgeworICAvLyBXcml0ZSBvdXQgYW55IGRhdGEgd2FpdGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyCisgIGlmICh3TGVuXyA+IDApIHsKKyAgICBzcmNUcmFuc18tPndyaXRlKHdCdWZfLCB3TGVuXyk7CisgICAgd0xlbl8gPSAwOworICB9CisKKyAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgIHNyY1RyYW5zXy0+Zmx1c2goKTsKK30KKworVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgOiBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zKSwgc3JjVHJhbnNfKHNyY1RyYW5zKSB7Cit9CisKK1RQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6On5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCkgeworfQorCitib29sIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmlzT3BlbigpIHsKKyAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6aXNPcGVuKCk7Cit9CisKK2Jvb2wgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6cGVlaygpIHsKKyAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cGVlaygpOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6Om9wZW4oKSB7CisgIFRQaXBlZFRyYW5zcG9ydDo6b3BlbigpOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmNsb3NlKCkgeworICBUUGlwZWRUcmFuc3BvcnQ6OmNsb3NlKCk7Cit9CisKK3VpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cmVhZChidWYsIGxlbik7Cit9CisKK3VpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgaGF2ZSA9IDA7CisgIHVpbnQzMl90IGdldCA9IDA7CisKKyAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKKyAgICBnZXQgPSByZWFkKGJ1ZiArIGhhdmUsIGxlbiAtIGhhdmUpOworICAgIGlmIChnZXQgPD0gMCkgeworICAgICAgdGhyb3cgVEVPRkV4Y2VwdGlvbigpOworICAgIH0KKyAgICBoYXZlICs9IGdldDsKKyAgfQorCisgIHJldHVybiBoYXZlOworfQorCit1aW50MzJfdCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpyZWFkRW5kKCkgeworICByZXR1cm4gVFBpcGVkVHJhbnNwb3J0OjpyZWFkRW5kKCk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZShidWYsIGxlbik7Cit9CisKK3VpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OndyaXRlRW5kKCkgeworICByZXR1cm4gVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZUVuZCgpOworfQorCit2b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmZsdXNoKCkgeworICBUUGlwZWRUcmFuc3BvcnQ6OmZsdXNoKCk7Cit9CisKK2ludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Z2V0UmVhZFRpbWVvdXQoKSB7CisgIHJldHVybiBzcmNUcmFuc18tPmdldFJlYWRUaW1lb3V0KCk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6c2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgeworICBzcmNUcmFuc18tPnNldFJlYWRUaW1lb3V0KHJlYWRUaW1lb3V0KTsKK30KKwordWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Z2V0TnVtQ2h1bmtzKCkgeworICByZXR1cm4gc3JjVHJhbnNfLT5nZXROdW1DaHVua3MoKTsKK30KKwordWludDMyX3QgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6Z2V0Q3VyQ2h1bmsoKSB7CisgIHJldHVybiBzcmNUcmFuc18tPmdldEN1ckNodW5rKCk7Cit9CisKK3ZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6c2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuaykgeworICBzcmNUcmFuc18tPnNlZWtUb0NodW5rKGNodW5rKTsKK30KKwordm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpzZWVrVG9FbmQoKSB7CisgIHNyY1RyYW5zXy0+c2Vla1RvRW5kKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVFVUSUxTX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXyAxCisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKy8vIEluY2x1ZGUgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydHMgdGhhdCB1c2VkIHRvIGJlIGRlZmluZWQgaGVyZS4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKKy8qKgorICogVGhlIG51bGwgdHJhbnNwb3J0IGlzIGEgZHVtbXkgdHJhbnNwb3J0IHRoYXQgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZy4KKyAqIEl0J3Mgc29ydCBvZiBhbiBhbmFsb2d5IHRvIC9kZXYvbnVsbCwgeW91IGNhbiBuZXZlciByZWFkIGFueXRoaW5nIGZyb20gaXQKKyAqIGFuZCBpdCB3aWxsIGxldCB5b3Ugd3JpdGUgYW55dGhpbmcgeW91IHdhbnQgdG8gaXQsIHRob3VnaCBpdCB3b24ndCBhY3R1YWxseQorICogZ28gYW55d2hlcmUuCisgKgorICovCitjbGFzcyBUTnVsbFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUTnVsbFRyYW5zcG9ydD4geworcHVibGljOgorICBUTnVsbFRyYW5zcG9ydCgpIHt9CisKKyAgflROdWxsVHJhbnNwb3J0KCkge30KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRydWU7IH0KKworICB2b2lkIG9wZW4oKSB7fQorCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCAvKiBsZW4gKi8pIHsgcmV0dXJuOyB9Cit9OworCisvKioKKyAqIFRQaXBlZFRyYW5zcG9ydC4gVGhpcyB0cmFuc3BvcnQgYWxsb3dzIHBpcGluZyBvZiBhIHJlcXVlc3QgZnJvbSBvbmUKKyAqIHRyYW5zcG9ydCB0byBhbm90aGVyIGVpdGhlciB3aGVuIHJlYWRFbmQoKSBvciB3cml0ZUVuZCgpLiBUaGUgdHlwaWNhbAorICogdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gbG9nIGEgcmVxdWVzdCBvciBhIHJlcGx5IHRvIGRpc2suCisgKiBUaGUgdW5kZXJseWluZyBidWZmZXIgZXhwYW5kcyB0byBhIGtlZXAgYSBjb3B5IG9mIHRoZSBlbnRpcmUKKyAqIHJlcXVlc3QvcmVzcG9uc2UuCisgKgorICovCitjbGFzcyBUUGlwZWRUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQorICAgIDogc3JjVHJhbnNfKHNyY1RyYW5zKSwKKyAgICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCisgICAgICByQnVmU2l6ZV8oNTEyKSwKKyAgICAgIHJQb3NfKDApLAorICAgICAgckxlbl8oMCksCisgICAgICB3QnVmU2l6ZV8oNTEyKSwKKyAgICAgIHdMZW5fKDApIHsKKworICAgIC8vIGRlZmF1bHQgaXMgdG8gdG8gcGlwZSB0aGUgcmVxdWVzdCB3aGVuIHJlYWRFbmQoKSBpcyBjYWxsZWQKKyAgICBwaXBlT25SZWFkXyA9IHRydWU7CisgICAgcGlwZU9uV3JpdGVfID0gZmFsc2U7CisKKyAgICByQnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworICAgIGlmIChyQnVmXyA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgICB3QnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOworICAgIGlmICh3QnVmXyA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgIH0KKyAgfQorCisgIFRQaXBlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsCisgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeikKKyAgICA6IHNyY1RyYW5zXyhzcmNUcmFucyksCisgICAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAorICAgICAgckJ1ZlNpemVfKDUxMiksCisgICAgICByUG9zXygwKSwKKyAgICAgIHJMZW5fKDApLAorICAgICAgd0J1ZlNpemVfKHN6KSwKKyAgICAgIHdMZW5fKDApIHsKKworICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgaWYgKHJCdWZfID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIHdCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHdCdWZTaXplXyk7CisgICAgaWYgKHdCdWZfID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICB9CisKKyAgflRQaXBlZFRyYW5zcG9ydCgpIHsKKyAgICBzdGQ6OmZyZWUockJ1Zl8pOworICAgIHN0ZDo6ZnJlZSh3QnVmXyk7CisgIH0KKworICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHNyY1RyYW5zXy0+aXNPcGVuKCk7IH0KKworICBib29sIHBlZWsoKSB7CisgICAgaWYgKHJQb3NfID49IHJMZW5fKSB7CisgICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKKyAgICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKKyAgICAgICAgckJ1ZlNpemVfICo9IDI7CisgICAgICAgIHVpbnQ4X3QgKiB0bXBCdWYgPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHJCdWZfLCBzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworCWlmICh0bXBCdWYgPT0gTlVMTCkgeworCSAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKwl9CisJckJ1Zl8gPSB0bXBCdWY7CisgICAgICB9CisKKyAgICAgIC8vIHRyeSB0byBmaWxsIHVwIHRoZSBidWZmZXIKKyAgICAgIHJMZW5fICs9IHNyY1RyYW5zXy0+cmVhZChyQnVmXyArIHJQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7CisgICAgfQorICAgIHJldHVybiAockxlbl8gPiByUG9zXyk7CisgIH0KKworICB2b2lkIG9wZW4oKSB7IHNyY1RyYW5zXy0+b3BlbigpOyB9CisKKyAgdm9pZCBjbG9zZSgpIHsgc3JjVHJhbnNfLT5jbG9zZSgpOyB9CisKKyAgdm9pZCBzZXRQaXBlT25SZWFkKGJvb2wgcGlwZVZhbCkgeyBwaXBlT25SZWFkXyA9IHBpcGVWYWw7IH0KKworICB2b2lkIHNldFBpcGVPbldyaXRlKGJvb2wgcGlwZVZhbCkgeyBwaXBlT25Xcml0ZV8gPSBwaXBlVmFsOyB9CisKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdWludDMyX3QgcmVhZEVuZCgpIHsKKworICAgIGlmIChwaXBlT25SZWFkXykgeworICAgICAgZHN0VHJhbnNfLT53cml0ZShyQnVmXywgclBvc18pOworICAgICAgZHN0VHJhbnNfLT5mbHVzaCgpOworICAgIH0KKworICAgIHNyY1RyYW5zXy0+cmVhZEVuZCgpOworCisgICAgLy8gSWYgcmVxdWVzdHMgYXJlIGJlaW5nIHBpcGVsaW5lZCwgY29weSBkb3duIG91ciByZWFkLWFoZWFkIGRhdGEsCisgICAgLy8gdGhlbiByZXNldCBvdXIgc3RhdGUuCisgICAgaW50IHJlYWRfYWhlYWQgPSByTGVuXyAtIHJQb3NfOworICAgIHVpbnQzMl90IGJ5dGVzID0gclBvc187CisgICAgbWVtY3B5KHJCdWZfLCByQnVmXyArIHJQb3NfLCByZWFkX2FoZWFkKTsKKyAgICByUG9zXyA9IDA7CisgICAgckxlbl8gPSByZWFkX2FoZWFkOworCisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisKKyAgdWludDMyX3Qgd3JpdGVFbmQoKSB7CisgICAgaWYgKHBpcGVPbldyaXRlXykgeworICAgICAgZHN0VHJhbnNfLT53cml0ZSh3QnVmXywgd0xlbl8pOworICAgICAgZHN0VHJhbnNfLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gd0xlbl87CisgIH0KKworICB2b2lkIGZsdXNoKCk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRhcmdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIGRzdFRyYW5zXzsgfQorCisgIC8qCisgICAqIE92ZXJyaWRlIFRUcmFuc3BvcnQgKl92aXJ0KCkgZnVuY3Rpb25zIHRvIGludm9rZSBvdXIgaW1wbGVtZW50YXRpb25zLgorICAgKiBXZSBjYW5ub3QgdXNlIFRWaXJ0dWFsVHJhbnNwb3J0IHRvIHByb3ZpZGUgdGhlc2UsIHNpbmNlIHdlIG5lZWQgdG8gaW5oZXJpdAorICAgKiB2aXJ0dWFsbHkgZnJvbSBUVHJhbnNwb3J0LgorICAgKi8KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187CisKKyAgdWludDhfdCogckJ1Zl87CisgIHVpbnQzMl90IHJCdWZTaXplXzsKKyAgdWludDMyX3QgclBvc187CisgIHVpbnQzMl90IHJMZW5fOworCisgIHVpbnQ4X3QqIHdCdWZfOworICB1aW50MzJfdCB3QnVmU2l6ZV87CisgIHVpbnQzMl90IHdMZW5fOworCisgIGJvb2wgcGlwZU9uUmVhZF87CisgIGJvb2wgcGlwZU9uV3JpdGVfOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgcGlwZWRUcmFuc3BvcnQgaW5zdGFuY2UuCisgKgorICovCitjbGFzcyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisgIFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CisgICAgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChkc3RUcmFucyk7CisgIH0KKyAgdmlydHVhbCB+VFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgLyoqCisgICAqIFdyYXBzIHRoZSBiYXNlIHRyYW5zcG9ydCBpbnRvIGEgcGlwZWQgdHJhbnNwb3J0LgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKKyAgICBpZiAoZHN0VHJhbnNfLmdldCgpID09IE5VTEwpIHsKKyAgICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUYXJnZXQgdHJhbnNwb3J0IGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICB9CisgIH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOworfTsKKworLyoqCisgKiBUUGlwZWRGaWxlVHJhbnNwb3J0LiBUaGlzIGlzIGp1c3QgbGlrZSBhIFRUcmFuc3BvcnQsIGV4Y2VwdCB0aGF0CisgKiBpdCBpcyBhIHRlbXBsYXRpemVkIGNsYXNzLCBzbyB0aGF0IGNsaWVudHMgd2hvIHJlbHkgb24gYSBzcGVjaWZpYworICogVFRyYW5zcG9ydCBjYW4gc3RpbGwgYWNjZXNzIHRoZSBvcmlnaW5hbCB0cmFuc3BvcnQuCisgKgorICovCitjbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydCwgcHVibGljIFRGaWxlUmVhZGVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucyk7CisKKyAgflRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoKTsKKworICAvLyBUVHJhbnNwb3J0IGZ1bmN0aW9ucworICBib29sIGlzT3BlbigpOworICBib29sIHBlZWsoKTsKKyAgdm9pZCBvcGVuKCk7CisgIHZvaWQgY2xvc2UoKTsKKyAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkRW5kKCk7CisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCB3cml0ZUVuZCgpOworICB2b2lkIGZsdXNoKCk7CisKKyAgLy8gVEZpbGVSZWFkZXJUcmFuc3BvcnQgZnVuY3Rpb25zCisgIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKTsKKyAgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KTsKKyAgdWludDMyX3QgZ2V0TnVtQ2h1bmtzKCk7CisgIHVpbnQzMl90IGdldEN1ckNodW5rKCk7CisgIHZvaWQgc2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuayk7CisgIHZvaWQgc2Vla1RvRW5kKCk7CisKKyAgLyoKKyAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCisgICAqIFdlIGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gcHJvdmlkZSB0aGVzZSwgc2luY2Ugd2UgbmVlZCB0byBpbmhlcml0CisgICAqIHZpcnR1YWxseSBmcm9tIFRUcmFuc3BvcnQuCisgICAqLworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsgfQorCitwcm90ZWN0ZWQ6CisgIC8vIHNob3VsZG4ndCBiZSB1c2VkCisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFuc187Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0IGZyb20gYSBmaWxlcGF0aCBhbmQgYSBkZXN0aW5hdGlvbiB0cmFuc3BvcnQKKyAqCisgKi8KK2NsYXNzIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljOgorICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgICA6IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZHN0VHJhbnMpIHt9CisgIHZpcnR1YWwgflRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gcEZpbGVSZWFkZXJUcmFuc3BvcnQKKyAgICAgICAgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRGaWxlUmVhZGVyVHJhbnNwb3J0PihzcmNUcmFucyk7CisgICAgaWYgKHBGaWxlUmVhZGVyVHJhbnNwb3J0LmdldCgpICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KHBGaWxlUmVhZGVyVHJhbnNwb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydCgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PigKKyAgICAgICAgbmV3IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWNmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVklSVFVBTFRSQU5TUE9SVF9IXworI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVklSVFVBTFRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIFRUcmFuc3BvcnQgbWV0aG9kcy4KKyAqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHJlYWQoKSwgcmVhZEFsbCgpLCB3cml0ZSgpLAorICogYm9ycm93KCkgYW5kIGNvbnN1bWUoKS4KKyAqCisgKiBJbiB0aGUgVFRyYW5zcG9ydCBiYXNlIGNsYXNzLCBlYWNoIG9mIHRoZXNlIG1ldGhvZHMgc2ltcGx5IGludm9rZXMgaXRzCisgKiB2aXJ0dWFsIGNvdW50ZXJwYXJ0LiAgVGhpcyBjbGFzcyBvdmVycmlkZXMgdGhlbSB0byBhbHdheXMgcGVyZm9ybSB0aGUKKyAqIGRlZmF1bHQgYmVoYXZpb3IsIHdpdGhvdXQgYSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwuCisgKgorICogVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHNlcnZlIGFzIGEgYmFzZSBjbGFzcyBmb3IKKyAqIFRWaXJ0dWFsVHJhbnNwb3J0LCBhbmQgcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gaWYgb25lIG9mIGl0cyBzdWJjbGFzc2VzCisgKiBkb2VzIG5vdCBvdmVycmlkZSB0aGUgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBtZXRob2RzLiAgKFNpbmNlCisgKiBUVmlydHVhbFRyYW5zcG9ydDo6cmVhZF92aXJ0KCkgY2FsbHMgcmVhZCgpLCBhbmQgVFRyYW5zcG9ydDo6cmVhZCgpIGNhbGxzCisgKiByZWFkX3ZpcnQoKS4pCisgKi8KK2NsYXNzIFRUcmFuc3BvcnREZWZhdWx0cyA6IHB1YmxpYyBUVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgLyoKKyAgICogVFRyYW5zcG9ydCAqX3ZpcnQoKSBtZXRob2RzIHByb3ZpZGUgcmVhc29uYWJsZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucy4KKyAgICogSW52b2tlIHRoZW0gbm9uLXZpcnR1YWxseS4KKyAgICovCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPlRUcmFuc3BvcnQ6OnJlYWRfdmlydChidWYsIGxlbik7IH0KKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+VFRyYW5zcG9ydDo6cmVhZEFsbF92aXJ0KGJ1ZiwgbGVuKTsgfQorICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRoaXMtPlRUcmFuc3BvcnQ6OndyaXRlX3ZpcnQoYnVmLCBsZW4pOyB9CisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKKyAgICByZXR1cm4gdGhpcy0+VFRyYW5zcG9ydDo6Ym9ycm93X3ZpcnQoYnVmLCBsZW4pOworICB9CisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsgdGhpcy0+VFRyYW5zcG9ydDo6Y29uc3VtZV92aXJ0KGxlbik7IH0KKworcHJvdGVjdGVkOgorICBUVHJhbnNwb3J0RGVmYXVsdHMoKSB7fQorfTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gcHJvdmlkZSBwb2x5bW9ycGhpc20gZm9yIHN1YmNsYXNzZXMgb2YgVFRyYW5zcG9ydC4KKyAqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgKl92aXJ0KCkgbWV0aG9kcyBvZiBUVHJhbnNwb3J0LCB0byBjYWxsIHRoZQorICogbm9uLXZpcnR1YWwgdmVyc2lvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGluIHRoZSBwcm9wZXIgc3ViY2xhc3MuCisgKgorICogVG8gZGVmaW5lIHlvdXIgb3duIHRyYW5zcG9ydCBjbGFzcyB1c2luZyBUVmlydHVhbFRyYW5zcG9ydDoKKyAqIDEpIERlcml2ZSB5b3VyIHN1YmNsYXNzIGZyb20gVFZpcnR1YWxUcmFuc3BvcnQ8eW91ciBjbGFzcz4KKyAqICAgIGUuZzogIGNsYXNzIE15VHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PE15VHJhbnNwb3J0PiB7CisgKiAyKSBQcm92aWRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9ucyBvZiByZWFkKCksIHJlYWRBbGwoKSwgZXRjLgorICogICAgVGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgbm9uLXZpcnR1YWwuCisgKgorICogVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyB0aGF0IG5lZWQgdG8gdXNlIHZpcnR1YWwgaW5oZXJpdGFuY2Ugd2hlbgorICogaW5oZXJpdGluZyBmcm9tIFRUcmFuc3BvcnQgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydC4KKyAqCisgKiBAYXV0aG9yIENoYWQgV2FsdGVycyA8Y2hhZEBwb3dlcnNldC5jb20+CisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBTdXBlcl8gPSBUVHJhbnNwb3J0RGVmYXVsdHM+CitjbGFzcyBUVmlydHVhbFRyYW5zcG9ydCA6IHB1YmxpYyBTdXBlcl8geworcHVibGljOgorICAvKgorICAgKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlICpfdmlydCgpIGZ1bmN0aW9ucywgdG8gY2FsbCB0aGUgc3ViY2xhc3MncworICAgKiBub24tdmlydHVhbCBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbi4KKyAgICovCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+cmVhZChidWYsIGxlbik7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPnJlYWRBbGwoYnVmLCBsZW4pOworICB9CisKKyAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBzdGF0aWNfY2FzdDxUcmFuc3BvcnRfKj4odGhpcyktPndyaXRlKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93X3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Ym9ycm93KGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBjb25zdW1lX3ZpcnQodWludDMyX3QgbGVuKSB7IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Y29uc3VtZShsZW4pOyB9CisKKyAgLyoKKyAgICogUHJvdmlkZSBhIGRlZmF1bHQgcmVhZEFsbCgpIGltcGxlbWVudGF0aW9uIHRoYXQgaW52b2tlcworICAgKiByZWFkKCkgbm9uLXZpcnR1YWxseS4KKyAgICoKKyAgICogTm90ZTogc3ViY2xhc3NlcyB0aGF0IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBkZXJpdmUgZnJvbSBhbm90aGVyCisgICAqIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiAoaS5lLiwgbm90IFRUcmFuc3BvcnREZWZhdWx0cykgc2hvdWxkIGJld2FyZSB0aGF0CisgICAqIHRoaXMgbWF5IG92ZXJyaWRlIGFueSBub24tZGVmYXVsdCByZWFkQWxsKCkgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkKKyAgICogdGhlIHBhcmVudCB0cmFuc3BvcnQgY2xhc3MuICBUaGV5IG1heSBuZWVkIHRvIHJlZGVmaW5lIHJlYWRBbGwoKSB0byBjYWxsCisgICAqIHRoZSBjb3JyZWN0IHBhcmVudCBpbXBsZW1lbnRhdGlvbiwgaWYgZGVzaXJlZC4KKyAgICovCisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICBUcmFuc3BvcnRfKiB0cmFucyA9IHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKTsKKyAgICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0cmFucywgYnVmLCBsZW4pOworICB9CisKK3Byb3RlY3RlZDoKKyAgVFZpcnR1YWxUcmFuc3BvcnQoKSB7fQorCisgIC8qCisgICAqIFRlbXBsYXRpemVkIGNvbnN0cnVjdG9ycywgdG8gYWxsb3cgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgU3VwZXJfCisgICAqIGNvbnN0cnVjdG9yLiAgQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCAwLCAxLCBvciAyIGFyZ3VtZW50cywgYnV0CisgICAqIGFkZGl0aW9uYWwgdmVyc2lvbnMgY2FuIGJlIGFkZGVkIGFzIG5lZWRlZC4KKyAgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmdfPgorICBUVmlydHVhbFRyYW5zcG9ydChBcmdfIGNvbnN0JiBhcmcpCisgICAgOiBTdXBlcl8oYXJnKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxXywgdHlwZW5hbWUgQXJnMl8+CisgIFRWaXJ0dWFsVHJhbnNwb3J0KEFyZzFfIGNvbnN0JiBhMSwgQXJnMl8gY29uc3QmIGEyKQorICAgIDogU3VwZXJfKGExLCBhMikge30KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFZJUlRVQUxUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyNmRjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworLy8gRG9uJ3QgY2FsbCB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbnN0cnVjdG9yLgordm9pZCBUWmxpYlRyYW5zcG9ydDo6aW5pdFpsaWIoKSB7CisgIGludCBydjsKKyAgYm9vbCByX2luaXQgPSBmYWxzZTsKKyAgdHJ5IHsKKyAgICByc3RyZWFtXyA9IG5ldyB6X3N0cmVhbTsKKyAgICB3c3RyZWFtXyA9IG5ldyB6X3N0cmVhbTsKKworICAgIHJzdHJlYW1fLT56YWxsb2MgPSBaX05VTEw7CisgICAgd3N0cmVhbV8tPnphbGxvYyA9IFpfTlVMTDsKKyAgICByc3RyZWFtXy0+emZyZWUgPSBaX05VTEw7CisgICAgd3N0cmVhbV8tPnpmcmVlID0gWl9OVUxMOworICAgIHJzdHJlYW1fLT5vcGFxdWUgPSBaX05VTEw7CisgICAgd3N0cmVhbV8tPm9wYXF1ZSA9IFpfTlVMTDsKKworICAgIHJzdHJlYW1fLT5uZXh0X2luID0gY3JidWZfOworICAgIHdzdHJlYW1fLT5uZXh0X2luID0gdXdidWZfOworICAgIHJzdHJlYW1fLT5uZXh0X291dCA9IHVyYnVmXzsKKyAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgICAgcnN0cmVhbV8tPmF2YWlsX2luID0gMDsKKyAgICB3c3RyZWFtXy0+YXZhaWxfaW4gPSAwOworICAgIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKKyAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87CisKKyAgICBydiA9IGluZmxhdGVJbml0KHJzdHJlYW1fKTsKKyAgICBjaGVja1psaWJSdihydiwgcnN0cmVhbV8tPm1zZyk7CisKKyAgICAvLyBIYXZlIHRvIHNldCB0aGlzIGZsYWcgc28gd2Uga25vdyB3aGV0aGVyIHRvIGRlLWluaXRpYWxpemUuCisgICAgcl9pbml0ID0gdHJ1ZTsKKworICAgIHJ2ID0gZGVmbGF0ZUluaXQod3N0cmVhbV8sIGNvbXBfbGV2ZWxfKTsKKyAgICBjaGVja1psaWJSdihydiwgd3N0cmVhbV8tPm1zZyk7CisgIH0KKworICBjYXRjaCAoLi4uKSB7CisgICAgaWYgKHJfaW5pdCkgeworICAgICAgcnYgPSBpbmZsYXRlRW5kKHJzdHJlYW1fKTsKKyAgICAgIGNoZWNrWmxpYlJ2Tm90aHJvdyhydiwgcnN0cmVhbV8tPm1zZyk7CisgICAgfQorICAgIC8vIFRoZXJlIGlzIG5vIHdheSB3ZSBjYW4gZ2V0IGhlcmUgaWYgd3N0cmVhbV8gd2FzIGluaXRpYWxpemVkLgorCisgICAgdGhyb3c7CisgIH0KK30KKworaW5saW5lIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNoZWNrWmxpYlJ2KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgaWYgKHN0YXR1cyAhPSBaX09LKSB7CisgICAgdGhyb3cgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24oc3RhdHVzLCBtZXNzYWdlKTsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBUWmxpYlRyYW5zcG9ydDo6Y2hlY2tabGliUnZOb3Rocm93KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgaWYgKHN0YXR1cyAhPSBaX09LKSB7CisgICAgc3RyaW5nIG91dHB1dCA9ICJUWmxpYlRyYW5zcG9ydDogemxpYiBmYWlsdXJlIGluIGRlc3RydWN0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbjo6ZXJyb3JNZXNzYWdlKHN0YXR1cywgbWVzc2FnZSk7CisgICAgR2xvYmFsT3V0cHV0KG91dHB1dC5jX3N0cigpKTsKKyAgfQorfQorCitUWmxpYlRyYW5zcG9ydDo6flRabGliVHJhbnNwb3J0KCkgeworICBpbnQgcnY7CisgIHJ2ID0gaW5mbGF0ZUVuZChyc3RyZWFtXyk7CisgIGNoZWNrWmxpYlJ2Tm90aHJvdyhydiwgcnN0cmVhbV8tPm1zZyk7CisKKyAgcnYgPSBkZWZsYXRlRW5kKHdzdHJlYW1fKTsKKyAgLy8gWl9EQVRBX0VSUk9SIG1heSBiZSByZXR1cm5lZCBpZiB0aGUgY2FsbGVyIGhhcyB3cml0dGVuIGRhdGEsIGJ1dCBub3QKKyAgLy8gY2FsbGVkIGZsdXNoKCkgdG8gYWN0dWFsbHkgZmluaXNoIHdyaXRpbmcgdGhlIGRhdGEgb3V0IHRvIHRoZSB1bmRlcmx5aW5nCisgIC8vIHRyYW5zcG9ydC4gIFRoZSBkZWZpbmVkIFRUcmFuc3BvcnQgYmVoYXZpb3IgaW4gdGhpcyBjYXNlIGlzIHRoYXQgdGhpcyBkYXRhCisgIC8vIG1heSBiZSBkaXNjYXJkZWQsIHNvIHdlIGlnbm9yZSB0aGUgZXJyb3IgYW5kIHNpbGVudGx5IGRpc2NhcmQgdGhlIGRhdGEuCisgIC8vIEZvciBvdGhlciBlcnJvcywgbG9nIGEgbWVzc2FnZS4KKyAgaWYgKHJ2ICE9IFpfREFUQV9FUlJPUikgeworICAgIGNoZWNrWmxpYlJ2Tm90aHJvdyhydiwgd3N0cmVhbV8tPm1zZyk7CisgIH0KKworICBkZWxldGVbXSB1cmJ1Zl87CisgIGRlbGV0ZVtdIGNyYnVmXzsKKyAgZGVsZXRlW10gdXdidWZfOworICBkZWxldGVbXSBjd2J1Zl87CisgIGRlbGV0ZSByc3RyZWFtXzsKKyAgZGVsZXRlIHdzdHJlYW1fOworfQorCitib29sIFRabGliVHJhbnNwb3J0Ojppc09wZW4oKSB7CisgIHJldHVybiAocmVhZEF2YWlsKCkgPiAwKSB8fCAocnN0cmVhbV8tPmF2YWlsX2luID4gMCkgfHwgdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Cit9CisKK2Jvb2wgVFpsaWJUcmFuc3BvcnQ6OnBlZWsoKSB7CisgIHJldHVybiAocmVhZEF2YWlsKCkgPiAwKSB8fCAocnN0cmVhbV8tPmF2YWlsX2luID4gMCkgfHwgdHJhbnNwb3J0Xy0+cGVlaygpOworfQorCisvLyBSRUFESU5HIFNUUkFURUdZCisvLworLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3IgcmVhZGluZzogb25lIGNvbnRhaW5pbmcgdGhlIGNvbXByZXNzZWQgZGF0YSAoY3JidWZfKQorLy8gYW5kIG9uZSBjb250YWluaW5nIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAodXJidWZfKS4gIFdoZW4gcmVhZCBpcyBjYWxsZWQsCisvLyB3ZSByZXBlYXQgdGhlIGZvbGxvd2luZyBzdGVwcyB1bnRpbCB3ZSBoYXZlIHNhdGlzZmllZCB0aGUgcmVxdWVzdDoKKy8vIC0gQ29weSBkYXRhIGZyb20gdXJidWZfIGludG8gdGhlIGNhbGxlcidzIGJ1ZmZlci4KKy8vIC0gSWYgd2UgaGFkIGVub3VnaCwgcmV0dXJuLgorLy8gLSBJZiB1cmJ1Zl8gaXMgZW1wdHksIHJlYWQgc29tZSBkYXRhIGludG8gaXQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisvLyAtIEluZmxhdGUgZGF0YSBmcm9tIGNyYnVmXyBpbnRvIHVyYnVmXy4KKy8vCisvLyBJbiBzdGFuZGFsb25lIG9iamVjdHMsIHdlIHNldCBpbnB1dF9lbmRlZF8gdG8gdHJ1ZSB3aGVuIGluZmxhdGUgcmV0dXJucworLy8gWl9TVFJFQU1fRU5ELiAgVGhpcyBhbGxvd3MgdG8gbWFrZSBzdXJlIHRoYXQgYSBjaGVja3N1bSB3YXMgdmVyaWZpZWQuCisKK2lubGluZSBpbnQgVFpsaWJUcmFuc3BvcnQ6OnJlYWRBdmFpbCgpIHsKKyAgcmV0dXJuIHVyYnVmX3NpemVfIC0gcnN0cmVhbV8tPmF2YWlsX291dCAtIHVycG9zXzsKK30KKwordWludDMyX3QgVFpsaWJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgdWludDMyX3QgbmVlZCA9IGxlbjsKKworICAvLyBUT0RPKGRyZWlzcyk6IFNraXAgdXJidWYgb24gYmlnIHJlYWRzLgorCisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZSBhdmFpbGFibGUsIHRoZW4gZ2l2ZSB0aGVtIHRoZSBtaW4gb2YKKyAgICAvLyB3aGF0IHdlIGhhdmUgYW5kIHdoYXQgdGhleSB3YW50LCB0aGVuIGFkdmFuY2UgaW5kaWNlcy4KKyAgICBpbnQgZ2l2ZSA9IChzdGQ6Om1pbikoKHVpbnQzMl90KXJlYWRBdmFpbCgpLCBuZWVkKTsKKyAgICBtZW1jcHkoYnVmLCB1cmJ1Zl8gKyB1cnBvc18sIGdpdmUpOworICAgIG5lZWQgLT0gZ2l2ZTsKKyAgICBidWYgKz0gZ2l2ZTsKKyAgICB1cnBvc18gKz0gZ2l2ZTsKKworICAgIC8vIElmIHRoZXkgd2VyZSBzYXRpc2ZpZWQsIHdlIGFyZSBkb25lLgorICAgIGlmIChuZWVkID09IDApIHsKKyAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgLy8gSWYgd2Ugd2lsbCBuZWVkIHRvIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gZ2V0IG1vcmUgZGF0YSwKKyAgICAvLyBidXQgd2UgYWxyZWFkeSBoYXZlIHNvbWUgZGF0YSBhdmFpbGFibGUsIHJldHVybiBpdCBub3cuICBSZWFkaW5nIGZyb20KKyAgICAvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbWF5IGJsb2NrLCBhbmQgcmVhZCgpIGlzIG9ubHkgYWxsb3dlZCB0byBibG9jaworICAgIC8vIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUuCisgICAgaWYgKG5lZWQgPCBsZW4gJiYgcnN0cmVhbV8tPmF2YWlsX2luID09IDApIHsKKyAgICAgIHJldHVybiBsZW4gLSBuZWVkOworICAgIH0KKworICAgIC8vIElmIHdlIGdldCB0byB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGdldCBzb21lIG1vcmUgZGF0YS4KKworICAgIC8vIElmIHpsaWIgaGFzIHJlcG9ydGVkIHRoZSBlbmQgb2YgYSBzdHJlYW0sIHdlIGNhbid0IHJlYWxseSBkbyBhbnkgbW9yZS4KKyAgICBpZiAoaW5wdXRfZW5kZWRfKSB7CisgICAgICByZXR1cm4gbGVuIC0gbmVlZDsKKyAgICB9CisKKyAgICAvLyBUaGUgdW5jb21wcmVzc2VkIHJlYWQgYnVmZmVyIGlzIGVtcHR5LCBzbyByZXNldCB0aGUgc3RyZWFtIGZpZWxkcy4KKyAgICByc3RyZWFtXy0+bmV4dF9vdXQgPSB1cmJ1Zl87CisgICAgcnN0cmVhbV8tPmF2YWlsX291dCA9IHVyYnVmX3NpemVfOworICAgIHVycG9zXyA9IDA7CisKKyAgICAvLyBDYWxsIGluZmxhdGUoKSB0byB1bmNvbXByZXNzIHNvbWUgbW9yZSBkYXRhCisgICAgaWYgKCFyZWFkRnJvbVpsaWIoKSkgeworICAgICAgLy8gbm8gZGF0YSBhdmFpbGFibGUgZnJvbSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7CisgICAgfQorCisgICAgLy8gT2theS4gIFRoZSByZWFkIGJ1ZmZlciBzaG91bGQgaGF2ZSB3aGF0ZXZlciB3ZSBjYW4gZ2l2ZSBpdCBub3cuCisgICAgLy8gTG9vcCBiYWNrIHRvIHRoZSBzdGFydCBhbmQgdHJ5IHRvIGdpdmUgc29tZSBtb3JlLgorICB9Cit9CisKK2Jvb2wgVFpsaWJUcmFuc3BvcnQ6OnJlYWRGcm9tWmxpYigpIHsKKyAgYXNzZXJ0KCFpbnB1dF9lbmRlZF8pOworCisgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29tcHJlc3NlZCBkYXRhIGF2YWlsYWJsZSwKKyAgLy8gcmVhZCBzb21lIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICBpZiAocnN0cmVhbV8tPmF2YWlsX2luID09IDApIHsKKyAgICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKGNyYnVmXywgY3JidWZfc2l6ZV8pOworICAgIGlmIChnb3QgPT0gMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByc3RyZWFtXy0+bmV4dF9pbiA9IGNyYnVmXzsKKyAgICByc3RyZWFtXy0+YXZhaWxfaW4gPSBnb3Q7CisgIH0KKworICAvLyBXZSBoYXZlIHNvbWUgY29tcHJlc3NlZCBkYXRhIG5vdy4gIFVuY29tcHJlc3MgaXQuCisgIGludCB6bGliX3J2ID0gaW5mbGF0ZShyc3RyZWFtXywgWl9TWU5DX0ZMVVNIKTsKKworICBpZiAoemxpYl9ydiA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICBpbnB1dF9lbmRlZF8gPSB0cnVlOworICB9IGVsc2UgeworICAgIGNoZWNrWmxpYlJ2KHpsaWJfcnYsIHJzdHJlYW1fLT5tc2cpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFdSSVRJTkcgU1RSQVRFR1kKKy8vCisvLyBXZSBidWZmZXIgdXAgc21hbGwgd3JpdGVzIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gemxpYiwgc28gb3VyIGxvZ2ljIGlzOgorLy8gLSBJcyB0aGUgd3JpdGUgYmlnPworLy8gICAtIFNlbmQgdGhlIGJ1ZmZlciB0byB6bGliLgorLy8gICAtIFNlbmQgdGhpcyBkYXRhIHRvIHpsaWIuCisvLyAtIElzIHRoZSB3cml0ZSBzbWFsbD8KKy8vICAgLSBJcyB0aGVyZSBpbnN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgaXQ/CisvLyAgICAgLSBTZW5kIHRoZSBidWZmZXIgdG8gemxpYi4KKy8vICAgLSBDb3B5IHRoZSBkYXRhIHRvIHRoZSBidWZmZXIuCisvLworLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3Igd3JpdGluZyBhbHNvOiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlciAobWVudGlvbmVkCisvLyBhYm92ZSkgYW5kIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4gIFdoZW4gc2VuZGluZyBkYXRhIHRvIHpsaWIgd2UgbG9vcCBvdmVyCisvLyB0aGUgZm9sbG93aW5nIHVudGlsIHRoZSBzb3VyY2UgKHVuY29tcHJlc3NlZCBidWZmZXIgb3IgYmlnIHdyaXRlKSBpcyBlbXB0eToKKy8vIC0gSXMgdGhlcmUgbm8gbW9yZSBzcGFjZSBpbiB0aGUgY29tcHJlc3NlZCBidWZmZXI/CisvLyAgIC0gV3JpdGUgdGhlIGNvbXByZXNzZWQgYnVmZmVyIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKy8vIC0gRGVmbGF0ZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgY29tcHJlc3NlZCBidWZmZXIuCisKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChvdXRwdXRfZmluaXNoZWRfKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIndyaXRlKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIik7CisgIH0KKworICAvLyB6bGliJ3MgImRlZmxhdGUiIGZ1bmN0aW9uIGhhcyBlbm91Z2ggbG9naWMgaW4gaXQgdGhhdCBJIHRoaW5rCisgIC8vIHdlJ3JlIGJldHRlciBvZmYgKHBlcmZvcm1hbmNlLXdpc2UpIGJ1ZmZlcmluZyB1cCBzbWFsbCB3cml0ZXMuCisgIGlmIChsZW4gPiBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSkgeworICAgIGZsdXNoVG9abGliKHV3YnVmXywgdXdwb3NfLCBaX05PX0ZMVVNIKTsKKyAgICB1d3Bvc18gPSAwOworICAgIGZsdXNoVG9abGliKGJ1ZiwgbGVuLCBaX05PX0ZMVVNIKTsKKyAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CisgICAgaWYgKHV3YnVmX3NpemVfIC0gdXdwb3NfIDwgbGVuKSB7CisgICAgICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9OT19GTFVTSCk7CisgICAgICB1d3Bvc18gPSAwOworICAgIH0KKyAgICBtZW1jcHkodXdidWZfICsgdXdwb3NfLCBidWYsIGxlbik7CisgICAgdXdwb3NfICs9IGxlbjsKKyAgfQorfQorCit2b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgaWYgKG91dHB1dF9maW5pc2hlZF8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiZmx1c2goKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiKTsKKyAgfQorCisgIGZsdXNoVG9abGliKHV3YnVmXywgdXdwb3NfLCBaX0JMT0NLKTsKKyAgdXdwb3NfID0gMDsKKworICBpZih3c3RyZWFtXy0+YXZhaWxfb3V0IDwgNil7CisgICAgdHJhbnNwb3J0Xy0+d3JpdGUoY3didWZfLCBjd2J1Zl9zaXplXyAtIHdzdHJlYW1fLT5hdmFpbF9vdXQpOworICAgIHdzdHJlYW1fLT5uZXh0X291dCA9IGN3YnVmXzsKKyAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87CisgIH0KKworICBmbHVzaFRvVHJhbnNwb3J0KFpfRlVMTF9GTFVTSCk7Cit9CisKK3ZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZpbmlzaCgpIHsKKyAgaWYgKG91dHB1dF9maW5pc2hlZF8pIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiZmluaXNoKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIik7CisgIH0KKworICBmbHVzaFRvVHJhbnNwb3J0KFpfRklOSVNIKTsKK30KKwordm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2hUb1RyYW5zcG9ydChpbnQgZmx1c2gpIHsKKyAgLy8gd3JpdGUgcGVuZGluZyBkYXRhIGluIHV3YnVmXyB0byB6bGliCisgIGZsdXNoVG9abGliKHV3YnVmXywgdXdwb3NfLCBmbHVzaCk7CisgIHV3cG9zXyA9IDA7CisKKyAgLy8gd3JpdGUgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gemxpYiB0byB0aGUgdHJhbnNwb3J0CisgIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8gLSB3c3RyZWFtXy0+YXZhaWxfb3V0KTsKKyAgd3N0cmVhbV8tPm5leHRfb3V0ID0gY3didWZfOworICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87CisKKyAgLy8gZmx1c2ggdGhlIHRyYW5zcG9ydAorICB0cmFuc3BvcnRfLT5mbHVzaCgpOworfQorCit2b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaFRvWmxpYihjb25zdCB1aW50OF90KiBidWYsIGludCBsZW4sIGludCBmbHVzaCkgeworICB3c3RyZWFtXy0+bmV4dF9pbiA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KGJ1Zik7CisgIHdzdHJlYW1fLT5hdmFpbF9pbiA9IGxlbjsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgoZmx1c2ggPT0gWl9OT19GTFVTSCB8fCBmbHVzaCA9PSBaX0JMT0NLKSAmJiB3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gSWYgb3VyIG91cHV0IGJ1ZmZlciBpcyBmdWxsLCBmbHVzaCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgaWYgKHdzdHJlYW1fLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgdHJhbnNwb3J0Xy0+d3JpdGUoY3didWZfLCBjd2J1Zl9zaXplXyk7CisgICAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgICAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87CisgICAgfQorCisgICAgaW50IHpsaWJfcnYgPSBkZWZsYXRlKHdzdHJlYW1fLCBmbHVzaCk7CisKKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0ggJiYgemxpYl9ydiA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgIGFzc2VydCh3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMCk7CisgICAgICBvdXRwdXRfZmluaXNoZWRfID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNoZWNrWmxpYlJ2KHpsaWJfcnYsIHdzdHJlYW1fLT5tc2cpOworCisgICAgaWYgKChmbHVzaCA9PSBaX1NZTkNfRkxVU0ggfHwgZmx1c2ggPT0gWl9GVUxMX0ZMVVNIKSAmJiB3c3RyZWFtXy0+YXZhaWxfaW4gPT0gMAorICAgICAgICAmJiB3c3RyZWFtXy0+YXZhaWxfb3V0ICE9IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitjb25zdCB1aW50OF90KiBUWmxpYlRyYW5zcG9ydDo6Ym9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeworICAodm9pZClidWY7CisgIC8vIERvbid0IHRyeSB0byBiZSBjbGV2ZXIgd2l0aCBzaGlmdGluZyBidWZmZXJzLgorICAvLyBJZiB3ZSBoYXZlIGVub3VnaCBkYXRhLCBnaXZlIGEgcG9pbnRlciB0byBpdCwKKyAgLy8gb3RoZXJ3aXNlIGxldCB0aGUgcHJvdGNvbCB1c2UgaXRzIHNsb3cgcGF0aC4KKyAgaWYgKHJlYWRBdmFpbCgpID49IChpbnQpKmxlbikgeworICAgICpsZW4gPSAodWludDMyX3QpcmVhZEF2YWlsKCk7CisgICAgcmV0dXJuIHVyYnVmXyArIHVycG9zXzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBUWmxpYlRyYW5zcG9ydDo6Y29uc3VtZSh1aW50MzJfdCBsZW4pIHsKKyAgaWYgKHJlYWRBdmFpbCgpID49IChpbnQpbGVuKSB7CisgICAgdXJwb3NfICs9IGxlbjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiY29uc3VtZSBkaWQgbm90IGZvbGxvdyBhIGJvcnJvdy4iKTsKKyAgfQorfQorCit2b2lkIFRabGliVHJhbnNwb3J0Ojp2ZXJpZnlDaGVja3N1bSgpIHsKKyAgLy8gSWYgemxpYiBoYXMgYWxyZWFkeSByZXBvcnRlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sCisgIC8vIGl0IGhhcyB2ZXJpZmllZCB0aGUgY2hlY2tzdW0uCisgIGlmIChpbnB1dF9lbmRlZF8pIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHJlYWRpbmcgaXMgY29tcGxldGUuCisgIC8vIElmIHRoZSBjYWxsZXIgc3RpbGwgaGFzIHVucmVhZCBkYXRhLCB0aHJvdyBhbiBleGNlcHRpb24uCisgIGlmIChyZWFkQXZhaWwoKSA+IDApIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeUNoZWNrc3VtKCkgY2FsbGVkIGJlZm9yZSBlbmQgb2YgemxpYiBzdHJlYW0iKTsKKyAgfQorCisgIC8vIFJlc2V0IHRoZSByc3RyZWFtIGZpZWxkcywgaW4gY2FzZSBhdmFpbF9vdXQgaXMgMC4KKyAgLy8gKFNpbmNlIHJlYWRBdmFpbCgpIGlzIDAsIHdlIGtub3cgdGhlcmUgaXMgbm8gdW5yZWFkIGRhdGEgaW4gdXJidWZfKQorICByc3RyZWFtXy0+bmV4dF9vdXQgPSB1cmJ1Zl87CisgIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKKyAgdXJwb3NfID0gMDsKKworICAvLyBDYWxsIGluZmxhdGUoKQorICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjaGVja3N1bSBpcyBiYWQuCisgIGJvb2wgcGVyZm9ybWVkX2luZmxhdGUgPSByZWFkRnJvbVpsaWIoKTsKKyAgaWYgKCFwZXJmb3JtZWRfaW5mbGF0ZSkgeworICAgIC8vIFdlIG5lZWRlZCB0byByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBhbmQgdGhlIHJlYWQoKSBjYWxsCisgICAgLy8gcmV0dXJuZWQgMC4KKyAgICAvLworICAgIC8vIE5vdCBhbGwgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgYmVoYXZlIHRoZSBzYW1lIHdheSBoZXJlLCBzbyB3ZSdsbAorICAgIC8vIGVuZCB1cCB3aXRoIGRpZmZlcmVudCBiZWhhdmlvciBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgIC8vCisgICAgLy8gRm9yIHNvbWUgdHJhbnNwb3J0cyAoZS5nLiwgVEZEVHJhbnNwb3J0KSwgcmVhZCgpIGJsb2NrcyBpZiBubyBtb3JlIGRhdGEKKyAgICAvLyBpcyBhdmFpbGFibGUuICBUaGV5IG9ubHkgcmV0dXJuIDAgaWYgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIG9yIGlmIHRoZQorICAgIC8vIHJlbW90ZSBlbmRwb2ludCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiAgRm9yIHRob3NlIHRyYW5zcG9ydHMsCisgICAgLy8gdmVyaWZ5Q2hlY2tzdW0oKSB3aWxsIGJsb2NrIHVudGlsIHRoZSBjaGVja3N1bSBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICAvLworICAgIC8vIE90aGVyIHRyYW5zcG9ydCB0eXBlcyAoZS5nLiwgVE1lbW9yeUJ1ZmZlcikgYWx3YXlzIHJldHVybiAwIGltbWVkaWF0ZWx5CisgICAgLy8gaWYgbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZS4gIEZvciB0aG9zZSB0cmFuc3BvcnQgdHlwZXMsIHZlcmlmeUNoZWNrc3VtCisgICAgLy8gd2lsbCByYWlzZSB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBpZiB0aGUgY2hlY2tzdW0gaXMgbm90IGF2YWlsYWJsZSBmcm9tCisgICAgLy8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHlldC4KKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrc3VtIG5vdCBhdmFpbGFibGUgeWV0IGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIik7CisgIH0KKworICAvLyBJZiBpbnB1dF9lbmRlZF8gaXMgdHJ1ZSBub3csIHRoZSBjaGVja3N1bSBoYXMgYmVlbiB2ZXJpZmllZAorICBpZiAoaW5wdXRfZW5kZWRfKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVGhlIGNhbGxlciBpbnZva2VkIHVzIGJlZm9yZSB0aGUgYWN0dWFsIGVuZCBvZiB0aGUgZGF0YSBzdHJlYW0KKyAgYXNzZXJ0KHJzdHJlYW1fLT5hdmFpbF9vdXQgPCB1cmJ1Zl9zaXplXyk7CisgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeUNoZWNrc3VtKCkgY2FsbGVkIGJlZm9yZSBlbmQgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6bGliIHN0cmVhbSIpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1ZWM0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCitzdHJ1Y3Qgel9zdHJlYW1fczsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24oaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKQorICAgIDogVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgZXJyb3JNZXNzYWdlKHN0YXR1cywgbXNnKSksCisgICAgICB6bGliX3N0YXR1c18oc3RhdHVzKSwKKyAgICAgIHpsaWJfbXNnXyhtc2cgPT0gTlVMTCA/ICIobnVsbCkiIDogbXNnKSB7fQorCisgIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RXhjZXB0aW9uKCkgbm9leGNlcHQge30KKworICBpbnQgZ2V0WmxpYlN0YXR1cygpIHsgcmV0dXJuIHpsaWJfc3RhdHVzXzsgfQorICBzdGQ6OnN0cmluZyBnZXRabGliTWVzc2FnZSgpIHsgcmV0dXJuIHpsaWJfbXNnXzsgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2UoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKSB7CisgICAgc3RkOjpzdHJpbmcgcnYgPSAiemxpYiBlcnJvcjogIjsKKyAgICBpZiAobXNnKSB7CisgICAgICBydiArPSBtc2c7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ2ICs9ICIobm8gbWVzc2FnZSkiOworICAgIH0KKyAgICBydiArPSAiIChzdGF0dXMgPSAiOworICAgIHJ2ICs9IHRvX3N0cmluZyhzdGF0dXMpOworICAgIHJ2ICs9ICIpIjsKKyAgICByZXR1cm4gcnY7CisgIH0KKworICBpbnQgemxpYl9zdGF0dXNfOworICBzdGQ6OnN0cmluZyB6bGliX21zZ187Cit9OworCisvKioKKyAqIFRoaXMgdHJhbnNwb3J0IHVzZXMgemxpYiB0byBjb21wcmVzcyBvbiB3cml0ZSBhbmQgZGVjb21wcmVzcyBvbiByZWFkCisgKgorICogVE9ETyhkcmVpc3MpOiBEb24ndCBkbyBhbiBleHRyYSBjb3B5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaWYKKyAqICAgICAgICAgICAgICAgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIFRCdWZmZXJlZCBvciBUTWVtb3J5LgorICoKKyAqLworY2xhc3MgVFpsaWJUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFpsaWJUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIEBwYXJhbSB0cmFuc3BvcnQgICAgVGhlIHRyYW5zcG9ydCB0byByZWFkIGNvbXByZXNzZWQgZGF0YSBmcm9tCisgICAqICAgICAgICAgICAgICAgICAgICAgYW5kIHdyaXRlIGNvbXByZXNzZWQgZGF0YSB0by4KKyAgICogQHBhcmFtIHVyYnVmX3NpemUgICBVbmNvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHJlYWRpbmcuCisgICAqIEBwYXJhbSBjcmJ1Zl9zaXplICAgQ29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3IgcmVhZGluZy4KKyAgICogQHBhcmFtIHV3YnVmX3NpemUgICBVbmNvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHdyaXRpbmcuCisgICAqIEBwYXJhbSBjd2J1Zl9zaXplICAgQ29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3Igd3JpdGluZy4KKyAgICogQHBhcmFtIGNvbXBfbGV2ZWwgICBDb21wcmVzc2lvbiBsZXZlbCAoMD1ub25lW2Zhc3RdLCA2PWRlZmF1bHQsIDk9bWF4W3Nsb3ddKS4KKyAgICovCisgIFRabGliVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIGludCB1cmJ1Zl9zaXplID0gREVGQVVMVF9VUkJVRl9TSVpFLAorICAgICAgICAgICAgICAgICBpbnQgY3JidWZfc2l6ZSA9IERFRkFVTFRfQ1JCVUZfU0laRSwKKyAgICAgICAgICAgICAgICAgaW50IHV3YnVmX3NpemUgPSBERUZBVUxUX1VXQlVGX1NJWkUsCisgICAgICAgICAgICAgICAgIGludCBjd2J1Zl9zaXplID0gREVGQVVMVF9DV0JVRl9TSVpFLAorICAgICAgICAgICAgICAgICBpbnQxNl90IGNvbXBfbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICB1cnBvc18oMCksCisgICAgICB1d3Bvc18oMCksCisgICAgICBpbnB1dF9lbmRlZF8oZmFsc2UpLAorICAgICAgb3V0cHV0X2ZpbmlzaGVkXyhmYWxzZSksCisgICAgICB1cmJ1Zl9zaXplXyh1cmJ1Zl9zaXplKSwKKyAgICAgIGNyYnVmX3NpemVfKGNyYnVmX3NpemUpLAorICAgICAgdXdidWZfc2l6ZV8odXdidWZfc2l6ZSksCisgICAgICBjd2J1Zl9zaXplXyhjd2J1Zl9zaXplKSwKKyAgICAgIHVyYnVmXyhOVUxMKSwKKyAgICAgIGNyYnVmXyhOVUxMKSwKKyAgICAgIHV3YnVmXyhOVUxMKSwKKyAgICAgIGN3YnVmXyhOVUxMKSwKKyAgICAgIHJzdHJlYW1fKE5VTEwpLAorICAgICAgd3N0cmVhbV8oTlVMTCksCisgICAgICBjb21wX2xldmVsXyhjb21wX2xldmVsKSB7CisgICAgaWYgKHV3YnVmX3NpemVfIDwgTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKKyAgICAgIC8vIEhhdmUgdG8gY29weSB0aGlzIGludG8gYSBsb2NhbCBiZWNhdXNlIG9mIGEgbGlua2luZyBpc3N1ZS4KKyAgICAgIGludCBtaW5pbXVtID0gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkU7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFpMaWJUcmFuc3BvcnQ6IHVuY29tcHJlc3NlZCB3cml0ZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0b19zdHJpbmcobWluaW11bSkgKyAiLiIpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICB1cmJ1Zl8gPSBuZXcgdWludDhfdFt1cmJ1Zl9zaXplXTsKKyAgICAgIGNyYnVmXyA9IG5ldyB1aW50OF90W2NyYnVmX3NpemVdOworICAgICAgdXdidWZfID0gbmV3IHVpbnQ4X3RbdXdidWZfc2l6ZV07CisgICAgICBjd2J1Zl8gPSBuZXcgdWludDhfdFtjd2J1Zl9zaXplXTsKKworICAgICAgLy8gRG9uJ3QgY2FsbCB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbnN0cnVjdG9yLgorICAgICAgaW5pdFpsaWIoKTsKKworICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgZGVsZXRlW10gdXJidWZfOworICAgICAgZGVsZXRlW10gY3JidWZfOworICAgICAgZGVsZXRlW10gdXdidWZfOworICAgICAgZGVsZXRlW10gY3didWZfOworICAgICAgdGhyb3c7CisgICAgfQorICB9CisKKyAgLy8gRG9uJ3QgY2FsbCB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbnN0cnVjdG9yLgorICB2b2lkIGluaXRabGliKCk7CisKKyAgLyoqCisgICAqIFRabGliVHJhbnNwb3J0IGRlc3RydWN0b3IuCisgICAqCisgICAqIFdhcm5pbmc6IERlc3Ryb3lpbmcgYSBUWmxpYlRyYW5zcG9ydCBvYmplY3QgbWF5IGRpc2NhcmQgYW55IHdyaXR0ZW4gYnV0CisgICAqIHVuZmx1c2hlZCBkYXRhLiAgWW91IG11c3QgZXhwbGljaXRseSBjYWxsIGZsdXNoKCkgb3IgZmluaXNoKCkgdG8gZW5zdXJlCisgICAqIHRoYXQgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuIGFuZCBmbHVzaGVkIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICovCisgIH5UWmxpYlRyYW5zcG9ydCgpOworCisgIGJvb2wgaXNPcGVuKCk7CisgIGJvb2wgcGVlaygpOworCisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CisKKyAgdm9pZCBjbG9zZSgpIHsgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsgfQorCisgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCisgIHZvaWQgZmx1c2goKTsKKworICAvKioKKyAgICogRmluYWxpemUgdGhlIHpsaWIgc3RyZWFtLgorICAgKgorICAgKiBUaGlzIGNhdXNlcyB6bGliIHRvIGZsdXNoIGFueSBwZW5kaW5nIHdyaXRlIGRhdGEgYW5kIHdyaXRlIGVuZC1vZi1zdHJlYW0KKyAgICogaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgY2hlY2tzdW0uICBPbmNlIGZpbmlzaCgpIGhhcyBiZWVuIGNhbGxlZCwgbm8KKyAgICogbmV3IGRhdGEgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4KKyAgICovCisgIHZvaWQgZmluaXNoKCk7CisKKyAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CisKKyAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbik7CisKKyAgLyoqCisgICAqIFZlcmlmeSB0aGUgY2hlY2tzdW0gYXQgdGhlIGVuZCBvZiB0aGUgemxpYiBzdHJlYW0uCisgICAqCisgICAqIFRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIGFsbCBkYXRhIGhhcyBiZWVuIHJlYWQuCisgICAqIEl0IHZlcmlmaWVzIHRoZSBjaGVja3N1bSB0aGF0IHdhcyB3cml0dGVuIGJ5IHRoZSBmaW5pc2goKSBjYWxsLgorICAgKi8KKyAgdm9pZCB2ZXJpZnlDaGVja3N1bSgpOworCisgIC8qKgorICAgKiBUT0RPKHNvbWVvbmVfc21hcnQpOiBDaG9vc2Ugc21hcnQgZGVmYXVsdHMuCisgICAqLworICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfVVJCVUZfU0laRSA9IDEyODsKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0NSQlVGX1NJWkUgPSAxMDI0OworICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfVVdCVUZfU0laRSA9IDEyODsKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0NXQlVGX1NJWkUgPSAxMDI0OworCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgY29uc3QgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQorCitwcm90ZWN0ZWQ6CisgIGlubGluZSB2b2lkIGNoZWNrWmxpYlJ2KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7CisgIGlubGluZSB2b2lkIGNoZWNrWmxpYlJ2Tm90aHJvdyhpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpOworICBpbmxpbmUgaW50IHJlYWRBdmFpbCgpOworICB2b2lkIGZsdXNoVG9UcmFuc3BvcnQoaW50IGZsdXNoKTsKKyAgdm9pZCBmbHVzaFRvWmxpYihjb25zdCB1aW50OF90KiBidWYsIGludCBsZW4sIGludCBmbHVzaCk7CisgIGJvb2wgcmVhZEZyb21abGliKCk7CisKK3Byb3RlY3RlZDoKKyAgLy8gV3JpdGVzIHNtYWxsZXIgdGhhbiB0aGlzIGFyZSBidWZmZXJlZCB1cC4KKyAgLy8gTGFyZ2VyIChvciBlcXVhbCkgd3JpdGVzIGFyZSBkdW1wZWQgc3RyYWlnaHQgdG8gemxpYi4KKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFID0gMzI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisKKyAgaW50IHVycG9zXzsKKyAgaW50IHV3cG9zXzsKKworICAvLy8gVHJ1ZSBpZmYgemxpYiBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgIGJvb2wgaW5wdXRfZW5kZWRfOworICAvLy8gVHJ1ZSBpZmYgd2UgaGF2ZSBmaW5pc2hlZCB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgYm9vbCBvdXRwdXRfZmluaXNoZWRfOworCisgIHVpbnQzMl90IHVyYnVmX3NpemVfOworICB1aW50MzJfdCBjcmJ1Zl9zaXplXzsKKyAgdWludDMyX3QgdXdidWZfc2l6ZV87CisgIHVpbnQzMl90IGN3YnVmX3NpemVfOworCisgIHVpbnQ4X3QqIHVyYnVmXzsKKyAgdWludDhfdCogY3JidWZfOworICB1aW50OF90KiB1d2J1Zl87CisgIHVpbnQ4X3QqIGN3YnVmXzsKKworICBzdHJ1Y3Qgel9zdHJlYW1fcyogcnN0cmVhbV87CisgIHN0cnVjdCB6X3N0cmVhbV9zKiB3c3RyZWFtXzsKKworICBjb25zdCBpbnQgY29tcF9sZXZlbF87Cit9OworCisvKioKKyAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSB6bGliYmVkIG9uZS4KKyAqCisgKi8KK2NsYXNzIFRabGliVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CitwdWJsaWM6CisgIFRabGliVHJhbnNwb3J0RmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB+VFpsaWJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFpsaWJUcmFuc3BvcnQodHJhbnMpKTsKKyAgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwODI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oPgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKy8vIHdpbjMyCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX01TQ19FWFRFTlNJT05TKQorI2RlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgMTE2NDQ0NzM2MDAwMDAwMDBVaTY0CisjZWxzZQorI2RlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgMTE2NDQ0NzM2MDAwMDAwMDBVTEwKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19NSU5HVzMyX18pCitzdHJ1Y3QgdGltZXpvbmUgeworICBpbnQgdHpfbWludXRlc3dlc3Q7IC8qIG1pbnV0ZXMgVyBvZiBHcmVlbndpY2ggKi8KKyAgaW50IHR6X2RzdHRpbWU7ICAgICAvKiB0eXBlIG9mIGRzdCBjb3JyZWN0aW9uICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQoraW50IHRocmlmdF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KSB7CisgIHJldHVybiBnZXR0aW1lb2ZkYXkodHYsdHopOworfQorI2Vsc2UKK2ludCB0aHJpZnRfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgc3RydWN0IHRpbWV6b25lKiB0eikgeworICBGSUxFVElNRSBmdDsKKyAgdW5zaWduZWQgX19pbnQ2NCB0bXByZXMoMCk7CisgIHN0YXRpYyBpbnQgdHpmbGFnOworCisgIGlmIChOVUxMICE9IHR2KSB7CisgICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoJmZ0KTsKKworICAgIHRtcHJlcyB8PSBmdC5kd0hpZ2hEYXRlVGltZTsKKyAgICB0bXByZXMgPDw9IDMyOworICAgIHRtcHJlcyB8PSBmdC5kd0xvd0RhdGVUaW1lOworCisgICAgLypjb252ZXJ0aW5nIGZpbGUgdGltZSB0byB1bml4IGVwb2NoKi8KKyAgICB0bXByZXMgLT0gREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTOworICAgIHRtcHJlcyAvPSAxMDsgLypjb252ZXJ0IGludG8gbWljcm9zZWNvbmRzKi8KKyAgICB0di0+dHZfc2VjID0gKGxvbmcpKHRtcHJlcyAvIDEwMDAwMDBVTCk7CisgICAgdHYtPnR2X3VzZWMgPSAobG9uZykodG1wcmVzICUgMTAwMDAwMFVMKTsKKyAgfQorCisgIGlmIChOVUxMICE9IHR6KSB7CisgICAgaWYgKCF0emZsYWcpIHsKKyAgICAgIF90enNldCgpOworICAgICAgdHpmbGFnKys7CisgICAgfQorCisgICAgbG9uZyB0aW1lX3pvbmUoMCk7CisgICAgZXJybm9fdCBlcnIoX2dldF90aW1lem9uZSgmdGltZV96b25lKSk7CisgICAgaWYgKGVyciA9PSBOT19FUlJPUikgeworICAgICAgdHotPnR6X21pbnV0ZXN3ZXN0ID0gdGltZV96b25lIC8gNjA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQgZGF5X2xpZ2h0KDApOworICAgIGVyciA9IChfZ2V0X2RheWxpZ2h0KCZkYXlfbGlnaHQpKTsKKyAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICB0ei0+dHpfZHN0dGltZSA9IGRheV9saWdodDsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IHRocmlmdF9zbGVlcCh1bnNpZ25lZCBpbnQgc2Vjb25kcykgeworICA6OlNsZWVwKHNlY29uZHMgKiAxMDAwKTsKKyAgcmV0dXJuIDA7Cit9CitpbnQgdGhyaWZ0X3VzbGVlcCh1bnNpZ25lZCBpbnQgbWljcm9zZWNvbmRzKSB7CisgIHVuc2lnbmVkIGludCBtaWxsaXNlY29uZHMgPSAobWljcm9zZWNvbmRzICsgOTk5KSAvIDEwMDA7CisgIDo6U2xlZXAobWlsbGlzZWNvbmRzKTsKKyAgcmV0dXJuIDA7Cit9CisKK2NoYXIqIHRocmlmdF9jdGltZV9yKGNvbnN0IHRpbWVfdCogX2Nsb2NrLCBjaGFyKiBfYnVmKSB7CisgIHN0cmNweShfYnVmLCBjdGltZShfY2xvY2spKTsKKyAgcmV0dXJuIF9idWY7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmFjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX0dFVFRJTUVPRkRBWV9IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfR0VUVElNRU9GREFZX0hfCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciBUaGlzIGlzIGEgTVNWQyBoZWFkZXIgb25seS4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0cnVjdCB0aHJpZnRfdGltZXNwZWMgeworICBpbnQ2NF90IHR2X3NlYzsKKyAgaW50NjRfdCB0dl9uc2VjOworfTsKKworaW50IHRocmlmdF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KTsKK2ludCB0aHJpZnRfc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpOworaW50IHRocmlmdF91c2xlZXAodW5zaWduZWQgaW50IG1pY3JvX3NlY29uZHMpOworY2hhciogdGhyaWZ0X2N0aW1lX3IoY29uc3QgdGltZV90KiBfY2xvY2ssIGNoYXIqIF9idWYpOworCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0dFVFRJTUVPRkRBWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3BlcmF0b3JzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg2MDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3BlcmF0b3JzLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19PUEVSQVRPUlNfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX09QRVJBVE9SU19IXworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK2NsYXNzIFRFbnVtSXRlcmF0b3I7CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVEVudW1JdGVyYXRvciYsIGNvbnN0IFRFbnVtSXRlcmF0b3ImKSB7CisgIC8vIE5vdCBlbnRpcmVseSBzdXJlIHdoYXQgdGhlIHRlc3Qgc2hvdWxkIGJlIGhlcmUuIEl0IGlzIG9ubHkgdG8gZW5hYmxlCisgIC8vIGl0ZXJhdG9yIGRlYnVnZ2luZyBhbmQgaXMgbm90IHVzZWQgaW4gcmVsZWFzZSBtb2RlLgorICByZXR1cm4gdHJ1ZTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19PUEVSQVRPUlNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWM2ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwCkBAIC0wLDAgKzEsMTUxIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVfZXhpdC5ocHA+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK1RPdmVybGFwcGVkV29ya0l0ZW06OlRPdmVybGFwcGVkV29ya0l0ZW0oKQorICA6IFNMSVNUX0VOVFJZKCksCisgICAgYWN0aW9uKFVOS05PV04pLAorICAgIGgoSU5WQUxJRF9IQU5ETEVfVkFMVUUpLAorICAgIGJ1ZmZlcihOVUxMKSwKKyAgICBidWZmZXJfbGVuKDApLAorICAgIG92ZXJsYXAoKSwKKyAgICBsYXN0X2Vycm9yKDApLAorICAgIHN1Y2Nlc3MoVFJVRSkgeworfQorCit2b2lkIFRPdmVybGFwcGVkV29ya0l0ZW06OnJlc2V0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuLCBIQU5ETEUgZXZlbnQpIHsKKyAgbWVtc2V0KCZvdmVybGFwLCAwLCBzaXplb2Yob3ZlcmxhcCkpOworICBvdmVybGFwLmhFdmVudCA9IGV2ZW50OworICBidWZmZXIgPSBidWY7CisgIGJ1ZmZlcl9sZW4gPSBsZW47CisgIGxhc3RfZXJyb3IgPSAwOworICBzdWNjZXNzID0gRkFMU0U7Cit9CisKK3VpbnQzMl90IFRPdmVybGFwcGVkV29ya0l0ZW06Om92ZXJsYXBwZWRSZXN1bHRzKGJvb2wgc2lnbmFsX2ZhaWx1cmUpIHsKKyAgRFdPUkQgYnl0ZXMgPSAwOworICBCT09MIHJlc3VsdCA9IDo6R2V0T3ZlcmxhcHBlZFJlc3VsdChoLCAmb3ZlcmxhcCwgJmJ5dGVzLCBUUlVFKTsKKyAgaWYgKHNpZ25hbF9mYWlsdXJlICYmICFyZXN1bHQpIC8vIGdldCBvdmVybGFwcGVkIGVycm9yIGNhc2UKKyAgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6R2V0T3ZlcmxhcHBlZFJlc3VsdCBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogR2V0T3ZlcmxhcHBlZFJlc3VsdCBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gYnl0ZXM7Cit9CisKK2Jvb2wgVE92ZXJsYXBwZWRXb3JrSXRlbTo6cHJvY2VzcygpIHsKKyAgQk9PU1RfU0NPUEVfRVhJVCgoJmRvbmVTdWJtaXR0aW5nRXZlbnQpKSB7IFNldEV2ZW50KGRvbmVTdWJtaXR0aW5nRXZlbnQuaCk7IH0KKyAgQk9PU1RfU0NPUEVfRVhJVF9FTkQKKworICBzd2l0Y2ggKGFjdGlvbikgeworICBjYXNlIChDT05ORUNUKToKKyAgICBzdWNjZXNzID0gOjpDb25uZWN0TmFtZWRQaXBlKGgsICZvdmVybGFwKTsKKyAgICBpZiAoc3VjY2VzcyA9PSBGQUxTRSkKKyAgICAgIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOworICAgIHJldHVybiB0cnVlOworICBjYXNlIChSRUFEKToKKyAgICBzdWNjZXNzID0gOjpSZWFkRmlsZShoLCBidWZmZXIsIGJ1ZmZlcl9sZW4sIE5VTEwsICZvdmVybGFwKTsKKyAgICBpZiAoc3VjY2VzcyA9PSBGQUxTRSkKKyAgICAgIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOworICAgIHJldHVybiB0cnVlOworICBjYXNlIChDQU5DRUxJTyk6CisgICAgc3VjY2VzcyA9IDo6Q2FuY2VsSW8oaCk7CisgICAgaWYgKHN1Y2Nlc3MgPT0gRkFMU0UpCisgICAgICBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSAoU1RPUCk6CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZvaWQgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjphZGRXb3JrSXRlbShUT3ZlcmxhcHBlZFdvcmtJdGVtKiBpdGVtKSB7CisgIEludGVybG9ja2VkUHVzaEVudHJ5U0xpc3QoJndvcmtMaXN0XywgaXRlbSk7CisgIFNldEV2ZW50KHdvcmtBdmFpbGFibGVFdmVudF8uaCk7CisgIFdhaXRGb3JTaW5nbGVPYmplY3QoaXRlbS0+ZG9uZVN1Ym1pdHRpbmdFdmVudC5oLCBJTkZJTklURSk7Cit9CisKK1RPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjphY3F1aXJlX2luc3RhbmNlKCkgeworICBUQXV0b0NyaXQgbG9jayhpbnN0YW5jZUd1YXJkXyk7CisgIGlmIChpbnN0YW5jZV8gPT0gTlVMTCkgeworICAgIGFzc2VydChpbnN0YW5jZVJlZkNvdW50XyA9PSAwKTsKKyAgICBpbnN0YW5jZV8gPSBuZXcgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOworICB9CisgICsraW5zdGFuY2VSZWZDb3VudF87CisgIHJldHVybiBpbnN0YW5jZV87Cit9Cit2b2lkIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6cmVsZWFzZV9pbnN0YW5jZSgpIHsKKyAgVEF1dG9Dcml0IGxvY2soaW5zdGFuY2VHdWFyZF8pOworICBpZiAoLS1pbnN0YW5jZVJlZkNvdW50XyA9PSAwKSB7CisgICAgZGVsZXRlIGluc3RhbmNlXzsKKyAgICBpbnN0YW5jZV8gPSBOVUxMOworICB9Cit9CisKK1RPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6VE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKCkgeworICBzdG9wSXRlbV8uYWN0aW9uID0gVE92ZXJsYXBwZWRXb3JrSXRlbTo6U1RPUDsKKworICBJbml0aWFsaXplU0xpc3RIZWFkKCZ3b3JrTGlzdF8pOworICB0aHJlYWRfID0gKEhBTkRMRSlfYmVnaW50aHJlYWRleChOVUxMLCAwLCB0aHJlYWRfcHJvYywgdGhpcywgMCwgTlVMTCk7CisgIGlmICh0aHJlYWRfID09IDApIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgdW5hYmxlIHRvIGNyZWF0ZSB0aHJlYWQsIGVycm5vPSIsIGVycm5vKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgdW5hYmxlIHRvIGNyZWF0ZSB0aHJlYWQiKTsKKyAgfQorfQorCitUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6On5UT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQoKSB7CisgIGFkZFdvcmtJdGVtKCZzdG9wSXRlbV8pOworICA6OldhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkXywgSU5GSU5JVEUpOworICBDbG9zZUhhbmRsZSh0aHJlYWRfKTsKK30KKwordm9pZCBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OnJ1bigpIHsKKyAgZm9yICg7OykgeworICAgIFdhaXRGb3JTaW5nbGVPYmplY3Qod29ya0F2YWlsYWJsZUV2ZW50Xy5oLCBJTkZJTklURSk7CisgICAgLy8gdG9kbyBjaGVjayByZXN1bHQKKyAgICBTTElTVF9FTlRSWSogZW50cnkgPSBOVUxMOworICAgIHdoaWxlICgoZW50cnkgPSBJbnRlcmxvY2tlZFBvcEVudHJ5U0xpc3QoJndvcmtMaXN0XykpICE9IE5VTEwpIHsKKyAgICAgIFRPdmVybGFwcGVkV29ya0l0ZW0mIGl0ZW0gPSAqc3RhdGljX2Nhc3Q8VE92ZXJsYXBwZWRXb3JrSXRlbSo+KGVudHJ5KTsKKyAgICAgIGlmICghaXRlbS5wcm9jZXNzKCkpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKwordW5zaWduZWQgX19zdGRjYWxsIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6dGhyZWFkX3Byb2Modm9pZCogYWRkcikgeworICBzdGF0aWNfY2FzdDxUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqPihhZGRyKS0+cnVuKCk7CisgIHJldHVybiAwOworfQorCitUQ3JpdGljYWxTZWN0aW9uIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6aW5zdGFuY2VHdWFyZF87CitUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6aW5zdGFuY2VfOwordWludDMyX3QgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjppbnN0YW5jZVJlZkNvdW50XyA9IDA7Cit9Cit9Cit9IC8vIGFwYWNoOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYzVjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWRfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkX0hfIDEKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciAiT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaCBpcyBvbmx5IHVzYWJsZSBvbiBXaW5kb3dzIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2luY2x1ZGUgPFdpbmRvd3MuaD4KKworLyoKKyAgKioqIFdoeSBkb2VzIHRoaXMgY2xhc3MgZXhpc3Q/CisgIEluIHNob3J0LCBiZWNhdXNlIHdlIHdhbnQgdG8gZW5hYmxlIHNvbWV0aGluZyBzaW1pbGFyIHRvIGEgInNlbGVjdCIgbG9vcCwgb24gV2luZG93cywgd2l0aAorICBuYW1lZCBwaXBlcy4gIFRoZSBjb3JlIG9mIHRoZSAic2VsZWN0IiBsb29wIGlzIGEgY2FsbCB0byBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzLiAgU28gdGhhdCBtZWFucworICB3ZSBuZWVkIGEgc2lnbmFsYWJsZSBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZS4KKworICBBIHBpcGUgaGFuZGxlIGRvZXNuJ3QgZG8gdGhhdC4gIEEgcGlwZSBoYW5kbGUgaXMgc2lnbmFsZWQgd2hlbiBhIHJlYWQgb3Igd3JpdGUgY29tcGxldGVzLCBhbmQgaWYKKyAgbm8gb25lIGhhcyBjYWxsZWQgcmVhZCBvciB3cml0ZSwgdGhlbiB0aGUgcGlwZSBoYW5kbGUgaXMgdXNlbGVzcyBpbiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzLiAgU28KKyAgaW5zdGVhZCwgd2UgdXNlIG92ZXJsYXBwZWQgSS9PLiAgV2l0aCBvdmVybGFwcGVkIEkvTywgeW91IGNhbGwgcmVhZCwgYW5kIGFzc29jaWF0ZSBhbiBldmVudCB3aXRoCisgIHRoZSByZWFkLiAgV2hlbiB0aGUgcmVhZCBmaW5pc2hlcywgdGhlIGV2ZW50IGlzIHNpZ25hbGVkLiAgVGhpcyBtZWFucyB0aGF0IHdoZW4geW91IGNyZWF0ZSBhIHBpcGUsCisgIHlvdSBzdGFydCBhIHJlYWQuICBXaGVuIHRoZSBjdXN0b21lciBjYWxscyByZWFkIG9uIHlvdXIgdHJhbnNwb3J0IG9iamVjdCwgeW91IHdhaXQgZm9yIHRoZSBsYXN0CisgIHJlYWQgdG8gZmluaXNoLCBhbmQgdGhlbiBraWNrIG9mZiBhbm90aGVyLgorCisgIFRoZXJlIGlzIG9uZSBiaWcgY2F2ZWF0IHRvIHRoaXMgdGhvdWdoLiAgVGhlIHRocmVhZCB0aGF0IGluaXRpYXRlZCB0aGUgcmVhZCBtdXN0IHN0YXkgYWxpdmUuICBJZgorICB0aGUgdGhyZWFkIHRoYXQgaW5pdGlhdGVkIHRoZSByZWFkIGV4aXRzLCB0aGVuIHRoZSByZWFkIGNvbXBsZXRlcyBpbiBhbiBlcnJvciBzdGF0ZS4gIFRvIGVuc3VyZQorICB0aGF0IHRoZSBpbml0aWF0aW5nIHRocmVhZCBzdGF5cyBhbGl2ZSwgd2UgY3JlYXRlIGEgc2luZ2xldG9uIHRocmVhZCB3aG9zZSBzb2xlIHJlc3BvbnNpYmlsaXR5IGlzCisgIHRvIG1hbmFnZSB0aGlzIG92ZXJsYXBwZWQgSS9PIHJlcXVlc3RzLiAgVGhpcyBpbnRyb2R1Y2VzIHNvbWUgb3ZlcmhlYWQsIGJ1dCBpdCBpcyBvdmVyaGVhZCB0aGF0CisgIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBiZWhhdmlvci4KKworICBUaGlzIHRocmVhZCBjdXJyZW50bHkgc3VwcG9ydHMgY29ubmVjdCwgcmVhZCwgYW5kIGNhbmNlbCBpby4gIFNvIGZhciwgSSBoYXZlbid0IG5lZWRlZCB0byBwdXQgYW55CisgIHdyaXRlcyBvbiB0aGlzIHRocmVhZCwgYnV0IGlmIG5lZWRlZCwgaXQgY291bGQgYmUgZG9uZS4gIFRoZSBjbGllbnQgd3JpdGUgYnVmZmVyIHdvdWxkIG5lZWQgdG8gYmUKKyAgY29waWVkIHRvIGVuc3VyZSB0aGF0IGl0IGRvZXNuJ3QgZ2V0IGludmFsaWRhdGVkLgorCisgICoqKiBIb3cgZG9lcyBvbmUgdXNlIHRoaXMgY2xhc3M/CisgIENyZWF0ZSBhIFRPdmVybGFwcGVkV29ya0l0ZW0sIGFuZCBmaWxsIGluIHRoZSBhY3Rpb24gYW5kICJoIiwgdGhlbiBjYWxsIHJlc2V0KCkuICBZb3VyIHdvcmsgaXRlbQorICBpcyBub3cgcmVhZHkgdG8gYmUgc3VibWl0dGVkIHRvIHRoZSBvdmVybGFwcGVkIHN1Ym1pc3Npb24gdGhyZWFkLiAgQ3JlYXRlIGEgVEF1dG9PdmVybGFwVGhyZWFkLAorICBhbmQgY2FsbCB0aHJlYWQtPmFkZFdvcmtJdGVtIHdpdGggeW91ciB3b3JrIGl0ZW0uICBBZnRlciBhZGRXb3JrSXRlbSBjb21wbGV0ZXMsIHlvdSBtYXkgaW5zcGVjdAorICBsYXN0X2Vycm9yIGFuZCBzdWNjZXNzLiAgQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCBjYWxsIHdvcmtJdGVtLm92ZXJsYXBwZWRSZXN1bHRzIHRvIHdhaXQKKyAgdW50aWwgdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgorKi8KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitzdHJ1Y3QgREVDTFNQRUNfQUxJR04oTUVNT1JZX0FMTE9DQVRJT05fQUxJR05NRU5UKSBUT3ZlcmxhcHBlZFdvcmtJdGVtIDogcHVibGljIFNMSVNUX0VOVFJZIHsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSgpOworCisgIGVudW0gYWN0aW9uX3QgeworICAgIFVOS05PV04gPSAzMDAwLAorICAgIENPTk5FQ1QsCisgICAgUkVBRCwKKyAgICBDQU5DRUxJTywKKyAgICBTVE9QLAorICB9OworCisgIFRBdXRvUmVzZXRFdmVudCBkb25lU3VibWl0dGluZ0V2ZW50OworICBhY3Rpb25fdCBhY3Rpb247CisgIEhBTkRMRSBoOworICB1aW50OF90KiBidWZmZXI7CisgIHVpbnQzMl90IGJ1ZmZlcl9sZW47CisgIE9WRVJMQVBQRUQgb3ZlcmxhcDsKKworICBEV09SRCBsYXN0X2Vycm9yOworICBCT09MIHN1Y2Nlc3M7CisKKyAgdm9pZCByZXNldCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbiwgSEFORExFIGV2ZW50KTsKKyAgdWludDMyX3Qgb3ZlcmxhcHBlZFJlc3VsdHMoYm9vbCBzaWduYWxfZmFpbHVyZSA9IHRydWUpOworICBib29sIHByb2Nlc3MoKTsKK307CisKK2NsYXNzIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIHZvaWQgYWRkV29ya0l0ZW0oVE92ZXJsYXBwZWRXb3JrSXRlbSogaXRlbSk7CisKKyAgLy8gc2luZ2xldG9uIHN0dWZmCitwdWJsaWM6CisgIHN0YXRpYyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIGFjcXVpcmVfaW5zdGFuY2UoKTsKKyAgc3RhdGljIHZvaWQgcmVsZWFzZV9pbnN0YW5jZSgpOworCitwcml2YXRlOgorICBzdGF0aWMgVENyaXRpY2FsU2VjdGlvbiBpbnN0YW5jZUd1YXJkXzsKKyAgc3RhdGljIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCogaW5zdGFuY2VfOworICBzdGF0aWMgdWludDMyX3QgaW5zdGFuY2VSZWZDb3VudF87CisKKyAgLy8gdGhyZWFkIGRldGFpbHMKK3ByaXZhdGU6CisgIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCgpOworICB+VE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKCk7CisgIHZvaWQgcnVuKCk7CisgIHN0YXRpYyB1bnNpZ25lZCBfX3N0ZGNhbGwgdGhyZWFkX3Byb2Modm9pZCogYWRkcik7CisKK3ByaXZhdGU6CisgIERFQ0xTUEVDX0FMSUdOKE1FTU9SWV9BTExPQ0FUSU9OX0FMSUdOTUVOVCkgU0xJU1RfSEVBREVSIHdvcmtMaXN0XzsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSBzdG9wSXRlbV87CisgIFRBdXRvUmVzZXRFdmVudCB3b3JrQXZhaWxhYmxlRXZlbnRfOworICBIQU5ETEUgdGhyZWFkXzsKK307CisKK2NsYXNzIFRBdXRvT3ZlcmxhcFRocmVhZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Citwcml2YXRlOgorICBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIHA7CisKK3B1YmxpYzoKKyAgVEF1dG9PdmVybGFwVGhyZWFkKCkgOiBwKFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6YWNxdWlyZV9pbnN0YW5jZSgpKSB7fQorICB+VEF1dG9PdmVybGFwVGhyZWFkKCkgeyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OnJlbGVhc2VfaW5zdGFuY2UoKTsgfQorICBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBwOyB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjI4ODMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAKQEAgLTAsMCArMSwxMDAgQEAKKy8qIHNvY2tldHBhaXIuYworICogQ29weXJpZ2h0IDIwMDcgYnkgTmF0aGFuIEMuIE15ZXJzIDxuY21AY2FudHJpcC5vcmc+OyBzb21lIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgY29kZSBpcyBGcmVlIFNvZnR3YXJlLiAgSXQgbWF5IGJlIGNvcGllZCBmcmVlbHksIGluIG9yaWdpbmFsIG9yCisgKiBtb2RpZmllZCBmb3JtLCBzdWJqZWN0IG9ubHkgdG8gdGhlIHJlc3RyaWN0aW9ucyB0aGF0ICgxKSB0aGUgYXV0aG9yIGlzCisgKiByZWxpZXZlZCBmcm9tIGFsbCByZXNwb25zaWJpbGl0aWVzIGZvciBhbnkgdXNlIGZvciBhbnkgcHVycG9zZSwgYW5kICgyKQorICogdGhpcyBjb3B5cmlnaHQgbm90aWNlIG11c3QgYmUgcmV0YWluZWQsIHVuY2hhbmdlZCwgaW4gaXRzIGVudGlyZXR5LiAgSWYKKyAqIGZvciBhbnkgcmVhc29uIHRoZSBhdXRob3IgbWlnaHQgYmUgaGVsZCByZXNwb25zaWJsZSBmb3IgYW55IGNvbnNlcXVlbmNlcworICogb2YgY29weWluZyBvciB1c2UsIGxpY2Vuc2UgaXMgd2l0aGhlbGQuCisgKi8KKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oPgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKworLy8gc3RsCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIFdpbjMyCisjaW5jbHVkZSA8V1MydGNwaXAuaD4KKworaW50IHRocmlmdF9zb2NrZXRwYWlyKGludCBkLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBUSFJJRlRfU09DS0VUIHN2WzJdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHR5cGUpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGQpOworCisgIHVuaW9uIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaW5hZGRyOworICAgIHN0cnVjdCBzb2NrYWRkciBhZGRyOworICB9IGE7CisgIFRIUklGVF9TT0NLRVQgbGlzdGVuZXI7CisgIGludCBlOworICBzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihhLmluYWRkcik7CisgIERXT1JEIGZsYWdzID0gMDsKKyAgaW50IHJldXNlID0gMTsKKworICBpZiAoc3YgPT0gMCkgeworICAgIFdTQVNldExhc3RFcnJvcihXU0FFSU5WQUwpOworICAgIHJldHVybiBTT0NLRVRfRVJST1I7CisgIH0KKworICBsaXN0ZW5lciA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworICBpZiAobGlzdGVuZXIgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKKworICBtZW1zZXQoJmEsIDAsIHNpemVvZihhKSk7CisgIGEuaW5hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBhLmluYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworICBhLmluYWRkci5zaW5fcG9ydCA9IDA7CisKKyAgc3ZbMF0gPSBzdlsxXSA9IElOVkFMSURfU09DS0VUOworICBkbyB7CisgICAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdC4gIFRoaXMgaXMgYmVjYXVzZQorICAgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgICAgLy8gd2FudCB0byBmb3JjZSBzb2NrZXQgcGFpcnMgdG8gYmUgYW4gYWRtaW4uCisgICAgc2V0c29ja29wdChsaXN0ZW5lciwgU09MX1NPQ0tFVCwgU09fRVhDTFVTSVZFQUREUlVTRSwgKGNoYXIqKSZyZXVzZSwgKHNvY2tsZW5fdClzaXplb2YocmV1c2UpKTsKKyAgICBpZiAoYmluZChsaXN0ZW5lciwgJmEuYWRkciwgc2l6ZW9mKGEuaW5hZGRyKSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgaWYgKGdldHNvY2tuYW1lKGxpc3RlbmVyLCAmYS5hZGRyLCAmYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgaWYgKGxpc3RlbihsaXN0ZW5lciwgMSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgc3ZbMF0gPSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIE5VTEwsIDAsIGZsYWdzKTsKKyAgICBpZiAoc3ZbMF0gPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgICBicmVhazsKKyAgICBpZiAoY29ubmVjdChzdlswXSwgJmEuYWRkciwgc2l6ZW9mKGEuaW5hZGRyKSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgc3ZbMV0gPSBhY2NlcHQobGlzdGVuZXIsIE5VTEwsIE5VTEwpOworICAgIGlmIChzdlsxXSA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgIGJyZWFrOworCisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIHJldHVybiAwOworCisgIH0gd2hpbGUgKDApOworCisgIGUgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICBjbG9zZXNvY2tldChzdlswXSk7CisgIGNsb3Nlc29ja2V0KHN2WzFdKTsKKyAgV1NBU2V0TGFzdEVycm9yKGUpOworICByZXR1cm4gU09DS0VUX0VSUk9SOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmY0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19TT0NLRVRQQUlSX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19TT0NLRVRQQUlSX0hfIDEKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yIFRoaXMgaXMgYSBNU1ZDIGhlYWRlciBvbmx5LgorI2VuZGlmCisKKy8vIFdpbjMyCisjaW5jbHVkZSA8V2luc29jazIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCitpbnQgdGhyaWZ0X3NvY2tldHBhaXIoaW50IGQsIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIFRIUklGVF9TT0NLRVQgc3ZbMl0pOworCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX1NPQ0tFVFBBSVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1N5bmMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1N5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDMyMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU3luYy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX1N5bmNfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX1N5bmNfSF8gMQorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yICJ3aW5kb3dzL1N5bmMuaCBpcyBvbmx5IHVzYWJsZSBvbiBXaW5kb3dzIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2luY2x1ZGUgPFdpbmRvd3MuaD4KKworLyoKKyAgTGlnaHR3ZWlnaHQgc3luY2hyb25pemF0aW9uIG9iamVjdHMgdGhhdCBvbmx5IG1ha2Ugc2Vuc2Ugb24gV2luZG93cy4gIEZvciBjcm9zcy1wbGF0Zm9ybQorICBjb2RlLCB1c2UgdGhlIGNsYXNzZXMgZm91bmQgaW4gdGhlIGNvbmN1cnJlbmN5IG5hbWVzcGFjZQorKi8KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworc3RydWN0IFRDcml0aWNhbFNlY3Rpb24gOiBib29zdDo6bm9uY29weWFibGUgeworICBDUklUSUNBTF9TRUNUSU9OIGNzOworICBUQ3JpdGljYWxTZWN0aW9uKCkgeyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZjcyk7IH0KKyAgflRDcml0aWNhbFNlY3Rpb24oKSB7IERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmY3MpOyB9Cit9OworCitjbGFzcyBUQXV0b0NyaXQgOiBib29zdDo6bm9uY29weWFibGUgeworcHJpdmF0ZToKKyAgQ1JJVElDQUxfU0VDVElPTiogY3NfOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFRBdXRvQ3JpdChUQ3JpdGljYWxTZWN0aW9uJiBjcykgOiBjc18oJmNzLmNzKSB7IEVudGVyQ3JpdGljYWxTZWN0aW9uKGNzXyk7IH0KKyAgflRBdXRvQ3JpdCgpIHsgTGVhdmVDcml0aWNhbFNlY3Rpb24oY3NfKTsgfQorfTsKKworc3RydWN0IFRBdXRvUmVzZXRFdmVudCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIEhBTkRMRSBoOworCisgIFRBdXRvUmVzZXRFdmVudCgpIHsKKyAgICBoID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQXV0b1Jlc2V0RXZlbnQgdW5hYmxlIHRvIGNyZWF0ZSBldmVudCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oIkNyZWF0ZUV2ZW50IGZhaWxlZCIpOworICAgIH0KKyAgfQorICB+VEF1dG9SZXNldEV2ZW50KCkgeyBDbG9zZUhhbmRsZShoKTsgfQorfTsKKworc3RydWN0IFRNYW51YWxSZXNldEV2ZW50IDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKyAgSEFORExFIGg7CisKKyAgVE1hbnVhbFJlc2V0RXZlbnQoKSB7CisgICAgaCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTWFudWFsUmVzZXRFdmVudCB1bmFibGUgdG8gY3JlYXRlIGV2ZW50LCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigiQ3JlYXRlRXZlbnQgZmFpbGVkIik7CisgICAgfQorICB9CisgIH5UTWFudWFsUmVzZXRFdmVudCgpIHsgQ2xvc2VIYW5kbGUoaCk7IH0KK307CisKK3N0cnVjdCBUQXV0b0hhbmRsZSA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIEhBTkRMRSBoOworICBleHBsaWNpdCBUQXV0b0hhbmRsZShIQU5ETEUgaF8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgOiBoKGhfKSB7fQorICB+VEF1dG9IYW5kbGUoKSB7CisgICAgaWYgKGggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICBDbG9zZUhhbmRsZShoKTsKKyAgfQorCisgIEhBTkRMRSByZWxlYXNlKCkgeworICAgIEhBTkRMRSByZXR2YWwgPSBoOworICAgIGggPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICByZXR1cm4gcmV0dmFsOworICB9CisgIHZvaWQgcmVzZXQoSEFORExFIGhfID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBpZiAoaF8gPT0gaCkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgIENsb3NlSGFuZGxlKGgpOworICAgIGggPSBoXzsKKyAgfQorfTsKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2ODNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcApAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorCisvLyBib29zdAorI2luY2x1ZGUgPGJvb3N0L2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK1RXaW5zb2NrU2luZ2xldG9uOjppbnN0YW5jZV9wdHIgVFdpbnNvY2tTaW5nbGV0b246Omluc3RhbmNlX3B0cl8oTlVMTCk7CitzdGQ6Om9uY2VfZmxhZyBUV2luc29ja1NpbmdsZXRvbjo6ZmxhZ3NfOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVFdpbnNvY2tTaW5nbGV0b246OlRXaW5zb2NrU2luZ2xldG9uKHZvaWQpIHsKKyAgV09SRCB2ZXJzaW9uKE1BS0VXT1JEKDIsIDIpKTsKKyAgV1NBRGF0YSBkYXRhID0gezB9OworCisgIGludCBlcnJvcihXU0FTdGFydHVwKHZlcnNpb24sICZkYXRhKSk7CisgIGlmIChlcnJvciAhPSAwKSB7CisgICAgQk9PU1RfQVNTRVJUKGZhbHNlKTsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXNlIFdpbnNvY2suIik7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RXaW5zb2NrU2luZ2xldG9uOjp+VFdpbnNvY2tTaW5nbGV0b24odm9pZCkgeworICBXU0FDbGVhbnVwKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUodm9pZCkgeworICBzdGQ6OmNhbGxfb25jZShmbGFnc18sIGluaXQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBUV2luc29ja1NpbmdsZXRvbjo6aW5pdCh2b2lkKSB7CisgIGluc3RhbmNlX3B0cl8ucmVzZXQobmV3IFRXaW5zb2NrU2luZ2xldG9uKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwODA2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1dJTkRPV1NfVFdJTlNPQ0tTSU5HTEVUT05fSF8KKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfV0lORE9XU19UV0lOU09DS1NJTkdMRVRPTl9IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciBUaGlzIGlzIGEgTVNWQyBoZWFkZXIgb25seS4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworLy8gYm9vc3QKKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFdpbnNvY2syIG11c3QgYmUgaW50aWFsaXNlZCBvbmNlIG9ubHkgaW4gb3JkZXIgdG8gY3JlYXRlIHNvY2tldHMuIFRoaXMgY2xhc3MKKyAqIHBlcmZvcm1zIGEgb25lIHRpbWUgaW5pdGlhbGlzYXRpb24gd2hlbiBjcmVhdGUgaXMgY2FsbGVkLgorICovCitjbGFzcyBUV2luc29ja1NpbmdsZXRvbiA6IHByaXZhdGUgYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxUV2luc29ja1NpbmdsZXRvbj4gaW5zdGFuY2VfcHRyOworCitwcml2YXRlOgorICBUV2luc29ja1NpbmdsZXRvbih2b2lkKTsKKworcHVibGljOgorICB+VFdpbnNvY2tTaW5nbGV0b24odm9pZCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIHZvaWQgY3JlYXRlKHZvaWQpOworCitwcml2YXRlOgorICBzdGF0aWMgdm9pZCBpbml0KHZvaWQpOworCitwcml2YXRlOgorICBzdGF0aWMgaW5zdGFuY2VfcHRyIGluc3RhbmNlX3B0cl87CisgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBmbGFnc187Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisKKyNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9XSU5ET1dTX1RXSU5TT0NLU0lOR0xFVE9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwN2U5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaD4KKworaW50IHRocmlmdF9mY250bChUSFJJRlRfU09DS0VUIGZkLCBpbnQgY21kLCBpbnQgZmxhZ3MpIHsKKyAgaWYgKGNtZCAhPSBUSFJJRlRfRl9HRVRGTCAmJiBjbWQgIT0gVEhSSUZUX0ZfU0VURkwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoZmxhZ3MgIT0gVEhSSUZUX09fTk9OQkxPQ0sgJiYgZmxhZ3MgIT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChjbWQgPT0gVEhSSUZUX0ZfR0VURkwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGludCByZXM7CisgIGlmIChmbGFncykgeworICAgIHJlcyA9IGlvY3Rsc29ja2V0KGZkLCBGSU9OQklPLCByZWludGVycHJldF9jYXN0PHVfbG9uZyo+KCYoZmxhZ3MgPSAxKSkpOworICB9IGVsc2UgeworICAgIHJlcyA9IGlvY3Rsc29ja2V0KGZkLCBGSU9OQklPLCByZWludGVycHJldF9jYXN0PHVfbG9uZyo+KCYoZmxhZ3MgPSAwKSkpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworI2lmIFdJTlZFUiA8PSAweDA1MDIgLy8gWFAsIFNlcnZlcjIwMDMKK2ludCB0aHJpZnRfcG9sbChUSFJJRlRfUE9MTEZEKiBmZEFycmF5LCBVTE9ORyBuZmRzLCBJTlQgdGltZW91dCkgeworICBmZF9zZXQgcmVhZF9mZHMsIHdyaXRlX2ZkczsKKyAgZmRfc2V0KiByZWFkX2Zkc19wdHIgPSBOVUxMOworICBmZF9zZXQqIHdyaXRlX2Zkc19wdHIgPSBOVUxMOworCisgIEZEX1pFUk8oJnJlYWRfZmRzKTsKKyAgRkRfWkVSTygmd3JpdGVfZmRzKTsKKworICBmb3IgKFVMT05HIGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7CisgICAgLy8gUmVhZCAoaW4pIHNvY2tldAorICAgIGlmICgoZmRBcnJheVtpXS5ldmVudHMgJiBUSFJJRlRfUE9MTElOKSA9PSBUSFJJRlRfUE9MTElOKSB7CisgICAgICByZWFkX2Zkc19wdHIgPSAmcmVhZF9mZHM7CisgICAgICBGRF9TRVQoZmRBcnJheVtpXS5mZCwgJnJlYWRfZmRzKTsKKyAgICB9CisgICAgLy8gV3JpdGUgKG91dCkgc29ja2V0CisgICAgZWxzZSBpZiAoKGZkQXJyYXlbaV0uZXZlbnRzICYgVEhSSUZUX1BPTExPVVQpID09IFRIUklGVF9QT0xMT1VUKSB7CisgICAgICB3cml0ZV9mZHNfcHRyID0gJndyaXRlX2ZkczsKKyAgICAgIEZEX1NFVChmZEFycmF5W2ldLmZkLCAmd3JpdGVfZmRzKTsKKyAgICB9CisgIH0KKworICB0aW1ldmFsIHRpbWVfb3V0OworICB0aW1ldmFsKiB0aW1lX291dF9wdHIgPSBOVUxMOworICBpZiAodGltZW91dCA+PSAwKSB7CisgICAgdGltZV9vdXQudHZfc2VjID0gdGltZW91dCAvIDEwMDA7CisgICAgdGltZV9vdXQudHZfdXNlYyA9ICh0aW1lb3V0ICUgMTAwMCkgKiAxMDAwOworICAgIHRpbWVfb3V0X3B0ciA9ICZ0aW1lX291dDsKKyAgfSBlbHNlIHsgLy8gdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKKyAgICAodm9pZCl0aW1lX291dDsKKyAgICAodm9pZCl0aW1lb3V0OworICB9CisKKyAgaW50IHNrdHJlYWR5ID0gc2VsZWN0KDEsIHJlYWRfZmRzX3B0ciwgd3JpdGVfZmRzX3B0ciwgTlVMTCwgdGltZV9vdXRfcHRyKTsKKyAgaWYgKHNrdHJlYWR5ID4gMCkgeworICAgIGZvciAoVUxPTkcgaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKKyAgICAgIGZkQXJyYXlbaV0ucmV2ZW50cyA9IDA7CisgICAgICBpZiAoRkRfSVNTRVQoZmRBcnJheVtpXS5mZCwgJnJlYWRfZmRzKSkKKyAgICAgICAgZmRBcnJheVtpXS5yZXZlbnRzIHw9IFRIUklGVF9QT0xMSU47CisgICAgICBpZiAoRkRfSVNTRVQoZmRBcnJheVtpXS5mZCwgJndyaXRlX2ZkcykpCisgICAgICAgIGZkQXJyYXlbaV0ucmV2ZW50cyB8PSBUSFJJRlRfUE9MTE9VVDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNrdHJlYWR5OworfQorI2Vsc2UgIC8vIFZpc3RhLCBXaW43Li4uCitpbnQgdGhyaWZ0X3BvbGwoVEhSSUZUX1BPTExGRCogZmRBcnJheSwgVUxPTkcgbmZkcywgSU5UIHRpbWVvdXQpIHsKKyAgcmV0dXJuIFdTQVBvbGwoZmRBcnJheSwgbmZkcywgdGltZW91dCk7Cit9CisjZW5kaWYgLy8gV0lOVkVSCisKKyNpZmRlZiBfV0lOMzJfV0NFCitzdGQ6OnN0cmluZyB0aHJpZnRfd3N0cjJzdHIoc3RkOjp3c3RyaW5nIHdzKSB7CisgIHN0ZDo6c3RyaW5nIHMod3MuYmVnaW4oKSwgd3MuZW5kKCkpOworICByZXR1cm4gczsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2YmU5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19GQ05UTF9IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfRkNOVExfSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgVGhpcyBpcyBhIE1TVkMgaGVhZGVyIG9ubHkuCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMl9XQ0UKKyNpbmNsdWRlIDxzdHJpbmc+CisjZW5kaWYKKworLy8gV2luMzIKKyNpbmNsdWRlIDxXaW5zb2NrMi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmIFdJTlZFUiA8PSAweDA1MDIgLy8gWFAsIFNlcnZlcjIwMDMKK3N0cnVjdCB0aHJpZnRfcG9sbGZkIHsKKyAgVEhSSUZUX1NPQ0tFVCBmZDsKKyAgU0hPUlQgZXZlbnRzOworICBTSE9SVCByZXZlbnRzOworfTsKKyNlbmRpZgorCitleHRlcm4gIkMiIHsKK2ludCB0aHJpZnRfZmNudGwoVEhSSUZUX1NPQ0tFVCBmZCwgaW50IGNtZCwgaW50IGZsYWdzKTsKK2ludCB0aHJpZnRfcG9sbChUSFJJRlRfUE9MTEZEKiBmZEFycmF5LCBVTE9ORyBuZmRzLCBJTlQgdGltZW91dCk7Cit9CisKKyNpZmRlZiBfV0lOMzJfV0NFCitzdGQ6OnN0cmluZyB0aHJpZnRfd3N0cjJzdHIoc3RkOjp3c3RyaW5nIHdzKTsKKyNlbmRpZgorCisjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0ZDTlRMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjQ0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KKyNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciAiVGhpcyBpcyBhIFdpbmRvd3MgaGVhZGVyIG9ubHkiCisjZW5kaWYKKworLy8gdXNlIHN0ZDo6dGhyZWFkIGluIE1TVkMxMSAoMjAxMikgb3IgbmV3ZXIgYW5kIGluIE1pbkdXCisjaWYgKF9NU0NfVkVSID49IDE3MDApIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjZGVmaW5lIFVTRV9TVERfVEhSRUFEIDEKKyNlbmRpZgorCisvLyBTb21ldGhpbmcgdGhhdCBkZWZpbmVzIFBSSWQ2NCBpcyByZXF1aXJlZCB0byBidWlsZAorI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvLyBWUzIwMTAgb3IgbGF0ZXIgaGFzIHN0ZGludC5oIGFzIGRvZXMgTWluR1cKKyNpZiAoX01TQ19WRVIgPj0gMTYwMCkgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZW5kaWYKKworI2lmbmRlZiBUQVJHRVRfV0lOX1hQCisjZGVmaW5lIFRBUkdFVF9XSU5fWFAgMQorI2VuZGlmCisKKyNpZiBUQVJHRVRfV0lOX1hQCisjaWZuZGVmIFdJTlZFUgorI2RlZmluZSBXSU5WRVIgMHgwNTAxCisjZW5kaWYKKyNpZm5kZWYgX1dJTjMyX1dJTk5UCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDEKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX1dJTjMyX1dJTk5UCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9NX1g2NCkKKyNkZWZpbmUgQVJJVEhNRVRJQ19SSUdIVF9TSElGVCAxCisjZGVmaW5lIFNJR05FRF9SSUdIVF9TSElGVF9JUyAxCisjZW5kaWYKKworI2lmbmRlZiBfX01JTkdXMzJfXworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KSAvLyBEZXByZWNhdGVkIHBvc2l4IG5hbWUuCisjZW5kaWYKKworI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8vIE11c3QgYmUgdXNpbmcgVlMyMDEwIG9yIGxhdGVyLCBvciBib29zdCwgc28gdGhhdCBDOTkgdHlwZXMgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQorI2luY2x1ZGUgPGJvb3N0L2NzdGRpbnQuaHBwPgorCit0eXBlZGVmIGJvb3N0OjppbnQ2NF90IGludDY0X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50NjRfdCB1aW50NjRfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDMyX3QgaW50MzJfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQzMl90IHVpbnQzMl90OwordHlwZWRlZiBib29zdDo6aW50MTZfdCBpbnQxNl90OwordHlwZWRlZiBib29zdDo6dWludDE2X3QgdWludDE2X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQ4X3QgaW50OF90OwordHlwZWRlZiBib29zdDo6dWludDhfdCB1aW50OF90OworI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvT3BlcmF0b3JzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9XaW5GY250bC5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuaD4KKworLy8gd2luZG93cworI2luY2x1ZGUgPFdpbnNvY2syLmg+CisjaW5jbHVkZSA8d3MydGNwaXAuaD4KKyNpZm5kZWYgX19NSU5HVzMyX18KKyAgI2lmZGVmIF9XSU4zMl9XQ0UKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMi5saWIiKQorICAjZWxzZQorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyXzMyLmxpYiIpCisgICNwcmFnbWEgY29tbWVudChsaWIsICJhZHZhcGkzMi5saWIiKSAvLyBGb3Igc2VjdXJpdHkgQVBJcyBpbiBUUGlwZVNlcnZlcgorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiU2hsd2FwaS5saWIiKSAgLy8gRm9yIFN0clN0cklBIGluIFRQaXBlU2VydmVyCisgICNlbmRpZgorI2VuZGlmIC8vIF9fTUlOR1czMl9fCisKKyNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5NzEzMC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0KLXVpbnQzMl90IFRCdWZmZXJlZFRyYW5zcG9ydDo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3Qgd2FudCA9IGxlbjsKLSAgdWludDMyX3QgaGF2ZSA9IHJCb3VuZF8gLSByQmFzZV87Ci0KLSAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IHNhdGlzZnkgdGhlIHJlYWQKLSAgLy8gd2l0aCB0aGUgZGF0YSBhbHJlYWR5IGluIHRoZSBidWZmZXIuCi0gIGFzc2VydChoYXZlIDwgd2FudCk7Ci0KLSAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZS4KLSAgaWYgKGhhdmUgPiAwKSB7Ci0gICAgbWVtY3B5KGJ1ZiwgckJhc2VfLCBoYXZlKTsKLSAgICB3YW50IC09IGhhdmU7Ci0gICAgYnVmICs9IGhhdmU7Ci0gIH0KLSAgLy8gR2V0IG1vcmUgZnJvbSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1cCB0byBidWZmZXIgc2l6ZS4KLSAgLy8gTm90ZSB0aGF0IHRoaXMgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2UgaWYgbGVuIDwgckJ1ZlNpemVfCi0gIC8vIGFuZCBhbG1vc3Qgbm8gc2Vuc2Ugb3RoZXJ3aXNlLiAgVE9ETyhkcmVpc3MpOiBGaXggdGhhdAotICAvLyBjYXNlIChwb3NzaWJseSBpbmNsdWRpbmcgc29tZSByZWFkdiBob3RuZXNzKS4KLSAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgdHJhbnNwb3J0Xy0+cmVhZChyQnVmXy5nZXQoKSwgckJ1ZlNpemVfKSk7Ci0KLSAgLy8gSGFuZCBvdmVyIHdoYXRldmVyIHdlIGhhdmUuCi0gIHVpbnQzMl90IGdpdmUgPSBzdGQ6Om1pbih3YW50LCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXykpOwotICBtZW1jcHkoYnVmLCByQmFzZV8sIGdpdmUpOwotICByQmFzZV8gKz0gZ2l2ZTsKLSAgd2FudCAtPSBnaXZlOwotCi0gIHJldHVybiAobGVuIC0gd2FudCk7Ci19Ci0KLXZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0Ojp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgaGF2ZV9ieXRlcyA9IHdCYXNlXyAtIHdCdWZfLmdldCgpOwotICB1aW50MzJfdCBzcGFjZSA9IHdCb3VuZF8gLSB3QmFzZV87Ci0gIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBhY2NvbW9kYXRlIHRoZSB3cml0ZQotICAvLyB3aXRoIHRoZSBmcmVlIHNwYWNlIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KLSAgYXNzZXJ0KHdCb3VuZF8gLSB3QmFzZV8gPCBzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KGxlbikpOwotCi0gIC8vIE5vdyBoZXJlJ3MgdGhlIHRyaWNreSBxdWVzdGlvbjogc2hvdWxkIHdlIGNvcHkgZGF0YSBmcm9tIGJ1ZiBpbnRvIG91cgotICAvLyBpbnRlcm5hbCBidWZmZXIgYW5kIHdyaXRlIGl0IGZyb20gdGhlcmUsIG9yIHNob3VsZCB3ZSBqdXN0IHdyaXRlIG91dAotICAvLyB0aGUgY3VycmVudCBpbnRlcm5hbCBidWZmZXIgaW4gb25lIHN5c2NhbGwgYW5kIHdyaXRlIG91dCBidWYgaW4gYW5vdGhlci4KLSAgLy8gSWYgb3VyIGN1cnJlbnRseSBidWZmZXJlZCBkYXRhIHBsdXMgYnVmIGlzIGF0IGxlYXN0IGRvdWJsZSBvdXIgYnVmZmVyCi0gIC8vIHNpemUsIHdlIHdpbGwgaGF2ZSB0byBkbyB0d28gc3lzY2FsbHMgbm8gbWF0dGVyIHdoYXQgKGV4Y2VwdCBpbiB0aGUKLSAgLy8gZGVnZW5lcmF0ZSBjYXNlIHdoZW4gb3VyIGJ1ZmZlciBpcyBlbXB0eSksIHNvIHRoZXJlIGlzIG5vIHVzZSBjb3B5aW5nLgotICAvLyBPdGhlcndpc2UsIHRoZXJlIGlzIHNvcnQgb2YgYSBzbGlkaW5nIHNjYWxlLiAgSWYgd2UgaGF2ZSBOLTEgYnl0ZXMKLSAgLy8gYnVmZmVyZWQgYW5kIG5lZWQgdG8gd3JpdGUgMiwgaXQgd291bGQgYmUgY3JhenkgdG8gZG8gdHdvIHN5c2NhbGxzLgotICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgaGF2ZSAyIGJ5dGVzIGJ1ZmZlcmVkIGFuZCBhcmUgd3JpdGluZyAyTi0zLAotICAvLyB3ZSBjYW4gc2F2ZSBhIHN5c2NhbGwgaW4gdGhlIHNob3J0IHRlcm0gYnkgbG9hZGluZyB1cCBvdXIgYnVmZmVyLCB3cml0aW5nCi0gIC8vIGl0IG91dCwgYW5kIGNvcHlpbmcgdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIGludG8gb3VyIGJ1ZmZlci4gIE9mIGNvdXJzZSwKLSAgLy8gaWYgd2UgZ2V0IGFub3RoZXIgMi1ieXRlIHdyaXRlLCB3ZSBoYXZlbid0IHNhdmVkIGFueSBzeXNjYWxscyBhdCBhbGwsCi0gIC8vIGFuZCBoYXZlIGp1c3QgY29waWVkIG5lYXJseSAyTiBieXRlcyBmb3Igbm90aGluZy4gIEZpbmRpbmcgYSBwZXJmZWN0Ci0gIC8vIHBvbGljeSB3b3VsZCByZXF1aXJlIHByZWRpY3RpbmcgdGhlIHNpemUgb2YgZnV0dXJlIHdyaXRlcywgc28gd2UncmUganVzdAotICAvLyBnb2luZyB0byBhbHdheXMgZXNjaGV3IHN5c2NhbGxzIGlmIHdlIGhhdmUgbGVzcyB0aGFuIDJOIGJ5dGVzIHRvIHdyaXRlLgotCi0gIC8vIFRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgdG8gZG8gdHdvIHN5c2NhbGxzLgotICAvLyBUaGlzIGNhc2UgYWxzbyBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBpcyBlbXB0eSwKLSAgLy8gYnV0IGl0IGlzIGNsZWFyZXIgKEkgdGhpbmspIHRvIHRoaW5rIG9mIGl0IGFzIHR3byBzZXBhcmF0ZSBjYXNlcy4KLSAgaWYgKChoYXZlX2J5dGVzICsgbGVuID49IDIqd0J1ZlNpemVfKSB8fCAoaGF2ZV9ieXRlcyA9PSAwKSkgewotICAgIC8vIFRPRE8oZHJlaXNzKTogd3JpdGV2Ci0gICAgaWYgKGhhdmVfYnl0ZXMgPiAwKSB7Ci0gICAgICB0cmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZV9ieXRlcyk7Ci0gICAgfQotICAgIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKLSAgICB3QmFzZV8gPSB3QnVmXy5nZXQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBGaWxsIHVwIG91ciBpbnRlcm5hbCBidWZmZXIgZm9yIGEgd3JpdGUuCi0gIG1lbWNweSh3QmFzZV8sIGJ1Ziwgc3BhY2UpOwotICBidWYgKz0gc3BhY2U7Ci0gIGxlbiAtPSBzcGFjZTsKLSAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7Ci0KLSAgLy8gQ29weSB0aGUgcmVzdCBpbnRvIG91ciBidWZmZXIuCi0gIGFzc2VydChsZW4gPCB3QnVmU2l6ZV8pOwotICBtZW1jcHkod0J1Zl8uZ2V0KCksIGJ1ZiwgbGVuKTsKLSAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBsZW47Ci0gIHJldHVybjsKLX0KLQotY29uc3QgdWludDhfdCogVEJ1ZmZlcmVkVHJhbnNwb3J0Ojpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAvLyBJZiB0aGUgcmVxdWVzdCBpcyBiaWdnZXIgdGhhbiBvdXIgYnVmZmVyLCB3ZSBhcmUgaG9zZWQuCi0gIGlmICgqbGVuID4gckJ1ZlNpemVfKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgd2UgaGF2ZSBhbHJlYWR5LgotICB1aW50MzJfdCBoYXZlID0gckJvdW5kXyAtIHJCYXNlXzsKLSAgLy8gVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzIHdlIG5lZWQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gIGludDMyX3QgbmVlZCA9ICpsZW4gLSBoYXZlOwotICAvLyBUaGUgc3BhY2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciB0byB0aGUgZW5kIG9mIG91ciBkYXRhLgotICB1aW50MzJfdCBvZmZzZXQgPSByQm91bmRfIC0gckJ1Zl8uZ2V0KCk7Ci0gIGFzc2VydChuZWVkID4gMCk7Ci0KLSAgLy8gSWYgd2UgaGF2ZSBsZXNzIHRoYW4gaGFsZiBvdXIgYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSwgc2hpZnQgdGhlIGRhdGEKLSAgLy8gd2UgaGF2ZSBkb3duIHRvIHRoZSBzdGFydC4gIElmIHRoZSBib3Jyb3cgaXMgYmlnIGNvbXBhcmVkIHRvIG91ciBidWZmZXIsCi0gIC8vIHRoaXMgY291bGQgYmUga2luZCBvZiBhIHdhc3RlLCBidXQgaWYgdGhlIGJvcnJvdyBpcyBzbWFsbCwgaXQgZnJlZXMgdXAKLSAgLy8gc3BhY2UgYXQgdGhlIGVuZCBvZiBvdXIgYnVmZmVyIHRvIGRvIGEgYmlnZ2VyIHNpbmdsZSByZWFkIGZyb20gdGhlCi0gIC8vIHVuZGVybHlpbmcgdHJhbnNwb3J0LiAgQWxzbywgaWYgb3VyIG5lZWRzIGV4dGVuZCBwYXN0IHRoZSBlbmQgb2YgdGhlCi0gIC8vIGJ1ZmZlciwgd2UgaGF2ZSB0byBkbyBhIGNvcHkgbm8gbWF0dGVyIHdoYXQuCi0gIGlmICgob2Zmc2V0ID4gckJ1ZlNpemVfLzIpIHx8IChvZmZzZXQgKyBuZWVkID4gckJ1ZlNpemVfKSkgewotICAgIG1lbW1vdmUockJ1Zl8uZ2V0KCksIHJCYXNlXywgaGF2ZSk7Ci0gICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgaGF2ZSk7Ci0gICAgb2Zmc2V0ID0gaGF2ZTsKLSAgfQotCi0gIC8vIEZpcnN0IHRyeSB0byBmaWxsIHVwIHRoZSBidWZmZXIuCi0gIHVpbnQzMl90IGdvdCA9IHRyYW5zcG9ydF8tPnJlYWQockJvdW5kXywgckJ1ZlNpemVfIC0gb2Zmc2V0KTsKLSAgckJvdW5kXyArPSBnb3Q7Ci0gIG5lZWQgLT0gZ290OwotCi0gIC8vIElmIHRoYXQgZmFpbHMsIHJlYWRBbGwgdW50aWwgd2UgZ2V0IHdoYXQgd2UgbmVlZC4KLSAgaWYgKG5lZWQgPiAwKSB7Ci0gICAgckJvdW5kXyArPSB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCb3VuZF8sIG5lZWQpOwotICB9Ci0KLSAgKmxlbiA9IHJCb3VuZF8gLSByQmFzZV87Ci0gIHJldHVybiByQmFzZV87Ci19Ci0KLXZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpICB7Ci0gIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIuCi0gIHVpbnQzMl90IGhhdmVfYnl0ZXMgPSB3QmFzZV8gLSB3QnVmXy5nZXQoKTsKLSAgaWYgKGhhdmVfYnl0ZXMgPiAwKSB7Ci0gICAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpOwotICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlX2J5dGVzKTsKLSAgfQotCi0gIC8vIEZsdXNoIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLSAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKLX0KLQotCi11aW50MzJfdCBURnJhbWVkVHJhbnNwb3J0OjpyZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICB1aW50MzJfdCB3YW50ID0gbGVuOwotICB1aW50MzJfdCBoYXZlID0gckJvdW5kXyAtIHJCYXNlXzsKLQotICAvLyBXZSBzaG91bGQgb25seSB0YWtlIHRoZSBzbG93IHBhdGggaWYgd2UgY2FuJ3Qgc2F0aXNmeSB0aGUgcmVhZAotICAvLyB3aXRoIHRoZSBkYXRhIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KLSAgYXNzZXJ0KGhhdmUgPCB3YW50KTsKLQotICAvLyBDb3B5IG91dCB3aGF0ZXZlciB3ZSBoYXZlLgotICBpZiAoaGF2ZSA+IDApIHsKLSAgICBtZW1jcHkoYnVmLCByQmFzZV8sIGhhdmUpOwotICAgIHdhbnQgLT0gaGF2ZTsKLSAgICBidWYgKz0gaGF2ZTsKLSAgfQotCi0gIC8vIFJlYWQgYW5vdGhlciBmcmFtZS4KLSAgcmVhZEZyYW1lKCk7Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBTaG91bGQgd2Ugd2FybiB3aGVuIHJlYWRzIGNyb3NzIGZyYW1lcz8KLQotICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZS4KLSAgdWludDMyX3QgZ2l2ZSA9IHN0ZDo6bWluKHdhbnQsIHN0YXRpY19jYXN0PHVpbnQzMl90PihyQm91bmRfIC0gckJhc2VfKSk7Ci0gIG1lbWNweShidWYsIHJCYXNlXywgZ2l2ZSk7Ci0gIHJCYXNlXyArPSBnaXZlOwotICB3YW50IC09IGdpdmU7Ci0KLSAgcmV0dXJuIChsZW4gLSB3YW50KTsKLX0KLQotdm9pZCBURnJhbWVkVHJhbnNwb3J0OjpyZWFkRnJhbWUoKSB7Ci0gIC8vIFRPRE8oZHJlaXNzKTogVGhpbmsgYWJvdXQgdXNpbmcgcmVhZHYgaGVyZSwgZXZlbiB0aG91Z2ggaXQgd291bGQKLSAgLy8gcmVzdWx0IGluIChnYXNwKSByZWFkLWFoZWFkLgotCi0gIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIG5leHQgZnJhbWUuCi0gIGludDMyX3Qgc3o7Ci0gIHRyYW5zcG9ydF8tPnJlYWRBbGwoKHVpbnQ4X3QqKSZzeiwgc2l6ZW9mKHN6KSk7Ci0gIHN6ID0gbnRvaGwoc3opOwotCi0gIGlmIChzeiA8IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplIGhhcyBuZWdhdGl2ZSB2YWx1ZSIpOwotICB9Ci0KLSAgLy8gUmVhZCB0aGUgZnJhbWUgcGF5bG9hZCwgYW5kIHJlc2V0IG1hcmtlcnMuCi0gIGlmIChzeiA+IHN0YXRpY19jYXN0PGludDMyX3Q+KHJCdWZTaXplXykpIHsKLSAgICByQnVmXy5yZXNldChuZXcgdWludDhfdFtzel0pOwotICAgIHJCdWZTaXplXyA9IHN6OwotICB9Ci0gIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCksIHN6KTsKLSAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOwotfQotCi12b2lkIFRGcmFtZWRUcmFuc3BvcnQ6OndyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAvLyBEb3VibGUgYnVmZmVyIHNpemUgdW50aWwgc3VmZmljaWVudC4KLSAgdWludDMyX3QgaGF2ZSA9IHdCYXNlXyAtIHdCdWZfLmdldCgpOwotICB3aGlsZSAod0J1ZlNpemVfIDwgbGVuICsgaGF2ZSkgewotICAgIHdCdWZTaXplXyAqPSAyOwotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtb2RpZnlpbmcgdGhpcyBjbGFzcyB0byB1c2UgbWFsbG9jL2ZyZWUKLSAgLy8gc28gd2UgY2FuIHVzZSByZWFsbG9jIGhlcmUuCi0KLSAgLy8gQWxsb2NhdGUgbmV3IGJ1ZmZlci4KLSAgdWludDhfdCogbmV3X2J1ZiA9IG5ldyB1aW50OF90W3dCdWZTaXplX107Ci0KLSAgLy8gQ29weSB0aGUgb2xkIGJ1ZmZlciB0byB0aGUgbmV3IG9uZS4KLSAgbWVtY3B5KG5ld19idWYsIHdCdWZfLmdldCgpLCBoYXZlKTsKLQotICAvLyBOb3cgcG9pbnQgYnVmIHRvIHRoZSBuZXcgb25lLgotICB3QnVmXy5yZXNldChuZXdfYnVmKTsKLSAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBoYXZlOwotICB3Qm91bmRfID0gd0J1Zl8uZ2V0KCkgKyB3QnVmU2l6ZV87Ci0KLSAgLy8gQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBuZXcgYnVmZmVyLgotICBtZW1jcHkod0Jhc2VfLCBidWYsIGxlbik7Ci0gIHdCYXNlXyArPSBsZW47Ci19Ci0KLXZvaWQgVEZyYW1lZFRyYW5zcG9ydDo6Zmx1c2goKSAgewotICBpbnQzMl90IHN6X2hibywgc3pfbmJvOwotICBhc3NlcnQod0J1ZlNpemVfID4gc2l6ZW9mKHN6X25ibykpOwotCi0gIC8vIFNsaXAgdGhlIGZyYW1lIHNpemUgaW50byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KLSAgc3pfaGJvID0gd0Jhc2VfIC0gKHdCdWZfLmdldCgpICsgc2l6ZW9mKHN6X25ibykpOwotICBzel9uYm8gPSAoaW50MzJfdClodG9ubCgodWludDMyX3QpKHN6X2hibykpOwotICBtZW1jcHkod0J1Zl8uZ2V0KCksICh1aW50OF90Kikmc3pfbmJvLCBzaXplb2Yoc3pfbmJvKSk7Ci0KLSAgaWYgKHN6X2hibyA+IDApIHsKLSAgICAvLyBOb3RlIHRoYXQgd2UgcmVzZXQgd0Jhc2VfICh3aXRoIGEgcGFkIGZvciB0aGUgZnJhbWUgc2l6ZSkKLSAgICAvLyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZSB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlCi0gICAgLy8gKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cwotICAgIC8vIHVwIGFuIGV4Y2VwdGlvbgotICAgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgc2l6ZW9mKHN6X25ibyk7Ci0KLSAgICAvLyBXcml0ZSBzaXplIGFuZCBmcmFtZSBib2R5LgotICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBzaXplb2Yoc3pfbmJvKStzel9oYm8pOwotICB9Ci0KLSAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICB0cmFuc3BvcnRfLT5mbHVzaCgpOwotfQotCi1jb25zdCB1aW50OF90KiBURnJhbWVkVHJhbnNwb3J0Ojpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAvLyBEb24ndCB0cnkgdG8gYmUgY2xldmVyIHdpdGggc2hpZnRpbmcgYnVmZmVycy4KLSAgLy8gSWYgdGhlIGZhc3QgcGF0aCBmYWlsZWQgbGV0IHRoZSBwcm90b2NvbCB1c2UgaXRzIHNsb3cgcGF0aC4KLSAgLy8gQmVzaWRlcywgd2hvIGlzIGdvaW5nIHRvIHRyeSB0byBib3Jyb3cgYWNyb3NzIG1lc3NhZ2VzPwotICByZXR1cm4gTlVMTDsKLX0KLQotCi12b2lkIFRNZW1vcnlCdWZmZXI6OmNvbXB1dGVSZWFkKHVpbnQzMl90IGxlbiwgdWludDhfdCoqIG91dF9zdGFydCwgdWludDMyX3QqIG91dF9naXZlKSB7Ci0gIC8vIENvcnJlY3QgckJvdW5kXyBzbyB3ZSBjYW4gdXNlIHRoZSBmYXN0IHBhdGggaW4gdGhlIGZ1dHVyZS4KLSAgckJvdW5kXyA9IHdCYXNlXzsKLQotICAvLyBEZWNpZGUgaG93IG11Y2ggdG8gZ2l2ZS4KLSAgdWludDMyX3QgZ2l2ZSA9IHN0ZDo6bWluKGxlbiwgYXZhaWxhYmxlX3JlYWQoKSk7Ci0KLSAgKm91dF9zdGFydCA9IHJCYXNlXzsKLSAgKm91dF9naXZlID0gZ2l2ZTsKLQotICAvLyBQcmVpbmNyZW1lbnQgckJhc2VfIHNvIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIHRvLgotICByQmFzZV8gKz0gZ2l2ZTsKLX0KLQotdWludDMyX3QgVE1lbW9yeUJ1ZmZlcjo6cmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDhfdCogc3RhcnQ7Ci0gIHVpbnQzMl90IGdpdmU7Ci0gIGNvbXB1dGVSZWFkKGxlbiwgJnN0YXJ0LCAmZ2l2ZSk7Ci0KLSAgLy8gQ29weSBpbnRvIHRoZSBwcm92aWRlZCBidWZmZXIuCi0gIG1lbWNweShidWYsIHN0YXJ0LCBnaXZlKTsKLQotICByZXR1cm4gZ2l2ZTsKLX0KLQotdWludDMyX3QgVE1lbW9yeUJ1ZmZlcjo6cmVhZEFwcGVuZFRvU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQzMl90IGxlbikgewotICAvLyBEb24ndCBnZXQgc29tZSBzdHVwaWQgYXNzZXJ0aW9uIGZhaWx1cmUuCi0gIGlmIChidWZmZXJfID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHVpbnQ4X3QqIHN0YXJ0OwotICB1aW50MzJfdCBnaXZlOwotICBjb21wdXRlUmVhZChsZW4sICZzdGFydCwgJmdpdmUpOwotCi0gIC8vIEFwcGVuZCB0byB0aGUgcHJvdmlkZWQgc3RyaW5nLgotICBzdHIuYXBwZW5kKChjaGFyKilzdGFydCwgZ2l2ZSk7Ci0KLSAgcmV0dXJuIGdpdmU7Ci19Ci0KLXZvaWQgVE1lbW9yeUJ1ZmZlcjo6ZW5zdXJlQ2FuV3JpdGUodWludDMyX3QgbGVuKSB7Ci0gIC8vIENoZWNrIGF2YWlsYWJsZSBzcGFjZQotICB1aW50MzJfdCBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpOwotICBpZiAobGVuIDw9IGF2YWlsKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFvd25lcl8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJJbnN1ZmZpY2llbnQgc3BhY2UgaW4gZXh0ZXJuYWwgTWVtb3J5QnVmZmVyIik7Ci0gIH0KLQotICAvLyBHcm93IHRoZSBidWZmZXIgYXMgbmVjZXNzYXJ5LgotICB3aGlsZSAobGVuID4gYXZhaWwpIHsKLSAgICBidWZmZXJTaXplXyAqPSAyOwotICAgIHdCb3VuZF8gPSBidWZmZXJfICsgYnVmZmVyU2l6ZV87Ci0gICAgYXZhaWwgPSBhdmFpbGFibGVfd3JpdGUoKTsKLSAgfQotCi0gIC8vIEFsbG9jYXRlIGludG8gYSBuZXcgcG9pbnRlciBzbyB3ZSBkb24ndCBib3JrIG91cnMgaWYgaXQgZmFpbHMuCi0gIHZvaWQqIG5ld19idWZmZXIgPSBzdGQ6OnJlYWxsb2MoYnVmZmVyXywgYnVmZmVyU2l6ZV8pOwotICBpZiAobmV3X2J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiT3V0IG9mIG1lbW9yeS4iKTsKLSAgfQotCi0gIHB0cmRpZmZfdCBvZmZzZXQgPSAodWludDhfdCopbmV3X2J1ZmZlciAtIGJ1ZmZlcl87Ci0gIGJ1ZmZlcl8gKz0gb2Zmc2V0OwotICByQmFzZV8gKz0gb2Zmc2V0OwotICByQm91bmRfICs9IG9mZnNldDsKLSAgd0Jhc2VfICs9IG9mZnNldDsKLSAgd0JvdW5kXyArPSBvZmZzZXQ7Ci19Ci0KLXZvaWQgVE1lbW9yeUJ1ZmZlcjo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGVuc3VyZUNhbldyaXRlKGxlbik7Ci0KLSAgLy8gQ29weSBpbnRvIHRoZSBidWZmZXIgYW5kIGluY3JlbWVudCB3QmFzZV8uCi0gIG1lbWNweSh3QmFzZV8sIGJ1ZiwgbGVuKTsKLSAgd0Jhc2VfICs9IGxlbjsKLX0KLQotdm9pZCBUTWVtb3J5QnVmZmVyOjp3cm90ZUJ5dGVzKHVpbnQzMl90IGxlbikgewotICB1aW50MzJfdCBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpOwotICBpZiAobGVuID4gYXZhaWwpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDbGllbnQgd3JvdGUgbW9yZSBieXRlcyB0aGFuIHNpemUgb2YgYnVmZmVyLiIpOwotICB9Ci0gIHdCYXNlXyArPSBsZW47Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIFRNZW1vcnlCdWZmZXI6OmJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gIHJCb3VuZF8gPSB3QmFzZV87Ci0gIGlmIChhdmFpbGFibGVfcmVhZCgpID49ICpsZW4pIHsKLSAgICAqbGVuID0gYXZhaWxhYmxlX3JlYWQoKTsKLSAgICByZXR1cm4gckJhc2VfOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwODIwNS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEJVRkZFUlRSQU5TUE9SVFNfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEJVRkZFUlRSQU5TUE9SVFNfSF8gMQotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlICJib29zdC9zY29wZWRfYXJyYXkuaHBwIgotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIFREQl9MSUtFTFkodmFsKSAoX19idWlsdGluX2V4cGVjdCgodmFsKSwgMSkpCi0jZGVmaW5lIFREQl9VTkxJS0VMWSh2YWwpIChfX2J1aWx0aW5fZXhwZWN0KCh2YWwpLCAwKSkKLSNlbHNlCi0jZGVmaW5lIFREQl9MSUtFTFkodmFsKSAodmFsKQotI2RlZmluZSBUREJfVU5MSUtFTFkodmFsKSAodmFsKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgdHJhbnNwb3J0cyB0aGF0IHVzZSByZWFkL3dyaXRlIGJ1ZmZlcnMgZm9yIHBlcmZvcm1hbmNlLgotICoKLSAqIFRCdWZmZXJCYXNlIGlzIGRlc2lnbmVkIHRvIGltcGxlbWVudCB0aGUgZmFzdC1wYXRoICJtZW1jcHkiIHN0eWxlCi0gKiBvcGVyYXRpb25zIHRoYXQgd29yayBpbiB0aGUgY29tbW9uIGNhc2UuICBJdCBkb2VzIHNvIHdpdGggc21hbGwgYW5kCi0gKiAoZXZlbnR1YWxseSkgbm9udmlydHVhbCwgaW5saW5hYmxlIG1ldGhvZHMuICBUQnVmZmVyQmFzZSBpcyBhbiBhYnN0cmFjdAotICogY2xhc3MuICBTdWJjbGFzc2VzIGFyZSBleHBlY3RlZCB0byBkZWZpbmUgdGhlICJzbG93IHBhdGgiIG9wZXJhdGlvbnMKLSAqIHRoYXQgaGF2ZSB0byBiZSBkb25lIHdoZW4gdGhlIGJ1ZmZlcnMgYXJlIGZ1bGwgb3IgZW1wdHkuCi0gKgotICovCi1jbGFzcyBUQnVmZmVyQmFzZSA6IHB1YmxpYyBUVHJhbnNwb3J0IHsKLQotIHB1YmxpYzoKLQotICAvKioKLSAgICogRmFzdC1wYXRoIHJlYWQuCi0gICAqCi0gICAqIFdoZW4gd2UgaGF2ZSBlbm91Z2ggZGF0YSBidWZmZXJlZCB0byBmdWxmaWxsIHRoZSByZWFkLCB3ZSBjYW4gc2F0aXNmeSBpdAotICAgKiB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLiAgSWYgdGhlIGJ1ZmZlcgotICAgKiBpcyBlbXB0eSwgd2UgY2FsbCBvdXQgdG8gb3VyIHNsb3cgcGF0aCwgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KLSAgICogVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gZXZlbnR1YWxseSBiZSBub252aXJ0dWFsIGFuZCBpbmxpbmFibGUuCi0gICAqLwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdWludDhfdCogbmV3X3JCYXNlID0gckJhc2VfICsgbGVuOwotICAgIGlmIChUREJfTElLRUxZKG5ld19yQmFzZSA8PSByQm91bmRfKSkgewotICAgICAgc3RkOjptZW1jcHkoYnVmLCByQmFzZV8sIGxlbik7Ci0gICAgICByQmFzZV8gPSBuZXdfckJhc2U7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgICByZXR1cm4gcmVhZFNsb3coYnVmLCBsZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqIEZhc3QtcGF0aCB3cml0ZS4KLSAgICoKLSAgICogV2hlbiB3ZSBoYXZlIGVub3VnaCBlbXB0eSBzcGFjZSBpbiBvdXIgYnVmZmVyIHRvIGFjY29tb2RhdGUgdGhlIHdyaXRlLCB3ZQotICAgKiBjYW4gc2F0aXNmeSBpdCB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLgotICAgKiBJZiB0aGUgYnVmZmVyIGlzIGZ1bGwsIHdlIGNhbGwgb3V0IHRvIG91ciBzbG93IHBhdGgsIGltcGxlbWVudGVkIGJ5IGEKLSAgICogc3ViY2xhc3MuICBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBldmVudHVhbGx5IGJlIG5vbnZpcnR1YWwgYW5kCi0gICAqIGlubGluYWJsZS4KLSAgICovCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB1aW50OF90KiBuZXdfd0Jhc2UgPSB3QmFzZV8gKyBsZW47Ci0gICAgaWYgKFREQl9MSUtFTFkobmV3X3dCYXNlIDw9IHdCb3VuZF8pKSB7Ci0gICAgICBzdGQ6Om1lbWNweSh3QmFzZV8sIGJ1ZiwgbGVuKTsKLSAgICAgIHdCYXNlXyA9IG5ld193QmFzZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgd3JpdGVTbG93KGJ1ZiwgbGVuKTsKLSAgfQotCi0gIC8qKgotICAgKiBGYXN0LXBhdGggYm9ycm93LiAgQSBsb3QgbGlrZSB0aGUgZmFzdC1wYXRoIHJlYWQuCi0gICAqLwotICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gICAgaWYgKFREQl9MSUtFTFkoc3RhdGljX2Nhc3Q8cHRyZGlmZl90PigqbGVuKSA8PSByQm91bmRfIC0gckJhc2VfKSkgewotICAgICAgLy8gV2l0aCBzdHJpY3QgYWxpYXNpbmcsIHdyaXRpbmcgdG8gbGVuIHNob3VsZG4ndCBmb3JjZSB1cyB0bwotICAgICAgLy8gcmVmZXRjaCByQmFzZV8gZnJvbSBtZW1vcnkuICBUT0RPKGRyZWlzcyk6IFZlcmlmeSB0aGlzLgotICAgICAgKmxlbiA9IHJCb3VuZF8gLSByQmFzZV87Ci0gICAgICByZXR1cm4gckJhc2VfOwotICAgIH0KLSAgICByZXR1cm4gYm9ycm93U2xvdyhidWYsIGxlbik7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3VtZSBkb2Vzbid0IHJlcXVpcmUgYSBzbG93IHBhdGguCi0gICAqLwotICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gICAgaWYgKFREQl9MSUtFTFkoc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihsZW4pIDw9IHJCb3VuZF8gLSByQmFzZV8pKSB7Ci0gICAgICByQmFzZV8gKz0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3VtZSBkaWQgbm90IGZvbGxvdyBhIGJvcnJvdy4iKTsKLSAgICB9Ci0gIH0KLQotCi0gcHJvdGVjdGVkOgotCi0gIC8vLyBTbG93IHBhdGggcmVhZC4KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOwotCi0gIC8vLyBTbG93IHBhdGggd3JpdGUuCi0gIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKLQotICAvKioKLSAgICogU2xvdyBwYXRoIGJvcnJvdy4KLSAgICoKLSAgICogUE9TVENPTkRJVElPTjogcmV0dXJuID09IE5VTEwgfHwgckJvdW5kXyAtIHJCYXNlXyA+PSAqbGVuCi0gICAqLwotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSA9IDA7Ci0KLSAgLyoqCi0gICAqIFRyaXZpYWwgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEluaXRpYWxpemUgcG9pbnRlcnMgc2FmZWx5LiAgQ29uc3RydWN0aW5nIGlzIG5vdCBhIHZlcnkKLSAgICogcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIG9wZXJhdGlvbiwgc28gaXQgaXMgb2theSB0byBqdXN0IGxlYXZlIGl0IHRvCi0gICAqIHRoZSBjb25jcmV0ZSBjbGFzcyB0byBzZXQgdXAgcG9pbnRlcnMgY29ycmVjdGx5LgotICAgKi8KLSAgVEJ1ZmZlckJhc2UoKQotICAgIDogckJhc2VfKE5VTEwpCi0gICAgLCByQm91bmRfKE5VTEwpCi0gICAgLCB3QmFzZV8oTlVMTCkKLSAgICAsIHdCb3VuZF8oTlVMTCkKLSAge30KLQotICAvLy8gQ29udmVuaWVuY2UgbXV0YXRvciBmb3Igc2V0dGluZyB0aGUgcmVhZCBidWZmZXIuCi0gIHZvaWQgc2V0UmVhZEJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJCYXNlXyA9IGJ1ZjsKLSAgICByQm91bmRfID0gYnVmK2xlbjsKLSAgfQotCi0gIC8vLyBDb252ZW5pZW5jZSBtdXRhdG9yIGZvciBzZXR0aW5nIHRoZSB3cml0ZSBidWZmZXIuCi0gIHZvaWQgc2V0V3JpdGVCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB3QmFzZV8gPSBidWY7Ci0gICAgd0JvdW5kXyA9IGJ1ZitsZW47Ci0gIH0KLQotICB2aXJ0dWFsIH5UQnVmZmVyQmFzZSgpIHt9Ci0KLSAgLy8vIFJlYWRzIGJlZ2luIGhlcmUuCi0gIHVpbnQ4X3QqIHJCYXNlXzsKLSAgLy8vIFJlYWRzIG1heSBleHRlbmQgdG8ganVzdCBiZWZvcmUgaGVyZS4KLSAgdWludDhfdCogckJvdW5kXzsKLQotICAvLy8gV3JpdGVzIGJlZ2luIGhlcmUuCi0gIHVpbnQ4X3QqIHdCYXNlXzsKLSAgLy8vIFdyaXRlcyBtYXkgZXh0ZW5kIHRvIGp1c3QgYmVmb3JlIGhlcmUuCi0gIHVpbnQ4X3QqIHdCb3VuZF87Ci19OwotCi0KLS8qKiAKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0cmFuc3BvcnQgd2hpY2ggd3JhcHMgdHJhbnNwb3J0IHRvIG5ldyBvbmUuCi0gKi8KLWNsYXNzIFRVbmRlcmx5aW5nVHJhbnNwb3J0IDogcHVibGljIFRCdWZmZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDUxMjsKLQotICB2aXJ0dWFsIGJvb2wgcGVlaygpIHsKLSAgICByZXR1cm4gKHJCYXNlXyA8IHJCb3VuZF8pIHx8IHRyYW5zcG9ydF8tPnBlZWsoKTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICB2b2lkIGNsb3NlKCkgewotICAgIGZsdXNoKCk7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF87Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLQotICB1aW50MzJfdCByQnVmU2l6ZV87Ci0gIHVpbnQzMl90IHdCdWZTaXplXzsKLSAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiByQnVmXzsKLSAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB3QnVmXzsKLQotICBUVW5kZXJseWluZ1RyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCByQnVmU2l6ZV8oc3opCi0gICAgLCB3QnVmU2l6ZV8oc3opCi0gICAgLCByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkge30KLQotICBUVW5kZXJseWluZ1RyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCkKLSAgICAsIHJCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKQotICAgICwgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpCi0gICAgLCByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkge30KLQotICBUVW5kZXJseWluZ1RyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHJzeiwgdWludDMyX3Qgd3N6KQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCByQnVmU2l6ZV8ocnN6KQotICAgICwgd0J1ZlNpemVfKHdzeikKLSAgICAsIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pCi0gICAgLCB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSB7fQotfTsKLQotLyoqCi0gKiBCdWZmZXJlZCB0cmFuc3BvcnQuIEZvciByZWFkcyBpdCB3aWxsIHJlYWQgbW9yZSBkYXRhIHRoYW4gaXMgcmVxdWVzdGVkCi0gKiBhbmQgd2lsbCBzZXJ2ZSBmdXR1cmUgZGF0YSBvdXQgb2YgYSBsb2NhbCBidWZmZXIuIEZvciB3cml0ZXMsIGRhdGEgaXMKLSAqIHN0b3JlZCB0byBhbiBpbiBtZW1vcnkgYnVmZmVyIGJlZm9yZSBiZWluZyB3cml0dGVuIG91dC4KLSAqCi0gKi8KLWNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCA6IHB1YmxpYyBUVW5kZXJseWluZ1RyYW5zcG9ydCB7Ci0gcHVibGljOgotCi0gIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCi0gICAgOiBUVW5kZXJseWluZ1RyYW5zcG9ydCh0cmFuc3BvcnQpCi0gIHsKLSAgICBpbml0UG9pbnRlcnMoKTsKLSAgfQotCi0gIC8vLyBVc2Ugc3BlY2lmaWVkIGJ1ZmZlciBzaXplcy4KLSAgVEJ1ZmZlcmVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3Qgc3opCi0gICAgOiBUVW5kZXJseWluZ1RyYW5zcG9ydCh0cmFuc3BvcnQsIHN6KQotICB7Ci0gICAgaW5pdFBvaW50ZXJzKCk7Ci0gIH0KLQotICAvLy8gVXNlIHNwZWNpZmllZCByZWFkIGFuZCB3cml0ZSBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHJzeiwgdWludDMyX3Qgd3N6KQotICAgIDogVFVuZGVybHlpbmdUcmFuc3BvcnQodHJhbnNwb3J0LCByc3osIHdzeikKLSAgewotICAgIGluaXRQb2ludGVycygpOwotICB9Ci0KLSAgdmlydHVhbCBib29sIHBlZWsoKSB7Ci0gICAgLyogc2hpZ2luOiBzZWUgVEhSSUZULTk2IGRpc2N1c3Npb24gKi8KLSAgICBpZiAockJhc2VfID09IHJCb3VuZF8pIHsKLSAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHRyYW5zcG9ydF8tPnJlYWQockJ1Zl8uZ2V0KCksIHJCdWZTaXplXykpOwotICAgIH0KLSAgICByZXR1cm4gKHJCb3VuZF8gPiByQmFzZV8pOwotICB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgZmx1c2goKTsKLQotCi0gIC8qKgotICAgKiBUaGUgZm9sbG93aW5nIGJlaGF2aW9yIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBieSBUQnVmZmVyZWRUcmFuc3BvcnQsCi0gICAqIGJ1dCB0aGF0IG1heSBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbjoKLSAgICogMS8gSWYgbGVuIGlzIGF0IG1vc3QgckJ1ZlNpemVfLCBib3Jyb3cgd2lsbCBuZXZlciByZXR1cm4gTlVMTC4KLSAgICogICAgRGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgaXQgY291bGQgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAqICAgIG9yIGhhbmcgZm9yZXZlci4KLSAgICogMi8gU29tZSBib3Jyb3cgcmVxdWVzdHMgbWF5IGNvcHkgYnl0ZXMgaW50ZXJuYWxseS4gIEhvd2V2ZXIsCi0gICAqICAgIGlmIGxlbiBpcyBhdCBtb3N0IHJCdWZTaXplXy8yLCBub25lIG9mIHRoZSBjb3BpZWQgYnl0ZXMKLSAgICogICAgd2lsbCBldmVyIGhhdmUgdG8gYmUgY29waWVkIGFnYWluLiAgRm9yIG9wdGltaWFsIHBlcmZvcm1hbmNlLAotICAgKiAgICBzdGF5IHVuZGVyIHRoaXMgbGltaXQuCi0gICAqLwotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBpbml0UG9pbnRlcnMoKSB7Ci0gICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7Ci0gICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7Ci0gICAgLy8gV3JpdGUgc2l6ZSBuZXZlciBjaGFuZ2VzLgotICB9Ci19OwotCi0KLS8qKgotICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KLSAqCi0gKi8KLWNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCB+VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgLyoqCi0gICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpKTsKLSAgfQotCi19OwotCi0KLS8qKgotICogRnJhbWVkIHRyYW5zcG9ydC4gQWxsIHdyaXRlcyBnbyBpbnRvIGFuIGluLW1lbW9yeSBidWZmZXIgdW50aWwgZmx1c2ggaXMKLSAqIGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIHRyYW5zcG9ydCB3cml0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlCi0gKiBiaW5hcnkgY2h1bmsgZm9sbG93ZWQgYnkgdGhlIGRhdGEgcGF5bG9hZC4gVGhpcyBhbGxvd3MgdGhlIHJlY2VpdmVyIG9uIHRoZQotICogb3RoZXIgZW5kIHRvIGFsd2F5cyBkbyBmaXhlZC1sZW5ndGggcmVhZHMuCi0gKgotICovCi1jbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogcHVibGljIFRVbmRlcmx5aW5nVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0KLSAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KLSAgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCi0gICAgOiBUVW5kZXJseWluZ1RyYW5zcG9ydCh0cmFuc3BvcnQpCi0gIHsKLSAgICBpbml0UG9pbnRlcnMoKTsKLSAgfQotCi0gIFRGcmFtZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCBzeikKLSAgICA6IFRVbmRlcmx5aW5nVHJhbnNwb3J0KHRyYW5zcG9ydCwgc3opCi0gIHsKLSAgICBpbml0UG9pbnRlcnMoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNsb3codWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZpcnR1YWwgdm9pZCB3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIHZpcnR1YWwgdm9pZCBmbHVzaCgpOwotCi0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKLQotIHByb3RlY3RlZDoKLSAgLyoqCi0gICAqIFJlYWRzIGEgZnJhbWUgb2YgaW5wdXQgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCi0gICAqLwotICB2b2lkIHJlYWRGcmFtZSgpOwotCi0gIHZvaWQgaW5pdFBvaW50ZXJzKCkgewotICAgIHNldFJlYWRCdWZmZXIoTlVMTCwgMCk7Ci0gICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7Ci0KLSAgICAvLyBQYWQgdGhlIGJ1ZmZlciBzbyB3ZSBjYW4gaW5zZXJ0IHRoZSBzaXplIGxhdGVyLgotICAgIGludDMyX3QgcGFkID0gMDsKLSAgICB0aGlzLT53cml0ZSgodWludDhfdCopJnBhZCwgc2l6ZW9mKHBhZCkpOwotICB9Ci19OwotCi0vKioKLSAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBmcmFtZWQgb25lLgotICoKLSAqLwotY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgewotIHB1YmxpYzoKLSAgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgflRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KLQotICAvKioKLSAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgZnJhbWVkIG9uZS4KLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKSk7Ci0gIH0KLQotfTsKLQotCi0vKioKLSAqIEEgbWVtb3J5IGJ1ZmZlciBpcyBhIHRyYW5wc29ydCB0aGF0IHNpbXBseSByZWFkcyBmcm9tIGFuZCB3cml0ZXMgdG8gYW4KLSAqIGluIG1lbW9yeSBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseSBwbGFjZWQKLSAqIGludG8gYSBidWZmZXIsIGFuZCBhbnl0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgcmVhZCBmcm9tIHRoYXQgYnVmZmVyLgotICoKLSAqIFRoZSBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgdXNpbmcgQyBjb25zdHJ1Y3RzIG1hbGxvYyxyZWFsbG9jLCBhbmQgdGhlIHNpemUKLSAqIGRvdWJsZXMgYXMgbmVjZXNzYXJ5LiAgV2UndmUgY29uc2lkZXJlZCB1c2luZyBzY29wZWQKLSAqCi0gKi8KLWNsYXNzIFRNZW1vcnlCdWZmZXIgOiBwdWJsaWMgVEJ1ZmZlckJhc2UgewotIHByaXZhdGU6Ci0KLSAgLy8gQ29tbW9uIGluaXRpYWxpemF0aW9uIGRvbmUgYnkgYWxsIGNvbnN0cnVjdG9ycy4KLSAgdm9pZCBpbml0Q29tbW9uKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc2l6ZSwgYm9vbCBvd25lciwgdWludDMyX3Qgd1BvcykgewotICAgIGlmIChidWYgPT0gTlVMTCAmJiBzaXplICE9IDApIHsKLSAgICAgIGFzc2VydChvd25lcik7Ci0gICAgICBidWYgPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiT3V0IG9mIG1lbW9yeSIpOwotICAgICAgfQotICAgIH0KLQotICAgIGJ1ZmZlcl8gPSBidWY7Ci0gICAgYnVmZmVyU2l6ZV8gPSBzaXplOwotCi0gICAgckJhc2VfID0gYnVmZmVyXzsKLSAgICByQm91bmRfID0gYnVmZmVyXyArIHdQb3M7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBJbnZlc3RpZ2F0ZSBOVUxMLWluZyB0aGlzIGlmICFvd25lci4KLSAgICB3QmFzZV8gPSBidWZmZXJfICsgd1BvczsKLSAgICB3Qm91bmRfID0gYnVmZmVyXyArIGJ1ZmZlclNpemVfOwotCi0gICAgb3duZXJfID0gb3duZXI7Ci0KLSAgICAvLyByQm91bmRfIGlzIHJlYWxseSBhbiBhcnRpZmFjdC4gIEluIHByaW5jaXBsZSwgaXQgc2hvdWxkIGFsd2F5cyBiZQotICAgIC8vIGVxdWFsIHRvIHdCYXNlXy4gIFdlIHVwZGF0ZSBpdCBpbiBhIGZldyBwbGFjZXMgKGNvbXB1dGVSZWFkLCBldGMuKS4KLSAgfQotCi0gcHVibGljOgotICBzdGF0aWMgY29uc3QgdWludDMyX3QgZGVmYXVsdFNpemUgPSAxMDI0OwotCi0gIC8qKgotICAgKiBUaGlzIGVudW0gc3BlY2lmaWVzIGhvdyBhIFRNZW1vcnlCdWZmZXIgc2hvdWxkIHRyZWF0Ci0gICAqIG1lbW9yeSBwYXNzZWQgdG8gaXQgdmlhIGNvbnN0cnVjdG9ycyBvciByZXNldEJ1ZmZlci4KLSAgICoKLSAgICogT0JTRVJWRToKLSAgICogICBUTWVtb3J5QnVmZmVyIHdpbGwgc2ltcGx5IHN0b3JlIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5LgotICAgKiAgIEl0IGlzIHRoZSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBwb2ludGVyCi0gICAqICAgcmVtYWlucyB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBUTWVtb3J5QnVmZmVyLAotICAgKiAgIGFuZCB0aGF0IGl0IGlzIHByb3Blcmx5IGNsZWFuZWQgdXAuCi0gICAqICAgTm90ZSB0aGF0IG5vIGRhdGEgY2FuIGJlIHdyaXR0ZW4gdG8gb2JzZXJ2ZWQgYnVmZmVycy4KLSAgICoKLSAgICogQ09QWToKLSAgICogICBUTWVtb3J5QnVmZmVyIHdpbGwgbWFrZSBhbiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBidWZmZXIuCi0gICAqICAgVGhlIGNhbGxlciBoYXMgbm8gcmVzcG9uc2liaWxpdGllcy4KLSAgICoKLSAgICogVEFLRV9PV05FUlNISVA6Ci0gICAqICAgVE1lbW9yeUJ1ZmZlciB3aWxsIGJlY29tZSB0aGUgIm93bmVyIiBvZiB0aGUgYnVmZmVyLAotICAgKiAgIGFuZCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgotICAgKiAgIFRoZSBtZW1ib3J5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIG1hbGxvYy4KLSAgICovCi0gIGVudW0gTWVtb3J5UG9saWN5Ci0gIHsgT0JTRVJWRSA9IDEKLSAgLCBDT1BZID0gMgotICAsIFRBS0VfT1dORVJTSElQID0gMwotICB9OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYSBkZWZhdWx0LXNpemVkIGJ1ZmZlciwKLSAgICogb3duZWQgYnkgdGhlIFRNZW1vcnlCdWZmZXIgb2JqZWN0LgotICAgKi8KLSAgVE1lbW9yeUJ1ZmZlcigpIHsKLSAgICBpbml0Q29tbW9uKE5VTEwsIGRlZmF1bHRTaXplLCB0cnVlLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYSBidWZmZXIgb2YgYSBzcGVjaWZpZWQgc2l6ZSwKLSAgICogb3duZWQgYnkgdGhlIFRNZW1vcnlCdWZmZXIgb2JqZWN0LgotICAgKgotICAgKiBAcGFyYW0gc3ogIFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlci4KLSAgICovCi0gIFRNZW1vcnlCdWZmZXIodWludDMyX3Qgc3opIHsKLSAgICBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSBUTWVtb3J5QnVmZmVyIHdpdGggYnVmIGFzIGl0cyBpbml0aWFsIGNvbnRlbnRzLgotICAgKgotICAgKiBAcGFyYW0gYnVmICAgIFRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAqICAgICAgICAgICAgICAgTm90ZSB0aGF0LCB3aGlsZSBidWYgaXMgYSBub24tY29uc3QgcG9pbnRlciwKLSAgICogICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyIHdpbGwgbm90IHdyaXRlIHRvIGl0IGlmIHBvbGljeSA9PSBPQlNFUlZFLAotICAgKiAgICAgICAgICAgICAgIHNvIGl0IGlzIHNhZmUgdG8gY29uc3RfY2FzdDx1aW50OF90Kj4od2hhdGV2ZXIpLgotICAgKiBAcGFyYW0gc3ogICAgIFRoZSBzaXplIG9mIEBjIGJ1Zi4KLSAgICogQHBhcmFtIHBvbGljeSBTZWUgQGxpbmsgTWVtb3J5UG9saWN5IEBlbmRsaW5rIC4KLSAgICovCi0gIFRNZW1vcnlCdWZmZXIodWludDhfdCogYnVmLCB1aW50MzJfdCBzeiwgTWVtb3J5UG9saWN5IHBvbGljeSA9IE9CU0VSVkUpIHsKLSAgICBpZiAoYnVmID09IE5VTEwgJiYgc3ogIT0gMCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRNZW1vcnlCdWZmZXIgZ2l2ZW4gbnVsbCBidWZmZXIgd2l0aCBub24temVybyBzaXplLiIpOwotICAgIH0KLQotICAgIHN3aXRjaCAocG9saWN5KSB7Ci0gICAgICBjYXNlIE9CU0VSVkU6Ci0gICAgICBjYXNlIFRBS0VfT1dORVJTSElQOgotICAgICAgICBpbml0Q29tbW9uKGJ1Ziwgc3osIHBvbGljeSA9PSBUQUtFX09XTkVSU0hJUCwgc3opOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQ09QWToKLSAgICAgICAgaW5pdENvbW1vbihOVUxMLCBzeiwgdHJ1ZSwgMCk7Ci0gICAgICAgIHRoaXMtPndyaXRlKGJ1Ziwgc3opOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgTWVtb3J5UG9saWN5IGZvciBUTWVtb3J5QnVmZmVyIik7Ci0gICAgfQotICB9Ci0KLSAgflRNZW1vcnlCdWZmZXIoKSB7Ci0gICAgaWYgKG93bmVyXykgewotICAgICAgc3RkOjpmcmVlKGJ1ZmZlcl8pOwotICAgIH0KLSAgfQotCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiAockJhc2VfIDwgd0Jhc2VfKTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHt9Ci0KLSAgdm9pZCBjbG9zZSgpIHt9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBNYWtlIGJ1ZlB0ciBjb25zdC4KLSAgdm9pZCBnZXRCdWZmZXIodWludDhfdCoqIGJ1ZlB0ciwgdWludDMyX3QqIHN6KSB7Ci0gICAgKmJ1ZlB0ciA9IHJCYXNlXzsKLSAgICAqc3ogPSB3QmFzZV8gLSByQmFzZV87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRCdWZmZXJBc1N0cmluZygpIHsKLSAgICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIHVpbnQ4X3QqIGJ1ZjsKLSAgICB1aW50MzJfdCBzejsKLSAgICBnZXRCdWZmZXIoJmJ1ZiwgJnN6KTsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUpc3opOwotICB9Ci0KLSAgdm9pZCBhcHBlbmRCdWZmZXJUb1N0cmluZyhzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgaWYgKGJ1ZmZlcl8gPT0gTlVMTCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50OF90KiBidWY7Ci0gICAgdWludDMyX3Qgc3o7Ci0gICAgZ2V0QnVmZmVyKCZidWYsICZzeik7Ci0gICAgc3RyLmFwcGVuZCgoY2hhciopYnVmLCBzeik7Ci0gIH0KLQotICB2b2lkIHJlc2V0QnVmZmVyKGJvb2wgcmVzZXRfY2FwYWNpdHkgPSBmYWxzZSkgewotICAgIGlmIChyZXNldF9jYXBhY2l0eSkKLSAgICB7Ci0gICAgICBhc3NlcnQob3duZXJfKTsKLQotICAgICAgdm9pZCogbmV3X2J1ZmZlciA9IHN0ZDo6cmVhbGxvYyhidWZmZXJfLCBkZWZhdWx0U2l6ZSk7Ci0KLSAgICAgIGlmIChuZXdfYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiT3V0IG9mIG1lbW9yeS4iKTsKLSAgICAgIH0KLQotICAgICAgYnVmZmVyXyA9ICh1aW50OF90KikgbmV3X2J1ZmZlcjsKLSAgICAgIGJ1ZmZlclNpemVfID0gZGVmYXVsdFNpemU7Ci0KLSAgICAgIHdCb3VuZF8gPSBidWZmZXJfICsgYnVmZmVyU2l6ZV87Ci0gICAgfQotCi0gICAgckJhc2VfID0gYnVmZmVyXzsKLSAgICByQm91bmRfID0gYnVmZmVyXzsKLSAgICB3QmFzZV8gPSBidWZmZXJfOwotICAgIC8vIEl0IGlzbid0IHNhZmUgdG8gd3JpdGUgaW50byBhIGJ1ZmZlciB3ZSBkb24ndCBvd24uCi0gICAgaWYgKCFvd25lcl8pIHsKLSAgICAgIHdCb3VuZF8gPSB3QmFzZV87Ci0gICAgICBidWZmZXJTaXplXyA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLy8vIFNlZSBjb25zdHJ1Y3RvciBkb2N1bWVudGF0aW9uLgotICB2b2lkIHJlc2V0QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc3osIE1lbW9yeVBvbGljeSBwb2xpY3kgPSBPQlNFUlZFKSB7Ci0gICAgLy8gVXNlIGEgdmFyaWFudCBvZiB0aGUgY29weS1hbmQtc3dhcCB0cmljayBmb3IgYXNzaWdubWVudCBvcGVyYXRvcnMuCi0gICAgLy8gVGhpcyBpcyBzdWItb3B0aW1hbCBpbiB0ZXJtcyBvZiBwZXJmb3JtYW5jZSBmb3IgdHdvIHJlYXNvbnM6Ci0gICAgLy8gICAxLyBUaGUgY29uc3RydWN0aW5nIGFuZCBzd2FwcGluZyBvZiB0aGUgKHNtYWxsKSB2YWx1ZXMKLSAgICAvLyAgICAgIGluIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0IHRha2VzIHNvbWUgdGltZSwgYW5kIGlzIG5vdCBuZWNlc3NhcnkuCi0gICAgLy8gICAyLyBJZiBwb2xpY3kgPT0gQ09QWSwgd2UgYWxsb2NhdGUgdGhlIG5ldyBidWZmZXIgYmVmb3JlCi0gICAgLy8gICAgICBmcmVlaW5nIHRoZSBvbGQgb25lLCBwcmVjbHVkaW5nIHRoZSBwb3NzaWJpbGl0eSBvZgotICAgIC8vICAgICAgcmV1c2luZyB0aGF0IG1lbW9yeS4KLSAgICAvLyBJIGRvdWJ0IHRoYXQgZWl0aGVyIG9mIHRoZXNlIHByb2JsZW1zIGNvdWxkIGJlIG9wdGltaXplZCBhd2F5LAotICAgIC8vIGJ1dCB0aGUgc2Vjb25kIGlzIHByb2JhYmx5IG5vIGEgY29tbW9uIGNhc2UsIGFuZCB0aGUgZmlyc3QgaXMgbWlub3IuCi0gICAgLy8gSSBkb24ndCBleHBlY3QgcmVzZXRCdWZmZXIgdG8gYmUgYSBjb21tb24gb3BlcmF0aW9uLCBzbyBJJ20gd2lsbGluZyB0bwotICAgIC8vIGJpdGUgdGhlIHBlcmZvcm1hbmNlIGJ1bGxldCB0byBtYWtlIHRoZSBtZXRob2QgdGhpcyBzaW1wbGUuCi0KLSAgICAvLyBDb25zdHJ1Y3QgdGhlIG5ldyBidWZmZXIuCi0gICAgVE1lbW9yeUJ1ZmZlciBuZXdfYnVmZmVyKGJ1Ziwgc3osIHBvbGljeSk7Ci0gICAgLy8gTW92ZSBpdCBpbnRvIG91cnNlbGYuCi0gICAgdGhpcy0+c3dhcChuZXdfYnVmZmVyKTsKLSAgICAvLyBPdXIgb2xkIHNlbGYgZ2V0cyBkZXN0cm95ZWQuCi0gIH0KLQotICBzdGQ6OnN0cmluZyByZWFkQXNTdHJpbmcodWludDMyX3QgbGVuKSB7Ci0gICAgc3RkOjpzdHJpbmcgc3RyOwotICAgICh2b2lkKXJlYWRBcHBlbmRUb1N0cmluZyhzdHIsIGxlbik7Ci0gICAgcmV0dXJuIHN0cjsKLSAgfQotCi0gIHVpbnQzMl90IHJlYWRBcHBlbmRUb1N0cmluZyhzdGQ6OnN0cmluZyYgc3RyLCB1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgcmVhZEVuZCgpIHsKLSAgICBpZiAockJhc2VfID09IHdCYXNlXykgewotICAgICAgcmVzZXRCdWZmZXIoKTsKLSAgICB9Ci0gIH0KLQotICB1aW50MzJfdCBhdmFpbGFibGVfcmVhZCgpIGNvbnN0IHsKLSAgICAvLyBSZW1lbWJlciwgd0Jhc2VfIGlzIHRoZSByZWFsIHJCb3VuZF8uCi0gICAgcmV0dXJuIHdCYXNlXyAtIHJCYXNlXzsKLSAgfQotCi0gIHVpbnQzMl90IGF2YWlsYWJsZV93cml0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gd0JvdW5kXyAtIHdCYXNlXzsKLSAgfQotCi0gIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBjbGllbnQgY2FuIHdyaXRlIGRhdGEgdG8gYXBwZW5kIHRvCi0gIC8vIHRoZSBUTWVtb3J5QnVmZmVyLCBhbmQgZW5zdXJlcyB0aGUgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gYWNjb21vZGF0ZSBhCi0gIC8vIHdyaXRlIG9mIHRoZSBwcm92aWRlZCBsZW5ndGguICBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyB2ZXJ5IGNvbnZlbmllbnQgZm9yCi0gIC8vIHBhc3NpbmcgdG8gcmVhZCgpLCByZWN2KCksIG9yIHNpbWlsYXIuIFlvdSBtdXN0IGNhbGwgd3JvdGVCeXRlcygpIGFzIHNvb24KLSAgLy8gYXMgZGF0YSBpcyB3cml0dGVuIG9yIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgYXdhcmUgdGhhdCBkYXRhIGhhcyBjaGFuZ2VkLgotICB1aW50OF90KiBnZXRXcml0ZVB0cih1aW50MzJfdCBsZW4pIHsKLSAgICBlbnN1cmVDYW5Xcml0ZShsZW4pOwotICAgIHJldHVybiB3QmFzZV87Ci0gIH0KLQotICAvLyBJbmZvcm1zIHRoZSBidWZmZXIgdGhhdCB0aGUgY2xpZW50IGhhcyB3cml0dGVuICdsZW4nIGJ5dGVzIGludG8gc3RvcmFnZQotICAvLyB0aGF0IGhhZCBiZWVuIHByb3ZpZGVkIGJ5IGdldFdyaXRlUHRyKCkuCi0gIHZvaWQgd3JvdGVCeXRlcyh1aW50MzJfdCBsZW4pOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIHN3YXAoVE1lbW9yeUJ1ZmZlciYgdGhhdCkgewotICAgIHVzaW5nIHN0ZDo6c3dhcDsKLSAgICBzd2FwKGJ1ZmZlcl8sICAgICB0aGF0LmJ1ZmZlcl8pOwotICAgIHN3YXAoYnVmZmVyU2l6ZV8sIHRoYXQuYnVmZmVyU2l6ZV8pOwotCi0gICAgc3dhcChyQmFzZV8sICAgICAgdGhhdC5yQmFzZV8pOwotICAgIHN3YXAockJvdW5kXywgICAgIHRoYXQuckJvdW5kXyk7Ci0gICAgc3dhcCh3QmFzZV8sICAgICAgdGhhdC53QmFzZV8pOwotICAgIHN3YXAod0JvdW5kXywgICAgIHRoYXQud0JvdW5kXyk7Ci0KLSAgICBzd2FwKG93bmVyXywgICAgICB0aGF0Lm93bmVyXyk7Ci0gIH0KLQotICAvLyBNYWtlIHN1cmUgdGhlcmUncyBhdCBsZWFzdCAnbGVuJyBieXRlcyBhdmFpbGFibGUgZm9yIHdyaXRpbmcuCi0gIHZvaWQgZW5zdXJlQ2FuV3JpdGUodWludDMyX3QgbGVuKTsKLQotICAvLyBDb21wdXRlIHRoZSBwb3NpdGlvbiBhbmQgYXZhaWxhYmxlIGRhdGEgZm9yIHJlYWRpbmcuCi0gIHZvaWQgY29tcHV0ZVJlYWQodWludDMyX3QgbGVuLCB1aW50OF90Kiogb3V0X3N0YXJ0LCB1aW50MzJfdCogb3V0X2dpdmUpOwotCi0gIHVpbnQzMl90IHJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIHdyaXRlU2xvdyhjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwotCi0gIC8vIERhdGEgYnVmZmVyCi0gIHVpbnQ4X3QqIGJ1ZmZlcl87Ci0KLSAgLy8gQWxsb2NhdGVkIGJ1ZmZlciBzaXplCi0gIHVpbnQzMl90IGJ1ZmZlclNpemVfOwotCi0gIC8vIElzIHRoaXMgb2JqZWN0IHRoZSBvd25lciBvZiB0aGUgYnVmZmVyPwotICBib29sIG93bmVyXzsKLQotICAvLyBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIGNvbnN0cmN0b3JzLCBpbml0Q29tbW9uLCBhbmQgc3dhcCBpZgotICAvLyB5b3UgYWRkIG5ldyBtZW1iZXJzLgotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEJVRkZFUlRSQU5TUE9SVFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNDJmOGIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8ZXhjZXB0aW9uPgotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXZvaWQgVEZEVHJhbnNwb3J0OjpjbG9zZSgpIHsKLSAgaWYgKCFpc09wZW4oKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGludCBydiA9IDo6Y2xvc2UoZmRfKTsKLSAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgZmRfID0gLTE7Ci0gIC8vIEhhdmUgdG8gY2hlY2sgdW5jYXVnaHRfZXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIGRlc3RydWN0b3IuCi0gIGlmIChydiA8IDAgJiYgIXN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZEVHJhbnNwb3J0OjpjbG9zZSgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwotICB9Ci19Ci0KLXVpbnQzMl90IFRGRFRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBzc2l6ZV90IHJ2ID0gOjpyZWFkKGZkXywgYnVmLCBsZW4pOwotICBpZiAocnYgPCAwKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZEVHJhbnNwb3J0OjpyZWFkKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7Ci0gIH0KLSAgcmV0dXJuIHJ2OwotfQotCi12b2lkIFRGRFRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICBzc2l6ZV90IHJ2ID0gOjp3cml0ZShmZF8sIGJ1ZiwgbGVuKTsKLQotICAgIGlmIChydiA8IDApIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKLSAgICB9IGVsc2UgaWYgKHJ2ID09IDApIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURkRUcmFuc3BvcnQ6OndyaXRlKCkiKTsKLSAgICB9Ci0KLSAgICBidWYgKz0gcnY7Ci0gICAgbGVuIC09IHJ2OwotICB9Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTVkODIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9URkRUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlICJUVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAiVFNlcnZlclNvY2tldC5oIgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIERlYWQtc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGEgZmlsZSBkZXNjcmlwdG9yLgotICoKLSAqLwotY2xhc3MgVEZEVHJhbnNwb3J0IDogcHVibGljIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgZW51bSBDbG9zZVBvbGljeQotICB7IE5PX0NMT1NFX09OX0RFU1RST1kgPSAwCi0gICwgQ0xPU0VfT05fREVTVFJPWSA9IDEKLSAgfTsKLQotICBURkRUcmFuc3BvcnQoaW50IGZkLCBDbG9zZVBvbGljeSBjbG9zZV9wb2xpY3kgPSBOT19DTE9TRV9PTl9ERVNUUk9ZKQotICAgIDogZmRfKGZkKQotICAgICwgY2xvc2VfcG9saWN5XyhjbG9zZV9wb2xpY3kpCi0gIHt9Ci0KLSAgflRGRFRyYW5zcG9ydCgpIHsKLSAgICBpZiAoY2xvc2VfcG9saWN5XyA9PSBDTE9TRV9PTl9ERVNUUk9ZKSB7Ci0gICAgICBjbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gZmRfID49IDA7IH0KLQotICB2b2lkIG9wZW4oKSB7fQotCi0gIHZvaWQgY2xvc2UoKTsKLQotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLQotICB2b2lkIHNldEZEKGludCBmZCkgeyBmZF8gPSBmZDsgfQotICBpbnQgZ2V0RkQoKSB7IHJldHVybiBmZF87IH0KLQotIHByb3RlY3RlZDoKLSAgaW50IGZkXzsKLSAgQ2xvc2VQb2xpY3kgY2xvc2VfcG9saWN5XzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGRFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNDE2OTQuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJURmlsZVRyYW5zcG9ydC5oIgotI2luY2x1ZGUgIlRUcmFuc3BvcnRVdGlscy5oIgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBib29zdDo6c2NvcGVkX3B0cjsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0KLSNpZm5kZWYgSEFWRV9DTE9DS19HRVRUSU1FCi0KLS8qKgotICogRmFrZSBjbG9ja19nZXR0aW1lIGZvciBzeXN0ZW1zIGxpa2UgZGFyd2luCi0gKgotICovCi0jZGVmaW5lIENMT0NLX1JFQUxUSU1FIDAKLXN0YXRpYyBpbnQgY2xvY2tfZ2V0dGltZShpbnQgY2xrX2lkIC8qaWdub3JlZCovLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKSB7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKLQotICBpbnQgcnYgPSBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0gIGlmIChydiAhPSAwKSB7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdHAtPnR2X3NlYyA9IG5vdy50dl9zZWM7Ci0gIHRwLT50dl9uc2VjID0gbm93LnR2X3VzZWMgKiAxMDAwOwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1URmlsZVRyYW5zcG9ydDo6VEZpbGVUcmFuc3BvcnQoc3RyaW5nIHBhdGgsIGJvb2wgcmVhZE9ubHkpCi0gIDogcmVhZFN0YXRlXygpCi0gICwgcmVhZEJ1ZmZfKE5VTEwpCi0gICwgY3VycmVudEV2ZW50XyhOVUxMKQotICAsIHJlYWRCdWZmU2l6ZV8oREVGQVVMVF9SRUFEX0JVRkZfU0laRSkKLSAgLCByZWFkVGltZW91dF8oTk9fVEFJTF9SRUFEX1RJTUVPVVQpCi0gICwgY2h1bmtTaXplXyhERUZBVUxUX0NIVU5LX1NJWkUpCi0gICwgZXZlbnRCdWZmZXJTaXplXyhERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFKQotICAsIGZsdXNoTWF4VXNfKERFRkFVTFRfRkxVU0hfTUFYX1VTKQotICAsIGZsdXNoTWF4Qnl0ZXNfKERFRkFVTFRfRkxVU0hfTUFYX0JZVEVTKQotICAsIG1heEV2ZW50U2l6ZV8oREVGQVVMVF9NQVhfRVZFTlRfU0laRSkKLSAgLCBtYXhDb3JydXB0ZWRFdmVudHNfKERFRkFVTFRfTUFYX0NPUlJVUFRFRF9FVkVOVFMpCi0gICwgZW9mU2xlZXBUaW1lXyhERUZBVUxUX0VPRl9TTEVFUF9USU1FX1VTKQotICAsIGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXyhERUZBVUxUX0NPUlJVUFRFRF9TTEVFUF9USU1FX1VTKQotICAsIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKERFRkFVTFRfV1JJVEVSX1RIUkVBRF9TTEVFUF9USU1FX1VTKQotICAsIHdyaXRlclRocmVhZElkXygwKQotICAsIGRlcXVldWVCdWZmZXJfKE5VTEwpCi0gICwgZW5xdWV1ZUJ1ZmZlcl8oTlVMTCkKLSAgLCBjbG9zaW5nXyhmYWxzZSkKLSAgLCBmb3JjZUZsdXNoXyhmYWxzZSkKLSAgLCBmaWxlbmFtZV8ocGF0aCkKLSAgLCBmZF8oMCkKLSAgLCBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8oZmFsc2UpCi0gICwgb2Zmc2V0XygwKQotICAsIGxhc3RCYWRDaHVua18oMCkKLSAgLCBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXygwKQotICAsIHJlYWRPbmx5XyhyZWFkT25seSkKLXsKLSAgLy8gaW5pdGlhbGl6ZSBhbGwgdGhlIGNvbmRpdGlvbiB2YXJzL211dGV4ZXMKLSAgcHRocmVhZF9tdXRleF9pbml0KCZtdXRleF8sIE5VTEwpOwotICBwdGhyZWFkX2NvbmRfaW5pdCgmbm90RnVsbF8sIE5VTEwpOwotICBwdGhyZWFkX2NvbmRfaW5pdCgmbm90RW1wdHlfLCBOVUxMKTsKLSAgcHRocmVhZF9jb25kX2luaXQoJmZsdXNoZWRfLCBOVUxMKTsKLQotICBvcGVuTG9nRmlsZSgpOwotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpyZXNldE91dHB1dEZpbGUoaW50IGZkLCBzdHJpbmcgZmlsZW5hbWUsIGludDY0X3Qgb2Zmc2V0KSB7Ci0gIGZpbGVuYW1lXyA9IGZpbGVuYW1lOwotICBvZmZzZXRfID0gb2Zmc2V0OwotCi0gIC8vIGNoZWNrIGlmIGN1cnJlbnQgZmlsZSBpcyBzdGlsbCBvcGVuCi0gIGlmIChmZF8gPiAwKSB7Ci0gICAgLy8gZmx1c2ggYW55IGV2ZW50cyBpbiB0aGUgcXVldWUKLSAgICBmbHVzaCgpOwotICAgIEdsb2JhbE91dHB1dC5wcmludGYoImVycm9yLCBjdXJyZW50IGZpbGUgKCVzKSBub3QgY2xvc2VkIiwgZmlsZW5hbWVfLmNfc3RyKCkpOwotICAgIGlmICgtMSA9PSA6OmNsb3NlKGZkXykpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogcmVzZXRPdXRwdXRGaWxlKCkgOjpjbG9zZSgpICIsIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIGluIGZpbGUgY2xvc2UiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZmQpIHsKLSAgICBmZF8gPSBmZDsKLSAgfSBlbHNlIHsKLSAgICAvLyBvcGVuIGZpbGUgaWYgdGhlIGlucHV0IGZkIGlzIDAKLSAgICBvcGVuTG9nRmlsZSgpOwotICB9Ci19Ci0KLQotVEZpbGVUcmFuc3BvcnQ6On5URmlsZVRyYW5zcG9ydCgpIHsKLSAgLy8gZmx1c2ggdGhlIGJ1ZmZlciBpZiBhIHdyaXRlciB0aHJlYWQgaXMgYWN0aXZlCi0gIGlmICh3cml0ZXJUaHJlYWRJZF8gPiAwKSB7Ci0gICAgLy8gcmVkdWNlIHRoZSBmbHVzaCB0aW1lb3V0IHNvIHRoYXQgY2xvc2luZyBpcyBxdWlja2VyCi0gICAgc2V0Rmx1c2hNYXhVcygzMDAqMTAwMCk7Ci0KLSAgICAvLyBmbHVzaCBvdXRwdXQgYnVmZmVyCi0gICAgZmx1c2goKTsKLQotICAgIC8vIHNldCBzdGF0ZSB0byBjbG9zaW5nCi0gICAgY2xvc2luZ18gPSB0cnVlOwotCi0gICAgLy8gVE9ETzogbWFrZSBzdXJlIGV2ZW50IHF1ZXVlIGlzIGVtcHR5Ci0gICAgLy8gY3VycmVudGx5IG9ubHkgdGhlIHdyaXRlIGJ1ZmZlciBpcyBmbHVzaGVkCi0gICAgLy8gd2UgZG9udCBhY3R1YWxseSB3YWl0IHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eS4gVGhpcyBzaG91bGRuJ3QgYmUgYSBiaWcKLSAgICAvLyBkZWFsIGluIHRoZSBjb21tb24gY2FzZSBiZWNhdXNlIHdyaXRpbmcgaXMgcXVpY2sKLQotICAgIHB0aHJlYWRfam9pbih3cml0ZXJUaHJlYWRJZF8sIE5VTEwpOwotICAgIHdyaXRlclRocmVhZElkXyA9IDA7Ci0gIH0KLQotICBpZiAoZGVxdWV1ZUJ1ZmZlcl8pIHsKLSAgICBkZWxldGUgZGVxdWV1ZUJ1ZmZlcl87Ci0gICAgZGVxdWV1ZUJ1ZmZlcl8gPSBOVUxMOwotICB9Ci0KLSAgaWYgKGVucXVldWVCdWZmZXJfKSB7Ci0gICAgZGVsZXRlIGVucXVldWVCdWZmZXJfOwotICAgIGVucXVldWVCdWZmZXJfID0gTlVMTDsKLSAgfQotCi0gIGlmIChyZWFkQnVmZl8pIHsKLSAgICBkZWxldGVbXSByZWFkQnVmZl87Ci0gICAgcmVhZEJ1ZmZfID0gTlVMTDsKLSAgfQotCi0gIGlmIChjdXJyZW50RXZlbnRfKSB7Ci0gICAgZGVsZXRlIGN1cnJlbnRFdmVudF87Ci0gICAgY3VycmVudEV2ZW50XyA9IE5VTEw7Ci0gIH0KLQotICAvLyBjbG9zZSBsb2dmaWxlCi0gIGlmIChmZF8gPiAwKSB7Ci0gICAgaWYoLTEgPT0gOjpjbG9zZShmZF8pKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogflRGaWxlVHJhbnNwb3J0KCkgOjpjbG9zZSgpICIsIGVycm5vKTsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydDo6aW5pdEJ1ZmZlckFuZFdyaXRlVGhyZWFkKCkgewotICBpZiAoYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKSB7Ci0gICAgVF9FUlJPUigiVHJ5aW5nIHRvIGRvdWJsZS1pbml0IFRGaWxlVHJhbnNwb3J0Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHdyaXRlclRocmVhZElkXyA9PSAwKSB7Ci0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ3cml0ZXJUaHJlYWRJZF8sIE5VTEwsIHN0YXJ0V3JpdGVyVGhyZWFkLCAodm9pZCAqKXRoaXMpICE9IDApIHsKLSAgICAgIFRfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgd3JpdGVyIHRocmVhZCIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGRlcXVldWVCdWZmZXJfID0gbmV3IFRGaWxlVHJhbnNwb3J0QnVmZmVyKGV2ZW50QnVmZmVyU2l6ZV8pOwotICBlbnF1ZXVlQnVmZmVyXyA9IG5ldyBURmlsZVRyYW5zcG9ydEJ1ZmZlcihldmVudEJ1ZmZlclNpemVfKTsKLSAgYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKHJlYWRPbmx5XykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRGaWxlVHJhbnNwb3J0OiBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIGZpbGUgb3BlbmVkIHJlYWRvbmx5Iik7Ci0gIH0KLQotICBlbnF1ZXVlRXZlbnQoYnVmLCBsZW4sIGZhbHNlKTsKLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6ZW5xdWV1ZUV2ZW50KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgZXZlbnRMZW4sIGJvb2wgYmxvY2tVbnRpbEZsdXNoKSB7Ci0gIC8vIGNhbid0IGVucXVldWUgbW9yZSBldmVudHMgaWYgZmlsZSBpcyBnb2luZyB0byBjbG9zZQotICBpZiAoY2xvc2luZ18pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBtYWtlIHN1cmUgdGhhdCBldmVudCBzaXplIGlzIHZhbGlkCi0gIGlmICggKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAoZXZlbnRMZW4gPiBtYXhFdmVudFNpemVfKSApIHsKLSAgICBUX0VSUk9SKCJtc2cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemU6ICV1ID4gJXVcbiIsIGV2ZW50TGVuLCBtYXhFdmVudFNpemVfKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoZXZlbnRMZW4gPT0gMCkgewotICAgIFRfRVJST1IoImNhbm5vdCBlbnF1ZXVlIGFuIGVtcHR5IGV2ZW50Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZXZlbnRJbmZvKiB0b0VucXVldWUgPSBuZXcgZXZlbnRJbmZvKCk7Ci0gIHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXyA9ICh1aW50OF90ICopc3RkOjptYWxsb2MoKHNpemVvZih1aW50OF90KSAqIGV2ZW50TGVuKSArIDQpOwotICAvLyBmaXJzdCA0IGJ5dGVzIGlzIHRoZSBldmVudCBsZW5ndGgKLSAgbWVtY3B5KHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXywgKHZvaWQqKSgmZXZlbnRMZW4pLCA0KTsKLSAgLy8gYWN0dWFsIGV2ZW50IGNvbnRlbnRzCi0gIG1lbWNweSh0b0VucXVldWUtPmV2ZW50QnVmZl8gKyA0LCBidWYsIGV2ZW50TGVuKTsKLSAgdG9FbnF1ZXVlLT5ldmVudFNpemVfID0gZXZlbnRMZW4gKyA0OwotCi0gIC8vIGxvY2sgbXV0ZXgKLSAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOwotCi0gIC8vIG1ha2Ugc3VyZSB0aGF0IGVucXVldWUgYnVmZmVyIGlzIGluaXRpYWxpemVkIGFuZCB3cml0ZXIgdGhyZWFkIGlzIHJ1bm5pbmcKLSAgaWYgKCFidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8pIHsKLSAgICBpZiAoIWluaXRCdWZmZXJBbmRXcml0ZVRocmVhZCgpKSB7Ci0gICAgICBkZWxldGUgdG9FbnF1ZXVlOwotICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLy8gQ2FuJ3QgZW5xdWV1ZSB3aGlsZSBidWZmZXIgaXMgZnVsbAotICB3aGlsZSAoZW5xdWV1ZUJ1ZmZlcl8tPmlzRnVsbCgpKSB7Ci0gICAgcHRocmVhZF9jb25kX3dhaXQoJm5vdEZ1bGxfLCAmbXV0ZXhfKTsKLSAgfQotCi0gIC8vIGFkZCB0byB0aGUgYnVmZmVyCi0gIGlmICghZW5xdWV1ZUJ1ZmZlcl8tPmFkZEV2ZW50KHRvRW5xdWV1ZSkpIHsKLSAgICBkZWxldGUgdG9FbnF1ZXVlOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIHNpZ25hbCBhbnlib2R5IHdobydzIHdhaXRpbmcgZm9yIHRoZSBidWZmZXIgdG8gYmUgbm9uLWVtcHR5Ci0gIHB0aHJlYWRfY29uZF9zaWduYWwoJm5vdEVtcHR5Xyk7Ci0KLSAgaWYgKGJsb2NrVW50aWxGbHVzaCkgewotICAgIHB0aHJlYWRfY29uZF93YWl0KCZmbHVzaGVkXywgJm11dGV4Xyk7Ci0gIH0KLQotICAvLyB0aGlzIHJlYWxseSBzaG91bGQgYmUgYSBsb29wIHdoZXJlIGl0IG1ha2VzIHN1cmUgaXQgZ290IGZsdXNoZWQKLSAgLy8gYmVjYXVzZSBjb25kaXRpb24gdmFyaWFibGVzIGNhbiBnZXQgdHJpZ2dlcmVkIGJ5IHRoZSBvcyBmb3Igbm8gcmVhc29uCi0gIC8vIGl0IGlzIHByb2JhYmx5IGEgbm9uLWZhY3RvciBmb3IgdGhlIHRpbWUgYmVpbmcKLSAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci19Ci0KLWJvb2wgVEZpbGVUcmFuc3BvcnQ6OnN3YXBFdmVudEJ1ZmZlcnMoc3RydWN0IHRpbWVzcGVjKiBkZWFkbGluZSkgewotICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4Xyk7Ci0gIGlmIChkZWFkbGluZSAhPSBOVUxMKSB7Ci0gICAgLy8gaWYgd2Ugd2VyZSBoYW5kZWQgYSBkZWFkbGluZSB0aW1lIHN0cnVjdCwgZG8gYSB0aW1lZCB3YWl0Ci0gICAgcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbm90RW1wdHlfLCAmbXV0ZXhfLCBkZWFkbGluZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8ganVzdCB3YWl0IHVudGlsIHRoZSBidWZmZXIgZ2V0cyBhbiBpdGVtCi0gICAgcHRocmVhZF9jb25kX3dhaXQoJm5vdEVtcHR5XywgJm11dGV4Xyk7Ci0gIH0KLQotICBib29sIHN3YXBwZWQgPSBmYWxzZTsKLQotICAvLyBjb3VsZCBiZSBlbXB0eSBpZiB3ZSB0aW1lZCBvdXQKLSAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7Ci0gICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIgKnRlbXAgPSBlbnF1ZXVlQnVmZmVyXzsKLSAgICBlbnF1ZXVlQnVmZmVyXyA9IGRlcXVldWVCdWZmZXJfOwotICAgIGRlcXVldWVCdWZmZXJfID0gdGVtcDsKLQotICAgIHN3YXBwZWQgPSB0cnVlOwotICB9Ci0KLSAgLy8gdW5sb2NrIHRoZSBtdXRleCBhbmQgc2lnbmFsIGlmIHJlcXVpcmVkCi0gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleF8pOwotCi0gIGlmIChzd2FwcGVkKSB7Ci0gICAgcHRocmVhZF9jb25kX3NpZ25hbCgmbm90RnVsbF8pOwotICB9Ci0KLSAgcmV0dXJuIHN3YXBwZWQ7Ci19Ci0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6d3JpdGVyVGhyZWFkKCkgewotICBib29sIGhhc0lPRXJyb3IgPSBmYWxzZTsKLQotICAvLyBvcGVuIGZpbGUgaWYgaXQgaXMgbm90IG9wZW4KLSAgaWYoIWZkXykgewotICAgIHRyeSB7Ci0gICAgICBvcGVuTG9nRmlsZSgpOwotICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBvcGVuTG9nRmlsZSgpICIsIGVycm5vX2NvcHkpOwotICAgICAgZmRfID0gMDsKLSAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8vIHNldCB0aGUgb2Zmc2V0IHRvIHRoZSBjb3JyZWN0IHZhbHVlIChFT0YpCi0gIGlmICghaGFzSU9FcnJvcikgewotICAgIHRyeSB7Ci0gICAgICBzZWVrVG9FbmQoKTsKLSAgICAgIC8vIHRocm93IGF3YXkgYW55IHBhcnRpYWwgZXZlbnRzCi0gICAgICBvZmZzZXRfICs9IHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXzsKLSAgICAgIGZ0cnVuY2F0ZShmZF8sIG9mZnNldF8pOwotICAgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOwotICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBpbml0aWFsaXphdGlvbiAiLCBlcnJub19jb3B5KTsKLSAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8vIEZpZ3VyZSBvdXQgdGhlIG5leHQgdGltZSBieSB3aGljaCBhIGZsdXNoIG11c3QgdGFrZSBwbGFjZQotICBzdHJ1Y3QgdGltZXNwZWMgdHNfbmV4dF9mbHVzaDsKLSAgZ2V0TmV4dEZsdXNoVGltZSgmdHNfbmV4dF9mbHVzaCk7Ci0gIHVpbnQzMl90IHVuZmx1c2hlZCA9IDA7Ci0KLSAgd2hpbGUgKDEpIHsKLSAgICAvLyB0aGlzIHdpbGwgb25seSBiZSB0cnVlIHdoZW4gdGhlIGRlc3RydWN0b3IgaXMgYmVpbmcgaW52b2tlZAotICAgIGlmIChjbG9zaW5nXykgewotICAgICAgaWYgKGhhc0lPRXJyb3IpIHsKLSAgICAgICAgcHRocmVhZF9leGl0KE5VTEwpOwotICAgICAgfQotCi0gICAgICAvLyBUcnkgdG8gZW1wdHkgYnVmZmVycyBiZWZvcmUgZXhpdCAKLSAgICAgIGlmIChlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpICYmIGRlcXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKLSAgICAgICAgZnN5bmMoZmRfKTsKLSAgICAgICAgaWYgKC0xID09IDo6Y2xvc2UoZmRfKSkgewotICAgICAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIDo6Y2xvc2UoKSAiLCBlcnJub19jb3B5KTsKLSAgICAgICAgfQotICAgICAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN3YXBFdmVudEJ1ZmZlcnMoJnRzX25leHRfZmx1c2gpKSB7Ci0gICAgICBldmVudEluZm8qIG91dEV2ZW50OwotICAgICAgd2hpbGUgKE5VTEwgIT0gKG91dEV2ZW50ID0gZGVxdWV1ZUJ1ZmZlcl8tPmdldE5leHQoKSkpIHsKLSAgICAgICAgLy8gUmVtb3ZlIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlciBhbmQgd3JpdGUgaXQgb3V0IHRvIGRpc2suIElmIHRoZXJlIGlzIGFueSBJTyBlcnJvciwgZm9yIGluc3RhbmNlLAotICAgICAgICAvLyB0aGUgb3V0cHV0IGZpbGUgaXMgdW5tb3VudGVkIG9yIGRlbGV0ZWQsIHRoZW4gdGhpcyBldmVudCBpcyBkcm9wcGVkLiBIb3dldmVyLCB0aGUgd3JpdGVyIHRocmVhZAotICAgICAgICAvLyB3aWxsOiAoMSkgc2xlZXAgZm9yIGEgc2hvcnQgd2hpbGU7ICgyKSB0cnkgdG8gcmVvcGVuIHRoZSBmaWxlOyAoMykgaWYgc3VjY2Vzc2Z1bCB0aGVuIHN0YXJ0IHdyaXRpbmcKLSAgICAgICAgLy8gZnJvbSB0aGUgZW5kLgotCi0gICAgICAgIHdoaWxlIChoYXNJT0Vycm9yKSB7Ci0gICAgICAgICAgVF9FUlJPUigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICVkIG1pY3Jvc2Vjb25kcyBkdWUgdG8gSU8gZXJyb3JzIiwgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV8pOwotICAgICAgICAgIHVzbGVlcCh3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7Ci0gICAgICAgICAgaWYgKGNsb3NpbmdfKSB7Ci0gICAgICAgICAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICghZmRfKSB7Ci0gICAgICAgICAgICA6OmNsb3NlKGZkXyk7Ci0gICAgICAgICAgICBmZF8gPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgb3BlbkxvZ0ZpbGUoKTsKLSAgICAgICAgICAgIHNlZWtUb0VuZCgpOwotICAgICAgICAgICAgdW5mbHVzaGVkID0gMDsKLSAgICAgICAgICAgIGhhc0lPRXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgIFRfTE9HX09QRVIoIlRGaWxlVHJhbnNwb3J0OiBsb2cgZmlsZSAlcyByZW9wZW5lZCBieSB3cml0ZXIgdGhyZWFkIGR1cmluZyBlcnJvciByZWNvdmVyeSIsIGZpbGVuYW1lXy5jX3N0cigpKTsKLSAgICAgICAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgICAgICAgIFRfRVJST1IoIlRGaWxlVHJhbnNwb3J0OiB1bmFibGUgdG8gcmVvcGVuIGxvZyBmaWxlICVzIGR1cmluZyBlcnJvciByZWNvdmVyeSIsIGZpbGVuYW1lXy5jX3N0cigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzYW5pdHkgY2hlY2sgb24gZXZlbnQKLSAgICAgICAgaWYgKChtYXhFdmVudFNpemVfID4gMCkgJiYgKG91dEV2ZW50LT5ldmVudFNpemVfID4gbWF4RXZlbnRTaXplXykpIHsKLSAgICAgICAgICBUX0VSUk9SKCJtc2cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gbWF4IGV2ZW50IHNpemU6ICV1ID4gJXVcbiIsIG91dEV2ZW50LT5ldmVudFNpemVfLCBtYXhFdmVudFNpemVfKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGNodW5raW5nIGlzIHJlcXVpcmVkLCB0aGVuIG1ha2Ugc3VyZSB0aGF0IG1zZyBkb2VzIG5vdCBjcm9zcyBjaHVuayBib3VuZGFyeQotICAgICAgICBpZiAoKG91dEV2ZW50LT5ldmVudFNpemVfID4gMCkgJiYgKGNodW5rU2l6ZV8gIT0gMCkpIHsKLSAgICAgICAgICAvLyBldmVudCBzaXplIG11c3QgYmUgbGVzcyB0aGFuIGNodW5rIHNpemUKLSAgICAgICAgICBpZiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiBjaHVua1NpemVfKSB7Ci0gICAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogZXZlbnQgc2l6ZSgldSkgPiBjaHVuayBzaXplKCV1KTogc2tpcHBpbmcgZXZlbnQiLCBvdXRFdmVudC0+ZXZlbnRTaXplXywgY2h1bmtTaXplXyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpbnQ2NF90IGNodW5rMSA9IG9mZnNldF8vY2h1bmtTaXplXzsKLSAgICAgICAgICBpbnQ2NF90IGNodW5rMiA9IChvZmZzZXRfICsgb3V0RXZlbnQtPmV2ZW50U2l6ZV8gLSAxKS9jaHVua1NpemVfOwotCi0gICAgICAgICAgLy8gaWYgYWRkaW5nIHRoaXMgZXZlbnQgd2lsbCBjcm9zcyBhIGNodW5rIGJvdW5kYXJ5LCBwYWQgdGhlIGNodW5rIHdpdGggemVyb3MKLSAgICAgICAgICBpZiAoY2h1bmsxICE9IGNodW5rMikgewotICAgICAgICAgICAgLy8gcmVmZXRjaCB0aGUgb2Zmc2V0IHRvIGtlZXAgaW4gc3luYwotICAgICAgICAgICAgb2Zmc2V0XyA9IGxzZWVrKGZkXywgMCwgU0VFS19DVVIpOwotICAgICAgICAgICAgaW50MzJfdCBwYWRkaW5nID0gKGludDMyX3QpKChvZmZzZXRfIC8gY2h1bmtTaXplXyArIDEpICogY2h1bmtTaXplXyAtIG9mZnNldF8pOwotCi0gICAgICAgICAgICB1aW50OF90IHplcm9zW3BhZGRpbmddOwotICAgICAgICAgICAgYnplcm8oemVyb3MsIHBhZGRpbmcpOwotICAgICAgICAgICAgaWYgKC0xID09IDo6d3JpdGUoZmRfLCB6ZXJvcywgcGFkZGluZykpIHsKLSAgICAgICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIGVycm9yIHdoaWxlIHBhZGRpbmcgemVyb3MgIiwgZXJybm9fY29weSk7Ci0gICAgICAgICAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuZmx1c2hlZCArPSBwYWRkaW5nOwotICAgICAgICAgICAgb2Zmc2V0XyArPSBwYWRkaW5nOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdyaXRlIHRoZSBkZXF1ZXVlZCBldmVudCB0byB0aGUgZmlsZQotICAgICAgICBpZiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiAwKSB7Ci0gICAgICAgICAgaWYgKC0xID09IDo6d3JpdGUoZmRfLCBvdXRFdmVudC0+ZXZlbnRCdWZmXywgb3V0RXZlbnQtPmV2ZW50U2l6ZV8pKSB7Ci0gICAgICAgICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHdyaXRpbmcgZXZlbnQgIiwgZXJybm9fY29weSk7Ci0gICAgICAgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICB1bmZsdXNoZWQgKz0gb3V0RXZlbnQtPmV2ZW50U2l6ZV87Ci0gICAgICAgICAgb2Zmc2V0XyArPSBvdXRFdmVudC0+ZXZlbnRTaXplXzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZGVxdWV1ZUJ1ZmZlcl8tPnJlc2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKGhhc0lPRXJyb3IpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGJvb2wgZmx1c2hUaW1lRWxhcHNlZCA9IGZhbHNlOwotICAgIHN0cnVjdCB0aW1lc3BlYyBjdXJyZW50X3RpbWU7Ci0gICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cnJlbnRfdGltZSk7Ci0KLSAgICBpZiAoY3VycmVudF90aW1lLnR2X3NlYyA+IHRzX25leHRfZmx1c2gudHZfc2VjIHx8Ci0gICAgICAgIChjdXJyZW50X3RpbWUudHZfc2VjID09IHRzX25leHRfZmx1c2gudHZfc2VjICYmIGN1cnJlbnRfdGltZS50dl9uc2VjID4gdHNfbmV4dF9mbHVzaC50dl9uc2VjKSkgewotICAgICAgZmx1c2hUaW1lRWxhcHNlZCA9IHRydWU7Ci0gICAgICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKLSAgICB9Ci0KLSAgICAvLyBjb3VwbGUgb2YgY2FzZXMgZnJvbSB3aGljaCBhIGZsdXNoIGNvdWxkIGJlIHRyaWdnZXJlZAotICAgIGlmICgoZmx1c2hUaW1lRWxhcHNlZCAmJiB1bmZsdXNoZWQgPiAwKSB8fAotICAgICAgIHVuZmx1c2hlZCA+IGZsdXNoTWF4Qnl0ZXNfIHx8Ci0gICAgICAgZm9yY2VGbHVzaF8pIHsKLQotICAgICAgLy8gc3luYyAoZm9yY2UgZmx1c2gpIGZpbGUgdG8gZGlzawotICAgICAgZnN5bmMoZmRfKTsKLSAgICAgIHVuZmx1c2hlZCA9IDA7Ci0KLSAgICAgIC8vIG5vdGlmeSBhbnlib2R5IHdhaXRpbmcgZm9yIGZsdXNoIGNvbXBsZXRpb24KLSAgICAgIGZvcmNlRmx1c2hfID0gZmFsc2U7Ci0gICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZmbHVzaGVkXyk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OmZsdXNoKCkgewotICAvLyBmaWxlIG11c3QgYmUgb3BlbiBmb3Igd3JpdGluZyBmb3IgYW55IGZsdXNoaW5nIHRvIHRha2UgcGxhY2UKLSAgaWYgKHdyaXRlclRocmVhZElkXyA8PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIHdhaXQgZm9yIGZsdXNoIHRvIHRha2UgcGxhY2UKLSAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOwotCi0gIGZvcmNlRmx1c2hfID0gdHJ1ZTsKLQotICB3aGlsZSAoZm9yY2VGbHVzaF8pIHsKLSAgICBwdGhyZWFkX2NvbmRfd2FpdCgmZmx1c2hlZF8sICZtdXRleF8pOwotICB9Ci0KLSAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7Ci19Ci0KLQotdWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgaGF2ZSA9IDA7Ci0gIHVpbnQzMl90IGdldCA9IDA7Ci0KLSAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKLSAgICBnZXQgPSByZWFkKGJ1ZitoYXZlLCBsZW4taGF2ZSk7Ci0gICAgaWYgKGdldCA8PSAwKSB7Ci0gICAgICB0aHJvdyBURU9GRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGhhdmUgKz0gZ2V0OwotICB9Ci0KLSAgcmV0dXJuIGhhdmU7Ci19Ci0KLWJvb2wgVEZpbGVUcmFuc3BvcnQ6OnBlZWsoKSB7Ci0gIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFuIGV2ZW50IHJlYWR5IHRvIGJlIHJlYWQKLSAgaWYgKCFjdXJyZW50RXZlbnRfKSB7Ci0gICAgY3VycmVudEV2ZW50XyA9IHJlYWRFdmVudCgpOwotICB9Ci0KLSAgLy8gZGlkIG5vdCBtYW5hZ2UgdG8gcmVhZCBhbiBldmVudCBmcm9tIHRoZSBmaWxlLiBUaGlzIGNvdWxkIGhhdmUgaGFwcGVuZWQKLSAgLy8gaWYgdGhlIHRpbWVvdXQgZXhwaXJlZCBvciB0aGVyZSB3YXMgc29tZSBvdGhlciBlcnJvcgotICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byByZWFkCi0gIHJldHVybiAoY3VycmVudEV2ZW50Xy0+ZXZlbnRTaXplXyAtIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18pID4gMDsKLX0KLQotdWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgLy8gY2hlY2sgaWYgdGhlcmUgYW4gZXZlbnQgaXMgcmVhZHkgdG8gYmUgcmVhZAotICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKLSAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7Ci0gIH0KLQotICAvLyBkaWQgbm90IG1hbmFnZSB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGZpbGUuIFRoaXMgY291bGQgaGF2ZSBoYXBwZW5lZAotICAvLyBpZiB0aGUgdGltZW91dCBleHBpcmVkIG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yCi0gIGlmICghY3VycmVudEV2ZW50XykgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gcmVhZCBhcyBtdWNoIG9mIHRoZSBjdXJyZW50IGV2ZW50IGFzIHBvc3NpYmxlCi0gIGludDMyX3QgcmVtYWluaW5nID0gY3VycmVudEV2ZW50Xy0+ZXZlbnRTaXplXyAtIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc187Ci0gIGlmIChyZW1haW5pbmcgPD0gKGludDMyX3QpbGVuKSB7Ci0gICAgLy8gY29weSBvdmVyIGFueXRoaW5nIHRoYXRzIHJlbWFpbmluZwotICAgIGlmIChyZW1haW5pbmcgPiAwKSB7Ci0gICAgICBtZW1jcHkoYnVmLAotICAgICAgICAgICAgIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZl8gKyBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfLAotICAgICAgICAgICAgIHJlbWFpbmluZyk7Ci0gICAgfQotICAgIGRlbGV0ZShjdXJyZW50RXZlbnRfKTsKLSAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKLSAgICByZXR1cm4gcmVtYWluaW5nOwotICB9Ci0KLSAgLy8gcmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlCi0gIG1lbWNweShidWYsIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZl8gKyBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfLCBsZW4pOwotICBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfICs9IGxlbjsKLSAgcmV0dXJuIGxlbjsKLX0KLQotLy8gbm90ZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgcmV0dXJuZWQgZXZlbnRzCi1ldmVudEluZm8qIFRGaWxlVHJhbnNwb3J0OjpyZWFkRXZlbnQoKSB7Ci0gIGludCByZWFkVHJpZXMgPSAwOwotCi0gIGlmICghcmVhZEJ1ZmZfKSB7Ci0gICAgcmVhZEJ1ZmZfID0gbmV3IHVpbnQ4X3RbcmVhZEJ1ZmZTaXplX107Ci0gIH0KLQotICB3aGlsZSAoMSkgewotICAgIC8vIHJlYWQgZnJvbSB0aGUgZmlsZSBpZiByZWFkIGJ1ZmZlciBpcyBleGhhdXN0ZWQKLSAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJQdHJfID09IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgewotICAgICAgLy8gYWR2YW5jZSB0aGUgb2Zmc2V0IHBvaW50ZXIKLSAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5idWZmZXJMZW5fOwotICAgICAgcmVhZFN0YXRlXy5idWZmZXJMZW5fID0gOjpyZWFkKGZkXywgcmVhZEJ1ZmZfLCByZWFkQnVmZlNpemVfKTsKLSAgICAgIC8vICAgICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKLSAgICAgIC8vICAgICAgICAgVF9ERUJVR19MKDEsICJBbW91bnQgcmVhZDogJXUgKG9mZnNldDogJWx1KSIsIHJlYWRTdGF0ZV8uYnVmZmVyTGVuXywgb2Zmc2V0Xyk7Ci0gICAgICAvLyAgICAgICB9Ci0gICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPSAwOwotICAgICAgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfID0gMDsKLQotICAgICAgLy8gcmVhZCBlcnJvcgotICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9PSAtMSkgewotICAgICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7Ci0gICAgICAgIEdsb2JhbE91dHB1dCgiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIik7Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRGaWxlVHJhbnNwb3J0OiBlcnJvciB3aGlsZSByZWFkaW5nIGZyb20gZmlsZSIpOwotICAgICAgfSBlbHNlIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPT0gMCkgeyAgLy8gRU9GCi0gICAgICAgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IGlmIHRoZXJlIGlzIG5vIHRpbWVvdXQKLSAgICAgICAgaWYgKHJlYWRUaW1lb3V0XyA9PSBUQUlMX1JFQURfVElNRU9VVCkgewotICAgICAgICAgIHVzbGVlcChlb2ZTbGVlcFRpbWVfKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPT0gTk9fVEFJTF9SRUFEX1RJTUVPVVQpIHsKLSAgICAgICAgICAvLyByZXNldCBzdGF0ZQotICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZSgwKTsKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPiAwKSB7Ci0gICAgICAgICAgLy8gdGltZW91dCBhbHJlYWR5IGV4cGlyZWQgb25jZQotICAgICAgICAgIGlmIChyZWFkVHJpZXMgPiAwKSB7Ci0gICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUoMCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXNsZWVwKHJlYWRUaW1lb3V0XyAqIDEwMDApOwotICAgICAgICAgICAgcmVhZFRyaWVzKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZWFkVHJpZXMgPSAwOwotCi0gICAgLy8gYXR0ZW1wdCB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlcgotICAgIHdoaWxlKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyA8IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgewotICAgICAgaWYgKHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfKSB7Ci0gICAgICAgIGlmKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18gPT0gMCkgewotICAgICAgICAgIGlmICggKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pL2NodW5rU2l6ZV8gIT0KLSAgICAgICAgICAgICAgICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArIDMpL2NodW5rU2l6ZV8pKSB7Ci0gICAgICAgICAgICAvLyBza2lwIG9uZSBieXRlIHRvd2FyZHMgY2h1bmsgYm91bmRhcnkKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgVF9ERUJVR19MKDEsICJTa2lwcGluZyBhIGJ5dGUiKTsKLSAgICAgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXysrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmX1tyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfKytdID0KLSAgICAgICAgICByZWFkQnVmZl9bcmVhZFN0YXRlXy5idWZmZXJQdHJfKytdOwotICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSA0KSB7Ci0gICAgICAgICAgLy8gMCBsZW5ndGggZXZlbnQgaW5kaWNhdGVzIHBhZGRpbmcKLSAgICAgICAgICBpZiAoKigodWludDMyX3QgKikocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmXykpID09IDApIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgVF9ERUJVR19MKDEsICJHb3QgcGFkZGluZyIpOwotICAgICAgICAgICAgcmVhZFN0YXRlXy5yZXNldFN0YXRlKHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZ290IGEgdmFsaWQgZXZlbnQKLSAgICAgICAgICByZWFkU3RhdGVfLnJlYWRpbmdTaXplXyA9IGZhbHNlOwotICAgICAgICAgIGlmIChyZWFkU3RhdGVfLmV2ZW50XykgewotICAgICAgICAgICAgZGVsZXRlKHJlYWRTdGF0ZV8uZXZlbnRfKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBuZXcgZXZlbnRJbmZvKCk7Ci0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPSAqKCh1aW50MzJfdCAqKShyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfKSk7Ci0KLSAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaXMgY29ycnVwdGVkIGFuZCBwZXJmb3JtIHJlY292ZXJ5IGlmIHJlcXVpcmVkCi0gICAgICAgICAgaWYgKGlzRXZlbnRDb3JydXB0ZWQoKSkgewotICAgICAgICAgICAgcGVyZm9ybVJlY292ZXJ5KCk7Ci0gICAgICAgICAgICAvLyBzdGFydCBmcm9tIHRoZSB0b3AKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXykgewotICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZfID0gbmV3IHVpbnQ4X3RbcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV9dOwotICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfID0gMDsKLSAgICAgICAgfQotICAgICAgICAvLyB0YWtlIGVpdGhlciB0aGUgZW50aXJlIGV2ZW50IG9yIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgotICAgICAgICBpbnQgcmVjbGFpbUJ1ZmZlciA9IG1pbigodWludDMyX3QpKHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyAtIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18pOwotCi0gICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIHJlYWQgYnVmZmVyIGludG8gZXZlbnQgYnVmZmVyCi0gICAgICAgIG1lbWNweShyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfLAotICAgICAgICAgICAgICAgcmVhZEJ1ZmZfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfLAotICAgICAgICAgICAgICAgcmVjbGFpbUJ1ZmZlcik7Ci0KLSAgICAgICAgLy8gaW5jcmVtZW50IHBvc2l0aW9uIHB0cnMKLSAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gKz0gcmVjbGFpbUJ1ZmZlcjsKLSAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQdHJfICs9IHJlY2xhaW1CdWZmZXI7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGV2ZW50IGhhcyBiZWVuIHJlYWQgaW4gZnVsbAotICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18gPT0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8pIHsKLSAgICAgICAgICAvLyBzZXQgdGhlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgY3VycmVudCBldmVudAotICAgICAgICAgIGV2ZW50SW5mbyogY29tcGxldGVFdmVudCA9IHJlYWRTdGF0ZV8uZXZlbnRfOwotICAgICAgICAgIGNvbXBsZXRlRXZlbnQtPmV2ZW50QnVmZlBvc18gPSAwOwotCi0gICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8gPSBOVUxMOwotICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmJ1ZmZlclB0cl8pOwotCi0gICAgICAgICAgLy8gZXhpdCBjcml0ZXJpYQotICAgICAgICAgIHJldHVybiBjb21wbGV0ZUV2ZW50OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydDo6aXNFdmVudENvcnJ1cHRlZCgpIHsKLSAgLy8gYW4gZXJyb3IgaXMgdHJpZ2dlcmVkIGlmOgotICBpZiAoIChtYXhFdmVudFNpemVfID4gMCkgJiYgIChyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyA+IG1heEV2ZW50U2l6ZV8pKSB7Ci0gICAgLy8gMS4gRXZlbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiB1c2VyLXNwZWZpY2llZCBtYXgtZXZlbnQgc2l6ZQotICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgc2l6ZSgldSkgZ3JlYXRlciB0aGFuIG1heCBldmVudCBzaXplICgldSkiLAotICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8sIG1heEV2ZW50U2l6ZV8pOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID4gY2h1bmtTaXplXykgewotICAgIC8vIDIuIEV2ZW50IHNpemUgaXMgbGFyZ2VyIHRoYW4gY2h1bmsgc2l6ZQotICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgc2l6ZSgldSkgZ3JlYXRlciB0aGFuIGNodW5rIHNpemUgKCV1KSIsCi0gICAgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywgY2h1bmtTaXplXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiggKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfIC0gNCkvY2h1bmtTaXplXykgIT0KLSAgICAgICAgICAgICAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIDEpL2NodW5rU2l6ZV8pICkgewotICAgIC8vIDMuIHNpemUgaW5kaWNhdGVzIHRoYXQgZXZlbnQgY3Jvc3NlcyBjaHVuayBib3VuZGFyeQotICAgIFRfRVJST1IoIlJlYWQgY29ycnVwdCBldmVudC4gRXZlbnQgY3Jvc3NlcyBjaHVuayBib3VuZGFyeS4gRXZlbnQgc2l6ZToldSAgT2Zmc2V0OiVsZCIsCi0gICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXywgb2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArIDQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpwZXJmb3JtUmVjb3ZlcnkoKSB7Ci0gIC8vIHBlcmZvcm0gc29tZSBraWNrYXNzIHJlY292ZXJ5Ci0gIHVpbnQzMl90IGN1ckNodW5rID0gZ2V0Q3VyQ2h1bmsoKTsKLSAgaWYgKGxhc3RCYWRDaHVua18gPT0gY3VyQ2h1bmspIHsKLSAgICBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXysrOwotICB9IGVsc2UgewotICAgIGxhc3RCYWRDaHVua18gPSBjdXJDaHVuazsKLSAgICBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXyA9IDE7Ci0gIH0KLQotICBpZiAobnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18gPCBtYXhDb3JydXB0ZWRFdmVudHNfKSB7Ci0gICAgLy8gbWF5YmUgdGhlcmUgd2FzIGFuIGVycm9yIGluIHJlYWRpbmcgdGhlIGZpbGUgZnJvbSBkaXNrCi0gICAgLy8gc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIGNodW5rIGFuZCB0cnkgYWdhaW4KLSAgICBzZWVrVG9DaHVuayhjdXJDaHVuayk7Ci0gIH0gZWxzZSB7Ci0KLSAgICAvLyBqdXN0IHNraXAgYWhlYWQgdG8gdGhlIG5leHQgY2h1bmsgaWYgd2Ugbm90IGFscmVhZHkgYXQgdGhlIGxhc3QgY2h1bmsKLSAgICBpZiAoY3VyQ2h1bmsgIT0gKGdldE51bUNodW5rcygpIC0gMSkpIHsKLSAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rICsgMSk7Ci0gICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPT0gVEFJTF9SRUFEX1RJTUVPVVQpIHsKLSAgICAgIC8vIGlmIHRhaWxpbmcgdGhlIGZpbGUsIHdhaXQgdW50aWwgdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8gc3RhcnQKLSAgICAgIC8vIHRoZSBuZXh0IGNodW5rCi0gICAgICB3aGlsZShjdXJDaHVuayA9PSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgewotICAgICAgICB1c2xlZXAoREVGQVVMVF9DT1JSVVBURURfU0xFRVBfVElNRV9VUyk7Ci0gICAgICB9Ci0gICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayArIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBwcmV0dHkgaG9zZWQgYXQgdGhpcyBzdGFnZSwgcmV3aW5kIHRoZSBmaWxlIGJhY2sgdG8gdGhlIGxhc3Qgc3VjY2Vzc2Z1bAotICAgICAgLy8gcG9pbnQgYW5kIHB1bnQgb24gdGhlIGVycm9yCi0gICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKTsKLSAgICAgIGN1cnJlbnRFdmVudF8gPSBOVUxMOwotICAgICAgY2hhciBlcnJvck1zZ1sxMDI0XTsKLSAgICAgIHNwcmludGYoZXJyb3JNc2csICJURmlsZVRyYW5zcG9ydDogbG9nIGZpbGUgY29ycnVwdGVkIGF0IG9mZnNldDogJWx1IiwKLSAgICAgICAgICAgICAgb2Zmc2V0XyArIHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXyk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyb3JNc2cpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihlcnJvck1zZyk7Ci0gICAgfQotICB9Ci0KLX0KLQotdm9pZCBURmlsZVRyYW5zcG9ydDo6c2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuaykgewotICBpZiAoZmRfIDw9IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGaWxlIG5vdCBvcGVuIik7Ci0gIH0KLQotICBpbnQzMl90IG51bUNodW5rcyA9IGdldE51bUNodW5rcygpOwotCi0gIC8vIGZpbGUgaXMgZW1wdHksIHNlZWtpbmcgdG8gY2h1bmsgaXMgcG9pbnRsZXNzCi0gIGlmIChudW1DaHVua3MgPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIG5lZ2F0aXZlIGluZGljYXRlcyByZXZlcnNlIHNlZWsgKGZyb20gdGhlIGVuZCkKLSAgaWYgKGNodW5rIDwgMCkgewotICAgIGNodW5rICs9IG51bUNodW5rczsKLSAgfQotCi0gIC8vIHRvbyBsYXJnZSBhIHZhbHVlIGZvciByZXZlcnNlIHNlZWssIGp1c3Qgc2VlayB0byBiZWdpbm5pbmcKLSAgaWYgKGNodW5rIDwgMCkgewotICAgIFRfREVCVUcoIkluY29ycmVjdCB2YWx1ZSBmb3IgcmV2ZXJzZSBzZWVrLiBTZWVraW5nIHRvIGJlZ2lubmluZy4uLiIsIGNodW5rKQotICAgIGNodW5rID0gMDsKLSAgfQotCi0gIC8vIGNhbm5vdCBzZWVrIHBhc3QgRU9GCi0gIGJvb2wgc2Vla1RvRW5kID0gZmFsc2U7Ci0gIHVpbnQzMl90IG1pbkVuZE9mZnNldCA9IDA7Ci0gIGlmIChjaHVuayA+PSBudW1DaHVua3MpIHsKLSAgICBUX0RFQlVHKCJUcnlpbmcgdG8gc2VlayBwYXN0IEVPRi4gU2Vla2luZyB0byBFT0YgaW5zdGVhZC4uLiIpOwotICAgIHNlZWtUb0VuZCA9IHRydWU7Ci0gICAgY2h1bmsgPSBudW1DaHVua3MgLSAxOwotICAgIC8vIHRoaXMgaXMgdGhlIG1pbiBvZmZzZXQgdG8gcHJvY2VzcyBldmVudHMgdGlsbAotICAgIG1pbkVuZE9mZnNldCA9IGxzZWVrKGZkXywgMCwgU0VFS19FTkQpOwotICB9Ci0KLSAgb2ZmX3QgbmV3T2Zmc2V0ID0gb2ZmX3QoY2h1bmspICogY2h1bmtTaXplXzsKLSAgb2Zmc2V0XyA9IGxzZWVrKGZkXywgbmV3T2Zmc2V0LCBTRUVLX1NFVCk7Ci0gIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKLSAgY3VycmVudEV2ZW50XyA9IE5VTEw7Ci0gIGlmIChvZmZzZXRfID09IC0xKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJURmlsZVRyYW5zcG9ydDogbHNlZWsgZXJyb3IgaW4gc2Vla1RvQ2h1bmsiKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJURmlsZVRyYW5zcG9ydDogbHNlZWsgZXJyb3IgaW4gc2Vla1RvQ2h1bmsiKTsKLSAgfQotCi0gIC8vIHNlZWsgdG8gRU9GIGlmIHVzZXIgd2FudGVkIHRvIGdvIHRvIGxhc3QgY2h1bmsKLSAgaWYgKHNlZWtUb0VuZCkgewotICAgIHVpbnQzMl90IG9sZFJlYWRUaW1lb3V0ID0gZ2V0UmVhZFRpbWVvdXQoKTsKLSAgICBzZXRSZWFkVGltZW91dChOT19UQUlMX1JFQURfVElNRU9VVCk7Ci0gICAgLy8ga2VlcCBvbiByZWFkaW5nIHVudGkgdGhlIGxhc3QgZXZlbnQgYXQgcG9pbnQgb2Ygc2Vla0NodW5rIGNhbGwKLSAgICBib29zdDo6c2NvcGVkX3B0cjxldmVudEluZm8+IGV2ZW50OwotICAgIHdoaWxlICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXykgPCBtaW5FbmRPZmZzZXQpIHsKLSAgICAgIGV2ZW50LnJlc2V0KHJlYWRFdmVudCgpKTsKLSAgICAgIGlmIChldmVudC5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBzZXRSZWFkVGltZW91dChvbGRSZWFkVGltZW91dCk7Ci0gIH0KLQotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpzZWVrVG9FbmQoKSB7Ci0gIHNlZWtUb0NodW5rKGdldE51bUNodW5rcygpKTsKLX0KLQotdWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OmdldE51bUNodW5rcygpIHsKLSAgaWYgKGZkXyA8PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzdHJ1Y3Qgc3RhdCBmX2luZm87Ci0gIGludCBydiA9IGZzdGF0KGZkXywgJmZfaW5mbyk7Ci0KLSAgaWYgKHJ2IDwgMCkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSAoZnN0YXQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgaWYgKGZfaW5mby5zdF9zaXplID4gMCkgewotICAgIHJldHVybiAoKGZfaW5mby5zdF9zaXplKS9jaHVua1NpemVfKSArIDE7Ci0gIH0KLQotICAvLyBlbXB0eSBmaWxlIGhhcyBubyBjaHVua3MKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFRGaWxlVHJhbnNwb3J0OjpnZXRDdXJDaHVuaygpIHsKLSAgcmV0dXJuIG9mZnNldF8vY2h1bmtTaXplXzsKLX0KLQotLy8gVXRpbGl0eSBGdW5jdGlvbnMKLXZvaWQgVEZpbGVUcmFuc3BvcnQ6Om9wZW5Mb2dGaWxlKCkgewotICBtb2RlX3QgbW9kZSA9IHJlYWRPbmx5XyA/IFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCA6IFNfSVJVU1IgfCBTX0lXVVNSfCBTX0lSR1JQIHwgU19JUk9USDsKLSAgaW50IGZsYWdzID0gcmVhZE9ubHlfID8gT19SRE9OTFkgOiBPX1JEV1IgfCBPX0NSRUFUIHwgT19BUFBFTkQ7Ci0gIGZkXyA9IDo6b3BlbihmaWxlbmFtZV8uY19zdHIoKSwgZmxhZ3MsIG1vZGUpOwotICBvZmZzZXRfID0gMDsKLQotICAvLyBtYWtlIHN1cmUgb3BlbiBjYWxsIHdhcyBzdWNjZXNzZnVsCi0gIGlmKGZkXyA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IG9wZW5Mb2dGaWxlKCkgOjpvcGVuKCkgZmlsZTogIiArIGZpbGVuYW1lXywgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgZmlsZW5hbWVfLCBlcnJub19jb3B5KTsKLSAgfQotCi19Ci0KLXZvaWQgVEZpbGVUcmFuc3BvcnQ6OmdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWVzcGVjKiB0c19uZXh0X2ZsdXNoKSB7Ci0gIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsIHRzX25leHRfZmx1c2gpOwotICB0c19uZXh0X2ZsdXNoLT50dl9uc2VjICs9IChmbHVzaE1heFVzXyAlIDEwMDAwMDApICogMTAwMDsKLSAgaWYgKHRzX25leHRfZmx1c2gtPnR2X25zZWMgPiAxMDAwMDAwMDAwKSB7Ci0gICAgdHNfbmV4dF9mbHVzaC0+dHZfbnNlYyAtPSAxMDAwMDAwMDAwOwotICAgIHRzX25leHRfZmx1c2gtPnR2X3NlYyArPSAxOwotICB9Ci0gIHRzX25leHRfZmx1c2gtPnR2X3NlYyArPSBmbHVzaE1heFVzXyAvIDEwMDAwMDA7Ci19Ci0KLVRGaWxlVHJhbnNwb3J0QnVmZmVyOjpURmlsZVRyYW5zcG9ydEJ1ZmZlcih1aW50MzJfdCBzaXplKQotICA6IGJ1ZmZlck1vZGVfKFdSSVRFKQotICAsIHdyaXRlUG9pbnRfKDApCi0gICwgcmVhZFBvaW50XygwKQotICAsIHNpemVfKHNpemUpCi17Ci0gIGJ1ZmZlcl8gPSBuZXcgZXZlbnRJbmZvKltzaXplXTsKLX0KLQotVEZpbGVUcmFuc3BvcnRCdWZmZXI6On5URmlsZVRyYW5zcG9ydEJ1ZmZlcigpIHsKLSAgaWYgKGJ1ZmZlcl8pIHsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgd3JpdGVQb2ludF87IGkrKykgewotICAgICAgZGVsZXRlIGJ1ZmZlcl9baV07Ci0gICAgfQotICAgIGRlbGV0ZVtdIGJ1ZmZlcl87Ci0gICAgYnVmZmVyXyA9IE5VTEw7Ci0gIH0KLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6YWRkRXZlbnQoZXZlbnRJbmZvICpldmVudCkgewotICBpZiAoYnVmZmVyTW9kZV8gPT0gUkVBRCkgewotICAgIEdsb2JhbE91dHB1dCgiVHJ5aW5nIHRvIHdyaXRlIHRvIGEgYnVmZmVyIGluIHJlYWQgbW9kZSIpOwotICB9Ci0gIGlmICh3cml0ZVBvaW50XyA8IHNpemVfKSB7Ci0gICAgYnVmZmVyX1t3cml0ZVBvaW50XysrXSA9IGV2ZW50OwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIC8vIGJ1ZmZlciBpcyBmdWxsCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWV2ZW50SW5mbyogVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmdldE5leHQoKSB7Ci0gIGlmIChidWZmZXJNb2RlXyA9PSBXUklURSkgewotICAgIGJ1ZmZlck1vZGVfID0gUkVBRDsKLSAgfQotICBpZiAocmVhZFBvaW50XyA8IHdyaXRlUG9pbnRfKSB7Ci0gICAgcmV0dXJuIGJ1ZmZlcl9bcmVhZFBvaW50XysrXTsKLSAgfSBlbHNlIHsKLSAgICAvLyBubyBtb3JlIGVudHJpZXMKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi12b2lkIFRGaWxlVHJhbnNwb3J0QnVmZmVyOjpyZXNldCgpIHsKLSAgaWYgKGJ1ZmZlck1vZGVfID09IFdSSVRFIHx8IHdyaXRlUG9pbnRfID4gcmVhZFBvaW50XykgewotICAgIFRfREVCVUcoIlJlc2V0dGluZyBhIGJ1ZmZlciB3aXRoIHVucmVhZCBlbnRyaWVzIik7Ci0gIH0KLSAgLy8gQ2xlYW4gdXAgdGhlIG9sZCBlbnRyaWVzCi0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZVBvaW50XzsgaSsrKSB7Ci0gICAgZGVsZXRlIGJ1ZmZlcl9baV07Ci0gIH0KLSAgYnVmZmVyTW9kZV8gPSBXUklURTsKLSAgd3JpdGVQb2ludF8gPSAwOwotICByZWFkUG9pbnRfID0gMDsKLX0KLQotYm9vbCBURmlsZVRyYW5zcG9ydEJ1ZmZlcjo6aXNGdWxsKCkgewotICByZXR1cm4gd3JpdGVQb2ludF8gPT0gc2l6ZV87Ci19Ci0KLWJvb2wgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmlzRW1wdHkoKSB7Ci0gIHJldHVybiB3cml0ZVBvaW50XyA9PSAwOwotfQotCi1URmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOgotICBwcm9jZXNzb3JfKHByb2Nlc3NvciksCi0gIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAotICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCkgewotCi0gIC8vIGRlZmF1bHQgdGhlIG91dHB1dCB0cmFuc3BvcnQgdG8gYSBudWxsIHRyYW5zcG9ydCAoY29tbW9uIGNhc2UpCi0gIG91dHB1dFRyYW5zcG9ydF8gPSBzaGFyZWRfcHRyPFROdWxsVHJhbnNwb3J0PihuZXcgVE51bGxUcmFuc3BvcnQoKSk7Ci19Ci0KLVRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KToKLSAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAotICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSksCi0gIGlucHV0VHJhbnNwb3J0XyhpbnB1dFRyYW5zcG9ydCkgewotCi0gIC8vIGRlZmF1bHQgdGhlIG91dHB1dCB0cmFuc3BvcnQgdG8gYSBudWxsIHRyYW5zcG9ydCAoY29tbW9uIGNhc2UpCi0gIG91dHB1dFRyYW5zcG9ydF8gPSBzaGFyZWRfcHRyPFROdWxsVHJhbnNwb3J0PihuZXcgVE51bGxUcmFuc3BvcnQoKSk7Ci19Ci0KLVRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCk6Ci0gIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSwKLSAgb3V0cHV0VHJhbnNwb3J0XyhvdXRwdXRUcmFuc3BvcnQpIHt9OwotCi12b2lkIFRGaWxlUHJvY2Vzc29yOjpwcm9jZXNzKHVpbnQzMl90IG51bUV2ZW50cywgYm9vbCB0YWlsKSB7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydF8pOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnRfKTsKLQotICAvLyBzZXQgdGhlIHJlYWQgdGltZW91dCB0byAwIGlmIHRhaWxpbmcgaXMgcmVxdWlyZWQKLSAgaW50MzJfdCBvbGRSZWFkVGltZW91dCA9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0UmVhZFRpbWVvdXQoKTsKLSAgaWYgKHRhaWwpIHsKLSAgICAvLyBzYXZlIG9sZCByZWFkIHRpbWVvdXQgc28gaXQgY2FuIGJlIHJlc3RvcmVkCi0gICAgaW5wdXRUcmFuc3BvcnRfLT5zZXRSZWFkVGltZW91dChURmlsZVRyYW5zcG9ydDo6VEFJTF9SRUFEX1RJTUVPVVQpOwotICB9Ci0KLSAgdWludDMyX3QgbnVtUHJvY2Vzc2VkID0gMDsKLSAgd2hpbGUoMSkgewotICAgIC8vIGJhZCBmb3JtIHRvIHVzZSBleGNlcHRpb25zIGZvciBmbG93IGNvbnRyb2wgYnV0IHRoZXJlIGlzIHJlYWxseQotICAgIC8vIG5vIG90aGVyIHdheSBhcm91bmQgaXQKLSAgICB0cnkgewotICAgICAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7Ci0gICAgICBudW1Qcm9jZXNzZWQrKzsKLSAgICAgIGlmICggKG51bUV2ZW50cyA+IDApICYmIChudW1Qcm9jZXNzZWQgPT0gbnVtRXZlbnRzKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVEVPRkV4Y2VwdGlvbiYgdGVvZikgewotICAgICAgaWYgKCF0YWlsKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJnRlKSB7Ci0gICAgICBjZXJyIDw8IHRlLndoYXQoKSA8PCBlbmRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gcmVzdG9yZSBvbGQgcmVhZCB0aW1lb3V0Ci0gIGlmICh0YWlsKSB7Ci0gICAgaW5wdXRUcmFuc3BvcnRfLT5zZXRSZWFkVGltZW91dChvbGRSZWFkVGltZW91dCk7Ci0gIH0KLQotfQotCi12b2lkIFRGaWxlUHJvY2Vzc29yOjpwcm9jZXNzQ2h1bmsoKSB7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydF8pOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnRfKTsKLQotICB1aW50MzJfdCBjdXJDaHVuayA9IGlucHV0VHJhbnNwb3J0Xy0+Z2V0Q3VyQ2h1bmsoKTsKLQotICB3aGlsZSgxKSB7Ci0gICAgLy8gYmFkIGZvcm0gdG8gdXNlIGV4Y2VwdGlvbnMgZm9yIGZsb3cgY29udHJvbCBidXQgdGhlcmUgaXMgcmVhbGx5Ci0gICAgLy8gbm8gb3RoZXIgd2F5IGFyb3VuZCBpdAotICAgIHRyeSB7Ci0gICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICAgIGlmIChjdXJDaHVuayAhPSBpbnB1dFRyYW5zcG9ydF8tPmdldEN1ckNodW5rKCkpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVEVPRkV4Y2VwdGlvbiYgdGVvZikgewotICAgICAgYnJlYWs7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdGUpIHsKLSAgICAgIGNlcnIgPDwgdGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDNhOWIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RGSUxFVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RGSUxFVFJBTlNQT1JUX0hfIDEKLQotI2luY2x1ZGUgIlRUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUaHJpZnQuaCIKLSNpbmNsdWRlICJUUHJvY2Vzc29yLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKLQotLy8gRGF0YSBwZXJ0YWluaW5nIHRvIGEgc2luZ2xlIGV2ZW50Ci10eXBlZGVmIHN0cnVjdCBldmVudEluZm8gewotICB1aW50OF90KiBldmVudEJ1ZmZfOwotICB1aW50MzJfdCBldmVudFNpemVfOwotICB1aW50MzJfdCBldmVudEJ1ZmZQb3NfOwotCi0gIGV2ZW50SW5mbygpOmV2ZW50QnVmZl8oTlVMTCksIGV2ZW50U2l6ZV8oMCksIGV2ZW50QnVmZlBvc18oMCl7fTsKLSAgfmV2ZW50SW5mbygpIHsKLSAgICBpZiAoZXZlbnRCdWZmXykgewotICAgICAgZGVsZXRlW10gZXZlbnRCdWZmXzsKLSAgICB9Ci0gIH0KLX0gZXZlbnRJbmZvOwotCi0vLyBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHJlYWQgc3RhdGUKLXR5cGVkZWYgc3RydWN0IHJlYWRTdGF0ZSB7Ci0gIGV2ZW50SW5mbyogZXZlbnRfOwotCi0gIC8vIGtlZXAgdHJhY2sgb2YgZXZlbnQgc2l6ZQotICB1aW50OF90ICAgZXZlbnRTaXplQnVmZl9bNF07Ci0gIHVpbnQ4X3QgICBldmVudFNpemVCdWZmUG9zXzsKLSAgYm9vbCAgICAgIHJlYWRpbmdTaXplXzsKLQotICAvLyByZWFkIGJ1ZmZlciB2YXJpYWJsZXMKLSAgaW50MzJfdCAgYnVmZmVyUHRyXzsKLSAgaW50MzJfdCAgYnVmZmVyTGVuXzsKLQotICAvLyBsYXN0IHN1Y2Nlc3NmdWwgZGlzcGF0Y2ggcG9pbnQKLSAgaW50MzJfdCBsYXN0RGlzcGF0Y2hQdHJfOwotCi0gIHZvaWQgcmVzZXRTdGF0ZSh1aW50MzJfdCBsYXN0RGlzcGF0Y2hQdHIpIHsKLSAgICByZWFkaW5nU2l6ZV8gPSB0cnVlOwotICAgIGV2ZW50U2l6ZUJ1ZmZQb3NfID0gMDsKLSAgICBsYXN0RGlzcGF0Y2hQdHJfID0gbGFzdERpc3BhdGNoUHRyOwotICB9Ci0KLSAgdm9pZCByZXNldEFsbFZhbHVlcygpIHsKLSAgICByZXNldFN0YXRlKDApOwotICAgIGJ1ZmZlclB0cl8gPSAwOwotICAgIGJ1ZmZlckxlbl8gPSAwOwotICAgIGlmIChldmVudF8pIHsKLSAgICAgIGRlbGV0ZShldmVudF8pOwotICAgIH0KLSAgICBldmVudF8gPSAwOwotICB9Ci0KLSAgcmVhZFN0YXRlKCkgewotICAgIGV2ZW50XyA9IDA7Ci0gICByZXNldEFsbFZhbHVlcygpOwotICB9Ci0KLSAgfnJlYWRTdGF0ZSgpIHsKLSAgICBpZiAoZXZlbnRfKSB7Ci0gICAgICBkZWxldGUoZXZlbnRfKTsKLSAgICB9Ci0gIH0KLQotfSByZWFkU3RhdGU7Ci0KLS8qKgotICogVEZpbGVUcmFuc3BvcnRCdWZmZXIgLSBidWZmZXIgY2xhc3MgdXNlZCBieSBURmlsZVRyYW5zcG9ydCBmb3IgcXVldWVpbmcgdXAgZXZlbnRzCi0gKiB0byBiZSB3cml0dGVuIHRvIGRpc2suICBTaG91bGQgYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKLSAqICAxKSBCdWZmZXIgY3JlYXRlZAotICogIDIpIEJ1ZmZlciB3cml0dGVuIHRvIChhZGRFdmVudCkKLSAqICAzKSBCdWZmZXIgcmVhZCBmcm9tIChnZXROZXh0KQotICogIDQpIEJ1ZmZlciByZXNldCAocmVzZXQpCi0gKiAgNSkgR28gYmFjayB0byAyLCBvciBkZXN0cm95IGJ1ZmZlcgotICoKLSAqIFRoZSBidWZmZXIgc2hvdWxkIG5ldmVyIGJlIHdyaXR0ZW4gdG8gYWZ0ZXIgaXQgaXMgcmVhZCBmcm9tLCB1bmxlc3MgaXQgaXMgcmVzZXQgZmlyc3QuCi0gKiBOb3RlOiBUaGUgYWJvdmUgcnVsZXMgYXJlIGVuZm9yY2VkIG1haW5seSBmb3IgZGVidWdnaW5nIGl0cyBzb2xlIGNsaWVudCBURmlsZVRyYW5zcG9ydAotICogICAgICAgd2hpY2ggdXNlcyB0aGUgYnVmZmVyIGluIHRoaXMgd2F5LgotICoKLSAqLwotY2xhc3MgVEZpbGVUcmFuc3BvcnRCdWZmZXIgewotICBwdWJsaWM6Ci0gICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIodWludDMyX3Qgc2l6ZSk7Ci0gICAgflRGaWxlVHJhbnNwb3J0QnVmZmVyKCk7Ci0KLSAgICBib29sIGFkZEV2ZW50KGV2ZW50SW5mbyAqZXZlbnQpOwotICAgIGV2ZW50SW5mbyogZ2V0TmV4dCgpOwotICAgIHZvaWQgcmVzZXQoKTsKLSAgICBib29sIGlzRnVsbCgpOwotICAgIGJvb2wgaXNFbXB0eSgpOwotCi0gIHByaXZhdGU6Ci0gICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsgLy8gc2hvdWxkIG5vdCBiZSB1c2VkCi0KLSAgICBlbnVtIG1vZGUgewotICAgICAgV1JJVEUsCi0gICAgICBSRUFECi0gICAgfTsKLSAgICBtb2RlIGJ1ZmZlck1vZGVfOwotCi0gICAgdWludDMyX3Qgd3JpdGVQb2ludF87Ci0gICAgdWludDMyX3QgcmVhZFBvaW50XzsKLSAgICB1aW50MzJfdCBzaXplXzsKLSAgICBldmVudEluZm8qKiBidWZmZXJfOwotfTsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHRyYW5zcG9ydHMgdXNlZCB0byByZWFkIGZpbGVzCi0gKi8KLWNsYXNzIFRGaWxlUmVhZGVyVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGludDMyX3QgZ2V0UmVhZFRpbWVvdXQoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSA9IDA7Ci0KLSAgdmlydHVhbCB1aW50MzJfdCBnZXROdW1DaHVua3MoKSA9IDA7Ci0gIHZpcnR1YWwgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBzZWVrVG9FbmQoKSA9IDA7Ci19OwotCi0vKioKLSAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cyB1c2VkIHRvIHdyaXRlIGZpbGVzCi0gKi8KLWNsYXNzIFRGaWxlV3JpdGVyVHJhbnNwb3J0IDogdmlydHVhbCBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHVpbnQzMl90IGdldENodW5rU2l6ZSgpID0gMDsKLSAgdmlydHVhbCB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpID0gMDsKLX07Ci0KLS8qKgotICogRmlsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHRyYW5zcG9ydC4gUmVhZHMgYW5kIHdyaXRlcyBhcmUgZG9uZSB0byBhCi0gKiBmaWxlIG9uIGRpc2suCi0gKgotICovCi1jbGFzcyBURmlsZVRyYW5zcG9ydCA6IHB1YmxpYyBURmlsZVJlYWRlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRGaWxlV3JpdGVyVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRGaWxlVHJhbnNwb3J0KHN0ZDo6c3RyaW5nIHBhdGgsIGJvb2wgcmVhZE9ubHk9ZmFsc2UpOwotICB+VEZpbGVUcmFuc3BvcnQoKTsKLQotICAvLyBUT0RPOiB3aGF0IGlzIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBmb3IgdGhpcz8KLSAgLy8gdGhlIGxvZyBmaWxlIGlzIGdlbmVyYWxseSBhbHdheXMgb3BlbgotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICB2b2lkIGZsdXNoKCk7Ci0KLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICBib29sIHBlZWsoKTsKLQotICAvLyBsb2ctZmlsZSBzcGVjaWZpYyBmdW5jdGlvbnMKLSAgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKTsKLSAgdm9pZCBzZWVrVG9FbmQoKTsKLSAgdWludDMyX3QgZ2V0TnVtQ2h1bmtzKCk7Ci0gIHVpbnQzMl90IGdldEN1ckNodW5rKCk7Ci0KLSAgLy8gZm9yIGNoYW5naW5nIHRoZSBvdXRwdXQgZmlsZQotICB2b2lkIHJlc2V0T3V0cHV0RmlsZShpbnQgZmQsIHN0ZDo6c3RyaW5nIGZpbGVuYW1lLCBpbnQ2NF90IG9mZnNldCk7Ci0KLSAgLy8gU2V0dGVyL0dldHRlciBmdW5jdGlvbnMgZm9yIHVzZXItY29udHJvbGxhYmxlIG9wdGlvbnMKLSAgdm9pZCBzZXRSZWFkQnVmZlNpemUodWludDMyX3QgcmVhZEJ1ZmZTaXplKSB7Ci0gICAgaWYgKHJlYWRCdWZmU2l6ZSkgewotICAgICAgcmVhZEJ1ZmZTaXplXyA9IHJlYWRCdWZmU2l6ZTsKLSAgICB9Ci0gIH0KLSAgdWludDMyX3QgZ2V0UmVhZEJ1ZmZTaXplKCkgewotICAgIHJldHVybiByZWFkQnVmZlNpemVfOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IGludDMyX3QgVEFJTF9SRUFEX1RJTUVPVVQgPSAtMTsKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgTk9fVEFJTF9SRUFEX1RJTUVPVVQgPSAwOwotICB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpIHsKLSAgICByZWFkVGltZW91dF8gPSByZWFkVGltZW91dDsKLSAgfQotICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgewotICAgIHJldHVybiByZWFkVGltZW91dF87Ci0gIH0KLQotICB2b2lkIHNldENodW5rU2l6ZSh1aW50MzJfdCBjaHVua1NpemUpIHsKLSAgICBpZiAoY2h1bmtTaXplKSB7Ci0gICAgICBjaHVua1NpemVfID0gY2h1bmtTaXplOwotICAgIH0KLSAgfQotICB1aW50MzJfdCBnZXRDaHVua1NpemUoKSB7Ci0gICAgcmV0dXJuIGNodW5rU2l6ZV87Ci0gIH0KLQotICB2b2lkIHNldEV2ZW50QnVmZmVyU2l6ZSh1aW50MzJfdCBidWZmZXJTaXplKSB7Ci0gICAgaWYgKGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgewotICAgICAgR2xvYmFsT3V0cHV0KCJDYW5ub3QgY2hhbmdlIHRoZSBidWZmZXIgc2l6ZSBhZnRlciB3cml0ZXIgdGhyZWFkIHN0YXJ0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZXZlbnRCdWZmZXJTaXplXyA9IGJ1ZmZlclNpemU7Ci0gIH0KLQotICB1aW50MzJfdCBnZXRFdmVudEJ1ZmZlclNpemUoKSB7Ci0gICAgcmV0dXJuIGV2ZW50QnVmZmVyU2l6ZV87Ci0gIH0KLQotICB2b2lkIHNldEZsdXNoTWF4VXModWludDMyX3QgZmx1c2hNYXhVcykgewotICAgIGlmIChmbHVzaE1heFVzKSB7Ci0gICAgICBmbHVzaE1heFVzXyA9IGZsdXNoTWF4VXM7Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGdldEZsdXNoTWF4VXMoKSB7Ci0gICAgcmV0dXJuIGZsdXNoTWF4VXNfOwotICB9Ci0KLSAgdm9pZCBzZXRGbHVzaE1heEJ5dGVzKHVpbnQzMl90IGZsdXNoTWF4Qnl0ZXMpIHsKLSAgICBpZiAoZmx1c2hNYXhCeXRlcykgewotICAgICAgZmx1c2hNYXhCeXRlc18gPSBmbHVzaE1heEJ5dGVzOwotICAgIH0KLSAgfQotICB1aW50MzJfdCBnZXRGbHVzaE1heEJ5dGVzKCkgewotICAgIHJldHVybiBmbHVzaE1heEJ5dGVzXzsKLSAgfQotCi0gIHZvaWQgc2V0TWF4RXZlbnRTaXplKHVpbnQzMl90IG1heEV2ZW50U2l6ZSkgewotICAgIG1heEV2ZW50U2l6ZV8gPSBtYXhFdmVudFNpemU7Ci0gIH0KLSAgdWludDMyX3QgZ2V0TWF4RXZlbnRTaXplKCkgewotICAgIHJldHVybiBtYXhFdmVudFNpemVfOwotICB9Ci0KLSAgdm9pZCBzZXRNYXhDb3JydXB0ZWRFdmVudHModWludDMyX3QgbWF4Q29ycnVwdGVkRXZlbnRzKSB7Ci0gICAgbWF4Q29ycnVwdGVkRXZlbnRzXyA9IG1heENvcnJ1cHRlZEV2ZW50czsKLSAgfQotICB1aW50MzJfdCBnZXRNYXhDb3JydXB0ZWRFdmVudHMoKSB7Ci0gICAgcmV0dXJuIG1heENvcnJ1cHRlZEV2ZW50c187Ci0gIH0KLQotICB2b2lkIHNldEVvZlNsZWVwVGltZVVzKHVpbnQzMl90IGVvZlNsZWVwVGltZSkgewotICAgIGlmIChlb2ZTbGVlcFRpbWUpIHsKLSAgICAgIGVvZlNsZWVwVGltZV8gPSBlb2ZTbGVlcFRpbWU7Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGdldEVvZlNsZWVwVGltZVVzKCkgewotICAgIHJldHVybiBlb2ZTbGVlcFRpbWVfOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciB3cml0aW5nIHRvIGEgZmlsZQotICB2b2lkIGVucXVldWVFdmVudChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGV2ZW50TGVuLCBib29sIGJsb2NrVW50aWxGbHVzaCk7Ci0gIGJvb2wgc3dhcEV2ZW50QnVmZmVycyhzdHJ1Y3QgdGltZXNwZWMqIGRlYWRsaW5lKTsKLSAgYm9vbCBpbml0QnVmZmVyQW5kV3JpdGVUaHJlYWQoKTsKLQotICAvLyBjb250cm9sIGZvciB3cml0ZXIgdGhyZWFkCi0gIHN0YXRpYyB2b2lkKiBzdGFydFdyaXRlclRocmVhZCh2b2lkKiBwdHIpIHsKLSAgICAoKChURmlsZVRyYW5zcG9ydCopcHRyKS0+d3JpdGVyVGhyZWFkKCkpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHZvaWQgd3JpdGVyVGhyZWFkKCk7Ci0KLSAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBmcm9tIGEgZmlsZQotICBldmVudEluZm8qIHJlYWRFdmVudCgpOwotCi0gIC8vIGV2ZW50IGNvcnJ1cHRpb24tcmVsYXRlZCBmdW5jdGlvbnMKLSAgYm9vbCBpc0V2ZW50Q29ycnVwdGVkKCk7Ci0gIHZvaWQgcGVyZm9ybVJlY292ZXJ5KCk7Ci0KLSAgLy8gVXRpbGl0eSBmdW5jdGlvbnMKLSAgdm9pZCBvcGVuTG9nRmlsZSgpOwotICB2b2lkIGdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWVzcGVjKiB0c19uZXh0X2ZsdXNoKTsKLQotICAvLyBDbGFzcyB2YXJpYWJsZXMKLSAgcmVhZFN0YXRlIHJlYWRTdGF0ZV87Ci0gIHVpbnQ4X3QqIHJlYWRCdWZmXzsKLSAgZXZlbnRJbmZvKiBjdXJyZW50RXZlbnRfOwotCi0gIHVpbnQzMl90IHJlYWRCdWZmU2l6ZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX1JFQURfQlVGRl9TSVpFID0gMSAqIDEwMjQgKiAxMDI0OwotCi0gIGludDMyX3QgcmVhZFRpbWVvdXRfOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1JFQURfVElNRU9VVF9NUyA9IDIwMDsKLQotICAvLyBzaXplIG9mIGNodW5rcyB0aGF0IGZpbGUgd2lsbCBiZSBzcGxpdCB1cCBpbnRvCi0gIHVpbnQzMl90IGNodW5rU2l6ZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0NIVU5LX1NJWkUgPSAxNiAqIDEwMjQgKiAxMDI0OwotCi0gIC8vIHNpemUgb2YgZXZlbnQgYnVmZmVycwotICB1aW50MzJfdCBldmVudEJ1ZmZlclNpemVfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRSA9IDEwMDAwOwotCi0gIC8vIG1heCBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHRoYXQgY2FuIHBhc3Mgd2l0aG91dCBmbHVzaGluZwotICB1aW50MzJfdCBmbHVzaE1heFVzXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfRkxVU0hfTUFYX1VTID0gMzAwMDAwMDsKLQotICAvLyBtYXggbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gd2l0aG91dCBmbHVzaGluZwotICB1aW50MzJfdCBmbHVzaE1heEJ5dGVzXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfRkxVU0hfTUFYX0JZVEVTID0gMTAwMCAqIDEwMjQ7Ci0KLSAgLy8gbWF4IGV2ZW50IHNpemUKLSAgdWludDMyX3QgbWF4RXZlbnRTaXplXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfTUFYX0VWRU5UX1NJWkUgPSAwOwotCi0gIC8vIG1heCBudW1iZXIgb2YgY29ycnVwdGVkIGV2ZW50cyBwZXIgY2h1bmsKLSAgdWludDMyX3QgbWF4Q29ycnVwdGVkRXZlbnRzXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfTUFYX0NPUlJVUFRFRF9FVkVOVFMgPSAwOwotCi0gIC8vIHNsZWVwIGR1cmF0aW9uIHdoZW4gRU9GIGlzIGhpdAotICB1aW50MzJfdCBlb2ZTbGVlcFRpbWVfOwotICBzdGF0aWMgY29uc3QgdWludDMyX3QgREVGQVVMVF9FT0ZfU0xFRVBfVElNRV9VUyA9IDUwMCAqIDEwMDA7Ci0KLSAgLy8gc2xlZXAgZHVyYXRpb24gd2hlbiBhIGNvcnJ1cHRlZCBldmVudCBpcyBlbmNvdW50ZXJlZAotICB1aW50MzJfdCBjb3JydXB0ZWRFdmVudFNsZWVwVGltZV87Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX0NPUlJVUFRFRF9TTEVFUF9USU1FX1VTID0gMSAqIDEwMDAgKiAxMDAwOwotCi0gIC8vIHNsZWVwIGR1cmF0aW9uIGluIHNlY29uZHMgd2hlbiBhbiBJTyBlcnJvciBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgd3JpdGVyIHRocmVhZAotICB1aW50MzJfdCB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXzsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfV1JJVEVSX1RIUkVBRF9TTEVFUF9USU1FX1VTID0gNjAgKiAxMDAwICogMTAwMDsKLQotICAvLyB3cml0ZXIgdGhyZWFkIGlkCi0gIHB0aHJlYWRfdCB3cml0ZXJUaHJlYWRJZF87Ci0KLSAgLy8gYnVmZmVycyB0byBob2xkIGRhdGEgYmVmb3JlIGl0IGlzIGZsdXNoZWQuIEVhY2ggZWxlbWVudCBvZiB0aGUgYnVmZmVyIHN0b3JlcyBhIG1zZyB0aGF0Ci0gIC8vIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUuICBUaGUgYnVmZmVycyBhcmUgc3dhcHBlZCBieSB0aGUgd3JpdGVyIHRocmVhZC4KLSAgVEZpbGVUcmFuc3BvcnRCdWZmZXIgKmRlcXVldWVCdWZmZXJfOwotICBURmlsZVRyYW5zcG9ydEJ1ZmZlciAqZW5xdWV1ZUJ1ZmZlcl87Ci0KLSAgLy8gY29uZGl0aW9ucyB1c2VkIHRvIGJsb2NrIHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsIG9yIGVtcHR5Ci0gIHB0aHJlYWRfY29uZF90IG5vdEZ1bGxfLCBub3RFbXB0eV87Ci0gIHZvbGF0aWxlIGJvb2wgY2xvc2luZ187Ci0KLSAgLy8gVG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBidWZmZXIgaGFzIGJlZW4gZmx1c2hlZAotICBwdGhyZWFkX2NvbmRfdCBmbHVzaGVkXzsKLSAgdm9sYXRpbGUgYm9vbCBmb3JjZUZsdXNoXzsKLQotICAvLyBNdXRleCB0aGF0IGlzIGdyYWJiZWQgd2hlbiBlbnF1ZXVlaW5nIGFuZCBzd2FwcGluZyB0aGUgcmVhZC93cml0ZSBidWZmZXJzCi0gIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87Ci0KLSAgLy8gRmlsZSBpbmZvcm1hdGlvbgotICBzdGQ6OnN0cmluZyBmaWxlbmFtZV87Ci0gIGludCBmZF87Ci0KLSAgLy8gV2hldGhlciB0aGUgd3JpdGVyIHRocmVhZCBhbmQgYnVmZmVycyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKLSAgYm9vbCBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF87Ci0KLSAgLy8gT2Zmc2V0IHdpdGhpbiB0aGUgZmlsZQotICBvZmZfdCBvZmZzZXRfOwotCi0gIC8vIGV2ZW50IGNvcnJ1cHRpb24gaW5mb3JtYXRpb24KLSAgdWludDMyX3QgbGFzdEJhZENodW5rXzsKLSAgdWludDMyX3QgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua187Ci0KLSAgYm9vbCByZWFkT25seV87Ci19OwotCi0vLyBFeGNlcHRpb24gdGhyb3duIHdoZW4gRU9GIGlzIGhpdAotY2xhc3MgVEVPRkV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRFT0ZFeGNlcHRpb24oKToKLSAgICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKSB7fTsKLX07Ci0KLQotLy8gd3JhcHBlciBjbGFzcyB0byBwcm9jZXNzIGV2ZW50cyBmcm9tIGEgZmlsZSBjb250YWluaW5nIHRocmlmdCBldmVudHMKLWNsYXNzIFRGaWxlUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB0aGF0IGRlZmF1bHRzIG91dHB1dCB0cmFuc3BvcnQgdG8gbnVsbCB0cmFuc3BvcnQKLSAgICoKLSAgICogQHBhcmFtIHByb2Nlc3NvciBwcm9jZXNzZXMgbG9nLWZpbGUgZXZlbnRzCi0gICAqIEBwYXJhbSBwcm90b2NvbEZhY3RvcnkgcHJvdG9jb2wgZmFjdG9yeQotICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgZmlsZSB0cmFuc3BvcnQKLSAgICovCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOwotCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHByb2Nlc3NvciBwcm9jZXNzZXMgbG9nLWZpbGUgZXZlbnRzCi0gICAqIEBwYXJhbSBwcm90b2NvbEZhY3RvcnkgcHJvdG9jb2wgZmFjdG9yeQotICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgaW5wdXQgZmlsZSB0cmFuc3BvcnQKLSAgICogQHBhcmFtIG91dHB1dCBvdXRwdXQgdHJhbnNwb3J0Ci0gICAqLwotICBURmlsZVByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOwotCi0gIC8qKgotICAgKiBwcm9jZXNzZXMgZXZlbnRzIGZyb20gdGhlIGZpbGUKLSAgICoKLSAgICogQHBhcmFtIG51bUV2ZW50cyBudW1iZXIgb2YgZXZlbnRzIHRvIHByb2Nlc3MgKDAgZm9yIHVubGltaXRlZCkKLSAgICogQHBhcmFtIHRhaWwgdGFpbHMgdGhlIGZpbGUgaWYgdHJ1ZQotICAgKi8KLSAgdm9pZCBwcm9jZXNzKHVpbnQzMl90IG51bUV2ZW50cywgYm9vbCB0YWlsKTsKLQotICAvKioKLSAgICogcHJvY2VzcyBldmVudHMgdW50aWwgdGhlIGVuZCBvZiB0aGUgY2h1bmsKLSAgICoKLSAgICovCi0gIHZvaWQgcHJvY2Vzc0NodW5rKCk7Ci0KLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydF87Ci19OwotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjIzMzkuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJUSHR0cENsaWVudC5oIgotI2luY2x1ZGUgIlRTb2NrZXQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLyoqCi0gKiBIdHRwIGNsaWVudCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKi8KLQotLy8gWWVhaCwgeWVhaCwgaGFja3kgdG8gcHV0IHRoZXNlIGhlcmUsIEkga25vdy4KLXN0YXRpYyBjb25zdCBjaGFyKiBDUkxGID0gIlxyXG4iOwotc3RhdGljIGNvbnN0IGludCBDUkxGX0xFTiA9IDI7Ci0KLVRIdHRwQ2xpZW50OjpUSHR0cENsaWVudChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHN0cmluZyBob3N0LCBzdHJpbmcgcGF0aCkgOgotICB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCi0gIGhvc3RfKGhvc3QpLAotICBwYXRoXyhwYXRoKSwKLSAgcmVhZEhlYWRlcnNfKHRydWUpLAotICBjaHVua2VkXyhmYWxzZSksCi0gIGNodW5rZWREb25lXyhmYWxzZSksCi0gIGNodW5rU2l6ZV8oMCksCi0gIGNvbnRlbnRMZW5ndGhfKDApLAotICBodHRwQnVmXyhOVUxMKSwKLSAgaHR0cFBvc18oMCksCi0gIGh0dHBCdWZMZW5fKDApLAotICBodHRwQnVmU2l6ZV8oMTAyNCkgewotICBpbml0KCk7Ci19Ci0KLVRIdHRwQ2xpZW50OjpUSHR0cENsaWVudChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0cmluZyBwYXRoKSA6Ci0gIGhvc3RfKGhvc3QpLAotICBwYXRoXyhwYXRoKSwKLSAgcmVhZEhlYWRlcnNfKHRydWUpLAotICBjaHVua2VkXyhmYWxzZSksCi0gIGNodW5rZWREb25lXyhmYWxzZSksCi0gIGNodW5rU2l6ZV8oMCksCi0gIGNvbnRlbnRMZW5ndGhfKDApLAotICBodHRwQnVmXyhOVUxMKSwKLSAgaHR0cFBvc18oMCksCi0gIGh0dHBCdWZMZW5fKDApLAotICBodHRwQnVmU2l6ZV8oMTAyNCkgewotICB0cmFuc3BvcnRfID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpOwotICBpbml0KCk7Ci19Ci0KLXZvaWQgVEh0dHBDbGllbnQ6OmluaXQoKSB7Ci0gIGh0dHBCdWZfID0gKGNoYXIqKXN0ZDo6bWFsbG9jKGh0dHBCdWZTaXplXysxKTsKLSAgaWYgKGh0dHBCdWZfID09IE5VTEwpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJPdXQgb2YgbWVtb3J5LiIpOwotICB9Ci0gIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7Ci19Ci0KLVRIdHRwQ2xpZW50Ojp+VEh0dHBDbGllbnQoKSB7Ci0gIGlmIChodHRwQnVmXyAhPSBOVUxMKSB7Ci0gICAgc3RkOjpmcmVlKGh0dHBCdWZfKTsKLSAgfQotfQotCi11aW50MzJfdCBUSHR0cENsaWVudDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBpZiAocmVhZEJ1ZmZlcl8uYXZhaWxhYmxlX3JlYWQoKSA9PSAwKSB7Ci0gICAgcmVhZEJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKLSAgICB1aW50MzJfdCBnb3QgPSByZWFkTW9yZURhdGEoKTsKLSAgICBpZiAoZ290ID09IDApIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIGxlbik7Ci19Ci0KLXZvaWQgVEh0dHBDbGllbnQ6OnJlYWRFbmQoKSB7Ci0gIC8vIFJlYWQgYW55IHBlbmRpbmcgY2h1bmtlZCBkYXRhIChmb290ZXJzIGV0Yy4pCi0gIGlmIChjaHVua2VkXykgewotICAgIHdoaWxlICghY2h1bmtlZERvbmVfKSB7Ci0gICAgICByZWFkQ2h1bmtlZCgpOwotICAgIH0KLSAgfQotfQotCi11aW50MzJfdCBUSHR0cENsaWVudDo6cmVhZE1vcmVEYXRhKCkgewotICAvLyBHZXQgbW9yZSBkYXRhIQotICByZWZpbGwoKTsKLQotICBpZiAocmVhZEhlYWRlcnNfKSB7Ci0gICAgcmVhZEhlYWRlcnMoKTsKLSAgfQotCi0gIGlmIChjaHVua2VkXykgewotICAgIHJldHVybiByZWFkQ2h1bmtlZCgpOwotICB9IGVsc2UgewotICAgIHJldHVybiByZWFkQ29udGVudChjb250ZW50TGVuZ3RoXyk7Ci0gIH0KLX0KLQotdWludDMyX3QgVEh0dHBDbGllbnQ6OnJlYWRDaHVua2VkKCkgewotICB1aW50MzJfdCBsZW5ndGggPSAwOwotCi0gIGNoYXIqIGxpbmUgPSByZWFkTGluZSgpOwotICB1aW50MzJfdCBjaHVua1NpemUgPSBwYXJzZUNodW5rU2l6ZShsaW5lKTsKLSAgaWYgKGNodW5rU2l6ZSA9PSAwKSB7Ci0gICAgcmVhZENodW5rZWRGb290ZXJzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gUmVhZCBkYXRhIGNvbnRlbnQKLSAgICBsZW5ndGggKz0gcmVhZENvbnRlbnQoY2h1bmtTaXplKTsKLSAgICAvLyBSZWFkIHRyYWlsaW5nIENSTEYgYWZ0ZXIgY29udGVudAotICAgIHJlYWRMaW5lKCk7Ci0gIH0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotdm9pZCBUSHR0cENsaWVudDo6cmVhZENodW5rZWRGb290ZXJzKCkgewotICAvLyBFbmQgb2YgZGF0YSwgcmVhZCBmb290ZXIgbGluZXMgdW50aWwgYSBibGFuayBvbmUgYXBwZWFycwotICB3aGlsZSAodHJ1ZSkgewotICAgIGNoYXIqIGxpbmUgPSByZWFkTGluZSgpOwotICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCkgewotICAgICAgY2h1bmtlZERvbmVfID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi11aW50MzJfdCBUSHR0cENsaWVudDo6cGFyc2VDaHVua1NpemUoY2hhciogbGluZSkgewotICBjaGFyKiBzZW1pID0gc3RyY2hyKGxpbmUsICc7Jyk7Ci0gIGlmIChzZW1pICE9IE5VTEwpIHsKLSAgICAqc2VtaSA9ICdcMCc7Ci0gIH0KLSAgaW50IHNpemUgPSAwOwotICBzc2NhbmYobGluZSwgIiV4IiwgJnNpemUpOwotICByZXR1cm4gKHVpbnQzMl90KXNpemU7Ci19Ci0KLXVpbnQzMl90IFRIdHRwQ2xpZW50OjpyZWFkQ29udGVudCh1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IG5lZWQgPSBzaXplOwotICB3aGlsZSAobmVlZCA+IDApIHsKLSAgICB1aW50MzJfdCBhdmFpbCA9IGh0dHBCdWZMZW5fIC0gaHR0cFBvc187Ci0gICAgaWYgKGF2YWlsID09IDApIHsKLSAgICAgIC8vIFdlIGhhdmUgZ2l2ZW4gYWxsIHRoZSBkYXRhLCByZXNldCBwb3NpdGlvbiB0byBoZWFkIG9mIHRoZSBidWZmZXIKLSAgICAgIGh0dHBQb3NfID0gMDsKLSAgICAgIGh0dHBCdWZMZW5fID0gMDsKLSAgICAgIHJlZmlsbCgpOwotCi0gICAgICAvLyBOb3cgaGF2ZSBhdmFpbGFibGUgaG93ZXZlciBtdWNoIHdlIHJlYWQKLSAgICAgIGF2YWlsID0gaHR0cEJ1Zkxlbl87Ci0gICAgfQotICAgIHVpbnQzMl90IGdpdmUgPSBhdmFpbDsKLSAgICBpZiAobmVlZCA8IGdpdmUpIHsKLSAgICAgIGdpdmUgPSBuZWVkOwotICAgIH0KLSAgICByZWFkQnVmZmVyXy53cml0ZSgodWludDhfdCopKGh0dHBCdWZfK2h0dHBQb3NfKSwgZ2l2ZSk7Ci0gICAgaHR0cFBvc18gKz0gZ2l2ZTsKLSAgICBuZWVkIC09IGdpdmU7Ci0gIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLWNoYXIqIFRIdHRwQ2xpZW50OjpyZWFkTGluZSgpIHsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBjaGFyKiBlb2wgPSBOVUxMOwotCi0gICAgZW9sID0gc3Ryc3RyKGh0dHBCdWZfK2h0dHBQb3NfLCBDUkxGKTsKLQotICAgIC8vIE5vIENSTEYgeWV0PwotICAgIGlmIChlb2wgPT0gTlVMTCkgewotICAgICAgLy8gU2hpZnQgd2hhdGV2ZXIgd2UgaGF2ZSBub3cgdG8gZnJvbnQgYW5kIHJlZmlsbAotICAgICAgc2hpZnQoKTsKLSAgICAgIHJlZmlsbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBSZXR1cm4gcG9pbnRlciB0byBuZXh0IGxpbmUKLSAgICAgICplb2wgPSAnXDAnOwotICAgICAgY2hhciogbGluZSA9IGh0dHBCdWZfK2h0dHBQb3NfOwotICAgICAgaHR0cFBvc18gPSAoZW9sLWh0dHBCdWZfKSArIENSTEZfTEVOOwotICAgICAgcmV0dXJuIGxpbmU7Ci0gICAgfQotICB9Ci0KLX0KLQotdm9pZCBUSHR0cENsaWVudDo6c2hpZnQoKSB7Ci0gIGlmIChodHRwQnVmTGVuXyA+IGh0dHBQb3NfKSB7Ci0gICAgLy8gU2hpZnQgZG93biByZW1haW5pbmcgZGF0YSBhbmQgcmVhZCBtb3JlCi0gICAgdWludDMyX3QgbGVuZ3RoID0gaHR0cEJ1Zkxlbl8gLSBodHRwUG9zXzsKLSAgICBtZW1tb3ZlKGh0dHBCdWZfLCBodHRwQnVmXytodHRwUG9zXywgbGVuZ3RoKTsKLSAgICBodHRwQnVmTGVuXyA9IGxlbmd0aDsKLSAgfSBlbHNlIHsKLSAgICBodHRwQnVmTGVuXyA9IDA7Ci0gIH0KLSAgaHR0cFBvc18gPSAwOwotICBodHRwQnVmX1todHRwQnVmTGVuX10gPSAnXDAnOwotfQotCi12b2lkIFRIdHRwQ2xpZW50OjpyZWZpbGwoKSB7Ci0gIHVpbnQzMl90IGF2YWlsID0gaHR0cEJ1ZlNpemVfIC0gaHR0cEJ1Zkxlbl87Ci0gIGlmIChhdmFpbCA8PSAoaHR0cEJ1ZlNpemVfIC8gNCkpIHsKLSAgICBodHRwQnVmU2l6ZV8gKj0gMjsKLSAgICBodHRwQnVmXyA9IChjaGFyKilzdGQ6OnJlYWxsb2MoaHR0cEJ1Zl8sIGh0dHBCdWZTaXplXysxKTsKLSAgICBpZiAoaHR0cEJ1Zl8gPT0gTlVMTCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiT3V0IG9mIG1lbW9yeS4iKTsKLSAgICB9Ci0gIH0KLQotICAvLyBSZWFkIG1vcmUgZGF0YQotICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKCh1aW50OF90KikoaHR0cEJ1Zl8raHR0cEJ1Zkxlbl8pLCBodHRwQnVmU2l6ZV8taHR0cEJ1Zkxlbl8pOwotICBodHRwQnVmTGVuXyArPSBnb3Q7Ci0gIGh0dHBCdWZfW2h0dHBCdWZMZW5fXSA9ICdcMCc7Ci0KLSAgaWYgKGdvdCA9PSAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IHJlZmlsbCBidWZmZXIiKTsKLSAgfQotfQotCi12b2lkIFRIdHRwQ2xpZW50OjpyZWFkSGVhZGVycygpIHsKLSAgLy8gSW5pdGlhbGl6ZSBoZWFkZXJzIHN0YXRlIHZhcmlhYmxlcwotICBjb250ZW50TGVuZ3RoXyA9IDA7Ci0gIGNodW5rZWRfID0gZmFsc2U7Ci0gIGNodW5rZWREb25lXyA9IGZhbHNlOwotICBjaHVua1NpemVfID0gMDsKLQotICAvLyBDb250cm9sIHN0YXRlIGZsb3cKLSAgYm9vbCBzdGF0dXNMaW5lID0gdHJ1ZTsKLSAgYm9vbCBmaW5pc2hlZCA9IGZhbHNlOwotCi0gIC8vIExvb3AgdW50aWwgaGVhZGVycyBhcmUgZmluaXNoZWQKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBjaGFyKiBsaW5lID0gcmVhZExpbmUoKTsKLQotICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCkgewotICAgICAgaWYgKGZpbmlzaGVkKSB7Ci0gICAgICAgIHJlYWRIZWFkZXJzXyA9IGZhbHNlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBNdXN0IGhhdmUgYmVlbiBhbiBIVFRQIDEwMCwga2VlcCBnb2luZyBmb3IgYW5vdGhlciBzdGF0dXMgbGluZQotICAgICAgICBzdGF0dXNMaW5lID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHN0YXR1c0xpbmUpIHsKLSAgICAgICAgc3RhdHVzTGluZSA9IGZhbHNlOwotICAgICAgICBmaW5pc2hlZCA9IHBhcnNlU3RhdHVzTGluZShsaW5lKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhcnNlSGVhZGVyKGxpbmUpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIFRIdHRwQ2xpZW50OjpwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKSB7Ci0gIGNoYXIqIGh0dHAgPSBzdGF0dXM7Ci0KLSAgY2hhciogY29kZSA9IHN0cmNocihodHRwLCAnICcpOwotICBpZiAoY29kZSA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKLSAgfQotCi0gICpjb2RlID0gJ1wwJzsKLSAgd2hpbGUgKCooY29kZSsrKSA9PSAnICcpOwotCi0gIGNoYXIqIG1zZyA9IHN0cmNocihjb2RlLCAnICcpOwotICBpZiAobXNnID09IE5VTEwpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZygiQmFkIFN0YXR1czogIikgKyBzdGF0dXMpOwotICB9Ci0gICptc2cgPSAnXDAnOwotCi0gIGlmIChzdHJjbXAoY29kZSwgIjIwMCIpID09IDApIHsKLSAgICAvLyBIVFRQIDIwMCA9IE9LLCB3ZSBnb3QgdGhlIHJlc3BvbnNlCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoc3RyY21wKGNvZGUsICIxMDAiKSA9PSAwKSB7Ci0gICAgLy8gSFRUUCAxMDAgPSBjb250aW51ZSwganVzdCBrZWVwIHJlYWRpbmcKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcoIkJhZCBTdGF0dXM6ICIpICsgc3RhdHVzKTsKLSAgfQotfQotCi12b2lkIFRIdHRwQ2xpZW50OjpwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIHsKLSAgY2hhciogY29sb24gPSBzdHJjaHIoaGVhZGVyLCAnOicpOwotICBpZiAoY29sb24gPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotICB1aW50MzJfdCBzeiA9IGNvbG9uIC0gaGVhZGVyOwotICBjaGFyKiB2YWx1ZSA9IGNvbG9uKzE7Ci0KLSAgaWYgKHN0cm5jbXAoaGVhZGVyLCAiVHJhbnNmZXItRW5jb2RpbmciLCBzeikgPT0gMCkgewotICAgIGlmIChzdHJzdHIodmFsdWUsICJjaHVua2VkIikgIT0gTlVMTCkgewotICAgICAgY2h1bmtlZF8gPSB0cnVlOwotICAgIH0KLSAgfSBlbHNlIGlmIChzdHJuY21wKGhlYWRlciwgIkNvbnRlbnQtTGVuZ3RoIiwgc3opID09IDApIHsKLSAgICBjaHVua2VkXyA9IGZhbHNlOwotICAgIGNvbnRlbnRMZW5ndGhfID0gYXRvaSh2YWx1ZSk7Ci0gIH0KLX0KLQotdm9pZCBUSHR0cENsaWVudDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgd3JpdGVCdWZmZXJfLndyaXRlKGJ1ZiwgbGVuKTsKLX0KLQotdm9pZCBUSHR0cENsaWVudDo6Zmx1c2goKSB7Ci0gIC8vIEZldGNoIHRoZSBjb250ZW50cyBvZiB0aGUgd3JpdGUgYnVmZmVyCi0gIHVpbnQ4X3QqIGJ1ZjsKLSAgdWludDMyX3QgbGVuOwotICB3cml0ZUJ1ZmZlcl8uZ2V0QnVmZmVyKCZidWYsICZsZW4pOwotCi0gIC8vIENvbnN0cnVjdCB0aGUgSFRUUCBoZWFkZXIKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGg7Ci0gIGggPDwKLSAgICAiUE9TVCAiIDw8IHBhdGhfIDw8ICIgSFRUUC8xLjEiIDw8IENSTEYgPDwKLSAgICAiSG9zdDogIiA8PCBob3N0XyA8PCBDUkxGIDw8Ci0gICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwKLSAgICAiQ29udGVudC1MZW5ndGg6ICIgPDwgbGVuIDw8IENSTEYgPDwKLSAgICAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PAotICAgICJVc2VyLUFnZW50OiBDKysvVEh0dHBDbGllbnQiIDw8IENSTEYgPDwKLSAgICBDUkxGOwotICBzdHJpbmcgaGVhZGVyID0gaC5zdHIoKTsKLQotICAvLyBXcml0ZSB0aGUgaGVhZGVyLCB0aGVuIHRoZSBkYXRhLCB0aGVuIGZsdXNoCi0gIHRyYW5zcG9ydF8tPndyaXRlKChjb25zdCB1aW50OF90KiloZWFkZXIuY19zdHIoKSwgaGVhZGVyLnNpemUoKSk7Ci0gIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKLSAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKLQotICAvLyBSZXNldCB0aGUgYnVmZmVyIGFuZCBoZWFkZXIgdmFyaWFibGVzCi0gIHdyaXRlQnVmZmVyXy5yZXNldEJ1ZmZlcigpOwotICByZWFkSGVhZGVyc18gPSB0cnVlOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiZTRjMS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8gMQotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLS8qKgotICogSFRUUCBjbGllbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRocmlmdCB0cmFuc3BvcnQuIFRoaXMgd2FzIGlycml0YXRpbmcKLSAqIHRvIHdyaXRlLCBidXQgdGhlIGFsdGVybmF0aXZlcyBpbiBDKysgbGFuZCBhcmUgZGF1bnRpbmcuIExpbmtpbmcgQ1VSTAotICogcmVxdWlyZXMgMjMgZHluYW1pYyBsaWJyYXJpZXMgbGFzdCB0aW1lIEkgY2hlY2tlZCAoV1RGPyE/KS4gQWxsIHdlIGhhdmUKLSAqIGhlcmUgaXMgYSBWRVJZIGJhc2ljIEhUVFAvMS4xIGNsaWVudCB3aGljaCBzdXBwb3J0cyBIVFRQIDEwMCBDb250aW51ZSwKLSAqIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcsIGtlZXBhbGl2ZSwgZXRjLiBUZXN0ZWQgYWdhaW5zdCBBcGFjaGUuCi0gKgotICovCi1jbGFzcyBUSHR0cENsaWVudCA6IHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRIdHRwQ2xpZW50KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgc3RkOjpzdHJpbmcgaG9zdCwgc3RkOjpzdHJpbmcgcGF0aD0iIik7Ci0KLSAgVEh0dHBDbGllbnQoc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c3RyaW5nIHBhdGg9IiIpOwotCi0gIHZpcnR1YWwgflRIdHRwQ2xpZW50KCk7Ci0KLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQotCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIGJvb2wgcGVlaygpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+cGVlaygpOwotICB9Ci0KLSAgdm9pZCBjbG9zZSgpIHsKLSAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCByZWFkRW5kKCk7Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCBmbHVzaCgpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBpbml0KCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLQotICBUTWVtb3J5QnVmZmVyIHdyaXRlQnVmZmVyXzsKLSAgVE1lbW9yeUJ1ZmZlciByZWFkQnVmZmVyXzsKLQotICBzdGQ6OnN0cmluZyBob3N0XzsKLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci0KLSAgYm9vbCByZWFkSGVhZGVyc187Ci0gIGJvb2wgY2h1bmtlZF87Ci0gIGJvb2wgY2h1bmtlZERvbmVfOwotICB1aW50MzJfdCBjaHVua1NpemVfOwotICB1aW50MzJfdCBjb250ZW50TGVuZ3RoXzsKLQotICBjaGFyKiBodHRwQnVmXzsKLSAgdWludDMyX3QgaHR0cFBvc187Ci0gIHVpbnQzMl90IGh0dHBCdWZMZW5fOwotICB1aW50MzJfdCBodHRwQnVmU2l6ZV87Ci0KLSAgdWludDMyX3QgcmVhZE1vcmVEYXRhKCk7Ci0gIGNoYXIqIHJlYWRMaW5lKCk7Ci0KLSAgdm9pZCByZWFkSGVhZGVycygpOwotICB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7Ci0gIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cyk7Ci0KLSAgdWludDMyX3QgcmVhZENodW5rZWQoKTsKLSAgdm9pZCByZWFkQ2h1bmtlZEZvb3RlcnMoKTsKLSAgdWludDMyX3QgcGFyc2VDaHVua1NpemUoY2hhciogbGluZSk7Ci0KLSAgdWludDMyX3QgcmVhZENvbnRlbnQodWludDMyX3Qgc2l6ZSk7Ci0KLSAgdm9pZCByZWZpbGwoKTsKLSAgdm9pZCBzaGlmdCgpOwotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE0ZmQ1Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiVFNvY2tldC5oIgotI2luY2x1ZGUgIlRTZXJ2ZXJTb2NrZXQuaCIKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotI2lmbmRlZiBBRl9MT0NBTAotI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotCi1UU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0KSA6Ci0gIHBvcnRfKHBvcnQpLAotICBzZXJ2ZXJTb2NrZXRfKC0xKSwKLSAgYWNjZXB0QmFja2xvZ18oMTAyNCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICByZXRyeUxpbWl0XygwKSwKLSAgcmV0cnlEZWxheV8oMCksCi0gIHRjcFNlbmRCdWZmZXJfKDApLAotICB0Y3BSZWN2QnVmZmVyXygwKSwKLSAgaW50U29jazFfKC0xKSwKLSAgaW50U29jazJfKC0xKSB7fQotCi1UU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkgOgotICBwb3J0Xyhwb3J0KSwKLSAgc2VydmVyU29ja2V0XygtMSksCi0gIGFjY2VwdEJhY2tsb2dfKDEwMjQpLAotICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAotICByZWN2VGltZW91dF8ocmVjdlRpbWVvdXQpLAotICByZXRyeUxpbWl0XygwKSwKLSAgcmV0cnlEZWxheV8oMCksCi0gIHRjcFNlbmRCdWZmZXJfKDApLAotICB0Y3BSZWN2QnVmZmVyXygwKSwKLSAgaW50U29jazFfKC0xKSwKLSAgaW50U29jazJfKC0xKSB7fQotCi1UU2VydmVyU29ja2V0Ojp+VFNlcnZlclNvY2tldCgpIHsKLSAgY2xvc2UoKTsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjpzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpIHsKLSAgc2VuZFRpbWVvdXRfID0gc2VuZFRpbWVvdXQ7Ci19Ci0KLXZvaWQgVFNlcnZlclNvY2tldDo6c2V0UmVjdlRpbWVvdXQoaW50IHJlY3ZUaW1lb3V0KSB7Ci0gIHJlY3ZUaW1lb3V0XyA9IHJlY3ZUaW1lb3V0OwotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpIHsKLSAgcmV0cnlMaW1pdF8gPSByZXRyeUxpbWl0OwotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpIHsKLSAgcmV0cnlEZWxheV8gPSByZXRyeURlbGF5OwotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpIHsKLSAgdGNwU2VuZEJ1ZmZlcl8gPSB0Y3BTZW5kQnVmZmVyOwotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpIHsKLSAgdGNwUmVjdkJ1ZmZlcl8gPSB0Y3BSZWN2QnVmZmVyOwotfQotCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHsKLSAgaW50IHN2WzJdOwotICBpZiAoLTEgPT0gc29ja2V0cGFpcihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIHN2KSkgewotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldHBhaXIoKSAiLCBlcnJubyk7Ci0gICAgaW50U29jazFfID0gLTE7Ci0gICAgaW50U29jazJfID0gLTE7Ci0gIH0gZWxzZSB7Ci0gICAgaW50U29jazFfID0gc3ZbMV07Ci0gICAgaW50U29jazJfID0gc3ZbMF07Ci0gIH0KLQotICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOwotICBpbnQgZXJyb3I7Ci0gIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM2IikgKyAxXTsKLSAgc3RkOjptZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOwotICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKLQotICAvLyBXaWxkY2FyZCBhZGRyZXNzCi0gIGVycm9yID0gZ2V0YWRkcmluZm8oTlVMTCwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7Ci0gIGlmIChlcnJvcikgewotICAgIEdsb2JhbE91dHB1dC5wcmludGYoImdldGFkZHJpbmZvICVkOiAlcyIsIGVycm9yLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBzZXJ2ZXIgc29ja2V0LiIpOwotICB9Ci0KLSAgLy8gUGljayB0aGUgaXB2NiBhZGRyZXNzIGZpcnN0IHNpbmNlIGlwdjQgYWRkcmVzc2VzIGNhbiBiZSBtYXBwZWQKLSAgLy8gaW50byBpcHY2IHNwYWNlLgotICBmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7Ci0gICAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2IHx8IHJlcy0+YWlfbmV4dCA9PSBOVUxMKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKLSAgaWYgKHNlcnZlclNvY2tldF8gPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldCgpICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHNvY2tldC4iLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIFNldCByZXVzYWRkcmVzcyB0byBwcmV2ZW50IDJNU0wgZGVsYXkgb24gYWNjZXB0Ci0gIGludCBvbmUgPSAxOwotICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsCi0gICAgICAgICAgICAgICAgICAgICAgICZvbmUsIHNpemVvZihvbmUpKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JFVVNFQUREUiAiLCBlcnJub19jb3B5KTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX1JFVVNFQUREUiIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKLSAgaWYgKHRjcFNlbmRCdWZmZXJfID4gMCkgewotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmdGNwU2VuZEJ1ZmZlcl8sIHNpemVvZih0Y3BTZW5kQnVmZmVyXykpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0gIH0KLQotICBpZiAodGNwUmVjdkJ1ZmZlcl8gPiAwKSB7Ci0gICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAotICAgICAgICAgICAgICAgICAgICAgICAgICZ0Y3BSZWN2QnVmZmVyXywgc2l6ZW9mKHRjcFJlY3ZCdWZmZXJfKSkpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fUkNWQlVGICIsIGVycm5vX2NvcHkpOwotICAgICAgY2xvc2UoKTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX1JDVkJVRiIsIGVycm5vX2NvcHkpOwotICAgIH0KLSAgfQotCi0gIC8vIERlZmVyIGFjY2VwdAotICAjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAotICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBUQ1BfREVGRVJfQUNDRVBULAotICAgICAgICAgICAgICAgICAgICAgICAmb25lLCBzaXplb2Yob25lKSkpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfREVGRVJfQUNDRVBUICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgVENQX0RFRkVSX0FDQ0VQVCIsIGVycm5vX2NvcHkpOwotICB9Ci0gICNlbmRpZiAvLyAjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAotCi0gICNpZmRlZiBJUFY2X1Y2T05MWQotICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLSAgICBpbnQgemVybyA9IDA7Ci0gICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgCi0gICAgICAgICAgJnplcm8sIHNpemVvZih6ZXJvKSkpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIElQVjZfVjZPTkxZICIsIGVycm5vKTsKLSAgICB9Ci0gIH0KLSAgI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQotCi0gIC8vIFR1cm4gbGluZ2VyIG9mZiwgZG9uJ3Qgd2FudCB0byBibG9jayBvbiBjYWxscyB0byBjbG9zZQotICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07Ci0gIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgJmxpbmcsIHNpemVvZihsaW5nKSkpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgIiwgZXJybm9fY29weSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19MSU5HRVIiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAotICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICZvbmUsIHNpemVvZihvbmUpKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9OT0RFTEFZICIsIGVycm5vX2NvcHkpOwotICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgVENQX05PREVMQVkiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gIC8vIFNldCBOT05CTE9DSyBvbiB0aGUgYWNjZXB0IHNvY2tldAotICBpbnQgZmxhZ3MgPSBmY250bChzZXJ2ZXJTb2NrZXRfLCBGX0dFVEZMLCAwKTsKLSAgaWYgKGZsYWdzID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBmY250bCgpIEZfR0VURkwgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImZjbnRsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICBpZiAoLTEgPT0gZmNudGwoc2VydmVyU29ja2V0XywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgZmNudGwoKSBPX05PTkJMT0NLICIsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJmY250bCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gcHJlcGFyZSB0aGUgcG9ydCBpbmZvcm1hdGlvbgotICAvLyB3ZSBtYXkgd2FudCB0byB0cnkgdG8gYmluZCBtb3JlIHRoYW4gb25jZSwgc2luY2UgU09fUkVVU0VBRERSIGRvZXNuJ3QKLSAgLy8gYWx3YXlzIHNlZW0gdG8gd29yay4gVGhlIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSByZXRyeSB2YXJpYWJsZXMuCi0gIGludCByZXRyaWVzID0gMDsKLSAgZG8gewotICAgIGlmICgwID09IGJpbmQoc2VydmVyU29ja2V0XywgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCi0gIH0gd2hpbGUgKChyZXRyaWVzKysgPCByZXRyeUxpbWl0XykgJiYgKHNsZWVwKHJldHJ5RGVsYXlfKSA9PSAwKSk7Ci0KLSAgLy8gZnJlZSBhZGRyaW5mbwotICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0KLSAgLy8gdGhyb3cgYW4gZXJyb3IgaWYgd2UgZmFpbGVkIHRvIGJpbmQgcHJvcGVybHkKLSAgaWYgKHJldHJpZXMgPiByZXRyeUxpbWl0XykgewotICAgIGNoYXIgZXJyYnVmWzEwMjRdOwotICAgIHNwcmludGYoZXJyYnVmLCAiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgQklORCAlZCIsIHBvcnRfKTsKLSAgICBHbG9iYWxPdXRwdXQoZXJyYnVmKTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgYmluZCIpOwotICB9Ci0KLSAgLy8gQ2FsbCBsaXN0ZW4KLSAgaWYgKC0xID09IDo6bGlzdGVuKHNlcnZlclNvY2tldF8sIGFjY2VwdEJhY2tsb2dfKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgbGlzdGVuKCkgIiwgZXJybm9fY29weSk7Ci0gICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGxpc3RlbiIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gVGhlIHNvY2tldCBpcyBub3cgbGlzdGVuaW5nIQotfQotCi1zaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSB7Ci0gIGlmIChzZXJ2ZXJTb2NrZXRfIDwgMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUU2VydmVyU29ja2V0IG5vdCBsaXN0ZW5pbmciKTsKLSAgfQotCi0gIHN0cnVjdCBwb2xsZmQgZmRzWzJdOwotCi0gIGludCBtYXhFaW50cnMgPSA1OwotICBpbnQgbnVtRWludHJzID0gMDsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHN0ZDo6bWVtc2V0KGZkcywgMCAsIHNpemVvZihmZHMpKTsKLSAgICBmZHNbMF0uZmQgPSBzZXJ2ZXJTb2NrZXRfOwotICAgIGZkc1swXS5ldmVudHMgPSBQT0xMSU47Ci0gICAgaWYgKGludFNvY2syXyA+PSAwKSB7Ci0gICAgICBmZHNbMV0uZmQgPSBpbnRTb2NrMl87Ci0gICAgICBmZHNbMV0uZXZlbnRzID0gUE9MTElOOwotICAgIH0KLSAgICBpbnQgcmV0ID0gcG9sbChmZHMsIDIsIC0xKTsKLQotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAvLyBlcnJvciBjYXNlcwotICAgICAgaWYgKGVycm5vID09IEVJTlRSICYmIChudW1FaW50cnMrKyA8IG1heEVpbnRycykpIHsKLSAgICAgICAgLy8gRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCi0gICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHBvbGwoKSAiLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKLSAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKLSAgICAgIC8vIENoZWNrIGZvciBhbiBpbnRlcnJ1cHQgc2lnbmFsCi0gICAgICBpZiAoaW50U29jazJfID49IDAgJiYgKGZkc1sxXS5yZXZlbnRzICYgUE9MTElOKSkgewotICAgICAgICBpbnQ4X3QgYnVmOwotICAgICAgICBpZiAoLTEgPT0gcmVjdihpbnRTb2NrMl8sICZidWYsIHNpemVvZihpbnQ4X3QpLCAwKSkgewotICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSByZWN2KCkgaW50ZXJydXB0ICIsIGVycm5vKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhY3R1YWwgc2VydmVyIHNvY2tldCBiZWluZyByZWFkeQotICAgICAgaWYgKGZkc1swXS5yZXZlbnRzICYgUE9MTElOKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBwb2xsIDAiKTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7Ci0gICAgfQotICB9Ci0KLSAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgY2xpZW50QWRkcmVzczsKLSAgaW50IHNpemUgPSBzaXplb2YoY2xpZW50QWRkcmVzcyk7Ci0gIGludCBjbGllbnRTb2NrZXQgPSA6OmFjY2VwdChzZXJ2ZXJTb2NrZXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmY2xpZW50QWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb2NrbGVuX3QgKikgJnNpemUpOwotCi0gIGlmIChjbGllbnRTb2NrZXQgPCAwKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgOjphY2NlcHQoKSAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJhY2NlcHQoKSIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgLy8gTWFrZSBzdXJlIGNsaWVudCBzb2NrZXQgaXMgYmxvY2tpbmcKLSAgaW50IGZsYWdzID0gZmNudGwoY2xpZW50U29ja2V0LCBGX0dFVEZMLCAwKTsKLSAgaWYgKGZsYWdzID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgZmNudGwoKSBGX0dFVEZMICIsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgImZjbnRsKEZfR0VURkwpIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICBpZiAoLTEgPT0gZmNudGwoY2xpZW50U29ja2V0LCBGX1NFVEZMLCBmbGFncyAmIH5PX05PTkJMT0NLKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIGZjbnRsKCkgRl9TRVRGTCB+T19OT05CTE9DSyAiLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJmY250bChGX1NFVEZMKSIsIGVycm5vX2NvcHkpOwotICB9Ci0KLSAgc2hhcmVkX3B0cjxUU29ja2V0PiBjbGllbnQobmV3IFRTb2NrZXQoY2xpZW50U29ja2V0KSk7Ci0gIGlmIChzZW5kVGltZW91dF8gPiAwKSB7Ci0gICAgY2xpZW50LT5zZXRTZW5kVGltZW91dChzZW5kVGltZW91dF8pOwotICB9Ci0gIGlmIChyZWN2VGltZW91dF8gPiAwKSB7Ci0gICAgY2xpZW50LT5zZXRSZWN2VGltZW91dChyZWN2VGltZW91dF8pOwotICB9Ci0KLSAgcmV0dXJuIGNsaWVudDsKLX0KLQotdm9pZCBUU2VydmVyU29ja2V0OjppbnRlcnJ1cHQoKSB7Ci0gIGlmIChpbnRTb2NrMV8gPj0gMCkgewotICAgIGludDhfdCBieXRlID0gMDsKLSAgICBpZiAoLTEgPT0gc2VuZChpbnRTb2NrMV8sICZieXRlLCBzaXplb2YoaW50OF90KSwgMCkpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmludGVycnVwdCgpIHNlbmQoKSAiLCBlcnJubyk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVFNlcnZlclNvY2tldDo6Y2xvc2UoKSB7Ci0gIGlmIChzZXJ2ZXJTb2NrZXRfID49IDApIHsKLSAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBTSFVUX1JEV1IpOwotICAgIDo6Y2xvc2Uoc2VydmVyU29ja2V0Xyk7Ci0gIH0KLSAgaWYgKGludFNvY2sxXyA+PSAwKSB7Ci0gICAgOjpjbG9zZShpbnRTb2NrMV8pOwotICB9Ci0gIGlmIChpbnRTb2NrMl8gPj0gMCkgewotICAgIDo6Y2xvc2UoaW50U29jazJfKTsKLSAgfQotICBzZXJ2ZXJTb2NrZXRfID0gLTE7Ci0gIGludFNvY2sxXyA9IC0xOwotICBpbnRTb2NrMl8gPSAtMTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJlMDE3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfIDEKLQotI2luY2x1ZGUgIlRTZXJ2ZXJUcmFuc3BvcnQuaCIKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotY2xhc3MgVFNvY2tldDsKLQotLyoqCi0gKiBTZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQuIFdyYXBwZXIgYXJvdW5kIGEgdW5peAotICogc29ja2V0IGxpc3RlbiBhbmQgYWNjZXB0IGNhbGxzLgotICoKLSAqLwotY2xhc3MgVFNlcnZlclNvY2tldCA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOwotICBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCk7Ci0KLSAgflRTZXJ2ZXJTb2NrZXQoKTsKLQotICB2b2lkIHNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCk7Ci0gIHZvaWQgc2V0UmVjdlRpbWVvdXQoaW50IHJlY3ZUaW1lb3V0KTsKLQotICB2b2lkIHNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpOwotICB2b2lkIHNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpOwotCi0gIHZvaWQgc2V0VGNwU2VuZEJ1ZmZlcihpbnQgdGNwU2VuZEJ1ZmZlcik7Ci0gIHZvaWQgc2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcik7Ci0KLSAgdm9pZCBsaXN0ZW4oKTsKLSAgdm9pZCBjbG9zZSgpOwotCi0gIHZvaWQgaW50ZXJydXB0KCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKLQotIHByaXZhdGU6Ci0gIGludCBwb3J0XzsKLSAgaW50IHNlcnZlclNvY2tldF87Ci0gIGludCBhY2NlcHRCYWNrbG9nXzsKLSAgaW50IHNlbmRUaW1lb3V0XzsKLSAgaW50IHJlY3ZUaW1lb3V0XzsKLSAgaW50IHJldHJ5TGltaXRfOwotICBpbnQgcmV0cnlEZWxheV87Ci0gIGludCB0Y3BTZW5kQnVmZmVyXzsKLSAgaW50IHRjcFJlY3ZCdWZmZXJfOwotCi0gIGludCBpbnRTb2NrMV87Ci0gIGludCBpbnRTb2NrMl87Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiYmM2Yy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlICJUVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIFNlcnZlciB0cmFuc3BvcnQgZnJhbWV3b3JrLiBBIHNlcnZlciBuZWVkcyB0byBoYXZlIHNvbWUgZmFjaWxpdHkgZm9yCi0gKiBjcmVhdGluZyBiYXNlIHRyYW5zcG9ydHMgdG8gcmVhZC93cml0ZSBmcm9tLgotICoKLSAqLwotY2xhc3MgVFNlcnZlclRyYW5zcG9ydCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UU2VydmVyVHJhbnNwb3J0KCkge30KLQotICAvKioKLSAgICogU3RhcnRzIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLiBQcmlvciB0byB0aGlzCi0gICAqIGNhbGwgbW9zdCB0cmFuc3BvcnRzIHdpbGwgbm90IHJldHVybiBhbnl0aGluZyB3aGVuIGFjY2VwdCBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBsaXN0ZW4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKSB7fQotCi0gIC8qKgotICAgKiBHZXRzIGEgbmV3IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0cmFuc3BvcnQgb2JqZWN0IGFuZCBwYXNzZXMgaXQgdG8gdGhlCi0gICAqIGNhbGxlci4gTm90ZSB0aGF0IGl0IGlzIHRoZSBleHBsaWNpdCBkdXR5IG9mIHRoZSBjYWxsZXIgdG8gZnJlZSB0aGUKLSAgICogYWxsb2NhdGVkIG9iamVjdC4gVGhlIHJldHVybmVkIFRUcmFuc3BvcnQgb2JqZWN0IG11c3QgYWx3YXlzIGJlIGluIHRoZQotICAgKiBvcGVuZWQgc3RhdGUuIE5VTEwgc2hvdWxkIG5ldmVyIGJlIHJldHVybmVkLCBpbnN0ZWFkIGFuIEV4Y2VwdGlvbiBzaG91bGQKLSAgICogYWx3YXlzIGJlIHRocm93bi4KLSAgICoKLSAgICogQHJldHVybiBBIG5ldyBUVHJhbnNwb3J0IG9iamVjdAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKLSAgICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdCgpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiByZXN1bHQgPSBhY2NlcHRJbXBsKCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogRm9yICJzbWFydCIgVFNlcnZlclRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3b3JrIGluIGEgbXVsdGkKLSAgICogdGhyZWFkZWQgY29udGV4dCB0aGlzIGNhbiBiZSB1c2VkIHRvIGJyZWFrIG91dCBvZiBhbiBhY2NlcHQoKSBjYWxsLgotICAgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSB0cmFuc3BvcnQgd2lsbCB0aHJvdyBhIFRUcmFuc3BvcnRFeGNlcHRpb24KLSAgICogd2l0aCB0aGUgaW50ZXJydXB0ZWQgZXJyb3IgY29kZS4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSB7fQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhpcyB0cmFuc3BvcnQgc3VjaCB0aGF0IGZ1dHVyZSBjYWxscyB0byBhY2NlcHQgd2lsbCBkbyBub3RoaW5nLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOwotCi0gcHJvdGVjdGVkOgotICBUU2VydmVyVHJhbnNwb3J0KCkge30KLQotICAvKioKLSAgICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gZm9yIGFjY2VwdC4KLSAgICoKLSAgICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCBUVHJhbnNwb3J0IG9iamVjdAotICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKLSAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjhhNTcuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0hPUlRSRUFEVFJBTlNQT1JUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTSE9SVFJFQURUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLQotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7IG5hbWVzcGFjZSB0ZXN0IHsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcuICBJdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydC4KLSAqIENhbGxzIHRvIHJlYWQgYXJlIHBhc3NlZCB0aHJvdWdoIHdpdGggc29tZSBwcm9iYWJpbGl0eS4gIE90aGVyd2lzZSwKLSAqIHRoZSByZWFkIGFtb3VudCBpcyByYW5kb21seSByZWR1Y2VkIGJlZm9yZSBiZWluZyBwYXNzZWQgdGhyb3VnaC4KLSAqCi0gKi8KLWNsYXNzIFRTaG9ydFJlYWRUcmFuc3BvcnQgOiBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUU2hvcnRSZWFkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgZG91YmxlIGZ1bGxfcHJvYikKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgZnVsbFByb2JfKGZ1bGxfcHJvYikKLSAge30KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBib29sIHBlZWsoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPnBlZWsoKTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHsKLSAgICB0cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICB2b2lkIGNsb3NlKCkgewotICAgIHRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAocmFuZCgpLyhkb3VibGUpUkFORF9NQVggPj0gZnVsbFByb2JfKSB7Ci0gICAgICBsZW4gPSAxICsgcmFuZCgpJWxlbjsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPnJlYWQoYnVmLCBsZW4pOwotICB9Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHRyYW5zcG9ydF8tPndyaXRlKGJ1ZiwgbGVuKTsKLSAgfQotCi0gIHZvaWQgZmx1c2goKSB7Ci0gICAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+Ym9ycm93KGJ1ZiwgbGVuKTsKLSAgfQotCi0gIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+Y29uc3VtZShsZW4pOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0XzsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwotICBkb3VibGUgZnVsbFByb2JfOwotfTsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojp0ZXN0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTSE9SVFJFQURUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNThhNTc0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJUU2ltcGxlRmlsZVRyYW5zcG9ydC5oIgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi1UU2ltcGxlRmlsZVRyYW5zcG9ydDo6Ci1UU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgYm9vbCByZWFkLCBib29sIHdyaXRlKQotICAgIDogVEZEVHJhbnNwb3J0KC0xLCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpIHsKLSAgaW50IGZsYWdzID0gMDsKLSAgaWYgKHJlYWQgJiYgd3JpdGUpIHsKLSAgICBmbGFncyA9IE9fUkRXUjsKLSAgfSBlbHNlIGlmIChyZWFkKSB7Ci0gICAgZmxhZ3MgPSBPX1JET05MWTsKLSAgfSBlbHNlIGlmICh3cml0ZSkgewotICAgIGZsYWdzID0gT19XUk9OTFk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTmVpdGhlciBSRUFEIG5vciBXUklURSBzcGVjaWZpZWQiKTsKLSAgfQotICBpZiAod3JpdGUpIHsKLSAgICBmbGFncyB8PSBPX0NSRUFUIHwgT19BUFBFTkQ7Ci0gIH0KLSAgaW50IGZkID0gOjpvcGVuKHBhdGguY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1J8IFNfSVJHUlAgfCBTX0lST1RIKTsKLSAgaWYgKGZkIDwgMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oImZhaWxlZCB0byBvcGVuIGZpbGUgZm9yIHdyaXRpbmc6ICIgKyBwYXRoKTsKLSAgfQotICBzZXRGRChmZCk7Ci0gIG9wZW4oKTsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzUyZWEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNJTVBMRUZJTEVUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNJTVBMRUZJTEVUUkFOU1BPUlRfSF8gMQotCi0jaW5jbHVkZSAiVEZEVHJhbnNwb3J0LmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLS8qKgotICogRGVhZC1zaW1wbGUgd3JhcHBlciBhcm91bmQgYSBmaWxlLgotICoKLSAqIFdyaXRlYWJsZSBmaWxlcyBhcmUgb3BlbmVkIHdpdGggT19DUkVBVCBhbmQgT19BUFBFTkQKLSAqLwotY2xhc3MgVFNpbXBsZUZpbGVUcmFuc3BvcnQgOiBwdWJsaWMgVEZEVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRTaW1wbGVGaWxlVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWQgPSAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSA9IGZhbHNlKTsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAgX1RIUklGVF9UUkFOU1BPUlRfVFNJTVBMRUZJTEVUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxZGRjYi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaW5jbHVkZSAiY29uY3VycmVuY3kvTW9uaXRvci5oIgotI2luY2x1ZGUgIlRTb2NrZXQuaCIKLSNpbmNsdWRlICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8vIEdsb2JhbCB2YXIgdG8gdHJhY2sgdG90YWwgc29ja2V0IHN5cyBjYWxscwotdWludDMyX3QgZ19zb2NrZXRfc3lzY2FsbHMgPSAwOwotCi0vKioKLSAqIFRTb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gKgotICovCi0KLVRTb2NrZXQ6OlRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0KSA6Ci0gIGhvc3RfKGhvc3QpLAotICBwb3J0Xyhwb3J0KSwKLSAgc29ja2V0XygtMSksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGxpbmdlck9uXygxKSwKLSAgbGluZ2VyVmFsXygwKSwKLSAgbm9EZWxheV8oMSksCi0gIG1heFJlY3ZSZXRyaWVzXyg1KSB7Ci0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKLX0KLQotVFNvY2tldDo6VFNvY2tldCgpIDoKLSAgaG9zdF8oIiIpLAotICBwb3J0XygwKSwKLSAgc29ja2V0XygtMSksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGxpbmdlck9uXygxKSwKLSAgbGluZ2VyVmFsXygwKSwKLSAgbm9EZWxheV8oMSksCi0gIG1heFJlY3ZSZXRyaWVzXyg1KSB7Ci0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKLX0KLQotVFNvY2tldDo6VFNvY2tldChpbnQgc29ja2V0KSA6Ci0gIGhvc3RfKCIiKSwKLSAgcG9ydF8oMCksCi0gIHNvY2tldF8oc29ja2V0KSwKLSAgY29ublRpbWVvdXRfKDApLAotICBzZW5kVGltZW91dF8oMCksCi0gIHJlY3ZUaW1lb3V0XygwKSwKLSAgbGluZ2VyT25fKDEpLAotICBsaW5nZXJWYWxfKDApLAotICBub0RlbGF5XygxKSwKLSAgbWF4UmVjdlJldHJpZXNfKDUpIHsKLSAgcmVjdlRpbWV2YWxfLnR2X3NlYyA9IChpbnQpKHJlY3ZUaW1lb3V0Xy8xMDAwKTsKLSAgcmVjdlRpbWV2YWxfLnR2X3VzZWMgPSAoaW50KSgocmVjdlRpbWVvdXRfJTEwMDApKjEwMDApOwotfQotCi1UU29ja2V0Ojp+VFNvY2tldCgpIHsKLSAgY2xvc2UoKTsKLX0KLQotYm9vbCBUU29ja2V0Ojppc09wZW4oKSB7Ci0gIHJldHVybiAoc29ja2V0XyA+PSAwKTsKLX0KLQotYm9vbCBUU29ja2V0OjpwZWVrKCkgewotICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVpbnQ4X3QgYnVmOwotICBpbnQgciA9IHJlY3Yoc29ja2V0XywgJmJ1ZiwgMSwgTVNHX1BFRUspOwotICBpZiAociA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgI2lmIGRlZmluZWQgX19GcmVlQlNEX18gfHwgZGVmaW5lZCBfX01BQ0hfXwotICAgIC8qIHNoaWdpbjoKLSAgICAgKiBmcmVlYnNkIHJldHVybnMgLTEgYW5kIEVDT05OUkVTRVQgaWYgc29ja2V0IHdhcyBjbG9zZWQgYnkgCi0gICAgICogdGhlIG90aGVyIHNpZGUKLSAgICAgKi8KLSAgICBpZiAoZXJybm9fY29weSA9PSBFQ09OTlJFU0VUKQotICAgIHsKLSAgICAgIGNsb3NlKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgICNlbmRpZgotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnBlZWsoKSByZWN2KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAicmVjdigpIiwgZXJybm9fY29weSk7Ci0gIH0KLSAgcmV0dXJuIChyID4gMCk7Ci19Ci0KLXZvaWQgVFNvY2tldDo6b3BlbkNvbm5lY3Rpb24oc3RydWN0IGFkZHJpbmZvICpyZXMpIHsKLSAgaWYgKGlzT3BlbigpKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pOwotICB9Ci0KLSAgc29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7Ci0gIGlmIChzb2NrZXRfID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgc29ja2V0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgInNvY2tldCgpIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICAvLyBTZW5kIHRpbWVvdXQKLSAgaWYgKHNlbmRUaW1lb3V0XyA+IDApIHsKLSAgICBzZXRTZW5kVGltZW91dChzZW5kVGltZW91dF8pOwotICB9Ci0KLSAgLy8gUmVjdiB0aW1lb3V0Ci0gIGlmIChyZWN2VGltZW91dF8gPiAwKSB7Ci0gICAgc2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKLSAgfQotCi0gIC8vIExpbmdlcgotICBzZXRMaW5nZXIobGluZ2VyT25fLCBsaW5nZXJWYWxfKTsKLQotICAvLyBObyBkZWxheQotICBzZXROb0RlbGF5KG5vRGVsYXlfKTsKLQotICAvLyBVc2VzIGEgbG93IG1pbiBSVE8gaWYgYXNrZWQgdG8uCi0jaWZkZWYgVENQX0xPV19NSU5fUlRPCi0gIGlmIChnZXRVc2VMb3dNaW5SdG8oKSkgewotICAgIGludCBvbmUgPSAxOwotICAgIHNldHNvY2tvcHQoc29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9MT1dfTUlOX1JUTywgJm9uZSwgc2l6ZW9mKG9uZSkpOwotICB9Ci0jZW5kaWYKLQotCi0gIC8vIFNldCB0aGUgc29ja2V0IHRvIGJlIG5vbiBibG9ja2luZyBmb3IgY29ubmVjdCBpZiBhIHRpbWVvdXQgZXhpc3RzCi0gIGludCBmbGFncyA9IGZjbnRsKHNvY2tldF8sIEZfR0VURkwsIDApOwotICBpZiAoY29ublRpbWVvdXRfID4gMCkgewotICAgIGlmICgtMSA9PSBmY250bChzb2NrZXRfLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGZjbnRsKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiZmNudGwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKC0xID09IGZjbnRsKHNvY2tldF8sIEZfU0VURkwsIGZsYWdzICYgfk9fTk9OQkxPQ0spKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGZjbnRsICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImZjbnRsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29ubmVjdCB0aGUgc29ja2V0Ci0gIGludCByZXQgPSBjb25uZWN0KHNvY2tldF8sIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKTsKLQotICAvLyBzdWNjZXNzIGNhc2UKLSAgaWYgKHJldCA9PSAwKSB7Ci0gICAgZ290byBkb25lOwotICB9Ci0KLSAgaWYgKGVycm5vICE9IEVJTlBST0dSRVNTKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgY29ubmVjdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJjb25uZWN0KCkgZmFpbGVkIiwgZXJybm9fY29weSk7Ci0gIH0KLQotCi0gIHN0cnVjdCBwb2xsZmQgZmRzWzFdOwotICBzdGQ6Om1lbXNldChmZHMsIDAgLCBzaXplb2YoZmRzKSk7Ci0gIGZkc1swXS5mZCA9IHNvY2tldF87Ci0gIGZkc1swXS5ldmVudHMgPSBQT0xMT1VUOwotICByZXQgPSBwb2xsKGZkcywgMSwgY29ublRpbWVvdXRfKTsKLQotICBpZiAocmV0ID4gMCkgewotICAgIC8vIEVuc3VyZSB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gZXJyb3JzIHNldAotICAgIGludCB2YWw7Ci0gICAgc29ja2xlbl90IGxvbjsKLSAgICBsb24gPSBzaXplb2YoaW50KTsKLSAgICBpbnQgcmV0MiA9IGdldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fRVJST1IsICh2b2lkICopJnZhbCwgJmxvbik7Ci0gICAgaWYgKHJldDIgPT0gLTEpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgZ2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImdldHNvY2tvcHQoKSIsIGVycm5vX2NvcHkpOwotICAgIH0KLSAgICAvLyBubyBlcnJvcnMgb24gc29ja2V0LCBnbyB0byB0b3duCi0gICAgaWYgKHZhbCA9PSAwKSB7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBlcnJvciBvbiBzb2NrZXQgKGFmdGVyIHBvbGwpICIgKyBnZXRTb2NrZXRJbmZvKCksIHZhbCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgInNvY2tldCBvcGVuKCkgZXJyb3IiLCB2YWwpOwotICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7Ci0gICAgLy8gc29ja2V0IHRpbWVkIG91dAotICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldDo6b3BlbigpIHRpbWVkIG91dCAiICsgZ2V0U29ja2V0SW5mbygpOwotICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIm9wZW4oKSB0aW1lZCBvdXQiKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBlcnJvciBvbiBwb2xsKCkKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBwb2xsKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgInBvbGwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKLSAgfQotCi0gZG9uZToKLSAgLy8gU2V0IHNvY2tldCBiYWNrIHRvIG5vcm1hbCBtb2RlIChibG9ja2luZykKLSAgZmNudGwoc29ja2V0XywgRl9TRVRGTCwgZmxhZ3MpOwotfQotCi12b2lkIFRTb2NrZXQ6Om9wZW4oKSB7Ci0gIGlmIChpc09wZW4oKSkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKTsKLSAgfQotCi0gIC8vIFZhbGlkYXRlIHBvcnQgbnVtYmVyCi0gIGlmIChwb3J0XyA8IDAgfHwgcG9ydF8gPiAweEZGRkYpIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCIpOwotICB9Ci0KLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKLSAgcmVzID0gTlVMTDsKLSAgcmVzMCA9IE5VTEw7Ci0gIGludCBlcnJvcjsKLSAgY2hhciBwb3J0W3NpemVvZigiNjU1MzUiKV07Ci0gIHN0ZDo6bWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0gIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLSAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLSAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKLSAgc3ByaW50Zihwb3J0LCAiJWQiLCBwb3J0Xyk7Ci0KLSAgZXJyb3IgPSBnZXRhZGRyaW5mbyhob3N0Xy5jX3N0cigpLCBwb3J0LCAmaGludHMsICZyZXMwKTsKLQotICBpZiAoZXJyb3IpIHsKLSAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXQ6Om9wZW4oKSBnZXRhZGRyaW5mbygpICIgKyBnZXRTb2NrZXRJbmZvKCkgKyBzdHJpbmcoZ2FpX3N0cmVycm9yKGVycm9yKSk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBjbGllbnQgc29ja2V0LiIpOwotICB9Ci0KLSAgLy8gQ3ljbGUgdGhyb3VnaCBhbGwgdGhlIHJldHVybmVkIGFkZHJlc3NlcyB1bnRpbCBvbmUKLSAgLy8gY29ubmVjdHMgb3IgcHVzaCB0aGUgZXhjZXB0aW9uIHVwLgotICBmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7Ci0gICAgdHJ5IHsKLSAgICAgIG9wZW5Db25uZWN0aW9uKHJlcyk7Ci0gICAgICBicmVhazsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIGlmIChyZXMtPmFpX25leHQpIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsgLy8gY2xlYW51cCBvbiBmYWlsdXJlCi0gICAgICAgIHRocm93OwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIEZyZWUgYWRkcmVzcyBzdHJ1Y3R1cmUgbWVtb3J5Ci0gIGZyZWVhZGRyaW5mbyhyZXMwKTsKLX0KLQotdm9pZCBUU29ja2V0OjpjbG9zZSgpIHsKLSAgaWYgKHNvY2tldF8gPj0gMCkgewotICAgIHNodXRkb3duKHNvY2tldF8sIFNIVVRfUkRXUik7Ci0gICAgOjpjbG9zZShzb2NrZXRfKTsKLSAgfQotICBzb2NrZXRfID0gLTE7Ci19Ci0KLXVpbnQzMl90IFRTb2NrZXQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgaWYgKHNvY2tldF8gPCAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHNvY2tldCIpOwotICB9Ci0KLSAgaW50MzJfdCByZXRyaWVzID0gMDsKLQotICAvLyBFQUdBSU4gY2FuIGJlIHNpZ25hbGxlZCBib3RoIHdoZW4gYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCBhbmQgd2hlbgotICAvLyB0aGUgc3lzdGVtIGlzIG91dCBvZiByZXNvdXJjZXMgKGFuIGF3ZXNvbWUgdW5kb2N1bWVudGVkIGZlYXR1cmUpLgotICAvLyBUaGUgZm9sbG93aW5nIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHRpbWUgaW50ZXJ2YWwgdW5kZXIgd2hpY2gKLSAgLy8gRUFHQUlOIGlzIHRha2VuIHRvIGluZGljYXRlIGFuIG91dCBvZiByZXNvdXJjZXMgZXJyb3IuCi0gIHVpbnQzMl90IGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IDA7Ci0gIGlmIChyZWN2VGltZW91dF8pIHsKLSAgICAvLyBpZiBhIHJlYWRUaW1lb3V0IGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGEgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMsIHRoZW4KLSAgICAvLyB0aGUgdGhyZXNob2xkIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlYWQgdGltZW91dCBpcyBub3QgZXhjZWVkZWQgZXZlbiBpbiB0aGUKLSAgICAvLyBjYXNlIG9mIHJlc291cmNlIGVycm9ycwotICAgIGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IChyZWN2VGltZW91dF8qMTAwMCkvICgobWF4UmVjdlJldHJpZXNfPjApID8gbWF4UmVjdlJldHJpZXNfIDogMik7Ci0gIH0KLQotIHRyeV9hZ2FpbjoKLSAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKLSAgc3RydWN0IHRpbWV2YWwgYmVnaW47Ci0gIGdldHRpbWVvZmRheSgmYmVnaW4sIE5VTEwpOwotICBpbnQgZ290ID0gcmVjdihzb2NrZXRfLCBidWYsIGxlbiwgMCk7Ci0gIGludCBlcnJub19jb3B5ID0gZXJybm87IC8vZ2V0dGltZW9mZGF5IGNhbiBjaGFuZ2UgZXJybm8KLSAgKytnX3NvY2tldF9zeXNjYWxsczsKLQotICAvLyBDaGVjayBmb3IgZXJyb3Igb24gcmVhZAotICBpZiAoZ290IDwgMCkgewotICAgIGlmIChlcnJub19jb3B5ID09IEVBR0FJTikgewotICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFjayBvZiByZXNvdXJjZXMgb3IgdGltZW91dCBjYXNlCi0gICAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7Ci0gICAgICBnZXR0aW1lb2ZkYXkoJmVuZCwgTlVMTCk7Ci0gICAgICB1aW50MzJfdCByZWFkRWxhcHNlZE1pY3JvcyA9ICAoKChlbmQudHZfc2VjIC0gYmVnaW4udHZfc2VjKSAqIDEwMDAgKiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgodWludDY0X3QpKGVuZC50dl91c2VjIC0gYmVnaW4udHZfdXNlYykpKSk7Ci0KLSAgICAgIGlmICghZWFnYWluVGhyZXNob2xkTWljcm9zIHx8IChyZWFkRWxhcHNlZE1pY3JvcyA8IGVhZ2FpblRocmVzaG9sZE1pY3JvcykpIHsKLSAgICAgICAgaWYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykgewotICAgICAgICAgIHVzbGVlcCg1MCk7Ci0gICAgICAgICAgZ290byB0cnlfYWdhaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpIik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGluZmVyIHRoYXQgdGltZW91dCBoYXMgYmVlbiBoaXQKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVBR0FJTiAodGltZWQgb3V0KSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIGludGVycnVwdGVkLCB0cnkgYWdhaW4KLSAgICBpZiAoZXJybm9fY29weSA9PSBFSU5UUiAmJiByZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pIHsKLSAgICAgIGdvdG8gdHJ5X2FnYWluOwotICAgIH0KLQotICAgICNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KLSAgICBpZiAoZXJybm9fY29weSA9PSBFQ09OTlJFU0VUKSB7Ci0gICAgICAvKiBzaGlnaW46IGZyZWVic2QgZG9lc24ndCBmb2xsb3cgUE9TSVggc2VtYW50aWMgb2YgcmVjdiBhbmQgZmFpbHMgd2l0aAotICAgICAgICogRUNPTk5SRVNFVCBpZiBwZWVyIHBlcmZvcm1lZCBzaHV0ZG93biAKLSAgICAgICAqLwotICAgICAgY2xvc2UoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAjZW5kaWYKLQotICAgIC8vIE5vdyBpdCdzIG5vdCBhIHRyeSBhZ2FpbiBjYXNlLCBidXQgYSByZWFsIHByb2JibGV6Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIHJlY3YoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLQotICAgIC8vIElmIHdlIGRpc2Nvbm5lY3Qgd2l0aCBubyBsaW5nZXIgdGltZQotICAgIGlmIChlcnJub19jb3B5ID09IEVDT05OUkVTRVQpIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJFQ09OTlJFU0VUIik7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpc2ggaXNuJ3Qgb3BlbgotICAgIGlmIChlcnJub19jb3B5ID09IEVOT1RDT05OKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiRU5PVENPTk4iKTsKLSAgICB9Ci0KLSAgICAvLyBUaW1lZCBvdXQhCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRVRJTUVET1VUKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIkVUSU1FRE9VVCIpOwotICAgIH0KLQotICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IsIHdoYXRldnoKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7Ci0gIH0KLQotICAvLyBUaGUgcmVtb3RlIGhvc3QgaGFzIGNsb3NlZCB0aGUgc29ja2V0Ci0gIGlmIChnb3QgPT0gMCkgewotICAgIGNsb3NlKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBQYWNrIGRhdGEgaW50byBzdHJpbmcKLSAgcmV0dXJuIGdvdDsKLX0KLQotdm9pZCBUU29ja2V0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBpZiAoc29ja2V0XyA8IDApIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHNvY2tldCIpOwotICB9Ci0KLSAgdWludDMyX3Qgc2VudCA9IDA7Ci0KLSAgd2hpbGUgKHNlbnQgPCBsZW4pIHsKLQotICAgIGludCBmbGFncyA9IDA7Ci0gICAgI2lmZGVmIE1TR19OT1NJR05BTAotICAgIC8vIE5vdGUgdGhlIHVzZSBvZiBNU0dfTk9TSUdOQUwgdG8gc3VwcHJlc3MgU0lHUElQRSBlcnJvcnMsIGluc3RlYWQgd2UKLSAgICAvLyBjaGVjayBmb3IgdGhlIEVQSVBFIHJldHVybiBjb25kaXRpb24gYW5kIGNsb3NlIHRoZSBzb2NrZXQgaW4gdGhhdCBjYXNlCi0gICAgZmxhZ3MgfD0gTVNHX05PU0lHTkFMOwotICAgICNlbmRpZiAvLyBpZmRlZiBNU0dfTk9TSUdOQUwKLQotICAgIGludCBiID0gc2VuZChzb2NrZXRfLCBidWYgKyBzZW50LCBsZW4gLSBzZW50LCBmbGFncyk7Ci0gICAgKytnX3NvY2tldF9zeXNjYWxsczsKLQotICAgIC8vIEZhaWwgb24gYSBzZW5kIGVycm9yCi0gICAgaWYgKGIgPCAwKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6d3JpdGUoKSBzZW5kKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0KLSAgICAgIGlmIChlcnJubyA9PSBFUElQRSB8fCBlcnJubyA9PSBFQ09OTlJFU0VUIHx8IGVycm5vID09IEVOT1RDT05OKSB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJ3cml0ZSgpIHNlbmQoKSIsIGVycm5vX2NvcHkpOwotICAgICAgfQotCi0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJ3cml0ZSgpIHNlbmQoKSIsIGVycm5vX2NvcHkpOwotICAgIH0KLQotICAgIC8vIEZhaWwgb24gYmxvY2tlZCBzZW5kCi0gICAgaWYgKGIgPT0gMCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlNvY2tldCBzZW5kIHJldHVybmVkIDAuIik7Ci0gICAgfQotICAgIHNlbnQgKz0gYjsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyBUU29ja2V0OjpnZXRIb3N0KCkgewotICByZXR1cm4gaG9zdF87Ci19Ci0KLWludCBUU29ja2V0OjpnZXRQb3J0KCkgewotICByZXR1cm4gcG9ydF87Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0SG9zdChzdHJpbmcgaG9zdCkgewotICBob3N0XyA9IGhvc3Q7Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0UG9ydChpbnQgcG9ydCkgewotICBwb3J0XyA9IHBvcnQ7Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0TGluZ2VyKGJvb2wgb24sIGludCBsaW5nZXIpIHsKLSAgbGluZ2VyT25fID0gb247Ci0gIGxpbmdlclZhbF8gPSBsaW5nZXI7Ci0gIGlmIChzb2NrZXRfIDwgMCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cnVjdCBsaW5nZXIgbCA9IHsobGluZ2VyT25fID8gMSA6IDApLCBsaW5nZXJWYWxffTsKLSAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAmbCwgc2l6ZW9mKGwpKTsKLSAgaWYgKHJldCA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87ICAvLyBDb3B5IGVycm5vIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0TGluZ2VyKCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICB9Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0Tm9EZWxheShib29sIG5vRGVsYXkpIHsKLSAgbm9EZWxheV8gPSBub0RlbGF5OwotICBpZiAoc29ja2V0XyA8IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBTZXQgc29ja2V0IHRvIE5PREVMQVkKLSAgaW50IHYgPSBub0RlbGF5XyA/IDEgOiAwOwotICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZ2LCBzaXplb2YodikpOwotICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsgIC8vIENvcHkgZXJybm8gYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXROb0RlbGF5KCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwotICB9Ci19Ci0KLXZvaWQgVFNvY2tldDo6c2V0Q29ublRpbWVvdXQoaW50IG1zKSB7Ci0gIGNvbm5UaW1lb3V0XyA9IG1zOwotfQotCi12b2lkIFRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCBtcykgewotICBpZiAobXMgPCAwKSB7Ci0gICAgY2hhciBlcnJCdWZbNTEyXTsKLSAgICBzcHJpbnRmKGVyckJ1ZiwgIlRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0IHdpdGggbmVnYXRpdmUgaW5wdXQ6ICVkXG4iLCBtcyk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyckJ1Zik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHJlY3ZUaW1lb3V0XyA9IG1zOwotCi0gIGlmIChzb2NrZXRfIDwgMCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKLQotICAvLyBDb3B5IGJlY2F1c2UgcG9sbCBtYXkgbW9kaWZ5Ci0gIHN0cnVjdCB0aW1ldmFsIHIgPSByZWN2VGltZXZhbF87Ci0gIGludCByZXQgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCAmciwgc2l6ZW9mKHIpKTsKLSAgaWYgKHJldCA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87ICAvLyBDb3B5IGVycm5vIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0OjpzZXRTZW5kVGltZW91dChpbnQgbXMpIHsKLSAgaWYgKG1zIDwgMCkgewotICAgIGNoYXIgZXJyQnVmWzUxMl07Ci0gICAgc3ByaW50ZihlcnJCdWYsICJUU29ja2V0OjpzZXRTZW5kVGltZW91dCB3aXRoIG5lZ2F0aXZlIGlucHV0OiAlZFxuIiwgbXMpOwotICAgIEdsb2JhbE91dHB1dChlcnJCdWYpOwotICAgIHJldHVybjsKLSAgfQotICBzZW5kVGltZW91dF8gPSBtczsKLQotICBpZiAoc29ja2V0XyA8IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJ1Y3QgdGltZXZhbCBzID0geyhpbnQpKHNlbmRUaW1lb3V0Xy8xMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoc2VuZFRpbWVvdXRfJTEwMDApKjEwMDApfTsKLSAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fU05EVElNRU8sICZzLCBzaXplb2YocykpOwotICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsgIC8vIENvcHkgZXJybm8gYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRTZW5kVGltZW91dCgpIHNldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgfQotfQotCi12b2lkIFRTb2NrZXQ6OnNldE1heFJlY3ZSZXRyaWVzKGludCBtYXhSZWN2UmV0cmllcykgewotICBtYXhSZWN2UmV0cmllc18gPSBtYXhSZWN2UmV0cmllczsKLX0KLQotc3RyaW5nIFRTb2NrZXQ6OmdldFNvY2tldEluZm8oKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7Ci0gIG9zcyA8PCAiPEhvc3Q6ICIgPDwgaG9zdF8gPDwgIiBQb3J0OiAiIDw8IHBvcnRfIDw8ICI+IjsKLSAgcmV0dXJuIG9zcy5zdHIoKTsKLX0KLQotc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0UGVlckhvc3QoKSB7Ci0gIGlmIChwZWVySG9zdF8uZW1wdHkoKSkgewotICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7Ci0gICAgc29ja2xlbl90IGFkZHJMZW4gPSBzaXplb2YoYWRkcik7Ci0KLSAgICBpZiAoc29ja2V0XyA8IDApIHsKLSAgICAgIHJldHVybiBob3N0XzsKLSAgICB9Ci0KLSAgICBpbnQgcnYgPSBnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSAmYWRkciwgJmFkZHJMZW4pOwotCi0gICAgaWYgKHJ2ICE9IDApIHsKLSAgICAgIHJldHVybiBwZWVySG9zdF87Ci0gICAgfQotCi0gICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOwotICAgIGNoYXIgY2xpZW50c2VydmljZVtOSV9NQVhTRVJWXTsKLQotICAgIGdldG5hbWVpbmZvKChzb2NrYWRkciopICZhZGRyLCBhZGRyTGVuLAotICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsIHNpemVvZihjbGllbnRob3N0KSwKLSAgICAgICAgICAgICAgICBjbGllbnRzZXJ2aWNlLCBzaXplb2YoY2xpZW50c2VydmljZSksIDApOwotCi0gICAgcGVlckhvc3RfID0gY2xpZW50aG9zdDsKLSAgfQotICByZXR1cm4gcGVlckhvc3RfOwotfQotCi1zdGQ6OnN0cmluZyBUU29ja2V0OjpnZXRQZWVyQWRkcmVzcygpIHsKLSAgaWYgKHBlZXJBZGRyZXNzXy5lbXB0eSgpKSB7Ci0gICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKLSAgICBzb2NrbGVuX3QgYWRkckxlbiA9IHNpemVvZihhZGRyKTsKLQotICAgIGlmIChzb2NrZXRfIDwgMCkgewotICAgICAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKLSAgICB9Ci0KLSAgICBpbnQgcnYgPSBnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSAmYWRkciwgJmFkZHJMZW4pOwotCi0gICAgaWYgKHJ2ICE9IDApIHsKLSAgICAgIHJldHVybiBwZWVyQWRkcmVzc187Ci0gICAgfQotCi0gICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOwotICAgIGNoYXIgY2xpZW50c2VydmljZVtOSV9NQVhTRVJWXTsKLQotICAgIGdldG5hbWVpbmZvKChzb2NrYWRkciopICZhZGRyLCBhZGRyTGVuLAotICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsIHNpemVvZihjbGllbnRob3N0KSwKLSAgICAgICAgICAgICAgICBjbGllbnRzZXJ2aWNlLCBzaXplb2YoY2xpZW50c2VydmljZSksCi0gICAgICAgICAgICAgICAgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpOwotCi0gICAgcGVlckFkZHJlc3NfID0gY2xpZW50aG9zdDsKLSAgICBwZWVyUG9ydF8gPSBzdGQ6OmF0b2koY2xpZW50c2VydmljZSk7Ci0gIH0KLSAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKLX0KLQotaW50IFRTb2NrZXQ6OmdldFBlZXJQb3J0KCkgewotICBnZXRQZWVyQWRkcmVzcygpOwotICByZXR1cm4gcGVlclBvcnRfOwotfQotCi1ib29sIFRTb2NrZXQ6OnVzZUxvd01pblJ0b18gPSBmYWxzZTsKLXZvaWQgVFNvY2tldDo6c2V0VXNlTG93TWluUnRvKGJvb2wgdXNlTG93TWluUnRvKSB7Ci0gIHVzZUxvd01pblJ0b18gPSB1c2VMb3dNaW5SdG87Ci19Ci1ib29sIFRTb2NrZXQ6OmdldFVzZUxvd01pblJ0bygpIHsKLSAgcmV0dXJuIHVzZUxvd01pblJ0b187Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjMTY3Zi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRfSF8gMQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLQotI2luY2x1ZGUgIlRUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUU2VydmVyU29ja2V0LmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLS8qKgotICogVENQIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gKgotICovCi1jbGFzcyBUU29ja2V0IDogcHVibGljIFRUcmFuc3BvcnQgewotICAvKioKLSAgICogV2UgYWxsb3cgdGhlIFRTZXJ2ZXJTb2NrZXQgYWNjZXB0SW1wbCgpIG1ldGhvZCB0byBhY2Nlc3MgdGhlIHByaXZhdGUKLSAgICogbWVtYmVycyBvZiBhIHNvY2tldCBzbyB0aGF0IGl0IGNhbiBhY2Nlc3MgdGhlIFRTb2NrZXQoaW50IHNvY2tldCkKLSAgICogY29uc3RydWN0b3Igd2hpY2ggY3JlYXRlcyBhIHNvY2tldCBvYmplY3QgZnJvbSB0aGUgcmF3IFVOSVggc29ja2V0Ci0gICAqIGhhbmRsZS4KLSAgICovCi0gIGZyaWVuZCBjbGFzcyBUU2VydmVyU29ja2V0OwotCi0gcHVibGljOgotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCi0gICAqIHNvY2tldC4KLSAgICoKLSAgICovCi0gIFRTb2NrZXQoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCi0gICAqIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIGhvc3QgQW4gSVAgYWRkcmVzcyBvciBob3N0bmFtZSB0byBjb25uZWN0IHRvCi0gICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KLSAgICovCi0gIFRTb2NrZXQoc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQpOwotCi0gIC8qKgotICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgotICAgKi8KLSAgdmlydHVhbCB+VFNvY2tldCgpOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgYWxpdmUuCi0gICAqCi0gICAqIEByZXR1cm4gSXMgdGhlIHNvY2tldCBhbGl2ZT8KLSAgICovCi0gIGJvb2wgaXNPcGVuKCk7Ci0KLSAgLyoqCi0gICAqIENhbGxzIHNlbGVjdCBvbiB0aGUgc29ja2V0IHRvIHNlZSBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgYXZhaWxhYmxlLgotICAgKi8KLSAgYm9vbCBwZWVrKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBVTklYIHNvY2tldC4KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIHRoZSBzb2NrZXQgY291bGQgbm90IGNvbm5lY3QKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBvcGVuKCk7Ci0KLSAgLyoqCi0gICAqIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHNvY2tldC4KLSAgICovCi0gIHZpcnR1YWwgdm9pZCBjbG9zZSgpOwotCi0gIC8qKgotICAgKiBSZWFkcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KLSAgICovCi0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotCi0gIC8qKgotICAgKiBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LgotICAgKi8KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaG9zdCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCi0gICAqCi0gICAqIEByZXR1cm4gc3RyaW5nIGhvc3QgaWRlbnRpZmllcgotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0SG9zdCgpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIHBvcnQgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bwotICAgKgotICAgKiBAcmV0dXJuIGludCBwb3J0IG51bWJlcgotICAgKi8KLSAgaW50IGdldFBvcnQoKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBob3N0IHRoYXQgc29ja2V0IHdpbGwgY29ubmVjdCB0bwotICAgKgotICAgKiBAcGFyYW0gaG9zdCBob3N0IGlkZW50aWZpZXIKLSAgICovCi0gIHZvaWQgc2V0SG9zdChzdGQ6OnN0cmluZyBob3N0KTsKLQotICAvKioKLSAgICogU2V0IHRoZSBwb3J0IHRoYXQgc29ja2V0IHdpbGwgY29ubmVjdCB0bwotICAgKgotICAgKiBAcGFyYW0gcG9ydCBwb3J0IG51bWJlcgotICAgKi8KLSAgdm9pZCBzZXRQb3J0KGludCBwb3J0KTsKLQotICAvKioKLSAgICogQ29udHJvbHMgd2hldGhlciB0aGUgbGluZ2VyIG9wdGlvbiBpcyBzZXQgb24gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIG9uICAgICAgV2hldGhlciBTT19MSU5HRVIgaXMgb24KLSAgICogQHBhcmFtIGxpbmdlciAgSWYgbGluZ2VyIGlzIGFjdGl2ZSwgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGxpbmdlciBmb3IKLSAgICovCi0gIHZvaWQgc2V0TGluZ2VyKGJvb2wgb24sIGludCBsaW5nZXIpOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGVuYWJsZS9kaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtLgotICAgKgotICAgKiBAcGFyYW0gbm9EZWxheSBXaGV0aGVyIG9yIG5vdCB0byBkaXNhYmxlIHRoZSBhbGdvcml0aG0uCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHZvaWQgc2V0Tm9EZWxheShib29sIG5vRGVsYXkpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIGNvbm5lY3QgdGltZW91dAotICAgKi8KLSAgdm9pZCBzZXRDb25uVGltZW91dChpbnQgbXMpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHJlY2VpdmUgdGltZW91dAotICAgKi8KLSAgdm9pZCBzZXRSZWN2VGltZW91dChpbnQgbXMpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHNlbmQgdGltZW91dAotICAgKi8KLSAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgbXMpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzIGluIGNhc2Ugb2YgYW4gRUFHQUlOCi0gICAqIGVycm9yCi0gICAqLwotICB2b2lkIHNldE1heFJlY3ZSZXRyaWVzKGludCBtYXhSZWN2UmV0cmllcyk7Ci0KLSAgLyoqCi0gICAqIEdldCBzb2NrZXQgaW5mb3JtYXRpb24gZm9ybWF0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIGdldFNvY2tldEluZm8oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgRE5TIG5hbWUgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKLSAgICovCi0gIHN0ZDo6c3RyaW5nIGdldFBlZXJIb3N0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKLSAgICovCi0gIHN0ZDo6c3RyaW5nIGdldFBlZXJBZGRyZXNzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBvcnQgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKLSAgICoqLwotICBpbnQgZ2V0UGVlclBvcnQoKTsKLQotICAvKioKLSAgICogU2V0cyB3aGV0aGVyIHRvIHVzZSBhIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0LgotICAgKi8KLSAgc3RhdGljIHZvaWQgc2V0VXNlTG93TWluUnRvKGJvb2wgdXNlTG93TWluUnRvKTsKLQotICAvKioKLSAgICogR2V0cyB3aGV0aGVyIHRvIHVzZSBhIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0LgotICAgKi8KLSAgc3RhdGljIGJvb2wgZ2V0VXNlTG93TWluUnRvKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gcmF3IFVOSVggaGFuZGxlLiBOZXZlciBjYWxsZWQgZGlyZWN0bHkKLSAgICogYnV0IHVzZWQgYnkgdGhlIFRTZXJ2ZXJTb2NrZXQgY2xhc3MuCi0gICAqLwotICBUU29ja2V0KGludCBzb2NrZXQpOwotCi0gIC8qKiBjb25uZWN0LCBjYWxsZWQgYnkgb3BlbiAqLwotICB2b2lkIG9wZW5Db25uZWN0aW9uKHN0cnVjdCBhZGRyaW5mbyAqcmVzKTsKLQotICAvKiogSG9zdCB0byBjb25uZWN0IHRvICovCi0gIHN0ZDo6c3RyaW5nIGhvc3RfOwotCi0gIC8qKiBQZWVyIGhvc3RuYW1lICovCi0gIHN0ZDo6c3RyaW5nIHBlZXJIb3N0XzsKLQotICAvKiogUGVlciBhZGRyZXNzICovCi0gIHN0ZDo6c3RyaW5nIHBlZXJBZGRyZXNzXzsKLQotICAvKiogUGVlciBwb3J0ICovCi0gIGludCBwZWVyUG9ydF87Ci0KLSAgLyoqIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3Qgb24gKi8KLSAgaW50IHBvcnRfOwotCi0gIC8qKiBVbmRlcmx5aW5nIFVOSVggc29ja2V0IGhhbmRsZSAqLwotICBpbnQgc29ja2V0XzsKLQotICAvKiogQ29ubmVjdCB0aW1lb3V0IGluIG1zICovCi0gIGludCBjb25uVGltZW91dF87Ci0KLSAgLyoqIFNlbmQgdGltZW91dCBpbiBtcyAqLwotICBpbnQgc2VuZFRpbWVvdXRfOwotCi0gIC8qKiBSZWN2IHRpbWVvdXQgaW4gbXMgKi8KLSAgaW50IHJlY3ZUaW1lb3V0XzsKLQotICAvKiogTGluZ2VyIG9uICovCi0gIGJvb2wgbGluZ2VyT25fOwotCi0gIC8qKiBMaW5nZXIgdmFsICovCi0gIGludCBsaW5nZXJWYWxfOwotCi0gIC8qKiBOb2RlbGF5ICovCi0gIGJvb2wgbm9EZWxheV87Ci0KLSAgLyoqIFJlY3YgRUdBSU4gcmV0cmllcyAqLwotICBpbnQgbWF4UmVjdlJldHJpZXNfOwotCi0gIC8qKiBSZWN2IHRpbWVvdXQgdGltZXZhbCAqLwotICBzdHJ1Y3QgdGltZXZhbCByZWN2VGltZXZhbF87Ci0KLSAgLyoqIFdoZXRoZXIgdG8gdXNlIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0ICovCi0gIHN0YXRpYyBib29sIHVzZUxvd01pblJ0b187Ci19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU09DS0VUX0hfCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjBjNWEzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiVFNvY2tldFBvb2wuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KLS8qKgotICogVFNvY2tldFBvb2xTZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLVRTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcigpCi0gIDogaG9zdF8oIiIpLAotICAgIHBvcnRfKDApLAotICAgIHNvY2tldF8oLTEpLAotICAgIGxhc3RGYWlsVGltZV8oMCksCi0gICAgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkge30KLQotLyoqCi0gKiBDb25zdHJ1Y3RvciBmb3IgVFNvY2tldFBvb2wgc2VydmVyCi0gKi8KLVRTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdHJpbmcgJmhvc3QsIGludCBwb3J0KQotICA6IGhvc3RfKGhvc3QpLAotICAgIHBvcnRfKHBvcnQpLAotICAgIHNvY2tldF8oLTEpLAotICAgIGxhc3RGYWlsVGltZV8oMCksCi0gICAgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkge30KLQotLyoqCi0gKiBUU29ja2V0UG9vbCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKi8KLQotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKCkgOiBUU29ja2V0KCksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7Ci19Ci0KLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8c3RyaW5nPiAmaG9zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPGludD4gJnBvcnRzKSA6IFRTb2NrZXQoKSwKLSAgbnVtUmV0cmllc18oMSksCi0gIHJldHJ5SW50ZXJ2YWxfKDYwKSwKLSAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCi0gIHJhbmRvbWl6ZV8odHJ1ZSksCi0gIGFsd2F5c1RyeUxhc3RfKHRydWUpCi17Ci0gIGlmIChob3N0cy5zaXplKCkgIT0gcG9ydHMuc2l6ZSgpKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJUU29ja2V0UG9vbDo6VFNvY2tldFBvb2w6IGhvc3RzLnNpemUgIT0gcG9ydHMuc2l6ZSIpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOwotICB9Ci0KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBob3N0cy5zaXplKCk7ICsraSkgewotICAgIGFkZFNlcnZlcihob3N0c1tpXSwgcG9ydHNbaV0pOwotICB9Ci19Ci0KLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4gPiYgc2VydmVycykgOiBUU29ja2V0KCksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKQotewotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2VydmVycy5zaXplKCk7ICsraSkgewotICAgIGFkZFNlcnZlcihzZXJ2ZXJzW2ldLmZpcnN0LCBzZXJ2ZXJzW2ldLnNlY29uZCk7Ci0gIH0KLX0KLQotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykgOiBUU29ja2V0KCksCi0gIHNlcnZlcnNfKHNlcnZlcnMpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkKLXsKLX0KLQotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpIDogVFNvY2tldCgpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkKLXsKLSAgYWRkU2VydmVyKGhvc3QsIHBvcnQpOwotfQotCi1UU29ja2V0UG9vbDo6flRTb2NrZXRQb29sKCkgewotICB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzZXJ2ZXJzXy5iZWdpbigpOwotICB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXJFbmQgPSBzZXJ2ZXJzXy5lbmQoKTsKLSAgZm9yICg7IGl0ZXIgIT0gaXRlckVuZDsgKytpdGVyKSB7Ci0gICAgc2V0Q3VycmVudFNlcnZlcigqaXRlcik7Ci0gICAgVFNvY2tldFBvb2w6OmNsb3NlKCk7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6YWRkU2VydmVyKGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpIHsKLSAgc2VydmVyc18ucHVzaF9iYWNrKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+KG5ldyBUU29ja2V0UG9vbFNlcnZlcihob3N0LCBwb3J0KSkpOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjphZGRTZXJ2ZXIoc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcikgewotICBpZiAoc2VydmVyKSB7Ci0gICAgc2VydmVyc18ucHVzaF9iYWNrKHNlcnZlcik7Ci0gIH0KLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0U2VydmVycyhjb25zdCB2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKLSAgc2VydmVyc18gPSBzZXJ2ZXJzOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpnZXRTZXJ2ZXJzKHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycykgewotICBzZXJ2ZXJzID0gc2VydmVyc187Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OnNldE51bVJldHJpZXMoaW50IG51bVJldHJpZXMpIHsKLSAgbnVtUmV0cmllc18gPSBudW1SZXRyaWVzOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKSB7Ci0gIHJldHJ5SW50ZXJ2YWxfID0gcmV0cnlJbnRlcnZhbDsKLX0KLQotCi12b2lkIFRTb2NrZXRQb29sOjpzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKSB7Ci0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gbWF4Q29uc2VjdXRpdmVGYWlsdXJlczsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0UmFuZG9taXplKGJvb2wgcmFuZG9taXplKSB7Ci0gIHJhbmRvbWl6ZV8gPSByYW5kb21pemU7Ci19Ci0KLXZvaWQgVFNvY2tldFBvb2w6OnNldEFsd2F5c1RyeUxhc3QoYm9vbCBhbHdheXNUcnlMYXN0KSB7Ci0gIGFsd2F5c1RyeUxhc3RfID0gYWx3YXlzVHJ5TGFzdDsKLX0KLQotdm9pZCBUU29ja2V0UG9vbDo6c2V0Q3VycmVudFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKSB7Ci0gIGN1cnJlbnRTZXJ2ZXJfID0gc2VydmVyOwotICBob3N0XyA9IHNlcnZlci0+aG9zdF87Ci0gIHBvcnRfID0gc2VydmVyLT5wb3J0XzsKLSAgc29ja2V0XyA9IHNlcnZlci0+c29ja2V0XzsKLX0KLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24gaWYgc29ja2V0IG9wZW4gZmFpbHMuIFdoZW4gc29ja2V0Ci0gKiBvcGVucyBmYWlscywgdGhlIHNvY2tldCBpbiB0aGUgY3VycmVudCBzZXJ2ZXIgaXMgcmVzZXQuCi0gKi8KLS8qIFRPRE86IHdpdGhvdXQgYXBjIHdlIGlnbm9yZSBhIGxvdCBvZiBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIHBocCB2ZXJzaW9uICovCi12b2lkIFRTb2NrZXRQb29sOjpvcGVuKCkgewotCi0gIHVuc2lnbmVkIGludCBudW1TZXJ2ZXJzID0gc2VydmVyc18uc2l6ZSgpOwotICBpZiAobnVtU2VydmVycyA9PSAwKSB7Ci0gICAgc29ja2V0XyA9IC0xOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICB9Ci0KLSAgaWYgKGlzT3BlbigpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHJhbmRvbWl6ZV8gJiYgbnVtU2VydmVycyA+IDEpIHsKLSAgICByYW5kb21fc2h1ZmZsZShzZXJ2ZXJzXy5iZWdpbigpLCBzZXJ2ZXJzXy5lbmQoKSk7Ci0gIH0KLQotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG51bVNlcnZlcnM7ICsraSkgewotCi0gICAgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlciA9IHNlcnZlcnNfW2ldOwotICAgIC8vIEltcGVyc29uYXRlIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gICAgc2V0Q3VycmVudFNlcnZlcihzZXJ2ZXIpOwotCi0gICAgaWYgKGlzT3BlbigpKSB7Ci0gICAgICAvLyBhbHJlYWR5IG9wZW4gbWVhbnMgd2UncmUgZG9uZQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgcmV0cnlJbnRlcnZhbFBhc3NlZCA9IChzZXJ2ZXItPmxhc3RGYWlsVGltZV8gPT0gMCk7Ci0gICAgYm9vbCBpc0xhc3RTZXJ2ZXIgPSBhbHdheXNUcnlMYXN0XyA/IChpID09IChudW1TZXJ2ZXJzIC0gMSkpIDogZmFsc2U7Ci0KLSAgICBpZiAoc2VydmVyLT5sYXN0RmFpbFRpbWVfID4gMCkgewotICAgICAgLy8gVGhlIHNlcnZlciB3YXMgbWFya2VkIGFzIGRvd24sIHNvIGNoZWNrIGlmIGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIHRvIHJldHJ5Ci0gICAgICBpbnQgZWxhcHNlZFRpbWUgPSB0aW1lKE5VTEwpIC0gc2VydmVyLT5sYXN0RmFpbFRpbWVfOwotICAgICAgaWYgKGVsYXBzZWRUaW1lID4gcmV0cnlJbnRlcnZhbF8pIHsKLSAgICAgICAgcmV0cnlJbnRlcnZhbFBhc3NlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJldHJ5SW50ZXJ2YWxQYXNzZWQgfHwgaXNMYXN0U2VydmVyKSB7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVJldHJpZXNfOyArK2opIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBUU29ja2V0OjpvcGVuKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldFBvb2w6Om9wZW4gZmFpbGVkICIrZ2V0U29ja2V0SW5mbygpKyI6ICIrZS53aGF0KCk7Ci0gICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgICAgICBzb2NrZXRfID0gLTE7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb3B5IG92ZXIgdGhlIG9wZW5lZCBzb2NrZXQgc28gdGhhdCB3ZSBjYW4ga2VlcCBpdCBwZXJzaXN0ZW50Ci0gICAgICAgIHNlcnZlci0+c29ja2V0XyA9IHNvY2tldF87Ci0gICAgICAgIC8vIHJlc2V0IGxhc3RGYWlsVGltZV8gaXMgcmVxdWlyZWQKLSAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gMDsKLSAgICAgICAgLy8gc3VjY2VzcwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgICsrc2VydmVyLT5jb25zZWN1dGl2ZUZhaWx1cmVzXzsKLSAgICAgIGlmIChzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID4gbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKLSAgICAgICAgLy8gTWFyayBzZXJ2ZXIgYXMgZG93bgotICAgICAgICBzZXJ2ZXItPmNvbnNlY3V0aXZlRmFpbHVyZXNfID0gMDsKLSAgICAgICAgc2VydmVyLT5sYXN0RmFpbFRpbWVfID0gdGltZShOVUxMKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBHbG9iYWxPdXRwdXQoIlRTb2NrZXRQb29sOjpvcGVuOiBhbGwgY29ubmVjdGlvbnMgZmFpbGVkIik7Ci0gIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotfQotCi12b2lkIFRTb2NrZXRQb29sOjpjbG9zZSgpIHsKLSAgVFNvY2tldDo6Y2xvc2UoKTsKLSAgaWYgKGN1cnJlbnRTZXJ2ZXJfKSB7Ci0gICAgY3VycmVudFNlcnZlcl8tPnNvY2tldF8gPSAtMTsKLSAgfQotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5MTE2YS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8gMQotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgIlRTb2NrZXQuaCIKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotIC8qKgotICAqIENsYXNzIHRvIGhvbGQgc2VydmVyIGluZm9ybWF0aW9uIGZvciBUU29ja2V0UG9vbAotICAqCi0gICovCi1jbGFzcyBUU29ja2V0UG9vbFNlcnZlciB7Ci0KLSAgcHVibGljOgotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc2VydmVyIGluZm8KLSAgICovCi0gIFRTb2NrZXRQb29sU2VydmVyKCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBUU29ja2V0UG9vbCBzZXJ2ZXIKLSAgICovCi0gIFRTb2NrZXRQb29sU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nICZob3N0LCBpbnQgcG9ydCk7Ci0KLSAgLy8gSG9zdCBuYW1lCi0gIHN0ZDo6c3RyaW5nIGhvc3RfOwotCi0gIC8vIFBvcnQgdG8gY29ubmVjdCBvbgotICBpbnQgcG9ydF87Ci0KLSAgLy8gU29ja2V0IGZvciB0aGUgc2VydmVyCi0gIGludCBzb2NrZXRfOwotCi0gIC8vIExhc3QgdGltZSBjb25uZWN0aW5nIHRvIHRoaXMgc2VydmVyIGZhaWxlZAotICBpbnQgbGFzdEZhaWxUaW1lXzsKLQotICAvLyBOdW1iZXIgb2YgY29uc2VjdXRpdmUgdGltZXMgY29ubmVjdGluZyB0byB0aGlzIHNlcnZlciBmYWlsZWQKLSAgaW50IGNvbnNlY3V0aXZlRmFpbHVyZXNfOwotfTsKLQotLyoqCi0gKiBUQ1AgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KLSAqCi0gKi8KLWNsYXNzIFRTb2NrZXRQb29sIDogcHVibGljIFRTb2NrZXQgewotCi0gcHVibGljOgotCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKi8KLSAgIFRTb2NrZXRQb29sKCk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gaG9zdHMgbGlzdCBvZiBob3N0IG5hbWVzCi0gICAgKiBAcGFyYW0gcG9ydHMgbGlzdCBvZiBwb3J0IG5hbWVzCi0gICAgKi8KLSAgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmaG9zdHMsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+ICZwb3J0cyk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIHBhaXJzIG9mIGhvc3QgbmFtZSBhbmQgcG9ydAotICAgICovCi0gICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gPiYgc2VydmVycyk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIFRTb2NrZXRQb29sU2VydmVycwotICAgICovCi0gIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7Ci0KLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gaG9zdCBzaW5nbGUgaG9zdAotICAgICogQHBhcmFtIHBvcnQgc2luZ2xlIHBvcnQKLSAgICAqLwotICAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKLQotICAgLyoqCi0gICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgotICAgICovCi0gICB2aXJ0dWFsIH5UU29ja2V0UG9vbCgpOwotCi0gICAvKioKLSAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgICovCi0gICB2b2lkIGFkZFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOwotCi0gICAvKioKLSAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgICovCi0gIHZvaWQgYWRkU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKTsKLQotICAgLyoqCi0gICAgKiBTZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAotICAgICovCi0gIHZvaWQgc2V0U2VydmVycyhjb25zdCBzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwotCi0gICAvKioKLSAgICAqIEdldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCi0gICAgKi8KLSAgdm9pZCBnZXRTZXJ2ZXJzKHN0ZDo6dmVjdG9yPCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7Ci0KLSAgIC8qKgotICAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBpbiB0aGUgY29ubmVjdCBmdW5jdGlvbi4KLSAgICAqLwotICAgdm9pZCBzZXROdW1SZXRyaWVzKGludCBudW1SZXRyaWVzKTsKLQotICAgLyoqCi0gICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgotICAgICovCi0gICB2b2lkIHNldFJldHJ5SW50ZXJ2YWwoaW50IHJldHJ5SW50ZXJ2YWwpOwotCi0gICAvKioKLSAgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgYmVmb3JlIG1hcmtpbmcgaXQgYXMgZG93bi4KLSAgICAqLwotICAgdm9pZCBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKTsKLQotICAgLyoqCi0gICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgotICAgICovCi0gICB2b2lkIHNldFJhbmRvbWl6ZShib29sIHJhbmRvbWl6ZSk7Ci0KLSAgIC8qKgotICAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KLSAgICAqLwotICAgdm9pZCBzZXRBbHdheXNUcnlMYXN0KGJvb2wgYWx3YXlzVHJ5TGFzdCk7Ci0KLSAgIC8qKgotICAgICogQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIFVOSVggc29ja2V0LgotICAgICovCi0gICB2b2lkIG9wZW4oKTsKLQotICAgLyoKLSAgICAqIENsb3NlcyB0aGUgVU5JWCBzb2NrZXQKLSAgICAqLwotICAgdm9pZCBjbG9zZSgpOwotCi0gcHJvdGVjdGVkOgotCi0gIHZvaWQgc2V0Q3VycmVudFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcik7Ci0KLSAgIC8qKiBMaXN0IG9mIHNlcnZlcnMgdG8gY29ubmVjdCB0byAqLwotICBzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4gc2VydmVyc187Ci0KLSAgLyoqIEN1cnJlbnQgc2VydmVyICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiBjdXJyZW50U2VydmVyXzsKLQotICAgLyoqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0ICovCi0gICBpbnQgbnVtUmV0cmllc187Ci0KLSAgIC8qKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgotICAgICogbWFya2VkIGFzIGRvd24uCi0gICAgKi8KLSAgIGludCByZXRyeUludGVydmFsXzsKLQotICAgLyoqIE1heCBjb25zZWN1dGl2ZSBmYWlsdXJlcyBiZWZvcmUgbWFya2luZyBhIGhvc3QgZG93bi4gKi8KLSAgIGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXzsKLQotICAgLyoqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8gKi8KLSAgIGJvb2wgcmFuZG9taXplXzsKLQotICAgLyoqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPyAqLwotICAgYm9vbCBhbHdheXNUcnlMYXN0XzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRQT09MX0hfCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWUyMGNlLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8KLSNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBHZW5lcmljIGludGVyZmFjZSBmb3IgYSBtZXRob2Qgb2YgdHJhbnNwb3J0aW5nIGRhdGEuIEEgVFRyYW5zcG9ydCBtYXkgYmUKLSAqIGNhcGFibGUgb2YgZWl0aGVyIHJlYWRpbmcgb3Igd3JpdGluZywgYnV0IG5vdCBuZWNlc3NhcmlseSBib3RoLgotICoKLSAqLwotY2xhc3MgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICAvKioKLSAgICogVmlydHVhbCBkZWNvbnN0cnVjdG9yLgotICAgKi8KLSAgdmlydHVhbCB+VFRyYW5zcG9ydCgpIHt9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KLSAgICovCi0gIHZpcnR1YWwgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHJlYWQgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGlzCi0gICAqIHN0aWxsIG9wZW4uIEJ5IGRlZmF1bHQgdGhpcyBpcyB0cnVlIHdoZW5ldmVyIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiwKLSAgICogYnV0IGltcGxlbWVudGF0aW9ucyBzaG91bGQgYWRkIGxvZ2ljIHRvIHRlc3QgZm9yIHRoaXMgY29uZGl0aW9uIHdoZXJlCi0gICAqIHBvc3NpYmxlIChpLmUuIG9uIGEgc29ja2V0KS4KLSAgICogVGhpcyBpcyB1c2VkIGJ5IGEgc2VydmVyIHRvIGNoZWNrIGlmIGl0IHNob3VsZCBsaXN0ZW4gZm9yIGFub3RoZXIKLSAgICogcmVxdWVzdC4KLSAgICovCi0gIHZpcnR1YWwgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiBpc09wZW4oKTsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9ucy4KLSAgICoKLSAgICogQHJldHVybiBib29sIFdoZXRoZXIgdGhlIHRyYW5zcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgb3BlbmluZyBmYWlsZWQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBvcGVuKCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYXNlIFRUcmFuc3BvcnQuIik7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbm5vdCBjbG9zZSBiYXNlIFRUcmFuc3BvcnQuIik7Ci0gIH0KLQotICAvKioKLSAgICogQXR0ZW1wdCB0byByZWFkIHVwIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGludG8gdGhlIHN0cmluZy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZiAgUmVmZXJlbmNlIHRvIHRoZSBsb2NhdGlvbiB0byB3cml0ZSB0aGUgZGF0YQotICAgKiBAcGFyYW0gbGVuICBIb3cgbWFueSBieXRlcyB0byByZWFkCi0gICAqIEByZXR1cm4gSG93IG1hbnkgYnl0ZXMgd2VyZSBhY3R1YWxseSByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKLSAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IHJlYWQuIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgdGhlIGdpdmVuIGFtb3VudCBvZiBkYXRhIGluIGl0cyBlbnRpcmV0eSBubyBtYXR0ZXIgd2hhdC4KLSAgICoKLSAgICogQHBhcmFtIHMgICAgIFJlZmVyZW5jZSB0byBsb2NhdGlvbiBmb3IgcmVhZCBkYXRhCi0gICAqIEBwYXJhbSBsZW4gICBIb3cgbWFueSBieXRlcyB0byByZWFkCi0gICAqIEByZXR1cm4gSG93IG1hbnkgYnl0ZXMgcmVhZCwgd2hpY2ggbXVzdCBiZSBlcXVhbCB0byBzaXplCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBpbnN1ZmZpY2llbnQgZGF0YSB3YXMgcmVhZAotICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdWludDMyX3QgaGF2ZSA9IDA7Ci0gICAgdWludDMyX3QgZ2V0ID0gMDsKLQotICAgIHdoaWxlIChoYXZlIDwgbGVuKSB7Ci0gICAgICBnZXQgPSByZWFkKGJ1ZitoYXZlLCBsZW4taGF2ZSk7Ci0gICAgICBpZiAoZ2V0IDw9IDApIHsKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKLQkJCQkgICJObyBtb3JlIGRhdGEgdG8gcmVhZC4iKTsKLSAgICAgIH0KLSAgICAgIGhhdmUgKz0gZ2V0OwotICAgIH0KLQotICAgIHJldHVybiBoYXZlOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGVkLgotICAgKiBUaGlzIGNhbiBiZSBvdmVyLXJpZGRlbiB0byBwZXJmb3JtIGEgdHJhbnNwb3J0LXNwZWNpZmljIGFjdGlvbgotICAgKiBlLmcuIGxvZ2dpbmcgdGhlIHJlcXVlc3QgdG8gYSBmaWxlCi0gICAqCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgcmVhZEVuZCgpIHsKLSAgICAvLyBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkbyBub3RoaW5nCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgc3RyaW5nIGluIGl0cyBlbnRpcmV0eSB0byB0aGUgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gYnVmICBUaGUgZGF0YSB0byB3cml0ZSBvdXQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgKi8KLSAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QgLyogbGVuICovKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3Qgd3JpdGUuIik7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGVkLgotICAgKiBUaGlzIGNhbiBiZSBvdmVyLXJpZGRlbiB0byBwZXJmb3JtIGEgdHJhbnNwb3J0LXNwZWNpZmljIGFjdGlvbgotICAgKiBhdCB0aGUgZW5kIG9mIGEgcmVxdWVzdC4KLSAgICoKLSAgICovCi0gIHZpcnR1YWwgdm9pZCB3cml0ZUVuZCgpIHsKLSAgICAvLyBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBkbyBub3RoaW5nCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGJ1ZmZlcmVkCi0gICAqIHRyYW5zcG9ydCBtZWNoYW5pc21zLgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgZmx1c2goKSB7fQotCi0gIC8qKgotICAgKiBBdHRlbXB0cyB0byByZXR1cm4gYSBwb2ludGVyIHRvIFxjIGxlbiBieXRlcywgcG9zc2libHkgY29waWVkIGludG8gXGMgYnVmLgotICAgKiBEb2VzIG5vdCBjb25zdW1lIHRoZSBieXRlcyByZWFkIChpLmUuOiBhIGxhdGVyIHJlYWQgd2lsbCByZXR1cm4gdGhlIHNhbWUKLSAgICogZGF0YSkuICBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBzdXBwb3J0IHByb3RvY29scyB0aGF0IG5lZWQgdG8gcmVhZAotICAgKiB2YXJpYWJsZS1sZW5ndGggZmllbGRzLiAgVGhleSBjYW4gYXR0ZW1wdCB0byBib3Jyb3cgdGhlIG1heGltdW0gYW1vdW50IG9mCi0gICAqIGRhdGEgdGhhdCB0aGV5IHdpbGwgbmVlZCwgdGhlbiBjb25zdW1lIChzZWUgbmV4dCBtZXRob2QpIHdoYXQgdGhleQotICAgKiBhY3R1YWxseSB1c2UuICBTb21lIHRyYW5zcG9ydHMgd2lsbCBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZCBhbmQgb3RoZXJzCi0gICAqIHdpbGwgZmFpbCBvY2Nhc2lvbmFsbHksIHNvIHByb3RvY29scyBtdXN0IGJlIHByZXBhcmVkIHRvIHVzZSByZWFkIGlmCi0gICAqIGJvcnJvdyBmYWlscy4KLSAgICoKLSAgICogQG9hcmFtIGJ1ZiAgQSBidWZmZXIgd2hlcmUgdGhlIGRhdGEgY2FuIGJlIHN0b3JlZCBpZiBuZWVkZWQuCi0gICAqICAgICAgICAgICAgIElmIGJvcnJvdyBkb2Vzbid0IHJldHVybiBidWYsIHRoZW4gdGhlIGNvbnRlbnRzIG9mCi0gICAqICAgICAgICAgICAgIGJ1ZiBhZnRlciB0aGUgY2FsbCBhcmUgdW5kZWZpbmVkLgotICAgKiBAcGFyYW0gbGVuICAqbGVuIHNob3VsZCBpbml0aWFsbHkgY29udGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJvcnJvdy4KLSAgICogICAgICAgICAgICAgSWYgYm9ycm93IHN1Y2NlZWRzLCAqbGVuIHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAqICAgICAgICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgcmV0dXJuZWQgcG9pbnRlci4gIFRoaXMgd2lsbCBiZSBhdCBsZWFzdAotICAgKiAgICAgICAgICAgICB3aGF0IHdhcyByZXF1ZXN0ZWQsIGJ1dCBtYXkgYmUgbW9yZSBpZiBib3Jyb3cgcmV0dXJucwotICAgKiAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgYnVmZmVyLCByYXRoZXIgdGhhbiBidWYuCi0gICAqICAgICAgICAgICAgIElmIGJvcnJvdyBmYWlscywgdGhlIGNvbnRlbnRzIG9mICpsZW4gYXJlIHVuZGVmaW5lZC4KLSAgICogQHJldHVybiBJZiB0aGUgYm9ycm93IHN1Y2NlZWRzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBib3Jyb3dlZCBkYXRhLgotICAgKiAgICAgICAgIFRoaXMgbWlnaHQgYmUgZXF1YWwgdG8gXGMgYnVmLCBvciBpdCBtaWdodCBiZSBhIHBvaW50ZXIgaW50bwotICAgKiAgICAgICAgIHRoZSB0cmFuc3BvcnQncyBpbnRlcm5hbCBidWZmZXJzLgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAqLwotICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90KiAvKiBsZW4gKi8pIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgbGVuIGJ5dGVzIGZyb20gdGhlIHRyYW5zcG9ydC4gIFRoaXMgc2hvdWxkIGFsd2F5cyBmb2xsb3cgYSBib3Jyb3cKLSAgICogb2YgYXQgbGVhc3QgbGVuIGJ5dGVzLCBhbmQgc2hvdWxkIGFsd2F5cyBzdWNjZWVkLgotICAgKiBUT0RPKGRyZWlzcyk6IElzIHRoZXJlIGFueSB0cmFuc3BvcnQgdGhhdCBjb3VsZCBib3Jyb3cgYnV0IGZhaWwgdG8KLSAgICogY29uc3VtZSwgb3IgdGhhdCB3b3VsZCByZXF1aXJlIGEgYnVmZmVyIHRvIGR1bXAgdGhlIGNvbnN1bWVkIGRhdGE/Ci0gICAqCi0gICAqIEBwYXJhbSBsZW4gIEhvdyBtYW55IGJ5dGVzIHRvIGNvbnN1bWUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycwotICAgKi8KLSAgdmlydHVhbCB2b2lkIGNvbnN1bWUodWludDMyX3QgLyogbGVuICovKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3QgY29uc3VtZS4iKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICAvKioKLSAgICogU2ltcGxlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgVFRyYW5zcG9ydCgpIHt9Ci19OwotCi0vKioKLSAqIEdlbmVyaWMgZmFjdG9yeSBjbGFzcyB0byBtYWtlIGFuIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0IG91dCBvZiBhCi0gKiBzb3VyY2UgdHJhbnNwb3J0LiBDb21tb25seSB1c2VkIGluc2lkZSBzZXJ2ZXJzIHRvIG1ha2UgaW5wdXQgYW5kIG91dHB1dAotICogc3RyZWFtcyBvdXQgb2YgcmF3IGNsaWVudHMuCi0gKgotICovCi1jbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgotICBUVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgdmlydHVhbCB+VFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotCi0gIC8qKgotICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZywganVzdCByZXR1cm5zIHRoZSB0cmFuc3BvcnQgZ2l2ZW4uCi0gICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi19OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYWFlZGMuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYm9vc3Q6OmxleGljYWxfY2FzdDsKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYWQwMmIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfIDEKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxUaHJpZnQuaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotLyoqCi0gKiBDbGFzcyB0byBlbmNhcHN1bGF0ZSBhbGwgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIHRyYW5zcG9ydCBlcnJvcnMgdGhhdCBtYXkKLSAqIG9jY3VyIGluIHZhcmlvdXMgdHJhbnNwb3J0IHN5c3RlbXMuIFRoaXMgcHJvdmlkZXMgYSBzb3J0IG9mIGdlbmVyaWMKLSAqIHdyYXBwZXIgYXJvdW5kIHRoZSB2YWd1ZSBVTklYIEVfIGVycm9yIGNvZGVzIHRoYXQgbGV0cyBhIGNvbW1vbiBjb2RlCi0gKiBiYXNlIG9mIGVycm9yIGhhbmRsaW5nIHRvIGJlIHVzZWQgZm9yIHZhcmlvdXMgdHlwZXMgb2YgdHJhbnNwb3J0cywgaS5lLgotICogcGlwZXMgZXRjLgotICoKLSAqLwotY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotICAvKioKLSAgICogRXJyb3IgY29kZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGV4Y2VwdGlvbnMuCi0gICAqLwotICBlbnVtIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlCi0gIHsgVU5LTk9XTiA9IDAKLSAgLCBOT1RfT1BFTiA9IDEKLSAgLCBBTFJFQURZX09QRU4gPSAyCi0gICwgVElNRURfT1VUID0gMwotICAsIEVORF9PRl9GSUxFID0gNAotICAsIElOVEVSUlVQVEVEID0gNQotICAsIEJBRF9BUkdTID0gNgotICAsIENPUlJVUFRFRF9EQVRBID0gNwotICAsIElOVEVSTkFMX0VSUk9SID0gOAotICB9OwotCi0gIFRUcmFuc3BvcnRFeGNlcHRpb24oKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQotCi0gIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksCi0gICAgdHlwZV8odHlwZSkge30KLQotICBUVHJhbnNwb3J0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8oVU5LTk9XTikge30KLQotICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8odHlwZSkge30KLQotICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGVycm5vX2NvcHkpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlICsgIjogIiArIFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSkpLAotICAgIHR5cGVfKHR5cGUpIHt9Ci0KLSAgdmlydHVhbCB+VFRyYW5zcG9ydEV4Y2VwdGlvbigpIHRocm93KCkge30KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKLSAgICogdGhhdCBoYXMgb2NjdXJyZWQuCi0gICAqCi0gICAqIEByZXR1cm4gRXJyb3IgY29kZQotICAgKi8KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHRocm93KCkgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgewotICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7Ci0gICAgICBzd2l0Y2ggKHR5cGVfKSB7Ci0gICAgICAgIGNhc2UgVU5LTk9XTiAgICAgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFVua25vd24gdHJhbnNwb3J0IGV4Y2VwdGlvbiI7Ci0gICAgICAgIGNhc2UgTk9UX09QRU4gICAgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRyYW5zcG9ydCBub3Qgb3BlbiI7Ci0gICAgICAgIGNhc2UgQUxSRUFEWV9PUEVOICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRyYW5zcG9ydCBhbHJlYWR5IG9wZW4iOwotICAgICAgICBjYXNlIFRJTUVEX09VVCAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUaW1lZCBvdXQiOwotICAgICAgICBjYXNlIEVORF9PRl9GSUxFICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBFbmQgb2YgZmlsZSI7Ci0gICAgICAgIGNhc2UgSU5URVJSVVBURUQgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVycnVwdGVkIjsKLSAgICAgICAgY2FzZSBCQURfQVJHUyAgICAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW52YWxpZCBhcmd1bWVudHMiOwotICAgICAgICBjYXNlIENPUlJVUFRFRF9EQVRBIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBDb3JydXB0ZWQgRGF0YSI7Ci0gICAgICAgIGNhc2UgSU5URVJOQUxfRVJST1IgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVybmFsIGVycm9yIjsKLSAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7Ci0gICAgfQotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLwotICBzdGQ6OnN0cmluZyBzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KTsKLQotICAvKiogRXJyb3IgY29kZSAqLwotICBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlXzsKLQotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0MGZhNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11aW50MzJfdCBUUGlwZWRUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgbmVlZCA9IGxlbjsKLQotICAvLyBXZSBkb24ndCBoYXZlIGVub3VnaCBkYXRhIHlldAotICBpZiAockxlbl8tclBvc18gPCBuZWVkKSB7Ci0gICAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZQotICAgIGlmIChyTGVuXy1yUG9zXyA+IDApIHsKLSAgICAgIG1lbWNweShidWYsIHJCdWZfK3JQb3NfLCByTGVuXy1yUG9zXyk7Ci0gICAgICBuZWVkIC09IHJMZW5fLXJQb3NfOwotICAgICAgYnVmICs9IHJMZW5fLXJQb3NfOwotICAgICAgclBvc18gPSByTGVuXzsKLSAgICB9Ci0KLSAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKLSAgICBpZiAockxlbl8gPT0gckJ1ZlNpemVfKSB7Ci0gICAgICByQnVmU2l6ZV8gKj0yOwotICAgICAgckJ1Zl8gPSAodWludDhfdCAqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKLSAgICB9Ci0KLSAgICAvLyB0cnkgdG8gZmlsbCB1cCB0aGUgYnVmZmVyCi0gICAgckxlbl8gKz0gc3JjVHJhbnNfLT5yZWFkKHJCdWZfK3JQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7Ci0gIH0KLQotCi0gIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlCi0gIHVpbnQzMl90IGdpdmUgPSBuZWVkOwotICBpZiAockxlbl8tclBvc18gPCBnaXZlKSB7Ci0gICAgZ2l2ZSA9IHJMZW5fLXJQb3NfOwotICB9Ci0gIGlmIChnaXZlID4gMCkgewotICAgIG1lbWNweShidWYsIHJCdWZfK3JQb3NfLCBnaXZlKTsKLSAgICByUG9zXyArPSBnaXZlOwotICAgIG5lZWQgLT0gZ2l2ZTsKLSAgfQotCi0gIHJldHVybiAobGVuIC0gbmVlZCk7Ci19Ci0KLXZvaWQgVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBpZiAobGVuID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBNYWtlIHRoZSBidWZmZXIgYXMgYmlnIGFzIGl0IG5lZWRzIHRvIGJlCi0gIGlmICgobGVuICsgd0xlbl8pID49IHdCdWZTaXplXykgewotICAgIHVpbnQzMl90IG5ld0J1ZlNpemUgPSB3QnVmU2l6ZV8qMjsKLSAgICB3aGlsZSAoKGxlbiArIHdMZW5fKSA+PSBuZXdCdWZTaXplKSB7Ci0gICAgICBuZXdCdWZTaXplICo9IDI7Ci0gICAgfQotICAgIHdCdWZfID0gKHVpbnQ4X3QgKilzdGQ6OnJlYWxsb2Mod0J1Zl8sIHNpemVvZih1aW50OF90KSAqIG5ld0J1ZlNpemUpOwotICAgIHdCdWZTaXplXyA9IG5ld0J1ZlNpemU7Ci0gIH0KLQotICAvLyBDb3B5IGludG8gdGhlIGJ1ZmZlcgotICBtZW1jcHkod0J1Zl8gKyB3TGVuXywgYnVmLCBsZW4pOwotICB3TGVuXyArPSBsZW47Ci19Ci0KLXZvaWQgVFBpcGVkVHJhbnNwb3J0OjpmbHVzaCgpICB7Ci0gIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIKLSAgaWYgKHdMZW5fID4gMCkgewotICAgIHNyY1RyYW5zXy0+d3JpdGUod0J1Zl8sIHdMZW5fKTsKLSAgICB3TGVuXyA9IDA7Ci0gIH0KLQotICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgc3JjVHJhbnNfLT5mbHVzaCgpOwotfQotCi1UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCi0gIDogVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFucyksCi0gICAgc3JjVHJhbnNfKHNyY1RyYW5zKSB7Ci19Ci0KLVRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6On5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCkgewotfQotCi1ib29sIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmlzT3BlbigpIHsKLSAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6aXNPcGVuKCk7Ci19Ci0KLWJvb2wgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6cGVlaygpIHsKLSAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cGVlaygpOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6Om9wZW4oKSB7Ci0gIFRQaXBlZFRyYW5zcG9ydDo6b3BlbigpOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmNsb3NlKCkgewotICBUUGlwZWRUcmFuc3BvcnQ6OmNsb3NlKCk7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgcmV0dXJuIFRQaXBlZFRyYW5zcG9ydDo6cmVhZChidWYsIGxlbik7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgdWludDMyX3QgaGF2ZSA9IDA7Ci0gIHVpbnQzMl90IGdldCA9IDA7Ci0KLSAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKLSAgICBnZXQgPSByZWFkKGJ1ZitoYXZlLCBsZW4taGF2ZSk7Ci0gICAgaWYgKGdldCA8PSAwKSB7Ci0gICAgICB0aHJvdyBURU9GRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGhhdmUgKz0gZ2V0OwotICB9Ci0KLSAgcmV0dXJuIGhhdmU7Ci19Ci0KLXZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6cmVhZEVuZCgpIHsKLSAgVFBpcGVkVHJhbnNwb3J0OjpyZWFkRW5kKCk7Ci19Ci0KLXZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgVFBpcGVkVHJhbnNwb3J0Ojp3cml0ZShidWYsIGxlbik7Ci19Ci0KLXZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6d3JpdGVFbmQoKSB7Ci0gIFRQaXBlZFRyYW5zcG9ydDo6d3JpdGVFbmQoKTsKLX0KLQotdm9pZCBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpmbHVzaCgpIHsKLSAgVFBpcGVkVHJhbnNwb3J0OjpmbHVzaCgpOwotfQotCi1pbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmdldFJlYWRUaW1lb3V0KCkgewotICByZXR1cm4gc3JjVHJhbnNfLT5nZXRSZWFkVGltZW91dCgpOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpIHsKLSAgc3JjVHJhbnNfLT5zZXRSZWFkVGltZW91dChyZWFkVGltZW91dCk7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmdldE51bUNodW5rcygpIHsKLSAgcmV0dXJuIHNyY1RyYW5zXy0+Z2V0TnVtQ2h1bmtzKCk7Ci19Ci0KLXVpbnQzMl90IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OmdldEN1ckNodW5rKCkgewotICByZXR1cm4gc3JjVHJhbnNfLT5nZXRDdXJDaHVuaygpOwotfQotCi12b2lkIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6OnNlZWtUb0NodW5rKGludDMyX3QgY2h1bmspIHsKLSAgc3JjVHJhbnNfLT5zZWVrVG9DaHVuayhjaHVuayk7Ci19Ci0KLXZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6c2Vla1RvRW5kKCkgewotICBzcmNUcmFuc18tPnNlZWtUb0VuZCgpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oIGIvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjVjOTE2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVFVUSUxTX0hfCi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXyAxCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgotLy8gSW5jbHVkZSB0aGUgYnVmZmVyZWQgdHJhbnNwb3J0cyB0aGF0IHVzZWQgdG8gYmUgZGVmaW5lZCBoZXJlLgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi0vKioKLSAqIFRoZSBudWxsIHRyYW5zcG9ydCBpcyBhIGR1bW15IHRyYW5zcG9ydCB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcuCi0gKiBJdCdzIHNvcnQgb2YgYW4gYW5hbG9neSB0byAvZGV2L251bGwsIHlvdSBjYW4gbmV2ZXIgcmVhZCBhbnl0aGluZyBmcm9tIGl0Ci0gKiBhbmQgaXQgd2lsbCBsZXQgeW91IHdyaXRlIGFueXRoaW5nIHlvdSB3YW50IHRvIGl0LCB0aG91Z2ggaXQgd29uJ3QgYWN0dWFsbHkKLSAqIGdvIGFueXdoZXJlLgotICoKLSAqLwotY2xhc3MgVE51bGxUcmFuc3BvcnQgOiBwdWJsaWMgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUTnVsbFRyYW5zcG9ydCgpIHt9Ci0KLSAgflROdWxsVHJhbnNwb3J0KCkge30KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgb3BlbigpIHt9Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHJldHVybjsKLSAgfQotCi19OwotCi0KLS8qKgotICogVFBpcGVkVHJhbnNwb3J0LiBUaGlzIHRyYW5zcG9ydCBhbGxvd3MgcGlwaW5nIG9mIGEgcmVxdWVzdCBmcm9tIG9uZQotICogdHJhbnNwb3J0IHRvIGFub3RoZXIgZWl0aGVyIHdoZW4gcmVhZEVuZCgpIG9yIHdyaXRlRW5kKCkuIFRoZSB0eXBpY2FsCi0gKiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byBsb2cgYSByZXF1ZXN0IG9yIGEgcmVwbHkgdG8gZGlzay4KLSAqIFRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBleHBhbmRzIHRvIGEga2VlcCBhIGNvcHkgb2YgdGhlIGVudGlyZQotICogcmVxdWVzdC9yZXNwb25zZS4KLSAqCi0gKi8KLWNsYXNzIFRQaXBlZFRyYW5zcG9ydCA6IHZpcnR1YWwgcHVibGljIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIDoKLSAgICBzcmNUcmFuc18oc3JjVHJhbnMpLAotICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCi0gICAgckJ1ZlNpemVfKDUxMiksIHJQb3NfKDApLCByTGVuXygwKSwKLSAgICB3QnVmU2l6ZV8oNTEyKSwgd0xlbl8oMCkgewotCi0gICAgLy8gZGVmYXVsdCBpcyB0byB0byBwaXBlIHRoZSByZXF1ZXN0IHdoZW4gcmVhZEVuZCgpIGlzIGNhbGxlZAotICAgIHBpcGVPblJlYWRfID0gdHJ1ZTsKLSAgICBwaXBlT25Xcml0ZV8gPSBmYWxzZTsKLQotICAgIHJCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOwotICAgIHdCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOwotICB9Ci0KLSAgVFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeikgOgotICAgIHNyY1RyYW5zXyhzcmNUcmFucyksCi0gICAgZHN0VHJhbnNfKGRzdFRyYW5zKSwKLSAgICByQnVmU2l6ZV8oNTEyKSwgclBvc18oMCksIHJMZW5fKDApLAotICAgIHdCdWZTaXplXyhzeiksIHdMZW5fKDApIHsKLQotICAgIHJCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOwotICAgIHdCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOwotICB9Ci0KLSAgflRQaXBlZFRyYW5zcG9ydCgpIHsKLSAgICBzdGQ6OmZyZWUockJ1Zl8pOwotICAgIHN0ZDo6ZnJlZSh3QnVmXyk7Ci0gIH0KLQotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gc3JjVHJhbnNfLT5pc09wZW4oKTsKLSAgfQotCi0gIGJvb2wgcGVlaygpIHsKLSAgICBpZiAoclBvc18gPj0gckxlbl8pIHsKLSAgICAgIC8vIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBidWZmZXIgaWYgaXQgaXMgZnVsbAotICAgICAgaWYgKHJMZW5fID09IHJCdWZTaXplXykgewotICAgICAgICByQnVmU2l6ZV8gKj0yOwotICAgICAgICByQnVmXyA9ICh1aW50OF90ICopc3RkOjpyZWFsbG9jKHJCdWZfLCBzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOwotICAgICAgfQotCi0gICAgICAvLyB0cnkgdG8gZmlsbCB1cCB0aGUgYnVmZmVyCi0gICAgICByTGVuXyArPSBzcmNUcmFuc18tPnJlYWQockJ1Zl8rclBvc18sIHJCdWZTaXplXyAtIHJQb3NfKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyTGVuXyA+IHJQb3NfKTsKLSAgfQotCi0KLSAgdm9pZCBvcGVuKCkgewotICAgIHNyY1RyYW5zXy0+b3BlbigpOwotICB9Ci0KLSAgdm9pZCBjbG9zZSgpIHsKLSAgICBzcmNUcmFuc18tPmNsb3NlKCk7Ci0gIH0KLQotICB2b2lkIHNldFBpcGVPblJlYWQoYm9vbCBwaXBlVmFsKSB7Ci0gICAgcGlwZU9uUmVhZF8gPSBwaXBlVmFsOwotICB9Ci0KLSAgdm9pZCBzZXRQaXBlT25Xcml0ZShib29sIHBpcGVWYWwpIHsKLSAgICBwaXBlT25Xcml0ZV8gPSBwaXBlVmFsOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCByZWFkRW5kKCkgewotCi0gICAgaWYgKHBpcGVPblJlYWRfKSB7Ci0gICAgICBkc3RUcmFuc18tPndyaXRlKHJCdWZfLCByUG9zXyk7Ci0gICAgICBkc3RUcmFuc18tPmZsdXNoKCk7Ci0gICAgfQotCi0gICAgc3JjVHJhbnNfLT5yZWFkRW5kKCk7Ci0KLSAgICAvLyBJZiByZXF1ZXN0cyBhcmUgYmVpbmcgcGlwZWxpbmVkLCBjb3B5IGRvd24gb3VyIHJlYWQtYWhlYWQgZGF0YSwKLSAgICAvLyB0aGVuIHJlc2V0IG91ciBzdGF0ZS4KLSAgICBpbnQgcmVhZF9haGVhZCA9IHJMZW5fIC0gclBvc187Ci0gICAgbWVtY3B5KHJCdWZfLCByQnVmXyArIHJQb3NfLCByZWFkX2FoZWFkKTsKLSAgICByUG9zXyA9IDA7Ci0gICAgckxlbl8gPSByZWFkX2FoZWFkOwotICB9Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCB3cml0ZUVuZCgpIHsKLSAgICBpZiAocGlwZU9uV3JpdGVfKSB7Ci0gICAgICBkc3RUcmFuc18tPndyaXRlKHdCdWZfLCB3TGVuXyk7Ci0gICAgICBkc3RUcmFuc18tPmZsdXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBmbHVzaCgpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRhcmdldFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gZHN0VHJhbnNfOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnNfOwotCi0gIHVpbnQ4X3QqIHJCdWZfOwotICB1aW50MzJfdCByQnVmU2l6ZV87Ci0gIHVpbnQzMl90IHJQb3NfOwotICB1aW50MzJfdCByTGVuXzsKLQotICB1aW50OF90KiB3QnVmXzsKLSAgdWludDMyX3Qgd0J1ZlNpemVfOwotICB1aW50MzJfdCB3TGVuXzsKLQotICBib29sIHBpcGVPblJlYWRfOwotICBib29sIHBpcGVPbldyaXRlXzsKLX07Ci0KLQotLyoqCi0gKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgcGlwZWRUcmFuc3BvcnQgaW5zdGFuY2UuCi0gKgotICovCi1jbGFzcyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7Ci0gICAgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChkc3RUcmFucyk7Ci0gIH0KLSAgdmlydHVhbCB+VFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgLyoqCi0gICAqIFdyYXBzIHRoZSBiYXNlIHRyYW5zcG9ydCBpbnRvIGEgcGlwZWQgdHJhbnNwb3J0LgotICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgewotICAgIGlmIChkc3RUcmFuc18uZ2V0KCkgPT0gTlVMTCkgewotICAgICAgZHN0VHJhbnNfID0gZHN0VHJhbnM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlRhcmdldCB0cmFuc3BvcnQgYWxyZWFkeSBpbml0aWFsaXplZCIpOwotICAgIH0KLSAgfQotCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187Ci19OwotCi0vKioKLSAqIFRQaXBlZEZpbGVUcmFuc3BvcnQuIFRoaXMgaXMganVzdCBsaWtlIGEgVFRyYW5zcG9ydCwgZXhjZXB0IHRoYXQKLSAqIGl0IGlzIGEgdGVtcGxhdGl6ZWQgY2xhc3MsIHNvIHRoYXQgY2xpZW50cyB3aG8gcmVseSBvbiBhIHNwZWNpZmljCi0gKiBUVHJhbnNwb3J0IGNhbiBzdGlsbCBhY2Nlc3MgdGhlIG9yaWdpbmFsIHRyYW5zcG9ydC4KLSAqCi0gKi8KLWNsYXNzIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBURmlsZVJlYWRlclRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpOwotCi0gIH5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7Ci0KLSAgLy8gVFRyYW5zcG9ydCBmdW5jdGlvbnMKLSAgYm9vbCBpc09wZW4oKTsKLSAgYm9vbCBwZWVrKCk7Ci0gIHZvaWQgb3BlbigpOwotICB2b2lkIGNsb3NlKCk7Ci0gIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKLSAgdm9pZCByZWFkRW5kKCk7Ci0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICB2b2lkIHdyaXRlRW5kKCk7Ci0gIHZvaWQgZmx1c2goKTsKLQotICAvLyBURmlsZVJlYWRlclRyYW5zcG9ydCBmdW5jdGlvbnMKLSAgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpOwotICB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpOwotICB1aW50MzJfdCBnZXROdW1DaHVua3MoKTsKLSAgdWludDMyX3QgZ2V0Q3VyQ2h1bmsoKTsKLSAgdm9pZCBzZWVrVG9DaHVuayhpbnQzMl90IGNodW5rKTsKLSAgdm9pZCBzZWVrVG9FbmQoKTsKLQotIHByb3RlY3RlZDoKLSAgLy8gc2hvdWxkbid0IGJlIHVzZWQKLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgpOwotICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnNfOwotfTsKLQotLyoqCi0gKiBDcmVhdGVzIGEgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCBmcm9tIGEgZmlsZXBhdGggYW5kIGEgZGVzdGluYXRpb24gdHJhbnNwb3J0Ci0gKgotICovCi1jbGFzcyBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCi0gICAgOiBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGRzdFRyYW5zKQotICB7fQotICB2aXJ0dWFsIH5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHBGaWxlUmVhZGVyVHJhbnNwb3J0ID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRGaWxlUmVhZGVyVHJhbnNwb3J0PihzcmNUcmFucyk7Ci0gICAgaWYgKHBGaWxlUmVhZGVyVHJhbnNwb3J0LmdldCgpICE9IE5VTEwpIHsKLSAgICAgIHJldHVybiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KHBGaWxlUmVhZGVyVHJhbnNwb3J0KTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KCk7Ci0gICAgfQotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGdldEZpbGVSZWFkZXJUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PihuZXcgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7Ci0gIH0KLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTRlOTAuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHpsaWIuaD4KLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KLS8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmluaXRabGliKCkgewotICBpbnQgcnY7Ci0gIGJvb2wgcl9pbml0ID0gZmFsc2U7Ci0gIHRyeSB7Ci0gICAgcnN0cmVhbV8gPSBuZXcgel9zdHJlYW07Ci0gICAgd3N0cmVhbV8gPSBuZXcgel9zdHJlYW07Ci0KLSAgICByc3RyZWFtXy0+emFsbG9jID0gWl9OVUxMOwotICAgIHdzdHJlYW1fLT56YWxsb2MgPSBaX05VTEw7Ci0gICAgcnN0cmVhbV8tPnpmcmVlICA9IFpfTlVMTDsKLSAgICB3c3RyZWFtXy0+emZyZWUgID0gWl9OVUxMOwotICAgIHJzdHJlYW1fLT5vcGFxdWUgPSBaX05VTEw7Ci0gICAgd3N0cmVhbV8tPm9wYXF1ZSA9IFpfTlVMTDsKLQotICAgIHJzdHJlYW1fLT5uZXh0X2luICAgPSBjcmJ1Zl87Ci0gICAgd3N0cmVhbV8tPm5leHRfaW4gICA9IHV3YnVmXzsKLSAgICByc3RyZWFtXy0+bmV4dF9vdXQgID0gdXJidWZfOwotICAgIHdzdHJlYW1fLT5uZXh0X291dCAgPSBjd2J1Zl87Ci0gICAgcnN0cmVhbV8tPmF2YWlsX2luICA9IDA7Ci0gICAgd3N0cmVhbV8tPmF2YWlsX2luICA9IDA7Ci0gICAgcnN0cmVhbV8tPmF2YWlsX291dCA9IHVyYnVmX3NpemVfOwotICAgIHdzdHJlYW1fLT5hdmFpbF9vdXQgPSBjd2J1Zl9zaXplXzsKLQotICAgIHJ2ID0gaW5mbGF0ZUluaXQocnN0cmVhbV8pOwotICAgIGNoZWNrWmxpYlJ2KHJ2LCByc3RyZWFtXy0+bXNnKTsKLQotICAgIC8vIEhhdmUgdG8gc2V0IHRoaXMgZmxhZyBzbyB3ZSBrbm93IHdoZXRoZXIgdG8gZGUtaW5pdGlhbGl6ZS4KLSAgICByX2luaXQgPSB0cnVlOwotCi0gICAgcnYgPSBkZWZsYXRlSW5pdCh3c3RyZWFtXywgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKLSAgICBjaGVja1psaWJSdihydiwgd3N0cmVhbV8tPm1zZyk7Ci0gIH0KLQotICBjYXRjaCAoLi4uKSB7Ci0gICAgaWYgKHJfaW5pdCkgewotICAgICAgcnYgPSBpbmZsYXRlRW5kKHJzdHJlYW1fKTsKLSAgICAgIGNoZWNrWmxpYlJ2Tm90aHJvdyhydiwgcnN0cmVhbV8tPm1zZyk7Ci0gICAgfQotICAgIC8vIFRoZXJlIGlzIG5vIHdheSB3ZSBjYW4gZ2V0IGhlcmUgaWYgd3N0cmVhbV8gd2FzIGluaXRpYWxpemVkLgotCi0gICAgdGhyb3c7Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OmNoZWNrWmxpYlJ2KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKLSAgaWYgKHN0YXR1cyAhPSBaX09LKSB7Ci0gICAgdGhyb3cgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24oc3RhdHVzLCBtZXNzYWdlKTsKLSAgfQotfQotCi1pbmxpbmUgdm9pZCBUWmxpYlRyYW5zcG9ydDo6Y2hlY2tabGliUnZOb3Rocm93KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKLSAgaWYgKHN0YXR1cyAhPSBaX09LKSB7Ci0gICAgc3RyaW5nIG91dHB1dCA9ICJUWmxpYlRyYW5zcG9ydDogemxpYiBmYWlsdXJlIGluIGRlc3RydWN0b3I6ICIgKwotICAgICAgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb246OmVycm9yTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UpOwotICAgIEdsb2JhbE91dHB1dChvdXRwdXQuY19zdHIoKSk7Ci0gIH0KLX0KLQotVFpsaWJUcmFuc3BvcnQ6On5UWmxpYlRyYW5zcG9ydCgpIHsKLSAgaW50IHJ2OwotICBydiA9IGluZmxhdGVFbmQocnN0cmVhbV8pOwotICBjaGVja1psaWJSdk5vdGhyb3cocnYsIHJzdHJlYW1fLT5tc2cpOwotICBydiA9IGRlZmxhdGVFbmQod3N0cmVhbV8pOwotICBjaGVja1psaWJSdk5vdGhyb3cocnYsIHdzdHJlYW1fLT5tc2cpOwotCi0gIGRlbGV0ZVtdIHVyYnVmXzsKLSAgZGVsZXRlW10gY3JidWZfOwotICBkZWxldGVbXSB1d2J1Zl87Ci0gIGRlbGV0ZVtdIGN3YnVmXzsKLSAgZGVsZXRlIHJzdHJlYW1fOwotICBkZWxldGUgd3N0cmVhbV87Ci19Ci0KLWJvb2wgVFpsaWJUcmFuc3BvcnQ6OmlzT3BlbigpIHsKLSAgcmV0dXJuIChyZWFkQXZhaWwoKSA+IDApIHx8IHRyYW5zcG9ydF8tPmlzT3BlbigpOwotfQotCi0vLyBSRUFESU5HIFNUUkFURUdZCi0vLwotLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3IgcmVhZGluZzogb25lIGNvbnRhaW5pbmcgdGhlIGNvbXByZXNzZWQgZGF0YSAoY3JidWZfKQotLy8gYW5kIG9uZSBjb250YWluaW5nIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAodXJidWZfKS4gIFdoZW4gcmVhZCBpcyBjYWxsZWQsCi0vLyB3ZSByZXBlYXQgdGhlIGZvbGxvd2luZyBzdGVwcyB1bnRpbCB3ZSBoYXZlIHNhdGlzZmllZCB0aGUgcmVxdWVzdDoKLS8vIC0gQ29weSBkYXRhIGZyb20gdXJidWZfIGludG8gdGhlIGNhbGxlcidzIGJ1ZmZlci4KLS8vIC0gSWYgd2UgaGFkIGVub3VnaCwgcmV0dXJuLgotLy8gLSBJZiB1cmJ1Zl8gaXMgZW1wdHksIHJlYWQgc29tZSBkYXRhIGludG8gaXQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0vLyAtIEluZmxhdGUgZGF0YSBmcm9tIGNyYnVmXyBpbnRvIHVyYnVmXy4KLS8vCi0vLyBJbiBzdGFuZGFsb25lIG9iamVjdHMsIHdlIHNldCBpbnB1dF9lbmRlZF8gdG8gdHJ1ZSB3aGVuIGluZmxhdGUgcmV0dXJucwotLy8gWl9TVFJFQU1fRU5ELiAgVGhpcyBhbGxvd3MgdG8gbWFrZSBzdXJlIHRoYXQgYSBjaGVja3N1bSB3YXMgdmVyaWZpZWQuCi0KLWlubGluZSBpbnQgVFpsaWJUcmFuc3BvcnQ6OnJlYWRBdmFpbCgpIHsKLSAgcmV0dXJuIHVyYnVmX3NpemVfIC0gcnN0cmVhbV8tPmF2YWlsX291dCAtIHVycG9zXzsKLX0KLQotdWludDMyX3QgVFpsaWJUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgaW50IG5lZWQgPSBsZW47Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBTa2lwIHVyYnVmIG9uIGJpZyByZWFkcy4KLQotICB3aGlsZSAodHJ1ZSkgewotICAgIC8vIENvcHkgb3V0IHdoYXRldmVyIHdlIGhhdmUgYXZhaWxhYmxlLCB0aGVuIGdpdmUgdGhlbSB0aGUgbWluIG9mCi0gICAgLy8gd2hhdCB3ZSBoYXZlIGFuZCB3aGF0IHRoZXkgd2FudCwgdGhlbiBhZHZhbmNlIGluZGljZXMuCi0gICAgaW50IGdpdmUgPSBzdGQ6Om1pbihyZWFkQXZhaWwoKSwgbmVlZCk7Ci0gICAgbWVtY3B5KGJ1ZiwgdXJidWZfICsgdXJwb3NfLCBnaXZlKTsKLSAgICBuZWVkIC09IGdpdmU7Ci0gICAgYnVmICs9IGdpdmU7Ci0gICAgdXJwb3NfICs9IGdpdmU7Ci0KLSAgICAvLyBJZiB0aGV5IHdlcmUgc2F0aXNmaWVkLCB3ZSBhcmUgZG9uZS4KLSAgICBpZiAobmVlZCA9PSAwKSB7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLQotICAgIC8vIElmIHdlIGdldCB0byB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGdldCBzb21lIG1vcmUgZGF0YS4KLQotICAgIC8vIElmIHpsaWIgaGFzIHJlcG9ydGVkIHRoZSBlbmQgb2YgYSBzdHJlYW0sIHdlIGNhbid0IHJlYWxseSBkbyBhbnkgbW9yZS4KLSAgICBpZiAoaW5wdXRfZW5kZWRfKSB7Ci0gICAgICByZXR1cm4gbGVuIC0gbmVlZDsKLSAgICB9Ci0KLSAgICAvLyBUaGUgdW5jb21wcmVzc2VkIHJlYWQgYnVmZmVyIGlzIGVtcHR5LCBzbyByZXNldCB0aGUgc3RyZWFtIGZpZWxkcy4KLSAgICByc3RyZWFtXy0+bmV4dF9vdXQgID0gdXJidWZfOwotICAgIHJzdHJlYW1fLT5hdmFpbF9vdXQgPSB1cmJ1Zl9zaXplXzsKLSAgICB1cnBvc18gPSAwOwotCi0gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBjb21wcmVzc2VkIGRhdGEgYXZhaWxhYmxlLAotICAgIC8vIHJlYWQgc29tZSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLSAgICBpZiAocnN0cmVhbV8tPmF2YWlsX2luID09IDApIHsKLSAgICAgIHVpbnQzMl90IGdvdCA9IHRyYW5zcG9ydF8tPnJlYWQoY3JidWZfLCBjcmJ1Zl9zaXplXyk7Ci0gICAgICBpZiAoZ290ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGxlbiAtIG5lZWQ7Ci0gICAgICB9Ci0gICAgICByc3RyZWFtXy0+bmV4dF9pbiAgPSBjcmJ1Zl87Ci0gICAgICByc3RyZWFtXy0+YXZhaWxfaW4gPSBnb3Q7Ci0gICAgfQotCi0gICAgLy8gV2UgaGF2ZSBzb21lIGNvbXByZXNzZWQgZGF0YSBub3cuICBVbmNvbXByZXNzIGl0LgotICAgIGludCB6bGliX3J2ID0gaW5mbGF0ZShyc3RyZWFtXywgWl9TWU5DX0ZMVVNIKTsKLQotICAgIGlmICh6bGliX3J2ID09IFpfU1RSRUFNX0VORCkgewotICAgICAgaWYgKHN0YW5kYWxvbmVfKSB7Ci0gICAgICAgIGlucHV0X2VuZGVkXyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNoZWNrWmxpYlJ2KHpsaWJfcnYsIHJzdHJlYW1fLT5tc2cpOwotICAgIH0KLQotICAgIC8vIE9rYXkuICBUaGUgcmVhZCBidWZmZXIgc2hvdWxkIGhhdmUgd2hhdGV2ZXIgd2UgY2FuIGdpdmUgaXQgbm93LgotICAgIC8vIExvb3AgYmFjayB0byB0aGUgc3RhcnQgYW5kIHRyeSB0byBnaXZlIHNvbWUgbW9yZS4KLSAgfQotfQotCi0KLS8vIFdSSVRJTkcgU1RSQVRFR1kKLS8vCi0vLyBXZSBidWZmZXIgdXAgc21hbGwgd3JpdGVzIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gemxpYiwgc28gb3VyIGxvZ2ljIGlzOgotLy8gLSBJcyB0aGUgd3JpdGUgYmlnPwotLy8gICAtIFNlbmQgdGhlIGJ1ZmZlciB0byB6bGliLgotLy8gICAtIFNlbmQgdGhpcyBkYXRhIHRvIHpsaWIuCi0vLyAtIElzIHRoZSB3cml0ZSBzbWFsbD8KLS8vICAgLSBJcyB0aGVyZSBpbnN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgaXQ/Ci0vLyAgICAgLSBTZW5kIHRoZSBidWZmZXIgdG8gemxpYi4KLS8vICAgLSBDb3B5IHRoZSBkYXRhIHRvIHRoZSBidWZmZXIuCi0vLwotLy8gV2UgaGF2ZSB0d28gYnVmZmVycyBmb3Igd3JpdGluZyBhbHNvOiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlciAobWVudGlvbmVkCi0vLyBhYm92ZSkgYW5kIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4gIFdoZW4gc2VuZGluZyBkYXRhIHRvIHpsaWIgd2UgbG9vcCBvdmVyCi0vLyB0aGUgZm9sbG93aW5nIHVudGlsIHRoZSBzb3VyY2UgKHVuY29tcHJlc3NlZCBidWZmZXIgb3IgYmlnIHdyaXRlKSBpcyBlbXB0eToKLS8vIC0gSXMgdGhlcmUgbm8gbW9yZSBzcGFjZSBpbiB0aGUgY29tcHJlc3NlZCBidWZmZXI/Ci0vLyAgIC0gV3JpdGUgdGhlIGNvbXByZXNzZWQgYnVmZmVyIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KLS8vIC0gRGVmbGF0ZSBmcm9tIHRoZSBzb3VyY2UgaW50byB0aGUgY29tcHJlc3NlZCBidWZmZXIuCi0KLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIC8vIHpsaWIncyAiZGVmbGF0ZSIgZnVuY3Rpb24gaGFzIGVub3VnaCBsb2dpYyBpbiBpdCB0aGF0IEkgdGhpbmsKLSAgLy8gd2UncmUgYmV0dGVyIG9mZiAocGVyZm9ybWFuY2Utd2lzZSkgYnVmZmVyaW5nIHVwIHNtYWxsIHdyaXRlcy4KLSAgaWYgKChpbnQpbGVuID4gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKLSAgICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXyk7Ci0gICAgdXdwb3NfID0gMDsKLSAgICBmbHVzaFRvWmxpYihidWYsIGxlbik7Ci0gIH0gZWxzZSBpZiAobGVuID4gMCkgewotICAgIGlmICh1d2J1Zl9zaXplXyAtIHV3cG9zXyA8IChpbnQpbGVuKSB7Ci0gICAgICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXyk7Ci0gICAgICB1d3Bvc18gPSAwOwotICAgIH0KLSAgICBtZW1jcHkodXdidWZfICsgdXdwb3NfLCBidWYsIGxlbik7Ci0gICAgdXdwb3NfICs9IGxlbjsKLSAgfQotfQotCi12b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaCgpICB7Ci0gIGZsdXNoVG9abGliKHV3YnVmXywgdXdwb3NfLCB0cnVlKTsKLSAgYXNzZXJ0KChpbnQpd3N0cmVhbV8tPmF2YWlsX291dCAhPSBjd2J1Zl9zaXplXyk7Ci0gIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8gLSB3c3RyZWFtXy0+YXZhaWxfb3V0KTsKLSAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKLX0KLQotdm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2hUb1psaWIoY29uc3QgdWludDhfdCogYnVmLCBpbnQgbGVuLCBib29sIGZpbmlzaCkgewotICBpbnQgZmx1c2ggPSAoZmluaXNoID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTsKLQotICB3c3RyZWFtXy0+bmV4dF9pbiAgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihidWYpOwotICB3c3RyZWFtXy0+YXZhaWxfaW4gPSBsZW47Ci0KLSAgd2hpbGUgKHdzdHJlYW1fLT5hdmFpbF9pbiA+IDAgfHwgZmluaXNoKSB7Ci0gICAgLy8gSWYgb3VyIG91cHV0IGJ1ZmZlciBpcyBmdWxsLCBmbHVzaCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gICAgaWYgKHdzdHJlYW1fLT5hdmFpbF9vdXQgPT0gMCkgewotICAgICAgdHJhbnNwb3J0Xy0+d3JpdGUoY3didWZfLCBjd2J1Zl9zaXplXyk7Ci0gICAgICB3c3RyZWFtXy0+bmV4dF9vdXQgID0gY3didWZfOwotICAgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOwotICAgIH0KLQotICAgIGludCB6bGliX3J2ID0gZGVmbGF0ZSh3c3RyZWFtXywgZmx1c2gpOwotCi0gICAgaWYgKGZpbmlzaCAmJiB6bGliX3J2ID09IFpfU1RSRUFNX0VORCkgewotICAgICAgYXNzZXJ0KHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNoZWNrWmxpYlJ2KHpsaWJfcnYsIHdzdHJlYW1fLT5tc2cpOwotICB9Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIFRabGliVHJhbnNwb3J0Ojpib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gIC8vIERvbid0IHRyeSB0byBiZSBjbGV2ZXIgd2l0aCBzaGlmdGluZyBidWZmZXJzLgotICAvLyBJZiB3ZSBoYXZlIGVub3VnaCBkYXRhLCBnaXZlIGEgcG9pbnRlciB0byBpdCwKLSAgLy8gb3RoZXJ3aXNlIGxldCB0aGUgcHJvdGNvbCB1c2UgaXRzIHNsb3cgcGF0aC4KLSAgaWYgKHJlYWRBdmFpbCgpID49IChpbnQpKmxlbikgewotICAgICpsZW4gPSAodWludDMyX3QpcmVhZEF2YWlsKCk7Ci0gICAgcmV0dXJuIHVyYnVmXyArIHVycG9zXzsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBUWmxpYlRyYW5zcG9ydDo6Y29uc3VtZSh1aW50MzJfdCBsZW4pIHsKLSAgaWYgKHJlYWRBdmFpbCgpID49IChpbnQpbGVuKSB7Ci0gICAgdXJwb3NfICs9IGxlbjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWUgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3cuIik7Ci0gIH0KLX0KLQotdm9pZCBUWmxpYlRyYW5zcG9ydDo6dmVyaWZ5Q2hlY2tzdW0oKSB7Ci0gIGlmICghc3RhbmRhbG9uZV8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgIlRaTGliVHJhbnNwb3J0IGNhbiBvbmx5IHZlcmlmeSBjaGVja3N1bXMgZm9yIHN0YW5kYWxvbmUgb2JqZWN0cy4iKTsKLSAgfQotCi0gIGlmICghaW5wdXRfZW5kZWRfKSB7Ci0gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiByZWFkaW5nIGlzIGNvbXBsZXRlLAotICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHdob2xlIGNoZWNrc3VtIGhhcyBub3QgYmVlbiBmZWQgdG8gemxpYiB5ZXQuCi0gICAgLy8gV2UgdHJ5IHRvIHJlYWQgYW4gZXh0cmEgYnl0ZSBoZXJlIHRvIGZvcmNlIHpsaWIgdG8gZmluaXNoIHRoZSBzdHJlYW0uCi0gICAgLy8gSXQgbWlnaHQgbm90IGFsd2F5cyBiZSBlYXN5IHRvICJ1bnJlYWQiIHRoaXMgYnl0ZSwKLSAgICAvLyBidXQgd2UgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHdlIGdldCBpdCwgd2hpY2ggaXMgbm90IHJlYWxseQotICAgIC8vIGEgcmVjb3ZlcmFibGUgZXJyb3IsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyLgotICAgIHVpbnQ4X3QgYnVmWzFdOwotICAgIHVpbnQzMl90IGdvdCA9IHRoaXMtPnJlYWQoYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgaWYgKGdvdCB8fCAhaW5wdXRfZW5kZWRfKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAotICAgICAgICAgICJabGliIHN0cmVhbSBub3QgY29tcGxldGUuIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgdGhlIGNoZWNrc3VtIGhhZCBiZWVuIGJhZCwgd2Ugd291bGQgaGF2ZSBnb3R0ZW4gYW4gZXJyb3Igd2hpbGUKLSAgLy8gaW5mbGF0aW5nLgotfQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDM5ZDlkLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXwotI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UWkxJQlRSQU5TUE9SVF9IXyAxCi0KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0KLXN0cnVjdCB6X3N0cmVhbV9zOwotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi1jbGFzcyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZykgOgotICAgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2Uoc3RhdHVzLCBtc2cpKSwKLSAgICB6bGliX3N0YXR1c18oc3RhdHVzKSwKLSAgICB6bGliX21zZ18obXNnID09IE5VTEwgPyAiKG51bGwpIiA6IG1zZykge30KLQotICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbigpIHRocm93KCkge30KLQotICBpbnQgZ2V0WmxpYlN0YXR1cygpIHsgcmV0dXJuIHpsaWJfc3RhdHVzXzsgfQotICBzdGQ6OnN0cmluZyBnZXRabGliTWVzc2FnZSgpIHsgcmV0dXJuIHpsaWJfbXNnXzsgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2UoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKSB7Ci0gICAgc3RkOjpzdHJpbmcgcnYgPSAiemxpYiBlcnJvcjogIjsKLSAgICBpZiAobXNnKSB7Ci0gICAgICBydiArPSBtc2c7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJ2ICs9ICIobm8gbWVzc2FnZSkiOwotICAgIH0KLSAgICBydiArPSAiIChzdGF0dXMgPSAiOwotICAgIHJ2ICs9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHN0YXR1cyk7Ci0gICAgcnYgKz0gIikiOwotICAgIHJldHVybiBydjsKLSAgfQotCi0gIGludCB6bGliX3N0YXR1c187Ci0gIHN0ZDo6c3RyaW5nIHpsaWJfbXNnXzsKLX07Ci0KLS8qKgotICogVGhpcyB0cmFuc3BvcnQgdXNlcyB6bGliJ3MgY29tcHJlc3NlZCBmb3JtYXQgb24gdGhlICJmYXIiIHNpZGUuCi0gKgotICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBUWmxpYlRyYW5zcG9ydCBvYmplY3RzOgotICogLSBTdGFuZGFsb25lIG9iamVjdHMgYXJlIHVzZWQgdG8gZW5jb2RlIHNlbGYtY29udGFpbmVkIGNodW5rcyBvZiBkYXRhCi0gKiAgIChsaWtlIHN0cnVjdHVyZXMpLiAgVGhleSBpbmNsdWRlIGNoZWNrc3Vtcy4KLSAqIC0gTm9uLXN0YW5kYWxvbmUgdHJhbnNwb3J0cyBhcmUgdXNlZCBmb3IgUlBDLiAgVGhleSBhcmUgbm90IGltcGxlbWVudGVkIHlldC4KLSAqCi0gKiBUT0RPKGRyZWlzcyk6IERvbid0IGRvIGFuIGV4dHJhIGNvcHkgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBpZgotICogICAgICAgICAgICAgICB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaXMgVEJ1ZmZlcmVkIG9yIFRNZW1vcnkuCi0gKgotICovCi1jbGFzcyBUWmxpYlRyYW5zcG9ydCA6IHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0cmFuc3BvcnQgICAgVGhlIHRyYW5zcG9ydCB0byByZWFkIGNvbXByZXNzZWQgZGF0YSBmcm9tCi0gICAqICAgICAgICAgICAgICAgICAgICAgYW5kIHdyaXRlIGNvbXByZXNzZWQgZGF0YSB0by4KLSAgICogQHBhcmFtIHVzZV9mb3JfcnBjICBUcnVlIGlmIHRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlZCBmb3IgUlBDLAotICAgKiAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoaXMgaXMgYSBzdGFuZGFsb25lIG9iamVjdC4KLSAgICogQHBhcmFtIHVyYnVmX3NpemUgICBVbmNvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHJlYWRpbmcuCi0gICAqIEBwYXJhbSBjcmJ1Zl9zaXplICAgQ29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3IgcmVhZGluZy4KLSAgICogQHBhcmFtIHV3YnVmX3NpemUgICBVbmNvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHdyaXRpbmcuCi0gICAqIEBwYXJhbSBjd2J1Zl9zaXplICAgQ29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3Igd3JpdGluZy4KLSAgICoKLSAgICogVE9ETyhkcmVpc3MpOiBXcml0ZSBhIGNvbnN0cnVjdG9yIHRoYXQgaXNuJ3QgYSBwYWluLgotICAgKi8KLSAgVFpsaWJUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBib29sIHVzZV9mb3JfcnBjLAotICAgICAgICAgICAgICAgICBpbnQgdXJidWZfc2l6ZSA9IERFRkFVTFRfVVJCVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgaW50IGNyYnVmX3NpemUgPSBERUZBVUxUX0NSQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgIGludCB1d2J1Zl9zaXplID0gREVGQVVMVF9VV0JVRl9TSVpFLAotICAgICAgICAgICAgICAgICBpbnQgY3didWZfc2l6ZSA9IERFRkFVTFRfQ1dCVUZfU0laRSkgOgotICAgIHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKLSAgICBzdGFuZGFsb25lXyghdXNlX2Zvcl9ycGMpLAotICAgIHVycG9zXygwKSwKLSAgICB1d3Bvc18oMCksCi0gICAgaW5wdXRfZW5kZWRfKGZhbHNlKSwKLSAgICBvdXRwdXRfZmx1c2hlZF8oZmFsc2UpLAotICAgIHVyYnVmX3NpemVfKHVyYnVmX3NpemUpLAotICAgIGNyYnVmX3NpemVfKGNyYnVmX3NpemUpLAotICAgIHV3YnVmX3NpemVfKHV3YnVmX3NpemUpLAotICAgIGN3YnVmX3NpemVfKGN3YnVmX3NpemUpLAotICAgIHVyYnVmXyhOVUxMKSwKLSAgICBjcmJ1Zl8oTlVMTCksCi0gICAgdXdidWZfKE5VTEwpLAotICAgIGN3YnVmXyhOVUxMKSwKLSAgICByc3RyZWFtXyhOVUxMKSwKLSAgICB3c3RyZWFtXyhOVUxMKQotICB7Ci0KLSAgICBpZiAoIXN0YW5kYWxvbmVfKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICJUWkxpYlRyYW5zcG9ydCBoYXMgbm90IGJlZW4gdGVzdGVkIGZvciBSUEMuIik7Ci0gICAgfQotCi0gICAgaWYgKHV3YnVmX3NpemVfIDwgTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKLSAgICAgIC8vIEhhdmUgdG8gY29weSB0aGlzIGludG8gYSBsb2NhbCBiZWNhdXNlIG9mIGEgbGlua2luZyBpc3N1ZS4KLSAgICAgIGludCBtaW5pbXVtID0gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkU7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICJUWkxpYlRyYW5zcG9ydDogdW5jb21wcmVzc2VkIHdyaXRlIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IgotICAgICAgICAgICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obWluaW11bSkgKyAiLiIpOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICB1cmJ1Zl8gPSBuZXcgdWludDhfdFt1cmJ1Zl9zaXplXTsKLSAgICAgIGNyYnVmXyA9IG5ldyB1aW50OF90W2NyYnVmX3NpemVdOwotICAgICAgdXdidWZfID0gbmV3IHVpbnQ4X3RbdXdidWZfc2l6ZV07Ci0gICAgICBjd2J1Zl8gPSBuZXcgdWludDhfdFtjd2J1Zl9zaXplXTsKLQotICAgICAgLy8gRG9uJ3QgY2FsbCB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbnN0cnVjdG9yLgotICAgICAgaW5pdFpsaWIoKTsKLQotICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgZGVsZXRlW10gdXJidWZfOwotICAgICAgZGVsZXRlW10gY3JidWZfOwotICAgICAgZGVsZXRlW10gdXdidWZfOwotICAgICAgZGVsZXRlW10gY3didWZfOwotICAgICAgdGhyb3c7Ci0gICAgfQotICB9Ci0KLSAgLy8gRG9uJ3QgY2FsbCB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbnN0cnVjdG9yLgotICB2b2lkIGluaXRabGliKCk7Ci0KLSAgflRabGliVHJhbnNwb3J0KCk7Ci0KLSAgYm9vbCBpc09wZW4oKTsKLQotICB2b2lkIG9wZW4oKSB7Ci0gICAgdHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgdm9pZCBjbG9zZSgpIHsKLSAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0KLSAgdm9pZCBmbHVzaCgpOwotCi0gIGNvbnN0IHVpbnQ4X3QqIGJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwotCi0gIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pOwotCi0gIHZvaWQgdmVyaWZ5Q2hlY2tzdW0oKTsKLQotICAgLyoqCi0gICAgKiBUT0RPKHNvbWVvbmVfc21hcnQpOiBDaG9vc2Ugc21hcnQgZGVmYXVsdHMuCi0gICAgKi8KLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX1VSQlVGX1NJWkUgPSAxMjg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9DUkJVRl9TSVpFID0gMTAyNDsKLSAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX1VXQlVGX1NJWkUgPSAxMjg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9DV0JVRl9TSVpFID0gMTAyNDsKLQotIHByb3RlY3RlZDoKLQotICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpOwotICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdk5vdGhyb3coaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKLSAgaW5saW5lIGludCByZWFkQXZhaWwoKTsKLSAgdm9pZCBmbHVzaFRvWmxpYihjb25zdCB1aW50OF90KiBidWYsIGludCBsZW4sIGJvb2wgZmluaXNoID0gZmFsc2UpOwotCi0gIC8vIFdyaXRlcyBzbWFsbGVyIHRoYW4gdGhpcyBhcmUgYnVmZmVyZWQgdXAuCi0gIC8vIExhcmdlciAob3IgZXF1YWwpIHdyaXRlcyBhcmUgZHVtcGVkIHN0cmFpZ2h0IHRvIHpsaWIuCi0gIHN0YXRpYyBjb25zdCBpbnQgTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUgPSAzMjsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwotICBib29sIHN0YW5kYWxvbmVfOwotCi0gIGludCB1cnBvc187Ci0gIGludCB1d3Bvc187Ci0KLSAgLy8vIFRydWUgaWZmIHpsaWIgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBhIHN0cmVhbS4KLSAgLy8vIFRoaXMgaXMgb25seSBldmVyIHRydWUgaW4gc3RhbmRhbG9uZSBwcm90Y29sIG9iamVjdHMuCi0gIGJvb2wgaW5wdXRfZW5kZWRfOwotICAvLy8gVHJ1ZSBpZmYgd2UgaGF2ZSBmbHVzaGVkIHRoZSBvdXRwdXQgc3RyZWFtLgotICAvLy8gVGhpcyBpcyBvbmx5IGV2ZXIgdHJ1ZSBpbiBzdGFuZGFsb25lIHByb3Rjb2wgb2JqZWN0cy4KLSAgYm9vbCBvdXRwdXRfZmx1c2hlZF87Ci0KLSAgaW50IHVyYnVmX3NpemVfOwotICBpbnQgY3JidWZfc2l6ZV87Ci0gIGludCB1d2J1Zl9zaXplXzsKLSAgaW50IGN3YnVmX3NpemVfOwotCi0gIHVpbnQ4X3QqIHVyYnVmXzsKLSAgdWludDhfdCogY3JidWZfOwotICB1aW50OF90KiB1d2J1Zl87Ci0gIHVpbnQ4X3QqIGN3YnVmXzsKLQotICBzdHJ1Y3Qgel9zdHJlYW1fcyogcnN0cmVhbV87Ci0gIHN0cnVjdCB6X3N0cmVhbV9zKiB3c3RyZWFtXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1YzdjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLmNwcApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEFsbFByb3RvY29sVGVzdHMKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKyNpbmNsdWRlICJBbGxQcm90b2NvbFRlc3RzLnRjYyIKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworCitjaGFyIGVycm9yTWVzc2FnZVtFUlJfTEVOXTsKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9iaW5hcnlfcHJvdG9jb2wpIHsKKyAgdGVzdFByb3RvY29sPFRCaW5hcnlQcm90b2NvbD4oIlRCaW5hcnlQcm90b2NvbCIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2xpdHRsZV9iaW5hcnlfcHJvdG9jb2wpIHsKKyAgdGVzdFByb3RvY29sPFRMRUJpbmFyeVByb3RvY29sPigiVExFQmluYXJ5UHJvdG9jb2wiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jb21wYWN0X3Byb3RvY29sKSB7CisgIHRlc3RQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sPigiVENvbXBhY3RQcm90b2NvbCIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjIGIvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWFiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RFU1RfR0VORVJJQ1BST1RPQ09MVEVTVF9UQ0NfCisjZGVmaW5lIF9USFJJRlRfVEVTVF9HRU5FUklDUFJPVE9DT0xURVNUX1RDQ18gMQorCisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisKKyNpbmNsdWRlICJHZW5lcmljSGVscGVycy5oIgorCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisKKyNkZWZpbmUgRVJSX0xFTiA1MTIKK2V4dGVybiBjaGFyIGVycm9yTWVzc2FnZVtFUlJfTEVOXTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRQcm90bywgdHlwZW5hbWUgVmFsPgordm9pZCB0ZXN0TmFrZWQoVmFsIHZhbCkgeworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUUHJvdG8odHJhbnNwb3J0KSk7CisKKyAgR2VuZXJpY0lPOjp3cml0ZShwcm90b2NvbCwgdmFsKTsKKyAgVmFsIG91dDsKKyAgR2VuZXJpY0lPOjpyZWFkKHByb3RvY29sLCBvdXQpOworICBpZiAob3V0ICE9IHZhbCkgeworICAgIFRIUklGVF9TTlBSSU5URihlcnJvck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIEVSUl9MRU4sCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG5ha2VkIHRlc3QgKHR5cGU6ICVzKSIsCisgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZXM6OmdldE5hbWU8VmFsPigpKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRQcm90bywgVFR5cGUgdHlwZSwgdHlwZW5hbWUgVmFsPgordm9pZCB0ZXN0RmllbGQoY29uc3QgVmFsIHZhbCkgeworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUUHJvdG8odHJhbnNwb3J0KSk7CisKKyAgcHJvdG9jb2wtPndyaXRlU3RydWN0QmVnaW4oInRlc3Rfc3RydWN0Iik7CisgIHByb3RvY29sLT53cml0ZUZpZWxkQmVnaW4oInRlc3RfZmllbGQiLCB0eXBlLCAoaW50MTZfdCkxNSk7CisKKyAgR2VuZXJpY0lPOjp3cml0ZShwcm90b2NvbCwgdmFsKTsKKworICBwcm90b2NvbC0+d3JpdGVGaWVsZEVuZCgpOworICBwcm90b2NvbC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICBzdGQ6OnN0cmluZyBuYW1lOworICBUVHlwZSBmaWVsZFR5cGU7CisgIGludDE2X3QgZmllbGRJZDsKKworICBwcm90b2NvbC0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworICBwcm90b2NvbC0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKKworICBpZiAoZmllbGRJZCAhPSAxNSkgeworICAgIFRIUklGVF9TTlBSSU5URihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIElEICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOworICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKKyAgfQorICBpZiAoZmllbGRUeXBlICE9IHR5cGUpIHsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiSW52YWxpZCBGaWVsZCBUeXBlICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOworICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKKyAgfQorCisgIFZhbCBvdXQ7CisgIEdlbmVyaWNJTzo6cmVhZChwcm90b2NvbCwgb3V0KTsKKworICBpZiAob3V0ICE9IHZhbCkgeworICAgIFRIUklGVF9TTlBSSU5URihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIHZhbHVlIHJlYWQgKHR5cGU6ICVzKSIsIHR5cGVpZCh2YWwpLm5hbWUoKSk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICB9CisKKyAgcHJvdG9jb2wtPnJlYWRGaWVsZEVuZCgpOworICBwcm90b2NvbC0+cmVhZFN0cnVjdEVuZCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFByb3RvPgordm9pZCB0ZXN0TWVzc2FnZSgpIHsKKyAgc3RydWN0IFRNZXNzYWdlIHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIFRNZXNzYWdlVHlwZSB0eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisgIH0gbWVzc2FnZXNbXSA9IHt7InNob3J0IG1lc3NhZ2UgbmFtZSIsIFRfQ0FMTCwgMH0sCisgICAgICAgICAgICAgICAgICB7IjEiLCBUX1JFUExZLCAxMjM0NX0sCisgICAgICAgICAgICAgICAgICB7Imxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciLCBUX0VYQ0VQVElPTiwgMSA8PCAxNn0sCisgICAgICAgICAgICAgICAgICB7Im9uZSB3YXkgcHVzaCIsIFRfT05FV0FZLCAxMn0sCisgICAgICAgICAgICAgICAgICB7Ikphbmt5IiwgVF9DQUxMLCAwfX07CisgIGNvbnN0IGludCBtZXNzYWdlc19jb3VudCA9IHNpemVvZihtZXNzYWdlcykgLyBzaXplb2YoVE1lc3NhZ2UpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXNfY291bnQ7IGkrKykgeworICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVFByb3RvKHRyYW5zcG9ydCkpOworCisgICAgcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2VzW2ldLm5hbWUsIG1lc3NhZ2VzW2ldLnR5cGUsIG1lc3NhZ2VzW2ldLnNlcWlkKTsKKyAgICBwcm90b2NvbC0+d3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIFRNZXNzYWdlVHlwZSB0eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisKKyAgICBwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCk7CisgICAgaWYgKG5hbWUgIT0gbWVzc2FnZXNbaV0ubmFtZSB8fCB0eXBlICE9IG1lc3NhZ2VzW2ldLnR5cGUgfHwgc2VxaWQgIT0gbWVzc2FnZXNbaV0uc2VxaWQpIHsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oInJlYWRNZXNzYWdlQmVnaW4gZmFpbGVkLiIpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFByb3RvPgordm9pZCB0ZXN0UHJvdG9jb2woY29uc3QgY2hhciogcHJvdG9uYW1lKSB7CisgIHRyeSB7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50OF90PigoaW50OF90KTEyMyk7CisKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAxMjg7IGkrKykgeworICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9CWVRFLCBpbnQ4X3Q+KChpbnQ4X3QpaSk7CisgICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0JZVEUsIGludDhfdD4oKGludDhfdCktaSk7CisgICAgfQorCisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKGludDE2X3QpMCk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKGludDE2X3QpMSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKGludDE2X3QpMTUwMDApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KTB4N2ZmZik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKGludDE2X3QpLTEpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0xNTAwMCk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKGludDE2X3QpLTB4N2ZmZik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSk7CisKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMCk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTEpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCk3KTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMTUwKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMTUwMDApOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCkweDdmZmYpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCktMSk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KS03KTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpLTE1MCk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KS0xNTAwMCk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KS0weDdmZmYpOworCisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oMCk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oMSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oMTUwMDApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KDB4ZmZmZik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTEpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KC0xNTAwMCk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTB4ZmZmZik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSk7CisKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMCk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDEpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90Pig3KTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMTUwKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMTUwMDApOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigzMTMzNyk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDB4ZmZmZik7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDB4ZmZmZmZmKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTEpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtNyk7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KC0xNTApOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMTUwMDApOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMHhmZmZmKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTB4ZmZmZmZmKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpICsgMTApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkgLSAxNik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSk7CisKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigwKTsKKyAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCA2MjsgaSsrKSB7CisgICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigxTEwgPDwgaSk7CisgICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigtKDFMTCA8PCBpKSk7CisgICAgfQorCisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JNjQsIGludDY0X3Q+KDApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjI7IGkrKykgeworICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JNjQsIGludDY0X3Q+KDFMTCA8PCBpKTsKKyAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigtKDFMTCA8PCBpKSk7CisgICAgfQorCisgICAgdGVzdE5ha2VkPFRQcm90bywgZG91YmxlPigxMjMuNDU2KTsKKworICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiIik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJzaG9ydCIpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiYm9yZGVybGluZXRpbnkiKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oImEgYml0IGxvbmdlciB0aGFuIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSIpOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiXHgxXHgyXHgzXHg0XHg1XHg2XHg3XHg4XHg5XHhBIik7IC8vIGtpbmRhIGJpbmFyeSB0ZXN0CisKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCIiKTsKKyAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCJzaG9ydCIpOworICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfU1RSSU5HLCBzdGQ6OnN0cmluZz4oImJvcmRlcmxpbmV0aW55Iik7CisgICAgdGVzdEZpZWxkPFRQcm90bywgVF9TVFJJTkcsIHN0ZDo6c3RyaW5nPigiYSBiaXQgbG9uZ2VyIHRoYW4gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIik7CisKKyAgICB0ZXN0TWVzc2FnZTxUUHJvdG8+KCk7CisKKyAgICBwcmludGYoIiVzID0+IE9LXG4iLCBwcm90b25hbWUpOworICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiJXMgPT4gVGVzdCBGQUlMRUQ6ICVzIiwgcHJvdG9uYW1lLCBlLndoYXQoKSk7CisgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxODg0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdC5jcHAKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBBbm5vdGF0aW9uVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlICJnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmgiCisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisvLyBOb3JtYWxseSB0aHJpZnQgZ2VuZXJhdGVzIG9zdHJlYW0gb3BlcmF0b3JzLCBob3dldmVyCisvLyB3aXRoIHRoZSBhbm5vdGF0aW9uICJjcHAuY3VzdG9tb3N0cmVhbSIgb25lIGNhbiB0ZWxsIHRoZQorLy8gY29tcGlsZXIgdGhleSBhcmUgZ29pbmcgdG8gcHJvdmlkZSB0aGVpciBvd24sIGFuZCBub3QKKy8vIGVtaXQgb3BlcmF0b3IgPDwgb3IgcHJpbnRUbygpLgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3Qgb3N0cl9jdXN0b20mIG9zYykKK3sKKyAgb3MgPDwgInsgYmFyID0gIiA8PCBvc2MuYmFyIDw8ICI7IH0iOworICByZXR1cm4gb3M7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShCT09TVF9URVNUX01PRFVMRSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jcHBfY29tcGlsZXJfZ2VuZXJhdGVkX29zdHJlYW1fb3BlcmF0b3IpCit7CisgIG9zdHJfZGVmYXVsdCBkZWY7CisgIGRlZi5fX3NldF9iYXIoMTApOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzZDsKKyAgc3NkIDw8IGRlZjsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3NkLnN0cigpLCAib3N0cl9kZWZhdWx0KGJhcj0xMCkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jcHBfY3VzdG9tb3N0cmVhbV91c2VzX2NvbnN1bWluZ19hcHBsaWNhdGlvbl9kZWZpbml0aW9uKQoreworICBvc3RyX2N1c3RvbSBjdXM7CisgIGN1cy5fX3NldF9iYXIoMTApOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIGNzZDsKKyAgY3NkIDw8IGN1czsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3NkLnN0cigpLCAieyBiYXIgPSAxMDsgfSIpOworfQorCisvKioKKyAqIERpc2FibGVkOyBzZWUgVEhSSUZULTE1NjcgLSBub3Qgc3VyZSB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF90eXBlKSB7CisgIC8vIENoZWNrIHRoYXQgdGhlICJjcHAudHlwZSIgYW5ub3RhdGlvbiBjaGFuZ2VzICJzdHJ1Y3QgZm9vIiB0byAiRGVuc2VGb28iCisgIC8vIFRoaXMgd29uJ3QgY29tcGlsZSBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNoYW5kbGVkCisgIERlbnNlRm9vIGZvbzsKKyAgZm9vLl9fc2V0X2Jhcig1KTsKK30KKyAqLworCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njg2ZTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaD4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpiYXNlNjRfZW5jb2RlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpiYXNlNjRfZGVjb2RlOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoQmFzZTY0VGVzdCkKKwordm9pZCBzZXR1cFRlc3REYXRhKGludCBpLCB1aW50OF90KiBkYXRhLCBpbnQmIGxlbikgeworICBsZW4gPSAwOworICBkbyB7CisgICAgZGF0YVtsZW5dID0gKHVpbnQ4X3QpKGkgJiAweEZGKTsKKyAgICBpID4+PSA4OworICAgIGxlbisrOworICB9IHdoaWxlICgobGVuIDwgMykgJiYgKGkgIT0gMCkpOworCisgIEJPT1NUX0FTU0VSVChpID09IDApOworfQorCit2b2lkIGNoZWNrRW5jb2RpbmcodWludDhfdCogZGF0YSwgaW50IGxlbikgeworI2lmZGVmIE5ERUJVRworICAoKHZvaWQpZGF0YSk7CisjZW5kaWYKKworICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgQk9PU1RfQVNTRVJUKGlzYWxudW0oZGF0YVtpXSkgfHwgZGF0YVtpXSA9PSAnLycgfHwgZGF0YVtpXSA9PSAnKycpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfQmFzZTY0X0VuY29kZV9EZWNvZGUpIHsKKyAgaW50IGxlbjsKKyAgdWludDhfdCB0ZXN0SW5wdXRbM107CisgIHVpbnQ4X3QgdGVzdE91dHB1dFs0XTsKKworICAvLyBUZXN0IGFsbCBwb3NzaWJsZSBlbmNvZGluZyAvIGRlY29kaW5nIGNhc2VzIGdpdmVuIHRoZQorICAvLyB0aHJlZSBieXRlIGxpbWl0IGZvciBiYXNlNjRfZW5jb2RlLgorCisgIGZvciAoaW50IGkgPSAweEZGRkZGRjsgaSA+PSAwOyBpLS0pIHsKKworICAgIC8vIGZpbGwgdGVzdElucHV0IGJhc2VkIG9uIGkKKyAgICBzZXR1cFRlc3REYXRhKGksIHRlc3RJbnB1dCwgbGVuKTsKKworICAgIC8vIGVuY29kZSB0aGUgdGVzdCBkYXRhLCB0aGVuIGRlY29kZSBpdCBhZ2FpbgorICAgIGJhc2U2NF9lbmNvZGUodGVzdElucHV0LCBsZW4sIHRlc3RPdXRwdXQpOworCisgICAgLy8gdmVyaWZ5IGVhY2ggYnl0ZSBoYXMgYSB2YWxpZCBCYXNlNjQgdmFsdWUgKGFscGhhbnVtZXJpYyBvciBlaXRoZXIgKyBvciAvKQorICAgIGNoZWNrRW5jb2RpbmcodGVzdE91dHB1dCwgbGVuKTsKKworICAgIC8vIGRlY29kZSBvdXRwdXQgYW5kIGNoZWNrIHRoYXQgaXQgbWF0Y2hlcyBpbnB1dAorICAgIGJhc2U2NF9kZWNvZGUodGVzdE91dHB1dCwgbGVuICsgMSk7CisgICAgQk9PU1RfQVNTRVJUKDAgPT0gbWVtY21wKHRlc3RJbnB1dCwgdGVzdE91dHB1dCwgbGVuKSk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQmVuY2htYXJrLmNwcCBiL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjc3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQmVuY2htYXJrLmNwcApAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgorI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKKworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworY2xhc3MgVGltZXIgeworcHVibGljOgorICB0aW1ldmFsIHZTdGFydDsKKworICBUaW1lcigpIHsgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdlN0YXJ0LCAwKTsgfQorICB2b2lkIHN0YXJ0KCkgeyBUSFJJRlRfR0VUVElNRU9GREFZKCZ2U3RhcnQsIDApOyB9CisKKyAgZG91YmxlIGZyYW1lKCkgeworICAgIHRpbWV2YWwgdkVuZDsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZ2RW5kLCAwKTsKKyAgICBkb3VibGUgZHN0YXJ0ID0gdlN0YXJ0LnR2X3NlYyArICgoZG91YmxlKXZTdGFydC50dl91c2VjIC8gMTAwMDAwMC4wKTsKKyAgICBkb3VibGUgZGVuZCA9IHZFbmQudHZfc2VjICsgKChkb3VibGUpdkVuZC50dl91c2VjIC8gMTAwMDAwMC4wKTsKKyAgICByZXR1cm4gZGVuZCAtIGRzdGFydDsKKyAgfQorfTsKKworaW50IG1haW4oKSB7CisgIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOworICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKyAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKKyAgdXNpbmcgc3RkOjpjb3V0OworICB1c2luZyBzdGQ6OmVuZGw7CisKKyAgT25lT2ZFYWNoIG9vZTsKKyAgb29lLmltX3RydWUgPSB0cnVlOworICBvb2UuaW1fZmFsc2UgPSBmYWxzZTsKKyAgb29lLmFfYml0ZSA9IDB4N2Y7CisgIG9vZS5pbnRlZ2VyMTYgPSAyNzAwMDsKKyAgb29lLmludGVnZXIzMiA9IDEgPDwgMjQ7CisgIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOworICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7CisgIG9vZS5zb21lX2NoYXJhY3RlcnMgPSAiSlNPTiBUSElTISBcIlwxIjsKKyAgb29lLnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKKyAgb29lLmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKKworICBpbnQgbnVtID0gMTAwMDAwOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKG51bSoxMDAwKSk7CisKKyAgdWludDhfdCogZGF0YSA9IE5VTEw7CisgIHVpbnQzMl90IGRhdGFzaXplID0gMDsKKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lLndyaXRlKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiV3JpdGUgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgYnVmLT5nZXRCdWZmZXIoJmRhdGEsICZkYXRhc2l6ZSk7CisKKyAgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOworICAgIE9uZU9mRWFjaCBvb2UyOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lMi5yZWFkKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIFJlYWQgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXIsIFROZXR3b3JrTGl0dGxlRW5kaWFuPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICBvb2Uud3JpdGUoJnByb3QpOworICAgIH0KKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJXcml0ZSBsaXR0bGUgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgT25lT2ZFYWNoIG9vZTI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXIsIFROZXR3b3JrTGl0dGxlRW5kaWFuPiBwcm90KGJ1ZjIpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lMi5yZWFkKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIFJlYWQgbGl0dGxlIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgIG9vZS53cml0ZSgmcHJvdCk7CisgICAgfQorICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIldyaXRlIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBPbmVPZkVhY2ggb29lMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgIG9vZTIucmVhZCgmcHJvdCk7CisgICAgfQorICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBSZWFkIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisKKyAgZGF0YSA9IE5VTEw7CisgIGRhdGFzaXplID0gMDsKKyAgbnVtID0gMTAwMDAwMDA7CisKKyAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmY7CisgIGxpc3REb3VibGVQZXJmLmZpZWxkLnJlc2VydmUobnVtKTsKKyAgZm9yIChpbnQgeCA9IDA7IHggPCBudW07ICsreCkKKyAgICBsaXN0RG91YmxlUGVyZi5maWVsZC5wdXNoX2JhY2soZG91YmxlKHgpKTsKKworICBidWYucmVzZXQobmV3IFRNZW1vcnlCdWZmZXIobnVtICogMTAwKSk7CisKKyAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmLndyaXRlKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJEb3VibGUgd3JpdGUgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgYnVmLT5nZXRCdWZmZXIoJmRhdGEsICZkYXRhc2l6ZSk7CisKKyAgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOworICAgIExpc3REb3VibGVQZXJmIGxpc3REb3VibGVQZXJmMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmMi5yZWFkKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgRG91YmxlIHJlYWQgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXIsIFROZXR3b3JrTGl0dGxlRW5kaWFuPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZi53cml0ZSgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiRG91YmxlIHdyaXRlIGxpdHRsZSBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXIsIFROZXR3b3JrTGl0dGxlRW5kaWFuPiBwcm90KGJ1ZjIpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYyLnJlYWQoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBEb3VibGUgcmVhZCBsaXR0bGUgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYud3JpdGUoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIkRvdWJsZSB3cml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CisgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYyLnJlYWQoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBEb3VibGUgcmVhZCBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDQ3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0MDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKKworaWYgKFdJVEhfRFlOX0xJTktfVEVTVCkKKyAgICBhZGRfZGVmaW5pdGlvbnMoIC1EQk9PU1RfVEVTVF9EWU5fTElOSyApCitlbmRpZigpCisKKyMgTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQorCisjIENyZWF0ZSB0aGUgdGhyaWZ0IEMrKyB0ZXN0IGxpYnJhcnkKK3NldCh0ZXN0Z2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcAorICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmgKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmgKKyAgICBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaAorICAgIFRocmlmdFRlc3RfZXh0cmFzLmNwcAorICAgIERlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKKykKKworYWRkX2xpYnJhcnkodGVzdGdlbmNwcCBTVEFUSUMgJHt0ZXN0Z2VuY3BwX1NPVVJDRVN9KQorCitzZXQodGVzdGdlbmNwcF9jb2JfU09VUkNFUworICAgIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmgKKyAgICBnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAKKyAgICBnZW4tY3BwL0VtcHR5U2VydmljZS5oCisgICAgZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5oCisgICAgZ2VuLWNwcC9wcm9jX3R5cGVzLmNwcAorICAgIGdlbi1jcHAvcHJvY190eXBlcy5oCispCithZGRfbGlicmFyeSh0ZXN0Z2VuY3BwX2NvYiBTVEFUSUMgJHt0ZXN0Z2VuY3BwX2NvYl9TT1VSQ0VTfSkKKworYWRkX2V4ZWN1dGFibGUoQmVuY2htYXJrIEJlbmNobWFyay5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoQmVuY2htYXJrIHRlc3RnZW5jcHApCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQmVuY2htYXJrIHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgQmVuY2htYXJrIENPTU1BTkQgQmVuY2htYXJrKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEJlbmNobWFyayB0ZXN0Z2VuY3BwKQorCitzZXQoVW5pdFRlc3RfU09VUkNFUworICAgIFVuaXRUZXN0TWFpbi5jcHAKKyAgICBPbmVXYXlIVFRQVGVzdC5jcHAKKyAgICBUTWVtb3J5QnVmZmVyVGVzdC5jcHAKKyAgICBUQnVmZmVyQmFzZVRlc3QuY3BwCisgICAgQmFzZTY0VGVzdC5jcHAKKyAgICBUb1N0cmluZ1Rlc3QuY3BwCisgICAgVHlwZWRlZlRlc3QuY3BwCisgICAgVFNlcnZlclNvY2tldFRlc3QuY3BwCisgICAgVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCispCisKK2lmKE5PVCBXSVRIX1NURFRIUkVBRFMgQU5EIE5PVCBNU1ZDIEFORCBOT1QgTUlOR1cpCisgICAgbGlzdChBUFBFTkQgVW5pdFRlc3RfU09VUkNFUyBjb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwKQorICAgIGxpc3QoQVBQRU5EIFVuaXRUZXN0X1NPVVJDRVMgY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwKQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZShVbml0VGVzdHMgJHtVbml0VGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhVbml0VGVzdHMgdGVzdGdlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVW5pdFRlc3RzIHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVW5pdFRlc3RzIENPTU1BTkQgVW5pdFRlc3RzKQoraWYgKCBNU1ZDICkKKyAgICAjIERpc2FibGUgQzQ1MDM6IGRlY29yYXRlZCBuYW1lIGxlbmd0aCBleGNlZWRlZCwgbmFtZSB3YXMgdHJ1bmNhdGVkCisgICAgIyAnaW5zYW5pdHknIHJlc3VsdHMgaW4gdmVyeSBsb25nIGRlY29yYXRlZCBuYW1lcworICAgIHNldF9wcm9wZXJ0eSggVEFSR0VUIFVuaXRUZXN0cyBBUFBFTkRfU1RSSU5HIFBST1BFUlRZIENPTVBJTEVfRkxBR1MgL3dkNDUwMyApCitlbmRpZiAoIE1TVkMgKQorCisKK3NldCggVEludGVycnVwdFRlc3RfU09VUkNFUworICAgICBUU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKKyAgICAgVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCispCitpZiAoV0lOMzIpCisgICAgbGlzdChBUFBFTkQgVEludGVycnVwdFRlc3RfU09VUkNFUworICAgICAgICBUUGlwZUludGVycnVwdFRlc3QuY3BwCisgICAgKQorZW5kaWYoKQorYWRkX2V4ZWN1dGFibGUoVEludGVycnVwdFRlc3QgJHtUSW50ZXJydXB0VGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUSW50ZXJydXB0VGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUSW50ZXJydXB0VGVzdCB0aHJpZnQpCitpZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIEFORCBOT1QgTUlOR1cpCit0YXJnZXRfbGlua19saWJyYXJpZXMoVEludGVycnVwdFRlc3QgLWxydCkKK2VuZGlmICgpCithZGRfdGVzdChOQU1FIFRJbnRlcnJ1cHRUZXN0IENPTU1BTkQgVEludGVycnVwdFRlc3QgLS0gIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8uLi90ZXN0L2tleXMiKQorCithZGRfZXhlY3V0YWJsZShUU2VydmVySW50ZWdyYXRpb25UZXN0IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwX2NvYgorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgdGhyaWZ0KQoraWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIiBBTkQgTk9UIE1JTkdXKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgLWxydCkKK2VuZGlmICgpCithZGRfdGVzdChOQU1FIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgQ09NTUFORCBUU2VydmVySW50ZWdyYXRpb25UZXN0KQorCitpZihXSVRIX1pMSUIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtaTElCX0lOQ0xVREVfRElSU30iKQorYWRkX2V4ZWN1dGFibGUoVHJhbnNwb3J0VGVzdCBUcmFuc3BvcnRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUcmFuc3BvcnRUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICR7WkxJQl9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHJhbnNwb3J0VGVzdCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHJhbnNwb3J0VGVzdCB0aHJpZnR6KQorYWRkX3Rlc3QoTkFNRSBUcmFuc3BvcnRUZXN0IENPTU1BTkQgVHJhbnNwb3J0VGVzdCkKKworYWRkX2V4ZWN1dGFibGUoWmxpYlRlc3QgWmxpYlRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFpsaWJUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICR7WkxJQl9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoWmxpYlRlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFpsaWJUZXN0IHRocmlmdHopCithZGRfdGVzdChOQU1FIFpsaWJUZXN0IENPTU1BTkQgWmxpYlRlc3QpCitlbmRpZihXSVRIX1pMSUIpCisKK2FkZF9leGVjdXRhYmxlKEFubm90YXRpb25UZXN0IEFubm90YXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhBbm5vdGF0aW9uVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShBbm5vdGF0aW9uVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEFubm90YXRpb25UZXN0IENPTU1BTkQgQW5ub3RhdGlvblRlc3QpCisKK2FkZF9leGVjdXRhYmxlKEVudW1UZXN0IEVudW1UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhFbnVtVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShFbnVtVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEVudW1UZXN0IENPTU1BTkQgRW51bVRlc3QpCisKK2lmKEhBVkVfR0VUT1BUX0gpCithZGRfZXhlY3V0YWJsZShURmlsZVRyYW5zcG9ydFRlc3QgVEZpbGVUcmFuc3BvcnRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhURmlsZVRyYW5zcG9ydFRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEZpbGVUcmFuc3BvcnRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVEZpbGVUcmFuc3BvcnRUZXN0IENPTU1BTkQgVEZpbGVUcmFuc3BvcnRUZXN0KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZShURkRUcmFuc3BvcnRUZXN0IFRGRFRyYW5zcG9ydFRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRGRFRyYW5zcG9ydFRlc3QKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShURkRUcmFuc3BvcnRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVEZEVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRGRFRyYW5zcG9ydFRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFRQaXBlZFRyYW5zcG9ydFRlc3QgVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFBpcGVkVHJhbnNwb3J0VGVzdAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRQaXBlZFRyYW5zcG9ydFRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBUUGlwZWRUcmFuc3BvcnRUZXN0IENPTU1BTkQgVFBpcGVkVHJhbnNwb3J0VGVzdCkKKworc2V0KEFsbFByb3RvY29sc1Rlc3RfU09VUkNFUworICAgIEFsbFByb3RvY29sVGVzdHMuY3BwCisgICAgQWxsUHJvdG9jb2xUZXN0cy50Y2MKKyAgICBHZW5lcmljSGVscGVycworICAgICkKKworYWRkX2V4ZWN1dGFibGUoQWxsUHJvdG9jb2xzVGVzdCAke0FsbFByb3RvY29sc1Rlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoQWxsUHJvdG9jb2xzVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShBbGxQcm90b2NvbHNUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgQWxsUHJvdG9jb2xzVGVzdCBDT01NQU5EIEFsbFByb3RvY29sc1Rlc3QpCisKKyMgVGhlIGRlYnVnIHJ1bi10aW1lIGluIFdpbmRvd3MgYXNzZXJ0cyBvbiBpc3ByaW50KCkgd2l0aCBuZWdhdGl2ZSBpbnB1dHMKK2lmIChOT1QgTVNWQyBPUiAoTVNWQyBBTkQgQ01BS0VfQlVJTERfVFlQRSBFUVVBTCAiREVCVUciKSkKK2FkZF9leGVjdXRhYmxlKERlYnVnUHJvdG9UZXN0IERlYnVnUHJvdG9UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhEZWJ1Z1Byb3RvVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShEZWJ1Z1Byb3RvVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIERlYnVnUHJvdG9UZXN0IENPTU1BTkQgRGVidWdQcm90b1Rlc3QpCitlbmRpZigpCisKK2FkZF9leGVjdXRhYmxlKEpTT05Qcm90b1Rlc3QgSlNPTlByb3RvVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoSlNPTlByb3RvVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShKU09OUHJvdG9UZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgSlNPTlByb3RvVGVzdCBDT01NQU5EIEpTT05Qcm90b1Rlc3QpCisKK2FkZF9leGVjdXRhYmxlKE9wdGlvbmFsUmVxdWlyZWRUZXN0IE9wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhPcHRpb25hbFJlcXVpcmVkVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShPcHRpb25hbFJlcXVpcmVkVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIE9wdGlvbmFsUmVxdWlyZWRUZXN0IENPTU1BTkQgT3B0aW9uYWxSZXF1aXJlZFRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFJlY3Vyc2l2ZVRlc3QgUmVjdXJzaXZlVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoUmVjdXJzaXZlVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShSZWN1cnNpdmVUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgUmVjdXJzaXZlVGVzdCBDT01NQU5EIFJlY3Vyc2l2ZVRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFNwZWNpYWxpemF0aW9uVGVzdCBTcGVjaWFsaXphdGlvblRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFNwZWNpYWxpemF0aW9uVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTcGVjaWFsaXphdGlvblRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBTcGVjaWFsaXphdGlvblRlc3QgQ09NTUFORCBTcGVjaWFsaXphdGlvblRlc3QpCisKK3NldChjb25jdXJyZW5jeV90ZXN0X1NPVVJDRVMKKyAgICBjb25jdXJyZW5jeS9UZXN0cy5jcHAKKyAgICBjb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaAorICAgIGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oCisgICAgY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaAorKQorYWRkX2V4ZWN1dGFibGUoY29uY3VycmVuY3lfdGVzdCAke2NvbmN1cnJlbmN5X3Rlc3RfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoY29uY3VycmVuY3lfdGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIGNvbmN1cnJlbmN5X3Rlc3QgQ09NTUFORCBjb25jdXJyZW5jeV90ZXN0KQorCitzZXQobGlua190ZXN0X1NPVVJDRVMKKyAgICBsaW5rL0xpbmtUZXN0LmNwcAorICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5oCisgICAgbGluay9UZW1wbGF0ZWRTZXJ2aWNlMS5jcHAKKyAgICBsaW5rL1RlbXBsYXRlZFNlcnZpY2UyLmNwcAorKQorCithZGRfZXhlY3V0YWJsZShsaW5rX3Rlc3QgJHtsaW5rX3Rlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMobGlua190ZXN0IHRlc3RnZW5jcHBfY29iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGxpbmtfdGVzdCB0aHJpZnQpCit0YXJnZXRfbGlua19saWJyYXJpZXMobGlua190ZXN0IHRlc3RnZW5jcHApCithZGRfdGVzdChOQU1FIGxpbmtfdGVzdCBDT01NQU5EIGxpbmtfdGVzdCkKKworaWYoV0lUSF9MSUJFVkVOVCkKK3NldChwcm9jZXNzb3JfdGVzdF9TT1VSQ0VTCisgICAgcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCisgICAgcHJvY2Vzc29yL0V2ZW50TG9nLmNwcAorICAgIHByb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCisgICAgcHJvY2Vzc29yL0V2ZW50TG9nLmgKKyAgICBwcm9jZXNzb3IvSGFuZGxlcnMuaAorICAgIHByb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaAorKQorYWRkX2V4ZWN1dGFibGUocHJvY2Vzc29yX3Rlc3QgJHtwcm9jZXNzb3JfdGVzdF9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhwcm9jZXNzb3JfdGVzdAorICAgIHRlc3RnZW5jcHBfY29iCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkocHJvY2Vzc29yX3Rlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHByb2Nlc3Nvcl90ZXN0IHRocmlmdG5iKQorYWRkX3Rlc3QoTkFNRSBwcm9jZXNzb3JfdGVzdCBDT01NQU5EIHByb2Nlc3Nvcl90ZXN0KQorCitzZXQoVE5vbmJsb2NraW5nU2VydmVyVGVzdF9TT1VSQ0VTIFROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwKQorYWRkX2V4ZWN1dGFibGUoVE5vbmJsb2NraW5nU2VydmVyVGVzdCAke1ROb25ibG9ja2luZ1NlcnZlclRlc3RfU09VUkNFU30pCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0xJQkVWRU5UX0xJQlJBUklFU30KKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdG5iKQorYWRkX3Rlc3QoTkFNRSBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IENPTU1BTkQgVE5vbmJsb2NraW5nU2VydmVyVGVzdCkKKworaWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorICBzZXQoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwKQorICBhZGRfZXhlY3V0YWJsZShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0ICR7VE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTfSkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0xJQkVWRU5UX0xJQlJBUklFU30KKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgKQorICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCB0aHJpZnQpCisgIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IHRocmlmdG5iKQorICBhZGRfdGVzdChOQU1FIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgQ09NTUFORCBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKK2VuZGlmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKK2VuZGlmKFdJVEhfTElCRVZFTlQpCisKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKK2FkZF9leGVjdXRhYmxlKE9wZW5TU0xNYW51YWxJbml0VGVzdCBPcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKE9wZW5TU0xNYW51YWxJbml0VGVzdAorICAgICR7T1BFTlNTTF9MSUJSQVJJRVN9CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoT3BlblNTTE1hbnVhbEluaXRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgT3BlblNTTE1hbnVhbEluaXRUZXN0IENPTU1BTkQgT3BlblNTTE1hbnVhbEluaXRUZXN0KQorCithZGRfZXhlY3V0YWJsZShTZWN1cml0eVRlc3QgU2VjdXJpdHlUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTZWN1cml0eVRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU2VjdXJpdHlUZXN0IHRocmlmdCkKK2lmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgQU5EIE5PVCBNSU5HVykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTZWN1cml0eVRlc3QgLWxydCkKK2VuZGlmICgpCithZGRfdGVzdChOQU1FIFNlY3VyaXR5VGVzdCBDT01NQU5EIFNlY3VyaXR5VGVzdCAtLSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCisKK2VuZGlmKCkKKworaWYoV0lUSF9RVDQpCitzZXQoQ01BS0VfQVVUT01PQyBPTikKK2ZpbmRfcGFja2FnZShRdDQgUkVRVUlSRUQgQ09NUE9ORU5UUyBRdFRlc3QpCitzZXQoVFFUY3BTZXJ2ZXJUZXN0X1NPVVJDRVMKKyAgICBxdC9UUVRjcFNlcnZlclRlc3QuY3BwCispCithZGRfZXhlY3V0YWJsZShUUVRjcFNlcnZlclRlc3QgJHtUUVRjcFNlcnZlclRlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFFUY3BTZXJ2ZXJUZXN0IHRlc3RnZW5jcHBfY29iIHRocmlmdHF0IFF0NDo6UXRUZXN0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRRVGNwU2VydmVyVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFRRVGNwU2VydmVyVGVzdCBDT01NQU5EIFRRVGNwU2VydmVyVGVzdCkKK2VuZGlmKCkKKworaWYoV0lUSF9RVDUpCithZGRfc3ViZGlyZWN0b3J5KHF0KQorZW5kaWYoKQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvZm9vX3NlcnZpY2UuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvZm9vX3NlcnZpY2UuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0VudW1UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuY3BwIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vT25lV2F5VGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuY3BwIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIGdlbi1jcHAvcHJvY190eXBlcy5jcHAgZ2VuLWNwcC9wcm9jX3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcHJvY2Vzc29yL3Byb2MudGhyaWZ0CispCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjBmMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcApAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBEZWJ1Z1Byb3RvVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7CisKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxPbmVPZkVhY2g+IG9vZTsKKwordm9pZCB0ZXN0Q2FzZVNldHVwXzEoKSB7CisgIG9vZS5yZXNldChuZXcgT25lT2ZFYWNoKTsKKyAgb29lLT5pbV90cnVlID0gdHJ1ZTsKKyAgb29lLT5pbV9mYWxzZSA9IGZhbHNlOworICBvb2UtPmFfYml0ZSA9IDB4N2Y7CisgIG9vZS0+aW50ZWdlcjE2ID0gMjcwMDA7CisgIG9vZS0+aW50ZWdlcjMyID0gMSA8PCAyNDsKKyAgb29lLT5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOworICBvb2UtPmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOworICBvb2UtPnNvbWVfY2hhcmFjdGVycyA9ICJEZWJ1ZyBUSElTISI7CisgIG9vZS0+em9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlYnVnX3Byb3RvXzEpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPbmVPZkVhY2gge1xuIgorICAgICIgIDAxOiBpbV90cnVlIChib29sKSA9IHRydWUsXG4iCisgICAgIiAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgIDAzOiBhX2JpdGUgKGJ5dGUpID0gMHg3ZixcbiIKKyAgICAiICAwNDogaW50ZWdlcjE2IChpMTYpID0gMjcwMDAsXG4iCisgICAgIiAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDE2Nzc3MjE2LFxuIgorICAgICIgIDA2OiBpbnRlZ2VyNjQgKGk2NCkgPSA2MDAwMDAwMDAwLFxuIgorICAgICIgIDA3OiBkb3VibGVfcHJlY2lzaW9uIChkb3VibGUpID0gMy4xNDE1OTI2NTM1ODk3OTMxLFxuIgorICAgICIgIDA4OiBzb21lX2NoYXJhY3RlcnMgKHN0cmluZykgPSBcIkRlYnVnIFRISVMhXCIsXG4iCisgICAgIiAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDdcXG5cXGFcXHRcIixcbiIKKyAgICAiICAxMDogd2hhdF93aG8gKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgMTE6IGJhc2U2NCAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgIFswXSA9IDB4MDEsXG4iCisgICAgIiAgICBbMV0gPSAweDAyLFxuIgorICAgICIgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDEzOiBpMTZfbGlzdCAobGlzdCkgPSBsaXN0PGkxNj5bM10ge1xuIgorICAgICIgICAgWzBdID0gMSxcbiIKKyAgICAiICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICBbMl0gPSAzLFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMTQ6IGk2NF9saXN0IChsaXN0KSA9IGxpc3Q8aTY0PlszXSB7XG4iCisgICAgIiAgICBbMF0gPSAxLFxuIgorICAgICIgICAgWzFdID0gMixcbiIKKyAgICAiICAgIFsyXSA9IDMsXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpvb2UpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworc3RhdGljIDo6c3RkOjpzaGFyZWRfcHRyPE5lc3Rpbmc+IG47CisKK3ZvaWQgdGVzdENhc2VTZXR1cF8yKCkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKKworICBuLnJlc2V0KG5ldyBOZXN0aW5nKTsKKyAgbi0+bXlfb29lID0gKm9vZTsKKyAgbi0+bXlfb29lLmludGVnZXIxNiA9IDE2OworICBuLT5teV9vb2UuaW50ZWdlcjMyID0gMzI7CisgIG4tPm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKKyAgbi0+bXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkgKyAxKSAvIDI7CisgIG4tPm15X29vZS5zb21lX2NoYXJhY3RlcnMgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7CisgIG4tPm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwXHhkMFx4OWRceGNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlXHgyMFx4Y2VceDkxXHg3NFx4NzQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJjIjsKKyAgbi0+bXlfYm9uay50eXBlID0gMzEzMzc7CisgIG4tPm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWJ1Z19wcm90b18yKSB7CisgIHRlc3RDYXNlU2V0dXBfMigpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiTmVzdGluZyB7XG4iCisgICAgIiAgMDE6IG15X2JvbmsgKHN0cnVjdCkgPSBCb25rIHtcbiIKKyAgICAiICAgIDAxOiB0eXBlIChpMzIpID0gMzEzMzcsXG4iCisgICAgIiAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwiSSBhbSBhIGJvbmsuLi4geG9yIVwiLFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDI6IG15X29vZSAoc3RydWN0KSA9IE9uZU9mRWFjaCB7XG4iCisgICAgIiAgICAwMTogaW1fdHJ1ZSAoYm9vbCkgPSB0cnVlLFxuIgorICAgICIgICAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgMDM6IGFfYml0ZSAoYnl0ZSkgPSAweDdmLFxuIgorICAgICIgICAgMDQ6IGludGVnZXIxNiAoaTE2KSA9IDE2LFxuIgorICAgICIgICAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDMyLFxuIgorICAgICIgICAgMDY6IGludGVnZXI2NCAoaTY0KSA9IDY0LFxuIgorICAgICIgICAgMDc6IGRvdWJsZV9wcmVjaXNpb24gKGRvdWJsZSkgPSAxLjYxODAzMzk4ODc0OTg5NDksXG4iCisgICAgIiAgICAwODogc29tZV9jaGFyYWN0ZXJzIChzdHJpbmcpID0gXCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwiLFxuIgorICAgICIgICAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDNcXHg4MFxceGUyXFx4ODVcXHhhZVxceGNlXFx4OWQgXFx4ZCIKKyAgICAgICIwXFx4OWRcXHhjZVxceGJmXFx4ZTJcXHg4NVxceGJmXFx4ZDBcXHhiZVxceGM5XFx4YTFcXHhkMFxceGIzXFx4ZDBcXHhiMCIKKyAgICAgICJcXHhjZlxceDgxXFx4ZTJcXHg4NFxceDhlIFxceGNlXFx4OTF0dFxceGNlXFx4YjFcXHhlMlxceDg1XFx4YmRcXHhjZVxceGIiCisgICAgICAiYVxceGM3XFx4ODNcXHhlMlxceDgwXFx4YmNcIixcbiIKKyAgICAiICAgIDEwOiB3aGF0X3dobyAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgIDExOiBiYXNlNjQgKHN0cmluZykgPSBcIlwiLFxuIgorICAgICIgICAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMHgwMSxcbiIKKyAgICAiICAgICAgWzFdID0gMHgwMixcbiIKKyAgICAiICAgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICAxMzogaTE2X2xpc3QgKGxpc3QpID0gbGlzdDxpMTY+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICAxNDogaTY0X2xpc3QgKGxpc3QpID0gbGlzdDxpNjQ+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpuKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxIb2x5TW9sZXk+IGhtOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMygpIHsKKyAgdGVzdENhc2VTZXR1cF8yKCk7CisKKyAgaG0ucmVzZXQobmV3IEhvbHlNb2xleSk7CisKKyAgaG0tPmJpZy5wdXNoX2JhY2soKm9vZSk7CisgIGhtLT5iaWcucHVzaF9iYWNrKG4tPm15X29vZSk7CisgIGhtLT5iaWdbMF0uYV9iaXRlID0gMHgyMjsKKyAgaG0tPmJpZ1sxXS5hX2JpdGUgPSAweDMzOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdGFnZTE7CisgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIG9uZSIpOworICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSB0d28iKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIHN0YWdlMS5jbGVhcigpOworICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7CisgIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgc3RhZ2UxLmNsZWFyKCk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOworCisgIHN0ZDo6dmVjdG9yPEJvbms+IHN0YWdlMjsKKyAgaG0tPmJvbmtzWyJub3RoaW5nIl0gPSBzdGFnZTI7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSAxOworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2FpdC4iOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKKyAgaG0tPmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKKyAgc3RhZ2UyLmNsZWFyKCk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSAzOworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAicXVvdGgiOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKKyAgaG0tPmJvbmtzWyJwb2UiXSA9IHN0YWdlMjsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWJ1Z19wcm90b18zKSB7CisgIHRlc3RDYXNlU2V0dXBfMygpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiSG9seU1vbGV5IHtcbiIKKyAgICAiICAwMTogYmlnIChsaXN0KSA9IGxpc3Q8c3RydWN0PlsyXSB7XG4iCisgICAgIiAgICBbMF0gPSBPbmVPZkVhY2gge1xuIgorICAgICIgICAgICAwMTogaW1fdHJ1ZSAoYm9vbCkgPSB0cnVlLFxuIgorICAgICIgICAgICAwMjogaW1fZmFsc2UgKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAgIDAzOiBhX2JpdGUgKGJ5dGUpID0gMHgyMixcbiIKKyAgICAiICAgICAgMDQ6IGludGVnZXIxNiAoaTE2KSA9IDI3MDAwLFxuIgorICAgICIgICAgICAwNTogaW50ZWdlcjMyIChpMzIpID0gMTY3NzcyMTYsXG4iCisgICAgIiAgICAgIDA2OiBpbnRlZ2VyNjQgKGk2NCkgPSA2MDAwMDAwMDAwLFxuIgorICAgICIgICAgICAwNzogZG91YmxlX3ByZWNpc2lvbiAoZG91YmxlKSA9IDMuMTQxNTkyNjUzNTg5NzkzMSxcbiIKKyAgICAiICAgICAgMDg6IHNvbWVfY2hhcmFjdGVycyAoc3RyaW5nKSA9IFwiRGVidWcgVEhJUyFcIixcbiIKKyAgICAiICAgICAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDdcXG5cXGFcXHRcIixcbiIKKyAgICAiICAgICAgMTA6IHdoYXRfd2hvIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgICAxMTogYmFzZTY0IChzdHJpbmcpID0gXCJcIixcbiIKKyAgICAiICAgICAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAweDAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDB4MDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgMTM6IGkxNl9saXN0IChsaXN0KSA9IGxpc3Q8aTE2PlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIDE0OiBpNjRfbGlzdCAobGlzdCkgPSBsaXN0PGk2ND5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFsxXSA9IE9uZU9mRWFjaCB7XG4iCisgICAgIiAgICAgIDAxOiBpbV90cnVlIChib29sKSA9IHRydWUsXG4iCisgICAgIiAgICAgIDAyOiBpbV9mYWxzZSAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgICAgMDM6IGFfYml0ZSAoYnl0ZSkgPSAweDMzLFxuIgorICAgICIgICAgICAwNDogaW50ZWdlcjE2IChpMTYpID0gMTYsXG4iCisgICAgIiAgICAgIDA1OiBpbnRlZ2VyMzIgKGkzMikgPSAzMixcbiIKKyAgICAiICAgICAgMDY6IGludGVnZXI2NCAoaTY0KSA9IDY0LFxuIgorICAgICIgICAgICAwNzogZG91YmxlX3ByZWNpc2lvbiAoZG91YmxlKSA9IDEuNjE4MDMzOTg4NzQ5ODk0OSxcbiIKKyAgICAiICAgICAgMDg6IHNvbWVfY2hhcmFjdGVycyAoc3RyaW5nKSA9IFwiOlIgKG1lIGdvaW5nIFxcXCJycnJyXFxcIilcIixcbiIKKyAgICAiICAgICAgMDk6IHpvbWdfdW5pY29kZSAoc3RyaW5nKSA9IFwiXFx4ZDNcXHg4MFxceGUyXFx4ODVcXHhhZVxceGNlXFx4OWQgXFwiCisgICAgICAieGQwXFx4OWRcXHhjZVxceGJmXFx4ZTJcXHg4NVxceGJmXFx4ZDBcXHhiZVxceGM5XFx4YTFcXHhkMFxceGIzXFx4ZDBcXHhiIgorICAgICAgIjBcXHhjZlxceDgxXFx4ZTJcXHg4NFxceDhlIFxceGNlXFx4OTF0dFxceGNlXFx4YjFcXHhlMlxceDg1XFx4YmRcXHhjZVxceCIKKyAgICAgICJiYVxceGM3XFx4ODNcXHhlMlxceDgwXFx4YmNcIixcbiIKKyAgICAiICAgICAgMTA6IHdoYXRfd2hvIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgICAxMTogYmFzZTY0IChzdHJpbmcpID0gXCJcIixcbiIKKyAgICAiICAgICAgMTI6IGJ5dGVfbGlzdCAobGlzdCkgPSBsaXN0PGJ5dGU+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAweDAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDB4MDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMHgwMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgMTM6IGkxNl9saXN0IChsaXN0KSA9IGxpc3Q8aTE2PlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIDE0OiBpNjRfbGlzdCAobGlzdCkgPSBsaXN0PGk2ND5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDAyOiBjb250YWluIChzZXQpID0gc2V0PGxpc3Q+WzNdIHtcbiIKKyAgICAiICAgIGxpc3Q8c3RyaW5nPlswXSB7XG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgbGlzdDxzdHJpbmc+WzJdIHtcbiIKKyAgICAiICAgICAgWzBdID0gXCJhbmQgYSBvbmVcIixcbiIKKyAgICAiICAgICAgWzFdID0gXCJhbmQgYSB0d29cIixcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBsaXN0PHN0cmluZz5bM10ge1xuIgorICAgICIgICAgICBbMF0gPSBcInRoZW4gYSBvbmUsIHR3b1wiLFxuIgorICAgICIgICAgICBbMV0gPSBcInRocmVlIVwiLFxuIgorICAgICIgICAgICBbMl0gPSBcIkZPVVIhIVwiLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICB9LFxuIgorICAgICIgIDAzOiBib25rcyAobWFwKSA9IG1hcDxzdHJpbmcsbGlzdD5bM10ge1xuIgorICAgICIgICAgXCJub3RoaW5nXCIgLT4gbGlzdDxzdHJ1Y3Q+WzBdIHtcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBcInBvZVwiIC0+IGxpc3Q8c3RydWN0PlszXSB7XG4iCisgICAgIiAgICAgIFswXSA9IEJvbmsge1xuIgorICAgICIgICAgICAgIDAxOiB0eXBlIChpMzIpID0gMyxcbiIKKyAgICAiICAgICAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwicXVvdGhcIixcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgWzFdID0gQm9uayB7XG4iCisgICAgIiAgICAgICAgMDE6IHR5cGUgKGkzMikgPSA0LFxuIgorICAgICIgICAgICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJ0aGUgcmF2ZW5cIixcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgWzJdID0gQm9uayB7XG4iCisgICAgIiAgICAgICAgMDE6IHR5cGUgKGkzMikgPSA1LFxuIgorICAgICIgICAgICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJuZXZlcm1vcmVcIixcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBcInNvbWV0aGluZ1wiIC0+IGxpc3Q8c3RydWN0PlsyXSB7XG4iCisgICAgIiAgICAgIFswXSA9IEJvbmsge1xuIgorICAgICIgICAgICAgIDAxOiB0eXBlIChpMzIpID0gMSxcbiIKKyAgICAiICAgICAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwiV2FpdC5cIixcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgICAgWzFdID0gQm9uayB7XG4iCisgICAgIiAgICAgICAgMDE6IHR5cGUgKGkzMikgPSAyLFxuIgorICAgICIgICAgICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJXaGF0P1wiLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICB9LFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcoKmhtKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcCBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNGZkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcApAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEV4dHJhIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgRGVidWdQcm90b1Rlc3RfdHlwZXMgdG8gd29yaworCisjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgorCituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBkZWJ1ZyB7CisKK2Jvb2wgRW1wdHk6Om9wZXJhdG9yPChFbXB0eSBjb25zdCYgb3RoZXIpIGNvbnN0IHsKKyAgKHZvaWQpb3RoZXI7CisgIC8vIEl0IGlzIGVtcHR5LCBzbyBhbGwgYXJlIGVxdWFsLgorICByZXR1cm4gZmFsc2U7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM1YmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEVudW1UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgImdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCIKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbTo6dHlwZSYgdmFsKQoreworICBvcyA8PCAieyIgPDwgKGludCl2YWwgPDwgIjpDVVNUT00hIiA8PCAifSI7CisgIHJldHVybiBvczsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKEVudW1UZXN0KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fdmFsdWUpIHsKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgdGhlIGVudW0gdmFsdWVzIG1hdGNoIHdoYXQgd2UgZXhwZWN0CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8wLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzEsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfMiwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8zLCAzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzUsIDUpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfNiwgNik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMjo6TUUyXzAsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0yOjpNRTJfMSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTI6Ok1FMl8yLCAyKTsKKworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfMCwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM18xLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzX04yLCAtMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM19OMSwgLTEpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfRDAsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfRDEsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfOSwgOSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM18xMCwgMTApOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTQ6Ok1FNF9BLCAweDdmZmZmZmZkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNDo6TUU0X0IsIDB4N2ZmZmZmZmUpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW00OjpNRTRfQywgMHg3ZmZmZmZmZik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNTo6ZTEsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW01OjplMiwgNDIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Q+CitzdGQ6OnN0cmluZyBFbnVtVG9TdHJpbmcoX1QgZSkKK3sKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IGU7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fb3N0cmVhbSkKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bTE6Ok1FMV8wKSwgIk1FMV8wIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW01OjplMiksICJlMiIpOworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtMzo6TUUzX04xKSwgIk1FM19OMSIpOworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtV2l0aEN1c3RvbU9zdHJlYW06OkN1c3RvTTIpLCAiezI6Q1VTVE9NIX0iKTsKKworICAvLyBzb21lIGludmFsaWQgb3IgdW5rbm93biB2YWx1ZQorICBNeUVudW01Ojp0eXBlIHV1dCA9IChNeUVudW01Ojp0eXBlKTQ0OworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcodXV0KSwgIjQ0Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV9jb25zdGFudCkKK3sKKyAgTXlTdHJ1Y3QgbXM7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1zLm1lMl8yLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobXMubWUzX24yLCAtMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1zLm1lM19kMSwgMSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0dlbmVyaWNIZWxwZXJzLmggYi9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2VmOWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0dlbmVyaWNIZWxwZXJzLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RFU1RfR0VORVJJQ0hFTFBFUlNfSF8KKyNkZWZpbmUgX1RIUklGVF9URVNUX0dFTkVSSUNIRUxQRVJTX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorCisvKiBDbGFzc05hbWUgSGVscGVyIGZvciBjbGVhbmVyIGV4Y2VwdGlvbnMgKi8KK2NsYXNzIENsYXNzTmFtZXMgeworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7CisgICAgcmV0dXJuICJVbmtub3duIHR5cGUiOworICB9Cit9OworCit0ZW1wbGF0ZSA8PgorY29uc3QgY2hhciogQ2xhc3NOYW1lczo6Z2V0TmFtZTxpbnQ4X3Q+KCkgeworICByZXR1cm4gImJ5dGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7CisgIHJldHVybiAic2hvcnQiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MzJfdD4oKSB7CisgIHJldHVybiAiaW50IjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDY0X3Q+KCkgeworICByZXR1cm4gImxvbmciOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsKKyAgcmV0dXJuICJkb3VibGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8c3RkOjpzdHJpbmc+KCkgeworICByZXR1cm4gInN0cmluZyI7Cit9CisKKy8qIEdlbmVyaWMgUHJvdG9jb2wgSS9PIGZ1bmN0aW9uIGZvciB0ZXN0cyAqLworY2xhc3MgR2VuZXJpY0lPIHsKK3B1YmxpYzoKKyAgLyogV3JpdGUgZnVuY3Rpb25zICovCisKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDhfdCYgdmFsKSB7CisgICAgcmV0dXJuIHByb3RvLT53cml0ZUJ5dGUodmFsKTsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQxNl90JiB2YWwpIHsKKyAgICByZXR1cm4gcHJvdG8tPndyaXRlSTE2KHZhbCk7CisgIH0KKworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MzJfdCYgdmFsKSB7CisgICAgcmV0dXJuIHByb3RvLT53cml0ZUkzMih2YWwpOworICB9CisKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGRvdWJsZSYgdmFsKSB7CisgICAgcmV0dXJuIHByb3RvLT53cml0ZURvdWJsZSh2YWwpOworICB9CisKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDY0X3QmIHZhbCkgeworICAgIHJldHVybiBwcm90by0+d3JpdGVJNjQodmFsKTsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsKSB7CisgICAgcmV0dXJuIHByb3RvLT53cml0ZVN0cmluZyh2YWwpOworICB9CisKKyAgLyogUmVhZCBmdW5jdGlvbnMgKi8KKworICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQ4X3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRCeXRlKHZhbCk7IH0KKworICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTE2KHZhbCk7IH0KKworICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQzMl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTMyKHZhbCk7IH0KKworICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQ2NF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTY0KHZhbCk7IH0KKworICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBkb3VibGUmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWREb3VibGUodmFsKTsgfQorCisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIHN0ZDo6c3RyaW5nJiB2YWwpIHsKKyAgICByZXR1cm4gcHJvdG8tPnJlYWRTdHJpbmcodmFsKTsKKyAgfQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhZDczZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgSlNPTlByb3RvVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOworCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE9uZU9mRWFjaD4gb29lOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKKyAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOworICBvb2UtPmltX3RydWUgPSB0cnVlOworICBvb2UtPmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS0+YV9iaXRlID0gMHg3ZjsKKyAgb29lLT5pbnRlZ2VyMTYgPSAyNzAwMDsKKyAgb29lLT5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICBvb2UtPmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CisgIG9vZS0+ZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7CisgIG9vZS0+c29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7CisgIG9vZS0+em9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOworICBvb2UtPmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzEpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAie1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyN30sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LCIKKyAgIlwiNVwiOntcImkzMlwiOjE2Nzc3MjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwfSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjYiCisgICI1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwifSxcIjlcIjp7XCJzdHJcIjpcIlx4ZDdcXCIKKyAgIm5cXHUwMDA3XFx0XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCIiCisgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgorICAiXCIsMywxLDIsM119fSIpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZygqb29lKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TmVzdGluZz4gbjsKKwordm9pZCB0ZXN0Q2FzZVNldHVwXzIoKSB7CisgIHRlc3RDYXNlU2V0dXBfMSgpOworCisgIG4ucmVzZXQobmV3IE5lc3RpbmcpOworICBuLT5teV9vb2UgPSAqb29lOworICBuLT5teV9vb2UuaW50ZWdlcjE2ID0gMTY7CisgIG4tPm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKKyAgbi0+bXlfb29lLmludGVnZXI2NCA9IDY0OworICBuLT5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNS4wKSArIDEpIC8gMjsKKyAgbi0+bXlfb29lLnNvbWVfY2hhcmFjdGVycyA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKKyAgbi0+bXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjBceGQwXHg5ZFx4Y2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGIwXHhjZlx4ODFceGUyXHg4NFx4OGVceDIwXHhjZVx4OTFceDc0XHg3NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmMiOworICBuLT5teV9ib25rLnR5cGUgPSAzMTMzNzsKKyAgbi0+bXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fMikgeworICB0ZXN0Q2FzZVNldHVwXzIoKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIntcIjFcIjp7XCJyZWNcIjp7XCIxXCI6e1wiaTMyXCI6MzEzMzd9LFwiMlwiOntcInN0clwiOlwiSSBhbSBhIGJvbmsuLi4geG9yIgorICAgICIhXCJ9fX0sXCIyXCI6e1wicmVjXCI6e1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyNyIKKyAgICAifSxcIjRcIjp7XCJpMTZcIjoxNn0sXCI1XCI6e1wiaTMyXCI6MzJ9LFwiNlwiOntcImk2NFwiOjY0fSxcIjdcIjp7XCJkYmxcIjoiCisgICAgIjEuNjE4MDMzOTg4NzQ5ODk0OX0sXCI4XCI6e1wic3RyXCI6XCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwifSxcIjlcIjp7IgorICAgICJcInN0clwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3OuseD4oC8XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIiIKKyAgICAiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIiCisgICAgIiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NFwiLDMsMSwyLDNdfX19fSIKKyAgKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoKm4pKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxIb2x5TW9sZXk+IGhtOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMygpIHsKKyAgdGVzdENhc2VTZXR1cF8yKCk7CisKKyAgaG0ucmVzZXQobmV3IEhvbHlNb2xleSk7CisKKyAgaG0tPmJpZy5wdXNoX2JhY2soKm9vZSk7CisgIGhtLT5iaWcucHVzaF9iYWNrKG4tPm15X29vZSk7CisgIGhtLT5iaWdbMF0uYV9iaXRlID0gMHgyMjsKKyAgaG0tPmJpZ1sxXS5hX2JpdGUgPSAweDMzOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdGFnZTE7CisgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIG9uZSIpOworICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSB0d28iKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIHN0YWdlMS5jbGVhcigpOworICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7CisgIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgc3RhZ2UxLmNsZWFyKCk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOworCisgIHN0ZDo6dmVjdG9yPEJvbms+IHN0YWdlMjsKKyAgaG0tPmJvbmtzWyJub3RoaW5nIl0gPSBzdGFnZTI7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSAxOworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2FpdC4iOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKKyAgaG0tPmJvbmtzWyJzb21ldGhpbmciXSA9IHN0YWdlMjsKKyAgc3RhZ2UyLmNsZWFyKCk7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSAzOworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAicXVvdGgiOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSA1OworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKKyAgaG0tPmJvbmtzWyJwb2UiXSA9IHN0YWdlMjsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzMpIHsKKyAgdGVzdENhc2VTZXR1cF8zKCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAie1wiMVwiOntcImxzdFwiOltcInJlY1wiLDIse1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOiIKKyAgIjM0fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sXCI1XCI6e1wiaTMyXCI6MTY3NzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDAiCisgICJ9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxIgorICAiXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcblxcdTAwMDdcXHRcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOiIKKyAgIlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIiCisgICIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjRcIiwzLDEsMiwzXX19LHtcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sIgorICAiXCIzXCI6e1wiaThcIjo1MX0sXCI0XCI6e1wiaTE2XCI6MTZ9LFwiNVwiOntcImkzMlwiOjMyfSxcIjZcIjp7XCJpNjRcIjo2NH0sIgorICAiXCI3XCI6e1wiZGJsXCI6MS42MTgwMzM5ODg3NDk4OTQ5fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIiCisgICIpXCJ9LFwiOVwiOntcInN0clwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3OuseD4oC8XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7IgorICAiXCJzdHJcIjpcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNiIKKyAgIlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fV19LFwiMlwiOntcInNldFwiOltcImxzdFwiLDMiCisgICIsW1wic3RyXCIsMF0sW1wic3RyXCIsMixcImFuZCBhIG9uZVwiLFwiYW5kIGEgdHdvXCJdLFtcInN0clwiLDMsXCJ0aGVuIGEgb25lIgorICAiLCB0d29cIixcInRocmVlIVwiLFwiRk9VUiEhXCJdXX0sXCIzXCI6e1wibWFwXCI6W1wic3RyXCIsXCJsc3RcIiwzLHtcIm5vdGhpbiIKKyAgImdcIjpbXCJyZWNcIiwwXSxcInBvZVwiOltcInJlY1wiLDMse1wiMVwiOntcImkzMlwiOjN9LFwiMlwiOntcInN0clwiOlwicXVvdGgiCisgICJcIn19LHtcIjFcIjp7XCJpMzJcIjo0fSxcIjJcIjp7XCJzdHJcIjpcInRoZSByYXZlblwifX0se1wiMVwiOntcImkzMlwiOjV9LFwiIgorICAiMlwiOntcInN0clwiOlwibmV2ZXJtb3JlXCJ9fV0sXCJzb21ldGhpbmdcIjpbXCJyZWNcIiwyLHtcIjFcIjp7XCJpMzJcIjoxfSxcIiIKKyAgIjJcIjp7XCJzdHJcIjpcIldhaXQuXCJ9fSx7XCIxXCI6e1wiaTMyXCI6Mn0sXCIyXCI6e1wic3RyXCI6XCJXaGF0P1wifX1dfV19fSIKKyAgKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoKmhtKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b180KSB7CisgIHRlc3RDYXNlU2V0dXBfMSgpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBvb2UtPndyaXRlKHByb3RvLmdldCgpKTsKKyAgT25lT2ZFYWNoIG9vZTI7CisgIG9vZTIucmVhZChwcm90by5nZXQoKSk7CisKKyAgQk9PU1RfQ0hFQ0soKm9vZSA9PSBvb2UyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzUpIHsKKyAgdGVzdENhc2VTZXR1cF8zKCk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIGhtLT53cml0ZShwcm90by5nZXQoKSk7CisgIEhvbHlNb2xleSBobTI7CisgIGhtMi5yZWFkKHByb3RvLmdldCgpKTsKKworICBCT09TVF9DSEVDSygqaG0gPT0gaG0yKTsKKworICBobTIuYmlnWzBdLmFfYml0ZSA9IDB4MDA7CisKKyAgQk9PU1RfQ0hFQ0soKmhtICE9IGhtMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b182KSB7CisgIERvdWJsZXMgZHViOworICBkdWIubmFuID0gSFVHRV9WQUwgLyBIVUdFX1ZBTDsKKyAgZHViLmluZiA9IEhVR0VfVkFMOworICBkdWIubmVnaW5mID0gLUhVR0VfVkFMOworICBkdWIucmVwZWF0aW5nID0gMTAuMCAvIDMuMDsKKyAgZHViLmJpZyA9IDFFKzMwNTsKKyAgZHViLnRpbnkgPSAxRS0zMDU7CisgIGR1Yi56ZXJvID0gMC4wOworICBkdWIubmVnemVybyA9IC0wLjA7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAie1wiMVwiOntcImRibFwiOlwiTmFOXCJ9LFwiMlwiOntcImRibFwiOlwiSW5maW5pdHlcIn0sXCIzXCI6e1wiZGJsXCI6XCItSW5maSIKKyAgIm5pdHlcIn0sXCI0XCI6e1wiZGJsXCI6My4zMzMzMzMzMzMzMzMzMzM1fSxcIjVcIjp7XCJkYmxcIjo5Ljk5OTk5OTk5OTk5OTk5OTRlKyIKKyAgIjMwNH0sXCI2XCI6e1wiZGJsXCI6MWUtMzA1fSxcIjdcIjp7XCJkYmxcIjowfSxcIjhcIjp7XCJkYmxcIjotMH19IgorICApOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhkdWIpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzcpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIEJhc2U2NCBiYXNlOworICBiYXNlLmEgPSAxMjM7CisgIGJhc2UuYjEgPSAiMSI7CisgIGJhc2UuYjIgPSAiMTIiOworICBiYXNlLmIzID0gIjEyMyI7CisgIGJhc2UuYjQgPSAiMTIzNCI7CisgIGJhc2UuYjUgPSAiMTIzNDUiOworICBiYXNlLmI2ID0gIjEyMzQ1NiI7CisKKyAgYmFzZS53cml0ZShwcm90by5nZXQoKSk7CisgIEJhc2U2NCBiYXNlMjsKKyAgYmFzZTIucmVhZChwcm90by5nZXQoKSk7CisKKyAgQk9PU1RfQ0hFQ0soYmFzZSA9PSBiYXNlMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b184KSB7CisgIGNvbnN0IGNoYXIqIGpzb25fc3RyaW5nID0KKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNi43NzIxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCisgICJuXFx1MDAwN1xcdFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworCisgIGNvbnN0IHN0ZDo6c2l6ZV90IGJ1ZlNpeiA9IHN0cmxlbihqc29uX3N0cmluZykgKiBzaXplb2YoY2hhcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZTaXopKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBPbmVPZkVhY2ggb29lMjsKKworICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIHRvSGV4U2VxdWVuY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJyk7CisgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyBpKyspIHsKKyAgICBzcyA8PCAiXFx4IiA8PCBpbnQodWludDhfdChzdHJbaV0pKTsKKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl91bmljb2RlX2VzY2FwZWQpIHsKKyAgY29uc3QgY2hhciBqc29uX3N0cmluZ1tdID0KKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyFcIn0sXCI5XCI6e1wic3RyXCI6XCJcXHUwZTAxIFxcdWQ4MzVcXHVkZDNlXCJ9LCIKKyAgIlwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIjAwMDAwMFwifSxcIjEyXCI6e1wibHN0XCIiCisgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgorICAiXCIsMywxLDIsM119fSI7CisgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX3pvbWdfdW5pY29kZSA9ICJceGUwXHhiOFx4ODEgXHhmMFx4OWRceDk0XHhiZSI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKKyAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc2l6ZW9mKGpzb25fc3RyaW5nKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisgIG9vZTIucmVhZChwcm90by5nZXQoKSk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIW9vZTIuem9tZ191bmljb2RlLmNvbXBhcmUoZXhwZWN0ZWRfem9tZ191bmljb2RlKSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IHRvSGV4U2VxdWVuY2UoZXhwZWN0ZWRfem9tZ191bmljb2RlKSA8PCAiXG5Hb3R0ZW46XG4iCisgICAgICAgICAgICAgICAgICA8PCB0b0hleFNlcXVlbmNlKG9vZTIuem9tZ191bmljb2RlKSk7CisKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3VuaWNvZGVfZXNjYXBlZF9taXNzaW5nX2xvd19zdXJyb2dhdGUpIHsKKyAgY29uc3QgY2hhciBqc29uX3N0cmluZ1tdID0KKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyFcIn0sXCI5XCI6e1wic3RyXCI6XCJcXHVkODM1XCJ9LCIKKyAgIlwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIjAwMDAwMFwifSxcIjEyXCI6e1wibHN0XCIiCisgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgorICAiXCIsMywxLDIsM119fSI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKKyAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc2l6ZW9mKGpzb25fc3RyaW5nKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisgIEJPT1NUX0NIRUNLX1RIUk9XKG9vZTIucmVhZChwcm90by5nZXQoKSksCisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb24pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fdW5pY29kZV9lc2NhcGVkX21pc3NpbmdfaGlfc3Vycm9nYXRlKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1ZGQzZVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjQ1YTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmggXAorCQlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBcCisJCWdlbi1jcHAvT25lV2F5U2VydmljZS5oIFwKKwkJZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL3Byb2NfdHlwZXMuaAorCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Z2VuY3BwLmxhIGxpYnByb2Nlc3NvcnRlc3QubGEKK25vZGlzdF9saWJ0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIFwKKwlnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwIFwKKwlUaHJpZnRUZXN0X2V4dHJhcy5jcHAgXAorCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKKworbm9kaXN0X2xpYnByb2Nlc3NvcnRlc3RfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgXAorCWdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggXAorCWdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaCBcCisJZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmggXAorCWdlbi1jcHAvcHJvY190eXBlcy5jcHAgXAorCWdlbi1jcHAvcHJvY190eXBlcy5oCisKK1RocmlmdFRlc3RfZXh0cmFzLm86IGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCitEZWJ1Z1Byb3RvVGVzdF9leHRyYXMubzogZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oCisKK2xpYnRlc3RnZW5jcHBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisKK25vaW5zdF9QUk9HUkFNUyA9IEJlbmNobWFyayBcCisJY29uY3VycmVuY3lfdGVzdAorCitCZW5jaG1hcmtfU09VUkNFUyA9IFwKKwlCZW5jaG1hcmsuY3BwCisKK0JlbmNobWFya19MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKKworY2hlY2tfUFJPR1JBTVMgPSBcCisJVW5pdFRlc3RzIFwKKwlURkRUcmFuc3BvcnRUZXN0IFwKKwlUUGlwZWRUcmFuc3BvcnRUZXN0IFwKKwlEZWJ1Z1Byb3RvVGVzdCBcCisJSlNPTlByb3RvVGVzdCBcCisJT3B0aW9uYWxSZXF1aXJlZFRlc3QgXAorCVJlY3Vyc2l2ZVRlc3QgXAorCVNwZWNpYWxpemF0aW9uVGVzdCBcCisJQWxsUHJvdG9jb2xzVGVzdCBcCisJVHJhbnNwb3J0VGVzdCBcCisJVEludGVycnVwdFRlc3QgXAorCVRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgXAorCVNlY3VyaXR5VGVzdCBcCisJWmxpYlRlc3QgXAorCVRGaWxlVHJhbnNwb3J0VGVzdCBcCisJbGlua190ZXN0IFwKKwlPcGVuU1NMTWFudWFsSW5pdFRlc3QgXAorCUVudW1UZXN0IFwKKwlSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QgXAorICAgICAgICBBbm5vdGF0aW9uVGVzdAorCitpZiBBTVhfSEFWRV9MSUJFVkVOVAorbm9pbnN0X1BST0dSQU1TICs9IFwKKwlwcm9jZXNzb3JfdGVzdAorY2hlY2tfUFJPR1JBTVMgKz0gXAorCVROb25ibG9ja2luZ1NlcnZlclRlc3QgXAorCVROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKK2VuZGlmCisKK1RFU1RTX0VOVklST05NRU5UPSBcCisJQk9PU1RfVEVTVF9MT0dfU0lOSz10ZXN0cy54bWwgXAorCUJPT1NUX1RFU1RfTE9HX0xFVkVMPXRlc3Rfc3VpdGUgXAorCUJPT1NUX1RFU1RfTE9HX0ZPUk1BVD1YTUwKKworVEVTVFMgPSBcCisJJChjaGVja19QUk9HUkFNUykKKworVW5pdFRlc3RzX1NPVVJDRVMgPSBcCisJVW5pdFRlc3RNYWluLmNwcCBcCisJT25lV2F5SFRUUFRlc3QuY3BwIFwKKwlUTWVtb3J5QnVmZmVyVGVzdC5jcHAgXAorCVRCdWZmZXJCYXNlVGVzdC5jcHAgXAorCUJhc2U2NFRlc3QuY3BwIFwKKwlUb1N0cmluZ1Rlc3QuY3BwIFwKKwlUeXBlZGVmVGVzdC5jcHAgXAorCVRTZXJ2ZXJTb2NrZXRUZXN0LmNwcCBcCisJVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwIFwKKwlUVHJhbnNwb3J0Q2hlY2tUaHJvdy5oCisKK1VuaXRUZXN0c19TT1VSQ0VTICs9IFwKKyAgY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcCBcCisgIGNvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcAorCitVbml0VGVzdHNfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9USFJFQURfTERBREQpCisKK1RJbnRlcnJ1cHRUZXN0X1NPVVJDRVMgPSBcCisJVFNvY2tldEludGVycnVwdFRlc3QuY3BwIFwKKwlUU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKKworVEludGVycnVwdFRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9GSUxFU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfQ0hST05PX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQorCitUU2VydmVySW50ZWdyYXRpb25UZXN0X1NPVVJDRVMgPSBcCisJVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAKKworVFNlcnZlckludGVncmF0aW9uVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgIGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9USFJFQURfTERBREQpCisKK1NlY3VyaXR5VGVzdF9TT1VSQ0VTID0gXAorCVNlY3VyaXR5VGVzdC5jcHAKKworU2VjdXJpdHlUZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgbGlicHJvY2Vzc29ydGVzdC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAkKEJPT1NUX0ZJTEVTWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9USFJFQURfTERBREQpCisKK1RyYW5zcG9ydFRlc3RfU09VUkNFUyA9IFwKKwlUcmFuc3BvcnRUZXN0LmNwcAorCitUcmFuc3BvcnRUZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAtbHoKKworWmxpYlRlc3RfU09VUkNFUyA9IFwKKwlabGliVGVzdC5jcHAKKworWmxpYlRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnR6LmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgIC1segorCitFbnVtVGVzdF9TT1VSQ0VTID0gXAorCUVudW1UZXN0LmNwcAorCitFbnVtVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKKworUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0X1NPVVJDRVMgPSBSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCisKK1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEgJChCT09TVF9URVNUX0xEQUREKQorCitBbm5vdGF0aW9uVGVzdF9TT1VSQ0VTID0gXAorCUFubm90YXRpb25UZXN0LmNwcAorCitBbm5vdGF0aW9uVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKKworVEZpbGVUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCisJVEZpbGVUcmFuc3BvcnRUZXN0LmNwcAorCitURmlsZVRyYW5zcG9ydFRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpCisKKyMKKyMgVEZEVHJhbnNwb3J0VGVzdAorIworVEZEVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAorCVRGRFRyYW5zcG9ydFRlc3QuY3BwCisKK1RGRFRyYW5zcG9ydFRlc3RfTERBREQgPSAgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQorCisKKyMKKyMgVFBpcGVkVHJhbnNwb3J0VGVzdAorIworVFBpcGVkVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAorCVRQaXBlZFRyYW5zcG9ydFRlc3QuY3BwIFwKKwlUUGlwZUludGVycnVwdFRlc3QuY3BwCisKK1RQaXBlZFRyYW5zcG9ydFRlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpIFwKKwkkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorCSQoQk9PU1RfVEhSRUFEX0xEQUREKQorCisjCisjIEFsbFByb3RvY29sc1Rlc3QKKyMKK0FsbFByb3RvY29sc1Rlc3RfU09VUkNFUyA9IFwKKwlBbGxQcm90b2NvbFRlc3RzLmNwcCBcCisJQWxsUHJvdG9jb2xUZXN0cy50Y2MgXAorCUdlbmVyaWNIZWxwZXJzLmgKKworQWxsUHJvdG9jb2xzVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKKworIworIyBEZWJ1Z1Byb3RvVGVzdAorIworRGVidWdQcm90b1Rlc3RfU09VUkNFUyA9IFwKKwlEZWJ1Z1Byb3RvVGVzdC5jcHAKKworRGVidWdQcm90b1Rlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQorCisKKyMKKyMgSlNPTlByb3RvVGVzdAorIworSlNPTlByb3RvVGVzdF9TT1VSQ0VTID0gXAorCUpTT05Qcm90b1Rlc3QuY3BwCisKK0pTT05Qcm90b1Rlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQorCisjCisjIFROb25ibG9ja2luZ1NlcnZlclRlc3QKKyMKK1ROb25ibG9ja2luZ1NlcnZlclRlc3RfU09VUkNFUyA9IFROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwCisKK1ROb25ibG9ja2luZ1NlcnZlclRlc3RfTERBREQgPSBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0xERkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKExJQkVWRU5UX0xJQlMpCisjCisjIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKKyMKK1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfU09VUkNFUyA9IFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCisKK1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfTERBREQgPSBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0xERkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0ZJTEVTWVNURU1fTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0NIUk9OT19MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9USFJFQURfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKExJQkVWRU5UX0xJQlMpCisKKyMKKyMgT3B0aW9uYWxSZXF1aXJlZFRlc3QKKyMKK09wdGlvbmFsUmVxdWlyZWRUZXN0X1NPVVJDRVMgPSBcCisJT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCisKK09wdGlvbmFsUmVxdWlyZWRUZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKKworIworIyBPcHRpb25hbFJlcXVpcmVkVGVzdAorIworUmVjdXJzaXZlVGVzdF9TT1VSQ0VTID0gXAorCVJlY3Vyc2l2ZVRlc3QuY3BwCisKK1JlY3Vyc2l2ZVRlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQorCisjCisjIFNwZWNpYWxpemF0aW9uVGVzdAorIworU3BlY2lhbGl6YXRpb25UZXN0X1NPVVJDRVMgPSBcCisJU3BlY2lhbGl6YXRpb25UZXN0LmNwcAorCitTcGVjaWFsaXphdGlvblRlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQorCitjb25jdXJyZW5jeV90ZXN0X1NPVVJDRVMgPSBcCisJY29uY3VycmVuY3kvVGVzdHMuY3BwIFwKKwljb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaCBcCisJY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmggXAorCWNvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKKworY29uY3VycmVuY3lfdGVzdF9MREFERCA9IFwKKyAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisKK2xpbmtfdGVzdF9TT1VSQ0VTID0gXAorICBsaW5rL0xpbmtUZXN0LmNwcCBcCisgIGxpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwIFwKKyAgbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAKKworcHJvY2Vzc29yX3Rlc3RfU09VUkNFUyA9IFwKKwlwcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAgXAorCXByb2Nlc3Nvci9FdmVudExvZy5jcHAgXAorCXByb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwIFwKKwlwcm9jZXNzb3IvRXZlbnRMb2cuaCBcCisJcHJvY2Vzc29yL0hhbmRsZXJzLmggXAorCXByb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaAorCitwcm9jZXNzb3JfdGVzdF9MREFERCA9IGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0xERkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJChMSUJFVkVOVF9MSUJTKQorCitPcGVuU1NMTWFudWFsSW5pdFRlc3RfU09VUkNFUyA9IFwKKwlPcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCisKK09wZW5TU0xNYW51YWxJbml0VGVzdF9MREFERCA9IFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkgXAorCSQoT1BFTlNTTF9MREZMQUdTKSBcCisJJChPUEVOU1NMX0xJQlMpCisKKyMKKyMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKKyMKKworZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmg6ICQodG9wX3NyY2RpcikvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCisKK2dlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0VudW1UZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcCBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvUmVjdXJzaXZlLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworZ2VuLWNwcC9TZXJ2aWNlLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwOiAkKHRvcF9zcmNkaXIpL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHA6IE9uZVdheVRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuY3BwIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIGdlbi1jcHAvcHJvY190eXBlcy5jcHAgZ2VuLWNwcC9wcm9jX3R5cGVzLmg6IHByb2Nlc3Nvci9wcm9jLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAkPAorCitBTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUyAtSS4KK0FNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpCitBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIGdlbi1jcHAvKgorCitFWFRSQV9ESVNUID0gXAorCWNvbmN1cnJlbmN5IFwKKwlwcm9jZXNzb3IgXAorCXF0IFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcCBcCisJVGhyaWZ0VGVzdF9leHRyYXMuY3BwIFwKKwlPbmVXYXlUZXN0LnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09uZVdheUhUVFBUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmYTE2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlICJnZW4tY3BwL09uZVdheVNlcnZpY2UuaCIKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKE9uZVdheUhUVFBUZXN0KQorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSHR0cENsaWVudDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjpjZXJyOwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpzdHJpbmc7CituYW1lc3BhY2UgdXRmID0gYm9vc3Q6OnVuaXRfdGVzdDsKKworLy8gRGVmaW5lIHRoaXMgZW52IHZhciB0byBlbmFibGUgc29tZSBsb2dnaW5nIChpbiBjYXNlIHlvdSBuZWVkIHRvIGRlYnVnKQorI3VuZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworCitjbGFzcyBPbmVXYXlTZXJ2aWNlSGFuZGxlciA6IHB1YmxpYyBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYgeworcHVibGljOgorICBPbmVXYXlTZXJ2aWNlSGFuZGxlcigpIHt9CisKKyAgdm9pZCByb3VuZFRyaXBSUEMoKSBvdmVycmlkZSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAicm91bmRUcmlwUlBDKCkiIDw8IGVuZGw7CisjZW5kaWYKKyAgfQorICB2b2lkIG9uZVdheVJQQygpIHsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJvbmVXYXlSUEMoKSIgPDwgc3RkOjplbmRsIDsKKyNlbmRpZgorIH0KK307CisKK2NsYXNzIE9uZVdheVNlcnZpY2VDbG9uZUZhY3RvcnkgOiB2aXJ0dWFsIHB1YmxpYyBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWZGYWN0b3J5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfk9uZVdheVNlcnZpY2VDbG9uZUZhY3RvcnkoKSB7fQorICB2aXJ0dWFsIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VJZiogZ2V0SGFuZGxlcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKQorICB7CisgICAgKHZvaWQpY29ubkluZm8gOworICAgIHJldHVybiBuZXcgT25lV2F5U2VydmljZUhhbmRsZXI7CisgIH0KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYqIGhhbmRsZXIpIHsKKyAgICBkZWxldGUgaGFuZGxlcjsKKyAgfQorfTsKKworY2xhc3MgUlBDMFRocmVhZENsYXNzIHsKK3B1YmxpYzoKKyAgUlBDMFRocmVhZENsYXNzKFRUaHJlYWRlZFNlcnZlciYgc2VydmVyKSA6IHNlcnZlcl8oc2VydmVyKSB7IH0gLy8gQ29uc3RydWN0b3IKK35SUEMwVGhyZWFkQ2xhc3MoKSB7IH0gLy8gRGVzdHJ1Y3RvcgorCit2b2lkIFJ1bigpIHsKKyAgc2VydmVyXy5zZXJ2ZSgpIDsKK30KKyBUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcl8gOworfSA7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKKworLy8gY29waWVkIGZyb20gSW50ZWdyYXRpb25UZXN0CitjbGFzcyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciwgcHVibGljIE1vbml0b3IgeworcHVibGljOgorICBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSA6IGlzTGlzdGVuaW5nXyhmYWxzZSksIGFjY2VwdGVkXygwKSB7fQorICB2aXJ0dWFsIH5UU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgIGlzTGlzdGVuaW5nXyA9IHRydWU7CisgICAgbm90aWZ5KCk7CisgIH0KKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqdGhpcyk7CisgICAgKythY2NlcHRlZF87CisgICAgbm90aWZ5KCk7CisKKyAgICAodm9pZClpbnB1dDsKKyAgICAodm9pZClvdXRwdXQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYm9vbCBpc0xpc3RlbmluZygpIGNvbnN0IHsgcmV0dXJuIGlzTGlzdGVuaW5nXzsgfQorICB1aW50NjRfdCBhY2NlcHRlZENvdW50KCkgY29uc3QgeyByZXR1cm4gYWNjZXB0ZWRfOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNMaXN0ZW5pbmdfOworICB1aW50NjRfdCBhY2NlcHRlZF87Cit9OworCitjbGFzcyBUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQgOiBwdWJsaWMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyBwdWJsaWM6CisgIFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorICAgIDogVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCwgMTAyNDApLAorICAgIGJsb2NrZWRfKGZhbHNlKSB7CisgIH0KKworICB1aW50MzJfdCB3cml0ZV9idWZmZXJfbGVuZ3RoKCkgeworICAgIHVpbnQzMl90IGhhdmVfYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOworICAgIHJldHVybiBoYXZlX2J5dGVzIDsKKyAgfQorCisgIHZvaWQgYmxvY2soKSB7CisgICAgYmxvY2tlZF8gPSB0cnVlIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJibG9jayBmbHVzaGluZ1xuIiA7CisjZW5kaWYKKyB9CisgIHZvaWQgdW5ibG9jaygpIHsKKyAgICBibG9ja2VkXyA9IGZhbHNlIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICBjZXJyIDw8ICJ1bmJsb2NrIGZsdXNoaW5nLCBidWZmZXIgaXNcbjw8IiA8PCBzdGQ6OnN0cmluZygoY2hhciAqKXdCdWZfLmdldCgpLCB3cml0ZV9idWZmZXJfbGVuZ3RoKCkpIDw8ICI+PlxuIiA7CisjZW5kaWYKKyB9CisKKyAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICBpZiAoYmxvY2tlZF8pIHsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgICAgIGNlcnIgPDwgImZsdXNoIHdhcyBibG9ja2VkXG4iIDsKKyNlbmRpZgorICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpIDsKKyAgfQorCisgIGJvb2wgYmxvY2tlZF8gOworfSA7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCBKU09OX0J1ZmZlcmVkSFRUUCApCit7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oMCkgOworICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8b25ld2F5dGVzdDo6T25lV2F5U2VydmljZVByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8T25lV2F5U2VydmljZUNsb25lRmFjdG9yeT4oKSksCisgICAgc3MsIC8vcG9ydAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEpTT05Qcm90b2NvbEZhY3Rvcnk+KCkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+IHBFdmVudEhhbmRsZXIobmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikgOworICBzZXJ2ZXIuc2V0U2VydmVyRXZlbnRIYW5kbGVyKHBFdmVudEhhbmRsZXIpOworCisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi5cbiI7CisjZW5kaWYKKyAgUlBDMFRocmVhZENsYXNzIHQoc2VydmVyKSA7CisgIGJvb3N0Ojp0aHJlYWQgdGhyZWFkKCZSUEMwVGhyZWFkQ2xhc3M6OlJ1biwgJnQpOworCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqKHBFdmVudEhhbmRsZXIuZ2V0KCkpKTsKKyAgICB3aGlsZSAoIXBFdmVudEhhbmRsZXItPmlzTGlzdGVuaW5nKCkpIHsKKyAgICAgIHBFdmVudEhhbmRsZXItPndhaXQoKTsKKyAgICB9CisgIH0KKworICBpbnQgcG9ydCA9IHNzLT5nZXRQb3J0KCkgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJwb3J0ICIgPDwgcG9ydCA8PCBlbmRsIDsKKyNlbmRpZgorCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KSk7CisgICAgc29ja2V0LT5zZXRSZWN2VGltZW91dCgxMDAwMCkgOyAvLyAxMDAwbXNlYyBzaG91bGQgYmUgZW5vdWdoCisgICAgc3RkOjpzaGFyZWRfcHRyPFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydD4gYmxvY2thYmxlX3RyYW5zcG9ydChuZXcgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRIdHRwQ2xpZW50KGJsb2NrYWJsZV90cmFuc3BvcnQsICJsb2NhbGhvc3QiLCAiL3NlcnZpY2UiKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUNsaWVudCBjbGllbnQocHJvdG9jb2wpOworCisKKyAgICB0cmFuc3BvcnQtPm9wZW4oKTsKKyAgICBjbGllbnQucm91bmRUcmlwUlBDKCk7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+YmxvY2soKSA7CisgICAgdWludDMyX3Qgc2l6ZTAgPSBibG9ja2FibGVfdHJhbnNwb3J0LT53cml0ZV9idWZmZXJfbGVuZ3RoKCkgOworICAgIGNsaWVudC5zZW5kX29uZVdheVJQQygpIDsKKyAgICB1aW50MzJfdCBzaXplMSA9IGJsb2NrYWJsZV90cmFuc3BvcnQtPndyaXRlX2J1ZmZlcl9sZW5ndGgoKSA7CisgICAgY2xpZW50LnNlbmRfb25lV2F5UlBDKCkgOworICAgIHVpbnQzMl90IHNpemUyID0gYmxvY2thYmxlX3RyYW5zcG9ydC0+d3JpdGVfYnVmZmVyX2xlbmd0aCgpIDsKKyAgICBCT09TVF9DSEVDSygoc2l6ZTEgLSBzaXplMCkgPT0gKHNpemUyIC0gc2l6ZTEpKSA7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+dW5ibG9jaygpIDsKKyAgICBjbGllbnQuc2VuZF9yb3VuZFRyaXBSUEMoKSA7CisgICAgYmxvY2thYmxlX3RyYW5zcG9ydC0+Zmx1c2goKSA7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC5yZWN2X3JvdW5kVHJpcFJQQygpIDsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIEJPT1NUX0VSUk9SKCAid2Ugc2hvdWxkIG5vdCBnZXQgYSB0cmFuc3BvcnQgZXhjZXB0aW9uIC0tIHRoaXMgbWVhbnMgd2UgZmFpbGVkOiAiICsgc3RkOjpzdHJpbmcoZS53aGF0KCkpICkgOworICAgIH0KKyAgICB0cmFuc3BvcnQtPmNsb3NlKCk7CisgIH0KKyAgc2VydmVyLnN0b3AoKTsKKyAgdGhyZWFkLmpvaW4oKSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgIGNlcnIgPDwgImZpbmlzaGVkLlxuIjsKKyNlbmRpZgorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdCBiL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjdlOWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L09uZVdheVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK25hbWVzcGFjZSBjX2dsaWIgT25lV2F5VGVzdAorbmFtZXNwYWNlIGphdmEgb25ld2F5dGVzdAorbmFtZXNwYWNlIGNwcCBvbmV3YXl0ZXN0CituYW1lc3BhY2UgcmIgT25ld2F5dGVzdAorbmFtZXNwYWNlIHBlcmwgT25lV2F5VGVzdAorbmFtZXNwYWNlIGNzaGFycCBPbmV3YXl0ZXN0CituYW1lc3BhY2UganMgT25lV2F5VGVzdAorbmFtZXNwYWNlIHN0IE9uZVdheVRlc3QKK25hbWVzcGFjZSBweSBPbmVXYXlUZXN0CituYW1lc3BhY2UgcHkudHdpc3RlZCBPbmVXYXlUZXN0CituYW1lc3BhY2UgZ28gb25ld2F5dGVzdAorbmFtZXNwYWNlIHBocCBPbmVXYXlUZXN0CituYW1lc3BhY2UgZGVscGhpIE9uZXdheXRlc3QKK25hbWVzcGFjZSBjb2NvYSBPbmVXYXlUZXN0CituYW1lc3BhY2UgbHVhIE9uZVdheVRlc3QKK25hbWVzcGFjZSB4c2QgdGVzdCAodXJpID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9ucy9PbmVXYXlUZXN0JykKK25hbWVzcGFjZSBuZXRjb3JlIFRocmlmdEFzeW5jLk9uZVdheVRlc3QKKworLy8gYSBtaW5pbWFsIFRocmlmdCBzZXJ2aWNlLCBmb3IgdXNlIGluIE9uZVdheUhUVFBUdGVzdC5jcHAKK3NlcnZpY2UgT25lV2F5U2VydmljZSB7CisgIHZvaWQgcm91bmRUcmlwUlBDKCksCisgIG9uZXdheSB2b2lkIG9uZVdheVJQQygpCit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMGIzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcApAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyBUbyBzaG93IHRoYXQgdGhpcyB0ZXN0IGFjdHVhbGx5IHRlc3RzIHNvbWV0aGluZywgeW91IGNhbiBjaGFuZ2UKKy8vIE1BTlVBTF9PUEVOU1NMX0lOSVQgdG8gMCB0byBjYXVzZSBhdXRvbWF0aWMgT3BlblNTTCBpbml0L2NsZWFudXAsCisvLyB3aGljaCB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKKyNkZWZpbmUgTUFOVUFMX09QRU5TU0xfSU5JVCAxCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8V2luU29jazIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OworCit2b2lkIG1ha2VfaXNvbGF0ZWRfc3Nsc29ja2V0ZmFjdG9yeSgpIHsKKyAgLy8gSGVyZSB3ZSBjcmVhdGUgYW4gaXNvbGF0ZWQgVFNTTFNvY2tldEZhY3RvcnkgdG8gZW5zdXJlIHRoZQorICAvLyBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBvZiBUU1NMU29ja2V0RmFjdG9yeSBnZXQgcnVuLiAgVGh1cworICAvLyB3aXRob3V0IG1hbnVhbCBpbml0aWFsaXphdGlvbiBub3JtYWxseSBPcGVuU1NMIHdvdWxkIGJlCisgIC8vIHVuaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbi4KKyAgVFNTTFNvY2tldEZhY3RvcnkgZmFjdG9yeTsKK30KKwordm9pZCBvcGVuc3NsX2luaXQoKSB7CisjaWYgTUFOVUFMX09QRU5TU0xfSU5JVAorICBUU1NMU29ja2V0RmFjdG9yeTo6c2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKHRydWUpOworICBpbml0aWFsaXplT3BlblNTTCgpOworI2VuZGlmCit9CisKK3ZvaWQgb3BlbnNzbF9jbGVhbnVwKCkgeworI2lmIE1BTlVBTF9PUEVOU1NMX0lOSVQKKyAgY2xlYW51cE9wZW5TU0woKTsKKyNlbmRpZgorfQorCit2b2lkIHRlc3Rfb3BlbnNzbF9hdmFpbGFiaWxpdHkoKSB7CisgIC8vIENoZWNrIHdoZXRoZXIgVGhyaWZ0IGxlYXZlcyBPcGVuU1NMIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlIGFmdGVyCisgIC8vIHRoZSBsYXN0IFRTU0xTb2NrZXRGYWN0b3J5IGlzIGRlc3Ryb3llZCB3aGVuIG1hbnVhbAorICAvLyBpbml0aWFsaXphdGlvbiBpcyBzZXQKKyAgb3BlbnNzbF9pbml0KCk7CisgIG1ha2VfaXNvbGF0ZWRfc3Nsc29ja2V0ZmFjdG9yeSgpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgb25lIHRoYXQgd2lsbCBmYWlsIGlmIE9wZW5TU0wgaXMKKyAgLy8gdW5pbml0aWFsaXplZC4gIEl0IG1pZ2h0IGFsc28gZmFpbCBvbiB2ZXJ5IG9sZCB2ZXJzaW9ucyBvZgorICAvLyBPcGVuU1NMLi4uCisgIGNvbnN0IEVWUF9NRCogbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgiU0hBMjU2Iik7CisgIEJPT1NUX0NIRUNLKG1kICE9IE5VTEwpOworICBvcGVuc3NsX2NsZWFudXAoKTsKK30KKworI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJPcGVuU1NMTWFudWFsSW5pdCI7CisKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9vcGVuc3NsX2F2YWlsYWJpbGl0eSkpOworCisgIHJldHVybiB0cnVlOworfQorIAoraW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIk9wZW5TU0xNYW51YWxJbml0IjsKKworICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X29wZW5zc2xfYXZhaWxhYmlsaXR5KSk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzQzNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcApAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgImdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCIKKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBPcHRpb25hbFJlcXVpcmVkVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKKworLyoKK3RlbXBsYXRlPHR5cGVuYW1lIFN0cnVjdD4KK3ZvaWQgdHJ5d3JpdGUoY29uc3QgU3RydWN0JiBzLCBib29sIHNob3VsZF93b3JrKSB7CisgIGJvb2wgd29ya2VkOworICB0cnkgeworICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKKyAgICBzLndyaXRlKCZwcm90b2NvbCk7CisgICAgd29ya2VkID0gdHJ1ZTsKKyAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICYgZXgpIHsKKyAgICB3b3JrZWQgPSBmYWxzZTsKKyAgfQorICBCT09TVF9DSEVDSyh3b3JrZWQgPT0gc2hvdWxkX3dvcmspOworfQorKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFN0cnVjdDEsIHR5cGVuYW1lIFN0cnVjdDI+Cit2b2lkIHdyaXRlX3RvX3JlYWQoY29uc3QgU3RydWN0MSYgdywgU3RydWN0MiYgcikgeworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CisgIHcud3JpdGUoJnByb3RvY29sKTsKKyAgci5yZWFkKCZwcm90b2NvbCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMSkgeworICBPbGRTY2hvb2wgbzsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIk9sZFNjaG9vbCB7XG4iCisgICAgIiAgMDE6IGltX2ludCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3N0ciAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgMDM6IGltX2JpZyAobGlzdCkgPSBsaXN0PG1hcD5bMF0ge1xuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhvKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl8xKSB7CisgIFNpbXBsZSBzOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzIpIHsKKyAgU2ltcGxlIHM7CisgIHMuaW1fb3B0aW9uYWwgPSAxMDsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl8zKSB7CisgIFNpbXBsZSBzOworICBzLmltX29wdGlvbmFsID0gMTA7CisgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICIgIDAzOiBpbV9vcHRpb25hbCAoaTE2KSA9IDEwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfNCkgeworICBTaW1wbGUgczsKKyAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDM6IGltX29wdGlvbmFsIChpMTYpID0gMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzUpIHsKKyAgU2ltcGxlIHM7CisgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIHMuaW1fb3B0aW9uYWwgPSAxMDsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDM6IGltX29wdGlvbmFsIChpMTYpID0gMTAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMykgeworICAvLyBhc3NpZ24vY29weS1jb25zdHJ1Y3Qgd2l0aCBub24tcmVxdWlyZWQgZmllbGRzCisKKyAgU2ltcGxlIHMxLCBzMjsKKyAgczEuX19pc3NldC5pbV9kZWZhdWx0ID0gdHJ1ZTsKKyAgczEuX19zZXRfaW1fb3B0aW9uYWwoMTApOworICBCT09TVF9DSEVDSyhzMS5fX2lzc2V0LmltX2RlZmF1bHQpOworICBCT09TVF9DSEVDSyhzMS5fX2lzc2V0LmltX29wdGlvbmFsKTsKKworICBzMiA9IHMxOworCisgIEJPT1NUX0NIRUNLKHMyLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIEJPT1NUX0NIRUNLKHMyLl9faXNzZXQuaW1fb3B0aW9uYWwpOworCisgIFNpbXBsZSBzMyhzMSk7CisKKyAgQk9PU1RfQ0hFQ0soczMuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgQk9PU1RfQ0hFQ0soczMuX19pc3NldC5pbV9vcHRpb25hbCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfNCkgeworICAvLyBXcml0ZS10by1yZWFkIHdpdGggb3B0aW9uYWwgZmllbGRzLgorCisgIFNpbXBsZSBzMSwgczIsIHMzOworICBzMS5pbV9vcHRpb25hbCA9IDEwOworICBCT09TVF9DSEVDSyghczEuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgLy8gQk9PU1RfQ0hFQ0soIXMxLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KKyAgQk9PU1RfQ0hFQ0soIXMxLl9faXNzZXQuaW1fb3B0aW9uYWwpOworCisgIHdyaXRlX3RvX3JlYWQoczEsIHMyKTsKKworICBCT09TVF9DSEVDSyhzMi5fX2lzc2V0LmltX2RlZmF1bHQpOworICAvLyBCT09TVF9DSEVDSyggczIuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgorICBCT09TVF9DSEVDSyghczIuX19pc3NldC5pbV9vcHRpb25hbCk7CisgIEJPT1NUX0NIRUNLKHMzLmltX29wdGlvbmFsID09IDApOworCisgIHMxLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworICB3cml0ZV90b19yZWFkKHMxLCBzMyk7CisKKyAgQk9PU1RfQ0hFQ0soczMuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgLy8gQk9PU1RfQ0hFQ0soIHMzLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KKyAgQk9PU1RfQ0hFQ0soczMuX19pc3NldC5pbV9vcHRpb25hbCk7CisgIEJPT1NUX0NIRUNLKHMzLmltX29wdGlvbmFsID09IDEwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF81KSB7CisgIC8vIFdyaXRpbmcgYmV0d2VlbiBvcHRpb25hbCBhbmQgZGVmYXVsdC4KKworICBUcmlja3kxIHQxOworICBUcmlja3kyIHQyOworCisgIHQyLmltX29wdGlvbmFsID0gMTA7CisgIHdyaXRlX3RvX3JlYWQodDIsIHQxKTsKKyAgd3JpdGVfdG9fcmVhZCh0MSwgdDIpOworICBCT09TVF9DSEVDSyghdDEuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5pbV9vcHRpb25hbCk7CisgIEJPT1NUX0NIRUNLKHQxLmltX2RlZmF1bHQgPT0gdDIuaW1fb3B0aW9uYWwpOworICBCT09TVF9DSEVDSyh0MS5pbV9kZWZhdWx0ID09IDApOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzYpIHsKKyAgLy8gV3JpdGluZyBiZXR3ZWVuIGRlZmF1bHQgYW5kIHJlcXVpcmVkLgorCisgIFRyaWNreTEgdDE7CisgIFRyaWNreTMgdDM7CisgIHdyaXRlX3RvX3JlYWQodDEsIHQzKTsKKyAgd3JpdGVfdG9fcmVhZCh0MywgdDEpOworICBCT09TVF9DSEVDSyh0MS5fX2lzc2V0LmltX2RlZmF1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzcpIHsKKyAgLy8gV3JpdGluZyBiZXR3ZWVuIG9wdGlvbmFsIGFuZCByZXF1aXJlZC4KKworICBUcmlja3kyIHQyOworICBUcmlja3kzIHQzOworICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKyAgd3JpdGVfdG9fcmVhZCh0MiwgdDMpOworICB3cml0ZV90b19yZWFkKHQzLCB0Mik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfOCkgeworICAvLyBNdS1odS1oYS1oYS1oYSEKKworICBUcmlja3kyIHQyOworICBUcmlja3kzIHQzOworICB0cnkgeworICAgIHdyaXRlX3RvX3JlYWQodDIsIHQzKTsKKyAgICBhYm9ydCgpOworICB9IGNhdGNoIChjb25zdCBUUHJvdG9jb2xFeGNlcHRpb24mKSB7CisgIH0KKworICB3cml0ZV90b19yZWFkKHQzLCB0Mik7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQuaW1fb3B0aW9uYWwpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzkpIHsKKyAgQ29tcGxleCBjOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiQ29tcGxleCB7XG4iCisgICAgIiAgMDE6IGNwX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBjcF9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDQ6IHRoZV9tYXAgKG1hcCkgPSBtYXA8aTE2LHN0cnVjdD5bMF0ge1xuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDU6IHJlcV9zaW1wIChzdHJ1Y3QpID0gU2ltcGxlIHtcbiIKKyAgICAiICAgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMCkgeworICBUcmlja3kxIHQxOworICBUcmlja3kyIHQyOworICAvLyBDb21waWxlIGVycm9yLgorICAvLyh2b2lkKSh0MSA9PSB0Mik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMTEpIHsKKyAgT2xkU2Nob29sIG8xLCBvMiwgbzM7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgbzEuaW1faW50ID0gbzIuaW1faW50ID0gMTA7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgbzEuX19pc3NldC5pbV9pbnQgPSB0cnVlOworICBvMi5fX2lzc2V0LmltX2ludCA9IGZhbHNlOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLmltX2ludCA9IDIwOworICBvMS5fX2lzc2V0LmltX2ludCA9IGZhbHNlOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8xLmltX2ludCA9IDEwOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLmltX3N0ciA9IG8yLmltX3N0ciA9ICJmb28iOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLl9faXNzZXQuaW1fc3RyID0gbzIuX19pc3NldC5pbV9zdHIgPSB0cnVlOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6c3RyaW5nPiBteW1hcDsKKyAgbXltYXBbMV0gPSAiYmFyIjsKKyAgbXltYXBbMl0gPSAiYmF6IjsKKyAgbzEuaW1fYmlnLnB1c2hfYmFjayhzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4oKSk7CisgIEJPT1NUX0NIRUNLKG8xICE9IG8yKTsKKyAgbzIuaW1fYmlnLnB1c2hfYmFjayhzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4oKSk7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgbzIuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIEJPT1NUX0NIRUNLKG8xICE9IG8yKTsKKyAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CisgIG8xLndyaXRlKCZwcm90b2NvbCk7CisKKyAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIG15bWFwWzNdID0gInF1eCI7CisgIG8yLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8xLmltX2JpZy5iYWNrKClbM10gPSAicXV4IjsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICAKKyAgbzMucmVhZCgmcHJvdG9jb2wpOworICBvMy5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzMpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiT2xkU2Nob29sIHtcbiIKKyAgICAiICAwMTogaW1faW50IChpMTYpID0gMTAsXG4iCisgICAgIiAgMDI6IGltX3N0ciAoc3RyaW5nKSA9IFwiZm9vXCIsXG4iCisgICAgIiAgMDM6IGltX2JpZyAobGlzdCkgPSBsaXN0PG1hcD5bM10ge1xuIgorICAgICIgICAgWzBdID0gbWFwPGkzMixzdHJpbmc+WzBdIHtcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBbMV0gPSBtYXA8aTMyLHN0cmluZz5bMl0ge1xuIgorICAgICIgICAgICAxIC0+IFwiYmFyXCIsXG4iCisgICAgIiAgICAgIDIgLT4gXCJiYXpcIixcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBbMl0gPSBtYXA8aTMyLHN0cmluZz5bM10ge1xuIgorICAgICIgICAgICAxIC0+IFwiYmFyXCIsXG4iCisgICAgIiAgICAgIDIgLT4gXCJiYXpcIixcbiIKKyAgICAiICAgICAgMyAtPiBcInF1eFwiLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICB9LFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcobzMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMikgeworICBUcmlja3kyIHQxLCB0MjsKKyAgQk9PU1RfQ0hFQ0sodDEuX19pc3NldC5pbV9vcHRpb25hbCA9PSBmYWxzZSk7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gZmFsc2UpOworICBCT09TVF9DSEVDSyh0MSA9PSB0Mik7CisgIHQxLmltX29wdGlvbmFsID0gNTsKKyAgQk9PU1RfQ0hFQ0sodDEgPT0gdDIpOworICB0Mi5pbV9vcHRpb25hbCA9IDU7CisgIEJPT1NUX0NIRUNLKHQxID09IHQyKTsKKyAgdDEuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIEJPT1NUX0NIRUNLKHQxICE9IHQyKTsKKyAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIEJPT1NUX0NIRUNLKHQxID09IHQyKTsKKyAgdDEuaW1fb3B0aW9uYWwgPSAxMDsKKyAgQk9PU1RfQ0hFQ0sodDEgIT0gdDIpOworICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gZmFsc2U7CisgIEJPT1NUX0NIRUNLKHQxICE9IHQyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMykgeworICBPcHRpb25hbERlZmF1bHQgdDEsIHQyOworCisgIEJPT1NUX0NIRUNLKHQxLl9faXNzZXQub3B0X2ludCA9PSB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0sodDEuX19pc3NldC5vcHRfc3RyID09IHRydWUpOworICBCT09TVF9DSEVDSyh0MS5vcHRfaW50ID09IHQyLm9wdF9pbnQpOworICBCT09TVF9DSEVDSyh0MS5vcHRfc3RyID09IHQyLm9wdF9zdHIpOworCisgIHdyaXRlX3RvX3JlYWQodDEsIHQyKTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5vcHRfaW50ID09IHRydWUpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0Lm9wdF9zdHIgPT0gdHJ1ZSk7CisgIEJPT1NUX0NIRUNLKHQxLm9wdF9pbnQgPT0gdDIub3B0X2ludCk7CisgIEJPT1NUX0NIRUNLKHQxLm9wdF9zdHIgPT0gdDIub3B0X3N0cik7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPcHRpb25hbERlZmF1bHQge1xuIgorICAgICIgIDAxOiBvcHRfaW50IChpMTYpID0gMTIzNCxcbiIKKyAgICAiICAwMjogb3B0X3N0ciAoc3RyaW5nKSA9IFwiZGVmYXVsdFwiLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcodDIpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYyMzRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFJlY3Vyc2l2ZVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMSkgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBSZWNUcmVlIHRyZWU7CisgIFJlY1RyZWUgY2hpbGQ7CisgIHRyZWUuY2hpbGRyZW4ucHVzaF9iYWNrKGNoaWxkKTsKKworICB0cmVlLndyaXRlKHByb3QuZ2V0KCkpOworCisgIFJlY1RyZWUgcmVzdWx0OworICByZXN1bHQucmVhZChwcm90LmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0sodHJlZSA9PSByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlY3Vyc2l2ZV8yKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZikpOworCisgIFJlY0xpc3QgbDsKKyAgc2hhcmVkX3B0cjxSZWNMaXN0PiBsMihuZXcgUmVjTGlzdCk7CisgIGwubmV4dGl0ZW0gPSBsMjsKKworICBsLndyaXRlKHByb3QuZ2V0KCkpOworCisgIFJlY0xpc3QgcmVzdWx0bGlzdDsKKyAgcmVzdWx0bGlzdC5yZWFkKHByb3QuZ2V0KCkpOworICBCT09TVF9DSEVDSyhyZXN1bHRsaXN0Lm5leHRpdGVtICE9IE5VTEwpOworICBCT09TVF9DSEVDSyhyZXN1bHRsaXN0Lm5leHRpdGVtLT5uZXh0aXRlbSA9PSBOVUxMKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMykgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBDb1JlYyBjOworICBzaGFyZWRfcHRyPENvUmVjMj4gcihuZXcgQ29SZWMyKTsKKyAgYy5vdGhlciA9IHI7CisKKyAgYy53cml0ZShwcm90LmdldCgpKTsKKworICBjLnJlYWQocHJvdC5nZXQoKSk7CisgIEJPT1NUX0NIRUNLKGMub3RoZXIgIT0gTlVMTCk7CisgIEJPT1NUX0NIRUNLKGMub3RoZXItPm90aGVyLm90aGVyID09IE5VTEwpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlY3Vyc2l2ZV80KSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZikpOworCisgIHNoYXJlZF9wdHI8UmVjTGlzdD4gZGVwdGhMaW1pdChuZXcgUmVjTGlzdCk7CisgIGRlcHRoTGltaXQtPm5leHRpdGVtID0gZGVwdGhMaW1pdDsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coZGVwdGhMaW1pdC0+d3JpdGUocHJvdC5nZXQoKSksCisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb24pOworCisgIGRlcHRoTGltaXQtPm5leHRpdGVtLnJlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTA0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBFUFNJTE9OIDAuMDAwMDAwMQorI2luY2x1ZGUgPHR5cGVpbmRleD4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmgiCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKSB7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OTsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUykuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKQorICAgICAgICAgICAgLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVuZGVyZWRfZG91YmxlX2xpc3QpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+IEVYUEVDVEVEX0RPVUJMRV9MSVNUezEuMCwtMTAwLjAsMTAwLjAsOTIyMzM3MjAzNjg1NDc3NTgwNy4wLC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAsCisgICAgICAgIDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDN9OworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5zaXplKCksIEVYUEVDVEVEX0RPVUJMRV9MSVNULnNpemUoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5zaXplKCk7ICsraSkgeworICAgICAgICBCT09TVF9DSEVDS19DTE9TRShnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1RbaV0sIEVYUEVDVEVEX0RPVUJMRV9MSVNUW2ldLCBFUFNJTE9OKTsKKyAgICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJhNGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBTZWN1cml0eVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNlcnZlclNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OworCit1c2luZyBzdGQ6OmJpbmQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGtleURpcjsKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGNlcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgICByZXR1cm4ga2V5RGlyIC8gZmlsZW5hbWU7Cit9Citib29zdDo6bXV0ZXggZ011dGV4OworCitzdHJ1Y3QgR2xvYmFsRml4dHVyZQoreworICAgIEdsb2JhbEZpeHR1cmUoKQorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYzsgKytpKQorICAgIHsKKyAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICB9CisKKyAgICAjaWZkZWYgX19saW51eF9fCisgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAvLyBkaXNjb25uZWN0ZWQgY2FuIGNhdXNlIGEgU0lHUElQRSBzaWduYWwuLi4KKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgI2VuZGlmCisKKyAgICBUU1NMU29ja2V0RmFjdG9yeTo6c2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKHRydWUpOworICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmluaXRpYWxpemVPcGVuU1NMKCk7CisKKyAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgIHsKKyAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5HbG9iYWxGaXh0dXJlKCkKKyAgICB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisjZW5kaWYKKyAgICB9Cit9OworCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSk7CisjZWxzZQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSkKKyNlbmRpZgorCitzdHJ1Y3QgU2VjdXJpdHlGaXh0dXJlCit7CisgICAgdm9pZCBzZXJ2ZXIoYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU2VydmVyU29ja2V0PiBwU2VydmVyU29ja2V0OworCisgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3Rvcnkoc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHByb3RvY29sKSkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJzZXJ2ZXIua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+c2VydmVyKHRydWUpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldC5yZXNldChuZXcgVFNTTFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpKTsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY29ubmVjdGVkQ2xpZW50OworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2VydmVyU29ja2V0LT5saXN0ZW4oKTsKKyAgICAgICAgICAgICAgICBtUG9ydCA9IHBTZXJ2ZXJTb2NrZXQtPmdldFBvcnQoKTsKKyAgICAgICAgICAgICAgICBtQ1Zhci5ub3RpZnlfb25lKCk7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudCA9IHBTZXJ2ZXJTb2NrZXQtPmFjY2VwdCgpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzJdOworICAgICAgICAgICAgICAgIGJ1ZlswXSA9ICdPJzsKKyAgICAgICAgICAgICAgICBidWZbMV0gPSAnSyc7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50LT53cml0ZSgmYnVmWzBdLCAyKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDbGllbnQtPmZsdXNoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29zdDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZ011dGV4KTsKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiU1JWICUxJSBFeGNlcHRpb246ICUyJSIpICUgYm9vc3Q6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSAlIGV4LndoYXQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uZWN0ZWRDbGllbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50LT5jbG9zZSgpOworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudC5yZXNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU2VydmVyU29ja2V0LT5jbG9zZSgpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldC5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT1NUX0ZBSUwoYm9vc3Q6OmZvcm1hdCgiJTElOiAlMiUiKSAlIHR5cGVpZChleCkubmFtZSgpICUgZXgud2hhdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2xpZW50KGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sIHByb3RvY29sKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBwQ2xpZW50U29ja2V0OworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3Rvcnkoc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHByb3RvY29sKSkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgiY2xpZW50LmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjZXJ0RmlsZSgiQ0EucGVtIikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldCA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIG1Qb3J0KTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0LT5vcGVuKCk7CisKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZlszXTsKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAwOworICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IDA7CisgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcENsaWVudFNvY2tldC0+cmVhZCgmYnVmWzBdLCAyKSk7CisgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgbWVtY21wKCZidWZbMF0sICJPSyIsIDIpKTsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29zdDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZ011dGV4KTsKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiQ0xJICUxJSBFeGNlcHRpb246ICUyJSIpICUgYm9vc3Q6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSAlIGV4LndoYXQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwQ2xpZW50U29ja2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXQtPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldC5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT1NUX0ZBSUwoYm9vc3Q6OmZvcm1hdCgiJTElOiAlMiUiKSAlIHR5cGVpZChleCkubmFtZSgpICUgZXgud2hhdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyICpwcm90b2NvbDJzdHIoc2l6ZV90IHByb3RvY29sKQorICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnN0cmluZ3NbYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUICsgMV0gPQorICAgICAgICB7CisgICAgICAgICAgICAgICAgIlNTTFRMUyIsCisgICAgICAgICAgICAgICAgIlNTTHYyIiwKKyAgICAgICAgICAgICAgICAiU1NMdjMiLAorICAgICAgICAgICAgICAgICJUTFN2MV8wIiwKKyAgICAgICAgICAgICAgICAiVExTdjFfMSIsCisgICAgICAgICAgICAgICAgIlRMU3YxXzIiCisgICAgICAgIH07CisgICAgICAgIHJldHVybiBzdHJpbmdzW3Byb3RvY29sXTsKKyAgICB9CisKKyAgICBib29zdDo6bXV0ZXggbU11dGV4OworICAgIGJvb3N0Ojpjb25kaXRpb25fdmFyaWFibGUgbUNWYXI7CisgICAgaW50IG1Qb3J0OworICAgIGJvb2wgbUNvbm5lY3RlZDsKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShCT09TVF9URVNUX01PRFVMRSwgU2VjdXJpdHlGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShzc2xfc2VjdXJpdHlfbWF0cml4KQoreworICAgIHRyeQorICAgIHsKKyAgICAgICAgLy8gbWF0cml4IG9mIGNvbm5lY3Rpb24gc3VjY2VzcyBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHdpdGggZGlmZmVyZW50IFNTTFByb3RvY29sIHNlbGVjdGlvbnMKKyAgICAgICAgYm9vbCBtYXRyaXhbYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUICsgMV1bYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUICsgMV0gPQorICAgICAgICB7CisgICAgLy8gICBzZXJ2ZXIgICAgPSBTU0xUTFMgICBTU0x2MiAgICBTU0x2MyAgICBUTFN2MV8wICBUTFN2MV8xICBUTFN2MV8yCisgICAgLy8gY2xpZW50CisgICAgLyogU1NMVExTICAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICB0cnVlLCAgICB0cnVlICAgIH0sCisgICAgLyogU1NMdjIgICAqLyAgeyBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSAgIH0sCisgICAgLyogU1NMdjMgICAqLyAgeyBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSAgIH0sCisgICAgLyogVExTdjFfMCAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSAgIH0sCisgICAgLyogVExTdjFfMSAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICBmYWxzZSAgIH0sCisgICAgLyogVExTdjFfMiAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKHNpemVfdCBzaSA9IDA7IHNpIDw9IGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVDsgKytzaSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChzaXplX3QgY2kgPSAwOyBjaSA8PSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpMQVRFU1Q7ICsrY2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNpID09IDEgfHwgY2kgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIFNTTHYyIGNhc2VzIC0gcHJvdG9jb2wgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBPUEVOU1NMX05PX1NTTDMKKyAgICAgICAgICAgICAgICBpZiAoc2kgPT0gMiB8fCBjaSA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbGwgU1NMdjMgY2FzZXMgLSBwcm90b2NvbCBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiVEVTVDogU2VydmVyID0gJTElLCBDbGllbnQgPSAlMiUiKQorICAgICAgICAgICAgICAgICAgICAlIHByb3RvY29sMnN0cihzaSkgJSBwcm90b2NvbDJzdHIoY2kpKTsKKworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAvLyB0aHJlYWRfZ3JvdXAgbWFuYWdlcyB0aGUgdGhyZWFkIGxpZmV0aW1lIC0gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgY3JlYXRlX3RocmVhZAorICAgICAgICAgICAgICAgIGJvb3N0Ojp0aHJlYWRfZ3JvdXAgdGhyZWFkczsKKyAgICAgICAgICAgICAgICAodm9pZCl0aHJlYWRzLmNyZWF0ZV90aHJlYWQoYmluZCgmU2VjdXJpdHlGaXh0dXJlOjpzZXJ2ZXIsIHRoaXMsIHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihzaSkpKTsKKyAgICAgICAgICAgICAgICBtQ1Zhci53YWl0KGxvY2spOyAgICAgICAgICAgLy8gd2FpdCBmb3IgbGlzdGVuKCkgdG8gc3VjY2VlZAorICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgKHZvaWQpdGhyZWFkcy5jcmVhdGVfdGhyZWFkKGJpbmQoJlNlY3VyaXR5Rml4dHVyZTo6Y2xpZW50LCB0aGlzLCBzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4oY2kpKSk7CisgICAgICAgICAgICAgICAgdGhyZWFkcy5qb2luX2FsbCgpOworCisgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShtQ29ubmVjdGVkID09IG1hdHJpeFtjaV1bc2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmZvcm1hdCgiICAgICAgU2VydmVyID0gJTElLCBDbGllbnQgPSAlMiUgZXhwZWN0ZWQgbUNvbm5lY3RlZCA9PSAlMyUgYnV0IHdhcyAlNCUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgcHJvdG9jb2wyc3RyKHNpKSAlIHByb3RvY29sMnN0cihjaSkgJSBtYXRyaXhbY2ldW3NpXSAlIG1Db25uZWN0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXgpCisgICAgeworICAgICAgICBCT09TVF9GQUlMKGJvb3N0Ojpmb3JtYXQoIiUxJTogJTIlIikgJSB0eXBlaWQoZXgpLm5hbWUoKSAlIGV4LndoYXQoKSk7CisgICAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4ODM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8Z2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oPgorCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBTcGVjaWFsaXphdGlvblRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK3R5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBNeVByb3RvY29sOworLy8gdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xUPFRUcmFuc3BvcnQ+IE15UHJvdG9jb2w7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3BlY2lhbGl6YXRpb25fMSkgeworICBPbmVPZkVhY2ggb29lOworICBvb2UuaW1fdHJ1ZSA9IHRydWU7CisgIG9vZS5pbV9mYWxzZSA9IGZhbHNlOworICBvb2UuYV9iaXRlID0gMHg3ZjsKKyAgb29lLmludGVnZXIxNiA9IDI3MDAwOworICBvb2UuaW50ZWdlcjMyID0gMSA8PCAyNDsKKyAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CisgIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKKyAgb29lLnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOworICBvb2Uuem9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOworICBvb2UuYmFzZTY0ID0gIlwxXDJcM1wyNTUiOworCisgIE5lc3RpbmcgbjsKKyAgbi5teV9vb2UgPSBvb2U7CisgIG4ubXlfb29lLmludGVnZXIxNiA9IDE2OworICBuLm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKKyAgbi5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7CisgIG4ubXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkgKyAxKSAvIDI7CisgIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKKyAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMFx4ZDBceDlkXHhjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGIwXHhjZlx4ODFceGUyXHg4NFx4OGVceDIwXHhjZVx4OTFceDc0XHg3NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGJjIjsKKyAgbi5teV9ib25rLnR5cGUgPSAzMTMzNzsKKyAgbi5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7CisKKyAgSG9seU1vbGV5IGhtOworCisgIGhtLmJpZy5wdXNoX2JhY2sob29lKTsKKyAgaG0uYmlnLnB1c2hfYmFjayhuLm15X29vZSk7CisgIGhtLmJpZ1swXS5hX2JpdGUgPSAweDIyOworICBobS5iaWdbMV0uYV9iaXRlID0gMHgzMzsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RhZ2UxOworICBzdGFnZTEucHVzaF9iYWNrKCJhbmQgYSBvbmUiKTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgdHdvIik7CisgIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIHN0YWdlMS5jbGVhcigpOworICBzdGFnZTEucHVzaF9iYWNrKCJ0aGVuIGEgb25lLCB0d28iKTsKKyAgc3RhZ2UxLnB1c2hfYmFjaygidGhyZWUhIik7CisgIHN0YWdlMS5wdXNoX2JhY2soIkZPVVIhISIpOworICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBzdGFnZTEuY2xlYXIoKTsKKyAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKworICBzdGQ6OnZlY3RvcjxCb25rPiBzdGFnZTI7CisgIGhtLmJvbmtzWyJub3RoaW5nIl0gPSBzdGFnZTI7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSAxOworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAiV2FpdC4iOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKKyAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKKyAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKKyAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOworICBzdGFnZTIuY2xlYXIoKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CisgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDM7CisgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJxdW90aCI7CisgIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSArIDEpOworICBzdGFnZTIuYmFjaygpLnR5cGUgPSA0OworICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAidGhlIHJhdmVuIjsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CisgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7CisgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOworICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8obmV3IE15UHJvdG9jb2woYnVmZmVyKSk7CisKKyAgb29lLndyaXRlKHByb3RvLmdldCgpKTsKKyAgT25lT2ZFYWNoIG9vZTI7CisgIG9vZTIucmVhZChwcm90by5nZXQoKSk7CisKKyAgQk9PU1RfQ0hFQ0sob29lID09IG9vZTIpOworCisgIGhtLndyaXRlKHByb3RvLmdldCgpKTsKKyAgSG9seU1vbGV5IGhtMjsKKyAgaG0yLnJlYWQocHJvdG8uZ2V0KCkpOworCisgIEJPT1NUX0NIRUNLKGhtID09IGhtMik7CisKKyAgaG0yLmJpZ1swXS5hX2JpdGUgPSAweDAwOworCisgIEJPT1NUX0NIRUNLKGhtICE9IGhtMik7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDMwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcApAQCAtMCwwICsxLDY0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6dGVzdDo6VFNob3J0UmVhZFRyYW5zcG9ydDsKK3VzaW5nIHN0ZDo6c3RyaW5nOworCisvLyBTaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBabGliVHJhbnNwb3J0LiAgVE9ETzogcmVmYWN0b3IuCit1bnNpZ25lZCBpbnQgZGlzdFtdWzUwMDBdID0geworIHsgMTw8MTUgfSwKKworIHsKKyAgNSwxMyw5LDEsOCw5LDExLDEzLDE4LDQ4LDI0LDEzLDIxLDEzLDUsMTEsMzUsMiw0LDIwLDE3LDcyLDI3LDE0LDE1LDQsNywyNiwKKyAgMTIsMSwxNCw5LDIsMTYsMjksNDEsNywyNCw0LDI3LDE0LDQsMSw0LDI1LDMsNiwzNCwxMCw4LDUwLDIsMTQsMTMsNTUsMjksMywKKyAgNDMsNTMsNDksMTQsNCwxMCwzMiwyNyw0OCwxLDMsMSwxMSw1LDE3LDE2LDUxLDE3LDMwLDE1LDExLDksMiwyLDExLDUyLDEyLDIsCisgIDEzLDk0LDEsMTksMSwzOCwyLDgsNDMsOCwzMyw3LDMwLDgsMTcsMjIsMiwxNSwxNCwxMiwzNCwyLDEyLDYsMzcsMjksNzQsMywKKyAgMTY1LDE2LDExLDE3LDUsMTQsMywxMCw3LDM3LDExLDI0LDcsMSwzLDEyLDM3LDgsOSwzNCwxNywxMiw4LDIxLDEzLDM3LDEsNCwKKyAgMzAsMTQsNzgsNCwxNSwyLDQwLDM3LDE3LDEyLDM2LDgyLDE0LDQsMSw0LDcsMTcsMTEsMTYsODgsNzcsMiwzLDE1LDMsMzQsMTEsCisgIDUsNzksMjIsMzQsOCw0LDQsNDAsMjIsMjQsMjgsOSwxMywzLDM0LDI3LDksMTYsMzksMTYsMzksMTMsMiw0LDMsNDEsMjYsMTAsNCwKKyAgMzMsNCw3LDEyLDUsNiwzLDEwLDMwLDgsMjEsMTYsNTgsMTksOSwwLDQ3LDcsMTMsMTEsMTksMTUsNyw1Myw1NywyLDEzLDI4LDIyLAorICAzLDE2LDksMjUsMzMsMTIsNDAsNywxMiw2NCw3LDE0LDI0LDQ0LDksMiwxNCwxMSwyLDU4LDEsMjYsMzAsMTEsOSw1LDI0LDcsOSwKKyAgOTQsMiwxMCwyMSw1LDUsNCw1LDYsMTc5LDksMTgsMiw3LDEzLDMxLDQxLDE3LDQsMzYsMywyMSw2LDI2LDgsMTUsMTgsNDQsMjcsCisgIDExLDksMjUsNywwLDE0LDIsMTIsMjAsMjMsMTMsMiwxNjMsOSw1LDE1LDY1LDIsMTQsNiw4LDk4LDExLDE1LDE0LDM0LDIsMywxMCwKKyAgMjIsOSw5Miw3LDEwLDMyLDY3LDEzLDMsNCwzNSw4LDIsMSw1LDAsMjYsMzgxLDcsMjcsOCwyLDE2LDkzLDQsMTksNSw4LDI1LDksCisgIDMxLDE0LDQsMjEsNSwzLDksMjIsNTYsNCwxOCwzLDExLDE4LDYsNCwzLDQwLDEyLDE2LDExMCw4LDM1LDE0LDEsMTgsNDAsOSwxMiwKKyAgMTQsMywxMSw3LDU3LDEzLDE4LDExNiw1MywxOSwyMiw3LDE2LDExLDUsOCwyMSwxNiwxLDc1LDIxLDIwLDEsMjgsMiw2LDEsNywKKyAgMTksMzgsNSw2LDksOSw0LDEsNyw1NSwzNiw2Miw1LDQsNCwyNCwxNSwxLDEyLDM1LDQ4LDIwLDUsMTcsMSw1LDI2LDE1LDQsNTQsCisgIDEzLDUsNSwxNSw1LDE5LDMyLDI5LDMxLDcsNiw0MCw3LDgwLDExLDE4LDgsMTI4LDQ4LDYsMTIsODQsMTMsNCw3LDIsMTMsOSwxNiwKKyAgMTcsMywyNTQsMSw0LDE4MSw4LDQ0LDcsNiwyNCwyNyw5LDIzLDE0LDM0LDE2LDIyLDI1LDEwLDMsMyw0LDQsMTIsMiwxMiw2LDcsCisgIDEzLDU4LDEzLDYsMTEsMTksNTMsMTEsNjYsMTgsMTksMTAsNCwxMywyLDUsNDksNTgsMSw2Nyw3LDIxLDY0LDE0LDExLDE0LDgsMywKKyAgMjYsMzMsOTEsMzEsMjAsNyw5LDQyLDM5LDQsMyw1NSwxMSwxMCwwLDcsNCw3NSw4LDEyLDAsMjcsMyw4LDksMCwxMiwxMiwyMywKKyAgMjgsMjMsMjAsNCwxMywzMCwyLDIyLDIwLDE5LDMwLDYsMjIsMiw2LDQsMjQsNywxOSw1NSw4Niw1LDMzLDIsMTYxLDYsNywxLDYyLAorICAxMywzLDcyLDEyLDEyLDksNywxMiwxMCw1LDEwLDI5LDEsNSwyMiwxMywxMyw1LDIsMTIsMyw3LDE0LDE4LDIsMyw0NiwyMSwxNywKKyAgMTUsMTksMywyNyw1LDE2LDQ1LDMxLDEwLDgsMTcsMTgsMTgsMyw3LDI0LDYsNTUsOSwzLDYsMTIsMTAsMTIsOCw5MSw5LDQsNCw0LAorICAyNywyOSwxNiw1LDcsMjIsNDMsMjgsMTEsMTQsOCwxMSwyOCwxMDksNTUsNzEsNDAsMyw4LDIyLDI2LDE1LDQ0LDMsMjUsMjksNSwKKyAgMywzMiwxNywxMiwzLDI5LDI3LDI1LDE1LDExLDgsNDAsMzksMzgsMTcsMyw5LDExLDIsMzIsMTEsNiwyMCw0OCw3NSwyNywzLDcsCisgIDU0LDEyLDk1LDEyLDcsMjQsMjMsMiwxMyw4LDE1LDE2LDUsMTIsNCwxNyw3LDE5LDg4LDIsNiwxMywxMTUsNDUsMTIsMjEsMiw4NiwKKyAgNzQsOSw3LDUsMTYsMzIsMTYsMiwyMSwxOCw2LDM0LDUsMTgsMjYwLDcsMTIsMTYsNDQsMTksOTIsMzEsNyw4LDIsOSwwLDAsMTUsCisgIDgsMzgsNCw4LDIwLDE4LDIsODMsMywzLDQsOSw1LDMsMTAsMyw1LDI5LDE1LDcsMTEsOCw0OCwxNywyMywyLDE3LDQsMTEsMjIsCisgIDIxLDY0LDgsOCw0LDE5LDk1LDAsMTcsMjgsOSwxMSwyMCw3MSw1LDExLDE4LDEyLDEzLDQ1LDQ5LDQsMSwzMywzMiwyMywxMyw1LAorICA1MiwyLDIsMTYsMyw0LDcsMTIsMiwxLDEyLDYsMjQsMSwyMiwxNTUsMjEsMyw0NSw0LDEyLDQ0LDI2LDUsNDAsMzYsOSw5LDgsMjAsCisgIDM1LDMxLDMsMiwzMiw1MCwxMCw4LDM3LDIsNzUsMzUsMjIsMTUsMTkyLDgsMTEsMjMsMSw0LDI5LDYsOCw4LDUsMTIsMTgsMzIsNCwKKyAgNywxMiwyLDAsMCw5LDUsNDgsMTEsMzUsMywxLDEyMyw2LDI5LDgsMTEsOCwyMyw1MSwxNiw2LDYzLDEyLDIsNSw0LDE0LDIsMTUsCisgIDcsMTQsMywyLDcsMTcsMzIsOCw4LDEwLDEsMjMsNjIsMiw0OSw2LDQ5LDQ3LDIzLDMsMjAsNywxMSwzOSwxMCwyNCw2LDE1LDUsNSwKKyAgMTEsOCwxNiwzNiw4LDEzLDIwLDMsMTAsNDQsNyw1Miw3LDEwLDM2LDYsMTUsMTAsNSwxMSw0LDE0LDE5LDE3LDEwLDEyLDMsNiwKKyAgMjMsNCwxMyw5NCw3MCw3LDM2LDcsMzgsNywyOCw4LDQsMTUsMywxOSw0LDMzLDM5LDIxLDEwOSw0LDgwLDYsNDAsNCw0MzIsNCw0LAorICA3LDgsMywzMSw4LDI4LDM3LDM0LDEwLDIsMjEsNSwyMiwwLDcsMzYsMTQsMTIsNiwyNCwxLDIxLDUsOSwyLDI5LDIwLDU0LDExMywKKyAgMTMsMzEsMzksMjcsNiwwLDI3LDQsNSwyLDQzLDcsOCw1Nyw4LDYyLDcsOSwxMiwyMiw5MCwzMCw2LDE5LDcsMTAsMjAsNiw1LDU4LAorICAzMiwzMCw0MSw0LDEwLDI1LDEzLDMsOCw3LDEwLDIsOSw2LDE1MSw0NCwxNiwxMiwxNiwyMCw4LDMsMTgsMTEsMTcsNCwxMCw0NSwKKyAgMTUsOCw1NiwzOCw1MiwyNSw0MCwxNCw0LDE3LDE1LDgsMiwxOSw3LDgsMjYsMzAsMiwzLDE4MCw4LDI2LDE3LDM4LDM1LDUsMTYsCisgIDI4LDUsMTUsNTYsMTMsMTQsMTgsOSwxNSw4MywyNywzLDksNCwxMSw4LDI3LDI3LDQ0LDEwLDEyLDgsMyw0OCwxNCw3LDksNCw0LAorICA4LDQsNSw5LDEyMiw4LDE0LDEyLDE5LDE3LDIxLDQsMjksNjMsMjEsMTcsMTAsMTIsMTgsNDcsMTAsMTAsNTMsNCwxOCwxNiw0LDgsCisgIDExOCw5LDUsMTIsOSwxMSw5LDMsMTIsMzIsMywyMywyLDE1LDMsMywzMCwzLDE3LDIzNSwxNSwyMiw5LDI5OSwxNCwxNywxLDUsCisgIDE2LDgsMyw3LDMsMTMsMiw3LDYsNCw4LDY2LDIsMTMsNiwxNSwxNiw0NywzLDM2LDUsNywxMCwyNCwxLDksOSw4LDEzLDE2LDI2LAorICAxMiw3LDI0LDIxLDE4LDQ5LDIzLDM5LDEwLDQxLDQsMTMsNCwyNywxMSwxMiwxMiwxOSw0LDE0Nyw4LDEwLDksNDAsMjEsMiw4MywKKyAgMTAsNSw2LDExLDI1LDksNTAsNTcsNDAsMTIsMTIsMjEsMSwzLDI0LDIzLDksMyw5LDEzLDIsMywxMiw1Nyw4LDExLDEzLDE1LDI2LAorICAxNSwxMCw0NywzNiw0LDI1LDEsNSw4LDUsNCwwLDEyLDQ5LDUsMTksNCw2LDE2LDE0LDYsMTAsNjksMTAsMzMsMjksNyw4LDYxLAorICAxMiw0LDAsMyw3LDYsMywxNiwyOSwyNywzOCw0LDIxLDAsMjQsMywyLDEsMTksMTYsMjIsMiw4LDEzOCwxMSw3LDcsMywxMiwyMiwKKyAgMywxNiw1LDcsMyw1Myw5LDEwLDMyLDE0LDUsNywzLDYsMjIsOSw1OSwyNiw4LDcsNTgsNSwxNiwxMSw1NSw3LDQsMTEsMTQ2LDkxLAorICA4LDEzLDE4LDE0LDYsOCw4LDMxLDI2LDIyLDYsMTEsMzAsMTEsMzAsMTUsMTgsMzEsMyw0OCwxNyw3LDYsNCw5LDIsMjUsMywzNSwKKyAgMTMsMTMsNyw4LDQsMzEsMTAsOCwxMCw0LDMsNDUsMTAsMjMsMiw3LDI1OSwxNywyMSwxMywxNCwzLDI2LDMsOCwyNyw0LDE4LDksCisgIDY2LDcsMTIsNSw4LDE3LDQsMjMsNTUsNDEsNTEsMiwzMiwyNiw2Niw0LDIxLDE0LDEyLDY1LDE2LDIyLDE3LDUsMTQsMiwyOSwyNCwKKyAgNywzLDM2LDIsNDMsNTMsODYsNSwyOCw0LDU4LDEzLDQ5LDEyMSw2LDIsNzMsMiwxLDQ3LDQsMiwyNywxMCwzNSwyOCwyNywxMCwKKyAgMTcsMTAsNTYsNywxMCwxNCwyOCwyMCwyNCw0MCw3LDQsNywzLDEwLDExLDMyLDYsNiwzLDE1LDExLDU0LDU3MywyLDMsNiwyLDMsCisgIDE0LDY0LDQsMTYsMTIsMTYsNDIsMTAsMjYsNCw2LDExLDY5LDE4LDI3LDIsMiwxNywyMiw5LDEzLDIyLDExLDYsMSwxNSw0OSwzLAorICAxNCwxCisgfSwKKworIHsKKyAgMTEsMTEsMTEsMTUsNDcsMSwzLDEsMjMsNSw4LDE4LDMsMjMsMTUsMjEsMSw3LDE5LDEwLDI2LDEsMTcsMTEsMzEsMjEsNDEsMTgsCisgIDM0LDQsOSw1OCwxOSwzLDMsMzYsNSwxOCwxMywzLDE0LDQsOSwxMCw0LDE5LDU2LDE1LDMsNSwzLDExLDI3LDksNCwxMCwxMyw0LAorICAxMSw2LDksMiwxOCwzLDEwLDE5LDExLDQsNTMsNCwyLDIsMyw0LDU4LDE2LDMsMCw1LDMwLDIsMTEsOTMsMTAsMiwxNCwxMCw2LDIsCisgIDExNSwyLDI1LDE2LDIyLDM4LDEwMSw0LDE4LDEzLDIsMTQ1LDUxLDQ1LDE1LDE0LDE1LDEzLDIwLDcsMjQsNSwxMywxNCwzMCw0MCwKKyAgMTAsNCwxMDcsMTIsMjQsMTQsMzksMTIsNiwxMywyMCw3LDcsMTEsNSwxOCwxOCw0NSwyMiw2LDM5LDMsMiwxLDUxLDksMTEsNCwKKyAgMTMsOSwzOCw0NCw4LDExLDksMTUsMTksOSwyMywxNywxNywxNywxMyw5LDksMSwxMCw0LDE4LDYsMiw5LDUsMjcsMzIsNzIsOCwKKyAgMzcsOSw0LDEwLDMwLDE3LDIwLDE1LDE3LDY2LDEwLDQsNzMsMzUsMzcsNiw0LDE2LDExNyw0NSwxMyw0LDc1LDUsMjQsNjUsMTAsCisgIDQsOSw0LDEzLDQ2LDUsMjYsMjksMTAsNCw0LDUyLDMsMTMsMTgsNjMsNiwxNCw5LDI0LDI3Nyw5LDg4LDIsNDgsMjcsMTIzLDE0LAorICA2MSw3LDUsMTAsOCw3LDkwLDMsMTAsMywzLDQ4LDE3LDEzLDEwLDE4LDMzLDIsMTksMzYsNiwyMSwxLDE2LDEyLDUsNiwyLDE2LAorICAxNSwyOSw4OCwyOCwyLDE1LDYsMTEsNCw2LDExLDMsMyw0LDE4LDksNTMsNSw0LDMsMzMsOCw5LDgsNiw3LDM2LDksNjIsMTQsMiwKKyAgMSwxMCwxLDE2LDcsMzIsNywyMywyMCwxMSwxMCwyMywyLDEsMCw5LDE2LDQwLDIsODEsNSwyMiw4LDUsNCwzNyw1MSwzNywxMCwKKyAgMTksNTcsMTEsMiw5MiwzMSw2LDM5LDEwLDEzLDE2LDgsMjAsNiw5LDMsMTAsMTgsMjUsMjMsMTIsMzAsNiwyLDI2LDcsNjQsMTgsCisgIDYsMzAsMTIsMTMsMjcsNywxMCw1LDMsMzMsMjQsOTksNCwyMyw0LDEsMjcsNywyNyw0OSw4LDIwLDE2LDMsNCwxMyw5LDIyLDY3LAorICAyOCwzLDEwLDE2LDMsMiwxMCw0LDgsMSw4LDE5LDMsODUsNiwyMSwxLDksMTYsMiwzMCwxMCwzMywxMiw0LDksMywxLDYwLDM4LDYsCisgIDI0LDMyLDMsMTQsMyw0MCw4LDM0LDExNSw1LDksMjcsNSw5NiwzLDQwLDYsMTUsNSw4LDIyLDExMiw1LDUsMjUsMTcsNTgsMiw3LAorICAzNiwyMSw1MiwxLDMsOTUsMTIsMjEsNCwxMSw4LDU5LDI0LDUsMjEsNCw5LDE1LDgsNywyMSwzLDI2LDUsMTEsNiw3LDE3LDY1LAorICAxNCwxMSwxMCwyLDE3LDUsMTIsMjIsNCw0LDIsMjEsOCwxMTIsMywzNCw2MywzNSwyLDI1LDEsMiwxNSw2NSwyMywwLDMsNSwxNSwKKyAgMjYsMjcsOSw1LDQ4LDExLDE1LDQsOSw1LDMzLDIwLDE1LDEsMTgsMTksMTEsMjQsNDAsMTAsMjEsNzQsNiw2LDMyLDMwLDQwLDUsCisgIDQsNyw0NCwxMCwyNSw0NiwxNiwxMiw1LDQwLDcsMTgsNSwxOCw5LDEyLDgsNCwyNSw1LDYsMzYsNCw0Myw4LDksMTIsMzUsMTcsNCwKKyAgOCw5LDExLDI3LDUsMTAsMTcsNDAsOCwxMiw0LDE4LDksMTgsMTIsMjAsMjUsMzksNDIsMSwyNCwxMywyMiwxNSw3LDExMiwzNSwzLAorICA3LDE3LDMzLDIsNSw1LDE5LDgsNCwxMiwyNCwxNCwxMywyLDEsMTMsNiw1LDE5LDExLDcsNTcsMCwxOSw2LDExNyw0OCwxNCw4LAorICAxMCw1MSwxNywxMiwxNCwyLDUsOCw5LDE1LDQsNDgsNTMsMTMsMjIsNCwyNSwxMiwxMSwxOSw0NSw1LDIsNiw1NCwyMiw5LDE1LDksCisgIDEzLDIsNywxMSwyOSw4MiwxNiw0Niw0LDI2LDE0LDI2LDQwLDIyLDQsMjYsNiwxOCwxMyw0LDQsMjAsMywzLDcsMTIsMTcsOCw5LAorICAyMyw2LDIwLDcsMjUsMjMsMTksNSwxNSw2LDIzLDE1LDExLDE5LDExLDMsMTcsNTksOCwxOCw0MSw0LDU0LDIzLDQ0LDc1LDEzLAorICAyMCw2LDExLDIsMywxLDEzLDEwLDMsNywxMiwzLDQsNyw4LDMwLDYsNiw3LDMsMzIsOSw1LDI4LDYsMTE0LDQyLDEzLDM2LDI3LAorICA1OSw2LDkzLDEzLDc0LDgsNjksMTQwLDMsMSwxNyw0OCwxMDUsNiwxMSw1LDE1LDEsMTAsMTAsMTQsOCw1MywwLDgsMjQsNjAsMiwKKyAgNiwzNSwyLDEyLDMyLDQ3LDE2LDE3LDc1LDIsNSw0LDM3LDI4LDEwLDUsOSw1Nyw0LDU5LDUsMTIsMTMsNyw5MCw1LDExLDUsMjQsCisgIDIyLDEzLDMwLDEsMiwxMCw5LDYsMTksMywxOCw0NywyLDUsNyw5LDM1LDE1LDMsNiwxLDIxLDE0LDE0LDE4LDE0LDksMTIsOCw3MywKKyAgNiwxOSwzLDMyLDksMTQsMTcsMTcsNSw1NSwyMyw2LDE2LDI4LDMsMTEsNDgsNCw2LDYsNiwxMiwxNiwzMCwxMCwzMCwyNyw1MSwKKyAgMTgsMjksMiwzLDE1LDEsNzYsMCwxNiwzMyw0LDI3LDMsNjIsNCwxMCwyLDQsOCwxNSw5LDQxLDI2LDIyLDIsNCwyMCw0LDQ5LDAsCisgIDgsMSw1NywxMywxMiwzOSwzLDYzLDEwLDE5LDM0LDM1LDIsNyw4LDI5LDcyLDQsMTAsMCw3Nyw4LDYsNyw5LDE1LDIxLDksNCwxLAorICAyMCwyMywxLDksMTgsOSwxNSwzNiw0LDcsNiwxNSw1LDcsNyw0MCwyLDksMjIsMiwzLDIwLDQsMTIsMzQsMTMsNiwxOCwxNSwxLAorICAzOCwyMCwxMiw3LDE2LDMsMTksODUsMTIsMTYsMTgsMTYsMiwxNywxLDEzLDgsNiwxMiwxNSw5NywxNywxMiw5LDMsMjEsMTUsMTIsCisgIDIzLDQ0LDgxLDI2LDMwLDIsNSwxNyw2LDYsMCwyMiw0MiwxOSw2LDE5LDQxLDE0LDM2LDcsMyw1Niw3LDksMywyLDYsOSw2OSwzLAorICAxNSw0LDMwLDI4LDI5LDcsOSwxNSwxNywxNyw2LDEsNiwxNTMsOSwzMyw1LDEyLDE0LDE2LDI4LDMsOCw3LDE0LDEyLDQsNiwzNiwKKyAgOSwyNCwxMywxMyw0LDIsOSwxNSwxOSw5LDUzLDcsMTMsNCwxNTAsMTcsOSwyLDYsMTIsNywzLDUsNTgsMTksNTgsMjgsOCwxNCwzLAorICAyMCwzLDAsMzIsNTYsNyw1LDQsMjcsMSw2OCw0LDI5LDEzLDUsNTgsMiw5LDY1LDQxLDI3LDE2LDE1LDEyLDE0LDIsMTAsOSwyNCwKKyAgMywyLDksMiwyLDMsMTQsMzIsMTAsMjIsMywxMywxMSw0LDYsMzksMTcsMCwxMCw1LDUsMTAsMzUsMTYsMTksMTQsMSw4LDYzLDE5LAorICAxNCw4LDU2LDEwLDIsMTIsNiwxMiw2LDcsMTYsMiw5LDksMTIsMjAsNzMsMjUsMTMsMjEsMTcsMjQsNSwzMiw4LDEyLDI1LDgsMTQsCisgIDE2LDUsMjMsMyw3LDYsMywxMSwyNCw2LDMwLDQsMjEsMTMsMjgsNCw2LDI5LDE1LDUsMTcsNiwyNiw4LDE1LDgsMyw3LDcsNTAsCisgIDExLDMwLDYsMiwyOCw1NiwxNiwyNCwyNSwyMywyNCw4OSwzMSwzMSwxMiw3LDIyLDQsMTAsMTcsMywzLDgsMTEsMTMsNSwzLDI3LAorICAxLDEyLDEsMTQsOCwxMCwyOSwyLDUsMiwyLDIwLDEwLDAsMzEsMTAsMjEsMSw0OCwzLDUsNDMsNCw1LDE4LDEzLDUsMTgsMjUsMzQsCisgIDE4LDMsNSwyMiwxNiwzLDQsMjAsMyw5LDMsMjUsNiw2LDQ0LDIxLDMsMTIsNyw1LDQyLDMsMiwxNCw0LDM2LDUsMyw0NSw1MSwxNSwKKyAgOSwxMSwyOCw5LDcsNiw2LDEyLDI2LDUsMTQsMTAsMTEsNDIsNTUsMTMsMjEsNCwyOCw2LDcsMjMsMjcsMTEsMSw0MSwzNiwwLDMyLAorICAxNSwyNiwyLDMsMjMsMzIsMTEsMiwxNSw3LDI5LDI2LDE0NCwzMywyMCwxMiw3LDIxLDEwLDcsMTEsNjUsNDYsMTAsMTMsMjAsMzIsCisgIDQsNCw1LDE5LDIsMTksMTUsNDksNDEsMSw3NSwxMCwxMSwyNSwxLDIsNDUsMTEsOCwyNywxOCwxMCw2MCwyOCwyOSwxMiwzMCwxOSwKKyAgMTYsNCwyNCwxMSwxOSwyNywxNyw0OSwxOCw3LDQwLDEzLDE5LDIyLDgsNTUsMTIsMTEsMyw2LDUsMTEsOCwxMCwyMiw1LDksOSwKKyAgMjUsNywxNyw3LDY0LDEsMjQsMiwxMiwxNyw0NCw0LDEyLDI3LDIxLDExLDEwLDcsNDcsNSw5LDEzLDEyLDM4LDI3LDIxLDcsMjksCisgIDcsMSwxNywzLDMsNSw0OCw2MiwxMCwzLDExLDE3LDE1LDE1LDYsMyw4LDEwLDgsMTgsMTksMTMsMyw5LDcsNiw0NCw5LDEwLDQsCisgIDQzLDgsNiw2LDE0LDIwLDM4LDI0LDIsNCw1LDUsNyw1LDksMzksOCw0NCw0MCw5LDE5LDcsMywxNSwyNSwyLDM3LDE4LDE1LDksNSwKKyAgOCwzMiwxMCw1LDE4LDQsNyw0NiwyMCwxNywyMyw0LDExLDE2LDE4LDMxLDExLDMsMTEsMSwxNCwxLDI1LDQsMjcsMTMsMTMsMzksCisgIDE0LDYsNiwzNSw2LDE2LDEzLDExLDEyMiwyMSwxNSwyMCwyNCwxMCw1LDE1MiwxNSwzOSw1LDIwLDE2LDksMTQsNyw1Myw2LDMsOCwKKyAgMTksNjMsMzIsNiwyLDMsMjAsMSwxOSw1LDEzLDQyLDE1LDQsNiw2OCwzMSw0NiwxMSwzOCwxMCwyNCw1LDUsOCw5LDEyLDMsMzUsCisgIDQ2LDI2LDE2LDIsOCw0LDc0LDE2LDQ0LDQsNSwxLDE2LDQsMTQsMjMsMTYsNjksMTUsNDIsMzEsMTQsNyw3LDYsOTcsMTQsNDAsMSwKKyAgOCw3LDM0LDksMzksMTksMTMsMTUsMTAsMjEsMTgsMTAsNSwxNSwzOCw3LDUsMTIsNywyMCwxNSw0LDExLDYsMTQsNSwxNyw3LDM5LAorICAzNSwzNiwxOCwyMCwyNiwyMiw0LDIsMzYsMjEsNjQsMCw1LDksMTAsNiw0LDEsNywzLDEsMywzLDQsMTAsMjAsOTAsMiwyMiw0OCwKKyAgMTYsMjMsMiwzMyw0MCwxLDIxLDIxLDE3LDIwLDgsOCwxMiw0LDgzLDE0LDQ4LDQsMjEsMyw5LDI3LDUsMTEsNDAsMTUsOSwzLDE2LAorICAxNyw5LDExLDQsMjQsMzEsMTcsMyw0LDIsMTEsMSw4LDQsOCw2LDQxLDE3LDQsMTMsMyw3LDE3LDgsMjcsNSwxMyw2LDEwLDcsMTMsCisgIDEyLDE4LDEzLDYwLDE4LDMsOCwxLDEyLDEyNSwyLDcsMTYsMiwxMSwyLDQsNywyNiw1LDksMTQsMTQsMTYsOCwxNCw3LDE0LDYsOSwKKyAgMTMsOSw2LDQsMjYsMzUsNDksMzYsNTUsMyw5LDYsNDAsMjYsMjMsMzEsMTksNDEsMiwxMCwzMSw2LDU0LDUsNjksMTYsNyw4LDE2LAorICAxLDUsNyw0LDIyLDcsNyw1LDQsNDgsMTEsMTMsMyw5OCw0LDExLDE5LDQsMiwxNCw3LDM0LDcsMTAsMywyLDEyLDcsNiwyLDUsMTE4CisgfSwKK307CisKK3VpbnQ4X3QgZGF0YVsxPDwxNV07CitzdHJpbmcgZGF0YV9zdHI7Cit2b2lkIGluaXRfZGF0YSgpIHsKKyAgc3RhdGljIGJvb2wgaW5pdHRlZCA9IGZhbHNlOworICBpZiAoaW5pdHRlZCkgcmV0dXJuOworICBpbml0dGVkID0gdHJ1ZTsKKworICAvLyBSZXBlYXRhYmlsaXR5LiAgS2luZCBvZi4KKyAgc3RkOjpzcmFuZCg0Mik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKHNpemVvZihkYXRhKS9zaXplb2YoZGF0YVswXSkpOyArK2kpIHsKKyAgICBkYXRhW2ldID0gKHVpbnQ4X3QpcmFuZCgpOworICB9CisKKyAgZGF0YV9zdHIuYXNzaWduKChjaGFyKilkYXRhLCBzaXplb2YoZGF0YSkpOworfQorCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURSggVEJ1ZmZlckJhc2VUZXN0ICkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfTWVtb3J5QnVmZmVyX1dyaXRlX0dldEJ1ZmZlciApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKKyAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7CisgICAgaW50IG9mZnNldCA9IDA7CisgICAgaW50IGluZGV4ID0gMDsKKworICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgeworICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7CisgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgaW5kZXgrKzsKKyAgICB9CisKKyAgICBzdHJpbmcgb3V0cHV0ID0gYnVmZmVyLmdldEJ1ZmZlckFzU3RyaW5nKCk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YV9zdHIsIG91dHB1dCk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfTWVtb3J5QnVmZmVyX1dyaXRlX1JlYWQgKSB7CisgIGluaXRfZGF0YSgpOworCisgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7CisgICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8IDM7IGQyKyspIHsKKyAgICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKKyAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOworICAgICAgaW50IG9mZnNldDsKKyAgICAgIGludCBpbmRleDsKKworICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgIGluZGV4ID0gMDsKKyAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgeworICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKKyAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KKworICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgIGluZGV4ID0gMDsKKyAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgZ290ID0gYnVmZmVyLnJlYWQoJmRhdGFfb3V0W29mZnNldF0sIGRpc3RbZDJdW2luZGV4XSk7CisgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdvdCwgZGlzdFtkMl1baW5kZXhdKTsKKyAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDJdW2luZGV4XTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KKworICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7CisgICAgfQorICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9SZWFkU3RyaW5nICkgeworICBpbml0X2RhdGEoKTsKKworICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7CisgICAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7CisgICAgICBzdHJpbmcgb3V0cHV0OworICAgICAgaW50IG9mZnNldDsKKyAgICAgIGludCBpbmRleDsKKworICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgIGluZGV4ID0gMDsKKyAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgeworICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKKyAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KKworICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgIGluZGV4ID0gMDsKKyAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgZ290ID0gYnVmZmVyLnJlYWRBcHBlbmRUb1N0cmluZyhvdXRwdXQsIGRpc3RbZDJdW2luZGV4XSk7CisgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdvdCwgZGlzdFtkMl1baW5kZXhdKTsKKyAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDJdW2luZGV4XTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KKworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwob3V0cHV0LCBkYXRhX3N0cik7CisgICAgfQorICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9SZWFkX011bHRpMSApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgLy8gRG8gc2hvcnRlciB3cml0ZXMgYW5kIHJlYWRzIHNvIHdlIGRvbid0IGFsaWduIHRvIHBvd2VyLW9mLXR3byBib3VuZGFyaWVzLgorCisgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7CisgICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8IDM7IGQyKyspIHsKKyAgICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKKyAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOworICAgICAgaW50IG9mZnNldDsKKyAgICAgIGludCBpbmRleDsKKworICAgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCA2OyBpdGVyKyspIHsKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgaW5kZXggPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgKDE8PDE1KS00MikgeworICAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOworICAgICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07CisgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKKyAgICAgICAgICBidWZmZXIucmVhZCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMl1baW5kZXhdKTsKKyAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMl1baW5kZXhdOworICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCAoMTw8MTUpLTQyKSk7CisKKyAgICAgICAgLy8gUHVsbCBvdXQgdGhlIGV4dHJhIGRhdGEuCisgICAgICAgIGJ1ZmZlci5yZWFkKGRhdGFfb3V0LCA0Mik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9SZWFkX011bHRpMiApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgLy8gRG8gc2hvcnRlciB3cml0ZXMgYW5kIHJlYWRzIHNvIHdlIGRvbid0IGFsaWduIHRvIHBvd2VyLW9mLXR3byBib3VuZGFyaWVzLgorICAvLyBQdWxsIHRoZSBidWZmZXIgb3V0IG9mIHRoZSBsb29wIHNvIGl0cyBzdGF0ZSBnZXRzIHdvcmtlZCBoYXJkZXIuCisgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKKworICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7CisgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKKyAgICAgIGludCBvZmZzZXQ7CisgICAgICBpbnQgaW5kZXg7CisKKyAgICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgNjsgaXRlcisrKSB7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKKyAgICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKKyAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCAoMTw8MTUpLTQyKSB7CisgICAgICAgICAgYnVmZmVyLnJlYWQoJmRhdGFfb3V0W29mZnNldF0sIGRpc3RbZDJdW2luZGV4XSk7CisgICAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDJdW2luZGV4XTsKKyAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgKDE8PDE1KS00MikpOworCisgICAgICAgIC8vIFB1bGwgb3V0IHRoZSBleHRyYSBkYXRhLgorICAgICAgICBidWZmZXIucmVhZChkYXRhX291dCwgNDIpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9NZW1vcnlCdWZmZXJfV3JpdGVfUmVhZF9JbmNvbXBsZXRlICkgeworICBpbml0X2RhdGEoKTsKKworICAvLyBEbyBzaG9ydGVyIHdyaXRlcyBhbmQgcmVhZHMgc28gd2UgZG9uJ3QgYWxpZ24gdG8gcG93ZXItb2YtdHdvIGJvdW5kYXJpZXMuCisgIC8vIFB1bGwgdGhlIGJ1ZmZlciBvdXQgb2YgdGhlIGxvb3Agc28gaXRzIHN0YXRlIGdldHMgd29ya2VkIGhhcmRlci4KKworICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7CisgICAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7CisgICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDEzXTsKKworICAgICAgaW50IHdyaXRlX29mZnNldCA9IDA7CisgICAgICBpbnQgd3JpdGVfaW5kZXggPSAwOworICAgICAgdW5zaWduZWQgaW50IHRvX3dyaXRlID0gKDE8PDE0KS00MjsKKyAgICAgIHdoaWxlICh0b193cml0ZSA+IDApIHsKKyAgICAgICAgaW50IHdyaXRlX2FtdCA9IChzdGQ6Om1pbikoZGlzdFtkMV1bd3JpdGVfaW5kZXhdLCB0b193cml0ZSk7CisgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVt3cml0ZV9vZmZzZXRdLCB3cml0ZV9hbXQpOworICAgICAgICB3cml0ZV9vZmZzZXQgKz0gd3JpdGVfYW10OworICAgICAgICB3cml0ZV9pbmRleCsrOworICAgICAgICB0b193cml0ZSAtPSB3cml0ZV9hbXQ7CisgICAgICB9CisKKyAgICAgIGludCByZWFkX29mZnNldCA9IDA7CisgICAgICBpbnQgcmVhZF9pbmRleCA9IDA7CisgICAgICB1bnNpZ25lZCBpbnQgdG9fcmVhZCA9ICgxPDwxMyktNDI7CisgICAgICB3aGlsZSAodG9fcmVhZCA+IDApIHsKKyAgICAgICAgaW50IHJlYWRfYW10ID0gKHN0ZDo6bWluKShkaXN0W2QyXVtyZWFkX2luZGV4XSwgdG9fcmVhZCk7CisgICAgICAgIGludCBnb3QgPSBidWZmZXIucmVhZCgmZGF0YV9vdXRbcmVhZF9vZmZzZXRdLCByZWFkX2FtdCk7CisgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdvdCwgcmVhZF9hbXQpOworICAgICAgICByZWFkX29mZnNldCArPSByZWFkX2FtdDsKKyAgICAgICAgcmVhZF9pbmRleCsrOworICAgICAgICB0b19yZWFkIC09IHJlYWRfYW10OworICAgICAgfQorCisgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCAoMTw8MTMpLTQyKSk7CisKKyAgICAgIGludCBzZWNvbmRfb2Zmc2V0ID0gd3JpdGVfb2Zmc2V0OworICAgICAgaW50IHNlY29uZF9pbmRleCA9IHdyaXRlX2luZGV4LTE7CisgICAgICB1bnNpZ25lZCBpbnQgdG9fc2Vjb25kID0gKDE8PDE0KSs0MjsKKyAgICAgIHdoaWxlICh0b19zZWNvbmQgPiAwKSB7CisgICAgICAgIGludCBzZWNvbmRfYW10ID0gKHN0ZDo6bWluKShkaXN0W2QxXVtzZWNvbmRfaW5kZXhdLCB0b19zZWNvbmQpOworICAgICAgICAvL3ByaW50ZigiJWRcbiIsIHNlY29uZF9hbXQpOworICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbc2Vjb25kX29mZnNldF0sIHNlY29uZF9hbXQpOworICAgICAgICBzZWNvbmRfb2Zmc2V0ICs9IHNlY29uZF9hbXQ7CisgICAgICAgIHNlY29uZF9pbmRleCsrOworICAgICAgICB0b19zZWNvbmQgLT0gc2Vjb25kX2FtdDsKKyAgICAgIH0KKworICAgICAgc3RyaW5nIG91dHB1dCA9IGJ1ZmZlci5nZXRCdWZmZXJBc1N0cmluZygpOworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YV9zdHIuc3Vic3RyKCgxPDwxMyktNDIpLCBvdXRwdXQpOworICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9CdWZmZXJlZFRyYW5zcG9ydF9Xcml0ZSApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgaW50IHNpemVzW10gPSB7CisgICAgMTIsIDE1LCAxNiwgMTcsIDIwLAorICAgIDUwMSwgNTEyLCA1MjMsCisgICAgMjAwMCwgMjA0OCwgMjA5NiwKKyAgICAxPDwxNCwgMTw8MTcsCisgIH07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pOyBpKyspIHsKKyAgICBpbnQgc2l6ZSA9IHNpemVzW2ldOworICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7CisgICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOworICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7CisKKyAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgeworICAgICAgICB0cmFucy53cml0ZSgmZGF0YVtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOworICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgICBpbmRleCsrOworICAgICAgfQorICAgICAgdHJhbnMuZmx1c2goKTsKKworICAgICAgc3RyaW5nIG91dHB1dCA9IGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKTsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGRhdGFfc3RyLCBvdXRwdXQpOworICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9CdWZmZXJlZFRyYW5zcG9ydF9SZWFkX0Z1bGwgKSB7CisgIGluaXRfZGF0YSgpOworCisgIGludCBzaXplc1tdID0geworICAgIDEyLCAxNSwgMTYsIDE3LCAyMCwKKyAgICA1MDEsIDUxMiwgNTIzLAorICAgIDIwMDAsIDIwNDgsIDIwOTYsCisgICAgMTw8MTQsIDE8PDE3LAorICB9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKTsgaSsrKSB7CisgICAgaW50IHNpemUgPSBzaXplc1tpXTsKKyAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgc2l6ZW9mKGRhdGEpKSk7CisgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKKyAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOworCisgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgIGludCBpbmRleCA9IDA7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgICAgLy8gTm90ZTogdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCAicmVhZCIgYmVjYXVzZSBUQnVmZmVyZWRUcmFuc3BvcnQKKyAgICAgICAgLy8gZG9lc24ndCB0cnkgbG9vcCBvdmVyIHJlYWRzLCBzbyB3ZSBnZXQgc2hvcnQgcmVhZHMuICBXZSBkb24ndAorICAgICAgICAvLyBjaGVjayB0aGUgcmV0dXJuIHZhbHVlLCBzbyB0aGF0IG1lc3NlcyB1cyB1cC4KKyAgICAgICAgdHJhbnMucmVhZEFsbCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKKyAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KKworICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7CisgICAgfQorICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0J1ZmZlcmVkVHJhbnNwb3J0X1JlYWRfU2hvcnQgKSB7CisgIGluaXRfZGF0YSgpOworCisgIGludCBzaXplc1tdID0geworICAgIDEyLCAxNSwgMTYsIDE3LCAyMCwKKyAgICA1MDEsIDUxMiwgNTIzLAorICAgIDIwMDAsIDIwNDgsIDIwOTYsCisgICAgMTw8MTQsIDE8PDE3LAorICB9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKTsgaSsrKSB7CisgICAgaW50IHNpemUgPSBzaXplc1tpXTsKKyAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgc2l6ZW9mKGRhdGEpKSk7CisgICAgICBzaGFyZWRfcHRyPFRTaG9ydFJlYWRUcmFuc3BvcnQ+IHRzaG9ydChuZXcgVFNob3J0UmVhZFRyYW5zcG9ydChidWZmZXIsIDAuMTI1KSk7CisgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKKyAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOworCisgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgIGludCBpbmRleCA9IDA7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgICAgLy8gTm90ZTogdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCAicmVhZCIgYmVjYXVzZSBUQnVmZmVyZWRUcmFuc3BvcnQKKyAgICAgICAgLy8gZG9lc24ndCB0cnkgbG9vcCBvdmVyIHJlYWRzLCBzbyB3ZSBnZXQgc2hvcnQgcmVhZHMuICBXZSBkb24ndAorICAgICAgICAvLyBjaGVjayB0aGUgcmV0dXJuIHZhbHVlLCBzbyB0aGF0IG1lc3NlcyB1cyB1cC4KKyAgICAgICAgdHJhbnMucmVhZEFsbCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKKyAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KKworICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7CisgICAgfQorICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0ZyYW1lZFRyYW5zcG9ydF9Xcml0ZSApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgaW50IHNpemVzW10gPSB7CisgICAgMTIsIDE1LCAxNiwgMTcsIDIwLAorICAgIDUwMSwgNTEyLCA1MjMsCisgICAgMjAwMCwgMjA0OCwgMjA5NiwKKyAgICAxPDwxNCwgMTw8MTcsCisgIH07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pOyBpKyspIHsKKyAgICBpbnQgc2l6ZSA9IHNpemVzW2ldOworICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7CisgICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOworICAgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyhidWZmZXIsIHNpemUpOworCisgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgIGludCBpbmRleCA9IDA7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgICAgdHJhbnMud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKKyAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KKyAgICAgIHRyYW5zLmZsdXNoKCk7CisKKyAgICAgIGludDMyX3QgZnJhbWVfc2l6ZSA9IC0xOworICAgICAgYnVmZmVyLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZmcmFtZV9zaXplKSwgc2l6ZW9mKGZyYW1lX3NpemUpKTsKKyAgICAgIGZyYW1lX3NpemUgPSAoaW50MzJfdCludG9obCgodWludDMyX3QpZnJhbWVfc2l6ZSk7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChmcmFtZV9zaXplLCAxPDwxNSk7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChkYXRhX3N0ci5zaXplKCksICh1bnNpZ25lZCBpbnQpZnJhbWVfc2l6ZSk7CisgICAgICBzdHJpbmcgb3V0cHV0ID0gYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpOworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YV9zdHIsIG91dHB1dCk7CisgICAgfQorICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0ZyYW1lZFRyYW5zcG9ydF9SZWFkICkgeworICBpbml0X2RhdGEoKTsKKworICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOworICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICAgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyKTsKKyAgICBpbnQzMl90IGxlbmd0aCA9IHNpemVvZihkYXRhKTsKKyAgICBsZW5ndGggPSAoaW50MzJfdClodG9ubCgodWludDMyX3QpbGVuZ3RoKTsKKyAgICBidWZmZXItPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZsZW5ndGgpLCBzaXplb2YobGVuZ3RoKSk7CisgICAgYnVmZmVyLT53cml0ZShkYXRhLCBzaXplb2YoZGF0YSkpOworCisgICAgaW50IG9mZnNldCA9IDA7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIHdvcmsgd2l0aCByZWFkIGJlY2F1c2Ugd2UgaGF2ZSBvbmUgaHVnZSBmcmFtZS4KKyAgICAgIHRyYW5zLnJlYWQoJmRhdGFfb3V0W29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7CisgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOworICAgICAgaW5kZXgrKzsKKyAgICB9CisKKyAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCBzaXplb2YoZGF0YSkpKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9GcmFtZWRUcmFuc3BvcnRfV3JpdGVfUmVhZCApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgaW50IHNpemVzW10gPSB7CisgICAgMTIsIDE1LCAxNiwgMTcsIDIwLAorICAgIDUwMSwgNTEyLCA1MjMsCisgICAgMjAwMCwgMjA0OCwgMjA5NiwKKyAgICAxPDwxNCwgMTw8MTcsCisgIH07CisKKyAgaW50IHByb2JzW10gPSB7IDEsIDIsIDQsIDgsIDE2LCAzMiwgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiAoc2l6ZXMpIC8gc2l6ZW9mIChzaXplc1swXSk7IGkrKykgeworICAgIGludCBzaXplID0gc2l6ZXNbaV07CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2YgKHByb2JzKSAvIHNpemVvZiAocHJvYnNbMF0pOyBqKyspIHsKKyAgICAgIGludCBwcm9iID0gcHJvYnNbal07CisgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgeworICAgICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOworICAgICAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfb3V0KDE8PDE3LCAwKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBmbHVzaF9zaXplczsKKworICAgICAgICBpbnQgd3JpdGVfb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IHdyaXRlX2luZGV4ID0gMDsKKyAgICAgICAgaW50IGZsdXNoX3NpemUgPSAwOworICAgICAgICB3aGlsZSAod3JpdGVfb2Zmc2V0IDwgMTw8MTUpIHsKKyAgICAgICAgICB0cmFucy53cml0ZSgmZGF0YVt3cml0ZV9vZmZzZXRdLCBkaXN0W2QxXVt3cml0ZV9pbmRleF0pOworICAgICAgICAgIHdyaXRlX29mZnNldCArPSBkaXN0W2QxXVt3cml0ZV9pbmRleF07CisgICAgICAgICAgZmx1c2hfc2l6ZSArPSBkaXN0W2QxXVt3cml0ZV9pbmRleF07CisgICAgICAgICAgd3JpdGVfaW5kZXgrKzsKKyAgICAgICAgICBpZiAoZmx1c2hfc2l6ZSA+IDAgJiYgcmFuZCgpJXByb2IgPT0gMCkgeworICAgICAgICAgICAgZmx1c2hfc2l6ZXMucHVzaF9iYWNrKGZsdXNoX3NpemUpOworICAgICAgICAgICAgZmx1c2hfc2l6ZSA9IDA7CisgICAgICAgICAgICB0cmFucy5mbHVzaCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZmx1c2hfc2l6ZSAhPSAwKSB7CisgICAgICAgICAgZmx1c2hfc2l6ZXMucHVzaF9iYWNrKGZsdXNoX3NpemUpOworICAgICAgICAgIGZsdXNoX3NpemUgPSAwOworICAgICAgICAgIHRyYW5zLmZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmVhZF9vZmZzZXQgPSAwOworICAgICAgICBpbnQgcmVhZF9pbmRleCA9IDA7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgayA9IDA7IGsgPCBmbHVzaF9zaXplcy5zaXplKCk7IGsrKykgeworICAgICAgICAgIGludCBmc2l6ZSA9IGZsdXNoX3NpemVzW2tdOworICAgICAgICAgIC8vIFdlIGFyZSBleHBsb2l0aW5nIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiBURnJhbWVkVHJhbnNwb3J0LgorICAgICAgICAgIC8vIFRoZSByZWFkIGJ1ZmZlciBzdGFydHMgZW1wdHkgYW5kIGl0IHdpbGwgbmV2ZXIgZG8gbW9yZSB0aGFuIG9uZQorICAgICAgICAgIC8vIHJlYWRGcmFtZSBwZXIgcmVhZCwgc28gd2Ugc2hvdWxkIGFsd2F5cyBnZXQgZXhhY3RseSBvbmUgZnJhbWUuCisgICAgICAgICAgaW50IGdvdCA9IHRyYW5zLnJlYWQoJmRhdGFfb3V0W3JlYWRfb2Zmc2V0XSwgMTw8MTUpOworICAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdvdCwgZnNpemUpOworICAgICAgICAgIHJlYWRfb2Zmc2V0ICs9IGdvdDsKKyAgICAgICAgICByZWFkX2luZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICBCT09TVF9DSEVDS19FUVVBTCgodW5zaWduZWQgaW50KXJlYWRfb2Zmc2V0LCBzaXplb2YoZGF0YSkpOworICAgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsICZkYXRhX291dFswXSwgc2l6ZW9mKGRhdGEpKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0ZyYW1lZFRyYW5zcG9ydF9FbXB0eV9GbHVzaCApIHsKKyAgaW5pdF9kYXRhKCk7CisKKyAgc3RyaW5nIG91dHB1dDEoIlx4MDBceDAwXHgwMFx4MDEiImEiLCA1KTsKKyAgc3RyaW5nIG91dHB1dDIoIlx4MDBceDAwXHgwMFx4MDEiImFceDAwXHgwMFx4MDBceDAyIiJiYyIsIDExKTsKKworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyhidWZmZXIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKSwgIiIpOworICB0cmFucy5mbHVzaCgpOworICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksICIiKTsKKyAgdHJhbnMuZmx1c2goKTsKKyAgdHJhbnMuZmx1c2goKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCAiIik7CisgIHRyYW5zLndyaXRlKChjb25zdCB1aW50OF90KikiYSIsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksICIiKTsKKyAgdHJhbnMuZmx1c2goKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQxKTsKKyAgdHJhbnMuZmx1c2goKTsKKyAgdHJhbnMuZmx1c2goKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQxKTsKKyAgdHJhbnMud3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSJiYyIsIDIpOworICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksIG91dHB1dDEpOworICB0cmFucy5mbHVzaCgpOworICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksIG91dHB1dDIpOworICB0cmFucy5mbHVzaCgpOworICB0cmFucy5mbHVzaCgpOworICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksIG91dHB1dDIpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTAzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVEZEVHJhbnNwb3J0VGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworLy8gRGlzYWJsZWQgb24gTVNWQyBiZWNhdXNlIHRoZSBSVEwgYXNzZXJ0cyBvbiBhbiBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvcgorLy8gaW4gYm90aCBkZWJ1ZyBhbmQgcmVsZWFzZSBtb2RlOyBhdCBsZWFzdCBpbiBNU1ZDUjEwMCAoVmlzdWFsIFN0dWRpbyAyMDEwKQorI2lmICFkZWZpbmVkKFdJTjMyKQorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZEVHJhbnNwb3J0OworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3RmZHRyYW5zcG9ydF8xKSB7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfdGZkdHJhbnNwb3J0XzIpIHsKKyAgVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpOworICBCT09TVF9DSEVDS19USFJPVyh0LmNsb3NlKCksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworfQorCisjZWxzZQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3RmZHRyYW5zcG9ydF9kdW1teSkgeworICBCT09TVF9DSEVDSyh0cnVlKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzI2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcApAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRSAvLyBuZWVkZWQgZm9yIGdldG9wdF9sb25nCisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgorCisjaWZkZWYgX19NSU5HVzMyX18KKyAgI2luY2x1ZGUgPGlvLmg+CisgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAjaW5jbHVkZSA8ZmNudGwuaD4KKyAgI2luY2x1ZGUgPHN5c1xzdGF0Lmg+CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2xvYmFsIHN0YXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjb25zdCBjaGFyKiB0bXBfZGlyID0gIi90bXAiOworCitjbGFzcyBGc3luY0xvZzsKK0ZzeW5jTG9nKiBmc3luY19sb2c7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVscGVyIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBDbGFzcyB0byByZWNvcmQgY2FsbHMgdG8gZnN5bmMKKyAqLworY2xhc3MgRnN5bmNMb2cgeworcHVibGljOgorICBzdHJ1Y3QgRnN5bmNDYWxsIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lOworICAgIGludCBmZDsKKyAgfTsKKyAgdHlwZWRlZiBzdGQ6Omxpc3Q8RnN5bmNDYWxsPiBDYWxsTGlzdDsKKworICBGc3luY0xvZygpIHt9CisKKyAgdm9pZCBmc3luYyhpbnQgZmQpIHsKKyAgICAodm9pZClmZDsKKyAgICBGc3luY0NhbGwgY2FsbDsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZjYWxsLnRpbWUsIE5VTEwpOworICAgIGNhbGxzXy5wdXNoX2JhY2soY2FsbCk7CisgIH0KKworICBjb25zdCBDYWxsTGlzdCogZ2V0Q2FsbHMoKSBjb25zdCB7IHJldHVybiAmY2FsbHNfOyB9CisKK3ByaXZhdGU6CisgIENhbGxMaXN0IGNhbGxzXzsKK307CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGNsZWFuIHVwIHRlbXBvcmFyeSBmaWxlcworICovCitjbGFzcyBUZW1wRmlsZSB7CitwdWJsaWM6CisgIFRlbXBGaWxlKGNvbnN0IGNoYXIqIGRpcmVjdG9yeSwgY29uc3QgY2hhciogcHJlZml4KSB7CisgICNpZmRlZiBfX01JTkdXMzJfXworICAgICgodm9pZClkaXJlY3RvcnkpOworICAgIHNpemVfdCBwYXRoX2xlbiA9IHN0cmxlbihwcmVmaXgpICsgODsKKyAgICBwYXRoXyA9IG5ldyBjaGFyW3BhdGhfbGVuXTsKKyAgICBzbnByaW50ZihwYXRoXywgcGF0aF9sZW4sICIlc1hYWFhYWCIsIHByZWZpeCk7CisgICAgaWYgKF9ta3RlbXBfcyhwYXRoXyxwYXRoX2xlbikgPT0gMCkgeworICAgICAgZmRfID0gb3BlbihwYXRoXyxPX0NSRUFUIHwgT19SRFdSIHwgT19CSU5BUlksU19JUkVBRCB8IFNfSVdSSVRFKTsKKyAgICAgIGlmIChmZF8gPCAwKSB7CisgICAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJfbWt0ZW1wX3MoKSBmYWlsZWQiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIl9ta3RlbXBfcygpIGZhaWxlZCIpOworICAgIH0KKyAgI2Vsc2UKKyAgICBzaXplX3QgcGF0aF9sZW4gPSBzdHJsZW4oZGlyZWN0b3J5KSArIHN0cmxlbihwcmVmaXgpICsgODsKKyAgICBwYXRoXyA9IG5ldyBjaGFyW3BhdGhfbGVuXTsKKyAgICBzbnByaW50ZihwYXRoXywgcGF0aF9sZW4sICIlcy8lc1hYWFhYWCIsIGRpcmVjdG9yeSwgcHJlZml4KTsKKworICAgIGZkXyA9IG1rc3RlbXAocGF0aF8pOworICAgIGlmIChmZF8gPCAwKSB7CisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigibWtzdGVtcCgpIGZhaWxlZCIpOworICAgIH0KKyAgI2VuZGlmCisgIH0KKworICB+VGVtcEZpbGUoKSB7CisgICAgdW5saW5rKCk7CisgICAgY2xvc2UoKTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIGdldFBhdGgoKSBjb25zdCB7IHJldHVybiBwYXRoXzsgfQorCisgIGludCBnZXRGRCgpIGNvbnN0IHsgcmV0dXJuIGZkXzsgfQorCisgIHZvaWQgdW5saW5rKCkgeworICAgIGlmIChwYXRoXykgeworICAgICAgOjp1bmxpbmsocGF0aF8pOworICAgICAgZGVsZXRlW10gcGF0aF87CisgICAgICBwYXRoXyA9IE5VTEw7CisgICAgfQorICB9CisKKyAgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoZmRfIDwgMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIDo6Y2xvc2UoZmRfKTsKKyAgICBmZF8gPSAtMTsKKyAgfQorCitwcml2YXRlOgorICBjaGFyKiBwYXRoXzsKKyAgaW50IGZkXzsKK307CisKKy8vIFVzZSBvdXIgb3duIHZlcnNpb24gb2YgZnN5bmMoKSBmb3IgdGVzdGluZy4KKy8vIFRoaXMgcmV0dXJucyBpbW1lZGlhdGVseSwgc28gdGltaW5nIGluIHRlc3RfZGVzdHJ1Y3RvcigpIGlzbid0IGFmZmVjdGVkIGJ5CisvLyB3YWl0aW5nIG9uIHRoZSBhY3R1YWwgZmlsZXN5c3RlbS4KK2V4dGVybiAiQyIgaW50IGZzeW5jKGludCBmZCkgeworICBpZiAoZnN5bmNfbG9nKSB7CisgICAgZnN5bmNfbG9nLT5mc3luYyhmZCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCB0aW1lX2RpZmYoY29uc3Qgc3RydWN0IHRpbWV2YWwqIHQxLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCogdDIpIHsKKyAgcmV0dXJuICh0Mi0+dHZfdXNlYyAtIHQxLT50dl91c2VjKSArICh0Mi0+dHZfc2VjIC0gdDEtPnR2X3NlYykgKiAxMDAwMDAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3QgY2FzZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBNYWtlIHN1cmUgdGhlIFRGaWxlVHJhbnNwb3J0IGRlc3RydWN0b3IgZXhpdHMgInF1aWNrbHkiLgorICoKKyAqIFByZXZpb3VzIHZlcnNpb25zIGhhZCBhIGJ1ZyBjYXVzaW5nIHRoZSB3cml0ZXIgdGhyZWFkIG5vdCB0byBleGl0CisgKiByaWdodCBhd2F5LgorICoKKyAqIEl0J3Mga2luZCBvZiBsYW1lIHRoYXQgd2UganVzdCBjaGVjayB0byBzZWUgaG93IGxvbmcgdGhlIGRlc3RydWN0b3IgdGFrZXMgaW4KKyAqIHdhbGwtY2xvY2sgdGltZS4gIFRoaXMgY291bGQgcmVzdWx0IGluIGZhbHNlIGZhaWx1cmVzIG9uIHNsb3dlciBzeXN0ZW1zLCBvcgorICogb24gaGVhdmlseSBsb2FkZWQgbWFjaGluZXMuCisgKi8KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVzdHJ1Y3RvcikgeworICBUZW1wRmlsZSBmKHRtcF9kaXIsICJ0aHJpZnQuVEZpbGVUcmFuc3BvcnRUZXN0LiIpOworCisgIHVuc2lnbmVkIGludCBjb25zdCBOVU1fSVRFUkFUSU9OUyA9IDEwMDA7CisKKyAgdW5zaWduZWQgaW50IG51bV9vdmVyID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBOVU1fSVRFUkFUSU9OUzsgKytuKSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgZnRydW5jYXRlKGYuZ2V0RkQoKSwgMCkpOworCisgICAgVEZpbGVUcmFuc3BvcnQqIHRyYW5zcG9ydCA9IG5ldyBURmlsZVRyYW5zcG9ydChmLmdldFBhdGgoKSk7CisKKyAgICAvLyB3cml0ZSBzb21ldGhpbmcgc28gdGhhdCB0aGUgd3JpdGVyIHRocmVhZCBnZXRzIHN0YXJ0ZWQKKyAgICB0cmFuc3BvcnQtPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCJmb28iKSwgMyk7CisKKyAgICAvLyBFdmVyeSBvdGhlciBpdGVyYXRpb24sIGFsc28gY2FsbCBmbHVzaCgpLCBqdXN0IGluIGNhc2UgdGhhdCBwb3RlbnRpYWxseQorICAgIC8vIGhhcyBhbnkgZWZmZWN0IG9uIGhvdyB0aGUgd3JpdGVyIHRocmVhZCB3YWtlcyB1cC4KKyAgICBpZiAobiAmIDB4MSkgeworICAgICAgdHJhbnNwb3J0LT5mbHVzaCgpOworICAgIH0KKworICAgIC8qCisgICAgICogVGltZSB0aGUgY2FsbCB0byB0aGUgZGVzdHJ1Y3RvcgorICAgICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIGVuZDsKKworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnN0YXJ0LCBOVUxMKTsKKyAgICBkZWxldGUgdHJhbnNwb3J0OworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmVuZCwgTlVMTCk7CisKKyAgICBpbnQgZGVsdGEgPSB0aW1lX2RpZmYoJnN0YXJ0LCAmZW5kKTsKKworICAgIC8vIElmIGFueSBhdHRlbXB0IHRha2VzIG1vcmUgdGhhbiA1MDBtcywgdHJlYXQgdGhhdCBhcyBhIGZhaWx1cmUuCisgICAgLy8gVHJlYXQgdGhpcyBhcyBhIGZhdGFsIGZhaWx1cmUsIHNvIHdlJ2xsIHJldHVybiBub3cgaW5zdGVhZCBvZgorICAgIC8vIGxvb3Bpbmcgb3ZlciBhIHZlcnkgc2xvdyBvcGVyYXRpb24uCisgICAgQk9PU1RfV0FSTiggZGVsdGEgPCA1MDAwMDAgKTsKKworICAgIC8vIE5vcm1hbGx5LCBpdCB0YWtlcyBsZXNzIHRoYW4gMTAwbXMgb24gbXkgZGV2IGJveC4KKyAgICAvLyBIb3dldmVyLCBpZiB0aGUgYm94IGlzIGhlYXZpbHkgbG9hZGVkLCBzb21lIG9mIHRoZSB0ZXN0IHJ1bnMKKyAgICAvLyB0YWtlIGxvbmdlciwgc2luY2Ugd2UncmUganVzdCB3YWl0aW5nIGZvciBvdXIgdHVybiBvbiB0aGUgQ1BVLgorICAgIGlmIChkZWx0YSA+IDEwMDAwMCkgeworICAgICAgKytudW1fb3ZlcjsKKyAgICB9CisgIH0KKworICAvLyBNYWtlIHN1cmUgZmV3ZXIgdGhhbiAxMCUgb2YgdGhlIHJ1bnMgdG9vayBsb25nZXIgdGhhbiAxMDAwdXMKKyAgQk9PU1RfV0FSTihudW1fb3ZlciA8IChOVU1fSVRFUkFUSU9OUyAvIDEwKSk7Cit9CisKKy8qKgorICogTWFrZSBzdXJlIHNldEZsdXNoTWF4VXMoKSBpcyBob25vcmVkLgorICovCit2b2lkIHRlc3RfZmx1c2hfbWF4X3VzX2ltcGwodWludDMyX3QgZmx1c2hfdXMsIHVpbnQzMl90IHdyaXRlX3VzLCB1aW50MzJfdCB0ZXN0X3VzKSB7CisgIC8vIFRGaWxlVHJhbnNwb3J0IG9ubHkgY2FsbHMgZnN5bmMoKSBpZiBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4sCisgIC8vIHNvIG1ha2Ugc3VyZSB0aGUgd3JpdGUgaW50ZXJ2YWwgaXMgc21hbGxlciB0aGFuIHRoZSBmbHVzaCBpbnRlcnZhbC4KKyAgQk9PU1RfV0FSTih3cml0ZV91cyA8IGZsdXNoX3VzKTsKKworICBUZW1wRmlsZSBmKHRtcF9kaXIsICJ0aHJpZnQuVEZpbGVUcmFuc3BvcnRUZXN0LiIpOworCisgIC8vIFJlY29yZCBjYWxscyB0byBmc3luYygpCisgIEZzeW5jTG9nIGxvZzsKKyAgZnN5bmNfbG9nID0gJmxvZzsKKworICBURmlsZVRyYW5zcG9ydCogdHJhbnNwb3J0ID0gbmV3IFRGaWxlVHJhbnNwb3J0KGYuZ2V0UGF0aCgpKTsKKyAgLy8gRG9uJ3QgZmx1c2ggYmVjYXVzZSBvZiAjIG9mIGJ5dGVzIHdyaXR0ZW4KKyAgdHJhbnNwb3J0LT5zZXRGbHVzaE1heEJ5dGVzKDB4ZmZmZmZmZmYpOworICB1aW50OF90IGJ1ZltdID0gImEiOworICB1aW50MzJfdCBidWZsZW4gPSBzaXplb2YoYnVmKTsKKworICAvLyBTZXQgdGhlIGZsdXNoIGludGVydmFsCisgIHRyYW5zcG9ydC0+c2V0Rmx1c2hNYXhVcyhmbHVzaF91cyk7CisKKyAgLy8gTWFrZSBvbmUgY2FsbCB0byB3cml0ZSwgdG8gc3RhcnQgdGhlIHdyaXRlciB0aHJlYWQgbm93LgorICAvLyAoSWYgd2UganVzdCBsZXQgdGhlIHRocmVhZCBnZXQgY3JlYXRlZCBkdXJpbmcgb3VyIHRlc3QgbG9vcCwKKyAgLy8gdGhlIHRocmVhZCBjcmVhdGlvbiBzb21ldGltZXMgdGFrZXMgbG9uZyBlbm91Z2ggdG8gbWFrZSB0aGUgZmlyc3QKKyAgLy8gZnN5bmMgaW50ZXJ2YWwgZmFpbCB0aGUgY2hlY2suKQorICB0cmFuc3BvcnQtPndyaXRlKGJ1ZiwgYnVmbGVuKTsKKworICAvLyBBZGQgb25lIGVudHJ5IHRvIHRoZSBmc3luYyBsb2csIGp1c3QgdG8gbWFyayB0aGUgc3RhcnQgdGltZQorICBsb2cuZnN5bmMoLTEpOworCisgIC8vIExvb3AgZG9pbmcgd3JpdGUoKSwgc2xlZXAoKSwgLi4uCisgIHVpbnQzMl90IHRvdGFsX3RpbWUgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIHRyYW5zcG9ydC0+d3JpdGUoYnVmLCBidWZsZW4pOworICAgIGlmICh0b3RhbF90aW1lID4gdGVzdF91cykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHVzbGVlcCh3cml0ZV91cyk7CisgICAgdG90YWxfdGltZSArPSB3cml0ZV91czsKKyAgfQorCisgIGRlbGV0ZSB0cmFuc3BvcnQ7CisKKyAgLy8gU3RvcCBsb2dnaW5nIG5ldyBmc3luYygpIGNhbGxzCisgIGZzeW5jX2xvZyA9IE5VTEw7CisKKyAgLy8gRXhhbWluZSB0aGUgZnN5bmMoKSBsb2cKKyAgLy8KKyAgLy8gVEZpbGVUcmFuc3BvcnQgdXNlcyBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCksIHdoaWNoIG9ubHkgaGFzIG1pbGxpc2Vjb25kCisgIC8vIHJlc29sdXRpb24uICBJbiBteSB0ZXN0aW5nLCBpdCBub3JtYWxseSB3YWtlcyB1cCBhYm91dCAxIG1pbGxpc2Vjb25kIGxhdGUuCisgIC8vIEhvd2V2ZXIsIHNvbWV0aW1lcyBpdCB0YWtlcyBhIGJpdCBsb25nZXIuICBBbGxvdyA1bXMgbGVld2F5LgorICBpbnQgbWF4X2FsbG93ZWRfZGVsdGEgPSBmbHVzaF91cyArIDUwMDA7CisKKyAgY29uc3QgRnN5bmNMb2c6OkNhbGxMaXN0KiBjYWxscyA9IGxvZy5nZXRDYWxscygpOworICAvLyBXZSBhZGRlZCAxIGZzeW5jIGNhbGwgYWJvdmUuCisgIC8vIE1ha2Ugc3VyZSBURmlsZVRyYW5zcG9ydCBjYWxsZWQgZnN5bmMgYXQgbGVhc3Qgb25jZQorICBCT09TVF9XQVJOX0dFKGNhbGxzLT5zaXplKCksIHN0YXRpY19jYXN0PEZzeW5jTG9nOjpDYWxsTGlzdDo6c2l6ZV90eXBlPigxKSk7CisKKyAgY29uc3Qgc3RydWN0IHRpbWV2YWwqIHByZXZfdGltZSA9IE5VTEw7CisgIGZvciAoRnN5bmNMb2c6OkNhbGxMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNhbGxzLT5iZWdpbigpOyBpdCAhPSBjYWxscy0+ZW5kKCk7ICsraXQpIHsKKyAgICBpZiAocHJldl90aW1lKSB7CisgICAgICBpbnQgZGVsdGEgPSB0aW1lX2RpZmYocHJldl90aW1lLCAmaXQtPnRpbWUpOworICAgICAgQk9PU1RfV0FSTiggZGVsdGEgPCBtYXhfYWxsb3dlZF9kZWx0YSApOworICAgIH0KKyAgICBwcmV2X3RpbWUgPSAmaXQtPnRpbWU7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9mbHVzaF9tYXhfdXMxKSB7CisgIC8vIGZzeW5jIGV2ZXJ5IDEwbXMsIHdyaXRlIGV2ZXJ5IDVtcywgZm9yIDUwMG1zCisgIHRlc3RfZmx1c2hfbWF4X3VzX2ltcGwoMTAwMDAsIDUwMDAsIDUwMDAwMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZmx1c2hfbWF4X3VzMikgeworICAvLyBmc3luYyBldmVyeSA1MG1zLCB3cml0ZSBldmVyeSAyMG1zLCBmb3IgNTAwbXMKKyAgdGVzdF9mbHVzaF9tYXhfdXNfaW1wbCg1MDAwMCwgMjAwMDAsIDUwMDAwMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZmx1c2hfbWF4X3VzMykgeworICAvLyBmc3luYyBldmVyeSA0MDBtcywgd3JpdGUgZXZlcnkgMzAwbXMsIGZvciAxcworICB0ZXN0X2ZsdXNoX21heF91c19pbXBsKDQwMDAwMCwgMzAwMDAwLCAxMDAwMDAwKTsKK30KKworLyoqCisgKiBNYWtlIHN1cmUgZmx1c2goKSBpcyBmYXN0IHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4KKyAqCisgKiBURmlsZVRyYW5zcG9ydCB1c2VkIHRvIGhhdmUgYSBidWcgd2hlcmUgZmx1c2goKSB3b3VsZCB3YWl0IGZvciB0aGUgZnN5bmMKKyAqIHRpbWVvdXQgdG8gZXhwaXJlLgorICovCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X25vb3BfZmx1c2gpIHsKKyAgVGVtcEZpbGUgZih0bXBfZGlyLCAidGhyaWZ0LlRGaWxlVHJhbnNwb3J0VGVzdC4iKTsKKyAgVEZpbGVUcmFuc3BvcnQgdHJhbnNwb3J0KGYuZ2V0UGF0aCgpKTsKKworICAvLyBXcml0ZSBzb21ldGhpbmcgdG8gc3RhcnQgdGhlIHdyaXRlciB0aHJlYWQuCisgIHVpbnQ4X3QgYnVmW10gPSAiYSI7CisgIHRyYW5zcG9ydC53cml0ZShidWYsIDEpOworCisgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OworICBUSFJJRlRfR0VUVElNRU9GREFZKCZzdGFydCwgTlVMTCk7CisKKyAgZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCAxMDsgKytuKSB7CisgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmbm93LCBOVUxMKTsKKworICAgIC8vIEZhaWwgaWYgYXQgYW55IHBvaW50IHdlJ3ZlIGJlZW4gcnVubmluZyBmb3IgbG9uZ2VyIHRoYW4gaGFsZiBhIHNlY29uZC4KKyAgICAvLyAoV2l0aCB0aGUgYnVnZ3kgY29kZSwgVEZpbGVUcmFuc3BvcnQgdXNlZCB0byB0YWtlIDMgc2Vjb25kcyBwZXIgZmx1c2goKSkKKyAgICAvLworICAgIC8vIFVzZSBhIGZhdGFsIGZhaWwgc28gd2UgYnJlYWsgb3V0IGVhcmx5LCByYXRoZXIgdGhhbiBjb250aW51aW5nIHRvIG1ha2UKKyAgICAvLyBtYW55IG1vcmUgc2xvdyBmbHVzaCgpIGNhbGxzLgorICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZigmc3RhcnQsICZub3cpOworICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgMjAwMDAwMCApOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2VuZXJhbCBJbml0aWFsaXphdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHByaW50X3VzYWdlKEZJTEUqIGYsIGNvbnN0IGNoYXIqIGFyZ3YwKSB7CisgIGZwcmludGYoZiwgIlVzYWdlOiAlcyBbYm9vc3Rfb3B0aW9uc10gW29wdGlvbnNdXG4iLCBhcmd2MCk7CisgIGZwcmludGYoZiwgIk9wdGlvbnM6XG4iKTsKKyAgZnByaW50ZihmLCAiICAtLXRtcC1kaXI9RElSLCAtdCBESVJcbiIpOworICBmcHJpbnRmKGYsICIgIC0taGVscFxuIik7Cit9CisKK3ZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRzW10KKyAgICAgID0ge3siaGVscCIsIGZhbHNlLCBOVUxMLCAnaCd9LCB7InRtcC1kaXIiLCB0cnVlLCBOVUxMLCAndCd9LCB7TlVMTCwgMCwgTlVMTCwgMH19OworCisgIHdoaWxlICh0cnVlKSB7CisgICAgb3B0b3B0ID0gMTsKKyAgICBpbnQgb3B0Y2hhciA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJodDoiLCBsb25nX29wdHMsIE5VTEwpOworICAgIGlmIChvcHRjaGFyID09IC0xKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wdGNoYXIpIHsKKyAgICBjYXNlICd0JzoKKyAgICAgIHRtcF9kaXIgPSBvcHRhcmc7CisgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoKKyAgICAgIHByaW50X3VzYWdlKHN0ZG91dCwgYXJndlswXSk7CisgICAgICBleGl0KDApOworICAgIGNhc2UgJz8nOgorICAgICAgZXhpdCgxKTsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gT25seSBoYXBwZW5zIGlmIHNvbWVvbmUgYWRkcyBhbm90aGVyIG9wdGlvbiB0byB0aGUgb3B0YXJnIHN0cmluZywKKyAgICAgIC8vIGJ1dCBkb2Vzbid0IHVwZGF0ZSB0aGUgc3dpdGNoIHN0YXRlbWVudCB0byBoYW5kbGUgaXQuCisgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gb3B0aW9uIFwiLSVjXCJcbiIsIG9wdGNoYXIpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgIH0KK30KKworI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK3N0YXRpYyBpbnQgbXlBcmdjID0gMDsKK3N0YXRpYyBjaGFyICoqbXlBcmd2ID0gTlVMTDsKKworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJURmlsZVRyYW5zcG9ydFRlc3QiOworCisgIC8vIFBhcnNlIGFyZ3VtZW50cworICBwYXJzZV9hcmdzKG15QXJnYyxteUFyZ3YpOworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIG15QXJnYyA9IGFyZ2M7CisgIG15QXJndiA9IGFyZ3Y7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJURmlsZVRyYW5zcG9ydFRlc3QiOworCisgIC8vIFBhcnNlIGFyZ3VtZW50cworICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwNjg3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE1lbW9yeUJ1ZmZlclRlc3QpCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OmNvdXQ7Cit1c2luZyBzdGQ6OmVuZGw7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWFkX3dyaXRlX2dyb3cpIHsKKyAgLy8gQWRkZWQgdG8gdGVzdCB0aGUgZml4IGZvciBUSFJJRlQtMTI0OAorICBUTWVtb3J5QnVmZmVyIHV1dDsKKyAgY29uc3QgaW50IG1heFNpemUgPSA2NTUzNjsKKyAgdWludDhfdCB2ZXJpZnlbbWF4U2l6ZV07CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZjsKKyAgYnVmLnJlc2l6ZShtYXhTaXplKTsKKworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWF4U2l6ZTsgKytpKSB7CisgICAgYnVmW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oaSk7CisgIH0KKworICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgbWF4U2l6ZTsgaSAqPSAyKSB7CisgICAgdXV0LndyaXRlKCZidWZbMF0sIGkpOworICB9CisKKyAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IG1heFNpemU7IGkgKj0gMikgeworICAgIHV1dC5yZWFkKHZlcmlmeSwgaSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgOjptZW1jbXAodmVyaWZ5LCAmYnVmWzBdLCBpKSk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yb3VuZHRyaXApIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBzdHJCdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyKSk7CisKKyAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3QgYTsKKyAgYS5pMzJfdGhpbmcgPSAxMDsKKyAgYS5pNjRfdGhpbmcgPSAzMDsKKyAgYS5zdHJpbmdfdGhpbmcgPSAiaG9sbGEgYmFjayBhIjsKKworICBhLndyaXRlKGJpbmFyeVByb3Rjb2wuZ2V0KCkpOworICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkID0gc3RyQnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpOworCisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gc3RyQnVmZmVyMihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wyKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyMikpOworCisgIHN0ckJ1ZmZlcjItPnJlc2V0QnVmZmVyKCh1aW50OF90KilzZXJpYWxpemVkLmRhdGEoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcmlhbGl6ZWQubGVuZ3RoKCkpKTsKKyAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3QgYTI7CisgIGEyLnJlYWQoYmluYXJ5UHJvdGNvbDIuZ2V0KCkpOworCisgIEJPT1NUX0NIRUNLKGEgPT0gYTIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlYWRBcHBlbmRUb1N0cmluZykgeworICBzdHJpbmcqIHN0cjEgPSBuZXcgc3RyaW5nKCJhYmNkMTIzNCIpOworICBUTWVtb3J5QnVmZmVyIGJ1ZigodWludDhfdCopc3RyMS0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyMS0+bGVuZ3RoKCkpLAorICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyOjpDT1BZKTsKKworICBzdHJpbmcgc3RyMyA9ICJ3eHl6Iiwgc3RyNCA9ICI2Nzg5IjsKKyAgYnVmLnJlYWRBcHBlbmRUb1N0cmluZyhzdHIzLCA0KTsKKyAgYnVmLnJlYWRBcHBlbmRUb1N0cmluZyhzdHI0LCBJTlRfTUFYKTsKKworICBCT09TVF9DSEVDSyhzdHIzID09ICJ3eHl6YWJjZCIpOworICBCT09TVF9DSEVDSyhzdHI0ID09ICI2Nzg5MTIzNCIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2V4Y2VwdGlvbnMpIHsKKyAgY2hhciBkYXRhW10gPSAiZm9vXDBiYXIiOworCisgIFRNZW1vcnlCdWZmZXIgYnVmMSgodWludDhfdCopZGF0YSwgNywgVE1lbW9yeUJ1ZmZlcjo6T0JTRVJWRSk7CisgIHN0cmluZyBzdHIgPSBidWYxLmdldEJ1ZmZlckFzU3RyaW5nKCk7CisgIEJPT1NUX0NIRUNLKHN0ci5sZW5ndGgoKSA9PSA3KTsKKworICBidWYxLnJlc2V0QnVmZmVyKCk7CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmMS53cml0ZSgoY29uc3QgdWludDhfdCopImZvbyIsIDMpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKKworICBUTWVtb3J5QnVmZmVyIGJ1ZjIoKHVpbnQ4X3QqKWRhdGEsIDcsIFRNZW1vcnlCdWZmZXI6OkNPUFkpOworICBCT09TVF9DSEVDS19OT19USFJPVyhidWYyLndyaXRlKChjb25zdCB1aW50OF90KikiYmFyIiwgMykpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlZmF1bHRfbWF4aW11bV9idWZmZXJfc2l6ZSkKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCksIFRNZW1vcnlCdWZmZXIoKS5nZXRNYXhCdWZmZXJTaXplKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlZmF1bHRfYnVmZmVyX3NpemUpCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEwMjQsIFRNZW1vcnlCdWZmZXIoKS5nZXRCdWZmZXJTaXplKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Vycm9yX3NldF9tYXhfYnVmZmVyX3NpemVfdG9vX3NtYWxsKQoreworICBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmLnNldE1heEJ1ZmZlclNpemUoYnVmLmdldEJ1ZmZlclNpemUoKSAtIDEpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9tYXhpbXVtX2J1ZmZlcl9zaXplKQoreworICBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgYnVmLnNldE1heEJ1ZmZlclNpemUoODE5Mik7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNtYWxsX2J1ZmYoMSk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4MTkyOyArK2kpCisgIHsKKyAgICBidWYud3JpdGUoJnNtYWxsX2J1ZmZbMF0sIDEpOworICB9CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmLndyaXRlKCZzbWFsbF9idWZmWzBdLCAxKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfbWVtb3J5X2J1ZmZlcl90b19nZXRfc2l6ZW9mX29iamVjdHMpCit7CisgIC8vIFRoaXMgaXMgYSBkZW1vbnN0cmF0aW9uIG9mIGhvdyB0byB1c2UgVE1lbW9yeUJ1ZmZlciB0byBkZXRlcm1pbmUKKyAgLy8gdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhIHRocmlmdCBvYmplY3QgaW4gdGhlIEJpbmFyeSBwcm90b2NvbC4KKyAgLy8gU2VlIFRIUklGVC0zNDgwCisKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1CdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2wobWVtQnVmZmVyKSk7CisKKyAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3Qgb2JqZWN0OworICBvYmplY3QuaTMyX3RoaW5nID0gMTA7CisgIG9iamVjdC5pNjRfdGhpbmcgPSAzMDsKKyAgb2JqZWN0LnN0cmluZ190aGluZyA9ICJ3aG8ncyB5b3VyIGRhZGR5PyI7CisKKyAgdWludDMyX3Qgc2l6ZSA9IG9iamVjdC53cml0ZShiaW5hcnlQcm90Y29sLmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoNDcsIHNpemUpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzODBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIgorCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxldmVudC5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0RmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXQ7CisKK3N0cnVjdCBIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VJZiB7CisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IHN0cmluZ3NfLnB1c2hfYmFjayhzKTsgfQorICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7IF9yZXR1cm4gPSBzdHJpbmdzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187CisKKyAgLy8gZHVtbXkgb3ZlcnJpZGVzIG5vdCB1c2VkIGluIHRoaXMgdGVzdAorICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7IHJldHVybiAwOyB9CisgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIHsgcmV0dXJuIDA7IH0KKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYsIGNvbnN0IGludDMyX3QpIHt9CisgIHZvaWQgb25ld2F5V2FpdCgpIHt9CisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIHt9CisgIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmKSB7fQorfTsKKworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgga2V5RGlyOworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggY2VydEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQoreworICByZXR1cm4ga2V5RGlyIC8gZmlsZW5hbWU7Cit9CisKK3N0cnVjdCBHbG9iYWxGaXh0dXJlU1NMCit7CisgICAgR2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgICB7CisgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICAgIH0KKworI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworI2VuZGlmCisKKyAgICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIH0KK307CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKQorI2VuZGlmCisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKworICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoInNlcnZlci5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKKyAgcmV0dXJuIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisKKyAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICByZXR1cm4gcENsaWVudFNvY2tldEZhY3Rvcnk7Cit9CisKK2NsYXNzIEZpeHR1cmUgeworcHJpdmF0ZToKKyAgc3RydWN0IExpc3RlbkV2ZW50SGFuZGxlciA6IHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICBMaXN0ZW5FdmVudEhhbmRsZXIoTXV0ZXgqIG11dGV4KSA6IGxpc3Rlbk1vbml0b3JfKG11dGV4KSwgcmVhZHlfKGZhbHNlKSB7fQorCisgICAgICB2b2lkIHByZVNlcnZlKCkgLyogb3ZlcnJpZGUgKi8geworICAgICAgICBHdWFyZCBnKGxpc3Rlbk1vbml0b3JfLm11dGV4KCkpOworICAgICAgICByZWFkeV8gPSB0cnVlOworICAgICAgICBsaXN0ZW5Nb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgIH0KKworICAgICAgTW9uaXRvciBsaXN0ZW5Nb25pdG9yXzsKKyAgICAgIGJvb2wgcmVhZHlfOworICB9OworCisgIHN0cnVjdCBSdW5uZXIgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7CisgICAgaW50IHBvcnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuRXZlbnRIYW5kbGVyPiBsaXN0ZW5IYW5kbGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0PiBzb2NrZXQ7CisgICAgTXV0ZXggbXV0ZXhfOworCisgICAgUnVubmVyKCkgeworICAgICAgbGlzdGVuSGFuZGxlci5yZXNldChuZXcgTGlzdGVuRXZlbnRIYW5kbGVyKCZtdXRleF8pKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgeworICAgICAgLy8gV2hlbiBiaW5kaW5nIHRvIGV4cGxpY2l0IHBvcnQsIGFsbG93IHJldHJ5aW5nIHRvIHdvcmthcm91bmQgYmluZCBmYWlsdXJlcyBvbiBwb3J0cyBpbiB1c2UKKyAgICAgIGludCByZXRyeUNvdW50ID0gcG9ydCA/IDEwIDogMDsKKyAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOyAgCisgICAgICBzdGFydFNlcnZlcihyZXRyeUNvdW50KTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWR5QmFycmllcigpIHsKKyAgICAgIC8vIGJsb2NrIHVudGlsIHNlcnZlciBpcyBsaXN0ZW5pbmcgYW5kIHJlYWR5IHRvIGFjY2VwdCBjb25uZWN0aW9ucworICAgICAgR3VhcmQgZyhtdXRleF8pOworICAgICAgd2hpbGUgKCFsaXN0ZW5IYW5kbGVyLT5yZWFkeV8pIHsKKyAgICAgICAgbGlzdGVuSGFuZGxlci0+bGlzdGVuTW9uaXRvcl8ud2FpdCgpOworICAgICAgfQorICAgIH0KKyAgcHJpdmF0ZToKKyAgICB2b2lkIHN0YXJ0U2VydmVyKGludCByZXRyeV9jb3VudCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgc29ja2V0LnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChwb3J0LCBwU2VydmVyU29ja2V0RmFjdG9yeSkpOworICAgICAgICBzZXJ2ZXIucmVzZXQobmV3IHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0KSk7CisJICAgICAgc2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobGlzdGVuSGFuZGxlcik7CisgICAgICAgIHNlcnZlci0+c2V0TnVtSU9UaHJlYWRzKDEpOworICAgICAgICBpZiAodXNlckV2ZW50QmFzZSkgeworICAgICAgICAgIHNlcnZlci0+cmVnaXN0ZXJFdmVudHModXNlckV2ZW50QmFzZS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2VydmVyLT5zZXJ2ZSgpOworICAgICAgfSBjYXRjaCAoY29uc3QgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgICBpZiAocmV0cnlfY291bnQgPiAwKSB7CisgICAgICAgICAgKytwb3J0OworICAgICAgICAgIHN0YXJ0U2VydmVyKHJldHJ5X2NvdW50IC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgc3RydWN0IEV2ZW50RGVsZXRlciB7CisgICAgdm9pZCBvcGVyYXRvcigpKGV2ZW50X2Jhc2UqIHApIHsgZXZlbnRfYmFzZV9mcmVlKHApOyB9CisgIH07CisKK3Byb3RlY3RlZDoKKyAgRml4dHVyZSgpIDogcHJvY2Vzc29yKG5ldyB0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yKHN0ZDo6bWFrZV9zaGFyZWQ8SGFuZGxlcj4oKSkpIHt9CisKKyAgfkZpeHR1cmUoKSB7CisgICAgaWYgKHNlcnZlcikgeworICAgICAgc2VydmVyLT5zdG9wKCk7CisgICAgfQorICAgIGlmICh0aHJlYWQpIHsKKyAgICAgIHRocmVhZC0+am9pbigpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0RXZlbnRCYXNlKGV2ZW50X2Jhc2UqIHVzZXJfZXZlbnRfYmFzZSkgeworICAgIHVzZXJFdmVudEJhc2VfLnJlc2V0KHVzZXJfZXZlbnRfYmFzZSwgRXZlbnREZWxldGVyKCkpOworICB9CisKKyAgaW50IHN0YXJ0U2VydmVyKGludCBwb3J0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5lcj4gcnVubmVyKG5ldyBSdW5uZXIpOworICAgIHJ1bm5lci0+cG9ydCA9IHBvcnQ7CisgICAgcnVubmVyLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgcnVubmVyLT51c2VyRXZlbnRCYXNlID0gdXNlckV2ZW50QmFzZV87CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KAorICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgICAgICAgICBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpPVEhFUiwgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLAorICAgICAgICAgICAgMSwKKyNlbmRpZgorICAgICAgICAgICAgZmFsc2UpKTsKKyAgICB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQocnVubmVyKTsKKyAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgcnVubmVyLT5yZWFkeUJhcnJpZXIoKTsKKworICAgIHNlcnZlciA9IHJ1bm5lci0+c2VydmVyOworICAgIHJldHVybiBydW5uZXItPnBvcnQ7CisgIH0KKworICBib29sIGNhbkNvbW11bmljYXRlKGludCBzZXJ2ZXJQb3J0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc29ja2V0ID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCk7CisgICAgc29ja2V0LT5vcGVuKCk7CisgICAgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudCBjbGllbnQoc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCkpKTsKKyAgICBjbGllbnQuYWRkU3RyaW5nKCJmb28iKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKyAgICBjbGllbnQuZ2V0U3RyaW5ncyhzdHJpbmdzKTsKKyAgICByZXR1cm4gc3RyaW5ncy5zaXplKCkgPT0gMSAmJiAhKHN0cmluZ3NbMF0uY29tcGFyZSgiZm9vIikpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxldmVudF9iYXNlPiB1c2VyRXZlbnRCYXNlXzsKKyAgc3RkOjpzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3I+IHByb2Nlc3NvcjsKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyPiBzZXJ2ZXI7Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZDsKKworfTsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QpCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKGdldF9zcGVjaWZpZWRfcG9ydCwgRml4dHVyZSkgeworICBpbnQgc3BlY2lmaWVkX3BvcnQgPSBzdGFydFNlcnZlcigxMjM0NSk7CisgIEJPT1NUX1JFUVVJUkVfR0Uoc3BlY2lmaWVkX3BvcnQsIDEyMzQ1KTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzZXJ2ZXItPmdldExpc3RlblBvcnQoKSwgc3BlY2lmaWVkX3BvcnQpOworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzcGVjaWZpZWRfcG9ydCkpOworCisgIHNlcnZlci0+c3RvcCgpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfYXNzaWduZWRfcG9ydCwgRml4dHVyZSkgeworICBpbnQgc3BlY2lmaWVkX3BvcnQgPSBzdGFydFNlcnZlcigwKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzcGVjaWZpZWRfcG9ydCwgMCk7CisgIGludCBhc3NpZ25lZF9wb3J0ID0gc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCk7CisgIEJPT1NUX1JFUVVJUkVfTkUoYXNzaWduZWRfcG9ydCwgMCk7CisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKGFzc2lnbmVkX3BvcnQpKTsKKworICBzZXJ2ZXItPnN0b3AoKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UocHJvdmlkZV9ldmVudF9iYXNlLCBGaXh0dXJlKSB7CisgIGV2ZW50X2Jhc2UqIGViID0gZXZlbnRfYmFzZV9uZXcoKTsKKyAgc2V0RXZlbnRCYXNlKGViKTsKKyAgc3RhcnRTZXJ2ZXIoMCk7CisKKyAgLy8gYXNzZXJ0IHRoYXQgdGhlIHNlcnZlciB3b3JrcworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzZXJ2ZXItPmdldExpc3RlblBvcnQoKSkpOworI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID4gMHgwMjAxMDQwMAorICAvLyBhbHNvIGFzc2VydCB0aGF0IHRoZSBldmVudF9iYXNlIGlzIGFjdHVhbGx5IHVzZWQgd2hlbiBpdCdzIGVhc3kKKyAgQk9PU1RfQ0hFQ0tfR1QoZXZlbnRfYmFzZV9nZXRfbnVtX2V2ZW50cyhlYiwgRVZFTlRfQkFTRV9DT1VOVF9BRERFRCksIDApOworI2VuZGlmCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYmIyODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdC5jcHAKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oIgorI2luY2x1ZGUgInRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCIKKworI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgorCisjaW5jbHVkZSA8ZXZlbnQuaD4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK3N0cnVjdCBIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VJZiB7CisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IHN0cmluZ3NfLnB1c2hfYmFjayhzKTsgfQorICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7IF9yZXR1cm4gPSBzdHJpbmdzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187CisKKyAgLy8gZHVtbXkgb3ZlcnJpZGVzIG5vdCB1c2VkIGluIHRoaXMgdGVzdAorICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7IHJldHVybiAwOyB9CisgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIHsgcmV0dXJuIDA7IH0KKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYsIGNvbnN0IGludDMyX3QpIHt9CisgIHZvaWQgb25ld2F5V2FpdCgpIHt9CisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIHt9CisgIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmKSB7fQorfTsKKworY2xhc3MgRml4dHVyZSB7Citwcml2YXRlOgorICBzdHJ1Y3QgTGlzdGVuRXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgIExpc3RlbkV2ZW50SGFuZGxlcihNdXRleCogbXV0ZXgpIDogbGlzdGVuTW9uaXRvcl8obXV0ZXgpLCByZWFkeV8oZmFsc2UpIHt9CisKKyAgICAgIHZvaWQgcHJlU2VydmUoKSAvKiBvdmVycmlkZSAqLyB7CisgICAgICAgIEd1YXJkIGcobGlzdGVuTW9uaXRvcl8ubXV0ZXgoKSk7CisgICAgICAgIHJlYWR5XyA9IHRydWU7CisgICAgICAgIGxpc3Rlbk1vbml0b3JfLm5vdGlmeSgpOworICAgICAgfQorCisgICAgICBNb25pdG9yIGxpc3Rlbk1vbml0b3JfOworICAgICAgYm9vbCByZWFkeV87CisgIH07CisKKyAgc3RydWN0IFJ1bm5lciA6IHB1YmxpYyBSdW5uYWJsZSB7CisgICAgaW50IHBvcnQ7CisgICAgc2hhcmVkX3B0cjxldmVudF9iYXNlPiB1c2VyRXZlbnRCYXNlOworICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yOworICAgIHNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzaGFyZWRfcHRyPExpc3RlbkV2ZW50SGFuZGxlcj4gbGlzdGVuSGFuZGxlcjsKKyAgICBzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBzb2NrZXQ7CisgICAgTXV0ZXggbXV0ZXhfOworCisgICAgUnVubmVyKCkgeworICAgICAgbGlzdGVuSGFuZGxlci5yZXNldChuZXcgTGlzdGVuRXZlbnRIYW5kbGVyKCZtdXRleF8pKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgeworICAgICAgLy8gV2hlbiBiaW5kaW5nIHRvIGV4cGxpY2l0IHBvcnQsIGFsbG93IHJldHJ5aW5nIHRvIHdvcmthcm91bmQgYmluZCBmYWlsdXJlcyBvbiBwb3J0cyBpbiB1c2UKKyAgICAgIGludCByZXRyeUNvdW50ID0gcG9ydCA/IDEwIDogMDsKKyAgICAgIHN0YXJ0U2VydmVyKHJldHJ5Q291bnQpOworICAgIH0KKworICAgIHZvaWQgcmVhZHlCYXJyaWVyKCkgeworICAgICAgLy8gYmxvY2sgdW50aWwgc2VydmVyIGlzIGxpc3RlbmluZyBhbmQgcmVhZHkgdG8gYWNjZXB0IGNvbm5lY3Rpb25zCisgICAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgICB3aGlsZSAoIWxpc3RlbkhhbmRsZXItPnJlYWR5XykgeworICAgICAgICBsaXN0ZW5IYW5kbGVyLT5saXN0ZW5Nb25pdG9yXy53YWl0KCk7CisgICAgICB9CisgICAgfQorICBwcml2YXRlOgorICAgIHZvaWQgc3RhcnRTZXJ2ZXIoaW50IHJldHJ5X2NvdW50KSB7CisgICAgICB0cnkgeworICAgICAgICBzb2NrZXQucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgICAgc2VydmVyLnJlc2V0KG5ldyBzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHNvY2tldCkpOworICAgICAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihsaXN0ZW5IYW5kbGVyKTsKKyAgICAgICAgaWYgKHVzZXJFdmVudEJhc2UpIHsKKyAgICAgICAgICBzZXJ2ZXItPnJlZ2lzdGVyRXZlbnRzKHVzZXJFdmVudEJhc2UuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHNlcnZlci0+c2VydmUoKTsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgaWYgKHJldHJ5X2NvdW50ID4gMCkgeworICAgICAgICAgICsrcG9ydDsKKyAgICAgICAgICBzdGFydFNlcnZlcihyZXRyeV9jb3VudCAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworCisgIHN0cnVjdCBFdmVudERlbGV0ZXIgeworICAgIHZvaWQgb3BlcmF0b3IoKShldmVudF9iYXNlKiBwKSB7IGV2ZW50X2Jhc2VfZnJlZShwKTsgfQorICB9OworCitwcm90ZWN0ZWQ6CisgIEZpeHR1cmUoKSA6IHByb2Nlc3NvcihuZXcgdGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3NvcihtYWtlX3NoYXJlZDxIYW5kbGVyPigpKSkge30KKworICB+Rml4dHVyZSgpIHsKKyAgICBpZiAoc2VydmVyKSB7CisgICAgICBzZXJ2ZXItPnN0b3AoKTsKKyAgICB9CisgICAgaWYgKHRocmVhZCkgeworICAgICAgdGhyZWFkLT5qb2luKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRFdmVudEJhc2UoZXZlbnRfYmFzZSogdXNlcl9ldmVudF9iYXNlKSB7CisgICAgdXNlckV2ZW50QmFzZV8ucmVzZXQodXNlcl9ldmVudF9iYXNlLCBFdmVudERlbGV0ZXIoKSk7CisgIH0KKworICBpbnQgc3RhcnRTZXJ2ZXIoaW50IHBvcnQpIHsKKyAgICBzaGFyZWRfcHRyPFJ1bm5lcj4gcnVubmVyKG5ldyBSdW5uZXIpOworICAgIHJ1bm5lci0+cG9ydCA9IHBvcnQ7CisgICAgcnVubmVyLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgcnVubmVyLT51c2VyRXZlbnRCYXNlID0gdXNlckV2ZW50QmFzZV87CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoCisgICAgICAgIG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgICAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok9USEVSLCBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok5PUk1BTCwKKyAgICAgICAgICAgIDEsCisjZW5kaWYKKyAgICAgICAgICAgIGZhbHNlKSk7CisgICAgdGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHJ1bm5lcik7CisgICAgdGhyZWFkLT5zdGFydCgpOworICAgIHJ1bm5lci0+cmVhZHlCYXJyaWVyKCk7CisKKyAgICBzZXJ2ZXIgPSBydW5uZXItPnNlcnZlcjsKKyAgICByZXR1cm4gcnVubmVyLT5wb3J0OworICB9CisKKyAgYm9vbCBjYW5Db21tdW5pY2F0ZShpbnQgc2VydmVyUG9ydCkgeworICAgIHNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUU29ja2V0PiBzb2NrZXQobmV3IHRyYW5zcG9ydDo6VFNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCkpOworICAgIHNvY2tldC0+b3BlbigpOworICAgIHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KG1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgICBtYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCkpKTsKKyAgICBjbGllbnQuYWRkU3RyaW5nKCJmb28iKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKyAgICBjbGllbnQuZ2V0U3RyaW5ncyhzdHJpbmdzKTsKKyAgICByZXR1cm4gc3RyaW5ncy5zaXplKCkgPT0gMSAmJiAhKHN0cmluZ3NbMF0uY29tcGFyZSgiZm9vIikpOworICB9CisKK3ByaXZhdGU6CisgIHNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZV87CisgIHNoYXJlZF9wdHI8dGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3Nvcj4gcHJvY2Vzc29yOworcHJvdGVjdGVkOgorICBzaGFyZWRfcHRyPHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyPiBzZXJ2ZXI7Citwcml2YXRlOgorICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWQ7CisKK307CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0KQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfc3BlY2lmaWVkX3BvcnQsIEZpeHR1cmUpIHsKKyAgaW50IHNwZWNpZmllZF9wb3J0ID0gc3RhcnRTZXJ2ZXIoMTIzNDUpOworICBCT09TVF9SRVFVSVJFX0dFKHNwZWNpZmllZF9wb3J0LCAxMjM0NSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCksIHNwZWNpZmllZF9wb3J0KTsKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoc3BlY2lmaWVkX3BvcnQpKTsKKworICBzZXJ2ZXItPnN0b3AoKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoZ2V0X2Fzc2lnbmVkX3BvcnQsIEZpeHR1cmUpIHsKKyAgaW50IHNwZWNpZmllZF9wb3J0ID0gc3RhcnRTZXJ2ZXIoMCk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoc3BlY2lmaWVkX3BvcnQsIDApOworICBpbnQgYXNzaWduZWRfcG9ydCA9IHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpOworICBCT09TVF9SRVFVSVJFX05FKGFzc2lnbmVkX3BvcnQsIDApOworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShhc3NpZ25lZF9wb3J0KSk7CisKKyAgc2VydmVyLT5zdG9wKCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHByb3ZpZGVfZXZlbnRfYmFzZSwgRml4dHVyZSkgeworICBldmVudF9iYXNlKiBlYiA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgIHNldEV2ZW50QmFzZShlYik7CisgIHN0YXJ0U2VydmVyKDApOworCisgIC8vIGFzc2VydCB0aGF0IHRoZSBzZXJ2ZXIgd29ya3MKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCkpKTsKKyNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA+IDB4MDIwMTA0MDAKKyAgLy8gYWxzbyBhc3NlcnQgdGhhdCB0aGUgZXZlbnRfYmFzZSBpcyBhY3R1YWxseSB1c2VkIHdoZW4gaXQncyBlYXN5CisgIEJPT1NUX0NIRUNLX0dUKGV2ZW50X2Jhc2VfZ2V0X251bV9ldmVudHMoZWIsIEVWRU5UX0JBU0VfQ09VTlRfQURERUQpLCAwKTsKKyNlbmRpZgorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyM2Y1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmZGVmIF9XSU4zMgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC90ZXN0X3Rvb2xzLmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdF9zdWl0ZS5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9jaHJvbm8vZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWVfZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZVNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUUGlwZUludGVycnVwdFRlc3QpCisKKy8vIFRPRE86IGR1cGxpY2F0ZSB0aGUgdGVzdCBjYXNlcyBpbiBUU29ja2V0SW50ZXJydXB0VGVzdCBmb3IgcGlwZXMsCisvLyBvbmNlIHBpcGVzIGltcGxlbWVudCBpbnRlcnJ1cHRDaGlsZHJlbgorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2ludGVycnVwdF9iZWZvcmVfYWNjZXB0KSB7CisgIFRQaXBlU2VydmVyIHBpcGUxKCJUUGlwZUludGVycnVwdFRlc3QiKTsKKyAgcGlwZTEubGlzdGVuKCk7CisgIHBpcGUxLmludGVycnVwdCgpOworICBCT09TVF9DSEVDS19USFJPVyhwaXBlMS5hY2NlcHQoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIGFjY2VwdFdvcmtlcihUUGlwZVNlcnZlciAqcGlwZSkgeworICB0cnkKKyAgeworICAgIGZvciAoOzspCisgICAgeworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRlbXAgPSBwaXBlLT5hY2NlcHQoKTsKKyAgICB9CisgIH0KKyAgY2F0Y2ggKC4uLikgey8qanVzdCB3YW50IHRvIG1ha2Ugc3VyZSBub3RoaW5nIGNyYXNoZXMqLyB9Cit9CisKK3N0YXRpYyB2b2lkIGludGVycnVwdFdvcmtlcihUUGlwZVNlcnZlciAqcGlwZSkgeworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoMTApKTsKKyAgcGlwZS0+aW50ZXJydXB0KCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHN0cmVzc19waXBlX2FjY2VwdF9pbnRlcnJ1cHRpb24pIHsKKyAgaW50IGludGVycnVwdEl0ZXJzID0gMTA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcnJ1cHRJdGVyczsgKytpKQorICB7CisgICAgVFBpcGVTZXJ2ZXIgcGlwZVNlcnZlcigiVFBpcGVJbnRlcnJ1cHRUZXN0Iik7CisgICAgcGlwZVNlcnZlci5saXN0ZW4oKTsKKyAgICBib29zdDo6dGhyZWFkIGFjY2VwdFRocmVhZChzdGQ6OmJpbmQoYWNjZXB0V29ya2VyLCAmcGlwZVNlcnZlcikpOworICAgIGJvb3N0Ojp0aHJlYWQgaW50ZXJydXB0VGhyZWFkKHN0ZDo6YmluZChpbnRlcnJ1cHRXb3JrZXIsICZwaXBlU2VydmVyKSk7CisgICAgdHJ5CisgICAgeworICAgICAgZm9yICg7OykKKyAgICAgIHsKKyAgICAgICAgVFBpcGUgY2xpZW50KCJUUGlwZUludGVycnVwdFRlc3QiKTsKKyAgICAgICAgY2xpZW50LnNldENvbm5UaW1lb3V0KDEpOworICAgICAgICBjbGllbnQub3BlbigpOworICAgICAgfQorICAgIH0gY2F0Y2ggKC4uLikgeyAvKmp1c3QgdGVzdGluZyBmb3IgY3Jhc2hlcyovIH0KKyAgICBpbnRlcnJ1cHRUaHJlYWQuam9pbigpOworICAgIGFjY2VwdFRocmVhZC5qb2luKCk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzA5MWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVFBpcGVkVHJhbnNwb3J0VGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZF93cml0ZSkgeworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdW5kZXJseWluZyhuZXcgVE1lbW9yeUJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydD4gdHJhbnMobmV3IFRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlKSk7CisKKyAgdWludDhfdCBidWZmZXJbNF07CisKKyAgdW5kZXJseWluZy0+d3JpdGUoKHVpbnQ4X3QqKSJhYmNkIiwgNCk7CisgIHRyYW5zLT5yZWFkQWxsKGJ1ZmZlciwgMik7CisgIEJPT1NUX0NIRUNLKHN0ZDo6c3RyaW5nKChjaGFyKilidWZmZXIsIDIpID09ICJhYiIpOworICB0cmFucy0+cmVhZEVuZCgpOworICBCT09TVF9DSEVDSyhwaXBlLT5nZXRCdWZmZXJBc1N0cmluZygpID09ICJhYiIpOworICBwaXBlLT5yZXNldEJ1ZmZlcigpOworICB1bmRlcmx5aW5nLT53cml0ZSgodWludDhfdCopImVmIiwgMik7CisgIHRyYW5zLT5yZWFkQWxsKGJ1ZmZlciwgMik7CisgIEJPT1NUX0NIRUNLKHN0ZDo6c3RyaW5nKChjaGFyKilidWZmZXIsIDIpID09ICJjZCIpOworICB0cmFucy0+cmVhZEFsbChidWZmZXIsIDIpOworICBCT09TVF9DSEVDSyhzdGQ6OnN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiZWYiKTsKKyAgdHJhbnMtPnJlYWRFbmQoKTsKKyAgQk9PU1RfQ0hFQ0socGlwZS0+Z2V0QnVmZmVyQXNTdHJpbmcoKSA9PSAiY2RlZiIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmNjg2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0X3N1aXRlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9jaHJvbm8vZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWVfZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0RmFjdG9yeTsKKwordXNpbmcgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFNTTFNvY2tldEludGVycnVwdFRlc3QpCisKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGtleURpcjsKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGNlcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgcmV0dXJuIGtleURpciAvIGZpbGVuYW1lOworfQorYm9vc3Q6Om11dGV4IGdNdXRleDsKKworc3RydWN0IEdsb2JhbEZpeHR1cmVTU0wKK3sKKyAgICBHbG9iYWxGaXh0dXJlU1NMKCkKKyAgICB7CisgICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKKyAgICAgIHsKKyAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoImFyZ3ZbJTElXSA9IFwiJTIlXCIiKSAlIGkgJSBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbaV0pOworICAgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBPcGVuU1NMIGNhbGxzIHNlbmQoKSB3aXRob3V0IE1TR19OT1NJR1BJUEUgc28gd3JpdGluZyB0byBhIHNvY2tldCB0aGF0IGhhcworICAgICAgLy8gZGlzY29ubmVjdGVkIGNhbiBjYXVzZSBhIFNJR1BJUEUgc2lnbmFsLi4uCisgICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisjZW5kaWYKKworICAgICAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmluaXRpYWxpemVPcGVuU1NMKCk7CisKKyAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKSAvICJ0ZXN0IiAvICJrZXlzIjsKKyAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgIHsKKyAgICAgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgobWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W21hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYyAtIDFdKTsKKyAgICAgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJUaGUgbGFzdCBhcmd1bWVudCB0byB0aGlzIHRlc3QgbXVzdCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlc3QgY2VydGlmaWNhdGUocykuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5HbG9iYWxGaXh0dXJlU1NMKCkKKyAgICB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpjbGVhbnVwT3BlblNTTCgpOworI2lmZGVmIF9fbGludXhfXworICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworI2VuZGlmCisgICAgfQorfTsKKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmVTU0wpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmVTU0wpCisjZW5kaWYKKwordm9pZCByZWFkZXJXb3JrZXIoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgdWludDMyX3QgZXhwZWN0ZWRSZXN1bHQpIHsKKyAgdWludDhfdCBidWZbNF07CisgIHRyeSB7CisgICAgdHQtPnJlYWQoYnVmLCAxKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnJlYWQoYnVmLCA0KSk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK3ZvaWQgcmVhZGVyV29ya2VyTXVzdFRocm93KHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKKyAgdHJ5IHsKKyAgICB1aW50OF90IGJ1Zls0MDBdOworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgdHQtPnJlYWQoYnVmLCA0MDApOworICAgIEJPT1NUX0VSUk9SKCJzaG91bGQgbm90IGhhdmUgZ290dGVuIGhlcmUiKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCitzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKworICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoInNlcnZlci5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKKyAgcmV0dXJuIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworfQorCitzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKKworICBwQ2xpZW50U29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoImNsaWVudC5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJjbGllbnQua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjZXJ0RmlsZSgiQ0EucGVtIikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHJldHVybiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfaW50ZXJydXB0YWJsZV9jaGlsZF9yZWFkX3doaWxlX2hhbmRzaGFraW5nKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLT5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXJNdXN0VGhyb3csIGFjY2VwdGVkKSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UocmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSksCisgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGRpZCBub3QgaW50ZXJydXB0IGNoaWxkIHJlYWQiKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHJlYWRUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShyZWFkVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCByZWFkIik7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBjbGllbnRTb2NrLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9ub25faW50ZXJydXB0YWJsZV9jaGlsZF9yZWFkKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLT5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgc3RhdGljX3BvaW50ZXJfY2FzdDxUU1NMU29ja2V0PihhY2NlcHRlZCktPnNldFJlY3ZUaW1lb3V0KDEwMDApOworICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoc3RkOjpiaW5kKHJlYWRlcldvcmtlciwgYWNjZXB0ZWQsIDApKTsKKyAgY2xpZW50U29jay0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSIwIiwgMSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgaGVyZQorICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFyZWFkVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcmVhZCIpOworCisgIC8vIHdhaXQgZm9yIHJlY2VpdmUgdGltZW91dCB0byBraWNrIGluCisgIHJlYWRUaHJlYWQuam9pbigpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfY2Fubm90X2NoYW5nZV9hZnRlcl9saXN0ZW4pIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CisgIFRTU0xTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KTsKKyAgc29jazEubGlzdGVuKCk7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSksIHN0ZDo6bG9naWNfZXJyb3IpOworICBzb2NrMS5jbG9zZSgpOworfQorCit2b2lkIHBlZWtlcldvcmtlcihzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0LCBib29sIGV4cGVjdGVkUmVzdWx0KSB7CisgIHVpbnQ4X3QgYnVmWzQwMF07CisgIHRyeSB7CisgICAgdHQtPnJlYWQoYnVmLCAxKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnBlZWsoKSk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK3ZvaWQgcGVla2VyV29ya2VySW50ZXJydXB0KHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKKyAgdWludDhfdCBidWZbNDAwXTsKKyAgdHJ5IHsKKyAgICB0dC0+cmVhZChidWYsIDEpOworICAgIHR0LT5wZWVrKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsIHR4LmdldFR5cGUoKSk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfaW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLT5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXJJbnRlcnJ1cHQsIGFjY2VwdGVkKSk7CisgIGNsaWVudFNvY2stPndyaXRlKChjb25zdCB1aW50OF90KikiMCIsIDEpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHBlZWtUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCBwZWVrIik7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBjbGllbnRTb2NrLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9ub25faW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLT5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgc3RhdGljX3BvaW50ZXJfY2FzdDxUU1NMU29ja2V0PihhY2NlcHRlZCktPnNldFJlY3ZUaW1lb3V0KDEwMDApOworICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoc3RkOjpiaW5kKHBlZWtlcldvcmtlciwgYWNjZXB0ZWQsIGZhbHNlKSk7CisgIGNsaWVudFNvY2stPndyaXRlKChjb25zdCB1aW50OF90KikiMCIsIDEpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcGVlayIpOworCisgIC8vIHdhaXQgZm9yIHRoZSByZWNlaXZlIHRpbWVvdXQgdG8ga2ljayBpbgorICBwZWVrVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzZjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAKQEAgLTAsMCArMSw1MzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUU2VydmVySW50ZWdyYXRpb25UZXN0CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3B0aW1lLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JlYWNoLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcjsKK3VzaW5nIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUlmOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VJZkZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUlmU2luZ2xldG9uRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk7Cit1c2luZyBib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzOworCisvKioKKyAqIHByZVNlcnZlIHJ1bnMgYWZ0ZXIgbGlzdGVuKCkgaXMgc3VjY2Vzc2Z1bCwgd2hlbiB3ZSBjYW4gY29ubmVjdAorICovCitjbGFzcyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciwgcHVibGljIE1vbml0b3IgeworcHVibGljOgorICBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSA6IGlzTGlzdGVuaW5nXyhmYWxzZSksIGFjY2VwdGVkXygwKSB7fQorICB2aXJ0dWFsIH5UU2VydmVyUmVhZHlFdmVudEhhbmRsZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgIGlzTGlzdGVuaW5nXyA9IHRydWU7CisgICAgbm90aWZ5KCk7CisgIH0KKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYygqdGhpcyk7CisgICAgKythY2NlcHRlZF87CisgICAgbm90aWZ5KCk7CisKKyAgICAodm9pZClpbnB1dDsKKyAgICAodm9pZClvdXRwdXQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYm9vbCBpc0xpc3RlbmluZygpIGNvbnN0IHsgcmV0dXJuIGlzTGlzdGVuaW5nXzsgfQorICB1aW50NjRfdCBhY2NlcHRlZENvdW50KCkgY29uc3QgeyByZXR1cm4gYWNjZXB0ZWRfOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNMaXN0ZW5pbmdfOworICB1aW50NjRfdCBhY2NlcHRlZF87Cit9OworCisvKioKKyAqIFJldXNpbmcgYW5vdGhlciBnZW5lcmF0ZWQgdGVzdCwganVzdCBzb21ldGhpbmcgdG8gc2VydmUgdXAKKyAqLworY2xhc3MgUGFyZW50SGFuZGxlciA6IHB1YmxpYyBQYXJlbnRTZXJ2aWNlSWYgeworcHVibGljOgorICBQYXJlbnRIYW5kbGVyKCkgOiBnZW5lcmF0aW9uXygwKSB7fQorCisgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuICsrZ2VuZXJhdGlvbl87CisgIH0KKworICBpbnQzMl90IGdldEdlbmVyYXRpb24oKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiBnZW5lcmF0aW9uXzsKKyAgfQorCisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHN0cmluZ3NfLnB1c2hfYmFjayhzKTsKKyAgfQorCisgIHZvaWQgZ2V0U3RyaW5ncyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIF9yZXR1cm4pIHsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgX3JldHVybiA9IHN0cmluZ3NfOworICB9CisKKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYgX3JldHVybiwgY29uc3QgaW50MzJfdCBsZW5ndGgpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKF9yZXR1cm4pOworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUobGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgb25ld2F5V2FpdCgpIHt9CisKKyAgdm9pZCBleGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7IFRIUklGVF9VTlVTRURfVkFSSUFCTEUobWVzc2FnZSk7IH0KKworICB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7IFRIUklGVF9VTlVTRURfVkFSSUFCTEUobWVzc2FnZSk7IH0KKworcHJvdGVjdGVkOgorICBNdXRleCBtdXRleF87CisgIGludDMyX3QgZ2VuZXJhdGlvbl87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzXzsKK307CisKK3ZvaWQgYXV0b1NvY2tldENsb3NlcihUU29ja2V0KiBwU29jaykgeworICBwU29jay0+Y2xvc2UoKTsKKyAgZGVsZXRlIHBTb2NrOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVFNlcnZlclR5cGU+CitjbGFzcyBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZSB7CitwdWJsaWM6CisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBfcHJvY2Vzc29yRmFjdG9yeSkKKyAgICA6IHBTZXJ2ZXIobmV3IFRTZXJ2ZXJUeXBlKF9wcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKSksCisgICAgICBwRXZlbnRIYW5kbGVyKHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSksCisgICAgYlN0cmVzc0RvbmUoZmFsc2UpLAorICAgIGJTdHJlc3NDb25uZWN0aW9uQ291bnQoMCksCisgICAgYlN0cmVzc1JlcXVlc3RDb3VudCgwKSB7CisgICAgcFNlcnZlci0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKHBFdmVudEhhbmRsZXIpOworICB9CisKKyAgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgX3Byb2Nlc3NvcikKKyAgICA6IHBTZXJ2ZXIoCisgICAgICAgICAgbmV3IFRTZXJ2ZXJUeXBlKF9wcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4obmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSkpKSwKKyAgICAgIHBFdmVudEhhbmRsZXIoc2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+KG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpKSwKKyAgICAgIGJTdHJlc3NEb25lKGZhbHNlKSwKKyAgICBiU3RyZXNzQ29ubmVjdGlvbkNvdW50KDApLAorICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQoMCkgeworICAgIHBTZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKKyAgfQorCisgIHZvaWQgc3RhcnRTZXJ2ZXIoKSB7CisgICAgcFNlcnZlclRocmVhZC5yZXNldChuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJUeXBlOjpzZXJ2ZSwgcFNlcnZlci5nZXQoKSkpKTsKKworICAgIC8vIGJsb2NrIHVudGlsIGxpc3RlbigpIGNvbXBsZXRlcyBzbyBjbGllbnRzIHdpbGwgYmUgYWJsZSB0byBjb25uZWN0CisgICAgU3luY2hyb25pemVkIHN5bmMoKihwRXZlbnRIYW5kbGVyLmdldCgpKSk7CisgICAgd2hpbGUgKCFwRXZlbnRIYW5kbGVyLT5pc0xpc3RlbmluZygpKSB7CisgICAgICBwRXZlbnRIYW5kbGVyLT53YWl0KCk7CisgICAgfQorCisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCIgIHNlcnZlciBpcyBsaXN0ZW5pbmciKTsKKyAgfQorCisgIHZvaWQgYmxvY2tVbnRpbEFjY2VwdGVkKHVpbnQ2NF90IG51bUFjY2VwdGVkKSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKihwRXZlbnRIYW5kbGVyLmdldCgpKSk7CisgICAgd2hpbGUgKHBFdmVudEhhbmRsZXItPmFjY2VwdGVkQ291bnQoKSA8IG51bUFjY2VwdGVkKSB7CisgICAgICBwRXZlbnRIYW5kbGVyLT53YWl0KCk7CisgICAgfQorCisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIiAgc2VydmVyIGhhcyBhY2NlcHRlZCAlMSUiKSAlIG51bUFjY2VwdGVkKTsKKyAgfQorCisgIHZvaWQgc3RvcFNlcnZlcigpIHsKKyAgICBpZiAocFNlcnZlclRocmVhZCkgeworICAgICAgcFNlcnZlci0+c3RvcCgpOworICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCIgIHNlcnZlciBzdG9wIGNvbXBsZXRlZCIpOworCisgICAgICBwU2VydmVyVGhyZWFkLT5qb2luKCk7CisgICAgICBCT09TVF9URVNUX01FU1NBR0UoIiAgc2VydmVyIHRocmVhZCBqb2luZWQiKTsKKyAgICAgIHBTZXJ2ZXJUaHJlYWQucmVzZXQoKTsKKyAgICB9CisgIH0KKworICB+VFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUoKSB7IHN0b3BTZXJ2ZXIoKTsgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGJhc2VsaW5lIHRlc3Qgd2hlcmUgc29tZSBjbGllbnRzIGFyZSBvcGVuZWQgYW5kIGlzc3VlIGEgc2luZ2xlIG9wZXJhdGlvbgorICAgKiBhbmQgdGhlbiBkaXNjb25uZWN0IGF0IGRpZmZlcmVudCBpbnRlcnZhbHMuCisgICAqIFxwYXJhbVtpbl0gIG51bVRvTWFrZSAgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMKKyAgICogXHBhcmFtW2luXSAgZXhwZWN0ZWRIV00gIHRoZSBoaWdoIHdhdGVyIG1hcmsgd2UgZXhwZWN0IG9mIGNvbmN1cnJlbmN5CisgICAqIFxwYXJhbVtpbl0gIHB1cnBvc2UgIGEgZGVzY3JpcHRpb24gb2YgdGhlIHRlc3QgZm9yIGxvZ2dpbmcgcHVycG9zZXMKKyAgICovCisgIHZvaWQgYmFzZWxpbmUoaW50NjRfdCBudW1Ub01ha2UsIGludDY0X3QgZXhwZWN0ZWRIV00sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwdXJwb3NlKSB7CisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIlRlc3RpbmcgJTElOiAlMiUgd2l0aCAlMyUgY2xpZW50cywgZXhwZWN0ICU0JSBIV00iKQorICAgICAgICAgICAgJSB0eXBlaWQoVFNlcnZlclR5cGUpLm5hbWUoKSAlIHB1cnBvc2UgJSBudW1Ub01ha2UgJSBleHBlY3RlZEhXTSk7CisKKyAgICBzdGFydFNlcnZlcigpOworCisgICAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0PiA+IGhvbGRTb2NrZXRzOworICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gPiBob2xkVGhyZWFkczsKKworICAgIGZvciAoaW50NjRfdCBpID0gMDsgaSA8IG51bVRvTWFrZTsgKytpKSB7CisgICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgICAgICBob2xkU29ja2V0cy5wdXNoX2JhY2socENsaWVudFNvY2spOworICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHBDbGllbnRQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHBDbGllbnRTb2NrKSk7CisgICAgICBQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChwQ2xpZW50UHJvdG9jb2wpOworICAgICAgcENsaWVudFNvY2stPm9wZW4oKTsKKyAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7CisgICAgICBob2xkVGhyZWFkcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPigKKyAgICAgICAgICBuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDEwICogbnVtVG9NYWtlKSkpKSk7CisgICAgfQorCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRIV00sIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpKTsKKworICAgIEJPT1NUX0ZPUkVBQ0ggKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFRocmVhZCwgaG9sZFRocmVhZHMpIHsgcFRocmVhZC0+am9pbigpOyB9CisgICAgaG9sZFRocmVhZHMuY2xlYXIoKTsKKyAgICBob2xkU29ja2V0cy5jbGVhcigpOworCisgICAgc3RvcFNlcnZlcigpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byBjbG9zZSBhIGNvbm5lY3Rpb24gYWZ0ZXIgYSBkZWxheS4KKyAgICogXHBhcmFtW2luXSAgdG9DbG9zZSAgdGhlIGNvbm5lY3Rpb24gdG8gY2xvc2UKKyAgICogXHBhcmFtW2luXSAgYWZ0ZXIgIHRoZSBkZWxheSB0byBpbXBvc2UKKyAgICovCisgIHZvaWQgZGVsYXlDbG9zZShzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRvQ2xvc2UsIGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uIGFmdGVyKSB7CisgICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChhZnRlcik7CisgICAgdG9DbG9zZS0+Y2xvc2UoKTsKKyAgfQorCisgIC8qKgorICAgKiBccmV0dXJucyAgdGhlIHNlcnZlciBwb3J0IG51bWJlcgorICAgKi8KKyAgaW50IGdldFNlcnZlclBvcnQoKSB7CisgICAgVFNlcnZlclNvY2tldCogcFNvY2sgPSBkeW5hbWljX2Nhc3Q8VFNlcnZlclNvY2tldCo+KHBTZXJ2ZXItPmdldFNlcnZlclRyYW5zcG9ydCgpLmdldCgpKTsKKyAgICBpZiAoIXBTb2NrKSB7IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoImhvdyBjb21lPyIpOyB9CisgICAgcmV0dXJuIHBTb2NrLT5nZXRQb3J0KCk7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBzdHJlc3MgdGVzdCBieSBzcGF3bmluZyB0aHJlYWRzIHRoYXQgY29ubmVjdCwgZG8gYSBudW1iZXIgb2Ygb3BlcmF0aW9ucworICAgKiBhbmQgZGlzY29ubmVjdCwgdGhlbiBhIHJhbmRvbSBkZWxheSwgdGhlbiBkbyBpdCBvdmVyIGFnYWluLiAgVGhpcyBpcyBkb25lIGZvciBhIGZpeGVkCisgICAqIHBlcmlvZCBvZiB0aW1lIHRvIHRlc3QgZm9yIGNvbmN1cnJlbmN5IGNvcnJlY3RuZXNzLgorICAgKiBccGFyYW1baW5dICBudW1Ub01ha2UgIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzCisgICAqLworICB2b2lkIHN0cmVzcyhpbnQ2NF90IG51bVRvTWFrZSwgY29uc3QgYm9vc3Q6OnBvc2l4X3RpbWU6OnRpbWVfZHVyYXRpb24mIGR1cmF0aW9uKSB7CisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIlN0cmVzcyB0ZXN0aW5nICUxJSB3aXRoICUyJSBjbGllbnRzIGZvciAlMyUgc2Vjb25kcyIpCisgICAgICAgICUgdHlwZWlkKFRTZXJ2ZXJUeXBlKS5uYW1lKCkgJSBudW1Ub01ha2UgJSBkdXJhdGlvbi50b3RhbF9zZWNvbmRzKCkpOworCisgICAgc3RhcnRTZXJ2ZXIoKTsKKworICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gPiBob2xkVGhyZWFkczsKKyAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBudW1Ub01ha2U7ICsraSkgeworICAgICAgaG9sZFRocmVhZHMucHVzaF9iYWNrKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCisgICAgICAgIG5ldyBib29zdDo6dGhyZWFkKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OnN0cmVzc29yLCB0aGlzKSkpKTsKKyAgICB9CisKKyAgICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGR1cmF0aW9uKTsKKyAgICBiU3RyZXNzRG9uZSA9IHRydWU7CisKKyAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiICBzZXJ2aWNlZCAlMSUgY29ubmVjdGlvbnMgKEhXTSAlMiUpIHRvdGFsaW5nICUzJSByZXF1ZXN0cyIpCisgICAgICAgICUgYlN0cmVzc0Nvbm5lY3Rpb25Db3VudCAlIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpICUgYlN0cmVzc1JlcXVlc3RDb3VudCk7CisKKyAgICBCT09TVF9GT1JFQUNIIChzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBUaHJlYWQsIGhvbGRUaHJlYWRzKSB7IHBUaHJlYWQtPmpvaW4oKTsgfQorICAgIGhvbGRUaHJlYWRzLmNsZWFyKCk7CisKKyAgICBCT09TVF9DSEVDSyhiU3RyZXNzUmVxdWVzdENvdW50ID4gMCk7CisKKyAgICBzdG9wU2VydmVyKCk7CisgIH0KKworICAvKioKKyAgICogSGVscGVyIG1ldGhvZCB0byBzdHJlc3MgdGhlIHN5c3RlbQorICAgKi8KKyAgdm9pZCBzdHJlc3NvcigpIHsKKyAgd2hpbGUgKCFiU3RyZXNzRG9uZSkgeworICAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBwU29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLCBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwUHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChwU29ja2V0KSk7CisgICAgICBQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChwUHJvdG9jb2wpOworICAgICAgcFNvY2tldC0+b3BlbigpOworICAgICAgYlN0cmVzc0Nvbm5lY3Rpb25Db3VudC5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhbmQoKSAlIDEwMDA7ICsraSkgeworICAgICAgY2xpZW50LmluY3JlbWVudEdlbmVyYXRpb24oKTsKKyAgICAgICAgYlN0cmVzc1JlcXVlc3RDb3VudC5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2hhcmVkX3B0cjxUU2VydmVyVHlwZT4gcFNlcnZlcjsKKyAgc2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+IHBFdmVudEhhbmRsZXI7CisgIHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFNlcnZlclRocmVhZDsKKyAgc3RkOjphdG9taWM8Ym9vbD4gYlN0cmVzc0RvbmU7CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IGJTdHJlc3NDb25uZWN0aW9uQ291bnQ7CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IGJTdHJlc3NSZXF1ZXN0Q291bnQ7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVFNlcnZlclR5cGU+CitjbGFzcyBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmUKKyAgICA6IHB1YmxpYyBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTxUU2VydmVyVHlwZT4geworcHVibGljOgorICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmUoKQorICAgIDogVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+KG1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5PigKKyAgICAgICAgICBtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlSWZTaW5nbGV0b25GYWN0b3J5PigKKyAgICAgICAgICAgICAgbWFrZV9zaGFyZWQ8UGFyZW50SGFuZGxlcj4oKSkpKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgorY2xhc3MgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmUgOiBwdWJsaWMgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+IHsKK3B1YmxpYzoKKyAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmUoKQorICAgIDogVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+KAorICAgICAgICAgIG1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VQcm9jZXNzb3I+KG1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSB7fQorfTsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKGNvbnN0cnVjdG9ycykKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF9zaW1wbGVfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUU2ltcGxlU2VydmVyPikgeworICBiYXNlbGluZSgzLCAxLCAiZmFjdG9yeSIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3NpbXBsZSwgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFNpbXBsZVNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMywgMSwgInByb2Nlc3NvciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikgeworICBiYXNlbGluZSgxMCwgMTAsICJmYWN0b3J5Iik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkZWQsIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRlZFNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMTAsIDEwLCAicHJvY2Vzc29yIik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkZWRfYm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CisgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCg0KTsKKyAgYmFzZWxpbmUoMTAsIDQsICJsaW1pdCBieSBzZXJ2ZXIgZnJhbWV3b3JrIik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkZWRfc3RyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlPFRUaHJlYWRlZFNlcnZlcj4pIHsKKyAgc3RyZXNzKDEwLCBib29zdDo6cG9zaXhfdGltZTo6c2Vjb25kcygzKSk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgeworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKKworICAvLyB0aHJlYWQgZmFjdG9yeSBoYXMgNCB0aHJlYWRzIGFzIGEgZGVmYXVsdAorICAvLyB0aHJlYWQgZmFjdG9yeSBob3dldmVyIGlzIGEgYmFkIHdheSB0byBsaW1pdCBjb25jdXJyZW50IGNsaWVudHMKKyAgLy8gYXMgYWNjZXB0KCkgd2lsbCBiZSBjYWxsZWQgdG8gZ3JhYiBhIDV0aCBjbGllbnQgc29ja2V0LCBpbiB0aGlzIGNhc2UKKyAgLy8gYW5kIHRoZW4gdGhlIHRocmVhZCBmYWN0b3J5IHdpbGwgYmxvY2sgYWRkaW5nIHRoZSB0aHJlYWQgdG8gbWFuYWdlCisgIC8vIHRoYXQgY2xpZW50LgorICBiYXNlbGluZSgxMCwgNSwgImxpbWl0IGJ5IHRocmVhZCBtYW5hZ2VyIik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgeworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKKworICAvLyB0aHJlYWQgZmFjdG9yeSBoYXMgNCB0aHJlYWRzIGFzIGEgZGVmYXVsdAorICAvLyB0aHJlYWQgZmFjdG9yeSBob3dldmVyIGlzIGEgYmFkIHdheSB0byBsaW1pdCBjb25jdXJyZW50IGNsaWVudHMKKyAgLy8gYXMgYWNjZXB0KCkgd2lsbCBiZSBjYWxsZWQgdG8gZ3JhYiBhIDV0aCBjbGllbnQgc29ja2V0LCBpbiB0aGlzIGNhc2UKKyAgLy8gYW5kIHRoZW4gdGhlIHRocmVhZCBmYWN0b3J5IHdpbGwgYmxvY2sgYWRkaW5nIHRoZSB0aHJlYWQgdG8gbWFuYWdlCisgIC8vIHRoYXQgY2xpZW50LgorICBiYXNlbGluZSgxMCwgNSwgImxpbWl0IGJ5IHRocmVhZCBtYW5hZ2VyIik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbF9ib3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgeworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKKyAgcFNlcnZlci0+c2V0Q29uY3VycmVudENsaWVudExpbWl0KDQpOworCisgIGJhc2VsaW5lKDEwLCA0LCAic2VydmVyIGZyYW1ld29yayBjb25uZWN0aW9uIGxpbWl0Iik7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbF9zdHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisKKyAgc3RyZXNzKDEwLCBib29zdDo6cG9zaXhfdGltZTo6c2Vjb25kcygzKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoVFNlcnZlckludGVncmF0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0b3Bfd2l0aF9pbnRlcnJ1cHRhYmxlX2NsaWVudHNfY29ubmVjdGVkKSB7CisgIC8vIFRoaXMgdGVzdHMgVEhSSUZULTI0NDEgbmV3IGJlaGF2aW9yOiBzdG9wcGluZyB0aGUgc2VydmVyIGRpc2Nvbm5lY3RzIGNsaWVudHMKKyAgQk9PU1RfVEVTVF9NRVNTQUdFKCJUZXN0aW5nIHN0b3Agd2l0aCBpbnRlcnJ1cHRhYmxlIGNsaWVudHMiKTsKKworICBzdGFydFNlcnZlcigpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sxKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMS0+b3BlbigpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworCisgIC8vIEVuc3VyZSB0aGV5IGhhdmUgYmVlbiBhY2NlcHRlZAorICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisKKyAgLy8gVGhlIHRlc3QgZml4dHVyZSBkZXN0cnVjdG9yIHdpbGwgZm9yY2UgdGhlIHNvY2tldHMgdG8gZGlzY29ubmVjdAorICAvLyBQcmlvciB0byBUSFJJRlQtMjQ0MSwgcFNlcnZlci0+c3RvcCgpIHdvdWxkIGhhbmcgdW50aWwgY2xpZW50cyBkaXNjb25uZWN0ZWQKKyAgc3RvcFNlcnZlcigpOworCisgIC8vIGV4dHJhIHByb29mIHRoZSBzZXJ2ZXIgZW5kIGRpc2Nvbm5lY3RlZCB0aGUgY2xpZW50cworICB1aW50OF90IGJ1ZlsxXTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcENsaWVudFNvY2sxLT5yZWFkKCZidWZbMF0sIDEpKTsgLy8gMCA9IGRpc2Nvbm5lY3RlZAorICBCT09TVF9DSEVDS19FUVVBTCgwLCBwQ2xpZW50U29jazItPnJlYWQoJmJ1ZlswXSwgMSkpOyAvLyAwID0gZGlzY29ubmVjdGVkCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RvcF93aXRoX3VuaW50ZXJydXB0YWJsZV9jbGllbnRzX2Nvbm5lY3RlZCkgeworICAvLyBUaGlzIHRlc3RzIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcjogc3RvcHBpbmcgdGhlIHNlcnZlciBibG9ja3MgdW50aWwgY2xpZW50cworICAvLyBkaXNjb25uZWN0LgorICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdGluZyBzdG9wIHdpdGggdW5pbnRlcnJ1cHRhYmxlIGNsaWVudHMiKTsKKworICBkeW5hbWljX3BvaW50ZXJfY2FzdDxUU2VydmVyU29ja2V0PihwU2VydmVyLT5nZXRTZXJ2ZXJUcmFuc3BvcnQoKSkKKyAgICAgIC0+c2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKKworICBzdGFydFNlcnZlcigpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sxKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMS0+b3BlbigpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworCisgIC8vIEVuc3VyZSB0aGV5IGhhdmUgYmVlbiBhY2NlcHRlZAorICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisKKyAgYm9vc3Q6OnRocmVhZCB0MShzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2sxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7CisgIGJvb3N0Ojp0aHJlYWQgdDIoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMoMjUwKSkpOworCisgIC8vIE9uY2UgdGhlIGNsaWVudHMgZGlzY29ubmVjdCB0aGUgc2VydmVyIHdpbGwgc3RvcAorICBzdG9wU2VydmVyKCk7CisgIEJPT1NUX0NIRUNLKHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpID4gMCk7CisgIHQxLmpvaW4oKTsKKyAgdDIuam9pbigpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NvbmN1cnJlbnRfY2xpZW50X2xpbWl0KSB7CisgIHN0YXJ0U2VydmVyKCk7CisgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdGluZyB0aGUgY29uY3VycmVudCBjbGllbnQgbGltaXQiKTsKKworICBCT09TVF9DSEVDS19FUVVBTChJTlQ2NF9NQVgsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRMaW1pdCgpKTsKKyAgcFNlcnZlci0+c2V0Q29uY3VycmVudENsaWVudExpbWl0KDIpOworICBCT09TVF9DSEVDS19FUVVBTCgwLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRMaW1pdCgpKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazEtPm9wZW4oKTsKKyAgYmxvY2tVbnRpbEFjY2VwdGVkKDEpOworICBCT09TVF9DSEVDS19FUVVBTCgxLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnQoKSk7CisKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazIobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgcENsaWVudFNvY2syLT5vcGVuKCk7CisgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworCisgIC8vIGEgdGhpcmQgY2xpZW50IGNhbm5vdCBjb25uZWN0IHVudGlsIG9uZSBvZiB0aGUgb3RoZXIgdHdvIGNsb3NlcworICBib29zdDo6dGhyZWFkIHQyKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U29jazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDI1MCkpKTsKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazMobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgcENsaWVudFNvY2syLT5vcGVuKCk7CisgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworICBCT09TVF9DSEVDS19FUVVBTCgyLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSk7CisKKyAgc3RvcFNlcnZlcigpOworICBCT09TVF9DSEVDSyhwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSA+IDApOworICB0Mi5qb2luKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTZXJ2ZXJTb2NrZXRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjNmQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIlRUcmFuc3BvcnRDaGVja1Rocm93LmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUU2VydmVyU29ja2V0VGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9iaW5kX3RvX2FkZHJlc3MpIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay5vcGVuKCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7CisKKyAgc3RkOjpjb3V0IDw8ICJBbiBlcnJvciBtZXNzYWdlIGZyb20gZ2V0YWRkcmluZm8gb24gdGhlIGNvbnNvbGUgaXMgZXhwZWN0ZWQ6IiA8PCBzdGQ6OmVuZGw7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazIoIjI1Ny4yNTguMjU5LjI2MCIsIDApOworICBCT09TVF9DSEVDS19USFJPVyhzb2NrMi5saXN0ZW4oKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7CisgIHNvY2syLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfbGlzdGVuX3ZhbGlkX3BvcnQpIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgtMSk7CisgIFRUUkFOU1BPUlRfQ0hFQ0tfVEhST1coc29jazEubGlzdGVuKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKKworICBUU2VydmVyU29ja2V0IHNvY2syKDY1NTM2KTsKKyAgVFRSQU5TUE9SVF9DSEVDS19USFJPVyhzb2NrMi5saXN0ZW4oKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Nsb3NlX2JlZm9yZV9saXN0ZW4pIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZ2V0X3BvcnQpIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxIb3N0IiwgODg4KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoODg4LCBzb2NrMS5nZXRQb3J0KCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWJkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFNlcnZlclRyYW5zcG9ydFRlc3QpCisKK2NsYXNzIFRlc3RUVHJhbnNwb3J0IDogcHVibGljIFRUcmFuc3BvcnQge307CisKK2NsYXNzIFRlc3RUU2VydmVyVHJhbnNwb3J0IDogcHVibGljIFRTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICBUZXN0VFNlcnZlclRyYW5zcG9ydCgpIDogdmFsaWRfKHRydWUpIHt9CisgIHZvaWQgY2xvc2UoKSB7fQorICBib29sIHZhbGlkXzsKKworcHJvdGVjdGVkOgorICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSB7CisgICAgcmV0dXJuIHZhbGlkXyA/IHNoYXJlZF9wdHI8VGVzdFRUcmFuc3BvcnQ+KG5ldyBUZXN0VFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgIDogc2hhcmVkX3B0cjxUZXN0VFRyYW5zcG9ydD4oKTsKKyAgfQorfTsKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9wb3NpdGl2ZV9hY2NlcHQpIHsKKyAgVGVzdFRTZXJ2ZXJUcmFuc3BvcnQgdXV0OworICBCT09TVF9DSEVDSyh1dXQuYWNjZXB0KCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X25lZ2F0aXZlX2FjY2VwdCkgeworICBUZXN0VFNlcnZlclRyYW5zcG9ydCB1dXQ7CisgIHV1dC52YWxpZF8gPSBmYWxzZTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1codXV0LmFjY2VwdCgpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjYyNDJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRTb2NrZXRJbnRlcnJ1cHRUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9jaHJvbm8vZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWVfZHVyYXRpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3RocmVhZC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTb2NrZXRJbnRlcnJ1cHRUZXN0KQorCit2b2lkIHJlYWRlcldvcmtlcihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIHVpbnQzMl90IGV4cGVjdGVkUmVzdWx0KSB7CisgIHVpbnQ4X3QgYnVmWzRdOworICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnJlYWQoYnVmLCA0KSk7Cit9CisKK3ZvaWQgcmVhZGVyV29ya2VyTXVzdFRocm93KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCkgeworICB0cnkgeworICAgIHVpbnQ4X3QgYnVmWzRdOworICAgIHR0LT5yZWFkKGJ1ZiwgNCk7CisgICAgQk9PU1RfRVJST1IoInNob3VsZCBub3QgaGF2ZSBnb3R0ZW4gaGVyZSIpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfaW50ZXJydXB0YWJsZV9jaGlsZF9yZWFkKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXJNdXN0VGhyb3csIGFjY2VwdGVkKSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UocmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGRpZCBub3QgaW50ZXJydXB0IGNoaWxkIHJlYWQiKTsKKyAgY2xpZW50U29jay5jbG9zZSgpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9ub25faW50ZXJydXB0YWJsZV9jaGlsZF9yZWFkKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXIsIGFjY2VwdGVkLCAwKSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgaGVyZQorICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFyZWFkVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcmVhZCIpOworCisgIC8vIG9ubHkgd2F5IHRvIHByb2NlZWQgaXMgdG8gaGF2ZSB0aGUgY2xpZW50IGRpc2Nvbm5lY3QKKyAgY2xpZW50U29jay5jbG9zZSgpOworICByZWFkVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY2Fubm90X2NoYW5nZV9hZnRlcl9saXN0ZW4pIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLmxpc3RlbigpOworICBCT09TVF9DSEVDS19USFJPVyhzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpLCBzdGQ6OmxvZ2ljX2Vycm9yKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKwordm9pZCBwZWVrZXJXb3JrZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0LCBib29sIGV4cGVjdGVkUmVzdWx0KSB7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV4cGVjdGVkUmVzdWx0LCB0dC0+cGVlaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9pbnRlcnJ1cHRhYmxlX2NoaWxkX3BlZWspIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay5vcGVuKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICAvLyBwZWVrKCkgd2lsbCByZXR1cm4gZmFsc2UgaWYgY2hpbGQgaXMgaW50ZXJydXB0ZWQKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHBlZWtUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCBwZWVrIik7CisgIGNsaWVudFNvY2suY2xvc2UoKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKKyAgc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLm9wZW4oKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIC8vIHBlZWsoKSB3aWxsIHJldHVybiBmYWxzZSB3aGVuIHJlbW90ZSBzaWRlIGlzIGNsb3NlZAorICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoc3RkOjpiaW5kKHBlZWtlcldvcmtlciwgYWNjZXB0ZWQsIGZhbHNlKSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyBwZWVrVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIXBlZWtUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBpbnRlcnJ1cHRlZCBjaGlsZCBwZWVrIik7CisKKyAgLy8gb25seSB3YXkgdG8gcHJvY2VlZCBpcyB0byBoYXZlIHRoZSBjbGllbnQgZGlzY29ubmVjdAorICBjbGllbnRTb2NrLmNsb3NlKCk7CisgIHBlZWtUaHJlYWQuam9pbigpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFRyYW5zcG9ydENoZWNrVGhyb3cuaCBiL2xpYi9jcHAvdGVzdC9UVHJhbnNwb3J0Q2hlY2tUaHJvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMjc3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFRyYW5zcG9ydENoZWNrVGhyb3cuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjZGVmaW5lIFRUUkFOU1BPUlRfQ0hFQ0tfVEhST1coX0NBTEwsIF9UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBjYXVnaHQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX0NBTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBCT09TVF9DSEVDS19FUVVBTChleC5nZXRUeXBlKCksIF9UWVBFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXVnaHQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShjYXVnaHQsICJleHBlY3RlZCBUVHJhbnNwb3J0RXhjZXB0aW9uIGJ1dCBub3RoaW5nIHdhcyB0aHJvd24iKTsgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBUVFJBTlNQT1JUX1JFUVVJUkVfVEhST1coX0NBTEwsIF9UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgY2F1Z2h0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9DQUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQk9PU1RfUkVRVUlSRV9FUVVBTChleC5nZXRUeXBlKCksIF9UWVBFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2F1Z2h0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJPT1NUX1JFUVVJUkVfTUVTU0FHRShjYXVnaHQsICJleHBlY3RlZCBUVHJhbnNwb3J0RXhjZXB0aW9uIGJ1dCBub3RoaW5nIHdhcyB0aHJvd24iKTsgICAgICAgICAgXAorICB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVGhyaWZ0VGVzdF9leHRyYXMuY3BwIGIvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjU2MDZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcApAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEV4dHJhIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgVGhyaWZ0VGVzdF90eXBlcyB0byB3b3JrCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlICJnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCIKKworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CisKK2Jvb2wgSW5zYW5pdHk6Om9wZXJhdG9yPCh0aHJpZnQ6OnRlc3Q6Okluc2FuaXR5IGNvbnN0JiBvdGhlcikgY29uc3QgeworICB1c2luZyBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmc7CisgIHJldHVybiBUaHJpZnREZWJ1Z1N0cmluZygqdGhpcykgPCBUaHJpZnREZWJ1Z1N0cmluZyhvdGhlcik7Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVG9TdHJpbmdUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9Ub1N0cmluZ1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDRjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVG9TdHJpbmdUZXN0LmNwcApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgorCisjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAiZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRvX3N0cmluZzsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRvU3RyaW5nVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoYmFzZV90eXBlc190b19zdHJpbmcpIHsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKDEwKSwgIjEwIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyh0cnVlKSwgIjEiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKCdhJyksICJhIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygxLjIpLCAiMS4yIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygiYWJjIiksICJhYmMiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZW1wdHlfdmVjdG9yX3RvX3N0cmluZykgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGw7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhsKSwgIltdIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNpbmdsZV9pdGVtX3ZlY3Rvcl90b19zdHJpbmcpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBsOworICBsLnB1c2hfYmFjaygxMDApOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksICJbMTAwXSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShtdWx0aXBsZV9pdGVtX3ZlY3Rvcl90b19zdHJpbmcpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBsOworICBsLnB1c2hfYmFjaygxMDApOworICBsLnB1c2hfYmFjaygxNTApOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksICJbMTAwLCAxNTBdIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGVtcHR5X21hcF90b19zdHJpbmcpIHsKKyAgc3RkOjptYXA8aW50LCBzdGQ6OnN0cmluZz4gbTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKG0pLCAie30iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0Uoc2luZ2xlX2l0ZW1fbWFwX3RvX3N0cmluZykgeworICBzdGQ6Om1hcDxpbnQsIHN0ZDo6c3RyaW5nPiBtOworICBtWzEyXSA9ICJhYmMiOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobSksICJ7MTI6IGFiY30iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UobXVsdGlfaXRlbV9tYXBfdG9fc3RyaW5nKSB7CisgIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IG07CisgIG1bMTJdID0gImFiYyI7CisgIG1bMzFdID0gInh5eiI7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhtKSwgInsxMjogYWJjLCAzMTogeHl6fSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShlbXB0eV9zZXRfdG9fc3RyaW5nKSB7CisgIHN0ZDo6c2V0PGNoYXI+IHM7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhzKSwgInt9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNpbmdsZV9pdGVtX3NldF90b19zdHJpbmcpIHsKKyAgc3RkOjpzZXQ8Y2hhcj4gczsKKyAgcy5pbnNlcnQoJ2MnKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKHMpLCAie2N9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKG11bHRpX2l0ZW1fc2V0X3RvX3N0cmluZykgeworICBzdGQ6OnNldDxjaGFyPiBzOworICBzLmluc2VydCgnYScpOworICBzLmluc2VydCgneicpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcocyksICJ7YSwgen0iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX2VtcHR5X29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpFbXB0eVN0cnVjdCBlOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoZSksICJFbXB0eVN0cnVjdCgpIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGdlbmVyYXRlZF9zaW5nbGVfYmFzaWNfZmllbGRfb2JqZWN0X3RvX3N0cmluZykgeworICB0aHJpZnQ6OnRlc3Q6OlN0cnVjdEEgYTsKKyAgYS5fX3NldF9zKCJhYmNkIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIlN0cnVjdEEocz1hYmNkKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfdHdvX2Jhc2ljX2ZpZWxkc19vYmplY3RfdG9fc3RyaW5nKSB7CisgIHRocmlmdDo6dGVzdDo6Qm9uayBhOworICBhLl9fc2V0X21lc3NhZ2UoImFiY2QiKTsKKyAgYS5fX3NldF90eXBlKDEyMzQpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJCb25rKG1lc3NhZ2U9YWJjZCwgdHlwZT0xMjM0KSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfb3B0aW9uYWxfZmllbGRzX29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpUcmlja3kyIGE7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIlRyaWNreTIoaW1fb3B0aW9uYWw9PG51bGw+KSIpOworICBhLl9fc2V0X2ltX29wdGlvbmFsKDEyMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIlRyaWNreTIoaW1fb3B0aW9uYWw9MTIzKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfbmVzdGVkX29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpPbmVGaWVsZCBhOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJPbmVGaWVsZChmaWVsZD1FbXB0eVN0cnVjdCgpKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfbmVzdGVkX2xpc3Rfb2JqZWN0X3RvX3N0cmluZykgeworICB0aHJpZnQ6OnRlc3Q6Okxpc3RCb25rcyBsOworICBsLmJvbmsuYXNzaWduKDIsIHRocmlmdDo6dGVzdDo6Qm9uaygpKTsKKyAgbC5ib25rWzBdLl9fc2V0X21lc3NhZ2UoImEiKTsKKyAgbC5ib25rWzFdLl9fc2V0X21lc3NhZ2UoImIiKTsKKworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksCisgICAgICAgICAgICAgICAgICAgICJMaXN0Qm9ua3MoYm9uaz1bQm9uayhtZXNzYWdlPWEsIHR5cGU9MCksIEJvbmsobWVzc2FnZT1iLCB0eXBlPTApXSkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxOTU0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0LmNwcApAQCAtMCwwICsxLDEwOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxib29zdC9tcGwvbGlzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5kb20uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmg+CisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK3N0YXRpYyBib29zdDo6bXQxOTkzNyBybmc7CisKK3ZvaWQgaW5pdHJhbmQodW5zaWduZWQgaW50IHNlZWQpIHsKKyAgcm5nLnNlZWQoc2VlZCk7Cit9CisKK2NsYXNzIFNpemVHZW5lcmF0b3IgeworcHVibGljOgorICB2aXJ0dWFsIH5TaXplR2VuZXJhdG9yKCkge30KKyAgdmlydHVhbCB1aW50MzJfdCBuZXh0U2l6ZSgpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0ID0gMDsKK307CisKK2NsYXNzIENvbnN0YW50U2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgQ29uc3RhbnRTaXplR2VuZXJhdG9yKHVpbnQzMl90IHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KKyAgdWludDMyX3QgbmV4dFNpemUoKSB7IHJldHVybiB2YWx1ZV87IH0KKyAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGRlc2M7CisgICAgZGVzYyA8PCB2YWx1ZV87CisgICAgcmV0dXJuIGRlc2Muc3RyKCk7CisgIH0KKworcHJpdmF0ZToKKyAgdWludDMyX3QgdmFsdWVfOworfTsKKworY2xhc3MgUmFuZG9tU2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgUmFuZG9tU2l6ZUdlbmVyYXRvcih1aW50MzJfdCBtaW4sIHVpbnQzMl90IG1heCkKKyAgICA6IGdlbmVyYXRvcl8ocm5nLCBib29zdDo6dW5pZm9ybV9pbnQ8aW50PihtaW4sIG1heCkpIHt9CisKKyAgdWludDMyX3QgbmV4dFNpemUoKSB7IHJldHVybiBnZW5lcmF0b3JfKCk7IH0KKworICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gZGVzYzsKKyAgICBkZXNjIDw8ICJyYW5kKCIgPDwgZ2V0TWluKCkgPDwgIiwgIiA8PCBnZXRNYXgoKSA8PCAiKSI7CisgICAgcmV0dXJuIGRlc2Muc3RyKCk7CisgIH0KKworICB1aW50MzJfdCBnZXRNaW4oKSBjb25zdCB7IHJldHVybiAoZ2VuZXJhdG9yXy5kaXN0cmlidXRpb24oKS5taW4pKCk7IH0KKyAgdWludDMyX3QgZ2V0TWF4KCkgY29uc3QgeyByZXR1cm4gKGdlbmVyYXRvcl8uZGlzdHJpYnV0aW9uKCkubWF4KSgpOyB9CisKK3ByaXZhdGU6CisgIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjxib29zdDo6bXQxOTkzNyYsIGJvb3N0Ojp1bmlmb3JtX2ludDxpbnQ+ID4gZ2VuZXJhdG9yXzsKK307CisKKy8qKgorICogVGhpcyBjbGFzcyBleGlzdHMgc29sZWx5IHRvIG1ha2UgdGhlIFRFU1RfUlcoKSBtYWNybyBlYXNpZXIgdG8gdXNlLgorICogLSBpdCBjYW4gYmUgY29uc3RydWN0ZWQgaW1wbGljaXRseSBmcm9tIGFuIGludGVnZXIKKyAqIC0gaXQgY2FuIGNvbnRhaW4gZWl0aGVyIGEgQ29uc3RhbnRTaXplR2VuZXJhdG9yIG9yIGEgUmFuZG9tU2l6ZUdlbmVyYXRvcgorICogICAoVEVTVF9SVyBjYW4ndCB0YWtlIGEgU2l6ZUdlbmVyYXRvciBwb2ludGVyIG9yIHJlZmVyZW5jZSwgc2luY2UgaXQgbmVlZHMKKyAqICAgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGdlbmVyYXRvciB0byBiaW5kIGl0IHRvIHRoZSB0ZXN0IGZ1bmN0aW9uLikKKyAqLworY2xhc3MgR2VuZXJpY1NpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7CitwdWJsaWM6CisgIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IHZhbHVlKSA6IGdlbmVyYXRvcl8obmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcih2YWx1ZSkpIHt9CisgIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KQorICAgIDogZ2VuZXJhdG9yXyhuZXcgUmFuZG9tU2l6ZUdlbmVyYXRvcihtaW4sIG1heCkpIHt9CisKKyAgdWludDMyX3QgbmV4dFNpemUoKSB7IHJldHVybiBnZW5lcmF0b3JfLT5uZXh0U2l6ZSgpOyB9CisgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgeyByZXR1cm4gZ2VuZXJhdG9yXy0+ZGVzY3JpYmUoKTsgfQorCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gZ2VuZXJhdG9yXzsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2xhc3NlcyB0byBzZXQgdXAgY291cGxlZCB0cmFuc3BvcnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIHJlcHJlc2VudCBhIGNvdXBsZWQgcGFpciBvZiB0cmFuc3BvcnRzLgorICoKKyAqIERhdGEgd3JpdHRlbiB0byB0aGUgb3V0IHRyYW5zcG9ydCBjYW4gYmUgcmVhZCBmcm9tIHRoZSBpbiB0cmFuc3BvcnQuCisgKgorICogVGhpcyBpcyB1c2VkIGFzIHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgdmFyaW91cyBjb3VwbGVkIHRyYW5zcG9ydAorICogaW1wbGVtZW50YXRpb25zLiAgSXQgc2hvdWxkbid0IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CitjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cyB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkNvdXBsZWRUcmFuc3BvcnRzKCkge30KKyAgdHlwZWRlZiBUcmFuc3BvcnRfIFRyYW5zcG9ydFR5cGU7CisKKyAgQ291cGxlZFRyYW5zcG9ydHMoKSA6IGluKCksIG91dCgpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IGluOworICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gb3V0OworCitwcml2YXRlOgorICBDb3VwbGVkVHJhbnNwb3J0cyhjb25zdCBDb3VwbGVkVHJhbnNwb3J0cyYpOworICBDb3VwbGVkVHJhbnNwb3J0cyYgb3BlcmF0b3I9KGNvbnN0IENvdXBsZWRUcmFuc3BvcnRzJik7Cit9OworCisvKioKKyAqIENvdXBsZWQgVE1lbW9yeUJ1ZmZlcnMKKyAqLworY2xhc3MgQ291cGxlZE1lbW9yeUJ1ZmZlcnMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VE1lbW9yeUJ1ZmZlcj4geworcHVibGljOgorICBDb3VwbGVkTWVtb3J5QnVmZmVycygpIDogYnVmKG5ldyBUTWVtb3J5QnVmZmVyKSB7CisgICAgaW4gPSBidWY7CisgICAgb3V0ID0gYnVmOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjsKK307CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIGNsYXNzIGZvciBjcmVhdGluZyBjb3VwbGVkIHRyYW5zcG9ydHMgdGhhdCB3cmFwCisgKiBhbm90aGVyIHRyYW5zcG9ydC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFdyYXBwZXJUcmFuc3BvcnRfLCBjbGFzcyBJbm5lckNvdXBsZWRUcmFuc3BvcnRzXz4KK2NsYXNzIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1QgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8V3JhcHBlclRyYW5zcG9ydF8+IHsKK3B1YmxpYzoKKyAgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVCgpIHsKKyAgICBpZiAoaW5uZXJfLmluKSB7CisgICAgICB0aGlzLT5pbi5yZXNldChuZXcgV3JhcHBlclRyYW5zcG9ydF8oaW5uZXJfLmluKSk7CisgICAgfQorICAgIGlmIChpbm5lcl8ub3V0KSB7CisgICAgICB0aGlzLT5vdXQucmVzZXQobmV3IFdyYXBwZXJUcmFuc3BvcnRfKGlubmVyXy5vdXQpKTsKKyAgICB9CisgIH0KKworICBJbm5lckNvdXBsZWRUcmFuc3BvcnRzXyBpbm5lcl87Cit9OworCisvKioKKyAqIENvdXBsZWQgVEJ1ZmZlcmVkVHJhbnNwb3J0cy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIElubmVyVHJhbnNwb3J0Xz4KK2NsYXNzIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUCisgICAgOiBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxUQnVmZmVyZWRUcmFuc3BvcnQsIElubmVyVHJhbnNwb3J0Xz4ge307CisKK3R5cGVkZWYgQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZE1lbW9yeUJ1ZmZlcnM+IENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHM7CisKKy8qKgorICogQ291cGxlZCBURnJhbWVkVHJhbnNwb3J0cy4KKyAqLwordGVtcGxhdGUgPGNsYXNzIElubmVyVHJhbnNwb3J0Xz4KK2NsYXNzIENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVAorICAgIDogcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEZyYW1lZFRyYW5zcG9ydCwgSW5uZXJUcmFuc3BvcnRfPiB7fTsKKwordHlwZWRlZiBDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1Q8Q291cGxlZE1lbW9yeUJ1ZmZlcnM+IENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzOworCisvKioKKyAqIENvdXBsZWQgVFpsaWJUcmFuc3BvcnRzLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgSW5uZXJUcmFuc3BvcnRfPgorY2xhc3MgQ291cGxlZFpsaWJUcmFuc3BvcnRzVCA6IHB1YmxpYyBDb3VwbGVkV3JhcHBlclRyYW5zcG9ydHNUPFRabGliVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHt9OworCit0eXBlZGVmIENvdXBsZWRabGliVHJhbnNwb3J0c1Q8Q291cGxlZE1lbW9yeUJ1ZmZlcnM+IENvdXBsZWRabGliVHJhbnNwb3J0czsKKworI2lmbmRlZiBfV0lOMzIKKy8vIEZEIHRyYW5zcG9ydCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSBvbiBXaW5kb3dzLgorLyoqCisgKiBDb3VwbGVkIFRGRFRyYW5zcG9ydHMuCisgKi8KK2NsYXNzIENvdXBsZWRGRFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VEZEVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIENvdXBsZWRGRFRyYW5zcG9ydHMoKSB7CisgICAgaW50IHBpcGVzWzJdOworCisgICAgaWYgKHBpcGUocGlwZXMpICE9IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbi5yZXNldChuZXcgVEZEVHJhbnNwb3J0KHBpcGVzWzBdLCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpKTsKKyAgICBvdXQucmVzZXQobmV3IFRGRFRyYW5zcG9ydChwaXBlc1sxXSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSk7CisgIH0KK307CisjZWxzZQorLyoqCisgKiBDb3VwbGVkIHBpcGUgdHJhbnNwb3J0cworICovCitjbGFzcyBDb3VwbGVkUGlwZVRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFBpcGU+IHsKK3B1YmxpYzoKKyAgSEFORExFIGhSZWFkOworICBIQU5ETEUgaFdyaXRlOworCisgIENvdXBsZWRQaXBlVHJhbnNwb3J0cygpIHsKKyAgICBCT09TVF9SRVFVSVJFKENyZWF0ZVBpcGUoJmhSZWFkLCAmaFdyaXRlLCBOVUxMLCAxMDQ4NTc2ICogMikpOworICAgIGluLnJlc2V0KG5ldyBUUGlwZShoUmVhZCwgaFdyaXRlKSk7CisgICAgaW4tPm9wZW4oKTsKKyAgICBvdXQgPSBpbjsKKyAgfQorfTsKKyNlbmRpZgorCisvKioKKyAqIENvdXBsZWQgVFNvY2tldHMKKyAqLworY2xhc3MgQ291cGxlZFNvY2tldFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFNvY2tldD4geworcHVibGljOgorICBDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygpIHsKKyAgICBUSFJJRlRfU09DS0VUIHNvY2tldHNbMl0gPSB7MH07CisgICAgaWYgKFRIUklGVF9TT0NLRVRQQUlSKFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzb2NrZXRzKSAhPSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW4ucmVzZXQobmV3IFRTb2NrZXQoc29ja2V0c1swXSkpOworICAgIG91dC5yZXNldChuZXcgVFNvY2tldChzb2NrZXRzWzFdKSk7CisgICAgb3V0LT5zZXRTZW5kVGltZW91dCgxMDApOworICB9Cit9OworCisvLyBUaGVzZSBjb3VsZCBiZSBtYWRlIHRvIHdvcmsgb24gV2luZG93cywgYnV0IEkgZG9uJ3QgY2FyZSBlbm91Z2ggdG8gbWFrZSBpdCBoYXBwZW4KKyNpZm5kZWYgX1dJTjMyCisvKioKKyAqIENvdXBsZWQgVEZpbGVUcmFuc3BvcnRzCisgKi8KK2NsYXNzIENvdXBsZWRGaWxlVHJhbnNwb3J0cyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxURmlsZVRyYW5zcG9ydD4geworcHVibGljOgorICBDb3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7CisjaWZuZGVmIF9XSU4zMgorICAgIGNvbnN0IGNoYXIqIHRtcF9kaXIgPSAiL3RtcCI7CisjZGVmaW5lIEZJTEVOQU1FX1NVRkZJWCAiL3RocmlmdC50cmFuc3BvcnRfdGVzdCIKKyNlbHNlCisgICAgY29uc3QgY2hhciogdG1wX2RpciA9IGdldGVudigiVE1QIik7CisjZGVmaW5lIEZJTEVOQU1FX1NVRkZJWCAiXFx0aHJpZnQudHJhbnNwb3J0X3Rlc3QiCisjZW5kaWYKKworICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQorICAgIGZpbGVuYW1lLnJlc2l6ZShzdHJsZW4odG1wX2RpcikgKyBzdHJsZW4oRklMRU5BTUVfU1VGRklYKSk7CisgICAgVEhSSUZUX1NOUFJJTlRGKCZmaWxlbmFtZVswXSwgZmlsZW5hbWUuc2l6ZSgpLCAiJXMiIEZJTEVOQU1FX1NVRkZJWCwgdG1wX2Rpcik7CisjdW5kZWYgRklMRU5BTUVfU1VGRklYCisKKyAgICB7IHN0ZDo6b2ZzdHJlYW0gZHVtbXlfY3JlYXRpb24oZmlsZW5hbWUuY19zdHIoKSwgc3RkOjpvZnN0cmVhbTo6dHJ1bmMpOyB9CisKKyAgICBpbi5yZXNldChuZXcgVEZpbGVUcmFuc3BvcnQoZmlsZW5hbWUsIHRydWUpKTsKKyAgICBvdXQucmVzZXQobmV3IFRGaWxlVHJhbnNwb3J0KGZpbGVuYW1lKSk7CisgIH0KKworICB+Q291cGxlZEZpbGVUcmFuc3BvcnRzKCkgeyByZW1vdmUoZmlsZW5hbWUuY19zdHIoKSk7IH0KKworICBzdGQ6OnN0cmluZyBmaWxlbmFtZTsKK307CisjZW5kaWYKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBhbm90aGVyIENvdXBsZWRUcmFuc3BvcnRzIGltcGxlbWVudGF0aW9uIHRoYXQgZXhwb3NlcyB0aGUKKyAqIHRyYW5zcG9ydHMgYXMgVFRyYW5zcG9ydCBwb2ludGVycy4KKyAqCisgKiBUaGlzIGlzIHVzZWQgc2luY2UgYWNjZXNzaW5nIGEgdHJhbnNwb3J0IHZpYSBhICJUVHJhbnNwb3J0KiIgZXhlcmNpc2VzIGEKKyAqIGRpZmZlcmVudCBjb2RlIHBhdGggdGhhbiB1c2luZyB0aGUgYmFzZSBwb2ludGVyIGNsYXNzLiAgQXMgcGFydCBvZiB0aGUKKyAqIHRlbXBsYXRlIGNvZGUgY2hhbmdlcywgbW9zdCB0cmFuc3BvcnQgbWV0aG9kcyBhcmUgbm8gbG9uZ2VyIHZpcnR1YWwuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0c18+CitjbGFzcyBDb3VwbGVkVFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFRyYW5zcG9ydD4geworcHVibGljOgorICBDb3VwbGVkVFRyYW5zcG9ydHMoKSA6IHRyYW5zcG9ydHMoKSB7CisgICAgaW4gPSB0cmFuc3BvcnRzLmluOworICAgIG91dCA9IHRyYW5zcG9ydHMub3V0OworICB9CisKKyAgQ291cGxlZFRyYW5zcG9ydHNfIHRyYW5zcG9ydHM7Cit9OworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGFub3RoZXIgQ291cGxlZFRyYW5zcG9ydHMgaW1wbGVtZW50YXRpb24gdGhhdCBleHBvc2VzIHRoZQorICogdHJhbnNwb3J0cyBhcyBUQnVmZmVyQmFzZSBwb2ludGVycy4KKyAqCisgKiBUaGlzIGNhbiBvbmx5IGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgdHJhbnNwb3J0IHR5cGUgdGhhdCBpcyBhIHN1YmNsYXNzIG9mCisgKiBUQnVmZmVyQmFzZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzXz4KK2NsYXNzIENvdXBsZWRCdWZmZXJCYXNlcyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxUQnVmZmVyQmFzZT4geworcHVibGljOgorICBDb3VwbGVkQnVmZmVyQmFzZXMoKSA6IHRyYW5zcG9ydHMoKSB7CisgICAgaW4gPSB0cmFuc3BvcnRzLmluOworICAgIG91dCA9IHRyYW5zcG9ydHMub3V0OworICB9CisKKyAgQ291cGxlZFRyYW5zcG9ydHNfIHRyYW5zcG9ydHM7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFsYXJtIGhhbmRsaW5nIGNvZGUgZm9yIHVzZSBpbiB0ZXN0cyB0aGF0IGNoZWNrIHRoZSB0cmFuc3BvcnQgYmxvY2tpbmcKKyAqIHNlbWFudGljcy4KKyAqCisgKiBJZiB0aGUgdHJhbnNwb3J0IGVuZHMgdXAgYmxvY2tpbmcsIHdlIGRvbid0IHdhbnQgdG8gaGFuZyBmb3JldmVyLiAgV2UgdXNlCisgKiBTSUdBTFJNIHRvIGZpcmUgc2NoZWR1bGUgc2lnbmFsIHRvIHdha2UgdXAgYW5kIHRyeSB0byB3cml0ZSBkYXRhIHNvIHRoZQorICogdHJhbnNwb3J0IHdpbGwgdW5ibG9jay4KKyAqCisgKiBJdCBpc24ndCByZWFsbHkgdGhlIHNhZmVzdCB0aGluZyBpbiB0aGUgd29ybGQgdG8gYmUgbXVja2luZyBhcm91bmQgd2l0aAorICogY29tcGxpY2F0ZWQgZ2xvYmFsIGRhdGEgc3RydWN0dXJlcyBpbiBhIHNpZ25hbCBoYW5kbGVyLiAgSXQgc2hvdWxkIHByb2JhYmx5CisgKiBiZSBva2F5IHRob3VnaCwgc2luY2Ugd2Uga25vdyB0aGUgbWFpbiB0aHJlYWQgc2hvdWxkIGFsd2F5cyBiZSBibG9ja2VkIGluIGEKKyAqIHJlYWQoKSByZXF1ZXN0IHdoZW4gdGhlIHNpZ25hbCBoYW5kbGVyIGlzIHJ1bm5pbmcuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBUcmlnZ2VySW5mbyB7CisgIFRyaWdnZXJJbmZvKGludCBzZWNvbmRzLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwgdWludDMyX3Qgd3JpdGVMZW5ndGgpCisgICAgOiB0aW1lb3V0U2Vjb25kcyhzZWNvbmRzKSwgdHJhbnNwb3J0KHRyYW5zcG9ydCksIHdyaXRlTGVuZ3RoKHdyaXRlTGVuZ3RoKSwgbmV4dChOVUxMKSB7fQorCisgIGludCB0aW1lb3V0U2Vjb25kczsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgdWludDMyX3Qgd3JpdGVMZW5ndGg7CisgIFRyaWdnZXJJbmZvKiBuZXh0OworfTsKKworYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdfYWxhcm1fbW9uaXRvcjsKK1RyaWdnZXJJbmZvKiBnX3RyaWdnZXJJbmZvOwordW5zaWduZWQgaW50IGdfbnVtVHJpZ2dlcnNGaXJlZDsKK2Jvb2wgZ190ZWFyZG93biA9IGZhbHNlOworCit2b2lkIGFsYXJtX2hhbmRsZXIoKSB7CisgIFRyaWdnZXJJbmZvKiBpbmZvID0gTlVMTDsKKyAgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKKyAgICAvLyBUaGUgYWxhcm0gdGltZWQgb3V0LCB3aGljaCBhbG1vc3QgY2VydGFpbmx5IG1lYW5zIHdlJ3JlIHN0dWNrCisgICAgLy8gb24gYSB0cmFuc3BvcnQgdGhhdCBpcyBpbmNvcnJlY3RseSBibG9ja2VkLgorICAgICsrZ19udW1UcmlnZ2Vyc0ZpcmVkOworCisgICAgLy8gTm90ZTogd2UgcHJpbnQgbWVzc2FnZXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLCBzaW5jZQorICAgIC8vIHRvb2xzL3Rlc3QvcnVubmVyIG9ubHkgcmVjb3JkcyBzdGRvdXQgbWVzc2FnZXMgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZXMgZm9yCisgICAgLy8gYm9vc3QgdGVzdHMuICAoYm9vc3QgcHJpbnRzIGl0cyB0ZXN0IGluZm8gdG8gc3Rkb3V0LikKKyAgICBwcmludGYoIlRpbWVvdXQgYWxhcm0gZXhwaXJlZDsgYXR0ZW1wdGluZyB0byB1bmJsb2NrIHRyYW5zcG9ydFxuIik7CisgICAgaWYgKGdfdHJpZ2dlckluZm8gPT0gTlVMTCkgeworICAgICAgcHJpbnRmKCIgIHRyaWdnZXIgc3RhY2sgaXMgZW1wdHkhXG4iKTsKKyAgICB9CisKKyAgICAvLyBQb3Agb2ZmIHRoZSBmaXJzdCBUcmlnZ2VySW5mby4KKyAgICAvLyBJZiB0aGVyZSBpcyBhbm90aGVyIG9uZSwgc2NoZWR1bGUgYW4gYWxhcm0gZm9yIGl0LgorICAgIGluZm8gPSBnX3RyaWdnZXJJbmZvOworICAgIGdfdHJpZ2dlckluZm8gPSBpbmZvLT5uZXh0OworICB9CisKKyAgLy8gV3JpdGUgc29tZSBkYXRhIHRvIHRoZSB0cmFuc3BvcnQgdG8gaG9wZWZ1bGx5IHVuYmxvY2sgaXQuCisgIHVpbnQ4X3QqIGJ1ZiA9IG5ldyB1aW50OF90W2luZm8tPndyaXRlTGVuZ3RoXTsKKyAgbWVtc2V0KGJ1ZiwgJ2InLCBpbmZvLT53cml0ZUxlbmd0aCk7CisgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gYXJyYXkoYnVmKTsKKyAgaW5mby0+dHJhbnNwb3J0LT53cml0ZShidWYsIGluZm8tPndyaXRlTGVuZ3RoKTsKKyAgaW5mby0+dHJhbnNwb3J0LT5mbHVzaCgpOworCisgIGRlbGV0ZSBpbmZvOworfQorCit2b2lkIGFsYXJtX2hhbmRsZXJfd3JhcHBlcigpIHsKKyAgaW50NjRfdCB0aW1lb3V0ID0gMDsgLy8gdGltZW91dCBvZiAwIG1lYW5zIHdhaXQgZm9yZXZlcgorICB3aGlsZSAodHJ1ZSkgeworICAgIGJvb2wgZmlyZUhhbmRsZXIgPSBmYWxzZTsKKyAgICB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgICBpZiAoZ190ZWFyZG93bikKKyAgICAgICAgcmV0dXJuOworICAgICAgLy8gY2FsY3VsYXRlIHRpbWVvdXQKKyAgICAgIGlmIChnX3RyaWdnZXJJbmZvID09IE5VTEwpIHsKKyAgICAgICAgdGltZW91dCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aW1lb3V0ID0gZ190cmlnZ2VySW5mby0+dGltZW91dFNlY29uZHMgKiAxMDAwOworICAgICAgfQorCisgICAgICBpbnQgd2FpdFJlc3VsdCA9IGdfYWxhcm1fbW9uaXRvci53YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXQpOworICAgICAgaWYgKHdhaXRSZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkKKyAgICAgICAgZmlyZUhhbmRsZXIgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZmlyZUhhbmRsZXIpCisgICAgICBhbGFybV9oYW5kbGVyKCk7IC8vIGNhbGxpbmcgb3V0c2lkZSB0aGUgbG9jaworICB9Cit9CisKKy8qKgorICogQWRkIGEgdHJpZ2dlciB0byBiZSBzY2hlZHVsZWQgInNlY29uZHMiIHNlY29uZHMgYWZ0ZXIgdGhlCisgKiBsYXN0IGN1cnJlbnRseSBzY2hlZHVsZWQgdHJpZ2dlci4KKyAqCisgKiAoTm90ZSB0aGF0IHRoaXMgaXMgbm90ICJzZWNvbmRzIiBmcm9tIG5vdy4gIFRoYXQgbWlnaHQgYmUgbW9yZSBsb2dpY2FsLCBidXQKKyAqIHdvdWxkIHJlcXVpcmUgc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBzb3J0aW5nLCByYXRoZXIgdGhhbiBqdXN0IGFwcGVuZGluZworICogdG8gdGhlIGVuZC4pCisgKi8KK3ZvaWQgYWRkX3RyaWdnZXIodW5zaWduZWQgaW50IHNlY29uZHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9sZW4pIHsKKyAgVHJpZ2dlckluZm8qIGluZm8gPSBuZXcgVHJpZ2dlckluZm8oc2Vjb25kcywgdHJhbnNwb3J0LCB3cml0ZV9sZW4pOworICB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhnX2FsYXJtX21vbml0b3IpOworICAgIGlmIChnX3RyaWdnZXJJbmZvID09IE5VTEwpIHsKKyAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHRyaWdnZXIuCisgICAgICAvLyBTZXQgZ190cmlnZ2VySW5mbywgYW5kIHNjaGVkdWxlIHRoZSBhbGFybQorICAgICAgZ190cmlnZ2VySW5mbyA9IGluZm87CisgICAgICBnX2FsYXJtX21vbml0b3Iubm90aWZ5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEFkZCB0aGlzIHRyaWdnZXIgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgICAgVHJpZ2dlckluZm8qIHByZXYgPSBnX3RyaWdnZXJJbmZvOworICAgICAgd2hpbGUgKHByZXYtPm5leHQpIHsKKyAgICAgICAgcHJldiA9IHByZXYtPm5leHQ7CisgICAgICB9CisgICAgICBwcmV2LT5uZXh0ID0gaW5mbzsKKyAgICB9CisgIH0KK30KKwordm9pZCBjbGVhcl90cmlnZ2VycygpIHsKKyAgVHJpZ2dlckluZm8qIGluZm8gPSBOVUxMOworCisgIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgaW5mbyA9IGdfdHJpZ2dlckluZm87CisgICAgZ190cmlnZ2VySW5mbyA9IE5VTEw7CisgICAgZ19udW1UcmlnZ2Vyc0ZpcmVkID0gMDsKKyAgICBnX2FsYXJtX21vbml0b3Iubm90aWZ5KCk7CisgIH0KKworICB3aGlsZSAoaW5mbyAhPSBOVUxMKSB7CisgICAgVHJpZ2dlckluZm8qIG5leHQgPSBpbmZvLT5uZXh0OworICAgIGRlbGV0ZSBpbmZvOworICAgIGluZm8gPSBuZXh0OworICB9Cit9CisKK3ZvaWQgc2V0X3RyaWdnZXIodW5zaWduZWQgaW50IHNlY29uZHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9sZW4pIHsKKyAgY2xlYXJfdHJpZ2dlcnMoKTsKKyAgYWRkX3RyaWdnZXIoc2Vjb25kcywgdHJhbnNwb3J0LCB3cml0ZV9sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3QgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVGVzdCBpbnRlcmxlYXZlZCB3cml0ZSBhbmQgcmVhZCBjYWxscy4KKyAqCisgKiBHZW5lcmF0ZXMgYSBidWZmZXIgdG90YWxTaXplIGJ5dGVzIGxvbmcsIHRoZW4gd3JpdGVzIGl0IHRvIHRoZSB0cmFuc3BvcnQsCisgKiBhbmQgdmVyaWZpZXMgdGhlIHdyaXR0ZW4gZGF0YSBjYW4gYmUgcmVhZCBiYWNrIGNvcnJlY3RseS4KKyAqCisgKiBNb2RlIG9mIG9wZXJhdGlvbjoKKyAqIC0gY2FsbCB3Q2h1bmtHZW5lcmF0b3IgdG8gZmlndXJlIG91dCBob3cgbGFyZ2Ugb2YgYSBjaHVuayB0byB3cml0ZQorICogICAtIGNhbGwgd1NpemVHZW5lcmF0b3IgdG8gZ2V0IHRoZSBzaXplIGZvciBpbmRpdmlkdWFsIHdyaXRlKCkgY2FsbHMsCisgKiAgICAgYW5kIGRvIHRoaXMgcmVwZWF0ZWRseSB1bnRpbCB0aGUgZW50aXJlIGNodW5rIGlzIHdyaXR0ZW4uCisgKiAtIGNhbGwgckNodW5rR2VuZXJhdG9yIHRvIGZpZ3VyZSBvdXQgaG93IGxhcmdlIG9mIGEgY2h1bmsgdG8gcmVhZAorICogICAtIGNhbGwgclNpemVHZW5lcmF0b3IgdG8gZ2V0IHRoZSBzaXplIGZvciBpbmRpdmlkdWFsIHJlYWQoKSBjYWxscywKKyAqICAgICBhbmQgZG8gdGhpcyByZXBlYXRlZGx5IHVudGlsIHRoZSBlbnRpcmUgY2h1bmsgaXMgcmVhZC4KKyAqIC0gcmVwZWF0IHVudGlsIHRoZSBmdWxsIGJ1ZmZlciBpcyB3cml0dGVuIGFuZCByZWFkIGJhY2ssCisgKiAgIHRoZW4gY29tcGFyZSB0aGUgZGF0YSByZWFkIGJhY2sgYWdhaW5zdCB0aGUgb3JpZ2luYWwgYnVmZmVyCisgKgorICoKKyAqIC0gSWYgYW55IG9mIHRoZSBzaXplIGdlbmVyYXRvcnMgcmV0dXJuIDAsIHRoaXMgbWVhbnMgdG8gdXNlIHRoZSBtYXhpbXVtCisgKiAgIHBvc3NpYmxlIHNpemUuCisgKgorICogLSBJZiBtYXhPdXRzdGFuZGluZyBpcyBub24temVybywgd3JpdGUgY2h1bmsgc2l6ZXMgd2lsbCBiZSBjaG9zZW4gc3VjaCB0aGF0CisgKiAgIHRoZXJlIGFyZSBuZXZlciBtb3JlIHRoYW4gbWF4T3V0c3RhbmRpbmcgYnl0ZXMgd2FpdGluZyB0byBiZSByZWFkIGJhY2suCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KK3ZvaWQgdGVzdF9ydyh1aW50MzJfdCB0b3RhbFNpemUsCisgICAgICAgICAgICAgU2l6ZUdlbmVyYXRvciYgd1NpemVHZW5lcmF0b3IsCisgICAgICAgICAgICAgU2l6ZUdlbmVyYXRvciYgclNpemVHZW5lcmF0b3IsCisgICAgICAgICAgICAgU2l6ZUdlbmVyYXRvciYgd0NodW5rR2VuZXJhdG9yLAorICAgICAgICAgICAgIFNpemVHZW5lcmF0b3ImIHJDaHVua0dlbmVyYXRvciwKKyAgICAgICAgICAgICB1aW50MzJfdCBtYXhPdXRzdGFuZGluZykgeworICBDb3VwbGVkVHJhbnNwb3J0cyB0cmFuc3BvcnRzOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMuaW4gIT0gTlVMTCk7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5vdXQgIT0gTlVMTCk7CisKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiB3YnVmID0gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiByYnVmID0gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKKworICAvLyBzdG9yZSBzb21lIGRhdGEgaW4gd2J1ZgorICBmb3IgKHVpbnQzMl90IG4gPSAwOyBuIDwgdG90YWxTaXplOyArK24pIHsKKyAgICB3YnVmW25dID0gKG4gJiAweGZmKTsKKyAgfQorICAvLyBjbGVhciByYnVmCisgIG1lbXNldChyYnVmLmdldCgpLCAwLCB0b3RhbFNpemUpOworCisgIHVpbnQzMl90IHRvdGFsX3dyaXR0ZW4gPSAwOworICB1aW50MzJfdCB0b3RhbF9yZWFkID0gMDsKKyAgd2hpbGUgKHRvdGFsX3JlYWQgPCB0b3RhbFNpemUpIHsKKyAgICAvLyBEZXRlcm1pbmUgaG93IGxhcmdlIGEgY2h1bmsgb2YgZGF0YSB0byB3cml0ZQorICAgIHVpbnQzMl90IHdjaHVua19zaXplID0gd0NodW5rR2VuZXJhdG9yLm5leHRTaXplKCk7CisgICAgaWYgKHdjaHVua19zaXplID09IDAgfHwgd2NodW5rX3NpemUgPiB0b3RhbFNpemUgLSB0b3RhbF93cml0dGVuKSB7CisgICAgICB3Y2h1bmtfc2l6ZSA9IHRvdGFsU2l6ZSAtIHRvdGFsX3dyaXR0ZW47CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlICh0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZCkgKyB3Y2h1bmtfc2l6ZQorICAgIC8vIGlzIGxlc3MgdGhhbiBtYXhPdXRzdGFuZGluZworICAgIGlmIChtYXhPdXRzdGFuZGluZyA+IDAgJiYgd2NodW5rX3NpemUgPiBtYXhPdXRzdGFuZGluZyAtICh0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZCkpIHsKKyAgICAgIHdjaHVua19zaXplID0gbWF4T3V0c3RhbmRpbmcgLSAodG90YWxfd3JpdHRlbiAtIHRvdGFsX3JlYWQpOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBjaHVuaworICAgIHVpbnQzMl90IGNodW5rX3dyaXR0ZW4gPSAwOworICAgIHdoaWxlIChjaHVua193cml0dGVuIDwgd2NodW5rX3NpemUpIHsKKyAgICAgIHVpbnQzMl90IHdyaXRlX3NpemUgPSB3U2l6ZUdlbmVyYXRvci5uZXh0U2l6ZSgpOworICAgICAgaWYgKHdyaXRlX3NpemUgPT0gMCB8fCB3cml0ZV9zaXplID4gd2NodW5rX3NpemUgLSBjaHVua193cml0dGVuKSB7CisgICAgICAgIHdyaXRlX3NpemUgPSB3Y2h1bmtfc2l6ZSAtIGNodW5rX3dyaXR0ZW47CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRyYW5zcG9ydHMub3V0LT53cml0ZSh3YnVmLmdldCgpICsgdG90YWxfd3JpdHRlbiwgd3JpdGVfc2l6ZSk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgICBpZiAodGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgdGhyb3cgdGU7CisgICAgICB9CisgICAgICBjaHVua193cml0dGVuICs9IHdyaXRlX3NpemU7CisgICAgICB0b3RhbF93cml0dGVuICs9IHdyaXRlX3NpemU7CisgICAgfQorCisgICAgLy8gRmx1c2ggdGhlIGRhdGEsIHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSByZWFkIHRyYW5zcG9ydAorICAgIC8vIERvbid0IGZsdXNoIGlmIHdjaHVua19zaXplIGlzIDAuICAoVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYKKyAgICAvLyB0b3RhbF93cml0dGVuID09IHRvdGFsU2l6ZSBhbHJlYWR5LCBhbmQgd2UncmUgb25seSByZWFkaW5nIG5vdy4pCisgICAgaWYgKHdjaHVua19zaXplID4gMCkgeworICAgICAgdHJhbnNwb3J0cy5vdXQtPmZsdXNoKCk7CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIGhvdyBsYXJnZSBhIGNodW5rIG9mIGRhdGEgdG8gcmVhZCBiYWNrCisgICAgdWludDMyX3QgcmNodW5rX3NpemUgPSByQ2h1bmtHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICBpZiAocmNodW5rX3NpemUgPT0gMCB8fCByY2h1bmtfc2l6ZSA+IHRvdGFsX3dyaXR0ZW4gLSB0b3RhbF9yZWFkKSB7CisgICAgICByY2h1bmtfc2l6ZSA9IHRvdGFsX3dyaXR0ZW4gLSB0b3RhbF9yZWFkOworICAgIH0KKworICAgIC8vIFJlYWQgdGhlIGNodW5rCisgICAgdWludDMyX3QgY2h1bmtfcmVhZCA9IDA7CisgICAgd2hpbGUgKGNodW5rX3JlYWQgPCByY2h1bmtfc2l6ZSkgeworICAgICAgdWludDMyX3QgcmVhZF9zaXplID0gclNpemVHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICAgIGlmIChyZWFkX3NpemUgPT0gMCB8fCByZWFkX3NpemUgPiByY2h1bmtfc2l6ZSAtIGNodW5rX3JlYWQpIHsKKyAgICAgICAgcmVhZF9zaXplID0gcmNodW5rX3NpemUgLSBjaHVua19yZWFkOworICAgICAgfQorCisgICAgICBpbnQgYnl0ZXNfcmVhZCA9IC0xOworICAgICAgdHJ5IHsKKyAgICAgICAgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmJ1Zi5nZXQoKSArIHRvdGFsX3JlYWQsIHJlYWRfc2l6ZSk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBlKSB7CisgICAgICAgIEJPT1NUX0ZBSUwoInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwgcmVhZF9zaXplIDw8ICIpIHRocmV3IGV4Y2VwdGlvbiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlLndoYXQoKSA8PCAiXCI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4gPDwgIiAvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0b3RhbFNpemUgPDwgIiBieXRlcyIpOworICAgICAgfQorCisgICAgICBCT09TVF9SRVFVSVJFX01FU1NBR0UoYnl0ZXNfcmVhZCA+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQocG9zPSIgPDwgdG90YWxfcmVhZCA8PCAiLCBzaXplPSIgPDwgcmVhZF9zaXplIDw8ICIpIHJldHVybmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBieXRlc19yZWFkIDw8ICI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIC8gIiA8PCB0b3RhbFNpemUgPDwgIiBieXRlcyIpOworICAgICAgY2h1bmtfcmVhZCArPSBieXRlc19yZWFkOworICAgICAgdG90YWxfcmVhZCArPSBieXRlc19yZWFkOworICAgIH0KKyAgfQorCisgIC8vIG1ha2Ugc3VyZSB0aGUgZGF0YSByZWFkIGJhY2sgaXMgaWRlbnRpY2FsIHRvIHRoZSBkYXRhIHdyaXR0ZW4KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKHJidWYuZ2V0KCksIHdidWYuZ2V0KCksIHRvdGFsU2l6ZSksIDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHM+Cit2b2lkIHRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZSgpIHsKKyAgQ291cGxlZFRyYW5zcG9ydHMgdHJhbnNwb3J0czsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOworCisgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKKyAgdWludDhfdCByZWFkX2J1ZlsxNl07CisgIG1lbXNldCh3cml0ZV9idWYsICdhJywgc2l6ZW9mKHdyaXRlX2J1ZikpOworCisgIC8vIEF0dGVtcGluZyB0byByZWFkIDEwIGJ5dGVzIHdoZW4gb25seSA5IGFyZSBhdmFpbGFibGUgc2hvdWxkIHJldHVybiA5CisgIC8vIGltbWVkaWF0ZWx5LgorICB0cmFuc3BvcnRzLm91dC0+d3JpdGUod3JpdGVfYnVmLCA5KTsKKyAgdHJhbnNwb3J0cy5vdXQtPmZsdXNoKCk7CisgIHNldF90cmlnZ2VyKDMsIHRyYW5zcG9ydHMub3V0LCAxKTsKKyAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOworICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpOSk7CisKKyAgY2xlYXJfdHJpZ2dlcnMoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgordm9pZCB0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGVfaW5fY2h1bmtzKCkgeworICBDb3VwbGVkVHJhbnNwb3J0cyB0cmFuc3BvcnRzOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMuaW4gIT0gTlVMTCk7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5vdXQgIT0gTlVMTCk7CisKKyAgdWludDhfdCB3cml0ZV9idWZbMTZdOworICB1aW50OF90IHJlYWRfYnVmWzE2XTsKKyAgbWVtc2V0KHdyaXRlX2J1ZiwgJ2EnLCBzaXplb2Yod3JpdGVfYnVmKSk7CisKKyAgLy8gV3JpdGUgMTAgYnl0ZXMgKGluIGEgc2luZ2xlIGZyYW1lLCBmb3IgdHJhbnNwb3J0cyB0aGF0IHVzZSBmcmFtaW5nKQorICB0cmFuc3BvcnRzLm91dC0+d3JpdGUod3JpdGVfYnVmLCAxMCk7CisgIHRyYW5zcG9ydHMub3V0LT5mbHVzaCgpOworCisgIC8vIFJlYWQgMSBieXRlLCB0byBmb3JjZSB0aGUgdHJhbnNwb3J0IHRvIHJlYWQgdGhlIGZyYW1lCisgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgMXUpOworCisgIC8vIFJlYWQgbW9yZSB0aGFuIHdoYXQgaXMgcmVtYWluaW5nIGFuZCB2ZXJpZnkgdGhlIHRyYW5zcG9ydCBkb2VzIG5vdCBibG9jaworICBzZXRfdHJpZ2dlcigzLCB0cmFuc3BvcnRzLm91dCwgMSk7CisgIGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCAxMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgMHUpOworICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCA5dSk7CisKKyAgY2xlYXJfdHJpZ2dlcnMoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgordm9pZCB0ZXN0X3JlYWRfcGFydGlhbF9taWRmcmFtZSgpIHsKKyAgQ291cGxlZFRyYW5zcG9ydHMgdHJhbnNwb3J0czsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOworCisgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKKyAgdWludDhfdCByZWFkX2J1ZlsxNl07CisgIG1lbXNldCh3cml0ZV9idWYsICdhJywgc2l6ZW9mKHdyaXRlX2J1ZikpOworCisgIC8vIEF0dGVtcHQgdG8gcmVhZCAxMCBieXRlcywgd2hlbiBvbmx5IDkgYXJlIGF2YWlsYWJsZSwgYnV0IGFmdGVyIHdlIGhhdmUKKyAgLy8gYWxyZWFkeSByZWFkIHBhcnQgb2YgdGhlIGRhdGEgdGhhdCBpcyBhdmFpbGFibGUuICBUaGlzIGV4ZXJjaXNlcyBhCisgIC8vIGRpZmZlcmVudCBjb2RlIHBhdGggZm9yIHNldmVyYWwgb2YgdGhlIHRyYW5zcG9ydHMuCisgIC8vCisgIC8vIEZvciB0cmFuc3BvcnRzIHRoYXQgYWRkIHRoZWlyIG93biBmcmFtaW5nIChlLmcuLCBURnJhbWVkVHJhbnNwb3J0IGFuZAorICAvLyBURmlsZVRyYW5zcG9ydCksIHRoZSB0d28gZmx1c2ggY2FsbHMgYnJlYWsgdXAgdGhlIGRhdGEgaW4gdG8gYSAxMCBieXRlCisgIC8vIGZyYW1lIGFuZCBhIDMgYnl0ZSBmcmFtZS4gIFRoZSBmaXJzdCByZWFkIHRoZW4gcHV0cyB1cyBwYXJ0d2F5IHRocm91Z2ggdGhlCisgIC8vIGZpcnN0IGZyYW1lLCBhbmQgdGhlbiB3ZSBhdHRlbXB0IHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoYXQgZnJhbWUsIGFuZAorICAvLyB0aHJvdWdoIHRoZSBuZXh0IGZyYW1lLCB0b28uCisgIC8vCisgIC8vIEZvciBidWZmZXJlZCB0cmFuc3BvcnRzIHRoYXQgcGVyZm9ybSByZWFkLWFoZWFkIChlLmcuLAorICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQpLCB0aGUgcmVhZC1haGVhZCB3aWxsIG1vc3QgbGlrZWx5IHNlZSBhbGwgMTMgYnl0ZXMKKyAgLy8gd3JpdHRlbiBvbiB0aGUgZmlyc3QgcmVhZC4gIFRoZSBuZXh0IHJlYWQgd2lsbCB0aGVuIGF0dGVtcHQgdG8gcmVhZCBwYXN0CisgIC8vIHRoZSBlbmQgb2YgdGhlIHJlYWQtYWhlYWQgYnVmZmVyLgorICAvLworICAvLyBGbHVzaCAxMCBieXRlcywgdGhlbiAzIGJ5dGVzLiAgVGhpcyBjcmVhdGVzIDIgc2VwYXJhdGUgZnJhbWVzIGZvcgorICAvLyB0cmFuc3BvcnRzIHRoYXQgdHJhY2sgZnJhbWluZyBpbnRlcm5hbGx5LgorICB0cmFuc3BvcnRzLm91dC0+d3JpdGUod3JpdGVfYnVmLCAxMCk7CisgIHRyYW5zcG9ydHMub3V0LT5mbHVzaCgpOworICB0cmFuc3BvcnRzLm91dC0+d3JpdGUod3JpdGVfYnVmLCAzKTsKKyAgdHJhbnNwb3J0cy5vdXQtPmZsdXNoKCk7CisKKyAgLy8gTm93IHJlYWQgNCBieXRlcywgc28gdGhhdCB3ZSBhcmUgcGFydHdheSB0aHJvdWdoIHRoZSB3cml0dGVuIGRhdGEuCisgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCA0KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KTQpOworCisgIC8vIE5vdyBhdHRlbXB0IHRvIHJlYWQgMTAgYnl0ZXMuICBPbmx5IDkgbW9yZSBhcmUgYXZhaWxhYmxlLgorICAvLworICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYWxsIDkgYnl0ZXMsIGJ1dCBpdCBtaWdodCB0YWtlIG11bHRpcGxlIHJlYWQKKyAgLy8gY2FsbHMsIHNpbmNlIGl0IGlzIHZhbGlkIGZvciByZWFkKCkgdG8gcmV0dXJuIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkLgorICAvLyAoTW9zdCB0cmFuc3BvcnRzIGRvIGltbWVkaWF0ZWx5IHJldHVybiA5IGJ5dGVzLCBidXQgdGhlIGZyYW1pbmcgdHJhbnNwb3J0cworICAvLyB0ZW5kIHRvIG9ubHkgcmV0dXJuIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWUsIHdoaWNoIGlzIDYgYnl0ZXMgaW4KKyAgLy8gdGhpcyBjYXNlLikKKyAgdWludDMyX3QgdG90YWxfcmVhZCA9IDA7CisgIHdoaWxlICh0b3RhbF9yZWFkIDwgOSkgeworICAgIHNldF90cmlnZ2VyKDMsIHRyYW5zcG9ydHMub3V0LCAxKTsKKyAgICBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgMTApOworICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOworICAgIEJPT1NUX1JFUVVJUkVfR1QoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KTApOworICAgIHRvdGFsX3JlYWQgKz0gYnl0ZXNfcmVhZDsKKyAgICBCT09TVF9SRVFVSVJFX0xFKHRvdGFsX3JlYWQsICh1aW50MzJfdCk5KTsKKyAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvdGFsX3JlYWQsICh1aW50MzJfdCk5KTsKKworICBjbGVhcl90cmlnZ2VycygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHM+Cit2b2lkIHRlc3RfYm9ycm93X3BhcnRfYXZhaWxhYmxlKCkgeworICBDb3VwbGVkVHJhbnNwb3J0cyB0cmFuc3BvcnRzOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMuaW4gIT0gTlVMTCk7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5vdXQgIT0gTlVMTCk7CisKKyAgdWludDhfdCB3cml0ZV9idWZbMTZdOworICB1aW50OF90IHJlYWRfYnVmWzE2XTsKKyAgbWVtc2V0KHdyaXRlX2J1ZiwgJ2EnLCBzaXplb2Yod3JpdGVfYnVmKSk7CisKKyAgLy8gQXR0ZW1waW5nIHRvIGJvcnJvdyAxMCBieXRlcyB3aGVuIG9ubHkgOSBhcmUgYXZhaWxhYmxlIHNob3VsZCByZXR1cm4gTlVMTAorICAvLyBpbW1lZGlhdGVseS4KKyAgdHJhbnNwb3J0cy5vdXQtPndyaXRlKHdyaXRlX2J1ZiwgOSk7CisgIHRyYW5zcG9ydHMub3V0LT5mbHVzaCgpOworICBzZXRfdHJpZ2dlcigzLCB0cmFuc3BvcnRzLm91dCwgMSk7CisgIHVpbnQzMl90IGJvcnJvd19sZW4gPSAxMDsKKyAgY29uc3QgdWludDhfdCogYm9ycm93ZWRfYnVmID0gdHJhbnNwb3J0cy5pbi0+Ym9ycm93KHJlYWRfYnVmLCAmYm9ycm93X2xlbik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKKyAgQk9PU1RfQ0hFQ0soYm9ycm93ZWRfYnVmID09IE5VTEwpOworCisgIGNsZWFyX3RyaWdnZXJzKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KK3ZvaWQgdGVzdF9yZWFkX25vbmVfYXZhaWxhYmxlKCkgeworICBDb3VwbGVkVHJhbnNwb3J0cyB0cmFuc3BvcnRzOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMuaW4gIT0gTlVMTCk7CisgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5vdXQgIT0gTlVMTCk7CisKKyAgdWludDhfdCB3cml0ZV9idWZbMTZdOworICB1aW50OF90IHJlYWRfYnVmWzE2XTsKKyAgbWVtc2V0KHdyaXRlX2J1ZiwgJ2EnLCBzaXplb2Yod3JpdGVfYnVmKSk7CisKKyAgLy8gQXR0ZW1wdGluZyB0byByZWFkIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUgc2hvdWxkIGVpdGhlciBibG9jayB1bnRpbAorICAvLyBzb21lIGRhdGEgaXMgYXZhaWxhYmxlLCBvciBmYWlsIGltbWVkaWF0ZWx5LiAgKGUuZy4sIFRTb2NrZXQgYmxvY2tzLAorICAvLyBUTWVtb3J5QnVmZmVyIGp1c3QgZmFpbHMuKQorICAvLworICAvLyBJZiB0aGUgdHJhbnNwb3J0IGJsb2NrcywgaXQgc2hvdWxkIHN1Y2NlZWQgb25jZSBzb21lIGRhdGEgaXMgYXZhaWxhYmxlLAorICAvLyBldmVuIGlmIGxlc3MgdGhhbiB0aGUgYW1vdW50IHJlcXVlc3RlZCBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgc2V0X3RyaWdnZXIoMSwgdHJhbnNwb3J0cy5vdXQsIDIpOworICBhZGRfdHJpZ2dlcigxLCB0cmFuc3BvcnRzLm91dCwgOCk7CisgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCAxMCk7CisgIGlmIChieXRlc19yZWFkID09IDApIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CisgICAgY2xlYXJfdHJpZ2dlcnMoKTsKKyAgfSBlbHNlIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KTIpOworICB9CisKKyAgY2xlYXJfdHJpZ2dlcnMoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgordm9pZCB0ZXN0X2JvcnJvd19ub25lX2F2YWlsYWJsZSgpIHsKKyAgQ291cGxlZFRyYW5zcG9ydHMgdHJhbnNwb3J0czsKKyAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLmluICE9IE5VTEwpOworICBCT09TVF9SRVFVSVJFKHRyYW5zcG9ydHMub3V0ICE9IE5VTEwpOworCisgIHVpbnQ4X3Qgd3JpdGVfYnVmWzE2XTsKKyAgbWVtc2V0KHdyaXRlX2J1ZiwgJ2EnLCBzaXplb2Yod3JpdGVfYnVmKSk7CisKKyAgLy8gQXR0ZW1wdGluZyB0byBib3Jyb3cgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSBzaG91bGQgZmFpbCBpbW1lZGlhdGVseQorICBzZXRfdHJpZ2dlcigxLCB0cmFuc3BvcnRzLm91dCwgMTApOworICB1aW50MzJfdCBib3Jyb3dfbGVuID0gMTA7CisgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkX2J1ZiA9IHRyYW5zcG9ydHMuaW4tPmJvcnJvdyhOVUxMLCAmYm9ycm93X2xlbik7CisgIEJPT1NUX0NIRUNLKGJvcnJvd2VkX2J1ZiA9PSBOVUxMKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOworCisgIGNsZWFyX3RyaWdnZXJzKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGVzdCBjYXNlIGdlbmVyYXRpb24KKyAqCisgKiBQcmV0dHkgdWdseSBhbmQgYW5ub3lpbmcuICBUaGlzIHdvdWxkIGJlIG11Y2ggZWFzaWVyIGlmIHdlIHRoZSB1bml0IHRlc3QKKyAqIGZyYW1ld29yayBkaWRuJ3QgZm9yY2UgZWFjaCB0ZXN0IHRvIGJlIGEgc2VwYXJhdGUgZnVuY3Rpb24uCisgKiAtIFdyaXRpbmcgYSBjb21wbGV0ZWx5IHNlcGFyYXRlIGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIGVhY2ggb2YgdGhlc2Ugd291bGQKKyAqICAgcmVzdWx0IGluIGEgbG90IG9mIHJlcGV0aXRpdmUgYm9pbGVycGxhdGUgY29kZS4KKyAqIC0gQ29tYmluaW5nIG1hbnkgdGVzdHMgaW50byBhIHNpbmdsZSBmdW5jdGlvbiBtYWtlcyBpdCBtb3JlIGRpZmZpY3VsdCB0bworICogICB0ZWxsIHByZWNpc2VseSB3aGljaCB0ZXN0cyBmYWlsZWQuICBJdCBhbHNvIG1lYW5zIHlvdSBjYW4ndCBnZXQgYSBwcm9ncmVzcworICogICB1cGRhdGUgYWZ0ZXIgZWFjaCB0ZXN0LCBhbmQgdGhlIHRlc3RzIGFyZSBhbHJlYWR5IGZhaXJseSBzbG93LgorICogLSBTaW1pbGFyIHJlZ2lzdHJhdGlvbiBjb3VsZCBiZSBhY2hpZXZlZCB3aXRoIEJPT1NUX1RFU1RfQ0FTRV9URU1QTEFURSwKKyAqICAgYnV0IGl0IHJlcXVpcmVzIGEgbG90IG9mIGF3a3dhcmQgTVBMIGNvZGUsIGFuZCByZXN1bHRzIGluIHVzZWxlc3MgdGVzdAorICogICBjYXNlIG5hbWVzLiAgKFRoZSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGZyb20gc3RkOjp0eXBlX2luZm86Om5hbWUoKSwgd2hpY2gKKyAqICAgaXMgY29tcGlsZXItZGVwZW5kZW50LiAgZ2NjIHJldHVybnMgbWFuZ2xlZCBuYW1lcy4pCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYWRkVGVzdFJXPENvdXBsZWRUcmFuc3BvcnRzPihCT09TVF9TVFJJTkdJWkUoQ291cGxlZFRyYW5zcG9ydHMpLCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOworCisjZGVmaW5lIFRFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQWRkIHRoZSB0ZXN0IGFzIHNwZWNpZmllZCwgdG8gdGVzdCB0aGUgbm9uLXZpcnR1YWwgZnVuY3Rpb24gY2FsbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICogQWxzbyB0ZXN0IHVzaW5nIHRoZSB0cmFuc3BvcnQgYXMgYSBUVHJhbnNwb3J0KiwgdG8gdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICogdGhlIHJlYWRfdmlydCgpL3dyaXRlX3ZpcnQoKSBjYWxscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEJ1ZmZlcmVkVHJhbnNwb3J0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+LCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVFpsaWJUcmFuc3BvcnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFpsaWJUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRyYW5zcG9ydHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYWRkVGVzdEJsb2NraW5nPENvdXBsZWRUcmFuc3BvcnRzPihCT09TVF9TVFJJTkdJWkUoQ291cGxlZFRyYW5zcG9ydHMpKTsKKworI2RlZmluZSBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRUcmFuc3BvcnRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVHJhbnNwb3J0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPik7CisKK2NsYXNzIFRyYW5zcG9ydFRlc3RHZW4geworcHVibGljOgorICBUcmFuc3BvcnRUZXN0R2VuKGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlLCBmbG9hdCBzaXplTXVsdGlwbGllcikKKyAgICA6IHN1aXRlXyhzdWl0ZSksIHNpemVNdWx0aXBsaWVyXyhzaXplTXVsdGlwbGllcikge30KKworICB2b2lkIGdlbmVyYXRlKCkgeworICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHJhbmQ0aygxLCA0MDk2KTsKKworICAgIC8qCisgICAgICogV2UgZG8gdGhlIGJhc2ljYWxseSB0aGUgc2FtZSBzZXQgb2YgdGVzdHMgZm9yIGVhY2ggdHJhbnNwb3J0IHR5cGUsCisgICAgICogYWx0aG91Z2ggd2UgdHdlYWsgdGhlIHBhcmFtZXRlcnMgaW4gc29tZSBwbGFjZXMuCisgICAgICovCisKKyAgICAvLyBUTWVtb3J5QnVmZmVyIHRlc3RzCisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDEwMjQsIDAsIDApOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCAxNjcsIDE2Myk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDE2LCAxLCAxKTsKKworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CisKKyAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRNZW1vcnlCdWZmZXJzKTsKKworI2lmbmRlZiBfV0lOMzIKKyAgICAvLyBURkRUcmFuc3BvcnQgdGVzdHMKKyAgICAvLyBTaW5jZSBDb3VwbGVkRkRUcmFuc3BvcnRzIHRlc3RzIHdpdGggYSBwaXBlLCB3cml0ZXMgd2lsbCBibG9jaworICAgIC8vIGlmIHRoZXJlIGlzIHRvbyBtdWNoIG91dHN0YW5kaW5nIHVucmVhZCBkYXRhIGluIHRoZSBwaXBlLgorICAgIHVpbnQzMl90IGZkX21heF9vdXRzdGFuZGluZyA9IDQwOTY7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMTAyNCwgMCwgMCwgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CisKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKworICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZEZEVHJhbnNwb3J0cyk7CisjZWxzZQorICAgIC8vIFRQaXBlIHRlc3RzIChXSU4zMiBvbmx5KQorICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMTAyNCwgMCwgMCk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMpOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEpOworCisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CisKKyAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRQaXBlVHJhbnNwb3J0cyk7CisjZW5kaWYgLy9fV0lOMzIKKworICAgIC8vIFRTb2NrZXQgdGVzdHMKKyAgICB1aW50MzJfdCBzb2NrZXRfbWF4X291dHN0YW5kaW5nID0gNDA5NjsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMTAyNCwgMCwgMCwgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCAwLCAwLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICAvLyBEb2guICBBcHBhcmVudGx5IHdyaXRpbmcgdG8gYSBzb2NrZXQgaGFzIHNvbWUgYWRkaXRpb25hbCBvdmVyaGVhZCBmb3IKKyAgICAvLyBlYWNoIHNlbmQoKSBjYWxsLiAgSWYgd2UgaGF2ZSBtb3JlIHRoYW4gfjQwMCBvdXRzdGFuZGluZyAxLWJ5dGUgd3JpdGUKKyAgICAvLyByZXF1ZXN0cywgYWRkaXRpb25hbCBzZW5kKCkgY2FsbHMgc3RhcnQgYmxvY2tpbmcuCisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxLCAwLCAwLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0aywgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywKKyAgICAgICAgICAgIDEwMjQgKiAyNTYsCisgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworCisgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkU29ja2V0VHJhbnNwb3J0cyk7CisKKy8vIFRoZXNlIGNvdWxkIGJlIG1hZGUgdG8gd29yayBvbiBXaW5kb3dzLCBidXQgSSBkb24ndCBjYXJlIGVub3VnaCB0byBtYWtlIGl0IGhhcHBlbgorI2lmbmRlZiBfV0lOMzIKKyAgICAvLyBURmlsZVRyYW5zcG9ydCB0ZXN0cworICAgIC8vIFdlIHVzZSBzbWFsbGVyIGJ1ZmZlciBzaXplcyBoZXJlLCBzaW5jZSBURmlsZVRyYW5zcG9ydCBpcyBmYWlybHkgc2xvdy4KKyAgICAvLworICAgIC8vIFRGaWxlVHJhbnNwb3J0IGNhbid0IHdyaXRlIG1vcmUgdGhhbiAxNk1CIGF0IG9uY2UKKyAgICB1aW50MzJfdCBtYXhfd3JpdGVfYXRfb25jZSA9IDEwMjQgKiAxMDI0ICogMTYgLSA0OworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMTAyNCwgbWF4X3dyaXRlX2F0X29uY2UsIDApOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMTI4LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiAxMjgsIDE2NywgMTYzKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDIsIDEsIDEpOworCisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiA2NCwgMCwgMCwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogNjQsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiA2NCwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDIsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKworICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZEZpbGVUcmFuc3BvcnRzKTsKKyNlbmRpZgorCisgICAgLy8gQWRkIHNvbWUgdGVzdHMgdGhhdCBhY2Nlc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGFuZCBURnJhbWVkVHJhbnNwb3J0CisgICAgLy8gdmlhIFRUcmFuc3BvcnQgcG9pbnRlcnMgYW5kIFRCdWZmZXJCYXNlIHBvaW50ZXJzLgorICAgIEFERF9URVNUX1JXKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzPiwKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOworICAgIEFERF9URVNUX1JXKENvdXBsZWRCdWZmZXJCYXNlczxDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzPiwKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOworICAgIEFERF9URVNUX1JXKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkRnJhbWVkVHJhbnNwb3J0cz4sCisgICAgICAgICAgICAgICAgMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrKTsKKyAgICBBRERfVEVTVF9SVyhDb3VwbGVkQnVmZmVyQmFzZXM8Q291cGxlZEZyYW1lZFRyYW5zcG9ydHM+LAorICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CisKKyAgICAvLyBUZXN0IHVzaW5nIFRabGliVHJhbnNwb3J0IHZpYSBhIFRUcmFuc3BvcnQgcG9pbnRlcgorICAgIEFERF9URVNUX1JXKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkWmxpYlRyYW5zcG9ydHM+LAorICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CisgIH0KKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKKyNkZWZpbmUgTUFLRV9URVNUX0NBU0UoX0ZVTkMsIF9OQU1FKSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZShfRlVOQywgX05BTUUsIF9fRklMRV9fLCBfX0xJTkVfXykKKyNlbHNlCisjZGVmaW5lIE1BS0VfVEVTVF9DQVNFKF9GVU5DLCBfTkFNRSkgYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoX0ZVTkMsIF9OQU1FKQorI2VuZGlmCisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KKyAgdm9pZCBhZGRUZXN0UlcoY29uc3QgY2hhciogdHJhbnNwb3J0X25hbWUsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRvdGFsU2l6ZSwKKyAgICAgICAgICAgICAgICAgR2VuZXJpY1NpemVHZW5lcmF0b3Igd1NpemVHZW4sCisgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHJTaXplR2VuLAorICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciB3Q2h1bmtTaXplR2VuID0gMCwKKyAgICAgICAgICAgICAgICAgR2VuZXJpY1NpemVHZW5lcmF0b3IgckNodW5rU2l6ZUdlbiA9IDAsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heE91dHN0YW5kaW5nID0gMCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRGYWlsdXJlcyA9IDApIHsKKyAgICAvLyBhZGp1c3QgdG90YWxTaXplIGJ5IHRoZSBzcGVjaWZpZWQgc2l6ZU11bHRpcGxpZXJfIGZpcnN0CisgICAgdG90YWxTaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRvdGFsU2l6ZSAqIHNpemVNdWx0aXBsaWVyXyk7CisKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZTsKKyAgICBuYW1lIDw8IHRyYW5zcG9ydF9uYW1lIDw8ICI6OnRlc3RfcncoIiA8PCB0b3RhbFNpemUgPDwgIiwgIiA8PCB3U2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIKKyAgICAgICAgIDw8IHJTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIiA8PCB3Q2h1bmtTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIgorICAgICAgICAgPDwgckNodW5rU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwgbWF4T3V0c3RhbmRpbmcgPDwgIikiOworCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCAoKT4gdGVzdF9mdW5jCisjZWxzZQorICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OmNhbGxiYWNrMDw+IHRlc3RfZnVuYworI2VuZGlmCisgICAgICAgID0gc3RkOjpiaW5kKHRlc3Rfcnc8Q291cGxlZFRyYW5zcG9ydHM+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1NpemVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByU2l6ZUdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDaHVua1NpemVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByQ2h1bmtTaXplR2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T3V0c3RhbmRpbmcpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfZnVuYywgbmFtZS5zdHIoKSksIGV4cGVjdGVkRmFpbHVyZXMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgorICB2b2lkIGFkZFRlc3RCbG9ja2luZyhjb25zdCBjaGFyKiB0cmFuc3BvcnROYW1lLCB1aW50MzJfdCBleHBlY3RlZEZhaWx1cmVzID0gMCkgeworICAgIGNoYXIgbmFtZVsxMDI0XTsKKworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CisKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZV9pbl9jaHVua3MoKSIsIHRyYW5zcG9ydE5hbWUpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZV9pbl9jaHVua3M8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CisKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0aWFsX21pZGZyYW1lKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfcGFydGlhbF9taWRmcmFtZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKKworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9yZWFkX25vbmVfYXZhaWxhYmxlKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfbm9uZV9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CisKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfYm9ycm93X3BhcnRfYXZhaWxhYmxlKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X2JvcnJvd19wYXJ0X2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKKworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9ib3Jyb3dfbm9uZV9hdmFpbGFibGUoKSIsIHRyYW5zcG9ydE5hbWUpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfYm9ycm93X25vbmVfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOworICB9CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGVfOworICAvLyBzaXplTXVsdGlwbGllcl8gaXMgY29uZmlndXJhYmxlIHZpYSB0aGUgY29tbWFuZCBsaW5lLCBhbmQgYWxsb3dzIHRoZQorICAvLyB1c2VyIHRvIGFkanVzdCBiZXR3ZWVuIHNtYWxsZXIgYnVmZmVycyB0aGF0IGNhbiBiZSB0ZXN0ZWQgcXVpY2tseSwKKyAgLy8gb3IgbGFyZ2VyIGJ1ZmZlcnMgdGhhdCBtb3JlIHRob3JvdWdobHkgZXhlcmNpc2UgdGhlIGNvZGUsIGJ1dCB0YWtlCisgIC8vIGxvbmdlci4KKyAgZmxvYXQgc2l6ZU11bHRpcGxpZXJfOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZW5lcmFsIEluaXRpYWxpemF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBnbG9iYWxfZml4dHVyZSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gYWxhcm1UaHJlYWRfOworICBnbG9iYWxfZml4dHVyZSgpIHsKKyNpZiBfV0lOMzIKKyAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKKworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IGZhY3Rvcnk7CisgICAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisKKyAgICBhbGFybVRocmVhZF8gPSBmYWN0b3J5Lm5ld1RocmVhZCgKKyAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKGFsYXJtX2hhbmRsZXJfd3JhcHBlcikpOworICAgIGFsYXJtVGhyZWFkXy0+c3RhcnQoKTsKKyAgfQorICB+Z2xvYmFsX2ZpeHR1cmUoKSB7CisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhnX2FsYXJtX21vbml0b3IpOworICAgICAgZ190ZWFyZG93biA9IHRydWU7CisgICAgICBnX2FsYXJtX21vbml0b3Iubm90aWZ5KCk7CisgICAgfQorICAgIGFsYXJtVGhyZWFkXy0+am9pbigpOworICB9Cit9OworCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoZ2xvYmFsX2ZpeHR1cmUpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKGdsb2JhbF9maXh0dXJlKQorI2VuZGlmCisKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIE5VTEwpOworICBpbnQgc2VlZCA9IHR2LnR2X3NlYyBeIHR2LnR2X3VzZWM7CisKKyAgaW5pdHJhbmQoc2VlZCk7CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlRyYW5zcG9ydFRlc3QiOworICBUcmFuc3BvcnRUZXN0R2VuIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvcihzdWl0ZSwgMSk7CisgIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvci5nZW5lcmF0ZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnR2LCBOVUxMKTsKKyAgaW50IHNlZWQgPSB0di50dl9zZWMgXiB0di50dl91c2VjOworCisgIGluaXRyYW5kKHNlZWQpOworCisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJUcmFuc3BvcnRUZXN0IjsKKyAgVHJhbnNwb3J0VGVzdEdlbiB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3Ioc3VpdGUsIDEpOworICB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3IuZ2VuZXJhdGUoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UeXBlZGVmVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVHlwZWRlZlRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTkyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVHlwZWRlZlRlc3QuY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3NhbWUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgorCisjaW5jbHVkZSAiZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oIgorCitCT09TVF9TVEFUSUNfQVNTRVJUKChib29zdDo6aXNfc2FtZTxpbnQzMl90LCB0aHJpZnQ6OnRlc3Q6Ok15SW50MzI+Ojp2YWx1ZSkpOworQk9PU1RfU1RBVElDX0FTU0VSVCgoYm9vc3Q6OmlzX3NhbWU8c3RkOjpzdHJpbmcsIHRocmlmdDo6dGVzdDo6TXlTdHJpbmc+Ojp2YWx1ZSkpOworQk9PU1RfU1RBVElDX0FTU0VSVCgKKyAgICAoYm9vc3Q6OmlzX3NhbWU8dGhyaWZ0Ojp0ZXN0OjpUeXBlZGVmVGVzdFN0cnVjdCwgdGhyaWZ0Ojp0ZXN0OjpNeVN0cnVjdD46OnZhbHVlKSk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVW5pdFRlc3RNYWluLmNwcCBiL2xpYi9jcHAvdGVzdC9Vbml0VGVzdE1haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZWYxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVW5pdFRlc3RNYWluLmNwcApAQCAtMCwwICsxLDIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgdGhyaWZ0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODI2ODE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcApAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9HTlVfU09VUkNFCisjZGVmaW5lIF9HTlVfU09VUkNFIC8vIG5lZWRlZCBmb3IgZ2V0b3B0X2xvbmcKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDw9IDE3MDApCisvLyBwb2x5bm9taWFsIGFuZCBzdGQ6OmZpbGxfdCB3YXJuaW5nIGhhcHBlbnMgaW4gTVNWQyAyMDEwLCAyMDEzLCBtYXliZSBvdGhlcnMKKy8vIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjL2Jvb3N0L3RpY2tldC8xMTQyNgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxib29zdC9yYW5kb20uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9hcnJheS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKKworYm9vc3Q6Om10MTk5Mzcgcm5nOworCisvKgorICogVXRpbGl0eSBjb2RlCisgKi8KKworY2xhc3MgU2l6ZUdlbmVyYXRvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflNpemVHZW5lcmF0b3IoKSB7fQorICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgPSAwOworfTsKKworY2xhc3MgQ29uc3RhbnRTaXplR2VuZXJhdG9yIDogcHVibGljIFNpemVHZW5lcmF0b3IgeworcHVibGljOgorICBDb25zdGFudFNpemVHZW5lcmF0b3IodW5zaWduZWQgaW50IHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBpbnQgdmFsdWVfOworfTsKKworY2xhc3MgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcihkb3VibGUgbWVhbiwgZG91YmxlIHN0ZF9kZXYpCisgICAgOiBnZW5fKHJuZywgYm9vc3Q6OmxvZ25vcm1hbF9kaXN0cmlidXRpb248ZG91YmxlPihtZWFuLCBzdGRfZGV2KSkge30KKworICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgeworICAgIC8vIExvb3AgdW50aWwgd2UgZ2V0IGEgc2l6ZSBvZiAxIG9yIG1vcmUKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihnZW5fKCkpOworICAgICAgaWYgKHZhbHVlID49IDEpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0KKyAgfQorCitwcml2YXRlOgorICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gPiBnZW5fOworfTsKKworYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBnZW5fdW5pZm9ybV9idWZmZXIodWludDMyX3QgYnVmX2xlbiwgdWludDhfdCBjKSB7CisgIHVpbnQ4X3QqIGJ1ZiA9IG5ldyB1aW50OF90W2J1Zl9sZW5dOworICBtZW1zZXQoYnVmLCBjLCBidWZfbGVuKTsKKyAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4oYnVmKTsKK30KKworYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBnZW5fY29tcHJlc3NpYmxlX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuKSB7CisgIHVpbnQ4X3QqIGJ1ZiA9IG5ldyB1aW50OF90W2J1Zl9sZW5dOworCisgIC8vIEdlbmVyYXRlIHNtYWxsIHJ1bnMgb2YgYWx0ZXJuYXRlbHkgaW5jcmVhc2luZyBhbmQgZGVjcmVhc2luZyBieXRlcworICBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50MzJfdD4gcnVuX2xlbmd0aF9kaXN0cmlidXRpb24oMSwgNjQpOworICBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50OF90PiBieXRlX2Rpc3RyaWJ1dGlvbigwLCBVSU5UOF9NQVgpOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KKyAgICAgIGJ5dGVfZ2VuZXJhdG9yKHJuZywgYnl0ZV9kaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQzMl90PiA+CisgICAgICBydW5fbGVuX2dlbmVyYXRvcihybmcsIHJ1bl9sZW5ndGhfZGlzdHJpYnV0aW9uKTsKKworICB1aW50MzJfdCBpZHggPSAwOworICBpbnQ4X3Qgc3RlcCA9IDE7CisgIHdoaWxlIChpZHggPCBidWZfbGVuKSB7CisgICAgdWludDMyX3QgcnVuX2xlbmd0aCA9IHJ1bl9sZW5fZ2VuZXJhdG9yKCk7CisgICAgaWYgKGlkeCArIHJ1bl9sZW5ndGggPiBidWZfbGVuKSB7CisgICAgICBydW5fbGVuZ3RoID0gYnVmX2xlbiAtIGlkeDsKKyAgICB9CisKKyAgICB1aW50OF90IGJ5dGUgPSBieXRlX2dlbmVyYXRvcigpOworICAgIGZvciAodWludDMyX3QgbiA9IDA7IG4gPCBydW5fbGVuZ3RoOyArK24pIHsKKyAgICAgIGJ1ZltpZHhdID0gYnl0ZTsKKyAgICAgICsraWR4OworICAgICAgYnl0ZSArPSBzdGVwOworICAgIH0KKworICAgIHN0ZXAgKj0gLTE7CisgIH0KKworICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihidWYpOworfQorCitib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGdlbl9yYW5kb21fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4pIHsKKyAgdWludDhfdCogYnVmID0gbmV3IHVpbnQ4X3RbYnVmX2xlbl07CisKKyAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gZGlzdHJpYnV0aW9uKDAsIFVJTlQ4X01BWCk7CisgIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjxib29zdDo6bXQxOTkzNywgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gPgorICAgICAgZ2VuZXJhdG9yKHJuZywgZGlzdHJpYnV0aW9uKTsKKworICBmb3IgKHVpbnQzMl90IG4gPSAwOyBuIDwgYnVmX2xlbjsgKytuKSB7CisgICAgYnVmW25dID0gZ2VuZXJhdG9yKCk7CisgIH0KKworICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihidWYpOworfQorCisvKgorICogVGVzdCBmdW5jdGlvbnMKKyAqLworCit2b2lkIHRlc3Rfd3JpdGVfdGhlbl9yZWFkKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKKyAgemxpYl90cmFucy0+ZmluaXNoKCk7CisKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBtaXJyb3IobmV3IHVpbnQ4X3RbYnVmX2xlbl0pOworICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkQWxsKG1pcnJvci5nZXQoKSwgYnVmX2xlbik7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ290LCBidWZfbGVuKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CisgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7Cit9CisKK3ZvaWQgdGVzdF9zZXBhcmF0ZV9jaGVja3N1bShjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgeworICAvLyBUaGlzIG9uZSBpcyB0cmlja3kuICBJIHNlcGFyYXRlIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHN0cmVhbSBvdXQKKyAgLy8gaW50byBhIHNlcGFyYXRlIGNyYnVmXy4gIFRoZSBsYXN0IGJ5dGUgaXMgcGFydCBvZiB0aGUgY2hlY2tzdW0sCisgIC8vIHNvIHRoZSBlbnRpcmUgcmVhZCBnb2VzIGZpbmUsIGJ1dCB3aGVuIEkgZ28gdG8gdmVyaWZ5IHRoZSBjaGVja3N1bQorICAvLyBpdCBpc24ndCB0aGVyZS4gIFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBjb21wbGFpbmVkIHRoYXQKKyAgLy8gdGhlIHN0cmVhbSB3YXMgbm90IGNvbXBsZXRlLiAgSSdtIGFib3V0IHRvIGdvIGZpeCB0aGF0LgorICAvLyBJdCB3b3JrZWQuICBBd2Vzb21lLgorICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CisgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOworICBzdHJpbmcgdG1wX2J1ZjsKKyAgbWVtYnVmLT5hcHBlbmRCdWZmZXJUb1N0cmluZyh0bXBfYnVmKTsKKyAgemxpYl90cmFucy5yZXNldChuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWmxpYlRyYW5zcG9ydDo6REVGQVVMVF9VUkJVRl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wX2J1Zi5sZW5ndGgoKSAtIDEpKSk7CisKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBtaXJyb3IobmV3IHVpbnQ4X3RbYnVmX2xlbl0pOworICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkQWxsKG1pcnJvci5nZXQoKSwgYnVmX2xlbik7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ290LCBidWZfbGVuKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CisgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7Cit9CisKK3ZvaWQgdGVzdF9pbmNvbXBsZXRlX2NoZWNrc3VtKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CisgIC8vIE1ha2Ugc3VyZSB3ZSBzdGlsbCBnZXQgdGhhdCAibm90IGNvbXBsZXRlIiBlcnJvciBpZgorICAvLyBpdCByZWFsbHkgaXNuJ3QgY29tcGxldGUuCisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKKyAgemxpYl90cmFucy0+ZmluaXNoKCk7CisgIHN0cmluZyB0bXBfYnVmOworICBtZW1idWYtPmFwcGVuZEJ1ZmZlclRvU3RyaW5nKHRtcF9idWYpOworICB0bXBfYnVmLmVyYXNlKHRtcF9idWYubGVuZ3RoKCkgLSAxKTsKKyAgbWVtYnVmLT5yZXNldEJ1ZmZlcihjb25zdF9jYXN0PHVpbnQ4X3QqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0bXBfYnVmLmRhdGEoKSkpLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBfYnVmLmxlbmd0aCgpKSk7CisKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBtaXJyb3IobmV3IHVpbnQ4X3RbYnVmX2xlbl0pOworICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkQWxsKG1pcnJvci5nZXQoKSwgYnVmX2xlbik7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ290LCBidWZfbGVuKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CisgIHRyeSB7CisgICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKKyAgICBCT09TVF9FUlJPUigidmVyaWZ5Q2hlY2tzdW0oKSBkaWQgbm90IHJlcG9ydCBhbiBlcnJvciIpOworICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4LmdldFR5cGUoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEpOworICB9Cit9CisKK3ZvaWQgdGVzdF9yZWFkX3dyaXRlX21peChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHdyaXRlX2dlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiByZWFkX2dlbikgeworICAvLyBUcnkgaXQgd2l0aCBhIG1peCBvZiByZWFkL3dyaXRlIHNpemVzLgorICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHVuc2lnbmVkIGludCB0b3Q7CisKKyAgdG90ID0gMDsKKyAgd2hpbGUgKHRvdCA8IGJ1Zl9sZW4pIHsKKyAgICB1aW50MzJfdCB3cml0ZV9sZW4gPSB3cml0ZV9nZW4tPmdldFNpemUoKTsKKyAgICBpZiAodG90ICsgd3JpdGVfbGVuID4gYnVmX2xlbikgeworICAgICAgd3JpdGVfbGVuID0gYnVmX2xlbiAtIHRvdDsKKyAgICB9CisgICAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpICsgdG90LCB3cml0ZV9sZW4pOworICAgIHRvdCArPSB3cml0ZV9sZW47CisgIH0KKworICB6bGliX3RyYW5zLT5maW5pc2goKTsKKworICB0b3QgPSAwOworICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IG1pcnJvcihuZXcgdWludDhfdFtidWZfbGVuXSk7CisgIHdoaWxlICh0b3QgPCBidWZfbGVuKSB7CisgICAgdWludDMyX3QgcmVhZF9sZW4gPSByZWFkX2dlbi0+Z2V0U2l6ZSgpOworICAgIHVpbnQzMl90IGV4cGVjdGVkX3JlYWRfbGVuID0gcmVhZF9sZW47CisgICAgaWYgKHRvdCArIHJlYWRfbGVuID4gYnVmX2xlbikgeworICAgICAgZXhwZWN0ZWRfcmVhZF9sZW4gPSBidWZfbGVuIC0gdG90OworICAgIH0KKyAgICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkKG1pcnJvci5nZXQoKSArIHRvdCwgcmVhZF9sZW4pOworICAgIEJPT1NUX1JFUVVJUkVfTEUoZ290LCBleHBlY3RlZF9yZWFkX2xlbik7CisgICAgQk9PU1RfUkVRVUlSRV9ORShnb3QsICh1aW50MzJfdCkwKTsKKyAgICB0b3QgKz0gZ290OworICB9CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CisgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7Cit9CisKK3ZvaWQgdGVzdF9pbnZhbGlkX2NoZWNrc3VtKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CisgIC8vIFZlcmlmeSBjaGVja3N1bSBjaGVja2luZy4KKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOworICB6bGliX3RyYW5zLT5maW5pc2goKTsKKyAgc3RyaW5nIHRtcF9idWY7CisgIG1lbWJ1Zi0+YXBwZW5kQnVmZmVyVG9TdHJpbmcodG1wX2J1Zik7CisgIC8vIE1vZGlmeSBhIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIChwYXJ0IG9mIHRoZSBjaGVja3N1bSkuCisgIC8vIE9uIHJhcmUgb2NjYXNpb25zLCBtb2RpZnlpbmcgYSBieXRlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGJ1ZmZlcgorICAvLyBpc24ndCBjYXVnaHQgYnkgdGhlIGNoZWNrc3VtLgorICAvLworICAvLyAoVGhpcyBoYXBwZW5zIGVzcGVjaWFsbHkgb2Z0ZW4gZm9yIHRoZSB1bmlmb3JtIGJ1ZmZlci4gIFRoZQorICAvLyByZS1pbmZsYXRlZCBkYXRhIGlzIGNvcnJlY3QsIGhvd2V2ZXIuICBJIHN1c3BlY3QgaW4gdGhpcyBjYXNlIHRoYXQKKyAgLy8gd2UncmUgbW9yZSBsaWtlbHkgdG8gbW9kaWZ5IGJ5dGVzIHRoYXQgYXJlIHBhcnQgb2YgemxpYiBtZXRhZGF0YQorICAvLyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgY29tcHJlc3NlZCBkYXRhLikKKyAgLy8KKyAgLy8gSSd2ZSBhbHNvIHNlZW4gc29tZSBmYWlsdXJlIHNjZW5hcmlvcyB3aGVyZSBhIGNoZWNrc3VtIGZhaWx1cmUgaXNuJ3QKKyAgLy8gcmVwb3J0ZWQsIGJ1dCB6bGliIGtlZXBzIHRyeWluZyB0byBkZWNvZGUgcGFzdCB0aGUgZW5kIG9mIHRoZSBkYXRhLgorICAvLyAoV2hlbiB0aGlzIG9jY3VycywgdmVyaWZ5Q2hlY2tzdW0oKSB0aHJvd3MgYW4gZXhjZXB0aW9uIGluZGljYXRpbmcKKyAgLy8gdGhhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIGhhc24ndCBiZWVuIHJlYWNoZWQuKSAgSSBoYXZlbid0IHNlZW4gdGhpcworICAvLyBlcnJvciB3aGVuIG9ubHkgbW9kaWZ5aW5nIGNoZWNrc3VtIGJ5dGVzLgorICBpbnQgaW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KHRtcF9idWYuc2l6ZSgpIC0gMSk7CisgIHRtcF9idWZbaW5kZXhdKys7CisgIG1lbWJ1Zi0+cmVzZXRCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odG1wX2J1Zi5kYXRhKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wX2J1Zi5sZW5ndGgoKSkpOworCisgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gbWlycm9yKG5ldyB1aW50OF90W2J1Zl9sZW5dKTsKKyAgdHJ5IHsKKyAgICB6bGliX3RyYW5zLT5yZWFkQWxsKG1pcnJvci5nZXQoKSwgYnVmX2xlbik7CisgICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKKyAgICBCT09TVF9FUlJPUigidmVyaWZ5Q2hlY2tzdW0oKSBkaWQgbm90IHJlcG9ydCBhbiBlcnJvciIpOworICB9IGNhdGNoIChUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChleC5nZXRUeXBlKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SKTsKKyAgfQorfQorCit2b2lkIHRlc3Rfd3JpdGVfYWZ0ZXJfZmx1c2goY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKKyAgLy8gd3JpdGUgc29tZSBkYXRhCisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKKworICAvLyBjYWxsIGZpbmlzaCgpCisgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOworCisgIC8vIG1ha2Ugc3VyZSB3cml0ZSgpIHRocm93cyBhbiBlcnJvcgorICB0cnkgeworICAgIHVpbnQ4X3Qgd3JpdGVfYnVmW10gPSAiYSI7CisgICAgemxpYl90cmFucy0+d3JpdGUod3JpdGVfYnVmLCAxKTsKKyAgICBCT09TVF9FUlJPUigid3JpdGUoKSBhZnRlciBmaW5pc2goKSBkaWQgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiIpOworICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4LmdldFR5cGUoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOworICB9CisKKyAgLy8gbWFrZSBzdXJlIGZsdXNoKCkgdGhyb3dzIGFuIGVycm9yCisgIHRyeSB7CisgICAgemxpYl90cmFucy0+Zmx1c2goKTsKKyAgICBCT09TVF9FUlJPUigiZmx1c2goKSBhZnRlciBmaW5pc2goKSBkaWQgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiIpOworICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4LmdldFR5cGUoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOworICB9CisKKyAgLy8gbWFrZSBzdXJlIGZpbmlzaCgpIHRocm93cyBhbiBlcnJvcgorICB0cnkgeworICAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOworICAgIEJPT1NUX0VSUk9SKCJmaW5pc2goKSBhZnRlciBmaW5pc2goKSBkaWQgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiIpOworICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4LmdldFR5cGUoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MpOworICB9Cit9CisKK3ZvaWQgdGVzdF9ub193cml0ZSgpIHsKKyAgLy8gVmVyaWZ5IHRoYXQgbm8gZGF0YSBpcyB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpZiB3ZQorICAvLyBuZXZlciB3cml0ZSBkYXRhIHRvIHRoZSBUWmxpYlRyYW5zcG9ydC4KKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHsKKyAgICAvLyBDcmVhdGUgYSBUWmxpYlRyYW5zcG9ydCBvYmplY3QsIGFuZCBpbW1lZGlhdGVseSBkZXN0cm95IGl0CisgICAgLy8gd2hlbiBpdCBnb2VzIG91dCBvZiBzY29wZS4KKyAgICBUWmxpYlRyYW5zcG9ydCB3X3psaWJfdHJhbnMobWVtYnVmKTsKKyAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWJ1Zi0+YXZhaWxhYmxlX3JlYWQoKSwgKHVpbnQzMl90KTApOworfQorCit2b2lkIHRlc3RfZ2V0X3VuZGVybHlpbmdfdHJhbnNwb3J0KCkgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWJ1Zi5nZXQoKSwgemxpYl90cmFucy0+Z2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpLmdldCgpKTsKK30KKworLyoKKyAqIEluaXRpYWxpemF0aW9uCisgKi8KKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKKyNkZWZpbmUgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgX0ZVTkMsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OnN0ZDo6b3N0cmluZ3N0cmVhbSBuYW1lX3NzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuYW1lX3NzIDw8IG5hbWUgPDwgIi0iIDw8IEJPT1NUX1NUUklOR0laRShfRlVOQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OnN0ZDo6ZnVuY3Rpb248dm9pZCAoKT4gdGVzdF9mdW5jID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6OnN0ZDo6YmluZChfRlVOQywgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSh0ZXN0X2Z1bmMsIG5hbWVfc3Muc3RyKCksIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgICAgICBcCisgICAgKHN1aXRlKS0+YWRkKHRjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCBfRlVOQywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6c3RkOjpvc3RyaW5nc3RyZWFtIG5hbWVfc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWVfc3MgPDwgbmFtZSA8PCAiLSIgPDwgQk9PU1RfU1RSSU5HSVpFKF9GVU5DKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9jYXNlKiB0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA9IDo6Ym9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoOjpzdGQ6OmJpbmQoX0ZVTkMsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3NzLnN0cigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHN1aXRlKS0+YWRkKHRjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKwordm9pZCBhZGRfdGVzdHMoYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUsCisgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+JiBidWYsCisgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfbGVuLAorICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkgeworICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCB0ZXN0X3dyaXRlX3RoZW5fcmVhZCwgYnVmLCBidWZfbGVuKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgdGVzdF9zZXBhcmF0ZV9jaGVja3N1bSwgYnVmLCBidWZfbGVuKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgdGVzdF9pbmNvbXBsZXRlX2NoZWNrc3VtLCBidWYsIGJ1Zl9sZW4pOworICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCB0ZXN0X2ludmFsaWRfY2hlY2tzdW0sIGJ1ZiwgYnVmX2xlbik7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3Rfd3JpdGVfYWZ0ZXJfZmx1c2gsIGJ1ZiwgYnVmX2xlbik7CisKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBzaXplXzMyayhuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKDEgPDwgMTUpKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBzaXplX2xvZ25vcm1hbChuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWNvbnN0YW50IiwgdGVzdF9yZWFkX3dyaXRlX21peCwgYnVmLCBidWZfbGVuLCBzaXplXzMyaywgc2l6ZV8zMmspOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtd3JpdGUiLAorICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwsCisgICAgICAgICAgICAgICAgc2l6ZV8zMmspOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtcmVhZCIsCisgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKKyAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICBzaXplXzMyaywKKyAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCk7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsCisgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC1ib3RoIiwKKyAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LAorICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICBidWZfbGVuLAorICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsLAorICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsKTsKKworICAvLyBUZXN0IHdpdGggYSByYW5kb20gc2l6ZSBkaXN0cmlidXRpb24sCisgIC8vIGJ1dCB1c2UgdGhlIGV4YWN0IHNhbWUgZGlzdHJpYnV0aW9uIGZvciByZWFkaW5nIGFzIGZvciB3cml0aW5nLgorICAvLworICAvLyBCZWNhdXNlIHRoZSBTaXplR2VuZXJhdG9yIG1ha2VzIGEgY29weSBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IsCisgIC8vIGJvdGggU2l6ZUdlbmVyYXRvcnMgc2hvdWxkIHJldHVybiB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgdmFsdWVzLCBzaW5jZSB0aGV5CisgIC8vIGJvdGggc3RhcnQgd2l0aCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgaW4gdGhlIHNhbWUgc3RhdGUuCisgIHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gd3JpdGVfc2l6ZV9nZW4obmV3IExvZ05vcm1hbFNpemVHZW5lcmF0b3IoMjAsIDMwKSk7CisgIHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gcmVhZF9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwKKyAgICAgICAgICAgICAgICBuYW1lIDw8ICItbG9nbm9ybWFsLXNhbWUtZGlzdHJpYnV0aW9uIiwKKyAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LAorICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICBidWZfbGVuLAorICAgICAgICAgICAgICAgIHdyaXRlX3NpemVfZ2VuLAorICAgICAgICAgICAgICAgIHJlYWRfc2l6ZV9nZW4pOworfQorCit2b2lkIHByaW50X3VzYWdlKEZJTEUqIGYsIGNvbnN0IGNoYXIqIGFyZ3YwKSB7CisgIGZwcmludGYoZiwgIlVzYWdlOiAlcyBbYm9vc3Rfb3B0aW9uc10gW29wdGlvbnNdXG4iLCBhcmd2MCk7CisgIGZwcmludGYoZiwgIk9wdGlvbnM6XG4iKTsKKyAgZnByaW50ZihmLCAiICAtLXNlZWQ9PE4+LCAtcyA8Tj5cbiIpOworICBmcHJpbnRmKGYsICIgIC0taGVscFxuIik7Cit9CisKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICB1aW50MzJfdCBzZWVkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRpbWUoTlVMTCkpOworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorICBwcmludGYoInNlZWQ6ICUiIFBSSXUzMiAiXG4iLCBzZWVkKTsKKyNlbmRpZgorICBybmcuc2VlZChzZWVkKTsKKworICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9ICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIHN1aXRlLT5wX25hbWUudmFsdWUgPSAiWmxpYlRlc3QiOworCisgIHVpbnQzMl90IGJ1Zl9sZW4gPSAxMDI0ICogMzI7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3VuaWZvcm1fYnVmZmVyKGJ1Zl9sZW4sICdhJyksIGJ1Zl9sZW4sICJ1bmlmb3JtIik7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJjb21wcmVzc2libGUiKTsKKyAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fcmFuZG9tX2J1ZmZlcihidWZfbGVuKSwgYnVmX2xlbiwgInJhbmRvbSIpOworCisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3Rfbm9fd3JpdGUpKTsKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9nZXRfdW5kZXJseWluZ190cmFuc3BvcnQpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgdWludDMyX3Qgc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKE5VTEwpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKKyAgcm5nLnNlZWQoc2VlZCk7CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlpsaWJUZXN0IjsKKworICB1aW50MzJfdCBidWZfbGVuID0gMTAyNCAqIDMyOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl91bmlmb3JtX2J1ZmZlcihidWZfbGVuLCAnYScpLCBidWZfbGVuLCAidW5pZm9ybSIpOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKGJ1Zl9sZW4pLCBidWZfbGVuLCAiY29tcHJlc3NpYmxlIik7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3JhbmRvbV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJyYW5kb20iKTsKKworICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X25vX3dyaXRlKSk7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L011dGV4VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxZWMxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgbGlua2VkIGludG8gdGhlIFVuaXRUZXN0cyB0ZXN0IGV4ZWN1dGFibGUKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCIKKwordXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGU7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK3N0cnVjdCBMRkFUCit7CisgIExGQVQoKQorICAgIDogdXV0KE11dGV4OjpFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcHRocmVhZF9tdXRleF9pbml0KCZteCwgMCkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHB0aHJlYWRfY29uZF9pbml0KCZjdiwgMCkpOworICB9CisKKyAgTXV0ZXggdXV0OworICBwdGhyZWFkX211dGV4X3QgbXg7CisgIHB0aHJlYWRfY29uZF90IGN2OworfTsKKworLy8gSGVscGVyIGZvciB0ZXN0aW5nIG11dGV4IGJlaGF2aW9yIHdoZW4gbG9ja2VkIGJ5IGFub3RoZXIgdGhyZWFkCit2b2lkICogbG9ja0Zyb21Bbm90aGVyVGhyZWFkKHZvaWQgKnB0cikKK3sKKyAgc3RydWN0IExGQVQgKmxmYXQgPSAoTEZBVCAqKXB0cjsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF9sb2NrKCZsZmF0LT5teCkpOyAgICAgICAgICAgLy8gc3luY2hyb25pemUgd2l0aCB0ZXN0aW5nIHRocmVhZAorICBCT09TVF9DSEVDS19OT19USFJPVyggbGZhdC0+dXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF9zaWduYWwoJmxmYXQtPmN2KSk7ICAgICAgICAgIC8vIHRlbGwgdGVzdGluZyB0aHJlYWQgd2UgaGF2ZSBsb2NrZWQgdGhlIG11dGV4CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF93YWl0KCZsZmF0LT5jdiwgJmxmYXQtPm14KSk7IC8vIHdhaXQgZm9yIHRlc3RpbmcgdGhyZWFkIHRvIHNpZ25hbCBjb25kaXRpb24gdmFyaWFibGUgdGVsbGluZyB1cyB0byB1bmxvY2sKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQtPnV1dC51bmxvY2soKSk7CisgIHJldHVybiBwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlc3RpbmcgdGhyZWFkIHNob3VsZCBqb2luIHRvIGVuc3VyZSBjb21wbGV0ZW5lc3MKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKE11dGV4VGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoaGFwcHlfcGF0aCkKK3sKKyAgTXV0ZXggdXV0KE11dGV4OjpFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkIHRvIHRlc3QgdW5sb2NraW5nIHR3aWNlIHdpdGhvdXQgdW5kZWZpbmVkIGJlaGF2aW9yCisKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19USFJPVyAgICggdXV0LmxvY2soKSwgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24pOyAgICAgICAvLyBFREVBRExLICh0aGlzIHRocmVhZCBvd25zIGl0KQorICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UocmVjdXJzaXZlX2hhcHB5X3BhdGgpCit7CisgIE11dGV4IHV1dChNdXRleDo6UkVDVVJTSVZFX0lOSVRJQUxJWkVSKTsKKworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0cnlsb2NrKQoreworICBNdXRleCB1dXQoTXV0ZXg6OkFEQVBUSVZFX0lOSVRJQUxJWkVSKTsgICAvLyBqdXN0IHVzaW5nIGFub3RoZXIgaW5pdGlhbGl6ZXIgZm9yIGNvdmVyYWdlCisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIHV1dC50cnlsb2NrKCkpOworICBCT09TVF9DSEVDSyAgICAgICAgICghdXV0LnRyeWxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0aW1lZGxvY2spCit7CisgIHB0aHJlYWRfdCB0aDsKKyAgc3RydWN0IExGQVQgbGZhdDsKKworICBCT09TVF9DSEVDSyAgICAgICAgICggbGZhdC51dXQudGltZWRsb2NrKDEwMCkpOworICBCT09TVF9DSEVDS19USFJPVyAgICggbGZhdC51dXQudGltZWRsb2NrKDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbik7ICAgICAgICAgICAgICAgICAgIC8vIEVERUFETEsgKGN1cnJlbnQgdGhyZWFkIG93bnMgbXV0ZXggLSBsb2dpYyBlcnJvcikKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQudXV0LnVubG9jaygpKTsKKworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX211dGV4X2xvY2soJmxmYXQubXgpKTsgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB3aXRoIGhlbHBlciB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jcmVhdGUoJnRoLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tGcm9tQW5vdGhlclRocmVhZCwgJmxmYXQpKTsgICAgICAgICAvLyBjcmVhdGUgaGVscGVyIHRocmVhZAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfd2FpdCgmbGZhdC5jdiwgJmxmYXQubXgpKTsgICAvLyB3YWl0IGZvciBoZWxwZXIgdGhyZWFkIHRvIGxvY2sgbXV0ZXgKKworICBCT09TVF9DSEVDSyAgICAgICAgICghbGZhdC51dXQudGltZWRsb2NrKDEwMCkpOyAgICAgICAgICAgICAgICAgICAvLyBmYWxzZTogYW5vdGhlciB0aHJlYWQgb3ducyB0aGUgbG9jaworCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF9zaWduYWwoJmxmYXQuY3YpKTsgICAgICAgICAgIC8vIHRlbGwgaGVscGVyIHRocmVhZCB3ZSBhcmUgZG9uZQorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX211dGV4X3VubG9jaygmbGZhdC5teCkpOyAgICAgICAgICAvLyBsZXQgaGVscGVyIHRocmVhZCBjbGVhbiB1cAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2pvaW4odGgsIDApKTsgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciB0ZXN0aW5nIHRocmVhZCB0byB1bmxvY2sgYW5kIGJlIGRvbmUKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodW5kZXJseWluZykKK3sKKyAgTXV0ZXggdXV0OworCisgIEJPT1NUX0NIRUNLICAgICAgICAgKCB1dXQuZ2V0VW5kZXJseWluZ0ltcGwoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1YTIzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhpcyBpcyBsaW5rZWQgaW50byB0aGUgVW5pdFRlc3RzIHRlc3QgZXhlY3V0YWJsZQorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGU7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK2NsYXNzIExvY2tlciA6IHB1YmxpYyBSdW5uYWJsZSB7Citwcm90ZWN0ZWQ6CisgIExvY2tlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2ssIGJvb2wgd3JpdGVyKQorICAgIDogcndsb2NrXyhyd2xvY2spLCB3cml0ZXJfKHdyaXRlciksIHN0YXJ0ZWRfKGZhbHNlKSwgZ290TG9ja18oZmFsc2UpLCBzaWduYWxlZF8oZmFsc2UpIHt9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHJ1bigpIHsKKyAgICBzdGFydGVkXyA9IHRydWU7CisgICAgaWYgKHdyaXRlcl8pIHsKKyAgICAgIHJ3bG9ja18tPmFjcXVpcmVXcml0ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByd2xvY2tfLT5hY3F1aXJlUmVhZCgpOworICAgIH0KKyAgICBnb3RMb2NrXyA9IHRydWU7CisgICAgd2hpbGUgKCFzaWduYWxlZF8pIHsKKyAgICAgIHVzbGVlcCg1MDAwKTsKKyAgICB9CisgICAgcndsb2NrXy0+cmVsZWFzZSgpOworICB9CisKKyAgYm9vbCBzdGFydGVkKCkgY29uc3QgeyByZXR1cm4gc3RhcnRlZF87IH0KKyAgYm9vbCBnb3RMb2NrKCkgY29uc3QgeyByZXR1cm4gZ290TG9ja187IH0KKyAgdm9pZCBzaWduYWwoKSB7IHNpZ25hbGVkXyA9IHRydWU7IH0KKworcHJvdGVjdGVkOgorICBzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2tfOworICBib29sIHdyaXRlcl87CisgIHZvbGF0aWxlIGJvb2wgc3RhcnRlZF87CisgIHZvbGF0aWxlIGJvb2wgZ290TG9ja187CisgIHZvbGF0aWxlIGJvb2wgc2lnbmFsZWRfOworfTsKKworY2xhc3MgUmVhZGVyIDogcHVibGljIExvY2tlciB7CitwdWJsaWM6CisgIFJlYWRlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgZmFsc2UpIHt9Cit9OworCitjbGFzcyBXcml0ZXIgOiBwdWJsaWMgTG9ja2VyIHsKK3B1YmxpYzoKKyAgV3JpdGVyKHNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jaykgOiBMb2NrZXIocndsb2NrLCB0cnVlKSB7fQorfTsKKwordm9pZCB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OlBPTElDWSBwb2xpY3kpIHsKKyAgLy8gdGhlIG1hbiBwYWdlcyBmb3IgcHRocmVhZF93cmxvY2tfcmRsb2NrIHN1Z2dlc3QgdGhhdCBhbnkgT1MgZ3VhcmFudGVlIGFib3V0CisgIC8vIHdyaXRlciBzdGFydmF0aW9uIG1heSBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBzY2hlZHVsaW5nIHBvbGljeSwgc28gbGV0J3MgdHJ5CisgIC8vIGFsbCAzIHBvbGljaWVzIHRvIHNlZSBpZiBhbnkgb2YgdGhlbSB3b3JrLgorICBQb3NpeFRocmVhZEZhY3RvcnkgZmFjdG9yeShwb2xpY3kpOworICBmYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKKworICBzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2sobmV3IE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSk7CisKKyAgc2hhcmVkX3B0cjxSZWFkZXI+IHJlYWRlcjEobmV3IFJlYWRlcihyd2xvY2spKTsKKyAgc2hhcmVkX3B0cjxSZWFkZXI+IHJlYWRlcjIobmV3IFJlYWRlcihyd2xvY2spKTsKKyAgc2hhcmVkX3B0cjxXcml0ZXI+IHdyaXRlcihuZXcgV3JpdGVyKHJ3bG9jaykpOworCisgIHNoYXJlZF9wdHI8VGhyZWFkPiB0cmVhZGVyMSA9IGZhY3RvcnkubmV3VGhyZWFkKHJlYWRlcjEpOworICBzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjIgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIyKTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHR3cml0ZXIgPSBmYWN0b3J5Lm5ld1RocmVhZCh3cml0ZXIpOworCisgIC8vIGxhdW5jaCBhIHJlYWRlciBhbmQgbWFrZSBzdXJlIGhlIGhhcyB0aGUgbG9jaworICB0cmVhZGVyMS0+c3RhcnQoKTsKKyAgd2hpbGUgKCFyZWFkZXIxLT5nb3RMb2NrKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKworICAvLyBsYXVuY2ggYSB3cml0ZXIgYW5kIG1ha2Ugc3VyZSBoZSdzIGJsb2NrZWQgb24gdGhlIGxvY2sKKyAgdHdyaXRlci0+c3RhcnQoKTsKKyAgd2hpbGUgKCF3cml0ZXItPnN0YXJ0ZWQoKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorICAvLyB0cmlja3kgcGFydC4uLiB3ZSBjYW4gbmV2ZXIgYmUgMTAwJSBzdXJlIHRoYXQgdGhlIHdyaXRlciBpcyBhY3R1YWxseQorICAvLyBibG9ja2VkIG9uIHRoZSBsb2NrLCBidXQgd2UgY2FuIHByZXR0eSByZWFzb25hYmx5IHN1cmUgYmVjYXVzZSB3ZSBrbm93CisgIC8vIGhlIGp1c3QgZXhlY3V0ZWQgdGhlIGxpbmUgaW1tZWRpYXRlbHkgYmVmb3JlIGdldHRpbmcgdGhlIGxvY2ssIGFuZAorICAvLyB3ZSdsbCB3YWl0IGEgZnVsbCBzZWNvbmQgZm9yIGhpbSB0byBnZXQgb24gaXQuCisgIHNsZWVwKDEpOworCisgIC8vIGxhdW5jaCBhIHNlY29uZCByZWFkZXIuLi4gaWYgdGhlIFJXTXV0ZXggZ3VhcmFudGVlcyB0aGF0IHdyaXRlcnMgd29uJ3QKKyAgLy8gc3RhcnZlLCB0aGlzIHJlYWRlciBzaG91bGQgbm90IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgbG9jayB1bnRpbCB0aGUgd3JpdGVyCisgIC8vIGhhcyBhY3F1aXJlZCBhbmQgcmVsZWFzZWQgaXQuCisgIHRyZWFkZXIyLT5zdGFydCgpOworICB3aGlsZSAoIXJlYWRlcjItPnN0YXJ0ZWQoKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorICAvLyBhZ2Fpbi4uLiBjYW4ndCBiZSAxMDAlIHN1cmUgdGhlIHJlYWRlciBpcyB3YWl0aW5nIG9uIChvciBoYXMpIHRoZSBsb2NrCisgIC8vIGJ1dCB3ZSBjYW4gYmUgY2xvc2UuCisgIHNsZWVwKDEpOworCisgIC8vIHRlbGwgcmVhZGVyIDEgdG8gbGV0IGdvIG9mIHRoZSBsb2NrCisgIHJlYWRlcjEtPnNpZ25hbCgpOworCisgIC8vIHdhaXQgZm9yIHNvbWVvbmUgdG8gZ2V0IHRoZSBsb2NrCisgIHdoaWxlICghcmVhZGVyMi0+Z290TG9jaygpICYmICF3cml0ZXItPmdvdExvY2soKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorCisgIC8vIHRoZSB0ZXN0IHN1Y2NlZWRlZCBpZiB0aGUgV1JJVEVSIGdvdCB0aGUgbG9jay4KKyAgYm9vbCBzdWNjZXNzID0gd3JpdGVyLT5nb3RMb2NrKCk7CisKKyAgLy8gdGVsbCBldmVyeW9uZSB3ZSdyZSBkb25lIGFuZCB3YWl0IGZvciB0aGVtIHRvIGZpbmlzaAorICByZWFkZXIyLT5zaWduYWwoKTsKKyAgd3JpdGVyLT5zaWduYWwoKTsKKyAgdHJlYWRlcjEtPmpvaW4oKTsKKyAgdHJlYWRlcjItPmpvaW4oKTsKKyAgdHdyaXRlci0+am9pbigpOworCisgIC8vIG1ha2Ugc3VyZSBpdCB3b3JrZWQuCisgIEJPT1NUX0NIRUNLX01FU1NBR0Uoc3VjY2VzcywgIndyaXRlciBpcyBzdGFydmluZyIpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoUldNdXRleFN0YXJ2ZVRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX290aGVyKSB7CisgIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9ycikgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OlJPVU5EX1JPQklOKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfZmlmbykgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OkZJRk8pOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UZXN0cy5jcHAgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGJhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiVGhyZWFkRmFjdG9yeVRlc3RzLmgiCisjaW5jbHVkZSAiVGltZXJNYW5hZ2VyVGVzdHMuaCIKKyNpbmNsdWRlICJUaHJlYWRNYW5hZ2VyVGVzdHMuaCIKKworLy8gVGhlIHRlc3Qgd2VpZ2h0LCB3aGVyZSAxMCBpcyAxMCB0aW1lcyBtb3JlIHRocmVhZHMgdGhhbiBiYXNlbGluZQorLy8gYW5kIHRoZSBiYXNlbGluZSBpcyBvcHRpbWl6ZWQgZm9yIHJ1bm5pbmcgaW4gdmFsZ3JpbmQKK3N0YXRpYyBpbnQgV0VJR0hUID0gMTA7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworCisgIHN0ZDo6c3RyaW5nIGFyZzsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJncyhhcmdjIC0gMSA+IDEgPyBhcmdjIC0gMSA6IDEpOworCisgIGFyZ3NbMF0gPSAiYWxsIjsKKworICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgeworICAgIGFyZ3NbaXggLSAxXSA9IHN0ZDo6c3RyaW5nKGFyZ3ZbaXhdKTsKKyAgfQorCisgIGlmIChnZXRlbnYoIlZBTEdSSU5EIikgIT0gMCkgeworCSAgLy8gbG93ZXIgdGhlIHNjYWxlIG9mIGV2ZXJ5IHRlc3QKKwkgIFdFSUdIVCA9IDE7CisgIH0KKworICBib29sIHJ1bkFsbCA9IGFyZ3NbMF0uY29tcGFyZSgiYWxsIikgPT0gMDsKKworICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLWZhY3RvcnkiKSA9PSAwKSB7CisKKyAgICBUaHJlYWRGYWN0b3J5VGVzdHMgdGhyZWFkRmFjdG9yeVRlc3RzOworCisgICAgc3RkOjpjb3V0IDw8ICJUaHJlYWRGYWN0b3J5IHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpbnQgcmVhcExvb3BzID0gMiAqIFdFSUdIVDsKKyAgICBpbnQgcmVhcENvdW50ID0gMTAwICogV0VJR0hUOworICAgIHNpemVfdCBmbG9vZExvb3BzID0gMzsKKyAgICBzaXplX3QgZmxvb2RDb3VudCA9IDUwMCAqIFdFSUdIVDsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgcmVhcCBOIHRocmVhZHMgdGVzdDogTiA9ICIgPDwgcmVhcExvb3BzIDw8ICJ4IiA8PCByZWFwQ291bnQgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKHJlYXBMb29wcywgcmVhcENvdW50KSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgcmVhcCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IGZsb29kIE4gdGhyZWFkcyB0ZXN0OiBOID0gIiA8PCBmbG9vZExvb3BzIDw8ICJ4IiA8PCBmbG9vZENvdW50IDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGhyZWFkRmFjdG9yeVRlc3RzLmZsb29kTlRlc3QoZmxvb2RMb29wcywgZmxvb2RDb3VudCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdHRUaHJlYWRGYWN0b3J5IGZsb29kIE4gdGhyZWFkcyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3Rvcnkgc3luY2hyb25vdXMgc3RhcnQgdGVzdCIgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMuc3luY2hTdGFydFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3Rvcnkgc3luY2hyb25vdXMgc3RhcnQgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IG1vbml0b3IgdGltZW91dCB0ZXN0IiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5tb25pdG9yVGltZW91dFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgbW9uaXRvciB0aW1lb3V0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInV0aWwiKSA9PSAwKSB7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlV0aWwgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFV0aWwgbWluaW11bSB0aW1lIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpbnQ2NF90IHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgaW50NjRfdCB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRNaW5pbXVtIHRpbWU6ICIgPDwgdGltZTAxIC0gdGltZTAwIDw8ICJtcyIgPDwgc3RkOjplbmRsOworCisgICAgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICB0aW1lMDEgPSB0aW1lMDA7CisgICAgc2l6ZV90IGNvdW50ID0gMDsKKworICAgIHdoaWxlICh0aW1lMDEgPCB0aW1lMDAgKyAxMCkgeworICAgICAgY291bnQrKzsKKyAgICAgIHRpbWUwMSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRzY2FsbCBwZXIgbXM6ICIgPDwgY291bnQgLyAodGltZTAxIC0gdGltZTAwKSA8PCBzdGQ6OmVuZGw7CisgIH0KKworICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGltZXItbWFuYWdlciIpID09IDApIHsKKworICAgIHN0ZDo6Y291dCA8PCAiVGltZXJNYW5hZ2VyIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAwIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBUaW1lck1hbmFnZXJUZXN0cyB0aW1lck1hbmFnZXJUZXN0czsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAwKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDEiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAxKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDIiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAyKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDMiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAzKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDQiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDA0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aHJlYWQtbWFuYWdlciIpID09IDApIHsKKworICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOworCisgICAgeworICAgICAgc2l6ZV90IHdvcmtlckNvdW50ID0gMTAgKiBXRUlHSFQ7CisgICAgICBzaXplX3QgdGFza0NvdW50ID0gNTAwICogV0VJR0hUOworICAgICAgaW50NjRfdCBkZWxheSA9IDEwTEw7CisKKyAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7CisKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYXBpIHRlc3Q6IiA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIGlmICghdGhyZWFkTWFuYWdlclRlc3RzLmFwaVRlc3QoKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGFwaVRlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50CisgICAgICAgICAgICAgICAgPDwgIiB0YXNrIGNvdW50OiAiIDw8IHRhc2tDb3VudCA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKKworICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRocmVhZE1hbmFnZXIgbG9hZFRlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGJsb2NrIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudAorICAgICAgICAgICAgICAgIDw8ICIgZGVsYXk6ICIgPDwgZGVsYXkgPDwgc3RkOjplbmRsOworCisgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5ibG9ja1Rlc3QoZGVsYXksIHdvcmtlckNvdW50KSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGJsb2NrVGVzdCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1tYW5hZ2VyLWJlbmNobWFyayIpID09IDApIHsKKworICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciBiZW5jaG1hcmsgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHsKKworICAgICAgc2l6ZV90IG1pbldvcmtlckNvdW50ID0gMjsKKworICAgICAgc2l6ZV90IG1heFdvcmtlckNvdW50ID0gODsKKworICAgICAgc2l6ZV90IHRhc2tzUGVyV29ya2VyID0gMTAwICogV0VJR0hUOworCisgICAgICBpbnQ2NF90IGRlbGF5ID0gNUxMOworCisgICAgICBmb3IgKHNpemVfdCB3b3JrZXJDb3VudCA9IG1pbldvcmtlckNvdW50OyB3b3JrZXJDb3VudCA8PSBtYXhXb3JrZXJDb3VudDsgd29ya2VyQ291bnQgKj0gNCkgeworCisgICAgICAgIHNpemVfdCB0YXNrQ291bnQgPSB3b3JrZXJDb3VudCAqIHRhc2tzUGVyV29ya2VyOworCisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgbG9hZCB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgICAgICAgICAgIDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKKworICAgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5sb2FkVGVzdCh0YXNrQ291bnQsIGRlbGF5LCB3b3JrZXJDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RkOjpjb3V0IDw8ICJBTEwgVEVTVFMgUEFTU0VEIiA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOTg1MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCisvKioKKyAqIFRocmVhZE1hbmFnZXJUZXN0cyBjbGFzcworICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIFRocmVhZEZhY3RvcnlUZXN0cyB7CisKK3B1YmxpYzoKKyAgLyoqCisgICAqIFJlYXAgTiB0aHJlYWRzCisgICAqLworICBjbGFzcyBSZWFwTlRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworCisgIHB1YmxpYzoKKyAgICBSZWFwTlRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50JiBhY3RpdmVDb3VudCkgOiBfbW9uaXRvcihtb25pdG9yKSwgX2NvdW50KGFjdGl2ZUNvdW50KSB7fQorCisgICAgdm9pZCBydW4oKSB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICAKKyAgICAgIGlmICgtLV9jb3VudCA9PSAwKSB7CisgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOworICAgICAgfQorICAgIH0KKworICAgIE1vbml0b3ImIF9tb25pdG9yOworICAgIGludCYgX2NvdW50OworICB9OworCisgIGJvb2wgcmVhcE5UaHJlYWRzKGludCBsb29wID0gMSwgaW50IGNvdW50ID0gMTApIHsKKworICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisgICAgc2hhcmVkX3B0cjxNb25pdG9yPiBtb25pdG9yKG5ldyBNb25pdG9yKTsKKworICAgIGZvciAoaW50IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7CisKKyAgICAgIGludCBhY3RpdmVDb3VudCA9IDA7CisKKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkPiA+IHRocmVhZHM7CisgICAgICBpbnQgdGl4OworCisgICAgICBmb3IgKHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgeworICAgICAgICB0cnkgeworICAgICAgICAgICsrYWN0aXZlQ291bnQ7CisgICAgICAgICAgdGhyZWFkcy5wdXNoX2JhY2soCisgICAgICAgICAgICAgIHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+KG5ldyBSZWFwTlRhc2soKm1vbml0b3IsIGFjdGl2ZUNvdW50KSkpKTsKKyAgICAgICAgfSBjYXRjaCAoU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBjcmVhdGUgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGl4ID0gMDsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IHRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgICAgdGhyZWFkICE9IHRocmVhZHMuZW5kKCk7CisgICAgICAgICAgIHRpeCsrLCArK3RocmVhZCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOworICAgICAgICB9IGNhdGNoIChTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiYgZSkgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKQorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKCptb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50ID4gMCkgeworICAgICAgICAgIG1vbml0b3ItPndhaXQoMTAwMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRyZWFwZWQgIiA8PCBsaXgqIGNvdW50IDw8ICIgdGhyZWFkcyIgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0U3VjY2VzcyEiIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNsYXNzIFN5bmNoU3RhcnRUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKworICBwdWJsaWM6CisgICAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBTVE9QUElORywgU1RPUFBFRCB9OworCisgICAgU3luY2hTdGFydFRhc2soTW9uaXRvciYgbW9uaXRvciwgdm9sYXRpbGUgU1RBVEUmIHN0YXRlKSA6IF9tb25pdG9yKG1vbml0b3IpLCBfc3RhdGUoc3RhdGUpIHt9CisKKyAgICB2b2lkIHJ1bigpIHsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgICBpZiAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgeworICAgICAgICAgIF9zdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEOworICAgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgICB3aGlsZSAoX3N0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVEVEKSB7CisgICAgICAgICAgX21vbml0b3Iud2FpdCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9zdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBJTkcpIHsKKyAgICAgICAgICBfc3RhdGUgPSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRDsKKyAgICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIE1vbml0b3ImIF9tb25pdG9yOworICAgIHZvbGF0aWxlIFNUQVRFJiBfc3RhdGU7CisgIH07CisKKyAgYm9vbCBzeW5jaFN0YXJ0VGVzdCgpIHsKKworICAgIE1vbml0b3IgbW9uaXRvcjsKKworICAgIFN5bmNoU3RhcnRUYXNrOjpTVEFURSBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpVTklOSVRJQUxJWkVEOworCisgICAgc2hhcmVkX3B0cjxTeW5jaFN0YXJ0VGFzaz4gdGFzaworICAgICAgICA9IHNoYXJlZF9wdHI8U3luY2hTdGFydFRhc2s+KG5ldyBTeW5jaFN0YXJ0VGFzayhtb25pdG9yLCBzdGF0ZSkpOworCisgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKTsKKworICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0YXNrKTsKKworICAgIGlmIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6VU5JTklUSUFMSVpFRCkgeworCisgICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORzsKKworICAgICAgdGhyZWFkLT5zdGFydCgpOworICAgIH0KKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOworICAgICAgd2hpbGUgKHN0YXRlID09IFN5bmNoU3RhcnRUYXNrOjpTVEFSVElORykgeworICAgICAgICBtb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoc3RhdGUgIT0gU3luY2hTdGFydFRhc2s6OlNUQVJUSU5HKTsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOworCisgICAgICB0cnkgeworICAgICAgICBtb25pdG9yLndhaXQoMTAwKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgeworICAgICAgfQorCisgICAgICBpZiAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUQVJURUQpIHsKKworICAgICAgICBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpTVE9QUElORzsKKworICAgICAgICBtb25pdG9yLm5vdGlmeSgpOworICAgICAgfQorCisgICAgICB3aGlsZSAoc3RhdGUgPT0gU3luY2hTdGFydFRhc2s6OlNUT1BQSU5HKSB7CisgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RPUFBFRCk7CisKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhlIG9ubHkgZ3VhcmFudGVlIGEgbW9uaXRvciB0aW1lb3V0IGNhbiBnaXZlIHlvdSBpcyB0aGF0CisgICAqIGl0IHdpbGwgdGFrZSAiYXQgbGVhc3QiIGFzIGxvbmcgYXMgdGhlIHRpbWVvdXQsIG5vIGxlc3MuCisgICAqIFRoZXJlIGlzIGFic29sdXRlbHkgbm8gZ3VhcmFudGVlIGFyb3VuZCByZWdhaW5pbmcgZXhlY3V0aW9uCisgICAqIG5lYXIgdGhlIHRpbWVvdXQuICBPbiBhIGJ1c3kgc3lzdGVtIChsaWtlIGluc2lkZSBhIHRoaXJkIHBhcnR5CisgICAqIENJIGVudmlyb25tZW50KSBpdCBjb3VsZCB0YWtlIHF1aXRlIGEgYml0IGxvbmdlciB0aGFuIHRoZQorICAgKiByZXF1ZXN0ZWQgdGltZW91dCwgYW5kIHRoYXQncyBvay4KKyAgICovCisKKyAgYm9vbCBtb25pdG9yVGltZW91dFRlc3QoaW50NjRfdCBjb3VudCA9IDEwMDAsIGludDY0X3QgdGltZW91dCA9IDIpIHsKKworICAgIE1vbml0b3IgbW9uaXRvcjsKKworICAgIGludDY0X3Qgc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIGZvciAoaW50NjRfdCBpeCA9IDA7IGl4IDwgY291bnQ7IGl4KyspIHsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgbW9uaXRvci53YWl0KHRpbWVvdXQpOworICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgYm9vbCBzdWNjZXNzID0gKGVuZFRpbWUgLSBzdGFydFRpbWUpID49IChjb3VudCAqIHRpbWVvdXQpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKQorICAgICAgICAgICAgICA8PCAiOiBtaW5pbXVtIHJlcXVpcmVkIHRpbWUgdG8gZWxhcHNlICIgPDwgY291bnQgKiB0aW1lb3V0CisgICAgICAgICAgICAgIDw8ICJtczsgYWN0dWFsIGVsYXBzZWQgdGltZSAiIDw8IGVuZFRpbWUgLSBzdGFydFRpbWUgPDwgIm1zIgorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gc3VjY2VzczsKKyAgfQorCisgIGNsYXNzIEZsb29kVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisgIHB1YmxpYzoKKyAgICBGbG9vZFRhc2soY29uc3Qgc2l6ZV90IGlkLCBNb25pdG9yJiBtb24pIDogX2lkKGlkKSwgX21vbihtb24pIHt9CisgICAgfkZsb29kVGFzaygpIHsKKyAgICAgIGlmIChfaWQgJSAxMDAwMCA9PSAwKSB7CisJCVN5bmNocm9uaXplZCBzeW5jKF9tb24pOworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHR0aHJlYWQgIiA8PCBfaWQgPDwgIiBkb25lIiA8PCBzdGQ6OmVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBydW4oKSB7CisgICAgICBpZiAoX2lkICUgMTAwMDAgPT0gMCkgeworCQlTeW5jaHJvbml6ZWQgc3luYyhfbW9uKTsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgc3RhcnRlZCIgPDwgc3RkOjplbmRsOworICAgICAgfQorICAgIH0KKyAgICBjb25zdCBzaXplX3QgX2lkOworICAgIE1vbml0b3ImIF9tb247CisgIH07CisKKyAgdm9pZCBmb28oUGxhdGZvcm1UaHJlYWRGYWN0b3J5KiB0ZikgeyAodm9pZCl0ZjsgfQorCisgIGJvb2wgZmxvb2ROVGVzdChzaXplX3QgbG9vcCA9IDEsIHNpemVfdCBjb3VudCA9IDEwMDAwMCkgeworCisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgTW9uaXRvciBtb247CisJCisgICAgZm9yIChzaXplX3QgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKKworICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkgPSBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKTsKKyAgICAgIHRocmVhZEZhY3Rvcnkuc2V0RGV0YWNoZWQodHJ1ZSk7CisKKyAgICAgIGZvciAoc2l6ZV90IHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgeworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4LCBtb24pKTsKKyAgICAgICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7CisgICAgICAgICAgdGhyZWFkLT5zdGFydCgpOworCisgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGUpIHsKKworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKQorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBTeW5jaHJvbml6ZWQgc3luYyhtb24pOworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmbG9vZGVkICIgPDwgKGxpeCArIDEpICogY291bnQgPDwgIiB0aHJlYWRzIiA8PCBzdGQ6OmVuZGw7CisgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsKKyAgfQorfTsKKworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3QKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmMwOTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oCkBAIC0wLDAgKzEsNjg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgdGVzdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK3N0YXRpYyBzdGQ6OmRlcXVlPHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gPiBtX2V4cGlyZWQ7CitzdGF0aWMgdm9pZCBleHBpcmVkTm90aWZpZXIoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKK3sKKyAgbV9leHBpcmVkLnB1c2hfYmFjayhydW5uYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNsZWVwXyhpbnQ2NF90IG1pbGxpc2VjKSB7CisgIE1vbml0b3IgX3NsZWVwOworICBTeW5jaHJvbml6ZWQgcyhfc2xlZXApOworCisgIHRyeSB7CisgICAgX3NsZWVwLndhaXQobWlsbGlzZWMpOworICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICA7CisgIH0gY2F0Y2ggKC4uLikgeworICAgIGFzc2VydCgwKTsKKyAgfQorfQorCitjbGFzcyBUaHJlYWRNYW5hZ2VyVGVzdHMgeworCitwdWJsaWM6CisgIGNsYXNzIFRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworCisgIHB1YmxpYzoKKyAgICBUYXNrKE1vbml0b3ImIG1vbml0b3IsIHNpemVfdCYgY291bnQsIGludDY0X3QgdGltZW91dCkKKyAgICAgIDogX21vbml0b3IobW9uaXRvciksIF9jb3VudChjb3VudCksIF90aW1lb3V0KHRpbWVvdXQpLCBfc3RhcnRUaW1lKDApLCBfZW5kVGltZSgwKSwgX2RvbmUoZmFsc2UpIHt9CisKKyAgICB2b2lkIHJ1bigpIHsKKworICAgICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICAgIHNsZWVwXyhfdGltZW91dCk7CisKKyAgICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgICAgX2RvbmUgPSB0cnVlOworCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIlRocmVhZCAiIDw8IF9jb3VudCA8PCAiIGNvbXBsZXRlZCAiIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgICBfY291bnQtLTsKKyAgICAgICAgaWYgKF9jb3VudCAlIDEwMDAwID09IDApIHsKKyAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIE1vbml0b3ImIF9tb25pdG9yOworICAgIHNpemVfdCYgX2NvdW50OworICAgIGludDY0X3QgX3RpbWVvdXQ7CisgICAgaW50NjRfdCBfc3RhcnRUaW1lOworICAgIGludDY0X3QgX2VuZFRpbWU7CisgICAgYm9vbCBfZG9uZTsKKyAgICBNb25pdG9yIF9zbGVlcDsKKyAgfTsKKworICAvKioKKyAgICogRGlzcGF0Y2ggY291bnQgdGFza3MsIGVhY2ggb2Ygd2hpY2ggYmxvY2tzIGZvciB0aW1lb3V0IG1pbGxpc2Vjb25kcyB0aGVuCisgICAqIGNvbXBsZXRlcy4gVmVyaWZ5IHRoYXQgYWxsIHRhc2tzIGNvbXBsZXRlZCBhbmQgdGhhdCB0aHJlYWQgbWFuYWdlciBjbGVhbnMKKyAgICogdXAgcHJvcGVybHkgb24gZGVsZXRlLgorICAgKi8KKyAgYm9vbCBsb2FkVGVzdChzaXplX3QgY291bnQgPSAxMDAsIGludDY0X3QgdGltZW91dCA9IDEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQgPSA0KSB7CisKKyAgICBNb25pdG9yIG1vbml0b3I7CisKKyAgICBzaXplX3QgYWN0aXZlQ291bnQgPSBjb3VudDsKKworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOworCisgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgICAgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpOworCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKKyNlbmRpZgorICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworCisgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID4gdGFza3M7CisKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY291bnQ7IGl4KyspIHsKKworICAgICAgdGFza3MuaW5zZXJ0KHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPigKKyAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKG1vbml0b3IsIGFjdGl2ZUNvdW50LCB0aW1lb3V0KSkpOworICAgIH0KKworICAgIGludDY0X3QgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsKKyAgICAgICAgIGl4ICE9IHRhc2tzLmVuZCgpOworICAgICAgICAgaXgrKykgeworCisgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoKml4KTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0bG9hZGVkICIgPDwgY291bnQgPDwgIiB0YXNrcyB0byBleGVjdXRlIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKKworICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50ID4gMCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWN0aXZlQ291bnQgPSAiIDw8IGFjdGl2ZUNvdW50IDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgaW50NjRfdCBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CisgICAgaW50NjRfdCBsYXN0VGltZSA9IDA7CisKKyAgICBkb3VibGUgYXZlcmFnZVRpbWUgPSAwOworICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKKyAgICBpbnQ2NF90IG1heFRpbWUgPSAwOworCisgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOworICAgICAgICAgaXggIT0gdGFza3MuZW5kKCk7CisgICAgICAgICBpeCsrKSB7CisKKyAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrID0gKml4OworCisgICAgICBpbnQ2NF90IGRlbHRhID0gdGFzay0+X2VuZFRpbWUgLSB0YXNrLT5fc3RhcnRUaW1lOworCisgICAgICBhc3NlcnQoZGVsdGEgPiAwKTsKKworICAgICAgaWYgKHRhc2stPl9zdGFydFRpbWUgPCBmaXJzdFRpbWUpIHsKKyAgICAgICAgZmlyc3RUaW1lID0gdGFzay0+X3N0YXJ0VGltZTsKKyAgICAgIH0KKworICAgICAgaWYgKHRhc2stPl9lbmRUaW1lID4gbGFzdFRpbWUpIHsKKyAgICAgICAgbGFzdFRpbWUgPSB0YXNrLT5fZW5kVGltZTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbHRhIDwgbWluVGltZSkgeworICAgICAgICBtaW5UaW1lID0gZGVsdGE7CisgICAgICB9CisKKyAgICAgIGlmIChkZWx0YSA+IG1heFRpbWUpIHsKKyAgICAgICAgbWF4VGltZSA9IGRlbHRhOworICAgICAgfQorCisgICAgICBhdmVyYWdlVGltZSArPSBkZWx0YTsKKyAgICB9CisKKyAgICBhdmVyYWdlVGltZSAvPSBjb3VudDsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmlyc3Qgc3RhcnQ6ICIgPDwgZmlyc3RUaW1lIDw8ICIgTGFzdCBlbmQ6ICIgPDwgbGFzdFRpbWUKKyAgICAgICAgICAgICAgPDwgIiBtaW46ICIgPDwgbWluVGltZSA8PCAibXMgbWF4OiAiIDw8IG1heFRpbWUgPDwgIm1zIGF2ZXJhZ2U6ICIgPDwgYXZlcmFnZVRpbWUKKyAgICAgICAgICAgICAgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBib29sIHN1Y2Nlc3MgPSAodGltZTAxIC0gdGltZTAwKSA+PSAoKGludDY0X3QpY291bnQgKiB0aW1lb3V0KSAvIChpbnQ2NF90KXdvcmtlckNvdW50OworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKQorICAgICAgICAgICAgICA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8ICgoaW50NjRfdCljb3VudCAqIHRpbWVvdXQpIC8gKGludDY0X3Qpd29ya2VyQ291bnQgPDwgIm1zIGVsYXBzZWQgdGltZTogIiA8PCB0aW1lMDEgLSB0aW1lMDAKKyAgICAgICAgICAgICAgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gc3VjY2VzczsKKyAgfQorCisgIGNsYXNzIEJsb2NrVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisKKyAgcHVibGljOgorICAgIEJsb2NrVGFzayhNb25pdG9yJiBlbnRyeU1vbml0b3IsIE1vbml0b3ImIGJsb2NrTW9uaXRvciwgYm9vbCYgYmxvY2tlZCwgTW9uaXRvciYgZG9uZU1vbml0b3IsIHNpemVfdCYgY291bnQpCisgICAgICA6IF9lbnRyeU1vbml0b3IoZW50cnlNb25pdG9yKSwgX2VudGVyZWQoZmFsc2UpLCBfYmxvY2tNb25pdG9yKGJsb2NrTW9uaXRvciksIF9ibG9ja2VkKGJsb2NrZWQpLCBfZG9uZU1vbml0b3IoZG9uZU1vbml0b3IpLCBfY291bnQoY291bnQpIHt9CisKKyAgICB2b2lkIHJ1bigpIHsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2VudHJ5TW9uaXRvcik7CisgICAgICAgIF9lbnRlcmVkID0gdHJ1ZTsKKyAgICAgICAgX2VudHJ5TW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhfYmxvY2tNb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKF9ibG9ja2VkKSB7CisgICAgICAgICAgX2Jsb2NrTW9uaXRvci53YWl0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhfZG9uZU1vbml0b3IpOworICAgICAgICBpZiAoLS1fY291bnQgPT0gMCkgeworICAgICAgICAgIF9kb25lTW9uaXRvci5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIE1vbml0b3ImIF9lbnRyeU1vbml0b3I7CisgICAgYm9vbCBfZW50ZXJlZDsKKyAgICBNb25pdG9yJiBfYmxvY2tNb25pdG9yOworICAgIGJvb2wmIF9ibG9ja2VkOworICAgIE1vbml0b3ImIF9kb25lTW9uaXRvcjsKKyAgICBzaXplX3QmIF9jb3VudDsKKyAgfTsKKworICAvKioKKyAgICogQmxvY2sgdGVzdC4gIENyZWF0ZSBwZW5kaW5nVGFza0NvdW50TWF4IHRhc2tzLiAgVmVyaWZ5IHRoYXQgd2UgYmxvY2sgYWRkaW5nIHRoZQorICAgKiBwZW5kaW5nVGFza0NvdW50TWF4ICsgMXRoIHRhc2suICBWZXJpZnkgdGhhdCB3ZSB1bmJsb2NrIHdoZW4gYSB0YXNrIGNvbXBsZXRlcyAqLworCisgIGJvb2wgYmxvY2tUZXN0KGludDY0X3QgdGltZW91dCA9IDEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQgPSAyKSB7CisgICAgKHZvaWQpdGltZW91dDsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgIHRyeSB7CisKKyAgICAgIE1vbml0b3IgZW50cnlNb25pdG9yOyAgIC8vIG5vdCB1c2VkIGJ5IHRoaXMgdGVzdAorICAgICAgTW9uaXRvciBibG9ja01vbml0b3I7CisgICAgICBib29sIGJsb2NrZWRbXSA9IHt0cnVlLCB0cnVlLCB0cnVlfTsKKyAgICAgIE1vbml0b3IgZG9uZU1vbml0b3I7CisKKyAgICAgIHNpemVfdCBwZW5kaW5nVGFza01heENvdW50ID0gd29ya2VyQ291bnQ7CisKKyAgICAgIHNpemVfdCBhY3RpdmVDb3VudHNbXSA9IHt3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCwgMX07CisKKyAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgorICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCk7CisKKyAgICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgICAgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKworI2lmICFVU0VfU1REX1RIUkVBRAorICAgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKKyNlbmRpZgorICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKworICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKworICAgICAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gPiB0YXNrczsKKyAgICAgIHRhc2tzLnJlc2VydmUod29ya2VyQ291bnQgKyBwZW5kaW5nVGFza01heENvdW50KTsKKworICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHdvcmtlckNvdW50OyBpeCsrKSB7CisKKyAgICAgICAgdGFza3MucHVzaF9iYWNrKHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+KAorICAgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkWzBdLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnRzWzBdKSkpOworICAgICAgfQorCisgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGVuZGluZ1Rhc2tNYXhDb3VudDsgaXgrKykgeworCisgICAgICAgIHRhc2tzLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPigKKyAgICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhlbnRyeU1vbml0b3IsIGJsb2NrTW9uaXRvciwgYmxvY2tlZFsxXSwgZG9uZU1vbml0b3IsIGFjdGl2ZUNvdW50c1sxXSkpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7CisgICAgICAgICAgIGl4ICE9IHRhc2tzLmVuZCgpOworICAgICAgICAgICBpeCsrKSB7CisgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZCgqaXgpOworICAgICAgfQorCisgICAgICBpZiAoIShzdWNjZXNzID0gKHRocmVhZE1hbmFnZXItPnRvdGFsVGFza0NvdW50KCkgPT0gcGVuZGluZ1Rhc2tNYXhDb3VudCArIHdvcmtlckNvdW50KSkpIHsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgIH0KKworICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gZXh0cmFUYXNrKAorICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhlbnRyeU1vbml0b3IsIGJsb2NrTW9uaXRvciwgYmxvY2tlZFsyXSwgZG9uZU1vbml0b3IsIGFjdGl2ZUNvdW50c1syXSkpOworCisgICAgICB0cnkgeworICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWNjZXNzIGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgIH0gY2F0Y2ggKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mKSB7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlNob3VsZCBoYXZlIHRpbWVkIG91dCBhZGRpbmcgdGFzayBpbiBleGNlc3Mgb2YgcGVuZGluZyB0YXNrIGNvdW50Iik7CisgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZChleHRyYVRhc2ssIC0xKTsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWNjZXNzIGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgeworICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRpbWVvdXQgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOworICAgICAgfSBjYXRjaCAoVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYpIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0CisgICAgICB9CisKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IgorICAgICAgICAgICAgICAgIDw8ICJQZW5kaW5nIHRhc2tzICIgPDwgdGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhibG9ja01vbml0b3IpOworICAgICAgICBibG9ja2VkWzBdID0gZmFsc2U7CisgICAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgcyhkb25lTW9uaXRvcik7CisgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudHNbMF0gIT0gMCkgeworICAgICAgICAgIGRvbmVNb25pdG9yLndhaXQoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICA8PCAiUGVuZGluZyB0YXNrcyAiIDw8IHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZChleHRyYVRhc2ssIDEpOworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IgorICAgICAgICAgICAgICAgICAgPDwgImFkZCB0aW1lZCBvdXQgdW5leHBlY3RlZGx5IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGltZW91dCBhZGRpbmcgdGFzayIpOworCisgICAgICB9IGNhdGNoIChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJikgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICAgIDw8ICJhZGQgZW5jb3VudGVyZWQgdG9vIG1hbnkgcGVuZGluZyBleGVwY3Rpb25zIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGltZW91dCBhZGRpbmcgdGFzayIpOworICAgICAgfQorCisgICAgICAvLyBXYWtlIHVwIHRhc2tzIHRoYXQgd2VyZSBwZW5kaW5nIGJlZm9yZSBhbmQgd2FpdCBmb3IgdGhlbSB0byBjb21wbGV0ZQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICAgIGJsb2NrZWRbMV0gPSBmYWxzZTsKKyAgICAgICAgYmxvY2tNb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgfQorCisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGRvbmVNb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50c1sxXSAhPSAwKSB7CisgICAgICAgICAgZG9uZU1vbml0b3Iud2FpdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFdha2UgdXAgdGhlIGV4dHJhIHRhc2sgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlCisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgICAgYmxvY2tlZFsyXSA9IGZhbHNlOworICAgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoZG9uZU1vbml0b3IpOworICAgICAgICB3aGlsZSAoYWN0aXZlQ291bnRzWzJdICE9IDApIHsKKyAgICAgICAgICBkb25lTW9uaXRvci53YWl0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdGhyZWFkTWFuYWdlci0+c3RvcCgpOworCisgICAgICBpZiAoIShzdWNjZXNzID0gKHRocmVhZE1hbmFnZXItPnRvdGFsVGFza0NvdW50KCkgPT0gMCkpKSB7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdG90YWwgdGFzayBjb3VudCIpOworICAgICAgfQorCisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZSkgeworICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKworCisgIGJvb2wgYXBpVGVzdCgpIHsKKworICAgIC8vIHByb3ZlIGN1cnJlbnRUaW1lIGhhcyBtaWxsaXNlY29uZHMgZ3JhbnVsYXJpdHkgc2luY2UgbWFueSBvdGhlciB0aGluZ3MgZGVwZW5kIG9uIGl0CisgICAgaW50NjRfdCBhID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBzbGVlcF8oMTAwKTsKKyAgICBpbnQ2NF90IGIgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGlmIChiIC0gYSA8IDUwIHx8IGIgLSBhID4gMTUwKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdGV4cGVjdGVkIDEwMG1zIGdhcCwgZm91bmQgIiA8PCAoYi1hKSA8PCAibXMgZ2FwIGluc3RlYWQuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgLy8gdGVzdCBvbmNlIHdpdGggYSBkZXRhY2hlZCB0aHJlYWQgZmFjdG9yeSBhbmQgb25jZSB3aXRoIGEgam9pbmFibGUgdGhyZWFkIGZhY3RvcnkKKworICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoZmFsc2UpKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0YXBpVGVzdCB3aXRoIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5IiA8PCBzdGQ6OmVuZGw7CisgICAgaWYgKCFhcGlUZXN0V2l0aFRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aHJlYWRGYWN0b3J5LnJlc2V0KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkodHJ1ZSkpOworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0YXBpVGVzdCB3aXRoIGRldGFjaGVkIHRocmVhZCBmYWN0b3J5IiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIGFwaVRlc3RXaXRoVGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyNlbHNlCisgICAgcmV0dXJuIGFwaVRlc3RXaXRoVGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisjZW5kaWYKKworICB9CisKKyAgYm9vbCBhcGlUZXN0V2l0aFRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkpCisgIHsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDEpOworICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOworCisgICAgLy8gdmVyaWZ5IHdlIGNhbm5vdCBjaGFuZ2UgdGhlIHRocmVhZCBmYWN0b3J5IHRvIG9uZSB3aXRoIHRoZSBvcHBvc2l0ZSBkZXRhY2hlZCBzZXR0aW5nCisgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkyCisgICAgICAgID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCisgICAgICAgICAgUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTiwKKyAgICAgICAgICBQb3NpeFRocmVhZEZhY3Rvcnk6Ok5PUk1BTCwKKyAgICAgICAgICAxLAorICAgICAgICAgICF0aHJlYWRGYWN0b3J5LT5pc0RldGFjaGVkKCkpKTsKKyAgICB0cnkgeworICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5Mik7CisgICAgICAvLyBpZiB0aGUgY2FsbCBzdWNjZWVkZWQgd2UgY2hhbmdlZCB0aGUgdGhyZWFkIGZhY3RvcnkgdG8gb25lIHRoYXQgaGFkIHRoZSBvcHBvc2l0ZSBzZXR0aW5nIGZvciAiaXNEZXRhY2hlZCgpIi4KKyAgICAgIC8vIHRoaXMgaXMgYmFkLCBiZWNhdXNlIHRoZSB0aHJlYWQgbWFuYWdlciBjaGVja3Mgd2l0aCB0aGUgdGhyZWFkIGZhY3RvcnkgdG8gc2VlIGlmIGl0IHNob3VsZCBqb2luIHRocmVhZHMKKyAgICAgIC8vIGFzIHRoZXkgYXJlIGxlYXZpbmcgLSBzbyB0aGUgZGV0YWNoZWQgc3RhdHVzIG9mIG5ldyB0aHJlYWRzIGNhbm5vdCBjaGFuZ2Ugd2hpbGUgdGhlcmUgYXJlIGV4aXN0aW5nIHRocmVhZHMuCisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFNob3VsZCBub3QgYmUgYWJsZSB0byBjaGFuZ2UgdGhyZWFkIGZhY3RvcnkgZGV0YWNoZWQgZGlzcG9zaXRpb24iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIC8qIGV4cGVjdGVkICovCisgICAgfQorI2VuZGlmCisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0c3RhcnRpbmcuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisgICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soZXhwaXJlZE5vdGlmaWVyKTsgLy8gc3RkOjpiaW5kKCZUaHJlYWRNYW5hZ2VyVGVzdHM6OmV4cGlyZWROb3RpZmllciwgdGhpcykpOworCisjZGVmaW5lIEVYUEVDVChGVU5DLCBDT1VOVCkgeyBzaXplX3QgYyA9IEZVTkM7IGlmIChjICE9IENPVU5UKSB7IHN0ZDo6Y2VyciA8PCAiZXhwZWN0ZWQgIiAjRlVOQyIgdG8gYmUgIiAjQ09VTlQgIiwgYnV0IHdhcyAiIDw8IGMgPDwgc3RkOjplbmRsOyByZXR1cm4gZmFsc2U7IH0gfQorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIDJuZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDIpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMik7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIDJuZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIDFzdCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGJsb2NraW5nIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRocm93IGEgYmxvY2tpbmcgdGFzayBpbnRvIHRoZSBtaXgKKyAgICBNb25pdG9yIGVudHJ5TW9uaXRvcjsgICAvLyBzaWduYWxlZCB3aGVuIHRhc2sgaXMgcnVubmluZworICAgIE1vbml0b3IgYmxvY2tNb25pdG9yOyAgIC8vIHRvIGJlIHNpZ25hbGVkIHRvIHVuYmxvY2sgdGhlIHRhc2sKKyAgICBib29sIGJsb2NrZWQodHJ1ZSk7ICAgICAvLyBzZXQgdG8gZmFsc2UgYmVmb3JlIG5vdGlmeWluZworICAgIE1vbml0b3IgZG9uZU1vbml0b3I7ICAgIC8vIHNpZ25hbGVkIHdoZW4gY291bnQgcmVhY2hlcyB6ZXJvCisgICAgc2l6ZV90IGFjdGl2ZUNvdW50ID0gMTsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiBibG9ja2luZ1Rhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWQsIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCkpOworICAgIHRocmVhZE1hbmFnZXItPmFkZChibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIG90aGVyIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiBvdGhlclRhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCwgMCkpOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKG90aGVyVGFzayk7CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAyKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgYmxvY2tpbmcgdGFzayBzcGVjaWZpY2FsbHkuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZShibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIG5leHQgcGVuZGluZyB0YXNrLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHNoYXJlZF9wdHI8UnVubmFibGU+IG5leHRUYXNrID0gdGhyZWFkTWFuYWdlci0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBpZiAobmV4dFRhc2sgIT0gb3RoZXJUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCByZW1vdmVOZXh0UGVuZGluZyB0byByZXR1cm4gb3RoZXJUYXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIG5leHQgcGVuZGluZyB0YXNrIChub25lIGxlZnQpLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIG5leHRUYXNrID0gdGhyZWFkTWFuYWdlci0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBpZiAobmV4dFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIHJlbW92ZU5leHRQZW5kaW5nIHRvIHJldHVybiBhbiBlbXB0eSBSdW5uYWJsZSIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRhZGQgMiBleHBpcmVkIHRhc2tzIGFuZCAxIG5vdC4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gZXhwaXJlZFRhc2soCisgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudCwgMCkpOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4cGlyZWRUYXNrLCAwLCAxKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsgICAgICAgLy8gYWRkIG9uZSB0aGF0IGhhc24ndCBleHBpcmVkIHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHNraXBwZWQKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXhwaXJlZFRhc2ssIDAsIDEpOyAgLy8gYWRkIGEgc2Vjb25kIGV4cGlyZWQgdG8gZW5zdXJlIHJlbW92ZUV4cGlyZWRUYXNrcyByZW1vdmVzIGJvdGgKKworICAgIHNsZWVwXyg1MCk7ICAvLyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgZWxhcHNlcyBmb3IgaXQgdG8gZXhwaXJlIC0gdGhlIHNob3J0ZXN0IGV4cGlyYXRpb24gdGltZSBpcyAxIG1pbGxpc2Vjb25kCisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAzKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+ZXhwaXJlZFRhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgZXhwaXJlZCB0YXNrcy4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIW1fZXhwaXJlZC5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgZW1wdHkiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVFeHBpcmVkVGFza3MoKTsKKworICAgIGlmIChtX2V4cGlyZWQuc2l6ZSgpICE9IDIpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZCB0byBiZSBzZXQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobV9leHBpcmVkLmZyb250KCkgIT0gZXhwaXJlZFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZFswXSB0byBiZSB0aGUgZXhwaXJlZCB0YXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1fZXhwaXJlZC5wb3BfZnJvbnQoKTsKKworICAgIGlmIChtX2V4cGlyZWQuZnJvbnQoKSAhPSBleHBpcmVkVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkWzFdIHRvIGJlIHRoZSBleHBpcmVkIHRhc2siIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2V4cGlyZWQuY2xlYXIoKTsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZShibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMik7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGV4cGlyZWQgdGFzayAoYWdhaW4pLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChleHBpcmVkVGFzaywgMCwgMSk7ICAvLyBleHBpcmVzIGluIDFtcworICAgIHNsZWVwXyg1MCk7ICAvLyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgZWxhcHNlcyBmb3IgaXQgdG8gZXhwaXJlIC0gdGhlIHNob3J0ZXN0IGV4cGlyYXRpb24gdGltZSBpcyAxbXMKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRhZGQgd29ya2VyIHRvIGNvbnN1bWUgZXhwaXJlZCB0YXNrLi4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworICAgIHNsZWVwXygxMDApOyAgLy8gbWFrZSBzdXJlIGl0IGhhcyB0aW1lIHRvIHNwaW4gdXAgYW5kIGV4cGlyZSB0aGUgdGFzaworCisgICAgaWYgKG1fZXhwaXJlZC5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgc2V0IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1fZXhwaXJlZC5mcm9udCgpICE9IGV4cGlyZWRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgdGhlIGV4cGlyZWQgdGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fZXhwaXJlZC5jbGVhcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMyk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0dHJ5IHRvIHJlbW92ZSB0b28gbWFueSB3b3JrZXJzIiA8PCBzdGQ6OmVuZGw7CisgICAgdHJ5IHsKKyAgICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigyKTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gY2F0Y2ggKGNvbnN0IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiYpIHsKKyAgICAgIC8qIGV4cGVjdGVkICovCisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMyk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIGJsb2NraW5nIHRhc2suLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChibG9ja2luZ1Rhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIHdvcmtlci4uICIgPDwgc3RkOjplbmRsOworCisgICAgdGhyZWFkTWFuYWdlci0+YWRkV29ya2VyKCk7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoZW50cnlNb25pdG9yKTsKKyAgICAgIHdoaWxlICghYmxvY2tpbmdUYXNrLT5fZW50ZXJlZCkgeworICAgICAgICBlbnRyeU1vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHVuYmxvY2sgdGFzayBhbmQgcmVtb3ZlIHdvcmtlci4uICIgPDwgc3RkOjplbmRsOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgIGJsb2NrZWQgPSBmYWxzZTsKKyAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICB9CisgICAgdGhyZWFkTWFuYWdlci0+cmVtb3ZlV29ya2VyKCk7CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRjbGVhbnVwLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBibG9ja2luZ1Rhc2sucmVzZXQoKTsKKyAgICB0aHJlYWRNYW5hZ2VyLnJlc2V0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3Q7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXJUZXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTJjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyVGVzdHMuaApAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgdGVzdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK2NsYXNzIFRpbWVyTWFuYWdlclRlc3RzIHsKKworcHVibGljOgorICBjbGFzcyBUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKKyAgcHVibGljOgorICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50NjRfdCB0aW1lb3V0KQorICAgICAgOiBfdGltZW91dCh0aW1lb3V0KSwKKyAgICAgICAgX3N0YXJ0VGltZShVdGlsOjpjdXJyZW50VGltZSgpKSwKKyAgICAgICAgX2VuZFRpbWUoMCksCisgICAgICAgIF9tb25pdG9yKG1vbml0b3IpLAorICAgICAgICBfc3VjY2VzcyhmYWxzZSksCisgICAgICAgIF9kb25lKGZhbHNlKSB7fQorCisgICAgflRhc2soKSB7IHN0ZDo6Y2VyciA8PCB0aGlzIDw8IHN0ZDo6ZW5kbDsgfQorCisgICAgdm9pZCBydW4oKSB7CisKKyAgICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgIF9zdWNjZXNzID0gKF9lbmRUaW1lIC0gX3N0YXJ0VGltZSkgPj0gX3RpbWVvdXQ7CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgICBfZG9uZSA9IHRydWU7CisgICAgICAgIF9tb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgX3RpbWVvdXQ7CisgICAgaW50NjRfdCBfc3RhcnRUaW1lOworICAgIGludDY0X3QgX2VuZFRpbWU7CisgICAgTW9uaXRvciYgX21vbml0b3I7CisgICAgYm9vbCBfc3VjY2VzczsKKyAgICBib29sIF9kb25lOworICB9OworCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MgYW5kIHdhaXRzIGZvciB0aGUgZmlyc3QgdG8gZXhwaXJlIHdpdGhpbiAxMCUKKyAgICogb2YgdGhlIGV4cGVjdGVkIGV4cGlyYXRpb24gdGltZS4gSXQgdGhlbiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyCisgICAqIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0IHRhc2sgd2hlbiB0aGUKKyAgICogbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDAoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiBvcnBoYW5UYXNrCisgICAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCAxMCAqIHRpbWVvdXQpKTsKKworICAgIHsKKyAgICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICAgIGlmICh0aW1lck1hbmFnZXIuc3RhdGUoKSAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJ0aW1lck1hbmFnZXIgaXMgbm90IGluIHRoZSBTVEFSVEVEIHN0YXRlLCBidXQgc2hvdWxkIGJlIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gRG9uJ3QgY3JlYXRlIHRhc2sgeWV0LCBiZWNhdXNlIGl0cyBjb25zdHJ1Y3RvciBzZXRzIHRoZSBleHBlY3RlZCBjb21wbGV0aW9uIHRpbWUsIGFuZCB3ZQorICAgICAgLy8gbmVlZCB0byBkZWxheSBiZXR3ZWVuIGluc2VydGluZyB0aGUgdHdvIHRhc2tzIGludG8gdGhlIHJ1biBxdWV1ZS4KKyAgICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2s7CisKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgICB0aW1lck1hbmFnZXIuYWRkKG9ycGhhblRhc2ssIDEwICogdGltZW91dCk7CisKKyAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUModGltZW91dCAqIDEwMDApOworCisgICAgICAgIHRhc2sucmVzZXQobmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGltZW91dCk7CisgICAgICAgIF9tb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKworICAgICAgaWYgKCF0YXNrLT5fZG9uZSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInRhc2sgaXMgbm90IGRvbmUsIGJ1dCBpdCBzaG91bGQgaGF2ZSBleGVjdXRlZCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAodGFzay0+X3N1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpIDw8ICIhIiA8PCBzdGQ6OmVuZGw7CisgICAgfQorCisgICAgaWYgKG9ycGhhblRhc2stPl9kb25lKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIm9ycGhhbiB0YXNrIGlzIGRvbmUsIGJ1dCBpdCBzaG91bGQgbm90IGhhdmUgZXhlY3V0ZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MsIHJlbW92ZXMgdGhlIGZpcnN0IG9uZSB0aGVuIHdhaXRzIGZvciB0aGUgc2Vjb25kIG9uZS4gSXQgdGhlbgorICAgKiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0CisgICAqIHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDEoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdHdvIHRhc2tzCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDIpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gUmVtb3ZlIG9uZSB0YXNrIGFuZCB3YWl0IHVudGlsIHRoZSBvdGhlciBoYXMgY29tcGxldGVkCisgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0YXNrVG9SZW1vdmUpOworICAgIF9tb25pdG9yLndhaXQodGltZW91dCAqIDIpOworCisgICAgYXNzZXJ0KCF0YXNrVG9SZW1vdmUtPl9kb25lKTsKKyAgICBhc3NlcnQodGFzay0+X2RvbmUpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzIHdpdGggdGhlIHNhbWUgY2FsbGJhY2sgYW5kIGFub3RoZXIgb25lLCB0aGVuIHJlbW92ZXMgdGhlIHR3bworICAgKiBkdXBsaWNhdGVkIHRoZW4gd2FpdHMgZm9yIHRoZSBsYXN0IG9uZS4gSXQgdGhlbiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5CisgICAqIGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0IHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZQorICAgKiBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDIoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgb25lIHRhc2tzIGFuZCBhZGQgaXQgdHdpY2UKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrVG9SZW1vdmUKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMykpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0KTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCAqIDIpOworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgdGFzayAoZS5nLiB0d28gdGltZXJzKSBhbmQgd2FpdCB1bnRpbCB0aGUgb3RoZXIgaGFzIGNvbXBsZXRlZAorICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGFza1RvUmVtb3ZlKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIHR3byB0YXNrcywgcmVtb3ZlcyB0aGUgZmlyc3Qgb25lIHRoZW4gd2FpdHMgZm9yIHRoZSBzZWNvbmQgb25lLiBJdCB0aGVuCisgICAqIHZlcmlmaWVzIHRoYXQgdGhlIHRpbWVyIG1hbmFnZXIgcHJvcGVybHkgY2xlYW4gdXAgaXRzZWxmIGFuZCB0aGUgcmVtYWluaW5nIG9ycGhhbmVkIHRpbWVvdXQKKyAgICogdGFzayB3aGVuIHRoZSBtYW5hZ2VyIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBpdHMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuCisgICAqLworICBib29sIHRlc3QwMyhpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSB0d28gdGFza3MKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrVG9SZW1vdmUKKyAgICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAyKSk7CisgICAgVGltZXJNYW5hZ2VyOjpUaW1lciB0aW1lciA9IHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0KTsKKworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBSZW1vdmUgb25lIHRhc2sgYW5kIHdhaXQgdW50aWwgdGhlIG90aGVyIGhhcyBjb21wbGV0ZWQKKyAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRpbWVyKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIC8vIFZlcmlmeSBiZWhhdmlvciB3aGVuIHJlbW92aW5nIHRoZSByZW1vdmVkIHRhc2sKKyAgICB0cnkgeworICAgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0aW1lcik7CisgICAgICBhc3NlcnQoMCA9PSAiRVJST1I6IFRoaXMgcmVtb3ZlIHNob3VsZCBzZW5kIGEgTm9TdWNoVGFza0V4Y2VwdGlvbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTm9TdWNoVGFza0V4Y2VwdGlvbiYpIHsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyBvbmUgdGFza3MsIGFuZCB0cmllcyB0byByZW1vdmUgaXQgYWZ0ZXIgaXQgaGFzIGV4cGlyZWQuCisgICAqLworICBib29sIHRlc3QwNChpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSB0YXNrCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAxMCkpOworICAgIFRpbWVyTWFuYWdlcjo6VGltZXIgdGltZXIgPSB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFdhaXQgdW50aWwgdGhlIHRhc2sgaGFzIGNvbXBsZXRlZAorICAgIF9tb25pdG9yLndhaXQodGltZW91dCk7CisKKyAgICAvLyBWZXJpZnkgYmVoYXZpb3Igd2hlbiByZW1vdmluZyB0aGUgZXhwaXJlZCB0YXNrCisgICAgdHJ5IHsKKyAgICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgICAgYXNzZXJ0KDAgPT0gIkVSUk9SOiBUaGlzIHJlbW92ZSBzaG91bGQgc2VuZCBhIE5vU3VjaFRhc2tFeGNlcHRpb24gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE5vU3VjaFRhc2tFeGNlcHRpb24mKSB7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBmcmllbmQgY2xhc3MgVGVzdFRhc2s7CisKKyAgTW9uaXRvciBfbW9uaXRvcjsKK307CisKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvbGluay9MaW5rVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvbGluay9MaW5rVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMTRkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9saW5rL0xpbmtUZXN0LmNwcApAQCAtMCwwICsxLDIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ludCBtYWluKGludCwgY2hhcioqKSB7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwIGIvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTc5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMS5jcHAKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBhIGxpbmsgdGVzdCB0aGF0IG1ha2VzIHN1cmUgZ2VuZXJhdGVkCisgKiB0ZW1wbGF0ZWQgc2VydmljZSBoZWFkZXJzIGNhbiBiZSBpbmNsdWRlZCBmcm9tIG11bHRpcGxlCisgKiBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqLworCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAgYi9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9saW5rL1RlbXBsYXRlZFNlcnZpY2UyLmNwcApAQCAtMCwwICsxLDI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYSBwYXJ0IG9mIGEgbGluayB0ZXN0IHRoYXQgbWFrZXMgc3VyZSBnZW5lcmF0ZWQKKyAqIHRlbXBsYXRlZCBzZXJ2aWNlIGhlYWRlcnMgY2FuIGJlIGluY2x1ZGVkIGZyb20gbXVsdGlwbGUKKyAqIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICovCisKKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkZGJjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiRXZlbnRMb2cuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCituYW1lc3BhY2UgeworCisvLyBEZWZpbmUgZW52aXJvbm1lbnQgdmFyaWFibGUgREVCVUdfRVZFTlRMT0cgdG8gZW5hYmxlIGRlYnVnIGxvZ2dpbmcKKy8vIGV4OiAkIERFQlVHX0VWRU5UTE9HPTEgcHJvY2Vzc29yX3Rlc3QKK3N0YXRpYyBjb25zdCBjaGFyICogREVCVUdfRVZFTlRMT0cgPSBnZXRlbnYoIkRFQlVHX0VWRU5UTE9HIik7CisKK3ZvaWQgZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKERFQlVHX0VWRU5UTE9HKSB7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIH0KK30KK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKKwordWludDMyX3QgRXZlbnRMb2c6Om5leHRJZF8gPSAwOworCisjZGVmaW5lIEVWRU5UX1RZUEUodmFsdWUpIEV2ZW50VHlwZSBFdmVudExvZzo6dmFsdWUgPSAjdmFsdWUKK0VWRU5UX1RZUEUoRVRfTE9HX0VORCk7CitFVkVOVF9UWVBFKEVUX0NPTk5fQ1JFQVRFRCk7CitFVkVOVF9UWVBFKEVUX0NPTk5fREVTVFJPWUVEKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9TVEFSVEVEKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9GSU5JU0hFRCk7CitFVkVOVF9UWVBFKEVUX1BST0NFU1MpOworRVZFTlRfVFlQRShFVF9QUkVfUkVBRCk7CitFVkVOVF9UWVBFKEVUX1BPU1RfUkVBRCk7CitFVkVOVF9UWVBFKEVUX1BSRV9XUklURSk7CitFVkVOVF9UWVBFKEVUX1BPU1RfV1JJVEUpOworRVZFTlRfVFlQRShFVF9BU1lOQ19DT01QTEVURSk7CitFVkVOVF9UWVBFKEVUX0hBTkRMRVJfRVJST1IpOworCitFVkVOVF9UWVBFKEVUX0NBTExfSU5DUkVNRU5UX0dFTkVSQVRJT04pOworRVZFTlRfVFlQRShFVF9DQUxMX0dFVF9HRU5FUkFUSU9OKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9BRERfU1RSSU5HKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9HRVRfU1RSSU5HUyk7CitFVkVOVF9UWVBFKEVUX0NBTExfR0VUX0RBVEFfV0FJVCk7CitFVkVOVF9UWVBFKEVUX0NBTExfT05FV0FZX1dBSVQpOworRVZFTlRfVFlQRShFVF9DQUxMX0VYQ0VQVElPTl9XQUlUKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9VTkVYUEVDVEVEX0VYQ0VQVElPTl9XQUlUKTsKK0VWRU5UX1RZUEUoRVRfQ0FMTF9TRVRfVkFMVUUpOworRVZFTlRfVFlQRShFVF9DQUxMX0dFVF9WQUxVRSk7CitFVkVOVF9UWVBFKEVUX1dBSVRfUkVUVVJOKTsKKworRXZlbnRMb2c6OkV2ZW50TG9nKCkgeworICBpZF8gPSBuZXh0SWRfKys7CisgIGRlYnVnKCJOZXcgbG9nOiAlZCIsIGlkXyk7Cit9CisKK3ZvaWQgRXZlbnRMb2c6OmFwcGVuZChFdmVudFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FsbElkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgZGVidWcoIiVkIDwtLSAldSwgJXUsICVzIFwiJXNcIiIsIGlkXywgY29ubmVjdGlvbklkLCBjYWxsSWQsIHR5cGUsIG1lc3NhZ2UuY19zdHIoKSk7CisKKyAgRXZlbnQgZSh0eXBlLCBjb25uZWN0aW9uSWQsIGNhbGxJZCwgbWVzc2FnZSk7CisgIGV2ZW50c18ucHVzaF9iYWNrKGUpOworCisgIG1vbml0b3JfLm5vdGlmeSgpOworfQorCitFdmVudCBFdmVudExvZzo6d2FpdEZvckV2ZW50KGludDY0X3QgdGltZW91dCkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisKKyAgdHJ5IHsKKyAgICB3aGlsZSAoZXZlbnRzXy5lbXB0eSgpKSB7CisgICAgICBtb25pdG9yXy53YWl0KHRpbWVvdXQpOworICAgIH0KKyAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24gZXgpIHsKKyAgICByZXR1cm4gRXZlbnQoRVRfTE9HX0VORCwgMCwgMCwgIiIpOworICB9CisKKyAgRXZlbnQgZXZlbnQgPSBldmVudHNfLmZyb250KCk7CisgIGV2ZW50c18ucG9wX2Zyb250KCk7CisgIHJldHVybiBldmVudDsKK30KKworRXZlbnQgRXZlbnRMb2c6OndhaXRGb3JDb25uRXZlbnQodWludDMyX3QgY29ubklkLCBpbnQ2NF90IHRpbWVvdXQpIHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworCisgIEV2ZW50TGlzdDo6aXRlcmF0b3IgaXQgPSBldmVudHNfLmJlZ2luKCk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdHJ5IHsKKyAgICAgIC8vIFRPRE86IGl0IHdvdWxkIGJlIG5pY2VyIHRvIGhvbm9yIHRpbWVvdXQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzCisgICAgICAvLyBjYWxsLCByYXRoZXIgdGhhbiByZXN0YXJ0aW5nIGl0IGZvciBlYWNoIGNhbGwgdG8gd2FpdCgpLiAgSXQgc2hvdWxkbid0CisgICAgICAvLyBiZSBhIGJpZyBwcm9ibGVtIGluIHByYWN0aWNlLCB0aG91Z2guCisgICAgICB3aGlsZSAoaXQgPT0gZXZlbnRzXy5lbmQoKSkgeworICAgICAgICBtb25pdG9yXy53YWl0KHRpbWVvdXQpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uIGV4KSB7CisgICAgICByZXR1cm4gRXZlbnQoRVRfTE9HX0VORCwgMCwgMCwgIiIpOworICAgIH0KKworICAgIGlmIChpdC0+Y29ubmVjdGlvbklkID09IGNvbm5JZCkgeworICAgICAgRXZlbnQgZXZlbnQgPSAqaXQ7CisgICAgICBldmVudHNfLmVyYXNlKGl0KTsKKyAgICAgIHJldHVybiBldmVudDsKKyAgICB9CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuaCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjgyNzVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9URVNUX0VWRU5UTE9HX0hfCisjZGVmaW5lIF9USFJJRlRfVEVTVF9FVkVOVExPR19IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCisvLyBJbml0aWFsbHkgSSBtYWRlIEV2ZW50VHlwZSBhbiBlbnVtLCBidXQgdXNpbmcgY2hhciogcmVzdWx0cworLy8gaW4gbXVjaCBtb3JlIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYSBtaXNtYXRjaC4KKy8vIEl0IGFsc28gbGV0cyB1c2VycyBvZiBFdmVudExvZyBlYXNpbHkgZGVmaW5lIHRoZWlyIG93biBuZXcgdHlwZXMuCisvLyBDb21wYXJpbmcgdGhlIGxpdGVyYWwgcG9pbnRlciB2YWx1ZXMgc2hvdWxkIGJlIHNhZmUsIGJhcnJpbmcgYW55IHN0cmFuZ2UKKy8vIGxpbmtpbmcgc2V0dXAgdGhhdCByZXN1bHRzIGluIGR1cGxpY2F0ZSBzeW1ib2xzLgordHlwZWRlZiBjb25zdCBjaGFyKiBFdmVudFR5cGU7CisKK3N0cnVjdCBFdmVudCB7CisgIEV2ZW50KEV2ZW50VHlwZSB0eXBlLCB1aW50MzJfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGNhbGxJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiB0eXBlKHR5cGUpLCBjb25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgY2FsbElkKGNhbGxJZCksIG1lc3NhZ2UobWVzc2FnZSkge30KKworICBFdmVudFR5cGUgdHlwZTsKKyAgdWludDMyX3QgY29ubmVjdGlvbklkOworICB1aW50MzJfdCBjYWxsSWQ7CisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7Cit9OworCitjbGFzcyBFdmVudExvZyB7CitwdWJsaWM6CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfTE9HX0VORDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DT05OX0NSRUFURUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ09OTl9ERVNUUk9ZRUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9TVEFSVEVEOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfRklOSVNIRUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfUFJPQ0VTUzsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9QUkVfUkVBRDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9QT1NUX1JFQUQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfUFJFX1dSSVRFOworICBzdGF0aWMgRXZlbnRUeXBlIEVUX1BPU1RfV1JJVEU7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQVNZTkNfQ09NUExFVEU7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfSEFORExFUl9FUlJPUjsKKworICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NBTExfSU5DUkVNRU5UX0dFTkVSQVRJT047CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9HRVRfR0VORVJBVElPTjsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0FERF9TVFJJTkc7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9HRVRfU1RSSU5HUzsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0dFVF9EQVRBX1dBSVQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9PTkVXQVlfV0FJVDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX1VORVhQRUNURURfRVhDRVBUSU9OX1dBSVQ7CisgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ0FMTF9FWENFUFRJT05fV0FJVDsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9XQUlUX1JFVFVSTjsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX1NFVF9WQUxVRTsKKyAgc3RhdGljIEV2ZW50VHlwZSBFVF9DQUxMX0dFVF9WQUxVRTsKKworICBFdmVudExvZygpOworCisgIHZvaWQgYXBwZW5kKEV2ZW50VHlwZSB0eXBlLAorICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UgPSAiIik7CisKKyAgRXZlbnQgd2FpdEZvckV2ZW50KGludDY0X3QgdGltZW91dCA9IDUwMCk7CisgIEV2ZW50IHdhaXRGb3JDb25uRXZlbnQodWludDMyX3QgY29ubklkLCBpbnQ2NF90IHRpbWVvdXQgPSA1MDApOworCitwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgc3RkOjpsaXN0PEV2ZW50PiBFdmVudExpc3Q7CisKKyAgY29uY3VycmVuY3k6Ok1vbml0b3IgbW9uaXRvcl87CisgIEV2ZW50TGlzdCBldmVudHNfOworICB1aW50MzJfdCBpZF87CisKKyAgc3RhdGljIHVpbnQzMl90IG5leHRJZF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorCisjZW5kaWYgLy8gX1RIUklGVF9URVNUX0VWRU5UTE9HX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmggYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3ODRkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvSGFuZGxlcnMuaApAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1BST0NFU1NPUl9URVNUX0hBTkRMRVJTX0hfCisjZGVmaW5lIF9USFJJRlRfUFJPQ0VTU09SX1RFU1RfSEFORExFUlNfSF8gMQorCisjaW5jbHVkZSAiRXZlbnRMb2cuaCIKKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKyNpbmNsdWRlICJnZW4tY3BwL0NoaWxkU2VydmljZS5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCitjbGFzcyBQYXJlbnRIYW5kbGVyIDogdmlydHVhbCBwdWJsaWMgUGFyZW50U2VydmljZUlmIHsKK3B1YmxpYzoKKyAgUGFyZW50SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpCisgICAgOiB0cmlnZ2VyTW9uaXRvcigmbXV0ZXhfKSwgZ2VuZXJhdGlvbl8oMCksIHdhaXRfKGZhbHNlKSwgbG9nXyhsb2cpIHt9CisKKyAgaW50MzJfdCBpbmNyZW1lbnRHZW5lcmF0aW9uKCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0lOQ1JFTUVOVF9HRU5FUkFUSU9OLCAwLCAwKTsKKyAgICByZXR1cm4gKytnZW5lcmF0aW9uXzsKKyAgfQorCisgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9HRVRfR0VORVJBVElPTiwgMCwgMCk7CisgICAgcmV0dXJuIGdlbmVyYXRpb25fOworICB9CisKKyAgdm9pZCBhZGRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9BRERfU1RSSU5HLCAwLCAwKTsKKyAgICBzdHJpbmdzXy5wdXNoX2JhY2socyk7CisgIH0KKworICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX1NUUklOR1MsIDAsIDApOworICAgIF9yZXR1cm4gPSBzdHJpbmdzXzsKKyAgfQorCisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfR0VUX0RBVEFfV0FJVCwgMCwgMCk7CisKKyAgICBibG9ja1VudGlsVHJpZ2dlcmVkKCk7CisKKyAgICBfcmV0dXJuLmFwcGVuZChsZW5ndGgsICdhJyk7CisgIH0KKworICB2b2lkIG9uZXdheVdhaXQoKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfT05FV0FZX1dBSVQsIDAsIDApOworCisgICAgYmxvY2tVbnRpbFRyaWdnZXJlZCgpOworICB9CisKKyAgdm9pZCBleGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfRVhDRVBUSU9OX1dBSVQsIDAsIDApOworCisgICAgYmxvY2tVbnRpbFRyaWdnZXJlZCgpOworCisgICAgTXlFcnJvciBlOworICAgIGUubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgdGhyb3cgZTsKKyAgfQorCisgIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9VTkVYUEVDVEVEX0VYQ0VQVElPTl9XQUlULCAwLCAwKTsKKworICAgIGJsb2NrVW50aWxUcmlnZ2VyZWQoKTsKKworICAgIE15RXJyb3IgZTsKKyAgICBlLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRocm93IGU7CisgIH0KKworICAvKioKKyAgICogQWZ0ZXIgcHJlcGFyZVRyaWdnZXJlZENhbGwoKSBpcyBpbnZva2VkLCBjYWxscyB0byBhbnkgb2YgdGhlICpXYWl0KCkKKyAgICogZnVuY3Rpb25zIHdvbid0IHJldHVybiB1bnRpbCB0cmlnZ2VyUGVuZGluZ0NhbGxzKCkgaXMgaW52b2tlZAorICAgKgorICAgKiBUaGlzIGhhcyB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uIGludm9rZWQgYnkgdGhlIG1haW4gdGVzdCB0aHJlYWQKKyAgICogaW4gb3JkZXIgdG8gdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zLgorICAgKi8KKyAgdm9pZCBwcmVwYXJlVHJpZ2dlcmVkQ2FsbCgpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIHdhaXRfID0gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBXYWtlIHVwIGFsbCBjYWxscyB3YWl0aW5nIGluIGJsb2NrVW50aWxUcmlnZ2VyZWQoKQorICAgKi8KKyAgdm9pZCB0cmlnZ2VyUGVuZGluZ0NhbGxzKCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgd2FpdF8gPSBmYWxzZTsKKyAgICB0cmlnZ2VyTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBibG9ja1VudGlsVHJpZ2dlcmVkKCkgd29uJ3QgcmV0dXJuIHVudGlsIHRyaWdnZXJQZW5kaW5nQ2FsbHMoKSBpcyBpbnZva2VkCisgICAqIGluIGFub3RoZXIgdGhyZWFkLgorICAgKgorICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGFscmVhZHkgaG9sZGluZyBtdXRleF8uCisgICAqLworICB2b2lkIGJsb2NrVW50aWxUcmlnZ2VyZWQoKSB7CisgICAgd2hpbGUgKHdhaXRfKSB7CisgICAgICB0cmlnZ2VyTW9uaXRvci53YWl0Rm9yZXZlcigpOworICAgIH0KKworICAgIC8vIExvZyBhbiBldmVudCB3aGVuIHdlIHJldHVybgorICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfV0FJVF9SRVRVUk4sIDAsIDApOworICB9CisKKyAgY29uY3VycmVuY3k6Ok11dGV4IG11dGV4XzsKKyAgY29uY3VycmVuY3k6Ok1vbml0b3IgdHJpZ2dlck1vbml0b3I7CisgIGludDMyX3QgZ2VuZXJhdGlvbl87CisgIGJvb2wgd2FpdF87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworfTsKKworI2lmZGVmIF9XSU4zMgorICAjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorICAjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MjUwICkgLy9pbmhlcml0aW5nIG1ldGhvZHMgdmlhIGRvbWluYW5jZQorI2VuZGlmCisKK2NsYXNzIENoaWxkSGFuZGxlciA6IHB1YmxpYyBQYXJlbnRIYW5kbGVyLCB2aXJ0dWFsIHB1YmxpYyBDaGlsZFNlcnZpY2VJZiB7CitwdWJsaWM6CisgIENoaWxkSGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogUGFyZW50SGFuZGxlcihsb2cpLCB2YWx1ZV8oMCkge30KKworICBpbnQzMl90IHNldFZhbHVlKGNvbnN0IGludDMyX3QgdmFsdWUpIHsKKyAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9TRVRfVkFMVUUsIDAsIDApOworCisgICAgaW50MzJfdCBvbGRWYWx1ZSA9IHZhbHVlXzsKKyAgICB2YWx1ZV8gPSB2YWx1ZTsKKyAgICByZXR1cm4gb2xkVmFsdWU7CisgIH0KKworICBpbnQzMl90IGdldFZhbHVlKCkgeworICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwgMCwgMCk7CisKKyAgICByZXR1cm4gdmFsdWVfOworICB9CisKK3Byb3RlY3RlZDoKKyAgaW50MzJfdCB2YWx1ZV87Cit9OworCisjaWZkZWYgX1dJTjMyCisgICNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCitzdHJ1Y3QgQ29ubkNvbnRleHQgeworcHVibGljOgorICBDb25uQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgIHVpbnQzMl90IGlkKQorICAgIDogaW5wdXQoaW4pLCBvdXRwdXQob3V0KSwgaWQoaWQpIHt9CisKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OworICB1aW50MzJfdCBpZDsKK307CisKK3N0cnVjdCBDYWxsQ29udGV4dCB7CitwdWJsaWM6CisgIENhbGxDb250ZXh0KENvbm5Db250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgOiBjb25uQ29udGV4dChjb250ZXh0KSwgbmFtZShuYW1lKSwgaWQoaWQpIHt9CisKKyAgQ29ubkNvbnRleHQqIGNvbm5Db250ZXh0OworICBzdGQ6OnN0cmluZyBuYW1lOworICB1aW50MzJfdCBpZDsKK307CisKK2NsYXNzIFNlcnZlckV2ZW50SGFuZGxlciA6IHB1YmxpYyBzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgeworcHVibGljOgorICBTZXJ2ZXJFdmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IG5leHRJZF8oMSksIGxvZ18obG9nKSB7fQorCisgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHt9CisKKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICBDb25uQ29udGV4dCogY29udGV4dCA9IG5ldyBDb25uQ29udGV4dChpbnB1dCwgb3V0cHV0LCBuZXh0SWRfKTsKKyAgICArK25leHRJZF87CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DT05OX0NSRUFURUQsIGNvbnRleHQtPmlkLCAwKTsKKyAgICByZXR1cm4gY29udGV4dDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBkZWxldGVDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dCkgeworICAgIENvbm5Db250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDb25uQ29udGV4dCo+KHNlcnZlckNvbnRleHQpOworCisgICAgaWYgKGlucHV0ICE9IGNvbnRleHQtPmlucHV0KSB7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgICBpZiAob3V0cHV0ICE9IGNvbnRleHQtPm91dHB1dCkgeworICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NPTk5fREVTVFJPWUVELCBjb250ZXh0LT5pZCwgMCk7CisKKyAgICBkZWxldGUgY29udGV4dDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CisvLyBUT0RPOiBXZSBjdXJyZW50bHkgZG9uJ3QgdGVzdCB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2Nlc3NDb250ZXh0KCkKKy8vIGNhbGxzLiAgVGhlIHZhcmlvdXMgc2VydmVyIGltcGxlbWVudGF0aW9ucyBjYWxsIHByb2Nlc3NDb250ZXh0KCkgYXQKKy8vIHNsaWdodGx5IGRpZmZlcmVudCB0aW1lcywgYW5kIGl0IGlzIHRvbyBhbm5veWluZyB0byB0cnkgYW5kIGFjY291bnQgZm9yCisvLyB0aGVpciB2YXJpb3VzIGRpZmZlcmVuY2VzLgorLy8KKy8vIFRUaHJlYWRlZFNlcnZlciwgVFRocmVhZFBvb2xTZXJ2ZXIsIGFuZCBUU2ltcGxlU2VydmVyIHVzdWFsbHkgd2FpdCB1bnRpbAorLy8gdGhleSBzZWUgdGhlIGZpcnN0IGJ5dGUgb2YgYSByZXF1ZXN0IGJlZm9yZSBjYWxsaW5nIHByb2Nlc3NDb250ZXh0KCkuCisvLyBIb3dldmVyLCB0aGV5IGRvbid0IHdhaXQgZm9yIHRoZSBmaXJzdCBieXRlIG9mIHRoZSB2ZXJ5IGZpcnN0IHJlcXVlc3QsCisvLyBhbmQgaW5zdGVhZCBpbW1lZGlhdGVseSBjYWxsIHByb2Nlc3NDb250ZXh0KCkgYmVmb3JlIGFueSBkYXRhIGlzCisvLyByZWNlaXZlZC4KKy8vCisvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIgYWx3YXlzIHdhaXRzIHVudGlsIHJlY2VpdmluZyB0aGUgZnVsbCByZXF1ZXN0IGJlZm9yZQorLy8gY2FsbGluZyBwcm9jZXNzQ29udGV4dCgpLgorI2lmIDAKKyAgICBDb25uQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29ubkNvbnRleHQqPihzZXJ2ZXJDb250ZXh0KTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BST0NFU1MsIGNvbnRleHQtPmlkLCAwKTsKKyNlbHNlCisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShzZXJ2ZXJDb250ZXh0KTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHRyYW5zcG9ydCk7CisjZW5kaWYKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHVpbnQzMl90IG5leHRJZF87CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKK307CisKK2NsYXNzIFByb2Nlc3NvckV2ZW50SGFuZGxlciA6IHB1YmxpYyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgUHJvY2Vzc29yRXZlbnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBuZXh0SWRfKDEpLCBsb2dfKGxvZykge30KKworICB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuTmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgeworICAgIENvbm5Db250ZXh0KiBjb25uQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29ubkNvbnRleHQqPihzZXJ2ZXJDb250ZXh0KTsKKworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gbmV3IENhbGxDb250ZXh0KGNvbm5Db250ZXh0LCBuZXh0SWRfLCBmbk5hbWUpOworICAgICsrbmV4dElkXzsKKworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9TVEFSVEVELCBjb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICAgIHJldHVybiBjb250ZXh0OworICB9CisKKyAgdm9pZCBmcmVlQ29udGV4dCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX0ZJTklTSEVELCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICAgIGRlbGV0ZSBjb250ZXh0OworICB9CisKKyAgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSB7CisgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKKyAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BSRV9SRUFELCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICB9CisKKyAgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGJ5dGVzKTsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUE9TVF9SRUFELCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICB9CisKKyAgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QUkVfV1JJVEUsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgIH0KKworICB2b2lkIHBvc3RXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGJ5dGVzKTsKKyAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOworICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUE9TVF9XUklURSwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgfQorCisgIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgeworICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CisgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9BU1lOQ19DT01QTEVURSwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgfQorCisgIHZvaWQgaGFuZGxlckVycm9yKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSB7CisgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKKyAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0hBTkRMRVJfRVJST1IsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgIH0KKworcHJvdGVjdGVkOgorICB2b2lkIGNoZWNrTmFtZShjb25zdCBDYWxsQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogZm5OYW1lKSB7CisgICAgLy8gTm90ZTogd2UgY2FuJ3QgdXNlIEJPT1NUX0NIRUNLX0VRVUFMIGhlcmUsIHNpbmNlIHRoZSBoYW5kbGVyIHJ1bnMgaW4gYQorICAgIC8vIGRpZmZlcmVudCB0aHJlYWQgZnJvbSB0aGUgdGVzdCBmdW5jdGlvbnMuICBKdXN0IGFib3J0IGlmIHRoZSBuYW1lcyBhcmUKKyAgICAvLyBkaWZmZXJlbnQKKyAgICBpZiAoY29udGV4dC0+bmFtZSAhPSBmbk5hbWUpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiY2FsbCBjb250ZXh0IG5hbWUgbWlzbWF0Y2g6IFwiJXNcIiAhPSBcIiVzXCJcbiIsCisgICAgICAgICAgICAgIGNvbnRleHQtPm5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgZm5OYW1lKTsKKyAgICAgIGZmbHVzaChzdGRlcnIpOworICAgICAgYWJvcnQoKTsKKyAgICB9CisgIH0KKworICB1aW50MzJfdCBuZXh0SWRfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorCisjZW5kaWYgLy8gX1RIUklGVF9QUk9DRVNTT1JfVEVTVF9IQU5ETEVSU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjZTAxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAKQEAgLTAsMCArMSw5MjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0ZXN0cyB0aGF0IGVuc3VyZSBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIGFuZAorICogVFNlcnZlckV2ZW50SGFuZGxlciBhcmUgaW52b2tlZCBwcm9wZXJseSBieSB0aGUgdmFyaW91cyBzZXJ2ZXIKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKworI2luY2x1ZGUgIkV2ZW50TG9nLmgiCisjaW5jbHVkZSAiU2VydmVyVGhyZWFkLmgiCisjaW5jbHVkZSAiSGFuZGxlcnMuaCIKKyNpbmNsdWRlICJnZW4tY3BwL0NoaWxkU2VydmljZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisvKgorICogVHJhaXRzIGNsYXNzZXMgdGhhdCBlbmNhcHN1bGF0ZSBob3cgdG8gY3JlYXRlIHZhcmlvdXMgdHlwZXMgb2Ygc2VydmVycy4KKyAqLworCitjbGFzcyBUU2ltcGxlU2VydmVyVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUU2ltcGxlU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgdWludDE2X3QgcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFNpbXBsZVNlcnZlcj4oCisgICAgICAgIG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKyAgfQorfTsKKworY2xhc3MgVFRocmVhZGVkU2VydmVyVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUVGhyZWFkZWRTZXJ2ZXIgU2VydmVyVHlwZTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIHVpbnQxNl90IHBvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRlZFNlcnZlcj4oCisgICAgICAgIG5ldyBUVGhyZWFkZWRTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOworICB9Cit9OworCitjbGFzcyBUVGhyZWFkUG9vbFNlcnZlclRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVFRocmVhZFBvb2xTZXJ2ZXIgU2VydmVyVHlwZTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgdWludDE2X3QgcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CisgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworCisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkUG9vbFNlcnZlcj4oCisgICAgICAgIG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0aHJlYWRNYW5hZ2VyKSk7CisgIH0KK307CisKK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlclRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgVE5vbmJsb2NraW5nU2VydmVyIFNlcnZlclR5cGU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICB1aW50MTZfdCBwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIGF1dG9tYXRpY2FsbHkgdXNlcyBURnJhbWVkVHJhbnNwb3J0LgorICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgdHJhbnNwb3J0IGZhY3RvcnkgaXMgbm90IGEKKyAgICAvLyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeQorICAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KiBmcmFtZWRGYWN0b3J5CisgICAgICAgID0gZHluYW1pY19jYXN0PFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Kj4odHJhbnNwb3J0RmFjdG9yeS5nZXQoKSk7CisgICAgaWYgKGZyYW1lZEZhY3RvcnkgPT0gTlVMTCkgeworICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyIG11c3QgdXNlIFRGcmFtZWRUcmFuc3BvcnQiKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CisgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworCisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAorICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBzb2NrZXQsIHRocmVhZE1hbmFnZXIpKTsKKyAgfQorfTsKKworY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyTm9UaHJlYWRzVHJhaXRzIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBUTm9uYmxvY2tpbmdTZXJ2ZXIgU2VydmVyVHlwZTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIHVpbnQxNl90IHBvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICAvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIgYXV0b21hdGljYWxseSB1c2VzIFRGcmFtZWRUcmFuc3BvcnQuCisgICAgLy8gUmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBzdXBwbGllZCB0cmFuc3BvcnQgZmFjdG9yeSBpcyBub3QgYQorICAgIC8vIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5CisgICAgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqIGZyYW1lZEZhY3RvcnkKKyAgICAgICAgPSBkeW5hbWljX2Nhc3Q8VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqPih0cmFuc3BvcnRGYWN0b3J5LmdldCgpKTsKKyAgICBpZiAoZnJhbWVkRmFjdG9yeSA9PSBOVUxMKSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXIgbXVzdCB1c2UgVEZyYW1lZFRyYW5zcG9ydCIpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAvLyBVc2UgYSBOVUxMIFRocmVhZE1hbmFnZXIKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcjsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHNvY2tldCwgdGhyZWFkTWFuYWdlcikpOworICB9Cit9OworCisvKgorICogVHJhaXRzIGNsYXNzZXMgZm9yIGNvbnRyb2xsaW5nIGlmIHdlIGluc3RhbnRpYXRlIHRlbXBsYXRlZCBvciBnZW5lcmljCisgKiBwcm90b2NvbCBmYWN0b3JpZXMsIHByb2Nlc3NvcnMsIGNsaWVudHMsIGV0Yy4KKyAqCisgKiBUaGUgZ29hbCBpcyB0byBhbGxvdyB0aGUgb3V0ZXIgdGVzdCBjb2RlIHRvIHNlbGVjdCB3aGljaCBzZXJ2ZXIgdHlwZSBpcworICogYmVpbmcgdGVzdGVkLCBhbmQgd2hldGhlciBvciBub3Qgd2UgYXJlIHRlc3RpbmcgdGhlIHRlbXBsYXRlZCBjbGFzc2VzLCBvcgorICogdGhlIGdlbmVyaWMgY2xhc3Nlcy4KKyAqCisgKiBFYWNoIHNwZWNpZmljIHRlc3QgY2FzZSBjYW4gY29udHJvbCB3aGV0aGVyIHdlIGNyZWF0ZSBhIGNoaWxkIG9yIHBhcmVudAorICogc2VydmVyLCBhbmQgd2hldGhlciB3ZSB1c2UgVEZyYW1lZFRyYW5zcG9ydCBvciBUQnVmZmVyZWRUcmFuc3BvcnQuCisgKi8KKworY2xhc3MgVW50ZW1wbGF0ZWRUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgUHJvdG9jb2xGYWN0b3J5OworICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbCBQcm90b2NvbDsKKworICB0eXBlZGVmIFBhcmVudFNlcnZpY2VQcm9jZXNzb3IgUGFyZW50UHJvY2Vzc29yOworICB0eXBlZGVmIENoaWxkU2VydmljZVByb2Nlc3NvciBDaGlsZFByb2Nlc3NvcjsKKyAgdHlwZWRlZiBQYXJlbnRTZXJ2aWNlQ2xpZW50IFBhcmVudENsaWVudDsKKyAgdHlwZWRlZiBDaGlsZFNlcnZpY2VDbGllbnQgQ2hpbGRDbGllbnQ7Cit9OworCitjbGFzcyBUZW1wbGF0ZWRUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiBQcm90b2NvbEZhY3Rvcnk7CisgIHR5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUQnVmZmVyQmFzZT4gUHJvdG9jb2w7CisKKyAgdHlwZWRlZiBQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yVDxQcm90b2NvbD4gUGFyZW50UHJvY2Vzc29yOworICB0eXBlZGVmIENoaWxkU2VydmljZVByb2Nlc3NvclQ8UHJvdG9jb2w+IENoaWxkUHJvY2Vzc29yOworICB0eXBlZGVmIFBhcmVudFNlcnZpY2VDbGllbnRUPFByb3RvY29sPiBQYXJlbnRDbGllbnQ7CisgIHR5cGVkZWYgQ2hpbGRTZXJ2aWNlQ2xpZW50VDxQcm90b2NvbD4gQ2hpbGRDbGllbnQ7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfPgorY2xhc3MgUGFyZW50U2VydmljZVRyYWl0cyB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQYXJlbnRQcm9jZXNzb3IgUHJvY2Vzc29yOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UGFyZW50Q2xpZW50IENsaWVudDsKKyAgdHlwZWRlZiBQYXJlbnRIYW5kbGVyIEhhbmRsZXI7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OlByb3RvY29sRmFjdG9yeSBQcm90b2NvbEZhY3Rvcnk7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQcm90b2NvbCBQcm90b2NvbDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c18+CitjbGFzcyBDaGlsZFNlcnZpY2VUcmFpdHMgeworcHVibGljOgorICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6Q2hpbGRQcm9jZXNzb3IgUHJvY2Vzc29yOworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6Q2hpbGRDbGllbnQgQ2xpZW50OworICB0eXBlZGVmIENoaWxkSGFuZGxlciBIYW5kbGVyOworCisgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQcm90b2NvbEZhY3RvcnkgUHJvdG9jb2xGYWN0b3J5OworICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7Cit9OworCisvLyBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlciBpZiB0aGUgVFRyYW5zcG9ydEZhY3RvcnkgdHlwZXMgZGVmaW5lZCBhIHR5cGVkZWYsCisvLyB0byBhbGxvdyB1cyB0byBmaWd1cmUgb3V0IHRoZSBleGFjdCB0cmFuc3BvcnQgdHlwZSB3aXRob3V0IGhhdmluZyB0byBwYXNzIGl0CisvLyBpbiBhcyBhIHNlcGFyYXRlIHRlbXBsYXRlIHBhcmFtZXRlciBoZXJlLgorLy8KKy8vIEl0IHdvdWxkIGFsc28gYmUgbmllYyBpZiB0aGV5IHVzZWQgY292YXJpYW50IHJldHVybiB0eXBlcy4gIFVuZm9ydHVuYXRlbHksCisvLyBzaW5jZSB0aGV5IHJldHVybiBzaGFyZWRfcHRyIGluc3RlYWQgb2YgcmF3IHBvaW50ZXJzLCBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzCisvLyB3b24ndCB3b3JrLgordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0c18sCisgICAgICAgICAgdHlwZW5hbWUgU2VydmljZVRyYWl0c18sCisgICAgICAgICAgdHlwZW5hbWUgVHJhbnNwb3J0RmFjdG9yeV8gPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICB0eXBlbmFtZSBUcmFuc3BvcnRfID0gVEZyYW1lZFRyYW5zcG9ydD4KK2NsYXNzIFNlcnZpY2VTdGF0ZSA6IHB1YmxpYyBTZXJ2ZXJTdGF0ZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OlByb2Nlc3NvciBQcm9jZXNzb3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OkNsaWVudCBDbGllbnQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgU2VydmljZVRyYWl0c186OkhhbmRsZXIgSGFuZGxlcjsKKworICBTZXJ2aWNlU3RhdGUoKQorICAgIDogcG9ydF8oMCksCisgICAgICBsb2dfKG5ldyBFdmVudExvZyksCisgICAgICBoYW5kbGVyXyhuZXcgSGFuZGxlcihsb2dfKSksCisgICAgICBwcm9jZXNzb3JfKG5ldyBQcm9jZXNzb3IoaGFuZGxlcl8pKSwKKyAgICAgIHRyYW5zcG9ydEZhY3RvcnlfKG5ldyBUcmFuc3BvcnRGYWN0b3J5XyksCisgICAgICBwcm90b2NvbEZhY3RvcnlfKG5ldyB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6UHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8obmV3IFNlcnZlckV2ZW50SGFuZGxlcihsb2dfKSksCisgICAgICBwcm9jZXNzb3JFdmVudEhhbmRsZXJfKG5ldyBQcm9jZXNzb3JFdmVudEhhbmRsZXIobG9nXykpIHsKKyAgICBwcm9jZXNzb3JfLT5zZXRFdmVudEhhbmRsZXIocHJvY2Vzc29yRXZlbnRIYW5kbGVyXyk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpIHsKKyAgICBTZXJ2ZXJUcmFpdHNfIHNlcnZlclRyYWl0czsKKyAgICByZXR1cm4gc2VydmVyVHJhaXRzLmNyZWF0ZVNlcnZlcihwcm9jZXNzb3JfLCBwb3J0LCB0cmFuc3BvcnRGYWN0b3J5XywgcHJvdG9jb2xGYWN0b3J5Xyk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsgfQorCisgIHZvaWQgYmluZFN1Y2Nlc3NmdWwodWludDE2X3QgcG9ydCkgeyBwb3J0XyA9IHBvcnQ7IH0KKworICB1aW50MTZfdCBnZXRQb3J0KCkgY29uc3QgeyByZXR1cm4gcG9ydF87IH0KKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBnZXRMb2coKSBjb25zdCB7IHJldHVybiBsb2dfOyB9CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXI+JiBnZXRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlcl87IH0KKworICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50PiBjcmVhdGVDbGllbnQoKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0XykpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFuc3BvcnQobmV3IFRyYW5zcG9ydF8oc29ja2V0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFByb3RvY29sPiBwcm90b2NvbChuZXcgUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgdHJhbnNwb3J0LT5vcGVuKCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50PiBjbGllbnQobmV3IENsaWVudChwcm90b2NvbCkpOworICAgIHJldHVybiBjbGllbnQ7CisgIH0KKworcHJpdmF0ZToKKyAgdWludDE2X3QgcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXI+IGhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBwcm9jZXNzb3JFdmVudEhhbmRsZXJfOworfTsKKworLyoqCisgKiBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyBpbiB0aGUgbG9nCisgKi8KK3ZvaWQgY2hlY2tOb0V2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKKyAgLy8gV2FpdCBmb3IgYW4gZXZlbnQgd2l0aCBhIHZlcnkgc2hvcnQgdGltZW91dCBwZXJpb2QuICBXZSBkb24ndCBleHBlY3QKKyAgLy8gYW55dGhpbmcgdG8gYmUgcHJlc2VudCwgc28gd2Ugd2lsbCBub3JtYWxseSB3YWl0IGZvciB0aGUgZnVsbCB0aW1lb3V0LgorICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgYSBub24temVybyB0aW1lb3V0IGlzIG5pY2Ugc2luY2UgaXQgZG9lcyBnaXZlIGEgc2hvcnQKKyAgLy8gd2luZG93IGZvciBldmVudHMgdG8gYXJyaXZlIGluIGNhc2UgdGhlcmUgaXMgYSBwcm9ibGVtLgorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KDEwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0xPR19FTkQsIGV2ZW50LnR5cGUpOworfQorCisvKioKKyAqIENoZWNrIGZvciB0aGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gaXMgY3JlYXRlZC4KKyAqCisgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIElEIGFsbG9jYXRlZCBieSB0aGUgc2VydmVyLgorICovCit1aW50MzJfdCBjaGVja05ld0Nvbm5FdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSB7CisgIC8vIENoZWNrIGZvciBhbiBFVF9DT05OX0NSRUFURUQgZXZlbnQKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgyNTAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NPTk5fQ1JFQVRFRCwgZXZlbnQudHlwZSk7CisKKyAgLy8gU29tZSBzZXJ2ZXJzIGNhbGwgdGhlIHByb2Nlc3NDb250ZXh0KCkgaG9vayBpbW1lZGlhdGVseS4KKyAgLy8gT3RoZXJzIChUTm9uYmxvY2tpbmdTZXJ2ZXIpIG9ubHkgY2FsbCBpdCBvbmNlIGEgZnVsbCByZXF1ZXN0IGlzIHJlY2VpdmVkLgorICAvLyBXZSBkb24ndCBjaGVjayBmb3IgaXQgeWV0LCB0byBhbGxvdyBlaXRoZXIgYmVoYXZpb3IuCisKKyAgcmV0dXJuIGV2ZW50LmNvbm5lY3Rpb25JZDsKK30KKworLyoqCisgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICovCit2b2lkIGNoZWNrQ2xvc2VFdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLCB1aW50MzJfdCBjb25uSWQpIHsKKyAgLy8gQ2hlY2sgZm9yIGFuIEVUX0NPTk5fREVTVFJPWUVEIGV2ZW50CisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NPTk5fREVTVFJPWUVELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworfQorCisvKioKKyAqIENoZWNrIGZvciB0aGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZCB3aGVuIGEgY2FsbCBpcyByZWNlaXZlZAorICogYW5kIHRoZSBoYW5kbGVyIGlzIGludm9rZWQuCisgKgorICogSXQgZG9lcyBub3QgY2hlY2sgZm9yIGFueXRoaW5nIGFmdGVyIHRoZSBoYW5kbGVyIGludm9jYXRpb24uCisgKgorICogUmV0dXJucyB0aGUgY2FsbCBJRCBhbGxvY2F0ZWQgYnkgdGhlIHNlcnZlci4KKyAqLwordWludDMyX3QgY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbm5JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlIGNhbGxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CisgIC8vIENhbGwgc3RhcnRlZAorICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX1NUQVJURUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgdWludDMyX3QgY2FsbElkID0gZXZlbnQuY2FsbElkOworCisgIC8vIFByZS1yZWFkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BSRV9SRUFELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBQb3N0LXJlYWQKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUE9TVF9SRUFELCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBIYW5kbGVyIGludm9jYXRpb24KKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsVHlwZSwgZXZlbnQudHlwZSk7CisgIC8vIFRoZSBoYW5kbGVyIGRvZXNuJ3QgaGF2ZSBhbnkgY29ubmVjdGlvbiBvciBjYWxsIGNvbnRleHQsCisgIC8vIHNvIHRoZSBjb25uZWN0aW9uSWQgYW5kIGNhbGxJZCBpbiB0aGlzIGV2ZW50IGFyZW4ndCB2YWxpZAorCisgIHJldHVybiBjYWxsSWQ7Cit9CisKKy8qKgorICogQ2hlY2sgZm9yIHRoZSBldmVudHMgdGhhdCBzaG91bGQgYmUgYWZ0ZXIgYSBoYW5kbGVyIHJldHVybnMuCisgKi8KK3ZvaWQgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjYWxsTmFtZSkgeworICAvLyBQcmUtd3JpdGUKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUFJFX1dSSVRFLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxOYW1lLCBldmVudC5tZXNzYWdlKTsKKworICAvLyBQb3N0LXdyaXRlCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BPU1RfV1JJVEUsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIENhbGwgZmluaXNoZWQKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ0FMTF9GSU5JU0hFRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gSXQgaXMgYWNjZXB0YWJsZSBmb3Igc2VydmVycyB0byBjYWxsIHByb2Nlc3NDb250ZXh0KCkgYWdhaW4gaW1tZWRpYXRlbHkKKyAgLy8gdG8gc3RhcnQgd2FpdGluZyBvbiB0aGUgbmV4dCByZXF1ZXN0LiAgSG93ZXZlciwgc29tZSBzZXJ2ZXJzIHdhaXQgYmVmb3JlCisgIC8vIGdldHRpbmcgZWl0aGVyIGEgcGFydGlhbCByZXF1ZXN0IG9yIHRoZSBmdWxsIHJlcXVlc3QgYmVmb3JlIGNhbGxpbmcKKyAgLy8gcHJvY2Vzc0NvbnRleHQoKS4gIFdlIGRvbid0IGNoZWNrIGZvciB0aGUgbmV4dCBjYWxsIHRvIHByb2Nlc3NDb250ZXh0KCkKKyAgLy8geWV0LgorfQorCisvKioKKyAqIENoZWNrIGZvciB0aGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGxvZ2dlZCB3aGVuIGEgY2FsbCBpcyBtYWRlLgorICoKKyAqIFRoaXMganVzdCBjYWxscyBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKCkgZm9sbG93ZWQgYnkKKyAqIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKCkuCisgKgorICogUmV0dXJucyB0aGUgY2FsbCBJRCBhbGxvY2F0ZWQgYnkgdGhlIHNlcnZlci4KKyAqLwordWludDMyX3QgY2hlY2tDYWxsRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlIGNhbGxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgY2FsbFR5cGUsIGNhbGxOYW1lKTsKKyAgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMobG9nLCBjb25uSWQsIGNhbGxJZCwgY2FsbE5hbWUpOworCisgIHJldHVybiBjYWxsSWQ7Cit9CisKKy8qCisgKiBUZXN0IGZ1bmN0aW9ucworICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdGF0ZV8+Cit2b2lkIHRlc3RQYXJlbnRTZXJ2aWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZV8+JiBzdGF0ZSkgeworICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGVfOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKworICBpbnQzMl90IGdlbiA9IGNsaWVudC0+Z2V0R2VuZXJhdGlvbigpOworICBpbnQzMl90IG5ld0dlbiA9IGNsaWVudC0+aW5jcmVtZW50R2VuZXJhdGlvbigpOworICBCT09TVF9DSEVDS19FUVVBTChnZW4gKyAxLCBuZXdHZW4pOworICBuZXdHZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ2VuICsgMSwgbmV3R2VuKTsKKworICBjbGllbnQtPmFkZFN0cmluZygiZm9vIik7CisgIGNsaWVudC0+YWRkU3RyaW5nKCJiYXIiKTsKKyAgY2xpZW50LT5hZGRTdHJpbmcoImFzZGYiKTsKKworICB2ZWN0b3I8c3RyaW5nPiBzdHJpbmdzOworICBjbGllbnQtPmdldFN0cmluZ3Moc3RyaW5ncyk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoMywgc3RyaW5ncy5zaXplKCkpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKCJmb28iLCBzdHJpbmdzWzBdKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTCgiYmFyIiwgc3RyaW5nc1sxXSk7CisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoImFzZGYiLCBzdHJpbmdzWzJdKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFN0YXRlXz4KK3ZvaWQgdGVzdENoaWxkU2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisKKyAgLy8gVGVzdCBjYWxsaW5nIHNvbWUgb2YgdGhlIHBhcmVudCBtZXRoaWRzIHZpYSB0aGUgYSBjaGlsZCBjbGllbnQKKyAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKKyAgaW50MzJfdCBuZXdHZW4gPSBjbGllbnQtPmluY3JlbWVudEdlbmVyYXRpb24oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ2VuICsgMSwgbmV3R2VuKTsKKyAgbmV3R2VuID0gY2xpZW50LT5nZXRHZW5lcmF0aW9uKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGdlbiArIDEsIG5ld0dlbik7CisKKyAgLy8gVGVzdCBzb21lIG9mIHRoZSBjaGlsZCBtZXRob2RzCisgIGNsaWVudC0+c2V0VmFsdWUoMTApOworICBCT09TVF9DSEVDS19FUVVBTCgxMCwgY2xpZW50LT5nZXRWYWx1ZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMTAsIGNsaWVudC0+c2V0VmFsdWUoOTkpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoOTksIGNsaWVudC0+Z2V0VmFsdWUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0QmFzaWNTZXJ2aWNlKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIFBhcmVudFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlcgorICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOworCisgIHRlc3RQYXJlbnRTZXJ2aWNlKHN0YXRlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RJbmhlcml0ZWRTZXJ2aWNlKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOworICB0ZXN0Q2hpbGRTZXJ2aWNlKHN0YXRlKTsKK30KKworLyoqCisgKiBUZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBUU2VydmVyRXZlbnRIYW5kbGVyIGFuZCBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyCisgKiBtZXRob2RzIGFyZSBpbnZva2VkIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggdGhlIGFjdHVhbCBldmVudHMuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordm9pZCB0ZXN0RXZlbnRTZXF1ZW5jaW5nKCkgeworICAvLyBXZSB1c2UgVEJ1ZmZlcmVkVHJhbnNwb3J0IGZvciB0aGlzIHRlc3QsIGluc3RlYWQgb2YgVEZyYW1lZFRyYW5zcG9ydC4KKyAgLy8gVGhpcyB3YXkgdGhlIHNlcnZlciB3aWxsIHN0YXJ0IHByb2Nlc3NpbmcgZGF0YSBhcyBzb29uIGFzIGl0IGlzIHJlY2VpdmVkLAorICAvLyBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBmdWxsIHJlcXVlc3QuICBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB3ZSBjYW4KKyAgLy8gc2VwYXJhdGUgdGhlIHByZVJlYWQoKSBhbmQgcG9zdFJlYWQoKSBldmVudHMuCisgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiwKKyAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0PiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBsb2cKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnByZXBhcmVUcmlnZ2VyZWRDYWxsKCk7CisKKyAgLy8gTWFrZSBzdXJlIGNyZWF0ZUNvbnRleHQoKSBpcyBjYWxsZWQgYWZ0ZXIgYSBjb25uZWN0aW9uIGhhcyBiZWVuCisgIC8vIGVzdGFibGlzaGVkLiAgV2Ugb3BlbiBhIHBsYWluIHNvY2tldCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgY2xpZW50LgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBzdGF0ZS0+Z2V0UG9ydCgpKSk7CisgIHNvY2tldC0+b3BlbigpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGV2ZW50cyBvY2N1cnJlZCBhZnRlciBhIG5ldyBjb25uZWN0aW9uCisgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOworCisgIC8vIFNlbmQgYSBtZXNzYWdlIGhlYWRlci4gIFdlIG1hbnVhbGx5IGNvbnN0cnVjdCB0aGUgcmVxdWVzdCBzbyB0aGF0IHdlCisgIC8vIGNhbiB0ZXN0IHRoZSB0aW1pbmcgZm9yIHRoZSBwcmVSZWFkKCkgY2FsbC4KKyAgc3RyaW5nIHJlcXVlc3ROYW1lID0gImdldERhdGFXYWl0IjsKKyAgc3RyaW5nIGV2ZW50TmFtZSA9ICJQYXJlbnRTZXJ2aWNlLmdldERhdGFXYWl0IjsKKyAgaW50MzJfdCBzZXFpZCA9IGludDMyX3QodGltZShOVUxMKSk7CisgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzb2NrZXQpOworICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihyZXF1ZXN0TmFtZSwgVF9DQUxMLCBzZXFpZCk7CisgIHNvY2tldC0+Zmx1c2goKTsKKworICAvLyBNYWtlIHN1cmUgd2Ugc2F3IHRoZSBjYWxsIHN0YXJ0ZWQgYW5kIHByZS1yZWFkIGV2ZW50cworICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DQUxMX1NUQVJURUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIHVpbnQzMl90IGNhbGxJZCA9IGV2ZW50LmNhbGxJZDsKKworICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QUkVfUkVBRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGV2ZW50TmFtZSwgZXZlbnQubWVzc2FnZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbmV3IGV2ZW50cworICBjaGVja05vRXZlbnRzKGxvZyk7CisKKyAgLy8gU2VuZCB0aGUgcmVzdCBvZiB0aGUgcmVxdWVzdAorICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKCJQYXJlbnRTZXJ2aWNlX2dldERhdGFOb3RpZmllZF9wYXJncyIpOworICBwcm90b2NvbC53cml0ZUZpZWxkQmVnaW4oImxlbmd0aCIsIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIsIDEpOworICBwcm90b2NvbC53cml0ZUkzMig4ICogMTAyNCAqIDEwMjQpOworICBwcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgIHByb3RvY29sLndyaXRlRmllbGRTdG9wKCk7CisgIHByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICBzb2NrZXQtPndyaXRlRW5kKCk7CisgIHNvY2tldC0+Zmx1c2goKTsKKworICAvLyBXZSBzaG91bGQgdGhlbiBzZWUgcG9zdFJlYWQoKQorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9QT1NUX1JFQUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKworICAvLyBUaGVuIHRoZSBoYW5kbGVyIHNob3VsZCBiZSBpbnZva2VkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfR0VUX0RBVEFfV0FJVCwgZXZlbnQudHlwZSk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd29uJ3QgcmVzcG9uZCB1bnRpbCB3ZSBub3RpZnkgaXQuCisgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMuCisgIGNoZWNrTm9FdmVudHMobG9nKTsKKworICAvLyBOb3RpZnkgdGhlIGhhbmRsZXIgdGhhdCBpdCBzaG91bGQgcmV0dXJuCisgIC8vIFdlIGp1c3QgdXNlIGEgZ2xvYmFsIGxvY2sgZm9yIG5vdywgc2luY2UgaXQgaXMgZWFzaWVzdAorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT50cmlnZ2VyUGVuZGluZ0NhbGxzKCk7CisKKyAgLy8gVGhlIGhhbmRsZXIgd2lsbCBsb2cgYSBzZXBhcmF0ZSBldmVudCBiZWZvcmUgaXQgcmV0dXJucworICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9XQUlUX1JFVFVSTiwgZXZlbnQudHlwZSk7CisKKyAgLy8gV2Ugc2hvdWxkIHRoZW4gc2VlIHByZVdyaXRlKCkKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfUFJFX1dSSVRFLCBldmVudC50eXBlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXZlbnROYW1lLCBldmVudC5tZXNzYWdlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY29ubklkLCBldmVudC5jb25uZWN0aW9uSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsSWQsIGV2ZW50LmNhbGxJZCk7CisKKyAgLy8gV2UgcmVxdWVzdGVkIG1vcmUgZGF0YSB0aGFuIGNhbiBiZSBidWZmZXJlZCwgYW5kIHdlIGFyZW4ndCByZWFkaW5nIGl0LAorICAvLyBzbyB0aGUgc2VydmVyIHNob3VsZG4ndCBiZSBhYmxlIHRvIGZpbmlzaCBpdHMgd3JpdGUgeWV0LgorICAvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzLgorICBjaGVja05vRXZlbnRzKGxvZyk7CisKKyAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgaGVhZGVyCisgIHN0cmluZyByZXNwb25zZU5hbWU7CisgIGludDMyX3QgcmVzcG9uc2VTZXFpZCA9IDA7CisgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIHJlc3BvbnNlVHlwZTsKKyAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbihyZXNwb25zZU5hbWUsIHJlc3BvbnNlVHlwZSwgcmVzcG9uc2VTZXFpZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3BvbnNlU2VxaWQsIHNlcWlkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocmVxdWVzdE5hbWUsIHJlc3BvbnNlTmFtZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHJlc3BvbnNlVHlwZSwgVF9SRVBMWSk7CisgIC8vIFJlYWQgdGhlIGJvZHkuICBXZSBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LgorICBwcm90b2NvbC5za2lwKFRfU1RSVUNUKTsKKworICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHJlYWQsIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgZmluaXNoZWQgc2VuZGluZyB0aGUgZGF0YQorICAvLyBhbmQgY2FsbGVkIHRoZSBwb3N0V3JpdGUoKSBoYW5kbGVyCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1BPU1RfV1JJVEUsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKworICAvLyBDYWxsIGZpbmlzaGVkIHNob3VsZCBiZSBsYXN0CisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChldmVudE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIENsb3NlIHRoZSBjb25uZWN0aW9uLCBhbmQgbWFrZSBzdXJlIHdlIGdldCBhIGNvbm5lY3Rpb24gZGVzdHJveWVkIGV2ZW50CisgIHNvY2tldC0+Y2xvc2UoKTsKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ09OTl9ERVNUUk9ZRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgZXZlbnRzCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RTZXBhcmF0ZUNvbm5lY3Rpb25zKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIENyZWF0ZSBhIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MSA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIGV4cGVjdGVkIGV2ZW50cyB3ZXJlIGxvZ2dlZAorICB1aW50MzJfdCBjbGllbnQxSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBDcmVhdGUgYSBzZWNvbmQgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQyID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgZXhwZWN0ZWQgZXZlbnRzIHdlcmUgbG9nZ2VkCisgIHVpbnQzMl90IGNsaWVudDJJZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOworCisgIC8vIFRoZSB0d28gY29ubmVjdGlvbnMgc2hvdWxkIGhhdmUgZGlmZmVyZW50IElEcworICBCT09TVF9DSEVDS19ORShjbGllbnQxSWQsIGNsaWVudDJJZCk7CisKKyAgLy8gTWFrZSBhIGNhbGwsIGFuZCBjaGVjayBmb3IgdGhlIHByb3BlciBldmVudHMKKyAgaW50MzJfdCB2YWx1ZSA9IDU7CisgIGNsaWVudDEtPnNldFZhbHVlKHZhbHVlKTsKKyAgdWludDMyX3QgY2FsbDEKKyAgICAgID0gY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MUlkLCBFdmVudExvZzo6RVRfQ0FMTF9TRVRfVkFMVUUsICJDaGlsZFNlcnZpY2Uuc2V0VmFsdWUiKTsKKworICAvLyBNYWtlIGEgY2FsbCB3aXRoIGNsaWVudDIKKyAgaW50MzJfdCB2ID0gY2xpZW50Mi0+Z2V0VmFsdWUoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodmFsdWUsIHYpOworICBjaGVja0NhbGxFdmVudHMobG9nLCBjbGllbnQySWQsIEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwgIkNoaWxkU2VydmljZS5nZXRWYWx1ZSIpOworCisgIC8vIE1ha2UgYW5vdGhlciBjYWxsIHdpdGggY2xpZW50MQorICB2ID0gY2xpZW50MS0+Z2V0VmFsdWUoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodmFsdWUsIHYpOworICB1aW50MzJfdCBjYWxsMgorICAgICAgPSBjaGVja0NhbGxFdmVudHMobG9nLCBjbGllbnQxSWQsIEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwgIkNoaWxkU2VydmljZS5nZXRWYWx1ZSIpOworICBCT09TVF9DSEVDS19ORShjYWxsMSwgY2FsbDIpOworCisgIC8vIENsb3NlIHRoZSBzZWNvbmQgY2xpZW50LCBhbmQgY2hlY2sgZm9yIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKKyAgY2xpZW50Mi5yZXNldCgpOworICBjaGVja0Nsb3NlRXZlbnRzKGxvZywgY2xpZW50MklkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RPbmV3YXlDYWxsKCkgeworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKKworICAvLyBTdGFydCB0aGUgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworCisgIC8vIENyZWF0ZSBhIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKKworICAvLyBNYWtlIGEgb25ld2F5IGNhbGwKKyAgLy8gSXQgc2hvdWxkIHJldHVybiBpbW1lZGlhdGVseSwgZXZlbiB0aG91Z2ggdGhlIHNlcnZlcidzIGhhbmRsZXIKKyAgLy8gd29uJ3QgcmV0dXJuIHJpZ2h0IGF3YXkKKyAgc3RhdGUtPmdldEhhbmRsZXIoKS0+cHJlcGFyZVRyaWdnZXJlZENhbGwoKTsKKyAgY2xpZW50LT5vbmV3YXlXYWl0KCk7CisgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLm9uZXdheVdhaXQiOworICB1aW50MzJfdCBjYWxsSWQgPSBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLCBFdmVudExvZzo6RVRfQ0FMTF9PTkVXQVlfV0FJVCwgY2FsbE5hbWUpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFRyaWdnZXIgdGhlIGhhbmRsZXIgdG8gcmV0dXJuCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnRyaWdnZXJQZW5kaW5nQ2FsbHMoKTsKKworICAvLyBUaGUgaGFuZGxlciB3aWxsIGxvZyBhbiBFVF9XQUlUX1JFVFVSTiBldmVudCB3aGVuIGl0IHdha2VzIHVwCisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1dBSVRfUkVUVVJOLCBldmVudC50eXBlKTsKKworICAvLyBOb3cgd2Ugc2hvdWxkIHNlZSB0aGUgYXN5bmMgY29tcGxldGUgZXZlbnQsIHRoZW4gY2FsbCBmaW5pc2hlZAorICBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9BU1lOQ19DT01QTEVURSwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgpOworICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ0FMTF9GSU5JU0hFRCwgZXZlbnQudHlwZSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbm5JZCwgZXZlbnQuY29ubmVjdGlvbklkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbElkLCBldmVudC5jYWxsSWQpOworICBCT09TVF9DSEVDS19FUVVBTChjYWxsTmFtZSwgZXZlbnQubWVzc2FnZSk7CisKKyAgLy8gRGVzdHJveSB0aGUgY2xpZW50LCBhbmQgY2hlY2sgZm9yIGNvbm5lY3Rpb24gY2xvc2VkIGV2ZW50cworICBjbGllbnQucmVzZXQoKTsKKyAgY2hlY2tDbG9zZUV2ZW50cyhsb2csIGNvbm5JZCk7CisKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3ZvaWQgdGVzdEV4cGVjdGVkRXJyb3IoKSB7CisgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOworCisgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisKKyAgLy8gQ3JlYXRlIGEgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOworCisgIC8vIFNlbmQgdGhlIGV4Y2VwdGlvbldhaXQoKSBjYWxsCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnByZXBhcmVUcmlnZ2VyZWRDYWxsKCk7CisgIHN0cmluZyBtZXNzYWdlID0gInRlc3QgMTIzNCB0ZXN0IjsKKyAgY2xpZW50LT5zZW5kX2V4Y2VwdGlvbldhaXQobWVzc2FnZSk7CisgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLmV4Y2VwdGlvbldhaXQiOworICB1aW50MzJfdCBjYWxsSWQgPSBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLCBFdmVudExvZzo6RVRfQ0FMTF9FWENFUFRJT05fV0FJVCwgY2FsbE5hbWUpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFRyaWdnZXIgdGhlIGhhbmRsZXIgdG8gcmV0dXJuCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnRyaWdnZXJQZW5kaW5nQ2FsbHMoKTsKKworICAvLyBUaGUgaGFuZGxlciB3aWxsIGxvZyBhbiBFVF9XQUlUX1JFVFVSTiBldmVudCB3aGVuIGl0IHdha2VzIHVwCisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1dBSVRfUkVUVVJOLCBldmVudC50eXBlKTsKKworICAvLyBOb3cgcmVjZWl2ZSB0aGUgcmVzcG9uc2UKKyAgdHJ5IHsKKyAgICBjbGllbnQtPnJlY3ZfZXhjZXB0aW9uV2FpdCgpOworICAgIEJPT1NUX0ZBSUwoImV4cGVjdGVkIE15RXJyb3IgdG8gYmUgdGhyb3duIik7CisgIH0gY2F0Y2ggKGNvbnN0IE15RXJyb3ImIGUpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChtZXNzYWdlLCBlLm1lc3NhZ2UpOworICAgIC8vIENoZWNrIGlmIHN0ZDo6ZXhjZXB0aW9uOjp3aGF0KCkgaXMgaGFuZGxlZCBwcm9wZXJseQorICAgIHNpemVfdCBtZXNzYWdlX3BvcyA9IHN0cmluZyhlLndoYXQoKSkuZmluZCgiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogTXlFcnJvciIpOworICAgIEJPT1NUX0NIRUNLX05FKG1lc3NhZ2VfcG9zLCBzdHJpbmc6Om5wb3MpOworICB9CisKKyAgLy8gTm93IHdlIHNob3VsZCBzZWUgdGhlIGV2ZW50cyBmb3IgYSBub3JtYWwgY2FsbCBmaW5pc2gKKyAgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMobG9nLCBjb25uSWQsIGNhbGxJZCwgY2FsbE5hbWUpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIERlc3Ryb3kgdGhlIGNsaWVudCwgYW5kIGNoZWNrIGZvciBjb25uZWN0aW9uIGNsb3NlZCBldmVudHMKKyAgY2xpZW50LnJlc2V0KCk7CisgIGNoZWNrQ2xvc2VFdmVudHMobG9nLCBjb25uSWQpOworCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit2b2lkIHRlc3RVbmV4cGVjdGVkRXJyb3IoKSB7CisgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOworCisgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisKKyAgLy8gQ3JlYXRlIGEgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOworCisgIC8vIFNlbmQgdGhlIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCkgY2FsbAorICBzdGF0ZS0+Z2V0SGFuZGxlcigpLT5wcmVwYXJlVHJpZ2dlcmVkQ2FsbCgpOworICBzdHJpbmcgbWVzc2FnZSA9ICIxMjM0IHRlc3QgNTY3OCI7CisgIGNsaWVudC0+c2VuZF91bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChtZXNzYWdlKTsKKyAgc3RyaW5nIGNhbGxOYW1lID0gIlBhcmVudFNlcnZpY2UudW5leHBlY3RlZEV4Y2VwdGlvbldhaXQiOworICB1aW50MzJfdCBjYWxsSWQKKyAgICAgID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCwgY2FsbE5hbWUpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIFRyaWdnZXIgdGhlIGhhbmRsZXIgdG8gcmV0dXJuCisgIHN0YXRlLT5nZXRIYW5kbGVyKCktPnRyaWdnZXJQZW5kaW5nQ2FsbHMoKTsKKworICAvLyBUaGUgaGFuZGxlciB3aWxsIGxvZyBhbiBFVF9XQUlUX1JFVFVSTiBldmVudCB3aGVuIGl0IHdha2VzIHVwCisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX1dBSVRfUkVUVVJOLCBldmVudC50eXBlKTsKKworICAvLyBOb3cgcmVjZWl2ZSB0aGUgcmVzcG9uc2UKKyAgdHJ5IHsKKyAgICBjbGllbnQtPnJlY3ZfdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoKTsKKyAgICBCT09TVF9GQUlMKCJleHBlY3RlZCBUQXBwbGljYXRpb25FcnJvciB0byBiZSB0aHJvd24iKTsKKyAgfSBjYXRjaCAoY29uc3QgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJikgeworICB9CisKKyAgLy8gTm93IHdlIHNob3VsZCBzZWUgYSBoYW5kbGVyIGVycm9yIGV2ZW50CisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0hBTkRMRVJfRVJST1IsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIHByZS13cml0ZSBhbmQgcG9zdC13cml0ZSBldmVudHMgYXJlbid0IGdlbmVyYXRlZCBhZnRlciBhIGhhbmRsZXIgZXJyb3IKKyAgLy8gKEV2ZW4gZm9yIG5vbi1vbmV3YXkgY2FsbHMgd2hlcmUgYSByZXNwb25zZSBpcyB3cml0dGVuLikKKyAgLy8KKyAgLy8gQSBjYWxsIGZpbmlzaGVkIGV2ZW50IGlzIGxvZ2dlZCB3aGVuIHRoZSBjYWxsIGNvbnRleHQgaXMgZGVzdHJveWVkCisgIGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGV2ZW50LnR5cGUpOworICBCT09TVF9DSEVDS19FUVVBTChjb25uSWQsIGV2ZW50LmNvbm5lY3Rpb25JZCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGNhbGxJZCwgZXZlbnQuY2FsbElkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY2FsbE5hbWUsIGV2ZW50Lm1lc3NhZ2UpOworCisgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKKyAgY2hlY2tOb0V2ZW50cyhsb2cpOworCisgIC8vIERlc3Ryb3kgdGhlIGNsaWVudCwgYW5kIGNoZWNrIGZvciBjb25uZWN0aW9uIGNsb3NlZCBldmVudHMKKyAgY2xpZW50LnJlc2V0KCk7CisgIGNoZWNrQ2xvc2VFdmVudHMobG9nLCBjb25uSWQpOworCisgIGNoZWNrTm9FdmVudHMobG9nKTsKK30KKworLy8gTWFjcm8gdG8gZGVmaW5lIHNpbXBsZSB0ZXN0cyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYWxsIHNlcnZlciB0eXBlcworI2RlZmluZSBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfYmFzaWNTZXJ2aWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RCYXNpY1NlcnZpY2U8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfaW5oZXJpdGVkU2VydmljZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RJbmhlcml0ZWRTZXJ2aWNlPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfb25ld2F5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RPbmV3YXlDYWxsPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfZXhjZXB0aW9uKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RFeHBlY3RlZEVycm9yPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfdW5leHBlY3RlZEV4Y2VwdGlvbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3RVbmV4cGVjdGVkRXJyb3I8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIFRlc3RzIHRoYXQgcmVxdWlyZSB0aGUgc2VydmVyIHRvIHByb2Nlc3MgbXVsdGlwbGUgY29ubmVjdGlvbnMgY29uY3VycmVudGx5CisvLyAoaS5lLiwgbm90IFRTaW1wbGVTZXJ2ZXIpCisjZGVmaW5lIERFRklORV9DT05DVVJSRU5UX1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0FVVE9fVEVTVF9DQVNFKFNlcnZlciMjXyMjVGVtcGxhdGUjI19zZXBhcmF0ZUNvbm5lY3Rpb25zKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVzdFNlcGFyYXRlQ29ubmVjdGlvbnM8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gVGhlIHRlc3RFdmVudFNlcXVlbmNpbmcoKSB0ZXN0IG1hbnVhbGx5IGdlbmVyYXRlcyBhIHJlcXVlc3QgZm9yIHRoZSBzZXJ2ZXIsCisvLyBhbmQgZG9lc24ndCB3b3JrIHdpdGggVEZyYW1lZFRyYW5zcG9ydC4gIFRoZXJlZm9yZSB3ZSBjYW4ndCB0ZXN0IGl0IHdpdGgKKy8vIFROb25ibG9ja2luZ1NlcnZlci4KKyNkZWZpbmUgREVGSU5FX05PRlJBTUVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2V2ZW50U2VxdWVuY2luZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0RXZlbnRTZXF1ZW5jaW5nPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIERFRklORV9UTk9OQkxPQ0tJTkdTRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9TSU1QTEVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9DT05DVVJSRU5UX1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKQorCisjZGVmaW5lIERFRklORV9BTExfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9TSU1QTEVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9DT05DVVJSRU5UX1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9OT0ZSQU1FX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpCisKK0RFRklORV9BTExfU0VSVkVSX1RFU1RTKFRUaHJlYWRlZFNlcnZlciwgVGVtcGxhdGVkKQorREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoVFRocmVhZGVkU2VydmVyLCBVbnRlbXBsYXRlZCkKK0RFRklORV9BTExfU0VSVkVSX1RFU1RTKFRUaHJlYWRQb29sU2VydmVyLCBUZW1wbGF0ZWQpCitERUZJTkVfQUxMX1NFUlZFUl9URVNUUyhUVGhyZWFkUG9vbFNlcnZlciwgVW50ZW1wbGF0ZWQpCisKK0RFRklORV9UTk9OQkxPQ0tJTkdTRVJWRVJfVEVTVFMoVE5vbmJsb2NraW5nU2VydmVyLCBUZW1wbGF0ZWQpCitERUZJTkVfVE5PTkJMT0NLSU5HU0VSVkVSX1RFU1RTKFROb25ibG9ja2luZ1NlcnZlciwgVW50ZW1wbGF0ZWQpCitERUZJTkVfVE5PTkJMT0NLSU5HU0VSVkVSX1RFU1RTKFROb25ibG9ja2luZ1NlcnZlck5vVGhyZWFkcywgVGVtcGxhdGVkKQorREVGSU5FX1ROT05CTE9DS0lOR1NFUlZFUl9URVNUUyhUTm9uYmxvY2tpbmdTZXJ2ZXJOb1RocmVhZHMsIFVudGVtcGxhdGVkKQorCitERUZJTkVfU0lNUExFX1RFU1RTKFRTaW1wbGVTZXJ2ZXIsIFRlbXBsYXRlZCkKK0RFRklORV9TSU1QTEVfVEVTVFMoVFNpbXBsZVNlcnZlciwgVW50ZW1wbGF0ZWQpCitERUZJTkVfTk9GUkFNRV9URVNUUyhUU2ltcGxlU2VydmVyLCBUZW1wbGF0ZWQpCitERUZJTkVfTk9GUkFNRV9URVNUUyhUU2ltcGxlU2VydmVyLCBVbnRlbXBsYXRlZCkKKworLy8gVE9ETzogV2Ugc2hvdWxkIHRlc3QgVEV2ZW50U2VydmVyIGluIHRoZSBmdXR1cmUuCisvLyBGb3Igbm93LCBpdCBpcyBrbm93biBub3QgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyLgorI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJQcm9jZXNzb3JUZXN0IjsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCis6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgOjpib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlByb2Nlc3NvclRlc3QiOworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMWVjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RIUklGVF9URVNUX1NFUlZFUlRIUkVBRF9UQ0NfCisjZGVmaW5lIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfVENDXyAxCisKKyNpbmNsdWRlICJTZXJ2ZXJUaHJlYWQuaCIKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CisKK3ZvaWQgU2VydmVyVGhyZWFkOjpzdGFydCgpIHsKKyAgYXNzZXJ0KCFydW5uaW5nXyk7CisgIHJ1bm5pbmdfID0gdHJ1ZTsKKworICBoZWxwZXJfLnJlc2V0KG5ldyBIZWxwZXIodGhpcykpOworCisgIC8vIFN0YXJ0IHRoZSBvdGhlciB0aHJlYWQKKyAgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5OworICB0aHJlYWRGYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKKyAgdGhyZWFkXyA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKGhlbHBlcl8pOworCisgIHRocmVhZF8tPnN0YXJ0KCk7CisKKyAgLy8gV2FpdCBvbiB0aGUgb3RoZXIgdGhyZWFkIHRvIHRlbGwgdXMgdGhhdCBpdCBoYXMgc3VjY2Vzc2Z1bGx5CisgIC8vIGJvdW5kIHRvIHRoZSBwb3J0IGFuZCBzdGFydGVkIGxpc3RlbmluZyAob3IgdW50aWwgYW4gZXJyb3Igb2NjdXJzKS4KKyAgY29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKHNlcnZlck1vbml0b3JfKTsKKyAgd2hpbGUgKCFzZXJ2aW5nXyAmJiAhZXJyb3JfKSB7CisgICAgc2VydmVyTW9uaXRvcl8ud2FpdEZvcmV2ZXIoKTsKKyAgfQorCisgIGlmIChlcnJvcl8pIHsKKyAgICB0aHJvdyB0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24odHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBiaW5kIG9uIHNlcnZlciBzb2NrZXQiKTsKKyAgfQorfQorCit2b2lkIFNlcnZlclRocmVhZDo6c3RvcCgpIHsKKyAgaWYgKCFydW5uaW5nXykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRlbGwgdGhlIHNlcnZlciB0byBzdG9wCisgIHNlcnZlcl8tPnN0b3AoKTsKKyAgcnVubmluZ18gPSBmYWxzZTsKKworICAvLyBXYWl0IGZvciB0aGUgc2VydmVyIHRocmVhZCB0byBleGl0CisgIC8vCisgIC8vIE5vdGU6IHRoaXMgb25seSB3b3JrcyBpZiBhbGwgY2xpZW50IGNvbm5lY3Rpb25zIGhhdmUgY2xvc2VkLiAgVGhlIHNlcnZlcnMKKyAgLy8gZ2VuZXJhbGx5IHdhaXQgZm9yIGV2ZXJ5dGhpbmcgdG8gYmUgY2xvc2VkIGJlZm9yZSBleGl0aW5nOyB0aGVyZSBjdXJyZW50bHkKKyAgLy8gaXNuJ3QgYSB3YXkgdG8gdGVsbCB0aGVtIHRvIGp1c3QgZXhpdCBub3csIGFuZCBzaHV0IGRvd24gZXhpc3RpbmcKKyAgLy8gY29ubmVjdGlvbnMuCisgIHRocmVhZF8tPmpvaW4oKTsKK30KKwordm9pZCBTZXJ2ZXJUaHJlYWQ6OnJ1bigpIHsKKyAgLyoKKyAgICogVHJ5IGJpbmRpbmcgdG8gc2V2ZXJhbCBwb3J0cywgaW4gY2FzZSB0aGUgb25lIHdlIHdhbnQgaXMgYWxyZWFkeSBpbiB1c2UuCisgICAqLworICBwb3J0XyA9IDEyMzQ1OworICB1bnNpZ25lZCBpbnQgbWF4UmV0cmllcyA9IDEwOworICBmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IG1heFJldHJpZXM7ICsrbikgeworICAgIC8vIENyZWF0ZSB0aGUgc2VydmVyCisgICAgc2VydmVyXyA9IHNlcnZlclN0YXRlXy0+Y3JlYXRlU2VydmVyKHBvcnRfKTsKKyAgICAvLyBJbnN0YWxsIG91ciBoZWxwZXIgYXMgdGhlIHNlcnZlciBldmVudCBoYW5kbGVyLCBzbyB0aGF0IG91cgorICAgIC8vIHByZVNlcnZlKCkgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uY2Ugd2UndmUgc3VjY2Vzc2Z1bGx5IGJvdW5kIHRvCisgICAgLy8gdGhlIHBvcnQgYW5kIGFyZSBhYm91dCB0byBzdGFydCBsaXN0ZW5pbmcuCisgICAgc2VydmVyXy0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKGhlbHBlcl8pOworCisgICAgdHJ5IHsKKyAgICAgIC8vIFRyeSB0byBzZXJ2ZSByZXF1ZXN0cworICAgICAgc2VydmVyXy0+c2VydmUoKTsKKyAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJikgeworICAgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIHRocm93cyBhIGdlbmVyaWMgVEV4Y2VwdGlvbiBpZiBpdCBmYWlscyB0byBiaW5kLgorICAgICAgLy8gSWYgd2UgZ2V0IGEgVEV4Y2VwdGlvbiwgd2UnbGwgb3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoZSBiaW5kIGZhaWxlZC4KKyAgICAgICsrcG9ydF87CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBTZXJpb3VzbHk/ICBzZXJ2ZSgpIGlzIHByZXR0eSBsYW1lLiAgSWYgaXQgZmFpbHMgdG8gc3RhcnQgc2VydmluZyBpdAorICAgIC8vIGp1c3QgcmV0dXJucyByYXRoZXIgdGhhbiB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgICAgLy8KKyAgICAvLyBXZSBoYXZlIHRvIHVzZSBvdXIgcHJlU2VydmUoKSBob29rIHRvIHRlbGwgaWYgc2VydmUoKSBzdWNjZXNzZnVsbHkKKyAgICAvLyBzdGFydGVkIHNlcnZpbmcgYW5kIGlzIHJldHVybmluZyBiZWNhdXNlIHN0b3AoKSBpcyBjYWxsZWQsIG9yIGlmIGl0IGp1c3QKKyAgICAvLyBmYWlsZWQgdG8gc3RhcnQgc2VydmluZyBpbiB0aGUgZmlyc3QgcGxhY2UuCisgICAgY29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKHNlcnZlck1vbml0b3JfKTsKKyAgICBpZiAoc2VydmluZ18pIHsKKyAgICAgIC8vIE9oIGdvb2QsIHdlIHN0YXJ0ZWQgc2VydmluZyBhbmQgYXJlIGV4aXRpbmcgYmVjYXVzZQorICAgICAgLy8gd2UncmUgdHJ5aW5nIHRvIHN0b3AuCisgICAgICBzZXJ2aW5nXyA9IGZhbHNlOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBuZXZlciBzdGFydGVkIHNlcnZpbmcsIHByb2JhYmx5IGJlY2F1c2Ugd2UgZmFpbGVkIHRvIGJpbmQgdG8gdGhlCisgICAgICAvLyBwb3J0LiAgSW5jcmVtZW50IHRoZSBwb3J0IG51bWJlciBhbmQgdHJ5IGFnYWluLgorICAgICAgKytwb3J0XzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgfQorCisgIC8vIFdlIGZhaWxlZCB0byBiaW5kIG9uIGFueSBwb3J0LgorICBjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoc2VydmVyTW9uaXRvcl8pOworICBlcnJvcl8gPSB0cnVlOworICBzZXJ2ZXJNb25pdG9yXy5ub3RpZnkoKTsKK30KKwordm9pZCBTZXJ2ZXJUaHJlYWQ6OnByZVNlcnZlKCkgeworICAvLyBXZSBib3VuZCB0byB0aGUgcG9ydCBzdWNjZXNzZnVsbHksIGFuZCBhcmUgYWJvdXQgdG8gc3RhcnQgc2VydmluZyByZXF1ZXN0cworICBzZXJ2ZXJTdGF0ZV8tPmJpbmRTdWNjZXNzZnVsKHBvcnRfKTsKKworICAvLyBTZXQgdGhlIHJlYWwgc2VydmVyIGV2ZW50IGhhbmRsZXIgKHJlcGxhY2luZyBvdXJzZWxmKQorICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICAgID0gc2VydmVyU3RhdGVfLT5nZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgc2VydmVyXy0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50SGFuZGxlcik7CisKKyAgLy8gTm90aWZ5IHRoZSBtYWluIHRocmVhZCB0aGF0IHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgc2VydmluZyByZXF1ZXN0cworICBjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoc2VydmVyTW9uaXRvcl8pOworICBzZXJ2aW5nXyA9IHRydWU7CisgIHNlcnZlck1vbml0b3JfLm5vdGlmeSgpOworCisgIC8vIEludm9rZSBwcmVTZXJ2ZSgpIG9uIHRoZSByZWFsIGV2ZW50IGhhbmRsZXIsIHNpbmNlIHdlIGF0ZQorICAvLyB0aGUgb3JpZ2luYWwgcHJlU2VydmUoKSBldmVudC4KKyAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcikgeworICAgIHNlcnZlckV2ZW50SGFuZGxlci0+cHJlU2VydmUoKTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorCisjZW5kaWYgLy8gX1RIUklGVF9URVNUX1NFUlZFUlRIUkVBRF9UQ0NfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5oIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWUzMWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1RFU1RfU0VSVkVSVEhSRUFEX0hfCisjZGVmaW5lIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlICJFdmVudExvZy5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIHRvIHRlbGwgU2VydmVyVGhyZWFkIGhvdyB0byBjcmVhdGUgdGhlIHNlcnZlcgorICovCitjbGFzcyBTZXJ2ZXJTdGF0ZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflNlcnZlclN0YXRlKCkge30KKworICAvKioKKyAgICogQ3JlYXRlIGEgc2VydmVyIHRvIGxpc3RlbiBvbiB0aGUgc3BlY2lmaWVkIHBvcnQuCisgICAqCisgICAqIElmIHRoZSBzZXJ2ZXIgcmV0dXJuZWQgZmFpbHMgdG8gYmluZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQgd2hlbiBzZXJ2ZSgpIGlzCisgICAqIGNhbGxlZCBvbiBpdCwgY3JlYXRlU2VydmVyKCkgbWF5IGJlIGNhbGxlZCBhZ2FpbiBvbiBhIGRpZmZlcmVudCBwb3J0LgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgPSAwOworCisgIC8qKgorICAgKiBHZXQgdGhlIFRTZXJ2ZXJFdmVudEhhbmRsZXIgdG8gc2V0IG9uIHRoZSBzZXJ2ZXIuCisgICAqCisgICAqIFRoaXMgaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlIHNlcnZlciBzdWNjZXNzZnVsbHkgYmluZHMgYW5kIGlzIGFib3V0IHRvCisgICAqIHN0YXJ0IHNlcnZpbmcgdHJhZmZpYy4gIEl0IGlzIGludm9rZWQgZnJvbSB0aGUgc2VydmVyIHRocmVhZCwgcmF0aGVyIHRoYW4KKyAgICogdGhlIG1haW4gdGhyZWFkLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+KCk7CisgIH0KKworICAvKioKKyAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHRoZSBzZXJ2ZXIgdGhyZWFkIGFmdGVyIHNlcnZlciBiaW5kaW5nIHN1Y2NlZWRzLgorICAgKgorICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IHdpc2ggdG8gcmVjb3JkIHRoZSBmaW5hbAorICAgKiBwb3J0IHRoYXQgd2FzIHVzZWQgZm9yIHRoZSBzZXJ2ZXIuCisgICAqLworICB2aXJ0dWFsIHZvaWQgYmluZFN1Y2Nlc3NmdWwodWludDE2X3QgLypwb3J0Ki8pIHt9Cit9OworCisvKioKKyAqIFNlcnZlclRocmVhZCBzdGFydHMgYSB0aHJpZnQgc2VydmVyIHJ1bm5pbmcgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisgKi8KK2NsYXNzIFNlcnZlclRocmVhZCB7CitwdWJsaWM6CisgIFNlcnZlclRocmVhZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyU3RhdGU+JiBzdGF0ZSwgYm9vbCBhdXRvU3RhcnQpCisgICAgOiBwb3J0XygwKSwKKyAgICAgIHJ1bm5pbmdfKGZhbHNlKSwKKyAgICAgIHNlcnZpbmdfKGZhbHNlKSwKKyAgICAgIGVycm9yXyhmYWxzZSksCisgICAgICBzZXJ2ZXJTdGF0ZV8oc3RhdGUpIHsKKyAgICBpZiAoYXV0b1N0YXJ0KSB7CisgICAgICBzdGFydCgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc3RhcnQoKTsKKyAgdm9pZCBzdG9wKCk7CisKKyAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsgcmV0dXJuIHBvcnRfOyB9CisKKyAgflNlcnZlclRocmVhZCgpIHsKKyAgICBpZiAocnVubmluZ18pIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHN0b3AoKTsKKyAgICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJlcnJvciBzaHV0dGluZyBkb3duIHNlcnZlciIpOworICAgICAgfQorICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vIEFubm95aW5nLiAgdGhyaWZ0IGZvcmNlcyB1cyB0byB1c2Ugc2hhcmVkX3B0ciwgc28gd2UgaGF2ZSB0byB1c2UKKyAgLy8gYSBoZWxwZXIgY2xhc3MgdGhhdCB3ZSBjYW4gYWxsb2NhdGUgb24gdGhlIGhlYXAgYW5kIGdpdmUgdG8gdGhyaWZ0LgorICAvLyBJdCB3b3VsZCBiZSBzaW1wbGVyIGlmIHdlIGNvdWxkIGp1c3QgbWFrZSBSdW5uYWJsZSBhbmQgVFNlcnZlckV2ZW50SGFuZGxlcgorICAvLyBwcml2YXRlIGJhc2UgY2xhc3NlcyBvZiBTZXJ2ZXJUaHJlYWQuCisgIGNsYXNzIEhlbHBlciA6IHB1YmxpYyBjb25jdXJyZW5jeTo6UnVubmFibGUsIHB1YmxpYyBzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICBwdWJsaWM6CisgICAgSGVscGVyKFNlcnZlclRocmVhZCogc2VydmVyVGhyZWFkKSA6IHNlcnZlclRocmVhZF8oc2VydmVyVGhyZWFkKSB7fQorCisgICAgdm9pZCBydW4oKSB7IHNlcnZlclRocmVhZF8tPnJ1bigpOyB9CisKKyAgICB2b2lkIHByZVNlcnZlKCkgeyBzZXJ2ZXJUaHJlYWRfLT5wcmVTZXJ2ZSgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBTZXJ2ZXJUaHJlYWQqIHNlcnZlclRocmVhZF87CisgIH07CisKKyAgdm9pZCBydW4oKTsKKyAgdm9pZCBwcmVTZXJ2ZSgpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxIZWxwZXI+IGhlbHBlcl87CisKKyAgdWludDE2X3QgcG9ydF87CisgIGJvb2wgcnVubmluZ187CisgIGJvb2wgc2VydmluZ187CisgIGJvb2wgZXJyb3JfOworICBjb25jdXJyZW5jeTo6TW9uaXRvciBzZXJ2ZXJNb25pdG9yXzsKKworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyU3RhdGU+IHNlcnZlclN0YXRlXzsKKyAgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gc2VydmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dGVzdAorCisjZW5kaWYgLy8gX1RIUklGVF9URVNUX1NFUlZFUlRIUkVBRF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9wcm9jLnRocmlmdCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvcHJvYy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzYzVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvcHJvYy50aHJpZnQKQEAgLTAsMCArMSwyMiBAQAorbmFtZXNwYWNlIGNwcCBhcGFjaGUudGhyaWZ0LnRlc3QKKworZXhjZXB0aW9uIE15RXJyb3IgeworICAxOiBzdHJpbmcgbWVzc2FnZQorfQorCitzZXJ2aWNlIFBhcmVudFNlcnZpY2UgeworICBpMzIgaW5jcmVtZW50R2VuZXJhdGlvbigpCisgIGkzMiBnZXRHZW5lcmF0aW9uKCkKKyAgdm9pZCBhZGRTdHJpbmcoMTogc3RyaW5nIHMpCisgIGxpc3Q8c3RyaW5nPiBnZXRTdHJpbmdzKCkKKworICBiaW5hcnkgZ2V0RGF0YVdhaXQoMTogaTMyIGxlbmd0aCkKKyAgb25ld2F5IHZvaWQgb25ld2F5V2FpdCgpCisgIHZvaWQgZXhjZXB0aW9uV2FpdCgxOiBzdHJpbmcgbWVzc2FnZSkgdGhyb3dzICgyOiBNeUVycm9yIGVycm9yKQorICB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KDE6IHN0cmluZyBtZXNzYWdlKQorfQorCitzZXJ2aWNlIENoaWxkU2VydmljZSBleHRlbmRzIFBhcmVudFNlcnZpY2UgeworICBpMzIgc2V0VmFsdWUoMTogaTMyIHZhbHVlKQorICBpMzIgZ2V0VmFsdWUoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3F0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC90ZXN0L3F0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzQxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvcXQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NldChDTUFLRV9BVVRPTU9DIE9OKQorZmluZF9wYWNrYWdlKFF0NSBSRVFVSVJFRCBDT01QT05FTlRTIFRlc3QgTmV0d29yaykKK3NldChUUVRjcFNlcnZlclRlc3RfUXQ1X1NPVVJDRVMKKyAgICBUUVRjcFNlcnZlclRlc3QuY3BwCispCithZGRfZXhlY3V0YWJsZShUUVRjcFNlcnZlclRlc3RfUXQ1ICR7VFFUY3BTZXJ2ZXJUZXN0X1F0NV9TT1VSQ0VTfSkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUUVRjcFNlcnZlclRlc3RfUXQ1IHRlc3RnZW5jcHBfY29iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRRVGNwU2VydmVyVGVzdF9RdDUgdGhyaWZ0cXQ1KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRRVGNwU2VydmVyVGVzdF9RdDUgdGhyaWZ0KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRRVGNwU2VydmVyVGVzdF9RdDUgUXQ1OjpUZXN0IFF0NTo6TmV0d29yaykKKworYWRkX3Rlc3QoTkFNRSBUUVRjcFNlcnZlclRlc3RfUXQ1IENPTU1BTkQgVFFUY3BTZXJ2ZXJUZXN0X1F0NSkKKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvcXQvVFFUY3BTZXJ2ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQwYzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVFFUY3BTZXJ2ZXJUZXN0CisjaW5jbHVkZSA8UVRlc3Q+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxRVGNwU2VydmVyPgorI2luY2x1ZGUgPFFUY3BTb2NrZXQ+CisjaW5jbHVkZSA8UUhvc3RBZGRyZXNzPgorI2luY2x1ZGUgPFFUaHJlYWQ+CisKKyNpZm5kZWYgUV9NT0NfUlVOCisgICNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCisgICNpbmNsdWRlICJ0aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgiCisgICNpbmNsdWRlICJ0aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaCIKKyAgI2luY2x1ZGUgInRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgiCisKKyAgI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKKworc3RydWN0IEFzeW5jSGFuZGxlciA6IHB1YmxpYyB0ZXN0OjpQYXJlbnRTZXJ2aWNlQ29iU3ZJZiB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzOworICB2aXJ0dWFsIHZvaWQgYWRkU3RyaW5nKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgc3RyaW5ncy5wdXNoX2JhY2socyk7CisgICAgY29iKCk7CisgIH0KKyAgdmlydHVhbCB2b2lkIGdldFN0cmluZ3Moc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYikgeworICAgIGNvYihzdHJpbmdzKTsKKyAgfQorCisgIC8vIE92ZXJyaWRlcyBub3QgdXNlZCBpbiB0aGlzIHRlc3QKKyAgdmlydHVhbCB2b2lkIGluY3JlbWVudEdlbmVyYXRpb24oc3RkOjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IpIHt9CisgIHZpcnR1YWwgdm9pZCBnZXRHZW5lcmF0aW9uKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBsZW5ndGgpIHt9CisgIHZpcnR1YWwgdm9pZCBvbmV3YXlXYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IpIHt9CisgIHZpcnR1YWwgdm9pZCBleGNlcHRpb25XYWl0KAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gLyogZXhuX2NvYiAqLywKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7fQorICB2aXJ0dWFsIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHt9Cit9OworCitjbGFzcyBUUVRjcFNlcnZlclRlc3QgOiBwdWJsaWMgUU9iamVjdCB7CisgIFFfT0JKRUNUCisKK3ByaXZhdGUgc2xvdHM6CisgIHZvaWQgaW5pdFRlc3RDYXNlKCk7CisgIHZvaWQgY2xlYW51cFRlc3RDYXNlKCk7CisgIHZvaWQgdGVzdF9jb21tdW5pY2F0ZSgpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8UVRocmVhZD4gc2VydmVyVGhyZWFkOworICBzdGQ6OnNoYXJlZF9wdHI8YXN5bmM6OlRRVGNwU2VydmVyPiBzZXJ2ZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50PiBjbGllbnQ7Cit9OworCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6aW5pdFRlc3RDYXNlKCkgeworICAvLyBzZXR1cCBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlclNvY2tldCA9IHN0ZDo6bWFrZV9zaGFyZWQ8UVRjcFNlcnZlcj4oKTsKKyAgc2VydmVyLnJlc2V0KG5ldyBhc3luYzo6VFFUY3BTZXJ2ZXIoc2VydmVyU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHRlc3Q6OlBhcmVudFNlcnZpY2VBc3luY1Byb2Nlc3Nvcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QXN5bmNIYW5kbGVyPigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSkpOworICBRVkVSSUZZKHNlcnZlclNvY2tldC0+bGlzdGVuKFFIb3N0QWRkcmVzczo6TG9jYWxIb3N0KSk7CisgIGludCBwb3J0ID0gc2VydmVyU29ja2V0LT5zZXJ2ZXJQb3J0KCk7CisgIFFWRVJJRlkocG9ydCA+IDApOworCisgIC8vc2V0dXAgc2VydmVyIHRocmVhZCBhbmQgbW92ZSBzZXJ2ZXIgdG8gaXQKKyAgc2VydmVyVGhyZWFkLnJlc2V0KG5ldyBRVGhyZWFkKCkpOworICBzZXJ2ZXJTb2NrZXQtPm1vdmVUb1RocmVhZChzZXJ2ZXJUaHJlYWQuZ2V0KCkpOworICBzZXJ2ZXItPm1vdmVUb1RocmVhZChzZXJ2ZXJUaHJlYWQuZ2V0KCkpOworICBzZXJ2ZXJUaHJlYWQtPnN0YXJ0KCk7CisKKyAgLy8gc2V0dXAgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU29ja2V0PiBzb2NrZXQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFFUY3BTb2NrZXQ+KCk7CisgIGNsaWVudC5yZXNldChuZXcgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudChzdGQ6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgc3RkOjptYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRRSU9EZXZpY2VUcmFuc3BvcnQ+KHNvY2tldCkpKSk7CisgIHNvY2tldC0+Y29ubmVjdFRvSG9zdChRSG9zdEFkZHJlc3M6OkxvY2FsSG9zdCwgcG9ydCk7CisgIFFWRVJJRlkoc29ja2V0LT53YWl0Rm9yQ29ubmVjdGVkKCkpOworfQorCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6Y2xlYW51cFRlc3RDYXNlKCkgeworICAvL2ZpcnN0LCBzdG9wIHRoZSB0aHJlYWQgd2hpY2ggaG9sZHMgdGhlIHNlcnZlcgorICBzZXJ2ZXJUaHJlYWQtPnF1aXQoKTsKKyAgc2VydmVyVGhyZWFkLT53YWl0KCk7CisgIC8vIG5vdywgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIHNlcnZlcgorICBzZXJ2ZXIucmVzZXQoKTsKKyAgLy8gZGVsZXRlIHRocmVhZCBub3cKKyAgc2VydmVyVGhyZWFkLnJlc2V0KCk7CisKKyAgLy8gY2xlYW51cCBjbGllbnQKKyAgY2xpZW50LnJlc2V0KCk7Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXJUZXN0Ojp0ZXN0X2NvbW11bmljYXRlKCkgeworICBjbGllbnQtPmFkZFN0cmluZygiZm9vIik7CisgIGNsaWVudC0+YWRkU3RyaW5nKCJiYXIiKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVwbHk7CisgIGNsaWVudC0+Z2V0U3RyaW5ncyhyZXBseSk7CisgIFFDT01QQVJFKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcocmVwbHlbMF0pLCBRU3RyaW5nKCJmb28iKSk7CisgIFFDT01QQVJFKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcocmVwbHlbMV0pLCBRU3RyaW5nKCJiYXIiKSk7Cit9CisKKworI2lmIChRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNSwgMCwgMCkpCitRVEVTVF9HVUlMRVNTX01BSU4oVFFUY3BTZXJ2ZXJUZXN0KTsKKyNlbHNlCisjdW5kZWYgUVRfR1VJX0xJQgorUVRFU1RfTUFJTihUUVRjcFNlcnZlclRlc3QpOworI2VuZGlmCisjaW5jbHVkZSAiVFFUY3BTZXJ2ZXJUZXN0Lm1vYyIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LW5iLnBjLmluIGIvbGliL2NwcC90aHJpZnQtbmIucGMuaW4Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhZTA1MTg4Li4yYzZhOTY5Ci0tLSBhL2xpYi9jcHAvdGhyaWZ0LW5iLnBjLmluCisrKyBiL2xpYi9jcHAvdGhyaWZ0LW5iLnBjLmluCkBAIC0yNyw0ICsyNyw0IEBACiBWZXJzaW9uOiBAVkVSU0lPTkAKIFJlcXVpcmVzOiB0aHJpZnQgPSBAVkVSU0lPTkAKIExpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0bmIKLUNmbGFnczogLUkke2luY2x1ZGVkaXJ9L3RocmlmdAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LXF0LnBjLmluIGIvbGliL2NwcC90aHJpZnQtcXQucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWU2MGQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGhyaWZ0LXF0LnBjLmluCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogVGhyaWZ0CitEZXNjcmlwdGlvbjogVGhyaWZ0IFF0IEFQSQorVmVyc2lvbjogQFZFUlNJT05ACitSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdHF0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90aHJpZnQtcXQ1LnBjLmluIGIvbGliL2NwcC90aHJpZnQtcXQ1LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4YjE2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3RocmlmdC1xdDUucGMuaW4KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBUaHJpZnQKK0Rlc2NyaXB0aW9uOiBUaHJpZnQgUXQ1IEFQSQorVmVyc2lvbjogQFZFUlNJT05ACitSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdHF0NQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LXoucGMuaW4gYi9saWIvY3BwL3RocmlmdC16LnBjLmluCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNzJmNDZiZi4uNDY3ZDJlMQotLS0gYS9saWIvY3BwL3RocmlmdC16LnBjLmluCisrKyBiL2xpYi9jcHAvdGhyaWZ0LXoucGMuaW4KQEAgLTI3LDQgKzI3LDQgQEAKIFZlcnNpb246IEBWRVJTSU9OQAogUmVxdWlyZXM6IHRocmlmdCA9IEBWRVJTSU9OQAogTGliczogLUwke2xpYmRpcn0gLWx0aHJpZnR6Ci1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS90aHJpZnQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LnBjLmluCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggN2FlYzA5Zi4uZDExZTZkYgotLS0gYS9saWIvY3BwL3RocmlmdC5wYy5pbgorKysgYi9saWIvY3BwL3RocmlmdC5wYy5pbgpAQCAtMjYsNCArMjYsNCBAQAogRGVzY3JpcHRpb246IFRocmlmdCBDKysgQVBJCiBWZXJzaW9uOiBAVkVSU0lPTkAKIExpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0Ci1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS90aHJpZnQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC5zbG4gYi9saWIvY3BwL3RocmlmdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwZjQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGhyaWZ0LnNsbgpAQCAtMCwwICsxLDYxIEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJ0aHJpZnRuYiIsICJsaWJ0aHJpZnRuYi52Y3hwcm9qIiwgIntEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJsaWJ0aHJpZnQiLCAibGlidGhyaWZ0LnZjeHByb2oiLCAie0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7MjE1MEUzMzMtOEZEQy00MkEzLTk0NzQtMUEzOTU2RDQ2REU4fSIpID0gImRvYyIsICJkb2MiLCAiezAwNjk4NEUwLTdDQzEtNDdFMi1BQ0QyLUE0MEZFNEQzODY5M30iCisJUHJvamVjdFNlY3Rpb24oU29sdXRpb25JdGVtcykgPSBwcmVQcm9qZWN0CisJCVJFQURNRS5tZCA9IFJFQURNRS5tZAorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Zy1tdHxXaW4zMiA9IERlYnVnLW10fFdpbjMyCisJCURlYnVnLW10fHg2NCA9IERlYnVnLW10fHg2NAorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0CisJCVJlbGVhc2UtbXR8V2luMzIgPSBSZWxlYXNlLW10fFdpbjMyCisJCVJlbGVhc2UtbXR8eDY0ID0gUmVsZWFzZS1tdHx4NjQKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWctbXR8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWctbXR8V2luMzIKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWctbXR8V2luMzIuQnVpbGQuMCA9IERlYnVnLW10fFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LkRlYnVnLW10fHg2NC5BY3RpdmVDZmcgPSBEZWJ1Zy1tdHx4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uRGVidWctbXR8eDY0LkJ1aWxkLjAgPSBEZWJ1Zy1tdHx4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQKKwkJe0Q4Njk2Q0NFLTdENDYtNDY1OS1CNDMyLTkxNzU0QTQxREVCMH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2UtbXR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZS1tdHxXaW4zMgorCQl7RDg2OTZDQ0UtN0Q0Ni00NjU5LUI0MzItOTE3NTRBNDFERUIwfS5SZWxlYXNlLW10fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlLW10fFdpbjMyCisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2UtbXR8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2UtbXR8eDY0CisJCXtEODY5NkNDRS03RDQ2LTQ2NTktQjQzMi05MTc1NEE0MURFQjB9LlJlbGVhc2UtbXR8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlLW10fHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Zy1tdHxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Zy1tdHxXaW4zMgorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Zy1tdHxXaW4zMi5CdWlsZC4wID0gRGVidWctbXR8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uRGVidWctbXR8eDY0LkFjdGl2ZUNmZyA9IERlYnVnLW10fHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5EZWJ1Zy1tdHx4NjQuQnVpbGQuMCA9IERlYnVnLW10fHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NAorCQl7REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZS1tdHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlLW10fFdpbjMyCisJCXtERDI2RjU3RS02MEYyLTRGMzctQTYxNi1EMjE5QTlCRjMzOEZ9LlJlbGVhc2UtbXR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UtbXR8V2luMzIKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZS1tdHx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZS1tdHx4NjQKKwkJe0REMjZGNTdFLTYwRjItNEYzNy1BNjE2LUQyMTlBOUJGMzM4Rn0uUmVsZWFzZS1tdHx4NjQuQnVpbGQuMCA9IFJlbGVhc2UtbXR8eDY0CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9NYWtlZmlsZS5hbSBiL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0KaW5kZXggMDM5ZGI3NC4uNTZhOGIwZiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9NYWtlZmlsZS5hbQorKysgYi9saWIvY3NoYXJwL01ha2VmaWxlLmFtCkBAIC0xNyw5ICsxNywxNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUQ09ERT0gXAorU1VCRElSUyA9IC4gdGVzdC9NdWx0aXBsZXgKKworVEhSSUZUQ09ERSA9IFwKICAgICAgICAgICAgIHNyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBcCisgICAgICAgICAgICBzcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzIFwKKyAgICAgICAgICAgIHNyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEJhc2UuY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RCYXNlNjRVdGlscy5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UTGlzdC5jcyBcCkBAIC0yOCw0NCArMzUsODEgQEAKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzIFwKKyAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyBcCisgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UVHlwZS5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEZpZWxkLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFN0cnVjdC5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzIFwKKyAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzIFwKICAgICAgICAgICAgIHNyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzIFwKICAgICAgICAgICAgIHNyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MgXAogICAgICAgICAgICAgc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzIFwKICAgICAgICAgICAgIHNyYy9TZXJ2ZXIvVFNlcnZlci5jcyBcCisgICAgICAgICAgICBzcmMvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFNvY2tldC5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RIdHRwSGFuZGxlci5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzIFwKICAgICAgICAgICAgIHNyYy9UUHJvY2Vzc29yLmNzIFwKKyAgICAgICAgICAgIHNyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcyBcCisgICAgICAgICAgICBzcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MgXAorICAgICAgICAgICAgc3JjL1RQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzIFwKKyAgICAgICAgICAgIHNyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzIFwKKyAgICAgICAgICAgIHNyYy9URXhjZXB0aW9uLmNzIFwKICAgICAgICAgICAgIHNyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKIAotCi1DU0M9Z21jcwotCi1pZiBORVRfMl8wCi1NT05PX0RFRklORVM9L2Q6TkVUXzJfMAoraWYgTU9OT19NQ1MKK2V4cG9ydCBDU0MgPSBtY3MKK2Vsc2UKK2V4cG9ydCBDU0MgPSBnbWNzCiBlbmRpZgogCi1hbGwtbG9jYWw6IFRocmlmdC5kbGwKK2lmIE5FVF8yXzAKK2V4cG9ydCBDU0NfREVGSU5FUyA9IC1kOk5FVF8yXzAKK2VuZGlmCisKK2FsbC1sb2NhbDogVGhyaWZ0LmRsbCBUaHJpZnQuNDUuZGxsCiAKIFRocmlmdC5kbGw6ICQoVEhSSUZUQ09ERSkKLQkkKENTQykgJChUSFJJRlRDT0RFKSAvb3V0OlRocmlmdC5kbGwgL3RhcmdldDpsaWJyYXJ5ICQoTU9OT19ERUZJTkVTKQorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC10YXJnZXQ6bGlicmFyeSAtcmVmZXJlbmNlOlN5c3RlbS5XZWIgJChUSFJJRlRDT0RFKQorCitUaHJpZnQuNDUuZGxsOiAkKFRIUklGVENPREUpCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXRhcmdldDpsaWJyYXJ5IC1yZWZlcmVuY2U6U3lzdGVtLldlYiAkKFRIUklGVENPREUpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIFRocmlmdC5kbGwKKwkkKFJNKSBUaHJpZnQuZGxsICBcCisJJChSTSkgVGhyaWZ0LjQ1LmRsbAogCiBFWFRSQV9ESVNUID0gXAotICAgICAgICAgICAgICQoVEhSSUZUQ09ERSkgXAotICAgICAgICAgICAgIFRocmlmdE1TQnVpbGRUYXNrIFwKLSAgICAgICAgICAgICBzcmMvVGhyaWZ0LmNzcHJvaiBcCi0gICAgICAgICAgICAgc3JjL1RocmlmdC5zbG4KKwkkKFRIUklGVENPREUpIFwKKwlUaHJpZnRNU0J1aWxkVGFzayBcCisJc3JjL1RocmlmdC5jc3Byb2ogXAorCXNyYy9UaHJpZnQuNDUuY3Nwcm9qIFwKKwlzcmMvVGhyaWZ0LnNsbiBcCisJc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcyBcCisJc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MgXAorCXNyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzIFwKKwlzcmMvVEFzeW5jUHJvY2Vzc29yLmNzIFwKKwl0ZXN0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlSRUFETUUubWQKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBcCisJTWFrZWZpbGUgXAorCU1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL1JFQURNRSBiL2xpYi9jc2hhcnAvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvY3NoYXJwL1JFQURNRQpyZW5hbWUgdG8gbGliL2NzaGFycC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IGRlZjRjMWMuLmM3NDFiNzIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjksMTMgKzI5LDE0IEBACiAvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgogLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRNU0J1aWxkVGFzayIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiTVNCdWlsZCBUYXNrIHRvIGdlbmVyYXRlIGNzaGFycCBmcm9tIC50aHJpZnQgZmlsZXMsIGFuZCBjb21waWxlIHRoZSBjb2RlIGludG8gYSBsaWJyYXJ5OiBUaHJpZnRJbXBsLmRsbCIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdE1TQnVpbGRUYXNrIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAwOSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisvL0BUT0RPIHdoZXJlIHRvIHB1dCBMaWNlbnNlIGluZm9ybWF0aW9uPwogCiAvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKIC8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KQEAgLTU1LDUgKzU2LDUgQEAKIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4qIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdEJ1aWxkLmNzIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcwppbmRleCA3NWJiMzM5Li40ZTZkMzAxIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdEJ1aWxkLmNzCisrKyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKQEAgLTMzLDIxNCArMzMsMjE0IEBACiAKIG5hbWVzcGFjZSBUaHJpZnRNU0J1aWxkVGFzawogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gTVNCdWlsZCBUYXNrIHRvIGdlbmVyYXRlIGNzaGFycCBmcm9tIC50aHJpZnQgZmlsZXMsIGFuZCBjb21waWxlIHRoZSBjb2RlIGludG8gYSBsaWJyYXJ5OiBUaHJpZnRJbXBsLmRsbAotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRocmlmdEJ1aWxkIDogVGFzawotCXsKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGhyaWZ0LmV4ZSBjb21waWxlcgotCQkvLy8gPC9zdW1tYXJ5PgotCQlbUmVxdWlyZWRdCi0JCXB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0RXhlY3V0YWJsZQotCQl7Ci0JCQlnZXQ7Ci0JCQlzZXQ7Ci0JCX0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE1TQnVpbGQgVGFzayB0byBnZW5lcmF0ZSBjc2hhcnAgZnJvbSAudGhyaWZ0IGZpbGVzLCBhbmQgY29tcGlsZSB0aGUgY29kZSBpbnRvIGEgbGlicmFyeTogVGhyaWZ0SW1wbC5kbGwKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUaHJpZnRCdWlsZCA6IFRhc2sKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRocmlmdC5leGUgY29tcGlsZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW1JlcXVpcmVkXQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIFRocmlmdEV4ZWN1dGFibGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIGZ1bGwgcGF0aCB0byBhIHRocmlmdC5kbGwgQyMgbGlicmFyeQotCQkvLy8gPC9zdW1tYXJ5PgotCQlbUmVxdWlyZWRdCi0JCXB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0TGlicmFyeQotCQl7Ci0JCQlnZXQ7Ci0JCQlzZXQ7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bGwgcGF0aCB0byBhIHRocmlmdC5kbGwgQyMgbGlicmFyeQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbUmVxdWlyZWRdCisgICAgICAgIHB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0TGlicmFyeQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBBIGRpcmVjb3RyeSBjb250YWluaW5nIC50aHJpZnQgZmlsZXMKLQkJLy8vIDwvc3VtbWFyeT4KLQkJW1JlcXVpcmVkXQotCQlwdWJsaWMgSVRhc2tJdGVtIFRocmlmdERlZmluaXRpb25EaXIKLQkJewotCQkJZ2V0OwotCQkJc2V0OwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEEgZGlyZWNvdHJ5IGNvbnRhaW5pbmcgLnRocmlmdCBmaWxlcworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbUmVxdWlyZWRdCisgICAgICAgIHB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0RGVmaW5pdGlvbkRpcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgbmFtZSBvZiB0aGUgYXV0by1nZW4gYW5kIGNvbXBpbGVkIHRocmlmdCBsaWJyYXJ5LiBJdCB3aWxsIHBsYWNlZCBpbgotCQkvLy8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIFRocmlmdExpYnJhcnkKLQkJLy8vIDwvc3VtbWFyeT4KLQkJW1JlcXVpcmVkXQotCQlwdWJsaWMgSVRhc2tJdGVtIE91dHB1dE5hbWUKLQkJewotCQkJZ2V0OwotCQkJc2V0OwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBhdXRvLWdlbiBhbmQgY29tcGlsZWQgdGhyaWZ0IGxpYnJhcnkuIEl0IHdpbGwgcGxhY2VkIGluCisgICAgICAgIC8vLyB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgVGhyaWZ0TGlicmFyeQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbUmVxdWlyZWRdCisgICAgICAgIHB1YmxpYyBJVGFza0l0ZW0gT3V0cHV0TmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgZnVsbCBwYXRoIHRvIHRoZSBjb21waWxlZCBUaHJpZnRMaWJyYXJ5LiBUaGlzIGFsbG93cyBtc2J1aWxkIHRhc2tzIHRvIHVzZSB0aGlzCi0JCS8vLyBvdXRwdXQgYXMgYSB2YXJpYWJsZSBmb3IgdXNlIGVsc2V3aGVyZS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJW091dHB1dF0KLQkJcHVibGljIElUYXNrSXRlbSBUaHJpZnRJbXBsZW1lbnRhdGlvbgotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdGhyaWZ0SW1wbDsgfQotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdWxsIHBhdGggdG8gdGhlIGNvbXBpbGVkIFRocmlmdExpYnJhcnkuIFRoaXMgYWxsb3dzIG1zYnVpbGQgdGFza3MgdG8gdXNlIHRoaXMKKyAgICAgICAgLy8vIG91dHB1dCBhcyBhIHZhcmlhYmxlIGZvciB1c2UgZWxzZXdoZXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBbT3V0cHV0XQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIFRocmlmdEltcGxlbWVudGF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0aHJpZnRJbXBsOyB9CisgICAgICAgIH0KIAotCQlwcml2YXRlIElUYXNrSXRlbSB0aHJpZnRJbXBsOwotCQlwcml2YXRlIGNvbnN0IHN0cmluZyBsYXN0Q29tcGlsYXRpb25OYW1lID0gIkxBU1RfQ09NUF9USU1FU1RBTVAiOworICAgICAgICBwcml2YXRlIElUYXNrSXRlbSB0aHJpZnRJbXBsOworICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBsYXN0Q29tcGlsYXRpb25OYW1lID0gIkxBU1RfQ09NUF9USU1FU1RBTVAiOwogCi0JCS8vdXNlIHRoZSBNZXNzYWdlIEJ1aWxkIFRhc2sgdG8gd3JpdGUgc29tZXRoaW5nIHRvIGJ1aWxkIGxvZwotCQlwcml2YXRlIHZvaWQgTG9nTWVzc2FnZShzdHJpbmcgdGV4dCwgTWVzc2FnZUltcG9ydGFuY2UgaW1wb3J0YW5jZSkKLQkJewotCQkJTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKLQkJCW0uVGV4dCA9IHRleHQ7Ci0JCQltLkltcG9ydGFuY2UgPSBpbXBvcnRhbmNlLlRvU3RyaW5nKCk7Ci0JCQltLkJ1aWxkRW5naW5lID0gdGhpcy5CdWlsZEVuZ2luZTsKLQkJCW0uRXhlY3V0ZSgpOwotCQl9CisgICAgICAgIC8vdXNlIHRoZSBNZXNzYWdlIEJ1aWxkIFRhc2sgdG8gd3JpdGUgc29tZXRoaW5nIHRvIGJ1aWxkIGxvZworICAgICAgICBwcml2YXRlIHZvaWQgTG9nTWVzc2FnZShzdHJpbmcgdGV4dCwgTWVzc2FnZUltcG9ydGFuY2UgaW1wb3J0YW5jZSkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG0uVGV4dCA9IHRleHQ7CisgICAgICAgICAgICBtLkltcG9ydGFuY2UgPSBpbXBvcnRhbmNlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBtLkJ1aWxkRW5naW5lID0gdGhpcy5CdWlsZEVuZ2luZTsKKyAgICAgICAgICAgIG0uRXhlY3V0ZSgpOworICAgICAgICB9CiAKLQkJLy9yZWN1cnNpdmVseSBmaW5kIC5jcyBmaWxlcyBpbiBzcmNEaXIsIHBhdGhzIHNob3VsZCBpbml0aWFsbHkgYmUgbm9uLW51bGwgYW5kIGVtcHR5Ci0JCXByaXZhdGUgdm9pZCBGaW5kU291cmNlc0hlbHBlcihzdHJpbmcgc3JjRGlyLCBMaXN0PHN0cmluZz4gcGF0aHMpCi0JCXsKLQkJCXN0cmluZ1tdIGZpbGVzID0gRGlyZWN0b3J5LkdldEZpbGVzKHNyY0RpciwgIiouY3MiKTsKLQkJCWZvcmVhY2ggKHN0cmluZyBmIGluIGZpbGVzKQotCQkJewotCQkJCXBhdGhzLkFkZChmKTsKLQkJCX0KLQkJCXN0cmluZ1tdIGRpcnMgPSBEaXJlY3RvcnkuR2V0RGlyZWN0b3JpZXMoc3JjRGlyKTsKLQkJCWZvcmVhY2ggKHN0cmluZyBkaXIgaW4gZGlycykKLQkJCXsKLQkJCQlGaW5kU291cmNlc0hlbHBlcihkaXIsIHBhdGhzKTsKLQkJCX0KLQkJfQorICAgICAgICAvL3JlY3Vyc2l2ZWx5IGZpbmQgLmNzIGZpbGVzIGluIHNyY0RpciwgcGF0aHMgc2hvdWxkIGluaXRpYWxseSBiZSBub24tbnVsbCBhbmQgZW1wdHkKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEZpbmRTb3VyY2VzSGVscGVyKHN0cmluZyBzcmNEaXIsIExpc3Q8c3RyaW5nPiBwYXRocykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nW10gZmlsZXMgPSBEaXJlY3RvcnkuR2V0RmlsZXMoc3JjRGlyLCAiKi5jcyIpOworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGYgaW4gZmlsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF0aHMuQWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nW10gZGlycyA9IERpcmVjdG9yeS5HZXREaXJlY3RvcmllcyhzcmNEaXIpOworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGRpciBpbiBkaXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbmRTb3VyY2VzSGVscGVyKGRpciwgcGF0aHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUXVvdGUgcGF0aHMgd2l0aCBzcGFjZXMKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBzdHJpbmcgU2FmZVBhdGgoc3RyaW5nIHBhdGgpCi0JCXsKLQkJCWlmIChwYXRoLkNvbnRhaW5zKCcgJykgJiYgIXBhdGguU3RhcnRzV2l0aCgiXCIiKSkKLQkJCXsKLQkJCQlyZXR1cm4gIlwiIiArIHBhdGggKyAiXCIiOwotCQkJfQotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUXVvdGUgcGF0aHMgd2l0aCBzcGFjZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2FmZVBhdGgoc3RyaW5nIHBhdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXRoLkNvbnRhaW5zKCcgJykgJiYgIXBhdGguU3RhcnRzV2l0aCgiXCIiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlwiIiArIHBhdGggKyAiXCIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0KIAotCQlwcml2YXRlIElUYXNrSXRlbVtdIEZpbmRTb3VyY2VzKHN0cmluZyBzcmNEaXIpCi0JCXsKLQkJCUxpc3Q8c3RyaW5nPiBmaWxlcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKLQkJCUZpbmRTb3VyY2VzSGVscGVyKHNyY0RpciwgZmlsZXMpOwotCQkJSVRhc2tJdGVtW10gaXRlbXMgPSBuZXcgSVRhc2tJdGVtW2ZpbGVzLkNvdW50XTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuTGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJaXRlbXNbaV0gPSBuZXcgVGFza0l0ZW0oZmlsZXNbaV0pOwotCQkJfQotCQkJcmV0dXJuIGl0ZW1zOwotCQl9CisgICAgICAgIHByaXZhdGUgSVRhc2tJdGVtW10gRmluZFNvdXJjZXMoc3RyaW5nIHNyY0RpcikKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxzdHJpbmc+IGZpbGVzID0gbmV3IExpc3Q8c3RyaW5nPigpOworICAgICAgICAgICAgRmluZFNvdXJjZXNIZWxwZXIoc3JjRGlyLCBmaWxlcyk7CisgICAgICAgICAgICBJVGFza0l0ZW1bXSBpdGVtcyA9IG5ldyBJVGFza0l0ZW1bZmlsZXMuQ291bnRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVtc1tpXSA9IG5ldyBUYXNrSXRlbShmaWxlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaXRlbXM7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHN0cmluZyBMYXN0V3JpdGVUaW1lKHN0cmluZyBkZWZEaXIpCi0JCXsKLQkJCXN0cmluZ1tdIGZpbGVzID0gRGlyZWN0b3J5LkdldEZpbGVzKGRlZkRpciwgIioudGhyaWZ0Iik7Ci0JCQlEYXRlVGltZSBkID0gKG5ldyBEaXJlY3RvcnlJbmZvKGRlZkRpcikpLkxhc3RXcml0ZVRpbWU7Ci0JCQlmb3JlYWNoKHN0cmluZyBmaWxlIGluIGZpbGVzKQotCQkJewotCQkJCUZpbGVJbmZvIGYgPSBuZXcgRmlsZUluZm8oZmlsZSk7Ci0JCQkJRGF0ZVRpbWUgY3VyciA9IGYuTGFzdFdyaXRlVGltZTsKLQkJCQlpZiAoRGF0ZVRpbWUuQ29tcGFyZShjdXJyLCBkKSA+IDApCi0JCQkJewotCQkJCQlkID0gY3VycjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZC5Ub0ZpbGVUaW1lVXRjKCkuVG9TdHJpbmcoKTsKLQkJfQorICAgICAgICBwcml2YXRlIHN0cmluZyBMYXN0V3JpdGVUaW1lKHN0cmluZyBkZWZEaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ1tdIGZpbGVzID0gRGlyZWN0b3J5LkdldEZpbGVzKGRlZkRpciwgIioudGhyaWZ0Iik7CisgICAgICAgICAgICBEYXRlVGltZSBkID0gKG5ldyBEaXJlY3RvcnlJbmZvKGRlZkRpcikpLkxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICBmb3JlYWNoKHN0cmluZyBmaWxlIGluIGZpbGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGVJbmZvIGYgPSBuZXcgRmlsZUluZm8oZmlsZSk7CisgICAgICAgICAgICAgICAgRGF0ZVRpbWUgY3VyciA9IGYuTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgICAgICBpZiAoRGF0ZVRpbWUuQ29tcGFyZShjdXJyLCBkKSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkID0gY3VycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZC5Ub0ZpbGVUaW1lVXRjKCkuVG9TdHJpbmcoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIEV4ZWN1dGUoKQotCQl7Ci0JCQlzdHJpbmcgZGVmRGlyID0gU2FmZVBhdGgoVGhyaWZ0RGVmaW5pdGlvbkRpci5JdGVtU3BlYyk7Ci0JCQkvL2xvb2sgZm9yIGxhc3QgY29tcGlsYXRpb24gdGltZXN0YW1wCi0JCQlzdHJpbmcgbGFzdEJ1aWxkUGF0aCA9IFBhdGguQ29tYmluZShkZWZEaXIsIGxhc3RDb21waWxhdGlvbk5hbWUpOwotCQkJRGlyZWN0b3J5SW5mbyBkZWZEaXJJbmZvID0gbmV3IERpcmVjdG9yeUluZm8oZGVmRGlyKTsKLQkJCXN0cmluZyBsYXN0V3JpdGUgPSBMYXN0V3JpdGVUaW1lKGRlZkRpcik7Ci0JCQlpZiAoRmlsZS5FeGlzdHMobGFzdEJ1aWxkUGF0aCkpCi0JCQl7Ci0JCQkJc3RyaW5nIGxhc3RDb21wID0gRmlsZS5SZWFkQWxsVGV4dChsYXN0QnVpbGRQYXRoKTsKLQkJCQkvL2Rvbid0IHJlY29tcGlsZSBpZiB0aGUgdGhyaWZ0IGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSBsYXN0Q29tcAotCQkJCUZpbGVJbmZvIGYgPSBuZXcgRmlsZUluZm8oVGhyaWZ0TGlicmFyeS5JdGVtU3BlYyk7Ci0JCQkJc3RyaW5nIHRocmlmdExpYlRpbWUgPSBmLkxhc3RXcml0ZVRpbWVVdGMuVG9GaWxlVGltZVV0YygpLlRvU3RyaW5nKCk7Ci0JCQkJaWYgKGxhc3RDb21wLkNvbXBhcmVUbyh0aHJpZnRMaWJUaW1lKSA8IDApCi0JCQkJewotCQkJCQkvL25ldyB0aHJpZnQgbGlicmFyeSwgZG8gYSBjb21waWxlCi0JCQkJCWxhc3RXcml0ZSA9IHRocmlmdExpYlRpbWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGxhc3RDb21wID09IGxhc3RXcml0ZSB8fCAobGFzdENvbXAgPT0gdGhyaWZ0TGliVGltZSAmJiBsYXN0Q29tcC5Db21wYXJlVG8obGFzdFdyaXRlKSA+IDApKQotCQkJCXsKLQkJCQkJLy90aGUgLnRocmlmdCBkaXIgaGFzbid0IGJlZW4gd3JpdHRlbiB0byBzaW5jZSBsYXN0IGNvbXBpbGF0aW9uLCBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nCi0JCQkJCUxvZ01lc3NhZ2UoIlRocmlmdEltcGwgdXAtdG8tZGF0ZSIsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEV4ZWN1dGUoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgZGVmRGlyID0gU2FmZVBhdGgoVGhyaWZ0RGVmaW5pdGlvbkRpci5JdGVtU3BlYyk7CisgICAgICAgICAgICAvL2xvb2sgZm9yIGxhc3QgY29tcGlsYXRpb24gdGltZXN0YW1wCisgICAgICAgICAgICBzdHJpbmcgbGFzdEJ1aWxkUGF0aCA9IFBhdGguQ29tYmluZShkZWZEaXIsIGxhc3RDb21waWxhdGlvbk5hbWUpOworICAgICAgICAgICAgRGlyZWN0b3J5SW5mbyBkZWZEaXJJbmZvID0gbmV3IERpcmVjdG9yeUluZm8oZGVmRGlyKTsKKyAgICAgICAgICAgIHN0cmluZyBsYXN0V3JpdGUgPSBMYXN0V3JpdGVUaW1lKGRlZkRpcik7CisgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHMobGFzdEJ1aWxkUGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGxhc3RDb21wID0gRmlsZS5SZWFkQWxsVGV4dChsYXN0QnVpbGRQYXRoKTsKKyAgICAgICAgICAgICAgICAvL2Rvbid0IHJlY29tcGlsZSBpZiB0aGUgdGhyaWZ0IGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSBsYXN0Q29tcAorICAgICAgICAgICAgICAgIEZpbGVJbmZvIGYgPSBuZXcgRmlsZUluZm8oVGhyaWZ0TGlicmFyeS5JdGVtU3BlYyk7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRocmlmdExpYlRpbWUgPSBmLkxhc3RXcml0ZVRpbWVVdGMuVG9GaWxlVGltZVV0YygpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RDb21wLkNvbXBhcmVUbyh0aHJpZnRMaWJUaW1lKSA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL25ldyB0aHJpZnQgbGlicmFyeSwgZG8gYSBjb21waWxlCisgICAgICAgICAgICAgICAgICAgIGxhc3RXcml0ZSA9IHRocmlmdExpYlRpbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxhc3RDb21wID09IGxhc3RXcml0ZSB8fCAobGFzdENvbXAgPT0gdGhyaWZ0TGliVGltZSAmJiBsYXN0Q29tcC5Db21wYXJlVG8obGFzdFdyaXRlKSA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy90aGUgLnRocmlmdCBkaXIgaGFzbid0IGJlZW4gd3JpdHRlbiB0byBzaW5jZSBsYXN0IGNvbXBpbGF0aW9uLCBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nCisgICAgICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UoIlRocmlmdEltcGwgdXAtdG8tZGF0ZSIsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCS8vZmluZCB0aGUgZGlyZWN0b3J5IG9mIHRoZSB0aHJpZnRsaWJyYXJ5ICh0aGF0J3Mgd2hlcmUgb3V0cHV0IHdpbGwgZ28pCi0JCQlGaWxlSW5mbyB0aHJpZnRMaWJJbmZvID0gbmV3IEZpbGVJbmZvKFNhZmVQYXRoKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpKTsKLQkJCXN0cmluZyB0aHJpZnREaXIgPSB0aHJpZnRMaWJJbmZvLkRpcmVjdG9yeS5GdWxsTmFtZTsKKyAgICAgICAgICAgIC8vZmluZCB0aGUgZGlyZWN0b3J5IG9mIHRoZSB0aHJpZnRsaWJyYXJ5ICh0aGF0J3Mgd2hlcmUgb3V0cHV0IHdpbGwgZ28pCisgICAgICAgICAgICBGaWxlSW5mbyB0aHJpZnRMaWJJbmZvID0gbmV3IEZpbGVJbmZvKFNhZmVQYXRoKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpKTsKKyAgICAgICAgICAgIHN0cmluZyB0aHJpZnREaXIgPSB0aHJpZnRMaWJJbmZvLkRpcmVjdG9yeS5GdWxsTmFtZTsKIAotCQkJc3RyaW5nIGdlbkRpciA9IFBhdGguQ29tYmluZSh0aHJpZnREaXIsICJnZW4tY3NoYXJwIik7Ci0JCQlpZiAoRGlyZWN0b3J5LkV4aXN0cyhnZW5EaXIpKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJRGlyZWN0b3J5LkRlbGV0ZShnZW5EaXIsIHRydWUpOwotCQkJCX0KLQkJCQljYXRjaCB7IC8qZWggaSB0cmllZCwganVzdCBvdmVyLXdyaXRlIG5vdyovfQotCQkJfQorICAgICAgICAgICAgc3RyaW5nIGdlbkRpciA9IFBhdGguQ29tYmluZSh0aHJpZnREaXIsICJnZW4tY3NoYXJwIik7CisgICAgICAgICAgICBpZiAoRGlyZWN0b3J5LkV4aXN0cyhnZW5EaXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5LkRlbGV0ZShnZW5EaXIsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCB7IC8qZWggaSB0cmllZCwganVzdCBvdmVyLXdyaXRlIG5vdyovfQorICAgICAgICAgICAgfQogCi0JCQkvL3J1biB0aGUgdGhyaWZ0IGV4ZWN1dGFibGUgdG8gZ2VuZXJhdGUgQyMKLQkJCWZvcmVhY2ggKHN0cmluZyB0aHJpZnRGaWxlIGluIERpcmVjdG9yeS5HZXRGaWxlcyhkZWZEaXIsICIqLnRocmlmdCIpKQotCQkJewotCQkJCUxvZ01lc3NhZ2UoIkdlbmVyYXRpbmcgY29kZSBmb3I6ICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5Ob3JtYWwpOwotCQkJCVByb2Nlc3MgcCA9IG5ldyBQcm9jZXNzKCk7Ci0JCQkJcC5TdGFydEluZm8uRmlsZU5hbWUgPSBTYWZlUGF0aChUaHJpZnRFeGVjdXRhYmxlLkl0ZW1TcGVjKTsKLQkJCQlwLlN0YXJ0SW5mby5Bcmd1bWVudHMgPSAiLS1nZW4gY3NoYXJwIC1vICIgKyBTYWZlUGF0aCh0aHJpZnREaXIpICsgIiAtciAiICsgdGhyaWZ0RmlsZTsKLQkJCQlwLlN0YXJ0SW5mby5Vc2VTaGVsbEV4ZWN1dGUgPSBmYWxzZTsKLQkJCQlwLlN0YXJ0SW5mby5DcmVhdGVOb1dpbmRvdyA9IHRydWU7Ci0JCQkJcC5TdGFydEluZm8uUmVkaXJlY3RTdGFuZGFyZE91dHB1dCA9IGZhbHNlOwotCQkJCXAuU3RhcnQoKTsKLQkJCQlwLldhaXRGb3JFeGl0KCk7Ci0JCQkJaWYgKHAuRXhpdENvZGUgIT0gMCkKLQkJCQl7Ci0JCQkJCUxvZ01lc3NhZ2UoInRocmlmdC5leGUgZmFpbGVkIHRvIGNvbXBpbGUgIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChwLkV4aXRDb2RlICE9IDApCi0JCQkJewotCQkJCQlMb2dNZXNzYWdlKCJ0aHJpZnQuZXhlIGZhaWxlZCB0byBjb21waWxlICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIC8vcnVuIHRoZSB0aHJpZnQgZXhlY3V0YWJsZSB0byBnZW5lcmF0ZSBDIworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHRocmlmdEZpbGUgaW4gRGlyZWN0b3J5LkdldEZpbGVzKGRlZkRpciwgIioudGhyaWZ0IikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSgiR2VuZXJhdGluZyBjb2RlIGZvcjogIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLk5vcm1hbCk7CisgICAgICAgICAgICAgICAgUHJvY2VzcyBwID0gbmV3IFByb2Nlc3MoKTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5GaWxlTmFtZSA9IFNhZmVQYXRoKFRocmlmdEV4ZWN1dGFibGUuSXRlbVNwZWMpOworICAgICAgICAgICAgICAgIHAuU3RhcnRJbmZvLkFyZ3VtZW50cyA9ICItLWdlbiBjc2hhcnAgLW8gIiArIFNhZmVQYXRoKHRocmlmdERpcikgKyAiIC1yICIgKyB0aHJpZnRGaWxlOworICAgICAgICAgICAgICAgIHAuU3RhcnRJbmZvLlVzZVNoZWxsRXhlY3V0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHAuU3RhcnRJbmZvLkNyZWF0ZU5vV2luZG93ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcC5TdGFydCgpOworICAgICAgICAgICAgICAgIHAuV2FpdEZvckV4aXQoKTsKKyAgICAgICAgICAgICAgICBpZiAocC5FeGl0Q29kZSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSgidGhyaWZ0LmV4ZSBmYWlsZWQgdG8gY29tcGlsZSAiICsgdGhyaWZ0RmlsZSwgTWVzc2FnZUltcG9ydGFuY2UuSGlnaCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHAuRXhpdENvZGUgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UoInRocmlmdC5leGUgZmFpbGVkIHRvIGNvbXBpbGUgIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlDc2MgY3NjID0gbmV3IENzYygpOwotCQkJY3NjLlRhcmdldFR5cGUgPSAibGlicmFyeSI7Ci0JCQljc2MuUmVmZXJlbmNlcyA9IG5ldyBJVGFza0l0ZW1bXSB7IG5ldyBUYXNrSXRlbShUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKSB9OwotCQkJY3NjLkVtaXREZWJ1Z0luZm9ybWF0aW9uID0gdHJ1ZTsKLQkJCXN0cmluZyBvdXRwdXRQYXRoID0gUGF0aC5Db21iaW5lKHRocmlmdERpciwgT3V0cHV0TmFtZS5JdGVtU3BlYyk7Ci0JCQljc2MuT3V0cHV0QXNzZW1ibHkgPSBuZXcgVGFza0l0ZW0ob3V0cHV0UGF0aCk7Ci0JCQljc2MuU291cmNlcyA9IEZpbmRTb3VyY2VzKFBhdGguQ29tYmluZSh0aHJpZnREaXIsICJnZW4tY3NoYXJwIikpOwotCQkJY3NjLkJ1aWxkRW5naW5lID0gdGhpcy5CdWlsZEVuZ2luZTsKLQkJCUxvZ01lc3NhZ2UoIkNvbXBpbGluZyBnZW5lcmF0ZWQgY3MuLi4iLCBNZXNzYWdlSW1wb3J0YW5jZS5Ob3JtYWwpOwotCQkJaWYgKCFjc2MuRXhlY3V0ZSgpKQotCQkJewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KKyAgICAgICAgICAgIENzYyBjc2MgPSBuZXcgQ3NjKCk7CisgICAgICAgICAgICBjc2MuVGFyZ2V0VHlwZSA9ICJsaWJyYXJ5IjsKKyAgICAgICAgICAgIGNzYy5SZWZlcmVuY2VzID0gbmV3IElUYXNrSXRlbVtdIHsgbmV3IFRhc2tJdGVtKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpIH07CisgICAgICAgICAgICBjc2MuRW1pdERlYnVnSW5mb3JtYXRpb24gPSB0cnVlOworICAgICAgICAgICAgc3RyaW5nIG91dHB1dFBhdGggPSBQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCBPdXRwdXROYW1lLkl0ZW1TcGVjKTsKKyAgICAgICAgICAgIGNzYy5PdXRwdXRBc3NlbWJseSA9IG5ldyBUYXNrSXRlbShvdXRwdXRQYXRoKTsKKyAgICAgICAgICAgIGNzYy5Tb3VyY2VzID0gRmluZFNvdXJjZXMoUGF0aC5Db21iaW5lKHRocmlmdERpciwgImdlbi1jc2hhcnAiKSk7CisgICAgICAgICAgICBjc2MuQnVpbGRFbmdpbmUgPSB0aGlzLkJ1aWxkRW5naW5lOworICAgICAgICAgICAgTG9nTWVzc2FnZSgiQ29tcGlsaW5nIGdlbmVyYXRlZCBjcy4uLiIsIE1lc3NhZ2VJbXBvcnRhbmNlLk5vcm1hbCk7CisgICAgICAgICAgICBpZiAoIWNzYy5FeGVjdXRlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogCi0JCQkvL3dyaXRlIGZpbGUgdG8gZGVmRGlyIHRvIGluZGljYXRlIGEgYnVpbGQgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQKLQkJCUZpbGUuV3JpdGVBbGxUZXh0KGxhc3RCdWlsZFBhdGgsIGxhc3RXcml0ZSk7CisgICAgICAgICAgICAvL3dyaXRlIGZpbGUgdG8gZGVmRGlyIHRvIGluZGljYXRlIGEgYnVpbGQgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQKKyAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxUZXh0KGxhc3RCdWlsZFBhdGgsIGxhc3RXcml0ZSk7CiAKLQkJCXRocmlmdEltcGwgPSBuZXcgVGFza0l0ZW0ob3V0cHV0UGF0aCk7CisgICAgICAgICAgICB0aHJpZnRJbXBsID0gbmV3IFRhc2tJdGVtKG91dHB1dFBhdGgpOwogCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2ogYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagppbmRleCAxNWNjYjdmLi5hMzE5ZGYyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagorKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagpAQCAtMSw0ICsxLDUgQEAKLe+7vzwhLS0gCivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQogICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNiw4ICsxNyw3IEBACiAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgogICA8UHJvcGVydHlHcm91cD4KICAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KICAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CkBAIC0zMCw2ICszMCwyNSBAQAogICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0TVNCdWlsZFRhc2s8L0Fzc2VtYmx5TmFtZT4KICAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgogICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CiAgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CkBAIC0zOSw2ICs1OCw3IEBACiAgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KICAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KQEAgLTQ3LDYgKzY3LDcgQEAKICAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CiAgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkJ1aWxkLkZyYW1ld29yayIgLz4KQEAgLTY5LDYgKzkwLDIzIEBACiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVGhyaWZ0QnVpbGQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CiAgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgogICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgogICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgogICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9jc2hhcnAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg3MTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNiBAQAorIyMgQyMgQ29kaW5nIFN0YW5kYXJkcworCitQbGVhc2UgZm9sbG93OgorICogW1RocmlmdCBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyAqIFtNU0ROIEMjIENvZGluZyBDb252ZW50aW9uc10oaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2ZmOTI2MDc0LmFzcHgpCisgKiBbQyMgQ29kaW5nIEd1aWRlbGluZXNdKGh0dHA6Ly9jc2hhcnBndWlkZWxpbmVzLmNvZGVwbGV4LmNvbS8pCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MgYi9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhZmI2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwpAQCAtMCwwICsxLDk0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgVGhyaWZ0LkNvbGxlY3Rpb25zCit7CisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9ucworICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIHZhbHVlLXdpc2UgdGhlIHNhbWUuCisgICAgICAgIC8vLyBJZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9ucyB3aWxsIGJlIGNvbXBhcmVkIHVzaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXF1YWxzIChJRW51bWVyYWJsZSBmaXJzdCwgSUVudW1lcmFibGUgc2Vjb25kKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCAmJiBzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsIHx8IHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElFbnVtZXJhdG9yIGZpdGVyID0gZmlyc3QuR2V0RW51bWVyYXRvciAoKTsKKyAgICAgICAgICAgIElFbnVtZXJhdG9yIHNpdGVyID0gc2Vjb25kLkdldEVudW1lcmF0b3IgKCk7CisKKyAgICAgICAgICAgIGJvb2wgZm5leHQgPSBmaXRlci5Nb3ZlTmV4dCAoKTsKKyAgICAgICAgICAgIGJvb2wgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCAoKTsKKyAgICAgICAgICAgIHdoaWxlIChmbmV4dCAmJiBzbmV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZSBmZW51bSA9IGZpdGVyLkN1cnJlbnQgYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgc2VudW0gPSBzaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIGlmIChmZW51bSAhPSBudWxsICYmIHNlbnVtICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUVxdWFscyhmZW51bSwgc2VudW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmVudW0gPT0gbnVsbCBeIHNlbnVtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFFcXVhbHMoZml0ZXIuQ3VycmVudCwgc2l0ZXIuQ3VycmVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZuZXh0ID0gZml0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbmV4dCA9PSBzbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgcmV0dXJucyBhIGhhc2hjb2RlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgZW51bWVyYWJsZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgR2V0SGFzaENvZGUgKElFbnVtZXJhYmxlIGVudW1lcmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbnVtZXJhYmxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBoYXNoY29kZSA9IDA7CisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3Qgb2JqIGluIGVudW1lcmFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgZW51bTIgPSBvYmogYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgaW50IG9iakhhc2ggPSBlbnVtMiA9PSBudWxsID8gb2JqLkdldEhhc2hDb2RlICgpIDogR2V0SGFzaENvZGUgKGVudW0yKTsKKyAgICAgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhc2hjb2RlID0gKGhhc2hjb2RlICogMzk3KSBeIChvYmpIYXNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaGFzaGNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCmluZGV4IGE5OTU3NjkuLmUyOTI3MWEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCkBAIC0yMSwxMjIgKzIxLDE0MCBAQAogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiAKKyNpZiBTSUxWRVJMSUdIVAordXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjsKKyNlbmRpZgorCiBuYW1lc3BhY2UgVGhyaWZ0LkNvbGxlY3Rpb25zCiB7Ci0JcHVibGljIGNsYXNzIFRIYXNoU2V0PFQ+IDogSUNvbGxlY3Rpb248VD4KLQl7Ci0jaWYgTkVUXzJfMAotCQlURGljdFNldDxUPiBzZXQgPSBuZXcgVERpY3RTZXQ8VD4oKTsKKyNpZiBTSUxWRVJMSUdIVAorICAgIFtEYXRhQ29udHJhY3RdCiAjZWxzZQotCQlIYXNoU2V0PFQ+IHNldCA9IG5ldyBIYXNoU2V0PFQ+KCk7CisgICAgW1NlcmlhbGl6YWJsZV0KICNlbmRpZgotCQlwdWJsaWMgaW50IENvdW50Ci0JCXsKLQkJCWdldCB7IHJldHVybiBzZXQuQ291bnQ7IH0KLQkJfQotCi0JCXB1YmxpYyBib29sIElzUmVhZE9ubHkKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGZhbHNlOyB9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBBZGQoVCBpdGVtKQotCQl7Ci0JCQlzZXQuQWRkKGl0ZW0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgQ2xlYXIoKQotCQl7Ci0JCQlzZXQuQ2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sIENvbnRhaW5zKFQgaXRlbSkKLQkJewotCQkJcmV0dXJuIHNldC5Db250YWlucyhpdGVtKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIENvcHlUbyhUW10gYXJyYXksIGludCBhcnJheUluZGV4KQotCQl7Ci0JCQlzZXQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKLQkJewotCQkJcmV0dXJuIHNldC5HZXRFbnVtZXJhdG9yKCk7Ci0JCX0KLQotCQlJRW51bWVyYXRvcjxUPiBJRW51bWVyYWJsZTxUPi5HZXRFbnVtZXJhdG9yKCkKLQkJewotCQkJcmV0dXJuICgoSUVudW1lcmFibGU8VD4pc2V0KS5HZXRFbnVtZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQotCQl7Ci0JCQlyZXR1cm4gc2V0LlJlbW92ZShpdGVtKTsKLQkJfQotCi0jaWYgTkVUXzJfMAotCQlwcml2YXRlIGNsYXNzIFREaWN0U2V0PFY+IDogSUNvbGxlY3Rpb248Vj4KLQkJewotCQkJRGljdGlvbmFyeTxWLCBURGljdFNldDxWPj4gZGljdCA9IG5ldyBEaWN0aW9uYXJ5PFYsIFREaWN0U2V0PFY+PigpOwotCi0JCQlwdWJsaWMgaW50IENvdW50Ci0JCQl7Ci0JCQkJZ2V0IHsgcmV0dXJuIGRpY3QuQ291bnQ7IH0KLQkJCX0KLQotCQkJcHVibGljIGJvb2wgSXNSZWFkT25seQotCQkJewotCQkJCWdldCB7IHJldHVybiBmYWxzZTsgfQotCQkJfQotCi0JCQlwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCi0JCQl7Ci0JCQkJcmV0dXJuICgoSUVudW1lcmFibGUpZGljdC5LZXlzKS5HZXRFbnVtZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCUlFbnVtZXJhdG9yPFY+IElFbnVtZXJhYmxlPFY+LkdldEVudW1lcmF0b3IoKQotCQkJewotCQkJCXJldHVybiBkaWN0LktleXMuR2V0RW51bWVyYXRvcigpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbCBBZGQoViBpdGVtKQotCQkJewotCQkJCWlmICghZGljdC5Db250YWluc0tleShpdGVtKSkKLQkJCQl7Ci0JCQkJCWRpY3RbaXRlbV0gPSB0aGlzOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXZvaWQgSUNvbGxlY3Rpb248Vj4uQWRkKFYgaXRlbSkKLQkJCXsKLQkJCQlBZGQoaXRlbSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIENsZWFyKCkKLQkJCXsKLQkJCQlkaWN0LkNsZWFyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sIENvbnRhaW5zKFYgaXRlbSkKLQkJCXsKLQkJCQlyZXR1cm4gZGljdC5Db250YWluc0tleShpdGVtKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgQ29weVRvKFZbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCi0JCQl7Ci0JCQkJZGljdC5LZXlzLkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sIFJlbW92ZShWIGl0ZW0pCi0JCQl7Ci0JCQkJcmV0dXJuIGRpY3QuUmVtb3ZlKGl0ZW0pOwotCQkJfQotCQl9CisgICAgcHVibGljIGNsYXNzIFRIYXNoU2V0PFQ+IDogSUNvbGxlY3Rpb248VD4KKyAgICB7CisjaWYgTkVUXzJfMCB8fCBTSUxWRVJMSUdIVAorI2lmIFNJTFZFUkxJR0hUCisgICAgICAgIFtEYXRhTWVtYmVyXQogI2VuZGlmCi0JfQorICAgICAgICBURGljdFNldDxUPiBzZXQgPSBuZXcgVERpY3RTZXQ8VD4oKTsKKyNlbHNlCisgICAgICAgIEhhc2hTZXQ8VD4gc2V0ID0gbmV3IEhhc2hTZXQ8VD4oKTsKKyNlbmRpZgorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBzZXQuQ291bnQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBBZGQoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQuQWRkKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNldC5Db250YWlucyhpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyhUW10gYXJyYXksIGludCBhcnJheUluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBzZXQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNldC5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBJRW51bWVyYXRvcjxUPiBJRW51bWVyYWJsZTxUPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgoSUVudW1lcmFibGU8VD4pc2V0KS5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2V0LlJlbW92ZShpdGVtKTsKKyAgICAgICAgfQorCisjaWYgTkVUXzJfMCB8fCBTSUxWRVJMSUdIVAorI2lmIFNJTFZFUkxJR0hUCisgICAgICAgIFtEYXRhQ29udHJhY3RdCisjZW5kaWYKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBURGljdFNldDxWPiA6IElDb2xsZWN0aW9uPFY+CisgICAgICAgIHsKKyNpZiBTSUxWRVJMSUdIVAorICAgICAgICAgICAgW0RhdGFNZW1iZXJdCisjZW5kaWYKKyAgICAgICAgICAgIERpY3Rpb25hcnk8ViwgVERpY3RTZXQ8Vj4+IGRpY3QgPSBuZXcgRGljdGlvbmFyeTxWLCBURGljdFNldDxWPj4oKTsKKworICAgICAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBkaWN0LkNvdW50OyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlKWRpY3QuS2V5cykuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJRW51bWVyYXRvcjxWPiBJRW51bWVyYWJsZTxWPi5HZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdC5LZXlzLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgQWRkKFYgaXRlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRpY3QuQ29udGFpbnNLZXkoaXRlbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaWN0W2l0ZW1dID0gdGhpczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIElDb2xsZWN0aW9uPFY+LkFkZChWIGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkKGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGljdC5DbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhWIGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpY3QuQ29udGFpbnNLZXkoaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyhWW10gYXJyYXksIGludCBhcnJheUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpY3QuS2V5cy5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoViBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkaWN0LlJlbW92ZShpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MgYi9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhNDIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcwpAQCAtMCwwICsxLDMxIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKKyNpZiAoIU5FVDQ1KQorbmFtZXNwYWNlIFRocmlmdAoreworICAgIHN0YXRpYyBjbGFzcyBTdHJlYW1FeHRlbnNpb25zTmV0MzUKKyAgICB7CisgICAgICAgIC8vIENvcHlUbygpIGhhcyBiZWVuIGFkZGVkIGluIDQuMAorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgQ29weVRvKHRoaXMgU3RyZWFtIHNvdXJjZSwgU3RyZWFtIHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOyAgLy8gbXVsdGlwbGUgb2YgNDA5NgorICAgICAgICAgICAgbG9uZyBuVG90YWwgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5SZWFkID0gc291cmNlLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoblJlYWQgPD0gMCkgIC8vIGRvbmU/CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuVG90YWw7CisKKyAgICAgICAgICAgICAgICB0YXJnZXQuV3JpdGUoYnVmZmVyLCAwLCBuUmVhZCk7CisgICAgICAgICAgICAgICAgblRvdGFsICs9IG5SZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTg2NzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NSBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQyMgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisvL0BUT0RPIHdoZXJlIHRvIHB1dCBMaWNlbnNlIGluZm9ybWF0aW9uPworCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCJkZjNmOGVmMC1lMGEzLTRjODYtYTY1Yi04ZWM4NGUwMTZiMWQiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTYxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzCkBAIC0wLDAgKzEsMjkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIFdyaXRlKFRQcm90b2NvbCB0UHJvdG9jb2wpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MKaW5kZXggMTk2OWJiMy4uNDExZTRkOSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MKQEAgLTE5LDE2ICsxOSwxMSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGludGVyZmFjZSBUQmFzZQotCXsKLQkJLy8vCi0JCS8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KLQkJLy8vCi0JCXZvaWQgUmVhZChUUHJvdG9jb2wgdFByb3RvY29sKTsKLQotCQkvLy8KLQkJLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sCi0JCS8vLwotCQl2b2lkIFdyaXRlKFRQcm90b2NvbCB0UHJvdG9jb2wpOwotCX0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRCYXNlIDogVEFic3RyYWN0QmFzZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgUmVhZChUUHJvdG9jb2wgdFByb3RvY29sKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZTY0VXRpbHMuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZTY0VXRpbHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhYWViZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlNjRVdGlscy5jcwpAQCAtMCwwICsxLDEwMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCit7CisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIFRCYXNlNjRVdGlscworICAgIHsKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVOQ09ERV9UQUJMRSA9CisgICAgICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgZW5jb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpRU5DT0RFX1RBQkxFWyhzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0ZdOworICAgICAgICAgICAgaWYgKGxlbiA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQykgfCAoKHNyY1tzcmNPZmYgKyAyXSA+PiA2KSAmIDB4MDMpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgM10gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdICYgMHgzRl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbCisgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0NdOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IC8vIGxlbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFWyhzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gREVDT0RFX1RBQkxFID0geworICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDYyLC0xLC0xLC0xLDYzLAorICAgICAgICAgICAgNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKKyAgICAgICAgICAgIDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsCisgICAgICAgICAgICA0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgIH07CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgZGVjb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKQorICAgICAgICAgICAgICAgICgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwKKyAgICAgICAgICAgICAgICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA+PiA0KSk7CisgICAgICAgICAgICBpZiAobGVuID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA8PCA0KSAmIDB4RjApIHwKKyAgICAgICAgICAgICAgICAgICAgKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPj4gMikpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0gKGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdIDw8IDYpICYgMHhDMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAzXSAmIDB4MEZGXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKaW5kZXggNGIzOTgwZS4uYTRmYWE5NCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwpAQCAtMjcsMzcwICsyNywzNjkgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgOiBUUHJvdG9jb2wKLQl7Ci0JCXByb3RlY3RlZCBjb25zdCB1aW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7Ci0JCXByb3RlY3RlZCBjb25zdCB1aW50IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisgICAgcHVibGljIGNsYXNzIFRCaW5hcnlQcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHVpbnQgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHVpbnQgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKIAotCQlwcm90ZWN0ZWQgYm9vbCBzdHJpY3RSZWFkXyA9IGZhbHNlOwotCQlwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOwogCi0JCXByb3RlY3RlZCBpbnQgcmVhZExlbmd0aF87Ci0JCXByb3RlY3RlZCBib29sIGNoZWNrUmVhZExlbmd0aF8gPSBmYWxzZTsKKyAgICAgICAgI3JlZ2lvbiBCaW5hcnlQcm90b2NvbCBGYWN0b3J5CiAKKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOwogCi0JCSNyZWdpb24gQmluYXJ5UHJvdG9jb2wgRmFjdG9yeQotCQkgLyoqCi0JCSAgKiBGYWN0b3J5Ci0JCSAgKi8KLQkJICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoKQorICAgICAgICAgICAgICAgIDogdGhpcyhmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KIAotCQkJICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RSZWFkXyA9IGZhbHNlOwotCQkJICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgICAgIH0KIAotCQkJICBwdWJsaWMgRmFjdG9yeSgpCi0JCQkJICA6dGhpcyhmYWxzZSwgdHJ1ZSkKLQkJCSAgewotCQkJICB9CisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCSAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQotCQkJICB7Ci0JCQkJICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7Ci0JCQkJICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKLQkJCSAgfQorICAgICAgICAjZW5kcmVnaW9uCiAKLQkJCXB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotCQkJICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7Ci0JCQl9Ci0JCSAgfQorICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IHRoaXModHJhbnMsIGZhbHNlLCB0cnVlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkjZW5kcmVnaW9uCisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKLQkJCTogdGhpcyh0cmFucywgZmFsc2UsIHRydWUpCi0JCXsKLQkJfQorICAgICAgICAjcmVnaW9uIFdyaXRlIE1ldGhvZHMKIAotCQlwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKLQkJCTpiYXNlKHRyYW5zKQotCQl7Ci0JCQlzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7Ci0JCQlzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyaWN0V3JpdGVfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8ICh1aW50KShtZXNzYWdlLlR5cGUpOworICAgICAgICAgICAgICAgIFdyaXRlSTMyKChpbnQpdmVyc2lvbik7CisgICAgICAgICAgICAgICAgV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgICAgICAgICBXcml0ZUkzMihtZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpbWVzc2FnZS5UeXBlKTsKKyAgICAgICAgICAgICAgICBXcml0ZUkzMihtZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCSNyZWdpb24gV3JpdGUgTWV0aG9kcworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKQotCQl7Ci0JCQlpZiAoc3RyaWN0V3JpdGVfKQotCQkJewotCQkJCXVpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8ICh1aW50KShtZXNzYWdlLlR5cGUpOwotCQkJCVdyaXRlSTMyKChpbnQpdmVyc2lvbik7Ci0JCQkJV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKLQkJCQlXcml0ZUkzMihtZXNzYWdlLlNlcUlEKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOwotCQkJCVdyaXRlQnl0ZSgoYnl0ZSltZXNzYWdlLlR5cGUpOwotCQkJCVdyaXRlSTMyKG1lc3NhZ2UuU2VxSUQpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1YykKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSlmaWVsZC5UeXBlKTsKKyAgICAgICAgICAgIFdyaXRlSTE2KGZpZWxkLklEKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpZmllbGQuVHlwZSk7Ci0JCQlXcml0ZUkxNihmaWVsZC5JRCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKVRUeXBlLlN0b3ApOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKW1hcC5LZXlUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpbWFwLlZhbHVlVHlwZSk7CisgICAgICAgICAgICBXcml0ZUkzMihtYXAuQ291bnQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpVFR5cGUuU3RvcCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpbWFwLktleVR5cGUpOwotCQkJV3JpdGVCeXRlKChieXRlKW1hcC5WYWx1ZVR5cGUpOwotCQkJV3JpdGVJMzIobWFwLkNvdW50KTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKWxpc3QuRWxlbWVudFR5cGUpOworICAgICAgICAgICAgV3JpdGVJMzIobGlzdC5Db3VudCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpbGlzdC5FbGVtZW50VHlwZSk7Ci0JCQlXcml0ZUkzMihsaXN0LkNvdW50KTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKXNldC5FbGVtZW50VHlwZSk7CisgICAgICAgICAgICBXcml0ZUkzMihzZXQuQ291bnQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0RW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCkKLQkJewotCQkJV3JpdGVCeXRlKChieXRlKXNldC5FbGVtZW50VHlwZSk7Ci0JCQlXcml0ZUkzMihzZXQuQ291bnQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQm9vbChib29sIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZShiID8gKHNieXRlKTEgOiAoc2J5dGUpMCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBib3V0ID0gbmV3IGJ5dGVbMV07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBib3V0WzBdID0gKGJ5dGUpYjsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGJvdXQsIDAsIDEpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKLQkJewotCQkJV3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTE2b3V0ID0gbmV3IGJ5dGVbMl07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkxNm91dFswXSA9IChieXRlKSgweGZmICYgKHMgPj4gOCkpOworICAgICAgICAgICAgaTE2b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiBzKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGkxNm91dCwgMCwgMik7CisgICAgICAgIH0KIAotCQlwcml2YXRlIGJ5dGVbXSBib3V0ID0gbmV3IGJ5dGVbMV07Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShieXRlIGIpCi0JCXsKLQkJCWJvdXRbMF0gPSBiOwotCQkJdHJhbnMuV3JpdGUoYm91dCwgMCwgMSk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTMyb3V0ID0gbmV3IGJ5dGVbNF07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTMyKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkzMm91dFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOworICAgICAgICAgICAgaTMyb3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDE2KSk7CisgICAgICAgICAgICBpMzJvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gOCkpOworICAgICAgICAgICAgaTMyb3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiBpMzIpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTMyb3V0LCAwLCA0KTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGkxNm91dCA9IG5ldyBieXRlWzJdOwotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBzKQotCQl7Ci0JCQlpMTZvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChzID4+IDgpKTsKLQkJCWkxNm91dFsxXSA9IChieXRlKSgweGZmICYgcyk7Ci0JCQl0cmFucy5Xcml0ZShpMTZvdXQsIDAsIDIpOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGk2NG91dCA9IG5ldyBieXRlWzhdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkKKyAgICAgICAgeworICAgICAgICAgICAgaTY0b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDU2KSk7CisgICAgICAgICAgICBpNjRvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICAgICAgICAgIGk2NG91dFsyXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0MCkpOworICAgICAgICAgICAgaTY0b3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDMyKSk7CisgICAgICAgICAgICBpNjRvdXRbNF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICAgICAgICAgIGk2NG91dFs1XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAxNikpOworICAgICAgICAgICAgaTY0b3V0WzZdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDgpKTsKKyAgICAgICAgICAgIGk2NG91dFs3XSA9IChieXRlKSgweGZmICYgaTY0KTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGk2NG91dCwgMCwgOCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIGJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKLQkJewotCQkJaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7Ci0JCQlpMzJvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKLQkJCWkzMm91dFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7Ci0JCQlpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIGkzMik7Ci0JCQl0cmFucy5Xcml0ZShpMzJvdXQsIDAsIDQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKQorICAgICAgICB7CisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgICAgICBXcml0ZUk2NChCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCkpOworI2Vsc2UKKyAgICAgICAgICAgIHZhciBieXRlcyA9IEJpdENvbnZlcnRlci5HZXRCeXRlcyhkKTsKKyAgICAgICAgICAgIFdyaXRlSTY0KEJpdENvbnZlcnRlci5Ub0ludDY0KGJ5dGVzLCAwKSk7CisjZW5kaWYKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGk2NG91dCA9IG5ldyBieXRlWzhdOwotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkKLQkJewotCQkJaTY0b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDU2KSk7Ci0JCQlpNjRvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKLQkJCWk2NG91dFsyXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0MCkpOwotCQkJaTY0b3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDMyKSk7Ci0JCQlpNjRvdXRbNF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMjQpKTsKLQkJCWk2NG91dFs1XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAxNikpOwotCQkJaTY0b3V0WzZdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDgpKTsKLQkJCWk2NG91dFs3XSA9IChieXRlKSgweGZmICYgaTY0KTsKLQkJCXRyYW5zLldyaXRlKGk2NG91dCwgMCwgOCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSTMyKGIuTGVuZ3RoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGIsIDAsIGIuTGVuZ3RoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKQotCQl7Ci0JCQlXcml0ZUk2NChCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCkpOwotCQl9CisgICAgICAgICNlbmRyZWdpb24KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYikKLQkJewotCQkJV3JpdGVJMzIoYi5MZW5ndGgpOwotCQkJdHJhbnMuV3JpdGUoYiwgMCwgYi5MZW5ndGgpOwotCQl9CisgICAgICAgICNyZWdpb24gUmVhZE1ldGhvZHMKIAotCQkjZW5kcmVnaW9uCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOworICAgICAgICAgICAgaW50IHNpemUgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludCB2ZXJzaW9uID0gKHVpbnQpc2l6ZSAmIFZFUlNJT05fTUFTSzsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIkJhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW46ICIgKyB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkoc2l6ZSAmIDB4MDAwMDAwZmYpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IFJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLlNlcUlEID0gUmVhZEkzMigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJpY3RSZWFkXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IFJlYWRTdHJpbmdCb2R5KHNpemUpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLlNlcUlEID0gUmVhZEkzMigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0KIAotCQkjcmVnaW9uIFJlYWRNZXRob2RzCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQotCQl7Ci0JCQlUTWVzc2FnZSBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7Ci0JCQlpbnQgc2l6ZSA9IFJlYWRJMzIoKTsKLQkJCWlmIChzaXplIDwgMCkKLQkJCXsKLQkJCQl1aW50IHZlcnNpb24gPSAodWludClzaXplICYgVkVSU0lPTl9NQVNLOwotCQkJCWlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbjogIiArIHZlcnNpb24pOwotCQkJCX0KLQkJCQltZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKShzaXplICYgMHgwMDAwMDBmZik7Ci0JCQkJbWVzc2FnZS5OYW1lID0gUmVhZFN0cmluZygpOwotCQkJCW1lc3NhZ2UuU2VxSUQgPSBSZWFkSTMyKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKHN0cmljdFJlYWRfKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKLQkJCQl9Ci0JCQkJbWVzc2FnZS5OYW1lID0gUmVhZFN0cmluZ0JvZHkoc2l6ZSk7Ci0JCQkJbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSlSZWFkQnl0ZSgpOwotCQkJCW1lc3NhZ2UuU2VxSUQgPSBSZWFkSTMyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKQotCQl7Ci0JCQlyZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICAgICAgZmllbGQuVHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlICE9IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSBSZWFkSTE2KCk7CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCi0JCXsKLQkJCVRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKLQkJCWZpZWxkLlR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgfQogCi0JCQlpZiAoZmllbGQuVHlwZSAhPSBUVHlwZS5TdG9wKQotCQkJewotCQkJCWZpZWxkLklEID0gUmVhZEkxNigpOwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkJcmV0dXJuIGZpZWxkOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWFwIFJlYWRNYXBCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRNYXAgbWFwID0gbmV3IFRNYXAoKTsKKyAgICAgICAgICAgIG1hcC5LZXlUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBtYXAuVmFsdWVUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBtYXAuQ291bnQgPSBSZWFkSTMyKCk7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZEZpZWxkRW5kKCkKLQkJewotCQl9CisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKLQkJewotCQkJVE1hcCBtYXAgPSBuZXcgVE1hcCgpOwotCQkJbWFwLktleVR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKLQkJCW1hcC5WYWx1ZVR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKLQkJCW1hcC5Db3VudCA9IFJlYWRJMzIoKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCQlyZXR1cm4gbWFwOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTGlzdCBSZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVExpc3QgbGlzdCA9IG5ldyBUTGlzdCgpOworICAgICAgICAgICAgbGlzdC5FbGVtZW50VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgbGlzdC5Db3VudCA9IFJlYWRJMzIoKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWFwRW5kKCkKLQkJewotCQl9CisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUTGlzdCBSZWFkTGlzdEJlZ2luKCkKLQkJewotCQkJVExpc3QgbGlzdCA9IG5ldyBUTGlzdCgpOwotCQkJbGlzdC5FbGVtZW50VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJbGlzdC5Db3VudCA9IFJlYWRJMzIoKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVFNldCBzZXQgPSBuZXcgVFNldCgpOworICAgICAgICAgICAgc2V0LkVsZW1lbnRUeXBlID0gKFRUeXBlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBzZXQuQ291bnQgPSBSZWFkSTMyKCk7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVFNldCBSZWFkU2V0QmVnaW4oKQotCQl7Ci0JCQlUU2V0IHNldCA9IG5ldyBUU2V0KCk7Ci0JCQlzZXQuRWxlbWVudFR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKLQkJCXNldC5Db3VudCA9IFJlYWRJMzIoKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFNldEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCQlyZXR1cm4gc2V0OwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRCb29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFJlYWRCeXRlKCkgPT0gMTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKQotCQl7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gYmluID0gbmV3IGJ5dGVbMV07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzYnl0ZSBSZWFkQnl0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRBbGwoYmluLCAwLCAxKTsKKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpYmluWzBdOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGJvb2wgUmVhZEJvb2woKQotCQl7Ci0JCQlyZXR1cm4gUmVhZEJ5dGUoKSA9PSAxOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGkxNmluID0gbmV3IGJ5dGVbMl07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzaG9ydCBSZWFkSTE2KCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEFsbChpMTZpbiwgMCwgMik7CisgICAgICAgICAgICByZXR1cm4gKHNob3J0KSgoKGkxNmluWzBdICYgMHhmZikgPDwgOCkgfCAoKGkxNmluWzFdICYgMHhmZikpKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGJpbiA9IG5ldyBieXRlWzFdOwotCQlwdWJsaWMgb3ZlcnJpZGUgYnl0ZSBSZWFkQnl0ZSgpCi0JCXsKLQkJCVJlYWRBbGwoYmluLCAwLCAxKTsKLQkJCXJldHVybiBiaW5bMF07Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTMyaW4gPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEFsbChpMzJpbiwgMCwgNCk7CisgICAgICAgICAgICByZXR1cm4gKGludCkoKChpMzJpblswXSAmIDB4ZmYpIDw8IDI0KSB8ICgoaTMyaW5bMV0gJiAweGZmKSA8PCAxNikgfCAoKGkzMmluWzJdICYgMHhmZikgPDwgOCkgfCAoKGkzMmluWzNdICYgMHhmZikpKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGkxNmluID0gbmV3IGJ5dGVbMl07Ci0JCXB1YmxpYyBvdmVycmlkZSBzaG9ydCBSZWFkSTE2KCkKLQkJewotCQkJUmVhZEFsbChpMTZpbiwgMCwgMik7Ci0JCQlyZXR1cm4gKHNob3J0KSgoKGkxNmluWzBdICYgMHhmZikgPDwgOCkgfCAoKGkxNmluWzFdICYgMHhmZikpKTsKLQkJfQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjc1CiAKLQkJcHJpdmF0ZSBieXRlW10gaTMyaW4gPSBuZXcgYnl0ZVs0XTsKLQkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKLQkJewotCQkJUmVhZEFsbChpMzJpbiwgMCwgNCk7Ci0JCQlyZXR1cm4gKGludCkoKChpMzJpblswXSAmIDB4ZmYpIDw8IDI0KSB8ICgoaTMyaW5bMV0gJiAweGZmKSA8PCAxNikgfCAoKGkzMmluWzJdICYgMHhmZikgPDwgOCkgfCAoKGkzMmluWzNdICYgMHhmZikpKTsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBpNjRpbiA9IG5ldyBieXRlWzhdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEFsbChpNjRpbiwgMCwgOCk7CisgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGxvbmcpKAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzBdICYgMHhmZikgPDwgNTYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblsxXSAmIDB4ZmYpIDw8IDQ4KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMl0gJiAweGZmKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzNdICYgMHhmZikgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls0XSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzZdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzddICYgMHhmZikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGk2NGluID0gbmV3IGJ5dGVbOF07Ci0JCXB1YmxpYyBvdmVycmlkZSBsb25nIFJlYWRJNjQoKQotCQl7Ci0JCQlSZWFkQWxsKGk2NGluLCAwLCA4KTsKLQkJCXJldHVybiAobG9uZykoKChsb25nKShpNjRpblswXSAmIDB4ZmYpIDw8IDU2KSB8ICgobG9uZykoaTY0aW5bMV0gJiAweGZmKSA8PCA0OCkgfCAoKGxvbmcpKGk2NGluWzJdICYgMHhmZikgPDwgNDApIHwgKChsb25nKShpNjRpblszXSAmIDB4ZmYpIDw8IDMyKSB8Ci0JCQkJKChsb25nKShpNjRpbls0XSAmIDB4ZmYpIDw8IDI0KSB8ICgobG9uZykoaTY0aW5bNV0gJiAweGZmKSA8PCAxNikgfCAoKGxvbmcpKGk2NGluWzZdICYgMHhmZikgPDwgOCkgfCAoKGxvbmcpKGk2NGluWzddICYgMHhmZikpKTsKLQkJfQorI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgNjc1CiAKLQkJcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKLQkJewotCQkJcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShSZWFkSTY0KCkpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCisgICAgICAgIHsKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoUmVhZEk2NCgpKTsKKyNlbHNlCisgICAgICAgICAgICB2YXIgdmFsdWUgPSBSZWFkSTY0KCk7CisgICAgICAgICAgICB2YXIgYnl0ZXMgPSBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXModmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub0RvdWJsZShieXRlcywgMCk7CisjZW5kaWYKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIFNldFJlYWRMZW5ndGgoaW50IHJlYWRMZW5ndGgpCi0JCXsKLQkJCXJlYWRMZW5ndGhfID0gcmVhZExlbmd0aDsKLQkJCWNoZWNrUmVhZExlbmd0aF8gPSB0cnVlOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzaXplID0gUmVhZEkzMigpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChidWYsIDAsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0cmluZyBSZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChidWYsIDAsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KIAotCQlwcm90ZWN0ZWQgdm9pZCBDaGVja1JlYWRMZW5ndGgoaW50IGxlbmd0aCkKLQkJewotCQkJaWYgKGNoZWNrUmVhZExlbmd0aF8pCi0JCQl7Ci0JCQkJcmVhZExlbmd0aF8gLT0gbGVuZ3RoOwotCQkJCWlmIChyZWFkTGVuZ3RoXyA8IDApCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJNZXNzYWdlIGxlbmd0aCBleGNlZWRlZDogIiArIGxlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgIHByaXZhdGUgaW50IFJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zLlJlYWRBbGwoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQotCQl7Ci0JCQlpbnQgc2l6ZSA9IFJlYWRJMzIoKTsKLQkJCUNoZWNrUmVhZExlbmd0aChzaXplKTsKLQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJcHJpdmF0ZSAgc3RyaW5nIFJlYWRTdHJpbmdCb2R5KGludCBzaXplKQotCQl7Ci0JCQlDaGVja1JlYWRMZW5ndGgoc2l6ZSk7Ci0JCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQl0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7Ci0JCQlyZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmKTsKLQkJfQotCi0JCXByaXZhdGUgaW50IFJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJQ2hlY2tSZWFkTGVuZ3RoKGxlbik7Ci0JCQlyZXR1cm4gdHJhbnMuUmVhZEFsbChidWYsIG9mZiwgbGVuKTsKLQkJfQotCi0JCSNlbmRyZWdpb24KLQl9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjY3Mzk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcwpAQCAtMCwwICsxLDg0OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCit7CisgICAgcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIFRTdHJ1Y3QgQU5PTllNT1VTX1NUUlVDVCA9IG5ldyBUU3RydWN0KCIiKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVEZpZWxkIFRTVE9QID0gbmV3IFRGaWVsZCgiIiwgVFR5cGUuU3RvcCwgKHNob3J0KTApOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSB0dHlwZVRvQ29tcGFjdFR5cGUgPSBuZXcgYnl0ZVsxNl07CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFBST1RPQ09MX0lEID0gMHg4MjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFZFUlNJT04gPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVkVSU0lPTl9NQVNLID0gMHgxZjsgLy8gMDAwMSAxMTExCisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBUWVBFX01BU0sgPSAweEUwOyAvLyAxMTEwIDAwMDAKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFRZUEVfQklUUyA9IDB4MDc7IC8vIDAwMDAgMDExMQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWxsIG9mIHRoZSBvbi13aXJlIHR5cGUgY29kZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNUT1AgPSAweDAwOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQk9PTEVBTl9UUlVFID0gMHgwMTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJPT0xFQU5fRkFMU0UgPSAweDAyOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQllURSA9IDB4MDM7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJMTYgPSAweDA0OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTMyID0gMHgwNTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEk2NCA9IDB4MDY7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBET1VCTEUgPSAweDA3OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQklOQVJZID0gMHgwODsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIExJU1QgPSAweDA5OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU0VUID0gMHgwQTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIE1BUCA9IDB4MEI7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTVFJVQ1QgPSAweDBDOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKyAgICAgICAgLy8vIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgU3RhY2s8c2hvcnQ+IGxhc3RGaWVsZF8gPSBuZXcgU3RhY2s8c2hvcnQ+KDE1KTsKKworICAgICAgICBwcml2YXRlIHNob3J0IGxhc3RGaWVsZElkXyA9IDA7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgICAgIC8vLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgTnVsbGFibGU8VEZpZWxkPiBib29sZWFuRmllbGRfOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgorICAgICAgICAvLy8gdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgTnVsbGFibGU8Qm9vbGVhbj4gYm9vbFZhbHVlXzsKKworCisgICAgICAgICNyZWdpb24gQ29tcGFjdFByb3RvY29sIEZhY3RvcnkKKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoKSB7IH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHVibGljIFRDb21wYWN0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuU3RvcF0gPSBUeXBlcy5TVE9QOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuQm9vbF0gPSBUeXBlcy5CT09MRUFOX1RSVUU7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5CeXRlXSA9IFR5cGVzLkJZVEU7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5JMTZdID0gVHlwZXMuSTE2OworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuSTMyXSA9IFR5cGVzLkkzMjsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkk2NF0gPSBUeXBlcy5JNjQ7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5Eb3VibGVdID0gVHlwZXMuRE9VQkxFOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuU3RyaW5nXSA9IFR5cGVzLkJJTkFSWTsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkxpc3RdID0gVHlwZXMuTElTVDsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLlNldF0gPSBUeXBlcy5TRVQ7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5NYXBdID0gVHlwZXMuTUFQOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuU3RydWN0XSA9IFR5cGVzLlNUUlVDVDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdEZpZWxkXy5DbGVhcigpOworICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gV3JpdGUgTWV0aG9kcworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAgICAgICAvLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIFdyaXRlIGEgYnl0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gYnl0ZURpcmVjdEJ1ZmZlciA9IG5ldyBieXRlWzFdOworCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUJ5dGVEaXJlY3QoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlRGlyZWN0QnVmZmVyWzBdID0gYjsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGJ5dGVEaXJlY3RCdWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUJ5dGVEaXJlY3QoaW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSluKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgIC8vLyBUT0RPOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIFdyaXRlVmFyaW50NjQ/CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs1XTsKKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVWYXJpbnQzMih1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHggPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChuICYgfjB4N0YpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpMzJidWZbaWR4KytdID0gKGJ5dGUpbjsKKyAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpMzJidWZbaWR4KytdID0gKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGVCeXRlRGlyZWN0KChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOworICAgICAgICAgICAgICAgICAgICBuID4+PSA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGkzMmJ1ZiwgMCwgaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKKyAgICAgICAgLy8vIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoUFJPVE9DT0xfSUQpOworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChieXRlKSgoVkVSU0lPTiAmIFZFUlNJT05fTUFTSykgfCAoKCgodWludCltZXNzYWdlLlR5cGUpIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpKTsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoKHVpbnQpbWVzc2FnZS5TZXFJRCk7CisgICAgICAgICAgICBXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICAgIC8vLyB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKKyAgICAgICAgLy8vIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RyY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOworICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCisgICAgICAgIC8vLyB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHBvcCB0aGUgbGFzdCBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHN0cnVjdCBvZmYKKyAgICAgICAgLy8vIG9mIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQorICAgICAgICAvLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKCZsdDsgMTUpLAorICAgICAgICAvLy8gdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQorICAgICAgICAvLy8gZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuQm9vbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0LgorICAgICAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8gPSBmaWVsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbChmaWVsZCwgMHhGRik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgd29ya2hvcnNlIG9mIFdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICAgICAgICAvLy8gJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKKyAgICAgICAgLy8vIGJvb2xlYW4gZmllbGQgY2FzZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlRmllbGRCZWdpbkludGVybmFsKFRGaWVsZCBmaWVsZCwgYnl0ZSB0eXBlT3ZlcnJpZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNob3J0IGxhc3RGaWVsZCA9IGxhc3RGaWVsZF8uUG9wKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgICAgICAgICAgIGJ5dGUgdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUgPT0gMHhGRiA/IGdldENvbXBhY3RUeXBlKGZpZWxkLlR5cGUpIDogdHlwZU92ZXJyaWRlOworCisgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgICAgICAgICAgIGlmIChmaWVsZC5JRCA+IGxhc3RGaWVsZElkXyAmJiBmaWVsZC5JRCAtIGxhc3RGaWVsZElkXyA8PSAxNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChmaWVsZC5JRCAtIGxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KHR5cGVUb1dyaXRlKTsKKyAgICAgICAgICAgICAgICBXcml0ZUkxNihmaWVsZC5JRCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkLklEOworICAgICAgICAgICAgLy8gbGFzdEZpZWxkXy5wdXNoKGZpZWxkLmlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoVHlwZXMuU1RPUCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZQorICAgICAgICAvLy8gaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobWFwLkNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoKHVpbnQpbWFwLkNvdW50KTsKKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoZ2V0Q29tcGFjdFR5cGUobWFwLktleVR5cGUpIDw8IDQgfCBnZXRDb21wYWN0VHlwZShtYXAuVmFsdWVUeXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGxpc3QgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbihsaXN0LkVsZW1lbnRUeXBlLCBsaXN0LkNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgc2V0IGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oc2V0LkVsZW1lbnRUeXBlLCBzZXQuQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisgICAgICAgIC8vLyB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorICAgICAgICAvLy8gcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAgICAvLy8gT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woQm9vbGVhbiBiKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYm9vbGVhbkZpZWxkXyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgICAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGJvb2xlYW5GaWVsZF8uVmFsdWUsIGIgPyBUeXBlcy5CT09MRUFOX1RSVUUgOiBUeXBlcy5CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoYiA/IFR5cGVzLkJPT0xFQU5fVFJVRSA6IFR5cGVzLkJPT0xFQU5fRkFMU0UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBieXRlLiBOb3RoaW5nIHRvIHNlZSBoZXJlIQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJ5dGUoc2J5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChieXRlKWIpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgaTE2KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZVZhcmludDMyKGludFRvWmlnWmFnKGkxNikpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMihpbnRUb1ppZ1phZyhpMzIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGk2NCBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZVZhcmludDY0KGxvbmdUb1ppZ3phZyhpNjQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkdWIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgICAgICAgICAgIGZpeGVkTG9uZ1RvQnl0ZXMoQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGR1YiksIGRhdGEsIDApOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgc3RyKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBVVEY4RW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzdHIpOworICAgICAgICAgICAgV3JpdGVCaW5hcnkoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGJpbikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCaW5hcnkoYmluLCAwLCBiaW4uTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZVZhcmludDMyKCh1aW50KWxlbmd0aCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShidWYsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZQorICAgICAgICAvLyBvdXRwdXQgb3IgcHVycG9zZS4KKyAgICAgICAgLy8KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0RW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0RW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKSB7IH0KKworICAgICAgICAvLworICAgICAgICAvLyBJbnRlcm5hbCB3cml0aW5nIG1ldGhvZHMKKyAgICAgICAgLy8KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgICAgICAgIC8vLyB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCB2b2lkIFdyaXRlQ29sbGVjdGlvbkJlZ2luKFRUeXBlIGVsZW1UeXBlLCBpbnQgc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemUgPD0gMTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KHNpemUgPDwgNCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KDB4ZjAgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgICAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoKHVpbnQpc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgYnl0ZVtdIHZhcmludDY0b3V0ID0gbmV3IGJ5dGVbMTBdOworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVWYXJpbnQ2NCh1bG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4odWxvbmcpMHg3RkwpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoYnl0ZSluOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOworICAgICAgICAgICAgICAgICAgICBuID4+PSA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYW5zLldyaXRlKHZhcmludDY0b3V0LCAwLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAgICAvLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHVsb25nIGxvbmdUb1ppZ3phZyhsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAodWxvbmcpKG4gPDwgMSkgXiAodWxvbmcpKG4gPj4gNjMpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICAgIC8vLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdWludCBpbnRUb1ppZ1phZyhpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICh1aW50KShuIDw8IDEpIF4gKHVpbnQpKG4gPj4gMzEpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nCisgICAgICAgIC8vLyB1bnRpbCBvZmYrNy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpeGVkTG9uZ1RvQnl0ZXMobG9uZyBuLCBieXRlW10gYnVmLCBpbnQgb2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBidWZbb2ZmICsgMF0gPSAoYnl0ZSkobiAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDFdID0gKGJ5dGUpKChuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMl0gPSAoYnl0ZSkoKG4gPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgM10gPSAoYnl0ZSkoKG4gPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNF0gPSAoYnl0ZSkoKG4gPj4gMzIpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNV0gPSAoYnl0ZSkoKG4gPj4gNDApICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNl0gPSAoYnl0ZSkoKG4gPj4gNDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgN10gPSAoYnl0ZSkoKG4gPj4gNTYpICYgMHhmZik7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBSZWFkTWV0aG9kcworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlIHByb3RvY29sSWQgPSAoYnl0ZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgaWYgKHByb3RvY29sSWQgIT0gUFJPVE9DT0xfSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgcHJvdG9jb2wgaWQgIiArIFBST1RPQ09MX0lELlRvU3RyaW5nKCJYIikgKyAiIGJ1dCBnb3QgIiArIHByb3RvY29sSWQuVG9TdHJpbmcoIlgiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlIHZlcnNpb25BbmRUeXBlID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIGJ5dGUgdmVyc2lvbiA9IChieXRlKSh2ZXJzaW9uQW5kVHlwZSAmIFZFUlNJT05fTUFTSyk7CisgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIHZlcnNpb24gIiArIFZFUlNJT04gKyAiIGJ1dCBnb3QgIiArIHZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZSB0eXBlID0gKGJ5dGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOworICAgICAgICAgICAgaW50IHNlcWlkID0gKGludClSZWFkVmFyaW50MzIoKTsKKyAgICAgICAgICAgIHN0cmluZyBtZXNzYWdlTmFtZSA9IFJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobWVzc2FnZU5hbWUsIChUTWVzc2FnZVR5cGUpdHlwZSwgc2VxaWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisgICAgICAgIC8vLyBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOworICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICAgICAgICAgIHJldHVybiBBTk9OWU1PVVNfU1RSVUNUOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKyAgICAgICAgLy8vIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSBSZWFkIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgdHlwZSA9IChieXRlKVJlYWRCeXRlKCk7CisKKyAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKyAgICAgICAgICAgIGlmICh0eXBlID09IFR5cGVzLlNUT1ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRTVE9QOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaG9ydCBmaWVsZElkOworCisgICAgICAgICAgICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgICAgICAgICAgICBzaG9ydCBtb2RpZmllciA9IChzaG9ydCkoKHR5cGUgJiAweGYwKSA+PiA0KTsKKyAgICAgICAgICAgIGlmIChtb2RpZmllciA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgICAgICAgICAgICAgICBmaWVsZElkID0gUmVhZEkxNigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGhhcyBhIGRlbHRhLiBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisgICAgICAgICAgICAgICAgZmllbGRJZCA9IChzaG9ydCkobGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCIiLCBnZXRUVHlwZSgoYnl0ZSkodHlwZSAmIDB4MGYpKSwgZmllbGRJZCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisgICAgICAgICAgICBpZiAoaXNCb29sVHlwZSh0eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICBib29sVmFsdWVfID0gKGJ5dGUpKHR5cGUgJiAweDBmKSA9PSBUeXBlcy5CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuSUQ7CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgUmVhZGluZyB0aGUga2V5CisgICAgICAgIC8vLyBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICAgICAgICAvLy8gImNvcnJlY3QiIHR5cGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpUmVhZFZhcmludDMyKCk7CisgICAgICAgICAgICBieXRlIGtleUFuZFZhbHVlVHlwZSA9IHNpemUgPT0gMCA/IChieXRlKTAgOiAoYnl0ZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWFwKGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpLCBnZXRUVHlwZSgoYnl0ZSkoa2V5QW5kVmFsdWVUeXBlICYgMHhmKSksIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgIC8vLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgICAgLy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgLy8vIHRydWUgc2l6ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlIHNpemVfYW5kX3R5cGUgPSAoYnl0ZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgaW50IHNpemUgPSAoc2l6ZV9hbmRfdHlwZSA+PiA0KSAmIDB4MGY7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplID0gKGludClSZWFkVmFyaW50MzIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRUeXBlIHR5cGUgPSBnZXRUVHlwZShzaXplX2FuZF90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgIC8vLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorICAgICAgICAvLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAgICAvLy8gdHJ1ZSBzaXplLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFNldCBSZWFkU2V0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRTZXQoUmVhZExpc3RCZWdpbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgICAgLy8vIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisgICAgICAgIC8vLyBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQm9vbGVhbiBSZWFkQm9vbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChib29sVmFsdWVfICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBib29sVmFsdWVfLlZhbHVlOworICAgICAgICAgICAgICAgIGJvb2xWYWx1ZV8gPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUmVhZEJ5dGUoKSA9PSBUeXBlcy5CT09MRUFOX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gYnl0ZVJhd0J1ZiA9IG5ldyBieXRlWzFdOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzYnl0ZSBSZWFkQnl0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnl0ZVJhd0J1ZiwgMCwgMSk7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKWJ5dGVSYXdCdWZbMF07CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNob3J0KXppZ3phZ1RvSW50KFJlYWRWYXJpbnQzMigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRJMzIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gemlnemFnVG9JbnQoUmVhZFZhcmludDMyKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFJlYWRJNjQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gemlnemFnVG9Mb25nKFJlYWRWYXJpbnQ2NCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IFJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZG91YmxlIFJlYWREb3VibGUoKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gbG9uZ0JpdHMgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwobG9uZ0JpdHMsIDAsIDgpOworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShieXRlc1RvTG9uZyhsb25nQml0cykpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZHMgYSBieXRlW10gKHZpYSBSZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpUmVhZFZhcmludDMyKCk7CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhSZWFkQmluYXJ5KGxlbmd0aCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClSZWFkVmFyaW50MzIoKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG5ldyBieXRlWzBdOworCisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBieXRlW10gb2YgYSBrbm93biBsZW5ndGggZnJvbSB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gUmVhZEJpbmFyeShpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgYnl0ZVswXTsKKworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBoZXJlIGZvciB0aGUgc3RydWN0IHRvIGNhbGwsIGJ1dCBkb24ndCBoYXZlIGFueSB3aXJlCisgICAgICAgIC8vIGVuY29kaW5nLgorICAgICAgICAvLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTWVzc2FnZUVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkgeyB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW50ZXJuYWwgUmVhZGluZyBtZXRob2RzCisgICAgICAgIC8vCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgIC8vLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdWludCBSZWFkVmFyaW50MzIoKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50IHJlc3VsdCA9IDA7CisgICAgICAgICAgICBpbnQgc2hpZnQgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBiID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVpbnQpKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKSBicmVhazsKKyAgICAgICAgICAgICAgICBzaGlmdCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAgICAgLy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdWxvbmcgUmVhZFZhcmludDY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHVsb25nIHJlc3VsdCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAodWxvbmcpKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKSBicmVhazsKKyAgICAgICAgICAgICAgICBzaGlmdCArPSA3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIC8vCisgICAgICAgIC8vIGVuY29kaW5nIGhlbHBlcnMKKyAgICAgICAgLy8KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IHppZ3phZ1RvSW50KHVpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKG4gPj4gMSkgXiAoLShpbnQpKG4gJiAxKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBsb25nIHppZ3phZ1RvTG9uZyh1bG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGxvbmcpKG4gPj4gMSkgXiAoLShsb25nKShuICYgMSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisgICAgICAgIC8vLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAgICAvLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBsb25nIGJ5dGVzVG9Mb25nKGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICgoYnl0ZXNbN10gJiAweGZmTCkgPDwgNTYpIHwKKyAgICAgICAgICAgICAgKChieXRlc1s2XSAmIDB4ZmZMKSA8PCA0OCkgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzVdICYgMHhmZkwpIDw8IDQwKSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbNF0gJiAweGZmTCkgPDwgMzIpIHwKKyAgICAgICAgICAgICAgKChieXRlc1szXSAmIDB4ZmZMKSA8PCAyNCkgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzJdICYgMHhmZkwpIDw8IDE2KSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbMV0gJiAweGZmTCkgPDwgOCkgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzBdICYgMHhmZkwpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIHR5cGUgdGVzdGluZyBhbmQgY29udmVydGluZworICAgICAgICAvLworCisgICAgICAgIHByaXZhdGUgQm9vbGVhbiBpc0Jvb2xUeXBlKGJ5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxvd2VyTmliYmxlID0gYiAmIDB4MGY7CisgICAgICAgICAgICByZXR1cm4gbG93ZXJOaWJibGUgPT0gVHlwZXMuQk9PTEVBTl9UUlVFIHx8IGxvd2VyTmliYmxlID09IFR5cGVzLkJPT0xFQU5fRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgLy8vIFRUeXBlIHZhbHVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFRUeXBlIGdldFRUeXBlKGJ5dGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICgoYnl0ZSkodHlwZSAmIDB4MGYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0b3A7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CT09MRUFOX0ZBTFNFOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQk9PTEVBTl9UUlVFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQm9vbDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJZVEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTMyOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTY0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuRG91YmxlOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQklOQVJZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTElTVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkxpc3Q7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TZXQ7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5NQVA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5NYXA7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICIgKyAoYnl0ZSkodHlwZSAmIDB4MGYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYnl0ZSBnZXRDb21wYWN0VHlwZShUVHlwZSB0dHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KXR0eXBlXTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RGaWVsZC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RGaWVsZC5jcwppbmRleCBmYTEwNTg0Li44MTc5NTU3IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCkBAIC0yNywzNiArMjcsMzYgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVEZpZWxkCi0JewotCQlwcml2YXRlIHN0cmluZyBuYW1lOwotCQlwcml2YXRlIFRUeXBlIHR5cGU7Ci0JCXByaXZhdGUgc2hvcnQgaWQ7CisgICAgcHVibGljIHN0cnVjdCBURmllbGQKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgVFR5cGUgdHlwZTsKKyAgICAgICAgcHJpdmF0ZSBzaG9ydCBpZDsKIAotCQlwdWJsaWMgVEZpZWxkKHN0cmluZyBuYW1lLCBUVHlwZSB0eXBlLCBzaG9ydCBpZCkKLQkJCTp0aGlzKCkKLQkJewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KKyAgICAgICAgcHVibGljIFRGaWVsZChzdHJpbmcgbmFtZSwgVFR5cGUgdHlwZSwgc2hvcnQgaWQpCisgICAgICAgICAgICA6dGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB9CiAKLQkJcHVibGljIHN0cmluZyBOYW1lCi0JCXsKLQkJCWdldCB7IHJldHVybiBuYW1lOyB9Ci0JCQlzZXQgeyBuYW1lID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5hbWU7IH0KKyAgICAgICAgICAgIHNldCB7IG5hbWUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIFRUeXBlIFR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHR5cGU7IH0KLQkJCXNldCB7IHR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0eXBlOyB9CisgICAgICAgICAgICBzZXQgeyB0eXBlID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBzaG9ydCBJRAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gaWQ7IH0KLQkJCXNldCB7IGlkID0gdmFsdWU7IH0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIHNob3J0IElECisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBpZDsgfQorICAgICAgICAgICAgc2V0IHsgaWQgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiZGVhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MKQEAgLTAsMCArMSwxMTI0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgLy8vIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRmFjdG9yeSBmb3IgSlNPTiBwcm90b2NvbCBvYmplY3RzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gQ09NTUEgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJywnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBDT0xPTiA9IG5ldyBieXRlW10geyAoYnl0ZSknOicgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIExCUkFDRSA9IG5ldyBieXRlW10geyAoYnl0ZSkneycgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIFJCUkFDRSA9IG5ldyBieXRlW10geyAoYnl0ZSknfScgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIExCUkFDS0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdbJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gUkJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ10nIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBRVU9URSA9IG5ldyBieXRlW10geyAoYnl0ZSknIicgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIEJBQ0tTTEFTSCA9IG5ldyBieXRlW10geyAoYnl0ZSknXFwnIH07CisKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gRVNDU0VRID0gbmV3IGJ5dGVbXSB7IChieXRlKSdcXCcsIChieXRlKSd1JywgKGJ5dGUpJzAnLCAoYnl0ZSknMCcgfTsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGxvbmcgVkVSU0lPTiA9IDE7CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEpTT05fQ0hBUl9UQUJMRSA9IHsKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwoYnl0ZSknYicsKGJ5dGUpJ3QnLChieXRlKSduJywgIDAsKGJ5dGUpJ2YnLChieXRlKSdyJywgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgMSwgIDEsKGJ5dGUpJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgfTsKKworICAgICAgICBwcml2YXRlIGNoYXJbXSBFU0NBUEVfQ0hBUlMgPSAiXCJcXC9iZm5ydCIuVG9DaGFyQXJyYXkoKTsKKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBFU0NBUEVfQ0hBUl9WQUxTID0geworICAgIChieXRlKSciJywgKGJ5dGUpJ1xcJywgKGJ5dGUpJy8nLCAoYnl0ZSknXGInLCAoYnl0ZSknXGYnLCAoYnl0ZSknXG4nLCAoYnl0ZSknXHInLCAoYnl0ZSknXHQnLAorICB9OworCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRl9TVFJJTkdfU0laRSA9IDE2OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0JPT0wgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3QnLCAoYnl0ZSknZicgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfQllURSA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSc4JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9JMTYgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknMScsIChieXRlKSc2JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9JMzIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknMycsIChieXRlKScyJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9JNjQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknNicsIChieXRlKSc0JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9ET1VCTEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2QnLCAoYnl0ZSknYicsIChieXRlKSdsJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TVFJVQ1QgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3InLCAoYnl0ZSknZScsIChieXRlKSdjJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TVFJJTkcgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcsIChieXRlKSdyJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9NQVAgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ20nLCAoYnl0ZSknYScsIChieXRlKSdwJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9MSVNUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdsJywgKGJ5dGUpJ3MnLCAoYnl0ZSkndCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfU0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdzJywgKGJ5dGUpJ2UnLCAoYnl0ZSkndCcgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gR2V0VHlwZU5hbWVGb3JUeXBlSUQoVFR5cGUgdHlwZUlEKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGVJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJvb2w6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0JPT0w7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9CWVRFOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9JMTY7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0kzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9ET1VCTEU7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX1NUUklORzsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cnVjdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfU1RSVUNUOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9NQVA7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TZXQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX1NFVDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0xJU1Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFR5cGUgR2V0VHlwZUlERm9yVHlwZU5hbWUoYnl0ZVtdIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRUeXBlIHJlc3VsdCA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICBpZiAobmFtZS5MZW5ndGggPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVswXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ2QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuRG91YmxlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ2knOgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzgnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKScxJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSczJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc2JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdsJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkxpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknbSc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5NYXA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkncic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkncyc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAoYnl0ZSkndCcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZVsxXSA9PSAoYnl0ZSknZScpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQm9vbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKKyAgICAgICAgLy8vIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycworICAgICAgICAvLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBUSlNPTlByb3RvY29sIHByb3RvOworCisgICAgICAgICAgICBwdWJsaWMgSlNPTkJhc2VDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKCkgeyB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVhZCgpIHsgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIEVzY2FwZU51bWJlcnMoKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKKyAgICAgICAgLy8vIGZvciB0aGUgZmlyc3Qgb25lCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OTGlzdENvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEpTT05MaXN0Q29udGV4dChUSlNPTlByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8udHJhbnMuV3JpdGUoQ09NTUEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKENPTU1BKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb250ZXh0IGZvciBKU09OIHJlY29yZHMuIFdpbGwgaW5zZXJ0L1JlYWQgY29sb25zIGJlZm9yZSB0aGUgdmFsdWUgcG9ydGlvbgorICAgICAgICAvLy8gb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KKyAgICAgICAgLy8vIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUKKyAgICAgICAgLy8vIGVzY2FwZWQgaW4gcXVvdGVzIChzaW5jZSBKU09OIGtleXMgbXVzdCBiZSBzdHJpbmdzKS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05QYWlyQ29udGV4dCA6IEpTT05CYXNlQ29udGV4dAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgSlNPTlBhaXJDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgY29sb24gPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY29sb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90by50cmFucy5Xcml0ZShjb2xvbiA/IENPTE9OIDogQ09NTUEpOworICAgICAgICAgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKGNvbG9uID8gQ09MT04gOiBDT01NQSk7CisgICAgICAgICAgICAgICAgICAgIGNvbG9uID0gIWNvbG9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXNjYXBlTnVtYmVycygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSG9sZHMgdXAgdG8gb25lIGJ5dGUgZnJvbSB0aGUgdHJhbnNwb3J0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBMb29rYWhlYWRSZWFkZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CisKKyAgICAgICAgICAgIHB1YmxpYyBMb29rYWhlYWRSZWFkZXIoVEpTT05Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBoYXNEYXRhOworICAgICAgICAgICAgcHJpdmF0ZSBieXRlW10gZGF0YSA9IG5ldyBieXRlWzFdOworCisgICAgICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgICAgICAvLy8gUmV0dXJuIGFuZCBjb25zdW1lIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCwgZWl0aGVyIHRha2luZyBpdCBmcm9tIHRoZQorICAgICAgICAgICAgLy8vIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBieXRlIFJlYWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoYXNEYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzRGF0YSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90by50cmFucy5SZWFkQWxsKGRhdGEsIDAsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAgICAgICAgIC8vLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbFJlYWR5LgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBieXRlIFBlZWsoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvLnRyYW5zLlJlYWRBbGwoZGF0YSwgMCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhc0RhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBkYXRhWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRGVmYXVsdCBlbmNvZGluZworICAgICAgICBwcm90ZWN0ZWQgRW5jb2RpbmcgdXRmOEVuY29kaW5nID0gVVRGOEVuY29kaW5nLlVURjg7CisKKyAgICAgICAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCisgICAgICAgIHByb3RlY3RlZCBTdGFjazxKU09OQmFzZUNvbnRleHQ+IGNvbnRleHRTdGFjayA9IG5ldyBTdGFjazxKU09OQmFzZUNvbnRleHQ+KCk7CisKKyAgICAgICAgLy8gQ3VycmVudCBjb250ZXh0IHRoYXQgd2UgYXJlIGluCisgICAgICAgIHByb3RlY3RlZCBKU09OQmFzZUNvbnRleHQgY29udGV4dDsKKworICAgICAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgorICAgICAgICBwcm90ZWN0ZWQgTG9va2FoZWFkUmVhZGVyIHJlYWRlcjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHRTdGFjay5QdXNoKGNvbnRleHQpOworICAgICAgICAgICAgY29udGV4dCA9IGM7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0U3RhY2suUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUSlNPTlByb3RvY29sIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUSlNPTlByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgSlNPTkJhc2VDb250ZXh0KHRoaXMpOworICAgICAgICAgICAgcmVhZGVyID0gbmV3IExvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gdGVtcEJ1ZmZlciA9IG5ldyBieXRlWzRdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiWzBdOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgLy8vIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5SZWFkCisgICAgICAgIC8vLyBhbmQgSlNPTlBhaXJDb250ZXh0LlJlYWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUmVhZEpTT05TeW50YXhDaGFyKGJ5dGVbXSBiKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCAhPSBiWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcjoiICsgKGNoYXIpY2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCBjaGFyICgnMCctJzknIG9yICdhJy0nZicpIGludG8gaXRzCisgICAgICAgIC8vLyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlIEhleFZhbChieXRlIGNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaCArPSAxMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJ2EnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCB2YWx1ZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4Q2hhcihieXRlIHZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsICY9IDB4MEY7CisgICAgICAgICAgICBpZiAodmFsIDwgMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnMCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbCAtPSAxMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICdhJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTlN0cmluZyhieXRlW10gYikKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICAgICAgaW50IGxlbiA9IGIuTGVuZ3RoOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJbaV0gJiAweDAwRkYpID49IDB4MzApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYltpXSA9PSBCQUNLU0xBU0hbMF0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShCQUNLU0xBU0gpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoYiwgaSwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcEJ1ZmZlclswXSA9IEpTT05fQ0hBUl9UQUJMRVtiW2ldXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBCdWZmZXJbMF0gPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoYiwgaSwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcEJ1ZmZlclswXSA+IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZSh0ZW1wQnVmZmVyLCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKEVTQ1NFUSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQnVmZmVyWzBdID0gSGV4Q2hhcigoYnl0ZSkoYltpXSA+PiA0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQnVmZmVyWzFdID0gSGV4Q2hhcihiW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLCBpdCB3aWxsIGJlCisgICAgICAgIC8vLyB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkludGVnZXIobG9uZyBudW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKKworICAgICAgICAgICAgYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOworCisgICAgICAgICAgICB0cmFucy5Xcml0ZSh1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSk7CisKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAgICAgICAvLy8gY29udGV4dCBkaWN0YXRlcyBlc2NhcGluZywgV3JpdGUgb3V0IGFzIEpTT04gc3RyaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoIkcxNyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgYm9vbCBzcGVjaWFsID0gZmFsc2U7CisKKyAgICAgICAgICAgIHN3aXRjaCAoc3RyWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ04nOiAvLyBOYU4KKyAgICAgICAgICAgICAgICBjYXNlICdJJzogLy8gSW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyWzFdID09ICdJJykKKyAgICAgICAgICAgICAgICAgICAgeyAvLyAtSW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOworCisgICAgICAgICAgICB0cmFucy5Xcml0ZSh1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSk7CisKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICB9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAorICAgICAgICAvLy8gZGF0YQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OQmFzZTY0KGJ5dGVbXSBiKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisKKyAgICAgICAgICAgIGludCBsZW4gPSBiLkxlbmd0aDsKKyAgICAgICAgICAgIGludCBvZmYgPSAwOworCisgICAgICAgICAgICB3aGlsZSAobGVuID49IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIDMsIHRlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIDQpOworICAgICAgICAgICAgICAgIG9mZiArPSAzOworICAgICAgICAgICAgICAgIGxlbiAtPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRVdGlscy5lbmNvZGUoYiwgb2ZmLCBsZW4sIHRlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIGxlbiArIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OT2JqZWN0U3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShMQlJBQ0UpOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoUkJSQUNFKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoTEJSQUNLRVQpOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OQXJyYXlFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShSQlJBQ0tFVCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKFZFUlNJT04pOworCisgICAgICAgICAgICBieXRlW10gYiA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhtZXNzYWdlLk5hbWUpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKGIpOworCisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKChsb25nKW1lc3NhZ2UuVHlwZSk7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2UuU2VxSUQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihmaWVsZC5JRCk7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkLlR5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkgeyB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC5LZXlUeXBlKSk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQobWFwLlZhbHVlVHlwZSkpOworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihtYXAuQ291bnQpOworICAgICAgICAgICAgV3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKGxpc3QuRWxlbWVudFR5cGUpKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIobGlzdC5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKHNldC5FbGVtZW50VHlwZSkpOworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihzZXQuQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihiID8gKGxvbmcpMSA6IChsb25nKTApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoKGxvbmcpYik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBpMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoKGxvbmcpaTE2KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTMyKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoKGxvbmcpaTMyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKGk2NCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZHViKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05Eb3VibGUoZHViKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKHN0cik7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoYik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYmluKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05CYXNlNjQoYmluKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICAgICAqLworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4uIFNraXAgUmVhZGluZyBmcm9tIHRoZQorICAgICAgICAvLy8gY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkSlNPTlN0cmluZyhib29sIHNraXBDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gYnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgTGlzdDxjaGFyPiBjb2RldW5pdHMgPSBuZXcgTGlzdDxjaGFyPigpOworCisKKyAgICAgICAgICAgIGlmICghc2tpcENvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09IFFVT1RFWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZXNjYXBlZD8KKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gRVNDU0VRWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKG5ldyBieXRlW10geyAoYnl0ZSljaCB9LCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggYW5kIFw/CisgICAgICAgICAgICAgICAgY2ggPSByZWFkZXIuUmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChjaCAhPSBFU0NTRVFbMV0pICAvLyBjb250cm9sIGNoYXJzIGxpa2UgXG4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBvZmYgPSBBcnJheS5JbmRleE9mKEVTQ0FQRV9DSEFSUywgKGNoYXIpY2gpOworICAgICAgICAgICAgICAgICAgICBpZiAob2ZmID09IC0xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaCA9IEVTQ0FQRV9DSEFSX1ZBTFNbb2ZmXTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKG5ldyBieXRlW10geyAoYnl0ZSljaCB9LCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBpdCdzIFx1WFhYWAorICAgICAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwodGVtcEJ1ZmZlciwgMCwgNCk7CisgICAgICAgICAgICAgICAgdmFyIHdjaCA9IChzaG9ydCkoKEhleFZhbCgoYnl0ZSl0ZW1wQnVmZmVyWzBdKSA8PCAxMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIZXhWYWwoKGJ5dGUpdGVtcEJ1ZmZlclsxXSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIZXhWYWwoKGJ5dGUpdGVtcEJ1ZmZlclsyXSkgPDwgNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXhWYWwodGVtcEJ1ZmZlclszXSkpOworICAgICAgICAgICAgICAgIGlmIChDaGFyLklzSGlnaFN1cnJvZ2F0ZSgoY2hhcil3Y2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5BZGQoKGNoYXIpd2NoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoQ2hhci5Jc0xvd1N1cnJvZ2F0ZSgoY2hhcil3Y2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcil3Y2gpOworICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKGNvZGV1bml0cy5Ub0FycmF5KCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUodG1wLCAwLCB0bXAuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMobmV3IGNoYXJbXSB7IChjaGFyKXdjaCB9KTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKHRtcCwgMCwgdG1wLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5Ub0FycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBib29sIElzSlNPTk51bWVyaWMoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknKyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknRSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknZSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcworICAgICAgICAvLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHN0cmluZyBSZWFkSlNPTk51bWVyaWNDaGFycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyYmxkID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgY2ggPSByZWFkZXIuUGVlaygpOworICAgICAgICAgICAgICAgIGlmICghSXNKU09OTnVtZXJpYyhjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyYmxkLkFwcGVuZCgoY2hhcilyZWFkZXIuUmVhZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBsb25nIFJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOworICAgICAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnQ2NC5QYXJzZShzdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiBmZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiLCBmZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCisgICAgICAgIC8vLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGRvdWJsZSBSZWFkSlNPTkRvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICAgICAgaWYgKHJlYWRlci5QZWVrKCkgPT0gUVVPVEVbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGFyciA9IFJlYWRKU09OU3RyaW5nKHRydWUpOworICAgICAgICAgICAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUuUGFyc2UodXRmOEVuY29kaW5nLkdldFN0cmluZyhhcnIsIDAsIGFyci5MZW5ndGgpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKworICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkgJiYgIURvdWJsZS5Jc05hTihkdWIpICYmICFEb3VibGUuSXNJbmZpbml0eShkdWIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGR1YjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICAgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUuUGFyc2UoUmVhZEpTT05OdW1lcmljQ2hhcnMoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24gZmV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIiwgZmV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkSlNPTkJhc2U2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICAgICAgaW50IGxlbiA9IGIuTGVuZ3RoOworICAgICAgICAgICAgaW50IG9mZiA9IDA7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICAvLyByZWR1Y2UgbGVuIHRvIGlnbm9yZSBmaWxsIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAoKGxlbiA+IDApICYmIChiW2xlbiAtIDFdID09ICc9JykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZWFkICYgZGVjb2RlIGZ1bGwgYnl0ZSB0cmlwbGV0cyA9IDQgc291cmNlIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAobGVuID4gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgb2ZmICs9IDQ7CisgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgICAgICAgICAgc2l6ZSArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgICAgICAgICAgICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCisgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIGxlbiwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgc2l6ZSArPSBsZW4gLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2FkbHkgd2UgbXVzdCBjb3B5IHRoZSBieXRlW10gKGFueSB3YXkgYXJvdW5kIHRoaXM/KQorICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgQXJyYXkuQ29weShiLCAwLCByZXN1bHQsIDAsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSk7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgUmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoTEJSQUNLRVQpOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgUmVhZEpTT05BcnJheUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihSQlJBQ0tFVCk7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgaWYgKFJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT04pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBidWYgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7CisgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlBlZWsoKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSBSQlJBQ0VbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSAoc2hvcnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICAgICAgUmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZEZpZWxkRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWFwIFJlYWRNYXBCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRNYXAgbWFwID0gbmV3IFRNYXAoKTsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAgICAgbWFwLlZhbHVlVHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICBtYXAuQ291bnQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgICAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTGlzdCBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIGxpc3QuRWxlbWVudFR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAgICAgbGlzdC5Db3VudCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRMaXN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVFNldCBzZXQgPSBuZXcgVFNldCgpOworICAgICAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBzZXQuRWxlbWVudFR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAgICAgc2V0LkNvdW50ID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgUmVhZEJvb2woKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFJlYWRKU09OSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSlSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzaG9ydCBSZWFkSTE2KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobG9uZylSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZWFkSlNPTkRvdWJsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVhZEpTT05CYXNlNjQoKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVExpc3QuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcwppbmRleCBhNjUxZWIxLi4wYzhmMjE0IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcwpAQCAtMjcsMjggKzI3LDI4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRMaXN0Ci0JewotCQlwcml2YXRlIFRUeXBlIGVsZW1lbnRUeXBlOwotCQlwcml2YXRlIGludCBjb3VudDsKKyAgICBwdWJsaWMgc3RydWN0IFRMaXN0CisgICAgeworICAgICAgICBwcml2YXRlIFRUeXBlIGVsZW1lbnRUeXBlOworICAgICAgICBwcml2YXRlIGludCBjb3VudDsKIAotCQlwdWJsaWMgVExpc3QoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKLQkJCTp0aGlzKCkKLQkJewotCQkJdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQl9CisgICAgICAgIHB1YmxpYyBUTGlzdChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGVsZW1lbnRUeXBlOyB9Ci0JCQlzZXQgeyBlbGVtZW50VHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBlbGVtZW50VHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgZWxlbWVudFR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIGludCBDb3VudAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gY291bnQ7IH0KLQkJCXNldCB7IGNvdW50ID0gdmFsdWU7IH0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY291bnQ7IH0KKyAgICAgICAgICAgIHNldCB7IGNvdW50ID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWFwLmNzCmluZGV4IDVjOGQ2NTAuLmFiYTlkM2EgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcwpAQCAtMjcsMzYgKzI3LDM2IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRNYXAKLQl7Ci0JCXByaXZhdGUgVFR5cGUga2V5VHlwZTsKLQkJcHJpdmF0ZSBUVHlwZSB2YWx1ZVR5cGU7Ci0JCXByaXZhdGUgaW50IGNvdW50OworICAgIHB1YmxpYyBzdHJ1Y3QgVE1hcAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBUVHlwZSBrZXlUeXBlOworICAgICAgICBwcml2YXRlIFRUeXBlIHZhbHVlVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQ7CiAKLQkJcHVibGljIFRNYXAoVFR5cGUga2V5VHlwZSwgVFR5cGUgdmFsdWVUeXBlLCBpbnQgY291bnQpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMua2V5VHlwZSA9IGtleVR5cGU7Ci0JCQl0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJfQorICAgICAgICBwdWJsaWMgVE1hcChUVHlwZSBrZXlUeXBlLCBUVHlwZSB2YWx1ZVR5cGUsIGludCBjb3VudCkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5rZXlUeXBlID0ga2V5VHlwZTsKKyAgICAgICAgICAgIHRoaXMudmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OworICAgICAgICB9CiAKLQkJcHVibGljIFRUeXBlIEtleVR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGtleVR5cGU7IH0KLQkJCXNldCB7IGtleVR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUVHlwZSBLZXlUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBrZXlUeXBlOyB9CisgICAgICAgICAgICBzZXQgeyBrZXlUeXBlID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHlwZSBWYWx1ZVR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHZhbHVlVHlwZTsgfQotCQkJc2V0IHsgdmFsdWVUeXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVFR5cGUgVmFsdWVUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB2YWx1ZVR5cGU7IH0KKyAgICAgICAgICAgIHNldCB7IHZhbHVlVHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IENvdW50Ci0JCXsKLQkJCWdldCB7IHJldHVybiBjb3VudDsgfQotCQkJc2V0IHsgY291bnQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjb3VudDsgfQorICAgICAgICAgICAgc2V0IHsgY291bnQgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcwppbmRleCA4ZTk2ZGE1Li4zNDgyNjNjIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcwpAQCAtMjcsMzYgKzI3LDM2IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRNZXNzYWdlCi0JewotCQlwcml2YXRlIHN0cmluZyBuYW1lOwotCQlwcml2YXRlIFRNZXNzYWdlVHlwZSB0eXBlOwotCQlwcml2YXRlIGludCBzZXFJRDsKKyAgICBwdWJsaWMgc3RydWN0IFRNZXNzYWdlCisgICAgeworICAgICAgICBwcml2YXRlIHN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFRNZXNzYWdlVHlwZSB0eXBlOworICAgICAgICBwcml2YXRlIGludCBzZXFJRDsKIAotCQlwdWJsaWMgVE1lc3NhZ2Uoc3RyaW5nIG5hbWUsIFRNZXNzYWdlVHlwZSB0eXBlLCBpbnQgc2VxaWQpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5zZXFJRCA9IHNlcWlkOwotCQl9CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLnNlcUlEID0gc2VxaWQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RyaW5nIE5hbWUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIG5hbWU7IH0KLQkJCXNldCB7IG5hbWUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmFtZTsgfQorICAgICAgICAgICAgc2V0IHsgbmFtZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVE1lc3NhZ2VUeXBlIFR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHR5cGU7IH0KLQkJCXNldCB7IHR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgdHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IFNlcUlECi0JCXsKLQkJCWdldCB7IHJldHVybiBzZXFJRDsgfQotCQkJc2V0IHsgc2VxSUQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IFNlcUlECisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBzZXFJRDsgfQorICAgICAgICAgICAgc2V0IHsgc2VxSUQgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCmluZGV4IGFiMDdjZjYuLmM3MDkxZmUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlVHlwZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MKQEAgLTIxLDExICsyMSwxMSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGVudW0gVE1lc3NhZ2VUeXBlCi0JewotCQlDYWxsID0gMSwKLQkJUmVwbHkgPSAyLAotCQlFeGNlcHRpb24gPSAzLAotCQlPbmV3YXkgPSA0Ci0JfQorICAgIHB1YmxpYyBlbnVtIFRNZXNzYWdlVHlwZQorICAgIHsKKyAgICAgICAgQ2FsbCA9IDEsCisgICAgICAgIFJlcGx5ID0gMiwKKyAgICAgICAgRXhjZXB0aW9uID0gMywKKyAgICAgICAgT25ld2F5ID0gNAorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTkxYzUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCkBAIC0wLDAgKzEsMTgzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIDxzZWUgY3JlZj0iVE11bHRpcGxleGVkUHJvY2Vzc29yIi8+IGlzIGEgPHNlZSBjcmVmPSJUUHJvY2Vzc29yIi8+IGFsbG93aW5nIGEgc2luZ2xlIDxzZWUgY3JlZj0iVGhyaWZ0LlNlcnZlci5UU2VydmVyIi8+CisgICAgLy8vIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gVG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgcHJvY2Vzc29ycyB3aXRoIGl0LAorICAgIC8vLyBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gPGNvZGU+CisgICAgLy8vICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgIC8vLworICAgIC8vLyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgIC8vLyAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAgICAvLy8gICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgICAvLy8gICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgICAgLy8vICAgICAgICAgbmV3IFdlYXRoZXJSZXBvcnQuUHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisgICAgLy8vCisgICAgLy8vICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAgICAvLy8gICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0KTsKKyAgICAvLy8KKyAgICAvLy8gICAgIHNlcnZlci5zZXJ2ZSgpOworICAgIC8vLyA8L2NvZGU+CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIDogVFByb2Nlc3NvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4gU2VydmljZVByb2Nlc3Nvck1hcCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4oKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiBUaGlzIGFsbG93cyB1cyB0byBicm9rZXIKKyAgICAgICAgLy8vIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgICAgIC8vLworICAgICAgICAvLy8gQXJnczoKKyAgICAgICAgLy8vIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAgICAvLy8gLSBwcm9jZXNzb3IgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgImhhbmRsZXJzIiwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgUmVnaXN0ZXJQcm9jZXNzb3Ioc3RyaW5nIHNlcnZpY2VOYW1lLCBUUHJvY2Vzc29yIHByb2Nlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmljZVByb2Nlc3Nvck1hcC5BZGQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBGYWlsKFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLCBzdHJpbmcgZXR4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihleHR5cGUsIGV0eHQpOworCisgICAgICAgICAgICBUTWVzc2FnZSBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKG1lc3NhZ2UuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbWVzc2FnZS5TZXFJRCk7CisKKyAgICAgICAgICAgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ld01lc3NhZ2UpOworICAgICAgICAgICAgYXBwZXguV3JpdGUob3Byb3QpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICAgIC8vLworICAgICAgICAvLy8gLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgIC8vLyAtIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLgorICAgICAgICAvLy8gLSBVc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLgorICAgICAgICAvLy8gLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAgICAvLy8gICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuCisgICAgICAgIC8vLyA8cGFyYS8+CisgICAgICAgIC8vLyBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmCisgICAgICAgIC8vLyAtIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLAorICAgICAgICAvLy8gLSB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yCisgICAgICAgIC8vLyAtIHRoZSBzZXJ2aWNlIG5hbWUgaGFzIG5vdCBiZWVuIFJlZ2lzdGVyUHJvY2Vzc29yKCllZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiAgVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAgICAgICAgICAgICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4gKi8KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsKKworICAgICAgICAgICAgICAgIGlmICgobWVzc2FnZS5UeXBlICE9IFRNZXNzYWdlVHlwZS5DYWxsKSAmJiAobWVzc2FnZS5UeXBlICE9IFRNZXNzYWdlVHlwZS5PbmV3YXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSB0eXBlIENBTEwgb3IgT05FV0FZIGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtZXNzYWdlLk5hbWUuSW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGYWlsKG9wcm90LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG1lc3NhZ2UuTmFtZSArICIuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIHlvdSBmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgICAgICAgICAgICAgIHN0cmluZyBzZXJ2aWNlTmFtZSA9IG1lc3NhZ2UuTmFtZS5TdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgYWN0dWFsUHJvY2Vzc29yOworICAgICAgICAgICAgICAgIGlmICghU2VydmljZVByb2Nlc3Nvck1hcC5UcnlHZXRWYWx1ZShzZXJ2aWNlTmFtZSwgb3V0IGFjdHVhbFByb2Nlc3NvcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGYWlsKG9wcm90LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byBjYWxsIFJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICBUTWVzc2FnZSBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lLlN1YnN0cmluZyhzZXJ2aWNlTmFtZS5MZW5ndGggKyBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQpOworCisgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxQcm9jZXNzb3IuUHJvY2VzcyhuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBuZXdNZXNzYWdlKSwgb3Byb3QpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gc2ltaWxhciB0byBhbGwgb3RoZXIgcHJvY2Vzc29ycworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuICBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAgICAgICAgLy8vICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5CisgICAgICAgIC8vLyAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgICAgICB7CisgICAgICAgICAgICBUTWVzc2FnZSBNc2dCZWdpbjsKKworICAgICAgICAgICAgcHVibGljIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFRNZXNzYWdlIG1lc3NhZ2VCZWdpbikKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5Nc2dCZWdpbiA9IG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBNc2dCZWdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmQ0MjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MKQEAgLTAsMCArMSwxMDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICAgIC8vLyBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAvLy8gdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIE5PVEU6IFRISVMgSVMgTk9UIFRPIEJFIFVTRUQgQlkgU0VSVkVSUy4KKyAgICAvLy8gT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgIC8vLyAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICAgIC8vLyAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgICAgLy8vCisgICAgLy8vICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgLy8vICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICAgIC8vLworICAgIC8vLyAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgIC8vLyAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICAgIC8vLyA8L2NvZGU+CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICB7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlZCB0byBkZWxpbWl0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgU0VQQVJBVE9SID0gIjoiOworCisgICAgICAgIHByaXZhdGUgc3RyaW5nIFNlcnZpY2VOYW1lOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgICAgLy8vIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPHBhcmFtcmVmIG5hbWU9InNlcnZpY2VOYW1lIi8+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCisgICAgICAgIC8vLyBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgICAgICAvLy8gdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvY29sIj5Zb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIDxzZWUgY3JlZj0iVEJpbmFyeVByb3RvY29sIi8+LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VydmljZU5hbWUiPlRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBzdHJpbmcgc2VydmljZU5hbWUpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRNZXNzYWdlIj5UaGUgb3JpZ2luYWwgbWVzc2FnZS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSB0TWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0TWVzc2FnZS5UeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLkNhbGw6CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuT25ld2F5OgorICAgICAgICAgICAgICAgICAgICBiYXNlLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgdE1lc3NhZ2UuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRNZXNzYWdlLlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0TWVzc2FnZS5TZXFJRCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJhc2UuV3JpdGVNZXNzYWdlQmVnaW4odE1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwppbmRleCAyN2M3ZGMxLi5kZDdhNmUwIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCkBAIC0yNyw2NSArMjcsMTE2IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sCi0JewotCQlwcm90ZWN0ZWQgVFRyYW5zcG9ydCB0cmFuczsKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sIDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIID0gNjQ7CiAKLQkJcHJvdGVjdGVkIFRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQotCQl7Ci0JCQl0aGlzLnRyYW5zID0gdHJhbnM7Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgdHJhbnM7CisgICAgICAgIHByb3RlY3RlZCBpbnQgcmVjdXJzaW9uTGltaXQ7CisgICAgICAgIHByb3RlY3RlZCBpbnQgcmVjdXJzaW9uRGVwdGg7CiAKLQkJcHVibGljIFRUcmFuc3BvcnQgVHJhbnNwb3J0Ci0JCXsKLQkJCWdldCB7IHJldHVybiB0cmFuczsgfQotCQl9CisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50cmFucyA9IHRyYW5zOworICAgICAgICAgICAgdGhpcy5yZWN1cnNpb25MaW1pdCA9IERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIOworICAgICAgICAgICAgdGhpcy5yZWN1cnNpb25EZXB0aCA9IDA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNZXNzYWdlRW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Yyk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU3RydWN0RW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUZpZWxkRW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRTdG9wKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1hcEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVMaXN0RW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVNldEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJvb2woYm9vbCBiKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCeXRlKGJ5dGUgYik7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNik7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTMyKGludCBpMzIpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUk2NChsb25nIGk2NCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKTsKLQkJcHVibGljIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpIHsKLQkJCVdyaXRlQmluYXJ5KEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocykpOwotCQl9Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiKTsKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0cmFuczsgfQorICAgICAgICB9CiAKLQkJcHVibGljIGFic3RyYWN0IFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZE1lc3NhZ2VFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRTdHJ1Y3RFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRGaWVsZCBSZWFkRmllbGRCZWdpbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkRmllbGRFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRNYXAgUmVhZE1hcEJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRNYXBFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRMaXN0IFJlYWRMaXN0QmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZExpc3RFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IFRTZXQgUmVhZFNldEJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRTZXRFbmQoKTsKLQkJcHVibGljIGFic3RyYWN0IGJvb2wgUmVhZEJvb2woKTsKLQkJcHVibGljIGFic3RyYWN0IGJ5dGUgUmVhZEJ5dGUoKTsKLQkJcHVibGljIGFic3RyYWN0IHNob3J0IFJlYWRJMTYoKTsKLQkJcHVibGljIGFic3RyYWN0IGludCBSZWFkSTMyKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCBsb25nIFJlYWRJNjQoKTsKLQkJcHVibGljIGFic3RyYWN0IGRvdWJsZSBSZWFkRG91YmxlKCk7Ci0JCXB1YmxpYyBzdHJpbmcgUmVhZFN0cmluZygpIHsKLQkJICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhSZWFkQmluYXJ5KCkpOwotCQl9Ci0JCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gUmVhZEJpbmFyeSgpOwotCX0KKyAgICAgICAgcHVibGljIGludCBSZWN1cnNpb25MaW1pdAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gcmVjdXJzaW9uTGltaXQ7IH0KKyAgICAgICAgICAgIHNldCB7IHJlY3Vyc2lvbkxpbWl0ID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlY3Vyc2lvbkRlcHRoIDwgcmVjdXJzaW9uTGltaXQpCisgICAgICAgICAgICAgICAgKytyZWN1cnNpb25EZXB0aDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5ERVBUSF9MSU1JVCwgIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC0tcmVjdXJzaW9uRGVwdGg7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcG9zZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zIGlzIElEaXNwb3NhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgKHRyYW5zIGFzIElEaXNwb3NhYmxlKS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Yyk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU3RydWN0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUZpZWxkRW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1hcEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVMaXN0RW5kKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVNldEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJvb2woYm9vbCBiKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUkxNihzaG9ydCBpMTYpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUkzMihpbnQgaTMyKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZCk7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQmluYXJ5KEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocykpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTWVzc2FnZUVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZFN0cnVjdEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRGaWVsZEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVE1hcCBSZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZE1hcEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVExpc3QgUmVhZExpc3RCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTGlzdEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVFNldCBSZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZFNldEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBSZWFkQm9vbCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgc2J5dGUgUmVhZEJ5dGUoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHNob3J0IFJlYWRJMTYoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBSZWFkSTMyKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIFJlYWRJNjQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBSZWFkRG91YmxlKCk7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRCaW5hcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gUmVhZEJpbmFyeSgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjAwMDAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCkBAIC0wLDAgKzEsMjYxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIDxzZWUgY3JlZj0iVFByb3RvY29sRGVjb3JhdG9yIi8+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCA8c2VlIGNyZWY9IlRQcm90b2NvbCIvPiBpbnN0YW5jZSwKKyAgICAvLy8gcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiBXaGlsZSBpdCBoYXMKKyAgICAvLy8gbm8gYWJzdHJhY3QgbWV0aG9kcywgaXQgaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsCisgICAgLy8vIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCA8c2VlIGNyZWY9IlRQcm90b2NvbCIvPi4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBTZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iVE11bHRpcGxleGVkUHJvdG9jb2wiLz4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIFRQcm90b2NvbCBXcmFwcGVkUHJvdG9jb2w7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm90b2NvbCI+QWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sLlRyYW5zcG9ydCkKKyAgICAgICAgeworCisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4odE1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRTdHJ1Y3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luKHRTdHJ1Y3QpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgdEZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luKHRGaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgdE1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW4odE1hcCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgdExpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RCZWdpbih0TGlzdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgdFNldCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlU2V0QmVnaW4odFNldCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlQm9vbChiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVCeXRlKGIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlSTE2KGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUkzMihpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgbCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlSTY0KGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZURvdWJsZSh2KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmcocyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUJpbmFyeShieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRNYXBCZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5SZWFkTWFwRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RCZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLlJlYWRTZXRFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRCb29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkQm9vbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkQnl0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRJMTYoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEkzMigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEk2NCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkRG91YmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEJpbmFyeSgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKaW5kZXggZDU3MGJiOC4uYzBmMDA3ZSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpAQCAtMjUsNDEgKzI1LDQzIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQljbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBFeGNlcHRpb24KLQl7Ci0JCXB1YmxpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7Ci0JCXB1YmxpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKLQkJcHVibGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKLQkJcHVibGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKLQkJcHVibGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgICAgcHVibGljIGNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERVBUSF9MSU1JVCA9IDY7CiAKLQkJcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CisgICAgICAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOwogCi0JCXB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oKQotCQkJOiBiYXNlKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSkKLQkJCTogYmFzZSgpCi0JCXsKLQkJCXR5cGVfID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlKQorICAgICAgICAgICAgOiBiYXNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZV8gPSB0eXBlOworICAgICAgICB9CiAKLQkJcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpCi0JCQk6IGJhc2UobWVzc2FnZSkKLQkJewotCQkJdHlwZV8gPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUsIHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlXyA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQotCQkJOiBiYXNlKG1lc3NhZ2UpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IGdldFR5cGUoKQotCQl7Ci0JCQlyZXR1cm4gdHlwZV87Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlXzsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzCmluZGV4IGViYzczNjcuLjcxMzYwYTEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcwpAQCAtMjYsOCArMjYsOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5Ci0JewotCQlUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucyk7Ci0JfQorICAgIHB1YmxpYyBpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeQorICAgIHsKKyAgICAgICAgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCmluZGV4IDgyY2QzZTMuLmQ5OTVjNmMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcwpAQCAtMjUsNzQgKzI1LDg0IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRQcm90b2NvbFV0aWwKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgdm9pZCBTa2lwKFRQcm90b2NvbCBwcm90LCBUVHlwZSB0eXBlKQotCQl7Ci0JCQlzd2l0Y2ggKHR5cGUpCi0JCQl7Ci0JCQkJY2FzZSBUVHlwZS5Cb29sOgotCQkJCQlwcm90LlJlYWRCb29sKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuQnl0ZToKLQkJCQkJcHJvdC5SZWFkQnl0ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkkxNjoKLQkJCQkJcHJvdC5SZWFkSTE2KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuSTMyOgotCQkJCQlwcm90LlJlYWRJMzIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5JNjQ6Ci0JCQkJCXByb3QuUmVhZEk2NCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkRvdWJsZToKLQkJCQkJcHJvdC5SZWFkRG91YmxlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuU3RyaW5nOgotCQkJCQkvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KLQkJCQkJcHJvdC5SZWFkQmluYXJ5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuU3RydWN0OgotCQkJCQlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOwotCQkJCQl3aGlsZSAodHJ1ZSkKLQkJCQkJewotCQkJCQkJVEZpZWxkIGZpZWxkID0gcHJvdC5SZWFkRmllbGRCZWdpbigpOwotCQkJCQkJaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKLQkJCQkJCXsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCVNraXAocHJvdCwgZmllbGQuVHlwZSk7Ci0JCQkJCQlwcm90LlJlYWRGaWVsZEVuZCgpOwotCQkJCQl9Ci0JCQkJCXByb3QuUmVhZFN0cnVjdEVuZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLk1hcDoKLQkJCQkJVE1hcCBtYXAgPSBwcm90LlJlYWRNYXBCZWdpbigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcC5Db3VudDsgaSsrKQotCQkJCQl7Ci0JCQkJCQlTa2lwKHByb3QsIG1hcC5LZXlUeXBlKTsKLQkJCQkJCVNraXAocHJvdCwgbWFwLlZhbHVlVHlwZSk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5SZWFkTWFwRW5kKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuU2V0OgotCQkJCQlUU2V0IHNldCA9IHByb3QuUmVhZFNldEJlZ2luKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2V0LkNvdW50OyBpKyspCi0JCQkJCXsKLQkJCQkJCVNraXAocHJvdCwgc2V0LkVsZW1lbnRUeXBlKTsKLQkJCQkJfQotCQkJCQlwcm90LlJlYWRTZXRFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5MaXN0OgotCQkJCQlUTGlzdCBsaXN0ID0gcHJvdC5SZWFkTGlzdEJlZ2luKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQotCQkJCQl7Ci0JCQkJCQlTa2lwKHByb3QsIGxpc3QuRWxlbWVudFR5cGUpOwotCQkJCQl9Ci0JCQkJCXByb3QuUmVhZExpc3RFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUUHJvdG9jb2xVdGlsCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgU2tpcChUUHJvdG9jb2wgcHJvdCwgVFR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkQm9vbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQnl0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEkxNigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkSTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZERvdWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGRlY29kZSB0aGUgc3RyaW5nLCBqdXN0IHNraXAgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRCaW5hcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cnVjdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBURmllbGQgZmllbGQgPSBwcm90LlJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIGZpZWxkLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1hcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRNYXAgbWFwID0gcHJvdC5SZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcChwcm90LCBtYXAuS2V5VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpcChwcm90LCBtYXAuVmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZE1hcEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgVFNldCBzZXQgPSBwcm90LlJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXQuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIHNldC5FbGVtZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRTZXRFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBUTGlzdCBsaXN0ID0gcHJvdC5SZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIGxpc3QuRWxlbWVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJVbmtub3duIGRhdGEgdHlwZSAiICsgdHlwZS5Ub1N0cmluZygiZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKaW5kZXggYWZmN2Y2NS4uYTkxOGFiNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU2V0LmNzCkBAIC0yNywyOCArMjcsMzMgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVFNldAotCXsKLQkJcHJpdmF0ZSBUVHlwZSBlbGVtZW50VHlwZTsKLQkJcHJpdmF0ZSBpbnQgY291bnQ7CisgICAgcHVibGljIHN0cnVjdCBUU2V0CisgICAgeworICAgICAgICBwcml2YXRlIFRUeXBlIGVsZW1lbnRUeXBlOworICAgICAgICBwcml2YXRlIGludCBjb3VudDsKIAotCQlwdWJsaWMgVFNldChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTZXQoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OworICAgICAgICB9CiAKLQkJcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiBlbGVtZW50VHlwZTsgfQotCQkJc2V0IHsgZWxlbWVudFR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUU2V0KFRMaXN0IGxpc3QpCisgICAgICAgICAgICA6IHRoaXMobGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIGludCBDb3VudAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gY291bnQ7IH0KLQkJCXNldCB7IGNvdW50ID0gdmFsdWU7IH0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBlbGVtZW50VHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgZWxlbWVudFR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY291bnQ7IH0KKyAgICAgICAgICAgIHNldCB7IGNvdW50ID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzCmluZGV4IDM3ZDExMDYuLmY0ODQ0YTQgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcwpAQCAtMjcsMjAgKzI3LDIwIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKLQl7Ci0JCXByaXZhdGUgc3RyaW5nIG5hbWU7CisgICAgcHVibGljIHN0cnVjdCBUU3RydWN0CisgICAgeworICAgICAgICBwcml2YXRlIHN0cmluZyBuYW1lOwogCi0JCXB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQotCQkJOnRoaXMoKQotCQl7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9CisgICAgICAgIHB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CiAKLQkJcHVibGljIHN0cmluZyBOYW1lCi0JCXsKLQkJCWdldCB7IHJldHVybiBuYW1lOyB9Ci0JCQlzZXQgeyBuYW1lID0gdmFsdWU7IH0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBuYW1lOyB9CisgICAgICAgICAgICBzZXQgeyBuYW1lID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RUeXBlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MKaW5kZXggZWZjN2JlZi4uOWNlOTE1ZSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MKQEAgLTI1LDIwICsyNSwyMCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGVudW0gVFR5cGUgOiBieXRlCi0JewotCQlTdG9wID0gMCwKLQkJVm9pZCA9IDEsCi0JCUJvb2wgPSAyLAotCQlCeXRlID0gMywKLQkJRG91YmxlID0gNCwKLQkJSTE2ID0gNiwKLQkJSTMyID0gOCwKLQkJSTY0ID0gMTAsCi0JCVN0cmluZyA9IDExLAotCQlTdHJ1Y3QgPSAxMiwKLQkJTWFwID0gMTMsCi0JCVNldCA9IDE0LAotCQlMaXN0ID0gMTUKLQl9CisgICAgcHVibGljIGVudW0gVFR5cGUgOiBieXRlCisgICAgeworICAgICAgICBTdG9wID0gMCwKKyAgICAgICAgVm9pZCA9IDEsCisgICAgICAgIEJvb2wgPSAyLAorICAgICAgICBCeXRlID0gMywKKyAgICAgICAgRG91YmxlID0gNCwKKyAgICAgICAgSTE2ID0gNiwKKyAgICAgICAgSTMyID0gOCwKKyAgICAgICAgSTY0ID0gMTAsCisgICAgICAgIFN0cmluZyA9IDExLAorICAgICAgICBTdHJ1Y3QgPSAxMiwKKyAgICAgICAgTWFwID0gMTMsCisgICAgICAgIFNldCA9IDE0LAorICAgICAgICBMaXN0ID0gMTUKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCmluZGV4IDdiZjI3NDcuLjJiYzA0ZjMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzCkBAIC0yOCwxMTIgKzI4LDEyOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyCi0JewotCQkvKioKLQkJICogQ29yZSBwcm9jZXNzb3IKLQkJICovCi0JCXByb3RlY3RlZCBUUHJvY2Vzc29yIHByb2Nlc3NvcjsKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgorICAgIHsKKyAgICAgICAgLy9BdHRyaWJ1dGVzCisgICAgICAgIHByb3RlY3RlZCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudEhhbmRsZXIgPSBudWxsOwogCi0JCS8qKgotCQkgKiBTZXJ2ZXIgdHJhbnNwb3J0Ci0JCSAqLwotCQlwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgIC8vTWV0aG9kcworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFdmVudEhhbmRsZXIoVFNlcnZlckV2ZW50SGFuZGxlciBzZWgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlciA9IHNlaDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyOworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIElucHV0IFRyYW5zcG9ydCBGYWN0b3J5Ci0JCSAqLwotCQlwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAvL0xvZyBkZWxlZ2F0aW9uCisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIExvZ0RlbGVnYXRlKHN0cmluZyBzdHIpOworICAgICAgICBwcml2YXRlIExvZ0RlbGVnYXRlIF9sb2dEZWxlZ2F0ZTsKKyAgICAgICAgcHJvdGVjdGVkIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBfbG9nRGVsZWdhdGU7IH0KKyAgICAgICAgICAgIHNldCB7IF9sb2dEZWxlZ2F0ZSA9ICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogRGVmYXVsdExvZ0RlbGVnYXRlOyB9CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIERlZmF1bHRMb2dEZWxlZ2F0ZShzdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUocyk7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogT3V0cHV0IFRyYW5zcG9ydCBGYWN0b3J5Ci0JCSAqLwotCQlwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgLy9Db25zdHJ1Y3Rpb24KKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogSW5wdXQgUHJvdG9jb2wgRmFjdG9yeQotCQkgKi8KLQkJcHJvdGVjdGVkIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogT3V0cHV0IFByb3RvY29sIEZhY3RvcnkKLQkJICovCi0JCXByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeTsKLQkJcHVibGljIGRlbGVnYXRlIHZvaWQgTG9nRGVsZWdhdGUoc3RyaW5nIHN0cik7Ci0JCXByb3RlY3RlZCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZTsKKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJLyoqCi0JCSAqIERlZmF1bHQgY29uc3RydWN0b3JzLgotCQkgKi8KKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotCQkJOnRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKTsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCVRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0JCQk6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yRmFjdG9yeSA9IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5sb2dEZWxlZ2F0ZSA9IChsb2dEZWxlZ2F0ZSAhPSBudWxsKSA/IGxvZ0RlbGVnYXRlIDogRGVmYXVsdExvZ0RlbGVnYXRlOworICAgICAgICB9CiAKLQkJcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQotCQkJOnRoaXMocHJvY2Vzc29yLAotCQkJCSBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotCQkJOnRoaXMocHJvY2Vzc29yLAotCQkJCSBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LAotCQkJICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCSAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0JCXsKLQkJCXRoaXMucHJvY2Vzc29yID0gcHJvY2Vzc29yOwotCQkJdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7Ci0JCQl0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLQkJCXRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0JCQl0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0JCQl0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKLQkJCXRoaXMubG9nRGVsZWdhdGUgPSBsb2dEZWxlZ2F0ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgcnVuIG1ldGhvZCBmaXJlcyB1cCB0aGUgc2VydmVyIGFuZCBnZXRzIHRoaW5ncyBnb2luZy4KLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFNlcnZlKCk7Ci0KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgU3RvcCgpOwotCi0JCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBEZWZhdWx0TG9nRGVsZWdhdGUoc3RyaW5nIHMpCi0JCXsKLQkJCUNvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKHMpOwotCQl9Ci0JfQorICAgICAgICAvL0Fic3RyYWN0IEludGVyZmFjZQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXJ2ZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTdG9wKCk7CisgICAgfQogfQotCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MWVmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwpAQCAtMCwwICsxLDUzIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlci4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBwcmVTZXJ2ZSgpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBvYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gZGVsZXRlIHNlcnZlciBjb250ZXh0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIGRlbGV0ZUNvbnRleHQob2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgcHJvY2Vzc0NvbnRleHQob2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpOworICAgIH07Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCmluZGV4IGM2ZmQ5OWUuLjRlN2VhOTYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzCkBAIC0yNywxMjYgKzI3LDE1NCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUU2ltcGxlU2VydmVyIDogVFNlcnZlcgotCXsKLQkJcHJpdmF0ZSBib29sIHN0b3AgPSBmYWxzZTsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyIGZvciB0ZXN0aW5nLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBUU2VydmVyCisgICAgeworICAgICAgICBwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOwogCi0JCXB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLQkJCTpiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCVRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCUxvZ0RlbGVnYXRlIGxvZ0RlbCkKLQkJCTogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIGxvZ0RlbCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbG9nRGVsKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCi0JCQk6YmFzZShwcm9jZXNzb3IsCi0JCQkJIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCSAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0JCQk6YmFzZShwcm9jZXNzb3IsCi0JCQkJIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksCi0JCQkJIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOwotCQkJfQotCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJewotCQkJCWxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkJd2hpbGUgKCFzdG9wKQotCQkJewotCQkJCVRUcmFuc3BvcnQgY2xpZW50ID0gbnVsbDsKLQkJCQlUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCQlUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7Ci0JCQkJVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwotCQkJCVRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQljbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7Ci0JCQkJCWlmIChjbGllbnQgIT0gbnVsbCkKLQkJCQkJewotCQkJCQkJaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0JCQkJCQlvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCQkJaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLQkJCQkJCW91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0JCQkJCQl3aGlsZSAocHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7IH0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQkJewotCQkJCQkvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCi0JCQkJCWlmIChzdG9wKQotCQkJCQl7Ci0JCQkJCQlsb2dEZWxlZ2F0ZSgiVFNpbXBsZVNlcnZlciB3YXMgc2h1dHRpbmcgZG93biwgY2F1Z2h0ICIgKyB0dHguR2V0VHlwZSgpLk5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24geCkKLQkJCQl7Ci0JCQkJCWxvZ0RlbGVnYXRlKHguVG9TdHJpbmcoKSk7Ci0JCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQkJaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQkJewotCQkJCQlpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOwotCQkJCX0KKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOwogCi0JCQkJaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQotCQkJCXsKLQkJCQkJb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAoY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKIAotCQkJaWYgKHN0b3ApCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJbG9nRGVsZWdhdGUoIlRTZXJ2ZXJUcmFucG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7Ci0JCQkJfQotCQkJCXN0b3AgPSBmYWxzZTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQotCQl7Ci0JCQlzdG9wID0gdHJ1ZTsKLQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCmluZGV4IGNmODM1NGUuLmE0OTRjZTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKQEAgLTI4LDE2MyArMjgsMjY4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIGJ1aWx0LWluIFRocmVhZFBvb2wgdG8gc3Bhd24gdGhyZWFkcyB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBUU2VydmVyCi0JewotCQlwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01JTl9USFJFQURTID0gMTA7Ci0JCXByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0JCXByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIGJ1aWx0LWluIFRocmVhZFBvb2wgdG8gc3Bhd24gdGhyZWFkcyB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogVFNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NSU5fVEhSRUFEUyA9IC0xOyAgLy8gdXNlIC5ORVQgVGhyZWFkUG9vbCBkZWZhdWx0cworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gLTE7ICAvLyB1c2UgLk5FVCBUaHJlYWRQb29sIGRlZmF1bHRzCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CiAKLQkJcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLQkJCTp0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgREVGQVVMVF9NSU5fVEhSRUFEUywgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIHN0cnVjdCBDb25maWd1cmF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluV29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWF4V29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluSU9UaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNYXhJT1RocmVhZHM7CiAKLQkJcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0JCQk6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBsb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvbihpbnQgbWluID0gREVGQVVMVF9NSU5fVEhSRUFEUywgaW50IG1heCA9IERFRkFVTFRfTUFYX1RIUkVBRFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhXb3JrZXJUaHJlYWRzID0gbWF4OworICAgICAgICAgICAgICAgIE1pbklPVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhJT1RocmVhZHMgPSBtYXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uKGludCBtaW5Xb3JrLCBpbnQgbWF4V29yaywgaW50IG1pbklPLCBpbnQgbWF4SU8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbldvcms7CisgICAgICAgICAgICAgICAgTWF4V29ya2VyVGhyZWFkcyA9IG1heFdvcms7CisgICAgICAgICAgICAgICAgTWluSU9UaHJlYWRzID0gbWluSU87CisgICAgICAgICAgICAgICAgTWF4SU9UaHJlYWRzID0gbWF4SU87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW50IG1pblRocmVhZFBvb2xUaHJlYWRzLCBpbnQgbWF4VGhyZWFkUG9vbFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKG1pblRocmVhZFBvb2xUaHJlYWRzLCBtYXhUaHJlYWRQb29sVGhyZWFkcyksCisgICAgICAgICAgICAgbG9nRGVsKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gdGhyZWFkQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NrICh0eXBlb2YoVFRocmVhZFBvb2xTZXJ2ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhyZWFkQ29uZmlnLk1heFdvcmtlclRocmVhZHMgPiAwKSB8fCAodGhyZWFkQ29uZmlnLk1heElPVGhyZWFkcyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHdvcmssIGNvbW07CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuR2V0TWF4VGhyZWFkcyhvdXQgd29yaywgb3V0IGNvbW0pOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1heFdvcmtlclRocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgd29yayA9IHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1heElPVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tID0gdGhyZWFkQ29uZmlnLk1heElPVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1heFRocmVhZHMod29yaywgY29tbSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcjogY291bGQgbm90IFNldE1heFRocmVhZHMgaW4gVGhyZWFkUG9vbCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhyZWFkQ29uZmlnLk1pbldvcmtlclRocmVhZHMgPiAwKSB8fCAodGhyZWFkQ29uZmlnLk1pbklPVGhyZWFkcyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHdvcmssIGNvbW07CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuR2V0TWluVGhyZWFkcyhvdXQgd29yaywgb3V0IGNvbW0pOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1pbldvcmtlclRocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgd29yayA9IHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkQ29uZmlnLk1pbklPVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tID0gdGhyZWFkQ29uZmlnLk1pbklPVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1pblRocmVhZHMod29yaywgY29tbSkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcjogY291bGQgbm90IFNldE1pblRocmVhZHMgaW4gVGhyZWFkUG9vbCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAKLQkJcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCQkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0JCQk6dGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0JCQkJIERFRkFVTFRfTUlOX1RIUkVBRFMsIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSBuZXcgVGhyZWFkUG9vbCB0aHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCQkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJCQkgaW50IG1pblRocmVhZFBvb2xUaHJlYWRzLCBpbnQgbWF4VGhyZWFkUG9vbFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKLQkJCTpiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCi0JCXsKLQkJCWlmICghVGhyZWFkUG9vbC5TZXRNaW5UaHJlYWRzKG1pblRocmVhZFBvb2xUaHJlYWRzLCBtaW5UaHJlYWRQb29sVGhyZWFkcykpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKLQkJCX0KLQkJCWlmICghVGhyZWFkUG9vbC5TZXRNYXhUaHJlYWRzKG1heFRocmVhZFBvb2xUaHJlYWRzLCBtYXhUaHJlYWRQb29sVGhyZWFkcykpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNYXhUaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgLy9GaXJlIHRoZSBwcmVTZXJ2ZSBzZXJ2ZXIgZXZlbnQgd2hlbiBzZXJ2ZXIgaXMgdXAgYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCisgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVXNlIG5ldyBUaHJlYWRQb29sIHRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuUXVldWVVc2VyV29ya0l0ZW0odGhpcy5FeGVjdXRlLCBjbGllbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQl3aGlsZSAoIXN0b3ApCi0JCQl7Ci0JCQkJaW50IGZhaWx1cmVDb3VudCA9IDA7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKLQkJCQkJVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSh0aGlzLkV4ZWN1dGUsIGNsaWVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCWlmIChzdG9wKQotCQkJCQl7Ci0JCQkJCQlsb2dEZWxlZ2F0ZSgiVFRocmVhZFBvb2xTZXJ2ZXIgd2FzIHNodXR0aW5nIGRvd24sIGNhdWdodCAiICsgdHR4LkdldFR5cGUoKS5OYW1lKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCSsrZmFpbHVyZUNvdW50OwotCQkJCQkJbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotCQkJCQl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkJfQotCQkJfQorICAgICAgICAgICAgaWYgKHN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9wID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJaWYgKHN0b3ApCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJbG9nRGVsZWdhdGUoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOwotCQkJCX0KLQkJCQlzdG9wID0gZmFsc2U7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCisgICAgICAgIC8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUob2JqZWN0IHRocmVhZENvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgotCQkvLy8gdGhyZWFkQ29udGV4dCB3aWxsIGJlIGEgVFRyYW5zcG9ydCBpbnN0YW5jZQotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+Ci0JCXByaXZhdGUgdm9pZCBFeGVjdXRlKE9iamVjdCB0aHJlYWRDb250ZXh0KQotCQl7Ci0JCQlUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQ7Ci0JCQlUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCVRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCVRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLQkJCVRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0JCQl0cnkKLQkJCXsKLQkJCQlpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLQkJCQlvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCWlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0JCQkJb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQkJCQl3aGlsZSAocHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQotCQkJCXsKLQkJCQkJLy9rZWVwIHByb2Nlc3NpbmcgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCi0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCi0JCQl7Ci0JCQkJLy8gQXNzdW1lIHRoZSBjbGllbnQgZGllZCBhbmQgY29udGludWUgc2lsZW50bHkKLQkJCQkvL0NvbnNvbGUuV3JpdGVMaW5lKHR0eCk7Ci0JCQl9Ci0JCQkKLQkJCWNhdGNoIChFeGNlcHRpb24geCkKLQkJCXsKLQkJCQlsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKIAotCQkJaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQl7Ci0JCQkJaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCX0KLQkJCWlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKLQkJCXsKLQkJCQlvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCi0JCXsKLQkJCXN0b3AgPSB0cnVlOwotCQkJc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkaXNwb3NhYmxlIHN0dWZmIHNob3VsZCBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzCmluZGV4IDc1MjA2ZjEuLmNjMDUxYTMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcwpAQCAtMjYsMjA5ICsyNiwyNTcgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIFNlcnZlciB0aGF0IHVzZXMgQyMgdGhyZWFkcyAoYXMgb3Bwb3NlZCB0byB0aGUgVGhyZWFkUG9vbCkgd2hlbiBoYW5kbGluZyByZXF1ZXN0cwotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IFRTZXJ2ZXIKLQl7Ci0JCXByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0JCXByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7Ci0JCXByaXZhdGUgcmVhZG9ubHkgaW50IG1heFRocmVhZHM7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIHRocmVhZHMgKGFzIG9wcG9zZWQgdG8gdGhlIFRocmVhZFBvb2wpIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFRocmVhZGVkU2VydmVyIDogVFNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEUyA9IDEwMDsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbWF4VGhyZWFkczsKIAotCQlwcml2YXRlIFF1ZXVlPFRUcmFuc3BvcnQ+IGNsaWVudFF1ZXVlOwotCQlwcml2YXRlIFRIYXNoU2V0PFRocmVhZD4gY2xpZW50VGhyZWFkczsKLQkJcHJpdmF0ZSBvYmplY3QgY2xpZW50TG9jazsKLQkJcHJpdmF0ZSBUaHJlYWQgd29ya2VyVGhyZWFkOworICAgICAgICBwcml2YXRlIFF1ZXVlPFRUcmFuc3BvcnQ+IGNsaWVudFF1ZXVlOworICAgICAgICBwcml2YXRlIFRIYXNoU2V0PFRocmVhZD4gY2xpZW50VGhyZWFkczsKKyAgICAgICAgcHJpdmF0ZSBvYmplY3QgY2xpZW50TG9jazsKKyAgICAgICAgcHJpdmF0ZSBUaHJlYWQgd29ya2VyVGhyZWFkOwogCi0JCXB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotCQkJOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIGludCBDbGllbnRUaHJlYWRzQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNsaWVudFRocmVhZHMuQ291bnQ7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLQkJCTogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKIAotCQlwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCQkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0JCQk6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCQkJIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0JCQkJCQkJCSBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCQkJIGludCBtYXhUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0JCQk6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKLQkJewotCQkJdGhpcy5tYXhUaHJlYWRzID0gbWF4VGhyZWFkczsKLQkJCWNsaWVudFF1ZXVlID0gbmV3IFF1ZXVlPFRUcmFuc3BvcnQ+KCk7Ci0JCQljbGllbnRMb2NrID0gbmV3IG9iamVjdCgpOwotCQkJY2xpZW50VGhyZWFkcyA9IG5ldyBUSGFzaFNldDxUaHJlYWQ+KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW50IG1heFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tYXhUaHJlYWRzID0gbWF4VGhyZWFkczsKKyAgICAgICAgICAgIGNsaWVudFF1ZXVlID0gbmV3IFF1ZXVlPFRUcmFuc3BvcnQ+KCk7CisgICAgICAgICAgICBjbGllbnRMb2NrID0gbmV3IG9iamVjdCgpOworICAgICAgICAgICAgY2xpZW50VGhyZWFkcyA9IG5ldyBUSGFzaFNldDxUaHJlYWQ+KCk7CisgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBVc2UgbmV3IFRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24uIGJsb2NrIHVudGlsIG51bUNvbm5lY3Rpb25zIDwgbWF4VEhyZWFkcwotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCS8vc3RhcnQgd29ya2VyIHRocmVhZAotCQkJCXdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KEV4ZWN1dGUpKTsKLQkJCQl3b3JrZXJUaHJlYWQuU3RhcnQoKTsKLQkJCQlzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgbmV3IFRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24uIGJsb2NrIHVudGlsIG51bUNvbm5lY3Rpb25zICZsdDsgbWF4VGhyZWFkcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3N0YXJ0IHdvcmtlciB0aHJlYWQKKyAgICAgICAgICAgICAgICB3b3JrZXJUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBUaHJlYWRTdGFydChFeGVjdXRlKSk7CisgICAgICAgICAgICAgICAgd29ya2VyVGhyZWFkLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQkJd2hpbGUgKCFzdG9wKQotCQkJewotCQkJCWludCBmYWlsdXJlQ291bnQgPSAwOwotCQkJCXRyeQotCQkJCXsKLQkJCQkJVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7Ci0JCQkJCWxvY2sgKGNsaWVudExvY2spCi0JCQkJCXsKLQkJCQkJCWNsaWVudFF1ZXVlLkVucXVldWUoY2xpZW50KTsKLQkJCQkJCU1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJaWYgKHN0b3ApCi0JCQkJCXsKLQkJCQkJCWxvZ0RlbGVnYXRlKCJUVGhyZWFkUG9vbFNlcnZlciB3YXMgc2h1dHRpbmcgZG93biwgY2F1Z2h0ICIgKyB0dHgpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJKytmYWlsdXJlQ291bnQ7Ci0JCQkJCQlsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7Ci0JCQkJCX0KKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOwogCi0JCQkJfQotCQkJfQorICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFF1ZXVlLkVucXVldWUoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKytmYWlsdXJlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJaWYgKHN0b3ApCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJCXsKLQkJCQkJbG9nRGVsZWdhdGUoIlRTZXJ2ZVRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7Ci0JCQkJfQotCQkJCXN0b3AgPSBmYWxzZTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKLQkJLy8vIHRocmVhZENvbnRleHQgd2lsbCBiZSBhIFRUcmFuc3BvcnQgaW5zdGFuY2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ0aHJlYWRDb250ZXh0Ij48L3BhcmFtPgotCQlwcml2YXRlIHZvaWQgRXhlY3V0ZSgpCi0JCXsKLQkJCXdoaWxlICghc3RvcCkKLQkJCXsKLQkJCQlUVHJhbnNwb3J0IGNsaWVudDsKLQkJCQlUaHJlYWQgdDsKLQkJCQlsb2NrIChjbGllbnRMb2NrKQotCQkJCXsKLQkJCQkJLy9kb24ndCBkZXF1ZXVlIGlmIHRvbyBtYW55IGNvbm5lY3Rpb25zCi0JCQkJCXdoaWxlIChjbGllbnRUaHJlYWRzLkNvdW50ID49IG1heFRocmVhZHMpCi0JCQkJCXsKLQkJCQkJCU1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKLQkJCQkJfQorICAgICAgICAgICAgaWYgKHN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZVRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQkJCXdoaWxlIChjbGllbnRRdWV1ZS5Db3VudCA9PSAwKQotCQkJCQl7Ci0JCQkJCQlNb25pdG9yLldhaXQoY2xpZW50TG9jayk7Ci0JCQkJCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50OworICAgICAgICAgICAgICAgIFRocmVhZCB0OworICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IGRlcXVldWUgaWYgdG9vIG1hbnkgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNsaWVudFRocmVhZHMuQ291bnQgPj0gbWF4VGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5XYWl0KGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJY2xpZW50ID0gY2xpZW50UXVldWUuRGVxdWV1ZSgpOwotCQkJCQl0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFdvcmtlcikpOwotCQkJCQljbGllbnRUaHJlYWRzLkFkZCh0KTsKLQkJCQl9Ci0JCQkJLy9zdGFydCBwcm9jZXNzaW5nIHJlcXVlc3RzIGZyb20gY2xpZW50IG9uIG5ldyB0aHJlYWQKLQkJCQl0LlN0YXJ0KGNsaWVudCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNsaWVudFF1ZXVlLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBDbGllbnRXb3JrZXIoT2JqZWN0IGNvbnRleHQpCi0JCXsKLQkJCVRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpY29udGV4dDsKLQkJCVRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwotCQkJVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKLQkJCXRyeQotCQkJewotCQkJCWlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCW91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0JCQkJaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLQkJCQlvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCQkJCXdoaWxlIChwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCi0JCQkJewotCQkJCQkvL2tlZXAgcHJvY2Vzc2luZyByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKLQkJCXsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24geCkKLQkJCXsKLQkJCQlsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gY2xpZW50UXVldWUuRGVxdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFdvcmtlcikpOworICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRzLkFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9zdGFydCBwcm9jZXNzaW5nIHJlcXVlc3RzIGZyb20gY2xpZW50IG9uIG5ldyB0aHJlYWQKKyAgICAgICAgICAgICAgICB0LlN0YXJ0KGNsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQl7Ci0JCQkJaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCX0KLQkJCWlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKLQkJCXsKLQkJCQlvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIENsaWVudFdvcmtlcihvYmplY3QgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpY29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CiAKLQkJCWxvY2sgKGNsaWVudExvY2spCi0JCQl7Ci0JCQkJY2xpZW50VGhyZWFkcy5SZW1vdmUoVGhyZWFkLkN1cnJlbnRUaHJlYWQpOwotCQkJCU1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLQkJewotCQkJc3RvcCA9IHRydWU7Ci0JCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJCS8vY2xlYW4gdXAgYWxsIHRoZSB0aHJlYWRzIG15c2VsZgotCQkJd29ya2VyVGhyZWFkLkFib3J0KCk7Ci0JCQlmb3JlYWNoIChUaHJlYWQgdCBpbiBjbGllbnRUaHJlYWRzKQotCQkJewotCQkJCXQuQWJvcnQoKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRzLlJlbW92ZShUaHJlYWQuQ3VycmVudFRocmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DbG9zZSB0cmFuc3BvcnRzCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBzdHVmZiBzaG91bGQgYmUgZGlzcG9zZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIC8vY2xlYW4gdXAgYWxsIHRoZSB0aHJlYWRzIG15c2VsZgorICAgICAgICAgICAgd29ya2VyVGhyZWFkLkFib3J0KCk7CisgICAgICAgICAgICBmb3JlYWNoIChUaHJlYWQgdCBpbiBjbGllbnRUaHJlYWRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQuQWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyBiL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwppbmRleCBjYzI5ZjBhLi44ZGQ3YWU1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCkBAIC0yNiwxMTAgKzI2LDEyMSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0CiB7Ci0JcHVibGljIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgotCXsKLQkJcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZTsKKyAgICBwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZTsKIAotCQlwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKLQkJCTogYmFzZShtZXNzYWdlKQotCQl7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBudWxsKSAvLyBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgc2VyaWFsaXphYmxlLCBidXQgd2UgbmV2ZXIgc2VyaWFsaXplIElubmVyRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBSZWFkKFRQcm90b2NvbCBpcHJvdCkKLQkJewotCQkJVEZpZWxkIGZpZWxkOworICAgICAgICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBSZWFkKFRQcm90b2NvbCBpcHJvdCkKKyAgICAgICAgeworICAgICAgICAgICAgVEZpZWxkIGZpZWxkOwogCi0JCQlzdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCQlFeGNlcHRpb25UeXBlIHR5cGUgPSBFeGNlcHRpb25UeXBlLlVua25vd247CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICBFeGNlcHRpb25UeXBlIHR5cGUgPSBFeGNlcHRpb25UeXBlLlVua25vd247CiAKLQkJCXdoaWxlICh0cnVlKQotCQkJewotCQkJCWZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsKLQkJCQlpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQotCQkJCXsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorICAgICAgICAgICAgaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXN3aXRjaCAoZmllbGQuSUQpCi0JCQkJewotCQkJCQljYXNlIDE6Ci0JCQkJCQlpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdHJpbmcpCi0JCQkJCQl7Ci0JCQkJCQkJbWVzc2FnZSA9IGlwcm90LlJlYWRTdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCWlmIChmaWVsZC5UeXBlID09IFRUeXBlLkkzMikKLQkJCQkJCXsKLQkJCQkJCQl0eXBlID0gKEV4Y2VwdGlvblR5cGUpaXByb3QuUmVhZEkzMigpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCVRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7Ci0JCQkJCQlicmVhazsKLQkJCQl9CisgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5JRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QuUmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuSTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAoRXhjZXB0aW9uVHlwZSlpcHJvdC5SZWFkSTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWlwcm90LlJlYWRGaWVsZEVuZCgpOwotCQkJfQorICAgICAgICAgICAgICAgIGlwcm90LlJlYWRGaWVsZEVuZCgpOworICAgICAgICAgICAgfQogCi0JCQlpcHJvdC5SZWFkU3RydWN0RW5kKCk7CisgICAgICAgICAgICBpcHJvdC5SZWFkU3RydWN0RW5kKCk7CiAKLQkJCXJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpOwotCQl9CisgICAgICAgICAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkKLQkJewotCQkJVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKLQkJCVRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICAgICAgcHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KQorICAgICAgICB7CisgICAgICAgICAgICBUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgICAgICAgVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOwogCi0JCQlvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsKKyAgICAgICAgICAgIG9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOwogCi0JCQlpZiAoIVN0cmluZy5Jc051bGxPckVtcHR5KE1lc3NhZ2UpKQotCQkJewotCQkJCWZpZWxkLk5hbWUgPSAibWVzc2FnZSI7Ci0JCQkJZmllbGQuVHlwZSA9IFRUeXBlLlN0cmluZzsKLQkJCQlmaWVsZC5JRCA9IDE7Ci0JCQkJb3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsKLQkJCQlvcHJvdC5Xcml0ZVN0cmluZyhNZXNzYWdlKTsKLQkJCQlvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7Ci0JCQl9CisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KE1lc3NhZ2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLk5hbWUgPSAibWVzc2FnZSI7CisgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IDE7CisgICAgICAgICAgICAgICAgb3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsKKyAgICAgICAgICAgICAgICBvcHJvdC5Xcml0ZVN0cmluZyhNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CiAKLQkJCWZpZWxkLk5hbWUgPSAidHlwZSI7Ci0JCQlmaWVsZC5UeXBlID0gVFR5cGUuSTMyOwotCQkJZmllbGQuSUQgPSAyOwotCQkJb3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsKLQkJCW9wcm90LldyaXRlSTMyKChpbnQpdHlwZSk7Ci0JCQlvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7Ci0JCQlvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOwotCQkJb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsKLQkJfQorICAgICAgICAgICAgZmllbGQuTmFtZSA9ICJ0eXBlIjsKKyAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5JMzI7CisgICAgICAgICAgICBmaWVsZC5JRCA9IDI7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVJMzIoKGludCl0eXBlKTsKKyAgICAgICAgICAgIG9wcm90LldyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIG9wcm90LldyaXRlRmllbGRTdG9wKCk7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOworICAgICAgICB9CiAKLQkJcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQotCQl7Ci0JCQlVbmtub3duLAotCQkJVW5rbm93bk1ldGhvZCwKLQkJCUludmFsaWRNZXNzYWdlVHlwZSwKLQkJCVdyb25nTWV0aG9kTmFtZSwKLQkJCUJhZFNlcXVlbmNlSUQsCi0JCQlNaXNzaW5nUmVzdWx0Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBlbnVtIEV4Y2VwdGlvblR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVW5rbm93biwKKyAgICAgICAgICAgIFVua25vd25NZXRob2QsCisgICAgICAgICAgICBJbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgICBXcm9uZ01ldGhvZE5hbWUsCisgICAgICAgICAgICBCYWRTZXF1ZW5jZUlELAorICAgICAgICAgICAgTWlzc2luZ1Jlc3VsdCwKKyAgICAgICAgICAgIEludGVybmFsRXJyb3IsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yLAorICAgICAgICAgICAgSW52YWxpZFRyYW5zZm9ybSwKKyAgICAgICAgICAgIEludmFsaWRQcm90b2NvbCwKKyAgICAgICAgICAgIFVuc3VwcG9ydGVkQ2xpZW50VHlwZQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VwdGlvblR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVEFzeW5jUHJvY2Vzc29yLmNzIGIvbGliL2NzaGFycC9zcmMvVEFzeW5jUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDMyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwzOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJvY2Vzc2VzIGEgbWVzc2FnZSBhc3luY2hyb25vdXNseS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcm9jZXNzZXMgdGhlIG5leHQgcGFydCBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpcHJvdCI+VGhlIGlucHV0IHByb3RvY29sLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3Byb3QiPlRoZSBvdXRwdXQgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlcmUncyBtb3JlIHRvIHByb2Nlc3MsIGZhbHNlIG90aGVyd2lzZS48L3JldHVybnM+CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzIGIvbGliL2NzaGFycC9zcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjUyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcwpAQCAtMCwwICsxLDI5IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRDb250cm9sbGluZ0hhbmRsZXIKKyAgICB7CisgICAgICAgIFRTZXJ2ZXIgc2VydmVyIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzIGIvbGliL2NzaGFycC9zcmMvVEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTlhMjEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVEV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGNsYXNzIFRFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBURXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lcikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzIGIvbGliL2NzaGFycC9zcmMvVFByb2Nlc3Nvci5jcwppbmRleCBkYzFiNzk1Li43MWNlNzU1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MKQEAgLTI2LDggKzI2LDggQEAKIAogbmFtZXNwYWNlIFRocmlmdAogewotCXB1YmxpYyBpbnRlcmZhY2UgVFByb2Nlc3NvcgotCXsKLQkJYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsKLQl9CisgICAgcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yCisgICAgeworICAgICAgICBib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmNjMxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMzAgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRQcm9jZXNzb3JGYWN0b3J5CisgICAgeworICAgICAgICBUUHJvY2Vzc29yIEdldFByb2Nlc3NvcihUVHJhbnNwb3J0IHRyYW5zLCBUU2VydmVyIHNlcnZlciA9IG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0NzI2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsNTUgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVFByb3RvdHlwZVByb2Nlc3NvckZhY3Rvcnk8UCwgSD4gOiBUUHJvY2Vzc29yRmFjdG9yeSB3aGVyZSBQIDogVFByb2Nlc3NvcgorICAgIHsKKyAgICAgICAgb2JqZWN0W10gaGFuZGxlckFyZ3MgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZXJBcmdzID0gbmV3IG9iamVjdFswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeShwYXJhbXMgb2JqZWN0W10gaGFuZGxlckFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlckFyZ3MgPSBoYW5kbGVyQXJnczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvY2Vzc29yIEdldFByb2Nlc3NvcihUVHJhbnNwb3J0IHRyYW5zLCBUU2VydmVyIHNlcnZlciA9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEggaGFuZGxlciA9IChIKUFjdGl2YXRvci5DcmVhdGVJbnN0YW5jZSh0eXBlb2YoSCksIGhhbmRsZXJBcmdzKTsKKworICAgICAgICAgICAgVENvbnRyb2xsaW5nSGFuZGxlciBoYW5kbGVyU2VydmVyUmVmID0gaGFuZGxlciBhcyBUQ29udHJvbGxpbmdIYW5kbGVyOworICAgICAgICAgICAgaWYgKGhhbmRsZXJTZXJ2ZXJSZWYgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyU2VydmVyUmVmLnNlcnZlciA9IHNlcnZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UodHlwZW9mKFApLCBuZXcgb2JqZWN0W10geyBoYW5kbGVyIH0pIGFzIFRQcm9jZXNzb3I7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjg5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGNsYXNzIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5IDogVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFByb2Nlc3NvciBwcm9jZXNzb3JfOworCisgICAgICAgIHB1YmxpYyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShUUHJvY2Vzc29yIHByb2Nlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgcHJvY2Vzc29yXyA9IHByb2Nlc3NvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvY2Vzc29yIEdldFByb2Nlc3NvcihUVHJhbnNwb3J0IHRyYW5zLCBUU2VydmVyIHNlcnZlciA9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzb3JfOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVGhyaWZ0LjQ1LmNzcHJvaiBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC40NS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyOGIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC40NS5jc3Byb2oKQEAgLTAsMCArMSwxMjkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9qZWN0R3VpZD57RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0NDU8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7REVCVUc7TkVUNDU8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cG9ydGFibGU8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7TkVUNDU8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQ1NoYXJwIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUQ29sbGVjdGlvbnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVEhhc2hTZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEFic3RyYWN0QmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZTY0VXRpbHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRDb21wYWN0UHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEZpZWxkLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRKU09OUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVExpc3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1hcC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWVzc2FnZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWVzc2FnZVR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNdWx0aXBsZXhlZFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xEZWNvcmF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbEZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sVXRpbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTdHJ1Y3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFR5cGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTZXJ2ZXJFdmVudEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTaW1wbGVTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRBc3luY1Byb2Nlc3Nvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQ29udHJvbGxpbmdIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3Nvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxURnJhbWVkVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cENsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cFRhc2tBc3luY0hhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTZXJ2ZXJUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTaWx2ZXJsaWdodFNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldFZlcnNpb25pemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU3RyZWFtVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU2VydmVyU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEZvbGRlciBJbmNsdWRlPSJTZXJ2ZXJcQ29sbGVjdGlvbnNcIiAvPgorICAgIDxGb2xkZXIgSW5jbHVkZT0iU2VydmVyXFByb3RvY29sXCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvaiBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKaW5kZXggYWQ4OGYwOC4uYmY2NTU2OSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagorKysgYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCkBAIC0xLDQgKzEsNSBAQAot77u/PCEtLQor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMTYsNyArMTcsNyBAQAogICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgogICA8UHJvcGVydHlHcm91cD4KICAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KICAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CkBAIC0yOSw2NCArMzAsMTI4IEBACiAgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KICAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CiAgICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0PC9Sb290TmFtZXNwYWNlPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KICAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CiAgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KICAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CiAgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxEZWJ1Z1R5cGU+cG9ydGFibGU8L0RlYnVnVHlwZT4KICAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CiAgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPgorICAgIDwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KICAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4KICAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgogICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVENvbGxlY3Rpb25zLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRIYXNoU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5ldDM1XEV4dGVuc2lvbnNOZXQzNS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQWJzdHJhY3RCYXNlLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlNjRVdGlscy5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxURmllbGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTGlzdC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWFwLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbERlY29yYXRvci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRmFjdG9yeS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xVdGlsLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyRXZlbnRIYW5kbGVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2ltcGxlU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQ29udHJvbGxpbmdIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRFeGNlcHRpb24uY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3Nvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxURnJhbWVkVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cENsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU29ja2V0VmVyc2lvbml6ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTdHJlYW1UcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUTFNTZXJ2ZXJTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUTFNTb2NrZXQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRFeGNlcHRpb24uY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgogICA8L0l0ZW1Hcm91cD4KICAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NIQVJQLlRhcmdldHMiIC8+CiAgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KICAgICA8VmlzdWFsU3R1ZGlvIEFsbG93RXhpc3RpbmdGb2xkZXI9InRydWUiIC8+CiAgIDwvUHJvamVjdEV4dGVuc2lvbnM+Ci08L1Byb2plY3Q+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbiBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KaW5kZXggMjk1NTM3OS4uYTI5ZTQ2OCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgorKysgYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCkBAIC0xLDMzICsxLDE2IEBACi3vu78jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMAotIyBWaXN1YWwgU3R1ZGlvIDIwMDgKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCiBQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdCIsICJUaHJpZnQuY3Nwcm9qIiwgIns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9IgogRW5kUHJvamVjdAotUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRUZXN0IiwgIi4uXC4uXC4uXHRlc3RcY3NoYXJwXFRocmlmdFRlc3RcVGhyaWZ0VGVzdC5jc3Byb2oiLCAiezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30iCi0JUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9Ci0JRW5kUHJvamVjdFNlY3Rpb24KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0VGVzdCIsICIuLlx0ZXN0XFRocmlmdFRlc3RcVGhyaWZ0VGVzdC5jc3Byb2oiLCAiezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30iCiBFbmRQcm9qZWN0CiBQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdE1TQnVpbGRUYXNrIiwgIi4uXFRocmlmdE1TQnVpbGRUYXNrXFRocmlmdE1TQnVpbGRUYXNrLmNzcHJvaiIsICJ7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfSIKIEVuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0LjQ1IiwgIlRocmlmdC40NS5jc3Byb2oiLCAie0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdE1WQ1Rlc3QiLCAiLi5cdGVzdFxUaHJpZnRNVkNUZXN0XFRocmlmdE1WQ1Rlc3QuY3Nwcm9qIiwgIns4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9IgorRW5kUHJvamVjdAogR2xvYmFsCiAJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KIAkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKQEAgLTQ2LDggKzI5LDE5IEBACiAJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKIAkJe0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQogCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKIAlFbmRHbG9iYWxTZWN0aW9uCiAJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KIAkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCiAJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oTW9ub0RldmVsb3BQcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCSAgICAgICAgU3RhcnR1cEl0ZW0gPSBUaHJpZnQuY3Nwcm9qCisJRW5kR2xvYmFsU2VjdGlvbgogRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcwppbmRleCAyOGE4NTVhLi44ODcwOTg4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKQEAgLTIyLDc5ICsyMiwxNzMgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydAotCXsKLQkJcHJpdmF0ZSBCdWZmZXJlZFN0cmVhbSBpbnB1dEJ1ZmZlcjsKLQkJcHJpdmF0ZSBCdWZmZXJlZFN0cmVhbSBvdXRwdXRCdWZmZXI7Ci0JCXByaXZhdGUgaW50IGJ1ZlNpemU7Ci0JCXByaXZhdGUgVFN0cmVhbVRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgcHVibGljIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBidWZTaXplOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBpbnB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIG91dHB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CiAKLQkJcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUU3RyZWFtVHJhbnNwb3J0IHRyYW5zcG9ydCkKLQkJCTp0aGlzKHRyYW5zcG9ydCwgMTAyNCkKLQkJeworICAgICAgICBwdWJsaWMgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgYnVmU2l6ZSA9IDEwMjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIGlmIChidWZTaXplIDw9IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJidWZTaXplIiwgIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuIik7CisgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRoaXMuYnVmU2l6ZSA9IGJ1ZlNpemU7CisgICAgICAgIH0KIAotCQl9CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IFVuZGVybHlpbmdUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRTdHJlYW1UcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgYnVmU2l6ZSkKLQkJewotCQkJdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKLQkJCXRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotCQkJSW5pdEJ1ZmZlcnMoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGxlZ2l0aW1hdGVseSB0aHJvdyBoZXJlIGJ1dCBiZSBuaWNlIGEgYml0LgorICAgICAgICAgICAgICAgIC8vIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIV9Jc0Rpc3Bvc2VkICYmIHRyYW5zcG9ydC5Jc09wZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgSW5pdEJ1ZmZlcnMoKQotCQl7Ci0JCQlpZiAodHJhbnNwb3J0LklucHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJaW5wdXRCdWZmZXIgPSBuZXcgQnVmZmVyZWRTdHJlYW0odHJhbnNwb3J0LklucHV0U3RyZWFtLCBidWZTaXplKTsKLQkJCX0KLQkJCWlmICh0cmFuc3BvcnQuT3V0cHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJb3V0cHV0QnVmZmVyID0gbmV3IEJ1ZmZlcmVkU3RyZWFtKHRyYW5zcG9ydC5PdXRwdXRTdHJlYW0sIGJ1ZlNpemUpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOworICAgICAgICB9CiAKLQkJcHVibGljIFRUcmFuc3BvcnQgVW5kZXJseWluZ1RyYW5zcG9ydAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHJhbnNwb3J0OyB9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHJhbnNwb3J0LklzT3BlbjsgfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJCXRyYW5zcG9ydC5PcGVuKCk7Ci0JCQlJbml0QnVmZmVycygpOwotCQl9CisgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPCBidWZTaXplKQorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLkNhcGFjaXR5ID0gYnVmU2l6ZTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCi0JCXsKLQkJCWlmIChpbnB1dEJ1ZmZlciAhPSBudWxsICYmIGlucHV0QnVmZmVyLkNhblJlYWQpCi0JCQl7Ci0JCQkJaW5wdXRCdWZmZXIuQ2xvc2UoKTsKLQkJCX0KLQkJCWlmIChvdXRwdXRCdWZmZXIgIT0gbnVsbCAmJiBvdXRwdXRCdWZmZXIuQ2FuV3JpdGUpCi0JCQl7Ci0JCQkJb3V0cHV0QnVmZmVyLkNsb3NlKCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBnb3QgPSBpbnB1dEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OwogCi0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlyZXR1cm4gaW5wdXRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKGlucHV0QnVmZmVyLkNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBpbnQgZmlsbGVkID0gdHJhbnNwb3J0LlJlYWQoaW5wdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpaW5wdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5TZXRMZW5ndGgoZmlsbGVkKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsbGVkID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJb3V0cHV0QnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIC8vIFJlbGF0aXZlIG9mZnNldCBmcm9tICJvZmYiIGFyZ3VtZW50CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY2FwYSA9IChpbnQpKG91dHB1dEJ1ZmZlci5DYXBhY2l0eSAtIG91dHB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIGludCB3cml0ZVNpemUgPSBjYXBhIDw9IGxlbiA/IGNhcGEgOiBsZW47CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCB3cml0ZVNpemUpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSB3cml0ZVNpemU7CisgICAgICAgICAgICAgICAgaWYgKHdyaXRlU2l6ZSA9PSBjYXBhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKG91dHB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAobGVuIC0gb2Zmc2V0ID49IGJ1ZlNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKGJ1Ziwgb2ZmICsgb2Zmc2V0LCBidWZTaXplKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYnVmU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByZW1haW4gPSBsZW4gLSBvZmZzZXQ7CisgICAgICAgICAgICBpZiAocmVtYWluID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkNhcGFjaXR5IDwgYnVmU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLkNhcGFjaXR5ID0gYnVmU2l6ZTsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuV3JpdGUoYnVmLCBvZmYgKyBvZmZzZXQsIHJlbWFpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCi0JCXsKLQkJCW91dHB1dEJ1ZmZlci5GbHVzaCgpOwotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgSW50ZXJuYWxGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuV3JpdGUob3V0cHV0QnVmZmVyLkdldEJ1ZmZlcigpLCAwLCAoaW50KW91dHB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKKworICAgICAgICAgICAgdHJhbnNwb3J0LkZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSUFzeW5jUmVzdWx0IEJlZ2luRmx1c2goQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuQmVnaW5GbHVzaCggY2FsbGJhY2ssIHN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LkVuZEZsdXNoKCBhc3luY1Jlc3VsdCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQ2hlY2tOb3REaXNwb3NlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIlRCdWZmZXJlZFRyYW5zcG9ydCIpOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfSXNEaXNwb3NlZCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKaW5kZXggYjdhZDVmMi4uYTc0NmEzMiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKQEAgLTE2LDk5ICsxNiwxOTAgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KK3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5JTzsKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKLQl7Ci0JCXByb3RlY3RlZCBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7Ci0JCXByb3RlY3RlZCBNZW1vcnlTdHJlYW0gd3JpdGVCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOwotCQlwcm90ZWN0ZWQgTWVtb3J5U3RyZWFtIHJlYWRCdWZmZXIgPSBudWxsOworICAgIHB1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIHdyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gcmVhZEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CiAKLQkJcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeQotCQl7Ci0JCQlwdWJsaWMgb3ZlcnJpZGUgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOwotCQkJfQotCQl9CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEhlYWRlclNpemUgPSA0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBoZWFkZXJCdWYgPSBuZXcgYnl0ZVtIZWFkZXJTaXplXTsKIAotCQlwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKLQkJewotCQkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0JCX0KKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJCXRyYW5zcG9ydC5PcGVuKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIHRyYW5zcG9ydC5Jc09wZW47Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCi0JCXsKLQkJCXRyYW5zcG9ydC5DbG9zZSgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW4gbGVnaXRpbWF0ZWx5IHRocm93IGhlcmUgYnV0IGJlIG5pY2UgYSBiaXQuCisgICAgICAgICAgICAgICAgLy8gQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiAhX0lzRGlzcG9zZWQgJiYgdHJhbnNwb3J0LklzT3BlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpZiAocmVhZEJ1ZmZlciAhPSBudWxsKQotCQkJewotCQkJCWludCBnb3QgPSByZWFkQnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7Ci0JCQkJaWYgKGdvdCA+IDApCi0JCQkJewotCQkJCQlyZXR1cm4gZ290OwotCQkJCX0KLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQogCi0JCQkvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQotCQkJUmVhZEZyYW1lKCk7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBpbnQgZ290ID0gcmVhZEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgIH0KIAotCQkJcmV0dXJuIHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICAgICAgICAgIFJlYWRGcmFtZSgpOwogCi0JCXByaXZhdGUgdm9pZCBSZWFkRnJhbWUoKQotCQl7Ci0JCQlieXRlW10gaTMycmQgPSBuZXcgYnl0ZVs0XTsKLQkJCXRyYW5zcG9ydC5SZWFkQWxsKGkzMnJkLCAwLCA0KTsKLQkJCWludCBzaXplID0KLQkJCQkoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKLQkJCQkoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKLQkJCQkoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKLQkJCQkoKGkzMnJkWzNdICYgMHhmZikpOworICAgICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW3NpemVdOwotCQkJdHJhbnNwb3J0LlJlYWRBbGwoYnVmZiwgMCwgc2l6ZSk7Ci0JCQlyZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbShidWZmKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgUmVhZEZyYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LlJlYWRBbGwoaGVhZGVyQnVmLCAwLCBIZWFkZXJTaXplKTsKKyAgICAgICAgICAgIGludCBzaXplID0gRGVjb2RlRnJhbWVTaXplKGhlYWRlckJ1Zik7CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJd3JpdGVCdWZmZXIuV3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0JCX0KKyAgICAgICAgICAgIHJlYWRCdWZmZXIuU2V0TGVuZ3RoKHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmYgPSByZWFkQnVmZmVyLkdldEJ1ZmZlcigpOworICAgICAgICAgICAgdHJhbnNwb3J0LlJlYWRBbGwoYnVmZiwgMCwgc2l6ZSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCi0JCXsKLQkJCWJ5dGVbXSBidWYgPSB3cml0ZUJ1ZmZlci5HZXRCdWZmZXIoKTsKLQkJCWludCBsZW4gPSAoaW50KXdyaXRlQnVmZmVyLkxlbmd0aDsKLQkJCXdyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSh3cml0ZUJ1ZmZlci5DYXBhY2l0eSk7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlci5MZW5ndGggKyAobG9uZylsZW4gPiAobG9uZylpbnQuTWF4VmFsdWUpCisgICAgICAgICAgICAgICAgRmx1c2goKTsKKyAgICAgICAgICAgIHdyaXRlQnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CiAKLQkJCWJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKLQkJCWkzMm91dFswXSA9IChieXRlKSgweGZmICYgKGxlbiA+PiAyNCkpOwotCQkJaTMyb3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAobGVuID4+IDE2KSk7Ci0JCQlpMzJvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChsZW4gPj4gOCkpOwotCQkJaTMyb3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAobGVuKSk7Ci0JCQl0cmFuc3BvcnQuV3JpdGUoaTMyb3V0LCAwLCA0KTsKLQkJCXRyYW5zcG9ydC5Xcml0ZShidWYsIDAsIGxlbik7Ci0JCQl0cmFuc3BvcnQuRmx1c2goKTsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBieXRlW10gYnVmID0gd3JpdGVCdWZmZXIuR2V0QnVmZmVyKCk7CisgICAgICAgICAgICBpbnQgbGVuID0gKGludCl3cml0ZUJ1ZmZlci5MZW5ndGg7CisgICAgICAgICAgICBpbnQgZGF0YV9sZW4gPSBsZW4gLSBIZWFkZXJTaXplOworICAgICAgICAgICAgaWYgKGRhdGFfbGVuIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsgLy8gbG9naWMgZXJyb3IgYWN0dWFsbHkKKworICAgICAgICAgICAgLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQorICAgICAgICAgICAgRW5jb2RlRnJhbWVTaXplKGRhdGFfbGVuLCBidWYpOworCisgICAgICAgICAgICAvLyBTZW5kIHRoZSBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlCisgICAgICAgICAgICB0cmFuc3BvcnQuV3JpdGUoYnVmLCAwLCBsZW4pOworCisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCisgICAgICAgICAgICB0cmFuc3BvcnQuRmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKKworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5CZWdpbkZsdXNoKCBjYWxsYmFjaywgc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuRW5kRmx1c2goIGFzeW5jUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciBtZXNzYWdlIGhlYWRlciB0byBiZSBwdXQgcmlnaHQgYmVmb3JlIHNlbmRpbmcgaXQgb3V0CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5TZXRMZW5ndGgoSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uRW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRW5jb2RlRnJhbWVTaXplKGludCBmcmFtZVNpemUsIGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZlswXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiAyNCkpOworICAgICAgICAgICAgYnVmWzFdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplID4+IDE2KSk7CisgICAgICAgICAgICBidWZbMl0gPSAoYnl0ZSkoMHhmZiAmIChmcmFtZVNpemUgPj4gOCkpOworICAgICAgICAgICAgYnVmWzNdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRGVjb2RlRnJhbWVTaXplKGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICgoYnVmWzBdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAoKGJ1ZlsxXSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKChidWZbMl0gJiAweGZmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgKChidWZbM10gJiAweGZmKSk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiVEZyYW1lZFRyYW5zcG9ydCIpOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRCdWZmZXIuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjdmYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzCkBAIC0wLDAgKzEsNDc1IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLklPLkNvbXByZXNzaW9uOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUSHR0cENsaWVudCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFVyaSB1cmk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzOworICAgICAgICBwcml2YXRlIFN0cmVhbSBpbnB1dFN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBNZW1vcnlTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworCisgICAgICAgIC8vIFRpbWVvdXRzIGluIG1pbGxpc2Vjb25kcworICAgICAgICBwcml2YXRlIGludCBjb25uZWN0VGltZW91dCA9IDMwMDAwOworCisgICAgICAgIHByaXZhdGUgaW50IHJlYWRUaW1lb3V0ID0gMzAwMDA7CisKKyAgICAgICAgcHJpdmF0ZSBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gY3VzdG9tSGVhZGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOworCisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgIHByaXZhdGUgSVdlYlByb3h5IHByb3h5ID0gV2ViUmVxdWVzdC5EZWZhdWx0V2ViUHJveHk7CisjZW5kaWYKKworICAgICAgICBwdWJsaWMgVEh0dHBDbGllbnQoVXJpIHUpCisgICAgICAgICAgICA6IHRoaXModSwgRW51bWVyYWJsZS5FbXB0eTxYNTA5Q2VydGlmaWNhdGU+KCkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUSHR0cENsaWVudChVcmkgdSwgSUVudW1lcmFibGU8WDUwOUNlcnRpZmljYXRlPiBjZXJ0aWZpY2F0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVyaSA9IHU7CisgICAgICAgICAgICB0aGlzLmNlcnRpZmljYXRlcyA9IChjZXJ0aWZpY2F0ZXMgPz8gRW51bWVyYWJsZS5FbXB0eTxYNTA5Q2VydGlmaWNhdGU+KCkpLlRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ29ubmVjdFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubmVjdFRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgUmVhZFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZFRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gQ3VzdG9tSGVhZGVycworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tSGVhZGVyczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgIHB1YmxpYyBJV2ViUHJveHkgUHJveHkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJveHkgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gaW5wdXRTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSwgaW94KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2VuZFJlcXVlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgU2VuZFJlcXVlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBIdHRwV2ViUmVxdWVzdCBjb25uZWN0aW9uID0gQ3JlYXRlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uSGVhZGVycy5BZGQoIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIik7CisKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG91dHB1dFN0cmVhbS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5Db250ZW50TGVuZ3RoID0gZGF0YS5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICB1c2luZyAoU3RyZWFtIHJlcXVlc3RTdHJlYW0gPSBjb25uZWN0aW9uLkdldFJlcXVlc3RTdHJlYW0oKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdHJlYW0uV3JpdGUoZGF0YSwgMCwgZGF0YS5MZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgSFRUUCBoYW5nIHRoYXQgY2FuIGhhcHBlbnMgYWZ0ZXIgc3VjY2Vzc2l2ZSBjYWxscyBieSBtYWtpbmcgc3VyZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHdlIHJlbGVhc2UgdGhlIHJlc3BvbnNlIGFuZCByZXNwb25zZSBzdHJlYW0uIFRvIHN1cHBvcnQgdGhpcywgd2UgY29weQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzcG9uc2UgdG8gYSBtZW1vcnkgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIHJlc3BvbnNlID0gY29ubmVjdGlvbi5HZXRSZXNwb25zZSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAodmFyIHJlc3BvbnNlU3RyZWFtID0gcmVzcG9uc2UuR2V0UmVzcG9uc2VTdHJlYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRoZSByZXNwb25zZSB0byBhIG1lbW9yeSBzdHJlYW0gc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbmx5IGNsb3NlIHRoZSByZXNwb25zZSBhbmQgcmVzcG9uc2Ugc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsgIC8vIG11bHRpcGxlIG9mIDQwOTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gcmVzcG9uc2VTdHJlYW0uUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5Xcml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmNvZGluZ3MgPSByZXNwb25zZS5IZWFkZXJzLkdldFZhbHVlcygiQ29udGVudC1FbmNvZGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5ncyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbmNvZGluZyBpbiBlbmNvZGluZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJnemlwIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvbXByZXNzR1ppcHBlZChyZWYgaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZGVmbGF0ZSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb21wcmVzc0RlZmxhdGVkKHJlZiBpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCksIGlveCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoV2ViRXhjZXB0aW9uIHd4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCAiQ291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXI6ICIgKyB3eCwgd3gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIERlY29tcHJlc3NEZWZsYXRlZChyZWYgU3RyZWFtIGlucHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG1wID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdXNpbmcgKHZhciBkZWNvbXAgPSBuZXcgRGVmbGF0ZVN0cmVhbShpbnB1dFN0cmVhbSwgQ29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlY29tcC5Db3B5VG8odG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gdG1wOworICAgICAgICAgICAgaW5wdXRTdHJlYW0uU2VlaygwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBEZWNvbXByZXNzR1ppcHBlZChyZWYgU3RyZWFtIGlucHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG1wID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdXNpbmcgKHZhciBkZWNvbXAgPSBuZXcgR1ppcFN0cmVhbShpbnB1dFN0cmVhbSwgQ29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlY29tcC5Db3B5VG8odG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gdG1wOworICAgICAgICAgICAgaW5wdXRTdHJlYW0uU2VlaygwLCAwKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHByaXZhdGUgSHR0cFdlYlJlcXVlc3QgQ3JlYXRlUmVxdWVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEh0dHBXZWJSZXF1ZXN0IGNvbm5lY3Rpb24gPSAoSHR0cFdlYlJlcXVlc3QpV2ViUmVxdWVzdC5DcmVhdGUodXJpKTsKKworCisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgICAgICAvLyBBZGRpbmcgY2VydGlmaWNhdGVzIHRocm91Z2ggY29kZSBpcyBub3Qgc3VwcG9ydGVkIHdpdGggV1A3IFNpbHZlcmxpZ2h0CisgICAgICAgICAgICAvLyBzZWUgIldpbmRvd3MgUGhvbmUgNyBhbmQgQ2VydGlmaWNhdGVzX0ZJTkFMXzEyMTYxMC5wZGYiCisgICAgICAgICAgICBjb25uZWN0aW9uLkNsaWVudENlcnRpZmljYXRlcy5BZGRSYW5nZShjZXJ0aWZpY2F0ZXMpOworCisgICAgICAgICAgICBpZiAoY29ubmVjdFRpbWVvdXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uVGltZW91dCA9IGNvbm5lY3RUaW1lb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlYWRUaW1lb3V0ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLlJlYWRXcml0ZVRpbWVvdXQgPSByZWFkVGltZW91dDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLy8gTWFrZSB0aGUgcmVxdWVzdAorICAgICAgICAgICAgY29ubmVjdGlvbi5Db250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgICAgICAgICAgICBjb25uZWN0aW9uLkFjY2VwdCA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgICAgICAgICAgICBjb25uZWN0aW9uLlVzZXJBZ2VudCA9ICJDIy9USHR0cENsaWVudCI7CisgICAgICAgICAgICBjb25uZWN0aW9uLk1ldGhvZCA9ICJQT1NUIjsKKyNpZiAhU0lMVkVSTElHSFQKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uUHJvdG9jb2xWZXJzaW9uID0gSHR0cFZlcnNpb24uVmVyc2lvbjEwOworI2VuZGlmCisKKyAgICAgICAgICAgIC8vYWRkIGN1c3RvbSBoZWFkZXJzIGhlcmUKKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz4gaXRlbSBpbiBjdXN0b21IZWFkZXJzKQorICAgICAgICAgICAgeworI2lmICFTSUxWRVJMSUdIVAorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uSGVhZGVycy5BZGQoaXRlbS5LZXksIGl0ZW0uVmFsdWUpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkhlYWRlcnNbaXRlbS5LZXldID0gaXRlbS5WYWx1ZTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisjaWYgIVNJTFZFUkxJR0hUCisgICAgICAgICAgICBjb25uZWN0aW9uLlByb3h5ID0gcHJveHk7CisjZW5kaWYKKworICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSUFzeW5jUmVzdWx0IEJlZ2luRmx1c2goQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBFeHRyYWN0IHJlcXVlc3QgYW5kIHJlc2V0IGJ1ZmZlcgorICAgICAgICAgICAgdmFyIGRhdGEgPSBvdXRwdXRTdHJlYW0uVG9BcnJheSgpOworCisgICAgICAgICAgICAvL3JlcXVlc3RCdWZmZXJfID0gbmV3IE1lbW9yeVN0cmVhbSgpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvbiBvYmplY3QKKyAgICAgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IG5ldyBGbHVzaEFzeW5jUmVzdWx0KGNhbGxiYWNrLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Db25uZWN0aW9uID0gQ3JlYXRlUmVxdWVzdCgpOworCisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5EYXRhID0gZGF0YTsKKworCisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Db25uZWN0aW9uLkJlZ2luR2V0UmVxdWVzdFN0cmVhbShHZXRSZXF1ZXN0U3RyZWFtQ2FsbGJhY2ssIGZsdXNoQXN5bmNSZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiBmbHVzaEFzeW5jUmVzdWx0OworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlveC5Ub1N0cmluZygpLCBpb3gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KWFzeW5jUmVzdWx0OworCisgICAgICAgICAgICAgICAgaWYgKCFmbHVzaEFzeW5jUmVzdWx0LklzQ29tcGxldGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHdhaXRIYW5kbGUgPSBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jV2FpdEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgd2FpdEhhbmRsZS5XYWl0T25lKCk7ICAvLyBibG9ja2luZyBJTkZJTklURWx5CisgICAgICAgICAgICAgICAgICAgIHdhaXRIYW5kbGUuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgR2V0UmVxdWVzdFN0cmVhbUNhbGxiYWNrKElBc3luY1Jlc3VsdCBhc3luY2hyb25vdXNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gKEZsdXNoQXN5bmNSZXN1bHQpYXN5bmNocm9ub3VzUmVzdWx0LkFzeW5jU3RhdGU7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVxU3RyZWFtID0gZmx1c2hBc3luY1Jlc3VsdC5Db25uZWN0aW9uLkVuZEdldFJlcXVlc3RTdHJlYW0oYXN5bmNocm9ub3VzUmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXFTdHJlYW0uV3JpdGUoZmx1c2hBc3luY1Jlc3VsdC5EYXRhLCAwLCBmbHVzaEFzeW5jUmVzdWx0LkRhdGEuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICByZXFTdHJlYW0uRmx1c2goKTsKKyAgICAgICAgICAgICAgICByZXFTdHJlYW0uQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIGdldCB0aGUgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkNvbm5lY3Rpb24uQmVnaW5HZXRSZXNwb25zZShHZXRSZXNwb25zZUNhbGxiYWNrLCBmbHVzaEFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleGNlcHRpb24uVG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LlVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0Lk5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEdldFJlc3BvbnNlQ2FsbGJhY2soSUFzeW5jUmVzdWx0IGFzeW5jaHJvbm91c1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSAoRmx1c2hBc3luY1Jlc3VsdClhc3luY2hyb25vdXNSZXN1bHQuQXN5bmNTdGF0ZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gZmx1c2hBc3luY1Jlc3VsdC5Db25uZWN0aW9uLkVuZEdldFJlc3BvbnNlKGFzeW5jaHJvbm91c1Jlc3VsdCkuR2V0UmVzcG9uc2VTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleGNlcHRpb24uVG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuVXBkYXRlU3RhdHVzVG9Db21wbGV0ZSgpOworICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Ob3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJhc2VkIG9uIGh0dHA6Ly9tc212cHMuY29tL2Jsb2dzL2x1aXNhYnJldS9hcmNoaXZlLzIwMDkvMDYvMTUvbXVsdGl0aHJlYWRpbmctaW1wbGVtZW50aW5nLXRoZS1pYXN5bmNyZXN1bHQtaW50ZXJmYWNlLmFzcHgKKyAgICAgICAgY2xhc3MgRmx1c2hBc3luY1Jlc3VsdCA6IElBc3luY1Jlc3VsdAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEJvb2xlYW4gX2lzQ29tcGxldGVkOworICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IF9ldnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFzeW5jQ2FsbGJhY2sgX2NiTWV0aG9kOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX3N0YXRlOworCisgICAgICAgICAgICBwdWJsaWMgRmx1c2hBc3luY1Jlc3VsdChBc3luY0NhbGxiYWNrIGNiTWV0aG9kLCBvYmplY3Qgc3RhdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NiTWV0aG9kID0gY2JNZXRob2Q7CisgICAgICAgICAgICAgICAgX3N0YXRlID0gc3RhdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVybmFsIGJ5dGVbXSBEYXRhIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIGludGVybmFsIEh0dHBXZWJSZXF1ZXN0IENvbm5lY3Rpb24geyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgVFRyYW5zcG9ydEV4Y2VwdGlvbiBBc3luY0V4Y2VwdGlvbiB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgQXN5bmNTdGF0ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfc3RhdGU7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBXYWl0SGFuZGxlIEFzeW5jV2FpdEhhbmRsZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBHZXRFdnRIYW5kbGUoKTsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgQ29tcGxldGVkU3luY2hyb25vdXNseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIGJvb2wgSXNDb21wbGV0ZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lzQ29tcGxldGVkOyB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfbG9ja2VyID0gbmV3IG9iamVjdCgpOworICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IEdldEV2dEhhbmRsZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZXZ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0NvbXBsZXRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2V2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2V2dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgVXBkYXRlU3RhdHVzVG9Db21wbGV0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2lzQ29tcGxldGVkID0gdHJ1ZTsgLy8xLiBzZXQgX2lzY29tcGxldGVkIHRvIHRydWUKKyAgICAgICAgICAgICAgICBsb2NrIChfbG9ja2VyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9ldnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2V2dC5TZXQoKTsgLy8yLiBzZXQgdGhlIGV2ZW50LCB3aGVuIGl0IGV4aXN0cworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIE5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9jYk1ldGhvZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2NiTWV0aG9kKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExNWVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cEhhbmRsZXIuY3MKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoKKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uV2ViOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5JTzsKKwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUSHR0cEhhbmRsZXIgOiBJSHR0cEhhbmRsZXIKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBUUHJvY2Vzc29yIHByb2Nlc3NvcjsKKworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCisgICAgICAgIHByb3RlY3RlZCBjb25zdCBzdHJpbmcgY29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOworICAgICAgICBwcm90ZWN0ZWQgU3lzdGVtLlRleHQuRW5jb2RpbmcgZW5jb2RpbmcgPSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5VVEY4OworCisgICAgICAgIHB1YmxpYyBUSHR0cEhhbmRsZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSkKKyAgICAgICAgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBIYW5kbGVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUSHR0cEhhbmRsZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUHJvY2Vzc1JlcXVlc3QoSHR0cExpc3RlbmVyQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlc3BvbnNlLkNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgICAgICAgICBjb250ZXh0LlJlc3BvbnNlLkNvbnRlbnRFbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICAgICAgUHJvY2Vzc1JlcXVlc3QoY29udGV4dC5SZXF1ZXN0LklucHV0U3RyZWFtLCBjb250ZXh0LlJlc3BvbnNlLk91dHB1dFN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBQcm9jZXNzUmVxdWVzdChIdHRwQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlc3BvbnNlLkNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgICAgICAgICBjb250ZXh0LlJlc3BvbnNlLkNvbnRlbnRFbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICAgICAgUHJvY2Vzc1JlcXVlc3QoY29udGV4dC5SZXF1ZXN0LklucHV0U3RyZWFtLCBjb250ZXh0LlJlc3BvbnNlLk91dHB1dFN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBQcm9jZXNzUmVxdWVzdChTdHJlYW0gaW5wdXQsIFN0cmVhbSBvdXRwdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoaW5wdXQsb3V0cHV0KTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIHZhciBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNSZXVzYWJsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwVGFza0FzeW5jSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5MWYzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MKQEAgLTAsMCArMSw5NyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uV2ViOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gYXN5bmMgdGFzayBiYXNlZCBIVFRQIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgdGhyaWZ0IHNlcnZpY2VzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRIdHRwVGFza0FzeW5jSGFuZGxlciA6IEh0dHBUYXNrQXN5bmNIYW5kbGVyCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRBc3luY1Byb2Nlc3NvciBfcHJvY2Vzc29yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbEZhY3RvcnkgX2lucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbEZhY3RvcnkgX291dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MKKyAgICAgICAgLy8vIHVzaW5nIHRoZSA8c2VlIGNyZWY9IlRCaW5hcnlQcm90b2NvbC5GYWN0b3J5Ii8+IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9jZXNzb3IiPlRoZSBhc3luYyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRIdHRwVGFza0FzeW5jSGFuZGxlciIvPiBjbGFzcworICAgICAgICAvLy8gdXNpbmcgPHBhcmFtcmVmIG5hbWU9InByb3RvY29sRmFjdG9yeSIvPiBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2xGYWN0b3J5Ij5UaGUgcHJvdG9jb2wgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVEh0dHBUYXNrQXN5bmNIYW5kbGVyKFRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRIdHRwVGFza0FzeW5jSGFuZGxlciIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9jZXNzb3IiPlRoZSBhc3luYyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dFByb3RvY29sRmFjdG9yeSI+VGhlIGlucHV0IHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXRQcm90b2NvbEZhY3RvcnkiPlRoZSBvdXRwdXQgcHJvdG9jb2wgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVEh0dHBUYXNrQXN5bmNIYW5kbGVyKFRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgX3Byb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgICAgICAgIF9pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgX291dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFByb2Nlc3NSZXF1ZXN0QXN5bmMoSHR0cENvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KGNvbnRleHQuUmVxdWVzdC5JbnB1dFN0cmVhbSwgY29udGV4dC5SZXNwb25zZS5PdXRwdXRTdHJlYW0pOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBfaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gX291dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGF3YWl0IF9wcm9jZXNzb3IuUHJvY2Vzc0FzeW5jKGlucHV0LCBvdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwM2QwODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcwpAQCAtMCwwICsxLDExNyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgOiBUVHJhbnNwb3J0CisgICAgeworCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIGJ5dGVTdHJlYW07CisKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIGRvIG5vdGhpbmcgKiovCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJ5dGVTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldEJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBieXRlU3RyZWFtLlRvQXJyYXkoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBTZXJpYWxpemUoVEFic3RyYWN0QmFzZSBzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICAgICB2YXIgcCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodCk7CisKKyAgICAgICAgICAgIHMuV3JpdGUocCk7CisKKyAgICAgICAgICAgIHJldHVybiB0LkdldEJ1ZmZlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUIERlU2VyaWFsaXplPFQ+KGJ5dGVbXSBidWYpIHdoZXJlIFQgOiBUQWJzdHJhY3RCYXNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFucyA9IG5ldyBUTWVtb3J5QnVmZmVyKGJ1Zik7CisgICAgICAgICAgICB2YXIgcCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgaWYgKHR5cGVvZihUQmFzZSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YoVCkuR2V0TWV0aG9kKCJSZWFkIiwgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CisgICAgICAgICAgICAgICAgdmFyIHQgPSBBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2U8VD4oKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuSW52b2tlKHQsIG5ldyBvYmplY3RbXSB7IHAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHR5cGVvZihUKS5HZXRNZXRob2QoIlJlYWQiLCBCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKW1ldGhvZC5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHsgcCB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZVN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWE1MGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxMTEgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU8uUGlwZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0IDogVFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVDbGllbnRTdHJlYW0gY2xpZW50OworICAgICAgICBwcml2YXRlIHN0cmluZyBTZXJ2ZXJOYW1lOworICAgICAgICBwcml2YXRlIHN0cmluZyBQaXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgQ29ubmVjdFRpbWVvdXQ7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHBpcGUsIGludCB0aW1lb3V0ID0gVGltZW91dC5JbmZpbml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmVyTmFtZSA9ICIuIjsKKyAgICAgICAgICAgIFBpcGVOYW1lID0gcGlwZTsKKyAgICAgICAgICAgIENvbm5lY3RUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBzZXJ2ZXIsIHN0cmluZyBwaXBlLCBpbnQgdGltZW91dCA9IFRpbWVvdXQuSW5maW5pdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZlck5hbWUgPSAoc2VydmVyICE9ICIiKSA/IHNlcnZlciA6ICIuIjsKKyAgICAgICAgICAgIFBpcGVOYW1lID0gcGlwZTsKKyAgICAgICAgICAgIENvbm5lY3RUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY2xpZW50ICE9IG51bGwgJiYgY2xpZW50LklzQ29ubmVjdGVkOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50ID0gbmV3IE5hbWVkUGlwZUNsaWVudFN0cmVhbShTZXJ2ZXJOYW1lLCBQaXBlTmFtZSwgUGlwZURpcmVjdGlvbi5Jbk91dCwgUGlwZU9wdGlvbnMuTm9uZSk7CisgICAgICAgICAgICBjbGllbnQuQ29ubmVjdChDb25uZWN0VGltZW91dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgICAgICAgICAgICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgICAgICAgICAgICB2YXIgbkJ5dGVzID0gTWF0aC5NaW4obGVuLCAxNSAqIDQwOTYpOyAgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICAgICAgICAgICAgd2hpbGUgKG5CeXRlcyA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LldyaXRlKGJ1Ziwgb2ZmLCBuQnl0ZXMpOworCisgICAgICAgICAgICAgICAgb2ZmICs9IG5CeXRlczsKKyAgICAgICAgICAgICAgICBsZW4gLT0gbkJ5dGVzOworICAgICAgICAgICAgICAgIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgbkJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5EaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjE1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDI5NiBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgUGlwZSBvbiB0aGUgbG9jYWxob3N0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBwaXBlQWRkcmVzczsKKyAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBib29sIGFzeW5jTW9kZSA9IHRydWU7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQoc3RyaW5nIHBpcGVBZGRyZXNzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnBpcGVBZGRyZXNzID0gcGlwZUFkZHJlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVBpcGVJbnN0YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gUGlwZURpcmVjdGlvbi5Jbk91dDsKKyAgICAgICAgICAgICAgICB2YXIgbWF4Y29ubiA9IE5hbWVkUGlwZVNlcnZlclN0cmVhbS5NYXhBbGxvd2VkU2VydmVySW5zdGFuY2VzOworICAgICAgICAgICAgICAgIHZhciBtb2RlID0gUGlwZVRyYW5zbWlzc2lvbk1vZGUuQnl0ZTsKKyAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGFzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IElOQlVGX1NJWkUgPSA0MDk2OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBPVVRCVUZfU0laRSA9IDQwOTY7CisKKyAgICAgICAgICAgICAgICAvLyBzZWN1cml0eQorICAgICAgICAgICAgICAgIHZhciBzZWN1cml0eSA9IG5ldyBQaXBlU2VjdXJpdHkoKTsKKyAgICAgICAgICAgICAgICBzZWN1cml0eS5BZGRBY2Nlc3NSdWxlKAorICAgICAgICAgICAgICAgICAgICBuZXcgUGlwZUFjY2Vzc1J1bGUoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VjdXJpdHlJZGVudGlmaWVyKFdlbGxLbm93blNpZFR5cGUuV29ybGRTaWQsIG51bGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgUGlwZUFjY2Vzc1JpZ2h0cy5SZWFkIHwgUGlwZUFjY2Vzc1JpZ2h0cy5Xcml0ZSB8IFBpcGVBY2Nlc3NSaWdodHMuU3luY2hyb25pemUgfCBQaXBlQWNjZXNzUmlnaHRzLkNyZWF0ZU5ld0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuQWNjZXNzQ29udHJvbFR5cGUuQWxsb3cKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0ocGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgSU5CVUZfU0laRSwgT1VUQlVGX1NJWkUsIHNlY3VyaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKSAgLy8gTW9ubyBzdGlsbCBkb2VzIG5vdCBzdXBwb3J0IGFzeW5jLCBmYWxsYmFjayB0byBzeW5jCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICY9ICh+UGlwZU9wdGlvbnMuQXN5bmNocm9ub3VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0ocGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgSU5CVUZfU0laRSwgT1VUQlVGX1NJWkUsIHNlY3VyaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUVHJhbnNwb3J0IEFjY2VwdEltcGwoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbnN1cmVQaXBlSW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZU91dGVyID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQmVnaW5XYWl0Rm9yQ29ubmVjdGlvbihhc3luY1Jlc3VsdCA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5FbmRXYWl0Rm9yQ29ubmVjdGlvbihhc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgZXZ0LldhaXRPbmUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZU91dGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlT3V0ZXI7IC8vIHJldGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5XYWl0Rm9yQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0cmFucyA9IG5ldyBTZXJ2ZXJUcmFuc3BvcnQoc3RyZWFtLGFzeW5jTW9kZSk7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gbnVsbDsgIC8vIHBhc3Mgb3duZXJzaGlwIHRvIFNlcnZlclRyYW5zcG9ydAorICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgU2VydmVyVHJhbnNwb3J0IDogVFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIE5hbWVkUGlwZVNlcnZlclN0cmVhbSBzdHJlYW07CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgYXN5bmNNb2RlOworCisgICAgICAgICAgICBwdWJsaWMgU2VydmVyVHJhbnNwb3J0KE5hbWVkUGlwZVNlcnZlclN0cmVhbSBzdHJlYW0sIGJvb2wgYXN5bmNNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgICAgIHRoaXMuYXN5bmNNb2RlID0gYXN5bmNNb2RlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gc3RyZWFtICE9IG51bGwgJiYgc3RyZWFtLklzQ29ubmVjdGVkOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZU91dGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkJlZ2luUmVhZChidWYsIG9mZiwgbGVuLCBhc3luY1Jlc3VsdCA9PgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHN0cmVhbS5FbmRSZWFkKGFzeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBldnQuV2FpdE9uZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlT3V0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICAgICAgICAgICAgICAgIHZhciBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIDE1ICogNDA5Nik7ICAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgICAgICAgICAgICAgICAgd2hpbGUgKG5CeXRlcyA+IDApCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlT3V0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkJlZ2luV3JpdGUoYnVmLCBvZmYsIG5CeXRlcywgYXN5bmNSZXN1bHQgPT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5FbmRXcml0ZShhc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5XYWl0T25lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlT3V0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlT3V0ZXI7IC8vIHJldGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uV3JpdGUoYnVmLCBvZmYsIG5CeXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvZmYgKz0gbkJ5dGVzOworICAgICAgICAgICAgICAgICAgICBsZW4gLT0gbkJ5dGVzOworICAgICAgICAgICAgICAgICAgICBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIG5CeXRlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCmluZGV4IDIxODI5MWEuLmQ4ZWM2MmEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCkBAIC0yNywxMzUgKzI3LDE1MCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0IDogVFNlcnZlclRyYW5zcG9ydAotCXsKLQkJLyoqCi0JCSogVW5kZXJseWluZyBzZXJ2ZXIgd2l0aCBzb2NrZXQKLQkJKi8KLQkJcHJpdmF0ZSBUY3BMaXN0ZW5lciBzZXJ2ZXIgPSBudWxsOworICAgIHB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVW5kZXJseWluZyBzZXJ2ZXIgd2l0aCBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgc2VydmVyID0gbnVsbDsKIAotCQkvKioKLQkJICogUG9ydCB0byBsaXN0ZW4gb24KLQkJICovCi0JCXByaXZhdGUgaW50IHBvcnQgPSAwOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQb3J0IHRvIGxpc3RlbiBvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CiAKLQkJLyoqCi0JCSAqIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0Ci0JCSAqLwotCQlwcml2YXRlIGludCBjbGllbnRUaW1lb3V0ID0gMDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXQgPSAwOwogCi0JCS8qKgotCQkgKiBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMKLQkJICovCi0JCXByaXZhdGUgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CiAKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgVFNlcnZlclNvY2tldChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKLQkJCTp0aGlzKGxpc3RlbmVyLCAwKQotCQl7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgOiB0aGlzKGxpc3RlbmVyLCAwKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QKLQkJICovCi0JCXB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgY2xpZW50VGltZW91dCkKLQkJewotCQkJdGhpcy5zZXJ2ZXIgPSBsaXN0ZW5lcjsKLQkJCXRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAotCQkgKi8KLQkJcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCi0JCQk6IHRoaXMocG9ydCwgMCkKLQkJewotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0Ci0JCSAqLwotCQlwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCi0JCQk6dGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSkKLQkJewotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cykKLQkJewotCQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJCXRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7Ci0JCQl0aGlzLnVzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKLQkJCXRyeQotCQkJewotCQkJCS8vIE1ha2Ugc2VydmVyIHNvY2tldAotCQkJCXNlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5BbnksIHRoaXMucG9ydCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uKQotCQkJewotCQkJCXNlcnZlciA9IG51bGw7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHBvcnQgKyAiLiIpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICAgICAgdGhpcy51c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BMaXN0ZW5lcih0aGlzLnBvcnQpOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgdGhpcy5wb3J0ICsgIi4iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQotCQl7Ci0JCQkvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyLlN0YXJ0KCk7Ci0JCQkJfQotCQkJCWNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0CisgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlLCBzeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIG92ZXJyaWRlIFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpCi0JCXsKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKLQkJCX0KLQkJCXRyeQotCQkJewotCQkJCVRjcENsaWVudCByZXN1bHQgPSBzZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50KCk7Ci0JCQkJVFNvY2tldCByZXN1bHQyID0gbmV3IFRTb2NrZXQocmVzdWx0KTsKLQkJCQlyZXN1bHQyLlRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OwotCQkJCWlmICh1c2VCdWZmZXJlZFNvY2tldHMpCi0JCQkJewotCQkJCQlUQnVmZmVyZWRUcmFuc3BvcnQgcmVzdWx0MyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocmVzdWx0Mik7Ci0JCQkJCXJldHVybiByZXN1bHQzOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlyZXR1cm4gcmVzdWx0MjsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOwotCQkJfQotCQl9CisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUVHJhbnNwb3J0IEFjY2VwdEltcGwoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VydmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUU29ja2V0IHJlc3VsdDIgPSBudWxsOworICAgICAgICAgICAgICAgIFRjcENsaWVudCByZXN1bHQgPSBzZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50KCk7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQyID0gbmV3IFRTb2NrZXQocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Mi5UaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHJlc3VsdDMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHJlc3VsdDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLkV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgVFNvY2tldCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIHRoZW4gbGV0CisgICAgICAgICAgICAgICAgICAgIC8vIGl0IGRvIHByb3BlciBjbGVhbnVwIG9mIHRoZSBUY3BDbGllbnQgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0MiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Mi5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gIE90aGVyd2lzZSwgY2xlYW4gaXQgdXAgb3Vyc2VsdmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSlyZXN1bHQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCi0JCXsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXNlcnZlci5TdG9wKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7Ci0JCQkJfQotCQkJCXNlcnZlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4LCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCmluZGV4IGM5OWQwN2YuLmU2Mzg4MGIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0yNSwxOSArMjUsMjAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlclRyYW5zcG9ydAotCXsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgTGlzdGVuKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7Ci0JCXByb3RlY3RlZCBhYnN0cmFjdCBUVHJhbnNwb3J0IEFjY2VwdEltcGwoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgTGlzdGVuKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUVHJhbnNwb3J0IEFjY2VwdEltcGwoKTsKIAotCQlwdWJsaWMgVFRyYW5zcG9ydCBBY2NlcHQoKQotCQl7Ci0JCQlUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IEFjY2VwdEltcGwoKTsKLQkJCWlmICh0cmFuc3BvcnQgPT0gbnVsbCkgewotCQkJICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwotCQkJfQotCQkJcmV0dXJuIHRyYW5zcG9ydDsKLQkJIH0KLQl9CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IEFjY2VwdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gQWNjZXB0SW1wbCgpOworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NjlhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MKQEAgLTAsMCArMSwzOTMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisvKiBvbmx5IGZvciBzaWx2ZXJsaWdodCAqLworI2lmIFNJTFZFUkxJR0hUCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUU2lsdmVybGlnaHRTb2NrZXQgOiBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBTb2NrZXQgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgc3RhdGljIE1hbnVhbFJlc2V0RXZlbnQgcmVhZEFzeW5jQ29tcGxldGUgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgIHB1YmxpYyBldmVudCBFdmVudEhhbmRsZXI8U29ja2V0QXN5bmNFdmVudEFyZ3M+IGNvbm5lY3RIYW5kbGVyID0gbnVsbDsKKworICAgICAgICAvLyBtZW1vcnkgc3RyZWFtIGZvciB3cml0ZSBjYWNoZS4KKyAgICAgICAgcHJpdmF0ZSBNZW1vcnlTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworCisgICAgICAgIHByaXZhdGUgc3RyaW5nIGhvc3QgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgdGltZW91dCA9IDA7CisKKyAgICAgICAgLy8gY29uc3RydWN0b3IKKyAgICAgICAgcHVibGljIFRTaWx2ZXJsaWdodFNvY2tldChzdHJpbmcgaG9zdCwgaW50IHBvcnQpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8gY29uc3RydWN0b3IKKyAgICAgICAgcHVibGljIFRTaWx2ZXJsaWdodFNvY2tldChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisKKyAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgc3RyZWFtLWJhc2VkLCBUQ1Agc29ja2V0IHVzaW5nIHRoZSBJbnRlck5ldHdvcmsgQWRkcmVzcyBGYW1pbHkuCisgICAgICAgICAgICBzb2NrZXQgPSBuZXcgU29ja2V0KEFkZHJlc3NGYW1pbHkuSW50ZXJOZXR3b3JrLCBTb2NrZXRUeXBlLlN0cmVhbSwgUHJvdG9jb2xUeXBlLlRjcCk7CisgICAgICAgICAgICBzb2NrZXQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGltZW91dCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBIb3N0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBob3N0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBQb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc29ja2V0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwKSAgICAgLy8gbm8gdGltZW91dCAtPiBpbmZpbml0ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAxMDAwMDsgIC8vIHNldCBhIGRlZmF1bHQgdGltZW91dCBmb3IgV1AuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgRG5zRW5kUG9pbnQuIFRoZSBob3N0TmFtZSBhbmQgcG9ydCBhcmUgcGFzc2VkIGluIHRvIHRoaXMgbWV0aG9kLgorICAgICAgICAgICAgICAgIERuc0VuZFBvaW50IGhvc3RFbnRyeSA9IG5ldyBEbnNFbmRQb2ludCh0aGlzLmhvc3QsIHRoaXMucG9ydCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBTb2NrZXRBc3luY0V2ZW50QXJncyBvYmplY3QgdG8gYmUgdXNlZCBpbiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0CisgICAgICAgICAgICAgICAgU29ja2V0QXN5bmNFdmVudEFyZ3Mgc29ja2V0RXZlbnRBcmcgPSBuZXcgU29ja2V0QXN5bmNFdmVudEFyZ3MoKTsKKyAgICAgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5SZW1vdGVFbmRQb2ludCA9IGhvc3RFbnRyeTsKKworICAgICAgICAgICAgICAgIC8vIElubGluZSBldmVudCBoYW5kbGVyIGZvciB0aGUgQ29tcGxldGVkIGV2ZW50LgorICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgZXZlbnQgaGFuZGxlciB3YXMgaW1wbGVtZW50ZWQgaW5saW5lIGluIG9yZGVyIHRvIG1ha2UgdGhpcyBtZXRob2Qgc2VsZi1jb250YWluZWQuCisgICAgICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuQ29tcGxldGVkICs9IG5ldyBFdmVudEhhbmRsZXI8U29ja2V0QXN5bmNFdmVudEFyZ3M+KGRlbGVnYXRlKG9iamVjdCBzLCBTb2NrZXRBc3luY0V2ZW50QXJncyBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RIYW5kbGVyKHRoaXMsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAvLyBNYWtlIGFuIGFzeW5jaHJvbm91cyBDb25uZWN0IHJlcXVlc3Qgb3ZlciB0aGUgc29ja2V0CisgICAgICAgICAgICAgICAgc29ja2V0LkNvbm5lY3RBc3luYyhzb2NrZXRFdmVudEFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBfdGltZW91dCA9IHRydWU7CisgICAgICAgICAgICBzdHJpbmcgX2Vycm9yID0gbnVsbDsKKyAgICAgICAgICAgIGludCBfcmVjdkJ5dGVzID0gLTE7CisKKyAgICAgICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIlNvY2tldCBpcyBub3Qgb3BlbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgU29ja2V0QXN5bmNFdmVudEFyZ3MgY29udGV4dCBvYmplY3QKKyAgICAgICAgICAgIFNvY2tldEFzeW5jRXZlbnRBcmdzIHNvY2tldEV2ZW50QXJnID0gbmV3IFNvY2tldEFzeW5jRXZlbnRBcmdzKCk7CisgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5SZW1vdGVFbmRQb2ludCA9IHNvY2tldC5SZW1vdGVFbmRQb2ludDsKKworICAgICAgICAgICAgLy8gU2V0dXAgdGhlIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBkYXRhCisgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5TZXRCdWZmZXIoYnVmLCBvZmYsIGxlbik7CisKKyAgICAgICAgICAgIC8vIElubGluZSBldmVudCBoYW5kbGVyIGZvciB0aGUgQ29tcGxldGVkIGV2ZW50LgorICAgICAgICAgICAgLy8gTm90ZTogVGhpcyBldmVuIGhhbmRsZXIgd2FzIGltcGxlbWVudGVkIGlubGluZSBpbiBvcmRlciB0byBtYWtlCisgICAgICAgICAgICAvLyB0aGlzIG1ldGhvZCBzZWxmLWNvbnRhaW5lZC4KKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLkNvbXBsZXRlZCArPSBuZXcgRXZlbnRIYW5kbGVyPFNvY2tldEFzeW5jRXZlbnRBcmdzPihkZWxlZ2F0ZShvYmplY3QgcywgU29ja2V0QXN5bmNFdmVudEFyZ3MgZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdGltZW91dCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKGUuU29ja2V0RXJyb3IgPT0gU29ja2V0RXJyb3IuU3VjY2VzcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9yZWN2Qnl0ZXMgPSBlLkJ5dGVzVHJhbnNmZXJyZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9lcnJvciA9IGUuU29ja2V0RXJyb3IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZWFkQXN5bmNDb21wbGV0ZS5TZXQoKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZXZlbnQgdG8gbm9uc2lnbmFsZWQsIGNhdXNpbmcgdGhyZWFkcyB0byBibG9jaworICAgICAgICAgICAgcmVhZEFzeW5jQ29tcGxldGUuUmVzZXQoKTsKKworICAgICAgICAgICAgLy8gTWFrZSBhbiBhc3luY2hyb25vdXMgUmVjZWl2ZSByZXF1ZXN0IG92ZXIgdGhlIHNvY2tldAorICAgICAgICAgICAgc29ja2V0LlJlY2VpdmVBc3luYyhzb2NrZXRFdmVudEFyZyk7CisKKyAgICAgICAgICAgIC8vIEJsb2NrIHRoZSBVSSB0aHJlYWQgZm9yIGEgbWF4aW11bSBvZiBUSU1FT1VUX01JTExJU0VDT05EUyBtaWxsaXNlY29uZHMuCisgICAgICAgICAgICAvLyBJZiBubyByZXNwb25zZSBjb21lcyBiYWNrIHdpdGhpbiB0aGlzIHRpbWUgdGhlbiBwcm9jZWVkCisgICAgICAgICAgICByZWFkQXN5bmNDb21wbGV0ZS5XYWl0T25lKHRoaXMudGltZW91dCk7CisKKyAgICAgICAgICAgIGlmIChfdGltZW91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVGltZWRPdXQsICJTb2NrZXQgcmVjdiB0aW1lb3V0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfZXJyb3IgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgX2Vycm9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIF9yZWN2Qnl0ZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYmVnaW5GbHVzaF9Db21wbGV0ZWQob2JqZWN0IHNlbmRlciwgU29ja2V0QXN5bmNFdmVudEFyZ3MgZSkKKyAgICAgICAgeworICAgICAgICAgICAgRmx1c2hBc3luY1Jlc3VsdCBmbHVzaEFzeW5jUmVzdWx0ID0gZS5Vc2VyVG9rZW4gYXMgRmx1c2hBc3luY1Jlc3VsdDsKKyAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuVXBkYXRlU3RhdHVzVG9Db21wbGV0ZSgpOworICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Ob3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKTsKKworICAgICAgICAgICAgaWYgKGUuU29ja2V0RXJyb3IgIT0gU29ja2V0RXJyb3IuU3VjY2VzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgZS5Tb2NrZXRFcnJvci5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgcmVxdWVzdCBhbmQgcmVzZXQgYnVmZmVyCisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG91dHB1dFN0cmVhbS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgIEZsdXNoQXN5bmNSZXN1bHQgZmx1c2hBc3luY1Jlc3VsdCA9IG5ldyBGbHVzaEFzeW5jUmVzdWx0KGNhbGxiYWNrLCBzdGF0ZSk7CisKKyAgICAgICAgICAgIFNvY2tldEFzeW5jRXZlbnRBcmdzIHNvY2tldEV2ZW50QXJnID0gbmV3IFNvY2tldEFzeW5jRXZlbnRBcmdzKCk7CisgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5SZW1vdGVFbmRQb2ludCA9IHNvY2tldC5SZW1vdGVFbmRQb2ludDsKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlVzZXJUb2tlbiA9IGZsdXNoQXN5bmNSZXN1bHQ7CisKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLkNvbXBsZXRlZCArPSBiZWdpbkZsdXNoX0NvbXBsZXRlZDsKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlNldEJ1ZmZlcihkYXRhLCAwLCBkYXRhLkxlbmd0aCk7CisKKyAgICAgICAgICAgIHNvY2tldC5TZW5kQXN5bmMoc29ja2V0RXZlbnRBcmcpOworCisgICAgICAgICAgICByZXR1cm4gZmx1c2hBc3luY1Jlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSAoRmx1c2hBc3luY1Jlc3VsdClhc3luY1Jlc3VsdDsKKworICAgICAgICAgICAgICAgIGlmICghZmx1c2hBc3luY1Jlc3VsdC5Jc0NvbXBsZXRlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB3YWl0SGFuZGxlID0gZmx1c2hBc3luY1Jlc3VsdC5Bc3luY1dhaXRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIHdhaXRIYW5kbGUuV2FpdE9uZSgpOworICAgICAgICAgICAgICAgICAgICB3YWl0SGFuZGxlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgZnJvbSBpbXBsIGZyb20gVEh0dHBDbGllbnQuY3MKKyAgICAgICAgLy8gQmFzZWQgb24gaHR0cDovL21zbXZwcy5jb20vYmxvZ3MvbHVpc2FicmV1L2FyY2hpdmUvMjAwOS8wNi8xNS9tdWx0aXRocmVhZGluZy1pbXBsZW1lbnRpbmctdGhlLWlhc3luY3Jlc3VsdC1pbnRlcmZhY2UuYXNweAorICAgICAgICBjbGFzcyBGbHVzaEFzeW5jUmVzdWx0IDogSUFzeW5jUmVzdWx0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQm9vbGVhbiBfaXNDb21wbGV0ZWQ7CisgICAgICAgICAgICBwcml2YXRlIE1hbnVhbFJlc2V0RXZlbnQgX2V2dDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQXN5bmNDYWxsYmFjayBfY2JNZXRob2Q7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfc3RhdGU7CisKKyAgICAgICAgICAgIHB1YmxpYyBGbHVzaEFzeW5jUmVzdWx0KEFzeW5jQ2FsbGJhY2sgY2JNZXRob2QsIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2JNZXRob2QgPSBjYk1ldGhvZDsKKyAgICAgICAgICAgICAgICBfc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIERhdGEgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgU29ja2V0IENvbm5lY3Rpb24geyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgaW50ZXJuYWwgVFRyYW5zcG9ydEV4Y2VwdGlvbiBBc3luY0V4Y2VwdGlvbiB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgQXN5bmNTdGF0ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfc3RhdGU7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFdhaXRIYW5kbGUgQXN5bmNXYWl0SGFuZGxlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEdldEV2dEhhbmRsZSgpOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIENvbXBsZXRlZFN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgSXNDb21wbGV0ZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lzQ29tcGxldGVkOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9sb2NrZXIgPSBuZXcgb2JqZWN0KCk7CisKKyAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBHZXRFdnRIYW5kbGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2sgKF9sb2NrZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2V2dCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChfaXNDb21wbGV0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQuU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ldnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgVXBkYXRlU3RhdHVzVG9Db21wbGV0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2lzQ29tcGxldGVkID0gdHJ1ZTsgLy8xLiBzZXQgX2lzY29tcGxldGVkIHRvIHRydWUKKyAgICAgICAgICAgICAgICBsb2NrIChfbG9ja2VyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9ldnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2V2dC5TZXQoKTsgLy8yLiBzZXQgdGhlIGV2ZW50LCB3aGVuIGl0IGV4aXN0cworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIE5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9jYk1ldGhvZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2NiTWV0aG9kKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNvY2tldC5DbG9zZSgpOworICAgICAgICAgICAgICAgIHNvY2tldCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSlzb2NrZXQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorI2VuZHJlZ2lvbgorICAgIH0KK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKaW5kZXggNGM2NGEzNi4uZDhmYTMzNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MKQEAgLTI2LDEyMyArMjYsMjIwIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRTb2NrZXQgOiBUU3RyZWFtVHJhbnNwb3J0Ci0JewotCQlwcml2YXRlIFRjcENsaWVudCBjbGllbnQgPSBudWxsOwotCQlwcml2YXRlIHN0cmluZyBob3N0ID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgcG9ydCA9IDA7Ci0JCXByaXZhdGUgaW50IHRpbWVvdXQgPSAwOworICAgIHB1YmxpYyBjbGFzcyBUU29ja2V0IDogVFN0cmVhbVRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBUY3BDbGllbnQgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaG9zdCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOworICAgICAgICBwcml2YXRlIGludCB0aW1lb3V0ID0gMDsKIAotCQlwdWJsaWMgVFNvY2tldChUY3BDbGllbnQgY2xpZW50KQotCQl7Ci0JCQl0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgcHVibGljIFRTb2NrZXQoVGNwQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CiAKLQkJCWlmIChJc09wZW4pCi0JCQl7Ci0JCQkJaW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCQkJb3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOwotCQkJfQotCQl9CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCkgOiB0aGlzKGhvc3QsIHBvcnQsIDApCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNvY2tldChzdHJpbmcgaG9zdCwgaW50IHBvcnQpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkKLQkJewotCQkJdGhpcy5ob3N0ID0gaG9zdDsKLQkJCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICBwdWJsaWMgVFNvY2tldChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CiAKLQkJCUluaXRTb2NrZXQoKTsKLQkJfQorICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQotCQl7Ci0JCQljbGllbnQgPSBuZXcgVGNwQ2xpZW50KCk7Ci0JCQljbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwQ2xpZW50KCk7CisgICAgICAgICAgICB0aGlzLmNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICB0aGlzLmNsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IFRpbWVvdXQKLQkJewotCQkJc2V0Ci0JCQl7Ci0JCQkJY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dCA9IHZhbHVlOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVGNwQ2xpZW50IFRjcENsaWVudAotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gY2xpZW50OwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RyaW5nIEhvc3QKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIGhvc3Q7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIHN0cmluZyBIb3N0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBob3N0OworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIGludCBQb3J0Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBwb3J0OwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBpbnQgUG9ydAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlpZiAoY2xpZW50ID09IG51bGwpCi0JCQkJewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXJldHVybiBjbGllbnQuQ29ubmVjdGVkOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQkJaWYgKElzT3BlbikKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOwotCQkJfQorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChwb3J0IDw9IDApCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQiKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChwb3J0IDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQiKTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKGNsaWVudCA9PSBudWxsKQotCQkJewotCQkJCUluaXRTb2NrZXQoKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgICAgICB9CiAKLQkJCWNsaWVudC5Db25uZWN0KGhvc3QsIHBvcnQpOwotCQkJaW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCQlvdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCX0KKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApICAgICAgICAgICAgLy8gbm8gdGltZW91dCAtPiBpbmZpbml0ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSB0aW1lb3V0IC0+IHVzZSBpdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbm5lY3RIZWxwZXIgaGxwID0gbmV3IENvbm5lY3RIZWxwZXIoY2xpZW50KTsKKyAgICAgICAgICAgICAgICBJQXN5bmNSZXN1bHQgYXN5bmNyZXMgPSBjbGllbnQuQmVnaW5Db25uZWN0KGhvc3QsIHBvcnQsIG5ldyBBc3luY0NhbGxiYWNrKENvbm5lY3RDYWxsYmFjayksIGhscCk7CisgICAgICAgICAgICAgICAgYm9vbCBiQ29ubmVjdGVkID0gYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLldhaXRPbmUodGltZW91dCkgJiYgY2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJDb25uZWN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NrIChobHAuTXV0ZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2FsbGJhY2tEb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jcmVzLkFzeW5jV2FpdEhhbmRsZS5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscC5Eb0NsZWFudXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlRpbWVkT3V0LCAiQ29ubmVjdCB0aW1lZCBvdXQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQotCQl7Ci0JCQliYXNlLkNsb3NlKCk7Ci0JCQlpZiAoY2xpZW50ICE9IG51bGwpCi0JCQl7Ci0JCQkJY2xpZW50LkNsb3NlKCk7Ci0JCQkJY2xpZW50ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICB9CisKKworICAgICAgICBzdGF0aWMgdm9pZCBDb25uZWN0Q2FsbGJhY2soSUFzeW5jUmVzdWx0IGFzeW5jcmVzKQorICAgICAgICB7CisgICAgICAgICAgICBDb25uZWN0SGVscGVyIGhscCA9IGFzeW5jcmVzLkFzeW5jU3RhdGUgYXMgQ29ubmVjdEhlbHBlcjsKKyAgICAgICAgICAgIGxvY2sgKGhscC5NdXRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBobHAuQ2FsbGJhY2tEb25lID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DbGllbnQuQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50LkVuZENvbm5lY3QoYXN5bmNyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggdGhhdCBhd2F5CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGhscC5Eb0NsZWFudXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2xpZW50IGlzIElEaXNwb3NhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpaGxwLkNsaWVudCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIENvbm5lY3RIZWxwZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIG9iamVjdCBNdXRleCA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIERvQ2xlYW51cCA9IGZhbHNlOworICAgICAgICAgICAgcHVibGljIGJvb2wgQ2FsbGJhY2tEb25lID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IENsaWVudDsKKyAgICAgICAgICAgIHB1YmxpYyBDb25uZWN0SGVscGVyKFRjcENsaWVudCBjbGllbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpY2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0YzBlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MKQEAgLTAsMCArMSw3OCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OworI2lmIE5FVDQ1Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworI2VuZGlmCisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm9wZXJ0eUluZm8gZm9yIHRoZSBEdWFsTW9kZSBwcm9wZXJ0eSBvZiB0aGUgU3lzdGVtLk5ldC5Tb2NrZXRzLlNvY2tldCBjbGFzcy4gVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHNvY2tldHMgYXJlIGNhcGFibGUgb2YKKyAgICAvLy8gYXV0b21hdGljIElQdjQgYW5kIElQdjYgaGFuZGxpbmcuIElmIER1YWxNb2RlIGlzIHByZXNlbnQgdGhlIHNvY2tldHMgYXV0b21hdGljYWxseSBoYW5kbGUgSVB2NCBhbmQgSVB2NiBjb25uZWN0aW9ucy4KKyAgICAvLy8gSWYgdGhlIER1YWxNb2RlIGlzIG5vdCBhdmFpbGFibGUgdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uIGRldGVybWluZXMgd2hldGhlciBJUHY0IG9yIElQdjYgaXMgdXNlZC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUU29ja2V0VmVyc2lvbml6ZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBUY3BDbGllbnQgYWNjb3JkaW5nIHRvIHRoZSBjYXBhYmlsaXRpdGVzIG9mIHRoZSB1c2VkIGZyYW1ld29yaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgVGNwQ2xpZW50IENyZWF0ZVRjcENsaWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQgPSBudWxsOworCisjaWYgTkVUNDUKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUY3BDbGllbnQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmtWNik7CisgICAgICAgICAgICBjbGllbnQuQ2xpZW50LkR1YWxNb2RlID0gdHJ1ZTsKKyNlbHNlCisgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGNwQ2xpZW50KEFkZHJlc3NGYW1pbHkuSW50ZXJOZXR3b3JrKTsKKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIFRjcExpc3RlbmVyIGFjY29yZGluZyB0byB0aGUgY2FwYWJpbGl0aXRlcyBvZiB0aGUgdXNlZCBmcmFtZXdvcmsuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBUY3BMaXN0ZW5lciBDcmVhdGVUY3BMaXN0ZW5lcihJbnQzMiBwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBUY3BMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7CisKKyNpZiBORVQ0NQorICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuSVB2NkFueSwgcG9ydCk7CisgICAgICAgICAgICBsaXN0ZW5lci5TZXJ2ZXIuRHVhbE1vZGUgPSB0cnVlOworI2Vsc2UKKworICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuQW55LCBwb3J0KTsKKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCmluZGV4IDYwYTg0MTIuLjMwNDU5OWYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCkBAIC0yNiw4MiArMjYsMTAzIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRTdHJlYW1UcmFuc3BvcnQgOiBUVHJhbnNwb3J0Ci0JewotCQlwcm90ZWN0ZWQgU3RyZWFtIGlucHV0U3RyZWFtOwotCQlwcm90ZWN0ZWQgU3RyZWFtIG91dHB1dFN0cmVhbTsKKyAgICBwdWJsaWMgY2xhc3MgVFN0cmVhbVRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gaW5wdXRTdHJlYW07CisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gb3V0cHV0U3RyZWFtOwogCi0JCXB1YmxpYyBUU3RyZWFtVHJhbnNwb3J0KCkKLQkJewotCQl9CisgICAgICAgIHByb3RlY3RlZCBUU3RyZWFtVHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTdHJlYW1UcmFuc3BvcnQoU3RyZWFtIGlucHV0U3RyZWFtLCBTdHJlYW0gb3V0cHV0U3RyZWFtKQotCQl7Ci0JCQl0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCQl0aGlzLm91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKLQkJfQorICAgICAgICBwdWJsaWMgVFN0cmVhbVRyYW5zcG9ydChTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmVhbSBvdXRwdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOworICAgICAgICB9CiAKLQkJcHVibGljIFN0cmVhbSBPdXRwdXRTdHJlYW0KLQkJewotCQkJZ2V0IHsgcmV0dXJuIG91dHB1dFN0cmVhbTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBTdHJlYW0gT3V0cHV0U3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBvdXRwdXRTdHJlYW07IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJlYW0gSW5wdXRTdHJlYW0KLQkJewotCQkJZ2V0IHsgcmV0dXJuIGlucHV0U3RyZWFtOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmVhbSBJbnB1dFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gaW5wdXRTdHJlYW07IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHJ1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQotCQl7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlpbnB1dFN0cmVhbS5DbG9zZSgpOwotCQkJCWlucHV0U3RyZWFtID0gbnVsbDsKLQkJCX0KLQkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlvdXRwdXRTdHJlYW0uQ2xvc2UoKTsKLQkJCQlvdXRwdXRTdHJlYW0gPSBudWxsOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbSIpOwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KIAotCQkJcmV0dXJuIGlucHV0U3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBpbnB1dFN0cmVhbS5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0c3RyZWFtIik7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQogCi0JCQlvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0JCX0KKyAgICAgICAgICAgIG91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKLQkJewotCQkJaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0c3RyZWFtIik7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0c3RyZWFtIik7CisgICAgICAgICAgICB9CiAKLQkJCW91dHB1dFN0cmVhbS5GbHVzaCgpOwotCQl9Ci0JfQorICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkZsdXNoKCk7CisgICAgICAgIH0KKworCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTZhOTdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MKQEAgLTAsMCArMSwyMjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTU0wgU2VydmVyIFNvY2tldCBXcmFwcGVyIENsYXNzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFRMU1NlcnZlclNvY2tldCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVuZGVybHlpbmcgdGNwIHNlcnZlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyIHNlcnZlciA9IG51bGw7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBvcnQgd2hlcmUgdGhlIHNvY2tldCBsaXN0ZW4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGltZW91dCBmb3IgdGhlIGNyZWF0ZWQgc2VydmVyIHNvY2tldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBjbGllbnRUaW1lb3V0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHNlcnZlcmNlcnRpZmljYXRlIHdpdGggdGhlIHByaXZhdGUtIGFuZCBwdWJsaWMta2V5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIHNlcnZlckNlcnRpZmljYXRlOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgY2xpZW50IGNlcnRpZmljYXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3I7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29sczsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU2VydmVyU29ja2V0IiAvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydCB3aGVyZSB0aGUgc2VydmVyIHJ1bnMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NlcnZlclNvY2tldChpbnQgcG9ydCwgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwLCBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NlcnZlclNvY2tldCIgLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQgd2hlcmUgdGhlIHNlcnZlciBydW5zLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xpZW50VGltZW91dCI+U2VuZC9yZWNlaXZlIHRpbWVvdXQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQsIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UsIGNlcnRpZmljYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU2VydmVyU29ja2V0IiAvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydCB3aGVyZSB0aGUgc2VydmVyIHJ1bnMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnRUaW1lb3V0Ij5TZW5kL3JlY2VpdmUgdGltZW91dC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVzZUJ1ZmZlcmVkU29ja2V0cyI+SWYgc2V0IHRvIDxjPnRydWU8L2M+IFt1c2UgYnVmZmVyZWQgc29ja2V0c10uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudENlcnRWYWxpZGF0b3IiPlRoZSBjZXJ0aWZpY2F0ZSB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTZXJ2ZXJTb2NrZXQoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGludCBjbGllbnRUaW1lb3V0LAorICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBUbHMxMSBhbmQgVGxzMTIgKFRMUyAxLjEgYW5kIDEuMikgYnkgZGVmYXVsdCBvbmNlIHdlIHN0YXJ0IHVzaW5nIC5ORVQgNC41Ky4KKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNlcnRpZmljYXRlLkhhc1ByaXZhdGVLZXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sICJZb3VyIHNlcnZlci1jZXJ0aWZpY2F0ZSBuZWVkcyB0byBoYXZlIGEgcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICB0aGlzLnNlcnZlckNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICB0aGlzLnVzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50Q2VydFZhbGlkYXRvciA9IGNsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMuc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BMaXN0ZW5lcih0aGlzLnBvcnQpOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgdGhpcy5wb3J0ICsgIi4iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTdGFydHMgdGhlIHNlcnZlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFjY2VwdCBpcyBub3QgYmxvY2tpbmcKKyAgICAgICAgICAgIGlmICh0aGlzLnNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlLCBzeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGJhY2sgZm9yIEFjY2VwdCBJbXBsZW1lbnRhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHJldHVybnM+CisgICAgICAgIC8vLyBUVHJhbnNwb3J0LW9iamVjdC4KKyAgICAgICAgLy8vIDwvcmV0dXJucz4KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnNlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUY3BDbGllbnQgY2xpZW50ID0gdGhpcy5zZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50KCk7CisgICAgICAgICAgICAgICAgY2xpZW50LlNlbmRUaW1lb3V0ID0gY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gdGhpcy5jbGllbnRUaW1lb3V0OworCisgICAgICAgICAgICAgICAgLy93cmFwIHRoZSBjbGllbnQgaW4gYW4gU1NMIFNvY2tldCBwYXNzaW5nIGluIHRoZSBTU0wgY2VydAorICAgICAgICAgICAgICAgIFRUTFNTb2NrZXQgc29ja2V0ID0gbmV3IFRUTFNTb2NrZXQoCisgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXJDZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnRDZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMpOworCisgICAgICAgICAgICAgICAgc29ja2V0LnNldHVwVExTKCk7CisKKyAgICAgICAgICAgICAgICBpZiAodXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0b3BzIHRoZSBTZXJ2ZXIKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy5zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4LCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwMTljMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzCkBAIC0wLDAgKzEsMzcxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU1NMIFNvY2tldCBXcmFwcGVyIGNsYXNzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFRMU1NvY2tldCA6IFRTdHJlYW1UcmFuc3BvcnQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEludGVybmFsIFRDUCBDbGllbnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBUY3BDbGllbnQgY2xpZW50OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBob3N0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIGhvc3Q7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHBvcnQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgdGltZW91dCBmb3IgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgdGltZW91dDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbnRlcm5hbCBTU0wgU3RyZWFtIGZvciBJTworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFNzbFN0cmVhbSBzZWN1cmVTdHJlYW07CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRGVmaW5lcyB3aGV0ZXIgb3Igbm90IHRoaXMgc29ja2V0IGlzIGEgc2VydmVyIHNvY2tldDxici8+CisgICAgICAgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIHRoZSBUTFMtYXV0aGVudGljYXRpb24KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBib29sIGlzU2VydmVyOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBjZXJ0aWZpY2F0ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VyIGRlZmluZWQgY2VydGlmaWNhdGUgdmFsaWRhdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3I7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uU1NMIHByb3RvY29scyB0byBiZSB1c2VkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NvY2tldCIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnQiPkFuIGFscmVhZHkgY3JlYXRlZCBUQ1AtY2xpZW50PC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXNTZXJ2ZXIiPmlmIHNldCB0byA8Yz50cnVlPC9jPiBbaXMgc2VydmVyXS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKKyAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBib29sIGlzU2VydmVyID0gZmFsc2UsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIFRsczExIGFuZCBUbHMxMiAoVExTIDEuMSBhbmQgMS4yKSBieSBkZWZhdWx0IG9uY2Ugd2Ugc3RhcnQgdXNpbmcgLk5FVCA0LjUrLgorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgdGhpcy5jZXJ0VmFsaWRhdG9yID0gY2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisgICAgICAgICAgICB0aGlzLmlzU2VydmVyID0gaXNTZXJ2ZXI7CisgICAgICAgICAgICBpZiAoaXNTZXJ2ZXIgJiYgY2VydGlmaWNhdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRUTFNTb2NrZXQgbmVlZHMgY2VydGlmaWNhdGUgdG8gYmUgdXNlZCBmb3Igc2VydmVyIiwgImNlcnRpZmljYXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFzZS5pbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBiYXNlLm91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTb2NrZXQiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaG9zdCI+VGhlIGhvc3QsIHdoZXJlIHRoZSBzb2NrZXQgc2hvdWxkIGNvbm5lY3QgdG8uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlUGF0aCI+VGhlIGNlcnRpZmljYXRlIHBhdGguPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCisgICAgICAgICAgICBzdHJpbmcgaG9zdCwKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgc3RyaW5nIGNlcnRpZmljYXRlUGF0aCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLCBYNTA5Q2VydGlmaWNhdGUuQ3JlYXRlRnJvbUNlcnRGaWxlKGNlcnRpZmljYXRlUGF0aCksIGNlcnRWYWxpZGF0b3IsIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywgc3NsUHJvdG9jb2xzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU29ja2V0Ii8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imhvc3QiPlRoZSBob3N0LCB3aGVyZSB0aGUgc29ja2V0IHNob3VsZCBjb25uZWN0IHRvLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydFZhbGlkYXRvciI+VXNlciBkZWZpbmVkIGNlcnQgdmFsaWRhdG9yLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU29ja2V0KAorICAgICAgICAgICAgc3RyaW5nIGhvc3QsCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSA9IG51bGwsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwgY2VydGlmaWNhdGUsIGNlcnRWYWxpZGF0b3IsIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywgc3NsUHJvdG9jb2xzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU29ja2V0Ii8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imhvc3QiPlRoZSBob3N0LCB3aGVyZSB0aGUgc29ja2V0IHNob3VsZCBjb25uZWN0IHRvLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icG9ydCI+VGhlIHBvcnQuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0aW1lb3V0Ij5UaGUgdGltZW91dC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCisgICAgICAgICAgICBzdHJpbmcgaG9zdCwKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgaW50IHRpbWVvdXQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIHRoaXMuY2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgIHRoaXMuY2VydFZhbGlkYXRvciA9IGNlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMuc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOworCisgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIHRoZSBUY3BDbGllbnQgYW5kIHNldHMgdGhlIHRpbWVvdXRzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0U29ja2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpZW50ID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcENsaWVudCgpOworICAgICAgICAgICAgY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIGNsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXRzIFNlbmQgLyBSZWN2IFRpbWVvdXQgZm9yIElPCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5SZWNlaXZlVGltZW91dCA9IHRoaXMuY2xpZW50LlNlbmRUaW1lb3V0ID0gdGhpcy50aW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBUQ1AgY2xpZW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IFRjcENsaWVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgaG9zdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0cmluZyBIb3N0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBob3N0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgcG9ydC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBQb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBUQ1AgQ2xpZW50IGlzIENwZW4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBWYWxpZGF0ZXMgdGhlIGNlcnRpZmljYXRlcyE8YnIvPgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNlbmRlci1vYmplY3QuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIHVzZWQgY2VydGlmaWNhdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaGFpbiI+VGhlIGNlcnRpZmljYXRlIGNoYWluLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsVmFsaWRhdGlvbkVycm9ycyI+QW4gZW51bSwgd2hpY2ggbGlzdHMgYWxsIHRoZSBlcnJvcnMgZnJvbSB0aGUgLk5FVCBjZXJ0aWZpY2F0ZSBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgICAgICBwcml2YXRlIGJvb2wgRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgWDUwOUNoYWluIGNoYWluLCBTc2xQb2xpY3lFcnJvcnMgc3NsVmFsaWRhdGlvbkVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzc2xWYWxpZGF0aW9uRXJyb3JzID09IFNzbFBvbGljeUVycm9ycy5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbm5lY3RzIHRvIHRoZSBob3N0IGFuZCBzdGFydHMgdGhlIHJvdXRpbmUsIHdoaWNoIHNldHMgdXAgdGhlIFRMUworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb3J0IDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoaG9zdCwgcG9ydCk7CisKKyAgICAgICAgICAgIHNldHVwVExTKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgVExTLXN0cmVhbSBhbmQgbGF5cyBpdCBvdmVyIHRoZSBleGlzdGluZyBzb2NrZXQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgc2V0dXBUTFMoKQorICAgICAgICB7CisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayB2YWxpZGF0b3IgPSB0aGlzLmNlcnRWYWxpZGF0b3IgPz8gRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yOworCisgICAgICAgICAgICBpZiAodGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LkdldFN0cmVhbSgpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5HZXRTdHJlYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpc1NlcnZlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlciBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc1NlcnZlcih0aGlzLmNlcnRpZmljYXRlLCB0aGlzLmNlcnRWYWxpZGF0b3IgIT0gbnVsbCwgc3NsUHJvdG9jb2xzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gY2VydHMgPSBjZXJ0aWZpY2F0ZSAhPSBudWxsID8gbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24geyBjZXJ0aWZpY2F0ZSB9IDogbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNDbGllbnQoaG9zdCwgY2VydHMsIHNzbFByb3RvY29scywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gdGhpcy5zZWN1cmVTdHJlYW07CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSB0aGlzLnNlY3VyZVN0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENsb3NlcyB0aGUgU1NMIFNvY2tldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5zZWN1cmVTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKaW5kZXggZDIzOTFjMi4uNWU0YWMyMiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MKQEAgLTIyLDQ5ICsyMiwxMjUgQEAKICAqLwogCiB1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQKLQl7Ci0JCXB1YmxpYyBhYnN0cmFjdCBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQ7Ci0JCX0KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2wgUGVlaygpCi0JCXsKLQkJCXJldHVybiBJc09wZW47Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gX3BlZWtCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNQZWVrQnl0ZTsKIAotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBPcGVuKCk7CisgICAgICAgIHB1YmxpYyBib29sIFBlZWsoKQorICAgICAgICB7CisgICAgICAgICAgICAvL0lmIHdlIGFscmVhZHkgaGF2ZSBhIGJ5dGUgcmVhZCBidXQgbm90IGNvbnN1bWVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworICAgICAgICAgICAgLy9JZiB0cmFuc3BvcnQgY2xvc2VkIHdlIGNhbid0IHBlZWsuCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLQkJcHVibGljIGFic3RyYWN0IGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOworICAgICAgICAgICAgLy9UcnkgdG8gcmVhZCBvbmUgYnl0ZS4gSWYgc3VjY2VlZHMgd2Ugd2lsbCBuZWVkIHRvIHN0b3JlIGl0IGZvciB0aGUgbmV4dCByZWFkLgorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGJ5dGVzID0gUmVhZChfcGVla0J1ZmZlciwgMCwgMSk7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIGludCBSZWFkQWxsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCWludCBnb3QgPSAwOwotCQkJaW50IHJldCA9IDA7CisgICAgICAgICAgICBfaGFzUGVla0J5dGUgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAotCQkJd2hpbGUgKGdvdCA8IGxlbikKLQkJCXsKLQkJCQlyZXQgPSBSZWFkKGJ1Ziwgb2ZmICsgZ290LCBsZW4gLSBnb3QpOwotCQkJCWlmIChyZXQgPD0gMCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCIpOwotCQkJCX0KLQkJCQlnb3QgKz0gcmV0OwotCQkJfQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBPcGVuKCk7CiAKLQkJCXJldHVybiBnb3Q7Ci0JCX0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKIAotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIFZhbGlkYXRlQnVmZmVyQXJncyhieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiYnVmIik7CisgICAgICAgICAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJCdWZmZXIgb2Zmc2V0IGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiQnVmZmVyIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIGlmIChvZmYgKyBsZW4gPiBidWYuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIk5vdCBlbm91Z2ggZGF0YS4iKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2aXJ0dWFsIHZvaWQgRmx1c2goKQotCQl7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKKworICAgICAgICBwdWJsaWMgaW50IFJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaW50IGdvdCA9IDA7CisKKyAgICAgICAgICAgIC8vSWYgd2UgcHJldmlvdXNseSBwZWVrZWQgYSBieXRlLCB3ZSBuZWVkIHRvIHVzZSB0aGF0IGZpcnN0LgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZbb2ZmICsgZ290KytdID0gX3BlZWtCdWZmZXJbMF07CisgICAgICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChnb3QgPCBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IFJlYWQoYnVmLCBvZmYgKyBnb3QsIGxlbiAtIGdvdCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdCArPSByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZShieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZShidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sCisgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdHJhbnNwb3J0LiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIHRyYW5zcG9ydC4iKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZyk7CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhpcyBjb2RlLiAgUHV0IGNsZWFudXAgY29kZSBpbiBEaXNwb3NlKEJ5VmFsIGRpc3Bvc2luZyBBcyBCb29sZWFuKSBhYm92ZS4KKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgICAgICBHQy5TdXBwcmVzc0ZpbmFsaXplKHRoaXMpOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCmluZGV4IGI5NmY3ZTguLjdmNmNjMTggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCkBAIC0yNSw0NCArMjUsNDUgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgotCXsKLQkJcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZTsKKyAgICBwdWJsaWMgY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBFeGNlcHRpb25UeXBlIHR5cGU7CiAKLQkJcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oKQotCQkJOiBiYXNlKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKCkKKyAgICAgICAgICAgIDogYmFzZSgpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKLQkJCTogdGhpcygpCi0JCXsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlKQorICAgICAgICAgICAgOiB0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCi0JCQk6IGJhc2UobWVzc2FnZSkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CiAKLQkJcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCi0JCQk6IGJhc2UobWVzc2FnZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiB0eXBlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIEV4Y2VwdGlvblR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQotCQl7Ci0JCQlVbmtub3duLAotCQkJTm90T3BlbiwKLQkJCUFscmVhZHlPcGVuLAotCQkJVGltZWRPdXQsCi0JCQlFbmRPZkZpbGUKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgTm90T3BlbiwKKyAgICAgICAgICAgIEFscmVhZHlPcGVuLAorICAgICAgICAgICAgVGltZWRPdXQsCisgICAgICAgICAgICBFbmRPZkZpbGUsCisgICAgICAgICAgICBJbnRlcnJ1cHRlZAorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCmluZGV4IDhmNGYxNWQuLjQ3YTBjNjIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKQEAgLTI1LDE4ICsyNSwxOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gRnJvbSBNYXJrIFNsZWUgJiBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKLQkvLy8gRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCi0JLy8vIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQotCS8vLyBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKLQkvLy8gYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5Ci0JewotCQlwdWJsaWMgdmlydHVhbCBUVHJhbnNwb3J0IEdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKQotCQl7Ci0JCQlyZXR1cm4gdHJhbnM7Ci0JCX0KLQl9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBGcm9tIE1hcmsgU2xlZSAmYW1wOyBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKKyAgICAvLy8gRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCisgICAgLy8vIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQorICAgIC8vLyBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAgICAvLy8gYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBUVHJhbnNwb3J0IEdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9KU09OVGVzdC5jc3Byb2ogYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9KU09OVGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3ZDQzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL0pTT05UZXN0LmNzcHJvagpAQCAtMCwwICsxLDg1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj54ODY8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuMzA3MDM8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+e0UzN0EwMDM0LURDQkYtNDg4Ni1BMERBLTI1QTAzRDEyRDk3NX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+SlNPTlRlc3Q8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5KU09OVGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGU+CisgICAgPC9UYXJnZXRGcmFtZXdvcmtQcm9maWxlPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfHg4NicgIj4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+eDg2PC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXx4ODYnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQ1NoYXJwIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJhcHAuY29uZmlnIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvZ3JhbS5jcyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxMzg4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw5NSBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIEpTT05UZXN0Cit7CisgICAgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0VGhyaWZ0MjM2NSgpOyAgLy8gSlNPTiBiaW5hcnkgZGVjb2RlcyB0b28gbXVjaCBkYXRhCisgICAgICAgICAgICBUZXN0VGhyaWZ0MjMzNigpOyAgLy8gaGV4IGVuY29kaW5nIHVzaW5nIFx1WFhYWCB3aGVyZSAweFhYWFggPiAweEZGCisgICAgICAgICAgICBUZXN0VGhyaWZ0MzQwMygpOyAvLyBKU09OIGVzY2FwZWQgdW5pY29kZSBzdXJyb2dhdGUgcGFpciBzdXBwb3J0LgorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGVzdFRocmlmdDIzNjUoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcm5kID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgZm9yICh2YXIgbGVuID0gMDsgbGVuIDwgMTA7ICsrbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhV3JpdHRlbiA9IG5ldyBieXRlW2xlbl07CisgICAgICAgICAgICAgICAgcm5kLk5leHRCeXRlcyhkYXRhV3JpdHRlbik7CisKKyAgICAgICAgICAgICAgICBTdHJlYW0gc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBwcm90ID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgICAgIHByb3QuV3JpdGVCaW5hcnkoZGF0YVdyaXR0ZW4pOworCisgICAgICAgICAgICAgICAgc3RtLlBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KHN0bSwgbnVsbCk7CisgICAgICAgICAgICAgICAgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YVJlYWQgPSBwcm90LlJlYWRCaW5hcnkoKTsKKworICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChkYXRhUmVhZC5MZW5ndGggPT0gZGF0YVdyaXR0ZW4uTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFSZWFkLkxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoZGF0YVJlYWRbaV0gPT0gZGF0YVdyaXR0ZW5baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVGVzdFRocmlmdDIzMzYoKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgUlVTU0lBTl9URVhUID0gIlx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzNSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUiOworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIFJVU1NJQU5fSlNPTiA9ICJcIlxcdTA0MjBcXHUwNDQzXFx1MDQ0MVxcdTA0NDFcXHUwNDNhXFx1MDQzZVxcdTA0MzUgXFx1MDQxZFxcdTA0MzBcXHUwNDM3XFx1MDQzMlxcdTA0MzBcXHUwNDNkXFx1MDQzOFxcdTA0MzVcIiI7CisKKyAgICAgICAgICAgIC8vIHByZXBhcmUgYnVmZmVyIHdpdGggSlNPTiBkYXRhCisgICAgICAgICAgICBieXRlW10gcmF3Qnl0ZXMgPSBuZXcgYnl0ZVtSVVNTSUFOX0pTT04uTGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUlVTU0lBTl9KU09OLkxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIHJhd0J5dGVzW2ldID0gKGJ5dGUpKFJVU1NJQU5fSlNPTltpXSAmIChjaGFyKTB4RkYpOyAgLy8gb25seSBsb3cgYnl0ZXMKKworICAgICAgICAgICAgLy8gcGFyc2UgYW5kIGNoZWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbShyYXdCeXRlcyk7CisgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQocHJvdC5SZWFkU3RyaW5nKCkgPT0gUlVTU0lBTl9URVhULCAicmVhZGluZyBKU09OIHdpdGggaGV4LWVuY29kZWQgY2hhcnMgPiA4IGJpdCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRlc3RUaHJpZnQzNDAzKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIEdDTEVGX1RFWFQgPSAiXHVkODM0XHVkZDFlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBHQ0xFRl9KU09OID0gIlwiXFx1ZDgzNFxcdWRkMWVcIiI7CisKKyAgICAgICAgICAgIC8vIHBhcnNlIGFuZCBjaGVjaworICAgICAgICAgICAgdmFyIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0oRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhHQ0xFRl9KU09OKSk7CisgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQocHJvdC5SZWFkU3RyaW5nKCkgPT0gR0NMRUZfVEVYVCwgInJlYWRpbmcgSlNPTiB3aXRoIHN1cnJvZ2F0ZSBwYWlyIGhleC1lbmNvZGVkIGNoYXJzIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmY0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gQWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIMO8YmVyIGVpbmUgQXNzZW1ibHkgd2VyZGVuIMO8YmVyIGRpZSBmb2xnZW5kZW4KKy8vIEF0dHJpYnV0ZSBnZXN0ZXVlcnQuIMOEbmRlcm4gU2llIGRpZXNlIEF0dHJpYnV0d2VydGUsIHVtIGRpZSBJbmZvcm1hdGlvbmVuIHp1IMOkbmRlcm4sCisvLyBkaWUgbWl0IGVpbmVyIEFzc2VtYmx5IHZlcmtuw7xwZnQgc2luZC4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiSlNPTlRlc3QiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBEdXJjaCBGZXN0bGVnZW4gdm9uIENvbVZpc2libGUgYXVmICJmYWxzZSIgd2VyZGVuIGRpZSBUeXBlbiBpbiBkaWVzZXIgQXNzZW1ibHkgdW5zaWNodGJhcgorLy8gZsO8ciBDT00tS29tcG9uZW50ZW4uIFdlbm4gU2llIGF1ZiBlaW5lbiBUeXAgaW4gZGllc2VyIEFzc2VtYmx5IHZvbgorLy8gQ09NIHp1Z3JlaWZlbiBtw7xzc2VuLCBsZWdlbiBTaWUgZGFzIENvbVZpc2libGUtQXR0cmlidXQgZsO8ciBkaWVzZW4gVHlwIGF1ZiAidHJ1ZSIgZmVzdC4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIERpZSBmb2xnZW5kZSBHVUlEIGJlc3RpbW10IGRpZSBJRCBkZXIgVHlwYmlibGlvdGhlaywgd2VubiBkaWVzZXMgUHJvamVrdCBmw7xyIENPTSB2ZXJmw7xnYmFyIGdlbWFjaHQgd2lyZAorW2Fzc2VtYmx5OiBHdWlkKCIyYjJlN2Q1Ni0zZTY1LTQzNjgtOTJkNy1lMzRkNTZiNzEwNWUiKV0KKworLy8gVmVyc2lvbnNpbmZvcm1hdGlvbmVuIGbDvHIgZWluZSBBc3NlbWJseSBiZXN0ZWhlbiBhdXMgZGVuIGZvbGdlbmRlbiB2aWVyIFdlcnRlbjoKKy8vCisvLyAgICAgIEhhdXB0dmVyc2lvbgorLy8gICAgICBOZWJlbnZlcnNpb24KKy8vICAgICAgQnVpbGRudW1tZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBTaWUga8O2bm5lbiBhbGxlIFdlcnRlIGFuZ2ViZW4gb2RlciBkaWUgc3RhbmRhcmRtw6TDn2lnZW4gQnVpbGQtIHVuZCBSZXZpc2lvbnNudW1tZXJuCisvLyDDvGJlcm5laG1lbiwgaW5kZW0gU2llICIqIiBlaW5nZWJlbjoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vYXBwLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL2FwcC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxOTE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9KU09OL2FwcC5jb25maWcKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uPgorPHN0YXJ0dXA+PHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjQuMCIgc2t1PSIuTkVURnJhbWV3b3JrLFZlcnNpb249djQuMCIvPjwvc3RhcnR1cD48L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxMGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcwpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUZXN0Lk11bHRpcGxleDsKKworbmFtZXNwYWNlIFRlc3QuTXVsdGlwbGV4LkNsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBzdGF0aWMgdm9pZCBFeGVjdXRlKGludCBwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zOworICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgIHRyYW5zLk9wZW4oKTsKKworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHRydWUsIHRydWUpOworCisgICAgICAgICAgICAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXVsdGlwbGV4OworCisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKFByb3RvY29sLCBDb25zdGFudHMuTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKKyAgICAgICAgICAgICAgICBCZW5jaG1hcmtTZXJ2aWNlLklmYWNlIGJlbmNoID0gbmV3IEJlbmNobWFya1NlcnZpY2UuQ2xpZW50KG11bHRpcGxleCk7CisKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2woUHJvdG9jb2wsIENvbnN0YW50cy5OQU1FX0FHR1IpOworICAgICAgICAgICAgICAgIEFnZ3IuSWZhY2UgYWdnciA9IG5ldyBBZ2dyLkNsaWVudChtdWx0aXBsZXgpOworCisgICAgICAgICAgICAgICAgZm9yIChzYnl0ZSBpID0gMTsgMTAgPj0gaTsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWdnci5hZGRWYWx1ZShiZW5jaC5maWJvbmFjY2koaSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrIGluIGFnZ3IuZ2V0VmFsdWVzKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsuVG9TdHJpbmcoKSArICIgIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnMuQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcnQgPSB1c2hvcnQuUGFyc2UoYXJnc1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFeGVjdXRlKHBvcnQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2ogYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTFjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMTQ4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezVFOTFEQTE3LUU1NDgtNDE1Ri04QzlGLTlFODRFREY4RUUwNn08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+TXVsdGlwbGV4Q2xpZW50PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+TXVsdGlwbGV4Q2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+Li5cYmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD4uLlxiaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzIj4KKyAgICAgIDxMaW5rPk11bHRpcGxleC5UZXN0LkNvbW1vbi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxBZ2dyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQmVuY2htYXJrU2VydmljZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEVycm9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik11bHRpcGxleC5UZXN0LkNsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb250cmliXGFzeW5jLXRlc3RcYWdnci50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGxpYlxyYlxiZW5jaG1hcmtcQmVuY2htYXJrLnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb21waWxlclxjcHBcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwIC1vICUyNVNIT1JUX0RJUiUyNSAlMjVUSFJJRlRfU0hPUlQlMjUKKworPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODZkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiTXVsdGlwbGV4Q2xpZW50IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiNjZGQzYxRTUtNDIwQi00YjU2LTgwMTItRDZENkNFMjI1MzdGIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjUzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitHRU5FUkFURUQgPSBcCisJZ2VuLWNzaGFycC9BZ2dyLmNzIFwKKwlnZW4tY3NoYXJwL0JlbmNobWFya1NlcnZpY2UuY3MgXAorCWdlbi1jc2hhcnAvRXJyb3IuY3MKKworQlVJTFRfU09VUkNFUyA9ICQoR0VORVJBVEVEKQorCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitnZW4tY3NoYXJwL0FnZ3IuY3M6ICQodG9wX3NyY2RpcikvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAkPAorCitnZW4tY3NoYXJwL0JlbmNobWFya1NlcnZpY2UuY3MgZ2VuLWNzaGFycC9FcnJvci5jczogJCh0b3Bfc3JjZGlyKS9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3NoYXJwICQ8CisKK1RocmlmdEltcGwuZGxsOiBNdWx0aXBsZXguVGVzdC5Db21tb24uY3MgJChHRU5FUkFURUQpIC4uLy4uL1RocmlmdC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLXQ6bGlicmFyeSAtb3V0Oi4vVGhyaWZ0SW1wbC5kbGwgLXJlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsICQoR0VORVJBVEVEKSAkPAorCitNdWx0aXBsZXhDbGllbnQuZXhlOiBDbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzIFRocmlmdEltcGwuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXJlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC1yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgJDwKKworTXVsdGlwbGV4U2VydmVyLmV4ZTogU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcyBUaHJpZnRJbXBsLmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC1yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAtcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsICQ8CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBnZW4tY3NoYXJwICouZXhlICouZGxsCisKK1RFU1RQT1JUID0gOTUwMQorY2hlY2stbG9jYWw6IE11bHRpcGxleFNlcnZlci5leGUgTXVsdGlwbGV4Q2xpZW50LmV4ZQorCWVjaG8gJChURVNUUE9SVCkKKwlNT05PX1BBVEg9Li4vLi4vIHRpbWVvdXQgMTAgbW9ubyBNdWx0aXBsZXhTZXJ2ZXIuZXhlICQoVEVTVFBPUlQpICYKKwlzbGVlcCAxCisJTU9OT19QQVRIPS4uLy4uLyBtb25vIE11bHRpcGxleENsaWVudC5leGUgJChURVNUUE9SVCkKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NdWx0aXBsZXguVGVzdC5Db21tb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4Nzg1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCisvLworLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgorLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUZXN0Lk11bHRpcGxleAoreworICAgIHB1YmxpYyBjbGFzcyBDb25zdGFudHMKKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTkFNRV9CRU5DSE1BUktTRVJWSUNFID0gIkJlbmNobWFya1NlcnZpY2UiOworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE5BTUVfQUdHUiAgICAgICAgICAgICA9ICJBZ2dyIjsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODYxODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRlc3QuTXVsdGlwbGV4OworCituYW1lc3BhY2UgVGVzdC5NdWx0aXBsZXguU2VydmVyCit7CisgICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKKyAgICB7CisgICAgICAgIGNsYXNzIEJlbmNobWFya1NlcnZpY2VJbXBsIDogQmVuY2htYXJrU2VydmljZS5JZmFjZQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGZpYm9uYWNjaShzYnl0ZSBuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwcmV2LCBuZXh0LCByZXN1bHQ7CisgICAgICAgICAgICAgICAgcHJldiAgID0gMDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgIHdoaWxlIChuID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5leHQgICA9IHJlc3VsdCArIHByZXY7CisgICAgICAgICAgICAgICAgICAgIHByZXYgICA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgLS1uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQWdnclNlcnZpY2VJbXBsIDogQWdnci5JZmFjZQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PGludD4gdmFsdWVzID0gbmV3IExpc3Q8aW50PigpOworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShpbnQgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWVzLkFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PGludD4gZ2V0VmFsdWVzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZShpbnQgcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHByb3RvY29sIGZhY3RvcnksIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSh0cnVlLHRydWUpOworICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVydHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0LCAwLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgVHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIEJlbmNobWFya1NlcnZpY2UuSWZhY2UgYmVuY2hIYW5kbGVyID0gbmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKCk7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBiZW5jaFByb2Nlc3NvciA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlLlByb2Nlc3NvcihiZW5jaEhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgQWdnci5JZmFjZSBhZ2dySGFuZGxlciA9IG5ldyBBZ2dyU2VydmljZUltcGwoKTsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIGFnZ3JQcm9jZXNzb3IgPSBuZXcgQWdnci5Qcm9jZXNzb3IoYWdnckhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoQ29uc3RhbnRzLk5BTUVfQkVOQ0hNQVJLU0VSVklDRSwgYmVuY2hQcm9jZXNzb3IpOworICAgICAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvcihDb25zdGFudHMuTkFNRV9BR0dSLCBhZ2dyUHJvY2Vzc29yKTsKKworICAgICAgICAgICAgICAgIFRTZXJ2ZXIgU2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIobXVsdGlwbGV4LCBzZXJ2ZXJ0cmFucywgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9jb2xGYWN0b3J5KTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyIC4uLiIpOworICAgICAgICAgICAgICAgIFNlcnZlckVuZ2luZS5TZXJ2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUuTWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHVzaG9ydC5QYXJzZShhcmdzWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV4ZWN1dGUocG9ydCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2ogYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTQzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qCkBAIC0wLDAgKzEsMTQ4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+e0Q1OTJCREYzLTBEQ0UtNDhGQi04OTBGLUU0QUUxRDlDRTdDRH08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+TXVsdGlwbGV4U2VydmVyPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+TXVsdGlwbGV4U2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+Li5cYmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD4uLlxiaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzIj4KKyAgICAgIDxMaW5rPk11bHRpcGxleC5UZXN0LkNvbW1vbi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxBZ2dyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQmVuY2htYXJrU2VydmljZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEVycm9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik11bHRpcGxleC5UZXN0LlNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb250cmliXGFzeW5jLXRlc3RcYWdnci50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGxpYlxyYlxiZW5jaG1hcmtcQmVuY2htYXJrLnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxjb21waWxlclxjcHBcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwIC1vICUyNVNIT1JUX0RJUiUyNSAlMjVUSFJJRlRfU0hPUlQlMjUKKworPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNDA1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiTXVsdGlwbGV4U2VydmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiRjJGNDM2QzEtM0Q0Ri00MTFhLUFEQzMtQjk4ODQ4NDc2QThFIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9GaWx0ZXJDb25maWcuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTE4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzCkBAIC0wLDAgKzEsMzEgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVyQ29uZmlnCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJHbG9iYWxGaWx0ZXJzKEdsb2JhbEZpbHRlckNvbGxlY3Rpb24gZmlsdGVycykKKyAgICAgICAgeworICAgICAgICAgICAgZmlsdGVycy5BZGQobmV3IEhhbmRsZUVycm9yQXR0cmlidXRlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjYwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvUm91dGVDb25maWcuY3MKQEAgLTAsMCArMSwzOSBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLldlYi5NdmM7Cit1c2luZyBTeXN0ZW0uV2ViLlJvdXRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb3V0ZUNvbmZpZworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyUm91dGVzKFJvdXRlQ29sbGVjdGlvbiByb3V0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvdXRlcy5JZ25vcmVSb3V0ZSgie3Jlc291cmNlfS50aHJpZnQiKTsKKyAgICAgICAgICAgIHJvdXRlcy5JZ25vcmVSb3V0ZSgie3Jlc291cmNlfS5heGQveypwYXRoSW5mb30iKTsKKworICAgICAgICAgICAgcm91dGVzLk1hcFJvdXRlKAorICAgICAgICAgICAgICAgIG5hbWU6ICJEZWZhdWx0IiwKKyAgICAgICAgICAgICAgICB1cmw6ICJ7Y29udHJvbGxlcn0ve2FjdGlvbn0ve2lkfSIsCisgICAgICAgICAgICAgICAgZGVmYXVsdHM6IG5ldyB7IGNvbnRyb2xsZXIgPSAiSG9tZSIsIGFjdGlvbiA9ICJJbmRleCIsIGlkID0gVXJsUGFyYW1ldGVyLk9wdGlvbmFsIH0KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Bc3luY0h0dHBIYW5kbGVyLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI2MTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcwpAQCAtMCwwICsxLDMyIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBBc3luY0h0dHBIYW5kbGVyIDogVEh0dHBUYXNrQXN5bmNIYW5kbGVyCisgICAgeworICAgICAgICBwdWJsaWMgQXN5bmNIdHRwSGFuZGxlcigpCisgICAgICAgICAgICA6IGJhc2UoCisgICAgICAgICAgICAgICAgbmV3IFRocmlmdC5UZXN0LlNlY29uZFNlcnZpY2UuQXN5bmNQcm9jZXNzb3IobmV3IFNlY29uZFNlcnZpY2VJbXBsKCkpKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Db250cm9sbGVycy9Ib21lQ29udHJvbGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWExZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MKQEAgLTAsMCArMSw3MCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRlc3Q7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdC5Db250cm9sbGVycworeworICAgIHB1YmxpYyBjbGFzcyBIb21lQ29udHJvbGxlciA6IENvbnRyb2xsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBBY3Rpb25SZXN1bHQgSW5kZXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVmlldygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8QWN0aW9uUmVzdWx0PiBUZXN0VGhyaWZ0QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYmFzZVVyaSA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiezB9Oi8vezF9ezJ9IiwgUmVxdWVzdC5VcmwuU2NoZW1lLCBSZXF1ZXN0LlVybC5BdXRob3JpdHksCisgICAgICAgICAgICAgICAgVXJsLkNvbnRlbnQoIn4iKSkpOworCisgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlLklBc3luYyBhc3luY1NlcnZpY2UgPQorICAgICAgICAgICAgICAgIG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudChuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUSHR0cENsaWVudChuZXcgVXJpKGJhc2VVcmksICJBc3luYy50aHJpZnQiKSkpKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGFzeW5jU2VydmljZS5zZWNvbmR0ZXN0U3RyaW5nQXN5bmMoIlRlc3RTdHJpbmciKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gInRlc3RTdHJpbmcoXCJUZXN0U3RyaW5nXCIpIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgd3JvbmcgcmVzdWx0IHdhcyByZXR1cm5lZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gUmVkaXJlY3RUb0FjdGlvbigiSW5kZXgiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBY3Rpb25SZXN1bHQgVGVzdFRocmlmdFN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYmFzZVVyaSA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiezB9Oi8vezF9ezJ9IiwgUmVxdWVzdC5VcmwuU2NoZW1lLCBSZXF1ZXN0LlVybC5BdXRob3JpdHksCisgICAgICAgICAgICAgICAgVXJsLkNvbnRlbnQoIn4iKSkpOworCisgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlLklTeW5jIHNlcnZpY2UgPQorICAgICAgICAgICAgICAgIG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudChuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUSHR0cENsaWVudChuZXcgVXJpKGJhc2VVcmksICJTeW5jLnRocmlmdCIpKSkpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2VydmljZS5zZWNvbmR0ZXN0U3RyaW5nKCJUZXN0U3RyaW5nIik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9ICJ0ZXN0U3RyaW5nKFwiVGVzdFN0cmluZ1wiKSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHdyb25nIHJlc3VsdCB3YXMgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFJlZGlyZWN0VG9BY3Rpb24oIkluZGV4Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjY4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheApAQCAtMCwwICsxLDE5IEBACivvu788JUAgQXBwbGljYXRpb24gQ29kZWJlaGluZD0iR2xvYmFsLmFzYXguY3MiIEluaGVyaXRzPSJUaHJpZnRNVkNUZXN0Lk12Y0FwcGxpY2F0aW9uIiBMYW5ndWFnZT0iQyMiICU+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzMxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcwpAQCAtMCwwICsxLDM0IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uV2ViLk12YzsKK3VzaW5nIFN5c3RlbS5XZWIuUm91dGluZzsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgTXZjQXBwbGljYXRpb24gOiBTeXN0ZW0uV2ViLkh0dHBBcHBsaWNhdGlvbgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQXBwbGljYXRpb25fU3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBBcmVhUmVnaXN0cmF0aW9uLlJlZ2lzdGVyQWxsQXJlYXMoKTsKKyAgICAgICAgICAgIEZpbHRlckNvbmZpZy5SZWdpc3Rlckdsb2JhbEZpbHRlcnMoR2xvYmFsRmlsdGVycy5GaWx0ZXJzKTsKKyAgICAgICAgICAgIFJvdXRlQ29uZmlnLlJlZ2lzdGVyUm91dGVzKFJvdXRlVGFibGUuUm91dGVzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlODg5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRNVkNUZXN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkEgd2ViIHByb2plY3QgZm9yIHRlc3RpbmcgdGhlIHRocmlmdCBBU1AuTkVUIGZlYXR1cmVzLiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiMzY2ZjliZDAtM2MwZS00OGFhLWIyY2EtNjFmZDRhOTNlNDI3IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1NlY29uZFNlcnZpY2VJbXBsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDMwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcwpAQCAtMCwwICsxLDM3IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRlc3Q7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFNlY29uZFNlcnZpY2VJbXBsIDogU2Vjb25kU2VydmljZS5JQXN5bmMsIFNlY29uZFNlcnZpY2UuSVN5bmMKKyAgICB7CisgICAgICAgIHB1YmxpYyBUYXNrPHN0cmluZz4gc2Vjb25kdGVzdFN0cmluZ0FzeW5jKHN0cmluZyB0aGluZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIHNlY29uZHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUyNjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU3luY0h0dHBIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMzIgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFN5bmNIdHRwSGFuZGxlciA6IFRIdHRwSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHVibGljIFN5bmNIdHRwSGFuZGxlcigpCisgICAgICAgICAgICA6IGJhc2UoCisgICAgICAgICAgICAgICAgbmV3IFRocmlmdC5UZXN0LlNlY29uZFNlcnZpY2UuUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlSW1wbCgpKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVGhyaWZ0TVZDVGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViOTY5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsMjAwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxMi4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMiIENvbmRpdGlvbj0iRXhpc3RzKCckKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzJykiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+CisgICAgPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9PC9Qcm9qZWN0R3VpZD4KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRNVkNUZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0TVZDVGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPE12Y0J1aWxkVmlld3M+ZmFsc2U8L012Y0J1aWxkVmlld3M+CisgICAgPFVzZUlJU0V4cHJlc3M+dHJ1ZTwvVXNlSUlTRXhwcmVzcz4KKyAgICA8SUlTRXhwcmVzc1NTTFBvcnQgLz4KKyAgICA8SUlTRXhwcmVzc0Fub255bW91c0F1dGhlbnRpY2F0aW9uIC8+CisgICAgPElJU0V4cHJlc3NXaW5kb3dzQXV0aGVudGljYXRpb24gLz4KKyAgICA8SUlTRXhwcmVzc1VzZUNsYXNzaWNQaXBlbGluZU1vZGUgLz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQ1NoYXJwIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRHluYW1pY0RhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkVudGl0eSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuQXBwbGljYXRpb25TZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db21wb25lbnRNb2RlbC5EYXRhQW5ub3RhdGlvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuQWJzdHJhY3Rpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5Sb3V0aW5nIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db25maWd1cmF0aW9uIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5TZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5FbnRlcnByaXNlU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLjEuMC4wLjBcbGliXG5ldDQwXE1pY3Jvc29mdC5XZWIuSW5mcmFzdHJ1Y3R1cmUuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cCI+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2ViUmVxdWVzdCI+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkhlbHBlcnMsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuSGVscGVycy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuTXZjLjUuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLk12Yy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5SYXpvci4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5SYXpvci5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5XZWJQYWdlcywgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcy4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5XZWJQYWdlcy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5EZXBsb3ltZW50LCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLldlYlBhZ2VzLkRlcGxveW1lbnQuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwiPgorICAgICAgPEhpbnRQYXRoPi5cVGhyaWZ0SW1wbC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHBfU3RhcnRcRmlsdGVyQ29uZmlnLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcF9TdGFydFxSb3V0ZUNvbmZpZy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTeW5jSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXN5bmNIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb250cm9sbGVyc1xIb21lQ29udHJvbGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHbG9iYWwuYXNheC5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5HbG9iYWwuYXNheDwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2Vjb25kU2VydmljZUltcGwuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb250ZW50IEluY2x1ZGU9ImZhdmljb24uaWNvIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9Ikdsb2JhbC5hc2F4IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IldlYi5jb25maWciIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iV2ViLkRlYnVnLmNvbmZpZyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5XZWIuY29uZmlnPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29udGVudD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJXZWIuUmVsZWFzZS5jb25maWciPgorICAgICAgPERlcGVuZGVudFVwb24+V2ViLmNvbmZpZzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbnRlbnQ+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcV2ViLmNvbmZpZyIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xfVmlld1N0YXJ0LmNzaHRtbCIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xTaGFyZWRcX0xheW91dC5jc2h0bWwiIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcSG9tZVxJbmRleC5jc2h0bWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGb2xkZXIgSW5jbHVkZT0iQXBwX0RhdGFcIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJwYWNrYWdlcy5jb25maWciPgorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+CisgICAgPC9Db250ZW50PgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxzcmNcVGhyaWZ0LjQ1LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57ZWJjZTM1ZGEtY2Y2YS00MmJjLWEzNTctYTljMDliNTM0Mjk5fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdC40NTwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VmlzdWFsU3R1ZGlvVmVyc2lvbiBDb25kaXRpb249IickKFZpc3VhbFN0dWRpb1ZlcnNpb24pJyA9PSAnJyI+MTAuMDwvVmlzdWFsU3R1ZGlvVmVyc2lvbj4KKyAgICA8VlNUb29sc1BhdGggQ29uZGl0aW9uPSInJChWU1Rvb2xzUGF0aCknID09ICcnIj4kKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYkKFZpc3VhbFN0dWRpb1ZlcnNpb24pPC9WU1Rvb2xzUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZTVG9vbHNQYXRoKVxXZWJBcHBsaWNhdGlvbnNcTWljcm9zb2Z0LldlYkFwcGxpY2F0aW9uLnRhcmdldHMiIENvbmRpdGlvbj0iJyQoVlNUb29sc1BhdGgpJyAhPSAnJyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYxMC4wXFdlYkFwcGxpY2F0aW9uc1xNaWNyb3NvZnQuV2ViQXBwbGljYXRpb24udGFyZ2V0cyIgQ29uZGl0aW9uPSJmYWxzZSIgLz4KKyAgPFRhcmdldCBOYW1lPSJNdmNCdWlsZFZpZXdzIiBBZnRlclRhcmdldHM9IkFmdGVyQnVpbGQiIENvbmRpdGlvbj0iJyQoTXZjQnVpbGRWaWV3cyknPT0ndHJ1ZSciPgorICAgIDxBc3BOZXRDb21waWxlciBWaXJ0dWFsUGF0aD0idGVtcCIgUGh5c2ljYWxQYXRoPSIkKFdlYlByb2plY3RPdXRwdXREaXIpIiAvPgorICA8L1RhcmdldD4KKyAgPFByb2plY3RFeHRlbnNpb25zPgorICAgIDxWaXN1YWxTdHVkaW8+CisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfSI+CisgICAgICAgIDxXZWJQcm9qZWN0UHJvcGVydGllcz4KKyAgICAgICAgICA8VXNlSUlTPlRydWU8L1VzZUlJUz4KKyAgICAgICAgICA8QXV0b0Fzc2lnblBvcnQ+VHJ1ZTwvQXV0b0Fzc2lnblBvcnQ+CisgICAgICAgICAgPERldmVsb3BtZW50U2VydmVyUG9ydD41NzQ4MjwvRGV2ZWxvcG1lbnRTZXJ2ZXJQb3J0PgorICAgICAgICAgIDxEZXZlbG9wbWVudFNlcnZlclZQYXRoPi88L0RldmVsb3BtZW50U2VydmVyVlBhdGg+CisgICAgICAgICAgPElJU1VybD5odHRwOi8vbG9jYWxob3N0OjU3NDgyLzwvSUlTVXJsPgorICAgICAgICAgIDxOVExNQXV0aGVudGljYXRpb24+RmFsc2U8L05UTE1BdXRoZW50aWNhdGlvbj4KKyAgICAgICAgICA8VXNlQ3VzdG9tU2VydmVyPkZhbHNlPC9Vc2VDdXN0b21TZXJ2ZXI+CisgICAgICAgICAgPEN1c3RvbVNlcnZlclVybD4KKyAgICAgICAgICA8L0N1c3RvbVNlcnZlclVybD4KKyAgICAgICAgICA8U2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT5GYWxzZTwvU2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT4KKyAgICAgICAgPC9XZWJQcm9qZWN0UHJvcGVydGllcz4KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4KKyAgICA8L1Zpc3VhbFN0dWRpbz4KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgorZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCitTRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlx0ZXN0XFRocmlmdFRlc3QudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFxEZWJ1Z1x0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnA6YXN5bmM9dHJ1ZSAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisiJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIiAvdDpsaWJyYXJ5IC9vdXQ6IiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIgL3JlY3Vyc2U6IiQoUHJvamVjdERpcilnZW4tY3NoYXJwIlwqIC9yZWZlcmVuY2U6IiQoUHJvamVjdERpcikuLlwuLlxzcmNcYmluXERlYnVnXFRocmlmdDQ1LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+IC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvSG9tZS9JbmRleC5jc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYTdkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sCkBAIC0wLDAgKzEsMjUgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCitAeworICAgIFZpZXdCYWcuVGl0bGUgPSAiSG9tZSBQYWdlIjsKK30KKworPHA+QEh0bWwuQWN0aW9uTGluaygiVGVzdCBUaHJpZnQgQXN5bmMgU2VydmljZSIsICJUZXN0VGhyaWZ0QXN5bmMiKTwvcD4KKzxwPkBIdG1sLkFjdGlvbkxpbmsoIlRlc3QgVGhyaWZ0IFN5bmMgU2VydmljZSIsICJUZXN0VGhyaWZ0U3luYyIpPC9wPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWM5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9TaGFyZWQvX0xheW91dC5jc2h0bWwKQEAgLTAsMCArMSwzMCBAQAor77u/QCoKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKypACisKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCIgLz4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CisgICAgPHRpdGxlPlRocmlmdCBBU1AuTkVUIFRlc3Q8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgQFJlbmRlckJvZHkoKQorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvV2ViLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyMTEzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcKQEAgLTAsMCArMSw2MCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgPGNvbmZpZ1NlY3Rpb25zPgorICAgIDxzZWN0aW9uR3JvdXAgbmFtZT0ic3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvciIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLlJhem9yV2ViU2VjdGlvbkdyb3VwLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSI+CisgICAgICA8c2VjdGlvbiBuYW1lPSJob3N0IiB0eXBlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLkNvbmZpZ3VyYXRpb24uSG9zdFNlY3Rpb24sIFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiByZXF1aXJlUGVybWlzc2lvbj0iZmFsc2UiIC8+CisgICAgICA8c2VjdGlvbiBuYW1lPSJwYWdlcyIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLlJhem9yUGFnZXNTZWN0aW9uLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiAvPgorICAgIDwvc2VjdGlvbkdyb3VwPgorICA8L2NvbmZpZ1NlY3Rpb25zPgorCisgIDxzeXN0ZW0ud2ViLndlYlBhZ2VzLnJhem9yPgorICAgIDxob3N0IGZhY3RvcnlUeXBlPSJTeXN0ZW0uV2ViLk12Yy5NdmNXZWJSYXpvckhvc3RGYWN0b3J5LCBTeXN0ZW0uV2ViLk12YywgVmVyc2lvbj01LjIuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIC8+CisgICAgPHBhZ2VzIHBhZ2VCYXNlVHlwZT0iU3lzdGVtLldlYi5NdmMuV2ViVmlld1BhZ2UiPgorICAgICAgPG5hbWVzcGFjZXM+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12YyIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuTXZjLkFqYXgiIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12Yy5IdG1sIiAvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5PcHRpbWl6YXRpb24iLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuUm91dGluZyIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlRocmlmdE1WQ1Rlc3QiIC8+CisgICAgICA8L25hbWVzcGFjZXM+CisgICAgPC9wYWdlcz4KKyAgPC9zeXN0ZW0ud2ViLndlYlBhZ2VzLnJhem9yPgorCisgIDxhcHBTZXR0aW5ncz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6RW5hYmxlZCIgdmFsdWU9ImZhbHNlIiAvPgorICA8L2FwcFNldHRpbmdzPgorCisgIDxzeXN0ZW0ud2ViU2VydmVyPgorICAgIDxoYW5kbGVycz4KKyAgICAgIDxyZW1vdmUgbmFtZT0iQmxvY2tWaWV3SGFuZGxlciIvPgorICAgICAgPGFkZCBuYW1lPSJCbG9ja1ZpZXdIYW5kbGVyIiBwYXRoPSIqIiB2ZXJiPSIqIiBwcmVDb25kaXRpb249ImludGVncmF0ZWRNb2RlIiB0eXBlPSJTeXN0ZW0uV2ViLkh0dHBOb3RGb3VuZEhhbmRsZXIiIC8+CisgICAgPC9oYW5kbGVycz4KKyAgPC9zeXN0ZW0ud2ViU2VydmVyPgorCisgIDxzeXN0ZW0ud2ViPgorICAgIDxjb21waWxhdGlvbj4KKyAgICAgIDxhc3NlbWJsaWVzPgorICAgICAgICA8YWRkIGFzc2VtYmx5PSJTeXN0ZW0uV2ViLk12YywgVmVyc2lvbj01LjIuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIC8+CisgICAgICA8L2Fzc2VtYmxpZXM+CisgICAgPC9jb21waWxhdGlvbj4KKyAgPC9zeXN0ZW0ud2ViPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9fVmlld1N0YXJ0LmNzaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2RlMmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwKQEAgLTAsMCArMSwyMiBAQAor77u/QCoKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKypACisKK0B7CisgICAgTGF5b3V0ID0gIn4vVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sIjsKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5EZWJ1Zy5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDU2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnCkBAIC0wLDAgKzEsNDUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24geG1sbnM6eGR0PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1hNTC1Eb2N1bWVudC1UcmFuc2Zvcm0iPgorICA8IS0tCisgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiU2V0QXR0cmlidXRlcyIgdHJhbnNmb3JtIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZgorICAgICJjb25uZWN0aW9uU3RyaW5nIiB0byB1c2UgIlJlbGVhc2VTUUxTZXJ2ZXIiIG9ubHkgd2hlbiB0aGUgIk1hdGNoIiBsb2NhdG9yCisgICAgZmluZHMgYW4gYXR0cmlidXRlICJuYW1lIiB0aGF0IGhhcyBhIHZhbHVlIG9mICJNeURCIi4KKworICAgIDxjb25uZWN0aW9uU3RyaW5ncz4KKyAgICAgIDxhZGQgbmFtZT0iTXlEQiIKKyAgICAgICAgY29ubmVjdGlvblN0cmluZz0iRGF0YSBTb3VyY2U9UmVsZWFzZVNRTFNlcnZlcjtJbml0aWFsIENhdGFsb2c9TXlSZWxlYXNlREI7SW50ZWdyYXRlZCBTZWN1cml0eT1UcnVlIgorICAgICAgICB4ZHQ6VHJhbnNmb3JtPSJTZXRBdHRyaWJ1dGVzIiB4ZHQ6TG9jYXRvcj0iTWF0Y2gobmFtZSkiLz4KKyAgICA8L2Nvbm5lY3Rpb25TdHJpbmdzPgorICAtLT4KKyAgPHN5c3RlbS53ZWI+CisgICAgPCEtLQorICAgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiUmVwbGFjZSIgdHJhbnNmb3JtIHdpbGwgcmVwbGFjZSB0aGUgZW50aXJlCisgICAgICA8Y3VzdG9tRXJyb3JzPiBzZWN0aW9uIG9mIHlvdXIgV2ViLmNvbmZpZyBmaWxlLgorICAgICAgTm90ZSB0aGF0IGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgY3VzdG9tRXJyb3JzIHNlY3Rpb24gdW5kZXIgdGhlCisgICAgICA8c3lzdGVtLndlYj4gbm9kZSwgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgdGhlICJ4ZHQ6TG9jYXRvciIgYXR0cmlidXRlLgorCisgICAgICA8Y3VzdG9tRXJyb3JzIGRlZmF1bHRSZWRpcmVjdD0iR2VuZXJpY0Vycm9yLmh0bSIKKyAgICAgICAgbW9kZT0iUmVtb3RlT25seSIgeGR0OlRyYW5zZm9ybT0iUmVwbGFjZSI+CisgICAgICAgIDxlcnJvciBzdGF0dXNDb2RlPSI1MDAiIHJlZGlyZWN0PSJJbnRlcm5hbEVycm9yLmh0bSIvPgorICAgICAgPC9jdXN0b21FcnJvcnM+CisgICAgLS0+CisgIDwvc3lzdGVtLndlYj4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTdjMzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLlJlbGVhc2UuY29uZmlnCkBAIC0wLDAgKzEsNDYgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24geG1sbnM6eGR0PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1hNTC1Eb2N1bWVudC1UcmFuc2Zvcm0iPgorICA8IS0tCisgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiU2V0QXR0cmlidXRlcyIgdHJhbnNmb3JtIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZgorICAgICJjb25uZWN0aW9uU3RyaW5nIiB0byB1c2UgIlJlbGVhc2VTUUxTZXJ2ZXIiIG9ubHkgd2hlbiB0aGUgIk1hdGNoIiBsb2NhdG9yCisgICAgZmluZHMgYW4gYXR0cmlidXRlICJuYW1lIiB0aGF0IGhhcyBhIHZhbHVlIG9mICJNeURCIi4KKworICAgIDxjb25uZWN0aW9uU3RyaW5ncz4KKyAgICAgIDxhZGQgbmFtZT0iTXlEQiIKKyAgICAgICAgY29ubmVjdGlvblN0cmluZz0iRGF0YSBTb3VyY2U9UmVsZWFzZVNRTFNlcnZlcjtJbml0aWFsIENhdGFsb2c9TXlSZWxlYXNlREI7SW50ZWdyYXRlZCBTZWN1cml0eT1UcnVlIgorICAgICAgICB4ZHQ6VHJhbnNmb3JtPSJTZXRBdHRyaWJ1dGVzIiB4ZHQ6TG9jYXRvcj0iTWF0Y2gobmFtZSkiLz4KKyAgICA8L2Nvbm5lY3Rpb25TdHJpbmdzPgorICAtLT4KKyAgPHN5c3RlbS53ZWI+CisgICAgPGNvbXBpbGF0aW9uIHhkdDpUcmFuc2Zvcm09IlJlbW92ZUF0dHJpYnV0ZXMoZGVidWcpIiAvPgorICAgIDwhLS0KKyAgICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlJlcGxhY2UiIHRyYW5zZm9ybSB3aWxsIHJlcGxhY2UgdGhlIGVudGlyZQorICAgICAgPGN1c3RvbUVycm9ycz4gc2VjdGlvbiBvZiB5b3VyIFdlYi5jb25maWcgZmlsZS4KKyAgICAgIE5vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIGN1c3RvbUVycm9ycyBzZWN0aW9uIHVuZGVyIHRoZQorICAgICAgPHN5c3RlbS53ZWI+IG5vZGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoZSAieGR0OkxvY2F0b3IiIGF0dHJpYnV0ZS4KKworICAgICAgPGN1c3RvbUVycm9ycyBkZWZhdWx0UmVkaXJlY3Q9IkdlbmVyaWNFcnJvci5odG0iCisgICAgICAgIG1vZGU9IlJlbW90ZU9ubHkiIHhkdDpUcmFuc2Zvcm09IlJlcGxhY2UiPgorICAgICAgICA8ZXJyb3Igc3RhdHVzQ29kZT0iNTAwIiByZWRpcmVjdD0iSW50ZXJuYWxFcnJvci5odG0iLz4KKyAgICAgIDwvY3VzdG9tRXJyb3JzPgorICAgIC0tPgorICA8L3N5c3RlbS53ZWI+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU3ZDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZwpAQCAtMCwwICsxLDkyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbmZpZ3VyZSB5b3VyIEFTUC5ORVQgYXBwbGljYXRpb24sIHBsZWFzZSB2aXNpdAorICBodHRwOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJZD0zMDE4ODAKKyAgLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgPGFwcFNldHRpbmdzPgorICAgIDxhZGQga2V5PSJ3ZWJwYWdlczpWZXJzaW9uIiB2YWx1ZT0iMy4wLjAuMCIgLz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6RW5hYmxlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxhZGQga2V5PSJDbGllbnRWYWxpZGF0aW9uRW5hYmxlZCIgdmFsdWU9InRydWUiIC8+CisgICAgPGFkZCBrZXk9IlVub2J0cnVzaXZlSmF2YVNjcmlwdEVuYWJsZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxhZGQga2V5PSJvd2luOkF1dG9tYXRpY0FwcFN0YXJ0dXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPC9hcHBTZXR0aW5ncz4KKyAgPHN5c3RlbS53ZWI+CisgICAgPGF1dGhlbnRpY2F0aW9uIG1vZGU9Ik5vbmUiIC8+CisgICAgPGNvbXBpbGF0aW9uIGRlYnVnPSJ0cnVlIiB0YXJnZXRGcmFtZXdvcms9IjQuNSIgLz4KKyAgICA8aHR0cFJ1bnRpbWUgdGFyZ2V0RnJhbWV3b3JrPSI0LjUiIC8+CisgIDwvc3lzdGVtLndlYj4KKyAgPHN5c3RlbS53ZWJTZXJ2ZXI+CisgICAgPG1vZHVsZXM+CisgICAgICA8cmVtb3ZlIG5hbWU9IkZvcm1zQXV0aGVudGljYXRpb24iIC8+CisgICAgPC9tb2R1bGVzPgorICAgIDxoYW5kbGVycz4KKyAgICAgIDxhZGQgbmFtZT0iQXN5bmNIdHRwSGFuZGxlciIgdmVyYj0iKiIgcGF0aD0iQXN5bmMudGhyaWZ0IiB0eXBlPSJUaHJpZnRNVkNUZXN0LkFzeW5jSHR0cEhhbmRsZXIsIFRocmlmdE1WQ1Rlc3QiIC8+CisgICAgICA8YWRkIG5hbWU9IlN5bmNIdHRwSGFuZGxlciIgdmVyYj0iKiIgcGF0aD0iU3luYy50aHJpZnQiIHR5cGU9IlRocmlmdE1WQ1Rlc3QuU3luY0h0dHBIYW5kbGVyLCBUaHJpZnRNVkNUZXN0IiAvPgorICAgIDwvaGFuZGxlcnM+CisgIDwvc3lzdGVtLndlYlNlcnZlcj4KKyAgPHJ1bnRpbWU+CisgICAgPGFzc2VtYmx5QmluZGluZyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiPgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbi5TZWN1cml0eSIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0zLjAuMS4wIiBuZXdWZXJzaW9uPSIzLjAuMS4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTWljcm9zb2Z0Lk93aW4uU2VjdXJpdHkuT0F1dGgiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luLlNlY3VyaXR5LkNvb2tpZXMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJOZXd0b25zb2Z0Lkpzb24iIGN1bHR1cmU9Im5ldXRyYWwiIHB1YmxpY0tleVRva2VuPSIzMGFkNGZlNmIyYTZhZWVkIiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtNi4wLjAuMCIgbmV3VmVyc2lvbj0iNi4wLjAuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuT3B0aW1pemF0aW9uIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTEuMS4wLjAiIG5ld1ZlcnNpb249IjEuMS4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJXZWJHcmVhc2UiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMS41LjIuMTQyMzQiIG5ld1ZlcnNpb249IjEuNS4yLjE0MjM0IiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5IZWxwZXJzIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTMuMC4wLjAiIG5ld1ZlcnNpb249IjMuMC4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLk12YyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC01LjIuMy4wIiBuZXdWZXJzaW9uPSI1LjIuMy4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5XZWJQYWdlcyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0zLjAuMC4wIiBuZXdWZXJzaW9uPSIzLjAuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICA8L2Fzc2VtYmx5QmluZGluZz4KKyAgPC9ydW50aW1lPgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvZmF2aWNvbi5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhNzk5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGM4NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvcGFja2FnZXMuY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cGFja2FnZXM+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0Lk12YyIgdmVyc2lvbj0iNS4yLjMiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0LlJhem9yIiB2ZXJzaW9uPSIzLjIuMyIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKyAgPHBhY2thZ2UgaWQ9Ik1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMiIHZlcnNpb249IjMuMi4zIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiAvPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZSIgdmVyc2lvbj0iMS4wLjAuMCIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKzwvcGFja2FnZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2QvTWFrZWZpbGUuYW0gYi9saWIvZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTgxMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxOTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworIworIyBFbnVtZXJhdGlvbiBvZiBhbGwgdGhlIHB1YmxpYyBhbmQgcHJpdmF0ZSBtb2R1bGVzLgorIworIyBXZSB1bmNvbmRpdGlvbmFsbHkgaW5zdGFsbCBhbGwgb2YgdGhlbSwgZXZlbiBpZiBsaWJldmVudCBvciBPcGVuU1NMIGFyZQorIyBub3QgYXZhaWxhYmxlLCBidXQgYnVpbGQgdGhlIHJlc3BlY3RpdmUgbGlicmFyaWVzIG9ubHkgaWYgdGhlIERlaW1vcyBoZWFkZXJzCisjIGNvdWxkIGJlIGZvdW5kLgorIworZF90aHJpZnRtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0LywgYmFzZSkKK2RfdGhyaWZ0ZGlyID0gJChEX0lNUE9SVF9QUkVGSVgpL3RocmlmdAorZF90aHJpZnRfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfdGhyaWZ0bW9kdWxlcykpKQorCitkX2FzeW5jbW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9hc3luYy8sIGJhc2UgbGliZXZlbnQgc29ja2V0IHNzbCkKK2RfYXN5bmNkaXIgPSAkKGRfdGhyaWZ0ZGlyKS9hc3luYworZF9hc3luY19EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9hc3luY21vZHVsZXMpKSkKKworZF9jb2RlZ2VubW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9jb2RlZ2VuLywgYXN5bmNfY2xpZW50IFwKKwlhc3luY19jbGllbnRfcG9vbCBiYXNlIGNsaWVudCBjbGllbnRfcG9vbCBwcm9jZXNzb3IpCisjZF9jb2RlZ2VubW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9jb2RlZ2VuLywgYXN5bmNfY2xpZW50IFwKKyMJYXN5bmNfY2xpZW50X3Bvb2wgYmFzZSBjbGllbnQgY2xpZW50X3Bvb2wgaWRsZ2VuIHByb2Nlc3NvcikKKworZF9jb2RlZ2VuZGlyID0gJChkX3RocmlmdGRpcikvY29kZWdlbgorZF9jb2RlZ2VuX0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX2NvZGVnZW5tb2R1bGVzKSkpCisKK2RfcHJvdG9jb2xtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L3Byb3RvY29sLywgYmFzZSBiaW5hcnkgY29tcGFjdCBqc29uIFwKKwlwcm9jZXNzb3IpCitkX3Byb3RvY29sZGlyID0gJChkX3RocmlmdGRpcikvcHJvdG9jb2wKK2RfcHJvdG9jb2xfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfcHJvdG9jb2xtb2R1bGVzKSkpCisKK2Rfc2VydmVybW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9zZXJ2ZXIvLCBiYXNlIHNpbXBsZSBub25ibG9ja2luZyBcCisJdGFza3Bvb2wgdGhyZWFkZWQpCitkX3NlcnZlcmRpciA9ICQoZF90aHJpZnRkaXIpL3NlcnZlcgorZF9zZXJ2ZXJfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfc2VydmVybW9kdWxlcykpKQorCitkX3NlcnZlcnRyYW5zcG9ydG1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvc2VydmVyL3RyYW5zcG9ydC8sIGJhc2Ugc29ja2V0IHNzbCkKK2Rfc2VydmVydHJhbnNwb3J0ZGlyID0gJChkX3RocmlmdGRpcikvc2VydmVyL3RyYW5zcG9ydAorZF9zZXJ2ZXJ0cmFuc3BvcnRfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCBcCisJJChkX3NlcnZlcnRyYW5zcG9ydG1vZHVsZXMpKSkKKworZF90cmFuc3BvcnRtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L3RyYW5zcG9ydC8sIGJhc2UgYnVmZmVyZWQgZmlsZSBcCisJZnJhbWVkIGh0dHAgbWVtb3J5IHBpcGVkIHJhbmdlIHNvY2tldCBzc2wgemxpYikKK2RfdHJhbnNwb3J0ZGlyID0gJChkX3RocmlmdGRpcikvdHJhbnNwb3J0CitkX3RyYW5zcG9ydF9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF90cmFuc3BvcnRtb2R1bGVzKSkpCisKK2RfdXRpbG1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvdXRpbC8sIGF3YWl0YWJsZSBjYW5jZWxsYXRpb24gZnV0dXJlIFwKKwloYXNoc2V0KQorZF91dGlsZGlyID0gJChkX3RocmlmdGRpcikvdXRpbAorZF91dGlsX0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX3V0aWxtb2R1bGVzKSkpCisKK2RfaW50ZXJuYWxtb2R1bGVzID0gJChhZGRwcmVmaXggdGhyaWZ0L2ludGVybmFsLywgYWxnb3JpdGhtIGNvZGVnZW4gY3RmZSBcCisJZW5kaWFuIHJlc291cmNlX3Bvb2wgc29ja2V0IHNzbCBzc2xfYmlvIHRyYWl0cykKK2RfaW50ZXJuYWxkaXIgPSAkKGRfdGhyaWZ0ZGlyKS9pbnRlcm5hbAorZF9pbnRlcm5hbF9EQVRBID0gJChhZGRwcmVmaXggc3JjLywgJChhZGRzdWZmaXggLmQsICQoZF9pbnRlcm5hbG1vZHVsZXMpKSkKKworZF90ZXN0bW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9pbnRlcm5hbC90ZXN0LywgcHJvdG9jb2wgc2VydmVyKQorZF90ZXN0ZGlyID0gJChkX2ludGVybmFsZGlyKS90ZXN0CitkX3Rlc3RfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfdGVzdG1vZHVsZXMpKSkKKworZF9wdWJsaWNtb2R1bGVzID0gJChkX3RocmlmdG1vZHVsZXMpICQoZF9hc3luY21vZHVsZXMpIFwKKwkkKGRfY29kZWdlbm1vZHVsZXMpICQoZF9wcm90b2NvbG1vZHVsZXMpICQoZF9zZXJ2ZXJtb2R1bGVzKSBcCisJJChkX3NlcnZlcnRyYW5zcG9ydG1vZHVsZXMpICQoZF90cmFuc3BvcnRtb2R1bGVzKSAkKGRfdXRpbG1vZHVsZXMpCitkX3B1YmxpY3NvdXJjZXMgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX3B1YmxpY21vZHVsZXMpKSkKKworZF9tb2R1bGVzID0gJChkX3B1YmxpY21vZHVsZXMpICQoZF9pbnRlcm5hbG1vZHVsZXMpICQoZF90ZXN0bW9kdWxlcykKKworIyBMaXN0IG1vZHVsZXMgd2l0aCBleHRlcm5hbCBkZXBlbmRlbmNpZXMgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIG1haW4gbGlzdAorZF9saWJldmVudF9kZXBlbmRlbnRfbW9kdWxlcyA9IHRocmlmdC9hc3luYy9saWJldmVudCB0aHJpZnQvc2VydmVyL25vbmJsb2NraW5nCitkX29wZW5zc2xfZGVwZW5kZW50X21vZHVsZXMgPSB0aHJpZnQvYXN5bmMvc3NsIHRocmlmdC9pbnRlcm5hbC9zc2wgXAorCXRocmlmdC9pbnRlcm5hbC9zc2xfYmlvIHRocmlmdC90cmFuc3BvcnQvc3NsIHRocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NzbAorZF9tYWluX21vZHVsZXMgPSAkKGZpbHRlci1vdXQgJChkX2xpYmV2ZW50X2RlcGVuZGVudF9tb2R1bGVzKSBcCisJJChkX29wZW5zc2xfZGVwZW5kZW50X21vZHVsZXMpLCQoZF9tb2R1bGVzKSkKKworCitkX2xpYl9mbGFncyA9IC13IC13aSAtSXNyYyAtbGliCithbGxfdGFyZ2V0cyA9CisKKyMKKyMgbGliZXZlbnQtZGVwZW5kZW50IG1vZHVsZXMuCisjCitpZiBIQVZFX0RFSU1PU19FVkVOVDIKKyQoRF9FVkVOVF9MSUJfTkFNRSk6ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfbGliZXZlbnRfZGVwZW5kZW50X21vZHVsZXMpKSkKKwkkKERNRCkgLW9mJChEX0VWRU5UX0xJQl9OQU1FKSAkKGRfbGliX2ZsYWdzKSAkXgorYWxsX3RhcmdldHMgKz0gJChEX0VWRU5UX0xJQl9OQU1FKQorZW5kaWYKKworIworIyBPcGVuU1NMLWRlcGVuZGVudCBtb2R1bGVzLgorIworaWYgSEFWRV9ERUlNT1NfT1BFTlNTTAorJChEX1NTTF9MSUJfTkFNRSk6ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfb3BlbnNzbF9kZXBlbmRlbnRfbW9kdWxlcykpKQorCSQoRE1EKSAtb2YkKERfU1NMX0xJQl9OQU1FKSAkKGRfbGliX2ZsYWdzKSAkXgorYWxsX3RhcmdldHMgKz0gJChEX1NTTF9MSUJfTkFNRSkKK2VuZGlmCisKKyMKKyMgTWFpbiBsaWJyYXJ5IHRhcmdldC4KKyMKKyQoRF9MSUJfTkFNRSk6ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfbWFpbl9tb2R1bGVzKSkpCisJJChETUQpIC1vZiQoRF9MSUJfTkFNRSkgJChkX2xpYl9mbGFncykgJF4KK2FsbF90YXJnZXRzICs9ICQoRF9MSUJfTkFNRSkKKworCisjCisjIERvY3VtZW50YXRpb24gdGFyZ2V0IChyZXF1aXJlcyBEaWwpLgorIworZG9jczogJChkX3B1YmxpY3NvdXJjZXMpIHNyYy90aHJpZnQvaW5kZXguZAorCWRpbCBkZG9jIGRvY3MgLWhsIC0ta2FuZGlsICReCisKKworIworIyBIb29rIGN1c3RvbSBsaWJyYXJ5IHRhcmdldHMgaW50byB0aGUgYXV0b21ha2UgYWxsL2luc3RhbGwgdGFyZ2V0cy4KKyMKK2FsbC1sb2NhbDogJChhbGxfdGFyZ2V0cykKKworaW5zdGFsbC1leGVjLWxvY2FsOgorCSQoSU5TVEFMTF9QUk9HUkFNKSAkKGFsbF90YXJnZXRzKSAkKERFU1RESVIpJChsaWJkaXIpCisKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGRvY3MgJChEX0xJQl9OQU1FKSAkKERfRVZFTlRfTElCX05BTUUpICQoRF9TU0xfTElCX05BTUUpIHVuaXR0ZXN0CisKKworIworIyBVbml0IHRlc3RzIChidWlsdCBib3RoIGluIGRlYnVnIGFuZCByZWxlYXNlIG1vZGUpLgorIworZF90ZXN0X2ZsYWdzID0gLXVuaXR0ZXN0IC13IC13aSAtSSQodG9wX3NyY2RpcikvbGliL2Qvc3JjCisKKyMgVGhlcmUganVzdCBtdXN0IGJlIHNvbWUgd2F5IHRvIHJlYXNzaWduIGEgdmFyaWFibGUgd2l0aG91dCB3YXJuaW5ncyBpbgorIyBBdXRvbWFrZS4uLgorZF90ZXN0X21vZHVsZXNfXyA9ICQoZF9tb2R1bGVzKQorCitpZiBXSVRIX0RfRVZFTlRfVEVTVFMKK2RfdGVzdF9mbGFncyArPSAkKERNRF9MSUJFVkVOVF9GTEFHUykKK2RfdGVzdF9tb2R1bGVzXyA9ICQoZF90ZXN0X21vZHVsZXNfXykKK2Vsc2UKK2RfdGVzdF9tb2R1bGVzXyA9ICQoZmlsdGVyLW91dCAkKGRfbGliZXZlbnRfZGVwZW5kZW50X21vZHVsZXMpLCAkKGRfdGVzdF9tb2R1bGVzX18pKQorZW5kaWYKKworaWYgV0lUSF9EX1NTTF9URVNUUworZF90ZXN0X2ZsYWdzICs9ICQoRE1EX09QRU5TU0xfRkxBR1MpCitkX3Rlc3RfbW9kdWxlcyA9ICQoZF90ZXN0X21vZHVsZXNfKQorZWxzZQorZF90ZXN0X21vZHVsZXMgPSAkKGZpbHRlci1vdXQgJChkX29wZW5zc2xfZGVwZW5kZW50X21vZHVsZXMpLCAkKGRfdGVzdF9tb2R1bGVzXykpCitlbmRpZgorCit1bml0dGVzdC9lbXB0eW1haW4uZDogdW5pdHRlc3QvLmRpcmVjdG9yeQorCUBlY2hvICd2b2lkIG1haW4oKXt9JyA+JEAKKwordW5pdHRlc3QvLmRpcmVjdG9yeToKKwlta2RpciAtcCB1bml0dGVzdCB8fCBleGlzdHMgdW5pdHRlc3QKKwl0b3VjaCAkQAorCit1bml0dGVzdC9kZWJ1Zy8lOiBzcmMvJS5kICQoYWxsX3RhcmdldHMpIHVuaXR0ZXN0L2VtcHR5bWFpbi5kCisJJChETUQpIC1nIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KKwordW5pdHRlc3QvcmVsZWFzZS8lOiBzcmMvJS5kICQoYWxsX3RhcmdldHMpIHVuaXR0ZXN0L2VtcHR5bWFpbi5kCisJJChETUQpIC1PIC1yZWxlYXNlIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KKworVEVTVFMgPSAkKGFkZHByZWZpeCB1bml0dGVzdC9kZWJ1Zy8sICQoZF90ZXN0X21vZHVsZXMpKSBcCisJJChhZGRwcmVmaXggdW5pdHRlc3QvcmVsZWFzZS8sICQoZF90ZXN0X21vZHVsZXMpKQorCitwcmVjcm9zczogYWxsLWxvY2FsCisJJChNQUtFKSAtQyB0ZXN0IHByZWNyb3NzCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjIFwKKwl0ZXN0IFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9kL1JFQURNRS5tZCBiL2xpYi9kL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDM3ZTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTggQEAKK1RocmlmdCBEIFNvZnR3YXJlIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGljZW5zZQorLS0tLS0tLQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVGVzdGluZworLS0tLS0tLQorCitEIHN1cHBvcnQgaW4gVGhyaWZ0IGlzIGNvdmVyZWQgYnkgdHdvIHNldHMgb2YgdGVzdHM6IGZpcnN0LAordGhlIHVuaXQgdGVzdCBibG9ja3MgY29udGFpbmVkIGluIHRoZSBEIHNvdXJjZSBmaWxlcywgYW5kCitzZWNvbmQsIHRoZSBtb3JlIGV4dGVuc2l2ZSB0ZXN0aW5nIGFwcGxpY2F0aW9ucyBpbiB0aGUgdGVzdC8KK3N1YmRpcmVjdG9yeSwgd2hpY2ggYWxzbyBtYWtlIHVzZSBvZiB0aGUgVGhyaWZ0IGNvbXBpbGVyLgorQm90aCBhcmUgYnVpbHQgd2hlbiBydW5uaW5nICJtYWtlIGNoZWNrIiwgYnV0IG9ubHkgdGhlCit1bml0IHRlc3RzIGFyZSBpbW1lZGlhdGVseSBydW4sIGhvd2V2ZXIg4oCTIHRoZSBzZXBhcmF0ZSB0ZXN0CitjYXNlcyB0eXBpY2FsbHkgcnVuIGxvbmdlciBvciByZXF1aXJlIG1hbnVhbCBpbnRlcnZlbnRpb24uCitJdCBtaWdodCBhbHNvIGJlIHBydWRlbnQgdG8gcnVuIHRoZSBpbmRlcGVuZGVudCB0ZXN0cywKK3doaWNoIHR5cGljYWxseSBjb25zaXN0IG9mIGEgc2VydmVyIGFuZCBhIGNsaWVudCBwYXJ0LAorYWdhaW5zdCB0aGUgb3RoZXIgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb25zLgorCitUbyBidWlsZCB0aGUgdW5pdCB0ZXN0cyBvbiBXaW5kb3dzLCB0aGUgZWFzaWVzdCB3YXkgbWlnaHQKK2JlIHRvIG1hbnVhbGx5IGNyZWF0ZSBhIGZpbGUgY29udGFpbmluZyBhbiBlbXB0eSBtYWluKCkgYW5kCitpbnZva2UgdGhlIGNvbXBpbGVyIGJ5IHJ1bm5pbmcgdGhlIGZvbGxvd2luZyBpbiB0aGUgc3JjLworZGlyZWN0b3J5IChQb3dlclNoZWxsIHN5bnRheCk6CisKK2RtZCAtb2Z1bml0dGVzdCAtdW5pdHRlc3QgLXcgJChkaXIgLXIgLWZpbHRlciAnKi5kJyAtbmFtZSkKKworSWYgeW91IHdhbnQgdG8gcnVuIHRoZSB0ZXN0IGNsaWVudHMvc2VydmVycyBpbiBPcGVuU1NMCittb2RlLCB5b3UgaGF2ZSB0byBwcm92aWRlIMK7c2VydmVyLXByaXZhdGUta2V5LnBlbcKrIGFuZAorwrtzZXJ2ZXItY2VydGlmaWNhdGUucGVtwqsgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGUgc2VydmVyCitleGVjdXRhYmxlIHJlc2lkZXMgaW4sIGFuZCBhIMK7dHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW3CqworZmlsZSBmb3IgdGhlIGNsaWVudC4gVGhlIGVhc2llc3Qgd2F5IGlzIHRvIGdlbmVyYXRlIGEgbmV3CitzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSB1c2luZyB0aGUgcHJvdmlkZWQgY29uZmlnIGZpbGUKKyhvcGVuc3NsLnRlc3QuY25mKToKKworb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtbm9kZXMgLWNvbmZpZyBvcGVuc3NsLnRlc3QuY25mIFwKKyAgLW91dCBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCitjYXQgc2VydmVyLWNlcnRpZmljYXRlLnBlbSA+IHRydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtCisKK1RoaXMgc3RlcHMgYXJlIGFsc28gcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlCitBdXRvdG9vbHMgYnVpbGQgc3lzdGVtIGlmIHRoZSBmaWxlcyBhcmUgbm90IHByZXNlbnQuCmRpZmYgLS1naXQgYS9saWIvZC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2QvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYmMzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvYmFzZS5kCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgZm9yIGNsaWVudC1zaWRlIGhhbmRsaW5nIG9mIGFzeW5jaHJvbm91cworICogSS9PIG9wZXJhdGlvbnMsIGJhc2VkIG9uIGNvcm91dGluZXMuCisgKgorICogVGhlIG1haW4gcGllY2Ugb2YgdGhlIMK7Y2xpZW50IHNpZGXCqyAoZS5nLiBmb3IgVEFzeW5jQ2xpZW50IHVzZXJzKSBvZiB0aGUKKyAqIEFQSSBpcyBURnV0dXJlLCB3aGljaCByZXByZXNlbnRzIGFuIGFzeW5jaHJvbm91c2x5IGV4ZWN1dGVkIG9wZXJhdGlvbiwKKyAqIHdoaWNoIGNhbiBoYXZlIGEgcmV0dXJuIHZhbHVlLCB0aHJvdyBleGNlcHRpb25zLCBhbmQgd2hpY2ggY2FuIGJlIHdhaXRlZAorICogdXBvbi4KKyAqCisgKiBPbiB0aGUgwrtpbXBsZW1lbnRhdGlvbiBzaWRlwqssIHRoZSBpZGVhIGlzIHRoYXQgYnkgdXNpbmcgYSBUQXN5bmNUcmFuc3BvcnQKKyAqIGluc3RlYWQgb2YgYSBub3JtYWwgVFRyYW5zcG9ydCBhbmQgZXhlY3V0aW5nIHRoZSB3b3JrIHRocm91Z2ggYQorICogVEFzeW5jTWFuYWdlciwgdGhlIHNhbWUgY29kZSBhcyBmb3Igc3luY2hyb25vdXMgSS9PIGNhbiBiZSB1c2VkIGZvcgorICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBhcyB3ZWxsLCBmb3IgZXhhbXBsZToKKyAqCisgKiAtLS0KKyAqIGF1dG8gc29ja2V0ID0gbmV3IFRBc3luY1NvY2tldChzb21lVEFzeW5jU29ja2V0TWFuYWdlcigpLCBob3N0LCBwb3J0KTsKKyAqIC8vIOKApgorICogc29ja2V0LmFzeW5jTWFuYWdlci5leGVjdXRlKHNvY2tldCwgeworICogICBTb21lVGhyaWZ0U3RydWN0IHM7CisgKgorICogICAvLyBXYWl0aW5nIGZvciBzb2NrZXQgSS9PIHdpbGwgbm90IGJsb2NrIGFuIGVudGlyZSB0aHJlYWQgYnV0IGNhdXNlCisgKiAgIC8vIHRoZSBhc3luYyBtYW5hZ2VyIHRvIGV4ZWN1dGUgYW5vdGhlciB0YXNrIGluIHRoZSBtZWFudGltZSwgYmVjYXVzZQorICogICAvLyB3ZSBhcmUgdXNpbmcgVEFzeW5jU29ja2V0IGluc3RlYWQgb2YgVFNvY2tldC4KKyAqICAgcy5yZWFkKHNvY2tldCk7CisgKgorICogICAvLyBEbyBzb21ldGhpbmcgd2l0aCBzLCBlLmcuIHNldCBhIFRQcm9taXNlIHJlc3VsdCB0byBpdC4KKyAqICAgd3JpdGVsbihzKTsKKyAqIH0pOworICogLS0tCisgKi8KK21vZHVsZSB0aHJpZnQuYXN5bmMuYmFzZTsKKworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CitpbXBvcnQgc3RkLnNvY2tldC8rIDogU29ja2V0Ky87IC8vIERNRCBAQEJVRzMxNEBACitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBNYW5hZ2VzIG9uZSBvciBtb3JlIGFzeW5jaHJvbm91cyB0cmFuc3BvcnQgcmVzb3VyY2VzIChlLmcuIHNvY2tldHMgaW4gdGhlCisgKiBjYXNlIG9mIFRBc3luY1NvY2tldE1hbmFnZXIpIGFuZCBhbGxvd3Mgd29yayBpdGVtcyB0byBiZSBzdWJtaXR0ZWQgZm9yIHRoZW0uCisgKgorICogSW1wbGVtZW50YXRpb25zIHdpbGwgdHlwaWNhbGx5IHJ1biBvbmUgb3IgbW9yZSBiYWNrZ3JvdW5kIHRocmVhZHMgZm9yCisgKiBleGVjdXRpbmcgdGhlIHdvcmssIHdoaWNoIGlzIG9uZSBvZiB0aGUgcmVhc29ucyBmb3IgYSBUQXN5bmNNYW5hZ2VyIHRvIGJlCisgKiB1c2VkLiBFYWNoIHdvcmsgaXRlbSBpcyBydW4gaW4gaXRzIG93biBmaWJlciBhbmQgaXMgZXhwZWN0ZWQgdG8geWllbGQoKSBhd2F5CisgKiB3aGlsZSB3YWl0aW5nIGZvciB0aW1lLWNvbnN1bWluZyBvcGVyYXRpb25zLgorICoKKyAqIFRoZSBzZWNvbmQgaW1wb3J0YW50IHB1cnBvc2Ugb2YgVEFzeW5jTWFuYWdlciBpcyB0byBzZXJpYWxpemUgYWNjZXNzIHRvCisgKiB0aGUgdHJhbnNwb3J0IHJlc291cmNlcyDigJMgd2l0aG91dCB0YWtpbmcgY2FyZSBvZiB0aGF0LCBlLmcuIGlzc3VpbmcgbXVsdGlwbGUKKyAqIFJQQyBjYWxscyBvdmVyIHRoZSBzYW1lIGNvbm5lY3Rpb24gaW4gcmFwaWQgc3VjY2Vzc2lvbiB3b3VsZCBsaWtlbHkgbGVhZCB0bworICogbW9yZSB0aGFuIG9uZSByZXF1ZXN0IGJlaW5nIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZSwgY2F1c2luZyBvbmx5IGdhcmJhZ2UKKyAqIHRvIGFycml2ZSBhdCB0aGUgcmVtb3RlIGVuZC4KKyAqCisgKiBBbGwgbWV0aG9kcyBhcmUgdGhyZWFkLXNhZmUuCisgKi8KK2ludGVyZmFjZSBUQXN5bmNNYW5hZ2VyIHsKKyAgLyoqCisgICAqIFN1Ym1pdHMgYSB3b3JrIGl0ZW0gdG8gYmUgZXhlY3V0ZWQgYXN5bmNocm9ub3VzbHkuCisgICAqCisgICAqIEFjY2VzcyB0byBhc255YyB0cmFuc3BvcnRzIGlzIHNlcmlhbGl6ZWQg4oCTIGlmIHR3byB3b3JrIGl0ZW1zIGFzc29jaWF0ZWQKKyAgICogd2l0aCB0aGUgc2FtZSB0cmFuc3BvcnQgYXJlIHN1Ym1pdHRlZCwgdGhlIHNlY29uZCBkZWxlZ2F0ZSB3aWxsIG5vdCBiZQorICAgKiBpbnZva2VkIHVudGlsIHRoZSBmaXJzdCBoYXMgcmV0dXJuZWQsIGV2ZW4gaXQgdGhlIGxhdHRlciBjb250ZXh0LXN3aXRjaGVzCisgICAqIGF3YXkgKGJlY2F1c2UgaXQgaXMgd2FpdGluZyBmb3IgSS9PKSBhbmQgdGhlIGFzeW5jIG1hbmFnZXIgaXMgaWRsZQorICAgKiBvdGhlcndpc2UuCisgICAqCisgICAqIE9wdGlvbmFsbHksIGEgVENhbmNlbGxhdGlvbiBpbnN0YW5jZSBjYW4gYmUgc3BlY2lmaWVkLiBJZiBwcmVzZW50LAorICAgKiB0cmlnZ2VyaW5nIGl0IHdpbGwgYmUgY29uc2lkZXJlZCBhIHJlcXVlc3QgdG8gY2FuY2VsIHRoZSB3b3JrIGl0ZW0sIGlmIGl0CisgICAqIGlzIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBhc3NvY2lhdGVkIHRyYW5zcG9ydCB0byBiZWNvbWUgYXZhaWxhYmxlLgorICAgKiBEZWxlZ2F0ZXMgd2hpY2ggYXJlIGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkIChpLmUuIHdhaXRpbmcgZm9yIEkvTykgYXJlIG5vdAorICAgKiBhZmZlY3RlZCBiZWNhdXNlIHRoaXMgd291bGQgYnJpbmcgdGhlIGNvbm5lY3Rpb24gaW50byBhbiB1bmRlZmluZWQgc3RhdGUKKyAgICogKGFzIHByb2JhYmx5IGhhbGYtd3JpdHRlbiByZXF1ZXN0IG9yIGEgaGFsZi1yZWFkIHJlc3BvbnNlIHdvdWxkIGJlIGxlZnQKKyAgICogYmVoaW5kKS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSBUQXN5bmNUcmFuc3BvcnQgdGhlIHdvcmsgZGVsZWdhdGUgd2lsbCBvcGVyYXRlIG9uLiBNdXN0CisgICAqICAgICBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBUQXN5bmNNYW5hZ2VyIGluc3RhbmNlLgorICAgKiAgIHdvcmsgPSBUaGUgb3BlcmF0aW9ucyB0byBleGVjdXRlIG9uIHRoZSBnaXZlbiB0cmFuc3BvcnQuIE11c3QgbmV2ZXIKKyAgICogICAgIHRocm93LCBlcnJvcnMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gYW5vdGhlciB3YXkuIG5vdGhyb3cgc2VtYW50aWNzIGFyZQorICAgKiAgICAgZGlmZmljdWx0IHRvIGVuZm9yY2UgaW4gY29tYmluYXRpb24gd2l0aCBmaWJyZXMgdGhvdWdoLCBzbyBjdXJyZW50bHkKKyAgICogICAgIGV4Y2VwdGlvbnMgYXJlIGp1c3Qgc3dhbGxvd2VkIGJ5IFRBc3luY01hbmFnZXIgaW1wbGVtZW50YXRpb25zLgorICAgKiAgIGNhbmNlbGxhdGlvbiA9IElmIHNldCwgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpbm9uIG9mIHRoaXMgd29yaworICAgKiAgICAgaXRlbSBpZiBpdCBpcyBzdGlsbCB3YWl0aW5nIHRvIGJlIGV4ZWN1dGVkLgorICAgKgorICAgKiBOb3RlOiBUaGUgd29yayBpdGVtIHdpbGwgbGlrZWx5IGJlIGV4ZWN1dGVkIGluIGEgZGlmZmVyZW50IHRocmVhZCwgc28gbWFrZQorICAgKiAgIHN1cmUgdGhlIGNvZGUgaXQgcmVsaWVzIG9uIGlzIHRocmVhZC1zYWZlLiBBbiBleGNlcHRpb24gYXJlIHRoZSBhc3luYworICAgKiAgIHRyYW5zcG9ydHMgdGhlbXNlbHZlcywgdG8gd2hpY2ggYWNjZXNzIGlzIHNlcmlhbGl6ZWQgYXMgbm90ZWQgYWJvdmUuCisgICAqLworICB2b2lkIGV4ZWN1dGUoVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydCwgdm9pZCBkZWxlZ2F0ZSgpIHdvcmssCisgICAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsCisgICkgaW4geworICAgIGFzc2VydCh0cmFuc3BvcnQuYXN5bmNNYW5hZ2VyIGlzIHRoaXMsCisgICAgICAiVGhlIGdpdmVuIHRyYW5zcG9ydCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRBc3luY01hbmFnZXIuIik7CisgIH0KKworICAvKioKKyAgICogU3VibWl0cyBhIGRlbGVnYXRlIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZSBoYXMKKyAgICogcGFzc2VkLgorICAgKgorICAgKiBUaGUgYWN0dWFsIGFtb3VudCBvZiB0aW1lIGVsYXBzZWQgY2FuIGJlIGhpZ2hlciBpZiB0aGUgYXN5bmMgbWFuYWdlcgorICAgKiBpbnN0YW5jZSBpcyBidXN5IGFuZCB0aHVzIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uLiBUaGUKKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGR1cmF0aW9uID0gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmVmb3JlIHN0YXJ0aW5nIHRvIGV4ZWN1dGUgdGhlCisgICAqICAgICB3b3JrIGRlbGVnYXRlLgorICAgKiAgIHdvcmsgPSBUaGUgY29kZSB0byBleGVjdXRlIGFmdGVyIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgaGFzIHBhc3NlZC4KKyAgICoKKyAgICogRXhhbXBsZToKKyAgICogLS0tCisgICAqIC8vIEEgdmVyeSBiYXNpYyBleGFtcGxlIOKAkyB1c3VhbGx5LCB0aGUgYWN0dWFsbCB3b3JrIGl0ZW0gd291bGQgZW5xdWV1ZQorICAgKiAvLyBzb21lIGFzeW5jIHRyYW5zcG9ydCBvcGVyYXRpb24uCisgICAqIGF1dG8gYXN5bmNNYW5nYWdlciA9IHNvbWVBc3luY01hbmFnZXIoKTsKKyAgICoKKyAgICogVEZ1dHVyZSFpbnQgY2FsY3VsYXRlKCkgeworICAgKiAgIC8vIENyZWF0ZSBhIHByb21pc2UgYW5kIGFzeW5jaHJvbm91c2x5IHNldCBpdHMgdmFsdWUgYWZ0ZXIgdGhyZWUKKyAgICogICAvLyBzZWNvbmRzIGhhdmUgcGFzc2VkLgorICAgKiAgIGF1dG8gcHJvbWlzZSA9IG5ldyBUUHJvbWlzZSFpbnQ7CisgICAqICAgYXN5bmNNYW5hZ2VyLmRlbGF5KGR1ciEic2Vjb25kcyIoMyksIHsKKyAgICogICAgIHByb21pc2Uuc3VjY2VlZCg0Mik7CisgICAqICAgfSk7CisgICAqCisgICAqICAgLy8gSW1tZWRpYXRlbHkgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIuCisgICAqICAgcmV0dXJuIHByb21pc2U7CisgICAqIH0KKyAgICoKKyAgICogLy8gVGhpcyB3aWxsIHdhaXQgdW50aWwgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUgYW5kIHRoZW4gcHJpbnQgaXQuCisgICAqIHdyaXRlbG4oY2FsY3VsYXRlKCkud2FpdEdldCgpKTsKKyAgICogLS0tCisgICAqLworICB2b2lkIGRlbGF5KER1cmF0aW9uIGR1cmF0aW9uLCB2b2lkIGRlbGVnYXRlKCkgd29yayk7CisKKyAgLyoqCisgICAqIFNodXRzIGRvd24gYWxsIGJhY2tncm91bmQgdGhyZWFkcyBvciBvdGhlciBmYWNpbGl0aWVzIHRoYXQgbWlnaHQgaGF2ZQorICAgKiBiZWVuIHN0YXJ0ZWQgaW4gb3JkZXIgdG8gZXhlY3V0ZSB3b3JrIGl0ZW1zLiBUaGlzIGZ1bmN0aW9uIGlzIHR5cGljYWxseQorICAgKiBjYWxsZWQgZHVyaW5nIHByb2dyYW0gc2h1dGRvd24uCisgICAqCisgICAqIElmIHRoZXJlIGFyZSBzdGlsbCB0YXNrcyB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSB0aW1lb3V0IGV4cGlyZXMsIGFueQorICAgKiBjdXJyZW50bHkgZXhlY3V0ZWQgd29yayBpdGVtcyB3aWxsIG5ldmVyIHJlY2VpdmUgYW55IG5vdGlmaWNhdGlvbnMKKyAgICogZm9yIGFzeW5jIHRyYW5zcG9ydHMgbWFuYWdlZCBieSB0aGlzIGluc3RhbmNlLCBxdWV1ZWQgd29yayBpdGVtcyB3aWxsCisgICAqIGJlIHNpbGVudGx5IGRyb3BwZWQsIGFuZCBpbXBsZW1lbnRhdGlvbnMgYXJlIGFsbG93ZWQgdG8gbGVhayByZXNvdXJjZXMuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB3YWl0RmluaXNoVGltZW91dCA9IElmIHBvc2l0aXZlLCB3YWl0cyBmb3IgYWxsIHdvcmsgaXRlbXMgdG8gYmUKKyAgICogICAgIGZpbmlzaGVkIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLCBpZiBuZWdhdGl2ZSwgd2FpdHMgZm9yCisgICAqICAgICBjb21wbGV0aW9uIHdpdGhvdXQgZXZlciB0aW1pbmcgb3V0LCBpZiB6ZXJvLCBpbW1lZGlhdGVseSBzaHV0cyBkb3duCisgICAqICAgICB0aGUgYmFja2dyb3VuZCBmYWNpbGl0aWVzLgorICAgKi8KKyAgYm9vbCBzdG9wKER1cmF0aW9uIHdhaXRGaW5pc2hUaW1lb3V0ID0gZHVyISJobnNlY3MiKC0xKSk7Cit9CisKKy8qKgorICogQSBUVHJhbnNwb3J0IHdoaWNoIHVzZXMgYSBUQXN5bmNNYW5hZ2VyIHRvIHNjaGVkdWxlIG5vbi1ibG9ja2luZyBvcGVyYXRpb25zLgorICoKKyAqIFRoZSBhY3R1YWwgdHlwZSBvZiBkZXZpY2UgaXMgbm90IHNwZWNpZmllZDsgdHlwaWNhbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbAorICogZGVwZW5kIG9uIGFuIGludGVyZmFjZSBkZXJpdmVkIGZyb20gVEFzeW5jTWFuYWdlciB0byBiZSBub3RpZmllZCBvZiBjaGFuZ2VzCisgKiBpbiB0aGUgdHJhbnNwb3J0IHN0YXRlLgorICoKKyAqIFRoZSBwZWVraW5nLCByZWFkaW5nLCB3cml0aW5nIGFuZCBmbHVzaGluZyBtZXRob2RzIG11c3QgYWx3YXlzIGJlIGNhbGxlZAorICogZnJvbSB3aXRoaW4gdGhlIGFzc29jaWF0ZWQgYXN5bmMgbWFuYWdlci4KKyAqLworaW50ZXJmYWNlIFRBc3luY1RyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICAvKioKKyAgICogVGhlIFRBc3luY01hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNwb3J0LgorICAgKi8KKyAgVEFzeW5jTWFuYWdlciBhc3luY01hbmFnZXIoKSBAcHJvcGVydHk7Cit9CisKKy8qKgorICogQSBUQXN5bmNNYW5hZ2VyIHByb3ZpZGluZyBub3RpZmljaWF0aW9ucyBmb3Igc29ja2V0IGV2ZW50cy4KKyAqLworaW50ZXJmYWNlIFRBc3luY1NvY2tldE1hbmFnZXIgOiBUQXN5bmNNYW5hZ2VyIHsKKyAgLyoqCisgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IGlzIHRyaWdnZXJlZCBvbmNlIHdoZW4gYW4gZXZlbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlCisgICAqIG9jY3VycywgYW5kIHJlbW92ZWQgYWZ0ZXJ3YXJkcy4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHNvY2tldCA9IFRoZSBzb2NrZXQgdG8gbGlzdGVuIGZvciBldmVudHMgYXQuCisgICAqICAgZXZlbnRUeXBlID0gVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuCisgICAqICAgdGltZW91dCA9IFRoZSBwZXJpb2Qgb2YgdGltZSBhZnRlciB3aGljaCB0aGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQKKyAgICogICAgIHdpdGggVEFzeW5jRXZlbnRSZWFzb24uVElNRURfT1VUIGlmIG5vIGV2ZW50IGhhcHBlbmVkLgorICAgKiAgIGxpc3RlbmVyID0gVGhlIGRlbGVnYXRlIHRvIGNhbGwgd2hlbiBhbiBldmVudCBoYXBwZW5lZC4KKyAgICovCisgIHZvaWQgYWRkT25lc2hvdExpc3RlbmVyKFNvY2tldCBzb2NrZXQsIFRBc3luY0V2ZW50VHlwZSBldmVudFR5cGUsCisgICAgRHVyYXRpb24gdGltZW91dCwgVFNvY2tldEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOworCisgIC8vLyBEaXR0bworICB2b2lkIGFkZE9uZXNob3RMaXN0ZW5lcihTb2NrZXQgc29ja2V0LCBUQXN5bmNFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgIFRTb2NrZXRFdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKK30KKworLyoqCisgKiBUeXBlcyBvZiBldmVudHMgdGhhdCBjYW4gaGFwcGVuIGZvciBhbiBhc3luY2hyb25vdXMgdHJhbnNwb3J0LgorICovCitlbnVtIFRBc3luY0V2ZW50VHlwZSB7CisgIFJFQUQsIC8vLyBOZXcgZGF0YSBiZWNhbWUgYXZhaWxhYmxlIHRvIHJlYWQuCisgIFdSSVRFIC8vLyBUaGUgdHJhbnNwb3J0IGJlY2FtZSByZWFkeSB0byBiZSB3cml0dGVuIHRvLgorfQorCisvKioKKyAqIFRoZSB0eXBlIG9mIHRoZSBkZWxlZ2F0ZXMgdXNlZCB0byByZWdpc3RlciBzb2NrZXQgZXZlbnQgaGFuZGxlcnMuCisgKi8KK2FsaWFzIHZvaWQgZGVsZWdhdGUoVEFzeW5jRXZlbnRSZWFzb24gY2FsbFJlYXNvbikgVFNvY2tldEV2ZW50TGlzdGVuZXI7CisKKy8qKgorICogVGhlIHJlYXNvbiBhIGxpc3RlbmVyIHdhcyBjYWxsZWQuCisgKi8KK2VudW0gVEFzeW5jRXZlbnRSZWFzb24gOiBieXRlIHsKKyAgTk9STUFMLCAvLy8gVGhlIGV2ZW50IGxpc3RlbmVkIGZvciB3YXMgdHJpZ2dlcmVkIG5vcm1hbGx5LgorICBUSU1FRF9PVVQgLy8vIEEgdGltZW91dCBmb3IgdGhlIGV2ZW50IHdhcyBzZXQsIGFuZCBpdCBleHBpcmVkLgorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMmU0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2xpYmV2ZW50LmQKQEAgLTAsMCArMSw0NjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuYXN5bmMubGliZXZlbnQ7CisKK2ltcG9ydCBjb3JlLmF0b21pYzsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbiwgZHVyOworaW1wb3J0IGNvcmUuZXhjZXB0aW9uIDogb25PdXRPZk1lbW9yeUVycm9yOworaW1wb3J0IGNvcmUubWVtb3J5IDogR0M7CitpbXBvcnQgY29yZS50aHJlYWQgOiBGaWJlciwgVGhyZWFkOworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUuc3RkYy5zdGRsaWIgOiBmcmVlLCBtYWxsb2M7CitpbXBvcnQgZGVpbW9zLmV2ZW50Mi5ldmVudDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQsIHBvcEZyb250OworaW1wb3J0IHN0ZC5jb252IDogdGV4dCwgdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldCA6IFNvY2tldCwgc29ja2V0UGFpcjsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc29ja2V0OworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50cmFpdHM7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvLyBUbyBhdm9pZCBETUQgQEBCVUc2Mzk1QEAuCitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmFsZ29yaXRobTsKKworLyoqCisgKiBBIFRBc3luY01hbmFnZXIgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gbGliZXZlbnQuCisgKgorICogVGhlIGxpYmV2ZW50IGxvb3AgZm9yIGhhbmRsaW5nIG5vbi1ibG9ja2luZyBzb2NrZXRzIGlzIHJ1biBpbiBhIGJhY2tncm91bmQKKyAqIHRocmVhZCwgd2hpY2ggaXMgbGF6aWx5IHNwYXduZWQuIFRoZSB0aHJlYWQgaXMgbm90IGRhZW1vbml6ZWQgdG8gYXZvaWQKKyAqIGNyYXNoZXMgb24gcHJvZ3JhbSBzaHV0ZG93biwgaXQgaXMgb25seSBzdG9wcGVkIHdoZW4gdGhlIG1hbmFnZXIgaW5zdGFuY2UKKyAqIGlzIGRlc3Ryb3llZC4gU28sIHRvIGVuc3VyZSBhIGNsZWFuIHByb2dyYW0gdGVhcmRvd24sIGVpdGhlciBtYWtlIHN1cmUgdGhpcworICogaW5zdGFuY2UgZ2V0cyBkZXN0cm95ZWQgKGUuZy4gYnkgdXNpbmcgc2NvcGUpLCBvciBtYW51YWxseSBjYWxsIHN0b3AoKSBhdAorICogdGhlIGVuZC4KKyAqLworY2xhc3MgVExpYmV2ZW50QXN5bmNNYW5hZ2VyIDogVEFzeW5jU29ja2V0TWFuYWdlciB7CisgIHRoaXMoKSB7CisgICAgZXZlbnRCYXNlXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CisKKyAgICAvLyBTZXQgdXAgdGhlIHNvY2tldCBwYWlyIGZvciB0cmFuc2ZlcnJpbmcgY29udHJvbCBtZXNzYWdlcyB0byB0aGUgZXZlbnQKKyAgICAvLyBsb29wLgorICAgIGF1dG8gcGFpciA9IHNvY2tldFBhaXIoKTsKKyAgICBjb250cm9sU2VuZFNvY2tldF8gPSBwYWlyWzBdOworICAgIGNvbnRyb2xSZWNlaXZlU29ja2V0XyA9IHBhaXJbMV07CisgICAgY29udHJvbFJlY2VpdmVTb2NrZXRfLmJsb2NraW5nID0gZmFsc2U7CisKKyAgICAvLyBSZWdpc3RlciBhbiBldmVudCBmb3IgcmVjZWl2aW5nIGNvbnRyb2wgbWVzc2FnZXMuCisgICAgY29udHJvbFJlY2VpdmVFdmVudF8gPSBldmVudF9uZXcoZXZlbnRCYXNlXywgY29udHJvbFJlY2VpdmVTb2NrZXRfLmhhbmRsZSwKKyAgICAgIEVWX1JFQUQgfCBFVl9QRVJTSVNUIHwgRVZfRVQsIGFzc3VtZU5vdGhyb3coJmNvbnRyb2xNc2dSZWNlaXZlQ2FsbGJhY2spLAorICAgICAgY2FzdCh2b2lkKil0aGlzKTsKKyAgICBldmVudF9hZGQoY29udHJvbFJlY2VpdmVFdmVudF8sIG51bGwpOworCisgICAgcXVldWVkQ291bnRNdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgemVyb1F1ZXVlZENvbmRpdGlvbl8gPSBuZXcgQ29uZGl0aW9uKHF1ZXVlZENvdW50TXV0ZXhfKTsKKyAgfQorCisgIH50aGlzKCkgeworICAgIC8vIHN0b3AoKSBzaG91bGQgYmUgc2FmZSB0byBjYWxsLCBiZWNhdXNlIGVpdGhlciB3ZSBkb24ndCBoYXZlIGEgd29ya2VyCisgICAgLy8gdGhyZWFkIHJ1bm5pbmcgYW5kIGl0IGlzIGEgbm8tb3AgYW55d2F5LCBvciBpdCBpcyBndWFyYW50ZWVkIHRvIGJlCisgICAgLy8gc3RpbGwgcnVubmluZyAoYmxvY2tlZCBpbiBldmVudF9iYXNlX2xvb3ApLCBhbmQgdGh1cyBndWFyYW50ZWVkIG5vdCB0bworICAgIC8vIGJlIGdhcmJhZ2UgY29sbGVjdGVkIHlldC4KKyAgICBzdG9wKGR1ciEiaG5zZWNzIigwKSk7CisKKyAgICBldmVudF9mcmVlKGNvbnRyb2xSZWNlaXZlRXZlbnRfKTsKKyAgICBldmVudF9iYXNlX2ZyZWUoZXZlbnRCYXNlXyk7CisgICAgZXZlbnRCYXNlXyA9IG51bGw7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGV4ZWN1dGUoVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydCwgV29yayB3b3JrLAorICAgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbAorICApIHsKKyAgICBpZiAoY2FuY2VsbGF0aW9uICYmIGNhbmNlbGxhdGlvbi50cmlnZ2VyZWQpIHJldHVybjsKKworICAgIC8vIEtlZXAgdHJhY2sgdGhhdCB0aGVyZSBpcyBhIG5ldyB3b3JrIGl0ZW0gdG8gYmUgcHJvY2Vzc2VkLgorICAgIGluY3JlbWVudFF1ZXVlZENvdW50KCk7CisKKyAgICBlbnN1cmVXb3JrZXJUaHJlYWRSdW5uaW5nKCk7CisKKyAgICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBzZW5kIHRoZSBjb250cm9sIG1lc3NhZ2UgYXMgYSB3aG9sZSDigJMgd2UgY3VycmVudGx5CisgICAgLy8gYXNzdW1lIHRvIGJlIGFibGUgdG8gcmVjZWl2ZSBpdCBhdCBvbmNlIGFzIHdlbGwuIElmIHRoaXMgcHJvdmVzIHRvIGJlCisgICAgLy8gdW5zdGFibGUgKGUuZy4gc2VuZCBjb3VsZCBwb3NzaWJseSByZXR1cm4gZWFybHkgaWYgdGhlIHJlY2VpdmluZyBidWZmZXIKKyAgICAvLyBpcyBmdWxsIGFuZCB0aGUgYmxvY2tpbmcgY2FsbCBnZXRzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsKSwgaXQgY291bGQKKyAgICAvLyBiZSBjaGFuZ2VkIHRvIGEgbW9yZSBzb3BoaXN0aWNhdGVkIHNjaGVtZS4KKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVsZWdhdGUgY29udGV4dCBkb2Vzbid0IGdldCBHQ2Qgd2hpbGUgdGhlIHdvcmsgaXRlbSBpcworICAgIC8vIG9uIHRoZSB3aXJlLgorICAgIEdDLmFkZFJvb3Qod29yay5wdHIpOworCisgICAgLy8gU2VuZCB3b3JrIG1lc3NhZ2UuCisgICAgc2VuZENvbnRyb2xNc2coQ29udHJvbE1zZyhNc2dUeXBlLldPUkssIHdvcmssIHRyYW5zcG9ydCkpOworCisgICAgaWYgKGNhbmNlbGxhdGlvbikgeworICAgICAgY2FuY2VsbGF0aW9uLnRyaWdnZXJpbmcuYWRkQ2FsbGJhY2soeworICAgICAgICBzZW5kQ29udHJvbE1zZyhDb250cm9sTXNnKE1zZ1R5cGUuQ0FOQ0VMLCB3b3JrLCB0cmFuc3BvcnQpKTsKKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZGVsYXkoRHVyYXRpb24gZHVyYXRpb24sIHZvaWQgZGVsZWdhdGUoKSB3b3JrKSB7CisgICAgaW5jcmVtZW50UXVldWVkQ291bnQoKTsKKworICAgIGVuc3VyZVdvcmtlclRocmVhZFJ1bm5pbmcoKTsKKworICAgIGNvbnN0IHR2ID0gdG9UaW1ldmFsKGR1cmF0aW9uKTsKKworICAgIC8vIERNRCBAQEJVR0BAOiBDYW5ub3QgZGVkdWNlIFQgdG8gdm9pZCBkZWxlZ2F0ZSgpIGhlcmUuCisgICAgcmVnaXN0ZXJPbmVzaG90RXZlbnQhKHZvaWQgZGVsZWdhdGUoKSkoCisgICAgICAtMSwgMCwgYXNzdW1lTm90aHJvdygmZGVsYXlDYWxsYmFjayksICZ0diwKKyAgICAgIHsKKyAgICAgICAgd29yaygpOworICAgICAgICBkZWNyZW1lbnRRdWV1ZWRDb3VudCgpOworICAgICAgfQorICAgICk7CisgIH0KKworICBvdmVycmlkZSBib29sIHN0b3AoRHVyYXRpb24gd2FpdEZpbmlzaFRpbWVvdXQgPSBkdXIhImhuc2VjcyIoLTEpKSB7CisgICAgYm9vbCBjbGVhbkV4aXQgPSB0cnVlOworCisgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICBpZiAod29ya2VyVGhyZWFkXykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlZENvdW50TXV0ZXhfKSB7CisgICAgICAgICAgaWYgKHdhaXRGaW5pc2hUaW1lb3V0ID4gZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgICAgICBpZiAocXVldWVkQ291bnRfID4gMCkgeworICAgICAgICAgICAgICB6ZXJvUXVldWVkQ29uZGl0aW9uXy53YWl0KHdhaXRGaW5pc2hUaW1lb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKHdhaXRGaW5pc2hUaW1lb3V0IDwgZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgICAgICB3aGlsZSAocXVldWVkQ291bnRfID4gMCkgemVyb1F1ZXVlZENvbmRpdGlvbl8ud2FpdCgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3YWl0RmluaXNoVGltZW91dCBpcyB6ZXJvLCBpbW1lZGlhdGVseSBleGl0IGluIGFsbCBjYXNlcy4KKyAgICAgICAgICB9CisgICAgICAgICAgY2xlYW5FeGl0ID0gKHF1ZXVlZENvdW50XyA9PSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGV2ZW50QmFzZV8pOworICAgICAgICBzZW5kQ29udHJvbE1zZyhDb250cm9sTXNnKE1zZ1R5cGUuU0hVVERPV04pKTsKKyAgICAgICAgd29ya2VyVGhyZWFkXy5qb2luKCk7CisgICAgICAgIHdvcmtRdWV1ZXNfID0gbnVsbDsKKyAgICAgICAgLy8gV2UgaGF2ZSBudWtlZCBhbGwgY3VycmVudGx5IGVucXVldWVkIGl0ZW1zLCBzbyBzZXQgdGhlIGNvdW50IHRvCisgICAgICAgIC8vIHplcm8uIFRoaXMgaXMgc2FmZSB0byBkbyB3aXRob3V0IGxvY2tpbmcsIHNpbmNlIHRoZSB3b3JrZXIgdGhyZWFkCisgICAgICAgIC8vIGlzIGRvd24uCisgICAgICAgIHF1ZXVlZENvdW50XyA9IDA7CisgICAgICAgIGF0b21pY1N0b3JlKCooY2FzdChzaGFyZWQpJndvcmtlclRocmVhZF8pLCBjYXN0KHNoYXJlZChUaHJlYWQpKW51bGwpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjbGVhbkV4aXQ7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGFkZE9uZXNob3RMaXN0ZW5lcihTb2NrZXQgc29ja2V0LCBUQXN5bmNFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgICBUU29ja2V0RXZlbnRMaXN0ZW5lciBsaXN0ZW5lcgorICApIHsKKyAgICBhZGRPbmVzaG90TGlzdGVuZXJJbXBsKHNvY2tldCwgZXZlbnRUeXBlLCBudWxsLCBsaXN0ZW5lcik7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGFkZE9uZXNob3RMaXN0ZW5lcihTb2NrZXQgc29ja2V0LCBUQXN5bmNFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgIER1cmF0aW9uIHRpbWVvdXQsIFRTb2NrZXRFdmVudExpc3RlbmVyIGxpc3RlbmVyCisgICkgeworICAgIGlmICh0aW1lb3V0IDw9IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgYWRkT25lc2hvdExpc3RlbmVySW1wbChzb2NrZXQsIGV2ZW50VHlwZSwgbnVsbCwgbGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGlzIGlzIG5vdCByZWFsbHkgZG9jdW1lbnRlZCB3ZWxsLCBidXQgbGliZXZlbnQgZG9lcyBub3QgcmVxdWlyZSB0bworICAgICAgLy8ga2VlcCB0aGUgdGltZXZhbCBhcm91bmQgYWZ0ZXIgdGhlIGV2ZW50IHdhcyBhZGRlZC4KKyAgICAgIGF1dG8gdHYgPSB0b1RpbWV2YWwodGltZW91dCk7CisgICAgICBhZGRPbmVzaG90TGlzdGVuZXJJbXBsKHNvY2tldCwgZXZlbnRUeXBlLCAmdHYsIGxpc3RlbmVyKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgYWxpYXMgdm9pZCBkZWxlZ2F0ZSgpIFdvcms7CisKKyAgdm9pZCBhZGRPbmVzaG90TGlzdGVuZXJJbXBsKFNvY2tldCBzb2NrZXQsIFRBc3luY0V2ZW50VHlwZSBldmVudFR5cGUsCisgICAgIGNvbnN0KHRpbWV2YWwpKiB0aW1lb3V0LCBUU29ja2V0RXZlbnRMaXN0ZW5lciBsaXN0ZW5lcgorICApIHsKKyAgICByZWdpc3Rlck9uZXNob3RFdmVudChzb2NrZXQuaGFuZGxlLCBsaWJldmVudEV2ZW50VHlwZShldmVudFR5cGUpLAorICAgICAgYXNzdW1lTm90aHJvdygmc29ja2V0Q2FsbGJhY2spLCB0aW1lb3V0LCBsaXN0ZW5lcik7CisgIH0KKworICB2b2lkIHJlZ2lzdGVyT25lc2hvdEV2ZW50KFQpKGV2dXRpbF9zb2NrZXRfdCBmZCwgc2hvcnQgdHlwZSwKKyAgICBldmVudF9jYWxsYmFja19mbiBjYWxsYmFjaywgY29uc3QodGltZXZhbCkqIHRpbWVvdXQsIFQgcGF5bG9hZAorICApIHsKKyAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBwYXlsb2FkIG9uIHRoZSBDIGhlYXAuCisgICAgYXV0byBwYXlsb2FkTWVtID0gbWFsbG9jKHBheWxvYWQuc2l6ZW9mKTsKKyAgICBpZiAoIXBheWxvYWRNZW0pIG9uT3V0T2ZNZW1vcnlFcnJvcigpOworICAgIChjYXN0KFQqKXBheWxvYWRNZW0pWzAgLi4gMV0gPSBwYXlsb2FkOworICAgIEdDLmFkZFJhbmdlKHBheWxvYWRNZW0sIHBheWxvYWQuc2l6ZW9mKTsKKworICAgIGF1dG8gcmVzdWx0ID0gZXZlbnRfYmFzZV9vbmNlKGV2ZW50QmFzZV8sIGZkLCB0eXBlLCBjYWxsYmFjaywKKyAgICAgIHBheWxvYWRNZW0sIHRpbWVvdXQpOworCisgICAgLy8gQXNzdW1pbmcgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG91ciBhcmd1bWVudHMgd3JvbmcgYWJvdmUsIHRoZSBvbmx5IG90aGVyCisgICAgLy8gc2l0dWF0aW9uIGluIHdoaWNoIGV2ZW50X2Jhc2Vfb25jZSBjYW4gZmFpbCBpcyB3aGVuIGl0IGNhbid0IGFsbG9jYXRlCisgICAgLy8gbWVtb3J5LgorICAgIGlmIChyZXN1bHQgIT0gMCkgb25PdXRPZk1lbW9yeUVycm9yKCk7CisgIH0KKworICBlbnVtIE1zZ1R5cGUgOiB1Ynl0ZSB7CisgICAgU0hVVERPV04sCisgICAgV09SSywKKyAgICBDQU5DRUwKKyAgfQorCisgIHN0cnVjdCBDb250cm9sTXNnIHsKKyAgICBNc2dUeXBlIHR5cGU7CisgICAgV29yayB3b3JrOworICAgIFRBc3luY1RyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIH0KKworICAvKioKKyAgICogU3RhcnRzIHRoZSB3b3JrZXIgdGhyZWFkIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcuCisgICAqLworICB2b2lkIGVuc3VyZVdvcmtlclRocmVhZFJ1bm5pbmcoKSB7CisgICAgLy8gVGVjaG5pY2FsbHksIG9ubHkgaGFsZiBiYXJyaWVycyB3b3VsZCBiZSByZXF1aXJlZCBoZXJlLCBidXQgYWRkaW5nIHRoZQorICAgIC8vIGFyZ3VtZW50IHNlZW1zIHRvIHRyaWdnZXIgYSBETUQgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIEBAQlVHQEAuCisgICAgaWYgKCFhdG9taWNMb2FkKCooY2FzdChzaGFyZWQpJndvcmtlclRocmVhZF8pKSkgeworICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgIGlmICghd29ya2VyVGhyZWFkXykgeworICAgICAgICAgIGF1dG8gdGhyZWFkID0gbmV3IFRocmVhZCh7IGV2ZW50X2Jhc2VfbG9vcChldmVudEJhc2VfLCAwKTsgfSk7CisgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgYXRvbWljU3RvcmUoKihjYXN0KHNoYXJlZCkmd29ya2VyVGhyZWFkXyksIGNhc3Qoc2hhcmVkKXRocmVhZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2VuZHMgYSBjb250cm9sIG1lc3NhZ2UgdG8gdGhlIHdvcmtlciB0aHJlYWQuCisgICAqLworICB2b2lkIHNlbmRDb250cm9sTXNnKGNvbnN0KENvbnRyb2xNc2cpIG1zZykgeworICAgIGF1dG8gcmVzdWx0ID0gY29udHJvbFNlbmRTb2NrZXRfLnNlbmQoKCZtc2cpWzAgLi4gMV0pOworICAgIGVudW0gc2l6ZSA9IG1zZy5zaXplb2Y7CisgICAgZW5mb3JjZShyZXN1bHQgPT0gc2l6ZSwgbmV3IFRFeGNlcHRpb24odGV4dCgKKyAgICAgICJTZW5kaW5nIGNvbnRyb2wgbWVzc2FnZSBvZiB0eXBlICIsIG1zZy50eXBlLCAiIGZhaWxlZCAoIiwgcmVzdWx0LAorICAgICAgIiBieXRlcyBpbnN0ZWFkIG9mICIsIHNpemUsICIgdHJhbnNtaXR0ZWQpLiIpKSk7CisgIH0KKworICAvKioKKyAgICogUmVjZWl2ZXMgbWVzc2FnZXMgZnJvbSB0aGUgY29udHJvbCBtZXNzYWdlIHNvY2tldCBhbmQgYWN0cyBvbiB0aGVtLiBDYWxsZWQKKyAgICogZnJvbSB0aGUgd29ya2VyIHRocmVhZC4KKyAgICovCisgIHZvaWQgcmVjZWl2ZUNvbnRyb2xNc2coKSB7CisgICAgLy8gUmVhZCBhcyBtYW55IG5ldyB3b3JrIGl0ZW1zIG9mZiB0aGUgc29ja2V0IGFzIHBvc3NpYmxlIChhdCBsZWFzdCBvbmUKKyAgICAvLyBzaG91bGQgYmUgYXZhaWxhYmxlLCBhcyB3ZSBnb3Qgbm90aWZpZWQgYnkgbGliZXZlbnQpLgorICAgIENvbnRyb2xNc2cgbXNnOworICAgIHB0cmRpZmZfdCBieXRlc1JlYWQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGJ5dGVzUmVhZCA9IGNvbnRyb2xSZWNlaXZlU29ja2V0Xy5yZWNlaXZlKGNhc3QodWJ5dGVbXSkoKCZtc2cpWzAgLi4gMV0pKTsKKworICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgYXV0byBlcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisgICAgICAgIGlmIChlcnJubyAhPSBXT1VMRF9CTE9DS19FUlJOTykgeworICAgICAgICAgIGxvZ0Vycm9yKCJSZWFkaW5nIGNvbnRyb2wgbWVzc2FnZSwgc29tZSB3b3JrIGl0ZW0gd2lsbCBwb3NzaWJseSAiIH4KKyAgICAgICAgICAgICJuZXZlciBiZSBleGVjdXRlZDogJXMiLCBzb2NrZXRFcnJub1N0cmluZyhlcnJubykpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoYnl0ZXNSZWFkICE9IG1zZy5zaXplb2YpIGJyZWFrOworCisgICAgICAvLyBFdmVyeXRoaW5nIHdlbnQgZmluZSwgd2UgcmVjZWl2ZWQgYSBuZXcgY29udHJvbCBtZXNzYWdlLgorICAgICAgZmluYWwgc3dpdGNoIChtc2cudHlwZSkgeworICAgICAgICBjYXNlIE1zZ1R5cGUuU0hVVERPV046CisgICAgICAgICAgLy8gVGhlIG1lc3NhZ2Ugd2FzIGp1c3QgaW50ZW5kZWQgdG8gd2FrZSB1cyB1cCBmb3Igc2h1dGRvd24uCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNc2dUeXBlLkNBTkNFTDoKKyAgICAgICAgICAvLyBXaGVuIHByb2Nlc3NpbmcgYSBjYW5jZWxsYXRpb24sIHdlIG11c3Qgbm90IHRvdWNoIHRoZSBmaXJzdCBpdGVtLAorICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAgICAgIGF1dG8gcXVldWUgPSB3b3JrUXVldWVzX1ttc2cudHJhbnNwb3J0XTsKKyAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgd29ya1F1ZXVlc19bbXNnLnRyYW5zcG9ydF0gPSBbcXVldWVbMF1dIH4KKyAgICAgICAgICAgICAgcmVtb3ZlRXF1YWwocXVldWVbMSAuLiAkXSwgbXNnLndvcmspOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1zZ1R5cGUuV09SSzoKKyAgICAgICAgICAvLyBOb3cgdGhhdCB0aGUgd29yayBpdGVtIGlzIGJhY2sgaW4gdGhlIEQgd29ybGQsIHdlIGRvbid0IG5lZWQgdGhlCisgICAgICAgICAgLy8gZXh0cmEgR0Mgcm9vdCBmb3IgdGhlIGNvbnRleHQgcG9pbnRlciBhbnltb3JlIChzZWUgZXhlY3V0ZSgpKS4KKyAgICAgICAgICBHQy5yZW1vdmVSb290KG1zZy53b3JrLnB0cik7CisKKyAgICAgICAgICAvLyBBZGQgdGhlIHdvcmsgaXRlbSB0byB0aGUgcXVldWUgYW5kIGV4ZWN1dGUgaXQuCisgICAgICAgICAgYXV0byBxdWV1ZSA9IG1zZy50cmFuc3BvcnQgaW4gd29ya1F1ZXVlc187CisgICAgICAgICAgaWYgKHF1ZXVlIGlzIG51bGwgfHwgKCpxdWV1ZSkuZW1wdHkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgYWRkIHRoZSBuZXcgd29yayBpdGVtIHRvIHRoZSBxdWV1ZSBhcyB3ZWxsLAorICAgICAgICAgICAgLy8gYnV0IGltbWVkaWF0ZWx5IHN0YXJ0IGV4ZWN1dGluZyBpdC4KKyAgICAgICAgICAgIHdvcmtRdWV1ZXNfW21zZy50cmFuc3BvcnRdID0gW21zZy53b3JrXTsKKyAgICAgICAgICAgIGV4ZWN1dGVXb3JrKG1zZy50cmFuc3BvcnQsIG1zZy53b3JrKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKCpxdWV1ZSkgfj0gbXNnLndvcms7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZSBsYXN0IHJlYWQgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCBkaWRuJ3QgcmVhZCBlbm91Z2ggYnl0ZXMsIHdlIGdvdAorICAgIC8vIGEgcHJvYmxlbS4KKyAgICBpZiAoYnl0ZXNSZWFkID4gMCkgeworICAgICAgbG9nRXJyb3IoIlVuZXhwZWN0ZWQgcGFydGlhbCBjb250cm9sIG1lc3NhZ2UgcmVhZCAoJXMgYnl0ZShzKSAiIH4KKyAgICAgICAgImluc3RlYWQgb2YgJXMpLCBzb21lIHdvcmsgaXRlbSB3aWxsIHBvc3NpYmx5IG5ldmVyIGJlIGV4ZWN1dGVkLiIsCisgICAgICAgIGJ5dGVzUmVhZCwgbXNnLnNpemVvZik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEV4ZWN1dGVzIHRoZSBnaXZlbiB3b3JrIGl0ZW0gYW5kIGFsbCBvdGhlcnMgZW5xdWV1ZWQgZm9yIHRoZSBzYW1lCisgICAqIHRyYW5zcG9ydCBpbiBhIG5ldyBmaWJlci4gQ2FsbGVkIGZyb20gdGhlIHdvcmtlciB0aHJlYWQuCisgICAqLworICB2b2lkIGV4ZWN1dGVXb3JrKFRBc3luY1RyYW5zcG9ydCB0cmFuc3BvcnQsIFdvcmsgd29yaykgeworICAgIChuZXcgRmliZXIoeworICAgICAgYXV0byBpdGVtID0gd29yazsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgYWN0dWFsIHdvcmsuIEl0IHdpbGwgcG9zc2libHkgYWRkIGxpc3RlbmVycyB0byB0aGUKKyAgICAgICAgICAvLyBldmVudCBsb29wIGFuZCB5aWVsZCBhd2F5IGlmIGl0IGhhcyB0byB3YWl0IGZvciBibG9ja2luZworICAgICAgICAgIC8vIG9wZXJhdGlvbnMuIEl0IGlzIHF1aXRlIHBvc3NpYmxlIHRoYXQgYW5vdGhlciBmaWJlciB3aWxsIG1vZGlmeQorICAgICAgICAgIC8vIHRoZSB3b3JrIHF1ZXVlIGZvciB0aGUgY3VycmVudCB0cmFuc3BvcnQuCisgICAgICAgICAgaXRlbSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwganVzdCB0byBiZSBzdXJlIHRoZSB3b3JrZXIgdGhyZWFkCisgICAgICAgICAgLy8gZG9lc24ndCBzdG9wIHdvcmtpbmcgaW4gbXlzdGVyaW91cyB3YXlzIGJlY2F1c2Ugb2YgYW4gdW5oYW5kbGVkCisgICAgICAgICAgLy8gZXhjZXB0aW9uLgorICAgICAgICAgIGxvZ0Vycm9yKCJFeGNlcHRpb24gdGhyb3duIGJ5IHdvcmsgaXRlbTogJXMiLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSB3b3JrIHF1ZXVlLgorICAgICAgICAvLyBOb3RlOiBEdWUgdG8gdGhlIHZhbHVlIHNlbWFudGljcyBvZiBhcnJheSBzbGljZXMsIHdlIGhhdmUgdG8KKyAgICAgICAgLy8gcmUtbG9va3VwIHRoaXMgb24gZXZlcnkgaXRlcmF0aW9uLiBUaGlzIGNvdWxkIGJlIHNvbHZlZCwgYnV0IEknZAorICAgICAgICAvLyByYXRoZXIgcmVwbGFjZSB0aGlzIGRpcmVjdGx5IHdpdGggYSBxdWV1ZSB0eXBlIG9uY2Ugb25lIGJlY29tZXMKKyAgICAgICAgLy8gYXZhaWxhYmxlIGluIFBob2Jvcy4KKyAgICAgICAgYXV0byBxdWV1ZSA9IHdvcmtRdWV1ZXNfW3RyYW5zcG9ydF07CisgICAgICAgIGFzc2VydChxdWV1ZS5mcm9udCA9PSBpdGVtKTsKKyAgICAgICAgcXVldWUucG9wRnJvbnQoKTsKKyAgICAgICAgd29ya1F1ZXVlc19bdHJhbnNwb3J0XSA9IHF1ZXVlOworCisgICAgICAgIC8vIE5vdyB0aGF0IHRoZSB3b3JrIGl0ZW0gaXMgZG9uZSwgbm8gbG9uZ2VyIGNvdW50IGl0IGFzIHF1ZXVlZC4KKyAgICAgICAgZGVjcmVtZW50UXVldWVkQ291bnQoKTsKKworICAgICAgICBpZiAocXVldWUuZW1wdHkpIGJyZWFrOworCisgICAgICAgIC8vIElmIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHksIGV4ZWN1dGUgdGhlIG5leHQgd2FpdGluZyBpdGVtLgorICAgICAgICBpdGVtID0gcXVldWUuZnJvbnQ7CisgICAgICB9CisgICAgfSkpLmNhbGwoKTsKKyAgfQorCisgIC8qKgorICAgKiBJbmNyZW1lbnRzIHRoZSBhbW91bnQgb2YgcXVldWVkIGl0ZW1zLgorICAgKi8KKyAgdm9pZCBpbmNyZW1lbnRRdWV1ZWRDb3VudCgpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlZENvdW50TXV0ZXhfKSB7CisgICAgICArK3F1ZXVlZENvdW50XzsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRGVjcmVtZW50cyB0aGUgYW1vdW50IG9mIHF1ZXVlZCBpdGVtcy4KKyAgICovCisgIHZvaWQgZGVjcmVtZW50UXVldWVkQ291bnQoKSB7CisgICAgc3luY2hyb25pemVkIChxdWV1ZWRDb3VudE11dGV4XykgeworICAgICAgYXNzZXJ0KHF1ZXVlZENvdW50XyA+IDApOworICAgICAgLS1xdWV1ZWRDb3VudF87CisgICAgICBpZiAocXVldWVkQ291bnRfID09IDApIHsKKyAgICAgICAgemVyb1F1ZXVlZENvbmRpdGlvbl8ubm90aWZ5QWxsKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGV4dGVybihDKSB2b2lkIGNvbnRyb2xNc2dSZWNlaXZlQ2FsbGJhY2soZXZ1dGlsX3NvY2tldF90LCBzaG9ydCwKKyAgICB2b2lkICptYW5hZ2VyVGhpcworICApIHsKKyAgICAoY2FzdChUTGliZXZlbnRBc3luY01hbmFnZXIpbWFuYWdlclRoaXMpLnJlY2VpdmVDb250cm9sTXNnKCk7CisgIH0KKworICBzdGF0aWMgZXh0ZXJuKEMpIHZvaWQgc29ja2V0Q2FsbGJhY2soZXZ1dGlsX3NvY2tldF90LCBzaG9ydCBmbGFncywKKyAgICB2b2lkICphcmcKKyAgKSB7CisgICAgYXV0byByZWFzb24gPSAoZmxhZ3MgJiBFVl9USU1FT1VUKSA/IFRBc3luY0V2ZW50UmVhc29uLlRJTUVEX09VVCA6CisgICAgICBUQXN5bmNFdmVudFJlYXNvbi5OT1JNQUw7CisgICAgKCooY2FzdChUU29ja2V0RXZlbnRMaXN0ZW5lciopYXJnKSkocmVhc29uKTsKKyAgICBHQy5yZW1vdmVSYW5nZShhcmcpOworICAgIGRlc3Ryb3koYXJnKTsKKyAgICBmcmVlKGFyZyk7CisgIH0KKworICBzdGF0aWMgZXh0ZXJuKEMpIHZvaWQgZGVsYXlDYWxsYmFjayhldnV0aWxfc29ja2V0X3QsIHNob3J0IGZsYWdzLAorICAgIHZvaWQgKmFyZworICApIHsKKyAgICBhc3NlcnQoZmxhZ3MgJiBFVl9USU1FT1VUKTsKKyAgICAoKihjYXN0KHZvaWQgZGVsZWdhdGUoKSopYXJnKSkoKTsKKyAgICBHQy5yZW1vdmVSYW5nZShhcmcpOworICAgIGRlc3Ryb3koYXJnKTsKKyAgICBmcmVlKGFyZyk7CisgIH0KKworICBUaHJlYWQgd29ya2VyVGhyZWFkXzsKKworICBldmVudF9iYXNlKiBldmVudEJhc2VfOworCisgIC8vLyBUaGUgc29ja2V0IHVzZWQgZm9yIHJlY2VpdmluZyBuZXcgd29yayBpdGVtcyBpbiB0aGUgZXZlbnQgbG9vcC4gUGFpcmVkCisgIC8vLyB3aXRoIGNvbnRyb2xTZW5kU29ja2V0Xy4gSW52YWxpZCAoaS5lLiBUQXN5bmNXb3JrSXRlbS5pbml0KSBpdGVtcyBhcmUKKyAgLy8vIGlnbm9yZWQgYW5kIGNhbiBiZSB1c2VkIHRvIHdha2UgdXAgdGhlIHdvcmtlciB0aHJlYWQuCisgIFNvY2tldCBjb250cm9sUmVjZWl2ZVNvY2tldF87CisgIGV2ZW50KiBjb250cm9sUmVjZWl2ZUV2ZW50XzsKKworICAvLy8gVGhlIHNvY2tldCB1c2VkIHRvIHNlbmQgbmV3IHdvcmsgaXRlbXMgdG8gdGhlIGV2ZW50IGxvb3AuIEl0IGlzCisgIC8vLyBleHBlY3RlZCB0aGF0IHdvcmsgaXRlbXMgY2FuIGFsd2F5cyBiZSByZWFkIGF0IG9uY2UgZnJvbSBpdCwgaS5lLiB0aGF0CisgIC8vLyB0aGVyZSB3aWxsIG5ldmVyIGJlIHNob3J0IHJlYWRzLgorICBTb2NrZXQgY29udHJvbFNlbmRTb2NrZXRfOworCisgIC8vLyBRdWV1ZWQgdXAgd29yayBkZWxlZ2F0ZXMgZm9yIGFzeW5jIHRyYW5zcG9ydHMuIFRoaXMgYWxzbyBpbmNsdWRlcworICAvLy8gY3VycmVudGx5IGFjdGl2ZSBvbmVzLCB0aGV5IGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIG9uIGNvbXBsZXRpb24sCisgIC8vLyB3aGljaCBpcyByZWxpZWQgb24gYnkgdGhlIGNvbnRyb2wgbWVzc2FnZSByZWNlaXZlIGZpYmVyICh0aGUgbWFpbiBvbmUpCisgIC8vLyB0byBkZWNpZGUgd2hldGhlciB0byBpbW1lZGlhdGVseSBzdGFydCBleGVjdXRpbmcgaXRlbXMgb3Igbm90LgorICAvLyBUT0RPOiBUaGlzIHNob3VsZCByZWFsbHkgYmUgb2Ygc29tZSBxdWV1ZSB0eXBlLCBub3QgYW4gYXJyYXkgc2xpY2UsIGJ1dAorICAvLyBzdGQuY29udGFpbmVyIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZy4KKyAgV29ya1tdW1RBc3luY1RyYW5zcG9ydF0gd29ya1F1ZXVlc187CisKKyAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2Ygd29yayBpdGVtcyBub3QgeWV0IGZpbmlzaGVkIChxdWV1ZWQgYW5kIGN1cnJlbnRseQorICAvLy8gZXhlY3V0ZWQpIGFuZCBkZWxheXMgbm90IHlldCBleGVjdXRlZC4KKyAgdWludCBxdWV1ZWRDb3VudF87CisKKyAgLy8vIFByb3RlY3RzIHF1ZXVlZENvdW50Xy4KKyAgTXV0ZXggcXVldWVkQ291bnRNdXRleF87CisKKyAgLy8vIFRyaWdnZXJlZCB3aGVuIHF1ZXVlZENvdW50XyByZWFjaGVzIHplcm8sIHByb3RlY3RlZCBieSBxdWV1ZWRDb3VudE11dGV4Xy4KKyAgQ29uZGl0aW9uIHplcm9RdWV1ZWRDb25kaXRpb25fOworfQorCitwcml2YXRlIHsKKyAgdGltZXZhbCB0b1RpbWV2YWwoY29uc3QoRHVyYXRpb24pIGR1cikgeworICAgIHRpbWV2YWwgdHY7CisgICAgZHVyLnNwbGl0ISgic2Vjb25kcyIsICJ1c2VjcyIpKHR2LnR2X3NlYywgdHYudHZfdXNlYyk7CisgICAgcmV0dXJuIHR2OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGxpYmV2ZW50IGZsYWdzIGNvbWJpbmF0aW9uIHRvIHJlcHJlc2VudCBhIGdpdmVuIFRBc3luY0V2ZW50VHlwZS4KKyAgICovCisgIHNob3J0IGxpYmV2ZW50RXZlbnRUeXBlKFRBc3luY0V2ZW50VHlwZSB0eXBlKSB7CisgICAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFRBc3luY0V2ZW50VHlwZS5SRUFEOgorICAgICAgICByZXR1cm4gRVZfUkVBRCB8IEVWX0VUOworICAgICAgY2FzZSBUQXN5bmNFdmVudFR5cGUuV1JJVEU6CisgICAgICAgIHJldHVybiBFVl9XUklURSB8IEVWX0VUOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4ZjUxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuYXN5bmMuc29ja2V0OworCitpbXBvcnQgY29yZS5zdGRjLmVycm5vOiBFQ09OTlJFU0VUOworaW1wb3J0IGNvcmUudGhyZWFkIDogRmliZXI7CitpbXBvcnQgY29yZS50aW1lIDogZHVyLCBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0IDogVFNvY2tldEJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmVuZGlhbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc29ja2V0OworCit2ZXJzaW9uIChXaW5kb3dzKSB7CisgIGltcG9ydCBzdGQuYy53aW5kb3dzLndpbnNvY2sgOiBjb25uZWN0OworfSBlbHNlIHZlcnNpb24gKFBvc2l4KSB7CisgIGltcG9ydCBjb3JlLnN5cy5wb3NpeC5zeXMuc29ja2V0IDogY29ubmVjdDsKK30gZWxzZSBzdGF0aWMgYXNzZXJ0KDAsICJEb24ndCBrbm93IGNvbm5lY3Qgb24gdGhpcyBwbGF0Zm9ybS4iKTsKKworLyoqCisgKiBOb24tYmxvY2tpbmcgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBXaGVuZXZlciBhIHNvY2tldCBvcGVyYXRpb24gd291bGQgYmxvY2ssIFRBc3luY1NvY2tldCByZWdpc3RlcnMgYSBjYWxsYmFjaworICogd2l0aCB0aGUgc3BlY2lmaWVkIFRBc3luY1NvY2tldE1hbmFnZXIgYW5kIHlpZWxkcy4KKyAqCisgKiBBcyBmb3IgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQsIGR1ZSB0byB0aGUgbGltaXRhdGlvbnMgb2Ygc3RkLnNvY2tldCwKKyAqIGN1cnJlbnRseSBvbmx5IFRDUC9JUCBzb2NrZXRzIGFyZSBzdXBwb3J0ZWQgKGkuZS4gVW5peCBkb21haW4gc29ja2V0cyBhcmUKKyAqIG5vdCkuCisgKi8KK2NsYXNzIFRBc3luY1NvY2tldCA6IFRTb2NrZXRCYXNlLCBUQXN5bmNUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhbHJlYWR5IGNyZWF0ZWQsIGNvbm5lY3RlZCAoISkgc29ja2V0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYXN5bmNNYW5hZ2VyID0gVGhlIFRBc3luY1NvY2tldE1hbmFnZXIgdG8gdXNlIGZvciBub24tYmxvY2tpbmcgSS9PLgorICAgKiAgIHNvY2tldCA9IEFscmVhZHkgY3JlYXRlZCwgY29ubmVjdGVkIHNvY2tldCBvYmplY3QuIFdpbGwgYmUgc3dpdGNoZWQgdG8KKyAgICogICAgIG5vbi1ibG9ja2luZyBtb2RlIGlmIGl0IGlzbid0IGFscmVhZHkuCisgICAqLworICB0aGlzKFRBc3luY1NvY2tldE1hbmFnZXIgYXN5bmNNYW5hZ2VyLCBTb2NrZXQgc29ja2V0KSB7CisgICAgYXN5bmNNYW5hZ2VyXyA9IGFzeW5jTWFuYWdlcjsKKyAgICBzb2NrZXQuYmxvY2tpbmcgPSBmYWxzZTsKKyAgICBzdXBlcihzb2NrZXQpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgc29ja2V0IHRoYXQgd2lsbCBjb25uZWN0IHRvIHRoZSBnaXZlbiBob3N0CisgICAqIG9uIHRoZSBnaXZlbiBwb3J0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYXN5bmNNYW5hZ2VyID0gVGhlIFRBc3luY1NvY2tldE1hbmFnZXIgdG8gdXNlIGZvciBub24tYmxvY2tpbmcgSS9PLgorICAgKiAgIGhvc3QgPSBSZW1vdGUgaG9zdC4KKyAgICogICBwb3J0ID0gUmVtb3RlIHBvcnQuCisgICAqLworICB0aGlzKFRBc3luY1NvY2tldE1hbmFnZXIgYXN5bmNNYW5hZ2VyLCBzdHJpbmcgaG9zdCwgdXNob3J0IHBvcnQpIHsKKyAgICBhc3luY01hbmFnZXJfID0gYXN5bmNNYW5hZ2VyOworICAgIHN1cGVyKGhvc3QsIHBvcnQpOworICB9CisKKyAgb3ZlcnJpZGUgVEFzeW5jTWFuYWdlciBhc3luY01hbmFnZXIoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBhc3luY01hbmFnZXJfOworICB9CisKKyAgLyoqCisgICAqIEFzeW5jaHJvbm91c2x5IGNvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAqCisgICAqIENvbXBsZXRlcyB3aXRob3V0IGJsb2NraW5nIGFuZCBkZWZlcnMgZnVydGhlciBvcGVyYXRpb25zIG9uIHRoZSBzb2NrZXQKKyAgICogdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIElmIGNvbm5lY3RpbmcgZmFpbHMsIHRoaXMgaXMKKyAgICogY3VycmVudGx5IG5vdCBpbmRpY2F0ZWQgaW4gYW55IHdheSBvdGhlciB0aGFuIGV2ZXJ5IGNhbGwgdG8gcmVhZC93cml0ZQorICAgKiBmYWlsaW5nLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIGlmIChpc09wZW4pIHJldHVybjsKKworICAgIGVuZm9yY2UoIWhvc3RfLmVtcHR5LCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QuIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisgICAgZW5mb3JjZShwb3J0XyAhPSAwLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgb3BlbiB3aXRoIG51bGwgcG9ydC4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworCisgICAgLy8gQ2Fubm90IHVzZSBzdGQuc29ja2V0LlNvY2tldC5jb25uZWN0IGhlcmUgYmVjYXVzZSBpdCBoaWRlcyBhd2F5CisgICAgLy8gRUlOUFJPR1JFU1MvV1NBV09VTERCTE9DSy4KKyAgICBBZGRyZXNzIGFkZHI7CisgICAgdHJ5IHsKKyAgICAgIC8vIEN1cnJlbnRseSwgd2UganVzdCBnbyB3aXRoIHRoZSBmaXJzdCBhZGRyZXNzIHJldHVybmVkLCBjb3VsZCBiZSBtYWRlCisgICAgICAvLyBtb3JlIGludGVsbGlnZW50IHRob3VnaCDigJMgSVB2Nj8KKyAgICAgIGFkZHIgPSBnZXRBZGRyZXNzKGhvc3RfLCBwb3J0XylbMF07CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGBVbmFibGUgdG8gcmVzb2x2ZSBob3N0ICJgIH4gaG9zdF8gfiBgIi5gLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4sIF9fRklMRV9fLCBfX0xJTkVfXywgZSk7CisgICAgfQorCisgICAgc29ja2V0XyA9IG5ldyBUY3BTb2NrZXQoYWRkci5hZGRyZXNzRmFtaWx5KTsKKyAgICBzb2NrZXRfLmJsb2NraW5nID0gZmFsc2U7CisgICAgc2V0U29ja2V0T3B0cygpOworCisgICAgYXV0byBlcnJvckNvZGUgPSBjb25uZWN0KHNvY2tldF8uaGFuZGxlLCBhZGRyLm5hbWUoKSwgYWRkci5uYW1lTGVuKCkpOworICAgIGlmIChlcnJvckNvZGUgPT0gMCkgeworICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gY291bGQgYmUgZXN0YWJsaXNoZWQgaW1tZWRpYXRlbHksIGp1c3QgcmV0dXJuLiBJCisgICAgICAvLyBkb24ndCBrbm93IGlmIHRoaXMgZXZlciBoYXBwZW5zLgorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworICAgIGlmIChlcnJubyAhPSBDT05ORUNUX0lOUFJPR1JFU1NfRVJSTk8pIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGBDb3VsZCBub3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gImAgfgorICAgICAgICBob3N0XyB+IGAiOiBgIH4gc29ja2V0RXJybm9TdHJpbmcoZXJybm8pLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGNhc2U6IGNvbm5lY3QoKSBzaWduYWxsZWQgdGhhdCB0aGUgY29ubmVjdGlvbgorICAgIC8vIGlzIGJlaW5nIGVzdGFibGlzaGVkIGluIHRoZSBiYWNrZ3JvdW5kLiBRdWV1ZSB1cCBhIHdvcmsgaXRlbSB3aXRoIHRoZQorICAgIC8vIGFzeW5jIG1hbmFnZXIgd2hpY2gganVzdCBkZWZlcnMgYW55IG90aGVyIG9wZXJhdGlvbnMgb24gdGhpcworICAgIC8vIFRBc3luY1NvY2tldCBpbnN0YW5jZSB1bnRpbCB0aGUgc29ja2V0IGlzIHJlYWR5LgorICAgIGFzeW5jTWFuYWdlcl8uZXhlY3V0ZSh0aGlzLAorICAgICAgeworICAgICAgICBhdXRvIGZpYmVyID0gRmliZXIuZ2V0VGhpcygpOworICAgICAgICBUQXN5bmNFdmVudFJlYXNvbiByZWFzb24gPSB2b2lkOworICAgICAgICBhc3luY01hbmFnZXJfLmFkZE9uZXNob3RMaXN0ZW5lcihzb2NrZXRfLCBUQXN5bmNFdmVudFR5cGUuV1JJVEUsCisgICAgICAgICAgY29ubmVjdFRpbWVvdXQsCisgICAgICAgICAgc2NvcGVkRGVsZWdhdGUoKFRBc3luY0V2ZW50UmVhc29uIHIpeyByZWFzb24gPSByOyBmaWJlci5jYWxsKCk7IH0pCisgICAgICAgICk7CisgICAgICAgIEZpYmVyLnlpZWxkKCk7CisKKyAgICAgICAgaWYgKHJlYXNvbiA9PSBUQXN5bmNFdmVudFJlYXNvbi5USU1FRF9PVVQpIHsKKyAgICAgICAgICAvLyBDbG9zZSB0aGUgY29ubmVjdGlvbiwgc28gdGhhdCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgZmFpbCBpbW1lZGlhdGVseS4KKyAgICAgICAgICBjbG9zZUltbWVkaWF0ZWx5KCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IGVycm9yQ29kZSA9IHZvaWQ7CisgICAgICAgIHNvY2tldF8uZ2V0T3B0aW9uKFNvY2tldE9wdGlvbkxldmVsLlNPQ0tFVCwgY2FzdChTb2NrZXRPcHRpb24pU09fRVJST1IsCisgICAgICAgICAgZXJyb3JDb2RlKTsKKworICAgICAgICBpZiAoZXJyb3JDb2RlKSB7CisgICAgICAgICAgbG9nSW5mbygiQ291bGQgbm90IGNvbm5lY3QgVEFzeW5jU29ja2V0OiAlcyIsCisgICAgICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhlcnJvckNvZGUpKTsKKworICAgICAgICAgIC8vIENsb3NlIHRoZSBjb25uZWN0aW9uLCBzbyB0aGF0IHN1YnNlcXVlbnQgd29yayBpdGVtcyBmYWlsIGltbWVkaWF0ZWx5LgorICAgICAgICAgIGNsb3NlSW1tZWRpYXRlbHkoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgfQorICAgICk7CisgIH0KKworICAvKioKKyAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAqCisgICAqIFdpbGwgYmxvY2sgdW50aWwgYWxsIGN1cnJlbnRseSBhY3RpdmUgb3BlcmF0aW9ucyBhcmUgZmluaXNoZWQgYmVmb3JlIHRoZQorICAgKiBzb2NrZXQgaXMgY2xvc2VkLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CisgICAgaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKKworICAgIGF1dG8gZG9uZU11dGV4ID0gbmV3IE11dGV4OworICAgIGF1dG8gZG9uZUNvbmQgPSBuZXcgQ29uZGl0aW9uKGRvbmVNdXRleCk7CisgICAgc3luY2hyb25pemVkIChkb25lTXV0ZXgpIHsKKyAgICAgIGFzeW5jTWFuYWdlcl8uZXhlY3V0ZSh0aGlzLAorICAgICAgICBzY29wZWREZWxlZ2F0ZSgKKyAgICAgICAgICB7CisgICAgICAgICAgICBjbG9zZUltbWVkaWF0ZWx5KCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRvbmVNdXRleCkgZG9uZUNvbmQubm90aWZ5QWxsKCk7CisgICAgICAgICAgfQorICAgICAgICApCisgICAgICApOworICAgICAgZG9uZUNvbmQud2FpdCgpOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuIGZhbHNlOworCisgICAgdWJ5dGUgYnVmOworICAgIGF1dG8gciA9IHNvY2tldF8ucmVjZWl2ZSgoJmJ1ZilbMC4uMV0sIFNvY2tldEZsYWdzLlBFRUspOworICAgIGlmIChyID09IFNvY2tldC5FUlJPUikgeworICAgICAgYXV0byBsYXN0RXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworICAgICAgc3RhdGljIGlmIChjb25ucmVzZXRPblBlZXJTaHV0ZG93bikgeworICAgICAgICBpZiAobGFzdEVycm5vID09IEVDT05OUkVTRVQpIHsKKyAgICAgICAgICBjbG9zZUltbWVkaWF0ZWx5KCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVla2luZyBpbnRvIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgICAgfQorICAgIHJldHVybiAociA+IDApOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHJlYWQgaWYgc29ja2V0IGlzIG5vdCBvcGVuLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgdHlwZW9mKGdldFNvY2tldEVycm5vKCkpIGxhc3RFcnJubzsKKworICAgIGF1dG8gciA9IHlpZWxkT25CbG9jayhzb2NrZXRfLnJlY2VpdmUoY2FzdCh2b2lkW10pYnVmKSwKKyAgICAgIFRBc3luY0V2ZW50VHlwZS5SRUFEKTsKKworICAgIC8vIElmIHJlY3Ygd2VudCBmaW5lLCBpbW1lZGlhdGVseSByZXR1cm4uCisgICAgaWYgKHIgPj0gMCkgcmV0dXJuIHI7CisKKyAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgZmluZCBvdXQgaG93IHRvIGhhbmRsZSBpdC4KKyAgICBsYXN0RXJybm8gPSBnZXRTb2NrZXRFcnJubygpOworCisgICAgc3RhdGljIGlmIChjb25ucmVzZXRPblBlZXJTaHV0ZG93bikgeworICAgICAgLy8gU2VlIHRvcCBjb21tZW50LgorICAgICAgaWYgKGxhc3RFcnJubyA9PSBFQ09OTlJFU0VUKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWNlaXZpbmcgZnJvbSBzb2NrZXQgZmFpbGVkOiAiIH4KKyAgICAgIHNvY2tldEVycm5vU3RyaW5nKGxhc3RFcnJubyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICBzaXplX3Qgc2VudDsKKyAgICB3aGlsZSAoc2VudCA8IGJ1Zi5sZW5ndGgpIHsKKyAgICAgIHNlbnQgKz0gd3JpdGVTb21lKGJ1ZltzZW50IC4uICRdKTsKKyAgICB9CisgICAgYXNzZXJ0KHNlbnQgPT0gYnVmLmxlbmd0aCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3Qgd3JpdGVTb21lKGluIHVieXRlW10gYnVmKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCB3cml0ZSBpZiBzb2NrZXQgaXMgbm90IG9wZW4uIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBhdXRvIHIgPSB5aWVsZE9uQmxvY2soc29ja2V0Xy5zZW5kKGJ1ZiksIFRBc3luY0V2ZW50VHlwZS5XUklURSk7CisKKyAgICAvLyBFdmVyeXRoaW5nIHdlbnQgd2VsbCwganVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICAgIGlmIChyID4gMCkgcmV0dXJuIHI7CisKKyAgICAvLyBIYW5kbGUgZXJyb3IgY29uZGl0aW9ucy4KKyAgICBpZiAociA8IDApIHsKKyAgICAgIGF1dG8gbGFzdEVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKworICAgICAgYXV0byB0eXBlID0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlVOS05PV047CisgICAgICBpZiAoaXNTb2NrZXRDbG9zZUVycm5vKGxhc3RFcnJubykpIHsKKyAgICAgICAgdHlwZSA9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTjsKKyAgICAgICAgY2xvc2VJbW1lZGlhdGVseSgpOworICAgICAgfQorCisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU2VuZGluZyB0byBzb2NrZXQgZmFpbGVkOiAiIH4KKyAgICAgICAgc29ja2V0RXJybm9TdHJpbmcobGFzdEVycm5vKSwgdHlwZSk7CisgICAgfQorCisgICAgLy8gc2VuZCgpIHNob3VsZCBuZXZlciByZXR1cm4gMC4KKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU2VuZGluZyB0byBzb2NrZXQgZmFpbGVkICgwIGJ5dGVzIHdyaXR0ZW4pLiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgIH0KKworICAvLy8gVGhlIGFtb3VudCBvZiB0aW1lIGluIHdoaWNoIGEgY29ubmNldGlvbiBtdXN0IGJlIGVzdGFibGlzaGVkIGJlZm9yZSB0aGUKKyAgLy8vIG9wZW4oKSBjYWxsIHRpbWVzIG91dC4KKyAgRHVyYXRpb24gY29ubmVjdFRpbWVvdXQgPSBkdXIhInNlY29uZHMiKDUpOworCitwcml2YXRlOgorICB2b2lkIGNsb3NlSW1tZWRpYXRlbHkoKSB7CisgICAgc29ja2V0Xy5jbG9zZSgpOworICAgIHNvY2tldF8gPSBudWxsOworICB9CisKKyAgVCB5aWVsZE9uQmxvY2soVCkobGF6eSBUIGNhbGwsIFRBc3luY0V2ZW50VHlwZSBldmVudFR5cGUpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byByZXN1bHQgPSBjYWxsKCk7CisgICAgICBpZiAocmVzdWx0ICE9IFNvY2tldC5FUlJPUiB8fCBnZXRTb2NrZXRFcnJubygpICE9IFdPVUxEX0JMT0NLX0VSUk5PKSByZXR1cm4gcmVzdWx0OworCisgICAgICAvLyBXZSBnb3QgYW4gRUFHQUlOIHJlc3VsdCwgcmVnaXN0ZXIgYSBjYWxsYmFjayB0byByZXR1cm4gaGVyZSBvbmNlIHNvbWUKKyAgICAgIC8vIGV2ZW50IGhhcHBlbnMgYW5kIHlpZWxkLgorCisgICAgICBEdXJhdGlvbiB0aW1lb3V0ID0gdm9pZDsKKyAgICAgIGZpbmFsIHN3aXRjaCAoZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2UgVEFzeW5jRXZlbnRUeXBlLlJFQUQ6CisgICAgICAgICAgdGltZW91dCA9IHJlY3ZUaW1lb3V0XzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQXN5bmNFdmVudFR5cGUuV1JJVEU6CisgICAgICAgICAgdGltZW91dCA9IHNlbmRUaW1lb3V0XzsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgYXV0byBmaWJlciA9IEZpYmVyLmdldFRoaXMoKTsKKyAgICAgIGFzc2VydChmaWJlciwgIkN1cnJlbnQgZmliZXIgbnVsbCDigJMgbm90IHJ1bm5pbmcgaW4gVEFzeW5jTWFuYWdlcj8iKTsKKyAgICAgIFRBc3luY0V2ZW50UmVhc29uIGV2ZW50UmVhc29uID0gdm9pZDsKKyAgICAgIGFzeW5jTWFuYWdlcl8uYWRkT25lc2hvdExpc3RlbmVyKHNvY2tldF8sIGV2ZW50VHlwZSwgdGltZW91dCwKKyAgICAgICAgc2NvcGVkRGVsZWdhdGUoKFRBc3luY0V2ZW50UmVhc29uIHJlYXNvbikgeworICAgICAgICAgIGV2ZW50UmVhc29uID0gcmVhc29uOworICAgICAgICAgIGZpYmVyLmNhbGwoKTsKKyAgICAgICAgfSkKKyAgICAgICk7CisKKyAgICAgIC8vIFlpZWxkcyBleGVjdXRpb24gYmFjayB0byB0aGUgYXN5bmMgbWFuYWdlciwgd2lsbCByZXR1cm4gYmFjayBoZXJlIG9uY2UKKyAgICAgIC8vIHRoZSBhYm92ZSBsaXN0ZW5lciBpcyBjYWxsZWQuCisgICAgICBGaWJlci55aWVsZCgpOworCisgICAgICBpZiAoZXZlbnRSZWFzb24gPT0gVEFzeW5jRXZlbnRSZWFzb24uVElNRURfT1VUKSB7CisgICAgICAgIC8vIElmIHdlIGFyZSBjYW5jZWxsaW5nIHRoZSByZXF1ZXN0IGR1ZSB0byBhIHRpbWVkIG91dCBvcGVyYXRpb24sIHRoZQorICAgICAgICAvLyBjb25uZWN0aW9uIGlzIGluIGFuIHVuZGVmaW5lZCBzdGF0ZSwgYmVjYXVzZSB0aGUgc2VydmVyIGNvdWxkIGRlY2lkZQorICAgICAgICAvLyB0byBzZW5kIHRoZSByZXF1ZXN0ZWQgZGF0YSBsYXRlciwgb3Igd2UgY291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gaGFsZi0KKyAgICAgICAgLy8gd2F5IGludG8gd3JpdGluZyBhIHJlcXVlc3QuIFRodXMsIHdlIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIG1ha2UgYW55CisgICAgICAgIC8vIHBvc3NpYmx5IHF1ZXVlZCB1cCB3b3JrIGl0ZW1zIGZhaWwgaW1tZWRpYXRlbHkuIEJlc2lkZXMsIHRoZSBzZXJ2ZXIKKyAgICAgICAgLy8gaXMgbm90IHZlcnkgbGlrZWx5IHRvIGltbWVkaWF0ZWx5IHJlY292ZXIgYWZ0ZXIgYSBzb2NrZXQtbGV2ZWwKKyAgICAgICAgLy8gdGltZW91dCBoYXMgZXhwaXJlZCBhbnl3YXkuCisgICAgICAgIGNsb3NlSW1tZWRpYXRlbHkoKTsKKworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHNvY2tldCAiIH4KKyAgICAgICAgICAidG8gZ2V0IHJlYWR5IHRvICIgfiB0byFzdHJpbmcoZXZlbnRUeXBlKSB+ICIuIiwKKyAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVElNRURfT1VUKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gVGhlIFRBc3luY1NvY2tldE1hbmFnZXIgdG8gdXNlIGZvciBub24tYmxvY2tpbmcgSS9PLgorICBUQXN5bmNTb2NrZXRNYW5hZ2VyIGFzeW5jTWFuYWdlcl87Cit9CisKK3ByaXZhdGUgeworICAvLyBzdGQuc29ja2V0IGRvZXNuJ3QgaW5jbHVkZSBTT19FUlJPUiBmb3IgcmVhc29ucyB1bmtub3duLgorICB2ZXJzaW9uIChsaW51eCkgeworICAgIGVudW0gU09fRVJST1IgPSA0OworICB9IGVsc2UgdmVyc2lvbiAoT1NYKSB7CisgICAgZW51bSBTT19FUlJPUiA9IDB4MTAwNzsKKyAgfSBlbHNlIHZlcnNpb24gKEZyZWVCU0QpIHsKKyAgICBlbnVtIFNPX0VSUk9SID0gMHgxMDA3OworICB9IGVsc2UgdmVyc2lvbiAoV2luMzIpIHsKKyAgICBpbXBvcnQgc3RkLmMud2luZG93cy53aW5zb2NrIDogU09fRVJST1I7CisgIH0gZWxzZSBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiRG9uJ3Qga25vdyBTT19FUlJPUiBvbiB0aGlzIHBsYXRmb3JtLiIpOworCisgIC8vIFRoaXMgaGFjayBmb3JjZXMgYSBkZWxlZ2F0ZSBsaXRlcmFsIHRvIGJlIHNjb3BlZCwgZXZlbiBpZiBpdCBpcyBwYXNzZWQgdG8KKyAgLy8gYSBmdW5jdGlvbiBhY2NlcHRpbmcgbm9ybWFsIGRlbGVnYXRlcyBhcyB3ZWxsLiBETUQgbGlrZXMgdG8gYWxsb2NhdGUgdGhlCisgIC8vIGNvbnRleHQgb24gdGhlIGhlYXAgYW55d2F5LCBidXQgaXQgc2VlbXMgdG8gd29yayBmb3IgTERDLgorICBpbXBvcnQgc3RkLnRyYWl0cyA6IGlzRGVsZWdhdGU7CisgIGF1dG8gc2NvcGVkRGVsZWdhdGUoRCkoc2NvcGUgRCBkKSBpZiAoaXNEZWxlZ2F0ZSFEKSB7CisgICAgcmV0dXJuIGQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NzbC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNjI0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NzbC5kCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmFzeW5jLnNzbDsKKworaW1wb3J0IGNvcmUudGhyZWFkIDogRmliZXI7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb247CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0OworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLmVycjsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5zc2w7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc3NsOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zc2xfYmlvOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNzbDsKKworLyoqCisgKiBQcm92aWRlcyBTU0wvVExTIGVuY3J5cHRpb24gZm9yIGFzeW5jIHNvY2tldHMuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwsIGFzIGl0IGNvbnRleHQtc3dpdGNoZXMKKyAqIGJldHdlZW4gZmliZXJzIGZyb20gd2l0aGluIE9wZW5TU0wgY2FsbHMsIGFuZCB0aGUgc2FmZXR5IG9mIHRoaXMgaGFzIG5vdCB5ZXQKKyAqIGJlZW4gdmVyaWZpZWQuCisgKgorICogRm9yIG9idmlvdXMgcmVhc29ucyAodGhlIFNTTCBjb25uZWN0aW9uIGlzIHN0YXRlZnVsKSwgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZQorICogc2hvdWxkIG5ldmVyIGJlIHVzZWQgb24gYSBnaXZlbiBzb2NrZXQgYXQgdGhlIHNhbWUgdGltZS4KKyAqLworLy8gTm90ZTogVGhpcyBjb3VsZCBlYXNpbHkgYmUgZXh0ZW5kZWQgdG8gb3RoZXIgdHJhbnNwb3J0cyBpbiB0aGUgZnV0dXJlIGFzIHdlbGwuCisvLyBUaGVyZSBhcmUgb25seSB0d28gcGFydHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIHdoaWNoIGRvbid0IHdvcmsgd2l0aCBhIGdlbmVyaWMKKy8vIFRUcmFuc3BvcnQ6IDEpIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24sIGZvciB3aGljaCBwZWVyIG5hbWUvYWRkcmVzcyBhcmUKKy8vIG5lZWRlZCBmcm9tIHRoZSBzb2NrZXQsIGFuZCAyKSB0aGUgY29ubmVjdGlvbiBzaHV0ZG93biwgd2hlcmUgdGhlIGFzc29jaWF0ZWQKKy8vIGFzeW5jIG1hbmFnZXIgaXMgbmVlZGVkIGJlY2F1c2UgY2xvc2UoKSBpcyBub3QgdXN1YWxseSBjYWxsZWQgZnJvbSB3aXRoaW4gYQorLy8gd29yayBpdGVtLgorZmluYWwgY2xhc3MgVEFzeW5jU1NMU29ja2V0IDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBjb250ZXh0ID0gVGhlIFNTTCBzb2NrZXQgY29udGV4dCB0byB1c2UuIEEgcmVmZXJlbmNlIHRvIGl0IGlzIHN0b3JlZCBzbworICAgKiAgICAgdGhhdCBpdCBkb2VzIG5vdCBnZXQgY2xlYW5lZCB1cCB3aGlsZSB0aGUgc29ja2V0IGlzIHVzZWQuCisgICAqICAgdHJhbnNwb3J0ID0gVGhlIHVuZGVybHlpbmcgYXN5bmMgbmV0d29yayB0cmFuc3BvcnQgdG8gdXNlIGZvcgorICAgKiAgICAgY29tbXVuaWNhdGlvbi4KKyAgICovCisgIHRoaXMoVEFzeW5jU29ja2V0IHVuZGVybHlpbmdTb2NrZXQsIFRTU0xDb250ZXh0IGNvbnRleHQpIHsKKyAgICBzb2NrZXRfID0gdW5kZXJseWluZ1NvY2tldDsKKyAgICBjb250ZXh0XyA9IGNvbnRleHQ7CisgICAgc2VydmVyU2lkZV8gPSBjb250ZXh0LnNlcnZlclNpZGU7CisgICAgYWNjZXNzTWFuYWdlcl8gPSBjb250ZXh0LmFjY2Vzc01hbmFnZXI7CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgaWYgKHNzbF8gaXMgbnVsbCB8fCAhc29ja2V0Xy5pc09wZW4pIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8gc2h1dGRvd24gPSBTU0xfZ2V0X3NodXRkb3duKHNzbF8pOworICAgIGJvb2wgc2h1dGRvd25SZWNlaXZlZCA9IChzaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikgIT0gMDsKKyAgICBib29sIHNodXRkb3duU2VudCA9IChzaHV0ZG93biAmIFNTTF9TRU5UX1NIVVRET1dOKSAhPSAwOworICAgIHJldHVybiAhKHNodXRkb3duUmVjZWl2ZWQgJiYgc2h1dGRvd25TZW50KTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuIGZhbHNlOworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICBieXRlIGJ0ID0gdm9pZDsKKyAgICBhdXRvIHJjID0gU1NMX3BlZWsoc3NsXywgJmJ0LCBidC5zaXplb2YpOworICAgIHNzbEVuZm9yY2UocmMgPj0gMCwgIlNTTF9wZWVrIik7CisKKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgfQorICAgIHJldHVybiAocmMgPiAwKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICBlbmZvcmNlKCFzZXJ2ZXJTaWRlXywgIkNhbm5vdCBvcGVuIGEgc2VydmVyLXNpZGUgU1NMIHNvY2tldC4iKTsKKyAgICBpZiAoaXNPcGVuKSByZXR1cm47CisKKyAgICBpZiAoc3NsXykgeworICAgICAgLy8gSWYgdGhlIHVuZGVybHlpbmcgc29ja2V0IHdhcyBhdXRvbWF0aWNhbGx5IGNsb3NlZCBiZWNhdXNlIG9mIGFuIGVycm9yCisgICAgICAvLyAoaS5lLiBjbG9zZSgpIHdhcyBjYWxsZWQgZnJvbSBpbnNpZGUgYSBzb2NrZXQgbWV0aG9kKSwgd2UgY2FuIGxhbmQKKyAgICAgIC8vIGhlcmUgd2l0aCB0aGUgU1NMIG9iamVjdCBzdGlsbCBhbGxvY2F0ZWQ7IGRlbGV0ZSBpdCBoZXJlLgorICAgICAgY2xlYW51cFNTTCgpOworICAgIH0KKworICAgIHNvY2tldF8ub3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgaWYgKHNzbF8gIWlzIG51bGwpIHsKKyAgICAgIC8vIFNTTCBuZWVkcyB0byBzZW5kL3JlY2VpdmUgZGF0YSBvdmVyIHRoZSBzb2NrZXQgYXMgcGFydCBvZiB0aGUgc2h1dGRvd24KKyAgICAgIC8vIHByb3RvY29sLCBzbyB3ZSBtdXN0IGV4ZWN1dGUgdGhlIGNhbGxzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBhc3NvY2lhdGVkCisgICAgICAvLyBhc3luYyBtYW5hZ2VyLiBPbiB0aGUgb3RoZXIgaGFuZCwgVFRyYW5zcG9ydCBjbGllbnRzIGV4cGVjdCB0aGUgc29ja2V0CisgICAgICAvLyB0byBiZSBjbG9zZWQgd2hlbiBjbG9zZSgpIHJldHVybnMsIHNvIHdlIGhhdmUgdG8gYmxvY2sgdW50aWwgdGhlCisgICAgICAvLyBzaHV0ZG93biB3b3JrIGl0ZW0gaGFzIGJlZW4gZXhlY3V0ZWQuCisgICAgICBpbXBvcnQgY29yZS5zeW5jLmNvbmRpdGlvbjsKKyAgICAgIGltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CisKKyAgICAgIGludCByYyA9IHZvaWQ7CisgICAgICBhdXRvIGRvbmVNdXRleCA9IG5ldyBNdXRleDsKKyAgICAgIGF1dG8gZG9uZUNvbmQgPSBuZXcgQ29uZGl0aW9uKGRvbmVNdXRleCk7CisgICAgICBzeW5jaHJvbml6ZWQgKGRvbmVNdXRleCkgeworICAgICAgICBzb2NrZXRfLmFzeW5jTWFuYWdlci5leGVjdXRlKHNvY2tldF8sIHsKKyAgICAgICAgICByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKKyAgICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7CisgICAgICAgICAgfQorICAgICAgICAgIHN5bmNocm9uaXplZCAoZG9uZU11dGV4KSBkb25lQ29uZC5ub3RpZnlBbGwoKTsKKyAgICAgICAgfSk7CisgICAgICAgIGRvbmVDb25kLndhaXQoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAvLyBEbyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUgYXMgbGVhdmluZyB0aGUgdHJhbnNwb3J0ICJvcGVuIiB3aWxsCisgICAgICAgIC8vIHByb2JhYmx5IHByb2R1Y2Ugb25seSBtb3JlIGVycm9ycywgYW5kIHRoZSBjaGFuY2Ugd2UgY2FuIGRvCisgICAgICAgIC8vIHNvbWV0aGluZyBhYm91dCB0aGUgZXJyb3IgZS5nLiBieSByZXRyeWluZyBpcyB2ZXJ5IGxvdy4KKyAgICAgICAgbG9nRXJyb3IoIkVycm9yIHdoaWxlIHNodXR0aW5nIGRvd24gU1NMOiAlcyIsIGdldFNTTEV4Y2VwdGlvbigpKTsKKyAgICAgIH0KKworICAgICAgY2xlYW51cFNTTCgpOworICAgIH0KKworICAgIHNvY2tldF8uY2xvc2UoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKyAgICBhdXRvIHJjID0gU1NMX3JlYWQoc3NsXywgYnVmLnB0ciwgY2FzdChpbnQpYnVmLmxlbmd0aCk7CisgICAgc3NsRW5mb3JjZShyYyA+PSAwLCAiU1NMX3JlYWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKworICAgIC8vIExvb3AgaW4gY2FzZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSBpcyBzZXQgaW4gU1NMX0NUWC4KKyAgICBzaXplX3Qgd3JpdHRlbiA9IDA7CisgICAgd2hpbGUgKHdyaXR0ZW4gPCBidWYubGVuZ3RoKSB7CisgICAgICBhdXRvIGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sIGJ1Zi5wdHIgKyB3cml0dGVuLAorICAgICAgICBjYXN0KGludCkoYnVmLmxlbmd0aCAtIHdyaXR0ZW4pKTsKKyAgICAgIHNzbEVuZm9yY2UoYnl0ZXMgPiAwLCAiU1NMX3dyaXRlIik7CisgICAgICB3cml0dGVuICs9IGJ5dGVzOworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgY2hlY2tIYW5kc2hha2UoKTsKKworICAgIGF1dG8gYmlvID0gU1NMX2dldF93YmlvKHNzbF8pOworICAgIGVuZm9yY2UoYmlvICFpcyBudWxsLCBuZXcgVFNTTEV4Y2VwdGlvbigiU1NMX2dldF93YmlvIHJldHVybmVkIG51bGwiKSk7CisKKyAgICBhdXRvIHJjID0gQklPX2ZsdXNoKGJpbyk7CisgICAgc3NsRW5mb3JjZShyYyA9PSAxLCAiQklPX2ZsdXNoIik7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCisgICAqLworICBib29sIHNlcnZlclNpZGUoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBzZXJ2ZXJTaWRlXzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHNlcnZlclNpZGUoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBzZXJ2ZXJTaWRlXyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBhY2Nlc3MgbWFuYWdlciB0byB1c2UuCisgICAqLworICB2b2lkIGFjY2Vzc01hbmFnZXIoVEFjY2Vzc01hbmFnZXIgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgYWNjZXNzTWFuYWdlcl8gPSB2YWx1ZTsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSwgY2xlYW5zIHVwIHRoZSBTU0wgY29ubmVjdGlvbiBhbmQgdGhyb3dzIHRoZQorICAgKiBleGNlcHRpb24gZm9yIHRoZSBsYXN0IFNTTCBlcnJvci4KKyAgICovCisgIHZvaWQgc3NsRW5mb3JjZShib29sIGNvbmRpdGlvbiwgc3RyaW5nIGxvY2F0aW9uKSB7CisgICAgaWYgKCFjb25kaXRpb24pIHsKKyAgICAgIC8vIFdlIG5lZWQgdG8gZmV0Y2ggdGhlIGVycm9yIGZpcnN0LCBhcyB0aGUgZXJyb3Igc3RhY2sgd2lsbCBiZSBjbGVhbmVkCisgICAgICAvLyB3aGVuIHNodXR0aW5nIGRvd24gU1NMLgorICAgICAgYXV0byBlID0gZ2V0U1NMRXhjZXB0aW9uKGxvY2F0aW9uKTsKKyAgICAgIGNsZWFudXBTU0woKTsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEZyZWVzIHRoZSBTU0wgY29ubmVjdGlvbiBvYmplY3QgYW5kIGNsZWFycyB0aGUgU1NMIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdm9pZCBjbGVhbnVwU1NMKCkgeworICAgIFNTTF9mcmVlKHNzbF8pOworICAgIHNzbF8gPSBudWxsOworICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgIH0KKworICAvKioKKyAgICogTWFrZXMgc3VyZSB0aGUgU1NMIGNvbm5lY3Rpb24gaXMgdXAgYW5kIHJ1bm5pbmcsIGFuZCBpbml0aWFsaXplcyBpdCBpZiBub3QuCisgICAqLworICB2b2lkIGNoZWNrSGFuZHNoYWtlKCkgeworICAgIGVuZm9yY2Uoc29ja2V0Xy5pc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBpZiAoc3NsXyAhaXMgbnVsbCkgcmV0dXJuOworICAgIHNzbF8gPSBjb250ZXh0Xy5jcmVhdGVTU0woKTsKKworICAgIGF1dG8gYmlvID0gY3JlYXRlVFRyYW5zcG9ydEJJTyhzb2NrZXRfLCBmYWxzZSk7CisgICAgU1NMX3NldF9iaW8oc3NsXywgYmlvLCBiaW8pOworCisgICAgaW50IHJjID0gdm9pZDsKKyAgICBpZiAoc2VydmVyU2lkZV8pIHsKKyAgICAgIHJjID0gU1NMX2FjY2VwdChzc2xfKTsKKyAgICB9IGVsc2UgeworICAgICAgcmMgPSBTU0xfY29ubmVjdChzc2xfKTsKKyAgICB9CisgICAgZW5mb3JjZShyYyA+IDAsIGdldFNTTEV4Y2VwdGlvbigpKTsKKworICAgIGF1dG8gYWRkciA9IHNvY2tldF8uZ2V0UGVlckFkZHJlc3MoKTsKKyAgICBhdXRob3JpemUoc3NsXywgYWNjZXNzTWFuYWdlcl8sIGFkZHIsCisgICAgICAoc2VydmVyU2lkZV8gPyBhZGRyLnRvSG9zdE5hbWVTdHJpbmcoKSA6IHNvY2tldF8uaG9zdCkpOworICB9CisKKyAgVEFzeW5jU29ja2V0IHNvY2tldF87CisgIGJvb2wgc2VydmVyU2lkZV87CisgIFNTTCogc3NsXzsKKyAgVFNTTENvbnRleHQgY29udGV4dF87CisgIFRBY2Nlc3NNYW5hZ2VyIGFjY2Vzc01hbmFnZXJfOworfQorCisvKioKKyAqIFdyYXBzIHBhc3NlZCBUQXN5bmNTb2NrZXQgaW5zdGFuY2VzIGludG8gVEFzeW5jU1NMU29ja2V0cy4KKyAqCisgKiBUeXBpY2FsbHkgdXNlZCB3aXRoIFRBc3luY0NsaWVudC4gQXMgYW4gdW5mb3J0dW5hdGUgY29uc2VxdWVuY2Ugb2YgdGhlCisgKiBhc3luYyBjbGllbnQgZGVzaWduLCB0aGUgcGFzc2VkIHRyYW5zcG9ydHMgY2Fubm90IGJlIHN0YXRpY2FsbHkgdmVyaWZpZWQgdG8KKyAqIGJlIG9mIHR5cGUgVEFzeW5jU29ja2V0LiBJbnN0ZWFkLCB0aGUgdHlwZSBpcyB2ZXJpZmllZCBhdCBydW50aW1lIOKAkyBpZiBhCisgKiB0cmFuc3BvcnQgb2YgYW4gdW5leHBlY3RlZCB0eXBlIGlzIHBhc3NlZCB0byBnZXRUcmFuc3BvcnQoKSwgaXQgZmFpbHMsCisgKiB0aHJvd2luZyBhIFRUcmFuc3BvcnRFeGNlcHRpb24uCisgKgorICogRXhhbXBsZToKKyAqIC0tLQorICogYXV0byBjb250ZXh0ID0gbndlIFRTU0xDb250ZXh0KCk7CisgKiAuLi4gLy8gQ29uZmlndXJlIFNTTCBjb250ZXh0LgorICogYXV0byBmYWN0b3J5ID0gbmV3IFRBc3luY1NTTFNvY2tldEZhY3RvcnkoY29udGV4dCk7CisgKgorICogYXV0byBzb2NrZXQgPSBuZXcgVEFzeW5jU29ja2V0KHNvbWVBc3luY01hbmFnZXIsIGhvc3QsIHBvcnQpOworICogc29ja2V0Lm9wZW4oKTsKKyAqCisgKiBhdXRvIGNsaWVudCA9IG5ldyBUQXN5bmNDbGllbnQhU2VydmljZSh0cmFuc3BvcnQsIGZhY3RvcnksCisgKiAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpKTsKKyAqIC0tLQorICovCitjbGFzcyBUQXN5bmNTU0xTb2NrZXRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgeworICAvLy8KKyAgdGhpcyhUU1NMQ29udGV4dCBjb250ZXh0KSB7CisgICAgY29udGV4dF8gPSBjb250ZXh0OworICB9CisKKyAgb3ZlcnJpZGUgVEFzeW5jU1NMU29ja2V0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIGF1dG8gc29ja2V0ID0gY2FzdChUQXN5bmNTb2NrZXQpdHJhbnNwb3J0OworICAgIGVuZm9yY2Uoc29ja2V0LCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJUQXN5bmNTU0xTb2NrZXRGYWN0b3J5IHJlcXVpcmVzIGEgVEFzeW5jU29ja2V0IHRvIHdvcmsgb24sIG5vdCBhICIgfgorICAgICAgdG8hc3RyaW5nKHR5cGVpZCh0cmFuc3BvcnQpKSB+ICIuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5JTlRFUk5BTF9FUlJPUgorICAgICkpOworICAgIHJldHVybiBuZXcgVEFzeW5jU1NMU29ja2V0KHNvY2tldCwgY29udGV4dF8pOworICB9CisKK3ByaXZhdGU6CisgIFRTU0xDb250ZXh0IGNvbnRleHRfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVjZTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuYmFzZTsKKworLyoqCisgKiBDb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBleGNlcHRpb25zLgorICovCitjbGFzcyBURXhjZXB0aW9uIDogRXhjZXB0aW9uIHsKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZyA9ICIiLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KK30KKworLyoqCisgKiBBbiBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2Ugb25lIG9yIG1vcmUgc3ViLXRhc2tzIGZhaWxlZC4KKyAqLworY2xhc3MgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMsIHN0cmluZyBmaWxlID0gX19GSUxFX18sCisgICAgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgICB0aGlzLmV4Y2VwdGlvbnMgPSBleGNlcHRpb25zOworICB9CisKKyAgLy8vIFRoZSBleGNlcHRpb25zIHRocm93biBieSB0aGUgY2hpbGRyZW4gb2YgdGhlIG9wZXJhdGlvbi4gSWYgYXBwbGljYWJsZSwKKyAgLy8vIHRoZSBsaXN0IGlzIG9yZGVyZWQgaW4gdGhlIHNhbWUgd2F5IHRoZSBleGNlcHRpb25zIG9jY3VycmVkLgorICBFeGNlcHRpb25bXSBleGNlcHRpb25zOworfQorCisvLy8gVGhlIFRocmlmdCB2ZXJzaW9uIHN0cmluZywgdXNlZCBmb3IgaW5mb3JtYXRpdmUgcHVycG9zZXMuCisvLyBOb3RlOiBUaGlzIGlzIGN1cnJlbnRseSBoYXJkY29kZWQsIGJ1dCB3aWxsIGxpa2VseSBiZSBmaWxsZWQgaW4gYnkgdGhlIGJ1aWxkCisvLyBzeXN0ZW0gaW4gZnV0dXJlIHZlcnNpb25zLgorZW51bSBWRVJTSU9OID0gIjEuMC4wIjsKKworLyoqCisgKiBGdW5jdGlvbnMgdXNlZCBmb3IgbG9nZ2luZyBpbnNpZGUgVGhyaWZ0LgorICoKKyAqIEJ5IGRlZmF1bHQsIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZXMgYXJlIHdyaXR0ZW4gdG8gc3Rkb3V0L3N0ZGVyciwgYnV0IHRoaXMKKyAqIGJlaGF2aW9yIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBwcm92aWRpbmcgY3VzdG9tIGdfe0luZm8sIEVycm9yfUxvZ1NpbmsKKyAqIGhhbmRsZXJzLgorICoKKyAqIEV4YW1wbGVzOgorICogLS0tCisgKiBsb2dJbmZvKCJBbiBpbmZvcm1hdGl2ZSBtZXNzYWdlLiIpOworICogbG9nRXJyb3IoIlNvbWUgZXJyb3Igb2NjdXJyZWQ6ICVzIiwgZSk7CisgKiAtLS0KKyAqLworYWxpYXMgbG9nRm9ybWF0dGVkIWdfaW5mb0xvZ1NpbmsgbG9nSW5mbzsKK2FsaWFzIGxvZ0Zvcm1hdHRlZCFnX2Vycm9yTG9nU2luayBsb2dFcnJvcjsgLy8vIERpdHRvCisKKy8qKgorICogRXJyb3IgYW5kIGluZm8gbG9nIG1lc3NhZ2Ugc2lua3MuCisgKgorICogVGhlc2UgZGVsZWdhdGVzIGFyZSBjYWxsZWQgd2l0aCB0aGUgbG9nIG1lc3NhZ2UgcGFzc2VkIGFzIGNvbnN0KGNoYXIpW10KKyAqIGFyZ3VtZW50LCBhbmQgY2FuIGJlIG92ZXJ3cml0dGVuIHRvIGhvb2sgdGhlIFRocmlmdCBsaWJyYXJpZXMgdXAgd2l0aCBhCisgKiBjdXN0b20gbG9nZ2luZyBzeXN0ZW0uIEJ5IGRlZmF1bHQsIHRoZXkgZm9yd2FyZCBhbGwgb3V0cHV0IHRvIHN0ZG91dC9zdGRlcnIuCisgKi8KK19fZ3NoYXJlZCB2b2lkIGRlbGVnYXRlKGNvbnN0KGNoYXIpW10pIGdfaW5mb0xvZ1Npbms7CitfX2dzaGFyZWQgdm9pZCBkZWxlZ2F0ZShjb25zdChjaGFyKVtdKSBnX2Vycm9yTG9nU2luazsgLy8vIERpdHRvCisKK3NoYXJlZCBzdGF0aWMgdGhpcygpIHsKKyAgaW1wb3J0IHN0ZC5zdGRpbzsKKworICBnX2luZm9Mb2dTaW5rID0gKGNvbnN0KGNoYXIpW10gdGV4dCkgeworICAgIHN0ZG91dC53cml0ZWxuKHRleHQpOworICB9OworCisgIGdfZXJyb3JMb2dTaW5rID0gKGNvbnN0KGNoYXIpW10gdGV4dCkgeworICAgIHN0ZGVyci53cml0ZWxuKHRleHQpOworICB9OworfQorCisvLyBUaGlzIHNob3VsZCBiZSBwcml2YXRlLCBpZiBpdCBjb3VsZCBzdGlsbCBiZSB1c2VkIHRocm91Z2ggdGhlIGFsaWFzZXMgdGhlbi4KK3RlbXBsYXRlIGxvZ0Zvcm1hdHRlZChhbGlhcyB0YXJnZXQpIHsKKyAgdm9pZCBsb2dGb3JtYXR0ZWQoc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgaW50IGxpbmUgPSBfX0xJTkVfXywKKyAgICBULi4uKShzdHJpbmcgZm10LCBUIGFyZ3MpIGlmICgKKyAgICBfX3RyYWl0cyhjb21waWxlcywgeyB0YXJnZXQoIiIpOyB9KQorICApIHsKKyAgICBpbXBvcnQgc3RkLmZvcm1hdCwgc3RkLnN0ZGlvOworICAgIGlmICh0YXJnZXQgIWlzIG51bGwpIHsKKyAgICAgIHNjb3BlKGV4aXQpIGdfZm9ybWF0QnVmZmVyLmNsZWFyKCk7CisKKyAgICAgIC8vIFBob2JvcyBAQEJVR0BAOiBJZiB0aGUgZW1wdHkgc3RyaW5nIHB1dCgpIGlzIHJlbW92ZWQsIEFwcGVuZGVyLmRhdGEKKyAgICAgIC8vIHN0YXlzIGVtcHR5LgorICAgICAgZ19mb3JtYXRCdWZmZXIucHV0KCIiKTsKKworICAgICAgZm9ybWF0dGVkV3JpdGUoZ19mb3JtYXRCdWZmZXIsICIlczolczogIiwgZmlsZSwgbGluZSk7CisKKyAgICAgIHN0YXRpYyBpZiAoVC5sZW5ndGggPT0gMCkgeworICAgICAgICBnX2Zvcm1hdEJ1ZmZlci5wdXQoZm10KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdHRlZFdyaXRlKGdfZm9ybWF0QnVmZmVyLCBmbXQsIGFyZ3MpOworICAgICAgfQorICAgICAgdGFyZ2V0KGdfZm9ybWF0QnVmZmVyLmRhdGEpOworICAgIH0KKyAgfQorfQorCitwcml2YXRlIHsKKyAgLy8gVXNlIGEgZ2xvYmFsLCBidXQgdGhyZWFkLWxvY2FsIGJ1ZmZlciBmb3IgY29uc3RydWN0aW5nIGxvZyBtZXNzYWdlcy4KKyAgaW1wb3J0IHN0ZC5hcnJheSA6IEFwcGVuZGVyOworICBBcHBlbmRlciEoY2hhcltdKSBnX2Zvcm1hdEJ1ZmZlcjsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnQuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTE2ZGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2FzeW5jX2NsaWVudC5kCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50OworCitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0LCB0bzsKK2ltcG9ydCBzdGQudHJhaXRzIDogUGFyYW1ldGVyU3RvcmFnZUNsYXNzLCBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3NUdXBsZSwKKyAgUGFyYW1ldGVyVHlwZVR1cGxlLCBSZXR1cm5UeXBlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5hc3luYy5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jdGZlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CitpbXBvcnQgdGhyaWZ0LnV0aWwuZnV0dXJlOworCisvKioKKyAqIEFzeW5jaHJvbm91cyBUaHJpZnQgc2VydmljZSBjbGllbnQgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0cyBhcyBURnV0dXJlcyBhbgorICogdXNlcyBhIFRBc3luY01hbmFnZXIgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHdvcmsuCisgKgorICogVEFzeW5jQ2xpZW50QmFzZSBzZXJ2ZXMgYXMgYSBzdXBlcnR5cGUgZm9yIGFsbCBUQXN5bmNDbGllbnRzIGZvciB0aGUgc2FtZQorICogc2VydmljZSwgd2hpY2ggbWlnaHQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IGNvbmNyZXRlIHByb3RvY29sIHR5cGVzCisgKiAodGhlcmUgaXMgbm8gY292YXJpYW5jZSBmb3IgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzKSwgYW5kIGV4dGVuZHMKKyAqIFRGdXR1cmVJbnRlcmZhY2UhSW50ZXJmYWNlLiBJZiBJbnRlcmZhY2UgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgc2VydmljZQorICogQmFzZUludGVyZmFjZSwgaXQgYWxzbyBleHRlbmRzIFRBc3luY0NsaWVudEJhc2UhQmFzZUludGVyZmFjZS4KKyAqCisgKiBUQXN5bmNDbGllbnQgaW1wbGVtZW50cyBUQXN5bmNDbGllbnRCYXNlIGFuZCBvZmZlcnMgdHdvIGNvbnN0cnVjdG9ycyB3aXRoCisgKiB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZXM6CisgKiAtLS0KKyAqIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSB0ZiwgVFByb3RvY29sRmFjdG9yeSBwZik7CisgKiB0aGlzKFRBc3luY1RyYW5zcG9ydCB0cmFucywgVFRyYW5zcG9ydEZhY3RvcnkgaXRmLCBUVHJhbnNwb3J0RmFjdG9yeSBvdGYsCisgKiAgIFRQcm90b2NvbEZhY3RvcnkgaXBmLCBUUHJvdG9jb2xGYWN0b3J5IG9wZik7CisgKiAtLS0KKyAqCisgKiBBZ2FpbiwgaWYgSW50ZXJmYWNlIHJlcHJlc2VudHMgYSBkZXJpdmVkIFRocmlmdCBzZXJ2aWNlLAorICogVEFzeW5jQ2xpZW50IUludGVyZmFjZSBpcyBhbHNvIGRlcml2ZWQgZnJvbSBUQXN5bmNDbGllbnQhQmFzZUludGVyZmFjZS4KKyAqCisgKiBUQXN5bmNDbGllbnQgY2FuIGV4Y2x1c2l2ZWx5IGJlIHVzZWQgd2l0aCBUQXN5bmNUcmFuc3BvcnRzLCBhcyBpdCBuZWVkcyB0bworICogYWNjZXNzIHRoZSBhc3NvY2lhdGVkIFRBc3luY01hbmFnZXIuIFRvIHNldCB1cCBhbnkgd3JhcHBlciB0cmFuc3BvcnRzCisgKiAoZS5nLiBidWZmZXJlZCwgZnJhbWVkKSBvbiB0b3Agb2YgaXQgYW5kIHRvIGluc3RhbmNpYXRlIHRoZSBwcm90b2NvbHMgdG8gdXNlLAorICogVFRyYW5zcG9ydEZhY3RvcnkgYW5kIFRQcm90b2NvbEZhY3RvcnkgaW5zdGFuY2VzIGFyZSBwYXNzZWQgdG8gdGhlCisgKiBjb25zdHJ1Y3RvcnMg4oCTIHRoZSB0aHJlZSBhcmd1bWVudCBjb25zdHJ1Y3RvciBpcyBhIHNob3J0Y3V0IGlmIHRoZSBzYW1lCisgKiB0cmFuc3BvcnQgYW5kIHByb3RvY29sIGFyZSB0byBiZSB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQsIHdoaWNoIGlzCisgKiB0aGUgbW9zdCBjb21tb24gY2FzZS4KKyAqCisgKiBJZiB0aGUgc2FtZSB0cmFuc3BvcnQgZmFjdG9yeSBpcyBwYXNzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzLAorICogb25seSBhIHNpbmdsZSB3cmFwcGVyIHRyYW5zcG9ydCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHVzZWQgZm9yIGJvdGggZGlyZWN0aW9ucy4KKyAqIFRoaXMgYWxsb3dzIGVhc3kgaW1wbGVtZW50YXRpb24gb2YgcHJvdG9jb2xzIGxpa2UgU1NMLgorICoKKyAqIEp1c3QgYXMgVENsaWVudCBkb2VzLCBUQXN5bmNDbGllbnQgYWxzbyB0YWtlcyB0d28gb3B0aW9uYWwgdGVtcGxhdGUKKyAqIGFyZ3VtZW50cyB3aGljaCBjYW4gYmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGUgYWN0dWFsIFRQcm90b2NvbAorICogaW1wbGVtZW50YXRpb24gdXNlZCBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzLCBhcyB2aXJ0dWFsIGNhbGxzIGNhbgorICogY29tcGxldGVseSBiZSBlbGltaW5hdGVkIHRoZW4uIElmIHRoZSBhY3R1YWwgdHlwZXMgb2YgdGhlIHByb3RvY29scworICogaW5zdGFudGlhdGVkIGJ5IHRoZSBmYWN0b3JpZXMgdXNlZCBkb2VzIG5vdCBtYXRjaCB0aGUgb25lcyBzdGF0aWNhbGx5CisgKiBzcGVjaWZpZWQgaW4gdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMsIGEgVEV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nCisgKiBjb25zdHJ1Y3Rpb24uCisgKgorICogRXhhbXBsZToKKyAqIC0tLQorICogLy8gQSBzaW1wbGUgVGhyaWZ0IHNlcnZpY2UuCisgKiBpbnRlcmZhY2UgRm9vIHsgaW50IGZvbygpOyB9CisgKgorICogLy8gQ3JlYXRlIGEgVEFzeW5jU29ja2V0TWFuYWdlciDigJMgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50IGlzIHVzZWQgZm9yIHRoaXMKKyAqIC8vIGV4YW1wbGUuCisgKiBhdXRvIG1hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworICoKKyAqIC8vIFNldCB1cCBhbiBhc3luYyB0cmFuc3BvcnQgdG8gdXNlLgorICogYXV0byBzb2NrZXQgPSBuZXcgVEFzeW5jU29ja2V0KG1hbmFnZXIsIGhvc3QsIHBvcnQpOworICoKKyAqIC8vIENyZWF0ZSBhIGNsaWVudCBpbnN0YW5jZS4KKyAqIGF1dG8gY2xpZW50ID0gbmV3IFRBc3luY0NsaWVudCFGb28oCisgKiAgIHNvY2tldCwKKyAqICAgbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksIC8vIFdyYXAgdGhlIHNvY2tldCBpbiBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KKyAqICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCkgLy8gVXNlIHRoZSBCaW5hcnkgcHJvdG9jb2wuCisgKiApOworICoKKyAqIC8vIENhbGwgZm9vIGFuZCB1c2UgdGhlIHJldHVybmVkIGZ1dHVyZS4KKyAqIGF1dG8gcmVzdWx0ID0gY2xpZW50LmZvbygpOworICogcHJhZ21hKG1zZywgdHlwZW9mKHJlc3VsdCkpOyAvLyBURnV0dXJlIWludAorICogaW50IHJlc3VsdFZhbHVlID0gcmVzdWx0LndhaXRHZXQoKTsgLy8gV2FpdHMgdW50aWwgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUuCisgKiAtLS0KKyAqLworaW50ZXJmYWNlIFRBc3luY0NsaWVudEJhc2UoSW50ZXJmYWNlKSBpZiAoaXNCYXNlU2VydmljZSFJbnRlcmZhY2UpIDoKKyAgVEZ1dHVyZUludGVyZmFjZSFJbnRlcmZhY2UKK3sKKyAgLyoqCisgICAqIFRoZSB1bmRlcmx5aW5nIFRBc3luY1RyYW5zcG9ydCB1c2VkIGJ5IHRoaXMgY2xpZW50IGluc3RhbmNlLgorICAgKi8KKyAgVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eTsKK30KKworLy8vIERpdHRvCitpbnRlcmZhY2UgVEFzeW5jQ2xpZW50QmFzZShJbnRlcmZhY2UpIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIUludGVyZmFjZSkgOgorICBUQXN5bmNDbGllbnRCYXNlIShCYXNlU2VydmljZSFJbnRlcmZhY2UpLCBURnV0dXJlSW50ZXJmYWNlIUludGVyZmFjZQore30KKworLy8vIERpdHRvCit0ZW1wbGF0ZSBUQXN5bmNDbGllbnQoSW50ZXJmYWNlLCBJbnB1dFByb3RvY29sID0gVFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCA9IHZvaWQpIGlmICgKKyAgaXNTZXJ2aWNlIUludGVyZmFjZSAmJiBpc1RQcm90b2NvbCFJbnB1dFByb3RvY29sICYmCisgIChpc1RQcm90b2NvbCFPdXRwdXRQcm90b2NvbCB8fCBpcyhPdXRwdXRQcm90b2NvbCA9PSB2b2lkKSkKKykgeworICBtaXhpbih7CisgICAgc3RhdGljIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIUludGVyZmFjZSkgeworICAgICAgc3RyaW5nIGNvZGUgPSAiY2xhc3MgVEFzeW5jQ2xpZW50IDogIiB+CisgICAgICAgICJUQXN5bmNDbGllbnQhKEJhc2VTZXJ2aWNlIUludGVyZmFjZSwgSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wpLCAiIH4KKyAgICAgICAgIlRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlIHtcbiI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSB0ZiwgVFByb3RvY29sRmFjdG9yeSBwZikgeworICAgICAgICAgIHRoaXModHJhbnMsIHRmLCB0ZiwgcGYsIHBmKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSBpdGYsCisgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3RmLCBUUHJvdG9jb2xGYWN0b3J5IGlwZiwgVFByb3RvY29sRmFjdG9yeSBvcGYKKyAgICAgICAgKSB7CisgICAgICAgICAgc3VwZXIodHJhbnMsIGl0Ziwgb3RmLCBpcGYsIG9wZik7CisgICAgICAgICAgY2xpZW50XyA9IG5ldyB0eXBlb2YoY2xpZW50XykoaXByb3RfLCBvcHJvdF8pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBUQ2xpZW50IShJbnRlcmZhY2UsIElQcm90LCBPUHJvdCkgY2xpZW50XzsKKyAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmluZyBjb2RlID0gImNsYXNzIFRBc3luY0NsaWVudCA6IFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlIHsiOworICAgICAgY29kZSB+PSBxeworICAgICAgICBhbGlhcyBJbnB1dFByb3RvY29sIElQcm90OworICAgICAgICBzdGF0aWMgaWYgKGlzVFByb3RvY29sIU91dHB1dFByb3RvY29sKSB7CisgICAgICAgICAgYWxpYXMgT3V0cHV0UHJvdG9jb2wgT1Byb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdGljIGFzc2VydChpcyhPdXRwdXRQcm90b2NvbCA9PSB2b2lkKSk7CisgICAgICAgICAgYWxpYXMgSW5wdXRQcm90b2NvbCBPUHJvdDsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSB0ZiwgVFByb3RvY29sRmFjdG9yeSBwZikgeworICAgICAgICAgIHRoaXModHJhbnMsIHRmLCB0ZiwgcGYsIHBmKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMoVEFzeW5jVHJhbnNwb3J0IHRyYW5zLCBUVHJhbnNwb3J0RmFjdG9yeSBpdGYsCisgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3RmLCBUUHJvdG9jb2xGYWN0b3J5IGlwZiwgVFByb3RvY29sRmFjdG9yeSBvcGYKKyAgICAgICAgKSB7CisgICAgICAgICAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgICAgICAgICAgdHJhbnNwb3J0XyA9IHRyYW5zOworCisgICAgICAgICAgYXV0byBpcCA9IGl0Zi5nZXRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgIFRUcmFuc3BvcnQgb3AgPSB2b2lkOworICAgICAgICAgIGlmIChpdGYgPT0gb3RmKSB7CisgICAgICAgICAgICBvcCA9IGlwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcCA9IG90Zi5nZXRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgIH0KKworICAgICAgICAgIGF1dG8gaXByb3QgPSBpcGYuZ2V0UHJvdG9jb2woaXApOworICAgICAgICAgIGlwcm90XyA9IGNhc3QoSVByb3QpaXByb3Q7CisgICAgICAgICAgZW5mb3JjZShpcHJvdF8sIG5ldyBURXhjZXB0aW9uKHRleHQoIklucHV0IHByb3RvY29sIG5vdCBvZiB0aGUgIiB+CisgICAgICAgICAgICAic3BlY2lmaWVkIGNvbmNyZXRlIHR5cGUgKCIsIElQcm90LnN0cmluZ29mLCAiKS4iKSkpOworCisgICAgICAgICAgYXV0byBvcHJvdCA9IG9wZi5nZXRQcm90b2NvbChvcCk7CisgICAgICAgICAgb3Byb3RfID0gY2FzdChPUHJvdClvcHJvdDsKKyAgICAgICAgICBlbmZvcmNlKG9wcm90XywgbmV3IFRFeGNlcHRpb24odGV4dCgiT3V0cHV0IHByb3RvY29sIG5vdCBvZiB0aGUgIiB+CisgICAgICAgICAgICAic3BlY2lmaWVkIGNvbmNyZXRlIHR5cGUgKCIsIE9Qcm90LnN0cmluZ29mLCAiKS4iKSkpOworCisgICAgICAgICAgY2xpZW50XyA9IG5ldyB0eXBlb2YoY2xpZW50XykoaXByb3RfLCBvcHJvdF8pOworICAgICAgICB9CisKKyAgICAgICAgb3ZlcnJpZGUgVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eSB7CisgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydF87CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVEFzeW5jVHJhbnNwb3J0IHRyYW5zcG9ydF87CisgICAgICAgIHByb3RlY3RlZCBJUHJvdCBpcHJvdF87CisgICAgICAgIHByb3RlY3RlZCBPUHJvdCBvcHJvdF87CisgICAgICAgIHByaXZhdGUgVENsaWVudCEoSW50ZXJmYWNlLCBJUHJvdCwgT1Byb3QpIGNsaWVudF87CisgICAgICB9OworICAgIH0KKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7CisgICAgICBGaWx0ZXJNZXRob2ROYW1lcyEoSW50ZXJmYWNlLCBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgSW50ZXJmYWNlKSkKKyAgICApIHsKKyAgICAgIHN0cmluZ1tdIHBhcmFtTGlzdDsKKyAgICAgIHN0cmluZ1tdIHBhcmFtTmFtZXM7CisgICAgICBmb3JlYWNoIChpLCBfOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgICBpbW11dGFibGUgcGFyYW1OYW1lID0gInBhcmFtIiB+IHRvIXN0cmluZyhpICsgMSk7CisgICAgICAgIGltbXV0YWJsZSBzdG9yYWdlID0gUGFyYW1ldGVyU3RvcmFnZUNsYXNzVHVwbGUhKAorICAgICAgICAgIG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKVtpXTsKKworICAgICAgICBwYXJhbUxpc3Qgfj0gKChzdG9yYWdlICYgUGFyYW1ldGVyU3RvcmFnZUNsYXNzLnJlZl8pID8gInJlZiAiIDogIiIpIH4KKyAgICAgICAgICAiUGFyYW1ldGVyVHlwZVR1cGxlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfiAiKVsiIH4KKyAgICAgICAgICB0byFzdHJpbmcoaSkgfiAiXSAiIH4gcGFyYW1OYW1lOworICAgICAgICBwYXJhbU5hbWVzIH49IHBhcmFtTmFtZTsKKyAgICAgIH0KKyAgICAgIHBhcmFtTGlzdCB+PSAiVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsIjsKKworICAgICAgaW1tdXRhYmxlIHJldHVyblR5cGVDb2RlID0gIlJldHVyblR5cGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpIjsKKyAgICAgIGNvZGUgfj0gIlRGdXR1cmUhKCIgfiByZXR1cm5UeXBlQ29kZSB+ICIpICIgfiBtZXRob2ROYW1lIH4gIigiIH4KKyAgICAgICAgY3RmZUpvaW4ocGFyYW1MaXN0KSB+ICIpIHtcbiI7CisKKyAgICAgIC8vIENyZWF0ZSB0aGUgZnV0dXJlIGluc3RhbmNlIHRoYXQgd2lsbCByZXBlc2VudCB0aGUgcmVzdWx0LgorICAgICAgY29kZSB+PSAiYXV0byBwcm9taXNlID0gbmV3IFRQcm9taXNlISgiIH4gcmV0dXJuVHlwZUNvZGUgfiAiKTtcbiI7CisKKyAgICAgIC8vIFByZXBhcmUgZGVsZWdhdGUgd2hpY2ggZXhlY3V0ZXMgdGhlIFRDbGllbnQgbWV0aG9kIGNhbGwuCisgICAgICBjb2RlIH49ICJhdXRvIHdvcmsgPSB7XG4iOworICAgICAgY29kZSB+PSAidHJ5IHtcbiI7CisgICAgICBjb2RlIH49ICJzdGF0aWMgaWYgKGlzKFJldHVyblR5cGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICIpID09IHZvaWQpKSB7XG4iOworICAgICAgY29kZSB+PSAiY2xpZW50Xy4iIH4gbWV0aG9kTmFtZSB+ICIoIiB+IGN0ZmVKb2luKHBhcmFtTmFtZXMpIH4gIik7XG4iOworICAgICAgY29kZSB+PSAicHJvbWlzZS5zdWNjZWVkKCk7XG4iOworICAgICAgY29kZSB+PSAifSBlbHNlIHtcbiI7CisgICAgICBjb2RlIH49ICJhdXRvIHJlc3VsdCA9IGNsaWVudF8uIiB+IG1ldGhvZE5hbWUgfiAiKCIgfgorICAgICAgICBjdGZlSm9pbihwYXJhbU5hbWVzKSB+ICIpO1xuIjsKKyAgICAgIGNvZGUgfj0gInByb21pc2Uuc3VjY2VlZChyZXN1bHQpO1xuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICBjb2RlIH49ICJ9IGNhdGNoIChFeGNlcHRpb24gZSkge1xuIjsKKyAgICAgIGNvZGUgfj0gInByb21pc2UuZmFpbChlKTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgY29kZSB+PSAifTtcbiI7CisKKyAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIGNhbmNlbGxlZCwgc2V0IHRoZSByZXN1bHQgcHJvbWlzZSB0byBjYW5jZWxsZWQKKyAgICAgIC8vIGFzIHdlbGwuIFRoaXMgY291bGQgYmUgbW92ZWQgaW50byBhbiBhZGRpdGlvbmFsIFRBc3luY1dvcmtJdGVtCisgICAgICAvLyBkZWxlZ2F0ZSBwYXJhbWV0ZXIuCisgICAgICBjb2RlIH49IHF7CisgICAgICAgIGlmIChjYW5jZWxsYXRpb24pIHsKKyAgICAgICAgICBjYW5jZWxsYXRpb24udHJpZ2dlcmluZy5hZGRDYWxsYmFjayh7CisgICAgICAgICAgICBwcm9taXNlLmNhbmNlbCgpOworICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9OworCisgICAgICAvLyBFbnF1ZXVlIHRoZSB3b3JrIGl0ZW0gYW5kIGltbWVkaWF0ZWx5IHJldHVybiB0aGUgcHJvbWlzZSAocmVzcC4gaXRzCisgICAgICAvLyBmdXR1cmUgaW50ZXJmYWNlKS4KKyAgICAgIGNvZGUgfj0gInRyYW5zcG9ydF8uYXN5bmNNYW5hZ2VyLmV4ZWN1dGUodHJhbnNwb3J0Xywgd29yaywgY2FuY2VsbGF0aW9uKTtcbiI7CisgICAgICBjb2RlIH49ICJyZXR1cm4gcHJvbWlzZTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworCisgICAgfQorCisgICAgY29kZSB+PSAifVxuIjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnRfcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2FzeW5jX2NsaWVudF9wb29sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjYjk3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnRfcG9vbC5kCkBAIC0wLDAgKzEsOTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVXRpbGl0aWVzIGZvciBhc3luY2hyb25vdXNseSBxdWVyeWluZyBtdWx0aXBsZSBzZXJ2ZXJzLCBidWlsZGluZyBvbgorICogVEFzeW5jQ2xpZW50LgorICoKKyAqIFRlcm1pbm9sb2d5IG5vdGU6IFRoZSBuYW1lcyBvZiB0aGUgYXJ0aWZhY3RzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgYXJlCisgKiAgIGRlcml2ZWQgZnJvbSDCu2NsaWVudCBwb29swqssIGJlY2F1c2UgdGhleSBvcGVyYXRlIG9uIGEgcG9vbCBvZgorICogICBUQXN5bmNDbGllbnRzLiBIb3dldmVyLCBmcm9tIGEgYXJjaGl0ZWN0dXJhbCBwb2ludCBvZiB2aWV3LCB0aGV5IG9mdGVuCisgKiAgIHJlcHJlc2VudCBhIHBvb2wgb2YgaG9zdHMgYSBUaHJpZnQgY2xpZW50IGFwcGxpY2F0aW9uIGNvbW11bmljYXRlcyB3aXRoCisgKiAgIHVzaW5nIFJQQyBjYWxscy4KKyAqLworbW9kdWxlIHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudF9wb29sOworCitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1hcDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBhcnJheSwgZW1wdHk7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnRyYWl0cyA6IFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuYWxnb3JpdGhtOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworaW1wb3J0IHRocmlmdC51dGlsLmF3YWl0YWJsZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CitpbXBvcnQgdGhyaWZ0LnV0aWwuZnV0dXJlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5yZXNvdXJjZV9wb29sOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBnZW5lcmljIGNsaWVudCBwb29sIHdoaWNoIGltcGxlbWVudHMgVEZ1dHVyZUludGVyZmFjZSFJbnRlcmZhY2UKKyAqIHVzaW5nIG11bHRpcGxlIFRBc3luY0NsaWVudHMuCisgKi8KK2ludGVyZmFjZSBUQXN5bmNDbGllbnRQb29sQmFzZShJbnRlcmZhY2UpIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRGdXR1cmVJbnRlcmZhY2UhSW50ZXJmYWNlCit7CisgIC8vLyBTaG9ydGhhbmQgZm9yIHRoZSBjbGllbnQgdHlwZSB0aGlzIHBvb2wgb3BlcmF0ZXMgb24uCisgIGFsaWFzIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlIENsaWVudDsKKworICAvKioKKyAgICogQWRkcyBhIGNsaWVudCB0byB0aGUgcG9vbC4KKyAgICovCisgIHZvaWQgYWRkQ2xpZW50KENsaWVudCBjbGllbnQpOworCisgIC8qKgorICAgKiBSZW1vdmVzIGEgY2xpZW50IGZyb20gdGhlIHBvb2wuCisgICAqCisgICAqIFJldHVybnM6IFdoZXRoZXIgdGhlIGNsaWVudCB3YXMgZm91bmQgaW4gdGhlIHBvb2wuCisgICAqLworICBib29sIHJlbW92ZUNsaWVudChDbGllbnQgY2xpZW50KTsKKworICAvKioKKyAgICogQ2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGV4Y2VwdGlvbiBjb21lcyBmcm9tIGEgY2xpZW50IGZyb20gdGhlCisgICAqIHBvb2wgbm90IHdvcmtpbmcgcHJvcGVybHksIG9yIGlmIGl0IGFuIGV4Y2VwdGlvbiB0aHJvd24gYXQgdGhlCisgICAqIGFwcGxpY2F0aW9uIGxldmVsLgorICAgKgorICAgKiBJZiB0aGUgZGVsZWdhdGUgcmV0dXJucyB0cnVlLCB0aGUgc2VydmVyL2Nvbm5lY3Rpb24gaXMgY29uc2lkZXJlZCB0byBiZQorICAgKiBhdCBmYXVsdCwgaWYgaXQgcmV0dXJucyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyBqdXN0IHBhc3NlZCBvbiB0byB0aGUKKyAgICogY2FsbGVyLgorICAgKgorICAgKiBCeSBkZWZhdWx0LCByZXR1cm5zIHRydWUgZm9yIGluc3RhbmNlcyBvZiBUVHJhbnNwb3J0RXhjZXB0aW9uIGFuZAorICAgKiBUQXBwbGljYXRpb25FeGNlcHRpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlcigpIGNvbnN0IEBwcm9wZXJ0eTsKKyAgdm9pZCBycGNGYXVsdEZpbHRlcihib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikpIEBwcm9wZXJ0eTsgLy8vIERpdHRvCisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnRzIG9mIGEgY2xpZW50IGJlZm9yZSB0cnlpbmcgdG8KKyAgICogZXhlY3V0ZSBhIG1ldGhvZCBpZiB0aGV5IGFyZSBub3Qgb3Blbi4gVGhpcyBpcyB1c3VhbGx5IGRlc2lyYWJsZQorICAgKiBiZWNhdXNlIGl0IGFsbG93cyBlLmcuIHRvIGF1dG9tYXRpY2FsbHkgcmVjb25uZWN0IHRvIGEgcmVtb3RlIHNlcnZlcgorICAgKiBpZiB0aGUgbmV0d29yayBjb25uZWN0aW9uIGlzIGRyb3BwZWQuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAqLworICBib29sIHJlb3BlblRyYW5zcG9ydHMoKSBjb25zdCBAcHJvcGVydHk7CisgIHZvaWQgcmVvcGVuVHJhbnNwb3J0cyhib29sKSBAcHJvcGVydHk7IC8vLyBEaXR0bworfQorCitpbW11dGFibGUgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIGRlZmF1bHRScGNGYXVsdEZpbHRlcjsKK3N0YXRpYyB0aGlzKCkgeworICBkZWZhdWx0UnBjRmF1bHRGaWx0ZXIgPSAoRXhjZXB0aW9uIGUpIHsKKyAgICBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CisgICAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKyAgICByZXR1cm4gKAorICAgICAgKGNhc3QoVFRyYW5zcG9ydEV4Y2VwdGlvbillICFpcyBudWxsKSB8fAorICAgICAgKGNhc3QoVEFwcGxpY2F0aW9uRXhjZXB0aW9uKWUgIWlzIG51bGwpCisgICAgKTsKKyAgfTsKK30KKworLyoqCisgKiBBIFRBc3luY0NsaWVudFBvb2xCYXNlIGltcGxlbWVudGF0aW9uIHdoaWNoIHF1ZXJpZXMgbXVsdGlwbGUgc2VydmVycyBpbiBhCisgKiByb3cgdW50aWwgYSByZXF1ZXN0IHN1Y2NlZWRzLCB0aGUgcmVzdWx0IG9mIHdoaWNoIGlzIHRoZW4gcmV0dXJuZWQuCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgwrtzdWNjZXNzwqsgY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIHJwY0ZhdWx0RmlsdGVyKCkKKyAqIGRlbGVnYXRlIHByb3BlcnR5LiBJZiBpdCBpcyBub24tbnVsbCBhbmQgY2FsbGluZyBpdCBmb3IgYW4gZXhjZXB0aW9uIHNldCBieQorICogYSBmYWlsZWQgbWV0aG9kIGludm9jYXRpb24gcmV0dXJucyB0cnVlLCB0aGUgZXJyb3IgaXMgY29uc2lkZXJlZCB0byBiZQorICogY2F1c2VkIGJ5IHRoZSBSUEMgbGF5ZXIgcmF0aGVyIHRoYW4gdGhlIGFwcGxpY2F0aW9uIGxheWVyLCBhbmQgdGhlIG5leHQKKyAqIHNlcnZlciBpbiB0aGUgcG9vbCBpcyB0cmllZC4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgY2xpZW50cyB0byB0cnksIHRoZQorICogb3BlcmF0aW9uIGlzIG1hcmtlZCBhcyBmYWlsZWQgd2l0aCBhIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAqCisgKiBJZiBhIFRBc3luY0NsaWVudCBpbiB0aGUgcG9vbCBmYWlscyB3aXRoIGFuIFJQQyBleGNlcHRpb24gZm9yIGEgbnVtYmVyIG9mCisgKiBjb25zZWN1dGl2ZSB0cmllcywgaXQgaXMgdGVtcG9yYXJpbHkgZGlzYWJsZWQgKG5vdCB0cmllZCBhbnkgbG9uZ2VyKSBmb3IKKyAqIGEgY2VydGFpbiBkdXJhdGlvbi4gQm90aCB0aGUgbGltaXQgYW5kIHRoZSB0aW1lb3V0IGNhbiBiZSBjb25maWd1cmVkLiBJZiBhbGwKKyAqIGNsaWVudHMgZmFpbCAoYW5kIGtlZXBUcnlpbmcgaXMgZmFsc2UpLCB0aGUgb3BlcmF0aW9uIGZhaWxzIHdpdGggYQorICogVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBjb2xsZWN0ZWQgUlBDIGV4Y2VwdGlvbnMuCisgKi8KK2ZpbmFsIGNsYXNzIFRBc3luY0NsaWVudFBvb2woSW50ZXJmYWNlKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgOgorICBUQXN5bmNDbGllbnRQb29sQmFzZSFJbnRlcmZhY2UKK3sKKyAgLy8vCisgIHRoaXMoQ2xpZW50W10gY2xpZW50cykgeworICAgIHBvb2xfID0gbmV3IFRSZXNvdXJjZVBvb2whQ2xpZW50KGNsaWVudHMpOworICAgIHJwY0ZhdWx0RmlsdGVyXyA9IGRlZmF1bHRScGNGYXVsdEZpbHRlcjsKKyAgICByZW9wZW5UcmFuc3BvcnRzXyA9IHRydWU7CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCBhZGRDbGllbnQoQ2xpZW50IGNsaWVudCkgeworICAgIHBvb2xfLmFkZChjbGllbnQpOworICB9CisKKyAgLytvdmVycmlkZSsvIGJvb2wgcmVtb3ZlQ2xpZW50KENsaWVudCBjbGllbnQpIHsKKyAgICByZXR1cm4gcG9vbF8ucmVtb3ZlKGNsaWVudCk7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byBrZWVwIHRyeWluZyB0byBmaW5kIGEgd29ya2luZyBjbGllbnQgaWYgYWxsIGhhdmUgZmFpbGVkIGluIGEKKyAgICogcm93LgorICAgKgorICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICovCisgIGJvb2wga2VlcFRyeWluZygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLmN5Y2xlOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQga2VlcFRyeWluZyhib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLmN5Y2xlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byB1c2UgYSByYW5kb20gcGVybXV0YXRpb24gb2YgdGhlIGNsaWVudCBwb29sIG9uIGV2ZXJ5IGNhbGwgdG8KKyAgICogZXhlY3V0ZSgpLiBUaGlzIGNhbiBiZSB1c2VkIGUuZy4gYXMgYSBzaW1wbGUgZm9ybSBvZiBsb2FkIGJhbGFuY2luZy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICovCisgIGJvb2wgcGVybXV0ZUNsaWVudHMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5wZXJtdXRlOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgcGVybXV0ZUNsaWVudHMoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5wZXJtdXRlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmYXVsdHMgYWZ0ZXIgd2hpY2ggYSBjbGllbnQgaXMgZGlzYWJsZWQgdW50aWwKKyAgICogZmF1bHREaXNhYmxlRHVyYXRpb24gaGFzIHBhc3NlZC4gMCB0byBuZXZlciBkaXNhYmxlIGNsaWVudHMuCisgICAqCisgICAqIERlZmF1bHRzIHRvIDAuCisgICAqLworICB1c2hvcnQgZmF1bHREaXNhYmxlQ291bnQoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5mYXVsdERpc2FibGVDb3VudDsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGZhdWx0RGlzYWJsZUNvdW50KHVzaG9ydCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5mYXVsdERpc2FibGVDb3VudCA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBkdXJhdGlvbiBmb3Igd2hpY2ggYSBjbGllbnQgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgYWZ0ZXIgaXQgaGFzCisgICAqIGZhaWxlZCB0b28gb2Z0ZW4uCisgICAqCisgICAqIERlZmF1bHRzIHRvIG9uZSBzZWNvbmQuCisgICAqLworICBEdXJhdGlvbiBmYXVsdERpc2FibGVEdXJhdGlvbigpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvb2xfLmZhdWx0RGlzYWJsZUR1cmF0aW9uOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgZmF1bHREaXNhYmxlRHVyYXRpb24oRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8uZmF1bHREaXNhYmxlRHVyYXRpb24gPSB2YWx1ZTsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXIoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBycGNGYXVsdEZpbHRlcl87CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCBycGNGYXVsdEZpbHRlcihib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcnBjRmF1bHRGaWx0ZXJfID0gdmFsdWU7CisgIH0KKworICAvK292ZXJyaWRlKy8gYm9vbCByZW9wZW5UcmFuc3BvcnRzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcmVvcGVuVHJhbnNwb3J0c187CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCByZW9wZW5UcmFuc3BvcnRzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcmVvcGVuVHJhbnNwb3J0c18gPSB2YWx1ZTsKKyAgfQorCisgIG1peGluKGZhbGxiYWNrUG9vbEZvcndhcmRDb2RlIUludGVyZmFjZSgpKTsKKworcHJvdGVjdGVkOgorICAvLyBUaGUgYWN0dWFsIHdvcmtlciBpbXBsZW1lbnRhdGlvbiB0byB3aGljaCBSUEMgbWV0aG9kIGNhbGxzIGFyZSBmb3J3YXJkZWQuCisgIGF1dG8gZXhlY3V0ZU9uUG9vbChzdHJpbmcgbWV0aG9kLCBBcmdzLi4uKShBcmdzIGFyZ3MsCisgICAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24KKyAgKSB7CisgICAgYXV0byBjbGllbnRzID0gcG9vbF9bXTsKKyAgICBpZiAoY2xpZW50cy5lbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vIGNsaWVudHMgYXZhaWxhYmxlIHRvIHRyeS4iKTsKKyAgICB9CisKKyAgICBhdXRvIHByb21pc2UgPSBuZXcgVFByb21pc2UhKFJldHVyblR5cGUhKE1lbWJlclR5cGUhKEludGVyZmFjZSwgbWV0aG9kKSkpOworICAgIEV4Y2VwdGlvbltdIHJwY0V4Y2VwdGlvbnM7CisKKyAgICB2b2lkIHRyeU5leHQoKSB7CisgICAgICB3aGlsZSAoY2xpZW50cy5lbXB0eSkgeworICAgICAgICBDbGllbnQgbmV4dDsKKyAgICAgICAgRHVyYXRpb24gd2FpdFRpbWU7CisgICAgICAgIGlmIChjbGllbnRzLndpbGxCZWNvbWVOb25lbXB0eShuZXh0LCB3YWl0VGltZSkpIHsKKyAgICAgICAgICBpZiAod2FpdFRpbWUgPiBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgICAgICAgIGlmICh3YWl0VGltZSA8IGR1ciEidXNlY3MiKDEwKSkgeworICAgICAgICAgICAgICBpbXBvcnQgY29yZS50aHJlYWQ7CisgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCh3YWl0VGltZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBuZXh0LnRyYW5zcG9ydC5hc3luY01hbmFnZXIuZGVsYXkod2FpdFRpbWUsIHsgdHJ5TmV4dCgpOyB9KTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcm9taXNlLmZhaWwobmV3IFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbigiQWxsIGNsaWVudHMgZmFpbGVkLiIsCisgICAgICAgICAgICBycGNFeGNlcHRpb25zKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGF1dG8gY2xpZW50ID0gY2xpZW50cy5mcm9udDsKKyAgICAgIGNsaWVudHMucG9wRnJvbnQ7CisKKyAgICAgIGlmIChyZW9wZW5UcmFuc3BvcnRzKSB7CisgICAgICAgIGlmICghY2xpZW50LnRyYW5zcG9ydC5pc09wZW4pIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHBvb2xfLnJlY29yZEZhdWx0KGNsaWVudCk7CisgICAgICAgICAgICB0cnlOZXh0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGF1dG8gZnV0dXJlID0gbWl4aW4oImNsaWVudC4iIH4gbWV0aG9kKShhcmdzLCBjYW5jZWxsYXRpb24pOworICAgICAgZnV0dXJlLmNvbXBsZXRpb24uYWRkQ2FsbGJhY2soeworICAgICAgICBpZiAoZnV0dXJlLnN0YXR1cyA9PSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRCkgeworICAgICAgICAgIHByb21pc2UuY2FuY2VsKCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBlID0gZnV0dXJlLmdldEV4Y2VwdGlvbigpOworICAgICAgICBpZiAoZSkgeworICAgICAgICAgIGlmIChycGNGYXVsdEZpbHRlcl8gJiYgcnBjRmF1bHRGaWx0ZXJfKGUpKSB7CisgICAgICAgICAgICBwb29sXy5yZWNvcmRGYXVsdChjbGllbnQpOworICAgICAgICAgICAgcnBjRXhjZXB0aW9ucyB+PSBlOworICAgICAgICAgICAgdHJ5TmV4dCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwb29sXy5yZWNvcmRTdWNjZXNzKGNsaWVudCk7CisgICAgICAgIHByb21pc2UuY29tcGxldGUoZnV0dXJlKTsKKyAgICAgIH0pOworICAgIH0KKworICAgIHRyeU5leHQoKTsKKyAgICByZXR1cm4gcHJvbWlzZTsKKyAgfQorCitwcml2YXRlOgorICBUUmVzb3VyY2VQb29sIUNsaWVudCBwb29sXzsKKyAgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyXzsKKyAgYm9vbCByZW9wZW5UcmFuc3BvcnRzXzsKK30KKworLyoqCisgKiBUQXN5bmNDbGllbnRQb29sIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIGludGVyZmFjZSB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQKKyAqIHVzaW5nIElGVEkgKHNlZSAkKERNREJVRyA2MDgyLCBEIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVlc3QgNjA4MikpLgorICovCitUQXN5bmNDbGllbnRQb29sIUludGVyZmFjZSB0QXN5bmNDbGllbnRQb29sKEludGVyZmFjZSkoCisgIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlW10gY2xpZW50cworKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgeworICByZXR1cm4gbmV3IHR5cGVvZihyZXR1cm4pKGNsaWVudHMpOworfQorCitwcml2YXRlIHsKKyAgLy8gQ2Fubm90IHVzZSBhbiBhbm9ueW1vdXMgZGVsZWdhdGUgbGl0ZXJhbCBmb3IgdGhpcyBiZWNhdXNlIHRoZXkgYXJlbid0CisgIC8vIGFsbG93ZWQgaW4gY2xhc3Mgc2NvcGUuCisgIHN0cmluZyBmYWxsYmFja1Bvb2xGb3J3YXJkQ29kZShJbnRlcmZhY2UpKCkgeworICAgIHN0cmluZyBjb2RlID0gIiI7CisKKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOyBBbGxNZW1iZXJNZXRob2ROYW1lcyFJbnRlcmZhY2UpIHsKKyAgICAgIGVudW0gcW4gPSAiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lOworICAgICAgY29kZSB+PSAiVEZ1dHVyZSEoUmV0dXJuVHlwZSEoIiB+IHFuIH4gIikpICIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgIihQYXJhbWV0ZXJUeXBlVHVwbGUhKCIgfiBxbiB+ICIpIGFyZ3MsIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkge1xuIjsKKyAgICAgIGNvZGUgfj0gInJldHVybiBleGVjdXRlT25Qb29sIShgIiB+IG1ldGhvZE5hbWUgfiAiYCkoYXJncywgY2FuY2VsbGF0aW9uKTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9Cit9CisKKy8qKgorICogQSBUQXN5bmNDbGllbnRQb29sQmFzZSBpbXBsZW1lbnRhdGlvbiB3aGljaCBxdWVyaWVzIG11bHRpcGxlIHNlcnZlcnMgYXQKKyAqIHRoZSBzYW1lIHRpbWUgYW5kIHJldHVybnMgdGhlIGZpcnN0IHN1Y2Nlc3MgcmVzcG9uc2UuCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgwrtzdWNjZXNzwqsgY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIHJwY0ZhdWx0RmlsdGVyKCkKKyAqIGRlbGVnYXRlIHByb3BlcnR5LiBJZiBpdCBpcyBub24tbnVsbCBhbmQgY2FsbGluZyBpdCBmb3IgYW4gZXhjZXB0aW9uIHNldCBieQorICogYSBmYWlsZWQgbWV0aG9kIGludm9jYXRpb24gcmV0dXJucyB0cnVlLCB0aGUgZXJyb3IgaXMgY29uc2lkZXJlZCB0byBiZQorICogY2F1c2VkIGJ5IHRoZSBSUEMgbGF5ZXIgcmF0aGVyIHRoYW4gdGhlIGFwcGxpY2F0aW9uIGxheWVyLCBhbmQgdGhlIG5leHQKKyAqIHNlcnZlciBpbiB0aGUgcG9vbCBpcyB0cmllZC4gSWYgYWxsIGNsaWVudHMgZmFpbCwgdGhlIG9wZXJhdGlvbiBpcyBtYXJrZWQKKyAqIGFzIGZhaWxlZCB3aXRoIGEgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uLgorICovCitmaW5hbCBjbGFzcyBUQXN5bmNGYXN0ZXN0Q2xpZW50UG9vbChJbnRlcmZhY2UpIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRBc3luY0NsaWVudFBvb2xCYXNlIUludGVyZmFjZQoreworICAvLy8KKyAgdGhpcyhDbGllbnRbXSBjbGllbnRzKSB7CisgICAgY2xpZW50c18gPSBjbGllbnRzOworICAgIHJwY0ZhdWx0RmlsdGVyXyA9IGRlZmF1bHRScGNGYXVsdEZpbHRlcjsKKyAgICByZW9wZW5UcmFuc3BvcnRzXyA9IHRydWU7CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCBhZGRDbGllbnQoQ2xpZW50IGNsaWVudCkgeworICAgIGNsaWVudHNfIH49IGNsaWVudDsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyBib29sIHJlbW92ZUNsaWVudChDbGllbnQgY2xpZW50KSB7CisgICAgYXV0byBvbGRMZW5ndGggPSBjbGllbnRzXy5sZW5ndGg7CisgICAgY2xpZW50c18gPSByZW1vdmVFcXVhbChjbGllbnRzXywgY2xpZW50KTsKKyAgICByZXR1cm4gY2xpZW50c18ubGVuZ3RoIDwgb2xkTGVuZ3RoOworICB9CisKKworICAvK292ZXJyaWRlKy8gYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcnBjRmF1bHRGaWx0ZXJfOworICB9CisKKyAgLytvdmVycmlkZSsvIHZvaWQgcnBjRmF1bHRGaWx0ZXIoYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHJwY0ZhdWx0RmlsdGVyXyA9IHZhbHVlOworICB9CisKKyAgLytvdmVycmlkZSsvYm9vbCByZW9wZW5UcmFuc3BvcnRzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcmVvcGVuVHJhbnNwb3J0c187CisgIH0KKworICAvK292ZXJyaWRlKy8gdm9pZCByZW9wZW5UcmFuc3BvcnRzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcmVvcGVuVHJhbnNwb3J0c18gPSB2YWx1ZTsKKyAgfQorCisgIG1peGluKGZhc3Rlc3RQb29sRm9yd2FyZENvZGUhSW50ZXJmYWNlKCkpOworCitwcml2YXRlOgorICBDbGllbnRbXSBjbGllbnRzXzsKKyAgYm9vbCBkZWxlZ2F0ZShFeGNlcHRpb24pIHJwY0ZhdWx0RmlsdGVyXzsKKyAgYm9vbCByZW9wZW5UcmFuc3BvcnRzXzsKK30KKworLyoqCisgKiBUQXN5bmNGYXN0ZXN0Q2xpZW50UG9vbCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5CisgKiBzcGVjaWZ5IHRoZSBpbnRlcmZhY2UgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkCisgKiB1c2luZyBJRlRJIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXN0IDYwODIpKS4KKyAqLworVEFzeW5jRmFzdGVzdENsaWVudFBvb2whSW50ZXJmYWNlIHRBc3luY0Zhc3Rlc3RDbGllbnRQb29sKEludGVyZmFjZSkoCisgIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlW10gY2xpZW50cworKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgeworICByZXR1cm4gbmV3IHR5cGVvZihyZXR1cm4pKGNsaWVudHMpOworfQorCitwcml2YXRlIHsKKyAgLy8gQ2Fubm90IHVzZSBhbiBhbm9ueW1vdXMgZGVsZWdhdGUgbGl0ZXJhbCBmb3IgdGhpcyBiZWNhdXNlIHRoZXkgYXJlbid0CisgIC8vIGFsbG93ZWQgaW4gY2xhc3Mgc2NvcGUuCisgIHN0cmluZyBmYXN0ZXN0UG9vbEZvcndhcmRDb2RlKEludGVyZmFjZSkoKSB7CisgICAgc3RyaW5nIGNvZGUgPSAiIjsKKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IEFsbE1lbWJlck1ldGhvZE5hbWVzIUludGVyZmFjZSkgeworICAgICAgZW51bSBxbiA9ICJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWU7CisgICAgICBjb2RlIH49ICJURnV0dXJlIShSZXR1cm5UeXBlISgiIH4gcW4gfiAiKSkgIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAiKFBhcmFtZXRlclR5cGVUdXBsZSEoIiB+IHFuIH4gIikgYXJncywgIiB+CisgICAgICAgICJUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIHtcbiI7CisgICAgICBjb2RlIH49ICJlbnVtIG1ldGhvZE5hbWUgPSBgIiB+IG1ldGhvZE5hbWUgfiAiYDtcbiI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIGFsaWFzIFJldHVyblR5cGUhKE1lbWJlclR5cGUhKEludGVyZmFjZSwgbWV0aG9kTmFtZSkpIFJlc3VsdFR5cGU7CisKKyAgICAgICAgYXV0byBjaGlsZENhbmNlbGxhdGlvbiA9IG5ldyBUQ2FuY2VsbGF0aW9uT3JpZ2luOworCisgICAgICAgIFRGdXR1cmUhUmVzdWx0VHlwZVtdIGZ1dHVyZXM7CisgICAgICAgIGZ1dHVyZXMucmVzZXJ2ZShjbGllbnRzXy5sZW5ndGgpOworCisgICAgICAgIGZvcmVhY2ggKGM7IGNsaWVudHNfKSB7CisgICAgICAgICAgaWYgKHJlb3BlblRyYW5zcG9ydHMpIHsKKyAgICAgICAgICAgIGlmICghYy50cmFuc3BvcnQuaXNPcGVuKSB7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYy50cmFuc3BvcnQub3BlbigpOworICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGZ1dHVyZXMgfj0gbWl4aW4oImMuIiB+IG1ldGhvZE5hbWUpKGFyZ3MsIGNoaWxkQ2FuY2VsbGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgRmFzdGVzdFBvb2xKb2IhKFJlc3VsdFR5cGUpKAorICAgICAgICAgIGZ1dHVyZXMsIHJwY0ZhdWx0RmlsdGVyLCBjYW5jZWxsYXRpb24sIGNoaWxkQ2FuY2VsbGF0aW9uKTsKKyAgICAgIH07CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9CisKKyAgZmluYWwgY2xhc3MgRmFzdGVzdFBvb2xKb2IoUmVzdWx0KSA6IFRGdXR1cmUhUmVzdWx0IHsKKyAgICB0aGlzKFRGdXR1cmUhUmVzdWx0W10gcG9vbEZ1dHVyZXMsIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlciwKKyAgICAgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uLCBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uCisgICAgKSB7CisgICAgICByZXN1bHRQcm9taXNlXyA9IG5ldyBUUHJvbWlzZSFSZXN1bHQ7CisgICAgICBwb29sRnV0dXJlc18gPSBwb29sRnV0dXJlczsKKyAgICAgIHJwY0ZhdWx0RmlsdGVyXyA9IHJwY0ZhdWx0RmlsdGVyOworICAgICAgY2hpbGRDYW5jZWxsYXRpb25fID0gY2hpbGRDYW5jZWxsYXRpb247CisKKyAgICAgIGZvcmVhY2ggKGZ1dHVyZTsgcG9vbEZ1dHVyZXMpIHsKKyAgICAgICAgZnV0dXJlLmNvbXBsZXRpb24uYWRkQ2FsbGJhY2soeworICAgICAgICAgIGF1dG8gZiA9IGZ1dHVyZTsKKyAgICAgICAgICByZXR1cm4geyBjb21wbGV0aW9uQ2FsbGJhY2soZik7IH07CisgICAgICAgIH0oKSk7CisgICAgICAgIGlmIChmdXR1cmUuc3RhdHVzICE9IFRGdXR1cmVTdGF0dXMuUlVOTklORykgeworICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGZ1dHVyZSBpcyBhbHJlYWR5IGNvbXBsZXRlZCwgd2UgYXJlIGRvbmUsIGRvbid0CisgICAgICAgICAgLy8gYm90aGVyIGFkZGluZyBjYWxsYmFja3MgZm9yIHRoZSBvdGhlcnMgKHRoZXkgd291bGQganVzdCByZXR1cm4KKyAgICAgICAgICAvLyBpbW1lZGlhdGVseSBhZnRlciBhY3F1aXJpbmcgdGhlIGxvY2spLgorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIGNhbmNlbGxhdGlvbi50cmlnZ2VyaW5nLmFkZENhbGxiYWNrKHsKKyAgICAgICAgICByZXN1bHRQcm9taXNlXy5jYW5jZWwoKTsKKyAgICAgICAgICBjaGlsZENhbmNlbGxhdGlvbi50cmlnZ2VyKCk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKworICAgIFRGdXR1cmVTdGF0dXMgc3RhdHVzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICAgIHJldHVybiByZXN1bHRQcm9taXNlXy5zdGF0dXM7CisgICAgfQorCisgICAgVEF3YWl0YWJsZSBjb21wbGV0aW9uKCkgQHByb3BlcnR5IHsKKyAgICAgIHJldHVybiByZXN1bHRQcm9taXNlXy5jb21wbGV0aW9uOworICAgIH0KKworICAgIFJlc3VsdCBnZXQoKSB7CisgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZV8uZ2V0KCk7CisgICAgfQorCisgICAgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgIHJldHVybiByZXN1bHRQcm9taXNlXy5nZXRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIGNvbXBsZXRpb25DYWxsYmFjayhURnV0dXJlIVJlc3VsdCBmdXR1cmUpIHsKKyAgICAgIHN5bmNocm9uaXplZCB7CisgICAgICAgIGlmIChmdXR1cmUuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuQ0FOQ0VMTEVEKSB7CisgICAgICAgICAgYXNzZXJ0KHJlc3VsdFByb21pc2VfLnN0YXR1cyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHRQcm9taXNlXy5zdGF0dXMgIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HKSB7CisgICAgICAgICAgLy8gVGhlIG9wZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4gVGhpcyBjYW4gaGFwcGVuIGlmCisgICAgICAgICAgLy8gYW5vdGhlciBjbGllbnQgY29tcGxldGVkIGZpcnN0LCBidXQgdGhpcyBjYWxsYmFjayB3YXMgYWxyZWFkeQorICAgICAgICAgIC8vIHdhaXRpbmcgZm9yIHRoZSBsb2NrIHdoZW4gaXQgY2FsbGVkIGNhbmNlbCgpLgorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmdXR1cmUuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuRkFJTEVEKSB7CisgICAgICAgICAgYXV0byBlID0gZnV0dXJlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgIGlmIChycGNGYXVsdEZpbHRlcl8gJiYgcnBjRmF1bHRGaWx0ZXJfKGUpKSB7CisgICAgICAgICAgICBycGNFeGNlcHRpb25zXyB+PSBlOworCisgICAgICAgICAgICBpZiAocnBjRXhjZXB0aW9uc18ubGVuZ3RoID09IHBvb2xGdXR1cmVzXy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgcmVzdWx0UHJvbWlzZV8uZmFpbChuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJBbGwgY2hpbGQgb3BlcmF0aW9ucyBmYWlsZWQsIHVuYWJsZSB0byByZXRyaWV2ZSBhIHJlc3VsdC4iLAorICAgICAgICAgICAgICAgIHJwY0V4Y2VwdGlvbnNfCisgICAgICAgICAgICAgICkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIHJlc3VsdCB0byB0aGUgdGFyZ2V0IHByb21pc2UuCisgICAgICAgIHJlc3VsdFByb21pc2VfLmNvbXBsZXRlKGZ1dHVyZSk7CisKKyAgICAgICAgLy8gQ2FuY2VsIHRoZSBvdGhlciBmdXR1cmVzLCB3ZSB3b3VsZCBqdXN0IGRpc2NhcmQgdGhlaXIgcmVzdWx0cy4KKyAgICAgICAgLy8gTm90ZTogV2UgZG8gdGhpcyBhZnRlciB3ZSBoYXZlIHN0b3JlZCB0aGUgcmVzdWx0cyB0byBvdXIgcHJvbWlzZSwKKyAgICAgICAgLy8gc2VlIHRoZSBhc3NlcnQgYXQgdGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24uCisgICAgICAgIGNoaWxkQ2FuY2VsbGF0aW9uXy50cmlnZ2VyKCk7CisgICAgICB9CisgICAgfQorCisgICAgVFByb21pc2UhUmVzdWx0IHJlc3VsdFByb21pc2VfOworICAgIFRGdXR1cmUhUmVzdWx0W10gcG9vbEZ1dHVyZXNfOworICAgIEV4Y2VwdGlvbltdIHJwY0V4Y2VwdGlvbnNfOworICAgIGJvb2wgZGVsZWdhdGUoRXhjZXB0aW9uKSBycGNGYXVsdEZpbHRlcl87CisgICAgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbl87CisgIH0KK30KKworLyoqCisgKiBBbGxvd3MgZWFzaWx5IGFnZ3JlZ2F0aW5nIHJlc3VsdHMgZnJvbSBhIG51bWJlciBvZiBUQXN5bmNDbGllbnRzLgorICoKKyAqIENvbnRyYXJ5IHRvIFRBc3luY3tGYWxsYmFjaywgRmFzdGVzdH1DbGllbnRQb29sLCB0aGlzIGNsYXNzIGRvZXMgbm90CisgKiBzaW1wbHkgaW1wbGVtZW50IFRGdXR1cmVJbnRlcmZhY2UhSW50ZXJmYWNlLiBJdCBtYW5hZ2VzIGEgcG9vbCBvZiBjbGllbnRzLAorICogYnV0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgY3VzdG9tIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIHRvIHVzZSBvciB0bworICogaXRlcmF0ZSBvdmVyIHRoZSByZXN1bHRzIHVzaW5nIGEgVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZS4KKyAqCisgKiBGb3IgZWFjaCBzZXJ2aWNlIG1ldGhvZCwgVEFzeW5jQWdncmVnYXRvciBvZmZlcnMgYSBtZXRob2QKKyAqIGFjY2VwdGluZyB0aGUgc2FtZSBhcmd1bWVudHMsIGFuZCBhbiBvcHRpb25hbCBUQ2FuY2VsbGF0aW9uIGluc3RhbmNlLCBqdXN0CisgKiBsaWtlIHdpdGggVEZ1dHVyZUludGVyZmFjZS4gVGhlIHJldHVybiB0eXBlLCBob3dldmVyLCBpcyBhIHByb3h5IG9iamVjdAorICogdGhhdCBvZmZlcnMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICogLS0tCisgKiAvKysKKyAqICArIFJldHVybnMgYSB0aHJpZnQudXRpbC5mdXR1cmUuVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZSBmb3IgdGhlIHJlc3VsdHMgb2YKKyAqICArIHRoZSBjbGllbnQgcG9vbCBtZXRob2QgaW52b2NhdGlvbnMuCisgKiAgKworICogICsgVGhlIFtdIChzbGljaW5nKSBvcGVyYXRvciBjYW4gYWxzbyBiZSB1c2VkIHRvIG9idGFpbiB0aGUgcmFuZ2UuCisgKiAgKworICogICsgUGFyYW1zOgorICogICsgICB0aW1lb3V0ID0gQSB0aW1lb3V0IHRvIHBhc3MgdG8gdGhlIFRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UgY29uc3RydWN0b3IsCisgKiAgKyAgICAgZGVmYXVsdHMgdG8gemVybyAobm8gdGltZW91dCkuCisgKiAgKy8KKyAqIFRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UhUmV0dXJuVHlwZSByYW5nZShEdXJhdGlvbiB0aW1lb3V0ID0gZHVyISJobnNlY3MiKDApKTsKKyAqIGF1dG8gb3BTbGljZSgpIHsgcmV0dXJuIHJhbmdlKCk7IH0gLy8vIERpdHRvCisgKgorICogLysrCisgKiAgKyBSZXR1cm5zIGEgZnV0dXJlIHRoYXQgZ2F0aGVycyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBjbGllbnRzIGluIHRoZSBwb29sCisgKiAgKyBhbmQgaW52b2tlcyBhIHVzZXItc3VwcGxpZWQgYWNjdW11bGF0b3IgZnVuY3Rpb24gb24gdGhlbSwgcmV0dXJuaW5nIGl0cworICogICsgcmV0dXJuIHZhbHVlIHRvIHRoZSBjbGllbnQuCisgKiAgKworICogICsgSW4gYWRkaXRpb24gdG8gdGhlIFRGdXR1cmUhQWNjdW11bGF0ZWRUeXBlIGludGVyZmFjZSAod2hlcmUKKyAqICArIEFjY3VtdWxhdGVkVHlwZSBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGFjY3VtdWxhdG9yIGZ1bmN0aW9uKSwgdGhlCisgKiAgKyByZXR1cm5lZCBvYmplY3QgYWxzbyBvZmZlcnMgdHdvIGFkZGl0aW9uYWwgbWV0aG9kcywgZmluaXNoKCkgYW5kCisgKiAgKyBmaW5pc2hHZXQoKTogQnkgZGVmYXVsdCwgdGhlIGFjY3VtdWxhdG9yIGZ1bmN0aW9ucyBpcyBjYWxsZWQgYWZ0ZXIgYWxsCisgKiAgKyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBwb29sIGNsaWVudHMgaGF2ZSBiZWNvbWUgYXZhaWxhYmxlLiBDYWxsaW5nIGZpbmlzaCgpCisgKiAgKyBjYXVzZXMgdGhlIGFjY3VtdWxhdG9yIGZ1dHVyZSB0byBzdG9wIHdhaXRpbmcgZm9yIG90aGVyIHJlc3VsdHMgYW5kCisgKiAgKyBpbW1lZGlhdGVseSBpbnZva2luZyB0aGUgYWNjdW11bGF0b3IgZnVuY3Rpb24gb24gdGhlIHJlc3VsdHMgY3VycmVudGx5CisgKiAgKyBhdmFpbGFibGUuIElmIGFsbCByZXN1bHRzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSwgZmluaXNoKCkgaXMgYSBuby1vcC4KKyAqICArIGZpbmlzaEdldCgpIGlzIGEgY29udmVuaWVuY2Ugc2hvcnRjdXQgZm9yIGNvbWJpbmluZyBpdCB3aXRoCisgKiAgKyBhIGNhbGwgdG8gZ2V0KCkgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcywgbGlrZSB3YWl0R2V0KCkgaXMgZm9yIHdhaXQoKS4KKyAqICArCisgKiAgKyBUaGUgYWNjIGFsaWFzIGNhbiBwb2ludCB0byBhbnkgY2FsbGFibGUgYWNjZXB0aW5nIGVpdGhlciBhbiBhcnJheSBvZgorICogICsgcmV0dXJuIHZhbHVlcyBvciBhbiBhcnJheSBvZiByZXR1cm4gdmFsdWVzIGFuZCBhbiBhcnJheSBvZiBleGNlcHRpb25zOworICogICsgc2VlIGlzQWNjdW11bGF0b3IhKCkgZm9yIGRldGFpbHMuIFRoZSBkZWZhdWx0IGFjY3VtdWxhdG9yIGNvbmNhdGVuYXRlcworICogICsgcmV0dXJuIHZhbHVlcyB0aGF0IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBlYWNoIG90aGVycyAoZS5nLiBhcnJheXMpLAorICogICsgYW5kIHNpbXBseSByZXR1cm5zIGFuIGFycmF5IG9mIHZhbHVlcyBvdGhlcndpc2UsIGZhaWxpbmcgd2l0aCBhCisgKiAgKyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24gbm8gdmFsdWVzIHdlcmUgcmV0dXJuZWQuCisgKiAgKworICogICsgVGhlIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIGlzIG5vdCBleGVjdXRlZCBpbiBhbnkgb2YgdGhlIGFzeW5jIG1hbmFnZXIKKyAqICArIHdvcmtlciB0aHJlYWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXN5bmMgY2xpZW50cywgYnV0IGluc3RlYWQgaXQgaXMKKyAqICArIGludm9rZWQgd2hlbiB0aGUgYWN0dWFsIHJlc3VsdCBpcyByZXF1ZXN0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFmdGVyIHRoZQorICogICsgb3BlcmF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gVGhpcyBhbHNvIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBzdGF0dXMKKyAqICArIG9mIHRoZSBvcGVyYXRpb24gb25jZSBpdCBpcyBubyBsb25nZXIgcnVubmluZywgc2luY2UgdGhlIGFjY3VtdWxhdG9yCisgKiAgKyBoYXMgdG8gYmUgcnVuIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIG9yIGZhaWxlZC4KKyAqICArLworICogYXV0byBhY2N1bXVsYXRlKGFsaWFzIGFjYyA9IGRlZmF1bHRBY2N1bXVsYXRvcikoKSBpZiAoaXNBY2N1bXVsYXRvciFhY2MpOworICogLS0tCisgKgorICogRXhhbXBsZToKKyAqIC0tLQorICogLy8gU29tZSBUaHJpZnQgc2VydmljZS4KKyAqIGludGVyZmFjZSBGb28geworICogICBpbnQgZm9vKHN0cmluZyBuYW1lKTsKKyAqICAgYnl0ZVtdIGJhcigpOworICogfQorICoKKyAqIC8vIENyZWF0ZSB0aGUgYWdncmVnYXRvciBwb29sIOKAkyBjbGllbnQwLCBjbGllbnQxLCBjbGllbnQyIGFyZSBzb21lCisgKiAvLyBUQXN5bmNDbGllbnQhRm9vIGluc3RhbmNlcywgYnV0IGluIHRoZW9yeSBjb3VsZCBhbHNvIGJlIG90aGVyCisgKiAvLyBURnV0dXJlSW50ZXJmYWNlIUZvbyBpbXBsZW1lbnRhdGlvbnMgKGUuZy4gc29tZSBhc3luYyBjbGllbnQgcG9vbCkuCisgKiBhdXRvIHBvb2wgPSBuZXcgVEFzeW5jQWdncmVnYXRvciFGb28oW2NsaWVudDAsIGNsaWVudDEsIGNsaWVudDJdKTsKKyAqCisgKiBmb3JlYWNoICh2YWw7IHBvb2wuZm9vKCJiYXoiKS5yYW5nZShkdXIhInNlY29uZHMiKDEpKSkgeworICogICAvLyBQcm9jZXNzIGFsbCB0aGUgcmVzdWx0cyB0aGF0IGFyZSBhdmFpbGFibGUgYmVmb3JlIGEgc2Vjb25kIGhhcyBwYXNzZWQsCisgKiAgIC8vIGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4KKyAqICAgd3JpdGVsbih2YWwpOworICogfQorICoKKyAqIGF1dG8gc3VtUm9vdHMgPSBwb29sLmZvbygiYmF6IikuYWNjdW11bGF0ZSEoKGludFtdIHZhbHMsIEV4Y2VwdGlvbnNbXSBleHMpeworICogICBpZiAodmFscy5lbXB0eSkgeworICogICAgIHRocm93IG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oIkFsbCBjbGllbnRzIGZhaWxlZCIsIGV4cyk7CisgKiAgIH0KKyAqCisgKiAgIC8vIEp1c3QgdG8gaWxsdXN0cmF0ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMgY2FuIGNoYW5nZSwgY29udmVydCB0aGUKKyAqICAgLy8gbnVtYmVycyB0byBkb3VibGUgYW5kIHN1bSB1cCB0aGVpciByb290cy4KKyAqICAgZG91YmxlIHJlc3VsdCA9IDA7CisgKiAgIGZvcmVhY2ggKHY7IHZhbHMpIHJlc3VsdCArPSBzcXJ0KGNhc3QoZG91YmxlKXYpOworICogICByZXR1cm4gcmVzdWx0OworICogfSkoKTsKKyAqCisgKiAvLyBXYWl0IHVwIHRvIHRocmVlIHNlY29uZHMgZm9yIHRoZSByZXN1bHQsIGFuZCB0aGVuIGFjY3VtdWxhdGUgd2hhdCBoYXMKKyAqIC8vIGFycml2ZWQgc28gZmFyLgorICogc3VtUm9vdHMuY29tcGxldGlvbi53YWl0KGR1ciEic2Vjb25kcyIoMykpOworICogd3JpdGVsbihzdW1Sb290cy5maW5pc2hHZXQoKSk7CisgKgorICogLy8gRm9yIHNjYWxhcnMsIHRoZSBkZWZhdWx0IGFjY3VtdWxhdG9yIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHZhbHVlcy4KKyAqIHByYWdtYShtc2csIHR5cGVvZihwb29sLmZvbygiIikuYWNjdW11bGF0ZSgpLmdldCgpKTsgLy8gaW50W10uCisgKgorICogLy8gRm9yIGxpc3RzLCBldGMuLCBpdCBjb25jYXRlbmF0ZXMgdGhlIHJlc3VsdHMgdG9nZXRoZXIuCisgKiBwcmFnbWEobXNnLCB0eXBlb2YocG9vbC5iYXIoKS5hY2N1bXVsYXRlKCkuZ2V0KCkpKTsgLy8gYnl0ZVtdLgorICogLS0tCisgKgorICogTm90ZTogRm9yIHRoZSBhY2N1bXVsYXRlISgpIGludGVyZmFjZSwgeW91IG1pZ2h0IGN1cnJlbnRseSBoaXQgYSDCu2Nhbm5vdCB1c2UKKyAqIGxvY2FsICfigKYnIGFzIHBhcmFtZXRlciB0byBub24tZ2xvYmFsIHRlbXBsYXRlIGFjY3VtdWxhdGXCqy1lcnJvciwgc2VlCisgKiAkKERNREJVRyA1NzEwLCBETUQgaXNzdWUgNTcxMCkuIElmIHlvdXIgYWNjdW11bGF0b3IgZnVuY3Rpb24gZG9lcyBub3QgbmVlZAorICogdG8gYWNjZXNzIHRoZSBzdXJyb3VuZGluZyBzY29wZSwgeW91IG1pZ2h0IHdhbnQgdG8gdXNlIGEgZnVuY3Rpb24gbGl0ZXJhbAorICogaW5zdGVhZCBvZiBhIGRlbGVnYXRlIHRvIGF2b2lkIHRoZSBpc3N1ZS4KKyAqLworY2xhc3MgVEFzeW5jQWdncmVnYXRvcihJbnRlcmZhY2UpIGlmIChpc0Jhc2VTZXJ2aWNlIUludGVyZmFjZSkgeworICAvLy8gU2hvcnRoYW5kIGZvciB0aGUgY2xpZW50IHR5cGUgdGhpcyBpbnN0YW5jZSBvcGVyYXRlcyBvbi4KKyAgYWxpYXMgVEFzeW5jQ2xpZW50QmFzZSFJbnRlcmZhY2UgQ2xpZW50OworCisgIC8vLworICB0aGlzKENsaWVudFtdIGNsaWVudHMpIHsKKyAgICBjbGllbnRzXyA9IGNsaWVudHM7CisgIH0KKworICAvLy8gV2hldGhlciB0byBvcGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydHMgb2YgYSBjbGllbnQgYmVmb3JlIHRyeWluZyB0bworICAvLy8gZXhlY3V0ZSBhIG1ldGhvZCBpZiB0aGV5IGFyZSBub3Qgb3Blbi4gVGhpcyBpcyB1c3VhbGx5IGRlc2lyYWJsZQorICAvLy8gYmVjYXVzZSBpdCBhbGxvd3MgZS5nLiB0byBhdXRvbWF0aWNhbGx5IHJlY29ubmVjdCB0byBhIHJlbW90ZSBzZXJ2ZXIKKyAgLy8vIGlmIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZHJvcHBlZC4KKyAgLy8vCisgIC8vLyBEZWZhdWx0cyB0byB0cnVlLgorICBib29sIHJlb3BlblRyYW5zcG9ydHMgPSB0cnVlOworCisgIG1peGluIEFnZ3JlZ2F0b3JPcERpc3BhdGNoISgpOworCitwcml2YXRlOgorICBDbGllbnRbXSBjbGllbnRzXzsKK30KKworLy8vIERpdHRvCitjbGFzcyBUQXN5bmNBZ2dyZWdhdG9yKEludGVyZmFjZSkgaWYgKGlzRGVyaXZlZFNlcnZpY2UhSW50ZXJmYWNlKSA6CisgIFRBc3luY0FnZ3JlZ2F0b3IhKEJhc2VTZXJ2aWNlIUludGVyZmFjZSkKK3sKKyAgLy8vIFNob3J0aGFuZCBmb3IgdGhlIGNsaWVudCB0eXBlIHRoaXMgaW5zdGFuY2Ugb3BlcmF0ZXMgb24uCisgIGFsaWFzIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlIENsaWVudDsKKworICAvLy8KKyAgdGhpcyhDbGllbnRbXSBjbGllbnRzKSB7CisgICAgc3VwZXIoY2FzdChUQXN5bmNDbGllbnRCYXNlIShCYXNlU2VydmljZSFJbnRlcmZhY2UpW10pY2xpZW50cyk7CisgIH0KKworICBtaXhpbiBBZ2dyZWdhdG9yT3BEaXNwYXRjaCEoKTsKK30KKworLyoqCisgKiBXaGV0aGVyIGZ1biBpcyBhIHZhbGlkIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIGZvciB2YWx1ZXMgb2YgdHlwZSBWYWx1ZVR5cGUuCisgKgorICogRm9yIHRoaXMgdG8gYmUgdHJ1ZSwgZnVuIG11c3QgYmUgYSBjYWxsYWJsZSBtYXRjaGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZworICogYXJndW1lbnQgbGlzdHM6CisgKiAtLS0KKyAqIGZ1bihWYWx1ZVR5cGVbXSB2YWx1ZXMpOworICogZnVuKFZhbHVlVHlwZVtdIHZhbHVlcywgRXhjZXB0aW9uW10gZXhjZXB0aW9ucyk7CisgKiAtLS0KKyAqCisgKiBUaGUgc2Vjb25kIHZlcnNpb24gaXMgcGFzc2VkIHRoZSBjb2xsZWN0ZWQgYXJyYXkgZXhjZXB0aW9ucyBmcm9tIGFsbCB0aGUKKyAqIGNsaWVudHMgaW4gdGhlIHBvb2wuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0b3IgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBjbGllbnQgKHZpYQorICogdGhlIHJlc3VsdCBmdXR1cmUpLiBJZiBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB0aGUgb3BlcmF0aW9uIGlzIG1hcmtlZCBhcworICogZmFpbGVkIHdpdGggdGhlIGdpdmVuIGV4Y2VwdGlvbiBpbnN0ZWFkLgorICovCit0ZW1wbGF0ZSBpc0FjY3VtdWxhdG9yKFZhbHVlVHlwZSwgYWxpYXMgZnVuKSB7CisgIGVudW0gaXNBY2N1bXVsYXRvciA9IGlzKHR5cGVvZihmdW4oY2FzdChWYWx1ZVR5cGVbXSlbXSkpKSB8fAorICAgIGlzKHR5cGVvZihmdW4oY2FzdChWYWx1ZVR5cGVbXSlbXSwgY2FzdChFeGNlcHRpb25bXSlbXSkpKTsKK30KKworLyoqCisgKiBUQXN5bmNBZ2dyZWdhdG9yIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIGludGVyZmFjZSB0eXBlLCBpLmUuIHRvIGFsbG93IHRoZSBjb25zdHJ1Y3RvciBiZWluZyBjYWxsZWQKKyAqIHVzaW5nIElGVEkgKHNlZSAkKERNREJVRyA2MDgyLCBEIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVlc3QgNjA4MikpLgorICovCitUQXN5bmNBZ2dyZWdhdG9yIUludGVyZmFjZSB0QXN5bmNBZ2dyZWdhdG9yKEludGVyZmFjZSkoCisgIFRBc3luY0NsaWVudEJhc2UhSW50ZXJmYWNlW10gY2xpZW50cworKSBpZiAoaXNTZXJ2aWNlIUludGVyZmFjZSkgeworICByZXR1cm4gbmV3IHR5cGVvZihyZXR1cm4pKGNsaWVudHMpOworfQorCitwcml2YXRlIHsKKyAgbWl4aW4gdGVtcGxhdGUgQWdncmVnYXRvck9wRGlzcGF0Y2goKSB7CisgICAgYXV0byBvcERpc3BhdGNoKHN0cmluZyBuYW1lLCBBcmdzLi4uKShBcmdzIGFyZ3MpIGlmICgKKyAgICAgIGlzKHR5cGVvZihtaXhpbigiSW50ZXJmYWNlLmluaXQuIiB+IG5hbWUpKGFyZ3MpKSkKKyAgICApIHsKKyAgICAgIGFsaWFzIFJldHVyblR5cGUhKE1lbWJlclR5cGUhKEludGVyZmFjZSwgbmFtZSkpIFJlc3VsdFR5cGU7CisKKyAgICAgIGF1dG8gY2hpbGRDYW5jZWxsYXRpb24gPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbjsKKworICAgICAgVEZ1dHVyZSFSZXN1bHRUeXBlW10gZnV0dXJlczsKKyAgICAgIGZ1dHVyZXMucmVzZXJ2ZShjbGllbnRzXy5sZW5ndGgpOworCisgICAgICBmb3JlYWNoIChjOyBjYXN0KENsaWVudFtdKWNsaWVudHNfKSB7CisgICAgICAgIGlmIChyZW9wZW5UcmFuc3BvcnRzKSB7CisgICAgICAgICAgaWYgKCFjLnRyYW5zcG9ydC5pc09wZW4pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGMudHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmdXR1cmVzIH49IG1peGluKCJjLiIgfiBuYW1lKShhcmdzLCBjaGlsZENhbmNlbGxhdGlvbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBBZ2dyZWdhdGlvblJlc3VsdCFSZXN1bHRUeXBlKGZ1dHVyZXMsIGNoaWxkQ2FuY2VsbGF0aW9uKTsKKyAgICB9CisgIH0KKworICBzdHJ1Y3QgQWdncmVnYXRpb25SZXN1bHQoVCkgeworICAgIGF1dG8gb3BTbGljZSgpIHsKKyAgICAgIHJldHVybiByYW5nZSgpOworICAgIH0KKworICAgIGF1dG8gcmFuZ2UoRHVyYXRpb24gdGltZW91dCA9IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgcmV0dXJuIHRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UoZnV0dXJlc18sIGNoaWxkQ2FuY2VsbGF0aW9uXywgdGltZW91dCk7CisgICAgfQorCisgICAgYXV0byBhY2N1bXVsYXRlKGFsaWFzIGFjYyA9IGRlZmF1bHRBY2N1bXVsYXRvcikoKSBpZiAoaXNBY2N1bXVsYXRvciEoVCwgYWNjKSkgeworICAgICAgcmV0dXJuIG5ldyBBY2N1bXVsYXRvckpvYiEoVCwgYWNjKShmdXR1cmVzXywgY2hpbGRDYW5jZWxsYXRpb25fKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBURnV0dXJlIVRbXSBmdXR1cmVzXzsKKyAgICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uXzsKKyAgfQorCisgIGF1dG8gZGVmYXVsdEFjY3VtdWxhdG9yKFQpKFRbXSB2YWx1ZXMsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMpIHsKKyAgICBpZiAodmFsdWVzLmVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKCJBbGwgY2xpZW50cyBmYWlsZWQiLAorICAgICAgICBleGNlcHRpb25zKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihULmluaXQgfiBULmluaXQpKSkgeworICAgICAgaW1wb3J0IHN0ZC5hbGdvcml0aG07CisgICAgICByZXR1cm4gcmVkdWNlISJhIH4gYiIodmFsdWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisgIH0KKworICBmaW5hbCBjbGFzcyBBY2N1bXVsYXRvckpvYihULCBhbGlhcyBhY2N1bXVsYXRvcikgaWYgKAorICAgIGlzQWNjdW11bGF0b3IhKFQsIGFjY3VtdWxhdG9yKQorICApIDogVEZ1dHVyZSEoQWNjdW11bGF0b3JSZXN1bHQhKFQsIGFjY3VtdWxhdG9yKSkgeworICAgIHRoaXMoVEZ1dHVyZSFUW10gZnV0dXJlcywgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbikgeworICAgICAgZnV0dXJlc18gPSBmdXR1cmVzOworICAgICAgY2hpbGRDYW5jZWxsYXRpb25fID0gY2hpbGRDYW5jZWxsYXRpb247CisgICAgICByZXN1bHRNdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgICBjb21wbGV0aW9uRXZlbnRfID0gbmV3IFRPbmVzaG90RXZlbnQ7CisKKyAgICAgIGZvcmVhY2ggKGZ1dHVyZTsgZnV0dXJlcykgeworICAgICAgICBmdXR1cmUuY29tcGxldGlvbi5hZGRDYWxsYmFjayh7CisgICAgICAgICAgYXV0byBmID0gZnV0dXJlOworICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc3VsdE11dGV4XykgeworICAgICAgICAgICAgICBpZiAoZi5zdGF0dXMgPT0gVEZ1dHVyZVN0YXR1cy5DQU5DRUxMRUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbmlzaGVkXykgeworICAgICAgICAgICAgICAgICAgc3RhdHVzXyA9IFRGdXR1cmVTdGF0dXMuQ0FOQ0VMTEVEOworICAgICAgICAgICAgICAgICAgZmluaXNoZWRfID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGYuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uc18gfj0gZi5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzXyB+PSBmLmdldCgpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHJlc3VsdHNfLmxlbmd0aCArIGV4Y2VwdGlvbnNfLmxlbmd0aCA9PSBmdXR1cmVzXy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25FdmVudF8udHJpZ2dlcigpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBURnV0dXJlU3RhdHVzIHN0YXR1cygpIEBwcm9wZXJ0eSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHJlc3VsdE11dGV4XykgeworICAgICAgICBpZiAoIWZpbmlzaGVkXykgcmV0dXJuIFRGdXR1cmVTdGF0dXMuUlVOTklORzsKKyAgICAgICAgaWYgKHN0YXR1c18gIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HKSByZXR1cm4gc3RhdHVzXzsKKworICAgICAgICB0cnkgeworICAgICAgICAgIHJlc3VsdF8gPSBpbnZva2VBY2N1bXVsYXRvciFhY2N1bXVsYXRvcihyZXN1bHRzXywgZXhjZXB0aW9uc18pOworICAgICAgICAgIHN0YXR1c18gPSBURnV0dXJlU3RhdHVzLlNVQ0NFRURFRDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBleGNlcHRpb25fID0gZTsKKyAgICAgICAgICBzdGF0dXNfID0gVEZ1dHVyZVN0YXR1cy5GQUlMRUQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdHVzXzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBUQXdhaXRhYmxlIGNvbXBsZXRpb24oKSBAcHJvcGVydHkgeworICAgICAgcmV0dXJuIGNvbXBsZXRpb25FdmVudF87CisgICAgfQorCisgICAgQWNjdW11bGF0b3JSZXN1bHQhKFQsIGFjY3VtdWxhdG9yKSBnZXQoKSB7CisgICAgICBhdXRvIHMgPSBzdGF0dXM7CisKKyAgICAgIGVuZm9yY2UocyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcsCisgICAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHlldCBjb21wbGV0ZWQuIikpOworCisgICAgICBpZiAocyA9PSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRCkgdGhyb3cgbmV3IFRDYW5jZWxsZWRFeGNlcHRpb247CisgICAgICBpZiAocyA9PSBURnV0dXJlU3RhdHVzLkZBSUxFRCkgdGhyb3cgZXhjZXB0aW9uXzsKKyAgICAgIHJldHVybiByZXN1bHRfOworICAgIH0KKworICAgIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7CisgICAgICBhdXRvIHMgPSBzdGF0dXM7CisgICAgICBlbmZvcmNlKHMgIT0gVEZ1dHVyZVN0YXR1cy5SVU5OSU5HLAorICAgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCB5ZXQgY29tcGxldGVkLiIpKTsKKworICAgICAgaWYgKHMgPT0gVEZ1dHVyZVN0YXR1cy5DQU5DRUxMRUQpIHRocm93IG5ldyBUQ2FuY2VsbGVkRXhjZXB0aW9uOworCisgICAgICBpZiAocyA9PSBURnV0dXJlU3RhdHVzLlNVQ0NFRURFRCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBleGNlcHRpb25fOworICAgIH0KKworICAgIHZvaWQgZmluaXNoKCkgeworICAgICAgc3luY2hyb25pemVkIChyZXN1bHRNdXRleF8pIHsKKyAgICAgICAgaWYgKCFmaW5pc2hlZF8pIHsKKyAgICAgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgICAgICAgIGNoaWxkQ2FuY2VsbGF0aW9uXy50cmlnZ2VyKCk7CisgICAgICAgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIGZpbmlzaEdldCgpIHsKKyAgICAgIGZpbmlzaCgpOworICAgICAgcmV0dXJuIGdldCgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFRGdXR1cmUhVFtdIGZ1dHVyZXNfOworICAgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb25fOworCisgICAgYm9vbCBmaW5pc2hlZF87CisgICAgVFtdIHJlc3VsdHNfOworICAgIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnNfOworCisgICAgVEZ1dHVyZVN0YXR1cyBzdGF0dXNfOworICAgIE11dGV4IHJlc3VsdE11dGV4XzsKKyAgICB1bmlvbiB7CisgICAgICBBY2N1bXVsYXRvclJlc3VsdCEoVCwgYWNjdW11bGF0b3IpIHJlc3VsdF87CisgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uXzsKKyAgICB9CisgICAgVE9uZXNob3RFdmVudCBjb21wbGV0aW9uRXZlbnRfOworICB9CisKKyAgYXV0byBpbnZva2VBY2N1bXVsYXRvcihhbGlhcyBhY2N1bXVsYXRvciwgVCkoCisgICAgVFtdIHZhbHVlcywgRXhjZXB0aW9uW10gZXhjZXB0aW9ucworICApIGlmICgKKyAgICBpc0FjY3VtdWxhdG9yIShULCBhY2N1bXVsYXRvcikKKyAgKSB7CisgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoYWNjdW11bGF0b3IodmFsdWVzLCBleGNlcHRpb25zKSkpKSB7CisgICAgICByZXR1cm4gYWNjdW11bGF0b3IodmFsdWVzLCBleGNlcHRpb25zKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yKHZhbHVlcyk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgQWNjdW11bGF0b3JSZXN1bHQoVCwgYWxpYXMgYWNjKSB7CisgICAgYWxpYXMgdHlwZW9mKGludm9rZUFjY3VtdWxhdG9yIWFjYyhjYXN0KFRbXSlbXSwgY2FzdChFeGNlcHRpb25bXSlbXSkpCisgICAgICBBY2N1bXVsYXRvclJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1NDk5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9iYXNlLmQKQEAgLTAsMCArMSwxMDIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQ29kZSBnZW5lcmF0aW9uIG1ldGFkYXRhIGFuZCB0ZW1wbGF0ZXMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIHN0cnVjdAorICogc2VyaWFsaXphdGlvbi4KKyAqCisgKiBNYW55IHRlbXBsYXRlcyBjYW4gYmUgY3VzdG9taXplZCB1c2luZyBmaWVsZCBtZXRhIGRhdGEsIHdoaWNoIGlzIHJlYWQgZnJvbQorICogYSBtYW5pZmVzdCBjb25zdGFudCBtZW1iZXIgb2YgdGhlIGdpdmVuIHR5cGUgY2FsbGVkIGZpZWxkTWV0YSAoaWYgcHJlc2VudCksCisgKiBhbmQgaXMgY29uY2F0ZW5hdGVkIHdpdGggdGhlIGVsZW1lbnRzIGZyb20gdGhlIG9wdGlvbmFsIGZpZWxkTWV0YURhdGEKKyAqIHRlbXBsYXRlIGFsaWFzIHBhcmFtZXRlci4KKyAqCisgKiBTb21lIGNvZGUgZ2VuZXJhdGlvbiB0ZW1wbGF0ZXMgdGFrZSBhY2NvdW50IG9mIHRoZSBvcHRpb25hbCBUVmVyYm9zZUNvZGVnZW4KKyAqIHZlcnNpb24gZGVjbGFyYXRpb24sIHdoaWNoIGNhdXNlcyB3YXJuaW5nIG1lc3NhZ2VzIHRvIGJlIGVtaXR0ZWQgaWYgbm8KKyAqIG1ldGFkYXRhIGZvciBhIGZpZWxkL21ldGhvZCBoYXMgYmVlbiBmb3VuZCBhbmQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKKyAqIHVzZWQgaW5zdGVhZC4gSWYgdGhpcyB2ZXJzaW9uIGlzIG5vdCBkZWZpbmVkLCB0aGUgdGVtcGxhdGVzIGp1c3Qgc2lsZW50bHkKKyAqIGJlaGF2ZSBsaWtlIHRoZSBUaHJpZnQgY29tcGlsZXIgZG9lcyBpbiB0aGlzIHNpdHVhdGlvbiwgaS5lLiBhdXRvbWF0aWNhbGx5CisgKiBhc3NpZ24gbmVnYXRpdmUgaWRzIChzdGFydGluZyBhdCAtMSkgZm9yIGZpZWxkcyBhbmQgYXNzdW1lIFRSZXEuQVVUTyBhcworICogcmVxdWlyZW1lbnQgbGV2ZWwuCisgKi8KKy8vIEltcGxlbWVudGF0aW9uIG5vdGU6IEFsbCB0aGUgdGVtcGxhdGVzIGluIGhlcmUgdGFraW5nIGEgZmllbGQgbWV0YWRhdGEKKy8vIHBhcmFtZXRlciBzaG91bGQgaWRlYWxseSBoYXZlIGEgY29uc3RyYWludCB0aGF0IHJlc3RyaWN0cyB0aGUgYWxpYXMgdG8KKy8vIFRGaWVsZE1ldGFbXS10eXBlZCB2YWx1ZXMsIGJ1dCB0aGUgaXMoKSBleHByZXNzaW9ucyBzZWVtcyB0byBhbHdheXMgZmFpbC4KK21vZHVsZSB0aHJpZnQuY29kZWdlbi5iYXNlOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGZpbmQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnRyYWl0cyA6IEJhc2VUeXBlVHVwbGUsIGlzUG9pbnRlciwgaXNTb21lRnVuY3Rpb24sIFBvaW50ZXJUYXJnZXQsCisgIFJldHVyblR5cGU7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKKworLyoKKyAqIFRocmlmdCBzdHJ1Y3Qvc2VydmljZSBtZXRhIGRhdGEsIHdoaWNoIGlzIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gZnJvbQorICogdGhlIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIG5vdCByZXByZXNlbnRhYmxlIGluIHBsYWluIEQsIGkuZS4gZmllbGQKKyAqIHJlcXVpcmVtZW50IGxldmVscywgVGhyaWZ0IGZpZWxkIElEcywgZXRjLgorICovCisKKy8qKgorICogU3RydWN0IGZpZWxkIHJlcXVpcmVtZW50IGxldmVscy4KKyAqLworZW51bSBUUmVxIHsKKyAgLy8vIERldGVjdCB0aGUgcmVxdWlyZWRuZXNzIGZyb20gdGhlIGZpZWxkIHR5cGU6IGlmIGl0IGlzIG51bGxhYmxlLCB0cmVhdAorICAvLy8gdGhlIGZpZWxkIGFzIG9wdGlvbmFsLCBpZiBpdCBpcyBub24tbnVsbGFibGUsIHRyZWF0IHRoZSBmaWVsZCBhcworICAvLy8gcmVxdWlyZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdXNlZCBmb3IgaGFuZGxpbmcgc3RydWN0cyBub3QgZ2VuZXJhdGVkCisgIC8vLyBmcm9tIGFuIElETCBmaWxlLCBhbmQgbmV2ZXIgZW1pdHRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyLiBUUmVxLkFVVE8KKyAgLy8vIHNob3VsZG4ndCBiZSBzcGVjaWZpZWQgZXhwbGljaXRseS4KKyAgLy8gSW1wbGVtZW50YXRpb24gbm90ZTogdGhyaWZ0LmNvZGVnZW4gdGVtcGxhdGVzIHVzZQorICAvLyB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbi5tZW1iZXJSZXEgdG8gcmVzb2x2ZSBBVVRPIHRvIFJFUVVJUkVEL09QVElPTkFMCisgIC8vIGluc3RlYWQgb2YgaGFuZGxpbmcgaXQgZGlyZWN0bHkuCisgIEFVVE8sCisKKyAgLy8vIFRoZSBmaWVsZCBpcyB0cmVhdGVkIGFzIG9wdGlvbmFsIHdoZW4gZGVzZXJpYWxpemluZy9yZWNlaXZpbmcgdGhlIHN0cnVjdAorICAvLy8gYW5kIGFzIHJlcXVpcmVkIHdoZW4gc2VyaWFsaXppbmcvc2VuZGluZy4gVGhpcyBpcyB0aGUgVGhyaWZ0IGRlZmF1bHQgaWYKKyAgLy8vIG5laXRoZXIgInJlcXVpcmVkIiBub3IgIm9wdGlvbmFsIiBhcmUgc3BlY2lmaWVkIGluIHRoZSBJREwgZmlsZS4KKyAgT1BUX0lOX1JFUV9PVVQsCisKKyAgLy8vIFRoZSBmaWVsZCBpcyBvcHRpb25hbC4KKyAgT1BUSU9OQUwsCisKKyAgLy8vIFRoZSBmaWVsZCBpcyByZXF1aXJlZC4KKyAgUkVRVUlSRUQsCisKKyAgLy8vIElnbm9yZSB0aGUgc3RydWN0IGZpZWxkIHdoZW4gc2VyaWFsaXppbmcvZGVzZXJpYWxpemluZy4KKyAgSUdOT1JFCit9CisKKy8qKgorICogVGhlIHdheSBob3cgbWV0aG9kcyBhcmUgY2FsbGVkLgorICovCitlbnVtIFRNZXRob2RUeXBlIHsKKyAgLy8vIENhbGxlZCBpbiB0aGUgbm9ybWFsIHR3by13YXkgc2NoZW1lIGNvbnNpc3Rpbmcgb2YgYSByZXF1ZXN0IGFuZCBhCisgIC8vLyByZXNwb25zZS4KKyAgUkVHVUxBUiwKKworICAvLy8gQSBmaXJlLWFuZC1mb3JnZXQgb25lLXdheSBtZXRob2QsIHdoZXJlIG5vIHJlc3BvbnNlIGlzIHNlbnQgYW5kIHRoZQorICAvLy8gY2xpZW50IGltbWVkaWF0ZWx5IHJldHVybnMuCisgIE9ORVdBWQorfQorCisvKioKKyAqIENvbXBpbGUtdGltZSBtZXRhZGF0YSBmb3IgYSBzdHJ1Y3QgZmllbGQuCisgKi8KK3N0cnVjdCBURmllbGRNZXRhIHsKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4gVXNlZCBmb3IgbWF0Y2hpbmcgYSBURmllbGRNZXRhIHdpdGggdGhlIGFjdHVhbAorICAvLy8gRCBzdHJ1Y3QgbWVtYmVyIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCisgIHN0cmluZyBuYW1lOworCisgIC8vLyBUaGUgKFRocmlmdCkgaWQgb2YgdGhlIGZpZWxkLgorICBzaG9ydCBpZDsKKworICAvLy8gV2hldGhlciB0aGUgZmllbGQgaXMgcmVxdXJpZWQuCisgIFRSZXEgcmVxOworCisgIC8vLyBBIGNvZGUgc3RyaW5nIGNvbnRhaW5pbmcgYSBEIGV4cHJlc3Npb24gZm9yIHRoZSBkZWZhdWx0IHZhbHVlLCBpZiB0aGVyZQorICAvLy8gaXMgb25lLgorICBzdHJpbmcgZGVmYXVsdFZhbHVlOworfQorCisvKioKKyAqIENvbXBpbGUtdGltZSBtZXRhZGF0YSBmb3IgYSBzZXJ2aWNlIG1ldGhvZC4KKyAqLworc3RydWN0IFRNZXRob2RNZXRhIHsKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuIFVzZWQgZm9yIG1hdGNoaW5nIGEgVE1ldGhvZE1ldGEgd2l0aCB0aGUgYWN0dWFsCisgIC8vLyBtZXRob2QgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KKyAgc3RyaW5nIG5hbWU7CisKKyAgLy8vIE1ldGEgaW5mb3JtYXRpb24gZm9yIHRoZSBwYXJhbWV0ZXJlcy4KKyAgVFBhcmFtTWV0YVtdIHBhcmFtczsKKworICAvLy8gU3BlY2lmaWVzIHdoaWNoIGV4Y2VwdGlvbnMgY2FuIGJlIHRocm93biBieSB0aGUgbWV0aG9kLiBBbGwgb3RoZXIKKyAgLy8vIGV4Y2VwdGlvbnMgYXJlIGNvbnZlcnRlZCB0byBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0ZWFkLgorICBURXhjZXB0aW9uTWV0YVtdIGV4Y2VwdGlvbnM7CisKKyAgLy8vIFRoZSBmdW5kYW1lbnRhbCB0eXBlIG9mIHRoZSBtZXRob2QuCisgIFRNZXRob2RUeXBlIHR5cGU7Cit9CisKKy8qKgorICogQ29tcGlsZS10aW1lIG1ldGFkYXRhIGZvciBhIHNlcnZpY2UgbWV0aG9kIHBhcmFtZXRlci4KKyAqLworc3RydWN0IFRQYXJhbU1ldGEgeworICAvLy8gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4gQ29udHJhcnkgdG8gVEZpZWxkTWV0YSwgaXQgb25seSBzZXJ2ZXMKKyAgLy8vIGRlY29yYXRpdmUgcHVycG9zZXMgaGVyZS4KKyAgc3RyaW5nIG5hbWU7CisKKyAgLy8vIFRoZSBUaHJpZnQgaWQgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgcGFyYW0gc3RydWN0LgorICBzaG9ydCBpZDsKKworICAvLy8gQSBjb2RlIHN0cmluZyBjb250YWluaW5nIGEgRCBleHByZXNzaW9uIGZvciB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisgIC8vLyBwYXJhbWV0ZXIsIGlmIGFueS4KKyAgc3RyaW5nIGRlZmF1bHRWYWx1ZTsKK30KKworLyoqCisgKiBDb21waWxlLXRpbWUgbWV0YWRhdGEgZm9yIGEgc2VydmljZSBtZXRob2QgZXhjZXB0aW9uIGFubm90YXRpb24uCisgKi8KK3N0cnVjdCBURXhjZXB0aW9uTWV0YSB7CisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZXhjZXB0aW9uIMK7cmV0dXJuIHZhbHVlwqsuIENvbnRyYXJ5IHRvIFRGaWVsZE1ldGEsIGl0CisgIC8vLyBvbmx5IHNlcnZlcyBkZWNvcmF0aXZlIHB1cnBvc2VzIGhlcmUsIGFzIGl0IGlzIG9ubHkgdXNlZCBpbiBjb2RlIG5vdAorICAvLy8gdmlzaWJsZSB0byBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb25zL3NlcnZpY2UgY2xpZW50cy4KKyAgc3RyaW5nIG5hbWU7CisKKyAgLy8vIFRoZSBUaHJpZnQgaWQgb2YgdGhlIGV4Y2VwdGlvbiBmaWVsZCBpbiB0aGUgcmV0dXJuIHZhbHVlIHN0cnVjdC4KKyAgc2hvcnQgaWQ7CisKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBleGNlcHRpb24gdHlwZS4KKyAgc3RyaW5nIHR5cGU7Cit9CisKKy8qKgorICogQSBwYWlyIG9mIHR3byBUUG9yb3RvY29scy4gVG8gYmUgdXNlZCBpbiBwbGFjZXMgd2hlcmUgYSBsaXN0IG9mIHByb3RvY29scworICogaXMgZXhwZWN0ZWQsIGZvciBzcGVjaWZ5aW5nIGRpZmZlcmVudCBwcm90b2NvbHMgZm9yIGlucHV0IGFuZCBvdXRwdXQuCisgKi8KK3N0cnVjdCBUUHJvdG9jb2xQYWlyKElucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sKSBpZiAoCisgIGlzVFByb3RvY29sIUlucHV0UHJvdG9jb2wgJiYgaXNUUHJvdG9jb2whT3V0cHV0UHJvdG9jb2wKKykge30KKworLyoqCisgKiB0cnVlIGlmIFQgaXMgYSBUUHJvdG9jb2xQYWlyLgorICovCit0ZW1wbGF0ZSBpc1RQcm90b2NvbFBhaXIoVCkgeworICBzdGF0aWMgaWYgKGlzKFQgXyA9PSBUUHJvdG9jb2xQYWlyIShJLCBPKSwgSSwgTykpIHsKKyAgICBlbnVtIGlzVFByb3RvY29sUGFpciA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgZW51bSBpc1RQcm90b2NvbFBhaXIgPSBmYWxzZTsKKyAgfQorfQorCit1bml0dGVzdCB7CisgIHN0YXRpYyBhc3NlcnQoaXNUUHJvdG9jb2xQYWlyIShUUHJvdG9jb2xQYWlyIShUUHJvdG9jb2wsIFRQcm90b2NvbCkpKTsKKyAgc3RhdGljIGFzc2VydCghaXNUUHJvdG9jb2xQYWlyIVRQcm90b2NvbCk7Cit9CisKKy8qKgorICogdHJ1ZSBpZiBUIGlzIGEgVFByb3RvY29sIG9yIGEgVFByb3RvY29sUGFpci4KKyAqLwordGVtcGxhdGUgaXNUUHJvdG9jb2xPclBhaXIoVCkgeworICBlbnVtIGlzVFByb3RvY29sT3JQYWlyID0gaXNUUHJvdG9jb2whVCB8fCBpc1RQcm90b2NvbFBhaXIhVDsKK30KKwordW5pdHRlc3QgeworICBzdGF0aWMgYXNzZXJ0KGlzVFByb3RvY29sT3JQYWlyIVRQcm90b2NvbCk7CisgIHN0YXRpYyBhc3NlcnQoaXNUUHJvdG9jb2xPclBhaXIhKFRQcm90b2NvbFBhaXIhKFRQcm90b2NvbCwgVFByb3RvY29sKSkpOworICBzdGF0aWMgYXNzZXJ0KCFpc1RQcm90b2NvbE9yUGFpciF2b2lkKTsKK30KKworLyoqCisgKiB0cnVlIGlmIFQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlLgorICovCit0ZW1wbGF0ZSBpc1NlcnZpY2UoVCkgeworICBlbnVtIGlzU2VydmljZSA9IGlzQmFzZVNlcnZpY2UhVCB8fCBpc0Rlcml2ZWRTZXJ2aWNlIVQ7Cit9CisKKy8qKgorICogdHJ1ZSBpZiBUIHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBub3QgZGVyaXZlZCBmcm9tIGFub3RoZXIgc2VydmljZS4KKyAqLwordGVtcGxhdGUgaXNCYXNlU2VydmljZShUKSB7CisgIHN0YXRpYyBpZihpcyhUIF8gPT0gaW50ZXJmYWNlKSAmJgorICAgICghaXMoVCBUQmFzZXMgPT0gc3VwZXIpIHx8IFRCYXNlcy5sZW5ndGggPT0gMCkKKyAgKSB7CisgICAgZW51bSBpc0Jhc2VTZXJ2aWNlID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIGlzQmFzZVNlcnZpY2UgPSBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIHRydWUgaWYgVCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgZGVyaXZlZCBmcm9tIGFub3RoZXIgc2VydmljZS4KKyAqLwordGVtcGxhdGUgaXNEZXJpdmVkU2VydmljZShUKSB7CisgIHN0YXRpYyBpZihpcyhUIF8gPT0gaW50ZXJmYWNlKSAmJgorICAgIGlzKFQgVEJhc2VzID09IHN1cGVyKSAmJiBUQmFzZXMubGVuZ3RoID09IDEKKyAgKSB7CisgICAgZW51bSBpc0Rlcml2ZWRTZXJ2aWNlID0gaXNTZXJ2aWNlIShUQmFzZXNbMF0pOworICB9IGVsc2UgeworICAgIGVudW0gaXNEZXJpdmVkU2VydmljZSA9IGZhbHNlOworICB9Cit9CisKKy8qKgorICogRm9yIGRlcml2ZWQgc2VydmljZXMsIGdldHMgdGhlIGJhc2Ugc2VydmljZSBpbnRlcmZhY2UuCisgKi8KK3RlbXBsYXRlIEJhc2VTZXJ2aWNlKFQpIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIVQpIHsKKyAgYWxpYXMgQmFzZVR5cGVUdXBsZSFUWzBdIEJhc2VTZXJ2aWNlOworfQorCisKKy8qCisgKiBDb2RlIGdlbmVyYXRpb24gdGVtcGxhdGVzLgorICovCisKKy8qKgorICogTWl4aW4gdGVtcGxhdGUgZGVmaW5pbmcgYWRkaXRpb25hbCBoZWxwZXIgbWV0aG9kcyBmb3IgdXNpbmcgYSBzdHJ1Y3Qgd2l0aAorICogVGhyaWZ0LCBhbmQgYSBtZW1iZXIgY2FsbGVkIGlzU2V0RmxhZ3MgaWYgdGhlIHN0cnVjdCBjb250YWlucyBhbnkgZmllbGRzCisgKiBmb3Igd2hpY2ggYW4gwrtpcyBzZXTCqyBmbGFnIGlzIG5lZWRlZC4KKyAqCisgKiBJdCBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBzdHJ1Y3RzIG9yIEV4Y2VwdGlvbiBjbGFzc2VzLgorICoKKyAqIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHN0cnVjdCBkZWZpbml0aW9uOgorICogLS0tCisgKiBzdHJ1Y3QgRm9vIHsKKyAqICAgc3RyaW5nIGE7CisgKiAgIGludCBiOworICogICBpbnQgYzsKKyAqCisgKiAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgKiAgICAgVEZpZWxkTWV0YSgiYSIsIDEpLCAvLyBJbXBsaWNpdGx5IG9wdGlvbmFsIChudWxsYWJsZSkuCisgKiAgICAgVEZpZWxkTWV0YSgiYiIsIDIpLCAvLyBJbXBsaWNpdGx5IHJlcXVpcmVkIChub24tbnVsbGFibGUpLgorICogICAgIFRGaWVsZE1ldGEoImMiLCAzLCBUUmVxLlJFUVVJUkVELCAiNCIpCisgKiAgIF0pOworICogfQorICogLS0tCisgKgorICogVFN0cnVjdEhlbHBlciBhZGRzIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0byB0aGUgc3RydWN0OgorICogLS0tCisgKiAvKysKKyAqICArIFNldHMgbWVtYmVyIGZpZWxkTmFtZSB0byB0aGUgZ2l2ZW4gdmFsdWUgYW5kIG1hcmtzIGl0IGFzIHNldC4KKyAqICArCisgKiAgKyBFeGFtcGxlczoKKyAqICArIC0tLQorICogICsgYXV0byBmID0gRm9vKCk7CisgKiAgKyBmLnNldCEiYiIoMTIzNDUpOworICogICsgYXNzZXJ0KGYuaXNTZXQhImIiKTsKKyAqICArIC0tLQorICogICsvCisgKiB2b2lkIHNldChzdHJpbmcgZmllbGROYW1lKShNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpIHZhbHVlKTsKKyAqCisgKiAvKysKKyAqICArIFJlc2V0cyBtZW1iZXIgZmllbGROYW1lIHRvIHRoZSBpbml0IHByb3BlcnR5IG9mIGl0cyB0eXBlIGFuZCBtYXJrcyBpdCBhcworICogICsgbm90IHNldC4KKyAqICArCisgKiAgKyBFeGFtcGxlczoKKyAqICArIC0tLQorICogICsgLy8gU2V0IGYuYiB0byBzb21lIHZhbHVlLgorICogICsgYXV0byBmID0gRm9vKCk7CisgKiAgKyBmLnNldCEiYiIoMTIzNDUpOworICogICsKKyAqICArIGYudW5zZXQhYigpOworICogICsKKyAqICArIC8vIGYuYiBpcyBub3cgdW5zZXQgYWdhaW4uCisgKiAgKyBhc3NlcnQoIWYuaXNTZXQhImIiKTsKKyAqICArIC0tLQorICogICsvCisgKiB2b2lkIHVuc2V0KHN0cmluZyBmaWVsZE5hbWUpKCk7CisgKgorICogLysrCisgKiAgKyBSZXR1cm5zIHdoZXRoZXIgbWVtYmVyIGZpZWxkTmFtZSBpcyBzZXQuCisgKiAgKworICogICsgRXhhbXBsZXM6CisgKiAgKyAtLS0KKyAqICArIGF1dG8gZiA9IEZvbygpOworICogICsgYXNzZXJ0KCFmLmlzU2V0ISJiIik7CisgKiAgKyBmLnNldCEiYiIoMTIzNDUpOworICogICsgYXNzZXJ0KGYuaXNTZXQhImIiKTsKKyAqICArIC0tLQorICogICsvCisgKiBib29sIGlzU2V0KHN0cmluZyBmaWVsZE5hbWUpKCkgY29uc3QgQHByb3BlcnR5OworICoKKyAqIC8rKworICogICsgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RydWN0LgorICogICsKKyAqICArIEV4YW1wbGVzOgorICogICsgLS0tCisgKiAgKyBhdXRvIGYgPSBGb28oKTsKKyAqICArIGYuYSA9ICJhIHN0cmluZyI7CisgKiAgKyBhc3NlcnQoZi50b1N0cmluZygpID09IGBGb28oImEgc3RyaW5nIiwgMCAodW5zZXQpLCA0KWApOworICogICsgLS0tCisgKiAgKy8KKyAqIHN0cmluZyB0b1N0cmluZygpIGNvbnN0OworICoKKyAqIC8rKworICogICsgRGVzZXJpYWxpemVzIHRoZSBzdHJ1Y3QsIHNldHRpbmcgaXRzIG1lbWJlcnMgdG8gdGhlIHZhbHVlcyByZWFkIGZyb20gdGhlCisgKiAgKyBwcm90b2NvbC4gRm9yd2FyZHMgdG8gcmVhZFN0cnVjdCh0aGlzLCBwcm90byk7CisgKiAgKy8KKyAqIHZvaWQgcmVhZChQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCk7CisgKgorICogLysrCisgKiAgKyBTZXJpYWxpemVzIHRoZSBzdHJ1Y3QgdG8gdGhlIHRhcmdldCBwcm90b2NvbC4gRm9yd2FyZHMgdG8KKyAqICArIHdyaXRlU3RydWN0KHRoaXMsIHByb3RvKTsKKyAqICArLworICogdm9pZCB3cml0ZShQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGNvbnN0IGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCk7CisgKiAtLS0KKyAqCisgKiBBZGRpdGlvbmFsbHksIGFuIG9wRXF1YWxzKCkgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQgd2hpY2ggc2ltcGx5CisgKiBjb21wYXJlcyBhbGwgZmllbGRzLCBidXQgZGlzcmVnYXJkcyB0aGUgaXMgc2V0IHN0cnVjdCwgaWYgYW55ICh0aGUgZXhhY3QKKyAqIHNpZ25hdHVyZSBvYnZpb3VzbHkgZGlmZmVycyBiZXR3ZWVuIHN0cnVjdHMgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzKS4gVGhlCisgKiBtZXRhZGF0YSBpcyBzdG9yZWQgaW4gYSBtYW5pZmVzdCBjb25zdGFudCBjYWxsZWQgZmllbGRNZXRhLgorICoKKyAqIE5vdGU6IFRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGZpZWxkcyB3aGVyZSBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkIGluCisgKiB0aGUgZmllbGQgbWV0YWRhdGEsIGEgcGFyYW1ldGVybGVzcyBzdGF0aWMgb3BDYWxsIGlzIGdlbmVyYXRlZCwgYmVjYXVzZSBECisgKiBkb2VzIG5vdCBhbGxvdyBwYXJhbWV0ZXJsZXNzIChkZWZhdWx0KSBjb25zdHJ1Y3RvcnMgZm9yIHN0cnVjdHMuIFRodXMsIGJlCisgKiBhbHdheXMgdG8gdXNlIHRvIGluaXRpYWxpemUgc3RydWN0czoKKyAqIC0tLQorICogRm9vIGZvbzsgLy8gV3JvbmchCisgKiBhdXRvIGZvbyA9IEZvbygpOyAvLyBDb3JyZWN0LgorICogLS0tCisgKi8KK21peGluIHRlbXBsYXRlIFRTdHJ1Y3RIZWxwZXJzKGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsKSBpZiAoCisgIGlzKHR5cGVvZihmaWVsZE1ldGFEYXRhKSA6IFRGaWVsZE1ldGFbXSkKKykgeworICBpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGFueTsKKyAgaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbiA6IGlzTnVsbGFibGUsIE1lbWJlclR5cGUsIG1lcmdlRmllbGRNZXRhLAorICAgIEZpZWxkTmFtZXM7CisgIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZSA6IFRQcm90b2NvbCwgaXNUUHJvdG9jb2w7CisKKyAgYWxpYXMgdHlwZW9mKHRoaXMpIFRoaXM7CisgIHN0YXRpYyBhc3NlcnQoaXMoVGhpcyA9PSBzdHJ1Y3QpIHx8IGlzKFRoaXMgOiBFeGNlcHRpb24pLAorICAgICJUU3RydWN0SGVscGVycyBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBhIHN0cnVjdCBvciBhbiBFeGNlcHRpb24gY2xhc3MuIik7CisKKyAgc3RhdGljIGlmIChUSXNTZXRGbGFncyEoVGhpcywgZmllbGRNZXRhRGF0YSkudHVwbGVvZi5sZW5ndGggPiAwKSB7CisgICAgLy8gSWYgd2UgbmVlZCB0byBrZWVwIGlzU2V0IGZsYWdzIGFyb3VuZCwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZQorICAgIC8vIGNvbnRhaW5lciBzdHJ1Y3QuCisgICAgVElzU2V0RmxhZ3MhKFRoaXMsIGZpZWxkTWV0YURhdGEpIGlzU2V0RmxhZ3M7CisgICAgZW51bSBmaWVsZE1ldGEgPSBmaWVsZE1ldGFEYXRhIH4gW1RGaWVsZE1ldGEoImlzU2V0RmxhZ3MiLCAwLCBUUmVxLklHTk9SRSldOworICB9IGVsc2UgeworICAgIGVudW0gZmllbGRNZXRhID0gZmllbGRNZXRhRGF0YTsKKyAgfQorCisgIHZvaWQgc2V0KHN0cmluZyBmaWVsZE5hbWUpKE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkgdmFsdWUpIGlmICgKKyAgICBpcyhNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpKQorICApIHsKKyAgICBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMsIGZpZWxkTmFtZSkgPSB2YWx1ZTsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihtaXhpbigidGhpcy5pc1NldEZsYWdzLiIgfiBmaWVsZE5hbWUpKSA6IGJvb2wpKSB7CisgICAgICBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMuaXNTZXRGbGFncywgZmllbGROYW1lKSA9IHRydWU7CisgICAgfQorICB9CisKKyAgdm9pZCB1bnNldChzdHJpbmcgZmllbGROYW1lKSgpIGlmIChpcyhNZW1iZXJUeXBlIShUaGlzLCBmaWVsZE5hbWUpKSkgeworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKG1peGluKCJ0aGlzLmlzU2V0RmxhZ3MuIiB+IGZpZWxkTmFtZSkpIDogYm9vbCkpIHsKKyAgICAgIF9fdHJhaXRzKGdldE1lbWJlciwgdGhpcy5pc1NldEZsYWdzLCBmaWVsZE5hbWUpID0gZmFsc2U7CisgICAgfQorICAgIF9fdHJhaXRzKGdldE1lbWJlciwgdGhpcywgZmllbGROYW1lKSA9IE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkuaW5pdDsKKyAgfQorCisgIGJvb2wgaXNTZXQoc3RyaW5nIGZpZWxkTmFtZSkoKSBjb25zdCBAcHJvcGVydHkgaWYgKAorICAgIGlzKE1lbWJlclR5cGUhKFRoaXMsIGZpZWxkTmFtZSkpCisgICkgeworICAgIHN0YXRpYyBpZiAoaXNOdWxsYWJsZSEoTWVtYmVyVHlwZSEoVGhpcywgZmllbGROYW1lKSkpIHsKKyAgICAgIHJldHVybiBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMsIGZpZWxkTmFtZSkgIWlzIG51bGw7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXModHlwZW9mKG1peGluKCJ0aGlzLmlzU2V0RmxhZ3MuIiB+IGZpZWxkTmFtZSkpIDogYm9vbCkpIHsKKyAgICAgIHJldHVybiBfX3RyYWl0cyhnZXRNZW1iZXIsIHRoaXMuaXNTZXRGbGFncywgZmllbGROYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhpcyBpcyBhIHJlcXVpcmVkIGZpZWxkLCB3aGljaCBpcyBhbHdheXMgc2V0LgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgc3RhdGljIGlmIChpcyhUaGlzIF8gPT0gY2xhc3MpKSB7CisgICAgb3ZlcnJpZGUgc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgcmV0dXJuIHRocmlmdFRvU3RyaW5nSW1wbCgpOworICAgIH0KKworICAgIG92ZXJyaWRlIGJvb2wgb3BFcXVhbHMoT2JqZWN0IG90aGVyKSBjb25zdCB7CisgICAgICBhdXRvIHJocyA9IGNhc3QoVGhpcylvdGhlcjsKKyAgICAgIGlmIChyaHMpIHsKKyAgICAgICAgcmV0dXJuIHRocmlmdE9wRXF1YWxzSW1wbChyaHMpOworICAgICAgfQorCisgICAgICByZXR1cm4gKGNhc3QoKXN1cGVyKS5vcEVxdWFscyhvdGhlcik7CisgICAgfQorCisgICAgb3ZlcnJpZGUgc2l6ZV90IHRvSGFzaCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0aHJpZnRUb0hhc2hJbXBsKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0aHJpZnRUb1N0cmluZ0ltcGwoKTsKKyAgICB9CisKKyAgICBib29sIG9wRXF1YWxzKHJlZiBjb25zdCBUaGlzIG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gdGhyaWZ0T3BFcXVhbHNJbXBsKG90aGVyKTsKKyAgICB9CisKKyAgICBzaXplX3QgdG9IYXNoKCkgY29uc3QgQHNhZmUgbm90aHJvdyB7CisgICAgICByZXR1cm4gdGhyaWZ0VG9IYXNoSW1wbCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIHRocmlmdFRvU3RyaW5nSW1wbCgpIGNvbnN0IHsKKyAgICBpbXBvcnQgc3RkLmNvbnYgOiB0bzsKKyAgICBzdHJpbmcgcmVzdWx0ID0gVGhpcy5zdHJpbmdvZiB+ICIoIjsKKyAgICBtaXhpbih7CisgICAgICBzdHJpbmcgY29kZSA9ICIiOworICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICBmb3JlYWNoIChuYW1lOyBGaWVsZE5hbWVzIShUaGlzLCBmaWVsZE1ldGEpKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29kZSB+PSAicmVzdWx0IH49IGAsIGA7XG4iOworICAgICAgICB9CisgICAgICAgIGNvZGUgfj0gInJlc3VsdCB+PSBgIiB+IG5hbWUgfiAiOiBgIH4gdG8hc3RyaW5nKGNhc3QoKXRoaXMuIiB+IG5hbWUgfiAiKTtcbiI7CisgICAgICAgIGNvZGUgfj0gImlmICghaXNTZXQhcXsiIH4gbmFtZSB+ICJ9KSB7XG4iOworICAgICAgICBjb2RlIH49ICJyZXN1bHQgfj0gYCAodW5zZXQpYDtcbiI7CisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICB9CisgICAgICByZXR1cm4gY29kZTsKKyAgICB9KCkpOworICAgIHJlc3VsdCB+PSAiKSI7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgYm9vbCB0aHJpZnRPcEVxdWFsc0ltcGwoY29uc3QgcmVmIFRoaXMgcmhzKSBjb25zdCB7CisgICAgZm9yZWFjaCAobmFtZTsgRmllbGROYW1lcyFUaGlzKSB7CisgICAgICBpZiAobWl4aW4oInRoaXMuIiB+IG5hbWUpICE9IG1peGluKCJyaHMuIiB+IG5hbWUpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHJpdmF0ZSBzaXplX3QgdGhyaWZ0VG9IYXNoSW1wbCgpIGNvbnN0IEB0cnVzdGVkIG5vdGhyb3cgeworICAgIHNpemVfdCBoYXNoID0gMDsKKyAgICBmb3JlYWNoIChpLCBfOyB0aGlzLnR1cGxlb2YpIHsKKyAgICAgIGF1dG8gdmFsID0gdGhpcy50dXBsZW9mW2ldOworICAgICAgaGFzaCArPSB0eXBlaWQodmFsKS5nZXRIYXNoKCZ2YWwpOworICAgIH0KKyAgICByZXR1cm4gaGFzaDsKKyAgfQorCisgIHN0YXRpYyBpZiAoYW55IWAhYS5kZWZhdWx0VmFsdWUuZW1wdHlgKG1lcmdlRmllbGRNZXRhIShUaGlzLCBmaWVsZE1ldGFEYXRhKSkpIHsKKyAgICBzdGF0aWMgaWYgKGlzKFRoaXMgXyA9PSBjbGFzcykpIHsKKyAgICAgIHRoaXMoKSB7CisgICAgICAgIG1peGluKHRocmlmdEZpZWxkSW5pdENvZGUhKG1lcmdlRmllbGRNZXRhIShUaGlzLCBmaWVsZE1ldGFEYXRhKSkoInRoaXMiKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERNRCBAQEJVR0BAOiBIYXZlIHRvIHVzZSBhdXRvIGhlcmUgdG8gYXZvaWQgwrtubyBzaXplIHlldCBmb3IgZm9yd2FyZAorICAgICAgLy8gcmVmZXJlbmNlwqsgZXJyb3JzLgorICAgICAgc3RhdGljIGF1dG8gb3BDYWxsKCkgeworICAgICAgICBhdXRvIHJlc3VsdCA9IFRoaXMuaW5pdDsKKyAgICAgICAgbWl4aW4odGhyaWZ0RmllbGRJbml0Q29kZSEobWVyZ2VGaWVsZE1ldGEhKFRoaXMsIGZpZWxkTWV0YURhdGEpKSgicmVzdWx0IikpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZChQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkgeworICAgIC8vIE5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IGZpZWxkTWV0YURhdGEgaGVyZSwgc2luY2UgaXQgaXNuJ3QgYWxyZWFkeQorICAgIC8vIHBpY2tlZCB1cCBpbiBzb21lIHNpdHVhdGlvbnMgKGUuZy4gdGhlIFRBcmdzIHN0cnVjdCBmb3IgbWV0aG9kcyB3aXRoCisgICAgLy8gbXVsdGlwbGUgcGFyYW1ldGVycyBpbiBhc3luY190ZXN0X3NlcnZlcnMpIG90aGVyd2lzZS4gRHVlIHRvIGEgRE1ECisgICAgLy8gQEBCVUdAQCwgd2UgbmVlZCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIG90aGVyIHRlbXBsYXRlIHBhcmFtZXRlcnMKKyAgICAvLyBhcyB3ZWxsLgorICAgIHJlYWRTdHJ1Y3QhKFRoaXMsIFByb3RvY29sLCBmaWVsZE1ldGFEYXRhLCBmYWxzZSkodGhpcywgcHJvdG8pOworICB9CisKKyAgdm9pZCB3cml0ZShQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGNvbnN0IGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkgeworICAgIHdyaXRlU3RydWN0IShUaGlzLCBQcm90b2NvbCwgZmllbGRNZXRhRGF0YSwgZmFsc2UpKHRoaXMsIHByb3RvKTsKKyAgfQorfQorCisvLyBETUQgQEBCVUdAQDogSGF2aW5nIHRoaXMgaW5zaWRlIFRTdHJ1Y3RIZWxwZXJzIGxlYWRzIHRvIHdlaXJkIGxvb2t1cCBlcnJvcnMKKy8vIChlLmcuIGZvciBzdGQuYXJyeS5lbXB0eSkuCitzdHJpbmcgdGhyaWZ0RmllbGRJbml0Q29kZShhbGlhcyBmaWVsZE1ldGEpKHN0cmluZyB0aGlzTmFtZSkgeworICBzdHJpbmcgY29kZSA9ICIiOworICBmb3JlYWNoIChmaWVsZDsgZmllbGRNZXRhKSB7CisgICAgaWYgKGZpZWxkLmRlZmF1bHRWYWx1ZS5lbXB0eSkgY29udGludWU7CisgICAgY29kZSB+PSB0aGlzTmFtZSB+ICIuIiB+IGZpZWxkLm5hbWUgfiAiID0gIiB+IGZpZWxkLmRlZmF1bHRWYWx1ZSB+ICI7XG4iOworICB9CisgIHJldHVybiBjb2RlOworfQorCit1bml0dGVzdCB7CisgIC8vIENhbm5vdCBtYWtlIHRoaXMgbmVzdGVkIGluIHRoZSB1bml0dGVzdCBibG9jayBkdWUgdG8gYSDCu25vIHNpemUgeWV0IGZvcgorICAvLyBmb3J3YXJkIHJlZmVyZW5jZcKrIGVycm9yLgorICBzdGF0aWMgc3RydWN0IEZvbyB7CisgICAgc3RyaW5nIGE7CisgICAgaW50IGI7CisgICAgaW50IGM7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YSgiYSIsIDEpLAorICAgICAgVEZpZWxkTWV0YSgiYiIsIDIsIFRSZXEuT1BUX0lOX1JFUV9PVVQpLAorICAgICAgVEZpZWxkTWV0YSgiYyIsIDMsIFRSZXEuUkVRVUlSRUQsICI0IikKKyAgICBdKTsKKyAgfQorCisgIGF1dG8gZiA9IEZvbygpOworCisgIGYuc2V0ISJiIigxMjM0NSk7CisgIGFzc2VydChmLmlzU2V0ISJiIik7CisgIGYudW5zZXQhImIiKCk7CisgIGFzc2VydCghZi5pc1NldCEiYiIpOworICBmLnNldCEiYiIoMTIzNDUpOworICBhc3NlcnQoZi5pc1NldCEiYiIpOworICBmLnVuc2V0ISJiIigpOworCisgIGYuYSA9ICJhIHN0cmluZyI7CisgIGFzc2VydChmLnRvU3RyaW5nKCkgPT0gYEZvbyhhOiBhIHN0cmluZywgYjogMCAodW5zZXQpLCBjOiA0KWApOworfQorCisKKy8qKgorICogR2VuZXJhdGVzIGFuIGVwb255bW91cyBzdHJ1Y3Qgd2l0aCBib29sZWFuIGZsYWdzIGZvciB0aGUgbm9uLXJlcXVpcmVkCisgKiBub24tbnVsbGFibGUgZmllbGRzIG9mIFQuCisgKgorICogTnVsbGFibGUgZmllbGRzIGFyZSBqdXN0IHNldCB0byBudWxsIHRvIHNpZ25hbCDCu25vdCBzZXTCqywgc28gbm8gZmxhZyBpcworICogZW1pdHRlZCBmb3IgdGhlbSwgZXZlbiBpZiB0aGV5IGFyZSBvcHRpb25hbC4KKyAqCisgKiBJbiBtb3N0IGNhc2VzLCB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoaXMgZGlyZWN0bHksIGJ1dCB2aWEgVFN0cnVjdEhlbHBlcnMKKyAqIGluc3RlYWQuCisgKi8KK3RlbXBsYXRlIFRJc1NldEZsYWdzKFQsIGFsaWFzIGZpZWxkTWV0YURhdGEpIHsKKyAgbWl4aW4oeworICAgIHN0cmluZyBjb2RlID0gInN0cnVjdCBUSXNTZXRGbGFncyB7XG4iOworICAgIGZvcmVhY2ggKG1ldGE7IGZpZWxkTWV0YURhdGEpIHsKKyAgICAgIGNvZGUgfj0gInN0YXRpYyBpZiAoIWlzKE1lbWJlclR5cGUhKFQsIGAiIH4gbWV0YS5uYW1lIH4gImApKSkge1xuIjsKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwgIkZpZWxkICciIH4gbWV0YS5uYW1lIH4KKyAgICAgICAgICAiJyByZWZlcmVuY2VkIGluIG1ldGFkYXRhIG5vdCBwcmVzZW50IGluIHN0cnVjdCAnIiB+IFQuc3RyaW5nb2YgfiAiJy4iKTsKKyAgICAgIH07CisgICAgICBjb2RlIH49ICJ9IjsKKyAgICAgIGlmIChtZXRhLnJlcSA9PSBUUmVxLk9QVElPTkFMIHx8IG1ldGEucmVxID09IFRSZXEuT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgY29kZSB+PSAiZWxzZSBzdGF0aWMgaWYgKCFpc051bGxhYmxlIShNZW1iZXJUeXBlIShULCBgIiB+IG1ldGEubmFtZSB+ICJgKSkpIHtcbiI7CisgICAgICAgIGNvZGUgfj0gIiAgYm9vbCAiIH4gbWV0YS5uYW1lIH4gIjtcbiI7CisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICB9CisgICAgfQorICAgIGNvZGUgfj0gIn0iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIFRocmlmdCBzdHJ1Y3QgZnJvbSBhIHByb3RvY29sLgorICoKKyAqIFVzaW5nIHRoZSBQcm90b2NvbCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHRoZSBjb25jcmV0ZSBUUHJvdG9jb2wgdG8gdXNlIGNhbiBiZQorICogYmUgc3BlY2lmaWVkLiBJZiB0aGUgcG9pbnRlclN0cnVjdCBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsIHRoZSBzdHJ1Y3QKKyAqIGZpZWxkcyBhcmUgZXhwZWN0ZWQgdG8gYmUgcG9pbnRlcnMgdG8gdGhlIGFjdHVhbCBkYXRhLiBUaGlzIGlzIHVzZWQKKyAqIGludGVybmFsbHkgKGNvbWJpbmVkIHdpdGggVFBSZXN1bHRTdHJ1Y3QpIGFuZCB1c3VhbGx5IHNob3VsZCBub3QgYmUgdXNlZCBpbgorICogdXNlciBjb2RlLgorICoKKyAqIFRoaXMgaXMgYSBmcmVlIGZ1bmN0aW9uIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gcmVhZCBleGlzaXRpbmcgc3RydWN0cyBmcm9tCisgKiB0aGUgd2lyZSB3aXRob3V0IGFsdGVyaW5nIHRoZWlyIGRlZmluaXRpb25zLgorICovCit2b2lkIHJlYWRTdHJ1Y3QoVCwgUHJvdG9jb2wsIGFsaWFzIGZpZWxkTWV0YURhdGEgPSBjYXN0KFRGaWVsZE1ldGFbXSludWxsLAorICBib29sIHBvaW50ZXJTdHJ1Y3QgPSBmYWxzZSkoYXV0byByZWYgVCBzLCBQcm90b2NvbCBwKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpCit7CisgIG1peGluKHsKKyAgICBzdHJpbmcgY29kZTsKKworICAgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBmb3Igd2hpY2ggdGhlcmUgaXMgbWV0YSBpbmZvIGFyZSBhY3R1YWxseSBpbiB0aGUKKyAgICAvLyBwYXNzZWQgc3RydWN0IHR5cGUuCisgICAgZm9yZWFjaCAoZmllbGQ7IG1lcmdlRmllbGRNZXRhIShULCBmaWVsZE1ldGFEYXRhKSkgeworICAgICAgY29kZSB+PSAic3RhdGljIGFzc2VydChpcyhNZW1iZXJUeXBlIShULCBgIiB+IGZpZWxkLm5hbWUgfiAiYCkpKTtcbiI7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgY29kZSBzdHJpbmcgZm9yIHJlYWRpbmcgYSB2YWx1ZSBvZiB0eXBlIEYgb2ZmIHRoZSB3aXJlIGFuZAorICAgIC8vIGFzc2lnbmluZyBpdCB0byB2LiBUaGUgbGV2ZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUKKyAgICAvLyBhcmUgbm8gY29uZmxpY3RpbmcgdmFyaWFibGUgbmFtZXMgb24gcmVjdXJzaXZlIGNhbGxzLgorICAgIHN0cmluZyByZWFkVmFsdWVDb2RlKFZhbHVlVHlwZSkoc3RyaW5nIHYsIHNpemVfdCBsZXZlbCA9IDApIHsKKyAgICAgIC8vIFNvbWUgbm9uLWFtYmlnb3VzIG5hbWVzIHRvIHVzZSAoc2hhZG93aW5nIGlzIG5vdCBhbGxvd2VkIGluIEQpLgorICAgICAgaW1tdXRhYmxlIGkgPSAiaSIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIGVsZW0gPSAiZWxlbSIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIGtleSA9ICJrZXkiIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSBsaXN0ID0gImxpc3QiIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSBtYXAgPSAibWFwIiB+IHRvIXN0cmluZyhsZXZlbCk7CisgICAgICBpbW11dGFibGUgc2V0ID0gInNldCIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIHZhbHVlID0gInZhbHVlIiB+IHRvIXN0cmluZyhsZXZlbCk7CisKKyAgICAgIGFsaWFzIEZ1bGx5VW5xdWFsIVZhbHVlVHlwZSBGOworCisgICAgICBzdGF0aWMgaWYgKGlzKEYgPT0gYm9vbCkpIHsKKyAgICAgICAgcmV0dXJuIHYgfiAiID0gcC5yZWFkQm9vbCgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGJ5dGUpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZEJ5dGUoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBkb3VibGUpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZERvdWJsZSgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IHNob3J0KSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBwLnJlYWRJMTYoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBpbnQpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZEkzMigpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGxvbmcpKSB7CisgICAgICAgIHJldHVybiB2IH4gIiA9IHAucmVhZEk2NCgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIDogc3RyaW5nKSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBwLnJlYWRTdHJpbmcoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiA9PSBlbnVtKSkgeworICAgICAgICByZXR1cm4gdiB+ICIgPSBjYXN0KHR5cGVvZigiIH4gdiB+ICIpKXAucmVhZEkzMigpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBFW10sIEUpKSB7CisgICAgICAgIHJldHVybiAie1xuIiB+CisgICAgICAgICAgImF1dG8gIiB+IGxpc3QgfiAiID0gcC5yZWFkTGlzdEJlZ2luKCk7XG4iIH4KKyAgICAgICAgICAvLyBUT0RPOiBDaGVjayBlbGVtZW50IHR5cGUgaGVyZT8KKyAgICAgICAgICB2IH4gIiA9IG5ldyB0eXBlb2YoIiB+IHYgfiAiWzBdKVsiIH4gbGlzdCB+ICIuc2l6ZV07XG4iIH4KKyAgICAgICAgICAiZm9yZWFjaCAoIiB+IGkgfiAiOyAwIC4uICIgfiBsaXN0IH4gIi5zaXplKSB7XG4iIH4KKyAgICAgICAgICAgIHJlYWRWYWx1ZUNvZGUhRSh2IH4gIlsiIH4gaSB+ICJdIiwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC5yZWFkTGlzdEVuZCgpO1xuIiB+CisgICAgICAgICJ9IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgXyA6IFZbS10sIEssIFYpKSB7CisgICAgICAgIHJldHVybiAie1xuIiB+CisgICAgICAgICAgImF1dG8gIiB+IG1hcCB+ICIgPSBwLnJlYWRNYXBCZWdpbigpOyIgfgorICAgICAgICAgIHYgfiAiID0gbnVsbDtcbiIgfgorICAgICAgICAgIC8vIFRPRE86IENoZWNrIGtleS92YWx1ZSB0eXBlcyBoZXJlPworICAgICAgICAgICJmb3JlYWNoICgiIH4gaSB+ICI7IDAgLi4gIiB+IG1hcCB+ICIuc2l6ZSkge1xuIiB+CisgICAgICAgICAgICAiRnVsbHlVbnF1YWwhKHR5cGVvZigiIH4gdiB+ICIua2V5c1swXSkpICIgfiBrZXkgfiAiO1xuIiB+CisgICAgICAgICAgICByZWFkVmFsdWVDb2RlIUsoa2V5LCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgICAidHlwZW9mKCIgfiB2IH4gIi52YWx1ZXNbMF0pICIgfiB2YWx1ZSB+ICI7XG4iIH4KKyAgICAgICAgICAgIHJlYWRWYWx1ZUNvZGUhVih2YWx1ZSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICAgdiB+ICJbY2FzdCh0eXBlb2YoIiB+IHYgfiAiLmtleXNbMF0pKSIgfiBrZXkgfiAiXSA9ICIgfiB2YWx1ZSB+ICI7XG4iIH4KKyAgICAgICAgICAifVxuIiB+CisgICAgICAgICAgInAucmVhZE1hcEVuZCgpOyIgfgorICAgICAgICAifSI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBIYXNoU2V0IShFKSwgRSkpIHsKKyAgICAgICAgcmV0dXJuICJ7XG4iIH4KKyAgICAgICAgICAiYXV0byAiIH4gc2V0IH4gIiA9IHAucmVhZFNldEJlZ2luKCk7IiB+CisgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgZWxlbWVudCB0eXBlIGhlcmU/CisgICAgICAgICAgdiB+ICIgPSBuZXcgdHlwZW9mKCIgfiB2IH4gIikoKTtcbiIgfgorICAgICAgICAgICJmb3JlYWNoICgiIH4gaSB+ICI7IDAgLi4gIiB+IHNldCB+ICIuc2l6ZSkge1xuIiB+CisgICAgICAgICAgICAidHlwZW9mKCIgfiB2IH4gIltdWzBdKSAiIH4gZWxlbSB+ICI7XG4iIH4KKyAgICAgICAgICAgIHJlYWRWYWx1ZUNvZGUhRShlbGVtLCBsZXZlbCArIDEpIH4gIlxuIiB+CisgICAgICAgICAgICB2IH4gIiB+PSAiIH4gZWxlbSB+ICI7XG4iIH4KKyAgICAgICAgICAifVxuIiB+CisgICAgICAgICAgInAucmVhZFNldEVuZCgpOyIgfgorICAgICAgICAifSI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IHN0cnVjdCkgfHwgaXMoRiA6IFRFeGNlcHRpb24pKSB7CisgICAgICAgIHN0YXRpYyBpZiAoaXMoRiA9PSBzdHJ1Y3QpKSB7CisgICAgICAgICAgYXV0byByZXN1bHQgPSB2IH4gIiA9IHR5cGVvZigiIH4gdiB+ICIpKCk7XG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGF1dG8gcmVzdWx0ID0gdiB+ICIgPSBuZXcgdHlwZW9mKCIgfiB2IH4gIikoKTtcbiI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgaWYgKF9fdHJhaXRzKGNvbXBpbGVzLCBGLmluaXQucmVhZChUUHJvdG9jb2wuaW5pdCkpKSB7CisgICAgICAgICAgcmVzdWx0IH49IHYgfiAiLnJlYWQocCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQgfj0gInJlYWRTdHJ1Y3QoIiB+IHYgfiAiLCBwKTsiOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IEYuc3RyaW5nb2YpOworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyByZWFkRmllbGRDb2RlKEZpZWxkVHlwZSkoc3RyaW5nIG5hbWUsIHNob3J0IGlkLCBUUmVxIHJlcSkgeworICAgICAgc3RhdGljIGlmIChwb2ludGVyU3RydWN0ICYmIGlzUG9pbnRlciFGaWVsZFR5cGUpIHsKKyAgICAgICAgaW1tdXRhYmxlIHYgPSAiKCpzLiIgfiBuYW1lIH4gIikiOworICAgICAgICBhbGlhcyBQb2ludGVyVGFyZ2V0IUZpZWxkVHlwZSBGOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW1tdXRhYmxlIHYgPSAicy4iIH4gbmFtZTsKKyAgICAgICAgYWxpYXMgRmllbGRUeXBlIEY7CisgICAgICB9CisKKyAgICAgIHN0cmluZyBjb2RlID0gImNhc2UgIiB+IHRvIXN0cmluZyhpZCkgfiAiOlxuIjsKKyAgICAgIGNvZGUgfj0gImlmIChmLnR5cGUgPT0gIiB+IGRUb1RUeXBlU3RyaW5nIUYgfiAiKSB7XG4iOworICAgICAgY29kZSB+PSByZWFkVmFsdWVDb2RlIUYodikgfiAiXG4iOworICAgICAgaWYgKHJlcSA9PSBUUmVxLlJFUVVJUkVEKSB7CisgICAgICAgIC8vIEZvciByZXF1aXJlZCBmaWVsZHMsIHNldCB0aGUgY29ycmVzcG9uZGluZyBsb2NhbCBpc1NldCB2YXJpYWJsZS4KKyAgICAgICAgY29kZSB+PSAiaXNTZXRfIiB+IG5hbWUgfiAiID0gdHJ1ZTtcbiI7CisgICAgICB9IGVsc2UgaWYgKCFpc051bGxhYmxlIUYpeworICAgICAgICBjb2RlIH49ICJzLmlzU2V0RmxhZ3MuIiB+IG5hbWUgfiAiID0gdHJ1ZTtcbiI7CisgICAgICB9CisgICAgICBjb2RlIH49ICJ9IGVsc2Ugc2tpcChwLCBmLnR5cGUpO1xuIjsKKyAgICAgIGNvZGUgfj0gImJyZWFrO1xuIjsKKyAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIC8vIENvZGUgZm9yIHRoZSBsb2NhbCBib29sZWFuIGZsYWdzIHVzZWQgdG8gbWFrZSBzdXJlIHJlcXVpcmVkIGZpZWxkcyBoYXZlCisgICAgLy8gYmVlbiBmb3VuZC4KKyAgICBzdHJpbmcgaXNTZXRGbGFnQ29kZSA9ICIiOworCisgICAgLy8gQ29kZSBmb3IgY2hlY2tpbmcgd2hldGhlciB0aGUgZmxhZ3MgZm9yIHRoZSByZXF1aXJlZCBmaWVsZHMgYXJlIHRydWUuCisgICAgc3RyaW5nIGlzU2V0Q2hlY2tDb2RlID0gIiI7CisKKyAgICAvLy8gQ29kZSBmb3IgdGhlIGNhc2Ugc3RhdGVtZW50cyBzdG9yaW5nIHRoZSBmaWVsZHMgdG8gdGhlIHJlc3VsdCBzdHJ1Y3QuCisgICAgc3RyaW5nIHJlYWRNZW1iZXJzQ29kZSA9ICIiOworCisgICAgLy8gVGhlIGxhc3QgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZCDigJMgZmllbGRzIHdpdGggbm8gbWV0YSBpbmZvcm1hdGlvbgorICAgIC8vIGFyZSBhc3NpZ25lZCAoaW4gbGV4aWNhbCBvcmRlcikgZGVzY2VuZGluZyBuZWdhdGl2ZSBpZHMsIHN0YXJ0aW5nIHdpdGgKKyAgICAvLyAtMSwganVzdCBsaWtlIHRoZSBUaHJpZnQgY29tcGlsZXIgZG9lcy4KKyAgICBzaG9ydCBsYXN0SWQ7CisKKyAgICBmb3JlYWNoIChuYW1lOyBGaWVsZE5hbWVzIVQpIHsKKyAgICAgIGVudW0gcmVxID0gbWVtYmVyUmVxIShULCBuYW1lLCBmaWVsZE1ldGFEYXRhKTsKKyAgICAgIGlmIChyZXEgPT0gVFJlcS5SRVFVSVJFRCkgeworICAgICAgICAvLyBGb3IgcmVxdWlyZWQgZmllbGRzLCBnZW5lcmF0ZSBsb2NhbCBib29sIGZsYWdzIHRvIGtlZXAgdHJhY2sKKyAgICAgICAgLy8gd2hldGhlciB0aGUgZmllbGQgaGFzIGJlZW4gZW5jb3VudGVyZWQuCisgICAgICAgIGltbXV0YWJsZSBuID0gImlzU2V0XyIgfiBuYW1lOworICAgICAgICBpc1NldEZsYWdDb2RlIH49ICJib29sICIgfiBuIH4gIjtcbiI7CisgICAgICAgIGlzU2V0Q2hlY2tDb2RlIH49ICJlbmZvcmNlKCIgfiBuIH4gIiwgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiIH4KKyAgICAgICAgICAiYFJlcXVpcmVkIGZpZWxkICciIH4gbmFtZSB+ICInIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGFgLCAiIH4KKyAgICAgICAgICAiVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKSk7XG4iOworICAgICAgfQorCisgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAobWVyZ2VGaWVsZE1ldGEhKFQsIGZpZWxkTWV0YURhdGEpLCBuYW1lKTsKKyAgICAgIHN0YXRpYyBpZiAobWV0YS5lbXB0eSkgeworICAgICAgICAtLWxhc3RJZDsKKyAgICAgICAgdmVyc2lvbiAoVFZlcmJvc2VDb2RlZ2VuKSB7CisgICAgICAgICAgY29kZSB+PSAicHJhZ21hKG1zZywgYFt0aHJpZnQuY29kZWdlbi5iYXNlLnJlYWRTdHJ1Y3RdIFdhcm5pbmc6IE5vICIgfgorICAgICAgICAgICAgIm1ldGEgaW5mb3JtYXRpb24gZm9yIGZpZWxkICciIH4gbmFtZSB+ICInIGluIHN0cnVjdCAnIiB+CisgICAgICAgICAgICBULnN0cmluZ29mIH4gIicuIEFzc2lnbmVkIGlkOiAiIH4gdG8hc3RyaW5nKGxhc3RJZCkgfiAiLmApO1xuIjsKKyAgICAgICAgfQorICAgICAgICByZWFkTWVtYmVyc0NvZGUgfj0gcmVhZEZpZWxkQ29kZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpKAorICAgICAgICAgIG5hbWUsIGxhc3RJZCwgcmVxKTsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKHJlcSAhPSBUUmVxLklHTk9SRSkgeworICAgICAgICByZWFkTWVtYmVyc0NvZGUgfj0gcmVhZEZpZWxkQ29kZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpKAorICAgICAgICAgIG5hbWUsIG1ldGEuZnJvbnQuaWQsIHJlcSk7CisgICAgICB9CisgICAgfQorCisgICAgY29kZSB+PSBpc1NldEZsYWdDb2RlOworICAgIGNvZGUgfj0gInAucmVhZFN0cnVjdEJlZ2luKCk7XG4iOworICAgIGNvZGUgfj0gIndoaWxlICh0cnVlKSB7XG4iOworICAgIGNvZGUgfj0gImF1dG8gZiA9IHAucmVhZEZpZWxkQmVnaW4oKTtcbiI7CisgICAgY29kZSB+PSAiaWYgKGYudHlwZSA9PSBUVHlwZS5TVE9QKSBicmVhaztcbiI7CisgICAgY29kZSB+PSAic3dpdGNoKGYuaWQpIHtcbiI7CisgICAgY29kZSB+PSByZWFkTWVtYmVyc0NvZGU7CisgICAgY29kZSB+PSAiZGVmYXVsdDogc2tpcChwLCBmLnR5cGUpO1xuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIGNvZGUgfj0gInAucmVhZEZpZWxkRW5kKCk7XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgY29kZSB+PSAicC5yZWFkU3RydWN0RW5kKCk7XG4iOworICAgIGNvZGUgfj0gaXNTZXRDaGVja0NvZGU7CisKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgc3RydWN0IHRvIHRoZSB0YXJnZXQgcHJvdG9jb2wuCisgKgorICogVXNpbmcgdGhlIFByb3RvY29sIHRlbXBsYXRlIHBhcmFtZXRlciwgdGhlIGNvbmNyZXRlIFRQcm90b2NvbCB0byB1c2UgY2FuIGJlCisgKiBiZSBzcGVjaWZpZWQuIElmIHRoZSBwb2ludGVyU3RydWN0IHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHN0cnVjdAorICogZmllbGRzIGFyZSBleHBlY3RlZCB0byBiZSBwb2ludGVycyB0byB0aGUgYWN0dWFsIGRhdGEuIFRoaXMgaXMgdXNlZAorICogaW50ZXJuYWxseSAoY29tYmluZWQgd2l0aCBUUGFyZ3NTdHJ1Y3QpIGFuZCB1c3VhbGx5IHNob3VsZCBub3QgYmUgdXNlZCBpbgorICogdXNlciBjb2RlLgorICoKKyAqIFRoaXMgaXMgYSBmcmVlIGZ1bmN0aW9uIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gcmVhZCBleGlzaXRpbmcgc3RydWN0cyBmcm9tCisgKiB0aGUgd2lyZSB3aXRob3V0IGFsdGVyaW5nIHRoZWlyIGRlZmluaXRpb25zLgorICovCit2b2lkIHdyaXRlU3RydWN0KFQsIFByb3RvY29sLCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCwKKyAgYm9vbCBwb2ludGVyU3RydWN0ID0gZmFsc2UpIChjb25zdCBUIHMsIFByb3RvY29sIHApIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkKK3sKKyAgbWl4aW4oeworICAgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBmb3Igd2hpY2ggdGhlcmUgaXMgbWV0YSBpbmZvIGFyZSBhY3R1YWxseSBpbiB0aGUKKyAgICAvLyBwYXNzZWQgc3RydWN0IHR5cGUuCisgICAgc3RyaW5nIGNvZGUgPSAiIjsKKyAgICBmb3JlYWNoIChmaWVsZDsgbWVyZ2VGaWVsZE1ldGEhKFQsIGZpZWxkTWV0YURhdGEpKSB7CisgICAgICBjb2RlIH49ICJzdGF0aWMgYXNzZXJ0KGlzKE1lbWJlclR5cGUhKFQsIGAiIH4gZmllbGQubmFtZSB+ICJgKSkpO1xuIjsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHJlcXVpcmVkIG51bGxhYmxlIG1lbWJlcnMgYXJlIG5vbi1udWxsLgorICAgIC8vIFdPUktBUk9VTkQ6IFRvIHN0b3AgTERDIGZyb20gZW1pdHRpbmcgdGhlIG1hbmlmZXN0IGNvbnN0YW50IMK7bWV0YcKrIGJlbG93CisgICAgLy8gaW50byB0aGUgd3JpdGVTdHJ1Y3QgZnVuY3Rpb24gYm9keSB0aGlzIGlzIGluc2lkZSB0aGUgc3RyaW5nIG1peGluCisgICAgLy8gYmxvY2sg4oCTIHRoZSBjb2RlIHdvdWxkbid0IGRlcGVuZCBvbiBpdCAodGhpcyBpcyBhbiBMREMgYnVnLCBhbmQgYmVjYXVzZQorICAgIC8vIG9mIGl0IGEgbmV3IGFycmF5IHdvdWxkIGJlIGFsbG9jYXRlZCBvbiBlYWNoIG1ldGhvZCBpbnZvY2F0aW9uIGF0IHJ1bnRpbWUpLgorICAgIGZvcmVhY2ggKG5hbWU7IFN0YXRpY0ZpbHRlciEoCisgICAgICBDb21wb3NlIShpc051bGxhYmxlLCBQQXBwbHkhKE1lbWJlclR5cGUsIFQpKSwKKyAgICAgIEZpZWxkTmFtZXMhVAorICAgICkpIHsKKyAgICAgICBzdGF0aWMgaWYgKG1lbWJlclJlcSEoVCwgbmFtZSwgZmllbGRNZXRhRGF0YSkgPT0gVFJlcS5SRVFVSVJFRCkgeworICAgICAgICAgY29kZSB+PSAiZW5mb3JjZShfX3RyYWl0cyhnZXRNZW1iZXIsIHMsIGAiIH4gbmFtZSB+ICJgKSAhaXMgbnVsbCwKKyAgICAgICAgICAgbmV3IFRFeGNlcHRpb24oYFJlcXVpcmVkIGZpZWxkICciIH4gbmFtZSB+ICInIGlzIG51bGwuYCkpO1xuIjsKKyAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7CisKKyAgcC53cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3QoVC5zdHJpbmdvZikpOworICBtaXhpbih7CisgICAgc3RyaW5nIHdyaXRlVmFsdWVDb2RlKFZhbHVlVHlwZSkoc3RyaW5nIHYsIHNpemVfdCBsZXZlbCA9IDApIHsKKyAgICAgIC8vIFNvbWUgbm9uLWFtYmlnb3VzIG5hbWVzIHRvIHVzZSAoc2hhZG93aW5nIGlzIG5vdCBhbGxvd2VkIGluIEQpLgorICAgICAgaW1tdXRhYmxlIGVsZW0gPSAiZWxlbSIgfiB0byFzdHJpbmcobGV2ZWwpOworICAgICAgaW1tdXRhYmxlIGtleSA9ICJrZXkiIH4gdG8hc3RyaW5nKGxldmVsKTsKKyAgICAgIGltbXV0YWJsZSB2YWx1ZSA9ICJ2YWx1ZSIgfiB0byFzdHJpbmcobGV2ZWwpOworCisgICAgICBhbGlhcyBGdWxseVVucXVhbCFWYWx1ZVR5cGUgRjsKKyAgICAgIHN0YXRpYyBpZiAoaXMoRiA9PSBib29sKSkgeworICAgICAgICByZXR1cm4gInAud3JpdGVCb29sKCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gYnl0ZSkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlQnl0ZSgiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGRvdWJsZSkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlRG91YmxlKCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gc2hvcnQpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUkxNigiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGludCkpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlSTMyKCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgPT0gbG9uZykpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlSTY0KCIgfiB2IH4gIik7IjsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEYgOiBzdHJpbmcpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZVN0cmluZygiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IGVudW0pKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUkzMihjYXN0KGludCkiIH4gdiB+ICIpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBFW10sIEUpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZUxpc3RCZWdpbihUTGlzdCgiIH4gZFRvVFR5cGVTdHJpbmchRSB+ICIsICIgfiB2IH4KKyAgICAgICAgICAiLmxlbmd0aCkpO1xuIiB+CisgICAgICAgICAgImZvcmVhY2ggKCIgfiBlbGVtIH4gIjsgIiB+IHYgfiAiKSB7XG4iIH4KKyAgICAgICAgICAgIHdyaXRlVmFsdWVDb2RlIUUoZWxlbSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC53cml0ZUxpc3RFbmQoKTsiOworICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRiBfIDogVltLXSwgSywgVikpIHsKKyAgICAgICAgcmV0dXJuICJwLndyaXRlTWFwQmVnaW4oVE1hcCgiIH4gZFRvVFR5cGVTdHJpbmchSyB+ICIsICIgfgorICAgICAgICAgIGRUb1RUeXBlU3RyaW5nIVYgfiAiLCAiIH4gdiB+ICIubGVuZ3RoKSk7XG4iIH4KKyAgICAgICAgICAiZm9yZWFjaCAoIiB+IGtleSB+ICIsICIgfiB2YWx1ZSB+ICI7ICIgfiB2IH4gIikge1xuIiB+CisgICAgICAgICAgICB3cml0ZVZhbHVlQ29kZSFLKGtleSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICAgd3JpdGVWYWx1ZUNvZGUhVih2YWx1ZSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC53cml0ZU1hcEVuZCgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGIF8gOiBIYXNoU2V0IUUsIEUpKSB7CisgICAgICAgIHJldHVybiAicC53cml0ZVNldEJlZ2luKFRTZXQoIiB+IGRUb1RUeXBlU3RyaW5nIUUgfiAiLCAiIH4gdiB+CisgICAgICAgICAgIi5sZW5ndGgpKTtcbiIgfgorICAgICAgICAgICJmb3JlYWNoICgiIH4gZWxlbSB+ICI7ICIgfiB2IH4gIltdKSB7XG4iIH4KKyAgICAgICAgICAgIHdyaXRlVmFsdWVDb2RlIUUoZWxlbSwgbGV2ZWwgKyAxKSB+ICJcbiIgfgorICAgICAgICAgICJ9XG4iIH4KKyAgICAgICAgICAicC53cml0ZVNldEVuZCgpOyI7CisgICAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGID09IHN0cnVjdCkgfHwgaXMoRiA6IFRFeGNlcHRpb24pKSB7CisgICAgICAgIHN0YXRpYyBpZiAoX190cmFpdHMoY29tcGlsZXMsIEYuaW5pdC53cml0ZShUUHJvdG9jb2wuaW5pdCkpKSB7CisgICAgICAgICAgcmV0dXJuIHYgfiAiLndyaXRlKHApOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuICJ3cml0ZVN0cnVjdCgiIH4gdiB+ICIsIHApOyI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRpYyBhc3NlcnQoZmFsc2UsICJDYW5ub3QgcmVwcmVzZW50IHR5cGUgaW4gVGhyaWZ0OiAiIH4gRi5zdHJpbmdvZik7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIHdyaXRlRmllbGRDb2RlKEZpZWxkVHlwZSkoc3RyaW5nIG5hbWUsIHNob3J0IGlkLCBUUmVxIHJlcSkgeworICAgICAgc3RyaW5nIGNvZGU7CisgICAgICBpZiAoIXBvaW50ZXJTdHJ1Y3QgJiYgcmVxID09IFRSZXEuT1BUSU9OQUwpIHsKKyAgICAgICAgY29kZSB+PSAiaWYgKHMuaXNTZXQhYCIgfiBuYW1lIH4gImApIHtcbiI7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBpZiAocG9pbnRlclN0cnVjdCAmJiBpc1BvaW50ZXIhRmllbGRUeXBlKSB7CisgICAgICAgIGltbXV0YWJsZSB2ID0gIigqcy4iIH4gbmFtZSB+ICIpIjsKKyAgICAgICAgYWxpYXMgUG9pbnRlclRhcmdldCFGaWVsZFR5cGUgRjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGltbXV0YWJsZSB2ID0gInMuIiB+IG5hbWU7CisgICAgICAgIGFsaWFzIEZpZWxkVHlwZSBGOworICAgICAgfQorCisgICAgICBjb2RlIH49ICJwLndyaXRlRmllbGRCZWdpbihURmllbGQoYCIgfiBuYW1lIH4gImAsICIgfiBkVG9UVHlwZVN0cmluZyFGIH4KKyAgICAgICAgIiwgIiB+IHRvIXN0cmluZyhpZCkgfiAiKSk7XG4iOworICAgICAgY29kZSB+PSB3cml0ZVZhbHVlQ29kZSFGKHYpIH4gIlxuIjsKKyAgICAgIGNvZGUgfj0gInAud3JpdGVGaWVsZEVuZCgpO1xuIjsKKworICAgICAgaWYgKCFwb2ludGVyU3RydWN0ICYmIHJlcSA9PSBUUmVxLk9QVElPTkFMKSB7CisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICB9CisgICAgICByZXR1cm4gY29kZTsKKyAgICB9CisKKyAgICAvLyBUaGUgbGFzdCBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIGlkIOKAkyBmaWVsZHMgd2l0aCBubyBtZXRhIGluZm9ybWF0aW9uCisgICAgLy8gYXJlIGFzc2lnbmVkIChpbiBsZXhpY2FsIG9yZGVyKSBkZXNjZW5kaW5nIG5lZ2F0aXZlIGlkcywgc3RhcnRpbmcgd2l0aAorICAgIC8vIC0xLCBqdXN0IGxpa2UgdGhlIFRocmlmdCBjb21waWxlciBkb2VzLgorICAgIHNob3J0IGxhc3RJZDsKKworICAgIHN0cmluZyBjb2RlID0gIiI7CisgICAgZm9yZWFjaCAobmFtZTsgRmllbGROYW1lcyFUKSB7CisgICAgICBhbGlhcyBNZW1iZXJUeXBlIShULCBuYW1lKSBGOworICAgICAgZW51bSByZXEgPSBtZW1iZXJSZXEhKFQsIG5hbWUsIGZpZWxkTWV0YURhdGEpOworICAgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKG1lcmdlRmllbGRNZXRhIShULCBmaWVsZE1ldGFEYXRhKSwgbmFtZSk7CisgICAgICBpZiAobWV0YS5lbXB0eSkgeworICAgICAgICAtLWxhc3RJZDsKKyAgICAgICAgdmVyc2lvbiAoVFZlcmJvc2VDb2RlZ2VuKSB7CisgICAgICAgICAgY29kZSB+PSAicHJhZ21hKG1zZywgYFt0aHJpZnQuY29kZWdlbi5iYXNlLndyaXRlU3RydWN0XSBXYXJuaW5nOiBObyAiIH4KKyAgICAgICAgICAgICJtZXRhIGluZm9ybWF0aW9uIGZvciBmaWVsZCAnIiB+IG5hbWUgfiAiJyBpbiBzdHJ1Y3QgJyIgfgorICAgICAgICAgICAgVC5zdHJpbmdvZiB+ICInLiBBc3NpZ25lZCBpZDogIiB+IHRvIXN0cmluZyhsYXN0SWQpIH4gIi5gKTtcbiI7CisgICAgICAgIH0KKyAgICAgICAgY29kZSB+PSB3cml0ZUZpZWxkQ29kZSFGKG5hbWUsIGxhc3RJZCwgcmVxKTsKKyAgICAgIH0gZWxzZSBpZiAocmVxICE9IFRSZXEuSUdOT1JFKSB7CisgICAgICAgIGNvZGUgfj0gd3JpdGVGaWVsZENvZGUhRihuYW1lLCBtZXRhLmZyb250LmlkLCByZXEpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9KCkpOworICBwLndyaXRlRmllbGRTdG9wKCk7CisgIHAud3JpdGVTdHJ1Y3RFbmQoKTsKK30KKwordW5pdHRlc3QgeworICAvLyBFbnN1cmUgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgYXQgbGVhc3QgY29tcGlsZXMgZm9yIHRoZSBiYXNpYyBmaWVsZCB0eXBlCisgIC8vIGNvbWJpbmF0aW9ucy4gRnVuY3Rpb25hbGl0eSBjaGVja3MgYXJlIGNvdmVyZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHRlc3QKKyAgLy8gc3VpdGUuCisKKyAgc3RhdGljIHN0cnVjdCBUZXN0IHsKKyAgICAvLyBOb24tbnVsbGFibGUuCisgICAgaW50IGExOworICAgIGludCBhMjsKKyAgICBpbnQgYTM7CisgICAgaW50IGE0OworCisgICAgLy8gTnVsbGFibGUuCisgICAgc3RyaW5nIGIxOworICAgIHN0cmluZyBiMjsKKyAgICBzdHJpbmcgYjM7CisgICAgc3RyaW5nIGI0OworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoImExIiwgMSwgVFJlcS5PUFRfSU5fUkVRX09VVCksCisgICAgICBURmllbGRNZXRhKCJhMiIsIDIsIFRSZXEuT1BUSU9OQUwpLAorICAgICAgVEZpZWxkTWV0YSgiYTMiLCAzLCBUUmVxLlJFUVVJUkVEKSwKKyAgICAgIFRGaWVsZE1ldGEoImE0IiwgNCwgVFJlcS5JR05PUkUpLAorICAgICAgVEZpZWxkTWV0YSgiYjEiLCA1LCBUUmVxLk9QVF9JTl9SRVFfT1VUKSwKKyAgICAgIFRGaWVsZE1ldGEoImIyIiwgNiwgVFJlcS5PUFRJT05BTCksCisgICAgICBURmllbGRNZXRhKCJiMyIsIDcsIFRSZXEuUkVRVUlSRUQpLAorICAgICAgVEZpZWxkTWV0YSgiYjQiLCA4LCBUUmVxLklHTk9SRSksCisgICAgXSk7CisgIH0KKworICBzdGF0aWMgYXNzZXJ0KF9fdHJhaXRzKGNvbXBpbGVzLCB7IFRlc3QgdDsgdC5yZWFkKGNhc3QoVFByb3RvY29sKW51bGwpOyB9KSk7CisgIHN0YXRpYyBhc3NlcnQoX190cmFpdHMoY29tcGlsZXMsIHsgVGVzdCB0OyB0LndyaXRlKGNhc3QoVFByb3RvY29sKW51bGwpOyB9KSk7Cit9CisKKy8vIEVuc3VyZSBvcEVxdWFscyBhbmQgdG9IYXNoIGNvbnNpc3RlbmN5LgordW5pdHRlc3QgeworICBzdHJ1Y3QgVGVzdEVxdWFscyB7CisgICAgaW50IGExOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoImExIiwgMSwgVFJlcS5PUFRfSU5fUkVRX09VVCksCisgICAgXSk7CisgIH0KKworICBUZXN0RXF1YWxzIGEsIGI7CisgIGFzc2VydChhID09IGIpOworICBhc3NlcnQoYS50b0hhc2goKSA9PSBiLnRvSGFzaCgpKTsKKworICBhLmExID0gNDI7CisgIGFzc2VydChhICE9IGIpOworICBhc3NlcnQoYS50b0hhc2goKSAhPSBiLnRvSGFzaCgpKTsKKworICBiLmExID0gNDI7CisgIGFzc2VydChhID09IGIpOworICBhc3NlcnQoYS50b0hhc2goKSA9PSBiLnRvSGFzaCgpKTsKK30KKworcHJpdmF0ZSB7CisgIC8qCisgICAqIFJldHVybnMgYSBEIGNvZGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1hdGNoaW5nIFRUeXBlIHZhbHVlIGZvciBhIHBhc3NlZAorICAgKiBEIHR5cGUsIGUuZy4gZFRvVFR5cGVTdHJpbmchYnl0ZSA9PSAiVFR5cGUuQllURSIuCisgICAqLworICB0ZW1wbGF0ZSBkVG9UVHlwZVN0cmluZyhUKSB7CisgICAgc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGJvb2wpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkJPT0wiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYnl0ZSkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuQllURSI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBkb3VibGUpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkRPVUJMRSI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBzaG9ydCkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuSTE2IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGludCkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuSTMyIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGxvbmcpKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkk2NCI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA6IHN0cmluZykpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuU1RSSU5HIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGVudW0pKSB7CisgICAgICBlbnVtIGRUb1RUeXBlU3RyaW5nID0gIlRUeXBlLkkzMiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVVtdLCBVKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5MSVNUIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgZW51bSBkVG9UVHlwZVN0cmluZyA9ICJUVHlwZS5NQVAiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IEhhc2hTZXQhRSwgRSkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuU0VUIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IHN0cnVjdCkpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuU1RSVUNUIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIDogVEV4Y2VwdGlvbikpIHsKKyAgICAgIGVudW0gZFRvVFR5cGVTdHJpbmcgPSAiVFR5cGUuU1RSVUNUIjsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwgIkNhbm5vdCByZXByZXNlbnQgdHlwZSBpbiBUaHJpZnQ6ICIgfiBULnN0cmluZ29mKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnQuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTdiMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudC5kCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGZpbmQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnRyYWl0cyA6IGlzU29tZUZ1bmN0aW9uLCBQYXJhbWV0ZXJTdG9yYWdlQ2xhc3MsCisgIFBhcmFtZXRlclN0b3JhZ2VDbGFzc1R1cGxlLCBQYXJhbWV0ZXJUeXBlVHVwbGUsIFJldHVyblR5cGU7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY3RmZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKKworLyoqCisgKiBUaHJpZnQgc2VydmljZSBjbGllbnQsIHdoaWNoIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIGJ5IHN5bmNocm9ub3VzbHkKKyAqIGNhbGxpbmcgYSBzZXJ2ZXIgb3ZlciBhIFRQcm90b2NvbC4KKyAqCisgKiBUQ2xpZW50QmFzZSBzaW1wbHkgZXh0ZW5kcyBJbnRlcmZhY2Ugd2l0aCBnZW5lcmljIGlucHV0L291dHB1dCBwcm90b2NvbAorICogcHJvcGVydGllcyB0byBzZXJ2ZSBhcyBhIHN1cGVydHlwZSBmb3IgYWxsIFRDbGllbnRzIGZvciB0aGUgc2FtZSBzZXJ2aWNlLAorICogd2hpY2ggbWlnaHQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IGNvbmNyZXRlIHByb3RvY29sIHR5cGVzICh0aGVyZQorICogaXMgbm8gY292YXJpYW5jZSBmb3IgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzKS4gSWYgSW50ZXJmYWNlIGlzIGRlcml2ZWQKKyAqIGZyb20gYW5vdGhlciBpbnRlcmZhY2UgQmFzZUludGVyZmFjZSwgaXQgYWxzbyBleHRlbmRzCisgKiBUQ2xpZW50QmFzZSFCYXNlSW50ZXJmYWNlLgorICoKKyAqIFRDbGllbnQgaXMgdGhlIGNsYXNzIHRoYXQgYWN0dWFsbHkgaW1wbGVtZW50cyBUQ2xpZW50QmFzZS4gSnVzdCBhcworICogVENsaWVudEJhc2UsIGl0IGlzIGFsc28gZGVyaXZlZCBmcm9tIFRDbGllbnQhQmFzZUludGVyZmFjZSBmb3IgaW5oZXJpdGluZworICogc2VydmljZXMuCisgKgorICogVENsaWVudCB0YWtlcyB0d28gb3B0aW9uYWwgdGVtcGxhdGUgYXJndW1lbnRzIHdoaWNoIGNhbiBiZSB1c2VkIGZvcgorICogc3BlY2lmeWluZyB0aGUgYWN0dWFsIFRQcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB1c2VkIGZvciBvcHRpbWl6YXRpb24KKyAqIHB1cnBvc2VzLCBhcyB2aXJ0dWFsIGNhbGxzIGNhbiBjb21wbGV0ZWx5IGJlIGVsaW1pbmF0ZWQgdGhlbi4gSWYKKyAqIE91dHB1dFByb3RvY29sIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUgYXMKKyAqIElucHV0UHJvdG9jb2wuIFRoZSBwcm90b2NvbCBwcm9wZXJ0aWVzIGRlZmluZWQgYnkgVENsaWVudEJhc2UgYXJlIGV4cG9zZWQKKyAqIHdpdGggdGhlaXIgY29uY3JldGUgdHlwZSAocmV0dXJuIHR5cGUgY292YXJpYW5jZSkuCisgKgorICogSW4gYWRkaXRpb24gdG8gaW1wbGVtZW50aW5nIFRDbGllbnRCYXNlIUludGVyZmFjZSwgVENsaWVudCBvZmZlcnMgdGhlCisgKiBmb2xsb3dpbmcgY29uc3RydWN0b3JzOgorICogLS0tCisgKiB0aGlzKElucHV0UHJvdG9jb2wgaXByb3QsIE91dHB1dFByb3RvY29sIG9wcm90KTsKKyAqIC8vIE9ubHkgaWYgaXMoSW5wdXRQcm90b2NvbCA9PSBPdXRwdXRQcm90b2NvbCksIHRvIHVzZSB0aGUgc2FtZSBwcm90b2NvbAorICogLy8gZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dDoKKyAqIHRoaXMoSW5wdXRQcm90b2NvbCBwcm90KTsKKyAqIC0tLQorICoKKyAqIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGUgbWV0aG9kIGNhbGxzIHN0YXJ0cyBhdCB6ZXJvIGFuZCBpcyBhdXRvbWF0aWNhbGx5CisgKiBpbmNyZW1lbnRlZC4KKyAqLworaW50ZXJmYWNlIFRDbGllbnRCYXNlKEludGVyZmFjZSkgaWYgKGlzQmFzZVNlcnZpY2UhSW50ZXJmYWNlKSA6IEludGVyZmFjZSB7CisgIC8qKgorICAgKiBUaGUgaW5wdXQgcHJvdG9jb2wgdXNlZCBieSB0aGUgY2xpZW50LgorICAgKi8KKyAgVFByb3RvY29sIGlucHV0UHJvdG9jb2woKSBAcHJvcGVydHk7CisKKyAgLyoqCisgICAqIFRoZSBvdXRwdXQgcHJvdG9jb2wgdXNlZCBieSB0aGUgY2xpZW50LgorICAgKi8KKyAgVFByb3RvY29sIG91dHB1dFByb3RvY29sKCkgQHByb3BlcnR5OworfQorCisvLy8gRGl0dG8KK2ludGVyZmFjZSBUQ2xpZW50QmFzZShJbnRlcmZhY2UpIGlmIChpc0Rlcml2ZWRTZXJ2aWNlIUludGVyZmFjZSkgOgorICBUQ2xpZW50QmFzZSEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlKSwgSW50ZXJmYWNlIHt9CisKKy8vLyBEaXR0bwordGVtcGxhdGUgVENsaWVudChJbnRlcmZhY2UsIElucHV0UHJvdG9jb2wgPSBUUHJvdG9jb2wsIE91dHB1dFByb3RvY29sID0gdm9pZCkgaWYgKAorICBpc1NlcnZpY2UhSW50ZXJmYWNlICYmIGlzVFByb3RvY29sIUlucHV0UHJvdG9jb2wgJiYKKyAgKGlzVFByb3RvY29sIU91dHB1dFByb3RvY29sIHx8IGlzKE91dHB1dFByb3RvY29sID09IHZvaWQpKQorKSB7CisgIG1peGluKHsKKyAgICBzdGF0aWMgaWYgKGlzRGVyaXZlZFNlcnZpY2UhSW50ZXJmYWNlKSB7CisgICAgICBzdHJpbmcgY29kZSA9ICJjbGFzcyBUQ2xpZW50IDogVENsaWVudCEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlLCAiIH4KKyAgICAgICAgIklucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sKSwgVENsaWVudEJhc2UhSW50ZXJmYWNlIHtcbiI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIHRoaXMoSVByb3QgaXByb3QsIE9Qcm90IG9wcm90KSB7CisgICAgICAgICAgc3VwZXIoaXByb3QsIG9wcm90KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBpZiAoaXMoSVByb3QgPT0gT1Byb3QpKSB7CisgICAgICAgICAgdGhpcyhJUHJvdCBwcm90KSB7CisgICAgICAgICAgICBzdXBlcihwcm90KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBETUQgQEBCVUdAQDogSWYgdGhlc2UgYXJlIG5vdCBwcmVzZW50IGluIHRoaXMgY2xhc3MgKHdvdWxkIGJlKQorICAgICAgICAvLyBpbmhlcml0ZWQgYW55d2F5LCDCu25vdCBpbXBsZW1lbnRlZMKrIGVycm9ycyBhcmUgcmFpc2VkLgorICAgICAgICBvdmVycmlkZSBJUHJvdCBpbnB1dFByb3RvY29sKCkgQHByb3BlcnR5IHsKKyAgICAgICAgICByZXR1cm4gc3VwZXIuaW5wdXRQcm90b2NvbDsKKyAgICAgICAgfQorICAgICAgICBvdmVycmlkZSBPUHJvdCBvdXRwdXRQcm90b2NvbCgpIEBwcm9wZXJ0eSB7CisgICAgICAgICAgcmV0dXJuIHN1cGVyLm91dHB1dFByb3RvY29sOworICAgICAgICB9CisgICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmcgY29kZSA9ICJjbGFzcyBUQ2xpZW50IDogVENsaWVudEJhc2UhSW50ZXJmYWNlIHsiOworICAgICAgY29kZSB+PSBxeworICAgICAgICBhbGlhcyBJbnB1dFByb3RvY29sIElQcm90OworICAgICAgICBzdGF0aWMgaWYgKGlzVFByb3RvY29sIU91dHB1dFByb3RvY29sKSB7CisgICAgICAgICAgYWxpYXMgT3V0cHV0UHJvdG9jb2wgT1Byb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdGljIGFzc2VydChpcyhPdXRwdXRQcm90b2NvbCA9PSB2b2lkKSk7CisgICAgICAgICAgYWxpYXMgSW5wdXRQcm90b2NvbCBPUHJvdDsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMoSVByb3QgaXByb3QsIE9Qcm90IG9wcm90KSB7CisgICAgICAgICAgaXByb3RfID0gaXByb3Q7CisgICAgICAgICAgb3Byb3RfID0gb3Byb3Q7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgaWYgKGlzKElQcm90ID09IE9Qcm90KSkgeworICAgICAgICAgIHRoaXMoSVByb3QgcHJvdCkgeworICAgICAgICAgICAgdGhpcyhwcm90LCBwcm90KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBJUHJvdCBpbnB1dFByb3RvY29sKCkgQHByb3BlcnR5IHsKKyAgICAgICAgICByZXR1cm4gaXByb3RfOworICAgICAgICB9CisKKyAgICAgICAgT1Byb3Qgb3V0cHV0UHJvdG9jb2woKSBAcHJvcGVydHkgeworICAgICAgICAgIHJldHVybiBvcHJvdF87CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgSVByb3QgaXByb3RfOworICAgICAgICBwcm90ZWN0ZWQgT1Byb3Qgb3Byb3RfOworICAgICAgICBwcm90ZWN0ZWQgaW50IHNlcWlkXzsKKyAgICAgIH07CisgICAgfQorCisgICAgZm9yZWFjaCAobWV0aG9kTmFtZTsgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIEludGVyZmFjZSkpIHsKKyAgICAgIHN0YXRpYyBpZiAoaXNTb21lRnVuY3Rpb24hKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICAgICAgVE1ldGhvZE1ldGEgbWV0aG9kTWV0YTsKKyAgICAgICAgc3RhdGljIGlmIChpcyh0eXBlb2YoSW50ZXJmYWNlLm1ldGhvZE1ldGEpIDogVE1ldGhvZE1ldGFbXSkpIHsKKyAgICAgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgICAgIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICAgICAgbWV0aG9kTWV0YUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIG1ldGhvZE1ldGEgPSBtZXRhLmZyb250OworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBjb2RlIGZvciBzZW5kaW5nLgorICAgICAgICBzdHJpbmdbXSBwYXJhbUxpc3Q7CisgICAgICAgIHN0cmluZyBwYXJhbUFzc2lnbkNvZGU7CisgICAgICAgIGZvcmVhY2ggKGksIF87IFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSB7CisgICAgICAgICAgLy8gVXNlIHRoZSBwYXJhbSBuYW1lIHNwZWZpY2llZCBpbiB0aGUgbWV0YSBpbmZvcm1hdGlvbiBpZiBhbnkg4oCTCisgICAgICAgICAgLy8ganVzdCBjb3NtZXRpY3MgaW4gdGhpcyBjYXNlLgorICAgICAgICAgIHN0cmluZyBwYXJhbU5hbWU7CisgICAgICAgICAgaWYgKG1ldGhvZE1ldGFGb3VuZCAmJiBpIDwgbWV0aG9kTWV0YS5wYXJhbXMubGVuZ3RoKSB7CisgICAgICAgICAgICBwYXJhbU5hbWUgPSBtZXRob2RNZXRhLnBhcmFtc1tpXS5uYW1lOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJhbU5hbWUgPSAicGFyYW0iIH4gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbW11dGFibGUgc3RvcmFnZSA9IFBhcmFtZXRlclN0b3JhZ2VDbGFzc1R1cGxlISgKKyAgICAgICAgICAgIG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKVtpXTsKKyAgICAgICAgICBwYXJhbUxpc3Qgfj0gKChzdG9yYWdlICYgUGFyYW1ldGVyU3RvcmFnZUNsYXNzLnJlZl8pID8gInJlZiAiIDogIiIpIH4KKyAgICAgICAgICAgICJQYXJhbWV0ZXJUeXBlVHVwbGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpWyIgfgorICAgICAgICAgICAgdG8hc3RyaW5nKGkpIH4gIl0gIiB+IHBhcmFtTmFtZTsKKyAgICAgICAgICBwYXJhbUFzc2lnbkNvZGUgfj0gImFyZ3MuIiB+IHBhcmFtTmFtZSB+ICIgPSAmIiB+IHBhcmFtTmFtZSB+ICI7XG4iOworICAgICAgICB9CisgICAgICAgIGNvZGUgfj0gIlJldHVyblR5cGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpICIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgICAiKCIgfiBjdGZlSm9pbihwYXJhbUxpc3QpIH4gIikge1xuIjsKKworICAgICAgICBjb2RlIH49ICJpbW11dGFibGUgbWV0aG9kTmFtZSA9IGAiIH4gbWV0aG9kTmFtZSB+ICJgO1xuIjsKKworICAgICAgICBpbW11dGFibGUgcGFyYW1TdHJ1Y3RUeXBlID0KKyAgICAgICAgICAiVFBhcmdzU3RydWN0IShJbnRlcmZhY2UsIGAiIH4gbWV0aG9kTmFtZSB+ICJgKSI7CisgICAgICAgIGNvZGUgfj0gcGFyYW1TdHJ1Y3RUeXBlIH4gIiBhcmdzID0gIiB+IHBhcmFtU3RydWN0VHlwZSB+ICIoKTtcbiI7CisgICAgICAgIGNvZGUgfj0gcGFyYW1Bc3NpZ25Db2RlOworICAgICAgICBjb2RlIH49ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UoYCIgfiBtZXRob2ROYW1lIH4gImAsICI7CisgICAgICAgIGNvZGUgfj0gKChtZXRob2RNZXRhRm91bmQgJiYgbWV0aG9kTWV0YS50eXBlID09IFRNZXRob2RUeXBlLk9ORVdBWSkKKyAgICAgICAgICAgICAgICAgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKTsKKyAgICAgICAgY29kZSB+PSAiLCArK3NlcWlkXykpO1xuIjsKKyAgICAgICAgY29kZSB+PSAiYXJncy53cml0ZShvcHJvdF8pO1xuIjsKKyAgICAgICAgY29kZSB+PSAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpO1xuIjsKKyAgICAgICAgY29kZSB+PSAib3Byb3RfLnRyYW5zcG9ydC5mbHVzaCgpO1xuIjsKKworICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIG9uZXdheSBtZXRob2QsIGdlbmVyYXRlIHRoZSByZWNlaXZpbmcgY29kZS4KKyAgICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgfHwgbWV0aG9kTWV0YS50eXBlICE9IFRNZXRob2RUeXBlLk9ORVdBWSkgeworICAgICAgICAgIGNvZGUgfj0gIlRQcmVzdWx0U3RydWN0IShJbnRlcmZhY2UsIGAiIH4gbWV0aG9kTmFtZSB+ICJgKSByZXN1bHQ7XG4iOworCisgICAgICAgICAgaWYgKCFpcyhSZXR1cm5UeXBlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkgPT0gdm9pZCkpIHsKKyAgICAgICAgICAgIGNvZGUgfj0gIlJldHVyblR5cGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+ICIpIF9yZXR1cm47XG4iOworICAgICAgICAgICAgY29kZSB+PSAicmVzdWx0LnN1Y2Nlc3MgPSAmX3JldHVybjtcbiI7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gVE9ETzogVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBjaGVja3MgZm9yIG1hdGNoaW5nIG1ldGhvZCBuYW1lIGhlcmUsCisgICAgICAgICAgLy8gc2hvdWxkIHdlIGRvIGFzIHdlbGw/CisgICAgICAgICAgY29kZSB+PSBxeworICAgICAgICAgICAgYXV0byBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICAgICAgc2NvcGUgKGV4aXQpIHsKKyAgICAgICAgICAgICAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICAgIGlwcm90Xy50cmFuc3BvcnQucmVhZEVuZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeworICAgICAgICAgICAgICBhdXRvIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG51bGwpOworICAgICAgICAgICAgICB4LnJlYWQoaXByb3RfKTsKKyAgICAgICAgICAgICAgaXByb3RfLnRyYW5zcG9ydC5yZWFkRW5kKCk7CisgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXNnLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLlJFUExZKSB7CisgICAgICAgICAgICAgIHNraXAoaXByb3RfLCBUVHlwZS5TVFJVQ1QpOworICAgICAgICAgICAgICBpcHJvdF8udHJhbnNwb3J0LnJlYWRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSB+ICIgZmFpbGVkOiBPdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2UuIiwKKyAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uVHlwZS5CQURfU0VRVUVOQ0VfSUQKKyAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5yZWFkKGlwcm90Xyk7CisgICAgICAgICAgfTsKKworICAgICAgICAgIGlmIChtZXRob2RNZXRhRm91bmQpIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKGU7IG1ldGhvZE1ldGEuZXhjZXB0aW9ucykgeworICAgICAgICAgICAgICBjb2RlIH49ICJpZiAocmVzdWx0LmlzU2V0IWAiIH4gZS5uYW1lIH4gImApIHRocm93IHJlc3VsdC4iIH4KKyAgICAgICAgICAgICAgICBlLm5hbWUgfiAiO1xuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIWlzKFJldHVyblR5cGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSA9PSB2b2lkKSkgeworICAgICAgICAgICAgY29kZSB+PSBxeworICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU2V0IWBzdWNjZXNzYCkgcmV0dXJuIF9yZXR1cm47CisgICAgICAgICAgICAgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSB+ICIgZmFpbGVkOiBVbmtub3duIHJlc3VsdC4iLAorICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5UeXBlLk1JU1NJTkdfUkVTVUxUCisgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgfQorICAgIH0KKworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogVENsaWVudCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIHRoZSBwcm90b2NvbCB0eXBlcywgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nIElGVEkKKyAqIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXQgNjA4MikpLgorICovCitUQ2xpZW50IShJbnRlcmZhY2UsIFByb3QpIHRDbGllbnQoSW50ZXJmYWNlLCBQcm90KShQcm90IHByb3QpIGlmICgKKyAgaXNTZXJ2aWNlIUludGVyZmFjZSAmJiBpc1RQcm90b2NvbCFQcm90CispIHsKKyAgcmV0dXJuIG5ldyBUQ2xpZW50IShJbnRlcmZhY2UsIFByb3QpKHByb3QpOworfQorCisvLy8gRGl0dG8KK1RDbGllbnQhKEludGVyZmFjZSwgSVByb3QsIE9wcm90KSB0Q2xpZW50KEludGVyZmFjZSwgSVByb3QsIE9Qcm90KQorICAoSVByb3QgaXByb3QsIE9Qcm90IG9wcm90KSBpZiAoCisgIGlzU2VydmljZSFJbnRlcmZhY2UgJiYgaXNUUHJvdG9jb2whSVByb3QgJiYgaXNUUHJvdG9jb2whT1Byb3QKKykgeworICByZXR1cm4gbmV3IFRDbGllbnQhKEludGVyZmFjZSwgSVByb3QsIE9Qcm90KShpcHJvdCwgb3Byb3QpOworfQorCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIGFyZ3VtZW50cyBvZiBhIFRocmlmdCBtZXRob2QgY2FsbCwgYXMgcG9pbnRlcnMgdG8gdGhlIChjb25zdCkKKyAqIHBhcmFtZXRlciB0eXBlIHRvIGF2b2lkIGNvcHlpbmcuCisgKgorICogVGhlcmUgc2hvdWxkIHVzdWFsbHkgYmUgbm8gcmVhc29uIHRvIHVzZSB0aGlzIHN0cnVjdCBkaXJlY3RseSB3aXRob3V0IHRoZQorICogaGVscCBvZiBUQ2xpZW50LCBidXQgaXQgaXMgZG9jdW1lbnRlZCBwdWJsaWNseSB0byBoZWxwIGRlYnVnZ2luZyBpbiBjYXNlCisgKiBvZiBDVEZFIGVycm9ycy4KKyAqCisgKiBDb25zaWRlciB0aGlzIGV4YW1wbGU6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb28geworICogICBpbnQgYmFyKHN0cmluZyBhLCBib29sIGIpOworICoKKyAqICAgZW51bSBtZXRob2RNZXRhID0gWworICogICAgIFRNZXRob2RNZXRhKCJiYXIiLCBbVFBhcmFtTWV0YSgiYSIsIDEpLCBUUGFyYW1NZXRhKCJiIiwgMildKQorICogICBdOworICogfQorICoKKyAqIGFsaWFzIFRQYXJnc1N0cnVjdCEoRm9vLCAiYmFyIikgRm9vQmFyUGFyZ3M7CisgKiAtLS0KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBGb29CYXJQYXJncyBpcyBlcXVpdmFsZW50IHRvIChpZ25vcmluZyB0aGUgbmVjZXNzYXJ5CisgKiBtZXRhZGF0YSB0byBhc3NpZ24gdGhlIGZpZWxkIElEcyk6CisgKiAtLS0KKyAqIHN0cnVjdCBGb29CYXJQYXJncyB7CisgKiAgIGNvbnN0KHN0cmluZykqIGE7CisgKiAgIGNvbnN0KGJvb2wpKiBiOworICoKKyAqICAgdm9pZCB3cml0ZShQcm90b2NvbCkoUHJvdG9jb2wgcHJvdG8pIGNvbnN0IGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCk7CisgKiB9CisgKiAtLS0KKyAqLwordGVtcGxhdGUgVFBhcmdzU3RydWN0KEludGVyZmFjZSwgc3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgc3RhdGljIGFzc2VydChpcyh0eXBlb2YobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSwKKyAgICAiQ291bGQgbm90IGZpbmQgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluICciIH4gSW50ZXJmYWNlLnN0cmluZ29mIH4gIicuIik7CisgIG1peGluKHsKKyAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICBUTWV0aG9kTWV0YSBtZXRob2RNZXRhOworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKEludGVyZmFjZS5tZXRob2RNZXRhKSA6IFRNZXRob2RNZXRhW10pKSB7CisgICAgICBhdXRvIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgaWYgKCFtZXRhLmVtcHR5KSB7CisgICAgICAgIG1ldGhvZE1ldGFGb3VuZCA9IHRydWU7CisgICAgICAgIG1ldGhvZE1ldGEgPSBtZXRhLmZyb250OworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyBtZW1iZXJDb2RlOworICAgIHN0cmluZ1tdIGZpZWxkTWV0YUNvZGVzOworICAgIGZvcmVhY2ggKGksIF87IFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpKSB7CisgICAgICAvLyBJZiB3ZSBoYXZlIG5vIG1ldGEgaW5mb3JtYXRpb24sIGp1c3QgdXNlIHBhcmFtMSwgcGFyYW0yLCBldGMuIGFzCisgICAgICAvLyBmaWVsZCBuYW1lcywgaXQgc2hvdWxkbid0IHJlYWxseSBtYXR0ZXIgYW55d2F5LiAxLWJhc2VkIMK7aW5kZXhpbmfCqworICAgICAgLy8gaXMgdXNlZCB0byBtYXRjaCB0aGUgY29tbW9uIHNjaGVtZSBpbiB0aGUgVGhyaWZ0IHdvcmxkLgorICAgICAgc3RyaW5nIG1lbWJlcklkOworICAgICAgc3RyaW5nIG1lbWJlck5hbWU7CisgICAgICBpZiAobWV0aG9kTWV0YUZvdW5kICYmIGkgPCBtZXRob2RNZXRhLnBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgbWVtYmVySWQgPSB0byFzdHJpbmcobWV0aG9kTWV0YS5wYXJhbXNbaV0uaWQpOworICAgICAgICBtZW1iZXJOYW1lID0gbWV0aG9kTWV0YS5wYXJhbXNbaV0ubmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWJlcklkID0gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgICAgbWVtYmVyTmFtZSA9ICJwYXJhbSIgfiB0byFzdHJpbmcoaSArIDEpOworICAgICAgfQorCisgICAgICAvLyBXb3JrYXJvdW5kIGZvciBETUQgQEBCVUdAQCA2MDU2OiBtYWtlIGFuIGludGVybWVkaWFyeSBhbGlhcyBmb3IgdGhlCisgICAgICAvLyBwYXJhbWV0ZXIgdHlwZSwgYW5kIGRlY2xhcmUgdGhlIG1lbWJlciB1c2luZyBjb25zdChtZW1iZXJOYW1lVHlwZSkqLgorICAgICAgbWVtYmVyQ29kZSB+PSAiYWxpYXMgUGFyYW1ldGVyVHlwZVR1cGxlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfgorICAgICAgICAiKVsiIH4gdG8hc3RyaW5nKGkpIH4gIl0gIiB+IG1lbWJlck5hbWUgfiAiVHlwZTtcbiI7CisgICAgICBtZW1iZXJDb2RlIH49ICJjb25zdCgiIH4gbWVtYmVyTmFtZSB+ICJUeXBlKSogIiB+IG1lbWJlck5hbWUgfiAiO1xuIjsKKworICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYCIgfiBtZW1iZXJOYW1lIH4gImAsICIgfiBtZW1iZXJJZCB+CisgICAgICAgICIsIFRSZXEuT1BUX0lOX1JFUV9PVVQpIjsKKyAgICB9CisKKyAgICBzdHJpbmcgY29kZSA9ICJzdHJ1Y3QgVFBhcmdzU3RydWN0IHtcbiI7CisgICAgY29kZSB+PSBtZW1iZXJDb2RlOworICAgIHZlcnNpb24gKFRWZXJib3NlQ29kZWdlbikgeworICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgJiYKKyAgICAgICAgUGFyYW1ldGVyVHlwZVR1cGxlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkubGVuZ3RoID4gMCkKKyAgICAgIHsKKyAgICAgICAgY29kZSB+PSAicHJhZ21hKG1zZywgYFt0aHJpZnQuY29kZWdlbi5iYXNlLlRQYXJnc1N0cnVjdF0gV2FybmluZzogTm8gIiB+CisgICAgICAgICAgIm1ldGEgaW5mb3JtYXRpb24gZm9yIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiBzZXJ2aWNlICciIH4KKyAgICAgICAgICBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJyBmb3VuZC5gKTtcbiI7CisgICAgICB9CisgICAgfQorICAgIGNvZGUgfj0gInZvaWQgd3JpdGUoUCkoUCBwcm90bykgY29uc3QgaWYgKGlzVFByb3RvY29sIVApIHtcbiI7CisgICAgY29kZSB+PSAid3JpdGVTdHJ1Y3QhKHR5cGVvZih0aGlzKSwgUCwgWyIgfiBjdGZlSm9pbihmaWVsZE1ldGFDb2RlcykgfgorICAgICAgIl0sIHRydWUpKHRoaXMsIHByb3RvKTtcbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQorCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIFRocmlmdCBtZXRob2QgY2FsbCwgdXNpbmcgYSBwb2ludGVyIHRvIHRoZSByZXR1cm4KKyAqIHZhbHVlIHRvIGF2b2lkIGNvcHlpbmcuCisgKgorICogVGhlcmUgc2hvdWxkIHVzdWFsbHkgYmUgbm8gcmVhc29uIHRvIHVzZSB0aGlzIHN0cnVjdCBkaXJlY3RseSB3aXRob3V0IHRoZQorICogaGVscCBvZiBUQ2xpZW50LCBidXQgaXQgaXMgZG9jdW1lbnRlZCBwdWJsaWNseSB0byBoZWxwIGRlYnVnZ2luZyBpbiBjYXNlCisgKiBvZiBDVEZFIGVycm9ycy4KKyAqCisgKiBDb25zaWRlciB0aGlzIGV4YW1wbGU6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb28geworICogICBpbnQgYmFyKHN0cmluZyBhKTsKKyAqCisgKiAgIGFsaWFzIC5Gb29FeGNlcHRpb24gRm9vRXhjZXB0aW9uOworICoKKyAqICAgZW51bSBtZXRob2RNZXRhID0gWworICogICAgIFRNZXRob2RNZXRhKCJiYXIiLAorICogICAgICAgW1RQYXJhbU1ldGEoImEiLCAxKV0sCisgKiAgICAgICBbVEV4Y2VwdGlvbk1ldGEoImZvb2UiLCAxLCAiRm9vRXhjZXB0aW9uIildCisgKiAgICAgKQorICogICBdOworICogfQorICogYWxpYXMgVFByZXN1bHRTdHJ1Y3QhKEZvbywgImJhciIpIEZvb0JhclByZXN1bHQ7CisgKiAtLS0KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBGb29CYXJQcmVzdWx0IGlzIGVxdWl2YWxlbnQgdG8gKGlnbm9yaW5nIHRoZSBuZWNlc3NhcnkKKyAqIG1ldGFkYXRhIHRvIGFzc2lnbiB0aGUgZmllbGQgSURzKToKKyAqIC0tLQorICogc3RydWN0IEZvb0JhclByZXN1bHQgeworICogICBpbnQqIHN1Y2Nlc3M7CisgKiAgIEZvby5Gb29FeGNlcHRpb24gZm9vZTsKKyAqCisgKiAgIHN0cnVjdCBJc1NldEZsYWdzIHsKKyAqICAgICBib29sIHN1Y2Nlc3M7CisgKiAgIH0KKyAqICAgSXNTZXRGbGFncyBpc1NldEZsYWdzOworICoKKyAqICAgYm9vbCBpc1NldChzdHJpbmcgZmllbGROYW1lKSgpIGNvbnN0IEBwcm9wZXJ0eTsKKyAqICAgdm9pZCByZWFkKFByb3RvY29sKShQcm90b2NvbCBwcm90bykgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKTsKKyAqIH0KKyAqIC0tLQorICovCit0ZW1wbGF0ZSBUUHJlc3VsdFN0cnVjdChJbnRlcmZhY2UsIHN0cmluZyBtZXRob2ROYW1lKSB7CisgIHN0YXRpYyBhc3NlcnQoaXModHlwZW9mKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSksCisgICAgIkNvdWxkIG5vdCBmaW5kIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiAnIiB+IEludGVyZmFjZS5zdHJpbmdvZiB+ICInLiIpOworCisgIG1peGluKHsKKyAgICBzdHJpbmcgY29kZSA9ICJzdHJ1Y3QgVFByZXN1bHRTdHJ1Y3Qge1xuIjsKKworICAgIHN0cmluZ1tdIGZpZWxkTWV0YUNvZGVzOworCisgICAgYWxpYXMgUmV0dXJuVHlwZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpIFJlc3VsdFR5cGU7CisgICAgc3RhdGljIGlmICghaXMoUmVzdWx0VHlwZSA9PSB2b2lkKSkgeworICAgICAgY29kZSB+PSBxeworICAgICAgICBSZXR1cm5UeXBlIShtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkqIHN1Y2Nlc3M7CisgICAgICB9OworICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYHN1Y2Nlc3NgLCAwLCBUUmVxLk9QVElPTkFMKSI7CisKKyAgICAgIHN0YXRpYyBpZiAoIWlzTnVsbGFibGUhUmVzdWx0VHlwZSkgeworICAgICAgICBjb2RlIH49IHF7CisgICAgICAgICAgc3RydWN0IElzU2V0RmxhZ3MgeworICAgICAgICAgICAgYm9vbCBzdWNjZXNzOworICAgICAgICAgIH0KKyAgICAgICAgICBJc1NldEZsYWdzIGlzU2V0RmxhZ3M7CisgICAgICAgIH07CisgICAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGBpc1NldEZsYWdzYCwgMCwgVFJlcS5JR05PUkUpIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihJbnRlcmZhY2UubWV0aG9kTWV0YSkgOiBUTWV0aG9kTWV0YVtdKSkgeworICAgICAgYXV0byBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKEludGVyZmFjZS5tZXRob2RNZXRhLCBtZXRob2ROYW1lKTsKKyAgICAgIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICBmb3JlYWNoIChlOyBtZXRhLmZyb250LmV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICBjb2RlIH49ICJJbnRlcmZhY2UuIiB+IGUudHlwZSB+ICIgIiB+IGUubmFtZSB+ICI7XG4iOworICAgICAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGAiIH4gZS5uYW1lIH4gImAsICIgfiB0byFzdHJpbmcoZS5pZCkgfgorICAgICAgICAgICAgIiwgVFJlcS5PUFRJT05BTCkiOworICAgICAgICB9CisgICAgICAgIG1ldGhvZE1ldGFGb3VuZCA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgdmVyc2lvbiAoVFZlcmJvc2VDb2RlZ2VuKSB7CisgICAgICBpZiAoIW1ldGhvZE1ldGFGb3VuZCAmJgorICAgICAgICBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKS5sZW5ndGggPiAwKQorICAgICAgeworICAgICAgICBjb2RlIH49ICJwcmFnbWEobXNnLCBgW3RocmlmdC5jb2RlZ2VuLmJhc2UuVFByZXN1bHRTdHJ1Y3RdIFdhcm5pbmc6IE5vICIgfgorICAgICAgICAgICJtZXRhIGluZm9ybWF0aW9uIGZvciBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gc2VydmljZSAnIiB+CisgICAgICAgICAgSW50ZXJmYWNlLnN0cmluZ29mIH4gIicgZm91bmQuYCk7XG4iOworICAgICAgfQorICAgIH0KKworICAgIGNvZGUgfj0gcXsKKyAgICAgIGJvb2wgaXNTZXQoc3RyaW5nIGZpZWxkTmFtZSkoKSBjb25zdCBAcHJvcGVydHkgaWYgKAorICAgICAgICBpcyhNZW1iZXJUeXBlISh0eXBlb2YodGhpcyksIGZpZWxkTmFtZSkpCisgICAgICApIHsKKyAgICAgICAgc3RhdGljIGlmIChmaWVsZE5hbWUgPT0gInN1Y2Nlc3MiKSB7CisgICAgICAgICAgc3RhdGljIGlmIChpc051bGxhYmxlISh0eXBlb2YoKnN1Y2Nlc3MpKSkgeworICAgICAgICAgICAgcmV0dXJuICpzdWNjZXNzICFpcyBudWxsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaXNTZXRGbGFncy5zdWNjZXNzOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBXZSBhcmUgZGVhbGluZyB3aXRoIGFuIGV4Y2VwdGlvbiBtZW1iZXIsIHdoaWNoLCBiZWluZyBhIG51bGxhYmxlCisgICAgICAgICAgLy8gdHlwZSAoZXhjZXB0aW9ucyBhcmUgYWx3YXlzIGNsYXNzZXMpLCBoYXMgbm8gaXNTZXQgZmxhZy4KKyAgICAgICAgICByZXR1cm4gX190cmFpdHMoZ2V0TWVtYmVyLCB0aGlzLCBmaWVsZE5hbWUpICFpcyBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKworICAgIGNvZGUgfj0gInZvaWQgcmVhZChQKShQIHByb3RvKSBpZiAoaXNUUHJvdG9jb2whUCkge1xuIjsKKyAgICBjb2RlIH49ICJyZWFkU3RydWN0ISh0eXBlb2YodGhpcyksIFAsIFsiIH4gY3RmZUpvaW4oZmllbGRNZXRhQ29kZXMpIH4KKyAgICAgICJdLCB0cnVlKSh0aGlzLCBwcm90byk7XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgY29kZSB+PSAifVxuIjsKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnRfcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudF9wb29sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2Yjc0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnRfcG9vbC5kCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4uY2xpZW50X3Bvb2w7CisKK2ltcG9ydCBjb3JlLnRpbWUgOiBkdXIsIER1cmF0aW9uLCBUaWNrRHVyYXRpb247CitpbXBvcnQgc3RkLnRyYWl0cyA6IFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwucmVzb3VyY2VfcG9vbDsKKworLyoqCisgKiBNYW5hZ2VzIGEgcG9vbCBvZiBUQ2xpZW50cyBmb3IgdGhlIGdpdmVuIGludGVyZmFjZSwgZm9yd2FyZGluZyBSUEMgY2FsbHMgdG8KKyAqIG1lbWJlcnMgb2YgdGhlIHBvb2wuCisgKgorICogSWYgYSByZXF1ZXN0IGZhaWxzLCBhbm90aGVyIGNsaWVudCBmcm9tIHRoZSBwb29sIGlzIHRyaWVkLCBhbmQgb3B0aW9uYWxseSwKKyAqIGEgY2xpZW50IGlzIGRpc2FibGVkIGZvciBhIGNvbmZpZ3VyYWJsZSBhbW91bnQgb2YgdGltZSBpZiBpdCBmYWlscyB0b28KKyAqIG9mdGVuLiBJZiBhbGwgY2xpZW50cyBmYWlsIChhbmQga2VlcFRyeWluZyBpcyBmYWxzZSksIGEKKyAqIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbiBpcyB0aHJvd24sIGNvbnRhaW5pbmcgYWxsIHRoZSBjb2xsZWN0ZWQgUlBDCisgKiBleGNlcHRpb25zLgorICovCitjbGFzcyBUQ2xpZW50UG9vbChJbnRlcmZhY2UpIGlmIChpc1NlcnZpY2UhSW50ZXJmYWNlKSA6IEludGVyZmFjZSB7CisgIC8vLyBTaG9ydGhhbmQgZm9yIFRDbGllbnRCYXNlIUludGVyZmFjZSwgdGhlIGNsaWVudCB0eXBlIHRoaXMgaW5zdGFuY2UKKyAgLy8vIG9wZXJhdGVzIG9uLgorICBhbGlhcyBUQ2xpZW50QmFzZSFJbnRlcmZhY2UgQ2xpZW50OworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGFuZCBhZGRzIHRoZSBnaXZlbiBjbGllbnRzIHRvIHRoZSBwb29sLgorICAgKi8KKyAgdGhpcyhDbGllbnRbXSBjbGllbnRzKSB7CisgICAgcG9vbF8gPSBuZXcgVFJlc291cmNlUG9vbCFDbGllbnQoY2xpZW50cyk7CisKKyAgICBycGNGYXVsdEZpbHRlciA9IChFeGNlcHRpb24gZSkgeworICAgICAgaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworICAgICAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKyAgICAgIHJldHVybiAoCisgICAgICAgIChjYXN0KFRUcmFuc3BvcnRFeGNlcHRpb24pZSAhaXMgbnVsbCkgfHwKKyAgICAgICAgKGNhc3QoVEFwcGxpY2F0aW9uRXhjZXB0aW9uKWUgIWlzIG51bGwpCisgICAgICApOworICAgIH07CisgIH0KKworICAvKioKKyAgICogRXhlY3V0ZXMgYW4gb3BlcmF0aW9uIG9uIHRoZSBmaXJzdCBjdXJyZW50bHkgYWN0aXZlIGNsaWVudC4KKyAgICoKKyAgICogSWYgdGhlIG9wZXJhdGlvbiBmYWlscyAodGhyb3dzIGFuIGV4Y2VwdGlvbiBmb3Igd2hpY2ggcnBjRmF1bHRGaWx0ZXIgaXMKKyAgICogdHJ1ZSksIHRoZSBmYWlsdXJlIGlzIHJlY29yZGVkIGFuZCB0aGUgbmV4dCBjbGllbnQgaW4gdGhlIHBvb2wgaXMgdHJpZWQuCisgICAqCisgICAqIFRocm93czogQW55IG5vbi1ycGMgZXhjZXB0aW9uIHRoYXQgb2NjdXJzLCBhIFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgKiAgIGlmIGFsbCBjbGllbnRzIGZhaWxlZCB3aXRoIGFuIHJwYyBleGNlcHRpb24gKGlmIGtlZXBUcnlpbmcgaXMgZmFsc2UpLgorICAgKgorICAgKiBFeGFtcGxlOgorICAgKiAtLS0KKyAgICogaW50ZXJmYWNlIEZvbyB7IHN0cmluZyBiYXIoKTsgfQorICAgKiBhdXRvIHBvb2xDbGllbnQgPSB0Q2xpZW50UG9vbChbdENsaWVudCFGb28oc29tZVByb3RvY29sKV0pOworICAgKiBhdXRvIHJlc3VsdCA9IHBvb2xDbGllbnQuZXhlY3V0ZSgoYyl7IHJldHVybiBjLmJhcigpOyB9KTsKKyAgICogLS0tCisgICAqLworICBSZXN1bHRUeXBlIGV4ZWN1dGUoUmVzdWx0VHlwZSkoc2NvcGUgUmVzdWx0VHlwZSBkZWxlZ2F0ZShDbGllbnQpIHdvcmspIHsKKyAgICByZXR1cm4gZXhlY3V0ZU9uUG9vbCFDbGllbnQod29yayk7CisgIH0KKworICAvKioKKyAgICogQWRkcyBhIGNsaWVudCB0byB0aGUgcG9vbC4KKyAgICovCisgIHZvaWQgYWRkQ2xpZW50KENsaWVudCBjbGllbnQpIHsKKyAgICBwb29sXy5hZGQoY2xpZW50KTsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmVzIGEgY2xpZW50IGZyb20gdGhlIHBvb2wuCisgICAqCisgICAqIFJldHVybnM6IFdoZXRoZXIgdGhlIGNsaWVudCB3YXMgZm91bmQgaW4gdGhlIHBvb2wuCisgICAqLworICBib29sIHJlbW92ZUNsaWVudChDbGllbnQgY2xpZW50KSB7CisgICAgcmV0dXJuIHBvb2xfLnJlbW92ZShjbGllbnQpOworICB9CisKKyAgbWl4aW4ocG9vbEZvcndhcmRDb2RlIUludGVyZmFjZSgpKTsKKworICAvLy8gV2hldGhlciB0byBvcGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydHMgb2YgYSBjbGllbnQgYmVmb3JlIHRyeWluZyB0bworICAvLy8gZXhlY3V0ZSBhIG1ldGhvZCBpZiB0aGV5IGFyZSBub3Qgb3Blbi4gVGhpcyBpcyB1c3VhbGx5IGRlc2lyYWJsZQorICAvLy8gYmVjYXVzZSBpdCBhbGxvd3MgZS5nLiB0byBhdXRvbWF0aWNhbGx5IHJlY29ubmVjdCB0byBhIHJlbW90ZSBzZXJ2ZXIKKyAgLy8vIGlmIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZHJvcHBlZC4KKyAgLy8vCisgIC8vLyBEZWZhdWx0cyB0byB0cnVlLgorICBib29sIHJlb3BlblRyYW5zcG9ydHMgPSB0cnVlOworCisgIC8vLyBDYWxsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXhjZXB0aW9uIGNvbWVzIGZyb20gYSBjbGllbnQgZnJvbSB0aGUKKyAgLy8vIHBvb2wgbm90IHdvcmtpbmcgcHJvcGVybHksIG9yIGlmIGl0IGFuIGV4Y2VwdGlvbiB0aHJvd24gYXQgdGhlCisgIC8vLyBhcHBsaWNhdGlvbiBsZXZlbC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgZGVsZWdhdGUgcmV0dXJucyB0cnVlLCB0aGUgc2VydmVyL2Nvbm5lY3Rpb24gaXMgY29uc2lkZXJlZCB0byBiZQorICAvLy8gYXQgZmF1bHQsIGlmIGl0IHJldHVybnMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMganVzdCBwYXNzZWQgb24gdG8gdGhlCisgIC8vLyBjYWxsZXIuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCwgcmV0dXJucyB0cnVlIGZvciBpbnN0YW5jZXMgb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbiBhbmQKKyAgLy8vIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGRlbGVnYXRlKEV4Y2VwdGlvbikgcnBjRmF1bHRGaWx0ZXI7CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8ga2VlcCB0cnlpbmcgdG8gZmluZCBhIHdvcmtpbmcgY2xpZW50IGlmIGFsbCBoYXZlIGZhaWxlZCBpbiBhCisgICAqIHJvdy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAqLworICBib29sIGtlZXBUcnlpbmcoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5jeWNsZTsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGtlZXBUcnlpbmcoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBwb29sXy5jeWNsZSA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gdXNlIGEgcmFuZG9tIHBlcm11dGF0aW9uIG9mIHRoZSBjbGllbnQgcG9vbCBvbiBldmVyeSBjYWxsIHRvCisgICAqIGV4ZWN1dGUoKS4gVGhpcyBjYW4gYmUgdXNlZCBlLmcuIGFzIGEgc2ltcGxlIGZvcm0gb2YgbG9hZCBiYWxhbmNpbmcuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAqLworICBib29sIHBlcm11dGVDbGllbnRzKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8ucGVybXV0ZTsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHBlcm11dGVDbGllbnRzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8ucGVybXV0ZSA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZmF1bHRzIGFmdGVyIHdoaWNoIGEgY2xpZW50IGlzIGRpc2FibGVkIHVudGlsCisgICAqIGZhdWx0RGlzYWJsZUR1cmF0aW9uIGhhcyBwYXNzZWQuIDAgdG8gbmV2ZXIgZGlzYWJsZSBjbGllbnRzLgorICAgKgorICAgKiBEZWZhdWx0cyB0byAwLgorICAgKi8KKyAgdXNob3J0IGZhdWx0RGlzYWJsZUNvdW50KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcG9vbF8uZmF1bHREaXNhYmxlQ291bnQ7CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBmYXVsdERpc2FibGVDb3VudCh1c2hvcnQgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgcG9vbF8uZmF1bHREaXNhYmxlQ291bnQgPSB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZHVyYXRpb24gZm9yIHdoaWNoIGEgY2xpZW50IGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIGFmdGVyIGl0IGhhcworICAgKiBmYWlsZWQgdG9vIG9mdGVuLgorICAgKgorICAgKiBEZWZhdWx0cyB0byBvbmUgc2Vjb25kLgorICAgKi8KKyAgRHVyYXRpb24gZmF1bHREaXNhYmxlRHVyYXRpb24oKSBAcHJvcGVydHkgeworICAgIHJldHVybiBwb29sXy5mYXVsdERpc2FibGVEdXJhdGlvbjsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGZhdWx0RGlzYWJsZUR1cmF0aW9uKER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHBvb2xfLmZhdWx0RGlzYWJsZUR1cmF0aW9uID0gdmFsdWU7CisgIH0KKworcHJvdGVjdGVkOgorICBSZXN1bHRUeXBlIGV4ZWN1dGVPblBvb2woUmVzdWx0VHlwZSkoc2NvcGUgUmVzdWx0VHlwZSBkZWxlZ2F0ZShDbGllbnQpIHdvcmspIHsKKyAgICBhdXRvIGNsaWVudHMgPSBwb29sX1tdOworICAgIGlmIChjbGllbnRzLmVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm8gY2xpZW50cyBhdmFpbGFibGUgdG8gdHJ5LiIpOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBFeGNlcHRpb25bXSBycGNFeGNlcHRpb25zOworICAgICAgd2hpbGUgKCFjbGllbnRzLmVtcHR5KSB7CisgICAgICAgIGF1dG8gYyA9IGNsaWVudHMuZnJvbnQ7CisgICAgICAgIGNsaWVudHMucG9wRnJvbnQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc2NvcGUgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHBvb2xfLnJlY29yZFN1Y2Nlc3MoYyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHJlb3BlblRyYW5zcG9ydHMpIHsKKyAgICAgICAgICAgIGMuaW5wdXRQcm90b2NvbC50cmFuc3BvcnQub3BlbigpOworICAgICAgICAgICAgYy5vdXRwdXRQcm90b2NvbC50cmFuc3BvcnQub3BlbigpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiB3b3JrKGMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGlmIChycGNGYXVsdEZpbHRlciAmJiBycGNGYXVsdEZpbHRlcihlKSkgeworICAgICAgICAgICAgcG9vbF8ucmVjb3JkRmF1bHQoYyk7CisgICAgICAgICAgICBycGNFeGNlcHRpb25zIH49IGU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBkZWFsaW5nIHdpdGggYSBub3JtYWwgZXhjZXB0aW9uIHRocm93biBieSB0aGUKKyAgICAgICAgICAgIC8vIHNlcnZlci1zaWRlIG1ldGhvZCwganVzdCBwYXNzIGl0IG9uLiBBcyBmYXIgYXMgd2UgYXJlCisgICAgICAgICAgICAvLyBjb25jZXJuZWQsIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkZWQuCisgICAgICAgICAgICBwb29sXy5yZWNvcmRTdWNjZXNzKGMpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIG5vIGNsaWVudCBzdWNjZWVkZWQgZHVyaW5nIHRoZSBjdXJyZW50IGl0ZXJhdGlvbi4KKyAgICAgIER1cmF0aW9uIHdhaXRUaW1lOworICAgICAgQ2xpZW50IGR1bW15OworICAgICAgaWYgKGNsaWVudHMud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15LCB3YWl0VGltZSkpIHsKKyAgICAgICAgaWYgKHdhaXRUaW1lID4gZHVyISJobnNlY3MiKDApKSB7CisgICAgICAgICAgaW1wb3J0IGNvcmUudGhyZWFkOworICAgICAgICAgIFRocmVhZC5zbGVlcCh3YWl0VGltZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oIkFsbCBjbGllbnRzIGZhaWxlZC4iLAorICAgICAgICAgIHJwY0V4Y2VwdGlvbnMpOworICAgICAgfQorICAgIH0KKyAgfQorCitwcml2YXRlOgorICBUUmVzb3VyY2VQb29sIUNsaWVudCBwb29sXzsKK30KKworcHJpdmF0ZSB7CisgIC8vIENhbm5vdCB1c2UgYW4gYW5vbnltb3VzIGRlbGVnYXRlIGxpdGVyYWwgZm9yIHRoaXMgYmVjYXVzZSB0aGV5IGFyZW4ndAorICAvLyBhbGxvd2VkIGluIGNsYXNzIHNjb3BlLgorICBzdHJpbmcgcG9vbEZvcndhcmRDb2RlKEludGVyZmFjZSkoKSB7CisgICAgc3RyaW5nIGNvZGUgPSAiIjsKKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IEFsbE1lbWJlck1ldGhvZE5hbWVzIUludGVyZmFjZSkgeworICAgICAgZW51bSBxbiA9ICJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWU7CisgICAgICBjb2RlIH49ICJSZXR1cm5UeXBlISgiIH4gcW4gfiAiKSAiIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICIoUGFyYW1ldGVyVHlwZVR1cGxlISgiIH4gcW4gfiAiKSBhcmdzKSB7XG4iOworICAgICAgY29kZSB+PSAicmV0dXJuIGV4ZWN1dGVPblBvb2woKENsaWVudCBjKXsgcmV0dXJuIGMuIiB+CisgICAgICAgIG1ldGhvZE5hbWUgfiAiKGFyZ3MpOyB9KTtcbiI7CisgICAgICBjb2RlIH49ICJ9XG4iOworICAgIH0KKworICAgIHJldHVybiBjb2RlOworICB9Cit9CisKKy8qKgorICogVENsaWVudFBvb2wgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSBzcGVjaWZ5CisgKiB0aGUgaW50ZXJmYWNlIHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZyBJRlRJCisgKiAoc2VlICQoRE1EQlVHIDYwODIsIEQgQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVENsaWVudFBvb2whSW50ZXJmYWNlIHRDbGllbnRQb29sKEludGVyZmFjZSkoCisgIFRDbGllbnRCYXNlIUludGVyZmFjZVtdIGNsaWVudHMKKykgaWYgKGlzU2VydmljZSFJbnRlcmZhY2UpIHsKKyAgcmV0dXJuIG5ldyB0eXBlb2YocmV0dXJuKShjbGllbnRzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9pZGxnZW4uZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9pZGxnZW4uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg4OTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kCkBAIC0wLDAgKzEsNzcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQ29udGFpbnMgPGI+ZXhwZXJpbWVudGFsPC9iPiBmdW5jdGlvbmFsaXR5IGZvciBnZW5lcmF0aW5nIFRocmlmdCBJREwgZmlsZXMKKyAqICgudGhyaWZ0KSBmcm9tIGV4aXN0aW5nIEQgZGF0YSBzdHJ1Y3R1cmVzLCBpLmUuIHRoZSByZXZlcnNlIG9mIHdoYXQgdGhlCisgKiBUaHJpZnQgY29tcGlsZXIgZG9lcy4KKyAqLworbW9kdWxlIHRocmlmdC5jb2RlZ2VuLmlkbGdlbjsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBmaW5kOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udDsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC50cmFpdHMgOiBFbnVtTWVtYmVycywgaXNTb21lRnVuY3Rpb24sIE9yaWdpbmFsVHlwZSwKKyAgUGFyYW1ldGVyVHlwZVR1cGxlLCBSZXR1cm5UeXBlOworaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBhbGxTYXRpc2Z5LCBzdGF0aWNJbmRleE9mLCBzdGF0aWNNYXAsIE5vRHVwbGljYXRlcywKKyAgVHlwZVR1cGxlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmN0ZmU7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKKworLyoqCisgKiBUcnVlIGlmIHRoZSBwYXNzZWQgdHlwZSBpcyBhIFRocmlmdCBlbnRpdHkgKHN0cnVjdCwgZXhjZXB0aW9uLCBlbnVtLAorICogc2VydmljZSkuCisgKi8KK2FsaWFzIEFueSEoaXNTdHJ1Y3QsIGlzRXhjZXB0aW9uLCBpc0VudW0sIGlzU2VydmljZSkgaXNUaHJpZnRFbnRpdHk7CisKKy8qKgorICogUmV0dXJucyBhbiBJREwgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHBhc3NlZCDCu3Jvb3TCqyBlbnRpdGllcyBhbmQgYWxsIHR5cGVzCisgKiB0aGV5IGRlcGVuZCBvbi4KKyAqLwordGVtcGxhdGUgaWRsU3RyaW5nKFJvb3RzLi4uKSBpZiAoYWxsU2F0aXNmeSEoaXNUaHJpZnRFbnRpdHksIFJvb3RzKSkgeworICBlbnVtIGlkbFN0cmluZyA9IGlkbFN0cmluZ0ltcGwhUm9vdHMucmVzdWx0OworfQorCitwcml2YXRlIHsKKyAgdGVtcGxhdGUgaWRsU3RyaW5nSW1wbChSb290cy4uLikgaWYgKGFsbFNhdGlzZnkhKGlzVGhyaWZ0RW50aXR5LCBSb290cykpIHsKKyAgICBhbGlhcyBGb3JBbGxXaXRoTGlzdCEoCisgICAgICBDb25maW5lZFR1cGxlIShTdGF0aWNGaWx0ZXIhKGlzU2VydmljZSwgUm9vdHMpKSwKKyAgICAgIEFkZEJhc2VTZXJ2aWNlcworICAgICkgU2VydmljZXM7CisKKyAgICBhbGlhcyBUeXBlVHVwbGUhKAorICAgICAgU3RhdGljRmlsdGVyIShpc0VudW0sIFJvb3RzKSwKKyAgICAgIEZvckFsbFdpdGhMaXN0ISgKKyAgICAgICAgQ29uZmluZWRUdXBsZSEoCisgICAgICAgICAgU3RhdGljRmlsdGVyIShBbnkhKGlzRXhjZXB0aW9uLCBpc1N0cnVjdCksIFJvb3RzKSwKKyAgICAgICAgICBzdGF0aWNNYXAhKENvbXBvc2l0ZVR5cGVEZXBzLCBzdGF0aWNNYXAhKFNlcnZpY2VUeXBlRGVwcywgU2VydmljZXMpKQorICAgICAgICApLAorICAgICAgICBBZGRTdHJ1Y3RXaXRoRGVwcworICAgICAgKQorICAgICkgVHlwZXM7CisKKyAgICBlbnVtIHJlc3VsdCA9IGN0ZmVKb2luKAorICAgICAgWworICAgICAgICBzdGF0aWNNYXAhKAorICAgICAgICAgIGVudW1JZGxTdHJpbmcsCisgICAgICAgICAgU3RhdGljRmlsdGVyIShpc0VudW0sIFR5cGVzKQorICAgICAgICApLAorICAgICAgICBzdGF0aWNNYXAhKAorICAgICAgICAgIHN0cnVjdElkbFN0cmluZywKKyAgICAgICAgICBTdGF0aWNGaWx0ZXIhKEFueSEoaXNTdHJ1Y3QsIGlzRXhjZXB0aW9uKSwgVHlwZXMpCisgICAgICAgICksCisgICAgICAgIHN0YXRpY01hcCEoCisgICAgICAgICAgc2VydmljZUlkbFN0cmluZywKKyAgICAgICAgICBTZXJ2aWNlcworICAgICAgICApCisgICAgICBdLAorICAgICAgIlxuIgorICAgICk7CisgIH0KKworICB0ZW1wbGF0ZSBTZXJ2aWNlVHlwZURlcHMoVCkgaWYgKGlzU2VydmljZSFUKSB7CisgICAgYWxpYXMgc3RhdGljTWFwISgKKyAgICAgIFBBcHBseSEoTWV0aG9kVHlwZURlcHMsIFQpLAorICAgICAgRmlsdGVyTWV0aG9kTmFtZXMhKFQsIF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKSkKKyAgICApIFNlcnZpY2VUeXBlRGVwczsKKyAgfQorCisgIHRlbXBsYXRlIE1ldGhvZFR5cGVEZXBzKFQsIHN0cmluZyBuYW1lKSBpZiAoCisgICAgaXNTZXJ2aWNlIVQgJiYgaXNTb21lRnVuY3Rpb24hKE1lbWJlclR5cGUhKFQsIG5hbWUpKQorICApIHsKKyAgICBhbGlhcyBUeXBlVHVwbGUhKAorICAgICAgUmV0dXJuVHlwZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpLAorICAgICAgUGFyYW1ldGVyVHlwZVR1cGxlIShNZW1iZXJUeXBlIShULCBuYW1lKSksCisgICAgICBFeGNlcHRpb25UeXBlcyEoVCwgbmFtZSkKKyAgICApIE1ldGhvZFR5cGVEZXBzOworICB9CisKKyAgdGVtcGxhdGUgRXhjZXB0aW9uVHlwZXMoVCwgc3RyaW5nIG5hbWUpIGlmICgKKyAgICBpc1NlcnZpY2UhVCAmJiBpc1NvbWVGdW5jdGlvbiEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpCisgICkgeworICAgIG1peGluKHsKKyAgICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChnZXRNZXRob2RNZXRhIVQsIG5hbWUpOworICAgICAgaWYgKG1ldGEuZW1wdHkpIHJldHVybiAiYWxpYXMgVHlwZVR1cGxlISgpIEV4Y2VwdGlvblR5cGVzOyI7CisKKyAgICAgIHN0cmluZyByZXN1bHQgPSAiYWxpYXMgVHlwZVR1cGxlISgiOworICAgICAgZm9yZWFjaCAoaSwgZTsgbWV0YS5mcm9udC5leGNlcHRpb25zKSB7CisgICAgICAgIGlmIChpID4gMCkgcmVzdWx0IH49ICIsICI7CisgICAgICAgIHJlc3VsdCB+PSAibWl4aW4oYFQuIiB+IGUudHlwZSB+ICJgKSI7CisgICAgICB9CisgICAgICByZXN1bHQgfj0gIikgRXhjZXB0aW9uVHlwZXM7IjsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSgpKTsKKyAgfQorCisgIHRlbXBsYXRlIEFkZEJhc2VTZXJ2aWNlcyhULCBMaXN0Li4uKSB7CisgICAgc3RhdGljIGlmIChzdGF0aWNJbmRleE9mIShULCBMaXN0KSA9PSAtMSkgeworICAgICAgYWxpYXMgTm9EdXBsaWNhdGVzIShCYXNlU2VydmljZXMhVCwgTGlzdCkgQWRkQmFzZVNlcnZpY2VzOworICAgIH0gZWxzZSB7CisgICAgICBhbGlhcyBMaXN0IEFkZFN0cnVjdFdpdGhEZXBzOworICAgIH0KKyAgfQorCisgIHVuaXR0ZXN0IHsKKyAgICBpbnRlcmZhY2UgQSB7fQorICAgIGludGVyZmFjZSBCIDogQSB7fQorICAgIGludGVyZmFjZSBDIDogQiB7fQorICAgIGludGVyZmFjZSBEIDogQSB7fQorCisgICAgc3RhdGljIGFzc2VydChpcyhBZGRCYXNlU2VydmljZXMhKEMpID09IFR5cGVUdXBsZSEoQSwgQiwgQykpKTsKKyAgICBzdGF0aWMgYXNzZXJ0KGlzKEZvckFsbFdpdGhMaXN0IShDb25maW5lZFR1cGxlIShDLCBEKSwgQWRkQmFzZVNlcnZpY2VzKSA9PQorICAgICAgVHlwZVR1cGxlIShBLCBELCBCLCBDKSkpOworICB9CisKKyAgdGVtcGxhdGUgQmFzZVNlcnZpY2VzKFQsIFJlc3QuLi4pIGlmIChpc1NlcnZpY2UhVCkgeworICAgIHN0YXRpYyBpZiAoaXNEZXJpdmVkU2VydmljZSFUKSB7CisgICAgICBhbGlhcyBCYXNlU2VydmljZXMhKEJhc2VTZXJ2aWNlIVQsIFQsIFJlc3QpIEJhc2VTZXJ2aWNlczsKKyAgICB9IGVsc2UgeworICAgICAgYWxpYXMgVHlwZVR1cGxlIShULCBSZXN0KSBCYXNlU2VydmljZXM7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgQWRkU3RydWN0V2l0aERlcHMoVCwgTGlzdC4uLikgeworICAgIHN0YXRpYyBpZiAoc3RhdGljSW5kZXhPZiEoVCwgTGlzdCkgPT0gLTEpIHsKKyAgICAgIC8vIFQgaXMgbm90IGFscmVhZHkgaW4gdGhlIExpc3QsIHNvIGFkZCBUIGFuZCB0aGUgdHlwZXMgaXQgZGVwZW5kcyBvbiBpbgorICAgICAgLy8gdGhlIGZyb250LiBCZWNhdXNlIHdpdGggdGhlIFRocmlmdCBjb21waWxlciB0eXBlcyBjYW4gb25seSBkZXBlbmQgb24KKyAgICAgIC8vIG90aGVyIHR5cGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgd2UgY29sbGVjdCBhbGwgdGhlCisgICAgICAvLyBkZXBlbmRlbmNpZXMsIHByZXBlbmQgdGhlbSB0byB0aGUgbGlzdCwgYW5kIHRoZW4gcHJ1bmUgdGhlIGR1cGxpY2F0ZXMKKyAgICAgIC8vIChrZWVwaW5nIHRoZSBmaXJzdCBvY2N1cnJlbmNlcykuIElmIHRoaXMgcmVxdWlyZW1lbnQgc2hvdWxkIGV2ZXIgYmUKKyAgICAgIC8vIGRyb3BwZWQgZnJvbSBUaHJpZnQsIHRoaXMgY291bGQgYmUgZWFzaWx5IGFkYXB0ZWQgdG8gaGFuZGxlIGNpcmN1bGFyCisgICAgICAvLyBkZXBlbmRlbmNpZXMgYnkgcGFzc2luZyBUeXBlVHVwbGUhKFQsIExpc3QpIHRvIEZvckFsbFdpdGhMaXN0IGluc3RlYWQKKyAgICAgIC8vIG9mIGFwcGVuZGluZyBMaXN0IGFmdGVyd2FyZHMsIGFuZCByZW1vdmluZyB0aGUgbm93IHVubmVjZXNzYXJ5CisgICAgICAvLyBOb0R1cGxpY2F0ZXMuCisgICAgICBhbGlhcyBOb0R1cGxpY2F0ZXMhKAorICAgICAgICBGb3JBbGxXaXRoTGlzdCEoCisgICAgICAgICAgQ29uZmluZWRUdXBsZSEoCisgICAgICAgICAgICBzdGF0aWNNYXAhKAorICAgICAgICAgICAgICBDb21wb3NpdGVUeXBlRGVwcywKKyAgICAgICAgICAgICAgc3RhdGljTWFwISgKKyAgICAgICAgICAgICAgICBQQXBwbHkhKE1lbWJlclR5cGUsIFQpLAorICAgICAgICAgICAgICAgIEZpZWxkTmFtZXMhVAorICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICAgKSwKKyAgICAgICAgICAuQWRkU3RydWN0V2l0aERlcHMsCisgICAgICAgICAgVAorICAgICAgICApLAorICAgICAgICBMaXN0CisgICAgICApIEFkZFN0cnVjdFdpdGhEZXBzOworICAgIH0gZWxzZSB7CisgICAgICBhbGlhcyBMaXN0IEFkZFN0cnVjdFdpdGhEZXBzOworICAgIH0KKyAgfQorCisgIHZlcnNpb24gKHVuaXR0ZXN0KSB7CisgICAgc3RydWN0IEEge30KKyAgICBzdHJ1Y3QgQiB7CisgICAgICBBIGE7CisgICAgICBpbnQgYjsKKyAgICAgIEEgYzsKKyAgICAgIHN0cmluZyBkOworICAgIH0KKyAgICBzdHJ1Y3QgQyB7CisgICAgICBCIGI7CisgICAgICBBIGE7CisgICAgfQorCisgICAgc3RhdGljIGFzc2VydChpcyhBZGRTdHJ1Y3RXaXRoRGVwcyFDID09IFR5cGVUdXBsZSEoQSwgQiwgQykpKTsKKworICAgIHN0cnVjdCBEIHsKKyAgICAgIEMgYzsKKyAgICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbVEZpZWxkTWV0YSgiYyIsIDAsIFRSZXEuSUdOT1JFKV0pOworICAgIH0KKyAgICBzdGF0aWMgYXNzZXJ0KGlzKEFkZFN0cnVjdFdpdGhEZXBzIUQgPT0gVHlwZVR1cGxlIShEKSkpOworICB9CisKKyAgdmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgICAvLyBDaXJjbGVzIGluIHRoZSB0eXBlIGRlcGVuZGVuY3kgZ3JhcGggYXJlIG5vdCBhbGxvd2VkIGluIFRocmlmdCwgYnV0IG1ha2UKKyAgICAvLyBzdXJlIHdlIGZhaWwgaW4gYSBzYW5lIHdheSBpbnN0ZWFkIG9mIGNyYXNoaW5nIHRoZSBjb21waWxlci4KKworICAgIHN0cnVjdCBSZWMxIHsKKyAgICAgIFJlYzJbXSBvdGhlcjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgUmVjMiB7CisgICAgICBSZWMxW10gb3RoZXI7CisgICAgfQorCisgICAgc3RhdGljIGFzc2VydCghX190cmFpdHMoY29tcGlsZXMsIEFkZFN0cnVjdFdpdGhEZXBzIVJlYzEpKTsKKyAgfQorCisgIC8qCisgICAqIFJldHVybnMgdGhlIG5vbi1wcmltaXRpdmUgdHlwZXMgVCBkaXJlY3RseSBkZXBlbmRzIG9uLgorICAgKgorICAgKiBGb3IgZXhhbXBsZSwgQ29tcG9zaXRlVHlwZURlcHMhaW50IHdvdWxkIHlpZWxkIGFuIGVtcHR5IHR5cGUgdHVwbGUsCisgICAqIENvbXBvc2l0ZVR5cGVEZXBzIVNvbWVTdHJ1Y3Qgd291bGQgZ2l2ZSBTb21lU3RydWN0LCBhbmQKKyAgICogQ29tcG9zaXRlVHlwZURlcHMhKEFbQl0pIGJvdGggQ29tcG9zaXRlVHlwZURlcHMhQSBhbmQgQ29tcG9zaXRlVHlwZURlcHMhQi4KKyAgICovCisgIHRlbXBsYXRlIENvbXBvc2l0ZVR5cGVEZXBzKFQpIHsKKyAgICBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYm9vbCkgfHwgaXMoRnVsbHlVbnF1YWwhVCA9PSBieXRlKSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA9PSBzaG9ydCkgfHwgaXMoRnVsbHlVbnF1YWwhVCA9PSBpbnQpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUID09IGxvbmcpIHx8IGlzKEZ1bGx5VW5xdWFsIVQgOiBzdHJpbmcpIHx8CisgICAgICBpcyhGdWxseVVucXVhbCFUID09IGRvdWJsZSkgfHwgaXMoRnVsbHlVbnF1YWwhVCA9PSB2b2lkKQorICAgICkgeworICAgICAgYWxpYXMgVHlwZVR1cGxlISgpIENvbXBvc2l0ZVR5cGVEZXBzOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgXyA6IFVbXSwgVSkpIHsKKyAgICAgIGFsaWFzIENvbXBvc2l0ZVR5cGVEZXBzIVUgQ29tcG9zaXRlVHlwZURlcHM7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogSGFzaFNldCFFLCBFKSkgeworICAgICAgYWxpYXMgQ29tcG9zaXRlVHlwZURlcHMhRSBDb21wb3NpdGVUeXBlRGVwczsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgYWxpYXMgVHlwZVR1cGxlIShDb21wb3NpdGVUeXBlRGVwcyFLLCBDb21wb3NpdGVUeXBlRGVwcyFWKSBDb21wb3NpdGVUeXBlRGVwczsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGVudW0pIHx8IGlzKEZ1bGx5VW5xdWFsIVQgPT0gc3RydWN0KSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA6IFRFeGNlcHRpb24pCisgICAgKSB7CisgICAgICBhbGlhcyBUeXBlVHVwbGUhKEZ1bGx5VW5xdWFsIVQpIENvbXBvc2l0ZVR5cGVEZXBzOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IFQuc3RyaW5nb2YpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgYW4gSURMIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwYXNzZWQgc2VydmljZS4gSURMIGNvZGUgZm9yIGFueSB0eXBlCisgKiBkZXBlbmRjaWVzIGlzIG5vdCBpbmNsdWRlZC4KKyAqLwordGVtcGxhdGUgc2VydmljZUlkbFN0cmluZyhUKSBpZiAoaXNTZXJ2aWNlIVQpIHsKKyAgZW51bSBzZXJ2aWNlSWRsU3RyaW5nID0geworICAgIHN0cmluZyByZXN1bHQgPSAic2VydmljZSAiIH4gVC5zdHJpbmdvZjsKKyAgICBzdGF0aWMgaWYgKGlzRGVyaXZlZFNlcnZpY2UhVCkgeworICAgICAgcmVzdWx0IH49ICIgZXh0ZW5kcyAiIH4gQmFzZVNlcnZpY2UhVC5zdHJpbmdvZjsKKyAgICB9CisgICAgcmVzdWx0IH49ICIge1xuIjsKKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IEZpbHRlck1ldGhvZE5hbWVzIShULCBfX3RyYWl0cyhkZXJpdmVkTWVtYmVycywgVCkpKSB7CisgICAgICByZXN1bHQgfj0gIiAgIjsKKworICAgICAgZW51bSBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKFQubWV0aG9kTWV0YSwgbWV0aG9kTmFtZSk7CisKKyAgICAgIHN0YXRpYyBpZiAoIW1ldGEuZW1wdHkgJiYgbWV0YS5mcm9udC50eXBlID09IFRNZXRob2RUeXBlLk9ORVdBWSkgeworICAgICAgICByZXN1bHQgfj0gIm9uZXdheSAiOworICAgICAgfQorCisgICAgICBhbGlhcyBSZXR1cm5UeXBlIShNZW1iZXJUeXBlIShULCBtZXRob2ROYW1lKSkgUlQ7CisgICAgICBzdGF0aWMgaWYgKGlzKFJUID09IHZvaWQpKSB7CisgICAgICAgIC8vIFdlIHNwZWNpYWwtY2FzZSB0aGlzIGhlcmUgaW5zdGVhZCBvZiBhZGRpbmcgdm9pZCB0byBkVG9JZGxUeXBlIHRvCisgICAgICAgIC8vIGF2b2lkIGFjY2VwdGluZyB0aGluZ3MgbGlrZSB2b2lkW10uCisgICAgICAgIHJlc3VsdCB+PSAidm9pZCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0IH49IGRUb0lkbFR5cGUhUlQgfiAiICI7CisgICAgICB9CisgICAgICByZXN1bHQgfj0gbWV0aG9kTmFtZSB+ICIoIjsKKworICAgICAgc2hvcnQgbGFzdElkOworICAgICAgZm9yZWFjaCAoaSwgUGFyYW1UeXBlOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKE1lbWJlclR5cGUhKFQsIG1ldGhvZE5hbWUpKSkgeworICAgICAgICBzdGF0aWMgaWYgKCFtZXRhLmVtcHR5ICYmIGkgPCBtZXRhLmZyb250LnBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgICBlbnVtIGhhdmVQTSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZW51bSBoYXZlUE0gPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNob3J0IGlkOworICAgICAgICBzdGF0aWMgaWYgKGhhdmVQTSkgeworICAgICAgICAgIGlkID0gbWV0YS5mcm9udC5wYXJhbXNbaV0uaWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWQgPSAtLWxhc3RJZDsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZyBwYXJhbU5hbWU7CisgICAgICAgIHN0YXRpYyBpZiAoaGF2ZVBNKSB7CisgICAgICAgICAgcGFyYW1OYW1lID0gbWV0YS5mcm9udC5wYXJhbXNbaV0ubmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJhbU5hbWUgPSAicGFyYW0iIH4gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCB+PSB0byFzdHJpbmcoaWQpIH4gIjogIiB+IGRUb0lkbFR5cGUhUGFyYW1UeXBlIH4gIiAiIH4gcGFyYW1OYW1lOworCisgICAgICAgIHN0YXRpYyBpZiAoaGF2ZVBNICYmICFtZXRhLmZyb250LnBhcmFtc1tpXS5kZWZhdWx0VmFsdWUuZW1wdHkpIHsKKyAgICAgICAgICByZXN1bHQgfj0gIiA9ICIgfiBkVG9JZGxDb25zdChtaXhpbihtZXRhLmZyb250LnBhcmFtc1tpXS5kZWZhdWx0VmFsdWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBnZXR0aW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBwYXJhbWV0ZXJzIGZyb20gYQorICAgICAgICAgIC8vIGZ1bmN0aW9uIGFsaWFzIGlzbid0IHBvc3NpYmxlIOKAkyB3ZSBjYW4ndCB0cmFuc2ZlciB0aGUgZGVmYXVsdAorICAgICAgICAgIC8vIHZhbHVlIHRvIHRoZSBJREwgZS5nLiBmb3IgaW50ZXJmYWNlIEZvbyB7IHZvaWQgZm9vKGludCBhID0gNSk7IH0KKyAgICAgICAgICAvLyB3aXRob3V0IHRoZSB1c2VyIGV4cGxpY2l0bHkgZGVjbGFyaW5nIGl0IGluIG1ldGFkYXRhLgorICAgICAgICB9CisgICAgICAgIHJlc3VsdCB+PSAiLCAiOworICAgICAgfQorICAgICAgcmVzdWx0IH49ICIpIjsKKworICAgICAgc3RhdGljIGlmICghbWV0YS5lbXB0eSAmJiAhbWV0YS5mcm9udC5leGNlcHRpb25zLmVtcHR5KSB7CisgICAgICAgIHJlc3VsdCB+PSAiIHRocm93cyAoIjsKKyAgICAgICAgZm9yZWFjaCAoZTsgbWV0YS5mcm9udC5leGNlcHRpb25zKSB7CisgICAgICAgICAgcmVzdWx0IH49IHRvIXN0cmluZyhlLmlkKSB+ICI6ICIgfiBlLnR5cGUgfiAiICIgfiBlLm5hbWUgfiAiLCAiOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCB+PSAiKSI7CisgICAgICB9CisKKyAgICAgIHJlc3VsdCB+PSAiLFxuIjsKKyAgICB9CisKKyAgICByZXN1bHQgfj0gIn1cbiI7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSgpOworfQorCisvKioKKyAqIFJldHVybnMgYW4gSURMIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwYXNzZWQgZW51bS4gSURMIGNvZGUgZm9yIGFueSB0eXBlCisgKiBkZXBlbmRjaWVzIGlzIG5vdCBpbmNsdWRlZC4KKyAqLwordGVtcGxhdGUgZW51bUlkbFN0cmluZyhUKSBpZiAoaXNFbnVtIVQpIHsKKyAgZW51bSBlbnVtSWRsU3RyaW5nID0geworICAgIHN0YXRpYyBhc3NlcnQoaXMoT3JpZ2luYWxUeXBlIVQgOiBsb25nKSwKKyAgICAgICJDYW4gb25seSBoYXZlIGludGVnZXIgZW51bXMgaW4gVGhyaWZ0IChub3QgIiB+IE9yaWdpbmFsVHlwZSFULnN0cmluZ29mIH4KKyAgICAgICIsIGZvciAiIH4gVC5zdHJpbmdvZiB+ICIpLiIpOworCisgICAgc3RyaW5nIHJlc3VsdCA9ICJlbnVtICIgfiBULnN0cmluZ29mIH4gIiB7XG4iOworCisgICAgZm9yZWFjaCAobmFtZTsgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpKSB7CisgICAgICByZXN1bHQgfj0gIiAgIiB+IG5hbWUgfiAiID0gIiB+IGRUb0lkbENvbnN0KEdldE1lbWJlciEoVCwgbmFtZSkpIH4gIixcbiI7CisgICAgfQorCisgICAgcmVzdWx0IH49ICJ9XG4iOworICAgIHJldHVybiByZXN1bHQ7CisgIH0oKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIElETCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcGFzc2VkIHN0cnVjdC4gSURMIGNvZGUgZm9yIGFueSB0eXBlCisgKiBkZXBlbmRjaWVzIGlzIG5vdCBpbmNsdWRlZC4KKyAqLwordGVtcGxhdGUgc3RydWN0SWRsU3RyaW5nKFQpIGlmIChpc1N0cnVjdCFUIHx8IGlzRXhjZXB0aW9uIVQpIHsKKyAgZW51bSBzdHJ1Y3RJZGxTdHJpbmcgPSB7CisgICAgbWl4aW4oeworICAgICAgc3RyaW5nIGNvZGUgPSAiIjsKKyAgICAgIGZvcmVhY2ggKGZpZWxkOyBnZXRGaWVsZE1ldGEhVCkgeworICAgICAgICBjb2RlIH49ICJzdGF0aWMgYXNzZXJ0KGlzKE1lbWJlclR5cGUhKFQsIGAiIH4gZmllbGQubmFtZSB+ICJgKSkpO1xuIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjb2RlOworICAgIH0oKSk7CisKKyAgICBzdHJpbmcgcmVzdWx0OworICAgIHN0YXRpYyBpZiAoaXNFeGNlcHRpb24hVCkgeworICAgICAgcmVzdWx0ID0gImV4Y2VwdGlvbiAiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSAic3RydWN0ICI7CisgICAgfQorICAgIHJlc3VsdCB+PSBULnN0cmluZ29mIH4gIiB7XG4iOworCisgICAgLy8gVGhlIGxhc3QgYXV0b21hdGljYWxseSBhc3NpZ25lZCBpZCDigJMgZmllbGRzIHdpdGggbm8gbWV0YSBpbmZvcm1hdGlvbgorICAgIC8vIGFyZSBhc3NpZ25lZCAoaW4gbGV4aWNhbCBvcmRlcikgZGVzY2VuZGluZyBuZWdhdGl2ZSBpZHMsIHN0YXJ0aW5nIHdpdGgKKyAgICAvLyAtMSwganVzdCBsaWtlIHRoZSBUaHJpZnQgY29tcGlsZXIgZG9lcy4KKyAgICBzaG9ydCBsYXN0SWQ7CisKKyAgICBmb3JlYWNoIChuYW1lOyBGaWVsZE5hbWVzIVQpIHsKKyAgICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChnZXRGaWVsZE1ldGEhVCwgbmFtZSk7CisKKyAgICAgIHN0YXRpYyBpZiAobWV0YS5lbXB0eSB8fCBtZXRhLmZyb250LnJlcSAhPSBUUmVxLklHTk9SRSkgeworICAgICAgICBzaG9ydCBpZDsKKyAgICAgICAgc3RhdGljIGlmIChtZXRhLmVtcHR5KSB7CisgICAgICAgICAgaWQgPSAtLWxhc3RJZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZCA9IG1ldGEuZnJvbnQuaWQ7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgfj0gIiAgIiB+IHRvIXN0cmluZyhpZCkgfiAiOiI7CisgICAgICAgIHN0YXRpYyBpZiAoIW1ldGEuZW1wdHkpIHsKKyAgICAgICAgICByZXN1bHQgfj0gZFRvSWRsUmVxKG1ldGEuZnJvbnQucmVxKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgfj0gIiAiIH4gZFRvSWRsVHlwZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpIH4gIiAiIH4gbmFtZTsKKworICAgICAgICBzdGF0aWMgaWYgKCFtZXRhLmVtcHR5ICYmICFtZXRhLmZyb250LmRlZmF1bHRWYWx1ZS5lbXB0eSkgeworICAgICAgICAgIHJlc3VsdCB+PSAiID0gIiB+IGRUb0lkbENvbnN0KG1peGluKG1ldGEuZnJvbnQuZGVmYXVsdFZhbHVlKSk7CisgICAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKF9fdHJhaXRzKGNvbXBpbGVzLCBmaWVsZEluaXRBIShULCBuYW1lKSkpIHsKKyAgICAgICAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihmaWVsZEluaXRBIShULCBuYW1lKSkpICYmCisgICAgICAgICAgICAhaXModHlwZW9mKGZpZWxkSW5pdEEhKFQsIG5hbWUpKSA9PSB2b2lkKQorICAgICAgICAgICkgeworICAgICAgICAgICAgcmVzdWx0IH49ICIgPSAiIH4gZFRvSWRsQ29uc3QoZmllbGRJbml0QSEoVCwgbmFtZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXModHlwZW9mKGZpZWxkSW5pdEIhKFQsIG5hbWUpKSkgJiYKKyAgICAgICAgICAhaXModHlwZW9mKGZpZWxkSW5pdEIhKFQsIG5hbWUpKSA9PSB2b2lkKQorICAgICAgICApIHsKKyAgICAgICAgICByZXN1bHQgfj0gIiA9ICIgfiBkVG9JZGxDb25zdChmaWVsZEluaXRCIShULCBuYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0IH49ICIsXG4iOworICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCB+PSAifVxuIjsKKyAgICByZXR1cm4gcmVzdWx0OworICB9KCk7Cit9CisKK3ByaXZhdGUgeworICAvLyBUaGlzIHZlcnkgY29udm9sdXRlZCB3YXkgb2YgZG9pbmcgdGhpbmdzIHdhcyBjaG9zZW4gYmVjYXVzZSBwdXR0aW5nIHRoZQorICAvLyBzdGF0aWMgaWYgZGlyZWN0bHkgaW50byBzdHJ1Y3RJZGxTdHJpbmcgY2F1c2VkIMK7bm90IGV2YWx1YXRhYmxlIGF0IGNvbXBpbGUKKyAgLy8gdGltZcKrIGVycm9ycyB0byBzbGlwIHRocm91Z2ggZXZlbiB0aG91Z2ggdHlwZW9mKCkgd2FzIHVzZWQsIHJlc3AuIHRoZQorICAvLyBjb25kaXRpb24gdG8gYmUgdHJ1ZSBldmVuIHRob3VnaCB0aGUgdmFsdWUgY291bGRuJ3QgYWN0dWFsbHkgYmUgcmVhZCBhdAorICAvLyBjb21waWxlIHRpbWUgZHVlIHRvIGEgQEBCVUdAQCBpbiBETUQgMi4wNTUuCisgIC8vIFRoZSBleHRyYSDCu2NvbXBpbGVkwqsgZmllbGQgaW4gZmllbGRJbml0QSBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBtdXN0IG5vdCB0cnkKKyAgLy8gdG8gdXNlICE9IGlmICFpcyBjb21waWxlZCBhcyB3ZWxsIChidXQgd2FzIGZhbHNlKSwgZS5nLiBmb3IgZmxvYXRpbmcgcG9pbnQKKyAgLy8gdHlwZXMuCisgIHRlbXBsYXRlIGZpZWxkSW5pdEEoVCwgc3RyaW5nIG5hbWUpIHsKKyAgICBzdGF0aWMgaWYgKG1peGluKCJULmluaXQuIiB+IG5hbWUpICFpcyBNZW1iZXJUeXBlIShULCBuYW1lKS5pbml0KSB7CisgICAgICBlbnVtIGZpZWxkSW5pdEEgPSBtaXhpbigiVC5pbml0LiIgfiBuYW1lKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSBmaWVsZEluaXRCKFQsIHN0cmluZyBuYW1lKSB7CisgICAgc3RhdGljIGlmIChtaXhpbigiVC5pbml0LiIgfiBuYW1lKSAhPSBNZW1iZXJUeXBlIShULCBuYW1lKS5pbml0KSB7CisgICAgICBlbnVtIGZpZWxkSW5pdEIgPSBtaXhpbigiVC5pbml0LiIgfiBuYW1lKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSBkVG9JZGxUeXBlKFQpIHsKKyAgICBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYm9vbCkpIHsKKyAgICAgIGVudW0gZFRvSWRsVHlwZSA9ICJib29sIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGJ5dGUpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiYnl0ZSI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBkb3VibGUpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiZG91YmxlIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IHNob3J0KSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gImkxNiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBpbnQpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiaTMyIjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IGxvbmcpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAiaTY0IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIDogc3RyaW5nKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gInN0cmluZyI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVVtdLCBVKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gImxpc3Q8IiB+IGRUb0lkbFR5cGUhVSB+ICI+IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gIm1hcDwiIH4gZFRvSWRsVHlwZSFLIH4gIiwgIiB+IGRUb0lkbFR5cGUhViB+ICI+IjsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBIYXNoU2V0IUUsIEUpKSB7CisgICAgICBlbnVtIGRUb0lkbFR5cGUgPSAic2V0PCIgfiBkVG9JZGxUeXBlIUUgfiAiPiI7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBzdHJ1Y3QpIHx8IGlzKEZ1bGx5VW5xdWFsIVQgPT0gZW51bSkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgOiBURXhjZXB0aW9uKQorICAgICkgeworICAgICAgZW51bSBkVG9JZGxUeXBlID0gRnVsbHlVbnF1YWwhKFQpLnN0cmluZ29mOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IFQuc3RyaW5nb2YpOworICAgIH0KKyAgfQorCisgIHN0cmluZyBkVG9JZGxSZXEoVFJlcSByZXEpIHsKKyAgICBzd2l0Y2ggKHJlcSkgeworICAgICAgY2FzZSBUUmVxLlJFUVVJUkVEOiByZXR1cm4gIiByZXF1aXJlZCI7CisgICAgICBjYXNlIFRSZXEuT1BUSU9OQUw6IHJldHVybiAiIG9wdGlvbmFsIjsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiAiIjsKKyAgICB9CisgIH0KKworICBzdHJpbmcgZFRvSWRsQ29uc3QoVCkoVCB2YWx1ZSkgeworICAgIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA9PSBib29sKSkgeworICAgICAgcmV0dXJuIHZhbHVlID8gIjEiIDogIjAiOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gYnl0ZSkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgPT0gc2hvcnQpIHx8IGlzKEZ1bGx5VW5xdWFsIVQgPT0gaW50KSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCA9PSBsb25nKQorICAgICkgeworICAgICAgcmV0dXJuIHRvIXN0cmluZyh2YWx1ZSk7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCA6IHN0cmluZykpIHsKKyAgICAgIHJldHVybiBgImAgfiB0byFzdHJpbmcodmFsdWUpIH4gYCJgOworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gZG91YmxlKSkgeworICAgICAgcmV0dXJuIGN0ZmVUb1N0cmluZyh2YWx1ZSk7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoRnVsbHlVbnF1YWwhVCBfIDogVVtdLCBVKSB8fAorICAgICAgaXMoRnVsbHlVbnF1YWwhVCBfIDogSGFzaFNldCFFLCBFKQorICAgICkgeworICAgICAgc3RyaW5nIHJlc3VsdCA9ICJbIjsKKyAgICAgIGZvcmVhY2ggKGU7IHZhbHVlKSB7CisgICAgICAgIHJlc3VsdCB+PSBkVG9JZGxDb25zdChlKSB+ICIsICI7CisgICAgICB9CisgICAgICByZXN1bHQgfj0gIl0iOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUIF8gOiBWW0tdLCBLLCBWKSkgeworICAgICAgc3RyaW5nIHJlc3VsdCA9ICJ7IjsKKyAgICAgIGZvcmVhY2ggKGtleSwgdmFsOyB2YWx1ZSkgeworICAgICAgICByZXN1bHQgfj0gZFRvSWRsQ29uc3Qoa2V5KSB+ICI6ICIgfiBkVG9JZGxDb25zdCh2YWwpIH4gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCB+PSAifSI7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKEZ1bGx5VW5xdWFsIVQgPT0gZW51bSkpIHsKKyAgICAgIGltcG9ydCBzdGQuY29udjsKKyAgICAgIGltcG9ydCBzdGQudHJhaXRzOworICAgICAgcmV0dXJuIHRvIXN0cmluZyhjYXN0KE9yaWdpbmFsVHlwZSFUKXZhbHVlKTsKKyAgICB9IGVsc2Ugc3RhdGljIGlmIChpcyhGdWxseVVucXVhbCFUID09IHN0cnVjdCkgfHwKKyAgICAgIGlzKEZ1bGx5VW5xdWFsIVQgOiBURXhjZXB0aW9uKQorICAgICkgeworICAgICAgc3RyaW5nIHJlc3VsdCA9ICJ7IjsKKyAgICAgIGZvcmVhY2ggKG5hbWU7IF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKSkgeworICAgICAgICBzdGF0aWMgaWYgKG1lbWJlclJlcSEoVCwgbmFtZSkgIT0gVFJlcS5JR05PUkUpIHsKKyAgICAgICAgICByZXN1bHQgfj0gbmFtZSB+ICI6ICIgfiBkVG9JZGxDb25zdChtaXhpbigidmFsdWUuIiB+IG5hbWUpKSB+ICIsICI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlc3VsdCB+PSAifSI7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSB7CisgICAgICBzdGF0aWMgYXNzZXJ0KGZhbHNlLCAiQ2Fubm90IHJlcHJlc2VudCB0eXBlIGluIFRocmlmdDogIiB+IFQuc3RyaW5nb2YpOworICAgIH0KKyAgfQorfQorCit2ZXJzaW9uICh1bml0dGVzdCkgeworICBlbnVtIEZvbyB7CisgICAgYSA9IDEsCisgICAgYiA9IDEwLAorICAgIGMgPSA1CisgIH0KKworICBzdGF0aWMgYXNzZXJ0KGVudW1JZGxTdHJpbmchRm9vID09CitgZW51bSBGb28geworICBhID0gMSwKKyAgYiA9IDEwLAorICBjID0gNSwKK30KK2ApOworfQorCisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIHN0cnVjdCBXaXRob3V0TWV0YSB7CisgICAgc3RyaW5nIGE7CisgICAgaW50IGI7CisgIH0KKworICBzdHJ1Y3QgV2l0aERlZmF1bHRzIHsKKyAgICBzdHJpbmcgYSA9ICJhc2RmIjsKKyAgICBkb3VibGUgYiA9IDMuMTQxNTsKKyAgICBXaXRob3V0TWV0YSBjOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoImMiLCAxLCBUUmVxLmluaXQsIGBXaXRob3V0TWV0YSgiZm9vIiwgMylgKQorICAgIF0pOworICB9CisKKyAgLy8gVGhlc2UgYXJlIGZyb20gRGVidWdQcm90b1Rlc3QudGhyaWZ0LgorICBzdHJ1Y3QgT25lT2ZFYWNoIHsKKyAgICBib29sIGltX3RydWU7CisgICAgYm9vbCBpbV9mYWxzZTsKKyAgICBieXRlIGFfYml0ZTsKKyAgICBzaG9ydCBpbnRlZ2VyMTY7CisgICAgaW50IGludGVnZXIzMjsKKyAgICBsb25nIGludGVnZXI2NDsKKyAgICBkb3VibGUgZG91YmxlX3ByZWNpc2lvbjsKKyAgICBzdHJpbmcgc29tZV9jaGFyYWN0ZXJzOworICAgIHN0cmluZyB6b21nX3VuaWNvZGU7CisgICAgYm9vbCB3aGF0X3dobzsKKyAgICBzdHJpbmcgYmFzZTY0OworICAgIGJ5dGVbXSBieXRlX2xpc3Q7CisgICAgc2hvcnRbXSBpMTZfbGlzdDsKKyAgICBsb25nW10gaTY0X2xpc3Q7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YShgaW1fdHJ1ZWAsIDEpLAorICAgICAgVEZpZWxkTWV0YShgaW1fZmFsc2VgLCAyKSwKKyAgICAgIFRGaWVsZE1ldGEoYGFfYml0ZWAsIDMsIFRSZXEuT1BUX0lOX1JFUV9PVVQsIHF7Y2FzdChieXRlKTEyN30pLAorICAgICAgVEZpZWxkTWV0YShgaW50ZWdlcjE2YCwgNCwgVFJlcS5PUFRfSU5fUkVRX09VVCwgcXtjYXN0KHNob3J0KTMyNzY3fSksCisgICAgICBURmllbGRNZXRhKGBpbnRlZ2VyMzJgLCA1KSwKKyAgICAgIFRGaWVsZE1ldGEoYGludGVnZXI2NGAsIDYsIFRSZXEuT1BUX0lOX1JFUV9PVVQsIHF7MTAwMDAwMDAwMDBMfSksCisgICAgICBURmllbGRNZXRhKGBkb3VibGVfcHJlY2lzaW9uYCwgNyksCisgICAgICBURmllbGRNZXRhKGBzb21lX2NoYXJhY3RlcnNgLCA4KSwKKyAgICAgIFRGaWVsZE1ldGEoYHpvbWdfdW5pY29kZWAsIDkpLAorICAgICAgVEZpZWxkTWV0YShgd2hhdF93aG9gLCAxMCksCisgICAgICBURmllbGRNZXRhKGBiYXNlNjRgLCAxMSksCisgICAgICBURmllbGRNZXRhKGBieXRlX2xpc3RgLCAxMiwgVFJlcS5PUFRfSU5fUkVRX09VVCwgcXt7CisgICAgICAgIGJ5dGVbXSB2OworICAgICAgICB2IH49IGNhc3QoYnl0ZSkxOworICAgICAgICB2IH49IGNhc3QoYnl0ZSkyOworICAgICAgICB2IH49IGNhc3QoYnl0ZSkzOworICAgICAgICByZXR1cm4gdjsKKyAgICAgIH0oKX0pLAorICAgICAgVEZpZWxkTWV0YShgaTE2X2xpc3RgLCAxMywgVFJlcS5PUFRfSU5fUkVRX09VVCwgcXt7CisgICAgICAgIHNob3J0W10gdjsKKyAgICAgICAgdiB+PSBjYXN0KHNob3J0KTE7CisgICAgICAgIHYgfj0gY2FzdChzaG9ydCkyOworICAgICAgICB2IH49IGNhc3Qoc2hvcnQpMzsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgICB9KCl9KSwKKyAgICAgIFRGaWVsZE1ldGEoYGk2NF9saXN0YCwgMTQsIFRSZXEuT1BUX0lOX1JFUV9PVVQsIHF7eworICAgICAgICBsb25nW10gdjsKKyAgICAgICAgdiB+PSAxTDsKKyAgICAgICAgdiB+PSAyTDsKKyAgICAgICAgdiB+PSAzTDsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgICB9KCl9KQorICAgIF0pOworICB9CisKKyAgc3RydWN0IEJvbmsgeworICAgIGludCB0eXBlOworICAgIHN0cmluZyBtZXNzYWdlOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoYHR5cGVgLCAxKSwKKyAgICAgIFRGaWVsZE1ldGEoYG1lc3NhZ2VgLCAyKQorICAgIF0pOworICB9CisKKyAgc3RydWN0IEhvbHlNb2xleSB7CisgICAgT25lT2ZFYWNoW10gYmlnOworICAgIEhhc2hTZXQhKHN0cmluZ1tdKSBjb250YWluOworICAgIEJvbmtbXVtzdHJpbmddIGJvbmtzOworCisgICAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKFsKKyAgICAgIFRGaWVsZE1ldGEoYGJpZ2AsIDEpLAorICAgICAgVEZpZWxkTWV0YShgY29udGFpbmAsIDIpLAorICAgICAgVEZpZWxkTWV0YShgYm9ua3NgLCAzKQorICAgIF0pOworICB9CisKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchV2l0aG91dE1ldGEgPT0KK2BzdHJ1Y3QgV2l0aG91dE1ldGEgeworICAtMTogc3RyaW5nIGEsCisgIC0yOiBpMzIgYiwKK30KK2ApOworCitpbXBvcnQgc3RkLmFsZ29yaXRobTsKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchV2l0aERlZmF1bHRzLnN0YXJ0c1dpdGgoCitgc3RydWN0IFdpdGhEZWZhdWx0cyB7CisgIC0xOiBzdHJpbmcgYSA9ICJhc2RmIiwKKyAgLTI6IGRvdWJsZSBiID0gMy4xNDFgKSk7CisKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchV2l0aERlZmF1bHRzLmVuZHNXaXRoKAorYDE6IFdpdGhvdXRNZXRhIGMgPSB7YTogImZvbyIsIGI6IDMsIH0sCit9CitgKSk7CisKKyAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchT25lT2ZFYWNoID09Citgc3RydWN0IE9uZU9mRWFjaCB7CisgIDE6IGJvb2wgaW1fdHJ1ZSwKKyAgMjogYm9vbCBpbV9mYWxzZSwKKyAgMzogYnl0ZSBhX2JpdGUgPSAxMjcsCisgIDQ6IGkxNiBpbnRlZ2VyMTYgPSAzMjc2NywKKyAgNTogaTMyIGludGVnZXIzMiwKKyAgNjogaTY0IGludGVnZXI2NCA9IDEwMDAwMDAwMDAwLAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCisgIDExOiBzdHJpbmcgYmFzZTY0LAorICAxMjogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgMywgXSwKKyAgMTM6IGxpc3Q8aTE2PiBpMTZfbGlzdCA9IFsxLCAyLCAzLCBdLAorICAxNDogbGlzdDxpNjQ+IGk2NF9saXN0ID0gWzEsIDIsIDMsIF0sCit9CitgKTsKKworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFCb25rID09Citgc3RydWN0IEJvbmsgeworICAxOiBpMzIgdHlwZSwKKyAgMjogc3RyaW5nIG1lc3NhZ2UsCit9CitgKTsKKworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFIb2x5TW9sZXkgPT0KK2BzdHJ1Y3QgSG9seU1vbGV5IHsKKyAgMTogbGlzdDxPbmVPZkVhY2g+IGJpZywKKyAgMjogc2V0PGxpc3Q8c3RyaW5nPj4gY29udGFpbiwKKyAgMzogbWFwPHN0cmluZywgbGlzdDxCb25rPj4gYm9ua3MsCit9CitgKTsKK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgY2xhc3MgRXhjZXB0aW9uV2l0aEFNYXAgOiBURXhjZXB0aW9uIHsKKyAgICBzdHJpbmcgYmxhaDsKKyAgICBzdHJpbmdbc3RyaW5nXSBtYXBfZmllbGQ7CisKKyAgICBtaXhpbiBUU3RydWN0SGVscGVycyEoWworICAgICAgVEZpZWxkTWV0YShgYmxhaGAsIDEpLAorICAgICAgVEZpZWxkTWV0YShgbWFwX2ZpZWxkYCwgMikKKyAgICBdKTsKKyAgfQorCisgIGludGVyZmFjZSBTcnYgeworICAgIHZvaWQgdm9pZE1ldGhvZCgpOworICAgIGludCBwcmltaXRpdmVNZXRob2QoKTsKKyAgICBPbmVPZkVhY2ggc3RydWN0TWV0aG9kKCk7CisgICAgdm9pZCBtZXRob2RXaXRoRGVmYXVsdEFyZ3MoaW50IHNvbWV0aGluZyk7CisgICAgdm9pZCBvbmV3YXlNZXRob2QoKTsKKyAgICB2b2lkIGV4Y2VwdGlvbk1ldGhvZCgpOworCisgICAgYWxpYXMgLkV4Y2VwdGlvbldpdGhBTWFwIEV4Y2VwdGlvbldpdGhBTWFwOworCisgICAgZW51bSBtZXRob2RNZXRhID0gWworICAgICAgVE1ldGhvZE1ldGEoYG1ldGhvZFdpdGhEZWZhdWx0QXJnc2AsCisgICAgICAgIFtUUGFyYW1NZXRhKGBzb21ldGhpbmdgLCAxLCBxezJ9KV0KKyAgICAgICksCisgICAgICBUTWV0aG9kTWV0YShgb25ld2F5TWV0aG9kYCwKKyAgICAgICAgW10sCisgICAgICAgIFtdLAorICAgICAgICBUTWV0aG9kVHlwZS5PTkVXQVkKKyAgICAgICksCisgICAgICBUTWV0aG9kTWV0YShgZXhjZXB0aW9uTWV0aG9kYCwKKyAgICAgICAgW10sCisgICAgICAgIFsKKyAgICAgICAgICBURXhjZXB0aW9uTWV0YSgiYSIsIDEsICJFeGNlcHRpb25XaXRoQU1hcCIpLAorICAgICAgICAgIFRFeGNlcHRpb25NZXRhKCJiIiwgMiwgIkV4Y2VwdGlvbldpdGhBTWFwIikKKyAgICAgICAgXQorICAgICAgKQorICAgIF07CisgIH0KKworICBpbnRlcmZhY2UgQ2hpbGRTcnYgOiBTcnYgeworICAgIGludCBjaGlsZE1ldGhvZChpbnQgYXJnKTsKKyAgfQorCisgIHN0YXRpYyBhc3NlcnQoaWRsU3RyaW5nIUNoaWxkU3J2ID09CitgZXhjZXB0aW9uIEV4Y2VwdGlvbldpdGhBTWFwIHsKKyAgMTogc3RyaW5nIGJsYWgsCisgIDI6IG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwX2ZpZWxkLAorfQorCitzdHJ1Y3QgT25lT2ZFYWNoIHsKKyAgMTogYm9vbCBpbV90cnVlLAorICAyOiBib29sIGltX2ZhbHNlLAorICAzOiBieXRlIGFfYml0ZSA9IDEyNywKKyAgNDogaTE2IGludGVnZXIxNiA9IDMyNzY3LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0ID0gMTAwMDAwMDAwMDAsCisgIDc6IGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uLAorICA4OiBzdHJpbmcgc29tZV9jaGFyYWN0ZXJzLAorICA5OiBzdHJpbmcgem9tZ191bmljb2RlLAorICAxMDogYm9vbCB3aGF0X3dobywKKyAgMTE6IHN0cmluZyBiYXNlNjQsCisgIDEyOiBsaXN0PGJ5dGU+IGJ5dGVfbGlzdCA9IFsxLCAyLCAzLCBdLAorICAxMzogbGlzdDxpMTY+IGkxNl9saXN0ID0gWzEsIDIsIDMsIF0sCisgIDE0OiBsaXN0PGk2ND4gaTY0X2xpc3QgPSBbMSwgMiwgMywgXSwKK30KKworc2VydmljZSBTcnYgeworICB2b2lkIHZvaWRNZXRob2QoKSwKKyAgaTMyIHByaW1pdGl2ZU1ldGhvZCgpLAorICBPbmVPZkVhY2ggc3RydWN0TWV0aG9kKCksCisgIHZvaWQgbWV0aG9kV2l0aERlZmF1bHRBcmdzKDE6IGkzMiBzb21ldGhpbmcgPSAyLCApLAorICBvbmV3YXkgdm9pZCBvbmV3YXlNZXRob2QoKSwKKyAgdm9pZCBleGNlcHRpb25NZXRob2QoKSB0aHJvd3MgKDE6IEV4Y2VwdGlvbldpdGhBTWFwIGEsIDI6IEV4Y2VwdGlvbldpdGhBTWFwIGIsICksCit9CisKK3NlcnZpY2UgQ2hpbGRTcnYgZXh0ZW5kcyBTcnYgeworICBpMzIgY2hpbGRNZXRob2QoLTE6IGkzMiBwYXJhbTEsICksCit9CitgKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9wcm9jZXNzb3IuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9wcm9jZXNzb3IuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U3YWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL3Byb2Nlc3Nvci5kCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGZpbmQ7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHksIGZyb250OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLnRyYWl0cyA6IFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZSwgVW5xdWFsOworaW1wb3J0IHN0ZC50eXBldHVwbGUgOiBhbGxTYXRpc2Z5LCBUeXBlVHVwbGU7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmN0ZmU7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKKworLyoqCisgKiBTZXJ2aWNlIHByb2Nlc3NvciBmb3IgSW50ZXJmYWNlLCB3aGljaCBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgYnkKKyAqIHN5bmNocm9ub3VzbHkgZm9yd2FyZGluZyByZXF1ZXN0cyBmb3IgdGhlIHNlcnZpY2UgbWV0aG9kcyB0byBhIGhhbmRsZXIKKyAqIGltcGxlbWVudGluZyBJbnRlcmZhY2UuCisgKgorICogVGhlIGdlbmVyYXRlZCBjbGFzcyBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgYW5kIGFkZGl0aW9uYWxseSBhbGxvd3MgYQorICogVFByb2Nlc3NvckV2ZW50SGFuZGxlciB0byBiZSBzcGVjaWZpZWQgdmlhIHRoZSBwdWJsaWMgZXZlbnRIYW5kbGVyIHByb3BlcnR5LgorICogVGhlIGNvbnN0cnVjdG9yIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IG9mIHR5cGUgSW50ZXJmYWNlLCB3aGljaCBpcyB0aGUKKyAqIGhhbmRsZXIgdG8gZm9yd2FyZCB0aGUgcmVxdWVzdHMgdG86CisgKiAtLS0KKyAqIHRoaXMoSW50ZXJmYWNlIGlmYWNlKTsKKyAqIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyOworICogLS0tCisgKgorICogSWYgSW50ZXJmYWNlIGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIHNlcnZpY2UgQmFzZUludGVyZmFjZSwgdGhpcyBjbGFzcyBpcworICogYWxzbyBkZXJpdmVkIGZyb20gVFNlcnZpY2VQcm9jZXNzb3IhQmFzZUludGVyZmFjZS4KKyAqCisgKiBUaGUgb3B0aW9uYWwgUHJvdG9jb2xzIHRlbXBsYXRlIHR1cGxlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisgKiBvbmUgb3IgbW9yZSBUUHJvdG9jb2wgaW1wbGVtZW50YXRpb25zIHRvIHNwZWNpZmljYWxseSBnZW5lcmF0ZSBjb2RlIGZvci4gSWYKKyAqIHRoZSBhY3R1YWwgdHlwZXMgb2YgdGhlIHByb3RvY29scyBwYXNzZWQgdG8gcHJvY2VzcygpIGF0IHJ1bnRpbWUgbWF0Y2ggb25lCisgKiBvZiB0aGUgaXRlbXMgZnJvbSB0aGUgbGlzdCwgdGhlIG9wdGltaXplZCBjb2RlIHBhdGhzIGFyZSB0YWtlbiwgb3RoZXJ3aXNlLAorICogYSBnZW5lcmljIFRQcm90b2NvbCB2ZXJzaW9uIGlzIHVzZWQgYXMgZmFsbGJhY2suIEZvciBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKKyAqIGFuZCBvdXRwdXQgcHJvdG9jb2xzIGRpZmZlciwgVFByb3RvY29sUGFpciEoSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wpCisgKiBjYW4gYmUgdXNlZCBpbiB0aGUgUHJvdG9jb2xzIGxpc3Q6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb29TZXJ2aWNlIHsgdm9pZCBmb28oKTsgfQorICogY2xhc3MgRm9vSW1wbCB7IG92ZXJyaWRlIHZvaWQgZm9vIHt9IH0KKyAqCisgKiAvLyBQcm92aWRlcyBmYXN0IHBhdGggaWYgVEJpbmFyeVByb3RvY29sIVRCdWZmZXJlZFRyYW5zcG9ydCBpcyB1c2VkIGZvcgorICogLy8gYm90aCBpbnB1dCBhbmQgb3V0cHV0OgorICogYWxpYXMgVFNlcnZpY2VQcm9jZXNzb3IhKEZvb1NlcnZpY2UsIFRCaW5hcnlQcm90b2NvbCFUQnVmZmVyZWRUcmFuc3BvcnQpCisgKiAgIEJpbmFyeVByb2Nlc3NvcjsKKyAqCisgKiBhdXRvIHByb2MgPSBuZXcgQmluYXJ5UHJvY2Vzc29yKG5ldyBGb29JbXBsKCkpOworICoKKyAqIC8vIExvdyBvdmVyaGVhZC4KKyAqIHByb2MucHJvY2Vzcyh0QmluYXJ5UHJvdG9jb2wodEJ1ZmZlclRyYW5zcG9ydChzb21lU29ja2V0KSkpOworICoKKyAqIC8vIE5vdCBpbiB0aGUgc3BlY2lhbGl6YXRpb24gbGlzdCDigJMgaGlnaGVyIG92ZXJoZWFkLgorICogcHJvYy5wcm9jZXNzKHRCaW5hcnlQcm90b2NvbCh0RnJhbWVkVHJhbnNwb3J0KHNvbWVTb2NrZXQpKSk7CisgKgorICogLy8gU2FtZSBhcyBhYm92ZSwgYnV0IG9wdGltaXplZCBmb3IgdGhlIENvbXBhY3QgcHJvdG9jb2wgYmFja2VkIGJ5IGEKKyAqIC8vIFRQaXBlZFRyYW5zcG9ydCBmb3IgaW5wdXQgYW5kIGEgVEJ1ZmZlcmVkVHJhbnNwb3J0IGZvciBvdXRwdXQuCisgKiBhbGlhcyBUU2VydmljZVByb2Nlc3NvciEoRm9vU2VydmljZSwgVFByb3RvY29sUGFpciEoCisgKiAgIFRDb21wYWN0UHJvdG9jb2whVFBpcGVkVHJhbnNwb3J0LCBUQ29tcGFjdFByb3RvY29sIVRCdWZmZXJlZFRyYW5zcG9ydCkKKyAqICkgTWl4ZWRQcm9jZXNzb3I7CisgKiAtLS0KKyAqLwordGVtcGxhdGUgVFNlcnZpY2VQcm9jZXNzb3IoSW50ZXJmYWNlLCBQcm90b2NvbHMuLi4pIGlmICgKKyAgaXNTZXJ2aWNlIUludGVyZmFjZSAmJiBhbGxTYXRpc2Z5IShpc1RQcm90b2NvbE9yUGFpciwgUHJvdG9jb2xzKQorKSB7CisgIG1peGluKHsKKyAgICBzdGF0aWMgaWYgKGlzKEludGVyZmFjZSBCYXNlSW50ZXJmYWNlcyA9PSBzdXBlcikgJiYgQmFzZUludGVyZmFjZXMubGVuZ3RoID4gMCkgeworICAgICAgc3RhdGljIGFzc2VydChCYXNlSW50ZXJmYWNlcy5sZW5ndGggPT0gMSwKKyAgICAgICAgIlNlcnZpY2VzIGNhbm5vdCBiZSBkZXJpdmVkIGZyb20gbW9yZSB0aGFuIG9uZSBwYXJlbnQuIik7CisKKyAgICAgIHN0cmluZyBjb2RlID0gImNsYXNzIFRTZXJ2aWNlUHJvY2Vzc29yIDogIiB+CisgICAgICAgICJUU2VydmljZVByb2Nlc3NvciEoQmFzZVNlcnZpY2UhSW50ZXJmYWNlKSB7XG4iOworICAgICAgY29kZSB+PSAicHJpdmF0ZSBJbnRlcmZhY2UgaWZhY2VfO1xuIjsKKworICAgICAgc3RyaW5nIGNvbnN0cnVjdG9yQ29kZSA9ICJ0aGlzKEludGVyZmFjZSBpZmFjZSkge1xuIjsKKyAgICAgIGNvbnN0cnVjdG9yQ29kZSB+PSAic3VwZXIoaWZhY2UpO1xuIjsKKyAgICAgIGNvbnN0cnVjdG9yQ29kZSB+PSAiaWZhY2VfID0gaWZhY2U7XG4iOworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmcgY29kZSA9ICJjbGFzcyBUU2VydmljZVByb2Nlc3NvciA6IFRQcm9jZXNzb3IgeyI7CisgICAgICBjb2RlIH49IHF7CisgICAgICAgIG92ZXJyaWRlIGJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwKKyAgICAgICAgICBWYXJpYW50IGNvbnRleHQgPSBWYXJpYW50KCkKKyAgICAgICAgKSB7CisgICAgICAgICAgYXV0byBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7CisKKyAgICAgICAgICB2b2lkIHdyaXRlRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwKKyAgICAgICAgICAgICAgbXNnLnNlcWlkKSk7CisgICAgICAgICAgICBlLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LndyaXRlRW5kKCk7CisgICAgICAgICAgICBvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobXNnLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwgJiYgbXNnLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgICAgICAgc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsKKyAgICAgICAgICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICBpcHJvdC50cmFuc3BvcnQucmVhZEVuZCgpOworCisgICAgICAgICAgICB3cml0ZUV4Y2VwdGlvbihuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uVHlwZS5JTlZBTElEX01FU1NBR0VfVFlQRSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKworICAgICAgICAgIGF1dG8gZGcgPSBtc2cubmFtZSBpbiBwcm9jZXNzTWFwXzsKKyAgICAgICAgICBpZiAoIWRnKSB7CisgICAgICAgICAgICBza2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOworICAgICAgICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgIGlwcm90LnRyYW5zcG9ydC5yZWFkRW5kKCk7CisKKyAgICAgICAgICAgIHdyaXRlRXhjZXB0aW9uKG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oIkludmFsaWQgbWV0aG9kIG5hbWU6ICciIH4KKyAgICAgICAgICAgICAgbXNnLm5hbWUgfiAiJy4iLCBUQXBwbGljYXRpb25FeGNlcHRpb24uVHlwZS5JTlZBTElEX01FU1NBR0VfVFlQRSkpOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgKCpkZykobXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QsIGNvbnRleHQpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgVFByb2Nlc3NvckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXI7CisKKyAgICAgICAgYWxpYXMgdm9pZCBkZWxlZ2F0ZShpbnQsIFRQcm90b2NvbCwgVFByb3RvY29sLCBWYXJpYW50KSBQcm9jZXNzRnVuYzsKKyAgICAgICAgcHJvdGVjdGVkIFByb2Nlc3NGdW5jW3N0cmluZ10gcHJvY2Vzc01hcF87CisgICAgICAgIHByaXZhdGUgSW50ZXJmYWNlIGlmYWNlXzsKKyAgICAgIH07CisKKyAgICAgIHN0cmluZyBjb25zdHJ1Y3RvckNvZGUgPSAidGhpcyhJbnRlcmZhY2UgaWZhY2UpIHtcbiI7CisgICAgICBjb25zdHJ1Y3RvckNvZGUgfj0gImlmYWNlXyA9IGlmYWNlO1xuIjsKKyAgICB9CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxpbmcgY29kZSBmb3IgZWFjaCBtZXRob2QsIGNvbnNpc3Rpbmcgb2YgdGhlIGRpc3BhdGNoCisgICAgLy8gZnVuY3Rpb24sIHJlZ2lzdGVyaW5nIGl0IGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHRoZSBhY3R1YWwgdGVtcGxhdGVkCisgICAgLy8gaGFuZGxlciBmdW5jdGlvbi4KKyAgICBmb3JlYWNoIChtZXRob2ROYW1lOworICAgICAgRmlsdGVyTWV0aG9kTmFtZXMhKEludGVyZmFjZSwgX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIEludGVyZmFjZSkpCisgICAgKSB7CisgICAgICAvLyBSZWdpc3RlciB0aGUgcHJvY2Vzc2luZyBmdW5jdGlvbiBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICBpbW11dGFibGUgcHJvY0Z1bmNOYW1lID0gInByb2Nlc3NfIiB+IG1ldGhvZE5hbWU7CisgICAgICBpbW11dGFibGUgZGlzcGF0Y2hGdW5jTmFtZSA9IHByb2NGdW5jTmFtZSB+ICJfcHJvdG9jb2xEaXNwYXRjaCI7CisgICAgICBjb25zdHJ1Y3RvckNvZGUgfj0gInByb2Nlc3NNYXBfW2AiIH4gbWV0aG9kTmFtZSB+ICJgXSA9ICYiIH4KKyAgICAgICAgZGlzcGF0Y2hGdW5jTmFtZSB+ICI7XG4iOworCisgICAgICBib29sIG1ldGhvZE1ldGFGb3VuZDsKKyAgICAgIFRNZXRob2RNZXRhIG1ldGhvZE1ldGE7CisgICAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihJbnRlcmZhY2UubWV0aG9kTWV0YSkgOiBUTWV0aG9kTWV0YVtdKSkgeworICAgICAgICBlbnVtIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgICBpZiAoIW1ldGEuZW1wdHkpIHsKKyAgICAgICAgICBtZXRob2RNZXRhRm91bmQgPSB0cnVlOworICAgICAgICAgIG1ldGhvZE1ldGEgPSBtZXRhLmZyb250OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBkaXNwYXRjaCBmdW5jdGlvbiB0byBjYWxsIHRoZSBzcGVjaWFsaXplZCBoYW5kbGVyIGZ1bmN0aW9ucy4gV2UKKyAgICAgIC8vIHRlc3QgdGhlIHByb3RvY29scyBpZiB0aGV5IGNhbiBiZSBjb252ZXJ0ZWQgdG8gb25lIG9mIHRoZSBwYXNzZWQKKyAgICAgIC8vIHByb3RvY29sIHR5cGVzLCBhbmQgaWYgbm90LCBmYWxsIGJhY2sgdG8gdGhlIGdlbmVyaWMgVFByb3RvY29sCisgICAgICAvLyB2ZXJzaW9uIG9mIHRoZSBwcm9jZXNzaW5nIGZ1bmN0aW9uLgorICAgICAgY29kZSB+PSAidm9pZCAiIH4gZGlzcGF0Y2hGdW5jTmFtZSB+CisgICAgICAgICIoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgVmFyaWFudCBjb250ZXh0KSB7XG4iOworICAgICAgY29kZSB+PSAiZm9yZWFjaCAoUHJvdG9jb2w7IFR5cGVUdXBsZSEoUHJvdG9jb2xzLCBUUHJvdG9jb2wpKSB7XG4iOworICAgICAgY29kZSB+PSBxeworICAgICAgICBzdGF0aWMgaWYgKGlzKFByb3RvY29sIF8gOiBUUHJvdG9jb2xQYWlyIShJLCBPKSwgSSwgTykpIHsKKyAgICAgICAgICBhbGlhcyBJIElQcm90OworICAgICAgICAgIGFsaWFzIE8gT1Byb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWxpYXMgUHJvdG9jb2wgSVByb3Q7CisgICAgICAgICAgYWxpYXMgUHJvdG9jb2wgT1Byb3Q7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBjYXN0ZWRJUHJvdCA9IGNhc3QoSVByb3QpaXByb3Q7CisgICAgICAgIGF1dG8gY2FzdGVkT1Byb3QgPSBjYXN0KE9Qcm90KW9wcm90OworICAgICAgfTsKKyAgICAgIGNvZGUgfj0gImlmIChjYXN0ZWRJUHJvdCAmJiBjYXN0ZWRPUHJvdCkge1xuIjsKKyAgICAgIGNvZGUgfj0gcHJvY0Z1bmNOYW1lIH4KKyAgICAgICAgIiEoSVByb3QsIE9Qcm90KShzZXFpZCwgY2FzdGVkSVByb3QsIGNhc3RlZE9Qcm90LCBjb250ZXh0KTtcbiI7CisgICAgICBjb2RlIH49ICJyZXR1cm47XG4iOworICAgICAgY29kZSB+PSAifVxuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisgICAgICBjb2RlIH49ICJ0aHJvdyBuZXcgVEV4Y2VwdGlvbihgSW50ZXJuYWwgZXJyb3I6IE51bGwgaXByb3Qvb3Byb3QgIiB+CisgICAgICAgICJwYXNzZWQgdG8gcHJvY2Vzc29yIHByb3RvY29sIGRpc3BhdGNoIGZ1bmN0aW9uLmApO1xuIjsKKyAgICAgIGNvZGUgfj0gIn1cbiI7CisKKyAgICAgIC8vIFRoZSBhY3R1YWwgaGFuZGxlciBmdW5jdGlvbiwgdGVtcGxhdGVkIG9uIHRoZSBpbnB1dCBhbmQgb3V0cHV0CisgICAgICAvLyBwcm90b2NvbCB0eXBlcy4KKyAgICAgIGNvZGUgfj0gInZvaWQgIiB+IHByb2NGdW5jTmFtZSB+ICIoSVByb3QsIE9Qcm90KShpbnQgc2VxaWQsIElQcm90ICIgfgorICAgICAgICAiaXByb3QsIE9Qcm90IG9wcm90LCBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0KSAiIH4KKyAgICAgICAgImlmIChpc1RQcm90b2NvbCFJUHJvdCAmJiBpc1RQcm90b2NvbCFPUHJvdCkge1xuIjsKKyAgICAgIGNvZGUgfj0gIlRBcmdzU3RydWN0IShJbnRlcmZhY2UsIGAiIH4gbWV0aG9kTmFtZSB+ICJgKSBhcmdzO1xuIjsKKworICAgICAgLy8gU3RvcmUgdGhlIChxdWFsaWZpZWQpIG1ldGhvZCBuYW1lIGluIGEgbWFuaWZlc3QgY29uc3RhbnQgdG8gYXZvaWQKKyAgICAgIC8vIGhhdmluZyB0byBsaXR0ZXIgdGhlIGNvZGUgYmVsb3cgd2l0aCBsb3RzIG9mIHN0cmluZyBtYW5pcHVsYXRpb24uCisgICAgICBjb2RlIH49ICJlbnVtIG1ldGhvZE5hbWUgPSBgIiB+IG1ldGhvZE5hbWUgfiAiYDtcbiI7CisKKyAgICAgIGNvZGUgfj0gcXsKKyAgICAgICAgZW51bSBxTmFtZSA9IEludGVyZmFjZS5zdHJpbmdvZiB+ICIuIiB+IG1ldGhvZE5hbWU7CisKKyAgICAgICAgVmFyaWFudCBjYWxsQ29udGV4dDsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICAgIGNhbGxDb250ZXh0ID0gZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQocU5hbWUsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHNjb3BlIChleGl0KSB7CisgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICAgICAgZXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY2FsbENvbnRleHQsIHFOYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucHJlUmVhZChjYWxsQ29udGV4dCwgcU5hbWUpOworCisgICAgICAgIGFyZ3MucmVhZChpcHJvdCk7CisgICAgICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7CisgICAgICAgIGlwcm90LnRyYW5zcG9ydC5yZWFkRW5kKCk7CisKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnBvc3RSZWFkKGNhbGxDb250ZXh0LCBxTmFtZSk7CisgICAgICB9OworCisgICAgICBjb2RlIH49ICJUUmVzdWx0U3RydWN0IShJbnRlcmZhY2UsIGAiIH4gbWV0aG9kTmFtZSB+ICJgKSByZXN1bHQ7XG4iOworICAgICAgY29kZSB+PSAidHJ5IHtcbiI7CisKKyAgICAgIC8vIEdlbmVyYXRlIHRoZSBwYXJhbWV0ZXIgbGlzdCB0byBwYXNzIHRvIHRoZSBjYWxsZWQgaWZhY2UgZnVuY3Rpb24uCisgICAgICBzdHJpbmdbXSBwYXJhbUxpc3Q7CisgICAgICBmb3JlYWNoIChpLCBfOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgICBzdHJpbmcgcGFyYW1OYW1lOworICAgICAgICBpZiAobWV0aG9kTWV0YUZvdW5kICYmIGkgPCBtZXRob2RNZXRhLnBhcmFtcy5sZW5ndGgpIHsKKyAgICAgICAgICBwYXJhbU5hbWUgPSBtZXRob2RNZXRhLnBhcmFtc1tpXS5uYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcmFtTmFtZSA9ICJwYXJhbSIgfiB0byFzdHJpbmcoaSArIDEpOworICAgICAgICB9CisgICAgICAgIHBhcmFtTGlzdCB+PSAiYXJncy4iIH4gcGFyYW1OYW1lOworICAgICAgfQorCisgICAgICBpbW11dGFibGUgY2FsbCA9ICJpZmFjZV8uIiB+IG1ldGhvZE5hbWUgfiAiKCIgfiBjdGZlSm9pbihwYXJhbUxpc3QpIH4gIikiOworICAgICAgaWYgKGlzKFJldHVyblR5cGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSA9PSB2b2lkKSkgeworICAgICAgICBjb2RlIH49IGNhbGwgfiAiO1xuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZGUgfj0gInJlc3VsdC5zZXQhYHN1Y2Nlc3NgKCIgfiBjYWxsIH4gIik7XG4iOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIG9uZXdheSBtZXRob2QsIGdlbmVyYXRlIHRoZSByZWNlaXZpbmcgY29kZS4KKyAgICAgIGlmICghbWV0aG9kTWV0YUZvdW5kIHx8IG1ldGhvZE1ldGEudHlwZSAhPSBUTWV0aG9kVHlwZS5PTkVXQVkpIHsKKyAgICAgICAgaWYgKG1ldGhvZE1ldGFGb3VuZCkgeworICAgICAgICAgIGZvcmVhY2ggKGU7IG1ldGhvZE1ldGEuZXhjZXB0aW9ucykgeworICAgICAgICAgICAgY29kZSB+PSAifSBjYXRjaCAoSW50ZXJmYWNlLiIgfiBlLnR5cGUgfiAiICIgfiBlLm5hbWUgfiAiKSB7XG4iOworICAgICAgICAgICAgY29kZSB+PSAicmVzdWx0LnNldCFgIiB+IGUubmFtZSB+ICJgKCIgfiBlLm5hbWUgfiAiKTtcbiI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvZGUgfj0gIn1cbiI7CisKKyAgICAgICAgY29kZSB+PSBxeworICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICAgICAgICBldmVudEhhbmRsZXIuaGFuZGxlckVycm9yKGNhbGxDb250ZXh0LCBxTmFtZSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odG8hc3RyaW5nKGUpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKAorICAgICAgICAgICAgICBUTWVzc2FnZShtZXRob2ROYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOworICAgICAgICAgICAgeC53cml0ZShvcHJvdCk7CisgICAgICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgIG9wcm90LnRyYW5zcG9ydC53cml0ZUVuZCgpOworICAgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnByZVdyaXRlKGNhbGxDb250ZXh0LCBxTmFtZSk7CisKKyAgICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZShtZXRob2ROYW1lLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOworICAgICAgICAgIHJlc3VsdC53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LndyaXRlRW5kKCk7CisgICAgICAgICAgb3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucG9zdFdyaXRlKGNhbGxDb250ZXh0LCBxTmFtZSk7CisgICAgICAgIH07CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBGb3Igb25ld2F5IG1ldGhvZHMsIHdlIG9idmlvdXNseSBjYW5ub3Qgbm90aWZ5IHRoZSBjbGllbnQgb2YgYW55CisgICAgICAgIC8vIGV4Y2VwdGlvbnMsIGp1c3QgY2FsbCB0aGUgZXZlbnQgaGFuZGxlciBpZiBvbmUgaXMgc2V0LgorICAgICAgICBjb2RlIH49ICJ9XG4iOworICAgICAgICBjb2RlIH49IHF7CisgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgICAgIGV2ZW50SGFuZGxlci5oYW5kbGVyRXJyb3IoY2FsbENvbnRleHQsIHFOYW1lLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIub25ld2F5Q29tcGxldGUoY2FsbENvbnRleHQsIHFOYW1lKTsKKyAgICAgICAgfTsKKyAgICAgIH0KKyAgICAgIGNvZGUgfj0gIn1cbiI7CisKKyAgICB9CisKKyAgICBjb2RlIH49IGNvbnN0cnVjdG9yQ29kZSB+ICJ9XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisKKyAgICByZXR1cm4gY29kZTsKKyAgfSgpKTsKK30KKworLyoqCisgKiBBIHN0cnVjdCByZXByZXNlbnRpbmcgdGhlIGFyZ3VtZW50cyBvZiBhIFRocmlmdCBtZXRob2QgY2FsbC4KKyAqCisgKiBUaGVyZSBzaG91bGQgdXN1YWxseSBiZSBubyByZWFzb24gdG8gdXNlIHRoaXMgZGlyZWN0bHkgd2l0aG91dCB0aGUgaGVscCBvZgorICogVFNlcnZpY2VQcm9jZXNzb3IsIGJ1dCBpdCBpcyBkb2N1bWVudGVkIHB1YmxpY2x5IHRvIGhlbHAgZGVidWdnaW5nIGluIGNhc2UKKyAqIG9mIENURkUgZXJyb3JzLgorICoKKyAqIENvbnNpZGVyIHRoaXMgZXhhbXBsZToKKyAqIC0tLQorICogaW50ZXJmYWNlIEZvbyB7CisgKiAgIGludCBiYXIoc3RyaW5nIGEsIGJvb2wgYik7CisgKgorICogICBlbnVtIG1ldGhvZE1ldGEgPSBbCisgKiAgICAgVE1ldGhvZE1ldGEoImJhciIsIFtUUGFyYW1NZXRhKCJhIiwgMSksIFRQYXJhbU1ldGEoImIiLCAyKV0pCisgKiAgIF07CisgKiB9CisgKgorICogYWxpYXMgVEFyZ3NTdHJ1Y3QhKEZvbywgImJhciIpIEZvb0JhckFyZ3M7CisgKiAtLS0KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBGb29CYXJBcmdzIGlzIGVxdWl2YWxlbnQgdG86CisgKiAtLS0KKyAqIHN0cnVjdCBGb29CYXJBcmdzIHsKKyAqICAgc3RyaW5nIGE7CisgKiAgIGJvb2wgYjsKKyAqCisgKiAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbVEZpZWxkTWV0YSgiYSIsIDEsIFRSZXEuT1BUX0lOX1JFUV9PVVQpLAorICogICAgIFRGaWVsZE1ldGEoImIiLCAyLCBUUmVxLk9QVF9JTl9SRVFfT1VUKV0pOworICogfQorICogLS0tCisgKgorICogSWYgdGhlIFRWZXJib3NlQ29kZWdlbiB2ZXJzaW9uIGlzIGRlZmluZWQsIGEgd2FybmluZyBtZXNzYWdlIGlzIGlzc3VlZCBhdAorICogY29tcGlsYXRpb24gaWYgbm8gVE1ldGhvZE1ldGEgZm9yIEludGVyZmFjZS5tZXRob2ROYW1lIGlzIGZvdW5kLgorICovCit0ZW1wbGF0ZSBUQXJnc1N0cnVjdChJbnRlcmZhY2UsIHN0cmluZyBtZXRob2ROYW1lKSB7CisgIHN0YXRpYyBhc3NlcnQoaXModHlwZW9mKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSksCisgICAgIkNvdWxkIG5vdCBmaW5kIG1ldGhvZCAnIiB+IG1ldGhvZE5hbWUgfiAiJyBpbiAnIiB+IEludGVyZmFjZS5zdHJpbmdvZiB+ICInLiIpOworICBtaXhpbih7CisgICAgYm9vbCBtZXRob2RNZXRhRm91bmQ7CisgICAgVE1ldGhvZE1ldGEgbWV0aG9kTWV0YTsKKyAgICBzdGF0aWMgaWYgKGlzKHR5cGVvZihJbnRlcmZhY2UubWV0aG9kTWV0YSkgOiBUTWV0aG9kTWV0YVtdKSkgeworICAgICAgYXV0byBtZXRhID0gZmluZCFgYS5uYW1lID09IGJgKEludGVyZmFjZS5tZXRob2RNZXRhLCBtZXRob2ROYW1lKTsKKyAgICAgIGlmICghbWV0YS5lbXB0eSkgeworICAgICAgICBtZXRob2RNZXRhRm91bmQgPSB0cnVlOworICAgICAgICBtZXRob2RNZXRhID0gbWV0YS5mcm9udDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJpbmcgbWVtYmVyQ29kZTsKKyAgICBzdHJpbmdbXSBmaWVsZE1ldGFDb2RlczsKKyAgICBmb3JlYWNoIChpLCBfOyBQYXJhbWV0ZXJUeXBlVHVwbGUhKG1peGluKCJJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUpKSkgeworICAgICAgLy8gSWYgd2UgaGF2ZSBubyBtZXRhIGluZm9ybWF0aW9uLCBqdXN0IHVzZSBwYXJhbTEsIHBhcmFtMiwgZXRjLiBhcworICAgICAgLy8gZmllbGQgbmFtZXMsIGl0IHNob3VsZG4ndCByZWFsbHkgbWF0dGVyIGFueXdheS4gMS1iYXNlZCDCu2luZGV4aW5nwqsKKyAgICAgIC8vIGlzIHVzZWQgdG8gbWF0Y2ggdGhlIGNvbW1vbiBzY2hlbWUgaW4gdGhlIFRocmlmdCB3b3JsZC4KKyAgICAgIHN0cmluZyBtZW1iZXJJZDsKKyAgICAgIHN0cmluZyBtZW1iZXJOYW1lOworICAgICAgaWYgKG1ldGhvZE1ldGFGb3VuZCAmJiBpIDwgbWV0aG9kTWV0YS5wYXJhbXMubGVuZ3RoKSB7CisgICAgICAgIG1lbWJlcklkID0gdG8hc3RyaW5nKG1ldGhvZE1ldGEucGFyYW1zW2ldLmlkKTsKKyAgICAgICAgbWVtYmVyTmFtZSA9IG1ldGhvZE1ldGEucGFyYW1zW2ldLm5hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1iZXJJZCA9IHRvIXN0cmluZyhpICsgMSk7CisgICAgICAgIG1lbWJlck5hbWUgPSAicGFyYW0iIH4gdG8hc3RyaW5nKGkgKyAxKTsKKyAgICAgIH0KKworICAgICAgLy8gVW5xdWFsISgpIGlzIG5lZWRlZCB0byBnZW5lcmF0ZSBtdXRhYmxlIGZpZWxkcyBmb3IgcmVmIGNvbnN0KCkKKyAgICAgIC8vIHN0cnVjdCBwYXJhbWV0ZXJzLgorICAgICAgbWVtYmVyQ29kZSB+PSAiVW5xdWFsIShQYXJhbWV0ZXJUeXBlVHVwbGUhKEludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSB+CisgICAgICAgICIpWyIgfiB0byFzdHJpbmcoaSkgfiAiXSkiIH4gbWVtYmVyTmFtZSB+ICI7XG4iOworCisgICAgICBmaWVsZE1ldGFDb2RlcyB+PSAiVEZpZWxkTWV0YShgIiB+IG1lbWJlck5hbWUgfiAiYCwgIiB+IG1lbWJlcklkIH4KKyAgICAgICAgIiwgVFJlcS5PUFRfSU5fUkVRX09VVCkiOworICAgIH0KKworICAgIHN0cmluZyBjb2RlID0gInN0cnVjdCBUQXJnc1N0cnVjdCB7XG4iOworICAgIGNvZGUgfj0gbWVtYmVyQ29kZTsKKyAgICB2ZXJzaW9uIChUVmVyYm9zZUNvZGVnZW4pIHsKKyAgICAgIGlmICghbWV0aG9kTWV0YUZvdW5kICYmCisgICAgICAgIFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpLmxlbmd0aCA+IDApCisgICAgICB7CisgICAgICAgIGNvZGUgfj0gInByYWdtYShtc2csIGBbdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yLlRBcmdzU3RydWN0XSBXYXJuaW5nOiBObyAiIH4KKyAgICAgICAgICAibWV0YSBpbmZvcm1hdGlvbiBmb3IgbWV0aG9kICciIH4gbWV0aG9kTmFtZSB+ICInIGluIHNlcnZpY2UgJyIgfgorICAgICAgICAgIEludGVyZmFjZS5zdHJpbmdvZiB+ICInIGZvdW5kLmApO1xuIjsKKyAgICAgIH0KKyAgICB9CisgICAgaW1tdXRhYmxlIGZpZWxkTWV0YUNvZGUgPQorICAgICAgZmllbGRNZXRhQ29kZXMuZW1wdHkgPyAiIiA6ICJbIiB+IGN0ZmVKb2luKGZpZWxkTWV0YUNvZGVzKSB+ICJdIjsKKyAgICBjb2RlIH49ICJtaXhpbiBUU3RydWN0SGVscGVycyEoIiB+IGZpZWxkTWV0YUNvZGUgIH4gIik7XG4iOworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogQSBzdHJ1Y3QgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSBUaHJpZnQgbWV0aG9kIGNhbGwuCisgKgorICogSXQgY29udGFpbnMgYSBmaWVsZCBjYWxsZWQgInN1Y2Nlc3MiIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbgorICogKHdpdGggaWQgMCksIGFuZCBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgdGhlIGV4Y2VwdGlvbnMgZGVjbGFyZWQgZm9yIHRoZQorICogbWV0aG9kLCBpZiBhbnkuCisgKgorICogVGhlcmUgc2hvdWxkIHVzdWFsbHkgYmUgbm8gcmVhc29uIHRvIHVzZSB0aGlzIGRpcmVjdGx5IHdpdGhvdXQgdGhlIGhlbHAgb2YKKyAqIFRTZXJ2aWNlUHJvY2Vzc29yLCBidXQgaXQgaXMgZG9jdW1lbnRlZCBwdWJsaWNseSB0byBoZWxwIGRlYnVnZ2luZyBpbiBjYXNlCisgKiBvZiBDVEZFIGVycm9ycy4KKyAqCisgKiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgKiAtLS0KKyAqIGludGVyZmFjZSBGb28geworICogICBpbnQgYmFyKHN0cmluZyBhKTsKKyAqCisgKiAgIGFsaWFzIC5Gb29FeGNlcHRpb24gRm9vRXhjZXB0aW9uOworICoKKyAqICAgZW51bSBtZXRob2RNZXRhID0gWworICogICAgIFRNZXRob2RNZXRhKCJiYXIiLAorICogICAgICAgW1RQYXJhbU1ldGEoImEiLCAxKV0sCisgKiAgICAgICBbVEV4Y2VwdGlvbk1ldGEoImZvb2UiLCAxLCAiRm9vRXhjZXB0aW9uIildCisgKiAgICAgKQorICogICBdOworICogfQorICogYWxpYXMgVFJlc3VsdFN0cnVjdCEoRm9vLCAiYmFyIikgRm9vQmFyUmVzdWx0OworICogLS0tCisgKgorICogVGhlIGRlZmluaXRpb24gb2YgRm9vQmFyUmVzdWx0IGlzIGVxdWl2YWxlbnQgdG86CisgKiAtLS0KKyAqIHN0cnVjdCBGb29CYXJSZXN1bHQgeworICogICBpbnQgc3VjY2VzczsKKyAqICAgRm9vRXhjZXB0aW9uIGZvb2U7CisgKgorICogICBtaXhpbihUU3RydWN0SGVscGVycyEoW1RGaWVsZE1ldGEoInN1Y2Nlc3MiLCAwLCBUUmVxLk9QVElPTkFMKSwKKyAqICAgICBURmllbGRNZXRhKCJmb29lIiwgMSwgVFJlcS5PUFRJT05BTCldKSk7CisgKiB9CisgKiAtLS0KKyAqCisgKiBJZiB0aGUgVFZlcmJvc2VDb2RlZ2VuIHZlcnNpb24gaXMgZGVmaW5lZCwgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgaXNzdWVkIGF0CisgKiBjb21waWxhdGlvbiBpZiBubyBUTWV0aG9kTWV0YSBmb3IgSW50ZXJmYWNlLm1ldGhvZE5hbWUgaXMgZm91bmQuCisgKi8KK3RlbXBsYXRlIFRSZXN1bHRTdHJ1Y3QoSW50ZXJmYWNlLCBzdHJpbmcgbWV0aG9kTmFtZSkgeworICBzdGF0aWMgYXNzZXJ0KGlzKHR5cGVvZihtaXhpbigiSW50ZXJmYWNlLiIgfiBtZXRob2ROYW1lKSkpLAorICAgICJDb3VsZCBub3QgZmluZCBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gJyIgfiBJbnRlcmZhY2Uuc3RyaW5nb2YgfiAiJy4iKTsKKworICBtaXhpbih7CisgICAgc3RyaW5nIGNvZGUgPSAic3RydWN0IFRSZXN1bHRTdHJ1Y3Qge1xuIjsKKworICAgIHN0cmluZ1tdIGZpZWxkTWV0YUNvZGVzOworCisgICAgc3RhdGljIGlmICghaXMoUmV0dXJuVHlwZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpID09IHZvaWQpKSB7CisgICAgICBjb2RlIH49ICJSZXR1cm5UeXBlIShJbnRlcmZhY2UuIiB+IG1ldGhvZE5hbWUgfiAiKSBzdWNjZXNzO1xuIjsKKyAgICAgIGZpZWxkTWV0YUNvZGVzIH49ICJURmllbGRNZXRhKGBzdWNjZXNzYCwgMCwgVFJlcS5PUFRJT05BTCkiOworICAgIH0KKworICAgIGJvb2wgbWV0aG9kTWV0YUZvdW5kOworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKEludGVyZmFjZS5tZXRob2RNZXRhKSA6IFRNZXRob2RNZXRhW10pKSB7CisgICAgICBhdXRvIG1ldGEgPSBmaW5kIWBhLm5hbWUgPT0gYmAoSW50ZXJmYWNlLm1ldGhvZE1ldGEsIG1ldGhvZE5hbWUpOworICAgICAgaWYgKCFtZXRhLmVtcHR5KSB7CisgICAgICAgIGZvcmVhY2ggKGU7IG1ldGEuZnJvbnQuZXhjZXB0aW9ucykgeworICAgICAgICAgIGNvZGUgfj0gIkludGVyZmFjZS4iIH4gZS50eXBlIH4gIiAiIH4gZS5uYW1lIH4gIjtcbiI7CisgICAgICAgICAgZmllbGRNZXRhQ29kZXMgfj0gIlRGaWVsZE1ldGEoYCIgfiBlLm5hbWUgfiAiYCwgIiB+IHRvIXN0cmluZyhlLmlkKSB+CisgICAgICAgICAgICAiLCBUUmVxLk9QVElPTkFMKSI7CisgICAgICAgIH0KKyAgICAgICAgbWV0aG9kTWV0YUZvdW5kID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2ZXJzaW9uIChUVmVyYm9zZUNvZGVnZW4pIHsKKyAgICAgIGlmICghbWV0aG9kTWV0YUZvdW5kICYmCisgICAgICAgIFBhcmFtZXRlclR5cGVUdXBsZSEobWl4aW4oIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZSkpLmxlbmd0aCA+IDApCisgICAgICB7CisgICAgICAgIGNvZGUgfj0gInByYWdtYShtc2csIGBbdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yLlRSZXN1bHRTdHJ1Y3RdIFdhcm5pbmc6IE5vICIgfgorICAgICAgICAgICJtZXRhIGluZm9ybWF0aW9uIGZvciBtZXRob2QgJyIgfiBtZXRob2ROYW1lIH4gIicgaW4gc2VydmljZSAnIiB+CisgICAgICAgICAgSW50ZXJmYWNlLnN0cmluZ29mIH4gIicgZm91bmQuYCk7XG4iOworICAgICAgfQorICAgIH0KKworICAgIGltbXV0YWJsZSBmaWVsZE1ldGFDb2RlID0KKyAgICAgIGZpZWxkTWV0YUNvZGVzLmVtcHR5ID8gIiIgOiAiWyIgfiBjdGZlSm9pbihmaWVsZE1ldGFDb2RlcykgfiAiXSI7CisgICAgY29kZSB+PSAibWl4aW4gVFN0cnVjdEhlbHBlcnMhKCIgfiBmaWVsZE1ldGFDb2RlICB+ICIpO1xuIjsKKyAgICBjb2RlIH49ICJ9XG4iOworICAgIHJldHVybiBjb2RlOworICB9KCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbmRleC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbmRleC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTE0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2luZGV4LmQKQEAgLTAsMCArMSwzMyBAQAorRGRvYworCis8aDI+UGFja2FnZSBvdmVydmlldzwvaDI+CisKKzxkbD4KKyAgPGR0PiQoRF9DT0RFIHRocmlmdC5hc3luYyk8L2R0PgorICA8ZGQ+U3VwcG9ydCBpbmZyYXN0cnVjdHVyZSBmb3IgaGFuZGxpbmcgY2xpZW50LXNpZGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdXNpbmcgbm9uLWJsb2NraW5nIEkvTyBhbmQgY29yb3V0aW5lcy48L2RkPgorCisgIDxkdD4kKERfQ09ERSB0aHJpZnQuY29kZWdlbik8L2R0PgorICA8ZGQ+CisgICAgPHA+VGVtcGxhdGVzIHVzZWQgZm9yIGdlbmVyYXRpbmcgVGhyaWZ0IGNsaWVudHMvcHJvY2Vzc29ycyBmcm9tIHJlZ3VsYXIgRCBzdHJ1Y3QgYW5kIGludGVyZmFjZSBkZWZpbml0aW9ucy48L3A+CisgICAgPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBTZXZlcmFsIGFydGlmYWN0cyBpbiB0aGVzZSBtb2R1bGVzIGhhdmUgb3B0aW9ucyBmb3Igc3BlY2lmeWluZyB0aGUgZXhhY3QgcHJvdG9jb2wgdHlwZXMgdXNlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYW1vdW50IG9mIHZpcnR1YWwgY2FsbHMgY2FuIGJlIGdyZWF0bHkgcmVkdWNlZCBhbmQgYXMgYSByZXN1bHQsIHRoZSBjb2RlIGFsc28gY2FuIGJlIG9wdGltaXplZCBiZXR0ZXIuIElmIHBlcmZvcm1hbmNlIGlzIG5vdCBhIGNvbmNlcm4gb3IgdGhlIGFjdHVhbCBwcm90b2NvbCB0eXBlIGlzIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUsIHRoZXNlIHBhcmFtZXRlcnMgY2FuIGp1c3QgYmUgbGVmdCBhdCB0aGVpciBkZWZhdWx0cy4KKyAgICA8L3A+CisgIDwvZGQ+CisKKyAgPGR0PiQoRF9DT0RFIHRocmlmdC5pbnRlcm5hbCk8L2R0PgorICA8ZGQ+SW50ZXJuYWwgaGVscGVyIG1vZHVsZXMgdXNlZCBieSB0aGUgVGhyaWZ0IGxpYnJhcnkuIFRoaXMgcGFja2FnZSBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSSwgYW5kIG5vIHN0YWJpbGl0eSBndWFyYW50ZWVzIGFyZSBnaXZlbiB3aGF0c29ldmVyLjwvZGQ+CisKKyAgPGR0PiQoRF9DT0RFIHRocmlmdC5wcm90b2NvbCk8L2R0PgorICA8ZGQ+VGhlIFRocmlmdCBwcm90b2NvbCBpbXBsZW10YXRpb25zIHdoaWNoIHNwZWNpZnkgaG93IHRvIHBhc3MgbWVzc2FnZXMgb3ZlciBhIFRUcmFuc3BvcnQuPC9kZD4KKworICA8ZHQ+JChEX0NPREUgdGhyaWZ0LnNlcnZlcik8L2R0PgorICA8ZGQ+R2VuZXJpYyBUaHJpZnQgc2VydmVyIGltcGxlbWVudGF0aW9ucyBoYW5kbGluZyBjbGllbnRzIG92ZXIgYSBUVHJhbnNwb3J0IGludGVyZmFjZSBhbmQgZm9yd2FyZGluZyByZXF1ZXN0cyB0byBhIFRQcm9jZXNzb3IgKHdoaWNoIGlzIGluIHR1cm4gdXN1YWxseSBwcm92aWRlZCBieSB0aHJpZnQuY29kZWdlbikuPC9kZD4KKworICA8ZHQ+JChEX0NPREUgdGhyaWZ0LnRyYW5zcG9ydCk8L2R0PgorICA8ZGQ+VGhlIFRUcmFuc3BvcnQgZGF0YSBzb3VyY2Uvc2luayBpbnRlcmZhY2UgdXNlZCBpbiB0aGUgVGhyaWZ0IGxpYnJhcnkgYW5kIGl0cyBpbWlwbGVtZW50YXRpb25zLjwvZGQ+CisKKyAgPGR0PiQoRF9DT0RFIHRocmlmdC51dGlsKTwvZHQ+CisgIDxkZD5HZW5lcmFsLXB1cnBvc2UgdXRpbGl0eSBtb2R1bGVzIG5vdCBzcGVjaWZpYyB0byBUaHJpZnQsIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuPC9kZD4KKzwvZGw+CisKK01hY3JvczoKKyAgVElUTEUgPSBUaHJpZnQgRCBTb2Z0d2FyZSBMaWJyYXJ5CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2FsZ29yaXRobS5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9hbGdvcml0aG0uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTM4YWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9hbGdvcml0aG0uZApAQCAtMCwwICsxLDU1IEBACisvKioKKyAqIENvbnRhaW5zIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBzdGQuYWxnb3JpdGhtLnJlbW92ZSB0aGF0IGRvZXNuJ3QgdGFrZSBhbgorICogYWxpYXMgcGFyYW1ldGVyIHRvIGF2b2lkIERNRCBAQEJVRzYzOTVAQC4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5hbGdvcml0aG07CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbW92ZTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uOworaW1wb3J0IHN0ZC5mdW5jdGlvbmFsOworaW1wb3J0IHN0ZC5yYW5nZTsKK2ltcG9ydCBzdGQudHJhaXRzOworCitlbnVtIFN3YXBTdHJhdGVneQoreworICAgIHVuc3RhYmxlLAorICAgIHNlbWlzdGFibGUsCisgICAgc3RhYmxlLAorfQorCitSYW5nZSByZW1vdmVFcXVhbChTd2FwU3RyYXRlZ3kgcyA9IFN3YXBTdHJhdGVneS5zdGFibGUsIFJhbmdlLCBFKShSYW5nZSByYW5nZSwgRSBlKQoraWYgKGlzQmlkaXJlY3Rpb25hbFJhbmdlIVJhbmdlKQoreworICAgIGF1dG8gcmVzdWx0ID0gcmFuZ2U7CisgICAgc3RhdGljIGlmIChzICE9IFN3YXBTdHJhdGVneS5zdGFibGUpCisgICAgeworICAgICAgICBmb3IgKDshcmFuZ2UuZW1wdHk7KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbnQgIWlzIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmFuZ2UucG9wRnJvbnQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb3ZlKHJhbmdlLmJhY2ssIHJhbmdlLmZyb250KTsKKyAgICAgICAgICAgIHJhbmdlLnBvcEJhY2s7CisgICAgICAgICAgICByZXN1bHQucG9wQmFjazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhdXRvIHRndCA9IHJhbmdlOworICAgICAgICBmb3IgKDsgIXJhbmdlLmVtcHR5OyByYW5nZS5wb3BGcm9udCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJhbmdlLmZyb250IGlzIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8geWFuayB0aGlzIGd1eQorICAgICAgICAgICAgICAgIHJlc3VsdC5wb3BCYWNrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8ga2VlcCB0aGlzIGd1eQorICAgICAgICAgICAgbW92ZShyYW5nZS5mcm9udCwgdGd0LmZyb250KTsKKyAgICAgICAgICAgIHRndC5wb3BGcm9udDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jb2RlZ2VuLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2NvZGVnZW4uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWY5ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jb2RlZ2VuLmQKQEAgLTAsMCArMSw0NTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOworCitpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGNhbkZpbmQ7CitpbXBvcnQgc3RkLnRyYWl0cyA6IEludGVyZmFjZXNUdXBsZSwgaXNTb21lRnVuY3Rpb24sIGlzU29tZVN0cmluZzsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogc3RhdGljSW5kZXhPZiwgc3RhdGljTWFwLCBOb0R1cGxpY2F0ZXMsIFR5cGVUdXBsZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworCisvKioKKyAqIFJlbW92ZXMgYWxsIHR5cGUgcXVhbGlmaWVycyBmcm9tIFQuCisgKgorICogSW4gY29udHJhc3QgdG8gc3RkLnRyYWl0cy5VbnF1YWwsIEZ1bGx5VW5xdWFsIGFsc28gcmVtb3ZlcyBxdWFsaWZpZXJzIGZyb20KKyAqIGFycmF5IGVsZW1lbnRzIChlLmcuIGltbXV0YWJsZShieXRlW10pIC0+IGJ5dGVbXSwgbm90IGltbXV0YWJsZShieXRlKVtdKSwKKyAqIGV4Y2x1ZGluZyBzdHJpbmdzIChzdHJpbmcgaXNuJ3QgcmVkdWNlZCB0byBjaGFyW10pLgorICovCit0ZW1wbGF0ZSBGdWxseVVucXVhbChUKSB7CisgIHN0YXRpYyBpZiAoaXMoVCBfID09IGNvbnN0KFUpLCBVKSkgeworICAgIGFsaWFzIEZ1bGx5VW5xdWFsIVUgRnVsbHlVbnF1YWw7CisgIH0gZWxzZSBzdGF0aWMgaWYgKGlzKFQgXyA9PSBpbW11dGFibGUoVSksIFUpKSB7CisgICAgYWxpYXMgRnVsbHlVbnF1YWwhVSBGdWxseVVucXVhbDsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoVCBfID09IHNoYXJlZChVKSwgVSkpIHsKKyAgICBhbGlhcyBGdWxseVVucXVhbCFVIEZ1bGx5VW5xdWFsOworICB9IGVsc2Ugc3RhdGljIGlmIChpcyhUIF8gPT0gVVtdLCBVKSAmJiAhaXNTb21lU3RyaW5nIVQpIHsKKyAgICBhbGlhcyBGdWxseVVucXVhbCEoVSlbXSBGdWxseVVucXVhbDsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoaXMoVCBfID09IFZbS10sIEssIFYpKSB7CisgICAgYWxpYXMgRnVsbHlVbnF1YWwhKFYpW0Z1bGx5VW5xdWFsIUtdIEZ1bGx5VW5xdWFsOworICB9IGVsc2UgeworICAgIGFsaWFzIFQgRnVsbHlVbnF1YWw7CisgIH0KK30KKworLyoqCisgKiB0cnVlIGlmIG51bGwgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBwYXNzZWQgdHlwZSwgZmFsc2UgaWYgbm90LgorICovCit0ZW1wbGF0ZSBpc051bGxhYmxlKFQpIHsKKyAgZW51bSBpc051bGxhYmxlID0gX190cmFpdHMoY29tcGlsZXMsIHsgVCB0ID0gbnVsbDsgfSk7Cit9CisKK3RlbXBsYXRlIGlzU3RydWN0KFQpIHsKKyAgZW51bSBpc1N0cnVjdCA9IGlzKFQgPT0gc3RydWN0KTsKK30KKwordGVtcGxhdGUgaXNFeGNlcHRpb24oVCkgeworIGVudW0gaXNFeGNlcHRpb24gPSBpcyhUIDogRXhjZXB0aW9uKTsKK30KKwordGVtcGxhdGUgaXNFbnVtKFQpIHsKKyAgZW51bSBpc0VudW0gPSBpcyhUID09IGVudW0pOworfQorCisvKioKKyAqIEFsaWFzZXMgaXRzZWxmIHRvIFQubmFtZS4KKyAqLwordGVtcGxhdGUgR2V0TWVtYmVyKFQsIHN0cmluZyBuYW1lKSB7CisgIG1peGluKCJhbGlhcyBULiIgfiBuYW1lIH4gIiBHZXRNZW1iZXI7Iik7Cit9CisKKy8qKgorICogQWxpYXNlcyBpdHNlbGYgdG8gdHlwZW9mKHN5bWJvbCkuCisgKi8KK3RlbXBsYXRlIFR5cGVPZihhbGlhcyBzeW1ib2wpIHsKKyAgYWxpYXMgdHlwZW9mKHN5bWJvbCkgVHlwZU9mOworfQorCisvKioKKyAqIEFsaWFzZXMgaXRzZWxmIHRvIHRoZSB0eXBlIG9mIHRoZSBUIG1lbWJlciBjYWxsZWQgbmFtZS4KKyAqLworYWxpYXMgQ29tcG9zZSEoVHlwZU9mLCBHZXRNZW1iZXIpIE1lbWJlclR5cGU7CisKKy8qKgorICogUmV0dXJucyB0aGUgZmllbGQgbWV0YWRhdGEgYXJyYXkgZm9yIFQgaWYgYW55LCBvciBhbiBlbXB0eSBhcnJheSBvdGhlcndpc2UuCisgKi8KK3RlbXBsYXRlIGdldEZpZWxkTWV0YShUKSBpZiAoaXNTdHJ1Y3QhVCB8fCBpc0V4Y2VwdGlvbiFUKSB7CisgIHN0YXRpYyBpZiAoaXModHlwZW9mKFQuZmllbGRNZXRhKSA9PSBURmllbGRNZXRhW10pKSB7CisgICAgZW51bSBnZXRGaWVsZE1ldGEgPSBULmZpZWxkTWV0YTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIFRGaWVsZE1ldGFbXSBnZXRGaWVsZE1ldGEgPSBbXTsKKyAgfQorfQorCisvKioKKyAqIE1lcmdlcyB0aGUgZmllbGQgbWV0YWRhdGEgYXJyYXkgZm9yIEQgd2l0aCB0aGUgcGFzc2VkIGFycmF5LgorICovCit0ZW1wbGF0ZSBtZXJnZUZpZWxkTWV0YShULCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCkgeworICAvLyBOb3RlOiBXZSBkb24ndCB1c2UgZ2V0RmllbGRNZXRhIGhlcmUgdG8gYXZvaWQgYnVnIGlmIGl0IGlzIGluc3RhbnRpYXRlZAorICAvLyBmcm9tIFRJc1NldEZsYWdzLCBzZWUgY29tbWVudCB0aGVyZS4KKyAgc3RhdGljIGlmIChpcyh0eXBlb2YoVC5maWVsZE1ldGEpID09IFRGaWVsZE1ldGFbXSkpIHsKKyAgICBlbnVtIG1lcmdlRmllbGRNZXRhID0gVC5maWVsZE1ldGEgfiBmaWVsZE1ldGFEYXRhOworICB9IGVsc2UgeworICAgIGVudW0gVEZpZWxkTWV0YVtdIG1lcmdlRmllbGRNZXRhID0gZmllbGRNZXRhRGF0YTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIGZpZWxkIHJlcXVpcmVtZW50IGxldmVsIGZvciBULm5hbWUuCisgKi8KK3RlbXBsYXRlIG1lbWJlclJlcShULCBzdHJpbmcgbmFtZSwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwpIHsKKyAgZW51bSBtZW1iZXJSZXEgPSBtZW1iZXJSZXFJbXBsIShULCBuYW1lLCBmaWVsZE1ldGFEYXRhKS5yZXN1bHQ7Cit9CisKK3ByaXZhdGUgeworICBpbXBvcnQgc3RkLmFsZ29yaXRobSA6IGZpbmQ7CisgIC8vIERNRCBAQEJVR0BAOiBNaXNzaW5nIGltcG9ydCBsZWFkcyB0byBmYWlsaW5nIGJ1aWxkIHdpdGhvdXQgZXJyb3IKKyAgLy8gbWVzc2FnZSBpbiB1bml0dGVzdC9kZWJ1Zy90aHJpZnQvY29kZWdlbi9hc3luY19jbGllbnQuCisgIGltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQ7CisKKyAgdGVtcGxhdGUgbWVtYmVyUmVxSW1wbChULCBzdHJpbmcgbmFtZSwgYWxpYXMgZmllbGRNZXRhRGF0YSkgeworICAgIGVudW0gbWV0YSA9IGZpbmQhYGEubmFtZSA9PSBiYChtZXJnZUZpZWxkTWV0YSEoVCwgZmllbGRNZXRhRGF0YSksIG5hbWUpOworICAgIHN0YXRpYyBpZiAobWV0YS5lbXB0eSB8fCBtZXRhLmZyb250LnJlcSA9PSBUUmVxLkFVVE8pIHsKKyAgICAgIHN0YXRpYyBpZiAoaXNOdWxsYWJsZSEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpKSB7CisgICAgICAgIGVudW0gcmVzdWx0ID0gVFJlcS5PUFRJT05BTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVudW0gcmVzdWx0ID0gVFJlcS5SRVFVSVJFRDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZW51bSByZXN1bHQgPSBtZXRhLmZyb250LnJlcTsKKyAgICB9CisgIH0KK30KKworCit0ZW1wbGF0ZSBub3RJZ25vcmVkKFQsIHN0cmluZyBuYW1lLCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCkgeworICBlbnVtIG5vdElnbm9yZWQgPSBtZW1iZXJSZXEhKFQsIG5hbWUsIGZpZWxkTWV0YURhdGEpICE9IFRSZXEuSUdOT1JFOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIG1ldGhvZCBtZXRhZGF0YSBhcnJheSBmb3IgVCBpZiBhbnksIG9yIGFuIGVtcHR5IGFycmF5IG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgZ2V0TWV0aG9kTWV0YShUKSBpZiAoaXNTZXJ2aWNlIVQpIHsKKyAgc3RhdGljIGlmIChpcyh0eXBlb2YoVC5tZXRob2RNZXRhKSA9PSBUTWV0aG9kTWV0YVtdKSkgeworICAgIGVudW0gZ2V0TWV0aG9kTWV0YSA9IFQubWV0aG9kTWV0YTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIFRNZXRob2RNZXRhW10gZ2V0TWV0aG9kTWV0YSA9IFtdOworICB9Cit9CisKKworLyoqCisgKiB0cnVlIGlmIFQubmFtZSBpcyBhIG1lbWJlciB2YXJpYWJsZS4gRXhjZXB0aW9ucyBpbmNsdWRlIG1ldGhvZHMsIHN0YXRpYworICogbWVtYmVycywgYXJ0aWZhY3RzIGxpa2UgcGFja2FnZSBhbGlhc2VzLCDigKYKKyAqLwordGVtcGxhdGUgaXNWYWx1ZU1lbWJlcihULCBzdHJpbmcgbmFtZSkgeworICBzdGF0aWMgaWYgKCFpcyhNZW1iZXJUeXBlIShULCBuYW1lKSkpIHsKKyAgICBlbnVtIGlzVmFsdWVNZW1iZXIgPSBmYWxzZTsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoCisgICAgaXMoTWVtYmVyVHlwZSEoVCwgbmFtZSkgPT0gdm9pZCkgfHwKKyAgICBpc1NvbWVGdW5jdGlvbiEoTWVtYmVyVHlwZSEoVCwgbmFtZSkpIHx8CisgICAgX190cmFpdHMoY29tcGlsZXMsIHsgcmV0dXJuIG1peGluKCJULiIgfiBuYW1lKTsgfSgpKQorICApIHsKKyAgICBlbnVtIGlzVmFsdWVNZW1iZXIgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBlbnVtIGlzVmFsdWVNZW1iZXIgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgb2YgVCwgbm90IGluY2x1ZGluZworICogaW5oZXJpdGVkIGZpZWxkcy4gSWYgYSBtZW1iZXIgaXMgbWFya2VkIGFzIFRSZXEuSUdOT1JFLCBpdCBpcyBub3QgaW5jbHVkZWQKKyAqIGFzIHdlbGwuCisgKi8KK3RlbXBsYXRlIEZpZWxkTmFtZXMoVCwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwpIHsKKyAgYWxpYXMgU3RhdGljRmlsdGVyISgKKyAgICBBbGwhKAorICAgICAgZG9lc05vdFJlYWRNZW1iZXJzLAorICAgICAgUEFwcGx5IShpc1ZhbHVlTWVtYmVyLCBUKSwKKyAgICAgIFBBcHBseSEobm90SWdub3JlZCwgVCwgUEFwcGx5U2tpcCwgZmllbGRNZXRhRGF0YSkKKyAgICApLAorICAgIF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKQorICApIEZpZWxkTmFtZXM7Cit9CisKKy8qCisgKiB0cnVlIGlmIHRoZSBwYXNzZWQgbWVtYmVyIG5hbWUgaXMgbm90IGEgbWV0aG9kIGdlbmVyYXRlZCBieSB0aGUKKyAqIFRTdHJ1Y3RIZWxwZXJzIHRlbXBsYXRlIHRoYXQgaW4gaXRzIGltcGxlbWVudGF0aW9ucyBxdWVyaWVzIHRoZSBzdHJ1Y3QKKyAqIG1lbWJlcnMuCisgKgorICogS2x1ZGdlIHVzZWQgaW50ZXJuYWxseSB0byBicmVhayBhIGN5Y2xlIGNhdXNlZCBhIERNRCBmb3J3YXJkIHJlZmVyZW5jZQorICogcmVncmVzc2lvbiwgc2VlIFRIUklGVC0yMTMwLgorICovCitlbnVtIGRvZXNOb3RSZWFkTWVtYmVycyhzdHJpbmcgbmFtZSkgPSAhWyJvcEVxdWFscyIsICJ0aHJpZnRPcEVxdWFsc0ltcGwiLAorICAidG9TdHJpbmciLCAidGhyaWZ0VG9TdHJpbmdJbXBsIl0uY2FuRmluZChuYW1lKTsKKwordGVtcGxhdGUgZGVyaXZlZE1lbWJlcnMoVCkgeworICBhbGlhcyBUeXBlVHVwbGUhKF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBUKSkgZGVyaXZlZE1lbWJlcnM7Cit9CisKK3RlbXBsYXRlIEFsbE1lbWJlck1ldGhvZE5hbWVzKFQpIGlmIChpc1NlcnZpY2UhVCkgeworICBhbGlhcyBOb0R1cGxpY2F0ZXMhKAorICAgIEZpbHRlck1ldGhvZE5hbWVzISgKKyAgICAgIFQsCisgICAgICBzdGF0aWNNYXAhKAorICAgICAgICBkZXJpdmVkTWVtYmVycywKKyAgICAgICAgVHlwZVR1cGxlIShULCBJbnRlcmZhY2VzVHVwbGUhVCkKKyAgICAgICkKKyAgICApCisgICkgQWxsTWVtYmVyTWV0aG9kTmFtZXM7Cit9CisKK3RlbXBsYXRlIEZpbHRlck1ldGhvZE5hbWVzKFQsIE1lbWJlck5hbWVzLi4uKSB7CisgIGFsaWFzIFN0YXRpY0ZpbHRlciEoCisgICAgQ29tcGlsZXNBbmRUcnVlISgKKyAgICAgIENvbXBvc2UhKGlzU29tZUZ1bmN0aW9uLCBUeXBlT2YsIFBBcHBseSEoR2V0TWVtYmVyLCBUKSkKKyAgICApLAorICAgIE1lbWJlck5hbWVzCisgICkgRmlsdGVyTWV0aG9kTmFtZXM7Cit9CisKKy8qKgorICogUmV0dXJucyBhIHR5cGUgdHVwbGUgY29udGFpbmluZyBvbmx5IHRoZSBlbGVtZW50cyBvZiBUIGZvciB3aGljaCB0aGUKKyAqIGVwb255bW91cyB0ZW1wbGF0ZSBwcmVkaWNhdGUgcHJlZCBpcyB0cnVlLgorICoKKyAqIEV4YW1wbGU6CisgKiAtLS0KKyAqIGFsaWFzIFN0YXRpY0ZpbHRlciEoaXNJbnRlZ3JhbCwgaW50LCBzdHJpbmcsIGxvbmcsIGZsb2F0W10pIEZpbHRlcmVkOworICogc3RhdGljIGFzc2VydChpcyhGaWx0ZXJlZCA9PSBUeXBlVHVwbGUhKGludCwgbG9uZykpKTsKKyAqIC0tLQorICovCit0ZW1wbGF0ZSBTdGF0aWNGaWx0ZXIoYWxpYXMgcHJlZCwgVC4uLikgeworICBzdGF0aWMgaWYgKFQubGVuZ3RoID09IDApIHsKKyAgICBhbGlhcyBUeXBlVHVwbGUhKCkgU3RhdGljRmlsdGVyOworICB9IGVsc2Ugc3RhdGljIGlmIChwcmVkIShUWzBdKSkgeworICAgIGFsaWFzIFR5cGVUdXBsZSEoVFswXSwgU3RhdGljRmlsdGVyIShwcmVkLCBUWzEgLi4gJF0pKSBTdGF0aWNGaWx0ZXI7CisgIH0gZWxzZSB7CisgICAgYWxpYXMgU3RhdGljRmlsdGVyIShwcmVkLCBUWzEgLi4gJF0pIFN0YXRpY0ZpbHRlcjsKKyAgfQorfQorCisvKioKKyAqIEJpbmRzIHRoZSBmaXJzdCBuIGFyZ3VtZW50cyBvZiBhIHRlbXBsYXRlIHRvIGEgcGFydGljdWxhciB2YWx1ZSAod2hlcmUgbiBpcworICogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIFBBcHBseSkuCisgKgorICogVGhlIHBhc3NlZCBhcmd1bWVudHMgYXJlIGFsd2F5cyBhcHBsaWVkIHN0YXJ0aW5nIGZyb20gdGhlIGxlZnQuIEhvd2V2ZXIsCisgKiB0aGUgc3BlY2lhbCBQQXBwbHlTa2lwIG1hcmtlciB0ZW1wbGF0ZSBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFuCisgKiBhcmd1bWVudCBzaG91bGQgYmUgc2tpcHBlZCwgc28gdGhhdCBlLmcuIHRoZSBmaXJzdCBhbmQgdGhpcmQgYXJndW1lbnQKKyAqIHRvIGEgdGVtcGxhdGUgY2FuIGJlIGZpeGVkLCBidXQgdGhlIHNlY29uZCBhbmQgcmVtYWluaW5nIGFyZ3VtZW50cyB3b3VsZAorICogc3RpbGwgYmUgbGVmdCB1bmRlZmluZWQuCisgKgorICogU2tpcHBpbmcgYSBudW1iZXIgb2YgcGFyYW1ldGVycywgYnV0IG5vdCBwcm92aWRpbmcgZW5vdWdoIGFyZ3VtZW50cyB0bworICogYXNzaWduIGFsbCBvZiB0aGVtIGR1cmluZyBpbnN0YW50aWF0aW9uIG9mIHRoZSByZXN1bHRpbmcgdGVtcGxhdGUgaXMgYW4KKyAqIGVycm9yLgorICoKKyAqIEV4YW1wbGU6CisgKiAtLS0KKyAqIHN0cnVjdCBGb28oVCwgVSwgVikge30KKyAqIGFsaWFzIFBBcHBseSEoRm9vLCBpbnQsIGxvbmcpIFBhcnRpYWxGb287CisgKiBzdGF0aWMgYXNzZXJ0KGlzKFBhcnRpYWxGb28hZmxvYXQgPT0gRm9vIShpbnQsIGxvbmcsIGZsb2F0KSkpOworICoKKyAqIGFsaWFzIFBBcHBseSEoVGVzdCwgaW50LCBQQXBwbHlTa2lwLCBmbG9hdCkgU2tpcHBlZFRlc3Q7CisgKiBzdGF0aWMgYXNzZXJ0KGlzKFNraXBwZWRUZXN0IWxvbmcgPT0gVGVzdCEoaW50LCBsb25nLCBmbG9hdCkpKTsKKyAqIC0tLQorICovCit0ZW1wbGF0ZSBQQXBwbHkoYWxpYXMgVGFyZ2V0LCBULi4uKSB7CisgIHRlbXBsYXRlIFBBcHBseShVLi4uKSB7CisgICAgYWxpYXMgVGFyZ2V0IShQQXBwbHlNZXJnZUFyZ3MhKENvbmZpbmVkVHVwbGUhVCwgVSkuUmVzdWx0KSBQQXBwbHk7CisgIH0KK30KKworLy8vIERpdHRvLgordGVtcGxhdGUgUEFwcGx5U2tpcCgpIHt9CisKK3ByaXZhdGUgdGVtcGxhdGUgUEFwcGx5TWVyZ2VBcmdzKGFsaWFzIFByZXNldCwgQXJncy4uLikgeworICBzdGF0aWMgaWYgKFByZXNldC5sZW5ndGggPT0gMCkgeworICAgIGFsaWFzIEFyZ3MgUmVzdWx0OworICB9IGVsc2UgeworICAgIGVudW0gbmV4dFNraXAgPSBzdGF0aWNJbmRleE9mIShQQXBwbHlTa2lwLCBQcmVzZXQuVHVwbGUpOworICAgIHN0YXRpYyBpZiAobmV4dFNraXAgPT0gLTEpIHsKKyAgICAgIGFsaWFzIFR5cGVUdXBsZSEoUHJlc2V0LlR1cGxlLCBBcmdzKSBSZXN1bHQ7CisgICAgfSBlbHNlIHN0YXRpYyBpZiAoQXJncy5sZW5ndGggPT0gMCkgeworICAgICAgLy8gSGF2ZSB0byB1c2UgYSBzdGF0aWMgaWYgY2xhdXNlIGluc3RlYWQgb2YgcHV0dGluZyB0aGUgY29uZGl0aW9uCisgICAgICAvLyBkaXJlY3RseSBpbnRvIHRoZSBhc3NlcnQgdG8gYXZvaWQgRE1EIHRyeWluZyB0byBhY2Nlc3MgQXJnc1swXQorICAgICAgLy8gbmV2ZXJ0aGVsZXNzIGJlbG93LgorICAgICAgc3RhdGljIGFzc2VydChmYWxzZSwKKyAgICAgICAgIlBBcmdzU2tpcCBlbmNvdW50ZXJlZCwgYnV0IG5vIGFyZ3VtZW50IGxlZnQgdG8gYmluZC4iKTsKKyAgICB9IGVsc2UgeworICAgICAgYWxpYXMgVHlwZVR1cGxlISgKKyAgICAgICAgUHJlc2V0LlR1cGxlWzAgLi4gbmV4dFNraXBdLAorICAgICAgICBBcmdzWzBdLAorICAgICAgICBQQXBwbHlNZXJnZUFyZ3MhKAorICAgICAgICAgIENvbmZpbmVkVHVwbGUhKFByZXNldC5UdXBsZVtuZXh0U2tpcCArIDEgLi4gJF0pLAorICAgICAgICAgIEFyZ3NbMSAuLiAkXQorICAgICAgICApLlJlc3VsdAorICAgICAgKSBSZXN1bHQ7CisgICAgfQorICB9Cit9CisKK3VuaXR0ZXN0IHsKKyAgc3RydWN0IFRlc3QoVCwgVSwgVikge30KKyAgYWxpYXMgUEFwcGx5IShUZXN0LCBpbnQsIGxvbmcpIFBhcnRpYWxUZXN0OworICBzdGF0aWMgYXNzZXJ0KGlzKFBhcnRpYWxUZXN0IWZsb2F0ID09IFRlc3QhKGludCwgbG9uZywgZmxvYXQpKSk7CisKKyAgYWxpYXMgUEFwcGx5IShUZXN0LCBpbnQsIFBBcHBseVNraXAsIGZsb2F0KSBTa2lwcGVkVGVzdDsKKyAgc3RhdGljIGFzc2VydChpcyhTa2lwcGVkVGVzdCFsb25nID09IFRlc3QhKGludCwgbG9uZywgZmxvYXQpKSk7CisKKyAgYWxpYXMgUEFwcGx5IShUZXN0LCBpbnQsIFBBcHBseVNraXAsIFBBcHBseVNraXApIFR3b1NraXBwZWQ7CisgIHN0YXRpYyBhc3NlcnQoIV9fdHJhaXRzKGNvbXBpbGVzLCBUd29Ta2lwcGVkIWxvbmcpKTsKK30KKworCisvKioKKyAqIENvbXBvc2VzIGEgbnVtYmVyIG9mIHRlbXBsYXRlcy4gVGhlIHJlc3VsdCBpcyBhIHRlbXBsYXRlIGVxdWl2YWxlbnQgdG8KKyAqIGFsbCB0aGUgcGFzc2VkIHRlbXBsYXRlcyBldmFsdWF0ZWQgZnJvbSByaWdodCB0byBsZWZ0LCBha2luIHRvIHRoZQorICogbWF0aGVtYXRpY2FsIGZ1bmN0aW9uIGNvbXBvc2l0aW9uIG5vdGF0aW9uOiBJbnN0YW50aWF0aW5nIENvbXBvc2UhKEEsIEIsIEMpCisgKiBpcyB0aGUgc2FtZSBhcyBpbnN0YW50aWF0aW5nIEEhKEIhKEMhKOKApikpKS4KKyAqCisgKiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBjcmVhdGluZyBhIHRlbXBsYXRlIHRvIHVzZSB3aXRoIHN0YXRpY01hcC8KKyAqIFN0YXRpY0ZpbHRlciwgYXMgZGVtb25zdHJhdGVkIGJlbG93LgorICoKKyAqIEV4YW1wbGU6CisgKiAtLS0KKyAqIHRlbXBsYXRlIEFsbE1ldGhvZE5hbWVzKFQpIHsKKyAqICAgYWxpYXMgU3RhdGljRmlsdGVyISgKKyAqICAgICBDb21waWxlc0FuZFRydWUhKAorICogICAgICAgQ29tcG9zZSEoaXNTb21lRnVuY3Rpb24sIFR5cGVPZiwgUEFwcGx5IShHZXRNZW1iZXIsIFQpKQorICogICAgICksCisgKiAgICAgX190cmFpdHMoYWxsTWVtYmVycywgVCkKKyAqICAgKSBBbGxNZXRob2ROYW1lczsKKyAqIH0KKyAqCisgKiBwcmFnbWEobXNnLCBBbGxNZXRob2ROYW1lcyFPYmplY3QpOworICogLS0tCisgKi8KK3RlbXBsYXRlIENvbXBvc2UoVC4uLikgeworICBzdGF0aWMgaWYgKFQubGVuZ3RoID09IDApIHsKKyAgICB0ZW1wbGF0ZSBDb21wb3NlKFUuLi4pIHsKKyAgICAgIGFsaWFzIFUgQ29tcG9zZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGVtcGxhdGUgQ29tcG9zZShVLi4uKSB7CisgICAgICBhbGlhcyBJbnN0YW50aWF0ZSEoVFswXSwgSW5zdGFudGlhdGUhKC5Db21wb3NlIShUWzEgLi4gJF0pLCBVKSkgQ29tcG9zZTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBJbnN0YW50aWF0ZXMgdGhlIGdpdmVuIHRlbXBsYXRlIHdpdGggdGhlIGdpdmVuIGxpc3Qgb2YgcGFyYW1ldGVycy4KKyAqCisgKiBVc2VkIHRvIHdvcmsgYXJvdW5kIHN5bnRhY3RpYyBsaW1pYXRpb25zIG9mIEQgd2l0aCByZWdhcmQgdG8gaW5zdGFudGlhdGluZworICogYSB0ZW1wbGF0ZSBmcm9tIGEgdHlwZSB0dXBsZSAoZS5nLiBUWzBdISguLi4pIGlzIG5vdCB2YWxpZCkgb3IgYSB0ZW1wbGF0ZQorICogcmV0dXJuaW5nIGFub3RoZXIgdGVtcGxhdGUgKGUuZy4gRm9vIShCYXIpIShCYXopIGlzIG5vdCBhbGxvd2VkKS4KKyAqLwordGVtcGxhdGUgSW5zdGFudGlhdGUoYWxpYXMgVGVtcGxhdGUsIFBhcmFtcy4uLikgeworICBhbGlhcyBUZW1wbGF0ZSFQYXJhbXMgSW5zdGFudGlhdGU7Cit9CisKKy8qKgorICogQ29tYmluZXMgc2V2ZXJhbCB0ZW1wbGF0ZSBwcmVkaWNhdGVzIHVzaW5nIGxvZ2ljYWwgQU5ELCBpLmUuIGluc3RhbnRpYXRpbmcKKyAqIEFsbCEoYSwgYiwgYykgd2l0aCBwYXJhbWV0ZXJzIFAgZm9yIHNvbWUgdGVtcGxhdGVzIGEsIGIsIGMgaXMgZXF1aXZhbGVudCB0bworICogYSFQICYmIGIhUCAmJiBjIVAuCisgKgorICogVGhlIHRlbXBsYXRlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCwgYWJvcnRpbmcgZXZhbHVhdGlvbiBpbiBhCisgKiBzaHVydC1jdXQgbWFubmVyIGlmIGEgZmFsc2UgcmVzdWx0IGlzIGVuY291bnRlcmVkLCBpbiB3aGljaCBjYXNlIHRoZSBsYXR0ZXIKKyAqIGluc3RhbnRpYXRpb25zIGRvIG5vdCBuZWVkIHRvIGNvbXBpbGUuCisgKi8KK3RlbXBsYXRlIEFsbChULi4uKSB7CisgIHN0YXRpYyBpZiAoVC5sZW5ndGggPT0gMCkgeworICAgIHRlbXBsYXRlIEFsbChVLi4uKSB7CisgICAgICBlbnVtIEFsbCA9IHRydWU7CisgICAgfQorICB9IGVsc2UgeworICAgIHRlbXBsYXRlIEFsbChVLi4uKSB7CisgICAgICBzdGF0aWMgaWYgKEluc3RhbnRpYXRlIShUWzBdLCBVKSkgeworICAgICAgICBhbGlhcyBJbnN0YW50aWF0ZSEoLkFsbCEoVFsxIC4uICRdKSwgVSkgQWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW51bSBBbGwgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyoqCisgKiBDb21iaW5lcyBzZXZlcmFsIHRlbXBsYXRlIHByZWRpY2F0ZXMgdXNpbmcgbG9naWNhbCBPUiwgaS5lLiBpbnN0YW50aWF0aW5nCisgKiBBbnkhKGEsIGIsIGMpIHdpdGggcGFyYW1ldGVycyBQIGZvciBzb21lIHRlbXBsYXRlcyBhLCBiLCBjIGlzIGVxdWl2YWxlbnQgdG8KKyAqIGEhUCB8fCBiIVAgfHwgYyFQLgorICoKKyAqIFRoZSB0ZW1wbGF0ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQsIGFib3J0aW5nIGV2YWx1YXRpb24gaW4gYQorICogc2h1cnQtY3V0IG1hbm5lciBpZiBhIHRydWUgcmVzdWx0IGlzIGVuY291bnRlcmVkLCBpbiB3aGljaCBjYXNlIHRoZSBsYXR0ZXIKKyAqIGluc3RhbnRpYXRpb25zIGRvIG5vdCBuZWVkIHRvIGNvbXBpbGUuCisgKi8KK3RlbXBsYXRlIEFueShULi4uKSB7CisgIHN0YXRpYyBpZiAoVC5sZW5ndGggPT0gMCkgeworICAgIHRlbXBsYXRlIEFueShVLi4uKSB7CisgICAgICBlbnVtIEFueSA9IGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0ZW1wbGF0ZSBBbnkoVS4uLikgeworICAgICAgc3RhdGljIGlmIChJbnN0YW50aWF0ZSEoVFswXSwgVSkpIHsKKyAgICAgICAgZW51bSBBbnkgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWxpYXMgSW5zdGFudGlhdGUhKC5BbnkhKFRbMSAuLiAkXSksIFUpIEFueTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgQ29uZmluZWRUdXBsZShULi4uKSB7CisgIGFsaWFzIFQgVHVwbGU7CisgIGVudW0gbGVuZ3RoID0gVC5sZW5ndGg7Cit9CisKKy8qCisgKiBmb3JlYWNoIChJdGVtOyBJdGVtcykgeworICogICBMaXN0ID0gT3BlcmF0b3IhKEl0ZW0sIExpc3QpOworICogfQorICogd2hlcmUgSXRlbXMgaXMgYSBDb25maW5lZFR1cGxlIGFuZCBMaXN0IGlzIGEgdHlwZSB0dXBsZS4KKyAqLwordGVtcGxhdGUgRm9yQWxsV2l0aExpc3QoYWxpYXMgSXRlbXMsIGFsaWFzIE9wZXJhdG9yLCBMaXN0Li4uKSBpZiAoCisgIGlzKHR5cGVvZihJdGVtcy5sZW5ndGgpIDogc2l6ZV90KQorKXsKKyAgc3RhdGljIGlmIChJdGVtcy5sZW5ndGggPT0gMCkgeworICAgIGFsaWFzIExpc3QgRm9yQWxsV2l0aExpc3Q7CisgIH0gZWxzZSB7CisgICAgYWxpYXMgLkZvckFsbFdpdGhMaXN0ISgKKyAgICAgIENvbmZpbmVkVHVwbGUhKEl0ZW1zLlR1cGxlWzEgLi4gJF0pLAorICAgICAgT3BlcmF0b3IsCisgICAgICBPcGVyYXRvciEoSXRlbXMuVHVwbGVbMF0sIExpc3QpCisgICAgKSBGb3JBbGxXaXRoTGlzdDsKKyAgfQorfQorCisvKioKKyAqIFdyYXBzIHRoZSBwYXNzZWQgdGVtcGxhdGUgcHJlZGljYXRlIHNvIGl0IHJldHVybnMgdHJ1ZSBpZiBpdCBjb21waWxlcyBhbmQKKyAqIGV2YWx1YXRlcyB0byB0cnVlLCBmYWxzZSBpdCBpdCBkb2Vzbid0IGNvbXBpbGUgb3IgZXZhbHVhdGVzIHRvIGZhbHNlLgorICovCit0ZW1wbGF0ZSBDb21waWxlc0FuZFRydWUoYWxpYXMgVCkgeworICB0ZW1wbGF0ZSBDb21waWxlc0FuZFRydWUoVS4uLikgeworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKFQhVSkgOiBib29sKSkgeworICAgICAgZW51bSBib29sIENvbXBpbGVzQW5kVHJ1ZSA9IFQhVTsKKyAgICB9IGVsc2UgeworICAgICAgZW51bSBib29sIENvbXBpbGVzQW5kVHJ1ZSA9IGZhbHNlOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jdGZlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2N0ZmUuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzRkYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9jdGZlLmQKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgdGhyaWZ0LmludGVybmFsLmN0ZmU7CisKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC50cmFpdHM7CisKKy8qCisgKiBTaW1wbGUgZWFnZXIgam9pbigpIGZvciBzdHJpbmdzLCBzdGQuYWxnb3JpdGhtLmpvaW4gaXNuJ3QgQ1RGRWFibGUgeWV0LgorICovCitzdHJpbmcgY3RmZUpvaW4oc3RyaW5nW10gc3RyaW5ncywgc3RyaW5nIHNlcGFyYXRvciA9ICIsICIpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaWYgKHN0cmluZ3MubGVuZ3RoID4gMCkgeworICAgIHJlc3VsdCB+PSBzdHJpbmdzWzBdOworICAgIGZvcmVhY2ggKHM7IHN0cmluZ3NbMS4uJF0pIHsKKyAgICAgIHJlc3VsdCB+PSBzZXBhcmF0b3IgfiBzOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQSB2ZXJ5IHByaW1pdGl2ZSB0byFzdHJpbmcoKSBpbXBsZW1lbnRhdGlvbiBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB0aGF0CisgKiBpcyBldmFsdWF0YWJsZSBhdCBjb21waWxlIHRpbWUuCisgKgorICogVGhlcmUgaXMgYSB3ZWFsdGggb2YgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbGdvcml0aG0gdXNlZCAoZS5nLiA1LjAKKyAqIHByaW50cyBhcyA0Ljk5OeKApiwgaW5jb3JyZWN0IHJvdW5kaW5nLCBldGMuKSwgYnV0IGEgYmV0dGVyIGFsdGVybmF0aXZlIHNob3VsZAorICogYmUgaW5jbHVkZWQgd2l0aCB0aGUgRCBzdGFuZGFyZCBsaWJyYXJ5IGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIGl0IGhlcmUuCisgKi8KK3N0cmluZyBjdGZlVG9TdHJpbmcoVCkoVCB2YWwpIGlmIChpc0Zsb2F0aW5nUG9pbnQhVCkgeworICBpZiAodmFsIGlzIFQubmFuKSByZXR1cm4gIm5hbiI7CisgIGlmICh2YWwgaXMgVC5pbmZpbml0eSkgcmV0dXJuICJpbmYiOworICBpZiAodmFsIGlzIC1ULmluZmluaXR5KSByZXR1cm4gIi1pbmYiOworICBpZiAodmFsIGlzIDAuMCkgcmV0dXJuICIwIjsKKyAgaWYgKHZhbCBpcyAtMC4wKSByZXR1cm4gIi0wIjsKKworICBhdXRvIGIgPSB2YWw7CisKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaWYgKGIgPCAwKSB7CisgICAgcmVzdWx0IH49ICctJzsKKyAgICBiICo9IC0xOworICB9CisKKyAgc2hvcnQgbWFnbml0dWRlOworICB3aGlsZSAoYiA+PSAxMCkgeworICAgICsrbWFnbml0dWRlOworICAgIGIgLz0gMTA7CisgIH0KKyAgd2hpbGUgKGIgPCAxKSB7CisgICAgLS1tYWduaXR1ZGU7CisgICAgYiAqPSAxMDsKKyAgfQorCisgIGZvcmVhY2ggKGk7IDAgLi4gVC5kaWcpIHsKKyAgICBpZiAoaSA9PSAxKSByZXN1bHQgfj0gJy4nOworCisgICAgYXV0byBmaXJzdCA9IGNhc3QodWJ5dGUpYjsKKyAgICByZXN1bHQgfj0gdG8hc3RyaW5nKGZpcnN0KTsKKworICAgIGIgLT0gZmlyc3Q7CisgICAgaW1wb3J0IHN0ZC5tYXRoOworICAgIGlmIChiIDwgcG93KDEwLjAsIGkgLSBULmRpZykpIGJyZWFrOworICAgIGIgKj0gMTA7CisgIH0KKworICBpZiAobWFnbml0dWRlICE9IDApIHJlc3VsdCB+PSAiZSIgfiB0byFzdHJpbmcobWFnbml0dWRlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmFsZ29yaXRobTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoZG91YmxlLmluZmluaXR5KSA9PSAiaW5mIik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKC1kb3VibGUuaW5maW5pdHkpID09ICItaW5mIik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKGRvdWJsZS5uYW4pID09ICJuYW4iKTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoMC4wKSA9PSAiMCIpOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygtMC4wKSA9PSAiLTAiKTsKKyAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoMi41KSA9PSAiMi41Iik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKDMuMTQxNSkuc3RhcnRzV2l0aCgiMy4xNDEiKSk7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKDJlLTIwMCkgPT0gIjJlLTIwMCIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9lbmRpYW4uZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvZW5kaWFuLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiOTgxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvZW5kaWFuLmQKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogU2ltcGxlIGhlbHBlcnMgZm9yIGhhbmRsaW5nIHR5cGljYWwgYnl0ZSBvcmRlci1yZWxhdGVkIGlzc3Vlcy4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5lbmRpYW47CisKK2ltcG9ydCBjb3JlLmJpdG9wIDogYnN3YXA7CitpbXBvcnQgc3RkLnRyYWl0cyA6IGlzSW50ZWdyYWw7CisKK3VuaW9uIEludEJ1ZihUKSB7CisgIHVieXRlW1Quc2l6ZW9mXSBieXRlczsKKyAgVCB2YWx1ZTsKK30KKworVCBieXRlU3dhcChUKShUIHQpIHB1cmUgbm90aHJvdyBAdHJ1c3RlZCBpZiAoaXNJbnRlZ3JhbCFUKSB7CisgIHN0YXRpYyBpZiAoVC5zaXplb2YgPT0gMikgeworICAgIHJldHVybiBjYXN0KFQpKCh0ICYgMHhmZikgPDwgOCkgfCBjYXN0KFQpKCh0ICYgMHhmZjAwKSA+PiA4KTsKKyAgfSBlbHNlIHN0YXRpYyBpZiAoVC5zaXplb2YgPT0gNCkgeworICAgIHJldHVybiBjYXN0KFQpYnN3YXAoY2FzdCh1aW50KXQpOworICB9IGVsc2Ugc3RhdGljIGlmIChULnNpemVvZiA9PSA4KSB7CisgICAgcmV0dXJuIGNhc3QoVClieXRlU3dhcChjYXN0KHVpbnQpKHQgJiAweGZmZmZmZmZmKSkgPDwgMzIgfAorICAgICAgY2FzdChUKWJzd2FwKGNhc3QodWludCkodCA+PiAzMikpOworICB9IGVsc2Ugc3RhdGljIGFzc2VydChmYWxzZSwgIlR5cGUgb2Ygc2l6ZSAiIH4gdG8hc3RyaW5nKFQuc2l6ZW9mKSB+ICIgbm90IHN1cHBvcnRlZC4iKTsKK30KKworVCBkb05vdGhpbmcoVCkoVCB2YWwpIHsgcmV0dXJuIHZhbDsgfQorCit2ZXJzaW9uIChCaWdFbmRpYW4pIHsKKyAgYWxpYXMgZG9Ob3RoaW5nIGhvc3RUb05ldDsKKyAgYWxpYXMgZG9Ob3RoaW5nIG5ldFRvSG9zdDsKKyAgYWxpYXMgYnl0ZVN3YXAgaG9zdFRvTGU7CisgIGFsaWFzIGJ5dGVTd2FwIGxlVG9Ib3N0OworfSBlbHNlIHsKKyAgYWxpYXMgYnl0ZVN3YXAgaG9zdFRvTmV0OworICBhbGlhcyBieXRlU3dhcCBuZXRUb0hvc3Q7CisgIGFsaWFzIGRvTm90aGluZyBob3N0VG9MZTsKKyAgYWxpYXMgZG9Ob3RoaW5nIGxlVG9Ib3N0OworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworCisgIEludEJ1ZiFzaG9ydCBzOworICBzLmJ5dGVzID0gWzEsIDJdOworICBzLnZhbHVlID0gYnl0ZVN3YXAocy52YWx1ZSk7CisgIGVuZm9yY2Uocy5ieXRlcyA9PSBbMiwgMV0pOworCisgIEludEJ1ZiFpbnQgaTsKKyAgaS5ieXRlcyA9IFsxLCAyLCAzLCA0XTsKKyAgaS52YWx1ZSA9IGJ5dGVTd2FwKGkudmFsdWUpOworICBlbmZvcmNlKGkuYnl0ZXMgPT0gWzQsIDMsIDIsIDFdKTsKKworICBJbnRCdWYhbG9uZyBsOworICBsLmJ5dGVzID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdOworICBsLnZhbHVlID0gYnl0ZVN3YXAobC52YWx1ZSk7CisgIGVuZm9yY2UobC5ieXRlcyA9PSBbOCwgNywgNiwgNSwgNCwgMywgMiwgMV0pOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9yZXNvdXJjZV9wb29sLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Jlc291cmNlX3Bvb2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDgyMGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9yZXNvdXJjZV9wb29sLmQKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwucmVzb3VyY2VfcG9vbDsKKworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXIsIFRpY2tEdXJhdGlvbjsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluUG9zLCByZWR1Y2UsIHJlbW92ZTsKK2ltcG9ydCBzdGQuYXJyYXkgOiBhcnJheSwgZW1wdHk7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQucmFuZG9tIDogcmFuZG9tQ292ZXIsIHJuZEdlbjsKK2ltcG9ydCBzdGQucmFuZ2UgOiB6aXA7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmFsZ29yaXRobSA6IHJlbW92ZUVxdWFsOworCisvKioKKyAqIEEgcG9vbCBvZiByZXNvdXJjZXMsIHdoaWNoIGNhbiBiZSBpdGVyYXRlZCBvdmVyLCBhbmQgd2hlcmUgcmVzb3VyY2VzIHRoYXQKKyAqIGhhdmUgZmFpbGVkIHRvbyBvZnRlbiBjYW4gYmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQuCisgKgorICogVGhpcyBjbGFzcyBpcyBvYmxpdmlvdXMgdG8gdGhlIGFjdHVhbCByZXNvdXJjZSB0eXBlIG1hbmFnZWQuCisgKi8KK2ZpbmFsIGNsYXNzIFRSZXNvdXJjZVBvb2woUmVzb3VyY2UpIHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICByZXNvdXJjZXMgPSBUaGUgaW5pdGlhbCBtZW1iZXJzIG9mIHRoZSBwb29sLgorICAgKi8KKyAgdGhpcyhSZXNvdXJjZVtdIHJlc291cmNlcykgeworICAgIHJlc291cmNlc18gPSByZXNvdXJjZXM7CisgIH0KKworICAvKioKKyAgICogQWRkcyBhIHJlc291cmNlIHRvIHRoZSBwb29sLgorICAgKi8KKyAgdm9pZCBhZGQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICByZXNvdXJjZXNfIH49IHJlc291cmNlOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYSByZXNvdXJjZSBmcm9tIHRoZSBwb29sLgorICAgKgorICAgKiBSZXR1cm5zOiBXaGV0aGVyIHRoZSByZXNvdXJjZSBjb3VsZCBiZSBmb3VuZCBpbiB0aGUgcG9vbC4KKyAgICovCisgIGJvb2wgcmVtb3ZlKFJlc291cmNlIHJlc291cmNlKSB7CisgICAgYXV0byBvbGRMZW5ndGggPSByZXNvdXJjZXNfLmxlbmd0aDsKKyAgICByZXNvdXJjZXNfID0gcmVtb3ZlRXF1YWwocmVzb3VyY2VzXywgcmVzb3VyY2UpOworICAgIHJldHVybiByZXNvdXJjZXNfLmxlbmd0aCA8IG9sZExlbmd0aDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGFuIMK7ZW5yaWNoZWTCqyBpbnB1dCByYW5nZSB0byBpdGVyYXRlIG92ZXIgdGhlIHBvb2wgbWVtYmVycy4KKyAgICovCisgIHN0YXRpYyBzdHJ1Y3QgUmFuZ2UgeworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHJhbmdlIGlzIGVtcHR5LgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgY2FzZSBpZiBhbGwgbWVtYmVycyBvZiB0aGUgcG9vbCBoYXZlIGJlZW4gcG9wcGVkIChvciBza2lwcGVkCisgICAgICogYmVjYXVzZSB0aGV5IHdlcmUgZGlzYWJsZWQpIGFuZCBUUmVzb3VyY2VQb29sLmN5Y2xlIGlzIGZhbHNlLCBvciB0aGVyZQorICAgICAqIGlzIG5vIGVsZW1lbnQgdG8gcmV0dXJuIGluIGN5Y2xlIG1vZGUgYmVjYXVzZSBhbGwgaGF2ZSBiZWVuIHRlbXBvcmFyaWx5CisgICAgICogZGlzYWJsZWQuCisgICAgICovCisgICAgYm9vbCBlbXB0eSgpIEBwcm9wZXJ0eSB7CisgICAgICAvLyBJZiBubyByZXNvdXJjZXMgYXJlIGluIHRoZSBwb29sLCB0aGUgcmFuZ2Ugd2lsbCBuZXZlciBiZWNvbWUgbm9uLWVtcHR5LgorICAgICAgaWYgKHJlc291cmNlc18uZW1wdHkpIHJldHVybiB0cnVlOworCisgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGdvdCB0aGUgbmV4dCByZXNvdXJjZSBpbiB0aGUgY2FjaGUsIGl0IGRvZXNuJ3QgbWF0dGVyCisgICAgICAvLyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlLgorICAgICAgaWYgKGNhY2hlZF8pIHJldHVybiBmYWxzZTsKKworICAgICAgc2l6ZV90IGV4YW1pbmVDb3VudDsKKyAgICAgIGlmIChwYXJlbnRfLmN5Y2xlKSB7CisgICAgICAgIC8vIFdlIHdhbnQgdG8gY2hlY2sgYWxsIHRoZSByZXNvdXJjZXMsIGJ1dCBub3QgaXRlcmF0ZSBtb3JlIHRoYW4gb25jZQorICAgICAgICAvLyB0byBhdm9pZCBzcGlubmluZyBpbiBhIGxvb3AgaWYgbm90aGluZyBpcyBhdmFpbGFibGUuCisgICAgICAgIGV4YW1pbmVDb3VudCA9IHJlc291cmNlc18ubGVuZ3RoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hlbiBub3QgaW4gY3ljbGUgbW9kZSwgd2UganVzdCBpdGVyYXRlIHRoZSBsaXN0IGV4YWN0bHkgb25jZS4gSWYgYWxsCisgICAgICAgIC8vIGl0ZW1zIGhhdmUgYmVlbiBjb25zdW1lZCwgdGhlIGludGVydmFsIGJlbG93IGlzIGVtcHR5LgorICAgICAgICBleGFtaW5lQ291bnQgPSByZXNvdXJjZXNfLmxlbmd0aCAtIG5leHRJbmRleF87CisgICAgICB9CisKKyAgICAgIGZvcmVhY2ggKGk7IDAgLi4gZXhhbWluZUNvdW50KSB7CisgICAgICAgIGF1dG8gciA9IHJlc291cmNlc19bKG5leHRJbmRleF8gKyBpKSAlIHJlc291cmNlc18ubGVuZ3RoXTsKKyAgICAgICAgYXV0byBmaSA9IHIgaW4gcGFyZW50Xy5mYXVsdEluZm9zXzsKKworICAgICAgICBpZiAoZmkgJiYgZmkucmVzZXRUaW1lICE9IGZpLnJlc2V0VGltZS5pbml0KSB7CisgICAgICAgICAgaWYgKGZpLnJlc2V0VGltZSA8IHBhcmVudF8uZ2V0Q3VycmVudFRpY2tfKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSB0aW1lb3V0IGV4cGlyZWQsIHJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgbGlzdCBhbmQgZ28KKyAgICAgICAgICAgIC8vIGFoZWFkIHRyeWluZyBpdC4KKyAgICAgICAgICAgIHBhcmVudF8uZmF1bHRJbmZvc18ucmVtb3ZlKHIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgdGltZW91dCBkaWRuJ3QgZXhwaXJlIHlldCwgdHJ5IHRoZSBuZXh0IHJlc291cmNlLgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2FjaGVfID0gcjsKKyAgICAgICAgY2FjaGVkXyA9IHRydWU7CisgICAgICAgIG5leHRJbmRleF8gPSBuZXh0SW5kZXhfICsgaSArIDE7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIGFsbCByZXNvdXJjZXMgYXJlIGN1cnJlbnRseSBpbmFjdGl2ZSBvciB0aGUgbm9uLWN5Y2xlCisgICAgICAvLyBwb29sIGhhcyBiZWVuIGV4aGF1c3RlZCwgc28gdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8uCisgICAgICBuZXh0SW5kZXhfID0gbmV4dEluZGV4XyArIGV4YW1pbmVDb3VudDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHJlc291cmNlIGluIHRoZSByYW5nZS4KKyAgICAgKi8KKyAgICBSZXNvdXJjZSBmcm9udCgpIEBwcm9wZXJ0eSB7CisgICAgICBlbmZvcmNlKCFlbXB0eSk7CisgICAgICByZXR1cm4gY2FjaGVfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGZpcnN0IHJlc291cmNlIGZyb20gdGhlIHJhbmdlLgorICAgICAqCisgICAgICogVXN1YWxseSwgdGhpcyBpcyBjb21iaW5lZCB3aXRoIGEgY2FsbCB0byBUUmVzb3VyY2VQb29sLnJlY29yZFN1Y2Nlc3MoKQorICAgICAqIG9yIHJlY29yZEZhdWx0KCkuCisgICAgICovCisgICAgdm9pZCBwb3BGcm9udCgpIHsKKyAgICAgIGVuZm9yY2UoIWVtcHR5KTsKKyAgICAgIGNhY2hlZF8gPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJhbmdlIHdpbGwgYmVjb21lIG5vbi1lbXB0eSBhdCBzb21lIHBvaW50IGluIHRoZQorICAgICAqIGZ1dHVyZSwgYW5kIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2hlbiB0aGlzIHdpbGwgaGFwcGVuIGFuZAorICAgICAqIHdoYXQgd2lsbCBiZSB0aGUgbmV4dCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIE1ha2VzIG9ubHkgc2Vuc2UgdG8gY2FsbCBvbiBlbXB0eSByYW5nZXMuCisgICAgICoKKyAgICAgKiBQYXJhbXM6CisgICAgICogICBuZXh0ID0gVGhlIG5leHQgcmVzb3VyY2UgdGhhdCB3aWxsIGJlY29tZSBhdmFpbGFibGUuCisgICAgICogICB3YWl0VGltZSA9IFRoZSBkdXJhdGlvbiB1bnRpbCB0aGF0IHJlc291cmNlIHdpbGwgYmVjb21lIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBib29sIHdpbGxCZWNvbWVOb25lbXB0eShvdXQgUmVzb3VyY2UgbmV4dCwgb3V0IER1cmF0aW9uIHdhaXRUaW1lKSB7CisgICAgICAvLyBJZiBubyByZXNvdXJjZXMgYXJlIGluIHRoZSBwb29sLCB0aGUgcmFuZ2Ugd2lsbCBuZXZlciBiZWNvbWUgbm9uLWVtcHR5LgorICAgICAgaWYgKHJlc291cmNlc18uZW1wdHkpIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gSWYgY3ljbGUgbW9kZSBpcyBub3QgZW5hYmxlZCwgYSByYW5nZSBuZXZlciBiZWNvbWVzIG5vbi1lbXB0eSBhZnRlcgorICAgICAgLy8gYmVpbmcgZW1wdHkgb25jZSwgYmVjYXVzZSBhbGwgdGhlIGVsZW1lbnRzIGhhdmUgYWxyZWFkeSBiZWVuCisgICAgICAvLyB1c2VkL3NraXBwZWQgaW4gb3JkZXIgdG8gYmVjb21lIGVtcHR5LgorICAgICAgaWYgKCFwYXJlbnRfLmN5Y2xlKSByZXR1cm4gZmFsc2U7CisKKyAgICAgIGF1dG8gZmkgPSBwYXJlbnRfLmZhdWx0SW5mb3NfOworICAgICAgYXV0byBuZXh0UGFpciA9IG1pblBvcyEiYVsxXS5yZXNldFRpbWUgPCBiWzFdLnJlc2V0VGltZSIoCisgICAgICAgIHppcChmaS5rZXlzLCBmaS52YWx1ZXMpCisgICAgICApLmZyb250OworCisgICAgICBuZXh0ID0gbmV4dFBhaXJbMF07CisgICAgICB3YWl0VGltZSA9IHRvIUR1cmF0aW9uKG5leHRQYWlyWzFdLnJlc2V0VGltZSAtIHBhcmVudF8uZ2V0Q3VycmVudFRpY2tfKCkpOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB0aGlzKFRSZXNvdXJjZVBvb2wgcGFyZW50LCBSZXNvdXJjZVtdIHJlc291cmNlcykgeworICAgICAgcGFyZW50XyA9IHBhcmVudDsKKyAgICAgIHJlc291cmNlc18gPSByZXNvdXJjZXM7CisgICAgfQorCisgICAgVFJlc291cmNlUG9vbCBwYXJlbnRfOworCisgICAgLy8vIEFsbCBhdmFpbGFibGUgcmVzb3VyY2VzLiBXZSBrZWVwIGEgY29weSBvZiBpdCBhcyB0byBub3QgZ2V0IGNvbmZ1c2VkCisgICAgLy8vIHdoZW4gcmVzb3VyY2VzIGFyZSBhZGRlZCB0by9yZW1vdmVkIGZyb20gdGhlIHBhcmVudCBwb29sLgorICAgIFJlc291cmNlW10gcmVzb3VyY2VzXzsKKworICAgIC8vLyBBZnRlciB3ZSBoYXZlIGRldGVybWluZWQgdGhlIG5leHQgZWxlbWVudCBpbiBlbXB0eSgpLCB3ZSBzdG9yZSBpdCBoZXJlLgorICAgIFJlc291cmNlIGNhY2hlXzsKKworICAgIC8vLyBXaGV0aGVyIHRoZXJlIGlzIGN1cnJlbnRseSBzb21ldGhpbmcgaW4gdGhlIGNhY2hlLgorICAgIGJvb2wgY2FjaGVkXzsKKworICAgIC8vLyBUaGUgaW5kZXggdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gYXQgdGhlIG5leHQgY2FsbCB0byBlbXB0eSgpLgorICAgIHNpemVfdCBuZXh0SW5kZXhfOworICB9CisKKyAgLy8vIERpdHRvCisgIFJhbmdlIG9wU2xpY2UoKSB7CisgICAgYXV0byByZXMgPSByZXNvdXJjZXNfOworICAgIGlmIChwZXJtdXRlKSB7CisgICAgICByZXMgPSBhcnJheShyYW5kb21Db3ZlcihyZXMsIHJuZEdlbikpOworICAgIH0KKyAgICByZXR1cm4gUmFuZ2UodGhpcywgcmVzKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWNvcmRzIGEgc3VjY2VzcyBmb3IgYW4gb3BlcmF0aW9uIG9uIHRoZSBnaXZlbiByZXNvdXJjZSwgY2FuY2VsbGluZyBhCisgICAqIGZhdWx0IHN0cmVhaywgaWYgYW55LgorICAgKi8KKyAgdm9pZCByZWNvcmRTdWNjZXNzKFJlc291cmNlIHJlc291cmNlKSB7CisgICAgaWYgKHJlc291cmNlIGluIGZhdWx0SW5mb3NfKSB7CisgICAgICBmYXVsdEluZm9zXy5yZW1vdmUocmVzb3VyY2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZWNvcmRzIGEgZmF1bHQgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KKyAgICoKKyAgICogSWYgYSByZXNvdXJjZSBmYWlscyBjb25zZWN1dGl2ZWx5IGZvciBtb3JlIHRoYW4gZmF1bHREaXNhYmxlQ291bnQgdGltZXMsCisgICAqIGl0IGlzIHRlbXBvcmFyaWx5IGRpc2FibGVkIChubyBsb25nZXIgY29uc2lkZXJlZCkgdW50aWwKKyAgICogZmF1bHREaXNhYmxlRHVyYXRpb24gaGFzIHBhc3NlZC4KKyAgICovCisgIHZvaWQgcmVjb3JkRmF1bHQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICBhdXRvIGZpID0gcmVzb3VyY2UgaW4gZmF1bHRJbmZvc187CisKKyAgICBpZiAoIWZpKSB7CisgICAgICBmYXVsdEluZm9zX1tyZXNvdXJjZV0gPSBGYXVsdEluZm8oKTsKKyAgICAgIGZpID0gcmVzb3VyY2UgaW4gZmF1bHRJbmZvc187CisgICAgfQorCisgICAgKytmaS5jb3VudDsKKyAgICBpZiAoZmkuY291bnQgPj0gZmF1bHREaXNhYmxlQ291bnQpIHsKKyAgICAgIC8vIElmIHRoZSByZXNvdXJjZSBoYXMgaGl0IHRoZSBmYXVsdCBjb3VudCBsaW1pdCwgZGlzYWJsZSBpdCBmb3IKKyAgICAgIC8vIHNwZWNpZmllZCBkdXJhdGlvbi4KKyAgICAgIGZpLnJlc2V0VGltZSA9IGdldEN1cnJlbnRUaWNrXygpICsgY2FzdChUaWNrRHVyYXRpb24pZmF1bHREaXNhYmxlRHVyYXRpb247CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gcmFuZG9tbHkgcGVybXV0ZSB0aGUgb3JkZXIgb2YgdGhlIHJlc291cmNlcyBpbiB0aGUgcG9vbCB3aGVuCisgICAqIHRha2luZyBhIHJhbmdlIHVzaW5nIG9wU2xpY2UoKS4KKyAgICoKKyAgICogVGhpcyBjYW4gYmUgdXNlZCBlLmcuIGFzIGEgc2ltcGxlIGZvcm0gb2YgbG9hZCBiYWxhbmNpbmcuCisgICAqLworICBib29sIHBlcm11dGUgPSB0cnVlOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGtlZXAgaXRlcmF0aW5nIG92ZXIgdGhlIHBvb2wgbWVtYmVycyBhZnRlciBhbGwgaGF2ZSBiZWVuCisgICAqIHJldHVybmVkL2hhdmUgZmFpbGVkIG9uY2UuCisgICAqLworICBib29sIGN5Y2xlID0gZmFsc2U7CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZmF1bHRzIGFmdGVyIHdoaWNoIGEgcmVzb3VyY2UgaXMgZGlzYWJsZWQgdW50aWwKKyAgICogZmF1bHREaXNhYmxlRHVyYXRpb24gaGFzIHBhc3NlZC4gWmVybyB0byBuZXZlciBkaXNhYmxlIHJlc291cmNlcy4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVyby4KKyAgICovCisgIHVzaG9ydCBmYXVsdERpc2FibGVDb3VudCA9IDA7CisKKyAgLyoqCisgICAqIFRoZSBkdXJhdGlvbiBmb3Igd2hpY2ggYSByZXNvdXJjZSBpcyBubyBsb25nZXIgY29uc2lkZXJlZCBhZnRlciBpdCBoYXMKKyAgICogZmFpbGVkIHRvbyBvZnRlbi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gb25lIHNlY29uZC4KKyAgICovCisgIER1cmF0aW9uIGZhdWx0RGlzYWJsZUR1cmF0aW9uID0gZHVyISJzZWNvbmRzIigxKTsKKworcHJpdmF0ZToKKyAgUmVzb3VyY2VbXSByZXNvdXJjZXNfOworICBGYXVsdEluZm9bUmVzb3VyY2VdIGZhdWx0SW5mb3NfOworCisgIC8vLyBGdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgdGltZXN0YW1wIGZyb20gc29tZSBtb25vdG9uaWMgc3lzdGVtIGNsb2NrLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgb3ZlcnJpZGFibGUgdG8gYmUgYWJsZSB0byB3cml0ZSB0aW1pbmctaW5zZW5zaXRpdmUgdW5pdCB0ZXN0cy4KKyAgLy8vIFRoZSBleHRyYSBpbmRpcmVjdGlvbiBzaG91bGQgbm90IG1hdHRlciBtdWNoIHBlcmZvcm1hbmNlLXdpc2UgY29tcGFyZWQgdG8KKyAgLy8vIHRoZSBhY3R1YWwgc3lzdGVtIGNhbGwsIGFuZCBieSBpdHMgdmVyeSBuYXR1cmUgdGhpc3Nob3VsZCBub3QgYmUgb24gYSBob3QKKyAgLy8vIHBhdGggYW55d2F5LgorICB0eXBlb2YoJlRpY2tEdXJhdGlvbi5jdXJyU3lzdGVtVGljaykgZ2V0Q3VycmVudFRpY2tfID0KKyAgICAmVGlja0R1cmF0aW9uLmN1cnJTeXN0ZW1UaWNrOworfQorCitwcml2YXRlIHsKKyAgc3RydWN0IEZhdWx0SW5mbyB7CisgICAgdXNob3J0IGNvdW50OworICAgIFRpY2tEdXJhdGlvbiByZXNldFRpbWU7CisgIH0KK30KKwordW5pdHRlc3QgeworICBhdXRvIHBvb2wgPSBuZXcgVFJlc291cmNlUG9vbCFPYmplY3QoW10pOworICBlbmZvcmNlKHBvb2xbXS5lbXB0eSk7CisgIE9iamVjdCBkdW1teVJlczsKKyAgRHVyYXRpb24gZHVtbXlEdXI7CisgIGVuZm9yY2UoIXBvb2xbXS53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5kYXRldGltZTsKKyAgaW1wb3J0IHRocmlmdC5iYXNlOworCisgIGF1dG8gYSA9IG5ldyBPYmplY3Q7CisgIGF1dG8gYiA9IG5ldyBPYmplY3Q7CisgIGF1dG8gYyA9IG5ldyBPYmplY3Q7CisgIGF1dG8gb2JqcyA9IFthLCBiLCBjXTsKKyAgYXV0byBwb29sID0gbmV3IFRSZXNvdXJjZVBvb2whT2JqZWN0KG9ianMpOworICBwb29sLnBlcm11dGUgPSBmYWxzZTsKKworICBzdGF0aWMgRHVyYXRpb24gZmFrZUNsb2NrOworICBwb29sLmdldEN1cnJlbnRUaWNrXyA9ICgpID0+IGNhc3QoVGlja0R1cmF0aW9uKWZha2VDbG9jazsKKworICBPYmplY3QgZHVtbXlSZXMgPSB2b2lkOworICBEdXJhdGlvbiBkdW1teUR1ciA9IHZvaWQ7CisKKyAgeworICAgIGF1dG8gciA9IHBvb2xbXTsKKworICAgIGZvcmVhY2ggKGksIG87IG9ianMpIHsKKyAgICAgIGVuZm9yY2UoIXIuZW1wdHkpOworICAgICAgZW5mb3JjZShyLmZyb250ID09IG8pOworICAgICAgci5wb3BGcm9udCgpOworICAgIH0KKworICAgIGVuZm9yY2Uoci5lbXB0eSk7CisgICAgZW5mb3JjZSghci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CisgIH0KKworICB7CisgICAgcG9vbC5mYXVsdERpc2FibGVDb3VudCA9IDI7CisKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkU3VjY2VzcyhhKTsKKyAgICBlbmZvcmNlKHBvb2xbXS5mcm9udCA9PSBhKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisKKyAgICBhdXRvIHIgPSBwb29sW107CisgICAgZW5mb3JjZShyLmZyb250ID09IGIpOworICAgIHIucG9wRnJvbnQoKTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYyk7CisgICAgci5wb3BGcm9udCgpOworICAgIGVuZm9yY2Uoci5lbXB0eSk7CisgICAgZW5mb3JjZSghci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CisKKyAgICBmYWtlQ2xvY2sgKz0gMi5zZWNvbmRzOworICAgIC8vIE5vdCBpbiBjeWNsZSBtb2RlLCBoYXMgdG8gYmUgc3RpbGwgZW1wdHkgYWZ0ZXIgdGhlIHRpbWVvdXRzIGV4cGlyZWQuCisgICAgZW5mb3JjZShyLmVtcHR5KTsKKyAgICBlbmZvcmNlKCFyLndpbGxCZWNvbWVOb25lbXB0eShkdW1teVJlcywgZHVtbXlEdXIpKTsKKworICAgIGZvcmVhY2ggKG87IG9ianMpIHBvb2wucmVjb3JkU3VjY2VzcyhvKTsKKyAgfQorCisgIHsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMTsKKworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisgICAgcG9vbC5yZWNvcmRGYXVsdChiKTsKKyAgICBwb29sLnJlY29yZEZhdWx0KGMpOworCisgICAgYXV0byByID0gcG9vbFtdOworICAgIGVuZm9yY2Uoci5lbXB0eSk7CisgICAgZW5mb3JjZSghci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CisKKyAgICBmb3JlYWNoIChvOyBvYmpzKSBwb29sLnJlY29yZFN1Y2Nlc3Mobyk7CisgIH0KKworICBwb29sLmN5Y2xlID0gdHJ1ZTsKKworICB7CisgICAgYXV0byByID0gcG9vbFtdOworCisgICAgZm9yZWFjaCAobzsgb2JqcyB+IG9ianMpIHsKKyAgICAgIGVuZm9yY2UoIXIuZW1wdHkpOworICAgICAgZW5mb3JjZShyLmZyb250ID09IG8pOworICAgICAgci5wb3BGcm9udCgpOworICAgIH0KKyAgfQorCisgIHsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMjsKKworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRTdWNjZXNzKGEpOworICAgIGVuZm9yY2UocG9vbFtdLmZyb250ID09IGEpOworICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7CisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisgICAgcG9vbC5yZWNvcmRGYXVsdChhKTsKKworICAgIGF1dG8gciA9IHBvb2xbXTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYik7CisgICAgci5wb3BGcm9udCgpOworICAgIGVuZm9yY2Uoci5mcm9udCA9PSBjKTsKKyAgICByLnBvcEZyb250KCk7CisgICAgZW5mb3JjZShyLmZyb250ID09IGIpOworCisgICAgZmFrZUNsb2NrICs9IDIuc2Vjb25kczsKKworICAgIHIucG9wRnJvbnQoKTsKKyAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYyk7CisKKyAgICByLnBvcEZyb250KCk7CisgICAgZW5mb3JjZShyLmZyb250ID09IGEpOworCisgICAgZW5mb3JjZShwb29sW10uZnJvbnQgPT0gYSk7CisKKyAgICBmb3JlYWNoIChvOyBvYmpzKSBwb29sLnJlY29yZFN1Y2Nlc3Mobyk7CisgIH0KKworICB7CisgICAgcG9vbC5mYXVsdERpc2FibGVDb3VudCA9IDE7CisKKyAgICBwb29sLnJlY29yZEZhdWx0KGEpOworICAgIGZha2VDbG9jayArPSAxLm1zZWNzOworICAgIHBvb2wucmVjb3JkRmF1bHQoYik7CisgICAgZmFrZUNsb2NrICs9IDEubXNlY3M7CisgICAgcG9vbC5yZWNvcmRGYXVsdChjKTsKKworICAgIGF1dG8gciA9IHBvb2xbXTsKKyAgICBlbmZvcmNlKHIuZW1wdHkpOworCisgICAgLy8gTWFrZSBzdXJlIHdpbGxCZWNvbWVOb25lbXB0eSBnZXRzIHRoZSBvcmRlciByaWdodC4KKyAgICBlbmZvcmNlKHIud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15UmVzLCBkdW1teUR1cikpOworICAgIGVuZm9yY2UoZHVtbXlSZXMgPT0gYSk7CisgICAgZW5mb3JjZShkdW1teUR1ciA+IER1cmF0aW9uLnplcm8pOworCisgICAgZm9yZWFjaCAobzsgb2JqcykgcG9vbC5yZWNvcmRTdWNjZXNzKG8pOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zb2NrZXQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2EwYTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zb2NrZXQuZApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQWJzdHJhY3Rpb25zIG92ZXIgT1MtZGVwZW5kZW50IHNvY2tldCBmdW5jdGlvbmFsaXR5LgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLnNvY2tldDsKKworaW1wb3J0IHN0ZC5jb252IDogdG87CisKKy8vIEZyZWVCU0QgYW5kIE9TIFggcmV0dXJuIC0xIGFuZCBzZXQgRUNPTk5SRVNFVCBpZiBzb2NrZXQgd2FzIGNsb3NlZCBieQorLy8gdGhlIG90aGVyIHNpZGUsIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoYXQgYmVmb3JlIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KK3ZlcnNpb24gKEZyZWVCU0QpIHsKKyAgZW51bSBjb25ucmVzZXRPblBlZXJTaHV0ZG93biA9IHRydWU7Cit9IGVsc2UgdmVyc2lvbiAoT1NYKSB7CisgIGVudW0gY29ubnJlc2V0T25QZWVyU2h1dGRvd24gPSB0cnVlOworfSBlbHNlIHsKKyAgZW51bSBjb25ucmVzZXRPblBlZXJTaHV0ZG93biA9IGZhbHNlOworfQorCit2ZXJzaW9uIChXaW4zMikgeworICBpbXBvcnQgc3RkLmMud2luZG93cy53aW5zb2NrIDogV1NBR2V0TGFzdEVycm9yLCBXU0FFSU5UUiwgV1NBRVdPVUxEQkxPQ0s7CisgIGltcG9ydCBzdGQud2luZG93cy5zeXNlcnJvciA6IHN5c0Vycm9yU3RyaW5nOworCisgIC8vIFRoZXNlIGFyZSB1bmZvcnR1bmF0ZWx5IG5vdCBkZWZpbmVkIGluIHN0ZC5jLndpbmRvd3Mud2luc29jaywgc2VlCisgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczc0MDY2OC5hc3B4LgorICBlbnVtIFdTQUVDT05OUkVTRVQgPSAxMDA1NDsKKyAgZW51bSBXU0FFTk9UQ09OTiA9IDEwMDU3OworICBlbnVtIFdTQUVUSU1FRE9VVCA9IDEwMDYwOworfSBlbHNlIHsKKyAgaW1wb3J0IGNvcmUuc3RkYy5lcnJubyA6IGVycm5vLCBFQUdBSU4sIEVDT05OUkVTRVQsIEVJTlBST0dSRVNTLCBFSU5UUiwKKyAgICBFTk9UQ09OTiwgRVBJUEU7CisgIGltcG9ydCBjb3JlLnN0ZGMuc3RyaW5nIDogc3RyZXJyb3I7Cit9CisKKy8qCisgKiBDT05ORUNUX0lOUFJPR1JFU1NfRVJSTk86IHNldCBieSBjb25uZWN0KCkgZm9yIG5vbi1ibG9ja2luZyBzb2NrZXRzIGlmIHRoZQorICogICBjb25uZWN0aW9uIGNvdWxkIG5vdCBiZSBpbW1lZGlhdGVseSBlc3RhYmxpc2hlZC4KKyAqIElOVEVSUlVQVEVEX0VSUk5POiBzZXQgd2hlbiBibG9ja2luZyBzeXN0ZW0gY2FsbHMgYXJlIGludGVycnVwdGVkIGJ5CisgKiAgIHNpZ25hbHMgb3Igc2ltaWxhci4KKyAqIFRJTUVPVVRfRVJSTk86IHNldCB3aGVuIGEgc29ja2V0IHRpbWVvdXQgaGFzIGJlZW4gZXhjZWVkZWQuCisgKiBXT1VMRF9CTE9DS19FUlJOTzogc2V0IHdoZW4gc2VuZC9yZWN2IHdvdWxkIGJsb2NrIG9uIG5vbi1ibG9ja2luZyBzb2NrZXRzLgorICoKKyAqIGlzU29jZXRDbG9zZUVycm5vKGVycm5vKTogcmV0dXJucyB0cnVlIGlmIGVycm5vIGluZGljYXRlcyB0aGF0IHRoZSBzb2NrZXQKKyAqICAgaXMgbG9naWNhbGx5IGluIGNsb3NlZCBzdGF0ZSBub3cuCisgKi8KK3ZlcnNpb24gKFdpbjMyKSB7CisgIGFsaWFzIFdTQUdldExhc3RFcnJvciBnZXRTb2NrZXRFcnJubzsKKyAgZW51bSBDT05ORUNUX0lOUFJPR1JFU1NfRVJSTk8gPSBXU0FFV09VTERCTE9DSzsKKyAgZW51bSBJTlRFUlJVUFRFRF9FUlJOTyA9IFdTQUVJTlRSOworICBlbnVtIFRJTUVPVVRfRVJSTk8gPSBXU0FFVElNRURPVVQ7CisgIGVudW0gV09VTERfQkxPQ0tfRVJSTk8gPSBXU0FFV09VTERCTE9DSzsKKworICBib29sIGlzU29ja2V0Q2xvc2VFcnJubyh0eXBlb2YoZ2V0U29ja2V0RXJybm8oKSkgZXJybm8pIHsKKyAgICByZXR1cm4gKGVycm5vID09IFdTQUVDT05OUkVTRVQgfHwgZXJybm8gPT0gV1NBRU5PVENPTk4pOworICB9Cit9IGVsc2UgeworICBhbGlhcyBlcnJubyBnZXRTb2NrZXRFcnJubzsKKyAgZW51bSBDT05ORUNUX0lOUFJPR1JFU1NfRVJSTk8gPSBFSU5QUk9HUkVTUzsKKyAgZW51bSBJTlRFUlJVUFRFRF9FUlJOTyA9IEVJTlRSOworICBlbnVtIFdPVUxEX0JMT0NLX0VSUk5PID0gRUFHQUlOOworCisgIC8vIFRPRE86IFRoZSBDKysgVFNvY2tldCBpbXBsZW1lbnRhdGlvbiBtZW50aW9ucyB0aGF0IEVBR0FJTiBjYW4gYWxzbyBiZQorICAvLyBzZXQgKHVuZG9jdW1lbnRlZGx5KSBpbiBvdXQgb2YgcmVzb3VyY2UgY29uZGl0aW9uczsgaXQgd291bGQgYmUgYSBnb29kCisgIC8vIGlkZWEgdG8gY29udGFjdCB0aGUgb3JpZ2luYWwgYXV0aG9ycyBvZiB0aGUgQysrIGNvZGUgZm9yIGRldGFpbHMgYW5kIGFkYXB0CisgIC8vIHRoZSBjb2RlIGFjY29yZGluZ2x5LgorICBlbnVtIFRJTUVPVVRfRVJSTk8gPSBFQUdBSU47CisKKyAgYm9vbCBpc1NvY2tldENsb3NlRXJybm8odHlwZW9mKGdldFNvY2tldEVycm5vKCkpIGVycm5vKSB7CisgICAgcmV0dXJuIChlcnJubyA9PSBFUElQRSB8fCBlcnJubyA9PSBFQ09OTlJFU0VUIHx8IGVycm5vID09IEVOT1RDT05OKTsKKyAgfQorfQorCitzdHJpbmcgc29ja2V0RXJybm9TdHJpbmcodWludCBlcnJubykgeworICB2ZXJzaW9uIChXaW4zMikgeworICAgIHJldHVybiBzeXNFcnJvclN0cmluZyhlcnJubyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRvIXN0cmluZyhzdHJlcnJvcihlcnJubykpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWY1NGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2wuZApAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC5zc2w7CisKK2ltcG9ydCBjb3JlLm1lbW9yeSA6IEdDOworaW1wb3J0IGNvcmUuc3RkYy5jb25maWc7CitpbXBvcnQgY29yZS5zdGRjLmVycm5vIDogZXJybm87CitpbXBvcnQgY29yZS5zdGRjLnN0cmluZyA6IHN0cmVycm9yOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLmVycjsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5zc2w7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wueDUwOXYzOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBhcHBlbmRlcjsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5zb2NrZXQgOiBBZGRyZXNzOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworCisvKioKKyAqIENoZWNrcyBpZiB0aGUgcGVlciBpcyBhdXRob3JpemVkIGFmdGVyIHRoZSBTU0wgaGFuZHNoYWtlIGhhcyBiZWVuCisgKiBjb21wbGV0ZWQgb24gdGhlIGdpdmVuIGNvbm5jZXRpb24gYW5kIHRocm93cyBhbiBUU1NMRXhjZXB0aW9uIGlmIG5vdC4KKyAqCisgKiBQYXJhbXM6CisgKiAgIHNzbCA9IFRoZSBTU0wgY29ubmVjdGlvbiB0byBjaGVjay4KKyAqICAgYWNjZXNzTWFuYWdlciA9IFRoZSBhY2Nlc3MgbWFuYWdlciB0byBjaGVjayB0aGUgcGVlciBhZ2FpbnRzLgorICogICBwZWVyQWRkcmVzcyA9IFRoZSAoSVApIGFkZHJlc3Mgb2YgdGhlIHBlZXIuCisgKiAgIGhvc3ROYW1lID0gVGhlIGhvc3QgbmFtZSBvZiB0aGUgcGVlci4KKyAqLwordm9pZCBhdXRob3JpemUoU1NMKiBzc2wsIFRBY2Nlc3NNYW5hZ2VyIGFjY2Vzc01hbmFnZXIsCisgIEFkZHJlc3MgcGVlckFkZHJlc3MsIGxhenkgc3RyaW5nIGhvc3ROYW1lCispIHsKKyAgYWxpYXMgVEFjY2Vzc01hbmFnZXIuRGVjaXNpb24gRGVjaXNpb247CisKKyAgYXV0byByYyA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2wpOworICBpZiAocmMgIT0gWDUwOV9WX09LKSB7CisgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfdmVyaWZ5X3Jlc3VsdCgpOiAiIH4KKyAgICAgIHRvIXN0cmluZyhYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhyYykpKTsKKyAgfQorCisgIGF1dG8gY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2wpOworICBpZiAoY2VydCBpcyBudWxsKSB7CisgICAgLy8gQ2VydGlmaWNhdGUgaXMgbm90IHByZXNlbnQuCisgICAgaWYgKFNTTF9nZXRfdmVyaWZ5X21vZGUoc3NsKSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIHsKKyAgICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKAorICAgICAgICAiQXV0aG9yaXplOiBSZXF1aXJlZCBjZXJ0aWZpY2F0ZSBub3QgcHJlc2VudC4iKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIGFjY2VzcyBtYW5hZ2VyIHNldCwgd2UgZG9uJ3QgaW50ZW5kIHRvIGF1dGhvcml6ZQorICAgIC8vIHRoZSBjbGllbnQsIHNvIGV2ZXJ5dGhpbmcncyBmaW5lLgorICAgIGlmIChhY2Nlc3NNYW5hZ2VyKSB7CisgICAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigKKyAgICAgICAgIkF1dGhvcml6ZTogQ2VydGlmaWNhdGUgcmVxdWlyZWQgZm9yIGF1dGhvcml6YXRpb24uIik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIGlmIChhY2Nlc3NNYW5hZ2VyIGlzIG51bGwpIHsKKyAgICAvLyBObyBhY2Nlc3MgbWFuYWdlciBzZXQsIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkgYXMgdGhlIGNlcnQgaXMgdmFsaWQKKyAgICAvLyBhbmQgYWxsIHBlZXJzIGFyZSBhdXRob3JpemVkLgorICAgIFg1MDlfZnJlZShjZXJ0KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBib3RoIGNlcnRpZmljYXRlIGFuZCBhY2Nlc3MgbWFuYWdlciBhcmUgcHJlc2VudAorICBhdXRvIGRlY2lzaW9uID0gYWNjZXNzTWFuYWdlci52ZXJpZnkocGVlckFkZHJlc3MpOworCisgIGlmIChkZWNpc2lvbiAhPSBEZWNpc2lvbi5TS0lQKSB7CisgICAgWDUwOV9mcmVlKGNlcnQpOworICAgIGlmIChkZWNpc2lvbiAhPSBEZWNpc2lvbi5BTExPVykgeworICAgICAgdGhyb3cgbmV3IFRTU0xFeGNlcHRpb24oIkF1dGhvcml6ZTogQWNjZXNzIGRlbmllZCBiYXNlZCBvbiByZW1vdGUgSVAuIik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIENoZWNrIHN1YmplY3RBbHROYW1lKHMpLCBpZiBwcmVzZW50LgorICBhdXRvIGFsdGVybmF0aXZlcyA9IGNhc3QoU1RBQ0tfT0YhKEdFTkVSQUxfTkFNRSkqKQorICAgIFg1MDlfZ2V0X2V4dF9kMmkoY2VydCwgTklEX3N1YmplY3RfYWx0X25hbWUsIG51bGwsIG51bGwpOworICBpZiAoYWx0ZXJuYXRpdmVzICE9IG51bGwpIHsKKyAgICBhdXRvIGNvdW50ID0gc2tfR0VORVJBTF9OQU1FX251bShhbHRlcm5hdGl2ZXMpOworICAgIGZvciAoaW50IGkgPSAwOyBkZWNpc2lvbiA9PSBEZWNpc2lvbi5TS0lQICYmIGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBhdXRvIG5hbWUgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoYWx0ZXJuYXRpdmVzLCBpKTsKKyAgICAgIGlmIChuYW1lIGlzIG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBhdXRvIGRhdGEgPSBBU04xX1NUUklOR19kYXRhKG5hbWUuZC5pYTUpOworICAgICAgYXV0byBsZW5ndGggPSBBU04xX1NUUklOR19sZW5ndGgobmFtZS5kLmlhNSk7CisgICAgICBzd2l0Y2ggKG5hbWUudHlwZSkgeworICAgICAgICBjYXNlIEdFTkVSQUxfTkFNRS5HRU5fRE5TOgorICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzTWFuYWdlci52ZXJpZnkoaG9zdE5hbWUsIGNhc3QoY2hhcltdKWRhdGFbMCAuLiBsZW5ndGhdKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHRU5FUkFMX05BTUUuR0VOX0lQQUREOgorICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzTWFuYWdlci52ZXJpZnkocGVlckFkZHJlc3MsIGRhdGFbMCAuLiBsZW5ndGhdKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgfQorICAgIH0KKworICAgIC8vIERNRCBAQEJVR0BAOiBFbXB0eSB0ZW1wbGF0ZSBhcmd1bWVudHMgcGFyZW5zIHNob3VsZCBub3QgYmUgbmVlZGVkLgorICAgIHNrX0dFTkVSQUxfTkFNRV9wb3BfZnJlZSEoKShhbHRlcm5hdGl2ZXMsICZHRU5FUkFMX05BTUVfZnJlZSk7CisgIH0KKworICAvLyBJZiB3ZSBhcmUgYWxyZWR5IGRvbmUsIHJldHVybi4KKyAgaWYgKGRlY2lzaW9uICE9IERlY2lzaW9uLlNLSVApIHsKKyAgICBYNTA5X2ZyZWUoY2VydCk7CisgICAgaWYgKGRlY2lzaW9uICE9IERlY2lzaW9uLkFMTE9XKSB7CisgICAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigiQXV0aG9yaXplOiBBY2Nlc3MgZGVuaWVkLiIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvLyBDaGVjayBjb21tb25OYW1lLgorICBhdXRvIG5hbWUgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCk7CisgIGlmIChuYW1lICFpcyBudWxsKSB7CisgICAgWDUwOV9OQU1FX0VOVFJZKiBlbnRyeTsKKyAgICBjaGFyKiB1dGY4OworICAgIGludCBsYXN0ID0gLTE7CisgICAgd2hpbGUgKGRlY2lzaW9uID09IERlY2lzaW9uLlNLSVApIHsKKyAgICAgIGxhc3QgPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgbGFzdCk7CisgICAgICBpZiAobGFzdCA9PSAtMSkKKyAgICAgICAgYnJlYWs7CisgICAgICBlbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSwgbGFzdCk7CisgICAgICBpZiAoZW50cnkgaXMgbnVsbCkKKyAgICAgICAgY29udGludWU7CisgICAgICBhdXRvIGNvbW1vbiA9IFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShlbnRyeSk7CisgICAgICBhdXRvIHNpemUgPSBBU04xX1NUUklOR190b19VVEY4KCZ1dGY4LCBjb21tb24pOworICAgICAgZGVjaXNpb24gPSBhY2Nlc3NNYW5hZ2VyLnZlcmlmeShob3N0TmFtZSwgdXRmOFswIC4uIHNpemVdKTsKKyAgICAgIENSWVBUT19mcmVlKHV0ZjgpOworICAgIH0KKyAgfQorICBYNTA5X2ZyZWUoY2VydCk7CisgIGlmIChkZWNpc2lvbiAhPSBEZWNpc2lvbi5BTExPVykgeworICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKCJBdXRob3JpemU6IENvdWxkIG5vdCBhdXRob3JpemUgcGVlci4iKTsKKyAgfQorfQorCisvKgorICogT3BlblNTTCBlcnJvciBpbmZvcm1hdGlvbiB1c2VkIGZvciBzdG9yaW5nIEQgZXhjZXB0aW9ucyBvbiB0aGUgT3BlblNTTAorICogZXJyb3Igc3RhY2suCisgKi8KK2VudW0gRVJSX0xJQl9EX0VYQ0VQVElPTiA9IEVSUl9MSUJfVVNFUjsKK2VudW0gRVJSX0ZfRF9FWENFUFRJT04gPSAwOyAvLyBmdW5jdGlvbiBpZCAtIHdoYXQgdG8gdXNlIGhlcmU/CitlbnVtIEVSUl9SX0RfRVhDRVBUSU9OID0gMTIzNDsgLy8gOTkgYW5kIGFib3ZlIGFyZSByZXNlcnZlZCBmb3IgYXBwbGljYXRpb25zCitlbnVtIEVSUl9GSUxFX0RfRVhDRVBUSU9OID0gImRfZXhjZXB0aW9uIjsKK2VudW0gRVJSX0xJTkVfRF9FWENFUFRJT04gPSAwOworZW51bSBFUlJfRkxBR1NfRF9FWENFUFRJT04gPSAwOworCisvKioKKyAqIFJldHVybnMgYW4gZXhjZXB0aW9uIGZvciB0aGUgbGFzdC4KKyAqCisgKiBQYXJhbXM6CisgKiAgIGxvY2F0aW9uID0gQW4gb3B0aW9uYWwgImxvY2F0aW9uIiB0byBhZGQgdG8gdGhlIGVycm9yIG1lc3NhZ2UgKHR5cGljYWxseQorICogICAgIHRoZSBsYXN0IFNTTCBBUEkgY2FsbCkuCisgKi8KK0V4Y2VwdGlvbiBnZXRTU0xFeGNlcHRpb24oc3RyaW5nIGxvY2F0aW9uID0gbnVsbCwgc3RyaW5nIGNsaWVudEZpbGUgPSBfX0ZJTEVfXywKKyAgc2l6ZV90IGNsaWVudExpbmUgPSBfX0xJTkVfXworKSB7CisgIC8vIFdlIGNhbiByZXR1cm4gZWl0aGVyIGFuIGV4Y2VwdGlvbiBzYXZlZCBmcm9tIEQgQklPIGNvZGUsIG9yIGEgInRydWUiCisgIC8vIE9wZW5TU0wgZXJyb3IuIEJlY2F1c2UgdGhlcmUgY2FuIHBvc3NpYmx5IGJlIG1vcmUgdGhhbiBvbmUgZXJyb3Igb24gdGhlCisgIC8vIGVycm9yIHN0YWNrLCB3ZSBoYXZlIHRvIGZldGNoIGFsbCBvZiB0aGVtLCBhbmQgcGljayB0aGUgbGFzdCwgaS5lLiBuZXdlc3QKKyAgLy8gb25lLiBXZSBjb25jYXRlbmF0ZSBtdWx0aXBsZSBzdWNjZXNzaXZlIE9wZW5TU0wgZXJyb3IgbWVzc2FnZXMgaW50byBhCisgIC8vIHNpbmdsZSBvbmUsIGJ1dCBhbHdheXMganVzdCByZXR1cm4gdGhlIGxhc3QgRCBleHBjZXRpb24uCisgIHN0cmluZyBtZXNzYWdlOyAvLyBQcm9iYWJseSBiZXR0ZXIgdXNlIGFuIEFwcGVuZGVyIGhlcmUuCisgIGJvb2wgaGFkTWVzc2FnZTsKKyAgRXhjZXB0aW9uIGV4Y2VwdGlvbjsKKworICB2b2lkIGluaXRNZXNzYWdlKCkgeworICAgIG1lc3NhZ2UuZGVzdHJveSgpOworICAgIGhhZE1lc3NhZ2UgPSBmYWxzZTsKKyAgICBpZiAoIWxvY2F0aW9uLmVtcHR5KSB7CisgICAgICBtZXNzYWdlIH49IGxvY2F0aW9uOworICAgICAgbWVzc2FnZSB+PSAiOiAiOworICAgIH0KKyAgfQorICBpbml0TWVzc2FnZSgpOworCisgIGF1dG8gZXJybiA9IGVycm5vOworCisgIGNvbnN0KGNoYXIpKiBmaWxlID0gdm9pZDsKKyAgaW50IGxpbmUgPSB2b2lkOworICBjb25zdChjaGFyKSogZGF0YSA9IHZvaWQ7CisgIGludCBmbGFncyA9IHZvaWQ7CisgIGNfdWxvbmcgY29kZSA9IHZvaWQ7CisgIHdoaWxlICgoY29kZSA9IEVSUl9nZXRfZXJyb3JfbGluZV9kYXRhKCZmaWxlLCAmbGluZSwgJmRhdGEsICZmbGFncykpICE9IDApIHsKKyAgICBpZiAoRVJSX0dFVF9SRUFTT04oY29kZSkgPT0gRVJSX1JfRF9FWENFUFRJT04pIHsKKyAgICAgIGluaXRNZXNzYWdlKCk7CisgICAgICBHQy5yZW1vdmVSb290KGNhc3Qodm9pZCopZGF0YSk7CisgICAgICBleGNlcHRpb24gPSBjYXN0KEV4Y2VwdGlvbilkYXRhOworICAgIH0gZWxzZSB7CisgICAgICBleGNlcHRpb24gPSBudWxsOworCisgICAgICBpZiAoaGFkTWVzc2FnZSkgeworICAgICAgICBtZXNzYWdlIH49ICIsICI7CisgICAgICB9CisKKyAgICAgIGF1dG8gcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoY29kZSk7CisgICAgICBpZiAocmVhc29uKSB7CisgICAgICAgIG1lc3NhZ2Ugfj0gIlNTTCBlcnJvcjogIiB+IHRvIXN0cmluZyhyZWFzb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVzc2FnZSB+PSAiU1NMIGVycm9yICMiIH4gdG8hc3RyaW5nKGNvZGUpOworICAgICAgfQorCisgICAgICBoYWRNZXNzYWdlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgbGFzdCBpdGVtIGZyb20gdGhlIHN0YWNrIHdhcyBhIEQgZXhjZXB0aW9uLCB0aHJvdyBpdC4KKyAgaWYgKGV4Y2VwdGlvbikgcmV0dXJuIGV4Y2VwdGlvbjsKKworICAvLyBXZSBhcmUgZGVhbGluZyB3aXRoIGFuIE9wZW5TU0wgZXJyb3IgdGhhdCBkb2Vzbid0IHJvb3QgaW4gYSBEIGV4Y2VwdGlvbi4KKyAgaWYgKCFoYWRNZXNzYWdlKSB7CisgICAgLy8gSWYgd2UgZGlkbid0IGdldCBhbiBhY3R1YWwgZXJyb3IgZnJvbSB0aGUgc3RhY2sgeWV0LCB0cnkgZXJybm8uCisgICAgc3RyaW5nIGVycm5TdHJpbmc7CisgICAgaWYgKGVycm4gIT0gMCkgeworICAgICAgZXJyblN0cmluZyA9IHRvIXN0cmluZyhzdHJlcnJvcihlcnJuKSk7CisgICAgfQorICAgIGlmIChlcnJuU3RyaW5nLmVtcHR5KSB7CisgICAgICBtZXNzYWdlIH49ICJVbmtub3duIGVycm9yIjsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZSB+PSBlcnJuU3RyaW5nOworICAgIH0KKyAgfQorCisgIG1lc3NhZ2Ugfj0gIi4iOworICByZXR1cm4gbmV3IFRTU0xFeGNlcHRpb24obWVzc2FnZSwgY2xpZW50RmlsZSwgY2xpZW50TGluZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODUwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFByb3ZpZGVzIGEgU1NMIEJJTyBpbXBsZW1lbnRhdGlvbiB3cmFwcGluZyBhIFRocmlmdCB0cmFuc3BvcnQuCisgKgorICogVGhpcyB3YXksIFNTTCBJL08gY2FuIGJlIHJlbGF5ZWQgb3ZlciBUaHJpZnQgdHJhbnNwb3J0IHdpdGhvdXQgaW50cm9kdWNpbmcKKyAqIGFuIGFkZGl0aW9uYWwgbGF5ZXIgb2YgYnVmZmVyaW5nLCBlc3BlY2lhbGx5IGZvciB0aGUgbm9uLWJsb2NraW5nCisgKiB0cmFuc3BvcnRzLgorICoKKyAqIEZvciB0aGUgVGhyaWZ0IHRyYW5zcG9ydCBpbmNhcm5hdGlvbnMgb2YgdGhlIFNTTCBlbnRpdGllcywgInR0IiBpcyB1c2VkIGFzCisgKiBwcmVmaXggZm9yIGNsYXJpdHkuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwuc3NsX2JpbzsKKworaW1wb3J0IGNvcmUuc3RkYy5jb25maWc7CitpbXBvcnQgY29yZS5zdGRjLnN0cmluZyA6IHN0cmxlbjsKK2ltcG9ydCBjb3JlLm1lbW9yeSA6IEdDOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLmJpbzsKK2ltcG9ydCBkZWltb3Mub3BlbnNzbC5lcnI7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNzbDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogQ3JlYXRlcyBhbiBTU0wgQklPIG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gdHJhbnNwb3J0LgorICoKKyAqIEV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSB0cmFuc3BvcnQgYXJlIHB1c2hlZCBvbnRvIHRoZSBPcGVuU1NMIGVycm9yIHN0YWNrLAorICogdXNpbmcgdGhlIGxvY2F0aW9uL3JlYXNvbiB2YWx1ZXMgZnJvbSB0aHJpZnQuaW50ZXJuYWwuc3NsLkVSUl8qX0RfRVhDRVBUSU9OLgorICoKKyAqIFRoZSB0cmFuc3BvcnQgaXMgYXNzdW1lZCB0byBiZSByZWFkeSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB3aGVuIHRoZSBCSU8KKyAqIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLCBpdCBpcyBub3Qgb3BlbmVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBQYXJhbXM6CisgKiAgIHRyYW5zcG9ydCA9IFRoZSB0cmFuc3BvcnQgdG8gd3JhcC4KKyAqICAgY2xvc2VUcmFuc3BvcnQgPSBXaGV0aGVyIHRoZSBjbG9zZSB0aGUgdHJhbnNwb3J0IHdoZW4gdGhlIFNTTCBCSU8gaXMKKyAqICAgICBjbG9zZWQuCisgKi8KK0JJTyogY3JlYXRlVFRyYW5zcG9ydEJJTyhUVHJhbnNwb3J0IHRyYW5zcG9ydCwgYm9vbCBjbG9zZVRyYW5zcG9ydCkgeworICBhdXRvIHJlc3VsdCA9IEJJT19uZXcoY2FzdChCSU9fTUVUSE9EKikmdHRCaW9NZXRob2QpOworICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7CisKKyAgR0MuYWRkUm9vdChjYXN0KHZvaWQqKXRyYW5zcG9ydCk7CisgIEJJT19zZXRfZmQocmVzdWx0LCBjbG9zZVRyYW5zcG9ydCwgY2FzdChjX2xvbmcpY2FzdCh2b2lkKil0cmFuc3BvcnQpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ByaXZhdGUgeworICAvLyBIZWxwZXIgdG8gZ2V0IHRoZSBUaHJpZnQgdHJhbnNwb3J0IGFzc2lnbmVkIHdpdGggdGhlIGdpdmVuIEJJTy4KKyAgVFRyYW5zcG9ydCB0cmFucyhCSU8qIGIpIG5vdGhyb3cgeworICAgIGF1dG8gcmVzdWx0ID0gY2FzdChUVHJhbnNwb3J0KWIucHRyOworICAgIGFzc2VydChyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB2b2lkIHNldEVycm9yKEV4Y2VwdGlvbiBlKSBub3Rocm93IHsKKyAgICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfRF9FWENFUFRJT04sIEVSUl9GX0RfRVhDRVBUSU9OLCBFUlJfUl9EX0VYQ0VQVElPTiwKKyAgICAgIEVSUl9GSUxFX0RfRVhDRVBUSU9OLCBFUlJfTElORV9EX0VYQ0VQVElPTik7CisgICAgdHJ5IHsgR0MuYWRkUm9vdChjYXN0KHZvaWQqKWUpOyB9IGNhdGNoIChUaHJvd2FibGUpIHt9CisgICAgRVJSX3NldF9lcnJvcl9kYXRhKGNhc3QoY2hhciopZSwgRVJSX0ZMQUdTX0RfRVhDRVBUSU9OKTsKKyAgfQorCisgIGV4dGVybihDKSBpbnQgdHRXcml0ZShCSU8qIGIsIGNvbnN0KGNoYXIpKiBkYXRhLCBpbnQgbGVuZ3RoKSBub3Rocm93IHsKKyAgICBhc3NlcnQoYik7CisgICAgaWYgKCFkYXRhIHx8IGxlbmd0aCA8PSAwKSByZXR1cm4gMDsKKyAgICB0cnkgeworICAgICAgdHJhbnMoYikud3JpdGUoKGNhc3QodWJ5dGUqKWRhdGEpWzAgLi4gbGVuZ3RoXSk7CisgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBzZXRFcnJvcihlKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBleHRlcm4oQykgaW50IHR0UmVhZChCSU8qIGIsIGNoYXIqIGRhdGEsIGludCBsZW5ndGgpIG5vdGhyb3cgeworICAgIGFzc2VydChiKTsKKyAgICBpZiAoIWRhdGEgfHwgbGVuZ3RoIDw9IDApIHJldHVybiAwOworICAgIHRyeSB7CisgICAgICByZXR1cm4gY2FzdChpbnQpdHJhbnMoYikucmVhZCgoY2FzdCh1Ynl0ZSopZGF0YSlbMCAuLiBsZW5ndGhdKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgc2V0RXJyb3IoZSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgZXh0ZXJuKEMpIGludCB0dFB1dHMoQklPKiBiLCBjb25zdChjaGFyKSogc3RyKSBub3Rocm93IHsKKyAgICByZXR1cm4gdHRXcml0ZShiLCBzdHIsIGNhc3QoaW50KXN0cmxlbihzdHIpKTsKKyAgfQorCisgIGV4dGVybihDKSBjX2xvbmcgdHRDdHJsKEJJTyogYiwgaW50IGNtZCwgY19sb25nIG51bSwgdm9pZCogcHRyKSBub3Rocm93IHsKKyAgICBhc3NlcnQoYik7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgY2FzZSBCSU9fQ19TRVRfRkQ6CisgICAgICAgIC8vIE5vdGUgdGhhdCBjbG9zZSBmbGFnIGFuZCAiZmQiIGFyZSBhY3R1YWxseSByZXZlcnNlZCBoZXJlIGJlY2F1c2Ugd2UKKyAgICAgICAgLy8gbmVlZCA2NCBiaXQgd2lkdGggZm9yIHRoZSBwb2ludGVyIOKAkyBzaG91bGQgcHJvYmFibHkgZHJvcCBCSU9fc2V0X2ZkCisgICAgICAgIC8vIGFsdG9nZXRoZXIuCisgICAgICAgIHR0RGVzdHJveShiKTsKKyAgICAgICAgYi5wdHIgPSBjYXN0KHZvaWQqKW51bTsKKyAgICAgICAgYi5zaHV0ZG93biA9IGNhc3QoaW50KXB0cjsKKyAgICAgICAgYi5pbml0XyA9IDE7CisgICAgICAgIHJldHVybiAxOworICAgICAgY2FzZSBCSU9fQ19HRVRfRkQ6CisgICAgICAgIGlmICghYi5pbml0XykgcmV0dXJuIC0xOworICAgICAgICAqKGNhc3Qodm9pZCoqKXB0cikgPSBiLnB0cjsKKyAgICAgICAgcmV0dXJuIGNhc3QoY19sb25nKWIucHRyOworICAgICAgY2FzZSBCSU9fQ1RSTF9HRVRfQ0xPU0U6CisgICAgICAgIHJldHVybiBiLnNodXRkb3duOworICAgICAgY2FzZSBCSU9fQ1RSTF9TRVRfQ0xPU0U6CisgICAgICAgIGIuc2h1dGRvd24gPSBjYXN0KGludCludW07CisgICAgICAgIHJldHVybiAxOworICAgICAgY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0cmFucyhiKS5mbHVzaCgpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHNldEVycm9yKGUpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgY2FzZSBCSU9fQ1RSTF9EVVA6CisgICAgICAgIC8vIFNlZW1zIGxpa2Ugd2UgaGF2ZSBub3RoaW5nIHRvIGRvIG9uIGR1cGxpY2F0aW9uLCBidXQgY291bGRuJ3QgZmluZAorICAgICAgICAvLyBhbnkgZG9jdW1lbnRhdGlvbiBpZiB0aGlzIGFjdHVhbGx5IGV2ZXIgaGFwcGVucyBkdXJpbmcgbm9ybWFsIFNTTAorICAgICAgICAvLyB1c2FnZS4KKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBleHRlcm4oQykgaW50IHR0Q3JlYXRlKEJJTyogYikgbm90aHJvdyB7CisgICAgYXNzZXJ0KGIpOworICAgIGIuaW5pdF8gPSAwOworICAgIGIubnVtID0gMDsgLy8gVXNlci1kZWZpbmVkIG51bWJlciBmaWVsZCwgdW51c2VkIGhlcmUuCisgICAgYi5wdHIgPSBudWxsOworICAgIGIuZmxhZ3MgPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgZXh0ZXJuKEMpIGludCB0dERlc3Ryb3koQklPKiBiKSBub3Rocm93IHsKKyAgICBpZiAoIWIpIHJldHVybiAwOworCisgICAgaW50IHJjID0gMTsKKyAgICBpZiAoYi5zaHV0ZG93bikgeworICAgICAgaWYgKGIuaW5pdF8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB0cmFucyhiKS5jbG9zZSgpOworICAgICAgICAgIEdDLnJlbW92ZVJvb3QoY2FzdCh2b2lkKil0cmFucyhiKSk7CisgICAgICAgICAgYi5wdHIgPSBudWxsOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIHNldEVycm9yKGUpOworICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGIuaW5pdF8gPSAwOworICAgICAgYi5mbGFncyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworICB9CisKKyAgaW1tdXRhYmxlIEJJT19NRVRIT0QgdHRCaW9NZXRob2QgPSB7CisgICAgQklPX1RZUEVfU09VUkNFX1NJTkssCisgICAgIlRUcmFuc3BvcnQiLAorICAgICZ0dFdyaXRlLAorICAgICZ0dFJlYWQsCisgICAgJnR0UHV0cywKKyAgICBudWxsLCAvLyBnZXRzCisgICAgJnR0Q3RybCwKKyAgICAmdHRDcmVhdGUsCisgICAgJnR0RGVzdHJveSwKKyAgICBudWxsIC8vIGNhbGxiYWNrX2N0cmwKKyAgfTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9wcm90b2NvbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3Byb3RvY29sLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyNTE1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9wcm90b2NvbC5kCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LmludGVybmFsLnRlc3QucHJvdG9jb2w7CisKK2ltcG9ydCBzdGQuZXhjZXB0aW9uOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworCit2ZXJzaW9uICh1bml0dGVzdCk6CisKK3ZvaWQgdGVzdENvbnRhaW5lclNpemVMaW1pdChQcm90b2NvbCkoKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpIHsKKyAgYXV0byBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byBwcm90ID0gbmV3IFByb3RvY29sKGJ1ZmZlcik7CisKKyAgLy8gTWFrZSBzdXJlIHJlYWRpbmcgZmFpbHMgaWYgYSBjb250YWluZXIgbGFyZ2VyIHRoYW4gdGhlIHNpemUgbGltaXQgaXMgcmVhZC4KKyAgcHJvdC5jb250YWluZXJTaXplTGltaXQgPSAzOworCisgIHsKKyAgICBwcm90LndyaXRlTGlzdEJlZ2luKFRMaXN0KFRUeXBlLkkzMiwgNCkpOworICAgIHByb3Qud3JpdGVJMzIoMCk7IC8vIE1ha2Ugc3VyZSBzaXplIGNhbiBiZSByZWFkIGUuZy4gZm9yIEpTT04gcHJvdG9jb2wuCisgICAgcHJvdC5yZXNldCgpOworCisgICAgYXV0byBlID0gY2FzdChUUHJvdG9jb2xFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwcm90LnJlYWRMaXN0QmVnaW4oKSk7CisgICAgZW5mb3JjZShlICYmIGUudHlwZSA9PSBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICBwcm90LnJlc2V0KCk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgIH0KKworICB7CisgICAgcHJvdC53cml0ZU1hcEJlZ2luKFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDQpKTsKKyAgICBwcm90LndyaXRlSTMyKDApOyAvLyBNYWtlIHN1cmUgc2l6ZSBjYW4gYmUgcmVhZCBlLmcuIGZvciBKU09OIHByb3RvY29sLgorICAgIHByb3QucmVzZXQoKTsKKworICAgIGF1dG8gZSA9IGNhc3QoVFByb3RvY29sRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocHJvdC5yZWFkTWFwQmVnaW4oKSk7CisgICAgZW5mb3JjZShlICYmIGUudHlwZSA9PSBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICBwcm90LnJlc2V0KCk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgIH0KKworICB7CisgICAgcHJvdC53cml0ZVNldEJlZ2luKFRTZXQoVFR5cGUuSTMyLCA0KSk7CisgICAgcHJvdC53cml0ZUkzMigwKTsgLy8gTWFrZSBzdXJlIHNpemUgY2FuIGJlIHJlYWQgZS5nLiBmb3IgSlNPTiBwcm90b2NvbC4KKyAgICBwcm90LnJlc2V0KCk7CisKKyAgICBhdXRvIGUgPSBjYXN0KFRQcm90b2NvbEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHByb3QucmVhZFNldEJlZ2luKCkpOworICAgIGVuZm9yY2UoZSAmJiBlLnR5cGUgPT0gVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgcHJvdC5yZXNldCgpOworICAgIGJ1ZmZlci5yZXNldCgpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHJlYWRpbmcgd29ya3MgaWYgdGhlIGNvbnRhaW5lcnMgYXJlIHNtYWxsZXIgdGhhbiB0aGUgbGltaXQgb3IKKyAgLy8gbm8gbGltaXQgaXMgc2V0LgorICBmb3JlYWNoIChsaW1pdDsgWzMsIDAsIC0xXSkgeworICAgIHByb3QuY29udGFpbmVyU2l6ZUxpbWl0ID0gbGltaXQ7CisKKyAgICB7CisgICAgICBwcm90LndyaXRlTGlzdEJlZ2luKFRMaXN0KFRUeXBlLkkzMiwgMikpOworICAgICAgcHJvdC53cml0ZUkzMigwKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMSk7CisgICAgICBwcm90LndyaXRlTGlzdEVuZCgpOworICAgICAgcHJvdC5yZXNldCgpOworCisgICAgICBhdXRvIGxpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGVuZm9yY2UobGlzdC5lbGVtVHlwZSA9PSBUVHlwZS5JMzIpOworICAgICAgZW5mb3JjZShsaXN0LnNpemUgPT0gMik7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDApOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAxKTsKKyAgICAgIHByb3QucmVhZExpc3RFbmQoKTsKKworICAgICAgcHJvdC5yZXNldCgpOworICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgeworICAgICAgcHJvdC53cml0ZU1hcEJlZ2luKFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDIpKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMCk7CisgICAgICBwcm90LndyaXRlSTMyKDEpOworICAgICAgcHJvdC53cml0ZUkzMigyKTsKKyAgICAgIHByb3Qud3JpdGVJMzIoMyk7CisgICAgICBwcm90LndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90LnJlc2V0KCk7CisKKyAgICAgIGF1dG8gbWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGVuZm9yY2UobWFwLmtleVR5cGUgPT0gVFR5cGUuSTMyKTsKKyAgICAgIGVuZm9yY2UobWFwLnZhbHVlVHlwZSA9PSBUVHlwZS5JMzIpOworICAgICAgZW5mb3JjZShtYXAuc2l6ZSA9PSAyKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMCk7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDEpOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAyKTsKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkSTMyKCkgPT0gMyk7CisgICAgICBwcm90LnJlYWRNYXBFbmQoKTsKKworICAgICAgcHJvdC5yZXNldCgpOworICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgeworICAgICAgcHJvdC53cml0ZVNldEJlZ2luKFRTZXQoVFR5cGUuSTMyLCAyKSk7CisgICAgICBwcm90LndyaXRlSTMyKDApOworICAgICAgcHJvdC53cml0ZUkzMigxKTsKKyAgICAgIHByb3Qud3JpdGVTZXRFbmQoKTsKKyAgICAgIHByb3QucmVzZXQoKTsKKworICAgICAgYXV0byBzZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgZW5mb3JjZShzZXQuZWxlbVR5cGUgPT0gVFR5cGUuSTMyKTsKKyAgICAgIGVuZm9yY2Uoc2V0LnNpemUgPT0gMik7CisgICAgICBlbmZvcmNlKHByb3QucmVhZEkzMigpID09IDApOworICAgICAgZW5mb3JjZShwcm90LnJlYWRJMzIoKSA9PSAxKTsKKyAgICAgIHByb3QucmVhZFNldEVuZCgpOworCisgICAgICBwcm90LnJlc2V0KCk7CisgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0ZXN0U3RyaW5nU2l6ZUxpbWl0KFByb3RvY29sKSgpIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkgeworICBhdXRvIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHByb3QgPSBuZXcgUHJvdG9jb2woYnVmZmVyKTsKKworICAvLyBNYWtlIHN1cmUgcmVhZGluZyBmYWlscyBpZiBhIHN0cmluZyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBsaW1pdCBpcyByZWFkLgorICBwcm90LnN0cmluZ1NpemVMaW1pdCA9IDM7CisKKyAgeworICAgIHByb3Qud3JpdGVTdHJpbmcoImFzZGYiKTsKKyAgICBwcm90LnJlc2V0KCk7CisKKyAgICBhdXRvIGUgPSBjYXN0KFRQcm90b2NvbEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKHByb3QucmVhZFN0cmluZygpKTsKKyAgICBlbmZvcmNlKGUgJiYgZS50eXBlID09IFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIHByb3QucmVzZXQoKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgfQorCisgIHsKKyAgICBwcm90LndyaXRlQmluYXJ5KFsxLCAyLCAzLCA0XSk7CisgICAgcHJvdC5yZXNldCgpOworCisgICAgYXV0byBlID0gY2FzdChUUHJvdG9jb2xFeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwcm90LnJlYWRCaW5hcnkoKSk7CisgICAgZW5mb3JjZShlICYmIGUudHlwZSA9PSBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICBwcm90LnJlc2V0KCk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgcmVhZGluZyB3b3JrcyBpZiB0aGUgY29udGFpbmVycyBhcmUgc21hbGxlciB0aGFuIHRoZSBsaW1pdCBvcgorICAvLyBubyBsaW1pdCBpcyBzZXQuCisgIGZvcmVhY2ggKGxpbWl0OyBbMywgMCwgLTFdKSB7CisgICAgcHJvdC5jb250YWluZXJTaXplTGltaXQgPSBsaW1pdDsKKworICAgIHsKKyAgICAgIHByb3Qud3JpdGVTdHJpbmcoImFzIik7CisgICAgICBwcm90LnJlc2V0KCk7CisKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkU3RyaW5nKCkgPT0gImFzIik7CisgICAgICBwcm90LnJlc2V0KCk7CisgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICB7CisgICAgICBwcm90LndyaXRlQmluYXJ5KFsxLCAyXSk7CisgICAgICBwcm90LnJlc2V0KCk7CisKKyAgICAgIGVuZm9yY2UocHJvdC5yZWFkQmluYXJ5KCkgPT0gWzEsIDJdKTsKKyAgICAgIHByb3QucmVzZXQoKTsKKyAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3NlcnZlci5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3NlcnZlci5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNWU4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Rlc3Qvc2VydmVyLmQKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuaW50ZXJuYWwudGVzdC5zZXJ2ZXI7CisKK2ltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKK2ltcG9ydCBzdGQuZGF0ZXRpbWU7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnR5cGVjb25zIDogV2hpdGVIb2xlOworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCit2ZXJzaW9uKHVuaXR0ZXN0KToKKworLyoqCisgKiBUZXN0cyBpZiBzZXJ2aW5nIGlzIHN0b3BwZWQgY29ycmVjdGx5IGlmIHRoZSBjYW5jZWxsYXRpb24gcGFzc2VkIHRvIHNlcnZlKCkKKyAqIGlzIHRyaWdnZXJlZC4KKyAqCisgKiBCZWNhdXNlIHRoZSB0ZXN0cyBhcmUgcnVuIG1hbnkgdGltZXMgaW4gYSBsb29wLCB0aGlzIGlzIGluZGlyZWN0bHkgYWxzbyBhCisgKiB0ZXN0IHdoZXRoZXIgc29ja2V0LCBldGMuIGhhbmRsZXMgYXJlIGNsZWFuZWQgdXAgY29ycmVjdGx5LCBiZWNhdXNlIHRoZQorICogYXBwbGljYXRpb24gd2lsbCBsaWtlbHkgcnVuIG91dCBvZiBoYW5kbGVzIG90aGVyd2lzZS4KKyAqLwordm9pZCB0ZXN0U2VydmVDYW5jZWwoU2VydmVyKSh2b2lkIGRlbGVnYXRlKFNlcnZlcikgc2VydmVyU2V0dXAgPSBudWxsKSBpZiAoCisgIGlzKFNlcnZlciA6IFRTZXJ2ZXIpCispIHsKKyAgYXV0byBwcm9jID0gbmV3IFdoaXRlSG9sZSFUUHJvY2Vzc29yOworICBhdXRvIHRmID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5OworICBhdXRvIHBmID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7CisKKyAgLy8gTmVlZCBhIHNwZWNpYWwgY2FzZSBmb3IgVE5vbmJsb2NraW5nU2VydmVyIHdoaWNoIGRvZXNuJ3QgdXNlCisgIC8vIFRTZXJ2ZXJUcmFuc3BvcnQuCisgIHN0YXRpYyBpZiAoX190cmFpdHMoY29tcGlsZXMsIG5ldyBTZXJ2ZXIocHJvYywgMCwgdGYsIHBmKSkpIHsKKyAgICBhdXRvIHNlcnZlciA9IG5ldyBTZXJ2ZXIocHJvYywgMCwgdGYsIHBmKTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvIHNlcnZlciA9IG5ldyBTZXJ2ZXIocHJvYywgbmV3IFRTZXJ2ZXJTb2NrZXQoMCksIHRmLCBwZik7CisgIH0KKworICAvLyBPbiBXaW5kb3dzLCB3ZSB1c2UgVENQIHNvY2tldHMgdG8gcmVwbGFjZSBzb2NrZXRwYWlyKCkuIFNpbmNlIHRoZXkgc3RheQorICAvLyBpbiBUSU1FX1dBSVQgZm9yIHNvbWUgdGltZSBldmVuIGlmIHRoZXkgYXJlIHByb3Blcmx5IGNsb3NlZCwgd2UgaGF2ZSB0byB1c2UKKyAgLy8gYSBsb3dlciBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBhdm9pZCBydW5uaW5nIG91dCBvZiBwb3J0cy9idWZmZXIgc3BhY2UuCisgIHZlcnNpb24gKFdpbmRvd3MpIHsKKyAgICBlbnVtIElURVJBVElPTlMgPSAxMDA7CisgIH0gZWxzZSB7CisgICAgZW51bSBJVEVSQVRJT05TID0gMTAwMDA7CisgIH0KKworICBpZiAoc2VydmVyU2V0dXApIHNlcnZlclNldHVwKHNlcnZlcik7CisKKyAgYXV0byBzZXJ2aW5nTXV0ZXggPSBuZXcgTXV0ZXg7CisgIGF1dG8gc2VydmluZ0NvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oc2VydmluZ011dGV4KTsKKyAgYXV0byBkb25lTXV0ZXggPSBuZXcgTXV0ZXg7CisgIGF1dG8gZG9uZUNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oZG9uZU11dGV4KTsKKworICBjbGFzcyBDYW5jZWxsaW5nSGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICAgIHZvaWQgcHJlU2VydmUoKSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpbmdNdXRleCkgeworICAgICAgICBzZXJ2aW5nQ29uZGl0aW9uLm5vdGlmeUFsbCgpOworICAgICAgfQorICAgIH0KKyAgICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7IHJldHVybiBWYXJpYW50LmluaXQ7IH0KKyAgICB2b2lkIGRlbGV0ZUNvbnRleHQoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHt9CisgICAgdm9pZCBwcmVQcm9jZXNzKFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHt9CisgIH0KKyAgc2VydmVyLmV2ZW50SGFuZGxlciA9IG5ldyBDYW5jZWxsaW5nSGFuZGxlcjsKKworICBmb3JlYWNoIChpOyAwIC4uIElURVJBVElPTlMpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHNlcnZpbmdNdXRleCkgeworICAgICAgYXV0byBjYW5jZWwgPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbjsKKyAgICAgIHN5bmNocm9uaXplZCAoZG9uZU11dGV4KSB7CisgICAgICAgIGF1dG8gc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCh7CisgICAgICAgICAgc2VydmVyLnNlcnZlKGNhbmNlbCk7CisgICAgICAgICAgc3luY2hyb25pemVkIChkb25lTXV0ZXgpIHsKKyAgICAgICAgICAgIGRvbmVDb25kaXRpb24ubm90aWZ5QWxsKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc2VydmVyVGhyZWFkLmlzRGFlbW9uID0gdHJ1ZTsKKyAgICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7CisKKyAgICAgICAgc2VydmluZ0NvbmRpdGlvbi53YWl0KCk7CisKKyAgICAgICAgY2FuY2VsLnRyaWdnZXIoKTsKKyAgICAgICAgZW5mb3JjZShkb25lQ29uZGl0aW9uLndhaXQoZHVyISJtc2VjcyIoMyoxMDAwKSkpOworICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90cmFpdHMuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdHJhaXRzLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMTA4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdHJhaXRzLmQKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5pbnRlcm5hbC50cmFpdHM7CisKK2ltcG9ydCBzdGQudHJhaXRzOworCisvKioKKyAqIEFkZHMgwrtub3Rocm93wqsgdG8gdGhlIHR5cGUgb2YgdGhlIHBhc3NlZCBmdW5jdGlvbiBwb2ludGVyL2RlbGVnYXRlLCBpZiBpdAorICogaXMgbm90IGFscmVhZHkgcHJlc2VudC4KKyAqCisgKiBUZWNobmljYWxseSwgYXNzdW1lTm90aHJvdyBqdXN0IHBlcmZvcm1zIGEgY2FzdCwgYnV0IHVzaW5nIGl0IGhhcyB0aGUKKyAqIGFkdmFudGFnZSBvZiBiZWluZyBleHBsaWNpdGx5IGFib3V0IHRoZSBvcGVyYXRpb24gdGhhdCBpcyBwZXJmb3JtZWQuCisgKi8KK2F1dG8gYXNzdW1lTm90aHJvdyhUKShUIHQpIGlmIChpc0Z1bmN0aW9uUG9pbnRlciFUIHx8IGlzRGVsZWdhdGUhVCkgeworICBlbnVtIGF0dHJzID0gZnVuY3Rpb25BdHRyaWJ1dGVzIVQgfCBGdW5jdGlvbkF0dHJpYnV0ZS5ub3Rocm93XzsKKyAgcmV0dXJuIGNhc3QoU2V0RnVuY3Rpb25BdHRyaWJ1dGVzIShULCBmdW5jdGlvbkxpbmthZ2UhVCwgYXR0cnMpKSB0OworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2Jhc2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY0OGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iYXNlLmQKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBEZWZpbmVzIHRoZSBiYXNpYyBpbnRlcmZhY2UgZm9yIGEgVGhyaWZ0IHByb3RvY29sIGFuZCBhc3NvY2lhdGVkIGV4Y2VwdGlvbgorICogdHlwZXMuCisgKgorICogTW9zdCBwYXJ0cyBvZiB0aGUgcHJvdG9jb2wgQVBJIGFyZSB0eXBpY2FsbHkgbm90IHVzZWQgaW4gY2xpZW50IGNvZGUsIGFzCisgKiB0aGUgYWN0dWFsIHNlcmlhbGl6YXRpb24gY29kZSBpcyBnZW5lcmF0ZWQgYnkgdGhyaWZ0LmNvZGVnZW4uKiDigJMgdGhlIG9ubHkKKyAqIGludGVyZXN0aW5nIHRoaW5nIHVzdWFsbHkgaXMgdGhhdCB0aGVyZSBhcmUgcHJvdG9jb2xzIHdoaWNoIGNhbiBiZSBjcmVhdGVkCisgKiBmcm9tIHRyYW5zcG9ydHMgYW5kIHBhc3NlZCBhcm91bmQuCisgKi8KK21vZHVsZSB0aHJpZnQucHJvdG9jb2wuYmFzZTsKKworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBUaGUgZmllbGQgdHlwZXMgVGhyaWZ0IHByb3RvY29scyBzdXBwb3J0LgorICovCitlbnVtIFRUeXBlIDogYnl0ZSB7CisgIFNUT1AgICA9IDAsIC8vLyBVc2VkIHRvIG1hcmsgdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIGZpZWxkcy4KKyAgVk9JRCAgID0gMSwgLy8vCisgIEJPT0wgICA9IDIsIC8vLworICBCWVRFICAgPSAzLCAvLy8KKyAgRE9VQkxFID0gNCwgLy8vCisgIEkxNiAgICA9IDYsIC8vLworICBJMzIgICAgPSA4LCAvLy8KKyAgSTY0ICAgID0gMTAsIC8vLworICBTVFJJTkcgPSAxMSwgLy8vCisgIFNUUlVDVCA9IDEyLCAvLy8KKyAgTUFQICAgID0gMTMsIC8vLworICBTRVQgICAgPSAxNCwgLy8vCisgIExJU1QgICA9IDE1IC8vLworfQorCisvKioKKyAqIFR5cGVzIG9mIFRocmlmdCBSUEMgbWVzc2FnZXMuCisgKi8KK2VudW0gVE1lc3NhZ2VUeXBlIDogYnl0ZSB7CisgIENBTEwgPSAxLCAvLy8gQ2FsbCBvZiBhIG5vcm1hbCwgdHdvLXdheSBSUEMgbWV0aG9kLgorICBSRVBMWSA9IDIsIC8vLyBSZXBseSB0byBhIG5vcm1hbCBtZXRob2QgY2FsbC4KKyAgRVhDRVBUSU9OID0gMywgLy8vIFJlcGx5IHRvIGEgbWV0aG9kIGNhbGwgaWYgdGFyZ2V0IHJhaXNlZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi4KKyAgT05FV0FZID0gNCAvLy8gQ2FsbCBvZiBhIG9uZS13YXkgUlBDIG1ldGhvZCB3aGljaCBpcyBub3QgZm9sbG93ZWQgYnkgYSByZXBseS4KK30KKworLyoqCisgKiBEZXNjcmlwdGlvbnMgb2YgVGhyaWZ0IGVudGl0aWVzLgorICovCitzdHJ1Y3QgVEZpZWxkIHsKKyAgc3RyaW5nIG5hbWU7CisgIFRUeXBlIHR5cGU7CisgIHNob3J0IGlkOworfQorCisvLy8gZGl0dG8KK3N0cnVjdCBUTGlzdCB7CisgIFRUeXBlIGVsZW1UeXBlOworICBzaXplX3Qgc2l6ZTsKK30KKworLy8vIGRpdHRvCitzdHJ1Y3QgVE1hcCB7CisgIFRUeXBlIGtleVR5cGU7CisgIFRUeXBlIHZhbHVlVHlwZTsKKyAgc2l6ZV90IHNpemU7Cit9CisKKy8vLyBkaXR0bworc3RydWN0IFRNZXNzYWdlIHsKKyAgc3RyaW5nIG5hbWU7CisgIFRNZXNzYWdlVHlwZSB0eXBlOworICBpbnQgc2VxaWQ7Cit9CisKKy8vLyBkaXR0bworc3RydWN0IFRTZXQgeworICBUVHlwZSBlbGVtVHlwZTsKKyAgc2l6ZV90IHNpemU7Cit9CisKKy8vLyBkaXR0bworc3RydWN0IFRTdHJ1Y3QgeworICBzdHJpbmcgbmFtZTsKK30KKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGEgVGhyaWZ0IHByb3RvY29sIGltcGxlbWVudGF0aW9uLiBFc3NlbnRpYWxseSwgaXQgZGVmaW5lcworICogYSB3YXkgb2YgcmVhZGluZyBhbmQgd3JpdGluZyBhbGwgdGhlIGJhc2UgdHlwZXMsIHBsdXMgYSBtZWNoYW5pc20gZm9yCisgKiB3cml0aW5nIG91dCBzdHJ1Y3RzIHdpdGggaW5kZXhlZCBmaWVsZHMuCisgKgorICogVFByb3RvY29sIG9iamVjdHMgc2hvdWxkIG5vdCBiZSBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIGVuY29kaW5nIGNvbnRleHRzLAorICogYXMgdGhleSBtYXkgbmVlZCB0byBtYWludGFpbiBpbnRlcm5hbCBzdGF0ZSBpbiBzb21lIHByb3RvY29scyAoZS5nLiBKU09OKS4KKyAqIE5vdGUgdGhhdCBpcyBpcyBhY2NlcHRhYmxlIGZvciB0aGUgVFByb3RvY29sIG1vZHVsZSB0byBkbyBpdHMgb3duIGludGVybmFsCisgKiBidWZmZXJlZCByZWFkcy93cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgVFRyYW5zcG9ydCB3aGVyZSBhcHByb3ByaWF0ZSAoaS5lLgorICogd2hlbiBwYXJzaW5nIGFuIGlucHV0IFhNTCBzdHJlYW0sIHJlYWRpbmcgY291bGQgYmUgYmF0Y2hlZCByYXRoZXIgdGhhbgorICogbG9va2luZyBhaGVhZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyIGZvciBhIGNsb3NlIHRhZykuCisgKi8KK2ludGVyZmFjZSBUUHJvdG9jb2wgeworICAvLy8gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgYnkgdGhlIHByb3RvY29sLgorICBUVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eTsKKworICAvKgorICAgKiBXcml0aW5nIG1ldGhvZHMuCisgICAqLworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYik7IC8vLworICB2b2lkIHdyaXRlQnl0ZShieXRlIGIpOyAvLy8KKyAgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpOyAvLy8KKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKTsgLy8vCisgIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpOyAvLy8KKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKTsgLy8vCisgIHZvaWQgd3JpdGVTdHJpbmcoc3RyaW5nIHN0cik7IC8vLworICB2b2lkIHdyaXRlQmluYXJ5KHVieXRlW10gYnVmKTsgLy8vCisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKTsgLy8vCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCk7IC8vLworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCB0c3RydWN0KTsgLy8vCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKTsgLy8vCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCk7IC8vLworICB2b2lkIHdyaXRlRmllbGRFbmQoKTsgLy8vCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKTsgLy8vCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCk7IC8vLworICB2b2lkIHdyaXRlTGlzdEVuZCgpOyAvLy8KKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKTsgLy8vCisgIHZvaWQgd3JpdGVNYXBFbmQoKTsgLy8vCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCk7IC8vLworICB2b2lkIHdyaXRlU2V0RW5kKCk7IC8vLworCisgIC8qCisgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgYm9vbCByZWFkQm9vbCgpOyAvLy8KKyAgYnl0ZSByZWFkQnl0ZSgpOyAvLy8KKyAgc2hvcnQgcmVhZEkxNigpOyAvLy8KKyAgaW50IHJlYWRJMzIoKTsgLy8vCisgIGxvbmcgcmVhZEk2NCgpOyAvLy8KKyAgZG91YmxlIHJlYWREb3VibGUoKTsgLy8vCisgIHN0cmluZyByZWFkU3RyaW5nKCk7IC8vLworICB1Ynl0ZVtdIHJlYWRCaW5hcnkoKTsgLy8vCisKKyAgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpOyAvLy8KKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpOyAvLy8KKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKTsgLy8vCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpOyAvLy8KKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCk7IC8vLworICB2b2lkIHJlYWRGaWVsZEVuZCgpOyAvLy8KKyAgVExpc3QgcmVhZExpc3RCZWdpbigpOyAvLy8KKyAgdm9pZCByZWFkTGlzdEVuZCgpOyAvLy8KKyAgVE1hcCByZWFkTWFwQmVnaW4oKTsgLy8vCisgIHZvaWQgcmVhZE1hcEVuZCgpOyAvLy8KKyAgVFNldCByZWFkU2V0QmVnaW4oKTsgLy8vCisgIHZvaWQgcmVhZFNldEVuZCgpOyAvLy8KKworICAvKioKKyAgICogUmVzZXQgYW55IGludGVybmFsIHN0YXRlIGJhY2sgdG8gYSBibGFuayBzbGF0ZSwgaWYgdGhlIHByb3RvY29sIGlzCisgICAqIHN0YXRlZnVsLgorICAgKi8KKyAgdm9pZCByZXNldCgpOworfQorCisvKioKKyAqIHRydWUgaWYgVCBpcyBhIFRQcm90b2NvbC4KKyAqLwordGVtcGxhdGUgaXNUUHJvdG9jb2woVCkgeworICBlbnVtIGlzVFByb3RvY29sID0gaXMoVCA6IFRQcm90b2NvbCk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgc3RhdGljIGFzc2VydChpc1RQcm90b2NvbCFUUHJvdG9jb2wpOworICBzdGF0aWMgYXNzZXJ0KCFpc1RQcm90b2NvbCF2b2lkKTsKK30KKworLyoqCisgKiBDcmVhdGVzIGEgcHJvdG9jb2wgb3BlcmF0aW5nIG9uIGEgZ2l2ZW4gdHJhbnNwb3J0LgorICovCitpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeSB7CisgIC8vLworICBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucyk7Cit9CisKKy8qKgorICogQSBwcm90b2NvbC1sZXZlbCBleGNlcHRpb24uCisgKi8KK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvLy8gVGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiB0eXBlcy4KKyAgZW51bSBUeXBlIHsKKyAgICBVTktOT1dOLCAvLy8KKyAgICBJTlZBTElEX0RBVEEsIC8vLworICAgIE5FR0FUSVZFX1NJWkUsIC8vLworICAgIFNJWkVfTElNSVQsIC8vLworICAgIEJBRF9WRVJTSU9OLCAvLy8KKyAgICBOT1RfSU1QTEVNRU5URUQsIC8vLworICAgIERFUFRIX0xJTUlUIC8vLworICB9CisKKyAgLy8vCisgIHRoaXMoVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLCBUaHJvd2FibGUgbmV4dCA9IG51bGwpIHsKKyAgICBzdGF0aWMgc3RyaW5nIG1zZ0ZvclR5cGUoVHlwZSB0eXBlKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBUeXBlLlVOS05PV046IHJldHVybiAiVW5rbm93biBwcm90b2NvbCBleGNlcHRpb24iOworICAgICAgICBjYXNlIFR5cGUuSU5WQUxJRF9EQVRBOiByZXR1cm4gIkludmFsaWQgZGF0YSI7CisgICAgICAgIGNhc2UgVHlwZS5ORUdBVElWRV9TSVpFOiByZXR1cm4gIk5lZ2F0aXZlIHNpemUiOworICAgICAgICBjYXNlIFR5cGUuU0laRV9MSU1JVDogcmV0dXJuICJFeGNlZWRlZCBzaXplIGxpbWl0IjsKKyAgICAgICAgY2FzZSBUeXBlLkJBRF9WRVJTSU9OOiByZXR1cm4gIkludmFsaWQgdmVyc2lvbiI7CisgICAgICAgIGNhc2UgVHlwZS5OT1RfSU1QTEVNRU5URUQ6IHJldHVybiAiTm90IGltcGxlbWVudGVkIjsKKyAgICAgICAgY2FzZSBUeXBlLkRFUFRIX0xJTUlUOiByZXR1cm4gIkV4Y2VlZGVkIHNpemUgbGltaXQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CisgICAgICB9CisgICAgfQorICAgIHRoaXMobXNnRm9yVHlwZSh0eXBlKSwgdHlwZSwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHRoaXMobXNnLCBUeXBlLlVOS05PV04sIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLAorICAgIFRocm93YWJsZSBuZXh0ID0gbnVsbCkKKyAgeworICAgIHN1cGVyKG1zZywgZmlsZSwgbGluZSwgbmV4dCk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgLy8vCisgIFR5cGUgdHlwZSgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKK3Byb3RlY3RlZDoKKyAgVHlwZSB0eXBlXzsKK30KKworLyoqCisgKiBTa2lwcyBhIGZpZWxkIG9mIHRoZSBnaXZlbiB0eXBlIG9uIHRoZSBwcm90b2NvbC4KKyAqCisgKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHNraXAoKSBpcyB0byBhbGxvdyB0cmVhdGluZyBzdHJ1Y3QgYW5kIGNvbnRhaW5lciB0eXBlcywKKyAqICh3aGVyZSBtdWx0aXBsZSBwcmltaXRpdmUgdHlwZXMgaGF2ZSB0byBiZSBza2lwcGVkKSB0aGUgc2FtZSBhcyBzY2FsYXIgdHlwZXMKKyAqIGluIGdlbmVyYXRlZCBjb2RlLgorICovCit2b2lkIHNraXAoUHJvdG9jb2wpKFByb3RvY29sIHByb3QsIFRUeXBlIHR5cGUpIGlmIChpcyhQcm90b2NvbCA6IFRQcm90b2NvbCkpIHsKKyAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgcHJvdC5yZWFkQm9vbCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICBwcm90LnJlYWRCeXRlKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgcHJvdC5yZWFkSTE2KCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgcHJvdC5yZWFkSTMyKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgcHJvdC5yZWFkSTY0KCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgcHJvdC5yZWFkQmluYXJ5KCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGF1dG8gZiA9IHByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKGYudHlwZSA9PSBUVHlwZS5TVE9QKSBicmVhazsKKyAgICAgICAgc2tpcChwcm90LCBmLnR5cGUpOworICAgICAgICBwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgIGF1dG8gbCA9IHByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgZm9yZWFjaCAoaTsgMCAuLiBsLnNpemUpIHsKKyAgICAgICAgc2tpcChwcm90LCBsLmVsZW1UeXBlKTsKKyAgICAgIH0KKyAgICAgIHByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICBhdXRvIG0gPSBwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yZWFjaCAoaTsgMCAuLiBtLnNpemUpIHsKKyAgICAgICAgc2tpcChwcm90LCBtLmtleVR5cGUpOworICAgICAgICBza2lwKHByb3QsIG0udmFsdWVUeXBlKTsKKyAgICAgIH0KKyAgICAgIHByb3QucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgIGF1dG8gcyA9IHByb3QucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3JlYWNoIChpOyAwIC4uIHMuc2l6ZSkgeworICAgICAgICBza2lwKHByb3QsIHMuZWxlbVR5cGUpOworICAgICAgfQorICAgICAgcHJvdC5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRUeXBlLlNUT1A6IGdvdG8gY2FzZTsKKyAgICBjYXNlIFRUeXBlLlZPSUQ6CisgICAgICBhc3NlcnQoZmFsc2UsICJJbnZhbGlkIGZpZWxkIHR5cGUgcGFzc2VkLiIpOworICB9Cit9CisKKy8qKgorICogQXBwbGljYXRpb24tbGV2ZWwgZXhjZXB0aW9uLgorICoKKyAqIEl0IGlzIHRocm93biBpZiBhbiBSUEMgY2FsbCB3ZW50IHdyb25nIG9uIHRoZSBhcHBsaWNhdGlvbiBsYXllciwgZS5nLiBpZgorICogdGhlIHJlY2VpdmVyIGRvZXMgbm90IGtub3cgdGhlIG1ldGhvZCBuYW1lIHJlcXVlc3RlZCBvciBhIG1ldGhvZCBpbnZva2VkIGJ5CisgKiB0aGUgc2VydmljZSBwcm9jZXNzb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBub3QgcGFydCBvZiB0aGUgVGhyaWZ0IEFQSS4KKyAqLworY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8vLyBUaGUgcG9zc2libGUgZXhjZXB0aW9uIHR5cGVzLgorICBlbnVtIFR5cGUgeworICAgIFVOS05PV04gPSAwLCAvLy8KKyAgICBVTktOT1dOX01FVEhPRCA9IDEsIC8vLworICAgIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMiwgLy8vCisgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzLCAvLy8KKyAgICBCQURfU0VRVUVOQ0VfSUQgPSA0LCAvLy8KKyAgICBNSVNTSU5HX1JFU1VMVCA9IDUsIC8vLworICAgIElOVEVSTkFMX0VSUk9SID0gNiwgLy8vCisgICAgUFJPVE9DT0xfRVJST1IgPSA3LCAvLy8KKyAgICBJTlZBTElEX1RSQU5TRk9STSA9IDgsIC8vLworICAgIElOVkFMSURfUFJPVE9DT0wgPSA5LCAvLy8KKyAgICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwIC8vLworICB9CisKKyAgLy8vCisgIHRoaXMoVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLCBUaHJvd2FibGUgbmV4dCA9IG51bGwpIHsKKyAgICBzdGF0aWMgc3RyaW5nIG1zZ0ZvclR5cGUoVHlwZSB0eXBlKSB7CisgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBUeXBlLlVOS05PV046IHJldHVybiAiVW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iOworICAgICAgICBjYXNlIFR5cGUuVU5LTk9XTl9NRVRIT0Q6IHJldHVybiAiVW5rbm93biBtZXRob2QiOworICAgICAgICBjYXNlIFR5cGUuSU5WQUxJRF9NRVNTQUdFX1RZUEU6IHJldHVybiAiSW52YWxpZCBtZXNzYWdlIHR5cGUiOworICAgICAgICBjYXNlIFR5cGUuV1JPTkdfTUVUSE9EX05BTUU6IHJldHVybiAiV3JvbmcgbWV0aG9kIG5hbWUiOworICAgICAgICBjYXNlIFR5cGUuQkFEX1NFUVVFTkNFX0lEOiByZXR1cm4gIkJhZCBzZXF1ZW5jZSBpZGVudGlmaWVyIjsKKyAgICAgICAgY2FzZSBUeXBlLk1JU1NJTkdfUkVTVUxUOiByZXR1cm4gIk1pc3NpbmcgcmVzdWx0IjsKKyAgICAgICAgY2FzZSBUeXBlLklOVEVSTkFMX0VSUk9SOiByZXR1cm4gIkludGVybmFsIGVycm9yIjsKKyAgICAgICAgY2FzZSBUeXBlLlBST1RPQ09MX0VSUk9SOiByZXR1cm4gIlByb3RvY29sIGVycm9yIjsKKyAgICAgICAgY2FzZSBUeXBlLklOVkFMSURfVFJBTlNGT1JNOiByZXR1cm4gIkludmFsaWQgdHJhbnNmb3JtIjsKKyAgICAgICAgY2FzZSBUeXBlLklOVkFMSURfUFJPVE9DT0w6IHJldHVybiAiSW52YWxpZCBwcm90b2NvbCI7CisgICAgICAgIGNhc2UgVHlwZS5VTlNVUFBPUlRFRF9DTElFTlRfVFlQRTogcmV0dXJuICJVbnN1cHBvcnRlZCBjbGllbnQgdHlwZSI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKKyAgICAgIH0KKyAgICB9CisgICAgdGhpcyhtc2dGb3JUeXBlKHR5cGUpLCB0eXBlLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgdGhpcyhtc2csIFR5cGUuVU5LTk9XTiwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KKworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnLCBUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sCisgICAgVGhyb3dhYmxlIG5leHQgPSBudWxsKQorICB7CisgICAgc3VwZXIobXNnLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICAvLy8KKyAgVHlwZSB0eXBlKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZV87CisgIH0KKworICAvLyBUT0RPOiBSZXBsYWNlIGhhbmQtd3JpdHRlbiByZWFkKCkvd3JpdGUoKSB3aXRoIHRocmlmdC5jb2RlZ2VuIHRlbXBsYXRlcy4KKworICAvLy8KKyAgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgeworICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGYgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgaWYgKGYudHlwZSA9PSBUVHlwZS5TVE9QKSBicmVhazsKKworICAgICAgc3dpdGNoIChmLmlkKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBpZiAoZi50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgbXNnID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBza2lwKGlwcm90LCBmLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGlmIChmLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0eXBlXyA9IGNhc3QoVHlwZSlpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNraXAoaXByb3QsIGYudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHNraXAoaXByb3QsIGYudHlwZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgfQorCisgIC8vLworICB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgY29uc3QgeworICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikpOworCisgICAgaWYgKG1zZyAhPSBudWxsKSB7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVEZpZWxkKCJtZXNzYWdlIiwgVFR5cGUuU1RSSU5HLCAxKSk7CisgICAgICBvcHJvdC53cml0ZVN0cmluZyhtc2cpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihURmllbGQoInR5cGUiLCBUVHlwZS5JMzIsIDIpKTsKKyAgICBvcHJvdC53cml0ZUkzMih0eXBlXyk7CisgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICB9CisKK3ByaXZhdGU6CisgIFR5cGUgdHlwZV87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeS5kIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iaW5hcnkuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Q4ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iaW5hcnkuZApAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CisKK2ltcG9ydCBzdGQuYXJyYXkgOiB1bmluaXRpYWxpemVkQXJyYXk7CitpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IGFsbFNhdGlzZnksIFR5cGVUdXBsZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmVuZGlhbjsKKworLyoqCisgKiBUUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgdGhlIEJpbmFyeSBUaHJpZnQgcHJvdG9jb2wuCisgKi8KK2ZpbmFsIGNsYXNzIFRCaW5hcnlQcm90b2NvbChUcmFuc3BvcnQgPSBUVHJhbnNwb3J0KSBpZiAoCisgIGlzVFRyYW5zcG9ydCFUcmFuc3BvcnQKKykgOiBUUHJvdG9jb2wgeworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnMgPSBUaGUgdHJhbnNwb3J0IHRvIHVzZS4KKyAgICogICBjb250YWluZXJTaXplTGltaXQgPSBJZiBwb3NpdGl2ZSwgdGhlIGNvbnRhaW5lciBzaXplIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgaXRlbXMuCisgICAqICAgc3RyaW5nU2l6ZUxpbWl0ID0gSWYgcG9zaXRpdmUsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqICAgc3RyaWN0UmVhZCA9IElmIGZhbHNlLCBvbGQgcGVlcnMgd2hpY2ggZG8gbm90IGluY2x1ZGUgdGhlIHByb3RvY29sCisgICAqICAgICB2ZXJzaW9uIGFyZSB0b2xlcmF0ZWQuCisgICAqICAgc3RyaWN0V3JpdGUgPSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdGhlIGhlYWRlci4KKyAgICovCisgIHRoaXMoVHJhbnNwb3J0IHRyYW5zLCBpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDAsCisgICAgYm9vbCBzdHJpY3RSZWFkID0gZmFsc2UsIGJvb2wgc3RyaWN0V3JpdGUgPSB0cnVlCisgICkgeworICAgIHRyYW5zXyA9IHRyYW5zOworICAgIHRoaXMuY29udGFpbmVyU2l6ZUxpbWl0ID0gY29udGFpbmVyU2l6ZUxpbWl0OworICAgIHRoaXMuc3RyaW5nU2l6ZUxpbWl0ID0gc3RyaW5nU2l6ZUxpbWl0OworICAgIHRoaXMuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgdGhpcy5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlOworICB9CisKKyAgVHJhbnNwb3J0IHRyYW5zcG9ydCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zXzsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7fQorCisgIC8qKgorICAgKiBJZiBmYWxzZSwgb2xkIHBlZXJzIHdoaWNoIGRvIG5vdCBpbmNsdWRlIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHRoZQorICAgKiBtZXNzYWdlIGhlYWRlciBhcmUgdG9sZXJhdGVkLgorICAgKgorICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICovCisgIGJvb2wgc3RyaWN0UmVhZDsKKworICAvKioKKyAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHRoZSBtZXNzYWdlIGhlYWRlciAob2xkZXIKKyAgICogdmVyc2lvbnMgZGlkbid0KS4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICovCisgIGJvb2wgc3RyaWN0V3JpdGU7CisKKyAgLyoqCisgICAqIElmIHBvc2l0aXZlLCBsaW1pdHMgdGhlIG51bWJlciBvZiBpdGVtcyBvZiBkZXNlcmlhbGl6ZWQgY29udGFpbmVycyB0byB0aGUKKyAgICogZ2l2ZW4gYW1vdW50LgorICAgKgorICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnRzIG9mIG1lbW9yeSB3aGVuIGJyb2tlbgorICAgKiBkYXRhIGlzIHJlY2VpdmVkLiBJZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQsIGEgU0laRV9MSU1JVC10eXBlCisgICAqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8gKG5vIGxpbWl0KS4KKyAgICovCisgIGludCBjb250YWluZXJTaXplTGltaXQ7CisKKyAgLyoqCisgICAqIElmIHBvc2l0aXZlLCBsaW1pdHMgdGhlIGxlbmd0aCBvZiBkZXNlcmlhbGl6ZWQgc3RyaW5ncy9iaW5hcnkgZGF0YSB0byB0aGUKKyAgICogZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgKgorICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnRzIG9mIG1lbW9yeSB3aGVuIGJyb2tlbgorICAgKiBkYXRhIGlzIHJlY2VpdmVkLiBJZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQsIGEgU0laRV9MSU1JVC10eXBlCisgICAqIFRQcm90b2NvbEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIERlZmF1bHRzIHRvIHplcm8gKG5vIGxpbWl0KS4KKyAgICovCisgIGludCBzdHJpbmdTaXplTGltaXQ7CisKKyAgLyoKKyAgICogV3JpdGluZyBtZXRob2RzLgorICAgKi8KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICB3cml0ZUJ5dGUoYiA/IDEgOiAwKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgeworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJmIpWzAgLi4gMV0pOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHsKKyAgICBzaG9ydCBuZXQgPSBob3N0VG9OZXQoaTE2KTsKKyAgICB0cmFuc18ud3JpdGUoKGNhc3QodWJ5dGUqKSZuZXQpWzAgLi4gMl0pOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgaW50IG5ldCA9IGhvc3RUb05ldChpMzIpOworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJm5ldClbMCAuLiA0XSk7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB7CisgICAgbG9uZyBuZXQgPSBob3N0VG9OZXQoaTY0KTsKKyAgICB0cmFuc18ud3JpdGUoKGNhc3QodWJ5dGUqKSZuZXQpWzAgLi4gOF0pOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgc3RhdGljIGFzc2VydChkb3VibGUuc2l6ZW9mID09IHVsb25nLnNpemVvZik7CisgICAgYXV0byBiaXRzID0gaG9zdFRvTmV0KCpjYXN0KHVsb25nKikoJmR1YikpOworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJmJpdHMpWzAgLi4gOF0pOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhzdHJpbmcgc3RyKSB7CisgICAgd3JpdGVCaW5hcnkoY2FzdCh1Ynl0ZVtdKXN0cik7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KHVieXRlW10gYnVmKSB7CisgICAgYXNzZXJ0KGJ1Zi5sZW5ndGggPD0gaW50Lm1heCk7CisgICAgd3JpdGVJMzIoY2FzdChpbnQpYnVmLmxlbmd0aCk7CisgICAgdHJhbnNfLndyaXRlKGJ1Zik7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBpZiAoc3RyaWN0V3JpdGUpIHsKKyAgICAgIGludCB2ZXJzbiA9IFZFUlNJT05fMSB8IG1lc3NhZ2UudHlwZTsKKyAgICAgIHdyaXRlSTMyKHZlcnNuKTsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgIHdyaXRlQnl0ZShtZXNzYWdlLnR5cGUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfQorICB9CisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCB0c3RydWN0KSB7fQorICB2b2lkIHdyaXRlU3RydWN0RW5kKCkge30KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CisgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICB9CisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHsKKyAgICBhc3NlcnQobGlzdC5zaXplIDw9IGludC5tYXgpOworICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1UeXBlKTsKKyAgICB3cml0ZUkzMihjYXN0KGludClsaXN0LnNpemUpOworICB9CisgIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBhc3NlcnQobWFwLnNpemUgPD0gaW50Lm1heCk7CisgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKKyAgICB3cml0ZUJ5dGUobWFwLnZhbHVlVHlwZSk7CisgICAgd3JpdGVJMzIoY2FzdChpbnQpbWFwLnNpemUpOworICB9CisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIGFzc2VydChzZXQuc2l6ZSA8PSBpbnQubWF4KTsKKyAgICB3cml0ZUJ5dGUoc2V0LmVsZW1UeXBlKTsKKyAgICB3cml0ZUkzMihjYXN0KGludClzZXQuc2l6ZSk7CisgIH0KKyAgdm9pZCB3cml0ZVNldEVuZCgpIHt9CisKKworICAvKgorICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAqLworCisgIGJvb2wgcmVhZEJvb2woKSB7CisgICAgcmV0dXJuIHJlYWRCeXRlKCkgIT0gMDsKKyAgfQorCisgIGJ5dGUgcmVhZEJ5dGUoKSB7CisgICAgdWJ5dGVbMV0gYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYik7CisgICAgcmV0dXJuIGNhc3QoYnl0ZSliWzBdOworICB9CisKKyAgc2hvcnQgcmVhZEkxNigpIHsKKyAgICBJbnRCdWYhc2hvcnQgYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYi5ieXRlcyk7CisgICAgcmV0dXJuIG5ldFRvSG9zdChiLnZhbHVlKTsKKyAgfQorCisgIGludCByZWFkSTMyKCkgeworICAgIEludEJ1ZiFpbnQgYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYi5ieXRlcyk7CisgICAgcmV0dXJuIG5ldFRvSG9zdChiLnZhbHVlKTsKKyAgfQorCisgIGxvbmcgcmVhZEk2NCgpIHsKKyAgICBJbnRCdWYhbG9uZyBiID0gdm9pZDsKKyAgICB0cmFuc18ucmVhZEFsbChiLmJ5dGVzKTsKKyAgICByZXR1cm4gbmV0VG9Ib3N0KGIudmFsdWUpOworICB9CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgSW50QnVmIWxvbmcgYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYi5ieXRlcyk7CisgICAgYi52YWx1ZSA9IG5ldFRvSG9zdChiLnZhbHVlKTsKKyAgICByZXR1cm4gKmNhc3QoZG91YmxlKikoJmIudmFsdWUpOworICB9CisKKyAgc3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgcmV0dXJuIGNhc3Qoc3RyaW5nKXJlYWRCaW5hcnkoKTsKKyAgfQorCisgIHVieXRlW10gcmVhZEJpbmFyeSgpIHsKKyAgICByZXR1cm4gcmVhZEJpbmFyeUJvZHkocmVhZFNpemUoc3RyaW5nU2l6ZUxpbWl0KSk7CisgIH0KKworICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIFRNZXNzYWdlIG1zZyA9IHZvaWQ7CisKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIGludCB2ZXJzbiA9IHNpemUgJiBWRVJTSU9OX01BU0s7CisgICAgICBpZiAodmVyc24gIT0gVkVSU0lPTl8xKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkJhZCBwcm90b2NvbCB2ZXJzaW9uLiIsCisgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuQkFEX1ZFUlNJT04pOworICAgICAgfQorCisgICAgICBtc2cudHlwZSA9IGNhc3QoVE1lc3NhZ2VUeXBlKShzaXplICYgTUVTU0FHRV9UWVBFX01BU0spOworICAgICAgbXNnLm5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgICBtc2cuc2VxaWQgPSByZWFkSTMyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzdHJpY3RSZWFkKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgIlByb3RvY29sIHZlcnNpb24gbWlzc2luZywgb2xkIGNsaWVudD8iLAorICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLkJBRF9WRVJTSU9OKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuTkVHQVRJVkVfU0laRSk7CisgICAgICAgIH0KKyAgICAgICAgbXNnLm5hbWUgPSBjYXN0KHN0cmluZylyZWFkQmluYXJ5Qm9keShzaXplKTsKKyAgICAgICAgbXNnLnR5cGUgPSBjYXN0KFRNZXNzYWdlVHlwZSkocmVhZEJ5dGUoKSk7CisgICAgICAgIG1zZy5zZXFpZCA9IHJlYWRJMzIoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbXNnOworICB9CisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIHJldHVybiBUU3RydWN0KCk7CisgIH0KKyAgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgVEZpZWxkIGYgPSB2b2lkOworICAgIGYubmFtZSA9IG51bGw7CisgICAgZi50eXBlID0gY2FzdChUVHlwZSlyZWFkQnl0ZSgpOworICAgIGlmIChmLnR5cGUgPT0gVFR5cGUuU1RPUCkgcmV0dXJuIGY7CisgICAgZi5pZCA9IHJlYWRJMTYoKTsKKyAgICByZXR1cm4gZjsKKyAgfQorICB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICByZXR1cm4gVExpc3QoY2FzdChUVHlwZSlyZWFkQnl0ZSgpLCByZWFkU2l6ZShjb250YWluZXJTaXplTGltaXQpKTsKKyAgfQorICB2b2lkIHJlYWRMaXN0RW5kKCkge30KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICByZXR1cm4gVE1hcChjYXN0KFRUeXBlKXJlYWRCeXRlKCksIGNhc3QoVFR5cGUpcmVhZEJ5dGUoKSwKKyAgICAgIHJlYWRTaXplKGNvbnRhaW5lclNpemVMaW1pdCkpOworICB9CisgIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSB7CisgICAgcmV0dXJuIFRTZXQoY2FzdChUVHlwZSlyZWFkQnl0ZSgpLCByZWFkU2l6ZShjb250YWluZXJTaXplTGltaXQpKTsKKyAgfQorICB2b2lkIHJlYWRTZXRFbmQoKSB7fQorCitwcml2YXRlOgorICB1Ynl0ZVtdIHJlYWRCaW5hcnlCb2R5KGludCBzaXplKSB7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgYXV0byBidWYgPSB1bmluaXRpYWxpemVkQXJyYXkhKHVieXRlW10pKHNpemUpOworICAgIHRyYW5zXy5yZWFkQWxsKGJ1Zik7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIGludCByZWFkU2l6ZShpbnQgbGltaXQpIHsKKyAgICBhdXRvIHNpemUgPSByZWFkSTMyKCk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLk5FR0FUSVZFX1NJWkUpOworICAgIH0gZWxzZSBpZiAobGltaXQgPiAwICYmIHNpemUgPiBsaW1pdCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5TSVpFX0xJTUlUKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICBlbnVtIE1FU1NBR0VfVFlQRV9NQVNLID0gMHgwMDAwMDBmZjsKKyAgZW51bSBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworICBlbnVtIFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisKKyAgVHJhbnNwb3J0IHRyYW5zXzsKK30KKworLyoqCisgKiBUQmluYXJ5UHJvdG9jb2wgY29uc3RydWN0aW9uIGhlbHBlciB0byBhdm9pZCBoYXZpbmcgdG8gZXhwbGljaXRseSBzcGVjaWZ5CisgKiB0aGUgdHJhbnNwb3J0IHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZyBJRlRJCisgKiAoc2VlICQoTElOSzIgaHR0cDovL2QucHVyZW1hZ2ljLmNvbS9pc3N1ZXMvc2hvd19idWcuY2dpP2lkPTYwODIsIEQgQnVnemlsbGEKKyAqIGVuaGFuY2VtZW50IHJlcXVldCA2MDgyKSkuCisgKi8KK1RCaW5hcnlQcm90b2NvbCFUcmFuc3BvcnQgdEJpbmFyeVByb3RvY29sKFRyYW5zcG9ydCkoVHJhbnNwb3J0IHRyYW5zLAorICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0ID0gMCwgaW50IHN0cmluZ1NpemVMaW1pdCA9IDAsCisgIGJvb2wgc3RyaWN0UmVhZCA9IGZhbHNlLCBib29sIHN0cmljdFdyaXRlID0gdHJ1ZQorKSBpZiAoaXNUVHJhbnNwb3J0IVRyYW5zcG9ydCkgeworICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCFUcmFuc3BvcnQodHJhbnMsIGNvbnRhaW5lclNpemVMaW1pdCwKKyAgICBzdHJpbmdTaXplTGltaXQsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIC8vIENoZWNrIHRoZSBtZXNzYWdlIGhlYWRlciBmb3JtYXQuCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gYmluYXJ5ID0gdEJpbmFyeVByb3RvY29sKGJ1Zik7CisgIGJpbmFyeS53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSgiZm9vIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsKKworICBhdXRvIGhlYWRlciA9IG5ldyB1Ynl0ZVsxNV07CisgIGJ1Zi5yZWFkQWxsKGhlYWRlcik7CisgIGVuZm9yY2UoaGVhZGVyID09IFsKKyAgICAxMjgsIDEsIDAsIDEsIC8vIFZlcnNpb24gMSwgVE1lc3NhZ2VUeXBlLkNBTEwKKyAgICAwLCAwLCAwLCAzLCAvLyBNZXRob2QgbmFtZSBsZW5ndGgKKyAgICAxMDIsIDExMSwgMTExLCAvLyBNZXRob2QgbmFtZSAoImZvbyIpCisgICAgMCwgMCwgMCwgMCwgLy8gU2VxdWVuY2UgaWQKKyAgXSk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnByb3RvY29sOworICB0ZXN0Q29udGFpbmVyU2l6ZUxpbWl0IShUQmluYXJ5UHJvdG9jb2whKCkpKCk7CisgIHRlc3RTdHJpbmdTaXplTGltaXQhKFRCaW5hcnlQcm90b2NvbCEoKSkoKTsKK30KKworLyoqCisgKiBUUHJvdG9jb2xGYWN0b3J5IGNyZWF0aW5nIGEgVEJpbmFyeVByb3RvY29sIGluc3RhbmNlIGZvciBwYXNzZWQgaW4KKyAqIHRyYW5zcG9ydHMuCisgKgorICogVGhlIG9wdGlvbmFsIFRyYW5zcG9ydHMgdGVtcGxhdGUgdHVwbGUgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyAqIG9uZSBvciBtb3JlIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb25zIHRvIHNwZWNpZmljYWxseSBpbnN0YW50aWF0ZQorICogVEJpbmFyeVByb3RvY29sIGZvci4gSWYgdGhlIGFjdHVhbCB0cmFuc3BvcnQgdHlwZXMgZW5jb3VudGVyZWQgYXQKKyAqIHJ1bnRpbWUgbWF0Y2ggb25lIG9mIHRoZSB0cmFuc3BvcnRzIGluIHRoZSBsaXN0LCBhIHNwZWNpYWxpemVkIHByb3RvY29sCisgKiBpbnN0YW5jZSBpcyBjcmVhdGVkLiBPdGhlcndpc2UsIGEgZ2VuZXJpYyBUVHJhbnNwb3J0IHZlcnNpb24gaXMgdXNlZC4KKyAqLworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeShUcmFuc3BvcnRzLi4uKSBpZiAoCisgIGFsbFNhdGlzZnkhKGlzVFRyYW5zcG9ydCwgVHJhbnNwb3J0cykKKykgOiBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgLy8vCisgIHRoaXMgKGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMCwKKyAgICBib29sIHN0cmljdFJlYWQgPSBmYWxzZSwgYm9vbCBzdHJpY3RXcml0ZSA9IHRydWUKKyAgKSB7CisgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgIGNvbnRhaW5lclNpemVMaW1pdF8gPSBjb250YWluZXJTaXplTGltaXQ7CisgICAgc3RyaW5nU2l6ZUxpbWl0XyA9IHN0cmluZ1NpemVMaW1pdDsKKyAgfQorCisgIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSBjb25zdCB7CisgICAgZm9yZWFjaCAoVHJhbnNwb3J0OyBUeXBlVHVwbGUhKFRyYW5zcG9ydHMsIFRUcmFuc3BvcnQpKSB7CisgICAgICBhdXRvIGNvbmNyZXRlVHJhbnMgPSBjYXN0KFRyYW5zcG9ydCl0cmFuczsKKyAgICAgIGlmIChjb25jcmV0ZVRyYW5zKSB7CisgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sIVRyYW5zcG9ydChjb25jcmV0ZVRyYW5zLAorICAgICAgICAgIGNvbnRhaW5lclNpemVMaW1pdF8sIHN0cmluZ1NpemVMaW1pdF8sIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgIlBhc3NlZCBudWxsIHRyYW5zcG9ydCB0byBUQmluYXJ5UHJvdG9jb2xGYWN0b3kuIik7CisgIH0KKworcHJvdGVjdGVkOgorICBib29sIHN0cmljdFJlYWRfOworICBib29sIHN0cmljdFdyaXRlXzsKKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdF87CisgIGludCBzdHJpbmdTaXplTGltaXRfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9jb21wYWN0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU1YzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9jb21wYWN0LmQKQEAgLTAsMCArMSw2OTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQucHJvdG9jb2wuY29tcGFjdDsKKworaW1wb3J0IHN0ZC5hcnJheSA6IHVuaW5pdGlhbGl6ZWRBcnJheTsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogYWxsU2F0aXNmeSwgVHlwZVR1cGxlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuZW5kaWFuOworCisvKioKKyAqIEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbXBhY3QgcHJvdG9jb2wuCisgKgorICogU2VlIFRIUklGVC0xMTAgZm9yIGEgcHJvdG9jb2wgZGVzY3JpcHRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KKyAqIHRoZSBDKysgb25lLgorICovCitmaW5hbCBjbGFzcyBUQ29tcGFjdFByb3RvY29sKFRyYW5zcG9ydCA9IFRUcmFuc3BvcnQpIGlmICgKKyAgaXNUVHJhbnNwb3J0IVRyYW5zcG9ydAorKSA6IFRQcm90b2NvbCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgdHJhbnMgPSBUaGUgdHJhbnNwb3J0IHRvIHVzZS4KKyAgICogICBjb250YWluZXJTaXplTGltaXQgPSBJZiBwb3NpdGl2ZSwgdGhlIGNvbnRhaW5lciBzaXplIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgaXRlbXMuCisgICAqICAgc3RyaW5nU2l6ZUxpbWl0ID0gSWYgcG9zaXRpdmUsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8gdGhlCisgICAqICAgICBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqLworICB0aGlzKFRyYW5zcG9ydCB0cmFucywgaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwKSB7CisgICAgdHJhbnNfID0gdHJhbnM7CisgICAgdGhpcy5jb250YWluZXJTaXplTGltaXQgPSBjb250YWluZXJTaXplTGltaXQ7CisgICAgdGhpcy5zdHJpbmdTaXplTGltaXQgPSBzdHJpbmdTaXplTGltaXQ7CisgIH0KKworICBUcmFuc3BvcnQgdHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNfOworICB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBsYXN0RmllbGRJZF8gPSAwOworICAgIGZpZWxkSWRTdGFja18gPSBudWxsOworICAgIGJvb2xlYW5GaWVsZF8gPSBURmllbGQuaW5pdDsKKyAgICBoYXNCb29sVmFsdWVfID0gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9mIGRlc2VyaWFsaXplZCBjb250YWluZXJzIHRvIHRoZQorICAgKiBnaXZlbiBhbW91bnQuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdDsKKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbGVuZ3RoIG9mIGRlc2VyaWFsaXplZCBzdHJpbmdzL2JpbmFyeSBkYXRhIHRvIHRoZQorICAgKiBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IHN0cmluZ1NpemVMaW1pdDsKKworICAvKgorICAgKiBXcml0aW5nIG1ldGhvZHMuCisgICAqLworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChib29sZWFuRmllbGRfLm5hbWUgIWlzIG51bGwpIHsKKyAgICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgICAgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoYm9vbGVhbkZpZWxkXywKKyAgICAgICAgYiA/IENUeXBlLkJPT0xFQU5fVFJVRSA6IENUeXBlLkJPT0xFQU5fRkFMU0UpOworICAgICAgYm9vbGVhbkZpZWxkXy5uYW1lID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUKKyAgICAgIHdyaXRlQnl0ZShiID8gQ1R5cGUuQk9PTEVBTl9UUlVFIDogQ1R5cGUuQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB7CisgICAgdHJhbnNfLndyaXRlKChjYXN0KHVieXRlKikmYilbMC4uMV0pOworICB9CisKKyAgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHsKKyAgICB3cml0ZVZhcmludDMyKGkzMlRvWmlnemFnKGkxNikpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgd3JpdGVWYXJpbnQzMihpMzJUb1ppZ3phZyhpMzIpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHsKKyAgICB3cml0ZVZhcmludDY0KGk2NFRvWmlnemFnKGk2NCkpOworICB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgdWxvbmcgYml0cyA9IGhvc3RUb0xlKCpjYXN0KHVsb25nKikoJmR1YikpOworICAgIHRyYW5zXy53cml0ZSgoY2FzdCh1Ynl0ZSopJmJpdHMpWzAgLi4gOF0pOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhzdHJpbmcgc3RyKSB7CisgICAgd3JpdGVCaW5hcnkoY2FzdCh1Ynl0ZVtdKXN0cik7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KHVieXRlW10gYnVmKSB7CisgICAgYXNzZXJ0KGJ1Zi5sZW5ndGggPD0gaW50Lm1heCk7CisgICAgd3JpdGVWYXJpbnQzMihjYXN0KGludClidWYubGVuZ3RoKTsKKyAgICB0cmFuc18ud3JpdGUoYnVmKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbXNnKSB7CisgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSlQUk9UT0NPTF9JRCk7CisgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSkoKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICgoY2FzdChpbnQpbXNnLnR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKSkpOworICAgIHdyaXRlVmFyaW50MzIobXNnLnNlcWlkKTsKKyAgICB3cml0ZVN0cmluZyhtc2cubmFtZSk7CisgIH0KKyAgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRzdHJ1Y3QpIHsKKyAgICBmaWVsZElkU3RhY2tfIH49IGxhc3RGaWVsZElkXzsKKyAgICBsYXN0RmllbGRJZF8gPSAwOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBsYXN0RmllbGRJZF8gPSBmaWVsZElkU3RhY2tfWyQgLSAxXTsKKyAgICBmaWVsZElkU3RhY2tfID0gZmllbGRJZFN0YWNrX1swIC4uICQgLSAxXTsKKyAgICBmaWVsZElkU3RhY2tfLmFzc3VtZVNhZmVBcHBlbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpIHsKKyAgICAgIGJvb2xlYW5GaWVsZF8ubmFtZSA9IGZpZWxkLm5hbWU7CisgICAgICBib29sZWFuRmllbGRfLnR5cGUgPSBmaWVsZC50eXBlOworICAgICAgYm9vbGVhbkZpZWxkXy5pZCA9IGZpZWxkLmlkOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoZmllbGQpOworICAgIH0KKyAgfQorICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICB9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgd3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5lbGVtVHlwZSwgbGlzdC5zaXplKTsKKyAgfQorICB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgaWYgKG1hcC5zaXplID09IDApIHsKKyAgICAgIHdyaXRlQnl0ZSgwKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KG1hcC5zaXplIDw9IGludC5tYXgpOworICAgICAgd3JpdGVWYXJpbnQzMihjYXN0KGludCltYXAuc2l6ZSk7CisgICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKSh0b0NUeXBlKG1hcC5rZXlUeXBlKSA8PCA0IHwgdG9DVHlwZShtYXAudmFsdWVUeXBlKSkpOworICAgIH0KKyAgfQorICB2b2lkIHdyaXRlTWFwRW5kKCkge30KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICB3cml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuZWxlbVR5cGUsIHNldC5zaXplKTsKKyAgfQorICB2b2lkIHdyaXRlU2V0RW5kKCkge30KKworCisgIC8qCisgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgYm9vbCByZWFkQm9vbCgpIHsKKyAgICBpZiAoaGFzQm9vbFZhbHVlXyA9PSB0cnVlKSB7CisgICAgICBoYXNCb29sVmFsdWVfID0gZmFsc2U7CisgICAgICByZXR1cm4gYm9vbFZhbHVlXzsKKyAgICB9CisKKyAgICByZXR1cm4gcmVhZEJ5dGUoKSA9PSBDVHlwZS5CT09MRUFOX1RSVUU7CisgIH0KKworICBieXRlIHJlYWRCeXRlKCkgeworICAgIHVieXRlWzFdIGIgPSB2b2lkOworICAgIHRyYW5zXy5yZWFkQWxsKGIpOworICAgIHJldHVybiBjYXN0KGJ5dGUpYlswXTsKKyAgfQorCisgIHNob3J0IHJlYWRJMTYoKSB7CisgICAgcmV0dXJuIGNhc3Qoc2hvcnQpemlnemFnVG9JMzIocmVhZFZhcmludDMyKCkpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgcmV0dXJuIHppZ3phZ1RvSTMyKHJlYWRWYXJpbnQzMigpKTsKKyAgfQorCisgIGxvbmcgcmVhZEk2NCgpIHsKKyAgICByZXR1cm4gemlnemFnVG9JNjQocmVhZFZhcmludDY0KCkpOworICB9CisKKyAgZG91YmxlIHJlYWREb3VibGUoKSB7CisgICAgSW50QnVmIWxvbmcgYiA9IHZvaWQ7CisgICAgdHJhbnNfLnJlYWRBbGwoYi5ieXRlcyk7CisgICAgYi52YWx1ZSA9IGxlVG9Ib3N0KGIudmFsdWUpOworICAgIHJldHVybiAqY2FzdChkb3VibGUqKSgmYi52YWx1ZSk7CisgIH0KKworICBzdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICByZXR1cm4gY2FzdChzdHJpbmcpcmVhZEJpbmFyeSgpOworICB9CisKKyAgdWJ5dGVbXSByZWFkQmluYXJ5KCkgeworICAgIGF1dG8gc2l6ZSA9IHJlYWRWYXJpbnQzMigpOworICAgIGNoZWNrU2l6ZShzaXplLCBzdHJpbmdTaXplTGltaXQpOworCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgYXV0byBidWYgPSB1bmluaXRpYWxpemVkQXJyYXkhKHVieXRlW10pKHNpemUpOworICAgIHRyYW5zXy5yZWFkQWxsKGJ1Zik7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgVE1lc3NhZ2UgbXNnID0gdm9pZDsKKworICAgIGF1dG8gcHJvdG9jb2xJZCA9IHJlYWRCeXRlKCk7CisgICAgaWYgKHByb3RvY29sSWQgIT0gY2FzdChieXRlKVBST1RPQ09MX0lEKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJCYWQgcHJvdG9jb2wgaWRlbnRpZmllciIsCisgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLkJBRF9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBhdXRvIHZlcnNpb25BbmRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBhdXRvIHZlciA9IHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLOworICAgIGlmICh2ZXIgIT0gVkVSU0lPTl9OKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJCYWQgcHJvdG9jb2wgdmVyc2lvbiIsCisgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLkJBRF9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBtc2cudHlwZSA9IGNhc3QoVE1lc3NhZ2VUeXBlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKyAgICBtc2cuc2VxaWQgPSByZWFkVmFyaW50MzIoKTsKKyAgICBtc2cubmFtZSA9IHJlYWRTdHJpbmcoKTsKKworICAgIHJldHVybiBtc2c7CisgIH0KKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgZmllbGRJZFN0YWNrXyB+PSBsYXN0RmllbGRJZF87CisgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICByZXR1cm4gVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgeworICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkSWRTdGFja19bJCAtIDFdOworICAgIGZpZWxkSWRTdGFja18gPSBmaWVsZElkU3RhY2tfWzAgLi4gJCAtIDFdOworICB9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIFRGaWVsZCBmID0gdm9pZDsKKyAgICBmLm5hbWUgPSBudWxsOworCisgICAgYXV0byBiaXRlID0gcmVhZEJ5dGUoKTsKKyAgICBhdXRvIHR5cGUgPSBjYXN0KENUeXBlKShiaXRlICYgMHgwZik7CisKKyAgICBpZiAodHlwZSA9PSBDVHlwZS5TVE9QKSB7CisgICAgICAvLyBTdHJ1Y3Qgc3RvcCBieXRlLCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICBmLmlkID0gMDsKKyAgICAgIGYudHlwZSA9IFRUeXBlLlNUT1A7CisgICAgICByZXR1cm4gZjsKKyAgICB9CisKKyAgICAvLyBNYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLCB3aGljaCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQKKyAgICAvLyBkZWx0YS4KKyAgICBhdXRvIG1vZGlmaWVyID0gY2FzdChzaG9ydCkoKGJpdGUgJiAweGYwKSA+PiA0KTsKKyAgICBpZiAobW9kaWZpZXIgPiAwKSB7CisgICAgICBmLmlkID0gY2FzdChzaG9ydCkobGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBEZWx0YSBlbmNvZGluZyBub3QgdXNlZCwganVzdCByZWFkIHRoZSBpZCBhcyB1c3VhbC4KKyAgICAgIGYuaWQgPSByZWFkSTE2KCk7CisgICAgfQorICAgIGYudHlwZSA9IGdldFRUeXBlKHR5cGUpOworCisgICAgaWYgKHR5cGUgPT0gQ1R5cGUuQk9PTEVBTl9UUlVFIHx8IHR5cGUgPT0gQ1R5cGUuQk9PTEVBTl9GQUxTRSkgeworICAgICAgLy8gRm9yIGJvb2xlYW4gZmllbGRzLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZSDigJMga2VlcCBpdCBhcm91bmQKKyAgICAgIC8vIGZvciB0aGUgcmVhZEJvb2woKSBjYWxsLgorICAgICAgaGFzQm9vbFZhbHVlXyA9IHRydWU7CisgICAgICBib29sVmFsdWVfID0gKHR5cGUgPT0gQ1R5cGUuQk9PTEVBTl9UUlVFID8gdHJ1ZSA6IGZhbHNlKTsKKyAgICB9CisKKyAgICBsYXN0RmllbGRJZF8gPSBmLmlkOworICAgIHJldHVybiBmOworICB9CisgIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKworICBUTGlzdCByZWFkTGlzdEJlZ2luKCkgeworICAgIGF1dG8gc2l6ZUFuZFR5cGUgPSByZWFkQnl0ZSgpOworCisgICAgYXV0byBsc2l6ZSA9IChzaXplQW5kVHlwZSA+PiA0KSAmIDB4ZjsKKyAgICBpZiAobHNpemUgPT0gMHhmKSB7CisgICAgICBsc2l6ZSA9IHJlYWRWYXJpbnQzMigpOworICAgIH0KKyAgICBjaGVja1NpemUobHNpemUsIGNvbnRhaW5lclNpemVMaW1pdCk7CisKKyAgICBUTGlzdCBsID0gdm9pZDsKKyAgICBsLmVsZW1UeXBlID0gZ2V0VFR5cGUoY2FzdChDVHlwZSkoc2l6ZUFuZFR5cGUgJiAweDBmKSk7CisgICAgbC5zaXplID0gY2FzdChzaXplX3QpbHNpemU7CisKKyAgICByZXR1cm4gbDsKKyAgfQorICB2b2lkIHJlYWRMaXN0RW5kKCkge30KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBUTWFwIG0gPSB2b2lkOworCisgICAgYXV0byBzaXplID0gcmVhZFZhcmludDMyKCk7CisgICAgdWJ5dGUga3ZUeXBlOworICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgIGt2VHlwZSA9IHJlYWRCeXRlKCk7CisgICAgfQorICAgIGNoZWNrU2l6ZShzaXplLCBjb250YWluZXJTaXplTGltaXQpOworCisgICAgbS5zaXplID0gc2l6ZTsKKyAgICBtLmtleVR5cGUgPSBnZXRUVHlwZShjYXN0KENUeXBlKShrdlR5cGUgPj4gNCkpOworICAgIG0udmFsdWVUeXBlID0gZ2V0VFR5cGUoY2FzdChDVHlwZSkoa3ZUeXBlICYgMHhmKSk7CisKKyAgICByZXR1cm4gbTsKKyAgfQorICB2b2lkIHJlYWRNYXBFbmQoKSB7fQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIGF1dG8gc2l6ZUFuZFR5cGUgPSByZWFkQnl0ZSgpOworCisgICAgYXV0byBsc2l6ZSA9IChzaXplQW5kVHlwZSA+PiA0KSAmIDB4ZjsKKyAgICBpZiAobHNpemUgPT0gMHhmKSB7CisgICAgICBsc2l6ZSA9IHJlYWRWYXJpbnQzMigpOworICAgIH0KKyAgICBjaGVja1NpemUobHNpemUsIGNvbnRhaW5lclNpemVMaW1pdCk7CisKKyAgICBUU2V0IHMgPSB2b2lkOworICAgIHMuZWxlbVR5cGUgPSBnZXRUVHlwZShjYXN0KENUeXBlKShzaXplQW5kVHlwZSAmIDB4ZikpOworICAgIHMuc2l6ZSA9IGNhc3Qoc2l6ZV90KWxzaXplOworCisgICAgcmV0dXJuIHM7CisgIH0KKyAgdm9pZCByZWFkU2V0RW5kKCkge30KKworcHJpdmF0ZToKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChURmllbGQgZmllbGQsIGJ5dGUgdHlwZU92ZXJyaWRlID0gLTEpIHsKKyAgICAvLyBJZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgICAgYXV0byB0eXBlVG9Xcml0ZSA9ICh0eXBlT3ZlcnJpZGUgPT0gLTEgPyB0b0NUeXBlKGZpZWxkLnR5cGUpIDogdHlwZU92ZXJyaWRlKTsKKworICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgIGlmIChmaWVsZC5pZCA+IGxhc3RGaWVsZElkXyAmJiAoZmllbGQuaWQgLSBsYXN0RmllbGRJZF8pIDw9IDE1KSB7CisgICAgICAvLyB3cml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKSgoZmllbGQuaWQgLSBsYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyB3cml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKXR5cGVUb1dyaXRlKTsKKyAgICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgICB9CisKKyAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5pZDsKKyAgfQorCisKKyAgdm9pZCB3cml0ZUNvbGxlY3Rpb25CZWdpbihUVHlwZSBlbGVtVHlwZSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8PSAxNCkgeworICAgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSkoc2l6ZSA8PCA0IHwgdG9DVHlwZShlbGVtVHlwZSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KHNpemUgPD0gaW50Lm1heCk7CisgICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKSgweGYwIHwgdG9DVHlwZShlbGVtVHlwZSkpKTsKKyAgICAgIHdyaXRlVmFyaW50MzIoY2FzdChpbnQpc2l6ZSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZVZhcmludDMyKHVpbnQgbikgeworICAgIHVieXRlWzVdIGJ1ZiA9IHZvaWQ7CisgICAgdWJ5dGUgd3NpemU7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgICAgYnVmW3dzaXplKytdID0gY2FzdCh1Ynl0ZSluOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGNhc3QodWJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgbiA+Pj0gNzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0cmFuc18ud3JpdGUoYnVmWzAgLi4gd3NpemVdKTsKKyAgfQorCisgIC8qCisgICAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgKi8KKyAgdm9pZCB3cml0ZVZhcmludDY0KHVsb25nIG4pIHsKKyAgICB1Ynl0ZVsxMF0gYnVmID0gdm9pZDsKKyAgICB1Ynl0ZSB3c2l6ZTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKKyAgICAgICAgYnVmW3dzaXplKytdID0gY2FzdCh1Ynl0ZSluOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGNhc3QodWJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgbiA+Pj0gNzsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0cmFuc18ud3JpdGUoYnVmWzAgLi4gd3NpemVdKTsKKyAgfQorCisgIC8qCisgICAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgKi8KKyAgdWxvbmcgaTY0VG9aaWd6YWcobG9uZyBsKSB7CisgICAgcmV0dXJuIChsIDw8IDEpIF4gKGwgPj4gNjMpOworICB9CisKKyAgLyoKKyAgICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICovCisgIHVpbnQgaTMyVG9aaWd6YWcoaW50IG4pIHsKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSk7CisgIH0KKworICBDVHlwZSB0b0NUeXBlKFRUeXBlIHR5cGUpIHsKKyAgICBmaW5hbCBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgVFR5cGUuU1RPUDoKKyAgICAgICAgcmV0dXJuIENUeXBlLlNUT1A7CisgICAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICAgIHJldHVybiBDVHlwZS5CT09MRUFOX1RSVUU7CisgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgIHJldHVybiBDVHlwZS5CWVRFOworICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICAgIHJldHVybiBDVHlwZS5ET1VCTEU7CisgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgcmV0dXJuIENUeXBlLkkxNjsKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICByZXR1cm4gQ1R5cGUuSTMyOworICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgIHJldHVybiBDVHlwZS5JNjQ7CisgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgcmV0dXJuIENUeXBlLkJJTkFSWTsKKyAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgICByZXR1cm4gQ1R5cGUuU1RSVUNUOworICAgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICAgIHJldHVybiBDVHlwZS5NQVA7CisgICAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgICAgcmV0dXJuIENUeXBlLlNFVDsKKyAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgcmV0dXJuIENUeXBlLkxJU1Q7CisgICAgICBjYXNlIFRUeXBlLlZPSUQ6CisgICAgICAgIGFzc2VydChmYWxzZSwgIkludmFsaWQgdHlwZSBwYXNzZWQuIik7CisgICAgfQorICB9CisKKyAgaW50IHJlYWRWYXJpbnQzMigpIHsKKyAgICByZXR1cm4gY2FzdChpbnQpcmVhZFZhcmludDY0KCk7CisgIH0KKworICBsb25nIHJlYWRWYXJpbnQ2NCgpIHsKKyAgICB1bG9uZyB2YWw7CisgICAgdWJ5dGUgc2hpZnQ7CisgICAgdWJ5dGVbMTBdIGJ1ZiA9IHZvaWQ7ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgorICAgIGF1dG8gYnVmU2l6ZSA9IGJ1Zi5zaXplb2Y7CisgICAgYXV0byBib3Jyb3dlZCA9IHRyYW5zXy5ib3Jyb3coYnVmLnB0ciwgYnVmU2l6ZSk7CisKKyAgICB1Ynl0ZSByc2l6ZTsKKworICAgIGlmIChib3Jyb3dlZCkgeworICAgICAgLy8gRmFzdCBwYXRoLgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgYXV0byBiaXRlID0gYm9ycm93ZWRbcnNpemVdOworICAgICAgICByc2l6ZSsrOworICAgICAgICB2YWwgfD0gY2FzdCh1bG9uZykoYml0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICBzaGlmdCArPSA3OworICAgICAgICBpZiAoIShiaXRlICYgMHg4MCkpIHsKKyAgICAgICAgICB0cmFuc18uY29uc3VtZShyc2l6ZSk7CisgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgc28gd2UgZG9uJ3QgY3Jhc2guCisgICAgICAgIGlmIChyc2l6ZSA9PSBidWYuc2l6ZW9mKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFNsb3cgcGF0aC4KKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHVieXRlWzFdIGJpdGU7CisgICAgICAgIHRyYW5zXy5yZWFkQWxsKGJpdGUpOworICAgICAgICArK3JzaXplOworCisgICAgICAgIHZhbCB8PSBjYXN0KHVsb25nKShiaXRlWzBdICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgIGlmICghKGJpdGVbMF0gJiAweDgwKSkgeworICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKworICAgICAgICAvLyBNaWdodCBhcyB3ZWxsIGNoZWNrIGZvciBpbnZhbGlkIGRhdGEgb24gdGhlIHNsb3cgcGF0aCB0b28uCisgICAgICAgIGlmIChyc2l6ZSA+PSBidWYuc2l6ZW9mKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICAgKi8KKyAgaW50IHppZ3phZ1RvSTMyKHVpbnQgbikgeworICAgIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpOworICB9CisKKyAgLyoKKyAgICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgICAqLworICBsb25nIHppZ3phZ1RvSTY0KHVsb25nIG4pIHsKKyAgICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKTsKKyAgfQorCisgIFRUeXBlIGdldFRUeXBlKENUeXBlIHR5cGUpIHsKKyAgICBmaW5hbCBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgQ1R5cGUuU1RPUDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUT1A7CisgICAgICBjYXNlIENUeXBlLkJPT0xFQU5fRkFMU0U6CisgICAgICAgIHJldHVybiBUVHlwZS5CT09MOworICAgICAgY2FzZSBDVHlwZS5CT09MRUFOX1RSVUU6CisgICAgICAgIHJldHVybiBUVHlwZS5CT09MOworICAgICAgY2FzZSBDVHlwZS5CWVRFOgorICAgICAgICByZXR1cm4gVFR5cGUuQllURTsKKyAgICAgIGNhc2UgQ1R5cGUuSTE2OgorICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgY2FzZSBDVHlwZS5JMzI6CisgICAgICAgIHJldHVybiBUVHlwZS5JMzI7CisgICAgICBjYXNlIENUeXBlLkk2NDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgIGNhc2UgQ1R5cGUuRE9VQkxFOgorICAgICAgICByZXR1cm4gVFR5cGUuRE9VQkxFOworICAgICAgY2FzZSBDVHlwZS5CSU5BUlk6CisgICAgICAgIHJldHVybiBUVHlwZS5TVFJJTkc7CisgICAgICBjYXNlIENUeXBlLkxJU1Q6CisgICAgICAgIHJldHVybiBUVHlwZS5MSVNUOworICAgICAgY2FzZSBDVHlwZS5TRVQ6CisgICAgICAgIHJldHVybiBUVHlwZS5TRVQ7CisgICAgICBjYXNlIENUeXBlLk1BUDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLk1BUDsKKyAgICAgIGNhc2UgQ1R5cGUuU1RSVUNUOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RSVUNUOworICAgIH0KKyAgfQorCisgIHZvaWQgY2hlY2tTaXplKGludCBzaXplLCBpbnQgbGltaXQpIHsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuTkVHQVRJVkVfU0laRSk7CisgICAgfSBlbHNlIGlmIChsaW1pdCA+IDAgJiYgc2l6ZSA+IGxpbWl0KSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgIH0KKyAgfQorCisgIGVudW0gUFJPVE9DT0xfSUQgPSAweDgyOworICBlbnVtIFZFUlNJT05fTiA9IDE7CisgIGVudW0gVkVSU0lPTl9NQVNLID0gMGIwMDAxXzExMTE7CisgIGVudW0gVFlQRV9NQVNLID0gMGIxMTEwXzAwMDA7CisgIGVudW0gVFlQRV9CSVRTID0gMGIwMDAwXzAxMTE7CisgIGVudW0gVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCisgIC8vIFByb2JhYmx5IG5lZWQgdG8gaW1wbGVtZW50IGEgYmV0dGVyIHN0YWNrIGF0IHNvbWUgcG9pbnQuCisgIHNob3J0W10gZmllbGRJZFN0YWNrXzsKKyAgc2hvcnQgbGFzdEZpZWxkSWRfOworCisgIFRGaWVsZCBib29sZWFuRmllbGRfOworCisgIGJvb2wgaGFzQm9vbFZhbHVlXzsKKyAgYm9vbCBib29sVmFsdWVfOworCisgIFRyYW5zcG9ydCB0cmFuc187Cit9CisKKy8qKgorICogVENvbXBhY3RQcm90b2NvbCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIHRoZSB0cmFuc3BvcnQgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nIElGVEkKKyAqIChzZWUgJChMSU5LMiBodHRwOi8vZC5wdXJlbWFnaWMuY29tL2lzc3Vlcy9zaG93X2J1Zy5jZ2k/aWQ9NjA4MiwgRCBCdWd6aWxsYQorICogZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVENvbXBhY3RQcm90b2NvbCFUcmFuc3BvcnQgdENvbXBhY3RQcm90b2NvbChUcmFuc3BvcnQpKFRyYW5zcG9ydCB0cmFucywKKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwCispIGlmIChpc1RUcmFuc3BvcnQhVHJhbnNwb3J0KQoreworICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2whVHJhbnNwb3J0KHRyYW5zLAorICAgIGNvbnRhaW5lclNpemVMaW1pdCwgc3RyaW5nU2l6ZUxpbWl0KTsKK30KKworcHJpdmF0ZSB7CisgIGVudW0gQ1R5cGUgOiB1Ynl0ZSB7CisgICAgU1RPUCA9IDB4MCwKKyAgICBCT09MRUFOX1RSVUUgPSAweDEsCisgICAgQk9PTEVBTl9GQUxTRSA9IDB4MiwKKyAgICBCWVRFID0gMHgzLAorICAgIEkxNiA9IDB4NCwKKyAgICBJMzIgPSAweDUsCisgICAgSTY0ID0gMHg2LAorICAgIERPVUJMRSA9IDB4NywKKyAgICBCSU5BUlkgPSAweDgsCisgICAgTElTVCA9IDB4OSwKKyAgICBTRVQgPSAweGEsCisgICAgTUFQID0gMHhiLAorICAgIFNUUlVDVCA9IDB4YworICB9CisgIHN0YXRpYyBhc3NlcnQoQ1R5cGUubWF4IDw9IDB4ZiwKKyAgICAiQ29tcGFjdCBwcm90b2NvbCB3aXJlIHR5cGUgcmVwcmVzZW50YXRpb24gbXVzdCBmaXQgaW50byA0IGJpdHMuIik7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICAvLyBDaGVjayB0aGUgbWVzc2FnZSBoZWFkZXIgZm9ybWF0LgorICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIGNvbXBhY3QgPSB0Q29tcGFjdFByb3RvY29sKGJ1Zik7CisgIGNvbXBhY3Qud3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UoImZvbyIsIFRNZXNzYWdlVHlwZS5DQUxMLCAwKSk7CisKKyAgYXV0byBoZWFkZXIgPSBuZXcgdWJ5dGVbN107CisgIGJ1Zi5yZWFkQWxsKGhlYWRlcik7CisgIGVuZm9yY2UoaGVhZGVyID09IFsKKyAgICAxMzAsIC8vIFByb3RvY29sIGlkLgorICAgIDMzLCAvLyBWZXJzaW9uL3R5cGUgYnl0ZS4KKyAgICAwLCAvLyBTZXF1ZW5jZSBpZC4KKyAgICAzLCAxMDIsIDExMSwgMTExIC8vIE1ldGhvZCBuYW1lLgorICBdKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLnRlc3QucHJvdG9jb2w7CisgIHRlc3RDb250YWluZXJTaXplTGltaXQhKFRDb21wYWN0UHJvdG9jb2whKCkpKCk7CisgIHRlc3RTdHJpbmdTaXplTGltaXQhKFRDb21wYWN0UHJvdG9jb2whKCkpKCk7Cit9CisKKy8qKgorICogVFByb3RvY29sRmFjdG9yeSBjcmVhdGluZyBhIFRDb21wYWN0UHJvdG9jb2wgaW5zdGFuY2UgZm9yIHBhc3NlZCBpbgorICogdHJhbnNwb3J0cy4KKyAqCisgKiBUaGUgb3B0aW9uYWwgVHJhbnNwb3J0cyB0ZW1wbGF0ZSB0dXBsZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorICogb25lIG9yIG1vcmUgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgdG8gc3BlY2lmaWNhbGx5IGluc3RhbnRpYXRlCisgKiBUQ29tcGFjdFByb3RvY29sIGZvci4gSWYgdGhlIGFjdHVhbCB0cmFuc3BvcnQgdHlwZXMgZW5jb3VudGVyZWQgYXQKKyAqIHJ1bnRpbWUgbWF0Y2ggb25lIG9mIHRoZSB0cmFuc3BvcnRzIGluIHRoZSBsaXN0LCBhIHNwZWNpYWxpemVkIHByb3RvY29sCisgKiBpbnN0YW5jZSBpcyBjcmVhdGVkLiBPdGhlcndpc2UsIGEgZ2VuZXJpYyBUVHJhbnNwb3J0IHZlcnNpb24gaXMgdXNlZC4KKyAqLworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoVHJhbnNwb3J0cy4uLikgaWYgKAorICBhbGxTYXRpc2Z5IShpc1RUcmFuc3BvcnQsIFRyYW5zcG9ydHMpCispIDogVFByb3RvY29sRmFjdG9yeSB7CisgIC8vLworICB0aGlzKGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMCkgeworICAgIGNvbnRhaW5lclNpemVMaW1pdF8gPSAwOworICAgIHN0cmluZ1NpemVMaW1pdF8gPSAwOworICB9CisKKyAgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIGNvbnN0IHsKKyAgICBmb3JlYWNoIChUcmFuc3BvcnQ7IFR5cGVUdXBsZSEoVHJhbnNwb3J0cywgVFRyYW5zcG9ydCkpIHsKKyAgICAgIGF1dG8gY29uY3JldGVUcmFucyA9IGNhc3QoVHJhbnNwb3J0KXRyYW5zOworICAgICAgaWYgKGNvbmNyZXRlVHJhbnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sIVRyYW5zcG9ydChjb25jcmV0ZVRyYW5zKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICJQYXNzZWQgbnVsbCB0cmFuc3BvcnQgdG8gVENvbXBhY3RQcm90b2NvbEZhY3RvcnkuIik7CisgIH0KKworICBpbnQgY29udGFpbmVyU2l6ZUxpbWl0XzsKKyAgaW50IHN0cmluZ1NpemVMaW1pdF87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZCBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTcxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZApAQCAtMCwwICsxLDEwMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQucHJvdG9jb2wuanNvbjsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG07CitpbXBvcnQgc3RkLmFycmF5OworaW1wb3J0IHN0ZC5iYXNlNjQ7CitpbXBvcnQgc3RkLmNvbnY7CitpbXBvcnQgc3RkLnJhbmdlOworaW1wb3J0IHN0ZC5zdHJpbmcgOiBmb3JtYXQ7CitpbXBvcnQgc3RkLnRyYWl0cyA6IGlzSW50ZWdyYWw7CitpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IGFsbFNhdGlzZnksIFR5cGVUdXBsZTsKK2ltcG9ydCBzdGQudXRmIDogdG9VVEY4OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworYWxpYXMgQmFzZTY0SW1wbCEoJysnLCAnLycsIEJhc2U2NC5Ob1BhZGRpbmcpIEJhc2U2NE5vUGFkOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgSlNPTiBwcm90b2NvbC4KKyAqLworZmluYWwgY2xhc3MgVEpzb25Qcm90b2NvbChUcmFuc3BvcnQgPSBUVHJhbnNwb3J0KSBpZiAoCisgIGlzVFRyYW5zcG9ydCFUcmFuc3BvcnQKKykgOiBUUHJvdG9jb2wgeworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zID0gVGhlIHRyYW5zcG9ydCB0byB1c2UuCisgICAqICAgY29udGFpbmVyU2l6ZUxpbWl0ID0gSWYgcG9zaXRpdmUsIHRoZSBjb250YWluZXIgc2l6ZSBpcyBsaW1pdGVkIHRvIHRoZQorICAgKiAgICAgZ2l2ZW4gbnVtYmVyIG9mIGl0ZW1zLgorICAgKiAgIHN0cmluZ1NpemVMaW1pdCA9IElmIHBvc2l0aXZlLCB0aGUgc3RyaW5nIGxlbmd0aCBpcyBsaW1pdGVkIHRvIHRoZQorICAgKiAgICAgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgKi8KKyAgdGhpcyhUcmFuc3BvcnQgdHJhbnMsIGludCBjb250YWluZXJTaXplTGltaXQgPSAwLCBpbnQgc3RyaW5nU2l6ZUxpbWl0ID0gMCkgeworICAgIHRyYW5zXyA9IHRyYW5zOworICAgIHRoaXMuY29udGFpbmVyU2l6ZUxpbWl0ID0gY29udGFpbmVyU2l6ZUxpbWl0OworICAgIHRoaXMuc3RyaW5nU2l6ZUxpbWl0ID0gc3RyaW5nU2l6ZUxpbWl0OworCisgICAgY29udGV4dF8gPSBuZXcgQ29udGV4dCgpOworICAgIHJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRyYW5zKTsKKyAgfQorCisgIFRyYW5zcG9ydCB0cmFuc3BvcnQoKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cmFuc187CisgIH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIGRlc3Ryb3koY29udGV4dFN0YWNrXyk7CisgICAgY29udGV4dF8gPSBuZXcgQ29udGV4dCgpOworICAgIHJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRyYW5zXyk7CisgIH0KKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIG9mIGRlc2VyaWFsaXplZCBjb250YWluZXJzIHRvIHRoZQorICAgKiBnaXZlbiBhbW91bnQuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdDsKKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIGxpbWl0cyB0aGUgbGVuZ3RoIG9mIGRlc2VyaWFsaXplZCBzdHJpbmdzL2JpbmFyeSBkYXRhIHRvIHRoZQorICAgKiBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAqCisgICAqIFRoaXMgaXMgdXNlZnVsIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudHMgb2YgbWVtb3J5IHdoZW4gYnJva2VuCisgICAqIGRhdGEgaXMgcmVjZWl2ZWQuIElmIHRoZSBsaW1pdCBpcyBleGNlZWRlZCwgYSBTSVpFX0xJTUlULXR5cGUKKyAgICogVFByb3RvY29sRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogTm90ZTogRm9yIGJpbmFyeSBkYXRhLCB0aGUgbGltaXQgYXBwbGllcyB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAgKiBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgZGF0YSwgbm90IHRoZSByZXN1bHRpbmcgYnl0ZSBhcnJheS4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgaW50IHN0cmluZ1NpemVMaW1pdDsKKworICAvKgorICAgKiBXcml0aW5nIG1ldGhvZHMuCisgICAqLworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIHdyaXRlSnNvbkludGVnZXIoYiA/IDEgOiAwKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgeworICAgIHdyaXRlSnNvbkludGVnZXIoYik7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgeworICAgIHdyaXRlSnNvbkludGVnZXIoaTE2KTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgeworICAgIHdyaXRlSnNvbkludGVnZXIoaTMyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGk2NCk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHsKKyAgICBjb250ZXh0Xy53cml0ZSh0cmFuc18pOworCisgICAgc3RyaW5nIHZhbHVlOworICAgIGlmIChkdWIgaXMgZG91YmxlLm5hbikgeworICAgICAgdmFsdWUgPSBOQU5fU1RSSU5HOworICAgIH0gZWxzZSBpZiAoZHViIGlzIGRvdWJsZS5pbmZpbml0eSkgeworICAgICAgdmFsdWUgPSBJTkZJTklUWV9TVFJJTkc7CisgICAgfSBlbHNlIGlmIChkdWIgaXMgLWRvdWJsZS5pbmZpbml0eSkgeworICAgICAgdmFsdWUgPSBORUdfSU5GSU5JVFlfU1RSSU5HOworICAgIH0KKworICAgIGJvb2wgZXNjYXBlTnVtID0gdmFsdWUgIWlzIG51bGwgfHwgY29udGV4dF8uZXNjYXBlTnVtOworCisgICAgaWYgKHZhbHVlIGlzIG51bGwpIHsKKyAgICAgIC8qIHByZWNpc2lvbiBpcyAxNyAqLworICAgICAgdmFsdWUgPSBmb3JtYXQoIiUuMTdnIiwgZHViKTsKKyAgICB9CisKKyAgICBpZiAoZXNjYXBlTnVtKSB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgICAgdHJhbnNfLndyaXRlKGNhc3QodWJ5dGVbXSl2YWx1ZSk7CisgICAgaWYgKGVzY2FwZU51bSkgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhzdHJpbmcgc3RyKSB7CisgICAgY29udGV4dF8ud3JpdGUodHJhbnNfKTsKKyAgICB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgICAgZm9yZWFjaCAoYzsgc3RyKSB7CisgICAgICB3cml0ZUpzb25DaGFyKGMpOworICAgIH0KKyAgICB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KHVieXRlW10gYnVmKSB7CisgICAgY29udGV4dF8ud3JpdGUodHJhbnNfKTsKKworICAgIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKKyAgICB1Ynl0ZVs0XSBiOworICAgIHdoaWxlICghYnVmLmVtcHR5KSB7CisgICAgICBhdXRvIHRvV3JpdGUgPSB0YWtlKGJ1ZiwgMyk7CisgICAgICBCYXNlNjROb1BhZC5lbmNvZGUodG9Xcml0ZSwgYltdKTsKKyAgICAgIHRyYW5zXy53cml0ZShiWzAgLi4gdG9Xcml0ZS5sZW5ndGggKyAxXSk7CisgICAgICBidWYucG9wRnJvbnROKHRvV3JpdGUubGVuZ3RoKTsKKyAgICB9CisgICAgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtc2cpIHsKKyAgICB3cml0ZUpzb25BcnJheUJlZ2luKCk7CisgICAgd3JpdGVKc29uSW50ZWdlcihUSFJJRlRfSlNPTl9WRVJTSU9OKTsKKyAgICB3cml0ZVN0cmluZyhtc2cubmFtZSk7CisgICAgd3JpdGVKc29uSW50ZWdlcihjYXN0KGJ5dGUpbXNnLnR5cGUpOworICAgIHdyaXRlSnNvbkludGVnZXIobXNnLnNlcWlkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIHdyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCB0c3RydWN0KSB7CisgICAgd3JpdGVKc29uT2JqZWN0QmVnaW4oKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgd3JpdGVKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICB3cml0ZUpzb25PYmplY3RCZWdpbigpOworICAgIHdyaXRlU3RyaW5nKGdldE5hbWVGcm9tVFR5cGUoZmllbGQudHlwZSkpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkgeworICAgIHdyaXRlSnNvbk9iamVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHt9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgd3JpdGVKc29uQXJyYXlCZWdpbigpOworICAgIHdyaXRlU3RyaW5nKGdldE5hbWVGcm9tVFR5cGUobGlzdC5lbGVtVHlwZSkpOworICAgIHdyaXRlSnNvbkludGVnZXIobGlzdC5zaXplKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkgeworICAgIHdyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICB3cml0ZUpzb25BcnJheUJlZ2luKCk7CisgICAgd3JpdGVTdHJpbmcoZ2V0TmFtZUZyb21UVHlwZShtYXAua2V5VHlwZSkpOworICAgIHdyaXRlU3RyaW5nKGdldE5hbWVGcm9tVFR5cGUobWFwLnZhbHVlVHlwZSkpOworICAgIHdyaXRlSnNvbkludGVnZXIobWFwLnNpemUpOworICAgIHdyaXRlSnNvbk9iamVjdEJlZ2luKCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkgeworICAgIHdyaXRlSnNvbk9iamVjdEVuZCgpOworICAgIHdyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICB3cml0ZUpzb25BcnJheUJlZ2luKCk7CisgICAgd3JpdGVTdHJpbmcoZ2V0TmFtZUZyb21UVHlwZShzZXQuZWxlbVR5cGUpKTsKKyAgICB3cml0ZUpzb25JbnRlZ2VyKHNldC5zaXplKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7CisgICAgd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisKKyAgLyoKKyAgICogUmVhZGluZyBtZXRob2RzLgorICAgKi8KKworICBib29sIHJlYWRCb29sKCkgeworICAgIHJldHVybiByZWFkSnNvbkludGVnZXIhYnl0ZSgpID8gdHJ1ZSA6IGZhbHNlOworICB9CisKKyAgYnl0ZSByZWFkQnl0ZSgpIHsKKyAgICByZXR1cm4gcmVhZEpzb25JbnRlZ2VyIWJ5dGUoKTsKKyAgfQorCisgIHNob3J0IHJlYWRJMTYoKSB7CisgICAgcmV0dXJuIHJlYWRKc29uSW50ZWdlciFzaG9ydCgpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgcmV0dXJuIHJlYWRKc29uSW50ZWdlciFpbnQoKTsKKyAgfQorCisgIGxvbmcgcmVhZEk2NCgpIHsKKyAgICByZXR1cm4gcmVhZEpzb25JbnRlZ2VyIWxvbmcoKTsKKyAgfQorCisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIGNvbnRleHRfLnJlYWQocmVhZGVyXyk7CisKKyAgICBpZiAocmVhZGVyXy5wZWVrKCkgPT0gU1RSSU5HX0RFTElNSVRFUikgeworICAgICAgYXV0byBzdHIgPSByZWFkSnNvblN0cmluZyh0cnVlKTsKKyAgICAgIGlmIChzdHIgPT0gTkFOX1NUUklORykgeworICAgICAgICByZXR1cm4gZG91YmxlLm5hbjsKKyAgICAgIH0KKyAgICAgIGlmIChzdHIgPT0gSU5GSU5JVFlfU1RSSU5HKSB7CisgICAgICAgIHJldHVybiBkb3VibGUuaW5maW5pdHk7CisgICAgICB9CisgICAgICBpZiAoc3RyID09IE5FR19JTkZJTklUWV9TVFJJTkcpIHsKKyAgICAgICAgcmV0dXJuIC1kb3VibGUuaW5maW5pdHk7CisgICAgICB9CisKKyAgICAgIGlmICghY29udGV4dF8uZXNjYXBlTnVtKSB7CisgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIsCisgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiB0byFkb3VibGUoc3RyKTsKKyAgICAgIH0gY2F0Y2ggKENvbnZFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKGBFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgImAgfiBzdHIgfgorICAgICAgICAgIGAiLmAsIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSkgeworICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICByZWFkSnNvblN5bnRheENoYXIoU1RSSU5HX0RFTElNSVRFUik7CisgICAgICB9CisKKyAgICAgIGF1dG8gc3RyID0gcmVhZEpzb25OdW1lcmljQ2hhcnMoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiB0byFkb3VibGUoc3RyKTsKKyAgICAgIH0gY2F0Y2ggKENvbnZFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKGBFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgImAgfiBzdHIgfgorICAgICAgICAgIGAiLmAsIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgcmV0dXJuIHJlYWRKc29uU3RyaW5nKGZhbHNlKTsKKyAgfQorCisgIHVieXRlW10gcmVhZEJpbmFyeSgpIHsKKyAgICByZXR1cm4gQmFzZTY0Tm9QYWQuZGVjb2RlKHJlYWRTdHJpbmcoKSk7CisgIH0KKworICBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgeworICAgIFRNZXNzYWdlIG1zZyA9IHZvaWQ7CisKKyAgICByZWFkSnNvbkFycmF5QmVnaW4oKTsKKworICAgIGF1dG8gdmVyID0gcmVhZEpzb25JbnRlZ2VyIXNob3J0KCk7CisgICAgaWYgKHZlciAhPSBUSFJJRlRfSlNPTl9WRVJTSU9OKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iLAorICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5CQURfVkVSU0lPTik7CisgICAgfQorCisgICAgbXNnLm5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgbXNnLnR5cGUgPSBjYXN0KFRNZXNzYWdlVHlwZSlyZWFkSnNvbkludGVnZXIhYnl0ZSgpOworICAgIG1zZy5zZXFpZCA9IHJlYWRKc29uSW50ZWdlciFzaG9ydCgpOworCisgICAgcmV0dXJuIG1zZzsKKyAgfQorCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7CisgICAgcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgcmVhZEpzb25PYmplY3RCZWdpbigpOworICAgIHJldHVybiBUU3RydWN0KCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBURmllbGQgZiA9IHZvaWQ7CisgICAgZi5uYW1lID0gbnVsbDsKKworICAgIGF1dG8gY2ggPSByZWFkZXJfLnBlZWsoKTsKKyAgICBpZiAoY2ggPT0gT0JKRUNUX0VORCkgeworICAgICAgZi50eXBlID0gVFR5cGUuU1RPUDsKKyAgICB9IGVsc2UgeworICAgICAgZi5pZCA9IHJlYWRKc29uSW50ZWdlciFzaG9ydCgpOworICAgICAgcmVhZEpzb25PYmplY3RCZWdpbigpOworICAgICAgZi50eXBlID0gZ2V0VFR5cGVGcm9tTmFtZShyZWFkU3RyaW5nKCkpOworICAgIH0KKworICAgIHJldHVybiBmOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7CisgICAgcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgcmVhZEpzb25BcnJheUJlZ2luKCk7CisgICAgYXV0byB0eXBlID0gZ2V0VFR5cGVGcm9tTmFtZShyZWFkU3RyaW5nKCkpOworICAgIGF1dG8gc2l6ZSA9IHJlYWRDb250YWluZXJTaXplKCk7CisgICAgcmV0dXJuIFRMaXN0KHR5cGUsIHNpemUpOworICB9CisKKyAgdm9pZCByZWFkTGlzdEVuZCgpIHsKKyAgICByZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICByZWFkSnNvbkFycmF5QmVnaW4oKTsKKyAgICBhdXRvIGtleVR5cGUgPSBnZXRUVHlwZUZyb21OYW1lKHJlYWRTdHJpbmcoKSk7CisgICAgYXV0byB2YWx1ZVR5cGUgPSBnZXRUVHlwZUZyb21OYW1lKHJlYWRTdHJpbmcoKSk7CisgICAgYXV0byBzaXplID0gcmVhZENvbnRhaW5lclNpemUoKTsKKyAgICByZWFkSnNvbk9iamVjdEJlZ2luKCk7CisgICAgcmV0dXJuIFRNYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHsKKyAgICByZWFkSnNvbk9iamVjdEVuZCgpOworICAgIHJlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIHJlYWRKc29uQXJyYXlCZWdpbigpOworICAgIGF1dG8gdHlwZSA9IGdldFRUeXBlRnJvbU5hbWUocmVhZFN0cmluZygpKTsKKyAgICBhdXRvIHNpemUgPSByZWFkQ29udGFpbmVyU2l6ZSgpOworICAgIHJldHVybiBUU2V0KHR5cGUsIHNpemUpOworICB9CisKKyAgdm9pZCByZWFkU2V0RW5kKCkgeworICAgIHJlYWRKc29uQXJyYXlFbmQoKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHB1c2hDb250ZXh0KENvbnRleHQgYykgeworICAgIGNvbnRleHRTdGFja18gfj0gY29udGV4dF87CisgICAgY29udGV4dF8gPSBjOworICB9CisKKyAgdm9pZCBwb3BDb250ZXh0KCkgeworICAgIGNvbnRleHRfID0gY29udGV4dFN0YWNrXy5iYWNrOworICAgIGNvbnRleHRTdGFja18ucG9wQmFjaygpOworICAgIGNvbnRleHRTdGFja18uYXNzdW1lU2FmZUFwcGVuZCgpOworICB9CisKKyAgLyoKKyAgICogV3JpdGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBhIEpzb24gZXNjYXBlIHNlcXVlbmNlICgiXHUwMHh4IikKKyAgdm9pZCB3cml0ZUpzb25Fc2NhcGVDaGFyKHVieXRlIGNoKSB7CisgICAgdHJhbnNfLndyaXRlKEVTQ0FQRV9QUkVGSVgpOworICAgIHRyYW5zXy53cml0ZShFU0NBUEVfUFJFRklYKTsKKyAgICBhdXRvIG91dENoID0gaGV4Q2hhcihjYXN0KHVieXRlKShjaCA+PiA0KSk7CisgICAgdHJhbnNfLndyaXRlKCgmb3V0Q2gpWzAgLi4gMV0pOworICAgIG91dENoID0gaGV4Q2hhcihjaCk7CisgICAgdHJhbnNfLndyaXRlKCgmb3V0Q2gpWzAgLi4gMV0pOworICB9CisKKyAgLy8gV3JpdGUgdGhlIGNoYXJhY3RlciBjaCBhcyBwYXJ0IG9mIGEgSnNvbiBzdHJpbmcsIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgorICB2b2lkIHdyaXRlSnNvbkNoYXIodWJ5dGUgY2gpIHsKKyAgICBpZiAoY2ggPj0gMHgzMCkgeworICAgICAgaWYgKGNoID09ICdcXCcpIHsgLy8gT25seSBzcGVjaWFsIGNoYXJhY3RlciA+PSAweDMwIGlzICdcJworICAgICAgICB0cmFuc18ud3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cmFuc18ud3JpdGUoKCZjaClbMCAuLiAxXSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgYXV0byBvdXRDaCA9IGtKc29uQ2hhclRhYmxlW2NoXTsKKyAgICAgIC8vIENoZWNrIGlmIHJlZ3VsYXIgY2hhcmFjdGVyLCBiYWNrc2xhc2ggZXNjYXBlZCwgb3IgSnNvbiBlc2NhcGVkCisgICAgICBpZiAob3V0Q2ggPT0gMSkgeworICAgICAgICB0cmFuc18ud3JpdGUoKCZjaClbMCAuLiAxXSk7CisgICAgICB9IGVsc2UgaWYgKG91dENoID4gMSkgeworICAgICAgICB0cmFuc18ud3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKCgmb3V0Q2gpWzAgLi4gMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVKc29uRXNjYXBlQ2hhcihjaCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ29udmVydCB0aGUgZ2l2ZW4gaW50ZWdlciB0eXBlIHRvIGEgSnNvbiBudW1iZXIsIG9yIGEgc3RyaW5nCisgIC8vIGlmIHRoZSBjb250ZXh0IHJlcXVpcmVzIGl0IChlZzoga2V5IGluIGEgbWFwIHBhaXIpLgorICB2b2lkIHdyaXRlSnNvbkludGVnZXIoVCkoVCBudW0pIGlmIChpc0ludGVncmFsIVQpIHsKKyAgICBjb250ZXh0Xy53cml0ZSh0cmFuc18pOworCisgICAgYXV0byBlc2NhcGVOdW0gPSBjb250ZXh0Xy5lc2NhcGVOdW0oKTsKKyAgICBpZiAoZXNjYXBlTnVtKSB0cmFuc18ud3JpdGUoU1RSSU5HX0RFTElNSVRFUik7CisgICAgdHJhbnNfLndyaXRlKGNhc3QodWJ5dGVbXSl0byFzdHJpbmcobnVtKSk7CisgICAgaWYgKGVzY2FwZU51bSkgdHJhbnNfLndyaXRlKFNUUklOR19ERUxJTUlURVIpOworICB9CisKKyAgdm9pZCB3cml0ZUpzb25PYmplY3RCZWdpbigpIHsKKyAgICBjb250ZXh0Xy53cml0ZSh0cmFuc18pOworICAgIHRyYW5zXy53cml0ZShPQkpFQ1RfQkVHSU4pOworICAgIHB1c2hDb250ZXh0KG5ldyBQYWlyQ29udGV4dCgpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVKc29uT2JqZWN0RW5kKCkgeworICAgIHBvcENvbnRleHQoKTsKKyAgICB0cmFuc18ud3JpdGUoT0JKRUNUX0VORCk7CisgIH0KKworICB2b2lkIHdyaXRlSnNvbkFycmF5QmVnaW4oKSB7CisgICAgY29udGV4dF8ud3JpdGUodHJhbnNfKTsKKyAgICB0cmFuc18ud3JpdGUoQVJSQVlfQkVHSU4pOworICAgIHB1c2hDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVKc29uQXJyYXlFbmQoKSB7CisgICAgcG9wQ29udGV4dCgpOworICAgIHRyYW5zXy53cml0ZShBUlJBWV9FTkQpOworICB9CisKKyAgLyoKKyAgICogUmVhZGluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgaW50IHJlYWRDb250YWluZXJTaXplKCkgeworICAgIGF1dG8gc2l6ZSA9IHJlYWRKc29uSW50ZWdlciFpbnQoKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuTkVHQVRJVkVfU0laRSk7CisgICAgfSBlbHNlIGlmIChjb250YWluZXJTaXplTGltaXQgPiAwICYmIHNpemUgPiBjb250YWluZXJTaXplTGltaXQpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuU0laRV9MSU1JVCk7CisgICAgfQorICAgIHJldHVybiBzaXplOworICB9CisKKyAgdm9pZCByZWFkSnNvblN5bnRheENoYXIodWJ5dGVbMV0gY2gpIHsKKyAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyXywgY2gpOworICB9CisKKyAgd2NoYXIgcmVhZEpzb25Fc2NhcGVDaGFyKCkgeworICAgIGF1dG8gYSA9IHJlYWRlcl8ucmVhZCgpOworICAgIGF1dG8gYiA9IHJlYWRlcl8ucmVhZCgpOworICAgIGF1dG8gYyA9IHJlYWRlcl8ucmVhZCgpOworICAgIGF1dG8gZCA9IHJlYWRlcl8ucmVhZCgpOworICAgIHJldHVybiBjYXN0KHVzaG9ydCkoCisgICAgICAgICAgKGhleFZhbChhWzBdKSA8PCAxMikgKyAoaGV4VmFsKGJbMF0pIDw8IDgpICsKKyAgICAgICAgICAoaGV4VmFsKGNbMF0pIDw8IDQpICsgaGV4VmFsKGRbMF0pCisgICAgICAgICk7CisgIH0KKworICBzdHJpbmcgcmVhZEpzb25TdHJpbmcoYm9vbCBza2lwQ29udGV4dCA9IGZhbHNlKSB7CisgICAgaWYgKCFza2lwQ29udGV4dCkgY29udGV4dF8ucmVhZChyZWFkZXJfKTsKKworICAgIHJlYWRKc29uU3ludGF4Q2hhcihTVFJJTkdfREVMSU1JVEVSKTsKKyAgICBhdXRvIGJ1ZmZlciA9IGFwcGVuZGVyIXN0cmluZygpOworCisgICAgd2NoYXJbXSB3Y2hzOworICAgIGludCBieXRlc1JlYWQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGF1dG8gY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICAgIGlmIChjaCA9PSBTVFJJTkdfREVMSU1JVEVSKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICArK2J5dGVzUmVhZDsKKyAgICAgIGlmIChzdHJpbmdTaXplTGltaXQgPiAwICYmIGJ5dGVzUmVhZCA+IHN0cmluZ1NpemVMaW1pdCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLlNJWkVfTElNSVQpOworICAgICAgfQorCisgICAgICBpZiAoY2ggPT0gQkFDS1NMQVNIKSB7CisgICAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgICAgIGlmIChjaCA9PSBFU0NBUEVfQ0hBUikgeworICAgICAgICAgIGF1dG8gd2NoID0gcmVhZEpzb25Fc2NhcGVDaGFyKCk7CisgICAgICAgICAgaWYgKHdjaCA+PSAweEQ4MDAgJiYgd2NoIDw9IDB4REJGRikgeworICAgICAgICAgICAgd2NocyB+PSB3Y2g7CisgICAgICAgICAgfSBlbHNlIGlmICh3Y2ggPj0gMHhEQzAwICYmIHdjaCA8PSAweERGRkYgJiYgd2Nocy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWlzc2luZyBVVEYtMTYgaGlnaCBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2NocyB+PSB3Y2g7CisgICAgICAgICAgICBidWZmZXIucHV0KHdjaHMudG9VVEY4KTsKKyAgICAgICAgICAgIHdjaHMgPSBbXTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXV0byBwb3MgPSBjb3VudFVudGlsKGtFc2NhcGVDaGFyc1tdLCBjaFswXSk7CisgICAgICAgICAgaWYgKHBvcyA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgJyIgfgorICAgICAgICAgICAgICBjYXN0KGNoYXIpY2hbMF0gfiAiJy4iLCBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgICAgIH0KKyAgICAgICAgICBjaCA9IGtFc2NhcGVDaGFyVmFsc1twb3NdOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAod2Nocy5sZW5ndGggIT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIGJ1ZmZlci5wdXQoY2hbMF0pOworICAgIH0KKworICAgIGlmICh3Y2hzLmxlbmd0aCAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgfQorICAgIHJldHVybiBidWZmZXIuZGF0YTsKKyAgfQorCisgIC8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIG5vdAorICAvLyBhIHZhbGlkIEpzb24gbnVtZXJpYyBjaGFyYWN0ZXIuCisgIHN0cmluZyByZWFkSnNvbk51bWVyaWNDaGFycygpIHsKKyAgICBzdHJpbmcgc3RyOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGNoID0gcmVhZGVyXy5wZWVrKCk7CisgICAgICBpZiAoIWlzSnNvbk51bWVyaWMoY2hbMF0pKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmVhZGVyXy5yZWFkKCk7CisgICAgICBzdHIgfj0gY2g7CisgICAgfQorICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYW5kIGFzc2VtYmxlcyB0aGVtIGludG8gYSBudW1iZXIsCisgIC8vIHJldHVybmluZyB0aGVtIHZpYSBudW0KKyAgVCByZWFkSnNvbkludGVnZXIoVCkoKSBpZiAoaXNJbnRlZ3JhbCFUKSB7CisgICAgY29udGV4dF8ucmVhZChyZWFkZXJfKTsKKyAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKCkpIHsKKyAgICAgIHJlYWRKc29uU3ludGF4Q2hhcihTVFJJTkdfREVMSU1JVEVSKTsKKyAgICB9CisgICAgYXV0byBzdHIgPSByZWFkSnNvbk51bWVyaWNDaGFycygpOworICAgIFQgbnVtOworICAgIHRyeSB7CisgICAgICBudW0gPSB0byFUKHN0cik7CisgICAgfSBjYXRjaCAoQ29udkV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKGBFeHBlY3RlZCBudW1lcmljIHZhbHVlLCBnb3QgImAgfiBzdHIgfiBgIi5gLAorICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgIH0KKyAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKCkpIHsKKyAgICAgIHJlYWRKc29uU3ludGF4Q2hhcihTVFJJTkdfREVMSU1JVEVSKTsKKyAgICB9CisgICAgcmV0dXJuIG51bTsKKyAgfQorCisgIHZvaWQgcmVhZEpzb25PYmplY3RCZWdpbigpIHsKKyAgICBjb250ZXh0Xy5yZWFkKHJlYWRlcl8pOworICAgIHJlYWRKc29uU3ludGF4Q2hhcihPQkpFQ1RfQkVHSU4pOworICAgIHB1c2hDb250ZXh0KG5ldyBQYWlyQ29udGV4dCgpKTsKKyAgfQorCisgIHZvaWQgcmVhZEpzb25PYmplY3RFbmQoKSB7CisgICAgcmVhZEpzb25TeW50YXhDaGFyKE9CSkVDVF9FTkQpOworICAgIHBvcENvbnRleHQoKTsKKyAgfQorCisgIHZvaWQgcmVhZEpzb25BcnJheUJlZ2luKCkgeworICAgIGNvbnRleHRfLnJlYWQocmVhZGVyXyk7CisgICAgcmVhZEpzb25TeW50YXhDaGFyKEFSUkFZX0JFR0lOKTsKKyAgICBwdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoKSk7CisgIH0KKworICB2b2lkIHJlYWRKc29uQXJyYXlFbmQoKSB7CisgICAgcmVhZEpzb25TeW50YXhDaGFyKEFSUkFZX0VORCk7CisgICAgcG9wQ29udGV4dCgpOworICB9CisKKyAgc3RhdGljIHsKKyAgICBmaW5hbCBjbGFzcyBMb29rYWhlYWRSZWFkZXIgeworICAgICAgdGhpcyhUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICAgICAgdHJhbnNfID0gdHJhbnM7CisgICAgICB9CisKKyAgICAgIHVieXRlWzFdIHJlYWQoKSB7CisgICAgICAgIGlmIChoYXNEYXRhXykgeworICAgICAgICAgIGhhc0RhdGFfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJhbnNfLnJlYWRBbGwoZGF0YV8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhXzsKKyAgICAgIH0KKworICAgICAgdWJ5dGVbMV0gcGVlaygpIHsKKyAgICAgICAgaWYgKCFoYXNEYXRhXykgeworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKGRhdGFfKTsKKyAgICAgICAgICBoYXNEYXRhXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGFfOworICAgICAgfQorCisgICAgIHByaXZhdGU6CisgICAgICBUcmFuc3BvcnQgdHJhbnNfOworICAgICAgYm9vbCBoYXNEYXRhXzsKKyAgICAgIHVieXRlWzFdIGRhdGFfOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xhc3MgdG8gc2VydmUgYXMgYmFzZSBKc29uIGNvbnRleHQgYW5kIGFzIGJhc2UgY2xhc3MgZm9yIG90aGVyIGNvbnRleHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMKKyAgICAgKi8KKyAgICBjbGFzcyBDb250ZXh0IHsKKyAgICAgIC8qKgorICAgICAgICogV3JpdGUgY29udGV4dCBkYXRhIHRvIHRoZSB0cmFuc3BvcnQuIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4KKyAgICAgICAqLworICAgICAgdm9pZCB3cml0ZShUcmFuc3BvcnQgdHJhbnMpIHt9CisKKyAgICAgIC8qKgorICAgICAgICogUmVhZCBjb250ZXh0IGRhdGEgZnJvbSB0aGUgdHJhbnNwb3J0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCisgICAgICAgKi8KKyAgICAgIHZvaWQgcmVhZChMb29rYWhlYWRSZWFkZXIgcmVhZGVyKSB7fQorCisgICAgICAvKioKKyAgICAgICAqIFJldHVybiB0cnVlIGlmIG51bWJlcnMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHN0cmluZ3MgaW4gdGhpcyBjb250ZXh0LgorICAgICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gZmFsc2UuCisgICAgICAgKi8KKyAgICAgIGJvb2wgZXNjYXBlTnVtKCkgQHByb3BlcnR5IHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIC8vIENvbnRleHQgY2xhc3MgZm9yIG9iamVjdCBtZW1iZXIga2V5LXZhbHVlIHBhaXJzCisgICAgY2xhc3MgUGFpckNvbnRleHQgOiBDb250ZXh0IHsKKyAgICAgIHRoaXMoKSB7CisgICAgICAgIGZpcnN0XyA9IHRydWU7CisgICAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICB9CisKKyAgICAgIG92ZXJyaWRlIHZvaWQgd3JpdGUoVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgICAgICBjb2xvbl8gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zLndyaXRlKGNvbG9uXyA/IFBBSVJfU0VQIDogRUxFTV9TRVApOworICAgICAgICAgIGNvbG9uXyA9ICFjb2xvbl87CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgb3ZlcnJpZGUgdm9pZCByZWFkKExvb2thaGVhZFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXV0byBjaCA9IChjb2xvbl8gPyBQQUlSX1NFUCA6IEVMRU1fU0VQKTsKKyAgICAgICAgICBjb2xvbl8gPSAhY29sb25fOworICAgICAgICAgIHJldHVybiByZWFkU3ludGF4Q2hhcihyZWFkZXIsIGNoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBOdW1iZXJzIG11c3QgYmUgdHVybmVkIGludG8gc3RyaW5ncyBpZiB0aGV5IGFyZSB0aGUga2V5IHBhcnQgb2YgYSBwYWlyCisgICAgICBvdmVycmlkZSBib29sIGVzY2FwZU51bSgpIEBwcm9wZXJ0eSB7CisgICAgICAgIHJldHVybiBjb2xvbl87CisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgYm9vbCBmaXJzdF87CisgICAgICBib29sIGNvbG9uXzsKKyAgICB9CisKKyAgICBjbGFzcyBMaXN0Q29udGV4dCA6IENvbnRleHQgeworICAgICAgdGhpcygpIHsKKyAgICAgICAgZmlyc3RfID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgb3ZlcnJpZGUgdm9pZCB3cml0ZShUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyYW5zLndyaXRlKEVMRU1fU0VQKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBvdmVycmlkZSB2b2lkIHJlYWQoTG9va2FoZWFkUmVhZGVyIHJlYWRlcikgeworICAgICAgICBpZiAoZmlyc3RfKSB7CisgICAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVhZFN5bnRheENoYXIocmVhZGVyLCBFTEVNX1NFUCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBib29sIGZpcnN0XzsKKyAgICB9CisKKyAgICAvLyBSZWFkIDEgY2hhcmFjdGVyIGZyb20gdGhlIHRyYW5zcG9ydCB0cmFucyBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgdGhlCisgICAgLy8gZXhwZWN0ZWQgY2hhcmFjdGVyIGNoLgorICAgIC8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIGl0IGlzIG5vdC4KKyAgICB2b2lkIHJlYWRTeW50YXhDaGFyKExvb2thaGVhZFJlYWRlciByZWFkZXIsIHVieXRlWzFdIGNoKSB7CisgICAgICBhdXRvIGNoMiA9IHJlYWRlci5yZWFkKCk7CisgICAgICBpZiAoY2gyICE9IGNoKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkICciIH4gY2FzdChjaGFyKWNoWzBdIH4gIicsIGdvdCAnIiB+CisgICAgICAgICAgY2FzdChjaGFyKWNoMlswXSB+ICInLiIsIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLklOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUHJvYmFibHkgbmVlZCB0byBpbXBsZW1lbnQgYSBiZXR0ZXIgc3RhY2sgYXQgc29tZSBwb2ludC4KKyAgQ29udGV4dFtdIGNvbnRleHRTdGFja187CisgIENvbnRleHQgY29udGV4dF87CisKKyAgVHJhbnNwb3J0IHRyYW5zXzsKKyAgTG9va2FoZWFkUmVhZGVyIHJlYWRlcl87Cit9CisKKy8qKgorICogVEpzb25Qcm90b2NvbCBjb25zdHJ1Y3Rpb24gaGVscGVyIHRvIGF2b2lkIGhhdmluZyB0byBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIHRoZSB0cmFuc3BvcnQgdHlwZSwgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkIHVzaW5nIElGVEkKKyAqIChzZWUgJChMSU5LMiBodHRwOi8vZC5wdXJlbWFnaWMuY29tL2lzc3Vlcy9zaG93X2J1Zy5jZ2k/aWQ9NjA4MiwgRCBCdWd6aWxsYQorICogZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVEpzb25Qcm90b2NvbCFUcmFuc3BvcnQgdEpzb25Qcm90b2NvbChUcmFuc3BvcnQpKFRyYW5zcG9ydCB0cmFucywKKyAgaW50IGNvbnRhaW5lclNpemVMaW1pdCA9IDAsIGludCBzdHJpbmdTaXplTGltaXQgPSAwCispIGlmIChpc1RUcmFuc3BvcnQhVHJhbnNwb3J0KSB7CisgIHJldHVybiBuZXcgVEpzb25Qcm90b2NvbCFUcmFuc3BvcnQodHJhbnMsIGNvbnRhaW5lclNpemVMaW1pdCwgc3RyaW5nU2l6ZUxpbWl0KTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIC8vIENoZWNrIHRoZSBtZXNzYWdlIGhlYWRlciBmb3JtYXQuCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAganNvbi53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSgiZm9vIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsKKyAganNvbi53cml0ZU1lc3NhZ2VFbmQoKTsKKworICBhdXRvIGhlYWRlciA9IG5ldyB1Ynl0ZVsxM107CisgIGJ1Zi5yZWFkQWxsKGhlYWRlcik7CisgIGVuZm9yY2UoY2FzdChjaGFyW10paGVhZGVyID09IGBbMSwiZm9vIiwxLDBdYCk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICAvLyBDaGVjayB0aGF0IHNob3J0IGJpbmFyeSBkYXRhIGlzIHJlYWQgY29ycmVjdGx5ICh0aGUgVGhyaWZ0IEpTT04gZm9ybWF0CisgIC8vIGRvZXMgbm90IGluY2x1ZGUgcGFkZGluZyBjaGFycyBpbiB0aGUgQmFzZTY0IGVuY29kZWQgZGF0YSkuCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8ganNvbiA9IHRKc29uUHJvdG9jb2woYnVmKTsKKyAganNvbi53cml0ZUJpbmFyeShbMSwgMl0pOworICBqc29uLnJlc2V0KCk7CisgIGVuZm9yY2UoanNvbi5yZWFkQmluYXJ5KCkgPT0gWzEsIDJdKTsKK30KKwordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoY2FzdCh1Ynl0ZVtdKSJcIlxcdTBlMDEgXFx1ZDgzNVxcdWRkM2VcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGF1dG8gc3RyID0ganNvbi5yZWFkU3RyaW5nKCk7CisgIGVuZm9yY2Uoc3RyID09ICLguIEg8J2UviIpOworfQorCit1bml0dGVzdCB7CisgIC8vIFRocm93biBpZiBsb3cgc3Vycm9nYXRlIGlzIG1pc3NpbmcuCisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcihjYXN0KHVieXRlW10pIlwiXFx1MGUwMSBcXHVkODM1XCIiKTsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBhc3NlcnRUaHJvd24hVFByb3RvY29sRXhjZXB0aW9uKGpzb24ucmVhZFN0cmluZygpKTsKK30KKwordW5pdHRlc3QgeworICAvLyBUaHJvd24gaWYgaGlnaCBzdXJyb2dhdGUgaXMgbWlzc2luZy4KKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKGNhc3QodWJ5dGVbXSkiXCJcXHUwZTAxIFxcdWRkM2VcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGFzc2VydFRocm93biFUUHJvdG9jb2xFeGNlcHRpb24oanNvbi5yZWFkU3RyaW5nKCkpOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5wcm90b2NvbDsKKyAgdGVzdENvbnRhaW5lclNpemVMaW1pdCEoVEpzb25Qcm90b2NvbCEoKSkoKTsKKyAgdGVzdFN0cmluZ1NpemVMaW1pdCEoVEpzb25Qcm90b2NvbCEoKSkoKTsKK30KKworLyoqCisgKiBUUHJvdG9jb2xGYWN0b3J5IGNyZWF0aW5nIGEgVEpzb25Qcm90b2NvbCBpbnN0YW5jZSBmb3IgcGFzc2VkIGluCisgKiB0cmFuc3BvcnRzLgorICoKKyAqIFRoZSBvcHRpb25hbCBUcmFuc3BvcnRzIHRlbXBsYXRlIHR1cGxlIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisgKiBvbmUgb3IgbW9yZSBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyB0byBzcGVjaWZpY2FsbHkgaW5zdGFudGlhdGUKKyAqIFRKc29uUHJvdG9jb2wgZm9yLiBJZiB0aGUgYWN0dWFsIHRyYW5zcG9ydCB0eXBlcyBlbmNvdW50ZXJlZCBhdAorICogcnVudGltZSBtYXRjaCBvbmUgb2YgdGhlIHRyYW5zcG9ydHMgaW4gdGhlIGxpc3QsIGEgc3BlY2lhbGl6ZWQgcHJvdG9jb2wKKyAqIGluc3RhbmNlIGlzIGNyZWF0ZWQuIE90aGVyd2lzZSwgYSBnZW5lcmljIFRUcmFuc3BvcnQgdmVyc2lvbiBpcyB1c2VkLgorICovCitjbGFzcyBUSnNvblByb3RvY29sRmFjdG9yeShUcmFuc3BvcnRzLi4uKSBpZiAoCisgIGFsbFNhdGlzZnkhKGlzVFRyYW5zcG9ydCwgVHJhbnNwb3J0cykKKykgOiBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIGNvbnN0IHsKKyAgICBmb3JlYWNoIChUcmFuc3BvcnQ7IFR5cGVUdXBsZSEoVHJhbnNwb3J0cywgVFRyYW5zcG9ydCkpIHsKKyAgICAgIGF1dG8gY29uY3JldGVUcmFucyA9IGNhc3QoVHJhbnNwb3J0KXRyYW5zOworICAgICAgaWYgKGNvbmNyZXRlVHJhbnMpIHsKKyAgICAgICAgYXV0byBwID0gbmV3IFRKc29uUHJvdG9jb2whVHJhbnNwb3J0KGNvbmNyZXRlVHJhbnMpOworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICJQYXNzZWQgbnVsbCB0cmFuc3BvcnQgdG8gVEpzb25Qcm90b2NvbEZhY3RveS4iKTsKKyAgfQorfQorCitwcml2YXRlIHsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIE9CSkVDVF9CRUdJTiA9ICd7JzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIE9CSkVDVF9FTkQgPSAnfSc7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBBUlJBWV9CRUdJTiA9ICdbJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIEFSUkFZX0VORCA9ICddJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIE5FV0xJTkUgPSAnXG4nOworICBpbW11dGFibGUgdWJ5dGVbMV0gUEFJUl9TRVAgPSAnOic7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBFTEVNX1NFUCA9ICcsJzsKKyAgaW1tdXRhYmxlIHVieXRlWzFdIEJBQ0tTTEFTSCA9ICdcXCc7CisgIGltbXV0YWJsZSB1Ynl0ZVsxXSBTVFJJTkdfREVMSU1JVEVSID0gJyInOworICBpbW11dGFibGUgdWJ5dGVbMV0gWkVST19DSEFSID0gJzAnOworICBpbW11dGFibGUgdWJ5dGVbMV0gRVNDQVBFX0NIQVIgPSAndSc7CisgIGltbXV0YWJsZSB1Ynl0ZVs0XSBFU0NBUEVfUFJFRklYID0gY2FzdCh1Ynl0ZVs0XSlyIlx1MDAiOworCisgIGVudW0gVEhSSUZUX0pTT05fVkVSU0lPTiA9IDE7CisKKyAgaW1tdXRhYmxlIE5BTl9TVFJJTkcgPSAiTmFOIjsKKyAgaW1tdXRhYmxlIElORklOSVRZX1NUUklORyA9ICJJbmZpbml0eSI7CisgIGltbXV0YWJsZSBORUdfSU5GSU5JVFlfU1RSSU5HID0gIi1JbmZpbml0eSI7CisKKyAgc3RyaW5nIGdldE5hbWVGcm9tVFR5cGUoVFR5cGUgdHlwZUlEKSB7CisgICAgZmluYWwgc3dpdGNoICh0eXBlSUQpIHsKKyAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgcmV0dXJuICJ0ZiI7CisgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgIHJldHVybiAiaTgiOworICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgIHJldHVybiAiaTE2IjsKKyAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICByZXR1cm4gImkzMiI7CisgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgcmV0dXJuICJpNjQiOworICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICAgIHJldHVybiAiZGJsIjsKKyAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICByZXR1cm4gInN0ciI7CisgICAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgICAgcmV0dXJuICJyZWMiOworICAgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICAgIHJldHVybiAibWFwIjsKKyAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgcmV0dXJuICJsc3QiOworICAgICAgY2FzZSBUVHlwZS5TRVQ6CisgICAgICAgIHJldHVybiAic2V0IjsKKyAgICAgIGNhc2UgVFR5cGUuU1RPUDogZ290byBjYXNlOworICAgICAgY2FzZSBUVHlwZS5WT0lEOgorICAgICAgICBhc3NlcnQoZmFsc2UsICJJbnZhbGlkIHR5cGUgcGFzc2VkLiIpOworICAgIH0KKyAgfQorCisgIFRUeXBlIGdldFRUeXBlRnJvbU5hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICBUVHlwZSByZXN1bHQ7CisgICAgaWYgKG5hbWUubGVuZ3RoID4gMSkgeworICAgICAgc3dpdGNoIChuYW1lWzBdKSB7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkRPVUJMRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgc3dpdGNoIChuYW1lWzFdKSB7CisgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQllURTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTE2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTElTVDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuTUFQOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TVFJVQ1Q7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgIGlmIChuYW1lWzFdID09ICd0JykgeworICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU1RSSU5HOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChuYW1lWzFdID09ICdlJykgeworICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU0VUOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQk9PTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzdWx0ID09IFRUeXBlLlNUT1ApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVucmVjb2duaXplZCB0eXBlIiwKKyAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuTk9UX0lNUExFTUVOVEVEKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBoYW5kbGluZyBmb3IgdGhlIGZpcnN0IDB4MzAgY2hhcmFjdGVycworICAvLyAgMCA6IGVzY2FwZSB1c2luZyAiXHUwMHh4IiBub3RhdGlvbgorICAvLyAgMSA6IGp1c3Qgb3V0cHV0IGluZGV4CisgIC8vIDxvdGhlcj4gOiBlc2NhcGUgdXNpbmcgIlw8b3RoZXI+IiBub3RhdGlvbgorICBpbW11dGFibGUgdWJ5dGVbMHgzMF0ga0pzb25DaGFyVGFibGUgPSBbCisgIC8vICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCisgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwnYicsJ3QnLCduJywgIDAsJ2YnLCdyJywgIDAsICAwLCAvLyAwCisgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvLyAxCisgICAgICAxLCAgMSwnIicsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAvLyAyCisgIF07CisKKyAgLy8gVGhpcyBzdHJpbmcncyBjaGFyYWN0ZXJzIG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgZWxlbWVudHMgaW4ga0VzY2FwZUNoYXJWYWxzLgorICAvLyBJIGRvbid0IGhhdmUgJy8nIG9uIHRoaXMgbGlzdCBldmVuIHRob3VnaCBpdCBhcHBlYXJzIG9uIHd3dy5qc29uLm9yZyAtLQorICAvLyBpdCBpcyBub3QgaW4gdGhlIFJGQworICBpbW11dGFibGUga0VzY2FwZUNoYXJzID0gY2FzdCh1Ynl0ZVs3XSkgYCJcXGJmbnJ0YDsKKworICAvLyBUaGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KKyAgLy8ga0VzY2FwZUNoYXJzCisgIGltbXV0YWJsZSB1Ynl0ZVs3XSBrRXNjYXBlQ2hhclZhbHMgPSBbCisgICAgJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLAorICBdOworCisgIC8vIFJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIGhleCBjaGFyYWN0ZXIgY2guCisgIC8vIFRocm93IGEgcHJvdG9jb2wgZXhjZXB0aW9uIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IFswLTlhLWZdLgorICB1Ynl0ZSBoZXhWYWwodWJ5dGUgY2gpIHsKKyAgICBpZiAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpIHsKKyAgICAgIHJldHVybiBjYXN0KHVieXRlKShjaCAtICcwJyk7CisgICAgfSBlbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkgeworICAgICAgcmV0dXJuIGNhc3QodWJ5dGUpKGNoIC0gJ2EnICsgMTApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIGhleCB2YWwgKFswLTlhLWZdKSwgZ290ICciIH4KKyAgICAgICAgY2ggfiAiJy4iLCBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybiB0aGUgaGV4IGNoYXJhY3RlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgdmFsLiBUaGUgdmFsdWUgaXMgbWFza2VkCisgIC8vIHRvIG1ha2Ugc3VyZSBpdCBpcyBpbiB0aGUgY29ycmVjdCByYW5nZS4KKyAgdWJ5dGUgaGV4Q2hhcih1Ynl0ZSB2YWwpIHsKKyAgICB2YWwgJj0gMHgwRjsKKyAgICBpZiAodmFsIDwgMTApIHsKKyAgICAgIHJldHVybiBjYXN0KHVieXRlKSh2YWwgKyAnMCcpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY2FzdCh1Ynl0ZSkodmFsIC0gMTAgKyAnYScpOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgY2ggaXMgaW4gWy0rMC05LkVlXTsgZmFsc2Ugb3RoZXJ3aXNlCisgIGJvb2wgaXNKc29uTnVtZXJpYyh1Ynl0ZSBjaCkgeworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgJysnOgorICAgICAgY2FzZSAnLSc6CisgICAgICBjYXNlICcuJzoKKyAgICAgIGNhc2UgJzAnOgorICAgICAgY2FzZSAnMSc6CisgICAgICBjYXNlICcyJzoKKyAgICAgIGNhc2UgJzMnOgorICAgICAgY2FzZSAnNCc6CisgICAgICBjYXNlICc1JzoKKyAgICAgIGNhc2UgJzYnOgorICAgICAgY2FzZSAnNyc6CisgICAgICBjYXNlICc4JzoKKyAgICAgIGNhc2UgJzknOgorICAgICAgY2FzZSAnRSc6CisgICAgICBjYXNlICdlJzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL3Byb2Nlc3Nvci5kIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9wcm9jZXNzb3IuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc0MjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9wcm9jZXNzb3IuZApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CisKKy8vIFVzZSBzZWxlY3RpdmUgaW1wb3J0IG9uY2UgRE1EIEBAQlVHMzE0QEAgaXMgZml4ZWQuCitpbXBvcnQgc3RkLnZhcmlhbnQgLysgOiBWYXJpYW50ICsvOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorICogd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KKyAqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGlzIG9iamVjdCBpcyBsb29zZSwgdGhvdWdoIHRoZSB0eXBpY2FsIGNhc2UgaXMgZm9yIHNvbWUKKyAqIHNvcnQgb2Ygc2VydmVyIHRoYXQgZWl0aGVyIGdlbmVyYXRlcyByZXNwb25zZXMgdG8gYW4gaW5wdXQgc3RyZWFtIG9yCisgKiBmb3J3YXJkcyBkYXRhIGZyb20gb25lIHBpcGUgb250byBhbm90aGVyLgorICoKKyAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBvcHRpb25hbGx5IGFsbG93IG9uZSBvciBtb3JlIFRQcm9jZXNzb3JFdmVudEhhbmRsZXJzCisgKiB0byBiZSBhdHRhY2hlZCwgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byBob29rIGN1c3RvbSBjb2RlIGludG8gdGhlCisgKiBoYW5kbGluZyBwcm9jZXNzLCB3aGljaCBjYW4gYmUgdXNlZCBlLmcuIGZvciBnYXRoZXJpbmcgc3RhdGlzdGljcy4KKyAqLworaW50ZXJmYWNlIFRQcm9jZXNzb3IgeworICAvLy8KKyAgYm9vbCBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LAorICAgIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQgPSBWYXJpYW50KCkKKyAgKSBpbiB7CisgICAgYXNzZXJ0KGlwcm90KTsKKyAgICBhc3NlcnQob3Byb3QpOworICB9CisKKyAgLy8vCisgIGZpbmFsIGJvb2wgcHJvY2VzcyhUUHJvdG9jb2wgcHJvdCwgVmFyaWFudCBjb25uZWN0aW9uQ29udGV4dCA9IFZhcmlhbnQoKSkgeworICAgIHJldHVybiBwcm9jZXNzKHByb3QsIHByb3QsIGNvbm5lY3Rpb25Db250ZXh0KTsKKyAgfQorfQorCisvKioKKyAqIEhhbmRsZXMgZXZlbnRzIGZyb20gYSBwcm9jZXNzb3IuCisgKi8KK2ludGVyZmFjZSBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgY2FsbGluZyBvdGhlciBjYWxsYmFjayBtZXRob2RzLgorICAgKgorICAgKiBFeHBlY3RlZCB0byByZXR1cm4gc29tZSBzb3J0IG9mIMK7Y2FsbCBjb250ZXh0wqssIHdoaWNoIGlzIHBhc3NlZCB0byBhbGwKKyAgICogb3RoZXIgY2FsbGJhY2tzIGZvciB0aGF0IGZ1bmN0aW9uIGludm9jYXRpb24uCisgICAqLworICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoc3RyaW5nIG1ldGhvZE5hbWUsIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQpOworCisgIC8qKgorICAgKiBDYWxsZWQgd2hlbiBoYW5kbGluZyB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRleHQgaGFzIGJlZW4KKyAgICogZmluaXNoZWQg4oCTIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gY2xlYW4gdXAgd29yay4KKyAgICovCisgIHZvaWQgZGVsZXRlQ29udGV4dChWYXJpYW50IGNhbGxDb250ZXh0LCBzdHJpbmcgbWV0aG9kTmFtZSk7CisKKyAgLyoqCisgICAqIENhbGxlZCBiZWZvcmUgcmVhZGluZyBhcmd1bWVudHMuCisgICAqLworICB2b2lkIHByZVJlYWQoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUpOworCisgIC8qKgorICAgKiBDYWxsZWQgYmV0d2VlbiByZWFkaW5nIGFyZ3VtZW50cyBhbmQgY2FsbGluZyB0aGUgaGFuZGxlci4KKyAgICovCisgIHZvaWQgcG9zdFJlYWQoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUpOworCisgIC8qKgorICAgKiBDYWxsZWQgYmV0d2VlbiBjYWxsaW5nIHRoZSBoYW5kbGVyIGFuZCB3cml0aW5nIHRoZSByZXNwb25zZS4KKyAgICovCisgIHZvaWQgcHJlV3JpdGUoVmFyaWFudCBjYWxsQ29udGV4dCwgc3RyaW5nIG1ldGhvZE5hbWUpOworCisgIC8qKgorICAgKiBDYWxsZWQgYWZ0ZXIgd3JpdGluZyB0aGUgcmVzcG9uc2UuCisgICAqLworICB2b2lkIHBvc3RXcml0ZShWYXJpYW50IGNhbGxDb250ZXh0LCBzdHJpbmcgbWV0aG9kTmFtZSk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGhhbmRsaW5nIGEgb25lLXdheSBmdW5jdGlvbiBjYWxsIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAqLworICB2b2lkIG9uZXdheUNvbXBsZXRlKFZhcmlhbnQgY2FsbENvbnRleHQsIHN0cmluZyBtZXRob2ROYW1lKTsKKworICAvKioKKyAgICogQ2FsbGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbi4KKyAgICovCisgIHZvaWQgaGFuZGxlckVycm9yKFZhcmlhbnQgY2FsbENvbnRleHQsIHN0cmluZyBtZXRob2ROYW1lLCBFeGNlcHRpb24gZSk7Cit9CisKK3N0cnVjdCBUQ29ubmVjdGlvbkluZm8geworICAvLy8gVGhlIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzLgorICBUUHJvdG9jb2wgaW5wdXQ7CisgIFRQcm90b2NvbCBvdXRwdXQ7IC8vLyBEaXR0by4KKworICAvLy8gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIHRoZSBjb25uZWN0aW9uCisgIC8vLyBUaGlzIGlzIHRoZSB0cmFuc3BvcnQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgVFNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKSwKKyAgLy8vIGFuZCBpdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHRyYW5zcG9ydCBwb2ludGVkIHRvIGJ5IHRoZSBpbnB1dCBhbmQKKyAgLy8vIG91dHB1dCBwcm90b2NvbHMuCisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworfQorCitpbnRlcmZhY2UgVFByb2Nlc3NvckZhY3RvcnkgeworICAvKioKKyAgICogR2V0IHRoZSBUUHJvY2Vzc29yIHRvIHVzZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24uCisgICAqCisgICAqIFRoaXMgbWV0aG9kIGlzIGFsd2F5cyBpbnZva2VkIGluIHRoZSBzYW1lIHRocmVhZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcworICAgKiBhY2NlcHRlZCBvbiwgd2hpY2ggaXMgYWx3YXlzIHRoZSBzYW1lIHRocmVhZCBmb3IgYWxsIGN1cnJlbnQgc2VydmVyCisgICAqIGltcGxlbWVudGF0aW9ucy4KKyAgICovCisgIFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKHJlZiBjb25zdChUQ29ubmVjdGlvbkluZm8pIGNvbm5JbmZvKTsKK30KKworLyoqCisgKiBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSB3aGljaCBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBpbnN0YW5jZS4KKyAqLworY2xhc3MgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkgOiBUUHJvY2Vzc29yRmFjdG9yeSB7CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcHJvY2Vzc29yID0gVGhlIHByb2Nlc3NvciBvYmplY3QgdG8gcmV0dXJuIGZyb20gZ2V0UHJvY2Vzc29yKCkuCisgICAqLworICB0aGlzKFRQcm9jZXNzb3IgcHJvY2Vzc29yKSB7CisgICAgcHJvY2Vzc29yXyA9IHByb2Nlc3NvcjsKKyAgfQorCisgIG92ZXJyaWRlIFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKHJlZiBjb25zdChUQ29ubmVjdGlvbkluZm8pIGNvbm5JbmZvKSB7CisgICAgcmV0dXJuIHByb2Nlc3Nvcl87CisgIH0KKworcHJpdmF0ZToKKyAgVFByb2Nlc3NvciBwcm9jZXNzb3JfOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2IxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLmJhc2U7CisKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IHNlcnZlcnMuCisgKgorICogQnkgc2V0dGluZyB0aGUgZXZlbnRIYW5kbGVyIHByb3BlcnR5IHRvIGEgVFNlcnZlckV2ZW50SGFuZGxlcgorICogaW1wbGVtZW50YXRpb24sIGN1c3RvbSBjb2RlIGNhbiBiZSBpbnRlZ3JhdGVkIGludG8gdGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUsCisgKiB3aGljaCBjYW4gYmUgdXNlZCBlLmcuIGZvciBnYXRoZXJpbmcgc3RhdGlzdGljcy4KKyAqLworY2xhc3MgVFNlcnZlciB7CisgIC8qKgorICAgKiBTdGFydHMgc2VydmluZy4KKyAgICoKKyAgICogQmxvY2tzIHVudGlsIHRoZSBzZXJ2ZXIgZmluaXNoZXMsIGkuZS4gYSBzZXJpb3VzIHByb2JsZW0gb2NjdXJyZWQgb3IgdGhlCisgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIHRyaWdnZXJlZC4KKyAgICoKKyAgICogU2VydmVyIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IGNhbmNlbGxhdGlvbiBpbiBhIGJlc3QtCisgICAqIGVmZm9ydCB3YXkg4oCTIHVzdWFsbHksIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBpbW1lZGlhdGVseSBzdG9wIGFjY2VwdGluZworICAgKiBjb25uZWN0aW9ucyBhbmQgcmV0dXJuIGFmdGVyIGFsbCBjdXJyZW50bHkgYWN0aXZlIGNsaWVudHMgaGF2ZSBiZWVuCisgICAqIHByb2Nlc3NlZCwgYnV0IHRoaXMgbWlnaHQgbm90IGJlIHRoZSBjYXNlIGZvciBldmVyeSBjb25jZWl2YWJsZQorICAgKiBpbXBsZW1lbnRhdGlvbi4KKyAgICovCisgIGFic3RyYWN0IHZvaWQgc2VydmUoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKTsKKworICAvLy8gVGhlIHNlcnZlciBldmVudCBoYW5kbGVyIHRvIG5vdGlmeS4gTnVsbCBieSBkZWZhdWx0LgorICBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcjsKKworcHJvdGVjdGVkOgorICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgICAgaW1wb3J0IHRocmlmdC5iYXNlOworICAgIGVuZm9yY2UoaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgbmV3IFRFeGNlcHRpb24oIklucHV0IHRyYW5zcG9ydCBmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwuIikpOworICAgIGVuZm9yY2Uob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG5ldyBURXhjZXB0aW9uKCJPdXRwdXQgdHJhbnNwb3J0IGZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbC4iKSk7CisgICAgZW5mb3JjZShpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIG5ldyBURXhjZXB0aW9uKCJJbnB1dCBwcm90b2NvbCBmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwuIikpOworICAgIGVuZm9yY2Uob3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgbmV3IFRFeGNlcHRpb24oIk91dHB1dCBwcm90b2NvbCBmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwuIikpOworCisgICAgcHJvY2Vzc29yRmFjdG9yeV8gPSBwcm9jZXNzb3JGYWN0b3J5OworICAgIHNlcnZlclRyYW5zcG9ydF8gPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgfQorCisgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnlfOworICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydF87CisgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworCitwdWJsaWM6CisKKyAgQHByb3BlcnR5IFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KCkKKyAgeworICAgIHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfOworICB9CisKKyAgQHByb3BlcnR5IFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87CisgIH0KK30KKworLyoqCisgKiBIYW5kbGVzIGV2ZW50cyBmcm9tIGEgVFNlcnZlciBjb3JlLgorICovCitpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlciB7CisgIC8qKgorICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzIGFjY2VwdGluZyBjb25uZWN0aW9ucy4KKyAgICovCisgIHZvaWQgcHJlU2VydmUoKTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIHByb2Nlc3NpbmcgaXMgYWJvdXQgdG8gYmVnaW4uCisgICAqLworICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gcmVxdWVzdCBoYW5kbGluZyBmb3IgYSBjbGllbnQgaGFzIGJlZW4gZmluaXNoZWQg4oCTIGNhbiBiZSB1c2VkCisgICAqIHRvIHBlcmZvcm0gY2xlYW4gdXAgd29yay4KKyAgICovCisgIHZvaWQgZGVsZXRlQ29udGV4dChWYXJpYW50IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIHRoZSBwcm9jZXNzb3IgZm9yIGEgY2xpZW50IGNhbGwgaXMgYWJvdXQgdG8gYmUgaW52b2tlZC4KKyAgICovCisgIHZvaWQgcHJlUHJvY2VzcyhWYXJpYW50IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjBjMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kCkBAIC0wLDAgKzEsMTM5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEEgbm9uLWJsb2NraW5nIHNlcnZlciBpbXBsZW1lbnRhdGlvbiB0aGF0IG9wZXJhdGVzIGEgc2V0IG9mIEkvTyB0aHJlYWRzIChieQorICogZGVmYXVsdCBvbmx5IG9uZSkgYW5kIGVpdGhlciBkb2VzIHByb2Nlc3Npbmcgwrtpbi1saW5lwqsgb3Igb2ZmLWxvYWRzIGl0IHRvIGEKKyAqIHRhc2sgcG9vbC4KKyAqCisgKiBJdCAqcmVxdWlyZXMqIFRGcmFtZWRUcmFuc3BvcnQgdG8gYmUgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUsIGFzIGl0IGV4cGVjdHMKKyAqIGEgNCBieXRlIGxlbmd0aCBpbmRpY2F0b3IgYW5kIHdyaXRlcyBvdXQgcmVzcG9uc2VzIHVzaW5nIHRoZSBzYW1lIGZyYW1pbmcuCisgKgorICogQmVjYXVzZSBJL08gaXMgZG9uZSBhc3luY2hyb25vdXMvZXZlbnQgYmFzZWQsIHVuZm9ydHVuYXRlbHkKKyAqIFRTZXJ2ZXJUcmFuc3BvcnQgY2FuJ3QgYmUgdXNlZC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBDKysgb25lLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgcmVxdWVzdAorICogdGltZW91dHMgYW5kIHRoZSBkcmFpbiB0YXNrIHF1ZXVlIG92ZXJsb2FkIGhhbmRsaW5nIHN0cmF0ZWd5IG5vdCBiZWluZworICogaW1wbGVtZW50ZWQgeWV0LgorICovCisvLyBUaGlzIHJlYWxseSBzaG91bGQgdXNlIGEgRCBub24tYmxvY2tpbmcgSS9PIGxpYnJhcnksIG9uY2Ugb25lIGJlY29tZXMKKy8vIGF2YWlsYWJsZS4KK21vZHVsZSB0aHJpZnQuc2VydmVyLm5vbmJsb2NraW5nOworCitpbXBvcnQgY29yZS5hdG9taWMgOiBhdG9taWNMb2FkLCBhdG9taWNTdG9yZSwgYXRvbWljT3A7CitpbXBvcnQgY29yZS5leGNlcHRpb24gOiBvbk91dE9mTWVtb3J5RXJyb3I7CitpbXBvcnQgY29yZS5tZW1vcnkgOiBHQzsKK2ltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CitpbXBvcnQgY29yZS5zdGRjLnN0ZGxpYiA6IGZyZWUsIHJlYWxsb2M7CitpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb24sIGR1cjsKK2ltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZCwgVGhyZWFkR3JvdXA7CitpbXBvcnQgZGVpbW9zLmV2ZW50Mi5ldmVudDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IGVtcGxhY2UsIHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbSA6IFRhc2tQb29sLCB0YXNrOworaW1wb3J0IHN0ZC5zb2NrZXQgOiBTb2NrZXQsIHNvY2tldFBhaXIsIFNvY2tldEFjY2VwdEV4Y2VwdGlvbiwKKyAgU29ja2V0RXhjZXB0aW9uLCBUY3BTb2NrZXQ7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5lbmRpYW47CitpbXBvcnQgdGhyaWZ0LmludGVybmFsLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwudHJhaXRzOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnJhbmdlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBQb3NzaWJsZSBhY3Rpb25zIHRha2VuIG9uIG5ldyBpbmNvbWluZyBjb25uZWN0aW9ucyB3aGVuIHRoZSBzZXJ2ZXIgaXMKKyAqIG92ZXJsb2FkZWQuCisgKi8KK2VudW0gVE92ZXJsb2FkQWN0aW9uIHsKKyAgLy8vIERvIG5vdCB0YWtlIGFueSBzcGVjaWFsIGFjdGlvbnMgd2hpbGUgdGhlIHNlcnZlciBpcyBvdmVybG9hZGVkLCBqdXN0CisgIC8vLyBjb250aW51ZSBhY2NlcHRpbmcgY29ubmVjdGlvbnMuCisgIE5PTkUsCisKKyAgLy8vIEltbWVkaWF0ZWx5IGRyb3AgbmV3IGNvbm5lY3Rpb25zIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGFjY2VwdGVkIGlmIHRoZQorICAvLy8gc2VydmVyIGlzIG92ZXJsb2FkZWQuCisgIENMT1NFX09OX0FDQ0VQVAorfQorCisvLy8KK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlciA6IFRTZXJ2ZXIgeworICAvLy8KKyAgdGhpcyhUUHJvY2Vzc29yIHByb2Nlc3NvciwgdXNob3J0IHBvcnQsIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIHRhc2tQb29sKTsKKyAgfQorCisgIC8vLworICB0aGlzKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksIHVzaG9ydCBwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHBvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGFza1Bvb2wpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgdXNob3J0IHBvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgcG9ydCwKKyAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIHRhc2tQb29sKTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgdXNob3J0IHBvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgbnVsbCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgcG9ydF8gPSBwb3J0OworCisgICAgdGhpcy50YXNrUG9vbCA9IHRhc2tQb29sOworCisgICAgY29ubmVjdGlvbk11dGV4XyA9IG5ldyBNdXRleDsKKworICAgIGNvbm5lY3Rpb25TdGFja0xpbWl0ID0gREVGQVVMVF9DT05ORUNUSU9OX1NUQUNLX0xJTUlUOworICAgIG1heEFjdGl2ZVByb2Nlc3NvcnMgPSBERUZBVUxUX01BWF9BQ1RJVkVfUFJPQ0VTU09SUzsKKyAgICBtYXhDb25uZWN0aW9ucyA9IERFRkFVTFRfTUFYX0NPTk5FQ1RJT05TOworICAgIG92ZXJsb2FkSHlzdGVyZXNpcyA9IERFRkFVTFRfT1ZFUkxPQURfSFlTVEVSRVNJUzsKKyAgICBvdmVybG9hZEFjdGlvbiA9IERFRkFVTFRfT1ZFUkxPQURfQUNUSU9OOworICAgIHdyaXRlQnVmZmVyRGVmYXVsdFNpemUgPSBERUZBVUxUX1dSSVRFX0JVRkZFUl9ERUZBVUxUX1NJWkU7CisgICAgaWRsZVJlYWRCdWZmZXJMaW1pdCA9IERFRkFVTFRfSURMRV9SRUFEX0JVRkZFUl9MSU1JVDsKKyAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdCA9IERFRkFVTFRfSURMRV9XUklURV9CVUZGRVJfTElNSVQ7CisgICAgcmVzaXplQnVmZmVyRXZlcnlOID0gREVGQVVMVF9SRVNJWkVfQlVGRkVSX0VWRVJZX047CisgICAgbWF4RnJhbWVTaXplID0gREVGQVVMVF9NQVhfRlJBTUVfU0laRTsKKyAgICBudW1JT1RocmVhZHNfID0gREVGQVVMVF9OVU1fSU9fVEhSRUFEUzsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgc2VydmUoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7CisgICAgaWYgKGNhbmNlbGxhdGlvbiAmJiBjYW5jZWxsYXRpb24udHJpZ2dlcmVkKSByZXR1cm47CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBsaXN0ZW5pbmcgc29ja2V0LgorICAgIC8vIFRPRE86IFNPX0tFRVBBTElWRSwgVENQX0xPV19NSU5fUlRPLCBldGMuCisgICAgbGlzdGVuU29ja2V0XyA9IG1ha2VTb2NrZXRBbmRMaXN0ZW4ocG9ydF8sIFRTZXJ2ZXJTb2NrZXQuQUNDRVBUX0JBQ0tMT0csCisgICAgICBCSU5EX1JFVFJZX0xJTUlULCBCSU5EX1JFVFJZX0RFTEFZLCAwLCAwLCBpcHY2T25seV8pOworICAgIGxpc3RlblNvY2tldF8uYmxvY2tpbmcgPSBmYWxzZTsKKworICAgIGxvZ0luZm8oIlVzaW5nICVzIEkvTyB0aHJlYWQocykuIiwgbnVtSU9UaHJlYWRzXyk7CisgICAgaWYgKHRhc2tQb29sXykgeworICAgICAgbG9nSW5mbygiVXNpbmcgdGFzayBwb29sIHdpdGggc2l6ZTogJXMuIiwgbnVtSU9UaHJlYWRzXywgdGFza1Bvb2xfLnNpemUpOworICAgIH0KKworICAgIGFzc2VydChudW1JT1RocmVhZHNfID4gMCk7CisgICAgYXNzZXJ0KGlvTG9vcHNfLmVtcHR5KTsKKyAgICBmb3JlYWNoIChpZDsgMCAuLiBudW1JT1RocmVhZHNfKSB7CisgICAgICAvLyBUaGUgSU8gbG9vcCBvbiB0aGUgZmlyc3QgSU8gdGhyZWFkICh0aGlzIHRocmVhZCwgaS5lLiB0aGUgb25lIHNlcnZlKCkKKyAgICAgIC8vIGlzIGNhbGxlZCBmcm9tKSBhbHNvIGFjY2VwdHMgbmV3IGNvbm5lY3Rpb25zLgorICAgICAgYXV0byBsaXN0ZW5Tb2NrZXQgPSAoaWQgPT0gMCA/IGxpc3RlblNvY2tldF8gOiBudWxsKTsKKyAgICAgIGlvTG9vcHNfIH49IG5ldyBJT0xvb3AodGhpcywgbGlzdGVuU29ja2V0KTsKKyAgICB9CisKKyAgICBpZiAoY2FuY2VsbGF0aW9uKSB7CisgICAgICBjYW5jZWxsYXRpb24udHJpZ2dlcmluZy5hZGRDYWxsYmFjayh7CisgICAgICAgIGZvcmVhY2ggKGksIGxvb3A7IGlvTG9vcHNfKSBsb29wLnN0b3AoKTsKKworICAgICAgICAvLyBTdG9wIGFjY2VwdGluZyBuZXcgY29ubmVjdGlvbnMgcmlnaHQgYXdheS4KKyAgICAgICAgbGlzdGVuU29ja2V0Xy5jbG9zZSgpOworICAgICAgICBsaXN0ZW5Tb2NrZXRfID0gbnVsbDsKKyAgICAgIH0pOworICAgIH0KKworICAgIC8vIFN0YXJ0IHRoZSBJTyBoZWxwZXIgdGhyZWFkcyBmb3IgYWxsIGJ1dCB0aGUgZmlyc3QgbG9vcCwgd2hpY2ggd2Ugd2lsbCBydW4KKyAgICAvLyBvdXJzZWx2ZXMuIE5vdGUgdGhhdCB0aGUgdGhyZWFkcyBydW4gZm9yZXZlciwgb25seSB0ZXJtaW5hdGluZyBpZiBzdG9wKCkKKyAgICAvLyBpcyBjYWxsZWQuCisgICAgYXV0byB0aHJlYWRzID0gbmV3IFRocmVhZEdyb3VwKCk7CisgICAgZm9yZWFjaCAobG9vcDsgaW9Mb29wc19bMSAuLiAkXSkgeworICAgICAgYXV0byB0ID0gbmV3IFRocmVhZCgmbG9vcC5ydW4pOworICAgICAgdGhyZWFkcy5hZGQodCk7CisgICAgICB0LnN0YXJ0KCk7CisgICAgfQorCisgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisKKyAgICAvLyBSdW4gdGhlIHByaW1hcnkgKGxpc3RlbmVyKSBJTyB0aHJlYWQgbG9vcCBpbiBvdXIgbWFpbiB0aHJlYWQ7IHRoaXMgd2lsbAorICAgIC8vIGJsb2NrIHVudGlsIHRoZSBzZXJ2ZXIgaXMgc2h1dHRpbmcgZG93bi4KKyAgICBpb0xvb3BzX1swXS5ydW4oKTsKKworICAgIC8vIEVuc3VyZSBhbGwgdGhyZWFkcyBhcmUgZmluaXNoZWQgYmVmb3JlIGxlYXZpbmcgc2VydmUoKS4KKyAgICB0aHJlYWRzLmpvaW5BbGwoKTsKKworICAgIGlvTG9vcHNfID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBjb25uZWN0aW9ucywgaS5lLiBvcGVuIHNvY2tldHMuCisgICAqLworICBzaXplX3QgbnVtQ29ubmVjdGlvbnMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBudW1Db25uZWN0aW9uc187CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb24gb2JqZWN0cyBhbGxvY2F0ZWQsIGJ1dCBub3QgaW4gdXNlLgorICAgKi8KKyAgc2l6ZV90IG51bUlkbGVDb25uZWN0aW9ucygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGNvbm5lY3Rpb25TdGFja18ubGVuZ3RoOworICB9CisKKyAgLyoqCisgICAqIFJldHVybiBjb3VudCBvZiBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICAgKgorICAgKiBUaGlzIGlzIGRlZmluZWQgYXMgYSBjb25uZWN0aW9uIHdoZXJlIGFsbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCBhbmQgdGhlCisgICAqIHByb2Nlc3NvciB3YXMgaW52b2tlZCBidXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkLgorICAgKi8KKyAgc2l6ZV90IG51bUFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBudW1BY3RpdmVQcm9jZXNzb3JzXzsKKyAgfQorCisgIC8vLyBOdW1iZXIgb2YgYmluZCgpIHJldHJpZXMuCisgIGVudW0gQklORF9SRVRSWV9MSU1JVCA9IDA7CisKKyAgLy8vIER1cmF0aW9uIGJldHdlZW4gYmluZCgpIHJldHJpZXMuCisgIGVudW0gQklORF9SRVRSWV9ERUxBWSA9IGR1ciEiaG5zZWNzIigwKTsKKworICAvLy8gV2hldGhlciB0byBsaXN0ZW4gb24gSVB2NiBvbmx5LCBpZiBJUHY2IHN1cHBvcnQgaXMgZGV0ZWN0ZWQKKyAgLy8gKGRlZmF1bHQ6IGZhbHNlKS4KKyAgdm9pZCBpcHY2T25seShib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGlwdjZPbmx5XyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSB0YXNrIHBvb2wgdG8gdXNlIGZvciBwcm9jZXNzaW5nIHJlcXVlc3RzLiBJZiBudWxsLCBubyBhZGRpdGlvbmFsCisgICAqIHRocmVhZHMgYXJlIHVzZWQgYW5kIHJlcXVlc3QgYXJlIHByb2Nlc3NlZCDCu2lubGluZcKrLgorICAgKgorICAgKiBDYW4gc2FmZWx5IGJlIHNldCBldmVuIHdoZW4gdGhlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcuCisgICAqLworICBUYXNrUG9vbCB0YXNrUG9vbCgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRhc2tQb29sXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIHRhc2tQb29sKFRhc2tQb29sIHBvb2wpIEBwcm9wZXJ0eSB7CisgICAgdGFza1Bvb2xfID0gcG9vbDsKKyAgfQorCisgIC8qKgorICAgKiBIeXN0ZXJlc2lzIGZvciBvdmVybG9hZCBzdGF0ZS4KKyAgICoKKyAgICogVGhpcyBpcyB0aGUgZnJhY3Rpb24gb2YgdGhlIG92ZXJsb2FkIHZhbHVlIHRoYXQgbmVlZHMgdG8gYmUgcmVhY2hlZAorICAgKiBiZWZvcmUgdGhlIG92ZXJsb2FkIHN0YXRlIGlzIGNsZWFyZWQuIEl0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLAorICAgKiBwcmFjdGljYWwgY2hvaWNlcyBwcm9iYWJseSBsaWUgYmV0d2VlbiAwLjUgYW5kIDAuOS4KKyAgICovCisgIGRvdWJsZSBvdmVybG9hZEh5c3RlcmVzaXMoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBvdmVybG9hZEh5c3RlcmVzaXNfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgb3ZlcmxvYWRIeXN0ZXJlc2lzKGRvdWJsZSB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBlbmZvcmNlKDAgPCB2YWx1ZSAmJiB2YWx1ZSA8PSAxLAorICAgICAgIkludmFsaWQgdmFsdWUgZm9yIG92ZXJsb2FkIGh5c3RlcmVzaXM6ICIgfiB0byFzdHJpbmcodmFsdWUpKTsKKyAgICBvdmVybG9hZEh5c3RlcmVzaXNfID0gdmFsdWU7CisgIH0KKworICAvLy8gRGl0dG8KKyAgZW51bSBERUZBVUxUX09WRVJMT0FEX0hZU1RFUkVTSVMgPSAwLjg7CisKKyAgLyoqCisgICAqIFRoZSBhY3Rpb24gd2hpY2ggd2lsbCBiZSB0YWtlbiBvbiBvdmVybG9hZC4KKyAgICovCisgIFRPdmVybG9hZEFjdGlvbiBvdmVybG9hZEFjdGlvbjsKKworICAvLy8gRGl0dG8KKyAgZW51bSBERUZBVUxUX09WRVJMT0FEX0FDVElPTiA9IFRPdmVybG9hZEFjdGlvbi5OT05FOworCisgIC8qKgorICAgKiBUaGUgd3JpdGUgYnVmZmVyIGlzIGluaXRpYWxpemVkIChhbmQgd2hlbiBpZGxlV3JpdGVCdWZmZXJMaW1pdF8gaXMgY2hlY2tlZAorICAgKiBhbmQgZm91bmQgdG8gYmUgZXhjZWVkZWQsIHJlaW5pdGlhbGl6ZWQpIHRvIHRoaXMgc2l6ZS4KKyAgICovCisgIHNpemVfdCB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplOworCisgIC8vLyBEaXR0bworICBlbnVtIHNpemVfdCBERUZBVUxUX1dSSVRFX0JVRkZFUl9ERUZBVUxUX1NJWkUgPSAxMDI0OworCisgIC8qKgorICAgKiBNYXggcmVhZCBidWZmZXIgc2l6ZSBmb3IgYW4gaWRsZSBDb25uZWN0aW9uLiBXaGVuIHdlIHBsYWNlIGFuIGlkbGUKKyAgICogQ29ubmVjdGlvbiBpbnRvIGNvbm5lY3Rpb25TdGFja18gb3Igb24gZXZlcnkgcmVzaXplQnVmZmVyRXZlcnlOXyBjYWxscywKKyAgICogd2Ugd2lsbCBmcmVlIHRoZSBidWZmZXIgKHN1Y2ggdGhhdCBpdCB3aWxsIGJlIHJlaW5pdGlhbGl6ZWQgYnkgdGhlIG5leHQKKyAgICogcmVjZWl2ZWQgZnJhbWUpIGlmIGl0IGhhcyBleGNlZWRlZCB0aGlzIGxpbWl0LiAwIGRpc2FibGVzIHRoaXMgY2hlY2suCisgICAqLworICBzaXplX3QgaWRsZVJlYWRCdWZmZXJMaW1pdDsKKworICAvLy8gRGl0dG8KKyAgZW51bSBzaXplX3QgREVGQVVMVF9JRExFX1JFQURfQlVGRkVSX0xJTUlUID0gMTAyNDsKKworICAvKioKKyAgICogTWF4IHdyaXRlIGJ1ZmZlciBzaXplIGZvciBhbiBpZGxlIGNvbm5lY3Rpb24uICBXaGVuIHdlIHBsYWNlIGFuIGlkbGUKKyAgICogQ29ubmVjdGlvbiBpbnRvIGNvbm5lY3Rpb25TdGFja18gb3Igb24gZXZlcnkgcmVzaXplQnVmZmVyRXZlcnlOXyBjYWxscywKKyAgICogd2UgZW5zdXJlIHRoYXQgaXRzIHdyaXRlIGJ1ZmZlciBpcyA8PSB0byB0aGlzIHNpemU7IG90aGVyd2lzZSB3ZQorICAgKiByZXBsYWNlIGl0IHdpdGggYSBuZXcgb25lIG9mIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfIGJ5dGVzIHRvIGVuc3VyZSB0aGF0CisgICAqIGlkbGUgY29ubmVjdGlvbnMgZG9uJ3QgaG9nIG1lbW9yeS4gMCBkaXNhYmxlcyB0aGlzIGNoZWNrLgorICAgKi8KKyAgc2l6ZV90IGlkbGVXcml0ZUJ1ZmZlckxpbWl0OworCisgIC8vLyBEaXR0bworICBlbnVtIHNpemVfdCBERUZBVUxUX0lETEVfV1JJVEVfQlVGRkVSX0xJTUlUID0gMTAyNDsKKworICAvKioKKyAgICogRXZlcnkgTiBjYWxscyB3ZSBjaGVjayB0aGUgYnVmZmVyIHNpemUgbGltaXRzIG9uIGEgY29ubmVjdGVkIENvbm5lY3Rpb24uCisgICAqIDAgZGlzYWJsZXMgKGkuZS4gdGhlIGNoZWNrcyBhcmUgb25seSBkb25lIHdoZW4gYSBjb25uZWN0aW9uIGNsb3NlcykuCisgICAqLworICB1aW50IHJlc2l6ZUJ1ZmZlckV2ZXJ5TjsKKworICAvLy8gRGl0dG8KKyAgZW51bSB1aW50IERFRkFVTFRfUkVTSVpFX0JVRkZFUl9FVkVSWV9OID0gNTEyOworCisgIC8vLyBMaW1pdCBmb3IgaG93IG1hbnkgQ29ubmVjdGlvbiBvYmplY3RzIHRvIGNhY2hlLgorICBzaXplX3QgY29ubmVjdGlvblN0YWNrTGltaXQ7CisKKyAgLy8vIERpdHRvCisgIGVudW0gc2l6ZV90IERFRkFVTFRfQ09OTkVDVElPTl9TVEFDS19MSU1JVCA9IDEwMjQ7CisKKyAgLy8vIExpbWl0IGZvciBudW1iZXIgb2Ygb3BlbiBjb25uZWN0aW9ucyBiZWZvcmUgc2VydmVyIGdvZXMgaW50byBvdmVybG9hZAorICAvLy8gc3RhdGUuCisgIHNpemVfdCBtYXhDb25uZWN0aW9uczsKKworICAvLy8gRGl0dG8KKyAgZW51bSBzaXplX3QgREVGQVVMVF9NQVhfQ09OTkVDVElPTlMgPSBpbnQubWF4OworCisgIC8vLyBMaW1pdCBmb3IgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHByb2Nlc3Npbmcgb3Igd2FpdGluZyB0byBwcm9jZXNzCisgIHNpemVfdCBtYXhBY3RpdmVQcm9jZXNzb3JzOworCisgIC8vLyBEaXR0bworICBlbnVtIHNpemVfdCBERUZBVUxUX01BWF9BQ1RJVkVfUFJPQ0VTU09SUyA9IGludC5tYXg7CisKKyAgLy8vIE1heGltdW0gZnJhbWUgc2l6ZSwgaW4gYnl0ZXMuCisgIC8vLworICAvLy8gSWYgYSBjbGllbnQgdHJpZXMgdG8gc2VuZCBhIG1lc3NhZ2UgbGFyZ2VyIHRoYW4gdGhpcyBsaW1pdCwgaXRzCisgIC8vLyBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkLiBUaGlzIGhlbHBzIHRvIGF2b2lkIGFsbG9jYXRpbmcgaHVnZSBidWZmZXJzCisgIC8vLyBvbiBib2dvdXMgaW5wdXQuCisgIHVpbnQgbWF4RnJhbWVTaXplOworCisgIC8vLyBEaXR0bworICBlbnVtIHVpbnQgREVGQVVMVF9NQVhfRlJBTUVfU0laRSA9IDI1NiAqIDEwMjQgKiAxMDI0OworCisKKyAgc2l6ZV90IG51bUlPVGhyZWFkcygpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG51bUlPVGhyZWFkc187CisgIH0KKworICB2b2lkIG51bUlPVGhyZWFkcyhzaXplX3QgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgZW5mb3JjZSh2YWx1ZSA+PSAxLCBuZXcgVEV4Y2VwdGlvbigiTXVzdCB1c2UgYXQgbGVhc3Qgb25lIEkvTyB0aHJlYWQuIikpOworICAgIG51bUlPVGhyZWFkc18gPSB2YWx1ZTsKKyAgfQorCisgIGVudW0gREVGQVVMVF9OVU1fSU9fVEhSRUFEUyA9IDE7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBDIGNhbGxiYWNrIHdyYXBwZXIgYXJvdW5kIGFjY2VwdENvbm5lY3Rpb25zKCkuIEV4cGVjdHMgdGhlIGN1c3RvbSBhcmd1bWVudAorICAgKiB0byBiZSB0aGUgdGhpcyBwb2ludGVyIG9mIHRoZSBhc3NvY2lhdGVkIHNlcnZlciBpbnN0YW5jZS4KKyAgICovCisgIGV4dGVybihDKSBzdGF0aWMgdm9pZCBhY2NlcHRDb25uZWN0aW9uc0NhbGxiYWNrKGludCBmZCwgc2hvcnQgd2hpY2gsCisgICAgdm9pZCogc2VydmVyVGhpcworICApIHsKKyAgICAoY2FzdChUTm9uYmxvY2tpbmdTZXJ2ZXIpc2VydmVyVGhpcykuYWNjZXB0Q29ubmVjdGlvbnMoZmQsIHdoaWNoKTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgbGliZXZlbnQgKElPIGxvb3AgMC9zZXJ2ZSgpIHRocmVhZCBvbmx5KSB3aGVuIHNvbWV0aGluZworICAgKiBoYXBwZW5lZCBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldC4KKyAgICovCisgIHZvaWQgYWNjZXB0Q29ubmVjdGlvbnMoaW50IGZkLCBzaG9ydCBldmVudEZsYWdzKSB7CisgICAgaWYgKGF0b21pY0xvYWQoaW9Mb29wc19bMF0uc2h1dHRpbmdEb3duXykpIHJldHVybjsKKworICAgIGFzc2VydCghIWxpc3RlblNvY2tldF8sCisgICAgICAiU2VydmVyIHNob3VsZCBiZSBzaHV0dGluZyBkb3duIGlmIGxpc3RlbiBzb2NrZXQgaXMgbnVsbC4iKTsKKyAgICBhc3NlcnQoZmQgPT0gbGlzdGVuU29ja2V0Xy5oYW5kbGUpOworICAgIGFzc2VydChldmVudEZsYWdzICYgRVZfUkVBRCk7CisKKyAgICAvLyBBY2NlcHQgYXMgbWFueSBuZXcgY2xpZW50cyBhcyBwb3NzaWJsZSwgZXZlbiB0aG91Z2ggbGliZXZlbnQgc2lnbmFsZWQKKyAgICAvLyBvbmx5IG9uZS4gVGhpcyBoZWxwcyB0aGUgbnVtYmVyIG9mIGNhbGxzIGludG8gbGliZXZlbnQgc3BhY2UuCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIC8vIEl0IGlzIGxhbWUgdG8gdXNlIGV4Y2VwdGlvbnMgZm9yIHJlZ3VsYXIgY29udHJvbCBmbG93IChmYWlsaW5nIGlzCisgICAgICAvLyBleGNlcHRlZCBkdWUgdG8gbm9uLWJsb2NraW5nIG1vZGUgb2Ygb3BlcmF0aW9uKSwgYnV0IHRoYXQncyB0aGUKKyAgICAgIC8vIGludGVyZmFjZSBzdGQuc29ja2V0IG9mZmVyc+KApgorICAgICAgU29ja2V0IGNsaWVudFNvY2tldDsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudFNvY2tldCA9IGxpc3RlblNvY2tldF8uYWNjZXB0KCk7CisgICAgICB9IGNhdGNoIChTb2NrZXRBY2NlcHRFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAoZS5lcnJvckNvZGUgIT0gV09VTERfQkxPQ0tfRVJSTk8pIHsKKyAgICAgICAgICBsb2dFcnJvcigiRXJyb3IgYWNjZXB0aW5nIGNvbm5lY3Rpb246ICVzIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgaXMgb3ZlcmxvYWRlZCwgdGhpcyBpcyB0aGUgcG9pbnQgdG8gdGFrZSB0aGUgc3BlY2lmaWVkCisgICAgICAvLyBhY3Rpb24uCisgICAgICBpZiAob3ZlcmxvYWRBY3Rpb24gIT0gVE92ZXJsb2FkQWN0aW9uLk5PTkUgJiYgY2hlY2tPdmVybG9hZGVkKCkpIHsKKyAgICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8rKzsKKyAgICAgICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXysrOworICAgICAgICBpZiAob3ZlcmxvYWRBY3Rpb24gPT0gVE92ZXJsb2FkQWN0aW9uLkNMT1NFX09OX0FDQ0VQVCkgeworICAgICAgICAgIGNsaWVudFNvY2tldC5jbG9zZSgpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBjbGllbnRTb2NrZXQuYmxvY2tpbmcgPSBmYWxzZTsKKyAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0Vycm9yKCJDb3VsZG4ndCBzZXQgY2xpZW50IHNvY2tldCB0byBub24tYmxvY2tpbmcgbW9kZTogJXMiLCBlKTsKKyAgICAgICAgY2xpZW50U29ja2V0LmNsb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gQ3JlYXRlIGEgbmV3IENvbm5lY3Rpb24gZm9yIHRoaXMgY2xpZW50IHNvY2tldC4KKyAgICAgIENvbm5lY3Rpb24gY29ubiA9IHZvaWQ7CisgICAgICBJT0xvb3AgbG9vcCA9IHZvaWQ7CisgICAgICBib29sIHRoaXNUaHJlYWQgPSB2b2lkOworICAgICAgc3luY2hyb25pemVkIChjb25uZWN0aW9uTXV0ZXhfKSB7CisgICAgICAgIC8vIEFzc2lnbiBhbiBJL08gbG9vcCB0byB0aGUgY29ubmVjdGlvbiAocm91bmQtcm9iaW4pLgorICAgICAgICBhc3NlcnQobmV4dElPTG9vcF8gPj0gMCk7CisgICAgICAgIGFzc2VydChuZXh0SU9Mb29wXyA8IGlvTG9vcHNfLmxlbmd0aCk7CisgICAgICAgIGF1dG8gc2VsZWN0ZWRUaHJlYWRJZHggPSBuZXh0SU9Mb29wXzsKKyAgICAgICAgbmV4dElPTG9vcF8gPSAobmV4dElPTG9vcF8gKyAxKSAlIGlvTG9vcHNfLmxlbmd0aDsKKworICAgICAgICBsb29wID0gaW9Mb29wc19bc2VsZWN0ZWRUaHJlYWRJZHhdOworICAgICAgICB0aGlzVGhyZWFkID0gKHNlbGVjdGVkVGhyZWFkSWR4ID09IDApOworCisgICAgICAgIC8vIENoZWNrIHRoZSBjb25uZWN0aW9uIHN0YWNrIHRvIHNlZSBpZiB3ZSBjYW4gcmUtdXNlIGFuIGV4aXN0aW5nIG9uZS4KKyAgICAgICAgaWYgKGNvbm5lY3Rpb25TdGFja18uZW1wdHkpIHsKKyAgICAgICAgICArK251bUNvbm5lY3Rpb25zXzsKKyAgICAgICAgICBjb25uID0gbmV3IENvbm5lY3Rpb24oY2xpZW50U29ja2V0LCBsb29wKTsKKworICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29ubmVjdGlvbiBkb2VzIG5vdCBnZXQgY29sbGVjdGVkIHdoaWxlIGl0IGlzIGFjdGl2ZSwKKyAgICAgICAgICAvLyBpLmUuIGhvb2tlZCB1cCB3aXRoIGxpYmV2ZW50LgorICAgICAgICAgIEdDLmFkZFJvb3QoY2FzdCh2b2lkKiljb25uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25uID0gY29ubmVjdGlvblN0YWNrX1skIC0gMV07CisgICAgICAgICAgY29ubmVjdGlvblN0YWNrXyA9IGNvbm5lY3Rpb25TdGFja19bMCAuLiAkIC0gMV07CisgICAgICAgICAgY29ubmVjdGlvblN0YWNrXy5hc3N1bWVTYWZlQXBwZW5kKCk7CisgICAgICAgICAgY29ubi5pbml0KGNsaWVudFNvY2tldCwgbG9vcCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbG9vcC5hZGRDb25uZWN0aW9uKCk7CisKKyAgICAgIC8vIEVpdGhlciBub3RpZnkgdGhlIGlvVGhyZWFkIHRoYXQgaXMgYXNzaWduZWQgdGhpcyBjb25uZWN0aW9uIHRvCisgICAgICAvLyBzdGFydCBwcm9jZXNzaW5nLCBvciBpZiBpdCBpcyB1cywgd2UnbGwganVzdCBhc2sgdGhpcworICAgICAgLy8gY29ubmVjdGlvbiB0byBkbyBpdHMgaW5pdGlhbCBzdGF0ZSBjaGFuZ2UgaGVyZS4KKyAgICAgIC8vCisgICAgICAvLyAoV2UgbmVlZCB0byBhdm9pZCB3cml0aW5nIHRvIG91ciBvd24gbm90aWZpY2F0aW9uIHBpcGUsIHRvCisgICAgICAvLyBhdm9pZCBwb3NzaWJsZSBkZWFkbG9ja3MgaWYgdGhlIHBpcGUgaXMgZnVsbC4pCisgICAgICBpZiAodGhpc1RocmVhZCkgeworICAgICAgICBjb25uLnRyYW5zaXRpb24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvb3Aubm90aWZ5Q29tcGxldGVkKGNvbm4pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyBJbmNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICB2b2lkIGluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7CisgICAgYXRvbWljT3AhIis9IihudW1BY3RpdmVQcm9jZXNzb3JzXywgMSk7CisgIH0KKworICAvLy8gRGVjcmVtZW50IHRoZSBjb3VudCBvZiBjb25uZWN0aW9ucyBjdXJyZW50bHkgcHJvY2Vzc2luZy4KKyAgdm9pZCBkZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCkgeworICAgIGFzc2VydChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IDApOworICAgIGF0b21pY09wISItPSIobnVtQWN0aXZlUHJvY2Vzc29yc18sIDEpOworICB9CisKKyAgLyoqCisgICAqIERldGVybWluZXMgaWYgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgb3ZlcmxvYWRlZC4KKyAgICoKKyAgICogSWYgdGhlIG51bWJlciBvZiBvcGVuIGNvbm5lY3Rpb25zIG9yIMK7cHJvY2Vzc2luZ8KrIGNvbm5lY3Rpb25zIGlzIG92ZXIgdGhlCisgICAqIHJlc3BlY3RpdmUgbGltaXQsIHRoZSBzZXJ2ZXIgd2lsbCBlbnRlciBvdmVybG9hZCBoYW5kbGluZyBtb2RlIGFuZCBhCisgICAqIHdhcm5pbmcgd2lsbCBiZSBsb2dnZWQuIElmIGJlbG93IHZhbHVlcyBhcmUgYmVsb3cgdGhlIGh5c3RlcmVzaXMgY3VydmUsCisgICAqIHRoaXMgd2lsbCBjYXVzZSB0aGUgc2VydmVyIHRvIGV4aXQgaXQgYWdhaW4uCisgICAqCisgICAqIFJldHVybnM6IFdoZXRoZXIgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgb3ZlcmxvYWRlZC4KKyAgICovCisgIGJvb2wgY2hlY2tPdmVybG9hZGVkKCkgeworICAgIGF1dG8gYWN0aXZlQ29ubmVjdGlvbnMgPSBudW1Db25uZWN0aW9uc18gLSBjb25uZWN0aW9uU3RhY2tfLmxlbmd0aDsKKyAgICBpZiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPiBtYXhBY3RpdmVQcm9jZXNzb3JzIHx8CisgICAgICAgIGFjdGl2ZUNvbm5lY3Rpb25zID4gbWF4Q29ubmVjdGlvbnMpIHsKKyAgICAgIGlmICghb3ZlcmxvYWRlZF8pIHsKKyAgICAgICAgbG9nSW5mbygiRW50ZXJpbmcgb3ZlcmxvYWRlZCBzdGF0ZS4iKTsKKyAgICAgICAgb3ZlcmxvYWRlZF8gPSB0cnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAob3ZlcmxvYWRlZF8gJiYKKyAgICAgICAgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzKSAmJgorICAgICAgICAoYWN0aXZlQ29ubmVjdGlvbnMgPD0gb3ZlcmxvYWRIeXN0ZXJlc2lzXyAqIG1heENvbm5lY3Rpb25zKSkKKyAgICAgIHsKKyAgICAgICAgbG9nSW5mbygiRXhpdGluZyBvdmVybG9hZGVkIHN0YXRlLCAlcyBjb25uZWN0aW9uKHMpIGRyb3BwZWQgKCUgdG90YWwpLiIsCisgICAgICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8sIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8pOworICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXyA9IDA7CisgICAgICAgIG92ZXJsb2FkZWRfID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG92ZXJsb2FkZWRfOworICB9CisKKyAgLyoqCisgICAqIE1hcmtzIGEgY29ubmVjdGlvbiBhcyBpbmFjdGl2ZSBhbmQgZWl0aGVyIHB1dHMgaXQgYmFjayBpbnRvIHRoZQorICAgKiBjb25uZWN0aW9uIHBvb2wgb3IgbGVhdmVzIGl0IGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCisgICAqLworICB2b2lkIGRpc3Bvc2VDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgIHN5bmNocm9uaXplZCAoY29ubmVjdGlvbk11dGV4XykgeworICAgICAgaWYgKCFjb25uZWN0aW9uU3RhY2tMaW1pdCB8fAorICAgICAgICAoY29ubmVjdGlvblN0YWNrXy5sZW5ndGggPCBjb25uZWN0aW9uU3RhY2tMaW1pdCkpCisgICAgICB7CisgICAgICAgIGNvbm5lY3Rpb24uY2hlY2tJZGxlQnVmZmVyTGltaXQoaWRsZVJlYWRCdWZmZXJMaW1pdCwKKyAgICAgICAgICBpZGxlV3JpdGVCdWZmZXJMaW1pdCk7CisgICAgICAgIGNvbm5lY3Rpb25TdGFja18gfj0gY29ubmVjdGlvbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChudW1Db25uZWN0aW9uc18gPiAwKTsKKyAgICAgICAgLS1udW1Db25uZWN0aW9uc187CisKKyAgICAgICAgLy8gTGVhdmUgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IGZvciBjb2xsZWN0aW9uIG5vdy4KKyAgICAgICAgR0MucmVtb3ZlUm9vdChjYXN0KHZvaWQqKWNvbm5lY3Rpb24pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyBTb2NrZXQgdXNlZCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIGFuZCBhY2NlcHRpbmcgdGhlbS4KKyAgU29ja2V0IGxpc3RlblNvY2tldF87CisKKyAgLy8vIFBvcnQgdG8gbGlzdGVuIG9uLgorICB1c2hvcnQgcG9ydF87CisKKyAgLy8vIFdoZXRoZXIgdG8gbGlzdGVuIG9uIElQdjYgb25seS4KKyAgYm9vbCBpcHY2T25seV87CisKKyAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2YgY29ubmVjdGlvbnMgZXhpc3RpbmcsIGJvdGggYWN0aXZlIGFuZCBpZGxlLgorICBzaXplX3QgbnVtQ29ubmVjdGlvbnNfOworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgd2FpdGluZyBmb3IgdGhlIHByb2Nlc3NvcgorICAvLy8gdG8gcmV0dXJuLgorICBzaGFyZWQgc2l6ZV90IG51bUFjdGl2ZVByb2Nlc3NvcnNfOworCisgIC8vLyBIeXN0ZXJlc2lzIGZvciBsZWF2aW5nIG92ZXJsb2FkIHN0YXRlLgorICBkb3VibGUgb3ZlcmxvYWRIeXN0ZXJlc2lzXzsKKworICAvLy8gV2hldGhlciB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBvdmVybG9hZGVkLgorICBib29sIG92ZXJsb2FkZWRfOworCisgIC8vLyBOdW1iZXIgb2YgY29ubmVjdGlvbnMgZHJvcHBlZCBzaW5jZSB0aGUgc2VydmVyIGVudGVyZWQgdGhlIGN1cnJlbnQKKyAgLy8vIG92ZXJsb2FkZWQgc3RhdGUuCisgIHVpbnQgbkNvbm5lY3Rpb25zRHJvcHBlZF87CisKKyAgLy8vIE51bWJlciBvZiBjb25uZWN0aW9ucyBkcm9wcGVkIGR1ZSB0byBvdmVybG9hZCBzaW5jZSB0aGUgc2VydmVyIHN0YXJ0ZWQuCisgIHVsb25nIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF87CisKKyAgLy8vIFRoZSB0YXNrIHBvb2wgdXNlZCBmb3IgcHJvY2Vzc2luZyByZXF1ZXN0cy4KKyAgVGFza1Bvb2wgdGFza1Bvb2xfOworCisgIC8vLyBOdW1iZXIgb2YgSU8gdGhyZWFkcyB0aGlzIHNlcnZlciB3aWxsIHVzZSAoPj0gMSkuCisgIHNpemVfdCBudW1JT1RocmVhZHNfOworCisgIC8vLyBUaGUgSU9Mb29wcyBhbW9uZyB3aGljaCBzb2NrZXQgaGFuZGxpbmcgd29yayBpcyBkaXN0cmlidXRlZC4KKyAgSU9Mb29wW10gaW9Mb29wc187CisKKyAgLy8vIFRoZSBpbmRleCBvZiB0aGUgbG9vcCBpbiBpb0xvb3BzXyB3aGljaCB3aWxsIGhhbmRsZSB0aGUgbmV4dCBhY2NlcHRlZAorICAvLy8gY29ubmVjdGlvbi4KKyAgc2l6ZV90IG5leHRJT0xvb3BfOworCisgIC8vLyBBbGwgdGhlIGNvbm5lY3Rpb24gb2JqZWN0cyB3aGljaCBoYXZlIGJlZW4gY3JlYXRlZCBidXQgYXJlIG5vdCBjdXJyZW50bHkKKyAgLy8vIGluIHVzZS4gV2hlbiBhIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCBpdCBpdCBwbGFjZWQgaGVyZSB0byBlbmFibGUgb2JqZWN0CisgIC8vLyAocmVzcC4gYnVmZmVyKSByZXVzZS4KKyAgQ29ubmVjdGlvbltdIGNvbm5lY3Rpb25TdGFja187CisKKyAgLy8vIFRoaXMgbXV0ZXggcHJvdGVjdHMgdGhlIGNvbm5lY3Rpb24gc3RhY2suCisgIE11dGV4IGNvbm5lY3Rpb25NdXRleF87Cit9CisKK3ByaXZhdGUgeworICAvKgorICAgKiBFbmNhcHN1bGF0ZXMgYSBsaWJldmVudCBldmVudCBsb29wLgorICAgKgorICAgKiBUaGUgZGVzaWduIGlzIGEgYml0IG9mIGEgbWVzcywgc2luY2UgdGhlIGZpcnN0IGxvb3AgaXMgYWN0dWFsbHkgcnVuIG9uIHRoZQorICAgKiBzZXJ2ZXIgdGhyZWFkIGl0c2VsZiBhbmQgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IGluc3RhbmNlIGZvcgorICAgKiB3aGljaCBsaXN0ZW5Tb2NrZXRfIGlzIG5vdCBudWxsLgorICAgKi8KKyAgZmluYWwgY2xhc3MgSU9Mb29wIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGFuZCBzZXQgdXAgdGhlIGV2ZW50IGJhc2UuCisgICAgICoKKyAgICAgKiBJZiBsaXN0ZW5Tb2NrZXQgaXMgbm90IG51bGwsIHRoZSB0aHJlYWQgd2lsbCBhbHNvIGFjY2VwdCBuZXcKKyAgICAgKiBjb25uZWN0aW9ucyBpdHNlbGYuCisgICAgICovCisgICAgdGhpcyhUTm9uYmxvY2tpbmdTZXJ2ZXIgc2VydmVyLCBTb2NrZXQgbGlzdGVuU29ja2V0KSB7CisgICAgICBzZXJ2ZXJfID0gc2VydmVyOworICAgICAgbGlzdGVuU29ja2V0XyA9IGxpc3RlblNvY2tldDsKKyAgICAgIGluaXRNdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyB0aGUgZXZlbnQgbG9vcDsgb25seSByZXR1cm5zIGFmdGVyIGEgY2FsbCB0byBzdG9wKCkuCisgICAgICovCisgICAgdm9pZCBydW4oKSB7CisgICAgICBhc3NlcnQoIWF0b21pY0xvYWQoaW5pdGlhbGl6ZWRfKSwgIklPTG9vcCBhbHJlYWR5IHJ1bm5pbmc/ISIpOworCisgICAgICBzeW5jaHJvbml6ZWQgKGluaXRNdXRleF8pIHsKKyAgICAgICAgaWYgKGF0b21pY0xvYWQoc2h1dHRpbmdEb3duXykpIHJldHVybjsKKyAgICAgICAgYXRvbWljU3RvcmUoaW5pdGlhbGl6ZWRfLCB0cnVlKTsKKworICAgICAgICBhc3NlcnQoIWV2ZW50QmFzZV8pOworICAgICAgICBldmVudEJhc2VfID0gZXZlbnRfYmFzZV9uZXcoKTsKKworICAgICAgICBpZiAobGlzdGVuU29ja2V0XykgeworICAgICAgICAgIC8vIExvZyB0aGUgbGliZXZlbnQgdmVyc2lvbiBhbmQgYmFja2VuZC4KKyAgICAgICAgICBsb2dJbmZvKCJsaWJldmVudCB2ZXJzaW9uICVzLCB1c2luZyBtZXRob2QgJXMuIiwKKyAgICAgICAgICAgIHRvIXN0cmluZyhldmVudF9nZXRfdmVyc2lvbigpKSwgdG8hc3RyaW5nKGV2ZW50X2Jhc2VfZ2V0X21ldGhvZChldmVudEJhc2VfKSkpOworCisgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50IGZvciB0aGUgbGlzdGVuaW5nIHNvY2tldC4KKyAgICAgICAgICBsaXN0ZW5FdmVudF8gPSBldmVudF9uZXcoZXZlbnRCYXNlXywgbGlzdGVuU29ja2V0Xy5oYW5kbGUsCisgICAgICAgICAgICBFVl9SRUFEIHwgRVZfUEVSU0lTVCB8IEVWX0VULAorICAgICAgICAgICAgYXNzdW1lTm90aHJvdygmVE5vbmJsb2NraW5nU2VydmVyLmFjY2VwdENvbm5lY3Rpb25zQ2FsbGJhY2spLAorICAgICAgICAgICAgY2FzdCh2b2lkKilzZXJ2ZXJfKTsKKyAgICAgICAgICBpZiAoZXZlbnRfYWRkKGxpc3RlbkV2ZW50XywgbnVsbCkgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJldmVudF9hZGQgZm9yIHRoZSBsaXN0ZW5pbmcgc29ja2V0IGV2ZW50IGZhaWxlZC4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdXRvIHBhaXIgPSBzb2NrZXRQYWlyKCk7CisgICAgICAgIGZvcmVhY2ggKHM7IHBhaXIpIHMuYmxvY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgY29tcGxldGlvblNlbmRTb2NrZXRfID0gcGFpclswXTsKKyAgICAgICAgY29tcGxldGlvblJlY2VpdmVTb2NrZXRfID0gcGFpclsxXTsKKworICAgICAgICAvLyBSZWdpc3RlciBhbiBldmVudCBmb3IgdGhlIHRhc2sgY29tcGxldGlvbiBub3RpZmljYXRpb24gc29ja2V0LgorICAgICAgICBjb21wbGV0aW9uRXZlbnRfID0gZXZlbnRfbmV3KGV2ZW50QmFzZV8sIGNvbXBsZXRpb25SZWNlaXZlU29ja2V0Xy5oYW5kbGUsCisgICAgICAgICAgRVZfUkVBRCB8IEVWX1BFUlNJU1QgfCBFVl9FVCwgYXNzdW1lTm90aHJvdygmY29tcGxldGVkQ2FsbGJhY2spLAorICAgICAgICAgIGNhc3Qodm9pZCopdGhpcyk7CisKKyAgICAgICAgaWYgKGV2ZW50X2FkZChjb21wbGV0aW9uRXZlbnRfLCBudWxsKSA9PSAtMSkgeworICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJldmVudF9hZGQgZm9yIHRoZSBub3RpZmljYXRpb24gc29ja2V0IGZhaWxlZC4iKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCByZXR1cm5zIG9ubHkgYWZ0ZXIgc3RvcCgpLgorICAgICAgZXZlbnRfYmFzZV9kaXNwYXRjaChldmVudEJhc2VfKTsKKworICAgICAgaWYgKGxpc3RlbkV2ZW50XykgeworICAgICAgICBldmVudF9mcmVlKGxpc3RlbkV2ZW50Xyk7CisgICAgICAgIGxpc3RlbkV2ZW50XyA9IG51bGw7CisgICAgICB9CisKKyAgICAgIGV2ZW50X2ZyZWUoY29tcGxldGlvbkV2ZW50Xyk7CisgICAgICBjb21wbGV0aW9uRXZlbnRfID0gbnVsbDsKKworICAgICAgY29tcGxldGlvblNlbmRTb2NrZXRfLmNsb3NlKCk7CisgICAgICBjb21wbGV0aW9uU2VuZFNvY2tldF8gPSBudWxsOworCisgICAgICBjb21wbGV0aW9uUmVjZWl2ZVNvY2tldF8uY2xvc2UoKTsKKyAgICAgIGNvbXBsZXRpb25SZWNlaXZlU29ja2V0XyA9IG51bGw7CisKKyAgICAgIGV2ZW50X2Jhc2VfZnJlZShldmVudEJhc2VfKTsKKyAgICAgIGV2ZW50QmFzZV8gPSBudWxsOworCisgICAgICBhdG9taWNTdG9yZShzaHV0dGluZ0Rvd25fLCBmYWxzZSk7CisKKyAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgY29ubmVjdGlvbiBoYW5kbGVkIGJ5IHRoaXMgbG9vcC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZENvbm5lY3Rpb24oKSB7CisgICAgICArK251bUFjdGl2ZUNvbm5lY3Rpb25zXzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwb3NlcyBhIGNvbm5lY3Rpb24gb2JqZWN0ICh0eXBpY2FsbHkgYWZ0ZXIgaXQgaGFzIGJlZW4gY2xvc2VkKS4KKyAgICAgKi8KKyAgICB2b2lkIGRpc3Bvc2VDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubikgeworICAgICAgc2VydmVyXy5kaXNwb3NlQ29ubmVjdGlvbihjb25uKTsKKyAgICAgIGFzc2VydChudW1BY3RpdmVDb25uZWN0aW9uc18gPiAwKTsKKyAgICAgIC0tbnVtQWN0aXZlQ29ubmVjdGlvbnNfOworICAgICAgaWYgKG51bUFjdGl2ZUNvbm5lY3Rpb25zXyA9PSAwKSB7CisgICAgICAgIGlmIChhdG9taWNMb2FkKHNodXR0aW5nRG93bl8pKSB7CisgICAgICAgICAgZXZlbnRfYmFzZV9sb29wYnJlYWsoZXZlbnRCYXNlXyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgZXZlbnQgbG9vcCB0aGF0IHRoZSBjdXJyZW50IHN0ZXAgKGluaXRpYWxpemF0aW9uLAorICAgICAqIHByb2Nlc3Npbmcgb2YgYSByZXF1ZXN0KSBvbiBhIGNlcnRhaW4gY29ubmVjdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlLCBidXQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tIHRoZQorICAgICAqIHRocmVhZCBydW5uaW5nIHRoZSBsb29wIGl0c2VsZi4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeUNvbXBsZXRlZChDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgIGFzc2VydCghIWNvbXBsZXRpb25TZW5kU29ja2V0Xyk7CisgICAgICBhdXRvIGJ5dGVzU2VudCA9IGNvbXBsZXRpb25TZW5kU29ja2V0Xy5zZW5kKGNhc3QodWJ5dGVbXSkoKCZjb25uKVswIC4uIDFdKSk7CisKKyAgICAgIGlmIChieXRlc1NlbnQgIT0gQ29ubmVjdGlvbi5zaXplb2YpIHsKKyAgICAgICAgbG9nRXJyb3IoIlNlbmRpbmcgY29tcGxldGlvbiBub3RpZmljYXRpb24gZmFpbGVkLCBjb25uZWN0aW9uIHdpbGwgIiB+CisgICAgICAgICAgIm5vdCBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkLiIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4aXRzIHRoZSBldmVudCBsb29wIGFmdGVyIGFsbCBjdXJyZW50bHkgYWN0aXZlIGNvbm5lY3Rpb25zIGhhdmUgYmVlbgorICAgICAqIGNsb3NlZC4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLXNhZmUuCisgICAgICovCisgICAgdm9pZCBzdG9wKCkgeworICAgICAgLy8gVGhlcmUgaXMgYSBidWcgaW4gZWl0aGVyIGxpYmV2ZW50IG9yIGl0cyBkb2N1bWVudGF0aW9uLCBoYXZpbmcgbm8KKyAgICAgIC8vIGV2ZW50cyByZWdpc3RlcmVkIGRvZXNuJ3QgYWN0dWFsbHkgdGVybWluYXRlIHRoZSBsb29wLCBiZWNhdXNlCisgICAgICAvLyBldmVudF9iYXNlX25ldygpIHJlZ2lzdGVycyBzb21lIGludGVybmFsIG9uZSBieSBjYWxsaW5nCisgICAgICAvLyBldnRocmVhZF9tYWtlX2Jhc2Vfbm90aWZpYWJsZSgpLgorICAgICAgLy8gRHVlIHRvIHRoaXMsIHdlIGNhbid0IHNpbXBseSByZW1vdmUgYWxsIGV2ZW50cyBhbmQgZXhwZWN0IHRoZSBldmVudAorICAgICAgLy8gbG9vcCB0byB0ZXJtaW5hdGUuIEluc3RlYWQsIHdlIHBpbmcgdGhlIGV2ZW50IGxvb3AgdXNpbmcgYSBudWxsCisgICAgICAvLyBjb21wbGV0aW9uIG1lc3NhZ2UuIFRoaXMgd2F5LCB3ZSBtYWtlIHN1cmUgdG8gd2FrZSB1cCB0aGUgbGliZXZlbnQKKyAgICAgIC8vIHRocmVhZCBpZiBpdCBub3QgY3VycmVudGx5IHByb2Nlc3NpbmcgYW55IGNvbm5lY3Rpb25zLiBJdCB3aWxsIGJyZWFrCisgICAgICAvLyBvdXQgb2YgdGhlIGxvb3AgaW4gZGlzcG9zZUNvbm5lY3Rpb24oKSBhZnRlciB0aGUgbGFzdCBhY3RpdmUKKyAgICAgIC8vIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLgorICAgICAgc3luY2hyb25pemVkIChpbml0TXV0ZXhfKSB7CisgICAgICAgIGF0b21pY1N0b3JlKHNodXR0aW5nRG93bl8sIHRydWUpOworICAgICAgICBpZiAoYXRvbWljTG9hZChpbml0aWFsaXplZF8pKSBub3RpZnlDb21wbGV0ZWQobnVsbCk7CisgICAgICB9CisgICAgfQorCisgIHByaXZhdGU6CisgICAgLyoqCisgICAgICogQyBjYWxsYmFjayB0byBjYWxsIGNvbXBsZXRlZCgpIGZyb20gbGliZXZlbnQuCisgICAgICoKKyAgICAgKiBFeHBlY3RzIHRoZSBjdXN0b20gYXJndW1lbnQgdG8gYmUgdGhlIHRoaXMgcG9pbnRlciBvZiB0aGUgYXNzb2NpYXRlZAorICAgICAqIElPTG9vcCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBleHRlcm4oQykgc3RhdGljIHZvaWQgY29tcGxldGVkQ2FsbGJhY2soaW50IGZkLCBzaG9ydCB3aGF0LCB2b2lkKiBsb29wVGhpcykgeworICAgICAgYXNzZXJ0KHdoYXQgJiBFVl9SRUFEKTsKKyAgICAgIGF1dG8gbG9vcCA9IGNhc3QoSU9Mb29wKWxvb3BUaGlzOworICAgICAgYXNzZXJ0KGZkID09IGxvb3AuY29tcGxldGlvblJlY2VpdmVTb2NrZXRfLmhhbmRsZSk7CisgICAgICBsb29wLmNvbXBsZXRlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGZyb20gdGhlIGNvbXBsZXRpb24gcmVjZWl2ZSBzb2NrZXQgYW5kIGFwcHJvcHJpYXRlbHkgdHJhbnNpdGlvbnMKKyAgICAgKiB0aGUgY29ubmVjdGlvbnMgYW5kIHNodXRzIGRvd24gdGhlIGxvb3AgaWYgcmVxdWVzdGVkLgorICAgICAqLworICAgIHZvaWQgY29tcGxldGVkKCkgeworICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uOworICAgICAgcHRyZGlmZl90IGJ5dGVzUmVhZDsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGJ5dGVzUmVhZCA9IGNvbXBsZXRpb25SZWNlaXZlU29ja2V0Xy5yZWNlaXZlKAorICAgICAgICAgIGNhc3QodWJ5dGVbXSkoKCZjb25uZWN0aW9uKVswIC4uIDFdKSk7CisgICAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7CisgICAgICAgICAgYXV0byBlcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisKKyAgICAgICAgICBpZiAoZXJybm8gIT0gV09VTERfQkxPQ0tfRVJSTk8pIHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJSZWFkaW5nIGZyb20gY29tcGxldGlvbiBzb2NrZXQgZmFpbGVkLCBzb21lIGNvbm5lY3Rpb24gIiB+CisgICAgICAgICAgICAgICJ3aWxsIG5ldmVyIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWQ6ICVzIiwgc29ja2V0RXJybm9TdHJpbmcoZXJybm8pKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnl0ZXNSZWFkICE9IENvbm5lY3Rpb24uc2l6ZW9mKSBicmVhazsKKworICAgICAgICBpZiAoIWNvbm5lY3Rpb24pIHsKKyAgICAgICAgICBhc3NlcnQoYXRvbWljTG9hZChzaHV0dGluZ0Rvd25fKSk7CisgICAgICAgICAgaWYgKG51bUFjdGl2ZUNvbm5lY3Rpb25zXyA9PSAwKSB7CisgICAgICAgICAgICBldmVudF9iYXNlX2xvb3BicmVhayhldmVudEJhc2VfKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25uZWN0aW9uLnRyYW5zaXRpb24oKTsKKyAgICAgIH0KKworICAgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHsKKyAgICAgICAgbG9nRXJyb3IoIlVuZXhwZWN0ZWQgcGFydGlhbCByZWFkIGZyb20gY29tcGxldGlvbiBzb2NrZXQgIiB+CisgICAgICAgICAgIiglcyBieXRlcyBpbnN0ZWFkIG9mICVzKS4iLCBieXRlc1JlYWQsIENvbm5lY3Rpb24uc2l6ZW9mKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYXNzb2NpYXRlZCBzZXJ2ZXIKKyAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIgc2VydmVyXzsKKworICAgIC8vLyBUaGUgbWFuYWdlZCBsaXN0ZW5pbmcgc29ja2V0LCBpZiBhbnkuCisgICAgU29ja2V0IGxpc3RlblNvY2tldF87CisKKyAgICAvLy8gVGhlIGxpYmV2ZW50IGV2ZW50IGJhc2UgZm9yIHRoZSBsb29wLgorICAgIGV2ZW50X2Jhc2UqIGV2ZW50QmFzZV87CisKKyAgICAvLy8gVHJpZ2dlcmVkIG9uIGxpc3RlbiBzb2NrZXQgZXZlbnRzLgorICAgIGV2ZW50KiBsaXN0ZW5FdmVudF87CisKKyAgICAvLy8gVHJpZ2dlcmVkIG9uIGNvbXBsZXRpb24gcmVjZWl2ZSBzb2NrZXQgZXZlbnRzLgorICAgIGV2ZW50KiBjb21wbGV0aW9uRXZlbnRfOworCisgICAgLy8vIFNvY2tldCB1c2VkIHRvIHNlbmQgY29tcGxldGlvbiBub3RpZmljYXRpb24gbWVzc2FnZXMuIFBhaXJlZCB3aXRoCisgICAgLy8vIGNvbXBsZXRpb25SZWNlaXZlU29ja2V0Xy4KKyAgICBTb2NrZXQgY29tcGxldGlvblNlbmRTb2NrZXRfOworCisgICAgLy8vIFNvY2tldCB1c2VkIHRvIHNlbmQgY29tcGxldGlvbiBub3RpZmljYXRpb24gbWVzc2FnZXMuIFBhaXJlZCB3aXRoCisgICAgLy8vIGNvbXBsZXRpb25TZW5kU29ja2V0Xy4KKyAgICBTb2NrZXQgY29tcGxldGlvblJlY2VpdmVTb2NrZXRfOworCisgICAgLy8vIFdoZXRoZXIgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgc2h1dHRpbmcgZG93biAoaS5lLiB0aGUgY2FuY2VsbGF0aW9uIGhhcworICAgIC8vLyBiZWVuIHRyaWdnZXJlZCwgYnV0IG5vdCBhbGwgY2xpZW50IGNvbm5lY3Rpb25zIGhhdmUgYmVlbiBjbG9zZWQgeWV0KS4KKyAgICBzaGFyZWQgYm9vbCBzaHV0dGluZ0Rvd25fOworCisgICAgLy8vIFRoZSBudW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBjbGllbnQgY29ubmVjdGlvbnMuCisgICAgc2l6ZV90IG51bUFjdGl2ZUNvbm5lY3Rpb25zXzsKKworICAgIC8vLyBHdWFyZHMgbG9vcCBzdGFydHVwIHNvIHRoYXQgdGhlIGxvb3AgY2FuIGJlIHJlbGlhYmx5IHNodXQgZG93biBldmVuIGlmCisgICAgLy8vIGFub3RoZXIgdGhyZWFkIGhhcyBqdXN0IHN0YXJ0ZWQgdG8gZXhlY3V0ZSBydW4oKS4gTG9ja2VkIGR1cmluZworICAgIC8vLyBpbml0aWFsaXphdGlvbiBpbiBydW4oKS4gV2hlbiB1bmxvY2tlZCwgdGhlIGNvbXBsZXRpb24gbWVjaGFuaXNtIGlzCisgICAgLy8vIGV4cGVjdGVkIHRvIGJlIGZ1bGx5IHNldCB1cC4KKyAgICBNdXRleCBpbml0TXV0ZXhfOworICAgIHNoYXJlZCBib29sIGluaXRpYWxpemVkXzsgLy8vIERpdHRvCisgIH0KKworICAvKgorICAgKiBJL08gc3RhdGVzIGEgc29ja2V0IGNhbiBiZSBpbi4KKyAgICovCisgIGVudW0gU29ja2V0U3RhdGUgeworICAgIFJFQ1ZfRlJBTUVfU0laRSwgLy8vIFRoZSBmcmFtZSBzaXplIGlzIHJlY2VpdmVkLgorICAgIFJFQ1YsIC8vLyBUaGUgcGF5bG9hZCBpcyByZWNlaXZlZC4KKyAgICBTRU5EIC8vLyBUaGUgcmVzcG9uc2UgaXMgd3JpdHRlbiBiYWNrIG91dC4KKyAgfQorCisgIC8qCisgICAqIFN0YXRlcyBhIGNvbm5lY3Rpb24gY2FuIGJlIGluLgorICAgKi8KKyAgZW51bSBDb25uZWN0aW9uU3RhdGUgeworICAgIElOSVQsIC8vLyBUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGluaXRpYWxpemVkLgorICAgIFJFQURfRlJBTUVfU0laRSwgLy8vIFRoZSBmb3VyIGZyYW1lIHNpemUgYnl0ZXMgYXJlIGJlaW5nIHJlYWQuCisgICAgUkVBRF9SRVFVRVNULCAvLy8gVGhlIHJlcXVlc3QgcGF5bG9hZCBpdHNlbGYgaXMgYmVpbmcgcmVhZC4KKyAgICBXQUlUX1BST0NFU1NPUiwgLy8vIFRoZSBjb25uZWN0aW9uIHdhaXRzIGZvciB0aGUgcHJvY2Vzc29yIHRvIGZpbmlzaC4KKyAgICBTRU5EX1JFU1VMVCAvLy8gVGhlIHJlc3VsdCBpcyB3cml0dGVuIGJhY2sgb3V0LgorICB9CisKKyAgLyoKKyAgICogQSBjb25uZWN0aW9uIHRoYXQgaXMgaGFuZGxlZCB2aWEgbGliZXZlbnQuCisgICAqCisgICAqIERhdGEgcmVjZWl2ZWQgaXMgYnVmZmVyZWQgdW50aWwgdGhlIHJlcXVlc3QgaXMgY29tcGxldGUgKHJldHVybmluZyBiYWNrIHRvCisgICAqIGxpYmV2ZW50IGlmIG5vdCksIGF0IHdoaWNoIHBvaW50IHRoZSBwcm9jZXNzb3IgaXMgaW52b2tlZC4KKyAgICovCisgIGZpbmFsIGNsYXNzIENvbm5lY3Rpb24geworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBUbyByZXVzZSBhIGNvbm5lY3Rpb24gb2JqZWN0IGxhdGVyIG9uLCB0aGUgaW5pdCgpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkCisgICAgICogdG8gdGhlIHNhbWUgZWZmZWN0IG9uIHRoZSBpbnRlcm5hbCBzdGF0ZS4KKyAgICAgKi8KKyAgICB0aGlzKFNvY2tldCBzb2NrZXQsIElPTG9vcCBsb29wKSB7CisgICAgICAvLyBUaGUgaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnQgb2JqZWN0cyBhcmUgcmV1c2VkIGJldHdlZW4gY2xpZW50cworICAgICAgLy8gY29ubmVjdGlvbnMsIHNvIGluaXRpYWxpemUgdGhlbSBoZXJlIHJhdGhlciB0aGFuIGluIGluaXQoKS4KKyAgICAgIGlucHV0VHJhbnNwb3J0XyA9IG5ldyBUSW5wdXRSYW5nZVRyYW5zcG9ydCEodWJ5dGVbXSkoW10pOworICAgICAgb3V0cHV0VHJhbnNwb3J0XyA9IG5ldyBUTWVtb3J5QnVmZmVyKGxvb3Auc2VydmVyXy53cml0ZUJ1ZmZlckRlZmF1bHRTaXplKTsKKworICAgICAgaW5pdChzb2NrZXQsIGxvb3ApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogUGFyYW1zOgorICAgICAqICAgc29ja2V0ID0gVGhlIHNvY2tldCB0byB3b3JrIG9uLgorICAgICAqICAgZXZlbnRGbGFncyA9IEFueSBmbGFncyB0byBwYXNzIHRvIGxpYmV2ZW50LgorICAgICAqICAgcyA9IFRoZSBzZXJ2ZXIgdGhpcyBjb25uZWN0aW9uIGlzIHBhcnQgb2YuCisgICAgICovCisgICAgdm9pZCBpbml0KFNvY2tldCBzb2NrZXQsIElPTG9vcCBsb29wKSB7CisgICAgICAvLyBUT0RPOiBUaGlzIGFsbG9jYXRpb24gY291bGQgYmUgYXZvaWRlZC4KKyAgICAgIHNvY2tldF8gPSBuZXcgVFNvY2tldChzb2NrZXQpOworCisgICAgICBsb29wXyA9IGxvb3A7CisgICAgICBzZXJ2ZXJfID0gbG9vcF8uc2VydmVyXzsKKyAgICAgIGNvbm5TdGF0ZV8gPSBDb25uZWN0aW9uU3RhdGUuSU5JVDsKKyAgICAgIGV2ZW50RmxhZ3NfID0gMDsKKworICAgICAgcmVhZEJ1ZmZlclBvc18gPSAwOworICAgICAgcmVhZFdhbnRfID0gMDsKKworICAgICAgd3JpdGVCdWZmZXJfID0gbnVsbDsKKyAgICAgIHdyaXRlQnVmZmVyUG9zXyA9IDA7CisgICAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IDA7CisKKyAgICAgIHNvY2tldFN0YXRlXyA9IFNvY2tldFN0YXRlLlJFQ1ZfRlJBTUVfU0laRTsKKyAgICAgIGNhbGxzU2luY2VSZXNpemVfID0gMDsKKworICAgICAgZmFjdG9yeUlucHV0VHJhbnNwb3J0XyA9CisgICAgICAgIHNlcnZlcl8uaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOworICAgICAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8gPQorICAgICAgICBzZXJ2ZXJfLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KG91dHB1dFRyYW5zcG9ydF8pOworCisgICAgICBpbnB1dFByb3RvY29sXyA9CisgICAgICAgIHNlcnZlcl8uaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CisgICAgICBvdXRwdXRQcm90b2NvbF8gPQorICAgICAgICBzZXJ2ZXJfLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CisKKyAgICAgIGlmIChzZXJ2ZXJfLmV2ZW50SGFuZGxlcikgeworICAgICAgICBjb25uZWN0aW9uQ29udGV4dF8gPQorICAgICAgICAgIHNlcnZlcl8uZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CisgICAgICB9CisKKyAgICAgIGF1dG8gaW5mbyA9IFRDb25uZWN0aW9uSW5mbyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCBzb2NrZXRfKTsKKyAgICAgIHByb2Nlc3Nvcl8gPSBzZXJ2ZXJfLnByb2Nlc3NvckZhY3RvcnkuZ2V0UHJvY2Vzc29yKGluZm8pOworICAgIH0KKworICAgIH50aGlzKCkgeworICAgICAgZnJlZShyZWFkQnVmZmVyXyk7CisgICAgICBpZiAoZXZlbnRfKSB7CisgICAgICAgIGV2ZW50X2ZyZWUoZXZlbnRfKTsKKyAgICAgICAgZXZlbnRfID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBidWZmZXJzIGFnYWluc3QgdGhlIHNpemUgbGltaXRzIGFuZCBzaHJpbmsgdGhlbSBpZiBleGNlZWRlZC4KKyAgICAgKgorICAgICAqIFBhcmFtczoKKyAgICAgKiAgIHJlYWRMaW1pdCA9IFJlYWQgYnVmZmVyIHNpemUgbGltaXQgKGluIGJ5dGVzLCAwIHRvIGlnbm9yZSkuCisgICAgICogICB3cml0ZUxpbWl0ID0gV3JpdGUgYnVmZmVyIHNpemUgbGltaXQgKGluIGJ5dGVzLCAwIHRvIGlnbm9yZSkuCisgICAgICovCisgICAgdm9pZCBjaGVja0lkbGVCdWZmZXJMaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCkgeworICAgICAgaWYgKHJlYWRMaW1pdCA+IDAgJiYgcmVhZEJ1ZmZlclNpemVfID4gcmVhZExpbWl0KSB7CisgICAgICAgIGZyZWUocmVhZEJ1ZmZlcl8pOworICAgICAgICByZWFkQnVmZmVyXyA9IG51bGw7CisgICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CisgICAgICB9CisKKyAgICAgIGlmICh3cml0ZUxpbWl0ID4gMCAmJiBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA+IHdyaXRlTGltaXQpIHsKKyAgICAgICAgLy8ganVzdCBzdGFydCBvdmVyCisgICAgICAgIG91dHB1dFRyYW5zcG9ydF8ucmVzZXQoc2VydmVyXy53cml0ZUJ1ZmZlckRlZmF1bHRTaXplKTsKKyAgICAgICAgbGFyZ2VzdFdyaXRlQnVmZmVyU2l6ZV8gPSAwOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zaXRpb25zIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLgorICAgICAqCisgICAgICogVGhpcyBpcyBjYWxsZWQgZS5nLiB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHJlYWQgY29tcGxldGVseSBvciBhbGwKKyAgICAgKiB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuIGJhY2suCisgICAgICovCisgICAgdm9pZCB0cmFuc2l0aW9uKCkgeworICAgICAgYXNzZXJ0KCEhbG9vcF8pOworICAgICAgYXNzZXJ0KCEhc2VydmVyXyk7CisKKyAgICAgIC8vIFN3aXRjaCB1cG9uIHRoZSBzdGF0ZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gYW5kIG1vdmUgdG8gYSBuZXcgc3RhdGUKKyAgICAgIGZpbmFsIHN3aXRjaCAoY29ublN0YXRlXykgeworICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5SRUFEX1JFUVVFU1Q6CisgICAgICAgICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZyB0aGUgcmVxdWVzdCwgcGFja2FnZSB0aGUgcmVhZCBidWZmZXIgaW50byB0cmFuc3BvcnQKKyAgICAgICAgICAvLyBhbmQgZ2V0IGJhY2sgc29tZSBkYXRhIGZyb20gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uCisgICAgICAgICAgaW5wdXRUcmFuc3BvcnRfLnJlc2V0KHJlYWRCdWZmZXJfWzAgLi4gcmVhZEJ1ZmZlclBvc19dKTsKKyAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRfLnJlc2V0KCk7CisKKyAgICAgICAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KKyAgICAgICAgICAvLyB3cml0ZSB0aGUgZnJhbWUgc2l6ZSB0aGVyZSBsYXRlci4KKyAgICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgd2Ugd291bGRuJ3QgaGF2ZSB0byB3cml0ZSBhbnl0aGluZywganVzdAorICAgICAgICAgIC8vIGluY3JlbWVudCB0aGUgVE1lbW9yeUJ1ZmZlciB3cml0ZU9mZnNldF8uIFRoaXMgd291bGQgeWllbGQgYSB0aW55CisgICAgICAgICAgLy8gcGVyZm9ybWFuY2UgZ2Fpbi4KKyAgICAgICAgICB1Ynl0ZVs0XSBzcGFjZSA9IHZvaWQ7CisgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0Xy53cml0ZShzcGFjZSk7CisKKyAgICAgICAgICBzZXJ2ZXJfLmluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKworICAgICAgICAgIHRhc2tQb29sXyA9IHNlcnZlcl8udGFza1Bvb2w7CisgICAgICAgICAgaWYgKHRhc2tQb29sXykgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHRhc2sgYW5kIGFkZCBpdCB0byB0aGUgdGFzayBwb29sIHF1ZXVlLgorICAgICAgICAgICAgYXV0byBwcm9jZXNzaW5nVGFzayA9IHRhc2shcHJvY2Vzc1JlcXVlc3QodGhpcyk7CisgICAgICAgICAgICBjb25uU3RhdGVfID0gQ29ubmVjdGlvblN0YXRlLldBSVRfUFJPQ0VTU09SOworICAgICAgICAgICAgdGFza1Bvb2xfLnB1dChwcm9jZXNzaW5nVGFzayk7CisKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gcHJvY2VzcyBhbnkgbW9yZSBkYXRhIHdoaWxlIHRoZSB0YXNrIGlzIGFjdGl2ZS4KKyAgICAgICAgICAgIHVucmVnaXN0ZXJFdmVudCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEp1c3QgcHJvY2VzcyBpdCByaWdodCBub3cgaWYgdGhlcmUgaXMgbm8gdGFzayBwb29sIHNldC4KKyAgICAgICAgICBwcm9jZXNzUmVxdWVzdCh0aGlzKTsKKyAgICAgICAgICBnb3RvIGNhc2U7CisgICAgICAgIGNhc2UgQ29ubmVjdGlvblN0YXRlLldBSVRfUFJPQ0VTU09SOgorICAgICAgICAgIC8vIFdlIGhhdmUgbm93IGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QsIHNldCB0aGUgZnJhbWUgc2l6ZQorICAgICAgICAgIC8vIGZvciB0aGUgb3V0cHV0VHJhbnNwb3J0XyBjb250ZW50cyBhbmQgc2V0IGV2ZXJ5dGhpbmcgdXAgdG8gd3JpdGUKKyAgICAgICAgICAvLyBpdCBvdXQgdmlhIGxpYmV2ZW50LgorICAgICAgICAgIHNlcnZlcl8uZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworCisgICAgICAgICAgLy8gQWNxdWlyZSB0aGUgZGF0YSB3cml0dGVuIHRvIHRoZSB0cmFuc3BvcnQuCisgICAgICAgICAgLy8gS0xVREdFOiBUbyBhdm9pZCBjb3B5aW5nLCB3ZSBzaW1wbHkgY2FzdCB0aGUgY29uc3QgYXdheSBhbmQKKyAgICAgICAgICAvLyBtb2RpZnkgdGhlIGludGVybmFsIGJ1ZmZlciBvZiB0aGUgVE1lbW9yeUJ1ZmZlciDigJMgd29ya3Mgd2l0aCB0aGUKKyAgICAgICAgICAvLyBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBidXQgaXNuJ3QgZXhhY3RseSBiZWF1dGlmdWwuCisgICAgICAgICAgd3JpdGVCdWZmZXJfID0gY2FzdCh1Ynl0ZVtdKW91dHB1dFRyYW5zcG9ydF8uZ2V0Q29udGVudHMoKTsKKworICAgICAgICAgIGFzc2VydCh3cml0ZUJ1ZmZlcl8ubGVuZ3RoID49IDQsICJUaGUgd3JpdGUgYnVmZmVyIHNob3VsZCBoYXZlICIgfgorICAgICAgICAgICAgImxlYXN0IHRoZSBpbml0aWFsbHkgYWRkZWQgZHVtbXkgbGVuZ3RoIGJ5dGVzLiIpOworICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlcl8ubGVuZ3RoID09IDQpIHsKKyAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IHdhcyBvbmUtd2F5LCBubyByZXNwb25zZSB0byB3cml0ZS4KKyAgICAgICAgICAgIGdvdG8gY2FzZSBDb25uZWN0aW9uU3RhdGUuSU5JVDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBXcml0ZSB0aGUgZnJhbWUgc2l6ZSBpbnRvIHRoZSBmb3VyIGJ5dGVzIHJlc2VydmVkIGZvciBpdC4KKyAgICAgICAgICBhdXRvIHNpemUgPSBob3N0VG9OZXQoY2FzdCh1aW50KSh3cml0ZUJ1ZmZlcl8ubGVuZ3RoIC0gNCkpOworICAgICAgICAgIHdyaXRlQnVmZmVyX1swIC4uIDRdID0gY2FzdCh1Ynl0ZVtdKSgoJnNpemUpWzAgLi4gMV0pOworCisgICAgICAgICAgd3JpdGVCdWZmZXJQb3NfID0gMDsKKyAgICAgICAgICBzb2NrZXRTdGF0ZV8gPSBTb2NrZXRTdGF0ZS5TRU5EOworICAgICAgICAgIGNvbm5TdGF0ZV8gPSBDb25uZWN0aW9uU3RhdGUuU0VORF9SRVNVTFQ7CisgICAgICAgICAgcmVnaXN0ZXJFdmVudChFVl9XUklURSB8IEVWX1BFUlNJU1QpOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5TRU5EX1JFU1VMVDoKKyAgICAgICAgICAvLyBUaGUgcmVzdWx0IGhhcyBiZWVuIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LCB3ZSBkb24ndCBuZWVkIHRoZQorICAgICAgICAgIC8vIGJ1ZmZlcnMgYW55bW9yZS4KKyAgICAgICAgICBpZiAod3JpdGVCdWZmZXJfLmxlbmd0aCA+IGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfKSB7CisgICAgICAgICAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IHdyaXRlQnVmZmVyXy5sZW5ndGg7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNlcnZlcl8ucmVzaXplQnVmZmVyRXZlcnlOID4gMCAmJgorICAgICAgICAgICAgICArK2NhbGxzU2luY2VSZXNpemVfID49IHNlcnZlcl8ucmVzaXplQnVmZmVyRXZlcnlOCisgICAgICAgICAgKSB7CisgICAgICAgICAgICBjaGVja0lkbGVCdWZmZXJMaW1pdChzZXJ2ZXJfLmlkbGVSZWFkQnVmZmVyTGltaXQsCisgICAgICAgICAgICAgIHNlcnZlcl8uaWRsZVdyaXRlQnVmZmVyTGltaXQpOworICAgICAgICAgICAgY2FsbHNTaW5jZVJlc2l6ZV8gPSAwOworICAgICAgICAgIH0KKworICAgICAgICAgIGdvdG8gY2FzZTsKKyAgICAgICAgY2FzZSBDb25uZWN0aW9uU3RhdGUuSU5JVDoKKyAgICAgICAgICB3cml0ZUJ1ZmZlcl8gPSBudWxsOworICAgICAgICAgIHdyaXRlQnVmZmVyUG9zXyA9IDA7CisgICAgICAgICAgc29ja2V0U3RhdGVfID0gU29ja2V0U3RhdGUuUkVDVl9GUkFNRV9TSVpFOworICAgICAgICAgIGNvbm5TdGF0ZV8gPSBDb25uZWN0aW9uU3RhdGUuUkVBRF9GUkFNRV9TSVpFOworICAgICAgICAgIHJlYWRCdWZmZXJQb3NfID0gMDsKKyAgICAgICAgICByZWdpc3RlckV2ZW50KEVWX1JFQUQgfCBFVl9QRVJTSVNUKTsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBDb25uZWN0aW9uU3RhdGUuUkVBRF9GUkFNRV9TSVpFOgorICAgICAgICAgIC8vIFdlIGp1c3QgcmVhZCB0aGUgcmVxdWVzdCBsZW5ndGgsIHNldCB1cCB0aGUgYnVmZmVycyBmb3IgcmVhZGluZworICAgICAgICAgIC8vIHRoZSBwYXlsb2FkLgorICAgICAgICAgIGlmIChyZWFkV2FudF8gPiByZWFkQnVmZmVyU2l6ZV8pIHsKKyAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGJ1ZmZlciBpcyB0b28gc21hbGwsIGV4cG9uZW50aWFsbHkgZ3JvdyB0aGUgYnVmZmVyCisgICAgICAgICAgICAvLyB1bnRpbCBpdCBpcyBiaWcgZW5vdWdoLgorCisgICAgICAgICAgICBpZiAocmVhZEJ1ZmZlclNpemVfID09IDApIHsKKyAgICAgICAgICAgICAgcmVhZEJ1ZmZlclNpemVfID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXV0byBuZXdTaXplID0gcmVhZEJ1ZmZlclNpemVfOworICAgICAgICAgICAgd2hpbGUgKHJlYWRXYW50XyA+IG5ld1NpemUpIHsKKyAgICAgICAgICAgICAgbmV3U2l6ZSAqPSAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvIG5ld0J1ZmZlciA9IGNhc3QodWJ5dGUqKXJlYWxsb2MocmVhZEJ1ZmZlcl8sIG5ld1NpemUpOworICAgICAgICAgICAgaWYgKCFuZXdCdWZmZXIpIG9uT3V0T2ZNZW1vcnlFcnJvcigpOworCisgICAgICAgICAgICByZWFkQnVmZmVyXyA9IG5ld0J1ZmZlcjsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IG5ld1NpemU7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVhZEJ1ZmZlclBvc189IDA7CisKKyAgICAgICAgICBzb2NrZXRTdGF0ZV8gPSBTb2NrZXRTdGF0ZS5SRUNWOworICAgICAgICAgIGNvbm5TdGF0ZV8gPSBDb25uZWN0aW9uU3RhdGUuUkVBRF9SRVFVRVNUOworCisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIC8qKgorICAgICAqIEMgY2FsbGJhY2sgdG8gY2FsbCB3b3JrU29ja2V0KCkgZnJvbSBsaWJldmVudC4KKyAgICAgKgorICAgICAqIEV4cGVjdHMgdGhlIGN1c3RvbSBhcmd1bWVudCB0byBiZSB0aGUgdGhpcyBwb2ludGVyIG9mIHRoZSBhc3NvY2lhdGVkCisgICAgICogY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBleHRlcm4oQykgc3RhdGljIHZvaWQgd29ya1NvY2tldENhbGxiYWNrKGludCBmZCwgc2hvcnQgZmxhZ3MsIHZvaWQqIGNvbm5UaGlzKSB7CisgICAgICBhdXRvIGNvbm4gPSBjYXN0KENvbm5lY3Rpb24pY29ublRoaXM7CisgICAgICBhc3NlcnQoZmQgPT0gY29ubi5zb2NrZXRfLnNvY2tldEhhbmRsZSk7CisgICAgICBjb25uLndvcmtTb2NrZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IGxpYmV2ZW50IHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgb24gdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICB2b2lkIHdvcmtTb2NrZXQoKSB7CisgICAgICBmaW5hbCBzd2l0Y2ggKHNvY2tldFN0YXRlXykgeworICAgICAgICBjYXNlIFNvY2tldFN0YXRlLlJFQ1ZfRlJBTUVfU0laRToKKyAgICAgICAgICAvLyBJZiBzb21lIGJ5dGVzIGhhdmUgYWxyZWFkeSBiZWVuIHJlYWQsIHRoZXkgaGF2ZSBiZWVuIGtlcHQgaW4KKyAgICAgICAgICAvLyByZWFkV2FudF8uCisgICAgICAgICAgYXV0byBmcmFtZVNpemUgPSByZWFkV2FudF87CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKKyAgICAgICAgICAgIGF1dG8gYnl0ZXNSZWFkID0gc29ja2V0Xy5yZWFkKAorICAgICAgICAgICAgICAoY2FzdCh1Ynl0ZVtdKSgoJmZyYW1lU2l6ZSlbMCAuLiAxXSkpW3JlYWRCdWZmZXJQb3NfIC4uICRdKTsKKyAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPT0gMCkgeworICAgICAgICAgICAgICAvLyBDb3VsZG4ndCByZWFkIGFueXRoaW5nLCBidXQgd2UgaGF2ZSBiZWVuIG5vdGlmaWVkIOKAkyBjbGllbnQKKyAgICAgICAgICAgICAgLy8gaGFzIGRpc2Nvbm5lY3RlZC4KKyAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWFkQnVmZmVyUG9zXyArPSBieXRlc1JlYWQ7CisgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICAgICAgbG9nRXJyb3IoIkZhaWxlZCB0byByZWFkIGZyYW1lIHNpemUgZnJvbSBjbGllbnQgY29ubmVjdGlvbjogJXMiLCB0ZSk7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyZWFkQnVmZmVyUG9zXyA8IGZyYW1lU2l6ZS5zaXplb2YpIHsKKyAgICAgICAgICAgIC8vIEZyYW1lIHNpemUgbm90IGNvbXBsZXRlIHlldCwgc2F2ZSB0aGUgY3VycmVudCBidWZmZXIgaW4KKyAgICAgICAgICAgIC8vIHJlYWRXYW50XyBzbyB0aGF0IHRoZSByZW1haW5pbmcgYnl0ZXMgY2FuIGJlIHJlYWQgbGF0ZXIuCisgICAgICAgICAgICByZWFkV2FudF8gPSBmcmFtZVNpemU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgYXV0byBzaXplID0gbmV0VG9Ib3N0KGZyYW1lU2l6ZSk7CisgICAgICAgICAgaWYgKHNpemUgPiBzZXJ2ZXJfLm1heEZyYW1lU2l6ZSkgeworICAgICAgICAgICAgbG9nRXJyb3IoIkZyYW1lIHNpemUgdG9vIGxhcmdlICglcyA+ICVzKSwgY2xpZW50ICVzIG5vdCB1c2luZyAiIH4KKyAgICAgICAgICAgICAgIlRGcmFtZWRUcmFuc3BvcnQ/Iiwgc2l6ZSwgc2VydmVyXy5tYXhGcmFtZVNpemUsCisgICAgICAgICAgICAgIHNvY2tldF8uZ2V0UGVlckFkZHJlc3MoKS50b0hvc3ROYW1lU3RyaW5nKCkpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVhZFdhbnRfID0gc2l6ZTsKKworICAgICAgICAgIC8vIE5vdyB3ZSBrbm93IHRoZSBmcmFtZSBzaXplLCBzZXQgZXZlcnl0aGluZyB1cCBmb3IgcmVhZGluZyB0aGUKKyAgICAgICAgICAvLyBwYXlsb2FkLgorICAgICAgICAgIHRyYW5zaXRpb24oKTsKKyAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBTb2NrZXRTdGF0ZS5SRUNWOgorICAgICAgICAgIC8vIElmIHdlIGFscmVhZHkgZ290IGFsbCB0aGUgZGF0YSwgd2Ugc2hvdWxkIGJlIGluIHRoZSBTRU5EIHN0YXRlLgorICAgICAgICAgIGFzc2VydChyZWFkQnVmZmVyUG9zXyA8IHJlYWRXYW50Xyk7CisKKyAgICAgICAgICBzaXplX3QgYnl0ZXNSZWFkOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBSZWFkIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgc29ja2V0LgorICAgICAgICAgICAgYnl0ZXNSZWFkID0gc29ja2V0Xy5yZWFkKHJlYWRCdWZmZXJfW3JlYWRCdWZmZXJQb3NfIC4uIHJlYWRXYW50X10pOworICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgICAgIGxvZ0Vycm9yKCJGYWlsZWQgdG8gcmVhZCBmcm9tIGNsaWVudCBzb2NrZXQ6ICVzIiwgdGUpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoYnl0ZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgIC8vIFdlIHdlcmUgbm90aWZpZWQsIGJ1dCBubyBieXRlcyBjb3VsZCBiZSByZWFkIC0+IHRoZSBjbGllbnQKKyAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3RlZC4KKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgcmVhZEJ1ZmZlclBvc18gKz0gYnl0ZXNSZWFkOworICAgICAgICAgIGFzc2VydChyZWFkQnVmZmVyUG9zXyA8PSByZWFkV2FudF8pOworCisgICAgICAgICAgaWYgKHJlYWRCdWZmZXJQb3NfID09IHJlYWRXYW50XykgeworICAgICAgICAgICAgLy8gVGhlIHBheWxvYWQgaGFzIGJlZW4gcmVhZCBjb21wbGV0ZWx5LCBtb3ZlIG9uLgorICAgICAgICAgICAgdHJhbnNpdGlvbigpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBTb2NrZXRTdGF0ZS5TRU5EOgorICAgICAgICAgIGFzc2VydCh3cml0ZUJ1ZmZlclBvc18gPD0gd3JpdGVCdWZmZXJfLmxlbmd0aCk7CisKKyAgICAgICAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyXy5sZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBzZW5kIOKAkyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGp1c3QgbW92ZSBvbi4KKyAgICAgICAgICAgIGxvZ0luZm8oIldBUk5JTkc6IEluIHNlbmQgc3RhdGUsIGJ1dCBubyBkYXRhIHRvIHNlbmQuXG4iKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb24oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBzaXplX3QgYnl0ZXNTZW50OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlc1NlbnQgPSBzb2NrZXRfLndyaXRlU29tZSh3cml0ZUJ1ZmZlcl9bd3JpdGVCdWZmZXJQb3NfIC4uICRdKTsKKyAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHRlKSB7CisgICAgICAgICAgICBsb2dFcnJvcigiRmFpbGVkIHRvIHdyaXRlIHRvIGNsaWVudCBzb2NrZXQ6ICVzIiwgdGUpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICB3cml0ZUJ1ZmZlclBvc18gKz0gYnl0ZXNTZW50OworICAgICAgICAgIGFzc2VydCh3cml0ZUJ1ZmZlclBvc18gPD0gd3JpdGVCdWZmZXJfLmxlbmd0aCk7CisKKyAgICAgICAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyXy5sZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIFRoZSB3aG9sZSByZXNwb25zZSBoYXMgYmVlbiB3cml0dGVuIG91dCwgd2UgYXJlIGRvbmUuCisgICAgICAgICAgICB0cmFuc2l0aW9uKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGxpYmV2ZW50IGV2ZW50IGZvciB3b3JrU29ja2V0KCkgd2l0aCB0aGUgcGFzc2VkIGZsYWdzLAorICAgICAqIHVucmVnaXN0ZXJpbmcgdGhlIHByZXZpb3VzIG9uZSAoaWYgYW55KS4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyRXZlbnQoc2hvcnQgZXZlbnRGbGFncykgeworICAgICAgaWYgKGV2ZW50RmxhZ3NfID09IGV2ZW50RmxhZ3MpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkbyBpZiBmbGFncyBhcmUgdGhlIHNhbWUuCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy8gRGVsZXRlIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGV2ZW50LgorICAgICAgdW5yZWdpc3RlckV2ZW50KCk7CisKKyAgICAgIGV2ZW50RmxhZ3NfID0gZXZlbnRGbGFnczsKKworICAgICAgaWYgKGV2ZW50RmxhZ3MgPT0gMCkgcmV0dXJuOworCisgICAgICBpZiAoIWV2ZW50XykgeworICAgICAgICAvLyBJZiB0aGUgZXZlbnQgd2FzIG5vdCBhbHJlYWR5IGFsbG9jYXRlZCwgZG8gaXQgbm93LgorICAgICAgICBldmVudF8gPSBldmVudF9uZXcobG9vcF8uZXZlbnRCYXNlXywgc29ja2V0Xy5zb2NrZXRIYW5kbGUsCisgICAgICAgICAgZXZlbnRGbGFnc18sIGFzc3VtZU5vdGhyb3coJndvcmtTb2NrZXRDYWxsYmFjayksIGNhc3Qodm9pZCopdGhpcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBldmVudF9hc3NpZ24oZXZlbnRfLCBsb29wXy5ldmVudEJhc2VfLCBzb2NrZXRfLnNvY2tldEhhbmRsZSwKKyAgICAgICAgICBldmVudEZsYWdzXywgYXNzdW1lTm90aHJvdygmd29ya1NvY2tldENhbGxiYWNrKSwgY2FzdCh2b2lkKil0aGlzKTsKKyAgICAgIH0KKworICAgICAgLy8gQWRkIHRoZSBldmVudAorICAgICAgaWYgKGV2ZW50X2FkZChldmVudF8sIG51bGwpID09IC0xKSB7CisgICAgICAgIGxvZ0Vycm9yKCJldmVudF9hZGQoKSBmb3IgY2xpZW50IHNvY2tldCBmYWlsZWQuIik7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgdGhlIGN1cnJlbnQgbGliZXZlbnQgZXZlbnQsIGlmIGFueS4KKyAgICAgKi8KKyAgICB2b2lkIHVucmVnaXN0ZXJFdmVudCgpIHsKKyAgICAgIGlmIChldmVudF8gJiYgZXZlbnRGbGFnc18gIT0gMCkgeworICAgICAgICBldmVudEZsYWdzXyA9IDA7CisgICAgICAgIGlmIChldmVudF9kZWwoZXZlbnRfKSA9PSAtMSkgeworICAgICAgICAgIGxvZ0Vycm9yKCJldmVudF9kZWwoKSBmb3IgY2xpZW50IHNvY2tldCBmYWlsZWQuIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgY29ubmVjdGlvbiBhbmQgcmV0dXJucyBpdCBiYWNrIHRvIHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgdm9pZCBjbG9zZSgpIHsKKyAgICAgIHVucmVnaXN0ZXJFdmVudCgpOworCisgICAgICBpZiAoc2VydmVyXy5ldmVudEhhbmRsZXIpIHsKKyAgICAgICAgc2VydmVyXy5ldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dCgKKyAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICAgICAgfQorCisgICAgICAvLyBDbG9zZSB0aGUgc29ja2V0CisgICAgICBzb2NrZXRfLmNsb3NlKCk7CisKKyAgICAgIC8vIGNsb3NlIGFueSBmYWN0b3J5IHByb2R1Y2VkIHRyYW5zcG9ydHMuCisgICAgICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfLmNsb3NlKCk7CisgICAgICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xy5jbG9zZSgpOworCisgICAgICAvLyBUaGlzIGNvbm5lY3Rpb24gb2JqZWN0IGNhbiBub3cgYmUgcmV1c2VkLgorICAgICAgbG9vcF8uZGlzcG9zZUNvbm5lY3Rpb24odGhpcyk7CisgICAgfQorCisgICAgLy8vIFRoZSBzZXJ2ZXIgdGhpcyBjb25uZWN0aW9uIGJlbG9uZ3MgdG8uCisgICAgVE5vbmJsb2NraW5nU2VydmVyIHNlcnZlcl87CisKKyAgICAvLy8gVGhlIHRhc2sgcG9vbCB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24uIFRoaXMgaXMgY2FjaGVkIGluc3RlYWQgb2YKKyAgICAvLy8gZGlyZWN0bHkgdXNpbmcgc2VydmVyXy50YXNrUG9vbCB0byBhdm9pZCBjb25mdXNpb24gaWYgaXQgaXMgY2hhbmdlZCBpbgorICAgIC8vLyBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWQuCisgICAgVGFza1Bvb2wgdGFza1Bvb2xfOworCisgICAgLy8vIFRoZSBJL08gdGhyZWFkIGhhbmRsaW5nIHRoaXMgY29ubmVjdGlvbi4KKyAgICBJT0xvb3AgbG9vcF87CisKKyAgICAvLy8gVGhlIHNvY2tldCBtYW5hZ2VkIGJ5IHRoaXMgY29ubmVjdGlvbi4KKyAgICBUU29ja2V0IHNvY2tldF87CisKKyAgICAvLy8gVGhlIGxpYmV2ZW50IG9iamVjdCB1c2VkIGZvciByZWdpc3RlcmluZyB0aGUgd29ya1NvY2tldENhbGxiYWNrLgorICAgIGV2ZW50KiBldmVudF87CisKKyAgICAvLy8gTGliZXZlbnQgZmxhZ3MKKyAgICBzaG9ydCBldmVudEZsYWdzXzsKKworICAgIC8vLyBTb2NrZXQgbW9kZQorICAgIFNvY2tldFN0YXRlIHNvY2tldFN0YXRlXzsKKworICAgIC8vLyBBcHBsaWNhdGlvbiBzdGF0ZQorICAgIENvbm5lY3Rpb25TdGF0ZSBjb25uU3RhdGVfOworCisgICAgLy8vIFRoZSBzaXplIG9mIHRoZSBmcmFtZSB0byByZWFkLiBJZiBzdGlsbCBpbiBSRUFEX0ZSQU1FX1NJWkUgc3RhdGUsIHNvbWUKKyAgICAvLy8gb2YgdGhlIGJ5dGVzIG1pZ2h0IG5vdCBoYXZlIGJlZW4gd3JpdHRlbiwgYW5kIHRoZSB2YWx1ZSBtaWdodCBzdGlsbCBiZQorICAgIC8vLyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuIEFuIHVpbnQgKG5vdCBhIHNpemVfdCkgYmVjYXVzZSB0aGUgZnJhbWUgc2l6ZSBvbgorICAgIC8vLyB0aGUgd2lyZSBpcyBzcGVjaWZpZWQgYXMgb25lLgorICAgIHVpbnQgcmVhZFdhbnRfOworCisgICAgLy8vIFRoZSBwb3NpdGlvbiBpbiB0aGUgcmVhZCBidWZmZXIsIGkuZS4gdGhlIG51bWJlciBvZiBwYXlsb2FkIGJ5dGVzCisgICAgLy8vIGFscmVhZHkgcmVjZWl2ZWQgZnJvbSB0aGUgc29ja2V0IGluIFJFQURfUkVRVUVTVCBzdGF0ZSwgcmVzcC4gdGhlCisgICAgLy8vIG51bWJlciBvZiBzaXplIGJ5dGVzIGluIFJFQURfRlJBTUVfU0laRSBzdGF0ZS4KKyAgICB1aW50IHJlYWRCdWZmZXJQb3NfOworCisgICAgLy8vIFJlYWQgYnVmZmVyCisgICAgdWJ5dGUqIHJlYWRCdWZmZXJfOworCisgICAgLy8vIFJlYWQgYnVmZmVyIHNpemUKKyAgICBzaXplX3QgcmVhZEJ1ZmZlclNpemVfOworCisgICAgLy8vIFdyaXRlIGJ1ZmZlcgorICAgIHVieXRlW10gd3JpdGVCdWZmZXJfOworCisgICAgLy8vIEhvdyBmYXIgdGhyb3VnaCB3cml0aW5nIGFyZSB3ZT8KKyAgICBzaXplX3Qgd3JpdGVCdWZmZXJQb3NfOworCisgICAgLy8vIExhcmdlc3Qgc2l6ZSBvZiB3cml0ZSBidWZmZXIgc2VlbiBzaW5jZSBidWZmZXIgd2FzIGNvbnN0cnVjdGVkCisgICAgc2l6ZV90IGxhcmdlc3RXcml0ZUJ1ZmZlclNpemVfOworCisgICAgLy8vIE51bWJlciBvZiBjYWxscyBzaW5jZSB0aGUgbGFzdCB0aW1lIGNoZWNrSWRsZUJ1ZmZlckxpbWl0IGhhcyBiZWVuCisgICAgLy8vIGludm9rZWQgKHNlZSBUU2VydmVyLnJlc2l6ZUJ1ZmZlckV2ZXJ5TikuCisgICAgdWludCBjYWxsc1NpbmNlUmVzaXplXzsKKworICAgIC8vLyBCYXNlIHRyYW5zcG9ydHMgdGhlIHByb2Nlc3NvciByZWFkcyBmcm9tL3dyaXRlcyB0by4KKyAgICBUSW5wdXRSYW5nZVRyYW5zcG9ydCEodWJ5dGVbXSkgaW5wdXRUcmFuc3BvcnRfOworICAgIFRNZW1vcnlCdWZmZXIgb3V0cHV0VHJhbnNwb3J0XzsKKworICAgIC8vLyBUaGUgYWN0dWFsIHRyYW5zcG9ydHMgcGFzc2VkIHRvIHRoZSBwcm9jZXNzb3Igb2J0YWluZWQgdmlhIHRoZQorICAgIC8vLyB0cmFuc3BvcnQgZmFjdG9yeS4KKyAgICBUVHJhbnNwb3J0IGZhY3RvcnlJbnB1dFRyYW5zcG9ydF87CisgICAgVFRyYW5zcG9ydCBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XzsgLy8vIERpdHRvCisKKyAgICAvLy8gSW5wdXQvb3V0cHV0IHByb3RvY29scywgY29ubmVjdGVkIHRvIGZhY3Rvcnl7SW5wdXQsIE91dHB1dH1UcmFuc3BvcnQuCisgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2xfOworICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbF87IC8vLyBEaXR0by4KKworICAgIC8vLyBDb25uZWN0aW9uIGNvbnRleHQgb3B0aW9uYWxseSBjcmVhdGVkIGJ5IHRoZSBzZXJ2ZXIgZXZlbnQgaGFuZGxlci4KKyAgICBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0XzsKKworICAgIC8vLyBUaGUgcHJvY2Vzc29yIHVzZWQgZm9yIHRoaXMgY29ubmVjdGlvbi4KKyAgICBUUHJvY2Vzc29yIHByb2Nlc3Nvcl87CisgIH0KK30KKworLyoKKyAqIFRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgZnVuY3Rpb24sIHdoaWNoIGludm9rZXMgdGhlIHByb2Nlc3NvciBmb3IgdGhlIHNlcnZlcgorICogZm9yIGFsbCB0aGUgUlBDIG1lc3NhZ2VzIHJlY2VpdmVkIG92ZXIgYSBjb25uZWN0aW9uLgorICoKKyAqIE11c3QgYmUgcHVibGljIGJlY2F1c2UgaXQgaXMgcGFzc2VkIGFzIGFsaWFzIHRvIHN0ZC5wYXJhbGxlbGlzbS50YXNrKCkuCisgKi8KK3ZvaWQgcHJvY2Vzc1JlcXVlc3QoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgIHRyeSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHdpdGggKGNvbm5lY3Rpb24pIHsKKyAgICAgICAgaWYgKHNlcnZlcl8uZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgc2VydmVyXy5ldmVudEhhbmRsZXIucHJlUHJvY2Vzcyhjb25uZWN0aW9uQ29udGV4dF8sIHNvY2tldF8pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwcm9jZXNzb3JfLnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywKKyAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dF8pIHx8ICFpbnB1dFByb3RvY29sXy50cmFuc3BvcnQucGVlaygpCisgICAgICAgICkgeworICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IGZ1bmRhbWVudGFsbHkgd3Jvbmcgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvCisgICAgICAgICAgLy8gcHJvY2VzcywgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkOiAlcyIsIHR0eCk7CisgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKKyAgfQorCisgIGlmIChjb25uZWN0aW9uLnRhc2tQb29sXykgY29ubmVjdGlvbi5sb29wXy5ub3RpZnlDb21wbGV0ZWQoY29ubmVjdGlvbik7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnNlcnZlcjsKKworICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlIGluZm8gbG9nIG91dHB1dCBpbiBvcmRlciBub3QgdG8gc3BhbSB0aGUgdGVzdCByZXN1bHRzCisgIC8vIHdpdGggc3RhcnR1cCBpbmZvIG1lc3NhZ2VzLgorICBhdXRvIG9sZEluZm9Mb2dTaW5rID0gZ19pbmZvTG9nU2luazsKKyAgZ19pbmZvTG9nU2luayA9IG51bGw7CisgIHNjb3BlIChleGl0KSBnX2luZm9Mb2dTaW5rID0gb2xkSW5mb0xvZ1Npbms7CisKKyAgLy8gVGVzdCBpbi1saW5lIHByb2Nlc3Npbmcgc2h1dGRvd24gd2l0aCBvbmUgYXMgd2VsbCBhcyBzZXZlcmFsIEkvTyB0aHJlYWRzLgorICB0ZXN0U2VydmVDYW5jZWwhKFROb25ibG9ja2luZ1NlcnZlcikoKTsKKyAgdGVzdFNlcnZlQ2FuY2VsIShUTm9uYmxvY2tpbmdTZXJ2ZXIpKChUTm9uYmxvY2tpbmdTZXJ2ZXIgcykgeworICAgIHMubnVtSU9UaHJlYWRzID0gNDsKKyAgfSk7CisKKyAgLy8gVGVzdCB0YXNrIHBvb2wgcHJvY2Vzc2luZyBzaHV0ZG93biB3aXRoIG9uZSBhcyB3ZWxsIGFzIHNldmVyYWwgSS9PIHRocmVhZHMuCisgIGF1dG8gdHAgPSBuZXcgVGFza1Bvb2woNCk7CisgIHRwLmlzRGFlbW9uID0gdHJ1ZTsKKyAgdGVzdFNlcnZlQ2FuY2VsIShUTm9uYmxvY2tpbmdTZXJ2ZXIpKChUTm9uYmxvY2tpbmdTZXJ2ZXIgcykgeworICAgIHMudGFza1Bvb2wgPSB0cDsKKyAgfSk7CisgIHRlc3RTZXJ2ZUNhbmNlbCEoVE5vbmJsb2NraW5nU2VydmVyKSgoVE5vbmJsb2NraW5nU2VydmVyIHMpIHsKKyAgICBzLnRhc2tQb29sID0gdHA7CisgICAgcy5udW1JT1RocmVhZHMgPSA0OworICB9KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvc2ltcGxlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiYTRjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CisKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIFRoZSBtb3N0IGJhc2ljIHNlcnZlci4KKyAqCisgKiBJdCBpcyBzaW5nbGUtdGhyZWFkZWQgYW5kIGFmdGVyIGl0IGFjY2VwdHMgYSBjb25uZWN0aW9ucywgaXQgcHJvY2Vzc2VzCisgKiByZXF1ZXN0cyBvbiBpdCB1bnRpbCBpdCBjbG9zZXMsIHRoZW4gd2FpdGluZyBmb3IgdGhlIG5leHQgY29ubmVjdGlvbi4KKyAqCisgKiBJdCBpcyBub3Qgc28gbXVjaCBvZiB1c2UgaW4gcHJvZHVjdGlvbiB0aGFuIGl0IGlzIGZvciB3cml0aW5nIHVuaXR0ZXN0cywgb3IKKyAqIGFzIGFuIGV4YW1wbGUgb24gaG93IHRvIHByb3ZpZGUgYSBjdXN0b20gVFNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgVFNpbXBsZVNlcnZlciA6IFRTZXJ2ZXIgeworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5CisgICkgeworICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgc2VydmUoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7CisgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKKworICAgIGlmIChldmVudEhhbmRsZXIpIGV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIFRUcmFuc3BvcnQgY2xpZW50OworICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydDsKKyAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0OworICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2w7CisgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KGNhbmNlbGxhdGlvbik7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIGNsaWVudC5jbG9zZSgpOworCisgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKKworICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworICAgICAgfSBjYXRjaCAoVENhbmNlbGxlZEV4Y2VwdGlvbiB0Y3gpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBsb2dFcnJvcigiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gYWNjZXB0OiAlcyIsIHR0eCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0eCkgeworICAgICAgICBsb2dFcnJvcigiQ2F1Z2h0IFRFeGNlcHRpb24gb24gYWNjZXB0OiAlcyIsIHR4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGF1dG8gaW5mbyA9IFRDb25uZWN0aW9uSW5mbyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KTsKKyAgICAgIGF1dG8gcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluZm8pOworCisgICAgICBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0OworICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9CisgICAgICAgICAgZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgICAgICAgIGV2ZW50SGFuZGxlci5wcmVQcm9jZXNzKGNvbm5lY3Rpb25Db250ZXh0LCBjbGllbnQpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCkgfHwgIWlucHV0UHJvdG9jb2wudHJhbnNwb3J0LnBlZWsoKQorICAgICAgICAgICkgeworICAgICAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgZnVuZGFtZW50bGx5IHdyb25nIG9yIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0bworICAgICAgICAgICAgLy8gcHJvY2VzcywgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGlmICh0dHgudHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSkgeworICAgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKKyAgICAgIH0KKworICAgICAgaWYgKGV2ZW50SGFuZGxlcikgeworICAgICAgICBldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICBvdXRwdXRQcm90b2NvbCk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBsb2dFcnJvcigiSW5wdXQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJPdXRwdXQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgICB9CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJTZXJ2ZXIgdHJhbnNwb3J0IGZhaWxlZCB0byBjbG9zZSgpOiAlcyIsIGUpOworICAgIH0KKyAgfQorfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5zZXJ2ZXI7CisgIHRlc3RTZXJ2ZUNhbmNlbCFUU2ltcGxlU2VydmVyKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBlNzIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZApAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC5zZXJ2ZXIudGFza3Bvb2w7CisKK2ltcG9ydCBjb3JlLnN5bmMuY29uZGl0aW9uOworaW1wb3J0IGNvcmUuc3luYy5tdXRleDsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQucGFyYWxsZWxpc207CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBBIHNlcnZlciB3aGljaCBkaXNwYXRjaGVzIGNsaWVudCByZXF1ZXN0cyB0byBhIHN0ZC5wYXJhbGxlbGlzbSBUYXNrUG9vbC4KKyAqLworY2xhc3MgVFRhc2tQb29sU2VydmVyIDogVFNlcnZlciB7CisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksCisgICAgVGFza1Bvb2wgdGFza1Bvb2wgPSBudWxsCisgICkgeworICAgIHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGFza1Bvb2wpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0YXNrUG9vbCk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRhc2tQb29sIHRhc2tQb29sID0gbnVsbAorICApIHsKKyAgICB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUYXNrUG9vbCB0YXNrUG9vbCA9IG51bGwKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKworICAgIGlmICh0YXNrUG9vbCkgeworICAgICAgdGhpcy50YXNrUG9vbCA9IHRhc2tQb29sOworICAgIH0gZWxzZSB7CisgICAgICBhdXRvIHB0cCA9IHN0ZC5wYXJhbGxlbGlzbS50YXNrUG9vbDsKKyAgICAgIGlmIChwdHAuc2l6ZSA+IDApIHsKKyAgICAgICAgdGFza1Bvb2xfID0gcHRwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgdGhlIGdsb2JhbCB0YXNrIHBvb2wgaXMgZW1wdHkgKGRlZmF1bHQgb24gYSBzaW5nbGUtY29yZSBtYWNoaW5lKSwKKyAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG9uZSB3aXRoIGEgc2luZ2xlIHdvcmtlciB0aHJlYWQuIFRoZSByYXRpb25hbGUgZm9yIHRoaXMKKyAgICAgICAgLy8gaXMgdG8gYXZvaWQgdGhhdCBhbiBhcHBsaWNhdGlvbiB3aGljaCB3b3JrZWQgZmluZSB3aXRoIG5vIHRhc2sgcG9vbAorICAgICAgICAvLyBleHBsaWNpdGx5IHNldCBvbiB0aGUgbXVsdGktY29yZSBkZXZlbG9wZXIgYm94ZXMgc3VkZGVubHkgZmFpbHMgb24gYQorICAgICAgICAvLyBzaW5nbGUtY29yZSB1c2VyIG1hY2hpbmUuCisgICAgICAgIHRhc2tQb29sXyA9IG5ldyBUYXNrUG9vbCgxKTsKKyAgICAgICAgdGFza1Bvb2xfLmlzRGFlbW9uID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIHNlcnZlKFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCkgeworICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7CisKKyAgICBpZiAoZXZlbnRIYW5kbGVyKSBldmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgIGF1dG8gcXVldWVTdGF0ZSA9IFF1ZXVlU3RhdGUoKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gc3RpbGwgaGFuZGxlIG1vcmUgY29ubmVjdGlvbnMuCisgICAgICBpZiAobWF4QWN0aXZlQ29ubnMpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChxdWV1ZVN0YXRlLm11dGV4KSB7CisgICAgICAgICAgd2hpbGUgKHF1ZXVlU3RhdGUuYWN0aXZlQ29ubnMgPj0gbWF4QWN0aXZlQ29ubnMpIHsKKyAgICAgICAgICAgIHF1ZXVlU3RhdGUuY29ubkNsb3NlZC53YWl0KCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFRUcmFuc3BvcnQgY2xpZW50OworICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydDsKKyAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0OworICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2w7CisgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KGNhbmNlbGxhdGlvbik7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIGNsaWVudC5jbG9zZSgpOworCisgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKKworICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgc2NvcGUoZmFpbHVyZSkgb3V0cHV0VHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworICAgICAgfSBjYXRjaCAoVENhbmNlbGxlZEV4Y2VwdGlvbiB0Y2UpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgICBsb2dFcnJvcigiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gYWNjZXB0OiAlcyIsIHR0eCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0eCkgeworICAgICAgICBsb2dFcnJvcigiQ2F1Z2h0IFRFeGNlcHRpb24gb24gYWNjZXB0OiAlcyIsIHR4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGF1dG8gaW5mbyA9IFRDb25uZWN0aW9uSW5mbyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KTsKKyAgICAgIGF1dG8gcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluZm8pOworCisgICAgICBzeW5jaHJvbml6ZWQgKHF1ZXVlU3RhdGUubXV0ZXgpIHsKKyAgICAgICAgKytxdWV1ZVN0YXRlLmFjdGl2ZUNvbm5zOworICAgICAgfQorICAgICAgdGFza1Bvb2xfLnB1dCh0YXNrIXdvcmtlcihxdWV1ZVN0YXRlLCBjbGllbnQsIGlucHV0UHJvdG9jb2wsCisgICAgICAgIG91dHB1dFByb3RvY29sLCBwcm9jZXNzb3IsIGV2ZW50SGFuZGxlcikpOworICAgIH0KKworICAgIC8vIEZpcnN0LCBzdG9wIGFjY2VwdGluZyBuZXcgY29ubmVjdGlvbnMuCisgICAgdHJ5IHsKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJTZXJ2ZXIgdHJhbnNwb3J0IGZhaWxlZCB0byBjbG9zZTogJXMiLCBlKTsKKyAgICB9CisKKyAgICAvLyBUaGVuLCB3YWl0IHVudGlsIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMgYXJlIGZpbmlzaGVkLgorICAgIHN5bmNocm9uaXplZCAocXVldWVTdGF0ZS5tdXRleCkgeworICAgICAgd2hpbGUgKHF1ZXVlU3RhdGUuYWN0aXZlQ29ubnMgPiAwKSB7CisgICAgICAgIHF1ZXVlU3RhdGUuY29ubkNsb3NlZC53YWl0KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRhc2sgcG9vbCB0byB1c2UuCisgICAqCisgICAqIEJ5IGRlZmF1bHQsIHRoZSBnbG9iYWwgc3RkLnBhcmFsbGVsaXNtIHRhc2tQb29sIGluc3RhbmNlIGlzIHVzZWQsIHdoaWNoCisgICAqIG1pZ2h0IG5vdCBiZSBhcHByb3ByaWF0ZSBmb3IgbWFueSBhcHBsaWNhdGlvbnMsIGUuZy4gd2hlcmUgdHVuaW5nIHRoZQorICAgKiBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgaXMgZGVzaXJlZC4gKE9uIHNpbmdsZS1jb3JlIHN5c3RlbXMsIGEgcHJpdmF0ZQorICAgKiB0YXNrIHBvb2wgd2l0aCBhIHNpbmdsZSB0aHJlYWQgaXMgdXNlZCBieSBkZWZhdWx0LCBzaW5jZSB0aGUgZ2xvYmFsCisgICAqIHRhc2tQb29sIGluc3RhbmNlIGhhcyBubyB3b3JrZXIgdGhyZWFkcyB0aGVuLikKKyAgICoKKyAgICogTm90ZTogVFRhc2tQb29sU2VydmVyIGV4cGVjdHMgdGhhdCB0YXNrcyBhcmUgbmV2ZXIgZHJvcHBlZCBmcm9tIHRoZSBwb29sLAorICAgKiBlLmcuIGJ5IGNhbGxpbmcgVGFza1Bvb2wuY2xvc2UoKSB3aGlsZSB0aGVyZSBhcmUgc3RpbGwgdGFza3MgaW4gdGhlCisgICAqIHF1ZXVlLiBJZiB0aGlzIGhhcHBlbnMsIHNlcnZlKCkgd2lsbCBuZXZlciByZXR1cm4uCisgICAqLworICB2b2lkIHRhc2tQb29sKFRhc2tQb29sIHBvb2wpIEBwcm9wZXJ0eSB7CisgICAgZW5mb3JjZShwb29sICFpcyBudWxsLCAiQ2Fubm90IHVzZSBhIG51bGwgdGFzayBwb29sLiIpOworICAgIGVuZm9yY2UocG9vbC5zaXplID4gMCwgIkNhbm5vdCB1c2UgYSB0YXNrIHBvb2wgd2l0aCBubyB3b3JrZXIgdGhyZWFkcy4iKTsKKyAgICB0YXNrUG9vbF8gPSBwb29sOworICB9CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjbGllbnQgY29ubmVjdGlvbnMgb3BlbiBhdCB0aGUgc2FtZSB0aW1lLiBaZXJvIGZvcgorICAgKiBubyBsaW1pdCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgICAqCisgICAqIElmIHRoaXMgbGltaXQgaXMgcmVhY2hlZCwgbm8gY2xpZW50cyBhcmUgYWNjZXB0KCllZCBmcm9tIHRoZSBzZXJ2ZXIKKyAgICogdHJhbnNwb3J0IGFueSBsb25nZXIgdW50aWwgYW5vdGhlciBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCBhZ2Fpbi4KKyAgICovCisgIHNpemVfdCBtYXhBY3RpdmVDb25uczsKKworcHJvdGVjdGVkOgorICBUYXNrUG9vbCB0YXNrUG9vbF87Cit9CisKKy8vIENhbm5vdCBiZSBwcml2YXRlIGFzIHdvcmtlciBoYXMgdG8gYmUgcGFzc2VkIGFzIGFsaWFzIHBhcmFtZXRlciB0bworLy8gYW5vdGhlciBtb2R1bGUuCisvLyBwcml2YXRlIHsKKyAgLyoKKyAgICogVGhlIHN0YXRlIG9mIHRoZSDCu2Nvbm5lY3Rpb24gcXVldWXCqywgaS5lLiB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIGhvdworICAgKiBtYW55IGNsaWVudCBjb25uZWN0aW9ucyBhcmUgY3VycmVudGx5IHByb2Nlc3NlZC4KKyAgICovCisgIHN0cnVjdCBRdWV1ZVN0YXRlIHsKKyAgICAvLy8gUHJvdGVjdHMgdGhlIHF1ZXVlIHN0YXRlLgorICAgIE11dGV4IG11dGV4OworCisgICAgLy8vIFRoZSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIChmcm9tIHRoZSB0aW1lIHRoZXkgYXJlIGFjY2VwdCgpZWQKKyAgICAvLy8gdW50aWwgdGhleSBhcmUgY2xvc2VkIHdoZW4gdGhlIHdvcmtlZCB0YXNrIGZpbmlzaGVzKS4KKyAgICBzaXplX3QgYWN0aXZlQ29ubnM7CisKKyAgICAvLy8gU2lnbmFscyB0aGF0IHRoZSBudW1iZXIgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGhhcyBiZWVuIGRlY3JlYXNlZCwgaS5lLgorICAgIC8vLyB0aGF0IGEgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuCisgICAgQ29uZGl0aW9uIGNvbm5DbG9zZWQ7CisKKyAgICAvLy8gUmV0dXJucyBhbiBpbml0aWFsaXplZCBpbnN0YW5jZS4KKyAgICBzdGF0aWMgUXVldWVTdGF0ZSBvcENhbGwoKSB7CisgICAgICBRdWV1ZVN0YXRlIHE7CisgICAgICBxLm11dGV4ID0gbmV3IE11dGV4OworICAgICAgcS5jb25uQ2xvc2VkID0gbmV3IENvbmRpdGlvbihxLm11dGV4KTsKKyAgICAgIHJldHVybiBxOworICAgIH0KKyAgfQorCisgIHZvaWQgd29ya2VyKHJlZiBRdWV1ZVN0YXRlIHF1ZXVlU3RhdGUsIFRUcmFuc3BvcnQgY2xpZW50LAorICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sLCBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wsCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyKQorICB7CisgICAgc2NvcGUgKGV4aXQpIHsKKyAgICAgIHN5bmNocm9uaXplZCAocXVldWVTdGF0ZS5tdXRleCkgeworICAgICAgICBhc3NlcnQocXVldWVTdGF0ZS5hY3RpdmVDb25ucyA+IDApOworICAgICAgICAtLXF1ZXVlU3RhdGUuYWN0aXZlQ29ubnM7CisgICAgICAgIHF1ZXVlU3RhdGUuY29ubkNsb3NlZC5ub3RpZnlBbGwoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBWYXJpYW50IGNvbm5lY3Rpb25Db250ZXh0OworICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0KKyAgICAgICAgZXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyLnByZVByb2Nlc3MoY29ubmVjdGlvbkNvbnRleHQsIGNsaWVudCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLAorICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KSB8fCAhaW5wdXRQcm90b2NvbC50cmFuc3BvcnQucGVlaygpCisgICAgICAgICkgeworICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IGZ1bmRhbWVudGxseSB3cm9uZyBvciB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8KKyAgICAgICAgICAvLyBwcm9jZXNzLCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBpZiAodHR4LnR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkIHVuZXhwZWN0ZWRseTogJXMiLCB0dHgpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2dFcnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uOiAlcyIsIGUpOworICAgIH0KKworICAgIGlmIChldmVudEhhbmRsZXIpIHsKKyAgICAgIGV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLAorICAgICAgICBvdXRwdXRQcm90b2NvbCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGlucHV0UHJvdG9jb2wudHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJJbnB1dCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIG91dHB1dFByb3RvY29sLnRyYW5zcG9ydC5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBsb2dFcnJvcigiT3V0cHV0IGNsb3NlIGZhaWxlZDogJXMiLCB0dHgpOworICAgIH0KKyAgICB0cnkgeworICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJDbGllbnQgY2xvc2UgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgfQorICB9CisvLyB9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50ZXN0LnNlcnZlcjsKKyAgdGVzdFNlcnZlQ2FuY2VsIVRUYXNrUG9vbFNlcnZlcigpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwY2M4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnRocmVhZGVkOworCitpbXBvcnQgY29yZS50aHJlYWQ7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBBIHNpbXBsZSB0aHJlYWRlZCBzZXJ2ZXIgd2hpY2ggc3Bhd25zIGEgbmV3IHRocmVhZCBwZXIgY29ubmVjdGlvbi4KKyAqLworY2xhc3MgVFRocmVhZGVkU2VydmVyIDogVFNlcnZlciB7CisgIC8vLworICB0aGlzKAorICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICB9CisKKyAgLy8vCisgIHRoaXMoCisgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeQorICApIHsKKyAgICBzdXBlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvLy8KKyAgdGhpcygKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgKSB7CisgICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgc2VydmUoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKSB7CisgICAgdHJ5IHsKKyAgICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIgbGlzdGVuaW5nCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICBsb2dFcnJvcigibGlzdGVuKCkgZmFpbGVkOiAlcyIsIHR0eCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGV2ZW50SGFuZGxlcikgZXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisKKyAgICBhdXRvIHdvcmtlclRocmVhZHMgPSBuZXcgVGhyZWFkR3JvdXAoKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBUVHJhbnNwb3J0IGNsaWVudDsKKyAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQ7CisgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydDsKKyAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sOworICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sOworCisgICAgICB0cnkgeworICAgICAgICBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnRfLmFjY2VwdChjYW5jZWxsYXRpb24pOworICAgICAgICBzY29wZShmYWlsdXJlKSBjbGllbnQuY2xvc2UoKTsKKworICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgIHNjb3BlKGZhaWx1cmUpIG91dHB1dFRyYW5zcG9ydC5jbG9zZSgpOworCisgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgIH0gY2F0Y2ggKFRDYW5jZWxsZWRFeGNlcHRpb24gdGNlKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGFjY2VwdDogJXMiLCB0dHgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdHgpIHsKKyAgICAgICAgbG9nRXJyb3IoIkNhdWdodCBURXhjZXB0aW9uIG9uIGFjY2VwdDogJXMiLCB0eCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBhdXRvIGluZm8gPSBUQ29ubmVjdGlvbkluZm8oaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNsaWVudCk7CisgICAgICBhdXRvIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpbmZvKTsKKyAgICAgIGF1dG8gd29ya2VyID0gbmV3IFdvcmtlclRocmVhZChjbGllbnQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLAorICAgICAgICBwcm9jZXNzb3IsIGV2ZW50SGFuZGxlcik7CisgICAgICB3b3JrZXJUaHJlYWRzLmFkZCh3b3JrZXIpOworICAgICAgd29ya2VyLnN0YXJ0KCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZ0Vycm9yKCJTZXJ2ZXIgdHJhbnNwb3J0IGZhaWxlZCB0byBjbG9zZTogJXMiLCBlKTsKKyAgICB9CisgICAgd29ya2VyVGhyZWFkcy5qb2luQWxsKCk7CisgIH0KK30KKworLy8gVGhlIHdvcmtlciB0aHJlYWQgaGFuZGxpbmcgYSBjbGllbnQgY29ubmVjdGlvbi4KK3ByaXZhdGUgY2xhc3MgV29ya2VyVGhyZWFkIDogVGhyZWFkIHsKKyAgdGhpcyhUVHJhbnNwb3J0IGNsaWVudCwgVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCwKKyAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIpCisgIHsKKyAgICBjbGllbnRfID0gY2xpZW50OworICAgIGlucHV0UHJvdG9jb2xfID0gaW5wdXRQcm90b2NvbDsKKyAgICBvdXRwdXRQcm90b2NvbF8gPSBvdXRwdXRQcm90b2NvbDsKKyAgICBwcm9jZXNzb3JfID0gcHJvY2Vzc29yOworICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CisKKyAgICBzdXBlcigmcnVuKTsKKyAgfQorCisgIHZvaWQgcnVuKCkgeworICAgIFZhcmlhbnQgY29ubmVjdGlvbkNvbnRleHQ7CisgICAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0KKyAgICAgICAgZXZlbnRIYW5kbGVyXy5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJlUHJvY2Vzcyhjb25uZWN0aW9uQ29udGV4dCwgY2xpZW50Xyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXByb2Nlc3Nvcl8ucHJvY2VzcyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLAorICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KSB8fCAhaW5wdXRQcm90b2NvbF8udHJhbnNwb3J0LnBlZWsoKQorICAgICAgICApIHsKKyAgICAgICAgICAvLyBTb21ldGhpbmcgd2VudCBmdW5kYW1lbnRsbHkgd3Jvbmcgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvCisgICAgICAgICAgLy8gcHJvY2VzcywgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKKyAgICB9CisKKyAgICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgICAgZXZlbnRIYW5kbGVyXy5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sXywKKyAgICAgICAgb3V0cHV0UHJvdG9jb2xfKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgaW5wdXRQcm90b2NvbF8udHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgIGxvZ0Vycm9yKCJJbnB1dCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIG91dHB1dFByb3RvY29sXy50cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgbG9nRXJyb3IoIk91dHB1dCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudF8uY2xvc2UoKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgbG9nRXJyb3IoIkNsaWVudCBjbG9zZSBmYWlsZWQ6ICVzIiwgdHR4KTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgVFRyYW5zcG9ydCBjbGllbnRfOworICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbF87CisgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbF87CisgIFRQcm9jZXNzb3IgcHJvY2Vzc29yXzsKKyAgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXJfOworfQorCit1bml0dGVzdCB7CisgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5zZXJ2ZXI7CisgIHRlc3RTZXJ2ZUNhbmNlbCFUVGhyZWFkZWRTZXJ2ZXIoKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0ZTE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5iYXNlOworCitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworLyoqCisgKiBTb21lIGtpbmQgb2YgSS9PIGRldmljZSBlbmFibGluZyBzZXJ2ZXJzIHRvIGxpc3RlbiBmb3IgaW5jb21pbmcgY2xpZW50CisgKiBjb25uZWN0aW9ucyBhbmQgY29tbXVuaWNhdGUgd2l0aCB0aGVtIHZpYSBhIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICovCitpbnRlcmZhY2UgVFNlcnZlclRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBTdGFydHMgbGlzdGVuaW5nIGZvciBzZXJ2ZXIgY29ubmVjdGlvbnMuCisgICAqCisgICAqIEp1c3QgYXMgc2ltbGlhciBmdW5jdGlvbnMgY29tbW9ubHkgZm91bmQgaW4gc29ja2V0IGxpYnJhcmllcywgdGhpcworICAgKiBmdW5jdGlvbiBkb2VzIG5vdCBibG9jay4KKyAgICoKKyAgICogSWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGxpc3RlbmluZywgbm90aGluZyBoYXBwZW5zLgorICAgKgorICAgKiBUaHJvd3M6IFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gaWYgbGlzdGVuaW5nIGZhaWxlZCBvciB0aGUgdHJhbnNwb3J0CisgICAqICAgd2FzIGFscmVhZHkgbGlzdGVuaW5nLgorICAgKi8KKyAgdm9pZCBsaXN0ZW4oKTsKKworICAvKioKKyAgICogQ2xvc2VzIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0LCBjYXVzaW5nIGl0IHRvIHN0b3AgbGlzdGVuaW5nLgorICAgKgorICAgKiBUaHJvd3M6IFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIHRyYW5zcG9ydCB3YXMgbm90IGxpc3RlbmluZy4KKyAgICovCisgIHZvaWQgY2xvc2UoKTsKKworICAvKioKKyAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGlzIGN1cnJlbnRseSBsaXN0ZW5pbmcuCisgICAqLworICBib29sIGlzTGlzdGVuaW5nKCkgQHByb3BlcnR5OworCisgIC8qKgorICAgKiBBY2NlcHRzIGEgY2xpZW50IGNvbm5lY3Rpb24gYW5kIHJldHVybnMgYW4gb3BlbmVkIFRUcmFuc3BvcnQgZm9yIGl0LAorICAgKiBuZXZlciByZXR1cm5pbmcgbnVsbC4KKyAgICoKKyAgICogQmxvY2tzIHVudGlsIGEgY2xpZW50IGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgY2FuY2VsbGF0aW9uID0gSWYgdHJpZ2dlcmVkLCByZXF1ZXN0cyB0aGUgY2FsbCB0byBzdG9wIGJsb2NraW5nIGFuZAorICAgKiAgICAgcmV0dXJuIHdpdGggYSBUQ2FuY2VsbGVkRXhjZXB0aW9uLiBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8KKyAgICogICAgIGlnbm9yZSB0aGlzIGlmIHRoZXkgY2Fubm90IHByb3ZpZGUgYSByZWFzb25hYmxlLgorICAgKgorICAgKiBUaHJvd3M6IFRTZXJ2ZXJUcmFuc3BvcnRFeGNlcHRpb24gaWYgYWNjZXB0aW5nIGZhaWxlZCwKKyAgICogICBUQ2FuY2VsbGVkRXhjZXB0aW9uIGlmIGl0IHdhcyBjYW5jZWxsZWQuCisgICAqLworICBUVHJhbnNwb3J0IGFjY2VwdChUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIG91dCAocmVzdWx0KSB7CisgICAgYXNzZXJ0KHJlc3VsdCAhaXMgbnVsbCk7CisgIH0KK30KKworLyoqCisgKiBTZXJ2ZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbi4KKyAqLworY2xhc3MgVFNlcnZlclRyYW5zcG9ydEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvKioKKyAgICogRXJyb3IgY29kZXMgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGV4Y2VwdGlvbnMuCisgICAqLworICBlbnVtIFR5cGUgeworICAgIC8vLworICAgIFVOS05PV04sCisKKyAgICAvLy8gVGhlIHNlcnZlciBzb2NrZXQgaXMgbm90IGxpc3RlbmluZywgYnV0IGV4Y2VwdGVkIHRvIGJlLgorICAgIE5PVF9MSVNURU5JTkcsCisKKyAgICAvLy8gVGhlIHNlcnZlciBzb2NrZXQgaXMgYWxyZWFkeSBsaXN0ZW5pbmcsIGJ1dCBleHBlY3RlZCBub3QgdG8gYmUuCisgICAgQUxSRUFEWV9MSVNURU5JTkcsCisKKyAgICAvLy8gQW4gb3BlcmF0aW9uIG9uIHRoZSBwcmltYXJ5IHVuZGVybHlpbmcgcmVzb3VyY2UsIGUuZy4gYSBzb2NrZXQgdXNlZAorICAgIC8vLyBmb3IgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLCBmYWlsZWQuCisgICAgUkVTT1VSQ0VfRkFJTEVECisgIH0KKworICAvLy8KKyAgdGhpcyhUeXBlIHR5cGUsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18sIFRocm93YWJsZSBuZXh0ID0gbnVsbCkgeworICAgIHRoaXMoZXJyb3JNc2codHlwZSksIHR5cGUsIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICB0aGlzKG1zZywgVHlwZS5VTktOT1dOLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIC8vLworICBUeXBlIHR5cGUoKSBjb25zdCBub3Rocm93IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKK3Byb3RlY3RlZDoKKyAgVHlwZSB0eXBlXzsKKworcHJpdmF0ZToKKyAgc3RyaW5nIGVycm9yTXNnKFR5cGUgdHlwZSkgeworICAgIHN0cmluZyBtc2cgPSAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogIjsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgVHlwZS5VTktOT1dOOiBtc2cgfj0gIlVua25vd24gc2VydmVyIHRyYW5zcG9ydCBleGNlcHRpb24iOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZS5OT1RfTElTVEVOSU5HOiBtc2cgfj0gIlNlcnZlciB0cmFuc3BvcnQgbm90IGxpc3RlbmluZyI7IGJyZWFrOworICAgICAgY2FzZSBUeXBlLkFMUkVBRFlfTElTVEVOSU5HOiBtc2cgfj0gIlNlcnZlciB0cmFuc3BvcnQgYWxyZWFkeSBsaXN0ZW5pbmciOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZS5SRVNPVVJDRV9GQUlMRUQ6IG1zZyB+PSAiQW4gdW5kZXJseWluZyByZXNvdXJjZSBmYWlsZWQiOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IG1zZyB+PSAiKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBtc2c7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NvY2tldC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmQ4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvc29ja2V0LmQKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CisKK2ltcG9ydCBjb3JlLnRocmVhZCA6IGR1ciwgRHVyYXRpb24sIFRocmVhZDsKK2ltcG9ydCBjb3JlLnN0ZGMuc3RyaW5nIDogc3RyZXJyb3I7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0LCB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0OworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnV0aWwuYXdhaXRhYmxlOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKworcHJpdmF0ZSBhbGlhcyBUU2VydmVyVHJhbnNwb3J0RXhjZXB0aW9uIFNURTsKKworLyoqCisgKiBTZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQuCisgKgorICogTWFwcyB0byBzdGQuc29ja2V0IGxpc3RlbigpL2FjY2VwdCgpOyBvbmx5IHByb3ZpZGVzIFRDUC9JUCBzb2NrZXRzIChpLmUuIG5vCisgKiBVbml4IHNvY2tldHMpIGZvciBub3csIGJlY2F1c2UgdGhleSBhcmUgbm90IHN1cHBvcnRlZCBpbiBzdGQuc29ja2V0LgorICovCitjbGFzcyBUU2VydmVyU29ja2V0IDogVFNlcnZlclRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcG9ydCA9IFRoZSBUQ1AgcG9ydCB0byBsaXN0ZW4gYXQgKGhvc3QgaXMgYWx3YXlzIDAuMC4wLjApLgorICAgKiAgIHNlbmRUaW1lb3V0ID0gVGhlIHNvY2tldCBzZW5kaW5nIHRpbWVvdXQuCisgICAqICAgcmVjdlRpbW91dCA9IFRoZSBzb2NrZXQgcmVjZWl2aW5nIHRpbWVvdXQuCisgICAqLworICB0aGlzKHVzaG9ydCBwb3J0LCBEdXJhdGlvbiBzZW5kVGltZW91dCA9IGR1ciEiaG5zZWNzIigwKSwKKyAgICBEdXJhdGlvbiByZWN2VGltZW91dCA9IGR1ciEiaG5zZWNzIigwKSkKKyAgeworICAgIHBvcnRfID0gcG9ydDsKKyAgICBzZW5kVGltZW91dF8gPSBzZW5kVGltZW91dDsKKyAgICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKKworICAgIGNhbmNlbGxhdGlvbk5vdGlmaWVyXyA9IG5ldyBUU29ja2V0Tm90aWZpZXI7CisKKyAgICBzb2NrZXRTZXRfID0gbmV3IFNvY2tldFNldDsKKyAgfQorCisgIC8vLyBUaGUgcG9ydCB0aGUgc2VydmVyIHNvY2tldCBsaXN0ZW5zIGF0LgorICB1c2hvcnQgcG9ydCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvcnRfOworICB9CisKKyAgLy8vIFRoZSBzb2NrZXQgc2VuZGluZyB0aW1lb3V0LCB6ZXJvIHRvIGJsb2NrIGluZmluaXRlbHkuCisgIHZvaWQgc2VuZFRpbWVvdXQoRHVyYXRpb24gc2VuZFRpbWVvdXQpIEBwcm9wZXJ0eSB7CisgICAgc2VuZFRpbWVvdXRfID0gc2VuZFRpbWVvdXQ7CisgIH0KKworICAvLy8gVGhlIHNvY2tldCByZWNlaXZpbmcgdGltZW91dCwgemVybyB0byBibG9jayBpbmZpbml0ZWx5LgorICB2b2lkIHJlY3ZUaW1lb3V0KER1cmF0aW9uIHJlY3ZUaW1lb3V0KSBAcHJvcGVydHkgeworICAgIHJlY3ZUaW1lb3V0XyA9IHJlY3ZUaW1lb3V0OworICB9CisKKyAgLy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsaXN0ZW5pbmcgcmV0cmllcyBpZiBpdCBmYWlscy4KKyAgdm9pZCByZXRyeUxpbWl0KHVzaG9ydCByZXRyeUxpbWl0KSBAcHJvcGVydHkgeworICAgIHJldHJ5TGltaXRfID0gcmV0cnlMaW1pdDsKKyAgfQorCisgIC8vLyBUaGUgZGVsYXkgYmV0d2VlbiBhIGxpc3RlbmluZyBhdHRlbXB0IGZhaWxpbmcgYW5kIHJldHJ5aW5nIGl0LgorICB2b2lkIHJldHJ5RGVsYXkoRHVyYXRpb24gcmV0cnlEZWxheSkgQHByb3BlcnR5IHsKKyAgICByZXRyeURlbGF5XyA9IHJldHJ5RGVsYXk7CisgIH0KKworICAvLy8gVGhlIHNpemUgb2YgdGhlIFRDUCBzZW5kIGJ1ZmZlciwgaW4gYnl0ZXMuCisgIHZvaWQgdGNwU2VuZEJ1ZmZlcihpbnQgdGNwU2VuZEJ1ZmZlcikgQHByb3BlcnR5IHsKKyAgICB0Y3BTZW5kQnVmZmVyXyA9IHRjcFNlbmRCdWZmZXI7CisgIH0KKworICAvLy8gVGhlIHNpemUgb2YgdGhlIFRDUCByZWNlaXZpbmcgYnVmZmVyLCBpbiBieXRlcy4KKyAgdm9pZCB0Y3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKSBAcHJvcGVydHkgeworICAgIHRjcFJlY3ZCdWZmZXJfID0gdGNwUmVjdkJ1ZmZlcjsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRvIGxpc3RlbiBvbiBJUHY2IG9ubHksIGlmIElQdjYgc3VwcG9ydCBpcyBkZXRlY3RlZAorICAvLy8gKGRlZmF1bHQ6IGZhbHNlKS4KKyAgdm9pZCBpcHY2T25seShib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIGlwdjZPbmx5XyA9IHZhbHVlOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBsaXN0ZW4oKSB7CisgICAgZW5mb3JjZSghaXNMaXN0ZW5pbmcsIG5ldyBTVEUoU1RFLlR5cGUuQUxSRUFEWV9MSVNURU5JTkcpKTsKKworICAgIHNlcnZlclNvY2tldF8gPSBtYWtlU29ja2V0QW5kTGlzdGVuKHBvcnRfLCBBQ0NFUFRfQkFDS0xPRywgcmV0cnlMaW1pdF8sCisgICAgICByZXRyeURlbGF5XywgdGNwU2VuZEJ1ZmZlcl8sIHRjcFJlY3ZCdWZmZXJfLCBpcHY2T25seV8pOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBlbmZvcmNlKGlzTGlzdGVuaW5nLCBuZXcgU1RFKFNURS5UeXBlLk5PVF9MSVNURU5JTkcpKTsKKworICAgIHNlcnZlclNvY2tldF8uc2h1dGRvd24oU29ja2V0U2h1dGRvd24uQk9USCk7CisgICAgc2VydmVyU29ja2V0Xy5jbG9zZSgpOworICAgIHNlcnZlclNvY2tldF8gPSBudWxsOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc0xpc3RlbmluZygpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHNlcnZlclNvY2tldF8gIWlzIG51bGw7CisgIH0KKworICAvLy8gTnVtYmVyIG9mIGNvbm5lY3Rpb25zIGxpc3RlbigpIGJhY2tsb2dzLgorICBlbnVtIEFDQ0VQVF9CQUNLTE9HID0gMTAyNDsKKworICBvdmVycmlkZSBUVHJhbnNwb3J0IGFjY2VwdChUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpIHsKKyAgICBlbmZvcmNlKGlzTGlzdGVuaW5nLCBuZXcgU1RFKFNURS5UeXBlLk5PVF9MSVNURU5JTkcpKTsKKworICAgIGlmIChjYW5jZWxsYXRpb24pIGNhbmNlbGxhdGlvbk5vdGlmaWVyXy5hdHRhY2goY2FuY2VsbGF0aW9uLnRyaWdnZXJpbmcpOworICAgIHNjb3BlIChleGl0KSBpZiAoY2FuY2VsbGF0aW9uKSBjYW5jZWxsYXRpb25Ob3RpZmllcl8uZGV0YWNoKCk7CisKKworICAgIC8vIFRvbyBtYW55IEVJTlRScyBpcyBhIGZhdWx0IGNvbmRpdGlvbiBhbmQgd291bGQgbmVlZCB0byBiZSBoYW5kbGVkCisgICAgLy8gbWFudWFsbHkgYnkgb3VyIGNhbGxlciwgYnV0IHdlIGNhbiB0b2xlcmF0ZSBhIGNlcnRhaW4gbnVtYmVyLgorICAgIGVudW0gTUFYX0VJTlRSUyA9IDEwOworICAgIHVpbnQgbnVtRWludHJzOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHNvY2tldFNldF8ucmVzZXQoKTsKKyAgICAgIHNvY2tldFNldF8uYWRkKHNlcnZlclNvY2tldF8pOworICAgICAgc29ja2V0U2V0Xy5hZGQoY2FuY2VsbGF0aW9uTm90aWZpZXJfLnNvY2tldCk7CisKKyAgICAgIGF1dG8gcmV0ID0gU29ja2V0LnNlbGVjdChzb2NrZXRTZXRfLCBudWxsLCBudWxsKTsKKyAgICAgIGVuZm9yY2UocmV0ICE9IDAsIG5ldyBTVEUoIlNvY2tldC5zZWxlY3QoKSByZXR1cm5lZCAwLiIsCisgICAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCkpOworCisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAvLyBTZWxlY3QgaXRzZWxmIGZhaWxlZCwgY2hlY2sgaWYgaXQgd2FzIGp1c3QgZHVlIHRvIGFuIGludGVycnVwdGVkCisgICAgICAgIC8vIHN5c2NhbGwuCisgICAgICAgIGlmIChnZXRTb2NrZXRFcnJubygpID09IElOVEVSUlVQVEVEX0VSUk5PKSB7CisgICAgICAgICAgaWYgKG51bUVpbnRycysrIDwgTUFYX0VJTlRSUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTVEUoIlNvY2tldC5zZWxlY3QoKSB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgKEVJTlRSKSAiIH4KKyAgICAgICAgICAgICAgIm1vcmUgdGhhbiAiIH4gdG8hc3RyaW5nKE1BWF9FSU5UUlMpIH4gIiB0aW1lcy4iLAorICAgICAgICAgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQKKyAgICAgICAgICAgICk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBTVEUoIlVua25vd24gZXJyb3Igb24gU29ja2V0LnNlbGVjdCgpOiAiIH4KKyAgICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhnZXRTb2NrZXRFcnJubygpKSwgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENoZWNrIGZvciBhIHBpbmcgb24gdGhlIGludGVycnVwdCBzb2NrZXQuCisgICAgICAgIGlmIChzb2NrZXRTZXRfLmlzU2V0KGNhbmNlbGxhdGlvbk5vdGlmaWVyXy5zb2NrZXQpKSB7CisgICAgICAgICAgY2FuY2VsbGF0aW9uLnRocm93SWZUcmlnZ2VyZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgYWN0dWFsIHNlcnZlciBzb2NrZXQgaGF2aW5nIGEgY29ubmVjdGlvbiB3YWl0aW5nLgorICAgICAgICBpZiAoc29ja2V0U2V0Xy5pc1NldChzZXJ2ZXJTb2NrZXRfKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGF1dG8gY2xpZW50ID0gY3JlYXRlVFNvY2tldChzZXJ2ZXJTb2NrZXRfLmFjY2VwdCgpKTsKKyAgICAgIGNsaWVudC5zZW5kVGltZW91dCA9IHNlbmRUaW1lb3V0XzsKKyAgICAgIGNsaWVudC5yZWN2VGltZW91dCA9IHJlY3ZUaW1lb3V0XzsKKyAgICAgIHJldHVybiBjbGllbnQ7CisgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBTVEUoIlVua25vd24gZXJyb3Igb24gYWNjZXB0aW5nOiAiIH4gdG8hc3RyaW5nKGUpLAorICAgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBBbGxvd3MgZGVyaXZlZCBjbGFzc2VzIHRvIGNyZWF0ZSBhIGRpZmZlcmVudCBUU29ja2V0IHR5cGUuCisgICAqLworICBUU29ja2V0IGNyZWF0ZVRTb2NrZXQoU29ja2V0IHNvY2tldCkgeworICAgIHJldHVybiBuZXcgVFNvY2tldChzb2NrZXQpOworICB9CisKK3ByaXZhdGU6CisgIHVzaG9ydCBwb3J0XzsKKyAgRHVyYXRpb24gc2VuZFRpbWVvdXRfOworICBEdXJhdGlvbiByZWN2VGltZW91dF87CisgIHVzaG9ydCByZXRyeUxpbWl0XzsKKyAgRHVyYXRpb24gcmV0cnlEZWxheV87CisgIHVpbnQgdGNwU2VuZEJ1ZmZlcl87CisgIHVpbnQgdGNwUmVjdkJ1ZmZlcl87CisgIGJvb2wgaXB2Nk9ubHlfOworCisgIFNvY2tldCBzZXJ2ZXJTb2NrZXRfOworICBUU29ja2V0Tm90aWZpZXIgY2FuY2VsbGF0aW9uTm90aWZpZXJfOworCisgIC8vIEtlZXAgc29ja2V0IHNldCBiZXR3ZWVuIGFjY2VwdCgpIGNhbGxzIHRvIGF2b2lkIHJlYWxsb2NhdGluZy4KKyAgU29ja2V0U2V0IHNvY2tldFNldF87Cit9CisKK1NvY2tldCBtYWtlU29ja2V0QW5kTGlzdGVuKHVzaG9ydCBwb3J0LCBpbnQgYmFja2xvZywgdXNob3J0IHJldHJ5TGltaXQsCisgIER1cmF0aW9uIHJldHJ5RGVsYXksIHVpbnQgdGNwU2VuZEJ1ZmZlciA9IDAsIHVpbnQgdGNwUmVjdkJ1ZmZlciA9IDAsCisgIGJvb2wgaXB2Nk9ubHkgPSBmYWxzZQorKSB7CisgIEFkZHJlc3MgbG9jYWxBZGRyOworICB0cnkgeworICAgIC8vIG51bGwgcmVwcmVzZW50cyB0aGUgd2lsZGNhcmQgYWRkcmVzcy4KKyAgICBhdXRvIGFkZHJJbmZvcyA9IGdldEFkZHJlc3NJbmZvKG51bGwsIHRvIXN0cmluZyhwb3J0KSwKKyAgICAgIEFkZHJlc3NJbmZvRmxhZ3MuUEFTU0lWRSwgU29ja2V0VHlwZS5TVFJFQU0sIFByb3RvY29sVHlwZS5UQ1ApOworICAgIGZvcmVhY2ggKGksIGFpOyBhZGRySW5mb3MpIHsKKyAgICAgIC8vIFByZWZlciB0byBiaW5kIHRvIElQdjYgYWRkcmVzc2VzLCBiZWNhdXNlIHRoZW4gSVB2NCBpcyBsaXN0ZW5lZCB0byBhcworICAgICAgLy8gd2VsbCwgYnV0IG5vdCB0aGUgb3RoZXIgd2F5IHJvdW5kLgorICAgICAgaWYgKGFpLmZhbWlseSA9PSBBZGRyZXNzRmFtaWx5LklORVQ2IHx8IGkgPT0gKGFkZHJJbmZvcy5sZW5ndGggLSAxKSkgeworICAgICAgICBsb2NhbEFkZHIgPSBhaS5hZGRyZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IGRldGVybWluZSBsb2NhbCBhZGRyZXNzIHRvIGxpc3RlbiBvbi4iLAorICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVELCBfX0ZJTEVfXywgX19MSU5FX18sIGUpOworICB9CisKKyAgU29ja2V0IHNvY2tldDsKKyAgdHJ5IHsKKyAgICBzb2NrZXQgPSBuZXcgU29ja2V0KGxvY2FsQWRkci5hZGRyZXNzRmFtaWx5LCBTb2NrZXRUeXBlLlNUUkVBTSwKKyAgICAgIFByb3RvY29sVHlwZS5UQ1ApOworICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgIHRocm93IG5ldyBTVEUoIkNvdWxkIG5vdCBjcmVhdGUgYWNjZXB0aW5nIHNvY2tldDogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgIH0KKworICB0cnkgeworICAgIHNvY2tldC5zZXRPcHRpb24oU29ja2V0T3B0aW9uTGV2ZWwuSVBWNiwgU29ja2V0T3B0aW9uLklQVjZfVjZPTkxZLCBpcHY2T25seSk7CisgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgLy8gVGhpcyBpcyBzb21ld2hhdCBleHBlY3RlZCBvbiBvbGRlciBzeXN0ZW1zIChlLmcuIHByZS1WaXN0YSBXaW5kb3dzKSwKKyAgICAvLyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGUgSVBWNl9WNk9OTFkgZmxhZyB5ZXQuIFJhY3kgZmxhZyBqdXN0IHRvIGF2b2lkCisgICAgLy8gbG9nIHNwZXcgaW4gdW5pdCB0ZXN0cy4KKyAgICBzaGFyZWQgc3RhdGljIHdhcm5lZCA9IGZhbHNlOworICAgIGlmICghd2FybmVkKSB7CisgICAgICBsb2dFcnJvcigiQ291bGQgbm90IHNldCBJUFY2X1Y2T05MWSBzb2NrZXQgb3B0aW9uOiAlcyIsIGUpOworICAgICAgd2FybmVkID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBhbGlhcyBTb2NrZXRPcHRpb25MZXZlbC5TT0NLRVQgbHZsU29jazsKKworICAvLyBQcmV2ZW50IDIgbWF4aW11bSBzZWdlbWVudCBsaWZldGltZSBkZWxheSBvbiBhY2NlcHQuCisgIHRyeSB7CisgICAgc29ja2V0LnNldE9wdGlvbihsdmxTb2NrLCBTb2NrZXRPcHRpb24uUkVVU0VBRERSLCB0cnVlKTsKKyAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICB0aHJvdyBuZXcgU1RFKCJDb3VsZCBub3Qgc2V0IFJFVVNFQUREUiBzb2NrZXQgb3B0aW9uOiAiIH4gdG8hc3RyaW5nKGUpLAorICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgfQorCisgIC8vIFNldCBUQ1AgYnVmZmVyIHNpemVzLgorICBpZiAodGNwU2VuZEJ1ZmZlciA+IDApIHsKKyAgICB0cnkgeworICAgICAgc29ja2V0LnNldE9wdGlvbihsdmxTb2NrLCBTb2NrZXRPcHRpb24uU05EQlVGLCB0Y3BTZW5kQnVmZmVyKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IHNldCBzb2NrZXQgc2VuZCBidWZmZXIgc2l6ZTogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgICAgU1RFLlR5cGUuUkVTT1VSQ0VfRkFJTEVEKTsKKyAgICB9CisgIH0KKworICBpZiAodGNwUmVjdkJ1ZmZlciA+IDApIHsKKyAgICB0cnkgeworICAgICAgc29ja2V0LnNldE9wdGlvbihsdmxTb2NrLCBTb2NrZXRPcHRpb24uUkNWQlVGLCB0Y3BSZWN2QnVmZmVyKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IHNldCByZWNlaXZlIHNlbmQgYnVmZmVyIHNpemU6ICIgfiB0byFzdHJpbmcoZSksCisgICAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgICAgfQorICB9CisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmIHRvIGF2b2lkIGJsb2NraW5nIG9uIHNvY2tldCBjbG9zZS4KKyAgdHJ5IHsKKyAgICBMaW5nZXIgbDsKKyAgICBsLm9uID0gMDsKKyAgICBsLnRpbWUgPSAwOworICAgIHNvY2tldC5zZXRPcHRpb24obHZsU29jaywgU29ja2V0T3B0aW9uLkxJTkdFUiwgbCk7CisgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IGRpc2FibGUgc29ja2V0IGxpbmdlcjogIiB+IHRvIXN0cmluZyhlKSwKKyAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgIH0KKworICAvLyBTZXQgVENQX05PREVMQVkuCisgIHRyeSB7CisgICAgc29ja2V0LnNldE9wdGlvbihTb2NrZXRPcHRpb25MZXZlbC5UQ1AsIFNvY2tldE9wdGlvbi5UQ1BfTk9ERUxBWSwgdHJ1ZSk7CisgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IFNURSgiQ291bGQgbm90IGRpc2FibGUgTmFnbGUncyBhbGdvcml0aG06ICIgfiB0byFzdHJpbmcoZSksCisgICAgICBTVEUuVHlwZS5SRVNPVVJDRV9GQUlMRUQpOworICB9CisKKyAgdXNob3J0IHJldHJpZXM7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdHJ5IHsKKyAgICAgIHNvY2tldC5iaW5kKGxvY2FsQWRkcik7CisgICAgICBicmVhazsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24pIHt9CisKKyAgICAvLyBJZiBiaW5kKCkgd29ya2VkLCB3ZSBicmVha2VkIG91dHNpZGUgdGhlIGxvb3AgYWJvdmUuCisgICAgcmV0cmllcysrOworICAgIGlmIChyZXRyaWVzIDwgcmV0cnlMaW1pdCkgeworICAgICAgVGhyZWFkLnNsZWVwKHJldHJ5RGVsYXkpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgU1RFKHRleHQoIkNvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3M6ICIsIGxvY2FsQWRkciksCisgICAgICAgIFNURS5UeXBlLlJFU09VUkNFX0ZBSUxFRCk7CisgICAgfQorICB9CisKKyAgc29ja2V0Lmxpc3RlbihiYWNrbG9nKTsKKyAgcmV0dXJuIHNvY2tldDsKK30KKwordW5pdHRlc3QgeworICAvLyBUZXN0IGludGVycnVwdCgpLgorICB7CisgICAgYXV0byBzb2NrID0gbmV3IFRTZXJ2ZXJTb2NrZXQoMCk7CisgICAgc29jay5saXN0ZW4oKTsKKyAgICBzY29wZSAoZXhpdCkgc29jay5jbG9zZSgpOworCisgICAgYXV0byBjYW5jZWxsYXRpb24gPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbjsKKworICAgIGF1dG8gaW50VGhyZWFkID0gbmV3IFRocmVhZCh7CisgICAgICAvLyBTbGVlcCBmb3IgYSBiaXQgdW50aWwgdGhlIHNvY2tldCBpcyBhY2NlcHRpbmcuCisgICAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoNTApKTsKKyAgICAgIGNhbmNlbGxhdGlvbi50cmlnZ2VyKCk7CisgICAgfSk7CisgICAgaW50VGhyZWFkLnN0YXJ0KCk7CisKKyAgICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgICBhc3NlcnRUaHJvd24hVENhbmNlbGxlZEV4Y2VwdGlvbihzb2NrLmFjY2VwdChjYW5jZWxsYXRpb24pKTsKKyAgfQorCisgIC8vIFRlc3QgcmVjZWl2ZSgpIHRpbWVvdXQgb24gYWNjZXB0ZWQgY2xpZW50IHNvY2tldHMuCisgIHsKKyAgICBpbW11dGFibGUgcG9ydCA9IDExMTIyOworICAgIGF1dG8gdGltZW91dCA9IGR1ciEibXNlY3MiKDUwMCk7CisgICAgYXV0byBzZXJ2ZXJTb2NrID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgdGltZW91dCwgdGltZW91dCk7CisgICAgc2VydmVyU29jay5saXN0ZW4oKTsKKyAgICBzY29wZSAoZXhpdCkgc2VydmVyU29jay5jbG9zZSgpOworCisgICAgYXV0byBjbGllbnRTb2NrID0gbmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpOworICAgIGNsaWVudFNvY2sub3BlbigpOworICAgIHNjb3BlIChleGl0KSBjbGllbnRTb2NrLmNsb3NlKCk7CisKKyAgICBzaGFyZWQgYm9vbCBoYXNUaW1lZE91dDsKKyAgICBhdXRvIHJlY3ZUaHJlYWQgPSBuZXcgVGhyZWFkKHsKKyAgICAgIGF1dG8gc29jayA9IHNlcnZlclNvY2suYWNjZXB0KCk7CisgICAgICB1Ynl0ZVsxXSBkYXRhOworICAgICAgdHJ5IHsKKyAgICAgICAgc29jay5yZWFkKGRhdGEpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmIChlLnR5cGUgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLlRJTUVEX09VVCkgeworICAgICAgICAgIGhhc1RpbWVkT3V0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbXBvcnQgc3RkLnN0ZGlvOworICAgICAgICAgIHN0ZGVyci53cml0ZWxuKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgcmVjdlRocmVhZC5pc0RhZW1vbiA9IHRydWU7CisgICAgcmVjdlRocmVhZC5zdGFydCgpOworCisgICAgLy8gV2FpdCBmb3IgdGhlIHRpbWVvdXQsIHdpdGggYSBsaXR0bGUgYml0IG9mIHNwYXJlIHRpbWUuCisgICAgVGhyZWFkLnNsZWVwKHRpbWVvdXQgKyBkdXIhIm1zZWNzIig1MCkpOworICAgIGVuZm9yY2UoaGFzVGltZWRPdXQsCisgICAgICAiQ2xpZW50IHNvY2tldCByZWNlaXZlKCkgYmxvY2tlZCBmb3IgbG9uZ2VyIHRoYW4gcmVjdlRpbWVvdXQuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9zc2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9zc2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQ5ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L3NzbC5kCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zc2w7CisKK2ltcG9ydCBzdGQuZGF0ZXRpbWUgOiBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuc29ja2V0IDogU29ja2V0OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CisKKy8qKgorICogQSBzZXJ2ZXIgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHVzaW5nIFNTTC1lbmNyeXB0ZWQgc29ja2V0cy4KKyAqCisgKiBOb3RlOgorICogT24gUG9zaXggc3lzdGVtcyB3aGljaCBkbyBub3QgaGF2ZSB0aGUgQlNELXNwZWNpZmljIFNPX05PU0lHUElQRSBmbGFnLCB5b3UKKyAqIG1pZ2h0IHdhbnQgdG8gaWdub3JlIHRoZSBTSUdQSVBFIHNpZ25hbCwgYXMgT3BlblNTTCBtaWdodCB0cnkgdG8gd3JpdGUgdG8KKyAqIGEgY2xvc2VkIHNvY2tldCBpZiB0aGUgcGVlciBkaXNjb25uZWN0cyBhYnJ1cHRseToKKyAqIC0tLQorICogaW1wb3J0IGNvcmUuc3RkYy5zaWduYWw7CisgKiBpbXBvcnQgY29yZS5zeXMucG9zaXguc2lnbmFsOworICogc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICogLS0tCisgKgorICogU2VlOiB0aHJpZnQudHJhbnNwb3J0LnNzbC4KKyAqLworY2xhc3MgVFNTTFNlcnZlclNvY2tldCA6IFRTZXJ2ZXJTb2NrZXQgeworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBUU1NMU2VydmVyU29ja2V0LgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgcG9ydCA9IFRoZSBwb3J0IG9uIHdoaWNoIHRvIGxpc3Rlbi4KKyAgICogICBzc2xDb250ZXh0ID0gVGhlIFRTU0xDb250ZXh0IHRvIHVzZSBmb3IgY3JlYXRpbmcgY2xpZW50CisgICAqICAgICBzb2NrZXRzLiBNdXN0IGJlIGluIHNlcnZlci1zaWRlIG1vZGUuCisgICAqLworICB0aGlzKHVzaG9ydCBwb3J0LCBUU1NMQ29udGV4dCBzc2xDb250ZXh0KSB7CisgICAgc3VwZXIocG9ydCk7CisgICAgc2V0U1NMQ29udGV4dChzc2xDb250ZXh0KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IFRTU0xTZXJ2ZXJTb2NrZXQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwb3J0ID0gVGhlIHBvcnQgb24gd2hpY2ggdG8gbGlzdGVuLgorICAgKiAgIHNlbmRUaW1lb3V0ID0gVGhlIHNlbmQgdGltZW91dCB0byBzZXQgb24gdGhlIGNsaWVudCBzb2NrZXRzLgorICAgKiAgIHJlY3ZUaW1lb3V0ID0gVGhlIHJlY2VpdmUgdGltZW91dCB0byBzZXQgb24gdGhlIGNsaWVudCBzb2NrZXRzLgorICAgKiAgIHNzbENvbnRleHQgPSBUaGUgVFNTTENvbnRleHQgdG8gdXNlIGZvciBjcmVhdGluZyBjbGllbnQKKyAgICogICAgIHNvY2tldHMuIE11c3QgYmUgaW4gc2VydmVyLXNpZGUgbW9kZS4KKyAgICovCisgIHRoaXModXNob3J0IHBvcnQsIER1cmF0aW9uIHNlbmRUaW1lb3V0LCBEdXJhdGlvbiByZWN2VGltZW91dCwKKyAgICBUU1NMQ29udGV4dCBzc2xDb250ZXh0KQorICB7CisgICAgc3VwZXIocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KTsKKyAgICBzZXRTU0xDb250ZXh0KHNzbENvbnRleHQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgb3ZlcnJpZGUgVFNvY2tldCBjcmVhdGVUU29ja2V0KFNvY2tldCBzb2NrZXQpIHsKKyAgICByZXR1cm4gbmV3IFRTU0xTb2NrZXQoc3NsQ29udGV4dF8sIHNvY2tldCk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBzZXRTU0xDb250ZXh0KFRTU0xDb250ZXh0IHNzbENvbnRleHQpIHsKKyAgICBlbmZvcmNlKHNzbENvbnRleHQuc2VydmVyU2lkZSwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiTmVlZCBzZXJ2ZXItc2lkZSBTU0wgc29ja2V0IGZhY3RvcnkgZm9yIFRTU0xTZXJ2ZXJTb2NrZXQiKSk7CisgICAgc3NsQ29udGV4dF8gPSBzc2xDb250ZXh0OworICB9CisKKyAgVFNTTENvbnRleHQgc3NsQ29udGV4dF87Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3NmE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2Jhc2UuZApAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworaW1wb3J0IGNvcmUuc3RkYy5zdHJpbmcgOiBzdHJlcnJvcjsKK2ltcG9ydCBzdGQuY29udiA6IHRleHQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CisKKy8qKgorICogQW4gZW50aXR5IGRhdGEgY2FuIGJlIHJlYWQgZnJvbSBhbmQvb3Igd3JpdHRlbiB0by4KKyAqCisgKiBBIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gbWF5IGNhcGFibGUgb2YgZWl0aGVyIHJlYWRpbmcgb3Igd3JpdGluZywgYnV0CisgKiBub3QgbmVjZXNzYXJpbHkgYm90aC4KKyAqLworaW50ZXJmYWNlIFRUcmFuc3BvcnQgeworICAvKioKKyAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgKgorICAgKiBJZiBhIHRyYW5zcG9ydCBpcyBjbG9zZWQsIGl0IGNhbiBiZSBvcGVuZWQgYnkgY2FsbGluZyBvcGVuKCksIGFuZCB2aWNlCisgICAqIHZlcnNhIGZvciBjbG9zZSgpLgorICAgKgorICAgKiBXaGlsZSBhIHRyYW5zcG9ydCBzaG91bGQgYWx3YXlzIGJlIG9wZW4gd2hlbiB0cnlpbmcgdG8gcmVhZC93cml0ZSBkYXRhLAorICAgKiB0aGUgcmVsYXRlZCBmdW5jdGlvbnMgZG8gbm90IG5lY2Vzc2FyaWx5IGZhaWwgd2hlbiBjYWxsZWQgZm9yIGEgY2xvc2VkCisgICAqIHRyYW5zcG9ydC4gU2l0dWF0aW9ucyBsaWtlIHRoaXMgY291bGQgb2NjdXIgZS5nLiB3aXRoIGEgd3JhcHBlcgorICAgKiB0cmFuc3BvcnQgd2hpY2ggYnVmZmVycyBkYXRhIHdoZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGhhcyBhbHJlYWR5CisgICAqIGJlZW4gY2xvc2VkIChwb3NzaWJseSBiZWNhdXNlIHRoZSBjb25uZWN0aW9uIHdhcyBhYnJ1cHRseSBjbG9zZWQpLCBidXQKKyAgICogdGhlcmUgaXMgc3RpbGwgZGF0YSBsZWZ0IHRvIGJlIHJlYWQgaW4gdGhlIGJ1ZmZlcnMuIFRoaXMgY2hvaWNlIGhhcyBiZWVuCisgICAqIG1hZGUgdG8gc2ltcGxpZnkgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucywgaW4gdGVybXMgb2YgYm90aCAgY29kZQorICAgKiBjb21wbGV4aXR5IGFuZCBydW50aW1lIG92ZXJoZWFkLgorICAgKi8KKyAgYm9vbCBpc09wZW4oKSBAcHJvcGVydHk7CisKKyAgLyoqCisgICAqIFRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHJlYWQgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGlzCisgICAqIHN0aWxsIG9wZW4uCisgICAqCisgICAqIEEgdHlwaWNhbCB1c2UgY2FzZSB3b3VsZCBiZSBhIHNlcnZlciBjaGVja2luZyBpZiBpdCBzaG91bGQgcHJvY2VzcworICAgKiBhbm90aGVyIHJlcXVlc3Qgb24gdGhlIHRyYW5zcG9ydC4KKyAgICovCisgIGJvb2wgcGVlaygpOworCisgIC8qKgorICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9ucy4KKyAgICoKKyAgICogSWYgdGhlIHRyYW5zcG9ydCBpcyBhbHJlYWR5IG9wZW4sIG5vdGhpbmcgaGFwcGVucy4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIG9wZW5pbmcgZmFpbHMuCisgICAqLworICB2b2lkIG9wZW4oKTsKKworICAvKioKKyAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgICAqCisgICAqIElmIHRoZSB0cmFuc3BvcnQgaXMgbm90IG9wZW4sIG5vdGhpbmcgaGFwcGVucy4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNsb3NpbmcgZmFpbHMuCisgICAqLworICB2b2lkIGNsb3NlKCk7CisKKyAgLyoqCisgICAqIEF0dGVtcHRzIHRvIGZpbGwgdGhlIGdpdmVuIGJ1ZmZlciBieSByZWFkaW5nIGRhdGEuCisgICAqCisgICAqIEZvciBwb3RlbnRpYWxseSBibG9ja2luZyBkYXRhIHNvdXJjZXMgKGUuZy4gc29ja2V0cyksIHJlYWQoKSB3aWxsIG9ubHkKKyAgICogYmxvY2sgaWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgYXQgYWxsLiBJZiB0aGVyZSBpcyBzb21lIGRhdGEgYXZhaWxhYmxlLAorICAgKiBidXQgd2FpdGluZyBmb3IgbmV3IGRhdGEgdG8gYXJyaXZlIHdvdWxkIGJlIHJlcXVpcmVkIHRvIGZpbGwgdGhlIHdob2xlCisgICAqIGJ1ZmZlciwgdGhlIHJlYWRpbHkgYXZhaWxhYmxlIGRhdGEgd2lsbCBiZSBpbW1lZGlhdGVseSByZXR1cm5lZCDigJMgdXNlCisgICAqIHJlYWRBbGwoKSBpZiB5b3Ugd2FudCB0byB3YWl0IHVudGlsIHRoZSB3aG9sZSBidWZmZXIgaXMgZmlsbGVkLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmID0gU2xpY2UgdG8gdXNlIGFzIGJ1ZmZlci4KKyAgICoKKyAgICogUmV0dXJuczogSG93IG1hbnkgYnl0ZXMgd2VyZSBhY3R1YWxseSByZWFkCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1Zik7CisKKyAgLyoqCisgICAqIEZpbGxzIHRoZSBnaXZlbiBidWZmZXIgYnkgcmVhZGluZyBkYXRhIGludG8gaXQsIGZhaWxpbmcgaWYgbm90IGVub3VnaAorICAgKiBkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IFNsaWNlIHRvIHVzZSBhcyBidWZmZXIuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBpbnN1ZmZpY2llbnQgZGF0YSBpcyBhdmFpbGFibGUgb3IgcmVhZGluZworICAgKiAgIGZhaWxzIGFsdG9nZXRoZXIuCisgICAqLworICB2b2lkIHJlYWRBbGwodWJ5dGVbXSBidWYpOworCisgIC8qKgorICAgKiBNdXN0IGJlIGNhbGxlZCBieSBjbGllbnRzIHdoZW4gcmVhZCBpcyBjb21wbGV0ZWQuCisgICAqCisgICAqIEltcGxlbWVudGF0aW9ucyBjYW4gY2hvb3NlIHRvIHBlcmZvcm0gYSB0cmFuc3BvcnQtc3BlY2lmaWMgYWN0aW9uLCBlLmcuCisgICAqIGxvZ2dpbmcgdGhlIHJlcXVlc3QgdG8gYSBmaWxlLgorICAgKgorICAgKiBSZXR1cm5zOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZS4KKyAgICovCisgIHNpemVfdCByZWFkRW5kKCk7CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgcGFzc2VkIHNsaWNlIG9mIGRhdGEuCisgICAqCisgICAqIE5vdGU6IFlvdSBtdXN0IGNhbGwgZmx1c2goKSB0byBlbnN1cmUgdGhlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiwKKyAgICogYW5kIGF2YWlsYWJsZSB0byBiZSByZWFkIGJhY2sgaW4gdGhlIGZ1dHVyZS4gIERlc3Ryb3lpbmcgYSBUVHJhbnNwb3J0CisgICAqIG9iamVjdCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGZsdXNoIHBlbmRpbmcgZGF0YSDigJMgaWYgeW91IGRlc3Ryb3kgYQorICAgKiBUVHJhbnNwb3J0IG9iamVjdCB3aXRoIHdyaXR0ZW4gYnV0IHVuZmx1c2hlZCBkYXRhLCB0aGF0IGRhdGEgbWF5IGJlCisgICAqIGRpc2NhcmRlZC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IFNsaWNlIG9mIGRhdGEgdG8gd3JpdGUuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKTsKKworICAvKioKKyAgICogTXVzdCBiZSBjYWxsZWQgYnkgY2xpZW50cyB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlZC4KKyAgICoKKyAgICogSW1wbGVtZW50YXRpb25zIGNhbiBjaG9vc2UgdG8gcGVyZm9ybSBhIHRyYW5zcG9ydC1zcGVjaWZpYyBhY3Rpb24sIGUuZy4KKyAgICogbG9nZ2luZyB0aGUgcmVxdWVzdCB0byBhIGZpbGUuCisgICAqCisgICAqIFJldHVybnM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpZiBhdmFpbGFibGUsIDAgb3RoZXJ3aXNlLgorICAgKi8KKyAgc2l6ZV90IHdyaXRlRW5kKCk7CisKKyAgLyoqCisgICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLgorICAgKgorICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgZGVzdHJ1Y3Rpb24gdG8gZW5zdXJlIHdyaXRlcyBhcmUgYWN0dWFsbHkgY29tcGxldGUsCisgICAqIG90aGVyd2lzZSBwZW5kaW5nIGRhdGEgbWF5IGJlIGRpc2NhcmRlZC4gVHlwaWNhbGx5IHVzZWQgd2l0aCBidWZmZXJlZAorICAgKiB0cmFuc3BvcnQgbWVjaGFuaXNtcy4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICovCisgIHZvaWQgZmx1c2goKTsKKworICAvKioKKyAgICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgc2xpY2Ugb2YgPGNvZGU+bGVuPC9jb2RlPiBieXRlcyBvZiBpbmNvbWluZyBkYXRhLAorICAgKiBwb3NzaWJseSBjb3BpZWQgaW50byBidWYsIG5vdCBjb25zdW1pbmcgdGhlbSAoaS5lLjogYSBsYXRlciByZWFkIHdpbGwKKyAgICogcmV0dXJuIHRoZSBzYW1lIGRhdGEpLgorICAgKgorICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBzdXBwb3J0IHByb3RvY29scyB0aGF0IG5lZWQgdG8gcmVhZCB2YXJpYWJsZS0KKyAgICogbGVuZ3RoIGZpZWxkcy4gVGhleSBjYW4gYXR0ZW1wdCB0byBib3Jyb3cgdGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEgdGhhdAorICAgKiB0aGV5IHdpbGwgbmVlZCwgdGhlbiA8Y29kZT5jb25zdW1lKCk8L2NvZGU+IHdoYXQgdGhleSBhY3R1YWxseSB1c2UuIFNvbWUKKyAgICogdHJhbnNwb3J0cyB3aWxsIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kIGFuZCBvdGhlcnMgd2lsbCBmYWlsIG9jY2FzaW9uYWxseSwKKyAgICogc28gcHJvdG9jb2xzIG11c3QgYmUgcHJlcGFyZWQgdG8gZmFsbCBiYWNrIHRvIDxjb2RlPnJlYWQoKTwvY29kZT4gaWYKKyAgICogYm9ycm93IGZhaWxzLgorICAgKgorICAgKiBUaGUgdHJhbnNwb3J0IG11c3QgYmUgb3BlbiB3aGVuIGNhbGxpbmcgdGhpcy4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZiA9IEEgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIGNhbiBiZSBzdG9yZWQgaWYgbmVlZGVkLCBvciBudWxsIHRvCisgICAqICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgaXMgbm90IHN1cHBseWluZyBzdG9yYWdlLCBidXQgd291bGQgbGlrZSBhCisgICAqICAgICBzbGljZSBvZiBhbiBpbnRlcm5hbCBidWZmZXIsIGlmIGF2YWlsYWJsZS4KKyAgICogICBsZW4gPSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJvcnJvdy4KKyAgICoKKyAgICogUmV0dXJuczogSWYgdGhlIGJvcnJvdyBzdWNjZWVkcywgYSBzbGljZSBjb250YWluaW5nIHRoZSBib3Jyb3dlZCBkYXRhLAorICAgKiAgIG51bGwgb3RoZXJ3aXNlLiBUaGUgc2xpY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHJlcXVlc3RlZCwgYnV0CisgICAqICAgbWF5IGJlIGxvbmdlciBpZiB0aGUgcmV0dXJuZWQgc2xpY2UgcG9pbnRzIGludG8gYW4gaW50ZXJuYWwgYnVmZmVyCisgICAqICAgcmF0aGVyIHRoYW4gYnVmLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIG91dCAocmVzdWx0KSB7CisgICAgLy8gRklYTUU6IENvbW1lbnRlZCBvdXQgYmVjYXVzZSBsZW4gZ2V0cyBjb3JydXB0ZWQgaW4KKyAgICAvLyB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeSBib3Jyb3coKSB1bml0dGVzdC4KKyAgICB2ZXJzaW9uKG5vbmUpIGFzc2VydChyZXN1bHQgaXMgbnVsbCB8fCByZXN1bHQubGVuZ3RoID49IGxlbiwKKyAgICAgICAiQnVmZmVyIHJldHVybmVkIGJ5IGJvcnJvdygpIHRvbyBzaG9ydC4iKTsKKyAgfQorCisgIC8qKgorICAgKiBSZW1vdmUgbGVuIGJ5dGVzIGZyb20gdGhlIHRyYW5zcG9ydC4gVGhpcyBtdXN0IGFsd2F5cyBmb2xsb3cgYSBib3Jyb3cKKyAgICogb2YgYXQgbGVhc3QgbGVuIGJ5dGVzLCBhbmQgc2hvdWxkIGFsd2F5cyBzdWNjZWVkLgorICAgKgorICAgKiBUaGUgdHJhbnNwb3J0IG11c3QgYmUgb3BlbiB3aGVuIGNhbGxpbmcgdGhpcy4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGxlbiA9IE51bWJlciBvZiBieXRlcyB0byBjb25zdW1lLgorICAgKgorICAgKiBUaHJvd3M6IFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgdm9pZCBjb25zdW1lKHNpemVfdCBsZW4pOworfQorCisvKioKKyAqIFByb3ZpZGVzIGJhc2ljIGZhbGwtYmFjayBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICovCitjbGFzcyBUQmFzZVRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiBpc09wZW47CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCBvcGVuIFRCYXNlVHJhbnNwb3J0LiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX0lNUExFTUVOVEVEKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCBjbG9zZSBUQmFzZVRyYW5zcG9ydC4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9JTVBMRU1FTlRFRCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3QgcmVhZCBmcm9tIGEgVEJhc2VUcmFuc3BvcnQuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfSU1QTEVNRU5URUQpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCByZWFkQWxsKHVieXRlW10gYnVmKSB7CisgICAgc2l6ZV90IGhhdmU7CisgICAgd2hpbGUgKGhhdmUgPCBidWYubGVuZ3RoKSB7CisgICAgICBzaXplX3QgZ2V0ID0gcmVhZChidWZbaGF2ZS4uJF0pOworICAgICAgaWYgKGdldCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKHRleHQoIkNvdWxkIG5vdCByZWFkQWxsKCkgIiwgYnVmLmxlbmd0aCwKKyAgICAgICAgICAiIGJ5dGVzIGFzIG5vIG1vcmUgZGF0YSB3YXMgYXZhaWxhYmxlIGFmdGVyICIsIGhhdmUsICIgYnl0ZXMuIiksCisgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKTsKKyAgICAgIH0KKyAgICAgIGhhdmUgKz0gZ2V0OworICAgIH0KKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkRW5kKCkgeworICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdCwgbm90IG5lZWRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgorICAgIHJldHVybiAwOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgdG8gYSBUQmFzZVRyYW5zcG9ydC4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9JTVBMRU1FTlRFRCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3Qgd3JpdGVFbmQoKSB7CisgICAgLy8gRG8gbm90aGluZyBieSBkZWZhdWx0LCBub3QgbmVlZGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgICAgcmV0dXJuIDA7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIC8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdCwgbm90IG5lZWRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgorICB9CisKKyAgb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICAvLyBib3Jyb3coKSBpcyBhbGxvd2VkIHRvIGZhaWwgYW55d2F5LCBzbyBqdXN0IHJldHVybiBudWxsLgorICAgIHJldHVybiBudWxsOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjb25zdW1lKHNpemVfdCBsZW4pIHsKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2Fubm90IGNvbnN1bWUgZnJvbSBhIFRCYXNlVHJhbnNwb3J0LiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX0lNUExFTUVOVEVEKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHRoaXMoKSB7fQorfQorCisvKioKKyAqIE1ha2VzIGEgVFRyYW5zcG9ydCB3aGljaCB3cmFwcyBhIGdpdmVuIHNvdXJjZSB0cmFuc3BvcnQgaW4gc29tZSB3YXkuCisgKgorICogQSBjb21tb24gdXNlIGNhc2UgaXMgaW5zaWRlIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMsIHdoZXJlIHRoZSByYXcgY2xpZW50CisgKiBjb25uZWN0aW9ucyBhY2NlcHRlZCBmcm9tIGUuZy4gVFNlcnZlclNvY2tldCBuZWVkIHRvIGJlIHdyYXBwZWQgaW50bworICogYnVmZmVyZWQgb3IgY29tcHJlc3NlZCB0cmFuc3BvcnRzLgorICovCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgIC8qKgorICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZywganVzdCByZXR1cm5zIHRoZSB0cmFuc3BvcnQgZ2l2ZW4uCisgICAqLworICBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgcmV0dXJuIHRyYW5zOworICB9Cit9CisKKy8qKgorICogVHJhbnNwb3J0IGZhY3RvcnkgZm9yIHRyYW5zcG9ydHMgd2hpY2ggc2ltcGx5IHdyYXAgYW4gdW5kZXJseWluZyBUVHJhbnNwb3J0CisgKiB3aXRob3V0IHJlcXVpcmluZyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24uCisgKi8KK2NsYXNzIFRXcmFwcGVyVHJhbnNwb3J0RmFjdG9yeShUKSBpZiAoCisgIGlzKFQgOiBUVHJhbnNwb3J0KSAmJiBfX3RyYWl0cyhjb21waWxlcywgbmV3IFQoVFRyYW5zcG9ydC5pbml0KSkKKykgIDogVFRyYW5zcG9ydEZhY3RvcnkgeworICBvdmVycmlkZSBUIGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgcmV0dXJuIG5ldyBUKHRyYW5zKTsKKyAgfQorfQorCisvKioKKyAqIFRyYW5zcG9ydC1sZXZlbCBleGNlcHRpb24uCisgKi8KK2NsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgLyoqCisgICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgorICAgKi8KKyAgZW51bSBUeXBlIHsKKyAgICBVTktOT1dOLCAvLy8KKyAgICBOT1RfT1BFTiwgLy8vCisgICAgVElNRURfT1VULCAvLy8KKyAgICBFTkRfT0ZfRklMRSwgLy8vCisgICAgSU5URVJSVVBURUQsIC8vLworICAgIEJBRF9BUkdTLCAvLy8KKyAgICBDT1JSVVBURURfREFUQSwgLy8vCisgICAgSU5URVJOQUxfRVJST1IsIC8vLworICAgIE5PVF9JTVBMRU1FTlRFRCAvLy8KKyAgfQorCisgIC8vLworICB0aGlzKFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywgVGhyb3dhYmxlIG5leHQgPSBudWxsKSB7CisgICAgc3RhdGljIHN0cmluZyBtc2dGb3JUeXBlKFR5cGUgdHlwZSkgeworICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVHlwZS5VTktOT1dOOiByZXR1cm4gIlVua25vd24gdHJhbnNwb3J0IGV4Y2VwdGlvbiI7CisgICAgICAgIGNhc2UgVHlwZS5OT1RfT1BFTjogcmV0dXJuICJUcmFuc3BvcnQgbm90IG9wZW4iOworICAgICAgICBjYXNlIFR5cGUuVElNRURfT1VUOiByZXR1cm4gIlRpbWVkIG91dCI7CisgICAgICAgIGNhc2UgVHlwZS5FTkRfT0ZfRklMRTogcmV0dXJuICJFbmQgb2YgZmlsZSI7CisgICAgICAgIGNhc2UgVHlwZS5JTlRFUlJVUFRFRDogcmV0dXJuICJJbnRlcnJ1cHRlZCI7CisgICAgICAgIGNhc2UgVHlwZS5CQURfQVJHUzogcmV0dXJuICJJbnZhbGlkIGFyZ3VtZW50cyI7CisgICAgICAgIGNhc2UgVHlwZS5DT1JSVVBURURfREFUQTogcmV0dXJuICJDb3JydXB0ZWQgRGF0YSI7CisgICAgICAgIGNhc2UgVHlwZS5JTlRFUk5BTF9FUlJPUjogcmV0dXJuICJJbnRlcm5hbCBlcnJvciI7CisgICAgICAgIGNhc2UgVHlwZS5OT1RfSU1QTEVNRU5URUQ6IHJldHVybiAiTm90IGltcGxlbWVudGVkIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuICIoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgICAgfQorICAgIH0KKyAgICB0aGlzKG1zZ0ZvclR5cGUodHlwZSksIHR5cGUsIGZpbGUsIGxpbmUsIG5leHQpOworICB9CisKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICB0aGlzKG1zZywgVHlwZS5VTktOT1dOLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBtc2csIFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIC8vLworICBUeXBlIHR5cGUoKSBjb25zdCBub3Rocm93IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKK3Byb3RlY3RlZDoKKyAgVHlwZSB0eXBlXzsKK30KKworLyoqCisgKiBNZXRhLXByb2dyYW1taW5nIGhlbHBlciByZXR1cm5pbmcgd2hldGhlciB0aGUgcGFzc2VkIHR5cGUgaXMgYSBUVHJhbnNwb3J0CisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqLwordGVtcGxhdGUgaXNUVHJhbnNwb3J0KFQpIHsKKyAgZW51bSBpc1RUcmFuc3BvcnQgPSBpcyhUIDogVFRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJmYmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWQuZApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBXcmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyByZWFkcyBhbmQgd3JpdGVzIHVudGlsIHRoZSBpbnRlcm5hbAorICogYnVmZmVycyBhcmUgZXhoYXVzdGVkLCBhdCB3aGljaCBwb2ludCBuZXcgZGF0YSBpcyBmZXRjaGVkIHJlc3AuIHRoZQorICogYWNjdW11bGF0ZWQgZGF0YSBpcyB3cml0dGVuIG91dCBhdCBvbmNlLgorICovCitmaW5hbCBjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLCB1c2luZyB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gd3JhcC4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICB0aGlzKHRyYW5zcG9ydCwgREVGQVVMVF9CVUZGRVJfU0laRSk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB3cmFwLgorICAgKiAgIGJ1ZmZlclNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgcmVhZCBhbmQgd3JpdGUgYnVmZmVycyB0byB1c2UsIGluIGJ5dGVzLgorICAgKi8KKyAgdGhpcyhUVHJhbnNwb3J0IHRyYW5zcG9ydCwgc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICB0aGlzKHRyYW5zcG9ydCwgYnVmZmVyU2l6ZSwgYnVmZmVyU2l6ZSk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB3cmFwLgorICAgKiAgIHJlYWRCdWZmZXJTaXplID0gVGhlIHNpemUgb2YgdGhlIHJlYWQgYnVmZmVyIHRvIHVzZSwgaW4gYnl0ZXMuCisgICAqICAgd3JpdGVCdWZmZXJTaXplID0gVGhlIHNpemUgb2YgdGhlIHdyaXRlIGJ1ZmZlciB0byB1c2UsIGluIGJ5dGVzLgorICAgKi8KKyAgdGhpcyhUVHJhbnNwb3J0IHRyYW5zcG9ydCwgc2l6ZV90IHJlYWRCdWZmZXJTaXplLCBzaXplX3Qgd3JpdGVCdWZmZXJTaXplKSB7CisgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKyAgICByZWFkQnVmZmVyXyA9IG5ldyB1Ynl0ZVtyZWFkQnVmZmVyU2l6ZV07CisgICAgd3JpdGVCdWZmZXJfID0gbmV3IHVieXRlW3dyaXRlQnVmZmVyU2l6ZV07CisgICAgd3JpdGVBdmFpbF8gPSB3cml0ZUJ1ZmZlcl87CisgIH0KKworICAvLy8gVGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgcmVhZC93cml0ZSBidWZmZXJzLCBpbiBieXRlcy4KKyAgZW51bSBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDUxMjsKKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuKCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgaWYgKHJlYWRBdmFpbF8uZW1wdHkpIHsKKyAgICAgIC8vIElmIHRoZXJlIGlzIG5vdGhpbmcgYXZhaWxhYmxlIHRvIHJlYWQsIHNlZSBpZiB3ZSBjYW4gZ2V0IHNvbWV0aGluZworICAgICAgLy8gZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICBhdXRvIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydF8ucmVhZChyZWFkQnVmZmVyXyk7CisgICAgICByZWFkQXZhaWxfID0gcmVhZEJ1ZmZlcl9bMCAuLiBieXRlc1JlYWRdOworICAgIH0KKworICAgIHJldHVybiAhcmVhZEF2YWlsXy5lbXB0eTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybjsKKyAgICBmbHVzaCgpOworICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCByZWFkKHVieXRlW10gYnVmKSB7CisgICAgaWYgKHJlYWRBdmFpbF8uZW1wdHkpIHsKKyAgICAgIC8vIE5vIGRhdGEgbGVmdCBpbiBvdXIgYnVmZmVyLCBmZXRjaCBzb21lIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorCisgICAgICBpZiAoYnVmLmxlbmd0aCA+IHJlYWRCdWZmZXJfLmxlbmd0aCkgeworICAgICAgICAvLyBJZiB0aGUgYW1vdW50IG9mIGRhdGEgcmVxdWVzdGVkIGlzIGxhcmdlciB0aGFuIG91ciByZWFkaW5nIGJ1ZmZlciwKKyAgICAgICAgLy8gZGlyZWN0bHkgcmVhZCB0byB0aGUgcGFzc2VkIGJ1ZmZlci4gVGhpcyBwcm9iYWJseSBkb2Vzbid0IG9jY3VyIHRvbworICAgICAgICAvLyBvZnRlbiBpbiBwcmFjdGljZSAoYW5kIGV2ZW4gaWYgaXQgZG9lcywgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgIC8vIHByb2JhYmx5IGNhbm5vdCBmdWxmaWxsIHRoZSByZXF1ZXN0IGF0IG9uY2UgYW55d2F5KSwgYnV0IGl0IGNhbid0CisgICAgICAgIC8vIGhhcm0gdG8gdHJ54oCmCisgICAgICAgIHJldHVybiB0cmFuc3BvcnRfLnJlYWQoYnVmKTsKKyAgICAgIH0KKworICAgICAgYXV0byBieXRlc1JlYWQgPSB0cmFuc3BvcnRfLnJlYWQocmVhZEJ1ZmZlcl8pOworICAgICAgcmVhZEF2YWlsXyA9IHJlYWRCdWZmZXJfWzAgLi4gYnl0ZXNSZWFkXTsKKyAgICB9CisKKyAgICAvLyBIYW5kIG92ZXIgd2hhdGV2ZXIgd2UgaGF2ZS4KKyAgICBhdXRvIGdpdmUgPSBtaW4ocmVhZEF2YWlsXy5sZW5ndGgsIGJ1Zi5sZW5ndGgpOworICAgIGJ1ZlswIC4uIGdpdmVdID0gcmVhZEF2YWlsX1swIC4uIGdpdmVdOworICAgIHJlYWRBdmFpbF8gPSByZWFkQXZhaWxfW2dpdmUgLi4gJF07CisgICAgcmV0dXJuIGdpdmU7CisgIH0KKworICAvKioKKyAgICogU2hvcnRjdXQgdmVyc2lvbiBvZiByZWFkQWxsLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCByZWFkQWxsKHVieXRlW10gYnVmKSB7CisgICAgaWYgKHJlYWRBdmFpbF8ubGVuZ3RoID49IGJ1Zi5sZW5ndGgpIHsKKyAgICAgIGJ1ZltdID0gcmVhZEF2YWlsX1swIC4uIGJ1Zi5sZW5ndGhdOworICAgICAgcmVhZEF2YWlsXyA9IHJlYWRBdmFpbF9bYnVmLmxlbmd0aCAuLiAkXTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdXBlci5yZWFkQWxsKGJ1Zik7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgaWYgKHdyaXRlQXZhaWxfLmxlbmd0aCA+PSBidWYubGVuZ3RoKSB7CisgICAgICAvLyBJZiB0aGUgZGF0YSBmaXRzIGluIHRoZSBidWZmZXIsIGp1c3Qgc2F2ZSBpdCB0aGVyZS4KKyAgICAgIHdyaXRlQXZhaWxfWzAgLi4gYnVmLmxlbmd0aF0gPSBidWY7CisgICAgICB3cml0ZUF2YWlsXyA9IHdyaXRlQXZhaWxfW2J1Zi5sZW5ndGggLi4gJF07CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSB0byBkZWNpZGUgaWYgd2UgY29weSBkYXRhIGZyb20gYnVmIHRvIG91ciBpbnRlcm5hbCBidWZmZXIsIG9yCisgICAgLy8ganVzdCBkaXJlY3RseSB3cml0ZSB0aGVtIG91dC4gVGhlIHNhbWUgY29uc2lkZXJhdGlvbnMgYWJvdXQgYXZvaWRpbmcKKyAgICAvLyBzeXNjYWxscyBhcyBmb3IgQysrIGFwcGx5IGhlcmUuCisgICAgYXV0byBieXRlc0F2YWlsID0gd3JpdGVBdmFpbF8ucHRyIC0gd3JpdGVCdWZmZXJfLnB0cjsKKyAgICBpZiAoKGJ5dGVzQXZhaWwgKyBidWYubGVuZ3RoID49IDIgKiB3cml0ZUJ1ZmZlcl8ubGVuZ3RoKSB8fCAoYnl0ZXNBdmFpbCA9PSAwKSkgeworICAgICAgLy8gV2Ugd291bGQgaW1tZWRpYXRlbHkgbmVlZCB0d28gc3lzY2FsbHMgYW55d2F5IChvciB3ZSBkb24ndCBoYXZlCisgICAgICAvLyBhbnl0aGluZykgaW4gb3VyIGJ1ZmZlciB0byB3cml0ZSwgc28ganVzdCB3cml0ZSBvdXQgYm90aCBidWZmZXJzLgorICAgICAgaWYgKGJ5dGVzQXZhaWwgPiAwKSB7CisgICAgICAgIHRyYW5zcG9ydF8ud3JpdGUod3JpdGVCdWZmZXJfWzAgLi4gYnl0ZXNBdmFpbF0pOworICAgICAgICB3cml0ZUF2YWlsXyA9IHdyaXRlQnVmZmVyXzsKKyAgICAgIH0KKworICAgICAgdHJhbnNwb3J0Xy53cml0ZShidWYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZpbGwgdXAgb3VyIGludGVybmFsIGJ1ZmZlciBmb3IgYSB3cml0ZS4KKyAgICB3cml0ZUF2YWlsX1tdID0gYnVmWzAgLi4gd3JpdGVBdmFpbF8ubGVuZ3RoXTsKKyAgICBhdXRvIGxlZnQgPSBidWZbd3JpdGVBdmFpbF8ubGVuZ3RoIC4uICRdOworICAgIHRyYW5zcG9ydF8ud3JpdGUod3JpdGVCdWZmZXJfKTsKKworICAgIC8vIENvcHkgdGhlIHJlc3QgaW50byBvdXIgYnVmZmVyLgorICAgIHdyaXRlQnVmZmVyX1swIC4uIGxlZnQubGVuZ3RoXSA9IGxlZnRbXTsKKyAgICB3cml0ZUF2YWlsXyA9IHdyaXRlQnVmZmVyX1tsZWZ0Lmxlbmd0aCAuLiAkXTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmx1c2goKSB7CisgICAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KKyAgICBhdXRvIGJ5dGVzQXZhaWwgPSB3cml0ZUF2YWlsXy5wdHIgLSB3cml0ZUJ1ZmZlcl8ucHRyOworICAgIGlmIChieXRlc0F2YWlsID4gMCkgeworICAgICAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdyaXRlQXZhaWxfIHByaW9yIHRvIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wKKyAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzIGNsZWFyZWQgZXZlbiBpZiB0aGUgdHJhbnNwb3J0IHRocm93cyBhbgorICAgICAgLy8gZXhjZXB0aW9uLgorICAgICAgd3JpdGVBdmFpbF8gPSB3cml0ZUJ1ZmZlcl87CisgICAgICB0cmFuc3BvcnRfLndyaXRlKHdyaXRlQnVmZmVyX1swIC4uIGJ5dGVzQXZhaWxdKTsKKyAgICB9CisKKyAgICAvLyBGbHVzaCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgdHJhbnNwb3J0Xy5mbHVzaCgpOworICB9CisKKyAgb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICBpZiAobGVuIDw9IHJlYWRBdmFpbF8ubGVuZ3RoKSB7CisgICAgICByZXR1cm4gcmVhZEF2YWlsXzsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIGVuZm9yY2UobGVuIDw9IHJlYWRCdWZmZXJfLmxlbmd0aCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiSW52YWxpZCBjb25zdW1lIGxlbmd0aC4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKyAgICByZWFkQXZhaWxfID0gcmVhZEF2YWlsX1tsZW4gLi4gJF07CisgIH0KKworICAvKioKKyAgICogVGhlIHdyYXBwZWQgdHJhbnNwb3J0LgorICAgKi8KKyAgVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNwb3J0XzsKKyAgfQorCitwcml2YXRlOgorICBUVHJhbnNwb3J0IHRyYW5zcG9ydF87CisKKyAgdWJ5dGVbXSByZWFkQnVmZmVyXzsKKyAgdWJ5dGVbXSB3cml0ZUJ1ZmZlcl87CisKKyAgdWJ5dGVbXSByZWFkQXZhaWxfOworICB1Ynl0ZVtdIHdyaXRlQXZhaWxfOworfQorCisvKioKKyAqIFdyYXBzIGdpdmVuIHRyYW5zcG9ydHMgaW50byBUQnVmZmVyZWRUcmFuc3BvcnRzLgorICovCithbGlhcyBUV3JhcHBlclRyYW5zcG9ydEZhY3RvcnkhVEJ1ZmZlcmVkVHJhbnNwb3J0IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4OGU3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZApAQCAtMCwwICsxLDExMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUcmFuc3BvcnRzIGZvciByZWFkaW5nIGZyb20vd3JpdGluZyB0byBUaHJpZnQgwrtsb2cgZmlsZXPCqy4KKyAqCisgKiBUaGVzZSB0cmFuc3BvcnRzIGFyZSBub3QgwrtzdHVwaWTCqyBzb3VyY2VzIGFuZCBzaW5rcyBqdXN0IHJlYWRpbmcgYW5kCisgKiB3cml0aW5nIGJ5dGVzIGZyb20gYSBmaWxlIHZlcmJhdGltLCBidXQgb3JnYW5pemUgdGhlIGNvbnRlbnRzIGluIHRoZSBmb3JtCisgKiBvZiBzby1jYWxsZWQgwrtldmVudHPCqywgd2hpY2ggcmVmZXJzIHRvIHRoZSBkYXRhIHdyaXR0ZW4gYmV0d2VlbiB0d28gZmx1c2goKQorICogY2FsbHMuCisgKgorICogQ2h1bmtpbmcgaXMgc3VwcG9ydGVkLCBldmVudHMgYXJlIGd1YXJhbnRlZWQgdG8gbmV2ZXIgc3BhbiBjaHVuayBib3VuZGFyaWVzLgorICogQXMgYSBjb25zZXF1ZW5jZSwgYW4gZXZlbnQgY2FuIG5ldmVyIGJlIGxhcmdlciB0aGFuIHRoZSBjaHVuayBzaXplLiBUaGUKKyAqIGNodW5rIHNpemUgdXNlZCBpcyBub3Qgc2F2ZWQgd2l0aCB0aGUgZmlsZSwgc28gY2FyZSBoYXMgdG8gYmUgdGFrZW4gdG8gbWFrZQorICogc3VyZSB0aGUgc2FtZSBjaHVuayBzaXplIGlzIHVzZWQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LmZpbGU7CisKK2ltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluLCBtYXg7CitpbXBvcnQgc3RkLmNvbmN1cnJlbmN5OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmRhdGV0aW1lIDogZHVyLCBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuZGF0ZXRpbWUuc3RvcHdhdGNoIDogQXV0b1N0YXJ0LCBTdG9wV2F0Y2g7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKK2ltcG9ydCBzdGQuc3RkaW8gOiBGaWxlOworaW1wb3J0IHRocmlmdC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLy8vIFRoZSBkZWZhdWx0IGNodW5rIHNpemUsIGluIGJ5dGVzLgorZW51bSBERUZBVUxUX0NIVU5LX1NJWkUgPSAxNiAqIDEwMjQgKiAxMDI0OworCisvLy8gVGhlIHR5cGUgdXNlZCB0byByZXByZXNlbnQgZXZlbnQgc2l6ZXMgaW4gdGhlIGZpbGUuCithbGlhcyB1aW50IEV2ZW50U2l6ZTsKKwordmVyc2lvbiAoQmlnRW5kaWFuKSB7CisgIHN0YXRpYyBhc3NlcnQoZmFsc2UsCisgICAgIkxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciBpcyBhc3N1bWVkIGluIHRocmlmdC50cmFuc3BvcnQuZmlsZS4iKTsKK30KKworLyoqCisgKiBBIHRyYW5zcG9ydCB1c2VkIHRvIHJlYWQgbG9nIGZpbGVzLiBJdCBjYW4gbmV2ZXIgYmUgd3JpdHRlbiB0bywgY2FsbGluZworICogd3JpdGUoKSB0aHJvd3MuCisgKgorICogQ29udHJhcnkgdG8gdGhlIEMrKyBkZXNpZ24sIGV4cGxpY2l0bHkgb3BlbmluZyB0aGUgdHJhbnNwb3J0L2ZpbGUgYmVmb3JlCisgKiB1c2luZyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbWFudWFsbHkgY2xvc2luZyB0aGUgZmlsZSB3aXRob3V0IHJlbHlpbmcgb24gdGhlCisgKiBvYmplY3QgbGlmZXRpbWUuIE90aGVyd2lzZSwgaXQncyBhIHN0cmFpZ2h0IHBvcnQgb2YgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbi4KKyAqLworZmluYWwgY2xhc3MgVEZpbGVSZWFkZXJUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGZpbGUgd3JpdGVyIHRyYW5zcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHBhdGggPSBQYXRoIG9mIHRoZSBmaWxlIHRvIG9wcGVyYXRlIG9uLgorICAgKi8KKyAgdGhpcyhzdHJpbmcgcGF0aCkgeworICAgIHBhdGhfID0gcGF0aDsKKyAgICBjaHVua1NpemVfID0gREVGQVVMVF9DSFVOS19TSVpFOworICAgIHJlYWRCdWZmZXJTaXplXyA9IERFRkFVTFRfUkVBRF9CVUZGRVJfU0laRTsKKyAgICByZWFkVGltZW91dF8gPSBERUZBVUxUX1JFQURfVElNRU9VVDsKKyAgICBjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb25fID0gREVGQVVMVF9DT1JSVVBURURfRVZFTlRfU0xFRVBfRFVSQVRJT047CisgICAgbWF4RXZlbnRTaXplID0gREVGQVVMVF9NQVhfRVZFTlRfU0laRTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gaXNPcGVuXzsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXZlbnQgY3VycmVudGx5IHByb2Nlc3NlZCwgdHJ5IGZldGNoaW5nIG9uZSBmcm9tIHRoZQorICAgIC8vIGZpbGUuCisgICAgaWYgKCFjdXJyZW50RXZlbnRfKSB7CisgICAgICBjdXJyZW50RXZlbnRfID0gcmVhZEV2ZW50KCk7CisKKyAgICAgIGlmICghY3VycmVudEV2ZW50XykgeworICAgICAgICAvLyBTdGlsbCBub3RoaW5nIHRoZXJlLCBjb3VsZG4ndCByZWFkIGEgbmV3IGV2ZW50LgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIHJlYWQKKyAgICByZXR1cm4gKGN1cnJlbnRFdmVudF8ubGVuZ3RoIC0gY3VycmVudEV2ZW50UG9zXykgPiAwOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIGlmIChpc09wZW4pIHJldHVybjsKKyAgICB0cnkgeworICAgICAgZmlsZV8gPSBGaWxlKHBhdGhfLCAicmIiKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVycm9yIG9uIG9wZW5pbmcgaW5wdXQgZmlsZS4iLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4sIF9fRklMRV9fLCBfX0xJTkVfXywgZSk7CisgICAgfQorICAgIGlzT3Blbl8gPSB0cnVlOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgZmlsZV8uY2xvc2UoKTsKKyAgICBpc09wZW5fID0gZmFsc2U7CisgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHJlYWQgaWYgZmlsZSBpcyBub3Qgb3Blbi4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIC8vIElmIHRoZXJlIGlzIG5vIGV2ZW50IGN1cnJlbnRseSBwcm9jZXNzZWQsIHRyeSBmZXRjaGluZyBvbmUgZnJvbSB0aGUKKyAgICAvLyBmaWxlLgorICAgIGlmICghY3VycmVudEV2ZW50XykgeworICAgICAgY3VycmVudEV2ZW50XyA9IHJlYWRFdmVudCgpOworCisgICAgICBpZiAoIWN1cnJlbnRFdmVudF8pIHsKKyAgICAgICAgLy8gU3RpbGwgbm90aGluZyB0aGVyZSwgY291bGRuJ3QgcmVhZCBhIG5ldyBldmVudC4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorCisgICAgYXV0byBsZW4gPSBidWYubGVuZ3RoOworICAgIGF1dG8gcmVtYWluaW5nID0gY3VycmVudEV2ZW50Xy5sZW5ndGggLSBjdXJyZW50RXZlbnRQb3NfOworCisgICAgaWYgKHJlbWFpbmluZyA8PSBsZW4pIHsKKyAgICAgIC8vIElmIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIGxlbmd0aCBpcyBhdmFpbGFibGUsIHJlYWQgYXMgbXVjaCBhcworICAgICAgLy8gcG9zc2libGUuCisgICAgICBidWZbMCAuLiByZW1haW5pbmddID0gY3VycmVudEV2ZW50X1tjdXJyZW50RXZlbnRQb3NfIC4uICRdOworICAgICAgY3VycmVudEV2ZW50XyA9IG51bGw7CisgICAgICBjdXJyZW50RXZlbnRQb3NfID0gMDsKKyAgICAgIHJldHVybiByZW1haW5pbmc7CisgICAgfQorCisgICAgLy8gVGhlcmUgd2lsbCBzdGlsbCBiZSBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciBhZnRlciByZWFkaW5nLCBwYXNzIG91dCBsZW4KKyAgICAvLyBieXRlcy4KKyAgICBidWZbXSA9IGN1cnJlbnRFdmVudF9bY3VycmVudEV2ZW50UG9zXyAuLiBjdXJyZW50RXZlbnRQb3NfICsgbGVuXTsKKyAgICBjdXJyZW50RXZlbnRQb3NfICs9IGxlbjsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgdWxvbmcgZ2V0TnVtQ2h1bmtzKCkgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgZ2V0IG51bWJlciBvZiBjaHVua3MgaWYgZmlsZSBub3Qgb3Blbi4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICB0cnkgeworICAgICAgYXV0byBmaWxlU2l6ZSA9IGZpbGVfLnNpemUoKTsKKyAgICAgIGlmIChmaWxlU2l6ZSA9PSAwKSB7CisgICAgICAgIC8vIEVtcHR5IGZpbGVzIGhhdmUgbm8gY2h1bmtzLgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoKGZpbGVTaXplKS9jaHVua1NpemVfKSArIDE7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIGZpbGUgc2l6ZS4iLCBfX0ZJTEVfXywKKyAgICAgICAgX19MSU5FX18sIGUpOworICAgIH0KKyAgfQorCisgIHVsb25nIGdldEN1ckNodW5rKCkgeworICAgIHJldHVybiBvZmZzZXRfIC8gY2h1bmtTaXplXzsKKyAgfQorCisgIHZvaWQgc2Vla1RvQ2h1bmsobG9uZyBjaHVuaykgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgZ2V0IG51bWJlciBvZiBjaHVua3MgaWYgZmlsZSBub3Qgb3Blbi4iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBhdXRvIG51bUNodW5rcyA9IGdldE51bUNodW5rcygpOworCisgICAgaWYgKGNodW5rIDwgMCkgeworICAgICAgLy8gQ291bnQgbmVnYXRpdmUgaW5kaWNlcyBmcm9tIHRoZSBlbmQuCisgICAgICBjaHVuayArPSBudW1DaHVua3M7CisgICAgfQorCisgICAgaWYgKGNodW5rIDwgMCkgeworICAgICAgbG9nRXJyb3IoIkluY29ycmVjdCBjaHVuayBudW1iZXIgZm9yIHJldmVyc2Ugc2Vlaywgc2Vla2luZyB0byAiIH4KKyAgICAgICAiYmVnaW5uaW5nIGluc3RlYWQ6ICVzIiwgY2h1bmspOworICAgICAgY2h1bmsgPSAwOworICAgIH0KKworICAgIGJvb2wgc2Vla1RvRW5kOworICAgIGxvbmcgbWluRW5kT2Zmc2V0OworICAgIGlmIChjaHVuayA+PSBudW1DaHVua3MpIHsKKyAgICAgIGxvZ0Vycm9yKCJUcnlpbmcgdG8gc2VlayB0byBub24tZXhpc3RpbmcgY2h1bmssIHNlZWtpbmcgdG8gIiB+CisgICAgICAgImVuZCBvZiBmaWxlIGluc3RlYWQ6ICVzIiwgY2h1bmspOworICAgICAgc2Vla1RvRW5kID0gdHJ1ZTsKKyAgICAgIGNodW5rID0gbnVtQ2h1bmtzIC0gMTsKKyAgICAgIC8vIHRoaXMgaXMgdGhlIG1pbiBvZmZzZXQgdG8gcHJvY2VzcyBldmVudHMgdGlsbAorICAgICAgbWluRW5kT2Zmc2V0ID0gZmlsZV8uc2l6ZSgpOworICAgIH0KKworICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKKyAgICBjdXJyZW50RXZlbnRfID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBmaWxlXy5zZWVrKGNodW5rICogY2h1bmtTaXplXyk7CisgICAgICBvZmZzZXRfID0gY2h1bmsgKiBjaHVua1NpemVfOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRXJyb3Igc2Vla2luZyB0byBjaHVuayIsIF9fRklMRV9fLAorICAgICAgICBfX0xJTkVfXywgZSk7CisgICAgfQorCisgICAgaWYgKHNlZWtUb0VuZCkgeworICAgICAgLy8gTmV2ZXIgd2FpdCBvbiB0aGUgZW5kIG9mIHRoZSBmaWxlIGZvciBuZXcgY29udGVudCwgd2UganVzdCB3YW50IHRvCisgICAgICAvLyBmaW5kIHRoZSBsYXN0IG9uZS4KKyAgICAgIGF1dG8gb2xkUmVhZFRpbWVvdXQgPSByZWFkVGltZW91dF87CisgICAgICBzY29wZSAoZXhpdCkgcmVhZFRpbWVvdXRfID0gb2xkUmVhZFRpbWVvdXQ7CisgICAgICByZWFkVGltZW91dF8gPSBkdXIhImhuc2VjcyIoMCk7CisKKyAgICAgIC8vIEtlZXAgb24gcmVhZGluZyB1bnRpIHRoZSBsYXN0IGV2ZW50IGF0IHBvaW50IG9mIHNlZWtUb0NodW5rIGNhbGwuCisgICAgICB3aGlsZSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclBvc18pIDwgbWluRW5kT2Zmc2V0KSB7CisgICAgICAgIGlmIChyZWFkRXZlbnQoKSBpcyBudWxsKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIHNlZWtUb0VuZCgpIHsKKyAgICBzZWVrVG9DaHVuayhnZXROdW1DaHVua3MoKSk7CisgIH0KKworICAvKioKKyAgICogVGhlIHNpemUgb2YgdGhlIGNodW5rcyB0aGUgZmlsZSBpcyBkaXZpZGVkIGludG8sIGluIGJ5dGVzLgorICAgKi8KKyAgdWxvbmcgY2h1bmtTaXplKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gY2h1bmtTaXplXzsKKyAgfQorCisgIC8vLyBkaXR0bworICB2b2lkIGNodW5rU2l6ZSh1bG9uZyB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBlbmZvcmNlKCFpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBzZXQgY2h1bmsgc2l6ZSBhZnRlciBURmlsZVJlYWRlclRyYW5zcG9ydCBoYXMgYmVlbiBvcGVuZWQuIikpOworICAgIGVuZm9yY2UodmFsdWUgPiBFdmVudFNpemUuc2l6ZW9mLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2h1bmtzIG11c3QgIiB+CisgICAgICAiYmUgbGFyZ2UgZW5vdWdoIHRvIGFjY29tbW9kYXRlIGF0IGxlYXN0IGEgc2luZ2xlIGJ5dGUgb2YgcGF5bG9hZCBkYXRhLiIpKTsKKyAgICBjaHVua1NpemVfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogSWYgcG9zaXRpdmUsIHdhaXQgdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBmb3IgbmV3IGRhdGEgd2hlbiBhcnJpdmluZyBhdAorICAgKiBlbmQgb2YgZmlsZS4gSWYgbmVnYXRpdmUsIHdhaXQgZm9yZXZlciAodGFpbGluZyBtb2RlKSwgd2FraW5nIHVwIHRvIGNoZWNrCisgICAqIGluIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwuIElmIHplcm8sIGRvIG5vdCB3YWl0IGF0IGFsbC4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gNTAwIG1zLgorICAgKi8KKyAgRHVyYXRpb24gcmVhZFRpbWVvdXQoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiByZWFkVGltZW91dF87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCByZWFkVGltZW91dChEdXJhdGlvbiB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICByZWFkVGltZW91dF8gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfUkVBRF9USU1FT1VUID0gZHVyISJtc2VjcyIoNTAwKTsKKworICAvKioKKyAgICogUmVhZCBidWZmZXIgc2l6ZSwgaW4gYnl0ZXMuCisgICAqCisgICAqIERlZmF1bHRzIHRvIDEgTWlCLgorICAgKi8KKyAgc2l6ZV90IHJlYWRCdWZmZXJTaXplKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gcmVhZEJ1ZmZlclNpemVfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgcmVhZEJ1ZmZlclNpemUoc2l6ZV90IHZhbHVlKSBAcHJvcGVydHkgeworICAgIGlmIChyZWFkQnVmZmVyXykgeworICAgICAgZW5mb3JjZSh2YWx1ZSA8PSByZWFkQnVmZmVyU2l6ZV8sCisgICAgICAgICJDYW5ub3Qgc2hyaW5rIHJlYWQgYnVmZmVyIGFmdGVyIGZpcnN0IHJlYWQuIik7CisgICAgICByZWFkQnVmZmVyXy5sZW5ndGggPSB2YWx1ZTsKKyAgICB9CisgICAgcmVhZEJ1ZmZlclNpemVfID0gdmFsdWU7CisgIH0KKworICAvLy8gZGl0dG8KKyAgZW51bSBERUZBVUxUX1JFQURfQlVGRkVSX1NJWkUgPSAxICogMTAyNCAqIDEwMjQ7CisKKyAgLyoqCisgICAqIEFyYml0cmFyeSBldmVudCBzaXplIGxpbWl0LCBpbiBieXRlcy4gTXVzdCBiZSBzbWFsbGVyIHRoYW4gY2h1bmsgc2l6ZS4KKyAgICoKKyAgICogRGVmYXVsdHMgdG8gemVybyAobm8gbGltaXQpLgorICAgKi8KKyAgc2l6ZV90IG1heEV2ZW50U2l6ZSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIG1heEV2ZW50U2l6ZV87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBtYXhFdmVudFNpemUoc2l6ZV90IHZhbHVlKSBAcHJvcGVydHkgeworICAgIGVuZm9yY2UodmFsdWUgPD0gY2h1bmtTaXplXyAtIEV2ZW50U2l6ZS5zaXplb2YsICJFdmVudHMgY2Fubm90IHNwYW4gIiB+CisgICAgICAibXV0aXBsZSBjaHVua3MsIG1heEV2ZW50U2l6ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiBjaHVuayBzaXplLiIpOworICAgIG1heEV2ZW50U2l6ZV8gPSB2YWx1ZTsKKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfTUFYX0VWRU5UX1NJWkUgPSAwOworCisgIC8qKgorICAgKiBUaGUgaW50ZXJ2YWwgYXQgd2hpY2ggdGhlIHRocmVhZCB3YWtlcyB1cCB0byBjaGVjayBmb3IgdGhlIG5leHQgY2h1bmsKKyAgICogaW4gdGFpbGluZyBtb2RlLgorICAgKgorICAgKiBEZWZhdWx0cyB0byBvbmUgc2Vjb25kLgorICAgKi8KKyAgRHVyYXRpb24gY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb25fOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uKER1cmF0aW9uIHZhbHVlKSB7CisgICAgY29ycnVwdGVkRXZlbnRTbGVlcER1cmF0aW9uXyA9IHZhbHVlOworICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9DT1JSVVBURURfRVZFTlRfU0xFRVBfRFVSQVRJT04gPSBkdXIhInNlY29uZHMiKDEpOworCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29ycnVwdGVkIGV2ZW50cyB0b2xlcmF0ZWQgYmVmb3JlIHRoZSB3aG9sZSBjaHVuaworICAgKiBpcyBza2lwcGVkLgorICAgKgorICAgKiBEZWZhdWx0cyB0byB6ZXJvLgorICAgKi8KKyAgdWludCBtYXhDb3JydXB0ZWRFdmVudHMoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBtYXhDb3JydXB0ZWRFdmVudHNfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgbWF4Q29ycnVwdGVkRXZlbnRzKHVpbnQgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgbWF4Q29ycnVwdGVkRXZlbnRzXyA9IHZhbHVlOworICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9NQVhfQ09SUlVQVEVEX0VWRU5UUyA9IDA7CisKK3ByaXZhdGU6CisgIHVieXRlW10gcmVhZEV2ZW50KCkgeworICAgIGlmICghcmVhZEJ1ZmZlcl8pIHsKKyAgICAgIHJlYWRCdWZmZXJfID0gbmV3IHVieXRlW3JlYWRCdWZmZXJTaXplX107CisgICAgfQorCisgICAgYm9vbCB0aW1lb3V0RXhwaXJlZDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgLy8gcmVhZCBmcm9tIHRoZSBmaWxlIGlmIHJlYWQgYnVmZmVyIGlzIGV4aGF1c3RlZAorICAgICAgaWYgKHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyA9PSByZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKKyAgICAgICAgLy8gYWR2YW5jZSB0aGUgb2Zmc2V0IHBvaW50ZXIKKyAgICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmJ1ZmZlckxlbl87CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAvLyBOZWVkIHRvIGNsZWFyIGVvZiBmbGFnIGJlZm9yZSByZWFkaW5nLCBvdGhlcndpc2UgdGFpbGluZyBhIGZpbGUKKyAgICAgICAgICAvLyBkb2VzIG5vdCB3b3JrLgorICAgICAgICAgIGZpbGVfLmNsZWFyZXJyKCk7CisKKyAgICAgICAgICBhdXRvIHVzZWRCdWYgPSBmaWxlXy5yYXdSZWFkKHJlYWRCdWZmZXJfKTsKKyAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPSB1c2VkQnVmLmxlbmd0aDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSBmaWxlIiwKKyAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgZSk7CisgICAgICAgIH0KKworICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclBvc18gPSAwOworICAgICAgICByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFBvc18gPSAwOworCisgICAgICAgIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPT0gMCkgeworICAgICAgICAgIC8vIFJlYWNoZWQgZW5kIG9mIGZpbGUuCisgICAgICAgICAgaWYgKHJlYWRUaW1lb3V0XyA8IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgICAgICAgLy8gVGFpbGluZyBtb2RlLCBzbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKC1yZWFkVGltZW91dF8pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPT0gZHVyISJobnNlY3MiKDApIHx8IHRpbWVvdXRFeHBpcmVkKSB7CisgICAgICAgICAgICAvLyBFaXRoZXIgbm8gdGltZW91dCBzZXQsIG9yIGl0IGhhcyBhbHJlYWR5IGV4cGlyZWQuCisgICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUoMCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGltZW91dCBtb2RlLCBzbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBhbmQgcmV0cnkuCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAocmVhZFRpbWVvdXRfKTsKKyAgICAgICAgICAgIHRpbWVvdXRFeHBpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBBdHRlbXB0IHRvIHJlYWQgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyLgorICAgICAgd2hpbGUgKHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyA8IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgeworICAgICAgICBpZiAocmVhZFN0YXRlXy5yZWFkaW5nU2l6ZV8pIHsKKyAgICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclBvc18pL2NodW5rU2l6ZV8gIT0KKyAgICAgICAgICAgICAgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQb3NfICsgMykvY2h1bmtTaXplXykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXysrOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfW3JlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18rK10gPQorICAgICAgICAgICAgcmVhZEJ1ZmZlcl9bcmVhZFN0YXRlXy5idWZmZXJQb3NfKytdOworCisgICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18gPT0gNCkgeworICAgICAgICAgICAgYXV0byBzaXplID0gKGNhc3QodWludFtdKXJlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZl8pWzBdOworCisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcGFydCBvZiB0aGUgemVybyBwYWRkaW5nIGJldHdlZW4gY2h1bmtzLgorICAgICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQb3NfKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdvdCBhIHZhbGlkIGV2ZW50CisgICAgICAgICAgICByZWFkU3RhdGVfLnJlYWRpbmdTaXplXyA9IGZhbHNlOworICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudExlbl8gPSBzaXplOworICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudFBvc18gPSAwOworCisgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaXMgY29ycnVwdGVkIGFuZCBwZXJmb3JtIHJlY292ZXJ5IGlmIHJlcXVpcmVkCisgICAgICAgICAgICBpZiAoaXNFdmVudENvcnJ1cHRlZCgpKSB7CisgICAgICAgICAgICAgIHBlcmZvcm1SZWNvdmVyeSgpOworICAgICAgICAgICAgICAvLyBzdGFydCBmcm9tIHRoZSB0b3AKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghcmVhZFN0YXRlXy5ldmVudF8pIHsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfID0gbmV3IHVieXRlW3JlYWRTdGF0ZV8uZXZlbnRMZW5fXTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyB0YWtlIGVpdGhlciB0aGUgZW50aXJlIGV2ZW50IG9yIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgIGF1dG8gcmVjbGFpbUJ1ZmZlciA9IG1pbihyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gLSByZWFkU3RhdGVfLmJ1ZmZlclBvc18sCisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50TGVuXyAtIHJlYWRTdGF0ZV8uZXZlbnRQb3NfKTsKKworICAgICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIHJlYWQgYnVmZmVyIGludG8gZXZlbnQgYnVmZmVyCisgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF9bCisgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50UG9zXyAuLiByZWFkU3RhdGVfLmV2ZW50UG9zXyArIHJlY2xhaW1CdWZmZXIKKyAgICAgICAgICBdID0gcmVhZEJ1ZmZlcl9bCisgICAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclBvc18gLi4gcmVhZFN0YXRlXy5idWZmZXJQb3NfICsgcmVjbGFpbUJ1ZmZlcgorICAgICAgICAgIF07CisKKyAgICAgICAgICAvLyBpbmNyZW1lbnQgcG9zaXRpb24gcHRycworICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRQb3NfICs9IHJlY2xhaW1CdWZmZXI7CisgICAgICAgICAgcmVhZFN0YXRlXy5idWZmZXJQb3NfICs9IHJlY2xhaW1CdWZmZXI7CisKKyAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZXZlbnQgaGFzIGJlZW4gcmVhZCBpbiBmdWxsCisgICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRQb3NfID09IHJlYWRTdGF0ZV8uZXZlbnRMZW5fKSB7CisgICAgICAgICAgICAvLyBSZXNldCB0aGUgcmVhZCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBjb21wbGV0ZWQgZXZlbnQuCisgICAgICAgICAgICBhdXRvIGNvbXBsZXRlRXZlbnQgPSByZWFkU3RhdGVfLmV2ZW50XzsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfID0gbnVsbDsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZShyZWFkU3RhdGVfLmJ1ZmZlclBvc18pOworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlRXZlbnQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgYm9vbCBpc0V2ZW50Q29ycnVwdGVkKCkgeworICAgIGlmICgobWF4RXZlbnRTaXplXyA+IDApICYmIChyZWFkU3RhdGVfLmV2ZW50TGVuXyA+IG1heEV2ZW50U2l6ZV8pKSB7CisgICAgICAvLyBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIHVzZXItc3BlZmljaWVkIG1heC1ldmVudCBzaXplCisgICAgICBsb2dFcnJvcigiQ29ycnVwdCBldmVudCByZWFkOiBFdmVudCBzaXplICglcykgZ3JlYXRlciB0aGFuIG1heCAiIH4KKyAgICAgICAgImV2ZW50IHNpemUgKCVzKSIsIHJlYWRTdGF0ZV8uZXZlbnRMZW5fLCBtYXhFdmVudFNpemVfKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVhZFN0YXRlXy5ldmVudExlbl8gPiBjaHVua1NpemVfKSB7CisgICAgICAvLyBFdmVudCBzaXplIGlzIGxhcmdlciB0aGFuIGNodW5rIHNpemUKKyAgICAgIGxvZ0Vycm9yKCJDb3JydXB0IGV2ZW50IHJlYWQ6IEV2ZW50IHNpemUgKCVzKSBncmVhdGVyIHRoYW4gY2h1bmsgIiB+CisgICAgICAgICJzaXplICglcykiLCByZWFkU3RhdGVfLmV2ZW50TGVuXywgY2h1bmtTaXplXyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyAtIEV2ZW50U2l6ZS5zaXplb2YpIC8gY2h1bmtTaXplXykgIT0KKyAgICAgICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUG9zXyArIHJlYWRTdGF0ZV8uZXZlbnRMZW5fIC0gRXZlbnRTaXplLnNpemVvZikgLyBjaHVua1NpemVfKSkKKyAgICB7CisgICAgICAvLyBTaXplIGluZGljYXRlcyB0aGF0IGV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkKKyAgICAgIGxvZ0Vycm9yKCJSZWFkIGNvcnJ1cHQgZXZlbnQuIEV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkuICIgfgorICAgICAgICAiRXZlbnQgc2l6ZTogJXMuIE9mZnNldDogJXMiLCByZWFkU3RhdGVfLmV2ZW50TGVuXywKKyAgICAgICAgKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclBvc18gKyBFdmVudFNpemUuc2l6ZW9mKQorICAgICAgKTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCBwZXJmb3JtUmVjb3ZlcnkoKSB7CisgICAgLy8gcGVyZm9ybSBzb21lIGtpY2thc3MgcmVjb3ZlcnkKKyAgICBhdXRvIGN1ckNodW5rID0gZ2V0Q3VyQ2h1bmsoKTsKKyAgICBpZiAobGFzdEJhZENodW5rXyA9PSBjdXJDaHVuaykgeworICAgICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18rKzsKKyAgICB9IGVsc2UgeworICAgICAgbGFzdEJhZENodW5rXyA9IGN1ckNodW5rOworICAgICAgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18gPSAxOworICAgIH0KKworICAgIGlmIChudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXyA8IG1heENvcnJ1cHRlZEV2ZW50c18pIHsKKyAgICAgIC8vIG1heWJlIHRoZXJlIHdhcyBhbiBlcnJvciBpbiByZWFkaW5nIHRoZSBmaWxlIGZyb20gZGlzaworICAgICAgLy8gc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIGNodW5rIGFuZCB0cnkgYWdhaW4KKyAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSnVzdCBza2lwIGFoZWFkIHRvIHRoZSBuZXh0IGNodW5rIGlmIHdlIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IGNodW5rLgorICAgICAgaWYgKGN1ckNodW5rICE9IChnZXROdW1DaHVua3MoKSAtIDEpKSB7CisgICAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rICsgMSk7CisgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA8IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgICAvLyBXZSBhcmUgaW4gdGFpbGluZyBtb2RlLCB3YWl0IHVudGlsIHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIHN0YXJ0CisgICAgICAgIC8vIHRoZSBuZXh0IGNodW5rLgorICAgICAgICB3aGlsZShjdXJDaHVuayA9PSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgeworICAgICAgICAgIFRocmVhZC5zbGVlcChjb3JydXB0ZWRFdmVudFNsZWVwRHVyYXRpb25fKTsKKyAgICAgICAgfQorICAgICAgICBzZWVrVG9DaHVuayhjdXJDaHVuayArIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUHJldHR5IGhvc2VkIGF0IHRoaXMgc3RhZ2UsIHJld2luZCB0aGUgZmlsZSBiYWNrIHRvIHRoZSBsYXN0CisgICAgICAgIC8vIHN1Y2Nlc3NmdWwgcG9pbnQgYW5kIHB1bnQgb24gdGhlIGVycm9yLgorICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQb3NfKTsKKyAgICAgICAgY3VycmVudEV2ZW50XyA9IG51bGw7CisgICAgICAgIGN1cnJlbnRFdmVudFBvc18gPSAwOworCisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGaWxlIGNvcnJ1cHRlZCBhdCBvZmZzZXQ6ICIgfgorICAgICAgICAgIHRvIXN0cmluZyhvZmZzZXRfICsgcmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQb3NfKSwKKyAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0cmluZyBwYXRoXzsKKyAgRmlsZSBmaWxlXzsKKyAgYm9vbCBpc09wZW5fOworICBsb25nIG9mZnNldF87CisgIHVieXRlW10gY3VycmVudEV2ZW50XzsKKyAgc2l6ZV90IGN1cnJlbnRFdmVudFBvc187CisgIHVsb25nIGNodW5rU2l6ZV87CisgIER1cmF0aW9uIHJlYWRUaW1lb3V0XzsKKyAgc2l6ZV90IG1heEV2ZW50U2l6ZV87CisKKyAgLy8gUmVhZCBidWZmZXIg4oCTIGxhemlseSBhbGxvY2F0ZWQgb24gdGhlIGZpcnN0IHJlYWQoKS4KKyAgdWJ5dGVbXSByZWFkQnVmZmVyXzsKKyAgc2l6ZV90IHJlYWRCdWZmZXJTaXplXzsKKworICBzdGF0aWMgc3RydWN0IFJlYWRTdGF0ZSB7CisgICAgdWJ5dGVbXSBldmVudF87CisgICAgc2l6ZV90IGV2ZW50TGVuXzsKKyAgICBzaXplX3QgZXZlbnRQb3NfOworCisgICAgLy8ga2VlcCB0cmFjayBvZiBldmVudCBzaXplCisgICAgdWJ5dGVbNF0gZXZlbnRTaXplQnVmZl87CisgICAgdWJ5dGUgZXZlbnRTaXplQnVmZlBvc187CisgICAgYm9vbCByZWFkaW5nU2l6ZV8gPSB0cnVlOworCisgICAgLy8gcmVhZCBidWZmZXIgdmFyaWFibGVzCisgICAgc2l6ZV90IGJ1ZmZlclBvc187CisgICAgc2l6ZV90IGJ1ZmZlckxlbl87CisKKyAgICAvLyBsYXN0IHN1Y2Nlc3NmdWwgZGlzcGF0Y2ggcG9pbnQKKyAgICBzaXplX3QgbGFzdERpc3BhdGNoUG9zXzsKKworICAgIHZvaWQgcmVzZXRTdGF0ZShzaXplX3QgbGFzdERpc3BhdGNoUG9zKSB7CisgICAgICByZWFkaW5nU2l6ZV8gPSB0cnVlOworICAgICAgZXZlbnRTaXplQnVmZlBvc18gPSAwOworICAgICAgbGFzdERpc3BhdGNoUG9zXyA9IGxhc3REaXNwYXRjaFBvczsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0QWxsVmFsdWVzKCkgeworICAgICAgcmVzZXRTdGF0ZSgwKTsKKyAgICAgIGJ1ZmZlclBvc18gPSAwOworICAgICAgYnVmZmVyTGVuXyA9IDA7CisgICAgICBldmVudF8gPSBudWxsOworICAgIH0KKyAgfQorICBSZWFkU3RhdGUgcmVhZFN0YXRlXzsKKworICB1bG9uZyBsYXN0QmFkQ2h1bmtfOworICB1aW50IG1heENvcnJ1cHRlZEV2ZW50c187CisgIHVpbnQgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua187CisgIER1cmF0aW9uIGNvcnJ1cHRlZEV2ZW50U2xlZXBEdXJhdGlvbl87Cit9CisKKy8qKgorICogQSB0cmFuc3BvcnQgdXNlZCB0byB3cml0ZSBsb2cgZmlsZXMuIEl0IGNhbiBuZXZlciBiZSByZWFkIGZyb20sIGNhbGxpbmcKKyAqIHJlYWQoKSB0aHJvd3MuCisgKgorICogQ29udHJhcnkgdG8gdGhlIEMrKyBkZXNpZ24sIGV4cGxpY2l0bHkgb3BlbmluZyB0aGUgdHJhbnNwb3J0L2ZpbGUgYmVmb3JlCisgKiB1c2luZyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbWFudWFsbHkgY2xvc2luZyB0aGUgZmlsZSB3aXRob3V0IHJlbHlpbmcgb24gdGhlCisgKiBvYmplY3QgbGlmZXRpbWUuCisgKi8KK2ZpbmFsIGNsYXNzIFRGaWxlV3JpdGVyVHJhbnNwb3J0IDogVEJhc2VUcmFuc3BvcnQgeworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIHdyaXRlciB0cmFuc3BvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwYXRoID0gUGF0aCBvZiB0aGUgZmlsZSB0byBvcHBlcmF0ZSBvbi4KKyAgICovCisgIHRoaXMoc3RyaW5nIHBhdGgpIHsKKyAgICBwYXRoXyA9IHBhdGg7CisKKyAgICBjaHVua1NpemVfID0gREVGQVVMVF9DSFVOS19TSVpFOworICAgIGV2ZW50QnVmZmVyU2l6ZV8gPSBERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFOworICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uID0gREVGQVVMVF9JT19FUlJPUl9TTEVFUF9EVVJBVElPTjsKKyAgICBtYXhGbHVzaEJ5dGVzXyA9IERFRkFVTFRfTUFYX0ZMVVNIX0JZVEVTOworICAgIG1heEZsdXNoSW50ZXJ2YWxfID0gREVGQVVMVF9NQVhfRkxVU0hfSU5URVJWQUw7CisgIH0KKworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGlzT3Blbl87CisgIH0KKworICAvKioKKyAgICogQSBmaWxlIHdyaXRlciB0cmFuc3BvcnQgY2FuIG5ldmVyIGJlIHJlYWQgZnJvbS4KKyAgICovCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgaWYgKGlzT3BlbikgcmV0dXJuOworCisgICAgd3JpdGVyVGhyZWFkXyA9IHNwYXduKAorICAgICAgJndyaXRlclRocmVhZCwKKyAgICAgIHBhdGhfLAorICAgICAgY2h1bmtTaXplXywKKyAgICAgIG1heEZsdXNoQnl0ZXNfLAorICAgICAgbWF4Rmx1c2hJbnRlcnZhbF8sCisgICAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbl8KKyAgICApOworICAgIHNldE1heE1haWxib3hTaXplKHdyaXRlclRocmVhZF8sIGV2ZW50QnVmZmVyU2l6ZV8sIE9uQ3Jvd2RpbmcuYmxvY2spOworICAgIGlzT3Blbl8gPSB0cnVlOworICB9CisKKyAgLyoqCisgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LCBpLmUuIHRoZSB1bmRlcmx5aW5nIGZpbGUgYW5kIHRoZSB3cml0ZXIgdGhyZWFkLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoIWlzT3BlbikgcmV0dXJuOworCisgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBTaHV0ZG93bk1lc3NhZ2UoKSwgdGhpc1RpZCk7CisgICAgcmVjZWl2ZSgoU2h1dGRvd25NZXNzYWdlIG1zZywgVGlkIHRpZCl7fSk7CisgICAgaXNPcGVuXyA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIEVucXVldWVzIHRoZSBwYXNzZWQgc2xpY2Ugb2YgZGF0YSBmb3Igd3JpdGluZyBhbmQgaW1tZWRpYXRlbHkgcmV0dXJucy4KKyAgICogd3JpdGUoKSBvbmx5IGJsb2NrcyBpZiB0aGUgZXZlbnQgYnVmZmVyIGhhcyBiZWVuIGV4aGF1c3RlZC4KKyAgICoKKyAgICogVGhlIHRyYW5zcG9ydCBtdXN0IGJlIG9wZW4gd2hlbiBjYWxsaW5nIHRoaXMuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWYgPSBTbGljZSBvZiBkYXRhIHRvIHdyaXRlLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgd3JpdGUgdG8gbm9uLW9wZW4gZmlsZS4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIGlmIChidWYuZW1wdHkpIHsKKyAgICAgIGxvZ0Vycm9yKCJDYW5ub3Qgd3JpdGUgZW1wdHkgZXZlbnQsIHNraXBwaW5nLiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gbWF4U2l6ZSA9IGNodW5rU2l6ZSAtIEV2ZW50U2l6ZS5zaXplb2Y7CisgICAgZW5mb3JjZShidWYubGVuZ3RoIDw9IG1heFNpemUsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCB3cml0ZSBtb3JlIHRoYW4gIiB+IHRvIXN0cmluZyhtYXhTaXplKSB+CisgICAgICAiYnl0ZXMgYXQgb25jZSBkdWUgdG8gY2h1bmsgc2l6ZS4iKSk7CisKKyAgICBzZW5kKHdyaXRlclRocmVhZF8sIGJ1Zi5pZHVwKTsKKyAgfQorCisgIC8qKgorICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAgICoKKyAgICogVGhlIHRyYW5zcG9ydCBtdXN0IGJlIG9wZW4gd2hlbiBjYWxsaW5nIHRoaXMuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3QgZmx1c2ggZmlsZSBpZiBub3Qgb3Blbi4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU4pKTsKKworICAgIHNlbmQod3JpdGVyVGhyZWFkXywgRmx1c2hNZXNzYWdlKCksIHRoaXNUaWQpOworICAgIHJlY2VpdmUoKEZsdXNoTWVzc2FnZSBtc2csIFRpZCB0aWQpe30pOworICB9CisKKyAgLyoqCisgICAqIFRoZSBzaXplIG9mIHRoZSBjaHVua3MgdGhlIGZpbGUgaXMgZGl2aWRlZCBpbnRvLCBpbiBieXRlcy4KKyAgICoKKyAgICogQSBzaW5nbGUgZXZlbnQgKHdyaXRlIGNhbGwpIG5ldmVyIHNwYW5zIG11bHRpcGxlIGNodW5rcyDigJMgdGhpcworICAgKiBlZmZlY3RpdmVseSBsaW1pdHMgdGhlIGV2ZW50IHNpemUgdG8gY2h1bmtTaXplIC0gRXZlbnRTaXplLnNpemVvZi4KKyAgICovCisgIHVsb25nIGNodW5rU2l6ZSgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGNodW5rU2l6ZV87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBjaHVua1NpemUodWxvbmcgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgZW5mb3JjZSghaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgc2V0IGNodW5rIHNpemUgYWZ0ZXIgVEZpbGVXcml0ZXJUcmFuc3BvcnQgaGFzIGJlZW4gb3BlbmVkLiIpKTsKKyAgICBjaHVua1NpemVfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHdyaXRlKCkgY2FsbHMgYnVmZmVyZWQsIG9yIHplcm8gZm9yIG5vIGxpbWl0LgorICAgKgorICAgKiBJZiB0aGUgYnVmZmVyIGlzIGV4aGF1c3RlZCwgd3JpdGUoKSB3aWxsIGJsb2NrIHVudGlsIHNwYWNlIGJlY29tZXMKKyAgICogYXZhaWxhYmxlLgorICAgKi8KKyAgc2l6ZV90IGV2ZW50QnVmZmVyU2l6ZSgpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGV2ZW50QnVmZmVyU2l6ZV87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBldmVudEJ1ZmZlclNpemUoc2l6ZV90IHZhbHVlKSBAcHJvcGVydHkgeworICAgIGV2ZW50QnVmZmVyU2l6ZV8gPSB2YWx1ZTsKKyAgICBpZiAoaXNPcGVuKSB7CisgICAgICBzZXRNYXhNYWlsYm94U2l6ZSh3cml0ZXJUaHJlYWRfLCB2YWx1ZSwgT25Dcm93ZGluZy50aHJvd0V4Y2VwdGlvbik7CisgICAgfQorICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9FVkVOVF9CVUZGRVJfU0laRSA9IDEwXzAwMDsKKworICAvKioKKyAgICogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYnVmZmVyZWQgYmVmb3JlIHdyaXRpbmcgYW5kIGZsdXNoaW5nIHRoZSBmaWxlCisgICAqIHRvIGRpc2suCisgICAqCisgICAqIEN1cnJlbnRseSBjYW5ub3QgYmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvIHdyaXRlKCkuCisgICAqLworICBzaXplX3QgbWF4Rmx1c2hCeXRlcygpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIG1heEZsdXNoQnl0ZXNfOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgbWF4Rmx1c2hCeXRlcyhzaXplX3QgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgbWF4Rmx1c2hCeXRlc18gPSB2YWx1ZTsKKyAgICBpZiAoaXNPcGVuKSB7CisgICAgICBzZW5kKHdyaXRlclRocmVhZF8sIEZsdXNoQnl0ZXNNZXNzYWdlKHZhbHVlKSk7CisgICAgfQorICB9CisKKyAgLy8vIGRpdHRvCisgIGVudW0gREVGQVVMVF9NQVhfRkxVU0hfQllURVMgPSAxMDAwICogMTAyNDsKKworICAvKioKKyAgICogTWF4aW11bSBpbnRlcnZhbCBiZXR3ZWVuIGZsdXNoaW5nIHRoZSBmaWxlIHRvIGRpc2suCisgICAqCisgICAqIEN1cnJlbmx0eSBjYW5ub3QgYmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvIHdyaXRlKCkuCisgICAqLworICBEdXJhdGlvbiBtYXhGbHVzaEludGVydmFsKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gbWF4Rmx1c2hJbnRlcnZhbF87CisgIH0KKworICAvLy8gZGl0dG8KKyAgdm9pZCBtYXhGbHVzaEludGVydmFsKER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIG1heEZsdXNoSW50ZXJ2YWxfID0gdmFsdWU7CisgICAgaWYgKGlzT3BlbikgeworICAgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBGbHVzaEludGVydmFsTWVzc2FnZSh2YWx1ZSkpOworICAgIH0KKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfTUFYX0ZMVVNIX0lOVEVSVkFMID0gZHVyISJzZWNvbmRzIigzKTsKKworICAvKioKKyAgICogV2hlbiB0aGUgd3JpdGVyIHRocmVhZCBlbmNvdW50ZXJlcyBhbiBJL08gZXJyb3IsIGl0IGdvZXMgcGF1c2VzIGZvciBhCisgICAqIHNob3J0IHRpbWUgYmVmb3JlIHRyeWluZyB0byByZW9wZW4gdGhlIG91dHB1dCBmaWxlLiBUaGlzIGNvbnRyb2xzIHRoZQorICAgKiBzbGVlcCBkdXJhdGlvbi4KKyAgICovCisgIER1cmF0aW9uIGlvRXJyb3JTbGVlcER1cmF0aW9uKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gaW9FcnJvclNsZWVwRHVyYXRpb25fOworICB9CisKKyAgLy8vIGRpdHRvCisgIHZvaWQgaW9FcnJvclNsZWVwRHVyYXRpb24oRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgaW9FcnJvclNsZWVwRHVyYXRpb25fID0gdmFsdWU7CisgICAgaWYgKGlzT3BlbikgeworICAgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBGbHVzaEludGVydmFsTWVzc2FnZSh2YWx1ZSkpOworICAgIH0KKyAgfQorCisgIC8vLyBkaXR0bworICBlbnVtIERFRkFVTFRfSU9fRVJST1JfU0xFRVBfRFVSQVRJT04gPSBkdXIhIm1zZWNzIig1MDApOworCitwcml2YXRlOgorICBzdHJpbmcgcGF0aF87CisgIHVsb25nIGNodW5rU2l6ZV87CisgIHNpemVfdCBldmVudEJ1ZmZlclNpemVfOworICBEdXJhdGlvbiBpb0Vycm9yU2xlZXBEdXJhdGlvbl87CisgIHNpemVfdCBtYXhGbHVzaEJ5dGVzXzsKKyAgRHVyYXRpb24gbWF4Rmx1c2hJbnRlcnZhbF87CisgIGJvb2wgaXNPcGVuXzsKKyAgVGlkIHdyaXRlclRocmVhZF87Cit9CisKK3ByaXZhdGUgeworICAvLyBTaWduYWxzIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGJlIGZsdXNoZWQgb24gZGlzay4gU2VudCB0byB0aGUgd3JpdGVyCisgIC8vIHRocmVhZCBhbmQgc2VudCBiYWNrIGFsb25nIHdpdGggdGhlIHRpZCBmb3IgY29uZmlybWF0aW9uLgorICBzdHJ1Y3QgRmx1c2hNZXNzYWdlIHt9CisKKyAgLy8gU2lnbmFscyB0aGF0IHRoZSB3cml0ZXIgdGhyZWFkIHNob3VsZCBjbG9zZSB0aGUgZmlsZSBhbmQgc2h1dCBkb3duLiBTZW50CisgIC8vIHRvIHRoZSB3cml0ZXIgdGhyZWFkIGFuZCBzZW50IGJhY2sgYWxvbmcgd2l0aCB0aGUgdGlkIGZvciBjb25maXJtYXRpb24uCisgIHN0cnVjdCBTaHV0ZG93bk1lc3NhZ2Uge30KKworICBzdHJ1Y3QgRmx1c2hCeXRlc01lc3NhZ2UgeworICAgIHNpemVfdCB2YWx1ZTsKKyAgfQorCisgIHN0cnVjdCBGbHVzaEludGVydmFsTWVzc2FnZSB7CisgICAgRHVyYXRpb24gdmFsdWU7CisgIH0KKworICBzdHJ1Y3QgSW9FcnJvclNsZWVwRHVyYXRpb25NZXNzYWdlIHsKKyAgICBEdXJhdGlvbiB2YWx1ZTsKKyAgfQorCisgIHZvaWQgd3JpdGVyVGhyZWFkKAorICAgIHN0cmluZyBwYXRoLAorICAgIHVsb25nIGNodW5rU2l6ZSwKKyAgICBzaXplX3QgbWF4Rmx1c2hCeXRlcywKKyAgICBEdXJhdGlvbiBtYXhGbHVzaEludGVydmFsLAorICAgIER1cmF0aW9uIGlvRXJyb3JTbGVlcER1cmF0aW9uCisgICkgeworICAgIGJvb2wgZXJyb3JPcGVuaW5nOworICAgIEZpbGUgZmlsZTsKKyAgICB1bG9uZyBvZmZzZXQ7CisgICAgdHJ5IHsKKyAgICAgIC8vIE9wZW4gZmlsZSBpbiBhcHBlbmRpbmcgYW5kIGJpbmFyeSBtb2RlLgorICAgICAgZmlsZSA9IEZpbGUocGF0aCwgImFiIik7CisgICAgICBvZmZzZXQgPSBmaWxlLnRlbGwoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIkVycm9yIG9uIG9wZW5pbmcgb3V0cHV0IGZpbGUgaW4gd3JpdGVyIHRocmVhZDogJXMiLCBlKTsKKyAgICAgIGVycm9yT3BlbmluZyA9IHRydWU7CisgICAgfQorCisgICAgYXV0byBmbHVzaFRpbWVyID0gU3RvcFdhdGNoKEF1dG9TdGFydC55ZXMpOworICAgIHNpemVfdCB1bmZsdXNoZWRCeXRlQ291bnQ7CisKKyAgICBUaWQgc2h1dGRvd25SZXF1ZXN0VGlkOworICAgIGJvb2wgc2h1dGRvd25SZXF1ZXN0ZWQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChzaHV0ZG93blJlcXVlc3RlZCkgYnJlYWs7CisKKyAgICAgIGJvb2wgZm9yY2VGbHVzaDsKKyAgICAgIFRpZCBmbHVzaFJlcXVlc3RUaWQ7CisgICAgICByZWNlaXZlVGltZW91dChtYXgoZHVyISJobnNlY3MiKDApLCBtYXhGbHVzaEludGVydmFsIC0gZmx1c2hUaW1lci5wZWVrKCkpLAorICAgICAgICAoaW1tdXRhYmxlKHVieXRlKVtdIGRhdGEpIHsKKyAgICAgICAgICB3aGlsZSAoZXJyb3JPcGVuaW5nKSB7CisgICAgICAgICAgICBsb2dFcnJvcigiV3JpdGVyIHRocmVhZCBnb2luZyB0byBzbGVlcCBmb3IgJXMgwrVzIGR1ZSB0byBJTyBlcnJvcnMiLAorICAgICAgICAgICAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbi50b3RhbCEidXNlY3MiKTsKKworICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGlvRXJyb3JTbGVlcER1cmF0aW9uLCBiZWluZyByZWFkeSB0byBiZSBpbnRlcnJ1cHRlZAorICAgICAgICAgICAgLy8gYnkgc2h1dGRvd24gcmVxdWVzdHMuCisgICAgICAgICAgICBhdXRvIHRpbWVkT3V0ID0gcmVjZWl2ZVRpbWVvdXQoaW9FcnJvclNsZWVwRHVyYXRpb24sCisgICAgICAgICAgICAgIChTaHV0ZG93bk1lc3NhZ2UgbXNnLCBUaWQgdGlkKXsgc2h1dGRvd25SZXF1ZXN0VGlkID0gdGlkOyB9KTsKKyAgICAgICAgICAgIGlmICghdGltZWRPdXQpIHsKKyAgICAgICAgICAgICAgLy8gV2UgZ290IGEgc2h1dGRvd24gcmVxdWVzdCwganVzdCBkcm9wIGFsbCBldmVudHMgYW5kIGV4aXQgdGhlCisgICAgICAgICAgICAgIC8vIG1haW4gbG9vcCBhcyB0byBub3QgYmxvY2sgYXBwbGljYXRpb24gc2h1dGRvd24gd2l0aCBvdXIgdHJpZXMKKyAgICAgICAgICAgICAgLy8gd2hpY2ggd2UgbXVzdCBhc3N1bWUgdG8gZmFpbC4KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGZpbGUgPSBGaWxlKHBhdGgsICJhYiIpOworICAgICAgICAgICAgICB1bmZsdXNoZWRCeXRlQ291bnQgPSAwOworICAgICAgICAgICAgICBlcnJvck9wZW5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgbG9nRXJyb3IoIk91dHB1dCBmaWxlICVzIHJlb3BlbmVkIGR1cmluZyB3cml0ZXIgdGhyZWFkIGVycm9yICIgfgorICAgICAgICAgICAgICAgICJyZWNvdmVyeSIsIHBhdGgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgbG9nRXJyb3IoIlVuYWJsZSB0byByZW9wZW4gb3V0cHV0IGZpbGUgJXMgZHVyaW5nIHdyaXRlciAiIH4KKyAgICAgICAgICAgICAgICAidGhyZWFkIGVycm9yIHJlY292ZXJ5IiwgcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBldmVudCBkb2VzIG5vdCBjcm9zcyB0aGUgY2h1bmsgYm91bmRhcnkgYnkgd3JpdGluZworICAgICAgICAgIC8vIGEgcGFkZGluZyBjb25zaXN0aW5nIG9mIHplcm9lcyBpZiBpdCB3b3VsZC4KKyAgICAgICAgICBhdXRvIGNodW5rMSA9IG9mZnNldCAvIGNodW5rU2l6ZTsKKyAgICAgICAgICBhdXRvIGNodW5rMiA9IChvZmZzZXQgKyBFdmVudFNpemUuc2l6ZW9mICsgZGF0YS5sZW5ndGggLSAxKSAvIGNodW5rU2l6ZTsKKworICAgICAgICAgIGlmIChjaHVuazEgIT0gY2h1bmsyKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBUaGUgQysrIGltcGxlbWVudGF0aW9uIHJlZmV0Y2hlcyB0aGUgb2Zmc2V0IGhlcmUgdG8gwrtrZWVwCisgICAgICAgICAgICAvLyBpbiBzeW5jwqsg4oCTIHdoeSB3b3VsZCB0aGlzIGJlIG5lZWRlZD8KKyAgICAgICAgICAgIGF1dG8gcGFkZGluZyA9IGNhc3Qoc2l6ZV90KQorICAgICAgICAgICAgICAoKCgob2Zmc2V0IC8gY2h1bmtTaXplKSArIDEpICogY2h1bmtTaXplKSAtIG9mZnNldCk7CisgICAgICAgICAgICBhdXRvIHplcm9lcyA9IG5ldyB1Ynl0ZVtwYWRkaW5nXTsKKyAgICAgICAgICAgIGZpbGUucmF3V3JpdGUoemVyb2VzKTsKKyAgICAgICAgICAgIHVuZmx1c2hlZEJ5dGVDb3VudCArPSBwYWRkaW5nOworICAgICAgICAgICAgb2Zmc2V0ICs9IHBhZGRpbmc7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gVE9ETzogMiBzeXNjYWxscyBoZXJlLCBpcyB0aGlzIGEgcHJvYmxlbSBwZXJmb3JtYW5jZS13aXNlPworICAgICAgICAgIC8vIFByb2JhYmx5IGFieXNtYWwgcGVyZm9ybWFuY2Ugb24gV2luZG93cyBkdWUgdG8gcmF3V3JpdGUKKyAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICB1aW50IGxlbiA9IGNhc3QodWludClkYXRhLmxlbmd0aDsKKyAgICAgICAgICBmaWxlLnJhd1dyaXRlKGNhc3QodWJ5dGVbXSkoJmxlbilbMC4uMV0pOworICAgICAgICAgIGZpbGUucmF3V3JpdGUoZGF0YSk7CisKKyAgICAgICAgICBhdXRvIGJ5dGVzV3JpdHRlbiA9IEV2ZW50U2l6ZS5zaXplb2YgKyBkYXRhLmxlbmd0aDsKKyAgICAgICAgICB1bmZsdXNoZWRCeXRlQ291bnQgKz0gYnl0ZXNXcml0dGVuOworICAgICAgICAgIG9mZnNldCArPSBieXRlc1dyaXR0ZW47CisgICAgICAgIH0sIChGbHVzaEJ5dGVzTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICBtYXhGbHVzaEJ5dGVzID0gbXNnLnZhbHVlOworICAgICAgICB9LCAoRmx1c2hJbnRlcnZhbE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgbWF4Rmx1c2hJbnRlcnZhbCA9IG1zZy52YWx1ZTsKKyAgICAgICAgfSwgKElvRXJyb3JTbGVlcER1cmF0aW9uTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbiA9IG1zZy52YWx1ZTsKKyAgICAgICAgfSwgKEZsdXNoTWVzc2FnZSBtc2csIFRpZCB0aWQpIHsKKyAgICAgICAgICBmb3JjZUZsdXNoID0gdHJ1ZTsKKyAgICAgICAgICBmbHVzaFJlcXVlc3RUaWQgPSB0aWQ7CisgICAgICAgIH0sIChPd25lclRlcm1pbmF0ZWQgbXNnKSB7CisgICAgICAgICAgc2h1dGRvd25SZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICB9LCAoU2h1dGRvd25NZXNzYWdlIG1zZywgVGlkIHRpZCkgeworICAgICAgICAgIHNodXRkb3duUmVxdWVzdGVkID0gdHJ1ZTsKKyAgICAgICAgICBzaHV0ZG93blJlcXVlc3RUaWQgPSB0aWQ7CisgICAgICAgIH0KKyAgICAgICk7CisKKyAgICAgIGlmIChlcnJvck9wZW5pbmcpIGNvbnRpbnVlOworCisgICAgICBib29sIGZsdXNoOworICAgICAgaWYgKGZvcmNlRmx1c2ggfHwgc2h1dGRvd25SZXF1ZXN0ZWQgfHwgdW5mbHVzaGVkQnl0ZUNvdW50ID4gbWF4Rmx1c2hCeXRlcykgeworICAgICAgICBmbHVzaCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGNhc3QoRHVyYXRpb24pZmx1c2hUaW1lci5wZWVrKCkgPiBtYXhGbHVzaEludGVydmFsKSB7CisgICAgICAgIGlmICh1bmZsdXNoZWRCeXRlQ291bnQgPT0gMCkgeworICAgICAgICAgIC8vIElmIHRoZSBmbHVzaCB0aW1lciBpcyBkdWUsIGJ1dCBubyBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4sIGRvbid0CisgICAgICAgICAgLy8gbmVlZGxlc3NseSBmc3luYywgYnV0IGRvIHJlc2V0IHRoZSB0aW1lci4KKyAgICAgICAgICBmbHVzaFRpbWVyLnJlc2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZmx1c2ggPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChmbHVzaCkgeworICAgICAgICBmaWxlLmZsdXNoKCk7CisgICAgICAgIGZsdXNoVGltZXIucmVzZXQoKTsKKyAgICAgICAgdW5mbHVzaGVkQnl0ZUNvdW50ID0gMDsKKyAgICAgICAgaWYgKGZvcmNlRmx1c2gpIHNlbmQoZmx1c2hSZXF1ZXN0VGlkLCBGbHVzaE1lc3NhZ2UoKSwgdGhpc1RpZCk7CisgICAgICB9CisgICAgfQorCisgICAgZmlsZS5jbG9zZSgpOworCisgICAgaWYgKHNodXRkb3duUmVxdWVzdFRpZCAhPSBUaWQuaW5pdCkgeworICAgICAgc2VuZChzaHV0ZG93blJlcXVlc3RUaWQsIFNodXRkb3duTWVzc2FnZSgpLCB0aGlzVGlkKTsKKyAgICB9CisgIH0KK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgaW1wb3J0IGNvcmUubWVtb3J5IDogR0M7CisgIGltcG9ydCBzdGQuZmlsZTsKK30KKwordW5pdHRlc3QgeworICB2b2lkIHRyeVJlbW92ZShzdHJpbmcgZmlsZU5hbWUpIHsKKyAgICB0cnkgeworICAgICAgcmVtb3ZlKGZpbGVOYW1lKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24pIHt9CisgIH0KKworICBpbW11dGFibGUgZmlsZU5hbWUgPSAidW5pdHRlc3QuZGF0LnRtcCI7CisgIGVuZm9yY2UoIWV4aXN0cyhmaWxlTmFtZSksICJVbml0IHRlc3Qgb3V0cHV0IGZpbGUgIiB+IGZpbGVOYW1lIH4KKyAgICAiIGFscmVhZHkgZXhpc3RzLiIpOworCisgIC8qCisgICAqIENoZWNrIHRoZSBtb3N0IGJhc2ljIHJlYWRpbmcvd3JpdGluZyBvcGVyYXRpb25zLgorICAgKi8KKyAgeworICAgIHNjb3BlIChleGl0KSB0cnlSZW1vdmUoZmlsZU5hbWUpOworCisgICAgYXV0byB3cml0ZXIgPSBuZXcgVEZpbGVXcml0ZXJUcmFuc3BvcnQoZmlsZU5hbWUpOworICAgIHdyaXRlci5vcGVuKCk7CisgICAgc2NvcGUgKGV4aXQpIHdyaXRlci5jbG9zZSgpOworCisgICAgd3JpdGVyLndyaXRlKFsxLCAyXSk7CisgICAgd3JpdGVyLndyaXRlKFszLCA0XSk7CisgICAgd3JpdGVyLndyaXRlKFs1LCA2LCA3XSk7CisgICAgd3JpdGVyLmZsdXNoKCk7CisKKyAgICBhdXRvIHJlYWRlciA9IG5ldyBURmlsZVJlYWRlclRyYW5zcG9ydChmaWxlTmFtZSk7CisgICAgcmVhZGVyLm9wZW4oKTsKKyAgICBzY29wZSAoZXhpdCkgcmVhZGVyLmNsb3NlKCk7CisKKyAgICBhdXRvIGJ1ZiA9IG5ldyB1Ynl0ZVs3XTsKKyAgICByZWFkZXIucmVhZEFsbChidWYpOworICAgIGVuZm9yY2UoYnVmID09IFsxLCAyLCAzLCA0LCA1LCA2LCA3XSk7CisgIH0KKworICAvKgorICAgKiBDaGVjayB0aGF0IGNodW5raW5nIHdvcmtzIGFzIGV4cGVjdGVkLgorICAgKi8KKyAgeworICAgIHNjb3BlIChleGl0KSB0cnlSZW1vdmUoZmlsZU5hbWUpOworCisgICAgc3RhdGljIGFzc2VydChFdmVudFNpemUuc2l6ZW9mID09IDQpOworICAgIGVudW0gQ0hVTktfU0laRSA9IDEwOworCisgICAgLy8gV3JpdGUgc29tZSBjb250ZW50cyB0byB0aGUgZmlsZS4KKyAgICB7CisgICAgICBhdXRvIHdyaXRlciA9IG5ldyBURmlsZVdyaXRlclRyYW5zcG9ydChmaWxlTmFtZSk7CisgICAgICB3cml0ZXIuY2h1bmtTaXplID0gQ0hVTktfU0laRTsKKyAgICAgIHdyaXRlci5vcGVuKCk7CisgICAgICBzY29wZSAoZXhpdCkgd3JpdGVyLmNsb3NlKCk7CisKKyAgICAgIHdyaXRlci53cml0ZShbMHhkZV0pOworICAgICAgd3JpdGVyLndyaXRlKFsweGFkXSk7CisgICAgICAvLyBDaHVuayBib3VuZGFyeSBoZXJlLgorICAgICAgd3JpdGVyLndyaXRlKFsweGJlXSk7CisgICAgICAvLyBUaGUgbmV4dCB3cml0ZSBkb2Vzbid0IGZpdCBpbiB0aGUgZml2ZSBieXRlcyByZW1haW5pbmcsIHNvIHdlIGV4cGVjdAorICAgICAgLy8gcGFkZGluZyB6ZXJvIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCisgICAgICB3cml0ZXIud3JpdGUoWzB4ZWYsIDB4MTJdKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgd3JpdGVyLndyaXRlKG5ldyB1Ynl0ZVtDSFVOS19TSVpFXSk7CisgICAgICAgIGVuZm9yY2UoZmFsc2UsICJDb3VsZCB3cml0ZSBldmVudCBub3QgZml0dGluZyBpbiBhIHNpbmdsZSBjaHVuay4iKTsKKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkge30KKworICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhlIHJhdyBjb250ZW50cyBvZiB0aGUgZmlsZSB0byBzZWUgaWYgY2h1bmsgcGFkZGluZyB3YXMgd3JpdHRlbgorICAgIC8vIGFzIGV4cGVjdGVkLgorICAgIGF1dG8gZmlsZSA9IEZpbGUoZmlsZU5hbWUsICJyIik7CisgICAgZW5mb3JjZShmaWxlLnNpemUgPT0gMjYpOworICAgIGF1dG8gd3JpdHRlbiA9IG5ldyB1Ynl0ZVsyNl07CisgICAgZmlsZS5yYXdSZWFkKHdyaXR0ZW4pOworICAgIGVuZm9yY2Uod3JpdHRlbiA9PSBbCisgICAgICAxLCAwLCAwLCAwLCAweGRlLAorICAgICAgMSwgMCwgMCwgMCwgMHhhZCwKKyAgICAgIDEsIDAsIDAsIDAsIDB4YmUsCisgICAgICAwLCAwLCAwLCAwLCAwLAorICAgICAgMiwgMCwgMCwgMCwgMHhlZiwgMHgxMgorICAgIF0pOworCisgICAgLy8gUmVhZCB0aGUgZGF0YSBiYWNrIGluLCBnZXR0aW5nIGFsbCB0aGUgZXZlbnRzIGF0IG9uY2UuCisgICAgeworICAgICAgYXV0byByZWFkZXIgPSBuZXcgVEZpbGVSZWFkZXJUcmFuc3BvcnQoZmlsZU5hbWUpOworICAgICAgcmVhZGVyLmNodW5rU2l6ZSA9IENIVU5LX1NJWkU7CisgICAgICByZWFkZXIub3BlbigpOworICAgICAgc2NvcGUgKGV4aXQpIHJlYWRlci5jbG9zZSgpOworCisgICAgICBhdXRvIGJ1ZiA9IG5ldyB1Ynl0ZVs1XTsKKyAgICAgIHJlYWRlci5yZWFkQWxsKGJ1Zik7CisgICAgICBlbmZvcmNlKGJ1ZiA9PSBbMHhkZSwgMHhhZCwgMHhiZSwgMHhlZiwgMHgxMl0pOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIE1ha2Ugc3VyZSB0aGF0IGNsb3NlKCkgZXhpdHMgInF1aWNrbHkiLCBpLmUuIHRoYXQgdGhlcmUgaXMgbm8gcHJvYmxlbQorICAgKiB3aXRoIHRoZSB3b3JrZXIgdGhyZWFkIHdha2luZyB1cC4KKyAgICovCisgIHsKKyAgICBpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0OworICAgIGVudW0gTlVNX0lURVJBVElPTlMgPSAxMDAwOworCisgICAgdWludCBudW1PdmVyID0gMDsKKyAgICBmb3JlYWNoIChuOyAwIC4uIE5VTV9JVEVSQVRJT05TKSB7CisgICAgICBzY29wZSAoZXhpdCkgdHJ5UmVtb3ZlKGZpbGVOYW1lKTsKKworICAgICAgYXV0byB0cmFuc3BvcnQgPSBuZXcgVEZpbGVXcml0ZXJUcmFuc3BvcnQoZmlsZU5hbWUpOworICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKworICAgICAgLy8gV3JpdGUgc29tZXRoaW5nIHNvIHRoYXQgdGhlIHdyaXRlciB0aHJlYWQgZ2V0cyBzdGFydGVkLgorICAgICAgdHJhbnNwb3J0LndyaXRlKGNhc3QodWJ5dGVbXSkiZm9vIik7CisKKyAgICAgIC8vIEV2ZXJ5IG90aGVyIGl0ZXJhdGlvbiwgYWxzbyBjYWxsIGZsdXNoKCksIGp1c3QgaW4gY2FzZSB0aGF0IHBvdGVudGlhbGx5CisgICAgICAvLyBoYXMgYW55IGVmZmVjdCBvbiBob3cgdGhlIHdyaXRlciB0aHJlYWQgd2FrZXMgdXAuCisgICAgICBpZiAobiAmIDB4MSkgeworICAgICAgICB0cmFuc3BvcnQuZmx1c2goKTsKKyAgICAgIH0KKworICAgICAgLy8gVGltZSB0aGUgY2FsbCB0byBjbG9zZSgpLgorICAgICAgYXV0byBzdyA9IFN0b3BXYXRjaChBdXRvU3RhcnQueWVzKTsKKyAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgc3cuc3RvcCgpOworCisgICAgICAvLyBJZiBhbnkgYXR0ZW1wdCB0YWtlcyBtb3JlIHRoYW4gNTAwbXMsIHRyZWF0IHRoYXQgYXMgYSBmYXRhbCBmYWlsdXJlIHRvCisgICAgICAvLyBhdm9pZCBsb29waW5nIG92ZXIgYSBwb3RlbnRpYWxseSB2ZXJ5IHNsb3cgb3BlcmF0aW9uLgorICAgICAgZW5mb3JjZShzdy5wZWVrKCkudG90YWwhIm1zZWNzIiA8IDE1MDAsCisgICAgICAgIHRleHQoImNsb3NlKCkgdG9vayAiLCBzdy5wZWVrKCkudG90YWwhIm1zZWNzIiwgIm1zLiIpKTsKKworICAgICAgLy8gTm9ybWFsbHksIGl0IHRha2VzIGxlc3MgdGhhbiA1bXMgb24gbXkgZGV2IGJveC4KKyAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBib3ggaXMgaGVhdmlseSBsb2FkZWQsIHNvbWUgb2YgdGhlIHRlc3QgcnVucyBjYW4gdGFrZQorICAgICAgLy8gbG9uZ2VyLiBBZGRpdGlvbmFsbHksIG9uIGEgV2luZG93cyBTZXJ2ZXIgMjAwOCBpbnN0YW5jZSBydW5uaW5nIGluCisgICAgICAvLyBhIFZpcnR1YWxCb3ggVk0sIGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgYWJvdXQgYSBxdWFydGVyIG9mIHRoZSBydW5zCisgICAgICAvLyB0YWtlcyAoMjE3IMKxIDEpIG1zLCBmb3IgcmVhc29ucyBub3QgeWV0IGtub3duLgorICAgICAgaWYgKHN3LnBlZWsoKS50b3RhbCEibXNlY3MiID4gNTApIHsKKyAgICAgICAgKytudW1PdmVyOworICAgICAgfQorCisgICAgICAvLyBGb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24gcnVucyBldmVyeSBub3cgYW5kIHRoZW4gdG8gbWFrZSBzdXJlIHdlCisgICAgICAvLyBkb24ndCBydW4gb3V0IG9mIE9TIHRocmVhZCBoYW5kbGVzLgorICAgICAgaWYgKCEobiAlIDEwMCkpIEdDLmNvbGxlY3QoKTsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgZmV3ZXIgdGhhbiBhIHRoaXJkIG9mIHRoZSBydW5zIHRvb2sgbG9uZ2VyIHRoYW4gNW1zLgorICAgIGVuZm9yY2UobnVtT3ZlciA8IE5VTV9JVEVSQVRJT05TIC8gMywKKyAgICAgIHRleHQobnVtT3ZlciwgIiBpdGVyYXRpb25zIHRvb2sgbW9yZSB0aGFuIDEwIG1zLiIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWQuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGVmZmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkLmQKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlIHRocmlmdC50cmFuc3BvcnQuZnJhbWVkOworCitpbXBvcnQgY29yZS5iaXRvcCA6IGJzd2FwOworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtaW47CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIEZyYW1lZCB0cmFuc3BvcnQuCisgKgorICogQWxsIHdyaXRlcyBnbyBpbnRvIGFuIGluLW1lbW9yeSBidWZmZXIgdW50aWwgZmx1c2ggaXMgY2FsbGVkLCBhdCB3aGljaCBwb2ludAorICogdGhlIHRyYW5zcG9ydCB3cml0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlIGJpbmFyeSBjaHVuayBmb2xsb3dlZCBieSB0aGUKKyAqIGRhdGEgcGF5bG9hZC4gVGhlIHJlY2VpdmVyIG9uIHRoZSBvdGhlciBlbmQgdGhlbiBwZXJmb3JtcyBhIHNpbmdsZQorICogwrtmaXhlZC1sZW5ndGjCqyByZWFkIHRvIGdldCB0aGUgd2hvbGUgbWVzc2FnZSBvZmYgdGhlIHdpcmUuCisgKi8KK2ZpbmFsIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGZyYW1lZCB0cmFuc3BvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gd3JhcC4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHdyYXBwZWQgdHJhbnNwb3J0LgorICAgKi8KKyAgVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNwb3J0XzsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW47CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIHJCdWZfLmxlbmd0aCA+IDAgfHwgdHJhbnNwb3J0Xy5wZWVrKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgdHJhbnNwb3J0Xy5vcGVuKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGZsdXNoKCk7CisgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgLyoqCisgICAqIEF0dGVtcHRzIHRvIHJlYWQgZGF0YSBpbnRvIHRoZSBnaXZlbiBidWZmZXIsIHN0b3BwaW5nIHdoZW4gdGhlIGJ1ZmZlciBpcworICAgKiBleGhhdXN0ZWQgb3IgdGhlIGZyYW1lIGVuZCBpcyByZWFjaGVkLgorICAgKgorICAgKiBUT0RPOiBDb250cmFyeSB0byB0aGUgQysrIGltcGxlbWVudGF0aW9uLCB0aGlzIG5ldmVyIGRvZXMgY3Jvc3MtZnJhbWUKKyAgICogcmVhZHMg4oCTIGlzIHRoZXJlIGFjdHVhbGx5IGEgdmFsaWQgdXNlIGNhc2UgZm9yIHRoYXQ/CisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBidWYgPSBTbGljZSB0byB1c2UgYXMgYnVmZmVyLgorICAgKgorICAgKiBSZXR1cm5zOiBIb3cgbWFueSBieXRlcyB3ZXJlIGFjdHVhbGx5IHJlYWQuCisgICAqCisgICAqIFRocm93czogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAqLworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIC8vIElmIHRoZSBidWZmZXIgaXMgZW1wdHksIHJlYWQgYSBuZXcgZnJhbWUgb2ZmIHRoZSB3aXJlLgorICAgIGlmIChyQnVmXy5lbXB0eSkgeworICAgICAgYm9vbCBnb3RGcmFtZSA9IHJlYWRGcmFtZSgpOworICAgICAgaWYgKCFnb3RGcmFtZSkgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXV0byBzaXplID0gbWluKHJCdWZfLmxlbmd0aCwgYnVmLmxlbmd0aCk7CisgICAgYnVmWzAuLnNpemVdID0gckJ1Zl9bMC4uc2l6ZV07CisgICAgckJ1Zl8gPSByQnVmX1tzaXplLi4kXTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd3JpdGUoaW4gdWJ5dGVbXSBidWYpIHsKKyAgICB3QnVmXyB+PSBidWY7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGlmICh3QnVmXy5lbXB0eSkgcmV0dXJuOworCisgICAgLy8gUHJvcGVybHkgcmVzZXQgdGhlIHdyaXRlIGJ1ZmZlciBldmVuIHNvbWUgb2YgdGhlIHByb3RvY29sIG9wZXJhdGlvbnMgZ28KKyAgICAvLyB3cm9uZy4KKyAgICBzY29wZSAoZXhpdCkgeworICAgICAgd0J1Zl8ubGVuZ3RoID0gMDsKKyAgICAgIHdCdWZfLmFzc3VtZVNhZmVBcHBlbmQoKTsKKyAgICB9CisKKyAgICBpbnQgbGVuID0gYnN3YXAoY2FzdChpbnQpd0J1Zl8ubGVuZ3RoKTsKKyAgICB0cmFuc3BvcnRfLndyaXRlKGNhc3QodWJ5dGVbXSkoJmxlbilbMC4uMV0pOworICAgIHRyYW5zcG9ydF8ud3JpdGUod0J1Zl8pOworICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKKyAgfQorCisgIG92ZXJyaWRlIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgaWYgKGxlbiA8PSByQnVmXy5sZW5ndGgpIHsKKyAgICAgIHJldHVybiByQnVmXzsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRG9uJ3QgdHJ5IGF0dGVtcHRpbmcgY3Jvc3MtZnJhbWUgYm9ycm93cywgdHJ5aW5nIHRoYXQgZG9lcyBub3QgbWFrZQorICAgICAgLy8gbXVjaCBzZW5zZSBhbnl3YXkuCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIGVuZm9yY2UobGVuIDw9IHJCdWZfLmxlbmd0aCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiSW52YWxpZCBjb25zdW1lIGxlbmd0aCIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworICAgIHJCdWZfID0gckJ1Zl9bbGVuIC4uICRdOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgcmVhZEZyYW1lKCkgeworICAgIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIG5leHQgZnJhbWUuIFdlIGNhbid0IHVzZSByZWFkQWxsKCkgc2luY2UgdGhhdAorICAgIC8vIGFsd2F5cyB0aHJvd3MgYW4gZXhjZXB0aW9uIG9uIEVPRiwgYnV0IHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkKKyAgICAvLyBpZiBFT0Ygb2NjdXJzIGFmdGVyIHBhcnRpYWwgc2l6ZSBkYXRhLgorICAgIGludCBzaXplOworICAgIHNpemVfdCBzaXplX3JlYWQ7CisgICAgd2hpbGUgKHNpemVfcmVhZCA8IHNpemUuc2l6ZW9mKSB7CisgICAgICBhdXRvIGRhdGEgPSAoY2FzdCh1Ynl0ZSopJnNpemUpW3NpemVfcmVhZC4uc2l6ZS5zaXplb2ZdOworICAgICAgYXV0byByZWFkID0gdHJhbnNwb3J0Xy5yZWFkKGRhdGEpOworICAgICAgaWYgKHJlYWQgPT0gMCkgeworICAgICAgICBpZiAoc2l6ZV9yZWFkID09IDApIHsKKyAgICAgICAgICAvLyBFT0YgYmVmb3JlIGFueSBkYXRhIHdhcyByZWFkLgorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBFT0YgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lIGhlYWRlciDigJMgaWxsZWdhbC4KKyAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciBwYXJ0aWFsIGZyYW1lIGhlYWRlciIsCisgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUKKyAgICAgICAgICApOworICAgICAgICB9CisgICAgICB9CisgICAgICBzaXplX3JlYWQgKz0gcmVhZDsKKyAgICB9CisKKyAgICBzaXplID0gYnN3YXAoc2l6ZSk7CisgICAgZW5mb3JjZShzaXplID49IDAsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplIGhhcyBuZWdhdGl2ZSB2YWx1ZSIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpKTsKKworICAgIC8vIFRPRE86IEJlbmNobWFyayB0aGlzLgorICAgIHJCdWZfLmxlbmd0aCA9IHNpemU7CisgICAgckJ1Zl8uYXNzdW1lU2FmZUFwcGVuZCgpOworCisgICAgdHJhbnNwb3J0Xy5yZWFkQWxsKHJCdWZfKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0XzsKKyAgdWJ5dGVbXSByQnVmXzsKKyAgdWJ5dGVbXSB3QnVmXzsKK30KKworLyoqCisgKiBXcmFwcyBnaXZlbiB0cmFuc3BvcnRzIGludG8gVEZyYW1lZFRyYW5zcG9ydHMuCisgKi8KK2FsaWFzIFRXcmFwcGVyVHJhbnNwb3J0RmFjdG9yeSFURnJhbWVkVHJhbnNwb3J0IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OworCit2ZXJzaW9uICh1bml0dGVzdCkgeworICBpbXBvcnQgc3RkLnJhbmRvbSA6IE10MTk5MzcsIHVuaWZvcm07CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKK30KKworLy8gU29tZSBiYXNpYyByYW5kb20gdGVzdGluZywgYWx3YXlzIHN0YXJ0aW5nIHdpdGggdGhlIHNhbWUgc2VlZCBmb3IKKy8vIGRldGVybWluaXN0aWMgdW5pdCB0ZXN0IHJlc3VsdHMg4oCTIG1vcmUgdGVzdHMgaW4gdHJhbnNwb3J0X3Rlc3QuCit1bml0dGVzdCB7CisgIGF1dG8gcmFuZEdlbiA9IE10MTk5MzcoNDIpOworCisgIC8vIDMyIGtpQiBvZiBkYXRhIHRvIHdvcmsgd2l0aC4KKyAgYXV0byBkYXRhID0gbmV3IHVieXRlWzEgPDwgMTVdOworICBmb3JlYWNoIChyZWYgYjsgZGF0YSkgeworICAgIGIgPSB1bmlmb3JtISJbXSIoY2FzdCh1Ynl0ZSkwLCBjYXN0KHVieXRlKTI1NSwgcmFuZEdlbik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBhIGxpc3Qgb2YgY2h1bmsgc2l6ZXMgdG8gc3BsaXQgdGhlIGRhdGEgaW50by4gQSB1bmlmb3JtCisgIC8vIGRpc3RyaWJ1dGlvbiBpcyBub3QgcXVpdGUgcmVhbGlzdGljLCBidXQgc3RkLnJhbmRvbSBkb2Vzbid0IGhhdmUgYW55dGhpbmcKKyAgLy8gZWxzZSB5ZXQuCisgIGVudW0gTUFYX0ZSQU1FX0xFTkdUSCA9IDUxMjsKKyAgYXV0byBjaHVua1NpemVzTGlzdCA9IG5ldyBzaXplX3RbXVsyXTsKKyAgZm9yZWFjaCAocmVmIGNodW5rU2l6ZXM7IGNodW5rU2l6ZXNMaXN0KSB7CisgICAgc2l6ZV90IHN1bTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYXV0byBjdXJMZW4gPSB1bmlmb3JtKDAsIE1BWF9GUkFNRV9MRU5HVEgsIHJhbmRHZW4pOworICAgICAgc3VtICs9IGN1ckxlbjsKKyAgICAgIGlmIChzdW0gPiBkYXRhLmxlbmd0aCkgYnJlYWs7CisgICAgICBjaHVua1NpemVzIH49IGN1ckxlbjsKKyAgICB9CisgIH0KKyAgY2h1bmtTaXplc0xpc3Qgfj0gW2RhdGEubGVuZ3RoXTsgLy8gQWxzbyB0ZXN0IHdob2xlIGNodW5rIGF0IG9uY2UuCisKKyAgLy8gVGVzdCB3cml0aW5nIGRhdGEuCisgIHsKKyAgICBmb3JlYWNoIChjaHVua1NpemVzOyBjaHVua1NpemVzTGlzdCkgeworICAgICAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgICAgIGF1dG8gZnJhbWVkID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYnVmKTsKKworICAgICAgYXV0byByZW1haW5pbmdEYXRhID0gZGF0YTsKKyAgICAgIGZvcmVhY2ggKGNodW5rU2l6ZTsgY2h1bmtTaXplcykgeworICAgICAgICBmcmFtZWQud3JpdGUocmVtYWluaW5nRGF0YVswLi5jaHVua1NpemVdKTsKKyAgICAgICAgcmVtYWluaW5nRGF0YSA9IHJlbWFpbmluZ0RhdGFbY2h1bmtTaXplLi4kXTsKKyAgICAgIH0KKyAgICAgIGZyYW1lZC5mbHVzaCgpOworCisgICAgICBhdXRvIHdyaXR0ZW5EYXRhID0gZGF0YVswLi4oJCAtIHJlbWFpbmluZ0RhdGEubGVuZ3RoKV07CisgICAgICBhdXRvIGFjdHVhbERhdGEgPSBidWYuZ2V0Q29udGVudHMoKTsKKworICAgICAgLy8gQ2hlY2sgZnJhbWUgc2l6ZS4KKyAgICAgIGludCBmcmFtZVNpemUgPSBic3dhcCgoY2FzdChpbnRbXSkoYWN0dWFsRGF0YVswLi5pbnQuc2l6ZW9mXSkpWzBdKTsKKyAgICAgIGVuZm9yY2UoZnJhbWVTaXplID09IHdyaXR0ZW5EYXRhLmxlbmd0aCk7CisKKyAgICAgIC8vIENoZWNrIGFjdHVhbCBkYXRhLgorICAgICAgZW5mb3JjZShhY3R1YWxEYXRhW2ludC5zaXplb2YuLiRdID09IHdyaXR0ZW5EYXRhKTsKKyAgICB9CisgIH0KKworICAvLyBUZXN0IHJlYWRpbmcgZGF0YS4KKyAgeworICAgIGZvcmVhY2ggKGNodW5rU2l6ZXM7IGNodW5rU2l6ZXNMaXN0KSB7CisgICAgICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworCisgICAgICBhdXRvIHNpemUgPSBic3dhcChjYXN0KGludClkYXRhLmxlbmd0aCk7CisgICAgICBidWYud3JpdGUoY2FzdCh1Ynl0ZVtdKSgmc2l6ZSlbMC4uMV0pOworICAgICAgYnVmLndyaXRlKGRhdGEpOworCisgICAgICBhdXRvIGZyYW1lZCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KGJ1Zik7CisgICAgICB1Ynl0ZVtdIHJlYWREYXRhOworICAgICAgcmVhZERhdGEucmVzZXJ2ZShkYXRhLmxlbmd0aCk7CisgICAgICBmb3JlYWNoIChjaHVua1NpemU7IGNodW5rU2l6ZXMpIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgd29yayB3aXRoIHJlYWQgYmVjYXVzZSB3ZSBoYXZlIG9uZSBodWdlIGZyYW1lLgorICAgICAgICBhdXRvIG9sZFJlYWRMZW4gPSByZWFkRGF0YS5sZW5ndGg7CisgICAgICAgIHJlYWREYXRhLmxlbmd0aCArPSBjaHVua1NpemU7CisgICAgICAgIGZyYW1lZC5yZWFkKHJlYWREYXRhW29sZFJlYWRMZW4uLiRdKTsKKyAgICAgIH0KKworICAgICAgZW5mb3JjZShyZWFkRGF0YSA9PSBkYXRhWzAuLnJlYWREYXRhLmxlbmd0aF0pOworICAgIH0KKyAgfQorCisgIC8vIFRlc3QgY29tYmluZWQgcmVhZGluZy93cml0aW5nIG9mIG11bHRpcGxlIGZyYW1lcy4KKyAgZm9yZWFjaCAoZmx1c2hQcm9iYWJpbGl0eTsgWzEsIDIsIDQsIDgsIDE2LCAzMl0pIHsKKyAgICBmb3JlYWNoIChjaHVua1NpemVzOyBjaHVua1NpemVzTGlzdCkgeworICAgICAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgICAgIGF1dG8gZnJhbWVkID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYnVmKTsKKworICAgICAgc2l6ZV90W10gZnJhbWVTaXplczsKKworICAgICAgLy8gV3JpdGUgdGhlIGRhdGEuCisgICAgICBzaXplX3QgZnJhbWVTaXplOworICAgICAgYXV0byByZW1haW5pbmdEYXRhID0gZGF0YTsKKyAgICAgIGZvcmVhY2ggKGNodW5rU2l6ZTsgY2h1bmtTaXplcykgeworICAgICAgICBmcmFtZWQud3JpdGUocmVtYWluaW5nRGF0YVswLi5jaHVua1NpemVdKTsKKyAgICAgICAgcmVtYWluaW5nRGF0YSA9IHJlbWFpbmluZ0RhdGFbY2h1bmtTaXplLi4kXTsKKworICAgICAgICBmcmFtZVNpemUgKz0gY2h1bmtTaXplOworICAgICAgICBpZiAoZnJhbWVTaXplID4gMCAmJiB1bmlmb3JtKDAsIGZsdXNoUHJvYmFiaWxpdHksIHJhbmRHZW4pID09IDApIHsKKyAgICAgICAgICBmcmFtZVNpemVzIH49IGZyYW1lU2l6ZTsKKyAgICAgICAgICBmcmFtZVNpemUgPSAwOworICAgICAgICAgIGZyYW1lZC5mbHVzaCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZnJhbWVTaXplID4gMCkgeworICAgICAgICBmcmFtZVNpemVzIH49IGZyYW1lU2l6ZTsKKyAgICAgICAgZnJhbWVTaXplID0gMDsKKyAgICAgICAgZnJhbWVkLmZsdXNoKCk7CisgICAgICB9CisKKyAgICAgIC8vIFJlYWQgaXQgYmFjay4KKyAgICAgIGF1dG8gcmVhZERhdGEgPSBuZXcgdWJ5dGVbZGF0YS5sZW5ndGggLSByZW1haW5pbmdEYXRhLmxlbmd0aF07CisgICAgICBhdXRvIHJlbWFpblRvUmVhZCA9IHJlYWREYXRhOworICAgICAgZm9yZWFjaCAoZlNpemU7IGZyYW1lU2l6ZXMpIHsKKyAgICAgICAgLy8gV2UgYXJlIGV4cGxvaXRpbmcgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIFRGcmFtZWRUcmFuc3BvcnQ6CisgICAgICAgIC8vIFRoZSByZWFkIGJ1ZmZlciBzdGFydHMgZW1wdHkgYW5kIGl0IHdpbGwgbmV2ZXIgcmV0dXJuIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgLy8gZnJhbWUgcGVyIHJlYWQsIHNvIGJ5IGp1c3QgcmVxdWVzdGluZyBhbGwgb2YgdGhlIGRhdGEsIHdlIHNob3VsZAorICAgICAgICAvLyBhbHdheXMgZ2V0IGV4YWN0bHkgb25lIGZyYW1lLgorICAgICAgICBhdXRvIGdvdCA9IGZyYW1lZC5yZWFkKHJlbWFpblRvUmVhZCk7CisgICAgICAgIGVuZm9yY2UoZ290ID09IGZTaXplKTsKKyAgICAgICAgcmVtYWluVG9SZWFkID0gcmVtYWluVG9SZWFkW2ZTaXplLi4kXTsKKyAgICAgIH0KKworICAgICAgZW5mb3JjZShyZW1haW5Ub1JlYWQuZW1wdHkpOworICAgICAgZW5mb3JjZShyZWFkRGF0YSA9PSBkYXRhWzAuLnJlYWREYXRhLmxlbmd0aF0pOworICAgIH0KKyAgfQorfQorCisvLyBUZXN0IGZsdXNoKClpbmcgYW4gZW1wdHkgYnVmZmVyLgordW5pdHRlc3QgeworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgIGF1dG8gZnJhbWVkID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYnVmKTsKKyAgaW1tdXRhYmxlIG91dDEgPSBbMCwgMCwgMCwgMSwgJ2EnXTsKKyAgaW1tdXRhYmxlIG91dDIgPSBbMCwgMCwgMCwgMSwgJ2EnLCAwLCAwLCAwLCAyLCAnYicsICdjJ107CisKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gW10pOworICBmcmFtZWQuZmx1c2goKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gW10pOworICBmcmFtZWQud3JpdGUoY2FzdCh1Ynl0ZVtdKSJhIik7CisgIGVuZm9yY2UoYnVmLmdldENvbnRlbnRzKCkgPT0gW10pOworICBmcmFtZWQuZmx1c2goKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBvdXQxKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGZyYW1lZC5mbHVzaCgpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IG91dDEpOworICBmcmFtZWQud3JpdGUoY2FzdCh1Ynl0ZVtdKSJiYyIpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IG91dDEpOworICBmcmFtZWQuZmx1c2goKTsKKyAgZW5mb3JjZShidWYuZ2V0Q29udGVudHMoKSA9PSBvdXQyKTsKKyAgZnJhbWVkLmZsdXNoKCk7CisgIGZyYW1lZC5mbHVzaCgpOworICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpID09IG91dDIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNThkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBIVFRQIHRyYW5wc29ydCBpbXBsZW1lbnRhdGlvbiwgbW9kZWxsZWQgYWZ0ZXIgdGhlIEMrKyBvbmUuCisgKgorICogVW5mb3J0dW5hdGVseSwgbGliY3VybCBpcyBxdWl0ZSBoZWF2eXdlaWdodCBhbmQgc3VwcG9ydHMgb25seSBjbGllbnQtc2lkZQorICogYXBwbGljYXRpb25zLiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBiYXNpYyBIVFRQLzEuMSBwYXJ0cworICogc3VwcG9ydGluZyBIVFRQIDEwMCBDb250aW51ZSwgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZywga2VlcGFsaXZlLCBldGMuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CisKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogY2FuRmluZCwgY291bnRVbnRpbCwgZW5kc1dpdGgsIGZpbmRTcGxpdCwgbWluLCBzdGFydHNXaXRoOworaW1wb3J0IHN0ZC5hc2NpaSA6IHRvTG93ZXI7CitpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CitpbXBvcnQgc3RkLmNvbnYgOiBwYXJzZSwgdG87CitpbXBvcnQgc3RkLmRhdGV0aW1lIDogQ2xvY2ssIFVUQzsKK2ltcG9ydCBzdGQuc3RyaW5nIDogc3RyaXBMZWZ0OworaW1wb3J0IHRocmlmdC5iYXNlIDogVkVSU0lPTjsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYm90aCBjbGllbnQtIGFuZCBzZXJ2ZXItc2lkZSBIVFRQIHRyYW5zcG9ydHMuCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRIdHRwVHJhbnNwb3J0IDogVEJhc2VUcmFuc3BvcnQgeworICB0aGlzKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKyAgICByZWFkSGVhZGVyc18gPSB0cnVlOworICAgIGh0dHBCdWZfID0gbmV3IHVieXRlW0hUVFBfQlVGRkVSX1NJWkVdOworICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1Zl9bMCAuLiAwXTsKKyAgICByZWFkQnVmZmVyXyA9IG5ldyBUTWVtb3J5QnVmZmVyOworICAgIHdyaXRlQnVmZmVyXyA9IG5ldyBUTWVtb3J5QnVmZmVyOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuKCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIHRyYW5zcG9ydF8ucGVlaygpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIHRyYW5zcG9ydF8ub3BlbigpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKKyAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGlmICghcmVhZEJ1ZmZlcl8ucGVlaygpKSB7CisgICAgICByZWFkQnVmZmVyXy5yZXNldCgpOworCisgICAgICBpZiAoIXJlZmlsbCgpKSByZXR1cm4gMDsKKworICAgICAgaWYgKHJlYWRIZWFkZXJzXykgeworICAgICAgICByZWFkSGVhZGVycygpOworICAgICAgfQorCisgICAgICBzaXplX3QgZ290OworICAgICAgaWYgKGNodW5rZWRfKSB7CisgICAgICAgIGdvdCA9IHJlYWRDaHVua2VkKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBnb3QgPSByZWFkQ29udGVudChjb250ZW50TGVuZ3RoXyk7CisgICAgICB9CisgICAgICByZWFkSGVhZGVyc18gPSB0cnVlOworCisgICAgICBpZiAoZ290ID09IDApIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gcmVhZEJ1ZmZlcl8ucmVhZChidWYpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWRFbmQoKSB7CisgICAgLy8gUmVhZCBhbnkgcGVuZGluZyBjaHVua2VkIGRhdGEgKGZvb3RlcnMgZXRjLikKKyAgICBpZiAoY2h1bmtlZF8pIHsKKyAgICAgIHdoaWxlICghY2h1bmtlZERvbmVfKSB7CisgICAgICAgIHJlYWRDaHVua2VkKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIHdyaXRlQnVmZmVyXy53cml0ZShidWYpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICBhdXRvIGRhdGEgPSB3cml0ZUJ1ZmZlcl8uZ2V0Q29udGVudHMoKTsKKyAgICBzdHJpbmcgaGVhZGVyID0gZ2V0SGVhZGVyKGRhdGEubGVuZ3RoKTsKKworICAgIHRyYW5zcG9ydF8ud3JpdGUoY2FzdChjb25zdCh1Ynl0ZSlbXSkgaGVhZGVyKTsKKyAgICB0cmFuc3BvcnRfLndyaXRlKGRhdGEpOworICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKKworICAgIC8vIFJlc2V0IHRoZSBidWZmZXIgYW5kIGhlYWRlciB2YXJpYWJsZXMuCisgICAgd3JpdGVCdWZmZXJfLnJlc2V0KCk7CisgICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIHJlYWQgSFRUUCByZXF1ZXN0cyBpbnRvLCBpbiBieXRlcy4gV2lsbCBleHBhbmQKKyAgICogYXMgcmVxdWlyZWQuCisgICAqLworICBlbnVtIEhUVFBfQlVGRkVSX1NJWkUgPSAxMDI0OworCitwcm90ZWN0ZWQ6CisgIGFic3RyYWN0IHN0cmluZyBnZXRIZWFkZXIoc2l6ZV90IGRhdGFMZW5ndGgpOworICBhYnN0cmFjdCBib29sIHBhcnNlU3RhdHVzTGluZShjb25zdCh1Ynl0ZSlbXSBzdGF0dXMpOworCisgIHZvaWQgcGFyc2VIZWFkZXIoY29uc3QodWJ5dGUpW10gaGVhZGVyKSB7CisgICAgYXV0byBzcGxpdCA9IGZpbmRTcGxpdChoZWFkZXIsIFsnOiddKTsKKyAgICBpZiAoc3BsaXRbMV0uZW1wdHkpIHsKKyAgICAgIC8vIE5vIGNvbG9uIGZvdW5kLgorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGNvbXBUb0xvd2VyKHVieXRlIGEsIHVieXRlIGIpIHsKKyAgICAgIHJldHVybiB0b0xvd2VyKGNhc3QoY2hhcilhKSA9PSB0b0xvd2VyKGNhc3QoY2hhciliKTsKKyAgICB9CisKKyAgICBpZiAoc3RhcnRzV2l0aCFjb21wVG9Mb3dlcihzcGxpdFswXSwgY2FzdCh1Ynl0ZVtdKSJ0cmFuc2Zlci1lbmNvZGluZyIpKSB7CisgICAgICBpZiAoZW5kc1dpdGghY29tcFRvTG93ZXIoc3BsaXRbMl0sIGNhc3QodWJ5dGVbXSkiY2h1bmtlZCIpKSB7CisgICAgICAgIGNodW5rZWRfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGghY29tcFRvTG93ZXIoc3BsaXRbMF0sIGNhc3QodWJ5dGVbXSkiY29udGVudC1sZW5ndGgiKSkgeworICAgICAgY2h1bmtlZF8gPSBmYWxzZTsKKyAgICAgIGF1dG8gbGVuZ3RoU3RyaW5nID0gc3RyaXBMZWZ0KGNhc3QoY29uc3QoY2hhcilbXSlzcGxpdFsyXSk7CisgICAgICBjb250ZW50TGVuZ3RoXyA9IHBhcnNlIXNpemVfdChsZW5ndGhTdHJpbmcpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICB1Ynl0ZVtdIHJlYWRMaW5lKCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIHNwbGl0ID0gZmluZFNwbGl0KGh0dHBCdWZSZW1haW5pbmdfLCBjYXN0KHVieXRlW10pIlxyXG4iKTsKKworICAgICAgaWYgKHNwbGl0WzFdLmVtcHR5KSB7CisgICAgICAgIC8vIE5vIENSTEYgeWV0LCBtb3ZlIHdoYXRldmVyIHdlIGhhdmUgbm93IHRvIGZyb250IGFuZCByZWZpbGwuCisgICAgICAgIGlmIChodHRwQnVmUmVtYWluaW5nXy5lbXB0eSkgeworICAgICAgICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1Zl9bMCAuLiAwXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBodHRwQnVmX1swIC4uIGh0dHBCdWZSZW1haW5pbmdfLmxlbmd0aF0gPSBodHRwQnVmUmVtYWluaW5nXzsKKyAgICAgICAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZfWzAgLi4gaHR0cEJ1ZlJlbWFpbmluZ18ubGVuZ3RoXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVmaWxsKCkpIHsKKyAgICAgICAgICBhdXRvIGJ1ZiA9IGh0dHBCdWZSZW1haW5pbmdfOworICAgICAgICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1ZlJlbWFpbmluZ19bJCAtIDEgLi4gJCAtIDFdOworICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNldCB0aGUgcmVtYWluaW5nIGJ1ZmZlciB0byB0aGUgcGFydCBhZnRlciBcclxuIGFuZCByZXR1cm4gdGhlIHBhcnQKKyAgICAgICAgLy8gKGxpbmUpIGJlZm9yZSBpdC4KKyAgICAgICAgaHR0cEJ1ZlJlbWFpbmluZ18gPSBzcGxpdFsyXTsKKyAgICAgICAgcmV0dXJuIHNwbGl0WzBdOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZEhlYWRlcnMoKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBoZWFkZXJzIHN0YXRlIHZhcmlhYmxlcworICAgIGNvbnRlbnRMZW5ndGhfID0gMDsKKyAgICBjaHVua2VkXyA9IGZhbHNlOworICAgIGNodW5rZWREb25lXyA9IGZhbHNlOworICAgIGNodW5rU2l6ZV8gPSAwOworCisgICAgLy8gQ29udHJvbCBzdGF0ZSBmbG93CisgICAgYm9vbCBzdGF0dXNMaW5lID0gdHJ1ZTsKKyAgICBib29sIGZpbmlzaGVkOworCisgICAgLy8gTG9vcCB1bnRpbCBoZWFkZXJzIGFyZSBmaW5pc2hlZAorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGxpbmUgPSByZWFkTGluZSgpOworCisgICAgICBpZiAobGluZS5sZW5ndGggPT0gMCkgeworICAgICAgICBpZiAoZmluaXNoZWQpIHsKKyAgICAgICAgICByZWFkSGVhZGVyc18gPSBmYWxzZTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gTXVzdCBoYXZlIGJlZW4gYW4gSFRUUCAxMDAsIGtlZXAgZ29pbmcgZm9yIGFub3RoZXIgc3RhdHVzIGxpbmUKKyAgICAgICAgICBzdGF0dXNMaW5lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0YXR1c0xpbmUpIHsKKyAgICAgICAgICBzdGF0dXNMaW5lID0gZmFsc2U7CisgICAgICAgICAgZmluaXNoZWQgPSBwYXJzZVN0YXR1c0xpbmUobGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGFyc2VIZWFkZXIobGluZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzaXplX3QgcmVhZENodW5rZWQoKSB7CisgICAgc2l6ZV90IGxlbmd0aDsKKworICAgIGF1dG8gbGluZSA9IHJlYWRMaW5lKCk7CisgICAgc2l6ZV90IGNodW5rU2l6ZTsKKyAgICB0cnkgeworICAgICAgYXV0byBjaGFyTGluZSA9IGNhc3QoY2hhcltdKWxpbmU7CisgICAgICBjaHVua1NpemUgPSBwYXJzZSFzaXplX3QoY2hhckxpbmUsIDE2KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkludmFsaWQgY2h1bmsgc2l6ZTogIiB+IHRvIXN0cmluZyhsaW5lKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgICB9CisKKyAgICBpZiAoY2h1bmtTaXplID09IDApIHsKKyAgICAgIHJlYWRDaHVua2VkRm9vdGVycygpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBSZWFkIGRhdGEgY29udGVudAorICAgICAgbGVuZ3RoICs9IHJlYWRDb250ZW50KGNodW5rU2l6ZSk7CisgICAgICAvLyBSZWFkIHRyYWlsaW5nIENSTEYgYWZ0ZXIgY29udGVudAorICAgICAgcmVhZExpbmUoKTsKKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKKyAgfQorCisgIHZvaWQgcmVhZENodW5rZWRGb290ZXJzKCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGxpbmUgPSByZWFkTGluZSgpOworICAgICAgaWYgKGxpbmUubGVuZ3RoID09IDApIHsKKyAgICAgICAgY2h1bmtlZERvbmVfID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2l6ZV90IHJlYWRDb250ZW50KHNpemVfdCBzaXplKSB7CisgICAgYXV0byBuZWVkID0gc2l6ZTsKKyAgICB3aGlsZSAobmVlZCA+IDApIHsKKyAgICAgIGlmIChodHRwQnVmUmVtYWluaW5nXy5sZW5ndGggPT0gMCkgeworICAgICAgICAvLyBXZSBoYXZlIGdpdmVuIGFsbCB0aGUgZGF0YSwgcmVzZXQgcG9zaXRpb24gdG8gaGVhZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZfWzAgLi4gMF07CisgICAgICAgIGlmICghcmVmaWxsKCkpIHJldHVybiBzaXplIC0gbmVlZDsKKyAgICAgIH0KKworICAgICAgYXV0byBnaXZlID0gbWluKGh0dHBCdWZSZW1haW5pbmdfLmxlbmd0aCwgbmVlZCk7CisgICAgICByZWFkQnVmZmVyXy53cml0ZShjYXN0KHVieXRlW10paHR0cEJ1ZlJlbWFpbmluZ19bMCAuLiBnaXZlXSk7CisgICAgICBodHRwQnVmUmVtYWluaW5nXyA9IGh0dHBCdWZSZW1haW5pbmdfW2dpdmUgLi4gJF07CisgICAgICBuZWVkIC09IGdpdmU7CisgICAgfQorICAgIHJldHVybiBzaXplOworICB9CisKKyAgYm9vbCByZWZpbGwoKSB7CisgICAgLy8gSXMgdGhlcmUgYSBuaWNlciB3YXkgdG8gZG8gdGhpcz8KKyAgICBhdXRvIGluZGV4QmVnaW4gPSBodHRwQnVmUmVtYWluaW5nXy5wdHIgLSBodHRwQnVmXy5wdHI7CisgICAgYXV0byBpbmRleEVuZCA9IGluZGV4QmVnaW4gKyBodHRwQnVmUmVtYWluaW5nXy5sZW5ndGg7CisKKyAgICBpZiAoaHR0cEJ1Zl8ubGVuZ3RoIC0gaW5kZXhFbmQgPD0gKGh0dHBCdWZfLmxlbmd0aCAvIDQpKSB7CisgICAgICBodHRwQnVmXy5sZW5ndGggKj0gMjsKKyAgICB9CisKKyAgICAvLyBSZWFkIG1vcmUgZGF0YS4KKyAgICBhdXRvIGdvdCA9IHRyYW5zcG9ydF8ucmVhZChjYXN0KHVieXRlW10paHR0cEJ1Zl9baW5kZXhFbmQgLi4gJF0pOworICAgIGlmIChnb3QgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIGh0dHBCdWZSZW1haW5pbmdfID0gaHR0cEJ1Zl9baW5kZXhCZWdpbiAuLiBpbmRleEVuZCArIGdvdF07CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBUVHJhbnNwb3J0IHRyYW5zcG9ydF87CisKKyAgVE1lbW9yeUJ1ZmZlciB3cml0ZUJ1ZmZlcl87CisgIFRNZW1vcnlCdWZmZXIgcmVhZEJ1ZmZlcl87CisKKyAgYm9vbCByZWFkSGVhZGVyc187CisgIGJvb2wgY2h1bmtlZF87CisgIGJvb2wgY2h1bmtlZERvbmVfOworICBzaXplX3QgY2h1bmtTaXplXzsKKyAgc2l6ZV90IGNvbnRlbnRMZW5ndGhfOworCisgIHVieXRlW10gaHR0cEJ1Zl87CisgIHVieXRlW10gaHR0cEJ1ZlJlbWFpbmluZ187Cit9CisKKy8qKgorICogSFRUUCBjbGllbnQgdHJhbnNwb3J0LgorICovCitmaW5hbCBjbGFzcyBUQ2xpZW50SHR0cFRyYW5zcG9ydCA6IFRIdHRwVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBjbGllbnQgaHR0cCB0cmFuc3BvcnQgb3BlcmF0aW5nIG9uIHRoZSBwYXNzZWQgdW5kZXJseWluZworICAgKiB0cmFuc3BvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICB0cmFuc3BvcnQgPSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgdGhlIGFjdHVhbCBJL08uCisgICAqICAgaG9zdCA9IFRoZSBIVFRQIGhvc3Qgc3RyaW5nLgorICAgKiAgIHBhdGggPSBUaGUgSFRUUCBwYXRoIHN0cmluZy4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIHN0cmluZyBob3N0LCBzdHJpbmcgcGF0aCkgeworICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgaG9zdF8gPSBob3N0OworICAgIHBhdGhfID0gcGF0aDsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBvdmVybG9hZCBmb3IgY29uc3RydWN0aW5nIGEgY2xpZW50IEhUVFAgdHJhbnNwb3J0IHVzaW5nIGEKKyAgICogVFNvY2tldCBjb25uZWN0aW5nIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGhvc3QgPSBUaGUgc2VydmVyIHRvIGNvbm5lY3QgdG8sIGFsc28gdXNlZCBhcyBIVFRQIGhvc3Qgc3RyaW5nLgorICAgKiAgIHBvcnQgPSBUaGUgcG9ydCB0byBjb25uZWN0IHRvLgorICAgKiAgIHBhdGggPSBUaGUgSFRUUCBwYXRoIHN0cmluZy4KKyAgICovCisgIHRoaXMoc3RyaW5nIGhvc3QsIHVzaG9ydCBwb3J0LCBzdHJpbmcgcGF0aCkgeworICAgIHRoaXMobmV3IFRTb2NrZXQoaG9zdCwgcG9ydCksIGhvc3QsIHBhdGgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgb3ZlcnJpZGUgc3RyaW5nIGdldEhlYWRlcihzaXplX3QgZGF0YUxlbmd0aCkgeworICAgIHJldHVybiAiUE9TVCAiIH4gcGF0aF8gfiAiIEhUVFAvMS4xXHJcbiIgfgorICAgICAgIkhvc3Q6ICIgfiBob3N0XyB+ICJcclxuIiB+CisgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KKyAgICAgICJDb250ZW50LUxlbmd0aDogIiB+IHRvIXN0cmluZyhkYXRhTGVuZ3RoKSB+ICJcclxuIiB+CisgICAgICAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KKyAgICAgICJVc2VyLUFnZW50OiBUaHJpZnQvIiB+IFZFUlNJT04gfiAiIChEL1RDbGllbnRIdHRwVHJhbnNwb3J0KVxyXG4iIH4KKyAgICAgICJcclxuIjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNvbnN0KHVieXRlKVtdIHN0YXR1cykgeworICAgIC8vIEhUVFAtVmVyc2lvbiBTUCBTdGF0dXMtQ29kZSBTUCBSZWFzb24tUGhyYXNlIENSTEYKKyAgICBhdXRvIGZpcnN0U3BsaXQgPSBmaW5kU3BsaXQoc3RhdHVzLCBbJyAnXSk7CisgICAgaWYgKGZpcnN0U3BsaXRbMV0uZW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJCYWQgc3RhdHVzOiAiIH4gdG8hc3RyaW5nKHN0YXR1cyksCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgICAgfQorCisgICAgYXV0byBjb2RlUmVhc29uID0gZmlyc3RTcGxpdFsyXVtjb3VudFVudGlsISJhICE9IGIiKGZpcnN0U3BsaXRbMl0sICcgJykgLi4gJF07CisgICAgYXV0byBzZWNvbmRTcGxpdCA9IGZpbmRTcGxpdChjb2RlUmVhc29uLCBbJyAnXSk7CisgICAgaWYgKHNlY29uZFNwbGl0WzFdLmVtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIHN0YXR1czogIiB+IHRvIXN0cmluZyhzdGF0dXMpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICAgIH0KKworICAgIGlmIChzZWNvbmRTcGxpdFswXSA9PSAiMjAwIikgeworICAgICAgLy8gSFRUUCAyMDAgPSBPSywgd2UgZ290IHRoZSByZXNwb25zZQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChzZWNvbmRTcGxpdFswXSA9PSAiMTAwIikgeworICAgICAgLy8gSFRUUCAxMDAgPSBjb250aW51ZSwganVzdCBrZWVwIHJlYWRpbmcKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIHN0YXR1cyAodW5oYW5kbGVkIHN0YXR1cyBjb2RlKTogIiB+CisgICAgICB0byFzdHJpbmcoY2FzdChjb25zdChjaGFyW10pKXN0YXR1cyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RyaW5nIGhvc3RfOworICBzdHJpbmcgcGF0aF87Cit9CisKKy8qKgorICogSFRUUCBzZXJ2ZXIgdHJhbnNwb3J0LgorICovCitmaW5hbCBjbGFzcyBUU2VydmVySHR0cFRyYW5zcG9ydCA6IFRIdHRwVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciB0aGUgYWN0dWFsIEkvTy4KKyAgICovCisgIHRoaXMoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICBzdXBlcih0cmFuc3BvcnQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgb3ZlcnJpZGUgc3RyaW5nIGdldEhlYWRlcihzaXplX3QgZGF0YUxlbmd0aCkgeworICAgIHJldHVybiAiSFRUUC8xLjEgMjAwIE9LXHJcbiIgfgorICAgICAgIkRhdGU6ICIgfiBnZXRSRkMxMTIzVGltZSgpIH4gIlxyXG4iIH4KKyAgICAgICJTZXJ2ZXI6IFRocmlmdC8iIH4gVkVSU0lPTiB+ICJcclxuIiB+CisgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KKyAgICAgICJDb250ZW50LUxlbmd0aDogIiB+IHRvIXN0cmluZyhkYXRhTGVuZ3RoKSB+ICJcclxuIiB+CisgICAgICAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZVxyXG4iIH4KKyAgICAgICJcclxuIjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNvbnN0KHVieXRlKVtdIHN0YXR1cykgeworICAgIC8vIE1ldGhvZCBTUCBSZXF1ZXN0LVVSSSBTUCBIVFRQLVZlcnNpb24gQ1JMRi4KKyAgICBhdXRvIHNwbGl0ID0gZmluZFNwbGl0KHN0YXR1cywgWycgJ10pOworICAgIGlmIChzcGxpdFsxXS5lbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkJhZCBzdGF0dXM6ICIgfiB0byFzdHJpbmcoc3RhdHVzKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKTsKKyAgICB9CisKKyAgICBhdXRvIHVyaVZlcnNpb24gPSBzcGxpdFsyXVtjb3VudFVudGlsISJhICE9IGIiKHNwbGl0WzJdLCAnICcpIC4uICRdOworICAgIGlmICghY2FuRmluZCh1cmlWZXJzaW9uLCAnICcpKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIHN0YXR1czogIiB+IHRvIXN0cmluZyhzdGF0dXMpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpOworICAgIH0KKworICAgIGlmIChzcGxpdFswXSA9PSAiUE9TVCIpIHsKKyAgICAgIC8vIFBPU1QgbWV0aG9kIG9rLCBsb29raW5nIGZvciBjb250ZW50LgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkJhZCBzdGF0dXMgKHVuc3VwcG9ydGVkIG1ldGhvZCk6ICIgfgorICAgICAgdG8hc3RyaW5nKHN0YXR1cyksIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgIH0KK30KKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgSFRUUCBzZXJ2ZXIgcHJvdG9jb2wuCisgKi8KK2FsaWFzIFRXcmFwcGVyVHJhbnNwb3J0RmFjdG9yeSFUU2VydmVySHR0cFRyYW5zcG9ydCBUU2VydmVySHR0cFRyYW5zcG9ydEZhY3Rvcnk7CisKK3ByaXZhdGUgeworICBpbXBvcnQgc3RkLnN0cmluZyA6IGZvcm1hdDsKKyAgc3RyaW5nIGdldFJGQzExMjNUaW1lKCkgeworICAgIGF1dG8gc3lzVGltZSA9IENsb2NrLmN1cnJUaW1lKFVUQygpKTsKKworICAgIGF1dG8gZGF5TmFtZSA9IGNhcE1lbWJlck5hbWUoc3lzVGltZS5kYXlPZldlZWspOworICAgIGF1dG8gbW9udGhOYW1lID0gY2FwTWVtYmVyTmFtZShzeXNUaW1lLm1vbnRoKTsKKworICAgIHJldHVybiBmb3JtYXQoIiVzLCAlcyAlcyAlcyAlczolczolcyBHTVQiLCBkYXlOYW1lLCBzeXNUaW1lLmRheSwKKyAgICAgIG1vbnRoTmFtZSwgc3lzVGltZS55ZWFyLCBzeXNUaW1lLmhvdXIsIHN5c1RpbWUubWludXRlLCBzeXNUaW1lLnNlY29uZCk7CisgIH0KKworICBpbXBvcnQgc3RkLmFzY2lpIDogdG9VcHBlcjsKKyAgaW1wb3J0IHN0ZC50cmFpdHMgOiBFbnVtTWVtYmVyczsKKyAgc3RyaW5nIGNhcE1lbWJlck5hbWUoVCkoVCB2YWwpIGlmIChpcyhUID09IGVudW0pKSB7CisgICAgZm9yZWFjaCAoaSwgZTsgRW51bU1lbWJlcnMhVCkgeworICAgICAgZW51bSBuYW1lID0gX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpW2ldOworICAgICAgZW51bSBjYXBOYW1lID0gY2FzdChjaGFyKSB0b1VwcGVyKG5hbWVbMF0pIH4gbmFtZSBbMSAuLiAkXTsKKyAgICAgIGlmICh2YWwgPT0gZSkgeworICAgICAgICByZXR1cm4gY2FwTmFtZTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm90IGEgbWVtYmVyIG9mICIgfiBULnN0cmluZ29mIH4gIjogIiB+IHRvIXN0cmluZyh2YWwpKTsKKyAgfQorCisgIHVuaXR0ZXN0IHsKKyAgICBlbnVtIEZvbyB7CisgICAgICBiYXIsCisgICAgICBiQVoKKyAgICB9CisKKyAgICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgICBlbmZvcmNlKGNhcE1lbWJlck5hbWUoRm9vLmJhcikgPT0gIkJhciIpOworICAgIGVuZm9yY2UoY2FwTWVtYmVyTmFtZShGb28uYkFaKSA9PSAiQkFaIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L21lbW9yeS5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmMDgwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L21lbW9yeS5kCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKK2ltcG9ydCBjb3JlLmV4Y2VwdGlvbiA6IG9uT3V0T2ZNZW1vcnlFcnJvcjsKK2ltcG9ydCBjb3JlLnN0ZGMuc3RkbGliIDogZnJlZSwgcmVhbGxvYzsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluOworaW1wb3J0IHN0ZC5jb252IDogdGV4dDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CisKKy8qKgorICogQSB0cmFuc3BvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuIGluLW1lbW9yeSBidWZmZXIuIEV2ZXJ5CisgKiB0aW1lIHlvdSBjYWxsIHdyaXRlIG9uIGl0LCB0aGUgZGF0YSBpcyBzaW1wbHkgcGxhY2VkIGludG8gYSBidWZmZXIsIGFuZAorICogZXZlcnkgdGltZSB5b3UgY2FsbCByZWFkLCBkYXRhIGlzIGNvbnN1bWVkIGZyb20gdGhhdCBidWZmZXIuCisgKgorICogQ3VycmVudGx5LCB0aGUgc3RvcmFnZSBmb3Igd3JpdHRlbiBkYXRhIGlzIG5ldmVyIHJlY2xhaW1lZCwgZXZlbiBpZiB0aGUKKyAqIGJ1ZmZlciBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZWFkIG91dCBhZ2Fpbi4KKyAqLworZmluYWwgY2xhc3MgVE1lbW9yeUJ1ZmZlciA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgbWVtb3J5IHRyYW5zcG9ydCB3aXRoIGFuIGVtcHR5IGludGVybmFsIGJ1ZmZlci4KKyAgICovCisgIHRoaXMoKSB7fQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lbW9yeSB0cmFuc3BvcnQgd2l0aCBhbiBlbXB0eSBpbnRlcm5hbCBidWZmZXIsCisgICAqIHJlc2VydmluZyBzcGFjZSBmb3IgY2FwYWNpdHkgYnl0ZXMgaW4gYWR2YW5jZS4KKyAgICoKKyAgICogSWYgdGhlIGFtb3VudCBvZiBkYXRhIHdoaWNoIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyIGlzIGFscmVhZHkKKyAgICoga25vd24gb24gY29uc3RydWN0aW9uLCB0aGlzIGNhbiBiZXR0ZXIgcGVyZm9ybWFuY2Ugb3ZlciB0aGUgZGVmYXVsdAorICAgKiBjb25zdHJ1Y3RvciBiZWNhdXNlIHJlYWxsb2NhdGlvbnMgY2FuIGJlIGF2b2lkZWQuCisgICAqCisgICAqIElmIHRoZSBwcmVhbGxvY2F0ZWQgYnVmZmVyIGlzIGV4aGF1c3RlZCwgZGF0YSBjYW4gc3RpbGwgYmUgd3JpdHRlbiB0byB0aGUKKyAgICogdHJhbnNwb3J0LCBidXQgcmVhbGxvY2F0aW9ucyB3aWxsIGhhcHBlbi4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGNhcGFjaXR5ID0gU2l6ZSBvZiB0aGUgaW5pdGlhbGx5IHJlc2VydmVkIGJ1ZmZlciAoaW4gYnl0ZXMpLgorICAgKi8KKyAgdGhpcyhzaXplX3QgY2FwYWNpdHkpIHsKKyAgICByZXNldChjYXBhY2l0eSk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBtZW1vcnkgdHJhbnNwb3J0IGluaXRpYWxseSBjb250YWluaW5nIHRoZSBwYXNzZWQgZGF0YS4KKyAgICoKKyAgICogRm9yIG5vdywgdGhlIHBhc3NlZCBidWZmZXIgaXMgbm90IGludGVsbGlnZW50bHkgdXNlZCwgdGhlIGRhdGEgaXMganVzdAorICAgKiBjb3BpZWQgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGJ1ZmZlciA9IEluaXRpYWwgY29udGVudHMgYXZhaWxhYmxlIHRvIGJlIHJlYWQuCisgICAqLworICB0aGlzKGluIHVieXRlW10gY29udGVudHMpIHsKKyAgICBhdXRvIHNpemUgPSBjb250ZW50cy5sZW5ndGg7CisgICAgcmVzZXQoc2l6ZSk7CisgICAgYnVmZmVyX1swIC4uIHNpemVdID0gY29udGVudHNbXTsKKyAgICB3cml0ZU9mZnNldF8gPSBzaXplOworICB9CisKKyAgLyoqCisgICAqIERlc3RydWN0b3IsIGZyZWVzIHRoZSBpbnRlcm5hbGx5IGFsbG9jYXRlZCBidWZmZXIuCisgICAqLworICB+dGhpcygpIHsKKyAgICBmcmVlKGJ1ZmZlcl8pOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiB0aGUgY3VycmVudCBidWZmZXIgY29udGVudHMuCisgICAqCisgICAqIE5vdGU6IEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgcmV0dXJuZWQgc2xpY2UgaXMgb25seSB2YWxpZCBmb3IgdGhlCisgICAqIGxpZmUgb2YgdGhpcyBvYmplY3QsIGFuZCBtYXkgYmUgaW52YWxpZGF0ZWQgb24gdGhlIG5leHQgd3JpdGUoKSBjYWxsIGF0CisgICAqIHdpbGwg4oCTIHlvdSBtaWdodCB3YW50IHRvIGltbWVkaWF0ZWx5IC5kdXAgaXQgaWYgeW91IGludGVuZCB0byBrZWVwIGl0CisgICAqIGFyb3VuZC4KKyAgICovCisgIGNvbnN0KHVieXRlKVtdIGdldENvbnRlbnRzKCkgeworICAgIHJldHVybiBidWZmZXJfW3JlYWRPZmZzZXRfIC4uIHdyaXRlT2Zmc2V0X107CisgIH0KKworICAvKioKKyAgICogQSBtZW1vcnkgdHJhbnNwb3J0IGlzIGFsd2F5cyBvcGVuLgorICAgKi8KKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBwZWVrKCkgeworICAgIHJldHVybiB3cml0ZU9mZnNldF8gLSByZWFkT2Zmc2V0XyA+IDA7CisgIH0KKworICAvKioKKyAgICogT3BlbmluZyBpcyBhIG5vLW9wKCkgZm9yIGEgbWVtb3J5IGJ1ZmZlci4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHt9CisKKyAgLyoqCisgICAqIENsb3NpbmcgaXMgYSBuby1vcCgpIGZvciBhIG1lbW9yeSBidWZmZXIsIGl0IGlzIGFsd2F5cyBvcGVuLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHt9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBhdXRvIHNpemUgPSBtaW4oYnVmLmxlbmd0aCwgd3JpdGVPZmZzZXRfIC0gcmVhZE9mZnNldF8pOworICAgIGJ1ZlswIC4uIHNpemVdID0gYnVmZmVyX1tyZWFkT2Zmc2V0XyAuLiByZWFkT2Zmc2V0XyArIHNpemVdOworICAgIHJlYWRPZmZzZXRfICs9IHNpemU7CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICAvKioKKyAgICogU2hvcnRjdXQgdmVyc2lvbiBvZiByZWFkQWxsKCkg4oCTIHVzaW5nIHRoaXMgb3ZlciBUQmFzZVRyYW5zcG9ydC5yZWFkQWxsKCkKKyAgICogY2FuIGdpdmUgdXMgYSBuaWNlIHNwZWVkIGluY3JlYXNlIGJlY2F1c2UgZ2l2ZXMgdXMgYSBuaWNlIHNwZWVkIGluY3JlYXNlCisgICAqIGJlY2F1c2UgaXQgaXMgdHlwaWNhbGx5IGEgdmVyeSBob3QgcGF0aCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCByZWFkQWxsKHVieXRlW10gYnVmKSB7CisgICAgYXV0byBhdmFpbGFibGUgPSB3cml0ZU9mZnNldF8gLSByZWFkT2Zmc2V0XzsKKyAgICBpZiAoYnVmLmxlbmd0aCA+IGF2YWlsYWJsZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24odGV4dCgiQ2Fubm90IHJlYWRBbGwoKSAiLCBidWYubGVuZ3RoLAorICAgICAgICAiIGJ5dGVzIG9mIGRhdGEgYmVjYXVzZSBvbmx5ICIsIGF2YWlsYWJsZSwgIiBieXRlcyBhcmUgYXZhaWxhYmxlLiIpLAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpOworICAgIH0KKworICAgIGJ1ZltdID0gYnVmZmVyX1tyZWFkT2Zmc2V0XyAuLiByZWFkT2Zmc2V0XyArIGJ1Zi5sZW5ndGhdOworICAgIHJlYWRPZmZzZXRfICs9IGJ1Zi5sZW5ndGg7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgYXV0byBuZWVkID0gYnVmLmxlbmd0aDsKKyAgICBpZiAoYnVmZmVyTGVuXyAtIHdyaXRlT2Zmc2V0XyA8IG5lZWQpIHsKKyAgICAgIC8vIEV4cG9uZW50aWFsIGdyb3d0aC4KKyAgICAgIGF1dG8gbmV3TGVuID0gYnVmZmVyTGVuXyArIDE7CisgICAgICB3aGlsZSAobmV3TGVuIC0gd3JpdGVPZmZzZXRfIDwgbmVlZCkgbmV3TGVuICo9IDI7CisgICAgICBjUmVhbGxvYyhidWZmZXJfLCBuZXdMZW4pOworICAgICAgYnVmZmVyTGVuXyA9IG5ld0xlbjsKKyAgICB9CisKKyAgICBidWZmZXJfW3dyaXRlT2Zmc2V0XyAuLiB3cml0ZU9mZnNldF8gKyBuZWVkXSA9IGJ1ZltdOworICAgIHdyaXRlT2Zmc2V0XyArPSBuZWVkOworICB9CisKKyAgb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gYm9ycm93KHVieXRlKiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICBpZiAobGVuIDw9IHdyaXRlT2Zmc2V0XyAtIHJlYWRPZmZzZXRfKSB7CisgICAgICByZXR1cm4gYnVmZmVyX1tyZWFkT2Zmc2V0XyAuLiB3cml0ZU9mZnNldF9dOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIHJlYWRPZmZzZXRfICs9IGxlbjsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgcmVhZE9mZnNldF8gPSAwOworICAgIHdyaXRlT2Zmc2V0XyA9IDA7CisgIH0KKworICB2b2lkIHJlc2V0KHNpemVfdCBjYXBhY2l0eSkgeworICAgIHJlYWRPZmZzZXRfID0gMDsKKyAgICB3cml0ZU9mZnNldF8gPSAwOworICAgIGlmIChidWZmZXJMZW5fIDwgY2FwYWNpdHkpIHsKKyAgICAgIGNSZWFsbG9jKGJ1ZmZlcl8sIGNhcGFjaXR5KTsKKyAgICAgIGJ1ZmZlckxlbl8gPSBjYXBhY2l0eTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdWJ5dGUqIGJ1ZmZlcl87CisgIHNpemVfdCBidWZmZXJMZW5fOworICBzaXplX3QgcmVhZE9mZnNldF87CisgIHNpemVfdCB3cml0ZU9mZnNldF87Cit9CisKK3ByaXZhdGUgeworICB2b2lkIGNSZWFsbG9jKHJlZiB1Ynl0ZSogZGF0YSwgc2l6ZV90IG5ld1NpemUpIHsKKyAgICBhdXRvIHJlc3VsdCA9IHJlYWxsb2MoZGF0YSwgbmV3U2l6ZSk7CisgICAgaWYgKHJlc3VsdCBpcyBudWxsKSBvbk91dE9mTWVtb3J5RXJyb3IoKTsKKyAgICBkYXRhID0gY2FzdCh1Ynl0ZSopcmVzdWx0OworICB9Cit9CisKK3ZlcnNpb24gKHVuaXR0ZXN0KSB7CisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworfQorCit1bml0dGVzdCB7CisgIGF1dG8gYSA9IG5ldyBUTWVtb3J5QnVmZmVyKDUpOworICBpbW11dGFibGUodWJ5dGVbXSkgdGVzdERhdGEgPSBbMSwgMiwgMywgNF07CisgIGF1dG8gYnVmID0gbmV3IHVieXRlW3Rlc3REYXRhLmxlbmd0aF07CisgIGVuZm9yY2UoYS5pc09wZW4pOworCisgIC8vIGEgc2hvdWxkIGJlIGVtcHR5LgorICBlbmZvcmNlKCFhLnBlZWsoKSk7CisgIGVuZm9yY2UoYS5yZWFkKGJ1ZikgPT0gMCk7CisgIGFzc2VydFRocm93biFUVHJhbnNwb3J0RXhjZXB0aW9uKGEucmVhZEFsbChidWYpKTsKKworICAvLyBXcml0ZSBzb21lIGRhdGEgYW5kIHJlYWQgaXQgYmFjayBhZ2Fpbi4KKyAgYS53cml0ZSh0ZXN0RGF0YSk7CisgIGVuZm9yY2UoYS5wZWVrKCkpOworICBlbmZvcmNlKGEuZ2V0Q29udGVudHMoKSA9PSB0ZXN0RGF0YSk7CisgIGVuZm9yY2UoYS5yZWFkKGJ1ZikgPT0gdGVzdERhdGEubGVuZ3RoKTsKKyAgZW5mb3JjZShidWYgPT0gdGVzdERhdGEpOworCisgIC8vIGEgc2hvdWxkIGJlIGVtcHR5IGFnYWluLgorICBlbmZvcmNlKCFhLnBlZWsoKSk7CisgIGVuZm9yY2UoYS5yZWFkKGJ1ZikgPT0gMCk7CisgIGFzc2VydFRocm93biFUVHJhbnNwb3J0RXhjZXB0aW9uKGEucmVhZEFsbChidWYpKTsKKworICAvLyBUZXN0IHRoZSBjb25zdHJ1Y3RvciB3aGljaCBkaXJlY3RseSBhY2NlcHRzIGluaXRpYWwgZGF0YS4KKyAgYXV0byBiID0gbmV3IFRNZW1vcnlCdWZmZXIodGVzdERhdGEpOworICBlbmZvcmNlKGIuaXNPcGVuKTsKKyAgZW5mb3JjZShiLnBlZWsoKSk7CisgIGVuZm9yY2UoYi5nZXRDb250ZW50cygpID09IHRlc3REYXRhKTsKKworICAvLyBUZXN0IGJvcnJvdygpLgorICBhdXRvIGJvcnJvd2VkID0gYi5ib3Jyb3cobnVsbCwgdGVzdERhdGEubGVuZ3RoKTsKKyAgZW5mb3JjZShib3Jyb3dlZCA9PSB0ZXN0RGF0YSk7CisgIGVuZm9yY2UoYi5wZWVrKCkpOworICBiLmNvbnN1bWUodGVzdERhdGEubGVuZ3RoKTsKKyAgZW5mb3JjZSghYi5wZWVrKCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvcGlwZWQuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3BpcGVkLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlMTQzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3BpcGVkLmQKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LnBpcGVkOworCitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisvKioKKyAqIFBpcGVzIGRhdGEgcmVxdWVzdCBmcm9tIG9uZSB0cmFuc3BvcnQgdG8gYW5vdGhlciB3aGVuIHJlYWRFbmQoKQorICogb3Igd3JpdGVFbmQoKSBpcyBjYWxsZWQuCisgKgorICogQSB0eXBpY2FsIHVzZSBjYXNlIHdvdWxkIGJlIHRvIGxvZyByZXF1ZXN0cyBvbiBlLmcuIGEgc29ja2V0IHRvCisgKiBkaXNrIChpLiBlLiBwaXBlIHRoZW0gdG8gYSBURmlsZVdyaXRlclRyYW5zcG9ydCkuCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGtlZXBzIGFuIGludGVybmFsIGJ1ZmZlciB3aGljaCBleHBhbmRzIHRvCisgKiBob2xkIHRoZSB3aG9sZSBhbW91bnQgb2YgZGF0YSByZWFkL3dyaXR0ZW4gdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcgKkVuZCgpCisgKiBtZXRob2QgaXMgY2FsbGVkLgorICoKKyAqIENvbnRyYXJ5IHRvIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIHRoaXMgZG9lc24ndCBpbnRyb2R1Y2UgeWV0IGFub3RoZXIgbGF5ZXIKKyAqIG9mIGlucHV0L291dHB1dCBidWZmZXJpbmcsIGFsbCBjYWxscyBhcmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIHNvdXJjZQorICogdHJhbnNwb3J0IHZlcmJhdGltLgorICovCitmaW5hbCBjbGFzcyBUUGlwZWRUcmFuc3BvcnQoU291cmNlID0gVFRyYW5zcG9ydCkgaWYgKAorICBpc1RUcmFuc3BvcnQhU291cmNlCispIDogVEJhc2VUcmFuc3BvcnQgeworICAvLy8gVGhlIGRlZmF1bHQgaW5pdGlhbCBidWZmZXIgc2l6ZSBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGluIGJ5dGVzLgorICBlbnVtIERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSA9IDUxMjsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgb25seSByZWFkcyBhcmUgcGlwZWQgKHBpcGVSZWFkcyA9IHRydWUsIHBpcGVXcml0ZXMgPSBmYWxzZSkuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBzcmNUcmFucyA9IFRoZSB0cmFuc3BvcnQgdG8gd2hpY2ggYWxsIHJlcXVlc3RzIGFyZSBmb3J3YXJkZWQuCisgICAqICAgZHN0VHJhbnMgPSBUaGUgdHJhbnNwb3J0IHRoZSByZWFkL3dyaXR0ZW4gZGF0YSBpcyBjb3BpZWQgdG8uCisgICAqICAgaW5pdGlhbEJ1ZmZlclNpemUgPSBUaGUgZGVmYXVsdCBzaXplIG9mIHRoZSByZWFkL3dyaXRlIGJ1ZmZlcnMsIGZvcgorICAgKiAgICAgcGVyZm9ybWFuY2UgdHVuaW5nLgorICAgKi8KKyAgdGhpcyhTb3VyY2Ugc3JjVHJhbnMsIFRUcmFuc3BvcnQgZHN0VHJhbnMsCisgICAgc2l6ZV90IGluaXRpYWxCdWZmZXJTaXplID0gREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFCisgICkgeworICAgIHNyY1RyYW5zXyA9IHNyY1RyYW5zOworICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOworCisgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgVE1lbW9yeUJ1ZmZlcihpbml0aWFsQnVmZmVyU2l6ZSk7CisgICAgd3JpdGVCdWZmZXJfID0gbmV3IFRNZW1vcnlCdWZmZXIoaW5pdGlhbEJ1ZmZlclNpemUpOworCisgICAgcGlwZVJlYWRzXyA9IHRydWU7CisgICAgcGlwZVdyaXRlc18gPSBmYWxzZTsKKyAgfQorCisgIGJvb2wgcGlwZVJlYWRzKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gcGlwZVJlYWRzXzsKKyAgfQorCisgIHZvaWQgcGlwZVJlYWRzKGJvb2wgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgcmVhZEJ1ZmZlcl8ucmVzZXQoKTsKKyAgICB9CisgICAgcGlwZVJlYWRzXyA9IHZhbHVlOworICB9CisKKyAgYm9vbCBwaXBlV3JpdGVzKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gcGlwZVdyaXRlc187CisgIH0KKworICB2b2lkIHBpcGVXcml0ZXMoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB3cml0ZUJ1ZmZlcl8ucmVzZXQoKTsKKyAgICB9CisgICAgcGlwZVdyaXRlc18gPSB2YWx1ZTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgeworICAgIHJldHVybiBzcmNUcmFuc18uaXNPcGVuKCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgcmV0dXJuIHNyY1RyYW5zXy5wZWVrKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgc3JjVHJhbnNfLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgc3JjVHJhbnNfLmNsb3NlKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGF1dG8gYnl0ZXNSZWFkID0gc3JjVHJhbnNfLnJlYWQoYnVmKTsKKworICAgIGlmIChwaXBlUmVhZHNfKSB7CisgICAgICByZWFkQnVmZmVyXy53cml0ZShidWZbMCAuLiBieXRlc1JlYWRdKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXNSZWFkOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWRFbmQoKSB7CisgICAgaWYgKHBpcGVSZWFkc18pIHsKKyAgICAgIGF1dG8gZGF0YSA9IHJlYWRCdWZmZXJfLmdldENvbnRlbnRzKCk7CisgICAgICBkc3RUcmFuc18ud3JpdGUoZGF0YSk7CisgICAgICBkc3RUcmFuc18uZmx1c2goKTsKKyAgICAgIHJlYWRCdWZmZXJfLnJlc2V0KCk7CisKKyAgICAgIHNyY1RyYW5zXy5yZWFkRW5kKCk7CisKKyAgICAgIC8vIFJldHVybiBkYXRhLmxlbmd0aCBpbnN0ZWFkIG9mIHRoZSByZWFkRW5kKCkgcmVzdWx0IG9mIHRoZSBzb3VyY2UKKyAgICAgIC8vIHRyYW5zcG9ydHMgYmVjYXVzZSBpdCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGZyb20gaXQuCisgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7CisgICAgfQorCisgICAgcmV0dXJuIHNyY1RyYW5zXy5yZWFkRW5kKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHdyaXRlKGluIHVieXRlW10gYnVmKSB7CisgICAgaWYgKHBpcGVXcml0ZXNfKSB7CisgICAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoYnVmKTsKKyAgICB9CisKKyAgICBzcmNUcmFuc18ud3JpdGUoYnVmKTsKKyAgfQorCisgIG92ZXJyaWRlIHNpemVfdCB3cml0ZUVuZCgpIHsKKyAgICBpZiAocGlwZVdyaXRlc18pIHsKKyAgICAgIGF1dG8gZGF0YSA9IHdyaXRlQnVmZmVyXy5nZXRDb250ZW50cygpOworICAgICAgZHN0VHJhbnNfLndyaXRlKGRhdGEpOworICAgICAgZHN0VHJhbnNfLmZsdXNoKCk7CisgICAgICB3cml0ZUJ1ZmZlcl8ucmVzZXQoKTsKKworICAgICAgc3JjVHJhbnNfLndyaXRlRW5kKCk7CisKKyAgICAgIC8vIFJldHVybiBkYXRhLmxlbmd0aCBpbnN0ZWFkIG9mIHRoZSByZWFkRW5kKCkgcmVzdWx0IG9mIHRoZSBzb3VyY2UKKyAgICAgIC8vIHRyYW5zcG9ydHMgYmVjYXVzZSBpdCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGZyb20gaXQuCisgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7CisgICAgfQorCisgICAgcmV0dXJuIHNyY1RyYW5zXy53cml0ZUVuZCgpOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBmbHVzaCgpIHsKKyAgICBzcmNUcmFuc18uZmx1c2goKTsKKyAgfQorCitwcml2YXRlOgorICBTb3VyY2Ugc3JjVHJhbnNfOworICBUVHJhbnNwb3J0IGRzdFRyYW5zXzsKKworICBUTWVtb3J5QnVmZmVyIHJlYWRCdWZmZXJfOworICBUTWVtb3J5QnVmZmVyIHdyaXRlQnVmZmVyXzsKKworICBib29sIHBpcGVSZWFkc187CisgIGJvb2wgcGlwZVdyaXRlc187Cit9CisKKy8qKgorICogVFBpcGVkVHJhbnNwb3J0IGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIHRyYW5zcG9ydCB0eXBlcywgaS5lLiB0byBhbGxvdyB0aGUgY29uc3RydWN0b3IgYmVpbmcgY2FsbGVkCisgKiB1c2luZyBJRlRJIChzZWUgJChETURCVUcgNjA4MiwgRCBCdWd6aWxsYSBlbmhhbmNlbWVudCByZXF1ZXN0IDYwODIpKS4KKyAqLworVFBpcGVkVHJhbnNwb3J0IVNvdXJjZSB0UGlwZWRUcmFuc3BvcnQoU291cmNlKSgKKyAgU291cmNlIHNyY1RyYW5zLCBUVHJhbnNwb3J0IGRzdFRyYW5zCispIGlmIChpc1RUcmFuc3BvcnQhU291cmNlKSB7CisgIHJldHVybiBuZXcgdHlwZW9mKHJldHVybikoc3JjVHJhbnMsIGRzdFRyYW5zKTsKK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgLy8gRE1EIEBAQlVHQEA6IFVGQ1MgZm9yIHN0ZC5hcnJheS5lbXB0eSBkb2Vzbid0IHdvcmsgd2hlbiBpbXBvcnQgaXMgbW92ZWQKKyAgLy8gaW50byB1bml0dGVzdCBibG9jay4KKyAgaW1wb3J0IHN0ZC5hcnJheTsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworfQorCit1bml0dGVzdCB7CisgIGF1dG8gdW5kZXJseWluZyA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHBpcGVUYXJnZXQgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byB0cmFucyA9IHRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlVGFyZ2V0KTsKKworICB1bmRlcmx5aW5nLndyaXRlKGNhc3QodWJ5dGVbXSkiYWJjZCIpOworCisgIHVieXRlWzRdIGJ1ZmZlcjsKKyAgdHJhbnMucmVhZEFsbChidWZmZXJbMCAuLiAyXSk7CisgIGVuZm9yY2UoYnVmZmVyWzAgLi4gMl0gPT0gImFiIik7CisgIGVuZm9yY2UocGlwZVRhcmdldC5nZXRDb250ZW50cygpLmVtcHR5KTsKKworICB0cmFucy5yZWFkRW5kKCk7CisgIGVuZm9yY2UocGlwZVRhcmdldC5nZXRDb250ZW50cygpID09ICJhYiIpOworICBwaXBlVGFyZ2V0LnJlc2V0KCk7CisKKyAgdW5kZXJseWluZy53cml0ZShjYXN0KHVieXRlW10pImVmIik7CisgIHRyYW5zLnJlYWRBbGwoYnVmZmVyWzAgLi4gMl0pOworICBlbmZvcmNlKGJ1ZmZlclswIC4uIDJdID09ICJjZCIpOworICBlbmZvcmNlKHBpcGVUYXJnZXQuZ2V0Q29udGVudHMoKS5lbXB0eSk7CisKKyAgdHJhbnMucmVhZEFsbChidWZmZXJbMCAuLiAyXSk7CisgIGVuZm9yY2UoYnVmZmVyWzAgLi4gMl0gPT0gImVmIik7CisgIGVuZm9yY2UocGlwZVRhcmdldC5nZXRDb250ZW50cygpLmVtcHR5KTsKKworICB0cmFucy5yZWFkRW5kKCk7CisgIGVuZm9yY2UocGlwZVRhcmdldC5nZXRDb250ZW50cygpID09ICJjZGVmIik7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9yYW5nZS5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvcmFuZ2UuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjFjZWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvcmFuZ2UuZApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRyYW5zcG9ydHMgd2hpY2ggb3BlcmF0ZSBvbiBnZW5lcmljIEQgcmFuZ2VzLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5yYW5nZTsKKworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5yYW5nZTsKK2ltcG9ydCBzdGQudHJhaXRzIDogVW5xdWFsOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKKworLyoqCisgKiBBZGFwdHMgYW4gdWJ5dGUgaW5wdXQgcmFuZ2UgZm9yIHJlYWRpbmcgdmlhIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBUaGUgY2FzZSB3aGVyZSBSIGlzIGEgcGxhaW4gdWJ5dGVbXSBpcyByZWFzb25hYmx5IG9wdGltaXplZCwgc28gYSBwb3NzaWJsZQorICogdXNlIGNhc2UgZm9yIFRJbnB1dFJhbmdlVHJhbnNwb3J0IHdvdWxkIGJlIHRvIGRlc2VyaWFsaXplIHNvbWUgZGF0YSBoZWxkIGluCisgKiBhIG1lbW9yeSBidWZmZXIuCisgKi8KK2ZpbmFsIGNsYXNzIFRJbnB1dFJhbmdlVHJhbnNwb3J0KFIpIGlmICgKKyAgaXNJbnB1dFJhbmdlIShVbnF1YWwhUikgJiYgaXMoRWxlbWVudFR5cGUhUiA6IGNvbnN0KHVieXRlKSkKKykgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgZGF0YSA9IFRoZSBpbnB1dCByYW5nZSB0byB1c2UgYXMgZGF0YS4KKyAgICovCisgIHRoaXMoUiBkYXRhKSB7CisgICAgZGF0YV8gPSBkYXRhOworICB9CisKKyAgLyoqCisgICAqIEFuIGlucHV0IHJhbmdlIHRyYW5zcG9ydCBpcyBhbHdheXMgb3Blbi4KKyAgICovCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gIWRhdGFfLmVtcHR5OworICB9CisKKyAgLyoqCisgICAqIE9wZW5pbmcgaXMgYSBuby1vcCgpIGZvciBhbiBpbnB1dCByYW5nZSB0cmFuc3BvcnQuCisgICAqLworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7fQorCisgIC8qKgorICAgKiBDbG9zaW5nIGlzIGEgbm8tb3AoKSBmb3IgYSBtZW1vcnkgYnVmZmVyLgorICAgKi8KKyAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHt9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBhdXRvIGRhdGEgPSBkYXRhXy50YWtlKGJ1Zi5sZW5ndGgpOworICAgIGF1dG8gYnl0ZXMgPSBkYXRhLmxlbmd0aDsKKworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKFIuaW5pdFsxIC4uIDJdKSA6IGNvbnN0KHVieXRlKVtdKSkgeworICAgICAgLy8gcHV0KCkgaXMgY3VycmVudGx5IHVubmVjZXNzYXJpbHkgc2xvdyBpZiBib3RoIHJhbmdlcyBhcmUgc2xpY2VhYmxlLgorICAgICAgYnVmWzAgLi4gYnl0ZXNdID0gZGF0YVtdOworICAgICAgZGF0YV8gPSBkYXRhX1tieXRlcyAuLiAkXTsKKyAgICB9IGVsc2UgeworICAgICAgYnVmLnB1dChkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICAvKioKKyAgICogU2hvcnRjdXQgdmVyc2lvbiBvZiByZWFkQWxsKCkgZm9yIHNsaWNhYmxlIHJhbmdlcy4KKyAgICoKKyAgICogQmVjYXVzZSByZWFkQWxsKCkgaXMgdHlwaWNhbGx5IGEgdmVyeSBob3QgcGF0aCBkdXJpbmcgZGVzZXJpYWxpemF0aW9uLAorICAgKiB1c2luZyB0aGlzIG92ZXIgVEJhc2VUcmFuc3BvcnQucmVhZEFsbCgpIGdpdmVzIHVzIGEgbmljZSBpbmNyZWFzZSBpbgorICAgKiBzcGVlZCBkdWUgdG8gdGhlIHJlZHVjZWQgYW1vdW50IG9mIGluZGlyZWN0aW9ucy4KKyAgICovCisgIG92ZXJyaWRlIHZvaWQgcmVhZEFsbCh1Ynl0ZVtdIGJ1ZikgeworICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKFIuaW5pdFsxIC4uIDJdKSA6IGNvbnN0KHVieXRlKVtdKSkgeworICAgICAgaWYgKGJ1Zi5sZW5ndGggPD0gZGF0YV8ubGVuZ3RoKSB7CisgICAgICAgIGJ1ZltdID0gZGF0YV9bMCAuLiBidWYubGVuZ3RoXTsKKyAgICAgICAgZGF0YV8gPSBkYXRhX1tidWYubGVuZ3RoIC4uICRdOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIHN1cGVyLnJlYWRBbGwoYnVmKTsKKyAgfQorCisgIG92ZXJyaWRlIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgc3RhdGljIGlmIChpcyhSIDogY29uc3QodWJ5dGUpW10pKSB7CisgICAgICAvLyBDYW4gb25seSBib3Jyb3cgaWYgb3VyIGRhdGEgdHlwZSBpcyBhY3R1YWxseSBhbiB1Ynl0ZSBhcnJheS4KKyAgICAgIGlmIChsZW4gPD0gZGF0YV8ubGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBkYXRhXzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNvbnN1bWUoc2l6ZV90IGxlbikgeworICAgIHN0YXRpYyBpZiAoaXMoUiA6IGNvbnN0KHVieXRlKVtdKSkgeworICAgICAgaWYgKGxlbiA+IGRhdGFfLmxlbmd0aCkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiSW52YWxpZCBjb25zdW1lIGxlbmd0aCIsCisgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKTsKKyAgICAgIH0KKyAgICAgIGRhdGFfID0gZGF0YV9bbGVuIC4uICRdOworICAgIH0gZWxzZSB7CisgICAgICBzdXBlci5jb25zdW1lKGxlbik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNldHMgYSBuZXcgZGF0YSByYW5nZSB0byB1c2UuCisgICAqLworICB2b2lkIHJlc2V0KFIgZGF0YSkgeworICAgIGRhdGFfID0gZGF0YTsKKyAgfQorCitwcml2YXRlOgorICBSIGRhdGFfOworfQorCisvKioKKyAqIFRJbnB1dFJhbmdlVHJhbnNwb3J0IGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZworICogSUZUSSAoc2VlICQoTElOSzIgaHR0cDovL2QucHVyZW1hZ2ljLmNvbS9pc3N1ZXMvc2hvd19idWcuY2dpP2lkPTYwODIsIEQKKyAqIEJ1Z3ppbGxhIGVuaGFuY2VtZW50IHJlcXVldCA2MDgyKSkuCisgKi8KK1RJbnB1dFJhbmdlVHJhbnNwb3J0IVIgdElucHV0UmFuZ2VUcmFuc3BvcnQoUikoUiBkYXRhKSBpZiAoCisgIGlzIChUSW5wdXRSYW5nZVRyYW5zcG9ydCFSKQorKSB7CisgIHJldHVybiBuZXcgVElucHV0UmFuZ2VUcmFuc3BvcnQhUihkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiMzhkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CisKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm86IEVDT05OUkVTRVQ7CitpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CitpbXBvcnQgY29yZS50aW1lIDogZHVyLCBEdXJhdGlvbjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKK2ltcG9ydCBzdGQuY29udiA6IHRleHQsIHRvOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5zb2NrZXQ7CisKKy8qKgorICogQ29tbW9uIHBhcnRzIG9mIGEgc29ja2V0IFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24sIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZQorICogYWN0dWFsIEkvTyBpcyBwZXJmb3JtZWQgKHN5bmMvYXN5bmMpLgorICovCithYnN0cmFjdCBjbGFzcyBUU29ja2V0QmFzZSA6IFRCYXNlVHJhbnNwb3J0IHsKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gYWxyZWFkeSBjcmVhdGVkLCBjb25uZWN0ZWQgKCEpIHNvY2tldC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHNvY2tldCA9IEFscmVhZHkgY3JlYXRlZCwgY29ubmVjdGVkIHNvY2tldCBvYmplY3QuCisgICAqLworICB0aGlzKFNvY2tldCBzb2NrZXQpIHsKKyAgICBzb2NrZXRfID0gc29ja2V0OworICAgIHNldFNvY2tldE9wdHMoKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAorICAgKiBvbiB0aGUgZ2l2ZW4gcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIGhvc3QgPSBSZW1vdGUgaG9zdC4KKyAgICogICBwb3J0ID0gUmVtb3RlIHBvcnQuCisgICAqLworICB0aGlzKHN0cmluZyBob3N0LCB1c2hvcnQgcG9ydCkgeworICAgIGhvc3RfID0gaG9zdDsKKyAgICBwb3J0XyA9IHBvcnQ7CisgIH0KKworICAvKioKKyAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCisgICAqLworICBvdmVycmlkZSBib29sIGlzT3BlbigpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHNvY2tldF8gIWlzIG51bGw7CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIGFzIG11Y2ggZGF0YSB0byB0aGUgc29ja2V0IGFzIHRoZXJlIGNhbiBiZSBpbiBhIHNpbmdsZSBPUyBjYWxsLgorICAgKgorICAgKiBQYXJhbXM6CisgICAqICAgYnVmID0gRGF0YSB0byB3cml0ZS4KKyAgICoKKyAgICogUmV0dXJuczogVGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gTmV2ZXIgbW9yZSB0aGFuIGJ1Zi5sZW5ndGguCisgICAqLworICBhYnN0cmFjdCBzaXplX3Qgd3JpdGVTb21lKGluIHVieXRlW10gYnVmKSBvdXQgKHdyaXR0ZW4pIHsKKyAgICAvLyBETUQgQEBCVUdAQDogRW5hYmxpbmcgdGhpcyBlLmcuIGZhaWxzIHRoZSBjb250cmFjdCBpbiB0aGUKKyAgICAvLyBhc3luY190ZXN0X3NlcnZlciwgYmVjYXVzZSBidWYubGVuZ3RoIGV2YWx1YXRlcyB0byAwIGhlcmUsIGV2ZW4gdGhvdWdoCisgICAgLy8gaW4gdGhlIG1ldGhvZCBib2R5IGl0IGNvcnJlY3RseSBpcyAyNyAoZXF1YWwgdG8gdGhlIHJldHVybiB2YWx1ZSkuCisgICAgdmVyc2lvbiAobm9uZSkgYXNzZXJ0KHdyaXR0ZW4gPD0gYnVmLmxlbmd0aCwgdGV4dCgiSW1wbGVtZW50YXRpb24gd3JvdGUgIiB+CisgICAgICAibW9yZSBkYXRhIHRoYW4gcmVxdWVzdGVkIHRvPyEgKCIsIHdyaXR0ZW4sICIgdnMuICIsIGJ1Zi5sZW5ndGgsICIpIikpOworICB9IGJvZHkgeworICAgIGFzc2VydCgwLCAiRE1EIGJ1Zz8g4oCTIFdoeSB3b3VsZCBjb250cmFjdHMgd29yayBmb3IgaW50ZXJmYWNlcywgYnV0IG5vdCAiIH4KKyAgICAgICJmb3IgYWJzdHJhY3QgbWV0aG9kcz8gIiB+CisgICAgICAiKEVycm9yOiBmdW5jdGlvbiBb4oCmXSBpbiBhbmQgb3V0IGNvbnRyYWN0cyByZXF1aXJlIGZ1bmN0aW9uIGJvZHkiKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgYWRkcmVzcyBvZiB0aGUgcGVlciB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0by4KKyAgICoKKyAgICogSW4gY29udHJhc3QsIHRoZSBob3N0IGFuZCBwb3J0IHByb3BlcnRpZXMgY29udGFpbiB0aGUgYWRkcmVzcyB1c2VkIHRvCisgICAqIGVzdGFibGlzaCB0aGUgY29ubmVjdGlvbiwgYW5kIGFyZSBub3QgdXBkYXRlZCBhZnRlciB0aGUgY29ubmVjdGlvbi4KKyAgICoKKyAgICogVGhlIHNvY2tldCBtdXN0IGJlIG9wZW4gd2hlbiBjYWxsaW5nIHRoaXMuCisgICAqLworICBBZGRyZXNzIGdldFBlZXJBZGRyZXNzKCkgeworICAgIGVuZm9yY2UoaXNPcGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2Fubm90IGdldCBwZWVyIGhvc3QgZm9yICIgfgorICAgICAgImNsb3NlZCBzb2NrZXQuIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBpZiAoIXBlZXJBZGRyZXNzXykgeworICAgICAgcGVlckFkZHJlc3NfID0gc29ja2V0Xy5yZW1vdGVBZGRyZXNzKCk7CisgICAgICBhc3NlcnQocGVlckFkZHJlc3NfKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGVlckFkZHJlc3NfOworICB9CisKKyAgLyoqCisgICAqIFRoZSBob3N0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvIG9yIHdpbGwgY29ubmVjdCB0by4gTnVsbCBpZiBhbgorICAgKiBhbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQgd2FzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBvYmplY3QuCisgICAqLworICBzdHJpbmcgaG9zdCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGhvc3RfOworICB9CisKKyAgLyoqCisgICAqIFRoZSBwb3J0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvIG9yIHdpbGwgY29ubmVjdCB0by4gWmVybyBpZiBhbgorICAgKiBhbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQgd2FzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBvYmplY3QuCisgICAqLworICB1c2hvcnQgcG9ydCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHBvcnRfOworICB9CisKKyAgLy8vIFRoZSBzb2NrZXQgc2VuZCB0aW1lb3V0LgorICBEdXJhdGlvbiBzZW5kVGltZW91dCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHNlbmRUaW1lb3V0XzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHNlbmRUaW1lb3V0KER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHNlbmRUaW1lb3V0XyA9IHZhbHVlOworICB9CisKKyAgLy8vIFRoZSBzb2NrZXQgcmVjZWl2aW5nIHRpbWVvdXQuIFZhbHVlcyBzbWFsbGVyIHRoYW4gNTAwIG1zIGFyZSBub3QKKyAgLy8vIHN1cHBvcnRlZCBvbiBXaW5kb3dzLgorICBEdXJhdGlvbiByZWN2VGltZW91dCgpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIHJlY3ZUaW1lb3V0XzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHJlY3ZUaW1lb3V0KER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHJlY3ZUaW1lb3V0XyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIE9TIGhhbmRsZSBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisgICAqCisgICAqIFNob3VsZCBub3QgdXN1YWxseSBiZSB1c2VkIGRpcmVjdGx5LCBidXQgYWNjZXNzIHRvIGl0IGNhbiBiZSBuZWNlc3NhcnkKKyAgICogdG8gaW50ZXJmYWNlIHdpdGggQyBsaWJyYXJpZXMuCisgICAqLworICB0eXBlb2Yoc29ja2V0Xy5oYW5kbGUoKSkgc29ja2V0SGFuZGxlKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gc29ja2V0Xy5oYW5kbGUoKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBTZXRzIHRoZSBuZWVkZWQgc29ja2V0IG9wdGlvbnMuCisgICAqLworICB2b2lkIHNldFNvY2tldE9wdHMoKSB7CisgICAgdHJ5IHsKKyAgICAgIGFsaWFzIFNvY2tldE9wdGlvbkxldmVsLlNPQ0tFVCBsdmxTb2NrOworICAgICAgTGluZ2VyIGw7CisgICAgICBsLm9uID0gMDsKKyAgICAgIGwudGltZSA9IDA7CisgICAgICBzb2NrZXRfLnNldE9wdGlvbihsdmxTb2NrLCBTb2NrZXRPcHRpb24uTElOR0VSLCBsKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgbG9nRXJyb3IoIkNvdWxkIG5vdCBzZXQgc29ja2V0IG9wdGlvbjogJXMiLCBlKTsKKyAgICB9CisKKyAgICAvLyBKdXN0IHRyeSB0byBkaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtIOKAkyB0aGlzIHdpbGwgZmFpbCBpZiB3ZSBhcmUgcGFzc2VkCisgICAgLy8gaW4gYSBub24tVENQIHNvY2tldCB2aWEgdGhlIFNvY2tldC1hY2NlcHRpbmcgY29uc3RydWN0b3IuCisgICAgdHJ5IHsKKyAgICAgIHNvY2tldF8uc2V0T3B0aW9uKFNvY2tldE9wdGlvbkxldmVsLlRDUCwgU29ja2V0T3B0aW9uLlRDUF9OT0RFTEFZLCB0cnVlKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkge30KKyAgfQorCisgIC8vLyBSZW1vdGUgaG9zdC4KKyAgc3RyaW5nIGhvc3RfOworCisgIC8vLyBSZW1vdGUgcG9ydC4KKyAgdXNob3J0IHBvcnRfOworCisgIC8vLyBUaW1lb3V0IGZvciBzZW5kaW5nLgorICBEdXJhdGlvbiBzZW5kVGltZW91dF87CisKKyAgLy8vIFRpbWVvdXQgZm9yIHJlY2VpdmluZy4KKyAgRHVyYXRpb24gcmVjdlRpbWVvdXRfOworCisgIC8vLyBDYWNoZWQgcGVlciBhZGRyZXNzLgorICBBZGRyZXNzIHBlZXJBZGRyZXNzXzsKKworICAvLy8gQ2FjaGVkIHBlZXIgaG9zdCBuYW1lLgorICBzdHJpbmcgcGVlckhvc3RfOworCisgIC8vLyBDYWNoZWQgcGVlciBwb3J0LgorICB1c2hvcnQgcGVlclBvcnRfOworCisgIC8vLyBXcmFwcGVkIHNvY2tldCBvYmplY3QuCisgIFNvY2tldCBzb2NrZXRfOworfQorCisvKioKKyAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICogRHVlIHRvIHRoZSBsaW1pdGF0aW9ucyBvZiBzdGQuc29ja2V0LCBjdXJyZW50bHkgb25seSBUQ1AvSVAgc29ja2V0cyBhcmUKKyAqIHN1cHBvcnRlZCAoaS5lLiBVbml4IGRvbWFpbiBzb2NrZXRzIGFyZSBub3QpLgorICovCitjbGFzcyBUU29ja2V0IDogVFNvY2tldEJhc2UgeworICAvLy8KKyAgdGhpcyhTb2NrZXQgc29ja2V0KSB7CisgICAgc3VwZXIoc29ja2V0KTsKKyAgfQorCisgIC8vLworICB0aGlzKHN0cmluZyBob3N0LCB1c2hvcnQgcG9ydCkgeworICAgIHN1cGVyKGhvc3QsIHBvcnQpOworICB9CisKKyAgLyoqCisgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAqLworICBvdmVycmlkZSB2b2lkIG9wZW4oKSB7CisgICAgaWYgKGlzT3BlbikgcmV0dXJuOworCisgICAgZW5mb3JjZSghaG9zdF8uZW1wdHksIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBvcGVuIHNvY2tldCB0byBudWxsIGhvc3QuIiwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisgICAgZW5mb3JjZShwb3J0XyAhPSAwLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJDYW5ub3Qgb3BlbiBzb2NrZXQgdG8gcG9ydCB6ZXJvLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgQWRkcmVzc1tdIGFkZHJzOworICAgIHRyeSB7CisgICAgICBhZGRycyA9IGdldEFkZHJlc3MoaG9zdF8sIHBvcnRfKTsKKyAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCByZXNvbHZlIGdpdmVuIGhvc3Qgc3RyaW5nLiIsCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTiwgX19GSUxFX18sIF9fTElORV9fLCBlKTsKKyAgICB9CisKKyAgICBFeGNlcHRpb25bXSBlcnJvcnM7CisgICAgZm9yZWFjaCAoYWRkcjsgYWRkcnMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHNvY2tldF8gPSBuZXcgVGNwU29ja2V0KGFkZHIuYWRkcmVzc0ZhbWlseSk7CisgICAgICAgIHNldFNvY2tldE9wdHMoKTsKKyAgICAgICAgc29ja2V0Xy5jb25uZWN0KGFkZHIpOworICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGVycm9ycyB+PSBlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PSBhZGRycy5sZW5ndGgpIHsKKyAgICAgIHNvY2tldF8gPSBudWxsOworICAgICAgLy8gTmVlZCB0byB0aHJvdyBhIFRUcmFuc3BvcnRFeGNlcHRpb24gdG8gYWJpZGUgdGhlIFRUcmFuc3BvcnQgQVBJLgorICAgICAgaW1wb3J0IHN0ZC5hbGdvcml0aG0sIHN0ZC5yYW5nZTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICB0ZXh0KCJGYWlsZWQgdG8gY29ubmVjdCB0byAiLCBob3N0XywgIjoiLCBwb3J0XywgIi4iKSwKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOLAorICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sCisgICAgICAgIG5ldyBUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgdGV4dCgKKyAgICAgICAgICAgICJBbGwgYWRkcmVzc2VzIHRyaWVkIGZhaWxlZCAoIiwKKyAgICAgICAgICAgIGpvaW5lcihtYXAhcXt0ZXh0KGFbMF0sIGA6ICJgLCBhWzFdLm1zZywgYCJgKX0oemlwKGFkZHJzLCBlcnJvcnMpKSwgIiwgIiksCisgICAgICAgICAgICAiKS4iCisgICAgICAgICAgKSwKKyAgICAgICAgICBlcnJvcnMKKyAgICAgICAgKQorICAgICAgKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAqLworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisKKyAgICBzb2NrZXRfLmNsb3NlKCk7CisgICAgc29ja2V0XyA9IG51bGw7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybiBmYWxzZTsKKworICAgIHVieXRlIGJ1ZjsKKyAgICBhdXRvIHIgPSBzb2NrZXRfLnJlY2VpdmUoKCZidWYpWzAgLi4gMV0sIFNvY2tldEZsYWdzLlBFRUspOworICAgIGlmIChyID09IC0xKSB7CisgICAgICBhdXRvIGxhc3RFcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisgICAgICBzdGF0aWMgaWYgKGNvbm5yZXNldE9uUGVlclNodXRkb3duKSB7CisgICAgICAgIGlmIChsYXN0RXJybm8gPT0gRUNPTk5SRVNFVCkgeworICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVla2luZyBpbnRvIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgICAgfQorICAgIHJldHVybiAociA+IDApOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICBlbmZvcmNlKGlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHJlYWQgaWYgc29ja2V0IGlzIG5vdCBvcGVuLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgdHlwZW9mKGdldFNvY2tldEVycm5vKCkpIGxhc3RFcnJubzsKKyAgICB1c2hvcnQgdHJpZXM7CisgICAgd2hpbGUgKHRyaWVzKysgPD0gbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICBhdXRvIHIgPSBzb2NrZXRfLnJlY2VpdmUoY2FzdCh2b2lkW10pYnVmKTsKKworICAgICAgLy8gSWYgcmVjdiB3ZW50IGZpbmUsIGltbWVkaWF0ZWx5IHJldHVybi4KKyAgICAgIGlmIChyID49IDApIHJldHVybiByOworCisgICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgZmluZCBvdXQgaG93IHRvIGhhbmRsZSBpdC4KKyAgICAgIGxhc3RFcnJubyA9IGdldFNvY2tldEVycm5vKCk7CisKKyAgICAgIGlmIChsYXN0RXJybm8gPT0gSU5URVJSVVBURURfRVJSTk8pIHsKKyAgICAgICAgLy8gSWYgdGhlIHN5c2NhbGwgd2FzIGludGVycnVwdGVkLCBqdXN0IHRyeSBhZ2Fpbi4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBpZiAoY29ubnJlc2V0T25QZWVyU2h1dGRvd24pIHsKKyAgICAgICAgLy8gU2VlIHRvcCBjb21tZW50LgorICAgICAgICBpZiAobGFzdEVycm5vID09IEVDT05OUkVTRVQpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBOb3QgYW4gZXJyb3Igd2hpY2ggaXMgaGFuZGxlZCBpbiBhIHNwZWNpYWwgd2F5LCBqdXN0IGxlYXZlIHRoZSBsb29wLgorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGlzU29ja2V0Q2xvc2VFcnJubyhsYXN0RXJybm8pKSB7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlY2VpdmluZyBmYWlsZWQsIGNsb3Npbmcgc29ja2V0OiAiIH4KKyAgICAgICAgc29ja2V0RXJybm9TdHJpbmcobGFzdEVycm5vKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKTsKKyAgICB9IGVsc2UgaWYgKGxhc3RFcnJubyA9PSBUSU1FT1VUX0VSUk5PKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVElNRURfT1VUKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlY2VpdmluZyBmcm9tIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVU5LTk9XTik7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIHNpemVfdCBzZW50OworICAgIHdoaWxlIChzZW50IDwgYnVmLmxlbmd0aCkgeworICAgICAgYXV0byBiID0gd3JpdGVTb21lKGJ1ZltzZW50IC4uICRdKTsKKyAgICAgIGlmIChiID09IDApIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRpbWVvdXQgc2V0IHdpdGggU09fU05EVElNRU8gZXhwaXJlZC4KKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oInNlbmQoKSB0aW1lb3V0IGV4cGlyZWQuIiwKKyAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVElNRURfT1VUKTsKKyAgICAgIH0KKyAgICAgIHNlbnQgKz0gYjsKKyAgICB9CisgICAgYXNzZXJ0KHNlbnQgPT0gYnVmLmxlbmd0aCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3Qgd3JpdGVTb21lKGluIHVieXRlW10gYnVmKSB7CisgICAgZW5mb3JjZShpc09wZW4sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCB3cml0ZSBpZiBmaWxlIGlzIG5vdCBvcGVuLiIsIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5OT1RfT1BFTikpOworCisgICAgYXV0byByID0gc29ja2V0Xy5zZW5kKGJ1Zik7CisKKyAgICAvLyBFdmVyeXRoaW5nIHdlbnQgd2VsbCwganVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICAgIGlmIChyID4gMCkgcmV0dXJuIHI7CisKKyAgICAvLyBIYW5kbGUgZXJyb3IgY29uZGl0aW9ucy4KKyAgICBpZiAociA8IDApIHsKKyAgICAgIGF1dG8gbGFzdEVycm5vID0gZ2V0U29ja2V0RXJybm8oKTsKKworICAgICAgaWYgKGxhc3RFcnJubyA9PSBXT1VMRF9CTE9DS19FUlJOTykgeworICAgICAgICAvLyBOb3QgYW4gZXhjZXB0aW9uYWwgZXJyb3IgcGVyIHNlIOKAkyBldmVuIHdpdGggYmxvY2tpbmcgc29ja2V0cywKKyAgICAgICAgLy8gRUFHQUlOIGFwcGFyZW50bHkgaXMgcmV0dXJuZWQgc29tZXRpbWVzIG9uIG91dC1vZi1yZXNvdXJjZQorICAgICAgICAvLyBjb25kaXRpb25zIChzZWUgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBmb3IgZGV0YWlscykuIEFsc28sIHRoaXMKKyAgICAgICAgLy8gYWxsb3dzIHVzaW5nIFRTb2NrZXQgd2l0aCBub24tYmxvY2tpbmcgc29ja2V0cyBlLmcuIGluCisgICAgICAgIC8vIFROb25ibG9ja2luZ1NlcnZlci4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGF1dG8gdHlwZSA9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOOworICAgICAgaWYgKGlzU29ja2V0Q2xvc2VFcnJubyhsYXN0RXJybm8pKSB7CisgICAgICAgIHR5cGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuTk9UX09QRU47CisgICAgICAgIGNsb3NlKCk7CisgICAgICB9CisKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJTZW5kaW5nIHRvIHNvY2tldCBmYWlsZWQ6ICIgfgorICAgICAgICBzb2NrZXRFcnJub1N0cmluZyhsYXN0RXJybm8pLCB0eXBlKTsKKyAgICB9CisKKyAgICAvLyBzZW5kKCkgc2hvdWxkIG5ldmVyIHJldHVybiAwLgorICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJTZW5kaW5nIHRvIHNvY2tldCBmYWlsZWQgKDAgYnl0ZXMgd3JpdHRlbikuIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgc2VuZFRpbWVvdXQoRHVyYXRpb24gdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgc3VwZXIuc2VuZFRpbWVvdXQodmFsdWUpOworICAgIHNldFRpbWVvdXQoU29ja2V0T3B0aW9uLlNORFRJTUVPLCB2YWx1ZSk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIHJlY3ZUaW1lb3V0KER1cmF0aW9uIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHN1cGVyLnJlY3ZUaW1lb3V0KHZhbHVlKTsKKyAgICBzZXRUaW1lb3V0KFNvY2tldE9wdGlvbi5SQ1ZUSU1FTywgdmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgZm9yIHJlY2VpdmluZyBmcm9tIHNvY2tldCBvbiByZWFkKCkgaW4gY2FzZSBvZgorICAgKiBFQUdBSU4vRUlOVFIuCisgICAqLworICB1c2hvcnQgbWF4UmVjdlJldHJpZXMoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBtYXhSZWN2UmV0cmllc187CisgIH0KKworICAvLy8gRGl0dG8KKyAgdm9pZCBtYXhSZWN2UmV0cmllcyh1c2hvcnQgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgbWF4UmVjdlJldHJpZXNfID0gdmFsdWU7CisgIH0KKworICAvLy8gRGl0dG8KKyAgZW51bSBERUZBVUxUX01BWF9SRUNWX1JFVFJJRVMgPSA1OworCitwcm90ZWN0ZWQ6CisgIG92ZXJyaWRlIHZvaWQgc2V0U29ja2V0T3B0cygpIHsKKyAgICBzdXBlci5zZXRTb2NrZXRPcHRzKCk7CisgICAgc2V0VGltZW91dChTb2NrZXRPcHRpb24uU05EVElNRU8sIHNlbmRUaW1lb3V0Xyk7CisgICAgc2V0VGltZW91dChTb2NrZXRPcHRpb24uUkNWVElNRU8sIHJlY3ZUaW1lb3V0Xyk7CisgIH0KKworICB2b2lkIHNldFRpbWVvdXQoU29ja2V0T3B0aW9uIHR5cGUsIER1cmF0aW9uIHZhbHVlKSB7CisgICAgYXNzZXJ0KHR5cGUgPT0gU29ja2V0T3B0aW9uLlNORFRJTUVPIHx8IHR5cGUgPT0gU29ja2V0T3B0aW9uLlJDVlRJTUVPKTsKKyAgICB2ZXJzaW9uIChXaW4zMikgeworICAgICAgaWYgKHZhbHVlID4gZHVyISJobnNlY3MiKDApICYmIHZhbHVlIDwgZHVyISJtc2VjcyIoNTAwKSkgeworICAgICAgICBsb2dFcnJvcigKKyAgICAgICAgICAiU29ja2V0ICVzIHRpbWVvdXQgb2YgJXMgbXMgbWlnaHQgYmUgcmFpc2VkIHRvIDUwMCBtcyBvbiBXaW5kb3dzLiIsCisgICAgICAgICAgKHR5cGUgPT0gU29ja2V0T3B0aW9uLlNORFRJTUVPKSA/ICJzZW5kIiA6ICJyZWNlaXZlIiwKKyAgICAgICAgICB2YWx1ZS50b3RhbCEibXNlY3MiCisgICAgICAgICk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNvY2tldF8pIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHNvY2tldF8uc2V0T3B0aW9uKFNvY2tldE9wdGlvbkxldmVsLlNPQ0tFVCwgdHlwZSwgdmFsdWUpOworICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgdGltZW91dC4iLAorICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5VTktOT1dOLAorICAgICAgICAgIF9fRklMRV9fLAorICAgICAgICAgIF9fTElORV9fLAorICAgICAgICAgIGUKKyAgICAgICAgKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gTWF4aW11bSBudW1iZXIgb2YgcmVjdigpIHJldHJpZXMuCisgIHVzaG9ydCBtYXhSZWN2UmV0cmllc18gID0gREVGQVVMVF9NQVhfUkVDVl9SRVRSSUVTOworfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGNlNDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQKQEAgLTAsMCArMSw2OTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBPcGVuU1NMIHNvY2tldCBpbXBsZW1lbnRhdGlvbiwgaW4gbGFyZ2UgcGFydHMgcG9ydGVkIGZyb20gQysrLgorICovCittb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CisKK2ltcG9ydCBjb3JlLmV4Y2VwdGlvbiA6IG9uT3V0T2ZNZW1vcnlFcnJvcjsKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm8gOiBlcnJubywgRUlOVFI7CitpbXBvcnQgY29yZS5zeW5jLm11dGV4IDogTXV0ZXg7CitpbXBvcnQgY29yZS5tZW1vcnkgOiBHQzsKK2ltcG9ydCBjb3JlLnN0ZGMuY29uZmlnOworaW1wb3J0IGNvcmUuc3RkYy5zdGRsaWIgOiBmcmVlLCBtYWxsb2M7CitpbXBvcnQgc3RkLmFzY2lpIDogdG9VcHBlcjsKK2ltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eSwgZnJvbnQsIHBvcEZyb250OworaW1wb3J0IHN0ZC5jb252IDogZW1wbGFjZSwgdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgc3RkLnNvY2tldCA6IEFkZHJlc3MsIEludGVybmV0QWRkcmVzcywgSW50ZXJuZXQ2QWRkcmVzcywgU29ja2V0OworaW1wb3J0IHN0ZC5zdHJpbmcgOiB0b1N0cmluZ3o7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuZXJyOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLnJhbmQ7CitpbXBvcnQgZGVpbW9zLm9wZW5zc2wuc3NsOworaW1wb3J0IGRlaW1vcy5vcGVuc3NsLng1MDl2MzsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuc3NsOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKKworLyoqCisgKiBTU0wgZW5jcnlwdGVkIHNvY2tldCBpbXBsZW1lbnRhdGlvbiB1c2luZyBPcGVuU1NMLgorICoKKyAqIE5vdGU6CisgKiBPbiBQb3NpeCBzeXN0ZW1zIHdoaWNoIGRvIG5vdCBoYXZlIHRoZSBCU0Qtc3BlY2lmaWMgU09fTk9TSUdQSVBFIGZsYWcsIHlvdQorICogbWlnaHQgd2FudCB0byBpZ25vcmUgdGhlIFNJR1BJUEUgc2lnbmFsLCBhcyBPcGVuU1NMIG1pZ2h0IHRyeSB0byB3cml0ZSB0bworICogYSBjbG9zZWQgc29ja2V0IGlmIHRoZSBwZWVyIGRpc2Nvbm5lY3RzIGFicnVwdGx5OgorICogLS0tCisgKiBpbXBvcnQgY29yZS5zdGRjLnNpZ25hbDsKKyAqIGltcG9ydCBjb3JlLnN5cy5wb3NpeC5zaWduYWw7CisgKiBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgKiAtLS0KKyAqLworZmluYWwgY2xhc3MgVFNTTFNvY2tldCA6IFRTb2NrZXQgeworICAvKioKKyAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSB0aGF0IHdyYXBzIGFuIGFscmVhZHkgY3JlYXRlZCwgY29ubmVjdGVkICghKSBzb2NrZXQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBjb250ZXh0ID0gVGhlIFNTTCBzb2NrZXQgY29udGV4dCB0byB1c2UuIEEgcmVmZXJlbmNlIHRvIGl0IGlzIHN0b3JlZCBzbworICAgKiAgICAgdGhhdCBpdCBkb2Vzbid0IGdldCBjbGVhbmVkIHVwIHdoaWxlIHRoZSBzb2NrZXQgaXMgdXNlZC4KKyAgICogICBzb2NrZXQgPSBBbHJlYWR5IGNyZWF0ZWQsIGNvbm5lY3RlZCBzb2NrZXQgb2JqZWN0LgorICAgKi8KKyAgdGhpcyhUU1NMQ29udGV4dCBjb250ZXh0LCBTb2NrZXQgc29ja2V0KSB7CisgICAgc3VwZXIoc29ja2V0KTsKKyAgICBjb250ZXh0XyA9IGNvbnRleHQ7CisgICAgc2VydmVyU2lkZV8gPSBjb250ZXh0LnNlcnZlclNpZGU7CisgICAgYWNjZXNzTWFuYWdlcl8gPSBjb250ZXh0LmFjY2Vzc01hbmFnZXI7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyB1bmNvbm5lY3RlZCBzb2NrZXQgdGhhdCB3aWxsIGNvbm5lY3QgdG8gdGhlIGdpdmVuIGhvc3QKKyAgICogb24gdGhlIGdpdmVuIHBvcnQuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBjb250ZXh0ID0gVGhlIFNTTCBzb2NrZXQgY29udGV4dCB0byB1c2UuIEEgcmVmZXJlbmNlIHRvIGl0IGlzIHN0b3JlZCBzbworICAgICogICAgIHRoYXQgaXQgZG9lc24ndCBnZXQgY2xlYW5lZCB1cCB3aGlsZSB0aGUgc29ja2V0IGlzIHVzZWQuCisgICAqICAgaG9zdCA9IFJlbW90ZSBob3N0LgorICAgKiAgIHBvcnQgPSBSZW1vdGUgcG9ydC4KKyAgICovCisgIHRoaXMoVFNTTENvbnRleHQgY29udGV4dCwgc3RyaW5nIGhvc3QsIHVzaG9ydCBwb3J0KSB7CisgICAgc3VwZXIoaG9zdCwgcG9ydCk7CisgICAgY29udGV4dF8gPSBjb250ZXh0OworICAgIHNlcnZlclNpZGVfID0gY29udGV4dC5zZXJ2ZXJTaWRlOworICAgIGFjY2Vzc01hbmFnZXJfID0gY29udGV4dC5hY2Nlc3NNYW5hZ2VyOworICB9CisKKyAgb3ZlcnJpZGUgYm9vbCBpc09wZW4oKSBAcHJvcGVydHkgeworICAgIGlmIChzc2xfIGlzIG51bGwgfHwgIXN1cGVyLmlzT3BlbigpKSByZXR1cm4gZmFsc2U7CisKKyAgICBhdXRvIHNodXRkb3duID0gU1NMX2dldF9zaHV0ZG93bihzc2xfKTsKKyAgICBib29sIHNodXRkb3duUmVjZWl2ZWQgPSAoc2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pICE9IDA7CisgICAgYm9vbCBzaHV0ZG93blNlbnQgPSAoc2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTikgIT0gMDsKKyAgICByZXR1cm4gIShzaHV0ZG93blJlY2VpdmVkICYmIHNodXRkb3duU2VudCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHBlZWsoKSB7CisgICAgaWYgKCFpc09wZW4pIHJldHVybiBmYWxzZTsKKyAgICBjaGVja0hhbmRzaGFrZSgpOworCisgICAgYnl0ZSBidDsKKyAgICBhdXRvIHJjID0gU1NMX3BlZWsoc3NsXywgJmJ0LCBidC5zaXplb2YpOworICAgIGVuZm9yY2UocmMgPj0gMCwgZ2V0U1NMRXhjZXB0aW9uKCJTU0xfcGVlayIpKTsKKworICAgIGlmIChyYyA9PSAwKSB7CisgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICB9CisgICAgcmV0dXJuIChyYyA+IDApOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBvcGVuKCkgeworICAgIGVuZm9yY2UoIXNlcnZlclNpZGVfLCAiQ2Fubm90IG9wZW4gYSBzZXJ2ZXItc2lkZSBTU0wgc29ja2V0LiIpOworICAgIGlmIChpc09wZW4pIHJldHVybjsKKyAgICBzdXBlci5vcGVuKCk7CisgIH0KKworICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgeworICAgIGlmICghaXNPcGVuKSByZXR1cm47CisKKyAgICBpZiAoc3NsXyAhaXMgbnVsbCkgeworICAgICAgLy8gVHdvLXN0ZXAgU1NMIHNodXRkb3duLgorICAgICAgYXV0byByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKKyAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgIHJjID0gU1NMX3NodXRkb3duKHNzbF8pOworICAgICAgfQorICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAvLyBEbyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUgYXMgbGVhdmluZyB0aGUgdHJhbnNwb3J0ICJvcGVuIiB3aWxsCisgICAgICAgIC8vIHByb2JhYmx5IHByb2R1Y2Ugb25seSBtb3JlIGVycm9ycywgYW5kIHRoZSBjaGFuY2Ugd2UgY2FuIGRvCisgICAgICAgIC8vIHNvbWV0aGluZyBhYm91dCB0aGUgZXJyb3IgZS5nLiBieSByZXRyeWluZyBpcyB2ZXJ5IGxvdy4KKyAgICAgICAgbG9nRXJyb3IoIkVycm9yIHNodXR0aW5nIGRvd24gU1NMOiAlcyIsIGdldFNTTEV4Y2VwdGlvbigpKTsKKyAgICAgIH0KKworICAgICAgU1NMX2ZyZWUoc3NsXyk7CisgICAgICBzc2xfID0gbnVsbDsKKyAgICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgICAgfQorICAgIHN1cGVyLmNsb3NlKCk7CisgIH0KKworICBvdmVycmlkZSBzaXplX3QgcmVhZCh1Ynl0ZVtdIGJ1ZikgeworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICBpbnQgYnl0ZXM7CisgICAgZm9yZWFjaCAoXzsgMCAuLiBtYXhSZWN2UmV0cmllcykgeworICAgICAgYnl0ZXMgPSBTU0xfcmVhZChzc2xfLCBidWYucHRyLCBjYXN0KGludClidWYubGVuZ3RoKTsKKyAgICAgIGlmIChieXRlcyA+PSAwKSBicmVhazsKKworICAgICAgYXV0byBlcnJub0NvcHkgPSBlcnJubzsKKyAgICAgIGlmIChTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKSA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworICAgICAgICBpZiAoRVJSX2dldF9lcnJvcigpID09IDAgJiYgZXJybm9Db3B5ID09IEVJTlRSKSB7CisgICAgICAgICAgLy8gRklYTUU6IFdpbmRvd3MuCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRocm93IGdldFNTTEV4Y2VwdGlvbigiU1NMX3JlYWQiKTsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICAvLyBMb29wIGluIGNhc2UgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUgaXMgc2V0IGluIFNTTF9DVFguCisgICAgc2l6ZV90IHdyaXR0ZW4gPSAwOworICAgIHdoaWxlICh3cml0dGVuIDwgYnVmLmxlbmd0aCkgeworICAgICAgYXV0byBieXRlcyA9IFNTTF93cml0ZShzc2xfLCBidWYucHRyICsgd3JpdHRlbiwKKyAgICAgICAgY2FzdChpbnQpKGJ1Zi5sZW5ndGggLSB3cml0dGVuKSk7CisgICAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgICB0aHJvdyBnZXRTU0xFeGNlcHRpb24oIlNTTF93cml0ZSIpOworICAgICAgfQorICAgICAgd3JpdHRlbiArPSBieXRlczsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGNoZWNrSGFuZHNoYWtlKCk7CisKKyAgICBhdXRvIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfKTsKKyAgICBlbmZvcmNlKGJpbyAhaXMgbnVsbCwgbmV3IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfd2JpbyByZXR1cm5lZCBudWxsIikpOworCisgICAgYXV0byByYyA9IEJJT19mbHVzaChiaW8pOworICAgIGVuZm9yY2UocmMgPT0gMSwgZ2V0U1NMRXhjZXB0aW9uKCJCSU9fZmx1c2giKSk7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCisgICAqLworICBib29sIHNlcnZlclNpZGUoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiBzZXJ2ZXJTaWRlXzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIHNlcnZlclNpZGUoYm9vbCB2YWx1ZSkgQHByb3BlcnR5IHsKKyAgICBzZXJ2ZXJTaWRlXyA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBhY2Nlc3MgbWFuYWdlciB0byB1c2UuCisgICAqLworICB2b2lkIGFjY2Vzc01hbmFnZXIoVEFjY2Vzc01hbmFnZXIgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgYWNjZXNzTWFuYWdlcl8gPSB2YWx1ZTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIGNoZWNrSGFuZHNoYWtlKCkgeworICAgIGVuZm9yY2Uoc3VwZXIuaXNPcGVuKCksIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLk5PVF9PUEVOKSk7CisKKyAgICBpZiAoc3NsXyAhaXMgbnVsbCkgcmV0dXJuOworICAgIHNzbF8gPSBjb250ZXh0Xy5jcmVhdGVTU0woKTsKKworICAgIFNTTF9zZXRfZmQoc3NsXywgc29ja2V0SGFuZGxlKTsKKyAgICBpbnQgcmM7CisgICAgaWYgKHNlcnZlclNpZGVfKSB7CisgICAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsXyk7CisgICAgfQorICAgIGVuZm9yY2UocmMgPiAwLCBnZXRTU0xFeGNlcHRpb24oKSk7CisgICAgYXV0aG9yaXplKHNzbF8sIGFjY2Vzc01hbmFnZXJfLCBnZXRQZWVyQWRkcmVzcygpLAorICAgICAgKHNlcnZlclNpZGVfID8gZ2V0UGVlckFkZHJlc3MoKS50b0hvc3ROYW1lU3RyaW5nKCkgOiBob3N0KSk7CisgIH0KKworICBib29sIHNlcnZlclNpZGVfOworICBTU0wqIHNzbF87CisgIFRTU0xDb250ZXh0IGNvbnRleHRfOworICBUQWNjZXNzTWFuYWdlciBhY2Nlc3NNYW5hZ2VyXzsKK30KKworLyoqCisgKiBSZXByZXNlbnRzIGFuIE9wZW5TU0wgY29udGV4dCB3aXRoIGNlcnRpZmljYXRpb24gc2V0dGluZ3MsIGV0Yy4gYW5kIGhhbmRsZXMKKyAqIGluaXRpYWxpemF0aW9uL3RlYXJkb3duLgorICoKKyAqIE9wZW5TU0wgaXMgaW5pdGlhbGl6ZWQgd2hlbiB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBjcmVhdGVkCisgKiBhbmQgc2h1dCBkb3duIHdoZW4gdGhlIGxhc3Qgb25lIGlzIGRlc3Ryb3llZCAodGhyZWFkLXNhZmUpLgorICovCitjbGFzcyBUU1NMQ29udGV4dCB7CisgIHRoaXMoKSB7CisgICAgaW5pdE11dGV4Xy5sb2NrKCk7CisgICAgc2NvcGUoZXhpdCkgaW5pdE11dGV4Xy51bmxvY2soKTsKKworICAgIGlmIChjb3VudF8gPT0gMCkgeworICAgICAgaW5pdGlhbGl6ZU9wZW5TU0woKTsKKyAgICAgIHJhbmRvbWl6ZSgpOworICAgIH0KKyAgICBjb3VudF8rKzsKKworICAgIHN0YXRpYyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9BVF9MRUFTVCgxLCAxKSkgeworICAgICAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTX21ldGhvZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHhfID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKKyAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjIpOworICAgIH0KKyAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eF8sIFNTTF9PUF9OT19TU0x2Myk7ICAgLy8gVEhSSUZULTMxNjQKKyAgICBlbmZvcmNlKGN0eF8sIGdldFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9uZXciKSk7CisgICAgU1NMX0NUWF9zZXRfbW9kZShjdHhfLCBTU0xfTU9ERV9BVVRPX1JFVFJZKTsKKyAgfQorCisgIH50aGlzKCkgeworICAgIGluaXRNdXRleF8ubG9jaygpOworICAgIHNjb3BlKGV4aXQpIGluaXRNdXRleF8udW5sb2NrKCk7CisKKyAgICBpZiAoY3R4XyAhaXMgbnVsbCkgeworICAgICAgU1NMX0NUWF9mcmVlKGN0eF8pOworICAgICAgY3R4XyA9IG51bGw7CisgICAgfQorCisgICAgY291bnRfLS07CisgICAgaWYgKGNvdW50XyA9PSAwKSB7CisgICAgICBjbGVhbnVwT3BlblNTTCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDaXBoZXJzIHRvIGJlIHVzZWQgaW4gU1NMIGhhbmRzaGFrZSBwcm9jZXNzLgorICAgKgorICAgKiBUaGUgc3RyaW5nIG11c3QgYmUgaW4gdGhlIGNvbG9uLWRlbGltaXRlZCBPcGVuU1NMIG5vdGF0aW9uIGRlc2NyaWJlZCBpbgorICAgKiBjaXBoZXJzKDEpLCBmb3IgZXhhbXBsZTogIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIuCisgICAqLworICB2b2lkIGNpcGhlcnMoc3RyaW5nIGVuYWJsZSkgQHByb3BlcnR5IHsKKyAgICBhdXRvIHJjID0gU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY3R4XywgdG9TdHJpbmd6KGVuYWJsZSkpOworCisgICAgZW5mb3JjZShFUlJfcGVla19lcnJvcigpID09IDAsIGdldFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QiKSk7CisgICAgZW5mb3JjZShyYyA+IDAsIG5ldyBUU1NMRXhjZXB0aW9uKCJOb25lIG9mIHNwZWNpZmllZCBjaXBoZXJzIGFyZSBzdXBwb3J0ZWQiKSk7CisgIH0KKworICAvKioKKyAgICogV2hldGhlciBwZWVyIGlzIHJlcXVpcmVkIHRvIHByZXNlbnQgYSB2YWxpZCBjZXJ0aWZpY2F0ZS4KKyAgICovCisgIHZvaWQgYXV0aGVudGljYXRlKGJvb2wgcmVxdWlyZWQpIEBwcm9wZXJ0eSB7CisgICAgaW50IG1vZGU7CisgICAgaWYgKHJlcXVpcmVkKSB7CisgICAgICBtb2RlID0gU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8CisgICAgICAgIFNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisgICAgfSBlbHNlIHsKKyAgICAgIG1vZGUgPSBTU0xfVkVSSUZZX05PTkU7CisgICAgfQorICAgIFNTTF9DVFhfc2V0X3ZlcmlmeShjdHhfLCBtb2RlLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBMb2FkIHNlcnZlciBjZXJ0aWZpY2F0ZS4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHBhdGggPSBQYXRoIHRvIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLgorICAgKiAgIGZvcm1hdCA9IENlcnRpZmljYXRlIGZpbGUgZm9ybWF0LiBEZWZhdWx0cyB0byBQRU0sIHdoaWNoIGlzIGN1cnJlbnRseQorICAgKiAgICAgdGhlIG9ubHkgb25lIHN1cHBvcnRlZC4KKyAgICovCisgIHZvaWQgbG9hZENlcnRpZmljYXRlKHN0cmluZyBwYXRoLCBzdHJpbmcgZm9ybWF0ID0gIlBFTSIpIHsKKyAgICBlbmZvcmNlKHBhdGggIWlzIG51bGwgJiYgZm9ybWF0ICFpcyBudWxsLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJsb2FkQ2VydGlmaWNhdGVDaGFpbjogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBudWxsIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworCisgICAgaWYgKGZvcm1hdCA9PSAiUEVNIikgeworICAgICAgZW5mb3JjZShTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGN0eF8sIHRvU3RyaW5neihwYXRoKSksCisgICAgICAgIGdldFNTTEV4Y2VwdGlvbigKKyAgICAgICAgICBgQ291bGQgbm90IGxvYWQgU1NMIHNlcnZlciBjZXJ0aWZpY2F0ZSBmcm9tIGZpbGUgImAgfiBwYXRoIH4gYCJgCisgICAgICAgICkKKyAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUU1NMRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBjZXJ0aWZpY2F0ZSBmb3JtYXQ6ICIgfiBmb3JtYXQpOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIExvYWQgcHJpdmF0ZSBrZXkuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBwYXRoID0gUGF0aCB0byB0aGUgY2VydGlmaWNhdGUgZmlsZS4KKyAgICogICBmb3JtYXQgPSBQcml2YXRlIGtleSBmaWxlIGZvcm1hdC4gRGVmYXVsdHMgdG8gUEVNLCB3aGljaCBpcyBjdXJyZW50bHkKKyAgICogICAgIHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQuCisgICAqLworICB2b2lkIGxvYWRQcml2YXRlS2V5KHN0cmluZyBwYXRoLCBzdHJpbmcgZm9ybWF0ID0gIlBFTSIpIHsKKyAgICBlbmZvcmNlKHBhdGggIWlzIG51bGwgJiYgZm9ybWF0ICFpcyBudWxsLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJsb2FkUHJpdmF0ZUtleTogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworCisgICAgaWYgKGZvcm1hdCA9PSAiUEVNIikgeworICAgICAgZW5mb3JjZShTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY3R4XywgdG9TdHJpbmd6KHBhdGgpLCBTU0xfRklMRVRZUEVfUEVNKSwKKyAgICAgICAgZ2V0U1NMRXhjZXB0aW9uKAorICAgICAgICAgIGBDb3VsZCBub3QgbG9hZCBTU0wgcHJpdmF0ZSBrZXkgZnJvbSBmaWxlICJgIH4gcGF0aCB+IGAiYAorICAgICAgICApCisgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVFNTTEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2VydGlmaWNhdGUgZm9ybWF0OiAiIH4gZm9ybWF0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTG9hZCB0cnVzdGVkIGNlcnRpZmljYXRlcyBmcm9tIHNwZWNpZmllZCBmaWxlIChpbiBQRU0gZm9ybWF0KS4KKyAgICoKKyAgICogUGFyYW1zLgorICAgKiAgIHBhdGggPSBQYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGVzLgorICAgKi8KKyAgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhzdHJpbmcgcGF0aCkgeworICAgIGVuZm9yY2UocGF0aCAhaXMgbnVsbCwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAibG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXM6IDxwYXRoPiBpcyBOVUxMIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUykpOworCisgICAgZW5mb3JjZShTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHhfLCB0b1N0cmluZ3oocGF0aCksIG51bGwpLAorICAgICAgZ2V0U1NMRXhjZXB0aW9uKAorICAgICAgICBgQ291bGQgbm90IGxvYWQgU1NMIHRydXN0ZWQgY2VydGlmaWNhdGUgbGlzdCBmcm9tIGZpbGUgImAgfiBwYXRoIH4gYCJgCisgICAgICApCisgICAgKTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgZHVyaW5nIE9wZW5TU0wgaW5pdGlhbGl6YXRpb24gdG8gc2VlZCB0aGUgT3BlblNTTCBlbnRyb3B5IHBvb2wuCisgICAqCisgICAqIERlZmF1bHRzIHRvIHNpbXBseSBjYWxsaW5nIFJBTkRfcG9sbCgpLCBidXQgaXQgY2FuIGJlIG92ZXJ3cml0dGVuIGlmIGEKKyAgICogZGlmZmVyZW50LCBwZXJoYXBzIG1vcmUgc2VjdXJlIGltcGxlbWVudGF0aW9uIGlzIGRlc2lyZWQuCisgICAqLworICB2b2lkIHJhbmRvbWl6ZSgpIHsKKyAgICBSQU5EX3BvbGwoKTsKKyAgfQorCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIHVzZSBjbGllbnQgb3Igc2VydmVyIHNpZGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbC4KKyAgICovCisgIGJvb2wgc2VydmVyU2lkZSgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIHNlcnZlclNpZGVfOworICB9CisKKyAgLy8vIERpdHRvCisgIHZvaWQgc2VydmVyU2lkZShib29sIHZhbHVlKSBAcHJvcGVydHkgeworICAgIHNlcnZlclNpZGVfID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogVGhlIGFjY2VzcyBtYW5hZ2VyIHRvIHVzZS4KKyAgICovCisgIFRBY2Nlc3NNYW5hZ2VyIGFjY2Vzc01hbmFnZXIoKSBAcHJvcGVydHkgeworICAgIGlmICghc2VydmVyU2lkZV8gJiYgIWFjY2Vzc01hbmFnZXJfKSB7CisgICAgICBhY2Nlc3NNYW5hZ2VyXyA9IG5ldyBURGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI7CisgICAgfQorICAgIHJldHVybiBhY2Nlc3NNYW5hZ2VyXzsKKyAgfQorCisgIC8vLyBEaXR0bworICB2b2lkIGFjY2Vzc01hbmFnZXIoVEFjY2Vzc01hbmFnZXIgdmFsdWUpIEBwcm9wZXJ0eSB7CisgICAgYWNjZXNzTWFuYWdlcl8gPSB2YWx1ZTsKKyAgfQorCisgIFNTTCogY3JlYXRlU1NMKCkgb3V0IChyZXN1bHQpIHsKKyAgICBhc3NlcnQocmVzdWx0KTsKKyAgfSBib2R5IHsKKyAgICBhdXRvIHJlc3VsdCA9IFNTTF9uZXcoY3R4Xyk7CisgICAgZW5mb3JjZShyZXN1bHQsIGdldFNTTEV4Y2VwdGlvbigiU1NMX25ldyIpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBjdXN0b20gcGFzc3dvcmQgY2FsbGJhY2suIEl0IG1heSBiZSBjYWxsZWQKKyAgICogbXVsdGlwbGUgdGltZXMgYXQgYW55IHRpbWUgZHVyaW5nIGEgc2Vzc2lvbiBhcyBuZWNlc3NhcnkuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBzaXplID0gTWF4aW11bSBsZW5ndGggb2YgcGFzc3dvcmQsIGluY2x1ZGluZyBudWxsIGJ5dGUuCisgICAqLworICBzdHJpbmcgZ2V0UGFzc3dvcmQoaW50IHNpemUpIG5vdGhyb3cgb3V0KHJlc3VsdCkgeworICAgIGFzc2VydChyZXN1bHQubGVuZ3RoIDwgc2l6ZSk7CisgIH0gYm9keSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLyoqCisgICAqIE5vdGlmaWVzIE9wZW5TU0wgdG8gdXNlIGdldFBhc3N3b3JkKCkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBwYXNzd29yZAorICAgKiBjYWxsYmFjayB3aXRoIGdldFBhc3N3b3JkKCkuCisgICAqLworICB2b2lkIG92ZXJyaWRlRGVmYXVsdFBhc3N3b3JkQ2FsbGJhY2soKSB7CisgICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoY3R4XywgJnBhc3N3b3JkQ2FsbGJhY2spOworICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKGN0eF8sIGNhc3Qodm9pZCopdGhpcyk7CisgIH0KKworICBTU0xfQ1RYKiBjdHhfOworCitwcml2YXRlOgorICBib29sIHNlcnZlclNpZGVfOworICBUQWNjZXNzTWFuYWdlciBhY2Nlc3NNYW5hZ2VyXzsKKworICBzaGFyZWQgc3RhdGljIHRoaXMoKSB7CisgICAgaW5pdE11dGV4XyA9IG5ldyBNdXRleCgpOworICB9CisKKyAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZU9wZW5TU0woKSB7CisgICAgaWYgKGluaXRpYWxpemVkXykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbml0aWFsaXplZF8gPSB0cnVlOworCisgICBzdGF0aWMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9CRUZPUkUoMSwgMSkpIHsKKyAgICBTU0xfbGlicmFyeV9pbml0KCk7CisgICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworCisgICAgbXV0ZXhlc18gPSBuZXcgTXV0ZXhbQ1JZUFRPX251bV9sb2NrcygpXTsKKyAgICBmb3JlYWNoIChyZWYgbTsgbXV0ZXhlc18pIHsKKyAgICAgIG0gPSBuZXcgTXV0ZXg7CisgICAgfQorCisgICAgaW1wb3J0IHRocmlmdC5pbnRlcm5hbC50cmFpdHM7CisgICAgLy8gQXMgcGVyIHRoZSBPcGVuU1NMIHRocmVhZHMgbWFucGFnZSwgdGhpcyBpc24ndCBuZWVkZWQgb24gV2luZG93cy4KKyAgICB2ZXJzaW9uIChQb3NpeCkgeworICAgICAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZ0aHJlYWRJZENhbGxiYWNrKSk7CisgICAgfQorICAgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZsb2NraW5nQ2FsbGJhY2spKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tDcmVhdGVDYWxsYmFjaykpOworICAgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tMb2NrQ2FsbGJhY2spKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrRGVzdHJveUNhbGxiYWNrKSk7CisgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCBjbGVhbnVwT3BlblNTTCgpIHsKKyAgICBpZiAoIWluaXRpYWxpemVkXykgcmV0dXJuOworCisgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisgICBzdGF0aWMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9CRUZPUkUoMSwgMSkpIHsKKyAgICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2sobnVsbCk7CisgICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhudWxsKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhudWxsKTsKKyAgICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhudWxsKTsKKyAgICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOworICAgIEVSUl9mcmVlX3N0cmluZ3MoKTsKKyAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICAgfQorICB9CisKKyAgc3RhdGljIGV4dGVybihDKSB7CisgICAgdmVyc2lvbiAoUG9zaXgpIHsKKyAgICAgIGltcG9ydCBjb3JlLnN5cy5wb3NpeC5wdGhyZWFkIDogcHRocmVhZF9zZWxmOworICAgICAgY191bG9uZyB0aHJlYWRJZENhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gY2FzdChjX3Vsb25nKXB0aHJlYWRfc2VsZigpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbG9ja2luZ0NhbGxiYWNrKGludCBtb2RlLCBpbnQgbiwgY29uc3QoY2hhcikqIGZpbGUsIGludCBsaW5lKSB7CisgICAgICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgICAgIG11dGV4ZXNfW25dLmxvY2soKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG11dGV4ZXNfW25dLnVubG9jaygpOworICAgICAgfQorICAgIH0KKworICAgIENSWVBUT19keW5sb2NrX3ZhbHVlKiBkeW5sb2NrQ3JlYXRlQ2FsbGJhY2soY29uc3QoY2hhcikqIGZpbGUsIGludCBsaW5lKSB7CisgICAgICBlbnVtIHNpemUgPSAgX190cmFpdHMoY2xhc3NJbnN0YW5jZVNpemUsIE11dGV4KTsKKyAgICAgIGF1dG8gbWVtID0gbWFsbG9jKHNpemUpWzAgLi4gc2l6ZV07CisgICAgICBpZiAoIW1lbSkgb25PdXRPZk1lbW9yeUVycm9yKCk7CisgICAgICBHQy5hZGRSYW5nZShtZW0ucHRyLCBzaXplKTsKKyAgICAgIGF1dG8gbXV0ZXggPSBlbXBsYWNlIU11dGV4KG1lbSk7CisgICAgICByZXR1cm4gY2FzdChDUllQVE9fZHlubG9ja192YWx1ZSopbXV0ZXg7CisgICAgfQorCisgICAgdm9pZCBkeW5sb2NrTG9ja0NhbGxiYWNrKGludCBtb2RlLCBDUllQVE9fZHlubG9ja192YWx1ZSogbCwKKyAgICAgIGNvbnN0KGNoYXIpKiBmaWxlLCBpbnQgbGluZSkKKyAgICB7CisgICAgICBpZiAobCBpcyBudWxsKSByZXR1cm47CisgICAgICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgICAgIChjYXN0KE11dGV4KWwpLmxvY2soKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIChjYXN0KE11dGV4KWwpLnVubG9jaygpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZHlubG9ja0Rlc3Ryb3lDYWxsYmFjayhDUllQVE9fZHlubG9ja192YWx1ZSogbCwKKyAgICAgIGNvbnN0KGNoYXIpKiBmaWxlLCBpbnQgbGluZSkKKyAgICB7CisgICAgICBHQy5yZW1vdmVSYW5nZShsKTsKKyAgICAgIGRlc3Ryb3koY2FzdChNdXRleClsKTsKKyAgICAgIGZyZWUobCk7CisgICAgfQorCisgICAgaW50IHBhc3N3b3JkQ2FsbGJhY2soY2hhciogcGFzc3dvcmQsIGludCBzaXplLCBpbnQsIHZvaWQqIGRhdGEpIG5vdGhyb3cgeworICAgICAgYXV0byBjb250ZXh0ID0gY2FzdChUU1NMQ29udGV4dCkgZGF0YTsKKyAgICAgIGF1dG8gdXNlclBhc3N3b3JkID0gY29udGV4dC5nZXRQYXNzd29yZChzaXplKTsKKyAgICAgIGF1dG8gbGVuID0gdXNlclBhc3N3b3JkLmxlbmd0aDsKKyAgICAgIGlmIChsZW4gPiBzaXplKSB7CisgICAgICAgIGxlbiA9IHNpemU7CisgICAgICB9CisgICAgICBwYXNzd29yZFswIC4uIGxlbl0gPSB1c2VyUGFzc3dvcmRbMCAuLiBsZW5dOyAvLyBUT0RPOiBcMCBoYW5kbGluZyBjb3JyZWN0PworICAgICAgcmV0dXJuIGNhc3QoaW50KWxlbjsKKyAgICB9CisgIH0KKworICBzdGF0aWMgX19nc2hhcmVkIGJvb2wgaW5pdGlhbGl6ZWRfOworICBzdGF0aWMgX19nc2hhcmVkIE11dGV4IGluaXRNdXRleF87CisgIHN0YXRpYyBfX2dzaGFyZWQgTXV0ZXhbXSBtdXRleGVzXzsKKyAgc3RhdGljIF9fZ3NoYXJlZCB1aW50IGNvdW50XzsKK30KKworLyoqCisgKiBEZWNpZGVzIHdoZXRoZXIgYSByZW1vdGUgaG9zdCBpcyBsZWdpdGltYXRlIG9yIG5vdC4KKyAqCisgKiBJdCBpcyB1c3VhbGx5IHNldCBhdCBhIFRTU0xDb250ZXh0LCB3aGljaCB0aGVuIHBhc3NlcyBpdCB0byBhbGwgdGhlIGNyZWF0ZWQKKyAqIFRTU0xTb2NrZXRzLgorICovCitjbGFzcyBUQWNjZXNzTWFuYWdlciB7CisgIC8vLworICBlbnVtIERlY2lzaW9uIHsKKyAgICBERU5ZID0gLTEsIC8vLyBEZW55IGFjY2Vzcy4KKyAgICBTS0lQID0gIDAsIC8vLyBDYW5ub3QgZGVjaWRlLCBtb3ZlIG9uIHRvIG5leHQgY2hlY2sgKGRlbnkgaWYgbGFzdCkuCisgICAgQUxMT1cgPSAxICAvLy8gQWxsb3cgYWNjZXNzLgorICB9CisKKyAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciBhIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdCBiYXNlZCBvbiBpdHMKKyAgICogSVAgYWRkcmVzcy4KKyAgICoKKyAgICogQ2FsbGVkIG9uY2UgYWZ0ZXIgU1NMIGhhbmRzaGFrZSBpcyBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IGFuZCBiZWZvcmUgcGVlcgorICAgKiBjZXJ0aWZpY2F0ZSBpcyBleGFtaW5lZC4KKyAgICoKKyAgICogSWYgYSB2YWxpZCBkZWNpc2lvbiAoQUxMT1cgb3IgREVOWSkgaXMgcmV0dXJuZWQsIHRoZSBwZWVyIGNlcnRpZmljYXRlCisgICAqIHdpbGwgbm90IGJlIHZlcmlmaWVkLgorICAgKi8KKyAgRGVjaXNpb24gdmVyaWZ5KEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiBEZWNpc2lvbi5ERU5ZOworICB9CisKKyAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciBhIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdCBiYXNlZCBvbiBhCisgICAqIG5hbWUgZnJvbSBpdHMgY2VydGlmaWNhdGUuCisgICAqCisgICAqIENhbGxlZCBldmVyeSB0aW1lIGEgRE5TIHN1YmplY3RBbHROYW1lL2NvbW1vbiBuYW1lIGlzIGV4dHJhY3RlZCBmcm9tIHRoZQorICAgKiBwZWVyJ3MgY2VydGlmaWNhdGUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBob3N0ID0gVGhlIGFjdHVhbCBob3N0IG5hbWUgc3RyaW5nIGZyb20gdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgKiAgIGNlcnRIb3N0ID0gQSBob3N0IG5hbWUgc3RyaW5nIGZyb20gdGhlIGNlcnRpZmljYXRlLgorICAgKi8KKyAgRGVjaXNpb24gdmVyaWZ5KHN0cmluZyBob3N0LCBjb25zdChjaGFyKVtdIGNlcnRIb3N0KSB7CisgICAgcmV0dXJuIERlY2lzaW9uLkRFTlk7CisgIH0KKworICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcGVlciBzaG91bGQgYmUgZ3JhbnRlZCBhY2Nlc3Mgb3Igbm90IGJhc2VkIG9uIGFuIElQCisgICAqIGFkZHJlc3MgZnJvbSBpdHMgY2VydGlmaWNhdGUuCisgICAqCisgICAqIENhbGxlZCBldmVyeSB0aW1lIGFuIElQIHN1YmplY3RBbHROYW1lIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBwZWVyJ3MKKyAgICogY2VydGlmaWNhdGUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBhZGRyZXNzID0gVGhlIGFjdHVhbCBhZGRyZXNzIGZyb20gdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgKiAgIGNlcnRIb3N0ID0gQSBob3N0IG5hbWUgc3RyaW5nIGZyb20gdGhlIGNlcnRpZmljYXRlLgorICAgKi8KKyAgRGVjaXNpb24gdmVyaWZ5KEFkZHJlc3MgYWRkcmVzcywgdWJ5dGVbXSBjZXJ0QWRkcmVzcykgeworICAgIHJldHVybiBEZWNpc2lvbi5ERU5ZOworICB9Cit9CisKKy8qKgorICogRGVmYXVsdCBhY2Nlc3MgbWFuYWdlciBpbXBsZW1lbnRhdGlvbiwgd2hpY2gganVzdCBjaGVja3MgdGhlIGhvc3QgbmFtZQorICogcmVzcC4gSVAgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbiBhZ2FpbnN0IHRoZSBjZXJ0aWZpY2F0ZS4KKyAqLworY2xhc3MgVERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyIDogVEFjY2Vzc01hbmFnZXIgeworICBvdmVycmlkZSBEZWNpc2lvbiB2ZXJpZnkoQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIERlY2lzaW9uLlNLSVA7CisgIH0KKworICBvdmVycmlkZSBEZWNpc2lvbiB2ZXJpZnkoc3RyaW5nIGhvc3QsIGNvbnN0KGNoYXIpW10gY2VydEhvc3QpIHsKKyAgICBpZiAoaG9zdC5lbXB0eSB8fCBjZXJ0SG9zdC5lbXB0eSkgeworICAgICAgcmV0dXJuIERlY2lzaW9uLlNLSVA7CisgICAgfQorICAgIHJldHVybiAobWF0Y2hOYW1lKGhvc3QsIGNlcnRIb3N0KSA/IERlY2lzaW9uLkFMTE9XIDogRGVjaXNpb24uU0tJUCk7CisgIH0KKworICBvdmVycmlkZSBEZWNpc2lvbiB2ZXJpZnkoQWRkcmVzcyBhZGRyZXNzLCB1Ynl0ZVtdIGNlcnRBZGRyZXNzKSB7CisgICAgYm9vbCBtYXRjaDsKKyAgICBpZiAoY2VydEFkZHJlc3MubGVuZ3RoID09IDQpIHsKKyAgICAgIGlmIChhdXRvIGlhID0gY2FzdChJbnRlcm5ldEFkZHJlc3MpYWRkcmVzcykgeworICAgICAgICBtYXRjaCA9ICgoY2FzdCh1Ynl0ZSopaWEuYWRkcigpKVswIC4uIDRdID09IGNlcnRBZGRyZXNzW10pOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2VydEFkZHJlc3MubGVuZ3RoID09IDE2KSB7CisgICAgICBpZiAoYXV0byBpYSA9IGNhc3QoSW50ZXJuZXQ2QWRkcmVzcylhZGRyZXNzKSB7CisgICAgICAgIG1hdGNoID0gKGlhLmFkZHIoKSA9PSBjZXJ0QWRkcmVzc1tdKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChtYXRjaCA/IERlY2lzaW9uLkFMTE9XIDogRGVjaXNpb24uU0tJUCk7CisgIH0KK30KKworcHJpdmF0ZSB7CisgIC8qKgorICAgKiBNYXRjaGVzIGEgbmFtZSB3aXRoIGEgcGF0dGVybi4gVGhlIHBhdHRlcm4gbWF5IGluY2x1ZGUgd2lsZGNhcmQuIEEgc2luZ2xlCisgICAqIHdpbGRjYXJkICIqIiBjYW4gbWF0Y2ggdXAgdG8gb25lIGNvbXBvbmVudCBpbiB0aGUgZG9tYWluIG5hbWUuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBob3N0ID0gSG9zdCBuYW1lIHRvIG1hdGNoLCB0eXBpY2FsbHkgdGhlIFNTTCByZW1vdGUgcGVlci4KKyAgICogICBwYXR0ZXJuID0gSG9zdCBuYW1lIHBhdHRlcm4sIHR5cGljYWxseSBmcm9tIHRoZSBTU0wgY2VydGlmaWNhdGUuCisgICAqCisgICAqIFJldHVybnM6IHRydWUgaWYgaG9zdCBtYXRjaGVzIHBhdHRlcm4sIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIGJvb2wgbWF0Y2hOYW1lKGNvbnN0KGNoYXIpW10gaG9zdCwgY29uc3QoY2hhcilbXSBwYXR0ZXJuKSB7CisgICAgd2hpbGUgKCFob3N0LmVtcHR5ICYmICFwYXR0ZXJuLmVtcHR5KSB7CisgICAgICBpZiAodG9VcHBlcihwYXR0ZXJuLmZyb250KSA9PSB0b1VwcGVyKGhvc3QuZnJvbnQpKSB7CisgICAgICAgIGhvc3QucG9wRnJvbnQ7CisgICAgICAgIHBhdHRlcm4ucG9wRnJvbnQ7CisgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uZnJvbnQgPT0gJyonKSB7CisgICAgICAgIHdoaWxlICghaG9zdC5lbXB0eSAmJiBob3N0LmZyb250ICE9ICcuJykgeworICAgICAgICAgIGhvc3QucG9wRnJvbnQ7CisgICAgICAgIH0KKyAgICAgICAgcGF0dGVybi5wb3BGcm9udDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGhvc3QuZW1wdHkgJiYgcGF0dGVybi5lbXB0eSk7CisgIH0KKworICB1bml0dGVzdCB7CisgICAgZW5mb3JjZShtYXRjaE5hbWUoInRocmlmdC5hcGFjaGUub3JnIiwgIiouYXBhY2hlLm9yZyIpKTsKKyAgICBlbmZvcmNlKCFtYXRjaE5hbWUoInRocmlmdC5hcGFjaGUub3JnIiwgImFwYWNoZS5vcmciKSk7CisgICAgZW5mb3JjZShtYXRjaE5hbWUoInRocmlmdC5hcGFjaGUub3JnIiwgInRocmlmdC4qLioiKSk7CisgICAgZW5mb3JjZShtYXRjaE5hbWUoIiIsICIiKSk7CisgICAgZW5mb3JjZSghbWF0Y2hOYW1lKCIiLCAiKiIpKTsKKyAgfQorfQorCisvKioKKyAqIFNTTC1sZXZlbCBleGNlcHRpb24uCisgKi8KK2NsYXNzIFRTU0xFeGNlcHRpb24gOiBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgLy8vCisgIHRoaXMoc3RyaW5nIG1zZywgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5JTlRFUk5BTF9FUlJPUiwgZmlsZSwgbGluZSwgbmV4dCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3psaWIuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3psaWIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk2ZjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvemxpYi5kCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZSB0aHJpZnQudHJhbnNwb3J0LnpsaWI7CisKK2ltcG9ydCBjb3JlLmJpdG9wIDogYnN3YXA7CitpbXBvcnQgZXRjLmMuemxpYjsKK2ltcG9ydCBzdGQuYWxnb3JpdGhtIDogbWluOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworCisvKioKKyAqIHpsaWIgdHJhbnNwb3J0LiBDb21wcmVzc2VzIChkZWZsYXRlcykgZGF0YSBiZWZvcmUgd3JpdGluZyBpdCB0byB0aGUKKyAqIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBhbmQgZGVjb21wcmVzc2VzIChpbmZsYXRlcykgaXQgYWZ0ZXIgcmVhZGluZy4KKyAqLworZmluYWwgY2xhc3MgVFpsaWJUcmFuc3BvcnQgOiBUQmFzZVRyYW5zcG9ydCB7CisgIC8vIFRoZXNlIGRlZmF1bHRzIGhhdmUgeWV0IHRvIGJlIG9wdGltaXplZC4KKyAgZW51bSBERUZBVUxUX1VSQlVGX1NJWkUgPSAxMjg7CisgIGVudW0gREVGQVVMVF9DUkJVRl9TSVpFID0gMTAyNDsKKyAgZW51bSBERUZBVUxUX1VXQlVGX1NJWkUgPSAxMjg7CisgIGVudW0gREVGQVVMVF9DV0JVRl9TSVpFID0gMTAyNDsKKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyB6bGliIHRyYW5zcG9ydC4KKyAgICoKKyAgICogUGFyYW1zOgorICAgKiAgIHRyYW5zcG9ydCA9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB3cmFwLgorICAgKiAgIHVyYnVmU2l6ZSA9IFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgcmVhZGluZyBidWZmZXIsIGluIGJ5dGVzLgorICAgKiAgIGNyYnVmU2l6ZSA9IFRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIHJlYWRpbmcgYnVmZmVyLCBpbiBieXRlcy4KKyAgICogICB1d2J1ZlNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIHdyaXRpbmcgYnVmZmVyLCBpbiBieXRlcy4KKyAgICogICBjd2J1ZlNpemUgPSBUaGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCB3cml0aW5nIGJ1ZmZlciwgaW4gYnl0ZXMuCisgICAqLworICB0aGlzKAorICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgIHNpemVfdCB1cmJ1ZlNpemUgPSBERUZBVUxUX1VSQlVGX1NJWkUsCisgICAgc2l6ZV90IGNyYnVmU2l6ZSA9IERFRkFVTFRfQ1JCVUZfU0laRSwKKyAgICBzaXplX3QgdXdidWZTaXplID0gREVGQVVMVF9VV0JVRl9TSVpFLAorICAgIHNpemVfdCBjd2J1ZlNpemUgPSBERUZBVUxUX0NXQlVGX1NJWkUKKyAgKSB7CisgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKworICAgIGVuZm9yY2UodXdidWZTaXplID49IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJUWkxpYlRyYW5zcG9ydDogdW5jb21wcmVzc2VkIHdyaXRlIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0ICIgfgorICAgICAgdG8hc3RyaW5nKE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB+ICJieXRlcyBpbiBzaXplLiIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKworICAgIHVyYnVmXyA9IG5ldyB1Ynl0ZVt1cmJ1ZlNpemVdOworICAgIGNyYnVmXyA9IG5ldyB1Ynl0ZVtjcmJ1ZlNpemVdOworICAgIHV3YnVmXyA9IG5ldyB1Ynl0ZVt1d2J1ZlNpemVdOworICAgIGN3YnVmXyA9IG5ldyB1Ynl0ZVtjd2J1ZlNpemVdOworCisgICAgcnN0cmVhbV8gPSBuZXcgel9zdHJlYW07CisgICAgcnN0cmVhbV8ubmV4dF9pbiA9IGNyYnVmXy5wdHI7CisgICAgcnN0cmVhbV8uYXZhaWxfaW4gID0gMDsKKyAgICByc3RyZWFtXy5uZXh0X291dCA9IHVyYnVmXy5wdHI7CisgICAgcnN0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludCh1cmJ1Zl8ubGVuZ3RoKTsKKworICAgIHdzdHJlYW1fID0gbmV3IHpfc3RyZWFtOworICAgIHdzdHJlYW1fLm5leHRfaW4gPSB1d2J1Zl8ucHRyOworICAgIHdzdHJlYW1fLmF2YWlsX2luID0gMDsKKyAgICB3c3RyZWFtXy5uZXh0X291dCA9IGN3YnVmXy5wdHI7CisgICAgd3N0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludChjcmJ1Zl8ubGVuZ3RoKTsKKworICAgIHpsaWJFbmZvcmNlKGluZmxhdGVJbml0KHJzdHJlYW1fKSwgcnN0cmVhbV8pOworICAgIHNjb3BlIChmYWlsdXJlKSB7CisgICAgICB6bGliTG9nRXJyb3IoaW5mbGF0ZUVuZChyc3RyZWFtXyksIHJzdHJlYW1fKTsKKyAgICB9CisKKyAgICB6bGliRW5mb3JjZShkZWZsYXRlSW5pdCh3c3RyZWFtXywgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSwgd3N0cmVhbV8pOworICB9CisKKyAgfnRoaXMoKSB7CisgICAgemxpYkxvZ0Vycm9yKGluZmxhdGVFbmQocnN0cmVhbV8pLCByc3RyZWFtXyk7CisKKyAgICBhdXRvIHJlc3VsdCA9IGRlZmxhdGVFbmQod3N0cmVhbV8pOworICAgIC8vIFpfREFUQV9FUlJPUiBtYXkgaW5kaWNhdGUgdW5mbHVzaGVkIGRhdGEsIHNvIGp1c3QgaWdub3JlIGl0LgorICAgIGlmIChyZXN1bHQgIT0gWl9EQVRBX0VSUk9SKSB7CisgICAgICB6bGliTG9nRXJyb3IocmVzdWx0LCB3c3RyZWFtXyk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHdyYXBwZWQgdHJhbnNwb3J0LgorICAgKi8KKyAgVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdHJhbnNwb3J0XzsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgaXNPcGVuKCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcmVhZEF2YWlsID4gMCB8fCB0cmFuc3BvcnRfLmlzT3BlbjsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgcGVlaygpIHsKKyAgICByZXR1cm4gcmVhZEF2YWlsID4gMCB8fCB0cmFuc3BvcnRfLnBlZWsoKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgb3BlbigpIHsKKyAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CisgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IHJlYWQodWJ5dGVbXSBidWYpIHsKKyAgICAvLyBUaGUgQysrIGltcGxlbWVudGF0aW9uIHN1Z2dlc3RzIHRvIHNraXAgdXJidWYgb24gYmlnIHJlYWRzIGluIGZ1dHVyZQorICAgIC8vIHZlcnNpb25zLCB3ZSB3b3VsZCBiZW5lZml0IGZyb20gaXQgYXMgd2VsbC4KKyAgICBhdXRvIG9yaWdMZW4gPSBidWYubGVuZ3RoOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIGdpdmUgPSBtaW4ocmVhZEF2YWlsLCBidWYubGVuZ3RoKTsKKworICAgICAgLy8gSWYgc3RkLnJhbmdlLnB1dCB3YXMgb3B0aW1pemVkIGZvciBzbGljYWJsZSByYW5nZXMsIGl0IGNvdWxkIGJlIHVzZWQKKyAgICAgIC8vIGhlcmUgYXMgd2VsbC4KKyAgICAgIGJ1ZlswIC4uIGdpdmVdID0gdXJidWZfW3VycG9zXyAuLiB1cnBvc18gKyBnaXZlXTsKKyAgICAgIGJ1ZiA9IGJ1ZltnaXZlIC4uICRdOworICAgICAgdXJwb3NfICs9IGdpdmU7CisKKyAgICAgIGF1dG8gbmVlZCA9IGJ1Zi5sZW5ndGg7CisgICAgICBpZiAobmVlZCA9PSAwKSB7CisgICAgICAgIC8vIFdlIGNvdWxkIG1hbmFnZSB0byBnZXQgdGhlIGFsbCB0aGUgZGF0YSByZXF1ZXN0ZWQuCisgICAgICAgIHJldHVybiBvcmlnTGVuOworICAgICAgfQorCisgICAgICBpZiAoaW5wdXRFbmRlZF8gfHwgKG5lZWQgPCBvcmlnTGVuICYmIHJzdHJlYW1fLmF2YWlsX2luID09IDApKSB7CisgICAgICAgIC8vIFdlIGRpZG4ndCBmaWxsIGJ1ZiBjb21wbGV0ZWx5LCBidXQgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4KKyAgICAgICAgcmV0dXJuIG9yaWdMZW4gLSBuZWVkOworICAgICAgfQorCisgICAgICAvLyBSZWZpbGwgb3VyIGJ1ZmZlciBieSByZWFkaW5nIG1vcmUgZGF0YSB0aHJvdWdoIHpsaWIuCisgICAgICByc3RyZWFtXy5uZXh0X291dCA9IHVyYnVmXy5wdHI7CisgICAgICByc3RyZWFtXy5hdmFpbF9vdXQgPSB0byF1aW50KHVyYnVmXy5sZW5ndGgpOworICAgICAgdXJwb3NfID0gMDsKKworICAgICAgaWYgKCFyZWFkRnJvbVpsaWIoKSkgeworICAgICAgICAvLyBDb3VsZG4ndCBnZXQgbW9yZSBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAgICByZXR1cm4gb3JpZ0xlbiAtIG5lZWQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB3cml0ZShpbiB1Ynl0ZVtdIGJ1ZikgeworICAgIGVuZm9yY2UoIW91dHB1dEZpbmlzaGVkXywgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAid3JpdGUoKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKworICAgIGF1dG8gbGVuID0gYnVmLmxlbmd0aDsKKyAgICBpZiAobGVuID4gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkUpIHsKKyAgICAgIGZsdXNoVG9abGliKHV3YnVmX1swIC4uIHV3cG9zX10sIFpfTk9fRkxVU0gpOworICAgICAgdXdwb3NfID0gMDsKKyAgICAgIGZsdXNoVG9abGliKGJ1ZiwgWl9OT19GTFVTSCk7CisgICAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CisgICAgICBpZiAodXdidWZfLmxlbmd0aCAtIHV3cG9zXyA8IGxlbikgeworICAgICAgICBmbHVzaFRvWmxpYih1d2J1Zl9bMCAuLiB1d3Bvc19dLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgdXdwb3NfID0gMDsKKyAgICAgIH0KKyAgICAgIHV3YnVmX1t1d3Bvc18gLi4gdXdwb3NfICsgbGVuXSA9IGJ1ZltdOworICAgICAgdXdwb3NfICs9IGxlbjsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGZsdXNoKCkgeworICAgIGVuZm9yY2UoIW91dHB1dEZpbmlzaGVkXywgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAiZmx1c2goKSBjYWxsZWQgYWZ0ZXIgZmluaXNoKCkiLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKworICAgIGZsdXNoVG9UcmFuc3BvcnQoWl9TWU5DX0ZMVVNIKTsKKyAgfQorCisgIG92ZXJyaWRlIGNvbnN0KHVieXRlKVtdIGJvcnJvdyh1Ynl0ZSogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgaWYgKGxlbiA8PSByZWFkQXZhaWwpIHsKKyAgICAgIHJldHVybiB1cmJ1Zl9bdXJwb3NfIC4uICRdOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgY29uc3VtZShzaXplX3QgbGVuKSB7CisgICAgZW5mb3JjZShyZWFkQXZhaWwgPj0gbGVuLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJjb25zdW1lKCkgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3coKS4iLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpKTsKKyAgICB1cnBvc18gKz0gbGVuOworICB9CisKKyAgLyoqCisgICAqIEZpbmFsaXplIHRoZSB6bGliIHN0cmVhbS4KKyAgICoKKyAgICogVGhpcyBjYXVzZXMgemxpYiB0byBmbHVzaCBhbnkgcGVuZGluZyB3cml0ZSBkYXRhIGFuZCB3cml0ZSBlbmQtb2Ytc3RyZWFtCisgICAqIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGNoZWNrc3VtLiAgT25jZSBmaW5pc2goKSBoYXMgYmVlbiBjYWxsZWQsIG5vCisgICAqIG5ldyBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0uCisgICAqLworICB2b2lkIGZpbmlzaCgpIHsKKyAgICBlbmZvcmNlKCFvdXRwdXRGaW5pc2hlZF8sIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgImZsdXNoKCkgY2FsbGVkIG9uIGFscmVhZHkgZmluaXNoZWQgVFpsaWJUcmFuc3BvcnQiLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkJBRF9BUkdTKSk7CisgICAgZmx1c2hUb1RyYW5zcG9ydChaX0ZJTklTSCk7CisgIH0KKworICAvKioKKyAgICogVmVyaWZ5IHRoZSBjaGVja3N1bSBhdCB0aGUgZW5kIG9mIHRoZSB6bGliIHN0cmVhbSAoYnkgZmluaXNoKCkpLgorICAgKgorICAgKiBNYXkgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGRhdGEgaGFzIGJlZW4gcmVhZC4KKyAgICoKKyAgICogVGhyb3dzOiBUVHJhbnNwb3J0RXhjZXB0aW9uIHdoZW4gdGhlIGNoZWNrc3VtIGlzIGNvcnJ1cHRlZCBvciB0aGVyZSBpcworICAgKiAgIHN0aWxsIHVucmVhZCBkYXRhIGxlZnQuCisgICAqLworICB2b2lkIHZlcmlmeUNoZWNrc3VtKCkgeworICAgIC8vIElmIHpsaWIgaGFzIGFscmVhZHkgcmVwb3J0ZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCB0aGUgY2hlY2tzdW0gaGFzCisgICAgLy8gYmVlbiB2ZXJpZmllZCwgbm8uCisgICAgaWYgKGlucHV0RW5kZWRfKSByZXR1cm47CisKKyAgICBlbmZvcmNlKCFyZWFkQXZhaWwsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgInZlcmlmeUNoZWNrc3VtKCkgY2FsbGVkIGJlZm9yZSBlbmQgb2YgemxpYiBzdHJlYW0iLAorICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkNPUlJVUFRFRF9EQVRBKSk7CisKKyAgICByc3RyZWFtXy5uZXh0X291dCA9IHVyYnVmXy5wdHI7CisgICAgcnN0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludCh1cmJ1Zl8ubGVuZ3RoKTsKKyAgICB1cnBvc18gPSAwOworCisgICAgLy8gcmVhZEZyb21abGliKCkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNoZWNrc3VtIGlzIGJhZC4KKyAgICBlbmZvcmNlKHJlYWRGcm9tWmxpYigpLCBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICJjaGVja3N1bSBub3QgYXZhaWxhYmxlIHlldCBpbiB2ZXJpZnlDaGVja3N1bSgpIiwKKyAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSkpOworCisgICAgZW5mb3JjZShpbnB1dEVuZGVkXywgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAidmVyaWZ5Q2hlY2tzdW0oKSBjYWxsZWQgYmVmb3JlIGVuZCBvZiB6bGliIHN0cmVhbSIsCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQ09SUlVQVEVEX0RBVEEpKTsKKworICAgIC8vIElmIHdlIGdldCBoZXJlLCB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGFuZCB0aHVzIHpsaWIgaGFzCisgICAgLy8gc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkIHRoZSBjaGVja3N1bS4KKyAgfQorCitwcml2YXRlOgorICBzaXplX3QgcmVhZEF2YWlsKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gdXJidWZfLmxlbmd0aCAtIHJzdHJlYW1fLmF2YWlsX291dCAtIHVycG9zXzsKKyAgfQorCisgIGJvb2wgcmVhZEZyb21abGliKCkgeworICAgIGFzc2VydCghaW5wdXRFbmRlZF8pOworCisgICAgaWYgKHJzdHJlYW1fLmF2YWlsX2luID09IDApIHsKKyAgICAgIC8vIHpsaWIgaGFzIHVzZWQgdXAgYWxsIHRoZSBjb21wcmVzc2VkIGRhdGEgd2UgcHJvdmlkZWQgaW4gY3JidWYsIHJlYWQKKyAgICAgIC8vIHNvbWUgbW9yZSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgIGF1dG8gZ290ID0gdHJhbnNwb3J0Xy5yZWFkKGNyYnVmXyk7CisgICAgICBpZiAoZ290ID09IDApIHJldHVybiBmYWxzZTsKKyAgICAgIHJzdHJlYW1fLm5leHRfaW4gPSBjcmJ1Zl8ucHRyOworICAgICAgcnN0cmVhbV8uYXZhaWxfaW4gPSB0byF1aW50KGdvdCk7CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSBzb21lIGNvbXByZXNzZWQgZGF0YSBub3csIHVuY29tcHJlc3MgaXQuCisgICAgYXV0byB6bGliX3Jlc3VsdCA9IGluZmxhdGUocnN0cmVhbV8sIFpfU1lOQ19GTFVTSCk7CisgICAgaWYgKHpsaWJfcmVzdWx0ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgaW5wdXRFbmRlZF8gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICB6bGliRW5mb3JjZSh6bGliX3Jlc3VsdCwgcnN0cmVhbV8pOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCBmbHVzaFRvVHJhbnNwb3J0KGludCB0eXBlKSAgeworICAgIC8vIENvbXByZXNzIHJlbWFpbmluZyBkYXRhIGluIHV3YnVmXyB0byBjd2J1Zl8uCisgICAgZmx1c2hUb1psaWIodXdidWZfWzAgLi4gdXdwb3NfXSwgdHlwZSk7CisgICAgdXdwb3NfID0gMDsKKworICAgIC8vIFdyaXRlIGFsbCBjb21wcmVzc2VkIGRhdGEgdG8gdGhlIHRyYW5zcG9ydC4KKyAgICB0cmFuc3BvcnRfLndyaXRlKGN3YnVmX1swIC4uICQgLSB3c3RyZWFtXy5hdmFpbF9vdXRdKTsKKyAgICB3c3RyZWFtXy5uZXh0X291dCA9IGN3YnVmXy5wdHI7CisgICAgd3N0cmVhbV8uYXZhaWxfb3V0ID0gdG8hdWludChjd2J1Zl8ubGVuZ3RoKTsKKworICAgIC8vIEZsdXNoIHRoZSB0cmFuc3BvcnQuCisgICAgdHJhbnNwb3J0Xy5mbHVzaCgpOworICB9CisKKyAgdm9pZCBmbHVzaFRvWmxpYihpbiB1Ynl0ZVtdIGJ1ZiwgaW50IHR5cGUpIHsKKyAgICB3c3RyZWFtXy5uZXh0X2luID0gY2FzdCh1Ynl0ZSopYnVmLnB0cjsgLy8gemxpYiBvbmx5IHJlYWRzLCBjYXN0IGlzIHNhZmUuCisgICAgd3N0cmVhbV8uYXZhaWxfaW4gPSB0byF1aW50KGJ1Zi5sZW5ndGgpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICh0eXBlID09IFpfTk9fRkxVU0ggJiYgd3N0cmVhbV8uYXZhaWxfaW4gPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHdzdHJlYW1fLmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgIC8vIGN3YnVmIGhhcyBiZWVuIGV4aGF1c3RlZCBieSB6bGliLCBmbHVzaCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICAgIHRyYW5zcG9ydF8ud3JpdGUoY3didWZfKTsKKyAgICAgICAgd3N0cmVhbV8ubmV4dF9vdXQgPSBjd2J1Zl8ucHRyOworICAgICAgICB3c3RyZWFtXy5hdmFpbF9vdXQgPSB0byF1aW50KGN3YnVmXy5sZW5ndGgpOworICAgICAgfQorCisgICAgICBhdXRvIHpsaWJfcmVzdWx0ID0gZGVmbGF0ZSh3c3RyZWFtXywgdHlwZSk7CisKKyAgICAgIGlmICh0eXBlID09IFpfRklOSVNIICYmIHpsaWJfcmVzdWx0ID09IFpfU1RSRUFNX0VORCkgeworICAgICAgICBhc3NlcnQod3N0cmVhbV8uYXZhaWxfaW4gPT0gMCk7CisgICAgICAgIG91dHB1dEZpbmlzaGVkXyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB6bGliRW5mb3JjZSh6bGliX3Jlc3VsdCwgd3N0cmVhbV8pOworCisgICAgICBpZiAoKHR5cGUgPT0gWl9TWU5DX0ZMVVNIIHx8IHR5cGUgPT0gWl9GVUxMX0ZMVVNIKSAmJgorICAgICAgICAgIHdzdHJlYW1fLmF2YWlsX2luID09IDAgJiYgd3N0cmVhbV8uYXZhaWxfb3V0ICE9IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgemxpYkVuZm9yY2UoaW50IHN0YXR1cywgel9zdHJlYW0qIHN0cmVhbSkgeworICAgIGlmIChzdGF0dXMgIT0gWl9PSykgeworICAgICAgdGhyb3cgbmV3IFRabGliRXhjZXB0aW9uKHN0YXR1cywgc3RyZWFtLm1zZyk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgemxpYkxvZ0Vycm9yKGludCBzdGF0dXMsIHpfc3RyZWFtKiBzdHJlYW0pIHsKKyAgICBpZiAoc3RhdHVzICE9IFpfT0spIHsKKyAgICAgIGxvZ0Vycm9yKCJUWmxpYlRyYW5zcG9ydDogemxpYiBmYWlsdXJlIGluIGRlc3RydWN0b3I6ICVzIiwKKyAgICAgICAgVFpsaWJFeGNlcHRpb24uZXJyb3JNZXNzYWdlKHN0YXR1cywgc3RyZWFtLm1zZykpOworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlcyBzbWFsbGVyIHRoYW4gdGhpcyBhcmUgYnVmZmVyZWQgdXAgKGR1ZSB0byB6bGliIGhhbmRsaW5nIG92ZXJoZWFkKS4KKyAgLy8gTGFyZ2VyIChvciBlcXVhbCkgd3JpdGVzIGFyZSBkdW1wZWQgc3RyYWlnaHQgdG8gemxpYi4KKyAgZW51bSBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSA9IDMyOworCisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0XzsKKyAgel9zdHJlYW0qIHJzdHJlYW1fOworICB6X3N0cmVhbSogd3N0cmVhbV87CisKKyAgLy8vIFdoZXRoZXIgemxpYiBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgIGJvb2wgaW5wdXRFbmRlZF87CisKKyAgLy8vIFdoZXRoZXIgdGhlIG91dHB1dCBzdHJlYW0gd2FzIGFscmVhZHkgZmluaXNoKCllZC4KKyAgYm9vbCBvdXRwdXRGaW5pc2hlZF87CisKKyAgLy8vIENvbXByZXNzZWQgaW5wdXQgZGF0YSBidWZmZXIuCisgIHVieXRlW10gY3JidWZfOworCisgIC8vLyBVbmNvbXByZXNzZWQgaW5wdXQgZGF0YSBidWZmZXIuCisgIHVieXRlW10gdXJidWZfOworICBzaXplX3QgdXJwb3NfOworCisgIC8vLyBVbmNvbXByZXNzZWQgb3V0cHV0IGRhdGEgYnVmZmVyICh3aGVyZSBzbWFsbCB3cml0ZXMgYXJlIGFjY3VtdWxhdGVkCisgIC8vLyBiZWZvcmUgaGFuZGluZyBvdmVyIHRvIHpsaWIpLgorICB1Ynl0ZVtdIHV3YnVmXzsKKyAgc2l6ZV90IHV3cG9zXzsKKworICAvLy8gQ29tcHJlc3NlZCBvdXRwdXQgZGF0YSBidWZmZXIgKGZpbGxlZCBieSB6bGliLCB3ZSBmbHVzaCBpdCB0byB0aGUKKyAgLy8vIHVuZGVybHlpbmcgdHJhbnNwb3J0KS4KKyAgdWJ5dGVbXSBjd2J1Zl87Cit9CisKKy8qKgorICogV3JhcHMgZ2l2ZW4gdHJhbnNwb3J0cyBpbnRvIFRabGliVHJhbnNwb3J0cy4KKyAqLworYWxpYXMgVFdyYXBwZXJUcmFuc3BvcnRGYWN0b3J5IVRabGliVHJhbnNwb3J0IFRabGliVHJhbnNwb3J0RmFjdG9yeTsKKworLyoqCisgKiBBbiBJTlRFUk5BTF9FUlJPUi10eXBlIFRUcmFuc3BvcnRFeGNlcHRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBlcnJvcgorICogc2lnbmFsZWQgYnkgemxpYi4KKyAqLworY2xhc3MgVFpsaWJFeGNlcHRpb24gOiBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgdGhpcyhpbnQgc3RhdHVzQ29kZSwgY29uc3QoY2hhcikqIG1zZykgeworICAgIHN1cGVyKGVycm9yTWVzc2FnZShzdGF0dXNDb2RlLCBtc2cpLCBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuSU5URVJOQUxfRVJST1IpOworICAgIHpsaWJTdGF0dXNDb2RlID0gc3RhdHVzQ29kZTsKKyAgICB6bGliTXNnID0gbXNnID8gdG8hc3RyaW5nKG1zZykgOiAiKG51bGwpIjsKKyAgfQorCisgIGludCB6bGliU3RhdHVzQ29kZTsKKyAgc3RyaW5nIHpsaWJNc2c7CisKKyAgc3RhdGljIHN0cmluZyBlcnJvck1lc3NhZ2UoaW50IHN0YXR1c0NvZGUsIGNvbnN0KGNoYXIpKiBtc2cpIHsKKyAgICBzdHJpbmcgcmVzdWx0ID0gInpsaWIgZXJyb3I6ICI7CisKKyAgICBpZiAobXNnKSB7CisgICAgICByZXN1bHQgfj0gdG8hc3RyaW5nKG1zZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCB+PSAiKG5vIG1lc3NhZ2UpIjsKKyAgICB9CisKKyAgICByZXN1bHQgfj0gIiAoc3RhdHVzIGNvZGUgPSAiIH4gdG8hc3RyaW5nKHN0YXR1c0NvZGUpIH4gIikiOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKwordmVyc2lvbiAodW5pdHRlc3QpIHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBjb2xsZWN0RXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7Cit9CisKKy8vIE1ha2Ugc3VyZSBiYXNpYyByZWFkaW5nL3dyaXRpbmcgd29ya3MuCit1bml0dGVzdCB7CisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXI7CisgIGF1dG8gemxpYiA9IG5ldyBUWmxpYlRyYW5zcG9ydChidWYpOworCisgIGltbXV0YWJsZSB1Ynl0ZVtdIGRhdGEgPSBbMSwgMiwgMywgNCwgNV07CisgIHpsaWIud3JpdGUoZGF0YSk7CisgIHpsaWIuZmluaXNoKCk7CisKKyAgYXV0byByZXN1bHQgPSBuZXcgdWJ5dGVbZGF0YS5sZW5ndGhdOworICB6bGliLnJlYWRBbGwocmVzdWx0KTsKKyAgZW5mb3JjZShkYXRhID09IHJlc3VsdCk7CisgIHpsaWIudmVyaWZ5Q2hlY2tzdW0oKTsKK30KKworLy8gTWFrZSBzdXJlIHRoZXJlIGlzIG5vIGRhdGEgaXMgd3JpdHRlbiBpZiB3cml0ZSgpIGlzIG5ldmVyIGNhbGxlZC4KK3VuaXR0ZXN0IHsKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgeworICAgIHNjb3BlIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmKTsKKyAgfQorICBlbmZvcmNlKGJ1Zi5nZXRDb250ZW50cygpLmxlbmd0aCA9PSAwKTsKK30KKworLy8gTWFrZSBzdXJlIGNhbGxpbmcgd3JpdGUoKS9mbHVzaCgpL2ZpbmlzaCgpIGFnYWluIGFmdGVyIGZpbmlzaCgpIHRocm93cy4KK3VuaXR0ZXN0IHsKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKKyAgYXV0byB6bGliID0gbmV3IFRabGliVHJhbnNwb3J0KGJ1Zik7CisKKyAgemxpYi53cml0ZShbMSwgMiwgMywgNCwgNV0pOworICB6bGliLmZpbmlzaCgpOworCisgIGF1dG8gZXggPSBjb2xsZWN0RXhjZXB0aW9uIVRUcmFuc3BvcnRFeGNlcHRpb24oemxpYi53cml0ZShbNl0pKTsKKyAgZW5mb3JjZShleCAmJiBleC50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUyk7CisKKyAgZXggPSBjb2xsZWN0RXhjZXB0aW9uIVRUcmFuc3BvcnRFeGNlcHRpb24oemxpYi5mbHVzaCgpKTsKKyAgZW5mb3JjZShleCAmJiBleC50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5CQURfQVJHUyk7CisKKyAgZXggPSBjb2xsZWN0RXhjZXB0aW9uIVRUcmFuc3BvcnRFeGNlcHRpb24oemxpYi5maW5pc2goKSk7CisgIGVuZm9yY2UoZXggJiYgZXgudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuQkFEX0FSR1MpOworfQorCisvLyBNYWtlIHN1cmUgdmVyaWZ5aW5nIHRoZSBjaGVja3N1bSB3b3JrcyBldmVuIGlmIGl0IHJlcXVpcmVzIHN0YXJ0aW5nIGEgbmV3CisvLyByZWFkaW5nIGJ1ZmZlciBhZnRlciByZWFkaW5nIHRoZSBwYXlsb2FkIGhhcyBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgordW5pdHRlc3QgeworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmKTsKKworICBpbW11dGFibGUgdWJ5dGVbXSBkYXRhID0gWzEsIDIsIDMsIDQsIDVdOworICB6bGliLndyaXRlKGRhdGEpOworICB6bGliLmZpbmlzaCgpOworCisgIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmLCBUWmxpYlRyYW5zcG9ydC5ERUZBVUxUX1VSQlVGX1NJWkUsCisgICAgYnVmLmdldENvbnRlbnRzKCkubGVuZ3RoIC0gMSk7IC8vIFRoZSBsYXN0IGJ5dGUgYmVsb25ncyB0byB0aGUgY2hlY2tzdW0uCisKKyAgYXV0byByZXN1bHQgPSBuZXcgdWJ5dGVbZGF0YS5sZW5ndGhdOworICB6bGliLnJlYWRBbGwocmVzdWx0KTsKKyAgZW5mb3JjZShkYXRhID09IHJlc3VsdCk7CisKKyAgemxpYi52ZXJpZnlDaGVja3N1bSgpOworfQorCisvLyBNYWtlIHN1cmUgdmVyaWZ5Q2hlY2tzdW0oKSB0aHJvd3MgaWYgd2UgbWVzc2VkIHdpdGggdGhlIGNoZWNrc3VtLgordW5pdHRlc3QgeworICBpbXBvcnQgc3RkLnN0ZGlvOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5yYW5nZTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBhdXRvIHpsaWIgPSBuZXcgVFpsaWJUcmFuc3BvcnQoYnVmKTsKKworICBpbW11dGFibGUgdWJ5dGVbXSBkYXRhID0gWzEsIDIsIDMsIDQsIDVdOworICB6bGliLndyaXRlKGRhdGEpOworICB6bGliLmZpbmlzaCgpOworCisgIHZvaWQgdGVzdENvcnJ1cHRlZChjb25zdCh1Ynl0ZSlbXSBjb3JydXB0ZWREYXRhKSB7CisgICAgYXV0byByZWFkZXIgPSBuZXcgVFpsaWJUcmFuc3BvcnQodElucHV0UmFuZ2VUcmFuc3BvcnQoY29ycnVwdGVkRGF0YSkpOworICAgIGF1dG8gcmVzdWx0ID0gbmV3IHVieXRlW2RhdGEubGVuZ3RoXTsKKyAgICB0cnkgeworICAgICAgcmVhZGVyLnJlYWRBbGwocmVzdWx0KTsKKworICAgICAgLy8gSWYgaXQgZG9lcyByZWFkIHdpdGhvdXQgY29tcGxhaW5pbmcsIHRoZSByZXN1bHQgc2hvdWxkIGJlIGNvcnJlY3QuCisgICAgICBlbmZvcmNlKHJlc3VsdCA9PSBkYXRhKTsKKyAgICB9IGNhdGNoIChUWmxpYkV4Y2VwdGlvbiBlKSB7fQorCisgICAgYXV0byBleCA9IGNvbGxlY3RFeGNlcHRpb24hVFRyYW5zcG9ydEV4Y2VwdGlvbihyZWFkZXIudmVyaWZ5Q2hlY2tzdW0oKSk7CisgICAgZW5mb3JjZShleCAmJiBleC50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5DT1JSVVBURURfREFUQSk7CisgIH0KKworICB0ZXN0Q29ycnVwdGVkKGJ1Zi5nZXRDb250ZW50cygpWzAgLi4gJCAtIDFdKTsKKworICBhdXRvIG1vZGlmaWVkID0gYnVmLmdldENvbnRlbnRzKCkuZHVwOworICArK21vZGlmaWVkWyQgLSAxXTsKKyAgdGVzdENvcnJ1cHRlZChtb2RpZmllZCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvYXdhaXRhYmxlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvYXdhaXRhYmxlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0MzZlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9hd2FpdGFibGUuZApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC51dGlsLmF3YWl0YWJsZTsKKworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5zb2NrZXQvKyA6IFNvY2tldCwgc29ja2V0UGFpcisvOyAvLyBETUQgQEBCVUczMTRAQAoraW1wb3J0IHRocmlmdC5iYXNlOworCisvLyBUbyBhdm9pZCBETUQgQEBCVUc2Mzk1QEAuCitpbXBvcnQgdGhyaWZ0LmludGVybmFsLmFsZ29yaXRobTsKKworLyoqCisgKiBBbiBldmVudCB0aGF0IGNhbiBvY2N1ciBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgYW5kIHdoaWNoIGNhbiBiZQorICogYXdhaXRlZCwgZWl0aGVyIGJ5IGJsb2NraW5nIHVudGlsIGl0IG9jY3Vycywgb3IgYnkgcmVnaXN0ZXJpbmcgYSBjYWxsYmFjaworICogZGVsZWdhdGUuCisgKi8KK2ludGVyZmFjZSBUQXdhaXRhYmxlIHsKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBldmVudCBvY2N1cnMuCisgICAqCisgICAqIENhbGxpbmcgd2FpdCgpIGZvciBhbiBldmVudCB0aGF0IGhhcyBhbHJlYWR5IG9jY3VycmVkIGlzIGEgbm8tb3AuCisgICAqLworICB2b2lkIHdhaXQoKTsKKworICAvKioKKyAgICogV2FpdHMgdW50aWwgdGhlIGV2ZW50IG9jY3VycyBvciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgZXhwaXJlcy4KKyAgICoKKyAgICogQ2FsbGluZyB3YWl0KCkgZm9yIGFuIGV2ZW50IHRoYXQgaGFzIGFscmVhZHkgb2NjdXJyZWQgaXMgYSBuby1vcC4KKyAgICoKKyAgICogUmV0dXJuczogV2hldGhlciB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBiZWZvcmUgdGhlIHRpbWVvdXQgZXhwaXJlZC4KKyAgICovCisgIGJvb2wgd2FpdChEdXJhdGlvbiB0aW1lb3V0KTsKKworICAvKioKKyAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgdGhlIGV2ZW50IG9jY3Vycy4KKyAgICoKKyAgICogVGhlIGRlbGVnYXRlIHdpbGwgbGlrZWx5IGJlIGludm9rZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQsIGFuZCBpcworICAgKiBleHBlY3RlZCBub3QgdG8gcGVyZm9ybSBleHBlbnNpdmUgd29yayBhcyBpdCB3aWxsIHVzdWFsbHkgYmUgaW52b2tlZAorICAgKiBzeW5jaHJvbm91c2x5IGJ5IHRoZSBub3RpZnlpbmcgdGhyZWFkLiBUaGUgb3JkZXIgaW4gd2hpY2ggcmVnaXN0ZXJlZAorICAgKiBjYWxsYmFja3MgYXJlIGludm9rZWQgaXMgbm90IHNwZWNpZmllZC4KKyAgICoKKyAgICogVGhlIGNhbGxiYWNrIG11c3QgbmV2ZXIgdGhyb3csIGJ1dCBub3Rocm93IHNlbWFudGljcyBhcmUgZGlmZmljdWx0IHRvCisgICAqIGVuZm9yY2UsIHNvIGN1cnJlbnRseSBleGNlcHRpb25zIGFyZSBqdXN0IHN3YWxsb3dlZCBieQorICAgKiBUQXdhaXRhYmxlIGltcGxlbWVudGF0aW9ucy4KKyAgICoKKyAgICogSWYgdGhlIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLCB0aGUgZGVsZWdhdGUgaXMgaW1tZWRpYXRlbHkgZXhlY3V0ZWQKKyAgICogaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgKi8KKyAgdm9pZCBhZGRDYWxsYmFjayh2b2lkIGRlbGVnYXRlKCkgZGcpOworCisgIC8qKgorICAgKiBSZW1vdmVzIGEgcHJldmlvdXNseSBhZGRlZCBjYWxsYmFjay4KKyAgICoKKyAgICogUmV0dXJuczogV2hldGhlciB0aGUgY2FsbGJhY2sgY291bGQgYmUgZm91bmQgaW4gdGhlIGxpc3QsIGkuZS4gd2hldGhlciBpdAorICAgKiAgIHdhcyBwcmV2aW91c2x5IGFkZGVkLgorICAgKi8KKyAgYm9vbCByZW1vdmVDYWxsYmFjayh2b2lkIGRlbGVnYXRlKCkgZGcpOworfQorCisvKioKKyAqIEEgc2ltcGxlIFRBd2FpdGFibGUgZXZlbnQgdHJpZ2dlcmVkIGJ5IGp1c3QgY2FsbGluZyBhIHRyaWdnZXIoKSBtZXRob2QuCisgKi8KK2NsYXNzIFRPbmVzaG90RXZlbnQgOiBUQXdhaXRhYmxlIHsKKyAgdGhpcygpIHsKKyAgICBtdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgY29uZGl0aW9uXyA9IG5ldyBDb25kaXRpb24obXV0ZXhfKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgd2FpdCgpIHsKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgd2hpbGUgKCF0cmlnZ2VyZWRfKSBjb25kaXRpb25fLndhaXQoKTsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSBib29sIHdhaXQoRHVyYXRpb24gdGltZW91dCkgeworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICBpZiAodHJpZ2dlcmVkXykgcmV0dXJuIHRydWU7CisgICAgICBjb25kaXRpb25fLndhaXQodGltZW91dCk7CisgICAgICByZXR1cm4gdHJpZ2dlcmVkXzsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSB2b2lkIGFkZENhbGxiYWNrKHZvaWQgZGVsZWdhdGUoKSBkZykgeworICAgIG11dGV4Xy5sb2NrKCk7CisgICAgc2NvcGUgKGZhaWx1cmUpIG11dGV4Xy51bmxvY2soKTsKKworICAgIGNhbGxiYWNrc18gfj0gZGc7CisKKyAgICBpZiAodHJpZ2dlcmVkXykgeworICAgICAgbXV0ZXhfLnVubG9jaygpOworICAgICAgZGcoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtdXRleF8udW5sb2NrKCk7CisgIH0KKworICBvdmVycmlkZSBib29sIHJlbW92ZUNhbGxiYWNrKHZvaWQgZGVsZWdhdGUoKSBkZykgeworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICBhdXRvIG9sZExlbmd0aCA9IGNhbGxiYWNrc18ubGVuZ3RoOworICAgICAgY2FsbGJhY2tzXyA9IHJlbW92ZUVxdWFsKGNhbGxiYWNrc18sIGRnKTsKKyAgICAgIHJldHVybiBjYWxsYmFja3NfLmxlbmd0aCA8IG9sZExlbmd0aDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVHJpZ2dlcnMgdGhlIGV2ZW50LgorICAgKgorICAgKiBBbnkgcmVnaXN0ZXJlZCBldmVudCBjYWxsYmFja3MgYXJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRoZQorICAgKiBmdW5jdGlvbiByZXR1cm5zLgorICAgKi8KKyAgdm9pZCB0cmlnZ2VyKCkgeworICAgIHN5bmNocm9uaXplZCAobXV0ZXhfKSB7CisgICAgICBpZiAoIXRyaWdnZXJlZF8pIHsKKyAgICAgICAgdHJpZ2dlcmVkXyA9IHRydWU7CisgICAgICAgIGNvbmRpdGlvbl8ubm90aWZ5QWxsKCk7CisgICAgICAgIGZvcmVhY2ggKGM7IGNhbGxiYWNrc18pIGMoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCB0cmlnZ2VyZWRfOworICBNdXRleCBtdXRleF87CisgIENvbmRpdGlvbiBjb25kaXRpb25fOworICB2b2lkIGRlbGVnYXRlKClbXSBjYWxsYmFja3NfOworfQorCisvKioKKyAqIFRyYW5zbGF0ZXMgVEF3YWl0YWJsZSBldmVudHMgaW50byBkdW1teSBtZXNzYWdlcyBvbiBhIHNvY2tldCB0aGF0IGNhbiBiZQorICogdXNlZCBlLmcuIHRvIHdha2UgdXAgZnJvbSBhIHNlbGVjdCgpIGNhbGwuCisgKi8KK2ZpbmFsIGNsYXNzIFRTb2NrZXROb3RpZmllciB7CisgIHRoaXMoKSB7CisgICAgYXV0byBzb2NrcyA9IHNvY2tldFBhaXIoKTsKKyAgICBmb3JlYWNoIChzOyBzb2Nrcykgcy5ibG9ja2luZyA9IGZhbHNlOworICAgIHNlbmRTb2NrZXRfID0gc29ja3NbMF07CisgICAgcmVjdlNvY2tldF8gPSBzb2Nrc1sxXTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgc29ja2V0IHRoZSBtZXNzYWdlcyB3aWxsIGJlIHNlbnQgdG8uCisgICAqLworICBTb2NrZXQgc29ja2V0KCkgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gcmVjdlNvY2tldF87CisgIH0KKworICAvKioKKyAgICogQXRhdGNoZXMgdGhlIHNvY2tldCBub3RpZmllciB0byB0aGUgc3BlY2lmaWVkIGF3YWl0YWJsZSwgY2F1c2luZyBpdCB0bworICAgKiB3cml0ZSBhIGJ5dGUgdG8gdGhlIG5vdGlmaWNhdGlvbiBzb2NrZXQgd2hlbiB0aGUgYXdhaXRhYmxlIGNhbGxiYWNrcyBhcmUKKyAgICogaW52b2tlZC4KKyAgICoKKyAgICogSWYgdGhlIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gdHJpZ2dlcmVkLCB0aGUgZHVtbXkgYnl0ZSBpcyB3cml0dGVuCisgICAqIGltbWVkaWF0ZWx5IHRvIHRoZSBzb2NrZXQuCisgICAqCisgICAqIEEgc29ja2V0IG5vdGlmaWVyIGNhbiBvbmx5IGJlIGF0dGFjaGVkIHRvIGEgc2luZ2xlIGF3YWl0YWJsZSBhdCBhIHRpbWUuCisgICAqCisgICAqIFRocm93czogVEV4Y2VwdGlvbiBpZiB0aGUgc29ja2V0IG5vdGlmaWVyIGlzIGFscmVhZHkgYXR0YWNoZWQuCisgICAqLworICB2b2lkIGF0dGFjaChUQXdhaXRhYmxlIGF3YWl0YWJsZSkgeworICAgIGVuZm9yY2UoIWF3YWl0YWJsZV8sIG5ldyBURXhjZXB0aW9uKCJBbHJlYWR5IGF0dGFjaGVkLiIpKTsKKyAgICBhd2FpdGFibGUuYWRkQ2FsbGJhY2soJm5vdGlmeSk7CisgICAgYXdhaXRhYmxlXyA9IGF3YWl0YWJsZTsKKyAgfQorCisgIC8qKgorICAgKiBEZXRhY2hlcyB0aGUgc29ja2V0IG5vdGlmaWVyIGZyb20gdGhlIGF3YWl0YWJsZSBpdCBpcyBjdXJyZW50bHkgYXR0YWNoZWQKKyAgICogdG8uCisgICAqCisgICAqIFRocm93czogVEV4Y2VwdGlvbiBpZiB0aGUgc29ja2V0IG5vdGlmaWVyIGlzIG5vdCBjdXJyZW50bHkgYXR0YWNoZWQuCisgICAqLworICB2b2lkIGRldGFjaCgpIHsKKyAgICBlbmZvcmNlKGF3YWl0YWJsZV8sIG5ldyBURXhjZXB0aW9uKCJOb3QgYXR0YWNoZWQuIikpOworCisgICAgLy8gU29hayB1cCBhbnkgbm90IGN1cnJlbnRseSByZWFkIG5vdGlmaWNhdGlvbiBieXRlcy4KKyAgICB1Ynl0ZVsxXSBkdW1teSA9IHZvaWQ7CisgICAgd2hpbGUgKHJlY3ZTb2NrZXRfLnJlY2VpdmUoZHVtbXkpICE9IFNvY2tldC5FUlJPUikge30KKworICAgIGF1dG8gY291bGRSZW1vdmUgPSBhd2FpdGFibGVfLnJlbW92ZUNhbGxiYWNrKCZub3RpZnkpOworICAgIGFzc2VydChjb3VsZFJlbW92ZSk7CisgICAgYXdhaXRhYmxlXyA9IG51bGw7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBub3RpZnkoKSB7CisgICAgdWJ5dGVbMV0gemVybzsKKyAgICBzZW5kU29ja2V0Xy5zZW5kKHplcm8pOworICB9CisKKyAgVEF3YWl0YWJsZSBhd2FpdGFibGVfOworICBTb2NrZXQgc2VuZFNvY2tldF87CisgIFNvY2tldCByZWN2U29ja2V0XzsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9jYW5jZWxsYXRpb24uZCBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9jYW5jZWxsYXRpb24uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjU1MjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2NhbmNlbGxhdGlvbi5kCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCitpbXBvcnQgY29yZS5hdG9taWM7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuYXdhaXRhYmxlOworCisvKioKKyAqIEEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZm9yIGFzeW5jaHJvbm91cyBvciBibG9ja2luZyBzeW5jaHJvbm91cyBvcGVyYXRpb25zLgorICoKKyAqIEl0IGlzIHBhc3NlZCB0byB0aGUgZW50aXR5IGNyZWF0aW5nIGFuIG9wZXJhdGlvbiwgd2hpY2ggd2lsbCB1c3VhbGx5IG1vbml0b3IKKyAqIGl0IGVpdGhlciBieSBwb2xsaW5nIG9yIGJ5IGFkZGluZyBldmVudCBoYW5kbGVycywgYW5kIGNhbmNlbCB0aGUgb3BlcmF0aW9uCisgKiBpZiBpdCBpcyB0cmlnZ2VyZWQuCisgKgorICogRm9yIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMsIHRoaXMgdXN1YWxseSBtZWFucyBlaXRoZXIgdGhyb3dpbmcgYQorICogVENhbmNlbGxlZEV4Y2VwdGlvbiBvciBpbW1lZGlhdGVseSByZXR1cm5pbmcsIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgKiBjYW5jZWxsYXRpb24gaXMgYW4gZXhwZWN0ZWQgcGFydCBvZiB0aGUgdGFzayBvdXRjb21lIG9yIG5vdC4gRm9yCisgKiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucywgY2FuY2VsbGF0aW9uIHR5cGljYWxseSBlbnRhaWxzIHN0b3BwaW5nIGJhY2tncm91bmQKKyAqIHdvcmsgYW5kIGNhbmNlbGxpbmcgYSByZXN1bHQgZnV0dXJlLCBpZiBub3QgYWxyZWFkeSBjb21wbGV0ZWQuCisgKgorICogQW4gb3BlcmF0aW9uIGFjY2VwdGluZyBhIFRDYW5jZWxsYXRpb24gZG9lcyBub3QgbmVlZCB0byBndWFyYW50ZWUgdGhhdCBpdAorICogd2lsbCBhY3R1YWxseSBiZSBhYmxlIHRvIHJlYWN0IHRvIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdC4KKyAqLworaW50ZXJmYWNlIFRDYW5jZWxsYXRpb24geworICAvKioKKyAgICogV2hldGhlciB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gdHJpZ2dlcmVkLgorICAgKi8KKyAgYm9vbCB0cmlnZ2VyZWQoKSBjb25zdCBAcHJvcGVydHk7CisKKyAgLyoqCisgICAqIFRocm93cyBhIFRDYW5jZWxsZWRFeGNlcHRpb24gaWYgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4KKyAgICogdHJpZ2dlcmVkLgorICAgKi8KKyAgdm9pZCB0aHJvd0lmVHJpZ2dlcmVkKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEEgVEF3YWl0YWJsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIGNhbmNlbGxhdGlvbiB0cmlnZ2VyaW5nLgorICAgKi8KKyAgVEF3YWl0YWJsZSB0cmlnZ2VyaW5nKCkgQHByb3BlcnR5OworfQorCisvKioKKyAqIFRoZSBvcmlnaW4gb2YgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCwgd2hpY2ggcHJvdmlkZXMgYSB3YXkgdG8gYWN0dWFsbHkKKyAqIHRyaWdnZXIgaXQuCisgKgorICogVGhpcyBkZXNpZ24gYWxsb3dzIG9wZXJhdGlvbnMgdG8gcGFzcyB0aGUgVENhbmNlbGxhdGlvbiBvbiB0byBzdWItdGFza3MsCisgKiB3aGlsZSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBjYW5jZWxsYXRpb24gY2FuIG9ubHkgYmUgdHJpZ2dlcmVkIGJ5IHRoZQorICogwrtvdXRlcm1vc3TCqyBpbnN0YW5jZSB3YWl0aW5nIGZvciB0aGUgcmVzdWx0LgorICovCitmaW5hbCBjbGFzcyBUQ2FuY2VsbGF0aW9uT3JpZ2luIDogVENhbmNlbGxhdGlvbiB7CisgIHRoaXMoKSB7CisgICAgZXZlbnRfID0gbmV3IFRPbmVzaG90RXZlbnQ7CisgIH0KKworICAvKioKKyAgICogVHJpZ2dlcnMgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LgorICAgKi8KKyAgdm9pZCB0cmlnZ2VyKCkgeworICAgIGF0b21pY1N0b3JlKHRyaWdnZXJlZF8sIHRydWUpOworICAgIGV2ZW50Xy50cmlnZ2VyKCk7CisgIH0KKworICAvK292ZXJyaWRlKy8gYm9vbCB0cmlnZ2VyZWQoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBhdG9taWNMb2FkKHRyaWdnZXJlZF8pOworICB9CisKKyAgLytvdmVycmlkZSsvIHZvaWQgdGhyb3dJZlRyaWdnZXJlZCgpIGNvbnN0IHsKKyAgICBpZiAodHJpZ2dlcmVkKSB0aHJvdyBuZXcgVENhbmNlbGxlZEV4Y2VwdGlvbjsKKyAgfQorCisgIC8rb3ZlcnJpZGUrLyBUQXdhaXRhYmxlIHRyaWdnZXJpbmcoKSBAcHJvcGVydHkgeworICAgIHJldHVybiBldmVudF87CisgIH0KKworcHJpdmF0ZToKKyAgc2hhcmVkIGJvb2wgdHJpZ2dlcmVkXzsKKyAgVE9uZXNob3RFdmVudCBldmVudF87Cit9CisKKy8vLworY2xhc3MgVENhbmNlbGxlZEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICAvLy8KKyAgdGhpcyhzdHJpbmcgbXNnID0gbnVsbCwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwKKyAgKSB7CisgICAgc3VwZXIobXNnID8gbXNnIDogIlRoZSBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLiIsIGZpbGUsIGxpbmUsIG5leHQpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvZnV0dXJlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvZnV0dXJlLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzMmEwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9mdXR1cmUuZApAQCAtMCwwICsxLDU0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworbW9kdWxlIHRocmlmdC51dGlsLmZ1dHVyZTsKKworaW1wb3J0IGNvcmUuYXRvbWljOworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4OworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uOworaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udCwgcG9wRnJvbnQ7CitpbXBvcnQgc3RkLmNvbnYgOiB0bzsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQudHJhaXRzIDogQmFzZVR5cGVUdXBsZSwgaXNTb21lRnVuY3Rpb24sIFBhcmFtZXRlclR5cGVUdXBsZSwgUmV0dXJuVHlwZTsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudXRpbC5hd2FpdGFibGU7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gb3BlcmF0aW9uIHdoaWNoIGlzIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5IGFuZCB0aGUgcmVzdWx0IG9mCisgKiB3aGljaCB3aWxsIGJlY29tZSBhdmFpbGFibGUgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgorICoKKyAqIE9uY2UgYSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gY2FuIGJlIGZldGNoZWQKKyAqIHZpYSB0aGUgZ2V0KCkgZmFtaWx5IG9mIG1ldGhvZHMuIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBjYXNlczogRWl0aGVyIHRoZQorICogb3BlcmF0aW9uIHN1Y2NlZWRlZCwgdGhlbiBpdHMgcmV0dXJuIHZhbHVlIGlzIHJldHVybmVkLCBvciBpdCBmYWlsZWQgYnkKKyAqIHRocm93aW5nLCBpbiB3aGljaCBjYXNlIHRoZSBleGNlcHRpb24gaXMgcmV0aHJvd24sIG9yIGl0IHdhcyBjYW5jZWxsZWQKKyAqIGJlZm9yZSwgdGhlbiBhIFRDYW5jZWxsZWRFeGNlcHRpb24gaXMgdGhyb3duLiBUaGVyZSBtaWdodCBiZSBURnV0dXJlCisgKiBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggbmV2ZXIgcG9zc2libHkgZW50ZXIgdGhlIGNhbmNlbGxlZCBzdGF0ZS4KKyAqCisgKiBBbGwgbWV0aG9kcyBhcmUgdGhyZWFkLXNhZmUsIGJ1dCBrZWVwIGluIG1pbmQgdGhhdCBhbnkgZXhjZXB0aW9uIG9iamVjdCBvcgorICogcmVzdWx0IChpZiBpdCBpcyBhIHJlZmVyZW5jZSB0eXBlLCBvZiBjb3Vyc2UpIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbAorICogZ2V0KCktZmFtaWx5IGludm9jYXRpb25zLgorICovCitpbnRlcmZhY2UgVEZ1dHVyZShSZXN1bHRUeXBlKSB7CisgIC8qKgorICAgKiBUaGUgc3RhdHVzIHRoZSBvcGVyYXRpb24gaXMgY3VycmVudGx5IGluLgorICAgKgorICAgKiBBbiBvcGVyYXRpb24gc3RhcnRzIG91dCBpbiBSVU5OSU5HIHN0YXR1cywgYW5kIGNoYW5nZXMgc3RhdGUgdG8gb25lIG9mIHRoZQorICAgKiBvdGhlcnMgYXQgbW9zdCBvbmNlIGFmdGVyd2FyZHMuCisgICAqLworICBURnV0dXJlU3RhdHVzIHN0YXR1cygpIEBwcm9wZXJ0eTsKKworICAvKioKKyAgICogQSBUQXdhaXRhYmxlIHRyaWdnZXJlZCB3aGVuIHRoZSBvcGVyYXRpb24gbGVhdmVzIHRoZSBSVU5OSU5HIHN0YXR1cy4KKyAgICovCisgIFRBd2FpdGFibGUgY29tcGxldGlvbigpIEBwcm9wZXJ0eTsKKworICAvKioKKyAgICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB3YWl0aW5nIHVudGlsIHRoZSByZXN1bHQgaXMgYXZhaWxhYmxlIGFuZCB0aGVuCisgICAqIGdldCgpaW5nIGl0LgorICAgKgorICAgKiBJZiB0aGUgb3BlcmF0aW9uIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgdGhlIHJlc3VsdCBpcyBpbW1lZGlhdGVseQorICAgKiByZXR1cm5lZC4KKyAgICoKKyAgICogVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyDCu2FsaWFzIHRoaXPCqydkIHRvIHRoZSBpbnRlcmZhY2UsIHNvIHRoYXQKKyAgICogVEZ1dHVyZSBjYW4gYmUgdXNlZCBhcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGEgc2ltcGxlIHZhbHVlIGluCisgICAqIHN5bmNocm9ub3VzIGNvZGUuCisgICAqLworICBmaW5hbCBSZXN1bHRUeXBlIHdhaXRHZXQoKSB7CisgICAgY29tcGxldGlvbi53YWl0KCk7CisgICAgcmV0dXJuIGdldCgpOworICB9CisgIGZpbmFsIEBwcm9wZXJ0eSBhdXRvIHdhaXRHZXRQcm9wZXJ0eSgpIHsgcmV0dXJuIHdhaXRHZXQoKTsgfQorICBhbGlhcyB3YWl0R2V0UHJvcGVydHkgdGhpczsKKworICAvKioKKyAgICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB3YWl0aW5nIHVudGlsIHRoZSByZXN1bHQgaXMgYXZhaWxhYmxlIGFuZCB0aGVuCisgICAqIGdldCgpaW5nIGl0LgorICAgKgorICAgKiBJZiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbiB0aW1lLCByZXR1cm5zIGl0cyByZXN1bHQgKHJlc3AuIHRocm93cyBhbgorICAgKiBleGNlcHRpb24gZm9yIHRoZSBmYWlsZWQvY2FuY2VsbGVkIGNhc2VzKS4gSWYgbm90LCB0aHJvd3MgYQorICAgKiBURnV0dXJlRXhjZXB0aW9uLgorICAgKi8KKyAgZmluYWwgUmVzdWx0VHlwZSB3YWl0R2V0KER1cmF0aW9uIHRpbWVvdXQpIHsKKyAgICBlbmZvcmNlKGNvbXBsZXRpb24ud2FpdCh0aW1lb3V0KSwgbmV3IFRGdXR1cmVFeGNlcHRpb24oCisgICAgICAiT3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGUgaW4gdGltZS4iKSk7CisgICAgcmV0dXJuIGdldCgpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgKgorICAgKiBUaHJvd3M6IFRGdXR1cmVFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQsCisgICAqICAgVENhbmNlbGxlZEV4Y2VwdGlvbiBpZiBpdCBpcyBub3QgeWV0IGRvbmU7IHRoZSBzZXQgZXhjZXB0aW9uIGlmIGl0CisgICAqICAgZmFpbGVkLgorICAgKi8KKyAgUmVzdWx0VHlwZSBnZXQoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgY2FwdHVyZWQgZXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLCBvciBudWxsIG90aGVyd2lzZS4KKyAgICoKKyAgICogVGhyb3dzOiBURnV0dXJlRXhjZXB0aW9uIGlmIG5vdCB5ZXQgZG9uZSwgVENhbmNlbGxlZEV4Y2VwdGlvbiBpZiB0aGUKKyAgICogICBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLgorICAgKi8KKyAgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpOworfQorCisvKioKKyAqIFRoZSBzdGF0ZXMgdGhlIG9wZXJhdGlvbiBvZmZlcmluZyBhIGZ1dHVyZSBpbnRlcmZhY2UgY2FuIGJlIGluLgorICovCitlbnVtIFRGdXR1cmVTdGF0dXMgOiBieXRlIHsKKyAgUlVOTklORywgLy8vIFRoZSBvcGVyYXRpb24gaXMgc3RpbGwgcnVubmluZy4KKyAgU1VDQ0VFREVELCAvLy8gVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgd2l0aG91dCB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgIEZBSUxFRCwgLy8vIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KKyAgQ0FOQ0VMTEVEIC8vLyBUaGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuCit9CisKKy8qKgorICogQSBURnV0dXJlIGNvdmVyaW5nIHRoZSBzaW1wbGUgYnV0IGNvbW1vbiBjYXNlIHdoZXJlIHRoZSByZXN1bHQgaXMgc2ltcGx5CisgKiBzZXQgYnkgYSBjYWxsIHRvIHN1Y2NlZWQoKS9mYWlsKCkuCisgKgorICogQWxsIG1ldGhvZHMgYXJlIHRocmVhZC1zYWZlLCBidXQgdXN1YWxseSwgc3VjY2VlZCgpL2ZhaWwoKSBhcmUgb25seSBjYWxsZWQKKyAqIGZyb20gYSBzaW5nbGUgdGhyZWFkIChkaWZmZXJlbnQgZnJvbSB0aGUgdGhyZWFkKHMpIHdhaXRpbmcgZm9yIHRoZSByZXN1bHQKKyAqIHVzaW5nIHRoZSBURnV0dXJlIGludGVyZmFjZSwgdGhvdWdoKS4KKyAqLworY2xhc3MgVFByb21pc2UoUmVzdWx0VHlwZSkgOiBURnV0dXJlIVJlc3VsdFR5cGUgeworICB0aGlzKCkgeworICAgIHN0YXR1c011dGV4XyA9IG5ldyBNdXRleDsKKyAgICBjb21wbGV0aW9uRXZlbnRfID0gbmV3IFRPbmVzaG90RXZlbnQ7CisgIH0KKworICBvdmVycmlkZSBTIHN0YXR1cygpIGNvbnN0IEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGF0b21pY0xvYWQoc3RhdHVzXyk7CisgIH0KKworICBvdmVycmlkZSBUQXdhaXRhYmxlIGNvbXBsZXRpb24oKSBAcHJvcGVydHkgeworICAgIHJldHVybiBjb21wbGV0aW9uRXZlbnRfOworICB9CisKKyAgb3ZlcnJpZGUgUmVzdWx0VHlwZSBnZXQoKSB7CisgICAgYXV0byBzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICBlbmZvcmNlKHMgIT0gUy5SVU5OSU5HLAorICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBub3QgeWV0IGNvbXBsZXRlZC4iKSk7CisKKyAgICBpZiAocyA9PSBTLkNBTkNFTExFRCkgdGhyb3cgbmV3IFRDYW5jZWxsZWRFeGNlcHRpb247CisgICAgaWYgKHMgPT0gUy5GQUlMRUQpIHRocm93IGV4Y2VwdGlvbl87CisKKyAgICBzdGF0aWMgaWYgKCFpcyhSZXN1bHRUeXBlID09IHZvaWQpKSB7CisgICAgICByZXR1cm4gcmVzdWx0XzsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgeworICAgIGF1dG8gcyA9IGF0b21pY0xvYWQoc3RhdHVzXyk7CisgICAgZW5mb3JjZShzICE9IFMuUlVOTklORywKKyAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gbm90IHlldCBjb21wbGV0ZWQuIikpOworCisgICAgaWYgKHMgPT0gUy5DQU5DRUxMRUQpIHRocm93IG5ldyBUQ2FuY2VsbGVkRXhjZXB0aW9uOworICAgIGlmIChzID09IFMuU1VDQ0VFREVEKSByZXR1cm4gbnVsbDsKKworICAgIHJldHVybiBleGNlcHRpb25fOworICB9CisKKyAgc3RhdGljIGlmICghaXMoUmVzdWx0VHlwZSA9PSB2b2lkKSkgeworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLCBtYXJrcyBpdCBhcyBkb25lLCBhbmQgbm90aWZpZXMgYW55CisgICAgICogd2FpdGVycy4KKyAgICAgKgorICAgICAqIElmIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJlZm9yZSwgbm90aGluZyBoYXBwZW5zLgorICAgICAqCisgICAgICogVGhyb3dzOiBURnV0dXJlRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgYWxyZWFkeSBjb21wbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBzdWNjZWVkKFJlc3VsdFR5cGUgcmVzdWx0KSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHN0YXR1c011dGV4XykgeworICAgICAgICBhdXRvIHMgPSBhdG9taWNMb2FkKHN0YXR1c18pOworICAgICAgICBpZiAocyA9PSBTLkNBTkNFTExFRCkgcmV0dXJuOworCisgICAgICAgIGVuZm9yY2UocyA9PSBTLlJVTk5JTkcsCisgICAgICAgICAgbmV3IFRGdXR1cmVFeGNlcHRpb24oIk9wZXJhdGlvbiBhbHJlYWR5IGNvbXBsZXRlZC4iKSk7CisgICAgICAgIHJlc3VsdF8gPSByZXN1bHQ7CisKKyAgICAgICAgYXRvbWljU3RvcmUoc3RhdHVzXywgUy5TVUNDRUVERUQpOworICAgICAgfQorCisgICAgICBjb21wbGV0aW9uRXZlbnRfLnRyaWdnZXIoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdm9pZCBzdWNjZWVkKCkgeworICAgICAgc3luY2hyb25pemVkIChzdGF0dXNNdXRleF8pIHsKKyAgICAgICAgYXV0byBzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICAgICAgaWYgKHMgPT0gUy5DQU5DRUxMRUQpIHJldHVybjsKKworICAgICAgICBlbmZvcmNlKHMgPT0gUy5SVU5OSU5HLAorICAgICAgICAgIG5ldyBURnV0dXJlRXhjZXB0aW9uKCJPcGVyYXRpb24gYWxyZWFkeSBjb21wbGV0ZWQuIikpOworCisgICAgICAgIGF0b21pY1N0b3JlKHN0YXR1c18sIFMuU1VDQ0VFREVEKTsKKyAgICAgIH0KKworICAgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIE1hcmtzIHRoZSBvcGVyYXRpb24gYXMgZmFpbGVkIHdpdGggdGhlIHNwZWNpZmllZCBleGNlcHRpb24gYW5kIG5vdGlmaWVzCisgICAqIGFueSB3YWl0ZXJzLgorICAgKgorICAgKiBJZiB0aGUgb3BlcmF0aW9uIHdhcyBhbHJlYWR5IGNhbmNlbGxlZCwgbm90aGluZyBoYXBwZW5zLgorICAgKgorICAgKiBUaHJvd3M6IFRGdXR1cmVFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyBhbHJlYWR5IGNvbXBsZXRlZC4KKyAgICovCisgIHZvaWQgZmFpbChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgc3luY2hyb25pemVkIChzdGF0dXNNdXRleF8pIHsKKyAgICAgIGF1dG8gc3RhdHVzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUy5DQU5DRUxMRUQpIHJldHVybjsKKworICAgICAgZW5mb3JjZShzdGF0dXMgPT0gUy5SVU5OSU5HLAorICAgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIGFscmVhZHkgY29tcGxldGVkLiIpKTsKKyAgICAgIGV4Y2VwdGlvbl8gPSBleGNlcHRpb247CisKKyAgICAgIGF0b21pY1N0b3JlKHN0YXR1c18sIFMuRkFJTEVEKTsKKyAgICB9CisKKyAgICBjb21wbGV0aW9uRXZlbnRfLnRyaWdnZXIoKTsKKyAgfQorCisKKyAgLyoqCisgICAqIE1hcmtzIHRoaXMgb3BlcmF0aW9uIGFzIGNvbXBsZXRlZCBhbmQgdGFrZXMgb3ZlciB0aGUgb3V0Y29tZSBvZiBhbm90aGVyCisgICAqIFRGdXR1cmUgb2YgdGhlIHNhbWUgdHlwZS4KKyAgICoKKyAgICogSWYgdGhpcyBvcGVyYXRpb24gd2FzIGFscmVhZHkgY2FuY2VsbGVkLCBub3RoaW5nIGhhcHBlbnMuIElmIHRoZSBvdGhlcgorICAgKiBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZCwgdGhpcyBvcGVyYXRpb24gaXMgbWFya2VkIGFzIGZhaWxlZCB3aXRoIGEKKyAgICogVENhbmNlbGxlZEV4Y2VwdGlvbi4KKyAgICoKKyAgICogVGhyb3dzOiBURnV0dXJlRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZnV0dXJlIHdhcyBub3QgY29tcGxldGVkIG9yCisgICAqICAgdGhpcyBvcGVyYXRpb24gaXMgYWxyZWFkeSBjb21wbGV0ZWQuCisgICAqLworICB2b2lkIGNvbXBsZXRlKFRGdXR1cmUhUmVzdWx0VHlwZSBmdXR1cmUpIHsKKyAgICBzeW5jaHJvbml6ZWQgKHN0YXR1c011dGV4XykgeworICAgICAgYXV0byBzdGF0dXMgPSBhdG9taWNMb2FkKHN0YXR1c18pOworICAgICAgaWYgKHN0YXR1cyA9PSBTLkNBTkNFTExFRCkgcmV0dXJuOworICAgICAgZW5mb3JjZShzdGF0dXMgPT0gUy5SVU5OSU5HLAorICAgICAgICBuZXcgVEZ1dHVyZUV4Y2VwdGlvbigiT3BlcmF0aW9uIGFscmVhZHkgY29tcGxldGVkLiIpKTsKKworICAgICAgZW5mb3JjZShmdXR1cmUuc3RhdHVzICE9IFMuUlVOTklORywgbmV3IFRGdXR1cmVFeGNlcHRpb24oCisgICAgICAgICJUaGUgcGFzc2VkIFRGdXR1cmUgaXMgbm90IHlldCBjb21wbGV0ZWQuIikpOworCisgICAgICBzdGF0dXMgPSBmdXR1cmUuc3RhdHVzOworICAgICAgaWYgKHN0YXR1cyA9PSBTLkNBTkNFTExFRCkgeworICAgICAgICBzdGF0dXMgPSBTLkZBSUxFRDsKKyAgICAgICAgZXhjZXB0aW9uXyA9IG5ldyBUQ2FuY2VsbGVkRXhjZXB0aW9uOworICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gUy5GQUlMRUQpIHsKKyAgICAgICAgZXhjZXB0aW9uXyA9IGZ1dHVyZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgIH0gZWxzZSBzdGF0aWMgaWYgKCFpcyhSZXN1bHRUeXBlID09IHZvaWQpKSB7CisgICAgICAgIHJlc3VsdF8gPSBmdXR1cmUuZ2V0KCk7CisgICAgICB9CisKKyAgICAgIGF0b21pY1N0b3JlKHN0YXR1c18sIHN0YXR1cyk7CisgICAgfQorCisgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgIH0KKworICAvKioKKyAgICogTWFya3MgdGhpcyBvcGVyYXRpb24gYXMgY2FuY2VsbGVkIGFuZCBub3RpZmllcyBhbnkgd2FpdGVycy4KKyAgICoKKyAgICogSWYgdGhlIG9wZXJhdGlvbiBpcyBhbHJlYWR5IGNvbXBsZXRlZCwgbm90aGluZyBoYXBwZW5zLgorICAgKi8KKyAgdm9pZCBjYW5jZWwoKSB7CisgICAgc3luY2hyb25pemVkIChzdGF0dXNNdXRleF8pIHsKKyAgICAgIGF1dG8gc3RhdHVzID0gYXRvbWljTG9hZChzdGF0dXNfKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUy5SVU5OSU5HKSBhdG9taWNTdG9yZShzdGF0dXNfLCBTLkNBTkNFTExFRCk7CisgICAgfQorCisgICAgY29tcGxldGlvbkV2ZW50Xy50cmlnZ2VyKCk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gQ29udmVuaWVuY2UgYWxpYXMgYmVjYXVzZSBURnV0dXJlU3RhdHVzIGlzIHViaXF1aXRvdXMgaW4gdGhpcyBjbGFzcy4KKyAgYWxpYXMgVEZ1dHVyZVN0YXR1cyBTOworCisgIC8vIFRoZSBzdGF0dXMgdGhlIHByb21pc2UgaXMgY3VycmVudGx5IGluLgorICBzaGFyZWQgUyBzdGF0dXNfOworCisgIHVuaW9uIHsKKyAgICBzdGF0aWMgaWYgKCFpcyhSZXN1bHRUeXBlID09IHZvaWQpKSB7CisgICAgICAvLyBTZXQgaWYgc3RhdHVzXyBpcyBTVUNDRUVERUQuCisgICAgICBSZXN1bHRUeXBlIHJlc3VsdF87CisgICAgfQorICAgIC8vIFNldCBpZiBzdGF0dXNfIGlzIEZBSUxFRC4KKyAgICBFeGNlcHRpb24gZXhjZXB0aW9uXzsKKyAgfQorCisgIC8vIFByb3RlY3RzIHN0YXR1c18uCisgIC8vIEFzIGZvciByZXN1bHRfIGFuZCBleGNlcHRpb25fOiBUaGV5IGFyZSBvbmx5IHNldCBvbmNlLCB3aGlsZSBzdGF0dXNfIGlzCisgIC8vIHN0aWxsIFJVTk5JTkcsIHNvIGdpdmVuIHRoYXQgdGhlIG9wZXJhdGlvbiBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHJlYWRpbmcKKyAgLy8gdGhlbSBpcyBzYWZlIHdpdGhvdXQgaG9sZGluZyBzb21lIGtpbmQgb2YgbG9jay4KKyAgTXV0ZXggc3RhdHVzTXV0ZXhfOworCisgIC8vIFRyaWdnZXJlZCB3aGVuIHRoZSBldmVudCBjb21wbGV0ZXMuCisgIFRPbmVzaG90RXZlbnQgY29tcGxldGlvbkV2ZW50XzsKK30KKworLy8vCitjbGFzcyBURnV0dXJlRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7CisgIC8vLworICB0aGlzKHN0cmluZyBtc2cgPSAiIiwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywKKyAgICBUaHJvd2FibGUgbmV4dCA9IG51bGwpCisgIHsKKyAgICBzdXBlcihtc2csIGZpbGUsIGxpbmUsIG5leHQpOworICB9Cit9CisKKy8qKgorICogQ3JlYXRlcyBhbiBpbnRlcmZhY2UgdGhhdCBpcyBzaW1pbGFyIHRvIGEgZ2l2ZW4gb25lLCBidXQgYWNjZXB0cyBhbgorICogYWRkaXRpb25hbCwgb3B0aW9uYWwgVENhbmNlbGxhdGlvbiBwYXJhbWV0ZXIgZWFjaCBtZXRob2QsIGFuZCByZXR1cm5zCisgKiBURnV0dXJlcyBpbnN0ZWFkIG9mIHBsYWluIHJldHVybiB2YWx1ZXMuCisgKgorICogRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zOgorICogLS0tCisgKiBpbnRlcmZhY2UgRm9vIHsKKyAqICAgdm9pZCBiYXIoKTsKKyAqICAgc3RyaW5nIGJheihpbnQgYSk7CisgKiB9CisgKiBhbGlhcyBURnV0dXJlSW50ZXJmYWNlIUZvbyBGdXR1cmVGb287CisgKiAtLS0KKyAqCisgKiBGdXR1cmVGb28gd291bGQgYmUgZXF1aXZhbGVudCB0bzoKKyAqIC0tLQorICogaW50ZXJmYWNlIEZ1dHVyZUZvbyB7CisgKiAgIFRGdXR1cmUhdm9pZCBiYXIoVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24gPSBudWxsKTsKKyAqICAgVEZ1dHVyZSFzdHJpbmcgYmF6KGludCBhLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiA9IG51bGwpOworICogfQorICogLS0tCisgKi8KK3RlbXBsYXRlIFRGdXR1cmVJbnRlcmZhY2UoSW50ZXJmYWNlKSBpZiAoaXMoSW50ZXJmYWNlIF8gPT0gaW50ZXJmYWNlKSkgeworICBtaXhpbih7CisgICAgc3RyaW5nIGNvZGUgPSAiaW50ZXJmYWNlIFRGdXR1cmVJbnRlcmZhY2UgXG4iOworCisgICAgc3RhdGljIGlmIChpcyhJbnRlcmZhY2UgQmFzZXMgPT0gc3VwZXIpICYmIEJhc2VzLmxlbmd0aCA+IDApIHsKKyAgICAgIGNvZGUgfj0gIjogIjsKKyAgICAgIGZvcmVhY2ggKGk7IDAgLi4gQmFzZXMubGVuZ3RoKSB7CisgICAgICAgIGlmIChpID4gMCkgY29kZSB+PSAiLCAiOworICAgICAgICBjb2RlIH49ICJURnV0dXJlSW50ZXJmYWNlIShCYXNlVHlwZVR1cGxlIUludGVyZmFjZVsiIH4gdG8hc3RyaW5nKGkpIH4gIl0pICI7CisgICAgICB9CisgICAgfQorCisgICAgY29kZSB+PSAie1xuIjsKKworICAgIGZvcmVhY2ggKG1ldGhvZE5hbWU7IF9fdHJhaXRzKGRlcml2ZWRNZW1iZXJzLCBJbnRlcmZhY2UpKSB7CisgICAgICBlbnVtIHFuID0gIkludGVyZmFjZS4iIH4gbWV0aG9kTmFtZTsKKyAgICAgIHN0YXRpYyBpZiAoaXNTb21lRnVuY3Rpb24hKG1peGluKHFuKSkpIHsKKyAgICAgICAgY29kZSB+PSAiVEZ1dHVyZSEoUmV0dXJuVHlwZSEoIiB+IHFuIH4gIikpICIgfiBtZXRob2ROYW1lIH4KKyAgICAgICAgICAiKFBhcmFtZXRlclR5cGVUdXBsZSEoIiB+IHFuIH4gIiksIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uID0gbnVsbCk7XG4iOworICAgICAgfQorICAgIH0KKworICAgIGNvZGUgfj0gIn1cbiI7CisgICAgcmV0dXJuIGNvZGU7CisgIH0oKSk7Cit9CisKKy8qKgorICogQW4gaW5wdXQgcmFuZ2UgdGhhdCBhZ2dyZWdhdGVzIHJlc3VsdHMgZnJvbSBtdWx0aXBsZSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucywKKyAqIHJldHVybmluZyB0aGVtIGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4KKyAqCisgKiBBZGRpdGlvbmFsbHksIGEgdGltZW91dCBjYW4gYmUgc2V0IGFmdGVyIHdoaWNoIHJlc3VsdHMgZnJvbSBub3QgeWV0IGZpbmlzaGVkCisgKiBmdXR1cmVzIHdpbGwgbm8gbG9uZ2VyIGJlIHdhaXRlZCBmb3IsIGUuZy4gdG8gZW5zdXJlIHRoZSB0aW1lIGl0IHRha2VzIHRvCisgKiBpdGVyYXRlIG92ZXIgYSBzZXQgb2YgcmVzdWx0cyBpcyBsaW1pdGVkLgorICovCitmaW5hbCBjbGFzcyBURnV0dXJlQWdncmVnYXRvclJhbmdlKFQpIHsKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuCisgICAqCisgICAqIFBhcmFtczoKKyAgICogICBmdXR1cmVzID0gVGhlIHNldCBvZiBmdXR1cmVzIHRvIGNvbGxlY3QgcmVzdWx0cyBmcm9tLgorICAgKiAgIHRpbWVvdXQgPSBJZiBwb3NpdGl2ZSwgbm90IHlldCBmaW5pc2hlZCBmdXR1cmVzIHdpbGwgYmUgY2FuY2VsbGVkIGFuZAorICAgKiAgICAgdGhlaXIgcmVzdWx0cyB3aWxsIG5vdCBiZSB0YWtlbiBpbnRvIGFjY291bnQuCisgICAqLworICB0aGlzKFRGdXR1cmUhVFtdIGZ1dHVyZXMsIFRDYW5jZWxsYXRpb25PcmlnaW4gY2hpbGRDYW5jZWxsYXRpb24sCisgICAgRHVyYXRpb24gdGltZW91dCA9IGR1ciEiaG5zZWNzIigwKQorICApIHsKKyAgICBpZiAodGltZW91dCA+IGR1ciEiaG5zZWNzIigwKSkgeworICAgICAgdGltZW91dFN5c1RpY2tfID0gVGlja0R1cmF0aW9uLmN1cnJTeXN0ZW1UaWNrICsKKyAgICAgICAgVGlja0R1cmF0aW9uLmZyb20hImhuc2VjcyIodGltZW91dC50b3RhbCEiaG5zZWNzIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRpbWVvdXRTeXNUaWNrXyA9IFRpY2tEdXJhdGlvbigwKTsKKyAgICB9CisKKyAgICBxdWV1ZU11dGV4XyA9IG5ldyBNdXRleDsKKyAgICBxdWV1ZU5vbkVtcHR5Q29uZGl0aW9uXyA9IG5ldyBDb25kaXRpb24ocXVldWVNdXRleF8pOworICAgIGZ1dHVyZXNfID0gZnV0dXJlczsKKyAgICBjaGlsZENhbmNlbGxhdGlvbl8gPSBjaGlsZENhbmNlbGxhdGlvbjsKKworICAgIGZvcmVhY2ggKGZ1dHVyZTsgZnV0dXJlc18pIHsKKyAgICAgIGZ1dHVyZS5jb21wbGV0aW9uLmFkZENhbGxiYWNrKHsKKyAgICAgICAgYXV0byBmID0gZnV0dXJlOworICAgICAgICByZXR1cm4geworICAgICAgICAgIGlmIChmLnN0YXR1cyA9PSBURnV0dXJlU3RhdHVzLkNBTkNFTExFRCkgcmV0dXJuOworICAgICAgICAgIGFzc2VydChmLnN0YXR1cyAhPSBURnV0dXJlU3RhdHVzLlJVTk5JTkcpOworCisgICAgICAgICAgc3luY2hyb25pemVkIChxdWV1ZU11dGV4XykgeworICAgICAgICAgICAgY29tcGxldGVkUXVldWVfIH49IGY7CisKKyAgICAgICAgICAgIGlmIChjb21wbGV0ZWRRdWV1ZV8ubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgcXVldWVOb25FbXB0eUNvbmRpdGlvbl8ubm90aWZ5QWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV2hldGhlciB0aGUgcmFuZ2UgaXMgZW1wdHkuCisgICAqCisgICAqIFRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIHJlc3VsdHMgZnJvbSB0aGUgY29tcGxldGVkIGZ1dHVyZXMgbm90IGhhdmluZworICAgKiBmYWlsZWQgaGF2ZSBhbHJlYWR5IGJlZW4gcG9wcGVkIGFuZCBlaXRoZXIgYWxsIGZ1dHVyZSBoYXZlIGJlZW4gZmluaXNoZWQKKyAgICogb3IgdGhlIHRpbWVvdXQgaGFzIGV4cGlyZWQuCisgICAqCisgICAqIFBvdGVudGlhbGx5IGJsb2NrcyB1bnRpbCBhIG5ldyByZXN1bHQgaXMgYXZhaWxhYmxlIG9yIHRoZSB0aW1lb3V0IGhhcworICAgKiBleHBpcmVkLgorICAgKi8KKyAgYm9vbCBlbXB0eSgpIEBwcm9wZXJ0eSB7CisgICAgaWYgKGZpbmlzaGVkXykgcmV0dXJuIHRydWU7CisgICAgaWYgKGJ1ZmZlckZpbGxlZF8pIHJldHVybiBmYWxzZTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBURnV0dXJlIVQgZnV0dXJlOworICAgICAgc3luY2hyb25pemVkIChxdWV1ZU11dGV4XykgeworICAgICAgICAvLyBUaGUgd2hpbGUgbG9vcCBpcyBqdXN0IGJlaW5nIGNhdXRpb3VzIGFib3V0IHNwdXJpb3VzIHdha2V1cHMsIGluCisgICAgICAgIC8vIGNhc2UgdGhleSBzaG91bGQgYmUgcG9zc2libGUuCisgICAgICAgIHdoaWxlIChjb21wbGV0ZWRRdWV1ZV8uZW1wdHkpIHsKKyAgICAgICAgICBhdXRvIHJlbWFpbmluZyA9IHRvIUR1cmF0aW9uKHRpbWVvdXRTeXNUaWNrXyAtCisgICAgICAgICAgICBUaWNrRHVyYXRpb24uY3VyclN5c3RlbVRpY2spOworCisgICAgICAgICAgaWYgKHJlbWFpbmluZyA8PSBkdXIhImhuc2VjcyIoMCkpIHsKKyAgICAgICAgICAgIC8vIE5vIHRpbWUgbGVmdCwgYnV0IHN0aWxsIG5vIGVsZW1lbnQgcmVjZWl2ZWQg4oCTIHdlIGFyZSBlbXB0eSBub3cuCisgICAgICAgICAgICBmaW5pc2hlZF8gPSB0cnVlOworICAgICAgICAgICAgY2hpbGRDYW5jZWxsYXRpb25fLnRyaWdnZXIoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIHF1ZXVlTm9uRW1wdHlDb25kaXRpb25fLndhaXQocmVtYWluaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1dHVyZSA9IGNvbXBsZXRlZFF1ZXVlXy5mcm9udDsKKyAgICAgICAgY29tcGxldGVkUXVldWVfLnBvcEZyb250KCk7CisgICAgICB9CisKKyAgICAgICsrY29tcGxldGVkQ291bnRfOworICAgICAgaWYgKGNvbXBsZXRlZENvdW50XyA9PSBmdXR1cmVzXy5sZW5ndGgpIHsKKyAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGxhc3QgZnV0dXJlIGluIHRoZSBsaXN0LCB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eQorICAgICAgICAvLyBhbm90aGVyIHJlc3VsdCBjb3VsZCBldmVyIGJlY29tZSBhdmFpbGFibGUuCisgICAgICAgIGZpbmlzaGVkXyA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChmdXR1cmUuc3RhdHVzID09IFRGdXR1cmVTdGF0dXMuRkFJTEVEKSB7CisgICAgICAgIC8vIFRoaXMgb25lIGZhaWxlZCwgbG9vcCBhZ2FpbiBhbmQgdHJ5IGdldHRpbmcgYW5vdGhlciBpdGVtIGZyb20KKyAgICAgICAgLy8gdGhlIHF1ZXVlLgorICAgICAgICBleGNlcHRpb25zXyB+PSBmdXR1cmUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHRCdWZmZXJfID0gZnV0dXJlLmdldCgpOworICAgICAgICBidWZmZXJGaWxsZWRfID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIHJhbmdlLgorICAgKgorICAgKiBQb3RlbnRpYWxseSBibG9ja3MgdW50aWwgYSBuZXcgcmVzdWx0IGlzIGF2YWlsYWJsZSBvciB0aGUgdGltZW91dCBoYXMKKyAgICogZXhwaXJlZC4KKyAgICoKKyAgICogVGhyb3dzOiBURXhjZXB0aW9uIGlmIHRoZSByYW5nZSBpcyBlbXB0eS4KKyAgICovCisgIFQgZnJvbnQoKSB7CisgICAgZW5mb3JjZSghZW1wdHksIG5ldyBURXhjZXB0aW9uKAorICAgICAgIkNhbm5vdCBnZXQgZnJvbnQgb2YgYW4gZW1wdHkgZnV0dXJlIGFnZ3JlZ2F0b3IgcmFuZ2UuIikpOworICAgIHJldHVybiByZXN1bHRCdWZmZXJfOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZXMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgcmFuZ2UuCisgICAqCisgICAqIFBvdGVudGlhbGx5IGJsb2NrcyB1bnRpbCBhIG5ldyByZXN1bHQgaXMgYXZhaWxhYmxlIG9yIHRoZSB0aW1lb3V0IGhhcworICAgKiBleHBpcmVkLgorICAgKgorICAgKiBUaHJvd3M6IFRFeGNlcHRpb24gaWYgdGhlIHJhbmdlIGlzIGVtcHR5LgorICAgKi8KKyAgdm9pZCBwb3BGcm9udCgpIHsKKyAgICBlbmZvcmNlKCFlbXB0eSwgbmV3IFRFeGNlcHRpb24oCisgICAgICAiQ2Fubm90IHBvcCBmcm9udCBvZiBhbiBlbXB0eSBmdXR1cmUgYWdncmVnYXRvciByYW5nZS4iKSk7CisgICAgYnVmZmVyRmlsbGVkXyA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2YgZnV0dXJlcyB0aGUgcmVzdWx0IG9mIHdoaWNoIGhhcyBiZWVuIHJldHVybmVkIG9yIHdoaWNoIGhhdmUKKyAgICogZmFpbGVkIHNvIGZhci4KKyAgICovCisgIHNpemVfdCBjb21wbGV0ZWRDb3VudCgpIEBwcm9wZXJ0eSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBsZXRlZENvdW50XzsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZXhjZXB0aW9ucyBjb2xsZWN0ZWQgZnJvbSBmYWlsZWQgVEZ1dHVyZXMgc28gZmFyLgorICAgKi8KKyAgRXhjZXB0aW9uW10gZXhjZXB0aW9ucygpIEBwcm9wZXJ0eSB7CisgICAgcmV0dXJuIGV4Y2VwdGlvbnNfOworICB9CisKK3ByaXZhdGU6CisgIFRGdXR1cmUhVFtdIGZ1dHVyZXNfOworICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNoaWxkQ2FuY2VsbGF0aW9uXzsKKworICAvLyBUaGUgc3lzdGVtIHRpY2sgdGhpcyBvcGVyYXRpb24gd2lsbCB0aW1lIG91dCwgb3IgemVybyBpZiBubyB0aW1lb3V0IGhhcworICAvLyBiZWVuIHNldC4KKyAgVGlja0R1cmF0aW9uIHRpbWVvdXRTeXNUaWNrXzsKKworICBib29sIGZpbmlzaGVkXzsKKworICBib29sIGJ1ZmZlckZpbGxlZF87CisgIFQgcmVzdWx0QnVmZmVyXzsKKworICBFeGNlcHRpb25bXSBleGNlcHRpb25zXzsKKyAgc2l6ZV90IGNvbXBsZXRlZENvdW50XzsKKworICAvLyBUaGUgcXVldWUgb2YgY29tcGxldGVkIGZ1dHVyZXMuIFRoaXMgKGFuZCB0aGUgYXNzb2NpYXRlZCBjb25kaXRpb24pIGFyZQorICAvLyB0aGUgb25seSBwYXJ0cyBvZiB0aGlzIGNsYXNzIHRoYXQgYXJlIGFjY2Vzc2VkIGJ5IG11bHRpcGxlIHRocmVhZHMuCisgIFRGdXR1cmUhVFtdIGNvbXBsZXRlZFF1ZXVlXzsKKyAgTXV0ZXggcXVldWVNdXRleF87CisgIENvbmRpdGlvbiBxdWV1ZU5vbkVtcHR5Q29uZGl0aW9uXzsKK30KKworLyoqCisgKiBURnV0dXJlQWdncmVnYXRvclJhbmdlIGNvbnN0cnVjdGlvbiBoZWxwZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGV4cGxpY2l0bHkKKyAqIHNwZWNpZnkgdGhlIHZhbHVlIHR5cGUsIGkuZS4gdG8gYWxsb3cgdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGNhbGxlZCB1c2luZyBJRlRJCisgKiAoc2VlICQoRE1EQlVHIDYwODIsIEQgQnVnemlsbGEgZW5oYW5jZW1lbnQgcmVxdWV0IDYwODIpKS4KKyAqLworVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZSFUIHRGdXR1cmVBZ2dyZWdhdG9yUmFuZ2UoVCkoVEZ1dHVyZSFUW10gZnV0dXJlcywKKyAgVENhbmNlbGxhdGlvbk9yaWdpbiBjaGlsZENhbmNlbGxhdGlvbiwgRHVyYXRpb24gdGltZW91dCA9IGR1ciEiaG5zZWNzIigwKQorKSB7CisgIHJldHVybiBuZXcgVEZ1dHVyZUFnZ3JlZ2F0b3JSYW5nZSFUKGZ1dHVyZXMsIGNoaWxkQ2FuY2VsbGF0aW9uLCB0aW1lb3V0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9oYXNoc2V0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvaGFzaHNldC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTEyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvaGFzaHNldC5kCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0LnV0aWwuaGFzaHNldDsKKworaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBqb2luZXIsIG1hcDsKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC50cmFpdHMgOiBpc0ltcGxpY2l0bHlDb252ZXJ0aWJsZSwgUGFyYW1ldGVyVHlwZVR1cGxlOworaW1wb3J0IHN0ZC5yYW5nZSA6IEVsZW1lbnRUeXBlLCBpc0lucHV0UmFuZ2U7CisKK3N0cnVjdCBWb2lkIHt9CisKKy8qKgorICogQSBxdWlja2x5IGhhY2tlZCB0b2dldGhlciBoYXNoIHNldCBpbXBsZW1lbnRhdGlvbiBiYWNrZWQgYnkgYnVpbHQtaW4KKyAqIGFzc29jaWF0aXZlIGFycmF5cyB0byBoYXZlIHNvbWV0aGluZyB0byBjb21waWxlIFRocmlmdCdzIHNldDw+IHRvIHVudGlsCisgKiBzdGQuY29udGFpbmVyIGdhaW5zIHNvbWV0aGluZyBzdWl0YWJsZS4KKyAqLworLy8gTm90ZTogVGhlIGZ1bmt5IHBvaW50ZXIgY2FzdHMgKGkuZS4gKihjYXN0KGltbXV0YWJsZShFKSopJmUpIGluc3RlYWQgb2YKKy8vIGp1c3QgY2FzdChpbW11dGFibGUoRSkpZSkgYXJlIGEgd29ya2Fyb3VuZCBmb3IgTERDIDIgY29tcGF0aWJpbGl0eS4KK2ZpbmFsIGNsYXNzIEhhc2hTZXQoRSkgeworICAvLy8KKyAgdGhpcygpIHt9CisKKyAgLy8vCisgIHRoaXMoRVtdIGVsZW1zLi4uKSB7CisgICAgaW5zZXJ0KGVsZW1zKTsKKyAgfQorCisgIC8vLworICB2b2lkIGluc2VydChTdHVmZikoU3R1ZmYgc3R1ZmYpIGlmIChpc0ltcGxpY2l0bHlDb252ZXJ0aWJsZSEoU3R1ZmYsIEUpKSB7CisgICAgYWFfWyooY2FzdChpbW11dGFibGUoRSkqKSZzdHVmZildID0gVm9pZC5pbml0OworICB9CisKKyAgLy8vCisgIHZvaWQgaW5zZXJ0KFN0dWZmKShTdHVmZiBzdHVmZikgaWYgKAorICAgIGlzSW5wdXRSYW5nZSFTdHVmZiAmJiBpc0ltcGxpY2l0bHlDb252ZXJ0aWJsZSEoRWxlbWVudFR5cGUhU3R1ZmYsIEUpCisgICkgeworICAgIGZvcmVhY2ggKGU7IHN0dWZmKSB7CisgICAgICBhYV9bKihjYXN0KGltbXV0YWJsZShFKSopJmUpXSA9IFZvaWQuaW5pdDsKKyAgICB9CisgIH0KKworICAvLy8KKyAgdm9pZCBvcE9wQXNzaWduKHN0cmluZyBvcCA6ICJ+IiwgU3R1ZmYpKFN0dWZmIHN0dWZmKSB7CisgICAgaW5zZXJ0KHN0dWZmKTsKKyAgfQorCisgIC8vLworICB2b2lkIHJlbW92ZShFIGUpIHsKKyAgICBhYV8ucmVtb3ZlKCooY2FzdChpbW11dGFibGUoRSkqKSZlKSk7CisgIH0KKyAgYWxpYXMgcmVtb3ZlIHJlbW92ZUtleTsKKworICAvLy8KKyAgdm9pZCByZW1vdmVBbGwoKSB7CisgICAgYWFfID0gbnVsbDsKKyAgfQorCisgIC8vLworICBzaXplX3QgbGVuZ3RoKCkgQHByb3BlcnR5IGNvbnN0IHsKKyAgICByZXR1cm4gYWFfLmxlbmd0aDsKKyAgfQorCisgIC8vLworICBzaXplX3QgZW1wdHkoKSBAcHJvcGVydHkgY29uc3QgeworICAgIHJldHVybiAhYWFfLmxlbmd0aDsKKyAgfQorCisgIC8vLworICBib29sIG9wQmluYXJ5UmlnaHQoc3RyaW5nIG9wIDogImluIikoRSBlKSBjb25zdCB7CisgICAgcmV0dXJuIChlIGluIGFhXykgIWlzIG51bGw7CisgIH0KKworICAvLy8KKyAgYXV0byBvcFNsaWNlKCkgY29uc3QgeworICAgIC8vIFRPRE86IEltcGxlbWVudCB1c2luZyBBQSBrZXkgcmFuZ2Ugb25jZSBhdmFpbGFibGUgaW4gcmVsZWFzZSBETUQvZHJ1bnRpbWUKKyAgICAvLyB0byBhdm9pZCBhbGxvY2F0aW9uLgorICAgIHJldHVybiBjYXN0KEVbXSkoYWFfLmtleXMpOworICB9CisKKyAgLy8vCisgIG92ZXJyaWRlIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAvLyBPbmx5IHByb3ZpZGUgdG9TdHJpbmcoKSBpZiB0byFzdHJpbmcoKSBpcyBhdmFpbGFibGUgZm9yIEUgKGV4Y2VwdGlvbnMgYXJlCisgICAgLy8gZS5nLiBkZWxlZ2F0ZXMpLgorICAgIHN0YXRpYyBpZiAoaXModHlwZW9mKHRvIXN0cmluZyhFLmluaXQpKSA6IHN0cmluZykpIHsKKyAgICAgIHJldHVybiAieyIgfiB0byFzdHJpbmcoam9pbmVyKG1hcCFgdG8hc3RyaW5nKGEpYChhYV8ua2V5cyksICIsICIpKSB+ICJ9IjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQ2FzdCB0byB3b3JrIGFyb3VuZCBPYmplY3Qgbm90IGJlaW5nIGNvbnN0LWNvcnJlY3QuCisgICAgICByZXR1cm4gKGNhc3QoKXN1cGVyKS50b1N0cmluZygpOworICAgIH0KKyAgfQorCisgIC8vLworICBvdmVycmlkZSBib29sIG9wRXF1YWxzKE9iamVjdCBvdGhlcikgY29uc3QgeworICAgIGF1dG8gcmhzID0gY2FzdChjb25zdChIYXNoU2V0KSlvdGhlcjsKKyAgICBpZiAocmhzKSB7CisgICAgICByZXR1cm4gYWFfID09IHJocy5hYV87CisgICAgfQorCisgICAgLy8gQ2FzdCB0byB3b3JrIGFyb3VuZCBPYmplY3Qgbm90IGJlaW5nIGNvbnN0LWNvcnJlY3QuCisgICAgcmV0dXJuIChjYXN0KClzdXBlcikub3BFcXVhbHMob3RoZXIpOworICB9CisKK3ByaXZhdGU6CisgIFZvaWRbaW1tdXRhYmxlKEUpXSBhYV87Cit9CisKKy8vLyBEaXR0bworYXV0byBoYXNoU2V0KEUpKEVbXSBlbGVtcy4uLikgeworICByZXR1cm4gbmV3IEhhc2hTZXQhRShlbGVtcyk7Cit9CisKK3VuaXR0ZXN0IHsKKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisKKyAgYXV0byBhID0gaGFzaFNldCgxLCAyLCAyLCAzKTsKKyAgZW5mb3JjZShhLmxlbmd0aCA9PSAzKTsKKyAgZW5mb3JjZSgyIGluIGEpOworICBlbmZvcmNlKDUgIWluIGEpOworICBlbmZvcmNlKGEudG9TdHJpbmcoKS5sZW5ndGggPT0gOSk7CisgIGEucmVtb3ZlKDIpOworICBlbmZvcmNlKGEubGVuZ3RoID09IDIpOworICBlbmZvcmNlKDIgIWluIGEpOworICBhLnJlbW92ZUFsbCgpOworICBlbmZvcmNlKGEuZW1wdHkpOworICBlbmZvcmNlKGEudG9TdHJpbmcoKSA9PSAie30iKTsKKworICB2b2lkIGRlbGVnYXRlKCkgZGc7CisgIGF1dG8gYiA9IGhhc2hTZXQoZGcpOworICBzdGF0aWMgYXNzZXJ0KF9fdHJhaXRzKGNvbXBpbGVzLCBiLnRvU3RyaW5nKCkpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvZC90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiNmE2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTI3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cworCitCVUlMVF9TT1VSQ0VTID0gdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0gc2VydmVyLWNlcnRpZmljYXRlLnBlbQorCisKKyMgVGhyaWZ0IGNvbXBpbGVyIHJ1bGVzCisKK2RlYnVnX3Byb3RvX2dlbiA9ICQoYWRkcHJlZml4IGdlbi1kLywgRGVidWdQcm90b1Rlc3RfdHlwZXMuZCkKKworJChkZWJ1Z19wcm90b19nZW4pOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGQgLW5vd2FybiAkPAorCitzdHJlc3NfdGVzdF9nZW4gPSAkKGFkZHByZWZpeCBnZW4tZC90aHJpZnQvdGVzdC9zdHJlc3MvLCBTZXJ2aWNlLmQgXAorCVN0cmVzc1Rlc3RfdHlwZXMuZCkKKworJChzdHJlc3NfdGVzdF9nZW4pOiAkKHRvcF9zcmNkaXIpL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gZCAkPAorCit0aHJpZnRfdGVzdF9nZW4gPSAkKGFkZHByZWZpeCBnZW4tZC90aHJpZnQvdGVzdC8sIFNlY29uZFNlcnZpY2UuZCBcCisJVGhyaWZ0VGVzdC5kIFRocmlmdFRlc3RfY29uc3RhbnRzLmQgVGhyaWZ0VGVzdF90eXBlcy5kKQorCiskKHRocmlmdF90ZXN0X2dlbik6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBkICQ8CisKKworIyBUaGUgYWN0dWFsIHRlc3QgdGFyZ2V0cy4KKyMgVGhlcmUganVzdCBtdXN0IGJlIHNvbWUgd2F5IHRvIHJlYXNzaWduIGEgdmFyaWFibGUgd2l0aG91dCB3YXJuaW5ncyBpbgorIyBBdXRvbWFrZS4uLgordGFyZ2V0c19fID0gYXN5bmNfdGVzdCBjbGllbnRfcG9vbF90ZXN0IHNlcmlhbGl6YXRpb25fYmVuY2htYXJrIFwKKwlzdHJlc3NfdGVzdF9zZXJ2ZXIgdGhyaWZ0X3Rlc3RfY2xpZW50IHRocmlmdF90ZXN0X3NlcnZlciB0cmFuc3BvcnRfdGVzdAorcmFuX3Rlc3RzX18gPSBjbGllbnRfcG9vbF90ZXN0IFwKKwl0cmFuc3BvcnRfdGVzdCBcCisJYXN5bmNfdGVzdF9ydW5uZXIuc2ggXAorCXRocmlmdF90ZXN0X3J1bm5lci5zaAorCitsaWJldmVudF9kZXBlbmRlbnRfdGFyZ2V0cyA9IGFzeW5jX3Rlc3RfY2xpZW50IGNsaWVudF9wb29sX3Rlc3QgXAorCXN0cmVzc190ZXN0X3NlcnZlciB0aHJpZnRfdGVzdF9zZXJ2ZXIKK2xpYmV2ZW50X2RlcGVuZGVudF9yYW5fdGVzdHMgPSBjbGllbnRfcG9vbF90ZXN0IGFzeW5jX3Rlc3RfcnVubmVyLnNoIHRocmlmdF90ZXN0X3J1bm5lci5zaAorCitvcGVuc3NsX2RlcGVuZGVudF90YXJnZXRzID0gYXN5bmNfdGVzdCB0aHJpZnRfdGVzdF9jbGllbnQgdGhyaWZ0X3Rlc3Rfc2VydmVyCitvcGVuc3NsX2RlcGVuZGVudF9yYW5fdGVzdHMgPSBhc3luY190ZXN0X3J1bm5lci5zaCB0aHJpZnRfdGVzdF9ydW5uZXIuc2gKKworZF90ZXN0X2ZsYWdzID0KKworaWYgV0lUSF9EX0VWRU5UX1RFU1RTCitkX3Rlc3RfZmxhZ3MgKz0gJChETURfTElCRVZFTlRfRkxBR1MpIC4uLyQoRF9FVkVOVF9MSUJfTkFNRSkKK3RhcmdldHNfID0gJCh0YXJnZXRzX18pCityYW5fdGVzdHNfID0gJChyYW5fdGVzdHNfXykKK2Vsc2UKK3RhcmdldHNfID0gJChmaWx0ZXItb3V0ICQobGliZXZlbnRfZGVwZW5kZW50X3RhcmdldHMpLCAkKHRhcmdldHNfXykpCityYW5fdGVzdHNfID0gJChmaWx0ZXItb3V0ICQobGliZXZlbnRfZGVwZW5kZW50X3Jhbl90ZXN0cyksICQocmFuX3Rlc3RzX18pKQorZW5kaWYKKworaWYgV0lUSF9EX1NTTF9URVNUUworZF90ZXN0X2ZsYWdzICs9ICQoRE1EX09QRU5TU0xfRkxBR1MpIC4uLyQoRF9TU0xfTElCX05BTUUpCit0YXJnZXRzID0gJCh0YXJnZXRzXykKK3Jhbl90ZXN0cyA9ICQocmFuX3Rlc3RzXykKK2Vsc2UKK3RhcmdldHMgPSAkKGZpbHRlci1vdXQgJChvcGVuc3NsX2RlcGVuZGVudF90YXJnZXRzKSwgJCh0YXJnZXRzXykpCityYW5fdGVzdHMgPSAkKGZpbHRlci1vdXQgJChvcGVuc3NsX2RlcGVuZGVudF9yYW5fdGVzdHMpLCAkKHJhbl90ZXN0c18pKQorZW5kaWYKKworZF90ZXN0X2ZsYWdzICs9IC13IC13aSAtTyAtcmVsZWFzZSAtaW5saW5lIC1JJCh0b3Bfc3JjZGlyKS9saWIvZC9zcmMgLUlnZW4tZCBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9kLyQoRF9MSUJfTkFNRSkKKworCithc3luY190ZXN0IGNsaWVudF9wb29sX3Rlc3QgdHJhbnNwb3J0X3Rlc3Q6ICU6ICUuZAorCSQoRE1EKSAkKGRfdGVzdF9mbGFncykgLW9mJEAgJF4KKworc2VyaWFsaXphdGlvbl9iZW5jaG1hcms6ICU6ICUuZCAkKGRlYnVnX3Byb3RvX2dlbikKKwkkKERNRCkgJChkX3Rlc3RfZmxhZ3MpIC1vZiRAICReCisKK3N0cmVzc190ZXN0X3NlcnZlcjogJTogJS5kIHRlc3RfdXRpbHMuZCAkKHN0cmVzc190ZXN0X2dlbikKKwkkKERNRCkgJChkX3Rlc3RfZmxhZ3MpIC1vZiRAICReCisKK3RocmlmdF90ZXN0X2NsaWVudDogJTogJS5kIHRocmlmdF90ZXN0X2NvbW1vbi5kICQodGhyaWZ0X3Rlc3RfZ2VuKQorCSQoRE1EKSAkKGRfdGVzdF9mbGFncykgLW9mJEAgJF4KKwordGhyaWZ0X3Rlc3Rfc2VydmVyOiAlOiAlLmQgdGhyaWZ0X3Rlc3RfY29tbW9uLmQgdGVzdF91dGlscy5kICQodGhyaWZ0X3Rlc3RfZ2VuKQorCSQoRE1EKSAkKGRfdGVzdF9mbGFncykgLW9mJEAgJF4KKworCisjIENlcnRpZmljYXRlIGdlbmVyYXRpb24gdGFyZ2V0cyAoZm9yIHRoZSBTU0wgdGVzdHMpLgorIyBDdXJyZW50bHksIHdlIGp1c3QgYXNzdW1lIHRoYXQgdGhlICJvcGVuc3NsIiB0b29sIGlzIG9uIHRoZSBwYXRoLCBjb3VsZCBiZQorIyByZXBsYWNlZCBieSBhIG1vcmUgZWxhYm9yYXRlIG1lY2hhbmlzbS4KKworc2VydmVyLWNlcnRpZmljYXRlLnBlbTogb3BlbnNzbC50ZXN0LmNuZgorCW9wZW5zc2wgcmVxIC1uZXcgLXg1MDkgLW5vZGVzIC1jb25maWcgb3BlbnNzbC50ZXN0LmNuZiBcCisJCS1vdXQgc2VydmVyLWNlcnRpZmljYXRlLnBlbQorCit0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbTogc2VydmVyLWNlcnRpZmljYXRlLnBlbQorCWNhdCBzZXJ2ZXItY2VydGlmaWNhdGUucGVtID4gJEAKKworY2hlY2stbG9jYWw6ICQodGFyZ2V0cykKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGdlbi1kICQodGFyZ2V0cykgJChhZGRzdWZmaXggLm8sICQodGFyZ2V0cykpCisKKworIyBUZXN0cyByYW4gYXMgcGFydCBvZiBtYWtlIGNoZWNrLgorCithc3luY190ZXN0X3J1bm5lci5zaDogYXN5bmNfdGVzdCB0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCit0aHJpZnRfdGVzdF9ydW5uZXIuc2g6IHRocmlmdF90ZXN0X2NsaWVudCB0aHJpZnRfdGVzdF9zZXJ2ZXIgXAorCXRydXN0ZWQtY2EtY2VydGlmaWNhdGUucGVtIHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0KKworVEVTVFMgPSAkKHJhbl90ZXN0cykKKworcHJlY3Jvc3M6ICQodGFyZ2V0cykKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kIGIvbGliL2QvdGVzdC9hc3luY190ZXN0LmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3NjVhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIGVuZm9yY2VkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgYXN5bmNfdGVzdDsKKworaW1wb3J0IGNvcmUuYXRvbWljOworaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb24gOiBDb25kaXRpb247CitpbXBvcnQgY29yZS5zeW5jLm11dGV4IDogTXV0ZXg7CitpbXBvcnQgY29yZS50aHJlYWQgOiBkdXIsIFRocmVhZCwgVGhyZWFkR3JvdXA7CitpbXBvcnQgc3RkLmNvbnYgOiB0ZXh0OworaW1wb3J0IHN0ZC5kYXRldGltZTsKK2ltcG9ydCBzdGQuZ2V0b3B0OworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBjb2xsZWN0RXhjZXB0aW9uLCBlbmZvcmNlOworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbSA6IFRhc2tQb29sOworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCBzdGQuc3RyaW5nOworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuYmFzZTsKK2ltcG9ydCB0aHJpZnQuYXN5bmMubGliZXZlbnQ7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuYXN5bmMuc3NsOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmFzeW5jX2NsaWVudDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnRfcG9vbDsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnNpbXBsZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc3NsOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKKwordmVyc2lvbiAoUG9zaXgpIHsKKyAgaW1wb3J0IGNvcmUuc3RkYy5zaWduYWw7CisgIGltcG9ydCBjb3JlLnN5cy5wb3NpeC5zaWduYWw7CisKKyAgLy8gRGlzYWJsZSBTSUdQSVBFIGJlY2F1c2UgU1NMIHNlcnZlciB3aWxsIHdyaXRlIHRvIGJyb2tlbiBzb2NrZXQgYWZ0ZXIKKyAgLy8gY2xpZW50IGRpc2Nvbm5lY3RlZCAoc2VlIFRTU0xTb2NrZXQgZG9jcykuCisgIHNoYXJlZCBzdGF0aWMgdGhpcygpIHsKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgIH0KK30KKworaW50ZXJmYWNlIEFzeW5jVGVzdCB7CisgIHN0cmluZyBlY2hvKHN0cmluZyB2YWx1ZSk7CisgIHN0cmluZyBkZWxheWVkRWNobyhzdHJpbmcgdmFsdWUsIGxvbmcgbWlsbGlzZWNvbmRzKTsKKworICB2b2lkIGZhaWwoc3RyaW5nIHJlYXNvbik7CisgIHZvaWQgZGVsYXllZEZhaWwoc3RyaW5nIHJlYXNvbiwgbG9uZyBtaWxsaXNlY29uZHMpOworCisgIGVudW0gbWV0aG9kTWV0YSA9IFsKKyAgICBUTWV0aG9kTWV0YSgiZmFpbCIsIFtdLCBbVEV4Y2VwdGlvbk1ldGEoImF0ZSIsIDEsICJBc3luY1Rlc3RFeGNlcHRpb24iKV0pLAorICAgIFRNZXRob2RNZXRhKCJkZWxheWVkRmFpbCIsIFtdLCBbVEV4Y2VwdGlvbk1ldGEoImF0ZSIsIDEsICJBc3luY1Rlc3RFeGNlcHRpb24iKV0pCisgIF07CisgIGFsaWFzIC5Bc3luY1Rlc3RFeGNlcHRpb24gQXN5bmNUZXN0RXhjZXB0aW9uOworfQorCitjbGFzcyBBc3luY1Rlc3RFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKKyAgc3RyaW5nIHJlYXNvbjsKKyAgbWl4aW4gVFN0cnVjdEhlbHBlcnMhKCk7Cit9CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIHVzaG9ydCBwb3J0ID0gOTA5MDsKKyAgdXNob3J0IG1hbmFnZXJDb3VudCA9IDI7CisgIHVzaG9ydCBzZXJ2ZXJzUGVyTWFuYWdlciA9IDU7CisgIHVzaG9ydCB0aHJlYWRzUGVyU2VydmVyID0gMTA7CisgIHVpbnQgaXRlcmF0aW9ucyA9IDEwOworICBib29sIHNzbDsKKyAgYm9vbCB0cmFjZTsKKworICBnZXRvcHQoYXJncywKKyAgICAiaXRlcmF0aW9ucyIsICZpdGVyYXRpb25zLAorICAgICJtYW5hZ2VycyIsICZtYW5hZ2VyQ291bnQsCisgICAgInBvcnQiLCAmcG9ydCwKKyAgICAic2VydmVycy1wZXItbWFuYWdlciIsICZzZXJ2ZXJzUGVyTWFuYWdlciwKKyAgICAic3NsIiwgJnNzbCwKKyAgICAidGhyZWFkcy1wZXItc2VydmVyIiwgJnRocmVhZHNQZXJTZXJ2ZXIsCisgICAgInRyYWNlIiwgJnRyYWNlLAorICApOworCisgIFRUcmFuc3BvcnRGYWN0b3J5IGNsaWVudFRyYW5zcG9ydEZhY3Rvcnk7CisgIFRTU0xDb250ZXh0IHNlcnZlclNTTENvbnRleHQ7CisgIGlmIChzc2wpIHsKKyAgICBhdXRvIGNsaWVudFNTTENvbnRleHQgPSBuZXcgVFNTTENvbnRleHQoKTsKKyAgICB3aXRoIChjbGllbnRTU0xDb250ZXh0KSB7CisgICAgICBjaXBoZXJzID0gIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCI7CisgICAgICBhdXRoZW50aWNhdGUgPSB0cnVlOworICAgICAgbG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIi4vdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0iKTsKKyAgICB9CisgICAgY2xpZW50VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQXN5bmNTU0xTb2NrZXRGYWN0b3J5KGNsaWVudFNTTENvbnRleHQpOworCisgICAgc2VydmVyU1NMQ29udGV4dCA9IG5ldyBUU1NMQ29udGV4dCgpOworICAgIHdpdGggKHNlcnZlclNTTENvbnRleHQpIHsKKyAgICAgIHNlcnZlclNpZGUgPSB0cnVlOworICAgICAgbG9hZENlcnRpZmljYXRlKCIuL3NlcnZlci1jZXJ0aWZpY2F0ZS5wZW0iKTsKKyAgICAgIGxvYWRQcml2YXRlS2V5KCIuL3NlcnZlci1wcml2YXRlLWtleS5wZW0iKTsKKyAgICAgIGNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY2xpZW50VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworICB9CisKKworICBhdXRvIHNlcnZlckNhbmNlbCA9IG5ldyBUQ2FuY2VsbGF0aW9uT3JpZ2luOworICBzY29wZShleGl0KSB7CisgICAgd3JpdGVsbigiVHJpZ2dlcmluZyBzZXJ2ZXIgc2h1dGRvd24uLi4iKTsKKyAgICBzZXJ2ZXJDYW5jZWwudHJpZ2dlcigpOworICAgIHdyaXRlbG4oImRvbmUuIik7CisgIH0KKworICBhdXRvIG1hbmFnZXJzID0gbmV3IFRMaWJldmVudEFzeW5jTWFuYWdlclttYW5hZ2VyQ291bnRdOworICBzY29wZSAoZXhpdCkgZm9yZWFjaCAocmVmIG07IG1hbmFnZXJzKSBkZXN0cm95KG0pOworCisgIGF1dG8gY2xpZW50c1RocmVhZHMgPSBuZXcgVGhyZWFkR3JvdXA7CisgIGZvcmVhY2ggKG1hbmFnZXJJbmRleCwgcmVmIG1hbmFnZXI7IG1hbmFnZXJzKSB7CisgICAgbWFuYWdlciA9IG5ldyBUTGliZXZlbnRBc3luY01hbmFnZXI7CisgICAgZm9yZWFjaCAoc2VydmVySW5kZXg7IDAgLi4gc2VydmVyc1Blck1hbmFnZXIpIHsKKyAgICAgIGF1dG8gY3VycmVudFBvcnQgPSBjYXN0KHVzaG9ydCkKKyAgICAgICAgKHBvcnQgKyBtYW5hZ2VySW5kZXggKiBzZXJ2ZXJzUGVyTWFuYWdlciArIHNlcnZlckluZGV4KTsKKworICAgICAgLy8gU3RhcnQgdGhlIHNlcnZlciBhbmQgd2FpdCB1bnRpbCBpdCBpcyB1cCBhbmQgcnVubmluZy4KKyAgICAgIGF1dG8gc2VydmluZ011dGV4ID0gbmV3IE11dGV4OworICAgICAgYXV0byBzZXJ2aW5nQ29uZGl0aW9uID0gbmV3IENvbmRpdGlvbihzZXJ2aW5nTXV0ZXgpOworICAgICAgYXV0byBoYW5kbGVyID0gbmV3IFByZVNlcnZlTm90aWZ5SGFuZGxlcihzZXJ2aW5nTXV0ZXgsIHNlcnZpbmdDb25kaXRpb24pOworICAgICAgc3luY2hyb25pemVkIChzZXJ2aW5nTXV0ZXgpIHsKKyAgICAgICAgKG5ldyBTZXJ2ZXJUaHJlYWQhVFNpbXBsZVNlcnZlcihjdXJyZW50UG9ydCwgc2VydmVyU1NMQ29udGV4dCwgdHJhY2UsCisgICAgICAgICAgc2VydmVyQ2FuY2VsLCBoYW5kbGVyKSkuc3RhcnQoKTsKKyAgICAgICAgc2VydmluZ0NvbmRpdGlvbi53YWl0KCk7CisgICAgICB9CisKKyAgICAgIC8vIFdlIG9ubHkgcnVuIHRoZSB0aW1pbmcgdGVzdHMgZm9yIHRoZSBmaXJzdCBzZXJ2ZXIgb24gZWFjaCBhc3luYworICAgICAgLy8gbWFuYWdlciwgc28gdGhhdCB3ZSBkb24ndCBnZXQgc3B1cmlvdXMgdGltaW5nIGVycm9ycyBiZWNhdWUgb2YKKyAgICAgIC8vIG9yZGVyaW5nIGlzc3Vlcy4KKyAgICAgIGF1dG8gcnVuVGltaW5nVGVzdHMgPSAoc2VydmVySW5kZXggPT0gMCk7CisKKyAgICAgIGF1dG8gYyA9IG5ldyBDbGllbnRzVGhyZWFkKG1hbmFnZXIsIGN1cnJlbnRQb3J0LCBjbGllbnRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICB0aHJlYWRzUGVyU2VydmVyLCBpdGVyYXRpb25zLCBydW5UaW1pbmdUZXN0cywgdHJhY2UpOworICAgICAgY2xpZW50c1RocmVhZHMuYWRkKGMpOworICAgICAgYy5zdGFydCgpOworICAgIH0KKyAgfQorICBjbGllbnRzVGhyZWFkcy5qb2luQWxsKCk7Cit9CisKK2NsYXNzIEFzeW5jVGVzdEhhbmRsZXIgOiBBc3luY1Rlc3QgeworICB0aGlzKGJvb2wgdHJhY2UpIHsKKyAgICB0cmFjZV8gPSB0cmFjZTsKKyAgfQorCisgIG92ZXJyaWRlIHN0cmluZyBlY2hvKHN0cmluZyB2YWx1ZSkgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBlY2hvKCIlcyIpYCwgdmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIG92ZXJyaWRlIHN0cmluZyBkZWxheWVkRWNobyhzdHJpbmcgdmFsdWUsIGxvbmcgbWlsbGlzZWNvbmRzKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmKGBkZWxheWVkRWNobygiJXMiLCAlcyBtcykuLi4gYCwgdmFsdWUsIG1pbGxpc2Vjb25kcyk7CisgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKG1pbGxpc2Vjb25kcykpOworICAgIGlmICh0cmFjZV8pIHdyaXRlbG4oInJldHVybmluZy4iKTsKKworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZmFpbChzdHJpbmcgcmVhc29uKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYGZhaWwoIiVzIilgLCByZWFzb24pOworICAgIGF1dG8gYXRlID0gbmV3IEFzeW5jVGVzdEV4Y2VwdGlvbjsKKyAgICBhdGUucmVhc29uID0gcmVhc29uOworICAgIHRocm93IGF0ZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgZGVsYXllZEZhaWwoc3RyaW5nIHJlYXNvbiwgbG9uZyBtaWxsaXNlY29uZHMpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWYoYGRlbGF5ZWRGYWlsKCIlcyIsICVzIG1zKS4uLiBgLCByZWFzb24sIG1pbGxpc2Vjb25kcyk7CisgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKG1pbGxpc2Vjb25kcykpOworICAgIGlmICh0cmFjZV8pIHdyaXRlbG4oInJldHVybmluZy4iKTsKKworICAgIGF1dG8gYXRlID0gbmV3IEFzeW5jVGVzdEV4Y2VwdGlvbjsKKyAgICBhdGUucmVhc29uID0gcmVhc29uOworICAgIHRocm93IGF0ZTsKKyAgfQorCitwcml2YXRlOgorICBib29sIHRyYWNlXzsKKyAgQXN5bmNUZXN0RXhjZXB0aW9uIGF0ZV87Cit9CisKK2NsYXNzIFByZVNlcnZlTm90aWZ5SGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICB0aGlzKE11dGV4IHNlcnZpbmdNdXRleCwgQ29uZGl0aW9uIHNlcnZpbmdDb25kaXRpb24pIHsKKyAgICBzZXJ2aW5nTXV0ZXhfID0gc2VydmluZ011dGV4OworICAgIHNlcnZpbmdDb25kaXRpb25fID0gc2VydmluZ0NvbmRpdGlvbjsKKyAgfQorCisgIHZvaWQgcHJlU2VydmUoKSB7CisgICAgc3luY2hyb25pemVkIChzZXJ2aW5nTXV0ZXhfKSB7CisgICAgICBzZXJ2aW5nQ29uZGl0aW9uXy5ub3RpZnlBbGwoKTsKKyAgICB9CisgIH0KKyAgVmFyaWFudCBjcmVhdGVDb250ZXh0KFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkgeyByZXR1cm4gVmFyaWFudC5pbml0OyB9CisgIHZvaWQgZGVsZXRlQ29udGV4dChWYXJpYW50IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkge30KKyAgdm9pZCBwcmVQcm9jZXNzKFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHt9CisKK3ByaXZhdGU6CisgIE11dGV4IHNlcnZpbmdNdXRleF87CisgIENvbmRpdGlvbiBzZXJ2aW5nQ29uZGl0aW9uXzsKK30KKworY2xhc3MgU2VydmVyVGhyZWFkKFNlcnZlclR5cGUpIDogVGhyZWFkIHsKKyAgdGhpcyh1c2hvcnQgcG9ydCwgVFNTTENvbnRleHQgc3NsQ29udGV4dCwgYm9vbCB0cmFjZSwKKyAgICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbiwgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIKKyAgKSB7CisgICAgcG9ydF8gPSBwb3J0OworICAgIHNzbENvbnRleHRfID0gc3NsQ29udGV4dDsKKyAgICB0cmFjZV8gPSB0cmFjZTsKKyAgICBjYW5jZWxsYXRpb25fID0gY2FuY2VsbGF0aW9uOworICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CisKKyAgICBzdXBlcigmcnVuKTsKKyAgfQorCisgIHZvaWQgcnVuKCkgeworICAgIFRTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0OworICAgIGlmIChzc2xDb250ZXh0XykgeworICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydF8sIHNzbENvbnRleHRfKTsKKyAgICB9IGVsc2UgeworICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydF8pOworICAgIH0KKyAgICBhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKyAgICBhdXRvIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpOworICAgIGF1dG8gcHJvY2Vzc29yID0gbmV3IFRTZXJ2aWNlUHJvY2Vzc29yIUFzeW5jVGVzdChuZXcgQXN5bmNUZXN0SGFuZGxlcih0cmFjZV8pKTsKKworICAgIGF1dG8gc2VydmVyID0gbmV3IFNlcnZlclR5cGUocHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBwcm90b2NvbEZhY3RvcnkpOworICAgIHNlcnZlci5ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXJfOworCisgICAgd3JpdGVmbG4oIlN0YXJ0aW5nIHNlcnZlciBvbiBwb3J0ICVzLi4uIiwgcG9ydF8pOworICAgIHNlcnZlci5zZXJ2ZShjYW5jZWxsYXRpb25fKTsKKyAgICB3cml0ZWZsbigiU2VydmVyIHRocmVhZCBvbiBwb3J0ICVzIGRvbmUuIiwgcG9ydF8pOworICB9CisKK3ByaXZhdGU6CisgIHVzaG9ydCBwb3J0XzsKKyAgYm9vbCB0cmFjZV87CisgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uXzsKKyAgVFNTTENvbnRleHQgc3NsQ29udGV4dF87CisgIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyXzsKK30KKworY2xhc3MgQ2xpZW50c1RocmVhZCA6IFRocmVhZCB7CisgIHRoaXMoVEFzeW5jU29ja2V0TWFuYWdlciBtYW5hZ2VyLCB1c2hvcnQgcG9ydCwgVFRyYW5zcG9ydEZhY3RvcnkgdGYsCisgICAgdXNob3J0IHRocmVhZHMsIHVpbnQgaXRlcmF0aW9ucywgYm9vbCBydW5UaW1pbmdUZXN0cywgYm9vbCB0cmFjZQorICApIHsKKyAgICBtYW5hZ2VyXyA9IG1hbmFnZXI7CisgICAgcG9ydF8gPSBwb3J0OworICAgIHRyYW5zcG9ydEZhY3RvcnlfID0gdGY7CisgICAgdGhyZWFkc18gPSB0aHJlYWRzOworICAgIGl0ZXJhdGlvbnNfID0gaXRlcmF0aW9uczsKKyAgICBydW5UaW1pbmdUZXN0c18gPSBydW5UaW1pbmdUZXN0czsKKyAgICB0cmFjZV8gPSB0cmFjZTsKKyAgICBzdXBlcigmcnVuKTsKKyAgfQorCisgIHZvaWQgcnVuKCkgeworICAgIGF1dG8gdHJhbnNwb3J0ID0gbmV3IFRBc3luY1NvY2tldChtYW5hZ2VyXywgImxvY2FsaG9zdCIsIHBvcnRfKTsKKworICAgIHsKKyAgICAgIGF1dG8gY2xpZW50ID0gbmV3IFRBc3luY0NsaWVudCFBc3luY1Rlc3QoCisgICAgICAgIHRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeV8sCisgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpCisgICAgICApOworICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIGF1dG8gY2xpZW50VGhyZWFkcyA9IG5ldyBUaHJlYWRHcm91cDsKKyAgICAgIGZvcmVhY2ggKGNsaWVudElkOyAwIC4uIHRocmVhZHNfKSB7CisgICAgICAgIGNsaWVudFRocmVhZHMuY3JlYXRlKHsKKyAgICAgICAgICBhdXRvIGMgPSBjbGllbnRJZDsKKyAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgZm9yZWFjaCAoaTsgMCAuLiBpdGVyYXRpb25zXykgeworICAgICAgICAgICAgICBpbW11dGFibGUgaWQgPSB0ZXh0KHBvcnRfLCAiOiIsIGMsICI6IiwgaSk7CisKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBDYWxsaW5nIGVjaG8oIiVzIikuLi4gYCwgaWQpOworICAgICAgICAgICAgICAgIGF1dG8gYSA9IGNsaWVudC5lY2hvKGlkKTsKKyAgICAgICAgICAgICAgICBlbmZvcmNlKGEgPT0gaWQpOworICAgICAgICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBlY2hvKCIlcyIpIGRvbmUuYCwgaWQpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGBDYWxsaW5nIGZhaWwoIiVzIikuLi4gYCwgaWQpOworICAgICAgICAgICAgICAgIGF1dG8gYSA9IGNhc3QoQXN5bmNUZXN0RXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24oY2xpZW50LmZhaWwoaWQpLndhaXRHZXQoKSk7CisgICAgICAgICAgICAgICAgZW5mb3JjZShhICYmIGEucmVhc29uID09IGlkKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgZmFpbCgiJXMiKSBkb25lLmAsIGlkKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH0oKSk7CisgICAgICB9CisgICAgICBjbGllbnRUaHJlYWRzLmpvaW5BbGwoKTsKKyAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgIH0KKworICAgIGlmIChydW5UaW1pbmdUZXN0c18pIHsKKyAgICAgIGF1dG8gY2xpZW50ID0gbmV3IFRBc3luY0NsaWVudCFBc3luY1Rlc3QoCisgICAgICAgIHRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeV8sCisgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IVRCdWZmZXJlZFRyYW5zcG9ydAorICAgICAgKTsKKworICAgICAgLy8gVGVtcG9yYXJpbHkgcmVkaXJlY3QgZXJyb3IgbG9ncyB0byBzdGRvdXQsIGFzIFNTTCBlcnJvcnMgb24gdGhlIHNlcnZlcgorICAgICAgLy8gc2lkZSBhcmUgZXhwZWN0ZWQgd2hlbiB0aGUgY2xpZW50IHRlcm1pbmF0ZXMgYWJ1cnB0bHkgKGFzIGlzIHRoZSBjYXNlCisgICAgICAvLyBpbiB0aGUgdGltZW91dCB0ZXN0KS4KKyAgICAgIGF1dG8gb2xkRXJyb3JMb2dTaW5rID0gZ19lcnJvckxvZ1Npbms7CisgICAgICBnX2Vycm9yTG9nU2luayA9IGdfaW5mb0xvZ1Npbms7CisgICAgICBzY29wZSAoZXhpdCkgZ19lcnJvckxvZ1NpbmsgPSBvbGRFcnJvckxvZ1Npbms7CisKKyAgICAgIGZvcmVhY2ggKGk7IDAgLi4gaXRlcmF0aW9uc18pIHsKKyAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKworICAgICAgICBpbW11dGFibGUgaWQgPSB0ZXh0KHBvcnRfLCAiOiIsIGkpOworCisgICAgICAgIHsKKyAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgQ2FsbGluZyBkZWxheWVkRWNobygiJXMiLCAxMDAgbXMpLi4uYCwgaWQpOworICAgICAgICAgIGF1dG8gYSA9IGNsaWVudC5kZWxheWVkRWNobyhpZCwgMTAwKTsKKyAgICAgICAgICBlbmZvcmNlKCFhLmNvbXBsZXRpb24ud2FpdChkdXIhInVzZWNzIigxKSksCisgICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgc3VjY2VlZGVkIGVhcmx5ICgiLCBhLmdldCgpLCAiLCAiLCBpZCwgIikuIikpOworICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGEuZ2V0KCksICIsICIsIGlkLCAiKS4iKSk7CisgICAgICAgICAgZW5mb3JjZShhLmNvbXBsZXRpb24ud2FpdChkdXIhIm1zZWNzIigyMDApKSwKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBkaWRuJ3Qgc3VjY2VlZCBhcyBleHBlY3RlZCAoIiwgaWQsICIpLiIpKTsKKyAgICAgICAgICBlbmZvcmNlKGEuZ2V0KCkgPT0gaWQpOworICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKGAuLi4gZGVsYXllZEVjaG8oIiVzIikgZG9uZS5gLCBpZCk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYENhbGxpbmcgZGVsYXllZEZhaWwoIiVzIiwgMTAwIG1zKS4uLiBgLCBpZCk7CisgICAgICAgICAgYXV0byBhID0gY2xpZW50LmRlbGF5ZWRGYWlsKGlkLCAxMDApOworICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGlkLCAiLCAiLCBjb2xsZWN0RXhjZXB0aW9uKGEuZ2V0KCkpLCAiKS4iKSk7CisgICAgICAgICAgZW5mb3JjZSghYS5jb21wbGV0aW9uLndhaXQoZHVyISJ1c2VjcyIoMSkpLAorICAgICAgICAgICAgdGV4dCgid2FpdCgpIHN1Y2NlZWRlZCBlYXJseSAoIiwgaWQsICIsICIsIGNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSksICIpLiIpKTsKKyAgICAgICAgICBlbmZvcmNlKGEuY29tcGxldGlvbi53YWl0KGR1ciEibXNlY3MiKDIwMCkpLAorICAgICAgICAgICAgdGV4dCgid2FpdCgpIGRpZG4ndCBzdWNjZWVkIGFzIGV4cGVjdGVkICgiLCBpZCwgIikuIikpOworICAgICAgICAgIGF1dG8gZSA9IGNhc3QoQXN5bmNUZXN0RXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSk7CisgICAgICAgICAgZW5mb3JjZShlICYmIGUucmVhc29uID09IGlkKTsKKyAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgLi4uIGRlbGF5ZWRGYWlsKCIlcyIpIGRvbmUuYCwgaWQpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgIHRyYW5zcG9ydC5yZWN2VGltZW91dCA9IGR1ciEibXNlY3MiKDUwKTsKKworICAgICAgICAgIGlmICh0cmFjZV8pIHdyaXRlKGBDYWxsaW5nIGRlbGF5ZWRFY2hvKCJzb2NrZXRUaW1lb3V0IiwgMTAwIG1zKS4uLiBgKTsKKyAgICAgICAgICBhdXRvIGEgPSBjbGllbnQuZGVsYXllZEVjaG8oInNvY2tldFRpbWVvdXQiLCAxMDApOworICAgICAgICAgIGF1dG8gZSA9IGNhc3QoVFRyYW5zcG9ydEV4Y2VwdGlvbiljb2xsZWN0RXhjZXB0aW9uKGEud2FpdEdldCgpKTsKKyAgICAgICAgICBlbmZvcmNlKGUsIHRleHQoIk9wZXJhdGlvbiBkaWRuJ3QgZmFpbCBhcyBleHBlY3RlZCAoIiwgaWQsICIpLiIpKTsKKyAgICAgICAgICBlbmZvcmNlKGUudHlwZSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuVElNRURfT1VULAorICAgICAgICAgICAgdGV4dCgiV3JvbmcgdGltZW91dCBleGNlcHRpb24gdHlwZSAoIiwgaWQsICIpOiAiLCBlKSk7CisgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVsbihgdGltZWQgb3V0IGFzIGV4cGVjdGVkLmApOworCisgICAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgc2VydmVyIHRocmVhZCByZXNldCBiZWZvcmUgdGhlIG5leHQgaXRlcmF0aW9uLgorICAgICAgICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIig1MCkpOworICAgICAgICAgIHRyYW5zcG9ydC5yZWN2VGltZW91dCA9IGR1ciEiaG5zZWNzIigwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgfQorICAgIH0KKworICAgIHdyaXRlZmxuKCJDbGllbnRzIHRocmVhZCBmb3IgcG9ydCAlcyBkb25lLiIsIHBvcnRfKTsKKyAgfQorCisgIFRBc3luY1NvY2tldE1hbmFnZXIgbWFuYWdlcl87CisgIHVzaG9ydCBwb3J0XzsKKyAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeV87CisgIHVzaG9ydCB0aHJlYWRzXzsKKyAgdWludCBpdGVyYXRpb25zXzsKKyAgYm9vbCBydW5UaW1pbmdUZXN0c187CisgIGJvb2wgdHJhY2VfOworfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaCBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdF9ydW5uZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Q1MDdlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdF9ydW5uZXIuc2gKQEAgLTAsMCArMSwyOCBAQAorIyEvYmluL2Jhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0NVUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorCisjIFJ1bnMgdGhlIGFzeW5jIHRlc3QgaW4gYm90aCBTU0wgYW5kIG5vbi1TU0wgbW9kZS4KKyR7Q1VSfS9hc3luY190ZXN0ID4gL2Rldi9udWxsIHx8IGV4aXQgMQorZWNobyAiTm9uLVNTTCB0ZXN0cyBkb25lLiIKKyR7Q1VSfS9hc3luY190ZXN0IC0tc3NsID4gL2Rldi9udWxsIHx8IGV4aXQgMQorZWNobyAiU1NMIHRlc3RzIGRvbmUuIgpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQgYi9saWIvZC90ZXN0L2NsaWVudF9wb29sX3Rlc3QuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjRjOTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSBjbGllbnRfcG9vbF90ZXN0OworCitpbXBvcnQgY29yZS5zeW5jLnNlbWFwaG9yZSA6IFNlbWFwaG9yZTsKK2ltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbiwgZHVyOworaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkOworaW1wb3J0IHN0ZC5hbGdvcml0aG07CitpbXBvcnQgc3RkLmFycmF5OworaW1wb3J0IHN0ZC5jb252OworaW1wb3J0IHN0ZC5leGNlcHRpb247CitpbXBvcnQgc3RkLmdldG9wdDsKK2ltcG9ydCBzdGQucmFuZ2U7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC50eXBlY29uczsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50OworaW1wb3J0IHRocmlmdC5hc3luYy5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYXN5bmNfY2xpZW50X3Bvb2w7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudF9wb29sOworaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnNpbXBsZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOworaW1wb3J0IHRocmlmdC51dGlsLmZ1dHVyZTsKKworLy8gV2UgdXNlIHRoaXMgYXMgb3VyIFJQQy1sYXllciBleGNlcHRpb24gaGVyZSB0byBtYWtlIHN1cmUgc29ja2V0L+KApiBwcm9ibGVtcworLy8gKHRoYXQgd291bGQgdXN1YWxseSBjb25zaWRlcmVkIHRvIGJlIFJQQyBsYXllciBmYXVsdHMpIGNhdXNlIHRoZSB0ZXN0cyB0bworLy8gZmFpbCwgZXZlbiB0aG91Z2ggd2UgYXJlIHRlc3RpbmcgdGhlIFJQQyBleGNlcHRpb24gaGFuZGxpbmcuCitjbGFzcyBUZXN0U2VydmljZUV4Y2VwdGlvbiA6IFRFeGNlcHRpb24geworICBpbnQgcG9ydDsKK30KKworaW50ZXJmYWNlIFRlc3RTZXJ2aWNlIHsKKyAgaW50IGdldFBvcnQoKTsKKyAgYWxpYXMgLlRlc3RTZXJ2aWNlRXhjZXB0aW9uIFRlc3RTZXJ2aWNlRXhjZXB0aW9uOworICBlbnVtIG1ldGhvZE1ldGEgPSBbVE1ldGhvZE1ldGEoImdldFBvcnQiLCBbXSwKKyAgICBbVEV4Y2VwdGlvbk1ldGEoImEiLCAxLCAiVGVzdFNlcnZpY2VFeGNlcHRpb24iKV0pXTsKK30KKworLy8gVXNlIHNvbWUgZGVyaXZlZCBzZXJ2aWNlLCBqdXN0IHRvIGNoZWNrIHRoYXQgdGhlIHBvb2xzIGhhbmRsZSBpbmhlcml0YW5jZQorLy8gY29ycmVjdGx5LgoraW50ZXJmYWNlIEV4VGVzdFNlcnZpY2UgOiBUZXN0U2VydmljZSB7CisgIGludFtdIGdldFBvcnRJbkFycmF5KCk7CisgIGVudW0gbWV0aG9kTWV0YSA9IFtUTWV0aG9kTWV0YSgiZ2V0UG9ydEluQXJyYXkiLCBbXSwKKyAgICBbVEV4Y2VwdGlvbk1ldGEoImEiLCAxLCAiVGVzdFNlcnZpY2VFeGNlcHRpb24iKV0pXTsKK30KKworY2xhc3MgRXhUZXN0SGFuZGxlciA6IEV4VGVzdFNlcnZpY2UgeworICB0aGlzKHVzaG9ydCBwb3J0LCBEdXJhdGlvbiBkZWxheSwgYm9vbCBmYWlsaW5nLCBib29sIHRyYWNlKSB7CisgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CisgICAgdGhpcy5mYWlsaW5nID0gZmFpbGluZzsKKyAgICB0aGlzLnRyYWNlID0gdHJhY2U7CisgIH0KKworICBvdmVycmlkZSBpbnQgZ2V0UG9ydCgpIHsKKyAgICBpZiAodHJhY2UpIHsKKyAgICAgIHN0ZGVyci53cml0ZWZsbigiZ2V0UG9ydCgpIGNhbGxlZCBvbiAlcyAoZGVsYXk6ICVzLCBmYWlsaW5nOiAlcykiLCBwb3J0LAorICAgICAgICBkZWxheSwgZmFpbGluZyk7CisgICAgfQorICAgIHNsZWVwKCk7CisgICAgZmFpbElmRW5hYmxlZCgpOworICAgIHJldHVybiBwb3J0OworICB9CisKKyAgb3ZlcnJpZGUgaW50W10gZ2V0UG9ydEluQXJyYXkoKSB7CisgICAgcmV0dXJuIFtnZXRQb3J0KCldOworICB9CisKKyAgdXNob3J0IHBvcnQ7CisgIER1cmF0aW9uIGRlbGF5OworICBib29sIGZhaWxpbmc7CisgIGJvb2wgdHJhY2U7CisKK3ByaXZhdGU6CisgIHZvaWQgc2xlZXAoKSB7CisgICAgaWYgKGRlbGF5ID4gZHVyISJobnNlY3MiKDApKSBUaHJlYWQuc2xlZXAoZGVsYXkpOworICB9CisKKyAgdm9pZCBmYWlsSWZFbmFibGVkKCkgeworICAgIGlmICghZmFpbGluZykgcmV0dXJuOworCisgICAgYXV0byBlID0gbmV3IFRlc3RTZXJ2aWNlRXhjZXB0aW9uOworICAgIGUucG9ydCA9IHBvcnQ7CisgICAgdGhyb3cgZTsKKyAgfQorfQorCitjbGFzcyBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgdGhpcyhTZW1hcGhvcmUgc2VtKSB7CisgICAgc2VtXyA9IHNlbTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgcHJlU2VydmUoKSB7CisgICAgc2VtXy5ub3RpZnkoKTsKKyAgfQorCisgIFZhcmlhbnQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHsgcmV0dXJuIFZhcmlhbnQuaW5pdDsgfQorICB2b2lkIGRlbGV0ZUNvbnRleHQoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHt9CisgIHZvaWQgcHJlUHJvY2VzcyhWYXJpYW50IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7fQorCitwcml2YXRlOgorICBTZW1hcGhvcmUgc2VtXzsKK30KKworY2xhc3MgU2VydmVyVGhyZWFkIDogVGhyZWFkIHsKKyAgdGhpcyhFeFRlc3RIYW5kbGVyIGhhbmRsZXIsIFNlcnZlclByZVNlcnZlSGFuZGxlciBzZXJ2ZXJIYW5kbGVyLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbikgeworICAgIHN1cGVyKCZydW4pOworICAgIGhhbmRsZXJfID0gaGFuZGxlcjsKKyAgICBjYW5jZWxsYXRpb25fID0gY2FuY2VsbGF0aW9uOworICAgIHNlcnZlckhhbmRsZXJfID0gc2VydmVySGFuZGxlcjsKKyAgfQorcHJpdmF0ZToKKyAgdm9pZCBydW4oKSB7CisgICAgdHJ5IHsKKyAgICAgIGF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhKCk7CisgICAgICBhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciFFeFRlc3RTZXJ2aWNlKGhhbmRsZXJfKTsKKyAgICAgIGF1dG8gc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoaGFuZGxlcl8ucG9ydCk7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnQucmVjdlRpbWVvdXQgPSBkdXIhInNlY29uZHMiKDMpOworICAgICAgYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CisKKyAgICAgIGF1dG8gc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgICAgICBzZXJ2ZXIuZXZlbnRIYW5kbGVyID0gc2VydmVySGFuZGxlcl87CisgICAgICBzZXJ2ZXIuc2VydmUoY2FuY2VsbGF0aW9uXyk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHdyaXRlZmxuKCJTZXJ2ZXIgdGhyZWFkIG9uIHBvcnQgJXMgZmFpbGVkOiAlcyIsIGhhbmRsZXJfLnBvcnQsIGUpOworICAgIH0KKyAgfQorCisgIEV4VGVzdEhhbmRsZXIgaGFuZGxlcl87CisgIFNlcnZlclByZVNlcnZlSGFuZGxlciBzZXJ2ZXJIYW5kbGVyXzsKKyAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb25fOworfQorCit2b2lkIG1haW4oc3RyaW5nW10gYXJncykgeworICBib29sIHRyYWNlOworICB1c2hvcnQgcG9ydCA9IDkwOTA7CisgIGdldG9wdChhcmdzLCAicG9ydCIsICZwb3J0LCAidHJhY2UiLCAmdHJhY2UpOworCisgIGF1dG8gc2VydmVyQ2FuY2VsbGF0aW9uID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW47CisgIHNjb3BlIChleGl0KSBzZXJ2ZXJDYW5jZWxsYXRpb24udHJpZ2dlcigpOworCisgIGltbXV0YWJsZSBwb3J0cyA9IGNhc3QoaW1tdXRhYmxlKWFycmF5KG1hcCEiY2FzdCh1c2hvcnQpYSIoaW90YShwb3J0LCBwb3J0ICsgNikpKTsKKworICAvLyBzZW1hcGhvcmUgdGhhdCB3aWxsIGJlIGluY3JlbWVudGVkIHdoZW5ldmVyIGVhY2ggc2VydmVyIHRocmVhZCBoYXMgYm91bmQgYW5kIHN0YXJ0ZWQgbGlzdGVuaW5nCisgIFNlbWFwaG9yZSBzZW0gPSBuZXcgU2VtYXBob3JlKDApOworCit2ZXJzaW9uIChub25lKSB7CisgIC8vIENhbm5vdCB1c2UgdGhpcyBkdWUgdG8gbXVsdGlwbGUgRE1EIEBAQlVHQEBzOgorICAvLyAxLiDCu2Z1bmN0aW9uIEQgbWFpbiBpcyBhIG5lc3RlZCBmdW5jdGlvbiBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYXJyYXnCqworICAvLyAgICB3aGVuIGNhbGxpbmcgYXJyYXkoKSBvbiB0aGUgcmVzdWx0IG9mIHRoZSBvdXRlciBtYXAoKSDigJMgd291bGQgaGF2ZSB0bworICAvLyAgICBtYW51YWxseSBkbyB0aGUgZWFnZXIgZXZhbHVhdGlvbi9hcnJheSBjb252ZXJzaW9uLgorICAvLyAyLiDCu1ppcC5vcFNsaWNlIGNhbm5vdCBnZXQgZnJhbWUgcG9pbnRlciB0byBtYXDCqyBmb3IgdGhlIGRlbGF5IGFyZ3VtZW50LAorICAvLyAgICBjYW4gYmUgd29ya2VkIGFyb3VuZCBieSBjYWxsaW5nIGFycmF5KCkgb24gdGhlIG1hcCByZXN1bHQgZmlyc3QuCisgIC8vIDMuIEV2ZW4gd2hlbiB1c2luZyB0aGUgd29ya2Fyb3VuZHMgZm9yIHRoZSBsYXN0IHR3byBwb2ludHMsIHRoZSBETUQtYnVpbHQKKyAgLy8gICAgZXhlY3V0YWJsZSBjcmFzaGVzIHdoZW4gYnVpbGRpbmcgd2l0aG91dCAoc2ljISkgaW5saW5pbmcgZW5hYmxlZCwKKyAgLy8gICAgdGhlIGJhY2t0cmFjZSBwb2ludHMgaW50byB0aGUgZmlyc3QgZGVsZWdhdGUgbGl0ZXJhbC4KKyAgYXV0byBoYW5kbGVycyA9IGFycmF5KG1hcCEoKGFyZ3MpeworICAgIHJldHVybiBuZXcgRXhUZXN0SGFuZGxlcihhcmdzLl8wLCBhcmdzLl8xLCBhcmdzLl8yLCB0cmFjZSk7CisgIH0pKHppcCgKKyAgICBwb3J0cywKKyAgICBtYXAhKChhKXsgcmV0dXJuIGR1ciFgbXNlY3NgKGEpOyB9KShbMSwgMTAsIDEwMCwgMSwgMTAsIDEwMF0pLAorICAgIFtmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlXQorICApKSk7Cit9IGVsc2UgeworICBhdXRvIGhhbmRsZXJzID0gWworICAgIG5ldyBFeFRlc3RIYW5kbGVyKGNhc3QodXNob3J0KShwb3J0ICsgMCksIGR1ciEibXNlY3MiKDEpLCBmYWxzZSwgdHJhY2UpLAorICAgIG5ldyBFeFRlc3RIYW5kbGVyKGNhc3QodXNob3J0KShwb3J0ICsgMSksIGR1ciEibXNlY3MiKDEwKSwgZmFsc2UsIHRyYWNlKSwKKyAgICBuZXcgRXhUZXN0SGFuZGxlcihjYXN0KHVzaG9ydCkocG9ydCArIDIpLCBkdXIhIm1zZWNzIigxMDApLCBmYWxzZSwgdHJhY2UpLAorICAgIG5ldyBFeFRlc3RIYW5kbGVyKGNhc3QodXNob3J0KShwb3J0ICsgMyksIGR1ciEibXNlY3MiKDEpLCB0cnVlLCB0cmFjZSksCisgICAgbmV3IEV4VGVzdEhhbmRsZXIoY2FzdCh1c2hvcnQpKHBvcnQgKyA0KSwgZHVyISJtc2VjcyIoMTApLCB0cnVlLCB0cmFjZSksCisgICAgbmV3IEV4VGVzdEhhbmRsZXIoY2FzdCh1c2hvcnQpKHBvcnQgKyA1KSwgZHVyISJtc2VjcyIoMTAwKSwgdHJ1ZSwgdHJhY2UpCisgIF07Cit9CisKKyAgLy8gRmlyZSB1cCB0aGUgc2VydmVyIHRocmVhZHMuCisgIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAobmV3IFNlcnZlclRocmVhZChoLCBuZXcgU2VydmVyUHJlU2VydmVIYW5kbGVyKHNlbSksIHNlcnZlckNhbmNlbGxhdGlvbikpLnN0YXJ0KCk7CisKKyAgLy8gd2FpdCB1bnRpbCBhbGwgdGhlIGhhbmRsZXJzIHNpZ25hbCB0aGF0IHRoZXkncmUgcmVhZHkgdG8gc2VydmUKKyAgZm9yZWFjaCAoaDsgaGFuZGxlcnMpIChzZW0ud2FpdChkdXIhYHNlY29uZHNgKDEpKSk7CisKKyAgc3luY0NsaWVudFBvb2xUZXN0KHBvcnRzLCBoYW5kbGVycyk7CisgIGFzeW5jQ2xpZW50UG9vbFRlc3QocG9ydHMsIGhhbmRsZXJzKTsKKyAgYXN5bmNGYXN0ZXN0Q2xpZW50UG9vbFRlc3QocG9ydHMsIGhhbmRsZXJzKTsKKyAgYXN5bmNBZ2dyZWdhdG9yVGVzdChwb3J0cywgaGFuZGxlcnMpOworfQorCisKK3ZvaWQgc3luY0NsaWVudFBvb2xUZXN0KGNvbnN0KHVzaG9ydClbXSBwb3J0cywgRXhUZXN0SGFuZGxlcltdIGhhbmRsZXJzKSB7CisgIGF1dG8gY2xpZW50cyA9IGFycmF5KG1hcCEoKGEpeworICAgIHJldHVybiBjYXN0KFRDbGllbnRCYXNlIUV4VGVzdFNlcnZpY2UpdENsaWVudCFFeFRlc3RTZXJ2aWNlKAorICAgICAgdEJpbmFyeVByb3RvY29sKG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBhKSkKKyAgICApOworICB9KShwb3J0cykpOworCisgIHNjb3BlKGV4aXQpIGZvcmVhY2ggKGM7IGNsaWVudHMpIGMub3V0cHV0UHJvdG9jb2wudHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIHRoZSBmaXJzdCBjbGllbnQgc3VjY2VlZHMuCisgIHsKKyAgICBlbmZvcmNlKG1ha2VQb29sKGNsaWVudHMpLmdldFBvcnQoKSA9PSBwb3J0c1swXSk7CisgIH0KKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgYWxsIGNsaWVudHMgZmFpbC4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VQb29sKGNsaWVudHNbMyAuLiAkXSk7CisgICAgYXV0byBlID0gY2FzdChUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwb29sLmdldFBvcnQoKSk7CisgICAgZW5mb3JjZShlKTsKKyAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pZS5leGNlcHRpb25zKSwKKyAgICAgIHBvcnRzWzMgLi4gJF0pKTsKKyAgfQorCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSB0aGUgZmlyc3QgY2xpZW50cyBmYWlsLCBidXQgYSBsYXRlciBvbmUgc3VjY2VlZHMuCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlUG9vbChjbGllbnRzWzMgLi4gJF0gfiBjbGllbnRzWzAgLi4gM10pOworICAgIGVuZm9yY2UocG9vbC5nZXRQb3J0SW5BcnJheSgpID09IFtwb3J0c1swXV0pOworICB9CisKKyAgLy8gTWFrZSBzdXJlIGEgY2xpZW50IGlzIHByb3Blcmx5IGRlYWN0aXZhdGVkIHdoZW4gaXQgaGFzIGZhaWxlZCB0b28gb2Z0ZW4uCisgIHsKKyAgICBhdXRvIHBvb2wgPSBtYWtlUG9vbChjbGllbnRzKTsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMTsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUR1cmF0aW9uID0gZHVyISJtc2VjcyIoNTApOworCisgICAgaGFuZGxlcnNbMF0uZmFpbGluZyA9IHRydWU7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1sxXSk7CisKKyAgICBoYW5kbGVyc1swXS5mYWlsaW5nID0gZmFsc2U7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1sxXSk7CisKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoNTApKTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydCgpID09IHBvcnRzWzBdKTsKKyAgfQorfQorCithdXRvIG1ha2VQb29sKFRDbGllbnRCYXNlIUV4VGVzdFNlcnZpY2VbXSBjbGllbnRzKSB7CisgIGF1dG8gcCA9IHRDbGllbnRQb29sKGNsaWVudHMpOworICBwLnBlcm11dGVDbGllbnRzID0gZmFsc2U7CisgIHAucnBjRmF1bHRGaWx0ZXIgPSAoRXhjZXB0aW9uIGUpIHsKKyAgICByZXR1cm4gKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb24pZSAhaXMgbnVsbCk7CisgIH07CisgIHJldHVybiBwOworfQorCisKK3ZvaWQgYXN5bmNDbGllbnRQb29sVGVzdChjb25zdCh1c2hvcnQpW10gcG9ydHMsIEV4VGVzdEhhbmRsZXJbXSBoYW5kbGVycykgeworICBhdXRvIG1hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworICBzY29wZSAoZXhpdCkgbWFuYWdlci5zdG9wKGR1ciEiaG5zZWNzIigwKSk7CisKKyAgYXV0byBjbGllbnRzID0gbWFrZUFzeW5jQ2xpZW50cyhtYW5hZ2VyLCBwb3J0cyk7CisgIHNjb3BlKGV4aXQpIGZvcmVhY2ggKGM7IGNsaWVudHMpIGMudHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIHRoZSBmaXJzdCBjbGllbnQgc3VjY2VlZHMuCisgIHsKKyAgICBlbmZvcmNlKG1ha2VBc3luY1Bvb2woY2xpZW50cykuZ2V0UG9ydCgpID09IHBvcnRzWzBdKTsKKyAgfQorCisgIC8vIFRyeSB0aGUgY2FzZSB3aGVyZSBhbGwgY2xpZW50cyBmYWlsLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZUFzeW5jUG9vbChjbGllbnRzWzMgLi4gJF0pOworICAgIGF1dG8gZSA9IGNhc3QoVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24ocG9vbC5nZXRQb3J0KCkud2FpdEdldCgpKTsKKyAgICBlbmZvcmNlKGUpOworICAgIGVuZm9yY2UoZXF1YWwobWFwISJhLnBvcnQiKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb25bXSllLmV4Y2VwdGlvbnMpLAorICAgICAgcG9ydHNbMyAuLiAkXSkpOworICB9CisKKyAgLy8gVHJ5IHRoZSBjYXNlIHdoZXJlIHRoZSBmaXJzdCBjbGllbnRzIGZhaWwsIGJ1dCBhIGxhdGVyIG9uZSBzdWNjZWVkcy4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VBc3luY1Bvb2woY2xpZW50c1szIC4uICRdIH4gY2xpZW50c1swIC4uIDNdKTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydEluQXJyYXkoKSA9PSBbcG9ydHNbMF1dKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSBhIGNsaWVudCBpcyBwcm9wZXJseSBkZWFjdGl2YXRlZCB3aGVuIGl0IGhhcyBmYWlsZWQgdG9vIG9mdGVuLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZUFzeW5jUG9vbChjbGllbnRzKTsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMTsKKyAgICBwb29sLmZhdWx0RGlzYWJsZUR1cmF0aW9uID0gZHVyISJtc2VjcyIoNTApOworCisgICAgaGFuZGxlcnNbMF0uZmFpbGluZyA9IHRydWU7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1sxXSk7CisKKyAgICBoYW5kbGVyc1swXS5mYWlsaW5nID0gZmFsc2U7CisgICAgZW5mb3JjZShwb29sLmdldFBvcnQoKSA9PSBwb3J0c1sxXSk7CisKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoNTApKTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydCgpID09IHBvcnRzWzBdKTsKKyAgfQorfQorCithdXRvIG1ha2VBc3luY1Bvb2woVEFzeW5jQ2xpZW50QmFzZSFFeFRlc3RTZXJ2aWNlW10gY2xpZW50cykgeworICBhdXRvIHAgPSB0QXN5bmNDbGllbnRQb29sKGNsaWVudHMpOworICBwLnBlcm11dGVDbGllbnRzID0gZmFsc2U7CisgIHAucnBjRmF1bHRGaWx0ZXIgPSAoRXhjZXB0aW9uIGUpIHsKKyAgICByZXR1cm4gKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb24pZSAhaXMgbnVsbCk7CisgIH07CisgIHJldHVybiBwOworfQorCithdXRvIG1ha2VBc3luY0NsaWVudHMoVExpYmV2ZW50QXN5bmNNYW5hZ2VyIG1hbmFnZXIsIGluIHVzaG9ydFtdIHBvcnRzKSB7CisgIC8vIERNRCBAQEJVR0BAIHdvcmthcm91bmQ6IFVzaW5nIGFycmF5IG9uIHRoZSBsYXp5SGFuZGxlcnMgbWFwIHJlc3VsdCBsZWFkcworICAvLyB0byDCu2Z1bmN0aW9uIEQgbWFpbiBpcyBhIG5lc3RlZCBmdW5jdGlvbiBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYXJyYXnCqy4KKyAgLy8gVGh1cywgd2UgbWFudWFsbHkgZG8gdGhlIGFycmF5IGNvbnZlcnNpb24uCisgIGF1dG8gbGF6eUNsaWVudHMgPSBtYXAhKChhKXsKKyAgICByZXR1cm4gbmV3IFRBc3luY0NsaWVudCFFeFRlc3RTZXJ2aWNlKAorICAgICAgbmV3IFRBc3luY1NvY2tldChtYW5hZ2VyLCAiMTI3LjAuMC4xIiwgYSksCisgICAgICBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IShUQnVmZmVyZWRUcmFuc3BvcnQpCisgICAgKTsKKyAgfSkocG9ydHMpOworICBUQXN5bmNDbGllbnRCYXNlIUV4VGVzdFNlcnZpY2VbXSBjbGllbnRzOworICBmb3JlYWNoIChjOyBsYXp5Q2xpZW50cykgY2xpZW50cyB+PSBjOworICByZXR1cm4gY2xpZW50czsKK30KKworCit2b2lkIGFzeW5jRmFzdGVzdENsaWVudFBvb2xUZXN0KGNvbnN0KHVzaG9ydClbXSBwb3J0cywgRXhUZXN0SGFuZGxlcltdIGhhbmRsZXJzKSB7CisgIGF1dG8gbWFuYWdlciA9IG5ldyBUTGliZXZlbnRBc3luY01hbmFnZXI7CisgIHNjb3BlIChleGl0KSBtYW5hZ2VyLnN0b3AoZHVyISJobnNlY3MiKDApKTsKKworICBhdXRvIGNsaWVudHMgPSBtYWtlQXN5bmNDbGllbnRzKG1hbmFnZXIsIHBvcnRzKTsKKyAgc2NvcGUoZXhpdCkgZm9yZWFjaCAoYzsgY2xpZW50cykgYy50cmFuc3BvcnQuY2xvc2UoKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIGZhc3Rlc3QgY2xpZW50IHdpbnMsIGV2ZW4gaWYgdGhleSBhcmUgY2FsbGVkIGluIHNvbWUgb3RoZXIKKyAgLy8gb3JkZXIuCisgIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1ha2VBc3luY0Zhc3Rlc3RQb29sKGFycmF5KHJldHJvKGNsaWVudHMpKSkuZ2V0UG9ydCgpLndhaXRHZXQoKTsKKyAgICBlbmZvcmNlKHJlc3VsdCA9PSBwb3J0c1swXSk7CisgIH0KKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgYWxsIGNsaWVudHMgZmFpbC4KKyAgeworICAgIGF1dG8gcG9vbCA9IG1ha2VBc3luY0Zhc3Rlc3RQb29sKGNsaWVudHNbMyAuLiAkXSk7CisgICAgYXV0byBlID0gY2FzdChUQ29tcG91bmRPcGVyYXRpb25FeGNlcHRpb24pY29sbGVjdEV4Y2VwdGlvbihwb29sLmdldFBvcnQoKS53YWl0R2V0KCkpOworICAgIGVuZm9yY2UoZSk7CisgICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKWUuZXhjZXB0aW9ucyksCisgICAgICBwb3J0c1szIC4uICRdKSk7CisgIH0KKworICAvLyBUcnkgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IGNsaWVudHMgZmFpbCwgYnV0IGEgbGF0ZXIgb25lIHN1Y2NlZWRzLgorICB7CisgICAgYXV0byBwb29sID0gbWFrZUFzeW5jRmFzdGVzdFBvb2woY2xpZW50c1sxIC4uICRdKTsKKyAgICBlbmZvcmNlKHBvb2wuZ2V0UG9ydEluQXJyYXkoKSA9PSBbcG9ydHNbMV1dKTsKKyAgfQorfQorCithdXRvIG1ha2VBc3luY0Zhc3Rlc3RQb29sKFRBc3luY0NsaWVudEJhc2UhRXhUZXN0U2VydmljZVtdIGNsaWVudHMpIHsKKyAgYXV0byBwID0gdEFzeW5jRmFzdGVzdENsaWVudFBvb2woY2xpZW50cyk7CisgIHAucnBjRmF1bHRGaWx0ZXIgPSAoRXhjZXB0aW9uIGUpIHsKKyAgICByZXR1cm4gKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb24pZSAhaXMgbnVsbCk7CisgIH07CisgIHJldHVybiBwOworfQorCisKK3ZvaWQgYXN5bmNBZ2dyZWdhdG9yVGVzdChjb25zdCh1c2hvcnQpW10gcG9ydHMsIEV4VGVzdEhhbmRsZXJbXSBoYW5kbGVycykgeworICBhdXRvIG1hbmFnZXIgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyOworICBzY29wZSAoZXhpdCkgbWFuYWdlci5zdG9wKGR1ciEiaG5zZWNzIigwKSk7CisKKyAgYXV0byBjbGllbnRzID0gbWFrZUFzeW5jQ2xpZW50cyhtYW5hZ2VyLCBwb3J0cyk7CisgIHNjb3BlKGV4aXQpIGZvcmVhY2ggKGM7IGNsaWVudHMpIGMudHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgYXV0byBhZ2dyZWdhdG9yID0gdEFzeW5jQWdncmVnYXRvcigKKyAgICBjYXN0KFRBc3luY0NsaWVudEJhc2UhRXhUZXN0U2VydmljZVtdKWNsaWVudHMpOworCisgIC8vIFRlc3QgYWdncmVnYXRvciByYW5nZSBpbnRlcmZhY2UuCisgIHsKKyAgICBhdXRvIHJhbmdlID0gYWdncmVnYXRvci5nZXRQb3J0KCkucmFuZ2UoZHVyISJtc2VjcyIoNTApKTsKKyAgICBlbmZvcmNlKGVxdWFsKHJhbmdlLCBwb3J0c1swIC4uIDJdW10pKTsKKyAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pcmFuZ2UuZXhjZXB0aW9ucyksCisgICAgICBwb3J0c1szIC4uICQgLSAxXSkpOworICAgIGVuZm9yY2UocmFuZ2UuY29tcGxldGVkQ291bnQgPT0gNCk7CisgIH0KKworICAvLyBUZXN0IGRlZmF1bHQgYWNjdW11bGF0b3IgZm9yIHNjYWxhcnMuCisgIHsKKyAgICBhdXRvIGZ1bGxSZXN1bHQgPSBhZ2dyZWdhdG9yLmdldFBvcnQoKS5hY2N1bXVsYXRlKCk7CisgICAgZW5mb3JjZShmdWxsUmVzdWx0LndhaXRHZXQoKSA9PSBwb3J0c1swIC4uIDNdKTsKKworICAgIGF1dG8gcGFydGlhbFJlc3VsdCA9IGFnZ3JlZ2F0b3IuZ2V0UG9ydCgpLmFjY3VtdWxhdGUoKTsKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoMjApKTsKKyAgICBlbmZvcmNlKHBhcnRpYWxSZXN1bHQuZmluaXNoR2V0KCkgPT0gcG9ydHNbMCAuLiAyXSk7CisKKyAgfQorCisgIC8vIFRlc3QgZGVmYXVsdCBhY2N1bXVsYXRvciBmb3IgYXJyYXlzLgorICB7CisgICAgYXV0byBmdWxsUmVzdWx0ID0gYWdncmVnYXRvci5nZXRQb3J0SW5BcnJheSgpLmFjY3VtdWxhdGUoKTsKKyAgICBlbmZvcmNlKGZ1bGxSZXN1bHQud2FpdEdldCgpID09IHBvcnRzWzAgLi4gM10pOworCisgICAgYXV0byBwYXJ0aWFsUmVzdWx0ID0gYWdncmVnYXRvci5nZXRQb3J0SW5BcnJheSgpLmFjY3VtdWxhdGUoKTsKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoMjApKTsKKyAgICBlbmZvcmNlKHBhcnRpYWxSZXN1bHQuZmluaXNoR2V0KCkgPT0gcG9ydHNbMCAuLiAyXSk7CisgIH0KKworICAvLyBUZXN0IGN1c3RvbSBhY2N1bXVsYXRvci4KKyAgeworICAgIGF1dG8gZnVsbFJlc3VsdCA9IGFnZ3JlZ2F0b3IuZ2V0UG9ydCgpLmFjY3VtdWxhdGUhKGZ1bmN0aW9uKGludFtdIHJlc3VsdHMpeworICAgICAgcmV0dXJuIHJlZHVjZSEiYSArIGIiKHJlc3VsdHMpOworICAgIH0pKCk7CisgICAgZW5mb3JjZShmdWxsUmVzdWx0LndhaXRHZXQoKSA9PSBwb3J0c1swXSArIHBvcnRzWzFdICsgcG9ydHNbMl0pOworCisgICAgYXV0byBwYXJ0aWFsUmVzdWx0ID0gYWdncmVnYXRvci5nZXRQb3J0KCkuYWNjdW11bGF0ZSEoCisgICAgICBmdW5jdGlvbihpbnRbXSByZXN1bHRzLCBFeGNlcHRpb25bXSBleGNlcHRpb25zKSB7CisgICAgICAgIC8vIFJldHVybiBhIHR1cGxlIG9mIHRoZSBwYXJhbWV0ZXJzIHNvIHdlIGNhbiBjaGVjayB0aGVtIG91dHNpZGUgb2YKKyAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiAodG8gdmVyaWZ5IHRoZSB2YWx1ZXMsIHdlIG5lZWQgYWNjZXNzIHRvIMK7cG9ydHPCqywgYnV0CisgICAgICAgIC8vIGR1ZSB0byBETUQgQEBCVUc1NzEwQEAsIHdlIGNhbid0IHVzZSBhIGRlbGVnYXRlIGxpdGVyYWwpLmYKKyAgICAgICAgcmV0dXJuIHR1cGxlKHJlc3VsdHMsIGV4Y2VwdGlvbnMpOworICAgICAgfQorICAgICkoKTsKKyAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoMjApKTsKKyAgICBhdXRvIHJlc3VsdFR1cGxlID0gcGFydGlhbFJlc3VsdC5maW5pc2hHZXQoKTsKKyAgICBlbmZvcmNlKHJlc3VsdFR1cGxlWzBdID09IHBvcnRzWzAgLi4gMl0pOworICAgIGVuZm9yY2UoZXF1YWwobWFwISJhLnBvcnQiKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb25bXSlyZXN1bHRUdXBsZVsxXSksCisgICAgICBwb3J0c1szIC4uICQgLSAxXSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L29wZW5zc2wudGVzdC5jbmYgYi9saWIvZC90ZXN0L29wZW5zc2wudGVzdC5jbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkYTMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3Qvb3BlbnNzbC50ZXN0LmNuZgpAQCAtMCwwICsxLDE0IEBACitbIHJlcSBdCitkZWZhdWx0X2JpdHMgPSAyMDQ4CitkZWZhdWx0X2tleWZpbGUgPSBzZXJ2ZXItcHJpdmF0ZS1rZXkucGVtCitkaXN0aW5ndWlzaGVkX25hbWUgPSByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lCit4NTA5X2V4dGVuc2lvbnMgPSB2M19jYQorcHJvbXB0ID0gbm8KKworWyByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lIF0KK0NOID0gbG9jYWxob3N0CisKK1sgdjNfY2EgXQorIyBBZGQgOjoxIHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgSVBzIHNvIHdlIGNhbiB1c2UgOjoxIHRvIGV4cGxpY2l0bHkgY29ubmVjdAorIyB0byBsb2NhbGhvc3QgdmlhIElQdjYuCitzdWJqZWN0QWx0TmFtZSA9IElQOjo6MQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kIGIvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDA0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWluaSBzZXJpYWxpemF0aW9uIGJlbmNobWFyayBhbHNvIGF2YWlsYWJsZSBmb3IKKyAqIEMrKyBhbmQgSmF2YS4KKyAqCisgKiBGb3IgbWVhbmluZ2Z1bCByZXN1bHRzLCB5b3UgbWlnaHQgd2FudCB0byBtYWtlIHN1cmUgdGhhdAorICogdGhlIFRocmlmdCBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggcmVsZWFzZSBidWlsZCBmbGFncywKKyAqIGUuZy4gYnkgaW5jbHVkaW5nIHRoZSBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgYnVpbGQgaW5zdGVhZAorICogb2YgbGlua2luZyBsaWJ0aHJpZnRkOgorICoKKyAgIGRtZCAtdyAtTyAtcmVsZWFzZSAtaW5saW5lIC1JLi4vc3JjIC1JZ2VuLWQgLW9mc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsgXAorICAgJChmaW5kIC4uL3NyYy90aHJpZnQgLW5hbWUgJyouZCcgLW5vdCAtbmFtZSBpbmRleC5kKSBcCisgICBnZW4tZC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5kIHNlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKKyAqLworbW9kdWxlIHNlcmlhbGl6YXRpb25fYmVuY2htYXJrOworCitpbXBvcnQgc3RkLmRhdGV0aW1lLnN0b3B3YXRjaCA6IEF1dG9TdGFydCwgU3RvcFdhdGNoOworaW1wb3J0IHN0ZC5tYXRoIDogUEk7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5yYW5nZTsKK2ltcG9ydCBEZWJ1Z1Byb3RvVGVzdF90eXBlczsKKwordm9pZCBtYWluKCkgeworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICBlbnVtIElURVJBVElPTlMgPSAxMF8wMDBfMDAwOworCisgIHsKKyAgICBhdXRvIG9vZSA9IE9uZU9mRWFjaCgpOworICAgIG9vZS5pbV90cnVlICAgPSB0cnVlOworICAgIG9vZS5pbV9mYWxzZSAgPSBmYWxzZTsKKyAgICBvb2UuYV9iaXRlICAgID0gMHg3ZjsKKyAgICBvb2UuaW50ZWdlcjE2ID0gMjdfMDAwOworICAgIG9vZS5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICAgIG9vZS5pbnRlZ2VyNjQgPSA2XzAwMF8wMDBfMDAwOworICAgIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gUEk7CisgICAgb29lLnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOworICAgIG9vZS56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7CisgICAgb29lLmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKKworICAgIGF1dG8gcHJvdCA9IHRCaW5hcnlQcm90b2NvbChidWYpOworICAgIGF1dG8gc3cgPSBTdG9wV2F0Y2goQXV0b1N0YXJ0Lnllcyk7CisgICAgZm9yZWFjaCAoaTsgMCAuLiBJVEVSQVRJT05TKSB7CisgICAgICBidWYucmVzZXQoMTIwKTsKKyAgICAgIG9vZS53cml0ZShwcm90KTsKKyAgICB9CisgICAgc3cuc3RvcCgpOworCisgICAgYXV0byBtc2VjcyA9IHN3LnBlZWsoKS50b3RhbCEibXNlY3MiOworICAgIHdyaXRlZmxuKCJXcml0ZTogJXMgbXMgKCVzIGtIeikiLCBtc2VjcywgSVRFUkFUSU9OUyAvIG1zZWNzKTsKKyAgfQorCisgIGF1dG8gZGF0YSA9IGJ1Zi5nZXRDb250ZW50cygpLmR1cDsKKworICB7CisgICAgYXV0byByZWFkQnVmID0gdElucHV0UmFuZ2VUcmFuc3BvcnQoZGF0YSk7CisgICAgYXV0byBwcm90ID0gdEJpbmFyeVByb3RvY29sKHJlYWRCdWYpOworICAgIGF1dG8gb29lID0gT25lT2ZFYWNoKCk7CisKKyAgICBhdXRvIHN3ID0gU3RvcFdhdGNoKEF1dG9TdGFydC55ZXMpOworICAgIGZvcmVhY2ggKGk7IDAgLi4gSVRFUkFUSU9OUykgeworICAgICAgcmVhZEJ1Zi5yZXNldChkYXRhKTsKKyAgICAgIG9vZS5yZWFkKHByb3QpOworICAgIH0KKyAgICBzdy5zdG9wKCk7CisKKyAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLnRvdGFsISJtc2VjcyI7CisgICAgd3JpdGVmbG4oIiBSZWFkOiAlcyBtcyAoJXMga0h6KSIsIG1zZWNzLCBJVEVSQVRJT05TIC8gbXNlY3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3N0cmVzc190ZXN0X3NlcnZlci5kIGIvbGliL2QvdGVzdC9zdHJlc3NfdGVzdF9zZXJ2ZXIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRhMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC9zdHJlc3NfdGVzdF9zZXJ2ZXIuZApAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgc3RyZXNzX3Rlc3Rfc2VydmVyOworCitpbXBvcnQgc3RkLmdldG9wdDsKK2ltcG9ydCBzdGQucGFyYWxsZWxpc20gOiB0b3RhbENQVXM7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC50eXBldHVwbGU7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CitpbXBvcnQgdGVzdF91dGlsczsKKworaW1wb3J0IHRocmlmdC50ZXN0LnN0cmVzcy5TZXJ2aWNlOworCitjbGFzcyBTZXJ2aWNlSGFuZGxlciA6IFNlcnZpY2UgeworICB2b2lkIGVjaG9Wb2lkKCkgeyByZXR1cm47IH0KKyAgYnl0ZSBlY2hvQnl0ZShieXRlIGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludCBlY2hvSTMyKGludCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBsb25nIGVjaG9JNjQobG9uZyBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBieXRlW10gZWNob0xpc3QoYnl0ZVtdIGFyZykgeyByZXR1cm4gYXJnOyB9CisgIEhhc2hTZXQhYnl0ZSBlY2hvU2V0KEhhc2hTZXQhYnl0ZSBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBieXRlW2J5dGVdIGVjaG9NYXAoYnl0ZVtieXRlXSBhcmcpIHsgcmV0dXJuIGFyZzsgfQorCisgIHN0cmluZyBlY2hvU3RyaW5nKHN0cmluZyBhcmcpIHsKKyAgICBpZiAoYXJnICE9ICJoZWxsbyIpIHsKKyAgICAgIHN0ZGVyci53cml0ZWZsbihgV3Jvbmcgc3RyaW5nIHJlY2VpdmVkOiAlcyBpbnN0ZWFkIG9mICJoZWxsbyJgLCBhcmcpOworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiV3Jvbmcgc3RyaW5nIHJlY2VpdmVkLiIpOworICAgIH0KKyAgICByZXR1cm4gYXJnOworICB9Cit9CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIHVzaG9ydCBwb3J0ID0gOTA5MTsKKyAgYXV0byBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS50aHJlYWRlZDsKKyAgVHJhbnNwb3J0VHlwZSB0cmFuc3BvcnRUeXBlOworICBzaXplX3QgbnVtSU9UaHJlYWRzID0gMTsKKyAgc2l6ZV90IHRhc2tQb29sU2l6ZSA9IHRvdGFsQ1BVczsKKworICBnZXRvcHQoYXJncywgInBvcnQiLCAmcG9ydCwgInNlcnZlci10eXBlIiwgJnNlcnZlclR5cGUsCisgICAgInRyYW5zcG9ydC10eXBlIiwgJnRyYW5zcG9ydFR5cGUsICJ0YXNrLXBvb2wtc2l6ZSIsICZ0YXNrUG9vbFNpemUsCisgICAgIm51bS1pby10aHJlYWRzIiwgJm51bUlPVGhyZWFkcyk7CisKKyAgYWxpYXMgVHlwZVR1cGxlIShUQnVmZmVyZWRUcmFuc3BvcnQsIFRNZW1vcnlCdWZmZXIpIEF2YWlsYWJsZVRyYW5zcG9ydHM7CisKKyAgYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhKFNlcnZpY2UsCisgICAgc3RhdGljTWFwIShUQmluYXJ5UHJvdG9jb2wsIEF2YWlsYWJsZVRyYW5zcG9ydHMpKShuZXcgU2VydmljZUhhbmRsZXIoKSk7CisgIGF1dG8gc2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCk7CisgIGF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IGNyZWF0ZVRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0VHlwZSk7CisgIGF1dG8gcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhQXZhaWxhYmxlVHJhbnNwb3J0czsKKworICBhdXRvIHNlcnZlciA9IGNyZWF0ZVNlcnZlcihzZXJ2ZXJUeXBlLCB0YXNrUG9vbFNpemUsIG51bUlPVGhyZWFkcywKKyAgICBwcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKworICB3cml0ZWZsbigiU3RhcnRpbmcgJXMgJXMgU3RyZXNzVGVzdCBzZXJ2ZXIgb24gcG9ydCAlcy4uLiIsIHRyYW5zcG9ydFR5cGUsCisgICAgc2VydmVyVHlwZSwgcG9ydCk7CisgIHNlcnZlci5zZXJ2ZSgpOworICB3cml0ZWxuKCJkb25lLiIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90ZXN0X3V0aWxzLmQgYi9saWIvZC90ZXN0L3Rlc3RfdXRpbHMuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzQxMDBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC90ZXN0X3V0aWxzLmQKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFZhcmlvdXMgaGVscGVycyB1c2VkIGJ5IG1vcmUgdGhhbiBhIHNpbmdsZSB0ZXN0LgorICovCittb2R1bGUgdGVzdF91dGlsczsKKworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbSA6IFRhc2tQb29sOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIubm9uYmxvY2tpbmc7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci50YXNrcG9vbDsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRocmVhZGVkOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CisKKy8vIFRoaXMgaXMgYSBsaWtlbHkgdmljdGltIG9mIEBAQlVHNDc0NEBAIHdoZW4gdXNlZCB3aXRoIGNvbW1hbmQgYXJndW1lbnQKKy8vIHBhcnNpbmcuCitlbnVtIFNlcnZlclR5cGUgeworICBzaW1wbGUsCisgIG5vbmJsb2NraW5nLAorICBwb29sZWROb25ibG9ja2luZywKKyAgdGFza3Bvb2wsCisgIHRocmVhZGVkCit9CisKK1RTZXJ2ZXIgY3JlYXRlU2VydmVyKFNlcnZlclR5cGUgdHlwZSwgc2l6ZV90IHRhc2tQb29sU2l6ZSwgc2l6ZV90IG51bUlPVGhyZWFkcywKKyAgVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJTb2NrZXQgc2VydmVyVHJhbnNwb3J0LAorICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKK3sKKyAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBTZXJ2ZXJUeXBlLnNpbXBsZToKKyAgICAgIHJldHVybiBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICBjYXNlIFNlcnZlclR5cGUubm9uYmxvY2tpbmc6CisgICAgICBhdXRvIG5iID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydC5wb3J0LAorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICAgICAgbmIubnVtSU9UaHJlYWRzID0gbnVtSU9UaHJlYWRzOworICAgICAgcmV0dXJuIG5iOworICAgIGNhc2UgU2VydmVyVHlwZS5wb29sZWROb25ibG9ja2luZzoKKyAgICAgIGF1dG8gbmIgPSBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LnBvcnQsCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgbmV3IFRhc2tQb29sKHRhc2tQb29sU2l6ZSkpOworICAgICAgbmIubnVtSU9UaHJlYWRzID0gbnVtSU9UaHJlYWRzOworICAgICAgcmV0dXJuIG5iOworICAgIGNhc2UgU2VydmVyVHlwZS50YXNrcG9vbDoKKyAgICAgIGF1dG8gdHBzID0gbmV3IFRUYXNrUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIHRwcy50YXNrUG9vbCA9IG5ldyBUYXNrUG9vbCh0YXNrUG9vbFNpemUpOworICAgICAgcmV0dXJuIHRwczsKKyAgICBjYXNlIFNlcnZlclR5cGUudGhyZWFkZWQ6CisgICAgICByZXR1cm4gbmV3IFRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorfQorCitlbnVtIFRyYW5zcG9ydFR5cGUgeworICBidWZmZXJlZCwKKyAgZnJhbWVkLAorICBodHRwLAorICByYXcKK30KKworVFRyYW5zcG9ydEZhY3RvcnkgY3JlYXRlVHJhbnNwb3J0RmFjdG9yeShUcmFuc3BvcnRUeXBlIHR5cGUpIHsKKyAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLmJ1ZmZlcmVkOgorICAgICAgcmV0dXJuIG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5mcmFtZWQ6CisgICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5odHRwOgorICAgICAgcmV0dXJuIG5ldyBUU2VydmVySHR0cFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLnJhdzoKKyAgICAgIHJldHVybiBuZXcgVFRyYW5zcG9ydEZhY3Rvcnk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDE5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCittb2R1bGUgdGhyaWZ0X3Rlc3RfY2xpZW50OworCitpbXBvcnQgc3RkLmNvbnY7CitpbXBvcnQgc3RkLmRhdGV0aW1lOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworaW1wb3J0IHN0ZC5nZXRvcHQ7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC5zdHJpbmc7CitpbXBvcnQgc3RkLnRyYWl0czsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuY29tcGFjdDsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuanNvbjsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKKworaW1wb3J0IHRocmlmdF90ZXN0X2NvbW1vbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3RfdHlwZXM7CisKK2VudW0gVHJhbnNwb3J0VHlwZSB7CisgIGJ1ZmZlcmVkLAorICBmcmFtZWQsCisgIGh0dHAsCisgIHJhdworfQorCitUUHJvdG9jb2wgY3JlYXRlUHJvdG9jb2woVCkoVCB0cmFucywgUHJvdG9jb2xUeXBlIHR5cGUpIHsKKyAgZmluYWwgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuYmluYXJ5OgorICAgICAgcmV0dXJuIHRCaW5hcnlQcm90b2NvbCh0cmFucyk7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuY29tcGFjdDoKKyAgICAgIHJldHVybiB0Q29tcGFjdFByb3RvY29sKHRyYW5zKTsKKyAgICBjYXNlIFByb3RvY29sVHlwZS5qc29uOgorICAgICAgcmV0dXJuIHRKc29uUHJvdG9jb2wodHJhbnMpOworICB9Cit9CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIHN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CisgIHVzaG9ydCBwb3J0ID0gOTA5MDsKKyAgdWludCBudW1UZXN0cyA9IDE7CisgIGJvb2wgc3NsOworICBQcm90b2NvbFR5cGUgcHJvdG9jb2xUeXBlOworICBUcmFuc3BvcnRUeXBlIHRyYW5zcG9ydFR5cGU7CisgIGJvb2wgdHJhY2U7CisKKyAgZ2V0b3B0KGFyZ3MsCisgICAgIm51bVRlc3RzfG4iLCAmbnVtVGVzdHMsCisgICAgInByb3RvY29sIiwgJnByb3RvY29sVHlwZSwKKyAgICAic3NsIiwgJnNzbCwKKyAgICAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydFR5cGUsCisgICAgInRyYWNlIiwgJnRyYWNlLAorICAgICJwb3J0IiwgJnBvcnQsCisgICAgImhvc3QiLCAoc3RyaW5nIF8sIHN0cmluZyB2YWx1ZSkgeworICAgICAgYXV0byBwYXJ0cyA9IHNwbGl0KHZhbHVlLCAiOiIpOworICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgLy8gSVB2NiBhZGRyZXNzZXMgY2FuIGNvbnRhaW4gY29sb25zLCBzbyB0YWtlIHRoZSBsYXN0IHBhcnQgZm9yIHRoZQorICAgICAgICAvLyBwb3J0LgorICAgICAgICBob3N0ID0gam9pbihwYXJ0c1swIC4uICQgLSAxXSwgIjoiKTsKKyAgICAgICAgcG9ydCA9IHRvIXVzaG9ydChwYXJ0c1skIC0gMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaG9zdCA9IHZhbHVlOworICAgICAgfQorICAgIH0KKyAgKTsKKyAgcG9ydCA9IHRvIXVzaG9ydChwb3J0KTsKKworICBUU29ja2V0IHNvY2tldDsKKyAgaWYgKHNzbCkgeworICAgIGF1dG8gc3NsQ29udGV4dCA9IG5ldyBUU1NMQ29udGV4dCgpOworICAgIHNzbENvbnRleHQuY2lwaGVycyA9ICJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiOworICAgIHNzbENvbnRleHQuYXV0aGVudGljYXRlID0gdHJ1ZTsKKyAgICBzc2xDb250ZXh0LmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCIuLi8uLi8uLi90ZXN0L2tleXMvQ0EucGVtIik7CisgICAgc29ja2V0ID0gbmV3IFRTU0xTb2NrZXQoc3NsQ29udGV4dCwgaG9zdCwgcG9ydCk7CisgIH0gZWxzZSB7CisgICAgc29ja2V0ID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CisgIH0KKworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisgIGZpbmFsIHN3aXRjaCAodHJhbnNwb3J0VHlwZSkgeworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5idWZmZXJlZDoKKyAgICAgIHByb3RvY29sID0gY3JlYXRlUHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpLCBwcm90b2NvbFR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUcmFuc3BvcnRUeXBlLmZyYW1lZDoKKyAgICAgIHByb3RvY29sID0gY3JlYXRlUHJvdG9jb2wobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSwgcHJvdG9jb2xUeXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHJhbnNwb3J0VHlwZS5odHRwOgorICAgICAgcHJvdG9jb2wgPSBjcmVhdGVQcm90b2NvbCgKKyAgICAgICAgbmV3IFRDbGllbnRIdHRwVHJhbnNwb3J0KHNvY2tldCwgaG9zdCwgIi9zZXJ2aWNlIiksIHByb3RvY29sVHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRyYW5zcG9ydFR5cGUucmF3OgorICAgICAgcHJvdG9jb2wgPSBjcmVhdGVQcm90b2NvbChzb2NrZXQsIHByb3RvY29sVHlwZSk7CisgICAgICBicmVhazsKKyAgfQorCisgIGF1dG8gY2xpZW50ID0gdENsaWVudCFUaHJpZnRUZXN0KHByb3RvY29sKTsKKworICB1bG9uZyB0aW1lX21pbjsKKyAgdWxvbmcgdGltZV9tYXg7CisgIHVsb25nIHRpbWVfdG90OworCisgIFN0b3BXYXRjaCBzdzsKKyAgZm9yZWFjaCh0ZXN0OyAwIC4uIG51bVRlc3RzKSB7CisgICAgc3cuc3RhcnQoKTsKKworICAgIHByb3RvY29sLnRyYW5zcG9ydC5vcGVuKCk7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCJUZXN0ICMlcywgY29ubmVjdCAlczolcyIsIHRlc3QgKyAxLCBob3N0LCBwb3J0KTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICBjbGllbnQudGVzdFZvaWQoKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiA9IHZvaWQiKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgc3RyaW5nIHMgPSBjbGllbnQudGVzdFN0cmluZygiVGVzdCIpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9IFwiJXNcIiIsIHMpOworICAgIGVuZm9yY2UocyA9PSAiVGVzdCIpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEJ5dGUoMSkiKTsKKyAgICBieXRlIHU4ID0gY2xpZW50LnRlc3RCeXRlKDEpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgdTgpOworICAgIGVuZm9yY2UodTggPT0gMSk7CisKKyAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0STMyKC0xKSIpOworICAgIGludCBpMzIgPSBjbGllbnQudGVzdEkzMigtMSk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBpMzIpOworICAgIGVuZm9yY2UoaTMyID09IC0xKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworICAgIGxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TCk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBpNjQpOworICAgIGVuZm9yY2UoaTY0ID09IC0zNDM1OTczODM2OEwpOworCisgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdERvdWJsZSgtNS4yMDk4NTIzKSIpOworICAgIGRvdWJsZSBkdWIgPSBjbGllbnQudGVzdERvdWJsZSgtNS4yMDk4NTIzKTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIGR1Yik7CisgICAgZW5mb3JjZShkdWIgPT0gLTUuMjA5ODUyMyk7CisKKwkvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKwkKKyAgICBYdHJ1Y3Qgb3V0MTsKKyAgICBvdXQxLnN0cmluZ190aGluZyA9ICJaZXJvIjsKKyAgICBvdXQxLmJ5dGVfdGhpbmcgPSAxOworICAgIG91dDEuaTMyX3RoaW5nID0gLTM7CisgICAgb3V0MS5pNjRfdGhpbmcgPSAtNTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZigidGVzdFN0cnVjdCglcykiLCBvdXQxKTsKKyAgICBhdXRvIGluMSA9IGNsaWVudC50ZXN0U3RydWN0KG91dDEpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgaW4xKTsKKyAgICBlbmZvcmNlKGluMSA9PSBvdXQxKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOworICAgIFh0cnVjdDIgb3V0MjsKKyAgICBvdXQyLmJ5dGVfdGhpbmcgPSAxOworICAgIG91dDIuc3RydWN0X3RoaW5nID0gb3V0MTsKKyAgICBvdXQyLmkzMl90aGluZyA9IDU7CisgICAgYXV0byBpbjIgPSBjbGllbnQudGVzdE5lc3Qob3V0Mik7CisgICAgaW4xID0gaW4yLnN0cnVjdF90aGluZzsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSB7JXMsIHtcIiVzXCIsICVzLCAlcywgJXN9LCAlc30iLCBpbjIuYnl0ZV90aGluZywKKyAgICAgIGluMS5zdHJpbmdfdGhpbmcsIGluMS5ieXRlX3RoaW5nLCBpbjEuaTMyX3RoaW5nLCBpbjEuaTY0X3RoaW5nLAorICAgICAgaW4yLmkzMl90aGluZyk7CisgICAgZW5mb3JjZShpbjIgPT0gb3V0Mik7CisKKyAgICBpbnRbaW50XSBtYXBvdXQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgIG1hcG91dFtpXSA9IGkgLSAxMDsKKyAgICB9CisgICAgaWYgKHRyYWNlKSB3cml0ZWYoInRlc3RNYXAoeyVzfSkiLCBtYXBvdXQpOworICAgIGF1dG8gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9IHslc30iLCBtYXBpbik7CisgICAgZW5mb3JjZShtYXBpbiA9PSBtYXBvdXQpOworCisgICAgYXV0byBzZXRvdXQgPSBuZXcgSGFzaFNldCFpbnQ7CisgICAgZm9yIChpbnQgaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICBzZXRvdXQgfj0gaTsKKyAgICB9CisgICAgaWYgKHRyYWNlKSB3cml0ZWYoInRlc3RTZXQoJXMpIiwgc2V0b3V0KTsKKyAgICBhdXRvIHNldGluID0gY2xpZW50LnRlc3RTZXQoc2V0b3V0KTsKKyAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHNldGluKTsKKyAgICBlbmZvcmNlKHNldGluID09IHNldG91dCk7CisKKyAgICBpbnRbXSBsaXN0b3V0OworICAgIGZvciAoaW50IGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgbGlzdG91dCB+PSBpOworICAgIH0KKyAgICBpZiAodHJhY2UpIHdyaXRlZigidGVzdExpc3QoJXMpIiwgbGlzdG91dCk7CisgICAgYXV0byBsaXN0aW4gPSBjbGllbnQudGVzdExpc3QobGlzdG91dCk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCBsaXN0aW4pOworICAgIGVuZm9yY2UobGlzdGluID09IGxpc3RvdXQpOworCisgICAgeworICAgICAgaWYgKHRyYWNlKSB3cml0ZSgidGVzdEVudW0oT05FKSIpOworICAgICAgYXV0byByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5PTkUpOworICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCByZXQpOworICAgICAgZW5mb3JjZShyZXQgPT0gTnVtYmVyei5PTkUpOworCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RW51bShUV08pIik7CisgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOworICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0gJXMiLCByZXQpOworICAgICAgZW5mb3JjZShyZXQgPT0gTnVtYmVyei5UV08pOworCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgcmV0KTsKKyAgICAgIGVuZm9yY2UocmV0ID09IE51bWJlcnouVEhSRUUpOworCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIHJldCk7CisgICAgICBlbmZvcmNlKHJldCA9PSBOdW1iZXJ6LkZJVkUpOworCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgcmV0KTsKKyAgICAgIGVuZm9yY2UocmV0ID09IE51bWJlcnouRUlHSFQpOworICAgIH0KKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICBVc2VySWQgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgdWlkKTsKKyAgICBlbmZvcmNlKHVpZCA9PSAzMDk4NTgyMzUwODI1MjNMKTsKKworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RNYXBNYXAoMSkiKTsKKyAgICBhdXRvIG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiID0geyVzfSIsIG1tKTsKKyAgICAvLyBTaW1wbHkgZG9pbmcgPT0gZG9lc24ndCBzZWVtIHRvIHdvcmsgZm9yIG5lc3RlZCBBQXMuCisgICAgZm9yZWFjaCAoa2V5LCB2YWx1ZTsgbW0pIHsKKyAgICAgIGVuZm9yY2UodGVzdE1hcE1hcFJldHVybltrZXldID09IHZhbHVlKTsKKyAgICB9CisgICAgZm9yZWFjaCAoa2V5LCB2YWx1ZTsgdGVzdE1hcE1hcFJldHVybikgeworICAgICAgZW5mb3JjZShtbVtrZXldID09IHZhbHVlKTsKKyAgICB9CisKKyAgICBJbnNhbml0eSBpbnNhbmU7CisgICAgaW5zYW5lLnVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDA7CisgICAgWHRydWN0IHRydWNrOworICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJUcnVjayI7CisgICAgdHJ1Y2suYnl0ZV90aGluZyA9IDg7CisgICAgdHJ1Y2suaTMyX3RoaW5nID0gODsKKyAgICB0cnVjay5pNjRfdGhpbmcgPSA4OworICAgIGluc2FuZS54dHJ1Y3RzIH49IHRydWNrOworICAgIGlmICh0cmFjZSkgd3JpdGUoInRlc3RJbnNhbml0eSgpIik7CisgICAgYXV0byB3aG9hID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgd2hvYSk7CisKKyAgICAvLyBDb21tZW50ZWQgZm9yIG5vdywgdGhpcyBpcyBjdW1iZXJzb21lIHRvIHdyaXRlIHdpdGhvdXQgb3BFcXVhbCBnZXR0aW5nCisgICAgLy8gY2FsbGVkIG9uIEFBIGNvbXBhcmlzb24uCisgICAgLy8gZW5mb3JjZSh3aG9hID09IHRlc3RJbnNhbml0eVJldHVybik7CisKKyAgICB7CisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+Iik7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgdm9pZFxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0RXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0gY2F0Y2ggKFhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7JXMsIFwiJXNcIn0iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZSgiY2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+Iik7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgdm9pZFxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0RXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgIHslc30iLCBlLm1zZyk7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigic3VjY2VzcyIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgdm9pZCIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIGV4Y2VwdGlvblxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0RXhjZXB0aW9uIGZhaWxlZC4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgXCJ0ZXN0IDFcIikgPT4iKTsKKyAgICAgICAgYXV0byByZXN1bHQgPSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJ0ZXN0IDEiKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHJlc3VsdFxuRkFJTFVSRSIpOworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0TXVsdGlFeGNlcHRpb24gZmFpbGVkLiIpOworICAgICAgfSBjYXRjaCAoWGNlcHRpb24gZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgIHslcywgXCIlc1wifSIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+Iik7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgInRlc3QgMiIpOworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgcmVzdWx0XG5GQUlMVVJFIik7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRlc3RNdWx0aUV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9IGNhdGNoIChYY2VwdGlvbjIgZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgIHslcywge1wiJXNcIn19IiwKKyAgICAgICAgICBlLmVycm9yQ29kZSwgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWYoImNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigic3VjY2VzcyIsICJ0ZXN0IDMiKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7e1wiJXNcIn19IiwgcmVzdWx0LnN0cmluZ190aGluZyk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAodHJhY2UpIHdyaXRlbG4oIiAgZXhjZXB0aW9uXG5GQUlMVVJFIik7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInRlc3RNdWx0aUV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRG8gbm90IHJ1biBvbmV3YXkgdGVzdCB3aGVuIGRvaW5nIG11bHRpcGxlIGl0ZXJhdGlvbnMsIGFzIGl0IGJsb2NrcyB0aGUKKyAgICAvLyBzZXJ2ZXIgZm9yIHRocmVlIHNlY29uZHMuCisgICAgaWYgKG51bVRlc3RzID09IDEpIHsKKyAgICAgIGlmICh0cmFjZSkgd3JpdGVmKCJjbGllbnQudGVzdE9uZXdheSgzKSA9PiIpOworICAgICAgYXV0byBvbmV3YXlXYXRjaCA9IFN0b3BXYXRjaChBdXRvU3RhcnQueWVzKTsKKyAgICAgIGNsaWVudC50ZXN0T25ld2F5KDMpOworICAgICAgb25ld2F5V2F0Y2guc3RvcCgpOworICAgICAgaWYgKG9uZXdheVdhdGNoLnBlZWsoKS5tc2VjcyA+IDIwMCkgeworICAgICAgICBpZiAodHJhY2UpIHsKKyAgICAgICAgICB3cml0ZWZsbigiICBGQUlMVVJFIC0gdG9vayAlcyBtcyIsIG9uZXdheVdhdGNoLnBlZWsoKS51c2VjcyAvIDEwMDAuMCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdE9uZXdheSBmYWlsZWQuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodHJhY2UpIHsKKyAgICAgICAgICB3cml0ZWZsbigiICBzdWNjZXNzIC0gdG9vayAlcyBtcyIsIG9uZXdheVdhdGNoLnBlZWsoKS51c2VjcyAvIDEwMDAuMCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gUmVkbyBhIHNpbXBsZSB0ZXN0IGFmdGVyIHRoZSBvbmV3YXkgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCAib2ZmIGJ5CisgICAgICAvLyBvbmUiLCB3aGljaCB3b3VsZCBiZSB0aGUgY2FzZSBpZiB0aGUgc2VydmVyIHRyZWF0ZWQgb25ld2F5IG1ldGhvZHMKKyAgICAgIC8vIGxpa2Ugbm9ybWFsIG9uZXMuCisgICAgICBpZiAodHJhY2UpIHdyaXRlKCJyZS10ZXN0IHRlc3RJMzIoLTEpIik7CisgICAgICBpMzIgPSBjbGllbnQudGVzdEkzMigtMSk7CisgICAgICBpZiAodHJhY2UpIHdyaXRlZmxuKCIgPSAlcyIsIGkzMik7CisgICAgfQorCisgICAgLy8gVGltZSBtZXRlcmluZy4KKyAgICBzdy5zdG9wKCk7CisKKyAgICBpbW11dGFibGUgdG90ID0gc3cucGVlaygpLnVzZWNzOworICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIlRvdGFsIHRpbWU6ICVzIHVzXG4iLCB0b3QpOworCisgICAgdGltZV90b3QgKz0gdG90OworICAgIGlmICh0aW1lX21pbiA9PSAwIHx8IHRvdCA8IHRpbWVfbWluKSB7CisgICAgICB0aW1lX21pbiA9IHRvdDsKKyAgICB9CisgICAgaWYgKHRvdCA+IHRpbWVfbWF4KSB7CisgICAgICB0aW1lX21heCA9IHRvdDsKKyAgICB9CisgICAgcHJvdG9jb2wudHJhbnNwb3J0LmNsb3NlKCk7CisKKyAgICBzdy5yZXNldCgpOworICB9CisKKyAgd3JpdGVsbigiQWxsIHRlc3RzIGRvbmUuIik7CisKKyAgaWYgKG51bVRlc3RzID4gMSkgeworICAgIGF1dG8gdGltZV9hdmcgPSB0aW1lX3RvdCAvIG51bVRlc3RzOworICAgIHdyaXRlZmxuKCJNaW4gdGltZTogJXMgdXMiLCB0aW1lX21pbik7CisgICAgd3JpdGVmbG4oIk1heCB0aW1lOiAlcyB1cyIsIHRpbWVfbWF4KTsKKyAgICB3cml0ZWZsbigiQXZnIHRpbWU6ICVzIHVzIiwgdGltZV9hdmcpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NvbW1vbi5kIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jb21tb24uZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2E1Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jb21tb24uZApAQCAtMCwwICsxLDkyIEBACittb2R1bGUgdGhyaWZ0X3Rlc3RfY29tbW9uOworCitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3RfdHlwZXM7CisKK2VudW0gUHJvdG9jb2xUeXBlIHsKKyAgYmluYXJ5LAorICBjb21wYWN0LAorICBqc29uCit9CisKK3ZvaWQgd3JpdGVJbnNhbml0eVJldHVybihpbiBJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIGluc2FuZSkgeworICB3cml0ZSgieyIpOworICBmb3JlYWNoKGtleTEsIHZhbHVlMTsgaW5zYW5lKSB7CisgICAgd3JpdGVmKCIlcyA9PiB7Iiwga2V5MSk7CisgICAgZm9yZWFjaChrZXkyLCB2YWx1ZTI7IHZhbHVlMSkgeworICAgICAgd3JpdGVmKCIlcyA9PiB7Iiwga2V5Mik7CisgICAgICB3cml0ZSgieyIpOworICAgICAgZm9yZWFjaChrZXkzLCB2YWx1ZTM7IHZhbHVlMi51c2VyTWFwKSB7CisgICAgICAgIHdyaXRlZigiJXMgPT4gJXMsICIsIGtleTMsIHZhbHVlMyk7CisgICAgICB9CisgICAgICB3cml0ZSgifSwgIik7CisKKyAgICAgIHdyaXRlKCJ7Iik7CisgICAgICBmb3JlYWNoICh4OyB2YWx1ZTIueHRydWN0cykgeworICAgICAgICB3cml0ZWYoIntcIiVzXCIsICVzLCAlcywgJXN9LCAiLAorICAgICAgICAgIHguc3RyaW5nX3RoaW5nLCB4LmJ5dGVfdGhpbmcsIHguaTMyX3RoaW5nLCB4Lmk2NF90aGluZyk7CisgICAgICB9CisgICAgICB3cml0ZSgifSIpOworCisgICAgICB3cml0ZSgifSwgIik7CisgICAgfQorICAgIHdyaXRlKCJ9LCAiKTsKKyAgfQorICB3cml0ZSgifSIpOworfQorCitJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIHRlc3RJbnNhbml0eVJldHVybjsKK2ludFtpbnRdW2ludF0gdGVzdE1hcE1hcFJldHVybjsKKworc3RhdGljIHRoaXMoKSB7CisgIHRlc3RJbnNhbml0eVJldHVybiA9IHsKKyAgICBJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIGluc2FuZTsKKworICAgIFh0cnVjdCBoZWxsbzsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSAyOworICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CisKKyAgICBYdHJ1Y3QgZ29vZGJ5ZTsKKyAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7CisgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKKyAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OworCisgICAgSW5zYW5pdHkgY3Jhenk7CisgICAgY3JhenkudXNlck1hcFtOdW1iZXJ6LkVJR0hUXSA9IDg7CisgICAgY3JhenkueHRydWN0cyB+PSBnb29kYnllOworCisgICAgSW5zYW5pdHkgbG9vbmV5OworICAgIC8vIFRoZSBDKysgVGVzdFNlcnZlciBhbHNvIGFzc2lnbnMgdGhlc2UgdG8gY3JhenksIGJ1dCB0aGF0IGlzIHByb2JhYmx5CisgICAgLy8gYW4gb3ZlcnNpZ2h0LgorICAgIGxvb25leS51c2VyTWFwW051bWJlcnouRklWRV0gPSA1OworICAgIGxvb25leS54dHJ1Y3RzIH49IGhlbGxvOworCisgICAgSW5zYW5pdHlbTnVtYmVyel0gZmlyc3RfbWFwOworICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBjcmF6eTsKKyAgICBmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBjcmF6eTsKKyAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisKKyAgICBJbnNhbml0eVtOdW1iZXJ6XSBzZWNvbmRfbWFwOworICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbG9vbmV5OworICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisgICAgcmV0dXJuIGluc2FuZTsKKyAgfSgpOworCisgIHRlc3RNYXBNYXBSZXR1cm4gPSB7CisgICAgaW50W2ludF0gcG9zOworICAgIGludFtpbnRdIG5lZzsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICBwb3NbaV0gPSBpOworICAgICAgbmVnWy1pXSA9IC1pOworICAgIH0KKworICAgIGludFtpbnRdW2ludF0gcmVzdWx0OworICAgIHJlc3VsdFs0XSA9IHBvczsKKyAgICByZXN1bHRbLTRdID0gbmVnOworICAgIHJldHVybiByZXN1bHQ7CisgIH0oKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTFiZmU5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCkBAIC0wLDAgKzEsOTMgQEAKKyMhL2Jpbi9iYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFJ1bnMgdGhlIEQgVGhyaWZ0VGVzdCBjbGllbnQgYW5kIHNlcnZlcnMgZm9yIGFsbCBjb21iaW5hdGlvbnMgb2YgdHJhbnNwb3J0LAorIyBwcm90b2NvbCwgU1NMLW1vZGUgYW5kIHNlcnZlciB0eXBlLgorIyBQYXNzIC1rIHRvIGtlZXAgZ29pbmcgYWZ0ZXIgZmFpbGVkIHRlc3RzLgorCitDVVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKKworcHJvdG9jb2xzPSJiaW5hcnkgY29tcGFjdCBqc29uIgorIyBUT0RPOiBmaXggYW5kIGVuYWJsZSBodHRwCisjIHRyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCByYXcgaHR0cCIKK3RyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCByYXciCitzZXJ2ZXJzPSJzaW1wbGUgdGFza3Bvb2wgdGhyZWFkZWQiCitmcmFtZWRfb25seV9zZXJ2ZXJzPSJub25ibG9ja2luZyBwb29sZWROb25ibG9ja2luZyIKKworIyBEb24ndCBsZWF2ZSBhbnkgc2VydmVyIGluc3RhbmNlcyBiZWhpbmQgd2hlbiBpbnRlcnJ1cHRlZCAoZS5nLiBieSBDdHJsK0MpCisjIG9yIHRlcm1pbmF0ZWQuCit0cmFwICJraWxsICQoam9icyAtcCkgMj4vZGV2L251bGwiIElOVCBURVJNCisKK2ZvciBwcm90b2NvbCBpbiAkcHJvdG9jb2xzOyBkbworICBmb3Igc3NsIGluICIiICIgLS1zc2wiOyBkbworICAgIGZvciB0cmFuc3BvcnQgaW4gJHRyYW5zcG9ydHM7IGRvCisgICAgICBmb3Igc2VydmVyIGluICRzZXJ2ZXJzICRmcmFtZWRfb25seV9zZXJ2ZXJzOyBkbworICAgICAgICBjYXNlICRmcmFtZWRfb25seV9zZXJ2ZXJzIGluCisgICAgICAgICAgKiRzZXJ2ZXIqKSBpZiBbICR0cmFuc3BvcnQgIT0gImZyYW1lZCIgXSB8fCBbICRzc2wgIT0gIiIgXTsgdGhlbiBjb250aW51ZTsgZmk7OworICAgICAgICBlc2FjCisKKyAgICAgICAgYXJncz0iLS10cmFuc3BvcnQ9JHRyYW5zcG9ydCAtLXByb3RvY29sPSRwcm90b2NvbCRzc2wiCisgICAgICAgICR7Q1VSfS90aHJpZnRfdGVzdF9zZXJ2ZXIgJGFyZ3MgLS1zZXJ2ZXItdHlwZT0kc2VydmVyID4gL2Rldi9udWxsICYKKyAgICAgICAgc2VydmVyX3BpZD0kIQorCisgICAgICAgICMgR2l2ZSB0aGUgc2VydmVyIHNvbWUgdGltZSB0byBnZXQgdXAgYW5kIGNoZWNrIGlmIGl0IHJ1bnMgKHllcywgdGhpcworICAgICAgICAjIGlzIGEgaHVnZSBrbHVkZ2UsIHNob3VsZCBhZGQgYSBjb25uZWN0IHRpbWVvdXQgdG8gdGVzdCBjbGllbnQpLgorICAgICAgICBjbGllbnRfcmM9LTEKKyAgICAgICAgaWYgWyAiJHNlcnZlciIgPSAidGFza3Bvb2wiIF07IHRoZW4KKyAgICAgICAgICBzbGVlcCAwLjUKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNsZWVwIDAuMDIKKyAgICAgICAgZmkKKyAgICAgICAga2lsbCAtMCAkc2VydmVyX3BpZCAyPi9kZXYvbnVsbAorICAgICAgICBpZiBbICQ/IC1lcSAwIF07IHRoZW4KKyAgICAgICAgICAke0NVUn0vdGhyaWZ0X3Rlc3RfY2xpZW50ICRhcmdzIC0tbnVtVGVzdHM9MTAgPiAvZGV2L251bGwKKyAgICAgICAgICBjbGllbnRfcmM9JD8KKworICAgICAgICAgICMgVGVtcG9yYXJpbHkgcmVkaXJlY3Qgc3RkZXJyIHRvIG51bGwgdG8gYXZvaWQgam9iIGNvbnRyb2wgbWVzc2FnZXMsCisgICAgICAgICAgIyByZXN0b3JlIGl0IGFmdGVyd2FyZHMuCisgICAgICAgICAgZXhlYyAzPiYyCisgICAgICAgICAgZXhlYyAyPi9kZXYvbnVsbAorICAgICAgICAgIGtpbGwgJHNlcnZlcl9waWQKKyAgICAgICAgICBleGVjIDM+JjIKKyAgICAgICAgZmkKKworICAgICAgICAjIEdldCB0aGUgc2VydmVyIGV4aXQgY29kZSAod2FpdCBzaG91bGQgaW1tZWRpYXRlbHkgcmV0dXJuKS4KKyAgICAgICAgd2FpdCAkc2VydmVyX3BpZAorICAgICAgICBzZXJ2ZXJfcmM9JD8KKworICAgICAgICBpZiBbICRjbGllbnRfcmMgLW5lIDAgLW8gJHNlcnZlcl9yYyAtZXEgMSBdOyB0aGVuCisgICAgICAgICAgZWNobyAtZSAiXG5UZXN0cyBmYWlsZWQgZm9yOiAkYXJncyAtLXNlcnZlci10eXBlPSRzZXJ2ZXIiCisgICAgICAgICAgZmFpbGVkPSJ0cnVlIgorICAgICAgICAgIGlmIFsgIiQxIiAhPSAiLWsiIF07IHRoZW4KKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgZWNobyAtbiAiLiIKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKKworZWNobworaWYgWyAteiAiJGZhaWxlZCIgXTsgdGhlbgorICBlY2hvICJBbGwgdGVzdHMgcGFzc2VkLiIKK2ZpCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTgyMjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZApAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUgdGhyaWZ0X3Rlc3Rfc2VydmVyOworCitpbXBvcnQgY29yZS5zdGRjLmVycm5vIDogZXJybm87CitpbXBvcnQgY29yZS5zdGRjLnNpZ25hbCA6IHNpZ25hbCwgc2lnZm5fdCwgU0lHSU5ULCBTSUdfREZMLCBTSUdfRVJSOworaW1wb3J0IGNvcmUudGhyZWFkIDogZHVyLCBUaHJlYWQ7CitpbXBvcnQgc3RkLmFsZ29yaXRobTsKK2ltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKK2ltcG9ydCBzdGQuZ2V0b3B0OworaW1wb3J0IHN0ZC5wYXJhbGxlbGlzbSA6IHRvdGFsQ1BVczsKK2ltcG9ydCBzdGQuc3RyaW5nOworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCBzdGQudHlwZXR1cGxlIDogVHlwZVR1cGxlLCBzdGF0aWNNYXA7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmNvbXBhY3Q7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmpzb247CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOworaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5mcmFtZWQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5odHRwOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKK2ltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OworaW1wb3J0IHRlc3RfdXRpbHM7CisKK2ltcG9ydCB0aHJpZnRfdGVzdF9jb21tb247CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdF90eXBlczsKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OworCitjbGFzcyBUZXN0SGFuZGxlciA6IFRocmlmdFRlc3QgeworICB0aGlzKGJvb2wgdHJhY2UpIHsKKyAgICB0cmFjZV8gPSB0cmFjZTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgdGVzdFZvaWQoKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVsbigidGVzdFZvaWQoKSIpOworICB9CisKKyAgb3ZlcnJpZGUgc3RyaW5nIHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTdHJpbmcoXCIlc1wiKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBieXRlIHRlc3RCeXRlKGJ5dGUgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEJ5dGUoJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGludCB0ZXN0STMyKGludCB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0STMyKCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBsb25nIHRlc3RJNjQobG9uZyB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0STY0KCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdERvdWJsZSglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgc3RyaW5nIHRlc3RCaW5hcnkoc3RyaW5nIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RCaW5hcnkoXCIlc1wiKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBib29sIHRlc3RCb29sKGJvb2wgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEJvb2woXCIlc1wiKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBYdHJ1Y3QgdGVzdFN0cnVjdChyZWYgY29uc3QoWHRydWN0KSB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVzLCAlcywgJXN9KSIsCisgICAgICB0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBYdHJ1Y3QyIHRlc3ROZXN0KHJlZiBjb25zdChYdHJ1Y3QyKSBuZXN0KSB7CisgICAgYXV0byB0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0TmVzdCh7JXMsIHtcIiVzXCIsICVzLCAlcywgJXN9LCAlc30pIiwKKyAgICAgIG5lc3QuYnl0ZV90aGluZywgdGhpbmcuc3RyaW5nX3RoaW5nLCB0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsCisgICAgICB0aGluZy5pNjRfdGhpbmcsIG5lc3QuaTMyX3RoaW5nKTsKKyAgICByZXR1cm4gbmVzdDsKKyAgfQorCisgIG92ZXJyaWRlIGludFtpbnRdIHRlc3RNYXAoaW50W2ludF0gdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdE1hcCh7JXN9KSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBIYXNoU2V0IWludCB0ZXN0U2V0KEhhc2hTZXQhaW50IHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTZXQoeyVzfSkiLAorICAgICAgam9pbihtYXAhYHRvIXN0cmluZyhhKWAodGhpbmdbXSksICIsICIpKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBpbnRbXSB0ZXN0TGlzdChpbnRbXSB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0TGlzdCglcykiLCB0aGluZyk7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKKyAgb3ZlcnJpZGUgTnVtYmVyeiB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RFbnVtKCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBVc2VySWQgdGVzdFR5cGVkZWYoVXNlcklkIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RUeXBlZGVmKCVzKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKworICBvdmVycmlkZSBzdHJpbmdbc3RyaW5nXSB0ZXN0U3RyaW5nTWFwKHN0cmluZ1tzdHJpbmddIHRoaW5nKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTdHJpbmdNYXAoJXMpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGludFtpbnRdW2ludF0gdGVzdE1hcE1hcChpbnQgaGVsbG8pIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdE1hcE1hcCglcykiLCBoZWxsbyk7CisgICAgcmV0dXJuIHRlc3RNYXBNYXBSZXR1cm47CisgIH0KKworICBvdmVycmlkZSBJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIHRlc3RJbnNhbml0eShyZWYgY29uc3QoSW5zYW5pdHkpIGFyZ3VtZW50KSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVsbigidGVzdEluc2FuaXR5KCkiKTsKKyAgICBJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIHJldDsKKyAgICBJbnNhbml0eVtOdW1iZXJ6XSBtMTsKKyAgICBJbnNhbml0eVtOdW1iZXJ6XSBtMjsKKyAgICBJbnNhbml0eSB0bXA7CisgICAgdG1wID0gY2FzdChJbnNhbml0eSlhcmd1bWVudDsKKyAgICBtMVtOdW1iZXJ6LlRXT10gPSB0bXA7CisgICAgbTFbTnVtYmVyei5USFJFRV0gPSB0bXA7CisgICAgbTJbTnVtYmVyei5TSVhdID0gSW5zYW5pdHkoKTsKKyAgICByZXRbMV0gPSBtMTsKKyAgICByZXRbMl0gPSBtMjsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgb3ZlcnJpZGUgWHRydWN0IHRlc3RNdWx0aShieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIHN0cmluZ1tzaG9ydF0gYXJnMywKKyAgICBOdW1iZXJ6IGFyZzQsIFVzZXJJZCBhcmc1KQorICB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVsbigidGVzdE11bHRpKCkiKTsKKyAgICByZXR1cm4gWHRydWN0KCJIZWxsbzIiLCBhcmcwLCBhcmcxLCBhcmcyKTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgdGVzdEV4Y2VwdGlvbihzdHJpbmcgYXJnKSB7CisgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RFeGNlcHRpb24oJXMpIiwgYXJnKTsKKyAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpIHsKKyAgICAgIGF1dG8gZSA9IG5ldyBYY2VwdGlvbigpOworICAgICAgZS5lcnJvckNvZGUgPSAxMDAxOworICAgICAgZS5tZXNzYWdlID0gYXJnOworICAgICAgdGhyb3cgZTsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PSAiVEV4Y2VwdGlvbiIpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmIChhcmcgPT0gIkFwcGxpY2F0aW9uRXhjZXB0aW9uIikgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICBvdmVycmlkZSBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSkgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKSIsIGFyZzAsIGFyZzEpOworCisgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikgeworICAgICAgYXV0byBlID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICBlLmVycm9yQ29kZSA9IDEwMDE7CisgICAgICBlLm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgICB0aHJvdyBlOworICAgIH0gZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikgeworICAgICAgYXV0byBlID0gbmV3IFhjZXB0aW9uMigpOworICAgICAgZS5lcnJvckNvZGUgPSAyMDAyOworICAgICAgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBYdHJ1Y3QoYXJnMSk7CisgICAgfQorICB9CisKKyAgb3ZlcnJpZGUgdm9pZCB0ZXN0T25ld2F5KGludCBzbGVlcEZvcikgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0T25ld2F5KCVzKTogU2xlZXBpbmcuLi4iLCBzbGVlcEZvcik7CisgICAgVGhyZWFkLnNsZWVwKGR1ciEic2Vjb25kcyIoc2xlZXBGb3IpKTsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdE9uZXdheSglcyk6IGRvbmUgc2xlZXBpbmchIiwgc2xlZXBGb3IpOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgdHJhY2VfOworfQorCitzaGFyZWQoYm9vbCkgZ1NodXRkb3duID0gZmFsc2U7CisKK25vdGhyb3cgQG5vZ2MgZXh0ZXJuKEMpIHZvaWQgaGFuZGxlU2lnbmFsKGludCBzaWcpIHsKKyAgZ1NodXRkb3duID0gdHJ1ZTsKK30KKworLy8gUnVucyBhIHRocmVhZCB0aGF0IHdhaXRzIGZvciBzaHV0ZG93biB0byBiZQorLy8gc2lnbmFsZWQgYW5kIHRoZW4gdHJpZ2dlcnMgY2FuY2VsbGF0aW9uLAorLy8gY2F1c2luZyB0aGUgc2VydmVyIHRvIHN0b3AuICBXaGlsZSB3ZSBjb3VsZAorLy8gdXNlIGEgc2lnbmFsZmQgZm9yIHRoaXMgcHVycG9zZSwgd2UgYXJlIGluc3RlYWQKKy8vIG9wdGluZyBmb3IgYSBidXN5IHdhaXRpbmcgc2NoZW1lIGZvciBtYXhpbXVtCisvLyBwb3J0YWJpbGl0eSBzaW5jZSBzaWduYWxmZCBpcyBhIGxpbnV4IHRoaW5nLgorCitjbGFzcyBTaHV0ZG93blRocmVhZCA6IFRocmVhZCB7CisgIHRoaXMoVENhbmNlbGxhdGlvbk9yaWdpbiBjYW5jZWxsYXRpb24pIHsKKyAgICBjYW5jZWxsYXRpb25fID0gY2FuY2VsbGF0aW9uOworICAgIHN1cGVyKCZydW4pOworICB9CisgIAorcHJpdmF0ZToKKyAgdm9pZCBydW4oKSB7CisgICAgd2hpbGUgKCFnU2h1dGRvd24pIHsKKyAgICAgIFRocmVhZC5zbGVlcChkdXIhKCJtc2VjcyIpKDI1KSk7CisgICAgfQorICAgIGNhbmNlbGxhdGlvbl8udHJpZ2dlcigpOworICB9CisgIAorICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNhbmNlbGxhdGlvbl87Cit9CisKK3ZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CisgIHVzaG9ydCBwb3J0ID0gOTA5MDsKKyAgU2VydmVyVHlwZSBzZXJ2ZXJUeXBlOworICBQcm90b2NvbFR5cGUgcHJvdG9jb2xUeXBlOworICBzaXplX3QgbnVtSU9UaHJlYWRzID0gMTsKKyAgVHJhbnNwb3J0VHlwZSB0cmFuc3BvcnRUeXBlOworICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHRyYWNlID0gdHJ1ZTsKKyAgc2l6ZV90IHRhc2tQb29sU2l6ZSA9IHRvdGFsQ1BVczsKKworICBnZXRvcHQoYXJncywgInBvcnQiLCAmcG9ydCwgInByb3RvY29sIiwgJnByb3RvY29sVHlwZSwgInNlcnZlci10eXBlIiwKKyAgICAmc2VydmVyVHlwZSwgInNzbCIsICZzc2wsICJudW0taW8tdGhyZWFkcyIsICZudW1JT1RocmVhZHMsCisgICAgInRhc2stcG9vbC1zaXplIiwgJnRhc2tQb29sU2l6ZSwgInRyYWNlIiwgJnRyYWNlLAorICAgICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0VHlwZSk7CisKKyAgaWYgKHNlcnZlclR5cGUgPT0gU2VydmVyVHlwZS5ub25ibG9ja2luZyB8fAorICAgIHNlcnZlclR5cGUgPT0gU2VydmVyVHlwZS5wb29sZWROb25ibG9ja2luZworICApIHsKKyAgICBlbmZvcmNlKHRyYW5zcG9ydFR5cGUgPT0gVHJhbnNwb3J0VHlwZS5mcmFtZWQsCisgICAgICAiTmVlZCB0byB1c2UgZnJhbWVkIHRyYW5zcG9ydCB3aXRoIG5vbi1ibG9ja2luZyBzZXJ2ZXIuIik7CisgICAgZW5mb3JjZSghc3NsLCAiVGhlIG5vbi1ibG9ja2luZyBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBTU0wgeWV0LiIpOworCisgICAgLy8gRG9uJ3Qgd3JhcCB0aGUgY29udGVudHMgaW50byBhbm90aGVyIGxheWVyIG9mIGZyYW1pbmcuCisgICAgdHJhbnNwb3J0VHlwZSA9IFRyYW5zcG9ydFR5cGUucmF3OworICB9CisKKyAgdmVyc2lvbiAoVGhyaWZ0VGVzdFRlbXBsYXRlcykgeworICAgIC8vIE9ubHkgZXhlcmNpc2UgdGhlIHNwZWNpYWxpemVkIHRlbXBsYXRlIGNvZGUgcGF0aHMgaWYgZXhwbGljaXRseSBlbmFibGVkCisgICAgLy8gdG8gcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbiBvbiByZWd1bGFyIHRlc3Qgc3VpdGUgcnVucyDigJMgdGhlcmUgc2hvdWxkCisgICAgLy8gbm90IGJlIG11Y2ggdGhhdCBjYW4gZ28gd3Jvbmcgd2l0aCB0aGF0IHNwZWNpZmljYWxseSBhbnl3YXkuCisgICAgYWxpYXMgVHlwZVR1cGxlIShUQnVmZmVyZWRUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQsIFRTZXJ2ZXJIdHRwVHJhbnNwb3J0KQorICAgICAgQXZhaWxhYmxlVHJhbnNwb3J0czsKKyAgICBhbGlhcyBUeXBlVHVwbGUhKAorICAgICAgc3RhdGljTWFwIShUQmluYXJ5UHJvdG9jb2wsIEF2YWlsYWJsZVRyYW5zcG9ydHMpLAorICAgICAgc3RhdGljTWFwIShUQ29tcGFjdFByb3RvY29sLCBBdmFpbGFibGVUcmFuc3BvcnRzKQorICAgICkgQXZhaWxhYmxlUHJvdG9jb2xzOworICB9IGVsc2UgeworICAgIGFsaWFzIFR5cGVUdXBsZSEoKSBBdmFpbGFibGVUcmFuc3BvcnRzOworICAgIGFsaWFzIFR5cGVUdXBsZSEoKSBBdmFpbGFibGVQcm90b2NvbHM7CisgIH0KKworICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKyAgZmluYWwgc3dpdGNoIChwcm90b2NvbFR5cGUpIHsKKyAgICBjYXNlIFByb3RvY29sVHlwZS5iaW5hcnk6CisgICAgICBwcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSFBdmFpbGFibGVUcmFuc3BvcnRzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuY29tcGFjdDoKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSFBdmFpbGFibGVUcmFuc3BvcnRzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQcm90b2NvbFR5cGUuanNvbjoKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUSnNvblByb3RvY29sRmFjdG9yeSFBdmFpbGFibGVUcmFuc3BvcnRzOworICAgICAgYnJlYWs7CisgIH0KKworICBhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciEoVGhyaWZ0VGVzdCwgQXZhaWxhYmxlUHJvdG9jb2xzKSgKKyAgICBuZXcgVGVzdEhhbmRsZXIodHJhY2UpKTsKKworICBUU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKyAgaWYgKHNzbCkgeworICAgIGF1dG8gc3NsQ29udGV4dCA9IG5ldyBUU1NMQ29udGV4dCgpOworICAgIHNzbENvbnRleHQuc2VydmVyU2lkZSA9IHRydWU7CisgICAgc3NsQ29udGV4dC5sb2FkQ2VydGlmaWNhdGUoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0Iik7CisgICAgc3NsQ29udGV4dC5sb2FkUHJpdmF0ZUtleSgiLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5rZXkiKTsKKyAgICBzc2xDb250ZXh0LmNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKKyAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xDb250ZXh0KTsKKyAgfSBlbHNlIHsKKyAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0KTsKKyAgfQorCisgIGF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IGNyZWF0ZVRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0VHlwZSk7CisKKyAgYXV0byBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZSwgbnVtSU9UaHJlYWRzLCB0YXNrUG9vbFNpemUsCisgICAgcHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisKKyAgLy8gU2V0IHVwIFNJR0lOVCBzaWduYWwgaGFuZGxpbmcKKyAgc2lnZm5fdCBvbGRIYW5kbGVyID0gc2lnbmFsKFNJR0lOVCwgJmhhbmRsZVNpZ25hbCk7CisgIGVuZm9yY2Uob2xkSGFuZGxlciAhPSBTSUdfRVJSLAorICAgICJDb3VsZCBub3QgcmVwbGFjZSB0aGUgU0lHSU5UIHNpZ25hbCBoYW5kbGVyOiBlcnJubyB7MH0iLmZvcm1hdChlcnJubygpKSk7CisgIAorICAvLyBTZXQgdXAgYSBzZXJ2ZXIgY2FuY2VsbGF0aW9uIHRyaWdnZXIKKyAgYXV0byBjYW5jZWwgPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbigpOworCisgIC8vIFNldCB1cCBhIGxpc3RlbmVyIGZvciB0aGUgc2h1dGRvd24gY29uZGl0aW9uIC0gdGhpcyB3aWxsCisgIC8vIHdha2UgdXAgd2hlbiB0aGUgc2lnbmFsIG9jY3VycyBhbmQgdHJpZ2dlciBjYW5jZWxsYXRpb24uCisgIGF1dG8gc2h1dGRvd24gPSBuZXcgU2h1dGRvd25UaHJlYWQoY2FuY2VsKTsKKyAgc2h1dGRvd24uc3RhcnQoKTsKKyAgCisgIC8vIFNlcnZlIGZyb20gdGhpcyB0aHJlYWQ7IHRoZSBzaWduYWwgd2lsbCBzdG9wIHRoZSBzZXJ2ZXIKKyAgLy8gYW5kIGNvbnRyb2wgd2lsbCByZXR1cm4gaGVyZQorICB3cml0ZWZsbigiU3RhcnRpbmcgJXMvJXMgJXMgVGhyaWZ0VGVzdCBzZXJ2ZXIgJXNvbiBwb3J0ICVzLi4uIiwgcHJvdG9jb2xUeXBlLAorICAgIHRyYW5zcG9ydFR5cGUsIHNlcnZlclR5cGUsIHNzbCA/ICIodXNpbmcgU1NMKSAiOiAiIiwgcG9ydCk7CisgIHNlcnZlci5zZXJ2ZShjYW5jZWwpOworICBzaHV0ZG93bi5qb2luKCk7CisgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworICAgIAorICB3cml0ZWxuKCJkb25lLiIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdC5kIGIvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2UwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0LmQKQEAgLTAsMCArMSw4MDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBFeGVyY2lzZXMgdmFyaW91cyB0cmFuc3BvcnRzLCBjb21iaW5lZCB3aXRoIHRoZSBidWZmZXJlZC9mcmFtZWQgd3JhcHBlcnMuCisgKgorICogT3JpZ2luYWxseSBwb3J0ZWQgZnJvbSB0aGUgQysrIHZlcnNpb24sIHdpdGggV2luZG93cyBzdXBwb3J0IGNvZGUgYWRkZWQuCisgKi8KK21vZHVsZSB0cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0IGNvcmUuYXRvbWljOworaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uOworaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkOworaW1wb3J0IHN0ZC5jb252IDogdG87CitpbXBvcnQgc3RkLmRhdGV0aW1lOworaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOworc3RhdGljIGltcG9ydCBzdGQuZmlsZTsKK2ltcG9ydCBzdGQuZ2V0b3B0OworaW1wb3J0IHN0ZC5yYW5kb20gOiBybmRHZW4sIHVuaWZvcm0sIHVucHJlZGljdGFibGVTZWVkOworaW1wb3J0IHN0ZC5zb2NrZXQ7CitpbXBvcnQgc3RkLnN0ZGlvOworaW1wb3J0IHN0ZC5zdHJpbmc7CitpbXBvcnQgc3RkLnR5cGV0dXBsZTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZpbGU7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5odHRwOworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuemxpYjsKKworLyoKKyAqIFNpemUgZ2VuZXJhdGlvbiBoZWxwZXJzIOKAkyB1c2VkIHRvIGJlIGFibGUgdG8gcnVuIHRoZSBzYW1lIHRlc3RpbmcgY29kZQorICogd2l0aCBib3RoIGNvbnN0YW50IGFuZCByYW5kb20gdG90YWwvY2h1bmsgc2l6ZXMuCisgKi8KKworaW50ZXJmYWNlIFNpemVHZW5lcmF0b3IgeworICBzaXplX3QgbmV4dFNpemUoKTsKKyAgc3RyaW5nIHRvU3RyaW5nKCk7Cit9CisKK2NsYXNzIENvbnN0YW50U2l6ZUdlbmVyYXRvciA6IFNpemVHZW5lcmF0b3IgeworICB0aGlzKHNpemVfdCB2YWx1ZSkgeworICAgIHZhbHVlXyA9IHZhbHVlOworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IG5leHRTaXplKCkgeworICAgIHJldHVybiB2YWx1ZV87CisgIH0KKworICBvdmVycmlkZSBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIHRvIXN0cmluZyh2YWx1ZV8pOworICB9CisKK3ByaXZhdGU6CisgIHNpemVfdCB2YWx1ZV87Cit9CisKK2NsYXNzIFJhbmRvbVNpemVHZW5lcmF0b3IgOiBTaXplR2VuZXJhdG9yIHsKKyAgdGhpcyhzaXplX3QgbWluLCBzaXplX3QgbWF4KSB7CisgICAgbWluXyA9IG1pbjsKKyAgICBtYXhfID0gbWF4OworICB9CisKKyAgb3ZlcnJpZGUgc2l6ZV90IG5leHRTaXplKCkgeworICAgIHJldHVybiB1bmlmb3JtISJbXSIobWluXywgbWF4Xyk7CisgIH0KKworICBvdmVycmlkZSBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGZvcm1hdCgicmFuZCglcywgJXMpIiwgbWluXywgbWF4Xyk7CisgIH0KKworICBzaXplX3QgbWluKCkgY29uc3QgQHByb3BlcnR5IHsKKyAgICByZXR1cm4gbWluXzsKKyAgfQorCisgIHNpemVfdCBtYXgoKSBjb25zdCBAcHJvcGVydHkgeworICAgIHJldHVybiBtYXhfOworICB9CisKK3ByaXZhdGU6CisgIHNpemVfdCBtaW5fOworICBzaXplX3QgbWF4XzsKK30KKworCisvKgorICogQ2xhc3NlcyB0byBzZXQgdXAgY291cGxlZCB0cmFuc3BvcnRzCisgKi8KKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gcmVwcmVzZW50IGEgY291cGxlZCBwYWlyIG9mIHRyYW5zcG9ydHMuCisgKgorICogRGF0YSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgdHJhbnNwb3J0IGNhbiBiZSByZWFkIGZyb20gdGhlIGlucHV0IHRyYW5zcG9ydC4KKyAqCisgKiBUaGlzIGlzIHVzZWQgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIHRoZSB2YXJpb3VzIGNvdXBsZWQgdHJhbnNwb3J0CisgKiBpbXBsZW1lbnRhdGlvbnMuIEl0IHNob3VsZG4ndCBiZSB1c2VkIGRpcmVjdGx5LgorICovCitjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cyhUcmFuc3BvcnQpIGlmIChpc1RUcmFuc3BvcnQhVHJhbnNwb3J0KSB7CisgIFRyYW5zcG9ydCBpbnB1dDsKKyAgVHJhbnNwb3J0IG91dHB1dDsKK30KKwordGVtcGxhdGUgaXNDb3VwbGVkVHJhbnNwb3J0cyhUKSB7CisgIHN0YXRpYyBpZiAoaXMoVCBfIDogQ291cGxlZFRyYW5zcG9ydHMhVSwgVSkpIHsKKyAgICBlbnVtIGlzQ291cGxlZFRyYW5zcG9ydHMgPSB0cnVlOworICB9IGVsc2UgeworICAgIGVudW0gaXNDb3VwbGVkVHJhbnNwb3J0cyA9IGZhbHNlOworICB9Cit9CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIGNsYXNzIGZvciBjcmVhdGluZyBjb3VwbGVkIHRyYW5zcG9ydHMgdGhhdCB3cmFwCisgKiBhbm90aGVyIHRyYW5zcG9ydC4KKyAqLworY2xhc3MgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzKFdyYXBwZXJUcmFuc3BvcnQsIElubmVyQ291cGxlZFRyYW5zcG9ydHMpIGlmICgKKyAgaXNUVHJhbnNwb3J0IVdyYXBwZXJUcmFuc3BvcnQgJiYgaXNDb3VwbGVkVHJhbnNwb3J0cyFJbm5lckNvdXBsZWRUcmFuc3BvcnRzCispIDogQ291cGxlZFRyYW5zcG9ydHMhV3JhcHBlclRyYW5zcG9ydCB7CisgIHRoaXMoKSB7CisgICAgaW5uZXJfID0gbmV3IElubmVyQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgICBpZiAoaW5uZXJfLmlucHV0KSB7CisgICAgICBpbnB1dCA9IG5ldyBXcmFwcGVyVHJhbnNwb3J0KGlubmVyXy5pbnB1dCk7CisgICAgfQorICAgIGlmIChpbm5lcl8ub3V0cHV0KSB7CisgICAgICBvdXRwdXQgPSBuZXcgV3JhcHBlclRyYW5zcG9ydChpbm5lcl8ub3V0cHV0KTsKKyAgICB9CisgIH0KKworICB+dGhpcygpIHsKKyAgICBkZXN0cm95KGlubmVyXyk7CisgIH0KKworcHJpdmF0ZToKKyAgSW5uZXJDb3VwbGVkVHJhbnNwb3J0cyBpbm5lcl87Cit9CisKK2ltcG9ydCB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbiA6IFBBcHBseTsKK2FsaWFzIFBBcHBseSEoQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzLCBUQnVmZmVyZWRUcmFuc3BvcnQpIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHM7CithbGlhcyBQQXBwbHkhKENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0cywgVEZyYW1lZFRyYW5zcG9ydCkgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHM7CithbGlhcyBQQXBwbHkhKENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0cywgVFpsaWJUcmFuc3BvcnQpIENvdXBsZWRabGliVHJhbnNwb3J0czsKKworLyoqCisgKiBDb3VwbGVkIFRNZW1vcnlCdWZmZXJzLgorICovCitjbGFzcyBDb3VwbGVkTWVtb3J5QnVmZmVycyA6IENvdXBsZWRUcmFuc3BvcnRzIVRNZW1vcnlCdWZmZXIgeworICB0aGlzKCkgeworICAgIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyOworICAgIGlucHV0ID0gYnVmOworICAgIG91dHB1dCA9IGJ1ZjsKKyAgfQorCisgIFRNZW1vcnlCdWZmZXIgYnVmOworfQorCisvKioKKyAqIENvdXBsZWQgVFNvY2tldHMuCisgKi8KK2NsYXNzIENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzIDogQ291cGxlZFRyYW5zcG9ydHMhVFNvY2tldCB7CisgIHRoaXMoKSB7CisgICAgYXV0byBzb2NrZXRzID0gc29ja2V0UGFpcigpOworICAgIGlucHV0ID0gbmV3IFRTb2NrZXQoc29ja2V0c1swXSk7CisgICAgb3V0cHV0ID0gbmV3IFRTb2NrZXQoc29ja2V0c1sxXSk7CisgIH0KKworICB+dGhpcygpIHsKKyAgICBpbnB1dC5jbG9zZSgpOworICAgIG91dHB1dC5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogQ291cGxlZCBURmlsZVRyYW5zcG9ydHMKKyAqLworY2xhc3MgQ291cGxlZEZpbGVUcmFuc3BvcnRzIDogQ291cGxlZFRyYW5zcG9ydHMhVFRyYW5zcG9ydCB7CisgIHRoaXMoKSB7CisgICAgLy8gV2UgYWN0dWFsbHkgbmVlZCB0aGUgZmlsZSBuYW1lIG9mIHRoZSB0ZW1wIGZpbGUgaGVyZSwgc28gd2UgY2FuJ3QganVzdAorICAgIC8vIHVzZSB0aGUgdXN1YWwgdGVtcGZpbGUgZmFjaWxpdGllcy4KKyAgICBkbyB7CisgICAgICBmaWxlTmFtZV8gPSB0bXBEaXIgfiAiL3RocmlmdC50cmFuc3BvcnRfdGVzdC4iIH4gdG8hc3RyaW5nKHJuZEdlbigpLmZyb250KTsKKyAgICAgIHJuZEdlbigpLnBvcEZyb250KCk7CisgICAgfSB3aGlsZSAoc3RkLmZpbGUuZXhpc3RzKGZpbGVOYW1lXykpOworCisgICAgd3JpdGVmbG4oIlVzaW5nIHRlbXAgZmlsZTogJXMiLCBmaWxlTmFtZV8pOworCisgICAgYXV0byB3cml0ZXIgPSBuZXcgVEZpbGVXcml0ZXJUcmFuc3BvcnQoZmlsZU5hbWVfKTsKKyAgICB3cml0ZXIub3BlbigpOworICAgIG91dHB1dCA9IHdyaXRlcjsKKworICAgIC8vIFdhaXQgdW50aWwgdGhlIGZpbGUgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICB3cml0ZXIuZmx1c2goKTsKKworICAgIGF1dG8gcmVhZGVyID0gbmV3IFRGaWxlUmVhZGVyVHJhbnNwb3J0KGZpbGVOYW1lXyk7CisgICAgcmVhZGVyLm9wZW4oKTsKKyAgICByZWFkZXIucmVhZFRpbWVvdXQoZHVyISJtc2VjcyIoLTEpKTsKKyAgICBpbnB1dCA9IHJlYWRlcjsKKyAgfQorCisgIH50aGlzKCkgeworICAgIGlucHV0LmNsb3NlKCk7CisgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgc3RkLmZpbGUucmVtb3ZlKGZpbGVOYW1lXyk7CisgIH0KKworICBzdGF0aWMgc3RyaW5nIHRtcERpcjsKKworcHJpdmF0ZToKKyAgc3RyaW5nIGZpbGVOYW1lXzsKK30KKworCisvKgorICogVGVzdCBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIFRlc3QgaW50ZXJsZWF2ZWQgd3JpdGUgYW5kIHJlYWQgY2FsbHMuCisgKgorICogR2VuZXJhdGVzIGEgYnVmZmVyIHRvdGFsU2l6ZSBieXRlcyBsb25nLCB0aGVuIHdyaXRlcyBpdCB0byB0aGUgdHJhbnNwb3J0LAorICogYW5kIHZlcmlmaWVzIHRoZSB3cml0dGVuIGRhdGEgY2FuIGJlIHJlYWQgYmFjayBjb3JyZWN0bHkuCisgKgorICogTW9kZSBvZiBvcGVyYXRpb246CisgKiAtIGNhbGwgd0NodW5rR2VuZXJhdG9yIHRvIGZpZ3VyZSBvdXQgaG93IGxhcmdlIG9mIGEgY2h1bmsgdG8gd3JpdGUKKyAqICAgLSBjYWxsIHdTaXplR2VuZXJhdG9yIHRvIGdldCB0aGUgc2l6ZSBmb3IgaW5kaXZpZHVhbCB3cml0ZSgpIGNhbGxzLAorICogICAgIGFuZCBkbyB0aGlzIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVudGlyZSBjaHVuayBpcyB3cml0dGVuLgorICogLSBjYWxsIHJDaHVua0dlbmVyYXRvciB0byBmaWd1cmUgb3V0IGhvdyBsYXJnZSBvZiBhIGNodW5rIHRvIHJlYWQKKyAqICAgLSBjYWxsIHJTaXplR2VuZXJhdG9yIHRvIGdldCB0aGUgc2l6ZSBmb3IgaW5kaXZpZHVhbCByZWFkKCkgY2FsbHMsCisgKiAgICAgYW5kIGRvIHRoaXMgcmVwZWF0ZWRseSB1bnRpbCB0aGUgZW50aXJlIGNodW5rIGlzIHJlYWQuCisgKiAtIHJlcGVhdCB1bnRpbCB0aGUgZnVsbCBidWZmZXIgaXMgd3JpdHRlbiBhbmQgcmVhZCBiYWNrLAorICogICB0aGVuIGNvbXBhcmUgdGhlIGRhdGEgcmVhZCBiYWNrIGFnYWluc3QgdGhlIG9yaWdpbmFsIGJ1ZmZlcgorICoKKyAqCisgKiAtIElmIGFueSBvZiB0aGUgc2l6ZSBnZW5lcmF0b3JzIHJldHVybiAwLCB0aGlzIG1lYW5zIHRvIHVzZSB0aGUgbWF4aW11bQorICogICBwb3NzaWJsZSBzaXplLgorICoKKyAqIC0gSWYgbWF4T3V0c3RhbmRpbmcgaXMgbm9uLXplcm8sIHdyaXRlIGNodW5rIHNpemVzIHdpbGwgYmUgY2hvc2VuIHN1Y2ggdGhhdAorICogICB0aGVyZSBhcmUgbmV2ZXIgbW9yZSB0aGFuIG1heE91dHN0YW5kaW5nIGJ5dGVzIHdhaXRpbmcgdG8gYmUgcmVhZCBiYWNrLgorICovCit2b2lkIHRlc3RSZWFkV3JpdGUoQ291cGxlZFRyYW5zcG9ydHMpKAorICBzaXplX3QgdG90YWxTaXplLAorICBTaXplR2VuZXJhdG9yIHdTaXplR2VuZXJhdG9yLAorICBTaXplR2VuZXJhdG9yIHJTaXplR2VuZXJhdG9yLAorICBTaXplR2VuZXJhdG9yIHdDaHVua0dlbmVyYXRvciwKKyAgU2l6ZUdlbmVyYXRvciByQ2h1bmtHZW5lcmF0b3IsCisgIHNpemVfdCBtYXhPdXRzdGFuZGluZworKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICBzY29wZSB0cmFuc3BvcnRzID0gbmV3IENvdXBsZWRUcmFuc3BvcnRzOworICBhc3NlcnQodHJhbnNwb3J0cy5pbnB1dCk7CisgIGFzc2VydCh0cmFuc3BvcnRzLm91dHB1dCk7CisKKyAgYXV0byB3YnVmID0gbmV3IHVieXRlW3RvdGFsU2l6ZV07CisgIGF1dG8gcmJ1ZiA9IG5ldyB1Ynl0ZVt0b3RhbFNpemVdOworCisgIC8vIFN0b3JlIHNvbWUgZGF0YSBpbiB3YnVmLgorICBmb3JlYWNoIChpLCByZWYgYjsgd2J1ZikgeworICAgIGIgPSBpICYgMHhmZjsKKyAgfQorCisgIHNpemVfdCB0b3RhbFdyaXR0ZW47CisgIHNpemVfdCB0b3RhbFJlYWQ7CisgIHdoaWxlICh0b3RhbFJlYWQgPCB0b3RhbFNpemUpIHsKKyAgICAvLyBEZXRlcm1pbmUgaG93IGxhcmdlIGEgY2h1bmsgb2YgZGF0YSB0byB3cml0ZS4KKyAgICBhdXRvIHdDaHVua1NpemUgPSB3Q2h1bmtHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICBpZiAod0NodW5rU2l6ZSA9PSAwIHx8IHdDaHVua1NpemUgPiB0b3RhbFNpemUgLSB0b3RhbFdyaXR0ZW4pIHsKKyAgICAgIHdDaHVua1NpemUgPSB0b3RhbFNpemUgLSB0b3RhbFdyaXR0ZW47CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlICh0b3RhbFdyaXR0ZW4gLSB0b3RhbFJlYWQpICsgd0NodW5rU2l6ZSBpcyBsZXNzIHRoYW4KKyAgICAvLyBtYXhPdXRzdGFuZGluZy4KKyAgICBpZiAobWF4T3V0c3RhbmRpbmcgPiAwICYmCisgICAgICAgIHdDaHVua1NpemUgPiBtYXhPdXRzdGFuZGluZyAtICh0b3RhbFdyaXR0ZW4gLSB0b3RhbFJlYWQpKSB7CisgICAgICB3Q2h1bmtTaXplID0gbWF4T3V0c3RhbmRpbmcgLSAodG90YWxXcml0dGVuIC0gdG90YWxSZWFkKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgY2h1bmsuCisgICAgc2l6ZV90IGNodW5rV3JpdHRlbiA9IDA7CisgICAgd2hpbGUgKGNodW5rV3JpdHRlbiA8IHdDaHVua1NpemUpIHsKKyAgICAgIGF1dG8gd3JpdGVTaXplID0gd1NpemVHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICAgIGlmICh3cml0ZVNpemUgPT0gMCB8fCB3cml0ZVNpemUgPiB3Q2h1bmtTaXplIC0gY2h1bmtXcml0dGVuKSB7CisgICAgICAgIHdyaXRlU2l6ZSA9IHdDaHVua1NpemUgLSBjaHVua1dyaXR0ZW47CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydHMub3V0cHV0LndyaXRlKHdidWZbdG90YWxXcml0dGVuIC4uIHRvdGFsV3JpdHRlbiArIHdyaXRlU2l6ZV0pOworICAgICAgY2h1bmtXcml0dGVuICs9IHdyaXRlU2l6ZTsKKyAgICAgIHRvdGFsV3JpdHRlbiArPSB3cml0ZVNpemU7CisgICAgfQorCisgICAgLy8gRmx1c2ggdGhlIGRhdGEsIHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSByZWFkIHRyYW5zcG9ydAorICAgIC8vIERvbid0IGZsdXNoIGlmIHdDaHVua1NpemUgaXMgMC4gKFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmCisgICAgLy8gdG90YWxXcml0dGVuID09IHRvdGFsU2l6ZSBhbHJlYWR5LCBhbmQgd2UncmUgb25seSByZWFkaW5nIG5vdy4pCisgICAgaWYgKHdDaHVua1NpemUgPiAwKSB7CisgICAgICB0cmFuc3BvcnRzLm91dHB1dC5mbHVzaCgpOworICAgIH0KKworICAgIC8vIERldGVybWluZSBob3cgbGFyZ2UgYSBjaHVuayBvZiBkYXRhIHRvIHJlYWQgYmFjay4KKyAgICBhdXRvIHJDaHVua1NpemUgPSByQ2h1bmtHZW5lcmF0b3IubmV4dFNpemUoKTsKKyAgICBpZiAockNodW5rU2l6ZSA9PSAwIHx8IHJDaHVua1NpemUgPiB0b3RhbFdyaXR0ZW4gLSB0b3RhbFJlYWQpIHsKKyAgICAgIHJDaHVua1NpemUgPSB0b3RhbFdyaXR0ZW4gLSB0b3RhbFJlYWQ7CisgICAgfQorCisgICAgLy8gUmVhZCB0aGUgY2h1bmsuCisgICAgc2l6ZV90IGNodW5rUmVhZDsKKyAgICB3aGlsZSAoY2h1bmtSZWFkIDwgckNodW5rU2l6ZSkgeworICAgICAgYXV0byByZWFkU2l6ZSA9IHJTaXplR2VuZXJhdG9yLm5leHRTaXplKCk7CisgICAgICBpZiAocmVhZFNpemUgPT0gMCB8fCByZWFkU2l6ZSA+IHJDaHVua1NpemUgLSBjaHVua1JlYWQpIHsKKyAgICAgICAgcmVhZFNpemUgPSByQ2h1bmtTaXplIC0gY2h1bmtSZWFkOworICAgICAgfQorCisgICAgICBzaXplX3QgYnl0ZXNSZWFkOworICAgICAgdHJ5IHsKKyAgICAgICAgYnl0ZXNSZWFkID0gdHJhbnNwb3J0cy5pbnB1dC5yZWFkKAorICAgICAgICAgIHJidWZbdG90YWxSZWFkIC4uIHRvdGFsUmVhZCArIHJlYWRTaXplXSk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihmb3JtYXQoYHJlYWQocG9zID0gJXMsIHNpemUgPSAlcykgdGhyZXcgYCB+CisgICAgICAgICAgYGV4Y2VwdGlvbiAiJXMiOyB3cml0dGVuIHNvIGZhcjogJXMvJXMgYnl0ZXNgLCB0b3RhbFJlYWQsIHJlYWRTaXplLAorICAgICAgICAgIGUubXNnLCB0b3RhbFdyaXR0ZW4sIHRvdGFsU2l6ZSkpOworICAgICAgfQorCisgICAgICBlbmZvcmNlKGJ5dGVzUmVhZCA+IDAsIGZvcm1hdChgcmVhZChwb3MgPSAlcywgc2l6ZSA9ICVzKSByZXR1cm5lZCAlczsgYCB+CisgICAgICAgIGB3cml0dGVuIHNvIGZhcjogJXMvJXMgYnl0ZXNgLCB0b3RhbFJlYWQsIHJlYWRTaXplLCBieXRlc1JlYWQsCisgICAgICAgIHRvdGFsV3JpdHRlbiwgdG90YWxTaXplKSk7CisKKyAgICAgIGNodW5rUmVhZCArPSBieXRlc1JlYWQ7CisgICAgICB0b3RhbFJlYWQgKz0gYnl0ZXNSZWFkOworICAgIH0KKyAgfQorCisgIC8vIG1ha2Ugc3VyZSB0aGUgZGF0YSByZWFkIGJhY2sgaXMgaWRlbnRpY2FsIHRvIHRoZSBkYXRhIHdyaXR0ZW4KKyAgaWYgKHJidWYgIT0gd2J1ZikgeworICAgIHN0ZGVyci53cml0ZWZsbigiJXMgdnMuICVzIiwgd2J1ZlskIC0gNCAuLiAkXSwgcmJ1ZlskIC0gNCAuLiAkXSk7CisgICAgc3RkZXJyLndyaXRlZmxuKCJyYnVmOiAlcyB2cy4gd2J1ZjogJXMiLCByYnVmLmxlbmd0aCwgd2J1Zi5sZW5ndGgpOworICB9CisgIGVuZm9yY2UocmJ1ZiA9PSB3YnVmKTsKK30KKwordm9pZCB0ZXN0UmVhZFBhcnRBdmFpbGFibGUoQ291cGxlZFRyYW5zcG9ydHMpKCkgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgc2NvcGUgdHJhbnNwb3J0cyA9IG5ldyBDb3VwbGVkVHJhbnNwb3J0czsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMuaW5wdXQpOworICBhc3NlcnQodHJhbnNwb3J0cy5vdXRwdXQpOworCisgIHVieXRlWzEwXSB3cml0ZUJ1ZiA9ICdhJzsKKyAgdWJ5dGVbMTBdIHJlYWRCdWY7CisKKyAgLy8gQXR0ZW1waW5nIHRvIHJlYWQgMTAgYnl0ZXMgd2hlbiBvbmx5IDkgYXJlIGF2YWlsYWJsZSBzaG91bGQgcmV0dXJuIDkKKyAgLy8gaW1tZWRpYXRlbHkuCisgIHRyYW5zcG9ydHMub3V0cHV0LndyaXRlKHdyaXRlQnVmWzAgLi4gOV0pOworICB0cmFuc3BvcnRzLm91dHB1dC5mbHVzaCgpOworCisgIGF1dG8gdCA9IFRyaWdnZXIoZHVyISJzZWNvbmRzIigzKSwgdHJhbnNwb3J0cy5vdXRwdXQsIDEpOworICBhdXRvIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydHMuaW5wdXQucmVhZChyZWFkQnVmKTsKKyAgZW5mb3JjZSh0LmZpcmVkID09IDApOworICBlbmZvcmNlKGJ5dGVzUmVhZCA9PSA5KTsKK30KKwordm9pZCB0ZXN0UmVhZFBhcnRpYWxNaWRmcmFtZShDb3VwbGVkVHJhbnNwb3J0cykoKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICBzY29wZSB0cmFuc3BvcnRzID0gbmV3IENvdXBsZWRUcmFuc3BvcnRzOworICBhc3NlcnQodHJhbnNwb3J0cy5pbnB1dCk7CisgIGFzc2VydCh0cmFuc3BvcnRzLm91dHB1dCk7CisKKyAgdWJ5dGVbMTNdIHdyaXRlQnVmID0gJ2EnOworICB1Ynl0ZVsxNF0gcmVhZEJ1ZjsKKworICAvLyBBdHRlbXB0IHRvIHJlYWQgMTAgYnl0ZXMsIHdoZW4gb25seSA5IGFyZSBhdmFpbGFibGUsIGJ1dCBhZnRlciB3ZSBoYXZlCisgIC8vIGFscmVhZHkgcmVhZCBwYXJ0IG9mIHRoZSBkYXRhIHRoYXQgaXMgYXZhaWxhYmxlLiAgVGhpcyBleGVyY2lzZXMgYQorICAvLyBkaWZmZXJlbnQgY29kZSBwYXRoIGZvciBzZXZlcmFsIG9mIHRoZSB0cmFuc3BvcnRzLgorICAvLworICAvLyBGb3IgdHJhbnNwb3J0cyB0aGF0IGFkZCB0aGVpciBvd24gZnJhbWluZyAoZS5nLiwgVEZyYW1lZFRyYW5zcG9ydCBhbmQKKyAgLy8gVEZpbGVUcmFuc3BvcnQpLCB0aGUgdHdvIGZsdXNoIGNhbGxzIGJyZWFrIHVwIHRoZSBkYXRhIGluIHRvIGEgMTAgYnl0ZQorICAvLyBmcmFtZSBhbmQgYSAzIGJ5dGUgZnJhbWUuICBUaGUgZmlyc3QgcmVhZCB0aGVuIHB1dHMgdXMgcGFydHdheSB0aHJvdWdoIHRoZQorICAvLyBmaXJzdCBmcmFtZSwgYW5kIHRoZW4gd2UgYXR0ZW1wdCB0byByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGF0IGZyYW1lLCBhbmQKKyAgLy8gdGhyb3VnaCB0aGUgbmV4dCBmcmFtZSwgdG9vLgorICAvLworICAvLyBGb3IgYnVmZmVyZWQgdHJhbnNwb3J0cyB0aGF0IHBlcmZvcm0gcmVhZC1haGVhZCAoZS5nLiwKKyAgLy8gVEJ1ZmZlcmVkVHJhbnNwb3J0KSwgdGhlIHJlYWQtYWhlYWQgd2lsbCBtb3N0IGxpa2VseSBzZWUgYWxsIDEzIGJ5dGVzCisgIC8vIHdyaXR0ZW4gb24gdGhlIGZpcnN0IHJlYWQuICBUaGUgbmV4dCByZWFkIHdpbGwgdGhlbiBhdHRlbXB0IHRvIHJlYWQgcGFzdAorICAvLyB0aGUgZW5kIG9mIHRoZSByZWFkLWFoZWFkIGJ1ZmZlci4KKyAgLy8KKyAgLy8gRmx1c2ggMTAgYnl0ZXMsIHRoZW4gMyBieXRlcy4gIFRoaXMgY3JlYXRlcyAyIHNlcGFyYXRlIGZyYW1lcyBmb3IKKyAgLy8gdHJhbnNwb3J0cyB0aGF0IHRyYWNrIGZyYW1pbmcgaW50ZXJuYWxseS4KKyAgdHJhbnNwb3J0cy5vdXRwdXQud3JpdGUod3JpdGVCdWZbMCAuLiAxMF0pOworICB0cmFuc3BvcnRzLm91dHB1dC5mbHVzaCgpOworICB0cmFuc3BvcnRzLm91dHB1dC53cml0ZSh3cml0ZUJ1ZlsxMCAuLiAxM10pOworICB0cmFuc3BvcnRzLm91dHB1dC5mbHVzaCgpOworCisgIC8vIE5vdyByZWFkIDQgYnl0ZXMsIHNvIHRoYXQgd2UgYXJlIHBhcnR3YXkgdGhyb3VnaCB0aGUgd3JpdHRlbiBkYXRhLgorICBhdXRvIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydHMuaW5wdXQucmVhZChyZWFkQnVmWzAgLi4gNF0pOworICBlbmZvcmNlKGJ5dGVzUmVhZCA9PSA0KTsKKworICAvLyBOb3cgYXR0ZW1wdCB0byByZWFkIDEwIGJ5dGVzLiAgT25seSA5IG1vcmUgYXJlIGF2YWlsYWJsZS4KKyAgLy8KKyAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCA5IGJ5dGVzLCBidXQgaXQgbWlnaHQgdGFrZSBtdWx0aXBsZSByZWFkCisgIC8vIGNhbGxzLCBzaW5jZSBpdCBpcyB2YWxpZCBmb3IgcmVhZCgpIHRvIHJldHVybiBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZC4KKyAgLy8gKE1vc3QgdHJhbnNwb3J0cyBkbyBpbW1lZGlhdGVseSByZXR1cm4gOSBieXRlcywgYnV0IHRoZSBmcmFtaW5nIHRyYW5zcG9ydHMKKyAgLy8gdGVuZCB0byBvbmx5IHJldHVybiB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lLCB3aGljaCBpcyA2IGJ5dGVzIGluCisgIC8vIHRoaXMgY2FzZS4pCisgIHNpemVfdCB0b3RhbFJlYWQgPSAwOworICB3aGlsZSAodG90YWxSZWFkIDwgOSkgeworICAgIGF1dG8gdCA9IFRyaWdnZXIoZHVyISJzZWNvbmRzIigzKSwgdHJhbnNwb3J0cy5vdXRwdXQsIDEpOworICAgIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydHMuaW5wdXQucmVhZChyZWFkQnVmWzQgKyB0b3RhbFJlYWQgLi4gMTRdKTsKKyAgICBlbmZvcmNlKHQuZmlyZWQgPT0gMCk7CisgICAgZW5mb3JjZShieXRlc1JlYWQgPiAwKTsKKyAgICB0b3RhbFJlYWQgKz0gYnl0ZXNSZWFkOworICAgIGVuZm9yY2UodG90YWxSZWFkIDw9IDkpOworICB9CisKKyAgZW5mb3JjZSh0b3RhbFJlYWQgPT0gOSk7Cit9CisKK3ZvaWQgdGVzdEJvcnJvd1BhcnRBdmFpbGFibGUoQ291cGxlZFRyYW5zcG9ydHMpKCkgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgc2NvcGUgdHJhbnNwb3J0cyA9IG5ldyBDb3VwbGVkVHJhbnNwb3J0czsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMuaW5wdXQpOworICBhc3NlcnQodHJhbnNwb3J0cy5vdXRwdXQpOworCisgIHVieXRlWzldIHdyaXRlQnVmID0gJ2EnOworICB1Ynl0ZVsxMF0gcmVhZEJ1ZjsKKworICAvLyBBdHRlbXBpbmcgdG8gYm9ycm93IDEwIGJ5dGVzIHdoZW4gb25seSA5IGFyZSBhdmFpbGFibGUgc2hvdWxkIHJldHVybiBOVUxMCisgIC8vIGltbWVkaWF0ZWx5LgorICB0cmFuc3BvcnRzLm91dHB1dC53cml0ZSh3cml0ZUJ1Zik7CisgIHRyYW5zcG9ydHMub3V0cHV0LmZsdXNoKCk7CisKKyAgYXV0byB0ID0gVHJpZ2dlcihkdXIhInNlY29uZHMiKDMpLCB0cmFuc3BvcnRzLm91dHB1dCwgMSk7CisgIGF1dG8gYm9ycm93TGVuID0gcmVhZEJ1Zi5sZW5ndGg7CisgIGF1dG8gYm9ycm93ZWRCdWYgPSB0cmFuc3BvcnRzLmlucHV0LmJvcnJvdyhyZWFkQnVmLnB0ciwgYm9ycm93TGVuKTsKKyAgZW5mb3JjZSh0LmZpcmVkID09IDApOworICBlbmZvcmNlKGJvcnJvd2VkQnVmIGlzIG51bGwpOworfQorCit2b2lkIHRlc3RSZWFkTm9uZUF2YWlsYWJsZShDb3VwbGVkVHJhbnNwb3J0cykoKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICBzY29wZSB0cmFuc3BvcnRzID0gbmV3IENvdXBsZWRUcmFuc3BvcnRzOworICBhc3NlcnQodHJhbnNwb3J0cy5pbnB1dCk7CisgIGFzc2VydCh0cmFuc3BvcnRzLm91dHB1dCk7CisKKyAgLy8gQXR0ZW1wdGluZyB0byByZWFkIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUgc2hvdWxkIGVpdGhlciBibG9jayB1bnRpbAorICAvLyBzb21lIGRhdGEgaXMgYXZhaWxhYmxlLCBvciBmYWlsIGltbWVkaWF0ZWx5LiAgKGUuZy4sIFRTb2NrZXQgYmxvY2tzLAorICAvLyBUTWVtb3J5QnVmZmVyIGp1c3QgZmFpbHMuKQorICAvLworICAvLyBJZiB0aGUgdHJhbnNwb3J0IGJsb2NrcywgaXQgc2hvdWxkIHN1Y2NlZWQgb25jZSBzb21lIGRhdGEgaXMgYXZhaWxhYmxlLAorICAvLyBldmVuIGlmIGxlc3MgdGhhbiB0aGUgYW1vdW50IHJlcXVlc3RlZCBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgdWJ5dGVbMTBdIHJlYWRCdWY7CisKKyAgYXV0byB0ID0gVHJpZ2dlcihkdXIhInNlY29uZHMiKDEpLCB0cmFuc3BvcnRzLm91dHB1dCwgMik7CisgIHQuYWRkKGR1ciEic2Vjb25kcyIoMSksIHRyYW5zcG9ydHMub3V0cHV0LCA4KTsKKworICBhdXRvIGJ5dGVzUmVhZCA9IHRyYW5zcG9ydHMuaW5wdXQucmVhZChyZWFkQnVmKTsKKyAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgZW5mb3JjZSh0LmZpcmVkID09IDApOworICB9IGVsc2UgeworICAgIGVuZm9yY2UodC5maXJlZCA9PSAxKTsKKyAgICBlbmZvcmNlKGJ5dGVzUmVhZCA9PSAyKTsKKyAgfQorfQorCit2b2lkIHRlc3RCb3Jyb3dOb25lQXZhaWxhYmxlKENvdXBsZWRUcmFuc3BvcnRzKSgpIGlmICgKKyAgaXNDb3VwbGVkVHJhbnNwb3J0cyFDb3VwbGVkVHJhbnNwb3J0cworKSB7CisgIHNjb3BlIHRyYW5zcG9ydHMgPSBuZXcgQ291cGxlZFRyYW5zcG9ydHM7CisgIGFzc2VydCh0cmFuc3BvcnRzLmlucHV0KTsKKyAgYXNzZXJ0KHRyYW5zcG9ydHMub3V0cHV0KTsKKworICB1Ynl0ZVsxNl0gd3JpdGVCdWYgPSAnYSc7CisKKyAgLy8gQXR0ZW1wdGluZyB0byBib3Jyb3cgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSBzaG91bGQgZmFpbCBpbW1lZGlhdGVseQorICBhdXRvIHQgPSBUcmlnZ2VyKGR1ciEic2Vjb25kcyIoMSksIHRyYW5zcG9ydHMub3V0cHV0LCAxMCk7CisKKyAgYXV0byBib3Jyb3dMZW4gPSAxMDsKKyAgYXV0byBib3Jyb3dlZEJ1ZiA9IHRyYW5zcG9ydHMuaW5wdXQuYm9ycm93KG51bGwsIGJvcnJvd0xlbik7CisgIGVuZm9yY2UoYm9ycm93ZWRCdWYgaXMgbnVsbCk7CisgIGVuZm9yY2UodC5maXJlZCA9PSAwKTsKK30KKworCit2b2lkIGRvUndUZXN0KENvdXBsZWRUcmFuc3BvcnRzKSgKKyAgc2l6ZV90IHRvdGFsU2l6ZSwKKyAgU2l6ZUdlbmVyYXRvciB3U2l6ZUdlbiwKKyAgU2l6ZUdlbmVyYXRvciByU2l6ZUdlbiwKKyAgU2l6ZUdlbmVyYXRvciB3Q2h1bmtTaXplR2VuID0gbmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcigwKSwKKyAgU2l6ZUdlbmVyYXRvciByQ2h1bmtTaXplR2VuID0gbmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcigwKSwKKyAgc2l6ZV90IG1heE91dHN0YW5kaW5nID0gMAorKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQ291cGxlZFRyYW5zcG9ydHMKKykgeworICB0b3RhbFNpemUgPSBjYXN0KHNpemVfdCkodG90YWxTaXplICogZ19zaXplTXVsdGlwbGllcik7CisKKyAgc2NvcGUoZmFpbHVyZSkgeworICAgIHdyaXRlZmxuKCJUZXN0IGZhaWxlZCBmb3IgJXM6IHRlc3RSZWFkV3JpdGUoJXMsICVzLCAlcywgJXMsICVzLCAlcykiLAorICAgICAgQ291cGxlZFRyYW5zcG9ydHMuc3RyaW5nb2YsIHRvdGFsU2l6ZSwgd1NpemVHZW4sIHJTaXplR2VuLAorICAgICAgd0NodW5rU2l6ZUdlbiwgckNodW5rU2l6ZUdlbiwgbWF4T3V0c3RhbmRpbmcpOworICB9CisKKyAgdGVzdFJlYWRXcml0ZSFDb3VwbGVkVHJhbnNwb3J0cyh0b3RhbFNpemUsIHdTaXplR2VuLCByU2l6ZUdlbiwKKyAgICB3Q2h1bmtTaXplR2VuLCByQ2h1bmtTaXplR2VuLCBtYXhPdXRzdGFuZGluZyk7Cit9CisKK3ZvaWQgZG9CbG9ja2luZ1Rlc3QoQ291cGxlZFRyYW5zcG9ydHMpKCkgaWYgKAorICBpc0NvdXBsZWRUcmFuc3BvcnRzIUNvdXBsZWRUcmFuc3BvcnRzCispIHsKKyAgdm9pZCB3cml0ZUZhaWx1cmUoc3RyaW5nIG5hbWUpIHsKKyAgICB3cml0ZWZsbigiVGVzdCBmYWlsZWQgZm9yICVzOiAlcygpIiwgQ291cGxlZFRyYW5zcG9ydHMuc3RyaW5nb2YsIG5hbWUpOworICB9CisKKyAgeworICAgIHNjb3BlKGZhaWx1cmUpIHdyaXRlRmFpbHVyZSgidGVzdFJlYWRQYXJ0QXZhaWxhYmxlIik7CisgICAgdGVzdFJlYWRQYXJ0QXZhaWxhYmxlIUNvdXBsZWRUcmFuc3BvcnRzKCk7CisgIH0KKworICB7CisgICAgc2NvcGUoZmFpbHVyZSkgd3JpdGVGYWlsdXJlKCJ0ZXN0UmVhZFBhcnRpYWxNaWRmcmFtZSIpOworICAgIHRlc3RSZWFkUGFydGlhbE1pZGZyYW1lIUNvdXBsZWRUcmFuc3BvcnRzKCk7CisgIH0KKworICB7CisgICAgc2NvcGUoZmFpbHVyZSkgd3JpdGVGYWlsdXJlKCJ0ZXN0UmVhZE5vbmVBdmFsaWFibGUiKTsKKyAgICB0ZXN0UmVhZE5vbmVBdmFpbGFibGUhQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgfQorCisgIHsKKyAgICBzY29wZShmYWlsdXJlKSB3cml0ZUZhaWx1cmUoInRlc3RCb3Jyb3dQYXJ0QXZhaWxhYmxlIik7CisgICAgdGVzdEJvcnJvd1BhcnRBdmFpbGFibGUhQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgfQorCisgIHsKKyAgICBzY29wZShmYWlsdXJlKSB3cml0ZUZhaWx1cmUoInRlc3RCb3Jyb3dOb25lQXZhaWxhYmxlIik7CisgICAgdGVzdEJvcnJvd05vbmVBdmFpbGFibGUhQ291cGxlZFRyYW5zcG9ydHMoKTsKKyAgfQorfQorCitTaXplR2VuZXJhdG9yIGdldEdlbmVyYXRvcihUKShUIHQpIHsKKyAgc3RhdGljIGlmIChpcyhUIDogU2l6ZUdlbmVyYXRvcikpIHsKKyAgICByZXR1cm4gdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcih0KTsKKyAgfQorfQorCit0ZW1wbGF0ZSBXcmFwcGVkVHJhbnNwb3J0cyhUKSBpZiAoaXNDb3VwbGVkVHJhbnNwb3J0cyFUKSB7CisgIGFsaWFzIFR5cGVUdXBsZSEoCisgICAgVCwKKyAgICBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzIVQsCisgICAgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHMhVCwKKyAgICBDb3VwbGVkWmxpYlRyYW5zcG9ydHMhVAorICApIFdyYXBwZWRUcmFuc3BvcnRzOworfQorCit2b2lkIHRlc3RSdyhDLCBSLCBTKSgKKyAgc2l6ZV90IHRvdGFsU2l6ZSwKKyAgUiB3U2l6ZSwKKyAgUyByU2l6ZQorKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQyAmJiBpcyh0eXBlb2YoZ2V0R2VuZXJhdG9yKHdTaXplKSkpICYmCisgIGlzKHR5cGVvZihnZXRHZW5lcmF0b3IoclNpemUpKSkKKykgeworICB0ZXN0UnchQyh0b3RhbFNpemUsIHdTaXplLCByU2l6ZSwgMCwgMCwgMCk7Cit9CisKK3ZvaWQgdGVzdFJ3KEMsIFIsIFMsIFQsIFUpKAorICBzaXplX3QgdG90YWxTaXplLAorICBSIHdTaXplLAorICBTIHJTaXplLAorICBUIHdDaHVua1NpemUsCisgIFUgckNodW5rU2l6ZSwKKyAgc2l6ZV90IG1heE91dHN0YW5kaW5nID0gMAorKSBpZiAoCisgIGlzQ291cGxlZFRyYW5zcG9ydHMhQyAmJiBpcyh0eXBlb2YoZ2V0R2VuZXJhdG9yKHdTaXplKSkpICYmCisgIGlzKHR5cGVvZihnZXRHZW5lcmF0b3IoclNpemUpKSkgJiYgaXModHlwZW9mKGdldEdlbmVyYXRvcih3Q2h1bmtTaXplKSkpICYmCisgIGlzKHR5cGVvZihnZXRHZW5lcmF0b3IockNodW5rU2l6ZSkpKQorKSB7CisgIGZvcmVhY2ggKFQ7IFdyYXBwZWRUcmFuc3BvcnRzIUMpIHsKKyAgICBkb1J3VGVzdCFUKAorICAgICAgdG90YWxTaXplLAorICAgICAgZ2V0R2VuZXJhdG9yKHdTaXplKSwKKyAgICAgIGdldEdlbmVyYXRvcihyU2l6ZSksCisgICAgICBnZXRHZW5lcmF0b3Iod0NodW5rU2l6ZSksCisgICAgICBnZXRHZW5lcmF0b3IockNodW5rU2l6ZSksCisgICAgICBtYXhPdXRzdGFuZGluZworICAgICk7CisgIH0KK30KKwordm9pZCB0ZXN0QmxvY2tpbmcoQykoKSBpZiAoaXNDb3VwbGVkVHJhbnNwb3J0cyFDKSB7CisgIGZvcmVhY2ggKFQ7IFdyYXBwZWRUcmFuc3BvcnRzIUMpIHsKKyAgICBkb0Jsb2NraW5nVGVzdCFUKCk7CisgIH0KK30KKworLy8gQSBxdWljayBoYWNrLCBmb3IgdGhlIHNha2Ugb2YgYnJldml0eeKApgorZmxvYXQgZ19zaXplTXVsdGlwbGllciA9IDE7CisKK3ZlcnNpb24gKFBvc2l4KSB7CisgIGltbXV0YWJsZSBkZWZhdWx0VGVtcERpciA9ICIvdG1wIjsKK30gZWxzZSB2ZXJzaW9uIChXaW5kb3dzKSB7CisgIGltcG9ydCBjb3JlLnN5cy53aW5kb3dzLndpbmRvd3M7CisgIGV4dGVybihXaW5kb3dzKSBEV09SRCBHZXRUZW1wUGF0aEEoRFdPUkQgbkJ1ZmZlckxlbmd0aCwgTFBUU1RSIGxwQnVmZmVyKTsKKworICBzdHJpbmcgZGVmYXVsdFRlbXBEaXIoKSBAcHJvcGVydHkgeworICAgIGNoYXJbTUFYX1BBVEggKyAxXSBkaXI7CisgICAgZW5mb3JjZShHZXRUZW1wUGF0aEEoZGlyLmxlbmd0aCwgZGlyLnB0cikpOworICAgIHJldHVybiB0byFzdHJpbmcoZGlyLnB0cilbMCAuLiAkIC0gMV07CisgIH0KK30gZWxzZSBzdGF0aWMgYXNzZXJ0KGZhbHNlKTsKKwordm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKKyAgaW50IHNlZWQgPSB1bnByZWRpY3RhYmxlU2VlZCgpOworICBzdHJpbmcgdG1wRGlyID0gZGVmYXVsdFRlbXBEaXI7CisKKyAgZ2V0b3B0KGFyZ3MsICJzZWVkIiwgJnNlZWQsICJzaXplLW11bHRpcGxpZXIiLCAmZ19zaXplTXVsdGlwbGllciwKKyAgICAidG1wLWRpciIsICZ0bXBEaXIpOworICBlbmZvcmNlKGdfc2l6ZU11bHRpcGxpZXIgPj0gMCwgIlNpemUgbXVsdGlwbGllciBtdXN0IG5vdCBiZSBuZWdhdGl2ZS4iKTsKKworICB3cml0ZWZsbigiVXNpbmcgc2VlZDogJXMiLCBzZWVkKTsKKyAgcm5kR2VuKCkuc2VlZChzZWVkKTsKKyAgQ291cGxlZEZpbGVUcmFuc3BvcnRzLnRtcERpciA9IHRtcERpcjsKKworICBhdXRvIHJhbmQ0ayA9IG5ldyBSYW5kb21TaXplR2VuZXJhdG9yKDEsIDQwOTYpOworCisgIC8qCisgICAqIFdlIGRvIHRoZSBiYXNpY2FsbHkgdGhlIHNhbWUgc2V0IG9mIHRlc3RzIGZvciBlYWNoIHRyYW5zcG9ydCB0eXBlLAorICAgKiBhbHRob3VnaCB3ZSB0d2VhayB0aGUgcGFyYW1ldGVycyBpbiBzb21lIHBsYWNlcy4KKyAgICovCisKKyAgLy8gVE1lbW9yeUJ1ZmZlciB0ZXN0cworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDEwMjQsIDAsIDApOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDI1NiwgMTY3LCAxNjMpOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDE2LCAxLCAxKTsKKworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRNZW1vcnlCdWZmZXJzKDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkTWVtb3J5QnVmZmVycygxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKworICB0ZXN0QmxvY2tpbmchQ291cGxlZE1lbW9yeUJ1ZmZlcnMoKTsKKworICAvLyBUU29ja2V0IHRlc3RzCisgIGVudW0gc29ja2V0TWF4T3V0c3RhbmRpbmcgPSA0MDk2OworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDEwMjQsIDAsIDAsCisgICAgICAgICAgMCwgMCwgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssCisgICAgICAgICAgMCwgMCwgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgMTY3LCAxNjMsCisgICAgICAgICAgMCwgMCwgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICAvLyBEb2guICBBcHBhcmVudGx5IHdyaXRpbmcgdG8gYSBzb2NrZXQgaGFzIHNvbWUgYWRkaXRpb25hbCBvdmVyaGVhZCBmb3IKKyAgLy8gZWFjaCBzZW5kKCkgY2FsbC4gIElmIHdlIGhhdmUgbW9yZSB0aGFuIH40MDAgb3V0c3RhbmRpbmcgMS1ieXRlIHdyaXRlCisgIC8vIHJlcXVlc3RzLCBhZGRpdGlvbmFsIHNlbmQoKSBjYWxscyBzdGFydCBibG9ja2luZy4KKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAxNiwgMSwgMSwKKyAgICAgICAgICAwLCAwLCAyNTApOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgMCwgMCwKKyAgICAgICAgICByYW5kNGssIHJhbmQ0aywgc29ja2V0TWF4T3V0c3RhbmRpbmcpOworICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssCisgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldE1heE91dHN0YW5kaW5nKTsKKyAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIDE2NywgMTYzLAorICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRNYXhPdXRzdGFuZGluZyk7CisgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMTYsIDEsIDEsCisgICAgICAgICAgcmFuZDRrLCByYW5kNGssIDI1MCk7CisKKyAgdGVzdEJsb2NraW5nIUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKCk7CisKKyAgLy8gRmlsZSB0cmFuc3BvcnQgdGVzdHMuCisKKyAgLy8gQ2Fubm90IHdyaXRlIG1vcmUgdGhhbiB0aGUgZnJhbWUgc2l6ZSBhdCBvbmNlLgorICBlbnVtIG1heFdyaXRlQXRPbmNlID0gMTAyNCAqIDEwMjQgKiAxNiAtIDQ7CisKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMTAyNCwgbWF4V3JpdGVBdE9uY2UsIDApOworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMjU2LCAxNjcsIDE2Myk7CisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDE2LCAxLCAxKTsKKworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgdGVzdFJ3IUNvdXBsZWRGaWxlVHJhbnNwb3J0cygxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICB0ZXN0UnchQ291cGxlZEZpbGVUcmFuc3BvcnRzKDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgIHRlc3RSdyFDb3VwbGVkRmlsZVRyYW5zcG9ydHMoMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CisKKyAgdGVzdEJsb2NraW5nIUNvdXBsZWRGaWxlVHJhbnNwb3J0cygpOworfQorCisKKy8qCisgKiBUaW1lciBoYW5kbGluZyBjb2RlIGZvciB1c2UgaW4gdGVzdHMgdGhhdCBjaGVjayB0aGUgdHJhbnNwb3J0IGJsb2NraW5nCisgKiBzZW1hbnRpY3MuCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGhhY2tlZCB0b2dldGhlciBpbiBhIGh1cnJ5IGFuZCB3YXN0ZXMgYSBsb3Qgb2YKKyAqIHRocmVhZHMsIGJ1dCBzcGVlZCBzaG91bGQgbm90IGJlIHRoZSBjb25jZXJuIGhlcmUuCisgKi8KKworc3RydWN0IFRyaWdnZXIgeworICB0aGlzKER1cmF0aW9uIHRpbWVvdXQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBzaXplX3Qgd3JpdGVMZW5ndGgpIHsKKyAgICBtdXRleF8gPSBuZXcgTXV0ZXg7CisgICAgY2FuY2VsQ29uZGl0aW9uXyA9IG5ldyBDb25kaXRpb24obXV0ZXhfKTsKKyAgICBpbmZvXyA9IG5ldyBJbmZvKHRpbWVvdXQsIHRyYW5zcG9ydCwgd3JpdGVMZW5ndGgpOworICAgIHN0YXJ0VGhyZWFkKCk7CisgIH0KKworICB+dGhpcygpIHsKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgaW5mb18gPSBudWxsOworICAgICAgY2FuY2VsQ29uZGl0aW9uXy5ub3RpZnlBbGwoKTsKKyAgICB9CisgICAgaWYgKHRocmVhZF8pIHRocmVhZF8uam9pbigpOworICB9CisKKyAgQGRpc2FibGUgdGhpcyh0aGlzKSB7IGFzc2VydCgwKTsgfQorCisgIHZvaWQgYWRkKER1cmF0aW9uIHRpbWVvdXQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBzaXplX3Qgd3JpdGVMZW5ndGgpIHsKKyAgICBzeW5jaHJvbml6ZWQgKG11dGV4XykgeworICAgICAgYXV0byBpbmZvID0gbmV3IEluZm8odGltZW91dCwgdHJhbnNwb3J0LCB3cml0ZUxlbmd0aCk7CisgICAgICBpZiAoaW5mb18pIHsKKyAgICAgICAgYXV0byBwcmV2ID0gaW5mb187CisgICAgICAgIHdoaWxlIChwcmV2Lm5leHQpIHByZXYgPSBwcmV2Lm5leHQ7CisgICAgICAgIHByZXYubmV4dCA9IGluZm87CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmZvXyA9IGluZm87CisgICAgICAgIHN0YXJ0VGhyZWFkKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQHByb3BlcnR5IHNob3J0IGZpcmVkKCkgeworICAgIHJldHVybiBhdG9taWNMb2FkKGZpcmVkXyk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCB0aW1lclRocmVhZCgpIHsKKyAgICAvLyBLTFVER0U6IE1ha2Ugc3VyZSB0aGUgc3RkLmNvbmN1cnJlbmN5IG1ib3ggaXMgaW5pdGlhbGl6ZWQgb24gdGhlIHRpbWVyCisgICAgLy8gdGhyZWFkIHRvIGJlIGFibGUgdG8gdW5ibG9jayB0aGUgZmlsZSB0cmFuc3BvcnQuCisgICAgaW1wb3J0IHN0ZC5jb25jdXJyZW5jeTsKKyAgICB0aGlzVGlkOworCisgICAgc3luY2hyb25pemVkIChtdXRleF8pIHsKKyAgICAgIHdoaWxlIChpbmZvXykgeworICAgICAgICBhdXRvIGNhbmNlbGxlZCA9IGNhbmNlbENvbmRpdGlvbl8ud2FpdChpbmZvXy50aW1lb3V0KTsKKyAgICAgICAgaWYgKGNhbmNlbGxlZCkgeworICAgICAgICAgIGluZm9fID0gbnVsbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGF0b21pY09wISIrPSIoZmlyZWRfLCAxKTsKKworICAgICAgICAvLyBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIHRyYW5zcG9ydCB0byB1bmJsb2NrIGl0LgorICAgICAgICBhdXRvIGJ1ZiA9IG5ldyB1Ynl0ZVtpbmZvXy53cml0ZUxlbmd0aF07CisgICAgICAgIGJ1ZltdID0gJ2InOworICAgICAgICBpbmZvXy50cmFuc3BvcnQud3JpdGUoYnVmKTsKKyAgICAgICAgaW5mb18udHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgICAgaW5mb18gPSBpbmZvXy5uZXh0OworICAgICAgfQorICAgIH0KKworICAgIHRocmVhZF8gPSBudWxsOworICB9CisKKyAgdm9pZCBzdGFydFRocmVhZCgpIHsKKyAgICB0aHJlYWRfID0gbmV3IFRocmVhZCgmdGltZXJUaHJlYWQpOworICAgIHRocmVhZF8uc3RhcnQoKTsKKyAgfQorCisgIHN0cnVjdCBJbmZvIHsKKyAgICB0aGlzKER1cmF0aW9uIHRpbWVvdXQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBzaXplX3Qgd3JpdGVMZW5ndGgpIHsKKyAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgIHRoaXMud3JpdGVMZW5ndGggPSB3cml0ZUxlbmd0aDsKKyAgICB9CisKKyAgICBEdXJhdGlvbiB0aW1lb3V0OworICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgIHNpemVfdCB3cml0ZUxlbmd0aDsKKyAgICBJbmZvKiBuZXh0OworICB9CisKKyAgSW5mbyogaW5mb187CisgIFRocmVhZCB0aHJlYWRfOworICBzaGFyZWQgc2hvcnQgZmlyZWRfOworCisgIGltcG9ydCBjb3JlLnN5bmMubXV0ZXg7CisgIE11dGV4IG11dGV4XzsKKyAgaW1wb3J0IGNvcmUuc3luYy5jb25kaXRpb247CisgIENvbmRpdGlvbiBjYW5jZWxDb25kaXRpb25fOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvLmFuYWx5c2lzX29wdGlvbnMgYi9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L0xJQ0VOU0UgYi9saWIvZGFydC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYWNiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9MSUNFTlNFCkBAIC0wLDAgKzEsMTYgQEAKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L01ha2VmaWxlLmFtIGIvbGliL2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZGRjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithbGwtbG9jYWw6CisJJChEQVJUUFVCKSBnZXQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgLnB1YgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK2NoZWNrLWxvY2FsOiBhbGwKKworRVhUUkFfRElTVCA9IFwKKwkuYW5hbHlzaXNfb3B0aW9ucworCmRpZmYgLS1naXQgYS9saWIvZGFydC9SRUFETUUubWQgYi9saWIvZGFydC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlMTY4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L1JFQURNRS5tZApAQCAtMCwwICsxLDI2IEBACitUaHJpZnQgRGFydCBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIERhcnQKKz09PT09PT09PT09PT09PT09PT09CisKK0RhcnQgMS4xMi4wIG9yIG5ld2VyIGlzIHJlcXVpcmVkCmRpZmYgLS1naXQgYS9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2RhcnQvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY2MDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDYgQEAKKyMgRGFydCBDb2RpbmcgU3RhbmRhcmRzCisKKyMjIyBQbGVhc2UgZm9sbG93OgorICogW1RocmlmdCBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyAqIFtVc2UgZGFydGZtdF0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL3Rvb2xzL2RhcnRmbXQvKSBhbmQgZm9sbG93IHRoZSAKKyAgIFtEYXJ0IFN0eWxlIEd1aWRlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvYXJ0aWNsZXMvc3R5bGUtZ3VpZGUvKQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjkzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQKQEAgLTAsMCArMSwxMzAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuYnJvd3NlcjsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IEJBU0U2NDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IENsb3NlRXZlbnQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IE1lc3NhZ2VFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IFdlYlNvY2tldDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbV2ViU29ja2V0XSBmcm9tIGRhcnQ6aHRtbAorY2xhc3MgVFdlYlNvY2tldCBpbXBsZW1lbnRzIFRTb2NrZXQgeworICBmaW5hbCBVcmkgdXJsOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBfb25TdGF0ZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IF9vblN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IF9vbkVycm9yQ29udHJvbGxlcjsKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gX29uRXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gX29uTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gX29uTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIExpc3Q8VWludDhMaXN0PiBfcmVxdWVzdHMgPSBbXTsKKworICBUV2ViU29ja2V0KHRoaXMudXJsKQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCkgeworICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhdXJsLmhhc0F1dGhvcml0eSB8fCAhdXJsLmhhc1BvcnQpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIHVybCcpOworICAgIH0KKyAgfQorCisgIFdlYlNvY2tldCBfc29ja2V0OworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfc29ja2V0ICE9IG51bGwgJiYgX3NvY2tldC5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5PUEVOOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+CisgICAgICBfc29ja2V0ID09IG51bGwgfHwgX3NvY2tldC5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5DTE9TRUQ7CisKKyAgRnV0dXJlIG9wZW4oKSB7CisgICAgaWYgKCFpc0Nsb3NlZCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLkFMUkVBRFlfT1BFTiwgJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOworICAgIH0KKworICAgIF9zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybC50b1N0cmluZygpKTsKKyAgICBfc29ja2V0Lm9uRXJyb3IubGlzdGVuKF9vbkVycm9yKTsKKyAgICBfc29ja2V0Lm9uT3Blbi5saXN0ZW4oX29uT3Blbik7CisgICAgX3NvY2tldC5vbkNsb3NlLmxpc3Rlbihfb25DbG9zZSk7CisgICAgX3NvY2tldC5vbk1lc3NhZ2UubGlzdGVuKF9vbk1lc3NhZ2UpOworCisgICAgcmV0dXJuIF9zb2NrZXQub25PcGVuLmZpcnN0OworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIGlmIChfc29ja2V0ICE9IG51bGwpIHsKKyAgICAgIF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgIHJldHVybiBfc29ja2V0Lm9uQ2xvc2UuZmlyc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgX3JlcXVlc3RzLmFkZChkYXRhKTsKKyAgICBfc2VuZFJlcXVlc3RzKCk7CisgIH0KKworICB2b2lkIF9zZW5kUmVxdWVzdHMoKSB7CisgICAgd2hpbGUgKGlzT3BlbiAmJiBfcmVxdWVzdHMuaXNOb3RFbXB0eSkgeworICAgICAgVWludDhMaXN0IGRhdGEgPSBfcmVxdWVzdHMucmVtb3ZlQXQoMCk7CisgICAgICBfc29ja2V0LnNlbmRTdHJpbmcoQkFTRTY0LmVuY29kZShkYXRhKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBfb25PcGVuKEV2ZW50IGV2ZW50KSB7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuT1BFTik7CisgICAgX3NlbmRSZXF1ZXN0cygpOworICB9CisKKyAgdm9pZCBfb25DbG9zZShDbG9zZUV2ZW50IGV2ZW50KSB7CisgICAgX3NvY2tldCA9IG51bGw7CisKKyAgICBpZiAoX3JlcXVlc3RzLmlzTm90RW1wdHkpIHsKKyAgICAgIF9vbkVycm9yQ29udHJvbGxlcgorICAgICAgICAgIC5hZGQobmV3IFN0YXRlRXJyb3IoJ1NvY2tldCB3YXMgY2xvc2VkIHdpdGggcGVuZGluZyByZXF1ZXN0cycpKTsKKyAgICB9CisgICAgX3JlcXVlc3RzLmNsZWFyKCk7CisKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgdm9pZCBfb25NZXNzYWdlKE1lc3NhZ2VFdmVudCBtZXNzYWdlKSB7CisgICAgdHJ5IHsKKyAgICAgIFVpbnQ4TGlzdCBkYXRhID0KKyAgICAgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KEJBU0U2NC5kZWNvZGUobWVzc2FnZS5kYXRhKSk7CisgICAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQoZGF0YSk7CisgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHZhciBlcnJvciA9IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcuIik7CisgICAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKGVycm9yKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9vbkVycm9yKEV2ZW50IGV2ZW50KSB7CisgICAgY2xvc2UoKTsKKyAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKGV2ZW50LnRvU3RyaW5nKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF90Y3Bfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF90Y3Bfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxNDgwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydApAQCAtMCwwICsxLDgxIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQuc3JjLmNvbnNvbGUudF90Y3Bfc29ja2V0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbU29ja2V0XSBmcm9tIGRhcnQ6aW8KK2NsYXNzIFRUY3BTb2NrZXQgaW1wbGVtZW50cyBUU29ja2V0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgVFRjcFNvY2tldChTb2NrZXQgc29ja2V0KQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCkgeworICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgnc29ja2V0Jyk7CisgICAgfQorCisgICAgX3NvY2tldCA9IHNvY2tldDsKKyAgICBfc29ja2V0Lmxpc3Rlbihfb25NZXNzYWdlLCBvbkVycm9yOiBfb25FcnJvciwgb25Eb25lOiBjbG9zZSk7CisgIH0KKworICBTb2NrZXQgX3NvY2tldDsKKworICBib29sIGdldCBpc09wZW4gPT4gX3NvY2tldCAhPSBudWxsOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9zb2NrZXQgPT0gbnVsbDsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBpZiAoX3NvY2tldCAhPSBudWxsKSB7CisgICAgICBhd2FpdCBfc29ja2V0LmNsb3NlKCk7CisgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgX3NvY2tldC5hZGQoZGF0YSk7CisgIH0KKworICB2b2lkIF9vbk1lc3NhZ2UoTGlzdDxpbnQ+IG1lc3NhZ2UpIHsKKyAgICBVaW50OExpc3QgZGF0YSA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QobWVzc2FnZSk7CisgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIuYWRkKGRhdGEpOworICB9CisKKyAgdm9pZCBfb25FcnJvcihPYmplY3QgZXJyb3IpIHsKKyAgICBjbG9zZSgpOworICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoJyRlcnJvcicpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF93ZWJfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF93ZWJfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkNzI4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydApAQCAtMCwwICsxLDg5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQuc3JjLmNvbnNvbGUudF93ZWJfc29ja2V0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgQkFTRTY0OworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbV2ViU29ja2V0XSBmcm9tIGRhcnQ6aW8KK2NsYXNzIFRXZWJTb2NrZXQgaW1wbGVtZW50cyBUU29ja2V0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgVFdlYlNvY2tldChXZWJTb2NrZXQgc29ja2V0KQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCkgeworICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgnc29ja2V0Jyk7CisgICAgfQorCisgICAgX3NvY2tldCA9IHNvY2tldDsKKyAgICBfc29ja2V0Lmxpc3Rlbihfb25NZXNzYWdlLCBvbkVycm9yOiBfb25FcnJvciwgb25Eb25lOiBjbG9zZSk7CisgIH0KKworICBXZWJTb2NrZXQgX3NvY2tldDsKKworICBib29sIGdldCBpc09wZW4gPT4gX3NvY2tldCAhPSBudWxsOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9zb2NrZXQgPT0gbnVsbDsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBpZiAoX3NvY2tldCAhPSBudWxsKSB7CisgICAgICBhd2FpdCBfc29ja2V0LmNsb3NlKCk7CisgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgX3NvY2tldC5hZGQoQkFTRTY0LmVuY29kZShkYXRhKSk7CisgIH0KKworICB2b2lkIF9vbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICB0cnkgeworICAgICAgVWludDhMaXN0IGRhdGEgPQorICAgICAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoQkFTRTY0LmRlY29kZShtZXNzYWdlKSk7CisgICAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQoZGF0YSk7CisgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHZhciBlcnJvciA9IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcuIik7CisgICAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKGVycm9yKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9vbkVycm9yKE9iamVjdCBlcnJvcikgeworICAgIGNsb3NlKCk7CisgICAgX29uRXJyb3JDb250cm9sbGVyLmFkZCgnJGVycm9yJyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9iaW5hcnlfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9iaW5hcnlfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzg1ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsMjgxIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5PFRCaW5hcnlQcm90b2NvbD4geworICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KHt0aGlzLnN0cmljdFJlYWQ6IGZhbHNlLCB0aGlzLnN0cmljdFdyaXRlOiB0cnVlfSk7CisKKyAgZmluYWwgYm9vbCBzdHJpY3RSZWFkOworICBmaW5hbCBib29sIHN0cmljdFdyaXRlOworCisgIFRCaW5hcnlQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCwKKyAgICAgICAgc3RyaWN0UmVhZDogc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGU6IHN0cmljdFdyaXRlKTsKKyAgfQorfQorCisvLy8gQmluYXJ5IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBUaHJpZnQuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKKworICBzdGF0aWMgY29uc3QgVXRmOENvZGVjIF91dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBmaW5hbCBib29sIHN0cmljdFJlYWQ7CisgIGZpbmFsIGJvb2wgc3RyaWN0V3JpdGU7CisKKyAgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAge3RoaXMuc3RyaWN0UmVhZDogZmFsc2UsIHRoaXMuc3RyaWN0V3JpdGU6IHRydWV9KQorICAgICAgOiBzdXBlcih0cmFuc3BvcnQpOworCisgIC8vLyB3cml0ZQorICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBpZiAoc3RyaWN0V3JpdGUpIHsKKyAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOworICAgICAgd3JpdGVJMzIodmVyc2lvbik7CisgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUJ5dGUobWVzc2FnZS50eXBlKTsKKyAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHt9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOworICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOworICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKKyAgICB3cml0ZUkzMihtYXAubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1lbnRUeXBlKTsKKyAgICB3cml0ZUkzMihsaXN0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgd3JpdGVCeXRlKHNldC5lbGVtZW50VHlwZSk7CisgICAgd3JpdGVJMzIoc2V0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0RW5kKCkge30KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gZmFsc2U7CisgICAgd3JpdGVCeXRlKGIgPyAxIDogMCk7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfYnl0ZU91dCA9IG5ldyBCeXRlRGF0YSgxKTsKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGJ5dGUpIHsKKyAgICBpZiAoYnl0ZSA9PSBudWxsKSBieXRlID0gMDsKKyAgICBfYnl0ZU91dC5zZXRVaW50OCgwLCBieXRlKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoX2J5dGVPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDEpOworICB9CisKKyAgZmluYWwgQnl0ZURhdGEgX2kxNk91dCA9IG5ldyBCeXRlRGF0YSgyKTsKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KSB7CisgICAgaWYgKGkxNiA9PSBudWxsKSBpMTYgPSAwOworICAgIF9pMTZPdXQuc2V0SW50MTYoMCwgaTE2KTsKKyAgICB0cmFuc3BvcnQud3JpdGUoX2kxNk91dC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgMik7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfaTMyT3V0ID0gbmV3IEJ5dGVEYXRhKDQpOworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBpZiAoaTMyID09IG51bGwpIGkzMiA9IDA7CisgICAgX2kzMk91dC5zZXRJbnQzMigwLCBpMzIpOworICAgIHRyYW5zcG9ydC53cml0ZShfaTMyT3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCA0KTsKKyAgfQorCisgIGZpbmFsIFVpbnQ4TGlzdCBfaTY0T3V0ID0gbmV3IFVpbnQ4TGlzdCg4KTsKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KSB7CisgICAgaWYgKGk2NCA9PSBudWxsKSBpNjQgPSAwOworICAgIHZhciBpID0gbmV3IEludDY0KGk2NCk7CisgICAgdmFyIGJ0cyA9IGkudG9CeXRlcygpOworICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICBfaTY0T3V0W2pdID0gYnRzWzggLSBqIC0gMV07CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZShfaTY0T3V0LCAwLCA4KTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICB2YXIgYnl0ZXMgPSBzICE9IG51bGwgPyBfdXRmOENvZGVjLmVuY29kZShzKSA6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoW10pOworICAgIHdyaXRlSTMyKGJ5dGVzLmxlbmd0aCk7CisgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICB9CisKKyAgZmluYWwgQnl0ZURhdGEgX2RvdWJsZU91dCA9IG5ldyBCeXRlRGF0YSg4KTsKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisgICAgX2RvdWJsZU91dC5zZXRGbG9hdDY0KDAsIGQpOworICAgIHRyYW5zcG9ydC53cml0ZShfZG91YmxlT3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCA4KTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgdmFyIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKKyAgICB3cml0ZUkzMihsZW5ndGgpOworICAgIHRyYW5zcG9ydC53cml0ZShieXRlcywgMCwgbGVuZ3RoKTsKKyAgfQorCisgIC8vLyByZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgU3RyaW5nIG5hbWU7CisgICAgaW50IHR5cGU7CisgICAgaW50IHNlcWlkOworCisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICBpbnQgdmVyc2lvbiA9IHNpemUgJiBWRVJTSU9OX01BU0s7CisgICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAkdmVyc2lvbiIpOworICAgICAgfQorICAgICAgdHlwZSA9IHNpemUgJiAweDAwMDAwMGZmOworICAgICAgbmFtZSA9IHJlYWRTdHJpbmcoKTsKKyAgICAgIHNlcWlkID0gcmVhZEkzMigpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RyaWN0UmVhZCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luIik7CisgICAgICB9CisgICAgICBuYW1lID0gX3JlYWRTdHJpbmcoc2l6ZSk7CisgICAgICB0eXBlID0gcmVhZEJ5dGUoKTsKKyAgICAgIHNlcWlkID0gcmVhZEkzMigpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgU3RyaW5nIG5hbWUgPSAiIjsKKyAgICBpbnQgdHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGlkID0gdHlwZSAhPSBUVHlwZS5TVE9QID8gcmVhZEkxNigpIDogMDsKKworICAgIHJldHVybiBuZXcgVEZpZWxkKG5hbWUsIHR5cGUsIGlkKTsKKyAgfQorCisgIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBpbnQga2V5VHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IHZhbHVlVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRNYXBFbmQoKSB7fQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgaW50IGVsZW1lbnRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworCisgICAgcmV0dXJuIG5ldyBUTGlzdChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIGludCBlbGVtZW50VHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKworICAgIHJldHVybiBuZXcgVFNldChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZFNldEVuZCgpIHt9CisKKyAgYm9vbCByZWFkQm9vbCgpID0+IHJlYWRCeXRlKCkgPT0gMTsKKworICBmaW5hbCBVaW50OExpc3QgX2J5dGVJbiA9IG5ldyBVaW50OExpc3QoMSk7CisgIGludCByZWFkQnl0ZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChfYnl0ZUluLCAwLCAxKTsKKyAgICByZXR1cm4gX2J5dGVJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldFVpbnQ4KDApOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pMTZJbiA9IG5ldyBVaW50OExpc3QoMik7CisgIGludCByZWFkSTE2KCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9pMTZJbiwgMCwgMik7CisgICAgcmV0dXJuIF9pMTZJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEludDE2KDApOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pMzJJbiA9IG5ldyBVaW50OExpc3QoNCk7CisgIGludCByZWFkSTMyKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9pMzJJbiwgMCwgNCk7CisgICAgcmV0dXJuIF9pMzJJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEludDMyKDApOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pNjRJbiA9IG5ldyBVaW50OExpc3QoOCk7CisgIGludCByZWFkSTY0KCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9pNjRJbiwgMCwgOCk7CisgICAgdmFyIGkgPSBuZXcgSW50NjQuZnJvbUJ5dGVzQmlnRW5kaWFuKF9pNjRJbik7CisgICAgcmV0dXJuIGkudG9JbnQoKTsKKyAgfQorCisgIGZpbmFsIFVpbnQ4TGlzdCBfZG91YmxlSW4gPSBuZXcgVWludDhMaXN0KDgpOworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChfZG91YmxlSW4sIDAsIDgpOworICAgIHJldHVybiBfZG91YmxlSW4uYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRGbG9hdDY0KDApOworICB9CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisgICAgcmV0dXJuIF9yZWFkU3RyaW5nKHNpemUpOworICB9CisKKyAgU3RyaW5nIF9yZWFkU3RyaW5nKGludCBzaXplKSB7CisgICAgVWludDhMaXN0IHN0cmluZ0luID0gbmV3IFVpbnQ4TGlzdChzaXplKTsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChzdHJpbmdJbiwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIF91dGY4Q29kZWMuZGVjb2RlKHN0cmluZ0luKTsKKyAgfQorCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCkgeworICAgIGludCBsZW5ndGggPSByZWFkSTMyKCk7CisgICAgVWludDhMaXN0IGJpbmFyeUluID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJpbmFyeUluLCAwLCBsZW5ndGgpOworICAgIHJldHVybiBiaW5hcnlJbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9jb21wYWN0X3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkNzY0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9jb21wYWN0X3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw0NzAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5PFRDb21wYWN0UHJvdG9jb2w+IHsKKyAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKTsKKworICBUQ29tcGFjdFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgIH0KK30KKworLy8vIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIFRocmlmdC4KKy8vLworLy8vIFVzZSBvZiBmaXhudW0gbGlicmFyeSBpcyByZXF1aXJlZCBkdWUgdG8gYnVncyBsaWtlCisvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzE1MzYxCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBzdGF0aWMgY29uc3QgaW50IFBST1RPQ09MX0lEID0gMHg4MjsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OX01BU0sgPSAweDFmOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTUFTSyA9IDB4RTA7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CSVRTID0gMHgwNzsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TVE9QLCAwKTsKKworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQk9PTEVBTl9UUlVFID0gMHgwMTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0JPT0xFQU5fRkFMU0UgPSAweDAyOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQllURSA9IDB4MDM7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9JMTYgPSAweDA0OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfSTMyID0gMHgwNTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0k2NCA9IDB4MDY7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9ET1VCTEUgPSAweDA3OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQklOQVJZID0gMHgwODsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0xJU1QgPSAweDA5OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfU0VUID0gMHgwQTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX01BUCA9IDB4MEI7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9TVFJVQ1QgPSAweDBDOworCisgIHN0YXRpYyBmaW5hbCBMaXN0PGludD4gX3R5cGVNYXAgPSBuZXcgTGlzdC51bm1vZGlmaWFibGUobmV3IExpc3QoMTYpCisgICAgLi5bVFR5cGUuU1RPUF0gPSBUVHlwZS5TVE9QCisgICAgLi5bVFR5cGUuQk9PTF0gPSBUWVBFX0JPT0xFQU5fVFJVRQorICAgIC4uW1RUeXBlLkJZVEVdID0gVFlQRV9CWVRFCisgICAgLi5bVFR5cGUuSTE2XSA9IFRZUEVfSTE2CisgICAgLi5bVFR5cGUuSTMyXSA9IFRZUEVfSTMyCisgICAgLi5bVFR5cGUuSTY0XSA9IFRZUEVfSTY0CisgICAgLi5bVFR5cGUuRE9VQkxFXSA9IFRZUEVfRE9VQkxFCisgICAgLi5bVFR5cGUuU1RSSU5HXSA9IFRZUEVfQklOQVJZCisgICAgLi5bVFR5cGUuTElTVF0gPSBUWVBFX0xJU1QKKyAgICAuLltUVHlwZS5TRVRdID0gVFlQRV9TRVQKKyAgICAuLltUVHlwZS5NQVBdID0gVFlQRV9NQVAKKyAgICAuLltUVHlwZS5TVFJVQ1RdID0gVFlQRV9TVFJVQ1QpOworCisgIHN0YXRpYyBjb25zdCBVdGY4Q29kZWMgX3V0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIC8vIFByZXRlbmQgdGhpcyBpcyBhIHN0YWNrCisgIERvdWJsZUxpbmtlZFF1ZXVlPGludD4gX2xhc3RGaWVsZCA9IG5ldyBEb3VibGVMaW5rZWRRdWV1ZTxpbnQ+KCk7CisgIGludCBfbGFzdEZpZWxkSWQgPSAwOworCisgIFRGaWVsZCBfYm9vbGVhbkZpZWxkID0gbnVsbDsKKyAgYm9vbCBfYm9vbFZhbHVlID0gbnVsbDsKKworICBmaW5hbCBVaW50OExpc3QgdGVtcExpc3QgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgZmluYWwgQnl0ZURhdGEgdGVtcEJEID0gbmV3IEJ5dGVEYXRhKDEwKTsKKworICBUQ29tcGFjdFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA6IHN1cGVyKHRyYW5zcG9ydCk7CisKKyAgLy8vIFdyaXRlCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIHdyaXRlQnl0ZShQUk9UT0NPTF9JRCk7CisgICAgd3JpdGVCeXRlKChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8CisgICAgICAgICgobWVzc2FnZS50eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOworICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihtZXNzYWdlLnNlcWlkKSk7CisgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHsKKyAgICBfbGFzdEZpZWxkLmFkZExhc3QoX2xhc3RGaWVsZElkKTsKKyAgICBfbGFzdEZpZWxkSWQgPSAwOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLnJlbW92ZUxhc3QoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpIHsKKyAgICAgIF9ib29sZWFuRmllbGQgPSBmaWVsZDsKKyAgICB9IGVsc2UgeworICAgICAgX3dyaXRlRmllbGRCZWdpbihmaWVsZCwgLTEpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3dyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQsIGludCB0eXBlT3ZlcnJpZGUpIHsKKyAgICBpbnQgdHlwZVRvV3JpdGUgPQorICAgICAgICB0eXBlT3ZlcnJpZGUgPT0gLTEgPyBfZ2V0Q29tcGFjdFR5cGUoZmllbGQudHlwZSkgOiB0eXBlT3ZlcnJpZGU7CisKKyAgICBpZiAoZmllbGQuaWQgPiBfbGFzdEZpZWxkSWQgJiYgZmllbGQuaWQgLSBfbGFzdEZpZWxkSWQgPD0gMTUpIHsKKyAgICAgIHdyaXRlQnl0ZSgoZmllbGQuaWQgLSBfbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZSh0eXBlVG9Xcml0ZSk7CisgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgfQorCisgICAgX2xhc3RGaWVsZElkID0gZmllbGQuaWQ7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgaWYgKG1hcC5sZW5ndGggPT0gMCkgeworICAgICAgd3JpdGVCeXRlKDApOworICAgIH0gZWxzZSB7CisgICAgICBfd3JpdGVWYXJJbnQzMihuZXcgSW50MzIobWFwLmxlbmd0aCkpOworICAgICAgd3JpdGVCeXRlKAorICAgICAgICAgIF9nZXRDb21wYWN0VHlwZShtYXAua2V5VHlwZSkgPDwgNCB8IF9nZXRDb21wYWN0VHlwZShtYXAudmFsdWVUeXBlKSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKGxpc3QuZWxlbWVudFR5cGUsIGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICBfd3JpdGVDb2xsZWN0aW9uQmVnaW4oc2V0LmVsZW1lbnRUeXBlLCBzZXQubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSBmYWxzZTsKKyAgICBpZiAoX2Jvb2xlYW5GaWVsZCAhPSBudWxsKSB7CisgICAgICBfd3JpdGVGaWVsZEJlZ2luKAorICAgICAgICAgIF9ib29sZWFuRmllbGQsIGIgPyBUWVBFX0JPT0xFQU5fVFJVRSA6IFRZUEVfQk9PTEVBTl9GQUxTRSk7CisgICAgICBfYm9vbGVhbkZpZWxkID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKGIgPyBUWVBFX0JPT0xFQU5fVFJVRSA6IFRZUEVfQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gMDsKKyAgICB0ZW1wTGlzdFswXSA9IGI7CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBMaXN0LCAwLCAxKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIGlmIChpMTYgPT0gbnVsbCkgaTE2ID0gMDsKKyAgICBfd3JpdGVWYXJJbnQzMihfaW50MzJUb1ppZ1phZyhuZXcgSW50MzIoaTE2KSkpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgaWYgKGkzMiA9PSBudWxsKSBpMzIgPSAwOworICAgIF93cml0ZVZhckludDMyKF9pbnQzMlRvWmlnWmFnKG5ldyBJbnQzMihpMzIpKSk7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBpZiAoaTY0ID09IG51bGwpIGk2NCA9IDA7CisgICAgX3dyaXRlVmFySW50NjQoX2ludDY0VG9aaWdaYWcobmV3IEludDY0KGk2NCkpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBpZiAoZCA9PSBudWxsKSBkID0gMC4wOworICAgIHRlbXBCRC5zZXRGbG9hdDY0KDAsIGQsIEVuZGlhbm5lc3MuTElUVExFX0VORElBTik7CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBCRC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgOCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHsKKyAgICBVaW50OExpc3QgYnl0ZXMgPQorICAgICAgICBzdHIgIT0gbnVsbCA/IF91dGY4Q29kZWMuZW5jb2RlKHN0cikgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KFtdKTsKKyAgICB3cml0ZUJpbmFyeShieXRlcyk7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihieXRlcy5sZW5ndGgpKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgIH0KKworICB2b2lkIF93cml0ZVZhckludDMyKEludDMyIG4pIHsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKG4gJiAweEZGKS50b0ludCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9ICgoKG4gJiAweDdGKSB8IDB4ODApICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgbiA9IG4uc2hpZnRSaWdodFVuc2lnbmVkKDcpOworICAgICAgfQorICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcExpc3QsIDAsIGlkeCk7CisgIH0KKworICB2b2lkIF93cml0ZVZhckludDY0KEludDY0IG4pIHsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKG4gJiAweEZGKS50b0ludCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9ICgoKG4gJiAweDdGKSB8IDB4ODApICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgbiA9IG4uc2hpZnRSaWdodFVuc2lnbmVkKDcpOworICAgICAgfQorICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcExpc3QsIDAsIGlkeCk7CisgIH0KKworICB2b2lkIF93cml0ZUNvbGxlY3Rpb25CZWdpbihpbnQgZWxlbVR5cGUsIGludCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoIDw9IDE0KSB7CisgICAgICB3cml0ZUJ5dGUobGVuZ3RoIDw8IDQgfCBfZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKDB4RjAgfCBfZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihsZW5ndGgpKTsKKyAgICB9CisgIH0KKworICBJbnQzMiBfaW50MzJUb1ppZ1phZyhJbnQzMiBuKSB7CisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOworICB9CisKKyAgSW50NjQgX2ludDY0VG9aaWdaYWcoSW50NjQgbikgeworICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDYzKTsKKyAgfQorCisgIC8vLyBSZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgaW50IHByb3RvY29sSWQgPSByZWFkQnl0ZSgpOworICAgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICdFeHBlY3RlZCBwcm90b2NvbCBpZCAkUFJPVE9DT0xfSUQgYnV0IGdvdCAkcHJvdG9jb2xJZCcpOworICAgIH0KKyAgICBpbnQgdmVyc2lvbkFuZFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCB2ZXJzaW9uID0gdmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0s7CisgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwKKyAgICAgICAgICAnRXhwZWN0ZWQgdmVyc2lvbiAkVkVSU0lPTiBidXQgZ290ICR2ZXJzaW9uJyk7CisgICAgfQorICAgIGludCB0eXBlID0gKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUzsKKyAgICBpbnQgc2VxSWQgPSBfcmVhZFZhckludDMyKCkudG9JbnQoKTsKKyAgICBTdHJpbmcgbWVzc2FnZU5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShtZXNzYWdlTmFtZSwgdHlwZSwgc2VxSWQpOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgX2xhc3RGaWVsZC5hZGRMYXN0KF9sYXN0RmllbGRJZCk7CisgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgICAvLyBUT0RPIG1ha2UgdGhpcyBhIGNvbnN0YW50PworICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgeworICAgIF9sYXN0RmllbGRJZCA9IF9sYXN0RmllbGQucmVtb3ZlTGFzdCgpOworICB9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIGludCB0eXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpZiAodHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICByZXR1cm4gVFNUT1A7CisgICAgfQorCisgICAgaW50IGZpZWxkSWQ7CisgICAgaW50IG1vZGlmaWVyID0gKHR5cGUgJiAweEYwKSA+PiA0OworICAgIGlmIChtb2RpZmllciA9PSAwKSB7CisgICAgICBmaWVsZElkID0gcmVhZEkxNigpOworICAgIH0gZWxzZSB7CisgICAgICBmaWVsZElkID0gX2xhc3RGaWVsZElkICsgbW9kaWZpZXI7CisgICAgfQorCisgICAgVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgnJywgX2dldFRUeXBlKHR5cGUgJiAweDBGKSwgZmllbGRJZCk7CisgICAgaWYgKF9pc0Jvb2xUeXBlKHR5cGUpKSB7CisgICAgICBfYm9vbFZhbHVlID0gKHR5cGUgJiAweDBGKSA9PSBUWVBFX0JPT0xFQU5fVFJVRTsKKyAgICB9CisKKyAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5pZDsKKyAgICByZXR1cm4gZmllbGQ7CisgIH0KKworICB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIGludCBrZXlBbmRWYWx1ZVR5cGUgPSBsZW5ndGggPT0gMCA/IDAgOiByZWFkQnl0ZSgpOworICAgIGludCBrZXlUeXBlID0gX2dldFRUeXBlKGtleUFuZFZhbHVlVHlwZSA+PiA0KTsKKyAgICBpbnQgdmFsdWVUeXBlID0gX2dldFRUeXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4MEYpOworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRNYXBFbmQoKSB7fQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgaW50IGxlbmd0aEFuZFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCBsZW5ndGggPSAobGVuZ3RoQW5kVHlwZSA+PiA0KSAmIDB4MEY7CisgICAgaWYgKGxlbmd0aCA9PSAxNSkgeworICAgICAgbGVuZ3RoID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgfQorICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKyAgICBpbnQgdHlwZSA9IF9nZXRUVHlwZShsZW5ndGhBbmRUeXBlKTsKKyAgICByZXR1cm4gbmV3IFRMaXN0KHR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRMaXN0RW5kKCkge30KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICBUTGlzdCB0bGlzdCA9IHJlYWRMaXN0QmVnaW4oKTsKKyAgICByZXR1cm4gbmV3IFRTZXQodGxpc3QuZWxlbWVudFR5cGUsIHRsaXN0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRTZXRFbmQoKSB7fQorCisgIGJvb2wgcmVhZEJvb2woKSB7CisgICAgaWYgKF9ib29sVmFsdWUgIT0gbnVsbCkgeworICAgICAgYm9vbCByZXN1bHQgPSBfYm9vbFZhbHVlOworICAgICAgX2Jvb2xWYWx1ZSA9IG51bGw7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVhZEJ5dGUoKSA9PSBUWVBFX0JPT0xFQU5fVFJVRTsKKyAgfQorCisgIGludCByZWFkQnl0ZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbCh0ZW1wTGlzdCwgMCwgMSk7CisgICAgcmV0dXJuIHRlbXBMaXN0LmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0VWludDgoMCk7CisgIH0KKworICBpbnQgcmVhZEkxNigpIHsKKyAgICByZXR1cm4gX3ppZ3phZ1RvSW50MzIoX3JlYWRWYXJJbnQzMigpKS50b0ludCgpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgcmV0dXJuIF96aWd6YWdUb0ludDMyKF9yZWFkVmFySW50MzIoKSkudG9JbnQoKTsKKyAgfQorCisgIGludCByZWFkSTY0KCkgeworICAgIHJldHVybiBfemlnemFnVG9JbnQ2NChfcmVhZFZhckludDY0KCkpLnRvSW50KCk7CisgIH0KKworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbCh0ZW1wTGlzdCwgMCwgOCk7CisgICAgcmV0dXJuIHRlbXBMaXN0LmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0RmxvYXQ2NCgwLCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4pOworICB9CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIC8vIFRPRE8gbG9vayBhdCB1c2luZyB0ZW1wIGZvciBzbWFsbCBzdHJpbmdzPworICAgIFVpbnQ4TGlzdCBidWZmID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmYsIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIF91dGY4Q29kZWMuZGVjb2RlKGJ1ZmYpOworICB9CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIFVpbnQ4TGlzdCBidWZmID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmYsIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIGJ1ZmY7CisgIH0KKworICBJbnQzMiBfcmVhZFZhckludDMyKCkgeworICAgIEludDMyIHJlc3VsdCA9IEludDMyLlpFUk87CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgSW50MzIgYiA9IG5ldyBJbnQzMihyZWFkQnl0ZSgpKTsKKyAgICAgIHJlc3VsdCB8PSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgSW50NjQgX3JlYWRWYXJJbnQ2NCgpIHsKKyAgICBJbnQ2NCByZXN1bHQgPSBJbnQ2NC5aRVJPOworICAgIGludCBzaGlmdCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIEludDY0IGIgPSBuZXcgSW50NjQocmVhZEJ5dGUoKSk7CisgICAgICByZXN1bHQgfD0gKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIGJyZWFrOworICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEludDMyIF96aWd6YWdUb0ludDMyKEludDMyIG4pIHsKKyAgICByZXR1cm4gKG4uc2hpZnRSaWdodFVuc2lnbmVkKDEpKSBeIC0obiAmIDEpOworICB9CisKKyAgSW50NjQgX3ppZ3phZ1RvSW50NjQoSW50NjQgbikgeworICAgIHJldHVybiAobi5zaGlmdFJpZ2h0VW5zaWduZWQoMSkpIF4gLShuICYgMSk7CisgIH0KKworICB2b2lkIF9jaGVja05lZ1JlYWRMZW5ndGgoaW50IGxlbmd0aCkgeworICAgIGlmIChsZW5ndGggPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLk5FR0FUSVZFX1NJWkUsICdOZWdhdGl2ZSBsZW5ndGg6ICRsZW5ndGgnKTsKKyAgICB9CisgIH0KKworICBpbnQgX2dldENvbXBhY3RUeXBlKGludCB0dHlwZSkgeworICAgIHJldHVybiBfdHlwZU1hcFt0dHlwZV07CisgIH0KKworICBpbnQgX2dldFRUeXBlKGludCB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlICYgMHgwRikgeworICAgICAgY2FzZSBUVHlwZS5TVE9QOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RPUDsKKyAgICAgIGNhc2UgVFlQRV9CT09MRUFOX0ZBTFNFOgorICAgICAgY2FzZSBUWVBFX0JPT0xFQU5fVFJVRToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJPT0w7CisgICAgICBjYXNlIFRZUEVfQllURToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJZVEU7CisgICAgICBjYXNlIFRZUEVfSTE2OgorICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgY2FzZSBUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgIGNhc2UgVFlQRV9JNjQ6CisgICAgICAgIHJldHVybiBUVHlwZS5JNjQ7CisgICAgICBjYXNlIFRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gVFR5cGUuRE9VQkxFOworICAgICAgY2FzZSBUWVBFX0JJTkFSWToKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUklORzsKKyAgICAgIGNhc2UgVFlQRV9MSVNUOgorICAgICAgICByZXR1cm4gVFR5cGUuTElTVDsKKyAgICAgIGNhc2UgVFlQRV9TRVQ6CisgICAgICAgIHJldHVybiBUVHlwZS5TRVQ7CisgICAgICBjYXNlIFRZUEVfTUFQOgorICAgICAgICByZXR1cm4gVFR5cGUuTUFQOworICAgICAgY2FzZSBUWVBFX1NUUlVDVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUlVDVDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJVbmtub3duIHR5cGU6ICR7dHlwZSAmIDB4MEZ9Iik7CisgICAgfQorICB9CisKKyAgYm9vbCBfaXNCb29sVHlwZShpbnQgYikgeworICAgIGludCBsb3dlck5pYmJsZSA9IGIgJiAweDBGOworICAgIHJldHVybiBsb3dlck5pYmJsZSA9PSBUWVBFX0JPT0xFQU5fVFJVRSB8fAorICAgICAgICBsb3dlck5pYmJsZSA9PSBUWVBFX0JPT0xFQU5fRkFMU0U7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0YjRlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEZpZWxkIHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIGludCB0eXBlOworICBmaW5hbCBpbnQgaWQ7CisKKyAgVEZpZWxkKHRoaXMubmFtZSwgdGhpcy50eXBlLCB0aGlzLmlkKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9qc29uX3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmI3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsNzg0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRKc29uUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeTxUSnNvblByb3RvY29sPiB7CisgIFRKc29uUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgfQorfQorCisvLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgVGhyaWZ0LgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVEpzb25Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl8xID0gMTsKKworICBzdGF0aWMgY29uc3QgVXRmOENvZGVjIHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIF9CYXNlQ29udGV4dCBfY29udGV4dDsKKyAgX0Jhc2VDb250ZXh0IF9yb290Q29udGV4dDsKKyAgX0xvb2thaGVhZFJlYWRlciBfcmVhZGVyOworCisgIGZpbmFsIExpc3Q8X0Jhc2VDb250ZXh0PiBfY29udGV4dFN0YWNrID0gW107CisgIGZpbmFsIFVpbnQ4TGlzdCBfdGVtcEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoNCk7CisKKyAgVEpzb25Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiBzdXBlcih0cmFuc3BvcnQpIHsKKyAgICBfcm9vdENvbnRleHQgPSBuZXcgX0Jhc2VDb250ZXh0KHRoaXMpOworICAgIF9yZWFkZXIgPSBuZXcgX0xvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICBfcmVzZXRDb250ZXh0KCk7CisgIH0KKworICB2b2lkIF9wdXNoQ29udGV4dChfQmFzZUNvbnRleHQgYykgeworICAgIF9jb250ZXh0U3RhY2suYWRkKGMpOworICAgIF9jb250ZXh0ID0gYzsKKyAgfQorCisgIHZvaWQgX3BvcENvbnRleHQoKSB7CisgICAgX2NvbnRleHRTdGFjay5yZW1vdmVMYXN0KCk7CisgICAgX2NvbnRleHQgPSBfY29udGV4dFN0YWNrLmlzRW1wdHkgPyBfcm9vdENvbnRleHQgOiBfY29udGV4dFN0YWNrLmxhc3Q7CisgIH0KKworICB2b2lkIF9yZXNldENvbnRleHQoKSB7CisgICAgX2NvbnRleHRTdGFjay5jbGVhcigpOworICAgIF9jb250ZXh0ID0gX3Jvb3RDb250ZXh0OworICB9CisKKyAgLy8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBbY2hhcl07IG90aGVyd2lzZSB0aHJvdyBhIFtUUHJvdG9jb2xFcnJvcl0uCisgIHZvaWQgX3JlYWRKc29uU3ludGF4Q2hhcihpbnQgY2hhckJ5dGUpIHsKKyAgICBpbnQgYnl0ZSA9IF9yZWFkZXIucmVhZCgpOworICAgIGlmIChieXRlICE9IGNoYXJCeXRlKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgY2hhcmFjdGVyICR7bmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckJ5dGUpfSBidXQgZm91bmQ6ICR7bmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSl9Iik7CisgICAgfQorICB9CisKKyAgaW50IF9oZXhWYWwoaW50IGJ5dGUpIHsKKyAgICBpZiAoYnl0ZSA+PSBfQ29uc3RhbnRzLkhFWF8wX0JZVEVTWzBdICYmCisgICAgICAgIGJ5dGUgPD0gX0NvbnN0YW50cy5IRVhfOV9CWVRFU1swXSkgeworICAgICAgcmV0dXJuIGJ5dGUgLSBfQ29uc3RhbnRzLkhFWF8wX0JZVEVTWzBdOworICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSBfQ29uc3RhbnRzLkhFWF9BX0JZVEVTWzBdICYmCisgICAgICAgIGJ5dGUgPD0gX0NvbnN0YW50cy5IRVhfRl9CWVRFU1swXSkgeworICAgICAgYnl0ZSArPSAxMDsKKyAgICAgIHJldHVybiBieXRlIC0gX0NvbnN0YW50cy5IRVhfQV9CWVRFU1swXTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgfQorICB9CisKKyAgaW50IF9oZXhDaGFyKGludCBieXRlKSA9PiBieXRlLnRvUmFkaXhTdHJpbmcoMTYpLmNvZGVVbml0QXQoMCk7CisKKyAgLy8vIHdyaXRlCisKKyAgLy8vIFdyaXRlIHRoZSBbYnl0ZXNdIGFzIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkLgorICB2b2lkIF93cml0ZUpzb25TdHJpbmcoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisKKyAgICBpbnQgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIGludCBieXRlID0gYnl0ZXNbaV07CisgICAgICBpZiAoKGJ5dGUgJiAweDAwRkYpID49IDB4MzApIHsKKyAgICAgICAgaWYgKGJ5dGUgPT0gX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVNbMF0pIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVMpOworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCBpLCAxKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3RlbXBCdWZmZXJbMF0gPSBfQ29uc3RhbnRzLkpTT05fQ0hBUl9UQUJMRVtieXRlXTsKKyAgICAgICAgaWYgKF90ZW1wQnVmZmVyWzBdID09IDEpIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIGksIDEpOworICAgICAgICB9IGVsc2UgaWYgKF90ZW1wQnVmZmVyWzBdID4gMSkgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKF90ZW1wQnVmZmVyLCAwLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5FU0NTRVFfQllURVMpOworICAgICAgICAgIF90ZW1wQnVmZmVyWzBdID0gX2hleENoYXIoYnl0ZSA+PiA0KTsKKyAgICAgICAgICBfdGVtcEJ1ZmZlclsxXSA9IF9oZXhDaGFyKGJ5dGUpOworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShfdGVtcEJ1ZmZlciwgMCwgMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25JbnRlZ2VyKGludCBpKSB7CisgICAgaWYgKGkgPT0gbnVsbCkgaSA9IDA7CisKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBpLnRvU3RyaW5nKCk7CisKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShzdHIpKTsKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkRvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBkLnRvU3RyaW5nKCk7CisgICAgYm9vbCBlc2NhcGVOdW1iZXJzID0gZC5pc05hTiB8fCBkLmlzSW5maW5pdGUgfHwgX2NvbnRleHQuZXNjYXBlTnVtYmVyczsKKworICAgIGlmIChlc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKHN0cikpOworICAgIGlmIChlc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICB9CisKKyAgdm9pZCBfd3JpdGVKc29uQmFzZTY0KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworCisgICAgU3RyaW5nIGJhc2U2NCA9IEJBU0U2NC5lbmNvZGUoYnl0ZXMpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKGJhc2U2NCkpOworCisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5MQlJBQ0VfQllURVMpOworICAgIF9wdXNoQ29udGV4dChuZXcgX1BhaXJDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbk9iamVjdEVuZCgpIHsKKyAgICBfcG9wQ29udGV4dCgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlJCUkFDRV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25BcnJheVN0YXJ0KCkgeworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuTEJSQUNLRVRfQllURVMpOworICAgIF9wdXNoQ29udGV4dChuZXcgX0xpc3RDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkFycmF5RW5kKCkgeworICAgIF9wb3BDb250ZXh0KCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUkJSQUNLRVRfQllURVMpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgX3Jlc2V0Q29udGV4dCgpOworCisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihWRVJTSU9OXzEpOworCisgICAgX3dyaXRlSnNvblN0cmluZyh1dGY4Q29kZWMuZW5jb2RlKG1lc3NhZ2UubmFtZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobWVzc2FnZS5zZXFpZCk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgeworICAgIF93cml0ZUpzb25PYmplY3RTdGFydCgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBfd3JpdGVKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihmaWVsZC5pZCk7CisgICAgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQoZmllbGQudHlwZSkpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkgeworICAgIF93cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7fQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIF93cml0ZUpzb25BcnJheVN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQobWFwLmtleVR5cGUpKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChtYXAudmFsdWVUeXBlKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobWFwLmxlbmd0aCk7CisgICAgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkgeworICAgIF93cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIF93cml0ZUpzb25BcnJheVN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQobGlzdC5lbGVtZW50VHlwZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkgeworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChzZXQuZWxlbWVudFR5cGUpKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihzZXQubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7CisgICAgX3dyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gZmFsc2U7CisgICAgX3dyaXRlSnNvbkludGVnZXIoYiA/IDEgOiAwKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGludCBiKSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoYik7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihpMTYpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoaTMyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCkgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGk2NCk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKSB7CisgICAgX3dyaXRlSnNvbkRvdWJsZShkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICB2YXIgYnl0ZXMgPSBzICE9IG51bGwgPyB1dGY4Q29kZWMuZW5jb2RlKHMpIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbXSk7CisgICAgX3dyaXRlSnNvblN0cmluZyhieXRlcyk7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF93cml0ZUpzb25CYXNlNjQoYnl0ZXMpOworICB9CisKKyAgYm9vbCBfaXNIaWdoU3Vycm9nYXRlKGludCBiKSA9PiBiID49IDB4RDgwMCAmJiBiIDw9IDB4REJGRjsKKworICBib29sIF9pc0xvd1N1cnJvZ2F0ZShpbnQgYikgPT4gYiA+PSAweERDMDAgJiYgYiA8PSAweERGRkY7CisKKyAgLy8vIHJlYWQKKworICBVaW50OExpc3QgX3JlYWRKc29uU3RyaW5nKHtib29sIHNraXBDb250ZXh0OiBmYWxzZX0pIHsKKyAgICBMaXN0PGludD4gYnl0ZXMgPSBbXTsKKyAgICBMaXN0PGludD4gY29kZXVuaXRzID0gW107CisKKyAgICBpZiAoIXNraXBDb250ZXh0KSB7CisgICAgICBfY29udGV4dC5yZWFkKCk7CisgICAgfQorCisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaW50IGJ5dGUgPSBfcmVhZGVyLnJlYWQoKTsKKyAgICAgIGlmIChieXRlID09IF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIGVzY2FwZWQ/CisgICAgICBpZiAoYnl0ZSAhPSBfQ29uc3RhbnRzLkVTQ1NFUV9CWVRFU1swXSkgeworICAgICAgICBieXRlcy5hZGQoYnl0ZSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBieXRlID0gX3JlYWRlci5yZWFkKCk7CisKKyAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gXHVYWFhYIGFuZCBjb250cm9sIGNoYXJzIGxpa2UgXG4KKyAgICAgIGlmIChieXRlICE9IF9Db25zdGFudHMuRVNDU0VRX0JZVEVTWzFdKSB7CisgICAgICAgIFN0cmluZyBjaGFyID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSk7CisgICAgICAgIGludCBvZmZzZXQgPSBfQ29uc3RhbnRzLkVTQ0FQRV9DSEFSUy5pbmRleE9mKGNoYXIpOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZSA9IF9Db25zdGFudHMuRVNDQVBFX0NIQVJfVkFMUy5jb2RlVW5pdEF0KG9mZnNldCk7CisgICAgICAgIGJ5dGVzLmFkZChieXRlKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIGl0J3MgXHVYWFhYCisgICAgICB0cmFuc3BvcnQucmVhZEFsbChfdGVtcEJ1ZmZlciwgMCwgNCk7CisgICAgICBieXRlID0gKF9oZXhWYWwoX3RlbXBCdWZmZXJbMF0pIDw8IDEyKQorICAgICAgICArIChfaGV4VmFsKF90ZW1wQnVmZmVyWzFdKSA8PCA4KQorICAgICAgICArIChfaGV4VmFsKF90ZW1wQnVmZmVyWzJdKSA8PCA0KQorICAgICAgICArIF9oZXhWYWwoX3RlbXBCdWZmZXJbM10pOworICAgICAgaWYgKF9pc0hpZ2hTdXJyb2dhdGUoYnl0ZSkpIHsKKyAgICAgICAgaWYgKGNvZGV1bml0cy5pc05vdEVtcHR5KSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSIpOworICAgICAgICB9CisgICAgICAgIGNvZGV1bml0cy5hZGQoYnl0ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChfaXNMb3dTdXJyb2dhdGUoYnl0ZSkpIHsKKyAgICAgICAgaWYgKGNvZGV1bml0cy5pc0VtcHR5KSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBjb2RldW5pdHMuYWRkKGJ5dGUpOworICAgICAgICBieXRlcy5hZGRBbGwodXRmOENvZGVjLmVuY29kZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZXVuaXRzKSkpOworICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBieXRlcy5hZGRBbGwodXRmOENvZGVjLmVuY29kZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSkpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjb2RldW5pdHMuaXNOb3RFbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIik7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoYnl0ZXMpOworICB9CisKKyAgU3RyaW5nIF9yZWFkSnNvbk51bWVyaWNDaGFycygpIHsKKyAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoIV9Db25zdGFudHMuaXNKc29uTnVtZXJpYyhfcmVhZGVyLnBlZWsoKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBidWZmZXIud3JpdGUobmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoX3JlYWRlci5yZWFkKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICB9CisKKyAgaW50IF9yZWFkSnNvbkludGVnZXIoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworCisgICAgaWYgKF9jb250ZXh0LmVzY2FwZU51bWJlcnMpIHsKKyAgICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSk7CisgICAgfQorICAgIFN0cmluZyBzdHIgPSBfcmVhZEpzb25OdW1lcmljQ2hhcnMoKTsKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGludC5wYXJzZShzdHIpOworICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgIH0KKyAgfQorCisgIGRvdWJsZSBfcmVhZEpzb25Eb3VibGUoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworCisgICAgaWYgKF9yZWFkZXIucGVlaygpID09IF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pIHsKKyAgICAgIFVpbnQ4TGlzdCBieXRlcyA9IF9yZWFkSnNvblN0cmluZyhza2lwQ29udGV4dDogdHJ1ZSk7CisgICAgICBkb3VibGUgZCA9IGRvdWJsZS5wYXJzZSh1dGY4Q29kZWMuZGVjb2RlKGJ5dGVzKSwgKF8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgfSk7CisgICAgICBpZiAoIV9jb250ZXh0LmVzY2FwZU51bWJlcnMgJiYgIWQuaXNOYU4gJiYgIWQuaXNJbmZpbml0ZSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgfQorICAgICAgcmV0dXJuIGQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bWJlcnMgPT0gdHJ1ZQorICAgICAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgICAgfQorICAgICAgcmV0dXJuIGRvdWJsZS5wYXJzZShfcmVhZEpzb25OdW1lcmljQ2hhcnMoKSwgKF8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgfSk7CisgICAgfQorICB9CisKKyAgVWludDhMaXN0IF9yZWFkSnNvbkJhc2U2NCgpIHsKKyAgICAvLyBjb252ZXJ0IFVURi04IGJ5dGVzIG9mIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZyB0byBiaW5hcnkgYnl0ZXMKKyAgICBVaW50OExpc3QgYmFzZTY0Qnl0ZXMgPSBfcmVhZEpzb25TdHJpbmcoKTsKKyAgICBTdHJpbmcgYmFzZTY0ID0gdXRmOENvZGVjLmRlY29kZShiYXNlNjRCeXRlcyk7CisKKyAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChCQVNFNjQuZGVjb2RlKGJhc2U2NCkpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25PYmplY3RTdGFydCgpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLkxCUkFDRV9CWVRFU1swXSk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfUGFpckNvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25PYmplY3RFbmQoKSB7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlJCUkFDRV9CWVRFU1swXSk7CisgICAgX3BvcENvbnRleHQoKTsKKyAgfQorCisgIHZvaWQgX3JlYWRKc29uQXJyYXlTdGFydCgpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLkxCUkFDS0VUX0JZVEVTWzBdKTsKKyAgICBfcHVzaENvbnRleHQobmV3IF9MaXN0Q29udGV4dCh0aGlzKSk7CisgIH0KKworICB2b2lkIF9yZWFkSnNvbkFycmF5RW5kKCkgeworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5SQlJBQ0tFVF9CWVRFU1swXSk7CisgICAgX3BvcENvbnRleHQoKTsKKyAgfQorCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgX3Jlc2V0Q29udGV4dCgpOworCisgICAgX3JlYWRKc29uQXJyYXlTdGFydCgpOworICAgIGlmIChfcmVhZEpzb25JbnRlZ2VyKCkgIT0gVkVSU0lPTl8xKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLCAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgfQorCisgICAgVWludDhMaXN0IGJ1ZmZlciA9IF9yZWFkSnNvblN0cmluZygpOworICAgIFN0cmluZyBuYW1lID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgIGludCB0eXBlID0gX3JlYWRKc29uSW50ZWdlcigpOworICAgIGludCBzZXFpZCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKworICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobmFtZSwgdHlwZSwgc2VxaWQpOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgX3JlYWRKc29uT2JqZWN0U3RhcnQoKTsKKyAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICBfcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBTdHJpbmcgbmFtZSA9ICIiOworICAgIGludCB0eXBlID0gVFR5cGUuU1RPUDsKKyAgICBpbnQgaWQgPSAwOworCisgICAgaWYgKF9yZWFkZXIucGVlaygpICE9IF9Db25zdGFudHMuUkJSQUNFX0JZVEVTWzBdKSB7CisgICAgICBpZCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKyAgICAgIF9yZWFkSnNvbk9iamVjdFN0YXJ0KCk7CisgICAgICB0eXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBURmllbGQobmFtZSwgdHlwZSwgaWQpOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7CisgICAgX3JlYWRKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaW50IGtleVR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICBpbnQgdmFsdWVUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKyAgICBfcmVhZEpzb25PYmplY3RTdGFydCgpOworCisgICAgcmV0dXJuIG5ldyBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHsKKyAgICBfcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaW50IGVsZW1lbnRUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKworICAgIHJldHVybiBuZXcgVExpc3QoZWxlbWVudFR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRMaXN0RW5kKCkgeworICAgIF9yZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaW50IGVsZW1lbnRUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKworICAgIHJldHVybiBuZXcgVFNldChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZFNldEVuZCgpIHsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgYm9vbCByZWFkQm9vbCgpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWU7CisgIH0KKworICBpbnQgcmVhZEJ5dGUoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGludCByZWFkSTE2KCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCk7CisgIH0KKworICBpbnQgcmVhZEkzMigpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpOworICB9CisKKyAgaW50IHJlYWRJNjQoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIHJldHVybiBfcmVhZEpzb25Eb3VibGUoKTsKKyAgfQorCisgIFN0cmluZyByZWFkU3RyaW5nKCkgeworICAgIHJldHVybiB1dGY4Q29kZWMuZGVjb2RlKF9yZWFkSnNvblN0cmluZygpKTsKKyAgfQorCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCkgeworICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KF9yZWFkSnNvbkJhc2U2NCgpKTsKKyAgfQorfQorCitjbGFzcyBfQ29uc3RhbnRzIHsKKyAgc3RhdGljIGNvbnN0IHV0Zjhjb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYXzBfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCcwJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEhFWF85X0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnOScuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBIRVhfQV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ2EnLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYX0ZfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCdmJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IENPTU1BX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnLCcuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBDT0xPTl9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJzonLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgTEJSQUNFX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgneycuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBSQlJBQ0VfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCd9Jy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IExCUkFDS0VUX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnWycuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBSQlJBQ0tFVF9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ10nLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgUVVPVEVfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCciJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEJBQ0tTTEFTSF9CWVRFUyA9CisgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KHInXCcuY29kZVVuaXRzKTsKKworICBzdGF0aWMgZmluYWwgRVNDU0VRX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChyJ1x1MDAnLmNvZGVVbml0cyk7CisKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBKU09OX0NIQVJfVEFCTEUgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KFsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA4IGJ5dGVzCisgICAgJ2InLmNvZGVVbml0QXQoMCksICd0Jy5jb2RlVW5pdEF0KDApLCAnbicuY29kZVVuaXRBdCgwKSwgMCwgLy8gNCBieXRlcworICAgICdmJy5jb2RlVW5pdEF0KDApLCAncicuY29kZVVuaXRBdCgwKSwgMCwgMCwgLy8gNCBieXRlcworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDggYnl0ZXMKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA4IGJ5dGVzCisgICAgMSwgMSwgJyInLmNvZGVVbml0QXQoMCksIDEsIDEsIDEsIDEsIDEsIC8vIDggYnl0ZXMKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIC8vIDggYnl0ZXMKKyAgXSk7CisKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBFU0NBUEVfQ0hBUlMgPSByJyJcL2JmbnJ0JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBFU0NBUEVfQ0hBUl9WQUxTID0gJyJcXC9cYlxmXG5cclx0JzsKKworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfQk9PTCA9ICd0Zic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9CWVRFID0gJ2k4JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0kxNiA9ICdpMTYnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfSTMyID0gJ2kzMic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9JNjQgPSAnaTY0JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0RPVUJMRSA9ICdkYmwnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfU1RSVUNUID0gJ3JlYyc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9TVFJJTkcgPSAnc3RyJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX01BUCA9ICdtYXAnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfTElTVCA9ICdsc3QnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfU0VUID0gJ3NldCc7CisKKyAgc3RhdGljIGZpbmFsIE1hcDxpbnQsIFVpbnQ4TGlzdD4gX1RZUEVfSURfVE9fTkFNRV9CWVRFUyA9CisgICAgICBuZXcgTWFwLnVubW9kaWZpYWJsZSh7CisgICAgVFR5cGUuQk9PTDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0JPT0wuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5CWVRFOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfQllURS5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkkxNjogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0kxNi5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkkzMjogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0kzMi5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkk2NDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0k2NC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkRPVUJMRTogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0RPVUJMRS5jb2RlVW5pdHMpLAorICAgIFRUeXBlLlNUUklORzogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX1NUUklORy5jb2RlVW5pdHMpLAorICAgIFRUeXBlLlNUUlVDVDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX1NUUlVDVC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLk1BUDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX01BUC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLlNFVDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX1NFVC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkxJU1Q6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9MSVNULmNvZGVVbml0cykKKyAgfSk7CisKKyAgc3RhdGljIFVpbnQ4TGlzdCBnZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKGludCB0eXBlSWQpIHsKKyAgICBpZiAoIV9UWVBFX0lEX1RPX05BTUVfQllURVMuY29udGFpbnNLZXkodHlwZUlkKSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworICAgIHJldHVybiBfVFlQRV9JRF9UT19OQU1FX0JZVEVTW3R5cGVJZF07CisgIH0KKworICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgaW50PiBfTkFNRV9UT19UWVBFX0lEID0gbmV3IE1hcC51bm1vZGlmaWFibGUoeworICAgIE5BTUVfQk9PTDogVFR5cGUuQk9PTCwKKyAgICBOQU1FX0JZVEU6IFRUeXBlLkJZVEUsCisgICAgTkFNRV9JMTY6IFRUeXBlLkkxNiwKKyAgICBOQU1FX0kzMjogVFR5cGUuSTMyLAorICAgIE5BTUVfSTY0OiBUVHlwZS5JNjQsCisgICAgTkFNRV9ET1VCTEU6IFRUeXBlLkRPVUJMRSwKKyAgICBOQU1FX1NUUklORzogVFR5cGUuU1RSSU5HLAorICAgIE5BTUVfU1RSVUNUOiBUVHlwZS5TVFJVQ1QsCisgICAgTkFNRV9NQVA6IFRUeXBlLk1BUCwKKyAgICBOQU1FX1NFVDogVFR5cGUuU0VULAorICAgIE5BTUVfTElTVDogVFR5cGUuTElTVAorICB9KTsKKworICBzdGF0aWMgaW50IGdldFR5cGVJZEZvclR5cGVOYW1lKFVpbnQ4TGlzdCBieXRlcykgeworICAgIFN0cmluZyBuYW1lID0gdXRmOGNvZGVjLmRlY29kZShieXRlcyk7CisgICAgaWYgKCFfTkFNRV9UT19UWVBFX0lELmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorCisgICAgcmV0dXJuIF9OQU1FX1RPX1RZUEVfSURbbmFtZV07CisgIH0KKworICBzdGF0aWMgZmluYWwgU2V0PGludD4gX0pTT05fTlVNRVJJQ1MgPSBuZXcgU2V0LmZyb20oWworICAgICcrJy5jb2RlVW5pdEF0KDApLAorICAgICctJy5jb2RlVW5pdEF0KDApLAorICAgICcuJy5jb2RlVW5pdEF0KDApLAorICAgICcwJy5jb2RlVW5pdEF0KDApLAorICAgICcxJy5jb2RlVW5pdEF0KDApLAorICAgICcyJy5jb2RlVW5pdEF0KDApLAorICAgICczJy5jb2RlVW5pdEF0KDApLAorICAgICc0Jy5jb2RlVW5pdEF0KDApLAorICAgICc1Jy5jb2RlVW5pdEF0KDApLAorICAgICc2Jy5jb2RlVW5pdEF0KDApLAorICAgICc3Jy5jb2RlVW5pdEF0KDApLAorICAgICc4Jy5jb2RlVW5pdEF0KDApLAorICAgICc5Jy5jb2RlVW5pdEF0KDApLAorICAgICdFJy5jb2RlVW5pdEF0KDApLAorICAgICdlJy5jb2RlVW5pdEF0KDApCisgIF0pOworCisgIHN0YXRpYyBib29sIGlzSnNvbk51bWVyaWMoaW50IGJ5dGUpIHsKKyAgICByZXR1cm4gX0pTT05fTlVNRVJJQ1MuY29udGFpbnMoYnl0ZSk7CisgIH0KK30KKworY2xhc3MgX0xvb2thaGVhZFJlYWRlciB7CisgIGZpbmFsIFRKc29uUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgX0xvb2thaGVhZFJlYWRlcih0aGlzLnByb3RvY29sKTsKKworICBib29sIF9oYXNEYXRhID0gZmFsc2U7CisgIGZpbmFsIFVpbnQ4TGlzdCBfZGF0YSA9IG5ldyBVaW50OExpc3QoMSk7CisKKyAgaW50IHJlYWQoKSB7CisgICAgaWYgKF9oYXNEYXRhKSB7CisgICAgICBfaGFzRGF0YSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC50cmFuc3BvcnQucmVhZEFsbChfZGF0YSwgMCwgMSk7CisgICAgfQorCisgICAgcmV0dXJuIF9kYXRhWzBdOworICB9CisKKyAgaW50IHBlZWsoKSB7CisgICAgaWYgKCFfaGFzRGF0YSkgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LnJlYWRBbGwoX2RhdGEsIDAsIDEpOworICAgIH0KKyAgICBfaGFzRGF0YSA9IHRydWU7CisKKyAgICByZXR1cm4gX2RhdGFbMF07CisgIH0KK30KKworY2xhc3MgX0Jhc2VDb250ZXh0IHsKKyAgZmluYWwgVEpzb25Qcm90b2NvbCBwcm90b2NvbDsKKworICBfQmFzZUNvbnRleHQodGhpcy5wcm90b2NvbCk7CisKKyAgdm9pZCB3cml0ZSgpIHt9CisKKyAgdm9pZCByZWFkKCkge30KKworICBib29sIGdldCBlc2NhcGVOdW1iZXJzID0+IGZhbHNlOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICdCYXNlQ29udGV4dCc7Cit9CisKK2NsYXNzIF9MaXN0Q29udGV4dCBleHRlbmRzIF9CYXNlQ29udGV4dCB7CisgIF9MaXN0Q29udGV4dChUSnNvblByb3RvY29sIHByb3RvY29sKSA6IHN1cGVyKHByb3RvY29sKTsKKworICBib29sIF9maXJzdCA9IHRydWU7CisKKyAgdm9pZCB3cml0ZSgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuQ09NTUFfQllURVMpOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZCgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wuX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLkNPTU1BX0JZVEVTWzBdKTsKKyAgICB9CisgIH0KKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnTGlzdENvbnRleHQnOworfQorCitjbGFzcyBfUGFpckNvbnRleHQgZXh0ZW5kcyBfQmFzZUNvbnRleHQgeworICBfUGFpckNvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90b2NvbCkgOiBzdXBlcihwcm90b2NvbCk7CisKKyAgYm9vbCBfZmlyc3QgPSB0cnVlOworICBib29sIF9jb2xvbiA9IHRydWU7CisKKyAgVWludDhMaXN0IGdldCBzeW1ib2xCeXRlcyA9PgorICAgICAgX2NvbG9uID8gX0NvbnN0YW50cy5DT0xPTl9CWVRFUyA6IF9Db25zdGFudHMuQ09NTUFfQllURVM7CisKKyAgdm9pZCB3cml0ZSgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLnRyYW5zcG9ydC53cml0ZUFsbChzeW1ib2xCeXRlcyk7CisgICAgICBfY29sb24gPSAhX2NvbG9uOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZCgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLl9yZWFkSnNvblN5bnRheENoYXIoc3ltYm9sQnl0ZXNbMF0pOworICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICB9CisgIH0KKworICBib29sIGdldCBlc2NhcGVOdW1iZXJzID0+IF9jb2xvbjsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUGFpckNvbnRleHQnOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2xpc3QuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNDY3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUTGlzdCB7CisgIGZpbmFsIGludCBlbGVtZW50VHlwZTsKKyAgZmluYWwgaW50IGxlbmd0aDsKKworICBUTGlzdCh0aGlzLmVsZW1lbnRUeXBlLCB0aGlzLmxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkZjY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tYXAuZGFydApAQCAtMCwwICsxLDI2IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRNYXAgeworICBmaW5hbCBpbnQga2V5VHlwZTsKKyAgZmluYWwgaW50IHZhbHVlVHlwZTsKKyAgZmluYWwgaW50IGxlbmd0aDsKKworICBUTWFwKHRoaXMua2V5VHlwZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMubGVuZ3RoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tZXNzYWdlLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2I4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0CkBAIC0wLDAgKzEsMzUgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVE1lc3NhZ2VUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBDQUxMID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBSRVBMWSA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgRVhDRVBUSU9OID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBPTkVXQVkgPSA0OworfQorCitjbGFzcyBUTWVzc2FnZSB7CisgIGZpbmFsIFN0cmluZyBuYW1lOworICBmaW5hbCBpbnQgdHlwZTsKKyAgZmluYWwgaW50IHNlcWlkOworCisgIFRNZXNzYWdlKHRoaXMubmFtZSwgdGhpcy50eXBlLCB0aGlzLnNlcWlkKTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiPFRNZXNzYWdlIG5hbWU6ICckbmFtZScgdHlwZTogJHR5cGUgc2VxaWQ6ICRzZXFpZD4iOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhhNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw0MyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IgeworICBzdGF0aWMgY29uc3QgU0VQQVJBVE9SID0gJzonOworCisgIGZpbmFsIFN0cmluZyBfc2VydmljZU5hbWU7CisKKyAgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBTdHJpbmcgc2VydmljZU5hbWUpCisgICAgICA6IF9zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLAorICAgICAgICBzdXBlcihwcm90b2NvbCkgeworICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJzZXJ2aWNlTmFtZSIpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgfHwKKyAgICAgICAgbWVzc2FnZS50eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gX3NlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbWVzc2FnZS5uYW1lOworICAgICAgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZShuYW1lLCBtZXNzYWdlLnR5cGUsIG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKworICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWMwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDk1IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRQcm90b2NvbCB7CisgIGZpbmFsIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgIFRQcm90b2NvbCh0aGlzLnRyYW5zcG9ydCk7CisKKyAgLy8vIFdyaXRlCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSk7CisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KTsKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpOworCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCk7CisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpOworICB2b2lkIHdyaXRlRmllbGRTdG9wKCk7CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKTsKKyAgdm9pZCB3cml0ZU1hcEVuZCgpOworCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCk7CisgIHZvaWQgd3JpdGVMaXN0RW5kKCk7CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KTsKKyAgdm9pZCB3cml0ZVNldEVuZCgpOworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYik7CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpOworCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNik7CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKTsKKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpOworCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpOworCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cik7CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpOworCisgIC8vLyBSZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpOworCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCk7CisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpOworCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpOworICB2b2lkIHJlYWRGaWVsZEVuZCgpOworCisgIFRNYXAgcmVhZE1hcEJlZ2luKCk7CisgIHZvaWQgcmVhZE1hcEVuZCgpOworCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKTsKKyAgdm9pZCByZWFkTGlzdEVuZCgpOworCisgIFRTZXQgcmVhZFNldEJlZ2luKCk7CisgIHZvaWQgcmVhZFNldEVuZCgpOworCisgIGJvb2wgcmVhZEJvb2woKTsKKworICBpbnQgcmVhZEJ5dGUoKTsKKworICBpbnQgcmVhZEkxNigpOworCisgIGludCByZWFkSTMyKCk7CisKKyAgaW50IHJlYWRJNjQoKTsKKworICBkb3VibGUgcmVhZERvdWJsZSgpOworCisgIFN0cmluZyByZWFkU3RyaW5nKCk7CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2QwMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2RlY29yYXRvci5kYXJ0CkBAIC0wLDAgKzEsMTUwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBGb3J3YXJkIGFsbCBvcGVyYXRpb25zIHRvIHRoZSB3cmFwcGVkIHByb3RvY29sLiAgVXNlZCBhcyBhIGJhc2UgY2xhc3MuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBmaW5hbCBUUHJvdG9jb2wgX3Byb3RvY29sOworCisgIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICA6IF9wcm90b2NvbCA9IHByb3RvY29sLAorICAgICAgICBzdXBlcihwcm90b2NvbC50cmFuc3BvcnQpOworCisgIC8vLyBXcml0ZQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIF9wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgeworICAgIF9wcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKHN0cnVjdCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgX3Byb3RvY29sLndyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlRmllbGRFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgX3Byb3RvY29sLndyaXRlRmllbGRTdG9wKCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNYXBCZWdpbihtYXApOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIF9wcm90b2NvbC53cml0ZUxpc3RCZWdpbihsaXN0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIF9wcm90b2NvbC53cml0ZVNldEJlZ2luKHNldCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0RW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZVNldEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgX3Byb3RvY29sLndyaXRlQm9vbChiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGludCBiKSB7CisgICAgX3Byb3RvY29sLndyaXRlQnl0ZShiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIF9wcm90b2NvbC53cml0ZUkxNihpMTYpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgX3Byb3RvY29sLndyaXRlSTMyKGkzMik7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVJNjQoaTY0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVEb3VibGUoZCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTdHJpbmcoc3RyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3Byb3RvY29sLndyaXRlQmluYXJ5KGJ5dGVzKTsKKyAgfQorCisgIC8vLyBSZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgPT4gX3Byb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCk7CisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpID0+IF9wcm90b2NvbC5yZWFkU3RydWN0RW5kKCk7CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRGaWVsZEJlZ2luKCk7CisgIHZvaWQgcmVhZEZpZWxkRW5kKCkgPT4gX3Byb3RvY29sLnJlYWRGaWVsZEVuZCgpOworCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRNYXBCZWdpbigpOworICB2b2lkIHJlYWRNYXBFbmQoKSA9PiBfcHJvdG9jb2wucmVhZE1hcEVuZCgpOworCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworICB2b2lkIHJlYWRMaXN0RW5kKCkgPT4gX3Byb3RvY29sLnJlYWRMaXN0RW5kKCk7CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZFNldEJlZ2luKCk7CisgIHZvaWQgcmVhZFNldEVuZCgpID0+IF9wcm90b2NvbC5yZWFkU2V0RW5kKCk7CisKKyAgYm9vbCByZWFkQm9vbCgpID0+IF9wcm90b2NvbC5yZWFkQm9vbCgpOworCisgIGludCByZWFkQnl0ZSgpID0+IF9wcm90b2NvbC5yZWFkQnl0ZSgpOworCisgIGludCByZWFkSTE2KCkgPT4gX3Byb3RvY29sLnJlYWRJMTYoKTsKKworICBpbnQgcmVhZEkzMigpID0+IF9wcm90b2NvbC5yZWFkSTMyKCk7CisKKyAgaW50IHJlYWRJNjQoKSA9PiBfcHJvdG9jb2wucmVhZEk2NCgpOworCisgIGRvdWJsZSByZWFkRG91YmxlKCkgPT4gX3Byb3RvY29sLnJlYWREb3VibGUoKTsKKworICBTdHJpbmcgcmVhZFN0cmluZygpID0+IF9wcm90b2NvbC5yZWFkU3RyaW5nKCk7CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSA9PiBfcHJvdG9jb2wucmVhZEJpbmFyeSgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTZiYWViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQKQEAgLTAsMCArMSwzMyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUUHJvdG9jb2xFcnJvclR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAwOworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfREFUQSA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgTkVHQVRJVkVfU0laRSA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgU0laRV9MSU1JVCA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgQkFEX1ZFUlNJT04gPSA0OworICBzdGF0aWMgY29uc3QgaW50IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgIHN0YXRpYyBjb25zdCBpbnQgREVQVEhfTElNSVQgPSA2OworfQorCitjbGFzcyBUUHJvdG9jb2xFcnJvciBleHRlbmRzIFRFcnJvciB7CisgIFRQcm90b2NvbEVycm9yKFtpbnQgdHlwZSA9IFRQcm90b2NvbEVycm9yVHlwZS5VTktOT1dOLCBTdHJpbmcgbWVzc2FnZSA9ICIiXSkKKyAgICAgIDogc3VwZXIodHlwZSwgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZmFjdG9yeS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjJjNmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydApAQCAtMCwwICsxLDIyIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRQcm90b2NvbEZhY3Rvcnk8VCBleHRlbmRzIFRQcm90b2NvbD4geworICBUIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfdXRpbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjAwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfdXRpbC5kYXJ0CkBAIC0wLDAgKzEsMTA3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRQcm90b2NvbFV0aWwgeworICAvLyBlcXVhbCB0byBKYXZhU2NyaXB0IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCAyXjUzIC0gMQorICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRSZWN1cnNpb25MaW1pdCA9IDkwMDcxOTkyNTQ3NDA5OTE7CisKKyAgc3RhdGljIGludCBtYXhSZWN1cnNpb25MaW1pdCA9IGRlZmF1bHRSZWN1cnNpb25MaW1pdDsKKworICBzdGF0aWMgc2tpcChUUHJvdG9jb2wgcHJvdCwgaW50IHR5cGUpIHsKKyAgICBfc2tpcChwcm90LCB0eXBlLCBtYXhSZWN1cnNpb25MaW1pdCk7CisgIH0KKworICBzdGF0aWMgX3NraXAoVFByb3RvY29sIHByb3QsIGludCB0eXBlLCBpbnQgcmVjdXJzaW9uTGltaXQpIHsKKyAgICBpZiAocmVjdXJzaW9uTGltaXQgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5ERVBUSF9MSU1JVCwgIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICAgIHByb3QucmVhZEJvb2woKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgcHJvdC5yZWFkQnl0ZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgIHByb3QucmVhZEkxNigpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgIHByb3QucmVhZEkzMigpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgIHByb3QucmVhZEk2NCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICAgIHByb3QucmVhZERvdWJsZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6CisgICAgICAgIHByb3QucmVhZEJpbmFyeSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIHByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgVEZpZWxkIGZpZWxkID0gcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBfc2tpcChwcm90LCBmaWVsZC50eXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICAgIHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgVE1hcCBtYXAgPSBwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIF9za2lwKHByb3QsIG1hcC5rZXlUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICAgIF9za2lwKHByb3QsIG1hcC52YWx1ZVR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgICAgVFNldCBzZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIF9za2lwKHByb3QsIHNldC5lbGVtZW50VHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgVExpc3QgbGlzdCA9IHByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBfc2tpcChwcm90LCBsaXN0LmVsZW1lbnRUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3NldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3NldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDI1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU2V0IHsKKyAgZmluYWwgaW50IGVsZW1lbnRUeXBlOworICBmaW5hbCBpbnQgbGVuZ3RoOworCisgIFRTZXQodGhpcy5lbGVtZW50VHlwZSwgdGhpcy5sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDNmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU3RydWN0IHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgVFN0cnVjdChbdGhpcy5uYW1lID0gIiJdKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTlkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0CkBAIC0wLDAgKzEsMzQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFNUT1AgPSAwOworICBzdGF0aWMgY29uc3QgaW50IFZPSUQgPSAxOworICBzdGF0aWMgY29uc3QgaW50IEJPT0wgPSAyOworICBzdGF0aWMgY29uc3QgaW50IEJZVEUgPSAzOworICBzdGF0aWMgY29uc3QgaW50IERPVUJMRSA9IDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgSTE2ID0gNjsKKyAgc3RhdGljIGNvbnN0IGludCBJMzIgPSA4OworICBzdGF0aWMgY29uc3QgaW50IEk2NCA9IDEwOworICBzdGF0aWMgY29uc3QgaW50IFNUUklORyA9IDExOworICBzdGF0aWMgY29uc3QgaW50IFNUUlVDVCA9IDEyOworICBzdGF0aWMgY29uc3QgaW50IE1BUCA9IDEzOworICBzdGF0aWMgY29uc3QgaW50IFNFVCA9IDE0OworICBzdGF0aWMgY29uc3QgaW50IExJU1QgPSAxNTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3RfZGVzZXJpYWxpemVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxZDEzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0CkBAIC0wLDAgKzEsNTAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVERlc2VyaWFsaXplciB7CisgIGZpbmFsIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ0Rlc2VyaWFsaXplcicsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEpOworICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgVERlc2VyaWFsaXplcih7VFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnl9KSB7CisgICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgCisgICAgaWYgKHByb3RvY29sRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgfQorICAgIAorICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wodGhpcy50cmFuc3BvcnQpOworICB9CisKKyAgdm9pZCByZWFkKFRCYXNlIGJhc2UsIFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKGRhdGEpOworICAgIAorICAgIHRyYW5zcG9ydC5mbHVzaCgpOworICAgIAorICAgIGJhc2UucmVhZChwcm90b2NvbCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJpbmcoVEJhc2UgYmFzZSwgU3RyaW5nIGRhdGEpIHsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoQkFTRTY0LmRlY29kZShkYXRhKSk7CisgICAgCisgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICBiYXNlLnJlYWQocHJvdG9jb2wpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9zZXJpYWxpemVyLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9zZXJpYWxpemVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkZGI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydApAQCAtMCwwICsxLDQ4IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRTZXJpYWxpemVyIHsKKyAgZmluYWwgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnU2VyaWFsaXplcicsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEpOworICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgVFNlcmlhbGl6ZXIoe1RQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5fSkgeworICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOworICAgIAorICAgIGlmIChwcm90b2NvbEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICB9CisKKyAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRoaXMudHJhbnNwb3J0KTsKKyAgfQorCisgIFVpbnQ4TGlzdCB3cml0ZShUQmFzZSBiYXNlKSB7CisgICAgYmFzZS53cml0ZShwcm90b2NvbCk7CisgICAgCisgICAgcmV0dXJuIHRyYW5zcG9ydC5jb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgfQorCisgIFN0cmluZyB3cml0ZVN0cmluZyhUQmFzZSBiYXNlKSB7CisgICAgYmFzZS53cml0ZShwcm90b2NvbCk7CisgICAgCisgICAgVWludDhMaXN0IGJ5dGVzID0gdHJhbnNwb3J0LmNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgIAorICAgIHJldHVybiBCQVNFNjQuZW5jb2RlKGJ5dGVzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X2FwcGxpY2F0aW9uX2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhhYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X2FwcGxpY2F0aW9uX2Vycm9yLmRhcnQKQEAgLTAsMCArMSwxMDQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEFwcGxpY2F0aW9uRXJyb3JUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOX01FVEhPRCA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOworICBzdGF0aWMgY29uc3QgaW50IFdST05HX01FVEhPRF9OQU1FID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBCQURfU0VRVUVOQ0VfSUQgPSA0OworICBzdGF0aWMgY29uc3QgaW50IE1JU1NJTkdfUkVTVUxUID0gNTsKKyAgc3RhdGljIGNvbnN0IGludCBJTlRFUk5BTF9FUlJPUiA9IDY7CisgIHN0YXRpYyBjb25zdCBpbnQgUFJPVE9DT0xfRVJST1IgPSA3OworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfVFJBTlNGT1JNID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX1BST1RPQ09MID0gOTsKKyAgc3RhdGljIGNvbnN0IGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOworfQorCitjbGFzcyBUQXBwbGljYXRpb25FcnJvciBleHRlbmRzIFRFcnJvciB7CisgIHN0YXRpYyBmaW5hbCBUU3RydWN0IF9zdHJ1Y3QgPSBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXJyb3IiKTsKKyAgc3RhdGljIGNvbnN0IGludCBNRVNTQUdFID0gMTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfbWVzc2FnZUZpZWxkID0KKyAgICAgIG5ldyBURmllbGQoIm1lc3NhZ2UiLCBUVHlwZS5TVFJJTkcsIE1FU1NBR0UpOworICBzdGF0aWMgY29uc3QgaW50IFRZUEUgPSAyOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF90eXBlRmllbGQgPSBuZXcgVEZpZWxkKCJ0eXBlIiwgVFR5cGUuSTMyLCBUWVBFKTsKKworICBUQXBwbGljYXRpb25FcnJvcigKKyAgICAgIFtpbnQgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVHlwZS5VTktOT1dOLCBTdHJpbmcgbWVzc2FnZSA9ICIiXSkKKyAgICAgIDogc3VwZXIodHlwZSwgbWVzc2FnZSk7CisKKyAgc3RhdGljIFRBcHBsaWNhdGlvbkVycm9yIHJlYWQoVFByb3RvY29sIGlwcm90KSB7CisgICAgVEZpZWxkIGZpZWxkOworCisgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOworICAgIGludCB0eXBlID0gVEFwcGxpY2F0aW9uRXJyb3JUeXBlLlVOS05PV047CisKKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworCisgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7CisgICAgICAgIGNhc2UgTUVTU0FHRToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICAgIHR5cGUgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisKKyAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkVycm9yKHR5cGUsIG1lc3NhZ2UpOworICB9CisKKyAgd3JpdGUoVFByb3RvY29sIG9wcm90KSB7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfc3RydWN0KTsKKworICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgIW1lc3NhZ2UuaXNFbXB0eSkgeworICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9tZXNzYWdlRmllbGQpOworICAgICAgb3Byb3Qud3JpdGVTdHJpbmcobWVzc2FnZSk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF90eXBlRmllbGQpOworICAgIG9wcm90LndyaXRlSTMyKHR5cGUpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKworICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X2Jhc2UuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9iYXNlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1NzFiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9iYXNlLmRhcnQKQEAgLTAsMCArMSwzNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCithYnN0cmFjdCBjbGFzcyBUQmFzZSB7CisgIC8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCk7CisKKyAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIFtvcHJvdF0gcHJvdG9jb2wuCisgIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KTsKKworICAvLy8gQ2hlY2sgaWYgYSBmaWVsZCBpcyBjdXJyZW50bHkgc2V0IG9yIHVuc2V0LCB1c2luZyB0aGUgW2ZpZWxkSWRdLgorICBib29sIGlzU2V0KGludCBmaWVsZElkKTsKKworICAvLy8gR2V0IGEgZmllbGQncyB2YWx1ZSBieSBbZmllbGRJZF0uIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlCisgIC8vLyBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgorICBnZXRGaWVsZFZhbHVlKGludCBmaWVsZElkKTsKKworICAvLy8gU2V0IGEgZmllbGQncyB2YWx1ZSBieSBbZmllbGRJZF0uIFByaW1pdGl2ZSB0eXBlcyBtdXN0IGJlICJib3hlZCIgaW4gdGhlCisgIC8vLyBhcHByb3ByaWF0ZSBvYmplY3Qgd3JhcHBlciB0eXBlLgorICBzZXRGaWVsZFZhbHVlKGludCBmaWVsZElkLCBPYmplY3QgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FiNzMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X2Vycm9yLmRhcnQKQEAgLTAsMCArMSwyNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBURXJyb3IgZXh0ZW5kcyBFcnJvciB7CisgIGZpbmFsIFN0cmluZyBtZXNzYWdlOworICBmaW5hbCBpbnQgdHlwZTsKKworICBURXJyb3IodGhpcy50eXBlLCB0aGlzLm1lc3NhZ2UpOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICI8VEVycm9yIHR5cGU6ICR0eXBlIG1lc3NhZ2U6ICckbWVzc2FnZSc+IjsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdF9wcm9jZXNzb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9wcm9jZXNzb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2YyMGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X3Byb2Nlc3Nvci5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisvLy8gd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KK2Fic3RyYWN0IGNsYXNzIFRQcm9jZXNzb3IgeworICBib29sIHByb2Nlc3MoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfYnVmZmVyZWRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2EzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsOTggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEJ1ZmZlcmVkIGltcGxlbWVudGF0aW9uIG9mIFtUVHJhbnNwb3J0XS4KK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgeworICBmaW5hbCBMaXN0PGludD4gX3dyaXRlQnVmZmVyID0gW107CisgIEl0ZXJhdG9yPGludD4gX3JlYWRJdGVyYXRvcjsKKworICBVaW50OExpc3QgY29uc3VtZVdyaXRlQnVmZmVyKCkgeworICAgIFVpbnQ4TGlzdCBidWZmZXIgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KF93cml0ZUJ1ZmZlcik7CisgICAgX3dyaXRlQnVmZmVyLmNsZWFyKCk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCisgIHZvaWQgX3NldFJlYWRCdWZmZXIoVWludDhMaXN0IHJlYWRCdWZmZXIpIHsKKyAgICBfcmVhZEl0ZXJhdG9yID0gcmVhZEJ1ZmZlciAhPSBudWxsID8gcmVhZEJ1ZmZlci5pdGVyYXRvciA6IG51bGw7CisgIH0KKworICB2b2lkIF9yZXNldCh7Ym9vbCBpc09wZW46IGZhbHNlfSkgeworICAgIF9pc09wZW4gPSBpc09wZW47CisgICAgX3dyaXRlQnVmZmVyLmNsZWFyKCk7CisgICAgX3JlYWRJdGVyYXRvciA9IG51bGw7CisgIH0KKworICBib29sIGdldCBoYXNSZWFkRGF0YSA9PiBfcmVhZEl0ZXJhdG9yICE9IG51bGw7CisKKyAgYm9vbCBfaXNPcGVuOworICBib29sIGdldCBpc09wZW4gPT4gX2lzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfcmVzZXQoaXNPcGVuOiB0cnVlKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBfcmVzZXQoaXNPcGVuOiBmYWxzZSk7CisgIH0KKworICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJidWZmZXIiKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSByYW5nZSBleGNlZWRzIHRoZSBidWZmZXIgbGVuZ3RoIik7CisgICAgfQorCisgICAgaWYgKF9yZWFkSXRlcmF0b3IgPT0gbnVsbCB8fCBsZW5ndGggPD0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGkgPSAwOworICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIF9yZWFkSXRlcmF0b3IubW92ZU5leHQoKSkgeworICAgICAgYnVmZmVyW29mZnNldCArIGldID0gX3JlYWRJdGVyYXRvci5jdXJyZW50OworICAgICAgaSsrOworICAgIH0KKworICAgIC8vIGNsZWFudXAgaXRlcmF0b3Igd2hlbiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQKKyAgICBpZiAoX3JlYWRJdGVyYXRvci5jdXJyZW50ID09IG51bGwpIHsKKyAgICAgIF9yZWFkSXRlcmF0b3IgPSBudWxsOworICAgIH0KKworICAgIHJldHVybiBpOworICB9CisKKyAgdm9pZCB3cml0ZShVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJidWZmZXIiKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSByYW5nZSBleGNlZWRzIHRoZSBidWZmZXIgbGVuZ3RoIik7CisgICAgfQorCisgICAgX3dyaXRlQnVmZmVyLmFkZEFsbChidWZmZXIuc3VibGlzdChvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpOworICB9CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIF9yZWFkSXRlcmF0b3IgPSBjb25zdW1lV3JpdGVCdWZmZXIoKS5pdGVyYXRvcjsKKworICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMDNmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsMTY5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBGcmFtZWQgW1RUcmFuc3BvcnRdLgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIEZyYW1lZCB0cmFuc3BvcnQuCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyAgc3RhdGljIGNvbnN0IGludCBoZWFkZXJCeXRlQ291bnQgPSA0OworCisgIGZpbmFsIFRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKworICBmaW5hbCBVaW50OExpc3QgX2hlYWRlckJ5dGVzID0gbmV3IFVpbnQ4TGlzdChoZWFkZXJCeXRlQ291bnQpOworICBpbnQgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworCisgIGludCBfYm9keVNpemUgPSAwOworICBVaW50OExpc3QgX2JvZHkgPSBudWxsOworICBpbnQgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKworICBDb21wbGV0ZXI8VWludDhMaXN0PiBfZnJhbWVDb21wbGV0ZXIgPSBudWxsOworCisgIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIDogX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCB7CisgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJ0cmFuc3BvcnQiKTsKKyAgICB9CisgIH0KKworICBib29sIGdldCBpc09wZW4gPT4gX3RyYW5zcG9ydC5pc09wZW47CisKKyAgRnV0dXJlIG9wZW4oKSB7CisgICAgX3Jlc2V0KGlzT3BlbjogdHJ1ZSk7CisgICAgcmV0dXJuIF90cmFuc3BvcnQub3BlbigpOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIF9yZXNldChpc09wZW46IGZhbHNlKTsKKyAgICByZXR1cm4gX3RyYW5zcG9ydC5jbG9zZSgpOworICB9CisKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChoYXNSZWFkRGF0YSkgeworICAgICAgaW50IGdvdCA9IHN1cGVyLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICBpZiAoZ290ID4gMCkgcmV0dXJuIGdvdDsKKyAgICB9CisKKyAgICAvLyBJTVBPUlRBTlQ6IGJ5IHRoZSB0aW1lIHlvdSd2ZSBnb3QgaGVyZSwKKyAgICAvLyBhbiBlbnRpcmUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisKKyAgICByZXR1cm4gc3VwZXIucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgX3JlYWRGcmFtZSgpIHsKKyAgICBpZiAoX2JvZHkgPT0gbnVsbCkgeworICAgICAgYm9vbCBnb3RGdWxsSGVhZGVyID0gX3JlYWRGcmFtZUhlYWRlcigpOworICAgICAgaWYgKCFnb3RGdWxsSGVhZGVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBfcmVhZEZyYW1lQm9keSgpOworICB9CisKKyAgYm9vbCBfcmVhZEZyYW1lSGVhZGVyKCkgeworICAgIHZhciByZW1haW5pbmdIZWFkZXJCeXRlcyA9IGhlYWRlckJ5dGVDb3VudCAtIF9yZWNlaXZlZEhlYWRlckJ5dGVzOworCisgICAgaW50IGdvdCA9IF90cmFuc3BvcnQucmVhZChfaGVhZGVyQnl0ZXMsIF9yZWNlaXZlZEhlYWRlckJ5dGVzLCByZW1haW5pbmdIZWFkZXJCeXRlcyk7CisgICAgaWYgKGdvdCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCAiU29ja2V0IGNsb3NlZCBkdXJpbmcgZnJhbWUgaGVhZGVyIHJlYWQiKTsKKyAgICB9CisKKyAgICBfcmVjZWl2ZWRIZWFkZXJCeXRlcyArPSBnb3Q7CisKKyAgICBpZiAoX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPT0gaGVhZGVyQnl0ZUNvdW50KSB7CisgICAgICBpbnQgc2l6ZSA9IF9oZWFkZXJCeXRlcy5idWZmZXIuYXNCeXRlRGF0YSgpLmdldFVpbnQzMigwKTsKKworICAgICAgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworCisgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplOiAkc2l6ZSIpOworICAgICAgfQorCisgICAgICBfYm9keVNpemUgPSBzaXplOworICAgICAgX2JvZHkgPSBuZXcgVWludDhMaXN0KF9ib2R5U2l6ZSk7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHZvaWQgX3JlYWRGcmFtZUJvZHkoKSB7CisgICAgdmFyIHJlbWFpbmluZ0JvZHlCeXRlcyA9IF9ib2R5U2l6ZSAtIF9yZWNlaXZlZEJvZHlCeXRlczsKKworICAgIGludCBnb3QgPSBfdHJhbnNwb3J0LnJlYWQoX2JvZHksIF9yZWNlaXZlZEJvZHlCeXRlcywgcmVtYWluaW5nQm9keUJ5dGVzKTsKKyAgICBpZiAoZ290IDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sICJTb2NrZXQgY2xvc2VkIGR1cmluZyBmcmFtZSBib2R5IHJlYWQiKTsKKyAgICB9CisKKyAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgKz0gZ290OworCisgICAgaWYgKF9yZWNlaXZlZEJvZHlCeXRlcyA9PSBfYm9keVNpemUpIHsKKyAgICAgIHZhciBib2R5ID0gX2JvZHk7CisKKyAgICAgIF9ib2R5U2l6ZSA9IDA7CisgICAgICBfYm9keSA9IG51bGw7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgICAgICBfc2V0UmVhZEJ1ZmZlcihib2R5KTsKKworICAgICAgdmFyIGNvbXBsZXRlciA9IF9mcmFtZUNvbXBsZXRlcjsKKyAgICAgIF9mcmFtZUNvbXBsZXRlciA9IG51bGw7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUobmV3IFVpbnQ4TGlzdCgwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKTsKKyAgICB9CisgIH0KKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgaWYgKF9mcmFtZUNvbXBsZXRlciA9PSBudWxsKSB7CisgICAgICBVaW50OExpc3QgYnVmZmVyID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgICAgICBpbnQgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDsKKworICAgICAgX2hlYWRlckJ5dGVzLmJ1ZmZlci5hc0J5dGVEYXRhKCkuc2V0VWludDMyKDAsIGxlbmd0aCk7CisgICAgICBfdHJhbnNwb3J0LndyaXRlKF9oZWFkZXJCeXRlcywgMCwgaGVhZGVyQnl0ZUNvdW50KTsKKyAgICAgIF90cmFuc3BvcnQud3JpdGUoYnVmZmVyLCAwLCBsZW5ndGgpOworCisgICAgICBfZnJhbWVDb21wbGV0ZXIgID0gbmV3IENvbXBsZXRlcjxVaW50OExpc3Q+KCk7CisgICAgICBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCk7CisgICAgfQorCisgICAgcmV0dXJuIF9mcmFtZUNvbXBsZXRlci5mdXR1cmU7CisgIH0KKworICB2b2lkIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKSB7CisgICAgX3RyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgIF9yZWFkRnJhbWUoKTsKKyAgICB9KS5jYXRjaEVycm9yKChlKSB7CisgICAgICB2YXIgY29tcGxldGVyID0gX2ZyYW1lQ29tcGxldGVyOworCisgICAgICBfcmVjZWl2ZWRIZWFkZXJCeXRlcyA9IDA7CisgICAgICBfYm9keVNpemUgPSAwOworICAgICAgX2JvZHkgPSBudWxsOworICAgICAgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKyAgICAgIF9mcmFtZUNvbXBsZXRlciA9IG51bGw7CisKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGUpOworICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3OGU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDEwMCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiBbVFRyYW5zcG9ydF0uCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBCcm93c2VyQ2xpZW50KCksCisvLy8gICAgICAgICBuZXcgVEh0dHBDb25maWcodXJsLCB7J1gtTXktQ3VzdG9tLUhlYWRlcic6ICdteSB2YWx1ZSd9KSk7CisvLy8gICAgIHZhciBwcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCk7CisvLy8gICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTZXJ2aWNlQ2xpZW50KHByb3RvY29sKTsKKy8vLyAgICAgdmFyIHJlc3VsdCA9IGNsaWVudC5teU1ldGhvZCgpOworLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKUyBYSFIgSFRUUCB0cmFuc3BvcnQuCitjbGFzcyBUSHR0cENsaWVudFRyYW5zcG9ydCBleHRlbmRzIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgIGZpbmFsIENsaWVudCBodHRwQ2xpZW50OworICBmaW5hbCBUSHR0cENvbmZpZyBjb25maWc7CisKKyAgVEh0dHBDbGllbnRUcmFuc3BvcnQodGhpcy5odHRwQ2xpZW50LCB0aGlzLmNvbmZpZykgeworICAgIGlmIChodHRwQ2xpZW50ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImh0dHBDbGllbnQiKTsKKyAgICB9CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICAgIGh0dHBDbGllbnQuY2xvc2UoKTsKKyAgfQorCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICB2YXIgcmVxdWVzdEJvZHkgPSBCQVNFNjQuZW5jb2RlKGNvbnN1bWVXcml0ZUJ1ZmZlcigpKTsKKworICAgIC8vIFVzZSBhIHN5bmMgY29tcGxldGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHkKKyAgICAvLyBhZnRlciB0aGUgcmVhZCBidWZmZXIgaXMgc2V0LCBhbmQgYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBhbm90aGVyCisgICAgLy8gcmVzcG9uc2UgY291bGQgb3ZlcndyaXRlIHRoZSByZWFkIGJ1ZmZlci4KKyAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlci5zeW5jKCk7CisKKyAgICBodHRwQ2xpZW50CisgICAgICAgIC5wb3N0KGNvbmZpZy51cmwsIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzLCBib2R5OiByZXF1ZXN0Qm9keSkKKyAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CisgICAgICBVaW50OExpc3QgZGF0YTsKKyAgICAgIHRyeSB7CisgICAgICAgIGRhdGEgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KAorICAgICAgICAgICAgQkFTRTY0LmRlY29kZShyZXNwb25zZS5ib2R5KSk7CisgICAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJFeHBlY3RlZCBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcuIik7CisgICAgICB9CisKKyAgICAgIF9zZXRSZWFkQnVmZmVyKGRhdGEpOworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKCk7CisgICAgfSk7CisKKyAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKKyAgfQorfQorCitjbGFzcyBUSHR0cENvbmZpZyB7CisgIGZpbmFsIFVyaSB1cmw7CisKKyAgTWFwPFN0cmluZywgU3RyaW5nPiBfaGVhZGVyczsKKyAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgaGVhZGVycyA9PiBfaGVhZGVyczsKKworICBUSHR0cENvbmZpZyh0aGlzLnVybCwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7CisgICAgaWYgKHVybCA9PSBudWxsIHx8ICF1cmwuaGFzQXV0aG9yaXR5KSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCB1cmwiKTsKKyAgICB9CisKKyAgICBfaW5pdEhlYWRlcnMoaGVhZGVycyk7CisgIH0KKworICB2b2lkIF9pbml0SGVhZGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRpYWwpIHsKKyAgICB2YXIgaCA9IHt9OworCisgICAgaWYgKGluaXRpYWwgIT0gbnVsbCkgeworICAgICAgaC5hZGRBbGwoaW5pdGlhbCk7CisgICAgfQorCisgICAgaFsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC10aHJpZnQnOworICAgIGhbJ0FjY2VwdCddID0gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JzsKKworICAgIF9oZWFkZXJzID0gbmV3IE1hcC51bm1vZGlmaWFibGUoaCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfbWVzc2FnZV9yZWFkZXIuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfbWVzc2FnZV9yZWFkZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2EwNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0CkBAIC0wLDAgKzEsOTkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIFtUTWVzc2FnZVJlYWRlcl0gZXh0cmFjdHMgYSBbVE1lc3NhZ2VdIGZyb20gYnl0ZXMuICBUaGlzIGlzIHVzZWQgdG8gYWxsb3cgYQorLy8vIHRyYW5zcG9ydCB0byBpbnNwZWN0IHRoZSBtZXNzYWdlIHNlcWlkIGFuZCBtYXAgcmVzcG9uc2VzIHRvIHJlcXVlc3RzLgorY2xhc3MgVE1lc3NhZ2VSZWFkZXIgeworICBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKworICBmaW5hbCBpbnQgYnl0ZU9mZnNldDsKKyAgZmluYWwgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0IF90cmFuc3BvcnQ7CisKKyAgLy8vIENvbnN0cnVjdCBhIFtNZXNzYWdlUmVhZGVyXS4gIFRoZSBvcHRpb25hbCBbYnl0ZU9mZnNldF0gc3BlY2lmaWVzIHRoZQorICAvLy8gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgYmVmb3JlIHJlYWRpbmcgdGhlIFtUTWVzc2FnZV0uCisgIFRNZXNzYWdlUmVhZGVyKHRoaXMucHJvdG9jb2xGYWN0b3J5LCB7aW50IGJ5dGVPZmZzZXQ6IDB9KQorICAgICAgOiBfdHJhbnNwb3J0ID0gbmV3IF9UTWVzc2FnZVJlYWRlclRyYW5zcG9ydCgpLAorICAgICAgICB0aGlzLmJ5dGVPZmZzZXQgPSBieXRlT2Zmc2V0OworCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlKFVpbnQ4TGlzdCBieXRlcykgeworICAgIF90cmFuc3BvcnQucmVzZXQoYnl0ZXMsIGJ5dGVPZmZzZXQpOworICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChfdHJhbnNwb3J0KTsKKyAgICBUTWVzc2FnZSBtZXNzYWdlID0gcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIF90cmFuc3BvcnQucmVzZXQobnVsbCk7CisKKyAgICByZXR1cm4gbWVzc2FnZTsKKyAgfQorfQorCisvLy8gQW4gaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBzdXBwb3J0IFtUTWVzc2FnZVJlYWRlcl0uCitjbGFzcyBfVE1lc3NhZ2VSZWFkZXJUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKyAgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0KCk7CisKKyAgSXRlcmF0b3I8aW50PiBfcmVhZEl0ZXJhdG9yOworCisgIHZvaWQgcmVzZXQoVWludDhMaXN0IGJ5dGVzLCBbaW50IG9mZnNldCA9IDBdKSB7CisgICAgaWYgKGJ5dGVzID09IG51bGwpIHsKKyAgICAgIF9yZWFkSXRlcmF0b3IgPSBudWxsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChvZmZzZXQgPiBieXRlcy5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgb2Zmc2V0IGV4Y2VlZHMgdGhlIGJ5dGVzIGxlbmd0aCIpOworICAgIH0KKworICAgIF9yZWFkSXRlcmF0b3IgPSBieXRlcy5pdGVyYXRvcjsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2Zmc2V0OyBpKyspIHsKKyAgICAgIF9yZWFkSXRlcmF0b3IubW92ZU5leHQoKTsKKyAgICB9CisgIH0KKworICBnZXQgaXNPcGVuID0+IHRydWU7CisKKyAgRnV0dXJlIG9wZW4oKSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgaW4gTWVzc2FnZVJlYWRlciIpOworCisgIEZ1dHVyZSBjbG9zZSgpID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7CisKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiYnVmZmVyIik7CisgICAgfQorCisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgcmFuZ2UgZXhjZWVkcyB0aGUgYnVmZmVyIGxlbmd0aCIpOworICAgIH0KKworICAgIGlmIChfcmVhZEl0ZXJhdG9yID09IG51bGwgfHwgbGVuZ3RoIDw9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBfcmVhZEl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKKyAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IF9yZWFkSXRlcmF0b3IuY3VycmVudDsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIHZvaWQgd3JpdGUoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgPT4KKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7CisKKyAgRnV0dXJlIGZsdXNoKCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGluIE1lc3NhZ2VSZWFkZXIiKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWI2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsMzggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworZW51bSBUU29ja2V0U3RhdGUgeyBDTE9TRUQsIE9QRU4gfQorCithYnN0cmFjdCBjbGFzcyBUU29ja2V0IHsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGU7CisKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3I7CisKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZTsKKworICBib29sIGdldCBpc09wZW47CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQ7CisKKyAgRnV0dXJlIG9wZW4oKTsKKworICBGdXR1cmUgY2xvc2UoKTsKKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDEzNzRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSwxNzcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBbVFRyYW5zcG9ydF0uCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQobmV3IFRXZWJTb2NrZXQodXJsKSk7CisvLy8gICAgIHZhciBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKy8vLyAgICAgdmFyIGNsaWVudCA9IG5ldyBNeVRocmlmdFNlcnZpY2VDbGllbnQocHJvdG9jb2wpOworLy8vICAgICB2YXIgcmVzdWx0ID0gY2xpZW50Lm15TWV0aG9kKCk7CisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEpTIFdlYlNvY2tldCB0cmFuc3BvcnQuCithYnN0cmFjdCBjbGFzcyBUU29ja2V0VHJhbnNwb3J0IGV4dGVuZHMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyAgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IG5ldyBMb2dnZXIoJ3RocmlmdC5UU29ja2V0VHJhbnNwb3J0Jyk7CisKKyAgZmluYWwgVFNvY2tldCBzb2NrZXQ7CisKKyAgLy8vIEEgdHJhbnNwb3J0IHVzaW5nIHRoZSBwcm92aWRlZCBbc29ja2V0XS4KKyAgVFNvY2tldFRyYW5zcG9ydCh0aGlzLnNvY2tldCkgeworICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgnc29ja2V0Jyk7CisgICAgfQorCisgICAgc29ja2V0Lm9uRXJyb3IubGlzdGVuKChlKSA9PiBsb2dnZXIud2FybmluZyhlKSk7CisgICAgc29ja2V0Lm9uTWVzc2FnZS5saXN0ZW4oaGFuZGxlSW5jb21pbmdNZXNzYWdlKTsKKyAgfQorCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBzb2NrZXQuaXNPcGVuOworCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIF9yZXNldChpc09wZW46IHRydWUpOworICAgIHJldHVybiBzb2NrZXQub3BlbigpOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIF9yZXNldChpc09wZW46IGZhbHNlKTsKKyAgICByZXR1cm4gc29ja2V0LmNsb3NlKCk7CisgIH0KKworICAvLy8gTWFrZSBhbiBpbmNvbWluZyBtZXNzYWdlIGF2YWlsYWJsZSB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydC4KKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIF9zZXRSZWFkQnVmZmVyKG1lc3NhZ2VCeXRlcyk7CisgIH0KK30KKworLy8vIFtUQ2xpZW50U29ja2V0VHJhbnNwb3J0XSBpcyBhIGJhc2ljIGNsaWVudCBzb2NrZXQgdHJhbnNwb3J0LiAgSXQgc2VuZHMKKy8vLyBvdXRnb2luZyBtZXNzYWdlcyBhbmQgZXhwZWN0cyBhIHJlc3BvbnNlLgorLy8vCisvLy8gTk9URTogVGhpcyB0cmFuc3BvcnQgZXhwZWN0cyBhIHNpbmdsZSB0aHJlYWRlZCBzZXJ2ZXIsIGFzIGl0IHdpbGwgcHJvY2VzcworLy8vIHJlc3BvbnNlcyBpbiBGSUZPIG9yZGVyLgorY2xhc3MgVENsaWVudFNvY2tldFRyYW5zcG9ydCBleHRlbmRzIFRTb2NrZXRUcmFuc3BvcnQgeworICBmaW5hbCBMaXN0PENvbXBsZXRlcjxVaW50OExpc3Q+PiBfY29tcGxldGVycyA9IFtdOworCisgIFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoVFNvY2tldCBzb2NrZXQpIDogc3VwZXIoc29ja2V0KTsKKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgVWludDhMaXN0IGJ5dGVzID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisKKyAgICAvLyBVc2UgYSBzeW5jIGNvbXBsZXRlciB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGNhbiBiZSByZWFkIGltbWVkaWF0ZWx5CisgICAgLy8gYWZ0ZXIgdGhlIHJlYWQgYnVmZmVyIGlzIHNldCwgYW5kIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgYW5vdGhlcgorICAgIC8vIHJlc3BvbnNlIGNvdWxkIG92ZXJ3cml0ZSB0aGUgcmVhZCBidWZmZXIuCisgICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8VWludDhMaXN0Pi5zeW5jKCk7CisgICAgX2NvbXBsZXRlcnMuYWRkKGNvbXBsZXRlcik7CisKKyAgICBpZiAoYnl0ZXMubGVuZ3RoSW5CeXRlcyA+IDApIHsKKyAgICAgIHNvY2tldC5zZW5kKGJ5dGVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKKyAgfQorCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBzdXBlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKworICAgIGlmIChfY29tcGxldGVycy5pc05vdEVtcHR5KSB7CisgICAgICB2YXIgY29tcGxldGVyID0gX2NvbXBsZXRlcnMucmVtb3ZlQXQoMCk7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUoKTsKKyAgICB9CisgIH0KK30KKworLy8vIFtUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnRdIHNlbmRzIG91dGdvaW5nIG1lc3NhZ2VzIGFuZCBleHBlY3RzIGFuCisvLy8gYXN5bmNocm9ub3VzIHJlc3BvbnNlLgorLy8vCisvLy8gTk9URTogVGhpcyB0cmFuc3BvcnQgdXNlcyBhIFtNZXNzYWdlUmVhZGVyXSB0byByZWFkIGEgW1RNZXNzYWdlXSB3aGVuIGFuCisvLy8gaW5jb21pbmcgbWVzc2FnZSBhcnJpdmVzIHRvIGNvcnJlbGF0ZSBhIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCwgdXNpbmcgdGhlCisvLy8gc2VxaWQuCitjbGFzcyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUU29ja2V0VHJhbnNwb3J0IHsKKyAgc3RhdGljIGNvbnN0IGRlZmF1bHRUaW1lb3V0ID0gY29uc3QgRHVyYXRpb24oc2Vjb25kczogMzApOworCisgIGZpbmFsIE1hcDxpbnQsIENvbXBsZXRlcjxVaW50OExpc3Q+PiBfY29tcGxldGVycyA9IHt9OworCisgIGZpbmFsIFRNZXNzYWdlUmVhZGVyIG1lc3NhZ2VSZWFkZXI7CisKKyAgZmluYWwgRHVyYXRpb24gcmVzcG9uc2VUaW1lb3V0OworCisgIFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydChUU29ja2V0IHNvY2tldCwgVE1lc3NhZ2VSZWFkZXIgbWVzc2FnZVJlYWRlciwKKyAgICAgIHtEdXJhdGlvbiByZXNwb25zZVRpbWVvdXQ6IGRlZmF1bHRUaW1lb3V0fSkKKyAgICAgIDogdGhpcy5tZXNzYWdlUmVhZGVyID0gbWVzc2FnZVJlYWRlciwKKyAgICAgICAgdGhpcy5yZXNwb25zZVRpbWVvdXQgPSByZXNwb25zZVRpbWVvdXQsCisgICAgICAgIHN1cGVyKHNvY2tldCk7CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIFVpbnQ4TGlzdCBieXRlcyA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlUmVhZGVyLnJlYWRNZXNzYWdlKGJ5dGVzKTsKKyAgICBpbnQgc2VxaWQgPSBtZXNzYWdlLnNlcWlkOworCisgICAgLy8gVXNlIGEgc3luYyBjb21wbGV0ZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gYmUgcmVhZCBpbW1lZGlhdGVseQorICAgIC8vIGFmdGVyIHRoZSByZWFkIGJ1ZmZlciBpcyBzZXQsIGFuZCBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGFub3RoZXIKKyAgICAvLyByZXNwb25zZSBjb3VsZCBvdmVyd3JpdGUgdGhlIHJlYWQgYnVmZmVyLgorICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFVpbnQ4TGlzdD4uc3luYygpOworICAgIF9jb21wbGV0ZXJzW3NlcWlkXSA9IGNvbXBsZXRlcjsKKworICAgIGlmIChyZXNwb25zZVRpbWVvdXQgIT0gbnVsbCkgeworICAgICAgbmV3IEZ1dHVyZS5kZWxheWVkKHJlc3BvbnNlVGltZW91dCwgKCkgeworICAgICAgICB2YXIgY29tcGxldGVyID0gX2NvbXBsZXRlcnMucmVtb3ZlKHNlcWlkKTsKKyAgICAgICAgaWYgKGNvbXBsZXRlciAhPSBudWxsKSB7CisgICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoCisgICAgICAgICAgICAgIG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJSZXNwb25zZSB0aW1lZCBvdXQuIiwgcmVzcG9uc2VUaW1lb3V0KSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKworICAgIHNvY2tldC5zZW5kKGJ5dGVzKTsKKworICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOworICB9CisKKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIHN1cGVyLmhhbmRsZUluY29taW5nTWVzc2FnZShtZXNzYWdlQnl0ZXMpOworCisgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VSZWFkZXIucmVhZE1lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKyAgICB2YXIgY29tcGxldGVyID0gX2NvbXBsZXRlcnMucmVtb3ZlKG1lc3NhZ2Uuc2VxaWQpOworICAgIGlmIChjb21wbGV0ZXIgIT0gbnVsbCkgeworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKCk7CisgICAgfQorICB9Cit9CisKKy8vLyBbVFNlcnZlclNvY2tldFRyYW5zcG9ydF0gbGlzdGVucyBmb3IgaW5jb21pbmcgbWVzc2FnZXMuICBXaGVuIGl0IHNlbmRzIGEKKy8vLyByZXNwb25zZSwgaXQgZG9lcyBub3QgZXhwZWN0IGFuIGFja25vd2xlZGdlbWVudC4KK2NsYXNzIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUU29ja2V0VHJhbnNwb3J0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlciBfb25JbmNvbWluZ01lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW0gZ2V0IG9uSW5jb21pbmdNZXNzYWdlID0+IF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoVFNvY2tldCBzb2NrZXQpCisgICAgICA6IF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgc3VwZXIoc29ja2V0KTsKKworICBGdXR1cmUgZmx1c2goKSBhc3luYyB7CisgICAgVWludDhMaXN0IG1lc3NhZ2UgPSBjb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgICBzb2NrZXQuc2VuZChtZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBzdXBlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKworICAgIF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXIuYWRkKG51bGwpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNkNWViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDcwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgeworICAvLy8gUXVlcmllcyB3aGV0aGVyIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgLy8vIFJldHVybnMgW3RydWVdIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgYm9vbCBnZXQgaXNPcGVuOworCisgIC8vLyBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlIHRyYW5zcG9ydCBjb3VsZCBub3QgYmUgb3BlbmVkLgorICBGdXR1cmUgb3BlbigpOworCisgIC8vLyBDbG9zZXMgdGhlIHRyYW5zcG9ydC4KKyAgRnV0dXJlIGNsb3NlKCk7CisKKyAgLy8vIFJlYWRzIHVwIHRvIFtsZW5ndGhdIGJ5dGVzIGludG8gW2J1ZmZlcl0sIHN0YXJ0aW5nIGF0IFtvZmZzZXRdLgorICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAvLy8gR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBbbGVuZ3RoXSBieXRlcyBhcmUgYWN0dWFsbHkgcmVhZCBvZmYgdGhlIHRyYW5zcG9ydC4KKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvCisgIC8vLyBbbGVuZ3RoXS4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgIGludCByZWFkQWxsKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpbnQgZ290ID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB3aGlsZSAoZ290IDwgbGVuZ3RoKSB7CisgICAgICByZXQgPSByZWFkKGJ1ZmZlciwgb2Zmc2V0ICsgZ290LCBsZW5ndGggLSBnb3QpOworICAgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sCisgICAgICAgICAgICAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIFRyaWVkIHRvIHJlYWQgJGxlbmd0aCAiCisgICAgICAgICAgICAiYnl0ZXMsIGJ1dCBvbmx5IGdvdCAkZ290IGJ5dGVzLiIpOworICAgICAgfQorICAgICAgZ290ICs9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGdvdDsKKyAgfQorCisgIC8vLyBXcml0ZXMgdXAgdG8gW2xlbl0gYnl0ZXMgZnJvbSB0aGUgYnVmZmVyLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIGRhdGEKKyAgdm9pZCB3cml0ZShVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAvLy8gV3JpdGVzIHRoZSBbYnl0ZXNdIHRvIHRoZSBvdXRwdXQuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICB2b2lkIHdyaXRlQWxsKFVpbnQ4TGlzdCBidWZmZXIpIHsKKyAgICB3cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOworICB9CisKKyAgLy8vIEZsdXNoIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgdHJhbnNwb3J0IGJ1ZmZlci4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBvdXQgZGF0YS4KKyAgRnV0dXJlIGZsdXNoKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzUwOGUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZXJyb3IuZGFydApAQCAtMCwwICsxLDMxIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRUcmFuc3BvcnRFcnJvclR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAwOworICBzdGF0aWMgY29uc3QgaW50IE5PVF9PUEVOID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBBTFJFQURZX09QRU4gPSAyOworICBzdGF0aWMgY29uc3QgaW50IFRJTUVEX09VVCA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgRU5EX09GX0ZJTEUgPSA0OworfQorCitjbGFzcyBUVHJhbnNwb3J0RXJyb3IgZXh0ZW5kcyBURXJyb3IgeworICBUVHJhbnNwb3J0RXJyb3IoW2ludCB0eXBlID0gVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCBTdHJpbmcgbWVzc2FnZSA9ICIiXSkKKyAgICAgIDogc3VwZXIodHlwZSwgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMDQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2ZhY3RvcnkuZGFydApAQCAtMCwwICsxLDI3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgYSBbVFRyYW5zcG9ydF0uIFRoaXMgaXMKKy8vLyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgIEZ1dHVyZTxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpID0+CisgICAgICBuZXcgRnV0dXJlLnZhbHVlKHRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvdGhyaWZ0LmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5YmIwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi90aHJpZnQuZGFydApAQCAtMCwwICsxLDY0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQ7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWMsIEJBU0U2NDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IEJ5dGVEYXRhOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgRW5kaWFubmVzczsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOmZpeG51bS9maXhudW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgQ2xpZW50OworaW1wb3J0ICdwYWNrYWdlOmxvZ2dpbmcvbG9nZ2luZy5kYXJ0JzsKKworcGFydCAnc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvdF9iYXNlLmRhcnQnOworcGFydCAnc3JjL3RfZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvdF9wcm9jZXNzb3IuZGFydCc7CisKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2pzb25fcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0JzsKKworcGFydCAnc3JjL3NlcmlhbGl6ZXIvdF9kZXNlcmlhbGl6ZXIuZGFydCc7CitwYXJ0ICdzcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydCc7CisKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQnOwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdF9icm93c2VyLmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0X2Jyb3dzZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJjMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdF9icm93c2VyLmRhcnQKQEAgLTAsMCArMSwyMiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0X2Jyb3dzZXI7CisKKy8vLyBDbGFzc2VzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXIgYXBwbGljYXRpb25zIGdvIGhlcmUKKworZXhwb3J0ICdzcmMvYnJvd3Nlci90X3dlYl9zb2NrZXQuZGFydCcgc2hvdyBUV2ViU29ja2V0OwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdF9jb25zb2xlLmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0X2NvbnNvbGUuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGE4M2QxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdF9jb25zb2xlLmRhcnQKQEAgLTAsMCArMSwyMyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0X2NvbnNvbGU7CisKKy8vLyBDbGFzc2VzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGNvbnNvbGUgYXBwbGljYXRpb25zIGdvIGhlcmUKKworZXhwb3J0ICdzcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydCcgc2hvdyBUVGNwU29ja2V0OworZXhwb3J0ICdzcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydCcgc2hvdyBUV2ViU29ja2V0OwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvcHVic3BlYy55YW1sIGIvbGliL2RhcnQvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzRhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSw0MyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0aHJpZnQKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogPgorICBBIERhcnQgbGlicmFyeSBmb3IgQXBhY2hlIFRocmlmdAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK2RvY3VtZW50YXRpb246IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGZpeG51bTogXjAuMTAuMgorICBodHRwOiBeMC4xMS4zCisgIGxvZ2dpbmc6IF4wLjExLjAKKworZGV2X2RlcGVuZGVuY2llczoKKyAgIyB0ZXN0CisgIG1vY2tpdG86IF4xLjAuMAorICB0ZXN0OiBeMC4xMi4wCisKKyAgIyBkYXJ0X2RldiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9Xb3JraXZhL2RhcnRfZGV2CisgIGRhcnRfZGV2OiBeMS41LjAKKyAgY292ZXJhZ2U6IF4wLjcuMworICBkYXJ0X3N0eWxlOiAiPj0wLjIuNCA8MC4zLjAiCisgIGRhcnRkb2M6IF4wLjkuMApkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC9wcm90b2NvbC90X3Byb3RvY29sX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvcHJvdG9jb2wvdF9wcm90b2NvbF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2Y2RlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvcHJvdG9jb2wvdF9wcm90b2NvbF90ZXN0LmRhcnQKQEAgLTAsMCArMSw0MDYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfanNvbl9wcm90b2NvbF90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgVVRGODsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGZpbmFsIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ215IG1lc3NhZ2UnLCBUTWVzc2FnZVR5cGUuT05FV0FZLCAxMjMpOworCisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBQcmltaXRpdmUgZ2V0UHJpbWl0aXZlKGludCB0VHlwZSkgeworICAgIHN3aXRjaCAodFR5cGUpIHsKKyAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEJvb2wsIHByb3RvY29sLndyaXRlQm9vbCwgZmFsc2UpOworCisgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHByb3RvY29sLnJlYWRCeXRlLCBwcm90b2NvbC53cml0ZUJ5dGUsIDApOworCisgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEkxNiwgcHJvdG9jb2wud3JpdGVJMTYsIDApOworCisgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEkzMiwgcHJvdG9jb2wud3JpdGVJMzIsIDApOworCisgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEk2NCwgcHJvdG9jb2wud3JpdGVJNjQsIDApOworCisgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZERvdWJsZSwgcHJvdG9jb2wud3JpdGVEb3VibGUsIDApOworCisgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZFN0cmluZywgcHJvdG9jb2wud3JpdGVTdHJpbmcsICcnKTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIFRUeXBlICR0VHlwZSIpOworICAgIH0KKyAgfQorCisgIEZ1dHVyZSBwcmltaXRpdmVUZXN0KFByaW1pdGl2ZSBwcmltaXRpdmUsIGlucHV0KSBhc3luYyB7CisgICAgcHJpbWl0aXZlLndyaXRlKGlucHV0KTsKKyAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIHZhciBvdXRwdXQgPSBwcmltaXRpdmUucmVhZCgpOworCisgICAgZXhwZWN0KG91dHB1dCwgaW5wdXQpOworICB9CisKKyAgRnV0dXJlIHByaW1pdGl2ZU51bGxUZXN0KFByaW1pdGl2ZSBwcmltaXRpdmUpIGFzeW5jIHsKKyAgICBwcmltaXRpdmUud3JpdGUobnVsbCk7CisgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICB2YXIgb3V0cHV0ID0gcHJpbWl0aXZlLnJlYWQoKTsKKworICAgIGV4cGVjdChvdXRwdXQsIHByaW1pdGl2ZS5kZWZhdWx0VmFsdWUpOworICB9CisKKyAgdmFyIHNoYXJlZFRlc3RzID0gKCkgeworICAgIHRlc3QoJ1Rlc3QgbWVzc2FnZScsICgpIGFzeW5jIHsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgdmFyIHN1YmplY3QgPSBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisKKyAgICAgIGV4cGVjdChzdWJqZWN0Lm5hbWUsIG1lc3NhZ2UubmFtZSk7CisgICAgICBleHBlY3Qoc3ViamVjdC50eXBlLCBtZXNzYWdlLnR5cGUpOworICAgICAgZXhwZWN0KHN1YmplY3Quc2VxaWQsIG1lc3NhZ2Uuc2VxaWQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzdHJ1Y3QnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVFN0cnVjdCgpOworCisgICAgICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgLy8gbmFtZSBpcyBub3Qgc2VyaWFsaXplZCwgc2VlIEMjIHZlcnNpb24gZm9yIHJlZmVyZW5jZQorICAgICAgZXhwZWN0KG91dHB1dCwgaXNOb3ROdWxsKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgZmllbGQnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVEZpZWxkKCdteSBmaWVsZCcsIFRUeXBlLk1BUCwgMTIzKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlRmllbGRFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCk7CisKKyAgICAgIC8vIG5hbWUgaXMgbm90IHNlcmlhbGl6ZWQsIHNlZSBDIyB2ZXJzaW9uIGZvciByZWZlcmVuY2UKKyAgICAgIGV4cGVjdChvdXRwdXQudHlwZSwgaW5wdXQudHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0LmlkLCBpbnB1dC5pZCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IG1hcCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUTWFwKFRUeXBlLlNUUklORywgVFR5cGUuU1RSVUNULCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkTWFwQmVnaW4oKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5rZXlUeXBlLCBpbnB1dC5rZXlUeXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQudmFsdWVUeXBlLCBpbnB1dC52YWx1ZVR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGxpc3QnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVExpc3QoVFR5cGUuU1RSSU5HLCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZUxpc3RCZWdpbihpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRMaXN0QmVnaW4oKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5lbGVtZW50VHlwZSwgaW5wdXQuZWxlbWVudFR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHNldCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUU2V0KFRUeXBlLlNUUklORywgMTIzKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVTZXRCZWdpbihpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZVNldEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworCisgICAgICBleHBlY3Qob3V0cHV0LmVsZW1lbnRUeXBlLCBpbnB1dC5lbGVtZW50VHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYm9vbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJPT0wpLCB0cnVlKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYm9vbCBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJPT0wpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYnl0ZScsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJZVEUpLCA2NCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGJ5dGUgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5CWVRFKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkxNicsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkxNiksIDMyNzY3KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTE2IG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTE2KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkzMicsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkzMiksIDIxNDc0ODM2NDcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJMzIgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JMzIpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTY0JywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTY0KSwgOTIyMzM3MjAzNjg1NDc3NTgwNyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEk2NCBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkk2NCkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBkb3VibGUnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5ET1VCTEUpLCAzLjE0MTU5MjYpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBkb3VibGUgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5ET1VCTEUpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc3RyaW5nJywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gJ1RoZXJlIGFyZSBvbmx5IHR3byBoYXJkIHRoaW5ncyBpbiBjb21wdXRlciBzY2llbmNlOiAnCisgICAgICAgICAgJ2NhY2hlIGludmFsaWRhdGlvbiwgbmFtaW5nIHRoaW5ncywgYW5kIG9mZi1ieS1vbmUgZXJyb3JzLic7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5TVFJJTkcpLCBpbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHN0cmluZyBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLlNUUklORykpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBiaW5hcnknLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KG5ldyBMaXN0LmZpbGxlZCgxMDAsIDEyMykpOworCisgICAgICBwcm90b2NvbC53cml0ZUJpbmFyeShpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkQmluYXJ5KCk7CisKKyAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoLCBpbnB1dC5sZW5ndGgpOworICAgICAgZXhwZWN0KG91dHB1dC5ldmVyeSgoaSkgPT4gaSA9PSAxMjMpLCBpc1RydWUpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBjb21wbGV4IHN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICAgIC8vIHsxOiB7MTA6IDIwfSwgMjogezMwOiA0MH19CisgICAgICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5ldyBUU3RydWN0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5ldyBURmllbGQoJ3N1Y2Nlc3MnLCBUVHlwZS5NQVAsIDApKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5NQVAsIDIpKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMSk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMTApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDMwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMig0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHByb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCkudHlwZSwgVFR5cGUuTUFQKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDIpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAxKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMzApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworICAgICAgcHJvdG9jb2wucmVhZEZpZWxkRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBuZXN0ZWQgbWFwcyBhbmQgbGlzdHMnLCAoKSBhc3luYyB7CisgICAgICAvLyB7MTogW3sxMDogMjB9XSwgMjogW3szMDogNDB9XX0KKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5MSVNULCAyKSk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDEpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdChUVHlwZS5NQVAsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDEwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMigyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdChUVHlwZS5NQVAsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDMwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMig0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDIpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAxKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZExpc3RCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTGlzdEVuZCgpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZExpc3RCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDMwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCA0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTGlzdEVuZCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0pOworICB9OworCisgIGdyb3VwKCdKU09OJywgKCkgeworICAgIHNldFVwKCgpIHsKKyAgICAgIHByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBlc2NhcGVkIHVuaWNvZGUnLCAoKSBhc3luYyB7CisgICAgICAvKgorICAgICAgICAgS09SX0tBSQorICAgICAgICAgICBVVEYtODogIDB4RTAgMHhCOCAweDgxCisgICAgICAgICAgIFVURi0xNjogMHgwRTAxCisgICAgICAgICBHIGNsZWY6CisgICAgICAgICAgIFVURi04OiAgMHhGMCAweDlEIDB4ODQgMHg5RQorICAgICAgICAgICBVVEYtMTY6IDB4RDgzNCAweEREMUUKKyAgICAgICAqLworICAgICAgdmFyIGJ1ZmZlciA9IFVURjguZW5jb2RlKHInIlx1MDAwMVx1MGUwMSBcdWQ4MzRcdWRkMWUiJyk7CisgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKGJ1ZmZlcik7CisKKyAgICAgIHZhciBwcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICB2YXIgc3ViamVjdCA9IHByb3RvY29sLnJlYWRTdHJpbmcoKTsKKyAgICAgIGV4cGVjdChzdWJqZWN0LAorICAgICAgICAgIFVURjguZGVjb2RlKFsweDAxLCAweEUwLCAweEI4LCAweDgxLCAweDIwLCAweEYwLCAweDlELCAweDg0LCAweDlFXSkpOworICAgIH0pOworCisgICAgZ3JvdXAoJ3NoYXJlZCB0ZXN0cycsIHNoYXJlZFRlc3RzKTsKKyAgfSk7CisKKyAgZ3JvdXAoJ2JpbmFyeScsICgpIHsKKyAgICBzZXRVcCgoKSB7CisgICAgICBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgIH0pOworCisgICAgZ3JvdXAoJ3NoYXJlZCB0ZXN0cycsIHNoYXJlZFRlc3RzKTsKKyAgfSk7CisKKyAgZ3JvdXAoJ2NvbXBhY3QnLCAoKSB7CisgICAgc2V0VXAoKCkgeworICAgICAgcHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgICAgfSk7CisKKyAgICBncm91cCgnc2hhcmVkIHRlc3RzJywgc2hhcmVkVGVzdHMpOworICB9KTsKK30KKworY2xhc3MgUHJpbWl0aXZlIHsKKyAgZmluYWwgRnVuY3Rpb24gcmVhZDsKKyAgZmluYWwgRnVuY3Rpb24gd3JpdGU7CisgIGZpbmFsIGRlZmF1bHRWYWx1ZTsKKworICBQcmltaXRpdmUodGhpcy5yZWFkLCB0aGlzLndyaXRlLCB0aGlzLmRlZmF1bHRWYWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NjUwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3QuZGFydApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitsaWJyYXJ5IHRocmlmdC50ZXN0LnNlcmlhbGl6ZXIuc2VyaWFsaXplcl90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIHZhciBzZXJpYWxpemVyID0gKCkgeworICAgIFREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyOworICAgIFRTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CisgICAgVGVzdFRPYmplY3QgdGVzdFRPYmplY3Q7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBzZXJpYWxpemVyID0gbmV3IFRTZXJpYWxpemVyKCk7CisgICAgICBkZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcigpOworICAgICAgCisgICAgICB0ZXN0VE9iamVjdCA9IG5ldyBUZXN0VE9iamVjdCgpOworICAgICAgdGVzdFRPYmplY3QuYiA9IHRydWU7CisgICAgICB0ZXN0VE9iamVjdC5zID0gIlRFU1QiOworICAgICAgdGVzdFRPYmplY3QuZCA9IDE1LjI1OworICAgICAgdGVzdFRPYmplY3QuaSA9IDEwOworICAgICAgCisgICAgICB2YXIgdGVzdExpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CisgICAgICB0ZXN0TGlzdC5hZGQoIlRFU1QgMSIpOworICAgICAgdGVzdExpc3QuYWRkKCJURVNUIDIiKTsKKyAgICAgIAorICAgICAgdGVzdFRPYmplY3QubCA9IHRlc3RMaXN0OworICAgIH0pOworICAgIAorICAgIGFzc2VydE5ld09iamVjdEVxdWFsc1RPYmplY3QoVGVzdFRPYmplY3QgbmV3T2JqZWN0KSB7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmwsIGVxdWFscyh0ZXN0VE9iamVjdC5sKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmIsIGVxdWFscyh0ZXN0VE9iamVjdC5iKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmksIGVxdWFscyh0ZXN0VE9iamVjdC5pKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmQsIGVxdWFscyh0ZXN0VE9iamVjdC5kKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LnMsIGVxdWFscyh0ZXN0VE9iamVjdC5zKSk7CisgICAgfQorICAgIAorICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpIHsKKyAgICAgIHZhciBzID0gc2VyaWFsaXplci53cml0ZVN0cmluZyh0ZXN0VE9iamVjdCk7CisKKyAgICAgIHZhciBuZXdPYmplY3QgPSBuZXcgVGVzdFRPYmplY3QoKTsKKyAgICAgIGRlc2VyaWFsaXplci5yZWFkU3RyaW5nKG5ld09iamVjdCwgcyk7CisKKyAgICAgIGFzc2VydE5ld09iamVjdEVxdWFsc1RPYmplY3QobmV3T2JqZWN0KTsKKyAgICB9OworCisgICAgcnVuV3JpdGVUZXN0KCkgeworICAgICAgdmFyIHMgPSBzZXJpYWxpemVyLndyaXRlKHRlc3RUT2JqZWN0KTsKKworICAgICAgdmFyIG5ld09iamVjdCA9IG5ldyBUZXN0VE9iamVjdCgpOworICAgICAgZGVzZXJpYWxpemVyLnJlYWQobmV3T2JqZWN0LCBzKTsKKworICAgICAgYXNzZXJ0TmV3T2JqZWN0RXF1YWxzVE9iamVjdChuZXdPYmplY3QpOworICAgIH07CisKKyAgICB0ZXN0KCdKU09OIFByb3RvY29sIFN0cmluZycsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIAorICAgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdKU09OIFByb3RvY29sJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVRlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0JpbmFyeSBQcm90b2NvbCBTdHJpbmcnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVN0cmluZ1Rlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0JpbmFyeSBQcm90b2NvbCcsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQ29tcGFjdCBQcm90b2NvbCBTdHJpbmcnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQ29tcGFjdCBQcm90b2NvbCcsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVUZXN0KCk7CisgICAgfSk7CisgIH07CisKKyAgZ3JvdXAoJ1NlcmlhbGl6ZXInLCBzZXJpYWxpemVyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3RfZGF0YS5kYXJ0IGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4NmYwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3RfZGF0YS5kYXJ0CkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3Quc2VyaWFsaXplci5zZXJpYWxpemVyX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gVGVzdFRPYmplY3QgaXMgYSBzaW1wbGUgdGVzdCBzdHJ1Y3QKK2NsYXNzIFRlc3RUT2JqZWN0IGltcGxlbWVudHMgVEJhc2UgeworICBzdGF0aWMgZmluYWwgVFN0cnVjdCBfU1RSVUNUX0RFU0MgPSBuZXcgVFN0cnVjdCgiVGVzdFRPYmplY3QiKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfSV9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgiaSIsIFRUeXBlLkkzMiwgMSk7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX0RfRklFTERfREVTQyA9IG5ldyBURmllbGQoImQiLCBUVHlwZS5ET1VCTEUsIDIpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9TX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJzIiwgVFR5cGUuU1RSSU5HLCAzKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfTF9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgibCIsIFRUeXBlLkxJU1QsIDQpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9CX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJiIiwgVFR5cGUuQk9PTCwgNSk7CisKKyAgaW50IF9pOworICBzdGF0aWMgY29uc3QgaW50IEkgPSAxOworICBkb3VibGUgX2Q7CisgIHN0YXRpYyBjb25zdCBpbnQgRCA9IDI7CisgIFN0cmluZyBfczsKKyAgc3RhdGljIGNvbnN0IGludCBTID0gMzsKKyAgTGlzdDxTdHJpbmc+IF9sOworICBzdGF0aWMgY29uc3QgaW50IEwgPSA0OworICBib29sIF9iOworICBzdGF0aWMgY29uc3QgaW50IEIgPSA1OworCisgIGJvb2wgX19pc3NldF9pID0gZmFsc2U7CisgIGJvb2wgX19pc3NldF9kID0gZmFsc2U7CisgIGJvb2wgX19pc3NldF9iID0gZmFsc2U7CisKKyAgVGVzdFRPYmplY3QoKSB7CisgIH0KKworICAvLyBpCisgIGludCBnZXQgaSA9PiB0aGlzLl9pOworCisgIHNldCBpKGludCBpKSB7CisgICAgdGhpcy5faSA9IGk7CisgICAgdGhpcy5fX2lzc2V0X2kgPSB0cnVlOworICB9CisKKyAgYm9vbCBpc1NldEkoKSA9PiB0aGlzLl9faXNzZXRfaTsKKworICB1bnNldEkoKSB7CisgICAgdGhpcy5fX2lzc2V0X2kgPSBmYWxzZTsKKyAgfQorCisgIC8vIGQKKyAgZG91YmxlIGdldCBkID0+IHRoaXMuX2Q7CisKKyAgc2V0IGQoZG91YmxlIGQpIHsKKyAgICB0aGlzLl9kID0gZDsKKyAgICB0aGlzLl9faXNzZXRfZCA9IHRydWU7CisgIH0KKworICBib29sIGlzU2V0RCgpID0+IHRoaXMuX19pc3NldF9kOworCisgIHVuc2V0RCgpIHsKKyAgICB0aGlzLl9faXNzZXRfZCA9IGZhbHNlOworICB9CisKKyAgLy8gcworICBTdHJpbmcgZ2V0IHMgPT4gdGhpcy5fczsKKworICBzZXQgcyhTdHJpbmcgcykgeworICAgIHRoaXMuX3MgPSBzOworICB9CisKKyAgYm9vbCBpc1NldFMoKSA9PiB0aGlzLnMgIT0gbnVsbDsKKworICB1bnNldFMoKSB7CisgICAgdGhpcy5zID0gbnVsbDsKKyAgfQorCisgIC8vIGwKKyAgTGlzdDxTdHJpbmc+IGdldCBsID0+IHRoaXMuX2w7CisKKyAgc2V0IGwoTGlzdDxTdHJpbmc+IGwpIHsKKyAgICB0aGlzLl9sID0gbDsKKyAgfQorCisgIGJvb2wgaXNTZXRMKCkgPT4gdGhpcy5sICE9IG51bGw7CisKKyAgdW5zZXRMKCkgeworICAgIHRoaXMubCA9IG51bGw7CisgIH0KKworICAvLyBiCisgIGJvb2wgZ2V0IGIgPT4gdGhpcy5fYjsKKworICBzZXQgYihib29sIGIpIHsKKyAgICB0aGlzLl9iID0gYjsKKyAgICB0aGlzLl9faXNzZXRfYiA9IHRydWU7CisgIH0KKworICBib29sIGlzU2V0QigpID0+IHRoaXMuX19pc3NldF9iOworCisgIHVuc2V0QigpIHsKKyAgICB0aGlzLl9faXNzZXRfYiA9IGZhbHNlOworICB9CisKKyAgZ2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCkgeworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgICAgY2FzZSBJOgorICAgICAgICByZXR1cm4gdGhpcy5pOworICAgICAgY2FzZSBEOgorICAgICAgICByZXR1cm4gdGhpcy5kOworICAgICAgY2FzZSBTOgorICAgICAgICByZXR1cm4gdGhpcy5zOworICAgICAgY2FzZSBMOgorICAgICAgICByZXR1cm4gdGhpcy5sOworICAgICAgY2FzZSBCOgorICAgICAgICByZXR1cm4gdGhpcy5iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgfQorICB9CisKKyAgc2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZElEKSB7CisgICAgICBjYXNlIEk6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRJKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5pID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmQgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0UygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMucyA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEw6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRMKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5sID0gdmFsdWUgYXMgTGlzdDxTdHJpbmc+OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEI6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRCKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5iID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0ISIpOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlCisgIGJvb2wgaXNTZXQoaW50IGZpZWxkSUQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKKyAgICAgIGNhc2UgSToKKyAgICAgICAgcmV0dXJuIGlzU2V0SSgpOworICAgICAgY2FzZSBEOgorICAgICAgICByZXR1cm4gaXNTZXREKCk7CisgICAgICBjYXNlIFM6CisgICAgICAgIHJldHVybiBpc1NldFMoKTsKKyAgICAgIGNhc2UgTDoKKyAgICAgICAgcmV0dXJuIGlzU2V0TCgpOworICAgICAgY2FzZSBCOgorICAgICAgICByZXR1cm4gaXNTZXRCKCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCEiKTsKKyAgICB9CisgIH0KKworICByZWFkKFRQcm90b2NvbCBpcHJvdCkgeworICAgIFRGaWVsZCBmaWVsZDsKKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoZmllbGQuaWQpIHsKKyAgICAgICAgY2FzZSBJOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdGhpcy5pID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgdGhpcy5fX2lzc2V0X2kgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgdGhpcy5kID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgdGhpcy5fX2lzc2V0X2QgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgdGhpcy5zID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkxJU1QpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVExpc3QgX2xpc3Q3NCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgdGhpcy5sID0gbmV3IExpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICBmb3IgKGludCBfaTc1ID0gMDsgX2k3NSA8IF9saXN0NzQubGVuZ3RoOyArK19pNzUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2VsZW03NjsKKyAgICAgICAgICAgICAgICBfZWxlbTc2ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIHRoaXMubC5hZGQoX2VsZW03Nik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQjoKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKSB7CisgICAgICAgICAgICB0aGlzLmIgPSBpcHJvdC5yZWFkQm9vbCgpOworICAgICAgICAgICAgdGhpcy5fX2lzc2V0X2IgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlIGNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZAorICAgIHZhbGlkYXRlKCk7CisgIH0KKworICB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHsKKyAgICB2YWxpZGF0ZSgpOworCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfU1RSVUNUX0RFU0MpOworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfSV9GSUVMRF9ERVNDKTsKKyAgICBvcHJvdC53cml0ZUkzMih0aGlzLmkpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX0RfRklFTERfREVTQyk7CisgICAgb3Byb3Qud3JpdGVEb3VibGUodGhpcy5kKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgaWYgKHRoaXMucyAhPSBudWxsKSB7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX1NfRklFTERfREVTQyk7CisgICAgICBvcHJvdC53cml0ZVN0cmluZyh0aGlzLnMpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKyAgICBpZiAodGhpcy5sICE9IG51bGwpIHsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfTF9GSUVMRF9ERVNDKTsKKyAgICAgIHsKKyAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KFRUeXBlLlNUUklORywgdGhpcy5sLmxlbmd0aCkpOworICAgICAgICBmb3IgKHZhciBlbGVtNzcgaW4gdGhpcy5sKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoZWxlbTc3KTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9CX0ZJRUxEX0RFU0MpOworICAgIG9wcm90LndyaXRlQm9vbCh0aGlzLmIpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgIH0KKworICBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoIlRlc3RUT2JqZWN0KCIpOworCisgICAgcmV0LndyaXRlKCJpOiIpOworICAgIHJldC53cml0ZSh0aGlzLmkpOworCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgiZDoiKTsKKyAgICByZXQud3JpdGUodGhpcy5kKTsKKworICAgIHJldC53cml0ZSgiLCAiKTsKKyAgICByZXQud3JpdGUoInM6Iik7CisgICAgaWYgKHRoaXMucyA9PSBudWxsKSB7CisgICAgICByZXQud3JpdGUoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0LndyaXRlKHRoaXMucyk7CisgICAgfQorCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgibDoiKTsKKyAgICBpZiAodGhpcy5sID09IG51bGwpIHsKKyAgICAgIHJldC53cml0ZSgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICByZXQud3JpdGUodGhpcy5sKTsKKyAgICB9CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJiOiIpOworICAgIHJldC53cml0ZSh0aGlzLmIpOworCisgICAgcmV0LndyaXRlKCIpIik7CisKKyAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7CisgIH0KKworICB2YWxpZGF0ZSgpIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC90X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvdF9hcHBsaWNhdGlvbl9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExZDhkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdF9hcHBsaWNhdGlvbl9lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw0NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgc2V0VXAoKCkgeworICAgIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICB9KTsKKworICB0ZXN0KCdXcml0ZSBhbmQgcmVhZCBhbiBhcHBsaWNhdGlvbiBlcnJvcicsICgpIHsKKyAgICB2YXIgZXhwZWN0ZWRUeXBlID0gVEFwcGxpY2F0aW9uRXJyb3JUeXBlLklOVEVSTkFMX0VSUk9SOworICAgIHZhciBleHBlY3RlZE1lc3NhZ2UgPSAndGVzdCBlcnJvciBtZXNzYWdlJzsKKworICAgIFRBcHBsaWNhdGlvbkVycm9yIGVycm9yID0KKyAgICAgICAgbmV3IFRBcHBsaWNhdGlvbkVycm9yKGV4cGVjdGVkVHlwZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKyAgICBlcnJvci53cml0ZShwcm90b2NvbCk7CisKKyAgICBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgIFRBcHBsaWNhdGlvbkVycm9yIHN1YmplY3QgPSBUQXBwbGljYXRpb25FcnJvci5yZWFkKHByb3RvY29sKTsKKworICAgIGV4cGVjdChzdWJqZWN0LCBpc05vdE51bGwpOworICAgIGV4cGVjdChzdWJqZWN0LnR5cGUsIGV4cGVjdGVkVHlwZSk7CisgICAgZXhwZWN0KHN1YmplY3QubWVzc2FnZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDcyZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDE3NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBncm91cCgnVEZyYW1lZFRyYW5zcG9ydCBwYXJ0aWFsIHJlYWRzJywgKCkgeworICAgIGZpbmFsIGZsdXNoQXdhaXREdXJhdGlvbiA9IG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxMCk7CisKKyAgICBGYWtlUmVhZE9ubHlTb2NrZXQgc29ja2V0OworICAgIFRTb2NrZXRUcmFuc3BvcnQgc29ja2V0VHJhbnNwb3J0OworICAgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgIHZhciBtZXNzYWdlQXZhaWxhYmxlOworCisgICAgc2V0VXAoKCkgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VSZWFkT25seVNvY2tldCgpOworICAgICAgc29ja2V0VHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldFRyYW5zcG9ydCk7CisgICAgICBtZXNzYWdlQXZhaWxhYmxlID0gZmFsc2U7CisgICAgfSk7CisKKyAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKSB7CisgICAgICB2YXIgcmVhZEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoMTI4KTsKKyAgICAgIHZhciByZWFkQnl0ZXMgPSB0cmFuc3BvcnQucmVhZChyZWFkQnVmZmVyLCAwLCByZWFkQnVmZmVyLmxlbmd0aEluQnl0ZXMpOworICAgICAgZXhwZWN0KHJlYWRCeXRlcywgMCk7CisgICAgICBleHBlY3QobWVzc2FnZUF2YWlsYWJsZSwgZmFsc2UpOworICAgIH0KKworICAgIHRlc3QoJ1Rlc3QgdHJhbnNwb3J0IHJlYWRzIG1lc3NhZ2VzIHdoZXJlIGhlYWRlciBhbmQgYm9keSBhcmUgc2VudCBzZXBhcmF0ZWx5JywgKCkgYXN5bmMgeworICAgICAgLy8gYnVmZmVyIGludG8gd2hpY2ggd2UnbGwgcmVhZAorICAgICAgdmFyIHJlYWRCdWZmZXIgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgICAgIHZhciByZWFkQnl0ZXM7CisKKyAgICAgIC8vIHJlZ2lzdGVycyBmb3IgcmVhZGFibGUgYnl0ZXMKKyAgICAgIHZhciBmbHVzaEZ1dHVyZSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRpbWVvdXQoZmx1c2hBd2FpdER1cmF0aW9uKTsKKyAgICAgIGZsdXNoRnV0dXJlLnRoZW4oKF8pIHsKKyAgICAgICAgbWVzc2FnZUF2YWlsYWJsZSA9IHRydWU7CisgICAgICB9KTsKKworICAgICAgLy8gd3JpdGUgaGVhZGVyIGJ5dGVzCisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDZdKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBoZWFkZXIgaGFzIGJlZW4gY29uc3VtZWQgaW50ZXJuYWxseQorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgiSGUiKSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkLAorICAgICAgLy8gYmVjYXVzZSB0aGUgZnJhbWUgaGFzIGJlZW4gY29uc3VtZWQgaW50ZXJuYWxseQorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoImxsbyEiKSkpOworCisgICAgICAvLyBoYXZlIHRvIHdhaXQgZm9yIHRoZSBmbHVzaCB0byBjb21wbGV0ZSwKKyAgICAgIC8vIGJlY2F1c2UgaXQncyBvbmx5IHRoZW4gdGhhdCB0aGUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisgICAgICBhd2FpdCBmbHVzaEZ1dHVyZTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCB0cnVlKTsKKworICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgZnJhbWUgaXMgY29tcGxldGUsIHNvIHdlIGV4cGVjdCB0aGUgcmVhZCB0byBjb21wbGV0ZQorICAgICAgcmVhZEJ5dGVzID0gdHJhbnNwb3J0LnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGhJbkJ5dGVzKTsKKyAgICAgIGV4cGVjdChyZWFkQnl0ZXMsIDYpOworICAgICAgZXhwZWN0KHJlYWRCdWZmZXIuc3VibGlzdCgwLCA2KSwgVVRGOC5lbmNvZGUoIkhlbGxvISIpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgdHJhbnNwb3J0IHJlYWRzIG1lc3NhZ2VzIHdoZXJlIGhlYWRlciBpcyBzZW50IGluIHBpZWNlcyAnCisgICAgICAgICAnYW5kIGJvZHkgaXMgYWxzbyBzZW50IGluIHBpZWNlcycsICgpIGFzeW5jIHsKKyAgICAgIC8vIGJ1ZmZlciBpbnRvIHdoaWNoIHdlJ2xsIHJlYWQKKyAgICAgIHZhciByZWFkQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCgxMCk7CisgICAgICB2YXIgcmVhZEJ5dGVzOworCisgICAgICAvLyByZWdpc3RlcnMgZm9yIHJlYWRhYmxlIGJ5dGVzCisgICAgICB2YXIgZmx1c2hGdXR1cmUgPSB0cmFuc3BvcnQuZmx1c2goKS50aW1lb3V0KGZsdXNoQXdhaXREdXJhdGlvbik7CisgICAgICBmbHVzaEZ1dHVyZS50aGVuKChfKSB7CisgICAgICAgIG1lc3NhZ2VBdmFpbGFibGUgPSB0cnVlOworICAgICAgfSk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IHBhcnQgb2YgaGVhZGVyIGJ5dGVzCisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoWzB4MDAsIDB4MDBdKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQKKyAgICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpOworCisgICAgICAvLyB3cml0ZSBzZWNvbmQgcGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwM10pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZCBhZ2FpbgorICAgICAgLy8gYmVjYXVzZSBvbmx5IHRoZSBoZWFkZXIgd2FzIHJlYWQsIGFuZCB0aGVyZSdzIG5vIGZyYW1lIGJvZHkKKyAgICAgIHJlYWRCeXRlcyA9IGV4cGVjdE5vUmVhZGFibGVCeXRlcygpOworCisgICAgICAvLyB3cml0ZSBmaXJzdCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoIkgiKSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkLAorICAgICAgLy8gYmVjYXVzZSB0aGUgZnJhbWUgaGFzIGJlZW4gY29uc3VtZWQgaW50ZXJuYWxseQorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoImkhIikpKTsKKworICAgICAgLy8gaGF2ZSB0byB3YWl0IGZvciB0aGUgZmx1c2ggdG8gY29tcGxldGUsCisgICAgICAvLyBiZWNhdXNlIGl0J3Mgb25seSB0aGVuIHRoYXQgdGhlIGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcmVhZGluZworICAgICAgYXdhaXQgZmx1c2hGdXR1cmU7CisgICAgICBleHBlY3QobWVzc2FnZUF2YWlsYWJsZSwgdHJ1ZSk7CisKKyAgICAgIC8vIGF0IHRoaXMgcG9pbnQgdGhlIGZyYW1lIGlzIGNvbXBsZXRlLCBzbyB3ZSBleHBlY3QgdGhlIHJlYWQgdG8gY29tcGxldGUKKyAgICAgIHJlYWRCeXRlcyA9IHRyYW5zcG9ydC5yZWFkKHJlYWRCdWZmZXIsIDAsIHJlYWRCdWZmZXIubGVuZ3RoSW5CeXRlcyk7CisgICAgICBleHBlY3QocmVhZEJ5dGVzLCAzKTsKKyAgICAgIGV4cGVjdChyZWFkQnVmZmVyLnN1Ymxpc3QoMCwgMyksIFVURjguZW5jb2RlKCJIaSEiKSk7CisgICAgfSk7CisgIH0pOworfQorCisKKworY2xhc3MgRmFrZVJlYWRPbmx5U29ja2V0IGV4dGVuZHMgVFNvY2tldCB7CisKKyAgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IG1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PihzeW5jOiB0cnVlKTsKKyAgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IGVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4oKTsKKyAgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IHN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4oKTsKKworICBAb3ZlcnJpZGUKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIC8vIG5vb3AKKyAgfQorCisgIEBvdmVycmlkZQorICBib29sIGdldCBpc0Nsb3NlZCA9PiBmYWxzZTsKKworICBAb3ZlcnJpZGUKKyAgYm9vbCBnZXQgaXNPcGVuID0+IHRydWU7CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IGVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gbWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIEBvdmVycmlkZQorICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBzdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIEBvdmVycmlkZQorICBGdXR1cmUgb3BlbigpIHsKKyAgICAvLyBub29wCisgIH0KKworICBAb3ZlcnJpZGUKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgLy8gbm9vcAorICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmM2QwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTY0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X3NvY2tldF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IEVuY29kaW5nOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgVXRmOENvZGVjLCBCQVNFNjQ7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBCYXNlUmVxdWVzdDsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBDbGllbnQ7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgUmVzcG9uc2U7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgU3RyZWFtZWRSZXNwb25zZTsKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBjb25zdCB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBncm91cCgnVEh0dHBDbGllbnRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZUh0dHBDbGllbnQgY2xpZW50OworICAgIFRIdHRwQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIHsKKyAgICAgIGNsaWVudCA9IG5ldyBGYWtlSHR0cENsaWVudChzeW5jOiBmYWxzZSk7CisgICAgICB2YXIgY29uZmlnID0gbmV3IFRIdHRwQ29uZmlnKFVyaS5wYXJzZSgnaHR0cDovL2xvY2FsaG9zdCcpLCB7fSk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQoY2xpZW50LCBjb25maWcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgc2VuZHMgYm9keScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBleHBlY3RlZFRleHQgPSAnbXkgcmVxdWVzdCc7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShleHBlY3RlZFRleHQpKTsKKworICAgICAgZXhwZWN0KGNsaWVudC5wb3N0UmVxdWVzdCwgaXNFbXB0eSk7CisKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBleHBlY3QoY2xpZW50LnBvc3RSZXF1ZXN0LCBpc05vdEVtcHR5KTsKKworICAgICAgdmFyIHJlcXVlc3RUZXh0ID0KKyAgICAgICAgICB1dGY4Q29kZWMuZGVjb2RlKEJBU0U2NC5kZWNvZGUoY2xpZW50LnBvc3RSZXF1ZXN0KSk7CisgICAgICBleHBlY3QocmVxdWVzdFRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHRyYW5zcG9ydCByZWNlaXZlcyByZXNwb25zZScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBleHBlY3RlZFRleHQgPSAnbXkgcmVzcG9uc2UnOworICAgICAgdmFyIGV4cGVjdGVkQnl0ZXMgPSB1dGY4Q29kZWMuZW5jb2RlKGV4cGVjdGVkVGV4dCk7CisgICAgICBjbGllbnQucG9zdFJlc3BvbnNlID0gQkFTRTY0LmVuY29kZShleHBlY3RlZEJ5dGVzKTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ215IHJlcXVlc3QnKSk7CisgICAgICBleHBlY3QodHJhbnNwb3J0Lmhhc1JlYWREYXRhLCBpc0ZhbHNlKTsKKworICAgICAgYXdhaXQgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzVHJ1ZSk7CisKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgZXhwZWN0ZWRCeXRlcy5sZW5ndGgpOworCisgICAgICB2YXIgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCBleHBlY3RlZFRleHQpOworICAgIH0pOworICB9KTsKKworICBncm91cCgnVEh0dHBDbGllbnRUcmFuc3BvcnQgd2l0aCBtdWx0aXBsZSBtZXNzYWdlcycsICgpIHsKKyAgICBGYWtlSHR0cENsaWVudCBjbGllbnQ7CisgICAgVEh0dHBDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgeworICAgICAgY2xpZW50ID0gbmV3IEZha2VIdHRwQ2xpZW50KHN5bmM6IHRydWUpOworICAgICAgdmFyIGNvbmZpZyA9IG5ldyBUSHR0cENvbmZpZyhVcmkucGFyc2UoJ2h0dHA6Ly9sb2NhbGhvc3QnKSwge30pOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KGNsaWVudCwgY29uZmlnKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgcmVhZCBjb3JyZWN0IGJ1ZmZlciBhZnRlciBmbHVzaCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworICAgICAgdmFyIGV4cGVjdGVkVGV4dCA9ICdyZXNwb25zZSAxJzsKKyAgICAgIHZhciBleHBlY3RlZEJ5dGVzID0gdXRmOENvZGVjLmVuY29kZShleHBlY3RlZFRleHQpOworCisgICAgICAvLyBwcmVwYXJlIGEgcmVzcG9uc2UKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKCdyZXF1ZXN0IDEnKSk7CisgICAgICBjbGllbnQucG9zdFJlc3BvbnNlID0gQkFTRTY0LmVuY29kZShleHBlY3RlZEJ5dGVzKTsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCBleHBlY3RlZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gcHJlcGFyZSBhIHNlY29uZCByZXNwb25zZQorICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ3JlcXVlc3QgMicpKTsKKyAgICAgIHZhciByZXNwb25zZTJCeXRlcyA9IHV0ZjhDb2RlYy5lbmNvZGUoJ3Jlc3BvbnNlIDInKTsKKyAgICAgIGNsaWVudC5wb3N0UmVzcG9uc2UgPSBCQVNFNjQuZW5jb2RlKHJlc3BvbnNlMkJ5dGVzKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisgIH0pOworfQorCitjbGFzcyBGYWtlSHR0cENsaWVudCBpbXBsZW1lbnRzIENsaWVudCB7CisgIFN0cmluZyBwb3N0UmVzcG9uc2UgPSAnJzsKKyAgU3RyaW5nIHBvc3RSZXF1ZXN0ID0gJyc7CisKKyAgZmluYWwgYm9vbCBzeW5jOworCisgIEZha2VIdHRwQ2xpZW50KHt0aGlzLnN5bmM6IGZhbHNlfSk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBwb3N0KHVybCwKKyAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGJvZHksIEVuY29kaW5nIGVuY29kaW5nfSkgeworICAgIHBvc3RSZXF1ZXN0ID0gYm9keTsKKyAgICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocG9zdFJlc3BvbnNlLCAyMDApOworCisgICAgaWYgKHN5bmMpIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlLnN5bmMoKCkgPT4gcmVzcG9uc2UpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShyZXNwb25zZSk7CisgICAgfQorICB9CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBoZWFkKHVybCwge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBnZXQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IHB1dCh1cmwsCisgICAgICAgICAge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgYm9keSwgRW5jb2RpbmcgZW5jb2Rpbmd9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxSZXNwb25zZT4gcGF0Y2godXJsLAorICAgICAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGJvZHksIEVuY29kaW5nIGVuY29kaW5nfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IGRlbGV0ZSh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxTdHJpbmc+IHJlYWQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8VWludDhMaXN0PiByZWFkQnl0ZXModXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8U3RyZWFtZWRSZXNwb25zZT4gc2VuZChCYXNlUmVxdWVzdCByZXF1ZXN0KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIHZvaWQgY2xvc2UoKSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjlhYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDMxMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWMsIEJBU0U2NDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOm1vY2tpdG8vbW9ja2l0by5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBjb25zdCB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBmaW5hbCByZXF1ZXN0VGV4dCA9ICdteSB0ZXN0IHJlcXVlc3QnOworICBmaW5hbCByZXF1ZXN0Qnl0ZXMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KHV0ZjhDb2RlYy5lbmNvZGUocmVxdWVzdFRleHQpKTsKKyAgZmluYWwgcmVxdWVzdEJhc2U2NCA9IEJBU0U2NC5lbmNvZGUocmVxdWVzdEJ5dGVzKTsKKworICBmaW5hbCByZXNwb25zZVRleHQgPSAncmVzcG9uc2UgMSc7CisgIGZpbmFsIHJlc3BvbnNlQnl0ZXMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KHV0ZjhDb2RlYy5lbmNvZGUocmVzcG9uc2VUZXh0KSk7CisgIGZpbmFsIHJlc3BvbnNlQmFzZTY0ID0gQkFTRTY0LmVuY29kZShyZXNwb25zZUJ5dGVzKTsKKworICBmaW5hbCBmcmFtZWRSZXNwb25zZUJhc2U2NCA9CisgICAgICBCQVNFNjQuZW5jb2RlKF9nZXRGcmFtZWRSZXNwb25zZShyZXNwb25zZUJ5dGVzKSk7CisKKyAgZ3JvdXAoJ1RDbGllbnRTb2NrZXRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiBmYWxzZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgY2xpZW50IHNlbmRpbmcgZGF0YSBvdmVyIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTnVsbCk7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTm90TnVsbCk7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCByZXF1ZXN0Qnl0ZXMpOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKHJlc3BvbnNlQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgdmFyIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVENsaWVudFNvY2tldFRyYW5zcG9ydCB3aXRoIEZyYW1lZFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IHRydWUpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQobmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KSk7CisgICAgICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlcXVlc3RCeXRlcyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGNsaWVudCBzZW5kaW5nIGRhdGEgb3ZlciBmcmFtZWQgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgU3RyaW5nIGJ1ZmZlclRleHQ7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgfSk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgcmVzcG9uc2UKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UoZnJhbWVkUmVzcG9uc2VCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgRmFrZVByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiB0cnVlKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBGYWtlUHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLkNBTEwsIDEyMyk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KAorICAgICAgICAgIHNvY2tldCwgbmV3IFRNZXNzYWdlUmVhZGVyKHByb3RvY29sRmFjdG9yeSksCisgICAgICAgICAgcmVzcG9uc2VUaW1lb3V0OiBEdXJhdGlvbi5aRVJPKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgcmVzcG9uc2UgY29ycmVsYXRlcyB0byBjb3JyZWN0IHJlcXVlc3QnLCAoKSBhc3luYyB7CisgICAgICBTdHJpbmcgYnVmZmVyVGV4dDsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gc2ltdWxhdGUgYSByZXNwb25zZQorICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbycsIFRNZXNzYWdlVHlwZS5SRVBMWSwgMTIzKTsKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVzcG9uc2VCYXNlNjQpOworCisgICAgICAvLyBzaW11bGF0ZSBhIHNlY29uZCByZXNwb25zZQorICAgICAgdmFyIHJlc3BvbnNlMlRleHQgPSAncmVzcG9uc2UgMic7CisgICAgICB2YXIgcmVzcG9uc2UyQnl0ZXMgPQorICAgICAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QodXRmOENvZGVjLmVuY29kZShyZXNwb25zZTJUZXh0KSk7CisgICAgICB2YXIgcmVzcG9uc2UyQmFzZTY0ID0gQkFTRTY0LmVuY29kZShyZXNwb25zZTJCeXRlcyk7CisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vMicsIFRNZXNzYWdlVHlwZS5SRVBMWSwgMTI0KTsKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVzcG9uc2UyQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCByZXNwb25zZSB0aW1lb3V0JywgKCkgYXN5bmMgeworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKTsKKyAgICAgIGV4cGVjdChyZXNwb25zZVJlYWR5LCB0aHJvd3NBKG5ldyBpc0luc3RhbmNlT2Y8VGltZW91dEV4Y2VwdGlvbj4oKSkpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBGYWtlUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IHRydWUpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IEZha2VQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28nLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMTIzKTsKKyAgICAgIHZhciBtZXNzYWdlUmVhZGVyID0gbmV3IFRNZXNzYWdlUmVhZGVyKHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICBieXRlT2Zmc2V0OiBURnJhbWVkVHJhbnNwb3J0LmhlYWRlckJ5dGVDb3VudCk7CisKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgc29ja2V0LCBtZXNzYWdlUmVhZGVyLAorICAgICAgICAgIHJlc3BvbnNlVGltZW91dDogRHVyYXRpb24uWkVSTykpOworICAgICAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXF1ZXN0Qnl0ZXMpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBhc3luYyBjbGllbnQgc2VuZGluZyBkYXRhIG92ZXIgZnJhbWVkIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLlJFUExZLCAxMjMpOworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShmcmFtZWRSZXNwb25zZUJhc2U2NCk7CisKKyAgICAgIGF3YWl0IHJlc3BvbnNlUmVhZHk7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVzcG9uc2VUZXh0KTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7CisKKyAgZ3JvdXAoJ1RTZXJ2ZXJUcmFuc3BvcnQnLCAoKSB7CisgICAgdGVzdCgnVGVzdCBzZXJ2ZXIgdHJhbnNwb3J0IGxpc3RlbnMgdG8gc29ja2V0JywgKCkgYXN5bmMgeworICAgICAgdmFyIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KCk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworICAgICAgZXhwZWN0KHNvY2tldC5pc09wZW4sIGlzVHJ1ZSk7CisKKyAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgZXhwZWN0KHRyYW5zcG9ydC5oYXNSZWFkRGF0YSwgaXNGYWxzZSk7CisKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVxdWVzdEJhc2U2NCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzVHJ1ZSk7CisKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlcXVlc3RCeXRlcy5sZW5ndGgpOworICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXF1ZXN0Qnl0ZXMubGVuZ3RoKTsKKworICAgICAgdmFyIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVxdWVzdFRleHQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzZXJ2ZXIgc2VuZGluZyBkYXRhIG92ZXIgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgdmFyIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KCk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworCisgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlc3BvbnNlQnl0ZXMpOworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgaXNOdWxsKTsKKworICAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTm90TnVsbCk7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCByZXNwb25zZUJ5dGVzKTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7Cit9CisKK2NsYXNzIEZha2VTb2NrZXQgZXh0ZW5kcyBUU29ja2V0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgRmFrZVNvY2tldCh7Ym9vbCBzeW5jOiBmYWxzZX0pCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChzeW5jOiBzeW5jKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KHN5bmM6IHN5bmMpLAorICAgICAgICBfb25NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChzeW5jOiBzeW5jKTsKKworICBib29sIF9pc09wZW47CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9pc09wZW47CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gIWlzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfaXNPcGVuID0gdHJ1ZTsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBfaXNPcGVuID0gZmFsc2U7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuQ0xPU0VEKTsKKyAgfQorCisgIFVpbnQ4TGlzdCBfc2VuZFBheWxvYWQ7CisgIFVpbnQ4TGlzdCBnZXQgc2VuZFBheWxvYWQgPT4gX3NlbmRQYXlsb2FkOworCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSkgeworICAgIGlmICghaXNPcGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcignVGhlIHNvY2tldCBpcyBub3Qgb3BlbicpOworCisgICAgX3NlbmRQYXlsb2FkID0gZGF0YTsKKyAgfQorCisgIHZvaWQgcmVjZWl2ZUZha2VNZXNzYWdlKFN0cmluZyBiYXNlNjQpIHsKKyAgICBpZiAoIWlzT3BlbikgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ1RoZSBzb2NrZXQgaXMgbm90IG9wZW4nKTsKKworICAgIHZhciBtZXNzYWdlID0KKyAgICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChCQVNFNjQuZGVjb2RlKGJhc2U2NCkpOworICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChtZXNzYWdlKTsKKyAgfQorfQorCitjbGFzcyBGYWtlUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgIEZha2VQcm90b2NvbEZhY3RvcnkoKTsKKworICBUTWVzc2FnZSBtZXNzYWdlOworCisgIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA9PiBuZXcgRmFrZVByb3RvY29sKG1lc3NhZ2UpOworfQorCitjbGFzcyBGYWtlUHJvdG9jb2wgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgVFByb3RvY29sIHsKKyAgRmFrZVByb3RvY29sKHRoaXMuX21lc3NhZ2UpOworCisgIFRNZXNzYWdlIF9tZXNzYWdlOworCisgIHJlYWRNZXNzYWdlQmVnaW4oKSA9PiBfbWVzc2FnZTsKK30KKworVWludDhMaXN0IF9nZXRGcmFtZWRSZXNwb25zZShVaW50OExpc3QgcmVzcG9uc2VCeXRlcykgeworICB2YXIgYnl0ZU9mZnNldCA9IFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyQnl0ZUNvdW50OworICB2YXIgcmVzcG9uc2UgPSBuZXcgVWludDhMaXN0KGJ5dGVPZmZzZXQgKyByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisKKyAgcmVzcG9uc2UuYnVmZmVyLmFzQnl0ZURhdGEoKS5zZXRJbnQzMigwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgIHJlc3BvbnNlLnNldEFsbChieXRlT2Zmc2V0LCByZXNwb25zZUJ5dGVzKTsKKworICByZXR1cm4gcmVzcG9uc2U7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3RyYW5zcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiMzgxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDQxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X3NvY2tldF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gQ29tbW9uIHRyYW5zcG9ydCB0ZXN0cwordm9pZCBtYWluKCkgeworICBncm91cCgnVFRyYW5zcG9ydEZhY3RvcnknLCAoKSB7CisgICAgdGVzdCgndHJhbnNwb3J0IGlzIHJldHVybmVkIGZyb20gYmFzZSBmYWN0b3J5JywgKCkgYXN5bmMgeworICAgICAgVFRyYW5zcG9ydCByZXN1bHQ7CisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAgIHZhciBmYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgIHJlc3VsdCA9IGF3YWl0IGZhY3RvcnkuZ2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICBleHBlY3QocmVzdWx0LCBpc051bGwpOworCisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgICByZXN1bHQgPSBhd2FpdCBmYWN0b3J5LmdldFRyYW5zcG9ydCh0cmFuc3BvcnQpOworCisgICAgICBleHBlY3QocmVzdWx0LCB0cmFuc3BvcnQpOworICAgIH0pOworICB9KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rvb2wvZGV2LmRhcnQgYi9saWIvZGFydC90b29sL2Rldi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjhiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90b29sL2Rldi5kYXJ0CkBAIC0wLDAgKzEsMzMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdG9vbC5kZXY7CisKK2ltcG9ydCAncGFja2FnZTpkYXJ0X2Rldi9kYXJ0X2Rldi5kYXJ0JyBzaG93IGRldiwgY29uZmlnOworCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Xb3JraXZhL2RhcnRfZGV2CisKKyAgdmFyIGRpcmVjdG9yaWVzID0gWydsaWIvJywgJ3Rlc3QvJywgJ3Rvb2wvJ107CisgIGNvbmZpZy5hbmFseXplLmVudHJ5UG9pbnRzID0gZGlyZWN0b3JpZXM7CisgIGNvbmZpZy5mb3JtYXQuZGlyZWN0b3JpZXMgPSBkaXJlY3RvcmllczsKKyAgY29uZmlnLmNvcHlMaWNlbnNlCisgICAgLi5saWNlbnNlUGF0aCA9ICdMSUNFTlNFX0hFQURFUicKKyAgICAuLmRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXM7CisKKyAgYXdhaXQgZGV2KGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qIGIvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzJlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL0RlbHBoaVRocmlmdC5ncm91cHByb2oKQEAgLTAsMCArMSwxNTYgQEAKK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+ezZCRDMyN0E1LTc2ODgtNDI2My1CNkE4LUIxNTIwN0NGNEVDNX08L1Byb2plY3RHdWlkPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxJdGVtR3JvdXA+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxjbGllbnQuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNlcnZlci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQk8L0l0ZW1Hcm91cD4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVmYXVsdC5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVmYXVsdC5QZXJzb25hbGl0eS8+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCQk8VGFyZ2V0IE5hbWU9ImNsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxjbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcY2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X0NsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5DbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LkNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X1NlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LlNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RTZXJpYWxpemVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VyaWFsaXplclxUZXN0U2VyaWFsaXplci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJpYWxpemVyXFRlc3RTZXJpYWxpemVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24xIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjE6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMS5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjE6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24xLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24yIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMi5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24yLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RUeXBlUmVnaXN0cnkiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcdHlwZXJlZ2lzdHJ5XFRlc3RUeXBlUmVnaXN0cnkuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeTpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFx0eXBlcmVnaXN0cnlcVGVzdFR5cGVSZWdpc3RyeS5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeTpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHMiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJSZXNlcnZlZEtleXdvcmRzOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGtleXdvcmRzXFJlc2VydmVkS2V5d29yZHMuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHM6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxrZXl3b3Jkc1xSZXNlcnZlZEtleXdvcmRzLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkJ1aWxkIj4KKwkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9ImNsaWVudDtzZXJ2ZXI7TXVsdGlwbGV4X1Rlc3RfQ2xpZW50O011bHRpcGxleF9UZXN0X1NlcnZlcjtUZXN0U2VyaWFsaXplcjtza2lwdGVzdF92ZXJzaW9uMTtza2lwdGVzdF92ZXJzaW9uMjtUZXN0VHlwZVJlZ2lzdHJ5O0RlbHBoaVNlcnZlcjtEZWxwaGlDbGllbnQ7UmVzZXJ2ZWRLZXl3b3JkcyIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJDbGVhbiI+CisJCQk8Q2FsbFRhcmdldCBUYXJnZXRzPSJjbGllbnQ6Q2xlYW47c2VydmVyOkNsZWFuO011bHRpcGxleF9UZXN0X0NsaWVudDpDbGVhbjtNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6Q2xlYW47VGVzdFNlcmlhbGl6ZXI6Q2xlYW47c2tpcHRlc3RfdmVyc2lvbjE6Q2xlYW47c2tpcHRlc3RfdmVyc2lvbjI6Q2xlYW47VGVzdFR5cGVSZWdpc3RyeTpDbGVhbjtEZWxwaGlTZXJ2ZXI6Q2xlYW47RGVscGhpQ2xpZW50OkNsZWFuO1Jlc2VydmVkS2V5d29yZHM6Q2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTWFrZSI+CisJCQk8Q2FsbFRhcmdldCBUYXJnZXRzPSJjbGllbnQ6TWFrZTtzZXJ2ZXI6TWFrZTtNdWx0aXBsZXhfVGVzdF9DbGllbnQ6TWFrZTtNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6TWFrZTtUZXN0U2VyaWFsaXplcjpNYWtlO3NraXB0ZXN0X3ZlcnNpb24xOk1ha2U7c2tpcHRlc3RfdmVyc2lvbjI6TWFrZTtUZXN0VHlwZVJlZ2lzdHJ5Ok1ha2U7RGVscGhpU2VydmVyOk1ha2U7RGVscGhpQ2xpZW50Ok1ha2U7UmVzZXJ2ZWRLZXl3b3JkczpNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzIi8+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9SRUFETUUubWQgYi9saWIvZGVscGhpL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTc5OWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9SRUFETUUubWQKQEAgLTAsMCArMSwzMCBAQAorVGhyaWZ0IERlbHBoaSBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIERlbHBoaQorPT09PT09PT09PT09PT09PT09PT0KKworVGhlIFRocmlmdCBEZWxwaGkgTGlicmFyeSByZXF1aXJlcyBhdCBsZWFzdCBEZWxwaGkgMjAxMC4KKworQmVjYXVzZSB0aGUgTGlicmFyeSBoZWF2aWx5IHJlbGllcyBvbiBnZW5lcmljcywgdXNpbmcgaXQKK3dpdGggZWFybGllciB2ZXJzaW9ucyAoc3VjaCBhcyBEZWxwaGkgNykgd2lsbCAqbm90KiB3b3JrLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZGVscGhpL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db2xsZWN0aW9ucy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuQ29sbGVjdGlvbnMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjA2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuQ29sbGVjdGlvbnMucGFzCkBAIC0wLDAgKzEsNjE5IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LkNvbGxlY3Rpb25zOworCitpbnRlcmZhY2UKKwordXNlcworICBHZW5lcmljcy5Db2xsZWN0aW9ucywgR2VuZXJpY3MuRGVmYXVsdHMsIFRocmlmdC5VdGlsczsKKwordHlwZQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9CisgIFRBcnJheTxUPiA9IGFycmF5IG9mIFQ7Cit7JElGRU5EfQorCisgIElUaHJpZnRDb250YWluZXIgPSBpbnRlcmZhY2UKKyAgICBbJ3s5M0RFRjVBMC1EMTYyLTQ2MUEtQUIyMi01QjRFRTA3MzQwNTB9J10KKyAgICBmdW5jdGlvbiBUb1N0cmluZzogc3RyaW5nOworICBlbmQ7CisKKyAgSVRocmlmdERpY3Rpb25hcnk8VEtleSxUVmFsdWU+ID0gaW50ZXJmYWNlKElUaHJpZnRDb250YWluZXIpCisgICAgWyd7MjVFREQ1MDYtRjlEMS00MDA4LUE0MEYtNTk0MDM2NEI3RTQ2fSddCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSxUVmFsdWU+PjsKKworICAgIGZ1bmN0aW9uIEdldEtleXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5US2V5Q29sbGVjdGlvbjsKKyAgICBmdW5jdGlvbiBHZXRWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uOworICAgIGZ1bmN0aW9uIEdldEl0ZW0oY29uc3QgS2V5OiBUS2V5KTogVFZhbHVlOworICAgIHByb2NlZHVyZSBTZXRJdGVtKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisKKyAgICBwcm9jZWR1cmUgQWRkKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgcHJvY2VkdXJlIFJlbW92ZShjb25zdCBLZXk6IFRLZXkpOworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgICBmdW5jdGlvbiBFeHRyYWN0UGFpcihjb25zdCBLZXk6IFRLZXkpOiBUUGFpcjxUS2V5LFRWYWx1ZT47Cit7JElGRU5EfQorICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBwcm9jZWR1cmUgVHJpbUV4Y2VzczsKKyAgICBmdW5jdGlvbiBUcnlHZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IG91dCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgQWRkT3JTZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIGZ1bmN0aW9uIENvbnRhaW5zS2V5KGNvbnN0IEtleTogVEtleSk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gQ29udGFpbnNWYWx1ZShjb25zdCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQXJyYXk8VFBhaXI8VEtleSxUVmFsdWU+PjsKKworICAgIHByb3BlcnR5IEl0ZW1zW2NvbnN0IEtleTogVEtleV06IFRWYWx1ZSByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50OworICAgIHByb3BlcnR5IEtleXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5US2V5Q29sbGVjdGlvbiByZWFkIEdldEtleXM7CisgICAgcHJvcGVydHkgVmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbiByZWFkIEdldFZhbHVlczsKKyAgZW5kOworCisgIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LFRWYWx1ZT4gPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUaHJpZnREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPikKKyAgcHJpdmF0ZQorICAgIEZEaWN0aW9uYWx5IDogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+OworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUUGFpcjxUS2V5LFRWYWx1ZT4+OworCisgICAgZnVuY3Rpb24gR2V0S2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uOworICAgIGZ1bmN0aW9uIEdldFZhbHVlczogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRWYWx1ZUNvbGxlY3Rpb247CisgICAgZnVuY3Rpb24gR2V0SXRlbShjb25zdCBLZXk6IFRLZXkpOiBUVmFsdWU7CisgICAgcHJvY2VkdXJlIFNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBBZGQoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7Cit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICAgIGZ1bmN0aW9uIEV4dHJhY3RQYWlyKGNvbnN0IEtleTogVEtleSk6IFRQYWlyPFRLZXksVFZhbHVlPjsKK3skSUZFTkR9CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIFRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsgb3V0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBBZGRPclNldFZhbHVlKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgZnVuY3Rpb24gQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBDb250YWluc1ZhbHVlKGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRBcnJheTxUUGFpcjxUS2V5LFRWYWx1ZT4+OworICAgIHByb3BlcnR5IEl0ZW1zW2NvbnN0IEtleTogVEtleV06IFRWYWx1ZSByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50OworICAgIHByb3BlcnR5IEtleXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5US2V5Q29sbGVjdGlvbiByZWFkIEdldEtleXM7CisgICAgcHJvcGVydHkgVmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbiByZWFkIEdldFZhbHVlczsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFDYXBhY2l0eTogSW50ZWdlciA9IDApOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBJVGhyaWZ0TGlzdDxUPiA9IGludGVyZmFjZShJVGhyaWZ0Q29udGFpbmVyKQorICAgIFsnezI5QkVFRTMxLTlDQjQtNDAxQi1BQTA0LTUxNDhBNzVGNDczQn0nXQorICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFQ+OworICAgIGZ1bmN0aW9uIEdldENhcGFjaXR5OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDYXBhY2l0eShWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJdGVtKEluZGV4OiBJbnRlZ2VyKTogVDsKKyAgICBwcm9jZWR1cmUgU2V0SXRlbShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworICAgIGZ1bmN0aW9uIEFkZChjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBBZGRSYW5nZShjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBBZGRSYW5nZShDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnQoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVtb3ZlKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgRGVsZXRlKEluZGV4OiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgRGVsZXRlUmFuZ2UoQUluZGV4LCBBQ291bnQ6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEV4dHJhY3QoY29uc3QgVmFsdWU6IFQpOiBUOworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgICBwcm9jZWR1cmUgRXhjaGFuZ2UoSW5kZXgxLCBJbmRleDI6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBNb3ZlKEN1ckluZGV4LCBOZXdJbmRleDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gRmlyc3Q6IFQ7CisgICAgZnVuY3Rpb24gTGFzdDogVDsKK3skSUZFTkR9CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIGZ1bmN0aW9uIENvbnRhaW5zKGNvbnN0IFZhbHVlOiBUKTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBJbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBMYXN0SW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFJldmVyc2U7CisgICAgcHJvY2VkdXJlIFNvcnQ7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBTb3J0KGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcik6IEJvb2xlYW47IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIEJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOyBvdXQgSW5kZXg6IEludGVnZXI7IGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTogQm9vbGVhbjsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFRyaW1FeGNlc3M7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEFycmF5PFQ+OworICAgIHByb3BlcnR5IENhcGFjaXR5OiBJbnRlZ2VyIHJlYWQgR2V0Q2FwYWNpdHkgd3JpdGUgU2V0Q2FwYWNpdHk7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBJdGVtc1tJbmRleDogSW50ZWdlcl06IFQgcmVhZCBHZXRJdGVtIHdyaXRlIFNldEl0ZW07IGRlZmF1bHQ7CisgIGVuZDsKKworICBUVGhyaWZ0TGlzdEltcGw8VD4gPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUaHJpZnRMaXN0PFQ+KQorICBwcml2YXRlCisgICAgRkxpc3QgOiBUTGlzdDxUPjsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VD47CisgICAgZnVuY3Rpb24gR2V0Q2FwYWNpdHk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENhcGFjaXR5KFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q291bnQoVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldEl0ZW0oSW5kZXg6IEludGVnZXIpOiBUOworICAgIHByb2NlZHVyZSBTZXRJdGVtKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CisgICAgZnVuY3Rpb24gQWRkKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydChJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZW1vdmUoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBEZWxldGUoSW5kZXg6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBEZWxldGVSYW5nZShBSW5kZXgsIEFDb3VudDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gRXh0cmFjdChjb25zdCBWYWx1ZTogVCk6IFQ7Cit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICAgIHByb2NlZHVyZSBFeGNoYW5nZShJbmRleDEsIEluZGV4MjogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIE1vdmUoQ3VySW5kZXgsIE5ld0luZGV4OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBGaXJzdDogVDsKKyAgICBmdW5jdGlvbiBMYXN0OiBUOworeyRJRkVORH0KKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgZnVuY3Rpb24gQ29udGFpbnMoY29uc3QgVmFsdWU6IFQpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIExhc3RJbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgUmV2ZXJzZTsKKyAgICBwcm9jZWR1cmUgU29ydDsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFNvcnQoY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBCaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyKTogQm9vbGVhbjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcjsgY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgVHJpbUV4Y2VzczsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQXJyYXk8VD47CisgICAgcHJvcGVydHkgQ2FwYWNpdHk6IEludGVnZXIgcmVhZCBHZXRDYXBhY2l0eSB3cml0ZSBTZXRDYXBhY2l0eTsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50IHdyaXRlIFNldENvdW50OworICAgIHByb3BlcnR5IEl0ZW1zW0luZGV4OiBJbnRlZ2VyXTogVCByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBJSGFzaFNldDxUVmFsdWU+ID0gaW50ZXJmYWNlKElUaHJpZnRDb250YWluZXIpCisgICAgWyd7MDkyM0EzQjUtRDRENC00OEE4LTkxQUQtNDAyMzhFMkVBRDY2fSddCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFZhbHVlPjsKKyAgICBmdW5jdGlvbiBHZXRJc1JlYWRPbmx5OiBCb29sZWFuOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQ7CisgICAgcHJvcGVydHkgSXNSZWFkT25seTogQm9vbGVhbiByZWFkIEdldElzUmVhZE9ubHk7CisgICAgcHJvY2VkdXJlIEFkZCggY29uc3QgaXRlbTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgZnVuY3Rpb24gQ29udGFpbnMoIGNvbnN0IGl0ZW06IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIENvcHlUbyh2YXIgQTogVEFycmF5PFRWYWx1ZT47IGFycmF5SW5kZXg6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIFJlbW92ZSggY29uc3QgaXRlbTogVFZhbHVlICk6IEJvb2xlYW47CisgIGVuZDsKKworICBUSGFzaFNldEltcGw8VFZhbHVlPiA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSUhhc2hTZXQ8VFZhbHVlPikKKyAgcHJpdmF0ZQorICAgIEZEaWN0aW9uYXJ5IDogSVRocmlmdERpY3Rpb25hcnk8VFZhbHVlLEludGVnZXI+OworICAgIEZJc1JlYWRPbmx5OiBCb29sZWFuOworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUVmFsdWU+OworICAgIGZ1bmN0aW9uIEdldElzUmVhZE9ubHk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBJc1JlYWRPbmx5OiBCb29sZWFuIHJlYWQgRklzUmVhZE9ubHk7CisgICAgcHJvY2VkdXJlIEFkZCggY29uc3QgaXRlbTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgZnVuY3Rpb24gQ29udGFpbnMoIGNvbnN0IGl0ZW06IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIENvcHlUbyh2YXIgQTogVEFycmF5PFRWYWx1ZT47IGFycmF5SW5kZXg6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIFJlbW92ZSggY29uc3QgaXRlbTogVFZhbHVlICk6IEJvb2xlYW47CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCit7IFRIYXNoU2V0SW1wbDxUVmFsdWU+IH0KKworcHJvY2VkdXJlIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkFkZCggY29uc3QgaXRlbTogVFZhbHVlKTsKK2JlZ2luCisgIGlmIG5vdCBGRGljdGlvbmFyeS5Db250YWluc0tleShpdGVtKSB0aGVuCisgIGJlZ2luCisgICAgRkRpY3Rpb25hcnkuQWRkKCBpdGVtLCAwKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQ2xlYXI7CitiZWdpbgorICBGRGljdGlvbmFyeS5DbGVhcjsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQ29udGFpbnMoIGNvbnN0IGl0ZW06IFRWYWx1ZSk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hcnkuQ29udGFpbnNLZXkoaXRlbSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSGFzaFNldEltcGw8VFZhbHVlPi5Db3B5VG8odmFyIEE6IFRBcnJheTxUVmFsdWU+OyBhcnJheUluZGV4OiBJbnRlZ2VyKTsKK3ZhcgorICBpIDogSW50ZWdlcjsKKyAgRW51bWxhdG9yIDogVEVudW1lcmF0b3I8VFZhbHVlPjsKK2JlZ2luCisgIEVudW1sYXRvciA6PSBHZXRFbnVtZXJhdG9yOworICB3aGlsZSBFbnVtbGF0b3IuTW92ZU5leHQgZG8KKyAgYmVnaW4KKyAgICBBW2FycmF5SW5kZXhdIDo9IEVudW1sYXRvci5DdXJyZW50OworICAgIEluYyhhcnJheUluZGV4KTsKKyAgZW5kOworZW5kOworCitjb25zdHJ1Y3RvciBUSGFzaFNldEltcGw8VFZhbHVlPi5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIEZEaWN0aW9uYXJ5IDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUVmFsdWUsSW50ZWdlcj4uQ3JlYXRlOworZW5kOworCitmdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5HZXRDb3VudDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFyeS5Db3VudDsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFZhbHVlPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFyeS5LZXlzLkdldEVudW1lcmF0b3I7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkdldElzUmVhZE9ubHk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRklzUmVhZE9ubHk7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoU2V0SW1wbDxUVmFsdWU+LlJlbW92ZSggY29uc3QgaXRlbTogVFZhbHVlKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGYWxzZTsKKyAgaWYgRkRpY3Rpb25hcnkuQ29udGFpbnNLZXkoIGl0ZW0gKSB0aGVuCisgIGJlZ2luCisgICAgRkRpY3Rpb25hcnkuUmVtb3ZlKCBpdGVtICk7CisgICAgUmVzdWx0IDo9IG5vdCBGRGljdGlvbmFyeS5Db250YWluc0tleSggaXRlbSApOworICBlbmQ7CitlbmQ7CisKK3sgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4gfQorCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQWRkKGNvbnN0IEtleTogVEtleTsKKyAgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CitiZWdpbgorICBGRGljdGlvbmFseS5BZGQoIEtleSwgVmFsdWUpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQWRkT3JTZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7CisgIGNvbnN0IFZhbHVlOiBUVmFsdWUpOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuQWRkT3JTZXRWYWx1ZSggS2V5LCBWYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5DbGVhcjsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LkNsZWFyOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5Db250YWluc0tleSgKKyAgY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5Db250YWluc0tleSggS2V5ICk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkNvbnRhaW5zVmFsdWUoCisgIGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkNvbnRhaW5zVmFsdWUoIFZhbHVlICk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkNyZWF0ZShBQ2FwYWNpdHk6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkRpY3Rpb25hbHkgOj0gVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LkNyZWF0ZSggQUNhcGFjaXR5ICk7CitlbmQ7CisKK2Rlc3RydWN0b3IgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uRGVzdHJveTsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LkZyZWU7CisgIGluaGVyaXRlZDsKK2VuZDsKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkV4dHJhY3RQYWlyKCBjb25zdCBLZXk6IFRLZXkpOiBUUGFpcjxUS2V5LCBUVmFsdWU+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkV4dHJhY3RQYWlyKCBLZXkpOworZW5kOworeyRJRkVORH0KKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0Q291bnQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRQYWlyPFRLZXksIFRWYWx1ZT4+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkdldEVudW1lcmF0b3I7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldEl0ZW0oY29uc3QgS2V5OiBUS2V5KTogVFZhbHVlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5Lkl0ZW1zW0tleV07CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldEtleXM6IFREaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4uVEtleUNvbGxlY3Rpb247CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuS2V5czsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0VmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+LlRWYWx1ZUNvbGxlY3Rpb247CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuVmFsdWVzOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7CitiZWdpbgorICBGRGljdGlvbmFseS5SZW1vdmUoIEtleSApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uU2V0SXRlbShjb25zdCBLZXk6IFRLZXk7CisgIGNvbnN0IFZhbHVlOiBUVmFsdWUpOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuQWRkT3JTZXRWYWx1ZSggS2V5LCBWYWx1ZSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LlRvQXJyYXk6IFRBcnJheTxUUGFpcjxUS2V5LCBUVmFsdWU+PjsKK3skSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjIuMH0KK3ZhcgorICB4IDogVFBhaXI8VEtleSwgVFZhbHVlPjsKKyAgaSA6IEludGVnZXI7Cit7JElGRU5EfQorYmVnaW4KK3skSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjIuMH0KKyAgU2V0TGVuZ3RoKFJlc3VsdCwgQ291bnQpOworICBpIDo9IDA7CisgIGZvciB4IGluIEZEaWN0aW9uYWx5IGRvCisgIGJlZ2luCisgICAgUmVzdWx0W2ldIDo9IHg7CisgICAgSW5jKCBpICk7CisgIGVuZDsKK3skRUxTRX0KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LlRvQXJyYXk7Cit7JElGRU5EfQorZW5kOworCitwcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uVHJpbUV4Y2VzczsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LlRyaW1FeGNlc3M7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LlRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsKKyAgb3V0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LlRyeUdldFZhbHVlKCBLZXksIFZhbHVlKTsKK2VuZDsKKworeyBUVGhyaWZ0TGlzdEltcGw8VD4gfQorCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uQWRkKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5BZGQoIFZhbHVlICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uQWRkUmFuZ2UoQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOworYmVnaW4KKyAgRkxpc3QuQWRkUmFuZ2UoIENvbGxlY3Rpb24gKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5BZGRSYW5nZShjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7CitiZWdpbgorICBGTGlzdC5BZGRSYW5nZSggQ29sbGVjdGlvbiApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkFkZFJhbmdlKGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7CitiZWdpbgorICBGTGlzdC5BZGRSYW5nZSggVmFsdWVzICk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5CaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsKKyAgb3V0IEluZGV4OiBJbnRlZ2VyKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5CaW5hcnlTZWFyY2goIEl0ZW0sIEluZGV4KTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOyBvdXQgSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5CaW5hcnlTZWFyY2goIEl0ZW0sIEluZGV4LCBBQ29tcGFyZXIpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkNsZWFyOworYmVnaW4KKyAgRkxpc3QuQ2xlYXI7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5Db250YWlucyhjb25zdCBWYWx1ZTogVCk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuQ29udGFpbnMoIFZhbHVlICk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUaHJpZnRMaXN0SW1wbDxUPi5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIEZMaXN0IDo9IFRMaXN0PFQ+LkNyZWF0ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5EZWxldGUoSW5kZXg6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuRGVsZXRlKCBJbmRleCApCitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uRGVsZXRlUmFuZ2UoQUluZGV4LCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuRGVsZXRlUmFuZ2UoIEFJbmRleCwgQUNvdW50KQorZW5kOworCitkZXN0cnVjdG9yIFRUaHJpZnRMaXN0SW1wbDxUPi5EZXN0cm95OworYmVnaW4KKyAgRkxpc3QuRnJlZTsKKyAgaW5oZXJpdGVkOworZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5FeGNoYW5nZShJbmRleDEsIEluZGV4MjogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5FeGNoYW5nZSggSW5kZXgxLCBJbmRleDIgKQorZW5kOworeyRJRkVORH0KKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkV4dHJhY3QoY29uc3QgVmFsdWU6IFQpOiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkV4dHJhY3QoIFZhbHVlICkKK2VuZDsKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5GaXJzdDogVDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5GaXJzdDsKK2VuZDsKK3skSUZFTkR9CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5HZXRDYXBhY2l0eTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5DYXBhY2l0eTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkdldENvdW50OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkNvdW50OworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VD47CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuR2V0RW51bWVyYXRvcjsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkdldEl0ZW0oSW5kZXg6IEludGVnZXIpOiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0W0luZGV4XTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkluZGV4T2YoIFZhbHVlICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uSW5zZXJ0KEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CitiZWdpbgorICBGTGlzdC5JbnNlcnQoIEluZGV4LCBWYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsKK2JlZ2luCisgIEZMaXN0Lkluc2VydFJhbmdlKCBJbmRleCwgQ29sbGVjdGlvbiApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lkluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOworYmVnaW4KKyAgRkxpc3QuSW5zZXJ0UmFuZ2UoIEluZGV4LCBWYWx1ZXMpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lkluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7CitiZWdpbgorICBGTGlzdC5JbnNlcnRSYW5nZSggSW5kZXgsIENvbGxlY3Rpb24gKTsKK2VuZDsKKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5MYXN0OiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0Lkxhc3Q7CitlbmQ7Cit7JElGRU5EfQorCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uTGFzdEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0Lkxhc3RJbmRleE9mKCBWYWx1ZSApOworZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5Nb3ZlKEN1ckluZGV4LCBOZXdJbmRleDogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5Nb3ZlKCBDdXJJbmRleCwgIE5ld0luZGV4KTsKK2VuZDsKK3skSUZFTkR9CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5SZW1vdmUoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LlJlbW92ZSggVmFsdWUgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5SZXZlcnNlOworYmVnaW4KKyAgRkxpc3QuUmV2ZXJzZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5TZXRDYXBhY2l0eShWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5DYXBhY2l0eSA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5TZXRDb3VudChWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5Db3VudCA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5TZXRJdGVtKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CitiZWdpbgorICBGTGlzdFtJbmRleF0gOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uU29ydDsKK2JlZ2luCisgIEZMaXN0LlNvcnQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uU29ydChjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik7CitiZWdpbgorICBGTGlzdC5Tb3J0OworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uVG9BcnJheTogVEFycmF5PFQ+OworeyRJRiBDb21waWxlclZlcnNpb24gPCAyMi4wfQordmFyCisgIHggOiBUOworICBpIDogSW50ZWdlcjsKK3skSUZFTkR9CitiZWdpbgoreyRJRiBDb21waWxlclZlcnNpb24gPCAyMi4wfQorICBTZXRMZW5ndGgoUmVzdWx0LCBDb3VudCk7CisgIGkgOj0gMDsKKyAgZm9yIHggaW4gRkxpc3QgZG8KKyAgYmVnaW4KKyAgICBSZXN1bHRbaV0gOj0geDsKKyAgICBJbmMoIGkgKTsKKyAgZW5kOworeyRFTFNFfQorICBSZXN1bHQgOj0gRkxpc3QuVG9BcnJheTsKK3skSUZFTkR9CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uVHJpbUV4Y2VzczsKK2JlZ2luCisgIEZMaXN0LlRyaW1FeGNlc3M7CitlbmQ7CisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTljY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jCkBAIC0wLDAgKzEsNTAgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworCisvLyBHb29kIGxpc3RzIG9mIERlbHBoaSB2ZXJzaW9uIG51bWJlcnMKKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZWN0LWplZGkvamVkaS9ibG9iL21hc3Rlci9qZWRpLmluYworLy8gaHR0cDovL2RvY3dpa2kuZW1iYXJjYWRlcm8uY29tL1JBRFN0dWRpby9TZWF0dGxlL2VuL0NvbXBpbGVyX1ZlcnNpb25zCisKKworLy8gc3RhcnQgd2l0aCBtb3N0IGJhY2t3YXJkcyBjb21wYXRpYmxlIGRlZmF1bHRzCisKK3skREVGSU5FIE9MRF9VTklUX05BTUVTfQoreyRERUZJTkUgT0xEX1NPQ0tFVFN9ICAgICAgLy8gVE9ETzogYWRkIHNvY2tldCBzdXBwb3J0IGZvciBDb21waWxlclZlcnNpb24gPj0gMjguMAoreyRVTkRFRiBIQVZFX0NMQVNTX0NUT1J9CisKKworLy8gZW5hYmxlIGZlYXR1cmVzIGFzIHRoZXkgYXJlIGF2YWlsYWJsZQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSAgIC8vIERlbHBoaSAyMDEwCisgIHskREVGSU5FIEhBVkVfQ0xBU1NfQ1RPUn0KK3skSUZFTkR9CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIzLjB9ICAgLy8gRGVscGhpIFhFMgorICB7JFVOREVGIE9MRF9VTklUX05BTUVTfQoreyRJRkVORH0KKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjguMH0gICAvLyBEZWxwaGkgWEU3CisgIHskVU5ERUYgT0xEX1NPQ0tFVFN9Cit7JElGRU5EfQorCisKKy8vIEVPRgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkV4Y2VwdGlvbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNWMzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzCkBAIC0wLDAgKzEsNjIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworeyRTQ09QRURFTlVNUyBPTn0KKwordW5pdCBUaHJpZnQuRXhjZXB0aW9uOworCitpbnRlcmZhY2UKKwordXNlcworICBDbGFzc2VzLCBTeXNVdGlsczsKKwordHlwZQorICAvLyBiYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IGV4Y2VwdGlvbnMKKyAgVEV4Y2VwdGlvbiA9IGNsYXNzKCBTeXNVdGlscy5FeGNlcHRpb24pCisgIHB1YmxpYworICAgIGZ1bmN0aW9uIE1lc3NhZ2UgOiBzdHJpbmc7ICAgICAgICAvLyBoaWRlIGluaGVyaXRlZCBwcm9wZXJ0eTogYWxsb3cgcmVhZCwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKyAgICBwcm9jZWR1cmUgVXBkYXRlTWVzc2FnZVByb3BlcnR5OyAgLy8gdXBkYXRlIGluaGVyaXRlZCBtZXNzYWdlIHByb3BlcnR5IHdpdGggdG9TdHJpbmcoKQorICBlbmQ7CisKKworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVEV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIFRFeGNlcHRpb24uTWVzc2FnZTsKKy8vIGFsbG93IHJlYWQgKGV4Y2VwdGlvbiBzdW1tYXJ5KSwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKy8vIHJlYWQgd2lsbCByZXR1cm4gdGhlIGV4Y2VwdGlvbiBzdW1tYXJ5CitiZWdpbgorICByZXN1bHQgOj0gU2VsZi5Ub1N0cmluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRFeGNlcHRpb24uVXBkYXRlTWVzc2FnZVByb3BlcnR5OworLy8gVXBkYXRlIHRoZSBpbmhlcml0ZWQgTWVzc2FnZSBwcm9wZXJ0eSB0byBiZXR0ZXIgY29uZm9ybSB0byBzdGFuZGFyZCBiZWhhdmlvdXIuCisvLyBOaWNlIGJlbmVmaXQ6IFRoZSBJREUgaXMgbm93IGFibGUgdG8gc2hvdyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYWdhaW4uCitiZWdpbgorICBpbmhlcml0ZWQgTWVzc2FnZSA6PSBTZWxmLlRvU3RyaW5nOyAgLy8gcHJvZHVjZXMgYSBzdW1tYXJ5IHRleHQKK2VuZDsKKworCisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmMjNkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcwpAQCAtMCwwICsxLDIzMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4OworCisKK2ludGVyZmFjZQorCit1c2VzCisgIFN5c1V0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXg7CisKK3sgVE11bHRpcGxleGVkUHJvY2Vzc29yIGlzIGEgVFByb2Nlc3NvciBhbGxvd2luZyBhIHNpbmdsZSBUU2VydmVyIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgIFRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsIHByb2Nlc3NvcnMgd2l0aCBpdCwKKyAgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCisKKyAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKworICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgICAgICAiQ2FsY3VsYXRvciIsCisgICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKworICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKworICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworCisgICAgIHNlcnZlci5zZXJ2ZSgpOworfQorCisKK3R5cGUKKyAgSU11bHRpcGxleGVkUHJvY2Vzc29yID0gaW50ZXJmYWNlKCBJUHJvY2Vzc29yKQorICAgIFsnezgwN0Y5RDE5LTZDRjQtNDc4OS04NDBFLTkzRTg3QTEyRUI2M30nXQorICAgIC8vIFJlZ2lzdGVyIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdXMKKyAgICAvLyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lCisgICAgLy8gdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4gPSBGQUxTRSk7CisgIGVuZDsKKworCisgIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElNdWx0aXBsZXhlZFByb2Nlc3NvciwgSVByb2Nlc3NvcikKKyAgcHJpdmF0ZSB0eXBlCisgICAgLy8gT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuICBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAgICAvLyB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5CisgICAgLy8gdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICAgIFRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgPSBjbGFzcyggVFByb3RvY29sRGVjb3JhdG9yKQorICAgIHByaXZhdGUKKyAgICAgIEZNZXNzYWdlQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICBwdWJsaWMKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IFRUaHJpZnRNZXNzYWdlKTsKKyAgICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBlbmQ7CisKKyAgcHJpdmF0ZQorICAgIEZTZXJ2aWNlUHJvY2Vzc29yTWFwIDogVERpY3Rpb25hcnk8U3RyaW5nLCBJUHJvY2Vzc29yPjsKKyAgICBGRGVmYXVsdFByb2Nlc3NvciA6IElQcm9jZXNzb3I7CisKKyAgICBwcm9jZWR1cmUgRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7IGNvbnN0IGV0eHQgOiBzdHJpbmcpOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIC8vIFJlZ2lzdGVyIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC4gIFRoaXMgYWxsb3dzIHVzCisgICAgLy8gdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIC8vIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOyBjb25zdCBhc0RlZmF1bHQgOiBCb29sZWFuID0gRkFMU0UpOworCisgICAgeyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgorICAgICAgLSBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS4KKyAgICAgIC0gVXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci4KKyAgICAgIC0gRGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuCisKKyAgICAgIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVkKKyAgICAgIG9yIGlmIHRoZSBzZXJ2aWNlIGlzIHVua25vd24gKG9yIG5vdCBwcm9wZXJseSByZWdpc3RlcmVkKS4KKyAgICB9CisgICAgZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3QsIG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworY29uc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLkNyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IFRUaHJpZnRNZXNzYWdlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIHByb3RvY29sKTsKKyAgRk1lc3NhZ2VCZWdpbiA6PSBhTXNnQmVnaW47CitlbmQ7CisKKworZnVuY3Rpb24gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZNZXNzYWdlQmVnaW47CitlbmQ7CisKKworY29uc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmljZVByb2Nlc3Nvck1hcCA6PSBURGljdGlvbmFyeTxzdHJpbmcsSVByb2Nlc3Nvcj4uQ3JlYXRlOworZW5kOworCisKK2Rlc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggRlNlcnZpY2VQcm9jZXNzb3JNYXApOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5SZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4pOworYmVnaW4KKyAgRlNlcnZpY2VQcm9jZXNzb3JNYXAuQWRkKCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKKworICBpZiBhc0RlZmF1bHQgdGhlbiBiZWdpbgorICAgIGlmIEZEZWZhdWx0UHJvY2Vzc29yID0gbmlsCisgICAgdGhlbiBGRGVmYXVsdFByb2Nlc3NvciA6PSBwcm9jZXNzb3IKKyAgICBlbHNlIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IuQ3JlYXRlKCdPbmx5IG9uZSBkZWZhdWx0IHNlcnZpY2UgYWxsb3dlZCcpOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHR5cGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV0eHQgOiBzdHJpbmcpOwordmFyIGFwcGV4ICA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKyAgICBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKK2JlZ2luCisgIGFwcGV4IDo9IGV4dHlwZS5DcmVhdGUoZXR4dCk7CisgIHRyeQorICAgIEluaXQoIG5ld01zZywgbXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7CisKKyAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXdNc2cpOworICAgIGFwcGV4LldyaXRlKG9wcm90KTsKKyAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsKKyAgICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsKKworICBmaW5hbGx5CisgICAgYXBwZXguRnJlZTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuUHJvY2Vzcyhjb25zdCBpcHJvdCwgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOwordmFyIG1zZywgbmV3TXNnIDogVFRocmlmdE1lc3NhZ2U7CisgICAgaWR4ICAgICAgICAgOiBJbnRlZ2VyOworICAgIHNTZXJ2aWNlICAgIDogc3RyaW5nOworICAgIHByb2Nlc3NvciAgIDogSVByb2Nlc3NvcjsKKyAgICBwcm90b2NvbCAgICA6IElQcm90b2NvbDsKK2NvbnN0CisgIEVSUk9SX0lOVkFMSURfTVNHVFlQRSAgID0gJ01lc3NhZ2UgbXVzdCBiZSAiY2FsbCIgb3IgIm9uZXdheSInOworICBFUlJPUl9JTkNPTVBBVElCTEVfUFJPVCA9ICdObyBzZXJ2aWNlIG5hbWUgZm91bmQgaW4gIiVzIi4gQ2xpZW50IGlzIGV4cGVjdGVkIHRvIHVzZSBUTXVsdGlwbGV4UHJvdG9jb2wuJzsKKyAgRVJST1JfVU5LTk9XTl9TRVJWSUNFICAgPSAnU2VydmljZSAiJXMiIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggTXVsdGlwbGV4ZWRQcm9jZXNzb3InOworYmVnaW4KKyAgLy8gVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlIG1lc3NhZ2UgaGVhZGVyLgorICAvLyBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbCBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgbXNnIDo9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgaWYgbm90IChtc2cuVHlwZV8gaW4gW1RNZXNzYWdlVHlwZS5DYWxsLCBUTWVzc2FnZVR5cGUuT25ld2F5XSkgdGhlbiBiZWdpbgorICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgIEVSUk9SX0lOVkFMSURfTVNHVFlQRSk7CisgICAgRXhpdCggRkFMU0UpOworICBlbmQ7CisKKyAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgIC8vIHVzZSBGRGVmYXVsdFByb2Nlc3NvciBhcyBmYWxsYmFjayBpZiB0aGVyZSBpcyBubyBzZXBhcmF0b3IKKyAgaWR4IDo9IFBvcyggVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLCBtc2cuTmFtZSk7CisgIGlmIGlkeCA+IDAgdGhlbiBiZWdpbgorCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgIHNTZXJ2aWNlIDo9IENvcHkoIG1zZy5OYW1lLCAxLCBpZHgtMSk7CisgICAgaWYgbm90IEZTZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKCBzU2VydmljZSwgcHJvY2Vzc29yKQorICAgIHRoZW4gYmVnaW4KKyAgICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IsCisgICAgICAgICAgICAgRm9ybWF0KEVSUk9SX1VOS05PV05fU0VSVklDRSxbc1NlcnZpY2VdKSk7CisgICAgICBFeGl0KCBGQUxTRSk7CisgICAgZW5kOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgSW5jKCBpZHgsIExlbmd0aChUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpKTsKKyAgICBJbml0KCBuZXdNc2csIENvcHkoIG1zZy5OYW1lLCBpZHgsIE1BWElOVCksIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKworICBlbmQKKyAgZWxzZSBpZiBGRGVmYXVsdFByb2Nlc3NvciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIHByb2Nlc3NvciA6PSBGRGVmYXVsdFByb2Nlc3NvcjsKKyAgICBuZXdNc2cgICAgOj0gbXNnOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKKworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgIEZvcm1hdChFUlJPUl9JTkNPTVBBVElCTEVfUFJPVCxbbXNnLk5hbWVdKSk7CisgICAgRXhpdCggRkFMU0UpOworICBlbmQ7CisKKyAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICBwcm90b2NvbCA6PSBUU3RvcmVkTWVzc2FnZVByb3RvY29sLkNyZWF0ZSggaXByb3QsIG5ld01zZyk7CisgIHJlc3VsdCAgIDo9IHByb2Nlc3Nvci5wcm9jZXNzKCBwcm90b2NvbCwgb3Byb3QsIGV2ZW50cyk7CitlbmQ7CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMWIzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMKQEAgLTAsMCArMSwxMTE3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3Q7CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBNYXRoLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVXRpbHM7CisKK3R5cGUKKyAgSUNvbXBhY3RQcm90b2NvbCA9IGludGVyZmFjZSggSVByb3RvY29sKQorICAgIFsne0MwMTkyN0VDLTAyMUEtNDVGNy05M0IxLTIzRDZBNTQyMEVERH0nXQorICBlbmQ7CisKKyAgLy8gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICAvLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCisgIFRDb21wYWN0UHJvdG9jb2xJbXBsID0gY2xhc3MoIFRQcm90b2NvbEltcGwsIElDb21wYWN0UHJvdG9jb2wpCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRGYWN0b3J5ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvdG9jb2xGYWN0b3J5KQorICAgICAgcHVibGljCisgICAgICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKKyAgICAgIGVuZDsKKworICBwcml2YXRlIGNvbnN0CisKKyAgICB7IFRPRE8KKyAgICBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TdG9wLCAoc2hvcnQpMCk7CisgICAgfQorCisgICAgUFJPVE9DT0xfSUQgICAgICAgPSBCeXRlKCAkODIpOworICAgIFZFUlNJT04gICAgICAgICAgID0gQnl0ZSggMSk7CisgICAgVkVSU0lPTl9NQVNLICAgICAgPSBCeXRlKCAkMUYpOyAvLyAwMDAxIDExMTEKKyAgICBUWVBFX01BU0sgICAgICAgICA9IEJ5dGUoICRFMCk7IC8vIDExMTAgMDAwMAorICAgIFRZUEVfQklUUyAgICAgICAgID0gQnl0ZSggJDA3KTsgLy8gMDAwMCAwMTExCisgICAgVFlQRV9TSElGVF9BTU9VTlQgPSBCeXRlKCA1KTsKKworICBwcml2YXRlIHR5cGUKKyAgICAvLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICBUeXBlcyA9ICgKKyAgICAgIFNUT1AgICAgICAgICAgPSAkMDAsCisgICAgICBCT09MRUFOX1RSVUUgID0gJDAxLAorICAgICAgQk9PTEVBTl9GQUxTRSA9ICQwMiwKKyAgICAgIEJZVEVfICAgICAgICAgPSAkMDMsCisgICAgICBJMTYgICAgICAgICAgID0gJDA0LAorICAgICAgSTMyICAgICAgICAgICA9ICQwNSwKKyAgICAgIEk2NCAgICAgICAgICAgPSAkMDYsCisgICAgICBET1VCTEVfICAgICAgID0gJDA3LAorICAgICAgQklOQVJZICAgICAgICA9ICQwOCwKKyAgICAgIExJU1QgICAgICAgICAgPSAkMDksCisgICAgICBTRVRfICAgICAgICAgID0gJDBBLAorICAgICAgTUFQICAgICAgICAgICA9ICQwQiwKKyAgICAgIFNUUlVDVCAgICAgICAgPSAkMEMKKyAgICApOworCisgIHByaXZhdGUgY29uc3QKKyAgICB0dHlwZVRvQ29tcGFjdFR5cGUgOiBhcnJheVtUVHlwZV0gb2YgVHlwZXMgPSAoCisgICAgICBUeXBlcy5TVE9QLCAgICAgICAgICAgLy8gU3RvcCAgICA9IDAsCisgICAgICBUeXBlcygtMSksICAgICAgICAgICAgLy8gVm9pZCAgICA9IDEsCisgICAgICBUeXBlcy5CT09MRUFOX1RSVUUsICAgLy8gQm9vbF8gICA9IDIsCisgICAgICBUeXBlcy5CWVRFXywgICAgICAgICAgLy8gQnl0ZV8gICA9IDMsCisgICAgICBUeXBlcy5ET1VCTEVfLCAgICAgICAgLy8gRG91YmxlXyA9IDQsCisgICAgICBUeXBlcygtNSksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JMTYsICAgICAgICAgICAgLy8gSTE2ICAgICA9IDYsCisgICAgICBUeXBlcygtNyksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JMzIsICAgICAgICAgICAgLy8gSTMyICAgICA9IDgsCisgICAgICBUeXBlcygtOSksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JNjQsICAgICAgICAgICAgLy8gSTY0ICAgICA9IDEwLAorICAgICAgVHlwZXMuQklOQVJZLCAgICAgICAgIC8vIFN0cmluZ18gPSAxMSwKKyAgICAgIFR5cGVzLlNUUlVDVCwgICAgICAgICAvLyBTdHJ1Y3QgID0gMTIsCisgICAgICBUeXBlcy5NQVAsICAgICAgICAgICAgLy8gTWFwICAgICA9IDEzLAorICAgICAgVHlwZXMuU0VUXywgICAgICAgICAgIC8vIFNldF8gICAgPSAxNCwKKyAgICAgIFR5cGVzLkxJU1QgICAgICAgICAgICAvLyBMaXN0ICAgID0gMTUsCisgICAgKTsKKworICAgIHRjb21wYWN0VHlwZVRvVHlwZSA6IGFycmF5W1R5cGVzXSBvZiBUVHlwZSA9ICgKKyAgICAgIFRUeXBlLlN0b3AsICAgICAgIC8vIFNUT1AKKyAgICAgIFRUeXBlLkJvb2xfLCAgICAgIC8vIEJPT0xFQU5fVFJVRQorICAgICAgVFR5cGUuQm9vbF8sICAgICAgLy8gQk9PTEVBTl9GQUxTRQorICAgICAgVFR5cGUuQnl0ZV8sICAgICAgLy8gQllURV8KKyAgICAgIFRUeXBlLkkxNiwgICAgICAgIC8vIEkxNgorICAgICAgVFR5cGUuSTMyLCAgICAgICAgLy8gSTMyCisgICAgICBUVHlwZS5JNjQsICAgICAgICAvLyBJNjQKKyAgICAgIFRUeXBlLkRvdWJsZV8sICAgIC8vIERPVUJMRV8KKyAgICAgIFRUeXBlLlN0cmluZ18sICAgIC8vIEJJTkFSWQorICAgICAgVFR5cGUuTGlzdCwgICAgICAgLy8gTElTVAorICAgICAgVFR5cGUuU2V0XywgICAgICAgLy8gU0VUXworICAgICAgVFR5cGUuTWFwLCAgICAgICAgLy8gTUFQCisgICAgICBUVHlwZS5TdHJ1Y3QgICAgICAvLyBTVFJVQ1QKKyAgICApOworCisgIHByaXZhdGUKKyAgICAvLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgIC8vIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgbGFzdEZpZWxkXyA6IFRTdGFjazxJbnRlZ2VyPjsKKyAgICBsYXN0RmllbGRJZF8gOiBJbnRlZ2VyOworCisgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgLy8gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgIHByaXZhdGUgYm9vbGVhbkZpZWxkXyA6IFRUaHJpZnRGaWVsZDsKKworICAgIC8vIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgorICAgIC8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgIHByaXZhdGUgIGJvb2xWYWx1ZV8gIDogKCB1bnVzZWQsIGJvb2xfdHJ1ZSwgYm9vbF9mYWxzZSk7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IHRyYW5zIDogSVRyYW5zcG9ydCk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisKKyAgcHJpdmF0ZQorICAgIHByb2NlZHVyZSBXcml0ZUJ5dGVEaXJlY3QoIGNvbnN0IGIgOiBCeXRlKTsgIG92ZXJsb2FkOworCisgICAgLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZURpcmVjdCggY29uc3QgbiA6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIC8vIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KKyAgICBwcm9jZWR1cmUgV3JpdGVWYXJpbnQzMiggbiA6IENhcmRpbmFsKTsKKworICBwcml2YXRlCisgICAgLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgJ3R5cGUgb3ZlcnJpZGUnCisgICAgLy8gb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZSBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBjb25zdCBmaWVsZCA6IFRUaHJpZnRGaWVsZDsgdHlwZU92ZXJyaWRlIDogQnl0ZSk7CisKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkdWI6IERvdWJsZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcmxvYWQ7IG92ZXJyaWRlOworCisgIHByaXZhdGUKKyAgICBjbGFzcyBmdW5jdGlvbiAgRG91YmxlVG9JbnQ2NEJpdHMoIGNvbnN0IGRiIDogRG91YmxlKSA6IEludDY0OworICAgIGNsYXNzIGZ1bmN0aW9uICBJbnQ2NEJpdHNUb0RvdWJsZSggY29uc3QgaTY0IDogSW50NjQpIDogRG91YmxlOworCisgICAgLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgIC8vIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAgICBwcm9jZWR1cmUgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGNvbnN0IGVsZW1UeXBlIDogVFR5cGU7IHNpemUgOiBJbnRlZ2VyKTsKKworICAgIHByb2NlZHVyZSBXcml0ZVZhcmludDY0KCBuIDogVUludDY0KTsKKworICAgIC8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgY2xhc3MgZnVuY3Rpb24gIGxvbmdUb1ppZ3phZyggY29uc3QgbiA6IEludDY0KSA6IFVJbnQ2NDsKKworICAgIC8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgIC8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICBjbGFzcyBmdW5jdGlvbiBpbnRUb1ppZ1phZyggY29uc3QgbiA6IEludGVnZXIpIDogQ2FyZGluYWw7CisKKyAgICAvL0NvbnZlcnQgYSBJbnQ2NCBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcgdW50aWwgb2ZmKzcuCisgICAgY2xhc3MgcHJvY2VkdXJlIGZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CisKKyAgcHVibGljCisgICAgZnVuY3Rpb24gIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRJMTY6IFNtYWxsSW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEkzMjogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZERvdWJsZTpEb3VibGU7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkQmluYXJ5OiBUQnl0ZXM7IG92ZXJsb2FkOyBvdmVycmlkZTsKKworICBwcml2YXRlCisgICAgLy8gSW50ZXJuYWwgUmVhZGluZyBtZXRob2RzCisKKyAgICAvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAgZnVuY3Rpb24gUmVhZFZhcmludDMyIDogQ2FyZGluYWw7CisKKyAgICAvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICBmdW5jdGlvbiBSZWFkVmFyaW50NjQgOiBVSW50NjQ7CisKKworICAgIC8vIGVuY29kaW5nIGhlbHBlcnMKKworICAgIC8vIENvbnZlcnQgZnJvbSB6aWd6YWcgSW50ZWdlciB0byBJbnRlZ2VyLgorICAgIGNsYXNzIGZ1bmN0aW9uIHppZ3phZ1RvSW50KCBjb25zdCBuIDogQ2FyZGluYWwgKSA6IEludGVnZXI7CisKKyAgICAvLyBDb252ZXJ0IGZyb20gemlnemFnIEludDY0IHRvIEludDY0LgorICAgIGNsYXNzIGZ1bmN0aW9uIHppZ3phZ1RvTG9uZyggY29uc3QgbiA6IFVJbnQ2NCkgOiBJbnQ2NDsKKworICAgIC8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBJbnQ2NCBsaXRlcmFscywKKyAgICAvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBJbnRlZ2VyIGxlZnQgNTYgYml0cywKKyAgICAvLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgSW50ZWdlci4KKyAgICBjbGFzcyBmdW5jdGlvbiBieXRlc1RvTG9uZyggY29uc3QgYnl0ZXMgOiBUQnl0ZXMpIDogSW50NjQ7CisKKyAgICAvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKyAgICBjbGFzcyBmdW5jdGlvbiBpc0Jvb2xUeXBlKCBjb25zdCBiIDogYnl0ZSkgOiBCb29sZWFuOworCisgICAgLy8gR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIFRUeXBlIHZhbHVlLgorICAgIGNsYXNzIGZ1bmN0aW9uIGdldFRUeXBlKCBjb25zdCB0eXBlXyA6IGJ5dGUpIDogVFR5cGU7CisKKyAgICAvLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgorICAgIGNsYXNzIGZ1bmN0aW9uIGdldENvbXBhY3RUeXBlKCBjb25zdCB0dHlwZSA6IFRUeXBlKSA6IEJ5dGU7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKKworLy8tLS0gVENvbXBhY3RQcm90b2NvbEltcGwuVEZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKK2JlZ2luCisgIHJlc3VsdCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zKTsKK2VuZDsKKworCisvLy0tLSBUQ29tcGFjdFByb3RvY29sSW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY29uc3RydWN0b3IgVENvbXBhY3RQcm90b2NvbEltcGwuQ3JlYXRlKGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIHRyYW5zKTsKKworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgbGFzdEZpZWxkXyA6PSBUU3RhY2s8SW50ZWdlcj4uQ3JlYXRlOworCisgIEluaXQoIGJvb2xlYW5GaWVsZF8sICcnLCBUVHlwZS5TdG9wLCAwKTsKKyAgYm9vbFZhbHVlXyA6PSB1bnVzZWQ7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUQ29tcGFjdFByb3RvY29sSW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggbGFzdEZpZWxkXyk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlc2V0OworYmVnaW4KKyAgbGFzdEZpZWxkXy5DbGVhcigpOworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgSW5pdCggYm9vbGVhbkZpZWxkXywgJycsIFRUeXBlLlN0b3AsIDApOworICBib29sVmFsdWVfIDo9IHVudXNlZDsKK2VuZDsKKworCisvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKy8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlRGlyZWN0KCBjb25zdCBiIDogQnl0ZSk7CitiZWdpbgorICBUcmFuc3BvcnQuV3JpdGUoIEBiLCBTaXplT2YoYikpOworZW5kOworCisKKy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQnl0ZURpcmVjdCggY29uc3QgbiA6IEludGVnZXIpOworYmVnaW4KKyAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKG4pKTsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlVmFyaW50MzIoIG4gOiBDYXJkaW5hbCk7Cit2YXIgaTMyYnVmIDogVEJ5dGVzOworICAgIGlkeCA6IEludGVnZXI7CitiZWdpbgorICBTZXRMZW5ndGgoIGkzMmJ1ZiwgNSk7CisgIGlkeCA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgQVNTRVJUKCBpZHggPCBMZW5ndGgoaTMyYnVmKSk7CisKKyAgICAvLyBsYXN0IHBhcnQ/CisgICAgaWYgKChuIGFuZCBub3QgJDdGKSA9IDApIHRoZW4gYmVnaW4KKyAgICAgIGkzMmJ1ZltpZHhdIDo9IEJ5dGUobik7CisgICAgICBJbmMoaWR4KTsKKyAgICAgIEJyZWFrOworICAgIGVuZDsKKworICAgIGkzMmJ1ZltpZHhdIDo9IEJ5dGUoKG4gYW5kICQ3Rikgb3IgJDgwKTsKKyAgICBJbmMoaWR4KTsKKyAgICBuIDo9IG4gc2hyIDc7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIGkzMmJ1ZiwgMCwgaWR4KTsKK2VuZDsKKworCisvLyBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisvLyBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7Cit2YXIgdmVyc2lvbkFuZFR5cGUgOiBCeXRlOworYmVnaW4KKyAgUmVzZXQ7CisKKyAgdmVyc2lvbkFuZFR5cGUgOj0gQnl0ZSggVkVSU0lPTiBhbmQgVkVSU0lPTl9NQVNLKQorICAgICAgICAgICAgICAgICBvciBCeXRlKCAoQ2FyZGluYWwobXNnLlR5cGVfKSBzaGwgVFlQRV9TSElGVF9BTU9VTlQpIGFuZCBUWVBFX01BU0spOworCisgIFdyaXRlQnl0ZURpcmVjdCggUFJPVE9DT0xfSUQpOworICBXcml0ZUJ5dGVEaXJlY3QoIHZlcnNpb25BbmRUeXBlKTsKKyAgV3JpdGVWYXJpbnQzMiggQ2FyZGluYWwobXNnLlNlcUlEKSk7CisgIFdyaXRlU3RyaW5nKCBtc2cuTmFtZSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSBpdCBhcyBhbgorLy8gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUKKy8vIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gOj0gMDsKK2VuZDsKKworCisvLyBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSB0aGlzIGFzIGFuCisvLyBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmIG9mIHRoZSBmaWVsZCBzdGFjay4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEVuZDsKK2JlZ2luCisgIGxhc3RGaWVsZElkXyA6PSBsYXN0RmllbGRfLlBvcCgpOworZW5kOworCisKKy8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorLy8gY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwgdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluCisvLyB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUgZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOworYmVnaW4KKyAgY2FzZSBmaWVsZC5UeXBlXyBvZgorICAgIFRUeXBlLkJvb2xfIDogYm9vbGVhbkZpZWxkXyA6PSBmaWVsZDsgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKyAgZWxzZQorICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAkRkYpOworICBlbmQ7CitlbmQ7CisKKworLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgJ3R5cGUgb3ZlcnJpZGUnCisvLyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIGJvb2xlYW4gZmllbGQgY2FzZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOwordmFyIHR5cGVUb1dyaXRlIDogQnl0ZTsKK2JlZ2luCisgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgaWYgdHlwZU92ZXJyaWRlID0gJEZGCisgIHRoZW4gdHlwZVRvV3JpdGUgOj0gZ2V0Q29tcGFjdFR5cGUoIGZpZWxkLlR5cGVfKQorICBlbHNlIHR5cGVUb1dyaXRlIDo9IHR5cGVPdmVycmlkZTsKKworICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgaWYgKGZpZWxkLklEID4gbGFzdEZpZWxkSWRfKSBhbmQgKChmaWVsZC5JRCAtIGxhc3RGaWVsZElkXykgPD0gMTUpCisgIHRoZW4gYmVnaW4KKyAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgV3JpdGVCeXRlRGlyZWN0KCAoKGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfKSBzaGwgNCkgb3IgdHlwZVRvV3JpdGUpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICBXcml0ZUJ5dGVEaXJlY3QoIHR5cGVUb1dyaXRlKTsKKyAgICBXcml0ZUkxNiggZmllbGQuSUQpOworICBlbmQ7CisKKyAgbGFzdEZpZWxkSWRfIDo9IGZpZWxkLklEOworZW5kOworCisKKy8vIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkU3RvcDsKK2JlZ2luCisgIFdyaXRlQnl0ZURpcmVjdCggQnl0ZSggVHlwZXMuU1RPUCkpOworZW5kOworCisKKy8vIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisvLyBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKK3ZhciBrZXksIHZhbCA6IEJ5dGU7CitiZWdpbgorICBpZiAobWFwLkNvdW50ID0gMCkKKyAgdGhlbiBXcml0ZUJ5dGVEaXJlY3QoIDApCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbCggbWFwLkNvdW50KSk7CisgICAga2V5IDo9IGdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKTsKKyAgICB2YWwgOj0gZ2V0Q29tcGFjdFR5cGUobWFwLlZhbHVlVHlwZSk7CisgICAgV3JpdGVCeXRlRGlyZWN0KCAoa2V5IHNobCA0KSBvciB2YWwpOworICBlbmQ7CitlbmQ7CisKKworLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpOworZW5kOworCisKKy8vIFdyaXRlIGEgc2V0IGhlYWRlci4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CitiZWdpbgorICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggc2V0Xy5FbGVtZW50VHlwZSwgc2V0Xy5Db3VudCk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisvLyB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorLy8gcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorLy8gT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQm9vbCggYjogQm9vbGVhbik7Cit2YXIgYnQgOiBUeXBlczsKK2JlZ2luCisgIGlmIGIKKyAgdGhlbiBidCA6PSBUeXBlcy5CT09MRUFOX1RSVUUKKyAgZWxzZSBidCA6PSBUeXBlcy5CT09MRUFOX0ZBTFNFOworCisgIGlmIGJvb2xlYW5GaWVsZF8uVHlwZV8gPSBUVHlwZS5Cb29sXyB0aGVuIGJlZ2luCisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGJvb2xlYW5GaWVsZF8sIEJ5dGUoYnQpKTsKKyAgICBib29sZWFuRmllbGRfLlR5cGVfIDo9IFRUeXBlLlN0b3A7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKGJ0KSk7CisgIGVuZDsKK2VuZDsKKworCisvLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7CitiZWdpbgorICBXcml0ZUJ5dGVEaXJlY3QoIEJ5dGUoYikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOworYmVnaW4KKyAgV3JpdGVWYXJpbnQzMiggaW50VG9aaWdaYWcoIGkxNikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7CitiZWdpbgorICBXcml0ZVZhcmludDMyKCBpbnRUb1ppZ1phZyggaTMyKSk7CitlbmQ7CisKKworLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CitiZWdpbgorICBXcml0ZVZhcmludDY0KCBsb25nVG9aaWd6YWcoIGk2NCkpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLkRvdWJsZVRvSW50NjRCaXRzKCBjb25zdCBkYiA6IERvdWJsZSkgOiBJbnQ2NDsKK2JlZ2luCisgIEFTU0VSVCggU2l6ZU9mKGRiKSA9IFNpemVPZihyZXN1bHQpKTsKKyAgTW92ZSggZGIsIHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCkpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLkludDY0Qml0c1RvRG91YmxlKCBjb25zdCBpNjQgOiBJbnQ2NCkgOiBEb3VibGU7CitiZWdpbgorICBBU1NFUlQoIFNpemVPZihpNjQpID0gU2l6ZU9mKHJlc3VsdCkpOworICBNb3ZlKCBpNjQsIHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCkpOworZW5kOworCisKKy8vIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGR1YjogRG91YmxlKTsKK3ZhciBkYXRhIDogVEJ5dGVzOworYmVnaW4KKyAgZml4ZWRMb25nVG9CeXRlcyggRG91YmxlVG9JbnQ2NEJpdHMoZHViKSwgZGF0YSk7CisgIFRyYW5zcG9ydC5Xcml0ZSggZGF0YSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7CitiZWdpbgorICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbChMZW5ndGgoYikpKTsKKyAgVHJhbnNwb3J0LldyaXRlKCBiKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTGlzdEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVTZXRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQ29sbGVjdGlvbkJlZ2luKCBjb25zdCBlbGVtVHlwZSA6IFRUeXBlOyBzaXplIDogSW50ZWdlcik7CitiZWdpbgorICBpZiBzaXplIDw9IDE0CisgIHRoZW4gV3JpdGVCeXRlRGlyZWN0KCAoc2l6ZSBzaGwgNCkgb3IgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKQorICBlbHNlIGJlZ2luCisgICAgV3JpdGVCeXRlRGlyZWN0KCAkRjAgb3IgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbChzaXplKSk7CisgIGVuZDsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVZhcmludDY0KCBuIDogVUludDY0KTsKK3ZhciB2YXJpbnQ2NG91dCA6IFRCeXRlczsKKyAgICBpZHggOiBJbnRlZ2VyOworYmVnaW4KKyAgU2V0TGVuZ3RoKCB2YXJpbnQ2NG91dCwgMTApOworICBpZHggOj0gMDsKKyAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgIEFTU0VSVCggaWR4IDwgTGVuZ3RoKHZhcmludDY0b3V0KSk7CisKKyAgICAvLyBsYXN0IG9uZT8KKyAgICBpZiAobiBhbmQgbm90IFVJbnQ2NCgkN0YpKSA9IDAgdGhlbiBiZWdpbgorICAgICAgdmFyaW50NjRvdXRbaWR4XSA6PSBCeXRlKG4pOworICAgICAgSW5jKGlkeCk7CisgICAgICBCcmVhazsKKyAgICBlbmQ7CisKKyAgICB2YXJpbnQ2NG91dFtpZHhdIDo9IEJ5dGUoKG4gYW5kICQ3Rikgb3IgJDgwKTsKKyAgICBJbmMoaWR4KTsKKyAgICBuIDo9IG4gc2hyIDc7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIHZhcmludDY0b3V0LCAwLCBpZHgpOworZW5kOworCisKKy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIEludDY0LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5sb25nVG9aaWd6YWcoIGNvbnN0IG4gOiBJbnQ2NCkgOiBVSW50NjQ7CitiZWdpbgorICAvLyB0aGVyZSBpcyBubyBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGluIERlbHBoaQorICBpZiBuID49IDAKKyAgdGhlbiByZXN1bHQgOj0gVUludDY0KG4gc2hsIDEpCisgIGVsc2UgcmVzdWx0IDo9IFVJbnQ2NChuIHNobCAxKSB4b3IgJEZGRkZGRkZGRkZGRkZGRkY7CitlbmQ7CisKKworLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgSW50ZWdlci4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoIGNvbnN0IG4gOiBJbnRlZ2VyKSA6IENhcmRpbmFsOworYmVnaW4KKyAgLy8gdGhlcmUgaXMgbm8gYXJpdGhtZXRpYyByaWdodCBzaGlmdCBpbiBEZWxwaGkKKyAgaWYgbiA+PSAwCisgIHRoZW4gcmVzdWx0IDo9IENhcmRpbmFsKG4gc2hsIDEpCisgIGVsc2UgcmVzdWx0IDo9IENhcmRpbmFsKG4gc2hsIDEpIHhvciAkRkZGRkZGRkY7CitlbmQ7CisKKworLy8gQ29udmVydCBhIEludDY0IGludG8gOCBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZgorY2xhc3MgcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLmZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CitiZWdpbgorICBTZXRMZW5ndGgoIGJ1ZiwgOCk7CisgIGJ1ZlswXSA6PSBCeXRlKCBuICAgICAgICAgYW5kICRGRik7CisgIGJ1ZlsxXSA6PSBCeXRlKChuIHNociA4KSAgYW5kICRGRik7CisgIGJ1ZlsyXSA6PSBCeXRlKChuIHNociAxNikgYW5kICRGRik7CisgIGJ1ZlszXSA6PSBCeXRlKChuIHNociAyNCkgYW5kICRGRik7CisgIGJ1Zls0XSA6PSBCeXRlKChuIHNociAzMikgYW5kICRGRik7CisgIGJ1Zls1XSA6PSBCeXRlKChuIHNociA0MCkgYW5kICRGRik7CisgIGJ1Zls2XSA6PSBCeXRlKChuIHNociA0OCkgYW5kICRGRik7CisgIGJ1Zls3XSA6PSBCeXRlKChuIHNociA1NikgYW5kICRGRik7CitlbmQ7CisKKworCisvLyBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luIDogVFRocmlmdE1lc3NhZ2U7Cit2YXIgcHJvdG9jb2xJZCwgdmVyc2lvbkFuZFR5cGUsIHZlcnNpb24sIHR5cGVfIDogQnl0ZTsKKyAgICBzZXFpZCA6IEludGVnZXI7CisgICAgbXNnTm0gOiBTdHJpbmc7CitiZWdpbgorICBSZXNldDsKKworICBwcm90b2NvbElkIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKyAgaWYgKHByb3RvY29sSWQgPD4gUFJPVE9DT0xfSUQpCisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoICdFeHBlY3RlZCBwcm90b2NvbCBpZCAnICsgSW50VG9IZXgoUFJPVE9DT0xfSUQsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBidXQgZ290ICcgKyBJbnRUb0hleChwcm90b2NvbElkLDIpKTsKKworICB2ZXJzaW9uQW5kVHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgIHZlcnNpb24gICAgICAgIDo9IEJ5dGUoIHZlcnNpb25BbmRUeXBlIGFuZCBWRVJTSU9OX01BU0spOworICBpZiAodmVyc2lvbiA8PiBWRVJTSU9OKQorICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCAnRXhwZWN0ZWQgdmVyc2lvbiAnICtJbnRUb1N0cihWRVJTSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGJ1dCBnb3QgJyArIEludFRvU3RyKHZlcnNpb24pKTsKKworICB0eXBlXyA6PSBCeXRlKCAodmVyc2lvbkFuZFR5cGUgc2hyIFRZUEVfU0hJRlRfQU1PVU5UKSBhbmQgVFlQRV9CSVRTKTsKKyAgc2VxaWQgOj0gSW50ZWdlciggUmVhZFZhcmludDMyKTsKKyAgbXNnTm0gOj0gUmVhZFN0cmluZzsKKyAgSW5pdCggcmVzdWx0LCBtc2dObSwgVE1lc3NhZ2VUeXBlKHR5cGVfKSwgc2VxaWQpOworZW5kOworCisKKy8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworYmVnaW4KKyAgbGFzdEZpZWxkXy5QdXNoKCBsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgSW5pdCggcmVzdWx0KTsKK2VuZDsKKworCisvLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgIGxhc3RGaWVsZElkXyA6PSBsYXN0RmllbGRfLlBvcCgpOworZW5kOworCisKKy8vIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKK3ZhciB0eXBlXyA6IEJ5dGU7CisgICAgZmllbGRJZCwgbW9kaWZpZXIgOiBTaG9ydEludDsKK2JlZ2luCisgIHR5cGVfIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgIGlmIHR5cGVfID0gQnl0ZShUeXBlcy5TVE9QKSB0aGVuIGJlZ2luCisgICAgSW5pdCggcmVzdWx0LCAnJywgVFR5cGUuU3RvcCwgMCk7CisgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgbW9kaWZpZXIgOj0gU2hvcnRJbnQoICh0eXBlXyBhbmQgJEYwKSBzaHIgNCk7CisgIGlmIChtb2RpZmllciA9IDApCisgIHRoZW4gZmllbGRJZCA6PSBSZWFkSTE2ICAgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgZWxzZSBmaWVsZElkIDo9IFNob3J0SW50KCBsYXN0RmllbGRJZF8gKyBtb2RpZmllcik7IC8vIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKworICBJbml0KCByZXN1bHQsICcnLCBnZXRUVHlwZShCeXRlKHR5cGVfIGFuZCAkMEYpKSwgZmllbGRJZCk7CisKKyAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICBpZiBpc0Jvb2xUeXBlKHR5cGVfKSB0aGVuIGJlZ2luCisgICAgaWYgQnl0ZSh0eXBlXyBhbmQgJDBGKSA9IEJ5dGUoVHlwZXMuQk9PTEVBTl9UUlVFKQorICAgIHRoZW4gYm9vbFZhbHVlXyA6PSBib29sX3RydWUKKyAgICBlbHNlIGJvb2xWYWx1ZV8gOj0gYm9vbF9mYWxzZTsKKyAgZW5kOworCisgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICBsYXN0RmllbGRJZF8gOj0gcmVzdWx0LklEOworZW5kOworCisKKy8vIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKKy8vIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisvLyAiY29ycmVjdCIgdHlwZXMuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7Cit2YXIgc2l6ZSA6IEludGVnZXI7CisgICAga2V5QW5kVmFsdWVUeXBlIDogQnl0ZTsKKyAgICBrZXksIHZhbCA6IFRUeXBlOworYmVnaW4KKyAgc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworICBpZiBzaXplID0gMAorICB0aGVuIGtleUFuZFZhbHVlVHlwZSA6PSAwCisgIGVsc2Uga2V5QW5kVmFsdWVUeXBlIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICBrZXkgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBzaHIgNCkpOworICB2YWwgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBhbmQgJEYpKTsKKyAgSW5pdCggcmVzdWx0LCBrZXksIHZhbCwgc2l6ZSk7CisgIEFTU0VSVCggKHJlc3VsdC5LZXlUeXBlID0ga2V5KSBhbmQgKHJlc3VsdC5WYWx1ZVR5cGUgPSB2YWwpKTsKK2VuZDsKKworCisvLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKK3ZhciBzaXplX2FuZF90eXBlIDogQnl0ZTsKKyAgICBzaXplIDogSW50ZWdlcjsKKyAgICB0eXBlXyA6IFRUeXBlOworYmVnaW4KKyAgc2l6ZV9hbmRfdHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisKKyAgc2l6ZSA6PSAoc2l6ZV9hbmRfdHlwZSBzaHIgNCkgYW5kICQwRjsKKyAgaWYgKHNpemUgPSAxNSkKKyAgdGhlbiBzaXplIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisKKyAgdHlwZV8gOj0gZ2V0VFR5cGUoIHNpemVfYW5kX3R5cGUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKK2VuZDsKKworCisvLyBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisvLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7Cit2YXIgc2l6ZV9hbmRfdHlwZSA6IEJ5dGU7CisgICAgc2l6ZSA6IEludGVnZXI7CisgICAgdHlwZV8gOiBUVHlwZTsKK2JlZ2luCisgIHNpemVfYW5kX3R5cGUgOj0gQnl0ZSggUmVhZEJ5dGUpOworCisgIHNpemUgOj0gKHNpemVfYW5kX3R5cGUgc2hyIDQpIGFuZCAkMEY7CisgIGlmIChzaXplID0gMTUpCisgIHRoZW4gc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworCisgIHR5cGVfIDo9IGdldFRUeXBlKCBzaXplX2FuZF90eXBlKTsKKyAgSW5pdCggcmVzdWx0LCB0eXBlXywgc2l6ZSk7CitlbmQ7CisKKworLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorLy8gYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkQm9vbDogQm9vbGVhbjsKK2JlZ2luCisgIGlmIGJvb2xWYWx1ZV8gPD4gdW51c2VkIHRoZW4gYmVnaW4KKyAgICByZXN1bHQgOj0gKGJvb2xWYWx1ZV8gPSBib29sX3RydWUpOworICAgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOworICAgIEV4aXQ7CisgIGVuZDsKKworICByZXN1bHQgOj0gKEJ5dGUoUmVhZEJ5dGUpID0gQnl0ZShUeXBlcy5CT09MRUFOX1RSVUUpKTsKK2VuZDsKKworCisvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkQnl0ZTogU2hvcnRJbnQ7CitiZWdpbgorICBUcmFuc3BvcnQuUmVhZEFsbCggQHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCksIDAsIDEpOworZW5kOworCisKKy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEkxNjogU21hbGxJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gU21hbGxJbnQoIHppZ3phZ1RvSW50KCBSZWFkVmFyaW50MzIpKTsKK2VuZDsKKworCisvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRJMzI6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gemlnemFnVG9JbnQoIFJlYWRWYXJpbnQzMik7CitlbmQ7CisKKworLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkSTY0OiBJbnQ2NDsKK2JlZ2luCisgIHJlc3VsdCA6PSB6aWd6YWdUb0xvbmcoIFJlYWRWYXJpbnQ2NCk7CitlbmQ7CisKKworLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkRG91YmxlOkRvdWJsZTsKK3ZhciBsb25nQml0cyA6IFRCeXRlczsKK2JlZ2luCisgIFNldExlbmd0aCggbG9uZ0JpdHMsIDgpOworICBUcmFuc3BvcnQuUmVhZEFsbCggbG9uZ0JpdHMsIDAsIDgpOworICByZXN1bHQgOj0gSW50NjRCaXRzVG9Eb3VibGUoIGJ5dGVzVG9Mb25nKCBsb25nQml0cykpOworZW5kOworCisKKy8vIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRCaW5hcnk6IFRCeXRlczsKK3ZhciBsZW5ndGggOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuZ3RoIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisgIFNldExlbmd0aCggcmVzdWx0LCBsZW5ndGgpOworICBpZiAobGVuZ3RoID4gMCkKKyAgdGhlbiBUcmFuc3BvcnQuUmVhZEFsbCggcmVzdWx0LCAwLCBsZW5ndGgpOworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWFwRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFNldEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCisKKy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFZhcmludDMyIDogQ2FyZGluYWw7Cit2YXIgc2hpZnQgOiBJbnRlZ2VyOworICAgIGIgOiBCeXRlOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHNoaWZ0ICA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgYiA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgICAgcmVzdWx0IDo9IHJlc3VsdCBvciAoQ2FyZGluYWwoYiBhbmQgJDdGKSBzaGwgc2hpZnQpOworICAgIGlmICgoYiBhbmQgJDgwKSA8PiAkODApCisgICAgdGhlbiBCcmVhazsKKyAgICBJbmMoIHNoaWZ0LCA3KTsKKyAgZW5kOworZW5kOworCisKKy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkVmFyaW50NjQgOiBVSW50NjQ7Cit2YXIgc2hpZnQgOiBJbnRlZ2VyOworICAgIGIgOiBCeXRlOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHNoaWZ0ICA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgYiA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgICAgcmVzdWx0IDo9IHJlc3VsdCBvciAoVUludDY0KGIgYW5kICQ3Rikgc2hsIHNoaWZ0KTsKKyAgICBpZiAoKGIgYW5kICQ4MCkgPD4gJDgwKQorICAgIHRoZW4gQnJlYWs7CisgICAgSW5jKCBzaGlmdCwgNyk7CisgIGVuZDsKK2VuZDsKKworCisvLyBDb252ZXJ0IGZyb20gemlnemFnIEludGVnZXIgdG8gSW50ZWdlci4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KCBjb25zdCBuIDogQ2FyZGluYWwgKSA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gSW50ZWdlcihuIHNociAxKSB4b3IgKC1JbnRlZ2VyKG4gYW5kIDEpKTsKK2VuZDsKKworCisvLyBDb252ZXJ0IGZyb20gemlnemFnIEludDY0IHRvIEludDY0LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9Mb25nKCBjb25zdCBuIDogVUludDY0KSA6IEludDY0OworYmVnaW4KKyAgcmVzdWx0IDo9IEludDY0KG4gc2hyIDEpIHhvciAoLUludDY0KG4gYW5kIDEpKTsKK2VuZDsKKworCisvLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgSW50NjQgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBJbnRlZ2VyIGxlZnQgNTYgYml0cywKKy8vIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBJbnRlZ2VyLgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuYnl0ZXNUb0xvbmcoIGNvbnN0IGJ5dGVzIDogVEJ5dGVzKSA6IEludDY0OworYmVnaW4KKyAgQVNTRVJUKCBMZW5ndGgoYnl0ZXMpID49IDgpOworICByZXN1bHQgOj0gKEludDY0KGJ5dGVzWzddIGFuZCAkRkYpIHNobCA1Nikgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1s2XSBhbmQgJEZGKSBzaGwgNDgpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbNV0gYW5kICRGRikgc2hsIDQwKSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzRdIGFuZCAkRkYpIHNobCAzMikgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1szXSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbMl0gYW5kICRGRikgc2hsIDE2KSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzFdIGFuZCAkRkYpIHNobCAgOCkgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1swXSBhbmQgJEZGKSk7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuaXNCb29sVHlwZSggY29uc3QgYiA6IGJ5dGUpIDogQm9vbGVhbjsKK3ZhciBsb3dlck5pYmJsZSA6IEJ5dGU7CitiZWdpbgorICBsb3dlck5pYmJsZSA6PSBiIGFuZCAkMGY7CisgIHJlc3VsdCA6PSAoVHlwZXMobG93ZXJOaWJibGUpIGluIFtUeXBlcy5CT09MRUFOX1RSVUUsIFR5cGVzLkJPT0xFQU5fRkFMU0VdKTsKK2VuZDsKKworCisvLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVFR5cGUgdmFsdWUuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5nZXRUVHlwZSggY29uc3QgdHlwZV8gOiBieXRlKSA6IFRUeXBlOwordmFyIHRjdCA6IFR5cGVzOworYmVnaW4KKyAgdGN0IDo9IFR5cGVzKCB0eXBlXyBhbmQgJDBGKTsKKyAgaWYgdGN0IGluIFtMb3coVHlwZXMpLi5IaWdoKFR5cGVzKV0KKyAgdGhlbiByZXN1bHQgOj0gdGNvbXBhY3RUeXBlVG9UeXBlW3RjdF0KKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ2RvbicndCBrbm93IHdoYXQgdHlwZTogJytJbnRUb1N0cihPcmQodGN0KSkpOworZW5kOworCisKKy8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5nZXRDb21wYWN0VHlwZSggY29uc3QgdHR5cGUgOiBUVHlwZSkgOiBCeXRlOworYmVnaW4KKyAgaWYgdHR5cGUgaW4gVkFMSURfVFRZUEVTCisgIHRoZW4gcmVzdWx0IDo9IEJ5dGUoIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV0pCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdkb24nJ3Qga25vdyB3aGF0IHR5cGU6ICcrSW50VG9TdHIoT3JkKHR0eXBlKSkpOworZW5kOworCisKKy8vLS0tIHVuaXQgdGVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3REb3VibGVUb0ludDY0Qml0czsKKworICBwcm9jZWR1cmUgVGVzdFBhaXIoIGNvbnN0IGEgOiBEb3VibGU7IGNvbnN0IGIgOiBJbnQ2NCk7CisgIGJlZ2luCisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5Eb3VibGVUb0ludDY0Qml0cyhhKSA9IGIpOworICAgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuSW50NjRCaXRzVG9Eb3VibGUoYikgPSBhKTsKKyAgZW5kOworCitiZWdpbgorICBUZXN0UGFpciggMS4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NCgkM0ZGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMS41MDAwMDAwMDAwMDAwMDAwRSswMDEsICBJbnQ2NCgkNDAyRTAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMi41NTAwMDAwMDAwMDAwMDAwRSswMDIsICBJbnQ2NCgkNDA2RkUwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggNC4yOTQ5NjcyOTUwMDAwMDAwRSswMDksICBJbnQ2NCgkNDFFRkZGRkZGRkUwMDAwMCkpOworICBUZXN0UGFpciggMy45MDYyNTAwMDAwMDAwMDAwRS0wMDMsICBJbnQ2NCgkM0Y3MDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMi4zMjgzMDY0MzY1Mzg2OTYzRS0wMTAsICBJbnQ2NCgkM0RGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjMwMDAwRS0zMDAsICBJbnQ2NCgkMDFBQTc0RkUxQzFFN0U0NSkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTAwRS0xNTAsICBJbnQ2NCgkMjBEMDJBMzY1ODZEQjRCQikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY1RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQSkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY3RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQykpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSsxNTAsICBJbnQ2NCgkNUYxODIzNDRDRDNDREY5RikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSszMDAsICBJbnQ2NCgkN0UzRDdFRThCQ0JCRDM1MikpOworICBUZXN0UGFpciggLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCBJbnQ2NCgkRkZFRkZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsICBJbnQ2NCgkN0ZFRkZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0NjU0RS0zMjQsICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMSkpOworICBUZXN0UGFpciggMC4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0N0UtMzI0LCAgICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMSkpOworICBUZXN0UGFpciggMy4yMzc4NTkyMTAwMjA2MDkyRS0zMTksICBJbnQ2NCgkMDAwMDAwMDAwMDAwRkZGRikpOworICBUZXN0UGFpciggMS4zOTA2NzExNjE1NjY5OTU5RS0zMDksICBJbnQ2NCgkMDAwMEZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggTmVnSW5maW5pdHksICAgICAgICAgICAgICBJbnQ2NCgkRkZGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggSW5maW5pdHksICAgICAgICAgICAgICAgICBJbnQ2NCgkN0ZGMDAwMDAwMDAwMDAwMCkpOworCisgIC8vIE5hTiBpcyBzcGVjaWFsCisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuRG91YmxlVG9JbnQ2NEJpdHMoIE5hTikgPSBJbnQ2NCgkRkZGODAwMDAwMDAwMDAwMCkpOworICBBU1NFUlQoIElzTmFuKCBUQ29tcGFjdFByb3RvY29sSW1wbC5JbnQ2NEJpdHNUb0RvdWJsZSggSW50NjQoJEZGRjgwMDAwMDAwMDAwMDApKSkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3RaaWdaYWc7CisKKyAgcHJvY2VkdXJlIFRlc3QzMiggY29uc3QgdGVzdCA6IEludGVnZXIpOworICB2YXIgenogOiBDYXJkaW5hbDsKKyAgYmVnaW4KKyAgICB6eiA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZyh0ZXN0KTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KHp6KSA9IHRlc3QsIEludFRvU3RyKHRlc3QpKTsKKyAgZW5kOworCisgIHByb2NlZHVyZSBUZXN0NjQoIGNvbnN0IHRlc3QgOiBJbnQ2NCk7CisgIHZhciB6eiA6IFVJbnQ2NDsKKyAgYmVnaW4KKyAgICB6eiA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5sb25nVG9aaWd6YWcodGVzdCk7CisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0xvbmcoenopID0gdGVzdCwgSW50VG9TdHIodGVzdCkpOworICBlbmQ7CisKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKDApICA9IDAsICdwYiAjMSB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygtMSkgPSAxLCAncGIgIzIgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoMSkgID0gMiwgJ3BiICMzIHRvIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKC0yKSA9IDMsICdwYiAjNCB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygrMjE0NzQ4MzY0NykgPSA0Mjk0OTY3Mjk0LCAncGIgIzUgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoLTIxNDc0ODM2NDgpID0gNDI5NDk2NzI5NSwgJ3BiICM2IHRvIFppZ1phZycpOworCisgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDApICA9IDAsICdwYiAjMSBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDEpID0gLTEsICdwYiAjMiBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDIpICA9IDEsICdwYiAjMyBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDMpID0gLTIsICdwYiAjNCBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDQyOTQ5NjcyOTQpID0gKzIxNDc0ODM2NDcsICdwYiAjNSBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDQyOTQ5NjcyOTUpID0gLTIxNDc0ODM2NDgsICdwYiAjNiBmcm9tIFppZ1phZycpOworCisgIC8vIGJhY2sgYW5kIGZvcnRoIDMyCisgIFRlc3QzMiggMCk7CisgIGZvciBpIDo9IDAgdG8gMzAgZG8gYmVnaW4KKyAgICBUZXN0MzIoICsoSW50ZWdlcigxKSBzaGwgaSkpOworICAgIFRlc3QzMiggLShJbnRlZ2VyKDEpIHNobCBpKSk7CisgIGVuZDsKKyAgVGVzdDMyKCBJbnRlZ2VyKCQ3RkZGRkZGRikpOworICBUZXN0MzIoIEludGVnZXIoJDgwMDAwMDAwKSk7CisKKyAgLy8gYmFjayBhbmQgZm9ydGggNjQKKyAgVGVzdDY0KCAwKTsKKyAgZm9yIGkgOj0gMCB0byA2MiBkbyBiZWdpbgorICAgIFRlc3Q2NCggKyhJbnQ2NCgxKSBzaGwgaSkpOworICAgIFRlc3Q2NCggLShJbnQ2NCgxKSBzaGwgaSkpOworICBlbmQ7CisgIFRlc3Q2NCggSW50NjQoJDdGRkZGRkZGRkZGRkZGRkYpKTsKKyAgVGVzdDY0KCBJbnQ2NCgkODAwMDAwMDAwMDAwMDAwMCkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3RMb25nQnl0ZXM7CisKKyAgcHJvY2VkdXJlIFRlc3QoIGNvbnN0IHRlc3QgOiBJbnQ2NCk7CisgIHZhciBidWYgOiBUQnl0ZXM7CisgIGJlZ2luCisgICAgVENvbXBhY3RQcm90b2NvbEltcGwuZml4ZWRMb25nVG9CeXRlcyggdGVzdCwgYnVmKTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmJ5dGVzVG9Mb25nKCBidWYpID0gdGVzdCwgSW50VG9TdHIodGVzdCkpOworICBlbmQ7CisKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIFRlc3QoIDApOworICBmb3IgaSA6PSAwIHRvIDYyIGRvIGJlZ2luCisgICAgVGVzdCggKyhJbnQ2NCgxKSBzaGwgaSkpOworICAgIFRlc3QoIC0oSW50NjQoMSkgc2hsIGkpKTsKKyAgZW5kOworICBUZXN0KCBJbnQ2NCgkN0ZGRkZGRkZGRkZGRkZGRikpOworICBUZXN0KCBJbnQ2NCgkODAwMDAwMDAwMDAwMDAwMCkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFVuaXRUZXN0OwordmFyIHcgOiBXT1JEOworY29uc3QgRlBVX0NXX0RFTk9STUFMSVpFRCA9ICQwMDAyOworYmVnaW4KKyAgdyA6PSBHZXQ4MDg3Q1c7CisgIHRyeQorICAgIFNldDgwODdDVyggdyBvciBGUFVfQ1dfREVOT1JNQUxJWkVEKTsKKworICAgIFRlc3REb3VibGVUb0ludDY0Qml0czsKKyAgICBUZXN0WmlnWmFnOworICAgIFRlc3RMb25nQnl0ZXM7CisKKyAgZmluYWxseQorICAgIFNldDgwODdDVyggdyk7CisgIGVuZDsKK2VuZDsKK3skRU5ESUZ9CisKKworaW5pdGlhbGl6YXRpb24KKyAgeyRJRkRFRiBEZWJ1Z30KKyAgVW5pdFRlc3Q7CisgIHskRU5ESUZ9CisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNjAwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKQEAgLTAsMCArMSwxMjM3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LlByb3RvY29sLkpTT047CisKK2ludGVyZmFjZQorCit1c2VzCisgIENoYXJhY3RlciwKKyAgQ2xhc3NlcywKKyAgU3lzVXRpbHMsCisgIE1hdGgsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5VdGlsczsKKwordHlwZQorICBJSlNPTlByb3RvY29sID0gaW50ZXJmYWNlKCBJUHJvdG9jb2wpCisgICAgWyd7RjBEQUZEQkQtNjkyQS00QjcxLTk3MzYtRjVENDg1QTIxNzhGfSddCisgICAgLy8gUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGI7IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgIHByb2NlZHVyZSBSZWFkSlNPTlN5bnRheENoYXIoIGIgOiBCeXRlKTsKKyAgZW5kOworCisgIC8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAgLy8gVGhpcyBpcyBhIGZ1bGwtZmVhdHVyZWQgcHJvdG9jb2wgc3VwcG9ydGluZyBXcml0ZSBhbmQgUmVhZC4KKyAgLy8gUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvdG9jb2wncyB3aXJlIGZvcm1hdC4KKyAgLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorICBUSlNPTlByb3RvY29sSW1wbCA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsLCBJSlNPTlByb3RvY29sKQorICBwdWJsaWMKKyAgICB0eXBlCisgICAgICBURmFjdG9yeSA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb3RvY29sRmFjdG9yeSkKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBHZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CisgICAgICBlbmQ7CisKKyAgcHJpdmF0ZQorICAgIGNsYXNzIGZ1bmN0aW9uIEdldFR5cGVOYW1lRm9yVHlwZUlEKHR5cGVJRCA6IFRUeXBlKSA6IHN0cmluZzsKKyAgICBjbGFzcyBmdW5jdGlvbiBHZXRUeXBlSURGb3JUeXBlTmFtZSggY29uc3QgbmFtZSA6IHN0cmluZykgOiBUVHlwZTsKKworICBwcm90ZWN0ZWQKKyAgICB0eXBlCisgICAgICAvLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKKyAgICAgIC8vIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycy4KKyAgICAgIC8vIFRoaXMgYmFzZSBjb250ZXh0IGRvZXMgbm90aGluZy4KKyAgICAgIFRKU09OQmFzZUNvbnRleHQgPSBjbGFzcworICAgICAgcHJvdGVjdGVkCisgICAgICAgIEZQcm90byA6IFBvaW50ZXI7ICAvLyB3ZWFrIElKU09OUHJvdG9jb2w7CisgICAgICBwdWJsaWMKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKKyAgICAgICAgcHJvY2VkdXJlIFdyaXRlOyAgdmlydHVhbDsKKyAgICAgICAgcHJvY2VkdXJlIFJlYWQ7ICB2aXJ0dWFsOworICAgICAgICBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzIDogQm9vbGVhbjsgIHZpcnR1YWw7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIENvbnRleHQgZm9yIEpTT04gbGlzdHMuCisgICAgICAvLyBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IG9uZS4KKyAgICAgIFRKU09OTGlzdENvbnRleHQgPSBjbGFzcyggVEpTT05CYXNlQ29udGV4dCkKKyAgICAgIHByaXZhdGUKKyAgICAgICAgRkZpcnN0IDogQm9vbGVhbjsKKyAgICAgIHB1YmxpYworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQcm90byA6IElKU09OUHJvdG9jb2wpOworICAgICAgICBwcm9jZWR1cmUgV3JpdGU7ICBvdmVycmlkZTsKKyAgICAgICAgcHJvY2VkdXJlIFJlYWQ7ICBvdmVycmlkZTsKKyAgICAgIGVuZDsKKworICAgICAgLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLiBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24gb2YgZWFjaCByZWNvcmQKKyAgICAgIC8vIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycworICAgICAgLy8gaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlIGVzY2FwZWQgaW4gcXVvdGVzIChzaW5jZSBKU09OIGtleXMgbXVzdCBiZSBzdHJpbmdzKS4KKyAgICAgIFRKU09OUGFpckNvbnRleHQgPSBjbGFzcyggVEpTT05CYXNlQ29udGV4dCkKKyAgICAgIHByaXZhdGUKKyAgICAgICAgRkZpcnN0LCBGQ29sb24gOiBCb29sZWFuOworICAgICAgcHVibGljCisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CisgICAgICAgIHByb2NlZHVyZSBXcml0ZTsgIG92ZXJyaWRlOworICAgICAgICBwcm9jZWR1cmUgUmVhZDsgIG92ZXJyaWRlOworICAgICAgICBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzIDogQm9vbGVhbjsgIG92ZXJyaWRlOworICAgICAgZW5kOworCisgICAgICAvLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKKyAgICAgIFRMb29rYWhlYWRSZWFkZXIgPSBjbGFzcworICAgICAgcHJvdGVjdGVkCisgICAgICAgIEZQcm90byA6IFBvaW50ZXI7ICAvLyB3ZWFrIElKU09OUHJvdG9jb2w7CisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CisKKyAgICAgIHByaXZhdGUKKyAgICAgICAgRkhhc0RhdGEgOiBCb29sZWFuOworICAgICAgICBGRGF0YSAgICA6IEJ5dGU7CisKKyAgICAgIHB1YmxpYworICAgICAgICAvLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgIC8vIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgICAgICBmdW5jdGlvbiBSZWFkIDogQnl0ZTsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCisgICAgICAgIC8vIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgIGZ1bmN0aW9uIFBlZWsgOiBCeXRlOworICAgICAgZW5kOworCisgIHByb3RlY3RlZAorICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgIEZDb250ZXh0U3RhY2sgOiBUU3RhY2s8VEpTT05CYXNlQ29udGV4dD47CisKKyAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICBGQ29udGV4dCA6IFRKU09OQmFzZUNvbnRleHQ7CisKKyAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgorICAgIEZSZWFkZXIgOiBUTG9va2FoZWFkUmVhZGVyOworCisgICAgLy8gUHVzaC9wb3AgYSBuZXcgSlNPTiBjb250ZXh0IG9udG8vZnJvbSB0aGUgc3RhY2suCisgICAgcHJvY2VkdXJlIFJlc2V0Q29udGV4dFN0YWNrOworICAgIHByb2NlZHVyZSBQdXNoQ29udGV4dCggY29uc3QgYUN0eCA6IFRKU09OQmFzZUNvbnRleHQpOworICAgIHByb2NlZHVyZSBQb3BDb250ZXh0OworCisgIHB1YmxpYworICAgIC8vIFRKU09OUHJvdG9jb2xJbXBsIENvbnN0cnVjdG9yCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhVHJhbnMgOiBJVHJhbnNwb3J0KTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICAgb3ZlcnJpZGU7CisKKyAgcHJvdGVjdGVkCisgICAgLy8gSUpTT05Qcm90b2NvbAorICAgIC8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICBwcm9jZWR1cmUgUmVhZEpTT05TeW50YXhDaGFyKCBiIDogQnl0ZSk7CisKKyAgcHJpdmF0ZQorICAgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgIGNsYXNzIGZ1bmN0aW9uIEhleFZhbCggY2ggOiBCeXRlKSA6IEJ5dGU7CisKKyAgICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IHZhbHVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICBjbGFzcyBmdW5jdGlvbiBIZXhDaGFyKCB2YWwgOiBCeXRlKSA6IEJ5dGU7CisKKyAgICAvLyBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKKyAgICBwcm9jZWR1cmUgV3JpdGVKU09OU3RyaW5nKCBjb25zdCBiIDogVEJ5dGVzKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZUpTT05TdHJpbmcoIGNvbnN0IHN0ciA6IHN0cmluZyk7ICBvdmVybG9hZDsKKworICAgIC8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQorICAgIC8vIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgIHByb2NlZHVyZSBXcml0ZUpTT05JbnRlZ2VyKCBjb25zdCBudW0gOiBJbnQ2NCk7CisKKyAgICAvLyBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCisgICAgLy8gY29udGV4dCBkaWN0YXRlcyBlc2NhcGluZywgV3JpdGUgb3V0IGFzIEpTT04gc3RyaW5nLgorICAgIHByb2NlZHVyZSBXcml0ZUpTT05Eb3VibGUoIGNvbnN0IG51bSA6IERvdWJsZSk7CisKKyAgICAvLyBXcml0ZSBvdXQgY29udGVudHMgb2YgYnl0ZSBhcnJheSBiIGFzIGEgSlNPTiBzdHJpbmcgd2l0aCBiYXNlLTY0IGVuY29kZWQgZGF0YQorICAgIHByb2NlZHVyZSBXcml0ZUpTT05CYXNlNjQoIGNvbnN0IGIgOiBUQnl0ZXMpOworCisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTk9iamVjdFN0YXJ0OworICAgIHByb2NlZHVyZSBXcml0ZUpTT05PYmplY3RFbmQ7CisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTkFycmF5U3RhcnQ7CisgICAgcHJvY2VkdXJlIFdyaXRlSlNPTkFycmF5RW5kOworCisgIHB1YmxpYworICAgIC8vIElQcm90b2NvbAorICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOyAgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcnJpZGU7CisgICAgLy8KKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMzI6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cmluZyA6IHN0cmluZzsgIG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgb3ZlcnJpZGU7CisKKworICBwcml2YXRlCisgICAgLy8gUmVhZGluZyBtZXRob2RzLgorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgorICAgIC8vIFNraXAgUmVhZGluZyBmcm9tIHRoZSBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgICAgZnVuY3Rpb24gUmVhZEpTT05TdHJpbmcoIHNraXBDb250ZXh0IDogQm9vbGVhbikgOiBUQnl0ZXM7CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICBmdW5jdGlvbiBJc0pTT05OdW1lcmljKCBiIDogQnl0ZSkgOiBCb29sZWFuOworCisgICAgLy8gUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcworICAgIC8vIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgICBmdW5jdGlvbiBSZWFkSlNPTk51bWVyaWNDaGFycyA6IFN0cmluZzsKKworICAgIC8vIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgICBmdW5jdGlvbiBSZWFkSlNPTkludGVnZXIgOiBJbnQ2NDsKKworICAgIC8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgIC8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgZnVuY3Rpb24gUmVhZEpTT05Eb3VibGUgOiBEb3VibGU7CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICAgIGZ1bmN0aW9uIFJlYWRKU09OQmFzZTY0IDogVEJ5dGVzOworCisgICAgcHJvY2VkdXJlIFJlYWRKU09OT2JqZWN0U3RhcnQ7CisgICAgcHJvY2VkdXJlIFJlYWRKU09OT2JqZWN0RW5kOworICAgIHByb2NlZHVyZSBSZWFkSlNPTkFycmF5U3RhcnQ7CisgICAgcHJvY2VkdXJlIFJlYWRKU09OQXJyYXlFbmQ7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCit2YXIKKyAgQ09NTUEgICAgIDogVEJ5dGVzOworICBDT0xPTiAgICAgOiBUQnl0ZXM7CisgIExCUkFDRSAgICA6IFRCeXRlczsKKyAgUkJSQUNFICAgIDogVEJ5dGVzOworICBMQlJBQ0tFVCAgOiBUQnl0ZXM7CisgIFJCUkFDS0VUICA6IFRCeXRlczsKKyAgUVVPVEUgICAgIDogVEJ5dGVzOworICBCQUNLU0xBU0ggOiBUQnl0ZXM7CisgIEVTQ1NFUSAgICA6IFRCeXRlczsKKworY29uc3QKKyAgVkVSU0lPTiA9IDE7CisgIEpTT05fQ0hBUl9UQUJMRSA6IGFycmF5WzAuLiQyRl0gb2YgQnl0ZQorICAgICAgICAgICAgICAgICAgPSAoMCwwLDAsMCwgMCwwLDAsMCwgQnl0ZSgnYicpLEJ5dGUoJ3QnKSxCeXRlKCduJyksMCwgQnl0ZSgnZicpLEJ5dGUoJ3InKSwwLDAsCisgICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLCAgMCwwLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgIDEsMSxCeXRlKCciJyksMSwgIDEsMSwxLDEsIDEsMSwxLDEsIDEsMSwxLDEpOworCisgIEVTQ0FQRV9DSEFSUyAgICAgPSAnIlwvYnRuZnInOworICBFU0NBUEVfQ0hBUl9WQUxTID0gJyJcLycjOCM5IzEwIzEyIzEzOworCisgIERFRl9TVFJJTkdfU0laRSA9IDE2OworCisgIE5BTUVfQk9PTCAgID0gJ3RmJzsKKyAgTkFNRV9CWVRFICAgPSAnaTgnOworICBOQU1FX0kxNiAgICA9ICdpMTYnOworICBOQU1FX0kzMiAgICA9ICdpMzInOworICBOQU1FX0k2NCAgICA9ICdpNjQnOworICBOQU1FX0RPVUJMRSA9ICdkYmwnOworICBOQU1FX1NUUlVDVCA9ICdyZWMnOworICBOQU1FX1NUUklORyA9ICdzdHInOworICBOQU1FX01BUCAgICA9ICdtYXAnOworICBOQU1FX0xJU1QgICA9ICdsc3QnOworICBOQU1FX1NFVCAgICA9ICdzZXQnOworCisgIElOVkFSSUFOVF9DVUxUVVJFIDogVEZvcm1hdFNldHRpbmdzCisgICAgICAgICAgICAgICAgICAgID0gKCBUaG91c2FuZFNlcGFyYXRvcjogJywnOworICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbFNlcGFyYXRvcjogJy4nKTsKKworCisKKy8vLS0tIFRKU09OUHJvdG9jb2xJbXBsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5URmFjdG9yeS5HZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CitiZWdpbgorICByZXN1bHQgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKHRyYW5zKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuR2V0VHlwZU5hbWVGb3JUeXBlSUQodHlwZUlEIDogVFR5cGUpIDogc3RyaW5nOworYmVnaW4KKyAgY2FzZSB0eXBlSUQgb2YKKyAgICBUVHlwZS5Cb29sXzogICAgcmVzdWx0IDo9IE5BTUVfQk9PTDsKKyAgICBUVHlwZS5CeXRlXzogICAgcmVzdWx0IDo9IE5BTUVfQllURTsKKyAgICBUVHlwZS5JMTY6ICAgICAgcmVzdWx0IDo9IE5BTUVfSTE2OworICAgIFRUeXBlLkkzMjogICAgICByZXN1bHQgOj0gTkFNRV9JMzI7CisgICAgVFR5cGUuSTY0OiAgICAgIHJlc3VsdCA6PSBOQU1FX0k2NDsKKyAgICBUVHlwZS5Eb3VibGVfOiAgcmVzdWx0IDo9IE5BTUVfRE9VQkxFOworICAgIFRUeXBlLlN0cmluZ186ICByZXN1bHQgOj0gTkFNRV9TVFJJTkc7CisgICAgVFR5cGUuU3RydWN0OiAgIHJlc3VsdCA6PSBOQU1FX1NUUlVDVDsKKyAgICBUVHlwZS5NYXA6ICAgICAgcmVzdWx0IDo9IE5BTUVfTUFQOworICAgIFRUeXBlLlNldF86ICAgICByZXN1bHQgOj0gTkFNRV9TRVQ7CisgICAgVFR5cGUuTGlzdDogICAgIHJlc3VsdCA6PSBOQU1FX0xJU1Q7CisgIGVsc2UKKyAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK0ludFRvU3RyKE9yZCh0eXBlSUQpKSsnKScpOworICBlbmQ7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuR2V0VHlwZUlERm9yVHlwZU5hbWUoIGNvbnN0IG5hbWUgOiBzdHJpbmcpIDogVFR5cGU7CitiZWdpbgorICBpZiAgICAgIG5hbWUgPSBOQU1FX0JPT0wgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5Cb29sXworICBlbHNlIGlmIG5hbWUgPSBOQU1FX0JZVEUgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5CeXRlXworICBlbHNlIGlmIG5hbWUgPSBOQU1FX0kxNiAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5JMTYKKyAgZWxzZSBpZiBuYW1lID0gTkFNRV9JMzIgICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuSTMyCisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfSTY0ICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLkk2NAorICBlbHNlIGlmIG5hbWUgPSBOQU1FX0RPVUJMRSB0aGVuIHJlc3VsdCA6PSBUVHlwZS5Eb3VibGVfCisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfU1RSVUNUIHRoZW4gcmVzdWx0IDo9IFRUeXBlLlN0cnVjdAorICBlbHNlIGlmIG5hbWUgPSBOQU1FX1NUUklORyB0aGVuIHJlc3VsdCA6PSBUVHlwZS5TdHJpbmdfCisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfTUFQICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLk1hcAorICBlbHNlIGlmIG5hbWUgPSBOQU1FX0xJU1QgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5MaXN0CisgIGVsc2UgaWYgbmFtZSA9IE5BTUVfU0VUICAgIHRoZW4gcmVzdWx0IDo9IFRUeXBlLlNldF8KKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK25hbWUrJyknKTsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUSlNPTlByb3RvY29sSW1wbC5USlNPTkJhc2VDb250ZXh0LkNyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGUHJvdG8gOj0gUG9pbnRlcihhUHJvdG8pOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5USlNPTkJhc2VDb250ZXh0LldyaXRlOworYmVnaW4KKyAgLy8gbm90aGluZworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5USlNPTkJhc2VDb250ZXh0LlJlYWQ7CitiZWdpbgorICAvLyBub3RoaW5nCitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVEpTT05CYXNlQ29udGV4dC5Fc2NhcGVOdW1iZXJzIDogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQUxTRTsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUSlNPTlByb3RvY29sSW1wbC5USlNPTkxpc3RDb250ZXh0LkNyZWF0ZSggY29uc3QgYVByb3RvIDogSUpTT05Qcm90b2NvbCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBhUHJvdG8pOworICBGRmlyc3QgOj0gVFJVRTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05MaXN0Q29udGV4dC5Xcml0ZTsKK2JlZ2luCisgIGlmIEZGaXJzdAorICB0aGVuIEZGaXJzdCA6PSBGQUxTRQorICBlbHNlIElKU09OUHJvdG9jb2woRlByb3RvKS5UcmFuc3BvcnQuV3JpdGUoIENPTU1BKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05MaXN0Q29udGV4dC5SZWFkOworYmVnaW4KKyAgaWYgRkZpcnN0CisgIHRoZW4gRkZpcnN0IDo9IEZBTFNFCisgIGVsc2UgSUpTT05Qcm90b2NvbChGUHJvdG8pLlJlYWRKU09OU3ludGF4Q2hhciggQ09NTUFbMF0pOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OUGFpckNvbnRleHQuQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIGFQcm90byk7CisgIEZGaXJzdCA6PSBUUlVFOworICBGQ29sb24gOj0gVFJVRTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05QYWlyQ29udGV4dC5Xcml0ZTsKK2JlZ2luCisgIGlmIEZGaXJzdCB0aGVuIGJlZ2luCisgICAgRkZpcnN0IDo9IEZBTFNFOworICAgIEZDb2xvbiA6PSBUUlVFOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIEZDb2xvbgorICAgIHRoZW4gSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5Xcml0ZSggQ09MT04pCisgICAgZWxzZSBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LldyaXRlKCBDT01NQSk7CisgICAgRkNvbG9uIDo9IG5vdCBGQ29sb247CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuVEpTT05QYWlyQ29udGV4dC5SZWFkOworYmVnaW4KKyAgaWYgRkZpcnN0IHRoZW4gYmVnaW4KKyAgICBGRmlyc3QgOj0gRkFMU0U7CisgICAgRkNvbG9uIDo9IFRSVUU7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgaWYgRkNvbG9uCisgICAgdGhlbiBJSlNPTlByb3RvY29sKEZQcm90bykuUmVhZEpTT05TeW50YXhDaGFyKCBDT0xPTlswXSkKKyAgICBlbHNlIElKU09OUHJvdG9jb2woRlByb3RvKS5SZWFkSlNPTlN5bnRheENoYXIoIENPTU1BWzBdKTsKKyAgICBGQ29sb24gOj0gbm90IEZDb2xvbjsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlRKU09OUGFpckNvbnRleHQuRXNjYXBlTnVtYmVycyA6IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gRkNvbG9uOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRKU09OUHJvdG9jb2xJbXBsLlRMb29rYWhlYWRSZWFkZXIuQ3JlYXRlKCBjb25zdCBhUHJvdG8gOiBJSlNPTlByb3RvY29sKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZQcm90byAgIDo9IFBvaW50ZXIoYVByb3RvKTsKKyAgRkhhc0RhdGEgOj0gRkFMU0U7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVExvb2thaGVhZFJlYWRlci5SZWFkIDogQnl0ZTsKK2JlZ2luCisgIGlmIEZIYXNEYXRhCisgIHRoZW4gRkhhc0RhdGEgOj0gRkFMU0UKKyAgZWxzZSBiZWdpbgorICAgIElKU09OUHJvdG9jb2woRlByb3RvKS5UcmFuc3BvcnQuUmVhZEFsbCggQEZEYXRhLCBTaXplT2YoRkRhdGEpLCAwLCAxKTsKKyAgZW5kOworICByZXN1bHQgOj0gRkRhdGE7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVExvb2thaGVhZFJlYWRlci5QZWVrIDogQnl0ZTsKK2JlZ2luCisgIGlmIG5vdCBGSGFzRGF0YSB0aGVuIGJlZ2luCisgICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBARkRhdGEsIFNpemVPZihGRGF0YSksIDAsIDEpOworICAgIEZIYXNEYXRhIDo9IFRSVUU7CisgIGVuZDsKKyAgcmVzdWx0IDo9IEZEYXRhOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSggY29uc3QgYVRyYW5zIDogSVRyYW5zcG9ydCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBhVHJhbnMpOworCisgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICBGQ29udGV4dFN0YWNrIDo9IFRTdGFjazxUSlNPTkJhc2VDb250ZXh0Pi5DcmVhdGU7CisKKyAgRkNvbnRleHQgOj0gVEpTT05CYXNlQ29udGV4dC5DcmVhdGUoIFNlbGYpOworICBGUmVhZGVyICA6PSBUTG9va2FoZWFkUmVhZGVyLkNyZWF0ZSggU2VsZik7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUSlNPTlByb3RvY29sSW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgUmVzZXRDb250ZXh0U3RhY2s7ICAvLyBmcmVlIGFueSBjb250ZW50cworICAgIEZyZWVBbmROaWwoIEZSZWFkZXIpOworICAgIEZyZWVBbmROaWwoIEZDb250ZXh0KTsKKyAgICBGcmVlQW5kTmlsKCBGQ29udGV4dFN0YWNrKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlc2V0Q29udGV4dFN0YWNrOworYmVnaW4KKyAgd2hpbGUgRkNvbnRleHRTdGFjay5Db3VudCA+IDAKKyAgZG8gUG9wQ29udGV4dDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUHVzaENvbnRleHQoIGNvbnN0IGFDdHggOiBUSlNPTkJhc2VDb250ZXh0KTsKK2JlZ2luCisgIEZDb250ZXh0U3RhY2suUHVzaCggRkNvbnRleHQpOworICBGQ29udGV4dCA6PSBhQ3R4OworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Qb3BDb250ZXh0OworYmVnaW4KKyAgRnJlZUFuZE5pbChGQ29udGV4dCk7CisgIEZDb250ZXh0IDo9IEZDb250ZXh0U3RhY2suUG9wOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTlN5bnRheENoYXIoIGIgOiBCeXRlKTsKK3ZhciBjaCA6IEJ5dGU7CitiZWdpbgorICBjaCA6PSBGUmVhZGVyLlJlYWQ7CisgIGlmIChjaCA8PiBiKQorICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnVW5leHBlY3RlZCBjaGFyYWN0ZXIgKCcrQ2hhcihjaCkrJyknKTsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5IZXhWYWwoIGNoIDogQnl0ZSkgOiBCeXRlOwordmFyIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgaSA6PSBTdHJUb0ludERlZiggJyQwJytDaGFyKGNoKSwgLTEpOworICBpZiAoMCA8PSBpKSBhbmQgKGkgPCAkMTApCisgIHRoZW4gcmVzdWx0IDo9IGkKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGhleCBjaGFyYWN0ZXIgKCcrQ2hhcihjaCkrJyknKTsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5IZXhDaGFyKCB2YWwgOiBCeXRlKSA6IEJ5dGU7Citjb25zdCBIRVhDSEFSUyA9ICcwMTIzNDU2Nzg5QUJDREVGJzsKK2JlZ2luCisgIHJlc3VsdCA6PSBCeXRlKCBQQ2hhcihIRVhDSEFSUylbdmFsIGFuZCAkMEZdKTsKKyAgQVNTRVJUKCBQb3MoIENoYXIocmVzdWx0KSwgSEVYQ0hBUlMpID4gMCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTlN0cmluZyggY29uc3Qgc3RyIDogc3RyaW5nKTsKK2JlZ2luCisgIFdyaXRlSlNPTlN0cmluZyggU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoIHN0cikpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05TdHJpbmcoIGNvbnN0IGIgOiBUQnl0ZXMpOwordmFyIGkgOiBJbnRlZ2VyOworICAgIHRtcCA6IFRCeXRlczsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworICBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKKyAgZm9yIGkgOj0gMCB0byBMZW5ndGgoYiktMSBkbyBiZWdpbgorCisgICAgaWYgKGJbaV0gYW5kICQwMEZGKSA+PSAkMzAgdGhlbiBiZWdpbgorCisgICAgICBpZiAoYltpXSA9IEJBQ0tTTEFTSFswXSkgdGhlbiBiZWdpbgorICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIEJBQ0tTTEFTSCk7CisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggQkFDS1NMQVNIKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBiZWdpbgorICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIGIsIGksIDEpOworICAgICAgZW5kOworCisgICAgZW5kCisgICAgZWxzZSBiZWdpbgorICAgICAgU2V0TGVuZ3RoKCB0bXAsIDIpOworICAgICAgdG1wWzBdIDo9IEpTT05fQ0hBUl9UQUJMRVtiW2ldXTsKKyAgICAgIGlmICh0bXBbMF0gPSAxKSB0aGVuIGJlZ2luCisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggYiwgaSwgMSkKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAodG1wWzBdID4gMSkgdGhlbiBiZWdpbgorICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIEJBQ0tTTEFTSCk7CisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggdG1wLCAwLCAxKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBiZWdpbgorICAgICAgICBUcmFuc3BvcnQuV3JpdGUoIEVTQ1NFUSk7CisgICAgICAgIHRtcFswXSA6PSBIZXhDaGFyKCBiW2ldIGRpdiAkMTApOworICAgICAgICB0bXBbMV0gOj0gSGV4Q2hhciggYltpXSk7CisgICAgICAgIFRyYW5zcG9ydC5Xcml0ZSggdG1wLCAwLCAyKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisgIGVuZDsKKyAgVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTkludGVnZXIoIGNvbnN0IG51bSA6IEludDY0KTsKK3ZhciBzdHIgOiBTdHJpbmc7CisgICAgZXNjYXBlTnVtIDogQm9vbGVhbjsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworICBzdHIgOj0gSW50VG9TdHIobnVtKTsKKworICBlc2NhcGVOdW0gOj0gRkNvbnRleHQuRXNjYXBlTnVtYmVyczsKKyAgaWYgZXNjYXBlTnVtCisgIHRoZW4gVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CisKKyAgVHJhbnNwb3J0LldyaXRlKCBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRCeXRlcyggc3RyKSk7CisKKyAgaWYgZXNjYXBlTnVtCisgIHRoZW4gVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTkRvdWJsZSggY29uc3QgbnVtIDogRG91YmxlKTsKK3ZhciBzdHIgOiBzdHJpbmc7CisgICAgc3BlY2lhbCA6IEJvb2xlYW47CisgICAgZXNjYXBlTnVtIDogQm9vbGVhbjsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworCisgIHN0ciA6PSBGbG9hdFRvU3RyKCBudW0sIElOVkFSSUFOVF9DVUxUVVJFKTsKKyAgc3BlY2lhbCA6PSBGQUxTRTsKKworICBjYXNlIFVwQ2FzZShzdHJbMV0pIG9mCisgICAgJ04nIDogc3BlY2lhbCA6PSBUUlVFOyAgLy8gTmFOCisgICAgJ0knIDogc3BlY2lhbCA6PSBUUlVFOyAgLy8gSW5maW5pdHkKKyAgICAnLScgOiBzcGVjaWFsIDo9IChVcENhc2Uoc3RyWzJdKSA9ICdJJyk7IC8vIC1JbmZpbml0eQorICBlbmQ7CisKKyAgZXNjYXBlTnVtIDo9IHNwZWNpYWwgb3IgRkNvbnRleHQuRXNjYXBlTnVtYmVyczsKKworCisgIGlmIGVzY2FwZU51bQorICB0aGVuIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworCisgIFRyYW5zcG9ydC5Xcml0ZSggU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoIHN0cikpOworCisgIGlmIGVzY2FwZU51bQorICB0aGVuIFRyYW5zcG9ydC5Xcml0ZSggUVVPVEUpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05CYXNlNjQoIGNvbnN0IGIgOiBUQnl0ZXMpOwordmFyIGxlbiwgb2ZmLCBjbnQgOiBJbnRlZ2VyOworICAgIHRtcEJ1ZiA6IFRCeXRlczsKK2JlZ2luCisgIEZDb250ZXh0LldyaXRlOworICBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKKworICBsZW4gOj0gTGVuZ3RoKGIpOworICBvZmYgOj0gMDsKKyAgU2V0TGVuZ3RoKCB0bXBCdWYsIDQpOworCisgIHdoaWxlIGxlbiA+PSAzIGRvIGJlZ2luCisgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgQmFzZTY0VXRpbHMuRW5jb2RlKCBiLCBvZmYsIDMsIHRtcEJ1ZiwgMCk7CisgICAgVHJhbnNwb3J0LldyaXRlKCB0bXBCdWYsIDAsIDQpOworICAgIEluYyggb2ZmLCAzKTsKKyAgICBEZWMoIGxlbiwgMyk7CisgIGVuZDsKKworICAvLyBFbmNvZGUgcmVtYWluZGVyLCBpZiBhbnkKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgY250IDo9IEJhc2U2NFV0aWxzLkVuY29kZSggYiwgb2ZmLCBsZW4sIHRtcEJ1ZiwgMCk7CisgICAgVHJhbnNwb3J0LldyaXRlKCB0bXBCdWYsIDAsIGNudCk7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OT2JqZWN0U3RhcnQ7CitiZWdpbgorICBGQ29udGV4dC5Xcml0ZTsKKyAgVHJhbnNwb3J0LldyaXRlKCBMQlJBQ0UpOworICBQdXNoQ29udGV4dCggVEpTT05QYWlyQ29udGV4dC5DcmVhdGUoIFNlbGYpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OT2JqZWN0RW5kOworYmVnaW4KKyAgUG9wQ29udGV4dDsKKyAgVHJhbnNwb3J0LldyaXRlKCBSQlJBQ0UpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUpTT05BcnJheVN0YXJ0OworYmVnaW4KKyAgRkNvbnRleHQuV3JpdGU7CisgIFRyYW5zcG9ydC5Xcml0ZSggTEJSQUNLRVQpOworICBQdXNoQ29udGV4dCggVEpTT05MaXN0Q29udGV4dC5DcmVhdGUoIFNlbGYpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVKU09OQXJyYXlFbmQ7CitiZWdpbgorICBQb3BDb250ZXh0OworICBUcmFuc3BvcnQuV3JpdGUoIFJCUkFDS0VUKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IGFNc2cgOiBUVGhyaWZ0TWVzc2FnZSk7CitiZWdpbgorICBSZXNldENvbnRleHRTdGFjazsgIC8vIFRIUklGVC0xNDczCisKKyAgV3JpdGVKU09OQXJyYXlTdGFydDsKKyAgV3JpdGVKU09OSW50ZWdlcihWRVJTSU9OKTsKKworICBXcml0ZUpTT05TdHJpbmcoIFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCBhTXNnLk5hbWUpKTsKKworICBXcml0ZUpTT05JbnRlZ2VyKCBMb25nSW50KCBhTXNnLlR5cGVfKSk7CisgIFdyaXRlSlNPTkludGVnZXIoIGFNc2cuU2VxSUQpOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlRW5kOworYmVnaW4KKyAgV3JpdGVKU09OQXJyYXlFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisgIFdyaXRlSlNPTk9iamVjdFN0YXJ0OworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEVuZDsKK2JlZ2luCisgIFdyaXRlSlNPTk9iamVjdEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZCA6IFRUaHJpZnRGaWVsZCk7CitiZWdpbgorICBXcml0ZUpTT05JbnRlZ2VyKGZpZWxkLklEKTsKKyAgV3JpdGVKU09OT2JqZWN0U3RhcnQ7CisgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGQuVHlwZV8pKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVGaWVsZEVuZDsKK2JlZ2luCisgIFdyaXRlSlNPTk9iamVjdEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVGaWVsZFN0b3A7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOworYmVnaW4KKyAgV3JpdGVKU09OQXJyYXlTdGFydDsKKyAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggbWFwLktleVR5cGUpKTsKKyAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggbWFwLlZhbHVlVHlwZSkpOworICBXcml0ZUpTT05JbnRlZ2VyKCBtYXAuQ291bnQpOworICBXcml0ZUpTT05PYmplY3RTdGFydDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNYXBFbmQ7CitiZWdpbgorICBXcml0ZUpTT05PYmplY3RFbmQ7CisgIFdyaXRlSlNPTkFycmF5RW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgV3JpdGVKU09OQXJyYXlTdGFydDsKKyAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggbGlzdC5FbGVtZW50VHlwZSkpOworICBXcml0ZUpTT05JbnRlZ2VyKGxpc3QuQ291bnQpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUxpc3RFbmQ7CitiZWdpbgorICBXcml0ZUpTT05BcnJheUVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCk7CitiZWdpbgorICBXcml0ZUpTT05BcnJheVN0YXJ0OworICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBzZXRfLkVsZW1lbnRUeXBlKSk7CisgIFdyaXRlSlNPTkludGVnZXIoIHNldF8uQ291bnQpOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVNldEVuZDsKK2JlZ2luCisgIFdyaXRlSlNPTkFycmF5RW5kOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVCb29sKCBiOiBCb29sZWFuKTsKK2JlZ2luCisgIGlmIGIKKyAgdGhlbiBXcml0ZUpTT05JbnRlZ2VyKCAxKQorICBlbHNlIFdyaXRlSlNPTkludGVnZXIoIDApOworZW5kOworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7CitiZWdpbgorICBXcml0ZUpTT05JbnRlZ2VyKCBiKTsKK2VuZDsKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsKK2JlZ2luCisgIFdyaXRlSlNPTkludGVnZXIoIGkxNik7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIFdyaXRlSlNPTkludGVnZXIoIGkzMik7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CitiZWdpbgorICBXcml0ZUpTT05JbnRlZ2VyKGk2NCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsKK2JlZ2luCisgIFdyaXRlSlNPTkRvdWJsZSggZCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7CitiZWdpbgorICBXcml0ZUpTT05TdHJpbmcoIFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCBzKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsKK2JlZ2luCisgIFdyaXRlSlNPTkJhc2U2NCggYik7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05TdHJpbmcoIHNraXBDb250ZXh0IDogQm9vbGVhbikgOiBUQnl0ZXM7Cit2YXIgYnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKyAgICBjaCAgOiBCeXRlOworICAgIHdjaCA6IFdvcmQ7CisgICAgaGlnaFN1cm9nYXRlOiBDaGFyOworICAgIHN1cnJvZ2F0ZVBhaXJzOiBBcnJheVswLi4xXSBvZiBDaGFyOworICAgIG9mZiA6IEludGVnZXI7CisgICAgdG1wIDogVEJ5dGVzOworYmVnaW4KKyAgaGlnaFN1cm9nYXRlIDo9ICMwOworICBidWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIHRyeQorICAgIGlmIG5vdCBza2lwQ29udGV4dAorICAgIHRoZW4gRkNvbnRleHQuUmVhZDsKKworICAgIFJlYWRKU09OU3ludGF4Q2hhciggUVVPVEVbMF0pOworCisgICAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgICAgY2ggOj0gRlJlYWRlci5SZWFkOworCisgICAgICBpZiAoY2ggPSBRVU9URVswXSkKKyAgICAgIHRoZW4gQnJlYWs7CisKKyAgICAgIC8vIGNoZWNrIGZvciBlc2NhcGVzCisgICAgICBpZiAoY2ggPD4gRVNDU0VRWzBdKSB0aGVuIGJlZ2luCisgICAgICAgIGJ1ZmZlci5Xcml0ZSggY2gsIDEpOworICAgICAgICBDb250aW51ZTsKKyAgICAgIGVuZDsKKworICAgICAgLy8gZGlzdHVpbmd1aXNoIGJldHdlZW4gXHVOTk5OIGFuZCBcPworICAgICAgY2ggOj0gRlJlYWRlci5SZWFkOworICAgICAgaWYgKGNoIDw+IEVTQ1NFUVsxXSkKKyAgICAgIHRoZW4gYmVnaW4KKyAgICAgICAgb2ZmIDo9IFBvcyggQ2hhcihjaCksIEVTQ0FQRV9DSEFSUyk7CisgICAgICAgIGlmIG9mZiA8IDEKKyAgICAgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGNvbnRyb2wgY2hhcicpOworICAgICAgICBjaCA6PSBCeXRlKCBFU0NBUEVfQ0hBUl9WQUxTW29mZl0pOworICAgICAgICBidWZmZXIuV3JpdGUoIGNoLCAxKTsKKyAgICAgICAgQ29udGludWU7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIGl0IGlzIFx1WFhYWAorICAgICAgU2V0TGVuZ3RoKCB0bXAsIDQpOworICAgICAgVHJhbnNwb3J0LlJlYWRBbGwoIHRtcCwgMCwgNCk7CisgICAgICB3Y2ggOj0gKEhleFZhbCh0bXBbMF0pIHNobCAxMikKKyAgICAgICAgICAgKyAoSGV4VmFsKHRtcFsxXSkgc2hsIDgpCisgICAgICAgICAgICsgKEhleFZhbCh0bXBbMl0pIHNobCA0KQorICAgICAgICAgICArICBIZXhWYWwodG1wWzNdKTsKKworICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIFVURjggYnl0ZXMgZnJvbSBpdCwgdG8gYmUgZGVjb2RlZCBsYXRlcgorICAgICAgaWYgQ2hhclV0aWxzLklzSGlnaFN1cnJvZ2F0ZShjaGFyKHdjaCkpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXInKTsKKyAgICAgICAgaGlnaFN1cm9nYXRlIDo9IGNoYXIod2NoKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBDaGFyVXRpbHMuSXNMb3dTdXJyb2dhdGUoY2hhcih3Y2gpKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIGhpZ2hTdXJvZ2F0ZSA9ICMwCisgICAgICAgIHRoZW4gVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyJyk7CisgICAgICAgIHN1cnJvZ2F0ZVBhaXJzWzBdIDo9IGhpZ2hTdXJvZ2F0ZTsKKyAgICAgICAgc3Vycm9nYXRlUGFpcnNbMV0gOj0gY2hhcih3Y2gpOworICAgICAgICB0bXAgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3Vycm9nYXRlUGFpcnMpOworICAgICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgTGVuZ3RoKHRtcCkpOworICAgICAgICBoaWdoU3Vyb2dhdGUgOj0gIzA7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgdG1wIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKENoYXIod2NoKSk7CisgICAgICAgIGJ1ZmZlci5Xcml0ZSggdG1wWzBdLCBMZW5ndGgodG1wKSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhcicpOworCisgICAgU2V0TGVuZ3RoKCByZXN1bHQsIGJ1ZmZlci5TaXplKTsKKyAgICBpZiBidWZmZXIuU2l6ZSA+IDAgdGhlbiBNb3ZlKCBidWZmZXIuTWVtb3J5XiwgcmVzdWx0WzBdLCBMZW5ndGgocmVzdWx0KSk7CisKKyAgZmluYWxseQorICAgIGJ1ZmZlci5GcmVlOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuSXNKU09OTnVtZXJpYyggYiA6IEJ5dGUpIDogQm9vbGVhbjsKK2NvbnN0IE5VTUNIQVJTID0gWycrJywnLScsJy4nLCcwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnRScsJ2UnXTsKK2JlZ2luCisgIHJlc3VsdCA6PSBDaGFySW5TZXQoIENoYXIoYiksIE5VTUNIQVJTKTsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTk51bWVyaWNDaGFycyA6IHN0cmluZzsKK3ZhciBzdHJibGQgOiBUVGhyaWZ0U3RyaW5nQnVpbGRlcjsKKyAgICBjaCA6IEJ5dGU7CitiZWdpbgorICBzdHJibGQgOj0gVFRocmlmdFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICB0cnkKKyAgICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgICBjaCA6PSBGUmVhZGVyLlBlZWs7CisgICAgICBpZiBJc0pTT05OdW1lcmljKGNoKQorICAgICAgdGhlbiBzdHJibGQuQXBwZW5kKCBDaGFyKEZSZWFkZXIuUmVhZCkpCisgICAgICBlbHNlIEJyZWFrOworICAgIGVuZDsKKyAgICByZXN1bHQgOj0gc3RyYmxkLlRvU3RyaW5nOworCisgIGZpbmFsbHkKKyAgICBzdHJibGQuRnJlZTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OSW50ZWdlciA6IEludDY0OwordmFyIHN0ciA6IHN0cmluZzsKK2JlZ2luCisgIEZDb250ZXh0LlJlYWQ7CisgIGlmIEZDb250ZXh0LkVzY2FwZU51bWJlcnMKKyAgdGhlbiBSZWFkSlNPTlN5bnRheENoYXIoIFFVT1RFWzBdKTsKKworICBzdHIgOj0gUmVhZEpTT05OdW1lcmljQ2hhcnM7CisKKyAgaWYgRkNvbnRleHQuRXNjYXBlTnVtYmVycworICB0aGVuIFJlYWRKU09OU3ludGF4Q2hhciggUVVPVEVbMF0pOworCisgIHRyeQorICAgIHJlc3VsdCA6PSBTdHJUb0ludDY0KHN0cik7CisgIGV4Y2VwdAorICAgIG9uIGU6RXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09ORG91YmxlIDogRG91YmxlOwordmFyIGR1YiA6IERvdWJsZTsKKyAgICBzdHIgOiBzdHJpbmc7CitiZWdpbgorICBGQ29udGV4dC5SZWFkOworCisgIGlmIEZSZWFkZXIuUGVlayA9IFFVT1RFWzBdCisgIHRoZW4gYmVnaW4KKyAgICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyggVFJVRSkpOworICAgIGR1YiA6PSBTdHJUb0Zsb2F0KCBzdHIsIElOVkFSSUFOVF9DVUxUVVJFKTsKKworICAgIGlmIG5vdCBGQ29udGV4dC5Fc2NhcGVOdW1iZXJzKCkKKyAgICBhbmQgbm90IE1hdGguSXNOYU4oZHViKQorICAgIGFuZCBub3QgTWF0aC5Jc0luZmluaXRlKGR1YikKKyAgICB0aGVuIGJlZ2luCisgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiAgU2VsZiBjYXNlCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ051bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkJyk7CisgICAgZW5kOworICAgIHJlc3VsdCA6PSBkdWI7CisgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICBpZiBGQ29udGV4dC5Fc2NhcGVOdW1iZXJzCisgIHRoZW4gUmVhZEpTT05TeW50YXhDaGFyKCBRVU9URVswXSk7CisKKyAgdHJ5CisgICAgc3RyIDo9IFJlYWRKU09OTnVtZXJpY0NoYXJzOworICAgIHJlc3VsdCA6PSBTdHJUb0Zsb2F0KCBzdHIsIElOVkFSSUFOVF9DVUxUVVJFKTsKKyAgZXhjZXB0CisgICAgb24gZTpFeGNlcHRpb24KKyAgICBkbyByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05CYXNlNjQgOiBUQnl0ZXM7Cit2YXIgYiA6IFRCeXRlczsKKyAgICBsZW4sIG9mZiwgc2l6ZSA6IEludGVnZXI7CitiZWdpbgorICBiIDo9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKworICBsZW4gOj0gTGVuZ3RoKGIpOworICBvZmYgOj0gMDsKKyAgc2l6ZSA6PSAwOworCisgIC8vIHJlZHVjZSBsZW4gdG8gaWdub3JlIGZpbGwgYnl0ZXMKKyAgRGVjKGxlbik7CisgIHdoaWxlIChsZW4gPj0gMCkgYW5kIChiW2xlbl0gPSBCeXRlKCc9JykpIGRvIERlYyhsZW4pOworICBJbmMobGVuKTsKKworICAvLyByZWFkICYgZGVjb2RlIGZ1bGwgYnl0ZSB0cmlwbGV0cyA9IDQgc291cmNlIGJ5dGVzCisgIHdoaWxlIChsZW4gPj0gNCkgZG8gYmVnaW4KKyAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKKyAgICBJbmMoIHNpemUsIEJhc2U2NFV0aWxzLkRlY29kZSggYiwgb2ZmLCA0LCBiLCBzaXplKSk7IC8vIGRlY29kZWQgaW4gcGxhY2UKKyAgICBJbmMoIG9mZiwgNCk7CisgICAgRGVjKCBsZW4sIDQpOworICBlbmQ7CisKKyAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKKyAgaWYgbGVuID4gMSB0aGVuIGJlZ2luCisgICAgLy8gRGVjb2RlIHJlbWFpbmRlcgorICAgIEluYyggc2l6ZSwgQmFzZTY0VXRpbHMuRGVjb2RlKCBiLCBvZmYsIGxlbiwgYiwgc2l6ZSkpOyAvLyBkZWNvZGVkIGluIHBsYWNlCisgIGVuZDsKKworICAvLyByZXNpemUgdG8gZmluYWwgc2l6ZSBhbmQgcmV0dXJuIHRoZSBkYXRhCisgIFNldExlbmd0aCggYiwgc2l6ZSk7CisgIHJlc3VsdCA6PSBiOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTk9iamVjdFN0YXJ0OworYmVnaW4KKyAgRkNvbnRleHQuUmVhZDsKKyAgUmVhZEpTT05TeW50YXhDaGFyKCBMQlJBQ0VbMF0pOworICBQdXNoQ29udGV4dCggVEpTT05QYWlyQ29udGV4dC5DcmVhdGUoIFNlbGYpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05PYmplY3RFbmQ7CitiZWdpbgorICBSZWFkSlNPTlN5bnRheENoYXIoIFJCUkFDRVswXSk7CisgIFBvcENvbnRleHQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRKU09OQXJyYXlTdGFydDsKK2JlZ2luCisgIEZDb250ZXh0LlJlYWQ7CisgIFJlYWRKU09OU3ludGF4Q2hhciggTEJSQUNLRVRbMF0pOworICBQdXNoQ29udGV4dCggVEpTT05MaXN0Q29udGV4dC5DcmVhdGUoIFNlbGYpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05BcnJheUVuZDsKK2JlZ2luCisgIFJlYWRKU09OU3ludGF4Q2hhciggUkJSQUNLRVRbMF0pOworICBQb3BDb250ZXh0OworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgUmVzZXRDb250ZXh0U3RhY2s7ICAvLyBUSFJJRlQtMTQ3MworCisgIEluaXQoIHJlc3VsdCk7CisgIFJlYWRKU09OQXJyYXlTdGFydDsKKworICBpZiBSZWFkSlNPTkludGVnZXIgPD4gVkVSU0lPTgorICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4nKTsKKworICByZXN1bHQuTmFtZSAgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyggRkFMU0UpKTsKKyAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggUmVhZEpTT05JbnRlZ2VyKTsKKyAgcmVzdWx0LlNlcUlEIDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VFbmQ7CitiZWdpbgorICBSZWFkSlNPTkFycmF5RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbiA6IFRUaHJpZnRTdHJ1Y3QgOworYmVnaW4KKyAgUmVhZEpTT05PYmplY3RTdGFydDsKKyAgSW5pdCggcmVzdWx0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIFJlYWRKU09OT2JqZWN0RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRGaWVsZEJlZ2luIDogVFRocmlmdEZpZWxkOwordmFyIGNoIDogQnl0ZTsKKyAgICBzdHIgOiBzdHJpbmc7CitiZWdpbgorICBJbml0KCByZXN1bHQpOworICBjaCA6PSBGUmVhZGVyLlBlZWs7CisgIGlmIGNoID0gUkJSQUNFWzBdCisgIHRoZW4gcmVzdWx0LlR5cGVfIDo9IFRUeXBlLlN0b3AKKyAgZWxzZSBiZWdpbgorICAgIHJlc3VsdC5JRCA6PSBSZWFkSlNPTkludGVnZXI7CisgICAgUmVhZEpTT05PYmplY3RTdGFydDsKKworICAgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKCBGQUxTRSkpOworICAgIHJlc3VsdC5UeXBlXyA6PSBHZXRUeXBlSURGb3JUeXBlTmFtZSggc3RyKTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5SZWFkRmllbGRFbmQ7CitiZWdpbgorICBSZWFkSlNPTk9iamVjdEVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW4gOiBUVGhyaWZ0TWFwOwordmFyIHN0ciA6IHN0cmluZzsKK2JlZ2luCisgIEluaXQoIHJlc3VsdCk7CisgIFJlYWRKU09OQXJyYXlTdGFydDsKKworICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOworICByZXN1bHQuS2V5VHlwZSA6PSBHZXRUeXBlSURGb3JUeXBlTmFtZSggc3RyKTsKKworICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOworICByZXN1bHQuVmFsdWVUeXBlIDo9IEdldFR5cGVJREZvclR5cGVOYW1lKCBzdHIpOworCisgIHJlc3VsdC5Db3VudCA6PSBSZWFkSlNPTkludGVnZXI7CisgIFJlYWRKU09OT2JqZWN0U3RhcnQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNYXBFbmQ7CitiZWdpbgorICBSZWFkSlNPTk9iamVjdEVuZDsKKyAgUmVhZEpTT05BcnJheUVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luIDogVFRocmlmdExpc3Q7Cit2YXIgc3RyIDogc3RyaW5nOworYmVnaW4KKyAgSW5pdCggcmVzdWx0KTsKKyAgUmVhZEpTT05BcnJheVN0YXJ0OworCisgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKEZBTFNFKSk7CisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBHZXRUeXBlSURGb3JUeXBlTmFtZSggc3RyKTsKKyAgcmVzdWx0LkNvdW50IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZExpc3RFbmQ7CitiZWdpbgorICBSZWFkSlNPTkFycmF5RW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbiA6IFRUaHJpZnRTZXQ7Cit2YXIgc3RyIDogc3RyaW5nOworYmVnaW4KKyAgSW5pdCggcmVzdWx0KTsKKyAgUmVhZEpTT05BcnJheVN0YXJ0OworCisgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKEZBTFNFKSk7CisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBHZXRUeXBlSURGb3JUeXBlTmFtZSggc3RyKTsKKyAgcmVzdWx0LkNvdW50IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuUmVhZFNldEVuZDsKK2JlZ2luCisgIFJlYWRKU09OQXJyYXlFbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEJvb2wgOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IChSZWFkSlNPTkludGVnZXIgPD4gMCk7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEJ5dGUgOiBTaG9ydEludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBSZWFkSlNPTkludGVnZXI7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEkxNiA6IFNtYWxsSW50OworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSTMyIDogTG9uZ0ludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBSZWFkSlNPTkludGVnZXI7CitlbmQ7CisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEk2NCA6IEludDY0OworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09OSW50ZWdlcjsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkRG91YmxlIDogRG91YmxlOworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09ORG91YmxlOworZW5kOworCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJpbmcgOiBzdHJpbmc7CitiZWdpbgorICByZXN1bHQgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyggRkFMU0UpKTsKK2VuZDsKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkQmluYXJ5IDogVEJ5dGVzOworYmVnaW4KKyAgcmVzdWx0IDo9IFJlYWRKU09OQmFzZTY0OworZW5kOworCisKKy8vLS0tIGluaXQgY29kZSAtLS0KKworcHJvY2VkdXJlIEluaXRCeXRlcyggdmFyIGIgOiBUQnl0ZXM7IGFEYXRhIDogYXJyYXkgb2YgQnl0ZSk7CitiZWdpbgorICBTZXRMZW5ndGgoIGIsIExlbmd0aChhRGF0YSkpOworICBNb3ZlKCBhRGF0YSwgYlswXSwgTGVuZ3RoKGIpKTsKK2VuZDsKKworaW5pdGlhbGl6YXRpb24KKyAgSW5pdEJ5dGVzKCBDT01NQSwgICAgIFtCeXRlKCcsJyldKTsKKyAgSW5pdEJ5dGVzKCBDT0xPTiwgICAgIFtCeXRlKCc6JyldKTsKKyAgSW5pdEJ5dGVzKCBMQlJBQ0UsICAgIFtCeXRlKCd7JyldKTsKKyAgSW5pdEJ5dGVzKCBSQlJBQ0UsICAgIFtCeXRlKCd9JyldKTsKKyAgSW5pdEJ5dGVzKCBMQlJBQ0tFVCwgIFtCeXRlKCdbJyldKTsKKyAgSW5pdEJ5dGVzKCBSQlJBQ0tFVCwgIFtCeXRlKCddJyldKTsKKyAgSW5pdEJ5dGVzKCBRVU9URSwgICAgIFtCeXRlKCciJyldKTsKKyAgSW5pdEJ5dGVzKCBCQUNLU0xBU0gsIFtCeXRlKCdcJyldKTsKKyAgSW5pdEJ5dGVzKCBFU0NTRVEsICAgIFtCeXRlKCdcJyksQnl0ZSgndScpLEJ5dGUoJzAnKSxCeXRlKCcwJyldKTsKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMzgzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzCkBAIC0wLDAgKzEsMTA3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleDsKKworaW50ZXJmYWNlCisKK3VzZXMgVGhyaWZ0LlByb3RvY29sOworCit7IFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCisgIHRoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCisgIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisKKyAgTk9URTogVEhJUyBJUyBOT1QgVVNFRCBCWSBTRVJWRVJTLgorICBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKworICBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisKKyAgICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKworICAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworCisgICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKTsKKyAgICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworCisgICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7CisKK30KKwordHlwZQorICBUTXVsdGlwbGV4ZWRQcm90b2NvbCA9IGNsYXNzKCBUUHJvdG9jb2xEZWNvcmF0b3IpCisgIHB1YmxpYyBjb25zdAorICAgIHsgIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgfQorICAgIFNFUEFSQVRPUiA9ICc6JzsKKworICBwcml2YXRlCisgICAgIEZTZXJ2aWNlTmFtZSA6IFN0cmluZzsKKworICBwdWJsaWMKKyAgICB7IFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIHNlcnZlci4KKyAgICAgIFRoZSBzZXJ2aWNlTmFtZSBpcyByZXF1aXJlZCBhcyBpdCBpcyBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZworICAgICAgc2VydmVyIGNhbiBicm9rZXIgdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorCisgICAgICBBcmdzOgorICAgICAgICBwcm90b2NvbCAuLi4uLi4uIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gVEJpbmFyeVByb3RvY29sLgorICAgICAgICBzZXJ2aWNlTmFtZSAuLi4uIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KKyAgICB9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFTZXJ2aWNlTmFtZSA6IHN0cmluZyk7CisKKyAgICB7IFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBTRVBBUkFUT1IuCisgICAgICBBcmdzOiBUaGUgb3JpZ2luYWwgbWVzc2FnZS4KKyAgICB9CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKK2NvbnN0cnVjdG9yIFRNdWx0aXBsZXhlZFByb3RvY29sLkNyZWF0ZShjb25zdCBhUHJvdG9jb2w6IElQcm90b2NvbDsgY29uc3QgYVNlcnZpY2VOYW1lOiBzdHJpbmcpOworYmVnaW4KKyAgQVNTRVJUKCBhU2VydmljZU5hbWUgPD4gJycpOworICBpbmhlcml0ZWQgQ3JlYXRlKGFQcm90b2NvbCk7CisgIEZTZXJ2aWNlTmFtZSA6PSBhU2VydmljZU5hbWU7CitlbmQ7CisKKworcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKKy8vIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCit2YXIgbmV3TXNnIDogVFRocmlmdE1lc3NhZ2U7CitiZWdpbgorICBjYXNlIG1zZy5UeXBlXyBvZgorICAgIFRNZXNzYWdlVHlwZS5DYWxsLAorICAgIFRNZXNzYWdlVHlwZS5PbmV3YXkgOiBiZWdpbgorICAgICAgSW5pdCggbmV3TXNnLCBGU2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBtc2cuTmFtZSwgbXNnLlR5cGVfLCBtc2cuU2VxSUQpOworICAgICAgaW5oZXJpdGVkIFdyaXRlTWVzc2FnZUJlZ2luKCBuZXdNc2cpOworICAgIGVuZDsKKworICBlbHNlCisgICAgaW5oZXJpdGVkIFdyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOworICBlbmQ7CitlbmQ7CisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjUwOWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcwpAQCAtMCwwICsxLDEzODkgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworeyRTQ09QRURFTlVNUyBPTn0KKwordW5pdCBUaHJpZnQuUHJvdG9jb2w7CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBDb250bnJzLAorICBUaHJpZnQuRXhjZXB0aW9uLAorICBUaHJpZnQuU3RyZWFtLAorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5UcmFuc3BvcnQ7CisKK3R5cGUKKworICBUVHlwZSA9ICgKKyAgICBTdG9wID0gMCwKKyAgICBWb2lkID0gMSwKKyAgICBCb29sXyA9IDIsCisgICAgQnl0ZV8gPSAzLAorICAgIERvdWJsZV8gPSA0LAorICAgIEkxNiA9IDYsCisgICAgSTMyID0gOCwKKyAgICBJNjQgPSAxMCwKKyAgICBTdHJpbmdfID0gMTEsCisgICAgU3RydWN0ID0gMTIsCisgICAgTWFwID0gMTMsCisgICAgU2V0XyA9IDE0LAorICAgIExpc3QgPSAxNQorICApOworCisgIFRNZXNzYWdlVHlwZSA9ICgKKyAgICBDYWxsID0gMSwKKyAgICBSZXBseSA9IDIsCisgICAgRXhjZXB0aW9uID0gMywKKyAgICBPbmV3YXkgPSA0CisgICk7CisKK2NvbnN0CisgIFZBTElEX1RUWVBFUyA9IFsKKyAgICBUVHlwZS5TdG9wLCBUVHlwZS5Wb2lkLAorICAgIFRUeXBlLkJvb2xfLCBUVHlwZS5CeXRlXywgVFR5cGUuRG91YmxlXywgVFR5cGUuSTE2LCBUVHlwZS5JMzIsIFRUeXBlLkk2NCwgVFR5cGUuU3RyaW5nXywKKyAgICBUVHlwZS5TdHJ1Y3QsIFRUeXBlLk1hcCwgVFR5cGUuU2V0XywgVFR5cGUuTGlzdAorICBdOworCisgIFZBTElEX01FU1NBR0VUWVBFUyA9IFtMb3coVE1lc3NhZ2VUeXBlKS4uSGlnaChUTWVzc2FnZVR5cGUpXTsKKworY29uc3QKKyAgREVGQVVMVF9SRUNVUlNJT05fTElNSVQgPSA2NDsKKwordHlwZQorICBJUHJvdG9jb2wgPSBpbnRlcmZhY2U7CisKKyAgVFRocmlmdE1lc3NhZ2UgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRNZXNzYWdlVHlwZTsKKyAgICBTZXFJRDogSW50ZWdlcjsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJ1Y3QgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgIGVuZDsKKworICBUVGhyaWZ0RmllbGQgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRUeXBlOworICAgIElkOiBTbWFsbEludDsKKyAgZW5kOworCisgIFRUaHJpZnRMaXN0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKyAgVFRocmlmdE1hcCA9IHJlY29yZAorICAgIEtleVR5cGU6IFRUeXBlOworICAgIFZhbHVlVHlwZTogVFR5cGU7CisgICAgQ291bnQ6IEludGVnZXI7CisgIGVuZDsKKworICBUVGhyaWZ0U2V0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKworCisgIElQcm90b2NvbEZhY3RvcnkgPSBpbnRlcmZhY2UKKyAgICBbJ3s3Q0Q2NEExMC00RTlGLTRFOTktOTNCRi03MDhBMzFGNEE2N0J9J10KKyAgICBmdW5jdGlvbiBHZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CisgIGVuZDsKKworICBUVGhyaWZ0U3RyaW5nQnVpbGRlciA9IGNsYXNzKCBUU3RyaW5nQnVpbGRlcikKKyAgcHVibGljCisgICAgZnVuY3Rpb24gQXBwZW5kKGNvbnN0IFZhbHVlOiBUQnl0ZXMpOiBUU3RyaW5nQnVpbGRlcjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQXBwZW5kKGNvbnN0IFZhbHVlOiBJVGhyaWZ0Q29udGFpbmVyKTogVFN0cmluZ0J1aWxkZXI7IG92ZXJsb2FkOworICBlbmQ7CisKKyAgVFByb3RvY29sRXhjZXB0aW9uID0gY2xhc3MoIFRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIGNvbnN0IC8vIFRPRE8oamVuc2cpOiBjaGFuZ2UgaW50byBlbnVtCisgICAgICBVTktOT1dOID0gMDsKKyAgICAgIElOVkFMSURfREFUQSA9IDE7CisgICAgICBORUdBVElWRV9TSVpFID0gMjsKKyAgICAgIFNJWkVfTElNSVQgPSAzOworICAgICAgQkFEX1ZFUlNJT04gPSA0OworICAgICAgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgICAgIERFUFRIX0xJTUlUID0gNjsKKyAgcHJvdGVjdGVkCisgICAgY29uc3RydWN0b3IgSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgcHVibGljCisgICAgLy8gcHVycG9zZWZ1bGx5IGhpZGUgaW5oZXJpdGVkIGNvbnN0cnVjdG9yCisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVFByb3RvY29sRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRQcm90b2NvbEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZTogVFByb3RvY29sRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRQcm90b2NvbEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggdHlwZV86IEludGVnZXIpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCB0eXBlXzogSW50ZWdlcjsgY29uc3QgbXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgIGVuZDsKKworICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVFByb3RvY29sRXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworICBlbmQ7CisKKyAgVFByb3RvY29sRXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uTmVnYXRpdmVTaXplID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uU2l6ZUxpbWl0ID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbiA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdCA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisKKworICBUUHJvdG9jb2xVdGlsID0gY2xhc3MKKyAgcHVibGljCisgICAgY2xhc3MgcHJvY2VkdXJlIFNraXAoIHByb3Q6IElQcm90b2NvbDsgdHlwZV86IFRUeXBlKTsKKyAgZW5kOworCisgIElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXIgPSBpbnRlcmZhY2UKKyAgICBbJ3syOUNBMDMzRi1CQjU2LTQ5QjEtOUVFMy0zMUIxRTgyRkM3QTV9J10KKyAgICAvLyBubyBtZW1iZXJzIHlldAorICBlbmQ7CisKKyAgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwgPSBjbGFzcyBhYnN0cmFjdCggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXIpCisgIHByb3RlY3RlZAorICAgIEZQcm90b2NvbCA6IElQcm90b2NvbDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBwcm90IDogSVByb3RvY29sKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgSVByb3RvY29sID0gaW50ZXJmYWNlCisgICAgWyd7NjAyQTdGRkItMEQ5RS00Q0Q4LThEN0YtRTUwNzY2NjA1ODhBfSddCisgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOworICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOworICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOworICAgIHByb2NlZHVyZSBXcml0ZUFuc2lTdHJpbmcoIGNvbnN0IHM6IEFuc2lTdHJpbmcpOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsKKworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKKyAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKKyAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsKKyAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7CisgICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7CisgICAgZnVuY3Rpb24gUmVhZEkzMjogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsKKyAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsKKyAgICBmdW5jdGlvbiBSZWFkQmluYXJ5OiBUQnl0ZXM7CisgICAgZnVuY3Rpb24gUmVhZFN0cmluZzogc3RyaW5nOworICAgIGZ1bmN0aW9uIFJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOworCisgICAgcHJvY2VkdXJlIFNldFJlY3Vyc2lvbkxpbWl0KCB2YWx1ZSA6IEludGVnZXIpOworICAgIGZ1bmN0aW9uICBHZXRSZWN1cnNpb25MaW1pdCA6IEludGVnZXI7CisgICAgZnVuY3Rpb24gIE5leHRSZWN1cnNpb25MZXZlbCA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7CisgICAgcHJvY2VkdXJlIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICAgIHByb2NlZHVyZSBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKworICAgIHByb3BlcnR5IFRyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFRyYW5zcG9ydDsKKyAgICBwcm9wZXJ0eSBSZWN1cnNpb25MaW1pdCA6IEludGVnZXIgcmVhZCBHZXRSZWN1cnNpb25MaW1pdCB3cml0ZSBTZXRSZWN1cnNpb25MaW1pdDsKKyAgZW5kOworCisgIFRQcm90b2NvbEltcGwgPSBjbGFzcyBhYnN0cmFjdCggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbCkKKyAgcHJvdGVjdGVkCisgICAgRlRyYW5zIDogSVRyYW5zcG9ydDsKKyAgICBGUmVjdXJzaW9uTGltaXQgOiBJbnRlZ2VyOworICAgIEZSZWN1cnNpb25EZXB0aCA6IEludGVnZXI7CisKKyAgICBwcm9jZWR1cmUgU2V0UmVjdXJzaW9uTGltaXQoIHZhbHVlIDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gIEdldFJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiAgTmV4dFJlY3Vyc2lvbkxldmVsIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsKKyAgICBwcm9jZWR1cmUgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGg7CisgICAgcHJvY2VkdXJlIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworCisgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkSTE2OiBTbWFsbEludDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEkzMjogSW50ZWdlcjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZEk2NDogSW50NjQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWREb3VibGU6RG91YmxlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkQmluYXJ5OiBUQnl0ZXM7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRTdHJpbmc6IHN0cmluZzsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBSZWFkQW5zaVN0cmluZzogQW5zaVN0cmluZzsgdmlydHVhbDsKKworICAgIHByb3BlcnR5IFRyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFRyYW5zcG9ydDsKKworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggdHJhbnM6IElUcmFuc3BvcnQgKTsKKyAgZW5kOworCisgIElCYXNlID0gaW50ZXJmYWNlCisgICAgWyd7MDhEOUJBQTgtNUVBQS00MTBGLUI1MEItQUMyRTZFNUU0MTU1fSddCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IHN0cmluZzsKKyAgICBwcm9jZWR1cmUgUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsKKyAgZW5kOworCisKKyAgVEJpbmFyeVByb3RvY29sSW1wbCA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsICkKKyAgcHJvdGVjdGVkCisgICAgY29uc3QKKyAgICAgIFZFUlNJT05fTUFTSyA6IENhcmRpbmFsID0gJGZmZmYwMDAwOworICAgICAgVkVSU0lPTl8xIDogQ2FyZGluYWwgPSAkODAwMTAwMDA7CisgIHByb3RlY3RlZAorICAgIEZTdHJpY3RSZWFkIDogQm9vbGVhbjsKKyAgICBGU3RyaWN0V3JpdGUgOiBCb29sZWFuOworCisgIHByaXZhdGUKKyAgICBmdW5jdGlvbiBSZWFkQWxsKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIgKTogSW50ZWdlcjsgIGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RyaW5nQm9keSggc2l6ZTogSW50ZWdlcik6IHN0cmluZzsKKworICBwdWJsaWMKKworICAgIHR5cGUKKyAgICAgIFRGYWN0b3J5ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvdG9jb2xGYWN0b3J5KQorICAgICAgcHJvdGVjdGVkCisgICAgICAgIEZTdHJpY3RSZWFkIDogQm9vbGVhbjsKKyAgICAgICAgRlN0cmljdFdyaXRlIDogQm9vbGVhbjsKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBHZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVN0cmljdFJlYWQsIEFTdHJpY3RXcml0ZTogQm9vbGVhbiApOyBvdmVybG9hZDsKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKKyAgICAgIGVuZDsKKworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0OyBzdHJpY3RSZWFkOiBCb29sZWFuOyBzdHJpY3RXcml0ZTogQm9vbGVhbik7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJyaWRlOworCisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMTY6IFNtYWxsSW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZERvdWJsZTpEb3VibGU7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgb3ZlcnJpZGU7CisKKyAgZW5kOworCisKKyAgeyBUUHJvdG9jb2xEZWNvcmF0b3IgZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIFRQcm90b2NvbCBpbnN0YW5jZSwKKyAgICBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFRoZSBkZWNvcmF0b3IKKyAgICBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QpIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wKKworICAgIFNlZSBwLjE3NSBvZiBEZXNpZ24gUGF0dGVybnMgKGJ5IEdhbW1hIGV0IGFsLikKKyAgfQorICBUUHJvdG9jb2xEZWNvcmF0b3IgPSBjbGFzcyggVFByb3RvY29sSW1wbCkKKyAgcHJpdmF0ZQorICAgIEZXcmFwcGVkUHJvdG9jb2wgOiBJUHJvdG9jb2w7CisKKyAgcHVibGljCisgICAgLy8gRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAvLyBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhlIGdpdmVuIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQcm90b2NvbCA6IElQcm90b2NvbCk7CisKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUFuc2lTdHJpbmcoIGNvbnN0IHM6IEFuc2lTdHJpbmcpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJyaWRlOworCisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMTY6IFNtYWxsSW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZERvdWJsZTpEb3VibGU7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cmluZzogc3RyaW5nOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkQW5zaVN0cmluZzogQW5zaVN0cmluZzsgb3ZlcnJpZGU7CisgIGVuZDsKKworCit0eXBlCisgIElSZXF1ZXN0RXZlbnRzID0gaW50ZXJmYWNlCisgICAgWyd7RjkyNkEyNkEtNUIwMC00NTYwLTg2RkEtMkNBRTNCQTczREFGfSddCisgICAgLy8gQ2FsbGVkIGJlZm9yZSByZWFkaW5nIGFyZ3VtZW50cy4KKyAgICBwcm9jZWR1cmUgUHJlUmVhZDsKKyAgICAvLyBDYWxsZWQgYmV0d2VlbiByZWFkaW5nIGFyZ3VtZW50cyBhbmQgY2FsbGluZyB0aGUgaGFuZGxlci4KKyAgICBwcm9jZWR1cmUgUG9zdFJlYWQ7CisgICAgLy8gQ2FsbGVkIGJldHdlZW4gY2FsbGluZyB0aGUgaGFuZGxlciBhbmQgd3JpdGluZyB0aGUgcmVzcG9uc2UuCisgICAgcHJvY2VkdXJlIFByZVdyaXRlOworICAgIC8vIENhbGxlZCBhZnRlciB3cml0aW5nIHRoZSByZXNwb25zZS4KKyAgICBwcm9jZWR1cmUgUG9zdFdyaXRlOworICAgIC8vIENhbGxlZCB3aGVuIGFuIG9uZXdheSAoYXN5bmMpIGZ1bmN0aW9uIGNhbGwgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KKyAgICBwcm9jZWR1cmUgT25ld2F5Q29tcGxldGU7CisgICAgLy8gQ2FsbGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbi4KKyAgICBwcm9jZWR1cmUgVW5oYW5kbGVkRXJyb3IoIGNvbnN0IGUgOiBFeGNlcHRpb24pOworICAgIC8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGNsZWFuIHVwCisgICAgcHJvY2VkdXJlIENsZWFudXBDb250ZXh0OworICBlbmQ7CisKKworICBJUHJvY2Vzc29yRXZlbnRzID0gaW50ZXJmYWNlCisgICAgWyd7QTg2NjExMTktNjU3Qy00NDdELTkzQzUtNTEyRTM2MTYyQTQ1fSddCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgorICAgIHByb2NlZHVyZSBQcm9jZXNzaW5nKCBjb25zdCB0cmFuc3BvcnQgOiBJVHJhbnNwb3J0KTsKKyAgICAvLyBDYWxsZWQgb24gYW55IHNlcnZpY2UgZnVuY3Rpb24gaW52b2NhdGlvbgorICAgIGZ1bmN0aW9uICBDcmVhdGVSZXF1ZXN0Q29udGV4dCggY29uc3QgYUZ1bmN0aW9uTmFtZSA6IHN0cmluZykgOiBJUmVxdWVzdEV2ZW50czsKKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBjbGVhbiB1cAorICAgIHByb2NlZHVyZSBDbGVhbnVwQ29udGV4dDsKKyAgZW5kOworCisKKyAgSVByb2Nlc3NvciA9IGludGVyZmFjZQorICAgIFsnezdCQUU5MkE1LTQ2REEtNEYxMy1CNkVBLTBFQUJFMjMzRUU1Rn0nXQorICAgIGZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90IDpJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOworICBlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWVzc2FnZTsgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSA9IExvdyhUTWVzc2FnZVR5cGUpOyBjb25zdCBBU2VxSUQ6IEludGVnZXIgPSAwKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U3RydWN0OyAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0RmllbGQ7ICAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBVHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBSUQ6IFNtYWxsSW50ID0gMCk7ICBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1hcDsgICAgIGNvbnN0IEFLZXlUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFWYWx1ZVR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U2V0OyAgICAgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFDb3VudDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdExpc3Q7ICAgIGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBQ291bnQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7ICBpbmxpbmU7CisKKworaW1wbGVtZW50YXRpb24KKworZnVuY3Rpb24gQ29udmVydEludDY0VG9Eb3VibGUoIGNvbnN0IG46IEludDY0KTogRG91YmxlOworYmVnaW4KKyAgQVNTRVJUKCBTaXplT2YobikgPSBTaXplT2YoUmVzdWx0KSk7CisgIFN5c3RlbS5Nb3ZlKCBuLCBSZXN1bHQsIFNpemVPZihSZXN1bHQpKTsKK2VuZDsKKworZnVuY3Rpb24gQ29udmVydERvdWJsZVRvSW50NjQoIGNvbnN0IGQ6IERvdWJsZSk6IEludDY0OworYmVnaW4KKyAgQVNTRVJUKCBTaXplT2YoZCkgPSBTaXplT2YoUmVzdWx0KSk7CisgIFN5c3RlbS5Nb3ZlKCBkLCBSZXN1bHQsIFNpemVPZihSZXN1bHQpKTsKK2VuZDsKKworCisKK3sgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbC5DcmVhdGUoIHByb3QgOiBJUHJvdG9jb2wpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKworICAvLyBzdG9yaW5nIHRoZSBwb2ludGVyICphZnRlciogdGhlIChzdWNjZXNzZnVsKSBpbmNyZW1lbnQgaXMgaW1wb3J0YW50IGhlcmUKKyAgcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKyAgRlByb3RvY29sIDo9IHByb3Q7CitlbmQ7CisKK2Rlc3RydWN0b3IgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIC8vIHdlIGhhdmUgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIGlmZiB0aGUgcG9pbnRlciBoYXMgYmVlbiBzdG9yZWQKKyAgICBpZiBGUHJvdG9jb2wgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEZQcm90b2NvbC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKyAgICAgIEZQcm90b2NvbCA6PSBuaWw7CisgICAgZW5kOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworeyBUUHJvdG9jb2xJbXBsIH0KKworY29uc3RydWN0b3IgVFByb3RvY29sSW1wbC5DcmVhdGUodHJhbnM6IElUcmFuc3BvcnQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRyYW5zIDo9IHRyYW5zOworICBGUmVjdXJzaW9uTGltaXQgOj0gREVGQVVMVF9SRUNVUlNJT05fTElNSVQ7CisgIEZSZWN1cnNpb25EZXB0aCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFByb3RvY29sSW1wbC5TZXRSZWN1cnNpb25MaW1pdCggdmFsdWUgOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZSZWN1cnNpb25MaW1pdCA6PSB2YWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVFByb3RvY29sSW1wbC5HZXRSZWN1cnNpb25MaW1pdCA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gRlJlY3Vyc2lvbkxpbWl0OworZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLk5leHRSZWN1cnNpb25MZXZlbCA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7CitiZWdpbgorICByZXN1bHQgOj0gVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwuQ3JlYXRlKFNlbGYpOworZW5kOworCitwcm9jZWR1cmUgVFByb3RvY29sSW1wbC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aDsKK2JlZ2luCisgIGlmIEZSZWN1cnNpb25EZXB0aCA8IEZSZWN1cnNpb25MaW1pdAorICB0aGVuIEluYyhGUmVjdXJzaW9uRGVwdGgpCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdC5DcmVhdGUoJ0RlcHRoIGxpbWl0IGV4Y2VlZGVkJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworYmVnaW4KKyAgRGVjKEZSZWN1cnNpb25EZXB0aCkKK2VuZDsKKworZnVuY3Rpb24gVFByb3RvY29sSW1wbC5HZXRUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7CitiZWdpbgorICBSZXN1bHQgOj0gRlRyYW5zOworZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLlJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOwordmFyCisgIGIgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gJyc7CisgIGIgOj0gUmVhZEJpbmFyeTsKKyAgbGVuIDo9IExlbmd0aCggYiApOworICBpZiBsZW4gPiAwIHRoZW4KKyAgYmVnaW4KKyAgICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuKTsKKyAgICBTeXN0ZW0uTW92ZSggYlswXSwgUG9pbnRlcihSZXN1bHQpXiwgbGVuICk7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFByb3RvY29sSW1wbC5SZWFkU3RyaW5nOiBzdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkQmluYXJ5ICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLldyaXRlQW5zaVN0cmluZyhjb25zdCBzOiBBbnNpU3RyaW5nKTsKK3ZhcgorICBiIDogVEJ5dGVzOworICBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IExlbmd0aChzKTsKKyAgU2V0TGVuZ3RoKCBiLCBsZW4pOworICBpZiBsZW4gPiAwIHRoZW4KKyAgYmVnaW4KKyAgICBTeXN0ZW0uTW92ZSggUG9pbnRlcihzKV4sIGJbMF0sIGxlbiApOworICBlbmQ7CisgIFdyaXRlQmluYXJ5KCBiICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLldyaXRlU3RyaW5nKGNvbnN0IHM6IHN0cmluZyk7Cit2YXIKKyAgYiA6IFRCeXRlczsKK2JlZ2luCisgIGIgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocyk7CisgIFdyaXRlQmluYXJ5KCBiICk7CitlbmQ7CisKK3sgVFByb3RvY29sVXRpbCB9CisKK2NsYXNzIHByb2NlZHVyZSBUUHJvdG9jb2xVdGlsLlNraXAoIHByb3Q6IElQcm90b2NvbDsgdHlwZV86IFRUeXBlKTsKK3ZhciBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKKyAgICBtYXAgICA6IFRUaHJpZnRNYXA7CisgICAgc2V0XyAgOiBUVGhyaWZ0U2V0OworICAgIGxpc3QgIDogVFRocmlmdExpc3Q7CisgICAgaSAgICAgOiBJbnRlZ2VyOworICAgIHRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOworYmVnaW4KKyAgdHJhY2tlciA6PSBwcm90Lk5leHRSZWN1cnNpb25MZXZlbDsKKyAgY2FzZSB0eXBlXyBvZgorICAgIC8vIHNpbXBsZSB0eXBlcworICAgIFRUeXBlLkJvb2xfICAgOiAgcHJvdC5SZWFkQm9vbCgpOworICAgIFRUeXBlLkJ5dGVfICAgOiAgcHJvdC5SZWFkQnl0ZSgpOworICAgIFRUeXBlLkkxNiAgICAgOiAgcHJvdC5SZWFkSTE2KCk7CisgICAgVFR5cGUuSTMyICAgICA6ICBwcm90LlJlYWRJMzIoKTsKKyAgICBUVHlwZS5JNjQgICAgIDogIHByb3QuUmVhZEk2NCgpOworICAgIFRUeXBlLkRvdWJsZV8gOiAgcHJvdC5SZWFkRG91YmxlKCk7CisgICAgVFR5cGUuU3RyaW5nXyA6ICBwcm90LlJlYWRCaW5hcnkoKTsvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KKworICAgIC8vIHN0cnVjdHVyZWQgdHlwZXMKKyAgICBUVHlwZS5TdHJ1Y3QgOiAgYmVnaW4KKyAgICAgIHByb3QuUmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgICAgIGZpZWxkIDo9IHByb3QuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKGZpZWxkLlR5cGVfID0gVFR5cGUuU3RvcCkgdGhlbiBCcmVhazsKKyAgICAgICAgU2tpcChwcm90LCBmaWVsZC5UeXBlXyk7CisgICAgICAgIHByb3QuUmVhZEZpZWxkRW5kKCk7CisgICAgICBlbmQ7CisgICAgICBwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICBlbmQ7CisKKyAgICBUVHlwZS5NYXAgOiAgYmVnaW4KKyAgICAgIG1hcCA6PSBwcm90LlJlYWRNYXBCZWdpbigpOworICAgICAgZm9yIGkgOj0gMCB0byBtYXAuQ291bnQtMSBkbyBiZWdpbgorICAgICAgICBTa2lwKHByb3QsIG1hcC5LZXlUeXBlKTsKKyAgICAgICAgU2tpcChwcm90LCBtYXAuVmFsdWVUeXBlKTsKKyAgICAgIGVuZDsKKyAgICAgIHByb3QuUmVhZE1hcEVuZCgpOworICAgIGVuZDsKKworICAgIFRUeXBlLlNldF8gOiAgYmVnaW4KKyAgICAgIHNldF8gOj0gcHJvdC5SZWFkU2V0QmVnaW4oKTsKKyAgICAgIGZvciBpIDo9IDAgdG8gc2V0Xy5Db3VudC0xCisgICAgICBkbyBTa2lwKCBwcm90LCBzZXRfLkVsZW1lbnRUeXBlKTsKKyAgICAgIHByb3QuUmVhZFNldEVuZCgpOworICAgIGVuZDsKKworICAgIFRUeXBlLkxpc3QgOiAgYmVnaW4KKyAgICAgIGxpc3QgOj0gcHJvdC5SZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3IgaSA6PSAwIHRvIGxpc3QuQ291bnQtMQorICAgICAgZG8gU2tpcCggcHJvdCwgbGlzdC5FbGVtZW50VHlwZSk7CisgICAgICBwcm90LlJlYWRMaXN0RW5kKCk7CisgICAgZW5kOworCisgIGVsc2UKKyAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ1VuZXhwZWN0ZWQgdHlwZSAnK0ludFRvU3RyKE9yZCh0eXBlXykpKTsKKyAgZW5kOworZW5kOworCisKK3sgVEJpbmFyeVByb3RvY29sSW1wbCB9CisKK2NvbnN0cnVjdG9yIFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk7CitiZWdpbgorICAvL25vIGluaGVyaXRlZAorICBDcmVhdGUoIHRyYW5zLCBGYWxzZSwgVHJ1ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydDsgc3RyaWN0UmVhZCwKKyAgc3RyaWN0V3JpdGU6IEJvb2xlYW4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggdHJhbnMgKTsKKyAgRlN0cmljdFJlYWQgOj0gc3RyaWN0UmVhZDsKKyAgRlN0cmljdFdyaXRlIDo9IHN0cmljdFdyaXRlOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRBbGwoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlciApOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUcmFucy5SZWFkQWxsKCBwQnVmLCBidWZsZW4sIG9mZiwgbGVuICk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEJpbmFyeTogVEJ5dGVzOwordmFyCisgIHNpemUgOiBJbnRlZ2VyOworICBidWYgOiBUQnl0ZXM7CitiZWdpbgorICBzaXplIDo9IFJlYWRJMzI7CisgIFNldExlbmd0aCggYnVmLCBzaXplICk7CisgIEZUcmFucy5SZWFkQWxsKCBidWYsIDAsIHNpemUpOworICBSZXN1bHQgOj0gYnVmOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCb29sOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IChSZWFkQnl0ZSA9IDEpOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsKK2JlZ2luCisgIFJlYWRBbGwoIEByZXN1bHQsIFNpemVPZihyZXN1bHQpLCAwLCAxKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRG91YmxlOiBEb3VibGU7CitiZWdpbgorICBSZXN1bHQgOj0gQ29udmVydEludDY0VG9Eb3VibGUoIFJlYWRJNjQgKQorZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CitiZWdpbgorICBJbml0KCByZXN1bHQsICcnLCBUVHlwZSggUmVhZEJ5dGUpLCAwKTsKKyAgaWYgKCByZXN1bHQuVHlwZV8gPD4gVFR5cGUuU3RvcCApIHRoZW4gYmVnaW4KKyAgICByZXN1bHQuSWQgOj0gUmVhZEkxNjsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRFbmQ7CitiZWdpbgorCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkxNjogU21hbGxJbnQ7Cit2YXIgaTE2aW4gOiBwYWNrZWQgYXJyYXlbMC4uMV0gb2YgQnl0ZTsKK2JlZ2luCisgIFJlYWRBbGwoIEBpMTZpbiwgU2l6ZW9mKGkxNmluKSwgMCwgMik7CisgIFJlc3VsdCA6PSBTbWFsbEludCgoKGkxNmluWzBdIGFuZCAkRkYpIHNobCA4KSBvciAoaTE2aW5bMV0gYW5kICRGRikpOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJMzI6IEludGVnZXI7Cit2YXIgaTMyaW4gOiBwYWNrZWQgYXJyYXlbMC4uM10gb2YgQnl0ZTsKK2JlZ2luCisgIFJlYWRBbGwoIEBpMzJpbiwgU2l6ZU9mKGkzMmluKSwgMCwgNCk7CisKKyAgUmVzdWx0IDo9IEludGVnZXIoCisgICAgKChpMzJpblswXSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgKChpMzJpblsxXSBhbmQgJEZGKSBzaGwgMTYpIG9yCisgICAgKChpMzJpblsyXSBhbmQgJEZGKSBzaGwgOCkgb3IKKyAgICAgKGkzMmluWzNdIGFuZCAkRkYpKTsKKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJNjQ6IEludDY0OwordmFyIGk2NGluIDogcGFja2VkIGFycmF5WzAuLjddIG9mIEJ5dGU7CitiZWdpbgorICBSZWFkQWxsKCBAaTY0aW4sIFNpemVPZihpNjRpbiksIDAsIDgpOworICBSZXN1bHQgOj0KKyAgICAoSW50NjQoIGk2NGluWzBdIGFuZCAkRkYpIHNobCA1Nikgb3IKKyAgICAoSW50NjQoIGk2NGluWzFdIGFuZCAkRkYpIHNobCA0OCkgb3IKKyAgICAoSW50NjQoIGk2NGluWzJdIGFuZCAkRkYpIHNobCA0MCkgb3IKKyAgICAoSW50NjQoIGk2NGluWzNdIGFuZCAkRkYpIHNobCAzMikgb3IKKyAgICAoSW50NjQoIGk2NGluWzRdIGFuZCAkRkYpIHNobCAyNCkgb3IKKyAgICAoSW50NjQoIGk2NGluWzVdIGFuZCAkRkYpIHNobCAxNikgb3IKKyAgICAoSW50NjQoIGk2NGluWzZdIGFuZCAkRkYpIHNobCA4KSBvcgorICAgIChJbnQ2NCggaTY0aW5bN10gYW5kICRGRikpOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OworYmVnaW4KKyAgcmVzdWx0LkVsZW1lbnRUeXBlIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LkNvdW50ICAgICAgIDo9IFJlYWRJMzI7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRMaXN0RW5kOworYmVnaW4KKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKK2JlZ2luCisgIHJlc3VsdC5LZXlUeXBlICAgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuVmFsdWVUeXBlIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LkNvdW50ICAgICA6PSBSZWFkSTMyOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWFwRW5kOworYmVnaW4KKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOwordmFyCisgIHNpemUgOiBJbnRlZ2VyOworICB2ZXJzaW9uIDogSW50ZWdlcjsKK2JlZ2luCisgIEluaXQoIHJlc3VsdCk7CisgIHNpemUgOj0gUmVhZEkzMjsKKyAgaWYgKHNpemUgPCAwKSB0aGVuIGJlZ2luCisgICAgdmVyc2lvbiA6PSBzaXplIGFuZCBJbnRlZ2VyKCBWRVJTSU9OX01BU0spOworICAgIGlmICggdmVyc2lvbiA8PiBJbnRlZ2VyKCBWRVJTSU9OXzEpKSB0aGVuIGJlZ2luCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZSgnQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbjogJyArIEludFRvU3RyKHZlcnNpb24pICk7CisgICAgZW5kOworICAgIHJlc3VsdC5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIHNpemUgYW5kICQwMDAwMDBmZik7CisgICAgcmVzdWx0Lk5hbWUgOj0gUmVhZFN0cmluZzsKKyAgICByZXN1bHQuU2VxSUQgOj0gUmVhZEkzMjsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBpZiBGU3RyaWN0UmVhZCB0aGVuIGJlZ2luCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZSgnTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/JyApOworICAgIGVuZDsKKyAgICByZXN1bHQuTmFtZSA6PSBSZWFkU3RyaW5nQm9keSggc2l6ZSApOworICAgIHJlc3VsdC5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIFJlYWRCeXRlICk7CisgICAgcmVzdWx0LlNlcUlEIDo9IFJlYWRJMzI7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VFbmQ7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7CitiZWdpbgorICByZXN1bHQuRWxlbWVudFR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgICAgOj0gUmVhZEkzMjsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFNldEVuZDsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RyaW5nQm9keSggc2l6ZTogSW50ZWdlcik6IHN0cmluZzsKK3ZhcgorICBidWYgOiBUQnl0ZXM7CitiZWdpbgorICBTZXRMZW5ndGgoIGJ1Ziwgc2l6ZSApOworICBGVHJhbnMuUmVhZEFsbCggYnVmLCAwLCBzaXplICk7CisgIFJlc3VsdCA6PSBURW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIGJ1Zik7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworYmVnaW4KKyAgSW5pdCggUmVzdWx0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsKK3ZhciBpTGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGlMZW4gOj0gTGVuZ3RoKGIpOworICBXcml0ZUkzMiggaUxlbik7CisgIGlmIGlMZW4gPiAwIHRoZW4gRlRyYW5zLldyaXRlKGIsIDAsIGlMZW4pOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJvb2woYjogQm9vbGVhbik7CitiZWdpbgorICBpZiBiIHRoZW4gYmVnaW4KKyAgICBXcml0ZUJ5dGUoIDEgKTsKKyAgZW5kIGVsc2UgYmVnaW4KKyAgICBXcml0ZUJ5dGUoIDAgKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJ5dGUoYjogU2hvcnRJbnQpOworYmVnaW4KKyAgRlRyYW5zLldyaXRlKCBAYiwgMCwgMSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOworYmVnaW4KKyAgV3JpdGVJNjQoQ29udmVydERvdWJsZVRvSW50NjQoZCkpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOworYmVnaW4KKyAgV3JpdGVCeXRlKFNob3J0SW50KGZpZWxkLlR5cGVfKSk7CisgIFdyaXRlSTE2KGZpZWxkLklEKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZEVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZFN0b3A7CitiZWdpbgorICBXcml0ZUJ5dGUoU2hvcnRJbnQoVFR5cGUuU3RvcCkpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUkxNihpMTY6IFNtYWxsSW50KTsKK3ZhciBpMTZvdXQgOiBwYWNrZWQgYXJyYXlbMC4uMV0gb2YgQnl0ZTsKK2JlZ2luCisgIGkxNm91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGkxNiBzaHIgOCkpOworICBpMTZvdXRbMV0gOj0gQnl0ZSgkRkYgYW5kIGkxNik7CisgIEZUcmFucy5Xcml0ZSggQGkxNm91dCwgMCwgMik7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTMyKGkzMjogSW50ZWdlcik7Cit2YXIgaTMyb3V0IDogcGFja2VkIGFycmF5WzAuLjNdIG9mIEJ5dGU7CitiZWdpbgorICBpMzJvdXRbMF0gOj0gQnl0ZSgkRkYgYW5kIChpMzIgc2hyIDI0KSk7CisgIGkzMm91dFsxXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgMTYpKTsKKyAgaTMyb3V0WzJdIDo9IEJ5dGUoJEZGIGFuZCAoaTMyIHNociA4KSk7CisgIGkzMm91dFszXSA6PSBCeXRlKCRGRiBhbmQgaTMyKTsKKyAgRlRyYW5zLldyaXRlKCBAaTMyb3V0LCAwLCA0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOwordmFyIGk2NG91dCA6IHBhY2tlZCBhcnJheVswLi43XSBvZiBCeXRlOworYmVnaW4KKyAgaTY0b3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA1NikpOworICBpNjRvdXRbMV0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDQ4KSk7CisgIGk2NG91dFsyXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNDApKTsKKyAgaTY0b3V0WzNdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociAzMikpOworICBpNjRvdXRbNF0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDI0KSk7CisgIGk2NG91dFs1XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgMTYpKTsKKyAgaTY0b3V0WzZdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA4KSk7CisgIGk2NG91dFs3XSA6PSBCeXRlKCRGRiBhbmQgaTY0KTsKKyAgRlRyYW5zLldyaXRlKCBAaTY0b3V0LCAwLCA4KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKK2JlZ2luCisgIFdyaXRlQnl0ZShTaG9ydEludChsaXN0LkVsZW1lbnRUeXBlKSk7CisgIFdyaXRlSTMyKGxpc3QuQ291bnQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUxpc3RFbmQ7CitiZWdpbgorCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CitiZWdpbgorICBXcml0ZUJ5dGUoU2hvcnRJbnQobWFwLktleVR5cGUpKTsKKyAgV3JpdGVCeXRlKFNob3J0SW50KG1hcC5WYWx1ZVR5cGUpKTsKKyAgV3JpdGVJMzIobWFwLkNvdW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNYXBFbmQ7CitiZWdpbgorCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKK3ZhcgorICB2ZXJzaW9uIDogQ2FyZGluYWw7CitiZWdpbgorICBpZiBGU3RyaWN0V3JpdGUgdGhlbgorICBiZWdpbgorICAgIHZlcnNpb24gOj0gVkVSU0lPTl8xIG9yIENhcmRpbmFsKCBtc2cuVHlwZV8pOworICAgIFdyaXRlSTMyKCBJbnRlZ2VyKCB2ZXJzaW9uKSApOworICAgIFdyaXRlU3RyaW5nKCBtc2cuTmFtZSk7CisgICAgV3JpdGVJMzIoIG1zZy5TZXFJRCk7CisgIGVuZCBlbHNlCisgIGJlZ2luCisgICAgV3JpdGVTdHJpbmcoIG1zZy5OYW1lKTsKKyAgICBXcml0ZUJ5dGUoU2hvcnRJbnQoIG1zZy5UeXBlXykpOworICAgIFdyaXRlSTMyKCBtc2cuU2VxSUQpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCk7CitiZWdpbgorICBXcml0ZUJ5dGUoU2hvcnRJbnQoc2V0Xy5FbGVtZW50VHlwZSkpOworICBXcml0ZUkzMihzZXRfLkNvdW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTZXRFbmQ7CitiZWdpbgorCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RFbmQ7CitiZWdpbgorCitlbmQ7CisKK3sgVFByb3RvY29sRXhjZXB0aW9uIH0KKworY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uLkhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKE1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZTogVFByb3RvY29sRXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCcnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSh0eXBlXzogSW50ZWdlcik6IFRQcm90b2NvbEV4Y2VwdGlvbjsKK2JlZ2luCit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgT0ZGfQorICBSZXN1bHQgOj0gQ3JlYXRlKHR5cGVfLCAnJyk7Cit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgREVGQVVMVH0KK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSh0eXBlXzogSW50ZWdlcjsgY29uc3QgbXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247CitiZWdpbgorICBjYXNlIHR5cGVfIG9mCisgICAgSU5WQUxJRF9EQVRBOiAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKG1zZyk7CisgICAgTkVHQVRJVkVfU0laRTogICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uTmVnYXRpdmVTaXplLkNyZWF0ZShtc2cpOworICAgIFNJWkVfTElNSVQ6ICAgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvblNpemVMaW1pdC5DcmVhdGUobXNnKTsKKyAgICBCQURfVkVSU0lPTjogICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZShtc2cpOworICAgIE5PVF9JTVBMRU1FTlRFRDogUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkLkNyZWF0ZShtc2cpOworICAgIERFUFRIX0xJTUlUOiAgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbkRlcHRoTGltaXQuQ3JlYXRlKG1zZyk7CisgIGVsc2UKKyAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUobXNnKTsKKyAgZW5kOworZW5kOworCit7IFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkIH0KKworY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKK2VuZDsKKworeyBUVGhyaWZ0U3RyaW5nQnVpbGRlciB9CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJpbmdCdWlsZGVyLkFwcGVuZChjb25zdCBWYWx1ZTogVEJ5dGVzKTogVFN0cmluZ0J1aWxkZXI7CitiZWdpbgorICBSZXN1bHQgOj0gQXBwZW5kKCBzdHJpbmcoIFJhd0J5dGVTdHJpbmcoVmFsdWUpKSApOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyaW5nQnVpbGRlci5BcHBlbmQoCisgIGNvbnN0IFZhbHVlOiBJVGhyaWZ0Q29udGFpbmVyKTogVFN0cmluZ0J1aWxkZXI7CitiZWdpbgorICBSZXN1bHQgOj0gQXBwZW5kKCBWYWx1ZS5Ub1N0cmluZyApOworZW5kOworCit7IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkgfQorCitjb25zdHJ1Y3RvciBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZShBU3RyaWN0UmVhZCwgQVN0cmljdFdyaXRlOiBCb29sZWFuKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdHJpY3RSZWFkIDo9IEFTdHJpY3RSZWFkOworICBGU3RyaWN0V3JpdGUgOj0gQVN0cmljdFdyaXRlOworZW5kOworCitjb25zdHJ1Y3RvciBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoIEZhbHNlLCBUcnVlICkKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5HZXRQcm90b2NvbCggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOiBJUHJvdG9jb2w7CitiZWdpbgorICBSZXN1bHQgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zLCBGU3RyaWN0UmVhZCwgRlN0cmljdFdyaXRlKTsKK2VuZDsKKworCit7IFRQcm90b2NvbERlY29yYXRvciB9CisKK2NvbnN0cnVjdG9yIFRQcm90b2NvbERlY29yYXRvci5DcmVhdGUoIGNvbnN0IGFQcm90b2NvbCA6IElQcm90b2NvbCk7CitiZWdpbgorICBBU1NFUlQoIGFQcm90b2NvbCA8PiBuaWwpOworICBpbmhlcml0ZWQgQ3JlYXRlKCBhUHJvdG9jb2wuVHJhbnNwb3J0KTsKKyAgRldyYXBwZWRQcm90b2NvbCA6PSBhUHJvdG9jb2w7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNZXNzYWdlRW5kOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlU3RydWN0QmVnaW4oIHN0cnVjKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU3RydWN0RW5kOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRCZWdpbiggZmllbGQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVGaWVsZEVuZDsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlRmllbGRTdG9wOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkU3RvcDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW4oIG1hcCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1hcEVuZDsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBFbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RCZWdpbiggbGlzdCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUxpc3RFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kKCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlU2V0QmVnaW4oIHNldF8pOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTZXRFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRFbmQoKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlQm9vbCggYjogQm9vbGVhbik7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlQm9vbCggYik7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVCeXRlKCBiKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVJMTYoIGkxNik7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVJMzIoIGkzMik7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlSTY0KCBpNjQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlRG91YmxlKCBkKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmcoIHMpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVBbnNpU3RyaW5nKCBzKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUJpbmFyeSggYik7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNZXNzYWdlRW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlRW5kKCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTdHJ1Y3RFbmQ7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RFbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRGaWVsZEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRFbmQoKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1hcEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1hcEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5SZWFkTWFwRW5kKCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRMaXN0RW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRMaXN0RW5kKCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRTZXRCZWdpbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTZXRFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEVuZCgpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkQm9vbDogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRCb29sOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkQnl0ZTogU2hvcnRJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkQnl0ZTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEkxNjogU21hbGxJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkSTE2OworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkSTMyOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEkzMjsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEk2NDogSW50NjQ7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkSTY0OworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkRG91YmxlOkRvdWJsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWREb3VibGU7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRCaW5hcnk6IFRCeXRlczsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRCaW5hcnk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTdHJpbmc6IHN0cmluZzsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmc7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEFuc2lTdHJpbmc7CitlbmQ7CisKKworeyBJbml0IGhlbHBlciBmdW5jdGlvbnMgfQorCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNZXNzYWdlOyBjb25zdCBBTmFtZTogc3RyaW5nOyBjb25zdCBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZTsgY29uc3QgQVNlcUlEOiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5OYW1lIDo9IEFOYW1lOworICByZWMuVHlwZV8gOj0gQU1lc3NhZ2VUeXBlOworICByZWMuU2VxSUQgOj0gQVNlcUlEOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdFN0cnVjdDsgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnKTsKK2JlZ2luCisgIHJlYy5OYW1lIDo9IEFOYW1lOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdEZpZWxkOyBjb25zdCBBTmFtZTogc3RyaW5nOyBjb25zdCBBVHlwZTogVFR5cGU7IGNvbnN0IEFJRDogU21hbGxJbnQpOworYmVnaW4KKyAgcmVjLk5hbWUgOj0gQU5hbWU7CisgIHJlYy5UeXBlXyA6PSBBVHlwZTsKKyAgcmVjLklkIDo9IEFJZDsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNYXA7IGNvbnN0IEFLZXlUeXBlLCBBVmFsdWVUeXBlOiBUVHlwZTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5WYWx1ZVR5cGUgOj0gQVZhbHVlVHlwZTsKKyAgcmVjLktleVR5cGUgOj0gQUtleVR5cGU7CisgIHJlYy5Db3VudCA6PSBBQ291bnQ7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U2V0OyBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlOyBjb25zdCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLkNvdW50IDo9IEFDb3VudDsKKyAgcmVjLkVsZW1lbnRUeXBlIDo9IEFFbGVtZW50VHlwZTsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRMaXN0OyBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlOyBjb25zdCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLkNvdW50IDo9IEFDb3VudDsKKyAgcmVjLkVsZW1lbnRUeXBlIDo9IEFFbGVtZW50VHlwZTsKK2VuZDsKKworCisKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI5MDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcmlhbGl6ZXIucGFzCkBAIC0wLDAgKzEsMjMwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCit1bml0IFRocmlmdC5TZXJpYWxpemVyOworCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQorCitpbnRlcmZhY2UKKwordXNlcworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywKKyAgeyRFTFNFfQorICBTeXN0ZW0uQ2xhc3NlcywgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywKKyAgeyRFTkRJRn0KKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuU3RyZWFtOworCisKK3R5cGUKKyAgLy8gR2VuZXJpYyB1dGlsaXR5IGZvciBlYXNpbHkgc2VyaWFsaXppbmcgb2JqZWN0cyBpbnRvIGEgYnl0ZSBhcnJheSBvciBTdHJlYW0uCisgIFRTZXJpYWxpemVyID0gY2xhc3MKKyAgcHJpdmF0ZQorICAgIEZTdHJlYW0gICAgOiBUTWVtb3J5U3RyZWFtOworICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OworICAgIEZQcm90b2NvbCAgOiBJUHJvdG9jb2w7CisKKyAgcHVibGljCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRTZXJpYWxpemVyIHRoYXQgdXNlcyB0aGUgVEJpbmFyeVByb3RvY29sIGJ5IGRlZmF1bHQuCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgVFNlcmlhbGl6ZXIuCisgICAgLy8gSXQgd2lsbCB1c2UgdGhlIFRQcm90b2NvbCBzcGVjaWZpZWQgYnkgdGhlIGZhY3RvcnkgdGhhdCBpcyBwYXNzZWQgaW4uCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7ICBvdmVybG9hZDsKKworICAgIC8vIERUT1IKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdC4KKyAgICBmdW5jdGlvbiAgU2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IElCYXNlKSA6IFRCeXRlczsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBTZXJpYWxpemUoIGNvbnN0IGlucHV0IDogSUJhc2U7IGNvbnN0IGFTdG0gOiBUU3RyZWFtKTsgIG92ZXJsb2FkOworICBlbmQ7CisKKworICAvLyBHZW5lcmljIHV0aWxpdHkgZm9yIGVhc2lseSBkZXNlcmlhbGl6aW5nIG9iamVjdHMgZnJvbSBieXRlIGFycmF5IG9yIFN0cmVhbS4KKyAgVERlc2VyaWFsaXplciA9IGNsYXNzCisgIHByaXZhdGUKKyAgICBGU3RyZWFtICAgIDogVE1lbW9yeVN0cmVhbTsKKyAgICBGVHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgICBGUHJvdG9jb2wgIDogSVByb3RvY29sOworCisgIHB1YmxpYworICAgIC8vIENyZWF0ZSBhIG5ldyBURGVzZXJpYWxpemVyIHRoYXQgdXNlcyB0aGUgVEJpbmFyeVByb3RvY29sIGJ5IGRlZmF1bHQuCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgVERlc2VyaWFsaXplci4KKyAgICAvLyBJdCB3aWxsIHVzZSB0aGUgVFByb3RvY29sIHNwZWNpZmllZCBieSB0aGUgZmFjdG9yeSB0aGF0IGlzIHBhc3NlZCBpbi4KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsgIG92ZXJsb2FkOworCisgICAgLy8gRFRPUgorICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworCisgICAgLy8gRGVzZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZGF0YS4KKyAgICBwcm9jZWR1cmUgRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVEJ5dGVzOyBjb25zdCB0YXJnZXQgOiBJQmFzZSk7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVFN0cmVhbTsgY29uc3QgdGFyZ2V0IDogSUJhc2UpOyAgb3ZlcmxvYWQ7CisgIGVuZDsKKworCisKK2ltcGxlbWVudGF0aW9uCisKKworeyBUU2VyaWFsaXplciB9CisKKworY29uc3RydWN0b3IgVFNlcmlhbGl6ZXIuQ3JlYXRlKCk7CisvLyBDcmVhdGUgYSBuZXcgVFNlcmlhbGl6ZXIgdGhhdCB1c2VzIHRoZSBUQmluYXJ5UHJvdG9jb2wgYnkgZGVmYXVsdC4KK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKTsKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUU2VyaWFsaXplci5DcmVhdGUoIGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsKKy8vIENyZWF0ZSBhIG5ldyBUU2VyaWFsaXplci4KKy8vIEl0IHdpbGwgdXNlIHRoZSBUUHJvdG9jb2wgc3BlY2lmaWVkIGJ5IHRoZSBmYWN0b3J5IHRoYXQgaXMgcGFzc2VkIGluLgordmFyIGFkYXB0ZXIgOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSAgICA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgYWRhcHRlciAgICA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIEZTdHJlYW0sIEZBTFNFKTsKKyAgRlRyYW5zcG9ydCA6PSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIG5pbCwgYWRhcHRlcik7CisgIEZQcm90b2NvbCAgOj0gZmFjdG9yeS5HZXRQcm90b2NvbCggRlRyYW5zcG9ydCk7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUU2VyaWFsaXplci5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRlByb3RvY29sICA6PSBuaWw7CisgICAgRlRyYW5zcG9ydCA6PSBuaWw7CisgICAgRnJlZUFuZE5pbCggRlN0cmVhbSk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRTZXJpYWxpemVyLlNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBJQmFzZSkgOiBUQnl0ZXM7CisvLyBTZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgaW50byBhIGJ5dGUgYXJyYXkuIFRoZSBwcm9jZXNzIGlzIHNpbXBsZSwKKy8vIGp1c3QgY2xlYXIgdGhlIGJ5dGUgYXJyYXkgb3V0cHV0LCB3cml0ZSB0aGUgb2JqZWN0IGludG8gaXQsIGFuZCBncmFiIHRoZQorLy8gcmF3IGJ5dGVzLgordmFyIGlCeXRlcyA6IEludDY0OworYmVnaW4KKyAgdHJ5CisgICAgRlN0cmVhbS5TaXplIDo9IDA7CisgICAgaW5wdXQuV3JpdGUoIEZQcm90b2NvbCk7CisgICAgU2V0TGVuZ3RoKCByZXN1bHQsIEZTdHJlYW0uU2l6ZSk7CisgICAgaUJ5dGVzIDo9IExlbmd0aChyZXN1bHQpOworICAgIGlmIGlCeXRlcyA+IDAKKyAgICB0aGVuIE1vdmUoIEZTdHJlYW0uTWVtb3J5XiwgcmVzdWx0WzBdLCBpQnl0ZXMpOworICBmaW5hbGx5CisgICAgRlN0cmVhbS5TaXplIDo9IDA7ICAvLyBmcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFNlcmlhbGl6ZXIuU2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBhU3RtIDogVFN0cmVhbSk7CisvLyBTZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgaW50byBhIGJ5dGUgYXJyYXkuIFRoZSBwcm9jZXNzIGlzIHNpbXBsZSwKKy8vIGp1c3QgY2xlYXIgdGhlIGJ5dGUgYXJyYXkgb3V0cHV0LCB3cml0ZSB0aGUgb2JqZWN0IGludG8gaXQsIGFuZCBncmFiIHRoZQorLy8gcmF3IGJ5dGVzLgorY29uc3QgQ09QWV9FTlRJUkVfU1RSRUFNID0gMDsKK2JlZ2luCisgIHRyeQorICAgIEZTdHJlYW0uU2l6ZSA6PSAwOworICAgIGlucHV0LldyaXRlKCBGUHJvdG9jb2wpOworICAgIGFTdG0uQ29weUZyb20oIEZTdHJlYW0sIENPUFlfRU5USVJFX1NUUkVBTSk7CisgIGZpbmFsbHkKKyAgICBGU3RyZWFtLlNpemUgOj0gMDsgIC8vIGZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkKKyAgZW5kOworZW5kOworCisKK3sgVERlc2VyaWFsaXplciB9CisKKworY29uc3RydWN0b3IgVERlc2VyaWFsaXplci5DcmVhdGUoKTsKKy8vIENyZWF0ZSBhIG5ldyBURGVzZXJpYWxpemVyIHRoYXQgdXNlcyB0aGUgVEJpbmFyeVByb3RvY29sIGJ5IGRlZmF1bHQuCitiZWdpbgorICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSk7CitlbmQ7CisKKworY29uc3RydWN0b3IgVERlc2VyaWFsaXplci5DcmVhdGUoIGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsKKy8vIENyZWF0ZSBhIG5ldyBURGVzZXJpYWxpemVyLgorLy8gSXQgd2lsbCB1c2UgdGhlIFRQcm90b2NvbCBzcGVjaWZpZWQgYnkgdGhlIGZhY3RvcnkgdGhhdCBpcyBwYXNzZWQgaW4uCit2YXIgYWRhcHRlciA6IElUaHJpZnRTdHJlYW07CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RyZWFtICAgIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICBhZGFwdGVyICAgIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggRlN0cmVhbSwgRkFMU0UpOworICBGVHJhbnNwb3J0IDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggYWRhcHRlciwgbmlsKTsKKyAgRlByb3RvY29sICA6PSBmYWN0b3J5LkdldFByb3RvY29sKCBGVHJhbnNwb3J0KTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFREZXNlcmlhbGl6ZXIuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZQcm90b2NvbCAgOj0gbmlsOworICAgIEZUcmFuc3BvcnQgOj0gbmlsOworICAgIEZyZWVBbmROaWwoIEZTdHJlYW0pOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVERlc2VyaWFsaXplci5EZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUQnl0ZXM7IGNvbnN0IHRhcmdldCA6IElCYXNlKTsKKy8vIERlc2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGRhdGEgZnJvbSB0aGUgYnl0ZSBhcnJheS4KK3ZhciBpQnl0ZXMgOiBJbnQ2NDsKK2JlZ2luCisgIHRyeQorICAgIGlCeXRlcyA6PSBMZW5ndGgoaW5wdXQpOworICAgIEZTdHJlYW0uU2l6ZSA6PSBpQnl0ZXM7CisgICAgaWYgaUJ5dGVzID4gMAorICAgIHRoZW4gTW92ZSggaW5wdXRbMF0sIEZTdHJlYW0uTWVtb3J5XiwgaUJ5dGVzKTsKKworICAgIHRhcmdldC5SZWFkKCBGUHJvdG9jb2wpOworICBmaW5hbGx5CisgICAgRlN0cmVhbS5TaXplIDo9IDA7ICAvLyBmcmVlIGFueSBhbGxvY2F0ZWQgbWVtb3J5CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVERlc2VyaWFsaXplci5EZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUU3RyZWFtOyBjb25zdCB0YXJnZXQgOiBJQmFzZSk7CisvLyBEZXNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBkYXRhIGZyb20gdGhlIGJ5dGUgYXJyYXkuCitjb25zdCBDT1BZX0VOVElSRV9TVFJFQU0gPSAwOwordmFyIGJlZm9yZSA6IEludDY0OworYmVnaW4KKyAgdHJ5CisgICAgYmVmb3JlIDo9IEZTdHJlYW0uUG9zaXRpb247CisgICAgRlN0cmVhbS5Db3B5RnJvbSggaW5wdXQsIENPUFlfRU5USVJFX1NUUkVBTSk7CisgICAgRlN0cmVhbS5Qb3NpdGlvbiA6PSBiZWZvcmU7CisgICAgdGFyZ2V0LlJlYWQoIEZQcm90b2NvbCk7CisgIGZpbmFsbHkKKyAgICBGU3RyZWFtLlNpemUgOj0gMDsgIC8vIGZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkKKyAgZW5kOworZW5kOworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VydmVyLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M1NzYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMKQEAgLTAsMCArMSw0MjMgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworIHVuaXQgVGhyaWZ0LlNlcnZlcjsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KK3skSS19ICAvLyBwcmV2ZW50IGFubm95aW5nIGVycm9ycyB3aXRoIGRlZmF1bHQgbG9nIGRlbGVnYXRlIGFuZCBubyBjb25zb2xlCisKK2ludGVyZmFjZQorCit1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIFdpbmRvd3MsIFN5c1V0aWxzLAorICB7JEVMU0V9CisgIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsCisgIHskRU5ESUZ9CisgIFRocmlmdCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVHJhbnNwb3J0OworCit0eXBlCisgIElTZXJ2ZXJFdmVudHMgPSBpbnRlcmZhY2UKKyAgICBbJ3s5RTJBOTlDNS1FRTg1LTQwQjItOUE1Mi0yRDE3MjJCMTgxNzZ9J10KKyAgICAvLyBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgorICAgIHByb2NlZHVyZSBQcmVTZXJ2ZTsKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc2VydmVyIHRyYW5zcG9ydCBpcyByZWFkeSB0byBhY2NlcHQgcmVxdWVzdHMKKyAgICBwcm9jZWR1cmUgUHJlQWNjZXB0OworICAgIC8vIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCB0aGUgc2VydmVyIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCisgICAgZnVuY3Rpb24gIENyZWF0ZVByb2Nlc3NpbmdDb250ZXh0KCBjb25zdCBpbnB1dCwgb3V0cHV0IDogSVByb3RvY29sKSA6IElQcm9jZXNzb3JFdmVudHM7CisgIGVuZDsKKworCisgIElTZXJ2ZXIgPSBpbnRlcmZhY2UKKyAgICBbJ3tBREM0NkYyRC04MTk5LTREMUMtOTZEMi04N0ZENTQzNTE3MjN9J10KKyAgICBwcm9jZWR1cmUgU2VydmU7CisgICAgcHJvY2VkdXJlIFN0b3A7CisKKyAgICBmdW5jdGlvbiBHZXRTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzOworICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXJFdmVudHMoIGNvbnN0IHZhbHVlIDogSVNlcnZlckV2ZW50cyk7CisKKyAgICBwcm9wZXJ0eSBTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzIHJlYWQgR2V0U2VydmVyRXZlbnRzIHdyaXRlIFNldFNlcnZlckV2ZW50czsKKyAgZW5kOworCisgIFRTZXJ2ZXJJbXBsID0gY2xhc3MgYWJzdHJhY3QoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2VydmVyICkKKyAgcHVibGljCisgICAgdHlwZQorICAgICAgVExvZ0RlbGVnYXRlID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggY29uc3Qgc3RyOiBzdHJpbmcpOworICBwcm90ZWN0ZWQKKyAgICBGUHJvY2Vzc29yIDogSVByb2Nlc3NvcjsKKyAgICBGU2VydmVyVHJhbnNwb3J0IDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICBGSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgICAgRk91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgICBGSW5wdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICAgIEZPdXRwdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICAgIEZMb2dEZWxlZ2F0ZSA6IFRMb2dEZWxlZ2F0ZTsKKyAgICBGU2VydmVyRXZlbnRzIDogSVNlcnZlckV2ZW50czsKKworICAgIGNsYXNzIHByb2NlZHVyZSBEZWZhdWx0TG9nRGVsZWdhdGUoIGNvbnN0IHN0cjogc3RyaW5nKTsKKworICAgIGZ1bmN0aW9uIEdldFNlcnZlckV2ZW50cyA6IElTZXJ2ZXJFdmVudHM7CisgICAgcHJvY2VkdXJlIFNldFNlcnZlckV2ZW50cyggY29uc3QgdmFsdWUgOiBJU2VydmVyRXZlbnRzKTsKKworICAgIHByb2NlZHVyZSBTZXJ2ZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFN0b3A7IHZpcnR1YWw7IGFic3RyYWN0OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoCisgICAgICBjb25zdCBBUHJvY2Vzc29yIDpJUHJvY2Vzc29yOworICAgICAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICAgIGNvbnN0IEFJbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgIGNvbnN0IEFPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICBjb25zdCBBSW5wdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICAgICAgY29uc3QgQU91dHB1dFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgICAgICBjb25zdCBBTG9nRGVsZWdhdGUgOiBUTG9nRGVsZWdhdGUKKyAgICAgICk7IG92ZXJsb2FkOworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKAorICAgICAgY29uc3QgQVByb2Nlc3NvciA6SVByb2Nlc3NvcjsKKyAgICAgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQKKyAgICAgICk7IG92ZXJsb2FkOworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKAorICAgICAgY29uc3QgQVByb2Nlc3NvciA6SVByb2Nlc3NvcjsKKyAgICAgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICBjb25zdCBBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZQorICAgICAgKTsgb3ZlcmxvYWQ7CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoCisgICAgICBjb25zdCBBUHJvY2Vzc29yIDpJUHJvY2Vzc29yOworICAgICAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICAgIGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICk7IG92ZXJsb2FkOworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKAorICAgICAgY29uc3QgQVByb2Nlc3NvciA6SVByb2Nlc3NvcjsKKyAgICAgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICAgICAgY29uc3QgQVByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkKKyAgICAgICk7IG92ZXJsb2FkOworICBlbmQ7CisKKyAgVFNpbXBsZVNlcnZlciA9IGNsYXNzKCBUU2VydmVySW1wbCkKKyAgcHJpdmF0ZQorICAgIEZTdG9wIDogQm9vbGVhbjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOyBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0KTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOyBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgQUxvZ0RlbDogVFNlcnZlckltcGwuVExvZ0RlbGVnYXRlKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOyBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5KTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOyBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OworICAgICAgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5OyBjb25zdCBBUHJvdG9jb2xGYWN0b3J5OiBJUHJvdG9jb2xGYWN0b3J5KTsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgU2VydmU7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTdG9wOyBvdmVycmlkZTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVFNlcnZlckltcGwgfQorCitjb25zdHJ1Y3RvciBUU2VydmVySW1wbC5DcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7IGNvbnN0IEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlKTsKK3ZhcgorICBJbnB1dEZhY3RvcnksIE91dHB1dEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBJbnB1dFRyYW5zRmFjdG9yeSwgT3V0cHV0VHJhbnNGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisKK2JlZ2luCisgIElucHV0RmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgT3V0cHV0RmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgSW5wdXRUcmFuc0ZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKyAgT3V0cHV0VHJhbnNGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisKKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSgKKyAgICBBUHJvY2Vzc29yLAorICAgIEFTZXJ2ZXJUcmFuc3BvcnQsCisgICAgSW5wdXRUcmFuc0ZhY3RvcnksCisgICAgT3V0cHV0VHJhbnNGYWN0b3J5LAorICAgIElucHV0RmFjdG9yeSwKKyAgICBPdXRwdXRGYWN0b3J5LAorICAgIEFMb2dEZWxlZ2F0ZQorICApOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVySW1wbC5DcmVhdGUoY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydCk7Cit2YXIKKyAgSW5wdXRGYWN0b3J5LCBPdXRwdXRGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgSW5wdXRUcmFuc0ZhY3RvcnksIE91dHB1dFRyYW5zRmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworCitiZWdpbgorICBJbnB1dEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIE91dHB1dEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIElucHV0VHJhbnNGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisgIE91dHB1dFRyYW5zRmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoCisgICAgQVByb2Nlc3NvciwKKyAgICBBU2VydmVyVHJhbnNwb3J0LAorICAgIElucHV0VHJhbnNGYWN0b3J5LAorICAgIE91dHB1dFRyYW5zRmFjdG9yeSwKKyAgICBJbnB1dEZhY3RvcnksCisgICAgT3V0cHV0RmFjdG9yeSwKKyAgICBEZWZhdWx0TG9nRGVsZWdhdGUKKyAgKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlckltcGwuQ3JlYXRlKGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7IGNvbnN0IEFUcmFuc3BvcnRGYWN0b3J5OiBJVHJhbnNwb3J0RmFjdG9yeSk7Cit2YXIKKyAgSW5wdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OworYmVnaW4KKyAgSW5wdXRQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIE91dHB1dFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKworICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBBUHJvY2Vzc29yLCBBU2VydmVyVHJhbnNwb3J0LCBBVHJhbnNwb3J0RmFjdG9yeSwgQVRyYW5zcG9ydEZhY3RvcnksCisgICAgSW5wdXRQcm90b2NvbEZhY3RvcnksIE91dHB1dFByb3RvY29sRmFjdG9yeSwgRGVmYXVsdExvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlckltcGwuQ3JlYXRlKGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgIGNvbnN0IEFJbnB1dFRyYW5zcG9ydEZhY3RvcnksIEFPdXRwdXRUcmFuc3BvcnRGYWN0b3J5OiBJVHJhbnNwb3J0RmFjdG9yeTsKKyAgY29uc3QgQUlucHV0UHJvdG9jb2xGYWN0b3J5LCBBT3V0cHV0UHJvdG9jb2xGYWN0b3J5OiBJUHJvdG9jb2xGYWN0b3J5OworICBjb25zdCBBTG9nRGVsZWdhdGUgOiBUTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlByb2Nlc3NvciA6PSBBUHJvY2Vzc29yOworICBGU2VydmVyVHJhbnNwb3J0IDo9IEFTZXJ2ZXJUcmFuc3BvcnQ7CisgIEZJbnB1dFRyYW5zcG9ydEZhY3RvcnkgOj0gQUlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgRk91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOj0gQU91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgIEZJbnB1dFByb3RvY29sRmFjdG9yeSA6PSBBSW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgIEZPdXRwdXRQcm90b2NvbEZhY3RvcnkgOj0gQU91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgRkxvZ0RlbGVnYXRlIDo9IEFMb2dEZWxlZ2F0ZTsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRTZXJ2ZXJJbXBsLkRlZmF1bHRMb2dEZWxlZ2F0ZSggY29uc3Qgc3RyOiBzdHJpbmcpOworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggc3RyKTsKKyAgICBpZiBJb1Jlc3VsdCA8PiAwIHRoZW4gT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoc3RyKSk7CisgIGV4Y2VwdAorICAgIE91dHB1dERlYnVnU3RyaW5nKFBDaGFyKHN0cikpOworICBlbmQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJJbXBsLkNyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5OworICBjb25zdCBBUHJvdG9jb2xGYWN0b3J5OiBJUHJvdG9jb2xGYWN0b3J5KTsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworICBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgQVRyYW5zcG9ydEZhY3RvcnksIEFUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIEFQcm90b2NvbEZhY3RvcnksIEFQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKTsKK2VuZDsKKworCitmdW5jdGlvbiBUU2VydmVySW1wbC5HZXRTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzOworYmVnaW4KKyAgcmVzdWx0IDo9IEZTZXJ2ZXJFdmVudHM7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTZXJ2ZXJJbXBsLlNldFNlcnZlckV2ZW50cyggY29uc3QgdmFsdWUgOiBJU2VydmVyRXZlbnRzKTsKK2JlZ2luCisgIC8vIGlmIHlvdSBuZWVkIG1vcmUgdGhhbiBvbmUsIHByb3ZpZGUgYSBzcGVjaWFsaXplZCBJU2VydmVyRXZlbnRzIGltcGxlbWVudGF0aW9uCisgIEZTZXJ2ZXJFdmVudHMgOj0gdmFsdWU7CitlbmQ7CisKKworeyBUU2ltcGxlU2VydmVyIH0KKworY29uc3RydWN0b3IgVFNpbXBsZVNlcnZlci5DcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CisgIGNvbnN0IEFTZXJ2ZXJUcmFuc3BvcnQ6IElTZXJ2ZXJUcmFuc3BvcnQpOwordmFyCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKK2JlZ2luCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIElucHV0VHJhbnNwb3J0RmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisKKyAgaW5oZXJpdGVkIENyZWF0ZSggQVByb2Nlc3NvciwgQVNlcnZlclRyYW5zcG9ydCwgSW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnksIElucHV0UHJvdG9jb2xGYWN0b3J5LCBPdXRwdXRQcm90b2NvbEZhY3RvcnksIERlZmF1bHRMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OyBBTG9nRGVsOiBUU2VydmVySW1wbC5UTG9nRGVsZWdhdGUpOwordmFyCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKKyAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkgOiBJVHJhbnNwb3J0RmFjdG9yeTsKK2JlZ2luCisgIElucHV0UHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICBPdXRwdXRQcm90b2NvbEZhY3RvcnkgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgIElucHV0VHJhbnNwb3J0RmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOworICBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDo9IFRUcmFuc3BvcnRGYWN0b3J5SW1wbC5DcmVhdGU7CisKKyAgaW5oZXJpdGVkIENyZWF0ZSggQVByb2Nlc3NvciwgQVNlcnZlclRyYW5zcG9ydCwgSW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgIE91dHB1dFRyYW5zcG9ydEZhY3RvcnksIElucHV0UHJvdG9jb2xGYWN0b3J5LCBPdXRwdXRQcm90b2NvbEZhY3RvcnksIEFMb2dEZWwpOworZW5kOworCitjb25zdHJ1Y3RvciBUU2ltcGxlU2VydmVyLkNyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKKyAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsIEFUcmFuc3BvcnRGYWN0b3J5LAorICAgIEFUcmFuc3BvcnRGYWN0b3J5LCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSwgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUsIERlZmF1bHRMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBjb25zdCBBUHJvY2Vzc29yOiBJUHJvY2Vzc29yOworICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0OyBjb25zdCBBVHJhbnNwb3J0RmFjdG9yeTogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIGNvbnN0IEFQcm90b2NvbEZhY3Rvcnk6IElQcm90b2NvbEZhY3RvcnkpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggQVByb2Nlc3NvciwgQVNlcnZlclRyYW5zcG9ydCwgQVRyYW5zcG9ydEZhY3RvcnksCisgICAgQVRyYW5zcG9ydEZhY3RvcnksIEFQcm90b2NvbEZhY3RvcnksIEFQcm90b2NvbEZhY3RvcnksIERlZmF1bHRMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2ltcGxlU2VydmVyLlNlcnZlOwordmFyCisgIGNsaWVudCA6IElUcmFuc3BvcnQ7CisgIElucHV0VHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgT3V0cHV0VHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgSW5wdXRQcm90b2NvbCA6IElQcm90b2NvbDsKKyAgT3V0cHV0UHJvdG9jb2wgOiBJUHJvdG9jb2w7CisgIGNvbnRleHQgOiBJUHJvY2Vzc29yRXZlbnRzOworYmVnaW4KKyAgdHJ5CisgICAgRlNlcnZlclRyYW5zcG9ydC5MaXN0ZW47CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgIGJlZ2luCisgICAgICBGTG9nRGVsZWdhdGUoIEUuVG9TdHJpbmcpOworICAgIGVuZDsKKyAgZW5kOworCisgIGlmIEZTZXJ2ZXJFdmVudHMgPD4gbmlsCisgIHRoZW4gRlNlcnZlckV2ZW50cy5QcmVTZXJ2ZTsKKworICBjbGllbnQgOj0gbmlsOworICB3aGlsZSAobm90IEZTdG9wKSBkbworICBiZWdpbgorICAgIHRyeQorICAgICAgLy8gY2xlYW4gdXAgYW55IG9sZCBpbnN0YW5jZXMgYmVmb3JlIHdhaXRpbmcgZm9yIGNsaWVudHMKKyAgICAgIElucHV0VHJhbnNwb3J0IDo9IG5pbDsKKyAgICAgIE91dHB1dFRyYW5zcG9ydCA6PSBuaWw7CisgICAgICBJbnB1dFByb3RvY29sIDo9IG5pbDsKKyAgICAgIE91dHB1dFByb3RvY29sIDo9IG5pbDsKKworICAgICAgLy8gY2xvc2UgYW55IG9sZCBjb25uZWN0aW9ucyBiZWZvcmUgYmVmb3JlIHdhaXRpbmcgZm9yIG5ldyBjbGllbnRzCisgICAgICBpZiBjbGllbnQgPD4gbmlsIHRoZW4gdHJ5CisgICAgICAgIHRyeQorICAgICAgICAgIGNsaWVudC5DbG9zZTsKKyAgICAgICAgZmluYWxseQorICAgICAgICAgIGNsaWVudCA6PSBuaWw7CisgICAgICAgIGVuZDsKKyAgICAgIGV4Y2VwdAorICAgICAgICAvLyBjYXRjaCBhbGwsIHdlIGNhbid0IGRvIG11Y2ggYWJvdXQgaXQgYXQgdGhpcyBwb2ludAorICAgICAgZW5kOworCisgICAgICBjbGllbnQgOj0gRlNlcnZlclRyYW5zcG9ydC5BY2NlcHQoIHByb2NlZHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIEZTZXJ2ZXJFdmVudHMgPD4gbmlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBGU2VydmVyRXZlbnRzLlByZUFjY2VwdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKTsKKworICAgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgRlN0b3AKKyAgICAgICAgdGhlbiBBYm9ydCAgLy8gc2lsZW50IGV4Y2VwdGlvbgorICAgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnU2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwnKTsKKyAgICAgIGVuZDsKKworICAgICAgRkxvZ0RlbGVnYXRlKCAnQ2xpZW50IENvbm5lY3RlZCEnKTsKKworICAgICAgSW5wdXRUcmFuc3BvcnQgOj0gRklucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoIGNsaWVudCApOworICAgICAgT3V0cHV0VHJhbnNwb3J0IDo9IEZPdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCggY2xpZW50ICk7CisgICAgICBJbnB1dFByb3RvY29sIDo9IEZJbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCggSW5wdXRUcmFuc3BvcnQgKTsKKyAgICAgIE91dHB1dFByb3RvY29sIDo9IEZPdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woIE91dHB1dFRyYW5zcG9ydCApOworCisgICAgICBpZiBGU2VydmVyRXZlbnRzIDw+IG5pbAorICAgICAgdGhlbiBjb250ZXh0IDo9IEZTZXJ2ZXJFdmVudHMuQ3JlYXRlUHJvY2Vzc2luZ0NvbnRleHQoIElucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sKQorICAgICAgZWxzZSBjb250ZXh0IDo9IG5pbDsKKworICAgICAgd2hpbGUgbm90IEZTdG9wIGRvIGJlZ2luCisgICAgICAgIGlmIGNvbnRleHQgPD4gbmlsCisgICAgICAgIHRoZW4gY29udGV4dC5Qcm9jZXNzaW5nKCBjbGllbnQpOworICAgICAgICBpZiBub3QgRlByb2Nlc3Nvci5Qcm9jZXNzKCBJbnB1dFByb3RvY29sLCBPdXRwdXRQcm90b2NvbCwgY29udGV4dCkKKyAgICAgICAgdGhlbiBCcmVhazsKKyAgICAgIGVuZDsKKworICAgIGV4Y2VwdAorICAgICAgb24gRTogVFRyYW5zcG9ydEV4Y2VwdGlvbiBkbworICAgICAgYmVnaW4KKyAgICAgICAgaWYgRlN0b3AKKyAgICAgICAgdGhlbiBGTG9nRGVsZWdhdGUoJ1RTaW1wbGVTZXJ2ZXIgd2FzIHNodXR0aW5nIGRvd24sIGNhdWdodCAnICsgRS5Ub1N0cmluZykKKyAgICAgICAgZWxzZSBGTG9nRGVsZWdhdGUoIEUuVG9TdHJpbmcpOworICAgICAgZW5kOworICAgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBiZWdpbgorICAgICAgICBGTG9nRGVsZWdhdGUoIEUuVG9TdHJpbmcpOworICAgICAgZW5kOworICAgIGVuZDsKKworICAgIGlmIGNvbnRleHQgPD4gbmlsCisgICAgdGhlbiBiZWdpbgorICAgICAgY29udGV4dC5DbGVhbnVwQ29udGV4dDsKKyAgICAgIGNvbnRleHQgOj0gbmlsOworICAgIGVuZDsKKworICAgIGlmIElucHV0VHJhbnNwb3J0IDw+IG5pbCB0aGVuCisgICAgYmVnaW4KKyAgICAgIElucHV0VHJhbnNwb3J0LkNsb3NlOworICAgIGVuZDsKKyAgICBpZiBPdXRwdXRUcmFuc3BvcnQgPD4gbmlsIHRoZW4KKyAgICBiZWdpbgorICAgICAgT3V0cHV0VHJhbnNwb3J0LkNsb3NlOworICAgIGVuZDsKKyAgZW5kOworCisgIGlmIEZTdG9wIHRoZW4KKyAgYmVnaW4KKyAgICB0cnkKKyAgICAgIEZTZXJ2ZXJUcmFuc3BvcnQuQ2xvc2U7CisgICAgZXhjZXB0CisgICAgICBvbiBFOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvCisgICAgICBiZWdpbgorICAgICAgICBGTG9nRGVsZWdhdGUoJ1RTZXJ2ZXJUcmFucG9ydCBmYWlsZWQgb24gY2xvc2U6ICcgKyBFLk1lc3NhZ2UpOworICAgICAgZW5kOworICAgIGVuZDsKKyAgICBGU3RvcCA6PSBGYWxzZTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFNpbXBsZVNlcnZlci5TdG9wOworYmVnaW4KKyAgRlN0b3AgOj0gVHJ1ZTsKKyAgRlNlcnZlclRyYW5zcG9ydC5DbG9zZTsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNvY2tldC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU29ja2V0LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGNhYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNvY2tldC5wYXMKQEAgLTAsMCArMSwxNjE3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlNvY2tldDsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KK3skSS19ICAvLyBwcmV2ZW50IGFubm95aW5nIGVycm9ycyB3aXRoIGRlZmF1bHQgbG9nIGRlbGVnYXRlIGFuZCBubyBjb25zb2xlCisKK2ludGVyZmFjZQoreyRJRk5ERUYgT0xEX1NPQ0tFVFN9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKKwordXNlcworICBXaW5hcGkuV2luZG93cywgV2luYXBpLldpbnNvY2syOworCitjb25zdAorICBBSV9QQVNTSVZFICAgICAgICAgICAgICAgID0gJDAwMDAwMDAxOyAgLy8gU29ja2V0IGFkZHJlc3Mgd2lsbCBiZSB1c2VkIGluIGJpbmQoKSBjYWxsCisgIEFJX0NBTk9OTkFNRSAgICAgICAgICAgICAgPSAkMDAwMDAwMDI7ICAvLyBSZXR1cm4gY2Fub25pY2FsIG5hbWUgaW4gZmlyc3QgYWlfY2Fub25uYW1lCisgIEFJX05VTUVSSUNIT1NUICAgICAgICAgICAgPSAkMDAwMDAwMDQ7ICAvLyBOb2RlbmFtZSBtdXN0IGJlIGEgbnVtZXJpYyBhZGRyZXNzIHN0cmluZworICBBSV9OVU1FUklDU0VSViAgICAgICAgICAgID0gJDAwMDAwMDA4OyAgLy8gU2VydmljZW5hbWUgbXVzdCBiZSBhIG51bWVyaWMgcG9ydCBudW1iZXIKKworICBBSV9BTEwgICAgICAgICAgICAgICAgICAgID0gJDAwMDAwMTAwOyAgLy8gUXVlcnkgYm90aCBJUDYgYW5kIElQNCB3aXRoIEFJX1Y0TUFQUEVECisgIEFJX0FERFJDT05GSUcgICAgICAgICAgICAgPSAkMDAwMDA0MDA7ICAvLyBSZXNvbHV0aW9uIG9ubHkgaWYgZ2xvYmFsIGFkZHJlc3MgY29uZmlndXJlZAorICBBSV9WNE1BUFBFRCAgICAgICAgICAgICAgID0gJDAwMDAwODAwOyAgLy8gT24gdjYgZmFpbHVyZSwgcXVlcnkgdjQgYW5kIGNvbnZlcnQgdG8gVjRNQVBQRUQgZm9ybWF0CisKKyAgQUlfTk9OX0FVVEhPUklUQVRJVkUgICAgICA9ICQwMDAwNDAwMDsgIC8vIExVUF9OT05fQVVUSE9SSVRBVElWRQorICBBSV9TRUNVUkUgICAgICAgICAgICAgICAgID0gJDAwMDA4MDAwOyAgLy8gTFVQX1NFQ1VSRQorICBBSV9SRVRVUk5fUFJFRkVSUkVEX05BTUVTID0gJDAwMDEwMDAwOyAgLy8gTFVQX1JFVFVSTl9QUkVGRVJSRURfTkFNRVMKKworICBBSV9GUUROICAgICAgICAgICAgICAgICAgID0gJDAwMDIwMDAwOyAgLy8gUmV0dXJuIHRoZSBGUUROIGluIGFpX2Nhbm9ubmFtZQorICBBSV9GSUxFU0VSVkVSICAgICAgICAgICAgID0gJDAwMDQwMDAwOyAgLy8gUmVzb2x2aW5nIGZpbGVzZXJ2ZXIgbmFtZSByZXNvbHV0aW9uCisKK3R5cGUKKyAgUEFkZHJJbmZvQSA9IF5UQWRkckluZm9BOworICBUQWRkckluZm9BID0gcmVjb3JkCisgICAgYWlfZmxhZ3M6IEludGVnZXI7CisgICAgYWlfZmFtaWx5OiBJbnRlZ2VyOworICAgIGFpX3NvY2t0eXBlOiBJbnRlZ2VyOworICAgIGFpX3Byb3RvY29sOiBJbnRlZ2VyOworICAgIGFpX2FkZHJsZW46IE5hdGl2ZVVJbnQ7CisgICAgYWlfY2Fub25uYW1lOiBQQW5zaUNoYXI7CisgICAgYWlfYWRkcjogUFNvY2tBZGRyOworICAgIGFpX25leHQ6IFBBZGRySW5mb0E7CisgIGVuZDsKKworICBQQWRkckluZm9XID0gXlRBZGRySW5mb1c7CisgIFRBZGRySW5mb1cgPSByZWNvcmQKKyAgICBhaV9mbGFnczogSW50ZWdlcjsKKyAgICBhaV9mYW1pbHk6IEludGVnZXI7CisgICAgYWlfc29ja3R5cGU6IEludGVnZXI7CisgICAgYWlfcHJvdG9jb2w6IEludGVnZXI7CisgICAgYWlfYWRkcmxlbjogTmF0aXZlVUludDsKKyAgICBhaV9jYW5vbm5hbWU6IFBDaGFyOworICAgIGFpX2FkZHI6IFBTb2NrQWRkcjsKKyAgICBhaV9uZXh0OiBQQWRkckluZm9XOworICBlbmQ7CisKKyAgVEFkZHJlc3NGYW1pbHkgPSBVU0hPUlQ7CisKKyAgVEluNkFkZHIgPSByZWNvcmQKKyAgY2FzZSBJbnRlZ2VyIG9mCisgICAgMDogKF9CeXRlOiBhcnJheVswLi4xNV0gb2YgVUNIQVIpOworICAgIDE6IChfV29yZDogYXJyYXlbMC4uN10gb2YgVVNIT1JUKTsKKyAgZW5kOworCisgIFRTY29wZUlkID0gcmVjb3JkCisgIHB1YmxpYworICAgIFZhbHVlOiBVTE9ORzsKKyAgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIEdldEJpdEZpZWxkKExvYzogSW50ZWdlcik6IEludGVnZXI7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgU2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyOyBjb25zdCBhVmFsdWU6IEludGVnZXIpOyBpbmxpbmU7CisgIHB1YmxpYworICAgIHByb3BlcnR5IFpvbmU6IEludGVnZXIgaW5kZXggJDAwMjggcmVhZCBHZXRCaXRGaWVsZCB3cml0ZSBTZXRCaXRGaWVsZDsKKyAgICBwcm9wZXJ0eSBMZXZlbDogSW50ZWdlciBpbmRleCAkMjgwNCByZWFkIEdldEJpdEZpZWxkIHdyaXRlIFNldEJpdEZpZWxkOworICBlbmQ7CisKKyAgVFNvY2tBZGRySW42ID0gcmVjb3JkCisgICAgc2luNl9mYW1pbHk6IFRBZGRyZXNzRmFtaWx5OworICAgIHNpbjZfcG9ydDogVVNIT1JUOworICAgIHNpbjZfZmxvd2luZm86IFVMT05HOworICAgIHNpbjZfYWRkcjogVEluNkFkZHI7CisgIGNhc2UgSW50ZWdlciBvZgorICAgIDA6IChzaW42X3Njb3BlX2lkOiBVTE9ORyk7CisgICAgMTogKHNpbjZfc2NvcGVfc3RydWN0OiBUU2NvcGVJZCk7CisgIGVuZDsKKyAgUFNvY2tBZGRySW42ID0gXlRTb2NrQWRkckluNjsKKworY29uc3QKKyAgTklfTk9GUUROICAgICAgPSAkMDE7ICAvLyBPbmx5IHJldHVybiBub2RlbmFtZSBwb3J0aW9uIGZvciBsb2NhbCBob3N0cworICBOSV9OVU1FUklDSE9TVCA9ICQwMjsgIC8vIFJldHVybiBudW1lcmljIGZvcm0gb2YgdGhlIGhvc3QncyBhZGRyZXNzCisgIE5JX05BTUVSRVFEICAgID0gJDA0OyAgLy8gRXJyb3IgaWYgdGhlIGhvc3QncyBuYW1lIG5vdCBpbiBETlMKKyAgTklfTlVNRVJJQ1NFUlYgPSAkMDg7ICAvLyBSZXR1cm4gbnVtZXJpYyBmb3JtIG9mIHRoZSBzZXJ2aWNlIChwb3J0ICMpCisgIE5JX0RHUkFNICAgICAgID0gJDEwOyAgLy8gU2VydmljZSBpcyBhIGRhdGFncmFtIHNlcnZpY2UKKworICBOSV9NQVhIT1NUICAgICA9IDEwMjU7ICAvLyBNYXggc2l6ZSBvZiBhIGZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZQorICBOSV9NQVhTRVJWICAgICA9IDMyOyAgICAvLyBNYXggc2l6ZSBvZiBhIHNlcnZpY2UgbmFtZQorCitmdW5jdGlvbiBnZXRhZGRyaW5mbyhwTm9kZU5hbWUsIHBTZXJ2aWNlTmFtZTogUEFuc2lDaGFyOyBjb25zdCBwSGludHM6IFRBZGRySW5mb0E7IHZhciBwcFJlc3VsdDogUEFkZHJJbmZvQSk6IEludGVnZXI7IHN0ZGNhbGw7CitmdW5jdGlvbiBHZXRBZGRySW5mb1cocE5vZGVOYW1lLCBwU2VydmljZU5hbWU6IFBXaWRlQ2hhcjsgY29uc3QgcEhpbnRzOiBUQWRkckluZm9XOyB2YXIgcHBSZXN1bHQ6IFBBZGRySW5mb1cpOiBJbnRlZ2VyOyBzdGRjYWxsOworcHJvY2VkdXJlIGZyZWVhZGRyaW5mbyhwQWRkckluZm86IFBBZGRySW5mb0EpOyBzdGRjYWxsOworcHJvY2VkdXJlIEZyZWVBZGRySW5mb1cocEFkZHJJbmZvOiBQQWRkckluZm9XKTsgc3RkY2FsbDsKK2Z1bmN0aW9uIGdldG5hbWVpbmZvKGNvbnN0IHBTb2NrYWRkcjogVFNvY2tBZGRyOyBTb2NrYWRkckxlbmd0aDogSW50ZWdlcjsgcE5vZGVCdWZmZXI6IFBBbnNpQ2hhcjsgTm9kZUJ1ZmZlclNpemU6IERXT1JEOyBwU2VydmljZUJ1ZmZlcjogUEFuc2lDaGFyOworICBTZXJ2aWNlQnVmZmVyU2l6ZTogRFdPUkQ7IEZsYWdzOiBJbnRlZ2VyKTogSW50ZWdlcjsgc3RkY2FsbDsKK2Z1bmN0aW9uIEdldE5hbWVJbmZvVyhjb25zdCBwU29ja2FkZHI6IFRTb2NrQWRkcjsgU29ja2FkZHJMZW5ndGg6IEludGVnZXI7IHBOb2RlQnVmZmVyOiBQV2lkZUNoYXI7IE5vZGVCdWZmZXJTaXplOiBEV09SRDsgcFNlcnZpY2VCdWZmZXI6IFBXaWRlQ2hhcjsKKyAgU2VydmljZUJ1ZmZlclNpemU6IERXT1JEOyBGbGFnczogSW50ZWdlcik6IEludGVnZXI7IHN0ZGNhbGw7CisKK3R5cGUKKyAgVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPiA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoVmFsdWU6IFQpOworCisgIElTbWFydFBvaW50ZXI8VD4gPSByZWZlcmVuY2UgdG8gZnVuY3Rpb246IFQ7CisKKyAgVFNtYXJ0UG9pbnRlcjxUPiA9IGNsYXNzKFRJbnRlcmZhY2VkT2JqZWN0LCBJU21hcnRQb2ludGVyPFQ+KQorICBwcml2YXRlCisgICAgRlZhbHVlOiBUOworICAgIEZEZXN0cm95ZXI6IFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD47CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBVmFsdWU6IFQ7IEFEZXN0cm95ZXI6IFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD4pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gSW52b2tlOiBUOworICBlbmQ7CisKKyAgVEJhc2VTb2NrZXQgPSBjbGFzcyBhYnN0cmFjdAorICBwdWJsaWMgdHlwZQorICAgIFRMb2dEZWxlZ2F0ZSA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoIGNvbnN0IHN0cjogc3RyaW5nKTsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGUG9ydDogSW50ZWdlcjsKKyAgICBGU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsKKyAgICBGU2VuZFRpbWVvdXQsCisgICAgRlJlY3ZUaW1lb3V0OiBMb25nd29yZDsKKyAgICBGS2VlcEFsaXZlOiBCb29sZWFuOworICAgIEZMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlOworICAgIGNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBjbGFzcyBkZXN0cnVjdG9yIERlc3Ryb3k7CisgICAgY2xhc3MgcHJvY2VkdXJlIERlZmF1bHRMb2dEZWxlZ2F0ZShjb25zdCBTdHI6IHN0cmluZyk7CisgIHByb3RlY3RlZCB0eXBlCisgICAgSUdldEFkZHJJbmZvV3JhcHBlciA9IGludGVyZmFjZQorICAgICAgZnVuY3Rpb24gSW5pdDogSW50ZWdlcjsKKyAgICAgIGZ1bmN0aW9uIEdldFJlczogUEFkZHJJbmZvVzsKKyAgICAgIHByb3BlcnR5IFJlczogUEFkZHJJbmZvVyByZWFkIEdldFJlczsKKyAgICBlbmQ7CisgICAgVEdldEFkZHJJbmZvV3JhcHBlciA9IGNsYXNzKFRJbnRlcmZhY2VkT2JqZWN0LCBJR2V0QWRkckluZm9XcmFwcGVyKQorICAgIHN0cmljdCBwcml2YXRlCisgICAgICBGTm9kZTogc3RyaW5nOworICAgICAgRlNlcnZpY2U6IHN0cmluZzsKKyAgICAgIEZIaW50cywKKyAgICAgIEZSZXM6IFBBZGRySW5mb1c7CisgICAgcHVibGljCisgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQU5vZGUsIEFTZXJ2aWNlOiBzdHJpbmc7IEFIaW50czogUEFkZHJJbmZvVyk7CisgICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICAgICAgZnVuY3Rpb24gSW5pdDogSW50ZWdlcjsKKyAgICAgIGZ1bmN0aW9uIEdldFJlczogUEFkZHJJbmZvVzsKKyAgICAgIHByb3BlcnR5IFJlczogUEFkZHJJbmZvVyByZWFkIEdldFJlczsKKyAgICBlbmQ7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgQ29tbW9uSW5pdDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBDcmVhdGVTb2NrZXQoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXIpOiBJR2V0QWRkckluZm9XcmFwcGVyOworICAgIHByb2NlZHVyZSBTZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0U29ja2V0KEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKKyAgICBwcm9wZXJ0eSBMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlIHJlYWQgRkxvZ0RlbGVnYXRlOworICBwdWJsaWMKKyAgICAvLworICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgIC8vIHNvY2tldC4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gRGVzdHJveXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICAgIC8vCisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKworICAgIC8vCisgICAgLy8gU2h1dHMgZG93biBjb21tdW5pY2F0aW9ucyBvbiB0aGUgc29ja2V0CisgICAgLy8KKyAgICBwcm9jZWR1cmUgQ2xvc2U7IHZpcnR1YWw7CisKKyAgICAvLyBUaGUgcG9ydCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgcHJvcGVydHkgUG9ydDogSW50ZWdlciByZWFkIEZQb3J0IHdyaXRlIEZQb3J0OworCisgICAgLy8gVGhlIHJlY2VpdmUgdGltZW91dAorICAgIHByb3BlcnR5IFJlY3ZUaW1lb3V0OiBMb25nd29yZCByZWFkIEZSZWN2VGltZW91dCB3cml0ZSBTZXRSZWN2VGltZW91dDsKKworICAgIC8vIFRoZSBzZW5kIHRpbWVvdXQKKyAgICBwcm9wZXJ0eSBTZW5kVGltZW91dDogTG9uZ3dvcmQgcmVhZCBGU2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CisKKyAgICAvLyBTZXQgU09fS0VFUEFMSVZFCisgICAgcHJvcGVydHkgS2VlcEFsaXZlOiBCb29sZWFuIHJlYWQgRktlZXBBbGl2ZSB3cml0ZSBTZXRLZWVwQWxpdmU7CisKKyAgICAvLyBUaGUgdW5kZXJseWluZyBzb2NrZXQgZGVzY3JpcHRvcgorICAgIHByb3BlcnR5IFNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQgcmVhZCBGU29ja2V0IHdyaXRlIFNldFNvY2tldDsKKyAgZW5kOworCisgIFRTb2NrZXQgPSBjbGFzcyhUQmFzZVNvY2tldCkKKyAgc3RyaWN0IHByaXZhdGUgdHlwZQorICAgIFRDYWNoZWRQZWVyQWRkciA9IHJlY29yZAorICAgIGNhc2UgSW50ZWdlciBvZgorICAgICAgMDogKGlwdjQ6IFRTb2NrQWRkckluKTsKKyAgICAgIDE6IChpcHY2OiBUU29ja0FkZHJJbjYpOworICAgIGVuZDsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSG9zdDogc3RyaW5nOworICAgIEZQZWVySG9zdDogc3RyaW5nOworICAgIEZQZWVyQWRkcmVzczogc3RyaW5nOworICAgIEZQZWVyUG9ydDogSW50ZWdlcjsKKyAgICBGSW50ZXJydXB0TGlzdGVuZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OworICAgIEZDb25uVGltZW91dDogTG9uZ3dvcmQ7CisgICAgRkxpbmdlck9uOiBCb29sZWFuOworICAgIEZMaW5nZXJWYWw6IEludGVnZXI7CisgICAgRk5vRGVsYXk6IEJvb2xlYW47CisgICAgRk1heFJlY3ZSZXRyaWVzOiBMb25nd29yZDsKKyAgICBGQ2FjaGVkUGVlckFkZHI6IFRDYWNoZWRQZWVyQWRkcjsKKyAgICBwcm9jZWR1cmUgSW5pdFBlZXJJbmZvOworICAgIHByb2NlZHVyZSBPcGVuQ29ubmVjdGlvbihSZXM6IFRCYXNlU29ja2V0LklHZXRBZGRySW5mb1dyYXBwZXIpOworICAgIHByb2NlZHVyZSBMb2NhbE9wZW47CisgICAgcHJvY2VkdXJlIFNldEdlbmVyaWNUaW1lb3V0KFM6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBUaW1lb3V0OiBMb25nd29yZDsgT3B0TmFtZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBTZXROb0RlbGF5KEFOb0RlbGF5OiBCb29sZWFuKTsKKyAgICBmdW5jdGlvbiBHZXRTb2NrZXRJbmZvOiBzdHJpbmc7CisgICAgZnVuY3Rpb24gR2V0UGVlckhvc3Q6IHN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRQZWVyQWRkcmVzczogc3RyaW5nOworICAgIGZ1bmN0aW9uIEdldFBlZXJQb3J0OiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIEdldE9yaWdpbjogc3RyaW5nOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIENvbW1vbkluaXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICAvLyBzb2NrZXQuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAgLy8gc29ja2V0LgorICAgIC8vCisgICAgLy8gQHBhcmFtIGhvc3QgQW4gSVAgYWRkcmVzcyBvciBob3N0bmFtZSB0byBjb25uZWN0IHRvCisgICAgLy8gQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCBvbgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gc29ja2V0IGRlc2NyaXB0b3IuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBzb2NrZXQgZGVzY3JpcHRvciB0aGF0CisgICAgLy8gY2FuIGJlIGludGVycnVwdGVkIHNhZmVseS4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUludGVycnVwdExpc3RlbmVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsKKyAgICAgIEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBzb2NrZXQKKyAgICAvLworICAgIC8vIEB0aHJvd3MgRVRyYW5zcG9ydGF0aW9uRXhjZXB0aW9uIElmIHRoZSBzb2NrZXQgY291bGQgbm90IGNvbm5lY3QKKyAgICAvLworICAgIHByb2NlZHVyZSBPcGVuOworCisgICAgLy8KKyAgICAvLyBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBzb2NrZXQKKyAgICAvLworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisKKyAgICAvLworICAgIC8vIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0LgorICAgIC8vIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAwIGluZGljYXRlcyBFT0YKKyAgICAvLyBcdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb2YgdHlwZXM6CisgICAgLy8gICAgICAgICAgSW50ZXJydXB0ZWQgbWVhbnMgdGhlIHNvY2tldCB3YXMgaW50ZXJydXB0ZWQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvdXQgb2YgYSBibG9ja2luZyBjYWxsCisgICAgLy8gICAgICAgICAgTm90T3BlbiBtZWFucyB0aGUgc29ja2V0IGhhcyBiZWVuIGNsb3NlZAorICAgIC8vICAgICAgICAgIFRpbWVkT3V0IG1lYW5zIHRoZSByZWNlaXZlIHRpbWVvdXQgZXhwaXJlZAorICAgIC8vICAgICAgICAgIFVua25vd24gbWVhbnMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQKKyAgICAvLworICAgIGZ1bmN0aW9uIFJlYWQodmFyIEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKKworICAgIC8vCisgICAgLy8gV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIExvb3BzIHVudGlsIGRvbmUgb3IgZmFpbC4KKyAgICAvLworICAgIHByb2NlZHVyZSBXcml0ZShjb25zdCBCdWY7IExlbjogSW50ZWdlcik7CisKKyAgICAvLworICAgIC8vIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBEb2VzIHNpbmdsZSBzZW5kKCkgYW5kIHJldHVybnMgcmVzdWx0LgorICAgIC8vCisgICAgZnVuY3Rpb24gV3JpdGVQYXJ0aWFsKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKKworICAgIC8vCisgICAgLy8gUmV0dXJucyBhIGNhY2hlZCBjb3B5IG9mIHRoZSBwZWVyIGFkZHJlc3MuCisgICAgLy8KKyAgICBmdW5jdGlvbiBHZXRDYWNoZWRBZGRyZXNzKG91dCBMZW46IEludGVnZXIpOiBQU29ja0FkZHI7CisKKyAgICAvLworICAgIC8vIFNldCBhIGNhY2hlIG9mIHRoZSBwZWVyIGFkZHJlc3MgKHVzZWQgd2hlbiB0cml2aWFsbHkgYXZhaWxhYmxlOiBlLmcuCisgICAgLy8gYWNjZXB0KCkgb3IgY29ubmVjdCgpKS4gT25seSBjYWNoZXMgSVBWNCBhbmQgSVBWNjsgdW5zZXQgZm9yIG90aGVycy4KKyAgICAvLworICAgIHByb2NlZHVyZSBTZXRDYWNoZWRBZGRyZXNzKGNvbnN0IEFkZHI6IFRTb2NrQWRkcjsgTGVuOiBJbnRlZ2VyKTsKKworICAgIC8vCisgICAgLy8gQ29udHJvbHMgd2hldGhlciB0aGUgbGluZ2VyIG9wdGlvbiBpcyBzZXQgb24gdGhlIHNvY2tldC4KKyAgICAvLworICAgIC8vIEBwYXJhbSBvbiAgICAgIFdoZXRoZXIgU09fTElOR0VSIGlzIG9uCisgICAgLy8gQHBhcmFtIGxpbmdlciAgSWYgbGluZ2VyIGlzIGFjdGl2ZSwgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGxpbmdlciBmb3IKKyAgICAvLworICAgIHByb2NlZHVyZSBTZXRMaW5nZXIoTGluZ2VyT246IEJvb2xlYW47IExpbmdlclZhbDogSW50ZWdlcik7CisKKyAgICAvLworICAgIC8vIENhbGxzIHNlbGVjdCgpIG9uIHRoZSBzb2NrZXQgdG8gc2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUuCisgICAgLy8KKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOworCisgICAgLy8gV2hldGhlciB0aGUgc29ja2V0IGlzIGFsaXZlCisgICAgcHJvcGVydHkgSXNPcGVuOiBCb29sZWFuIHJlYWQgR2V0SXNPcGVuOworCisgICAgLy8gVGhlIGhvc3QgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgIHByb3BlcnR5IEhvc3Q6IHN0cmluZyByZWFkIEZIb3N0IHdyaXRlIEZIb3N0OworCisgICAgLy8gV2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobQorICAgIHByb3BlcnR5IE5vRGVsYXk6IEJvb2xlYW4gcmVhZCBGTm9EZWxheSB3cml0ZSBTZXROb0RlbGF5OworCisgICAgLy8gQ29ubmVjdCB0aW1lb3V0CisgICAgcHJvcGVydHkgQ29ublRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRkNvbm5UaW1lb3V0IHdyaXRlIEZDb25uVGltZW91dDsKKworICAgIC8vIFRoZSBtYXggbnVtYmVyIG9mIHJlY3YgcmV0cmllcyBpbiB0aGUgY2FzZSBvZiBhIFdTQUVXT1VMREJMT0NLCisgICAgcHJvcGVydHkgTWF4UmVjdlJldHJpZXM6IExvbmd3b3JkIHJlYWQgRk1heFJlY3ZSZXRyaWVzIHdyaXRlIEZNYXhSZWN2UmV0cmllczsKKworICAgIC8vIFNvY2tldCBpbmZvcm1hdGlvbiBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KKyAgICBwcm9wZXJ0eSBTb2NrZXRJbmZvOiBzdHJpbmcgcmVhZCBHZXRTb2NrZXRJbmZvOworCisgICAgLy8gVGhlIEROUyBuYW1lIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAgcHJvcGVydHkgUGVlckhvc3Q6IHN0cmluZyByZWFkIEdldFBlZXJIb3N0OworCisgICAgLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICBwcm9wZXJ0eSBQZWVyQWRkcmVzczogc3RyaW5nIHJlYWQgR2V0UGVlckFkZHJlc3M7CisKKyAgICAvLyBUaGUgcG9ydCBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgIHByb3BlcnR5IFBlZXJQb3J0OiBJbnRlZ2VyIHJlYWQgR2V0UGVlclBvcnQ7CisKKyAgICAvLyBUaGUgb3JpZ2luIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgcHJvcGVydHkgT3JpZ2luOiBzdHJpbmcgcmVhZCBHZXRPcmlnaW47CisgIGVuZDsKKworICBUU2VydmVyU29ja2V0RnVuYyA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoc29jazogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworCisgIFRTZXJ2ZXJTb2NrZXQgPSBjbGFzcyhUQmFzZVNvY2tldCkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGQWRkcmVzczogc3RyaW5nOworICAgIEZBY2NlcHRCYWNrbG9nLAorICAgIEZSZXRyeUxpbWl0LAorICAgIEZSZXRyeURlbGF5LAorICAgIEZUY3BTZW5kQnVmZmVyLAorICAgIEZUY3BSZWN2QnVmZmVyOiBJbnRlZ2VyOworICAgIEZBY2NlcHRUaW1lb3V0OiBMb25nd29yZDsKKyAgICBGTGlzdGVuaW5nLAorICAgIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW46IEJvb2xlYW47CisgICAgRkludGVycnVwdFNvY2tXcml0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBJbnRlcnJ1cHQoKQorICAgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdXNlZCBpbiBzZWxlY3Qgd2l0aCBGU29ja2V0IGZvciBpbnRlcnJ1cHRhYmlsaXR5CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7ICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBJbnRlcnJ1cHRDaGlsZHJlbigpCisgICAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47ICAvLyBpZiBGbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gdGhpcyBpcyBzaGFyZWQgd2l0aCBjaGlsZCBUU29ja2V0cworICAgIEZMaXN0ZW5DYWxsYmFjaywKKyAgICBGQWNjZXB0Q2FsbGJhY2s6IFRTZXJ2ZXJTb2NrZXRGdW5jOworICAgIGZ1bmN0aW9uIENyZWF0ZVNvY2tldE9iaihDbGllbnQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTogVFNvY2tldDsKKyAgICBwcm9jZWR1cmUgTm90aWZ5KE5vdGlmeVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworICAgIHByb2NlZHVyZSBTZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oQVZhbHVlOiBCb29sZWFuKTsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBDb21tb25Jbml0OyBvdmVycmlkZTsKKyAgcHVibGljIGNvbnN0CisgICAgREVGQVVMVF9CQUNLTE9HID0gMTAyNDsKKyAgcHVibGljCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLworICAgIC8vIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gcG9ydCAgICAgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgIC8vIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAgLy8gQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBUG9ydDogSW50ZWdlcjsgQVNlbmRUaW1lb3V0LCBBUmVjdlRpbWVvdXQ6IExvbmd3b3JkOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLworICAgIC8vIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgIC8vIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBMaXN0ZW47CisgICAgZnVuY3Rpb24gQWNjZXB0OiBUU29ja2V0OworICAgIHByb2NlZHVyZSBJbnRlcnJ1cHQ7CisgICAgcHJvY2VkdXJlIEludGVycnVwdENoaWxkcmVuOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisKKyAgICBwcm9wZXJ0eSBBY2NlcHRCYWNrbG9nOiBJbnRlZ2VyIHJlYWQgRkFjY2VwdEJhY2tsb2cgd3JpdGUgRkFjY2VwdEJhY2tsb2c7CisgICAgcHJvcGVydHkgQWNjZXB0VGltZW91dDogTG9uZ3dvcmQgcmVhZCBGQWNjZXB0VGltZW91dCB3cml0ZSBGQWNjZXB0VGltZW91dDsKKyAgICBwcm9wZXJ0eSBSZXRyeUxpbWl0OiBJbnRlZ2VyIHJlYWQgRlJldHJ5TGltaXQgd3JpdGUgRlJldHJ5TGltaXQ7CisgICAgcHJvcGVydHkgUmV0cnlEZWxheTogSW50ZWdlciByZWFkIEZSZXRyeURlbGF5IHdyaXRlIEZSZXRyeURlbGF5OworICAgIHByb3BlcnR5IFRjcFNlbmRCdWZmZXI6IEludGVnZXIgcmVhZCBGVGNwU2VuZEJ1ZmZlciB3cml0ZSBGVGNwU2VuZEJ1ZmZlcjsKKyAgICBwcm9wZXJ0eSBUY3BSZWN2QnVmZmVyOiBJbnRlZ2VyIHJlYWQgRlRjcFJlY3ZCdWZmZXIgd3JpdGUgRlRjcFJlY3ZCdWZmZXI7CisKKyAgICAvLyBXaGVuIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSwgbmV3IGNoaWxkcmVuIFRTb2NrZXRzIHdpbGwgYmUgY29uc3RydWN0ZWQgc28KKyAgICAvLyB0aGV5IGNhbiBiZSBpbnRlcnJ1cHRlZCBieSBUU2VydmVyVHJhbnNwb3J0LkludGVycnVwdENoaWxkcmVuKCkuCisgICAgLy8gVGhpcyBpcyBtb3JlIGV4cGVuc2l2ZSBpbiB0ZXJtcyBvZiBzeXN0ZW0gY2FsbHMgKHBvbGwgKyByZWN2KSBob3dldmVyCisgICAgLy8gZW5zdXJlcyBhIGNvbm5lY3RlZCBjbGllbnQgY2Fubm90IGludGVyZmVyZSB3aXRoIFRTZXJ2ZXIuU3RvcCgpLgorICAgIC8vCisgICAgLy8gV2hlbiBkaXNhYmxlZCwgVFNvY2tldCBjaGlsZHJlbiBkbyBub3QgaW5jdXIgYW4gYWRkaXRpb25hbCBwb2xsKCkgY2FsbC4KKyAgICAvLyBTZXJ2ZXItc2lkZSByZWFkcyBhcmUgbW9yZSBlZmZpY2llbnQsIGhvd2V2ZXIgYSBjbGllbnQgY2FuIGludGVyZmVyZSB3aXRoCisgICAgLy8gdGhlIHNlcnZlcidzIGFiaWxpdHkgdG8gc2h1dGRvd24gcHJvcGVybHkgYnkgc3RheWluZyBjb25uZWN0ZWQuCisgICAgLy8KKyAgICAvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgbGlzdGVuKCk7IG1vZGUgY2Fubm90IGJlIHN3aXRjaGVkIGFmdGVyIHRoYXQuCisgICAgLy8gXHRocm93cyBFUHJvcGVydHlFcnJvciBpZiBsaXN0ZW4oKSBoYXMgYmVlbiBjYWxsZWQKKyAgICBwcm9wZXJ0eSBJbnRlcnJ1cHRhYmxlQ2hpbGRyZW46IEJvb2xlYW4gcmVhZCBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIHdyaXRlIFNldEludGVycnVwdGFibGVDaGlsZHJlbjsKKworICAgIC8vIGxpc3RlbkNhbGxiYWNrIGdldHMgY2FsbGVkIGp1c3QgYmVmb3JlIGxpc3RlbiwgYW5kIGFmdGVyIGFsbCBUaHJpZnQKKyAgICAvLyBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUgY3VzdG9tIHNldHNvY2tvcHQKKyAgICAvLyB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgICAgcHJvcGVydHkgTGlzdGVuQ2FsbGJhY2s6IFRTZXJ2ZXJTb2NrZXRGdW5jIHJlYWQgRkxpc3RlbkNhbGxiYWNrIHdyaXRlIEZMaXN0ZW5DYWxsYmFjazsKKworICAgIC8vIGFjY2VwdENhbGxiYWNrIGdldHMgY2FsbGVkIGFmdGVyIGVhY2ggYWNjZXB0IGNhbGwsIG9uIHRoZSBuZXdseSBjcmVhdGVkIHNvY2tldC4KKyAgICAvLyBJdCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIFRocmlmdCBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUKKyAgICAvLyBjdXN0b20gc2V0c29ja29wdCB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgYWNjZXB0ZWQKKyAgICAvLyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICAgIHByb3BlcnR5IEFjY2VwdENhbGxiYWNrOiBUU2VydmVyU29ja2V0RnVuYyByZWFkIEZBY2NlcHRDYWxsYmFjayB3cml0ZSBGQWNjZXB0Q2FsbGJhY2s7CisgIGVuZDsKKworeyRFTkRJRn0gLy8gbm90IGZvciBPTERfU09DS0VUUworaW1wbGVtZW50YXRpb24KK3skSUZOREVGIE9MRF9TT0NLRVRTfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCisKK3VzZXMKKyAgU3lzdGVtLlN5c1V0aWxzLCBTeXN0ZW0uTWF0aCwgU3lzdGVtLkRhdGVVdGlscywgVGhyaWZ0LlRyYW5zcG9ydDsKKworY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5DcmVhdGUoQU5vZGUsIEFTZXJ2aWNlOiBzdHJpbmc7IEFIaW50czogUEFkZHJJbmZvVyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTm9kZSA6PSBBTm9kZTsKKyAgRlNlcnZpY2UgOj0gQVNlcnZpY2U7CisgIEZIaW50cyA6PSBBSGludHM7CisgIEZSZXMgOj0gbmlsOworZW5kOworCitkZXN0cnVjdG9yIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuRGVzdHJveTsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKEZSZXMpIHRoZW4KKyAgICBGcmVlQWRkckluZm9XKEZSZXMpOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5Jbml0OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRlJlcyA9IG5pbCB0aGVuCisgICAgRXhpdChHZXRBZGRySW5mb1coQEZOb2RlWzFdLCBARlNlcnZpY2VbMV0sIEZIaW50c14sIEZSZXMpKTsKKyAgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuR2V0UmVzOiBQQWRkckluZm9XOworYmVnaW4KKyAgUmVzdWx0IDo9IEZSZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBEZXN0cm95ZXJPZkZpbmVTb2NrZXRzKHNzb2NrOiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CitiZWdpbgorICBjbG9zZXNvY2tldChzc29jayk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTY29wZUlkLkdldEJpdEZpZWxkKExvYzogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gKFZhbHVlIHNociAoTG9jIHNociA4KSkgYW5kICgoMSBzaGwgKExvYyBhbmQgJEZGKSkgLSAxKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTY29wZUlkLlNldEJpdEZpZWxkKExvYzogSW50ZWdlcjsgY29uc3QgYVZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIFZhbHVlIDo9IChWYWx1ZSBhbmQgVUxPTkcoKG5vdCAoKDEgc2hsIChMb2MgYW5kICRGRikpIC0gMSkpKSkgb3IgVUxPTkcoYVZhbHVlIHNobCAoTG9jIHNociA4KSk7CitlbmQ7CisKK2Z1bmN0aW9uIGdldGFkZHJpbmZvOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnZ2V0YWRkcmluZm8nOworZnVuY3Rpb24gR2V0QWRkckluZm9XOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnR2V0QWRkckluZm9XJzsKK3Byb2NlZHVyZSBmcmVlYWRkcmluZm87IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdmcmVlYWRkcmluZm8nOworcHJvY2VkdXJlIEZyZWVBZGRySW5mb1c7IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdGcmVlQWRkckluZm9XJzsKK2Z1bmN0aW9uIGdldG5hbWVpbmZvOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnZ2V0bmFtZWluZm8nOworZnVuY3Rpb24gR2V0TmFtZUluZm9XOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnR2V0TmFtZUluZm9XJzsKKworY29uc3RydWN0b3IgVFNtYXJ0UG9pbnRlcjxUPi5DcmVhdGUoQVZhbHVlOiBUOyBBRGVzdHJveWVyOiBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZWYWx1ZSA6PSBBVmFsdWU7CisgIEZEZXN0cm95ZXIgOj0gQURlc3Ryb3llcjsKK2VuZDsKKworZGVzdHJ1Y3RvciBUU21hcnRQb2ludGVyPFQ+LkRlc3Ryb3k7CitiZWdpbgorICBpZiBBc3NpZ25lZChGRGVzdHJveWVyKSB0aGVuIEZEZXN0cm95ZXIoRlZhbHVlKTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK2Z1bmN0aW9uIFRTbWFydFBvaW50ZXI8VD4uSW52b2tlOiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZWYWx1ZTsKK2VuZDsKKworY2xhc3MgY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuQ3JlYXRlOwordmFyCisgIFZlcnNpb246IFdPUkQ7CisgIERhdGE6IFdTQURhdGE7CisgIEVycm9yOiBJbnRlZ2VyOworYmVnaW4KKyAgVmVyc2lvbiA6PSAkMDIwMjsKKyAgRmlsbENoYXIoRGF0YSwgU2l6ZU9mKERhdGEpLCAwKTsKKyAgRXJyb3IgOj0gV1NBU3RhcnR1cChWZXJzaW9uLCBEYXRhKTsKKyAgaWYgRXJyb3IgPD4gMCB0aGVuCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnRmFpbGVkIHRvIGluaXRpYWxpemUgV2luc29jay4nKTsKK2VuZDsKKworY2xhc3MgZGVzdHJ1Y3RvciBUQmFzZVNvY2tldC5EZXN0cm95OworYmVnaW4KKyAgV1NBQ2xlYW51cDsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRCYXNlU29ja2V0LkRlZmF1bHRMb2dEZWxlZ2F0ZShjb25zdCBTdHI6IHN0cmluZyk7Cit2YXIKKyAgT3V0U3RyOiBzdHJpbmc7CitiZWdpbgorICBPdXRTdHIgOj0gRm9ybWF0KCdUaHJpZnQ6ICVzICVzJywgW0RhdGVUaW1lVG9TdHIoTm93LCBURm9ybWF0U2V0dGluZ3MuQ3JlYXRlKSwgU3RyXSk7CisgIHRyeQorICAgIFdyaXRlbG4oT3V0U3RyKTsKKyAgICBpZiBJb1Jlc3VsdCA8PiAwIHRoZW4gT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoT3V0U3RyKSk7CisgIGV4Y2VwdAorICAgIE91dHB1dERlYnVnU3RyaW5nKFBDaGFyKE91dFN0cikpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5Db21tb25Jbml0OworYmVnaW4KKyAgRlNvY2tldCA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgRlBvcnQgOj0gMDsKKyAgRlNlbmRUaW1lb3V0IDo9IDA7CisgIEZSZWN2VGltZW91dCA6PSAwOworICBGS2VlcEFsaXZlIDo9IEZhbHNlOworICBGTG9nRGVsZWdhdGUgOj0gRGVmYXVsdExvZ0RlbGVnYXRlOworZW5kOworCitmdW5jdGlvbiBUQmFzZVNvY2tldC5DcmVhdGVTb2NrZXQoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXIpOiBJR2V0QWRkckluZm9XcmFwcGVyOwordmFyCisgIEhpbnRzOiBUQWRkckluZm9XOworICBSZXM6IFBBZGRySW5mb1c7CisgIFRoZVBvcnQ6IGFycmF5WzAuLjVdIG9mIENoYXI7CisgIEVycm9yOiBJbnRlZ2VyOworYmVnaW4KKyAgRmlsbENoYXIoSGludHMsIFNpemVPZihIaW50cyksIDApOworICBIaW50cy5haV9mYW1pbHkgOj0gUEZfVU5TUEVDOworICBIaW50cy5haV9zb2NrdHlwZSA6PSBTT0NLX1NUUkVBTTsKKyAgSGludHMuYWlfZmxhZ3MgOj0gQUlfUEFTU0lWRSBvciBBSV9BRERSQ09ORklHOworICBTdHJGbXQoVGhlUG9ydCwgJyVkJywgW0ZQb3J0XSk7CisKKyAgUmVzdWx0IDo9IFRHZXRBZGRySW5mb1dyYXBwZXIuQ3JlYXRlKEFBZGRyZXNzLCBUaGVQb3J0LCBASGludHMpOworICBFcnJvciA6PSBSZXN1bHQuSW5pdDsKKyAgaWYgRXJyb3IgPD4gMCB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdHZXRBZGRySW5mb1cgJWQ6ICVzJywgW0Vycm9yLCBTeXNFcnJvck1lc3NhZ2UoRXJyb3IpXSkpOworICAgIENsb3NlOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4nKTsKKyAgZW5kOworCisgIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCisgIC8vIGludG8gaXB2NiBzcGFjZS4KKyAgUmVzIDo9IFJlc3VsdC5SZXM7CisgIHdoaWxlIEFzc2lnbmVkKFJlcykgZG8gYmVnaW4KKyAgICBpZiAoUmVzXi5haV9mYW1pbHkgPSBBRl9JTkVUNikgb3IgKG5vdCBBc3NpZ25lZChSZXNeLmFpX25leHQpKSB0aGVuCisgICAgICBCcmVhazsKKyAgICBSZXMgOj0gUmVzXi5haV9uZXh0OworICBlbmQ7CisKKyAgRlNvY2tldCA6PSBXaW5hcGkuV2luc29jazIuc29ja2V0KFJlc14uYWlfZmFtaWx5LCBSZXNeLmFpX3NvY2t0eXBlLCBSZXNeLmFpX3Byb3RvY29sKTsKKyAgaWYgRlNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBFcnJvciA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUQmFzZVNvY2tldC5DcmVhdGVTb2NrZXQoKSBzb2NrZXQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJyb3IpXSkpOworICAgIENsb3NlOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3NvY2tldCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJyb3IpXSkpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIEZSZWN2VGltZW91dCA6PSBBUmVjdlRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIEZTZW5kVGltZW91dCA6PSBBU2VuZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7CitiZWdpbgorICBGS2VlcEFsaXZlIDo9IEFLZWVwQWxpdmU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRTb2NrZXQoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworYmVnaW4KKyAgaWYgRlNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgQ2xvc2U7CisgIEZTb2NrZXQgOj0gQVNvY2tldDsKK2VuZDsKKworY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIENvbW1vbkluaXQ7CisgIGlmIEFzc2lnbmVkKEFMb2dEZWxlZ2F0ZSkgdGhlbiBGTG9nRGVsZWdhdGUgOj0gQUxvZ0RlbGVnYXRlOworZW5kOworCitjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIENvbW1vbkluaXQ7CisgIEZQb3J0IDo9IEFQb3J0OworICBpZiBBc3NpZ25lZChBTG9nRGVsZWdhdGUpIHRoZW4gRkxvZ0RlbGVnYXRlIDo9IEFMb2dEZWxlZ2F0ZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQmFzZVNvY2tldC5EZXN0cm95OworYmVnaW4KKyAgQ2xvc2U7CisgIGluaGVyaXRlZCBEZXN0cm95OworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuQ2xvc2U7CitiZWdpbgorICBpZiBGU29ja2V0IDw+IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBzaHV0ZG93bihGU29ja2V0LCBTRF9CT1RIKTsKKyAgICBjbG9zZXNvY2tldChGU29ja2V0KTsKKyAgZW5kOworICBGU29ja2V0IDo9IElOVkFMSURfU09DS0VUOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Jbml0UGVlckluZm87CitiZWdpbgorICBGQ2FjaGVkUGVlckFkZHIuaXB2NC5zaW5fZmFtaWx5IDo9IEFGX1VOU1BFQzsKKyAgRlBlZXJIb3N0IDo9ICcnOworICBGUGVlckFkZHJlc3MgOj0gJyc7CisgIEZQZWVyUG9ydCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Db21tb25Jbml0OworYmVnaW4KKyAgaW5oZXJpdGVkIENvbW1vbkluaXQ7CisgIEZIb3N0IDo9ICcnOworICBGSW50ZXJydXB0TGlzdGVuZXIgOj0gbmlsOworICBGQ29ublRpbWVvdXQgOj0gMDsKKyAgRkxpbmdlck9uIDo9IFRydWU7CisgIEZMaW5nZXJWYWwgOj0gMDsKKyAgRk5vRGVsYXkgOj0gVHJ1ZTsKKyAgRk1heFJlY3ZSZXRyaWVzIDo9IDU7CisgIEluaXRQZWVySW5mbzsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuT3BlbkNvbm5lY3Rpb24oUmVzOiBUQmFzZVNvY2tldC5JR2V0QWRkckluZm9XcmFwcGVyKTsKK2xhYmVsCisgIERvbmU7Cit2YXIKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBSZXQsCisgIFJldDI6IEludGVnZXI7CisgIEZkczogVEZkU2V0OworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBWYWwsCisgIExvbjogSW50ZWdlcjsKKyAgT25lLAorICBaZXJvOiBDYXJkaW5hbDsKK2JlZ2luCisgIGlmIFNlbmRUaW1lb3V0ID4gMCB0aGVuIFNldFNlbmRUaW1lb3V0KFNlbmRUaW1lb3V0KTsKKyAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4gU2V0UmVjdlRpbWVvdXQoUmVjdlRpbWVvdXQpOworICBpZiBLZWVwQWxpdmUgdGhlbiBTZXRLZWVwQWxpdmUoS2VlcEFsaXZlKTsKKyAgU2V0TGluZ2VyKEZMaW5nZXJPbiwgRkxpbmdlclZhbCk7CisgIFNldE5vRGVsYXkoRk5vRGVsYXkpOworCisgIC8vIFNldCB0aGUgc29ja2V0IHRvIGJlIG5vbiBibG9ja2luZyBmb3IgY29ubmVjdCBpZiBhIHRpbWVvdXQgZXhpc3RzCisgIFplcm8gOj0gMDsKKyAgaWYgRkNvbm5UaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgT25lIDo9IDE7CisgICAgaWYgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBPbmUpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBpb2N0bHNvY2tldCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBpZiBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIFplcm8pID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBpb2N0bHNvY2tldCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kOworCisgIFJldCA6PSBjb25uZWN0KFNvY2tldCwgUmVzLlJlc14uYWlfYWRkcl4sIFJlcy5SZXNeLmFpX2FkZHJsZW4pOworICBpZiBSZXQgPSAwIHRoZW4gZ290byBEb25lOworCisgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgIGlmIChFcnJub0NvcHkgPD4gV1NBRUlOUFJPR1JFU1MpIGFuZCAoRXJybm9Db3B5IDw+IFdTQUVXT1VMREJMT0NLKSB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgY29ubmVjdCgpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdjb25uZWN0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIEZEX1pFUk8oRmRzKTsKKyAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgIGlmIEZDb25uVGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgIFRWYWwudHZfc2VjIDo9IEZDb25uVGltZW91dCBkaXYgMTAwMDsKKyAgICBUVmFsLnR2X3VzZWMgOj0gKEZDb25uVGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgIFBUVmFsIDo9IEBUVmFsOworICBlbmQKKyAgZWxzZQorICAgIFBUVmFsIDo9IG5pbDsKKyAgUmV0IDo9IHNlbGVjdCgxLCBuaWwsIEBGZHMsIG5pbCwgUFRWYWwpOworCisgIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgIC8vIEVuc3VyZSB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gZXJyb3JzIHNldAorICAgIExvbiA6PSBTaXplT2YoVmFsKTsKKyAgICBSZXQyIDo9IGdldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19FUlJPUiwgQFZhbCwgTG9uKTsKKyAgICBpZiBSZXQyID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBnZXRzb2Nrb3B0KCkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnZ2V0c29ja29wdCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgICAgLy8gbm8gZXJyb3JzIG9uIHNvY2tldCwgZ28gdG8gdG93bgorICAgIGlmIFZhbCA9IDAgdGhlbiBnb3RvIERvbmU7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgZXJyb3Igb24gc29ja2V0IChhZnRlciBzZWxlY3QoKSkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3NvY2tldCBPcGVuQ29ubmVjdGlvbigpIGVycm9yOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoVmFsKV0pKTsKKyAgZW5kCisgIGVsc2UgaWYgUmV0ID0gMCB0aGVuIGJlZ2luCisgICAgLy8gc29ja2V0IHRpbWVkIG91dAorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIHRpbWVkIG91dCAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdPcGVuQ29ubmVjdGlvbigpIHRpbWVkIG91dCcpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIC8vIGVycm9yIG9uIHNlbGVjdCgpCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBzZWxlY3QoKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnc2VsZWN0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCitEb25lOgorICAvLyBTZXQgc29ja2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgKGJsb2NraW5nKQorICBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIFplcm8pOworICBTZXRDYWNoZWRBZGRyZXNzKFJlcy5SZXNeLmFpX2FkZHJeLCBSZXMuUmVzXi5haV9hZGRybGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuTG9jYWxPcGVuOwordmFyCisgIFJlczogVEJhc2VTb2NrZXQuSUdldEFkZHJJbmZvV3JhcHBlcjsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIEV4aXQ7CisKKyAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKKyAgaWYgKFBvcnQgPCAwKSBvciAoUG9ydCA+ICRGRkZGKSB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MuQ3JlYXRlKCdTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkJyk7CisKKyAgUmVzIDo9IENyZWF0ZVNvY2tldChIb3N0LCBQb3J0KTsKKworICBPcGVuQ29ubmVjdGlvbihSZXMpOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRHZW5lcmljVGltZW91dChTOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgVGltZW91dDogTG9uZ3dvcmQ7IE9wdE5hbWU6IEludGVnZXIpOwordmFyCisgIFRpbWU6IERXT1JEOworYmVnaW4KKyAgaWYgUyA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBFeGl0OworCisgIFRpbWUgOj0gVGltZW91dDsKKworICBpZiBzZXRzb2Nrb3B0KFMsIFNPTF9TT0NLRVQsIE9wdE5hbWUsIEBUaW1lLCBTaXplT2YoVGltZSkpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1NldEdlbmVyaWNUaW1lb3V0KCkgc2V0c29ja29wdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldE5vRGVsYXkoQU5vRGVsYXk6IEJvb2xlYW4pOwordmFyCisgIFY6IEludGVnZXI7CitiZWdpbgorICBGTm9EZWxheSA6PSBBTm9EZWxheTsKKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIEV4aXQ7CisKKyAgViA6PSBJZlRoZW4oRk5vRGVsYXksIDEsIDApOworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBAViwgU2l6ZU9mKFYpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlNldE5vRGVsYXkoKSBzZXRzb2Nrb3B0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0U29ja2V0SW5mbzogc3RyaW5nOworYmVnaW4KKyAgaWYgKEZIb3N0ID0gJycpIG9yIChQb3J0ID0gMCkgdGhlbgorICAgIFJlc3VsdCA6PSAnPEhvc3Q6ICcgKyBHZXRQZWVyQWRkcmVzcyArICcgUG9ydDogJyArIEdldFBlZXJQb3J0LlRvU3RyaW5nICsgJz4nCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gJzxIb3N0OiAnICsgRkhvc3QgKyAnIFBvcnQ6ICcgKyBQb3J0LlRvU3RyaW5nICsgJz4nOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFBlZXJIb3N0OiBzdHJpbmc7Cit2YXIKKyAgQWRkcjogVFNvY2tBZGRyU3RvcmFnZTsKKyAgQWRkclB0cjogUFNvY2tBZGRyOworICBBZGRyTGVuOiBJbnRlZ2VyOworICBDbGllbnRIb3N0OiBhcnJheVswLi5OSV9NQVhIT1NULTFdIG9mIENoYXI7CisgIENsaWVudFNlcnZpY2U6IGFycmF5WzAuLk5JX01BWFNFUlYtMV0gb2YgQ2hhcjsKK2JlZ2luCisgIGlmIEZQZWVySG9zdCA9ICcnIHRoZW4gYmVnaW4KKyAgICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBFeGl0KEZQZWVySG9zdCk7CisKKyAgICBBZGRyUHRyIDo9IEdldENhY2hlZEFkZHJlc3MoQWRkckxlbik7CisgICAgaWYgQWRkclB0ciA9IG5pbCB0aGVuIGJlZ2luCisgICAgICBBZGRyTGVuIDo9IFNpemVPZihBZGRyKTsKKyAgICAgIGlmIGdldHBlZXJuYW1lKFNvY2tldCwgUFNvY2tBZGRyKEBBZGRyKV4sIEFkZHJMZW4pIDw+IDAgdGhlbgorICAgICAgICBFeGl0KEZQZWVySG9zdCk7CisgICAgICBBZGRyUHRyIDo9IFBTb2NrQWRkcihAQWRkcik7CisgICAgICBTZXRDYWNoZWRBZGRyZXNzKEFkZHJQdHJeLCBBZGRyTGVuKTsKKyAgICBlbmQ7CisKKyAgICBHZXROYW1lSW5mb1coQWRkclB0cl4sIEFkZHJMZW4sIENsaWVudEhvc3QsIE5JX01BWEhPU1QsIENsaWVudFNlcnZpY2UsIE5JX01BWFNFUlYsIDApOworICAgIEZQZWVySG9zdCA6PSBDbGllbnRIb3N0OworICBlbmQ7CisgIFJlc3VsdCA6PSBGUGVlckhvc3Q7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0UGVlckFkZHJlc3M6IHN0cmluZzsKK3ZhcgorICBBZGRyOiBUU29ja0FkZHJTdG9yYWdlOworICBBZGRyUHRyOiBQU29ja0FkZHI7CisgIEFkZHJMZW46IEludGVnZXI7CisgIENsaWVudEhvc3Q6IGFycmF5WzAuLk5JX01BWEhPU1QtMV0gb2YgQ2hhcjsKKyAgQ2xpZW50U2VydmljZTogYXJyYXlbMC4uTklfTUFYU0VSVi0xXSBvZiBDaGFyOworYmVnaW4KKyAgaWYgRlBlZXJBZGRyZXNzID0gJycgdGhlbiBiZWdpbgorICAgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIEV4aXQoRlBlZXJBZGRyZXNzKTsKKworICAgIEFkZHJQdHIgOj0gR2V0Q2FjaGVkQWRkcmVzcyhBZGRyTGVuKTsKKyAgICBpZiBBZGRyUHRyID0gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEFkZHJMZW4gOj0gU2l6ZU9mKEFkZHIpOworICAgICAgaWYgZ2V0cGVlcm5hbWUoU29ja2V0LCBQU29ja0FkZHIoQEFkZHIpXiwgQWRkckxlbikgPD4gMCB0aGVuCisgICAgICAgIEV4aXQoRlBlZXJIb3N0KTsKKyAgICAgIEFkZHJQdHIgOj0gUFNvY2tBZGRyKEBBZGRyKTsKKyAgICAgIFNldENhY2hlZEFkZHJlc3MoQWRkclB0cl4sIEFkZHJMZW4pOworICAgIGVuZDsKKworICAgIEdldE5hbWVJbmZvVyhBZGRyUHRyXiwgQWRkckxlbiwgQ2xpZW50SG9zdCwgTklfTUFYSE9TVCwgQ2xpZW50U2VydmljZSwgTklfTUFYU0VSViwgTklfTlVNRVJJQ0hPU1Qgb3IgTklfTlVNRVJJQ1NFUlYpOworICAgIEZQZWVyQWRkcmVzcyA6PSBDbGllbnRIb3N0OworICAgIFRyeVN0clRvSW50KENsaWVudFNlcnZpY2UsIEZQZWVyUG9ydCk7CisgIGVuZDsKKyAgUmVzdWx0IDo9IEZQZWVyQWRkcmVzcworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFBlZXJQb3J0OiBJbnRlZ2VyOworYmVnaW4KKyAgR2V0UGVlckFkZHJlc3M7CisgIFJlc3VsdCA6PSBGUGVlclBvcnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0T3JpZ2luOiBzdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gR2V0UGVlckhvc3QgKyAnOicgKyBHZXRQZWVyUG9ydC5Ub1N0cmluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0KTsKKyAgU2V0R2VuZXJpY1RpbWVvdXQoU29ja2V0LCBBUmVjdlRpbWVvdXQsIFNPX1JDVlRJTUVPKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0KTsKKyAgU2V0R2VuZXJpY1RpbWVvdXQoU29ja2V0LCBBU2VuZFRpbWVvdXQsIFNPX1NORFRJTUVPKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOwordmFyCisgIFZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgaW5oZXJpdGVkIFNldEtlZXBBbGl2ZShBS2VlcEFsaXZlKTsKKworICBWYWx1ZSA6PSBJZlRoZW4oS2VlcEFsaXZlLCAxLCAwKTsKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgQFZhbHVlLCBTaXplT2YoVmFsdWUpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlNldEtlZXBBbGl2ZSgpIHNldHNvY2tvcHQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOworYmVnaW4KKyAgLy8gTm90IG5lZWRlZCwgYnV0IGp1c3QgYSBwbGFjZWhvbGRlcgorICBpbmhlcml0ZWQgQ3JlYXRlKEFMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworICBGSG9zdCA6PSBBSG9zdDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQUxvZ0RlbGVnYXRlKTsKKyAgU29ja2V0IDo9IEFTb2NrZXQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBSW50ZXJydXB0TGlzdGVuZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OworICBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFMb2dEZWxlZ2F0ZSk7CisgIFNvY2tldCA6PSBBU29ja2V0OworICBGSW50ZXJydXB0TGlzdGVuZXIgOj0gQUludGVycnVwdExpc3RlbmVyOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5PcGVuOworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKKyAgTG9jYWxPcGVuOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5DbG9zZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDbG9zZTsKKyAgSW5pdFBlZXJJbmZvOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LlJlYWQodmFyIEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2xhYmVsCisgIFRyeUFnYWluOwordmFyCisgIFJldHJpZXM6IExvbmd3b3JkOworICBFQWdhaW5UaHJlc2hvbGQsCisgIFJlYWRFbGFwc2VkOiBVSW50NjQ7CisgIFN0YXJ0OiBURGF0ZVRpbWU7CisgIEdvdDogSW50ZWdlcjsKKyAgRmRzOiBURmRTZXQ7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgUmV0OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gc29ja2V0Jyk7CisKKyAgUmV0cmllcyA6PSAwOworCisgIC8vIFRIUklGVF9FQUdBSU4gY2FuIGJlIHNpZ25hbGxlZCBib3RoIHdoZW4gYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCBhbmQgd2hlbgorICAvLyB0aGUgc3lzdGVtIGlzIG91dCBvZiByZXNvdXJjZXMgKGFuIGF3ZXNvbWUgdW5kb2N1bWVudGVkIGZlYXR1cmUpLgorICAvLyBUaGUgZm9sbG93aW5nIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHRpbWUgaW50ZXJ2YWwgdW5kZXIgd2hpY2gKKyAgLy8gVEhSSUZUX0VBR0FJTiBpcyB0YWtlbiB0byBpbmRpY2F0ZSBhbiBvdXQgb2YgcmVzb3VyY2VzIGVycm9yLgorICBFQWdhaW5UaHJlc2hvbGQgOj0gMDsKKyAgaWYgUmVjdlRpbWVvdXQgPD4gMCB0aGVuCisgICAgLy8gaWYgYSByZWFkVGltZW91dCBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBhIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzLCB0aGVuCisgICAgLy8gdGhlIHRocmVzaG9sZCB3aWxsIGVuc3VyZSB0aGF0IHRoZSByZWFkIHRpbWVvdXQgaXMgbm90IGV4Y2VlZGVkIGV2ZW4gaW4gdGhlCisgICAgLy8gY2FzZSBvZiByZXNvdXJjZSBlcnJvcnMKKyAgICBFQWdhaW5UaHJlc2hvbGQgOj0gUmVjdlRpbWVvdXQgZGl2IElmVGhlbihGTWF4UmVjdlJldHJpZXMgPiAwLCBGTWF4UmVjdlJldHJpZXMsIDIpOworCitUcnlBZ2FpbjoKKyAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKKyAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4KKyAgICBTdGFydCA6PSBOb3cKKyAgZWxzZQorICAgIC8vIGlmIHRoZXJlIGlzIG5vIHJlYWQgdGltZW91dCB3ZSBkb24ndCBuZWVkIHRoZSBUT0QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICAvLyBhbiBUSFJJRlRfRUFHQUlOIGlzIGR1ZSB0byBhIHRpbWVvdXQgb3IgYW4gb3V0LW9mLXJlc291cmNlIGNvbmRpdGlvbi4KKyAgICBTdGFydCA6PSAwOworCisgIGlmIEFzc2lnbmVkKEZJbnRlcnJ1cHRMaXN0ZW5lcikgdGhlbiBiZWdpbgorICAgIEZEX1pFUk8oRmRzKTsKKyAgICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgICBfRkRfU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKTsKKyAgICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgICAgVFZhbC50dl9zZWMgOj0gUmVjdlRpbWVvdXQgZGl2IDEwMDA7CisgICAgICBUVmFsLnR2X3VzZWMgOj0gKFJlY3ZUaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgICBQVFZhbCA6PSBAVFZhbDsKKyAgICBlbmQKKyAgICBlbHNlCisgICAgICBQVFZhbCA6PSBuaWw7CisKKyAgICBSZXQgOj0gc2VsZWN0KDIsIEBGZHMsIG5pbCwgbmlsLCBQVFZhbCk7CisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBpZiBSZXQgPCAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUlOVFIpIGFuZCAoUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcykgdGhlbiBiZWdpbgorICAgICAgICBJbmMoUmV0cmllcyk7CisgICAgICAgIGdvdG8gVHJ5QWdhaW47CisgICAgICBlbmQ7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUmVhZCgpIHNlbGVjdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kCisgICAgZWxzZSBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIENoZWNrIHRoZSBpbnRlcnJ1cHRMaXN0ZW5lcgorICAgICAgaWYgRkRfSVNTRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpIHRoZW4KKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkLkNyZWF0ZSgnSW50ZXJydXB0ZWQnKTsKKyAgICBlbmQKKyAgICBlbHNlIC8vIFJldCA9IDAKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh0aW1lZCBvdXQpJyk7CisKKyAgICAvLyBmYWxsaW5nIHRocm91Z2ggbWVhbnMgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlY3YgYW5kIGl0IGNhbm5vdCBibG9jaworICBlbmQ7CisKKyAgR290IDo9IHJlY3YoU29ja2V0LCBCdWYsIExlbiwgMCk7CisgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgIC8vIENoZWNrIGZvciBlcnJvciBvbiByZWFkCisgIGlmIEdvdCA8IDAgdGhlbiBiZWdpbgorICAgIGlmIEVycm5vQ29weSA9IFdTQUVXT1VMREJMT0NLIHRoZW4gYmVnaW4KKyAgICAgIC8vIGlmIG5vIHRpbWVvdXQgd2UgY2FuIGFzc3VtZSB0aGF0IHJlc291cmNlIGV4aGF1c3Rpb24gaGFzIG9jY3VycmVkLgorICAgICAgaWYgUmVjdlRpbWVvdXQgPSAwIHRoZW4KKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHVuYXZhaWxhYmxlIHJlc291cmNlcyknKTsKKyAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhY2sgb2YgcmVzb3VyY2VzIG9yIHRpbWVvdXQgY2FzZQorICAgICAgUmVhZEVsYXBzZWQgOj0gTWlsbGlTZWNvbmRzQmV0d2VlbihOb3csIFN0YXJ0KTsKKyAgICAgIGlmIChFQWdhaW5UaHJlc2hvbGQgPSAwKSBvciAoUmVhZEVsYXBzZWQgPCBFQWdhaW5UaHJlc2hvbGQpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcyB0aGVuIGJlZ2luCisgICAgICAgICAgSW5jKFJldHJpZXMpOworICAgICAgICAgIFNsZWVwKDEpOworICAgICAgICAgIGdvdG8gVHJ5QWdhaW47CisgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHVuYXZhaWxhYmxlIHJlc291cmNlcyknKTsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICAvLyBpbmZlciB0aGF0IHRpbWVvdXQgaGFzIGJlZW4gaGl0CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh0aW1lZCBvdXQpJyk7CisgICAgZW5kOworCisgICAgLy8gSWYgaW50ZXJydXB0ZWQsIHRyeSBhZ2FpbgorICAgIGlmIChFcnJub0NvcHkgPSBXU0FFSU5UUikgYW5kIChSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzKSB0aGVuIGJlZ2luCisgICAgICBJbmMoUmV0cmllcyk7CisgICAgICBnb3RvIFRyeUFnYWluOworICAgIGVuZDsKKworICAgIGlmIEVycm5vQ29weSA9IFdTQUVDT05OUkVTRVQgdGhlbgorICAgICAgRXhpdCgwKTsKKworICAgIC8vIFRoaXMgaXNoIGlzbid0IG9wZW4KKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFTk9UQ09OTiB0aGVuCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1dTQUVOT1RDT05OJyk7CisKKyAgICAvLyBUaW1lZCBvdXQhCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRVRJTUVET1VUIHRoZW4KKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnV1NBRVRJTUVET1VUJyk7CisKKyAgICAvLyBOb3cgaXQncyBub3QgYSB0cnkgYWdhaW4gY2FzZSwgYnV0IGEgcmVhbCBwcm9iYmxlegorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5SZWFkKCkgcmVjdigpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworCisgICAgLy8gU29tZSBvdGhlciBlcnJvciwgd2hhdGV2egorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ1Vua25vd246ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgUmVzdWx0IDo9IEdvdDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuV3JpdGUoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOwordmFyCisgIFNlbnQsIEI6IEludGVnZXI7CitiZWdpbgorICBTZW50IDo9IDA7CisgIHdoaWxlIFNlbnQgPCBMZW4gZG8gYmVnaW4KKyAgICBCIDo9IFdyaXRlUGFydGlhbCgoUEJ5dGUoQEJ1ZikgKyBTZW50KV4sIExlbiAtIFNlbnQpOworICAgIGlmIEIgPSAwIHRoZW4KKyAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSB0aW1lb3V0IHNldCB3aXRoIFNPX1NORFRJTUVPIGV4cGlyZWQuCisgICAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24uCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdzZW5kIHRpbWVvdXQgZXhwaXJlZCcpOworICAgIEluYyhTZW50LCBCKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LldyaXRlUGFydGlhbChjb25zdCBCdWY7IExlbjogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgQjogSW50ZWdlcjsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHNvY2tldCcpOworCisgIEIgOj0gc2VuZChTb2NrZXQsIEJ1ZiwgTGVuLCAwKTsKKworICBpZiBCIDwgMCB0aGVuIGJlZ2luCisgICAgLy8gRmFpbCBvbiBhIHNlbmQgZXJyb3IKKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGlmIEVycm5vQ29weSA9IFdTQUVXT1VMREJMT0NLIHRoZW4KKyAgICAgIEV4aXQoMCk7CisKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuV3JpdGVQYXJ0aWFsKCkgc2VuZCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworCisgICAgaWYgKEVycm5vQ29weSA9IFdTQUVDT05OUkVTRVQpIG9yIChFcnJub0NvcHkgPSBXU0FFTk9UQ09OTikgdGhlbiBiZWdpbgorICAgICAgQ2xvc2U7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCd3cml0ZSgpIHNlbmQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnd3JpdGUoKSBzZW5kKCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gRmFpbCBvbiBibG9ja2VkIHNlbmQKKyAgaWYgQiA9IDAgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnU29ja2V0IHNlbmQgcmV0dXJuZWQgMC4nKTsKKworICBSZXN1bHQgOj0gQjsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRDYWNoZWRBZGRyZXNzKG91dCBMZW46IEludGVnZXIpOiBQU29ja0FkZHI7CitiZWdpbgorICBjYXNlIEZDYWNoZWRQZWVyQWRkci5pcHY0LnNpbl9mYW1pbHkgb2YKKyAgICBBRl9JTkVUOiBiZWdpbgorICAgICAgTGVuIDo9IFNpemVPZihUU29ja0FkZHJJbik7CisgICAgICBSZXN1bHQgOj0gUFNvY2tBZGRyKEBGQ2FjaGVkUGVlckFkZHIuaXB2NCk7CisgICAgZW5kOworICAgIEFGX0lORVQ2OiBiZWdpbgorICAgICAgTGVuIDo9IFNpemVPZihUU29ja0FkZHJJbjYpOworICAgICAgUmVzdWx0IDo9IFBTb2NrQWRkcihARkNhY2hlZFBlZXJBZGRyLmlwdjYpOworICAgIGVuZDsKKyAgZWxzZQorICAgIExlbiA6PSAwOworICAgIFJlc3VsdCA6PSBuaWw7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBBZGRyOiBUU29ja0FkZHI7IExlbjogSW50ZWdlcik7CitiZWdpbgorICBjYXNlIEFkZHIuc2FfZmFtaWx5IG9mCisgICAgQUZfSU5FVDogaWYgTGVuID0gU2l6ZU9mKFRTb2NrQWRkckluKSB0aGVuIEZDYWNoZWRQZWVyQWRkci5pcHY0IDo9IFBTb2NrQWRkckluKEBBZGRyKV47CisgICAgQUZfSU5FVDY6IGlmIExlbiA9IFNpemVPZihUU29ja0FkZHJJbjYpIHRoZW4gRkNhY2hlZFBlZXJBZGRyLmlwdjYgOj0gUFNvY2tBZGRySW42KEBBZGRyKV47CisgIGVuZDsKKyAgRlBlZXJBZGRyZXNzIDo9ICcnOworICBGUGVlckhvc3QgOj0gJyc7CisgIEZQZWVyUG9ydCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRMaW5nZXIoTGluZ2VyT246IEJvb2xlYW47IExpbmdlclZhbDogSW50ZWdlcik7Cit2YXIKKyAgTDogVExpbmdlcjsKK2JlZ2luCisgIEZMaW5nZXJPbiA6PSBMaW5nZXJPbjsKKyAgRkxpbmdlclZhbCA6PSBMaW5nZXJWYWw7CisgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBFeGl0OworCisgIEwubF9vbm9mZiA6PSBJZlRoZW4oRkxpbmdlck9uLCAxLCAwKTsKKyAgTC5sX2xpbmdlciA6PSBMaW5nZXJWYWw7CisKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgQEwsIFNpemVPZihMKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5TZXRMaW5nZXIoKSBzZXRzb2Nrb3B0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuUGVlazogQm9vbGVhbjsKK3ZhcgorICBSZXRyaWVzOiBMb25nd29yZDsKKyAgRmRzOiBURmRTZXQ7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIFJldDogSW50ZWdlcjsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBCdWY6IEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuIHRoZW4gRXhpdChGYWxzZSk7CisKKyAgaWYgQXNzaWduZWQoRkludGVycnVwdExpc3RlbmVyKSB0aGVuIGJlZ2luCisgICAgUmV0cmllcyA6PSAwOworICAgIHdoaWxlIHRydWUgZG8gYmVnaW4KKyAgICAgIEZEX1pFUk8oRmRzKTsKKyAgICAgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICAgICAgX0ZEX1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcyk7CisgICAgICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgICAgICBUVmFsLnR2X3NlYyA6PSBSZWN2VGltZW91dCBkaXYgMTAwMDsKKyAgICAgICAgVFZhbC50dl91c2VjIDo9IChSZWN2VGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgICAgICBQVFZhbCA6PSBAVFZhbDsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBQVFZhbCA6PSBuaWw7CisKKyAgICAgIFJldCA6PSBzZWxlY3QoMiwgQEZkcywgbmlsLCBuaWwsIFBUVmFsKTsKKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBpZiBSZXQgPCAwIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgICAgaWYgKEVycm5vQ29weSA9IFdTQUVJTlRSKSBhbmQgKFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMpIHRoZW4gYmVnaW4KKyAgICAgICAgICBJbmMoUmV0cmllcyk7CisgICAgICAgICAgQ29udGludWU7CisgICAgICAgIGVuZDsKKyAgICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlBlZWsoKSBzZWxlY3QoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgICAgIC8vIENoZWNrIHRoZSBpbnRlcnJ1cHRMaXN0ZW5lcgorICAgICAgICBpZiBGRF9JU1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcykgdGhlbgorICAgICAgICAgIEV4aXQoRmFsc2UpOworICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGRhdGEgb3IgYSBkaXNjb25uZWN0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIFBFRUsKKyAgICAgICAgQnJlYWs7CisgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gdGltZW91dAorICAgICAgICBFeGl0KEZhbHNlKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyBDaGVjayB0byBzZWUgaWYgZGF0YSBpcyBhdmFpbGFibGUgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGNsb3NlZAorICBSZXQgOj0gcmVjdihTb2NrZXQsIEJ1ZiwgMSwgTVNHX1BFRUspOworICBpZiBSZXQgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgaWYgRXJybm9Db3B5ID0gV1NBRUNPTk5SRVNFVCB0aGVuIGJlZ2luCisgICAgICBDbG9zZTsKKyAgICAgIEV4aXQoRmFsc2UpOworICAgIGVuZDsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUGVlaygpIHJlY3YoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdyZWN2KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisgIFJlc3VsdCA6PSBSZXQgPiAwOworZW5kOworCitmdW5jdGlvbiBUU2VydmVyU29ja2V0LkNyZWF0ZVNvY2tldE9iaihDbGllbnQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTogVFNvY2tldDsKK2JlZ2luCisgIGlmIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gdGhlbgorICAgIFJlc3VsdCA6PSBUU29ja2V0LkNyZWF0ZShDbGllbnQsIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIpCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gVFNvY2tldC5DcmVhdGUoQ2xpZW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuTm90aWZ5KE5vdGlmeVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOwordmFyCisgIEJ5dDogQnl0ZTsKK2JlZ2luCisgIGlmIE5vdGlmeVNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgQnl0IDo9IDA7CisgICAgaWYgc2VuZChOb3RpZnlTb2NrZXQsIEJ5dCwgU2l6ZU9mKEJ5dCksIDApID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5Ob3RpZnkoKSBzZW5kKCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuU2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKEFWYWx1ZTogQm9vbGVhbik7CitiZWdpbgorICBpZiBGTGlzdGVuaW5nIHRoZW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gY2Fubm90IGJlIHNldCBhZnRlciBsaXN0ZW4oKScpOworICBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIDo9IEFWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuQ29tbW9uSW5pdDsKK2JlZ2luCisgIGluaGVyaXRlZCBDb21tb25Jbml0OworICBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIDo9IFRydWU7CisgIEZBY2NlcHRCYWNrbG9nIDo9IERFRkFVTFRfQkFDS0xPRzsKKyAgRkFjY2VwdFRpbWVvdXQgOj0gMDsKKyAgRlJldHJ5TGltaXQgOj0gMDsKKyAgRlJldHJ5RGVsYXkgOj0gMDsKKyAgRlRjcFNlbmRCdWZmZXIgOj0gMDsKKyAgRlRjcFJlY3ZCdWZmZXIgOj0gMDsKKyAgRkxpc3RlbmluZyA6PSBGYWxzZTsKKyAgRkludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IElOVkFMSURfU09DS0VUOworICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0LkNyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOworYmVnaW4KKyAgLy8gVW5uZWNlc3NhcnksIGJ1dCBoZXJlIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBU2VuZFRpbWVvdXQsIEFSZWN2VGltZW91dDogTG9uZ3dvcmQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CisgIFNlbmRUaW1lb3V0IDo9IEFTZW5kVGltZW91dDsKKyAgUmVjdlRpbWVvdXQgOj0gQVJlY3ZUaW1lb3V0OworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0LkNyZWF0ZShBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKKyAgRkFkZHJlc3MgOj0gQUFkZHJlc3M7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0Lkxpc3RlbjsKKworICBmdW5jdGlvbiBDcmVhdGVTb2NrZXRQYWlyKHZhciBSZWFkZXIsIFdyaXRlcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOiBJbnRlZ2VyOworICBsYWJlbAorICAgIEVycm9yOworICB0eXBlCisgICAgVFNBVW5pb24gPSByZWNvcmQKKyAgICBjYXNlIEludGVnZXIgb2YKKyAgICAgIDA6IChpbmFkZHI6IFRTb2NrQWRkckluKTsKKyAgICAgIDE6IChhZGRyOiBUU29ja0FkZHIpOworICAgIGVuZDsKKyAgdmFyCisgICAgYTogVFNBVW5pb247CisgICAgbGlzdGVuZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICAgIGU6IEludGVnZXI7CisgICAgYWRkcmxlbjogSW50ZWdlcjsKKyAgICBmbGFnczogRFdPUkQ7CisgICAgcmV1c2U6IEludGVnZXI7CisgIGJlZ2luCisgICAgYWRkcmxlbiA6PSBTaXplT2YoYS5pbmFkZHIpOworICAgIGZsYWdzIDo9IDA7CisgICAgcmV1c2UgOj0gMTsKKworICAgIGxpc3RlbmVyIDo9IFdpbmFwaS5XaW5zb2NrMi5zb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKyAgICBpZiBsaXN0ZW5lciA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIEV4aXQoU09DS0VUX0VSUk9SKTsKKworICAgIEZpbGxDaGFyKGEsIFNpemVPZihhKSwgMCk7CisgICAgYS5pbmFkZHIuc2luX2ZhbWlseSA6PSBBRl9JTkVUOworICAgIGEuaW5hZGRyLnNpbl9hZGRyLnNfYWRkciA6PSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworICAgIGEuaW5hZGRyLnNpbl9wb3J0IDo9IDA7CisgICAgUmVhZGVyIDo9IElOVkFMSURfU09DS0VUOworICAgIFdyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKworICAgIC8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQuICBUaGlzIGlzIGJlY2F1c2UKKyAgICAvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorICAgIC8vIHdhbnQgdG8gZm9yY2Ugc29ja2V0IHBhaXJzIHRvIGJlIGFuIGFkbWluLgorICAgIHNldHNvY2tvcHQobGlzdGVuZXIsIFNPTF9TT0NLRVQsIEludGVnZXIoU09fRVhDTFVTSVZFQUREUlVTRSksIEByZXVzZSwgU2l6ZU9mKHJldXNlKSk7CisgICAgaWYgYmluZChsaXN0ZW5lciwgYS5hZGRyLCBTaXplT2YoYS5pbmFkZHIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgZ2V0c29ja25hbWUobGlzdGVuZXIsIGEuYWRkciwgYWRkcmxlbikgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGlmIFdpbmFwaS5XaW5zb2NrMi5saXN0ZW4obGlzdGVuZXIsIDEpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBSZWFkZXIgOj0gV1NBU29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwLCBuaWwsIDAsIGZsYWdzKTsKKyAgICBpZiBSZWFkZXIgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgY29ubmVjdChSZWFkZXIsIGEuYWRkciwgU2l6ZU9mKGEuaW5hZGRyKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIFdyaXRlciA6PSBXaW5hcGkuV2luc29jazIuYWNjZXB0KGxpc3RlbmVyLCBuaWwsIG5pbCk7CisgICAgaWYgV3JpdGVyID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGNsb3Nlc29ja2V0KGxpc3RlbmVyKTsKKyAgICBFeGl0KDApOworCisgIEVycm9yOgorICAgIGUgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGNsb3Nlc29ja2V0KGxpc3RlbmVyKTsKKyAgICBjbG9zZXNvY2tldChSZWFkZXIpOworICAgIGNsb3Nlc29ja2V0KFdyaXRlcik7CisgICAgV1NBU2V0TGFzdEVycm9yKGUpOworICAgIFJlc3VsdCA6PSBTT0NLRVRfRVJST1I7CisgIGVuZDsKKwordmFyCisgIFRlbXBJbnRSZWFkZXIsCisgIFRlbXBJbnRXcml0ZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICBPbmU6IENhcmRpbmFsOworICBFcnJub0NvcHk6IEludGVnZXI7CisgIExpbmc6IFRMaW5nZXI7CisgIFJldHJpZXM6IEludGVnZXI7CisgIEFkZHJJbmZvOiBJR2V0QWRkckluZm9XcmFwcGVyOworICBTQTogVFNvY2tBZGRyU3RvcmFnZTsKKyAgTGVuOiBJbnRlZ2VyOworYmVnaW4KKyAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgcGFpciB1c2VkIHRvIGludGVycnVwdAorICBpZiBDcmVhdGVTb2NrZXRQYWlyKFRlbXBJbnRSZWFkZXIsIFRlbXBJbnRXcml0ZXIpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgQ3JlYXRlU29ja2V0UGFpcigpIEludGVycnVwdCAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgICBGSW50ZXJydXB0U29ja1JlYWRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgICBGSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBGSW50ZXJydXB0U29ja1JlYWRlciA6PSBUZW1wSW50UmVhZGVyOworICAgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IFRlbXBJbnRXcml0ZXI7CisgIGVuZDsKKworICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0IGFsbCBjbGllbnRzCisgIGlmIENyZWF0ZVNvY2tldFBhaXIoVGVtcEludFJlYWRlciwgVGVtcEludFdyaXRlcikgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBDcmVhdGVTb2NrZXRQYWlyKCkgQ2hpbGRJbnRlcnJ1cHQgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlciA6PSBUU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0Pi5DcmVhdGUoSU5WQUxJRF9TT0NLRVQsIG5pbCk7CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+LkNyZWF0ZShUZW1wSW50UmVhZGVyLCBEZXN0cm95ZXJPZkZpbmVTb2NrZXRzKTsKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IFRlbXBJbnRXcml0ZXI7CisgIGVuZDsKKworICBpZiAoUG9ydCA8IDApIG9yIChQb3J0ID4gJEZGRkYpIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUoJ1NwZWNpZmllZCBwb3J0IGlzIGludmFsaWQnKTsKKworICBBZGRySW5mbyA6PSBDcmVhdGVTb2NrZXQoRkFkZHJlc3MsIFBvcnQpOworCisgIC8vIFNldCBTT19FWENMVVNJVkVBRERSVVNFIHRvIHByZXZlbnQgMk1TTCBkZWxheSBvbiBhY2NlcHQKKyAgT25lIDo9IDE7CisgIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBJbnRlZ2VyKFNPX0VYQ0xVU0lWRUFERFJVU0UpLCBAb25lLCBTaXplT2YoT25lKSk7CisgIC8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQgb24gV2luZG93cy4gIFRoaXMgaXMgYmVjYXVzZQorICAvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorICAvLyB3YW50IHRvIGZvcmNlIHNlcnZlcnMgdG8gYmUgYW4gYWRtaW4uCisKKyAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKKyAgaWYgRlRjcFNlbmRCdWZmZXIgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCBARlRjcFNlbmRCdWZmZXIsIFNpemVPZihGVGNwU2VuZEJ1ZmZlcikpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgU09fU05EQlVGOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBpZiBGVGNwUmVjdkJ1ZmZlciA+IDAgdGhlbiBiZWdpbgorICAgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIEBGVGNwUmVjdkJ1ZmZlciwgU2l6ZU9mKEZUY3BSZWN2QnVmZmVyKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fUkNWQlVGICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBTT19SQ1ZCVUY6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIFR1cm4gbGluZ2VyIG9mZiwgZG9uJ3Qgd2FudCB0byBibG9jayBvbiBjYWxscyB0byBjbG9zZQorICBMaW5nLmxfb25vZmYgOj0gMDsKKyAgTGluZy5sX2xpbmdlciA6PSAwOworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBATGluZywgU2l6ZU9mKExpbmcpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX0xJTkdFUiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFNPX0xJTkdFUjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBUQ1AgTm9kZWxheSwgc3BlZWQgb3ZlciBiYW5kd2lkdGgKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgQE9uZSwgU2l6ZU9mKE9uZSkpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX05PREVMQVkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBTZXQgTk9OQkxPQ0sgb24gdGhlIGFjY2VwdCBzb2NrZXQKKyAgaWYgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBPbmUpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBpb2N0bHNvY2tldCgpIEZJT05CSU8gJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKSBGSU9OQklPOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIHByZXBhcmUgdGhlIHBvcnQgaW5mb3JtYXRpb24KKyAgLy8gd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIGJpbmQgbW9yZSB0aGFuIG9uY2UsIHNpbmNlIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBkb2Vzbid0CisgIC8vIGFsd2F5cyBzZWVtIHRvIHdvcmsuIFRoZSBjbGllbnQgY2FuIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdmFyaWFibGVzLgorICBSZXRyaWVzIDo9IDA7CisgIHdoaWxlIFRydWUgZG8gYmVnaW4KKyAgICBpZiBiaW5kKFNvY2tldCwgQWRkckluZm8uUmVzXi5haV9hZGRyXiwgQWRkckluZm8uUmVzXi5haV9hZGRybGVuKSA9IDAgdGhlbgorICAgICAgQnJlYWs7CisgICAgSW5jKFJldHJpZXMpOworICAgIGlmIFJldHJpZXMgPiBGUmV0cnlMaW1pdCB0aGVuCisgICAgICBCcmVhazsKKyAgICBTbGVlcChGUmV0cnlEZWxheSAqIDEwMDApOworICBlbmQ7CisKKyAgLy8gcmV0cmlldmUgYmluZCBpbmZvCisgIGlmIChQb3J0ID0gMCkgYW5kIChSZXRyaWVzIDwgRlJldHJ5TGltaXQpIHRoZW4gYmVnaW4KKyAgICBMZW4gOj0gU2l6ZU9mKFNBKTsKKyAgICBGaWxsQ2hhcihTQSwgTGVuLCAwKTsKKyAgICBpZiBnZXRzb2NrbmFtZShTb2NrZXQsIFBTb2NrQWRkcihAU0EpXiwgTGVuKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgZ2V0c29ja25hbWUoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKQorICAgIGVsc2UgYmVnaW4KKyAgICAgIGlmIFNBLnNzX2ZhbWlseSA9IEFGX0lORVQ2IHRoZW4KKyAgICAgICAgUG9ydCA6PSBudG9ocyhQU29ja0FkZHJJbjYoQFNBKV4uc2luNl9wb3J0KQorICAgICAgZWxzZQorICAgICAgICBQb3J0IDo9IG50b2hzKFBTb2NrQWRkckluKEBTQSleLnNpbl9wb3J0KTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQorICBpZiAoUmV0cmllcyA+IEZSZXRyeUxpbWl0KSB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIEJJTkQgJWQnLCBbUG9ydF0pKTsKKyAgICBDbG9zZTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3QgYmluZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChGTGlzdGVuQ2FsbGJhY2spIHRoZW4KKyAgICBGTGlzdGVuQ2FsbGJhY2soU29ja2V0KTsKKworICAvLyBDYWxsIGxpc3RlbgorICBpZiBXaW5hcGkuV2luc29jazIubGlzdGVuKFNvY2tldCwgRkFjY2VwdEJhY2tsb2cpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBsaXN0ZW4oKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3QgbGlzdGVuOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKK2VuZDsKKworZnVuY3Rpb24gVFNlcnZlclNvY2tldC5BY2NlcHQ6IFRTb2NrZXQ7Cit2YXIKKyAgRmRzOiBURmRTZXQ7CisgIE1heEVJbnRlcnMsCisgIE51bUVJbnRlcnM6IEludGVnZXI7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgQnVmOiBCeXRlOworICBDbGllbnRBZGRyZXNzOiBUU29ja0FkZHJTdG9yYWdlOworICBTaXplOiBJbnRlZ2VyOworICBDbGllbnRTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICBaZXJvOiBDYXJkaW5hbDsKKyAgQ2xpZW50OiBUU29ja2V0OworICBSZXQ6IEludGVnZXI7CitiZWdpbgorICBNYXhFSW50ZXJzIDo9IDU7CisgIE51bUVJbnRlcnMgOj0gMDsKKworICB3aGlsZSBUcnVlIGRvIGJlZ2luCisgICAgRkRfWkVSTyhGZHMpOworICAgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICAgIF9GRF9TRVQoRkludGVycnVwdFNvY2tSZWFkZXIsIEZkcyk7CisgICAgaWYgRkFjY2VwdFRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIFRWYWwudHZfc2VjIDo9IEZBY2NlcHRUaW1lb3V0IGRpdiAxMDAwOworICAgICAgVFZhbC50dl91c2VjIDo9IChGQWNjZXB0VGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgICAgUFRWYWwgOj0gQFRWYWw7CisgICAgZW5kCisgICAgZWxzZQorICAgICAgUFRWYWwgOj0gbmlsOworCisgICAgLy8gVE9ETzogaWYgV1NBRUlOVFIgaXMgcmVjZWl2ZWQsIHdlJ2xsIHJlc3RhcnQgdGhlIHRpbWVvdXQuCisgICAgLy8gVG8gYmUgYWNjdXJhdGUsIHdlIG5lZWQgdG8gZml4IHRoaXMgaW4gdGhlIGZ1dHVyZS4KKyAgICBSZXQgOj0gc2VsZWN0KDIsIEBGZHMsIG5pbCwgbmlsLCBQVFZhbCk7CisKKyAgICBpZiBSZXQgPCAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICBpZiAoV1NBR2V0TGFzdEVycm9yID0gV1NBRUlOVFIpIGFuZCAoTnVtRUludGVycyA8IE1heEVJbnRlcnMpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgIEluYyhOdW1FSW50ZXJzKTsKKyAgICAgICAgQ29udGludWU7CisgICAgICBlbmQ7CisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIHNlbGVjdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kCisgICAgZWxzZSBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIENoZWNrIGZvciBhbiBpbnRlcnJ1cHQgc2lnbmFsCisgICAgICBpZiAoRkludGVycnVwdFNvY2tSZWFkZXIgPD4gSU5WQUxJRF9TT0NLRVQpIGFuZCBGRF9JU1NFVChGSW50ZXJydXB0U29ja1JlYWRlciwgRmRzKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIHJlY3YoRkludGVycnVwdFNvY2tSZWFkZXIsIEJ1ZiwgU2l6ZU9mKEJ1ZiksIDApID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgcmVjdigpIGludGVycnVwdCAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkLkNyZWF0ZSgnaW50ZXJydXB0ZWQnKTsKKyAgICAgIGVuZDsKKworICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhY3R1YWwgc2VydmVyIHNvY2tldCBiZWluZyByZWFkeQorICAgICAgaWYgRkRfSVNTRVQoU29ja2V0LCBGZHMpIHRoZW4KKyAgICAgICAgQnJlYWs7CisgICAgZW5kCisgICAgZWxzZSBiZWdpbgorICAgICAgTG9nRGVsZWdhdGUoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgc2VsZWN0KCkgMCcpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCd1bmtub3duIGVycm9yJyk7CisgICAgZW5kOworICBlbmQ7CisKKyAgU2l6ZSA6PSBTaXplT2YoQ2xpZW50QWRkcmVzcyk7CisgIENsaWVudFNvY2tldCA6PSBXaW5hcGkuV2luc29jazIuYWNjZXB0KFNvY2tldCwgQENsaWVudEFkZHJlc3MsIEBTaXplKTsKKyAgaWYgQ2xpZW50U29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIGFjY2VwdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ2FjY2VwdCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIE1ha2Ugc3VyZSBjbGllbnQgc29ja2V0IGlzIGJsb2NraW5nCisgIFplcm8gOj0gMDsKKyAgaWYgaW9jdGxzb2NrZXQoQ2xpZW50U29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBaZXJvKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBjbG9zZXNvY2tldChDbGllbnRTb2NrZXQpOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBpb2N0bHNvY2tldCgpIEZJT05CSU8gJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICBDbGllbnQgOj0gQ3JlYXRlU29ja2V0T2JqKENsaWVudFNvY2tldCk7CisgIGlmIFNlbmRUaW1lb3V0ID4gMCB0aGVuCisgICAgQ2xpZW50LlNlbmRUaW1lb3V0IDo9IFNlbmRUaW1lb3V0OworICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbgorICAgIENsaWVudC5SZWN2VGltZW91dCA6PSBSZWN2VGltZW91dDsKKyAgaWYgS2VlcEFsaXZlIHRoZW4KKyAgICBDbGllbnQuS2VlcEFsaXZlIDo9IEtlZXBBbGl2ZTsKKyAgQ2xpZW50LlNldENhY2hlZEFkZHJlc3MoUFNvY2tBZGRyKEBDbGllbnRBZGRyZXNzKV4sIFNpemUpOworCisgIGlmIEFzc2lnbmVkKEZBY2NlcHRDYWxsYmFjaykgdGhlbgorICAgIEZBY2NlcHRDYWxsYmFjayhDbGllbnRTb2NrZXQpOworCisgIFJlc3VsdCA6PSBDbGllbnQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkludGVycnVwdDsKK2JlZ2luCisgIE5vdGlmeShGSW50ZXJydXB0U29ja1dyaXRlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkludGVycnVwdENoaWxkcmVuOworYmVnaW4KKyAgTm90aWZ5KEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIpOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5DbG9zZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDbG9zZTsKKyAgaWYgRkludGVycnVwdFNvY2tXcml0ZXIgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIGNsb3Nlc29ja2V0KEZJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKKyAgaWYgRkludGVycnVwdFNvY2tSZWFkZXIgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIGNsb3Nlc29ja2V0KEZJbnRlcnJ1cHRTb2NrUmVhZGVyKTsKKyAgaWYgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgY2xvc2Vzb2NrZXQoRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlcik7CisgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIgOj0gVFNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD4uQ3JlYXRlKElOVkFMSURfU09DS0VULCBuaWwpOworICBGTGlzdGVuaW5nIDo9IEZhbHNlOworZW5kOworCit7JEVORElGfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TdHJlYW0ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDhjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcwpAQCAtMCwwICsxLDMxOSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5TdHJlYW07CisKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBTeXNDb25zdCwKKyAgUlRMQ29uc3RzLAorICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBBY3RpdmVYLAorICB7JEVMU0V9CisgIFdpbmFwaS5BY3RpdmVYLAorICB7JEVORElGfQorICBUaHJpZnQuVXRpbHM7CisKK3R5cGUKKworICBJVGhyaWZ0U3RyZWFtID0gaW50ZXJmYWNlCisgICAgWyd7MkE3N0Q5MTYtNzQ0Ni00NkMxLTg1NDUtMEFFQzAwMDhEQkNBfSddCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgT3BlbjsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7CisgICAgcHJvY2VkdXJlIEZsdXNoOworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7CisgIGVuZDsKKworICBUVGhyaWZ0U3RyZWFtSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRocmlmdFN0cmVhbSkKKyAgcHJpdmF0ZQorICAgIHByb2NlZHVyZSBDaGVja1NpemVBbmRPZmZzZXQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgT3BlbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIENsb3NlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsICkKKyAgcHJpdmF0ZQorICAgIEZTdHJlYW0gOiBUU3RyZWFtOworICAgIEZPd25zU3RyZWFtIDogQm9vbGVhbjsKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVN0cmVhbTogVFN0cmVhbTsgQU93bnNTdHJlYW0gOiBCb29sZWFuKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00gPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwpCisgIHByaXZhdGUKKyAgICBGU3RyZWFtIDogSVN0cmVhbTsKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVN0cmVhbTogSVN0cmVhbSk7CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKworeyBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTSB9CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5DbG9zZTsKK2JlZ2luCisgIEZTdHJlYW0gOj0gbmlsOworZW5kOworCitjb25zdHJ1Y3RvciBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5DcmVhdGUoIGNvbnN0IEFTdHJlYW06IElTdHJlYW0pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSA6PSBBU3RyZWFtOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uRmx1c2g7CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGlmIEZTdHJlYW0gPD4gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEZTdHJlYW0uQ29tbWl0KCBTVEdDX0RFRkFVTFQgKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uSXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTdHJlYW0gPD4gbmlsOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uT3BlbjsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworICBpZiBjb3VudCA+PSBidWZsZW4tb2Zmc2V0CisgIHRoZW4gY291bnQgOj0gYnVmbGVuLW9mZnNldDsKKworICBSZXN1bHQgOj0gMDsKKyAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgICBwVG1wIDo9IHBCdWY7CisgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICBGU3RyZWFtLlJlYWQoIHBUbXAsIGNvdW50LCBAUmVzdWx0KTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uVG9BcnJheTogVEJ5dGVzOwordmFyCisgIHN0YXRzdGc6IFRTdGF0U3RnOworICBsZW4gOiBJbnRlZ2VyOworICBOZXdQb3MgOiB7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyOS4wfSBVSW50NjQgeyRFTFNFfSBJbnQ2NCAgeyRJRkVORH07CisgIGNiUmVhZCA6IEludGVnZXI7CitiZWdpbgorICBGaWxsQ2hhciggc3RhdHN0ZywgU2l6ZU9mKCBzdGF0c3RnKSwgMCk7CisgIGxlbiA6PSAwOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TdGF0KCBzdGF0c3RnLCBTVEFURkxBR19OT05BTUUgKSkgdGhlbiBiZWdpbgorICAgICAgbGVuIDo9IHN0YXRzdGcuY2JTaXplOworICAgIGVuZDsKKyAgZW5kOworCisgIFNldExlbmd0aCggUmVzdWx0LCBsZW4gKTsKKworICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICBpZiBTdWNjZWVkZWQoIEZTdHJlYW0uU2VlayggMCwgU1RSRUFNX1NFRUtfU0VULCBOZXdQb3MpICkgdGhlbiBiZWdpbgorICAgICAgRlN0cmVhbS5SZWFkKCBAUmVzdWx0WzBdLCBsZW4sIEBjYlJlYWQpOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uV3JpdGUoIGNvbnN0IHBCdWY6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIG5Xcml0dGVuIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgIEZTdHJlYW0uV3JpdGUoIHBUbXAsIGNvdW50LCBAbldyaXR0ZW4pOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCit7IFRUaHJpZnRTdHJlYW1JbXBsIH0KKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1JbXBsLkNoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiAob2Zmc2V0IDwgMCkgb3IgKCBvZmZzZXQgPj0gYnVmbGVuKSB0aGVuIGJlZ2luCisgICAgICByYWlzZSBFUmFuZ2VFcnJvci5DcmVhdGUoIFNCaXRzSW5kZXhFcnJvciApOworICAgIGVuZDsKKyAgICBpZiBjb3VudCA+IGJ1ZmxlbiB0aGVuIGJlZ2luCisgICAgICByYWlzZSBFUmFuZ2VFcnJvci5DcmVhdGUoIFNCaXRzSW5kZXhFcnJvciApOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmZmVyKSA+IDAKKyAgdGhlbiBSZXN1bHQgOj0gUmVhZCggQGJ1ZmZlclswXSwgTGVuZ3RoKGJ1ZmZlciksIG9mZnNldCwgY291bnQpCisgIGVsc2UgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1JbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAwOworICBDaGVja1NpemVBbmRPZmZzZXQoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZmZlcikgPiAwCisgIHRoZW4gV3JpdGUoIEBidWZmZXJbMF0sIG9mZnNldCwgY291bnQpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIENoZWNrU2l6ZUFuZE9mZnNldCggcEJ1Ziwgb2Zmc2V0K2NvdW50LCBvZmZzZXQsIGNvdW50KTsKK2VuZDsKKworeyBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaSB9CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DbG9zZTsKK2JlZ2luCisgIEZTdHJlYW0uRnJlZTsKKyAgRlN0cmVhbSA6PSBuaWw7CisgIEZPd25zU3RyZWFtIDo9IEZhbHNlOworZW5kOworCitjb25zdHJ1Y3RvciBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIGNvbnN0IEFTdHJlYW06IFRTdHJlYW07IEFPd25zU3RyZWFtOiBCb29sZWFuKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdHJlYW0gOj0gQVN0cmVhbTsKKyAgRk93bnNTdHJlYW0gOj0gQU93bnNTdHJlYW07CitlbmQ7CisKK2Rlc3RydWN0b3IgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuRGVzdHJveTsKK2JlZ2luCisgIGlmIEZPd25zU3RyZWFtIAorICB0aGVuIENsb3NlOworICAKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuRmx1c2g7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLklzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU3RyZWFtIDw+IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLk9wZW47CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLlJlYWQoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworICBpZiBjb3VudCA+PSBidWZsZW4tb2Zmc2V0CisgIHRoZW4gY291bnQgOj0gYnVmbGVuLW9mZnNldDsKKworICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgUmVzdWx0IDo9IEZTdHJlYW0uUmVhZCggcFRtcF4sIGNvdW50KQorICBlbmQKKyAgZWxzZSBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuVG9BcnJheTogVEJ5dGVzOwordmFyCisgIE9yZ1BvcyA6IEludGVnZXI7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBsZW4gOj0gMDsKKyAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbgorICBiZWdpbgorICAgIGxlbiA6PSBGU3RyZWFtLlNpemU7CisgIGVuZDsKKworICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7CisKKyAgaWYgbGVuID4gMCB0aGVuCisgIGJlZ2luCisgICAgT3JnUG9zIDo9IEZTdHJlYW0uUG9zaXRpb247CisgICAgdHJ5CisgICAgICBGU3RyZWFtLlBvc2l0aW9uIDo9IDA7CisgICAgICBGU3RyZWFtLlJlYWRCdWZmZXIoIFBvaW50ZXIoQFJlc3VsdFswXSleLCBsZW4gKTsKKyAgICBmaW5hbGx5CisgICAgICBGU3RyZWFtLlBvc2l0aW9uIDo9IE9yZ1BvczsKKyAgICBlbmQ7CisgIGVuZAorZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuV3JpdGUoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBwVG1wIDo9IHBCdWY7CisgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgIEZTdHJlYW0uV3JpdGUoIHBUbXBeLCBjb3VudCkKKyAgZW5kOworZW5kOworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTM0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcwpAQCAtMCwwICsxLDEwNDQgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKK3VuaXQgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlczsKKworeyRXQVJOIFNZTUJPTF9QTEFURk9STSBPRkZ9Cit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQorCitpbnRlcmZhY2UKKwordXNlcworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBXaW5kb3dzLCBTeXNVdGlscywgTWF0aCwgQWNjQ3RybCwgQWNsQVBJLCBTeW5jT2JqcywKKyAgeyRFTFNFfQorICBXaW5hcGkuV2luZG93cywgU3lzdGVtLlN5c1V0aWxzLCBTeXN0ZW0uTWF0aCwgV2luYXBpLkFjY0N0cmwsIFdpbmFwaS5BY2xBUEksIFN5c3RlbS5TeW5jT2JqcywKKyAgeyRFTkRJRn0KKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlV0aWxzLAorICBUaHJpZnQuU3RyZWFtOworCitjb25zdAorICBERUZBVUxUX1RIUklGVF9QSVBFX09QRU5fVElNRU9VVCA9IDEwOyAgLy8gZGVmYXVsdDogZmFpbCBmYXN0IG9uIG9wZW4KKworCit0eXBlCisgIC8vLS0tIFBpcGUgU3RyZWFtcyAtLS0KKworCisgIFRQaXBlU3RyZWFtQmFzZSA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCkKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIEZQaXBlICAgIDogVEhhbmRsZTsKKyAgICBGVGltZW91dCA6IERXT1JEOworICAgIEZPcGVuVGltZU91dCA6IERXT1JEOyAgLy8gc2VwYXJhdGUgdmFsdWUgdG8gYWxsb3cgZm9yIGZhaWwtZmFzdC1vbi1vcGVuIHNjZW5hcmlvcworICAgIEZPdmVybGFwcGVkIDogQm9vbGVhbjsKKworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQgOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgLy9wcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7IC0gc2VlIGRlcml2ZWQgY2xhc3NlcworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uICBSZWFkRGlyZWN0KCAgICAgY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gIFJlYWRPdmVybGFwcGVkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVEaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgV3JpdGVPdmVybGFwcGVkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworICBlbmQ7CisKKworICBUTmFtZWRQaXBlU3RyZWFtSW1wbCA9IGNsYXNzIHNlYWxlZCggVFBpcGVTdHJlYW1CYXNlKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZQaXBlTmFtZSAgOiBzdHJpbmc7CisgICAgRlNoYXJlTW9kZSA6IERXT1JEOworICAgIEZTZWN1cml0eUF0dHJpYnMgOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOworCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUGlwZU5hbWUgOiBzdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2hhcmVNb2RlOiBEV09SRCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzID0gbmlsOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3BlblRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUKTsgIG92ZXJsb2FkOworICBlbmQ7CisKKworICBUSGFuZGxlUGlwZVN0cmVhbUltcGwgPSBjbGFzcyBzZWFsZWQoIFRQaXBlU3RyZWFtQmFzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGU3JjSGFuZGxlIDogVEhhbmRsZTsKKworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVBpcGVIYW5kbGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU93bnNIYW5kbGUsIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsgIG92ZXJsb2FkOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworICBlbmQ7CisKKworICAvLy0tLSBQaXBlIFRyYW5zcG9ydHMgLS0tCisKKworICBJUGlwZVRyYW5zcG9ydCA9IGludGVyZmFjZSggSVN0cmVhbVRyYW5zcG9ydCkKKyAgICBbJ3s1RTA1Q0M4NS00MzRGLTQyOEYtQkZCMi04NTZBMTY4QjU1NTh9J10KKyAgZW5kOworCisKKyAgVFBpcGVUcmFuc3BvcnRCYXNlID0gY2xhc3MoIFRTdHJlYW1UcmFuc3BvcnRJbXBsLCBJUGlwZVRyYW5zcG9ydCkKKyAgcHVibGljCisgICAgLy8gSVRyYW5zcG9ydAorICAgIGZ1bmN0aW9uICBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICBlbmQ7CisKKworICBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbCA9IGNsYXNzKCBUUGlwZVRyYW5zcG9ydEJhc2UpCisgIHB1YmxpYworICAgIC8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3JzCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhUGlwZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXMgPSBuaWw7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CisgIGVuZDsKKworCisgIFROYW1lZFBpcGVUcmFuc3BvcnRTZXJ2ZXJFbmRJbXBsID0gY2xhc3MoIFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZIYW5kbGUgOiBUSGFuZGxlOworICBwdWJsaWMKKyAgICAvLyBJVHJhbnNwb3J0CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFQaXBlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOyByZWludHJvZHVjZTsKKyAgZW5kOworCisKKyAgVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRQaXBlVHJhbnNwb3J0QmFzZSkKKyAgcHVibGljCisgICAgLy8gQW5vbnltb3VzIHBpcGUgY29uc3RydWN0b3IKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgYVBpcGVSZWFkLCBhUGlwZVdyaXRlIDogVEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgYU93bnNIYW5kbGVzIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOyBvdmVybG9hZDsKKyAgZW5kOworCisKKyAgLy8tLS0gU2VydmVyIFRyYW5zcG9ydHMgLS0tCisKKworICBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydCA9IGludGVyZmFjZSggSVNlcnZlclRyYW5zcG9ydCkKKyAgICBbJ3s3QUVFNjc5My00N0I5LTRFNDktOTgxQS1DMzlFOTEwOEU5QUR9J10KKyAgICAvLyBTZXJ2ZXIgc2lkZSBhbm9ueW1vdXMgcGlwZSBlbmRzCisgICAgZnVuY3Rpb24gUmVhZEhhbmRsZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gV3JpdGVIYW5kbGUgOiBUSGFuZGxlOworICAgIC8vIENsaWVudCBzaWRlIGFub255bW91cyBwaXBlIGVuZHMKKyAgICBmdW5jdGlvbiBDbGllbnRBbm9uUmVhZCA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gQ2xpZW50QW5vbldyaXRlICA6IFRIYW5kbGU7CisgIGVuZDsKKworCisgIElOYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElTZXJ2ZXJUcmFuc3BvcnQpCisgICAgWyd7OURGOUVFNDgtRDA2NS00MEFGLThGNjctRDMzMDM3RDNEOTYwfSddCisgICAgZnVuY3Rpb24gSGFuZGxlIDogVEhhbmRsZTsKKyAgZW5kOworCisKKyAgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlID0gY2xhc3MoIFRTZXJ2ZXJUcmFuc3BvcnRJbXBsKQorICBzdHJpY3QgcHJvdGVjdGVkCisgICAgRlN0b3BTZXJ2ZXIgOiBURXZlbnQ7CisgICAgcHJvY2VkdXJlIEludGVybmFsQ2xvc2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFF1ZXJ5U3RvcFNlcnZlciA6IEJvb2xlYW47CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICBlbmQ7CisKKworICBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLCBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydCkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGQnVmU2l6ZSAgICAgIDogRFdPUkQ7CisKKyAgICAvLyBTZXJ2ZXIgc2lkZSBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzCisgICAgRlJlYWRIYW5kbGUsCisgICAgRldyaXRlSGFuZGxlIDogVEhhbmRsZTsKKworICAgIC8vQ2xpZW50IHNpZGUgYW5vbnltb3VzIHBpcGUgaGFuZGxlcworICAgIEZDbGllbnRBbm9uUmVhZCwKKyAgICBGQ2xpZW50QW5vbldyaXRlICA6IFRIYW5kbGU7CisKKyAgICBGVGltZU91dDogRFdPUkQ7CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEFjY2VwdChjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uIENyZWF0ZUFub25QaXBlIDogQm9vbGVhbjsKKworICAgIC8vIElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0CisgICAgZnVuY3Rpb24gUmVhZEhhbmRsZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gV3JpdGVIYW5kbGUgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIENsaWVudEFub25SZWFkIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBDbGllbnRBbm9uV3JpdGUgIDogVEhhbmRsZTsKKworICAgIHByb2NlZHVyZSBJbnRlcm5hbENsb3NlOyBvdmVycmlkZTsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoYUJ1ZnNpemUgOiBDYXJkaW5hbCA9IDQwOTY7IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsKKyAgZW5kOworCisKKyAgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLCBJTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZQaXBlTmFtZSAgICAgOiBzdHJpbmc7CisgICAgRk1heENvbm5zICAgICA6IERXT1JEOworICAgIEZCdWZTaXplICAgICAgOiBEV09SRDsKKyAgICBGVGltZW91dCAgICAgIDogRFdPUkQ7CisgICAgRkhhbmRsZSAgICAgICA6IFRIYW5kbGU7CisgICAgRkNvbm5lY3RlZCAgICA6IEJvb2xlYW47CisKKworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIENyZWF0ZU5hbWVkUGlwZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gQ3JlYXRlVHJhbnNwb3J0SW5zdGFuY2UgOiBJVHJhbnNwb3J0OworCisgICAgLy8gSU5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydAorICAgIGZ1bmN0aW9uIEhhbmRsZSA6IFRIYW5kbGU7CisgICAgcHJvY2VkdXJlIEludGVybmFsQ2xvc2U7IG92ZXJyaWRlOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYVBpcGVuYW1lIDogc3RyaW5nOyBhQnVmc2l6ZSA6IENhcmRpbmFsID0gNDA5NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFNYXhDb25ucyA6IENhcmRpbmFsID0gUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTOworICAgICAgICAgICAgICAgICAgICAgICAgYVRpbWVPdXQgOiBDYXJkaW5hbCA9IElORklOSVRFKTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKKworcHJvY2VkdXJlIENsb3NlUGlwZUhhbmRsZSggdmFyIGhQaXBlIDogVEhhbmRsZSk7CitiZWdpbgorICBpZiBoUGlwZSA8PiBJTlZBTElEX0hBTkRMRV9WQUxVRQorICB0aGVuIHRyeQorICAgIENsb3NlSGFuZGxlKCBoUGlwZSk7CisgIGZpbmFsbHkKKyAgICBoUGlwZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIER1cGxpY2F0ZVBpcGVIYW5kbGUoIGNvbnN0IGhTb3VyY2UgOiBUSGFuZGxlKSA6IFRIYW5kbGU7CitiZWdpbgorICBpZiBub3QgRHVwbGljYXRlSGFuZGxlKCBHZXRDdXJyZW50UHJvY2VzcywgaFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MsIEByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEZBTFNFLCBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdEdXBsaWNhdGVIYW5kbGU6ICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworZW5kOworCisKKworeyBUUGlwZVN0cmVhbUJhc2UgfQorCisKK2NvbnN0cnVjdG9yIFRQaXBlU3RyZWFtQmFzZS5DcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0LCBhT3BlblRpbWVPdXQgOiBEV09SRCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBBU1NFUlQoIGFUaW1lb3V0ID4gMCk7ICAvLyBhT3BlblRpbWVvdXQgbWF5IGJlIDAKKyAgRlBpcGUgICAgICAgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGVGltZW91dCAgICAgOj0gYVRpbWVPdXQ7CisgIEZPcGVuVGltZU91dCA6PSBhT3BlblRpbWVPdXQ7CisgIEZPdmVybGFwcGVkICA6PSBhRW5hYmxlT3ZlcmxhcHBlZDsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRQaXBlU3RyZWFtQmFzZS5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgQ2xvc2U7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuQ2xvc2U7CitiZWdpbgorICBDbG9zZVBpcGVIYW5kbGUoIEZQaXBlKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLkZsdXNoOworYmVnaW4KKyAgRmx1c2hGaWxlQnVmZmVycyggRlBpcGUpOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5Jc09wZW46IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZQaXBlIDw+IElOVkFMSURfSEFORExFX1ZBTFVFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudCA6IEludGVnZXIpOworYmVnaW4KKyAgaWYgRk92ZXJsYXBwZWQKKyAgdGhlbiBXcml0ZU92ZXJsYXBwZWQoIHBCdWYsIG9mZnNldCwgY291bnQpCisgIGVsc2UgV3JpdGVEaXJlY3QoIHBCdWYsIG9mZnNldCwgY291bnQpOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBGT3ZlcmxhcHBlZAorICB0aGVuIHJlc3VsdCA6PSBSZWFkT3ZlcmxhcHBlZCggcEJ1ZiwgYnVmbGVuLCBvZmZzZXQsIGNvdW50KQorICBlbHNlIHJlc3VsdCA6PSBSZWFkRGlyZWN0KCBwQnVmLCBidWZsZW4sIG9mZnNldCwgY291bnQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuV3JpdGVEaXJlY3QoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBjYldyaXR0ZW4sIG5CeXRlcyA6IERXT1JEOworICAgIHBEYXRhIDogUEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworCisgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICBuQnl0ZXMgOj0gTWluKCAxNSo0MDk2LCBjb3VudCk7IC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgcERhdGEgIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5CeXRlcyA+IDAgZG8gYmVnaW4KKyAgICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgcERhdGFeLCBuQnl0ZXMsIGNiV3JpdHRlbiwgbmlsKQorICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdXcml0ZSB0byBwaXBlIGZhaWxlZCcpOworCisgICAgSW5jKCBwRGF0YSwgY2JXcml0dGVuKTsKKyAgICBEZWMoIGNvdW50LCBjYldyaXR0ZW4pOworICAgIG5CeXRlcyA6PSBNaW4oIG5CeXRlcywgY291bnQpOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZU92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBjYldyaXR0ZW4sIGR3V2FpdCwgZHdFcnJvciwgbkJ5dGVzIDogRFdPUkQ7CisgICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOworICAgIHBEYXRhIDogUEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworCisgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICBuQnl0ZXMgOj0gTWluKCAxNSo0MDk2LCBjb3VudCk7IC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgcERhdGEgIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5CeXRlcyA+IDAgZG8gYmVnaW4KKyAgICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisgICAgaWYgbm90IFdyaXRlRmlsZSggRlBpcGUsIHBEYXRhXiwgbkJ5dGVzLCBjYldyaXR0ZW4sIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikKKyAgICB0aGVuIGJlZ2luCisgICAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICAgIGNhc2UgZHdFcnJvciBvZgorICAgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKworICAgICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpIHRoZW4gYmVnaW4KKyAgICAgICAgICAgIENhbmNlbElvKCBGUGlwZSk7ICAvLyBwcmV2ZW50cyBwb3NzaWJsZSBBViBvbiBpbnZhbGlkIG92ZXJsYXBwZWQgcHRyCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHdyaXRlIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKKworICAgICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICBvciBub3QgR2V0T3ZlcmxhcHBlZFJlc3VsdCggRlBpcGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgY2JXcml0dGVuLCBUUlVFKQorICAgICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHdyaXRlIGVycm9yJyk7CisgICAgICAgIGVuZDsKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKGR3RXJyb3IpKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICBBU1NFUlQoIERXT1JEKG5CeXRlcykgPSBjYldyaXR0ZW4pOworCisgICAgSW5jKCBwRGF0YSwgY2JXcml0dGVuKTsKKyAgICBEZWMoIGNvdW50LCBjYldyaXR0ZW4pOworICAgIG5CeXRlcyA6PSBNaW4oIG5CeXRlcywgY291bnQpOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWREaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgY2JSZWFkLCBkd0VyciwgblJlbWFpbmluZyAgOiBEV09SRDsKKyAgICBieXRlcywgcmV0cmllcyAgOiBMb25nSW50OworICAgIGJPayAgICAgOiBCb29sZWFuOworICAgIHBEYXRhICAgOiBQQnl0ZTsKK2NvbnN0IElOVEVSVkFMID0gMTA7ICAvLyBtcworYmVnaW4KKyAgaWYgbm90IElzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gcGlwZScpOworCisgIC8vIE1TRE46IEhhbmRsZSBjYW4gYmUgYSBoYW5kbGUgdG8gYSBuYW1lZCBwaXBlIGluc3RhbmNlLAorICAvLyBvciBpdCBjYW4gYmUgYSBoYW5kbGUgdG8gdGhlIHJlYWQgZW5kIG9mIGFuIGFub255bW91cyBwaXBlLAorICAvLyBUaGUgaGFuZGxlIG11c3QgaGF2ZSBHRU5FUklDX1JFQUQgYWNjZXNzIHRvIHRoZSBwaXBlLgorICBpZiBGVGltZU91dCA8PiBJTkZJTklURSB0aGVuIGJlZ2luCisgICAgcmV0cmllcyA6PSBNYXgoIDEsIFJvdW5kKCAxLjAgKiBGVGltZU91dCAvIElOVEVSVkFMKSk7CisgICAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgICAgaWYgbm90IFBlZWtOYW1lZFBpcGUoIEZQaXBlLCBuaWwsIDAsIG5pbCwgQGJ5dGVzLCBuaWwpIHRoZW4gYmVnaW4KKyAgICAgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgICAgICBpZiAoZHdFcnIgPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkKKyAgICAgICAgb3IgKGR3RXJyID0gRVJST1JfQlJPS0VOX1BJUEUpCisgICAgICAgIG9yIChkd0VyciA9IEVSUk9SX1BJUEVfTk9UX0NPTk5FQ1RFRCkKKyAgICAgICAgdGhlbiBiZWdpbgorICAgICAgICAgIHJlc3VsdCA6PSAwOyAgLy8gb3RoZXIgc2lkZSBjbG9zZWQgdGhlIHBpcGUKKyAgICAgICAgICBFeGl0OworICAgICAgICBlbmQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgYnl0ZXMgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgQnJlYWs7ICAvLyB0aGVyZSBhcmUgZGF0YQorICAgICAgZW5kOworCisgICAgICBEZWMoIHJldHJpZXMpOworICAgICAgaWYgcmV0cmllcyA+IDAKKyAgICAgIHRoZW4gU2xlZXAoIElOVEVSVkFMKQorICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHJlYWQgdGltZWQgb3V0Jyk7CisgICAgZW5kOworICBlbmQ7CisKKyAgcmVzdWx0IDo9IDA7CisgIG5SZW1haW5pbmcgOj0gY291bnQ7CisgIHBEYXRhIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5SZW1haW5pbmcgPiAwIGRvIGJlZ2luCisgICAgLy8gcmVhZCB0aGUgZGF0YSAob3IgYmxvY2sgSU5GSU5JVEUtbHkpCisgICAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgcERhdGFeLCBuUmVtYWluaW5nLCBjYlJlYWQsIG5pbCk7CisgICAgaWYgKG5vdCBiT2spIGFuZCAoR2V0TGFzdEVycm9yKCkgPD4gRVJST1JfTU9SRV9EQVRBKQorICAgIHRoZW4gQnJlYWs7IC8vIE5vIG1vcmUgZGF0YSwgcG9zc2libHkgYmVjYXVzZSBjbGllbnQgZGlzY29ubmVjdGVkLgorCisgICAgRGVjKCBuUmVtYWluaW5nLCBjYlJlYWQpOworICAgIEluYyggcERhdGEsIGNiUmVhZCk7CisgICAgSW5jKCByZXN1bHQsIGNiUmVhZCk7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZE92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBjYlJlYWQsIGR3V2FpdCwgZHdFcnJvciwgblJlbWFpbmluZyA6IERXT1JEOworICAgIGJPayAgICAgOiBCb29sZWFuOworICAgIG92ZXJsYXBwZWQgOiBJT3ZlcmxhcHBlZEhlbHBlcjsKKyAgICBwRGF0YSAgIDogUEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlJyk7CisKKyAgcmVzdWx0IDo9IDA7CisgIG5SZW1haW5pbmcgOj0gY291bnQ7CisgIHBEYXRhIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5SZW1haW5pbmcgPiAwIGRvIGJlZ2luCisgICAgb3ZlcmxhcHBlZCA6PSBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOworCisgICAgIC8vIHJlYWQgdGhlIGRhdGEKKyAgICBiT2sgOj0gUmVhZEZpbGUoIEZQaXBlLCBwRGF0YV4sIG5SZW1haW5pbmcsIGNiUmVhZCwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkUHRyKTsKKyAgICBpZiBub3QgYk9rIHRoZW4gYmVnaW4KKyAgICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOworICAgICAgY2FzZSBkd0Vycm9yIG9mCisgICAgICAgIEVSUk9SX0lPX1BFTkRJTkcgOiBiZWdpbgorICAgICAgICAgIGR3V2FpdCA6PSBvdmVybGFwcGVkLldhaXRGb3IoRlRpbWVvdXQpOworCisgICAgICAgICAgaWYgKGR3V2FpdCA9IFdBSVRfVElNRU9VVCkgdGhlbiBiZWdpbgorICAgICAgICAgICAgQ2FuY2VsSW8oIEZQaXBlKTsgIC8vIHByZXZlbnRzIHBvc3NpYmxlIEFWIG9uIGludmFsaWQgb3ZlcmxhcHBlZCBwdHIKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKKyAgICAgICAgICBlbmQ7CisKKyAgICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCisgICAgICAgICAgb3Igbm90IEdldE92ZXJsYXBwZWRSZXN1bHQoIEZQaXBlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGNiUmVhZCwgVFJVRSkKKyAgICAgICAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnUGlwZSByZWFkIGVycm9yJyk7CisgICAgICAgIGVuZDsKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKGR3RXJyb3IpKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICBBU1NFUlQoIGNiUmVhZCA+IDApOyAgLy8gc2VlIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoKQorICAgIEFTU0VSVCggY2JSZWFkIDw9IERXT1JEKG5SZW1haW5pbmcpKTsKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5Ub0FycmF5OiBUQnl0ZXM7Cit2YXIgYnl0ZXMgOiBMb25nSW50OworYmVnaW4KKyAgU2V0TGVuZ3RoKCByZXN1bHQsIDApOworICBieXRlcyA6PSAwOworCisgIGlmICBJc09wZW4KKyAgYW5kIFBlZWtOYW1lZFBpcGUoIEZQaXBlLCBuaWwsIDAsIG5pbCwgQGJ5dGVzLCBuaWwpCisgIGFuZCAoYnl0ZXMgPiAwKQorICB0aGVuIGJlZ2luCisgICAgU2V0TGVuZ3RoKCByZXN1bHQsIGJ5dGVzKTsKKyAgICBSZWFkKCByZXN1bHQsIDAsIGJ5dGVzKTsKKyAgZW5kOworZW5kOworCisKK3sgVE5hbWVkUGlwZVN0cmVhbUltcGwgfQorCisKK2NvbnN0cnVjdG9yIFROYW1lZFBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVOYW1lIDogc3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCwgYU9wZW5UaW1lT3V0IDogRFdPUkQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQsIGFUaW1lb3V0LCBhT3BlblRpbWVPdXQpOworCisgIEZQaXBlTmFtZSAgICAgICAgOj0gYVBpcGVOYW1lOworICBGU2hhcmVNb2RlICAgICAgIDo9IGFTaGFyZU1vZGU7CisgIEZTZWN1cml0eUF0dHJpYnMgOj0gYVNlY3VyaXR5QXR0cmlidXRlczsKKworICBpZiBDb3B5KEZQaXBlTmFtZSwxLDIpIDw+ICdcXCcKKyAgdGhlbiBGUGlwZU5hbWUgOj0gJ1xcLlxwaXBlXCcgKyBGUGlwZU5hbWU7ICAvLyBhc3N1bWUgbG9jYWxob3N0CitlbmQ7CisKKworcHJvY2VkdXJlIFROYW1lZFBpcGVTdHJlYW1JbXBsLk9wZW47Cit2YXIgaFBpcGUgICAgOiBUSGFuZGxlOworICAgIHJldHJpZXMsIHRpbWVvdXQsIGR3RXJyIDogRFdPUkQ7Citjb25zdCBJTlRFUlZBTCA9IDEwOyAvLyBtcworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKKworICByZXRyaWVzIDo9IE1heCggMSwgUm91bmQoIDEuMCAqIEZPcGVuVGltZU91dCAvIElOVEVSVkFMKSk7CisgIHRpbWVvdXQgOj0gRk9wZW5UaW1lT3V0OworCisgIC8vIGlmIHRoZSBzZXJ2ZXIgaGFzbid0IGdvdHRlbiB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHBpcGUgaGFzIGJlZW4gY3JlYXRlZCwgYXQgbGVhc3Qgd2FpdCB0aGUgdGltZW91dAorICAvLyBBY2NvcmRpbmcgdG8gTVNETiwgaWYgbm8gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWZpZWQgbmFtZWQgcGlwZSBleGlzdCwgdGhlIFdhaXROYW1lZFBpcGUgZnVuY3Rpb24KKyAgLy8gcmV0dXJucyBJTU1FRElBVEVMWSwgcmVnYXJkbGVzcyBvZiB0aGUgdGltZS1vdXQgdmFsdWUuCisgIC8vIEFsd2F5cyB1c2UgSU5URVJWQUwsIHNpbmNlIFdhaXROYW1lZFBpcGUoMCkgZGVmYXVsdHMgdG8gc29tZSBvdGhlciB2YWx1ZQorICB3aGlsZSBub3QgV2FpdE5hbWVkUGlwZSggUENoYXIoRlBpcGVOYW1lKSwgSU5URVJWQUwpIGRvIGJlZ2luCisgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgIGlmIGR3RXJyIDw+IEVSUk9SX0ZJTEVfTk9UX0ZPVU5ECisgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKGR3RXJyKSk7CisKKyAgICBpZiB0aW1lb3V0IDw+IElORklOSVRFIHRoZW4gYmVnaW4KKyAgICAgIGlmIChyZXRyaWVzID4gMCkKKyAgICAgIHRoZW4gRGVjKHJldHJpZXMpCisgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgdGltZWQgb3V0Jyk7CisgICAgZW5kOworCisgICAgU2xlZXAoSU5URVJWQUwpCisgIGVuZDsKKworICAvLyBvcGVuIHRoYXQgdGhpbmd5CisgIGhQaXBlIDo9IENyZWF0ZUZpbGUoIFBDaGFyKCBGUGlwZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUQgb3IgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlNoYXJlTW9kZSwgICAgICAgIC8vIHNoYXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgRlNlY3VyaXR5QXR0cmlicywgIC8vIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgICAgIC8vIG9wZW5zIGV4aXN0aW5nIHBpcGUKKyAgICAgICAgICAgICAgICAgICAgICAgRklMRV9GTEFHX09WRVJMQVBQRUQgb3IgRklMRV9GTEFHX1dSSVRFX1RIUk9VR0gsIC8vIGFzeW5jK2Zhc3QsIHBsZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgLy8gbm8gdGVtcGxhdGUgZmlsZQorCisgIGlmIGhQaXBlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworCisgIC8vIGV2ZXJ5dGhpbmcgZmluZQorICBGUGlwZSA6PSBoUGlwZTsKK2VuZDsKKworCit7IFRIYW5kbGVQaXBlU3RyZWFtSW1wbCB9CisKKworY29uc3RydWN0b3IgVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVIYW5kbGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU93bnNIYW5kbGUsIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQsIGFUaW1lT3V0KTsKKworICBpZiBhT3duc0hhbmRsZQorICB0aGVuIEZTcmNIYW5kbGUgOj0gYVBpcGVIYW5kbGUKKyAgZWxzZSBGU3JjSGFuZGxlIDo9IER1cGxpY2F0ZVBpcGVIYW5kbGUoIGFQaXBlSGFuZGxlKTsKKworICBPcGVuOworZW5kOworCisKK2Rlc3RydWN0b3IgVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBDbG9zZVBpcGVIYW5kbGUoIEZTcmNIYW5kbGUpOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVEhhbmRsZVBpcGVTdHJlYW1JbXBsLk9wZW47CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gRlBpcGUgOj0gRHVwbGljYXRlUGlwZUhhbmRsZSggRlNyY0hhbmRsZSk7CitlbmQ7CisKKworeyBUUGlwZVRyYW5zcG9ydEJhc2UgfQorCisKK2Z1bmN0aW9uIFRQaXBlVHJhbnNwb3J0QmFzZS5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZJbnB1dFN0cmVhbSA8PiBuaWwpICBhbmQgKEZJbnB1dFN0cmVhbS5Jc09wZW4pCisgICAgICAgIGFuZCAoRk91dHB1dFN0cmVhbSA8PiBuaWwpIGFuZCAoRk91dHB1dFN0cmVhbS5Jc09wZW4pOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVRyYW5zcG9ydEJhc2UuT3BlbjsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbS5PcGVuOworICBGT3V0cHV0U3RyZWFtLk9wZW47CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlVHJhbnNwb3J0QmFzZS5DbG9zZTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbS5DbG9zZTsKKyAgRk91dHB1dFN0cmVhbS5DbG9zZTsKK2VuZDsKKworCit7IFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsgY29uc3QgYVNoYXJlTW9kZTogRFdPUkQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0LCBhT3BlblRpbWVPdXQgOiBEV09SRCk7CisvLyBOYW1lZCBwaXBlIGNvbnN0cnVjdG9yCitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIG5pbCk7CisgIEZJbnB1dFN0cmVhbSAgOj0gVE5hbWVkUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZU5hbWUsIFRSVUUsIGFTaGFyZU1vZGUsIGFTZWN1cml0eUF0dHJpYnV0ZXMsIGFUaW1lT3V0LCBhT3BlblRpbWVPdXQpOworICBGT3V0cHV0U3RyZWFtIDo9IEZJbnB1dFN0cmVhbTsgIC8vIHRydWUgZm9yIG5hbWVkIHBpcGVzCitlbmQ7CisKKworY29uc3RydWN0b3IgVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBhUGlwZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCk7CisvLyBOYW1lZCBwaXBlIGNvbnN0cnVjdG9yCitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIG5pbCk7CisgIEZJbnB1dFN0cmVhbSAgOj0gVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGUsIFRSVUUsIGFPd25zSGFuZGxlLCBhVGltZU91dCk7CisgIEZPdXRwdXRTdHJlYW0gOj0gRklucHV0U3RyZWFtOyAgLy8gdHJ1ZSBmb3IgbmFtZWQgcGlwZXMKK2VuZDsKKworCit7IFROYW1lZFBpcGVUcmFuc3BvcnRTZXJ2ZXJFbmRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlVHJhbnNwb3J0U2VydmVyRW5kSW1wbC5DcmVhdGUoIGFQaXBlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKy8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKK2JlZ2luCisgIEZIYW5kbGUgOj0gRHVwbGljYXRlUGlwZUhhbmRsZSggYVBpcGUpOworICBpbmhlcml0ZWQgQ3JlYXRlKCBhUGlwZSwgYU93bnNIYW5kbGUsIGFUaW1lT3V0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVE5hbWVkUGlwZVRyYW5zcG9ydFNlcnZlckVuZEltcGwuQ2xvc2U7CitiZWdpbgorICBGbHVzaEZpbGVCdWZmZXJzKCBGSGFuZGxlKTsKKyAgRGlzY29ubmVjdE5hbWVkUGlwZSggRkhhbmRsZSk7ICAvLyBmb3JjZSBjbGllbnQgb2ZmIHRoZSBwaXBlCisgIENsb3NlUGlwZUhhbmRsZSggRkhhbmRsZSk7CisKKyAgaW5oZXJpdGVkIENsb3NlOworZW5kOworCisKK3sgVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZVJlYWQsIGFQaXBlV3JpdGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU93bnNIYW5kbGVzIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsKKy8vIEFub255bW91cyBwaXBlIGNvbnN0cnVjdG9yCitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIG5pbCk7CisgIC8vIG92ZXJsYXBwZWQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIEFub25QaXBlcywgc2VlIE1TRE4KKyAgRklucHV0U3RyZWFtICA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVJlYWQsIGFPd25zSGFuZGxlcywgRkFMU0UsIGFUaW1lT3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVdyaXRlLCBhT3duc0hhbmRsZXMsIEZBTFNFLCBhVGltZU91dCk7CitlbmQ7CisKKworeyBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UgfQorCisKK2NvbnN0cnVjdG9yIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZS5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RvcFNlcnZlciA6PSBURXZlbnQuQ3JlYXRlKG5pbCxUUlVFLEZBTFNFLCcnKTsgIC8vIG1hbnVhbCByZXNldAorZW5kOworCisKK2Rlc3RydWN0b3IgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGcmVlQW5kTmlsKCBGU3RvcFNlcnZlcik7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZS5RdWVyeVN0b3BTZXJ2ZXIgOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IChGU3RvcFNlcnZlciA9IG5pbCkKKyAgICAgICAgIG9yIChGU3RvcFNlcnZlci5XYWl0Rm9yKDApIDw+IHdyVGltZW91dCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZS5MaXN0ZW47CitiZWdpbgorICBGU3RvcFNlcnZlci5SZXNldEV2ZW50OworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UuQ2xvc2U7CitiZWdpbgorICBGU3RvcFNlcnZlci5TZXRFdmVudDsKKyAgSW50ZXJuYWxDbG9zZTsKK2VuZDsKKworCit7IFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbCB9CisKKworY29uc3RydWN0b3IgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZShhQnVmc2l6ZSA6IENhcmRpbmFsOyBhVGltZU91dCA6IERXT1JEKTsKKy8vIEFub255bW91cyBwaXBlIENUT1IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZCdWZzaXplICA6PSBhQnVmU2l6ZTsKKyAgRlJlYWRIYW5kbGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZXcml0ZUhhbmRsZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgRkNsaWVudEFub25SZWFkIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGQ2xpZW50QW5vbldyaXRlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGVGltZU91dCA6PSBhVGltZU91dDsKKworICAvLyBUaGUgYW5vbnltb3VzIHBpcGUgbmVlZHMgdG8gYmUgY3JlYXRlZCBmaXJzdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuCisgIC8vIHBhc3MgdGhlIGhhbmRsZXMgb24gdG8gdGhlIGNsaWVudCBiZWZvcmUgdGhlIHNlcnZlIChhY2NlcHRJbXBsKQorICAvLyBibG9ja2luZyBjYWxsLgorICBpZiBub3QgQ3JlYXRlQW5vblBpcGUKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoQ2xhc3NOYW1lKycuQ3JlYXRlKCkgZmFpbGVkJyk7CitlbmQ7CisKKworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkFjY2VwdChjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OwordmFyIGJ1ZiAgICA6IEJ5dGU7CisgICAgYnIgICAgIDogRFdPUkQ7CitiZWdpbgorICBpZiBBc3NpZ25lZChmbkFjY2VwdGluZykKKyAgdGhlbiBmbkFjY2VwdGluZygpOworCisgIC8vIFRoaXMgMC1ieXRlIHJlYWQgc2VydmVzIG1lcmVseSBhcyBhIGJsb2NraW5nIGNhbGwuCisgIGlmIG5vdCBSZWFkRmlsZSggRlJlYWRIYW5kbGUsIGJ1ZiwgMCwgYnIsIG5pbCkKKyAgYW5kIChHZXRMYXN0RXJyb3IoKSA8PiBFUlJPUl9NT1JFX0RBVEEpCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSB1bmFibGUgdG8gaW5pdGlhdGUgcGlwZSBjb21tdW5pY2F0aW9uJyk7CisKKyAgLy8gY3JlYXRlIHRoZSB0cmFuc3BvcnQgaW1wbAorICByZXN1bHQgOj0gVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsLkNyZWF0ZSggRlJlYWRIYW5kbGUsIEZXcml0ZUhhbmRsZSwgRkFMU0UsIEZUaW1lT3V0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkludGVybmFsQ2xvc2U7CitiZWdpbgorICBDbG9zZVBpcGVIYW5kbGUoIEZSZWFkSGFuZGxlKTsKKyAgQ2xvc2VQaXBlSGFuZGxlKCBGV3JpdGVIYW5kbGUpOworICBDbG9zZVBpcGVIYW5kbGUoIEZDbGllbnRBbm9uUmVhZCk7CisgIENsb3NlUGlwZUhhbmRsZSggRkNsaWVudEFub25Xcml0ZSk7CitlbmQ7CisKKworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLlJlYWRIYW5kbGUgOiBUSGFuZGxlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZSZWFkSGFuZGxlOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5Xcml0ZUhhbmRsZSA6IFRIYW5kbGU7CitiZWdpbgorICByZXN1bHQgOj0gRldyaXRlSGFuZGxlOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DbGllbnRBbm9uUmVhZCA6IFRIYW5kbGU7CitiZWdpbgorICByZXN1bHQgOj0gRkNsaWVudEFub25SZWFkOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DbGllbnRBbm9uV3JpdGUgIDogVEhhbmRsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQ2xpZW50QW5vbldyaXRlOworZW5kOworCisKK2Z1bmN0aW9uIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGVBbm9uUGlwZSA6IEJvb2xlYW47Cit2YXIgc2QgICAgICAgICAgIDogUFNFQ1VSSVRZX0RFU0NSSVBUT1I7CisgICAgc2EgICAgICAgICAgIDogU0VDVVJJVFlfQVRUUklCVVRFUzsgLy9UU2VjdXJpdHlBdHRyaWJ1dGVzOworICAgIGhDQVIsIGhQaXBlVywgaENBVywgaFBpcGUgOiBUSGFuZGxlOworYmVnaW4KKyAgc2QgOj0gUFNFQ1VSSVRZX0RFU0NSSVBUT1IoIExvY2FsQWxsb2MoIExQVFIsU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKSk7CisgIHRyeQorICAgIFdpbjMyQ2hlY2soIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoIHNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKSk7CisgICAgV2luMzJDaGVjayggU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbCggc2QsIFRSVUUsIG5pbCwgRkFMU0UpKTsKKworICAgIHNhLm5MZW5ndGggOj0gc2l6ZW9mKCBzYSk7CisgICAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgOj0gc2Q7CisgICAgc2EuYkluaGVyaXRIYW5kbGUgICAgICAgOj0gVFJVRTsgLy9hbGxvdyBwYXNzaW5nIGhhbmRsZSB0byBjaGlsZAorCisgICAgUmVzdWx0IDo9IENyZWF0ZVBpcGUoIGhDQVIsIGhQaXBlVywgQHNhLCBGQnVmU2l6ZSk7IC8vY3JlYXRlIHN0ZGluIHBpcGUKKyAgICBpZiBub3QgUmVzdWx0IHRoZW4gYmVnaW4gICAvL2NyZWF0ZSBzdGRpbiBwaXBlCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1RTZXJ2ZXJQaXBlIENyZWF0ZVBpcGUgKGFub24pIGZhaWxlZCwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CisgICAgICBFeGl0OworICAgIGVuZDsKKworICAgIFJlc3VsdCA6PSBDcmVhdGVQaXBlKCBoUGlwZSwgaENBVywgQHNhLCBGQnVmU2l6ZSk7IC8vY3JlYXRlIHN0ZG91dCBwaXBlCisgICAgaWYgbm90IFJlc3VsdCB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQorICAgICAgQ2xvc2VIYW5kbGUoIGhDQVIpOworICAgICAgQ2xvc2VIYW5kbGUoIGhQaXBlVyk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1RTZXJ2ZXJQaXBlIENyZWF0ZVBpcGUgKGFub24pIGZhaWxlZCwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CisgICAgICBFeGl0OworICAgIGVuZDsKKworICAgIEZDbGllbnRBbm9uUmVhZCAgOj0gaENBUjsKKyAgICBGQ2xpZW50QW5vbldyaXRlIDo9IGhDQVc7CisgICAgRlJlYWRIYW5kbGUgICAgICA6PSBoUGlwZTsKKyAgICBGV3JpdGVIYW5kbGUgICAgIDo9IGhQaXBlVzsKKyAgZmluYWxseQorICAgIGlmIHNkIDw+IG5pbCB0aGVuIExvY2FsRnJlZSggQ2FyZGluYWwoc2QpKTsKKyAgZW5kOworZW5kOworCisKK3sgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwgfQorCisKK2NvbnN0cnVjdG9yIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZSggYVBpcGVuYW1lIDogc3RyaW5nOyBhQnVmc2l6ZSwgYU1heENvbm5zLCBhVGltZU91dCA6IENhcmRpbmFsKTsKKy8vIE5hbWVkIFBpcGUgQ1RPUgorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgQVNTRVJUKCBhVGltZW91dCA+IDApOworICBGUGlwZU5hbWUgIDo9IGFQaXBlbmFtZTsKKyAgRkJ1ZnNpemUgICA6PSBhQnVmU2l6ZTsKKyAgRk1heENvbm5zICA6PSBNYXgoIDEsIE1pbiggUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTLCBhTWF4Q29ubnMpKTsKKyAgRkhhbmRsZSAgICA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgRlRpbWVvdXQgICA6PSBhVGltZU91dDsKKyAgRkNvbm5lY3RlZCA6PSBGQUxTRTsKKworICBpZiBDb3B5KEZQaXBlTmFtZSwxLDIpIDw+ICdcXCcKKyAgdGhlbiBGUGlwZU5hbWUgOj0gJ1xcLlxwaXBlXCcgKyBGUGlwZU5hbWU7ICAvLyBhc3N1bWUgbG9jYWxob3N0CitlbmQ7CisKKworZnVuY3Rpb24gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7Cit2YXIgZHdFcnJvciwgZHdXYWl0LCBkd0R1bW15IDogRFdPUkQ7CisgICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOworICAgIGhhbmRsZXMgOiBhcnJheVswLi4xXSBvZiBUSGFuZGxlOworYmVnaW4KKyAgb3ZlcmxhcHBlZCA6PSBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOworCisgIEFTU0VSVCggbm90IEZDb25uZWN0ZWQpOworICBDcmVhdGVOYW1lZFBpcGU7CisgIHdoaWxlIG5vdCBGQ29ubmVjdGVkIGRvIGJlZ2luCisKKyAgICBpZiBRdWVyeVN0b3BTZXJ2ZXIgdGhlbiBiZWdpbgorICAgICAgSW50ZXJuYWxDbG9zZTsKKyAgICAgIEFib3J0OworICAgIGVuZDsKKworICAgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKQorICAgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICAgIC8vIFdhaXQgZm9yIHRoZSBjbGllbnQgdG8gY29ubmVjdDsgaWYgaXQgc3VjY2VlZHMsIHRoZQorICAgIC8vIGZ1bmN0aW9uIHJldHVybnMgYSBub256ZXJvIHZhbHVlLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucworICAgIC8vIHplcm8sIEdldExhc3RFcnJvciBzaG91bGQgcmV0dXJuIEVSUk9SX1BJUEVfQ09OTkVDVEVELgorICAgIGlmIENvbm5lY3ROYW1lZFBpcGUoIEhhbmRsZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkUHRyKSB0aGVuIGJlZ2luCisgICAgICBGQ29ubmVjdGVkIDo9IFRSVUU7CisgICAgICBCcmVhazsKKyAgICBlbmQ7CisKKyAgICAvLyBDb25uZWN0TmFtZWRQaXBlKCkgcmV0dXJucyBGQUxTRSBmb3IgT3ZlcmxhcHBlZElPLCBldmVuIGlmIGNvbm5lY3RlZC4KKyAgICAvLyBXZSBoYXZlIHRvIGNoZWNrIEdldExhc3RFcnJvcigpIGV4cGxpY2l0bHkgdG8gZmluZCBvdXQKKyAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICBjYXNlIGR3RXJyb3Igb2YKKyAgICAgIEVSUk9SX1BJUEVfQ09OTkVDVEVEIDogYmVnaW4KKyAgICAgICAgRkNvbm5lY3RlZCA6PSBub3QgUXVlcnlTdG9wU2VydmVyOyAgLy8gc3BlY2lhbCBjYXNlOiBwaXBlIGltbWVkaWF0ZWx5IGNvbm5lY3RlZAorICAgICAgZW5kOworCisgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgaGFuZGxlc1swXSA6PSBvdmVybGFwcGVkLldhaXRIYW5kbGU7CisgICAgICAgIGhhbmRsZXNbMV0gOj0gRlN0b3BTZXJ2ZXIuSGFuZGxlOworICAgICAgICBkd1dhaXQgOj0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyggMiwgQGhhbmRsZXMsIEZBTFNFLCBGVGltZW91dCk7CisgICAgICAgIEZDb25uZWN0ZWQgOj0gKGR3V2FpdCA9IFdBSVRfT0JKRUNUXzApCisgICAgICAgICAgICAgICAgICBhbmQgR2V0T3ZlcmxhcHBlZFJlc3VsdCggSGFuZGxlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGR3RHVtbXksIFRSVUUpCisgICAgICAgICAgICAgICAgICBhbmQgbm90IFF1ZXJ5U3RvcFNlcnZlcjsKKyAgICAgIGVuZDsKKworICAgIGVsc2UKKyAgICAgIEludGVybmFsQ2xvc2U7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NsaWVudCBjb25uZWN0aW9uIGZhaWxlZCcpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIGNyZWF0ZSB0aGUgdHJhbnNwb3J0IGltcGwKKyAgcmVzdWx0IDo9IENyZWF0ZVRyYW5zcG9ydEluc3RhbmNlOworZW5kOworCisKK2Z1bmN0aW9uIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZVRyYW5zcG9ydEluc3RhbmNlIDogSVRyYW5zcG9ydDsKKy8vIGNyZWF0ZSB0aGUgdHJhbnNwb3J0IGltcGwKK3ZhciBoUGlwZSA6IFRIYW5kbGU7CitiZWdpbgorICBoUGlwZSA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlciggUG9pbnRlcihGSGFuZGxlKSwgUG9pbnRlcihJTlZBTElEX0hBTkRMRV9WQUxVRSkpKTsKKyAgdHJ5CisgICAgRkNvbm5lY3RlZCA6PSBGQUxTRTsKKyAgICByZXN1bHQgOj0gVE5hbWVkUGlwZVRyYW5zcG9ydFNlcnZlckVuZEltcGwuQ3JlYXRlKCBoUGlwZSwgVFJVRSwgRlRpbWVvdXQpOworICBleGNlcHQKKyAgICBDbG9zZVBpcGVIYW5kbGUoaFBpcGUpOworICAgIHJhaXNlOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkludGVybmFsQ2xvc2U7Cit2YXIgaFBpcGUgOiBUSGFuZGxlOworYmVnaW4KKyAgaFBpcGUgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIoIFBvaW50ZXIoRkhhbmRsZSksIFBvaW50ZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgIGlmIGhQaXBlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgdGhlbiBFeGl0OworCisgIHRyeQorICAgIGlmIEZDb25uZWN0ZWQKKyAgICB0aGVuIEZsdXNoRmlsZUJ1ZmZlcnMoIGhQaXBlKQorICAgIGVsc2UgQ2FuY2VsSW8oIGhQaXBlKTsKKyAgICBEaXNjb25uZWN0TmFtZWRQaXBlKCBoUGlwZSk7CisgIGZpbmFsbHkKKyAgICBDbG9zZVBpcGVIYW5kbGUoIGhQaXBlKTsKKyAgICBGQ29ubmVjdGVkIDo9IEZBTFNFOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuSGFuZGxlIDogVEhhbmRsZTsKK2JlZ2luCisgIHskSUZERUYgV0lONjR9CisgIHJlc3VsdCA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIEludDY0KEZIYW5kbGUpLCAwKSk7CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IFRIYW5kbGUoIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoIEludGVnZXIoRkhhbmRsZSksIDApKTsKKyAgeyRFTkRJRn0KK2VuZDsKKworCitmdW5jdGlvbiBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGVOYW1lZFBpcGUgOiBUSGFuZGxlOwordmFyIFNJREF1dGhXb3JsZCA6IFNJRF9JREVOVElGSUVSX0FVVEhPUklUWSA7CisgICAgZXZlcnlvbmVfc2lkIDogUFNJRDsKKyAgICBlYSAgICAgICAgICAgOiBFWFBMSUNJVF9BQ0NFU1M7CisgICAgYWNsICAgICAgICAgIDogUEFDTDsKKyAgICBzZCAgICAgICAgICAgOiBQU0VDVVJJVFlfREVTQ1JJUFRPUjsKKyAgICBzYSAgICAgICAgICAgOiBTRUNVUklUWV9BVFRSSUJVVEVTOworY29uc3QKKyAgU0VDVVJJVFlfV09STERfU0lEX0FVVEhPUklUWSAgOiBUU0lESWRlbnRpZmllckF1dGhvcml0eSA9IChWYWx1ZSA6ICgwLDAsMCwwLDAsMSkpOworICBTRUNVUklUWV9XT1JMRF9SSUQgPSAkMDAwMDAwMDA7CitiZWdpbgorICBzZCA6PSBuaWw7CisgIGV2ZXJ5b25lX3NpZCA6PSBuaWw7CisgIHRyeQorICAgIEFTU0VSVCggKEZIYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgYW5kIG5vdCBGQ29ubmVjdGVkKTsKKworICAgIC8vIFdpbmRvd3MgLSBzZXQgc2VjdXJpdHkgdG8gYWxsb3cgbm9uLWVsZXZhdGVkIGFwcHMKKyAgICAvLyB0byBhY2Nlc3MgcGlwZXMgY3JlYXRlZCBieSBlbGV2YXRlZCBhcHBzLgorICAgIFNJREF1dGhXb3JsZCA6PSBTRUNVUklUWV9XT1JMRF9TSURfQVVUSE9SSVRZOworICAgIEFsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZCggU0lEQXV0aFdvcmxkLCAxLCBTRUNVUklUWV9XT1JMRF9SSUQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGV2ZXJ5b25lX3NpZCk7CisKKyAgICBaZXJvTWVtb3J5KCBAZWEsIFNpemVPZihlYSkpOworICAgIGVhLmdyZkFjY2Vzc1Blcm1pc3Npb25zIDo9IEdFTkVSSUNfQUxMOyAvL1NQRUNJRklDX1JJR0hUU19BTEwgb3IgU1RBTkRBUkRfUklHSFRTX0FMTDsKKyAgICBlYS5ncmZBY2Nlc3NNb2RlICAgICAgICA6PSBTRVRfQUNDRVNTOworICAgIGVhLmdyZkluaGVyaXRhbmNlICAgICAgIDo9IE5PX0lOSEVSSVRBTkNFOworICAgIGVhLlRydXN0ZWUuVHJ1c3RlZUZvcm0gIDo9IFRSVVNURUVfSVNfU0lEOworICAgIGVhLlRydXN0ZWUuVHJ1c3RlZVR5cGUgIDo9IFRSVVNURUVfSVNfV0VMTF9LTk9XTl9HUk9VUDsKKyAgICBlYS5UcnVzdGVlLnB0c3RyTmFtZSAgICA6PSBQQ2hhcihldmVyeW9uZV9zaWQpOworCisgICAgYWNsIDo9IG5pbDsKKyAgICBTZXRFbnRyaWVzSW5BY2woIDEsIEBlYSwgbmlsLCBhY2wpOworCisgICAgc2QgOj0gUFNFQ1VSSVRZX0RFU0NSSVBUT1IoIExvY2FsQWxsb2MoIExQVFIsU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKSk7CisgICAgV2luMzJDaGVjayggSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvciggc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pKTsKKyAgICBXaW4zMkNoZWNrKCBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsKCBzZCwgVFJVRSwgYWNsLCBGQUxTRSkpOworCisgICAgc2Eubkxlbmd0aCA6PSBTaXplT2Yoc2EpOworICAgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yIDo9IHNkOworICAgIHNhLmJJbmhlcml0SGFuZGxlICAgICAgIDo9IEZBTFNFOworCisgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBuYW1lZCBwaXBlCisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gV2luZG93cy5DcmVhdGVOYW1lZFBpcGUoCisgICAgeyRFTFNFfQorICAgIHJlc3VsdCA6PSBXaW5hcGkuV2luZG93cy5DcmVhdGVOYW1lZFBpcGUoCisgICAgeyRFTkRJRn0KKyAgICAgICAgUENoYXIoIEZQaXBlTmFtZSksICAgICAgICAvLyBwaXBlIG5hbWUKKyAgICAgICAgUElQRV9BQ0NFU1NfRFVQTEVYIG9yICAgICAvLyByZWFkL3dyaXRlIGFjY2VzcworICAgICAgICBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCwgICAgIC8vIGFzeW5jIG1vZGUKKyAgICAgICAgUElQRV9UWVBFX0JZVEUgb3IgICAgICAgICAvLyBieXRlIHR5cGUgcGlwZQorICAgICAgICBQSVBFX1JFQURNT0RFX0JZVEUsICAgICAgIC8vIGJ5dGUgcmVhZCBtb2RlCisgICAgICAgIEZNYXhDb25ucywgICAgICAgICAgICAgICAgLy8gbWF4LiBpbnN0YW5jZXMKKyAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQorICAgICAgICBGVGltZW91dCwgICAgICAgICAgICAgICAgIC8vIHRpbWUtb3V0LCBzZWUgTVNETgorICAgICAgICBAc2EgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlCisgICAgKTsKKworICAgIGlmKCByZXN1bHQgPD4gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgdGhlbiBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlciggUG9pbnRlcihGSGFuZGxlKSwgUG9pbnRlcihyZXN1bHQpKQorICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQgJyArIEludFRvU3RyKEdldExhc3RFcnJvcikpOworCisgIGZpbmFsbHkKKyAgICBpZiBzZCA8PiBuaWwgdGhlbiBMb2NhbEZyZWUoIENhcmRpbmFsKCBzZCkpOworICAgIGlmIGFjbCA8PiBuaWwgdGhlbiBMb2NhbEZyZWUoIENhcmRpbmFsKCBhY2wpKTsKKyAgICBpZiBldmVyeW9uZV9zaWQgPD4gbmlsIHRoZW4gRnJlZVNpZChldmVyeW9uZV9zaWQpOworICBlbmQ7CitlbmQ7CisKKworCitlbmQuCisKKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDlhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcwpAQCAtMCwwICsxLDE3MTUgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKK3VuaXQgVGhyaWZ0LlRyYW5zcG9ydDsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KK3skU0NPUEVERU5VTVMgT059CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBNYXRoLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICBBY3RpdmVYLCBtc3htbCwgV2luU29jaywgU29ja2V0cywKKyAgeyRFTFNFfQorICAgIFdpbmFwaS5BY3RpdmVYLCBXaW5hcGkubXN4bWwsIFdpbmFwaS5XaW5Tb2NrLAorICAgIHskSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgICBXZWIuV2luLlNvY2tldHMsCisgICAgeyRFTFNFfQorICAgICAgVGhyaWZ0LlNvY2tldCwKKyAgICB7JEVORElGfQorICB7JEVORElGfQorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LlN0cmVhbTsKKwordHlwZQorICBJVHJhbnNwb3J0ID0gaW50ZXJmYWNlCisgICAgWyd7REI4NDk2MUUtOEJCMy00NTMyLTk5RTEtQThDN0FDMjMwMEY3fSddCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOworICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBPcGVuOworICAgIHByb2NlZHVyZSBDbG9zZTsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBGbHVzaDsKKyAgZW5kOworCisgIFRUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVHJhbnNwb3J0KQorICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBPcGVuKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBDbG9zZSgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWQoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IHZpcnR1YWw7CisgIGVuZDsKKworICBUVHJhbnNwb3J0RXhjZXB0aW9uID0gY2xhc3MoIFRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRFeGNlcHRpb25UeXBlID0gKAorICAgICAgICBVbmtub3duLAorICAgICAgICBOb3RPcGVuLAorICAgICAgICBBbHJlYWR5T3BlbiwKKyAgICAgICAgVGltZWRPdXQsCisgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgQmFkQXJncywKKyAgICAgICAgSW50ZXJydXB0ZWQKKyAgICAgICk7CisgIHByaXZhdGUKKyAgICBmdW5jdGlvbiBHZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKKyAgcHJvdGVjdGVkCisgICAgY29uc3RydWN0b3IgSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRUcmFuc3BvcnRFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIGNvbnN0IG1zZzogc3RyaW5nKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIHByb3BlcnR5IFR5cGVfOiBURXhjZXB0aW9uVHlwZSByZWFkIEdldFR5cGU7CisgIGVuZDsKKworICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkID0gY2xhc3MgYWJzdHJhY3QgKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIGVuZDsKKworICBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3BlbiA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uQWxyZWFkeU9wZW4gPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0ID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisKKyAgSUhUVFBDbGllbnQgPSBpbnRlcmZhY2UoIElUcmFuc3BvcnQgKQorICAgIFsne0JBMTQyRDEyLThBRTYtNEI1MC05RTMzLTZCNzg0M0IyMUQ3M30nXQorICAgIHByb2NlZHVyZSBTZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgICAgcHJvY2VkdXJlIFNlbmRSZXF1ZXN0OworCisgICAgcHJvcGVydHkgRG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXREbnNSZXNvbHZlVGltZW91dCB3cml0ZSBTZXREbnNSZXNvbHZlVGltZW91dDsKKyAgICBwcm9wZXJ0eSBDb25uZWN0aW9uVGltZW91dDogSW50ZWdlciByZWFkIEdldENvbm5lY3Rpb25UaW1lb3V0IHdyaXRlIFNldENvbm5lY3Rpb25UaW1lb3V0OworICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0U2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CisgICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsKKyAgICBwcm9wZXJ0eSBDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPiByZWFkIEdldEN1c3RvbUhlYWRlcnM7CisgIGVuZDsKKworICBUSFRUUENsaWVudEltcGwgPSBjbGFzcyggVFRyYW5zcG9ydEltcGwsIElIVFRQQ2xpZW50KQorICBwcml2YXRlCisgICAgRlVyaSA6IHN0cmluZzsKKyAgICBGSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZEbnNSZXNvbHZlVGltZW91dCA6IEludGVnZXI7CisgICAgRkNvbm5lY3Rpb25UaW1lb3V0IDogSW50ZWdlcjsKKyAgICBGU2VuZFRpbWVvdXQgOiBJbnRlZ2VyOworICAgIEZSZWFkVGltZW91dCA6IEludGVnZXI7CisgICAgRkN1c3RvbUhlYWRlcnMgOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKKworICAgIGZ1bmN0aW9uIENyZWF0ZVJlcXVlc3Q6IElYTUxIVFRQUmVxdWVzdDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3BlbigpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRTZW5kVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFJlYWRUaW1lb3V0OiBJbnRlZ2VyOworCisgICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgICAgcHJvY2VkdXJlIFNlbmRSZXF1ZXN0OworICAgIHByb3BlcnR5IERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0RG5zUmVzb2x2ZVRpbWVvdXQgd3JpdGUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQ7CisgICAgcHJvcGVydHkgQ29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRDb25uZWN0aW9uVGltZW91dCB3cml0ZSBTZXRDb25uZWN0aW9uVGltZW91dDsKKyAgICBwcm9wZXJ0eSBTZW5kVGltZW91dDogSW50ZWdlciByZWFkIEdldFNlbmRUaW1lb3V0IHdyaXRlIFNldFNlbmRUaW1lb3V0OworICAgIHByb3BlcnR5IFJlYWRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0UmVhZFRpbWVvdXQgd3JpdGUgU2V0UmVhZFRpbWVvdXQ7CisgICAgcHJvcGVydHkgQ3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz4gcmVhZCBHZXRDdXN0b21IZWFkZXJzOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFVcmk6IHN0cmluZyk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIElTZXJ2ZXJUcmFuc3BvcnQgPSBpbnRlcmZhY2UKKyAgICBbJ3tDNDNCODdFRC02OUVBLTQ3QzQtQjc3Qy0xNUUyODgyNTI5MDB9J10KKyAgICBwcm9jZWR1cmUgTGlzdGVuOworICAgIHByb2NlZHVyZSBDbG9zZTsKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7CisgIGVuZDsKKworICBUU2VydmVyVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVNlcnZlclRyYW5zcG9ydCkKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIExpc3RlbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIENsb3NlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7ICB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgZW5kOworCisgIElUcmFuc3BvcnRGYWN0b3J5ID0gaW50ZXJmYWNlCisgICAgWyd7REQ4MDk0NDYtMDAwRi00OUUxLTlCRkYtRTBEMERDNzZBOUQ3fSddCisgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0KCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOiBJVHJhbnNwb3J0OworICBlbmQ7CisKKyAgVFRyYW5zcG9ydEZhY3RvcnlJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVHJhbnNwb3J0RmFjdG9yeSkKKyAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7IHZpcnR1YWw7CisgIGVuZDsKKworICBUVGNwU29ja2V0U3RyZWFtSW1wbCA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCApCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBwcml2YXRlIHR5cGUKKyAgICBUV2FpdEZvckRhdGEgPSAoIHdmZF9IYXZlRGF0YSwgd2ZkX1RpbWVvdXQsIHdmZF9FcnJvcik7CisgIHByaXZhdGUKKyAgICBGVGNwQ2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OworICAgIEZUaW1lb3V0IDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBTZWxlY3QoIFJlYWRSZWFkeSwgV3JpdGVSZWFkeSwgRXhjZXB0RmxhZzogUEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICBUaW1lT3V0OiBJbnRlZ2VyOyB2YXIgd3NhRXJyb3IgOiBJbnRlZ2VyKTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBXYWl0Rm9yRGF0YSggVGltZU91dCA6IEludGVnZXI7IHBCdWYgOiBQb2ludGVyOyBEZXNpcmVkQnl0ZXM6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3c2FFcnJvciwgYnl0ZXNSZWFkeSA6IEludGVnZXIpOiBUV2FpdEZvckRhdGE7Cit7JEVMU0V9CisgICAgRlRjcENsaWVudDogVFNvY2tldDsKKyAgcHJvdGVjdGVkIGNvbnN0CisgICAgU0xFRVBfVElNRSA9IDIwMDsKK3skRU5ESUZ9CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRDdXN0b21JcENsaWVudDsgY29uc3QgYVRpbWVvdXQgOiBJbnRlZ2VyID0gMCk7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUU29ja2V0OyBjb25zdCBhVGltZW91dCA6IExvbmd3b3JkID0gMCk7Cit7JEVORElGfQorICBlbmQ7CisKKyAgSVN0cmVhbVRyYW5zcG9ydCA9IGludGVyZmFjZSggSVRyYW5zcG9ydCApCisgICAgWyd7QTg0NzlCNDctMkEzRS00NDIxLUE5QTAtRDVBOUVEQ0M2MzRBfSddCisgICAgZnVuY3Rpb24gR2V0SW5wdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CisgICAgZnVuY3Rpb24gR2V0T3V0cHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworICAgIHByb3BlcnR5IElucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSByZWFkIEdldElucHV0U3RyZWFtOworICAgIHByb3BlcnR5IE91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0gcmVhZCBHZXRPdXRwdXRTdHJlYW07CisgIGVuZDsKKworICBUU3RyZWFtVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCwgSVN0cmVhbVRyYW5zcG9ydCkKKyAgcHJvdGVjdGVkCisgICAgRklucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgICBGT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uIEdldElucHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworICAgIGZ1bmN0aW9uIEdldE91dHB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKKyAgcHVibGljCisgICAgcHJvcGVydHkgSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtIHJlYWQgR2V0SW5wdXRTdHJlYW07CisgICAgcHJvcGVydHkgT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSByZWFkIEdldE91dHB1dFN0cmVhbTsKKworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQUlucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsgY29uc3QgQU91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUQnVmZmVyZWRTdHJlYW1JbXBsID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsKQorICBwcml2YXRlCisgICAgRlN0cmVhbSA6IElUaHJpZnRTdHJlYW07CisgICAgRkJ1ZlNpemUgOiBJbnRlZ2VyOworICAgIEZSZWFkQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKyAgICBGV3JpdGVCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3BlbjsgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVN0cmVhbTogSVRocmlmdFN0cmVhbTsgQUJ1ZlNpemU6IEludGVnZXIpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUU2VydmVyU29ja2V0SW1wbCA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCkKKyAgcHJpdmF0ZQoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBGU2VydmVyIDogVFRjcFNlcnZlcjsKKyAgICBGUG9ydCA6IEludGVnZXI7CisgICAgRkNsaWVudFRpbWVvdXQgOiBJbnRlZ2VyOworeyRFTFNFfQorICAgIEZTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7Cit7JEVORElGfQorICAgIEZVc2VCdWZmZXJlZFNvY2tldCA6IEJvb2xlYW47CisgICAgRk93bnNTZXJ2ZXIgOiBCb29sZWFuOworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYykgOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKKyAgcHVibGljCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRUxTRX0KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCA9IDApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFQb3J0OiBJbnRlZ2VyOyBBQ2xpZW50VGltZW91dDogTG9uZ3dvcmQgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRU5ESUZ9CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCApCisgIHByaXZhdGUKKyAgICBGSW5wdXRCdWZmZXIgOiBJVGhyaWZ0U3RyZWFtOworICAgIEZPdXRwdXRCdWZmZXIgOiBJVGhyaWZ0U3RyZWFtOworICAgIEZUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0OworICAgIEZCdWZTaXplIDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBJbml0QnVmZmVyczsKKyAgICBmdW5jdGlvbiBHZXRVbmRlcmx5aW5nVHJhbnNwb3J0OiBJVHJhbnNwb3J0OworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0IDogSVN0cmVhbVRyYW5zcG9ydCApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0OyBBQnVmU2l6ZTogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb3BlcnR5IFVuZGVybHlpbmdUcmFuc3BvcnQ6IElUcmFuc3BvcnQgcmVhZCBHZXRVbmRlcmx5aW5nVHJhbnNwb3J0OworICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKyAgZW5kOworCisgIFRTb2NrZXRJbXBsID0gY2xhc3MoVFN0cmVhbVRyYW5zcG9ydEltcGwpCisgIHByaXZhdGUKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgRkNsaWVudCA6IFRDdXN0b21JcENsaWVudDsKK3skRUxTRX0KKyAgICBGQ2xpZW50OiBUU29ja2V0OworeyRFTkRJRn0KKyAgICBGT3duc0NsaWVudCA6IEJvb2xlYW47CisgICAgRkhvc3QgOiBzdHJpbmc7CisgICAgRlBvcnQgOiBJbnRlZ2VyOworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBGVGltZW91dCA6IEludGVnZXI7Cit7JEVMU0V9CisgICAgRlRpbWVvdXQgOiBMb25nd29yZDsKK3skRU5ESUZ9CisKKyAgICBwcm9jZWR1cmUgSW5pdFNvY2tldDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7IGFPd25zQ2xpZW50IDogQm9vbGVhbjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFDbGllbnQ6IFRTb2NrZXQ7IGFPd25zQ2xpZW50OiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkID0gMCk7IG92ZXJsb2FkOworeyRFTkRJRn0KKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7Cit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIHByb3BlcnR5IFRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50IHJlYWQgRkNsaWVudDsKK3skRUxTRX0KKyAgICBwcm9wZXJ0eSBUY3BDbGllbnQ6IFRTb2NrZXQgcmVhZCBGQ2xpZW50OworeyRFTkRJRn0KKyAgICBwcm9wZXJ0eSBIb3N0IDogc3RyaW5nIHJlYWQgRkhvc3Q7CisgICAgcHJvcGVydHkgUG9ydDogSW50ZWdlciByZWFkIEZQb3J0OworICBlbmQ7CisKKyAgVEZyYW1lZFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFRyYW5zcG9ydEltcGwpCisgIHByaXZhdGUgY29uc3QKKyAgICBGSGVhZGVyU2l6ZSA6IEludGVnZXIgPSA0OworICBwcml2YXRlIGNsYXNzIHZhcgorICAgIEZIZWFkZXJfRHVtbXkgOiBhcnJheSBvZiBCeXRlOworICBwcm90ZWN0ZWQKKyAgICBGVHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgICBGV3JpdGVCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOworICAgIEZSZWFkQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKworICAgIHByb2NlZHVyZSBJbml0V3JpdGVCdWZmZXI7CisgICAgcHJvY2VkdXJlIFJlYWRGcmFtZTsKKyAgcHVibGljCisgICAgdHlwZQorICAgICAgVEZhY3RvcnkgPSBjbGFzcyggVFRyYW5zcG9ydEZhY3RvcnlJbXBsICkKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOworICAgICAgZW5kOworCisgICAgeyRJRkRFRiBIQVZFX0NMQVNTX0NUT1J9CisgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIHskRU5ESUZ9CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTsgb3ZlcmxvYWQ7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgIGVuZDsKKworeyRJRk5ERUYgSEFWRV9DTEFTU19DVE9SfQorcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsX0luaXRpYWxpemU7Cit7JEVORElGfQorCitjb25zdAorICBERUZBVUxUX1RIUklGVF9USU1FT1VUID0gNSAqIDEwMDA7IC8vIG1zCisKKworaW1wbGVtZW50YXRpb24KKworeyBUVHJhbnNwb3J0SW1wbCB9CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5GbHVzaDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUGVlazogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBJc09wZW47CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiByZXN1bHQgOj0gUmVhZCggQGJ1ZlswXSwgTGVuZ3RoKGJ1ZiksIG9mZiwgbGVuKQorICBlbHNlIHJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gcmVzdWx0IDo9IFJlYWRBbGwoIEBidWZbMF0sIExlbmd0aChidWYpLCBvZmYsIGxlbikKKyAgZWxzZSByZXN1bHQgOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZlswXSwgMCwgTGVuZ3RoKGJ1ZikpOworZW5kOworCitwcm9jZWR1cmUgVFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZlswXSwgb2ZmLCBsZW4pOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcmV0IDogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSAwOworICB3aGlsZSByZXN1bHQgPCBsZW4gZG8gYmVnaW4KKyAgICByZXQgOj0gUmVhZCggcEJ1ZiwgYnVmbGVuLCBvZmYgKyByZXN1bHQsIGxlbiAtIHJlc3VsdCk7CisgICAgaWYgcmV0ID4gMAorICAgIHRoZW4gSW5jKCByZXN1bHQsIHJldCkKKyAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSggJ0Nhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkJyApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOworYmVnaW4KKyAgU2VsZi5Xcml0ZSggcEJ1ZiwgMCwgbGVuKTsKK2VuZDsKKworeyBUSFRUUENsaWVudEltcGwgfQorCitjb25zdHJ1Y3RvciBUSFRUUENsaWVudEltcGwuQ3JlYXRlKGNvbnN0IEFVcmk6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVXJpIDo9IEFVcmk7CisKKyAgLy8gZGVmYXVsdHMgYWNjb3JkaW5nIHRvIE1TRE4KKyAgRkRuc1Jlc29sdmVUaW1lb3V0IDo9IDA7IC8vIG5vIHRpbWVvdXQKKyAgRkNvbm5lY3Rpb25UaW1lb3V0IDo9IDYwICogMTAwMDsKKyAgRlNlbmRUaW1lb3V0ICAgICAgIDo9IDMwICogMTAwMDsKKyAgRlJlYWRUaW1lb3V0ICAgICAgIDo9IDMwICogMTAwMDsKKworICBGQ3VzdG9tSGVhZGVycyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8c3RyaW5nLHN0cmluZz4uQ3JlYXRlOworICBGT3V0cHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggVE1lbW9yeVN0cmVhbS5DcmVhdGUsIFRydWUpOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuQ3JlYXRlUmVxdWVzdDogSVhNTEhUVFBSZXF1ZXN0OwordmFyCisgIHBhaXIgOiBUUGFpcjxzdHJpbmcsc3RyaW5nPjsKKyAgc3J2SHR0cCA6IElTZXJ2ZXJYTUxIVFRQUmVxdWVzdDsKK2JlZ2luCisgIHskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgIFJlc3VsdCA6PSBDb1NlcnZlclhNTEhUVFAuQ3JlYXRlOworICB7JEVMU0V9CisgIFJlc3VsdCA6PSBDb1hNTEhUVFBSZXF1ZXN0LkNyZWF0ZTsKKyAgeyRJRkVORH0KKworICAvLyBzZXR0aW5nIGEgdGltZW91dCB2YWx1ZSB0byAwICh6ZXJvKSBtZWFucyAibm8gdGltZW91dCIgZm9yIHRoYXQgc2V0dGluZworICBpZiBTdXBwb3J0cyggcmVzdWx0LCBJU2VydmVyWE1MSFRUUFJlcXVlc3QsIHNydkh0dHApCisgIHRoZW4gc3J2SHR0cC5zZXRUaW1lb3V0cyggRG5zUmVzb2x2ZVRpbWVvdXQsIENvbm5lY3Rpb25UaW1lb3V0LCBTZW5kVGltZW91dCwgUmVhZFRpbWVvdXQpOworCisgIFJlc3VsdC5vcGVuKCdQT1NUJywgRlVyaSwgRmFsc2UsICcnLCAnJyk7CisgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CisgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CisgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnVXNlci1BZ2VudCcsICdEZWxwaGkvSUhUVFBDbGllbnQnKTsKKworICBmb3IgcGFpciBpbiBGQ3VzdG9tSGVhZGVycyBkbyBiZWdpbgorICAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCBwYWlyLktleSwgcGFpci5WYWx1ZSApOworICBlbmQ7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEhUVFBDbGllbnRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBDbG9zZTsKKyAgaW5oZXJpdGVkOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkRuc1Jlc29sdmVUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldERuc1Jlc29sdmVUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZEbnNSZXNvbHZlVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDb25uZWN0aW9uVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRTZW5kVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU2VuZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlNlbmRUaW1lb3V0IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlJlYWRUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZSZWFkVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZDdXN0b21IZWFkZXJzOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuT3BlbjsKK2JlZ2luCisgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuQ2xvc2U7CitiZWdpbgorICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5GbHVzaDsKK2JlZ2luCisgIHRyeQorICAgIFNlbmRSZXF1ZXN0OworICBmaW5hbGx5CisgICAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CisgICAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKKyAgICBBU1NFUlQoIEZPdXRwdXRTdHJlYW0gPD4gbmlsKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQnKTsKKyAgZW5kOworCisgIHRyeQorICAgIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW0uUmVhZCggcEJ1ZiwgYnVmbGVuLCBvZmYsIGxlbikKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uCisgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZW5kUmVxdWVzdDsKK3ZhcgorICB4bWxodHRwIDogSVhNTEhUVFBSZXF1ZXN0OworICBtcyA6IFRNZW1vcnlTdHJlYW07CisgIGEgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICB4bWxodHRwIDo9IENyZWF0ZVJlcXVlc3Q7CisKKyAgbXMgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIHRyeQorICAgIGEgOj0gRk91dHB1dFN0cmVhbS5Ub0FycmF5OworICAgIGxlbiA6PSBMZW5ndGgoYSk7CisgICAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgICBtcy5Xcml0ZUJ1ZmZlciggUG9pbnRlcihAYVswXSleLCBsZW4pOworICAgIGVuZDsKKyAgICBtcy5Qb3NpdGlvbiA6PSAwOworICAgIHhtbGh0dHAuc2VuZCggSVVua25vd24oIFRTdHJlYW1BZGFwdGVyLkNyZWF0ZSggbXMsIHNvUmVmZXJlbmNlICkpKTsKKyAgICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICAgIEZJbnB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5DcmVhdGUoIElVbmtub3duKCB4bWxodHRwLnJlc3BvbnNlU3RyZWFtKSBhcyBJU3RyZWFtKTsKKyAgZmluYWxseQorICAgIG1zLkZyZWU7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CitiZWdpbgorICBGT3V0cHV0U3RyZWFtLldyaXRlKCBwQnVmLCBvZmYsIGxlbik7CitlbmQ7CisKK3sgVFRyYW5zcG9ydEV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRFeGNlcHRpb24uR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CitiZWdpbgorICBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLk5vdE9wZW4KKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3BlbiB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbgorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0IHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlRpbWVkT3V0CisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uRW5kT2ZGaWxlIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkVuZE9mRmlsZQorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuQmFkQXJncworICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludGVycnVwdGVkCisgIGVsc2UgUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUcmFuc3BvcnRFeGNlcHRpb24uSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworeyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIE9GRn0KKyAgUmVzdWx0IDo9IENyZWF0ZShBVHlwZSwgJycpCit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgREVGQVVMVH0KK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlOworICBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CitiZWdpbgorICBjYXNlIEFUeXBlIG9mCisgICAgVEV4Y2VwdGlvblR5cGUuTm90T3BlbjogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbjogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5UaW1lZE91dDogICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5FbmRPZkZpbGU6ICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUuQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuQmFkQXJnczogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZDogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUobXNnKTsKKyAgZW5kOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKE1zZyk7CitlbmQ7CisKK3sgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkIH0KKworY29uc3RydWN0b3IgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgSGlkZGVuQ3JlYXRlKE1zZyk7CitlbmQ7CisKK3sgVFRyYW5zcG9ydEZhY3RvcnlJbXBsIH0KKworZnVuY3Rpb24gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsKK2JlZ2luCisgIFJlc3VsdCA6PSBBVHJhbnM7CitlbmQ7CisKK3sgVFNlcnZlclNvY2tldCB9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRUY3BTZXJ2ZXI7IEFDbGllbnRUaW1lb3V0OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTZXJ2ZXIgOj0gQVNlcnZlcjsKKyAgRkNsaWVudFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CitlbmQ7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmVyIDo9IEFTZXJ2ZXI7CisgIEZTZXJ2ZXIuUmVjdlRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CisgIEZTZXJ2ZXIuU2VuZFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZDsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVORElGfQorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIEZQb3J0IDo9IEFQb3J0OworICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKKyAgRlNlcnZlciA6PSBUVGNwU2VydmVyLkNyZWF0ZSggbmlsICk7CisgIEZTZXJ2ZXIuQmxvY2tNb2RlIDo9IGJtQmxvY2tpbmc7CisgIHskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgIEZTZXJ2ZXIuTG9jYWxQb3J0IDo9IEFuc2lTdHJpbmcoIEludFRvU3RyKCBGUG9ydCkpOworICB7JEVMU0V9CisgIEZTZXJ2ZXIuTG9jYWxQb3J0IDo9IEludFRvU3RyKCBGUG9ydCk7CisgIHskSUZFTkR9Cit7JEVMU0V9CisgIEZTZXJ2ZXIgOj0gVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQsIEFDbGllbnRUaW1lb3V0LCBBQ2xpZW50VGltZW91dCk7Cit7JEVORElGfQorICBGVXNlQnVmZmVyZWRTb2NrZXQgOj0gQVVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgRk93bnNTZXJ2ZXIgOj0gVHJ1ZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgaWYgRk93bnNTZXJ2ZXIgdGhlbiBiZWdpbgorICAgIEZTZXJ2ZXIuRnJlZTsKKyAgICBGU2VydmVyIDo9IG5pbDsKKyAgZW5kOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXRJbXBsLkFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKK3ZhcgoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgY2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OworeyRFTFNFfQorICBjbGllbnQ6IFRTb2NrZXQ7Cit7JEVORElGfQorICB0cmFucyAgOiBJU3RyZWFtVHJhbnNwb3J0OworYmVnaW4KKyAgaWYgRlNlcnZlciA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuJyk7CisgIGVuZDsKKworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgY2xpZW50IDo9IG5pbDsKKyAgdHJ5CisgICAgY2xpZW50IDo9IFRDdXN0b21JcENsaWVudC5DcmVhdGUobmlsKTsKKworICAgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKQorICAgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICAgIGlmIG5vdCBGU2VydmVyLkFjY2VwdCggY2xpZW50KSB0aGVuIGJlZ2luCisgICAgICBjbGllbnQuRnJlZTsKKyAgICAgIFJlc3VsdCA6PSBuaWw7CisgICAgICBFeGl0OworICAgIGVuZDsKKworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIGJlZ2luCisgICAgICBSZXN1bHQgOj0gbmlsOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisKKyAgICB0cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoIGNsaWVudCwgVFJVRSwgRkNsaWVudFRpbWVvdXQpOworICAgIGNsaWVudCA6PSBuaWw7ICAvLyB0cmFucyBvd25zIGl0IG5vdworCisgICAgaWYgRlVzZUJ1ZmZlcmVkU29ja2V0CisgICAgdGhlbiByZXN1bHQgOj0gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHRyYW5zKQorICAgIGVsc2UgcmVzdWx0IDo9IHRyYW5zOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgY2xpZW50LkZyZWU7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRS5Ub1N0cmluZyk7CisgICAgZW5kOworICBlbmQ7Cit7JEVMU0V9CisgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKSB0aGVuCisgICAgZm5BY2NlcHRpbmcoKTsKKworICBjbGllbnQgOj0gRlNlcnZlci5BY2NlcHQ7CisgIHRyeQorICAgIHRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZShjbGllbnQsIFRydWUpOworICAgIGNsaWVudCA6PSBuaWw7CisKKyAgICBpZiBGVXNlQnVmZmVyZWRTb2NrZXQgdGhlbgorICAgICAgUmVzdWx0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKHRyYW5zKQorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSB0cmFuczsKKyAgZXhjZXB0CisgICAgY2xpZW50LkZyZWU7CisgICAgcmFpc2U7CisgIGVuZDsKK3skRU5ESUZ9CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5MaXN0ZW47CitiZWdpbgorICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuCisgIGJlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIHRyeQorICAgICAgRlNlcnZlci5BY3RpdmUgOj0gVHJ1ZTsKKyAgICBleGNlcHQKKyAgICAgIG9uIEU6IEV4Y2VwdGlvbgorICAgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICcgKyBFLk1lc3NhZ2UpOworICAgIGVuZDsKK3skRUxTRX0KKyAgICBGU2VydmVyLkxpc3RlbjsKK3skRU5ESUZ9CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXRJbXBsLkNsb3NlOworYmVnaW4KKyAgaWYgRlNlcnZlciA8PiBuaWwgdGhlbgoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgICB0cnkKKyAgICAgIEZTZXJ2ZXIuQWN0aXZlIDo9IEZhbHNlOworICAgIGV4Y2VwdAorICAgICAgb24gRTogRXhjZXB0aW9uCisgICAgICBkbyByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ0Vycm9yIG9uIGNsb3Npbmcgc29ja2V0IDogJyArIEUuTWVzc2FnZSk7CisgICAgZW5kOworeyRFTFNFfQorICAgIEZTZXJ2ZXIuQ2xvc2U7Cit7JEVORElGfQorZW5kOworCit7IFRTb2NrZXQgfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNvY2tldEltcGwuQ3JlYXRlKCBjb25zdCBBQ2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OyBhT3duc0NsaWVudCA6IEJvb2xlYW47IEFUaW1lb3V0OiBJbnRlZ2VyID0gMCk7Cit2YXIgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZDbGllbnQgOj0gQUNsaWVudDsKKyAgRlRpbWVvdXQgOj0gQVRpbWVvdXQ7CisgIEZPd25zQ2xpZW50IDo9IGFPd25zQ2xpZW50OworICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CisgIGluaGVyaXRlZCBDcmVhdGUoIHN0cmVhbSwgc3RyZWFtKTsKK2VuZDsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBQ2xpZW50OiBUU29ja2V0OyBhT3duc0NsaWVudDogQm9vbGVhbik7Cit2YXIgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZDbGllbnQgOj0gQUNsaWVudDsKKyAgRlRpbWVvdXQgOj0gQUNsaWVudC5SZWN2VGltZW91dDsKKyAgRk93bnNDbGllbnQgOj0gYU93bnNDbGllbnQ7CisgIHN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoRkNsaWVudCwgRlRpbWVvdXQpOworICBpbmhlcml0ZWQgQ3JlYXRlKHN0cmVhbSwgc3RyZWFtKTsKK2VuZDsKK3skRU5ESUZ9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQsIEFUaW1lb3V0OiBJbnRlZ2VyKTsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkKTsKK3skRU5ESUZ9CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKG5pbCxuaWwpOworICBGSG9zdCA6PSBBSG9zdDsKKyAgRlBvcnQgOj0gQVBvcnQ7CisgIEZUaW1lb3V0IDo9IEFUaW1lb3V0OworICBJbml0U29ja2V0OworZW5kOworCitkZXN0cnVjdG9yIFRTb2NrZXRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBpZiBGT3duc0NsaWVudAorICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0SW1wbC5DbG9zZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDbG9zZTsKKworICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKKworICBpZiBGT3duc0NsaWVudAorICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpCisgIGVsc2UgRkNsaWVudCA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBSZXN1bHQgOj0gKEZDbGllbnQgPD4gbmlsKSBhbmQgRkNsaWVudC5Db25uZWN0ZWQ7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSAoRkNsaWVudCA8PiBuaWwpIGFuZCBGQ2xpZW50LklzT3BlbgoreyRFTkRJRn0KK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXRJbXBsLkluaXRTb2NrZXQ7Cit2YXIKKyAgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIGlmIEZPd25zQ2xpZW50CisgIHRoZW4gRnJlZUFuZE5pbCggRkNsaWVudCkKKyAgZWxzZSBGQ2xpZW50IDo9IG5pbDsKKworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgRkNsaWVudCA6PSBUVGNwQ2xpZW50LkNyZWF0ZSggbmlsKTsKK3skRUxTRX0KKyAgRkNsaWVudCA6PSBUU29ja2V0LkNyZWF0ZShGSG9zdCwgRlBvcnQpOworeyRFTkRJRn0KKyAgRk93bnNDbGllbnQgOj0gVHJ1ZTsKKworICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CisgIEZJbnB1dFN0cmVhbSA6PSBzdHJlYW07CisgIEZPdXRwdXRTdHJlYW0gOj0gc3RyZWFtOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldEltcGwuT3BlbjsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkFscmVhZHlPcGVuLkNyZWF0ZSgnU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJyk7CisgIGVuZDsKKworICBpZiBGSG9zdCA9ICcnIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcpOworICBlbmQ7CisKKyAgaWYgUG9ydCA8PSAwIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcpOworICBlbmQ7CisKKyAgaWYgRkNsaWVudCA9IG5pbAorICB0aGVuIEluaXRTb2NrZXQ7CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIEZDbGllbnQuUmVtb3RlSG9zdCA6PSBUU29ja2V0SG9zdCggSG9zdCk7CisgIEZDbGllbnQuUmVtb3RlUG9ydCA6PSBUU29ja2V0UG9ydCggSW50VG9TdHIoIFBvcnQpKTsKKyAgRkNsaWVudC5Db25uZWN0OworeyRFTFNFfQorICBGQ2xpZW50Lk9wZW47Cit7JEVORElGfQorCisgIEZJbnB1dFN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQsIEZUaW1lb3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07CitlbmQ7CisKK3sgVEJ1ZmZlcmVkU3RyZWFtIH0KKworcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuQ2xvc2U7CitiZWdpbgorICBGbHVzaDsKKyAgRlN0cmVhbSA6PSBuaWw7CisKKyAgRlJlYWRCdWZmZXIuRnJlZTsKKyAgRlJlYWRCdWZmZXIgOj0gbmlsOworCisgIEZXcml0ZUJ1ZmZlci5GcmVlOworICBGV3JpdGVCdWZmZXIgOj0gbmlsOworZW5kOworCitjb25zdHJ1Y3RvciBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogSVRocmlmdFN0cmVhbTsgQUJ1ZlNpemU6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSA6PSBBU3RyZWFtOworICBGQnVmU2l6ZSA6PSBBQnVmU2l6ZTsKKyAgRlJlYWRCdWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIEZXcml0ZUJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQnVmZmVyZWRTdHJlYW1JbXBsLkRlc3Ryb3k7CitiZWdpbgorICBDbG9zZTsKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5GbHVzaDsKK3ZhcgorICBidWYgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGxlbiA6PSBGV3JpdGVCdWZmZXIuU2l6ZTsKKyAgICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICAgIFNldExlbmd0aCggYnVmLCBsZW4gKTsKKyAgICAgIEZXcml0ZUJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworICAgICAgRldyaXRlQnVmZmVyLlJlYWQoIFBvaW50ZXIoQGJ1ZlswXSleLCBsZW4gKTsKKyAgICAgIEZTdHJlYW0uV3JpdGUoIGJ1ZiwgMCwgbGVuICk7CisgICAgZW5kOworICAgIEZXcml0ZUJ1ZmZlci5DbGVhcjsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLklzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoRldyaXRlQnVmZmVyIDw+IG5pbCkKKyAgICAgICAgYW5kIChGUmVhZEJ1ZmZlciA8PiBuaWwpCisgICAgICAgIGFuZCAoRlN0cmVhbSA8PiBuaWwpCisgICAgICAgIGFuZCBGU3RyZWFtLklzT3BlbjsKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuT3BlbjsKK2JlZ2luCisgIEZTdHJlYW0uT3BlbjsKK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgblJlYWQgOiBJbnRlZ2VyOworICB0ZW1wYnVmIDogVEJ5dGVzOworICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIFJlc3VsdCA6PSAwOworCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgd2hpbGUgY291bnQgPiAwIGRvIGJlZ2luCisKKyAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uID49IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgorICAgICAgICBGUmVhZEJ1ZmZlci5DbGVhcjsKKyAgICAgICAgU2V0TGVuZ3RoKCB0ZW1wYnVmLCBGQnVmU2l6ZSk7CisgICAgICAgIG5SZWFkIDo9IEZTdHJlYW0uUmVhZCggdGVtcGJ1ZiwgMCwgRkJ1ZlNpemUgKTsKKyAgICAgICAgaWYgblJlYWQgPSAwIHRoZW4gQnJlYWs7IC8vIGF2b2lkIGluZmluaXRlIGxvb3AKKworICAgICAgICBGUmVhZEJ1ZmZlci5Xcml0ZUJ1ZmZlciggUG9pbnRlcihAdGVtcGJ1ZlswXSleLCBuUmVhZCApOworICAgICAgICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworICAgICAgZW5kOworCisgICAgICBpZiBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA8IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgorICAgICAgICBuUmVhZCA6PSBNaW4oIEZSZWFkQnVmZmVyLlNpemUgLSBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiwgY291bnQpOworICAgICAgICBwVG1wICA6PSBwQnVmOworICAgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICAgIEluYyggUmVzdWx0LCBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgblJlYWQpKTsKKyAgICAgICAgRGVjKCBjb3VudCwgblJlYWQpOworICAgICAgICBJbmMoIG9mZnNldCwgblJlYWQpOworICAgICAgZW5kOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBsZW4gOj0gRlJlYWRCdWZmZXIuU2l6ZTsKKyAgZW5kOworCisgIFNldExlbmd0aCggUmVzdWx0LCBsZW4pOworCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDo9IDA7CisgICAgRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgICBwVG1wIDo9IHBCdWY7CisgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIHBUbXBeLCBjb3VudCApOworICAgICAgaWYgRldyaXRlQnVmZmVyLlNpemUgPiBGQnVmU2l6ZSB0aGVuIGJlZ2luCisgICAgICAgIEZsdXNoOworICAgICAgZW5kOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCit7IFRTdHJlYW1UcmFuc3BvcnRJbXBsIH0KKworY29uc3RydWN0b3IgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOyBjb25zdCBBT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGSW5wdXRTdHJlYW0gOj0gQUlucHV0U3RyZWFtOworICBGT3V0cHV0U3RyZWFtIDo9IEFPdXRwdXRTdHJlYW07CitlbmQ7CisKK2Rlc3RydWN0b3IgVFN0cmVhbVRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbScgKTsKKyAgZW5kOworCisgIEZPdXRwdXRTdHJlYW0uRmx1c2g7CitlbmQ7CisKK2Z1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkdldElucHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbTsKK2VuZDsKKworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IFRydWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkdldE91dHB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGT3V0cHV0U3RyZWFtOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuT3BlbjsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0nICk7CisgIGVuZDsKKworICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIHBCdWYsYnVmbGVuLCBvZmYsIGxlbiApOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOworYmVnaW4KKyAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3Qgd3JpdGUgdG8gbnVsbCBvdXRwdXRzdHJlYW0nICk7CisgIGVuZDsKKworICBGT3V0cHV0U3RyZWFtLldyaXRlKCBwQnVmLCBvZmYsIGxlbiApOworZW5kOworCit7IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwgfQorCitjb25zdHJ1Y3RvciBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zcG9ydDogSVN0cmVhbVRyYW5zcG9ydCk7CitiZWdpbgorICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBBVHJhbnNwb3J0LCAxMDI0ICk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJU3RyZWFtVHJhbnNwb3J0OyAgQUJ1ZlNpemU6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRyYW5zcG9ydCA6PSBBVHJhbnNwb3J0OworICBGQnVmU2l6ZSA6PSBBQnVmU2l6ZTsKKyAgSW5pdEJ1ZmZlcnM7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRlRyYW5zcG9ydC5DbG9zZTsKKyAgRklucHV0QnVmZmVyIDo9IG5pbDsKKyAgRk91dHB1dEJ1ZmZlciA6PSBuaWw7ICAKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGT3V0cHV0QnVmZmVyIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgRk91dHB1dEJ1ZmZlci5GbHVzaDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnNwb3J0LklzT3BlbjsKK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5HZXRVbmRlcmx5aW5nVHJhbnNwb3J0OiBJVHJhbnNwb3J0OworYmVnaW4KKyAgUmVzdWx0IDo9IEZUcmFuc3BvcnQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkluaXRCdWZmZXJzOworYmVnaW4KKyAgaWYgRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgIEZJbnB1dEJ1ZmZlciA6PSBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSwgRkJ1ZlNpemUgKTsKKyAgZW5kOworICBpZiBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgIEZPdXRwdXRCdWZmZXIgOj0gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQuT3V0cHV0U3RyZWFtLCBGQnVmU2l6ZSApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLk9wZW47CitiZWdpbgorICBGVHJhbnNwb3J0Lk9wZW47CisgIEluaXRCdWZmZXJzOyAgLy8gd2UgbmVlZCB0byBnZXQgdGhlIGJ1ZmZlcnMgdG8gbWF0Y2ggRlRyYW5zcG9ydCBzdWJzdHJlYW1zIGFnYWluCitlbmQ7CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAwOworICBpZiBGSW5wdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBSZXN1bHQgOj0gRklucHV0QnVmZmVyLlJlYWQoIHBCdWYsYnVmbGVuLCBvZmYsIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBwQnVmLCBvZmYsIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3sgVEZyYW1lZFRyYW5zcG9ydEltcGwgfQorCit7JElGREVGIEhBVkVfQ0xBU1NfQ1RPUn0KK2NsYXNzIGNvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIFNldExlbmd0aCggRkhlYWRlcl9EdW1teSwgRkhlYWRlclNpemUpOworICBGaWxsQ2hhciggRkhlYWRlcl9EdW1teVswXSwgTGVuZ3RoKCBGSGVhZGVyX0R1bW15KSAqIFNpemVPZiggQnl0ZSApLCAwKTsKK2VuZDsKK3skRUxTRX0KK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbF9Jbml0aWFsaXplOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15LCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyU2l6ZSk7CisgIEZpbGxDaGFyKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15WzBdLAorICAgIExlbmd0aCggVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7CitlbmQ7Cit7JEVORElGfQorCitjb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBJbml0V3JpdGVCdWZmZXI7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZUcmFuc3BvcnQuQ2xvc2U7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEluaXRXcml0ZUJ1ZmZlcjsKKyAgRlRyYW5zcG9ydCA6PSBBVHJhbnM7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEZyYW1lZFRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIEZXcml0ZUJ1ZmZlci5GcmVlOworICBGUmVhZEJ1ZmZlci5GcmVlOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5GbHVzaDsKK3ZhcgorICBidWYgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CisgIGRhdGFfbGVuIDogSW50ZWdlcjsKKworYmVnaW4KKyAgbGVuIDo9IEZXcml0ZUJ1ZmZlci5TaXplOworICBTZXRMZW5ndGgoIGJ1ZiwgbGVuKTsKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgU3lzdGVtLk1vdmUoIEZXcml0ZUJ1ZmZlci5NZW1vcnleLCBidWZbMF0sIGxlbiApOworICBlbmQ7CisKKyAgZGF0YV9sZW4gOj0gbGVuIC0gRkhlYWRlclNpemU7CisgIGlmIChkYXRhX2xlbiA8IDApIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1RGcmFtZWRUcmFuc3BvcnQuRmx1c2g6IGRhdGFfbGVuIDwgMCcgKTsKKyAgZW5kOworCisgIEluaXRXcml0ZUJ1ZmZlcjsKKworICBidWZbMF0gOj0gQnl0ZSgkRkYgYW5kIChkYXRhX2xlbiBzaHIgMjQpKTsKKyAgYnVmWzFdIDo9IEJ5dGUoJEZGIGFuZCAoZGF0YV9sZW4gc2hyIDE2KSk7CisgIGJ1ZlsyXSA6PSBCeXRlKCRGRiBhbmQgKGRhdGFfbGVuIHNociA4KSk7CisgIGJ1ZlszXSA6PSBCeXRlKCRGRiBhbmQgZGF0YV9sZW4pOworCisgIEZUcmFuc3BvcnQuV3JpdGUoIGJ1ZiwgMCwgbGVuICk7CisgIEZUcmFuc3BvcnQuRmx1c2g7CitlbmQ7CisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnNwb3J0LklzT3BlbjsKK2VuZDsKKwordHlwZQorICBUQWNjZXNzTWVtb3J5U3RyZWFtID0gY2xhc3MoVE1lbW9yeVN0cmVhbSkKKyAgZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuSW5pdFdyaXRlQnVmZmVyOworYmVnaW4KKyAgRldyaXRlQnVmZmVyLkZyZWU7CisgIEZXcml0ZUJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgVEFjY2Vzc01lbW9yeVN0cmVhbShGV3JpdGVCdWZmZXIpLkNhcGFjaXR5IDo9IDEwMjQ7CisgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggUG9pbnRlcihARkhlYWRlcl9EdW1teVswXSleLCBGSGVhZGVyU2l6ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5PcGVuOworYmVnaW4KKyAgRlRyYW5zcG9ydC5PcGVuOworZW5kOworCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIGxlbiA+IChidWZsZW4tb2ZmKQorICB0aGVuIGxlbiA6PSBidWZsZW4tb2ZmOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmYpOworCisgIGlmIChGUmVhZEJ1ZmZlciA8PiBuaWwpIGFuZCAobGVuID4gMCkgdGhlbiBiZWdpbgorICAgIHJlc3VsdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgbGVuKTsKKyAgICBpZiByZXN1bHQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIEV4aXQ7CisgICAgZW5kOworICBlbmQ7CisKKyAgUmVhZEZyYW1lOworICBpZiBsZW4gPiAwCisgIHRoZW4gUmVzdWx0IDo9IEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBsZW4pCisgIGVsc2UgUmVzdWx0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkRnJhbWU7Cit2YXIKKyAgaTMycmQgOiBUQnl0ZXM7CisgIHNpemUgOiBJbnRlZ2VyOworICBidWZmIDogVEJ5dGVzOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBpMzJyZCwgRkhlYWRlclNpemUgKTsKKyAgRlRyYW5zcG9ydC5SZWFkQWxsKCBpMzJyZCwgMCwgRkhlYWRlclNpemUpOworICBzaXplIDo9CisgICAgKChpMzJyZFswXSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgKChpMzJyZFsxXSBhbmQgJEZGKSBzaGwgMTYpIG9yCisgICAgKChpMzJyZFsyXSBhbmQgJEZGKSBzaGwgOCkgb3IKKyAgICAgKGkzMnJkWzNdIGFuZCAkRkYpOworICBTZXRMZW5ndGgoIGJ1ZmYsIHNpemUgKTsKKyAgRlRyYW5zcG9ydC5SZWFkQWxsKCBidWZmLCAwLCBzaXplICk7CisgIEZSZWFkQnVmZmVyLkZyZWU7CisgIEZSZWFkQnVmZmVyIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICBpZiBMZW5ndGgoYnVmZikgPiAwCisgIHRoZW4gRlJlYWRCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZbMF0pXiwgc2l6ZSApOworICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZik7CisKKyAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIHBUbXBeLCBsZW4gKTsKKyAgZW5kOworZW5kOworCit7IFRGcmFtZWRUcmFuc3BvcnQuVEZhY3RvcnkgfQorCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5URmFjdG9yeS5HZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7CitiZWdpbgorICBSZXN1bHQgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBBVHJhbnMgKTsKK2VuZDsKKworeyBUVGNwU29ja2V0U3RyZWFtSW1wbCB9CisKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DbG9zZTsKK2JlZ2luCisgIEZUY3BDbGllbnQuQ2xvc2U7CitlbmQ7CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRDdXN0b21JcENsaWVudDsgY29uc3QgYVRpbWVvdXQgOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUY3BDbGllbnQgOj0gQVRjcENsaWVudDsKKyAgRlRpbWVvdXQgOj0gYVRpbWVvdXQ7CitlbmQ7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRTb2NrZXQ7IGNvbnN0IGFUaW1lb3V0IDogTG9uZ3dvcmQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRjcENsaWVudCA6PSBBVGNwQ2xpZW50OworICBpZiBhVGltZW91dCA9IDAgdGhlbgorICAgIEZUY3BDbGllbnQuUmVjdlRpbWVvdXQgOj0gU0xFRVBfVElNRQorICBlbHNlCisgICAgRlRjcENsaWVudC5SZWN2VGltZW91dCA6PSBhVGltZW91dDsKKyAgRlRjcENsaWVudC5TZW5kVGltZW91dCA6PSBhVGltZW91dDsKK2VuZDsKK3skRU5ESUZ9CisKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5GbHVzaDsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuSXNPcGVuOiBCb29sZWFuOworYmVnaW4KK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIFJlc3VsdCA6PSBGVGNwQ2xpZW50LkFjdGl2ZTsKK3skRUxTRX0KKyAgUmVzdWx0IDo9IEZUY3BDbGllbnQuSXNPcGVuOworeyRFTkRJRn0KK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLk9wZW47CitiZWdpbgorICBGVGNwQ2xpZW50Lk9wZW47CitlbmQ7CisKKworeyRJRkRFRiBPTERfU09DS0VUU30KK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlNlbGVjdCggUmVhZFJlYWR5LCBXcml0ZVJlYWR5LCBFeGNlcHRGbGFnOiBQQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZU91dDogSW50ZWdlcjsgdmFyIHdzYUVycm9yIDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgUmVhZEZkczogVEZEc2V0OworICBSZWFkRmRzcHRyOiBQRkRzZXQ7CisgIFdyaXRlRmRzOiBURkRzZXQ7CisgIFdyaXRlRmRzcHRyOiBQRkRzZXQ7CisgIEV4Y2VwdEZkczogVEZEc2V0OworICBFeGNlcHRGZHNwdHI6IFBGRHNldDsKKyAgdHY6IHRpbWV2YWw7CisgIFRpbWVwdHI6IFBUaW1ldmFsOworICBzb2NrZXQgOiBUU29ja2V0OworYmVnaW4KKyAgaWYgbm90IEZUY3BDbGllbnQuQWN0aXZlIHRoZW4gYmVnaW4KKyAgICB3c2FFcnJvciA6PSBXU0FFSU5WQUw7CisgICAgRXhpdCggU09DS0VUX0VSUk9SKTsKKyAgZW5kOworCisgIHNvY2tldCA6PSBGVGNwQ2xpZW50LkhhbmRsZTsKKworICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4gYmVnaW4KKyAgICBSZWFkRmRzcHRyIDo9IEBSZWFkRmRzOworICAgIEZEX1pFUk8oUmVhZEZkcyk7CisgICAgRkRfU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgUmVhZEZkc3B0ciA6PSBuaWw7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChXcml0ZVJlYWR5KSB0aGVuIGJlZ2luCisgICAgV3JpdGVGZHNwdHIgOj0gQFdyaXRlRmRzOworICAgIEZEX1pFUk8oV3JpdGVGZHMpOworICAgIEZEX1NFVChzb2NrZXQsIFdyaXRlRmRzKTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZUZkc3B0ciA6PSBuaWw7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChFeGNlcHRGbGFnKSB0aGVuIGJlZ2luCisgICAgRXhjZXB0RmRzcHRyIDo9IEBFeGNlcHRGZHM7CisgICAgRkRfWkVSTyhFeGNlcHRGZHMpOworICAgIEZEX1NFVChzb2NrZXQsIEV4Y2VwdEZkcyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRXhjZXB0RmRzcHRyIDo9IG5pbDsKKyAgZW5kOworCisgIGlmIFRpbWVPdXQgPj0gMCB0aGVuIGJlZ2luCisgICAgdHYudHZfc2VjIDo9IFRpbWVPdXQgZGl2IDEwMDA7CisgICAgdHYudHZfdXNlYyA6PSAgMTAwMCAqIChUaW1lT3V0IG1vZCAxMDAwKTsKKyAgICBUaW1lcHRyIDo9IEB0djsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBUaW1lcHRyIDo9IG5pbDsgIC8vIHdhaXQgZm9yZXZlcgorICBlbmQ7CisKKyAgd3NhRXJyb3IgOj0gMDsKKyAgdHJ5CisgICAgeyRJRkRFRiBNU1dJTkRPV1N9CisgICAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgICAgcmVzdWx0IDo9IFdpblNvY2suc2VsZWN0KCAgICAgICAgc29ja2V0ICsgMSwgUmVhZEZkc3B0ciwgV3JpdGVGZHNwdHIsIEV4Y2VwdEZkc3B0ciwgVGltZXB0cik7CisgICAgICB7JEVMU0V9CisgICAgICByZXN1bHQgOj0gV2luYXBpLldpblNvY2suc2VsZWN0KCBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICAgIHskRU5ESUZ9CisgICAgeyRFTkRJRn0KKyAgICB7JElGREVGIExJTlVYfQorICAgICAgcmVzdWx0IDo9IExpYmMuc2VsZWN0KCAgICAgICAgICAgc29ja2V0ICsgMSwgUmVhZEZkc3B0ciwgV3JpdGVGZHNwdHIsIEV4Y2VwdEZkc3B0ciwgVGltZXB0cik7CisgICAgeyRFTkRJRn0KKwkKKyAgICBpZiByZXN1bHQgPSBTT0NLRVRfRVJST1IKKyAgICB0aGVuIHdzYUVycm9yIDo9IFdTQUdldExhc3RFcnJvcjsKKworICBleGNlcHQKKyAgICByZXN1bHQgOj0gU09DS0VUX0VSUk9SOworICBlbmQ7CisKKyAgaWYgQXNzaWduZWQoUmVhZFJlYWR5KSB0aGVuCisgICBSZWFkUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgICAKKyAgaWYgQXNzaWduZWQoV3JpdGVSZWFkeSkgdGhlbgorICAgIFdyaXRlUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgV3JpdGVGZHMpOworICAKKyAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbgorICAgIEV4Y2VwdEZsYWdeIDo9IEZEX0lTU0VUKHNvY2tldCwgRXhjZXB0RmRzKTsKK2VuZDsKK3skRU5ESUZ9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5XYWl0Rm9yRGF0YSggVGltZU91dCA6IEludGVnZXI7IHBCdWYgOiBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWRCeXRlcyA6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yLCBieXRlc1JlYWR5IDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKK3ZhciBiQ2FuUmVhZCwgYkVycm9yIDogQm9vbGVhbjsKKyAgICByZXR2YWwgOiBJbnRlZ2VyOworY29uc3QgCisgIE1TR19QRUVLID0geyRJRkRFRiBPTERfVU5JVF9OQU1FU30gV2luU29jay5NU0dfUEVFSyAgeyRFTFNFfSBXaW5hcGkuV2luU29jay5NU0dfUEVFSyAgeyRFTkRJRn07CitiZWdpbgorICBieXRlc1JlYWR5IDo9IDA7CisKKyAgLy8gVGhlIHNlbGVjdCBmdW5jdGlvbiByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2Ygc29ja2V0IGhhbmRsZXMgdGhhdCBhcmUgcmVhZHkKKyAgLy8gYW5kIGNvbnRhaW5lZCBpbiB0aGUgZmRfc2V0IHN0cnVjdHVyZXMsIHplcm8gaWYgdGhlIHRpbWUgbGltaXQgZXhwaXJlZCwKKyAgLy8gb3IgU09DS0VUX0VSUk9SIGlmIGFuIGVycm9yIG9jY3VycmVkLiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIFNPQ0tFVF9FUlJPUiwKKyAgLy8gV1NBR2V0TGFzdEVycm9yIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgZXJyb3IgY29kZS4KKyAgcmV0dmFsIDo9IFNlbGYuU2VsZWN0KCBAYkNhblJlYWQsIG5pbCwgQGJFcnJvciwgVGltZU91dCwgd3NhRXJyb3IpOworICBpZiByZXR2YWwgPSBTT0NLRVRfRVJST1IKKyAgdGhlbiBFeGl0KCBUV2FpdEZvckRhdGEud2ZkX0Vycm9yKTsKKyAgaWYgKHJldHZhbCA9IDApIG9yIG5vdCBiQ2FuUmVhZAorICB0aGVuIEV4aXQoIFRXYWl0Rm9yRGF0YS53ZmRfVGltZW91dCk7CisKKyAgLy8gcmVjdigpIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSAwIHdoZW4gdGhlIHBlZXIgaGFzIHBlcmZvcm1lZCBhbiBvcmRlcmx5IHNodXRkb3duLgorICAKKyAgcmV0dmFsIDo9IHJlY3YoIEZUY3BDbGllbnQuSGFuZGxlLCBwQnVmXiwgRGVzaXJlZEJ5dGVzLCBNU0dfUEVFSyk7CisgIGlmIHJldHZhbCA8PSAwCisgIHRoZW4gRXhpdCggVFdhaXRGb3JEYXRhLndmZF9FcnJvcik7CisKKyAgLy8gYXQgbGVhc3Qgd2UgaGF2ZSBzb21lIGRhdGEKKyAgYnl0ZXNSZWFkeSA6PSBNaW4oIHJldHZhbCwgRGVzaXJlZEJ5dGVzKTsKKyAgcmVzdWx0IDo9IFRXYWl0Rm9yRGF0YS53ZmRfSGF2ZURhdGE7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgordmFyIHdmZCA6IFRXYWl0Rm9yRGF0YTsKKyAgICB3c2FFcnJvciwKKyAgICBtc2VjcyA6IEludGVnZXI7CisgICAgbkJ5dGVzIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKKyAgaWYgRlRpbWVvdXQgPiAwCisgIHRoZW4gbXNlY3MgOj0gRlRpbWVvdXQKKyAgZWxzZSBtc2VjcyA6PSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworCisgIHJlc3VsdCA6PSAwOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKworICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICAgIHdmZCA6PSBXYWl0Rm9yRGF0YSggbXNlY3MsIHBUbXAsIGNvdW50LCB3c2FFcnJvciwgbkJ5dGVzKTsKKyAgICAgIGNhc2Ugd2ZkIG9mCisgICAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfRXJyb3IgICAgOiAgRXhpdDsKKyAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9IYXZlRGF0YSA6ICBCcmVhazsKKyAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9UaW1lb3V0ICA6ICBiZWdpbgorICAgICAgICAgIGlmIChGVGltZW91dCA9IDApCisgICAgICAgICAgdGhlbiBFeGl0CisgICAgICAgICAgZWxzZSBiZWdpbgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoQ2FyZGluYWwod3NhRXJyb3IpKSk7CisKKyAgICAgICAgICBlbmQ7CisgICAgICAgIGVuZDsKKyAgICAgIGVsc2UKKyAgICAgICAgQVNTRVJUKCBGQUxTRSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgLy8gcmVkdWNlIHRoZSB0aW1lb3V0IG9uY2Ugd2UgZ290IGRhdGEKKyAgICBpZiBGVGltZW91dCA+IDAKKyAgICB0aGVuIG1zZWNzIDo9IEZUaW1lb3V0IGRpdiAxMAorICAgIGVsc2UgbXNlY3MgOj0gREVGQVVMVF9USFJJRlRfVElNRU9VVCBkaXYgMTA7CisgICAgbXNlY3MgOj0gTWF4KCBtc2VjcywgMjAwKTsKKworICAgIEFTU0VSVCggbkJ5dGVzIDw9IGNvdW50KTsKKyAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWNlaXZlQnVmKCBwVG1wXiwgbkJ5dGVzKTsKKyAgICBJbmMoIHBUbXAsIG5CeXRlcyk7CisgICAgRGVjKCBjb3VudCwgbkJ5dGVzKTsKKyAgICBJbmMoIHJlc3VsdCwgbkJ5dGVzKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5Ub0FycmF5OiBUQnl0ZXM7CisvLyBvbGQgc29ja2V0cyB2ZXJzaW9uCit2YXIgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGxlbiA6PSAwOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGxlbiA6PSBGVGNwQ2xpZW50LkJ5dGVzUmVjZWl2ZWQ7CisgIGVuZDsKKworICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7CisKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgRlRjcENsaWVudC5SZWNlaXZlQnVmKCBQb2ludGVyKEBSZXN1bHRbMF0pXiwgbGVuKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKKy8vIG9sZCBzb2NrZXRzIHZlcnNpb24KK3ZhciBiQ2FuV3JpdGUsIGJFcnJvciA6IEJvb2xlYW47CisgICAgcmV0dmFsLCB3c2FFcnJvciA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIG5vdCBGVGNwQ2xpZW50LkFjdGl2ZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnbm90IG9wZW4nKTsKKworICAvLyBUaGUgc2VsZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzb2NrZXQgaGFuZGxlcyB0aGF0IGFyZSByZWFkeQorICAvLyBhbmQgY29udGFpbmVkIGluIHRoZSBmZF9zZXQgc3RydWN0dXJlcywgemVybyBpZiB0aGUgdGltZSBsaW1pdCBleHBpcmVkLAorICAvLyBvciBTT0NLRVRfRVJST1IgaWYgYW4gZXJyb3Igb2NjdXJyZWQuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgU09DS0VUX0VSUk9SLAorICAvLyBXU0FHZXRMYXN0RXJyb3IgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBzcGVjaWZpYyBlcnJvciBjb2RlLgorICByZXR2YWwgOj0gU2VsZi5TZWxlY3QoIG5pbCwgQGJDYW5Xcml0ZSwgQGJFcnJvciwgRlRpbWVPdXQsIHdzYUVycm9yKTsKKyAgaWYgcmV0dmFsID0gU09DS0VUX0VSUk9SCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKFN5c0Vycm9yTWVzc2FnZShDYXJkaW5hbCh3c2FFcnJvcikpKTsKKworICBpZiAocmV0dmFsID0gMCkKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCd0aW1lZCBvdXQnKTsKKworICBpZiBiRXJyb3Igb3Igbm90IGJDYW5Xcml0ZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgndW5rbm93biBlcnJvcicpOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICBGVGNwQ2xpZW50LlNlbmRCdWYoIHBUbXBeLCBjb3VudCk7CitlbmQ7CisKK3skRUxTRX0KKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gbmV3IHNvY2tldHMgdmVyc2lvbgordmFyIG5CeXRlcyA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIHJlc3VsdCA6PSAwOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKyAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWFkKCBwVG1wXiwgY291bnQpOworICAgIGlmIG5CeXRlcyA9IDAgdGhlbiBFeGl0OworICAgIEluYyggcFRtcCwgbkJ5dGVzKTsKKyAgICBEZWMoIGNvdW50LCBuQnl0ZXMpOworICAgIEluYyggcmVzdWx0LCBuQnl0ZXMpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKKy8vIG5ldyBzb2NrZXRzIHZlcnNpb24KK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisgIHRyeQorICAgIGlmIEZUY3BDbGllbnQuUGVlayB0aGVuCisgICAgICByZXBlYXQKKyAgICAgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgKyAxMDI0KTsKKyAgICAgICAgbGVuIDo9IEZUY3BDbGllbnQuUmVhZChSZXN1bHRbTGVuZ3RoKFJlc3VsdCkgLSAxMDI0XSwgMTAyNCk7CisgICAgICB1bnRpbCBsZW4gPCAxMDI0OworICBleGNlcHQKKyAgICBvbiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIGJlZ2luIHsgZG9uJ3QgYWxsb3cgZGVmYXVsdCBleGNlcHRpb25zIH0gZW5kOworICAgIGVsc2UgcmFpc2U7CisgIGVuZDsKKyAgaWYgbGVuID4gMCB0aGVuCisgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgLSAxMDI0ICsgbGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CisvLyBuZXcgc29ja2V0cyB2ZXJzaW9uCit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIG5vdCBGVGNwQ2xpZW50LklzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnbm90IG9wZW4nKTsKKworICBwVG1wIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgRlRjcENsaWVudC5Xcml0ZSggcFRtcF4sIGNvdW50KTsKK2VuZDsKKworeyRFTkRJRn0KKworCit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9Citpbml0aWFsaXphdGlvbgorYmVnaW4KKyAgVEZyYW1lZFRyYW5zcG9ydEltcGxfSW5pdGlhbGl6ZTsKK2VuZDsKK3skSUZFTkR9CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMThlOTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMKQEAgLTAsMCArMSw5NSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5UeXBlUmVnaXN0cnk7CisKK2ludGVyZmFjZQorCit1c2VzCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBUeXBJbmZvLAorICBUaHJpZnQuUHJvdG9jb2w7CisKK3R5cGUKKyAgVEZhY3RvcnlNZXRob2Q8VD4gPSBmdW5jdGlvbjpUOworCisgIFR5cGVSZWdpc3RyeSA9IGNsYXNzCisgIHByaXZhdGUKKyAgICBjbGFzcyB2YXIgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwIDogVERpY3Rpb25hcnk8UG9pbnRlciwgUG9pbnRlcj47CisgIHB1YmxpYworICAgIGNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBjbGFzcyBkZXN0cnVjdG9yIERlc3Ryb3k7CisgICAgY2xhc3MgcHJvY2VkdXJlIFJlZ2lzdGVyVHlwZUZhY3Rvcnk8Rj4oY29uc3QgYUZhY3RvcnlNZXRob2Q6IFRGYWN0b3J5TWV0aG9kPEY+KTsKKyAgICBjbGFzcyBmdW5jdGlvbiAgQ29uc3RydWN0PEY+OiBGOworICAgIGNsYXNzIGZ1bmN0aW9uICBDb25zdHJ1Y3RGcm9tVHlwZUluZm8oY29uc3QgYVR5cGVJbmZvOiBQVHlwZUluZm8pOiBJQmFzZTsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCisKK3sgVHlwZVJlZ2lzdHJhdGlvbiB9CisKK2NsYXNzIGNvbnN0cnVjdG9yIFR5cGVSZWdpc3RyeS5DcmVhdGU7CitiZWdpbgorICBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAgOj0gVERpY3Rpb25hcnk8UG9pbnRlciwgUG9pbnRlcj4uQ3JlYXRlOworZW5kOworCitjbGFzcyBkZXN0cnVjdG9yIFR5cGVSZWdpc3RyeS5EZXN0cm95OworYmVnaW4KKyAgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwLkZyZWU7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUeXBlUmVnaXN0cnkuUmVnaXN0ZXJUeXBlRmFjdG9yeTxGPihjb25zdCBhRmFjdG9yeU1ldGhvZDogVEZhY3RvcnlNZXRob2Q8Rj4pOwordmFyCisgIFR5cGVJbmZvICAgICA6IFBvaW50ZXI7CitiZWdpbgorICBUeXBlSW5mbyA6PSBTeXN0ZW0uVHlwZUluZm8oRik7CisKKyAgaWYgKFR5cGVJbmZvIDw+IG5pbCkgYW5kIChQVHlwZUluZm8oVHlwZUluZm8pLktpbmQgPSB0a0ludGVyZmFjZSkKKyAgdGhlbiBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAuQWRkT3JTZXRWYWx1ZShUeXBlSW5mbywgQGFGYWN0b3J5TWV0aG9kKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVHlwZVJlZ2lzdHJ5LkNvbnN0cnVjdDxGPjogRjsKK3ZhcgorICBUeXBlSW5mbyAgICAgOiBQVHlwZUluZm87CisgIEZhY3RvcnkgICAgICA6IFBvaW50ZXI7CitiZWdpbgorICBSZXN1bHQgOj0gZGVmYXVsdChGKTsKKworICBUeXBlSW5mbyA6PSBTeXN0ZW0uVHlwZUluZm8oRik7CisKKyAgaWYgQXNzaWduZWQoVHlwZUluZm8pIGFuZCAoVHlwZUluZm8uS2luZCA9IHRrSW50ZXJmYWNlKQorICB0aGVuIGJlZ2luCisgICAgaWYgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwLlRyeUdldFZhbHVlKFR5cGVJbmZvLCBGYWN0b3J5KQorICAgIHRoZW4gUmVzdWx0IDo9IFRGYWN0b3J5TWV0aG9kPEY+KEZhY3RvcnkpKCk7CisgIGVuZDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVHlwZVJlZ2lzdHJ5LkNvbnN0cnVjdEZyb21UeXBlSW5mbyhjb25zdCBhVHlwZUluZm86IFBUeXBlSW5mbyk6IElCYXNlOwordmFyCisgIEZhY3RvcnkgICAgICA6IFBvaW50ZXI7CitiZWdpbgorICBSZXN1bHQgOj0gbmlsOworICBpZiBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAuVHJ5R2V0VmFsdWUoYVR5cGVJbmZvLCBGYWN0b3J5KQorICB0aGVuIFJlc3VsdCA6PSBJQmFzZShURmFjdG9yeU1ldGhvZDxJQmFzZT4oRmFjdG9yeSkoKSk7CitlbmQ7CisKKworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNTc4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzCkBAIC0wLDAgKzEsMjU5IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlV0aWxzOworCitpbnRlcmZhY2UKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KKwordXNlcworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgQ2hhcmFjdGVyLCBTeW5jT2JqczsKKyAgeyRFTFNFfQorICBTeXN0ZW0uQ2xhc3NlcywgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywgU3lzdGVtLkNoYXJhY3RlciwgU3lzdGVtLlN5bmNPYmpzOworICB7JEVORElGfQorCit0eXBlCisgIElPdmVybGFwcGVkSGVscGVyID0gaW50ZXJmYWNlCisgICAgWyd7QTE4MzJFRkEtMkUwMi00ODg0LThGMDktRjBBMDI3NzE1N0ZBfSddCisgICAgZnVuY3Rpb24gT3ZlcmxhcHBlZCA6IFRPdmVybGFwcGVkOworICAgIGZ1bmN0aW9uIE92ZXJsYXBwZWRQdHIgOiBQT3ZlcmxhcHBlZDsKKyAgICBmdW5jdGlvbiBXYWl0SGFuZGxlIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBXYWl0Rm9yKGR3VGltZW91dDogRFdPUkQpIDogRFdPUkQ7CisgIGVuZDsKKworICBUT3ZlcmxhcHBlZEhlbHBlckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElPdmVybGFwcGVkSGVscGVyKQorICBzdHJpY3QgcHJvdGVjdGVkCisgICAgRk92ZXJsYXBwZWQgOiBUT3ZlcmxhcHBlZDsKKyAgICBGRXZlbnQgICAgICA6IFRFdmVudDsKKworICAgIC8vIElPdmVybGFwcGVkSGVscGVyCisgICAgZnVuY3Rpb24gT3ZlcmxhcHBlZCA6IFRPdmVybGFwcGVkOworICAgIGZ1bmN0aW9uIE92ZXJsYXBwZWRQdHIgOiBQT3ZlcmxhcHBlZDsKKyAgICBmdW5jdGlvbiBXYWl0SGFuZGxlIDogVEhhbmRsZTsKKyAgICBmdW5jdGlvbiBXYWl0Rm9yKGR3VGltZW91dDogRFdPUkQpIDogRFdPUkQ7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgZW5kOworCisKKyAgQmFzZTY0VXRpbHMgPSBjbGFzcyBzZWFsZWQKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gRW5jb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBEZWNvZGUoIGNvbnN0IHNyYyA6IFRCeXRlczsgc3JjT2ZmLCBsZW4gOiBJbnRlZ2VyOyBkc3QgOiBUQnl0ZXM7IGRzdE9mZiA6IEludGVnZXIpIDogSW50ZWdlcjsgc3RhdGljOworICBlbmQ7CisKKworICBDaGFyVXRpbHMgPSBjbGFzcyBzZWFsZWQKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gSXNIaWdoU3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOyBzdGF0aWM7IGlubGluZTsKKyAgICBjbGFzcyBmdW5jdGlvbiBJc0xvd1N1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsgc3RhdGljOyBpbmxpbmU7CisgIGVuZDsKKworCit7JElGREVGIFdpbjY0fQorZnVuY3Rpb24gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCB2YXIgQWRkZW5kIDogSW50NjQ7IFZhbHVlIDogSW50NjQpIDogSW50NjQ7ICAKK3skRU5ESUZ9CisKKworaW1wbGVtZW50YXRpb24KKworeyBUT3ZlcmxhcHBlZEhlbHBlckltcGwgfQorCitjb25zdHJ1Y3RvciBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRmlsbENoYXIoIEZPdmVybGFwcGVkLCBTaXplT2YoRk92ZXJsYXBwZWQpLCAwKTsKKyAgRkV2ZW50IDo9IFRFdmVudC5DcmVhdGUoIG5pbCwgVFJVRSwgRkFMU0UsICcnKTsgIC8vIGFsd2F5cyBNYW51YWxSZXNldCwgc2VlIE1TRE4KKyAgRk92ZXJsYXBwZWQuaEV2ZW50IDo9IEZFdmVudC5IYW5kbGU7CitlbmQ7CisKKworCitkZXN0cnVjdG9yIFRPdmVybGFwcGVkSGVscGVySW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRk92ZXJsYXBwZWQuaEV2ZW50IDo9IDA7CisgICAgRnJlZUFuZE5pbCggRkV2ZW50KTsKKworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKKworZW5kOworCisKK2Z1bmN0aW9uIFRPdmVybGFwcGVkSGVscGVySW1wbC5PdmVybGFwcGVkIDogVE92ZXJsYXBwZWQ7CitiZWdpbgorICByZXN1bHQgOj0gRk92ZXJsYXBwZWQ7CitlbmQ7CisKKworZnVuY3Rpb24gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLk92ZXJsYXBwZWRQdHIgOiBQT3ZlcmxhcHBlZDsKK2JlZ2luCisgIHJlc3VsdCA6PSBARk92ZXJsYXBwZWQ7CitlbmQ7CisKKworZnVuY3Rpb24gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLldhaXRIYW5kbGUgOiBUSGFuZGxlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZPdmVybGFwcGVkLmhFdmVudDsKK2VuZDsKKworCitmdW5jdGlvbiBUT3ZlcmxhcHBlZEhlbHBlckltcGwuV2FpdEZvciggZHdUaW1lb3V0IDogRFdPUkQpIDogRFdPUkQ7CitiZWdpbgorICByZXN1bHQgOj0gV2FpdEZvclNpbmdsZU9iamVjdCggRk92ZXJsYXBwZWQuaEV2ZW50LCBkd1RpbWVvdXQpOworZW5kOworCisKK3sgQmFzZTY0VXRpbHMgfQorCitjbGFzcyBmdW5jdGlvbiBCYXNlNjRVdGlscy5FbmNvZGUoIGNvbnN0IHNyYyA6IFRCeXRlczsgc3JjT2ZmLCBsZW4gOiBJbnRlZ2VyOyBkc3QgOiBUQnl0ZXM7IGRzdE9mZiA6IEludGVnZXIpIDogSW50ZWdlcjsKK2NvbnN0IEVOQ09ERV9UQUJMRSA6IFBBbnNpQ2hhciA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJzsKK2JlZ2luCisgIEFTU0VSVCggbGVuIGluIFsxLi4zXSk7CisgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKHNyY1tzcmNPZmZdIHNociAyKSBhbmQgJDNGXSk7CisgIGNhc2UgbGVuIG9mCisgICAgMyA6IGJlZ2luCisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKChzcmNbc3JjT2ZmXSBzaGwgNCkgYW5kICQzMCkgb3IgKChzcmNbc3JjT2ZmICsgMV0gc2hyIDQpIGFuZCAkMEYpXSk7CisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKChzcmNbc3JjT2ZmICsgMV0gc2hsIDIpIGFuZCAkM0MpIG9yICgoc3JjW3NyY09mZiArIDJdIHNociA2KSBhbmQgJDAzKV0pOworICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbIHNyY1tzcmNPZmYgKyAyXSBhbmQgJDNGXSk7CisgICAgICByZXN1bHQgOj0gNDsKKyAgICBlbmQ7CisKKyAgICAyIDogYmVnaW4KKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyAoKHNyY1tzcmNPZmZdIHNobCA0KSBhbmQgJDMwKSBvciAoKHNyY1tzcmNPZmYgKyAxXSBzaHIgNCkgYW5kICQwRildKTsKKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyAoc3JjW3NyY09mZiArIDFdIHNobCAyKSBhbmQgJDNDXSk7CisgICAgICByZXN1bHQgOj0gMzsKKyAgICBlbmQ7CisKKyAgICAxIDogYmVnaW4KKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyAoc3JjW3NyY09mZl0gc2hsIDQpIGFuZCAkMzBdKTsKKyAgICAgIHJlc3VsdCA6PSAyOworICAgIGVuZDsKKworICBlbHNlCisgICAgQVNTRVJUKCBGQUxTRSk7CisgICAgcmVzdWx0IDo9IDA7ICAvLyBiZWNhdXNlIGludmFsaWQgY2FsbAorICBlbmQ7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gQmFzZTY0VXRpbHMuRGVjb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7Citjb25zdCBERUNPREVfVEFCTEUgOiBhcnJheVswLi4kRkZdIG9mIEludGVnZXIKKyAgICAgICAgICAgICAgICAgICA9ICggLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSw2MiwtMSwtMSwtMSw2MywKKyAgICAgICAgICAgICAgICAgICAgICAgNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LDEwLDExLDEyLDEzLDE0LAorICAgICAgICAgICAgICAgICAgICAgICAxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsCisgICAgICAgICAgICAgICAgICAgICAgIDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEgICk7CitiZWdpbgorICBBU1NFUlQoIGxlbiBpbiBbMS4uNF0pOworICByZXN1bHQgOj0gMTsKKyAgZHN0W2RzdE9mZl0gOj0gKChERUNPREVfVEFCTEVbc3JjW3NyY09mZl0gICAgIGFuZCAkMEZGXSBzaGwgMikKKyAgICAgICAgICAgICAgb3IgIChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdIGFuZCAkMEZGXSBzaHIgNCkpOworCisgIGlmIChsZW4gPiAyKSB0aGVuIGJlZ2luCisgICAgSW5jKCByZXN1bHQpOworICAgIEluYyggZHN0T2ZmKTsKKyAgICBkc3RbZHN0T2ZmXSA6PSAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdIGFuZCAkMEZGXSBzaGwgNCkgYW5kICRGMCkKKyAgICAgICAgICAgICAgICBvciAgIChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdIGFuZCAkMEZGXSBzaHIgMikpOworCisgICAgaWYgKGxlbiA+IDMpIHRoZW4gYmVnaW4KKyAgICAgIEluYyggcmVzdWx0KTsKKyAgICAgIEluYyggZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9ICgoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gYW5kICQwRkZdIHNobCA2KSBhbmQgJEMwKQorICAgICAgICAgICAgICAgICAgb3IgICAgREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAzXSBhbmQgJDBGRl0pOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIENoYXJVdGlscy5Jc0hpZ2hTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47CitiZWdpbgorICB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDI1LjB9CisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gQ2hhcmFjdGVyLklzSGlnaFN1cnJvZ2F0ZShjKTsKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFN5c3RlbS5DaGFyYWN0ZXIuSXNIaWdoU3Vycm9nYXRlKGMpOworICAgIHskRU5ESUZ9CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IGMuSXNIaWdoU3Vycm9nYXRlKCk7CisgIHskSUZFTkR9CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gQ2hhclV0aWxzLklzTG93U3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOworYmVnaW4KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPCAyNS4wfQorICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgcmVzdWx0IDo9IENoYXJhY3Rlci5Jc0xvd1N1cnJvZ2F0ZShjKTsKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFN5c3RlbS5DaGFyYWN0ZXIuSXNMb3dTdXJyb2dhdGUoYyk7CisgICAgeyRFTkRJRn0KKyAgeyRFTFNFfQorICByZXN1bHQgOj0gYy5Jc0xvd1N1cnJvZ2F0ZSgpOworICB7JElGRU5EfQorZW5kOworCisKK3skSUZERUYgV2luNjR9CisKK2Z1bmN0aW9uIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIHZhciBUYXJnZXQgOiBJbnQ2NDsgRXhjaGFuZ2UsIENvbXBhcmFuZCA6IEludDY0KSA6IEludDY0OyAgaW5saW5lOworYmVnaW4KKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgcmVzdWx0IDo9IFdpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTFNFfQorICByZXN1bHQgOj0gV2luQXBpLldpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTkRJRn0KK2VuZDsKKworCitmdW5jdGlvbiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIHZhciBBZGRlbmQgOiBJbnQ2NDsgVmFsdWUgOiBJbnQ2NCkgOiBJbnQ2NDsKK3ZhciBvbGQgOiBJbnQ2NDsKK2JlZ2luCisgIHJlcGVhdAorICAgIE9sZCA6PSBBZGRlbmQ7CisgIHVudGlsIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCBBZGRlbmQsIE9sZCArIFZhbHVlLCBPbGQpID0gT2xkKTsKKyAgcmVzdWx0IDo9IE9sZDsKK2VuZDsKKworeyRFTkRJRn0KKworCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ4MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcwpAQCAtMCwwICsxLDIzOSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdDsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5Qcm90b2NvbDsKKworY29uc3QKKyAgVmVyc2lvbiA9ICcxLjAuMCc7CisKK3R5cGUKKyAgVEV4Y2VwdGlvbiA9IFRocmlmdC5FeGNlcHRpb24uVEV4Y2VwdGlvbjsgLy8gY29tcGF0aWJpbGl0eSBhbGlhcworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3MgPSBjbGFzcyBvZiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZDsKKworICBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgdHlwZQoreyRTQ09QRURFTlVNUyBPTn0KKyAgICAgIFRFeGNlcHRpb25UeXBlID0gKAorICAgICAgICBVbmtub3duLAorICAgICAgICBVbmtub3duTWV0aG9kLAorICAgICAgICBJbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgIFdyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgQmFkU2VxdWVuY2VJRCwKKyAgICAgICAgTWlzc2luZ1Jlc3VsdCwKKyAgICAgICAgSW50ZXJuYWxFcnJvciwKKyAgICAgICAgUHJvdG9jb2xFcnJvciwKKyAgICAgICAgSW52YWxpZFRyYW5zZm9ybSwKKyAgICAgICAgSW52YWxpZFByb3RvY29sLAorICAgICAgICBVbnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAgICk7Cit7JFNDT1BFREVOVU1TIE9GRn0KKyAgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRFeGNlcHRpb25UeXBlOworICBwcm90ZWN0ZWQKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworICBwdWJsaWMKKyAgICAvLyBwdXJwb3NlZnVsbHkgaGlkZSBpbmhlcml0ZWQgY29uc3RydWN0b3IKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworCisgICAgY2xhc3MgZnVuY3Rpb24gR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CisKKyAgICBjbGFzcyBmdW5jdGlvbiBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCApOworICBlbmQ7CisKKyAgLy8gTmVlZGVkIHRvIHJlbW92ZSBkZXByZWNhdGlvbiB3YXJuaW5nCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkID0gY2xhc3MgYWJzdHJhY3QgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgZW5kOworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd24gPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uV3JvbmdNZXRob2ROYW1lID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uQmFkU2VxdWVuY2VJRCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uUHJvdG9jb2xFcnJvciA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRUcmFuc2Zvcm0gPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25VbnN1cHBvcnRlZENsaWVudFR5cGUgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIH0KKworZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkdldFR5cGU6IFRFeGNlcHRpb25UeXBlOworYmVnaW4KKyAgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGUKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbldyb25nTWV0aG9kTmFtZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Xcm9uZ01ldGhvZE5hbWUKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkJhZFNlcXVlbmNlSUQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuQmFkU2VxdWVuY2VJRAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0CisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3RvY29sRXJyb3IgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuUHJvdG9jb2xFcnJvcgorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFRyYW5zZm9ybSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnZhbGlkVHJhbnNmb3JtCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25VbnN1cHBvcnRlZENsaWVudFR5cGUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgIGVsc2UgUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd24uQ3JlYXRlKE1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnJyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgT0ZGfQorICBSZXN1bHQgOj0gQ3JlYXRlKEFUeXBlLCAnJyk7Cit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgREVGQVVMVH0KK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUoQVR5cGUpLkNyZWF0ZShtc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CitiZWdpbgorICBjYXNlIEFUeXBlIG9mCisgICAgVEV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZDogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZDsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGU6ICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGU7CisgICAgVEV4Y2VwdGlvblR5cGUuV3JvbmdNZXRob2ROYW1lOiAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uV3JvbmdNZXRob2ROYW1lOworICAgIFRFeGNlcHRpb25UeXBlLkJhZFNlcXVlbmNlSUQ6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkJhZFNlcXVlbmNlSUQ7CisgICAgVEV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdDogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdDsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yOworICAgIFRFeGNlcHRpb25UeXBlLlByb3RvY29sRXJyb3I6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3RvY29sRXJyb3I7CisgICAgVEV4Y2VwdGlvblR5cGUuSW52YWxpZFRyYW5zZm9ybTogICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFRyYW5zZm9ybTsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnZhbGlkUHJvdG9jb2w6ICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2w7CisgICAgVEV4Y2VwdGlvblR5cGUuVW5zdXBwb3J0ZWRDbGllbnRUeXBlOiBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5zdXBwb3J0ZWRDbGllbnRUeXBlOworICBlbHNlCisgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd247CisgIGVuZDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOiBUQXBwbGljYXRpb25FeGNlcHRpb247Cit2YXIKKyAgZmllbGQgOiBUVGhyaWZ0RmllbGQ7CisgIG1zZyA6IHN0cmluZzsKKyAgdHlwIDogVEV4Y2VwdGlvblR5cGU7CisgIHN0cnVjIDogVFRocmlmdFN0cnVjdDsKK2JlZ2luCisgIG1zZyA6PSAnJzsKKyAgdHlwIDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CisgIHN0cnVjIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbjsKKyAgd2hpbGUgKCBUcnVlICkgZG8KKyAgYmVnaW4KKyAgICBmaWVsZCA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbjsKKyAgICBpZiAoIGZpZWxkLlR5cGVfID0gVFR5cGUuU3RvcCkgdGhlbgorICAgIGJlZ2luCisgICAgICBCcmVhazsKKyAgICBlbmQ7CisKKyAgICBjYXNlIGZpZWxkLklkIG9mCisgICAgICAxIDogYmVnaW4KKyAgICAgICAgaWYgKCBmaWVsZC5UeXBlXyA9IFRUeXBlLlN0cmluZ18pIHRoZW4KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBtc2cgOj0gaXByb3QuUmVhZFN0cmluZzsKKyAgICAgICAgZW5kIGVsc2UKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoIGlwcm90LCBmaWVsZC5UeXBlXyApOworICAgICAgICBlbmQ7CisgICAgICBlbmQ7CisKKyAgICAgIDIgOiBiZWdpbgorICAgICAgICBpZiAoIGZpZWxkLlR5cGVfID0gVFR5cGUuSTMyKSB0aGVuCisgICAgICAgIGJlZ2luCisgICAgICAgICAgdHlwIDo9IFRFeGNlcHRpb25UeXBlKCBpcHJvdC5SZWFkSTMyICk7CisgICAgICAgIGVuZCBlbHNlCisgICAgICAgIGJlZ2luCisgICAgICAgICAgVFByb3RvY29sVXRpbC5Ta2lwKCBpcHJvdCwgZmllbGQuVHlwZV8gKTsKKyAgICAgICAgZW5kOworICAgICAgZW5kIGVsc2UKKyAgICAgIGJlZ2luCisgICAgICAgIFRQcm90b2NvbFV0aWwuU2tpcCggaXByb3QsIGZpZWxkLlR5cGVfKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisgICAgaXByb3QuUmVhZEZpZWxkRW5kOworICBlbmQ7CisgIGlwcm90LlJlYWRTdHJ1Y3RFbmQ7CisgIFJlc3VsdCA6PSBHZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUodHlwKS5DcmVhdGUobXNnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7Cit2YXIKKyAgc3RydWMgOiBUVGhyaWZ0U3RydWN0OworICBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKK2JlZ2luCisgIEluaXQoc3RydWMsICdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKyAgSW5pdChmaWVsZCk7CisKKyAgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbiggc3RydWMgKTsKKyAgaWYgTWVzc2FnZSA8PiAnJyB0aGVuCisgIGJlZ2luCisgICAgZmllbGQuTmFtZSA6PSAnbWVzc2FnZSc7CisgICAgZmllbGQuVHlwZV8gOj0gVFR5cGUuU3RyaW5nXzsKKyAgICBmaWVsZC5JZCA6PSAxOworICAgIG9wcm90LldyaXRlRmllbGRCZWdpbiggZmllbGQgKTsKKyAgICBvcHJvdC5Xcml0ZVN0cmluZyggTWVzc2FnZSApOworICAgIG9wcm90LldyaXRlRmllbGRFbmQ7CisgIGVuZDsKKworICBmaWVsZC5OYW1lIDo9ICd0eXBlJzsKKyAgZmllbGQuVHlwZV8gOj0gVFR5cGUuSTMyOworICBmaWVsZC5JZCA6PSAyOworICBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOworICBvcHJvdC5Xcml0ZUkzMihJbnRlZ2VyKEdldFR5cGUpKTsKKyAgb3Byb3QuV3JpdGVGaWVsZEVuZCgpOworICBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOworICBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOworZW5kOworCit7IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkIH0KKworY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzIGIvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGRkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvQ29uc29sZUhlbHBlci5wYXMKQEAgLTAsMCArMSwxMzIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBDb25zb2xlSGVscGVyOworCitpbnRlcmZhY2UKKwordXNlcyBDbGFzc2VzOworCit0eXBlCisgIFRUaHJpZnRDb25zb2xlID0gY2xhc3MKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7CisgIGVuZDsKKworICBUR1VJQ29uc29sZSA9IGNsYXNzKCBUVGhyaWZ0Q29uc29sZSApCisgIHByaXZhdGUKKyAgICBGTGluZUJyZWFrIDogQm9vbGVhbjsKKyAgICBGTWVtbyA6IFRTdHJpbmdzOworCisgICAgcHJvY2VkdXJlIEludGVybmFsV3JpdGUoIGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBTWVtbzogVFN0cmluZ3MpOworICBlbmQ7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OworCitpbXBsZW1lbnRhdGlvbgorCit2YXIKKyAgRkRlZmF1bHRDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisgIEZDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDb25zb2xlOworZW5kOworCit7IFRUaHJpZnRDb25zb2xlIH0KKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBTeXN0ZW0uV3JpdGUoIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgU3lzdGVtLldyaXRlbG4oIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworYmVnaW4KKyAgRkNvbnNvbGUgOj0gQUNvbnNvbGU7CitlbmQ7CisKK3Byb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKK2JlZ2luCisgIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKK2VuZDsKKworeyBUR1VJQ29uc29sZSB9CisKK2NvbnN0cnVjdG9yIFRHVUlDb25zb2xlLkNyZWF0ZSggQU1lbW86IFRTdHJpbmdzKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZNZW1vIDo9IEFNZW1vOworICBGTGluZUJyZWFrIDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUR1VJQ29uc29sZS5JbnRlcm5hbFdyaXRlKGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7Cit2YXIKKyAgaWR4IDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZMaW5lQnJlYWsgdGhlbgorICBiZWdpbgorICAgIEZNZW1vLkFkZCggUyApOworICBlbmQgZWxzZQorICBiZWdpbgorICAgIGlkeCA6PSBGTWVtby5Db3VudCAtIDE7CisgICAgaWYgaWR4IDwgMCB0aGVuCisgICAgICBGTWVtby5BZGQoIFMgKQorICAgIGVsc2UKKyAgICAgIEZNZW1vW2lkeF0gOj0gRk1lbW9baWR4XSArIFM7CisgIGVuZDsKKyAgRkxpbmVCcmVhayA6PSBiV3JpdGVMaW5lOworZW5kOworCitwcm9jZWR1cmUgVEdVSUNvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIEludGVybmFsV3JpdGUoIFMsIEZhbHNlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgSW50ZXJuYWxXcml0ZSggUywgVHJ1ZSk7CitlbmQ7CisKK2luaXRpYWxpemF0aW9uCitiZWdpbgorICBGRGVmYXVsdENvbnNvbGUgOj0gVFRocmlmdENvbnNvbGUuQ3JlYXRlOworICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7CitlbmQ7CisKK2ZpbmFsaXphdGlvbgorYmVnaW4KKyAgRkRlZmF1bHRDb25zb2xlLkZyZWU7CitlbmQ7CisKK2VuZC4KKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhNDNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcwpAQCAtMCwwICsxLDE0NTUgQEAKK++7vygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUZXN0Q2xpZW50OworCit7JEkgLi4vc3JjL1RocmlmdC5EZWZpbmVzLmluY30KKworey4kREVGSU5FIFN0cmVzc1Rlc3R9ICAgLy8gYWN0aXZhdGUgdG8gc3RyZXNzLXRlc3QgdGhlIHNlcnZlciB3aXRoIGZyZXF1ZW50IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzCit7LiRERUZJTkUgUGVyZlRlc3R9ICAgICAvLyBhY3RpdmF0ZSB0aGUgcGVyZm9ybWFuY2UgdGVzdAoreyRERUZJTkUgRXhjZXB0aW9uc30gICAgLy8gYWN0aXZhdGUgdGhlIGV4Y2VwdGlvbnMgdGVzdCAob3IgZGlzYWJsZSB3aGlsZSBkZWJ1Z2dpbmcpCisKK3skaWYgQ29tcGlsZXJWZXJzaW9uID49IDI4fQoreyRERUZJTkUgU3VwcG9ydHNBc3luY30KK3skaWZlbmR9CisKK2ludGVyZmFjZQorCit1c2VzCisgIFdpbmRvd3MsIFN5c1V0aWxzLCBDbGFzc2VzLCBNYXRoLCBDb21PYmosIEFjdGl2ZVgsCisgIHskSUZERUYgU3VwcG9ydHNBc3luY30gU3lzdGVtLlRocmVhZGluZywgeyRFTkRJRn0KKyAgRGF0ZVV0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGVzdENvbnN0YW50cywKKyAgQ29uc29sZUhlbHBlciwKKyAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04sCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcywKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlN0cmVhbSwKKyAgVGhyaWZ0LlRlc3QsCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zOworCit0eXBlCisgIFRUaHJlYWRDb25zb2xlID0gY2xhc3MKKyAgcHJpdmF0ZQorICAgIEZUaHJlYWQgOiBUVGhyZWFkOworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFMgOiBzdHJpbmcpOworICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFMgOiBzdHJpbmcpOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVRocmVhZDogVFRocmVhZCk7CisgIGVuZDsKKworICBUVGVzdFNldHVwID0gcmVjb3JkCisgICAgcHJvdFR5cGUgIDogVEtub3duUHJvdG9jb2w7CisgICAgZW5kcG9pbnQgIDogVEVuZHBvaW50VHJhbnNwb3J0OworICAgIGxheWVyZWQgICA6IFRMYXllcmVkVHJhbnNwb3J0czsKKyAgICB1c2VTU0wgICAgOiBCb29sZWFuOyAvLyBpbmNsdWRlIHdoZXJlIGFwcHJvcHJpYXRlIChUTGF5ZXJlZFRyYW5zcG9ydD8pCisgICAgaG9zdCAgICAgIDogc3RyaW5nOworICAgIHBvcnQgICAgICA6IEludGVnZXI7CisgICAgc1BpcGVOYW1lIDogc3RyaW5nOworICAgIGhBbm9uUmVhZCwgaEFub25Xcml0ZSA6IFRIYW5kbGU7CisgIGVuZDsKKworICBUQ2xpZW50VGhyZWFkID0gY2xhc3MoIFRUaHJlYWQgKQorICBwcml2YXRlIHR5cGUKKyAgICBUVGVzdEdyb3VwID0gKAorICAgICAgdGVzdF9Vbmtub3duLAorICAgICAgdGVzdF9CYXNlVHlwZXMsCisgICAgICB0ZXN0X1N0cnVjdHMsCisgICAgICB0ZXN0X0NvbnRhaW5lcnMsCisgICAgICB0ZXN0X0V4Y2VwdGlvbnMKKyAgICAgIC8vIG5ldyB2YWx1ZXMgaGVyZQorICAgICk7CisgICAgVFRlc3RHcm91cHMgPSBzZXQgb2YgVFRlc3RHcm91cDsKKworICAgIFRUZXN0U2l6ZSA9ICgKKyAgICAgIEVtcHR5LCAgICAgICAgICAgLy8gRWRnZSBjYXNlOiB0aGUgemVyby1sZW5ndGggZW1wdHkgYmluYXJ5CisgICAgICBOb3JtYWwsICAgICAgICAgIC8vIEZhaXJseSBzbWFsbCBhcnJheSBvZiB1c3VhbCBzaXplICgyNTYgYnl0ZXMpCisgICAgICBCeXRlQXJyYXlUZXN0LCAgIC8vIFRIUklGVC00NDU0IExhcmdlIHdyaXRlcy9yZWFkcyBtYXkgY2F1c2UgcmFuZ2UgY2hlY2sgZXJyb3JzIGluIGRlYnVnIG1vZGUKKyAgICAgIFBpcGVXcml0ZUxpbWl0ICAgLy8gVEhSSUZULTQzNzIgUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4KKyAgICApOworCisgIHByaXZhdGUKKyAgICBGU2V0dXAgOiBUVGVzdFNldHVwOworICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OworICAgIEZQcm90b2NvbCA6IElQcm90b2NvbDsKKyAgICBGTnVtSXRlcmF0aW9uIDogSW50ZWdlcjsKKyAgICBGQ29uc29sZSA6IFRUaHJlYWRDb25zb2xlOworCisgICAgLy8gdGVzdCByZXBvcnRpbmcsIHdpbGwgYmUgcmVmYWN0b3JlZCBvdXQgaW50byBzZXBhcmF0ZSBjbGFzcyBsYXRlcgorICAgIEZUZXN0R3JvdXAgOiBzdHJpbmc7CisgICAgRkN1cnJlbnRUZXN0IDogVFRlc3RHcm91cDsKKyAgICBGU3VjY2Vzc2VzIDogSW50ZWdlcjsKKyAgICBGRXJyb3JzIDogVFN0cmluZ0xpc3Q7CisgICAgRkZhaWxlZCA6IFRUZXN0R3JvdXBzOworICAgIEZFeGVjdXRlZCA6IFRUZXN0R3JvdXBzOworICAgIHByb2NlZHVyZSBTdGFydFRlc3RHcm91cCggY29uc3QgYUdyb3VwIDogc3RyaW5nOyBjb25zdCBhVGVzdCA6IFRUZXN0R3JvdXApOworICAgIHByb2NlZHVyZSBFeHBlY3QoIGFUZXN0UmVzdWx0IDogQm9vbGVhbjsgY29uc3QgYVRlc3RJbmZvIDogc3RyaW5nKTsKKyAgICBwcm9jZWR1cmUgUmVwb3J0UmVzdWx0czsKKyAgICBmdW5jdGlvbiAgQ2FsY3VsYXRlRXhpdENvZGUgOiBCeXRlOworCisgICAgcHJvY2VkdXJlIENsaWVudFRlc3Q7CisgICAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorICAgIHByb2NlZHVyZSBDbGllbnRBc3luY1Rlc3Q7CisgICAgeyRFTkRJRn0KKworICAgIHByb2NlZHVyZSBJbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICBwcm9jZWR1cmUgU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworCisgICAgcHJvY2VkdXJlIEpTT05Qcm90b2NvbFJlYWRXcml0ZVRlc3Q7CisgICAgZnVuY3Rpb24gIFByZXBhcmVCaW5hcnlEYXRhKCBhUmFuZG9tRGlzdCA6IEJvb2xlYW47IGFTaXplIDogVFRlc3RTaXplKSA6IFRCeXRlczsKKyAgICB7JElGREVGIFN0cmVzc1Rlc3R9CisgICAgcHJvY2VkdXJlIFN0cmVzc1Rlc3QoY29uc3QgY2xpZW50IDogVFRocmlmdFRlc3QuSWZhY2UpOworICAgIHskRU5ESUZ9CisgICAgeyRJRkRFRiBXaW42NH0KKyAgICBwcm9jZWR1cmUgVXNlSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0OworICAgIHskRU5ESUZ9CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBFeGVjdXRlOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhU2V0dXAgOiBUVGVzdFNldHVwOyBjb25zdCBhTnVtSXRlcmF0aW9uOiBJbnRlZ2VyKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFRlc3RDbGllbnQgPSBjbGFzcworICBwcml2YXRlCisgICAgY2xhc3MgdmFyCisgICAgICBGTnVtSXRlcmF0aW9uIDogSW50ZWdlcjsKKyAgICAgIEZOdW1UaHJlYWQgOiBJbnRlZ2VyOworCisgICAgY2xhc3MgcHJvY2VkdXJlIFByaW50Q21kTGluZUhlbHA7CisgICAgY2xhc3MgcHJvY2VkdXJlIEludmFsaWRBcmdzOworICBwdWJsaWMKKyAgICBjbGFzcyBmdW5jdGlvbiBFeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpIDogQnl0ZTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKK2NvbnN0CisgICBFWElUQ09ERV9TVUNDRVNTICAgICAgICAgICA9ICQwMDsgIC8vIG5vIGVycm9ycyBiaXRzIHNldAorICAgLy8KKyAgIEVYSVRDT0RFX0ZBSUxCSVRfQkFTRVRZUEVTICA9ICQwMTsKKyAgIEVYSVRDT0RFX0ZBSUxCSVRfU1RSVUNUUyAgICA9ICQwMjsKKyAgIEVYSVRDT0RFX0ZBSUxCSVRfQ09OVEFJTkVSUyA9ICQwNDsKKyAgIEVYSVRDT0RFX0ZBSUxCSVRfRVhDRVBUSU9OUyA9ICQwODsKKworICAgTUFQX0ZBSUxVUkVTX1RPX0VYSVRDT0RFX0JJVFMgOiBhcnJheVtUQ2xpZW50VGhyZWFkLlRUZXN0R3JvdXBdIG9mIEJ5dGUgPSAoCisgICAgIEVYSVRDT0RFX1NVQ0NFU1MsICAvLyBubyBiaXRzIGhlcmUKKyAgICAgRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMsCisgICAgIEVYSVRDT0RFX0ZBSUxCSVRfU1RSVUNUUywKKyAgICAgRVhJVENPREVfRkFJTEJJVF9DT05UQUlORVJTLAorICAgICBFWElUQ09ERV9GQUlMQklUX0VYQ0VQVElPTlMKKyAgICk7CisKKworCitmdW5jdGlvbiBCb29sVG9TdHJpbmcoIGIgOiBCb29sZWFuKSA6IHN0cmluZzsKKy8vIG92ZXJyaWRlcyBnbG9iYWwgQm9vbFRvU3RyaW5nKCkKK2JlZ2luCisgIGlmIGIKKyAgdGhlbiByZXN1bHQgOj0gJ3RydWUnCisgIGVsc2UgcmVzdWx0IDo9ICdmYWxzZSc7CitlbmQ7CisKKy8vIG5vdCBhdmFpbGFibGUgaW4gYWxsIHZlcnNpb25zLCBzbyBtYWtlIHN1cmUgd2UgaGF2ZSB0aGlzIG9uZSBpbXBvcnRlZAorZnVuY3Rpb24gSXNEZWJ1Z2dlclByZXNlbnQ6IEJPT0w7IHN0ZGNhbGw7IGV4dGVybmFsIEtFUk5FTDMyIG5hbWUgJ0lzRGVidWdnZXJQcmVzZW50JzsKKworeyBUVGVzdENsaWVudCB9CisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdENsaWVudC5QcmludENtZExpbmVIZWxwOworY29uc3QgSEVMUFRFWFQgPSAnIFtvcHRpb25zXScjMTAKKyAgICAgICAgICAgICAgICsgIzEwCisgICAgICAgICAgICAgICArICdBbGxvd2VkIG9wdGlvbnM6JyMxMAorICAgICAgICAgICAgICAgKyAnICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UnIzEwCisgICAgICAgICAgICAgICArICcgIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0JyMxMAorICAgICAgICAgICAgICAgKyAnICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwnIzEwCisgICAgICAgICAgICAgICArICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQnIzEwCisgICAgICAgICAgICAgICArICcgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wnIzEwCisgICAgICAgICAgICAgICArICcgIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMnIzEwCisgICAgICAgICAgICAgICArICcgIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzJyMxMAorICAgICAgICAgICAgICAgOworYmVnaW4KKyAgV3JpdGVsbiggQ2hhbmdlRmlsZUV4dChFeHRyYWN0RmlsZU5hbWUoUGFyYW1TdHIoMCkpLCcnKSArIEhFTFBURVhUKTsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0Q2xpZW50LkludmFsaWRBcmdzOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdJbnZhbGlkIGFyZ3MuJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBDaGFuZ2VGaWxlRXh0KEV4dHJhY3RGaWxlTmFtZShQYXJhbVN0cigwKSksJycpICsgJyAtaCBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOworICBBYm9ydDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRlc3RDbGllbnQuRXhlY3V0ZShjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpIDogQnl0ZTsKK3ZhcgorICBpIDogSW50ZWdlcjsKKyAgdGhyZWFkRXhpdENvZGUgOiBCeXRlOworICBzIDogc3RyaW5nOworICB0aHJlYWRzIDogYXJyYXkgb2YgVFRocmVhZDsKKyAgZHRTdGFydCA6IFREYXRlVGltZTsKKyAgdGVzdCA6IEludGVnZXI7CisgIHRocmVhZCA6IFRUaHJlYWQ7CisgIHNldHVwIDogVFRlc3RTZXR1cDsKK2JlZ2luCisgIC8vIGluaXQgcmVjb3JkCisgIHdpdGggc2V0dXAgZG8gYmVnaW4KKyAgICBwcm90VHlwZSAgIDo9IHByb3RfQmluYXJ5OworICAgIGVuZHBvaW50ICAgOj0gdHJuc19Tb2NrZXRzOworICAgIGxheWVyZWQgICAgOj0gW107CisgICAgdXNlU1NMICAgICA6PSBGQUxTRTsKKyAgICBob3N0ICAgICAgIDo9ICdsb2NhbGhvc3QnOworICAgIHBvcnQgICAgICAgOj0gOTA5MDsKKyAgICBzUGlwZU5hbWUgIDo9ICcnOworICAgIGhBbm9uUmVhZCAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgaEFub25Xcml0ZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgZW5kOworCisgIHRyeQorICAgIGkgOj0gMDsKKyAgICB3aGlsZSAoIGkgPCBMZW5ndGgoYXJncykgKSBkbyBiZWdpbgorICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgSW5jKCBpKTsKKworICAgICAgaWYgKHMgPSAnLWgnKSBvciAocyA9ICctLWhlbHAnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgICBQcmludENtZExpbmVIZWxwOworICAgICAgICByZXN1bHQgOj0gJEZGOyAgIC8vIGFsbCB0ZXN0cyBmYWlsZWQKKyAgICAgICAgRXhpdDsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0taG9zdCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0CisgICAgICAgIHNldHVwLmhvc3QgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tcG9ydCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gY29ubmVjdAorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyggaSk7CisgICAgICAgIHNldHVwLnBvcnQgOj0gU3RyVG9JbnREZWYocywwKTsKKyAgICAgICAgaWYgc2V0dXAucG9ydCA8PSAwIHRoZW4gSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLWRvbWFpbi1zb2NrZXQnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydAorICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdkb21haW4tc29ja2V0IG5vdCBzdXBwb3J0ZWQnKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tbmFtZWQtcGlwZScgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKKyAgICAgICAgc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19OYW1lZFBpcGVzOworICAgICAgICBzZXR1cC5zUGlwZU5hbWUgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIG5hbWVkIHBpcGUgKCcrc2V0dXAuc1BpcGVOYW1lKycpJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLWFub24tcGlwZXMnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpCisgICAgICAgIHNldHVwLmVuZHBvaW50IDo9IHRybnNfQW5vblBpcGVzOworICAgICAgICBzZXR1cC5oQW5vblJlYWQgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgICAgICAgIEluYyggaSk7CisgICAgICAgIHNldHVwLmhBbm9uV3JpdGUgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgICAgICAgIEluYyggaSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBhbm9ueW1vdXMgcGlwZXMgKCcrSW50VG9TdHIoSW50ZWdlcihzZXR1cC5oQW5vblJlYWQpKSsnIGFuZCAnK0ludFRvU3RyKEludGVnZXIoc2V0dXAuaEFub25Xcml0ZSkpKycpJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLXRyYW5zcG9ydCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAKKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoIGkpOworCisgICAgICAgIGlmICAgICAgcyA9ICdidWZmZXJlZCcgdGhlbiBJbmNsdWRlKCBzZXR1cC5sYXllcmVkLCB0cm5zX0J1ZmZlcmVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnZnJhbWVkJyAgIHRoZW4gSW5jbHVkZSggc2V0dXAubGF5ZXJlZCwgdHJuc19GcmFtZWQpCisgICAgICAgIGVsc2UgaWYgcyA9ICdodHRwJyAgICAgdGhlbiBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0h0dHAKKyAgICAgICAgZWxzZSBpZiBzID0gJ2V2aHR0cCcgICB0aGVuIHNldHVwLmVuZHBvaW50IDo9IHRybnNfRXZIdHRwCisgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLXByb3RvY29sJyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnYmluYXJ5JyAgIHRoZW4gc2V0dXAucHJvdFR5cGUgOj0gcHJvdF9CaW5hcnkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2NvbXBhY3QnICB0aGVuIHNldHVwLnByb3RUeXBlIDo9IHByb3RfQ29tcGFjdAorICAgICAgICBlbHNlIGlmIHMgPSAnanNvbicgICAgIHRoZW4gc2V0dXAucHJvdFR5cGUgOj0gcHJvdF9KU09OCisgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLXNzbCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wKKyAgICAgICAgc2V0dXAudXNlU1NMIDo9IFRSVUU7CisKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctbicpIG9yIChzID0gJy0tdGVzdGxvb3BzJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzCisgICAgICAgIEZOdW1JdGVyYXRpb24gOj0gU3RyVG9JbnREZWYoIGFyZ3NbaV0sIDApOworICAgICAgICBJbmMoIGkpOworICAgICAgICBpZiBGTnVtSXRlcmF0aW9uIDw9IDAKKyAgICAgICAgdGhlbiBJbnZhbGlkQXJnczsKKworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy10Jykgb3IgKHMgPSAnLS10aHJlYWRzJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtdCBbIC0tdGhyZWFkcyBdIGFyZyAoPTEpICAgTnVtYmVyIG9mIFRlc3QgdGhyZWFkcworICAgICAgICBGTnVtVGhyZWFkIDo9IFN0clRvSW50RGVmKCBhcmdzW2ldLCAwKTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgaWYgRk51bVRocmVhZCA8PSAwCisgICAgICAgIHRoZW4gSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgSW52YWxpZEFyZ3M7CisgICAgICBlbmQ7CisgICAgZW5kOworCisKKyAgICAvLyBJbiB0aGUgYW5vbnltb3VzIHBpcGVzIG1vZGUgdGhlIGNsaWVudCBpcyBsYXVuY2hlZCBieSB0aGUgdGVzdCBzZXJ2ZXIKKyAgICAvLyAtPiBiZWhhdmUgbmljZWx5IGFuZCBhbGxvdyBmb3IgYXR0YWNoaW5nIGEgZGVidWdnZXIgdG8gdGhpcyBwcm9jZXNzCisgICAgaWYgKHNldHVwLmVuZHBvaW50ID0gdHJuc19Bbm9uUGlwZXMpIGFuZCBub3QgSXNEZWJ1Z2dlclByZXNlbnQKKyAgICB0aGVuIE1lc3NhZ2VCb3goIDAsICdBdHRhY2ggRGVidWdnZXIgYW5kL29yIGNsaWNrIE9LIHRvIGNvbnRpbnVlLicsCisgICAgICAgICAgICAgICAgICAgICAgICAnVGhyaWZ0IFRlc3RDbGllbnQgKERlbHBoaSknLAorICAgICAgICAgICAgICAgICAgICAgICAgTUJfT0sgb3IgTUJfSUNPTkVYQ0xBTUFUSU9OKTsKKworICAgIFNldExlbmd0aCggdGhyZWFkcywgRk51bVRocmVhZCk7CisgICAgZHRTdGFydCA6PSBOb3c7CisKKyAgICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgICBpZiAodHJuc19GcmFtZWQgaW4gc2V0dXAubGF5ZXJlZCkgdGhlbiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGZyYW1lZCB0cmFuc3BvcnQnKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmICh0cm5zX0J1ZmZlcmVkIGluIHNldHVwLmxheWVyZWQpIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBidWZmZXJlZCB0cmFuc3BvcnQnKTsKKyAgICBlbmQ7CisKKyAgICBDb25zb2xlLldyaXRlTGluZShUSFJJRlRfUFJPVE9DT0xTW3NldHVwLnByb3RUeXBlXSsnIHByb3RvY29sJyk7CisKKyAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvIGJlZ2luCisgICAgICB0aHJlYWQgOj0gVENsaWVudFRocmVhZC5DcmVhdGUoIHNldHVwLCBGTnVtSXRlcmF0aW9uKTsKKyAgICAgIHRocmVhZHNbdGVzdF0gOj0gdGhyZWFkOworICAgICAgdGhyZWFkLlN0YXJ0OworICAgIGVuZDsKKworICAgIHJlc3VsdCA6PSAwOworICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEgZG8gYmVnaW4KKyAgICAgIHRocmVhZEV4aXRDb2RlIDo9IHRocmVhZHNbdGVzdF0uV2FpdEZvcjsKKyAgICAgIHJlc3VsdCA6PSByZXN1bHQgb3IgdGhyZWFkRXhpdENvZGU7CisgICAgICB0aHJlYWRzW3Rlc3RdLkZyZWU7CisgICAgICB0aHJlYWRzW3Rlc3RdIDo9IG5pbDsKKyAgICBlbmQ7CisKKyAgICBDb25zb2xlLldyaXRlKCdUb3RhbCB0aW1lOiAnICsgSW50VG9TdHIoIE1pbGxpU2Vjb25kc0JldHdlZW4oTm93LCBkdFN0YXJ0KSkpOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEVBYm9ydCBkbyByYWlzZTsKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBFLk1lc3NhZ2UgKyAjMTAgKyBFLlN0YWNrVHJhY2UpOworICAgICAgcmFpc2U7CisgICAgZW5kOworICBlbmQ7CisKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJycpOworICBDb25zb2xlLldyaXRlTGluZSgnZG9uZSEnKTsKK2VuZDsKKworeyBUQ2xpZW50VGhyZWFkIH0KKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuQ2xpZW50VGVzdDsKK3ZhcgorICBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JZmFjZTsKKyAgcyA6IHN0cmluZzsKKyAgaTggOiBTaG9ydEludDsKKyAgaTMyIDogSW50ZWdlcjsKKyAgaTY0IDogSW50NjQ7CisgIGJpbk91dCxiaW5JbiA6IFRCeXRlczsKKyAgZHViIDogRG91YmxlOworICBvIDogSVh0cnVjdDsKKyAgbzIgOiBJWHRydWN0MjsKKyAgaSA6IElYdHJ1Y3Q7CisgIGkyIDogSVh0cnVjdDI7CisgIG1hcG91dCA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsSW50ZWdlcj47CisgIG1hcGluIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlcixJbnRlZ2VyPjsKKyAgc3RybWFwb3V0IDogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgIHN0cm1hcGluIDogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgIGogOiBJbnRlZ2VyOworICBmaXJzdCA6IEJvb2xlYW47CisgIGtleSA6IEludGVnZXI7CisgIHN0cmtleSA6IHN0cmluZzsKKyAgbGlzdG91dCA6IElUaHJpZnRMaXN0PEludGVnZXI+OworICBsaXN0aW4gOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKKyAgc2V0b3V0IDogSUhhc2hTZXQ8SW50ZWdlcj47CisgIHNldGluIDogSUhhc2hTZXQ8SW50ZWdlcj47CisgIHJldCA6IFROdW1iZXJ6OworICB1aWQgOiBJbnQ2NDsKKyAgbW0gOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPj47CisgIHBvcyA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworICBuZWcgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKKyAgbTIgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKKyAgazIgOiBJbnRlZ2VyOworICBpbnNhbmUgOiBJSW5zYW5pdHk7CisgIHRydWNrIDogSVh0cnVjdDsKKyAgd2hvYSA6IElUaHJpZnREaWN0aW9uYXJ5PEludDY0LCBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5Pj47CisgIGtleTY0IDogSW50NjQ7CisgIHZhbCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+OworICBrMl8yIDogVE51bWJlcno7CisgIGszIDogVE51bWJlcno7CisgIHYyIDogSUluc2FuaXR5OworICB1c2VyTWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIEludDY0PjsKKyAgeHRydWN0cyA6IElUaHJpZnRMaXN0PElYdHJ1Y3Q+OworICB4IDogSVh0cnVjdDsKKyAgYXJnMCA6IFNob3J0SW50OworICBhcmcxIDogSW50ZWdlcjsKKyAgYXJnMiA6IEludDY0OworICBhcmczIDogSVRocmlmdERpY3Rpb25hcnk8U21hbGxJbnQsIHN0cmluZz47CisgIGFyZzQgOiBUTnVtYmVyejsKKyAgYXJnNSA6IEludDY0OworICB7JElGREVGIFBlcmZUZXN0fQorICBTdGFydFRpY2sgOiBDYXJkaW5hbDsKKyAgayA6IEludGVnZXI7CisgIHskRU5ESUZ9CisgIGhlbGxvLCBnb29kYnllIDogSVh0cnVjdDsKKyAgY3JhenkgOiBJSW5zYW5pdHk7CisgIGxvb25leSA6IElJbnNhbml0eTsKKyAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CisgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKKyAgcGFpciA6IFRQYWlyPFROdW1iZXJ6LCBUVXNlcklkPjsKKyAgdGVzdHNpemUgOiBUVGVzdFNpemU7CitiZWdpbgorICBjbGllbnQgOj0gVFRocmlmdFRlc3QuVENsaWVudC5DcmVhdGUoIEZQcm90b2NvbCk7CisgIEZUcmFuc3BvcnQuT3BlbjsKKworICB7JElGREVGIFN0cmVzc1Rlc3R9CisgIFN0cmVzc1Rlc3QoIGNsaWVudCk7CisgIHskRU5ESUYgU3RyZXNzVGVzdH0KKworICB7JElGREVGIEV4Y2VwdGlvbnN9CisgIC8vIGluLWRlcHRoIGV4Y2VwdGlvbiB0ZXN0CisgIC8vICgxKSBkbyB3ZSBnZXQgYW4gZXhjZXB0aW9uIGF0IGFsbD8KKyAgLy8gKDIpIGRvIHdlIGdldCB0aGUgcmlnaHQgZXhjZXB0aW9uPworICAvLyAoMykgZG9lcyB0aGUgZXhjZXB0aW9uIGNvbnRhaW4gdGhlIGV4cGVjdGVkIGRhdGE/CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdEV4Y2VwdGlvbicsIHRlc3RfRXhjZXB0aW9ucyk7CisgIC8vIGNhc2UgMTogZXhjZXB0aW9uIHR5cGUgZGVjbGFyZWQgaW4gSURMIGF0IHRoZSBmdW5jdGlvbiBjYWxsCisgIHRyeQorICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgIEV4cGVjdCggRkFMU0UsICd0ZXN0RXhjZXB0aW9uKCcnWGNlcHRpb24nJyk6IG11c3QgdHJvdyBhbiBleGNlcHRpb24nKTsKKyAgZXhjZXB0CisgICAgb24gZTpUWGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIEV4cGVjdCggZS5FcnJvckNvZGUgPSAxMDAxLCAgICAgICAnZXJyb3IgY29kZScpOworICAgICAgRXhwZWN0KCBlLk1lc3NhZ2VfICA9ICdYY2VwdGlvbicsICdlcnJvciBtZXNzYWdlJyk7CisgICAgICBDb25zb2xlLldyaXRlTGluZSggJyA9ICcgKyBJbnRUb1N0cihlLkVycm9yQ29kZSkgKyAnLCAnICsgZS5NZXNzYWdlXyApOworICAgIGVuZDsKKyAgICBvbiBlOlRUcmFuc3BvcnRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgOiAiJytlLlRvU3RyaW5nKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgIGVuZDsKKworICAvLyBjYXNlIDI6IGV4Y2VwdGlvbiB0eXBlIE5PVCBkZWNsYXJlZCBpbiBJREwgYXQgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgLy8gdGhpcyB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uCisgIHRyeQorICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgRXhwZWN0KCBGQUxTRSwgJ3Rlc3RFeGNlcHRpb24oJydURXhjZXB0aW9uJycpOiBtdXN0IHRyb3cgYW4gZXhjZXB0aW9uJyk7CisgIGV4Y2VwdAorICAgIG9uIGU6VFRyYW5zcG9ydEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGUuQ2xhc3NOYW1lKycgPSAnK2UuTWVzc2FnZSk7IC8vIHRoaXMgaXMgd2hhdCB3ZSBnZXQKKyAgICBlbmQ7CisgICAgb24gZTpUQXBwbGljYXRpb25FeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlLkNsYXNzTmFtZSsnID0gJytlLk1lc3NhZ2UpOyAvLyB0aGlzIGlzIHdoYXQgd2UgZ2V0CisgICAgZW5kOworICAgIG9uIGU6VEV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgZW5kOworCisKKyAgaWYgRlRyYW5zcG9ydC5Jc09wZW4gdGhlbiBGVHJhbnNwb3J0LkNsb3NlOworICBGVHJhbnNwb3J0Lk9wZW47ICAgLy8gcmUtb3BlbiBjb25uZWN0aW9uLCBzZXJ2ZXIgaGFzIGFscmVhZHkgY2xvc2VkCisKKworICAvLyBjYXNlIDM6IG5vIGV4Y2VwdGlvbgorICB0cnkKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignc29tZXRoaW5nJyk7CisgICAgRXhwZWN0KCBUUlVFLCAndGVzdEV4Y2VwdGlvbignJ3NvbWV0aGluZycnKTogbXVzdCBub3QgdHJvdyBhbiBleGNlcHRpb24nKTsKKyAgZXhjZXB0CisgICAgb24gZTpUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIDogIicrZS5Ub1N0cmluZysnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisgIHskRU5ESUYgRXhjZXB0aW9uc30KKworCisgIC8vIHNpbXBsZSB0aGluZ3MKKyAgU3RhcnRUZXN0R3JvdXAoICdzaW1wbGUgVGhyaWZ0IGNhbGxzJywgdGVzdF9CYXNlVHlwZXMpOworICBjbGllbnQudGVzdFZvaWQoKTsKKyAgRXhwZWN0KCBUUlVFLCAndGVzdFZvaWQoKScpOyAgLy8gc3VjY2VzcyA6PSBubyBleGNlcHRpb24KKworICBzIDo9IEJvb2xUb1N0cmluZyggY2xpZW50LnRlc3RCb29sKFRSVUUpKTsKKyAgRXhwZWN0KCBzID0gQm9vbFRvU3RyaW5nKFRSVUUpLCAgJ3Rlc3RCb29sKFRSVUUpID0gJytzKTsKKyAgcyA6PSBCb29sVG9TdHJpbmcoIGNsaWVudC50ZXN0Qm9vbChGQUxTRSkpOworICBFeHBlY3QoIHMgPSBCb29sVG9TdHJpbmcoRkFMU0UpLCAgJ3Rlc3RCb29sKEZBTFNFKSA9ICcrcyk7CisKKyAgcyA6PSBjbGllbnQudGVzdFN0cmluZygnVGVzdCcpOworICBFeHBlY3QoIHMgPSAnVGVzdCcsICd0ZXN0U3RyaW5nKCcnVGVzdCcnKSA9ICInK3MrJyInKTsKKworICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKCcnKTsgIC8vIGVtcHR5IHN0cmluZworICBFeHBlY3QoIHMgPSAnJywgJ3Rlc3RTdHJpbmcoJycnJykgPSAiJytzKyciJyk7CisKKyAgcyA6PSBjbGllbnQudGVzdFN0cmluZyhIVUdFX1RFU1RfU1RSSU5HKTsKKyAgRXhwZWN0KCBsZW5ndGgocykgPSBsZW5ndGgoSFVHRV9URVNUX1NUUklORyksCisgICAgICAgICAgJ3Rlc3RTdHJpbmcoIGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSA9ICcrSW50VG9TdHIoTGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpKSsnKSAnCisgICAgICAgICArJz0+IGxlbmd0aChyZXN1bHQpID0gJytJbnRUb1N0cihMZW5ndGgocykpKTsKKworICBpOCA6PSBjbGllbnQudGVzdEJ5dGUoMSk7CisgIEV4cGVjdCggaTggPSAxLCAndGVzdEJ5dGUoMSkgPSAnICsgSW50VG9TdHIoIGk4ICkpOworCisgIGkzMiA6PSBjbGllbnQudGVzdEkzMigtMSk7CisgIEV4cGVjdCggaTMyID0gLTEsICd0ZXN0STMyKC0xKSA9ICcgKyBJbnRUb1N0cihpMzIpKTsKKworICBDb25zb2xlLldyaXRlTGluZSgndGVzdEk2NCgtMzQzNTk3MzgzNjgpJyk7CisgIGk2NCA6PSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOworICBFeHBlY3QoIGk2NCA9IC0zNDM1OTczODM2OCwgJ3Rlc3RJNjQoLTM0MzU5NzM4MzY4KSA9ICcgKyBJbnRUb1N0ciggaTY0KSk7CisKKyAgLy8gcmFuZG9tIGJpbmFyeSBzbWFsbAorICBmb3IgdGVzdHNpemUgOj0gTG93KFRUZXN0U2l6ZSkgdG8gSGlnaChUVGVzdFNpemUpIGRvIGJlZ2luCisgICAgYmluT3V0IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBUUlVFLCB0ZXN0c2l6ZSk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyknKTsKKyAgICB0cnkKKyAgICAgIGJpbkluIDo9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICBFeHBlY3QoIExlbmd0aChiaW5PdXQpID0gTGVuZ3RoKGJpbkluKSwgJ3Rlc3RCaW5hcnkoKTogbGVuZ3RoICcrSW50VG9TdHIoTGVuZ3RoKGJpbk91dCkpKycgPSAnK0ludFRvU3RyKExlbmd0aChiaW5JbikpKTsKKyAgICAgIGkzMiA6PSBNaW4oIExlbmd0aChiaW5PdXQpLCBMZW5ndGgoYmluSW4pKTsKKyAgICAgIEV4cGVjdCggQ29tcGFyZU1lbSggYmluT3V0LCBiaW5JbiwgaTMyKSwgJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJykgPSAnK0J5dGVzVG9IZXgoYmluSW4pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCk6ICcrZS5NZXNzYWdlKTsKKyAgICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd0ZXN0QmluYXJ5KCk6IFVuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpJyk7CisgIGR1YiA6PSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7CisgIEV4cGVjdCggYWJzKGR1Yi01LjMyNTA5ODIzNSkgPCAxZS0xNCwgJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpID0gJyArIEZsb2F0VG9TdHIoIGR1YikpOworCisgIC8vIHN0cnVjdHMKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0U3RydWN0JywgdGVzdF9TdHJ1Y3RzKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RTdHJ1Y3QoeycnWmVybycnLCAxLCAtMywgLTV9KScpOworICBvIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKKyAgby5TdHJpbmdfdGhpbmcgOj0gJ1plcm8nOworICBvLkJ5dGVfdGhpbmcgOj0gMTsKKyAgby5JMzJfdGhpbmcgOj0gLTM7CisgIG8uSTY0X3RoaW5nIDo9IC01OworICBpIDo9IGNsaWVudC50ZXN0U3RydWN0KG8pOworICBFeHBlY3QoIGkuU3RyaW5nX3RoaW5nID0gJ1plcm8nLCAnaS5TdHJpbmdfdGhpbmcgPSAiJytpLlN0cmluZ190aGluZysnIicpOworICBFeHBlY3QoIGkuQnl0ZV90aGluZyA9IDEsICdpLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGkuQnl0ZV90aGluZykpOworICBFeHBlY3QoIGkuSTMyX3RoaW5nID0gLTMsICdpLkkzMl90aGluZyA9ICcrSW50VG9TdHIoaS5JMzJfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLkk2NF90aGluZyA9IC01LCAnaS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGkuSTY0X3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X1N0cmluZ190aGluZywgJ2kuX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfU3RyaW5nX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0J5dGVfdGhpbmcsICdpLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0kzMl90aGluZywgJ2kuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0k2NF90aGluZywgJ2kuX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTY0X3RoaW5nKSk7CisKKyAgLy8gbmVzdGVkIHN0cnVjdHMKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TmVzdCcsIHRlc3RfU3RydWN0cyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0TmVzdCh7MSwgeycnWmVybycnLCAxLCAtMywgLTV9LCA1fSknKTsKKyAgbzIgOj0gVFh0cnVjdDJJbXBsLkNyZWF0ZTsKKyAgbzIuQnl0ZV90aGluZyA6PSAxOworICBvMi5TdHJ1Y3RfdGhpbmcgOj0gbzsKKyAgbzIuSTMyX3RoaW5nIDo9IDU7CisgIGkyIDo9IGNsaWVudC50ZXN0TmVzdChvMik7CisgIGkgOj0gaTIuU3RydWN0X3RoaW5nOworICBFeHBlY3QoIGkuU3RyaW5nX3RoaW5nID0gJ1plcm8nLCAnaS5TdHJpbmdfdGhpbmcgPSAiJytpLlN0cmluZ190aGluZysnIicpOworICBFeHBlY3QoIGkuQnl0ZV90aGluZyA9IDEsICAnaS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihpLkJ5dGVfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLkkzMl90aGluZyA9IC0zLCAgJ2kuSTMyX3RoaW5nID0gJytJbnRUb1N0cihpLkkzMl90aGluZykpOworICBFeHBlY3QoIGkuSTY0X3RoaW5nID0gLTUsICAnaS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGkuSTY0X3RoaW5nKSk7CisgIEV4cGVjdCggaTIuQnl0ZV90aGluZyA9IDEsICdpMi5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihpMi5CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaTIuSTMyX3RoaW5nID0gNSwgICdpMi5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGkyLkkzMl90aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9TdHJpbmdfdGhpbmcsICdpLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X1N0cmluZ190aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9CeXRlX3RoaW5nLCAgJ2kuX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfSTMyX3RoaW5nLCAgJ2kuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhpLl9faXNzZXRfSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0k2NF90aGluZywgICdpLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0k2NF90aGluZykpOworICBFeHBlY3QoIGkyLl9faXNzZXRfQnl0ZV90aGluZywgJ2kyLl9faXNzZXRfQnl0ZV90aGluZycpOworICBFeHBlY3QoIGkyLl9faXNzZXRfSTMyX3RoaW5nLCAgJ2kyLl9faXNzZXRfSTMyX3RoaW5nJyk7CisKKyAgLy8gbWFwPHR5cGUxLHR5cGUyPjogQSBtYXAgb2Ygc3RyaWN0bHkgdW5pcXVlIGtleXMgdG8gdmFsdWVzLgorICAvLyBUcmFuc2xhdGVzIHRvIGFuIFNUTCBtYXAsIEphdmEgSGFzaE1hcCwgUEhQIGFzc29jaWF0aXZlIGFycmF5LCBQeXRob24vUnVieSBkaWN0aW9uYXJ5LCBldGMuCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE1hcCcsIHRlc3RfQ29udGFpbmVycyk7CisgIG1hcG91dCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50ZWdlcixJbnRlZ2VyPi5DcmVhdGU7CisgIGZvciBqIDo9IDAgdG8gNCBkbworICBiZWdpbgorICAgIG1hcG91dC5BZGRPclNldFZhbHVlKCBqLCBqIC0gMTApOworICBlbmQ7CisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RNYXAoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3Iga2V5IGluIG1hcG91dC5LZXlzIGRvCisgIGJlZ2luCisgICAgaWYgZmlyc3QKKyAgICB0aGVuIGZpcnN0IDo9IEZhbHNlCisgICAgZWxzZSBDb25zb2xlLldyaXRlKCAnLCAnICk7CisgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIGtleSkgKyAnID0+ICcgKyBJbnRUb1N0ciggbWFwb3V0W2tleV0pKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKworICBtYXBpbiA6PSBjbGllbnQudGVzdE1hcCggbWFwb3V0ICk7CisgIEV4cGVjdCggbWFwaW4uQ291bnQgPSBtYXBvdXQuQ291bnQsICd0ZXN0TWFwOiBtYXBpbi5Db3VudCA9IG1hcG91dC5Db3VudCcpOworICBmb3IgaiA6PSAwIHRvIDQgZG8KKyAgYmVnaW4KKyAgICBFeHBlY3QoIG1hcG91dC5Db250YWluc0tleShqKSwgJ3Rlc3RNYXA6IG1hcG91dC5Db250YWluc0tleSgnK0ludFRvU3RyKGopKycpID0gJytCb29sVG9TdHJpbmcobWFwb3V0LkNvbnRhaW5zS2V5KGopKSk7CisgIGVuZDsKKyAgZm9yIGtleSBpbiBtYXBpbi5LZXlzIGRvCisgIGJlZ2luCisgICAgRXhwZWN0KCBtYXBpbltrZXldID0gbWFwb3V0W2tleV0sICd0ZXN0TWFwOiAnK0ludFRvU3RyKGtleSkgKyAnID0+ICcgKyBJbnRUb1N0ciggbWFwaW5ba2V5XSkpOworICAgIEV4cGVjdCggbWFwaW5ba2V5XSA9IGtleSAtIDEwLCAndGVzdE1hcDogbWFwaW5bJytJbnRUb1N0cihrZXkpKyddID0gJytJbnRUb1N0ciggbWFwaW5ba2V5XSkpOworICBlbmQ7CisKKworICAvLyBtYXA8dHlwZTEsdHlwZTI+OiBBIG1hcCBvZiBzdHJpY3RseSB1bmlxdWUga2V5cyB0byB2YWx1ZXMuCisgIC8vIFRyYW5zbGF0ZXMgdG8gYW4gU1RMIG1hcCwgSmF2YSBIYXNoTWFwLCBQSFAgYXNzb2NpYXRpdmUgYXJyYXksIFB5dGhvbi9SdWJ5IGRpY3Rpb25hcnksIGV0Yy4KKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0U3RyaW5nTWFwJywgdGVzdF9Db250YWluZXJzKTsKKyAgc3RybWFwb3V0IDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxzdHJpbmcsc3RyaW5nPi5DcmVhdGU7CisgIGZvciBqIDo9IDAgdG8gNCBkbworICBiZWdpbgorICAgIHN0cm1hcG91dC5BZGRPclNldFZhbHVlKCBJbnRUb1N0cihqKSwgSW50VG9TdHIoaiAtIDEwKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZSgndGVzdFN0cmluZ01hcCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisgIGZvciBzdHJrZXkgaW4gc3RybWFwb3V0LktleXMgZG8KKyAgYmVnaW4KKyAgICBpZiBmaXJzdAorICAgIHRoZW4gZmlyc3QgOj0gRmFsc2UKKyAgICBlbHNlIENvbnNvbGUuV3JpdGUoICcsICcgKTsKKyAgICBDb25zb2xlLldyaXRlKCBzdHJrZXkgKyAnID0+ICcgKyBzdHJtYXBvdXRbc3Rya2V5XSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisKKyAgc3RybWFwaW4gOj0gY2xpZW50LnRlc3RTdHJpbmdNYXAoIHN0cm1hcG91dCApOworICBFeHBlY3QoIHN0cm1hcGluLkNvdW50ID0gc3RybWFwb3V0LkNvdW50LCAndGVzdFN0cmluZ01hcDogc3RybWFwaW4uQ291bnQgPSBzdHJtYXBvdXQuQ291bnQnKTsKKyAgZm9yIGogOj0gMCB0byA0IGRvCisgIGJlZ2luCisgICAgRXhwZWN0KCBzdHJtYXBvdXQuQ29udGFpbnNLZXkoSW50VG9TdHIoaikpLAorICAgICAgICAgICAgJ3Rlc3RTdHJpbmdNYXA6IHN0cm1hcG91dC5Db250YWluc0tleSgnK0ludFRvU3RyKGopKycpID0gJworICAgICAgICAgICAgKyBCb29sVG9TdHJpbmcoc3RybWFwb3V0LkNvbnRhaW5zS2V5KEludFRvU3RyKGopKSkpOworICBlbmQ7CisgIGZvciBzdHJrZXkgaW4gc3RybWFwaW4uS2V5cyBkbworICBiZWdpbgorICAgIEV4cGVjdCggc3RybWFwaW5bc3Rya2V5XSA9IHN0cm1hcG91dFtzdHJrZXldLCAndGVzdFN0cmluZ01hcDogJytzdHJrZXkgKyAnID0+ICcgKyBzdHJtYXBpbltzdHJrZXldKTsKKyAgICBFeHBlY3QoIHN0cm1hcGluW3N0cmtleV0gPSBJbnRUb1N0ciggU3RyVG9JbnQoc3Rya2V5KSAtIDEwKSwgJ3Rlc3RTdHJpbmdNYXA6IHN0cm1hcGluWycrc3Rya2V5KyddID0gJytzdHJtYXBpbltzdHJrZXldKTsKKyAgZW5kOworCisKKyAgLy8gc2V0PHR5cGU+OiBBbiB1bm9yZGVyZWQgc2V0IG9mIHVuaXF1ZSBlbGVtZW50cy4KKyAgLy8gVHJhbnNsYXRlcyB0byBhbiBTVEwgc2V0LCBKYXZhIEhhc2hTZXQsIHNldCBpbiBQeXRob24sIGV0Yy4KKyAgLy8gTm90ZTogUEhQIGRvZXMgbm90IHN1cHBvcnQgc2V0cywgc28gaXQgaXMgdHJlYXRlZCBzaW1pbGFyIHRvIGEgTGlzdAorICBTdGFydFRlc3RHcm91cCggJ3Rlc3RTZXQnLCB0ZXN0X0NvbnRhaW5lcnMpOworICBzZXRvdXQgOj0gVEhhc2hTZXRJbXBsPEludGVnZXI+LkNyZWF0ZTsKKyAgZm9yIGogOj0gLTIgdG8gMiBkbworICBiZWdpbgorICAgIHNldG91dC5BZGQoIGogKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlKCd0ZXN0U2V0KHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKyAgZm9yIGogaW4gc2V0b3V0IGRvCisgIGJlZ2luCisgICAgaWYgZmlyc3QKKyAgICB0aGVuIGZpcnN0IDo9IEZhbHNlCisgICAgZWxzZSBDb25zb2xlLldyaXRlKCcsICcpOworICAgIENvbnNvbGUuV3JpdGUoSW50VG9TdHIoIGopKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKworICBzZXRpbiA6PSBjbGllbnQudGVzdFNldChzZXRvdXQpOworICBFeHBlY3QoIHNldGluLkNvdW50ID0gc2V0b3V0LkNvdW50LCAndGVzdFNldDogc2V0aW4uQ291bnQgPSBzZXRvdXQuQ291bnQnKTsKKyAgRXhwZWN0KCBzZXRpbi5Db3VudCA9IDUsICd0ZXN0U2V0OiBzZXRpbi5Db3VudCA9ICcrSW50VG9TdHIoc2V0aW4uQ291bnQpKTsKKyAgZm9yIGogOj0gLTIgdG8gMiBkbyAvLyB1bm9yZGVyZWQsIHdlIGNhbid0IHJlbHkgb24gdGhlIG9yZGVyID0+IHRlc3QgZm9yIGtub3duIGVsZW1lbnRzIG9ubHkKKyAgYmVnaW4KKyAgICBFeHBlY3QoIHNldGluLkNvbnRhaW5zKGopLCAndGVzdFNldDogc2V0aW4uQ29udGFpbnMoJytJbnRUb1N0cihqKSsnKSA9PiAnK0Jvb2xUb1N0cmluZyhzZXRpbi5Db250YWlucyhqKSkpOworICBlbmQ7CisKKyAgLy8gbGlzdDx0eXBlPjogQW4gb3JkZXJlZCBsaXN0IG9mIGVsZW1lbnRzLgorICAvLyBUcmFuc2xhdGVzIHRvIGFuIFNUTCB2ZWN0b3IsIEphdmEgQXJyYXlMaXN0LCBuYXRpdmUgYXJyYXlzIGluIHNjcmlwdGluZyBsYW5ndWFnZXMsIGV0Yy4KKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TGlzdCcsIHRlc3RfQ29udGFpbmVycyk7CisgIGxpc3RvdXQgOj0gVFRocmlmdExpc3RJbXBsPEludGVnZXI+LkNyZWF0ZTsKKyAgbGlzdG91dC5BZGQoICsxKTsKKyAgbGlzdG91dC5BZGQoIC0yKTsKKyAgbGlzdG91dC5BZGQoICszKTsKKyAgbGlzdG91dC5BZGQoIC00KTsKKyAgbGlzdG91dC5BZGQoIDApOworICBDb25zb2xlLldyaXRlKCd0ZXN0TGlzdCh7Jyk7CisgIGZpcnN0IDo9IFRydWU7CisgIGZvciBqIGluIGxpc3RvdXQgZG8KKyAgICBiZWdpbgorICAgIGlmIGZpcnN0CisgICAgdGhlbiBmaXJzdCA6PSBGYWxzZQorICAgIGVsc2UgQ29uc29sZS5Xcml0ZSgnLCAnKTsKKyAgICBDb25zb2xlLldyaXRlKEludFRvU3RyKCBqKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisKKyAgbGlzdGluIDo9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKKyAgRXhwZWN0KCBsaXN0aW4uQ291bnQgPSBsaXN0b3V0LkNvdW50LCAndGVzdExpc3Q6IGxpc3Rpbi5Db3VudCA9IGxpc3RvdXQuQ291bnQnKTsKKyAgRXhwZWN0KCBsaXN0aW4uQ291bnQgPSA1LCAndGVzdExpc3Q6IGxpc3Rpbi5Db3VudCA9ICcrSW50VG9TdHIobGlzdGluLkNvdW50KSk7CisgIEV4cGVjdCggbGlzdGluWzBdID0gKzEsICdsaXN0aW5bMF0gPSAnK0ludFRvU3RyKCBsaXN0aW5bMF0pKTsKKyAgRXhwZWN0KCBsaXN0aW5bMV0gPSAtMiwgJ2xpc3RpblsxXSA9ICcrSW50VG9TdHIoIGxpc3RpblsxXSkpOworICBFeHBlY3QoIGxpc3RpblsyXSA9ICszLCAnbGlzdGluWzJdID0gJytJbnRUb1N0ciggbGlzdGluWzJdKSk7CisgIEV4cGVjdCggbGlzdGluWzNdID0gLTQsICdsaXN0aW5bM10gPSAnK0ludFRvU3RyKCBsaXN0aW5bM10pKTsKKyAgRXhwZWN0KCBsaXN0aW5bNF0gPSAwLCAgJ2xpc3Rpbls0XSA9ICcrSW50VG9TdHIoIGxpc3Rpbls0XSkpOworCisgIC8vIGVudW1zCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouT05FKTsKKyAgRXhwZWN0KCByZXQgPSBUTnVtYmVyei5PTkUsICd0ZXN0RW51bShPTkUpID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouVFdPKTsKKyAgRXhwZWN0KCByZXQgPSBUTnVtYmVyei5UV08sICd0ZXN0RW51bShUV08pID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouVEhSRUUpOworICBFeHBlY3QoIHJldCA9IFROdW1iZXJ6LlRIUkVFLCAndGVzdEVudW0oVEhSRUUpID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouRklWRSk7CisgIEV4cGVjdCggcmV0ID0gVE51bWJlcnouRklWRSwgJ3Rlc3RFbnVtKEZJVkUpID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisgIHJldCA6PSBjbGllbnQudGVzdEVudW0oVE51bWJlcnouRUlHSFQpOworICBFeHBlY3QoIHJldCA9IFROdW1iZXJ6LkVJR0hULCAndGVzdEVudW0oRUlHSFQpID0gJytJbnRUb1N0cihPcmQocmV0KSkpOworCisKKyAgLy8gdHlwZWRlZgorICB1aWQgOj0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyk7CisgIEV4cGVjdCggdWlkID0gMzA5ODU4MjM1MDgyNTIzLCAndGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSA9ICcrSW50VG9TdHIodWlkKSk7CisKKworICAvLyBtYXBzIG9mIG1hcHMKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TWFwTWFwKDEpJywgdGVzdF9Db250YWluZXJzKTsKKyAgbW0gOj0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgIENvbnNvbGUuV3JpdGUoJyA9IHsnKTsKKyAgZm9yIGtleSBpbiBtbS5LZXlzIGRvCisgIGJlZ2luCisgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIGtleSkgKyAnID0+IHsnKTsKKyAgICBtMiA6PSBtbVtrZXldOworICAgIGZvciAgazIgaW4gbTIuS2V5cyBkbworICAgIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0ciggazIpICsgJyA9PiAnICsgSW50VG9TdHIoIG0yW2syXSkgKyAnLCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZSgnfSwgJyk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30nKTsKKworICAvLyB2ZXJpZnkgcmVzdWx0IGRhdGEKKyAgRXhwZWN0KCBtbS5Db3VudCA9IDIsICdtbS5Db3VudCA9ICcrSW50VG9TdHIobW0uQ291bnQpKTsKKyAgcG9zIDo9IG1tWzRdOworICBuZWcgOj0gbW1bLTRdOworICBmb3IgaiA6PSAxIHRvIDQgZG8KKyAgYmVnaW4KKyAgICBFeHBlY3QoIHBvc1tqXSAgPSBqLCAgJ3Bvc1tqXSAgPSAnK0ludFRvU3RyKHBvc1tqXSkpOworICAgIEV4cGVjdCggbmVnWy1qXSA9IC1qLCAnbmVnWy1qXSA9ICcrSW50VG9TdHIobmVnWy1qXSkpOworICBlbmQ7CisKKworCisgIC8vIGluc2FuaXR5CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdEluc2FuaXR5JywgdGVzdF9TdHJ1Y3RzKTsKKyAgaW5zYW5lIDo9IFRJbnNhbml0eUltcGwuQ3JlYXRlOworICBpbnNhbmUuVXNlck1hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIEludDY0Pi5DcmVhdGU7CisgIGluc2FuZS5Vc2VyTWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LkZJVkUsIDUwMDApOworICB0cnVjayA6PSBUWHRydWN0SW1wbC5DcmVhdGU7CisgIHRydWNrLlN0cmluZ190aGluZyA6PSAnVHJ1Y2snOworICB0cnVjay5CeXRlX3RoaW5nIDo9IC04OyAgLy8gYnl0ZSBpcyBzaWduZWQKKyAgdHJ1Y2suSTMyX3RoaW5nIDo9IDMyOworICB0cnVjay5JNjRfdGhpbmcgOj0gNjQ7CisgIGluc2FuZS5YdHJ1Y3RzIDo9IFRUaHJpZnRMaXN0SW1wbDxJWHRydWN0Pi5DcmVhdGU7CisgIGluc2FuZS5YdHJ1Y3RzLkFkZCggdHJ1Y2sgKTsKKyAgd2hvYSA6PSBjbGllbnQudGVzdEluc2FuaXR5KCBpbnNhbmUgKTsKKyAgQ29uc29sZS5Xcml0ZSgnID0geycpOworICBmb3Iga2V5NjQgaW4gd2hvYS5LZXlzIGRvCisgIGJlZ2luCisgICAgdmFsIDo9IHdob2Fba2V5NjRdOworICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBrZXk2NCkgKyAnID0+IHsnKTsKKyAgICBmb3IgazJfMiBpbiB2YWwuS2V5cyBkbworICAgIGJlZ2luCisgICAgICB2MiA6PSB2YWxbazJfMl07CisgICAgICBDb25zb2xlLldyaXRlKCBJbnRUb1N0ciggSW50ZWdlciggazJfMikpICsgJyA9PiB7Jyk7CisgICAgICB1c2VyTWFwIDo9IHYyLlVzZXJNYXA7CisgICAgICBDb25zb2xlLldyaXRlKCd7Jyk7CisgICAgICBpZiB1c2VyTWFwIDw+IG5pbCB0aGVuCisgICAgICBiZWdpbgorICAgICAgICBmb3IgazMgaW4gdXNlck1hcC5LZXlzIGRvCisgICAgICAgIGJlZ2luCisgICAgICAgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIEludGVnZXIoIGszKSkgKyAnID0+ICcgKyBJbnRUb1N0ciggdXNlck1hcFtrM10pICsgJywgJyk7CisgICAgICAgIGVuZDsKKyAgICAgIGVuZCBlbHNlCisgICAgICBiZWdpbgorICAgICAgICBDb25zb2xlLldyaXRlKCdudWxsJyk7CisgICAgICBlbmQ7CisgICAgICBDb25zb2xlLldyaXRlKCd9LCAnKTsKKyAgICAgIHh0cnVjdHMgOj0gdjIuWHRydWN0czsKKyAgICAgIENvbnNvbGUuV3JpdGUoJ3snKTsKKworICAgICAgaWYgeHRydWN0cyA8PiBuaWwgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgZm9yIHggaW4geHRydWN0cyBkbworICAgICAgICBiZWdpbgorICAgICAgICAgIENvbnNvbGUuV3JpdGUoJ3siJyArIHguU3RyaW5nX3RoaW5nICsgJyIsICcgKworICAgICAgICAgICAgSW50VG9TdHIoIHguQnl0ZV90aGluZykgKyAnLCAnICsKKyAgICAgICAgICAgIEludFRvU3RyKCB4LkkzMl90aGluZykgKyAnLCAnICsKKyAgICAgICAgICAgIEludFRvU3RyKCB4LkkzMl90aGluZykgKyAnfSwgJyk7CisgICAgICAgIGVuZDsKKyAgICAgIGVuZCBlbHNlCisgICAgICBiZWdpbgorICAgICAgICBDb25zb2xlLldyaXRlKCdudWxsJyk7CisgICAgICBlbmQ7CisgICAgICBDb25zb2xlLldyaXRlKCd9Jyk7CisgICAgICBDb25zb2xlLldyaXRlKCd9LCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZSgnfSwgJyk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30nKTsKKworICAoKioKKyAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAqCisgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgfSwKKyAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgKiAgIH0KKyAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAqKQorCisgIC8vIHZlcmlmeSByZXN1bHQgZGF0YQorICBFeHBlY3QoIHdob2EuQ291bnQgPSAyLCAnd2hvYS5Db3VudCA9ICcrSW50VG9TdHIod2hvYS5Db3VudCkpOworICAvLworICBmaXJzdF9tYXAgIDo9IHdob2FbMV07CisgIHNlY29uZF9tYXAgOj0gd2hvYVsyXTsKKyAgRXhwZWN0KCBmaXJzdF9tYXAuQ291bnQgPSAyLCAnZmlyc3RfbWFwLkNvdW50ID0gJytJbnRUb1N0cihmaXJzdF9tYXAuQ291bnQpKTsKKyAgRXhwZWN0KCBzZWNvbmRfbWFwLkNvdW50ID0gMSwgJ3NlY29uZF9tYXAuQ291bnQgPSAnK0ludFRvU3RyKHNlY29uZF9tYXAuQ291bnQpKTsKKyAgLy8KKyAgbG9vbmV5IDo9IHNlY29uZF9tYXBbVE51bWJlcnouU0lYXTsKKyAgRXhwZWN0KCBBc3NpZ25lZChsb29uZXkpLCAnQXNzaWduZWQobG9vbmV5KSA9ICcrQm9vbFRvU3RyaW5nKEFzc2lnbmVkKGxvb25leSkpKTsKKyAgRXhwZWN0KCBub3QgbG9vbmV5Ll9faXNzZXRfVXNlck1hcCwgJ2xvb25leS5fX2lzc2V0X1VzZXJNYXAgPSAnK0Jvb2xUb1N0cmluZyhsb29uZXkuX19pc3NldF9Vc2VyTWFwKSk7CisgIEV4cGVjdCggbm90IGxvb25leS5fX2lzc2V0X1h0cnVjdHMsICdsb29uZXkuX19pc3NldF9YdHJ1Y3RzID0gJytCb29sVG9TdHJpbmcobG9vbmV5Ll9faXNzZXRfWHRydWN0cykpOworICAvLworICBmb3IgcmV0IGluIFtUTnVtYmVyei5UV08sIFROdW1iZXJ6LlRIUkVFXSBkbyBiZWdpbgorICAgIGNyYXp5IDo9IGZpcnN0X21hcFtyZXRdOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCdmaXJzdF9tYXBbJytpbnRUb1N0cihPcmQocmV0KSkrJ10nKTsKKworICAgIEV4cGVjdCggY3JhenkuX19pc3NldF9Vc2VyTWFwLCAnY3JhenkuX19pc3NldF9Vc2VyTWFwID0gJytCb29sVG9TdHJpbmcoY3JhenkuX19pc3NldF9Vc2VyTWFwKSk7CisgICAgRXhwZWN0KCBjcmF6eS5fX2lzc2V0X1h0cnVjdHMsICdjcmF6eS5fX2lzc2V0X1h0cnVjdHMgPSAnK0Jvb2xUb1N0cmluZyhjcmF6eS5fX2lzc2V0X1h0cnVjdHMpKTsKKworICAgIEV4cGVjdCggY3JhenkuVXNlck1hcC5Db3VudCA9IGluc2FuZS5Vc2VyTWFwLkNvdW50LCAnY3JhenkuVXNlck1hcC5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcC5Db3VudCkpOworICAgIGZvciBwYWlyIGluIGluc2FuZS5Vc2VyTWFwIGRvIGJlZ2luCisgICAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXBbcGFpci5LZXldID0gcGFpci5WYWx1ZSwgJ2NyYXp5LlVzZXJNYXBbJytJbnRUb1N0cihPcmQocGFpci5rZXkpKSsnXSA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcFtwYWlyLktleV0pKTsKKyAgICBlbmQ7CisKKyAgICBFeHBlY3QoIGNyYXp5Llh0cnVjdHMuQ291bnQgPSBpbnNhbmUuWHRydWN0cy5Db3VudCwgJ2NyYXp5Llh0cnVjdHMuQ291bnQgPSAnK0ludFRvU3RyKGNyYXp5Llh0cnVjdHMuQ291bnQpKTsKKyAgICBmb3IgYXJnMCA6PSAwIHRvIGluc2FuZS5YdHJ1Y3RzLkNvdW50LTEgZG8gYmVnaW4KKyAgICAgIGhlbGxvICAgOj0gaW5zYW5lLlh0cnVjdHNbYXJnMF07CisgICAgICBnb29kYnllIDo9IGNyYXp5Llh0cnVjdHNbYXJnMF07CisgICAgICBFeHBlY3QoIGdvb2RieWUuU3RyaW5nX3RoaW5nID0gaGVsbG8uU3RyaW5nX3RoaW5nLCAnZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAnK2dvb2RieWUuU3RyaW5nX3RoaW5nKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5CeXRlX3RoaW5nID0gaGVsbG8uQnl0ZV90aGluZywgJ2dvb2RieWUuQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5CeXRlX3RoaW5nKSk7CisgICAgICBFeHBlY3QoIGdvb2RieWUuSTMyX3RoaW5nID0gaGVsbG8uSTMyX3RoaW5nLCAnZ29vZGJ5ZS5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTMyX3RoaW5nKSk7CisgICAgICBFeHBlY3QoIGdvb2RieWUuSTY0X3RoaW5nID0gaGVsbG8uSTY0X3RoaW5nLCAnZ29vZGJ5ZS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTY0X3RoaW5nKSk7CisgICAgZW5kOworICBlbmQ7CisKKworICAvLyBtdWx0aSBhcmdzCisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE11bHRpJywgdGVzdF9CYXNlVHlwZXMpOworICBhcmcwIDo9IDE7CisgIGFyZzEgOj0gMjsKKyAgYXJnMiA6PSBIaWdoKEludDY0KTsKKyAgYXJnMyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8U21hbGxJbnQsIHN0cmluZz4uQ3JlYXRlOworICBhcmczLkFkZE9yU2V0VmFsdWUoIDEsICdvbmUnKTsKKyAgYXJnNCA6PSBUTnVtYmVyei5GSVZFOworICBhcmc1IDo9IDUwMDAwMDA7CisgIENvbnNvbGUuV3JpdGVMaW5lKCdUZXN0IE11bHRpKCcgKyBJbnRUb1N0ciggYXJnMCkgKyAnLCcgKworICAgIEludFRvU3RyKCBhcmcxKSArICcsJyArIEludFRvU3RyKCBhcmcyKSArICcsJyArCisgICAgYXJnMy5Ub1N0cmluZyArICcsJyArIEludFRvU3RyKCBJbnRlZ2VyKCBhcmc0KSkgKyAnLCcgKworICAgICAgSW50VG9TdHIoIGFyZzUpICsgJyknKTsKKworICBpIDo9IGNsaWVudC50ZXN0TXVsdGkoIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICBFeHBlY3QoIGkuU3RyaW5nX3RoaW5nID0gJ0hlbGxvMicsICd0ZXN0TXVsdGk6IGkuU3RyaW5nX3RoaW5nID0gIicraS5TdHJpbmdfdGhpbmcrJyInKTsKKyAgRXhwZWN0KCBpLkJ5dGVfdGhpbmcgPSBhcmcwLCAndGVzdE11bHRpOiBpLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGkuQnl0ZV90aGluZykpOworICBFeHBlY3QoIGkuSTMyX3RoaW5nID0gYXJnMSwgJ3Rlc3RNdWx0aTogaS5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGkuSTMyX3RoaW5nKSk7CisgIEV4cGVjdCggaS5JNjRfdGhpbmcgPSBhcmcyLCAndGVzdE11bHRpOiBpLkk2NF90aGluZyA9ICcrSW50VG9TdHIoaS5JNjRfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAndGVzdE11bHRpOiBpLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X1N0cmluZ190aGluZykpOworICBFeHBlY3QoIGkuX19pc3NldF9CeXRlX3RoaW5nLCAndGVzdE11bHRpOiBpLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9CeXRlX3RoaW5nKSk7CisgIEV4cGVjdCggaS5fX2lzc2V0X0kzMl90aGluZywgJ3Rlc3RNdWx0aTogaS5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JMzJfdGhpbmcpKTsKKyAgRXhwZWN0KCBpLl9faXNzZXRfSTY0X3RoaW5nLCAndGVzdE11bHRpOiBpLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0k2NF90aGluZykpOworCisgIC8vIG11bHRpIGV4Y2VwdGlvbgorICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbigxKScsIHRlc3RfRXhjZXB0aW9ucyk7CisgIHRyeQorICAgIGkgOj0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiggJ25lZWQgbW9yZSBwaXp6YScsICdydW4gb3V0IG9mIGJlZXInKTsKKyAgICBFeHBlY3QoIGkuU3RyaW5nX3RoaW5nID0gJ3J1biBvdXQgb2YgYmVlcicsICdpLlN0cmluZ190aGluZyA9ICInICtpLlN0cmluZ190aGluZysgJyInKTsKKyAgICBFeHBlY3QoIGkuX19pc3NldF9TdHJpbmdfdGhpbmcsICdpLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X1N0cmluZ190aGluZykpOworICAgIHsgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZSwgdGhlc2UgZmllbGRzIGFyZSBkZWZhdWx0LXNlcmlhbGl6ZWQKKyAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfQnl0ZV90aGluZywgJ2kuX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKKyAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfSTMyX3RoaW5nLCAnaS5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JMzJfdGhpbmcpKTsKKyAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfSTY0X3RoaW5nLCAnaS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JNjRfdGhpbmcpKTsKKyAgICB9CisgIGV4Y2VwdAorICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGlFeGNlcHRpb24oWGNlcHRpb24pJywgdGVzdF9FeGNlcHRpb25zKTsKKyAgdHJ5CisgICAgaSA6PSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCAnWGNlcHRpb24nLCAnc2Vjb25kIHRlc3QnKTsKKyAgICBFeHBlY3QoIEZBTFNFLCAndGVzdE11bHRpRXhjZXB0aW9uKCcnWGNlcHRpb24nJyk6IG11c3QgdHJvdyBhbiBleGNlcHRpb24nKTsKKyAgZXhjZXB0CisgICAgb24geDpUWGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIEV4cGVjdCggeC5fX2lzc2V0X0Vycm9yQ29kZSwgJ3guX19pc3NldF9FcnJvckNvZGUgPSAnK0Jvb2xUb1N0cmluZyh4Ll9faXNzZXRfRXJyb3JDb2RlKSk7CisgICAgICBFeHBlY3QoIHguX19pc3NldF9NZXNzYWdlXywgICd4Ll9faXNzZXRfTWVzc2FnZV8gPSAnK0Jvb2xUb1N0cmluZyh4Ll9faXNzZXRfTWVzc2FnZV8pKTsKKyAgICAgIEV4cGVjdCggeC5FcnJvckNvZGUgPSAxMDAxLCAneC5FcnJvckNvZGUgPSAnK0ludFRvU3RyKHguRXJyb3JDb2RlKSk7CisgICAgICBFeHBlY3QoIHguTWVzc2FnZV8gPSAnVGhpcyBpcyBhbiBYY2VwdGlvbicsICd4Lk1lc3NhZ2UgPSAiJyt4Lk1lc3NhZ2VfKyciJyk7CisgICAgZW5kOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGlFeGNlcHRpb24oWGNlcHRpb24yKScsIHRlc3RfRXhjZXB0aW9ucyk7CisgIHRyeQorICAgIGkgOj0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiggJ1hjZXB0aW9uMicsICd0aGlyZCB0ZXN0Jyk7CisgICAgRXhwZWN0KCBGQUxTRSwgJ3Rlc3RNdWx0aUV4Y2VwdGlvbignJ1hjZXB0aW9uMicnKTogbXVzdCB0cm93IGFuIGV4Y2VwdGlvbicpOworICBleGNlcHQKKyAgICBvbiB4OlRYY2VwdGlvbjIgZG8gYmVnaW4KKyAgICAgIEV4cGVjdCggeC5fX2lzc2V0X0Vycm9yQ29kZSwgJ3guX19pc3NldF9FcnJvckNvZGUgPSAnK0Jvb2xUb1N0cmluZyh4Ll9faXNzZXRfRXJyb3JDb2RlKSk7CisgICAgICBFeHBlY3QoIHguX19pc3NldF9TdHJ1Y3RfdGhpbmcsICAneC5fX2lzc2V0X1N0cnVjdF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguX19pc3NldF9TdHJ1Y3RfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggeC5FcnJvckNvZGUgPSAyMDAyLCAneC5FcnJvckNvZGUgPSAnK0ludFRvU3RyKHguRXJyb3JDb2RlKSk7CisgICAgICBFeHBlY3QoIHguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMicsICd4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgPSAiJyt4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcrJyInKTsKKyAgICAgIEV4cGVjdCggeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9TdHJpbmdfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfU3RyaW5nX3RoaW5nKSk7CisgICAgICB7IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRydWUsIHRoZXNlIGZpZWxkcyBhcmUgZGVmYXVsdC1zZXJpYWxpemVkCisgICAgICBFeHBlY3QoIG5vdCB4LlN0cnVjdF90aGluZy5fX2lzc2V0X0J5dGVfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyh4LlN0cnVjdF90aGluZy5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggbm90IHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTMyX3RoaW5nLCAneC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyh4LlN0cnVjdF90aGluZy5fX2lzc2V0X0kzMl90aGluZykpOworICAgICAgRXhwZWN0KCBub3QgeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JNjRfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTY0X3RoaW5nKSk7CisgICAgICB9CisgICAgZW5kOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICBlbmQ7CisKKworICAvLyBvbmV3YXkgZnVuY3Rpb25zCisgIFN0YXJ0VGVzdEdyb3VwKCAnVGVzdCBPbmV3YXkoMSknLCB0ZXN0X1Vua25vd24pOworICBjbGllbnQudGVzdE9uZXdheSgxKTsKKyAgRXhwZWN0KCBUUlVFLCAnVGVzdCBPbmV3YXkoMSknKTsgIC8vIHN1Y2Nlc3MgOj0gbm8gZXhjZXB0aW9uCisKKyAgLy8gY2FsbCB0aW1lCisgIHskSUZERUYgUGVyZlRlc3R9CisgIFN0YXJ0VGVzdEdyb3VwKCAnVGVzdCBDYWxsdGltZSgpJyk7CisgIFN0YXJ0VGljayA6PSBHZXRUaWNrQ291bnQ7CisgIGZvciBrIDo9IDAgdG8gMTAwMCAtIDEgZG8KKyAgYmVnaW4KKyAgICBjbGllbnQudGVzdFZvaWQoKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnID0gJyArIEZsb2F0VG9TdHIoIChHZXRUaWNrQ291bnQgLSBTdGFydFRpY2spIC8gMTAwMCApICsgJyBtcyBhIHRlc3RWb2lkKCkgY2FsbCcgKTsKKyAgeyRFTkRJRiBQZXJmVGVzdH0KKworICAvLyBubyBtb3JlIHRlc3RzIGhlcmUKKyAgU3RhcnRUZXN0R3JvdXAoICcnLCB0ZXN0X1Vua25vd24pOworZW5kOworCisKK3skSUZERUYgU3VwcG9ydHNBc3luY30KK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkNsaWVudEFzeW5jVGVzdDsKK3ZhcgorICBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JQXN5bmM7CisgIHMgOiBzdHJpbmc7CisgIGk4IDogU2hvcnRJbnQ7CitiZWdpbgorICBTdGFydFRlc3RHcm91cCggJ0FzeW5jIFRlc3RzJywgdGVzdF9Vbmtub3duKTsKKyAgY2xpZW50IDo9IFRUaHJpZnRUZXN0LlRDbGllbnQuQ3JlYXRlKCBGUHJvdG9jb2wpOworICBGVHJhbnNwb3J0Lk9wZW47CisKKyAgLy8gb25ld2F5IHZvaWQgZnVuY3Rpb25zCisgIGNsaWVudC50ZXN0T25ld2F5QXN5bmMoMSkuV2FpdDsKKyAgRXhwZWN0KCBUUlVFLCAnVGVzdCBPbmV3YXkoMSknKTsgIC8vIHN1Y2Nlc3MgOj0gbm8gZXhjZXB0aW9uCisKKyAgLy8gbm9ybWFsIGZ1bmN0aW9ucworICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nQXN5bmMoSFVHRV9URVNUX1NUUklORykuVmFsdWU7CisgIEV4cGVjdCggbGVuZ3RoKHMpID0gbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpLAorICAgICAgICAgICd0ZXN0U3RyaW5nKCBsZW5ndGgoSFVHRV9URVNUX1NUUklORykgPSAnK0ludFRvU3RyKExlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSkrJykgJworICAgICAgICAgKyc9PiBsZW5ndGgocmVzdWx0KSA9ICcrSW50VG9TdHIoTGVuZ3RoKHMpKSk7CisKKyAgaTggOj0gY2xpZW50LnRlc3RCeXRlKDEpLlZhbHVlOworICBFeHBlY3QoIGk4ID0gMSwgJ3Rlc3RCeXRlKDEpID0gJyArIEludFRvU3RyKCBpOCApKTsKK2VuZDsKK3skRU5ESUZ9CisKKworeyRJRkRFRiBTdHJlc3NUZXN0fQorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU3RyZXNzVGVzdChjb25zdCBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JZmFjZSk7CitiZWdpbgorICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgdHJ5CisgICAgICBpZiBub3QgRlRyYW5zcG9ydC5Jc09wZW4gdGhlbiBGVHJhbnNwb3J0Lk9wZW47ICAgLy8gcmUtb3BlbiBjb25uZWN0aW9uLCBzZXJ2ZXIgaGFzIGFscmVhZHkgY2xvc2VkCisgICAgICB0cnkKKyAgICAgICAgY2xpZW50LnRlc3RTdHJpbmcoJ1Rlc3QnKTsKKyAgICAgICAgV3JpdGUoJy4nKTsKKyAgICAgIGZpbmFsbHkKKyAgICAgICAgaWYgRlRyYW5zcG9ydC5Jc09wZW4gdGhlbiBGVHJhbnNwb3J0LkNsb3NlOworICAgICAgZW5kOworICAgIGV4Y2VwdAorICAgICAgb24gZTpFeGNlcHRpb24gZG8gV3JpdGVsbigjMTArZS5tZXNzYWdlKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKK3skRU5ESUZ9CisKKworZnVuY3Rpb24gVENsaWVudFRocmVhZC5QcmVwYXJlQmluYXJ5RGF0YSggYVJhbmRvbURpc3QgOiBCb29sZWFuOyBhU2l6ZSA6IFRUZXN0U2l6ZSkgOiBUQnl0ZXM7Cit2YXIgaSA6IEludGVnZXI7CitiZWdpbgorICBjYXNlIGFTaXplIG9mCisgICAgRW1wdHkgICAgICAgICAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgMCk7CisgICAgTm9ybWFsICAgICAgICAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgJDEwMCk7CisgICAgQnl0ZUFycmF5VGVzdCAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgU2l6ZU9mKFRCeXRlQXJyYXkpICsgMTI4KTsKKyAgICBQaXBlV3JpdGVMaW1pdCA6IFNldExlbmd0aCggcmVzdWx0LCA2NTUzNSArIDEyOCk7CisgIGVsc2UKKyAgICByYWlzZSBFQXJndW1lbnRFeGNlcHRpb24uQ3JlYXRlKCdhU2l6ZScpOworICBlbmQ7CisKKyAgQVNTRVJUKCBMb3cocmVzdWx0KSA9IDApOworICBpZiBMZW5ndGgocmVzdWx0KSA9IDAgdGhlbiBFeGl0OworCisgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgIGlmIG5vdCBhUmFuZG9tRGlzdCB0aGVuIGJlZ2luCisgICAgZm9yIGkgOj0gTG93KHJlc3VsdCkgdG8gSGlnaChyZXN1bHQpIGRvIGJlZ2luCisgICAgICByZXN1bHRbaV0gOj0gaSBtb2QgJDEwMDsKKyAgICBlbmQ7CisgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24gb2YgYWxsIDI1NiB2YWx1ZXMKKyAgRmlsbENoYXIoIHJlc3VsdFswXSwgTGVuZ3RoKHJlc3VsdCkgKiBTaXplT2YocmVzdWx0WzBdKSwgJDApOworICBmb3IgaSA6PSBMb3cocmVzdWx0KSB0byBIaWdoKHJlc3VsdCkgZG8gYmVnaW4KKyAgICByZXN1bHRbaV0gOj0gQnl0ZSggUmFuZG9tKCQxMDApKTsKKyAgZW5kOworZW5kOworCisKK3skSUZERUYgV2luNjR9Citwcm9jZWR1cmUgVENsaWVudFRocmVhZC5Vc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7Cit2YXIgYSxiIDogSW50NjQ7CitiZWdpbgorICBhIDo9IDE7CisgIGIgOj0gMjsKKyAgVGhyaWZ0LlV0aWxzLkludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggYSxiKTsKKyAgRXhwZWN0KCBhID0gMywgJ0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCcpOworZW5kOworeyRFTkRJRn0KKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5KU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OworLy8gVGVzdHMgb25seSB0aGVuIHJlYWQvd3JpdGUgcHJvY2VkdXJlcyBvZiB0aGUgSlNPTiBwcm90b2NvbAorLy8gQWxsIHRlc3RzIHN1Y2NlZWQsIGlmIHdlIGNhbiByZWFkIHdoYXQgd2Ugd3JvdGUgYmVmb3JlCisvLyBOb3RlIHRoYXQgcGFzc2luZyB0aGlzIHRlc3QgZG9lcyBub3QgaW1wbHksIHRoYXQgb3VyIEpTT04gaXMgcmVhbGx5IGNvbXBhdGlibGUgdG8gd2hhdAorLy8gb3RoZXIgY2xpZW50cyBvciBzZXJ2ZXJzIGV4cGVjdCBhcyB0aGUgcmVhbCBKU09OLiBUaGlzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyB0ZXN0LgordmFyIHByb3QgICA6IElQcm90b2NvbDsKKyAgICBzdG0gICAgOiBUU3RyaW5nU3RyZWFtOworICAgIGxpc3QgICA6IFRUaHJpZnRMaXN0OworICAgIGJpbmFyeSwgYmluUmVhZCwgZW1wdHlCaW5hcnkgOiBUQnl0ZXM7CisgICAgaSxpRXJyIDogSW50ZWdlcjsKK2NvbnN0CisgIFRFU1RfU0hPUlQgICA9IFNob3J0SW50KCAkRkUpOworICBURVNUX1NNQUxMICAgPSBTbWFsbEludCggJEZFREMpOworICBURVNUX0xPTkcgICAgPSBMb25nSW50KCAkRkVEQ0JBOTgpOworICBURVNUX0k2NCAgICAgPSBJbnQ2NCggJEZFRENCQTk4NzY1NDMyMTApOworICBURVNUX0RPVUJMRSAgPSAtMS4yMzRlLTU2OworICBERUxUQV9ET1VCTEUgPSBURVNUX0RPVUJMRSAqIDFlLTE0OworICBURVNUX1NUUklORyAgPSAnYWJjLScjJDAwRTQjJDAwZjYjJDAwZmM7IC8vIGdlcm1hbiB1bWxhdXRzIChlbi11czogImZ1bm55IGNoYXJzIikKKyAgLy8gVGVzdCBUSFJJRlQtMjMzNiBhbmQgVEhSSUZULTM0MDQgd2l0aCBVKzFEMTFFIChHIENsZWYgc3ltYm9sKSBhbmQgJ9Cg0YPRgdGB0LrQvtC1INCd0LDQt9Cy0LDQvdC40LUnOworICBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQgPSAjJDFkMTFlJyAnIyQwNDIwIyQwNDQzIyQwNDQxIyQwNDQxIyQwNDNhIyQwNDNlIyQwNDM1JyAnIyQwNDFkIyQwNDMwIyQwNDM3IyQwNDMyIyQwNDMwIyQwNDNkIyQwNDM4IyQwNDM1OworICBHX0NMRUZfQU5EX0NZUklMTElDX0pTT04gPSAnIlx1ZDgzNFx1ZGQxZSBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Iic7CisgIC8vIHRlc3QgYm90aCBwb3NzaWJsZSBzb2xpZHVzIGVuY29kaW5ncworICBTT0xJRFVTX0pTT05fREFUQSA9ICcib25lL3R3b1wvdGhyZWUiJzsKKyAgU09MSURVU19FWENQRUNURUQgPSAnb25lL3R3by90aHJlZSc7CitiZWdpbgorICBzdG0gIDo9IFRTdHJpbmdTdHJlYW0uQ3JlYXRlOworICB0cnkKKyAgICBTdGFydFRlc3RHcm91cCggJ0pzb25Qcm90b2NvbFRlc3QnLCB0ZXN0X1Vua25vd24pOworCisgICAgLy8gcHJlcGFyZSBiaW5hcnkgZGF0YQorICAgIGJpbmFyeSA6PSBQcmVwYXJlQmluYXJ5RGF0YSggRkFMU0UsIE5vcm1hbCk7CisgICAgU2V0TGVuZ3RoKCBlbXB0eUJpbmFyeSwgMCk7IC8vIGVtcHR5IGJpbmFyeSBkYXRhIGJsb2NrCisKKyAgICAvLyBvdXRwdXQgc2V0dXAKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIG5pbCwgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSkpOworCisgICAgLy8gd3JpdGUKKyAgICBJbml0KCBsaXN0LCBUVHlwZS5TdHJpbmdfLCA5KTsKKyAgICBwcm90LldyaXRlTGlzdEJlZ2luKCBsaXN0KTsKKyAgICBwcm90LldyaXRlQm9vbCggVFJVRSk7CisgICAgcHJvdC5Xcml0ZUJvb2woIEZBTFNFKTsKKyAgICBwcm90LldyaXRlQnl0ZSggVEVTVF9TSE9SVCk7CisgICAgcHJvdC5Xcml0ZUkxNiggVEVTVF9TTUFMTCk7CisgICAgcHJvdC5Xcml0ZUkzMiggVEVTVF9MT05HKTsKKyAgICBwcm90LldyaXRlSTY0KCBURVNUX0k2NCk7CisgICAgcHJvdC5Xcml0ZURvdWJsZSggVEVTVF9ET1VCTEUpOworICAgIHByb3QuV3JpdGVTdHJpbmcoIFRFU1RfU1RSSU5HKTsKKyAgICBwcm90LldyaXRlQmluYXJ5KCBiaW5hcnkpOworICAgIHByb3QuV3JpdGVTdHJpbmcoICcnKTsgIC8vIGVtcHR5IHN0cmluZworICAgIHByb3QuV3JpdGVCaW5hcnkoIGVtcHR5QmluYXJ5KTsgLy8gZW1wdHkgYmluYXJ5IGRhdGEgYmxvY2sKKyAgICBwcm90LldyaXRlTGlzdEVuZDsKKworICAgIC8vIGlucHV0IHNldHVwCisgICAgRXhwZWN0KCBzdG0uUG9zaXRpb24gPSBzdG0uU2l6ZSwgJ1N0cmVhbSBwb3NpdGlvbi9sZW5ndGggYWZ0ZXIgd3JpdGUnKTsKKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSksIG5pbCkpOworCisgICAgLy8gcmVhZCBhbmQgY29tcGFyZQorICAgIGxpc3QgOj0gcHJvdC5SZWFkTGlzdEJlZ2luOworICAgIEV4cGVjdCggbGlzdC5FbGVtZW50VHlwZSA9IFRUeXBlLlN0cmluZ18sICdsaXN0IGVsZW1lbnQgdHlwZScpOworICAgIEV4cGVjdCggbGlzdC5Db3VudCA9IDksICdsaXN0IGVsZW1lbnQgY291bnQnKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZEJvb2wsICdXcml0ZUJvb2wvUmVhZEJvb2w6IFRSVUUnKTsKKyAgICBFeHBlY3QoIG5vdCBwcm90LlJlYWRCb29sLCAnV3JpdGVCb29sL1JlYWRCb29sOiBGQUxTRScpOworICAgIEV4cGVjdCggcHJvdC5SZWFkQnl0ZSAgID0gVEVTVF9TSE9SVCwgICdXcml0ZUJ5dGUvUmVhZEJ5dGUnKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZEkxNiAgICA9IFRFU1RfU01BTEwsICAnV3JpdGVJMTYvUmVhZEkxNicpOworICAgIEV4cGVjdCggcHJvdC5SZWFkSTMyICAgID0gVEVTVF9MT05HLCAgICdXcml0ZUkzMi9SZWFkSTMyJyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRJNjQgICAgPSBURVNUX0k2NCwgICAgJ1dyaXRlSTY0L1JlYWRJNjQnKTsKKyAgICBFeHBlY3QoIGFicyhwcm90LlJlYWREb3VibGUtVEVTVF9ET1VCTEUpIDwgYWJzKERFTFRBX0RPVUJMRSksICdXcml0ZURvdWJsZS9SZWFkRG91YmxlJyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBURVNUX1NUUklORywgJ1dyaXRlU3RyaW5nL1JlYWRTdHJpbmcnKTsKKyAgICBiaW5SZWFkIDo9IHByb3QuUmVhZEJpbmFyeTsKKyAgICBFeHBlY3QoIExlbmd0aChwcm90LlJlYWRTdHJpbmcpID0gMCwgJ1dyaXRlU3RyaW5nL1JlYWRTdHJpbmcgKGVtcHR5IHN0cmluZyknKTsKKyAgICBFeHBlY3QoIExlbmd0aChwcm90LlJlYWRCaW5hcnkpID0gMCwgJ2VtcHR5IFdyaXRlQmluYXJ5L1JlYWRCaW5hcnkgKGVtcHR5IGRhdGEgYmxvY2spJyk7CisgICAgcHJvdC5SZWFkTGlzdEVuZDsKKworICAgIC8vIHRlc3QgYmluYXJ5IGRhdGEKKyAgICBFeHBlY3QoIExlbmd0aChiaW5hcnkpID0gTGVuZ3RoKGJpblJlYWQpLCAnQmluYXJ5IGRhdGEgbGVuZ3RoIGNoZWNrJyk7CisgICAgaUVyciA6PSAtMTsKKyAgICBmb3IgaSA6PSBMb3coYmluYXJ5KSB0byBIaWdoKGJpbmFyeSkgZG8gYmVnaW4KKyAgICAgIGlmIGJpbmFyeVtpXSA8PiBiaW5SZWFkW2ldIHRoZW4gYmVnaW4KKyAgICAgICAgaUVyciA6PSBpOworICAgICAgICBCcmVhazsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisgICAgaWYgaUVyciA8IDAKKyAgICB0aGVuIEV4cGVjdCggVFJVRSwgICdCaW5hcnkgZGF0YSBjaGVjayAoJytJbnRUb1N0cihMZW5ndGgoYmluYXJ5KSkrJyBCeXRlcyknKQorICAgIGVsc2UgRXhwZWN0KCBGQUxTRSwgJ0JpbmFyeSBkYXRhIGNoZWNrIGF0IG9mZnNldCAnK0ludFRvU3RyKGlFcnIpKTsKKworICAgIEV4cGVjdCggc3RtLlBvc2l0aW9uID0gc3RtLlNpemUsICdTdHJlYW0gcG9zaXRpb24gYWZ0ZXIgcmVhZCcpOworCisKKyAgICAvLyBTb2xpZHVzIGNhbiBiZSBlbmNvZGVkIGluIHR3byB3YXlzLiBNYWtlIHN1cmUgd2UgY2FuIHJlYWQgYm90aAorICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHN0bS5TaXplICAgICA6PSAwOworICAgIHN0bS5Xcml0ZVN0cmluZyhTT0xJRFVTX0pTT05fREFUQSk7CisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpLCBuaWwpKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IFNPTElEVVNfRVhDUEVDVEVELCAnU29saWR1cyBlbmNvZGluZycpOworCisKKyAgICAvLyBXaWRlY2hhcnMgc2hvdWxkIHdvcmsgdG9vLiBEbyB0aGV5PworICAgIC8vIEFmdGVyIHdyaXRpbmcsIHdlIGVuc3VyZSB0aGF0IHdlIGFyZSBhYmxlIHRvIHJlYWQgaXQgYmFjaworICAgIC8vIFdlIGNhbid0IGFzc3VtZSBoZXgtZW5jb2RpbmcsIHNpbmNlIChuZWFybHkpIGFueSBVbmljb2RlIGNoYXIgaXMgdmFsaWQgSlNPTgorICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHN0bS5TaXplICAgICA6PSAwOworICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgICAgbmlsLCBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpKSk7CisgICAgcHJvdC5Xcml0ZVN0cmluZyggR19DTEVGX0FORF9DWVJJTExJQ19URVhUKTsKKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSksIG5pbCkpOworICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gR19DTEVGX0FORF9DWVJJTExJQ19URVhULCAnV3JpdGluZyBKU09OIHdpdGggY2hhcnMgPiA4IGJpdCcpOworCisgICAgLy8gV2lkZWNoYXJzIHNob3VsZCB3b3JrIHdpdGggaGV4LWVuY29kaW5nIHRvby4gRG8gdGhleT8KKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBzdG0uU2l6ZSAgICAgOj0gMDsKKyAgICBzdG0uV3JpdGVTdHJpbmcoIEdfQ0xFRl9BTkRfQ1lSSUxMSUNfSlNPTik7CisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpLCBuaWwpKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IEdfQ0xFRl9BTkRfQ1lSSUxMSUNfVEVYVCwgJ1JlYWRpbmcgSlNPTiB3aXRoIGNoYXJzID4gOCBiaXQnKTsKKworCisgIGZpbmFsbHkKKyAgICBzdG0uRnJlZTsKKyAgICBwcm90IDo9IG5pbDsgIC8vLT4gUmVsZWFzZQorICAgIFN0YXJ0VGVzdEdyb3VwKCAnJywgdGVzdF9Vbmtub3duKTsgIC8vIG5vIG1vcmUgdGVzdHMgaGVyZQorICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU3RhcnRUZXN0R3JvdXAoIGNvbnN0IGFHcm91cCA6IHN0cmluZzsgY29uc3QgYVRlc3QgOiBUVGVzdEdyb3VwKTsKK2JlZ2luCisgIEZUZXN0R3JvdXAgOj0gYUdyb3VwOworICBGQ3VycmVudFRlc3QgOj0gYVRlc3Q7CisKKyAgSW5jbHVkZSggRkV4ZWN1dGVkLCBhVGVzdCk7CisKKyAgaWYgRlRlc3RHcm91cCA8PiAnJyB0aGVuIGJlZ2luCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJycpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCBhR3JvdXArJyB0ZXN0cycpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCBTdHJpbmdPZkNoYXIoJy0nLDYwKSk7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5FeHBlY3QoIGFUZXN0UmVzdWx0IDogQm9vbGVhbjsgY29uc3QgYVRlc3RJbmZvIDogc3RyaW5nKTsKK2JlZ2luCisgIGlmIGFUZXN0UmVzdWx0ICB0aGVuIGJlZ2luCisgICAgSW5jKEZTdWNjZXNzZXMpOworICAgIENvbnNvbGUuV3JpdGVMaW5lKCBhVGVzdEluZm8rJzogcGFzc2VkJyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRkVycm9ycy5BZGQoIEZUZXN0R3JvdXArJzogJythVGVzdEluZm8pOworICAgIEluY2x1ZGUoIEZGYWlsZWQsIEZDdXJyZW50VGVzdCk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGFUZXN0SW5mbysnOiAqKiogRkFJTEVEICoqKicpOworCisgICAgLy8gV2UgaGF2ZSBhIGZhaWxlZCB0ZXN0IQorICAgIC8vIC0+IGlzc3VlIERlYnVnQnJlYWsgT05MWSBpZiBhIGRlYnVnZ2VyIGlzIGF0dGFjaGVkLAorICAgIC8vIC0+IHVuaGFuZGxlZCBEZWJ1Z0JyZWFrcyB3b3VsZCBjYXVzZSBXaW5kb3dzIHRvIHRlcm1pbmF0ZSB0aGUgYXBwIG90aGVyd2lzZQorICAgIGlmIElzRGVidWdnZXJQcmVzZW50CisgICAgdGhlbiB7JElGREVGIENQVVg2NH0gRGVidWdCcmVhayB7JEVMU0V9IGFzbSBpbnQgMyBlbmQgeyRFTkRJRn07CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5SZXBvcnRSZXN1bHRzOwordmFyIG5Ub3RhbCA6IEludGVnZXI7CisgICAgc0xpbmUgOiBzdHJpbmc7CitiZWdpbgorICAvLyBwcmV2ZW50IHVzIGZyb20gc3R1cGlkIERJVi8wIGVycm9ycworICBuVG90YWwgOj0gRlN1Y2Nlc3NlcyArIEZFcnJvcnMuQ291bnQ7CisgIGlmIG5Ub3RhbCA9IDAgdGhlbiBiZWdpbgorICAgIENvbnNvbGUuV3JpdGVMaW5lKCdObyByZXN1bHRzIGxvZ2dlZCcpOworICAgIEV4aXQ7CisgIGVuZDsKKworICBDb25zb2xlLldyaXRlTGluZSgnJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBTdHJpbmdPZkNoYXIoJz0nLDYwKSk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBJbnRUb1N0cihuVG90YWwpKycgdGVzdHMgcGVyZm9ybWVkJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBJbnRUb1N0cihGU3VjY2Vzc2VzKSsnIHRlc3RzIHN1Y2NlZWRlZCAoJytJbnRUb1N0cihyb3VuZCgxMDAqRlN1Y2Nlc3Nlcy9uVG90YWwpKSsnJSknKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoIEludFRvU3RyKEZFcnJvcnMuQ291bnQpKycgdGVzdHMgZmFpbGVkICgnK0ludFRvU3RyKHJvdW5kKDEwMCpGRXJyb3JzLkNvdW50L25Ub3RhbCkpKyclKScpOworICBDb25zb2xlLldyaXRlTGluZSggU3RyaW5nT2ZDaGFyKCc9Jyw2MCkpOworICBpZiBGRXJyb3JzLkNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ0ZBSUxFRCBURVNUUzonKTsKKyAgICBmb3Igc0xpbmUgaW4gRkVycm9ycyBkbyBDb25zb2xlLldyaXRlTGluZSgnLSAnK3NMaW5lKTsKKyAgICBDb25zb2xlLldyaXRlTGluZSggU3RyaW5nT2ZDaGFyKCc9Jyw2MCkpOworICAgIEludGVybG9ja2VkSW5jcmVtZW50KCBFeGl0Q29kZSk7ICAvLyByZXR1cm4gPD4gMCBvbiBlcnJvcnMKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnJyk7CitlbmQ7CisKKworZnVuY3Rpb24gVENsaWVudFRocmVhZC5DYWxjdWxhdGVFeGl0Q29kZSA6IEJ5dGU7Cit2YXIgdGVzdCA6IFRUZXN0R3JvdXA7CitiZWdpbgorICByZXN1bHQgOj0gRVhJVENPREVfU1VDQ0VTUzsKKyAgZm9yIHRlc3QgOj0gTG93KFRUZXN0R3JvdXApIHRvIEhpZ2goVFRlc3RHcm91cCkgZG8gYmVnaW4KKyAgICBpZiAodGVzdCBpbiBGRmFpbGVkKSBvciBub3QgKHRlc3QgaW4gRkV4ZWN1dGVkKQorICAgIHRoZW4gcmVzdWx0IDo9IHJlc3VsdCBvciBNQVBfRkFJTFVSRVNfVE9fRVhJVENPREVfQklUU1t0ZXN0XTsKKyAgZW5kOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRDbGllbnRUaHJlYWQuQ3JlYXRlKCBjb25zdCBhU2V0dXAgOiBUVGVzdFNldHVwOyBjb25zdCBhTnVtSXRlcmF0aW9uOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZTZXR1cCA6PSBhU2V0dXA7CisgIEZOdW1JdGVyYXRpb24gOj0gQU51bUl0ZXJhdGlvbjsKKworICBGQ29uc29sZSA6PSBUVGhyZWFkQ29uc29sZS5DcmVhdGUoIFNlbGYgKTsKKyAgRkN1cnJlbnRUZXN0IDo9IHRlc3RfVW5rbm93bjsKKworICAvLyBlcnJvciBsaXN0OiBrZWVwIGNvcnJlY3Qgb3JkZXIsIGFsbG93IGZvciBkdXBsaWNhdGVzCisgIEZFcnJvcnMgOj0gVFN0cmluZ0xpc3QuQ3JlYXRlOworICBGRXJyb3JzLlNvcnRlZCA6PSBGQUxTRTsKKyAgRkVycm9ycy5EdXBsaWNhdGVzIDo9IGR1cEFjY2VwdDsKKworICBpbmhlcml0ZWQgQ3JlYXRlKCBUUlVFKTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQ2xpZW50VGhyZWFkLkRlc3Ryb3k7CitiZWdpbgorICBGcmVlQW5kTmlsKCBGQ29uc29sZSk7CisgIEZyZWVBbmROaWwoIEZFcnJvcnMpOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkV4ZWN1dGU7Cit2YXIKKyAgaSA6IEludGVnZXI7CitiZWdpbgorICAvLyBwZXJmb3JtIGFsbCB0ZXN0cworICB0cnkKKyAgICB7JElGREVGIFdpbjY0fQorICAgIFVzZUludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NDsKKyAgICB7JEVORElGfQorICAgIEpTT05Qcm90b2NvbFJlYWRXcml0ZVRlc3Q7CisKKyAgICAvLyBtdXN0IGJlIHJ1biBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhyZWFkCisgICAgSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7CisgICAgdHJ5CisgICAgICBmb3IgaSA6PSAwIHRvIEZOdW1JdGVyYXRpb24gLSAxIGRvIGJlZ2luCisgICAgICAgIENsaWVudFRlc3Q7CisgICAgICAgIHskSUZERUYgU3VwcG9ydHNBc3luY30KKyAgICAgICAgQ2xpZW50QXN5bmNUZXN0OworICAgICAgICB7JEVORElGfQorICAgICAgZW5kOworCisgICAgICAvLyByZXBvcnQgdGhlIG91dGNvbWUKKyAgICAgIFJlcG9ydFJlc3VsdHM7CisgICAgICBTZXRSZXR1cm5WYWx1ZSggQ2FsY3VsYXRlRXhpdENvZGUpOworCisgICAgZmluYWxseQorICAgICAgU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworICAgIGVuZDsKKworICBleGNlcHQKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAndW5leHBlY3RlZCBleGNlcHRpb246ICInK2UubWVzc2FnZSsnIicpOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7Cit2YXIKKyAgc3RyZWFtdHJhbnMgOiBJU3RyZWFtVHJhbnNwb3J0OworICBodHRwIDogSUhUVFBDbGllbnQ7CisgIHNVcmwgOiBzdHJpbmc7Citjb25zdAorICBERUJVR19USU1FT1VUICAgPSAzMCAqIDEwMDA7CisgIFJFTEVBU0VfVElNRU9VVCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgIFBJUEVfVElNRU9VVCAgICA9IFJFTEVBU0VfVElNRU9VVDsKKyAgSFRUUF9USU1FT1VUUyAgID0gMTAgKiAxMDAwOworYmVnaW4KKyAgLy8gbmVlZGVkIGZvciBIVFRQIGNsaWVudHMgYXMgdGhleSB1dGlsaXplIHRoZSBNU1hNTCBDT00gY29tcG9uZW50cworICBPbGVDaGVjayggQ29Jbml0aWFsaXplKCBuaWwpKTsKKworICBjYXNlIEZTZXR1cC5lbmRwb2ludCBvZgorICAgIHRybnNfU29ja2V0czogYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBzb2NrZXRzICgnK0ZTZXR1cC5ob3N0KycgcG9ydCAnK0ludFRvU3RyKEZTZXR1cC5wb3J0KSsnKScpOworICAgICAgc3RyZWFtdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCBGU2V0dXAuaG9zdCwgRlNldHVwLnBvcnQgKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19IdHRwOiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIEhUVFBDbGllbnQnKTsKKyAgICAgIGlmIEZTZXR1cC51c2VTU0wKKyAgICAgIHRoZW4gc1VybCA6PSAnaHR0cDovLycKKyAgICAgIGVsc2Ugc1VybCA6PSAnaHR0cHM6Ly8nOworICAgICAgc1VybCA6PSBzVXJsICsgRlNldHVwLmhvc3Q7CisgICAgICBjYXNlIEZTZXR1cC5wb3J0IG9mCisgICAgICAgIDgwICA6IGlmIEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgICAgNDQzIDogaWYgbm90IEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgRlNldHVwLnBvcnQgPiAwIHRoZW4gc1VybCA6PSBzVXJsICsgJzonKyBJbnRUb1N0cihGU2V0dXAucG9ydCk7CisgICAgICBlbmQ7CisgICAgICBodHRwIDo9IFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoIHNVcmwpOworICAgICAgaHR0cC5EbnNSZXNvbHZlVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5Db25uZWN0aW9uVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5TZW5kVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5SZWFkVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgRlRyYW5zcG9ydCA6PSBodHRwOworICAgIGVuZDsKKworICAgIHRybnNfRXZIdHRwOiBiZWdpbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW0ZTZXR1cC5lbmRwb2ludF0rJyB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7CisgICAgZW5kOworCisgICAgdHJuc19OYW1lZFBpcGVzOiBiZWdpbgorICAgICAgc3RyZWFtdHJhbnMgOj0gVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBGU2V0dXAuc1BpcGVOYW1lLCAwLCBuaWwsIFBJUEVfVElNRU9VVCwgUElQRV9USU1FT1VUKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19Bbm9uUGlwZXM6IGJlZ2luCisgICAgICBzdHJlYW10cmFucyA6PSBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBGU2V0dXAuaEFub25SZWFkLCBGU2V0dXAuaEFub25Xcml0ZSwgRkFMU0UpOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBlbmRwb2ludCB0cmFuc3BvcnQnKTsKKyAgZW5kOworICBBU1NFUlQoIEZUcmFuc3BvcnQgPD4gbmlsKTsKKworICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgaWYgKHRybnNfRnJhbWVkIGluIEZTZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgRlRyYW5zcG9ydCA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbmQKKyAgZWxzZSBpZiAodHJuc19CdWZmZXJlZCBpbiBGU2V0dXAubGF5ZXJlZCkgYW5kIChzdHJlYW10cmFucyA8PiBuaWwpIHRoZW4gYmVnaW4KKyAgICBGVHJhbnNwb3J0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzdHJlYW10cmFucywgMzIpOyAgLy8gc21hbGwgYnVmZmVyIHRvIHRlc3QgcmVhZCgpCisgIGVuZDsKKworICBpZiBGU2V0dXAudXNlU1NMIHRoZW4gYmVnaW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdTU0wvVExTIG5vdCBpbXBsZW1lbnRlZCcpOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIHByb3RvY29sIGluc3RhbmNlLCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgIGNhc2UgRlNldHVwLnByb3RUeXBlIG9mCisgICAgcHJvdF9CaW5hcnkgIDogIEZQcm90b2NvbCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCwgQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKKyAgICBwcm90X0pTT04gICAgOiAgRlByb3RvY29sIDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgICAgcHJvdF9Db21wYWN0IDogIEZQcm90b2NvbCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbHNlCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHByb3RvY29sJyk7CisgIGVuZDsKKworICBBU1NFUlQoIChGVHJhbnNwb3J0IDw+IG5pbCkgYW5kIChGUHJvdG9jb2wgPD4gbmlsKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworYmVnaW4KKyAgdHJ5CisgICAgRlByb3RvY29sIDo9IG5pbDsKKworICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEZUcmFuc3BvcnQuQ2xvc2U7CisgICAgICBGVHJhbnNwb3J0IDo9IG5pbDsKKyAgICBlbmQ7CisKKyAgZmluYWxseQorICAgIENvVW5pbml0aWFsaXplOworICBlbmQ7CitlbmQ7CisKKworeyBUVGhyZWFkQ29uc29sZSB9CisKK2NvbnN0cnVjdG9yIFRUaHJlYWRDb25zb2xlLkNyZWF0ZShBVGhyZWFkOiBUVGhyZWFkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUaHJlYWQgOj0gQVRocmVhZDsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJlYWRDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7Cit2YXIKKyAgcHJvYyA6IFRUaHJlYWRQcm9jZWR1cmU7CitiZWdpbgorICBwcm9jIDo9IHByb2NlZHVyZQorICBiZWdpbgorICAgIENvbnNvbGUuV3JpdGUoIFMgKTsKKyAgZW5kOworICBUVGhyZWFkLlN5bmNocm9uaXplKCBGVGhyZWFkLCBwcm9jKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJlYWRDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOwordmFyCisgIHByb2MgOiBUVGhyZWFkUHJvY2VkdXJlOworYmVnaW4KKyAgcHJvYyA6PSBwcm9jZWR1cmUKKyAgYmVnaW4KKyAgICBDb25zb2xlLldyaXRlTGluZSggUyApOworICBlbmQ7CisgIFRUaHJlYWQuU3luY2hyb25pemUoIEZUaHJlYWQsIHByb2MpOworZW5kOworCitpbml0aWFsaXphdGlvbgorYmVnaW4KKyAgVFRlc3RDbGllbnQuRk51bUl0ZXJhdGlvbiA6PSAxOworICBUVGVzdENsaWVudC5GTnVtVGhyZWFkIDo9IDE7CitlbmQ7CisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q29uc3RhbnRzLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q29uc3RhbnRzLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzk2OWRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RDb25zdGFudHMucGFzCkBAIC0wLDAgKzEsMTYyIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGVzdENvbnN0YW50czsKKworaW50ZXJmYWNlCisKK3VzZXMgU3lzVXRpbHM7CisKK3R5cGUKKyAgVEtub3duUHJvdG9jb2wgPSAoCisgICAgcHJvdF9CaW5hcnksICAvLyBkZWZhdWx0IGJpbmFyeSBwcm90b2NvbAorICAgIHByb3RfSlNPTiwgICAgLy8gSlNPTiBwcm90b2NvbAorICAgIHByb3RfQ29tcGFjdAorICApOworCisgIFRTZXJ2ZXJUeXBlID0gKAorICAgIHNydl9TaW1wbGUsCisgICAgc3J2X05vbmJsb2NraW5nLAorICAgIHNydl9UaHJlYWRwb29sLAorICAgIHNydl9UaHJlYWRlZAorICApOworCisgIFRFbmRwb2ludFRyYW5zcG9ydCA9ICgKKyAgICB0cm5zX1NvY2tldHMsCisgICAgdHJuc19IdHRwLAorICAgIHRybnNfTmFtZWRQaXBlcywKKyAgICB0cm5zX0Fub25QaXBlcywKKyAgICB0cm5zX0V2SHR0cCAgLy8gYXMgbGlzdGVkIG9uIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy90ZXN0CisgICk7CisKKyAgVExheWVyZWRUcmFuc3BvcnQgPSAoCisgICAgdHJuc19CdWZmZXJlZCwKKyAgICB0cm5zX0ZyYW1lZAorICApOworCisgIFRMYXllcmVkVHJhbnNwb3J0cyA9IHNldCBvZiBUTGF5ZXJlZFRyYW5zcG9ydDsKKworY29uc3QKKyAgU0VSVkVSX1RZUEVTIDogYXJyYXlbVFNlcnZlclR5cGVdIG9mIHN0cmluZworICAgICAgICAgICAgICAgICAgPSAoJ1NpbXBsZScsICdOb25ibG9ja2luZycsICdUaHJlYWRwb29sJywgJ1RocmVhZGVkJyk7CisKKyAgVEhSSUZUX1BST1RPQ09MUyA6IGFycmF5W1RLbm93blByb3RvY29sXSBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgID0gKCdCaW5hcnknLCAnSlNPTicsICdDb21wYWN0Jyk7CisKKyAgTEFZRVJFRF9UUkFOU1BPUlRTIDogYXJyYXlbVExheWVyZWRUcmFuc3BvcnRdIG9mIHN0cmluZworICAgICAgICAgICAgICAgICAgPSAoJ0J1ZmZlcmVkJywgJ0ZyYW1lZCcpOworCisgIEVORFBPSU5UX1RSQU5TUE9SVFMgOiBhcnJheVtURW5kcG9pbnRUcmFuc3BvcnRdIG9mIHN0cmluZworICAgICAgICAgICAgICAgICAgPSAoJ1NvY2tldHMnLCAnSHR0cCcsICdOYW1lZCBQaXBlcycsJ0Fub24gUGlwZXMnLCAnRXZIdHRwJyk7CisKKyAgLy8gZGVmYXVsdHMgYXJlOiByZWFkPWZhbHNlLCB3cml0ZT10cnVlCisgIEJJTkFSWV9TVFJJQ1RfUkVBRCAgPSBGQUxTRTsKKyAgQklOQVJZX1NUUklDVF9XUklURSA9IEZBTFNFOworCisgIEhVR0VfVEVTVF9TVFJJTkcgPSAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnCisgICAgICAgICAgICAgICAgICAgKyAnTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15ICcKKyAgICAgICAgICAgICAgICAgICArICdlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ3ZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCAnCisgICAgICAgICAgICAgICAgICAgKyAnYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gJworICAgICAgICAgICAgICAgICAgICsgJ25vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkICcKKyAgICAgICAgICAgICAgICAgICArICdkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0ICcKKyAgICAgICAgICAgICAgICAgICArICdjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAnOworCisKK2Z1bmN0aW9uIEJ5dGVzVG9IZXgoIGNvbnN0IGJ5dGVzIDogVEJ5dGVzKSA6IHN0cmluZzsKKworCitpbXBsZW1lbnRhdGlvbgorCisKK2Z1bmN0aW9uIEJ5dGVzVG9IZXgoIGNvbnN0IGJ5dGVzIDogVEJ5dGVzKSA6IHN0cmluZzsKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSAnJzsKKyAgZm9yIGkgOj0gTG93KGJ5dGVzKSB0byBIaWdoKGJ5dGVzKSBkbyBiZWdpbgorICAgIHJlc3VsdCA6PSByZXN1bHQgKyBJbnRUb0hleChieXRlc1tpXSwyKTsKKyAgZW5kOworZW5kOworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWNiMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXIucGFzCkBAIC0wLDAgKzEsNzQ1IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGVzdFNlcnZlcjsKKworeyRJIC4uL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmN9Cit7JFdBUk4gU1lNQk9MX1BMQVRGT1JNIE9GRn0KKworey4kREVGSU5FIFJ1bkVuZGxlc3N9ICAgLy8gYWN0aXZhdGUgdG8gaW50ZXJhY3RpdmVseSBzdHJlc3MtdGVzdCB0aGUgc2VydmVyIHN0b3Agcm91dGluZXMgdmlhIEN0cmwrQworCitpbnRlcmZhY2UKKwordXNlcworICBXaW5kb3dzLCBTeXNVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5TZXJ2ZXIsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04sCisgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LAorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LlRlc3QsCisgIFRocmlmdCwKKyAgVGVzdENvbnN0YW50cywKKyAgVGVzdFNlcnZlckV2ZW50cywKKyAgQ29uc29sZUhlbHBlciwKKyAgQ29udG5yczsKKwordHlwZQorICBUVGVzdFNlcnZlciA9IGNsYXNzCisgIHB1YmxpYworICAgIHR5cGUKKworICAgICAgSVRlc3RIYW5kbGVyID0gaW50ZXJmYWNlKCBUVGhyaWZ0VGVzdC5JZmFjZSApCisgICAgICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXIgOiBJU2VydmVyICk7CisgICAgICAgIHByb2NlZHVyZSBUZXN0U3RvcDsKKyAgICAgIGVuZDsKKworICAgICAgVFRlc3RIYW5kbGVySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRlc3RIYW5kbGVyICkKKyAgICAgIHByaXZhdGUKKyAgICAgICAgRlNlcnZlciA6IElTZXJ2ZXI7CisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgcHJvY2VkdXJlIHRlc3RWb2lkKCk7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RCb29sKHRoaW5nOiBCb29sZWFuKTogQm9vbGVhbjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdFN0cmluZyhjb25zdCB0aGluZzogc3RyaW5nKTogc3RyaW5nOworICAgICAgICBmdW5jdGlvbiB0ZXN0Qnl0ZSh0aGluZzogU2hvcnRJbnQpOiBTaG9ydEludDsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEkzMih0aGluZzogSW50ZWdlcik6IEludGVnZXI7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RJNjQoY29uc3QgdGhpbmc6IEludDY0KTogSW50NjQ7CisgICAgICAgIGZ1bmN0aW9uIHRlc3REb3VibGUoY29uc3QgdGhpbmc6IERvdWJsZSk6IERvdWJsZTsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEJpbmFyeShjb25zdCB0aGluZzogVEJ5dGVzKTogVEJ5dGVzOworICAgICAgICBmdW5jdGlvbiB0ZXN0U3RydWN0KGNvbnN0IHRoaW5nOiBJWHRydWN0KTogSVh0cnVjdDsKKyAgICAgICAgZnVuY3Rpb24gdGVzdE5lc3QoY29uc3QgdGhpbmc6IElYdHJ1Y3QyKTogSVh0cnVjdDI7CisgICAgICAgIGZ1bmN0aW9uIHRlc3RNYXAoY29uc3QgdGhpbmc6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+KTogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CisgICAgICAgIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXAoY29uc3QgdGhpbmc6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPik6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdFNldChjb25zdCB0aGluZzogSUhhc2hTZXQ8SW50ZWdlcj4pOiBJSGFzaFNldDxJbnRlZ2VyPjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdExpc3QoY29uc3QgdGhpbmc6IElUaHJpZnRMaXN0PEludGVnZXI+KTogSVRocmlmdExpc3Q8SW50ZWdlcj47CisgICAgICAgIGZ1bmN0aW9uIHRlc3RFbnVtKHRoaW5nOiBUTnVtYmVyeik6IFROdW1iZXJ6OworICAgICAgICBmdW5jdGlvbiB0ZXN0VHlwZWRlZihjb25zdCB0aGluZzogSW50NjQpOiBJbnQ2NDsKKyAgICAgICAgZnVuY3Rpb24gdGVzdE1hcE1hcChoZWxsbzogSW50ZWdlcik6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+PjsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEluc2FuaXR5KGNvbnN0IGFyZ3VtZW50OiBJSW5zYW5pdHkpOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OworICAgICAgICBmdW5jdGlvbiB0ZXN0TXVsdGkoYXJnMDogU2hvcnRJbnQ7IGFyZzE6IEludGVnZXI7IGNvbnN0IGFyZzI6IEludDY0OyBjb25zdCBhcmczOiBJVGhyaWZ0RGljdGlvbmFyeTxTbWFsbEludCwgc3RyaW5nPjsgYXJnNDogVE51bWJlcno7IGNvbnN0IGFyZzU6IEludDY0KTogSVh0cnVjdDsKKyAgICAgICAgcHJvY2VkdXJlIHRlc3RFeGNlcHRpb24oY29uc3QgYXJnOiBzdHJpbmcpOworICAgICAgICBmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb24oY29uc3QgYXJnMDogc3RyaW5nOyBjb25zdCBhcmcxOiBzdHJpbmcpOiBJWHRydWN0OworICAgICAgICBwcm9jZWR1cmUgdGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcDogSW50ZWdlcik7CisKKyAgICAgICAgcHJvY2VkdXJlIFRlc3RTdG9wOworICAgICAgICBwcm9jZWR1cmUgU2V0U2VydmVyKCBjb25zdCBBU2VydmVyIDogSVNlcnZlciApOworICAgICAgZW5kOworCisgICAgICBjbGFzcyBwcm9jZWR1cmUgUHJpbnRDbWRMaW5lSGVscDsKKyAgICAgIGNsYXNzIHByb2NlZHVyZSBJbnZhbGlkQXJnczsKKworICAgICAgY2xhc3MgcHJvY2VkdXJlIExhdW5jaEFub25QaXBlQ2hpbGQoIGNvbnN0IGFwcCA6IHN0cmluZzsgY29uc3QgdHJhbnNwb3J0IDogSUFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnQpOworICAgICAgY2xhc3MgcHJvY2VkdXJlIEV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKworCit2YXIgZ19IYW5kbGVyIDogVFRlc3RTZXJ2ZXIuSVRlc3RIYW5kbGVyID0gbmlsOworCisKK2Z1bmN0aW9uIE15Q29uc29sZUV2ZW50SGFuZGxlciggZHdDdHJsVHlwZSA6IERXT1JEKSA6IEJPT0w7ICBzdGRjYWxsOworLy8gTm90ZSB0aGF0IHRoaXMgSGFuZGxlciBwcm9jZWR1cmUgaXMgY2FsbGVkIGZyb20gYW5vdGhlciB0aHJlYWQKK3ZhciBoYW5kbGVyIDogVFRlc3RTZXJ2ZXIuSVRlc3RIYW5kbGVyOworYmVnaW4KKyAgcmVzdWx0IDo9IFRSVUU7CisgIHRyeQorICAgIGNhc2UgZHdDdHJsVHlwZSBvZgorICAgICAgQ1RSTF9DX0VWRU5UICAgICAgICA6ICBDb25zb2xlLldyaXRlTGluZSggJ0N0cmwrQyBwcmVzc2VkJyk7CisgICAgICBDVFJMX0JSRUFLX0VWRU5UICAgIDogIENvbnNvbGUuV3JpdGVMaW5lKCAnQ3RybCtCcmVhayBwcmVzc2VkJyk7CisgICAgICBDVFJMX0NMT1NFX0VWRU5UICAgIDogIENvbnNvbGUuV3JpdGVMaW5lKCAnUmVjZWl2ZWQgQ2xvc2VUYXNrIHNpZ25hbCcpOworICAgICAgQ1RSTF9MT0dPRkZfRVZFTlQgICA6ICBDb25zb2xlLldyaXRlTGluZSggJ1JlY2VpdmVkIExvZ09mZiBzaWduYWwnKTsKKyAgICAgIENUUkxfU0hVVERPV05fRVZFTlQgOiAgQ29uc29sZS5Xcml0ZUxpbmUoICdSZWNlaXZlZCBTaHV0ZG93biBzaWduYWwnKTsKKyAgICBlbHNlCisgICAgICBDb25zb2xlLldyaXRlTGluZSggJ1JlY2VpdmVkIGNvbnNvbGUgZXZlbnQgIycrSW50VG9TdHIoSW50ZWdlcihkd0N0cmxUeXBlKSkpOworICAgIGVuZDsKKworICAgIGhhbmRsZXIgOj0gZ19IYW5kbGVyOworICAgIGlmIGhhbmRsZXIgPD4gbmlsIHRoZW4gaGFuZGxlci5UZXN0U3RvcDsKKworICBleGNlcHQKKyAgICAvLyBjYXRjaCBhbGwKKyAgZW5kOworZW5kOworCisKK3sgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbCB9CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLlNldFNlcnZlciggY29uc3QgQVNlcnZlcjogSVNlcnZlcik7CitiZWdpbgorICBGU2VydmVyIDo9IEFTZXJ2ZXI7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEJ5dGUodGhpbmc6IFNob3J0SW50KTogU2hvcnRJbnQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJ5dGUoIicgKyBJbnRUb1N0ciggdGhpbmcpICsgJyIpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0RG91YmxlKCBjb25zdCB0aGluZzogRG91YmxlKTogRG91YmxlOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3REb3VibGUoIicgKyBGbG9hdFRvU3RyKCB0aGluZyApICsgJyIpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0QmluYXJ5KGNvbnN0IHRoaW5nOiBUQnl0ZXMpOiBUQnl0ZXM7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJpbmFyeSgiJyArIEJ5dGVzVG9IZXgoIHRoaW5nICkgKyAnIiknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RFbnVtKHRoaW5nOiBUTnVtYmVyeik6IFROdW1iZXJ6OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RFbnVtKCcgKyBJbnRUb1N0ciggSW50ZWdlciggdGhpbmcpKSArICcpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEV4Y2VwdGlvbihjb25zdCBhcmc6IHN0cmluZyk7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEV4Y2VwdGlvbignICsgYXJnICsgJyknKTsKKyAgaWYgKCBhcmcgPSAnWGNlcHRpb24nKSB0aGVuCisgIGJlZ2luCisgICAgcmFpc2UgVFhjZXB0aW9uLkNyZWF0ZSggMTAwMSwgYXJnKTsKKyAgZW5kOworCisgIGlmIChhcmcgPSAnVEV4Y2VwdGlvbicpIHRoZW4KKyAgYmVnaW4KKyAgICByYWlzZSBURXhjZXB0aW9uLkNyZWF0ZSgnVEV4Y2VwdGlvbicpOworICBlbmQ7CisKKyAgLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0STMyKHRoaW5nOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0STMyKCInICsgSW50VG9TdHIoIHRoaW5nKSArICciKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEk2NCggY29uc3QgdGhpbmc6IEludDY0KTogSW50NjQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEk2NCgiJyArIEludFRvU3RyKCB0aGluZykgKyAnIiknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RJbnNhbml0eSgKKyAgY29uc3QgYXJndW1lbnQ6IElJbnNhbml0eSk6IElUaHJpZnREaWN0aW9uYXJ5PEludDY0LCBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5Pj47Cit2YXIKKyAgbG9vbmV5IDogSUluc2FuaXR5OworICBmaXJzdF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKKyAgc2Vjb25kX21hcCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+OworICBpbnNhbmUgOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OworCitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEluc2FuaXR5KCknKTsKKworICAoKioKKyAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAqCisgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgfSwKKyAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgKiAgIH0KKyAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAqKQorCisgIGZpcnN0X21hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIElJbnNhbml0eT4uQ3JlYXRlOworICBzZWNvbmRfbWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUTnVtYmVyeiwgSUluc2FuaXR5Pi5DcmVhdGU7CisKKyAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKKworICBsb29uZXkgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7CisgIHNlY29uZF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouU0lYLCBsb29uZXkpOworCisgIGluc2FuZSA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+Pi5DcmVhdGU7CisKKyAgaW5zYW5lLkFkZE9yU2V0VmFsdWUoIDEsIGZpcnN0X21hcCk7CisgIGluc2FuZS5BZGRPclNldFZhbHVlKCAyLCBzZWNvbmRfbWFwKTsKKworICBSZXN1bHQgOj0gaW5zYW5lOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RMaXN0KAorICBjb25zdCB0aGluZzogSVRocmlmdExpc3Q8SW50ZWdlcj4pOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKK3ZhcgorICBmaXJzdCA6IEJvb2xlYW47CisgIGVsZW0gOiBJbnRlZ2VyOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZSgndGVzdExpc3QoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3IgZWxlbSBpbiB0aGluZyBkbworICBiZWdpbgorICAgIGlmIGZpcnN0IHRoZW4KKyAgICBiZWdpbgorICAgICAgZmlyc3QgOj0gRmFsc2U7CisgICAgZW5kIGVsc2UKKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSgnLCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZSggSW50VG9TdHIoIGVsZW0pKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RNYXAoCisgIGNvbnN0IHRoaW5nOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPik6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OwordmFyCisgIGZpcnN0IDogQm9vbGVhbjsKKyAga2V5IDogSW50ZWdlcjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGUoJ3Rlc3RNYXAoeycpOworICBmaXJzdCA6PSBUcnVlOworICBmb3Iga2V5IGluIHRoaW5nLktleXMgZG8KKyAgYmVnaW4KKyAgICBpZiAoZmlyc3QpIHRoZW4KKyAgICBiZWdpbgorICAgICAgZmlyc3QgOj0gZmFsc2U7CisgICAgZW5kIGVsc2UKKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSgnLCAnKTsKKyAgICBlbmQ7CisgICAgQ29uc29sZS5Xcml0ZShJbnRUb1N0cihrZXkpICsgJyA9PiAnICsgSW50VG9TdHIoIHRoaW5nW2tleV0pKTsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSgnfSknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLlRlc3RNYXBNYXAoCisgIGhlbGxvOiBJbnRlZ2VyKTogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4+OwordmFyCisgIG1hcG1hcCA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+PjsKKyAgcG9zIDogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CisgIG5lZyA6IElUaHJpZnREaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworICBpIDogSW50ZWdlcjsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0TWFwTWFwKCcgKyBJbnRUb1N0ciggaGVsbG8pICsgJyknKTsKKyAgbWFwbWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxJbnRlZ2VyLCBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4uQ3JlYXRlOworICBwb3MgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPEludGVnZXIsIEludGVnZXI+LkNyZWF0ZTsKKyAgbmVnIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxJbnRlZ2VyLCBJbnRlZ2VyPi5DcmVhdGU7CisKKyAgZm9yIGkgOj0gMSB0byA0IGRvCisgIGJlZ2luCisgICAgcG9zLkFkZE9yU2V0VmFsdWUoIGksIGkpOworICAgIG5lZy5BZGRPclNldFZhbHVlKCAtaSwgLWkpOworICBlbmQ7CisKKyAgbWFwbWFwLkFkZE9yU2V0VmFsdWUoNCwgcG9zKTsKKyAgbWFwbWFwLkFkZE9yU2V0VmFsdWUoIC00LCBuZWcpOworCisgIFJlc3VsdCA6PSBtYXBtYXA7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdE11bHRpKGFyZzA6IFNob3J0SW50OyBhcmcxOiBJbnRlZ2VyOworICBjb25zdCBhcmcyOiBJbnQ2NDsgY29uc3QgYXJnMzogSVRocmlmdERpY3Rpb25hcnk8U21hbGxJbnQsIHN0cmluZz47CisgIGFyZzQ6IFROdW1iZXJ6OyBjb25zdCBhcmc1OiBJbnQ2NCk6IElYdHJ1Y3Q7Cit2YXIKKyAgaGVsbG8gOiBJWHRydWN0OworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RNdWx0aSgpJyk7CisgIGhlbGxvIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKKyAgaGVsbG8uU3RyaW5nX3RoaW5nIDo9ICdIZWxsbzInOworICBoZWxsby5CeXRlX3RoaW5nIDo9IGFyZzA7CisgIGhlbGxvLkkzMl90aGluZyA6PSBhcmcxOworICBoZWxsby5JNjRfdGhpbmcgOj0gYXJnMjsKKyAgUmVzdWx0IDo9IGhlbGxvOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RNdWx0aUV4Y2VwdGlvbiggY29uc3QgYXJnMCwgYXJnMTogc3RyaW5nKTogSVh0cnVjdDsKK3ZhcgorICB4MiA6IFRYY2VwdGlvbjI7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICBpZiAoIGFyZzAgPSAnWGNlcHRpb24nKSB0aGVuCisgIGJlZ2luCisgICAgcmFpc2UgVFhjZXB0aW9uLkNyZWF0ZSggMTAwMSwgJ1RoaXMgaXMgYW4gWGNlcHRpb24nKTsgIC8vIHRlc3QgdGhlIG5ldyByaWNoIENUT1IKKyAgZW5kIGVsc2UKKyAgaWYgKCBhcmcwID0gJ1hjZXB0aW9uMicpIHRoZW4KKyAgYmVnaW4KKyAgICB4MiA6PSBUWGNlcHRpb24yLkNyZWF0ZTsgIC8vIHRoZSBvbGQgd2F5IHN0aWxsIHdvcmtzIHRvbz8KKyAgICB4Mi5FcnJvckNvZGUgOj0gMjAwMjsKKyAgICB4Mi5TdHJ1Y3RfdGhpbmcgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOworICAgIHgyLlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgOj0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICB4Mi5VcGRhdGVNZXNzYWdlUHJvcGVydHk7CisgICAgcmFpc2UgeDI7CisgIGVuZDsKKworICBSZXN1bHQgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOworICBSZXN1bHQuU3RyaW5nX3RoaW5nIDo9IGFyZzE7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdE5lc3QoIGNvbnN0IHRoaW5nOiBJWHRydWN0Mik6IElYdHJ1Y3QyOwordmFyCisgIHRlbXAgOiBJWHRydWN0OworYmVnaW4KKyAgdGVtcCA6PSB0aGluZy5TdHJ1Y3RfdGhpbmc7CisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0TmVzdCh7JyArCisgICAgICAgICBJbnRUb1N0ciggdGhpbmcuQnl0ZV90aGluZykgKyAnLCB7JyArCisgICAgICAgICAnIicgKyB0ZW1wLlN0cmluZ190aGluZyArICciLCAnICsKKyAgICAgICAgIEludFRvU3RyKCB0ZW1wLkJ5dGVfdGhpbmcpICsgJywgJyArCisgICAgICAgICBJbnRUb1N0ciggdGVtcC5JMzJfdGhpbmcpICsgJywgJyArCisgICAgICAgICBJbnRUb1N0ciggdGVtcC5JNjRfdGhpbmcpICsgJ30sICcgKworICAgICAgICAgSW50VG9TdHIoIHRlbXAuSTMyX3RoaW5nKSArICd9KScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXA6IEludGVnZXIpOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RPbmV3YXkoJyArIEludFRvU3RyKCBzZWNvbmRzVG9TbGVlcCApKyAnKSwgc2xlZXBpbmcuLi4nKTsKKyAgU2xlZXAoc2Vjb25kc1RvU2xlZXAgKiAxMDAwKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RPbmV3YXkgZmluaXNoZWQnKTsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0U2V0KAorICBjb25zdCB0aGluZzogSUhhc2hTZXQ8SW50ZWdlcj4pOklIYXNoU2V0PEludGVnZXI+OwordmFyCisgIGZpcnN0IDogQm9vbGVhbjsKKyAgZWxlbSA6IEludGVnZXI7CitiZWdpbgorICBDb25zb2xlLldyaXRlKCd0ZXN0U2V0KHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKworICBmb3IgZWxlbSBpbiB0aGluZyBkbworICBiZWdpbgorICAgIGlmIGZpcnN0IHRoZW4KKyAgICBiZWdpbgorICAgICAgZmlyc3QgOj0gRmFsc2U7CisgICAgZW5kIGVsc2UKKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSggJywgJyk7CisgICAgZW5kOworICAgIENvbnNvbGUuV3JpdGUoIEludFRvU3RyKCBlbGVtKSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdFN0b3A7CitiZWdpbgorICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuCisgIGJlZ2luCisgICAgRlNlcnZlci5TdG9wOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEJvb2wodGhpbmc6IEJvb2xlYW4pOiBCb29sZWFuOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCb29sKCcgKyBCb29sVG9TdHIodGhpbmcsdHJ1ZSkgKyAnKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdFN0cmluZyggY29uc3QgdGhpbmc6IHN0cmluZyk6IHN0cmluZzsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0c3RyaW5nKCInICsgdGhpbmcgKyAnIiknKTsKKyAgUmVzdWx0IDo9IHRoaW5nOworZW5kOworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RTdHJpbmdNYXAoCisgIGNvbnN0IHRoaW5nOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4pOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz47Cit2YXIKKyAgZmlyc3QgOiBCb29sZWFuOworICBrZXkgOiBzdHJpbmc7CitiZWdpbgorICBDb25zb2xlLldyaXRlKCd0ZXN0U3RyaW5nTWFwKHsnKTsKKyAgZmlyc3QgOj0gVHJ1ZTsKKyAgZm9yIGtleSBpbiB0aGluZy5LZXlzIGRvCisgIGJlZ2luCisgICAgaWYgKGZpcnN0KSB0aGVuCisgICAgYmVnaW4KKyAgICAgIGZpcnN0IDo9IGZhbHNlOworICAgIGVuZCBlbHNlCisgICAgYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGUoJywgJyk7CisgICAgZW5kOworICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgJyA9PiAnICsgdGhpbmdba2V5XSk7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ30pJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0VHlwZWRlZiggY29uc3QgdGhpbmc6IEludDY0KTogSW50NjQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdFR5cGVkZWYoJyArIEludFRvU3RyKCB0aGluZykgKyAnKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLlRlc3RWb2lkOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RWb2lkKCknKTsKK2VuZDsKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0U3RydWN0KCBjb25zdCB0aGluZzogSVh0cnVjdCk6IElYdHJ1Y3Q7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdFN0cnVjdCh7JyArCisgICAgJyInICsgdGhpbmcuU3RyaW5nX3RoaW5nICsgJyIsICcgKworICAgICAgSW50VG9TdHIoIHRoaW5nLkJ5dGVfdGhpbmcpICsgJywgJyArCisgICAgICBJbnRUb1N0ciggdGhpbmcuSTMyX3RoaW5nKSArICcsICcgKworICAgICAgSW50VG9TdHIoIHRoaW5nLkk2NF90aGluZykpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKKworeyBUVGVzdFNlcnZlciB9CisKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VydmVyLlByaW50Q21kTGluZUhlbHA7Citjb25zdCBIRUxQVEVYVCA9ICcgW29wdGlvbnNdJyMxMAorICAgICAgICAgICAgICAgKyAjMTAKKyAgICAgICAgICAgICAgICsgJ0FsbG93ZWQgb3B0aW9uczonIzEwCisgICAgICAgICAgICAgICArICcgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGxpc3RlbicjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsICJzaW1wbGUiLCAidGhyZWFkLXBvb2wiLCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRlZCIsIG9yICJub25ibG9ja2luZyInIzEwCisgICAgICAgICAgICAgICArICcgIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldCkgICB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGFub25waXBlJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgcHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbicjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXByb2Nlc3Nvci1ldmVudHMgICAgICAgICAgcHJvY2Vzc29yLWV2ZW50cycjMTAKKyAgICAgICAgICAgICAgICsgJyAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3InIzEwCisgICAgICAgICAgICAgICArICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZScjMTAKKyAgICAgICAgICAgICAgIDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCBDaGFuZ2VGaWxlRXh0KEV4dHJhY3RGaWxlTmFtZShQYXJhbVN0cigwKSksJycpICsgSEVMUFRFWFQpOworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuSW52YWxpZEFyZ3M7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSggJ0ludmFsaWQgYXJncy4nKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoIENoYW5nZUZpbGVFeHQoRXh0cmFjdEZpbGVOYW1lKFBhcmFtU3RyKDApKSwnJykgKyAnIC1oIGZvciBtb3JlIGluZm9ybWF0aW9uJyk7CisgIEFib3J0OworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuTGF1bmNoQW5vblBpcGVDaGlsZCggY29uc3QgYXBwIDogc3RyaW5nOyBjb25zdCB0cmFuc3BvcnQgOiBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydCk7CisvL0xhdW5jaCBjaGlsZCBwcm9jZXNzIGFuZCBwYXNzIFIvVyBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzIG9uIGNtZCBsaW5lLgorLy9UaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgYW5kIGRvZXMgbm90IGluY2x1ZGUgZWxldmF0aW9uIG9yIG90aGVyCisvL2FkdmFuY2VkIGZlYXR1cmVzLgordmFyIHBpIDogUFJPQ0VTU19JTkZPUk1BVElPTjsKKyAgICAgICAgc2kgOiBTVEFSVFVQSU5GTzsKKyAgICAgICAgc0FyZywgc0hhbmRsZXMsIHNDbWRMaW5lIDogc3RyaW5nOworICAgIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgR2V0U3RhcnR1cEluZm8oIHNpKTsgIC8vc2V0IHN0YXJ0dXBpbmZvIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzCisKKyAgLy8gcHJlZm9ybWF0IGhhbmRsZXMgYXJncworICBzSGFuZGxlcyA6PSBGb3JtYXQoICclZCAlZCcsCisgICAgICAgICAgICAgICAgICAgIFsgSW50ZWdlcih0cmFuc3BvcnQuQ2xpZW50QW5vblJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIodHJhbnNwb3J0LkNsaWVudEFub25Xcml0ZSldKTsKKworICAvLyBwYXNzIGFsbCBzZXR0aW5ncyB0byBjbGllbnQKKyAgc0NtZExpbmUgOj0gYXBwOworICBmb3IgaSA6PSAxIHRvIFBhcmFtQ291bnQgZG8gYmVnaW4KKyAgICBzQXJnIDo9IFBhcmFtU3RyKGkpOworCisgICAgLy8gYWRkIGFub255bW91cyBoYW5kbGVzIGFuZCBxdW90ZSBzdHJpbmdzIHdoZXJlIGFwcHJvcHJpYXRlCisgICAgaWYgc0FyZyA9ICctYW5vbicKKyAgICB0aGVuIHNBcmcgOj0gc0FyZyArJyAnKyBzSGFuZGxlcworICAgIGVsc2UgYmVnaW4KKyAgICAgIGlmIFBvcygnICcsc0FyZykgPiAwCisgICAgICB0aGVuIHNBcmcgOj0gJyInK3NBcmcrJyInOworICAgIGVuZDs7CisKKyAgICBzQ21kTGluZSA6PSBzQ21kTGluZSArJyAnKyBzQXJnOworICBlbmQ7CisKKyAgLy8gc3Bhd24gdGhlIGNoaWxkIHByb2Nlc3MKKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1N0YXJ0aW5nIGNsaWVudCAnK3NDbWRMaW5lKTsKKyAgV2luMzJDaGVjayggQ3JlYXRlUHJvY2VzcyggbmlsLCBQQ2hhcihzQ21kTGluZSksIG5pbCxuaWwsVFJVRSwwLG5pbCxuaWwsc2kscGkpKTsKKworICBDbG9zZUhhbmRsZSggcGkuaFRocmVhZCk7CisgICAgQ2xvc2VIYW5kbGUoIHBpLmhQcm9jZXNzKTsKK2VuZDsKKworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK3ZhcgorICBQb3J0IDogSW50ZWdlcjsKKyAgU2VydmVyRXZlbnRzIDogQm9vbGVhbjsKKyAgc1BpcGVOYW1lIDogc3RyaW5nOworICB0ZXN0SGFuZGxlciA6IElUZXN0SGFuZGxlcjsKKyAgdGVzdFByb2Nlc3NvciA6IElQcm9jZXNzb3I7CisgIFNlcnZlclRyYW5zIDogSVNlcnZlclRyYW5zcG9ydDsKKyAgU2VydmVyRW5naW5lIDogSVNlcnZlcjsKKyAgYW5vbnltb3VzcGlwZSA6IElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0OworICBuYW1lZHBpcGUgOiBJTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0OworICBUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgIGksIG51bVdvcmtlciA6IEludGVnZXI7CisgIHMgOiBzdHJpbmc7CisgIHByb3RUeXBlIDogVEtub3duUHJvdG9jb2w7CisgIHNlcnZlcnR5cGUgOiBUU2VydmVyVHlwZTsKKyAgZW5kcG9pbnQgOiBURW5kcG9pbnRUcmFuc3BvcnQ7CisgIGxheWVyZWQgOiBUTGF5ZXJlZFRyYW5zcG9ydHM7CisgIFVzZVNTTCA6IEJvb2xlYW47IC8vIGluY2x1ZGUgd2hlcmUgYXBwcm9wcmlhdGUgKFRMYXllcmVkVHJhbnNwb3J0PykKK2JlZ2luCisgIHRyeQorICAgIFNlcnZlckV2ZW50cyA6PSBGQUxTRTsKKyAgICBwcm90VHlwZSA6PSBwcm90X0JpbmFyeTsKKyAgICBzZXJ2ZXJ0eXBlIDo9IHNydl9TaW1wbGU7CisgICAgZW5kcG9pbnQgOj0gdHJuc19Tb2NrZXRzOworICAgIGxheWVyZWQgOj0gW107CisgICAgVXNlU1NMIDo9IEZBTFNFOworICAgIFBvcnQgOj0gOTA5MDsKKyAgICBzUGlwZU5hbWUgOj0gJyc7CisgICAgbnVtV29ya2VyIDo9IDQ7CisKKyAgICBpIDo9IDA7CisgICAgd2hpbGUgKCBpIDwgTGVuZ3RoKGFyZ3MpICkgZG8gYmVnaW4KKyAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgIEluYyhpKTsKKworICAgICAgLy8gQWxsb3dlZCBvcHRpb25zOgorICAgICAgaWYgKHMgPSAnLWgnKSBvciAocyA9ICctLWhlbHAnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgICBQcmludENtZExpbmVIZWxwOworICAgICAgICBFeGl0OworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tcG9ydCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGxpc3RlbgorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyhpKTsKKyAgICAgICAgUG9ydCA6PSBTdHJUb0ludERlZiggcywgUG9ydCk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1kb21haW4tc29ja2V0JykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ2RvbWFpbi1zb2NrZXQgbm90IHN1cHBvcnRlZCcpOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tbmFtZWQtcGlwZScpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCisgICAgICAgIGVuZHBvaW50IDo9IHRybnNfTmFtZWRQaXBlczsKKyAgICAgICAgc1BpcGVOYW1lIDo9IGFyZ3NbaV07ICAvLyAtcGlwZSA8bmFtZT4KKyAgICAgICAgSW5jKCBpICk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1zZXJ2ZXItdHlwZScpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLAorICAgICAgICAvLyBhcmcgPSAic2ltcGxlIiwgInRocmVhZC1wb29sIiwgInRocmVhZGVkIiwgb3IgIm5vbmJsb2NraW5nIgorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyhpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnc2ltcGxlJyAgICAgIHRoZW4gc2VydmVydHlwZSA6PSBzcnZfU2ltcGxlCisgICAgICAgIGVsc2UgaWYgcyA9ICd0aHJlYWQtcG9vbCcgdGhlbiBzZXJ2ZXJ0eXBlIDo9IHNydl9UaHJlYWRwb29sCisgICAgICAgIGVsc2UgaWYgcyA9ICd0aHJlYWRlZCcgICAgdGhlbiBzZXJ2ZXJ0eXBlIDo9IHNydl9UaHJlYWRlZAorICAgICAgICBlbHNlIGlmIHMgPSAnbm9uYmxvY2tpbmcnIHRoZW4gc2VydmVydHlwZSA6PSBzcnZfTm9uYmxvY2tpbmcKKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXRyYW5zcG9ydCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cAorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyhpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnYnVmZmVyZWQnIHRoZW4gSW5jbHVkZSggbGF5ZXJlZCwgdHJuc19CdWZmZXJlZCkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2ZyYW1lZCcgICB0aGVuIEluY2x1ZGUoIGxheWVyZWQsIHRybnNfRnJhbWVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnaHR0cCcgICAgIHRoZW4gZW5kcG9pbnQgOj0gdHJuc19IdHRwCisgICAgICAgIGVsc2UgaWYgcyA9ICdhbm9ucGlwZScgdGhlbiBlbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlcworICAgICAgICBlbHNlIEludmFsaWRBcmdzOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tcHJvdG9jb2wnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKGkpOworCisgICAgICAgIGlmICAgICAgcyA9ICdiaW5hcnknICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0JpbmFyeQorICAgICAgICBlbHNlIGlmIHMgPSAnY29tcGFjdCcgIHRoZW4gcHJvdFR5cGUgOj0gcHJvdF9Db21wYWN0CisgICAgICAgIGVsc2UgaWYgcyA9ICdqc29uJyAgICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0pTT04KKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXNzbCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1zc2wgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCisgICAgICAgIFVzZVNTTCA6PSBUUlVFOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tcHJvY2Vzc29yLWV2ZW50cycpIHRoZW4gYmVnaW4KKyAgICAgICAgIC8vIC0tcHJvY2Vzc29yLWV2ZW50cyAgICAgICAgICBwcm9jZXNzb3ItZXZlbnRzCisgICAgICAgIFNlcnZlckV2ZW50cyA6PSBUUlVFOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy1uJykgb3IgKHMgPSAnLS13b3JrZXJzJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLgorICAgICAgICAvLyBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZQorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIG51bVdvcmtlciA6PSBTdHJUb0ludERlZihzLDApOworICAgICAgICBpZiBudW1Xb3JrZXIgPiAwCisgICAgICAgIHRoZW4gSW5jKGkpCisgICAgICAgIGVsc2UgbnVtV29ya2VyIDo9IDQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgSW52YWxpZEFyZ3M7CisgICAgICBlbmQ7CisgICAgZW5kOworCisKKyAgICBDb25zb2xlLldyaXRlTGluZSgnU2VydmVyIGNvbmZpZ3VyYXRpb246ICcpOworCisgICAgLy8gY3JlYXRlIHByb3RvY29sIGZhY3RvcnksIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKKyAgICBjYXNlIHByb3RUeXBlIG9mCisgICAgICBwcm90X0JpbmFyeSAgOiAgUHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKCBCSU5BUllfU1RSSUNUX1JFQUQsIEJJTkFSWV9TVFJJQ1RfV1JJVEUpOworICAgICAgcHJvdF9KU09OICAgIDogIFByb3RvY29sRmFjdG9yeSA6PSBUSlNPTlByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CisgICAgICBwcm90X0NvbXBhY3QgOiAgUHJvdG9jb2xGYWN0b3J5IDo9IFRDb21wYWN0UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgICBlbHNlCisgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgcHJvdG9jb2wnKTsKKyAgICBlbmQ7CisgICAgQVNTRVJUKCBQcm90b2NvbEZhY3RvcnkgPD4gbmlsKTsKKyAgICBDb25zb2xlLldyaXRlTGluZSgnLSAnK1RIUklGVF9QUk9UT0NPTFNbcHJvdFR5cGVdKycgcHJvdG9jb2wnKTsKKworICAgIGNhc2UgZW5kcG9pbnQgb2YKKworICAgICAgdHJuc19Tb2NrZXRzIDogYmVnaW4KKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gc29ja2V0cyAocG9ydCAnK0ludFRvU3RyKHBvcnQpKycpJyk7CisgICAgICAgIGlmICh0cm5zX0J1ZmZlcmVkIGluIGxheWVyZWQpIHRoZW4gQ29uc29sZS5Xcml0ZUxpbmUoJy0gYnVmZmVyZWQnKTsKKyAgICAgICAgc2VydmVydHJhbnMgOj0gVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKCBQb3J0LCAwLCAodHJuc19CdWZmZXJlZCBpbiBsYXllcmVkKSk7CisgICAgICBlbmQ7CisKKyAgICAgIHRybnNfSHR0cCA6IGJlZ2luCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoRU5EUE9JTlRfVFJBTlNQT1JUU1tlbmRwb2ludF0rJyBzZXJ2ZXIgdHJhbnNwb3J0IG5vdCBpbXBsZW1lbnRlZCcpOworICAgICAgZW5kOworCisgICAgICB0cm5zX05hbWVkUGlwZXMgOiBiZWdpbgorICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBuYW1lZCBwaXBlICgnK3NQaXBlTmFtZSsnKScpOworICAgICAgICBuYW1lZHBpcGUgICA6PSBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHNQaXBlTmFtZSwgNDA5NiwgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTKTsKKyAgICAgICAgc2VydmVydHJhbnMgOj0gbmFtZWRwaXBlOworICAgICAgZW5kOworCisgICAgICB0cm5zX0Fub25QaXBlcyA6IGJlZ2luCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCctIGFub255bW91cyBwaXBlcycpOworICAgICAgICBhbm9ueW1vdXNwaXBlIDo9IFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGU7CisgICAgICAgIHNlcnZlcnRyYW5zICAgOj0gYW5vbnltb3VzcGlwZTsKKyAgICAgIGVuZAorCisgICAgZWxzZQorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIGVuZHBvaW50IHRyYW5zcG9ydCcpOworICAgIGVuZDsKKyAgICBBU1NFUlQoIHNlcnZlcnRyYW5zIDw+IG5pbCk7CisKKyAgICBpZiBVc2VTU0wgdGhlbiBiZWdpbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnU1NMIG5vdCBpbXBsZW1lbnRlZCcpOworICAgIGVuZDsKKworICAgIGlmICh0cm5zX0ZyYW1lZCBpbiBsYXllcmVkKSB0aGVuIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBmcmFtZWQgdHJhbnNwb3J0Jyk7CisgICAgICBUcmFuc3BvcnRGYWN0b3J5IDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLlRGYWN0b3J5LkNyZWF0ZQorICAgIGVuZAorICAgIGVsc2UgYmVnaW4KKyAgICAgIFRyYW5zcG9ydEZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKKyAgICBlbmQ7CisgICAgQVNTRVJUKCBUcmFuc3BvcnRGYWN0b3J5IDw+IG5pbCk7CisKKyAgICB0ZXN0SGFuZGxlciAgIDo9IFRUZXN0SGFuZGxlckltcGwuQ3JlYXRlOworICAgIHRlc3RQcm9jZXNzb3IgOj0gVFRocmlmdFRlc3QuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCB0ZXN0SGFuZGxlciApOworCisgICAgY2FzZSBzZXJ2ZXJ0eXBlIG9mCisgICAgICBzcnZfU2ltcGxlICAgICAgOiBiZWdpbgorICAgICAgICBTZXJ2ZXJFbmdpbmUgOj0gVFNpbXBsZVNlcnZlci5DcmVhdGUoIHRlc3RQcm9jZXNzb3IsIFNlcnZlclRyYW5zLCBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b2NvbEZhY3RvcnkpOworICAgICAgZW5kOworCisgICAgICBzcnZfTm9uYmxvY2tpbmcgOiBiZWdpbgorICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKFNFUlZFUl9UWVBFU1tzZXJ2ZXJ0eXBlXSsnIHNlcnZlciBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICAgIGVuZDsKKworICAgICAgc3J2X1RocmVhZHBvb2wsCisgICAgICBzcnZfVGhyZWFkZWQ6IGJlZ2luCisgICAgICAgIGlmIG51bVdvcmtlciA+IDEgdGhlbiB7dXNlIGhlcmV9OworICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKFNFUlZFUl9UWVBFU1tzZXJ2ZXJ0eXBlXSsnIHNlcnZlciBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICAgIGVuZDsKKworICAgIGVsc2UKKyAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBzZXJ2ZXIgdHlwZScpOworICAgIGVuZDsKKyAgICBBU1NFUlQoIFNlcnZlckVuZ2luZSA8PiBuaWwpOworCisgICAgdGVzdEhhbmRsZXIuU2V0U2VydmVyKCBTZXJ2ZXJFbmdpbmUpOworCisgICAgLy8gdGVzdCBldmVudHM/CisgICAgaWYgU2VydmVyRXZlbnRzIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCctIHNlcnZlciBldmVudHMgdGVzdCBlbmFibGVkJyk7CisgICAgICBTZXJ2ZXJFbmdpbmUuU2VydmVyRXZlbnRzIDo9IFRTZXJ2ZXJFdmVudHNJbXBsLkNyZWF0ZTsKKyAgICBlbmQ7CisKKyAgICAvLyBzdGFydCB0aGUgY2xpZW50IG5vdyB3aGVuIHdlIGhhdmUgdGhlIGFub24gaGFuZGxlcywgYnV0IGJlZm9yZSB0aGUgc2VydmVyIHN0YXJ0cworICAgIGlmIGVuZHBvaW50ID0gdHJuc19Bbm9uUGlwZXMKKyAgICB0aGVuIExhdW5jaEFub25QaXBlQ2hpbGQoIEV4dHJhY3RGaWxlUGF0aChQYXJhbVN0cigwKSkrJ2NsaWVudC5leGUnLCBhbm9ueW1vdXNwaXBlKTsKKworICAgIC8vIGluc3RhbGwgQ3RybCtDIGhhbmRsZXIgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzCisgICAgZ19IYW5kbGVyIDo9IHRlc3RIYW5kbGVyOworICAgIFNldENvbnNvbGVDdHJsSGFuZGxlciggQE15Q29uc29sZUV2ZW50SGFuZGxlciwgVFJVRSk7CisKKyAgICBDb25zb2xlLldyaXRlTGluZSgnJyk7CisgICAgcmVwZWF0CisgICAgICBDb25zb2xlLldyaXRlTGluZSgnU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4nKTsKKyAgICAgIHNlcnZlckVuZ2luZS5TZXJ2ZTsKKyAgICB1bnRpbCB7JElGREVGIFJ1bkVuZGxlc3N9IEZBTFNFIHskRUxTRX0gVFJVRSB7JEVORElGfTsKKworICAgIHRlc3RIYW5kbGVyLlNldFNlcnZlciggbmlsKTsKKyAgICBnX0hhbmRsZXIgOj0gbmlsOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEVBYm9ydCBkbyByYWlzZTsKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBFLk1lc3NhZ2UgKyAjMTAgKyBFLlN0YWNrVHJhY2UgKTsKKyAgICBlbmQ7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdkb25lLicpOworZW5kOworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjA4Y2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXJFdmVudHMucGFzCkBAIC0wLDAgKzEsMTc0IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGVzdFNlcnZlckV2ZW50czsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIFRocmlmdCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuU2VydmVyLAorICBDb25zb2xlSGVscGVyOworCit0eXBlCisgIFRSZXF1ZXN0RXZlbnRzSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVJlcXVlc3RFdmVudHMpCisgIHByb3RlY3RlZAorICAgIEZTdGFydCA6IFREYXRlVGltZTsKKyAgICAvLyBJUmVxdWVzdFByb2Nlc3NpbmdFdmVudHMKKyAgICBwcm9jZWR1cmUgUHJlUmVhZDsKKyAgICBwcm9jZWR1cmUgUG9zdFJlYWQ7CisgICAgcHJvY2VkdXJlIFByZVdyaXRlOworICAgIHByb2NlZHVyZSBQb3N0V3JpdGU7CisgICAgcHJvY2VkdXJlIE9uZXdheUNvbXBsZXRlOworICAgIHByb2NlZHVyZSBVbmhhbmRsZWRFcnJvciggY29uc3QgZSA6IEV4Y2VwdGlvbik7CisgICAgcHJvY2VkdXJlIENsZWFudXBDb250ZXh0OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgIGVuZDsKKworCisgIFRQcm9jZXNzb3JFdmVudHNJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvY2Vzc29yRXZlbnRzKQorICBwcm90ZWN0ZWQKKyAgICBGUmVxcyA6IEludGVnZXI7CisgICAgLy8gSVByb2Nlc3NvckV2ZW50cworICAgIHByb2NlZHVyZSBQcm9jZXNzaW5nKCBjb25zdCB0cmFuc3BvcnQgOiBJVHJhbnNwb3J0KTsKKyAgICBmdW5jdGlvbiAgQ3JlYXRlUmVxdWVzdENvbnRleHQoIGNvbnN0IGFGdW5jdGlvbk5hbWUgOiBzdHJpbmcpIDogSVJlcXVlc3RFdmVudHM7CisgICAgcHJvY2VkdXJlIENsZWFudXBDb250ZXh0OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgIGVuZDsKKworCisgIFRTZXJ2ZXJFdmVudHNJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2VydmVyRXZlbnRzKQorICBwcm90ZWN0ZWQKKyAgICAvLyBJU2VydmVyRXZlbnRzCisgICAgcHJvY2VkdXJlIFByZVNlcnZlOworICAgIHByb2NlZHVyZSBQcmVBY2NlcHQ7CisgICAgZnVuY3Rpb24gIENyZWF0ZVByb2Nlc3NpbmdDb250ZXh0KCBjb25zdCBpbnB1dCwgb3V0cHV0IDogSVByb3RvY29sKSA6IElQcm9jZXNzb3JFdmVudHM7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCit7IFRTZXJ2ZXJFdmVudHNJbXBsIH0KKworcHJvY2VkdXJlIFRTZXJ2ZXJFdmVudHNJbXBsLlByZVNlcnZlOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1NlcnZlckV2ZW50czogU2VydmVyIHN0YXJ0aW5nIHRvIHNlcnZlIHJlcXVlc3RzJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTZXJ2ZXJFdmVudHNJbXBsLlByZUFjY2VwdDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdTZXJ2ZXJFdmVudHM6IFNlcnZlciB0cmFuc3BvcnQgaXMgcmVhZHkgdG8gYWNjZXB0IGluY29taW5nIGNhbGxzJyk7CitlbmQ7CisKKworZnVuY3Rpb24gVFNlcnZlckV2ZW50c0ltcGwuQ3JlYXRlUHJvY2Vzc2luZ0NvbnRleHQoY29uc3QgaW5wdXQsIG91dHB1dDogSVByb3RvY29sKTogSVByb2Nlc3NvckV2ZW50czsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUHJvY2Vzc29yRXZlbnRzSW1wbC5DcmVhdGU7CitlbmQ7CisKKworeyBUUHJvY2Vzc29yRXZlbnRzSW1wbCB9CisKK2NvbnN0cnVjdG9yIFRQcm9jZXNzb3JFdmVudHNJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZSZXFzIDo9IDA7CisgIENvbnNvbGUuV3JpdGVMaW5lKCdQcm9jZXNzb3JFdmVudHM6IENsaWVudCBjb25uZWN0ZWQsIHByb2Nlc3NpbmcgYmVnaW5zJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvY2Vzc29yRXZlbnRzSW1wbC5Qcm9jZXNzaW5nKGNvbnN0IHRyYW5zcG9ydDogSVRyYW5zcG9ydCk7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUHJvY2Vzc29yRXZlbnRzOiBQcm9jZXNzaW5nIG9mIGluY29taW5nIHJlcXVlc3QgYmVnaW5zJyk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb2Nlc3NvckV2ZW50c0ltcGwuQ3JlYXRlUmVxdWVzdENvbnRleHQoIGNvbnN0IGFGdW5jdGlvbk5hbWU6IHN0cmluZyk6IElSZXF1ZXN0RXZlbnRzOworYmVnaW4KKyAgcmVzdWx0IDo9IFRSZXF1ZXN0RXZlbnRzSW1wbC5DcmVhdGU7CisgIEluYyggRlJlcXMpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvY2Vzc29yRXZlbnRzSW1wbC5DbGVhbnVwQ29udGV4dDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCAnUHJvY2Vzc29yRXZlbnRzOiBjb21wbGV0ZWQgYWZ0ZXIgaGFuZGxpbmcgJytJbnRUb1N0cihGUmVxcykrJyByZXF1ZXN0cy4nKTsKK2VuZDsKKworCit7IFRSZXF1ZXN0RXZlbnRzSW1wbCB9CisKKworY29uc3RydWN0b3IgVFJlcXVlc3RFdmVudHNJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdGFydCA6PSBOb3c7CisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBOZXcgcmVxdWVzdCcpOworZW5kOworCisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuUHJlUmVhZDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBSZWFkaW5nIHJlcXVlc3QgbWVzc2FnZSAuLi4nKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlBvc3RSZWFkOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IFJlYWRpbmcgcmVxdWVzdCBtZXNzYWdlIGNvbXBsZXRlZCcpOworZW5kOworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlByZVdyaXRlOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IFdyaXRpbmcgcmVzcG9uc2UgbWVzc2FnZSAuLi4nKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlBvc3RXcml0ZTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBXcml0aW5nIHJlc3BvbnNlIG1lc3NhZ2UgY29tcGxldGVkJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5PbmV3YXlDb21wbGV0ZTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBPbmV3YXkgbWVzc2FnZSBwcm9jZXNzZWQnKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlVuaGFuZGxlZEVycm9yKGNvbnN0IGU6IEV4Y2VwdGlvbik7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogVW5oYW5kbGVkIGV4Y2VwdGlvbiBvZiB0eXBlICcrZS5jbGFzc25hbWUpOworZW5kOworCisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuQ2xlYW51cENvbnRleHQ7Cit2YXIgbWlsbGlzIDogRG91YmxlOworYmVnaW4KKyAgbWlsbGlzIDo9IChOb3cgLSBGU3RhcnQpICogKDI0KjYwKjYwKjEwMDApOworICBDb25zb2xlLldyaXRlTGluZSggJ1JlcXVlc3QgcHJvY2Vzc2luZyBjb21wbGV0ZWQgaW4gJytJbnRUb1N0cihSb3VuZChtaWxsaXMpKSsnIG1zJyk7CitlbmQ7CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIgYi9saWIvZGVscGhpL3Rlc3QvY2xpZW50LmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRiZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIKQEAgLTAsMCArMSw3MiBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCisKK3Byb2dyYW0gY2xpZW50OworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywKKyAgVGVzdENsaWVudCBpbiAnVGVzdENsaWVudC5wYXMnLAorICBUaHJpZnQuVGVzdCwgLy8gaW4gJ2dlbi1kZWxwaGlcVGhyaWZ0LlRlc3QucGFzJywKKyAgVGhyaWZ0IGluICcuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnOworCit2YXIKKyAgblBhcmFtQ291bnQgOiBJbnRlZ2VyOworICBhcmdzIDogYXJyYXkgb2Ygc3RyaW5nOworICBpIDogSW50ZWdlcjsKKyAgYXJnIDogc3RyaW5nOworCitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCAnRGVscGhpIFRlc3RDbGllbnQgJytUaHJpZnQuVmVyc2lvbik7CisgICAgblBhcmFtQ291bnQgOj0gUGFyYW1Db3VudDsKKyAgICBTZXRMZW5ndGgoIGFyZ3MsIG5QYXJhbUNvdW50KTsKKyAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvIGJlZ2luCisgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKKyAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CisgICAgZW5kOworCisgICAgRXhpdENvZGUgOj0gVFRlc3RDbGllbnQuRXhlY3V0ZSggYXJncyk7CisKKyAgZXhjZXB0CisgICAgb24gRTogRUFib3J0IGRvIGJlZ2luCisgICAgICBFeGl0Q29kZSA6PSAkRkY7CisgICAgZW5kOworICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgICAgIEV4aXRDb2RlIDo9ICRGRjsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUkVBRE1FLm1kIGIvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTQ1ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9SRUFETUUubWQKQEAgLTAsMCArMSwyOCBAQAorSG93IHRvIHVzZSB0aGUgdGVzdCBjYXNlOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSBjb3B5IGFuZCB0aGUgdGVtcGxhdGUgYmF0Y2ggZmlsZQorLSBvcGVuIHRoZSBiYXRjaCBmaWxlIGFuZCBhZGp1c3QgY29uZmlndXJhdGlvbiBhcyBuZWNlc3NhcnkKKy0gcnVuIHRoZSBiYXRjaAorCisKK0NvbmZpZ3VyYXRpb246CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTVk5XT1JLRElSCitzaG91bGQgcG9pbnQgdG8gdGhlIFRocmlmdCB3b3JraW5nIGNvcHkgcm9vdAorCitNWV9USFJJRlRfRklMRVMKK2NhbiBiZSBzZXQgdG8gcG9pbnQgdG8gYSBmb2xkZXIgd2l0aCBtb3JlIHRocmlmdCBJREwgZmlsZXMuCitJZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgc3VjaCBmaWxlcywganVzdCBsZWF2ZSB0aGUgc2V0dGluZyBibGFuay4KKworQklOCitMb2NhbCBNU1lTIGJpbmFyeSBmb2xkZXIuIFlvdXIgVEhSSUZULkVYRSBpcyBpbnN0YWxsZWQgaGVyZS4KKworTUlOR1dfQklOCitMb2NhbCBNaW5HVyBiaW4gZm9sZGVyLiBDb250YWlucyBETEwgZmlsZXMgcmVxdWlyZWQgYnkgVEhSSUZULkVYRQorCitEQ0MKK0lkZW50aWZpZXMgdGhlIERlbHBoaSBDb21tYW5kIExpbmUgY29tcGlsZXIgKGRjYzMyLmV4ZSkKK1RvIGJlIGNvbmZpZ3VpcmVkIG9ubHksIGlmIHRoZSBkZWZhdWx0IGlzIG5vdCBzdWl0YWJsZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKkVPRioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9ydW4tUGFzY2FsLUNvZGVnZW4tVGVzdHMuYmF0LnRtcGwgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9ydW4tUGFzY2FsLUNvZGVnZW4tVGVzdHMuYmF0LnRtcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhYjBhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL3J1bi1QYXNjYWwtQ29kZWdlbi1UZXN0cy5iYXQudG1wbApAQCAtMCwwICsxLDE3MyBAQAorUkVNIC8qCitSRU0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitSRU0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorUkVNICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK1JFTSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorUkVNICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorUkVNICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorUkVNICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitSRU0gKgorUkVNICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1JFTSAqCitSRU0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitSRU0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorUkVNICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitSRU0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorUkVNICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworUkVNICogdW5kZXIgdGhlIExpY2Vuc2UuCitSRU0gKi8KK0BlY2hvIG9mZgoraWYgIiI9PSIlMSIgZ290byBDT05GSUcKK2dvdG8gSEFORExFRElSCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOkNPTkZJRworUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSAqIENPTkZJR1VSQVRJT04gQkVHSU4KK3JlbSAqIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIGFkanVzdCBhcyBuZWNlc3NhcnkgdG8gbWVldCB5b3VyIHN5c3RlbSBzZXR1cAorc2V0IFNWTldPUktESVI9CitzZXQgTVlfVEhSSUZUX0ZJTEVTPQorc2V0IEJJTj1DOlxNU3lzMTBcbG9jYWxcYmluCitzZXQgTUlOR1dfQklOPUM6XE1pbkdXXGJpbgorc2V0IERDQz0KK3NldCBTVUJESVI9Z2VuLWRlbHBoaQorcmVtICogQ09ORklHVVJBVElPTiBFTkQKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpTVEFSVAorUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSAqIGNvbmZpZ3VyZWQ/CitpZiAiJVNWTldPUktESVIlIj09IiIgZ290byBDT05GSUdfRVJST1IKKworcmVtICogdHJ5IHRvIGZpbmQgZGNjMzIuZXhlCitlY2hvIExvb2tpbmcgZm9yIGRjYzMyLmV4ZSAuLi4KK2lmIG5vdCBleGlzdCAiJURDQyUiIHNldCBEQ0M9JVByb2dyYW1GaWxlcyVcRW1iYXJjYWRlcm9cUkFEIFN0dWRpb1w4LjBcYmluXGRjYzMyLmV4ZQoraWYgbm90IGV4aXN0ICIlRENDJSIgc2V0IERDQz0lUHJvZ3JhbUZpbGVzKHg4NiklXEVtYmFyY2FkZXJvXFJBRCBTdHVkaW9cOC4wXGJpblxkY2MzMi5leGUKK2lmIG5vdCBleGlzdCAiJURDQyUiIGdvdG8gQ09ORklHX0VSUk9SCitlY2hvIEZvdW5kICVEQ0MlCitlY2hvLgorCityZW0gKiBzb21lIGhlbHBlcnMKK3NldCBQQVRIPSVCSU4lOyVNSU5HV19CSU4lOyVQQVRIJQorc2V0IFRBUkdFVD0lU1ZOV09SS0RJUiVcLi5cdGhyaWZ0LXRlc3RpbmcKK3NldCBTT1VSQ0U9JVNWTldPUktESVIlCitzZXQgVEVTVEFQUD1UZXN0UHJvamVjdAorc2V0IFVOSVRTRUFSQ0g9JVNPVVJDRSVcbGliXHBhc1xzcmM7JVNPVVJDRSVcbGliXGRlbHBoaVxzcmMKK3NldCBPVVREQ1U9IiVUQVJHRVQlXGRjdSIKK3NldCBMT0dGSUxFPSVUQVJHRVQlXCVTVUJESVIlXGNvZGVnZW4ubG9nCisKK3JlbSAqIGNyZWF0ZSBhbmQvb3IgZW1wdHkgdGFyZ2V0IGRpcnMKK2lmIG5vdCBleGlzdCAiJVRBUkdFVCUiICAgICAgICAgICBtZCAiJVRBUkdFVCUiCitpZiBub3QgZXhpc3QgIiVUQVJHRVQlXCVTVUJESVIlIiAgbWQgIiVUQVJHRVQlXCVTVUJESVIlIgoraWYgbm90IGV4aXN0ICIlT1VURENVJSIgICAgICAgICAgIG1kICIlT1VURENVJSIKK2lmIGV4aXN0ICIlVEFSR0VUJVwqLnRocmlmdCIgICAgICBkZWwgIiVUQVJHRVQlXCoudGhyaWZ0IiAgICAgICAvUQoraWYgZXhpc3QgIiVUQVJHRVQlXCVTVUJESVIlXCouKiIgIGRlbCAiJVRBUkdFVCVcJVNVQkRJUiVcKi4qIiAgIC9RCitpZiBleGlzdCAiJU9VVERDVSVcKi4qIiAgICAgICAgICAgZGVsICIlT1VURENVJVwqLioiICAgICAgICAgICAgL1EKKworcmVtICogcmVjdXJzZSB0aHJvdWdoIHRocmlmdCBXQyBhbmQgIm15IHRocmlmdCBmaWxlcyIgZm9sZGVyCityZW0gKiBjb3BpZXMgYWxsIC50aHJpZnQgZmlsZXMgaW50byB0aHJpZnQtdGVzdGluZworY2FsbCAlMCAlU09VUkNFJQoraWYgbm90ICIlTVlfVEhSSUZUX0ZJTEVTJSI9PSIiIGNhbGwgJTAgJU1ZX1RIUklGVF9GSUxFUyUKKworcmVtICogY29tcGlsZSBhbGwgdGhyaWZ0IGZpbGVzLCBnZW5lcmF0ZSBQQVMgYW5kIEMrKyBjb2RlCitlY2hvLgorZWNobyBHZW5lcmF0aW5nIGNvZGUsIHBsZWFzZSB3YWl0IC4uLgorY2QgIiVUQVJHRVQlIgorZm9yICUlYSBpbiAoKi50aHJpZnQpIGRvICIlQklOJVx0aHJpZnQuZXhlIiAtdiAtLWdlbiBkZWxwaGk6cmVnaXN0ZXJfdHlwZXMsY29uc3RwcmVmaXgsZXZlbnRzLHhtbGRvYyAiJSVhIiAyPj4gIiVMT0dGSUxFJSIKK1JFTSAqIGZvciAlJWEgaW4gKCoudGhyaWZ0KSBkbyAiJUJJTiVcdGhyaWZ0LmV4ZSIgLXYgLS1nZW4gY3BwICIlJWEiID4+IE5VTDoKK2NtZCAvYyBzdGFydCBub3RlcGFkICIlTE9HRklMRSUiCitjZCAuLgorCityZW0gKiBjaGVjayBmb3Igc3BlY2lhbCBEZWxwaGkgdGVzdGNhc2VzIGJlaW5nIHByb2Nlc3NlZAoraWYgbm90IGV4aXN0ICIlVEFSR0VUJVwlU1VCRElSJVxSZXNlcnZlZEtleXdvcmRzLnBhcyIgZ290byBURVNUQ0FTRV9NSVNTSU5HCisKKworcmVtICogZ2VuZXJhdGUgYSBtaW5pbWFsIERQUiBmaWxlIHRoYXQgdXNlcyBhbGwgZ2VuZXJhdGVkIHBhc2NhbCB1bml0cworY2QgIiVUQVJHRVQlXCVTVUJESVIlXCIKK2lmIGV4aXN0IGluaGVyaXRlZC4qICByZW4gaW5oZXJpdGVkLiogIF9pbmhlcml0ZWQuKgorZWNobyBwcm9ncmFtICVURVNUQVBQJTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAlVEVTVEFQUCUuZHByCitlY2hvIHskQVBQVFlQRSBDT05TT0xFfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyB1c2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitmb3IgJSVhIGluICgqLnBhcykgZG8gZWNobyAgICUlfm5hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gICBXaW5kb3dzLCBDbGFzc2VzLCBTeXNVdGlsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNoby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvIGJlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gICBXcml0ZWxuKCdTdWNjZXNzZnVsbHkgY29tcGlsZWQhJyk7ICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyAgIFdyaXRlbG4oJ0xpc3Qgb2YgdW5pdHM6Jyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitmb3IgJSVhIGluICgqLnBhcykgZG8gZWNobyAgIFdyaXRlKCclJX5uYSc6MzAsJyc6MTApOyAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gICBXcml0ZWxuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyBlbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2NkIC4uXC4uCisKK3JlbSAqIHRyeSB0byBjb21waWxlIHRoZSBEUFIKK3JlbSAqIHRoaXMgc2hvdWxkIG5vdCB0aHJvdyBhbnkgZXJyb3JzLCB3YXJuaW5ncyBvciBoaW50cworIiVEQ0MlIiAgLUIgIiVUQVJHRVQlXCVTVUJESVIlXCVURVNUQVBQJSIgLVUiJVVOSVRTRUFSQ0glIiAtSSIlVU5JVFNFQVJDSCUiIC1OIiVPVVREQ1UlIiAtRSIlVEFSR0VUJVwlU1VCRElSJSIKK2RpciAiJVRBUkdFVCVcJVNVQkRJUiVcJVRFU1RBUFAlLmV4ZSIKK2lmIG5vdCBleGlzdCAiJVRBUkdFVCVcJVNVQkRJUiVcJVRFU1RBUFAlLmV4ZSIgIGdvdG8gQ09ERUdFTl9GQUlMRUQKK2VjaG8uCitlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlY2hvIFRoZSBjb21waWxlZCBwcm9ncmFtIGlzIG5vdyBleGVjdXRlZC4gSWYgaXQgaGFuZ3Mgb3IgY3Jhc2hlcywgd2UKK2VjaG8gaGF2ZSBhIHNlcmlvdXMgcHJvYmxlbSB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZS4gRXhwZWN0ZWQgb3V0cHV0CitlY2hvIGlzICJTdWNjZXNzZnVsbHkgY29tcGlsZWQ6IiBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgZ2VuZXJhdGVkIHVuaXRzLgorZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiVUQVJHRVQlXCVTVUJESVIlXCVURVNUQVBQJS5leGUiCitlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlY2hvLgorcGF1c2UKK0dPVE8gRU9GCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOkRYRV9OT1RfRk9VTkQKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZWNobyBEZWxwaGkgQ29tcGlsZXIgKGRjYzMyLmV4ZSkgbm90IGZvdW5kLgorZWNobyBQbGVhc2UgY2hlY2sgdGhlICJEQ0MiIHNldHRpbmcgaW4gdGhpcyBiYXRjaC4KK2VjaG8uCitjbWQgL2Mgc3RhcnQgbm90ZXBhZCBSRUFETUUuTUQKK2NtZCAvYyBzdGFydCBub3RlcGFkICUwCitwYXVzZQorR09UTyBFT0YKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpDT05GSUdfRVJST1IKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZWNobyBNaXNzaW5nLCBpbmNvbXBsZXRlIG9yIHdyb25nIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MhCitjbWQgL2Mgc3RhcnQgbm90ZXBhZCBSRUFETUUuTUQKK2NtZCAvYyBzdGFydCBub3RlcGFkICUwCitwYXVzZQorR09UTyBFT0YKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpURVNUQ0FTRV9NSVNTSU5HCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VjaG8gTWlzc2luZyBhbiBleHBlY3RlZCBEZWxwaGkgdGVzdGNhc2UhCitwYXVzZQorR09UTyBFT0YKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpDT0RFR0VOX0ZBSUxFRAorUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlY2hvIENvZGUgZ2VuZXJhdGlvbiBGQUlMRUQhCitwYXVzZQorR09UTyBFT0YKKworCitSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzpIQU5ETEVESVIKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUkVNIGVjaG8gJTEKK2ZvciAvRCAlJWEgaW4gKCUxXCopIGRvIGNhbGwgJTAgJSVhCitpZiBleGlzdCAiJTFcKi50aHJpZnQiICAgY29weSAvYiAiJTFcKi50aHJpZnQiICIlVEFSR0VUJVwqLioiCitHT1RPIEVPRgorCisKK1JFTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOkVPRgorUkVNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0N2E1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdApAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG1ha2Ugc3VyZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBwcm9kdWNlIG5hbWUgY29sbGlzaW9ucyB3aXRoIHByZWRlZmluZWQga2V5d29yZHMKK25hbWVzcGFjZSBkZWxwaGkgU3lzVXRpbHMKKworY29uc3QgaTMyIGludGVnZXIgPSA0MgorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJjOGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByCkBAIC0wLDAgKzEsMTUgQEAKK3Byb2dyYW0gUmVzZXJ2ZWRLZXl3b3JkczsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgU3lzVXRpbHMsIFN5c3RlbV87CisKK2JlZ2luCisgIHRyeQorICAgIHsgVE9ETyAtb1VzZXIgLWNDb25zb2xlIE1haW4gOiBDb2RlIGhpZXIgZWluZvxnZW4gfQorICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkOTU0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qCkBAIC0wLDAgKzEsMTEyIEBACivvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByb2plY3RHdWlkPntGMkU5QjZGQy1BOTMxLTQyNzEtOEUzMC01QTRFNDAyNDgxQjR9PC9Qcm9qZWN0R3VpZD4KKwkJCTxNYWluU291cmNlPlJlc2VydmVkS2V5d29yZHMuZHByPC9NYWluU291cmNlPgorCQkJPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgorCQkJPEJhc2lzPlRydWU8L0Jhc2lzPgorCQkJPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KKwkJCTxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisJCQk8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgorCQkJPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KKwkJCTxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KKwkJCTxDZmdfMT50cnVlPC9DZmdfMT4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgorCQkJPENmZ18yPnRydWU8L0NmZ18yPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRGN1T3V0cHV0PgorCQkJPERDQ19Vbml0U2VhcmNoUGF0aD5nZW4tZGVscGhpOy4uXC4uXHNyYzskKERDQ19Vbml0U2VhcmNoUGF0aCk8L0RDQ19Vbml0U2VhcmNoUGF0aD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0V4ZU91dHB1dD4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19LPmZhbHNlPC9EQ0NfSz4KKwkJCTxEQ0NfRT5mYWxzZTwvRENDX0U+CisJCQk8RENDX0Y+ZmFsc2U8L0RDQ19GPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgorCQkJPERDQ19EZWZpbmU+REVCVUc7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4KKwkJCTxEQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz50cnVlPC9EQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KKwkJCTxEQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RDQ19Mb2NhbERlYnVnU3ltYm9scz4KKwkJCTxEQ0NfRGVmaW5lPlJFTEVBU0U7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4wPC9EQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4KKwkJCTxEQ0NfRGVidWdJbmZvcm1hdGlvbj5mYWxzZTwvRENDX0RlYnVnSW5mb3JtYXRpb24+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPEl0ZW1Hcm91cD4KKwkJCTxEZWxwaGlDb21waWxlIEluY2x1ZGU9IlJlc2VydmVkS2V5d29yZHMuZHByIj4KKwkJCQk8TWFpblNvdXJjZT5NYWluU291cmNlPC9NYWluU291cmNlPgorCQkJPC9EZWxwaGlDb21waWxlPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KKwkJCQk8S2V5PkNmZ18yPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iQmFzaXMiPgorCQkJCTxLZXk+QmFzZTwvS2V5PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4KKwkJCQk8S2V5PkNmZ18xPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJPC9JdGVtR3JvdXA+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cyIvPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qJykiIFByb2plY3Q9IiQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2oiLz4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJlQnVpbGRFdmVudD48IVtDREFUQVt0aHJpZnQgLXIgIC1nZW4gZGVscGhpIFJlc2VydmVkS2V5d29yZHMudGhyaWZ0XV0+PC9QcmVCdWlsZEV2ZW50PgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZVZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ii8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIi8+CisJCQkJCTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQk8U291cmNlPgorCQkJCQkJPFNvdXJjZSBOYW1lPSJNYWluU291cmNlIj5SZXNlcnZlZEtleXdvcmRzLmRwcjwvU291cmNlPgorCQkJCQk8L1NvdXJjZT4KKwkJCQk8L0RlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQk8UGxhdGZvcm1zPgorCQkJCQk8UGxhdGZvcm0gdmFsdWU9IldpbjMyIj5UcnVlPC9QbGF0Zm9ybT4KKwkJCQk8L1BsYXRmb3Jtcz4KKwkJCTwvQm9ybGFuZFByb2plY3Q+CisJCQk8UHJvamVjdEZpbGVWZXJzaW9uPjEyPC9Qcm9qZWN0RmlsZVZlcnNpb24+CisJCTwvUHJvamVjdEV4dGVuc2lvbnM+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0IGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDlkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gbWFrZSBzdXJlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHByb2R1Y2UgbmFtZSBjb2xsaXNpb25zIHdpdGggcHJlZGVmaW5lZCBrZXl3b3JkcworbmFtZXNwYWNlIGRlbHBoaSBTeXN0ZW0KKworaW5jbHVkZSAiUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQiCisKKwordHlwZWRlZiBpMzIgQ2FyZGluYWwKK3R5cGVkZWYgc3RyaW5nIG1lc3NhZ2UKK3R5cGVkZWYgbGlzdDwgbWFwPCBDYXJkaW5hbCwgbWVzc2FnZT4+IHByb2dyYW0KKworc3RydWN0IHVuaXQgeworICAxOiBDYXJkaW5hbCBkb3dudG87CisgIDI6IHByb2dyYW0gcHJvY2VkdXJlOworfQorCit0eXBlZGVmIHNldDwgdW5pdD4gdW5pdHMKKworZXhjZXB0aW9uIGV4Y2VwdGlvbjEgeworICAxOiBwcm9ncmFtIG1lc3NhZ2U7CisgIDI6IHVuaXQgYXJyYXk7Cit9CisKK3NlcnZpY2UgY29uc3RydWN0b3IgeworICB1bml0IENyZWF0ZSgxOiBDYXJkaW5hbCBhc207IDI6IG1lc3NhZ2UgaW5oZXJpdGVkKSB0aHJvd3MgKDE6IGV4Y2VwdGlvbjEgbGFiZWwpOworICB1bml0cyBEZXN0cm95KCk7Cit9CisKK2NvbnN0IENhcmRpbmFsIGRvd250byA9ICsxCitjb25zdCBDYXJkaW5hbCBwdWJsaXNoZWQgPSAtMQorCitlbnVtIGtleXdvcmRzIHsKKyAgcmVjb3JkID0gMSwKKyAgcmVwZWF0ID0gMiwKKyAgZGVwcmVjYXRlZCA9IDMKK30KKworCitzdHJ1Y3QgU3RydWN0X2xpc3RzIHsKKyAgMTogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBpbml0OworICAyOiBsaXN0PFN0cnVjdF9zaW1wbGU+IHN0cnVjOworICAzOiBsaXN0PFN0cnVjdF9zaW1wbGU+IGZpZWxkOworICA0OiBsaXN0PFN0cnVjdF9zaW1wbGU+IGZpZWxkXzsKKyAgNTogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiB0cmFja2VyOworICA2OiBsaXN0PFN0cnVjdF9zaW1wbGU+IFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc3RydWN0cyB7CisgIDE6IFN0cnVjdF9zaW1wbGUgaW5pdDsKKyAgMjogU3RydWN0X3NpbXBsZSBzdHJ1YzsKKyAgMzogU3RydWN0X3NpbXBsZSBmaWVsZDsKKyAgNDogU3RydWN0X3NpbXBsZSBmaWVsZF87CisgIDU6IFN0cnVjdF9zaW1wbGUgdHJhY2tlcjsKKyAgNjogU3RydWN0X3NpbXBsZSBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3NpbXBsZSB7CisgIDE6IGJvb2wgaW5pdDsKKyAgMjogYm9vbCBzdHJ1YzsKKyAgMzogYm9vbCBmaWVsZDsKKyAgNDogYm9vbCBmaWVsZF87CisgIDU6IGJvb2wgdHJhY2tlcjsKKyAgNjogYm9vbCBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3N0cmluZ3MgeworICAxOiBzdHJpbmcgaW5pdDsKKyAgMjogc3RyaW5nIHN0cnVjOworICAzOiBzdHJpbmcgZmllbGQ7CisgIDQ6IHN0cmluZyBmaWVsZF87CisgIDU6IHN0cmluZyB0cmFja2VyOworICA2OiBzdHJpbmcgU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9iaW5hcnkgeworICAxOiBiaW5hcnkgaW5pdDsKKyAgMjogYmluYXJ5IHN0cnVjOworICAzOiBiaW5hcnkgZmllbGQ7CisgIDQ6IGJpbmFyeSBmaWVsZF87CisgIDU6IGJpbmFyeSB0cmFja2VyOworICA2OiBiaW5hcnkgU2VsZjsKK30KKworCit0eXBlZGVmIGkzMiBJUHJvdG9jb2wgCit0eXBlZGVmIGkzMiBJVHJhbnNwb3J0Cit0eXBlZGVmIGkzMiBJRmFjZQordHlwZWRlZiBpMzIgSUFzeW5jCit0eXBlZGVmIGkzMiBTeXN0ZW0KK3R5cGVkZWYgaTMyIFN5c1V0aWxzCit0eXBlZGVmIGkzMiBHZW5lcmljcwordHlwZWRlZiBpMzIgVGhyaWZ0CisKK3N0cnVjdCBTdHJ1Y3RfVGhyaWZ0X05hbWVzIHsKKyAgMTogSVByb3RvY29sICAgSVByb3RvY29sCisgIDI6IElUcmFuc3BvcnQgIElUcmFuc3BvcnQKKyAgMzogSUZhY2UgICAgICAgSUZhY2UKKyAgNDogSUFzeW5jICAgICAgSUFzeW5jCisgIDU6IFN5c3RlbSAgICAgIFN5c3RlbQorICA2OiBTeXNVdGlscyAgICBTeXNVdGlscworICA3OiBHZW5lcmljcyAgICBHZW5lcmljcworICA4OiBUaHJpZnQgICAgICBUaHJpZnQKK30KKworCitlbnVtIFRocmlmdDQ1NTRfRW51bSB7CisgIEZvbyA9IDAsCisgIEJhciA9IDEsCisgIEJheiA9IDIsCit9CisKK3N0cnVjdCBUaHJpZnQ0NTU0X1N0cnVjdCB7CisgIDEgOiBvcHRpb25hbCBkb3VibGUgTWluVmFsdWUKKyAgMiA6IG9wdGlvbmFsIGRvdWJsZSBNYXhWYWx1ZQorICAzIDogb3B0aW9uYWwgYm9vbCBJbnRlZ2VyICAvLyBjYXVzZXMgaXNzdWUKKyAgNCA6IG9wdGlvbmFsIFRocmlmdDQ1NTRfRW51bSBGb28KK30KKworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tYWtldGVzdC5zaCBiL2xpYi9kZWxwaGkvdGVzdC9tYWtldGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZjA2MzljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L21ha2V0ZXN0LnNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBkZWxwaGkgLW8gLiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5DbGllbnQuTWFpbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmZGY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzCkBAIC0wLDAgKzEsMTMxIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgTXVsdGlwbGV4LkNsaWVudC5NYWluOworCit7LiRERUZJTkUgU3RyZXNzVGVzdH0gICAvLyBhY3RpdmF0ZSB0byBzdHJlc3MtdGVzdCB0aGUgc2VydmVyIHdpdGggZnJlcXVlbnQgY29ubmVjdHMvZGlzY29ubmVjdHMKK3suJERFRklORSBQZXJmVGVzdH0gICAgIC8vIGFjdGl2YXRlIHRvIGFjdGl2YXRlIHRoZSBwZXJmb3JtYW5jZSB0ZXN0CisKK2ludGVyZmFjZQorCit1c2VzCisgIFdpbmRvd3MsIFN5c1V0aWxzLCBDbGFzc2VzLAorICBEYXRlVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCwKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcywKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlN0cmVhbSwKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zLAorICBCZW5jaG1hcmssICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgorICBBZ2dyLCAgICAgICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgorICBNdWx0aXBsZXguVGVzdC5Db21tb247CisKK3R5cGUKKyAgVFRlc3RDbGllbnQgPSBjbGFzcworICBwcm90ZWN0ZWQKKyAgICBGUHJvdG9jb2wgOiBJUHJvdG9jb2w7CisKKyAgICBwcm9jZWR1cmUgUGFyc2VBcmdzKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworICAgIHByb2NlZHVyZSBTZXR1cDsKKyAgICBwcm9jZWR1cmUgUnVuOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CisgICAgY2xhc3MgcHJvY2VkdXJlIEV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKworCit0eXBlCisgIElTZXJ2aWNlQ2xpZW50ID0gaW50ZXJmYWNlCisgICAgWyd7Nzc0NUMxQzItQUIyMC00M0JBLUI2RjAtMDhCRjkyREUwQkFDfSddCisgICAgcHJvY2VkdXJlIFRlc3Q7CisgIGVuZDsKKworLy8tLS0gVFRlc3RDbGllbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdENsaWVudC5FeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOwordmFyIGNsaWVudCA6IFRUZXN0Q2xpZW50OworYmVnaW4KKyAgY2xpZW50IDo9IFRUZXN0Q2xpZW50LkNyZWF0ZShhcmdzKTsKKyAgdHJ5CisgICAgY2xpZW50LlJ1bjsKKyAgZmluYWxseQorICAgIGNsaWVudC5GcmVlOworICBlbmQ7CitlbmQ7CisKKworY29uc3RydWN0b3IgVFRlc3RDbGllbnQuQ3JlYXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgUGFyc2VBcmdzKGFyZ3MpOworICBTZXR1cDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFRlc3RDbGllbnQuUGFyc2VBcmdzKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworYmVnaW4KKyAgaWYgTGVuZ3RoKGFyZ3MpIDw+IDAKKyAgdGhlbiByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdObyBhcmdzIGFjY2VwdGVkIHNvIGZhcicpOworZW5kOworCisKK3Byb2NlZHVyZSBUVGVzdENsaWVudC5TZXR1cDsKK3ZhciB0cmFucyA6IElUcmFuc3BvcnQ7CitiZWdpbgorICB0cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoICdsb2NhbGhvc3QnLCA5MDkwKTsKKyAgdHJhbnMgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCB0cmFucyk7CisgIHRyYW5zLk9wZW47CisgIEZQcm90b2NvbCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnMsIFRSVUUsIFRSVUUpOworZW5kOworCisKK3Byb2NlZHVyZSBUVGVzdENsaWVudC5SdW47Cit2YXIgYmVuY2ggOiBUQmVuY2htYXJrU2VydmljZS5JZmFjZTsKKyAgICBhZ2dyICA6IFRBZ2dyLklmYWNlOworICAgIG11bHRpcGxleCA6IElQcm90b2NvbDsKKyAgICBpICAgICAgICAgOiBJbnRlZ2VyOworYmVnaW4KKyAgdHJ5CisgICAgbXVsdGlwbGV4IDo9IFRNdWx0aXBsZXhlZFByb3RvY29sLkNyZWF0ZSggRlByb3RvY29sLCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UpOworICAgIGJlbmNoICAgICA6PSBUQmVuY2htYXJrU2VydmljZS5UQ2xpZW50LkNyZWF0ZSggbXVsdGlwbGV4KTsKKworICAgIG11bHRpcGxleCA6PSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5DcmVhdGUoIEZQcm90b2NvbCwgTkFNRV9BR0dSKTsKKyAgICBhZ2dyICAgICAgOj0gVEFnZ3IuVENsaWVudC5DcmVhdGUoIG11bHRpcGxleCk7CisKKyAgICBmb3IgaSA6PSAxIHRvIDEwCisgICAgZG8gYWdnci5hZGRWYWx1ZSggYmVuY2guZmlib25hY2NpKGkpKTsKKworICAgIGZvciBpIGluIGFnZ3IuZ2V0VmFsdWVzCisgICAgZG8gV3JpdGUoSW50VG9TdHIoaSkrJyAnKTsKKyAgICBXcml0ZUxuOworICBleGNlcHQKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBXcml0ZWxuKCMxMCtlLk1lc3NhZ2UpOworICBlbmQ7CitlbmQ7CisKKworZW5kLgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguU2VydmVyLk1haW4ucGFzIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5TZXJ2ZXIuTWFpbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MGY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguU2VydmVyLk1haW4ucGFzCkBAIC0wLDAgKzEsMjAxIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgTXVsdGlwbGV4LlNlcnZlci5NYWluOworCit7JFdBUk4gU1lNQk9MX1BMQVRGT1JNIE9GRn0KKworey4kREVGSU5FIFJ1bkVuZGxlc3N9ICAgLy8gYWN0aXZhdGUgdG8gaW50ZXJhY3RpdmVseSBzdHJlc3MtdGVzdCB0aGUgc2VydmVyIHN0b3Agcm91dGluZXMgdmlhIEN0cmwrQworCitpbnRlcmZhY2UKKwordXNlcworICBXaW5kb3dzLCBTeXNVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5TZXJ2ZXIsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCwKKyAgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgsCisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlV0aWxzLAorICBUaHJpZnQsCisgIEJlbmNobWFyaywgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCisgIEFnZ3IsICAgICAgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCisgIE11bHRpcGxleC5UZXN0LkNvbW1vbiwKKyAgQ29uc29sZUhlbHBlciwKKyAgQ29udG5yczsKKwordHlwZQorICBUVGVzdFNlcnZlciA9IGNsYXNzCisgIHB1YmxpYyB0eXBlCisgICAgSVRlc3RIYW5kbGVyID0gaW50ZXJmYWNlCisgICAgICBbJ3tDQUUwOUFBQi04MEZCLTQ4RTktQjNBOC03RjlCOTZGNTQxOUF9J10KKyAgICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXIgOiBJU2VydmVyICk7CisgICAgZW5kOworCisgIHByb3RlY3RlZCB0eXBlCisgICAgVFRlc3RIYW5kbGVySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRlc3RIYW5kbGVyKQorICAgIHByaXZhdGUKKyAgICAgIEZTZXJ2ZXIgOiBJU2VydmVyOworICAgIHByb3RlY3RlZAorICAgICAgLy8gSVRlc3RIYW5kbGVyCisgICAgICBwcm9jZWR1cmUgU2V0U2VydmVyKCBjb25zdCBBU2VydmVyIDogSVNlcnZlciApOworCisgICAgICBwcm9wZXJ0eSBTZXJ2ZXIgOiBJU2VydmVyIHJlYWQgRlNlcnZlciB3cml0ZSBTZXRTZXJ2ZXI7CisgICAgZW5kOworCisgICAgVEJlbmNobWFya1NlcnZpY2VJbXBsID0gY2xhc3MoIFRUZXN0SGFuZGxlckltcGwsIFRCZW5jaG1hcmtTZXJ2aWNlLklmYWNlKQorICAgIHByb3RlY3RlZAorICAgICAgLy8gVEJlbmNobWFya1NlcnZpY2UuSWZhY2UKKyAgICAgIGZ1bmN0aW9uIGZpYm9uYWNjaShuOiBTaG9ydEludCk6IEludGVnZXI7CisgICAgZW5kOworCisKKyAgICBUQWdnckltcGwgPSBjbGFzcyggVFRlc3RIYW5kbGVySW1wbCwgVEFnZ3IuSWZhY2UpCisgICAgcHJvdGVjdGVkCisgICAgICBGTGlzdCA6IElUaHJpZnRMaXN0PEludGVnZXI+OworCisgICAgICAvLyBUQWdnci5JZmFjZQorICAgICAgcHJvY2VkdXJlIGFkZFZhbHVlKHZhbHVlOiBJbnRlZ2VyKTsKKyAgICAgIGZ1bmN0aW9uIGdldFZhbHVlcygpOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKKyAgICBwdWJsaWMKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworICAgIGVuZDsKKworICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKKworeyBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsIH0KKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwuU2V0U2VydmVyKCBjb25zdCBBU2VydmVyOiBJU2VydmVyKTsKK2JlZ2luCisgIEZTZXJ2ZXIgOj0gQVNlcnZlcjsKK2VuZDsKKworCit7IFRUZXN0U2VydmVyLlRCZW5jaG1hcmtTZXJ2aWNlSW1wbCB9CisKK2Z1bmN0aW9uIFRUZXN0U2VydmVyLlRCZW5jaG1hcmtTZXJ2aWNlSW1wbC5maWJvbmFjY2kobjogU2hvcnRJbnQpOiBJbnRlZ2VyOwordmFyIHByZXYsIG5leHQgOiBJbnRlZ2VyOworYmVnaW4KKyAgcHJldiAgIDo9IDA7CisgIHJlc3VsdCA6PSAxOworICB3aGlsZSBuID4gMCBkbyBiZWdpbgorICAgIG5leHQgICA6PSByZXN1bHQgKyBwcmV2OworICAgIHByZXYgICA6PSByZXN1bHQ7CisgICAgcmVzdWx0IDo9IG5leHQ7CisgICAgRGVjKG4pOworICBlbmQ7CitlbmQ7CisKK3sgVFRlc3RTZXJ2ZXIuVEFnZ3JJbXBsIH0KKworY29uc3RydWN0b3IgVFRlc3RTZXJ2ZXIuVEFnZ3JJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZMaXN0IDo9IFRUaHJpZnRMaXN0SW1wbDxJbnRlZ2VyPi5DcmVhdGU7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUVGVzdFNlcnZlci5UQWdnckltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZyZWVBbmROaWwoIEZMaXN0KTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRBZ2dySW1wbC5hZGRWYWx1ZSh2YWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5BZGQoIHZhbHVlKTsKK2VuZDsKKworCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UQWdnckltcGwuZ2V0VmFsdWVzKCk6IElUaHJpZnRMaXN0PEludGVnZXI+OworYmVnaW4KKyAgcmVzdWx0IDo9IEZMaXN0OworZW5kOworCisKK3sgVFRlc3RTZXJ2ZXIgfQorCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RTZXJ2ZXIuRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK3ZhcgorICBUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CisgIFByb3RvY29sRmFjdG9yeSAgOiBJUHJvdG9jb2xGYWN0b3J5OworICBTZXJ2ZXJUcmFucyAgICAgIDogSVNlcnZlclRyYW5zcG9ydDsKKyAgYmVuY2hIYW5kbGVyICAgICA6IFRCZW5jaG1hcmtTZXJ2aWNlLklmYWNlOworICBhZ2dySGFuZGxlciAgICAgIDogVEFnZ3IuSWZhY2U7CisgIGJlbmNoUHJvY2Vzc29yICAgOiBJUHJvY2Vzc29yOworICBhZ2dyUHJvY2Vzc29yICAgIDogSVByb2Nlc3NvcjsKKyAgbXVsdGlwbGV4ICAgICAgICA6IElNdWx0aXBsZXhlZFByb2Nlc3NvcjsKKyAgU2VydmVyRW5naW5lICAgICA6IElTZXJ2ZXI7CitiZWdpbgorICB0cnkKKyAgICAvLyBjcmVhdGUgcHJvdG9jb2wgZmFjdG9yeSwgZGVmYXVsdCB0byBCaW5hcnlQcm90b2NvbAorICAgIFByb3RvY29sRmFjdG9yeSAgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUoIFRSVUUsIFRSVUUpOworICAgIHNlcnZlcnRyYW5zICAgICAgOj0gVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKCA5MDkwLCAwLCBGQUxTRSk7CisgICAgVHJhbnNwb3J0RmFjdG9yeSA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5URmFjdG9yeS5DcmVhdGU7CisKKyAgICBiZW5jaEhhbmRsZXIgICAgIDo9IFRCZW5jaG1hcmtTZXJ2aWNlSW1wbC5DcmVhdGU7CisgICAgYmVuY2hQcm9jZXNzb3IgICA6PSBUQmVuY2htYXJrU2VydmljZS5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIGJlbmNoSGFuZGxlcik7CisKKyAgICBhZ2dySGFuZGxlciAgICAgIDo9IFRBZ2dySW1wbC5DcmVhdGU7CisgICAgYWdnclByb2Nlc3NvciAgICA6PSBUQWdnci5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIGFnZ3JIYW5kbGVyKTsKKworICAgIG11bHRpcGxleCAgICAgICAgOj0gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5DcmVhdGU7CisgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yKTsKKyAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoIE5BTUVfQUdHUiwgIGFnZ3JQcm9jZXNzb3IpOworCisgICAgU2VydmVyRW5naW5lIDo9IFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBtdWx0aXBsZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJUcmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbEZhY3RvcnkpOworCisgICAgKGJlbmNoSGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggU2VydmVyRW5naW5lKTsKKyAgICAoYWdnckhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIoIFNlcnZlckVuZ2luZSk7CisKKyAgICBDb25zb2xlLldyaXRlTGluZSgnU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4nKTsKKyAgICBTZXJ2ZXJFbmdpbmUuc2VydmUoKTsKKworICAgIChiZW5jaEhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIoIG5pbCk7CisgICAgKGFnZ3JIYW5kbGVyIGFzIElUZXN0SGFuZGxlcikuU2V0U2VydmVyKCBuaWwpOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlKCBFLk1lc3NhZ2UpOworICAgIGVuZDsKKyAgZW5kOworICBDb25zb2xlLldyaXRlTGluZSggJ2RvbmUuJyk7CitlbmQ7CisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwciBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5DbGllbnQuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNzhkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcgpAQCAtMCwwICsxLDY3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKKworcHJvZ3JhbSBNdWx0aXBsZXguVGVzdC5DbGllbnQ7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIFN5c1V0aWxzLAorICBNdWx0aXBsZXguQ2xpZW50Lk1haW4gaW4gJ011bHRpcGxleC5DbGllbnQuTWFpbi5wYXMnLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcyBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJzsKKwordmFyCisgIG5QYXJhbUNvdW50IDogSW50ZWdlcjsKKyAgYXJncyA6IGFycmF5IG9mIHN0cmluZzsKKyAgaSA6IEludGVnZXI7CisgIGFyZyA6IHN0cmluZzsKKyAgcyA6IHN0cmluZzsKKworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggJ011bHRpcGxleCBUZXN0Q2xpZW50ICcrVGhyaWZ0LlZlcnNpb24pOworICAgIG5QYXJhbUNvdW50IDo9IFBhcmFtQ291bnQ7CisgICAgU2V0TGVuZ3RoKCBhcmdzLCBuUGFyYW1Db3VudCk7CisgICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbworICAgIGJlZ2luCisgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKKyAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CisgICAgZW5kOworICAgIFRUZXN0Q2xpZW50LkV4ZWN1dGUoIGFyZ3MgKTsKKyAgICBSZWFkbG47CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgICAgIEV4aXRDb2RlIDo9ICRGRkZGOworICAgIGVuZDsKKyAgZW5kOworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5Db21tb24ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWYwODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLnBhcwpAQCAtMCwwICsxLDM1IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgTXVsdGlwbGV4LlRlc3QuQ29tbW9uOworCitpbnRlcmZhY2UKKworY29uc3QKKyAgTkFNRV9CRU5DSE1BUktTRVJWSUNFID0gJ0JlbmNobWFya1NlcnZpY2UnOworICBOQU1FX0FHR1IgICAgICAgICAgICAgPSAnQWdncic7CisKKworaW1wbGVtZW50YXRpb24KKworLy8gbml4CisKK2VuZC4KKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDQ2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgpAQCAtMCwwICsxLDY4IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gTXVsdGlwbGV4LlRlc3QuU2VydmVyOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywKKyAgTXVsdGlwbGV4LlNlcnZlci5NYWluIGluICdNdWx0aXBsZXguU2VydmVyLk1haW4ucGFzJywKKyAgQ29uc29sZUhlbHBlciBpbiAnLi5cQ29uc29sZUhlbHBlci5wYXMnLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcyBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4IGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOworCit2YXIKKyAgblBhcmFtQ291bnQgOiBJbnRlZ2VyOworICBhcmdzIDogYXJyYXkgb2Ygc3RyaW5nOworICBpIDogSW50ZWdlcjsKKyAgYXJnIDogc3RyaW5nOworICBzIDogc3RyaW5nOworCitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCAnTXVsdGlwbGV4IFRlc3RTZXJ2ZXIgJytUaHJpZnQuVmVyc2lvbik7CisgICAgblBhcmFtQ291bnQgOj0gUGFyYW1Db3VudDsKKyAgICBTZXRMZW5ndGgoIGFyZ3MsIG5QYXJhbUNvdW50KTsKKyAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvCisgICAgYmVnaW4KKyAgICAgIGFyZyA6PSBQYXJhbVN0ciggaSApOworICAgICAgYXJnc1tpLTFdIDo9IGFyZzsKKyAgICBlbmQ7CisgICAgVFRlc3RTZXJ2ZXIuRXhlY3V0ZSggYXJncyApOworICAgIFdyaXRlbG4oJ1ByZXNzIEVOVEVSIHRvIGNsb3NlIC4uLiAnKTsgUmVhZGxuOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KKworCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjMDA3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzCkBAIC0wLDAgKzEsMzUwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGVzdFNlcmlhbGl6ZXIuRGF0YTsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgRGVidWdQcm90b1Rlc3Q7CisKKwordHlwZQorICBGaXh0dXJlcyA9IGNsYXNzCisgIHB1YmxpYworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZU9uZU9mRWFjaCA6IElPbmVPZkVhY2g7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlTmVzdGluZyA6IElOZXN0aW5nOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZUhvbHlNb2xleSA6IElIb2x5TW9sZXk7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlQ29tcGFjdFByb3RvVGVzdFN0cnVjdCA6IElDb21wYWN0UHJvdG9UZXN0U3RydWN0OworCisgIC8vIFRoZXNlIGJ5dGUgYXJyYXlzIGFyZSBzZXJpYWxpemVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBzdHJ1Y3RzLgorICAvLyBUaGV5IHdlcmUgc2VyaWFsaXplZCBpbiBiaW5hcnkgcHJvdG9jb2wgdXNpbmcgdGhyaWZ0IDAuNi54IGFuZCBhcmUgdXNlZCB0bworICAvLyB0ZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcmVzcGVjdCB0byB0aGUgc3RhbmRhcmQgc2NoZW1lLgorICAoKgorICAgICAgICAgIGFsbCBkYXRhIGNvcGllZCBmcm9tIEpBVkEgdmVyc2lvbiwKKyAgICAgICAgICB0byBiZSB1c2VkIGxhdGVyCisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcGVyc2lzdGVudEJ5dGVzT25lT2ZFYWNoID0gbmV3IGJ5dGVbXSB7CisgICAgJDAyLCAkMDAsICQwMSwgJDAxLCAkMDIsICQwMCwgJDAyLCAkMDAsICQwMywgJDAwLAorICAgICQwMywgJEQ2LCAkMDYsICQwMCwgJDA0LCAkNjksICQ3OCwgJDA4LCAkMDAsICQwNSwKKyAgICAkMDEsICQwMCwgJDAwLCAkMDAsICQwQSwgJDAwLCAkMDYsICQwMCwgJDAwLCAkMDAsCisgICAgJDAxLCAkNjUsICRBMCwgJEJDLCAkMDAsICQwNCwgJDAwLCAkMDcsICQ0MCwgJDA5LAorICAgICQyMSwgJEZCLCAkNTQsICQ0NCwgJDJELCAkMTgsICQwQiwgJDAwLCAkMDgsICQwMCwKKyAgICAkMDAsICQwMCwgJDBELCAkNEEsICQ1MywgJDRGLCAkNEUsICQyMCwgJDU0LCAkNDgsCisgICAgJDQ5LCAkNTMsICQyMSwgJDIwLCAkMjIsICQwMSwgJDBCLCAkMDAsICQwOSwgJDAwLAorICAgICQwMCwgJDAwLCAkMkUsICREMywgJDgwLCAkRTIsICQ4NSwgJEFFLCAkQ0UsICQ5RCwKKyAgICAkMjAsICREMCwgJDlELCAkQ0UsICRCRiwgJEUyLCAkODUsICRCRiwgJEQwLCAkQkUsCisgICAgJEM5LCAkQTEsICREMCwgJEIzLCAkRDAsICRCMCwgJENGLCAkODEsICRFMiwgJDg0LAorICAgICQ4RSwgJDIwLCAkQ0UsICQ5MSwgJDc0LCAkNzQsICRDRSwgJEIxLCAkRTIsICQ4NSwKKyAgICAkQkQsICRDRSwgJEJBLCAkRUYsICRCRiwgJEJELCAkRTIsICQ4MCwgJEJDLCAkMDIsCisgICAgJDAwLCAkMEEsICQwMCwgJDBCLCAkMDAsICQwQiwgJDAwLCAkMDAsICQwMCwgJDA2LAorICAgICQ2MiwgJDYxLCAkNzMsICQ2NSwgJDM2LCAkMzQsICQwRiwgJDAwLCAkMEMsICQwMywKKyAgICAkMDAsICQwMCwgJDAwLCAkMDMsICQwMSwgJDAyLCAkMDMsICQwRiwgJDAwLCAkMEQsCisgICAgJDA2LCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwgJDAxLCAkMDAsICQwMiwgJDAwLAorICAgICQwMywgJDBGLCAkMDAsICQwRSwgJDBBLCAkMDAsICQwMCwgJDAwLCAkMDMsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDEsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDIsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDMsICQwMCB9OworCisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcGVyc2lzdGVudEJ5dGVzTmVzdGluZyA9IG5ldyBieXRlW10geworICAgICQwQywgJDAwLCAkMDEsICQwOCwgJDAwLCAkMDEsICQwMCwgJDAwLCAkN0EsICQ2OSwKKyAgICAkMEIsICQwMCwgJDAyLCAkMDAsICQwMCwgJDAwLCAkMTMsICQ0OSwgJDIwLCAkNjEsCisgICAgJDZELCAkMjAsICQ2MSwgJDIwLCAkNjIsICQ2RiwgJDZFLCAkNkIsICQyRSwgJDJFLAorICAgICQyRSwgJDIwLCAkNzgsICQ2RiwgJDcyLCAkMjEsICQwMCwgJDBDLCAkMDAsICQwMiwKKyAgICAkMDIsICQwMCwgJDAxLCAkMDEsICQwMiwgJDAwLCAkMDIsICQwMCwgJDAzLCAkMDAsCisgICAgJDAzLCAkRDYsICQwNiwgJDAwLCAkMDQsICQ2OSwgJDc4LCAkMDgsICQwMCwgJDA1LAorICAgICQwMSwgJDAwLCAkMDAsICQwMCwgJDBBLCAkMDAsICQwNiwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDEsICQ2NSwgJEEwLCAkQkMsICQwMCwgJDA0LCAkMDAsICQwNywgJDQwLCAkMDksCisgICAgJDIxLCAkRkIsICQ1NCwgJDQ0LCAkMkQsICQxOCwgJDBCLCAkMDAsICQwOCwgJDAwLAorICAgICQwMCwgJDAwLCAkMEQsICQ0QSwgJDUzLCAkNEYsICQ0RSwgJDIwLCAkNTQsICQ0OCwKKyAgICAkNDksICQ1MywgJDIxLCAkMjAsICQyMiwgJDAxLCAkMEIsICQwMCwgJDA5LCAkMDAsCisgICAgJDAwLCAkMDAsICQyRSwgJEQzLCAkODAsICRFMiwgJDg1LCAkQUUsICRDRSwgJDlELAorICAgICQyMCwgJEQwLCAkOUQsICRDRSwgJEJGLCAkRTIsICQ4NSwgJEJGLCAkRDAsICRCRSwKKyAgICAkQzksICRBMSwgJEQwLCAkQjMsICREMCwgJEIwLCAkQ0YsICQ4MSwgJEUyLCAkODQsCisgICAgJDhFLCAkMjAsICRDRSwgJDkxLCAkNzQsICQ3NCwgJENFLCAkQjEsICRFMiwgJDg1LAorICAgICRCRCwgJENFLCAkQkEsICRFRiwgJEJGLCAkQkQsICRFMiwgJDgwLCAkQkMsICQwMiwKKyAgICAkMDAsICQwQSwgJDAwLCAkMEIsICQwMCwgJDBCLCAkMDAsICQwMCwgJDAwLCAkMDYsCisgICAgJDYyLCAkNjEsICQ3MywgJDY1LCAkMzYsICQzNCwgJDBGLCAkMDAsICQwQywgJDAzLAorICAgICQwMCwgJDAwLCAkMDAsICQwMywgJDAxLCAkMDIsICQwMywgJDBGLCAkMDAsICQwRCwKKyAgICAkMDYsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMDEsICQwMCwgJDAyLCAkMDAsCisgICAgJDAzLCAkMEYsICQwMCwgJDBFLCAkMEEsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLAorICAgICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMSwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMywgJDAwLCAkMDAgfTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBwZXJzaXN0ZW50Qnl0ZXNIb2x5TW9sZXkgPSBuZXcgYnl0ZVtdIHsKKyAgICAkMEYsICQwMCwgJDAxLCAkMEMsICQwMCwgJDAwLCAkMDAsICQwMiwgJDAyLCAkMDAsCisgICAgJDAxLCAkMDEsICQwMiwgJDAwLCAkMDIsICQwMCwgJDAzLCAkMDAsICQwMywgJDIzLAorICAgICQwNiwgJDAwLCAkMDQsICQ2OSwgJDc4LCAkMDgsICQwMCwgJDA1LCAkMDEsICQwMCwKKyAgICAkMDAsICQwMCwgJDBBLCAkMDAsICQwNiwgJDAwLCAkMDAsICQwMCwgJDAxLCAkNjUsCisgICAgJEEwLCAkQkMsICQwMCwgJDA0LCAkMDAsICQwNywgJDQwLCAkMDksICQyMSwgJEZCLAorICAgICQ1NCwgJDQ0LCAkMkQsICQxOCwgJDBCLCAkMDAsICQwOCwgJDAwLCAkMDAsICQwMCwKKyAgICAkMEQsICQ0QSwgJDUzLCAkNEYsICQ0RSwgJDIwLCAkNTQsICQ0OCwgJDQ5LCAkNTMsCisgICAgJDIxLCAkMjAsICQyMiwgJDAxLCAkMEIsICQwMCwgJDA5LCAkMDAsICQwMCwgJDAwLAorICAgICQyRSwgJEQzLCAkODAsICRFMiwgJDg1LCAkQUUsICRDRSwgJDlELCAkMjAsICREMCwKKyAgICAkOUQsICRDRSwgJEJGLCAkRTIsICQ4NSwgJEJGLCAkRDAsICRCRSwgJEM5LCAkQTEsCisgICAgJEQwLCAkQjMsICREMCwgJEIwLCAkQ0YsICQ4MSwgJEUyLCAkODQsICQ4RSwgJDIwLAorICAgICRDRSwgJDkxLCAkNzQsICQ3NCwgJENFLCAkQjEsICRFMiwgJDg1LCAkQkQsICRDRSwKKyAgICAkQkEsICRFRiwgJEJGLCAkQkQsICRFMiwgJDgwLCAkQkMsICQwMiwgJDAwLCAkMEEsCisgICAgJDAwLCAkMEIsICQwMCwgJDBCLCAkMDAsICQwMCwgJDAwLCAkMDYsICQ2MiwgJDYxLAorICAgICQ3MywgJDY1LCAkMzYsICQzNCwgJDBGLCAkMDAsICQwQywgJDAzLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMywgJDAxLCAkMDIsICQwMywgJDBGLCAkMDAsICQwRCwgJDA2LCAkMDAsCisgICAgJDAwLCAkMDAsICQwMywgJDAwLCAkMDEsICQwMCwgJDAyLCAkMDAsICQwMywgJDBGLAorICAgICQwMCwgJDBFLCAkMEEsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMSwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLAorICAgICQwMywgJDAwLCAkMDIsICQwMCwgJDAxLCAkMDEsICQwMiwgJDAwLCAkMDIsICQwMCwKKyAgICAkMDMsICQwMCwgJDAzLCAkRDYsICQwNiwgJDAwLCAkMDQsICQ2OSwgJDc4LCAkMDgsCisgICAgJDAwLCAkMDUsICQwMSwgJDAwLCAkMDAsICQwMCwgJDBBLCAkMDAsICQwNiwgJDAwLAorICAgICQwMCwgJDAwLCAkMDEsICQ2NSwgJEEwLCAkQkMsICQwMCwgJDA0LCAkMDAsICQwNywKKyAgICAkNDAsICQwOSwgJDIxLCAkRkIsICQ1NCwgJDQ0LCAkMkQsICQxOCwgJDBCLCAkMDAsCisgICAgJDA4LCAkMDAsICQwMCwgJDAwLCAkMEQsICQ0QSwgJDUzLCAkNEYsICQ0RSwgJDIwLAorICAgICQ1NCwgJDQ4LCAkNDksICQ1MywgJDIxLCAkMjAsICQyMiwgJDAxLCAkMEIsICQwMCwKKyAgICAkMDksICQwMCwgJDAwLCAkMDAsICQyRSwgJEQzLCAkODAsICRFMiwgJDg1LCAkQUUsCisgICAgJENFLCAkOUQsICQyMCwgJEQwLCAkOUQsICRDRSwgJEJGLCAkRTIsICQ4NSwgJEJGLAorICAgICREMCwgJEJFLCAkQzksICRBMSwgJEQwLCAkQjMsICREMCwgJEIwLCAkQ0YsICQ4MSwKKyAgICAkRTIsICQ4NCwgJDhFLCAkMjAsICRDRSwgJDkxLCAkNzQsICQ3NCwgJENFLCAkQjEsCisgICAgJEUyLCAkODUsICRCRCwgJENFLCAkQkEsICRFRiwgJEJGLCAkQkQsICRFMiwgJDgwLAorICAgICRCQywgJDAyLCAkMDAsICQwQSwgJDAwLCAkMEIsICQwMCwgJDBCLCAkMDAsICQwMCwKKyAgICAkMDAsICQwNiwgJDYyLCAkNjEsICQ3MywgJDY1LCAkMzYsICQzNCwgJDBGLCAkMDAsCisgICAgJDBDLCAkMDMsICQwMCwgJDAwLCAkMDAsICQwMywgJDAxLCAkMDIsICQwMywgJDBGLAorICAgICQwMCwgJDBELCAkMDYsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMDEsICQwMCwKKyAgICAkMDIsICQwMCwgJDAzLCAkMEYsICQwMCwgJDBFLCAkMEEsICQwMCwgJDAwLCAkMDAsCisgICAgJDAzLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMSwgJDAwLAorICAgICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMEUsICQwMCwgJDAyLCAkMEYsCisgICAgJDAwLCAkMDAsICQwMCwgJDAzLCAkMEIsICQwMCwgJDAwLCAkMDAsICQwMCwgJDBCLAorICAgICQwMCwgJDAwLCAkMDAsICQwMywgJDAwLCAkMDAsICQwMCwgJDBGLCAkNzQsICQ2OCwKKyAgICAkNjUsICQ2RSwgJDIwLCAkNjEsICQyMCwgJDZGLCAkNkUsICQ2NSwgJDJDLCAkMjAsCisgICAgJDc0LCAkNzcsICQ2RiwgJDAwLCAkMDAsICQwMCwgJDA2LCAkNzQsICQ2OCwgJDcyLAorICAgICQ2NSwgJDY1LCAkMjEsICQwMCwgJDAwLCAkMDAsICQwNiwgJDQ2LCAkNEYsICQ1NSwKKyAgICAkNTIsICQyMSwgJDIxLCAkMEIsICQwMCwgJDAwLCAkMDAsICQwMiwgJDAwLCAkMDAsCisgICAgJDAwLCAkMDksICQ2MSwgJDZFLCAkNjQsICQyMCwgJDYxLCAkMjAsICQ2RiwgJDZFLAorICAgICQ2NSwgJDAwLCAkMDAsICQwMCwgJDA5LCAkNjEsICQ2RSwgJDY0LCAkMjAsICQ2MSwKKyAgICAkMjAsICQ3NCwgJDc3LCAkNkYsICQwRCwgJDAwLCAkMDMsICQwQiwgJDBGLCAkMDAsCisgICAgJDAwLCAkMDAsICQwMywgJDAwLCAkMDAsICQwMCwgJDAzLCAkNzQsICQ3NywgJDZGLAorICAgICQwQywgJDAwLCAkMDAsICQwMCwgJDAyLCAkMDgsICQwMCwgJDAxLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMSwgJDBCLCAkMDAsICQwMiwgJDAwLCAkMDAsICQwMCwgJDA1LCAkNTcsCisgICAgJDYxLCAkNjksICQ3NCwgJDJFLCAkMDAsICQwOCwgJDAwLCAkMDEsICQwMCwgJDAwLAorICAgICQwMCwgJDAyLCAkMEIsICQwMCwgJDAyLCAkMDAsICQwMCwgJDAwLCAkMDUsICQ1NywKKyAgICAkNjgsICQ2MSwgJDc0LCAkM0YsICQwMCwgJDAwLCAkMDAsICQwMCwgJDA1LCAkNzQsCisgICAgJDY4LCAkNzIsICQ2NSwgJDY1LCAkMEMsICQwMCwgJDAwLCAkMDAsICQwMCwgJDAwLAorICAgICQwMCwgJDAwLCAkMDQsICQ3QSwgJDY1LCAkNzIsICQ2RiwgJDBDLCAkMDAsICQwMCwKKyAgICAkMDAsICQwMCwgJDAwIH07CisKKworKikKKworICBwcml2YXRlCisgICAgY29uc3QKKyAgICAgIGtVbmljb2RlQnl0ZXMgOiBwYWNrZWQgYXJyYXlbMC4uNDNdIG9mIEJ5dGUKKyAgICAgICAgICAgICAgICAgICAgPSAoICRkMywgJDgwLCAkZTIsICQ4NSwgJGFlLCAkY2UsICQ5ZCwgJDIwLCAkZDAsICQ5ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICRjZSwgJGJmLCAkZTIsICQ4NSwgJGJmLCAkZDAsICRiZSwgJGM5LCAkYTEsICRkMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICRiMywgJGQwLCAkYjAsICRjZiwgJDgxLCAkZTIsICQ4NCwgJDhlLCAkMjAsICRjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICQ5MSwgJDc0LCAkNzQsICRjZSwgJGIxLCAkZTIsICQ4NSwgJGJkLCAkY2UsICRiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICQ4MywgJGUyLCAkODAsICRiYyk7CisKKyAgZW5kOworCisKK2ltcGxlbWVudGF0aW9uCisKKworY2xhc3MgZnVuY3Rpb24gRml4dHVyZXMuQ3JlYXRlT25lT2ZFYWNoIDogSU9uZU9mRWFjaDsKK3ZhciBkYiA6IERvdWJsZTsKKyAgICB1cyA6IFV0ZjhTdHJpbmc7CitiZWdpbgorICByZXN1bHQgOj0gVE9uZU9mRWFjaEltcGwuQ3JlYXRlOworICByZXN1bHQuc2V0SW1fdHJ1ZSggVFJVRSk7CisgIHJlc3VsdC5zZXRJbV9mYWxzZSggRkFMU0UpOworICByZXN1bHQuc2V0QV9iaXRlKCBTaG9ydEludCgkRDYpKTsKKyAgcmVzdWx0LnNldEludGVnZXIxNiggMjcwMDApOworICByZXN1bHQuc2V0SW50ZWdlcjMyKCAxIHNobCAyNCk7CisgIHJlc3VsdC5zZXRJbnRlZ2VyNjQoIEludDY0KDYwMDApICogSW50NjQoMTAwMCkgKiBJbnQ2NCgxMDAwKSk7CisgIGRiIDo9IFBpOworICByZXN1bHQuc2V0RG91YmxlX3ByZWNpc2lvbiggZGIpOworICByZXN1bHQuc2V0U29tZV9jaGFyYWN0ZXJzKCAnSlNPTiBUSElTISBcIlwxJyk7CisKKyAgLy8gPz8KKyAgU2V0TGVuZ3RoKCB1cywgTGVuZ3RoKGtVbmljb2RlQnl0ZXMpKTsKKyAgTW92ZSgga1VuaWNvZGVCeXRlc1swXSwgdXNbMV0sIExlbmd0aChrVW5pY29kZUJ5dGVzKSk7CisgIC8vID8/CisgIFNldFN0cmluZyggdXMsIFBDaGFyKEBrVW5pY29kZUJ5dGVzWzBdKSwgTGVuZ3RoKGtVbmljb2RlQnl0ZXMpKTsKKyAgLy8gISEKKyAgcmVzdWx0LnNldFpvbWdfdW5pY29kZSggVW5pY29kZVN0cmluZyggdXMpKTsKKworICB7JElGIGNEZWJ1Z1Byb3RvVGVzdF9PcHRpb25fQW5zaVN0cl9CaW5hcnl9CisgIHJlc3VsdC5TZXRCYXNlNjQoJ2Jhc2U2NCcpOworICB7JEVMU0V9CisgIHJlc3VsdC5TZXRCYXNlNjQoIFRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCdiYXNlNjQnKSk7CisgIHskSUZFTkR9CisKKyAgLy8gYnl0ZSwgaTE2LCBhbmQgaTY0IGxpc3RzIGFyZSBwb3B1bGF0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvcgorZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIEZpeHR1cmVzLkNyZWF0ZU5lc3RpbmcgOiBJTmVzdGluZzsKK3ZhciBib25rIDogSUJvbms7CitiZWdpbgorICBib25rIDo9IFRCb25rSW1wbC5DcmVhdGU7CisgIGJvbmsuVHlwZV8gICA6PSAzMTMzNzsKKyAgYm9uay5NZXNzYWdlIDo9ICdJIGFtIGEgYm9uay4uLiB4b3IhJzsKKworICByZXN1bHQgOj0gVE5lc3RpbmdJbXBsLkNyZWF0ZTsKKyAgcmVzdWx0Lk15X2JvbmsgOj0gYm9uazsKKyAgcmVzdWx0Lk15X29vZSA6PSBDcmVhdGVPbmVPZkVhY2g7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gRml4dHVyZXMuQ3JlYXRlSG9seU1vbGV5IDogSUhvbHlNb2xleTsKK3ZhciBiaWcgOiBJVGhyaWZ0TGlzdDxJT25lT2ZFYWNoPjsKKyAgICBzdGFnZTEgOiBJVGhyaWZ0TGlzdDxTdHJpbmc+OworICAgIHN0YWdlMiA6IElUaHJpZnRMaXN0PElCb25rPjsKKyAgICBiICAgICAgOiBJQm9uazsKK2JlZ2luCisgIHJlc3VsdCA6PSBUSG9seU1vbGV5SW1wbC5DcmVhdGU7CisKKyAgYmlnIDo9IFRUaHJpZnRMaXN0SW1wbDxJT25lT2ZFYWNoPi5DcmVhdGU7CisgIGJpZy5hZGQoIENyZWF0ZU9uZU9mRWFjaCk7CisgIGJpZy5hZGQoIENyZWF0ZU5lc3RpbmcubXlfb29lKTsKKyAgcmVzdWx0LkJpZyA6PSBiaWc7CisgIHJlc3VsdC5CaWdbMF0uc2V0QV9iaXRlKCAkMjIpOworICByZXN1bHQuQmlnWzBdLnNldEFfYml0ZSggJDIzKTsKKworICByZXN1bHQuQ29udGFpbiA6PSBUSGFzaFNldEltcGw8IElUaHJpZnRMaXN0PHN0cmluZz4+LkNyZWF0ZTsKKyAgc3RhZ2UxIDo9IFRUaHJpZnRMaXN0SW1wbDxTdHJpbmc+LkNyZWF0ZTsKKyAgc3RhZ2UxLmFkZCggJ2FuZCBhIG9uZScpOworICBzdGFnZTEuYWRkKCAnYW5kIGEgdHdvJyk7CisgIHJlc3VsdC5Db250YWluLmFkZCggc3RhZ2UxKTsKKworICBzdGFnZTEgOj0gVFRocmlmdExpc3RJbXBsPFN0cmluZz4uQ3JlYXRlOworICBzdGFnZTEuYWRkKCAndGhlbiBhIG9uZSwgdHdvJyk7CisgIHN0YWdlMS5hZGQoICd0aHJlZSEnKTsKKyAgc3RhZ2UxLmFkZCggJ0ZPVVIhIScpOworICByZXN1bHQuQ29udGFpbi5hZGQoIHN0YWdlMSk7CisKKyAgc3RhZ2UxIDo9IFRUaHJpZnRMaXN0SW1wbDxTdHJpbmc+LkNyZWF0ZTsKKyAgcmVzdWx0LkNvbnRhaW4uYWRkKCBzdGFnZTEpOworCisgIHN0YWdlMiA6PSBUVGhyaWZ0TGlzdEltcGw8SUJvbms+LkNyZWF0ZTsKKyAgcmVzdWx0LkJvbmtzIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDwgU3RyaW5nLCBJVGhyaWZ0TGlzdDwgSUJvbms+Pi5DcmVhdGU7CisgIC8vIG9uZSBlbXB0eQorICByZXN1bHQuQm9ua3MuQWRkKCAnemVybycsIHN0YWdlMik7CisKKyAgLy8gb25lIHdpdGggdHdvCisgIHN0YWdlMiA6PSBUVGhyaWZ0TGlzdEltcGw8SUJvbms+LkNyZWF0ZTsKKyAgYiA6PSBUQm9ua0ltcGwuQ3JlYXRlOworICBiLnR5cGVfIDo9IDE7CisgIGIubWVzc2FnZSA6PSAnV2FpdC4nOworICBzdGFnZTIuQWRkKCBiKTsKKyAgYiA6PSBUQm9ua0ltcGwuQ3JlYXRlOworICBiLnR5cGVfIDo9IDI7CisgIGIubWVzc2FnZSA6PSAnV2hhdD8nOworICBzdGFnZTIuQWRkKCBiKTsKKyAgcmVzdWx0LkJvbmtzLkFkZCggJ3R3bycsIHN0YWdlMik7CisKKyAgLy8gb25lIHdpdGggdGhyZWUKKyAgc3RhZ2UyIDo9IFRUaHJpZnRMaXN0SW1wbDxJQm9uaz4uQ3JlYXRlOworICBiIDo9IFRCb25rSW1wbC5DcmVhdGU7CisgIGIudHlwZV8gOj0gMzsKKyAgYi5tZXNzYWdlIDo9ICdxdW90aCc7CisgIHN0YWdlMi5BZGQoIGIpOworICBiIDo9IFRCb25rSW1wbC5DcmVhdGU7CisgIGIudHlwZV8gOj0gNDsKKyAgYi5tZXNzYWdlIDo9ICd0aGUgcmF2ZW4nOworICBzdGFnZTIuQWRkKCBiKTsKKyAgYiA6PSBUQm9ua0ltcGwuQ3JlYXRlOworICBiLnR5cGVfIDo9IDU7CisgIGIubWVzc2FnZSA6PSAnbmV2ZXJtb3JlJzsKKyAgc3RhZ2UyLkFkZCggYik7CisgIHJlc3VsdC5ib25rcy5BZGQoICd0aHJlZScsIHN0YWdlMik7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gRml4dHVyZXMuQ3JlYXRlQ29tcGFjdFByb3RvVGVzdFN0cnVjdCA6IElDb21wYWN0UHJvdG9UZXN0U3RydWN0OworLy8gc3VwZXJodWdlIGNvbXBhY3QgcHJvdG8gdGVzdCBzdHJ1Y3QKK2JlZ2luCisgIHJlc3VsdCA6PSBUQ29tcGFjdFByb3RvVGVzdFN0cnVjdEltcGwuQ3JlYXRlOworICByZXN1bHQuQV9ieXRlIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9ieXRlOworICByZXN1bHQuQV9pMTYgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2kxNjsKKyAgcmVzdWx0LkFfaTMyIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9pMzI7CisgIHJlc3VsdC5BX2k2NCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfaTY0OworICByZXN1bHQuQV9kb3VibGUgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2RvdWJsZTsKKyAgcmVzdWx0LkFfc3RyaW5nIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9zdHJpbmc7CisgIHJlc3VsdC5BX2JpbmFyeSA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfYmluYXJ5OworICByZXN1bHQuVHJ1ZV9maWVsZCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlRydWVfZmllbGQ7CisgIHJlc3VsdC5GYWxzZV9maWVsZCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkZhbHNlX2ZpZWxkOworICByZXN1bHQuRW1wdHlfc3RydWN0X2ZpZWxkIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuRW1wdHlfc3RydWN0X2ZpZWxkOworICByZXN1bHQuQnl0ZV9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9saXN0OworICByZXN1bHQuSTE2X2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMTZfbGlzdDsKKyAgcmVzdWx0LkkzMl9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTMyX2xpc3Q7CisgIHJlc3VsdC5JNjRfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkk2NF9saXN0OworICByZXN1bHQuRG91YmxlX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Eb3VibGVfbGlzdDsKKyAgcmVzdWx0LlN0cmluZ19saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RyaW5nX2xpc3Q7CisgIHJlc3VsdC5CaW5hcnlfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJpbmFyeV9saXN0OworICByZXN1bHQuQm9vbGVhbl9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQm9vbGVhbl9saXN0OworICByZXN1bHQuU3RydWN0X2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJ1Y3RfbGlzdDsKKyAgcmVzdWx0LkJ5dGVfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9zZXQ7CisgIHJlc3VsdC5JMTZfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTE2X3NldDsKKyAgcmVzdWx0LkkzMl9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMzJfc2V0OworICByZXN1bHQuSTY0X3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkk2NF9zZXQ7CisgIHJlc3VsdC5Eb3VibGVfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuRG91YmxlX3NldDsKKyAgcmVzdWx0LlN0cmluZ19zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfc2V0OworICByZXN1bHQuU3RyaW5nX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19zZXQ7CisgIHJlc3VsdC5TdHJpbmdfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RyaW5nX3NldDsKKyAgcmVzdWx0LkJpbmFyeV9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CaW5hcnlfc2V0OworICByZXN1bHQuQm9vbGVhbl9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Cb29sZWFuX3NldDsKKyAgcmVzdWx0LlN0cnVjdF9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJ1Y3Rfc2V0OworICByZXN1bHQuQnl0ZV9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfYnl0ZV9tYXA7CisgIHJlc3VsdC5JMTZfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMTZfYnl0ZV9tYXA7CisgIHJlc3VsdC5JMzJfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMzJfYnl0ZV9tYXA7CisgIHJlc3VsdC5JNjRfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JNjRfYnl0ZV9tYXA7CisgIHJlc3VsdC5Eb3VibGVfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Eb3VibGVfYnl0ZV9tYXA7CisgIHJlc3VsdC5TdHJpbmdfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfYnl0ZV9tYXA7CisgIHJlc3VsdC5CaW5hcnlfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CaW5hcnlfYnl0ZV9tYXA7CisgIHJlc3VsdC5Cb29sZWFuX2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQm9vbGVhbl9ieXRlX21hcDsKKyAgcmVzdWx0LkJ5dGVfaTE2X21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfaTE2X21hcDsKKyAgcmVzdWx0LkJ5dGVfaTMyX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfaTMyX21hcDsKKyAgcmVzdWx0LkJ5dGVfaTY0X21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfaTY0X21hcDsKKyAgcmVzdWx0LkJ5dGVfZG91YmxlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfZG91YmxlX21hcDsKKyAgcmVzdWx0LkJ5dGVfc3RyaW5nX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfc3RyaW5nX21hcDsKKyAgcmVzdWx0LkJ5dGVfYmluYXJ5X21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfYmluYXJ5X21hcDsKKyAgcmVzdWx0LkJ5dGVfYm9vbGVhbl9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2Jvb2xlYW5fbWFwOworICByZXN1bHQuTGlzdF9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkxpc3RfYnl0ZV9tYXA7CisgIHJlc3VsdC5TZXRfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TZXRfYnl0ZV9tYXA7CisgIHJlc3VsdC5NYXBfYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5NYXBfYnl0ZV9tYXA7CisgIHJlc3VsdC5CeXRlX21hcF9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX21hcF9tYXA7CisgIHJlc3VsdC5CeXRlX3NldF9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX3NldF9tYXA7CisgIHJlc3VsdC5CeXRlX2xpc3RfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9saXN0X21hcDsKKworICB7JElGIGNEZWJ1Z1Byb3RvVGVzdF9PcHRpb25fQW5zaVN0cl9CaW5hcnl9CisgIHJlc3VsdC5BX2JpbmFyeSA6PSBBbnNpU3RyaW5nKCAjMCMxIzIjMyM0IzUjNiM3IzgpOworICB7JEVMU0V9CisgIHJlc3VsdC5BX2JpbmFyeSA6PSBURW5jb2RpbmcuVVRGOC5HZXRCeXRlcyggIzAjMSMyIzMjNCM1IzYjNyM4KTsKKyAgeyRJRkVORH0KK2VuZDsKKworCisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlMjJhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwcgpAQCAtMCwwICsxLDIzMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIFRlc3RTZXJpYWxpemVyOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5TZXJpYWxpemVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcmlhbGl6ZXIucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgU3lzdGVtXywKKyAgRGVidWdQcm90b1Rlc3QsCisgIFRlc3RTZXJpYWxpemVyLkRhdGE7CisKKworCit0eXBlCisgIFRUZXN0U2VyaWFsaXplciA9IGNsYXNzIC8vZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUKKyAgICBGUHJvdG9jb2xzIDogVExpc3Q8IElQcm90b2NvbEZhY3Rvcnk+OworCisgICAgY2xhc3MgZnVuY3Rpb24gIFNlcmlhbGl6ZShjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSkgOiBUQnl0ZXM7ICBvdmVybG9hZDsKKyAgICBjbGFzcyBwcm9jZWR1cmUgU2VyaWFsaXplKGNvbnN0IGlucHV0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5OyBjb25zdCBhU3RyZWFtIDogVFN0cmVhbSk7ICBvdmVybG9hZDsKKyAgICBjbGFzcyBwcm9jZWR1cmUgRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVEJ5dGVzOyBjb25zdCB0YXJnZXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOyAgb3ZlcmxvYWQ7CisgICAgY2xhc3MgcHJvY2VkdXJlIERlc2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IFRTdHJlYW07IGNvbnN0IHRhcmdldCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7ICBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBUZXN0X1NlcmlhbGl6ZXJfRGVzZXJpYWxpemVyOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBSdW5UZXN0czsKKyAgZW5kOworCisKKworeyBUVGVzdFNlcmlhbGl6ZXIgfQorCitjb25zdHJ1Y3RvciBUVGVzdFNlcmlhbGl6ZXIuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlByb3RvY29scyA6PSBUTGlzdDwgSVByb3RvY29sRmFjdG9yeT4uQ3JlYXRlOworICBGUHJvdG9jb2xzLkFkZCggVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUpOworICAvL0ZQcm90b2NvbHMuQWRkKCBUQ29tcGFjdFByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUpOworICBGUHJvdG9jb2xzLkFkZCggVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKTsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRUZXN0U2VyaWFsaXplci5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggRlByb3RvY29scyk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCit0eXBlIFRNZXRob2QgPSAobXRfQnl0ZXMsIG10X1N0cmVhbSk7CisKKworcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5UZXN0X1NlcmlhbGl6ZXJfRGVzZXJpYWxpemVyOwordmFyIGxldmVsM29vZSwgY29ycmVjdCA6IElPbmVPZkVhY2g7CisgICAgZmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CisgICAgYnl0ZXMgICA6IFRCeXRlczsKKyAgICBzdHJlYW0gIDogVEZpbGVTdHJlYW07CisgICAgaSAgICAgICA6IEludGVnZXI7CisgICAgbWV0aG9kICA6IFRNZXRob2Q7CitiZWdpbgorICBjb3JyZWN0IDo9IEZpeHR1cmVzLkNyZWF0ZU9uZU9mRWFjaDsKKyAgc3RyZWFtICA6PSBURmlsZVN0cmVhbS5DcmVhdGUoICdUZXN0U2VyaWFsaXplci5kYXQnLCBmbUNyZWF0ZSk7CisgIHRyeQorCisgICAgZm9yIG1ldGhvZCBpbiBbTG93KFRNZXRob2QpLi5IaWdoKFRNZXRob2QpXSBkbyBiZWdpbgorICAgICAgZm9yIGZhY3RvcnkgaW4gRlByb3RvY29scyBkbyBiZWdpbgorCisgICAgICAgIC8vIHdyaXRlCisgICAgICAgIGxldmVsM29vZSA6PSBGaXh0dXJlcy5DcmVhdGVPbmVPZkVhY2g7CisgICAgICAgIGNhc2UgbWV0aG9kIG9mCisgICAgICAgICAgbXRfQnl0ZXM6ICBieXRlcyA6PSBTZXJpYWxpemUoIGxldmVsM29vZSwgZmFjdG9yeSk7CisgICAgICAgICAgbXRfU3RyZWFtOiBiZWdpbgorICAgICAgICAgICAgc3RyZWFtLlNpemUgOj0gMDsKKyAgICAgICAgICAgIFNlcmlhbGl6ZSggbGV2ZWwzb29lLCBmYWN0b3J5LCBzdHJlYW0pOworICAgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgQVNTRVJUKCBGQUxTRSk7CisgICAgICAgIGVuZDsKKworICAgICAgICAvLyBpbml0ICsgcmVhZAorICAgICAgICBsZXZlbDNvb2UgOj0gVE9uZU9mRWFjaEltcGwuQ3JlYXRlOworICAgICAgICBjYXNlIG1ldGhvZCBvZgorICAgICAgICAgIG10X0J5dGVzOiAgRGVzZXJpYWxpemUoIGJ5dGVzLCBsZXZlbDNvb2UsIGZhY3RvcnkpOworICAgICAgICAgIG10X1N0cmVhbTogYmVnaW4KKyAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA6PSAwOworICAgICAgICAgICAgRGVzZXJpYWxpemUoIHN0cmVhbSwgbGV2ZWwzb29lLCBmYWN0b3J5KTsKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIEFTU0VSVCggRkFMU0UpOworICAgICAgICBlbmQ7CisKKworICAgICAgICAvLyBjaGVjaworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JbV90cnVlID0gY29ycmVjdC5JbV90cnVlKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuSW1fZmFsc2UgPSBjb3JyZWN0LkltX2ZhbHNlKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuQV9iaXRlID0gY29ycmVjdC5BX2JpdGUpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JbnRlZ2VyMTYgPSBjb3JyZWN0LkludGVnZXIxNik7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkludGVnZXIzMiA9IGNvcnJlY3QuSW50ZWdlcjMyKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuSW50ZWdlcjY0ID0gY29ycmVjdC5JbnRlZ2VyNjQpOworICAgICAgICBBU1NFUlQoIEFicyggbGV2ZWwzb29lLkRvdWJsZV9wcmVjaXNpb24gLSBjb3JyZWN0LkRvdWJsZV9wcmVjaXNpb24pIDwgMUUtMTIpOworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5Tb21lX2NoYXJhY3RlcnMgPSBjb3JyZWN0LlNvbWVfY2hhcmFjdGVycyk7CisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLlpvbWdfdW5pY29kZSA9IGNvcnJlY3QuWm9tZ191bmljb2RlKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuV2hhdF93aG8gPSBjb3JyZWN0LldoYXRfd2hvKTsKKyAgICAgICAgQVNTRVJUKCBsZXZlbDNvb2UuQmFzZTY0ID0gY29ycmVjdC5CYXNlNjQpOworCisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkJ5dGVfbGlzdC5Db3VudCA9IGNvcnJlY3QuQnl0ZV9saXN0LkNvdW50KTsKKyAgICAgICAgZm9yIGkgOj0gMCB0byBsZXZlbDNvb2UuQnl0ZV9saXN0LkNvdW50LTEKKyAgICAgICAgZG8gQVNTRVJUKCBsZXZlbDNvb2UuQnl0ZV9saXN0W2ldID0gY29ycmVjdC5CeXRlX2xpc3RbaV0pOworCisgICAgICAgIEFTU0VSVCggbGV2ZWwzb29lLkkxNl9saXN0LkNvdW50ID0gY29ycmVjdC5JMTZfbGlzdC5Db3VudCk7CisgICAgICAgIGZvciBpIDo9IDAgdG8gbGV2ZWwzb29lLkkxNl9saXN0LkNvdW50LTEKKyAgICAgICAgZG8gQVNTRVJUKCBsZXZlbDNvb2UuSTE2X2xpc3RbaV0gPSBjb3JyZWN0LkkxNl9saXN0W2ldKTsKKworICAgICAgICBBU1NFUlQoIGxldmVsM29vZS5JNjRfbGlzdC5Db3VudCA9IGNvcnJlY3QuSTY0X2xpc3QuQ291bnQpOworICAgICAgICBmb3IgaSA6PSAwIHRvIGxldmVsM29vZS5JNjRfbGlzdC5Db3VudC0xCisgICAgICAgIGRvIEFTU0VSVCggbGV2ZWwzb29lLkk2NF9saXN0W2ldID0gY29ycmVjdC5JNjRfbGlzdFtpXSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgIGZpbmFsbHkKKyAgICBzdHJlYW0uRnJlZTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUVGVzdFNlcmlhbGl6ZXIuUnVuVGVzdHM7CitiZWdpbgorICB0cnkKKyAgICBUZXN0X1NlcmlhbGl6ZXJfRGVzZXJpYWxpemVyOworICBleGNlcHQKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgV3JpdGVsbiggZS5NZXNzYWdlKTsKKyAgICAgIFdyaXRlKCdIaXQgRU5URVIgdG8gY2xvc2UgLi4uICcpOyBSZWFkbG47CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVFRlc3RTZXJpYWxpemVyLlNlcmlhbGl6ZShjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSkgOiBUQnl0ZXM7Cit2YXIgc2VyaWFsIDogVFNlcmlhbGl6ZXI7CitiZWdpbgorICBzZXJpYWwgOj0gVFNlcmlhbGl6ZXIuQ3JlYXRlKCBmYWN0b3J5KTsKKyAgdHJ5CisgICAgcmVzdWx0IDo9IHNlcmlhbC5TZXJpYWxpemUoIGlucHV0KTsKKyAgZmluYWxseQorICAgIHNlcmlhbC5GcmVlOworICBlbmQ7CitlbmQ7CisKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5TZXJpYWxpemUoY29uc3QgaW5wdXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7IGNvbnN0IGFTdHJlYW0gOiBUU3RyZWFtKTsKK3ZhciBzZXJpYWwgOiBUU2VyaWFsaXplcjsKK2JlZ2luCisgIHNlcmlhbCA6PSBUU2VyaWFsaXplci5DcmVhdGUoIGZhY3RvcnkpOworICB0cnkKKyAgICBzZXJpYWwuU2VyaWFsaXplKCBpbnB1dCwgYVN0cmVhbSk7CisgIGZpbmFsbHkKKyAgICBzZXJpYWwuRnJlZTsKKyAgZW5kOworZW5kOworCisKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcmlhbGl6ZXIuRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVEJ5dGVzOyBjb25zdCB0YXJnZXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOwordmFyIHNlcmlhbCA6IFREZXNlcmlhbGl6ZXI7CitiZWdpbgorICBzZXJpYWwgOj0gVERlc2VyaWFsaXplci5DcmVhdGUoIGZhY3RvcnkpOworICB0cnkKKyAgICBzZXJpYWwuRGVzZXJpYWxpemUoIGlucHV0LCB0YXJnZXQpOworICBmaW5hbGx5CisgICAgc2VyaWFsLkZyZWU7CisgIGVuZDsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5EZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUU3RyZWFtOyBjb25zdCB0YXJnZXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpOwordmFyIHNlcmlhbCA6IFREZXNlcmlhbGl6ZXI7CitiZWdpbgorICBzZXJpYWwgOj0gVERlc2VyaWFsaXplci5DcmVhdGUoIGZhY3RvcnkpOworICB0cnkKKyAgICBzZXJpYWwuRGVzZXJpYWxpemUoIGlucHV0LCB0YXJnZXQpOworICBmaW5hbGx5CisgICAgc2VyaWFsLkZyZWU7CisgIGVuZDsKK2VuZDsKKworCit2YXIgdGVzdCA6IFRUZXN0U2VyaWFsaXplcjsKK2JlZ2luCisgIHRlc3QgOj0gVFRlc3RTZXJpYWxpemVyLkNyZWF0ZTsKKyAgdHJ5CisgICAgdGVzdC5SdW5UZXN0czsKKyAgZmluYWxseQorICAgIHRlc3QuRnJlZTsKKyAgZW5kOworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VydmVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTQ4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2VydmVyLmRwcgpAQCAtMCwwICsxLDczIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gc2VydmVyOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywKKyAgVGVzdFNlcnZlciBpbiAnVGVzdFNlcnZlci5wYXMnLAorICBUZXN0U2VydmVyRXZlbnRzIGluICdUZXN0U2VydmVyRXZlbnRzLnBhcycsCisgIFRocmlmdC5UZXN0LCAgLy8gaW4gZ2VuLWRlbHBoaSBmb2xkZXIKKyAgVGhyaWZ0IGluICcuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CisKK3ZhcgorICBuUGFyYW1Db3VudCA6IEludGVnZXI7CisgIGFyZ3MgOiBhcnJheSBvZiBzdHJpbmc7CisgIGkgOiBJbnRlZ2VyOworICBhcmcgOiBzdHJpbmc7CisKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oICdEZWxwaGkgVGVzdFNlcnZlciAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBuUGFyYW1Db3VudCA6PSBQYXJhbUNvdW50OworICAgIFNldExlbmd0aCggYXJncywgblBhcmFtQ291bnQpOworICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8gYmVnaW4KKyAgICAgIGFyZyA6PSBQYXJhbVN0ciggaSApOworICAgICAgYXJnc1tpLTFdIDo9IGFyZzsKKyAgICBlbmQ7CisKKyAgICBUVGVzdFNlcnZlci5FeGVjdXRlKCBhcmdzICk7CisKKyAgZXhjZXB0CisgICAgb24gRTogRUFib3J0IGRvIGJlZ2luCisgICAgICBFeGl0Q29kZSA6PSAkRkY7CisgICAgZW5kOworICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgICAgIEV4aXRDb2RlIDo9ICRGRjsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NraXAvUkVBRE1FLm1kIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDkzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9SRUFETUUubWQKQEAgLTAsMCArMSwxMSBAQAorVGhlc2UgdHdvIHByb2plY3RzIGJlbG9uZyB0b2dldGhlci4gQm90aCBwcm9ncmFtcworc2ltdWxhdGUgc2VydmVyIGFuZCBjbGllbnQgZm9yIGRpZmZlcmVudCB2ZXJzaW9ucworb2YgdGhlIHNhbWUgcHJvdG9jb2wuCisKK1RoZSBpbnRlbnRpb24gb2YgdGhpcyB0ZXN0IGlzIHRvIGVuc3VyZSBmdWxseQord29ya2luZyBjb21wYXRpYmlsaXR5IGZlYXR1cmVzIG9mIHRoZSBEZWxwaGkgVGhyaWZ0CitpbXBsZW1lbnRhdGlvbi4KKworVGhlIGV4cGVjdGVkIHRlc3QgcmVzdWx0IGlzLCB0aGF0IG5vIGVycm9ycyBvY2N1cgord2l0aCBib3RoIHByb2dyYW1zLCByZWdhcmRsZXNzIGluIHdoaWNoIG9yZGVyIHRoZXkKK21pZ2h0IGJlIHN0YXJ0ZWQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9pZGwvc2tpcHRlc3RfdmVyc2lvbl8xLnRocmlmdCBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL2lkbC9za2lwdGVzdF92ZXJzaW9uXzEudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTNjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9pZGwvc2tpcHRlc3RfdmVyc2lvbl8xLnRocmlmdApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLy8gdmVyc2lvbiAxIG9mIHRoZSBpbnRlcmZhY2UKKworbmFtZXNwYWNlICogU2tpcHRlc3QuT25lCisKK2NvbnN0IGkzMiBTS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTiA9IDEKKworc3RydWN0IFBvbmcgeworICAxIDogb3B0aW9uYWwgaTMyIHZlcnNpb24xCit9CisKK3N0cnVjdCBQaW5nIHsKKyAgMSA6IG9wdGlvbmFsIGkzMiB2ZXJzaW9uMQorfQorCitleGNlcHRpb24gUG9uZ0ZhaWxlZCB7CisgIDIyMiA6IG9wdGlvbmFsIGkzMiBwb25nRXJyb3JDb2RlCit9CisKKworc2VydmljZSBTa2lwVGVzdFNlcnZpY2UgeworICB2b2lkIFBpbmdQb25nKCAxOiBQaW5nIHBvbmcpIHRocm93cyAoNDQ0OiBQb25nRmFpbGVkIHBvZik7Cit9CisKKworLy8gRU9GClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NraXAvaWRsL3NraXB0ZXN0X3ZlcnNpb25fMi50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9pZGwvc2tpcHRlc3RfdmVyc2lvbl8yLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM1MmQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvaWRsL3NraXB0ZXN0X3ZlcnNpb25fMi50aHJpZnQKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8vIHZlcnNpb24gMiBvZiB0aGUgaW50ZXJmYWNlCisKK25hbWVzcGFjZSAqIFNraXB0ZXN0LlR3bworCitjb25zdCBpMzIgU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT04gPSAyCisKK3N0cnVjdCBQb25nIHsKKyAgMSA6IG9wdGlvbmFsIGkzMiB2ZXJzaW9uMQorICAyIDogb3B0aW9uYWwgaTE2IHZlcnNpb24yCit9CisKK3N0cnVjdCBQaW5nIHsKKyAgMSA6IG9wdGlvbmFsIGkzMiB2ZXJzaW9uMQorICAxMCA6IG9wdGlvbmFsIGJvb2wgYm9vbFZhbAorICAxMSA6IG9wdGlvbmFsIGJ5dGUgYnl0ZVZhbAorICAxMiA6IG9wdGlvbmFsIGRvdWJsZSBkYlZhbAorICAxMyA6IG9wdGlvbmFsIGkxNiBpMTZWYWwKKyAgMTQgOiBvcHRpb25hbCBpMzIgaTMyVmFsCisgIDE1IDogb3B0aW9uYWwgaTY0IGk2NFZhbAorICAxNiA6IG9wdGlvbmFsIHN0cmluZyBzdHJWYWwKKyAgMTcgOiBvcHRpb25hbCBQb25nIHN0cnVjdFZhbAorICAxOCA6IG9wdGlvbmFsIG1hcDwgbGlzdDwgUG9uZz4sIHNldDwgc3RyaW5nPj4gbWFwVmFsCit9CisKK2V4Y2VwdGlvbiBQaW5nRmFpbGVkIHsKKyAgMSA6IG9wdGlvbmFsIGkzMiBwaW5nRXJyb3JDb2RlCit9CisKK2V4Y2VwdGlvbiBQb25nRmFpbGVkIHsKKyAgMjIyIDogb3B0aW9uYWwgaTMyIHBvbmdFcnJvckNvZGUKKyAgMTAgOiBvcHRpb25hbCBib29sIGJvb2xWYWwKKyAgMTEgOiBvcHRpb25hbCBieXRlIGJ5dGVWYWwKKyAgMTIgOiBvcHRpb25hbCBkb3VibGUgZGJWYWwKKyAgMTMgOiBvcHRpb25hbCBpMTYgaTE2VmFsCisgIDE0IDogb3B0aW9uYWwgaTMyIGkzMlZhbAorICAxNSA6IG9wdGlvbmFsIGk2NCBpNjRWYWwKKyAgMTYgOiBvcHRpb25hbCBzdHJpbmcgc3RyVmFsCisgIDE3IDogb3B0aW9uYWwgUG9uZyBzdHJ1Y3RWYWwKKyAgMTggOiBvcHRpb25hbCBtYXA8IGxpc3Q8IFBvbmc+LCBzZXQ8IHN0cmluZz4+IG1hcFZhbAorfQorCisKK3NlcnZpY2UgU2tpcFRlc3RTZXJ2aWNlIHsKKyAgUGluZyBQaW5nUG9uZyggMTogUGluZyBwaW5nLCAzOiBQb25nIHBvbmcpIHRocm93cyAoMTogUGluZ0ZhaWxlZCBwaWYsIDQ0NDogUG9uZ0ZhaWxlZCBwb2YpOworfQorCisKKy8vIEVPRgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzZDZiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwcgpAQCAtMCwwICsxLDIwMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIHNraXB0ZXN0X3ZlcnNpb24xOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywKKyAgU2tpcHRlc3QuT25lLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOworCitjb25zdAorICBSRVFVRVNUX0VYVCAgPSAnLnJlcXVlc3QnOworICBSRVNQT05TRV9FWFQgPSAnLnJlc3BvbnNlJzsKKworCitmdW5jdGlvbiBDcmVhdGVQaW5nIDogSVBpbmc7CitiZWdpbgorICByZXN1bHQgOj0gVFBpbmdJbXBsLkNyZWF0ZTsKKyAgcmVzdWx0LlZlcnNpb24xICA6PSBUc2tpcHRlc3RfdmVyc2lvbl8xQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OOworZW5kOworCisKK3R5cGUKKyAgVER1bW15U2VydmVyID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlKQorICBwcm90ZWN0ZWQKKyAgICAvLyBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlCisgICAgcHJvY2VkdXJlIFBpbmdQb25nKGNvbnN0IHBpbmc6IElQaW5nKTsKKyAgZW5kOworCisKK3Byb2NlZHVyZSBURHVtbXlTZXJ2ZXIuUGluZ1BvbmcoY29uc3QgcGluZzogSVBpbmcpOworLy8gVFNraXBUZXN0U2VydmljZS5JZmFjZQorYmVnaW4KKyAgV3JpdGVsbignLSBwZXJmb3JtaW5nIHJlcXVlc3QgZnJvbSB2ZXJzaW9uICcrSW50VG9TdHIocGluZy5WZXJzaW9uMSkrJyBjbGllbnQnKTsKK2VuZDsKKworCitmdW5jdGlvbiBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBzdG0gOiBUU3RyZWFtOyBhRm9ySW5wdXQgOiBCb29sZWFuKSA6IElQcm90b2NvbDsKK3ZhciBhZGFwdCAgOiBJVGhyaWZ0U3RyZWFtOworICAgIHRyYW5zICA6IElUcmFuc3BvcnQ7CitiZWdpbgorICBhZGFwdCAgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKTsKKyAgaWYgYUZvcklucHV0CisgIHRoZW4gdHJhbnMgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhZGFwdCwgbmlsKQorICBlbHNlIHRyYW5zIDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggbmlsLCBhZGFwdCk7CisgIHJlc3VsdCA6PSBwcm90ZmFjdC5HZXRQcm90b2NvbCggdHJhbnMpOworZW5kOworCisKK3Byb2NlZHVyZSBDcmVhdGVSZXF1ZXN0KCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK3ZhciBzdG0gICAgOiBURmlsZVN0cmVhbTsKKyAgICBwaW5nICAgOiBJUGluZzsKKyAgICBwcm90byAgOiBJUHJvdG9jb2w7CisgICAgY2xpZW50IDogVFNraXBUZXN0U2VydmljZS5UQ2xpZW50OyAgIC8vIHdlIG5lZWQgYWNjZXNzIHRvIHNlbmQvcmVjdl9waW5ncG9uZygpCisgICAgY2xpUmVmIDogSVVua25vd247ICAgICAgICAgICAgICAgICAgIC8vIGhvbGRzIHRoZSByZWZjb3VudAorYmVnaW4KKyAgV3JpdGVsbignLSBjcmVhdGluZyBuZXcgcmVxdWVzdCcpOworICBzdG0gOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVFVRVNUX0VYVCsnLnRtcCcsIGZtQ3JlYXRlKTsKKyAgdHJ5CisgICAgcGluZyA6PSBDcmVhdGVQaW5nOworCisgICAgLy8gc2F2ZSByZXF1ZXN0IGRhdGEKKyAgICBwcm90byAgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG0sIEZBTFNFKTsKKyAgICBjbGllbnQgOj0gVFNraXBUZXN0U2VydmljZS5UQ2xpZW50LkNyZWF0ZSggbmlsLCBwcm90byk7CisgICAgY2xpUmVmIDo9IGNsaWVudCBhcyBJVW5rbm93bjsKKyAgICBjbGllbnQuc2VuZF9QaW5nUG9uZyggcGluZyk7CisKKyAgZmluYWxseQorICAgIGNsaWVudCA6PSBuaWw7ICAvLyBub3QgRnJlZSEKKyAgICBjbGlSZWYgOj0gbmlsOworICAgIHN0bS5GcmVlOworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OworICBlbmQ7CisKKyAgRGVsZXRlRmlsZSggZm5hbWUrUkVRVUVTVF9FWFQpOworICBSZW5hbWVGaWxlKCBmbmFtZStSRVFVRVNUX0VYVCsnLnRtcCcsIGZuYW1lK1JFUVVFU1RfRVhUKTsKK2VuZDsKKworCitwcm9jZWR1cmUgUmVhZFJlc3BvbnNlKCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK3ZhciBzdG0gICAgOiBURmlsZVN0cmVhbTsKKyAgICBwcm90byAgOiBJUHJvdG9jb2w7CisgICAgY2xpZW50IDogVFNraXBUZXN0U2VydmljZS5UQ2xpZW50OyAgIC8vIHdlIG5lZWQgYWNjZXNzIHRvIHNlbmQvcmVjdl9waW5ncG9uZygpCisgICAgY2xpUmVmIDogSVVua25vd247ICAgICAgICAgICAgICAgICAgIC8vIGhvbGRzIHRoZSByZWZjb3VudAorYmVnaW4KKyAgV3JpdGVsbignLSByZWFkaW5nIHJlc3BvbnNlJyk7CisgIHN0bSA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFU1BPTlNFX0VYVCwgZm1PcGVuUmVhZCk7CisgIHRyeQorICAgIC8vIHNhdmUgcmVxdWVzdCBkYXRhCisgICAgcHJvdG8gIDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtLCBUUlVFKTsKKyAgICBjbGllbnQgOj0gVFNraXBUZXN0U2VydmljZS5UQ2xpZW50LkNyZWF0ZSggcHJvdG8sIG5pbCk7CisgICAgY2xpUmVmIDo9IGNsaWVudCBhcyBJVW5rbm93bjsKKyAgICBjbGllbnQucmVjdl9QaW5nUG9uZzsKKworICBmaW5hbGx5CisgICAgY2xpZW50IDo9IG5pbDsgIC8vIG5vdCBGcmVlIQorICAgIGNsaVJlZiA6PSBuaWw7CisgICAgc3RtLkZyZWU7CisgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgUHJvY2Vzc0ZpbGUoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOwordmFyIHN0bUluLCBzdG1PdXQgICA6IFRGaWxlU3RyZWFtOworICAgIHByb3RJbiwgcHJvdE91dCA6IElQcm90b2NvbDsKKyAgICBzZXJ2ZXIgOiBJUHJvY2Vzc29yOworYmVnaW4KKyAgV3JpdGVsbignLSBwcm9jZXNzaW5nIHJlcXVlc3QnKTsKKyAgc3RtT3V0IDo9IG5pbDsKKyAgc3RtSW4gIDo9IFRGaWxlU3RyZWFtLkNyZWF0ZSggZm5hbWUrUkVRVUVTVF9FWFQsIGZtT3BlblJlYWQpOworICB0cnkKKyAgICBzdG1PdXQgOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVNQT05TRV9FWFQrJy50bXAnLCBmbUNyZWF0ZSk7CisKKyAgICAvLyBwcm9jZXNzIHJlcXVlc3QgYW5kIHdyaXRlIHJlc3BvbnNlIGRhdGEKKyAgICBwcm90SW4gIDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtSW4sICBUUlVFKTsKKyAgICBwcm90T3V0IDo9IENyZWF0ZVByb3RvY29sKCBwcm90ZmFjdCwgc3RtT3V0LCBGQUxTRSk7CisKKyAgICBzZXJ2ZXIgOj0gVFNraXBUZXN0U2VydmljZS5UUHJvY2Vzc29ySW1wbC5DcmVhdGUoIFREdW1teVNlcnZlci5DcmVhdGUpOworICAgIHNlcnZlci5Qcm9jZXNzKCBwcm90SW4sIHByb3RPdXQpOworCisgIGZpbmFsbHkKKyAgICBzZXJ2ZXIgOj0gbmlsOyAgLy8gbm90IEZyZWUhCisgICAgc3RtSW4uRnJlZTsKKyAgICBzdG1PdXQuRnJlZTsKKyAgICBpZiBzZXJ2ZXIgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKKyAgZW5kOworCisgIERlbGV0ZUZpbGUoIGZuYW1lK1JFU1BPTlNFX0VYVCk7CisgIFJlbmFtZUZpbGUoIGZuYW1lK1JFU1BPTlNFX0VYVCsnLnRtcCcsIGZuYW1lK1JFU1BPTlNFX0VYVCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRlc3QoIHByb3RmYWN0IDogSVByb3RvY29sRmFjdG9yeTsgZm5hbWUgOiBzdHJpbmcpOworYmVnaW4KKyAgLy8gdHJ5IHRvIHJlYWQgYW4gZXhpc3RpbmcgcmVxdWVzdAorICBpZiBGaWxlRXhpc3RzKCBmbmFtZSArIFJFUVVFU1RfRVhUKSB0aGVuIGJlZ2luCisgICAgUHJvY2Vzc0ZpbGUoIHByb3RmYWN0LCBmbmFtZSk7CisgICAgUmVhZFJlc3BvbnNlKCBwcm90ZmFjdCwgZm5hbWUpOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIGEgbmV3IHJlcXVlc3QgYW5kIHRyeSB0byBwcm9jZXNzCisgIENyZWF0ZVJlcXVlc3QoIHByb3RmYWN0LCBmbmFtZSk7CisgIFByb2Nlc3NGaWxlKCBwcm90ZmFjdCwgZm5hbWUpOworICBSZWFkUmVzcG9uc2UoIHByb3RmYWN0LCBmbmFtZSk7CitlbmQ7CisKKworY29uc3QKKyAgRklMRV9CSU5BUlkgPSAncGluZ3BvbmcuYmluJzsKKyAgRklMRV9KU09OICAgPSAncGluZ3BvbmcuanNvbic7CitiZWdpbgorICB0cnkKKyAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVHNraXB0ZXN0X3ZlcnNpb25fMUNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKKworICAgIFdyaXRlbG47CisgICAgV3JpdGVsbignQmluYXJ5IHByb3RvY29sJyk7CisgICAgVGVzdCggVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUsIEZJTEVfQklOQVJZKTsKKworICAgIFdyaXRlbG47CisgICAgV3JpdGVsbignSlNPTiBwcm90b2NvbCcpOworICAgIFRlc3QoIFRKU09OUHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSwgICBGSUxFX0pTT04pOworCisgICAgV3JpdGVsbjsKKyAgICBXcml0ZWxuKCdUZXN0IGNvbXBsZXRlZCB3aXRob3V0IGVycm9ycy4nKTsKKyAgICBXcml0ZWxuOworICAgIFdyaXRlKCdQcmVzcyBFTlRFUiB0byBjbG9zZSAuLi4nKTsgIFJlYWRsbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNiMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByCkBAIC0wLDAgKzEsMjI4IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gc2tpcHRlc3RfdmVyc2lvbjI7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAorICBTa2lwdGVzdC5Ud28sCisgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CisKK2NvbnN0CisgIFJFUVVFU1RfRVhUICA9ICcucmVxdWVzdCc7CisgIFJFU1BPTlNFX0VYVCA9ICcucmVzcG9uc2UnOworCitmdW5jdGlvbiBDcmVhdGVQaW5nIDogSVBpbmc7Cit2YXIgbGlzdCA6IElUaHJpZnRMaXN0PElQb25nPjsKKyAgICBzZXRfIDogSUhhc2hTZXQ8c3RyaW5nPjsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUGluZ0ltcGwuQ3JlYXRlOworICByZXN1bHQuVmVyc2lvbjEgIDo9IFRza2lwdGVzdF92ZXJzaW9uXzJDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CisgIHJlc3VsdC5Cb29sVmFsICAgOj0gVFJVRTsKKyAgcmVzdWx0LkJ5dGVWYWwgICA6PSAyOworICByZXN1bHQuRGJWYWwgICAgIDo9IDM7CisgIHJlc3VsdC5JMTZWYWwgICAgOj0gNDsKKyAgcmVzdWx0LkkzMlZhbCAgICA6PSA1OworICByZXN1bHQuSTY0VmFsICAgIDo9IDY7CisgIHJlc3VsdC5TdHJWYWwgICAgOj0gJ3NldmVuJzsKKworICByZXN1bHQuU3RydWN0VmFsIDo9IFRQb25nSW1wbC5DcmVhdGU7CisgIHJlc3VsdC5TdHJ1Y3RWYWwuVmVyc2lvbjEgOj0gLTE7CisgIHJlc3VsdC5TdHJ1Y3RWYWwuVmVyc2lvbjIgOj0gLTI7CisKKyAgbGlzdCA6PSBUVGhyaWZ0TGlzdEltcGw8SVBvbmc+LkNyZWF0ZTsKKyAgbGlzdC5BZGQoIHJlc3VsdC5TdHJ1Y3RWYWwpOworICBsaXN0LkFkZCggcmVzdWx0LlN0cnVjdFZhbCk7CisKKyAgc2V0XyA6PSBUSGFzaFNldEltcGw8c3RyaW5nPi5DcmVhdGU7CisgIHNldF8uQWRkKCAnb25lJyk7CisgIHNldF8uQWRkKCAndW5vJyk7CisgIHNldF8uQWRkKCAnZWlucycpOworICBzZXRfLkFkZCggJ2VlbicpOworCisgIHJlc3VsdC5NYXBWYWwgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPCBJVGhyaWZ0TGlzdDxJUG9uZz4sIElIYXNoU2V0PHN0cmluZz4+LkNyZWF0ZTsKKyAgcmVzdWx0Lk1hcFZhbC5BZGQoIGxpc3QsIHNldF8pOworZW5kOworCisKK3R5cGUKKyAgVER1bW15U2VydmVyID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlKQorICBwcm90ZWN0ZWQKKyAgICAvLyBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlCisgICAgZnVuY3Rpb24gUGluZ1BvbmcoY29uc3QgcGluZzogSVBpbmc7IGNvbnN0IHBvbmc6IElQb25nKTogSVBpbmc7CisgIGVuZDsKKworCitmdW5jdGlvbiBURHVtbXlTZXJ2ZXIuUGluZ1BvbmcoY29uc3QgcGluZzogSVBpbmc7IGNvbnN0IHBvbmc6IElQb25nKTogSVBpbmc7CisvLyBUU2tpcFRlc3RTZXJ2aWNlLklmYWNlCitiZWdpbgorICBXcml0ZWxuKCctIHBlcmZvcm1pbmcgcmVxdWVzdCBmcm9tIHZlcnNpb24gJytJbnRUb1N0cihwaW5nLlZlcnNpb24xKSsnIGNsaWVudCcpOworICByZXN1bHQgOj0gQ3JlYXRlUGluZzsKK2VuZDsKKworCitmdW5jdGlvbiBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBzdG0gOiBUU3RyZWFtOyBhRm9ySW5wdXQgOiBCb29sZWFuKSA6IElQcm90b2NvbDsKK3ZhciBhZGFwdCAgOiBJVGhyaWZ0U3RyZWFtOworICAgIHRyYW5zICA6IElUcmFuc3BvcnQ7CitiZWdpbgorICBhZGFwdCAgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKTsKKyAgaWYgYUZvcklucHV0CisgIHRoZW4gdHJhbnMgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhZGFwdCwgbmlsKQorICBlbHNlIHRyYW5zIDo9IFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggbmlsLCBhZGFwdCk7CisgIHJlc3VsdCA6PSBwcm90ZmFjdC5HZXRQcm90b2NvbCggdHJhbnMpOworZW5kOworCisKK3Byb2NlZHVyZSBDcmVhdGVSZXF1ZXN0KCBwcm90ZmFjdCA6IElQcm90b2NvbEZhY3Rvcnk7IGZuYW1lIDogc3RyaW5nKTsKK3ZhciBzdG0gICAgOiBURmlsZVN0cmVhbTsKKyAgICBwaW5nICAgOiBJUGluZzsKKyAgICBwcm90byAgOiBJUHJvdG9jb2w7CisgICAgY2xpZW50IDogVFNraXBUZXN0U2VydmljZS5UQ2xpZW50OyAgIC8vIHdlIG5lZWQgYWNjZXNzIHRvIHNlbmQvcmVjdl9waW5ncG9uZygpCisgICAgY2xpUmVmIDogSVVua25vd247ICAgICAgICAgICAgICAgICAgIC8vIGhvbGRzIHRoZSByZWZjb3VudAorYmVnaW4KKyAgV3JpdGVsbignLSBjcmVhdGluZyBuZXcgcmVxdWVzdCcpOworICBzdG0gOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVFVRVNUX0VYVCsnLnRtcCcsIGZtQ3JlYXRlKTsKKyAgdHJ5CisgICAgcGluZyA6PSBDcmVhdGVQaW5nOworCisgICAgLy8gc2F2ZSByZXF1ZXN0IGRhdGEKKyAgICBwcm90byAgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG0sIEZBTFNFKTsKKyAgICBjbGllbnQgOj0gVFNraXBUZXN0U2VydmljZS5UQ2xpZW50LkNyZWF0ZSggbmlsLCBwcm90byk7CisgICAgY2xpUmVmIDo9IGNsaWVudCBhcyBJVW5rbm93bjsKKyAgICBjbGllbnQuc2VuZF9QaW5nUG9uZyggcGluZywgcGluZy5TdHJ1Y3RWYWwpOworCisgIGZpbmFsbHkKKyAgICBjbGllbnQgOj0gbmlsOyAgLy8gbm90IEZyZWUhCisgICAgY2xpUmVmIDo9IG5pbDsKKyAgICBzdG0uRnJlZTsKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKKyAgZW5kOworCisgIERlbGV0ZUZpbGUoIGZuYW1lK1JFUVVFU1RfRVhUKTsKKyAgUmVuYW1lRmlsZSggZm5hbWUrUkVRVUVTVF9FWFQrJy50bXAnLCBmbmFtZStSRVFVRVNUX0VYVCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFJlYWRSZXNwb25zZSggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7Cit2YXIgc3RtICAgIDogVEZpbGVTdHJlYW07CisgICAgcGluZyAgIDogSVBpbmc7CisgICAgcHJvdG8gIDogSVByb3RvY29sOworICAgIGNsaWVudCA6IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudDsgICAvLyB3ZSBuZWVkIGFjY2VzcyB0byBzZW5kL3JlY3ZfcGluZ3BvbmcoKQorICAgIGNsaVJlZiA6IElVbmtub3duOyAgICAgICAgICAgICAgICAgICAvLyBob2xkcyB0aGUgcmVmY291bnQKK2JlZ2luCisgIFdyaXRlbG4oJy0gcmVhZGluZyByZXNwb25zZScpOworICBzdG0gOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVNQT05TRV9FWFQsIGZtT3BlblJlYWQpOworICB0cnkKKyAgICAvLyBzYXZlIHJlcXVlc3QgZGF0YQorICAgIHByb3RvICA6PSBDcmVhdGVQcm90b2NvbCggcHJvdGZhY3QsIHN0bSwgVFJVRSk7CisgICAgY2xpZW50IDo9IFRTa2lwVGVzdFNlcnZpY2UuVENsaWVudC5DcmVhdGUoIHByb3RvLCBuaWwpOworICAgIGNsaVJlZiA6PSBjbGllbnQgYXMgSVVua25vd247CisgICAgcGluZyAgIDo9IGNsaWVudC5yZWN2X1BpbmdQb25nOworCisgIGZpbmFsbHkKKyAgICBjbGllbnQgOj0gbmlsOyAgLy8gbm90IEZyZWUhCisgICAgY2xpUmVmIDo9IG5pbDsKKyAgICBzdG0uRnJlZTsKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBQcm9jZXNzRmlsZSggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7Cit2YXIgc3RtSW4sIHN0bU91dCAgIDogVEZpbGVTdHJlYW07CisgICAgcHJvdEluLCBwcm90T3V0IDogSVByb3RvY29sOworICAgIHNlcnZlciA6IElQcm9jZXNzb3I7CitiZWdpbgorICBXcml0ZWxuKCctIHByb2Nlc3NpbmcgcmVxdWVzdCcpOworICBzdG1PdXQgOj0gbmlsOworICBzdG1JbiAgOj0gVEZpbGVTdHJlYW0uQ3JlYXRlKCBmbmFtZStSRVFVRVNUX0VYVCwgZm1PcGVuUmVhZCk7CisgIHRyeQorICAgIHN0bU91dCA6PSBURmlsZVN0cmVhbS5DcmVhdGUoIGZuYW1lK1JFU1BPTlNFX0VYVCsnLnRtcCcsIGZtQ3JlYXRlKTsKKworICAgIC8vIHByb2Nlc3MgcmVxdWVzdCBhbmQgd3JpdGUgcmVzcG9uc2UgZGF0YQorICAgIHByb3RJbiAgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG1JbiwgIFRSVUUpOworICAgIHByb3RPdXQgOj0gQ3JlYXRlUHJvdG9jb2woIHByb3RmYWN0LCBzdG1PdXQsIEZBTFNFKTsKKworICAgIHNlcnZlciA6PSBUU2tpcFRlc3RTZXJ2aWNlLlRQcm9jZXNzb3JJbXBsLkNyZWF0ZSggVER1bW15U2VydmVyLkNyZWF0ZSk7CisgICAgc2VydmVyLlByb2Nlc3MoIHByb3RJbiwgcHJvdE91dCk7CisKKyAgZmluYWxseQorICAgIHNlcnZlciA6PSBuaWw7ICAvLyBub3QgRnJlZSEKKyAgICBzdG1Jbi5GcmVlOworICAgIHN0bU91dC5GcmVlOworICAgIGlmIHNlcnZlciA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OworICBlbmQ7CisKKyAgRGVsZXRlRmlsZSggZm5hbWUrUkVTUE9OU0VfRVhUKTsKKyAgUmVuYW1lRmlsZSggZm5hbWUrUkVTUE9OU0VfRVhUKycudG1wJywgZm5hbWUrUkVTUE9OU0VfRVhUKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVGVzdCggcHJvdGZhY3QgOiBJUHJvdG9jb2xGYWN0b3J5OyBmbmFtZSA6IHN0cmluZyk7CitiZWdpbgorICAvLyB0cnkgdG8gcmVhZCBhbiBleGlzdGluZyByZXF1ZXN0CisgIGlmIEZpbGVFeGlzdHMoIGZuYW1lICsgUkVRVUVTVF9FWFQpIHRoZW4gYmVnaW4KKyAgICBQcm9jZXNzRmlsZSggcHJvdGZhY3QsIGZuYW1lKTsKKyAgICBSZWFkUmVzcG9uc2UoIHByb3RmYWN0LCBmbmFtZSk7CisgIGVuZDsKKworICAvLyBjcmVhdGUgYSBuZXcgcmVxdWVzdCBhbmQgdHJ5IHRvIHByb2Nlc3MKKyAgQ3JlYXRlUmVxdWVzdCggcHJvdGZhY3QsIGZuYW1lKTsKKyAgUHJvY2Vzc0ZpbGUoIHByb3RmYWN0LCBmbmFtZSk7CisgIFJlYWRSZXNwb25zZSggcHJvdGZhY3QsIGZuYW1lKTsKK2VuZDsKKworCitjb25zdAorICBGSUxFX0JJTkFSWSA9ICdwaW5ncG9uZy5iaW4nOworICBGSUxFX0pTT04gICA9ICdwaW5ncG9uZy5qc29uJzsKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oICdEZWxwaGkgU2tpcFRlc3QgJytJbnRUb1N0cihUc2tpcHRlc3RfdmVyc2lvbl8yQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OKSsnIHVzaW5nICcrVGhyaWZ0LlZlcnNpb24pOworCisgICAgV3JpdGVsbjsKKyAgICBXcml0ZWxuKCdCaW5hcnkgcHJvdG9jb2wnKTsKKyAgICBUZXN0KCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSwgRklMRV9CSU5BUlkpOworCisgICAgV3JpdGVsbjsKKyAgICBXcml0ZWxuKCdKU09OIHByb3RvY29sJyk7CisgICAgVGVzdCggVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlLCAgIEZJTEVfSlNPTik7CisKKyAgICBXcml0ZWxuOworICAgIFdyaXRlbG4oJ1Rlc3QgY29tcGxldGVkIHdpdGhvdXQgZXJyb3JzLicpOworICAgIFdyaXRlbG47CisgICAgV3JpdGUoJ1ByZXNzIEVOVEVSIHRvIGNsb3NlIC4uLicpOyAgUmVhZGxuOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwciBiL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhN2M3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIKQEAgLTAsMCArMSw5MCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIFRlc3RUeXBlUmVnaXN0cnk7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywgVHlwSW5mbywKKyAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlNlcmlhbGl6ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VyaWFsaXplci5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAorICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAorICBEZWJ1Z1Byb3RvVGVzdDsKKwordHlwZQorICBUZXN0ZXI8VCA6IElJbnRlcmZhY2U+ID0gY2xhc3MKKyAgcHVibGljCisgICAgY2xhc3MgcHJvY2VkdXJlIFRlc3Q7CisgIGVuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRlc3RlcjxUPi5UZXN0OwordmFyIGluc3RhbmNlIDogVDsKKyAgICBuYW1lIDogc3RyaW5nOworYmVnaW4KKyAgaW5zdGFuY2UgOj0gVHlwZVJlZ2lzdHJ5LkNvbnN0cnVjdDxUPjsKKyAgbmFtZSA6PSBHZXRUeXBlTmFtZShUeXBlSW5mbyhUKSk7CisgIGlmIGluc3RhbmNlIDw+IG5pbAorICB0aGVuIFdyaXRlbG4oIG5hbWUsICcgPSBvaycpCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZWxuKCBuYW1lLCAnID0gZmFpbGVkJyk7CisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSggJ1Rlc3Qgd2l0aCAnK25hbWUrJyBmYWlsZWQhJyk7CisgIGVuZDsKK2VuZDsKKworYmVnaW4KKyAgV3JpdGVsbignVGVzdGluZyAuLi4nKTsKKyAgVGVzdGVyPElEb3VibGVzPi5UZXN0OworICBUZXN0ZXI8SU9uZU9mRWFjaD4uVGVzdDsKKyAgVGVzdGVyPElCb25rPi5UZXN0OworICBUZXN0ZXI8SU5lc3Rpbmc+LlRlc3Q7CisgIFRlc3RlcjxJSG9seU1vbGV5Pi5UZXN0OworICBUZXN0ZXI8SUJhY2t3YXJkcz4uVGVzdDsKKyAgVGVzdGVyPElFbXB0eT4uVGVzdDsKKyAgVGVzdGVyPElXcmFwcGVyPi5UZXN0OworICBUZXN0ZXI8SVJhbmRvbVN0dWZmPi5UZXN0OworICBUZXN0ZXI8SUJhc2U2ND4uVGVzdDsKKyAgVGVzdGVyPElDb21wYWN0UHJvdG9UZXN0U3RydWN0Pi5UZXN0OworICBUZXN0ZXI8SVNpbmdsZU1hcFRlc3RTdHJ1Y3Q+LlRlc3Q7CisgIFRlc3RlcjxJQmxvd1VwPi5UZXN0OworICBUZXN0ZXI8SVJldmVyc2VPcmRlclN0cnVjdD4uVGVzdDsKKyAgVGVzdGVyPElTdHJ1Y3RXaXRoU29tZUVudW0+LlRlc3Q7CisgIFRlc3RlcjxJVGVzdFVuaW9uPi5UZXN0OworICBUZXN0ZXI8SVRlc3RVbmlvbk1pbnVzU3RyaW5nRmllbGQ+LlRlc3Q7CisgIFRlc3RlcjxJQ29tcGFyYWJsZVVuaW9uPi5UZXN0OworICBUZXN0ZXI8SVN0cnVjdFdpdGhBVW5pb24+LlRlc3Q7CisgIFRlc3RlcjxJUHJpbWl0aXZlVGhlblN0cnVjdD4uVGVzdDsKKyAgVGVzdGVyPElTdHJ1Y3RXaXRoQVNvbWVtYXA+LlRlc3Q7CisgIFRlc3RlcjxJQmlnRmllbGRJZFN0cnVjdD4uVGVzdDsKKyAgVGVzdGVyPElCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sPi5UZXN0OworICBUZXN0ZXI8SVR1cGxlUHJvdG9jb2xUZXN0U3RydWN0Pi5UZXN0OworICBXcml0ZWxuKCdDb21wbGV0ZWQuJyk7CisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZXJsL01ha2VmaWxlLmFtIGIvbGliL2VybC9NYWtlZmlsZS5hbQppbmRleCAzMzc2MWExLi4wNjMyM2I0IDEwMDY0NAotLS0gYS9saWIvZXJsL01ha2VmaWxlLmFtCisrKyBiL2xpYi9lcmwvTWFrZWZpbGUuYW0KQEAgLTE3LDEzICsxNyw0NSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotTU9EVUxFUyA9IFwKLQlzcmMKK1RIUklGVCA9IC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQKK1RIUklGVF9PTUlUX0ZJTEUgPSB0ZXN0L1RocmlmdF9vbWl0X3dpdGhvdXQudGhyaWZ0CitUSFJJRlRfRklMRVMgPSAkKHdpbGRjYXJkIHRlc3QvKi50aHJpZnQpIFwKKwkJICAkKFRIUklGVF9PTUlUX0ZJTEUpIFwKKwkJICAuLi8uLi90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0IFwKKwkJICAuLi8uLi90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0IFwKKwkJICAuLi8uLi90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IFwKKwkJICAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAKLWFsbCBjbGVhbiBkb2NzOgotCWZvciBkaXIgaW4gJChNT0RVTEVTKTsgZG8gXAotCQkoY2QgJCRkaXI7ICR7TUFLRX0gJEApOyBcCitpZiBFUkxBTkdfT1RQMTYKK0VSTF9GTEFHID0gZXJsOm90cDE2CitFUkxfRkxBR19MRUdBQ1kgPSBlcmw6b3RwMTYsbGVnYWN5bmFtZXMKKyMgb3RwMTYgKyBtYXBzIGRvZXMgbm90IG1ha2Ugc2Vuc2UuIFdlIG5lZWQgdG8gZ2VuZXJhdGUgaXQgYW55d2F5IHRvIGF2b2lkIGluY2x1ZGUgZXJyb3IuCitFUkxfRkxBR19NQVBTID0gZXJsOm90cDE2CitlbHNlCitFUkxfRkxBRyA9IGVybAorRVJMX0ZMQUdfTEVHQUNZID0gZXJsOmxlZ2FjeW5hbWVzCitFUkxfRkxBR19NQVBTID0gZXJsOm1hcHMKK2VuZGlmCisKKyQoVEhSSUZUX09NSVRfRklMRSk6IHRlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKKwlncmVwIC12IG9taXQgJDwgPiRACisKKy5nZW5lcmF0ZWQ6ICQoVEhSSUZUKSAkKFRIUklGVF9GSUxFUykKKwlmb3IgZiBpbiAkKFRIUklGVF9GSUxFUykgOyBkbyBcCisJCSQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHKSAtbyB0ZXN0ICQkZiA7IFwKIAlkb25lCisJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUdfTEVHQUNZKSAtbyB0ZXN0IHRlc3QvZmxhZ3MvTGVnYWN5TmFtZXMudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUdfTUFQUykgLW8gdGVzdCB0ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0CisJdG91Y2ggLmdlbmVyYXRlZAorCithbGw6IC5nZW5lcmF0ZWQKKwkkKFJFQkFSKSBnZXQtZGVwcworCSQoUkVCQVIpIGNvbXBpbGUKKworY2hlY2s6IC5nZW5lcmF0ZWQKKwkkKFJFQkFSKSAtQyByZWJhci50ZXN0LmNvbmZpZyBnZXQtZGVwcworCSQoUkVCQVIpIC1DIHJlYmFyLnRlc3QuY29uZmlnIGNvbXBpbGUKKwkkKFJFQkFSKSAtQyByZWJhci50ZXN0LmNvbmZpZyBza2lwX2RlcHM9dHJ1ZSBldW5pdAogCiBpbnN0YWxsOiBhbGwKIAlta2RpciAtcCAkKERFU1RESVIpJChFUkxBTkdfSU5TVEFMTF9MSUJfRElSX3RocmlmdCkgOyBcCkBAIC0zNyw4ICs2OSwyMyBAQAogdW5pbnN0YWxsOgogCXJtIC1yZiAkKERFU1RESVIpJChFUkxBTkdfSU5TVEFMTF9MSUJfRElSX3RocmlmdCkKIAorY2xlYW46CisJcm0gLWYgLmdlbmVyYXRlZAorCXJtIC1yZiB0ZXN0L2dlbi1lcmwvCisJcm0gLWYgJChUSFJJRlRfT01JVF9GSUxFKQorCSQoUkVCQVIpIGNsZWFuCiAKIG1haW50YWluZXItY2xlYW4tbG9jYWw6CiAJcm0gLXJmIGViaW4KIAorRVhUUkFfRElTVCA9IFwKKwlpbmNsdWRlIFwKKwlzcmMgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCXJlYmFyLmNvbmZpZyBcCisJcmViYXIuY29uZmlnLnNjcmlwdCBcCisJcmViYXIudGVzdC5jb25maWcgXAorCXRlc3QgXAorCVJFQURNRS5tZAorCiBNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9saWIvZXJsL1JFQURNRSBiL2xpYi9lcmwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGI2OTQ2Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotVGhyaWZ0IEVybGFuZyBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUV4YW1wbGUKLT09PT09PT0KLQotRXhhbXBsZSBzZXNzaW9uIHVzaW5nIHRocmlmdF9jbGllbnQ6Ci0KLTExOD4gZigpLCB7b2ssIEN9ID0gdGhyaWZ0X2NsaWVudDpzdGFydF9saW5rKCJsb2NhbGhvc3QiLCA5MDkwLCB0aHJpZnRUZXN0X3RocmlmCi10KS4KLXtvayw8MC4yNzEuMD59Ci0xMTk+IHRocmlmdF9jbGllbnQ6Y2FsbChDLCB0ZXN0Vm9pZCwgW10pLgote29rLG9rfQotMTIwPiB0aHJpZnRfY2xpZW50OmNhbGwoQywgdGVzdFZvaWQsIFthc2RmXSkuCi17ZXJyb3Ise2JhZF9hcmdzLHRlc3RWb2lkLFthc2RmXX19Ci0xMjE+IHRocmlmdF9jbGllbnQ6Y2FsbChDLCB0ZXN0STMyLCBbMTIzXSkuCi17b2ssMTIzfQotMTIyPiB0aHJpZnRfY2xpZW50OmNhbGwoQywgdGVzdE9uZXdheSwgWzFdKS4KLXtvayxva30KLTEyMz4gY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKEMsIHRlc3RYY2VwdGlvbiwgWyJmb28iXSkuCi17ZXJyb3Ise25vX2Z1bmN0aW9uLHRlc3RYY2VwdGlvbn19Ci0xMjQ+IGNhdGNoIHRocmlmdF9jbGllbnQ6Y2FsbChDLCB0ZXN0RXhjZXB0aW9uLCBbImZvbyJdKS4KLXtvayxva30KLTEyNT4gY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKEMsIHRlc3RFeGNlcHRpb24sIFsiWGNlcHRpb24iXSkuCi17eGNlcHRpb24sMTAwMSwiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9Ci0xMjY+IHRocmlmdF9jbGllbnQ6Y2FsbChDLCB0ZXN0RXhjZXB0aW9uLCBbIlhjZXB0aW9uIl0pLgotCi09RVJST1IgUkVQT1JUPT09PSAyNC1GZWItMjAwODo6MjM6MDA6MjMgPT09Ci1FcnJvciBpbiBwcm9jZXNzIDwwLjI2OS4wPiB3aXRoIGV4aXQgdmFsdWU6IHt7bm9jYXRjaCx7eGNlcHRpb24sMTAwMSwiVGhpcyBpcyBhbgotIFhjZXB0aW9uIn19LFt7dGhyaWZ0X2NsaWVudCxjYWxsLDN9LHtlcmxfZXZhbCxkb19hcHBseSw1fSx7c2hlbGwsZXhwcnMsNn0se3NoZWwKLWwsZXZhbF9sb29wLDN9XX0KLQotKiogZXhpdGVkOiB7e25vY2F0Y2gse3hjZXB0aW9uLDEwMDEsIlRoaXMgaXMgYW4gWGNlcHRpb24ifX0sCi0gICAgICAgICAgICBbe3RocmlmdF9jbGllbnQsY2FsbCwzfSwKLSAgICAgICAgICAgICB7ZXJsX2V2YWwsZG9fYXBwbHksNX0sCi0gICAgICAgICAgICAge3NoZWxsLGV4cHJzLDZ9LAotICAgICAgICAgICAgIHtzaGVsbCxldmFsX2xvb3AsM31dfSAqKgpkaWZmIC0tZ2l0IGEvbGliL2VybC9SRUFETUUubWQgYi9saWIvZXJsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzNkMDVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9SRUFETUUubWQKQEAgLTAsMCArMSw1MSBAQAorIyBUaHJpZnQgRXJsYW5nIFNvZnR3YXJlIExpYnJhcnkgIworCisjIyBMaWNlbnNlICMjCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisjIyBSZWxlYXNlIE5vdGVzICMjCisKKyMjIyAwLjkuMiAjIyMKKworYXMgb2YgMC45LjIgc3RydWN0IGFuZCBmdW5jdGlvbiBuYW1pbmcgY29udmVudGlvbnMgaGF2ZSBjaGFuZ2VkLiB0byByZXRhaW4gdGhlCitvbGQgbmFtaW5nIGNvbnZlbnRpb25zIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpIHVzZSB0aGUgY29tcGlsZXIgb3B0aW9uCitgbGVnYWN5bmFtZXNgCisKKyMjIEV4YW1wbGUgIyMKKworRXhhbXBsZSBzZXNzaW9uIHVzaW5nIHRocmlmdF9jbGllbnQ6CisKK2BgYGVybAorMT4ge29rLCBDMH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KCJsb2NhbGhvc3QiLCA5MDkwLCB0aHJpZnRfdGVzdF90aHJpZnQsIFtdKSwgb2suCitvaworMj4ge0MxLCBSMX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzAsIHRlc3RWb2lkLCBbXSksIFIxLgore29rLG9rfQorMz4ge0MyLCBSMn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzEsIHRlc3RWb2lkLCBbYXNkZl0pLCBSMi4KK3tlcnJvcix7YmFkX2FyZ3MsdGVzdFZvaWQsW2FzZGZdfX0KKzQ+IHtDMywgUjN9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMyLCB0ZXN0STMyLCBbMTIzXSksIFIzLgore29rLDEyM30KKzU+IHtDNCwgUjR9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMzLCB0ZXN0T25ld2F5LCBbMV0pLCBSNC4KK3tvayxva30KKzY+IHtDNSwgUjV9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEM0LCB0ZXN0WGNlcHRpb24sIFsiZm9vIl0pLCBSNS4KK3tlcnJvcix7bm9fZnVuY3Rpb24sdGVzdFhjZXB0aW9ufX0KKzc+IHtDNiwgUjZ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEM1LCB0ZXN0RXhjZXB0aW9uLCBbImZvbyJdKSwgUjYuCit7b2ssb2t9Cis4PiB7QzcsIFI3fSA9IChjYXRjaCB0aHJpZnRfY2xpZW50OmNhbGwoQzYsIHRlc3RFeGNlcHRpb24sIFsiWGNlcHRpb24iXSkpLCBSNy4KK3tleGNlcHRpb24se3hjZXB0aW9uLDEwMDEsPDwiWGNlcHRpb24iPj59fQorYGBgCmRpZmYgLS1naXQgYS9saWIvZXJsL2J1aWxkL2JlYW12ZXIgYi9saWIvZXJsL2J1aWxkL2JlYW12ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWY3N2IuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9idWlsZC9iZWFtdmVyCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgZXJsd2FyZVN5czogb3RwL2J1aWxkL2JlYW12ZXIsdiAxLjEgMjAwMi8wMi8xNCAxMTo0NToyMCBoYWwgRXhwICQKLQotIyB1c2FnZTogYmVhbXZlciA8YmVhbV9maWxlPgotIwotIyBpZiB0aGVyZSdzIGEgdXNhYmxlIC12c24oKSBhdHRyaWJ1dGUsIHByaW50IGl0IGFuZCBleGl0IHdpdGggc3RhdHVzIDAKLSMgb3RoZXJ3aXNlLCBwcmludCBub3RoaW5nIGFuZCBleGl0IHdpdGggc3RhdHVzIDEKLQotIyBGcm9tIHRoZSBFcmxhbmcgc2hlbGw6Ci0jCi0jIDU+IGNvZGU6d2hpY2goYWNjYV9pbmV0cykuCi0jICIvaG9tZS9tYXJ0aW4vd29yay9vdHAvcmVsZWFzZXMvPGFwcD4vLi4vLi4vYWNjYS9lYmluLzxhcHA+LmJlYW0iCi0jCi0jIDg+IGJlYW1fbGliOnZlcnNpb24oY29kZTp3aGljaCg8YXBwPikpLgotIyB7b2ssezxhcHA+LFsnJElkOiBiZWFtdmVyLHYgMS4xLjEuMSAyMDAzLzA2LzEzIDIxOjQzOjIxIG1sb2dhbiBFeHAgJCAnXX19Ci0KLSMgVE1QRklMRSBsb29rcyBsaWtlIHRoaXM6Ci0jCi0jIGlvOmZvcm1hdCgiaGVsbG8gfnB+biIsCi0jICAgYmVhbV9saWI6dmVyc2lvbigiL2hvbWUvaGFsL3dvcmsvb3RwL2FjY2EvZWJpbi9hY2NhX2luZXRzLmJlYW0iKV0pLgotCi1UTVBGSUxFPS90bXAvYmVhbXZlci4kJAotCi0jIGV4aXQgd2l0aCBmYWlsdXJlIGlmIHdlIGNhbid0IHJlYWQgdGhlIGZpbGUKLXRlc3QgLWYgIiQxIiB8fCBleGl0IDEKLUJFQU1GSUxFPVwiJDFcIgotCi1jYXQgPiAkVE1QRklMRSA8PF9FT0YKLWlvOmZvcm1hdCgifnB+biIsCi0gIFtiZWFtX2xpYjp2ZXJzaW9uKCRCRUFNRklMRSldKS4KLV9FT0YKLQotIyBiZWFtX3Jlc3VsdCBpcyB7b2sse01vZHVsZV9uYW1lLCBCZWFtX3ZlcnNpb259IG9yIHtlcnJvcixiZWFtX2xpYix7UmVhc29ufX0KLWJlYW1fcmVzdWx0PWBlcmwgLW5vc2hlbGwgXAotICAtcyBmaWxlIGV2YWwgJFRNUEZJTEUgXAotICAtcyBlcmxhbmcgaGFsdGAKLQotcm0gLWYgJFRNUEZJTEUKLQotIyBzZWQgcmVnZXhlczoKLSMgICByZW1vdmUgYnJhY2tldHMgYW5kIGFueXRoaW5nIG91dHNpZGUgdGhlbQotIyAgIHJlbW92ZSBxdW90ZXMgYW5kIGFueXRoaW5nIG91dHNpZGUgdGhlbQotIyAgIHJlbW92ZSBhcG9zdHJvcGhlcyBhbmQgYW55dGhpbmcgb3V0c2lkZSB0aGVtCi0jICAgcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcwotCi1jYXNlICRiZWFtX3Jlc3VsdCBpbgotXHtvayopCi0gIGVjaG8gJGJlYW1fcmVzdWx0IHwgc2VkIC1lICdzLy4qXFtcKC4qXCldLiovXDEvJyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAtZSAncy8uKlwiXCguKlwpXCIuKi9cMS8nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLWUgInMvLipcJ1woLipcKVwnLiovXDEvIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC1lICdzLyAqJC8vJyAtZSAncy9eICovLycKLSAgZXhpdCAwCi0gIDs7Ci0qKQotICBleGl0IDEKLSAgOzsKLWVzYWMKLQpkaWZmIC0tZ2l0IGEvbGliL2VybC9idWlsZC9idWlsZHRhcmdldHMubWsgYi9saWIvZXJsL2J1aWxkL2J1aWxkdGFyZ2V0cy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1MmI3OC4uMDAwMDAwMAotLS0gYS9saWIvZXJsL2J1aWxkL2J1aWxkdGFyZ2V0cy5taworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUVCSU4gPz0gLi4vZWJpbgotRVNSQyA/PSAuCi1FTVVMQVRPUiA9IGJlYW0KLQotRVJMQ19XRkxBR1MgPSAtVwotRVJMQyA9IGVybGMgJChFUkxDX1dGTEFHUykgJChFUkxDX0ZMQUdTKQotRVJMID0gZXJsIC1ib290IHN0YXJ0X2NsZWFuCi0KLSQoRUJJTikvJS5iZWFtOiAkKEVTUkMpLyUuZXJsCi0JQGVjaG8gIiAgIEVSTEMgICQ8IgotCUAkKEVSTEMpICQoRVJMX0ZMQUdTKSAkKEVSTF9DT01QSUxFX0ZMQUdTKSAtbyQoRUJJTikgJDwKLQotLmVybC5iZWFtOgotCSQoRVJMQykgJChFUkxfRkxBR1MpICQoRVJMX0NPTVBJTEVfRkxBR1MpIC1vJChkaXIgJEApICQ8Ci0KZGlmZiAtLWdpdCBhL2xpYi9lcmwvYnVpbGQvY29sb3JzLm1rIGIvbGliL2VybC9idWlsZC9jb2xvcnMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNjljNDEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9idWlsZC9jb2xvcnMubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIENvbG9ycyB0byBhc3Npc3QgdmlzdWFsIGluc3BlY3Rpb24gb2YgbWFrZSBvdXRwdXQuCi0KLSMgQ29sb3JzCi1MR1JBWT0kJCdcZVswOzM3bScKLURHUkFZPSQkJ1xlWzE7MzBtJwotTEdSRUVOPSQkJ1xlWzE7MzJtJwotTEJMVUU9JCQnXGVbMTszNG0nCi1MQ1lBTj0kJCdcZVsxOzM2bScKLUxQVVJQTEU9JCQnXGVbMTszNW0nCi1MUkVEPSQkJ1xlWzE7MzFtJwotTk9fQ09MT1I9JCQnXGVbMG0nCi1ERUZBVUxUPSQkJ1xlWzBtJwotQkxBQ0s9JCQnXGVbMDszMG0nCi1CTFVFPSQkJ1xlWzA7MzRtJwotR1JFRU49JCQnXGVbMDszMm0nCi1DWUFOPSQkJ1xlWzA7MzZtJwotUkVEPSQkJ1xlWzA7MzFtJwotUFVSUExFPSQkJ1xlWzA7MzVtJwotQlJPV049JCQnXGVbMDszM20nCi1ZRUxMT1c9JCQnXGVbMTszM20nCi1XSElURT0kJCdcZVsxOzM3bScKLQotQk9MRD0kJCdcZVsxOzM3bScKLU9GRj0kJCdcZVswbScKZGlmZiAtLWdpdCBhL2xpYi9lcmwvYnVpbGQvZG9jcy5tayBiL2xpYi9lcmwvYnVpbGQvZG9jcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiNzM3Ny4uMDAwMDAwMAotLS0gYS9saWIvZXJsL2J1aWxkL2RvY3MubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1FRE9DX1BBVEg9Li4vLi4vLi4vdG9vbHMvdXRpbGl0aWVzCi0KLSNzaW5nbGUgcGxhY2UgdG8gaW5jbHVkZSBkb2NzIGZyb20uCi1kb2NzOgotCUBta2RpciAtcCAuLi9kb2MKLQlAZWNobyAtbiAkJHtNWV9CTFVFOi0kKEJMVUUpfTsgXAotCSQoRURPQ19QQVRIKS9lZG9jICQoQVBQX05BTUUpOyBcCi0JaWYgWyAkJD8gLWVxIDAgXTsgdGhlbiBcCi0JCWVjaG8gJCR7TVlfTFJFRDotJChMUkVEKX0iJCRkIERvYyBGYWlsZWQiOyBcCi0JZmk7IFwKLQllY2hvIC1uICQoT0ZGKSQoTk9fQ09MT1IpCQotCmRpZmYgLS1naXQgYS9saWIvZXJsL2J1aWxkL21pbWUudHlwZXMgYi9saWIvZXJsL2J1aWxkL21pbWUudHlwZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTNjMGQuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9idWlsZC9taW1lLnR5cGVzCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotCi1hcHBsaWNhdGlvbi9hY3RpdmVtZXNzYWdlCi1hcHBsaWNhdGlvbi9hbmRyZXctaW5zZXQKLWFwcGxpY2F0aW9uL2FwcGxlZmlsZQotYXBwbGljYXRpb24vYXRvbWljbWFpbAotYXBwbGljYXRpb24vZGNhLXJmdAotYXBwbGljYXRpb24vZGVjLWR4Ci1hcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAJaHF4Ci1hcHBsaWNhdGlvbi9tYWMtY29tcGFjdHBybwljcHQKLWFwcGxpY2F0aW9uL21hY3dyaXRlaWkKLWFwcGxpY2F0aW9uL21zd29yZAkJZG9jCi1hcHBsaWNhdGlvbi9uZXdzLW1lc3NhZ2UtaWQKLWFwcGxpY2F0aW9uL25ld3MtdHJhbnNtaXNzaW9uCi1hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0JYmluIGRtcyBsaGEgbHpoIGV4ZSBjbGFzcwotYXBwbGljYXRpb24vb2RhCQkJb2RhCi1hcHBsaWNhdGlvbi9wZGYJCQlwZGYKLWFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQJCWFpIGVwcyBwcwotYXBwbGljYXRpb24vcG93ZXJwb2ludAkJcHB0Ci1hcHBsaWNhdGlvbi9yZW1vdGUtcHJpbnRpbmcKLWFwcGxpY2F0aW9uL3J0ZgkJCXJ0ZgotYXBwbGljYXRpb24vc2xhdGUKLWFwcGxpY2F0aW9uL3dpdGEKLWFwcGxpY2F0aW9uL3dvcmRwZXJmZWN0NS4xCi1hcHBsaWNhdGlvbi94LWJjcGlvCQliY3BpbwotYXBwbGljYXRpb24veC1jZGxpbmsJCXZjZAotYXBwbGljYXRpb24veC1jb21wcmVzcwkJWgotYXBwbGljYXRpb24veC1jcGlvCQljcGlvCi1hcHBsaWNhdGlvbi94LWNzaAkJY3NoCi1hcHBsaWNhdGlvbi94LWRpcmVjdG9yCQlkY3IgZGlyIGR4cgotYXBwbGljYXRpb24veC1kdmkJCWR2aQotYXBwbGljYXRpb24veC1ndGFyCQlndGFyCi1hcHBsaWNhdGlvbi94LWd6aXAJCWd6Ci1hcHBsaWNhdGlvbi94LWhkZgkJaGRmCi1hcHBsaWNhdGlvbi94LWh0dHBkLWNnaQkJY2dpCi1hcHBsaWNhdGlvbi94LWtvYW4JCXNrcCBza2Qgc2t0IHNrbQotYXBwbGljYXRpb24veC1sYXRleAkJbGF0ZXgKLWFwcGxpY2F0aW9uL3gtbWlmCQltaWYKLWFwcGxpY2F0aW9uL3gtbmV0Y2RmCQluYyBjZGYKLWFwcGxpY2F0aW9uL3gtc2gJCXNoCi1hcHBsaWNhdGlvbi94LXNoYXIJCXNoYXIKLWFwcGxpY2F0aW9uL3gtc3R1ZmZpdAkJc2l0Ci1hcHBsaWNhdGlvbi94LXN2NGNwaW8JCXN2NGNwaW8KLWFwcGxpY2F0aW9uL3gtc3Y0Y3JjCQlzdjRjcmMKLWFwcGxpY2F0aW9uL3gtdGFyCQl0YXIKLWFwcGxpY2F0aW9uL3gtdGNsCQl0Y2wKLWFwcGxpY2F0aW9uL3gtdGV4CQl0ZXgKLWFwcGxpY2F0aW9uL3gtdGV4aW5mbwkJdGV4aW5mbyB0ZXhpCi1hcHBsaWNhdGlvbi94LXRyb2ZmCQl0IHRyIHJvZmYKLWFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuCQltYW4KLWFwcGxpY2F0aW9uL3gtdHJvZmYtbWUJCW1lCi1hcHBsaWNhdGlvbi94LXRyb2ZmLW1zCQltcwotYXBwbGljYXRpb24veC11c3RhcgkJdXN0YXIKLWFwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2UJc3JjCi1hcHBsaWNhdGlvbi96aXAJCQl6aXAKLWF1ZGlvL2Jhc2ljCQkJYXUgc25kCi1hdWRpby9tcGVnCQkJbXBnYSBtcDIKLWF1ZGlvL3gtYWlmZgkJCWFpZiBhaWZmIGFpZmMKLWF1ZGlvL3gtcG4tcmVhbGF1ZGlvCQlyYW0KLWF1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbglycG0KLWF1ZGlvL3gtcmVhbGF1ZGlvCQlyYQotYXVkaW8veC13YXYJCQl3YXYKLWNoZW1pY2FsL3gtcGRiCQkJcGRiIHh5egotaW1hZ2UvZ2lmCQkJZ2lmCi1pbWFnZS9pZWYJCQlpZWYKLWltYWdlL2pwZWcJCQlqcGVnIGpwZyBqcGUKLWltYWdlL3BuZwkJCXBuZwotaW1hZ2UvdGlmZgkJCXRpZmYgdGlmCi1pbWFnZS94LWNtdS1yYXN0ZXIJCXJhcwotaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAJCXBubQotaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAJCXBibQotaW1hZ2UveC1wb3J0YWJsZS1ncmF5bWFwCXBnbQotaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAJCXBwbQotaW1hZ2UveC1yZ2IJCQlyZ2IKLWltYWdlL3gteGJpdG1hcAkJCXhibQotaW1hZ2UveC14cGl4bWFwCQkJeHBtCi1pbWFnZS94LXh3aW5kb3dkdW1wCQl4d2QKLW1lc3NhZ2UvZXh0ZXJuYWwtYm9keQotbWVzc2FnZS9uZXdzCi1tZXNzYWdlL3BhcnRpYWwKLW1lc3NhZ2UvcmZjODIyCi1tdWx0aXBhcnQvYWx0ZXJuYXRpdmUKLW11bHRpcGFydC9hcHBsZWRvdWJsZQotbXVsdGlwYXJ0L2RpZ2VzdAotbXVsdGlwYXJ0L21peGVkCi1tdWx0aXBhcnQvcGFyYWxsZWwKLXRleHQvaHRtbAkJCWh0bWwgaHRtCi10ZXh0L3gtc2VydmVyLXBhcnNlZC1odG1sCXNodG1sCi10ZXh0L3BsYWluCQkJdHh0Ci10ZXh0L3JpY2h0ZXh0CQkJcnR4Ci10ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzCXRzdgotdGV4dC94LXNldGV4dAkJCWV0eAotdGV4dC94LXNnbWwJCQlzZ21sIHNnbQotdmlkZW8vbXBlZwkJCW1wZWcgbXBnIG1wZQotdmlkZW8vcXVpY2t0aW1lCQkJcXQgbW92Ci12aWRlby94LW1zdmlkZW8JCQlhdmkKLXZpZGVvL3gtc2dpLW1vdmllCQltb3ZpZQoteC1jb25mZXJlbmNlL3gtY29vbHRhbGsJCWljZQoteC13b3JsZC94LXZybWwJCQl3cmwgdnJtbApkaWZmIC0tZ2l0IGEvbGliL2VybC9idWlsZC9vdHAubWsgYi9saWIvZXJsL2J1aWxkL290cC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxNmUyYy4uMDAwMDAwMAotLS0gYS9saWIvZXJsL2J1aWxkL290cC5taworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0jICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotIyAkSWQ6IG90cC5tayx2IDEuNCAyMDA0LzA3LzAxIDE0OjU3OjEwIHRmZWUgRXhwICQKLSMgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLSMgb3RwLm1rCi0jIC0gdG8gYmUgaW5jbHVkZWQgaW4gYWxsIE9UUCBNYWtlZmlsZXMKLSMgaW5zdGFsbGVkIHRvIC91c3IvbG9jYWwvaW5jbHVkZS9lcmxhbmcvb3RwLm1rCi0KLSMgZ21ha2UgbG9va3MgaW4gL3Vzci9sb2NhbC9pbmNsdWRlIC0gdGhhdCdzIGhhcmQtY29kZWQKLSMgdXNlcnMgb2YgdGhpcyBmaWxlIHdpbGwgdXNlCi0jIGluY2x1ZGUgZXJsYW5nL3RvcC5tawotCi0jIG1vc3QgaW50ZXJmYWNlIGZpbGVzIHdpbGwgYmUgaW5zdGFsbGVkIHRvICRFUkxfUlVOX1RPUC9hcHAtdnNuL2luY2x1ZGUvKi5ocmwKLQotIyBncm91cCBvd25lciBmb3IgbGlicmFyeS9pbmNsdWRlIGRpcmVjdG9yaWVzCi1FUkxBTkdERVZfR1JPVVA9ZXJsYW5nZGV2Ci0KLSMgRVJMX1RPUCBpcyByb290IG9mIEVybGFuZyBzb3VyY2UgdHJlZQotIyBFUkxfUlVOX1RPUCBpcyByb290IG9mIEVybGFuZyB0YXJnZXQgdHJlZSAoc29tZSBFcmljc3NvbiBNYWtlZmlsZXMgdXNlICRST09UKQotIyBFUkxBTkdfT1RQIGlzIHRhcmdldCByb290IGZvciBFcmxhbmcgY29kZQotIyAtIHNlZSBzYXNsL3N5c3Rvb2xzIHJlZmVyZW5jZSBtYW51YWwgcGFnZTsgZ3JlcCAiVEVTVCIKLQotIyBPU19UWVBFIGlzIEZyZWVCU0QsIE5ldEJTRCwgT3BlbkJTRCwgTGludXgsIFNDT19TViwgU3VuT1MuCi1PU19UWVBFPSR7c2hlbGwgdW5hbWV9Ci0KLSMgTUhPU1QgaXMgdGhlIGhvc3Qgd2hlcmUgdGhpcyBNYWtlZmlsZSBydW5zLgotTUhPU1Q9JHtzaGVsbCBob3N0bmFtZSAtc30KLUVSTF9DT01QSUxFX0ZMQUdTKz0tVzAKLQotIyBUaGUgbG9jYXRpb24gb2YgdGhlIGVybGFuZyBydW50aW1lIHN5c3RlbS4KLWlmbmRlZiBFUkxfUlVOX1RPUAotRVJMX1JVTl9UT1A9L3Vzci9sb2NhbC9saWIvZXJsYW5nCi1lbmRpZgotCi0KLSMgRWRpdCB0byByZWZsZWN0IGxvY2FsIGVudmlyb25tZW50LgotIyBpZmVxICgke09TX1RZUEV9LExpbnV4KQotIyBFUkxfUlVOX1RPUD0vdXNyL2xvY2FsL2xpYi9lcmxhbmcKLSMgIE5vdGUqIEVSTF9SVU5fVE9QIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHN0YXJ0aW5nIGFuCi0jICAgICAgICBlcmxhbmcgc2hlbGwgYW5kIHR5cGluZyBjb2RlOnJvb3RfZGlyKCkuCi0jIEVSTF9UT1A9YSBzeW1ib2xpYyBsaW5rIHRvIHRoZSBhY3R1YWwgc291cmNlIHRvcCwgd2hpY2ggY2hhbmdlcyBmcm9tIHZlcnNpb24gdG8gdmVyc2lvbgotIyAgTm90ZSogRVJMX1RPUCBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBlcmxhbmcKLSMgICAgICAgIHNvdXJjZSBmaWxlcyByZXNpZGUuIE1ha2Ugc3VyZSB0byBydW4gLi9jb25maWd1cmUgdGhlcmUuCi0jIFRBUkdFVD1pNjg2LXBjLWxpbnV4LWdudQotIyAgTm90ZSogVGFyZ2V0IGNhbiBiZSBmb3VuZCBpbiAkRVJMX1RPUC9lcnRzCi0jIGVuZGlmCi0KLSMgU2VlIGFib3ZlIGZvciBkaXJlY3Rpb25zLgotaWZlcSAoJHtPU19UWVBFfSxMaW51eCkKLUVSTF9UT1A9L29wdC9PVFBfU1JDCi1UQVJHRVQ9aTY4Ni1wYy1saW51eC1nbnUKLWVuZGlmCi0KLUVSTEFOR19PVFA9L3Vzci9sb2NhbC9lcmxhbmcvb3RwCi1WQVJfT1RQPS92YXIvb3RwCi0KLQotIyBBbGlhc2VzIGZvciBjb21tb24gYmluYXJpZXMKLSMgTm90ZSAtIENGTEFHUyBpcyBtb2RpZmllZCBpbiBlcmxhbmcuY29uZgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFN1bk9TCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaWZlcSAoJHtPU19UWVBFfSxTdW5PUykKLQotICAgIENDPWdjYwotICAgIENYWD1nKysKLSAgICBBUj0vdXNyL2Njcy9iaW4vYXIKLSAgICBBUkZMQUdTPS1ydgotICAgIENYWEZMQUdTKz0ke0NGTEFHU30gLUkvdXNyL2luY2x1ZGUvZysrCi0gICAgTEQ9L3Vzci9jY3MvYmluL2xkCi0gICAgUkFOTElCPS91c3IvY2NzL2Jpbi9yYW5saWIKLQotQ0ZMQUdTKz0tV2FsbCAtcGVkYW50aWMgLWFuc2kgLU8KLUNPUkU9Ki5jb3JlCi1lbmRpZgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEZyZWVCU0QKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZmVxICgke09TX1RZUEV9LEZyZWVCU0QpCi0KLSAgaWZkZWYgTElOVVhCSU4KLSAgICBDT01QQVRfTElOVVg9L2NvbXBhdC9saW51eAotICAgIENDPSR7Q09NUEFUX0xJTlVYfS91c3IvYmluL2djYwotICAgIENYWD0ke0NPTVBBVF9MSU5VWH0vdXNyL2Jpbi9nKysKLSAgICBBUj0ke0NPTVBBVF9MSU5VWH0vdXNyL2Jpbi9hcgotICAgIEFSRkxBR1M9LXJ2Ci0gICAgQ1hYRkxBR1MrPS1maGFuZGxlLWV4Y2VwdGlvbnMgJHtDRkxBR1N9IC1JJHtDT01QQVRfTElOVVh9L3Vzci9pbmNsdWRlL2crKwotICAgIExEPSR7Q09NUEFUX0xJTlVYfS91c3IvYmluL2xkCi0gICAgUkFOTElCPSR7Q09NUEFUX0xJTlVYfS91c3IvYmluL3JhbmxpYgotCUJSQU5ERUxGPWJyYW5kZWxmIC10IExpbnV4Ci0gIGVsc2UKLSAgICBDQz1nY2MKLSAgICBDWFg9ZysrCi0gICAgQVI9L3Vzci9iaW4vYXIKLSAgICBBUkZMQUdTPS1ydgotICAgIENYWEZMQUdTKz0tZmhhbmRsZS1leGNlcHRpb25zICR7Q0ZMQUdTfSAtSS91c3IvaW5jbHVkZS9nKysKLSAgICBMRD0vdXNyL2Jpbi9sZAotICAgIFJBTkxJQj0vdXNyL2Jpbi9yYW5saWIKLQlCUkFOREVMRj1AdHJ1ZQotCi0gICAgaWZkZWYgVVNFU19QVEhSRUFEUwotICAgICAgQ0ZMQUdTKz0tRF9USFJFQURfU0FGRQotICAgICAgTERGTEFHUys9LWxjX3IKLQotCSAgIyAtcHRocmVhZCBmbGFnIGZvciAzLjArCi0JICBpZm5lcSAoJHtzaGVsbCB1bmFtZSAtciB8IGN1dCAtZC4gLWYxfSwyKQotCQlDRkxBR1MrPS1wdGhyZWFkCi0JICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCi0KLUNGTEFHUys9LVdhbGwgLXBlZGFudGljIC1hbnNpIC1PIC1ERlJFRUJTRAotQ09SRT0qLmNvcmUKLWVuZGlmCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE9wZW5CU0QKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZmVxICgke09TX1RZUEV9LE9wZW5CU0QpCi0KLSAgICBDQz1nY2MKLSAgICBDWFg9ZysrCi0gICAgQVI9L3Vzci9iaW4vYXIKLSAgICBBUkZMQUdTPS1ydgotICAgIENYWEZMQUdTKz0ke0NGTEFHU30gLUkvdXNyL2luY2x1ZGUvZysrCi0gICAgTEQ9L3Vzci9iaW4vbGQKLSAgICBSQU5MSUI9L3Vzci9iaW4vcmFubGliCi0KLSAgICBpZmRlZiBVU0VTX1BUSFJFQURTCi0gICAgICBDRkxBR1MrPS1EX1RIUkVBRF9TQUZFCi0gICAgICBMREZMQUdTKz0tbGNfcgotCi0JICAjIC1wdGhyZWFkIGZsYWcgZm9yIDMuMCsKLQkgIGlmbmVxICgke3NoZWxsIHVuYW1lIC1yIHwgY3V0IC1kLiAtZjF9LDIpCi0JCUNGTEFHUys9LXB0aHJlYWQKLQkgIGVuZGlmCi0gICAgZW5kaWYKLQotQ0ZMQUdTKz0tV2FsbCAtcGVkYW50aWMgLWFuc2kgLU8gLURPUEVOQlNECi1DT1JFPSouY29yZQotZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGliL2VybC9idWlsZC9vdHBfc3ViZGlyLm1rIGIvbGliL2VybC9idWlsZC9vdHBfc3ViZGlyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM2YzY1Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvYnVpbGQvb3RwX3N1YmRpci5taworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLSMgQ29tbWVudCBieSB0ZmVlIDIwMDQtMDctMDEKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVGhpcyBmaWxlIGlzIGEgbW9kIG9mIHRoZSBzdG9jayBPVFAgb25lLgotIyBUaGUgY2hhbmdlIGFsbG93cyBtYWtlIHRvIHN0b3Agd2hlbiBhIGNvbXBpbGUgZXJyb3Igb2NjdXJzLgotIyBUaGlzIGZpbGUgbmVlZHMgdG8gZ28gaW50byB0d28gcGxhY2VzOgotIyAgICAgL3Vzci9sb2NhbC9pbmNsdWRlL2VybGFuZwotIyAgICAgL29wdC9PVFBfU1JDL21ha2UKLSMKLSMgd2hlcmUgT1RQX1NSQyBpcyBhIHN5bWJvbGljIGxpbmsgdG8gYSBwZWVyIGRpcmVjdG9yeSBjb250YWluaW5nCi0jIHRoZSBvdHAgc291cmNlLCBlLmcuIG90cF9zcmNfUjlDLTIuCi0jCi0jIEFmdGVyIGluc3RhbGxpbmcgT1RQLCBydW5uaW5nIHN1ZG8gbWFrZSBpbnN0YWxsIGluIG90cC9idWlsZAotIyB3aWxsIHB1c2ggdGhpcyBmaWxlIG91dCB0byB0aGUgdHdvIHBsYWNlcyBsaXN0ZWQgYWJvdmUuCi0jCi0jIFRoZSBtb2QgaW52b2x2ZXMgc2V0dGluZyB0aGUgc2hlbGwgdmFyaWFibGUgJHNob3J0X2NpcmN1aXQsIHdoaWNoIHdlCi0jIGludHJvZHVjZSAtIGllIGl0IGlzIG5vdCBpbiB0aGUgc3RvY2sgZmlsZS4gVGhpcyB2YXJpYWJsZSBpcyB0ZXN0ZWQKLSMgdG8gYWZmZWN0IGV4ZWN1dGlvbiBmbG93IGFuZCBpcyBhbHNvIHJldHVybmVkIHRvIGFmZmVjdCB0aGUgZmxvdyBpbgotIyB0aGUgY2FsbGluZyBzY3JpcHQgKHRoaXMgb25lKS4gVGhlIGxhdHRlciBzdGVwIGlzIG5lY2Vzc2FyeSBiZWNhdXNlCi0jIG9mIHRoZSByZWN1cnNpb24gaW52b2x2ZWQuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLSMgYGBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBFcmxhbmcgUHVibGljIExpY2Vuc2UsCi0jIFZlcnNpb24gMS4xLCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi0jIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUKLSMgRXJsYW5nIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBzb2Z0d2FyZS4gSWYgbm90LCBpdCBjYW4gYmUKLSMgcmV0cmlldmVkIHZpYSB0aGUgd29ybGQgd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5lcmxhbmcub3JnLy4KLSMKLSMgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgotIyBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlCi0jIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBFcmljc3NvbiBVdHZlY2tsaW5ncyBBQi4KLSMgUG9ydGlvbnMgY3JlYXRlZCBieSBFcmljc3NvbiBhcmUgQ29weXJpZ2h0IDE5OTksIEVyaWNzc29uIFV0dmVja2xpbmdzCi0jIEFCLiBBbGwgUmlnaHRzIFJlc2VydmVkLicnCi0jCi0jICAgICAkSWQ6IG90cF9zdWJkaXIubWssdiAxLjUgMjAwNC8wNy8xMiAxNToxMjoyMyBqZWluaG9ybiBFeHAgJAotIwotIwotIyBNYWtlIGluY2x1ZGUgZmlsZSBmb3Igb3RwCi0KLS5QSE9OWTogZGVidWcgb3B0IHJlbGVhc2UgZG9jcyByZWxlYXNlX2RvY3MgdGVzdHMgcmVsZWFzZV90ZXN0cyBcCi0JY2xlYW4gZGVwZW5kCi0KLSMKLSMgVGFyZ2V0cyB0aGF0IGRvbid0IGFmZmVjdCBkb2N1bWVudGF0aW9uIGRpcmVjdG9yaWVzCi0jCi1kZWJ1ZyBvcHQgcmVsZWFzZSBkb2NzIHJlbGVhc2VfZG9jcyB0ZXN0cyByZWxlYXNlX3Rlc3RzIGNsZWFuIGRlcGVuZDogcHJlcGFyZQotCUBzZXQgLWUgOwkJCQkJCQlcCi0JYXBwX3B3ZD1gcHdkYCA7CQkJCQkJCVwKLQlpZiB0ZXN0IC1mIHZzbi5tazsgdGhlbgkJCQkJCVwKLQkgICAgZWNobyAiPT09IEVudGVyaW5nIGFwcGxpY2F0aW9uIiBgYmFzZW5hbWUgJCRhcHBfcHdkYCA7CVwKLQlmaSA7CQkJCQkJCQlcCi0JY2FzZSAiJChNQUtFKSIgaW4gKmNsZWFybWFrZSopIHRmbGFnPSItVCI7OyAqKSB0ZmxhZz0iIjs7IGVzYWM7CVwKLQlzaG9ydF9jaXJjdWl0PTAgOwkJCQkJCVwKLQlmb3IgZCBpbiAkKFNVQl9ESVJFQ1RPUklFUyk7IGRvCQkJCQlcCi0JICAgIGlmIFtbICQkc2hvcnRfY2lyY3VpdCA9IDAgXV07IHRoZW4JCQkJXAotCQlpZiB0ZXN0IC1mICQkZC9TS0lQIDsgdGhlbgkJCQlcCi0JCSAgICBlY2hvICI9PT0gU2tpcHBpbmcgc3ViZGlyICQkZCwgcmVhc29uOiIgOwkJXAotCQkgICAgY2F0ICQkZC9TS0lQIDsJCQkJCVwKLQkJICAgIGVjaG8gIj09PSIgOwkJCQkJXAotCQllbHNlCQkJCQkJCVwKLQkJICAgIGlmIHRlc3QgISAtZCAkJGQgOyB0aGVuCQkJCVwKLQkJCWVjaG8gIj09PSBTa2lwcGluZyBzdWJkaXIgJCRkLCBpdCBpcyBtaXNzaW5nIiA7CVwKLQkJICAgIGVsc2UJCQkJCQlcCi0JCQl4ZmxhZz0iIiA7CQkJCQlcCi0JCQlpZiB0ZXN0IC1mICQkZC9pZ25vcmVfY29uZmlnX3JlY29yZC5pbmY7IHRoZW4JXAotCQkJICAgIHhmbGFnPSQkdGZsYWcgOwkJCQlcCi0JCQlmaSA7CQkJCQkJXAotCQkJKGNkICQkZCAmJiAkKE1BS0UpICQkeGZsYWcgJEApIDsJCVwKLQkJCWlmIFtbICQkPyAhPSAwIF1dOyB0aGVuCQkJCVwKLQkJCSAgICBzaG9ydF9jaXJjdWl0PTEgOwkJCQlcCi0JCQlmaSA7CQkJCQkJXAotCQkgICAgZmkgOwkJCQkJCVwKLQkJZmkgOwkJCQkJCQlcCi0JICAgIGZpIDsJCQkJCQkJXAotCWRvbmUgOwkJCQkJCQkJXAotCWlmIHRlc3QgLWYgdnNuLm1rOyB0aGVuCQkJCQkJXAotCSAgICBlY2hvICI9PT0gTGVhdmluZyBhcHBsaWNhdGlvbiIgYGJhc2VuYW1lICQkYXBwX3B3ZGAgOwlcCi0JZmkgOwkJCQkJCQkJXAotCWV4aXQgJCRzaG9ydF9jaXJjdWl0Ci0KLXByZXBhcmU6Ci0JZWNobwpkaWZmIC0tZ2l0IGEvbGliL2VybC9idWlsZC9yYXdfdGVzdC5tayBiL2xpYi9lcmwvYnVpbGQvcmF3X3Rlc3QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODUzNWQuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9idWlsZC9yYXdfdGVzdC5taworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgZm9yIHRlc3RpbmcgZXJsYW5nIGZpbGVzIGRpcmVjdGx5LiBUaGUgc2V0IHVwIGZvciBhCi0jIHRoaXMgdHlwZSBvZiB0ZXN0IHdvdWxkIGJlCi0jIGZpbGVzIHRvIHRlc3QgcmVzaWRlIGluIGxpYi88YXBwX25hbWU+L3NyYyBhbmQgdGhlIHRlc3QgZmlsZXMgd2hpY2ggYXJlCi0jIGp1c3QgcGxhaW4gZXJsYW5nIGNvZGUgcmVzaWRlIGluIGxpYi88YXBwX25hbWU+L3Rlc3QKLSMKLSMgVGhpcyBjb2xvciBjb2RlcyBlbWl0dGVkIHdoaWxlIHRoZSB0ZXN0cyBydW4gYXNzdW1lIHRoYXQgeW91IGFyZSB1c2luZwotIyBhIHdoaXRlLW9uLWJsYWNrIGRpc3BsYXkgc2NoZW1hLiBJZiBub3QsIGUuZy4gaWYgeW91IHVzZSBhIHdoaXRlCi0jIGJhY2tncm91bmQsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlICJXSElURSIgdGV4dC4KLSMgWW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5IHN1cHBseWluZyB5b3VyIG93biAid2hpdGUiIGNvbG9yLAotIyB3aGljaCBtYXkgaW4gZmFjdCBiZSBibGFjayEgWW91IGRvIHRoaXMgYnkgZGVmaW5pbmcgYW4gZW52aXJvbm1lbnQKLSMgdmFyaWFibGUgbmFtZWQgIk1ZX1dISVRFIiBhbmQgc2V0dGluZyBpdCB0byAkJ1xlWzA7MzBtJyAod2hpY2ggaXMKLSMgc2ltcGx5IGJhc2gncyB3YXkgb2Ygc3BlY2lmeWluZyAiRXNjYXBlIFsgMCA7IDMgMCBtIikuCi0jIFNpbWlsYXJseSwgeW91IGNhbiBzZXQgeW91ciB2ZXJzaW9ucyBvZiB0aGUgc3RhbmRhcmQgY29sb3JzCi0jIGZvdW5kIGluIGNvbG9ycy5tay4KLQotdGVzdDoKLQlAVEVTVF9NT0RVTEVTPWBscyAqX3Rlc3QuZXJsYDsgXAotCXRyYXAgImVjaG8gJChPRkYpJChOT19DT0xPUik7IGV4aXQgMTsiIDEgMiAzIDY7IFwKLQlmb3IgZCBpbiAkJFRFU1RfTU9EVUxFUzsgZG8gXAotCQllY2hvICQke01ZX0dSRUVOOi0kKEdSRUVOKX0iVGVzdGluZyBGaWxlICQkZCIgJCR7TVlfV0hJVEU6LSQoV0hJVEUpfTsgXAotCQllY2hvIC1uICQke01ZX0JMVUU6LSQoQkxVRSl9OyBcCi0JCWVybCAtbmFtZSAkKEFQUF9OQU1FKSAkKFRFU1RfTElCUykgXAotCQktcyBgYmFzZW5hbWUgJCRkIC5lcmxgIGFsbCAtcyBpbml0IHN0b3AgLW5vc2hlbGw7IFwKLQkJaWYgWyAkJD8gLW5lIDAgXTsgdGhlbiBcCi0JCQllY2hvICQke01ZX0xSRUQ6LSQoTFJFRCl9IiQkZCBUZXN0IEZhaWxlZCI7IFwKLQkJZmk7IFwKLQkJZWNobyAtbiAkKE9GRikkKE5PX0NPTE9SKTsgXAotCWRvbmUKLQpkaWZmIC0tZ2l0IGEvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzdkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSwzIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKworUGFydGljdWxhcmx5IGZvciBFcmxhbmcgcGxlYXNlIGZvbGxvdyB0aGUgRXJsYW5nIFtQcm9ncmFtbWluZyBSdWxlcyBhbmQgQ29udmVudGlvbnNdKGh0dHA6Ly93d3cuZXJsYW5nLnNlL2RvYy9wcm9ncmFtbWluZ19ydWxlcy5zaHRtbCkuIApkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsCmluZGV4IDM2ZWI0OWIuLjdjYjI5ZWIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2NvbnN0YW50cy5ocmwKQEAgLTIyLDYgKzIyLDcgQEAKIC1kZWZpbmUodFR5cGVfVk9JRCwgMSkuCiAtZGVmaW5lKHRUeXBlX0JPT0wsIDIpLgogLWRlZmluZSh0VHlwZV9CWVRFLCAzKS4KKy1kZWZpbmUodFR5cGVfSTgsIDMpLgogLWRlZmluZSh0VHlwZV9ET1VCTEUsIDQpLgogLWRlZmluZSh0VHlwZV9JMTYsIDYpLgogLWRlZmluZSh0VHlwZV9JMzIsIDgpLgpAQCAtNTEsNCArNTIsMTEgQEAKIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1dST05HX01FVEhPRF9OQU1FLCAzKS4KIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0JBRF9TRVFVRU5DRV9JRCwgNCkuCiAtZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9NSVNTSU5HX1JFU1VMVCwgNSkuCistZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlRFUk5BTF9FUlJPUiwgNikuCistZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9QUk9UT0NPTF9FUlJPUiwgNykuCistZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1RSQU5TRk9STSwgOCkuCistZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1BST1RPQ09MLCA5KS4KKy1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFLCAxMCkuCiAKKy1kZWZpbmUgKE1VTFRJUExFWEVEX1NFUlZJQ0VfU0VQQVJBVE9SLCAiOiIpLgorLWRlZmluZSAoTVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksICJlcnJvcl9oYW5kbGVyIikuCmRpZmYgLS1naXQgYS9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsCmluZGV4IGY0ZTE5MDEuLmJjMGFjYzggMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsCisrKyBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsCkBAIC0xOCwxNCArMTgsNDkgQEAKICUlCiAKIC1pZm5kZWYoVEhSSUZUX1BST1RPQ09MX0lOQ0xVREVEKS4KLS1kZWZpbmUoVEhSSUZUX1BST1RPQ09MX0lOQ0xVREVELCB5ZWEpLgorLWRlZmluZShUSFJJRlRfUFJPVE9DT0xfSU5DTFVERUQsIHRydWUpLgogCi0tcmVjb3JkKHByb3RvY29sX21lc3NhZ2VfYmVnaW4sIHtuYW1lLCB0eXBlLCBzZXFpZH0pLgotLXJlY29yZChwcm90b2NvbF9zdHJ1Y3RfYmVnaW4sIHtuYW1lfSkuCi0tcmVjb3JkKHByb3RvY29sX2ZpZWxkX2JlZ2luLCB7bmFtZSwgdHlwZSwgaWR9KS4KLS1yZWNvcmQocHJvdG9jb2xfbWFwX2JlZ2luLCB7a3R5cGUsIHZ0eXBlLCBzaXplfSkuCi0tcmVjb3JkKHByb3RvY29sX2xpc3RfYmVnaW4sIHtldHlwZSwgc2l6ZX0pLgotLXJlY29yZChwcm90b2NvbF9zZXRfYmVnaW4sIHtldHlwZSwgc2l6ZX0pLgorLXJlY29yZChwcm90b2NvbF9tZXNzYWdlX2JlZ2luLCB7bmFtZSA6OiBzdHJpbmcoKSwgdHlwZSA6OiBpbnRlZ2VyKCksIHNlcWlkIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9zdHJ1Y3RfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpfSkuCistcmVjb3JkKHByb3RvY29sX2ZpZWxkX2JlZ2luLCB7bmFtZSA6OiBzdHJpbmcoKSwgdHlwZSA6OiBpbnRlZ2VyKCksIGlkIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9tYXBfYmVnaW4sIHtrdHlwZSA6OiBpbnRlZ2VyKCksIHZ0eXBlIDo6IGludGVnZXIoKSwgc2l6ZSA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfbGlzdF9iZWdpbiwge2V0eXBlIDo6IGludGVnZXIoKSwgc2l6ZSA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfc2V0X2JlZ2luLCB7ZXR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgorCistdHlwZSB0cHJvdF9oZWFkZXJfdmFsKCkgOjogI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57fQorICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fQorICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNwcm90b2NvbF9maWVsZF9iZWdpbnt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI3Byb3RvY29sX21hcF9iZWdpbnt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI3Byb3RvY29sX2xpc3RfYmVnaW57fQorICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNwcm90b2NvbF9zZXRfYmVnaW57fQorICAgICAgICAgICAgICAgICAgICAgICAgICAuCistdHlwZSB0cHJvdF9lbXB0eV90YWcoKSA6OiBtZXNzYWdlX2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RydWN0X2JlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJ1Y3RfZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBmaWVsZF9lbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IG1hcF9lbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IGxpc3RfZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXRfZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgLgorLXR5cGUgdHByb3RfaGVhZGVyX3RhZygpIDo6IG1lc3NhZ2VfYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmaWVsZF9iZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1hcF9iZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxpc3RfYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXRfYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLgorLXR5cGUgdHByb3RfZGF0YV90YWcoKSA6OiB1aTMyCisgICAgICAgICAgICAgICAgICAgICAgICB8IGJvb2wKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgYnl0ZQorICAgICAgICAgICAgICAgICAgICAgICAgfCBpMTYKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgaTMyCisgICAgICAgICAgICAgICAgICAgICAgICB8IGk2NAorICAgICAgICAgICAgICAgICAgICAgICAgfCBkb3VibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAuCistdHlwZSB0cHJvdF9jb250X3RhZygpIDo6IHtsaXN0LCBfVHlwZX0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwge21hcCwgX0tUeXBlLCBfVlR5cGV9CisgICAgICAgICAgICAgICAgICAgICAgICB8IHtzZXQsIF9UeXBlfQorICAgICAgICAgICAgICAgICAgICAgICAgLgogCiAKIC1lbmRpZi4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyLmhybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmUzMDBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbF9iZWhhdmlvdXIuaHJsCkBAIC0wLDAgKzEsMzcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCislJSBTaWduYXR1cmUgc3BlY2lmaWNhdGlvbnMgZm9yIHByb3RvY29sIGltcGxlbWVudGF0aW9ucy4KKworLWlmbmRlZihUSFJJRlRfUFJPVE9DT0xfQkVIQVZJT1VSX0lOQ0xVREVEKS4KKy1kZWZpbmUoVEhSSUZUX1BST1RPQ09MX0JFSEFWSU9VUl9JTkNMVURFRCwgdHJ1ZSkuCisKKy1zcGVjIGZsdXNoX3RyYW5zcG9ydChzdGF0ZSgpKSAtPiB7c3RhdGUoKSwgb2sgfCB7ZXJyb3IsIF9SZWFzb259fS4KKy1zcGVjIGNsb3NlX3RyYW5zcG9ydChzdGF0ZSgpKSAtPiB7c3RhdGUoKSwgb2sgfCB7ZXJyb3IsIF9SZWFzb259fS4KKworLXNwZWMgd3JpdGUoc3RhdGUoKSwgYW55KCkpIC0+IHtzdGF0ZSgpLCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgorCislJSBOT1RFOiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHRocmlmdF9wcm90b2NvbDpyZWFkIGFuZCByZWFkX3NwZWNpZmljLgorLXNwZWMgcmVhZAorICAgICAgICAoc3RhdGUoKSwgdHByb3RfZW1wdHlfdGFnKCkpIC0+ICB7c3RhdGUoKSwgIG9rICAgICAgICAgICAgICAgIHwge2Vycm9yLCBfUmVhc29ufX07CisgICAgICAgIChzdGF0ZSgpLCB0cHJvdF9oZWFkZXJfdGFnKCkpIC0+IHtzdGF0ZSgpLCB0cHJvdF9oZWFkZXJfdmFsKCkgfCB7ZXJyb3IsIF9SZWFzb259fTsKKyAgICAgICAgKHN0YXRlKCksIHRwcm90X2RhdGFfdGFnKCkpIC0+ICAge3N0YXRlKCksIHtvaywgYW55KCl9ICAgICAgICB8IHtlcnJvciwgX1JlYXNvbn19LgorCisKKy1lbmRpZi4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzA1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsCkBAIC0wLDAgKzEsMzEgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCislJSBTaWduYXR1cmUgc3BlY2lmaWNhdGlvbnMgZm9yIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMuCisKKy1pZm5kZWYoVEhSSUZUX1RSQU5TUE9SVF9CRUhBVklPVVJfSU5DTFVERUQpLgorLWRlZmluZShUSFJJRlRfVFJBTlNQT1JUX0JFSEFWSU9VUl9JTkNMVURFRCwgdHJ1ZSkuCisKKy1zcGVjIHdyaXRlKHN0YXRlKCksIGlvbGlzdCgpIHwgYmluYXJ5KCkpIC0+IHtzdGF0ZSgpLCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgorLXNwZWMgcmVhZChzdGF0ZSgpLCBub25fbmVnX2ludGVnZXIoKSkgLT4ge3N0YXRlKCksIHtvaywgYmluYXJ5KCl9IHwge2Vycm9yLCBfUmVhc29ufX0uCistc3BlYyBmbHVzaChzdGF0ZSgpKSAtPiB7c3RhdGUoKSwgb2sgfCB7ZXJyb3IsIF9SZWFzb259fS4KKy1zcGVjIGNsb3NlKHN0YXRlKCkpIC0+IHtzdGF0ZSgpLCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgorCisKKy1lbmRpZi4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIuY29uZmlnIGIvbGliL2VybC9yZWJhci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhMThhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvcmViYXIuY29uZmlnCkBAIC0wLDAgKzEgQEAKK3tlcmxfb3B0cywgW3twbGF0Zm9ybV9kZWZpbmUsICJeUi4qIiwgb3RwMTZfb3JfbGVzc30sIGRlYnVnX2luZm9dfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdCBiL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzMzODIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0CkBAIC0wLDAgKzEsNyBAQAorRGVmMCA9IGNhc2Ugbm90IGVybGFuZzppc19idWlsdGluKGVybGFuZywgbW9ub3RvbmljX3RpbWUsIDApIG9mCisgICAgICAgICAgIHRydWUgLT4gW107CisgICAgICAgICAgIGZhbHNlIC0+IFt7ZCwgdGltZV9jb3JyZWN0aW9ufV0KKyAgICAgICBlbmQsCitEZWZzID0gRGVmMCwKK2xpc3RzOmtleXN0b3JlKGVybF9vcHRzLCAxLCBDT05GSUcsCisgICAgICAgICAgICAgICB7ZXJsX29wdHMsIHByb3BsaXN0czpnZXRfdmFsdWUoZXJsX29wdHMsIENPTkZJRywgW10pICsrIERlZnN9KS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjJhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCkBAIC0wLDAgKzEsNSBAQAore2VybF9vcHRzLCBbe3BsYXRmb3JtX2RlZmluZSwgIl5SLioiLCBvdHAxNl9vcl9sZXNzfSwgZGVidWdfaW5mb119LgorCit7ZGVwcywgWworICB7bWVjaywgIiIsIHtnaXQsICJodHRwczovL2dpdGh1Yi5jb20vZXByb3h1cy9tZWNrLmdpdCIsIHt0YWcsICIwLjguOSJ9fX0KK119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvTWFrZWZpbGUgYi9saWIvZXJsL3NyYy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwYWY4MS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3NyYy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0jICRJZDogTWFrZWZpbGUsdiAxLjMgMjAwNC8wOC8xMyAxNjozNTo1OSBtbG9nYW4gRXhwICQKLSMKLWluY2x1ZGUgLi4vYnVpbGQvb3RwLm1rCi1pbmNsdWRlIC4uL2J1aWxkL2NvbG9ycy5tawotaW5jbHVkZSAuLi9idWlsZC9idWlsZHRhcmdldHMubWsKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEFwcGxpY2F0aW9uIHZlcnNpb24KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbmNsdWRlIC4uL3Zzbi5tawotQVBQX05BTUU9dGhyaWZ0Ci1QRlg9dGhyaWZ0Ci1WU049JChUSFJJRlRfVlNOKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSW5zdGFsbCBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbgotIyBXQVJOSU5HOiBJTlNUQUxMX0RJUiB0aGUgY29tbWFuZCB0byBpbnN0YWxsIGEgZGlyZWN0b3J5LgotIyAgICAgICAgICBJTlNUQUxMX0RTVCBpcyB0aGUgdGFyZ2V0IGRpcmVjdG9yeQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JTlNUQUxMX0RTVCA9ICQoRVJMQU5HX09UUCkvbGliLyQoQVBQX05BTUUpLSQoVlNOKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGFyZ2V0IFNwZWNzCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1NT0RVTEVTID0gJChzaGVsbCBmaW5kIC4gLW5hbWUgXCouZXJsIHwgc2VkICdzOl5cLi86OicgfCBzZWQgJ3MvXC5lcmwvLycpCi1NT0RVTEVTX1NUUklOR19MSVNUID0gJChzaGVsbCBmaW5kIC4gLW5hbWUgXCouZXJsIHwgc2VkICdzOl5cLi86IjonIHwgc2VkICdzL1wuZXJsLyIsLycpCi0KLUhSTF9GSUxFUz0KLUlOVEVSTkFMX0hSTF9GSUxFUz0gJChBUFBfTkFNRSkuaHJsCi1FUkxfRklMRVM9ICQoTU9EVUxFUzolPSUuZXJsKQotRE9DX0ZJTEVTPSQoRVJMX0ZJTEVTKQotCi1BUFBfRklMRT0gJChBUFBfTkFNRSkuYXBwCi1BUFBVUF9GSUxFPSAkKEFQUF9OQU1FKS5hcHB1cAotCi1BUFBfU1JDPSAkKEFQUF9GSUxFKS5zcmMKLUFQUFVQX1NSQz0gJChBUFBVUF9GSUxFKS5zcmMKLQotQVBQX1RBUkdFVD0gJChFQklOKS8kKEFQUF9GSUxFKQotQVBQVVBfVEFSR0VUPSAkKEVCSU4pLyQoQVBQVVBfRklMRSkKLQotQkVBTVM9ICQoTU9EVUxFUzolPSQoRUJJTikvJS4kKEVNVUxBVE9SKSkKLVRBUkdFVF9GSUxFUz0gJChCRUFNUykgJChBUFBfVEFSR0VUKSAkKEFQUFVQX1RBUkdFVCkKLQotV0VCX1RBUkdFVD0vdmFyL3lhd3Mvd3d3LyQoQVBQX05BTUUpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBGTEFHUwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVSTF9GTEFHUyArPQotRVJMX0lOQ0xVREUgPSAtSS4uL2luY2x1ZGUgLUkuLi8uLi9mc2xpYi9pbmNsdWRlIC1JLi4vLi4vc3lzdGVtX3N0YXR1cy9pbmNsdWRlCi1FUkxfQ09NUElMRV9GTEFHUyArPSAkKEVSTF9JTkNMVURFKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGFyZ2V0cwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbCBkZWJ1ZyBvcHQ6ICQoRUJJTikgJChUQVJHRVRfRklMRVMpCi0KLSMkKEVCSU4pL3JtX2xvZ2dlci5iZWFtOiAkKEFQUF9OQU1FKS5ocmwKLWluY2x1ZGUgLi4vYnVpbGQvZG9jcy5tawotCi0jIE5vdGU6IEluIHRoZSBvcGVuLXNvdXJjZSBidWlsZCBjbGVhbiBtdXN0IG5vdCBkZXN0cm95IHRoZSBwcmVsb2FkZWQKLSMgYmVhbSBmaWxlcy4KLWNsZWFuOgotCXJtIC1mICQoVEFSR0VUX0ZJTEVTKQotCXJtIC1mICp+Ci0Jcm0gLWYgY29yZQotCXJtIC1yZiAkKEVCSU4pCi0Jcm0gLXJmICpodG1sCi0KLSQoRUJJTik6Ci0JbWtkaXIgJChFQklOKQotCi1kaWFseXplcjogJChUQVJHRVRfRklMRVMpCi0JZGlhbHl6ZXIgLS1zcmMgLXIgLiAkKEVSTF9JTkNMVURFKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU3BlY2lhbCBCdWlsZCBUYXJnZXRzCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJChBUFBfVEFSR0VUKTogJChBUFBfU1JDKSAuLi92c24ubWsgJChCRUFNUykKLQlzZWQgLWUgJ3M7JVZTTiU7JChWU04pOycgXAotCQktZSAnczslUEZYJTskKFBGWCk7JyBcCi0JCS1lICdzOyVBUFBfTkFNRSU7JChBUFBfTkFNRSk7JyBcCi0JCS1lICdzOyVNT0RVTEVTJTslTU9EVUxFUyUkKE1PRFVMRVNfU1RSSU5HX0xJU1QpOycgXAotCQkkPCA+ICQ8Ii50bXAiCi0Jc2VkIC1lICdzLyVNT0RVTEVTJVwoLipcKSwvXDEvJyBcCi0JCSQ8Ii50bXAiID4gJEAKLQlybSAkPCIudG1wIgotCi0kKEFQUFVQX1RBUkdFVCk6ICQoQVBQVVBfU1JDKSAuLi92c24ubWsKLQlzZWQgLWUgJ3M7JVZTTiU7JChWU04pOycgJDwgPiAkQAotCi0kKFdFQl9UQVJHRVQpOiAuLi9tYXJrdXAvKgotCXJtIC1yZiAkKFdFQl9UQVJHRVQpCi0JbWtkaXIgJChXRUJfVEFSR0VUKQotCWNwIC1yIC4uL21hcmt1cC8gJChXRUJfVEFSR0VUKQotCWNwIC1yIC4uL3NraW5zLyAkKFdFQl9UQVJHRVQpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBJbnN0YWxsIFRhcmdldAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWluc3RhbGw6IGFsbCAkKFdFQl9UQVJHRVQpCi0jCSQoSU5TVEFMTF9ESVIpICQoSU5TVEFMTF9EU1QpL3NyYwotIwkkKElOU1RBTExfREFUQSkgJChFUkxfRklMRVMpICQoSU5TVEFMTF9EU1QpL3NyYwotIwkkKElOU1RBTExfREFUQSkgJChJTlRFUk5BTF9IUkxfRklMRVMpICQoSU5TVEFMTF9EU1QpL3NyYwotIwkkKElOU1RBTExfRElSKSAkKElOU1RBTExfRFNUKS9pbmNsdWRlCi0jCSQoSU5TVEFMTF9EQVRBKSAkKEhSTF9GSUxFUykgJChJTlNUQUxMX0RTVCkvaW5jbHVkZQotIwkkKElOU1RBTExfRElSKSAkKElOU1RBTExfRFNUKS9lYmluCi0jCSQoSU5TVEFMTF9EQVRBKSAkKFRBUkdFVF9GSUxFUykgJChJTlNUQUxMX0RTVCkvZWJpbgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGVzdF9oYW5kbGVyLmVybCBiL2xpYi9lcmwvc3JjL3Rlc3RfaGFuZGxlci5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTNhY2QuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9zcmMvdGVzdF9oYW5kbGVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotCi0tbW9kdWxlKHRlc3RfaGFuZGxlcikuCi0KLS1leHBvcnQoW2hhbmRsZV9mdW5jdGlvbi8yXSkuCi0KLWhhbmRsZV9mdW5jdGlvbihhZGQsIFBhcmFtcyA9IHtBLCBCfSkgLT4KLSAgICBpbzpmb3JtYXQoIkdvdCBwYXJhbXM6IH5wfm4iLCBbUGFyYW1zXSksCi0gICAge3JlcGx5LCBBICsgQn0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90ZXN0X3NlcnZpY2UuZXJsIGIvbGliL2VybC9zcmMvdGVzdF9zZXJ2aWNlLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhNDgyNy4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3NyYy90ZXN0X3NlcnZpY2UuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9zZXJ2aWNlKS4KLSUKLSUgVGVzdCBzZXJ2aWNlIGRlZmluaXRpb24KLQotLWV4cG9ydChbZnVuY3Rpb25faW5mby8yXSkuCi0KLWZ1bmN0aW9uX2luZm8oYWRkLCBwYXJhbXNfdHlwZSkgLT4KLSAgICB7c3RydWN0LCBbezEsIGkzMn0sCi0gICAgICAgICAgICAgIHsyLCBpMzJ9XX07Ci1mdW5jdGlvbl9pbmZvKGFkZCwgcmVwbHlfdHlwZSkgLT4gaTMyLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMgYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwppbmRleCBmNTQ3MmJmLi5iM2IyMjVmIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYworKysgYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwpAQCAtMTcsMTggKzE3LDM4IEBACiAlJSB1bmRlciB0aGUgTGljZW5zZS4KICUlCiAlJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQote2FwcGxpY2F0aW9uLCAlQVBQX05BTUUlLAotIFsKK3thcHBsaWNhdGlvbiwgdGhyaWZ0LCBbCiAgICUgQSBxdWljayBkZXNjcmlwdGlvbiBvZiB0aGUgYXBwbGljYXRpb24uCiAgIHtkZXNjcmlwdGlvbiwgIlRocmlmdCBiaW5kaW5ncyJ9LAogCiAgICUgVGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0b24KLSAge3ZzbiwgIiVWU04lIn0sCisgIHt2c24sICIxLjAuMCJ9LAogCiAgICUgQWxsIG1vZHVsZXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCiAgIHttb2R1bGVzLCBbCi0gICAgICAgJU1PRFVMRVMlCi0gICBdfSwKKyAgICB0aHJpZnRfYmFzZTY0X3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sLAorICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X2NsaWVudF91dGlsLAorICAgIHRocmlmdF9jbGllbnQsCisgICAgdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfZmlsZV90cmFuc3BvcnQsCisgICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X2h0dHBfdHJhbnNwb3J0LAorICAgIHRocmlmdF9qc29uX3BhcnNlciwKKyAgICB0aHJpZnRfanNvbl9wcm90b2NvbCwKKyAgICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfbWVtb3J5X2J1ZmZlciwKKyAgICB0aHJpZnRfcHJvY2Vzc29yLAorICAgIHRocmlmdF9wcm90b2NvbCwKKyAgICB0aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudCwKKyAgICB0aHJpZnRfc2VydmVyLAorICAgIHRocmlmdF9zZXJ2aWNlLAorICAgIHRocmlmdF9zb2NrZXRfc2VydmVyLAorICAgIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LAorICAgIHRocmlmdF90cmFuc3BvcnRfc3RhdGVfdGVzdCwKKyAgICB0aHJpZnRfdHJhbnNwb3J0CisgIF19LAogCiAgICUgQWxsIG9mIHRoZSByZWdpc3RlcmVkIG5hbWVzIHRoZSBhcHBsaWNhdGlvbiB1c2VzLiBUaGlzIGNhbiBiZSBpZ25vcmVkLgogICB7cmVnaXN0ZXJlZCwgW119LApAQCAtMzYsMTEgKzU2LDcgQEAKICAgJSBBcHBsaWNhdGlvbnMgdGhhdCBhcmUgdG8gYmUgc3RhcnRlZCBwcmlvciB0byB0aGlzIG9uZS4gVGhpcyBjYW4gYmUgaWdub3JlZAogICAlIGxlYXZlIGl0IGFsb25lIHVubGVzcyB5b3UgdW5kZXJzdGFuZCBpdCB3ZWxsIGFuZCBsZXQgdGhlIC5yZWwgZmlsZXMgaW4KICAgJSB5b3VyIHJlbGVhc2UgaGFuZGxlIHRoaXMuCi0gIHthcHBsaWNhdGlvbnMsCi0gICBbCi0gICAga2VybmVsLAotICAgIHN0ZGxpYgotICAgXX0sCisgIHthcHBsaWNhdGlvbnMsIFtrZXJuZWwsIHN0ZGxpYl19LAogCiAgICUgT1RQIGFwcGxpY2F0aW9uIGxvYWRlciB3aWxsIGxvYWQsIGJ1dCBub3Qgc3RhcnQsIGluY2x1ZGVkIGFwcHMuIEFnYWluCiAgICUgdGhpcyBjYW4gYmUgaWdub3JlZCBhcyB3ZWxsLiAgVG8gbG9hZCBidXQgbm90IHN0YXJ0IGFuIGFwcGxpY2F0aW9uIGl0CkBAIC01MCwxMyArNjYsOSBAQAogICAlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzaW1pbGFyIHRvIHRob3NlIGluIHRoZSBjb25maWcgZmlsZSBzcGVjaWZpZWQKICAgJSBvbiB0aGUgY29tbWFuZCBsaW5lLiBjYW4gYmUgZmV0Y2hlZCB3aXRoIGdhczpnZXRfZW52CiAgIHtlbnYsIFsKLSAgICAgICAgICUgSWYgYW4gZXJyb3IvY3Jhc2ggb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIG9mIGEgZnVuY3Rpb24sCi0gICAgICAgICAlIHNob3VsZCB0aGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHNlcmlhbGl6ZWQgYmFjayB0byB0aGUgY2xpZW50Ci0gICAgICAgICAlIGluY2x1ZGUgdGhlIGVybGFuZyBiYWNrdHJhY2U/Ci0gICAgICAgICB7ZXhjZXB0aW9uc19pbmNsdWRlX3RyYWNlcywgdHJ1ZX0KLSAgXX0sCi0KLSAgJSBUaGUgTW9kdWxlIGFuZCBBcmdzIHVzZWQgdG8gc3RhcnQgdGhpcyBhcHBsaWNhdGlvbi4KLSAge21vZCwge3RocmlmdF9hcHAsIFtdfX0KLSBdCi19LgorICAgICUgSWYgYW4gZXJyb3IvY3Jhc2ggb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIG9mIGEgZnVuY3Rpb24sCisgICAgJSBzaG91bGQgdGhlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBzZXJpYWxpemVkIGJhY2sgdG8gdGhlIGNsaWVudAorICAgICUgaW5jbHVkZSB0aGUgZXJsYW5nIGJhY2t0cmFjZT8KKyAgICB7ZXhjZXB0aW9uc19pbmNsdWRlX3RyYWNlcywgdHJ1ZX0KKyAgXX0KK119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0LmFwcHVwLnNyYyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHB1cC5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTYzODMuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0LmFwcHVwLnNyYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXsiJVZTTiUiLFtdLFtdfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9iYXNlNjRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9iYXNlNjRfdHJhbnNwb3J0LmVybAppbmRleCA5ZDEzMTUxLi5kMzFmMmJhIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfYmFzZTY0X3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2Jhc2U2NF90cmFuc3BvcnQuZXJsCkBAIC0yOSwzMCArMjksMzUgQEAKIAogJSUgU3RhdGUKIC1yZWNvcmQoYjY0X3RyYW5zcG9ydCwge3dyYXBwZWR9KS4KKy10eXBlIHN0YXRlKCkgOjogI2I2NF90cmFuc3BvcnR7fS4KKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAogbmV3KFdyYXBwZWQpIC0+CiAgICAgU3RhdGUgPSAjYjY0X3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZH0sCiAgICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgogCiAKLXdyaXRlKCNiNjRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkfSwgRGF0YSkgLT4KLSAgICB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQsIGJhc2U2NDplbmNvZGUoaW9saXN0X3RvX2JpbmFyeShEYXRhKSkpLgord3JpdGUoVGhpcyA9ICNiNjRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkfSwgRGF0YSkgLT4KKyAgICB7TmV3V3JhcHBlZCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgYmFzZTY0OmVuY29kZShpb2xpc3RfdG9fYmluYXJ5KERhdGEpKSksCisgICAge1RoaXMjYjY0X3RyYW5zcG9ydHt3cmFwcGVkID0gTmV3V3JhcHBlZH0sIFJlc3VsdH0uCiAKIAogJSUgYmFzZTY0IGRvZXNuJ3Qgc3VwcG9ydCByZWFkaW5nIHF1aXRlIHlldCBzaW5jZSBpdCB3b3VsZCBpbnZvbHZlCiAlJSBuYXN0eSBidWZmZXJpbmcgYW5kIHN1Y2gKLXJlYWQoI2I2NF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWR9LCBEYXRhKSAtPgotICAgIHtlcnJvciwgbm9fcmVhZHNfYWxsb3dlZH0uCityZWFkKFRoaXMgPSAjYjY0X3RyYW5zcG9ydHt9LCBfRGF0YSkgLT4KKyAgICB7VGhpcywge2Vycm9yLCBub19yZWFkc19hbGxvd2VkfX0uCiAKIAotZmx1c2goI2I2NF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWR9KSAtPgotICAgIHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgPDwiXG4iPj4pLAotICAgIHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JhcHBlZCkuCitmbHVzaChUaGlzID0gI2I2NF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KKyAgICB7V3JhcHBlZDEsIG9rfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZDAsIDw8IlxuIj4+KSwKKyAgICB7V3JhcHBlZDIsIG9rfSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JhcHBlZDEpLAorICAgIHtUaGlzI2I2NF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQyfSwgb2t9LgogCiAKLWNsb3NlKE1lID0gI2I2NF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWR9KSAtPgotICAgIGZsdXNoKE1lKSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQpLgorY2xvc2UoVGhpczApIC0+CisgICAge1RoaXMxID0gI2I2NF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWR9LCBva30gPSBmbHVzaChUaGlzMCksCisgICAge05ld1dyYXBwZWQsIG9rfSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCksCisgICAge1RoaXMxI2I2NF90cmFuc3BvcnR7d3JhcHBlZCA9IE5ld1dyYXBwZWR9LCBva30uCiAKIAogJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybAppbmRleCBhZDUzMzg0Li44NWFiYjYyIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybApAQCAtMTksNyArMTksNyBAQAogCiAtbW9kdWxlKHRocmlmdF9iaW5hcnlfcHJvdG9jb2wpLgogCi0tYmVoYXZpb3IodGhyaWZ0X3Byb3RvY29sKS4KKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KIAogLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCiAtaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgpAQCAtMzcsNiArMzcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcmVhZD10cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGU9dHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pLgorLXR5cGUgc3RhdGUoKSA6OiAjYmluYXJ5X3Byb3RvY29se30uCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KIAogLWRlZmluZShWRVJTSU9OX01BU0ssIDE2I0ZGRkYwMDAwKS4KIC1kZWZpbmUoVkVSU0lPTl8xLCAxNiM4MDAxMDAwMCkuCkBAIC01OCw3OSArNjAsODEgQEAKICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI2JpbmFyeV9wcm90b2NvbHtzdHJpY3Rfd3JpdGU9Qm9vbH0pLgogCiAKLWZsdXNoX3RyYW5zcG9ydCgjYmluYXJ5X3Byb3RvY29se3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0pIC0+Ci0gICAgdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorZmx1c2hfdHJhbnNwb3J0KFRoaXMgPSAjYmluYXJ5X3Byb3RvY29se3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0pIC0+CisgICAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KSwKKyAgICB7VGhpcyNiaW5hcnlfcHJvdG9jb2x7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KIAotY2xvc2VfdHJhbnNwb3J0KCNiaW5hcnlfcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KLSAgICB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCitjbG9zZV90cmFuc3BvcnQoVGhpcyA9ICNiaW5hcnlfcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShUcmFuc3BvcnQpLAorICAgIHtUaGlzI2JpbmFyeV9wcm90b2NvbHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgogCiAlJSUKICUlJSBpbnN0YW5jZSBtZXRob2RzCiAlJSUKIAotd3JpdGUoVGhpcywgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57Cit3cml0ZShUaGlzMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CiAgICAgICAgIG5hbWUgPSBOYW1lLAogICAgICAgICB0eXBlID0gVHlwZSwKICAgICAgICAgc2VxaWQgPSBTZXFpZH0pIC0+Ci0gICAgY2FzZSBUaGlzI2JpbmFyeV9wcm90b2NvbC5zdHJpY3Rfd3JpdGUgb2YKKyAgICBjYXNlIFRoaXMwI2JpbmFyeV9wcm90b2NvbC5zdHJpY3Rfd3JpdGUgb2YKICAgICAgICAgdHJ1ZSAtPgotICAgICAgICAgICAgd3JpdGUoVGhpcywge2kzMiwgP1ZFUlNJT05fMSBib3IgVHlwZX0pLAotICAgICAgICAgICAgd3JpdGUoVGhpcywge3N0cmluZywgTmFtZX0pLAotICAgICAgICAgICAgd3JpdGUoVGhpcywge2kzMiwgU2VxaWR9KTsKKyAgICAgICAgICAgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtpMzIsID9WRVJTSU9OXzEgYm9yIFR5cGV9KSwKKyAgICAgICAgICAgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIHtzdHJpbmcsIE5hbWV9KSwKKyAgICAgICAgICAgIHtUaGlzMywgb2t9ID0gd3JpdGUoVGhpczIsIHtpMzIsIFNlcWlkfSksCisgICAgICAgICAgICB7VGhpczMsIG9rfTsKICAgICAgICAgZmFsc2UgLT4KLSAgICAgICAgICAgIHdyaXRlKFRoaXMsIHtzdHJpbmcsIE5hbWV9KSwKLSAgICAgICAgICAgIHdyaXRlKFRoaXMsIHtieXRlLCBUeXBlfSksCi0gICAgICAgICAgICB3cml0ZShUaGlzLCB7aTMyLCBTZXFpZH0pCi0gICAgZW5kLAotICAgIG9rOworICAgICAgICAgICAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge3N0cmluZywgTmFtZX0pLAorICAgICAgICAgICAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwge2J5dGUsIFR5cGV9KSwKKyAgICAgICAgICAgIHtUaGlzMywgb2t9ID0gd3JpdGUoVGhpczIsIHtpMzIsIFNlcWlkfSksCisgICAgICAgICAgICB7VGhpczMsIG9rfQorICAgIGVuZDsKIAotd3JpdGUoVGhpcywgbWVzc2FnZV9lbmQpIC0+IG9rOword3JpdGUoVGhpcywgbWVzc2FnZV9lbmQpIC0+IHtUaGlzLCBva307CiAKLXdyaXRlKFRoaXMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57CiAgICAgICAgbmFtZSA9IF9OYW1lLAogICAgICAgIHR5cGUgPSBUeXBlLAogICAgICAgIGlkID0gSWR9KSAtPgotICAgIHdyaXRlKFRoaXMsIHtieXRlLCBUeXBlfSksCi0gICAgd3JpdGUoVGhpcywge2kxNiwgSWR9KSwKLSAgICBvazsKKyAgICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7Ynl0ZSwgVHlwZX0pLAorICAgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIHtpMTYsIElkfSksCisgICAge1RoaXMyLCBva307CiAKIHdyaXRlKFRoaXMsIGZpZWxkX3N0b3ApIC0+Ci0gICAgd3JpdGUoVGhpcywge2J5dGUsID90VHlwZV9TVE9QfSksCi0gICAgb2s7CisgICAgd3JpdGUoVGhpcywge2J5dGUsID90VHlwZV9TVE9QfSk7CiAKLXdyaXRlKFRoaXMsIGZpZWxkX2VuZCkgLT4gb2s7Cit3cml0ZShUaGlzLCBmaWVsZF9lbmQpIC0+IHtUaGlzLCBva307CiAKLXdyaXRlKFRoaXMsICNwcm90b2NvbF9tYXBfYmVnaW57Cit3cml0ZShUaGlzMCwgI3Byb3RvY29sX21hcF9iZWdpbnsKICAgICAgICBrdHlwZSA9IEt0eXBlLAogICAgICAgIHZ0eXBlID0gVnR5cGUsCiAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgotICAgIHdyaXRlKFRoaXMsIHtieXRlLCBLdHlwZX0pLAotICAgIHdyaXRlKFRoaXMsIHtieXRlLCBWdHlwZX0pLAotICAgIHdyaXRlKFRoaXMsIHtpMzIsIFNpemV9KSwKLSAgICBvazsKKyAgICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7Ynl0ZSwgS3R5cGV9KSwKKyAgICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgVnR5cGV9KSwKKyAgICB7VGhpczMsIG9rfSA9IHdyaXRlKFRoaXMyLCB7aTMyLCBTaXplfSksCisgICAge1RoaXMzLCBva307CiAKLXdyaXRlKFRoaXMsIG1hcF9lbmQpIC0+IG9rOword3JpdGUoVGhpcywgbWFwX2VuZCkgLT4ge1RoaXMsIG9rfTsKIAotd3JpdGUoVGhpcywgI3Byb3RvY29sX2xpc3RfYmVnaW57Cit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57CiAgICAgICAgIGV0eXBlID0gRXR5cGUsCiAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KLSAgICB3cml0ZShUaGlzLCB7Ynl0ZSwgRXR5cGV9KSwKLSAgICB3cml0ZShUaGlzLCB7aTMyLCBTaXplfSksCi0gICAgb2s7CisgICAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2J5dGUsIEV0eXBlfSksCisgICAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwge2kzMiwgU2l6ZX0pLAorICAgIHtUaGlzMiwgb2t9OwogCi13cml0ZShUaGlzLCBsaXN0X2VuZCkgLT4gb2s7Cit3cml0ZShUaGlzLCBsaXN0X2VuZCkgLT4ge1RoaXMsIG9rfTsKIAotd3JpdGUoVGhpcywgI3Byb3RvY29sX3NldF9iZWdpbnsKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfc2V0X2JlZ2luewogICAgICAgICBldHlwZSA9IEV0eXBlLAogICAgICAgICBzaXplID0gU2l6ZX0pIC0+Ci0gICAgd3JpdGUoVGhpcywge2J5dGUsIEV0eXBlfSksCi0gICAgd3JpdGUoVGhpcywge2kzMiwgU2l6ZX0pLAotICAgIG9rOworICAgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtieXRlLCBFdHlwZX0pLAorICAgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIHtpMzIsIFNpemV9KSwKKyAgICB7VGhpczIsIG9rfTsKIAotd3JpdGUoVGhpcywgc2V0X2VuZCkgLT4gb2s7Cit3cml0ZShUaGlzLCBzZXRfZW5kKSAtPiB7VGhpcywgb2t9OwogCi13cml0ZShUaGlzLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pIC0+IG9rOwotd3JpdGUoVGhpcywgc3RydWN0X2VuZCkgLT4gb2s7Cit3cml0ZShUaGlzLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pIC0+IHtUaGlzLCBva307Cit3cml0ZShUaGlzLCBzdHJ1Y3RfZW5kKSAtPiB7VGhpcywgb2t9OwogCiB3cml0ZShUaGlzLCB7Ym9vbCwgdHJ1ZX0pICAtPiB3cml0ZShUaGlzLCB7Ynl0ZSwgMX0pOwogd3JpdGUoVGhpcywge2Jvb2wsIGZhbHNlfSkgLT4gd3JpdGUoVGhpcywge2J5dGUsIDB9KTsKQEAgLTE1MCwxNTIgKzE1NCwxNjYgQEAKIHdyaXRlKFRoaXMsIHtkb3VibGUsIERvdWJsZX0pIC0+CiAgICAgd3JpdGUoVGhpcywgPDxEb3VibGU6NjQvYmlnLXNpZ25lZC1mbG9hdD4+KTsKIAotd3JpdGUoVGhpcywge3N0cmluZywgU3RyfSkgd2hlbiBpc19saXN0KFN0cikgLT4KLSAgICB3cml0ZShUaGlzLCB7aTMyLCBsZW5ndGgoU3RyKX0pLAotICAgIHdyaXRlKFRoaXMsIGxpc3RfdG9fYmluYXJ5KFN0cikpOword3JpdGUoVGhpczAsIHtzdHJpbmcsIFN0cn0pIHdoZW4gaXNfbGlzdChTdHIpIC0+CisgICAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2kzMiwgbGVuZ3RoKFN0cil9KSwKKyAgICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCBsaXN0X3RvX2JpbmFyeShTdHIpKSwKKyAgICB7VGhpczIsIG9rfTsKIAotd3JpdGUoVGhpcywge3N0cmluZywgQmlufSkgd2hlbiBpc19iaW5hcnkoQmluKSAtPgotICAgIHdyaXRlKFRoaXMsIHtpMzIsIHNpemUoQmluKX0pLAotICAgIHdyaXRlKFRoaXMsIEJpbik7Cit3cml0ZShUaGlzMCwge3N0cmluZywgQmlufSkgd2hlbiBpc19iaW5hcnkoQmluKSAtPgorICAgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtpMzIsIHNpemUoQmluKX0pLAorICAgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIEJpbiksCisgICAge1RoaXMyLCBva307CiAKICUlIERhdGEgOjogaW9saXN0KCkKLXdyaXRlKFRoaXMsIERhdGEpIC0+Ci0gICAgdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShUaGlzI2JpbmFyeV9wcm90b2NvbC50cmFuc3BvcnQsIERhdGEpLgord3JpdGUoVGhpcyA9ICNiaW5hcnlfcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnN9LCBEYXRhKSAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFRyYW5zLCBEYXRhKSwKKyAgICB7VGhpcyNiaW5hcnlfcHJvdG9jb2x7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KIAogJSUKIAotcmVhZChUaGlzLCBtZXNzYWdlX2JlZ2luKSAtPgotICAgIGNhc2UgcmVhZChUaGlzLCB1aTMyKSBvZgorcmVhZChUaGlzMCwgbWVzc2FnZV9iZWdpbikgLT4KKyAgICB7VGhpczEsIEluaXRpYWx9ID0gcmVhZChUaGlzMCwgdWkzMiksCisgICAgY2FzZSBJbml0aWFsIG9mCiAgICAgICAgIHtvaywgU3p9IHdoZW4gU3ogYmFuZCA/VkVSU0lPTl9NQVNLID06PSA/VkVSU0lPTl8xIC0+CiAgICAgICAgICAgICAlJSB3ZSdyZSBhdCB2ZXJzaW9uIDEKLSAgICAgICAgICAgIHtvaywgTmFtZX0gID0gcmVhZChUaGlzLCBzdHJpbmcpLAotICAgICAgICAgICAgVHlwZSAgICAgICAgPSBTeiBiYW5kID9UWVBFX01BU0ssCi0gICAgICAgICAgICB7b2ssIFNlcUlkfSA9IHJlYWQoVGhpcywgaTMyKSwKLSAgICAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgID0gYmluYXJ5X3RvX2xpc3QoTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICA9IFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfTsKKyAgICAgICAgICAgIHtUaGlzMiwge29rLCBOYW1lfX0gID0gcmVhZChUaGlzMSwgc3RyaW5nKSwKKyAgICAgICAgICAgIHtUaGlzMywge29rLCBTZXFJZH19ID0gcmVhZChUaGlzMiwgaTMyKSwKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgID0gU3ogYmFuZCA/VFlQRV9NQVNLLAorICAgICAgICAgICAge1RoaXMzLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lICA9IGJpbmFyeV90b19saXN0KE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICA9IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxSWR9fTsKIAogICAgICAgICB7b2ssIFN6fSB3aGVuIFN6IDwgMCAtPgogICAgICAgICAgICAgJSUgdGhlcmUncyBhIHZlcnNpb24gbnVtYmVyIGJ1dCBpdCdzIHVuZXhwZWN0ZWQKLSAgICAgICAgICAgIHtlcnJvciwge2JhZF9iaW5hcnlfcHJvdG9jb2xfdmVyc2lvbiwgU3p9fTsKKyAgICAgICAgICAgIHtUaGlzMSwge2Vycm9yLCB7YmFkX2JpbmFyeV9wcm90b2NvbF92ZXJzaW9uLCBTen19fTsKIAotICAgICAgICB7b2ssIFN6fSB3aGVuIFRoaXMjYmluYXJ5X3Byb3RvY29sLnN0cmljdF9yZWFkID06PSB0cnVlIC0+CisgICAgICAgIHtvaywgX1N6fSB3aGVuIFRoaXMxI2JpbmFyeV9wcm90b2NvbC5zdHJpY3RfcmVhZCA9Oj0gdHJ1ZSAtPgogICAgICAgICAgICAgJSUgc3RyaWN0X3JlYWQgaXMgdHJ1ZSBhbmQgdGhlcmUncyBubyB2ZXJzaW9uIGhlYWRlcjsgdGhhdCdzIGFuIGVycm9yCi0gICAgICAgICAgICB7ZXJyb3IsIG5vX2JpbmFyeV9wcm90b2NvbF92ZXJzaW9ufTsKKyAgICAgICAgICAgIHtUaGlzMSwge2Vycm9yLCBub19iaW5hcnlfcHJvdG9jb2xfdmVyc2lvbn19OwogCi0gICAgICAgIHtvaywgU3p9IHdoZW4gVGhpcyNiaW5hcnlfcHJvdG9jb2wuc3RyaWN0X3JlYWQgPTo9IGZhbHNlIC0+CisgICAgICAgIHtvaywgU3p9IHdoZW4gVGhpczEjYmluYXJ5X3Byb3RvY29sLnN0cmljdF9yZWFkID06PSBmYWxzZSAtPgogICAgICAgICAgICAgJSUgc3RyaWN0X3JlYWQgaXMgZmFsc2UsIHNvIGp1c3QgcmVhZCB0aGUgb2xkIHdheQotICAgICAgICAgICAge29rLCBOYW1lfSAgPSByZWFkKFRoaXMsIFN6KSwKLSAgICAgICAgICAgIHtvaywgVHlwZX0gID0gcmVhZChUaGlzLCBieXRlKSwKLSAgICAgICAgICAgIHtvaywgU2VxSWR9ID0gcmVhZChUaGlzLCBpMzIpLAotICAgICAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSAgPSBiaW5hcnlfdG9fbGlzdChOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgID0gVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxSWR9OworICAgICAgICAgICAge1RoaXMyLCB7b2ssIE5hbWV9fSAgPSByZWFkX2RhdGEoVGhpczEsIFN6KSwKKyAgICAgICAgICAgIHtUaGlzMywge29rLCBUeXBlfX0gID0gcmVhZChUaGlzMiwgYnl0ZSksCisgICAgICAgICAgICB7VGhpczQsIHtvaywgU2VxSWR9fSA9IHJlYWQoVGhpczMsIGkzMiksCisgICAgICAgICAgICB7VGhpczQsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgID0gYmluYXJ5X3RvX2xpc3QoTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgID0gVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH19OwogCi0gICAgICAgIEVyciA9IHtlcnJvciwgY2xvc2VkfSAtPiBFcnI7Ci0gICAgICAgIEVyciA9IHtlcnJvciwgdGltZW91dH0tPiBFcnI7Ci0gICAgICAgIEVyciA9IHtlcnJvciwgZWJhZGZ9ICAtPiBFcnIKKyAgICAgICAgRWxzZSAtPgorICAgICAgICAgICAge1RoaXMxLCBFbHNlfQogICAgIGVuZDsKIAotcmVhZChUaGlzLCBtZXNzYWdlX2VuZCkgLT4gb2s7CityZWFkKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiB7VGhpcywgb2t9OwogCi1yZWFkKFRoaXMsIHN0cnVjdF9iZWdpbikgLT4gb2s7Ci1yZWFkKFRoaXMsIHN0cnVjdF9lbmQpIC0+IG9rOworcmVhZChUaGlzLCBzdHJ1Y3RfYmVnaW4pIC0+IHtUaGlzLCBva307CityZWFkKFRoaXMsIHN0cnVjdF9lbmQpIC0+IHtUaGlzLCBva307CiAKLXJlYWQoVGhpcywgZmllbGRfYmVnaW4pIC0+Ci0gICAgY2FzZSByZWFkKFRoaXMsIGJ5dGUpIG9mCityZWFkKFRoaXMwLCBmaWVsZF9iZWdpbikgLT4KKyAgICB7VGhpczEsIFJlc3VsdH0gPSByZWFkKFRoaXMwLCBieXRlKSwKKyAgICBjYXNlIFJlc3VsdCBvZgogICAgICAgICB7b2ssIFR5cGUgPSA/dFR5cGVfU1RPUH0gLT4KLSAgICAgICAgICAgICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gVHlwZX07CisgICAgICAgICAgICB7VGhpczEsICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gVHlwZX19OwogICAgICAgICB7b2ssIFR5cGV9IC0+Ci0gICAgICAgICAgICB7b2ssIElkfSA9IHJlYWQoVGhpcywgaTE2KSwKLSAgICAgICAgICAgICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IElkfQorICAgICAgICAgICAge1RoaXMyLCB7b2ssIElkfX0gPSByZWFkKFRoaXMxLCBpMTYpLAorICAgICAgICAgICAge1RoaXMyLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IElkfX0KICAgICBlbmQ7CiAKLXJlYWQoVGhpcywgZmllbGRfZW5kKSAtPiBvazsKK3JlYWQoVGhpcywgZmllbGRfZW5kKSAtPiB7VGhpcywgb2t9OwogCi1yZWFkKFRoaXMsIG1hcF9iZWdpbikgLT4KLSAgICB7b2ssIEt0eXBlfSA9IHJlYWQoVGhpcywgYnl0ZSksCi0gICAge29rLCBWdHlwZX0gPSByZWFkKFRoaXMsIGJ5dGUpLAotICAgIHtvaywgU2l6ZX0gID0gcmVhZChUaGlzLCBpMzIpLAotICAgICNwcm90b2NvbF9tYXBfYmVnaW57a3R5cGUgPSBLdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZ0eXBlID0gVnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX07Ci1yZWFkKFRoaXMsIG1hcF9lbmQpIC0+IG9rOworcmVhZChUaGlzMCwgbWFwX2JlZ2luKSAtPgorICAgIHtUaGlzMSwge29rLCBLdHlwZX19ID0gcmVhZChUaGlzMCwgYnl0ZSksCisgICAge1RoaXMyLCB7b2ssIFZ0eXBlfX0gPSByZWFkKFRoaXMxLCBieXRlKSwKKyAgICB7VGhpczMsIHtvaywgU2l6ZX19ICA9IHJlYWQoVGhpczIsIGkzMiksCisgICAge1RoaXMzLCAjcHJvdG9jb2xfbWFwX2JlZ2lue2t0eXBlID0gS3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0eXBlID0gVnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CityZWFkKFRoaXMsIG1hcF9lbmQpIC0+IHtUaGlzLCBva307CiAKLXJlYWQoVGhpcywgbGlzdF9iZWdpbikgLT4KLSAgICB7b2ssIEV0eXBlfSA9IHJlYWQoVGhpcywgYnl0ZSksCi0gICAge29rLCBTaXplfSAgPSByZWFkKFRoaXMsIGkzMiksCi0gICAgI3Byb3RvY29sX2xpc3RfYmVnaW57ZXR5cGUgPSBFdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX07Ci1yZWFkKFRoaXMsIGxpc3RfZW5kKSAtPiBvazsKK3JlYWQoVGhpczAsIGxpc3RfYmVnaW4pIC0+CisgICAge1RoaXMxLCB7b2ssIEV0eXBlfX0gPSByZWFkKFRoaXMwLCBieXRlKSwKKyAgICB7VGhpczIsIHtvaywgU2l6ZX19ICA9IHJlYWQoVGhpczEsIGkzMiksCisgICAge1RoaXMyLCAjcHJvdG9jb2xfbGlzdF9iZWdpbntldHlwZSA9IEV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKK3JlYWQoVGhpcywgbGlzdF9lbmQpIC0+IHtUaGlzLCBva307CiAKLXJlYWQoVGhpcywgc2V0X2JlZ2luKSAtPgotICAgIHtvaywgRXR5cGV9ID0gcmVhZChUaGlzLCBieXRlKSwKLSAgICB7b2ssIFNpemV9ICA9IHJlYWQoVGhpcywgaTMyKSwKLSAgICAjcHJvdG9jb2xfc2V0X2JlZ2lue2V0eXBlID0gRXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX07Ci1yZWFkKFRoaXMsIHNldF9lbmQpIC0+IG9rOworcmVhZChUaGlzMCwgc2V0X2JlZ2luKSAtPgorICAgIHtUaGlzMSwge29rLCBFdHlwZX19ID0gcmVhZChUaGlzMCwgYnl0ZSksCisgICAge1RoaXMyLCB7b2ssIFNpemV9fSAgPSByZWFkKFRoaXMxLCBpMzIpLAorICAgIHtUaGlzMiwgI3Byb3RvY29sX3NldF9iZWdpbntldHlwZSA9IEV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKK3JlYWQoVGhpcywgc2V0X2VuZCkgLT4ge1RoaXMsIG9rfTsKIAotcmVhZChUaGlzLCBmaWVsZF9zdG9wKSAtPgotICAgIHtvaywgP3RUeXBlX1NUT1B9ID0gIHJlYWQoVGhpcywgYnl0ZSksCi0gICAgb2s7CityZWFkKFRoaXMwLCBmaWVsZF9zdG9wKSAtPgorICAgIHtUaGlzMSwge29rLCA/dFR5cGVfU1RPUH19ID0gcmVhZChUaGlzMCwgYnl0ZSksCisgICAge1RoaXMxLCBva307CiAKICUlCiAKLXJlYWQoVGhpcywgYm9vbCkgLT4KLSAgICBjYXNlIHJlYWQoVGhpcywgYnl0ZSkgb2YKLSAgICAgICAge29rLCBCeXRlfSAtPiB7b2ssIEJ5dGUgLz0gMH07Ci0gICAgICAgIEVsc2UgLT4gRWxzZQorcmVhZChUaGlzMCwgYm9vbCkgLT4KKyAgICB7VGhpczEsIFJlc3VsdH0gPSByZWFkKFRoaXMwLCBieXRlKSwKKyAgICBjYXNlIFJlc3VsdCBvZgorICAgICAgICB7b2ssIEJ5dGV9IC0+IHtUaGlzMSwge29rLCBCeXRlIC89IDB9fTsKKyAgICAgICAgRWxzZSAtPiB7VGhpczEsIEVsc2V9CiAgICAgZW5kOwogCi1yZWFkKFRoaXMsIGJ5dGUpIC0+Ci0gICAgY2FzZSByZWFkKFRoaXMsIDEpIG9mCi0gICAgICAgIHtvaywgPDxWYWw6OC9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtvaywgVmFsfTsKLSAgICAgICAgRWxzZSAtPiBFbHNlCityZWFkKFRoaXMwLCBieXRlKSAtPgorICAgIHtUaGlzMSwgQnl0ZXN9ID0gcmVhZF9kYXRhKFRoaXMwLCAxKSwKKyAgICBjYXNlIEJ5dGVzIG9mCisgICAgICAgIHtvaywgPDxWYWw6OC9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtUaGlzMSwge29rLCBWYWx9fTsKKyAgICAgICAgRWxzZSAtPiB7VGhpczEsIEVsc2V9CiAgICAgZW5kOwogCi1yZWFkKFRoaXMsIGkxNikgLT4KLSAgICBjYXNlIHJlYWQoVGhpcywgMikgb2YKLSAgICAgICAge29rLCA8PFZhbDoxNi9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtvaywgVmFsfTsKLSAgICAgICAgRWxzZSAtPiBFbHNlCityZWFkKFRoaXMwLCBpMTYpIC0+CisgICAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDIpLAorICAgIGNhc2UgQnl0ZXMgb2YKKyAgICAgICAge29rLCA8PFZhbDoxNi9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtUaGlzMSwge29rLCBWYWx9fTsKKyAgICAgICAgRWxzZSAtPiB7VGhpczEsIEVsc2V9CiAgICAgZW5kOwogCi1yZWFkKFRoaXMsIGkzMikgLT4KLSAgICBjYXNlIHJlYWQoVGhpcywgNCkgb2YKLSAgICAgICAge29rLCA8PFZhbDozMi9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtvaywgVmFsfTsKLSAgICAgICAgRWxzZSAtPiBFbHNlCityZWFkKFRoaXMwLCBpMzIpIC0+CisgICAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDQpLAorICAgIGNhc2UgQnl0ZXMgb2YKKyAgICAgICAge29rLCA8PFZhbDozMi9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtUaGlzMSwge29rLCBWYWx9fTsKKyAgICAgICAgRWxzZSAtPiB7VGhpczEsIEVsc2V9CiAgICAgZW5kOwogCiAlJSB1bnNpZ25lZCBpbnRzIGFyZW4ndCB1c2VkIGJ5IHRocmlmdCBpdHNlbGYsIGJ1dCBpdCdzIHVzZWQgZm9yIHRoZSBwYXJzaW5nCiAlJSBvZiB0aGUgcGFja2V0IHZlcnNpb24gaGVhZGVyLiBXaXRob3V0IHRoaXMgc3BlY2lhbCBmdW5jdGlvbiBCRUFNIHdvcmtzIGZpbmUKICUlIGJ1dCBoaXBlIHRoaW5rcyBpdCByZWNlaXZlZCBhIGJhZCB2ZXJzaW9uIGhlYWRlci4KLXJlYWQoVGhpcywgdWkzMikgLT4KLSAgICBjYXNlIHJlYWQoVGhpcywgNCkgb2YKLSAgICAgICAge29rLCA8PFZhbDozMi9pbnRlZ2VyLXVuc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge29rLCBWYWx9OwotICAgICAgICBFbHNlIC0+IEVsc2UKK3JlYWQoVGhpczAsIHVpMzIpIC0+CisgICAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDQpLAorICAgIGNhc2UgQnl0ZXMgb2YKKyAgICAgICAge29rLCA8PFZhbDozMi9pbnRlZ2VyLXVuc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgICAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KICAgICBlbmQ7CiAKLXJlYWQoVGhpcywgaTY0KSAtPgotICAgIGNhc2UgcmVhZChUaGlzLCA4KSBvZgotICAgICAgICB7b2ssIDw8VmFsOjY0L2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge29rLCBWYWx9OwotICAgICAgICBFbHNlIC0+IEVsc2UKK3JlYWQoVGhpczAsIGk2NCkgLT4KKyAgICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgOCksCisgICAgY2FzZSBCeXRlcyBvZgorICAgICAgICB7b2ssIDw8VmFsOjY0L2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgICAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KICAgICBlbmQ7CiAKLXJlYWQoVGhpcywgZG91YmxlKSAtPgotICAgIGNhc2UgcmVhZChUaGlzLCA4KSBvZgotICAgICAgICB7b2ssIDw8VmFsOjY0L2Zsb2F0LXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtvaywgVmFsfTsKLSAgICAgICAgRWxzZSAtPiBFbHNlCityZWFkKFRoaXMwLCBkb3VibGUpIC0+CisgICAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDgpLAorICAgIGNhc2UgQnl0ZXMgb2YKKyAgICAgICAge29rLCA8PFZhbDo2NC9mbG9hdC1zaWduZWQtYmlnLCBfL2JpbmFyeT4+fSAtPiB7VGhpczEsIHtvaywgVmFsfX07CisgICAgICAgIEVsc2UgLT4ge1RoaXMxLCBFbHNlfQogICAgIGVuZDsKIAogJSByZXR1cm5zIGEgYmluYXJ5IGRpcmVjdGx5LCBjYWxsIGJpbmFyeV90b19saXN0IGlmIG5lY2Vzc2FyeQotcmVhZChUaGlzLCBzdHJpbmcpIC0+Ci0gICAge29rLCBTen0gID0gcmVhZChUaGlzLCBpMzIpLAotICAgIHtvaywgQmlufSA9IHJlYWQoVGhpcywgU3opOworcmVhZChUaGlzMCwgc3RyaW5nKSAtPgorICAgIHtUaGlzMSwge29rLCBTen19ICA9IHJlYWQoVGhpczAsIGkzMiksCisgICAgcmVhZF9kYXRhKFRoaXMxLCBTeikuCiAKLXJlYWQoVGhpcywgMCkgLT4ge29rLCA8PD4+fTsKLXJlYWQoVGhpcywgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KLSAgICB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoVGhpcyNiaW5hcnlfcHJvdG9jb2wudHJhbnNwb3J0LCBMZW4pLgorLXNwZWMgcmVhZF9kYXRhKCNiaW5hcnlfcHJvdG9jb2x7fSwgbm9uX25lZ19pbnRlZ2VyKCkpIC0+CisgICAgeyNiaW5hcnlfcHJvdG9jb2x7fSwge29rLCBiaW5hcnkoKX0gfCB7ZXJyb3IsIF9SZWFzb259fS4KK3JlYWRfZGF0YShUaGlzLCAwKSAtPiB7VGhpcywge29rLCA8PD4+fX07CityZWFkX2RhdGEoVGhpcyA9ICNiaW5hcnlfcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnN9LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIGFuZGFsc28gTGVuID4gMCAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoVHJhbnMsIExlbiksCisgICAge1RoaXMjYmluYXJ5X3Byb3RvY29se3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCiAKIAogJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQpAQCAtMzE1LDExICszMzMsMTUgQEAKIG5ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIE9wdGlvbnMpIC0+CiAgICAgUGFyc2VkT3B0cyA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjdGJwX29wdHN7fSksCiAgICAgRiA9IGZ1bigpIC0+Ci0gICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgICAgICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KAotICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgW3tzdHJpY3RfcmVhZCwgIFBhcnNlZE9wdHMjdGJwX29wdHMuc3RyaWN0X3JlYWR9LAotICAgICAgICAgICAgICAgICAgIHtzdHJpY3Rfd3JpdGUsIFBhcnNlZE9wdHMjdGJwX29wdHMuc3RyaWN0X3dyaXRlfV0pCisgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydEZhY3RvcnkoKSBvZgorICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3N0cmljdF9yZWFkLCAgUGFyc2VkT3B0cyN0YnBfb3B0cy5zdHJpY3RfcmVhZH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHJpY3Rfd3JpdGUsIFBhcnNlZE9wdHMjdGJwX29wdHMuc3RyaWN0X3dyaXRlfV0pOworICAgICAgICAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgICAgICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0KKyAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgZW5kLAogICAgIHtvaywgRn0uCiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKaW5kZXggZWJjMTZiZC4uZTlkM2ZmZiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKQEAgLTE5LDE2MiArMTksODAgQEAKIAogLW1vZHVsZSh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0KS4KIAotLWJlaGF2aW91cihnZW5fc2VydmVyKS4KIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLSUlIEFQSQotLWV4cG9ydChbbmV3LzEsIG5ld190cmFuc3BvcnRfZmFjdG9yeS8xXSkuCi0KLSUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCi0tZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIGhhbmRsZV9pbmZvLzIsCi0gICAgICAgICB0ZXJtaW5hdGUvMiwgY29kZV9jaGFuZ2UvM10pLgotCi0lJSB0aHJpZnRfdHJhbnNwb3J0IGNhbGxiYWNrcwotLWV4cG9ydChbd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCi0KLS1yZWNvcmQoYnVmZmVyZWRfdHJhbnNwb3J0LCB7d3JhcHBlZCwgJSBhIHRocmlmdF90cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyICUgaW9saXN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KLQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUgQVBJCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogc3RhcnRfbGluaygpIC0+IHtvayxQaWR9IHwgaWdub3JlIHwge2Vycm9yLEVycm9yfQotJSUgRGVzY3JpcHRpb246IFN0YXJ0cyB0aGUgc2VydmVyCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uZXcoV3JhcHBlZFRyYW5zcG9ydCkgLT4KLSAgICBjYXNlIGdlbl9zZXJ2ZXI6c3RhcnRfbGluayg/TU9EVUxFLCBbV3JhcHBlZFRyYW5zcG9ydF0sIFtdKSBvZgotICAgICAgICB7b2ssIFBpZH0gLT4KLSAgICAgICAgICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFBpZCk7Ci0gICAgICAgIEVsc2UgLT4KLSAgICAgICAgICAgIEVsc2UKLSAgICBlbmQuCislJSBjb25zdHJ1Y3RvcgorLWV4cG9ydChbbmV3LzFdKS4KKyUlIHByb3RvY29sIGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8xXSkuCiAKIAorLXJlY29yZCh0X2J1ZmZlcmVkLCB7CisgIHdyYXBwZWQsCisgIHdyaXRlX2J1ZmZlcgorfSkuCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiB3cml0ZShUcmFuc3BvcnQsIERhdGEpIC0+IG9rCi0lJQotJSUgRGF0YSA9IGlvbGlzdCgpCi0lJQotJSUgRGVzY3JpcHRpb246IFdyaXRlcyBkYXRhIGludG8gdGhlIGJ1ZmZlcgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotd3JpdGUoVHJhbnNwb3J0LCBEYXRhKSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FsbChUcmFuc3BvcnQsIHt3cml0ZSwgRGF0YX0pLgorLXR5cGUgc3RhdGUoKSA6OiAjdF9idWZmZXJlZHt9LgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogZmx1c2goVHJhbnNwb3J0KSAtPiBvawotJSUKLSUlIERlc2NyaXB0aW9uOiBGbHVzaGVzIHRoZSBidWZmZXIgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWZsdXNoKFRyYW5zcG9ydCkgLT4KLSAgICBnZW5fc2VydmVyOmNhbGwoVHJhbnNwb3J0LCBmbHVzaCkuCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBjbG9zZShUcmFuc3BvcnQpIC0+IG9rCi0lJQotJSUgRGVzY3JpcHRpb246IENsb3NlcyB0aGUgdHJhbnNwb3J0IGFuZCB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsb3NlKFRyYW5zcG9ydCkgLT4KLSAgICBnZW5fc2VydmVyOmNhc3QoVHJhbnNwb3J0LCBjbG9zZSkuCistc3BlYyBuZXcoVHJhbnNwb3J0Ojp0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IFJlYWQoVHJhbnNwb3J0LCBMZW4pIC0+IHtvaywgRGF0YX0KLSUlCi0lJSBEYXRhID0gYmluYXJ5KCkKLSUlCi0lJSBEZXNjcmlwdGlvbjogUmVhZHMgZGF0YSB0aHJvdWdoIGZyb20gdGhlIHdyYXBwZWQgdHJhbnNvcHJ0Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yZWFkKFRyYW5zcG9ydCwgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FsbChUcmFuc3BvcnQsIHtyZWFkLCBMZW59LCBfVGltZW91dD0xMDAwMCkuCituZXcoV3JhcHBlZCkgLT4KKyAgU3RhdGUgPSAjdF9idWZmZXJlZHsKKyAgICB3cmFwcGVkID0gV3JhcHBlZCwKKyAgICB3cml0ZV9idWZmZXIgPSBbXQorICB9LAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCiAKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBpbml0KEFyZ3MpIC0+IHtvaywgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSAgICAgICAgICAgICAgIHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb259Ci0lJSBEZXNjcmlwdGlvbjogSW5pdGlhdGVzIHRoZSBzZXJ2ZXIKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWluaXQoW1dyYXBwZWRdKSAtPgotICAgIHtvaywgI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyID0gW119fS4KKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246ICUlIGhhbmRsZV9jYWxsKFJlcXVlc3QsIEZyb20sIFN0YXRlKSAtPiB7cmVwbHksIFJlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXBseSwgUmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FsbCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2NhbGwoe3dyaXRlLCBEYXRhfSwgX0Zyb20sIFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBXQnVmfSkgLT4KLSAgICB7cmVwbHksIG9rLCBTdGF0ZSNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW1dCdWYsIERhdGFdfX07CiAKLWhhbmRsZV9jYWxsKHtyZWFkLCBMZW59LCBfRnJvbSwgU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkfSkgLT4KLSAgICBSZXNwb25zZSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkLCBMZW4pLAotICAgIHtyZXBseSwgUmVzcG9uc2UsIFN0YXRlfTsKKyUlIHJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAorcmVhZChTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIHtOZXdTdGF0ZSwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQsIExlbiksCisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBOZXdTdGF0ZX0sIFJlc3BvbnNlfS4KIAotaGFuZGxlX2NhbGwoZmx1c2gsIF9Gcm9tLCBTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBXcmFwcGVkfSkgLT4KLSAgICBSZXNwb25zZSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgV0J1ZiksCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcmFwcGVkKSwKLSAgICB7cmVwbHksIFJlc3BvbnNlLCBTdGF0ZSNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW119fS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGhhbmRsZV9jYXN0KE1zZywgU3RhdGUpIC0+IHtub3JlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQotJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhc3QgbWVzc2FnZXMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWhhbmRsZV9jYXN0KGNsb3NlLCBTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IFdyYXBwZWR9KSAtPgotICAgIHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgV0J1ZiksCi0gICAgJSUgV3JhcHBlZCBpcyBjbG9zZWQgYnkgdGVybWluYXRlLzIKLSAgICAlJSAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0IH5wOiBjbG9zaW5nIiwgW3NlbGYoKV0pLAotICAgIHtzdG9wLCBub3JtYWwsIFN0YXRlfTsKLWhhbmRsZV9jYXN0KE1zZywgU3RhdGU9I2J1ZmZlcmVkX3RyYW5zcG9ydHt9KSAtPgotICAgIHtub3JlcGx5LCBTdGF0ZX0uCislJSByZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdChXcmFwcGVkLCBMZW4pLAorICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBSZXNwb25zZX0uCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBoYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZSkgLT4ge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBhbGwgbm9uIGNhbGwvY2FzdCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2luZm8oX0luZm8sIFN0YXRlKSAtPgotICAgIHtub3JlcGx5LCBTdGF0ZX0uCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiB0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4gdm9pZCgpCi0lJSBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBnZW5fc2VydmVyIHdoZW4gaXQgaXMgYWJvdXQgdG8KLSUlIHRlcm1pbmF0ZS4gSXQgc2hvdWxkIGJlIHRoZSBvcHBvc2l0ZSBvZiBNb2R1bGU6aW5pdC8xIGFuZCBkbyBhbnkgbmVjZXNzYXJ5Ci0lJSBjbGVhbmluZyB1cC4gV2hlbiBpdCByZXR1cm5zLCB0aGUgZ2VuX3NlcnZlciB0ZXJtaW5hdGVzIHdpdGggUmVhc29uLgotJSUgVGhlIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdGVybWluYXRlKF9SZWFzb24sIFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkPVdyYXBwZWR9KSAtPgotICAgIHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCksCi0gICAgb2suCit3cml0ZShTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcn0sIERhdGEpIC0+CisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyaXRlX2J1ZmZlciA9IFtCdWZmZXIsIERhdGFdfSwgb2t9LgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jOiBjb2RlX2NoYW5nZShPbGRWc24sIFN0YXRlLCBFeHRyYSkgLT4ge29rLCBOZXdTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvZGVfY2hhbmdlKF9PbGRWc24sIFN0YXRlLCBfRXh0cmEpIC0+Ci0gICAge29rLCBTdGF0ZX0uCisKK2ZsdXNoKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHdyaXRlX2J1ZmZlciA9IEJ1ZmZlcn0pIC0+CisgIGNhc2UgaW9saXN0X3NpemUoQnVmZmVyKSBvZgorICAgICUlIGlmIHdyaXRlIGJ1ZmZlciBpcyBlbXB0eSwgZG8gbm90aGluZworICAgIDAgLT4ge1N0YXRlLCBva307CisgICAgXyAtPgorICAgICAge1dyaXR0ZW4sIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgQnVmZmVyKSwKKyAgICAgIHtGbHVzaGVkLCBva30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyaXR0ZW4pLAorICAgICAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IEZsdXNoZWQsIHdyaXRlX2J1ZmZlciA9IFtdfSwgUmVzcG9uc2V9CisgIGVuZC4KKworCitjbG9zZShTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkfSkgLT4KKyAge0Nsb3NlZCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCksCisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBDbG9zZWR9LCBSZXN1bHR9LgorCiAKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSBJbnRlcm5hbCBmdW5jdGlvbnMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKIG5ld190cmFuc3BvcnRfZmFjdG9yeShXcmFwRmFjdG9yeSkgLT4KLSAgICBGID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICB7b2ssIFdyYXBwZWR9ID0gV3JhcEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBuZXcoV3JhcHBlZCkKLSAgICAgICAgZW5kLAotICAgIHtvaywgRn0uCisgIEYgPSBmdW4oKSAtPgorICAgIHtvaywgV3JhcHBlZH0gPSBXcmFwRmFjdG9yeSgpLAorICAgIG5ldyhXcmFwcGVkKQorICBlbmQsCisgIHtvaywgRn0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKaW5kZXggZDViYjE0Ni4uMWE5Y2I1MCAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwKQEAgLTE5LDM2NiArMTksMTQ0IEBACiAKIC1tb2R1bGUodGhyaWZ0X2NsaWVudCkuCiAKLS1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCi0KICUlIEFQSQotLWV4cG9ydChbc3RhcnRfbGluay8yLCBzdGFydF9saW5rLzMsIHN0YXJ0X2xpbmsvNCwKLSAgICAgICAgIHN0YXJ0LzMsIHN0YXJ0LzQsCi0gICAgICAgICBjYWxsLzMsIHNlbmRfY2FsbC8zLCBjbG9zZS8xXSkuCi0KLSUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCi0tZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIGhhbmRsZV9pbmZvLzIsCi0gICAgICAgICB0ZXJtaW5hdGUvMiwgY29kZV9jaGFuZ2UvM10pLgotCistZXhwb3J0KFtuZXcvMiwgY2FsbC8zLCBzZW5kX2NhbGwvMywgY2xvc2UvMV0pLgogCiAtaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KIC1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCiAKLS1yZWNvcmQoc3RhdGUsIHtzZXJ2aWNlLCBwcm90b2NvbCwgc2VxaWR9KS4KLQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUgQVBJCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogc3RhcnRfbGluaygpIC0+IHtvayxQaWR9IHwgaWdub3JlIHwge2Vycm9yLEVycm9yfQotJSUgRGVzY3JpcHRpb246IFN0YXJ0cyB0aGUgc2VydmVyIGFzIGEgbGlua2VkIHByb2Nlc3MuCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGFydF9saW5rKEhvc3QsIFBvcnQsIFNlcnZpY2UpIHdoZW4gaXNfaW50ZWdlcihQb3J0KSwgaXNfYXRvbShTZXJ2aWNlKSAtPgotICAgIHN0YXJ0X2xpbmsoSG9zdCwgUG9ydCwgU2VydmljZSwgW10pLgotCi1zdGFydF9saW5rKEhvc3QsIFBvcnQsIFNlcnZpY2UsIE9wdGlvbnMpIC0+Ci0gICAgc3RhcnQoSG9zdCwgUG9ydCwgU2VydmljZSwgW3ttb25pdG9yLCBsaW5rfSB8IE9wdGlvbnNdKS4KLQotc3RhcnRfbGluayhQcm90b2NvbEZhY3RvcnksIFNlcnZpY2UpIC0+Ci0gICAgc3RhcnQoUHJvdG9jb2xGYWN0b3J5LCBTZXJ2aWNlLCBbe21vbml0b3IsIGxpbmt9XSkuCi0KLSUlCi0lJSBTcGxpdHMgY2xpZW50IG9wdGlvbnMgaW50byBwcm90b2NvbCBvcHRpb25zIGFuZCB0cmFuc3BvcnQgb3B0aW9ucwotJSUKLSUlIHNwbGl0X29wdGlvbnMoW09wdGlvbnMuLi5dKSAtPiB7UHJvdG9jb2xPcHRpb25zLCBUcmFuc3BvcnRPcHRpb25zfQotJSUKLXNwbGl0X29wdGlvbnMoT3B0aW9ucykgLT4KLSAgICBzcGxpdF9vcHRpb25zKE9wdGlvbnMsIFtdLCBbXSwgW10pLgotCi1zcGxpdF9vcHRpb25zKFtdLCBDbGllbnRJbiwgUHJvdG9JbiwgVHJhbnNJbikgLT4KLSAgICB7Q2xpZW50SW4sIFByb3RvSW4sIFRyYW5zSW59OwotCi1zcGxpdF9vcHRpb25zKFtPcHQgPSB7T3B0S2V5LCBffSB8IFJlc3RdLCBDbGllbnRJbiwgUHJvdG9JbiwgVHJhbnNJbikKLSAgd2hlbiBPcHRLZXkgPTo9IG1vbml0b3IgLT4KLSAgICBzcGxpdF9vcHRpb25zKFJlc3QsIFtPcHQgfCBDbGllbnRJbl0sIFByb3RvSW4sIFRyYW5zSW4pOwotCi1zcGxpdF9vcHRpb25zKFtPcHQgPSB7T3B0S2V5LCBffSB8IFJlc3RdLCBDbGllbnRJbiwgUHJvdG9JbiwgVHJhbnNJbikKLSAgd2hlbiBPcHRLZXkgPTo9IHN0cmljdF9yZWFkOwotICAgICAgIE9wdEtleSA9Oj0gc3RyaWN0X3dyaXRlIC0+Ci0gICAgc3BsaXRfb3B0aW9ucyhSZXN0LCBDbGllbnRJbiwgW09wdCB8IFByb3RvSW5dLCBUcmFuc0luKTsKLQotc3BsaXRfb3B0aW9ucyhbT3B0ID0ge09wdEtleSwgX30gfCBSZXN0XSwgQ2xpZW50SW4sIFByb3RvSW4sIFRyYW5zSW4pCi0gIHdoZW4gT3B0S2V5ID06PSBmcmFtZWQ7Ci0gICAgICAgT3B0S2V5ID06PSBjb25uZWN0X3RpbWVvdXQ7Ci0gICAgICAgT3B0S2V5ID06PSBzb2Nrb3B0cyAtPgotICAgIHNwbGl0X29wdGlvbnMoUmVzdCwgQ2xpZW50SW4sIFByb3RvSW4sIFtPcHQgfCBUcmFuc0luXSkuCistcmVjb3JkKHRjbGllbnQsIHtzZXJ2aWNlLCBwcm90b2NvbCwgc2VxaWR9KS4KIAogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogc3RhcnQoKSAtPiB7b2ssUGlkfSB8IGlnbm9yZSB8IHtlcnJvcixFcnJvcn0KLSUlIERlc2NyaXB0aW9uOiBTdGFydHMgdGhlIHNlcnZlciBhcyBhbiB1bmxpbmtlZCBwcm9jZXNzLgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmV3KFByb3RvY29sLCBTZXJ2aWNlKQorICB3aGVuIGlzX2F0b20oU2VydmljZSkgLT4KKyAgICB7b2ssICN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZSwKKyAgICAgICAgICAgICAgICAgIHNlcWlkID0gMH19LgogCi0lJSBCYWNrd2FyZHMtY29tcGF0aWJsZSBzdGFydGVyIGZvciB0aGUgY29tbW9uLWNhc2Ugb2Ygc29ja2V0IHRyYW5zcG9ydHMKLXN0YXJ0KEhvc3QsIFBvcnQsIFNlcnZpY2UsIE9wdGlvbnMpCi0gIHdoZW4gaXNfaW50ZWdlcihQb3J0KSwgaXNfYXRvbShTZXJ2aWNlKSwgaXNfbGlzdChPcHRpb25zKSAtPgotICAgIHtDbGllbnRPcHRzLCBQcm90b09wdHMsIFRyYW5zT3B0c30gPSBzcGxpdF9vcHRpb25zKE9wdGlvbnMpLAorLXNwZWMgY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4geyN0Y2xpZW50e30sIHtvaywgYW55KCl9IHwge2Vycm9yLCBhbnkoKX19LgorY2FsbChDbGllbnQgPSAjdGNsaWVudHt9LCBGdW5jdGlvbiwgQXJncykKK3doZW4gaXNfYXRvbShGdW5jdGlvbiksIGlzX2xpc3QoQXJncykgLT4KKyAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKKyAgICB7b2ssIENsaWVudDF9IC0+IHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KENsaWVudDEsIEZ1bmN0aW9uKTsKKyAgICB7e2Vycm9yLCBYfSwgQ2xpZW50MX0gLT4ge0NsaWVudDEsIHtlcnJvciwgWH19OworICAgIEVsc2UgLT4gRWxzZQorICBlbmQuCiAKLSAgICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIFRyYW5zT3B0cyksCi0KLSAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKLQotICAgIHN0YXJ0KFByb3RvY29sRmFjdG9yeSwgU2VydmljZSwgQ2xpZW50T3B0cykuCi0KLQotJSUgUHJvdG9jb2xGYWN0b3J5IDo6IGZ1bigpIC0+IHRocmlmdF9wcm90b2NvbCgpCi1zdGFydChQcm90b2NvbEZhY3RvcnksIFNlcnZpY2UsIENsaWVudE9wdHMpCi0gIHdoZW4gaXNfZnVuY3Rpb24oUHJvdG9jb2xGYWN0b3J5KSwgaXNfYXRvbShTZXJ2aWNlKSAtPgotICAgIHtTdGFydGVyLCBPcHRzfSA9Ci0gICAgICAgIGNhc2UgbGlzdHM6a2V5c2VhcmNoKG1vbml0b3IsIDEsIENsaWVudE9wdHMpIG9mCi0gICAgICAgICAgICB7dmFsdWUsIHttb25pdG9yLCBsaW5rfX0gLT4KLSAgICAgICAgICAgICAgICB7c3RhcnRfbGluaywgW119OwotICAgICAgICAgICAge3ZhbHVlLCB7bW9uaXRvciwgdGV0aGVyfX0gLT4KLSAgICAgICAgICAgICAgICB7c3RhcnQsIFt7dGV0aGVyLCBzZWxmKCl9XX07Ci0gICAgICAgICAgICBfIC0+Ci0gICAgICAgICAgICAgICAge3N0YXJ0LCBbXX0KLSAgICAgICAgZW5kLAotCi0gICAgQ29ubmVjdCA9Ci0gICAgICAgIGNhc2UgbGlzdHM6a2V5c2VhcmNoKGNvbm5lY3QsIDEsIENsaWVudE9wdHMpIG9mCi0gICAgICAgICAgICB7dmFsdWUsIHtjb25uZWN0LCBDaG9pY2V9fSAtPgotICAgICAgICAgICAgICAgIENob2ljZTsKLSAgICAgICAgICAgIF8gLT4KLSAgICAgICAgICAgICAgICAlJSBCeSBkZWZhdWx0LCBjb25uZWN0IGF0IGNyZWF0aW9uLXRpbWUuCi0gICAgICAgICAgICAgICAgdHJ1ZQotICAgICAgICBlbmQsCi0KLQotICAgIFN0YXJ0ZWQgPSBnZW5fc2VydmVyOlN0YXJ0ZXIoP01PRFVMRSwgW1NlcnZpY2UsIE9wdHNdLCBbXSksCi0KLSAgICBpZgotICAgICAgICBDb25uZWN0IC0+Ci0gICAgICAgICAgICBjYXNlIFN0YXJ0ZWQgb2YKLSAgICAgICAgICAgICAgICB7b2ssIFBpZH0gLT4KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBnZW5fc2VydmVyOmNhbGwoUGlkLCB7Y29ubmVjdCwgUHJvdG9jb2xGYWN0b3J5fSkgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIG9rIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBQaWR9OwotICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcgotICAgICAgICAgICAgICAgICAgICBlbmQ7Ci0gICAgICAgICAgICAgICAgRWxzZSAtPgotICAgICAgICAgICAgICAgICAgICBFbHNlCi0gICAgICAgICAgICBlbmQ7Ci0gICAgICAgIHRydWUgLT4KLSAgICAgICAgICAgIFN0YXJ0ZWQKLSAgICBlbmQuCi0KLWNhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykKLSAgd2hlbiBpc19waWQoQ2xpZW50KSwgaXNfYXRvbShGdW5jdGlvbiksIGlzX2xpc3QoQXJncykgLT4KLSAgICBjYXNlIGdlbl9zZXJ2ZXI6Y2FsbChDbGllbnQsIHtjYWxsLCBGdW5jdGlvbiwgQXJnc30pIG9mCi0gICAgICAgIFIgPSB7b2ssIF99IC0+IFI7Ci0gICAgICAgIFIgPSB7ZXJyb3IsIF99IC0+IFI7Ci0gICAgICAgIHtleGNlcHRpb24sIEV4Y2VwdGlvbn0gLT4gdGhyb3coRXhjZXB0aW9uKQotICAgIGVuZC4KLQotY2FzdChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKQotICB3aGVuIGlzX3BpZChDbGllbnQpLCBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FzdChDbGllbnQsIHtjYWxsLCBGdW5jdGlvbiwgQXJnc30pLgogCiAlJSBTZW5kcyBhIGZ1bmN0aW9uIGNhbGwgYnV0IGRvZXMgbm90IHJlYWQgdGhlIHJlc3VsdC4gVGhpcyBpcyB1c2VmdWwKICUlIGlmIHlvdSdyZSB0cnlpbmcgdG8gbG9nIG5vbi1vbmV3YXkgZnVuY3Rpb24gY2FsbHMgdG8gd3JpdGUtb25seQogJSUgdHJhbnNwb3J0cyBsaWtlIHRocmlmdF9kaXNrX2xvZ190cmFuc3BvcnQuCi1zZW5kX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykKLSAgd2hlbiBpc19waWQoQ2xpZW50KSwgaXNfYXRvbShGdW5jdGlvbiksIGlzX2xpc3QoQXJncykgLT4KLSAgICBnZW5fc2VydmVyOmNhbGwoQ2xpZW50LCB7c2VuZF9jYWxsLCBGdW5jdGlvbiwgQXJnc30pLgotCi1jbG9zZShDbGllbnQpIHdoZW4gaXNfcGlkKENsaWVudCkgLT4KLSAgICBnZW5fc2VydmVyOmNhc3QoQ2xpZW50LCBjbG9zZSkuCi0KLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBpbml0KEFyZ3MpIC0+IHtvaywgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSAgICAgICAgICAgICAgIHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb259Ci0lJSBEZXNjcmlwdGlvbjogSW5pdGlhdGVzIHRoZSBzZXJ2ZXIKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWluaXQoW1NlcnZpY2UsIE9wdHNdKSAtPgotICAgIGNhc2UgbGlzdHM6a2V5c2VhcmNoKHRldGhlciwgMSwgT3B0cykgb2YKLSAgICAgICAge3ZhbHVlLCB7dGV0aGVyLCBQaWR9fSAtPgotICAgICAgICAgICAgZXJsYW5nOm1vbml0b3IocHJvY2VzcywgUGlkKTsKLSAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgIG9rCi0gICAgZW5kLAotICAgIHtvaywgI3N0YXRle3NlcnZpY2UgPSBTZXJ2aWNlfX0uCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiAlJSBoYW5kbGVfY2FsbChSZXF1ZXN0LCBGcm9tLCBTdGF0ZSkgLT4ge3JlcGx5LCBSZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVwbHksIFJlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFJlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQotJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhbGwgbWVzc2FnZXMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWhhbmRsZV9jYWxsKHtjb25uZWN0LCBQcm90b2NvbEZhY3Rvcnl9LCBfRnJvbSwKLSAgICAgICAgICAgIFN0YXRlID0gI3N0YXRle3NlcnZpY2UgPSBTZXJ2aWNlfSkgLT4KLSAgICBjYXNlIFByb3RvY29sRmFjdG9yeSgpIG9mCi0gICAgICAgIHtvaywgUHJvdG9jb2x9IC0+Ci0gICAgICAgICAgICB7cmVwbHksIG9rLCBTdGF0ZSNzdGF0ZXtwcm90b2NvbCA9IFByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSAwfX07Ci0gICAgICAgIEVycm9yIC0+Ci0gICAgICAgICAgICB7c3RvcCwgbm9ybWFsLCBFcnJvciwgU3RhdGV9Ci0gICAgZW5kOwotCi1oYW5kbGVfY2FsbCh7Y2FsbCwgRnVuY3Rpb24sIEFyZ3N9LCBfRnJvbSwgU3RhdGUgPSAjc3RhdGV7c2VydmljZSA9IFNlcnZpY2V9KSAtPgotICAgIFJlc3VsdCA9IGNhdGNoX2Z1bmN0aW9uX2V4Y2VwdGlvbnMoCi0gICAgICAgICAgICAgICBmdW4oKSAtPgotICAgICAgICAgICAgICAgICAgICAgICBvayA9IHNlbmRfZnVuY3Rpb25fY2FsbChTdGF0ZSwgRnVuY3Rpb24sIEFyZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX2Z1bmN0aW9uX3Jlc3VsdChTdGF0ZSwgRnVuY3Rpb24pCi0gICAgICAgICAgICAgICBlbmQsCi0gICAgICAgICAgICAgICBTZXJ2aWNlKSwKLSAgICB7cmVwbHksIFJlc3VsdCwgU3RhdGV9OwotCi0KLWhhbmRsZV9jYWxsKHtzZW5kX2NhbGwsIEZ1bmN0aW9uLCBBcmdzfSwgX0Zyb20sIFN0YXRlID0gI3N0YXRle3NlcnZpY2UgPSBTZXJ2aWNlfSkgLT4KLSAgICBSZXN1bHQgPSBjYXRjaF9mdW5jdGlvbl9leGNlcHRpb25zKAotICAgICAgICAgICAgICAgZnVuKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9mdW5jdGlvbl9jYWxsKFN0YXRlLCBGdW5jdGlvbiwgQXJncykKLSAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgIFNlcnZpY2UpLAotICAgIHtyZXBseSwgUmVzdWx0LCBTdGF0ZX0uCi0KLQotJSUgSGVscGVyIGZ1bmN0aW9uIHRoYXQgY2F0Y2hlcyBleGNlcHRpb25zIHRocm93biBieSBzZW5kaW5nIG9yIHJlY2VpdmluZwotJSUgYSBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGUgY29ycmVjdCByZXNwb25zZSBmb3IgY2FsbCBvciBzZW5kX29ubHkgYWJvdmUuCi1jYXRjaF9mdW5jdGlvbl9leGNlcHRpb25zKEZ1biwgU2VydmljZSkgLT4KLSAgICB0cnkKLSAgICAgICAgRnVuKCkKLSAgICBjYXRjaAotICAgICAgICB0aHJvdzp7cmV0dXJuLCBSZXR1cm59IC0+Ci0gICAgICAgICAgICBSZXR1cm47Ci0gICAgICAgICAgZXJyb3I6ZnVuY3Rpb25fY2xhdXNlIC0+Ci0gICAgICAgICAgICBTVCA9IGVybGFuZzpnZXRfc3RhY2t0cmFjZSgpLAotICAgICAgICAgICAgY2FzZSBoZChTVCkgb2YKLSAgICAgICAgICAgICAgICB7U2VydmljZSwgZnVuY3Rpb25faW5mbywgW0Z1bmN0aW9uLCBfXX0gLT4KLSAgICAgICAgICAgICAgICAgICAge2Vycm9yLCB7bm9fZnVuY3Rpb24sIEZ1bmN0aW9ufX07Ci0gICAgICAgICAgICAgICAgXyAtPiB0aHJvdyh7ZXJyb3IsIHtmdW5jdGlvbl9jbGF1c2UsIFNUfX0pCi0gICAgICAgICAgICBlbmQKKy1zcGVjIHNlbmRfY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4geyN0Y2xpZW50e30sIG9rfS4KK3NlbmRfY2FsbChDbGllbnQgPSAjdGNsaWVudHt9LCBGdW5jdGlvbiwgQXJncykKKyAgd2hlbiBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgorICAgIGNhc2Ugc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MpIG9mCisgICAgICB7b2ssIENsaWVudDF9IC0+IHtDbGllbnQxLCBva307CisgICAgICBFbHNlIC0+IEVsc2UKICAgICBlbmQuCiAKKy1zcGVjIGNsb3NlKCN0Y2xpZW50e30pIC0+IG9rLgorY2xvc2UoI3RjbGllbnR7cHJvdG9jb2w9UHJvdG9jb2x9KSAtPgorICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG9jb2wpLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogaGFuZGxlX2Nhc3QoTXNnLCBTdGF0ZSkgLT4ge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FzdCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2Nhc3Qoe2NhbGwsIEZ1bmN0aW9uLCBBcmdzfSwgU3RhdGUgPSAjc3RhdGV7c2VydmljZSA9IFNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH0pIC0+Ci0gICAgX1Jlc3VsdCA9Ci0gICAgICAgIHRyeQotICAgICAgICAgICAgb2sgPSBzZW5kX2Z1bmN0aW9uX2NhbGwoU3RhdGUsIEZ1bmN0aW9uLCBBcmdzKSwKLSAgICAgICAgICAgIHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KFN0YXRlLCBGdW5jdGlvbikKLSAgICAgICAgY2F0Y2gKLSAgICAgICAgICAgIENsYXNzOlJlYXNvbiAtPgotICAgICAgICAgICAgICAgIGVycm9yX2xvZ2dlcjplcnJvcl9tc2coImVycm9yIGlnbm9yZWQgaW4gaGFuZGxlX2Nhc3Qoe2Nhc3QsLi4ufSwuLi4pOiB+cDp+cH5uIiwgW0NsYXNzLCBSZWFzb25dKQotICAgICAgICBlbmQsCi0KLSAgICB7bm9yZXBseSwgU3RhdGV9OwotCi1oYW5kbGVfY2FzdChjbG9zZSwgU3RhdGU9I3N0YXRle3Byb3RvY29sID0gUHJvdG9jb2x9KSAtPgotJSUgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGhyaWZ0X2NsaWVudCB+cCByZWNlaXZlZCBjbG9zZSIsIFtzZWxmKCldKSwKLSAgICB7c3RvcCxub3JtYWwsU3RhdGV9OwotaGFuZGxlX2Nhc3QoX01zZywgU3RhdGUpIC0+Ci0gICAge25vcmVwbHksIFN0YXRlfS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGhhbmRsZV9pbmZvKEluZm8sIFN0YXRlKSAtPiB7bm9yZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQotJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGFsbCBub24gY2FsbC9jYXN0IG1lc3NhZ2VzCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1oYW5kbGVfaW5mbyh7J0RPV04nLCBNb25pdG9yUmVmLCBwcm9jZXNzLCBQaWQsIF9JbmZvfSwgU3RhdGUpCi0gIHdoZW4gaXNfcmVmZXJlbmNlKE1vbml0b3JSZWYpLCBpc19waWQoUGlkKSAtPgotICAgICUlIFdlIGRvbid0IGFjdHVhbGx5IHZlcmlmeSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIERPV04gbWVzc2FnZS4KLSAgICB7c3RvcCwgcGFyZW50X2RpZWQsIFN0YXRlfTsKLQotaGFuZGxlX2luZm8oX0luZm8sIFN0YXRlKSAtPgotICAgIHtub3JlcGx5LCBTdGF0ZX0uCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiB0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4gdm9pZCgpCi0lJSBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBnZW5fc2VydmVyIHdoZW4gaXQgaXMgYWJvdXQgdG8KLSUlIHRlcm1pbmF0ZS4gSXQgc2hvdWxkIGJlIHRoZSBvcHBvc2l0ZSBvZiBNb2R1bGU6aW5pdC8xIGFuZCBkbyBhbnkgbmVjZXNzYXJ5Ci0lJSBjbGVhbmluZyB1cC4gV2hlbiBpdCByZXR1cm5zLCB0aGUgZ2VuX3NlcnZlciB0ZXJtaW5hdGVzIHdpdGggUmVhc29uLgotJSUgVGhlIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdGVybWluYXRlKFJlYXNvbiwgU3RhdGUgPSAjc3RhdGV7cHJvdG9jb2w9dW5kZWZpbmVkfSkgLT4KLSAgICBvazsKLXRlcm1pbmF0ZShSZWFzb24sIFN0YXRlID0gI3N0YXRle3Byb3RvY29sPVByb3RvY29sfSkgLT4KLSAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvY29sKSwKLSAgICBvay4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuYzogY29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZSwgRXh0cmEpIC0+IHtvaywgTmV3U3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogQ29udmVydCBwcm9jZXNzIHN0YXRlIHdoZW4gY29kZSBpcyBjaGFuZ2VkCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jb2RlX2NoYW5nZShfT2xkVnNuLCBTdGF0ZSwgX0V4dHJhKSAtPgotICAgIHtvaywgU3RhdGV9LgogCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlJSUgSW50ZXJuYWwgZnVuY3Rpb25zCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zZW5kX2Z1bmN0aW9uX2NhbGwoI3N0YXRle3Byb3RvY29sID0gUHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgID0gU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgICAgPSBTZXFJZH0sCi0gICAgICAgICAgICAgICAgICAgRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgQXJncykgLT4KLSAgICBQYXJhbXMgPSBTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKSwKLSAgICB7c3RydWN0LCBQTGlzdH0gPSBQYXJhbXMsCi0gICAgaWYKLSAgICAgICAgbGVuZ3RoKFBMaXN0KSA9Lz0gbGVuZ3RoKEFyZ3MpIC0+Ci0gICAgICAgICAgICB0aHJvdyh7cmV0dXJuLCB7ZXJyb3IsIHtiYWRfYXJncywgRnVuY3Rpb24sIEFyZ3N9fX0pOwotICAgICAgICB0cnVlIC0+IG9rCi0gICAgZW5kLAorLXNwZWMgc2VuZF9mdW5jdGlvbl9jYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7b2sgfCB7ZXJyb3IsIGFueSgpfSwgI3RjbGllbnR7fX0uCitzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50ID0gI3RjbGllbnR7c2VydmljZSA9IFNlcnZpY2V9LCBGdW5jdGlvbiwgQXJncykgLT4KKyAge1BhcmFtcywgUmVwbHl9ID0gdHJ5CisgICAge1NlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpLCBTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpfQorICBjYXRjaCBlcnJvcjpmdW5jdGlvbl9jbGF1c2UgLT4ge25vX2Z1bmN0aW9uLCAwfQorICBlbmQsCisgIE1zZ1R5cGUgPSBjYXNlIFJlcGx5IG9mCisgICAgb25ld2F5X3ZvaWQgLT4gP3RNZXNzYWdlVHlwZV9PTkVXQVk7CisgICAgXyAtPiA/dE1lc3NhZ2VUeXBlX0NBTEwKKyAgZW5kLAorICBjYXNlIFBhcmFtcyBvZgorICAgIG5vX2Z1bmN0aW9uIC0+CisgICAgICB7e2Vycm9yLCB7bm9fZnVuY3Rpb24sIEZ1bmN0aW9ufX0sIENsaWVudH07CisgICAge3N0cnVjdCwgUExpc3R9IHdoZW4gbGVuZ3RoKFBMaXN0KSA9Lz0gbGVuZ3RoKEFyZ3MpIC0+CisgICAgICB7e2Vycm9yLCB7YmFkX2FyZ3MsIEZ1bmN0aW9uLCBBcmdzfX0sIENsaWVudH07CisgICAge3N0cnVjdCwgX1BMaXN0fSAtPiB3cml0ZV9tZXNzYWdlKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MsIFBhcmFtcywgTXNnVHlwZSkKKyAgZW5kLgogCi0gICAgQmVnaW4gPSAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lID0gYXRvbV90b19saXN0KEZ1bmN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSA/dE1lc3NhZ2VUeXBlX0NBTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfSwKLSAgICBvayA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bywgQmVnaW4pLAotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvLCB7UGFyYW1zLCBsaXN0X3RvX3R1cGxlKFtGdW5jdGlvbiB8IEFyZ3NdKX0pLAotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvLCBtZXNzYWdlX2VuZCksCi0gICAgdGhyaWZ0X3Byb3RvY29sOmZsdXNoX3RyYW5zcG9ydChQcm90byksCi0gICAgb2suCistc3BlYyB3cml0ZV9tZXNzYWdlKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpLCB7c3RydWN0LCBsaXN0KCl9LCBpbnRlZ2VyKCkpIC0+CisgIHtvayB8IHtlcnJvciwgYW55KCl9LCAjdGNsaWVudHt9fS4KK3dyaXRlX21lc3NhZ2UoQ2xpZW50ID0gI3RjbGllbnR7cHJvdG9jb2wgPSBQMCwgc2VxaWQgPSBTZXF9LCBGdW5jdGlvbiwgQXJncywgUGFyYW1zLCBNc2dUeXBlKSAtPgorICB0cnkKKyAgICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CisgICAgICBuYW1lID0gYXRvbV90b19saXN0KEZ1bmN0aW9uKSwKKyAgICAgIHR5cGUgPSBNc2dUeXBlLAorICAgICAgc2VxaWQgPSBTZXEKKyAgICB9KSwKKyAgICB7UDIsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMSwge1BhcmFtcywgbGlzdF90b190dXBsZShbRnVuY3Rpb258QXJnc10pfSksCisgICAge1AzLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDIsIG1lc3NhZ2VfZW5kKSwKKyAgICB7UDQsIG9rfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoUDMpLAorICAgIHtvaywgQ2xpZW50I3RjbGllbnR7cHJvdG9jb2wgPSBQNH19CisgIGNhdGNoCisgICAgZXJyb3I6e2JhZG1hdGNoLCB7Xywge2Vycm9yLCBffSA9IEVycm9yfX0gLT4ge0Vycm9yLCBDbGllbnR9CisgIGVuZC4KIAotcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoU3RhdGUgPSAjc3RhdGV7cHJvdG9jb2wgPSBQcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uKSAtPgorLXNwZWMgcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoI3RjbGllbnR7fSwgYXRvbSgpKSAtPiB7I3RjbGllbnR7fSwge29rLCBhbnkoKX0gfCB7ZXJyb3IsIGFueSgpfX0uCityZWNlaXZlX2Z1bmN0aW9uX3Jlc3VsdChDbGllbnQgPSAjdGNsaWVudHtzZXJ2aWNlID0gU2VydmljZX0sIEZ1bmN0aW9uKSAtPgogICAgIFJlc3VsdFR5cGUgPSBTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpLAotICAgIHJlYWRfcmVzdWx0KFN0YXRlLCBGdW5jdGlvbiwgUmVzdWx0VHlwZSkuCisgICAgcmVhZF9yZXN1bHQoQ2xpZW50LCBGdW5jdGlvbiwgUmVzdWx0VHlwZSkuCiAKLXJlYWRfcmVzdWx0KF9TdGF0ZSwKLSAgICAgICAgICAgIF9GdW5jdGlvbiwKLSAgICAgICAgICAgIG9uZXdheV92b2lkKSAtPgotICAgIHtvaywgb2t9OworcmVhZF9yZXN1bHQoQ2xpZW50LCBfRnVuY3Rpb24sIG9uZXdheV92b2lkKSAtPgorICAgIHtDbGllbnQsIHtvaywgb2t9fTsKIAotcmVhZF9yZXN1bHQoU3RhdGUgPSAjc3RhdGV7cHJvdG9jb2wgPSBQcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkICAgID0gU2VxSWR9LAorcmVhZF9yZXN1bHQoQ2xpZW50ID0gI3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCAgICA9IFNlcUlkfSwKICAgICAgICAgICAgIEZ1bmN0aW9uLAogICAgICAgICAgICAgUmVwbHlUeXBlKSAtPgotICAgIGNhc2UgdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8sIG1lc3NhZ2VfYmVnaW4pIG9mCi0gICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3NlcWlkID0gUmV0U2VxSWR9IHdoZW4gUmV0U2VxSWQgPS89IFNlcUlkIC0+Ci0gICAgICAgICAgICB7ZXJyb3IsIHtiYWRfc2VxX2lkLCBTZXFJZH19OwotCi0gICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3R5cGUgPSA/dE1lc3NhZ2VUeXBlX0VYQ0VQVElPTn0gLT4KLSAgICAgICAgICAgIGhhbmRsZV9hcHBsaWNhdGlvbl9leGNlcHRpb24oU3RhdGUpOwotCi0gICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3R5cGUgPSA/dE1lc3NhZ2VUeXBlX1JFUExZfSAtPgotICAgICAgICAgICAgaGFuZGxlX3JlcGx5KFN0YXRlLCBGdW5jdGlvbiwgUmVwbHlUeXBlKQorICAgIGNhc2UgdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8wLCBtZXNzYWdlX2JlZ2luKSBvZgorICAgICAgICAge1Byb3RvMSwge2Vycm9yLCBSZWFzb259fSAtPgorICAgICAgICAgICAgIE5ld0NsaWVudCA9IENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8xfSwKKyAgICAgICAgICAgICB7TmV3Q2xpZW50LCB7ZXJyb3IsIFJlYXNvbn19OworICAgICAgICAge1Byb3RvMSwgTWVzc2FnZUJlZ2lufSAtPgorICAgICAgICAgICAgIE5ld0NsaWVudCA9IENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8xfSwKKyAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VCZWdpbiBvZgorICAgICAgICAgICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntzZXFpZCA9IFJldFNlcUlkfSB3aGVuIFJldFNlcUlkID0vPSBTZXFJZCAtPgorICAgICAgICAgICAgICAgICAgICAge05ld0NsaWVudCwge2Vycm9yLCB7YmFkX3NlcV9pZCwgU2VxSWR9fX07CisgICAgICAgICAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3R5cGUgPSA/dE1lc3NhZ2VUeXBlX0VYQ0VQVElPTn0gLT4KKyAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9hcHBsaWNhdGlvbl9leGNlcHRpb24oTmV3Q2xpZW50KTsKKyAgICAgICAgICAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57dHlwZSA9ID90TWVzc2FnZVR5cGVfUkVQTFl9IC0+CisgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfcmVwbHkoTmV3Q2xpZW50LCBGdW5jdGlvbiwgUmVwbHlUeXBlKQorICAgICAgICAgICAgIGVuZAogICAgIGVuZC4KIAotaGFuZGxlX3JlcGx5KFN0YXRlID0gI3N0YXRle3Byb3RvY29sID0gUHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2V9LAorCitoYW5kbGVfcmVwbHkoQ2xpZW50ID0gI3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2V9LAogICAgICAgICAgICAgIEZ1bmN0aW9uLAogICAgICAgICAgICAgIFJlcGx5VHlwZSkgLT4KICAgICB7c3RydWN0LCBFeGNlcHRpb25GaWVsZHN9ID0gU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBleGNlcHRpb25zKSwKICAgICBSZXBseVN0cnVjdERlZiA9IHtzdHJ1Y3QsIFt7MCwgUmVwbHlUeXBlfV0gKysgRXhjZXB0aW9uRmllbGRzfSwKLSAgICB7b2ssIFJlcGx5fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvLCBSZXBseVN0cnVjdERlZiksCisgICAge1Byb3RvMSwge29rLCBSZXBseX19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8wLCBSZXBseVN0cnVjdERlZiksCisgICAge1Byb3RvMiwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8xLCBtZXNzYWdlX2VuZCksCisgICAgTmV3Q2xpZW50ID0gQ2xpZW50I3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzJ9LAogICAgIFJlcGx5TGlzdCA9IHR1cGxlX3RvX2xpc3QoUmVwbHkpLAogICAgIHRydWUgPSBsZW5ndGgoUmVwbHlMaXN0KSA9PSBsZW5ndGgoRXhjZXB0aW9uRmllbGRzKSArIDEsCiAgICAgRXhjZXB0aW9uVmFscyA9IHRsKFJlcGx5TGlzdCksCiAgICAgVGhyb3duID0gW1ggfHwgWCA8LSBFeGNlcHRpb25WYWxzLAogICAgICAgICAgICAgICAgICAgIFggPS89IHVuZGVmaW5lZF0sCi0gICAgUmVzdWx0ID0KLSAgICAgICAgY2FzZSBUaHJvd24gb2YKLSAgICAgICAgICAgIFtdIHdoZW4gUmVwbHlUeXBlID09IHtzdHJ1Y3QsIFtdfSAtPgotICAgICAgICAgICAgICAgIHtvaywgb2t9OwotICAgICAgICAgICAgW10gLT4KLSAgICAgICAgICAgICAgICB7b2ssIGhkKFJlcGx5TGlzdCl9OwotICAgICAgICAgICAgW0V4Y2VwdGlvbl0gLT4KLSAgICAgICAgICAgICAgICB7ZXhjZXB0aW9uLCBFeGNlcHRpb259Ci0gICAgICAgIGVuZCwKLSAgICBvayA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvLCBtZXNzYWdlX2VuZCksCi0gICAgUmVzdWx0LgorICAgIGNhc2UgVGhyb3duIG9mCisgICAgICAgIFtdIHdoZW4gUmVwbHlUeXBlID09IHtzdHJ1Y3QsIFtdfSAtPgorICAgICAgICAgICAge05ld0NsaWVudCwge29rLCBva319OworICAgICAgICBbXSAtPgorICAgICAgICAgICAge05ld0NsaWVudCwge29rLCBoZChSZXBseUxpc3QpfX07CisgICAgICAgIFtFeGNlcHRpb25dIC0+CisgICAgICAgICAgICB0aHJvdyh7TmV3Q2xpZW50LCB7ZXhjZXB0aW9uLCBFeGNlcHRpb259fSkKKyAgICBlbmQuCiAKLWhhbmRsZV9hcHBsaWNhdGlvbl9leGNlcHRpb24oU3RhdGUgPSAjc3RhdGV7cHJvdG9jb2wgPSBQcm90b30pIC0+Ci0gICAge29rLCBFeGNlcHRpb259ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP1RBcHBsaWNhdGlvbkV4Y2VwdGlvbl9TdHJ1Y3R1cmUpLAotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8sIG1lc3NhZ2VfZW5kKSwKK2hhbmRsZV9hcHBsaWNhdGlvbl9leGNlcHRpb24oQ2xpZW50ID0gI3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzB9KSAtPgorICAgIHtQcm90bzEsIHtvaywgRXhjZXB0aW9ufX0gPQorICAgICAgICB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bzAsID9UQXBwbGljYXRpb25FeGNlcHRpb25fU3RydWN0dXJlKSwKKyAgICB7UHJvdG8yLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bzEsIG1lc3NhZ2VfZW5kKSwKICAgICBYUmVjb3JkID0gbGlzdF90b190dXBsZSgKICAgICAgICAgICAgICAgICBbJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicgfCB0dXBsZV90b19saXN0KEV4Y2VwdGlvbildKSwKICAgICBlcnJvcl9sb2dnZXI6ZXJyb3JfbXNnKCJYOiB+cH5uIiwgW1hSZWNvcmRdKSwKICAgICB0cnVlID0gaXNfcmVjb3JkKFhSZWNvcmQsICdUQXBwbGljYXRpb25FeGNlcHRpb24nKSwKLSAgICB7ZXhjZXB0aW9uLCBYUmVjb3JkfS4KKyAgICBOZXdDbGllbnQgPSBDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMn0sCisgICAgdGhyb3coe05ld0NsaWVudCwge2V4Y2VwdGlvbiwgWFJlY29yZH19KS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50X3V0aWwuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYmU1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50X3V0aWwuZXJsCkBAIC0wLDAgKzEsMTEyIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0aHJpZnRfY2xpZW50X3V0aWwpLgorCistZXhwb3J0KFtuZXcvNF0pLgorLWV4cG9ydChbbmV3X211bHRpcGxleGVkLzMsIG5ld19tdWx0aXBsZXhlZC80XSkuCisKKy10eXBlIHNlcnZpY2VfbmFtZSgpICAgICAgICAgICAgOjogbm9uZW1wdHlfc3RyaW5nKCkuCistdHlwZSBzZXJ2aWNlX21vZHVsZSgpICAgICAgICAgIDo6IGF0b20oKS4KKy10eXBlIG11bHRpcGxleGVkX3NlcnZpY2VfbWFwKCkgOjogW3tTZXJ2aWNlTmFtZTo6c2VydmljZV9uYW1lKCksIFNlcnZpY2VNb2R1bGU6OnNlcnZpY2VfbW9kdWxlKCl9XS4KKworJSUKKyUlIFNwbGl0cyBjbGllbnQgb3B0aW9ucyBpbnRvIGNsaWVudCwgcHJvdG9jb2wsIGFuZCB0cmFuc3BvcnQgb3B0aW9ucworJSUKKyUlIHNwbGl0X29wdGlvbnMoW09wdGlvbnMuLi5dKSAtPiB7UHJvdG9jb2xPcHRpb25zLCBUcmFuc3BvcnRPcHRpb25zfQorJSUKK3NwbGl0X29wdGlvbnMoT3B0aW9ucykgLT4KKyAgICBzcGxpdF9vcHRpb25zKE9wdGlvbnMsIFtdLCBbXSkuCisKK3NwbGl0X29wdGlvbnMoW10sIFByb3RvSW4sIFRyYW5zSW4pIC0+CisgICAge1Byb3RvSW4sIFRyYW5zSW59OworCitzcGxpdF9vcHRpb25zKFtPcHQgPSB7T3B0S2V5LCBffSB8IFJlc3RdLCBQcm90b0luLCBUcmFuc0luKQorICB3aGVuIE9wdEtleSA9Oj0gc3RyaWN0X3JlYWQ7CisgICAgICAgT3B0S2V5ID06PSBzdHJpY3Rfd3JpdGU7CisgICAgICAgT3B0S2V5ID06PSBwcm90b2NvbCAtPgorICAgIHNwbGl0X29wdGlvbnMoUmVzdCwgW09wdCB8IFByb3RvSW5dLCBUcmFuc0luKTsKKworc3BsaXRfb3B0aW9ucyhbT3B0ID0ge09wdEtleSwgX30gfCBSZXN0XSwgUHJvdG9JbiwgVHJhbnNJbikKKyAgd2hlbiBPcHRLZXkgPTo9IGZyYW1lZDsKKyAgICAgICBPcHRLZXkgPTo9IGNvbm5lY3RfdGltZW91dDsKKyAgICAgICBPcHRLZXkgPTo9IHJlY3ZfdGltZW91dDsKKyAgICAgICBPcHRLZXkgPTo9IHNvY2tvcHRzOworICAgICAgIE9wdEtleSA9Oj0gc3NsdHJhbnNwb3J0OworICAgICAgIE9wdEtleSA9Oj0gc3Nsb3B0aW9ucy0+CisgICAgc3BsaXRfb3B0aW9ucyhSZXN0LCBQcm90b0luLCBbT3B0IHwgVHJhbnNJbl0pLgorCisKKyUlIENsaWVudCBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbW1vbi1jYXNlIG9mIHNvY2tldCB0cmFuc3BvcnRzCituZXcoSG9zdCwgUG9ydCwgU2VydmljZSwgT3B0aW9ucykKKyAgd2hlbiBpc19pbnRlZ2VyKFBvcnQpLCBpc19hdG9tKFNlcnZpY2UpLCBpc19saXN0KE9wdGlvbnMpIC0+CisgICAge1Byb3RvT3B0cywgVHJhbnNPcHRzMH0gPSBzcGxpdF9vcHRpb25zKE9wdGlvbnMpLAorCisgICAge1RyYW5zcG9ydE1vZHVsZSwgVHJhbnNPcHRzMn0gPSBjYXNlIGxpc3RzOmtleXRha2Uoc3NsdHJhbnNwb3J0LCAxLCBUcmFuc09wdHMwKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIHRydWV9LCBUcmFuc09wdHMxfSAtPiB7dGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQsIFRyYW5zT3B0czF9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHt0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwgVHJhbnNPcHRzMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKworICAgIHtQcm90b2NvbE1vZHVsZSwgUHJvdG9PcHRzMX0gPSBjYXNlIGxpc3RzOmtleXRha2UocHJvdG9jb2wsIDEsIFByb3RvT3B0cykgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWUsIHtfLCBjb21wYWN0fSwgT3B0c30gLT4ge3RocmlmdF9jb21wYWN0X3Byb3RvY29sLCBPcHRzfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWUsIHtfLCBqc29ufSwgT3B0c30gLT4ge3RocmlmdF9qc29uX3Byb3RvY29sLCBPcHRzfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWUsIHtfLCBiaW5hcnl9LCBPcHRzfSAtPiB7dGhyaWZ0X2JpbmFyeV9wcm90b2NvbCwgT3B0c307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4ge3RocmlmdF9iaW5hcnlfcHJvdG9jb2wsIFByb3RvT3B0c30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPQorICAgICAgICBUcmFuc3BvcnRNb2R1bGU6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIFRyYW5zT3B0czIpLAorCisgICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0gUHJvdG9jb2xNb2R1bGU6bmV3X3Byb3RvY29sX2ZhY3RvcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b09wdHMxKSwKKworICAgIGNhc2UgUHJvdG9jb2xGYWN0b3J5KCkgb2YKKyAgICAgICAge29rLCBQcm90b2NvbH0gLT4KKyAgICAgICAgICAgIHRocmlmdF9jbGllbnQ6bmV3KFByb3RvY29sLCBTZXJ2aWNlKTsKKyAgICAgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgICAgICAgIHtlcnJvciwgRXJyb3J9CisgICAgZW5kLgorCistc3BlYyBuZXdfbXVsdGlwbGV4ZWQoSG9zdCwgUG9ydCwgU2VydmljZXMsIE9wdGlvbnMpIC0+IHtvaywgU2VydmljZVRocmlmdENsaWVudExpc3R9IHdoZW4KKyAgICBIb3N0ICAgICAgICA6OiBub25lbXB0eV9zdHJpbmcoKSwKKyAgICBQb3J0ICAgICAgICA6OiBub25fbmVnX2ludGVnZXIoKSwKKyAgICBTZXJ2aWNlcyAgICA6OiBtdWx0aXBsZXhlZF9zZXJ2aWNlX21hcCgpLAorICAgIE9wdGlvbnMgICAgIDo6IGxpc3QoKSwKKyAgICBTZXJ2aWNlVGhyaWZ0Q2xpZW50TGlzdCA6OiBbe1NlcnZpY2VOYW1lOjpsaXN0KCksIFRocmlmdENsaWVudDo6dGVybSgpfV0uCituZXdfbXVsdGlwbGV4ZWQoSG9zdCwgUG9ydCwgU2VydmljZXMsIE9wdGlvbnMpIHdoZW4gaXNfaW50ZWdlcihQb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KFNlcnZpY2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KE9wdGlvbnMpIC0+CisgICAgbmV3X211bHRpcGxleGVkKHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShIb3N0LCBQb3J0LCBPcHRpb25zKSwgU2VydmljZXMsIE9wdGlvbnMpLgorCistc3BlYyBuZXdfbXVsdGlwbGV4ZWQoVHJhbnNwb3J0RmFjdG9yeVR1cGxlLCBTZXJ2aWNlcywgT3B0aW9ucykgLT4ge29rLCBTZXJ2aWNlVGhyaWZ0Q2xpZW50TGlzdH0gd2hlbgorICAgIFRyYW5zcG9ydEZhY3RvcnlUdXBsZSAgIDo6IHtvaywgVHJhbnNwb3J0RmFjdG9yeTo6dGVybSgpfSwKKyAgICBTZXJ2aWNlcyAgICAgICAgICAgICAgICA6OiBtdWx0aXBsZXhlZF9zZXJ2aWNlX21hcCgpLAorICAgIE9wdGlvbnMgICAgICAgICAgICAgICAgIDo6IGxpc3QoKSwKKyAgICBTZXJ2aWNlVGhyaWZ0Q2xpZW50TGlzdCA6OiBbe1NlcnZpY2VOYW1lOjpzZXJ2aWNlX25hbWUoKSwgVGhyaWZ0Q2xpZW50Ojp0ZXJtKCl9XS4KK25ld19tdWx0aXBsZXhlZChUcmFuc3BvcnRGYWN0b3J5VHVwbGUsIFNlcnZpY2VzLCBPcHRpb25zKSB3aGVuIGlzX2xpc3QoU2VydmljZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdChPcHRpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3R1cGxlKFRyYW5zcG9ydEZhY3RvcnlUdXBsZSkgLT4KKyAgICB7UHJvdG9PcHRzLCBffSA9IHNwbGl0X29wdGlvbnMoT3B0aW9ucyksCisKKyAgICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0gVHJhbnNwb3J0RmFjdG9yeVR1cGxlLAorCisgICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXdfcHJvdG9jb2xfZmFjdG9yeShUcmFuc3BvcnRGYWN0b3J5LCBQcm90b09wdHMpLAorCisgICAge29rLCBQcm90b2NvbH0gPSBQcm90b2NvbEZhY3RvcnkoKSwKKworICAgIHtvaywgW3tTZXJ2aWNlTmFtZSwgZWxlbWVudCgyLCB0aHJpZnRfY2xpZW50Om5ldyhlbGVtZW50KDIsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbDpuZXcoUHJvdG9jb2wsIFNlcnZpY2VOYW1lKSksIFNlcnZpY2UpKX0gfHwge1NlcnZpY2VOYW1lLCBTZXJ2aWNlfSA8LSBTZXJ2aWNlc119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTQyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwKQEAgLTAsMCArMSwzOTAgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9jb21wYWN0X3Byb3RvY29sKS4KKworLWJlaGF2aW91cih0aHJpZnRfcHJvdG9jb2wpLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCisKKy1leHBvcnQoW25ldy8xLCBuZXcvMiwKKyAgICAgICAgIHJlYWQvMiwKKyAgICAgICAgIHdyaXRlLzIsCisgICAgICAgICBmbHVzaF90cmFuc3BvcnQvMSwKKyAgICAgICAgIGNsb3NlX3RyYW5zcG9ydC8xLAorICAgICAgICAgbmV3X3Byb3RvY29sX2ZhY3RvcnkvMgorICAgICAgICBdKS4KKworLWRlZmluZShJRF9OT05FLCAxNiMxMDAwMCkuCistZGVmaW5lKENCT09MX05PTkUsIDApLgorLWRlZmluZShDQk9PTF9UUlVFLCAxKS4KKy1kZWZpbmUoQ0JPT0xfRkFMU0UsIDIpLgorCistcmVjb3JkKHRfY29tcGFjdCwge3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RhdGUgZm9yIHBlbmRpbmcgYm9vbGVhbiBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfc3RhY2s9W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3ZhbHVlPT9DQk9PTF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfc3RhY2s9W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9pZD0/SURfTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICB9KS4KKy10eXBlIHN0YXRlKCkgOjogI3RfY29tcGFjdHt9LgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbF9iZWhhdmlvdXIuaHJsIikuCisKKy1kZWZpbmUoUFJPVE9DT0xfSUQsIDE2IzgyKS4KKy1kZWZpbmUoVkVSU0lPTl9NQVNLLCAxNiMxZikuCistZGVmaW5lKFZFUlNJT05fMSwgMTYjMDEpLgorLWRlZmluZShUWVBFX01BU0ssIDE2I0UwKS4KKy1kZWZpbmUoVFlQRV9CSVRTLCAxNiMwNykuCistZGVmaW5lKFRZUEVfU0hJRlRfQU1PVU5ULCA1KS4KKwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NUT1ApIC0+IDE2IzA7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfQk9PTCkgLT4gMTYjMjsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JOCkgLT4gMTYjMzsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JMTYpIC0+IDE2IzQ7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfSTMyKSAtPiAxNiM1OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0k2NCkgLT4gMTYjNjsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9ET1VCTEUpIC0+IDE2Izc7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU1RSSU5HKSAtPiAxNiM4OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NUUlVDVCkgLT4gMTYjQzsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9NQVApIC0+IDE2I0I7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU0VUKSAtPiAxNiNBOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0xJU1QpIC0+IDE2IzkuCisKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzApIC0+ICA/dFR5cGVfU1RPUDsKK2NvbXBhY3RfdG9fdHlwZWlkKD9DQk9PTF9GQUxTRSkgLT4gID90VHlwZV9CT09MOworY29tcGFjdF90b190eXBlaWQoP0NCT09MX1RSVUUpIC0+ICA/dFR5cGVfQk9PTDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzcpIC0+ICA/dFR5cGVfRE9VQkxFOworY29tcGFjdF90b190eXBlaWQoMTYjMykgLT4gID90VHlwZV9JODsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzQpIC0+ICA/dFR5cGVfSTE2OworY29tcGFjdF90b190eXBlaWQoMTYjNSkgLT4gID90VHlwZV9JMzI7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM2KSAtPiAgP3RUeXBlX0k2NDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzgpIC0+ICA/dFR5cGVfU1RSSU5HOworY29tcGFjdF90b190eXBlaWQoMTYjQykgLT4gID90VHlwZV9TVFJVQ1Q7Citjb21wYWN0X3RvX3R5cGVpZCgxNiNCKSAtPiAgP3RUeXBlX01BUDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2I0EpIC0+ICA/dFR5cGVfU0VUOworY29tcGFjdF90b190eXBlaWQoMTYjOSkgLT4gID90VHlwZV9MSVNULgorCitib29sX3RvX2Nib29sKFZhbHVlKSB3aGVuIFZhbHVlIC0+ID9DQk9PTF9UUlVFOworYm9vbF90b19jYm9vbChfKSAtPiA/Q0JPT0xfRkFMU0UuCitjYm9vbF90b19ib29sKFZhbHVlKSAtPiBWYWx1ZSA9Oj0gP0NCT09MX1RSVUUuCisKK25ldyhUcmFuc3BvcnQpIC0+IG5ldyhUcmFuc3BvcnQsIF9PcHRpb25zID0gW10pLgorCituZXcoVHJhbnNwb3J0LCBfT3B0aW9ucykgLT4KKyAgU3RhdGUgID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9LAorICB0aHJpZnRfcHJvdG9jb2w6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworZmx1c2hfdHJhbnNwb3J0KFRoaXMgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0pIC0+CisgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCksCisgIHtUaGlzI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCitjbG9zZV90cmFuc3BvcnQoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KSwKKyAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKKyUlJQorJSUlIGluc3RhbmNlIG1ldGhvZHMKKyUlJQorCit3cml0ZV9maWVsZF9iZWdpbihUaGlzMCA9ICN0X2NvbXBhY3R7d3JpdGVfc3RhY2s9W0xhc3RJZHxUXX0sIENvbXBhY3RUeXBlLCBJZCkgLT4KKyAgSWREaWZmID0gSWQgLSBMYXN0SWQsCisgIFRoaXMxID0gVGhpczAjdF9jb21wYWN0e3dyaXRlX3N0YWNrPVtJZHxUXX0sCisgIGNhc2UgKElkRGlmZiA+IDApIGFuZCAoSWREaWZmIDwgMTYpIG9mCisgICAgdHJ1ZSAtPiB3cml0ZShUaGlzMSwge2J5dGUsIChJZERpZmYgYnNsIDQpIGJvciBDb21wYWN0VHlwZX0pOworICAgIGZhbHNlIC0+CisgICAgICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgQ29tcGFjdFR5cGV9KSwKKyAgICAgIHdyaXRlKFRoaXMyLCB7aTE2LCBJZH0pCisgIGVuZC4KKworLXNwZWMgdG9femlnemFnKGludGVnZXIoKSkgLT4gbm9uX25lZ19pbnRlZ2VyKCkuCit0b196aWd6YWcoVmFsdWUpIC0+IDE2I0ZGRkZGRkZGRkZGRkZGRkYgYmFuZCAoKFZhbHVlIGJzbCAxKSBieG9yIChWYWx1ZSBic3IgNjMpKS4KKworLXNwZWMgZnJvbV96aWd6YWcobm9uX25lZ19pbnRlZ2VyKCkpIC0+IGludGVnZXIoKS4KK2Zyb21femlnemFnKFZhbHVlKSAtPiAoVmFsdWUgYnNyIDEpIGJ4b3IgLShWYWx1ZSBiYW5kIDEpLgorCistc3BlYyB0b192YXJpbnQobm9uX25lZ19pbnRlZ2VyKCksIGlvbGlzdCgpKSAtPiBpb2xpc3QoKS4KK3RvX3ZhcmludChWYWx1ZSwgQWNjKSB3aGVuIChWYWx1ZSA8IDE2IzgwKSAtPiBbQWNjLCBWYWx1ZV07Cit0b192YXJpbnQoVmFsdWUsIEFjYykgLT4KKyAgdG9fdmFyaW50KFZhbHVlIGJzciA3LCBbQWNjLCAoKFZhbHVlIGJhbmQgMTYjN0YpIGJvciAxNiM4MCldKS4KKworLXNwZWMgcmVhZF92YXJpbnQoI3RfY29tcGFjdHt9LCBub25fbmVnX2ludGVnZXIoKSwgbm9uX25lZ19pbnRlZ2VyKCkpIC0+IG5vbl9uZWdfaW50ZWdlcigpLgorcmVhZF92YXJpbnQoVGhpczAsIEFjYywgQ291bnQpIC0+CisgIHtUaGlzMSwge29rLCBCeXRlfX0gPSByZWFkKFRoaXMwLCBieXRlKSwKKyAgY2FzZSAoQnl0ZSBiYW5kIDE2IzgwKSBvZgorICAgIDAgLT4ge1RoaXMxLCB7b2ssIChCeXRlIGJzbCAoNyAqIENvdW50KSkgKyBBY2N9fTsKKyAgICBfIC0+IHJlYWRfdmFyaW50KFRoaXMxLCAoKEJ5dGUgYmFuZCAxNiM3ZikgYnNsICg3ICogQ291bnQpKSArIEFjYywgQ291bnQgKyAxKQorICBlbmQuCisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICAgICAgbmFtZSA9IE5hbWUsCisgICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgICBzZXFpZCA9IFNlcWlkfSkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2J5dGUsID9QUk9UT0NPTF9JRH0pLAorICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgKD9WRVJTSU9OXzEgYmFuZCA/VkVSU0lPTl9NQVNLKSBib3IgKFR5cGUgYnNsID9UWVBFX1NISUZUX0FNT1VOVCl9KSwKKyAge1RoaXMzLCBva30gPSB3cml0ZShUaGlzMiwge3VpMzIsIFNlcWlkfSksCisgIHtUaGlzNCwgb2t9ID0gd3JpdGUoVGhpczMsIHtzdHJpbmcsIE5hbWV9KSwKKyAge1RoaXM0LCBva307CisKK3dyaXRlKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgIG5hbWUgPSBfTmFtZSwKKyAgICAgICB0eXBlID0gVHlwZSwKKyAgICAgICBpZCA9IElkfSkKK3doZW4gKFR5cGUgPTo9ID90VHlwZV9CT09MKSAtPiB7VGhpczAjdF9jb21wYWN0e3dyaXRlX2lkID0gSWR9LCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57CisgICAgICAgbmFtZSA9IF9OYW1lLAorICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgIGlkID0gSWR9KSAtPgorICB3cml0ZV9maWVsZF9iZWdpbihUaGlzMCwgdHlwZWlkX3RvX2NvbXBhY3QoVHlwZSksIElkKTsKKword3JpdGUoVGhpcywgZmllbGRfc3RvcCkgLT4gd3JpdGUoVGhpcywge2J5dGUsID90VHlwZV9TVE9QfSk7CisKK3dyaXRlKFRoaXMsIGZpZWxkX2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9tYXBfYmVnaW57CisgICAgICBrdHlwZSA9IF9LdHlwZSwKKyAgICAgIHZ0eXBlID0gX1Z0eXBlLAorICAgICAgc2l6ZSA9IFNpemV9KQord2hlbiBTaXplID06PSAwIC0+CisgIHdyaXRlKFRoaXMwLCB7Ynl0ZSwgMH0pOworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX21hcF9iZWdpbnsKKyAgICAgICBrdHlwZSA9IEt0eXBlLAorICAgICAgIHZ0eXBlID0gVnR5cGUsCisgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7dWkzMiwgU2l6ZX0pLAorICB3cml0ZShUaGlzMSwge2J5dGUsICh0eXBlaWRfdG9fY29tcGFjdChLdHlwZSkgYnNsIDQpIGJvciB0eXBlaWRfdG9fY29tcGFjdChWdHlwZSl9KTsKKword3JpdGUoVGhpcywgbWFwX2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9saXN0X2JlZ2lueworICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICBzaXplID0gU2l6ZX0pCit3aGVuIFNpemUgPCAxNiNmIC0+CisgIHdyaXRlKFRoaXMwLCB7Ynl0ZSwgKFNpemUgYnNsIDQpIGJvciB0eXBlaWRfdG9fY29tcGFjdChFdHlwZSl9KTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9saXN0X2JlZ2lueworICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtieXRlLCAxNiNmMCBib3IgdHlwZWlkX3RvX2NvbXBhY3QoRXR5cGUpfSksCisgIHdyaXRlKFRoaXMxLCB7dWkzMiwgU2l6ZX0pOworCit3cml0ZShUaGlzLCBsaXN0X2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9zZXRfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAgd3JpdGUoVGhpczAsICNwcm90b2NvbF9saXN0X2JlZ2lue2V0eXBlID0gRXR5cGUsIHNpemUgPSAgU2l6ZX0pOworCit3cml0ZShUaGlzLCBzZXRfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFN0YWNrfSwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9KSAtPgorICB7VGhpcyN0X2NvbXBhY3R7d3JpdGVfc3RhY2sgPSBbMHxTdGFja119LCBva307Cit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFtffFRdfSwgc3RydWN0X2VuZCkgLT4KKyAge1RoaXMjdF9jb21wYWN0e3dyaXRlX3N0YWNrID0gVH0sIG9rfTsKKword3JpdGUoVGhpcyA9ICN0X2NvbXBhY3R7d3JpdGVfaWQgPSA/SURfTk9ORX0sIHtib29sLCBWYWx1ZX0pIC0+CisgIHdyaXRlKFRoaXMsIHtieXRlLCBib29sX3RvX2Nib29sKFZhbHVlKX0pOworCit3cml0ZShUaGlzMCA9ICN0X2NvbXBhY3R7d3JpdGVfaWQgPSBJZH0sIHtib29sLCBWYWx1ZX0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGVfZmllbGRfYmVnaW4oVGhpczAsIGJvb2xfdG9fY2Jvb2woVmFsdWUpLCBJZCksCisgIHtUaGlzMSN0X2NvbXBhY3R7d3JpdGVfaWQgPSA/SURfTk9ORX0sIG9rfTsKKword3JpdGUoVGhpcywge2J5dGUsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPgorICB3cml0ZShUaGlzLCA8PFZhbHVlOjgvYmlnLXNpZ25lZD4+KTsKKword3JpdGUoVGhpcywge2kxNiwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+IHdyaXRlKFRoaXMsIHRvX3ZhcmludCh0b196aWd6YWcoVmFsdWUpLCBbXSkpOword3JpdGUoVGhpcywge3VpMzIsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPiB3cml0ZShUaGlzLCB0b192YXJpbnQoVmFsdWUsIFtdKSk7Cit3cml0ZShUaGlzLCB7aTMyLCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4KKyAgd3JpdGUoVGhpcywgdG9fdmFyaW50KHRvX3ppZ3phZyhWYWx1ZSksIFtdKSk7Cit3cml0ZShUaGlzLCB7aTY0LCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4gd3JpdGUoVGhpcywgdG9fdmFyaW50KHRvX3ppZ3phZyhWYWx1ZSksIFtdKSk7CisKK3dyaXRlKFRoaXMsIHtkb3VibGUsIERvdWJsZX0pIC0+CisgIHdyaXRlKFRoaXMsIDw8RG91YmxlOjY0L2Zsb2F0LXNpZ25lZC1saXR0bGU+Pik7CisKK3dyaXRlKFRoaXMwLCB7c3RyaW5nLCBTdHJ9KSB3aGVuIGlzX2xpc3QoU3RyKSAtPgorICAlIFRPRE86IGxpbWl0IGxlbmd0aAorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7dWkzMiwgbGVuZ3RoKFN0cil9KSwKKyAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwgbGlzdF90b19iaW5hcnkoU3RyKSksCisgIHtUaGlzMiwgb2t9OworCit3cml0ZShUaGlzMCwge3N0cmluZywgQmlufSkgd2hlbiBpc19iaW5hcnkoQmluKSAtPgorICAlIFRPRE86IGxpbWl0IGxlbmd0aAorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7dWkzMiwgc2l6ZShCaW4pfSksCisgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIEJpbiksCisgIHtUaGlzMiwgb2t9OworCislJSBEYXRhIDo6IGlvbGlzdCgpCit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc30sIERhdGEpIC0+CisgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFRyYW5zLCBEYXRhKSwKKyAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKKyUlCislJQorCityZWFkKFRoaXMwLCBtZXNzYWdlX2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgP1BST1RPQ09MX0lEfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMiwge29rLCBWZXJBbmRUeXBlfX0gPSByZWFkKFRoaXMxLCB1Ynl0ZSksCisgID9WRVJTSU9OXzEgPSBWZXJBbmRUeXBlIGJhbmQgP1ZFUlNJT05fTUFTSywKKyAge1RoaXMzLCB7b2ssIFNlcUlkfX0gPSByZWFkKFRoaXMyLCB1aTMyKSwKKyAge1RoaXM0LCB7b2ssIE5hbWV9fSA9IHJlYWQoVGhpczMsIHN0cmluZyksCisgIHtUaGlzNCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CisgICAgICAgICAgICAgbmFtZSAgPSBiaW5hcnlfdG9fbGlzdChOYW1lKSwKKyAgICAgICAgICAgICB0eXBlICA9IChWZXJBbmRUeXBlIGJzciA/VFlQRV9TSElGVF9BTU9VTlQpIGJhbmQgP1RZUEVfQklUUywKKyAgICAgICAgICAgICBzZXFpZCA9IFNlcUlkfX07CisKK3JlYWQoVGhpcywgbWVzc2FnZV9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpcyA9ICN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFN0YWNrfSwgc3RydWN0X2JlZ2luKSAtPgorICB7VGhpcyN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFswfFN0YWNrXX0sIG9rfTsKK3JlYWQoVGhpcyA9ICN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtfSHxUXX0sIHN0cnVjdF9lbmQpIC0+CisgIHtUaGlzI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gVH0sIG9rfTsKKworcmVhZChUaGlzMCA9ICN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtMYXN0SWR8VF19LCBmaWVsZF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIEJ5dGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAgY2FzZSBCeXRlIGJhbmQgMTYjZiBvZgorICAgIENvbXBhY3RUeXBlID0gP3RUeXBlX1NUT1AgLT4KKyAgICAgIHtUaGlzMSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBDb21wYWN0VHlwZX19OworICAgIENvbXBhY3RUeXBlIC0+CisgICAgICB7VGhpczIsIHtvaywgSWR9fSA9IGNhc2UgQnl0ZSBic3IgNCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLT4gcmVhZChUaGlzMSwgaTE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZERpZmYgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtUaGlzMSwge29rLCBMYXN0SWQgKyBJZERpZmZ9fQorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICBjYXNlIGNvbXBhY3RfdG9fdHlwZWlkKENvbXBhY3RUeXBlKSBvZgorICAgICAgICA/dFR5cGVfQk9PTCAtPgorICAgICAgICAgIHtUaGlzMiN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtJZHxUXSwgcmVhZF92YWx1ZSA9IGNib29sX3RvX2Jvb2woQ29tcGFjdFR5cGUpfSwKKyAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSBJZH19OworICAgICAgICBUeXBlIC0+CisgICAgICAgICAge1RoaXMyI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gW0lkfFRdfSwKKyAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBUeXBlLCBpZCA9IElkfX0KKyAgICAgIGVuZAorICBlbmQ7CisKK3JlYWQoVGhpcywgZmllbGRfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBtYXBfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBTaXplfX0gID0gcmVhZChUaGlzMCwgdWkzMiksCisgIHtUaGlzMiwge29rLCBLVn19ID0gY2FzZSBTaXplIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAwIC0+IHtUaGlzMSwge29rLCAwfX07CisgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IHJlYWQoVGhpczEsIHVieXRlKQorICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAge1RoaXMyLCAjcHJvdG9jb2xfbWFwX2JlZ2lue2t0eXBlID0gY29tcGFjdF90b190eXBlaWQoS1YgYnNyIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR5cGUgPSBjb21wYWN0X3RvX3R5cGVpZChLViBiYW5kIDE2I2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKK3JlYWQoVGhpcywgbWFwX2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzMCwgbGlzdF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIFNpemVBbmRUeXBlfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMiwge29rLCBTaXplfX0gPSBjYXNlIChTaXplQW5kVHlwZSBic3IgNCkgYmFuZCAxNiNmIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgIDE2I2YgLT4gcmVhZChUaGlzMSwgdWkzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEVsc2UgLT4ge1RoaXMxLCB7b2ssIEVsc2V9fQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICB7VGhpczIsICNwcm90b2NvbF9saXN0X2JlZ2lue2V0eXBlID0gY29tcGFjdF90b190eXBlaWQoU2l6ZUFuZFR5cGUgYmFuZCAxNiNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworCityZWFkKFRoaXMsIGxpc3RfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBzZXRfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBTaXplQW5kVHlwZX19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczIsIHtvaywgU2l6ZX19ID0gY2FzZSAoU2l6ZUFuZFR5cGUgYnNyIDQpIGJhbmQgMTYjZiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAxNiNmIC0+IHJlYWQoVGhpczEsIHVpMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBFbHNlIC0+IHtUaGlzMSwge29rLCBFbHNlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAge1RoaXMyLCAjcHJvdG9jb2xfc2V0X2JlZ2lue2V0eXBlID0gY29tcGFjdF90b190eXBlaWQoU2l6ZUFuZFR5cGUgYmFuZCAxNiNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworCityZWFkKFRoaXMsIHNldF9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpczAsIGZpZWxkX3N0b3ApIC0+CisgIHtUaGlzMSwge29rLCA/dFR5cGVfU1RPUH19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczEsIG9rfTsKKworJSUKKworcmVhZChUaGlzMCA9ICN0X2NvbXBhY3R7cmVhZF92YWx1ZSA9ID9DQk9PTF9OT05FfSwgYm9vbCkgLT4KKyAge1RoaXMxLCB7b2ssIEJ5dGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMxLCB7b2ssIGNib29sX3RvX2Jvb2woQnl0ZSl9fTsKKworcmVhZChUaGlzMCA9ICN0X2NvbXBhY3R7cmVhZF92YWx1ZSA9IEJvb2x9LCBib29sKSAtPgorICB7VGhpczAjdF9jb21wYWN0e3JlYWRfdmFsdWUgPSA/Q0JPT0xfTk9ORX0sIHtvaywgQm9vbH19OworCityZWFkKFRoaXMwLCB1Ynl0ZSkgLT4KKyAge1RoaXMxLCB7b2ssIDw8VmFsOjgvaW50ZWdlci11bnNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59fSA9IHJlYWRfZGF0YShUaGlzMCwgMSksCisgIHtUaGlzMSwge29rLCBWYWx9fTsKKworcmVhZChUaGlzMCwgYnl0ZSkgLT4KKyAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDEpLAorICBjYXNlIEJ5dGVzIG9mCisgICAge29rLCA8PFZhbDo4L2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgIEVsc2UgLT4ge1RoaXMxLCBFbHNlfQorICBlbmQ7CisKK3JlYWQoVGhpczAsIGkxNikgLT4KKyAge1RoaXMxLCB7b2ssIFppZ3phZ319ID0gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApLAorICB7VGhpczEsIHtvaywgZnJvbV96aWd6YWcoWmlnemFnKX19OworCityZWFkKFRoaXMwLCB1aTMyKSAtPiByZWFkX3ZhcmludChUaGlzMCwgMCwgMCk7CisKK3JlYWQoVGhpczAsIGkzMikgLT4KKyAge1RoaXMxLCB7b2ssIFppZ3phZ319ID0gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApLAorICB7VGhpczEsIHtvaywgZnJvbV96aWd6YWcoWmlnemFnKX19OworCityZWFkKFRoaXMwLCBpNjQpIC0+CisgIHtUaGlzMSwge29rLCBaaWd6YWd9fSA9IHJlYWRfdmFyaW50KFRoaXMwLCAwLCAwKSwKKyAge1RoaXMxLCB7b2ssIGZyb21femlnemFnKFppZ3phZyl9fTsKKworcmVhZChUaGlzMCwgZG91YmxlKSAtPgorICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgOCksCisgIGNhc2UgQnl0ZXMgb2YKKyAgICB7b2ssIDw8VmFsOjY0L2Zsb2F0LXNpZ25lZC1saXR0bGUsIF8vYmluYXJ5Pj59IC0+IHtUaGlzMSwge29rLCBWYWx9fTsKKyAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KKyAgZW5kOworCislIHJldHVybnMgYSBiaW5hcnkgZGlyZWN0bHksIGNhbGwgYmluYXJ5X3RvX2xpc3QgaWYgbmVjZXNzYXJ5CityZWFkKFRoaXMwLCBzdHJpbmcpIC0+CisgIHtUaGlzMSwge29rLCBTen19ICA9IHJlYWQoVGhpczAsIHVpMzIpLAorICByZWFkX2RhdGEoVGhpczEsIFN6KS4KKworLXNwZWMgcmVhZF9kYXRhKCN0X2NvbXBhY3R7fSwgbm9uX25lZ19pbnRlZ2VyKCkpIC0+CisgICAgeyN0X2NvbXBhY3R7fSwge29rLCBiaW5hcnkoKX0gfCB7ZXJyb3IsIF9SZWFzb259fS4KK3JlYWRfZGF0YShUaGlzLCAwKSAtPiB7VGhpcywge29rLCA8PD4+fX07CityZWFkX2RhdGEoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnN9LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIGFuZGFsc28gTGVuID4gMCAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoVHJhbnMsIExlbiksCisgICAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKKworJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislJSByZXR1cm5zIGEgKGZ1bigpIC0+IHRocmlmdF9wcm90b2NvbCgpKQorbmV3X3Byb3RvY29sX2ZhY3RvcnkoVHJhbnNwb3J0RmFjdG9yeSwgX09wdGlvbnMpIC0+CisgIEYgPSBmdW4oKSAtPgorICAgICAgICAgIGNhc2UgVHJhbnNwb3J0RmFjdG9yeSgpIG9mCisgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gLT4KKyAgICAgICAgICAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KAorICAgICAgICAgICAgICAgIFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICBbXSk7CisgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfQorICAgICAgICAgIGVuZAorICAgICAgZW5kLAorICB7b2ssIEZ9LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0LmVybAppbmRleCA3NjFmYTMwLi5kZThlZTQxIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0LmVybApAQCAtMzUsNiArMzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9vbl9jbG9zZSA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBzeW5jX2V2ZXJ5ID0gaW5maW5pdHksCiAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNfdHJlZn0pLgorLXR5cGUgc3RhdGUoKSA6OiAjZGxfdHJhbnNwb3J0e30uCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKIAogJSUgQ3JlYXRlIGEgdHJhbnNwb3J0IGF0dGFjaGVkIHRvIGFuIGFscmVhZHkgb3BlbiBsb2cuCkBAIC00Nyw3ICs0OSw3IEBACiAgICAgU3RhdGUyID0KICAgICAgICAgY2FzZSBTdGF0ZSNkbF90cmFuc3BvcnQuc3luY19ldmVyeSBvZgogICAgICAgICAgICAgTiB3aGVuIGlzX2ludGVnZXIoTiksIE4gPiAwIC0+Ci0gICAgICAgICAgICAgICAge29rLCBUUmVmfSA9IHRpbWVyOmFwcGx5X2ludGVydmFsKE4sID9NT0RVTEUsIGZvcmNlX2ZsdXNoLCBTdGF0ZSksCisgICAgICAgICAgICAgICAge29rLCBUUmVmfSA9IHRpbWVyOmFwcGx5X2ludGVydmFsKE4sID9NT0RVTEUsIGZvcmNlX2ZsdXNoLCBbU3RhdGVdKSwKICAgICAgICAgICAgICAgICBTdGF0ZSNkbF90cmFuc3BvcnR7c3luY190cmVmID0gVFJlZn07CiAgICAgICAgICAgICBfIC0+IFN0YXRlCiAgICAgICAgIGVuZCwKQEAgLTU4LDM4ICs2MCw0MSBAQAogcGFyc2Vfb3B0cyhbXSwgU3RhdGUpIC0+CiAgICAgU3RhdGU7CiBwYXJzZV9vcHRzKFt7Y2xvc2Vfb25fY2xvc2UsIEJvb2x9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KLSAgICBTdGF0ZSNkbF90cmFuc3BvcnR7Y2xvc2Vfb25fY2xvc2UgPSBCb29sfTsKKyAgICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI2RsX3RyYW5zcG9ydHtjbG9zZV9vbl9jbG9zZSA9IEJvb2x9KTsKIHBhcnNlX29wdHMoW3tzeW5jX2V2ZXJ5LCBJbnR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2ludGVnZXIoSW50KSwgSW50ID4gMCAtPgotICAgIFN0YXRlI2RsX3RyYW5zcG9ydHtzeW5jX2V2ZXJ5ID0gSW50fS4KKyAgICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI2RsX3RyYW5zcG9ydHtzeW5jX2V2ZXJ5ID0gSW50fSkuCiAKIAogJSUlJSBUUkFOU1BPUlQgSU1QTEVOVEFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQogCiAlJSBkaXNrX2xvZ190cmFuc3BvcnQgaXMgd3JpdGUtb25seQotcmVhZChfU3RhdGUsIExlbikgLT4KLSAgICB7ZXJyb3IsIG5vX3JlYWRfZnJvbV9kaXNrX2xvZ30uCityZWFkKFN0YXRlLCBfTGVuKSAtPgorICAgIHtTdGF0ZSwge2Vycm9yLCBub19yZWFkX2Zyb21fZGlza19sb2d9fS4KIAotd3JpdGUoI2RsX3RyYW5zcG9ydHtsb2cgPSBMb2d9LCBEYXRhKSAtPgotICAgIGRpc2tfbG9nOmJhbG9nKExvZywgZXJsYW5nOmlvbGlzdF90b19iaW5hcnkoRGF0YSkpLgord3JpdGUoVGhpcyA9ICNkbF90cmFuc3BvcnR7bG9nID0gTG9nfSwgRGF0YSkgLT4KKyAgICB7VGhpcywgZGlza19sb2c6YmFsb2coTG9nLCBlcmxhbmc6aW9saXN0X3RvX2JpbmFyeShEYXRhKSl9LgogCiBmb3JjZV9mbHVzaCgjZGxfdHJhbnNwb3J0e2xvZyA9IExvZ30pIC0+CiAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ+cCBzeW5jaW5nfm4iLCBbP01PRFVMRV0pLAogICAgIGRpc2tfbG9nOnN5bmMoTG9nKS4KIAotZmx1c2goI2RsX3RyYW5zcG9ydHtsb2cgPSBMb2csIHN5bmNfZXZlcnkgPSBTRX0pIC0+CitmbHVzaChUaGlzID0gI2RsX3RyYW5zcG9ydHtsb2cgPSBMb2csIHN5bmNfZXZlcnkgPSBTRX0pIC0+CiAgICAgY2FzZSBTRSBvZgogICAgICAgICB1bmRlZmluZWQgLT4gJSBubyB0aW1lLWJhc2VkIHN5bmMKICAgICAgICAgICAgIGRpc2tfbG9nOnN5bmMoTG9nKTsKICAgICAgICAgX0Vsc2UgLT4gICAgICUgc3luYyB3aWxsIGhhcHBlbiBhdXRvbWFnaWNhbGx5CiAgICAgICAgICAgICBvawotICAgIGVuZC4KKyAgICBlbmQsCisgICAge1RoaXMsIG9rfS4KKworCiAKIAogJSUgT24gY2xvc2UsIGNsb3NlIHRoZSB1bmRlcmx5aW5nIGxvZyBpZiB3ZSdyZSBjb25maWd1cmVkIHRvIGRvIHNvLgotY2xvc2UoI2RsX3RyYW5zcG9ydHtjbG9zZV9vbl9jbG9zZSA9IGZhbHNlfSkgLT4KLSAgICBvazsKLWNsb3NlKCNkbF90cmFuc3BvcnR7bG9nID0gTG9nfSkgLT4KLSAgICBkaXNrX2xvZzpsY2xvc2UoTG9nKS4KK2Nsb3NlKFRoaXMgPSAjZGxfdHJhbnNwb3J0e2Nsb3NlX29uX2Nsb3NlID0gZmFsc2V9KSAtPgorICAgIHtUaGlzLCBva307CitjbG9zZShUaGlzID0gI2RsX3RyYW5zcG9ydHtsb2cgPSBMb2d9KSAtPgorICAgIHtUaGlzLCBkaXNrX2xvZzpsY2xvc2UoTG9nKX0uCiAKIAogJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQpAQCAtMTA5LDEwICsxMTQsMTAgQEAKICAgICAgICAgICAgICAgIEV4dHJhTG9nT3B0c10sCiAgICAgTG9nID0KICAgICAgICAgY2FzZSBkaXNrX2xvZzpvcGVuKExvZ09wdHMpIG9mCi0gICAgICAgICAgICB7b2ssIExvZ30gLT4KLSAgICAgICAgICAgICAgICBMb2c7Ci0gICAgICAgICAgICB7cmVwYWlyZWQsIExvZywgSW5mbzEsIEluZm8yfSAtPgotICAgICAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygiRGlzayBsb2cgfnAgcmVwYWlyZWQ6IH5wLCB+cH5uIiwgW0xvZywgSW5mbzEsIEluZm8yXSksCi0gICAgICAgICAgICAgICAgTG9nCisgICAgICAgICAgICB7b2ssIExvZ1N9IC0+CisgICAgICAgICAgICAgICAgTG9nUzsKKyAgICAgICAgICAgIHtyZXBhaXJlZCwgTG9nUywgSW5mbzEsIEluZm8yfSAtPgorICAgICAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygiRGlzayBsb2cgfnAgcmVwYWlyZWQ6IH5wLCB+cH5uIiwgW0xvZ1MsIEluZm8xLCBJbmZvMl0pLAorICAgICAgICAgICAgICAgIExvZ1MKICAgICAgICAgZW5kLAogICAgIG5ldyhMb2csIFRyYW5zcG9ydE9wdHMpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKaW5kZXggNWFjMmRiZS4uMDcxMTUyYiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsCkBAIC0yMSw2NyArMjEsOTUgQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotLWV4cG9ydChbbmV3X3JlYWRlci8xLAotICAgICAgICAgbmV3LzEsCi0gICAgICAgICBuZXcvMiwKLSAgICAgICAgIHdyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgY29uc3RydWN0b3JzCistZXhwb3J0KFtuZXcvMSwgbmV3LzJdKS4KKyUlIHByb3RvY29sIGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld19yZWFkZXIvMV0pLgogCi0tcmVjb3JkKHRfZmlsZV90cmFuc3BvcnQsIHtkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRfY2xvc2UgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IHdyaXRlfSkuCiAKLSUlJSUgQ09OU1RSVUNUSU9OICAgJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorLXJlY29yZCh0X2ZpbGUsIHsKKyAgZGV2aWNlLAorICBzaG91bGRfY2xvc2UgPSB0cnVlLAorICBtb2RlID0gd3JpdGUKK30pLgogCi1uZXdfcmVhZGVyKEZpbGVuYW1lKSAtPgotICAgIGNhc2UgZmlsZTpvcGVuKEZpbGVuYW1lLCBbcmVhZCwgYmluYXJ5LCB7cmVhZF9haGVhZCwgMTAyNCoxMDI0fV0pIG9mCi0gICAgICAgIHtvaywgSU9EZXZpY2V9IC0+Ci0gICAgICAgICAgICBuZXcoSU9EZXZpY2UsIFt7c2hvdWxkX2Nsb3NlLCB0cnVlfSwge21vZGUsIHJlYWR9XSk7Ci0gICAgICAgIEVycm9yIC0+IEVycm9yCi0gICAgZW5kLgorLXR5cGUgc3RhdGUoKSA6OiAjdF9maWxle30uCiAKLW5ldyhEZXZpY2UpIC0+Ci0gICAgbmV3KERldmljZSwgW10pLgogCi0lJSBEZXZpY2UgOjogaW9fZGV2aWNlKCkKLSUlCistc3BlYyBuZXcoRGV2aWNlOjpmaWxlOmlvX2RldmljZSgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKK25ldyhEZXZpY2UpIC0+IG5ldyhEZXZpY2UsIFtdKS4KKworLXNwZWMgbmV3KERldmljZTo6ZmlsZTppb19kZXZpY2UoKSwgT3B0czo6bGlzdCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKICUlIERldmljZSBzaG91bGQgYmUgb3BlbmVkIGluIHJhdyBhbmQgYmluYXJ5IG1vZGUuCiBuZXcoRGV2aWNlLCBPcHRzKSB3aGVuIGlzX2xpc3QoT3B0cykgLT4KLSAgICBTdGF0ZSA9IHBhcnNlX29wdHMoT3B0cywgI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlfSksCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorICBTdGF0ZSA9IHBhcnNlX29wdHMoT3B0cywgI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2V9KSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgogCiAKLSUlIFBhcnNlIG9wdGlvbnMKLXBhcnNlX29wdHMoW3tzaG91bGRfY2xvc2UsIEJvb2x9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KLSAgICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZV90cmFuc3BvcnR7c2hvdWxkX2Nsb3NlID0gQm9vbH0pOwotcGFyc2Vfb3B0cyhbe21vZGUsIE1vZGV9IHwgUmVzdF0sIFN0YXRlKQotICB3aGVuIE1vZGUgPTo9IHdyaXRlOwotICAgICAgIE1vZGUgPTo9IHJlYWQgLT4KLSAgICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZV90cmFuc3BvcnR7bW9kZSA9IE1vZGV9KTsKK3BhcnNlX29wdHMoW3tzaG91bGRfY2xvc2UsIEJvb2x9fFJlc3RdLCBTdGF0ZSkKK3doZW4gaXNfYm9vbGVhbihCb29sKSAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZXtzaG91bGRfY2xvc2UgPSBCb29sfSk7CitwYXJzZV9vcHRzKFt7bW9kZSwgTW9kZX18UmVzdF0sIFN0YXRlKQord2hlbiBNb2RlID06PSB3cml0ZTsgTW9kZSA9Oj0gcmVhZCAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3RfZmlsZXttb2RlID0gTW9kZX0pOwogcGFyc2Vfb3B0cyhbXSwgU3RhdGUpIC0+Ci0gICAgIFN0YXRlLgorICBTdGF0ZS4KIAogCi0lJSUlIFRSQU5TUE9SVCBJTVBMICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKLQotd3JpdGUoI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9LCBEYXRhKSAtPgotICAgIGZpbGU6d3JpdGUoRGV2aWNlLCBEYXRhKTsKLXdyaXRlKF9ULCBfRCkgLT4KLSAgICB7ZXJyb3IsIHJlYWRfbW9kZX0uCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKIAotcmVhZCgjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSByZWFkfSwgTGVuKQotICB3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KLSAgICBmaWxlOnJlYWQoRGV2aWNlLCBMZW4pOwotcmVhZChfVCwgX0QpIC0+Ci0gICAge2Vycm9yLCByZWFkX21vZGV9LgorcmVhZChTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gcmVhZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBjYXNlIGZpbGU6cmVhZChEZXZpY2UsIExlbikgb2YKKyAgICBlb2YgLT4ge1N0YXRlLCB7ZXJyb3IsIGVvZn19OworICAgIHtvaywgUmVzdWx0fSAtPiB7U3RhdGUsIHtvaywgaW9saXN0X3RvX2JpbmFyeShSZXN1bHQpfX0KKyAgZW5kOworcmVhZChTdGF0ZSwgXykgLT4KKyAge1N0YXRlLCB7ZXJyb3IsIHdyaXRlX21vZGV9fS4KIAotZmx1c2goI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9KSAtPgotICAgIGZpbGU6c3luYyhEZXZpY2UpLgogCi1jbG9zZSgjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIHNob3VsZF9jbG9zZSA9IFNDfSkgLT4KLSAgICBjYXNlIFNDIG9mCi0gICAgICAgIHRydWUgLT4KLSAgICAgICAgICAgIGZpbGU6Y2xvc2UoRGV2aWNlKTsKLSAgICAgICAgZmFsc2UgLT4KLSAgICAgICAgICAgIG9rCi0gICAgZW5kLgorcmVhZF9leGFjdChTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gcmVhZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBjYXNlIGZpbGU6cmVhZChEZXZpY2UsIExlbikgb2YKKyAgICBlb2YgLT4ge1N0YXRlLCB7ZXJyb3IsIGVvZn19OworICAgIHtvaywgUmVzdWx0fSAtPgorICAgICAgY2FzZSBpb2xpc3Rfc2l6ZShSZXN1bHQpIG9mCisgICAgICAgIFggd2hlbiBYIDwgTGVuIC0+IHtTdGF0ZSwge2Vycm9yLCBlb2Z9fTsKKyAgICAgICAgXyAtPiB7U3RhdGUsIHtvaywgaW9saXN0X3RvX2JpbmFyeShSZXN1bHQpfX0KKyAgICAgIGVuZAorICBlbmQ7CityZWFkX2V4YWN0KFN0YXRlLCBfKSAtPgorICB7U3RhdGUsIHtlcnJvciwgd3JpdGVfbW9kZX19LgorCisKK3dyaXRlKFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSB3cml0ZX0sIERhdGEpIC0+CisgIHtTdGF0ZSwgZmlsZTp3cml0ZShEZXZpY2UsIERhdGEpfTsKK3dyaXRlKFN0YXRlLCBfKSAtPgorICB7U3RhdGUsIHtlcnJvciwgcmVhZF9tb2RlfX0uCisKKworZmx1c2goU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgbW9kZSA9IHdyaXRlfSkgLT4KKyAge1N0YXRlLCBmaWxlOnN5bmMoRGV2aWNlKX0uCisKKworY2xvc2UoU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgc2hvdWxkX2Nsb3NlID0gU0N9KSAtPgorICBjYXNlIFNDIG9mCisgICAgdHJ1ZSAtPiB7U3RhdGUsIGZpbGU6Y2xvc2UoRGV2aWNlKX07CisgICAgZmFsc2UgLT4ge1N0YXRlLCBva30KKyAgZW5kLgorCisKKyUlIGxlZ2FjeSBhcGkuIGxlZnQgZm9yIGNvbXBhdGliaWxpdHkKK25ld19yZWFkZXIoRmlsZW5hbWUpIC0+CisgIGNhc2UgZmlsZTpvcGVuKEZpbGVuYW1lLCBbcmVhZCwgYmluYXJ5LCB7cmVhZF9haGVhZCwgMTAyNCoxMDI0fV0pIG9mCisgICAge29rLCBJT0RldmljZX0gLT4gbmV3KElPRGV2aWNlLCBbe3Nob3VsZF9jbG9zZSwgdHJ1ZX0sIHttb2RlLCByZWFkfV0pOworICAgIEVycm9yIC0+IEVycm9yCisgIGVuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCmluZGV4IDAxYmFiNzAuLjlhNWQ2YWYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKQEAgLTE5LDE5MCArMTksMTA4IEBACiAKIC1tb2R1bGUodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQpLgogCi0tYmVoYXZpb3VyKGdlbl9zZXJ2ZXIpLgogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCislJSBjb25zdHJ1Y3RvcgogLWV4cG9ydChbbmV3LzFdKS4KKyUlIHByb3RvY29sIGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKLS1leHBvcnQoW2luaXQvMSwgaGFuZGxlX2NhbGwvMywgaGFuZGxlX2Nhc3QvMiwgaGFuZGxlX2luZm8vMiwKLSAgICAgICAgIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zXSkuCiAKLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKy1yZWNvcmQodF9mcmFtZWQsIHsKKyAgd3JhcHBlZCwKKyAgcmVhZF9idWZmZXIsCisgIHdyaXRlX2J1ZmZlcgorfSkuCiAKLS1yZWNvcmQoZnJhbWVkX3RyYW5zcG9ydCwge3dyYXBwZWQsICUgYSB0aHJpZnRfdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciwgJSBpb2xpc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyICUgaW9saXN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuCistdHlwZSBzdGF0ZSgpIDo6ICN0X2ZyYW1lZHt9LgogCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBBUEkKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBzdGFydF9saW5rKCkgLT4ge29rLFBpZH0gfCBpZ25vcmUgfCB7ZXJyb3IsRXJyb3J9Ci0lJSBEZXNjcmlwdGlvbjogU3RhcnRzIHRoZSBzZXJ2ZXIKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5ldyhXcmFwcGVkVHJhbnNwb3J0KSAtPgotICAgIGNhc2UgZ2VuX3NlcnZlcjpzdGFydF9saW5rKD9NT0RVTEUsIFtXcmFwcGVkVHJhbnNwb3J0XSwgW10pIG9mCi0gICAgICAgIHtvaywgUGlkfSAtPgotICAgICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgUGlkKTsKLSAgICAgICAgRWxzZSAtPgotICAgICAgICAgICAgRWxzZQotICAgIGVuZC4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IHdyaXRlKFRyYW5zcG9ydCwgRGF0YSkgLT4gb2sKLSUlCi0lJSBEYXRhID0gaW9saXN0KCkKLSUlCi0lJSBEZXNjcmlwdGlvbjogV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi13cml0ZShUcmFuc3BvcnQsIERhdGEpIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYWxsKFRyYW5zcG9ydCwge3dyaXRlLCBEYXRhfSkuCistc3BlYyBuZXcoVHJhbnNwb3J0Ojp0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGZsdXNoKFRyYW5zcG9ydCkgLT4gb2sKLSUlCi0lJSBEZXNjcmlwdGlvbjogRmx1c2hlcyB0aGUgYnVmZmVyIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1mbHVzaChUcmFuc3BvcnQpIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYWxsKFRyYW5zcG9ydCwgZmx1c2gpLgorbmV3KFdyYXBwZWQpIC0+CisgIFN0YXRlID0gI3RfZnJhbWVkeworICAgIHdyYXBwZWQgPSBXcmFwcGVkLAorICAgIHJlYWRfYnVmZmVyID0gW10sCisgICAgd3JpdGVfYnVmZmVyID0gW10KKyAgfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogY2xvc2UoVHJhbnNwb3J0KSAtPiBvawotJSUKLSUlIERlc2NyaXB0aW9uOiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBhbmQgdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jbG9zZShUcmFuc3BvcnQpIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYXN0KFRyYW5zcG9ydCwgY2xvc2UpLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogUmVhZChUcmFuc3BvcnQsIExlbikgLT4ge29rLCBEYXRhfQotJSUKLSUlIERhdGEgPSBiaW5hcnkoKQotJSUKLSUlIERlc2NyaXB0aW9uOiBSZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc29wcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlYWQoVHJhbnNwb3J0LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYWxsKFRyYW5zcG9ydCwge3JlYWQsIExlbn0pLgorLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBnZW5fc2VydmVyIGNhbGxiYWNrcwotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogaW5pdChBcmdzKSAtPiB7b2ssIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgICAgICAgICAgICAgICB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29ufQotJSUgRGVzY3JpcHRpb246IEluaXRpYXRlcyB0aGUgc2VydmVyCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbml0KFtXcmFwcGVkXSkgLT4KLSAgICB7b2ssICNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9idWZmZXIgPSBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciA9IFtdfX0uCityZWFkKFN0YXRlID0gI3RfZnJhbWVke3dyYXBwZWQgPSBXcmFwcGVkLCByZWFkX2J1ZmZlciA9IEJ1ZmZlcn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZmZlciksCisgIGNhc2UgQmluYXJ5IG9mCisgICAgPDw+PiB3aGVuIExlbiA+IDAgLT4KKyAgICAgIGNhc2UgbmV4dF9mcmFtZShXcmFwcGVkKSBvZgorICAgICAgICB7TmV3U3RhdGUsIHtvaywgRnJhbWV9fSAtPgorICAgICAgICAgIE5ld0JpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoW0JpbmFyeSwgRnJhbWVdKSwKKyAgICAgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKE5ld0JpbmFyeSksIExlbiksCisgICAgICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShOZXdCaW5hcnksIEdpdmUpLAorICAgICAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGUsIHJlYWRfYnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKKyAgICAgICAge05ld1N0YXRlLCBFcnJvcn0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgRXJyb3J9CisgICAgICBlbmQ7CisgICAgJSUgcmVhZCBvZiB6ZXJvIGJ5dGVzCisgICAgPDw+PiAtPiB7U3RhdGUsIHtvaywgPDw+Pn19OworICAgICUlIHJlYWQgYnVmZmVyIGlzIG5vbmVtcHR5CisgICAgXyAtPgorICAgICAgR2l2ZSA9IG1pbihpb2xpc3Rfc2l6ZShCaW5hcnkpLCBMZW4pLAorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIEdpdmUpLAorICAgICAge1N0YXRlI3RfZnJhbWVke3JlYWRfYnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fQorICBlbmQuCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiAlJSBoYW5kbGVfY2FsbChSZXF1ZXN0LCBGcm9tLCBTdGF0ZSkgLT4ge3JlcGx5LCBSZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVwbHksIFJlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFJlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQotJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhbGwgbWVzc2FnZXMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWhhbmRsZV9jYWxsKHt3cml0ZSwgRGF0YX0sIF9Gcm9tLCBTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWZ9KSAtPgotICAgIHtyZXBseSwgb2ssIFN0YXRlI2ZyYW1lZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW1dCdWYsIERhdGFdfX07CiAKLWhhbmRsZV9jYWxsKHtyZWFkLCBMZW59LCBfRnJvbSwgU3RhdGUgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciA9IFJCdWZ9KSAtPgotICAgIHtSQnVmMSwgUkJ1ZjFTaXplfSA9Ci0gICAgICAgICUlIGlmIHRoZSByZWFkIGJ1ZmZlciBpcyBlbXB0eSwgcmVhZCBhbm90aGVyIGZyYW1lCi0gICAgICAgICUlIG90aGVyd2lzZSwganVzdCByZWFkIGZyb20gd2hhdCdzIGxlZnQgaW4gdGhlIGJ1ZmZlcgotICAgICAgICBjYXNlIGlvbGlzdF9zaXplKFJCdWYpIG9mCi0gICAgICAgICAgICAwIC0+Ci0gICAgICAgICAgICAgICAgJSUgcmVhZCB0aGUgZnJhbWUgbGVuZ3RoCi0gICAgICAgICAgICAgICAge29rLCA8PEZyYW1lTGVuOjMyL2ludGVnZXItc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn0gPQotICAgICAgICAgICAgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZCwgNCksCi0gICAgICAgICAgICAgICAgJSUgdGhlbiByZWFkIHRoZSBkYXRhCi0gICAgICAgICAgICAgICAge29rLCBCaW59ID0KLSAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQsIEZyYW1lTGVuKSwKLSAgICAgICAgICAgICAgICB7QmluLCBlcmxhbmc6Ynl0ZV9zaXplKEJpbil9OwotICAgICAgICAgICAgU3ogLT4KLSAgICAgICAgICAgICAgICB7UkJ1ZiwgU3p9Ci0gICAgICAgIGVuZCwKK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHJlYWRfYnVmZmVyID0gQnVmZmVyfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmZmVyKSwKKyAgY2FzZSBpb2xpc3Rfc2l6ZShCaW5hcnkpIG9mCisgICAgJSUgcmVhZCBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gcmVxdWVzdGVkIHJlYWQgc2l6ZQorICAgIFggd2hlbiBYID49IExlbiAtPgorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIExlbiksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7cmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19OworICAgICUlIHJlYWQgYnVmZmVyIGlzIGluc3VmZmljaWVudCBmb3IgcmVxdWVzdGVkIHJlYWQgc2l6ZQorICAgIF8gLT4KKyAgICAgIGNhc2UgbmV4dF9mcmFtZShXcmFwcGVkKSBvZgorICAgICAgICB7TmV3U3RhdGUsIHtvaywgRnJhbWV9fSAtPgorICAgICAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgICAgICBTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGUsIHJlYWRfYnVmZmVyID0gW0J1ZmZlciwgRnJhbWVdfSwKKyAgICAgICAgICAgIExlbgorICAgICAgICAgICk7CisgICAgICAgIHtOZXdTdGF0ZSwgRXJyb3J9IC0+CisgICAgICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZX0sIEVycm9yfQorICAgICAgZW5kCisgIGVuZC4KIAotICAgICUlIHB1bGwgb2ZmIEdpdmUgYnl0ZXMsIHJldHVybiB0aGVtIHRvIHRoZSB1c2VyLCBsZWF2ZSB0aGUgcmVzdCBpbiB0aGUgYnVmZmVyCi0gICAgR2l2ZSA9IG1pbihSQnVmMVNpemUsIExlbiksCi0gICAgPDxEYXRhOkdpdmUvYmluYXJ5LCBSQnVmMi9iaW5hcnk+PiA9IGlvbGlzdF90b19iaW5hcnkoUkJ1ZjEpLAorbmV4dF9mcmFtZShUcmFuc3BvcnQpIC0+CisgIGNhc2UgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KFRyYW5zcG9ydCwgNCkgb2YKKyAgICB7TmV3U3RhdGUsIHtvaywgPDxGcmFtZUxlbmd0aDozMi9pbnRlZ2VyLXNpZ25lZC1iaWc+Pn19IC0+CisgICAgICB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoTmV3U3RhdGUsIEZyYW1lTGVuZ3RoKTsKKyAgICBFcnJvciAtPiBFcnJvcgorICBlbmQuCiAKLSAgICBSZXNwb25zZSA9IHtvaywgRGF0YX0sCi0gICAgU3RhdGUxID0gU3RhdGUjZnJhbWVkX3RyYW5zcG9ydHtyZWFkX2J1ZmZlcj1SQnVmMn0sCiAKLSAgICB7cmVwbHksIFJlc3BvbnNlLCBTdGF0ZTF9Oword3JpdGUoU3RhdGUgPSAjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyfSwgRGF0YSkgLT4KKyAge1N0YXRlI3RfZnJhbWVke3dyaXRlX2J1ZmZlciA9IFtCdWZmZXIsIERhdGFdfSwgb2t9LgogCi1oYW5kbGVfY2FsbChmbHVzaCwgX0Zyb20sIFN0YXRlKSAtPgotICAgIHtSZXNwb25zZSwgU3RhdGUxfSA9IGRvX2ZsdXNoKFN0YXRlKSwKLSAgICB7cmVwbHksIFJlc3BvbnNlLCBTdGF0ZTF9LgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogaGFuZGxlX2Nhc3QoTXNnLCBTdGF0ZSkgLT4ge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FzdCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2Nhc3QoY2xvc2UsIFN0YXRlKSAtPgotICAgIHtfLCBTdGF0ZTF9ID0gZG9fZmx1c2goU3RhdGUpLAotICAgICUlIFdyYXBwZWQgaXMgY2xvc2VkIGJ5IHRlcm1pbmF0ZS8yCi0gICAgJSUgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQgfnA6IGNsb3NpbmciLCBbc2VsZigpXSksCi0gICAge3N0b3AsIG5vcm1hbCwgU3RhdGV9OwotaGFuZGxlX2Nhc3QoTXNnLCBTdGF0ZT0jZnJhbWVkX3RyYW5zcG9ydHt9KSAtPgotICAgIHtub3JlcGx5LCBTdGF0ZX0uCitmbHVzaChTdGF0ZSA9ICN0X2ZyYW1lZHt3cml0ZV9idWZmZXIgPSBCdWZmZXIsIHdyYXBwZWQgPSBXcmFwcGVkfSkgLT4KKyAgY2FzZSBpb2xpc3Rfc2l6ZShCdWZmZXIpIG9mCisgICAgJSUgaWYgd3JpdGUgYnVmZmVyIGlzIGVtcHR5LCBkbyBub3RoaW5nCisgICAgMCAtPiB7U3RhdGUsIG9rfTsKKyAgICBGcmFtZUxlbiAtPgorICAgICAgRGF0YSA9IFs8PEZyYW1lTGVuOjMyL2ludGVnZXItc2lnbmVkLWJpZz4+LCBCdWZmZXJdLAorICAgICAge1dyaXR0ZW4sIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgRGF0YSksCisgICAgICB7Rmx1c2hlZCwgb2t9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcml0dGVuKSwKKyAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gRmx1c2hlZCwgd3JpdGVfYnVmZmVyID0gW119LCBSZXNwb25zZX0KKyAgZW5kLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogaGFuZGxlX2luZm8oSW5mbywgU3RhdGUpIC0+IHtub3JlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgYWxsIG5vbiBjYWxsL2Nhc3QgbWVzc2FnZXMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWhhbmRsZV9pbmZvKF9JbmZvLCBTdGF0ZSkgLT4KLSAgICB7bm9yZXBseSwgU3RhdGV9LgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogdGVybWluYXRlKFJlYXNvbiwgU3RhdGUpIC0+IHZvaWQoKQotJSUgRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGEgZ2VuX3NlcnZlciB3aGVuIGl0IGlzIGFib3V0IHRvCi0lJSB0ZXJtaW5hdGUuIEl0IHNob3VsZCBiZSB0aGUgb3Bwb3NpdGUgb2YgTW9kdWxlOmluaXQvMSBhbmQgZG8gYW55IG5lY2Vzc2FyeQotJSUgY2xlYW5pbmcgdXAuIFdoZW4gaXQgcmV0dXJucywgdGhlIGdlbl9zZXJ2ZXIgdGVybWluYXRlcyB3aXRoIFJlYXNvbi4KLSUlIFRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXRlcm1pbmF0ZShfUmVhc29uLCBTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQ9V3JhcHBlZH0pIC0+Ci0gICAgdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkKSwKLSAgICBvay4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuYzogY29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZSwgRXh0cmEpIC0+IHtvaywgTmV3U3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogQ29udmVydCBwcm9jZXNzIHN0YXRlIHdoZW4gY29kZSBpcyBjaGFuZ2VkCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jb2RlX2NoYW5nZShfT2xkVnNuLCBTdGF0ZSwgX0V4dHJhKSAtPgotICAgIHtvaywgU3RhdGV9LgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSUgSW50ZXJuYWwgZnVuY3Rpb25zCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1kb19mbHVzaChTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IFdyYXBwZWR9KSAtPgotICAgIEZyYW1lTGVuID0gaW9saXN0X3NpemUoQnVmZmVyKSwKLSAgICBEYXRhICAgICA9IFs8PEZyYW1lTGVuOjMyL2ludGVnZXItc2lnbmVkLWJpZz4+LCBCdWZmZXJdLAotCi0gICAgUmVzcG9uc2UgPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQsIERhdGEpLAotCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcmFwcGVkKSwKLQotICAgIFN0YXRlMSA9IFN0YXRlI2ZyYW1lZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW119LAotICAgIHtSZXNwb25zZSwgU3RhdGUxfS4KLQotbWluKEEsQikgd2hlbiBBPEIgLT4gQTsKLW1pbihfLEIpICAgICAgICAgIC0+IEIuCitjbG9zZShTdGF0ZSA9ICN0X2ZyYW1lZHt3cmFwcGVkID0gV3JhcHBlZH0pIC0+CisgIHtDbG9zZWQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQpLAorICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IENsb3NlZH0sIFJlc3VsdH0uCiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9odHRwX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfaHR0cF90cmFuc3BvcnQuZXJsCmluZGV4IGY4YzE4MjcuLjQ2YmNlZGUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9odHRwX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2h0dHBfdHJhbnNwb3J0LmVybApAQCAtMTksMjAgKzE5LDExIEBACiAKIC1tb2R1bGUodGhyaWZ0X2h0dHBfdHJhbnNwb3J0KS4KIAotLWJlaGF2aW91cihnZW5fc2VydmVyKS4KIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKICUlIEFQSQogLWV4cG9ydChbbmV3LzIsIG5ldy8zXSkuCiAKLSUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCi0tZXhwb3J0KFtpbml0LzEsCi0gICAgICAgICBoYW5kbGVfY2FsbC8zLAotICAgICAgICAgaGFuZGxlX2Nhc3QvMiwKLSAgICAgICAgIGhhbmRsZV9pbmZvLzIsCi0gICAgICAgICB0ZXJtaW5hdGUvMiwKLSAgICAgICAgIGNvZGVfY2hhbmdlLzNdKS4KLQogJSUgdGhyaWZ0X3RyYW5zcG9ydCBjYWxsYmFja3MKIC1leHBvcnQoW3dyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCkBAIC00MywxNCArMzQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfb3B0aW9ucywgJSBzZWUgaHR0cCgzKQogICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2hlYWRlcnMgJSBbe3N0cigpLCBzdHIoKX0sIC4uLl0KICAgICAgICAgICAgICAgICAgICAgICAgIH0pLgorLXR5cGUgc3RhdGUoKSA6OiAjaHR0cF90cmFuc3BvcnR7fS4KKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUgQVBJCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogbmV3KCkgLT4ge29rLCBUcmFuc3BvcnR9IHwgaWdub3JlIHwge2Vycm9yLEVycm9yfQotJSUgRGVzY3JpcHRpb246IFN0YXJ0cyB0aGUgc2VydmVyCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBuZXcoSG9zdCwgUGF0aCkgLT4KICAgICBuZXcoSG9zdCwgUGF0aCwgX09wdGlvbnMgPSBbXSkuCiAKQEAgLTYwLDU0ICs0Niw2IEBACiAlJSAgIHtleHRyYV9oZWFkZXJzLCBFeHRyYUhlYWRlcnN9ICA9IExpc3Qgb2YgZXh0cmEgSFRUUCBoZWFkZXJzCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBuZXcoSG9zdCwgUGF0aCwgT3B0aW9ucykgLT4KLSAgICBjYXNlIGdlbl9zZXJ2ZXI6c3RhcnRfbGluayg/TU9EVUxFLCB7SG9zdCwgUGF0aCwgT3B0aW9uc30sIFtdKSBvZgotICAgICAgICB7b2ssIFBpZH0gLT4KLSAgICAgICAgICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFBpZCk7Ci0gICAgICAgIEVsc2UgLT4KLSAgICAgICAgICAgIEVsc2UKLSAgICBlbmQuCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiB3cml0ZShUcmFuc3BvcnQsIERhdGEpIC0+IG9rCi0lJQotJSUgRGF0YSA9IGlvbGlzdCgpCi0lJQotJSUgRGVzY3JpcHRpb246IFdyaXRlcyBkYXRhIGludG8gdGhlIGJ1ZmZlcgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotd3JpdGUoVHJhbnNwb3J0LCBEYXRhKSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FsbChUcmFuc3BvcnQsIHt3cml0ZSwgRGF0YX0pLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogZmx1c2goVHJhbnNwb3J0KSAtPiBvawotJSUKLSUlIERlc2NyaXB0aW9uOiBGbHVzaGVzIHRoZSBidWZmZXIsIG1ha2luZyBhIHJlcXVlc3QKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWZsdXNoKFRyYW5zcG9ydCkgLT4KLSAgICBnZW5fc2VydmVyOmNhbGwoVHJhbnNwb3J0LCBmbHVzaCkuCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBjbG9zZShUcmFuc3BvcnQpIC0+IG9rCi0lJQotJSUgRGVzY3JpcHRpb246IENsb3NlcyB0aGUgdHJhbnNwb3J0Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jbG9zZShUcmFuc3BvcnQpIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYXN0KFRyYW5zcG9ydCwgY2xvc2UpLgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogUmVhZChUcmFuc3BvcnQsIExlbikgLT4ge29rLCBEYXRhfQotJSUKLSUlIERhdGEgPSBiaW5hcnkoKQotJSUKLSUlIERlc2NyaXB0aW9uOiBSZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc29wcnQKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlYWQoVHJhbnNwb3J0LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYWxsKFRyYW5zcG9ydCwge3JlYWQsIExlbn0pLgotCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBnZW5fc2VydmVyIGNhbGxiYWNrcwotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1pbml0KHtIb3N0LCBQYXRoLCBPcHRpb25zfSkgLT4KICAgICBTdGF0ZTEgPSAjaHR0cF90cmFuc3BvcnR7aG9zdCA9IEhvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciA9IFtdLApAQCAtMTI3LDUwICs2NSwxNyBAQAogICAgICAgICBlbmQsCiAgICAgY2FzZSBsaXN0czpmb2xkbChBcHBseU9wdGlvbiwgU3RhdGUxLCBPcHRpb25zKSBvZgogICAgICAgICBTdGF0ZTIgPSAjaHR0cF90cmFuc3BvcnR7fSAtPgotICAgICAgICAgICAge29rLCBTdGF0ZTJ9OworICAgICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUyKTsKICAgICAgICAgRWxzZSAtPgotICAgICAgICAgICAge3N0b3AsIEVsc2V9CisgICAgICAgICAgICB7ZXJyb3IsIEVsc2V9CiAgICAgZW5kLgogCi1oYW5kbGVfY2FsbCh7d3JpdGUsIERhdGF9LCBfRnJvbSwgU3RhdGUgPSAjaHR0cF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1Zn0pIC0+Ci0gICAge3JlcGx5LCBvaywgU3RhdGUjaHR0cF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW1dCdWYsIERhdGFdfX07CislJSBXcml0ZXMgZGF0YSBpbnRvIHRoZSBidWZmZXIKK3dyaXRlKFN0YXRlID0gI2h0dHBfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWZ9LCBEYXRhKSAtPgorICAgIHtTdGF0ZSNodHRwX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbV0J1ZiwgRGF0YV19LCBva30uCiAKLWhhbmRsZV9jYWxsKHtyZWFkLCBMZW59LCBfRnJvbSwgU3RhdGUgPSAjaHR0cF90cmFuc3BvcnR7cmVhZF9idWZmZXIgPSBSQnVmfSkgLT4KLSAgICAlJSBQdWxsIG9mZiBHaXZlIGJ5dGVzLCByZXR1cm4gdGhlbSB0byB0aGUgdXNlciwgbGVhdmUgdGhlIHJlc3QgaW4gdGhlIGJ1ZmZlci4KLSAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKFJCdWYpLCBMZW4pLAotICAgIGNhc2UgaW9saXN0X3RvX2JpbmFyeShSQnVmKSBvZgotICAgICAgICA8PERhdGE6R2l2ZS9iaW5hcnksIFJCdWYxL2JpbmFyeT4+IC0+Ci0gICAgICAgICAgICBSZXNwb25zZSA9IHtvaywgRGF0YX0sCi0gICAgICAgICAgICBTdGF0ZTEgPSBTdGF0ZSNodHRwX3RyYW5zcG9ydHtyZWFkX2J1ZmZlcj1SQnVmMX0sCi0gICAgICAgICAgICB7cmVwbHksIFJlc3BvbnNlLCBTdGF0ZTF9OwotICAgICAgICBfIC0+Ci0gICAgICAgICAgICB7cmVwbHksIHtlcnJvciwgJ0VPRid9LCBTdGF0ZX0KLSAgICBlbmQ7Ci0KLWhhbmRsZV9jYWxsKGZsdXNoLCBfRnJvbSwgU3RhdGUpIC0+Ci0gICAge1Jlc3BvbnNlLCBTdGF0ZTF9ID0gZG9fZmx1c2goU3RhdGUpLAotICAgIHtyZXBseSwgUmVzcG9uc2UsIFN0YXRlMX0uCi0KLWhhbmRsZV9jYXN0KGNsb3NlLCBTdGF0ZSkgLT4KLSAgICB7XywgU3RhdGUxfSA9IGRvX2ZsdXNoKFN0YXRlKSwKLSAgICB7c3RvcCwgbm9ybWFsLCBTdGF0ZTF9OwotCi1oYW5kbGVfY2FzdChfTXNnLCBTdGF0ZT0jaHR0cF90cmFuc3BvcnR7fSkgLT4KLSAgICB7bm9yZXBseSwgU3RhdGV9LgotCi1oYW5kbGVfaW5mbyhfSW5mbywgU3RhdGUpIC0+Ci0gICAge25vcmVwbHksIFN0YXRlfS4KLQotdGVybWluYXRlKF9SZWFzb24sIF9TdGF0ZSkgLT4KLSAgICBvay4KLQotY29kZV9jaGFuZ2UoX09sZFZzbiwgU3RhdGUsIF9FeHRyYSkgLT4KLSAgICB7b2ssIFN0YXRlfS4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUlIEludGVybmFsIGZ1bmN0aW9ucwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZG9fZmx1c2goU3RhdGUgPSAjaHR0cF90cmFuc3BvcnR7aG9zdCA9IEhvc3QsCislJSBGbHVzaGVzIHRoZSBidWZmZXIsIG1ha2luZyBhIHJlcXVlc3QKK2ZsdXNoKFN0YXRlID0gI2h0dHBfdHJhbnNwb3J0e2hvc3QgPSBIb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciA9IFJidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgPSBXYnVmLApAQCAtMTc5LDEwICs4NCwxMCBAQAogICAgIGNhc2UgaW9saXN0X3RvX2JpbmFyeShXYnVmKSBvZgogICAgICAgICA8PD4+IC0+CiAgICAgICAgICAgICAlJSBEb24ndCBib3RoZXIgZmx1c2hpbmcgZW1wdHkgYnVmZmVycy4KLSAgICAgICAgICAgIHtvaywgU3RhdGV9OworICAgICAgICAgICAge1N0YXRlLCBva307CiAgICAgICAgIFdCaW5hcnkgLT4KICAgICAgICAgICAgIHtvaywge3tfVmVyc2lvbiwgMjAwLCBfUmVhc29uUGhyYXNlfSwgX0hlYWRlcnMsIEJvZHl9fSA9Ci0gICAgICAgICAgICAgIGh0dHA6cmVxdWVzdChwb3N0LAorICAgICAgICAgICAgICBodHRwYzpyZXF1ZXN0KHBvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Imh0dHA6Ly8iICsrIEhvc3QgKysgUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeyJVc2VyLUFnZW50IiwgIkVybGFuZy90aHJpZnRfaHR0cF90cmFuc3BvcnQifSB8IEV4dHJhSGVhZGVyc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiwKQEAgLTE5Miw4ICs5NywyMCBAQAogCiAgICAgICAgICAgICBTdGF0ZTEgPSBTdGF0ZSNodHRwX3RyYW5zcG9ydHtyZWFkX2J1ZmZlciA9IFtSYnVmLCBCb2R5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciA9IFtdfSwKLSAgICAgICAgICAgIHtvaywgU3RhdGUxfQorICAgICAgICAgICAge1N0YXRlMSwgb2t9CiAgICAgZW5kLgogCi1taW4oQSxCKSB3aGVuIEE8QiAtPiBBOwotbWluKF8sQikgICAgICAgICAgLT4gQi4KK2Nsb3NlKFN0YXRlKSAtPgorICAgIHtTdGF0ZSwgb2t9LgorCityZWFkKFN0YXRlID0gI2h0dHBfdHJhbnNwb3J0e3JlYWRfYnVmZmVyID0gUkJ1Zn0sIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KKyAgICAlJSBQdWxsIG9mZiBHaXZlIGJ5dGVzLCByZXR1cm4gdGhlbSB0byB0aGUgdXNlciwgbGVhdmUgdGhlIHJlc3QgaW4gdGhlIGJ1ZmZlci4KKyAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKFJCdWYpLCBMZW4pLAorICAgIGNhc2UgaW9saXN0X3RvX2JpbmFyeShSQnVmKSBvZgorICAgICAgICA8PERhdGE6R2l2ZS9iaW5hcnksIFJCdWYxL2JpbmFyeT4+IC0+CisgICAgICAgICAgICBSZXNwb25zZSA9IHtvaywgRGF0YX0sCisgICAgICAgICAgICBTdGF0ZTEgPSBTdGF0ZSNodHRwX3RyYW5zcG9ydHtyZWFkX2J1ZmZlcj1SQnVmMX0sCisgICAgICAgICAgICB7U3RhdGUxLCBSZXNwb25zZX07CisgICAgICAgIF8gLT4KKyAgICAgICAgICAgIHtTdGF0ZSwge2Vycm9yLCAnRU9GJ319CisgICAgZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcGFyc2VyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3BhcnNlci5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU0N2YxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3BhcnNlci5lcmwKQEAgLTAsMCArMSw0MTkgQEAKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCislJSBUaGUganNvbiBwYXJzZXIgaW1wbGVtZW50YXRpb24gd2FzIGNyZWF0ZWQgYnkKKyUlIGFsaXNkYWlyIHN1bGxpdmFuIDxhbGlzZGFpckBoYXJ0YnJha2UuY29tPiBiYXNlZCBvbgorJSUgdGhlIGpzeCBqc29uIGxpYnJhcnkKKworLW1vZHVsZSh0aHJpZnRfanNvbl9wYXJzZXIpLgorLWV4cG9ydChbcGFyc2VyLzAsIGhhbmRsZV9ldmVudC8yXSkuCisKKworLXJlY29yZChjb25maWcsIHtzdHJpY3RfdXRmOCA9IGZhbHNlIDo6IGJvb2xlYW4oKX0pLgorCisKK3BhcnNlcigpIC0+IGZ1bihKU09OKSAtPiBzdGFydChKU09OLCB7P01PRFVMRSwgW119LCBbXSwgI2NvbmZpZ3t9KSBlbmQuCisKKworaGFuZGxlX2V2ZW50KEV2ZW50LCB7SGFuZGxlciwgU3RhdGV9LCBfQ29uZmlnKSAtPiB7SGFuZGxlciwgSGFuZGxlcjpoYW5kbGVfZXZlbnQoRXZlbnQsIFN0YXRlKX0uCisKK2hhbmRsZV9ldmVudChlbmRfanNvbiwgU3RhdGUpIC0+IGxpc3RzOnJldmVyc2UoW2VuZF9qc29uXSArKyBTdGF0ZSk7CitoYW5kbGVfZXZlbnQoRXZlbnQsIFN0YXRlKSAtPiBbRXZlbnRdICsrIFN0YXRlLgorCisKKyUlIHdoaXRlc3BhY2UKKy1kZWZpbmUoc3BhY2UsIDE2IzIwKS4KKy1kZWZpbmUodGFiLCAxNiMwOSkuCistZGVmaW5lKGNyLCAxNiMwRCkuCistZGVmaW5lKG5ld2xpbmUsIDE2IzBBKS4KKworJSUgb2JqZWN0IGRlbGltaXRlcnMKKy1kZWZpbmUoc3RhcnRfb2JqZWN0LCAxNiM3QikuCistZGVmaW5lKGVuZF9vYmplY3QsIDE2IzdEKS4KKworJSUgYXJyYXkgZGVsaW1pdGVycworLWRlZmluZShzdGFydF9hcnJheSwgMTYjNUIpLgorLWRlZmluZShlbmRfYXJyYXksIDE2IzVEKS4KKworJSUga3Ygc2VwZXJhdG9yCistZGVmaW5lKGNvbW1hLCAxNiMyQykuCistZGVmaW5lKGRvdWJsZXF1b3RlLCAxNiMyMikuCistZGVmaW5lKHNpbmdsZXF1b3RlLCAxNiMyNykuCistZGVmaW5lKGNvbG9uLCAxNiMzQSkuCisKKyUlIHN0cmluZyBlc2NhcGUgc2VxdWVuY2VzCistZGVmaW5lKHJzb2xpZHVzLCAxNiM1QykuCistZGVmaW5lKHNvbGlkdXMsIDE2IzJGKS4KKworJSUgbWF0aAorLWRlZmluZSh6ZXJvLCAxNiMzMCkuCistZGVmaW5lKGRlY2ltYWxwb2ludCwgMTYjMkUpLgorLWRlZmluZShuZWdhdGl2ZSwgMTYjMkQpLgorLWRlZmluZShwb3NpdGl2ZSwgMTYjMkIpLgorCislJSBjb21tZW50cworLWRlZmluZShzdGFyLCAxNiMyQSkuCisKKworJSUgc29tZSB1c2VmdWwgZ3VhcmRzCistZGVmaW5lKGlzX2hleChTeW1ib2wpLAorICAgIChTeW1ib2wgPj0gJGEgYW5kYWxzbyBTeW1ib2wgPTwgJGYpIG9yZWxzZQorICAgIChTeW1ib2wgPj0gJEEgYW5kYWxzbyBTeW1ib2wgPTwgJEYpIG9yZWxzZQorICAgIChTeW1ib2wgPj0gJDAgYW5kYWxzbyBTeW1ib2wgPTwgJDkpCispLgorCistZGVmaW5lKGlzX25vbnplcm8oU3ltYm9sKSwKKyAgICBTeW1ib2wgPj0gJDEgYW5kYWxzbyBTeW1ib2wgPTwgJDkKKykuCisKKy1kZWZpbmUoaXNfd2hpdGVzcGFjZShTeW1ib2wpLAorICAgIFN5bWJvbCA9Oj0gP3NwYWNlOyBTeW1ib2wgPTo9ID90YWI7IFN5bWJvbCA9Oj0gP2NyOyBTeW1ib2wgPTo9ID9uZXdsaW5lCispLgorCisKKyUlIGxpc3RzIGFyZSBiZW5jaG1hcmtlZCB0byBiZSBmYXN0ZXIgKHRobyBoaWdoZXIgaW4gbWVtb3J5IHVzYWdlKSB0aGFuIGJpbmFyaWVzCituZXdfc2VxKCkgLT4gW10uCituZXdfc2VxKEMpIC0+IFtDXS4KKworYWNjX3NlcShTZXEsIEMpIHdoZW4gaXNfbGlzdChDKSAtPiBsaXN0czpyZXZlcnNlKEMpICsrIFNlcTsKK2FjY19zZXEoU2VxLCBDKSAtPiBbQ10gKysgU2VxLgorCitlbmRfc2VxKFNlcSkgLT4gdW5pY29kZTpjaGFyYWN0ZXJzX3RvX2JpbmFyeShsaXN0czpyZXZlcnNlKFNlcSkpLgorCitlbmRfc2VxKFNlcSwgXykgLT4gZW5kX3NlcShTZXEpLgorCisKK3N0YXJ0KDw8MTYjZWYsIDE2I2JiLCAxNiNiZiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3N0YXJ0KEJpbiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShCaW4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpLgorCisKK3ZhbHVlKDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKCksIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDwkdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICB0cnVlKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDwkZiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmYWxzZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8JG4sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbnVsbChSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8P25lZ2F0aXZlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG5lZ2F0aXZlKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoJC0pLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8P3plcm8sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgemVybyhSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKCQwKSwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX25vbnplcm8oUykgLT4KKyAgICBpbnRlZ2VyKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoUyksIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDw/c3RhcnRfb2JqZWN0LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG9iamVjdChSZXN0LCBoYW5kbGVfZXZlbnQoc3RhcnRfb2JqZWN0LCBIYW5kbGVyLCBDb25maWcpLCBba2V5fFN0YWNrXSwgQ29uZmlnKTsKK3ZhbHVlKDw8P3N0YXJ0X2FycmF5LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGFycmF5KFJlc3QsIGhhbmRsZV9ldmVudChzdGFydF9hcnJheSwgSGFuZGxlciwgQ29uZmlnKSwgW2FycmF5fFN0YWNrXSwgQ29uZmlnKTsKK3ZhbHVlKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIHZhbHVlKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwordmFsdWUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitvYmplY3QoPDw/ZG91YmxlcXVvdGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoKSwgU3RhY2ssIENvbmZpZyk7CitvYmplY3QoPDw/ZW5kX29iamVjdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2tleXxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfb2JqZWN0LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK29iamVjdCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX3doaXRlc3BhY2UoUykgLT4KKyAgICBvYmplY3QoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CitvYmplY3QoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCithcnJheSg8PD9lbmRfYXJyYXksIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFthcnJheXxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfYXJyYXksIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworYXJyYXkoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgYXJyYXkoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CithcnJheShCaW4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgdmFsdWUoQmluLCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKS4KKworCitjb2xvbig8PD9jb2xvbiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2tleXxTdGFja10sIENvbmZpZykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBbb2JqZWN0fFN0YWNrXSwgQ29uZmlnKTsKK2NvbG9uKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIGNvbG9uKFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOworY29sb24oX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitrZXkoPDw/ZG91YmxlcXVvdGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIG5ld19zZXEoKSwgU3RhY2ssIENvbmZpZyk7CitrZXkoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAga2V5KFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOwora2V5KF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworJSUgbm90ZSB0aGF0IGlmIHlvdSBlbmNvdW50ZXIgYW4gZXJyb3IgZnJvbSBzdHJpbmcgYW5kIHlvdSBjYW4ndCBmaW5kIHRoZSBjbGF1c2UgdGhhdAorJSUgIGNhdXNlZCBpdCBoZXJlLCBpdCBtaWdodCBiZSBpbiB1bmVzY2FwZSBiZWxvdworc3RyaW5nKDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZG91YmxlcXVvdGUoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PD9zb2xpZHVzLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCA/c29saWR1cyksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8P3Jzb2xpZHVzL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICB1bmVzY2FwZShSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiMyMCwgWCA8IDE2IzIwMjggLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPT0gMTYjMjAyODsgWCA9PSAxNiMyMDI5IC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID4gMTYjMjAyOSwgWCA8IDE2I2Q4MDAgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPiAxNiNkZmZmLCBYIDwgMTYjZmRkMCAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+IDE2I2ZkZWYsIFggPCAxNiNmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzEwMDAwLCBYIDwgMTYjMWZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjMjAwMDAsIFggPCAxNiMyZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiMzMDAwMCwgWCA8IDE2IzNmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzQwMDAwLCBYIDwgMTYjNGZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjNTAwMDAsIFggPCAxNiM1ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM2MDAwMCwgWCA8IDE2IzZmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzcwMDAwLCBYIDwgMTYjN2ZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjODAwMDAsIFggPCAxNiM4ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM5MDAwMCwgWCA8IDE2IzlmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2EwMDAwLCBYIDwgMTYjYWZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjYjAwMDAsIFggPCAxNiNiZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNjMDAwMCwgWCA8IDE2I2NmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2QwMDAwLCBYIDwgMTYjZGZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjZTAwMDAsIFggPCAxNiNlZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNmMDAwMCwgWCA8IDE2I2ZmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzEwMDAwMCwgWCA8IDE2IzEwZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworJSUgc3Vycm9nYXRlcworc3RyaW5nKDw8MjM3LCBYLCBfLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCisgICAgICAgIHdoZW4gWCA+PSAxNjAgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKKyUlIHUreGZmZmUsIHUreGZmZmYsIGNvbnRyb2wgY29kZXMgYW5kIG90aGVyIG5vbmNoYXJhY3RlcnMKK3N0cmluZyg8PF8vdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpOworJSUgdStmZmZlIGFuZCB1K2ZmZmYgZm9yIFIxNEJYWCAoc3Vic2VxdWVudCBydW50aW1lcyB3aWxsIGhhcHBpbHkgbWF0Y2ggdGhlCislJSAgcHJlY2VkaW5nIGNsYXVzZQorc3RyaW5nKDw8MjM5LCAxOTEsIFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkKKyAgICAgICAgd2hlbiBYID09IDE5MDsgWCA9PSAxOTEgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKKyUlIG92ZXJsb25nIGVuY29kaW5ncyBhbmQgbWlzc2luZyBjb250aW51YXRpb25zIG9mIGEgMiBieXRlIHNlcXVlbmNlCitzdHJpbmcoPDxYLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCisgICAgICAgIHdoZW4gWCA+PSAxOTIsIFggPTwgMjIzIC0+CisgICAgc3RyaXBfY29udGludWF0aW9ucyhSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIDEpOworJSUgb3ZlcmxvbmcgZW5jb2RpbmdzIGFuZCBtaXNzaW5nIGNvbnRpbnVhdGlvbnMgb2YgYSAzIGJ5dGUgc2VxdWVuY2UKK3N0cmluZyg8PFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkKKyAgICAgICAgd2hlbiBYID49IDIyNCwgWCA9PCAyMzkgLT4KKyAgICBzdHJpcF9jb250aW51YXRpb25zKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgMik7CislJSBvdmVybG9uZyBlbmNvZGluZ3MgYW5kIG1pc3NpbmcgY29udGludWF0aW9ucyBvZiBhIDQgYnl0ZSBzZXF1ZW5jZQorc3RyaW5nKDw8WCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KQorICAgICAgICB3aGVuIFggPj0gMjQwLCBYID08IDI0NyAtPgorICAgIHN0cmlwX2NvbnRpbnVhdGlvbnMoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCAzKTsKKyUlIGluY29tcGxldGVzIGFuZCB1bmV4cGVjdGVkIGJ5dGVzLCBpbmNsdWRpbmcgb3JwaGFuIGNvbnRpbnVhdGlvbnMKK3N0cmluZyg8PF8sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyhfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitkb3VibGVxdW90ZShSZXN0LCBIYW5kbGVyLCBBY2MsIFtrZXl8X10gPSBTdGFjaywgQ29uZmlnKSAtPgorICAgIGNvbG9uKFJlc3QsIGhhbmRsZV9ldmVudCh7a2V5LCBlbmRfc2VxKEFjYywgQ29uZmlnKX0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworZG91YmxlcXVvdGUoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KHtzdHJpbmcsIGVuZF9zZXEoQWNjLCBDb25maWcpfSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZykuCisKKworJSUgc3RyaXBzIGNvbnRpbnVhdGlvbiBieXRlcyBhZnRlciBiYWQgdXRmIGJ5dGVzLCBndWFyZHMgYWdhaW5zdCBib3RoIHRvbyBzaG9ydAorJSUgIGFuZCBvdmVybG9uZyBzZXF1ZW5jZXMuIE4gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0cmlwCitzdHJpcF9jb250aW51YXRpb25zKDw8UmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCAwKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpOworc3RyaXBfY29udGludWF0aW9ucyg8PFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgTikgd2hlbiBYID49IDEyOCwgWCA9PCAxOTEgLT4KKyAgICBzdHJpcF9jb250aW51YXRpb25zKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgTiAtIDEpOworJSUgbm90IGEgY29udGludWF0aW9uIGJ5dGUsIGluc2VydCBhIHJlcGxhY2VtZW50IGNoYXJhY3RlciBmb3Igc2VxdWVuY2UgdGh1cworJSUgIGZhciBhbmQgZGlzcGF0Y2ggYmFjayB0byBzdHJpbmcKK3N0cmlwX2NvbnRpbnVhdGlvbnMoPDxSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIF8pIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZykuCisKKworJSUgdGhpcyBhbGwgZ2V0cyByZWFsbHkgZ3Jvc3MgYW5kIHNob3VsZCBwcm9iYWJseSBldmVudHVhbGx5IGJlIGZvbGRlZCBpbnRvCislJSAgYnV0IGZvciBub3cgaXQgZmFrZXMgYmVpbmcgcGFydCBvZiBzdHJpbmcgb24gaW5jb21wbGV0ZXMgYW5kIGVycm9ycwordW5lc2NhcGUoPDwkYiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFxiKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCRmLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXGYpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JG4sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRcbiksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDwkciwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFxyKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR0LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXHQpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXCIpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8P3Jzb2xpZHVzLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXFwpLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8P3NvbGlkdXMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICQvKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR1LCAkZCwgQSwgQiwgQywgP3Jzb2xpZHVzLCAkdSwgJGQsIFgsIFksIFosIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykKKyAgICAgICAgd2hlbiAoQSA9PSAkOCBvcmVsc2UgQSA9PSAkOSBvcmVsc2UgQSA9PSAkYSBvcmVsc2UgQSA9PSAkYiksCisgICAgICAgICAgICAgKFggPT0gJGMgb3JlbHNlIFggPT0gJGQgb3JlbHNlIFggPT0gJGUgb3JlbHNlIFggPT0gJGYpLAorICAgICAgICAgICAgID9pc19oZXgoQiksID9pc19oZXgoQyksID9pc19oZXgoWSksID9pc19oZXgoWikKKyAgICAgICAgLT4KKyAgICBIaWdoID0gZXJsYW5nOmxpc3RfdG9faW50ZWdlcihbJGQsIEEsIEIsIENdLCAxNiksCisgICAgTG93ID0gZXJsYW5nOmxpc3RfdG9faW50ZWdlcihbJGQsIFgsIFksIFpdLCAxNiksCisgICAgQ29kZXBvaW50ID0gKEhpZ2ggLSAxNiNkODAwKSAqIDE2IzQwMCArIChMb3cgLSAxNiNkYzAwKSArIDE2IzEwMDAwLAorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgQ29kZXBvaW50KSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR1LCAkZCwgQSwgQiwgQywgP3Jzb2xpZHVzLCAkdSwgVywgWCwgWSwgWiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKQorICAgICAgICB3aGVuIChBID09ICQ4IG9yZWxzZSBBID09ICQ5IG9yZWxzZSBBID09ICRhIG9yZWxzZSBBID09ICRiKSwKKyAgICAgICAgICAgICA/aXNfaGV4KEIpLCA/aXNfaGV4KEMpLCA/aXNfaGV4KFcpLCA/aXNfaGV4KFgpLCA/aXNfaGV4KFkpLCA/aXNfaGV4KFopCisgICAgICAgIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBbMTYjZmZmZCwgMTYjZmZmZF0pLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JHUsIEEsIEIsIEMsIEQsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykKKyAgICAgICAgd2hlbiA/aXNfaGV4KEEpLCA/aXNfaGV4KEIpLCA/aXNfaGV4KEMpLCA/aXNfaGV4KEQpIC0+CisgICAgY2FzZSBlcmxhbmc6bGlzdF90b19pbnRlZ2VyKFtBLCBCLCBDLCBEXSwgMTYpIG9mCisgICAgICAgIENvZGVwb2ludCB3aGVuIENvZGVwb2ludCA8IDE2I2Q4MDA7IENvZGVwb2ludCA+IDE2I2RmZmYgLT4KKyAgICAgICAgICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgQ29kZXBvaW50KSwgU3RhY2ssIENvbmZpZyk7CisgICAgICAgIF8gLT4KKyAgICAgICAgICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpCisgICAgZW5kOwordW5lc2NhcGUoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCislJSBsaWtlIGluIHN0cmluZ3MsIHRoZXJlJ3Mgc29tZSBwc2V1ZG8gc3RhdGVzIGluIGhlcmUgdGhhdCB3aWxsIG5ldmVyCislJSAgc2hvdyB1cCBpbiBlcnJvcnMgb3IgaW5jb21wbGV0ZXMuIHNvbWUgc2hvdyB1cCBpbiB2YWx1ZSwgc29tZSBzaG93CislJSAgdXAgaW4gaW50ZWdlciwgZGVjaW1hbCBvciBleHAKK25lZ2F0aXZlKDw8JDAsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICB6ZXJvKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkMCksIFN0YWNrLCBDb25maWcpOworbmVnYXRpdmUoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX25vbnplcm8oUykgLT4KKyAgICBpbnRlZ2VyKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CituZWdhdGl2ZShfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK3plcm8oPDw/ZGVjaW1hbHBvaW50LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZGVjaW1hbChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgP2RlY2ltYWxwb2ludCksIFN0YWNrLCBDb25maWcpOworemVybyg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSAkZTsgUyA9Oj0gJEUgLT4KKyAgICBlKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAiLjBlIiksIFN0YWNrLCBDb25maWcpOworemVybyhCaW4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmaW5pc2hfbnVtYmVyKEJpbiwgSGFuZGxlciwge3plcm8sIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2ludGVnZXIoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgaW50ZWdlcihSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworaW50ZWdlcig8PD9kZWNpbWFscG9pbnQsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBpbml0aWFsZGVjaW1hbChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgP2RlY2ltYWxwb2ludCksIFN0YWNrLCBDb25maWcpOworaW50ZWdlcig8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSAkZTsgUyA9Oj0gJEUgLT4KKyAgICBlKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAiLjBlIiksIFN0YWNrLCBDb25maWcpOworaW50ZWdlcihCaW4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmaW5pc2hfbnVtYmVyKEJpbiwgSGFuZGxlciwge2ludGVnZXIsIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2luaXRpYWxkZWNpbWFsKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGRlY2ltYWwoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2luaXRpYWxkZWNpbWFsKF9CaW4sIF9IYW5kbGVyLCBfQWNjLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworZGVjaW1hbCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBkZWNpbWFsKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CitkZWNpbWFsKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ICRlOyBTID06PSAkRSAtPgorICAgIGUoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRlKSwgU3RhY2ssIENvbmZpZyk7CitkZWNpbWFsKEJpbiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGZpbmlzaF9udW1iZXIoQmluLCBIYW5kbGVyLCB7ZGVjaW1hbCwgQWNjfSwgU3RhY2ssIENvbmZpZykuCisKKworZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBleHAoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2UoPDxTaWduLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gU2lnbiA9Oj0gP3Bvc2l0aXZlOyBTaWduID06PSA/bmVnYXRpdmUgLT4KKyAgICBleChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgU2lnbiksIFN0YWNrLCBDb25maWcpOworZShfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2V4KDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGV4cChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworZXgoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitleHAoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgZXhwKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CitleHAoQmluLCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZmluaXNoX251bWJlcihCaW4sIEhhbmRsZXIsIHtleHAsIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2ZpbmlzaF9udW1iZXIoUmVzdCwgSGFuZGxlciwgQWNjLCBbXSwgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGZvcm1hdF9udW1iZXIoQWNjKSwgSGFuZGxlciwgQ29uZmlnKSwgW10sIENvbmZpZyk7CitmaW5pc2hfbnVtYmVyKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChmb3JtYXRfbnVtYmVyKEFjYyksIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpLgorCisKK2Zvcm1hdF9udW1iZXIoe3plcm8sIEFjY30pIC0+IHtpbnRlZ2VyLCBsaXN0X3RvX2ludGVnZXIobGlzdHM6cmV2ZXJzZShBY2MpKX07Citmb3JtYXRfbnVtYmVyKHtpbnRlZ2VyLCBBY2N9KSAtPiB7aW50ZWdlciwgbGlzdF90b19pbnRlZ2VyKGxpc3RzOnJldmVyc2UoQWNjKSl9OworZm9ybWF0X251bWJlcih7ZGVjaW1hbCwgQWNjfSkgLT4ge2Zsb2F0LCBsaXN0X3RvX2Zsb2F0KGxpc3RzOnJldmVyc2UoQWNjKSl9OworZm9ybWF0X251bWJlcih7ZXhwLCBBY2N9KSAtPiB7ZmxvYXQsIGxpc3RfdG9fZmxvYXQobGlzdHM6cmV2ZXJzZShBY2MpKX0uCisKKwordHJ1ZSg8PCRyLCAkdSwgJGUsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoe2xpdGVyYWwsIHRydWV9LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK3RydWUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitmYWxzZSg8PCRhLCAkbCwgJHMsICRlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KHtsaXRlcmFsLCBmYWxzZX0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworZmFsc2UoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitudWxsKDw8JHUsICRsLCAkbCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudCh7bGl0ZXJhbCwgbnVsbH0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpOworbnVsbChfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK21heWJlX2RvbmUoPDxSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbXSwgQ29uZmlnKSAtPgorICAgIGRvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGVuZF9qc29uLCBIYW5kbGVyLCBDb25maWcpLCBbXSwgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/ZW5kX29iamVjdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW29iamVjdHxTdGFja10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfb2JqZWN0LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/ZW5kX2FycmF5LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbYXJyYXl8U3RhY2tdLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoZW5kX2FycmF5LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/Y29tbWEsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFtvYmplY3R8U3RhY2tdLCBDb25maWcpIC0+CisgICAga2V5KFJlc3QsIEhhbmRsZXIsIFtrZXl8U3RhY2tdLCBDb25maWcpOworbWF5YmVfZG9uZSg8PD9jb21tYSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2FycmF5fF9dID0gU3RhY2ssIENvbmZpZykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK21heWJlX2RvbmUoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitkb25lKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW10sIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIGRvbmUoUmVzdCwgSGFuZGxlciwgW10sIENvbmZpZyk7Citkb25lKDw8Pj4sIHtfSGFuZGxlciwgU3RhdGV9LCBbXSwgX0NvbmZpZykgLT4gU3RhdGU7Citkb25lKF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+IGVybGFuZzplcnJvcihiYWRhcmcpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjNkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwKQEAgLTAsMCArMSw1NjcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorJSUgVGhlIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gd2FzIGNyZWF0ZWQgYnkKKyUlIFBldGVyIE5ldW1hcmsgPG5ldW1hcmsucGV0ZXJAZ21haWwuY29tPiBiYXNlZCBvbgorJSUgdGhlIGJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbi4KKworLW1vZHVsZSh0aHJpZnRfanNvbl9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistZXhwb3J0KFtuZXcvMSwgbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMSwKKyAgICAgICAgIG5ld19wcm90b2NvbF9mYWN0b3J5LzIKKyAgICAgICAgXSkuCisKKy1yZWNvcmQoanNvbl9jb250ZXh0LCB7CisgICAgJSB0aGUgdHlwZSBvZiBqc29uX2NvbnRleHQ6IGFycmF5IG9yIG9iamVjdAorICAgIHR5cGUsCisgICAgJSBmaWVsZHMgcmVhZCBvciB3cml0dGVuCisgICAgZmllbGRzX3Byb2Nlc3NlZCA9IDAKK30pLgorCistcmVjb3JkKGpzb25fcHJvdG9jb2wsIHsKKyAgICB0cmFuc3BvcnQsCisgICAgY29udGV4dF9zdGFjayA9IFtdLAorICAgIGpzeAorfSkuCistdHlwZSBzdGF0ZSgpIDo6ICNqc29uX3Byb3RvY29se30uCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWRlZmluZShWRVJTSU9OXzEsIDEpLgorLWRlZmluZShKU09OX0RPVUJMRV9QUkVDSVNJT04sIDE2KS4KKwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0JPT0wpIC0+ICJ0ZiI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfQllURSkgLT4gImk4IjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9ET1VCTEUpIC0+ICJkYmwiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0k4KSAtPiAiaTgiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX0kxNikgLT4gImkxNiI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfSTMyKSAtPiAiaTMyIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9JNjQpIC0+ICJpNjQiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX1NUUklORykgLT4gInN0ciI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfU1RSVUNUKSAtPiAicmVjIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9NQVApIC0+ICJtYXAiOwordHlwZWlkX3RvX2pzb24oP3RUeXBlX1NFVCkgLT4gInNldCI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfTElTVCkgLT4gImxzdCIuCisKK2pzb25fdG9fdHlwZWlkKCJ0ZiIpIC0+ID90VHlwZV9CT09MOworanNvbl90b190eXBlaWQoImRibCIpIC0+ID90VHlwZV9ET1VCTEU7Citqc29uX3RvX3R5cGVpZCgiaTgiKSAtPiA/dFR5cGVfSTg7Citqc29uX3RvX3R5cGVpZCgiaTE2IikgLT4gP3RUeXBlX0kxNjsKK2pzb25fdG9fdHlwZWlkKCJpMzIiKSAtPiA/dFR5cGVfSTMyOworanNvbl90b190eXBlaWQoImk2NCIpIC0+ID90VHlwZV9JNjQ7Citqc29uX3RvX3R5cGVpZCgic3RyIikgLT4gP3RUeXBlX1NUUklORzsKK2pzb25fdG9fdHlwZWlkKCJyZWMiKSAtPiA/dFR5cGVfU1RSVUNUOworanNvbl90b190eXBlaWQoIm1hcCIpIC0+ID90VHlwZV9NQVA7Citqc29uX3RvX3R5cGVpZCgic2V0IikgLT4gP3RUeXBlX1NFVDsKK2pzb25fdG9fdHlwZWlkKCJsc3QiKSAtPiA/dFR5cGVfTElTVC4KKworc3RhcnRfY29udGV4dChvYmplY3QpIC0+ICJ7IjsKK3N0YXJ0X2NvbnRleHQoYXJyYXkpIC0+ICJbIi4KKworZW5kX2NvbnRleHQob2JqZWN0KSAtPiAifSI7CitlbmRfY29udGV4dChhcnJheSkgLT4gIl0iLgorCisKK25ldyhUcmFuc3BvcnQpIC0+CisgICAgbmV3KFRyYW5zcG9ydCwgX09wdGlvbnMgPSBbXSkuCisKK25ldyhUcmFuc3BvcnQsIF9PcHRpb25zKSAtPgorICAgIFN0YXRlICA9ICNqc29uX3Byb3RvY29se3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0sCisgICAgdGhyaWZ0X3Byb3RvY29sOm5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKK2ZsdXNoX3RyYW5zcG9ydChUaGlzID0gI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLAorICAgIHtUaGlzI2pzb25fcHJvdG9jb2x7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnQsCisgICAgICAgICAgICBjb250ZXh0X3N0YWNrID0gW10KKyAgICAgICAgfSwgUmVzdWx0fS4KKworY2xvc2VfdHJhbnNwb3J0KFRoaXMgPSAjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgorICAgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCksCisgICAge1RoaXMjanNvbl9wcm90b2NvbHsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydCwKKyAgICAgICAgICAgIGNvbnRleHRfc3RhY2sgPSBbXSwKKyAgICAgICAgICAgIGpzeCA9IHVuZGVmaW5lZAorICAgICAgICB9LCBSZXN1bHR9LgorCislJSUKKyUlJSBpbnN0YW5jZSBtZXRob2RzCislJSUKKyUgcGxhY2VzIGEgbmV3IGNvbnRleHQgb24gdGhlIHN0YWNrOgord3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFN0YWNrfSA9IFN0YXRlMCwge2VudGVyX2NvbnRleHQsIFR5cGV9KSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IHdyaXRlX3ZhbHVlcyhTdGF0ZTAsIFt7Y29udGV4dF9wcmVfaXRlbSwgZmFsc2V9XSksCisgICAgU3RhdGUyID0gU3RhdGUxI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFsKKyAgICAgICAgI2pzb25fY29udGV4dHt0eXBlPVR5cGV9fFN0YWNrXX0sCisgICAgd3JpdGVfdmFsdWVzKFN0YXRlMiwgIFtsaXN0X3RvX2JpbmFyeShzdGFydF9jb250ZXh0KFR5cGUpKV0pOworCislIHJlbW92ZXMgdGhlIHRvcG1vc3QgY29udGV4dCBmcm9tIHN0YWNrICAgIAord3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFtDdXJyQ3R4dHxTdGFja119ID0gU3RhdGUwLCB7ZXhpdF9jb250ZXh0fSkgLT4KKyAgICBUeXBlID0gQ3VyckN0eHQjanNvbl9jb250ZXh0LnR5cGUsCisgICAgU3RhdGUxID0gU3RhdGUwI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFN0YWNrfSwKKyAgICB3cml0ZV92YWx1ZXMoU3RhdGUxLCBbCisgICAgICAgICAgICBsaXN0X3RvX2JpbmFyeShlbmRfY29udGV4dChUeXBlKSksCisgICAgICAgICAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIGZhbHNlfQorICAgICAgICBdKTsKKworJSB3cml0ZXMgbmVjZXNzYXJ5IHByZWx1ZGUgdG8gZmllbGQgb3IgY29udGFpbmVyIGRlcGVuZGluZyBvbiBjdXJyZW50IGNvbnRleHQgICAKK3dyaXRlKCNqc29uX3Byb3RvY29se2NvbnRleHRfc3RhY2sgPSBbXX0gPSBUaGlzMCwKKyAgICB7Y29udGV4dF9wcmVfaXRlbSwgX30pIC0+IHtUaGlzMCwgb2t9Oword3JpdGUoI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjayA9IFtDb250ZXh0fF9DdHh0VGFpbF19ID0gVGhpczAsCisgICAge2NvbnRleHRfcHJlX2l0ZW0sIE1heU5lZWRRdW90ZXN9KSAtPgorICAgIEZpZWxkTm8gPSBDb250ZXh0I2pzb25fY29udGV4dC5maWVsZHNfcHJvY2Vzc2VkLAorICAgIEN0eHRUeXBlID0gQ29udGV4dCNqc29uX2NvbnRleHQudHlwZSwKKyAgICBSZW0gPSBGaWVsZE5vIHJlbSAyLAorICAgIGNhc2Uge0N0eHRUeXBlLCBGaWVsZE5vLCBSZW0sIE1heU5lZWRRdW90ZXN9IG9mCisgICAgICAgIHthcnJheSwgTiwgXywgX30gd2hlbiBOID4gMCAtPiAgJSBhcnJheSBlbGVtZW50IChub3QgZmlyc3QpCisgICAgICAgICAgICB3cml0ZShUaGlzMCwgPDwiLCI+Pik7CisgICAgICAgIHtvYmplY3QsIDAsIF8sIHRydWV9IC0+ICUgbm9uLXN0cmluZyBvYmplY3Qga2V5IChmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCJcIiI+Pik7CisgICAgICAgIHtvYmplY3QsIE4sIDAsIHRydWV9IHdoZW4gTiA+IDAgLT4gJSBub24tc3RyaW5nIG9iamVjdCBrZXkgKG5vdCBmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCIsXCIiPj4pOworICAgICAgICB7b2JqZWN0LCBOLCAwLCBmYWxzZX0gd2hlbiBOID4gMC0+ICUgc3RyaW5nIG9iamVjdCBrZXkgKG5vdCBmaXJzdCkKKyAgICAgICAgICAgIHdyaXRlKFRoaXMwLCA8PCIsIj4+KTsKKyAgICAgICAgXyAtPiAlIG5vIHByZS1maWVsZCBuZWNlc3NhcnkKKyAgICAgICAgICAgIHtUaGlzMCwgb2t9CisgICAgZW5kOworCislIHdyaXRlcyBuZWNlc3NhcnkgcG9zdGx1ZGUgdG8gZmllbGQgb3IgY29udGFpbmVyIGRlcGVuZGluZyBvbiBjdXJyZW50IGNvbnRleHQgICAKK3dyaXRlKCNqc29uX3Byb3RvY29se2NvbnRleHRfc3RhY2sgPSBbXX0gPSBUaGlzMCwKKyAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIF99KSAtPiB7VGhpczAsIG9rfTsKK3dyaXRlKCNqc29uX3Byb3RvY29se2NvbnRleHRfc3RhY2sgPSBbQ29udGV4dHxDdHh0VGFpbF19ID0gVGhpczAsCisgICAge2NvbnRleHRfcG9zdF9pdGVtLCBNYXlOZWVkUXVvdGVzfSkgLT4KKyAgICBGaWVsZE5vID0gQ29udGV4dCNqc29uX2NvbnRleHQuZmllbGRzX3Byb2Nlc3NlZCwKKyAgICBDdHh0VHlwZSA9IENvbnRleHQjanNvbl9jb250ZXh0LnR5cGUsCisgICAgUmVtID0gRmllbGRObyByZW0gMiwKKyAgICB7VGhpczEsIG9rfSA9IGNhc2Uge0N0eHRUeXBlLCBSZW0sIE1heU5lZWRRdW90ZXN9IG9mCisgICAgICAgIHtvYmplY3QsIDAsIHRydWV9IC0+ICUgbm9uLXN0cmluZyBvYmplY3Qga2V5IAorICAgICAgICAgICAgd3JpdGUoVGhpczAsIDw8IlwiOiI+Pik7CisgICAgICAgIHtvYmplY3QsIDAsIGZhbHNlfSAtPiAlIHN0cmluZyBvYmplY3Qga2V5IAorICAgICAgICAgICAgd3JpdGUoVGhpczAsIDw8IjoiPj4pOworICAgICAgICBfIC0+ICUgbm8gcHJlLWZpZWxkIG5lY2Vzc2FyeQorICAgICAgICAgICAge1RoaXMwLCBva30KKyAgICBlbmQsCisgICAgTmV3Q29udGV4dCA9IENvbnRleHQjanNvbl9jb250ZXh0e2ZpZWxkc19wcm9jZXNzZWQgPSBGaWVsZE5vICsgMX0sCisgICAge1RoaXMxI2pzb25fcHJvdG9jb2x7Y29udGV4dF9zdGFjaz1bTmV3Q29udGV4dHxDdHh0VGFpbF19LCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICBuYW1lID0gTmFtZSwKKyAgICB0eXBlID0gVHlwZSwKKyAgICBzZXFpZCA9IFNlcWlkfSkgLT4KKyAgICB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2VudGVyX2NvbnRleHQsIGFycmF5fSwKKyAgICAgICAge2kzMiwgP1ZFUlNJT05fMX0sCisgICAgICAgIHtzdHJpbmcsIE5hbWV9LAorICAgICAgICB7aTMyLCBUeXBlfSwKKyAgICAgICAge2kzMiwgU2VxaWR9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiAgCisgICAgd3JpdGVfdmFsdWVzKFRoaXMsIFt7ZXhpdF9jb250ZXh0fV0pOworCislIEV4YW1wbGUgZmllbGQgZXhwcmVzc2lvbjogIjEiOnsiZGJsIjozLjE0fQord3JpdGUoVGhpczAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsKKyAgICAgICBuYW1lID0gX05hbWUsCisgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgaWQgPSBJZH0pIC0+CisgICAgd3JpdGVfdmFsdWVzKFRoaXMwLCBbCisgICAgICAgICUgZW50ZXJpbmcgJ291dGVyJyBvYmplY3QKKyAgICAgICAge2kxNiwgSWR9LAorICAgICAgICAlIGVudGVyaW5nICdvdXRlcicgb2JqZWN0CisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBvYmplY3R9LAorICAgICAgICB7c3RyaW5nLCB0eXBlaWRfdG9fanNvbihUeXBlKX0KKyAgICBdKTsKKword3JpdGUoVGhpcywgZmllbGRfc3RvcCkgLT4gCisgICAge1RoaXMsIG9rfTsKKword3JpdGUoVGhpcywgZmllbGRfZW5kKSAtPiAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcyxbe2V4aXRfY29udGV4dH1dKTsKKworJSBFeGFtcGxlIG1lc3NhZ2Ugd2l0aCBtYXA6IFsxLCJ0ZXN0TWFwIiwxLDAseyIxIjp7Im1hcCI6WyJpMzIiLCJpMzIiLDMseyI3Ijo3NywiOCI6ODgsIjkiOjk5fV19fV0KK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWFwX2JlZ2lueworICAgICAgIGt0eXBlID0gS3R5cGUsCisgICAgICAgdnR5cGUgPSBWdHlwZSwKKyAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgICAgd3JpdGVfdmFsdWVzKFRoaXMwLCBbCisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBhcnJheX0sCisgICAgICAgIHtzdHJpbmcsIHR5cGVpZF90b19qc29uKEt0eXBlKX0sCisgICAgICAgIHtzdHJpbmcsIHR5cGVpZF90b19qc29uKFZ0eXBlKX0sCisgICAgICAgIHtpMzIsIFNpemV9LAorICAgICAgICB7ZW50ZXJfY29udGV4dCwgb2JqZWN0fQorICAgIF0pOworCit3cml0ZShUaGlzLCBtYXBfZW5kKSAtPiAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcyxbCisgICAgICAgIHtleGl0X2NvbnRleHR9LAorICAgICAgICB7ZXhpdF9jb250ZXh0fQorICAgIF0pOworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAgICB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2VudGVyX2NvbnRleHQsIGFycmF5fSwKKyAgICAgICAge3N0cmluZywgdHlwZWlkX3RvX2pzb24oRXR5cGUpfSwKKyAgICAgICAge2kzMiwgU2l6ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywgbGlzdF9lbmQpIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLFsKKyAgICAgICAge2V4aXRfY29udGV4dH0KKyAgICBdKTsKKworJSBleGFtcGxlIG1lc3NhZ2Ugd2l0aCBzZXQ6IFsxLCJ0ZXN0U2V0IiwxLDAseyIxIjp7InNldCI6WyJpMzIiLDMsMSwyLDNdfX1dCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX3NldF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICAgIHdyaXRlX3ZhbHVlcyhUaGlzMCwgWworICAgICAgICB7ZW50ZXJfY29udGV4dCwgYXJyYXl9LAorICAgICAgICB7c3RyaW5nLCB0eXBlaWRfdG9fanNvbihFdHlwZSl9LAorICAgICAgICB7aTMyLCBTaXplfQorICAgIF0pOworCit3cml0ZShUaGlzLCBzZXRfZW5kKSAtPiAKKyAgICB3cml0ZV92YWx1ZXMoVGhpcyxbCisgICAgICAgIHtleGl0X2NvbnRleHR9CisgICAgXSk7CislIGV4YW1wbGUgbWVzc2FnZSB3aXRoIHN0cnVjdDogWzEsInRlc3RTdHJ1Y3QiLDEsMCx7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fX1dCit3cml0ZShUaGlzLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLCBbCisgICAgICAgIHtlbnRlcl9jb250ZXh0LCBvYmplY3R9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIHN0cnVjdF9lbmQpIC0+IAorICAgIHdyaXRlX3ZhbHVlcyhUaGlzLFsKKyAgICAgICAge2V4aXRfY29udGV4dH0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2Jvb2wsIHRydWV9KSAgLT4gd3JpdGVfdmFsdWVzKFRoaXMsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIHRydWV9LAorICAgICAgICA8PCJ0cnVlIj4+LAorICAgICAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIHRydWV9CisgICAgXSk7CisKK3dyaXRlKFRoaXMsIHtib29sLCBmYWxzZX0pIC0+IHdyaXRlX3ZhbHVlcyhUaGlzLCBbCisgICAgICAgIHtjb250ZXh0X3ByZV9pdGVtLCB0cnVlfSwKKyAgICAgICAgPDwiZmFsc2UiPj4sCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgdHJ1ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2J5dGUsIEJ5dGV9KSAtPiB3cml0ZV92YWx1ZXMoVGhpcywgWworICAgICAgICB7Y29udGV4dF9wcmVfaXRlbSwgdHJ1ZX0sCisgICAgICAgIGxpc3RfdG9fYmluYXJ5KGludGVnZXJfdG9fbGlzdChCeXRlKSksCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgdHJ1ZX0KKyAgICBdKTsKKword3JpdGUoVGhpcywge2kxNiwgSTE2fSkgLT4KKyAgICB3cml0ZShUaGlzLCB7Ynl0ZSwgSTE2fSk7CisKK3dyaXRlKFRoaXMsIHtpMzIsIEkzMn0pIC0+CisgICAgd3JpdGUoVGhpcywge2J5dGUsIEkzMn0pOworCit3cml0ZShUaGlzLCB7aTY0LCBJNjR9KSAtPgorICAgIHdyaXRlKFRoaXMsIHtieXRlLCBJNjR9KTsKKword3JpdGUoVGhpcywge2RvdWJsZSwgRG91YmxlfSkgLT4gd3JpdGVfdmFsdWVzKFRoaXMsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIHRydWV9LAorICAgICAgICBsaXN0X3RvX2JpbmFyeShpb19saWI6Zm9ybWF0KCJ+LipmIiwgWz9KU09OX0RPVUJMRV9QUkVDSVNJT04sRG91YmxlXSkpLAorICAgICAgICB7Y29udGV4dF9wb3N0X2l0ZW0sIHRydWV9CisgICAgXSk7CisKK3dyaXRlKFRoaXMwLCB7c3RyaW5nLCBTdHJ9KSAtPiB3cml0ZV92YWx1ZXMoVGhpczAsIFsKKyAgICAgICAge2NvbnRleHRfcHJlX2l0ZW0sIGZhbHNlfSwKKyAgICAgICAgY2FzZSBpc19iaW5hcnkoU3RyKSBvZgorICAgICAgICAgICAgdHJ1ZSAtPiBTdHI7CisgICAgICAgICAgICBmYWxzZSAtPiA8PCJcIiIsIChsaXN0X3RvX2JpbmFyeShTdHIpKS9iaW5hcnksICJcIiI+PgorICAgICAgICBlbmQsCisgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgZmFsc2V9CisgICAgXSk7CisKKyUlIFRPRE86IGJpbmFyeSBmaWVsZHMgc2hvdWxkIGJlIGJhc2U2NCBlbmNvZGVkPworCislJSBEYXRhIDo6IGlvbGlzdCgpCit3cml0ZShUaGlzID0gI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnN9LCBEYXRhKSAtPgorICAgICVpbzpmb3JtYXQoIkRhdGEgfnAgQ3R4dCB+cH5ufm4iLCBbRGF0YSwgVGhpcyNqc29uX3Byb3RvY29sLmNvbnRleHRfc3RhY2tdKSwKKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShUcmFucywgRGF0YSksCisgICAge1RoaXMjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCit3cml0ZV92YWx1ZXMoVGhpczAsIFZhbHVlTGlzdCkgLT4KKyAgICBGaW5hbFN0YXRlID0gbGlzdHM6Zm9sZGwoCisgICAgICAgIGZ1bihWYWwsIFRoaXNJbikgLT4KKyAgICAgICAgICAgIHtUaGlzT3V0LCBva30gPSB3cml0ZShUaGlzSW4sIFZhbCksCisgICAgICAgICAgICBUaGlzT3V0CisgICAgICAgIGVuZCwKKyAgICAgICAgVGhpczAsCisgICAgICAgIFZhbHVlTGlzdCksCisgICAge0ZpbmFsU3RhdGUsIG9rfS4KKworJSUgSSB3aXNoIHRoZSBlcmxhbmcgdmVyc2lvbiBvZiB0aGUgdHJhbnNwb3J0IGludGVyZmFjZSBpbmNsdWRlZCBhIAorJSUgcmVhZF9hbGwgZnVuY3Rpb24gKGxpa2UgZWcuIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uKS4gU2luY2UgaXQgZG9lc24ndCwKKyUlIGhlcmUncyBteSB2ZXJzaW9uIChldmVuIHRob3VnaCBpdCBwcm9iYWJseSBzaG91bGRuJ3QgYmUgaW4gdGhpcyBmaWxlKS4KKyUlCislJSBUaGUgcmVzdWx0aW5nIGJpbmFyeSBpcyBpbW1lZGlhdGVseSBzZW5kIHRvIHRoZSBKU1ggc3RyZWFtIHBhcnNlci4KKyUlIFN1YnNlcXVlbnQgY2FsbHMgdG8gcmVhZCBhY3R1YWxseSBvcGVyYXRlIG9uIHRoZSBldmVudHMgcmV0dXJuZWQgYnkgSlNYLgorcmVhZF9hbGwoI2pzb25fcHJvdG9jb2x7dHJhbnNwb3J0ID0gVHJhbnNwb3J0MH0gPSBTdGF0ZSkgLT4KKyAgICB7VHJhbnNwb3J0MSwgQmlufSA9IHJlYWRfYWxsXzEoVHJhbnNwb3J0MCwgW10pLAorICAgIFAgPSB0aHJpZnRfanNvbl9wYXJzZXI6cGFyc2VyKCksCisgICAgW0ZpcnN0fFJlc3RdID0gUChCaW4pLAorICAgIFN0YXRlI2pzb25fcHJvdG9jb2x7CisgICAgICAgIHRyYW5zcG9ydCA9IFRyYW5zcG9ydDEsCisgICAgICAgIGpzeCA9IHtldmVudCwgRmlyc3QsIFJlc3R9CisgICAgfS4KKworcmVhZF9hbGxfMShUcmFuc3BvcnQwLCBJb0xpc3QpIC0+CisgICAge1RyYW5zcG9ydDEsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoVHJhbnNwb3J0MCwgMSksCisgICAgY2FzZSBSZXN1bHQgb2YKKyAgICAgICAge29rLCA8PD4+fSAtPiAlIG5vdGhpbmcgcmVhZDogYXNzdW1lIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgIHtUcmFuc3BvcnQxLCBpb2xpc3RfdG9fYmluYXJ5KGxpc3RzOnJldmVyc2UoSW9MaXN0KSl9OworICAgICAgICB7b2ssIERhdGF9IC0+ICUgY2hhcmFjdGVyIHN1Y2Nlc3NmdWxseSByZWFkOyByZWFkIG1vcmUKKyAgICAgICAgICAgIHJlYWRfYWxsXzEoVHJhbnNwb3J0MSwgW0RhdGF8SW9MaXN0XSk7CisgICAgICAgIHtlcnJvciwgJ0VPRid9IC0+ICUgd2UncmUgZG9uZQorICAgICAgICAgICAge1RyYW5zcG9ydDEsIGlvbGlzdF90b19iaW5hcnkobGlzdHM6cmV2ZXJzZShJb0xpc3QpKX0KKyAgICBlbmQuCisKKyUgRXhwZWN0IHJlYWRzIGFuIGV2ZW50IGZyb20gdGhlIEpTWCBldmVudCBzdHJlYW0uIEl0IHJlY2VpdmVzIGFuIGV2ZW50IG9yIGRhdGEKKyUgdHlwZSBhcyBpbnB1dC4gQ29tcGFyaW5nIHRoZSByZWFkIGV2ZW50IGZyb20gdGhlIG9uZSBpcyB3YXMgcGFzc2VkLCBpdAorJSByZXR1cm5zIGFuIGVycm9yIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBlbmNvdW50ZXJlZC4KKyUgRXhwZWN0IGFsc28gbWFpbnRhaW5zIHRoZSBjb250ZXh0IHN0YWNrIGluICNqc29uX3Byb3RvY29sLgorZXhwZWN0KCNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIHtUeXBlLCBEYXRhfT1FdiwgW05leHR8UmVzdF19fT1TdGF0ZSwgRXhwZWN0ZWRUeXBlKSAtPgorICAgIE5leHRTdGF0ZSA9IFN0YXRlI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwgTmV4dCwgUmVzdH19LAorICAgIGNhc2UgVHlwZSA9PSBFeHBlY3RlZFR5cGUgb2YKKyAgICAgICAgdHJ1ZSAtPiAKKyAgICAgICAgICAgIHtOZXh0U3RhdGUsIHtvaywgY29udmVydF9kYXRhKFR5cGUsIERhdGEpfX07CisgICAgICAgIGZhbHNlIC0+CisgICAgICAgICAgICB7TmV4dFN0YXRlLCB7ZXJyb3IsIHt1bmV4cGVjdGVkX2pzb25fZXZlbnQsIEV2fX19CisgICAgZW5kOworCitleHBlY3QoI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwgRXZlbnQsIE5leHR9fT1TdGF0ZSwgRXhwZWN0ZWRFdmVudCkgLT4KKyAgICAgZXhwZWN0KFN0YXRlI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwge0V2ZW50LCBub25lfSwgTmV4dH19LCBFeHBlY3RlZEV2ZW50KS4KKworY29udmVydF9kYXRhKGludGVnZXIsIEkpIC0+IGxpc3RfdG9faW50ZWdlcihJKTsKK2NvbnZlcnRfZGF0YShmbG9hdCwgRikgLT4gbGlzdF90b19mbG9hdChGKTsKK2NvbnZlcnRfZGF0YShfLCBEKSAtPiBELgorCitleHBlY3RfbWFueShTdGF0ZSwgRXhwZWN0ZWRMaXN0KSAtPgorICAgIGV4cGVjdF9tYW55XzEoU3RhdGUsIEV4cGVjdGVkTGlzdCwgW10sIG9rKS4KKworZXhwZWN0X21hbnlfMShTdGF0ZSwgW10sIFJlc3VsdExpc3QsIFN0YXR1cykgLT4KKyAgICB7U3RhdGUsIHtTdGF0dXMsIGxpc3RzOnJldmVyc2UoUmVzdWx0TGlzdCl9fTsKK2V4cGVjdF9tYW55XzEoU3RhdGUsIFtFeHBlY3RlZHxFeHBUYWlsXSwgUmVzdWx0TGlzdCwgX1ByZXZTdGF0dXMpIC0+CisgICAge1N0YXRlMSwge1N0YXR1cywgRGF0YX19ID0gZXhwZWN0KFN0YXRlLCBFeHBlY3RlZCksCisgICAgTmV3UmVzdWx0TGlzdCA9IFtEYXRhfFJlc3VsdExpc3RdLAorICAgIGNhc2UgU3RhdHVzIG9mCisgICAgICAgICUgaW4gY2FzZSBvZiBlcnJvciwgZW5kIHByZW1hdHVyZWx5CisgICAgICAgIGVycm9yIC0+IGV4cGVjdF9tYW55XzEoU3RhdGUxLCBbXSwgTmV3UmVzdWx0TGlzdCwgU3RhdHVzKTsKKyAgICAgICAgb2sgLT4gZXhwZWN0X21hbnlfMShTdGF0ZTEsIEV4cFRhaWwsIE5ld1Jlc3VsdExpc3QsIFN0YXR1cykKKyAgICBlbmQuCisKKyUgd3JhcHBlciBhcm91bmQgZXhwZWN0IHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yIGNvbnRhaW5lciBvcGVuaW5nL2Nsb3NpbmcgZnVuY3Rpb25zCitleHBlY3Rfbm9kYXRhKFRoaXMsIEV4cGVjdGVkTGlzdCkgLT4KKyAgICBjYXNlIGV4cGVjdF9tYW55KFRoaXMsIEV4cGVjdGVkTGlzdCkgb2YKKyAgICAgICAge1N0YXRlLCB7b2ssIF99fSAtPiAKKyAgICAgICAgICAgIHtTdGF0ZSwgb2t9OworICAgICAgICBFcnJvciAtPiAKKyAgICAgICAgICAgIEVycm9yCisgICAgZW5kLgorCityZWFkX2ZpZWxkKCNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIEZpZWxkLCBbTmV4dHxSZXN0XX19ID0gU3RhdGUpIC0+CisgICAgTmV3U3RhdGUgPSBTdGF0ZSNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIE5leHQsIFJlc3R9fSwKKyAgICB7TmV3U3RhdGUsIEZpZWxkfS4KKworcmVhZChUaGlzMCwgbWVzc2FnZV9iZWdpbikgLT4KKyAgICAlIGNhbGwgcmVhZF9hbGwgdG8gZ2V0IHRoZSBjb250ZW50cyBvZiB0aGUgdHJhbnNwb3J0IGJ1ZmZlciBpbnRvIEpTWC4KKyAgICBUaGlzMSA9IHJlYWRfYWxsKFRoaXMwKSwKKyAgICBjYXNlIGV4cGVjdF9tYW55KFRoaXMxLCAKKyAgICAgICAgICAgIFtzdGFydF9hcnJheSwgaW50ZWdlciwgc3RyaW5nLCBpbnRlZ2VyLCBpbnRlZ2VyXSkgb2YKKyAgICAgICAge1RoaXMyLCB7b2ssIFtfLCBWZXJzaW9uLCBOYW1lLCBUeXBlLCBTZXFJZF19fSAtPgorICAgICAgICAgICAgY2FzZSBWZXJzaW9uID06PSA/VkVSU0lPTl8xIG9mCisgICAgICAgICAgICAgICAgdHJ1ZSAtPgorICAgICAgICAgICAgICAgICAgICB7VGhpczIsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgID0gTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICA9IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH19OworICAgICAgICAgICAgICAgIGZhbHNlIC0+CisgICAgICAgICAgICAgICAgICAgIHtUaGlzMiwge2Vycm9yLCBub19qc29uX3Byb3RvY29sX3ZlcnNpb259fQorICAgICAgICAgICAgZW5kOworICAgICAgICBPdGhlciAtPiBPdGhlcgorICAgIGVuZDsKKworcmVhZChUaGlzLCBtZXNzYWdlX2VuZCkgLT4gCisgICAgZXhwZWN0X25vZGF0YShUaGlzLCBbZW5kX2FycmF5XSk7CisKK3JlYWQoVGhpcywgc3RydWN0X2JlZ2luKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtzdGFydF9vYmplY3RdKTsKKworcmVhZChUaGlzLCBzdHJ1Y3RfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfb2JqZWN0XSk7CisKK3JlYWQoVGhpczAsIGZpZWxkX2JlZ2luKSAtPgorICAgIHtUaGlzMSwgUmVhZH0gPSBleHBlY3RfbWFueShUaGlzMCwgCisgICAgICAgICAgICBbJWZpZWxkIGlkCisgICAgICAgICAgICAga2V5LCAKKyAgICAgICAgICAgICAlIHt9IHN1cnJvdW5kaW5nIGZpZWxkCisgICAgICAgICAgICAgc3RhcnRfb2JqZWN0LCAKKyAgICAgICAgICAgICAlIHR5cGUgb2YgZmllbGQKKyAgICAgICAgICAgICBrZXldKSwKKyAgICBjYXNlIFJlYWQgb2YKKyAgICAgICAge29rLCBbRmllbGRJZFN0ciwgXywgRmllbGRUeXBlXX0gLT4KKyAgICAgICAgICAgIHtUaGlzMSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgICAgICAgICAgIHR5cGUgPSBqc29uX3RvX3R5cGVpZChGaWVsZFR5cGUpLCAKKyAgICAgICAgICAgICAgICBpZCA9IGxpc3RfdG9faW50ZWdlcihGaWVsZElkU3RyKX19OyAlIFRPRE86IGRvIHdlIG5lZWQgdG8gd3JhcCB0aGlzIGluIGEgdHJ5L2NhdGNoPworICAgICAgICB7ZXJyb3IsW3t1bmV4cGVjdGVkX2pzb25fZXZlbnQsIHtlbmRfb2JqZWN0LG5vbmV9fV19IC0+CisgICAgICAgICAgICB7VGhpczEsICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gP3RUeXBlX1NUT1B9fTsKKyAgICAgICAgT3RoZXIgLT4gCisgICAgICAgICAgICBpbzpmb3JtYXQoIioqKiogT1RIRVIgYnJhbmNoIHNlbGVjdGVkICoqKioiKSwKKyAgICAgICAgICAgIHtUaGlzMSwgT3RoZXJ9CisgICAgZW5kOworCityZWFkKFRoaXMsIGZpZWxkX2VuZCkgLT4gCisgICAgZXhwZWN0X25vZGF0YShUaGlzLCBbZW5kX29iamVjdF0pOworCislIEV4YW1wbGUgbWVzc2FnZSB3aXRoIG1hcDogWzEsInRlc3RNYXAiLDEsMCx7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19XQorcmVhZChUaGlzMCwgbWFwX2JlZ2luKSAtPgorICAgIGNhc2UgZXhwZWN0X21hbnkoVGhpczAsIAorICAgICAgICAgICAgW3N0YXJ0X2FycmF5LAorICAgICAgICAgICAgICUga2V5IHR5cGUKKyAgICAgICAgICAgICBzdHJpbmcsIAorICAgICAgICAgICAgICUgdmFsdWUgdHlwZQorICAgICAgICAgICAgIHN0cmluZywgCisgICAgICAgICAgICAgJSBzaXplCisgICAgICAgICAgICAgaW50ZWdlciwKKyAgICAgICAgICAgICAlIHRoZSBmb2xsb3dpbmcgb2JqZWN0IGNvbnRhaW5zIHRoZSBtYXAKKyAgICAgICAgICAgICBzdGFydF9vYmplY3RdKSBvZgorICAgICAgICB7VGhpczEsIHtvaywgW18sIEt0eXBlLCBWdHlwZSwgU2l6ZSwgX119fSAtPgorICAgICAgICAgICAge1RoaXMxLCAjcHJvdG9jb2xfbWFwX2JlZ2lue2t0eXBlID0gS3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0eXBlID0gVnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisgICAgICAgIE90aGVyIC0+IE90aGVyCisgICAgZW5kOworCityZWFkKFRoaXMsIG1hcF9lbmQpIC0+IAorICAgIGV4cGVjdF9ub2RhdGEoVGhpcywgW2VuZF9vYmplY3QsIGVuZF9hcnJheV0pOworCityZWFkKFRoaXMwLCBsaXN0X2JlZ2luKSAtPgorICAgIGNhc2UgZXhwZWN0X21hbnkoVGhpczAsIAorICAgICAgICAgICAgW3N0YXJ0X2FycmF5LAorICAgICAgICAgICAgICUgZWxlbWVudCB0eXBlCisgICAgICAgICAgICAgc3RyaW5nLCAKKyAgICAgICAgICAgICAlIHNpemUKKyAgICAgICAgICAgICBpbnRlZ2VyXSkgb2YKKyAgICAgICAge1RoaXMxLCB7b2ssIFtfLCBFdHlwZSwgU2l6ZV19fSAtPgorICAgICAgICAgICAge1RoaXMxLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKKyAgICAgICAgICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisgICAgICAgIE90aGVyIC0+IE90aGVyCisgICAgZW5kOworCityZWFkKFRoaXMsIGxpc3RfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfYXJyYXldKTsKKworJSBleGFtcGxlIG1lc3NhZ2Ugd2l0aCBzZXQ6IFsxLCJ0ZXN0U2V0IiwxLDAseyIxIjp7InNldCI6WyJpMzIiLDMsMSwyLDNdfX1dCityZWFkKFRoaXMwLCBzZXRfYmVnaW4pIC0+CisgICAgY2FzZSBleHBlY3RfbWFueShUaGlzMCwgCisgICAgICAgICAgICBbc3RhcnRfYXJyYXksCisgICAgICAgICAgICAgJSBlbGVtZW50IHR5cGUKKyAgICAgICAgICAgICBzdHJpbmcsIAorICAgICAgICAgICAgICUgc2l6ZQorICAgICAgICAgICAgIGludGVnZXJdKSBvZgorICAgICAgICB7VGhpczEsIHtvaywgW18sIEV0eXBlLCBTaXplXX19IC0+CisgICAgICAgICAgICB7VGhpczEsICNwcm90b2NvbF9zZXRfYmVnaW57CisgICAgICAgICAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworICAgICAgICBPdGhlciAtPiBPdGhlcgorICAgIGVuZDsKKworcmVhZChUaGlzLCBzZXRfZW5kKSAtPiAKKyAgICBleHBlY3Rfbm9kYXRhKFRoaXMsIFtlbmRfYXJyYXldKTsKKworcmVhZChUaGlzMCwgZmllbGRfc3RvcCkgLT4KKyAgICB7VGhpczAsIG9rfTsKKyUlCisKK3JlYWQoVGhpczAsIGJvb2wpIC0+CisgICAge1RoaXMxLCBGaWVsZH0gPSByZWFkX2ZpZWxkKFRoaXMwKSwKKyAgICBWYWx1ZSA9IGNhc2UgRmllbGQgb2YKKyAgICAgICAge2xpdGVyYWwsIEl9IC0+IAorICAgICAgICAgICAge29rLCBJfTsgCisgICAgICAgIF9PdGhlciAtPgorICAgICAgICAgICAge2Vycm9yLCB1bmV4cGVjdGVkX2V2ZW50X2Zvcl9ib29sZWFufQorICAgIGVuZCwKKyAgICB7VGhpczEsIFZhbHVlfTsKKworcmVhZChUaGlzMCwgYnl0ZSkgLT4KKyAgICB7VGhpczEsIEZpZWxkfSA9IHJlYWRfZmllbGQoVGhpczApLAorICAgIFZhbHVlID0gY2FzZSBGaWVsZCBvZgorICAgICAgICB7a2V5LCBLfSAtPgorICAgICAgICAgICAge29rLCBsaXN0X3RvX2ludGVnZXIoSyl9OworICAgICAgICB7aW50ZWdlciwgSX0gLT4gCisgICAgICAgICAgICB7b2ssIGxpc3RfdG9faW50ZWdlcihJKX07IAorICAgICAgICBfT3RoZXIgLT4KKyAgICAgICAgICAgIHtlcnJvciwgdW5leHBlY3RlZF9ldmVudF9mb3JfaW50ZWdlcn0KKyAgICBlbmQsCisgICAge1RoaXMxLCBWYWx1ZX07CisKK3JlYWQoVGhpczAsIGkxNikgLT4KKyAgICByZWFkKFRoaXMwLCBieXRlKTsKKworcmVhZChUaGlzMCwgaTMyKSAtPgorICAgIHJlYWQoVGhpczAsIGJ5dGUpOworCityZWFkKFRoaXMwLCBpNjQpIC0+CisgICAgcmVhZChUaGlzMCwgYnl0ZSk7CisKK3JlYWQoVGhpczAsIGRvdWJsZSkgLT4KKyAgICB7VGhpczEsIEZpZWxkfSA9IHJlYWRfZmllbGQoVGhpczApLAorICAgIFZhbHVlID0gY2FzZSBGaWVsZCBvZgorICAgICAgICB7ZmxvYXQsIEl9IC0+IAorICAgICAgICAgICAge29rLCBsaXN0X3RvX2Zsb2F0KEkpfTsgCisgICAgICAgIF9PdGhlciAtPgorICAgICAgICAgICAge2Vycm9yLCB1bmV4cGVjdGVkX2V2ZW50X2Zvcl9kb3VibGV9CisgICAgZW5kLAorICAgIHtUaGlzMSwgVmFsdWV9OworCislIHJldHVybnMgYSBiaW5hcnkgZGlyZWN0bHksIGNhbGwgYmluYXJ5X3RvX2xpc3QgaWYgbmVjZXNzYXJ5CityZWFkKFRoaXMwLCBzdHJpbmcpIC0+CisgICAge1RoaXMxLCBGaWVsZH0gPSByZWFkX2ZpZWxkKFRoaXMwKSwKKyAgICBWYWx1ZSA9IGNhc2UgRmllbGQgb2YKKyAgICAgICAge3N0cmluZywgSX0gLT4gCisgICAgICAgICAgICB7b2ssIEl9OyAKKyAgICAgICAge2tleSwgSn0gLT4gCisgICAgICAgICAgICB7b2ssIEp9OyAKKyAgICAgICAgX090aGVyIC0+CisgICAgICAgICAgICB7ZXJyb3IsIHVuZXhwZWN0ZWRfZXZlbnRfZm9yX3N0cmluZ30KKyAgICBlbmQsCisgICAge1RoaXMxLCBWYWx1ZX0uCisKKyUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSUgcmV0dXJucyBhIChmdW4oKSAtPiB0aHJpZnRfcHJvdG9jb2woKSkKK25ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIF9PcHRpb25zKSAtPgorICAgICUgT25seSBzdHJpY2UgcmVhZC93cml0ZSBhcmUgaW1wbGVtZW50ZWQKKyAgICBGID0gZnVuKCkgLT4KKyAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSBUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgICAgdGhyaWZ0X2pzb25fcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCwgW10pCisgICAgICAgIGVuZCwKKyAgICB7b2ssIEZ9LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWFjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSw4MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQpLgorCistYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgorCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8wLCBuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorCisKKy1yZWNvcmQodF9tZW1idWZmZXIsIHsKKyAgYnVmZmVyID0gW10KK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X21lbWJ1ZmZlcnt9LgorCisKKy1zcGVjIG5ldygpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KCkgLT4gbmV3KFtdKS4KKworLXNwZWMgbmV3KEJ1Zjo6aW9kYXRhKCkpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KEJ1Zikgd2hlbiBpc19saXN0KEJ1ZikgLT4KKyAgU3RhdGUgPSAjdF9tZW1idWZmZXJ7YnVmZmVyID0gQnVmfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpOworbmV3KEJ1Zikgd2hlbiBpc19iaW5hcnkoQnVmKSAtPgorICBTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBbQnVmXX0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKworcmVhZChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX0uCisKKworcmVhZF9leGFjdChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4KKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBMZW4pLAorICAgICAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgXyAtPgorICAgICAge1N0YXRlLCB7ZXJyb3IsIGVvZn19CisgIGVuZC4KKworCit3cml0ZShTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBEYXRhKQord2hlbiBpc19saXN0KERhdGEpOyBpc19iaW5hcnkoRGF0YSkgLT4KKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFtCdWYsIERhdGFdfSwgb2t9LgorCisKK2ZsdXNoKFN0YXRlKSAtPiB7U3RhdGUsIG9rfS4KKworCitjbG9zZShTdGF0ZSkgLT4ge1N0YXRlLCBva30uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybAppbmRleCBiNGY2MDdhLi42YTU5ZWE1IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfbWVtb3J5X2J1ZmZlci5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbW9yeV9idWZmZXIuZXJsCkBAIC0xOSwxNDYgKzE5LDI5IEBACiAKIC1tb2R1bGUodGhyaWZ0X21lbW9yeV9idWZmZXIpLgogCi0tYmVoYXZpb3VyKGdlbl9zZXJ2ZXIpLgogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCi0tZXhwb3J0KFtuZXcvMCwgbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzBdKS4KKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzAsIG5ldy8xXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgbGVnYWN5IGFwaQorLWV4cG9ydChbbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzBdKS4KIAotJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKLS1leHBvcnQoW2luaXQvMSwgaGFuZGxlX2NhbGwvMywgaGFuZGxlX2Nhc3QvMiwgaGFuZGxlX2luZm8vMiwKLSAgICAgICAgIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zXSkuCiAKLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIHdyYXBwZXIgYXJvdW5kIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0IGZvciBsZWdhY3kgcmVhc29ucwogCi0tcmVjb3JkKG1lbW9yeV9idWZmZXIsIHtidWZmZXJ9KS4KK25ldygpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLgogCi0lJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lJSBBUEkKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLW5ldygpIC0+Ci0gICAgY2FzZSBnZW5fc2VydmVyOnN0YXJ0X2xpbmsoP01PRFVMRSwgW10sIFtdKSBvZgotICAgICAgICB7b2ssIFBpZH0gLT4KLSAgICAgICAgICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFBpZCk7Ci0gICAgICAgIEVsc2UgLT4KLSAgICAgICAgICAgIEVsc2UKLSAgICBlbmQuCituZXcoU3RhdGUpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldyhTdGF0ZSkuCiAKLW5ld190cmFuc3BvcnRfZmFjdG9yeSgpIC0+Ci0gICAge29rLCBmdW4oKSAtPiBuZXcoKSBlbmR9LgorbmV3X3RyYW5zcG9ydF9mYWN0b3J5KCkgLT4ge29rLCBmdW4oKSAtPiBuZXcoKSBlbmR9LgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogd3JpdGUoVHJhbnNwb3J0LCBEYXRhKSAtPiBvawotJSUKLSUlIERhdGEgPSBpb2xpc3QoKQotJSUKLSUlIERlc2NyaXB0aW9uOiBXcml0ZXMgZGF0YSBpbnRvIHRoZSBidWZmZXIKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXdyaXRlKFRyYW5zcG9ydCwgRGF0YSkgLT4KLSAgICBnZW5fc2VydmVyOmNhbGwoVHJhbnNwb3J0LCB7d3JpdGUsIERhdGF9KS4KK3dyaXRlKFN0YXRlLCBEYXRhKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDp3cml0ZShTdGF0ZSwgRGF0YSkuCiAKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBmbHVzaChUcmFuc3BvcnQpIC0+IG9rCi0lJQotJSUgRGVzY3JpcHRpb246IEZsdXNoZXMgdGhlIGJ1ZmZlciB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZmx1c2goVHJhbnNwb3J0KSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FsbChUcmFuc3BvcnQsIGZsdXNoKS4KK3JlYWQoU3RhdGUsIERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWQoU3RhdGUsIERhdGEpLgogCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSBGdW5jdGlvbjogY2xvc2UoVHJhbnNwb3J0KSAtPiBvawotJSUKLSUlIERlc2NyaXB0aW9uOiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBhbmQgdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jbG9zZShUcmFuc3BvcnQpIC0+Ci0gICAgZ2VuX3NlcnZlcjpjYXN0KFRyYW5zcG9ydCwgY2xvc2UpLgorZmx1c2goU3RhdGUpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OmZsdXNoKFN0YXRlKS4KIAotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IFJlYWQoVHJhbnNwb3J0LCBMZW4pIC0+IHtvaywgRGF0YX0KLSUlCi0lJSBEYXRhID0gYmluYXJ5KCkKLSUlCi0lJSBEZXNjcmlwdGlvbjogUmVhZHMgZGF0YSB0aHJvdWdoIGZyb20gdGhlIHdyYXBwZWQgdHJhbnNvcHJ0Ci0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yZWFkKFRyYW5zcG9ydCwgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSAtPgotICAgIGdlbl9zZXJ2ZXI6Y2FsbChUcmFuc3BvcnQsIHtyZWFkLCBMZW59KS4KLQotJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKLSUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuY3Rpb246IGluaXQoQXJncykgLT4ge29rLCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlICAgICAgICAgICAgICAgfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbn0KLSUlIERlc2NyaXB0aW9uOiBJbml0aWF0ZXMgdGhlIHNlcnZlcgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW5pdChbXSkgLT4KLSAgICB7b2ssICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtdfX0uCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiAlJSBoYW5kbGVfY2FsbChSZXF1ZXN0LCBGcm9tLCBTdGF0ZSkgLT4ge3JlcGx5LCBSZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmVwbHksIFJlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFJlcGx5LCBTdGF0ZX0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfQotJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhbGwgbWVzc2FnZXMKLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWhhbmRsZV9jYWxsKHt3cml0ZSwgRGF0YX0sIF9Gcm9tLCBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0pIC0+Ci0gICAge3JlcGx5LCBvaywgU3RhdGUjbWVtb3J5X2J1ZmZlcntidWZmZXIgPSBbQnVmLCBEYXRhXX19OwotCi1oYW5kbGVfY2FsbCh7cmVhZCwgTGVufSwgX0Zyb20sIFN0YXRlID0gI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gQnVmfSkgLT4KLSAgICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCi0gICAgR2l2ZSA9IG1pbihpb2xpc3Rfc2l6ZShCaW5hcnkpLCBMZW4pLAotICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKLSAgICB7cmVwbHksIHtvaywgUmVzdWx0fSwgU3RhdGUjbWVtb3J5X2J1ZmZlcntidWZmZXIgPSBSZW1haW5pbmd9fTsKLQotaGFuZGxlX2NhbGwoZmx1c2gsIF9Gcm9tLCBTdGF0ZSkgLT4KLSAgICB7cmVwbHksIG9rLCBTdGF0ZX0uCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBoYW5kbGVfY2FzdChNc2csIFN0YXRlKSAtPiB7bm9yZXBseSwgU3RhdGV9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKLSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYXN0IG1lc3NhZ2VzCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1oYW5kbGVfY2FzdChjbG9zZSwgU3RhdGUpIC0+Ci0gICAge3N0b3AsIG5vcm1hbCwgU3RhdGV9OwotaGFuZGxlX2Nhc3QoTXNnLCBTdGF0ZT0jbWVtb3J5X2J1ZmZlcnt9KSAtPgotICAgIHtub3JlcGx5LCBTdGF0ZX0uCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiBoYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZSkgLT4ge25vcmVwbHksIFN0YXRlfSB8Ci0lJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAotJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KLSUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBhbGwgbm9uIGNhbGwvY2FzdCBtZXNzYWdlcwotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaGFuZGxlX2luZm8oX0luZm8sIFN0YXRlKSAtPgotICAgIHtub3JlcGx5LCBTdGF0ZX0uCi0KLSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSUlIEZ1bmN0aW9uOiB0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4gdm9pZCgpCi0lJSBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBnZW5fc2VydmVyIHdoZW4gaXQgaXMgYWJvdXQgdG8KLSUlIHRlcm1pbmF0ZS4gSXQgc2hvdWxkIGJlIHRoZSBvcHBvc2l0ZSBvZiBNb2R1bGU6aW5pdC8xIGFuZCBkbyBhbnkgbmVjZXNzYXJ5Ci0lJSBjbGVhbmluZyB1cC4gV2hlbiBpdCByZXR1cm5zLCB0aGUgZ2VuX3NlcnZlciB0ZXJtaW5hdGVzIHdpdGggUmVhc29uLgotJSUgVGhlIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdGVybWluYXRlKF9SZWFzb24sIF9TdGF0ZSkgLT4KLSAgICBvay4KLQotJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJSUgRnVuYzogY29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZSwgRXh0cmEpIC0+IHtvaywgTmV3U3RhdGV9Ci0lJSBEZXNjcmlwdGlvbjogQ29udmVydCBwcm9jZXNzIHN0YXRlIHdoZW4gY29kZSBpcyBjaGFuZ2VkCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jb2RlX2NoYW5nZShfT2xkVnNuLCBTdGF0ZSwgX0V4dHJhKSAtPgotICAgIHtvaywgU3RhdGV9LgotCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lJSUgSW50ZXJuYWwgZnVuY3Rpb25zCi0lJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1taW4oQSxCKSB3aGVuIEE8QiAtPiBBOwotbWluKF8sQikgICAgICAgICAgLT4gQi4KK2Nsb3NlKFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpjbG9zZShTdGF0ZSkuCiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzVlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCkBAIC0wLDAgKzEsNTcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcikuCisKKy1leHBvcnQoWworICAgICAgICAgIG5ldy8wCisgICAgICAgICAsc3RvcmUvMworICAgICAgICAgLGZpbmQvMgorICAgICAgICAgLGZldGNoLzIKKyAgICAgICAgXSkuCisKKy10eXBlIHNlcnZpY2VfaGFuZGxlcigpICAgICA6OiBub25lbXB0eV9zdHJpbmcoKS4KKy10eXBlIG1vZHVsZV8oKSAgICAgICAgICAgICA6OiBhdG9tKCkuCistdHlwZSBzZXJ2aWNlX2hhbmRsZXJfbWFwKCkgOjogW3tTZXJ2aWNlSGFuZGxlcjo6c2VydmljZV9oYW5kbGVyKCksIE1vZHVsZTo6bW9kdWxlXygpfV0uCisKKy1zcGVjIG5ldygpIC0+IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK25ldygpIC0+CisgICAgb3JkZGljdDpuZXcoKS4KKworLXNwZWMgc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPiBOZXdNYXAgd2hlbgorICAgIFNlcnZpY2VIYW5kbGVyIDo6IHNlcnZpY2VfaGFuZGxlcigpLAorICAgIE1vZHVsZSAgICAgICAgIDo6IG1vZHVsZV8oKSwKKyAgICBNYXAgICAgICAgICAgICA6OiBzZXJ2aWNlX2hhbmRsZXJfbWFwKCksCisgICAgTmV3TWFwICAgICAgICAgOjogc2VydmljZV9oYW5kbGVyX21hcCgpLgorc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPgorICAgIG9yZGRpY3Q6c3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKS4KKworLXNwZWMgZmluZChTZXJ2aWNlSGFuZGxlciwgTWFwKSAtPiB7b2ssIE1vZHVsZX0gfCBlcnJvciB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkgLT4KKyAgICBvcmRkaWN0OmZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkuCisKKy1zcGVjIGZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+IE1vZHVsZSB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+CisgICAgb3JkZGljdDpmZXRjaChTZXJ2aWNlSGFuZGxlciwgTWFwKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2I3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsODMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWV4cG9ydChbbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMQorICAgICAgICBdKS4KKworLXJlY29yZChwcm90b2NvbCwge21vZHVsZSwgZGF0YX0pLgorLXR5cGUgcHJvdG9jb2woKSA6OiAjcHJvdG9jb2x7fS4KKworLXJlY29yZCAobXVsdGlwbGV4ZWRfcHJvdG9jb2wsIHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGU6OmF0b20oKSwKKwkJCQkJCQkJcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZTo6dGVybSgpLAorCQkJCQkJCQlzZXJ2aWNlX25hbWU6Om5vbmVtcHR5X3N0cmluZygpfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI211bHRpcGxleGVkX3Byb3RvY29se30uCisKKy1zcGVjIG5ldyhQcm90b2NvbFRvRGVjb3JhdGU6OnByb3RvY29sKCksIFNlcnZpY2VOYW1lOjpub25lbXB0eV9zdHJpbmcoKSkgLT4ge29rLCBQcm90b2NvbDo6cHJvdG9jb2woKX0uCituZXcoUHJvdG9jb2xUb0RlY29yYXRlLCBTZXJ2aWNlTmFtZSkgd2hlbiBpc19yZWNvcmQoUHJvdG9jb2xUb0RlY29yYXRlLCBwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KFNlcnZpY2VOYW1lKSAtPgorICAgIFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sVG9EZWNvcmF0ZSNwcm90b2NvbC5tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gUHJvdG9jb2xUb0RlY29yYXRlI3Byb3RvY29sLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lID0gU2VydmljZU5hbWV9LAorICAgIHRocmlmdF9wcm90b2NvbDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCitmbHVzaF90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmZsdXNoX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCitjbG9zZV90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmNsb3NlX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCit3cml0ZShTdGF0ZSA9ICNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGUgPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUgPSBTZXJ2aWNlTmFtZX0sCisgICAgICBNZXNzYWdlID0gI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IE5hbWV9KSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lPVNlcnZpY2VOYW1lICsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9NVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEFSQVRPUiArKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lfSksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva307CisKK3dyaXRlKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0sCisgICAgICBNZXNzYWdlKSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsIE1lc3NhZ2UpLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCityZWFkKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSwKKyAgICAgTWVzc2FnZSkgLT4KKyAgICB7U3RhdGUxLCBSZXN1bHR9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOnJlYWQoU3RhdGUwLCBNZXNzYWdlKSwKKyAgICB7U3RhdGUjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMX0sIFJlc3VsdH0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvY2Vzc29yLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCmluZGV4IGUyNmZiMzMuLjVjOWYyNmYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCkBAIC0yNCw1OCArMjQsODkgQEAKIC1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgogLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbC5ocmwiKS4KIAotLXJlY29yZCh0aHJpZnRfcHJvY2Vzc29yLCB7aGFuZGxlciwgaW5fcHJvdG9jb2wsIG91dF9wcm90b2NvbCwgc2VydmljZX0pLgorLXJlY29yZCh0aHJpZnRfcHJvY2Vzc29yLCB7aGFuZGxlciwgcHJvdG9jb2wsIHNlcnZpY2V9KS4KIAotaW5pdCh7U2VydmVyLCBQcm90b0dlbiwgU2VydmljZSwgSGFuZGxlcn0pIHdoZW4gaXNfZnVuY3Rpb24oUHJvdG9HZW4sIDApIC0+Ci0gICAge29rLCBJUHJvdCwgT1Byb3R9ID0gUHJvdG9HZW4oKSwKLSAgICBsb29wKCN0aHJpZnRfcHJvY2Vzc29ye2luX3Byb3RvY29sID0gSVByb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcHJvdG9jb2wgPSBPUHJvdCwKK2luaXQoe19TZXJ2ZXIsIFByb3RvR2VuLCBTZXJ2aWNlLCBIYW5kbGVyfSkgd2hlbiBpc19mdW5jdGlvbihQcm90b0dlbiwgMCkgLT4KKyAgICB7b2ssIFByb3RvfSA9IFByb3RvR2VuKCksCisgICAgbG9vcCgjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gSGFuZGxlcn0pLgogCi1sb29wKFN0YXRlID0gI3RocmlmdF9wcm9jZXNzb3J7aW5fcHJvdG9jb2wgID0gSVByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wcm90b2NvbCA9IE9Qcm90b30pIC0+Ci0gICAgY2FzZSB0aHJpZnRfcHJvdG9jb2w6cmVhZChJUHJvdG8sIG1lc3NhZ2VfYmVnaW4pIG9mCitsb29wKFN0YXRlMCA9ICN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sICA9IFByb3RvMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlfSkgLT4KKworICAgIHtQcm90bzEsIE1lc3NhZ2VCZWdpbn0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90bzAsIG1lc3NhZ2VfYmVnaW4pLAorICAgIFN0YXRlMSA9IFN0YXRlMCN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG8xfSwKKworICAgIEVycm9ySGFuZGxlciA9IGZ1bgorICAgICAgICAoSGFuZGxlck1vZHVsZXMpIHdoZW4gaXNfbGlzdChIYW5kbGVyTW9kdWxlcykgLT4gdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZldGNoKD9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgSGFuZGxlck1vZHVsZXMpOworICAgICAgICAoSGFuZGxlck1vZHVsZSkgLT4gSGFuZGxlck1vZHVsZQorICAgIGVuZCwKKworICAgIGNhc2UgTWVzc2FnZUJlZ2luIG9mCisKICAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gP3RNZXNzYWdlVHlwZV9DQUxMfSAtPgotICAgICAgICAgICAgb2sgPSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUsIGxpc3RfdG9fYXRvbShGdW5jdGlvbikpLAotICAgICAgICAgICAgbG9vcChTdGF0ZSk7Ci0gICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ID90TWVzc2FnZVR5cGVfT05FV0FZfSAtPgotICAgICAgICAgICAgb2sgPSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUsIGxpc3RfdG9fYXRvbShGdW5jdGlvbikpLAotICAgICAgICAgICAgbG9vcChTdGF0ZSk7Ci0gICAgICAgIHtlcnJvciwgdGltZW91dH0gLT4KLSAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoT1Byb3RvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxaWR9IHdoZW4gVHlwZSA9Oj0gP3RNZXNzYWdlVHlwZV9DQUxMOyBUeXBlID06PSA/dE1lc3NhZ2VUeXBlX09ORVdBWSAtPgorICAgICAgICAgICAgY2FzZSBzdHJpbmc6dG9rZW5zKEZ1bmN0aW9uLCA/TVVMVElQTEVYRURfU0VSVklDRV9TRVBBUkFUT1IpIG9mCisgICAgICAgICAgICAgICAgW1NlcnZpY2VOYW1lLCBGdW5jdGlvbk5hbWVdIC0+CisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNb2R1bGUgID0gdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZldGNoKFNlcnZpY2VOYW1lLCBTZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZUhhbmRsZXIgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6ZmV0Y2goU2VydmljZU5hbWUsIEhhbmRsZXIpLAorICAgICAgICAgICAgICAgICAgICBjYXNlIGhhbmRsZV9mdW5jdGlvbihTdGF0ZTEjdGhyaWZ0X3Byb2Nlc3NvcntzZXJ2aWNlPVNlcnZpY2VNb2R1bGUsIGhhbmRsZXI9U2VydmljZUhhbmRsZXJ9LCBsaXN0X3RvX2F0b20oRnVuY3Rpb25OYW1lKSwgU2VxaWQpIG9mCisgICAgICAgICAgICAgICAgICAgICAgICB7U3RhdGUyLCBva30gLT4gbG9vcChTdGF0ZTIjdGhyaWZ0X3Byb2Nlc3NvcntzZXJ2aWNlPVNlcnZpY2UsIGhhbmRsZXI9SGFuZGxlcn0pOworICAgICAgICAgICAgICAgICAgICAgICAge19TdGF0ZTIsIHtlcnJvciwgUmVhc29ufX0gLT4KKwkJCQkJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW2xpc3RfdG9fYXRvbShGdW5jdGlvbiksIFJlYXNvbl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaworICAgICAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAgICAgXyAtPgorICAgICAgICAgICAgICAgICAgICBjYXNlIGhhbmRsZV9mdW5jdGlvbihTdGF0ZTEsIGxpc3RfdG9fYXRvbShGdW5jdGlvbiksIFNlcWlkKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtfU3RhdGUyLCB7ZXJyb3IsIFJlYXNvbn19IC0+CisJCQkJCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFtsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb25dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sKKyAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBlbmQ7CisgICAgICAgIHtlcnJvciwgdGltZW91dCA9IFJlYXNvbn0gLT4KKwkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbdW5kZWZpbmVkLCBSZWFzb25dKSwKKyAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoUHJvdG8xKSwKICAgICAgICAgICAgIG9rOwotICAgICAgICB7ZXJyb3IsIGNsb3NlZH0gLT4KKyAgICAgICAge2Vycm9yLCBjbG9zZWQgPSBSZWFzb259IC0+CiAgICAgICAgICAgICAlJSBlcnJvcl9sb2dnZXI6aW5mb19tc2coIkNsaWVudCBkaXNjb25uZWN0ZWR+biIpLAotICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChPUHJvdG8pLAorCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFt1bmRlZmluZWQsIFJlYXNvbl0pLAorICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAorICAgICAgICAgICAgZXhpdChzaHV0ZG93bik7CisgICAgICAgIHtlcnJvciwgUmVhc29ufSAtPgorCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFt1bmRlZmluZWQsIFJlYXNvbl0pLAorICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAogICAgICAgICAgICAgZXhpdChzaHV0ZG93bikKICAgICBlbmQuCiAKLWhhbmRsZV9mdW5jdGlvbihTdGF0ZT0jdGhyaWZ0X3Byb2Nlc3Nvcntpbl9wcm90b2NvbCA9IElQcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcHJvdG9jb2wgPSBPUHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2V9LAotICAgICAgICAgICAgICAgIEZ1bmN0aW9uKSAtPgoraGFuZGxlX2Z1bmN0aW9uKFN0YXRlMD0jdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlfSwKKyAgICAgICAgICAgICAgICBGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICBTZXFpZCkgLT4KICAgICBJblBhcmFtcyA9IFNlcnZpY2U6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgcGFyYW1zX3R5cGUpLAogCi0gICAge29rLCBQYXJhbXN9ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoSVByb3RvLCBJblBhcmFtcyksCisgICAge1Byb3RvMSwge29rLCBQYXJhbXN9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvMCwgSW5QYXJhbXMpLAorICAgIFN0YXRlMSA9IFN0YXRlMCN0aHJpZnRfcHJvY2Vzc29ye3Byb3RvY29sID0gUHJvdG8xfSwKIAogICAgIHRyeQogICAgICAgICBSZXN1bHQgPSBIYW5kbGVyOmhhbmRsZV9mdW5jdGlvbihGdW5jdGlvbiwgUGFyYW1zKSwKICAgICAgICAgJSUge01pY3JvLCBSZXN1bHR9ID0gYmV0dGVyX3RpbWVyKEhhbmRsZXIsIGhhbmRsZV9mdW5jdGlvbiwgW0Z1bmN0aW9uLCBQYXJhbXNdKSwKICAgICAgICAgJSUgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJQcm9jZXNzZWQgfnAofnApIGluIH4uNGZtc35uIiwKICAgICAgICAgJSUgICAgICAgICAgICAgICAgICAgICAgIFtGdW5jdGlvbiwgUGFyYW1zLCBNaWNyby8xMDAwLjBdKSwKLSAgICAgICAgaGFuZGxlX3N1Y2Nlc3MoU3RhdGUsIEZ1bmN0aW9uLCBSZXN1bHQpCisgICAgICAgIGhhbmRsZV9zdWNjZXNzKFN0YXRlMSwgRnVuY3Rpb24sIFJlc3VsdCwgU2VxaWQpCiAgICAgY2F0Y2gKLSAgICAgICAgVHlwZTpEYXRhIC0+Ci0gICAgICAgICAgICBoYW5kbGVfZnVuY3Rpb25fY2F0Y2goU3RhdGUsIEZ1bmN0aW9uLCBUeXBlLCBEYXRhKQotICAgIGVuZCwKLSAgICBhZnRlcl9yZXBseShPUHJvdG8pLgorICAgICAgICBUeXBlOkRhdGEgd2hlbiBUeXBlID06PSB0aHJvdyBvcmVsc2UgVHlwZSA9Oj0gZXJyb3IgLT4KKyAgICAgICAgICAgIGhhbmRsZV9mdW5jdGlvbl9jYXRjaChTdGF0ZTEsIEZ1bmN0aW9uLCBUeXBlLCBEYXRhLCBTZXFpZCkKKyAgICBlbmQuCiAKIGhhbmRsZV9mdW5jdGlvbl9jYXRjaChTdGF0ZSA9ICN0aHJpZnRfcHJvY2Vzc29ye3NlcnZpY2UgPSBTZXJ2aWNlfSwKLSAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiwgRXJyVHlwZSwgRXJyRGF0YSkgLT4KKyAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiwgRXJyVHlwZSwgRXJyRGF0YSwgU2VxaWQpIC0+CiAgICAgSXNPbmV3YXkgPSBTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpID06PSBvbmV3YXlfdm9pZCwKIAogICAgIGNhc2Uge0VyclR5cGUsIEVyckRhdGF9IG9mCkBAIC04NCw0MSArMTE1LDQxIEBACiAgICAgICAgICAgICBlcnJvcl9sb2dnZXI6d2FybmluZ19tc2coCiAgICAgICAgICAgICAgICJvbmV3YXkgdm9pZCB+cCB0aHJldyBlcnJvciB3aGljaCBtdXN0IGJlIGlnbm9yZWQ6IH5wIiwKICAgICAgICAgICAgICAgW0Z1bmN0aW9uLCB7RXJyVHlwZSwgRXJyRGF0YSwgU3RhY2t9XSksCi0gICAgICAgICAgICBvazsKKyAgICAgICAgICAgIHtTdGF0ZSwgb2t9OwogCiAgICAgICAgIHt0aHJvdywgRXhjZXB0aW9ufSB3aGVuIGlzX3R1cGxlKEV4Y2VwdGlvbiksIHNpemUoRXhjZXB0aW9uKSA+IDAgLT4KLSAgICAgICAgICAgIGVycm9yX2xvZ2dlcjp3YXJuaW5nX21zZygifnAgdGhyZXcgZXhjZXB0aW9uOiB+cH5uIiwgW0Z1bmN0aW9uLCBFeGNlcHRpb25dKSwKLSAgICAgICAgICAgIGhhbmRsZV9leGNlcHRpb24oU3RhdGUsIEZ1bmN0aW9uLCBFeGNlcHRpb24pLAotICAgICAgICAgICAgb2s7ICAgJSB3ZSBzdGlsbCB3YW50IHRvIGFjY2VwdCBtb3JlIHJlcXVlc3RzIGZyb20gdGhpcyBjbGllbnQKKyAgICAgICAgICAgICVlcnJvcl9sb2dnZXI6d2FybmluZ19tc2coIn5wIHRocmV3IGV4Y2VwdGlvbjogfnB+biIsIFtGdW5jdGlvbiwgRXhjZXB0aW9uXSksCisgICAgICAgICAgICBoYW5kbGVfZXhjZXB0aW9uKFN0YXRlLCBGdW5jdGlvbiwgRXhjZXB0aW9uLCBTZXFpZCk7CisgICAgICAgICAgICAlIHdlIHN0aWxsIHdhbnQgdG8gYWNjZXB0IG1vcmUgcmVxdWVzdHMgZnJvbSB0aGlzIGNsaWVudAogCiAgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+Ci0gICAgICAgICAgICBvayA9IGhhbmRsZV9lcnJvcihTdGF0ZSwgRnVuY3Rpb24sIEVycm9yKQorICAgICAgICAgICAgaGFuZGxlX2Vycm9yKFN0YXRlLCBGdW5jdGlvbiwgRXJyb3IsIFNlcWlkKQogICAgIGVuZC4KIAotaGFuZGxlX3N1Y2Nlc3MoU3RhdGUgPSAjdGhyaWZ0X3Byb2Nlc3NvcntvdXRfcHJvdG9jb2wgPSBPUHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlfSwKK2hhbmRsZV9zdWNjZXNzKFN0YXRlID0gI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZSA9IFNlcnZpY2V9LAogICAgICAgICAgICAgICAgRnVuY3Rpb24sCi0gICAgICAgICAgICAgICBSZXN1bHQpIC0+CisgICAgICAgICAgICAgICBSZXN1bHQsCisgICAgICAgICAgICAgICBTZXFpZCkgLT4KICAgICBSZXBseVR5cGUgID0gU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCByZXBseV90eXBlKSwKICAgICBTdHJ1Y3ROYW1lID0gYXRvbV90b19saXN0KEZ1bmN0aW9uKSArKyAiX3Jlc3VsdCIsCiAKLSAgICBvayA9IGNhc2UgUmVzdWx0IG9mCi0gICAgICAgICAgICAge3JlcGx5LCBSZXBseURhdGF9IC0+Ci0gICAgICAgICAgICAgICAgIFJlcGx5ID0ge3tzdHJ1Y3QsIFt7MCwgUmVwbHlUeXBlfV19LCB7U3RydWN0TmFtZSwgUmVwbHlEYXRhfX0sCi0gICAgICAgICAgICAgICAgIHNlbmRfcmVwbHkoT1Byb3RvLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9SRVBMWSwgUmVwbHkpOworICAgIGNhc2UgUmVzdWx0IG9mCisgICAgICAgIHtyZXBseSwgUmVwbHlEYXRhfSAtPgorICAgICAgICAgICAgUmVwbHkgPSB7e3N0cnVjdCwgW3swLCBSZXBseVR5cGV9XX0sIHtTdHJ1Y3ROYW1lLCBSZXBseURhdGF9fSwKKyAgICAgICAgICAgIHNlbmRfcmVwbHkoU3RhdGUsIEZ1bmN0aW9uLCA/dE1lc3NhZ2VUeXBlX1JFUExZLCBSZXBseSwgU2VxaWQpOwogCi0gICAgICAgICAgICAgb2sgd2hlbiBSZXBseVR5cGUgPT0ge3N0cnVjdCwgW119IC0+Ci0gICAgICAgICAgICAgICAgIHNlbmRfcmVwbHkoT1Byb3RvLCBGdW5jdGlvbiwgP3RNZXNzYWdlVHlwZV9SRVBMWSwge1JlcGx5VHlwZSwge1N0cnVjdE5hbWV9fSk7CisgICAgICAgIG9rIHdoZW4gUmVwbHlUeXBlID09IHtzdHJ1Y3QsIFtdfSAtPgorICAgICAgICAgICAgc2VuZF9yZXBseShTdGF0ZSwgRnVuY3Rpb24sID90TWVzc2FnZVR5cGVfUkVQTFksIHtSZXBseVR5cGUsIHtTdHJ1Y3ROYW1lfX0sIFNlcWlkKTsKIAotICAgICAgICAgICAgIG9rIHdoZW4gUmVwbHlUeXBlID09IG9uZXdheV92b2lkIC0+Ci0gICAgICAgICAgICAgICAgICUlIG5vIHJlcGx5IGZvciBvbmV3YXkgdm9pZAotICAgICAgICAgICAgICAgICBvawotICAgICAgICAgZW5kLgorICAgICAgICBvayB3aGVuIFJlcGx5VHlwZSA9PSBvbmV3YXlfdm9pZCAtPgorICAgICAgICAgICAgJSUgbm8gcmVwbHkgZm9yIG9uZXdheSB2b2lkCisgICAgICAgICAgICB7U3RhdGUsIG9rfQorICAgIGVuZC4KIAotaGFuZGxlX2V4Y2VwdGlvbihTdGF0ZSA9ICN0aHJpZnRfcHJvY2Vzc29ye291dF9wcm90b2NvbCA9IE9Qcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZX0sCitoYW5kbGVfZXhjZXB0aW9uKFN0YXRlID0gI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZSA9IFNlcnZpY2V9LAogICAgICAgICAgICAgICAgICBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgRXhjZXB0aW9uKSAtPgorICAgICAgICAgICAgICAgICBFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgIFNlcWlkKSAtPgogICAgIEV4Y2VwdGlvblR5cGUgPSBlbGVtZW50KDEsIEV4Y2VwdGlvbiksCiAgICAgJSUgRmV0Y2ggYSBzdHJ1Y3R1cmUgbGlrZSB7c3RydWN0LCBbey0yLCB7c3RydWN0LCB7TW9kdWxlLCBUeXBlfX19LAogICAgICUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMywge3N0cnVjdCwge01vZHVsZSwgVHlwZX19fV19CkBAIC0xNDEsMjAgKzE3MiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBNYWtlIHN1cmUgd2UgZ290IGF0IGxlYXN0IG9uZSBkZWZpbmVkCiAgICAgY2FzZSBsaXN0czphbGwoZnVuKFgpIC0+IFggPTo9IHVuZGVmaW5lZCBlbmQsIEV4Y2VwdGlvbkxpc3QpIG9mCiAgICAgICAgIHRydWUgLT4KLSAgICAgICAgICAgIG9rID0gaGFuZGxlX3Vua25vd25fZXhjZXB0aW9uKFN0YXRlLCBGdW5jdGlvbiwgRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGhhbmRsZV91bmtub3duX2V4Y2VwdGlvbihTdGF0ZSwgRnVuY3Rpb24sIEV4Y2VwdGlvbiwgU2VxaWQpOwogICAgICAgICBmYWxzZSAtPgotICAgICAgICAgICAgb2sgPSBzZW5kX3JlcGx5KE9Qcm90bywgRnVuY3Rpb24sID90TWVzc2FnZVR5cGVfUkVQTFksIHtSZXBseVNwZWMsIEV4Y2VwdGlvblR1cGxlfSkKKyAgICAgICAgICAgIHNlbmRfcmVwbHkoU3RhdGUsIEZ1bmN0aW9uLCA/dE1lc3NhZ2VUeXBlX1JFUExZLCB7UmVwbHlTcGVjLCBFeGNlcHRpb25UdXBsZX0sIFNlcWlkKQogICAgIGVuZC4KIAogJSUKICUlIENhbGxlZCB3aGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBleHBsaWNpdGx5IHRocm93biBieSB0aGUgc2VydmljZSwgYnV0IGl0IHdhcwogJSUgbm90IG9uZSBvZiB0aGUgZXhjZXB0aW9ucyB0aGF0IHdhcyBkZWZpbmVkIGZvciB0aGUgZnVuY3Rpb24uCiAlJQotaGFuZGxlX3Vua25vd25fZXhjZXB0aW9uKFN0YXRlLCBGdW5jdGlvbiwgRXhjZXB0aW9uKSAtPgoraGFuZGxlX3Vua25vd25fZXhjZXB0aW9uKFN0YXRlLCBGdW5jdGlvbiwgRXhjZXB0aW9uLCBTZXFpZCkgLT4KICAgICBoYW5kbGVfZXJyb3IoU3RhdGUsIEZ1bmN0aW9uLCB7ZXhjZXB0aW9uX25vdF9kZWNsYXJlZF9hc190aHJvd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbn0pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb259LCBTZXFpZCkuCiAKLWhhbmRsZV9lcnJvcigjdGhyaWZ0X3Byb2Nlc3NvcntvdXRfcHJvdG9jb2wgPSBPUHJvdG99LCBGdW5jdGlvbiwgRXJyb3IpIC0+CitoYW5kbGVfZXJyb3IoU3RhdGUsIEZ1bmN0aW9uLCBFcnJvciwgU2VxaWQpIC0+CiAgICAgU3RhY2sgPSBlcmxhbmc6Z2V0X3N0YWNrdHJhY2UoKSwKICAgICBlcnJvcl9sb2dnZXI6ZXJyb3JfbXNnKCJ+cCBoYWQgYW4gZXJyb3I6IH5wfm4iLCBbRnVuY3Rpb24sIHtFcnJvciwgU3RhY2t9XSksCiAKQEAgLTE3MCwxOSArMjAxLDE5IEBACiAgICAgICAgICAgICAgIydUQXBwbGljYXRpb25FeGNlcHRpb24newogICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlLAogICAgICAgICAgICAgICAgIHR5cGUgPSA/VEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV059fSwKLSAgICBzZW5kX3JlcGx5KE9Qcm90bywgRnVuY3Rpb24sID90TWVzc2FnZVR5cGVfRVhDRVBUSU9OLCBSZXBseSkuCisgICAgc2VuZF9yZXBseShTdGF0ZSwgRnVuY3Rpb24sID90TWVzc2FnZVR5cGVfRVhDRVBUSU9OLCBSZXBseSwgU2VxaWQpLgogCi1zZW5kX3JlcGx5KE9Qcm90bywgRnVuY3Rpb24sIFJlcGx5TWVzc2FnZVR5cGUsIFJlcGx5KSAtPgotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKE9Qcm90bywgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXRvbV90b19saXN0KEZ1bmN0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBSZXBseU1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSAwfSksCi0gICAgb2sgPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoT1Byb3RvLCBSZXBseSksCi0gICAgb2sgPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoT1Byb3RvLCBtZXNzYWdlX2VuZCksCi0gICAgb2sgPSB0aHJpZnRfcHJvdG9jb2w6Zmx1c2hfdHJhbnNwb3J0KE9Qcm90byksCi0gICAgb2suCi0KLWFmdGVyX3JlcGx5KE9Qcm90bykgLT4KLSAgICBvayA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoT1Byb3RvKQotICAgICUlICAgICBvayA9IHRocmlmdF9wcm90b2NvbDpjbG9zZV90cmFuc3BvcnQoT1Byb3RvKQotICAgIC4KK3NlbmRfcmVwbHkoU3RhdGUgPSAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvMH0sIEZ1bmN0aW9uLCBSZXBseU1lc3NhZ2VUeXBlLCBSZXBseSwgU2VxaWQpIC0+CisgICAgdHJ5CisgICAgICAgIHtQcm90bzEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXRvbV90b19saXN0KEZ1bmN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFJlcGx5TWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxaWR9KSwKKyAgICAgICAge1Byb3RvMiwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMSwgUmVwbHkpLAorICAgICAgICB7UHJvdG8zLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG8yLCBtZXNzYWdlX2VuZCksCisgICAgICAgIHtQcm90bzQsIG9rfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoUHJvdG8zKSwKKyAgICAgICAge1N0YXRlI3RocmlmdF9wcm9jZXNzb3J7cHJvdG9jb2wgPSBQcm90bzR9LCBva30KKyAgICBjYXRjaAorICAgICAgICBlcnJvcjp7YmFkbWF0Y2gsIHtfLCB7ZXJyb3IsIF99ID0gRXJyb3J9fSAtPgorICAgICAgICAgICAge1N0YXRlLCBFcnJvcn0KKyAgICBlbmQuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybAppbmRleCAxYmZiMGE0Li4yZmUxMGQ2IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwKQEAgLTQ5LDEwICs0OSwxMyBAQAogICAgIHtvaywgI3Byb3RvY29se21vZHVsZSA9IE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBkYXRhID0gRGF0YX19LgogCi1mbHVzaF90cmFuc3BvcnQoI3Byb3RvY29se21vZHVsZSA9IE1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IERhdGF9KSAtPgotICAgIE1vZHVsZTpmbHVzaF90cmFuc3BvcnQoRGF0YSkuCistc3BlYyBmbHVzaF90cmFuc3BvcnQoI3Byb3RvY29se30pIC0+IHsjcHJvdG9jb2x7fSwgb2t9LgorZmx1c2hfdHJhbnNwb3J0KFByb3RvID0gI3Byb3RvY29se21vZHVsZSA9IE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRGF0YX0pIC0+CisgICAge05ld0RhdGEsIFJlc3VsdH0gPSBNb2R1bGU6Zmx1c2hfdHJhbnNwb3J0KERhdGEpLAorICAgIHtQcm90byNwcm90b2NvbHtkYXRhID0gTmV3RGF0YX0sIFJlc3VsdH0uCiAKKy1zcGVjIGNsb3NlX3RyYW5zcG9ydCgjcHJvdG9jb2x7fSkgLT4gb2suCiBjbG9zZV90cmFuc3BvcnQoI3Byb3RvY29se21vZHVsZSA9IE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IERhdGF9KSAtPgogICAgIE1vZHVsZTpjbG9zZV90cmFuc3BvcnQoRGF0YSkuCkBAIC02MCw4ICs2Myw4IEBACiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfU1RPUCkgLT4gZmllbGRfc3RvcDsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9WT0lEKSAtPiB2b2lkOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0JPT0wpIC0+IGJvb2w7Ci10eXBlaWRfdG9fYXRvbSg/dFR5cGVfQllURSkgLT4gYnl0ZTsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9ET1VCTEUpIC0+IGRvdWJsZTsKK3R5cGVpZF90b19hdG9tKD90VHlwZV9JOCkgLT4gYnl0ZTsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9JMTYpIC0+IGkxNjsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9JMzIpIC0+IGkzMjsKIHR5cGVpZF90b19hdG9tKD90VHlwZV9JNjQpIC0+IGk2NDsKQEAgLTczLDggKzc2LDkgQEAKIAogdGVybV90b190eXBlaWQodm9pZCkgLT4gP3RUeXBlX1ZPSUQ7CiB0ZXJtX3RvX3R5cGVpZChib29sKSAtPiA/dFR5cGVfQk9PTDsKLXRlcm1fdG9fdHlwZWlkKGJ5dGUpIC0+ID90VHlwZV9CWVRFOwordGVybV90b190eXBlaWQoYnl0ZSkgLT4gP3RUeXBlX0k4OwogdGVybV90b190eXBlaWQoZG91YmxlKSAtPiA/dFR5cGVfRE9VQkxFOwordGVybV90b190eXBlaWQoaTgpIC0+ID90VHlwZV9JODsKIHRlcm1fdG9fdHlwZWlkKGkxNikgLT4gP3RUeXBlX0kxNjsKIHRlcm1fdG9fdHlwZWlkKGkzMikgLT4gP3RUeXBlX0kzMjsKIHRlcm1fdG9fdHlwZWlkKGk2NCkgLT4gP3RUeXBlX0k2NDsKQEAgLTg2LDcgKzkwLDggQEAKIAogJSUgU3RydWN0dXJlIGlzIGxpa2U6CiAlJSAgICBbe0ZpZCwgVHlwZX0sIC4uLl0KLXJlYWQoSVByb3RvLCB7c3RydWN0LCBTdHJ1Y3R1cmV9LCBUYWcpCistc3BlYyByZWFkKCNwcm90b2NvbHt9LCB7c3RydWN0LCBfU3RydWN0RGVmfSwgYXRvbSgpKSAtPiB7I3Byb3RvY29se30sIHtvaywgdHVwbGUoKX19LgorcmVhZChJUHJvdG8wLCB7c3RydWN0LCBTdHJ1Y3R1cmV9LCBUYWcpCiAgIHdoZW4gaXNfbGlzdChTdHJ1Y3R1cmUpLCBpc19hdG9tKFRhZykgLT4KIAogICAgICUgSWYgd2Ugd2FudCBhIHRhZ2dlZCB0dXBsZSwgd2UgbmVlZCB0byBvZmZzZXQgYWxsIHRoZSB0dXBsZSBpbmRpY2VzCkBAIC0xMDMsMTQgKzEwOCwyMyBAQAogICAgICUgRmlkIC0+IHtUeXBlLCBJbmRleH0KICAgICBTRGljdCA9IGRpY3Q6ZnJvbV9saXN0KFNXaXRoSW5kaWNlcyksCiAKLSAgICBvayA9IHJlYWQoSVByb3RvLCBzdHJ1Y3RfYmVnaW4pLAorICAgIHtJUHJvdG8xLCBva30gPSByZWFkKElQcm90bzAsIHN0cnVjdF9iZWdpbiksCiAgICAgUlR1cGxlMCA9IGVybGFuZzptYWtlX3R1cGxlKGxlbmd0aChTdHJ1Y3R1cmUpICsgT2Zmc2V0LCB1bmRlZmluZWQpLAogICAgIFJUdXBsZTEgPSBpZiBUYWcgPS89IHVuZGVmaW5lZCAtPiBzZXRlbGVtZW50KDEsIFJUdXBsZTAsIFRhZyk7CiAgICAgICAgICAgICAgICAgIHRydWUgICAgICAgICAgICAgIC0+IFJUdXBsZTAKICAgICAgICAgICAgICAgZW5kLAogCi0gICAgUlR1cGxlMiA9IHJlYWRfc3RydWN0X2xvb3AoSVByb3RvLCBTRGljdCwgUlR1cGxlMSksCi0gICAge29rLCBSVHVwbGUyfS4KKyAgICB7SVByb3RvMiwgUlR1cGxlMn0gPSByZWFkX3N0cnVjdF9sb29wKElQcm90bzEsIFNEaWN0LCBSVHVwbGUxKSwKKyAgICB7SVByb3RvMiwge29rLCBSVHVwbGUyfX0uCisKKworJSUgTk9URTogS2VlcCB0aGlzIGluIHN5bmMgd2l0aCB0aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyOnJlYWQKKy1zcGVjIHJlYWQKKyAgICAgICAgKCNwcm90b2NvbHt9LCB7c3RydWN0LCBfSW5mb30pIC0+ICAgIHsjcHJvdG9jb2x7fSwge29rLCB0dXBsZSgpfSAgICAgIHwge2Vycm9yLCBfUmVhc29ufX07CisgICAgICAgICgjcHJvdG9jb2x7fSwgdHByb3RfY29udF90YWcoKSkgLT4gICB7I3Byb3RvY29se30sIHtvaywgYW55KCl9ICAgICAgICB8IHtlcnJvciwgX1JlYXNvbn19OworICAgICAgICAoI3Byb3RvY29se30sIHRwcm90X2VtcHR5X3RhZygpKSAtPiAgeyNwcm90b2NvbHt9LCAgb2sgICAgICAgICAgICAgICAgfCB7ZXJyb3IsIF9SZWFzb259fTsKKyAgICAgICAgKCNwcm90b2NvbHt9LCB0cHJvdF9oZWFkZXJfdGFnKCkpIC0+IHsjcHJvdG9jb2x7fSwgdHByb3RfaGVhZGVyX3ZhbCgpIHwge2Vycm9yLCBfUmVhc29ufX07CisgICAgICAgICgjcHJvdG9jb2x7fSwgdHByb3RfZGF0YV90YWcoKSkgLT4gICB7I3Byb3RvY29se30sIHtvaywgYW55KCl9ICAgICAgICB8IHtlcnJvciwgX1JlYXNvbn19LgogCiByZWFkKElQcm90bywge3N0cnVjdCwge01vZHVsZSwgU3RydWN0dXJlTmFtZX19KSB3aGVuIGlzX2F0b20oTW9kdWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYXRvbShTdHJ1Y3R1cmVOYW1lKSAtPgpAQCAtMTE5LDEzNyArMTMzLDE2OCBAQAogcmVhZChJUHJvdG8sIFM9e3N0cnVjdCwgU3RydWN0dXJlfSkgd2hlbiBpc19saXN0KFN0cnVjdHVyZSkgLT4KICAgICByZWFkKElQcm90bywgUywgdW5kZWZpbmVkKTsKIAotcmVhZChJUHJvdG8sIHtsaXN0LCBUeXBlfSkgLT4KLSAgICAjcHJvdG9jb2xfbGlzdF9iZWdpbntldHlwZSA9IEVUeXBlLCBzaXplID0gU2l6ZX0gPQotICAgICAgICByZWFkKElQcm90bywgbGlzdF9iZWdpbiksCi0gICAgTGlzdCA9IFtSZXN1bHQgfHwge29rLCBSZXN1bHR9IDwtCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkKElQcm90bywgVHlwZSkgfHwgX1ggPC0gbGlzdHM6ZHVwbGljYXRlKFNpemUsIDApXV0sCi0gICAgb2sgPSByZWFkKElQcm90bywgbGlzdF9lbmQpLAotICAgIHtvaywgTGlzdH07CityZWFkKElQcm90bzAsIHtsaXN0LCBUeXBlfSkgLT4KKyAgICB7SVByb3RvMSwgI3Byb3RvY29sX2xpc3RfYmVnaW57ZXR5cGUgPSBFVHlwZSwgc2l6ZSA9IFNpemV9fSA9CisgICAgICAgIHJlYWQoSVByb3RvMCwgbGlzdF9iZWdpbiksCisgICAge0VUeXBlLCBFVHlwZX0gPSB7dGVybV90b190eXBlaWQoVHlwZSksIEVUeXBlfSwKKyAgICB7TGlzdCwgSVByb3RvMn0gPSBsaXN0czptYXBmb2xkbChmdW4oXywgUHJvdG9TMCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b1MxLCB7b2ssIEl0ZW19fSA9IHJlYWQoUHJvdG9TMCwgVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7SXRlbSwgUHJvdG9TMX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb3RvMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0czpkdXBsaWNhdGUoU2l6ZSwgMCkpLAorICAgIHtJUHJvdG8zLCBva30gPSByZWFkKElQcm90bzIsIGxpc3RfZW5kKSwKKyAgICB7SVByb3RvMywge29rLCBMaXN0fX07CiAKLXJlYWQoSVByb3RvLCB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfSkgLT4KLSAgICAjcHJvdG9jb2xfbWFwX2JlZ2lue3NpemUgPSBTaXplfSA9Ci0gICAgICAgIHJlYWQoSVByb3RvLCBtYXBfYmVnaW4pLAorcmVhZChJUHJvdG8wLCB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfSkgLT4KKyAgICB7SVByb3RvMSwgI3Byb3RvY29sX21hcF9iZWdpbntzaXplID0gU2l6ZSwga3R5cGUgPSBLVHlwZSwgdnR5cGUgPSBWVHlwZX19ID0KKyAgICAgICAgcmVhZChJUHJvdG8wLCBtYXBfYmVnaW4pLAorICAgIF8gPSBjYXNlIFNpemUgb2YKKyAgICAgIDAgLT4gMDsKKyAgICAgIF8gLT4KKyAgICAgICAge0tUeXBlLCBLVHlwZX0gPSB7dGVybV90b190eXBlaWQoS2V5VHlwZSksIEtUeXBlfSwKKyAgICAgICAge1ZUeXBlLCBWVHlwZX0gPSB7dGVybV90b190eXBlaWQoVmFsVHlwZSksIFZUeXBlfQorICAgIGVuZCwKKyAgICB7TGlzdCwgSVByb3RvMn0gPSBsaXN0czptYXBmb2xkbChmdW4oXywgUHJvdG9TMCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b1MxLCB7b2ssIEtleX19ID0gcmVhZChQcm90b1MwLCBLZXlUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b1MyLCB7b2ssIFZhbH19ID0gcmVhZChQcm90b1MxLCBWYWxUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7S2V5LCBWYWx9LCBQcm90b1MyfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvdG8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RzOmR1cGxpY2F0ZShTaXplLCAwKSksCisgICAge0lQcm90bzMsIG9rfSA9IHJlYWQoSVByb3RvMiwgbWFwX2VuZCksCisgICAge0lQcm90bzMsIHtvaywgZGljdDpmcm9tX2xpc3QoTGlzdCl9fTsKIAotICAgIExpc3QgPSBbe0tleSwgVmFsfSB8fCB7e29rLCBLZXl9LCB7b2ssIFZhbH19IDwtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3JlYWQoSVByb3RvLCBLZXlUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChJUHJvdG8sIFZhbFR5cGUpfSB8fCBfWCA8LSBsaXN0czpkdXBsaWNhdGUoU2l6ZSwgMCldXSwKLSAgICBvayA9IHJlYWQoSVByb3RvLCBtYXBfZW5kKSwKLSAgICB7b2ssIGRpY3Q6ZnJvbV9saXN0KExpc3QpfTsKK3JlYWQoSVByb3RvMCwge3NldCwgVHlwZX0pIC0+CisgICAge0lQcm90bzEsICNwcm90b2NvbF9zZXRfYmVnaW57ZXR5cGUgPSBFVHlwZSwgc2l6ZSA9IFNpemV9fSA9CisgICAgICAgIHJlYWQoSVByb3RvMCwgc2V0X2JlZ2luKSwKKyAgICB7RVR5cGUsIEVUeXBlfSA9IHt0ZXJtX3RvX3R5cGVpZChUeXBlKSwgRVR5cGV9LAorICAgIHtMaXN0LCBJUHJvdG8yfSA9IGxpc3RzOm1hcGZvbGRsKGZ1bihfLCBQcm90b1MwKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvUzEsIHtvaywgSXRlbX19ID0gcmVhZChQcm90b1MwLCBUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtJdGVtLCBQcm90b1MxfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvdG8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RzOmR1cGxpY2F0ZShTaXplLCAwKSksCisgICAge0lQcm90bzMsIG9rfSA9IHJlYWQoSVByb3RvMiwgc2V0X2VuZCksCisgICAge0lQcm90bzMsIHtvaywgc2V0czpmcm9tX2xpc3QoTGlzdCl9fTsKIAotcmVhZChJUHJvdG8sIHtzZXQsIFR5cGV9KSAtPgotICAgICNwcm90b2NvbF9zZXRfYmVnaW57ZXR5cGUgPSBfRVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0gPQotICAgICAgICByZWFkKElQcm90bywgc2V0X2JlZ2luKSwKLSAgICBMaXN0ID0gW1Jlc3VsdCB8fCB7b2ssIFJlc3VsdH0gPC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWQoSVByb3RvLCBUeXBlKSB8fCBfWCA8LSBsaXN0czpkdXBsaWNhdGUoU2l6ZSwgMCldXSwKLSAgICBvayA9IHJlYWQoSVByb3RvLCBzZXRfZW5kKSwKLSAgICB7b2ssIHNldHM6ZnJvbV9saXN0KExpc3QpfTsKK3JlYWQoUHJvdG9jb2wsIFByb3RvY29sVHlwZSkgLT4KKyAgICByZWFkX3NwZWNpZmljKFByb3RvY29sLCBQcm90b2NvbFR5cGUpLgogCi1yZWFkKCNwcm90b2NvbHttb2R1bGUgPSBNb2R1bGUsCi0gICAgICAgICAgICAgICBkYXRhID0gTW9kdWxlRGF0YX0sIFByb3RvY29sVHlwZSkgLT4KLSAgICBNb2R1bGU6cmVhZChNb2R1bGVEYXRhLCBQcm90b2NvbFR5cGUpLgorJSUgTk9URTogS2VlcCB0aGlzIGluIHN5bmMgd2l0aCB0aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyOnJlYWQKKy1zcGVjIHJlYWRfc3BlY2lmaWMKKyAgICAgICAgKCNwcm90b2NvbHt9LCB0cHJvdF9lbXB0eV90YWcoKSkgLT4gIHsjcHJvdG9jb2x7fSwgIG9rICAgICAgICAgICAgICAgIHwge2Vycm9yLCBfUmVhc29ufX07CisgICAgICAgICgjcHJvdG9jb2x7fSwgdHByb3RfaGVhZGVyX3RhZygpKSAtPiB7I3Byb3RvY29se30sIHRwcm90X2hlYWRlcl92YWwoKSB8IHtlcnJvciwgX1JlYXNvbn19OworICAgICAgICAoI3Byb3RvY29se30sIHRwcm90X2RhdGFfdGFnKCkpIC0+ICAgeyNwcm90b2NvbHt9LCB7b2ssIGFueSgpfSAgICAgICAgfCB7ZXJyb3IsIF9SZWFzb259fS4KK3JlYWRfc3BlY2lmaWMoUHJvdG8gPSAjcHJvdG9jb2x7bW9kdWxlID0gTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gTW9kdWxlRGF0YX0sIFByb3RvY29sVHlwZSkgLT4KKyAgICB7TmV3RGF0YSwgUmVzdWx0fSA9IE1vZHVsZTpyZWFkKE1vZHVsZURhdGEsIFByb3RvY29sVHlwZSksCisgICAge1Byb3RvI3Byb3RvY29se2RhdGEgPSBOZXdEYXRhfSwgUmVzdWx0fS4KIAotcmVhZF9zdHJ1Y3RfbG9vcChJUHJvdG8sIFNEaWN0LCBSVHVwbGUpIC0+Ci0gICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBGVHlwZSwgaWQgPSBGaWQsIG5hbWUgPSBOYW1lfSA9Ci0gICAgICAgIHRocmlmdF9wcm90b2NvbDpyZWFkKElQcm90bywgZmllbGRfYmVnaW4pLAorcmVhZF9zdHJ1Y3RfbG9vcChJUHJvdG8wLCBTRGljdCwgUlR1cGxlKSAtPgorICAgIHtJUHJvdG8xLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9IEZUeXBlLCBpZCA9IEZpZH19ID0KKyAgICAgICAgdGhyaWZ0X3Byb3RvY29sOnJlYWQoSVByb3RvMCwgZmllbGRfYmVnaW4pLAogICAgIGNhc2Uge0ZUeXBlLCBGaWR9IG9mCiAgICAgICAgIHs/dFR5cGVfU1RPUCwgX30gLT4KLSAgICAgICAgICAgIFJUdXBsZTsKKyAgICAgICAgICAgIHtJUHJvdG8yLCBva30gPSByZWFkKElQcm90bzEsIHN0cnVjdF9lbmQpLAorICAgICAgICAgICAge0lQcm90bzIsIFJUdXBsZX07CiAgICAgICAgIF9FbHNlIC0+CiAgICAgICAgICAgICBjYXNlIGRpY3Q6ZmluZChGaWQsIFNEaWN0KSBvZgogICAgICAgICAgICAgICAgIHtvaywge1R5cGUsIEluZGV4fX0gLT4KICAgICAgICAgICAgICAgICAgICAgY2FzZSB0ZXJtX3RvX3R5cGVpZChUeXBlKSBvZgogICAgICAgICAgICAgICAgICAgICAgICAgRlR5cGUgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFZhbH0gPSByZWFkKElQcm90bywgVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOnJlYWQoSVByb3RvLCBmaWVsZF9lbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtJUHJvdG8yLCB7b2ssIFZhbH19ID0gcmVhZChJUHJvdG8xLCBUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7SVByb3RvMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoSVByb3RvMiwgZmllbGRfZW5kKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdSVHVwbGUgPSBzZXRlbGVtZW50KEluZGV4LCBSVHVwbGUsIFZhbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9zdHJ1Y3RfbG9vcChJUHJvdG8sIFNEaWN0LCBOZXdSVHVwbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfc3RydWN0X2xvb3AoSVByb3RvMywgU0RpY3QsIE5ld1JUdXBsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZCAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTa2lwcGluZyBmaWVsZCB+cCB3aXRoIHdyb25nIHR5cGUgKH5wICE9IH5wKX5uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtGaWQsIEZUeXBlLCBFeHBlY3RlZF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfZmllbGQoRlR5cGUsIElQcm90bywgU0RpY3QsIFJUdXBsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2ZpZWxkKEZUeXBlLCBJUHJvdG8xLCBTRGljdCwgUlR1cGxlKQogICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgICAgX0Vsc2UyIC0+Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygiU2tpcHBpbmcgZmllbGQgfnAgd2l0aCB1bmtub3duIGZpZH5uIiwgW0ZpZF0pLAotICAgICAgICAgICAgICAgICAgICBza2lwX2ZpZWxkKEZUeXBlLCBJUHJvdG8sIFNEaWN0LCBSVHVwbGUpCisgICAgICAgICAgICAgICAgICAgIHNraXBfZmllbGQoRlR5cGUsIElQcm90bzEsIFNEaWN0LCBSVHVwbGUpCiAgICAgICAgICAgICBlbmQKICAgICBlbmQuCiAKLXNraXBfZmllbGQoRlR5cGUsIElQcm90bywgU0RpY3QsIFJUdXBsZSkgLT4KLSAgICBGVHlwZUF0b20gPSB0aHJpZnRfcHJvdG9jb2w6dHlwZWlkX3RvX2F0b20oRlR5cGUpLAotICAgIHRocmlmdF9wcm90b2NvbDpza2lwKElQcm90bywgRlR5cGVBdG9tKSwKLSAgICByZWFkKElQcm90bywgZmllbGRfZW5kKSwKLSAgICByZWFkX3N0cnVjdF9sb29wKElQcm90bywgU0RpY3QsIFJUdXBsZSkuCitza2lwX2ZpZWxkKEZUeXBlLCBJUHJvdG8wLCBTRGljdCwgUlR1cGxlKSAtPgorICAgIHtJUHJvdG8xLCBva30gPSBza2lwKElQcm90bzAsIHR5cGVpZF90b19hdG9tKEZUeXBlKSksCisgICAge0lQcm90bzIsIG9rfSA9IHJlYWQoSVByb3RvMSwgZmllbGRfZW5kKSwKKyAgICByZWFkX3N0cnVjdF9sb29wKElQcm90bzIsIFNEaWN0LCBSVHVwbGUpLgorCistc3BlYyBza2lwKCNwcm90b2NvbHt9LCBhdG9tKCkpIC0+IHsjcHJvdG9jb2x7fSwgb2t9LgorCitza2lwKFByb3RvMCwgc3RydWN0KSAtPgorICAgIHtQcm90bzEsIG9rfSA9IHJlYWQoUHJvdG8wLCBzdHJ1Y3RfYmVnaW4pLAorICAgIHtQcm90bzIsIG9rfSA9IHNraXBfc3RydWN0X2xvb3AoUHJvdG8xKSwKKyAgICB7UHJvdG8zLCBva30gPSByZWFkKFByb3RvMiwgc3RydWN0X2VuZCksCisgICAge1Byb3RvMywgb2t9OworCitza2lwKFByb3RvMCwgbWFwKSAtPgorICAgIHtQcm90bzEsIE1hcH0gPSByZWFkKFByb3RvMCwgbWFwX2JlZ2luKSwKKyAgICB7UHJvdG8yLCBva30gPSBza2lwX21hcF9sb29wKFByb3RvMSwgTWFwKSwKKyAgICB7UHJvdG8zLCBva30gPSByZWFkKFByb3RvMiwgbWFwX2VuZCksCisgICAge1Byb3RvMywgb2t9OworCitza2lwKFByb3RvMCwgc2V0KSAtPgorICAgIHtQcm90bzEsIFNldH0gPSByZWFkKFByb3RvMCwgc2V0X2JlZ2luKSwKKyAgICB7UHJvdG8yLCBva30gPSBza2lwX3NldF9sb29wKFByb3RvMSwgU2V0KSwKKyAgICB7UHJvdG8zLCBva30gPSByZWFkKFByb3RvMiwgc2V0X2VuZCksCisgICAge1Byb3RvMywgb2t9OworCitza2lwKFByb3RvMCwgbGlzdCkgLT4KKyAgICB7UHJvdG8xLCBMaXN0fSA9IHJlYWQoUHJvdG8wLCBsaXN0X2JlZ2luKSwKKyAgICB7UHJvdG8yLCBva30gPSBza2lwX2xpc3RfbG9vcChQcm90bzEsIExpc3QpLAorICAgIHtQcm90bzMsIG9rfSA9IHJlYWQoUHJvdG8yLCBsaXN0X2VuZCksCisgICAge1Byb3RvMywgb2t9OworCitza2lwKFByb3RvMCwgVHlwZSkgd2hlbiBpc19hdG9tKFR5cGUpIC0+CisgICAge1Byb3RvMSwgX0lnbm9yZX0gPSByZWFkKFByb3RvMCwgVHlwZSksCisgICAge1Byb3RvMSwgb2t9LgogCiAKLXNraXAoUHJvdG8sIHN0cnVjdCkgLT4KLSAgICBvayA9IHJlYWQoUHJvdG8sIHN0cnVjdF9iZWdpbiksCi0gICAgb2sgPSBza2lwX3N0cnVjdF9sb29wKFByb3RvKSwKLSAgICBvayA9IHJlYWQoUHJvdG8sIHN0cnVjdF9lbmQpOwotCi1za2lwKFByb3RvLCBtYXApIC0+Ci0gICAgTWFwID0gcmVhZChQcm90bywgbWFwX2JlZ2luKSwKLSAgICBvayA9IHNraXBfbWFwX2xvb3AoUHJvdG8sIE1hcCksCi0gICAgb2sgPSByZWFkKFByb3RvLCBtYXBfZW5kKTsKLQotc2tpcChQcm90bywgc2V0KSAtPgotICAgIFNldCA9IHJlYWQoUHJvdG8sIHNldF9iZWdpbiksCi0gICAgb2sgPSBza2lwX3NldF9sb29wKFByb3RvLCBTZXQpLAotICAgIG9rID0gcmVhZChQcm90bywgc2V0X2VuZCk7Ci0KLXNraXAoUHJvdG8sIGxpc3QpIC0+Ci0gICAgTGlzdCA9IHJlYWQoUHJvdG8sIGxpc3RfYmVnaW4pLAotICAgIG9rID0gc2tpcF9saXN0X2xvb3AoUHJvdG8sIExpc3QpLAotICAgIG9rID0gcmVhZChQcm90bywgbGlzdF9lbmQpOwotCi1za2lwKFByb3RvLCBUeXBlKSB3aGVuIGlzX2F0b20oVHlwZSkgLT4KLSAgICBfSWdub3JlID0gcmVhZChQcm90bywgVHlwZSksCi0gICAgb2suCi0KLQotc2tpcF9zdHJ1Y3RfbG9vcChQcm90bykgLT4KLSAgICAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9IFR5cGV9ID0gcmVhZChQcm90bywgZmllbGRfYmVnaW4pLAorc2tpcF9zdHJ1Y3RfbG9vcChQcm90bzApIC0+CisgICAge1Byb3RvMSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lue3R5cGUgPSBUeXBlfX0gPSByZWFkKFByb3RvMCwgZmllbGRfYmVnaW4pLAogICAgIGNhc2UgVHlwZSBvZgogICAgICAgICA/dFR5cGVfU1RPUCAtPgotICAgICAgICAgICAgb2s7CisgICAgICAgICAgICB7UHJvdG8xLCBva307CiAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICBza2lwKFByb3RvLCBUeXBlKSwKLSAgICAgICAgICAgIG9rID0gcmVhZChQcm90bywgZmllbGRfZW5kKSwKLSAgICAgICAgICAgIHNraXBfc3RydWN0X2xvb3AoUHJvdG8pCisgICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgdHlwZWlkX3RvX2F0b20oVHlwZSkpLAorICAgICAgICAgICAge1Byb3RvMywgb2t9ID0gcmVhZChQcm90bzIsIGZpZWxkX2VuZCksCisgICAgICAgICAgICBza2lwX3N0cnVjdF9sb29wKFByb3RvMykKICAgICBlbmQuCiAKLXNraXBfbWFwX2xvb3AoUHJvdG8sIE1hcCA9ICNwcm90b2NvbF9tYXBfYmVnaW57a3R5cGUgPSBLdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR5cGUgPSBWdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorc2tpcF9tYXBfbG9vcChQcm90bzAsIE1hcCA9ICNwcm90b2NvbF9tYXBfYmVnaW57a3R5cGUgPSBLdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0eXBlID0gVnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+CiAgICAgY2FzZSBTaXplIG9mCiAgICAgICAgIE4gd2hlbiBOID4gMCAtPgotICAgICAgICAgICAgc2tpcChQcm90bywgS3R5cGUpLAotICAgICAgICAgICAgc2tpcChQcm90bywgVnR5cGUpLAotICAgICAgICAgICAgc2tpcF9tYXBfbG9vcChQcm90bywKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShLdHlwZSkpLAorICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIHR5cGVpZF90b19hdG9tKFZ0eXBlKSksCisgICAgICAgICAgICBza2lwX21hcF9sb29wKFByb3RvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX21hcF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKLSAgICAgICAgMCAtPiBvaworICAgICAgICAwIC0+IHtQcm90bzAsIG9rfQogICAgIGVuZC4KIAotc2tpcF9zZXRfbG9vcChQcm90bywgTWFwID0gI3Byb3RvY29sX3NldF9iZWdpbntldHlwZSA9IEV0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+Citza2lwX3NldF9sb29wKFByb3RvMCwgTWFwID0gI3Byb3RvY29sX3NldF9iZWdpbntldHlwZSA9IEV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgogICAgIGNhc2UgU2l6ZSBvZgogICAgICAgICBOIHdoZW4gTiA+IDAgLT4KLSAgICAgICAgICAgIHNraXAoUHJvdG8sIEV0eXBlKSwKLSAgICAgICAgICAgIHNraXBfc2V0X2xvb3AoUHJvdG8sCisgICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgdHlwZWlkX3RvX2F0b20oRXR5cGUpKSwKKyAgICAgICAgICAgIHNraXBfc2V0X2xvb3AoUHJvdG8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAjcHJvdG9jb2xfc2V0X2JlZ2lue3NpemUgPSBTaXplIC0gMX0pOwotICAgICAgICAwIC0+IG9rCisgICAgICAgIDAgLT4ge1Byb3RvMCwgb2t9CiAgICAgZW5kLgogCi1za2lwX2xpc3RfbG9vcChQcm90bywgTWFwID0gI3Byb3RvY29sX2xpc3RfYmVnaW57ZXR5cGUgPSBFdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+Citza2lwX2xpc3RfbG9vcChQcm90bzAsIE1hcCA9ICNwcm90b2NvbF9saXN0X2JlZ2lue2V0eXBlID0gRXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICBza2lwKFByb3RvLCBFdHlwZSksCi0gICAgICAgICAgICBza2lwX2xpc3RfbG9vcChQcm90bywKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShFdHlwZSkpLAorICAgICAgICAgICAgc2tpcF9saXN0X2xvb3AoUHJvdG8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX2xpc3RfYmVnaW57c2l6ZSA9IFNpemUgLSAxfSk7Ci0gICAgICAgIDAgLT4gb2sKKyAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KICAgICBlbmQuCiAKIApAQCAtMjY3LDkwICszMTIsMTAxIEBACiAlJSAgICAgICB8IGxpc3QoKSAgIC0tIGZvciBsaXN0CiAlJSAgICAgICB8IGRpY3Rpb25hcnkoKSAgIC0tIGZvciBtYXAKICUlICAgICAgIHwgc2V0KCkgICAgLS0gZm9yIHNldAotJSUgICAgICAgfCB0ZXJtKCkgICAtLSBmb3IgYmFzZSB0eXBlcworJSUgICAgICAgfCBhbnkoKSAgICAtLSBmb3IgYmFzZSB0eXBlcwogJSUKICUlIERlc2NyaXB0aW9uOgogJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotd3JpdGUoUHJvdG8sIHt7c3RydWN0LCBTdHJ1Y3REZWZ9LCBEYXRhfSkKKy1zcGVjIHdyaXRlKCNwcm90b2NvbHt9LCBhbnkoKSkgLT4geyNwcm90b2NvbHt9LCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgorCit3cml0ZShQcm90bzAsIHt7c3RydWN0LCBTdHJ1Y3REZWZ9LCBEYXRhfSkKICAgd2hlbiBpc19saXN0KFN0cnVjdERlZiksIGlzX3R1cGxlKERhdGEpLCBsZW5ndGgoU3RydWN0RGVmKSA9PSBzaXplKERhdGEpIC0gMSAtPgogCiAgICAgW1N0cnVjdE5hbWUgfCBFbGVtc10gPSB0dXBsZV90b19saXN0KERhdGEpLAotICAgIG9rID0gd3JpdGUoUHJvdG8sICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57bmFtZSA9IFN0cnVjdE5hbWV9KSwKLSAgICBvayA9IHN0cnVjdF93cml0ZV9sb29wKFByb3RvLCBTdHJ1Y3REZWYsIEVsZW1zKSwKLSAgICBvayA9IHdyaXRlKFByb3RvLCBzdHJ1Y3RfZW5kKSwKLSAgICBvazsKKyAgICB7UHJvdG8xLCBva30gPSB3cml0ZShQcm90bzAsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57bmFtZSA9IFN0cnVjdE5hbWV9KSwKKyAgICB7UHJvdG8yLCBva30gPSBzdHJ1Y3Rfd3JpdGVfbG9vcChQcm90bzEsIFN0cnVjdERlZiwgRWxlbXMpLAorICAgIHtQcm90bzMsIG9rfSA9IHdyaXRlKFByb3RvMiwgc3RydWN0X2VuZCksCisgICAge1Byb3RvMywgb2t9OwogCiB3cml0ZShQcm90bywge3tzdHJ1Y3QsIHtNb2R1bGUsIFN0cnVjdHVyZU5hbWV9fSwgRGF0YX0pCiAgIHdoZW4gaXNfYXRvbShNb2R1bGUpLAogICAgICAgIGlzX2F0b20oU3RydWN0dXJlTmFtZSksCiAgICAgICAgZWxlbWVudCgxLCBEYXRhKSA9Oj0gU3RydWN0dXJlTmFtZSAtPgotICAgIFN0cnVjdFR5cGUgPSBNb2R1bGU6c3RydWN0X2luZm8oU3RydWN0dXJlTmFtZSksCiAgICAgd3JpdGUoUHJvdG8sIHtNb2R1bGU6c3RydWN0X2luZm8oU3RydWN0dXJlTmFtZSksIERhdGF9KTsKIAotd3JpdGUoUHJvdG8sIHt7bGlzdCwgVHlwZX0sIERhdGF9KQord3JpdGUoXywge3tzdHJ1Y3QsIHtNb2R1bGUsIFN0cnVjdHVyZU5hbWV9fSwgRGF0YX0pCisgIHdoZW4gaXNfYXRvbShNb2R1bGUpLAorICAgICAgIGlzX2F0b20oU3RydWN0dXJlTmFtZSkgLT4KKyAgICBlcmxhbmc6ZXJyb3Ioc3RydWN0X3VubWF0Y2hlZCwge3twcm92aWRlZCwgZWxlbWVudCgxLCBEYXRhKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtleHBlY3RlZCwgU3RydWN0dXJlTmFtZX19KTsKKword3JpdGUoUHJvdG8wLCB7e2xpc3QsIFR5cGV9LCBEYXRhfSkKICAgd2hlbiBpc19saXN0KERhdGEpIC0+Ci0gICAgb2sgPSB3cml0ZShQcm90bywKKyAgICB7UHJvdG8xLCBva30gPSB3cml0ZShQcm90bzAsCiAgICAgICAgICAgICAgICAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKICAgICAgICAgICAgICAgICAgZXR5cGUgPSB0ZXJtX3RvX3R5cGVpZChUeXBlKSwKICAgICAgICAgICAgICAgICAgc2l6ZSA9IGxlbmd0aChEYXRhKQogICAgICAgICAgICAgICAgIH0pLAotICAgIGxpc3RzOmZvcmVhY2goZnVuKEVsZW0pIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gd3JpdGUoUHJvdG8sIHtUeXBlLCBFbGVtfSkKLSAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgIERhdGEpLAotICAgIG9rID0gd3JpdGUoUHJvdG8sIGxpc3RfZW5kKSwKLSAgICBvazsKKyAgICBQcm90bzIgPSBsaXN0czpmb2xkbChmdW4oRWxlbSwgUHJvdG9JbikgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b091dCwgb2t9ID0gd3JpdGUoUHJvdG9Jbiwge1R5cGUsIEVsZW19KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhKSwKKyAgICB7UHJvdG8zLCBva30gPSB3cml0ZShQcm90bzIsIGxpc3RfZW5kKSwKKyAgICB7UHJvdG8zLCBva307CiAKLXdyaXRlKFByb3RvLCB7e21hcCwgS2V5VHlwZSwgVmFsVHlwZX0sIERhdGF9KSAtPgotICAgIG9rID0gd3JpdGUoUHJvdG8sCi0gICAgICAgICAgICAgICAjcHJvdG9jb2xfbWFwX2JlZ2luewotICAgICAgICAgICAgICAgICBrdHlwZSA9IHRlcm1fdG9fdHlwZWlkKEtleVR5cGUpLAotICAgICAgICAgICAgICAgICB2dHlwZSA9IHRlcm1fdG9fdHlwZWlkKFZhbFR5cGUpLAotICAgICAgICAgICAgICAgICBzaXplICA9IGRpY3Q6c2l6ZShEYXRhKQotICAgICAgICAgICAgICAgIH0pLAotICAgIGRpY3Q6Zm9sZChmdW4oS2V5RGF0YSwgVmFsRGF0YSwgX0FjYykgLT4KLSAgICAgICAgICAgICAgICAgICAgICBvayA9IHdyaXRlKFByb3RvLCB7S2V5VHlwZSwgS2V5RGF0YX0pLAotICAgICAgICAgICAgICAgICAgICAgIG9rID0gd3JpdGUoUHJvdG8sIHtWYWxUeXBlLCBWYWxEYXRhfSkKLSAgICAgICAgICAgICAgZW5kLAotICAgICAgICAgICAgICBfQWNjTyA9IG9rLAotICAgICAgICAgICAgICBEYXRhKSwKLSAgICBvayA9IHdyaXRlKFByb3RvLCBtYXBfZW5kKSwKLSAgICBvazsKK3dyaXRlKFByb3RvMCwge3ttYXAsIEtleVR5cGUsIFZhbFR5cGV9LCBEYXRhfSkgLT4KKyAgICB7UHJvdG8xLCBva30gPSB3cml0ZShQcm90bzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgI3Byb3RvY29sX21hcF9iZWdpbnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGt0eXBlID0gdGVybV90b190eXBlaWQoS2V5VHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2dHlwZSA9IHRlcm1fdG9fdHlwZWlkKFZhbFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgPSBkaWN0OnNpemUoRGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCisgICAgUHJvdG8yID0gZGljdDpmb2xkKGZ1bihLZXlEYXRhLCBWYWxEYXRhLCBQcm90b1MwKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b1MxLCBva30gPSB3cml0ZShQcm90b1MwLCB7S2V5VHlwZSwgS2V5RGF0YX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQcm90b1MyLCBva30gPSB3cml0ZShQcm90b1MxLCB7VmFsVHlwZSwgVmFsRGF0YX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvUzIKKyAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICBQcm90bzEsCisgICAgICAgICAgICAgICAgICAgICAgIERhdGEpLAorICAgIHtQcm90bzMsIG9rfSA9IHdyaXRlKFByb3RvMiwgbWFwX2VuZCksCisgICAge1Byb3RvMywgb2t9OwogCi13cml0ZShQcm90bywge3tzZXQsIFR5cGV9LCBEYXRhfSkgLT4KK3dyaXRlKFByb3RvMCwge3tzZXQsIFR5cGV9LCBEYXRhfSkgLT4KICAgICB0cnVlID0gc2V0czppc19zZXQoRGF0YSksCi0gICAgb2sgPSB3cml0ZShQcm90bywKLSAgICAgICAgICAgICAgICNwcm90b2NvbF9zZXRfYmVnaW57Ci0gICAgICAgICAgICAgICAgIGV0eXBlID0gdGVybV90b190eXBlaWQoVHlwZSksCi0gICAgICAgICAgICAgICAgIHNpemUgID0gc2V0czpzaXplKERhdGEpCi0gICAgICAgICAgICAgICAgfSksCi0gICAgc2V0czpmb2xkKGZ1bihFbGVtLCBfQWNjKSAtPgotICAgICAgICAgICAgICAgICAgICAgIG9rID0gd3JpdGUoUHJvdG8sIHtUeXBlLCBFbGVtfSkKLSAgICAgICAgICAgICAgZW5kLAotICAgICAgICAgICAgICBfQWNjMCA9IG9rLAotICAgICAgICAgICAgICBEYXRhKSwKLSAgICBvayA9IHdyaXRlKFByb3RvLCBzZXRfZW5kKSwKLSAgICBvazsKKyAgICB7UHJvdG8xLCBva30gPSB3cml0ZShQcm90bzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgI3Byb3RvY29sX3NldF9iZWdpbnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0eXBlID0gdGVybV90b190eXBlaWQoVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICA9IHNldHM6c2l6ZShEYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICBQcm90bzIgPSBzZXRzOmZvbGQoZnVuKEVsZW0sIFByb3RvSW4pIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvT3V0LCBva30gPSB3cml0ZShQcm90b0luLCB7VHlwZSwgRWxlbX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvT3V0CisgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8xLAorICAgICAgICAgICAgICAgICAgICAgICBEYXRhKSwKKyAgICB7UHJvdG8zLCBva30gPSB3cml0ZShQcm90bzIsIHNldF9lbmQpLAorICAgIHtQcm90bzMsIG9rfTsKIAotd3JpdGUoI3Byb3RvY29se21vZHVsZSA9IE1vZHVsZSwKLSAgICAgICAgICAgICAgICBkYXRhID0gTW9kdWxlRGF0YX0sIERhdGEpIC0+Ci0gICAgTW9kdWxlOndyaXRlKE1vZHVsZURhdGEsIERhdGEpLgord3JpdGUoUHJvdG8gPSAjcHJvdG9jb2x7bW9kdWxlID0gTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IE1vZHVsZURhdGF9LCBEYXRhKSAtPgorICAgIHtOZXdEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOndyaXRlKE1vZHVsZURhdGEsIERhdGEpLAorICAgIHtQcm90byNwcm90b2NvbHtkYXRhID0gTmV3RGF0YX0sIFJlc3VsdH0uCiAKLXN0cnVjdF93cml0ZV9sb29wKFByb3RvLCBbe0ZpZCwgVHlwZX0gfCBSZXN0U3RydWN0RGVmXSwgW0RhdGEgfCBSZXN0RGF0YV0pIC0+Ci0gICAgY2FzZSBEYXRhIG9mCi0gICAgICAgIHVuZGVmaW5lZCAtPgotICAgICAgICAgICAgJSBudWxsIGZpZWxkcyBhcmUgc2tpcHBlZCBpbiByZXNwb25zZQotICAgICAgICAgICAgc2tpcDsKLSAgICAgICAgXyAtPgotICAgICAgICAgICAgb2sgPSB3cml0ZShQcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2luewotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0ZXJtX3RvX3R5cGVpZChUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IEZpZAotICAgICAgICAgICAgICAgICAgICAgICAgfSksCi0gICAgICAgICAgICBvayA9IHdyaXRlKFByb3RvLCB7VHlwZSwgRGF0YX0pLAotICAgICAgICAgICAgb2sgPSB3cml0ZShQcm90bywgZmllbGRfZW5kKQotICAgIGVuZCwKLSAgICBzdHJ1Y3Rfd3JpdGVfbG9vcChQcm90bywgUmVzdFN0cnVjdERlZiwgUmVzdERhdGEpOworc3RydWN0X3dyaXRlX2xvb3AoUHJvdG8wLCBbe0ZpZCwgVHlwZX0gfCBSZXN0U3RydWN0RGVmXSwgW0RhdGEgfCBSZXN0RGF0YV0pIC0+CisgICAgTmV3UHJvdG8gPSBjYXNlIERhdGEgb2YKKyAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8wOyAlIG51bGwgZmllbGRzIGFyZSBza2lwcGVkIGluIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgXyAtPgorICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG8xLCBva30gPSB3cml0ZShQcm90bzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRlcm1fdG9fdHlwZWlkKFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBGaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHdyaXRlKFByb3RvMSwge1R5cGUsIERhdGF9KSwKKyAgICAgICAgICAgICAgICAgICAgICAge1Byb3RvMywgb2t9ID0gd3JpdGUoUHJvdG8yLCBmaWVsZF9lbmQpLAorICAgICAgICAgICAgICAgICAgICAgICBQcm90bzMKKyAgICAgICAgICAgICAgIGVuZCwKKyAgICBzdHJ1Y3Rfd3JpdGVfbG9vcChOZXdQcm90bywgUmVzdFN0cnVjdERlZiwgUmVzdERhdGEpOwogc3RydWN0X3dyaXRlX2xvb3AoUHJvdG8sIFtdLCBbXSkgLT4KLSAgICBvayA9IHdyaXRlKFByb3RvLCBmaWVsZF9zdG9wKSwKLSAgICBvay4KKyAgICB3cml0ZShQcm90bywgZmllbGRfc3RvcCkuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4ZmQzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybApAQCAtMCwwICsxLDI1OCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQpLgorCistYmVoYXZpb3VyKGdlbl9zZXJ2ZXIpLgorCislJSBBUEkKKy1leHBvcnQoWyBjYWxsLzMsCisgICAgICAgICAgZ2V0X3N0YXRzLzEsCisgICAgICAgICAgZ2V0X2FuZF9yZXNldF9zdGF0cy8xIF0pLgorCistZXhwb3J0KFsgc3RhcnRfbGluay82IF0pLgorCislJSBnZW5fc2VydmVyIGNhbGxiYWNrcworLWV4cG9ydChbIGluaXQvMSwKKyAgICAgICAgICBoYW5kbGVfY2FsbC8zLAorICAgICAgICAgIGhhbmRsZV9jYXN0LzIsCisgICAgICAgICAgaGFuZGxlX2luZm8vMiwKKyAgICAgICAgICB0ZXJtaW5hdGUvMiwKKyAgICAgICAgICBjb2RlX2NoYW5nZS8zIF0pLgorCistcmVjb3JkKCBzdGF0ZSwgeyBjbGllbnQgPSBuaWwsCisgICAgICAgICAgICAgICAgICBob3N0LAorICAgICAgICAgICAgICAgICAgcG9ydCwKKyAgICAgICAgICAgICAgICAgIHRocmlmdF9zdmMsCisgICAgICAgICAgICAgICAgICB0aHJpZnRfb3B0cywKKyAgICAgICAgICAgICAgICAgIHJlY29ubl9taW4sCisgICAgICAgICAgICAgICAgICByZWNvbm5fbWF4LAorICAgICAgICAgICAgICAgICAgcmVjb25uX3RpbWUgPSAwLAorICAgICAgICAgICAgICAgICAgb3BfY250X2RpY3QsCisgICAgICAgICAgICAgICAgICBvcF90aW1lX2RpY3QgfSApLgorCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CislJSBBUEkKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEZ1bmN0aW9uOiBzdGFydF9saW5rKCkgLT4ge29rLFBpZH0gfCBpZ25vcmUgfCB7ZXJyb3IsRXJyb3J9CislJSBEZXNjcmlwdGlvbjogU3RhcnRzIHRoZSBzZXJ2ZXIKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXJ0X2xpbmsoIEhvc3QsIFBvcnQsCisgICAgICAgICAgICBUaHJpZnRTdmMsIFRocmlmdE9wdHMsCisgICAgICAgICAgICBSZWNvbm5NaW4sIFJlY29ubk1heCApIC0+CisgIGdlbl9zZXJ2ZXI6c3RhcnRfbGluayggP01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbIEhvc3QsIFBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRTdmMsIFRocmlmdE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvbm5NaW4sIFJlY29ubk1heCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtdICkuCisKK2NhbGwoIFBpZCwgT3AsIEFyZ3MgKSAtPgorICBnZW5fc2VydmVyOmNhbGwoIFBpZCwgeyBjYWxsLCBPcCwgQXJncyB9ICkuCisKK2dldF9zdGF0cyggUGlkICkgLT4KKyAgZ2VuX3NlcnZlcjpjYWxsKCBQaWQsIGdldF9zdGF0cyApLgorCitnZXRfYW5kX3Jlc2V0X3N0YXRzKCBQaWQgKSAtPgorICBnZW5fc2VydmVyOmNhbGwoIFBpZCwgZ2V0X2FuZF9yZXNldF9zdGF0cyApLgorCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CislJSBnZW5fc2VydmVyIGNhbGxiYWNrcworJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBGdW5jdGlvbjogaW5pdChBcmdzKSAtPiB7b2ssIFN0YXRlfSB8CislJSAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFN0YXRlLCBUaW1lb3V0fSB8CislJSAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUgICAgICAgICAgICAgICB8CislJSAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29ufQorJSUgRGVzY3JpcHRpb246IFN0YXJ0IHRoZSBzZXJ2ZXIuCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbml0KCBbIEhvc3QsIFBvcnQsIFRTdmMsIFRPcHRzLCBSZWNvbm5NaW4sIFJlY29ubk1heCBdICkgLT4KKyAgcHJvY2Vzc19mbGFnKCB0cmFwX2V4aXQsIHRydWUgKSwKKworICBTdGF0ZSA9ICNzdGF0ZXsgaG9zdCAgICAgICAgID0gSG9zdCwKKyAgICAgICAgICAgICAgICAgIHBvcnQgICAgICAgICA9IFBvcnQsCisgICAgICAgICAgICAgICAgICB0aHJpZnRfc3ZjICAgPSBUU3ZjLAorICAgICAgICAgICAgICAgICAgdGhyaWZ0X29wdHMgID0gVE9wdHMsCisgICAgICAgICAgICAgICAgICByZWNvbm5fbWluICAgPSBSZWNvbm5NaW4sCisgICAgICAgICAgICAgICAgICByZWNvbm5fbWF4ICAgPSBSZWNvbm5NYXgsCisgICAgICAgICAgICAgICAgICBvcF9jbnRfZGljdCAgPSBkaWN0Om5ldygpLAorICAgICAgICAgICAgICAgICAgb3BfdGltZV9kaWN0ID0gZGljdDpuZXcoKSB9LAorCisgIHsgb2ssIHRyeV9jb25uZWN0KCBTdGF0ZSApIH0uCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEZ1bmN0aW9uOiAlJSBoYW5kbGVfY2FsbChSZXF1ZXN0LCBGcm9tLCBTdGF0ZSkgLT4ge3JlcGx5LCBSZXBseSwgU3RhdGV9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JlcGx5LCBSZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vcmVwbHksIFN0YXRlfSB8CislJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBSZXBseSwgU3RhdGV9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9CislJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FsbCBtZXNzYWdlcworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraGFuZGxlX2NhbGwoIHsgY2FsbCwgT3AsIF8gfSwKKyAgICAgICAgICAgICBfRnJvbSwKKyAgICAgICAgICAgICBTdGF0ZSA9ICNzdGF0ZXsgY2xpZW50ID0gbmlsIH0gKSAtPgorICB7IHJlcGx5LCB7IGVycm9yLCBub2Nvbm4gfSwgaW5jcl9zdGF0cyggT3AsICJmYWlsZmFzdCIsIDEsIFN0YXRlICkgfTsKKworaGFuZGxlX2NhbGwoIHsgY2FsbCwgT3AsIEFyZ3MgfSwKKyAgICAgICAgICAgICBfRnJvbSwKKyAgICAgICAgICAgICBTdGF0ZT0jc3RhdGV7IGNsaWVudCA9IENsaWVudCB9ICkgLT4KKworICBUaW1lciA9IHRpbWVyX2Z1bigpLAorICBSZXN1bHQgPSAoIGNhdGNoIHRocmlmdF9jbGllbnQ6Y2FsbCggQ2xpZW50LCBPcCwgQXJncykgKSwKKyAgVGltZSA9IFRpbWVyKCksCisKKyAgY2FzZSBSZXN1bHQgb2YKKyAgICB7IEMsIHsgb2ssIFJlcGx5IH0gfSAtPgorICAgICAgUyA9IGluY3Jfc3RhdHMoIE9wLCAic3VjY2VzcyIsIFRpbWUsIFN0YXRlI3N0YXRleyBjbGllbnQgPSBDIH0gKSwKKyAgICAgIHsgcmVwbHksIHtvaywgUmVwbHkgfSwgUyB9OworICAgIHsgXywgeyBFLCBNc2cgfSB9IHdoZW4gRSA9PSBlcnJvcjsgRSA9PSBleGNlcHRpb24gLT4KKyAgICAgIFMgPSBpbmNyX3N0YXRzKCBPcCwgImVycm9yIiwgVGltZSwgdHJ5X2Nvbm5lY3QoIFN0YXRlICkgKSwKKyAgICAgIHsgcmVwbHksIHsgRSwgTXNnIH0sIFMgfTsKKyAgICBPdGhlciAtPgorICAgICAgUyA9IGluY3Jfc3RhdHMoIE9wLCAiZXJyb3IiLCBUaW1lLCB0cnlfY29ubmVjdCggU3RhdGUgKSApLAorICAgICAgeyByZXBseSwgT3RoZXIsIFMgfQorICBlbmQ7CisKK2hhbmRsZV9jYWxsKCBnZXRfc3RhdHMsCisgICAgICAgICAgICAgX0Zyb20sCisgICAgICAgICAgICAgU3RhdGUgPSAjc3RhdGV7fSApIC0+CisgIHsgcmVwbHksIHN0YXRzKCBTdGF0ZSApLCBTdGF0ZSB9OworCitoYW5kbGVfY2FsbCggZ2V0X2FuZF9yZXNldF9zdGF0cywKKyAgICAgICAgICAgICBfRnJvbSwKKyAgICAgICAgICAgICBTdGF0ZSA9ICNzdGF0ZXt9ICkgLT4KKyAgeyByZXBseSwgc3RhdHMoIFN0YXRlICksIHJlc2V0X3N0YXRzKCBTdGF0ZSApIH0uCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEZ1bmN0aW9uOiBoYW5kbGVfY2FzdChNc2csIFN0YXRlKSAtPiB7bm9yZXBseSwgU3RhdGV9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKKyUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KKyUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYXN0IG1lc3NhZ2VzCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYW5kbGVfY2FzdCggX01zZywgU3RhdGUgKSAtPgorICB7IG5vcmVwbHksIFN0YXRlIH0uCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEZ1bmN0aW9uOiBoYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZSkgLT4ge25vcmVwbHksIFN0YXRlfSB8CislJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAorJSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KKyUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBhbGwgbm9uIGNhbGwvY2FzdCBtZXNzYWdlcworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraGFuZGxlX2luZm8oIHRyeV9jb25uZWN0LCBTdGF0ZSApIC0+CisgIHsgbm9yZXBseSwgdHJ5X2Nvbm5lY3QoIFN0YXRlICkgfTsKKworaGFuZGxlX2luZm8oIF9JbmZvLCBTdGF0ZSApIC0+CisgIHsgbm9yZXBseSwgU3RhdGUgfS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IHRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiB2b2lkKCkKKyUlIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhIGdlbl9zZXJ2ZXIgd2hlbiBpdCBpcyBhYm91dCB0bworJSUgdGVybWluYXRlLiBJdCBzaG91bGQgYmUgdGhlIG9wcG9zaXRlIG9mIE1vZHVsZTppbml0LzEgYW5kIGRvIGFueSBuZWNlc3NhcnkKKyUlIGNsZWFuaW5nIHVwLiBXaGVuIGl0IHJldHVybnMsIHRoZSBnZW5fc2VydmVyIHRlcm1pbmF0ZXMgd2l0aCBSZWFzb24uCislJSBUaGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZXJtaW5hdGUoIF9SZWFzb24sICNzdGF0ZXsgY2xpZW50ID0gQ2xpZW50IH0gKSAtPgorICB0aHJpZnRfY2xpZW50OmNsb3NlKCBDbGllbnQgKSwKKyAgb2suCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEZ1bmM6IGNvZGVfY2hhbmdlKE9sZFZzbiwgU3RhdGUsIEV4dHJhKSAtPiB7b2ssIE5ld1N0YXRlfQorJSUgRGVzY3JpcHRpb246IENvbnZlcnQgcHJvY2VzcyBzdGF0ZSB3aGVuIGNvZGUgaXMgY2hhbmdlZAorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY29kZV9jaGFuZ2UoIF9PbGRWc24sIFN0YXRlLCBfRXh0cmEgKSAtPgorICB7IG9rLCBTdGF0ZSB9LgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSUgSW50ZXJuYWwgZnVuY3Rpb25zCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0cnlfY29ubmVjdCggU3RhdGUgPSAjc3RhdGV7IGNsaWVudCAgICAgID0gT2xkQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ICAgICAgICA9IEhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgICAgICAgID0gUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3N2YyAgPSBUU3ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfb3B0cyA9IFRPcHRzIH0gKSAtPgorCisgIGNhc2UgT2xkQ2xpZW50IG9mCisgICAgbmlsIC0+IG9rOworICAgIF8gICAtPiAoIGNhdGNoIHRocmlmdF9jbGllbnQ6Y2xvc2UoIE9sZENsaWVudCApICkKKyAgZW5kLAorCisgIGNhc2UgY2F0Y2ggdGhyaWZ0X2NsaWVudF91dGlsOm5ldyggSG9zdCwgUG9ydCwgVFN2YywgVE9wdHMgKSBvZgorICAgIHsgb2ssIENsaWVudCB9IC0+CisgICAgICBTdGF0ZSNzdGF0ZXsgY2xpZW50ID0gQ2xpZW50LCByZWNvbm5fdGltZSA9IDAgfTsKKyAgICB7IEUsIE1zZyB9IHdoZW4gRSA9PSBlcnJvcjsgRSA9PSBleGNlcHRpb24gLT4KKyAgICAgIFJlY29ublRpbWUgPSByZWNvbm5fdGltZSggU3RhdGUgKSwKKyAgICAgIGVycm9yX2xvZ2dlcjplcnJvcl9tc2coICJbfnddIH53IGNvbm5lY3QgZmFpbGVkICh+dyksIHRyeWluZyBhZ2FpbiBpbiB+dyBtc35uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgc2VsZigpLCBUU3ZjLCBNc2csIFJlY29ublRpbWUgXSApLAorICAgICAgZXJsYW5nOnNlbmRfYWZ0ZXIoIFJlY29ublRpbWUsIHNlbGYoKSwgdHJ5X2Nvbm5lY3QgKSwKKyAgICAgIFN0YXRlI3N0YXRleyBjbGllbnQgPSBuaWwsIHJlY29ubl90aW1lID0gUmVjb25uVGltZSB9CisgIGVuZC4KKworCityZWNvbm5fdGltZSggI3N0YXRleyByZWNvbm5fbWluID0gUmVjb25uTWluLCByZWNvbm5fdGltZSA9IDAgfSApIC0+CisgIFJlY29ubk1pbjsKK3JlY29ubl90aW1lKCAjc3RhdGV7IHJlY29ubl9tYXggPSBSZWNvbm5NYXgsIHJlY29ubl90aW1lID0gUmVjb25uTWF4IH0gKSAtPgorICBSZWNvbm5NYXg7CityZWNvbm5fdGltZSggI3N0YXRleyByZWNvbm5fbWF4ID0gUmVjb25uTWF4LCByZWNvbm5fdGltZSA9IFIgfSApIC0+CisgIEJhY2tvZmYgPSAyICogUiwKKyAgY2FzZSBCYWNrb2ZmID4gUmVjb25uTWF4IG9mCisgICAgdHJ1ZSAgLT4gUmVjb25uTWF4OworICAgIGZhbHNlIC0+IEJhY2tvZmYKKyAgZW5kLgorCistaWZkZWYodGltZV9jb3JyZWN0aW9uKS4KK3RpbWVyX2Z1bigpIC0+CisgIFQxID0gZXJsYW5nOm1vbm90b25pY190aW1lKCksCisgIGZ1bigpIC0+CisgICAgVDIgPSBlcmxhbmc6bW9ub3RvbmljX3RpbWUoKSwKKyAgICBlcmxhbmc6Y29udmVydF90aW1lX3VuaXQoVDIgLSBUMSwgbmF0aXZlLCBtaWNyb19zZWNvbmRzKQorICBlbmQuCistZWxzZS4KK3RpbWVyX2Z1bigpIC0+CisgIFQxID0gZXJsYW5nOnRpbWVzdGFtcCgpLAorICBmdW4oKSAtPgorICAgIFQyID0gZXJsYW5nOnRpbWVzdGFtcCgpLAorICAgIHRpbWVyOm5vd19kaWZmKFQyLCBUMSkKKyAgZW5kLgorLWVuZGlmLgorCitpbmNyX3N0YXRzKCBPcCwgUmVzdWx0LCBUaW1lLAorICAgICAgICAgICAgU3RhdGUgPSAjc3RhdGV7IG9wX2NudF9kaWN0ICA9IE9wQ250RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF90aW1lX2RpY3QgPSBPcFRpbWVEaWN0IH0gKSAtPgorICBLZXkgPSBsaXN0czpmbGF0dGVuKCBbIGF0b21fdG9fbGlzdCggT3AgKSwgWyAiXyIgfCBSZXN1bHQgXSBdICksCisgIFN0YXRlI3N0YXRleyBvcF9jbnRfZGljdCAgPSBkaWN0OnVwZGF0ZV9jb3VudGVyKCBLZXksIDEsIE9wQ250RGljdCApLAorICAgICAgICAgICAgICAgb3BfdGltZV9kaWN0ID0gZGljdDp1cGRhdGVfY291bnRlciggS2V5LCBUaW1lLCBPcFRpbWVEaWN0ICkgfS4KKworCitzdGF0cyggI3N0YXRleyB0aHJpZnRfc3ZjICAgPSBUU3ZjLAorICAgICAgICAgICAgICAgb3BfY250X2RpY3QgID0gT3BDbnREaWN0LAorICAgICAgICAgICAgICAgb3BfdGltZV9kaWN0ID0gT3BUaW1lRGljdCB9ICkgLT4KKyAgU3ZjID0gYXRvbV90b19saXN0KFRTdmMpLAorCisgIEYgPSBmdW4oIEtleSwgQ291bnQsIFN0YXRzICkgLT4KKyAgICAgICAgTmFtZSA9IGxpc3RzOmZsYXR0ZW4oIFsgU3ZjLCBbICJfIiB8IEtleSBdIF0gKSwKKyAgICAgICAgTWljcm9zID0gZGljdDpmZXRjaCggS2V5LCBPcFRpbWVEaWN0ICksCisgICAgICAgIFsgeyBOYW1lLCBDb3VudCwgTWljcm9zIH0gfCBTdGF0cyBdCisgICAgICBlbmQsCisKKyAgZGljdDpmb2xkKCBGLCBbXSwgT3BDbnREaWN0ICkuCisKK3Jlc2V0X3N0YXRzKCBTdGF0ZSA9ICNzdGF0ZXt9ICkgLT4KKyAgU3RhdGUjc3RhdGV7IG9wX2NudF9kaWN0ID0gZGljdDpuZXcoKSwgb3BfdGltZV9kaWN0ID0gZGljdDpuZXcoKSB9LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3NlcnZlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfc2VydmVyLmVybAppbmRleCA1ZDAwMTJiLi41MDEyZTE2IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfc2VydmVyLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfc2VydmVyLmVybApAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0KICAgICBlbmQ7CiAKLWhhbmRsZV9pbmZvKHtpbmV0X2FzeW5jLCBMaXN0ZW5Tb2NrZXQsIFJlZiwgRXJyb3J9LCBTdGF0ZSkgLT4KK2hhbmRsZV9pbmZvKHtpbmV0X2FzeW5jLCBfTGlzdGVuU29ja2V0LCBfUmVmLCBFcnJvcn0sIFN0YXRlKSAtPgogICAgIGVycm9yX2xvZ2dlcjplcnJvcl9tc2coIkVycm9yIGluIGFjY2VwdG9yOiB+cH5uIiwgW0Vycm9yXSksCiAgICAge3N0b3AsIEVycm9yLCBTdGF0ZX07CiAKQEAgLTE3Nyw3ICsxNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFNvY2tldFRyYW5zcG9ydH0gPSB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0KSwKICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZmZXJlZFRyYW5zcG9ydH0gPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpLAogICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFByb3RvY29sfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KEJ1ZmZlcmVkVHJhbnNwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAge29rLCBQcm90b2NvbCwgUHJvdG9jb2x9CisgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9CiAgICAgICAgICAgICAgICBlbmQsCiAKICAgICBzcGF3bih0aHJpZnRfcHJvY2Vzc29yLCBpbml0LCBbe1NlcnZlciwgUHJvdG9HZW4sIFNlcnZpY2UsIEhhbmRsZXJ9XSkuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwKaW5kZXggNjc5NGU2My4uNGUzYzA1MiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfc2VydmVyLmVybApAQCAtMjEsMTIgKzIxLDE5IEBACiAKIC1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCiAKLS1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgorLWluY2x1ZGUgKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgogCi0tZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAotICAgICAgICAgaGFuZGxlX2luZm8vMl0pLgorLWlmZGVmKFRFU1QpLgorICAgIC1jb21waWxlKGV4cG9ydF9hbGwpLgorICAgIC1leHBvcnRfcmVjb3JkcyhbdGhyaWZ0X3NvY2tldF9zZXJ2ZXJdKS4KKy1lbHNlLgorICAgIC1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgogCi0tZXhwb3J0KFthY2NlcHRvcl9sb29wLzFdKS4KKyAgICAtZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAorICAgICAgICAgICAgIGhhbmRsZV9pbmZvLzJdKS4KKworICAgIC1leHBvcnQoW2FjY2VwdG9yX2xvb3AvMV0pLgorLWVuZGlmLgogCiAtcmVjb3JkKHRocmlmdF9zb2NrZXRfc2VydmVyLAogICAgICAgICB7cG9ydCwKQEAgLTM4LDcgKzQ1LDEwIEBACiAgICAgICAgICBsaXN0ZW49bnVsbCwKICAgICAgICAgIGFjY2VwdG9yPW51bGwsCiAgICAgICAgICBzb2NrZXRfb3B0cz1be3JlY3ZfdGltZW91dCwgNTAwfV0sCi0gICAgICAgICBmcmFtZWQ9ZmFsc2UKKyAgICAgICAgIHByb3RvY29sPWJpbmFyeSwKKyAgICAgICAgIGZyYW1lZD1mYWxzZSwKKyAgICAgICAgIHNzbHRyYW5zcG9ydD1mYWxzZSwKKyAgICAgICAgIHNzbG9wdGlvbnM9W10KICAgICAgICAgfSkuCiAKIHN0YXJ0KFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcnt9KSAtPgpAQCAtOTEsMTAgKzEwMSw0NiBAQAogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7aXA9UGFyc2VkSXB9KTsKIHBhcnNlX29wdGlvbnMoW3tzb2NrZXRfb3B0cywgTH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChMKSwgbGVuZ3RoKEwpID4gMCAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c29ja2V0X29wdHM9TH0pOwotcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIEhhbmRsZXJ9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IGFuIGVycm9yIGhhbmRsZXIgbXVzdCBiZSBkZWZpbmVkLiIpOworcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0fSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19saXN0KFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VIYW5kbGVyTWFwID0KKyAgICBjYXNlIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVyLmhhbmRsZXIgb2YKKyAgICAgICAgdW5kZWZpbmVkIC0+CisgICAgICAgICAgICBsaXN0czpmb2xkbCgKKyAgICAgICAgICAgICAgICBmdW4gKHtTZXJ2aWNlTmFtZSwgU2VydmljZUhhbmRsZXJ9LCBBY2MpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTmFtZSksIGlzX2F0b20oU2VydmljZUhhbmRsZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VIYW5kbGVyLCBBY2MpOworICAgICAgICAgICAgICAgICAgICAoXywgX0FjYykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICAgICAgICAgICAgICBlbmQsIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpuZXcoKSwgU2VydmljZUhhbmRsZXJQcm9wZXJ0eUxpc3QpOworICAgICAgICBfIC0+IHRocm93KCJFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBoYW5kbGVyIG9wdGlvbi4iKQorICAgIGVuZCwKKyAgICBjYXNlIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKD9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgU2VydmljZUhhbmRsZXJNYXApIG9mCisgICAgICAgIHtvaywgX0Vycm9ySGFuZGxlcn0gLT4gcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntoYW5kbGVyPVNlcnZpY2VIYW5kbGVyTWFwfSk7CisgICAgICAgIGVycm9yIC0+IHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICBlbmQ7CitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgSGFuZGxlcn0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuaGFuZGxlciA9PSB1bmRlZmluZWQsIGlzX2F0b20oSGFuZGxlcikgLT4KICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2hhbmRsZXI9SGFuZGxlcn0pOwotcGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFNlcnZpY2V9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IG9uZSBzZXJ2aWNlIG1vZHVsZSBtdXN0IGJlIGRlZmluZWQuIik7CitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgU2VydmljZU1vZHVsZVByb3BlcnR5TGlzdH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VNb2R1bGVNYXAgPQorICAgIGNhc2UgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuc2VydmljZSBvZgorICAgICAgICB1bmRlZmluZWQgLT4KKyAgICAgICAgICAgIGxpc3RzOmZvbGRsKAorICAgICAgICAgICAgICAgIGZ1biAoe1NlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlfSwgQWNjKSB3aGVuIGlzX2xpc3QoU2VydmljZU5hbWUpLCBpc19hdG9tKFNlcnZpY2VNb2R1bGUpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGUsIEFjYyk7CisgICAgICAgICAgICAgICAgICAgIChfLCBfQWNjKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3coIlRoZSBzZXJ2aWNlIG9wdGlvbiBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMuIEl0IHNob3VsZCBiZSBhIGtpbmQgb2YgW3tTZXJpY2VOYW1lOjpsaXN0KCksIFNlcnZpY2VNb2R1bGU6OmF0b20oKX0sIC4uLl0iKQorICAgICAgICAgICAgICAgIGVuZCwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOm5ldygpLCBTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KTsKKyAgICAgICAgXyAtPiB0aHJvdygiRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgc2VydmljZSBvcHRpb24uIikKKyAgICBlbmQsCisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntzZXJ2aWNlPVNlcnZpY2VNb2R1bGVNYXB9KTsKK3BhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBTZXJ2aWNlfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlci5zZXJ2aWNlID09IHVuZGVmaW5lZCwgaXNfYXRvbShTZXJ2aWNlKSAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c2VydmljZT1TZXJ2aWNlfSk7CisKIHBhcnNlX29wdGlvbnMoW3ttYXgsIE1heH0gfCBSZXN0XSwgU3RhdGUpIC0+CiAgICAgTWF4SW50ID0gY2FzZSBNYXggb2YKICAgICAgICAgICAgICAgICAgTWF4IHdoZW4gaXNfbGlzdChNYXgpIC0+CkBAIC0xMDMsOCArMTQ5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICBNYXgKICAgICAgICAgICAgICBlbmQsCiAgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcnttYXg9TWF4SW50fSk7CisKK3BhcnNlX29wdGlvbnMoW3twcm90b2NvbCwgUHJvdG99IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2F0b20oUHJvdG8pIC0+CisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntwcm90b2NvbD1Qcm90b30pOworCiBwYXJzZV9vcHRpb25zKFt7ZnJhbWVkLCBGcmFtZWR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oRnJhbWVkKSAtPgotICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pLgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pOworCitwYXJzZV9vcHRpb25zKFt7c3NsdHJhbnNwb3J0LCBTU0xUcmFuc3BvcnR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oU1NMVHJhbnNwb3J0KSAtPgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c3NsdHJhbnNwb3J0PVNTTFRyYW5zcG9ydH0pOworcGFyc2Vfb3B0aW9ucyhbe3NzbG9wdGlvbnMsIFNTTE9wdGlvbnN9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2xpc3QoU1NMT3B0aW9ucykgLT4KKyAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3NzbG9wdGlvbnM9U1NMT3B0aW9uc30pLgogCiBzdGFydF9zZXJ2ZXIoU3RhdGU9I3RocmlmdF9zb2NrZXRfc2VydmVye25hbWU9TmFtZX0pIC0+CiAgICAgY2FzZSBOYW1lIG9mCkBAIC0xNjYsMjkgKzIyMSwzNSBAQAogbmV3X2FjY2VwdG9yKFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcnttYXg9MH0pIC0+CiAgICAgZXJyb3JfbG9nZ2VyOmVycm9yX21zZygiTm90IGFjY2VwdGluZyBuZXcgY29ubmVjdGlvbnMiKSwKICAgICBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcnthY2NlcHRvcj1udWxsfTsKLW5ld19hY2NlcHRvcihTdGF0ZT0jdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7YWNjZXB0b3I9T2xkUGlkLCBsaXN0ZW49TGlzdGVuLAorbmV3X2FjY2VwdG9yKFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcntsaXN0ZW49TGlzdGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlPVNlcnZpY2UsIGhhbmRsZXI9SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X29wdHM9T3B0cywgZnJhbWVkPUZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfb3B0cz1PcHRzLCBmcmFtZWQ9RnJhbWVkLCBwcm90b2NvbD1Qcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsdHJhbnNwb3J0PVNzbFRyYW5zcG9ydCwgc3Nsb3B0aW9ucz1Tc2xPcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgLT4KICAgICBQaWQgPSBwcm9jX2xpYjpzcGF3bl9saW5rKD9NT0RVTEUsIGFjY2VwdG9yX2xvb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWR9XSksCi0lJSAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJTcGF3bmluZyBuZXcgYWNjZXB0b3I6IH5wID0+IH5wIiwgW09sZFBpZCwgUGlkXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWQsIFNzbFRyYW5zcG9ydCwgU3NsT3B0aW9ucywgUHJvdG99XSksCiAgICAgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7YWNjZXB0b3I9UGlkfS4KIAotYWNjZXB0b3JfbG9vcCh7U2VydmVyLCBMaXN0ZW4sIFNlcnZpY2UsIEhhbmRsZXIsIFNvY2tldE9wdHMsIEZyYW1lZH0pCithY2NlcHRvcl9sb29wKHtTZXJ2ZXIsIExpc3RlbiwgU2VydmljZSwgSGFuZGxlciwgU29ja2V0T3B0cywgRnJhbWVkLCBTc2xUcmFuc3BvcnQsIFNzbE9wdGlvbnMsIFByb3RvfSkKICAgd2hlbiBpc19waWQoU2VydmVyKSwgaXNfbGlzdChTb2NrZXRPcHRzKSAtPgogICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDphY2NlcHQoTGlzdGVuKSBvZiAlIGluZmluaXRlIHRpbWVvdXQKICAgICAgICAge29rLCBTb2NrZXR9IC0+CiAgICAgICAgICAgICBnZW5fc2VydmVyOmNhc3QoU2VydmVyLCB7YWNjZXB0ZWQsIHNlbGYoKX0pLAogICAgICAgICAgICAgUHJvdG9HZW4gPSBmdW4oKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja2V0VHJhbnNwb3J0fSAgID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ICAgICAgICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyYW1lZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFNvY2tldFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFByb3RvY29sfSAgICAgICAgICA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBJUHJvdD1Qcm90b2NvbCwgT1Byb3Q9UHJvdG9jb2x9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrZXRUcmFuc3BvcnR9ID0gY2FzZSBTc2xUcmFuc3BvcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cywgU3NsT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIFNvY2tldE9wdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAgICAgICA9IGNhc2UgRnJhbWVkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9ICAgICAgICA9IGNhc2UgUHJvdG8gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3QgLT4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uIC0+IHRocmlmdF9qc29uX3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyAtPiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICAgICAgICAgIHRocmlmdF9wcm9jZXNzb3I6aW5pdCh7U2VydmVyLCBQcm90b0dlbiwgU2VydmljZSwgSGFuZGxlcn0pOwogICAgICAgICB7ZXJyb3IsIGNsb3NlZH0gLT4KQEAgLTIxNSw4ICsyNzYsMTEgQEAKIGhhbmRsZV9jYXN0KHN0b3AsIFN0YXRlKSAtPgogICAgIHtzdG9wLCBub3JtYWwsIFN0YXRlfS4KIAotdGVybWluYXRlKF9SZWFzb24sICN0aHJpZnRfc29ja2V0X3NlcnZlcntsaXN0ZW49TGlzdGVuLCBwb3J0PVBvcnR9KSAtPgordGVybWluYXRlKFJlYXNvbiwgI3RocmlmdF9zb2NrZXRfc2VydmVye2xpc3Rlbj1MaXN0ZW4sIHBvcnQ9UG9ydH0pIC0+CiAgICAgZ2VuX3RjcDpjbG9zZShMaXN0ZW4pLAorICAgIHtiYWNrdHJhY2UsIEJ0fSA9IGVybGFuZzpwcm9jZXNzX2luZm8oc2VsZigpLCBiYWNrdHJhY2UpLAorICAgIGVycm9yX2xvZ2dlcjplcnJvcl9yZXBvcnQoez9NT0RVTEUsID9MSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjaGlsZF9lcnJvciwgUmVhc29uLCBCdH19KSwKICAgICBjYXNlIFBvcnQgPCAxMDI0IG9mCiAgICAgICAgIHRydWUgLT4KICAgICAgICAgICAgIGNhdGNoIGZkc3J2OnN0b3AoKSwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybAppbmRleCBmY2Q2OTQ0Li5mYTEwZWQwIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCkBAIC0yMSw5OSArMjEsMTU2IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLS1leHBvcnQoW25ldy8xLAotICAgICAgICAgbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzEsCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgdHJhbnNwb3J0IGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLSAgICAgICAgIG5ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLS1yZWNvcmQoZGF0YSwge3NvY2tldCwKLSAgICAgICAgICAgICAgIHJlY3ZfdGltZW91dD1pbmZpbml0eX0pLgorLXJlY29yZCh0X3NvY2tldCwgeworICBzb2NrZXQsCisgIHJlY3ZfdGltZW91dD02MDAwMCwKKyAgYnVmZmVyID0gW10KK30pLgogCi1uZXcoU29ja2V0KSAtPgotICAgIG5ldyhTb2NrZXQsIFtdKS4KKy10eXBlIHN0YXRlKCkgOjogI3Rfc29ja2V0e30uCisKKworLXNwZWMgbmV3KFNvY2tldDo6YW55KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KFNvY2tldCkgLT4gbmV3KFNvY2tldCwgW10pLgorCistc3BlYyBuZXcoU29ja2V0OjphbnkoKSwgT3B0czo6bGlzdCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCiAKIG5ldyhTb2NrZXQsIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRzKSAtPgotICAgIFN0YXRlID0KLSAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2gocmVjdl90aW1lb3V0LCAxLCBPcHRzKSBvZgotICAgICAgICAgICAge3ZhbHVlLCB7cmVjdl90aW1lb3V0LCBUaW1lb3V0fX0KLSAgICAgICAgICAgIHdoZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KLSAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH07Ci0gICAgICAgICAgICBfIC0+Ci0gICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNvY2tldH0KLSAgICAgICAgZW5kLAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KLQotJSUgRGF0YSA6OiBpb2xpc3QoKQotd3JpdGUoI2RhdGF7c29ja2V0ID0gU29ja2V0fSwgRGF0YSkgLT4KLSAgICBnZW5fdGNwOnNlbmQoU29ja2V0LCBEYXRhKS4KLQotcmVhZCgjZGF0YXtzb2NrZXQ9U29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH0sIExlbikKLSAgd2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+Ci0gICAgY2FzZSBnZW5fdGNwOnJlY3YoU29ja2V0LCBMZW4sIFRpbWVvdXQpIG9mCi0gICAgICAgIEVyciA9IHtlcnJvciwgdGltZW91dH0gLT4KLSAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygicmVhZCB0aW1lb3V0OiBwZWVyIGNvbm4gfnAiLCBbaW5ldDpwZWVybmFtZShTb2NrZXQpXSksCi0gICAgICAgICAgICBnZW5fdGNwOmNsb3NlKFNvY2tldCksCi0gICAgICAgICAgICBFcnI7Ci0gICAgICAgIERhdGEgLT4gRGF0YQotICAgIGVuZC4KLQotJSUgV2UgY2FuJ3QgcmVhbGx5IGZsdXNoIC0gZXZlcnl0aGluZyBpcyBmbHVzaGVkIHdoZW4gd2Ugd3JpdGUKLWZsdXNoKF8pIC0+Ci0gICAgb2suCi0KLWNsb3NlKCNkYXRhe3NvY2tldCA9IFNvY2tldH0pIC0+Ci0gICAgZ2VuX3RjcDpjbG9zZShTb2NrZXQpLgorICBTdGF0ZSA9IHBhcnNlX29wdHMoT3B0cywgI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldH0pLAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCiAKIAotJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorcGFyc2Vfb3B0cyhbe3JlY3ZfdGltZW91dCwgVGltZW91dH18UmVzdF0sIFN0YXRlKQord2hlbiBpc19pbnRlZ2VyKFRpbWVvdXQpLCBUaW1lb3V0ID4gMCAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3Rfc29ja2V0e3JlY3ZfdGltZW91dCA9IFRpbWVvdXR9KTsKK3BhcnNlX29wdHMoW3tyZWN2X3RpbWVvdXQsIGluZmluaXR5fXxSZXN0XSwgU3RhdGUpIC0+CisgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9zb2NrZXR7cmVjdl90aW1lb3V0ID0gaW5maW5pdHl9KTsKK3BhcnNlX29wdHMoW10sIFN0YXRlKSAtPgorICBTdGF0ZS4KIAogCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKworcmVhZChTdGF0ZSA9ICN0X3NvY2tldHtidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4KKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBMZW4pLAorICAgICAge1N0YXRlI3Rfc29ja2V0e2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgXyAtPiByZWN2KFN0YXRlLCBMZW4pCisgIGVuZC4KKworcmVjdihTdGF0ZSA9ICN0X3NvY2tldHtzb2NrZXQgPSBTb2NrZXQsIGJ1ZmZlciA9IEJ1Zn0sIExlbikgLT4KKyAgY2FzZSBnZW5fdGNwOnJlY3YoU29ja2V0LCAwLCBTdGF0ZSN0X3NvY2tldC5yZWN2X3RpbWVvdXQpIG9mCisgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgIGdlbl90Y3A6Y2xvc2UoU29ja2V0KSwKKyAgICAgIHtTdGF0ZSwge2Vycm9yLCBFcnJvcn19OworICAgIHtvaywgRGF0YX0gLT4KKyAgICAgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoW0J1ZiwgRGF0YV0pLAorICAgICAgR2l2ZSA9IG1pbihpb2xpc3Rfc2l6ZShCaW5hcnkpLCBMZW4pLAorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIEdpdmUpLAorICAgICAge1N0YXRlI3Rfc29ja2V0e2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX0KKyAgZW5kLgorCisKK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9zb2NrZXR7YnVmZmVyID0gQnVmfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmKSwKKyAgY2FzZSBpb2xpc3Rfc2l6ZShCaW5hcnkpIG9mCisgICAgWCB3aGVuIFggPj0gTGVuIC0+IHJlYWQoU3RhdGUsIExlbik7CisgICAgWCAtPgorICAgICAgY2FzZSBnZW5fdGNwOnJlY3YoU3RhdGUjdF9zb2NrZXQuc29ja2V0LCBMZW4gLSBYLCBTdGF0ZSN0X3NvY2tldC5yZWN2X3RpbWVvdXQpIG9mCisgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICAgICAgZ2VuX3RjcDpjbG9zZShTdGF0ZSN0X3NvY2tldC5zb2NrZXQpLAorICAgICAgICAgIHtTdGF0ZSwge2Vycm9yLCBFcnJvcn19OworICAgICAgICB7b2ssIERhdGF9IC0+CisgICAgICAgICAge1N0YXRlI3Rfc29ja2V0e2J1ZmZlciA9IFtdfSwge29rLCA8PEJpbmFyeS9iaW5hcnksIERhdGEvYmluYXJ5Pj59fQorICAgICAgZW5kCisgIGVuZC4KKworCit3cml0ZShTdGF0ZSA9ICN0X3NvY2tldHtzb2NrZXQgPSBTb2NrZXR9LCBEYXRhKSAtPgorICBjYXNlIGdlbl90Y3A6c2VuZChTb2NrZXQsIERhdGEpIG9mCisgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgIGdlbl90Y3A6Y2xvc2UoU29ja2V0KSwKKyAgICAgIHtTdGF0ZSwge2Vycm9yLCBFcnJvcn19OworICAgIG9rIC0+IHtTdGF0ZSwgb2t9CisgIGVuZC4KKworCitmbHVzaChTdGF0ZSkgLT4KKyAge1N0YXRlI3Rfc29ja2V0e2J1ZmZlciA9IFtdfSwgb2t9LgorCisKK2Nsb3NlKFN0YXRlID0gI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldH0pIC0+CisgIHtTdGF0ZSwgZ2VuX3RjcDpjbG9zZShTb2NrZXQpfS4KKworCislJSBsZWdhY3kgYXBpLiBsZWZ0IGZvciBjb21wYXRpYmlsaXR5CisKICUlIFRoZSBmb2xsb3dpbmcgImxvY2FsIiByZWNvcmQgaXMgZmlsbGVkIGluIGJ5IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucy8yCiAlJSBiZWxvdy4gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIG5ld19wcm90b2NvbF9mYWN0b3J5LzMgaW4gYQogJSUgcHJvcGxpc3RzLXN0eWxlIG9wdGlvbiBsaXN0LiBUaGV5J3JlIHBhcnNlZCBsaWtlIHRoaXMgc28gaXQgaXMgYW4gTyhuKQogJSUgb3BlcmF0aW9uIGluc3RlYWQgb2YgTyhuXjIpCi0tcmVjb3JkKGZhY3Rvcnlfb3B0cywge2Nvbm5lY3RfdGltZW91dCA9IGluZmluaXR5LAotICAgICAgICAgICAgICAgICAgICAgICBzb2Nrb3B0cyA9IFtdLAotICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWQgPSBmYWxzZX0pLgorLXJlY29yZChmYWN0b3J5X29wdHMsIHsKKyAgY29ubmVjdF90aW1lb3V0ID0gaW5maW5pdHksCisgIHNvY2tvcHRzID0gW10sCisgIGZyYW1lZCA9IGZhbHNlCit9KS4KIAotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFtdLCBPcHRzKSAtPgotICAgIE9wdHM7Ci1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tmcmFtZWQsIEJvb2x9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfYm9vbGVhbihCb29sKSAtPgotICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tmcmFtZWQ9Qm9vbH0pOwotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c29ja29wdHMsIE9wdExpc3R9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRMaXN0KSAtPgotICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tzb2Nrb3B0cz1PcHRMaXN0fSk7Ci1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tjb25uZWN0X3RpbWVvdXQsIFRPfSB8IFJlc3RdLCBPcHRzKSB3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KLSAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7Y29ubmVjdF90aW1lb3V0PVRPfSkuCitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW10sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpIC0+IHtGYWN0b3J5T3B0cywgVHJhbnNPcHRzfTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2ZyYW1lZCwgQm9vbH18UmVzdF0sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpCit3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KKyAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0c3tmcmFtZWQgPSBCb29sfSwgVHJhbnNPcHRzKTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3NvY2tvcHRzLCBPcHRMaXN0fXxSZXN0XSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykKK3doZW4gaXNfbGlzdChPcHRMaXN0KSAtPgorICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRze3NvY2tvcHRzID0gT3B0TGlzdH0sIFRyYW5zT3B0cyk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tjb25uZWN0X3RpbWVvdXQsIFRPfXxSZXN0XSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykKK3doZW4gVE8gPTo9IGluZmluaXR5OyBpc19pbnRlZ2VyKFRPKSAtPgorICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRze2Nvbm5lY3RfdGltZW91dCA9IFRPfSwgVHJhbnNPcHRzKTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3JlY3ZfdGltZW91dCwgVE99fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cywgW3tyZWN2X3RpbWVvdXQsIFRPfV0gKysgVHJhbnNPcHRzKS4KIAogCi0lJQogJSUgR2VuZXJhdGVzIGEgInRyYW5zcG9ydCBmYWN0b3J5IiBmdW5jdGlvbiAtIGEgZnVuIHdoaWNoIHJldHVybnMgYSB0aHJpZnRfdHJhbnNwb3J0KCkKICUlIGluc3RhbmNlLgotJSUgVGhpcyBjYW4gYmUgcGFzc2VkIGludG8gYSBwcm90b2NvbCBmYWN0b3J5IHRvIGdlbmVyYXRlIGEgY29ubmVjdGlvbiB0byBhCislJSBTdGF0ZSBjYW4gYmUgcGFzc2VkIGludG8gYSBwcm90b2NvbCBmYWN0b3J5IHRvIGdlbmVyYXRlIGEgY29ubmVjdGlvbiB0byBhCiAlJSB0aHJpZnQgc2VydmVyIG92ZXIgYSBzb2NrZXQuCi0lJQogbmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIE9wdGlvbnMpIC0+Ci0gICAgUGFyc2VkT3B0cyA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjZmFjdG9yeV9vcHRze30pLAotCi0gICAgRiA9IGZ1bigpIC0+Ci0gICAgICAgICAgICAgICAgU29ja09wdHMgPSBbYmluYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYWNrZXQsIDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthY3RpdmUsIGZhbHNlfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9kZWxheSwgdHJ1ZX0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLnNvY2tvcHRzXSwKLSAgICAgICAgICAgICAgICBjYXNlIGNhdGNoIGdlbl90Y3A6Y29ubmVjdChIb3N0LCBQb3J0LCBTb2NrT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQpIG9mCi0gICAgICAgICAgICAgICAgICAgIHtvaywgU29ja30gLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5mcmFtZWQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH07Ci0gICAgICAgICAgICAgICAgICAgIEVycm9yICAtPgotICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IKLSAgICAgICAgICAgICAgICBlbmQKKyAge0ZhY3RvcnlPcHRzLCBUcmFuc09wdHN9ID0gcGFyc2VfZmFjdG9yeV9vcHRpb25zKE9wdGlvbnMsICNmYWN0b3J5X29wdHN7fSwgW10pLAorICB7b2ssIGZ1bigpIC0+IFNvY2tPcHRzID0gW2JpbmFyeSwKKyAgICAgIHtwYWNrZXQsIDB9LAorICAgICAge2FjdGl2ZSwgZmFsc2V9LAorICAgICAge25vZGVsYXksIHRydWV9fEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0cy5zb2Nrb3B0cworICAgIF0sCisgICAgY2FzZSBjYXRjaCBnZW5fdGNwOmNvbm5lY3QoCisgICAgICBIb3N0LAorICAgICAgUG9ydCwKKyAgICAgIFNvY2tPcHRzLAorICAgICAgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRzLmNvbm5lY3RfdGltZW91dAorICAgICkgb2YKKyAgICAgIHtvaywgU29ja30gLT4KKyAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2ssIFRyYW5zT3B0cyksCisgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fSA9IGNhc2UgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRzLmZyYW1lZCBvZgorICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpOworICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkKICAgICAgICAgZW5kLAotICAgIHtvaywgRn0uCisgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fTsKKyAgICAgIEVycm9yICAtPiBFcnJvcgorICAgIGVuZAorICBlbmR9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExMTUzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDE0NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCistbW9kdWxlKHRocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0KS4KKworLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorCistYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgorCistZXhwb3J0KFtuZXcvMywKKyAgICAgICAgIHdyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMSwKKworICAgICAgICAgbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzNdKS4KKworJSUgRXhwb3J0IG9ubHkgZm9yIHRoZSB0cmFuc3BvcnQgZmFjdG9yeQorLWV4cG9ydChbbmV3LzJdKS4KKworLXJlY29yZChkYXRhLCB7c29ja2V0LAorICAgICAgICAgICAgICAgcmVjdl90aW1lb3V0PWluZmluaXR5fSkuCistdHlwZSBzdGF0ZSgpIDo6ICNkYXRhe30uCisKKyUlIFRoZSBmb2xsb3dpbmcgImxvY2FsIiByZWNvcmQgaXMgZmlsbGVkIGluIGJ5IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucy8yCislJSBiZWxvdy4gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIG5ld19wcm90b2NvbF9mYWN0b3J5LzMgaW4gYQorJSUgcHJvcGxpc3RzLXN0eWxlIG9wdGlvbiBsaXN0LiBUaGV5J3JlIHBhcnNlZCBsaWtlIHRoaXMgc28gaXQgaXMgYW4gTyhuKQorJSUgb3BlcmF0aW9uIGluc3RlYWQgb2YgTyhuXjIpCistcmVjb3JkKGZhY3Rvcnlfb3B0cywge2Nvbm5lY3RfdGltZW91dCA9IGluZmluaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBzb2Nrb3B0cyA9IFtdLAorICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3Nsb3B0aW9ucyA9IFtdfSkuCisKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbXSwgT3B0cykgLT4KKyAgICBPcHRzOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7ZnJhbWVkLCBCb29sfSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7ZnJhbWVkPUJvb2x9KTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3NvY2tvcHRzLCBPcHRMaXN0fSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2xpc3QoT3B0TGlzdCkgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7c29ja29wdHM9T3B0TGlzdH0pOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7Y29ubmVjdF90aW1lb3V0LCBUT30gfCBSZXN0XSwgT3B0cykgd2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+CisgICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze2Nvbm5lY3RfdGltZW91dD1UT30pOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c3Nsb3B0aW9ucywgU3NsT3B0aW9uc30gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19saXN0KFNzbE9wdGlvbnMpIC0+CisgICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze3NzbG9wdGlvbnM9U3NsT3B0aW9uc30pLgorCituZXcoU29ja2V0LCBTb2NrT3B0cywgU3NsT3B0aW9ucykgd2hlbiBpc19saXN0KFNvY2tPcHRzKSwgaXNfbGlzdChTc2xPcHRpb25zKSAtPgorICAgIGluZXQ6c2V0b3B0cyhTb2NrZXQsIFt7YWN0aXZlLCBmYWxzZX1dKSwgJSUgPT4gcHJldmVudCB0aGUgc3NsIGhhbmRzaGFrZSBtZXNzYWdlcyBnZXQgbG9zdAorCisgICAgJSUgdXBncmFkZSB0byBhbiBzc2wgc29ja2V0CisgICAgY2FzZSBjYXRjaCBzc2w6c3NsX2FjY2VwdChTb2NrZXQsIFNzbE9wdGlvbnMpIG9mICUgaW5maW5pdGUgdGltZW91dAorICAgICAgICB7b2ssIFNzbFNvY2tldH0gLT4KKyAgICAgICAgICAgIG5ldyhTc2xTb2NrZXQsIFNvY2tPcHRzKTsKKyAgICAgICAge2Vycm9yLCBSZWFzb259IC0+CisgICAgICAgICAgICBleGl0KHtlcnJvciwgUmVhc29ufSk7CisgICAgICAgIE90aGVyIC0+CisgICAgICAgICAgICBlcnJvcl9sb2dnZXI6ZXJyb3JfcmVwb3J0KAorICAgICAgICAgICAgICBbe2FwcGxpY2F0aW9uLCB0aHJpZnR9LAorICAgICAgICAgICAgICAgIlNTTCBhY2NlcHQgZmFpbGVkIGVycm9yIiwKKyAgICAgICAgICAgICAgIGxpc3RzOmZsYXR0ZW4oaW9fbGliOmZvcm1hdCgifnAiLCBbT3RoZXJdKSldKSwKKyAgICAgICAgICAgIGV4aXQoe2Vycm9yLCBzc2xfYWNjZXB0X2ZhaWxlZH0pCisgICAgZW5kLgorCituZXcoU3NsU29ja2V0LCBTb2NrT3B0cykgLT4KKyAgICBTdGF0ZSA9CisgICAgICAgIGNhc2UgbGlzdHM6a2V5c2VhcmNoKHJlY3ZfdGltZW91dCwgMSwgU29ja09wdHMpIG9mCisgICAgICAgICAgICB7dmFsdWUsIHtyZWN2X3RpbWVvdXQsIFRpbWVvdXR9fQorICAgICAgICAgICAgICB3aGVuIGlzX2ludGVnZXIoVGltZW91dCksIFRpbWVvdXQgPiAwIC0+CisgICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNzbFNvY2tldCwgcmVjdl90aW1lb3V0PVRpbWVvdXR9OworICAgICAgICAgICAgXyAtPgorICAgICAgICAgICAgICAgICNkYXRhe3NvY2tldD1Tc2xTb2NrZXR9CisgICAgICAgIGVuZCwKKyAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKKyUlIERhdGEgOjogaW9saXN0KCkKK3dyaXRlKFRoaXMgPSAjZGF0YXtzb2NrZXQgPSBTb2NrZXR9LCBEYXRhKSAtPgorICAgIHtUaGlzLCBzc2w6c2VuZChTb2NrZXQsIERhdGEpfS4KKworcmVhZChUaGlzID0gI2RhdGF7c29ja2V0PVNvY2tldCwgcmVjdl90aW1lb3V0PVRpbWVvdXR9LCBMZW4pCisgIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICAgIGNhc2Ugc3NsOnJlY3YoU29ja2V0LCBMZW4sIFRpbWVvdXQpIG9mCisgICAgICAgIEVyciA9IHtlcnJvciwgdGltZW91dH0gLT4KKyAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygicmVhZCB0aW1lb3V0OiBwZWVyIGNvbm4gfnAiLCBbaW5ldDpwZWVybmFtZShTb2NrZXQpXSksCisgICAgICAgICAgICBzc2w6Y2xvc2UoU29ja2V0KSwKKyAgICAgICAgICAgIHtUaGlzLCBFcnJ9OworICAgICAgICBEYXRhIC0+CisgICAgICAgICAgICB7VGhpcywgRGF0YX0KKyAgICBlbmQuCisKKyUlIFdlIGNhbid0IHJlYWxseSBmbHVzaCAtIGV2ZXJ5dGhpbmcgaXMgZmx1c2hlZCB3aGVuIHdlIHdyaXRlCitmbHVzaChUaGlzKSAtPgorICAgIHtUaGlzLCBva30uCisKK2Nsb3NlKFRoaXMgPSAjZGF0YXtzb2NrZXQgPSBTb2NrZXR9KSAtPgorICAgIHtUaGlzLCBzc2w6Y2xvc2UoU29ja2V0KX0uCisKKyUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSUKKyUlIEdlbmVyYXRlcyBhICJ0cmFuc3BvcnQgZmFjdG9yeSIgZnVuY3Rpb24gLSBhIGZ1biB3aGljaCByZXR1cm5zIGEgdGhyaWZ0X3RyYW5zcG9ydCgpCislJSBpbnN0YW5jZS4KKyUlIFRoaXMgY2FuIGJlIHBhc3NlZCBpbnRvIGEgcHJvdG9jb2wgZmFjdG9yeSB0byBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24gdG8gYQorJSUgdGhyaWZ0IHNlcnZlciBvdmVyIGEgc29ja2V0LgorJSUKK25ld190cmFuc3BvcnRfZmFjdG9yeShIb3N0LCBQb3J0LCBPcHRpb25zKSAtPgorICAgIFBhcnNlZE9wdHMgPSBwYXJzZV9mYWN0b3J5X29wdGlvbnMoT3B0aW9ucywgI2ZhY3Rvcnlfb3B0c3t9KSwKKworICAgIEYgPSBmdW4oKSAtPgorICAgICAgICAgICAgICAgIFNvY2tPcHRzID0gW2JpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFja2V0LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YWN0aXZlLCBmYWxzZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vZGVsYXksIHRydWV9IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5zb2Nrb3B0c10sCisgICAgICAgICAgICAgICAgY2FzZSBjYXRjaCBnZW5fdGNwOmNvbm5lY3QoSG9zdCwgUG9ydCwgU29ja09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuY29ubmVjdF90aW1lb3V0KSBvZgorICAgICAgICAgICAgICAgICAgICB7b2ssIFNvY2t9IC0+CisgICAgICAgICAgICAgICAgICAgICAgICBTc2xTb2NrID0gY2FzZSBjYXRjaCBzc2w6Y29ubmVjdChTb2NrLCBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5zc2xvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuY29ubmVjdF90aW1lb3V0KSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFNzbFNvY2tldH0gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzbFNvY2tldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygiZXJyb3Igd2hpbGUgY29ubmVjdGluZyBvdmVyIHNzbCAtIHJlYXNvbjogfnB+biIsIFtPdGhlcl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggZ2VuX3RjcDpjbG9zZShTb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoZXJyb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQ6bmV3KFNzbFNvY2ssIFNvY2tPcHRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5mcmFtZWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH07CisgICAgICAgICAgICAgICAgICAgIEVycm9yICAtPgorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgZW5kLAorICAgIHtvaywgRn0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0LmVybAppbmRleCAyMGM0YjVkLi4yNDE0YmRlIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0LmVybApAQCAtMjAsMzggKzIwLDEwNyBAQAogLW1vZHVsZSh0aHJpZnRfdHJhbnNwb3J0KS4KIAogLWV4cG9ydChbYmVoYXZpb3VyX2luZm8vMV0pLgorJSUgY29uc3RydWN0b3JzCistZXhwb3J0KFtuZXcvMSwgbmV3LzJdKS4KKyUlIHRyYW5zcG9ydCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLS1leHBvcnQoW25ldy8yLAotICAgICAgICAgd3JpdGUvMiwKLSAgICAgICAgIHJlYWQvMiwKLSAgICAgICAgIGZsdXNoLzEsCi0gICAgICAgICBjbG9zZS8xCi0gICAgICAgIF0pLgorLWV4cG9ydF90eXBlKFt0X3RyYW5zcG9ydC8wXSkuCisKIAogYmVoYXZpb3VyX2luZm8oY2FsbGJhY2tzKSAtPgotICAgIFt7cmVhZCwgMn0sCi0gICAgIHt3cml0ZSwgMn0sCi0gICAgIHtmbHVzaCwgMX0sCi0gICAgIHtjbG9zZSwgMX0KLSAgICBdLgorICBbe3JlYWQsIDJ9LCB7d3JpdGUsIDJ9LCB7Zmx1c2gsIDF9LCB7Y2xvc2UsIDF9XS4KIAotLXJlY29yZCh0cmFuc3BvcnQsIHttb2R1bGUsIGRhdGF9KS4KIAotbmV3KE1vZHVsZSwgRGF0YSkgd2hlbiBpc19hdG9tKE1vZHVsZSkgLT4KLSAgICB7b2ssICN0cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICBkYXRhID0gRGF0YX19LgorLXJlY29yZCh0X3RyYW5zcG9ydCwgeworICBtb2R1bGUsCisgIHN0YXRlCit9KS4KIAotJSUgRGF0YSA6OiBpb2xpc3QoKQotd3JpdGUoVHJhbnNwb3J0LCBEYXRhKSAtPgotICAgIE1vZHVsZSA9IFRyYW5zcG9ydCN0cmFuc3BvcnQubW9kdWxlLAotICAgIE1vZHVsZTp3cml0ZShUcmFuc3BvcnQjdHJhbnNwb3J0LmRhdGEsIERhdGEpLgorLXR5cGUgc3RhdGUoKSA6OiAjdF90cmFuc3BvcnR7fS4KKy10eXBlIHRfdHJhbnNwb3J0KCkgOjogI3RfdHJhbnNwb3J0e30uCiAKLXJlYWQoVHJhbnNwb3J0LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgTW9kdWxlID0gVHJhbnNwb3J0I3RyYW5zcG9ydC5tb2R1bGUsCi0gICAgTW9kdWxlOnJlYWQoVHJhbnNwb3J0I3RyYW5zcG9ydC5kYXRhLCBMZW4pLgogCi1mbHVzaCgjdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZSwgZGF0YSA9IERhdGF9KSAtPgotICAgIE1vZHVsZTpmbHVzaChEYXRhKS4KKy1pZmRlZih0cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGUpLgorLWRlZmluZShkZWJ1Z193cmFwKFRyYW5zcG9ydCksCisgIGNhc2UgVHJhbnNwb3J0I3RfdHJhbnNwb3J0Lm1vZHVsZSBvZgorICAgID90cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGUgLT4gVHJhbnNwb3J0OworICAgIF9FbHNlIC0+CisgICAgICB7b2ssIFJlc3VsdH0gPSA/dHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlOm5ldyhUcmFuc3BvcnQpLAorICAgICAgUmVzdWx0CisgIGVuZAorKS4KKy1lbHNlLgorLWRlZmluZShkZWJ1Z193cmFwKFRyYW5zcG9ydCksIFRyYW5zcG9ydCkuCistZW5kaWYuCiAKLWNsb3NlKCN0cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBkYXRhID0gRGF0YX0pIC0+Ci0gICAgTW9kdWxlOmNsb3NlKERhdGEpLgorCistdHlwZSB3cmFwcGFibGUoKSA6OgorICBiaW5hcnkoKSB8CisgIGxpc3QoKSB8CisgIHttZW1idWZmZXIsIGJpbmFyeSgpIHwgbGlzdCgpfSB8CisgIHt0Y3AsIHBvcnQoKX0gfAorICB7dGNwLCBwb3J0KCksIGxpc3QoKX0gfAorICB7ZmlsZSwgZmlsZTppb19kZXZpY2UoKX0gfAorICB7ZmlsZSwgZmlsZTppb19kZXZpY2UoKSwgbGlzdCgpfSB8CisgIHtmaWxlLCBmaWxlOmZpbGVuYW1lKCl9IHwKKyAge2ZpbGUsIGZpbGU6ZmlsZW5hbWUoKSwgbGlzdCgpfS4KKworLXNwZWMgbmV3KHdyYXBwYWJsZSgpKSAtPiB7b2ssICN0X3RyYW5zcG9ydHt9fS4KKworbmV3KHttZW1idWZmZXIsIE1lbWJ1ZmZlcn0pIHdoZW4gaXNfYmluYXJ5KE1lbWJ1ZmZlcik7IGlzX2xpc3QoTWVtYnVmZmVyKSAtPgorICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoTWVtYnVmZmVyKTsKK25ldyh7bWVtYnVmZmVyLCBNZW1idWZmZXIsIFtdfSkgd2hlbiBpc19iaW5hcnkoTWVtYnVmZmVyKTsgaXNfbGlzdChNZW1idWZmZXIpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldyhNZW1idWZmZXIpOworbmV3KHt0Y3AsIFNvY2tldH0pIHdoZW4gaXNfcG9ydChTb2NrZXQpIC0+CisgIG5ldyh7dGNwLCBTb2NrZXQsIFtdfSk7CituZXcoe3RjcCwgU29ja2V0LCBPcHRzfSkgd2hlbiBpc19wb3J0KFNvY2tldCkgLT4KKyAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgT3B0cyk7CituZXcoe2ZpbGUsIEZpbGVuYW1lfSkgd2hlbiBpc19saXN0KEZpbGVuYW1lKTsgaXNfYmluYXJ5KEZpbGVuYW1lKSAtPgorICBuZXcoe2ZpbGUsIEZpbGVuYW1lLCBbXX0pOworbmV3KHtmaWxlLCBGaWxlbmFtZSwgT3B0c30pIHdoZW4gaXNfbGlzdChGaWxlbmFtZSk7IGlzX2JpbmFyeShGaWxlbmFtZSkgLT4KKyAge29rLCBGaWxlfSA9IGZpbGU6b3BlbihGaWxlbmFtZSwgW3JhdywgYmluYXJ5XSksCisgIG5ldyh7ZmlsZSwgRmlsZSwgT3B0c30pOworbmV3KHtmaWxlLCBGaWxlLCBPcHRzfSkgLT4KKyAgdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0Om5ldyhGaWxlLCBPcHRzKS4KKworLXNwZWMgbmV3KE1vZHVsZTo6bW9kdWxlKCksIFN0YXRlOjphbnkoKSkgLT4ge29rLCAjdF90cmFuc3BvcnR7fX0uCisKK25ldyhNb2R1bGUsIFN0YXRlKSB3aGVuIGlzX2F0b20oTW9kdWxlKSAtPgorICB7b2ssID9kZWJ1Z193cmFwKCN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsIHN0YXRlID0gU3RhdGV9KX0uCisKKworLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorCisKK3JlYWQoVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6cmVhZChUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUsIExlbiksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKKworcmVhZF9leGFjdChUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIGNhc2UgbGlzdHM6a2V5ZmluZChyZWFkX2V4YWN0LCAxLCBNb2R1bGU6bW9kdWxlX2luZm8oZXhwb3J0cykpIG9mCisgICAge3JlYWRfZXhhY3QsIDJ9IC0+CisgICAgICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6cmVhZF9leGFjdChUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUsIExlbiksCisgICAgICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9OworICAgIF8gLT4KKyAgICAgIHJlYWQoVHJhbnNwb3J0LCBMZW4pCisgIGVuZC4KKworCit3cml0ZShUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSwgRGF0YSkgLT4KKyAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOndyaXRlKFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSwgRGF0YSksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKKworZmx1c2goVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0pIC0+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpmbHVzaChUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUpLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCisKK2Nsb3NlKFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9KSAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6Y2xvc2UoVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlKSwKKyAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydF9zdGF0ZV90ZXN0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnRfc3RhdGVfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzYTQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnRfc3RhdGVfdGVzdC5lcmwKQEAgLTAsMCArMSwxMTcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF90cmFuc3BvcnRfc3RhdGVfdGVzdCkuCisKKy1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCistYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgorCislJSBBUEkKKy1leHBvcnQoW25ldy8xXSkuCisKKyUlIGdlbl9zZXJ2ZXIgY2FsbGJhY2tzCistZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIGhhbmRsZV9pbmZvLzIsCisgICAgICAgICB0ZXJtaW5hdGUvMiwgY29kZV9jaGFuZ2UvM10pLgorCislJSB0aHJpZnRfdHJhbnNwb3J0IGNhbGxiYWNrcworLWV4cG9ydChbd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCisKKy1yZWNvcmQodHJhbnMsIHt3cmFwcGVkLCAlICN0aHJpZnRfdHJhbnNwb3J0e30KKyAgICAgICAgICAgICAgICB2ZXJzaW9uIDo6IGludGVnZXIoKSwKKyAgICAgICAgICAgICAgICBjb3VudGVyIDo6IHBpZCgpCisgICAgICAgICAgICAgICB9KS4KKy10eXBlIHN0YXRlKCkgOjogI3RyYW5ze30uCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKy1yZWNvcmQoc3RhdGUsIHtjdmVyc2lvbiA6OiBpbnRlZ2VyKCl9KS4KKworCituZXcoV3JhcHBlZFRyYW5zcG9ydCkgLT4KKyAgICBjYXNlIGdlbl9zZXJ2ZXI6c3RhcnRfbGluayg/TU9EVUxFLCBbXSwgW10pIG9mCisgICAgICAgIHtvaywgUGlkfSAtPgorICAgICAgICAgICAgVHJhbnMgPSAjdHJhbnN7d3JhcHBlZCA9IFdyYXBwZWRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgPSBQaWR9LAorICAgICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgVHJhbnMpOworICAgICAgICBFbHNlIC0+CisgICAgICAgICAgICBFbHNlCisgICAgZW5kLgorCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CislJSB0aHJpZnRfdHJhbnNwb3J0IGNhbGxiYWNrcworJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit3cml0ZShUcmFuc3BvcnQwID0gI3RyYW5ze3dyYXBwZWQgPSBXcmFwcGVkMH0sIERhdGEpIC0+CisgICAgVHJhbnNwb3J0MSA9IGNoZWNrX3ZlcnNpb24oVHJhbnNwb3J0MCksCisgICAge1dyYXBwZWQxLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkMCwgRGF0YSksCisgICAgVHJhbnNwb3J0MiA9IFRyYW5zcG9ydDEjdHJhbnN7d3JhcHBlZCA9IFdyYXBwZWQxfSwKKyAgICB7VHJhbnNwb3J0MiwgUmVzdWx0fS4KKworZmx1c2goVHJhbnNwb3J0MCA9ICN0cmFuc3t3cmFwcGVkID0gV3JhcHBlZDB9KSAtPgorICAgIFRyYW5zcG9ydDEgPSBjaGVja192ZXJzaW9uKFRyYW5zcG9ydDApLAorICAgIHtXcmFwcGVkMSwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JhcHBlZDApLAorICAgIFRyYW5zcG9ydDIgPSBUcmFuc3BvcnQxI3RyYW5ze3dyYXBwZWQgPSBXcmFwcGVkMX0sCisgICAge1RyYW5zcG9ydDIsIFJlc3VsdH0uCisKK2Nsb3NlKFRyYW5zcG9ydDAgPSAjdHJhbnN7d3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KKyAgICBUcmFuc3BvcnQxID0gY2hlY2tfdmVyc2lvbihUcmFuc3BvcnQwKSwKKyAgICBzaHV0ZG93bl9jb3VudGVyKFRyYW5zcG9ydDEpLAorICAgIHtXcmFwcGVkMSwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZDApLAorICAgIFRyYW5zcG9ydDIgPSBUcmFuc3BvcnQxI3RyYW5ze3dyYXBwZWQgPSBXcmFwcGVkMX0sCisgICAge1RyYW5zcG9ydDIsIFJlc3VsdH0uCisKK3JlYWQoVHJhbnNwb3J0MCA9ICN0cmFuc3t3cmFwcGVkID0gV3JhcHBlZDB9LCBMZW4pIC0+CisgICAgVHJhbnNwb3J0MSA9IGNoZWNrX3ZlcnNpb24oVHJhbnNwb3J0MCksCisgICAge1dyYXBwZWQxLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQwLCBMZW4pLAorICAgIFRyYW5zcG9ydDIgPSBUcmFuc3BvcnQxI3RyYW5ze3dyYXBwZWQgPSBXcmFwcGVkMX0sCisgICAge1RyYW5zcG9ydDIsIFJlc3VsdH0uCisKKworJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorJSUgZ2VuX3NlcnZlciBjYWxsYmFja3MKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5pdChbXSkgLT4KKyAgICB7b2ssICNzdGF0ZXtjdmVyc2lvbiA9IDB9fS4KKworaGFuZGxlX2NhbGwoY2hlY2tfdmVyc2lvbiwgX0Zyb20sIFN0YXRlID0gI3N0YXRle2N2ZXJzaW9uID0gVmVyc2lvbn0pIC0+CisgICAge3JlcGx5LCBWZXJzaW9uLCBTdGF0ZSNzdGF0ZXtjdmVyc2lvbiA9IFZlcnNpb24rMX19LgorCitoYW5kbGVfY2FzdChzaHV0ZG93biwgU3RhdGUpIC0+CisgICAge3N0b3AsIG5vcm1hbCwgU3RhdGV9LgorCitoYW5kbGVfaW5mbyhfSW5mbywgU3RhdGUpIC0+IHtub3JlcGx5LCBTdGF0ZX0uCitjb2RlX2NoYW5nZShfT2xkVnNuLCBTdGF0ZSwgX0V4dHJhKSAtPiB7b2ssIFN0YXRlfS4KK3Rlcm1pbmF0ZShfUmVhc29uLCBfU3RhdGUpIC0+IG9rLgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBJbnRlcm5hbCBmdW5jdGlvbnMKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2hlY2tfdmVyc2lvbihUcmFuc3BvcnQgPSAjdHJhbnN7dmVyc2lvbiA9IFZlcnNpb24sIGNvdW50ZXIgPSBDb3VudGVyfSkgLT4KKyAgICBjYXNlIGdlbl9zZXJ2ZXI6Y2FsbChDb3VudGVyLCBjaGVja192ZXJzaW9uKSBvZgorICAgICAgICBWZXJzaW9uIC0+CisgICAgICAgICAgICBUcmFuc3BvcnQjdHJhbnN7dmVyc2lvbiA9IFZlcnNpb24rMX07CisgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAlIFN0YXRlIHdhc24ndCBwcm9wYWdhdGVkIHByb3Blcmx5LiAgRGllLgorICAgICAgICAgICAgZXJsYW5nOmVycm9yKHN0YXRlX25vdF9wcm9wYWdhdGVkKQorICAgIGVuZC4KKworc2h1dGRvd25fY291bnRlcigjdHJhbnN7Y291bnRlciA9IENvdW50ZXJ9KSAtPgorICAgIGdlbl9zZXJ2ZXI6Y2FzdChDb3VudGVyLCBzaHV0ZG93bikuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvVGhyaWZ0MTE1MS50aHJpZnQgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0MTE1MS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5MzRhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9UaHJpZnQxMTUxLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK3N0cnVjdCBTdHJ1Y3RBIHsgMTogaTE2IHg7IH0KK3N0cnVjdCBTdHJ1Y3RCIHsgMTogaTMyIHg7IH0KK3N0cnVjdCBTdHJ1Y3RDIHsgMTogU3RydWN0QSB4OyB9CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvVGhyaWZ0MTQ3NS50aHJpZnQgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0MTQ3NS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkZWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9UaHJpZnQxNDc1LnRocmlmdApAQCAtMCwwICsxLDM0IEBACitzdHJ1Y3QgU3RydWN0QgoreworICAxOiBzdHJpbmcgeAorfQorCitzdHJ1Y3QgU3RydWN0QQoreworICAxOiBzdHJpbmcgYSwKKyAgMjogYmluYXJ5IGIsCisgIDM6IG9wdGlvbmFsIHN0cmluZyBjLAorICA0OiBvcHRpb25hbCBiaW5hcnkgZCwKKyAgNTogcmVxdWlyZWQgc3RyaW5nIGUsCisgIDY6IHJlcXVpcmVkIGJpbmFyeSBmLAorICA3OiBzdHJpbmcgZyA9ICJmb28iLAorICA4OiBpMzIgaCwKKyAgOTogb3B0aW9uYWwgaTMyIGksCisgIDEwOiByZXF1aXJlZCBpMzIgaiwKKyAgMTE6IHJlcXVpcmVkIGkzMiBrID0gNSwKKyAgMTI6IGRvdWJsZSBsLAorICAxMzogb3B0aW9uYWwgZG91YmxlIG0sCisgIDE0OiByZXF1aXJlZCBkb3VibGUgbiwKKyAgMTU6IGRvdWJsZSBvID0gMy4xNDE1OSwKKyAgMTY6IGxpc3Q8c3RyaW5nPiBzdHJpbmdfbGlzdCwKKyAgMTc6IGxpc3Q8Ynl0ZT4gYnl0ZV9saXN0ID0gWzEsIDIsIDNdLAorICAxODogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IHJzbCwKKyAgMTk6IG9wdGlvbmFsIGxpc3Q8c3RyaW5nPiBvc2wsCisgIDIwOiBzZXQ8c3RyaW5nPiBzdHJpbmdfc2V0LAorICAyMTogcmVxdWlyZWQgc2V0PHN0cmluZz4gcnNzLAorICAyMjogb3B0aW9uYWwgc2V0PHN0cmluZz4gb3NzLAorICAyMzogbWFwPHN0cmluZywgc3RyaW5nPiBzdHJpbmdfbWFwLAorICAyNDogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiByc20sCisgIDI1OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBzdHJpbmc+IG9zbSwKKyAgMjY6IFN0cnVjdEIgc3RydWN0YgorfQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0IGIvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZmZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKQEAgLTAsMCArMSwyMiBAQAorc3RydWN0IHRlc3QxIHsKKyAgMTogaTMyIG9uZQorICAyOiBpMzIgdHdvICAgICAgICAgICAgICAgICAgICAvLyBvbWl0CisgIDM6IGkzMiB0aHJlZQorfQorCitzdHJ1Y3QgdGVzdDIgeworICAxOiBpMzIgb25lCisgIDI6IHRlc3QyIHR3byAgICAgICAgICAgICAgICAgIC8vIG9taXQKKyAgMzogaTMyIHRocmVlCit9CisKK3N0cnVjdCB0ZXN0MyB7CisgIDE6IGkzMiBvbmUKKyAgMjogbGlzdDx0ZXN0MT4gdHdvICAgICAgICAgICAgLy8gb21pdAorfQorCitzdHJ1Y3QgdGVzdDQgeworICAxOiBpMzIgb25lCisgIDI6IG1hcDxpMzIsdGVzdDE+IHR3byAgICAgICAgIC8vIG9taXQKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdCBiL2xpYi9lcmwvdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmMjcyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQKQEAgLTAsMCArMSwzMyBAQAorZW51bSBOdW1iZXJ6Cit7CisgIE9ORSA9IDEsCisgIFRXTywKKyAgVEhSRUUsCisgIEZJVkUgPSA1LAorICBTSVgsCisgIEVJR0hUID0gOAorfQorCitjb25zdCBOdW1iZXJ6IG15TnVtYmVyeiA9IE51bWJlcnouT05FOworCitzdHJ1Y3QgQ2FwaXRhbGl6ZWRTdHJ1Y3QKK3sKKyAgMTogaTMyIElkLAorICAyOiBiaW5hcnkgbWVzc2FnZQorfQorCitzdHJ1Y3QgTGlzdENhcGl0YWxpemVkU3RydWN0cworeworICAxOiBsaXN0PENhcGl0YWxpemVkU3RydWN0PiBzdHJ1Y3RzCit9CisKK2V4Y2VwdGlvbiBYY2VwdGlvbiB7CisgIDE6IGkzMiBlcnJvckNvZGUsCisgIDI6IGJpbmFyeSBtZXNzYWdlCit9CisKK3NlcnZpY2UgTGVnYWN5TmFtZXMKK3sKKyAgTGlzdENhcGl0YWxpemVkU3RydWN0cyBOYW1lcygxOiBDYXBpdGFsaXplZFN0cnVjdCBmb28sIDI6IENhcGl0YWxpemVkU3RydWN0IGJhcikKKyAgICB0aHJvd3MoMTogWGNlcHRpb24gZXJyKQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9mbGFncy9UaHJpZnQzMjE0LnRocmlmdCBiL2xpYi9lcmwvdGVzdC9mbGFncy9UaHJpZnQzMjE0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTExMGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0CkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworc3RydWN0IFN0cmluZ01hcAoreworICAxOiBtYXA8aTMyLCBzdHJpbmc+IGRhdGEgPSB7MTogImEiLCAyOiAiYiJ9OworfQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC9sZWdhY3lfbmFtZXNfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2YWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9sZWdhY3lfbmFtZXNfdGVzdC5lcmwKQEAgLTAsMCArMSw2OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUobGVnYWN5X25hbWVzX3Rlc3QpLgorLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvbGVnYWN5TmFtZXNfY29uc3RhbnRzLmhybCIpLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7ImNhcGl0YWxpemVkU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Y2FwaXRhbGl6ZWRTdHJ1Y3QsIF8sIF99LAorICAgICAgI2NhcGl0YWxpemVkU3RydWN0e2lkPW51bGwsbWVzc2FnZT1udWxsfQorICAgICl9CisgIF0uCisKK3N0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgJ2lkJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCAnbWVzc2FnZScsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbGVnYWN5TmFtZXNfdHlwZXM6c3RydWN0X2luZm9fZXh0KGNhcGl0YWxpemVkU3RydWN0KQorICAgICl9LAorICAgIHsibGlzdENhcGl0YWxpemVkU3RydWN0cyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19LCAnc3RydWN0cycsIFtdfQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQobGlzdENhcGl0YWxpemVkU3RydWN0cykKKyAgICApfQorICBdLgorCitzZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJuYW1lcyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sCisgICAgICAgIHsyLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJuYW1lcyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2xpc3RDYXBpdGFsaXplZFN0cnVjdHMnfX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7Im5hbWVzIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ3hjZXB0aW9uJ319fV19LAorICAgICAgbGVnYWN5TmFtZXNfdGhyaWZ0OmZ1bmN0aW9uX2luZm8obmFtZXMsIGV4Y2VwdGlvbnMpCisgICAgKX0KKyAgXS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmcudGhyaWZ0IGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3OTk0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmcudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciB7CisgICAgaTMyIGFkZCgxOiBpMzIgeCwgMjogaTMyIHkpCit9CisKK3NlcnZpY2UgTXVsdGlwbGV4aW5nX1dlYXRoZXJSZXBvcnQgeworICAgIGRvdWJsZSBnZXRUZW1wZXJhdHVyZSgpCit9CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZ190ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjJkNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZ190ZXN0LmVybApAQCAtMCwwICsxLDU3IEBACistbW9kdWxlKG11bHRpcGxleGluZ190ZXN0KS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistZXhwb3J0KFsKKyAgICAgaGFuZGxlX2Z1bmN0aW9uLzIKKyAgICAsaGFuZGxlX2Vycm9yLzIKK10pLgorCitzdGFydF9tdWx0aXBsZXhlZF9zZXJ2ZXJfdGVzdCgpIC0+CisKKyAgICBQb3J0ID0gOTA5MCwKKyAgICBTZXJ2aWNlcyA9IFsKKyAgICAgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgICAgbXVsdGlwbGV4aW5nX19jYWxjdWxhdG9yX3RocmlmdH0sCisgICAgICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCIsIG11bHRpcGxleGluZ19fd2VhdGhlcl9yZXBvcnRfdGhyaWZ0fQorICAgICAgICAgICAgICAgXSwKKworICAgIHtvaywgUGlkfSA9IHRocmlmdF9zb2NrZXRfc2VydmVyOnN0YXJ0KFsKKyAgICAgICAge2lwLCAiMTI3LjAuMC4xIn0sCisgICAgICAgIHtwb3J0LCBQb3J0fSwKKyAgICAgICAge25hbWUsID9NT0RVTEV9LAorICAgICAgICB7c2VydmljZSwgU2VydmljZXN9LAorICAgICAgICB7aGFuZGxlciwgWworICAgICAgICAgICAgeyJlcnJvcl9oYW5kbGVyIiwgICAgICAgICAgICAgID9NT0RVTEV9LAorICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciIsICAgID9NT0RVTEV9LAorICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCIsID9NT0RVTEV9CisgICAgICAgIF19CisgICAgIF0pLAorCisgICAge29rLCBbeyJNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciIsIENhbGN1bGF0b3JDbGllbnQwfSwKKyAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgV2VhdGhlclJlcG9ydENsaWVudDB9XX0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3X211bHRpcGxleGVkKCIxMjcuMC4wLjEiLCBQb3J0LCBTZXJ2aWNlcywgW10pLAorCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKFdlYXRoZXJSZXBvcnRDbGllbnQwLCBnZXRUZW1wZXJhdHVyZSwgWzFdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFsxXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7YmFkX2FyZ3MsIF8sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChDYWxjdWxhdG9yQ2xpZW50MCwgYWRkLCBbMSwxLDFdKSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge25vX2Z1bmN0aW9uLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7bm9fZnVuY3Rpb24sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChXZWF0aGVyUmVwb3J0Q2xpZW50MCwgYWRkLCBbNDEsIDFdKSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtvaywgNDJ9fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFs0MSwgMV0pKSwKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtvaywgNDIuMH19LCB0aHJpZnRfY2xpZW50OmNhbGwoV2VhdGhlclJlcG9ydENsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbXSkpLAorCisgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RvcChQaWQpLgorCislJSBIQU5ETEUgRlVOQ1RJT05TCisKKyUlIENhbGN1bGF0b3IgaGFuZGxlcworaGFuZGxlX2Z1bmN0aW9uKGFkZCwge1gsIFl9KSAtPgorICAgIHtyZXBseSwgWCArIFl9OworCislJSBXZWF0aGVyUmVwb3J0IGhhbmRsZXMKK2hhbmRsZV9mdW5jdGlvbihnZXRUZW1wZXJhdHVyZSwge30pIC0+CisgICAge3JlcGx5LCA0Mi4wfS4KKworaGFuZGxlX2Vycm9yKF9GLCBfUmVhc29uKSAtPgorJSUgICAgID9kZWJ1Z0hlcmUsID9kZWJ1Z1ZhbCh7X0YsIF9SZWFzb259KSwKKyAgICBvay4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbmFtZV9jb25mbGljdF90ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMWRmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvbmFtZV9jb25mbGljdF90ZXN0LmVybApAQCAtMCwwICsxLDI5OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUobmFtZV9jb25mbGljdF90ZXN0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL25hbWVfY29uZmxpY3RfdGVzdF9jb25zdGFudHMuaHJsIikuCisKK3JlY29yZF9nZW5lcmF0aW9uX3Rlc3RfKCkgLT4KKyAgWworICAgIHsidXNpbmcgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt1c2luZywgXywgX30sCisgICAgICAjdXNpbmd7c2luZ2xlPW51bGwsaW50ZWdlcj1udWxsfQorICAgICl9LAorICAgIHsiZGVsZWdhdGUgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtkZWxlZ2F0ZSwgXywgX30sCisgICAgICAjZGVsZWdhdGV7cGFydGlhbD1udWxsLGRlbGVnYXRlPW51bGx9CisgICAgKX0sCisgICAgeyJnZXQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtnZXQsIF99LAorICAgICAgI2dldHtzYnl0ZT1udWxsfQorICAgICl9LAorICAgIHsicGFydGlhbCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3BhcnRpYWwsIF8sIF8sIF99LAorICAgICAgI3BhcnRpYWx7dXNpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydDbGFzc0FuZFByb3AnLCBfLCBfLCBfLCBffSwKKyAgICAgICMnQ2xhc3NBbmRQcm9wJ3sKKyAgICAgICAgJ0NsYXNzQW5kUHJvcCc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcF8nPW51bGwsCisgICAgICAgICdDbGFzc0FuZFByb3BfXyc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcGVyJz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7c2Vjb25kX2NoYW5jZSwgXywgXywgXywgX30sCisgICAgICAjc2Vjb25kX2NoYW5jZXsKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0UnPW51bGwsCisgICAgICAgICdTRUNPTkRfQ0hBTkNFXyc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfXyc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VTJz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJOT1dfRUFUX1RISVMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnTk9XX0VBVF9USElTJywgXywgXywgXywgX30sCisgICAgICAjJ05PV19FQVRfVEhJUyd7CisgICAgICAgIG5vd19lYXRfdGhpcz1udWxsLAorICAgICAgICBub3dfZWF0X3RoaXNfPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc19fPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc19hbmRfdGhpcz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydUaGVFZGdlQ2FzZScsIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIydUaGVFZGdlQ2FzZSd7CisgICAgICAgIHRoZUVkZ2VDYXNlPW51bGwsCisgICAgICAgIHRoZUVkZ2VDYXNlXz1udWxsLAorICAgICAgICB0aGVFZGdlQ2FzZV9fPW51bGwsCisgICAgICAgICdUaGVFZGdlQ2FzZSc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlXyc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlX18nPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlRyaWNreV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnVHJpY2t5XycsIF8sIF99LAorICAgICAgIydUcmlja3lfJ3t0cmlja3k9bnVsbCwnVHJpY2t5Jz1udWxsfQorICAgICl9LAorICAgIHsiTmVzdGVkIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J05lc3RlZCcsIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIydOZXN0ZWQneworICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAorICAgICAgICBzZWNvbmRfY2hhbmNlPW51bGwsCisgICAgICAgICdOT1dfRUFUX1RISVMnPW51bGwsCisgICAgICAgICdUaGVFZGdlQ2FzZSc9bnVsbCwKKyAgICAgICAgJ1RyaWNreV8nPW51bGwsCisgICAgICAgICdOZXN0ZWQnPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlByb2JsZW1fIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J1Byb2JsZW1fJywgXywgX30sCisgICAgICAjJ1Byb2JsZW1fJ3twcm9ibGVtPW51bGwsJ1Byb2JsZW0nPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJ1c2luZyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgZG91YmxlfSx7MiwgZG91YmxlfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKHVzaW5nKQorICAgICl9LAorICAgIHsiZGVsZWdhdGUgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBzdHJpbmd9LAorICAgICAgICB7Miwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgZGVsZWdhdGV9fX0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKGRlbGVnYXRlKQorICAgICl9LAorICAgIHsiZ2V0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKGdldCkKKyAgICApfSwKKyAgICB7InBhcnRpYWwgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCB1c2luZ319fSwKKyAgICAgICAgezIsIGJvb2x9LAorICAgICAgICB7MywgYm9vbH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKHBhcnRpYWwpCisgICAgKX0sCisgICAgeyJDbGFzc0FuZFByb3AgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0NsYXNzQW5kUHJvcCcpCisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKHNlY29uZF9jaGFuY2UpCisgICAgKX0sCisgICAgeyJOT1dfRUFUX1RISVMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ05PV19FQVRfVEhJUycpCisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH0sezUsIGJvb2x9LHs2LCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdUaGVFZGdlQ2FzZScpCisgICAgKX0sCisgICAgeyJUcmlja3lfIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnVHJpY2t5XycpCisgICAgKX0sCisgICAgeyJOZXN0ZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnQ2xhc3NBbmRQcm9wJ319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHNlY29uZF9jaGFuY2V9fX0sCisgICAgICAgIHszLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTk9XX0VBVF9USElTJ319fSwKKyAgICAgICAgezQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdUaGVFZGdlQ2FzZSd9fX0sCisgICAgICAgIHs1LCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnVHJpY2t5Xyd9fX0sCisgICAgICAgIHs2LCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTmVzdGVkJ319fQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ05lc3RlZCcpCisgICAgKX0sCisgICAgeyJQcm9ibGVtXyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1Byb2JsZW1fJykKKyAgICApfSwKKyAgICB7InVzaW5nIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBkb3VibGUsIHNpbmdsZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgZG91YmxlLCBpbnRlZ2VyLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQodXNpbmcpCisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBwYXJ0aWFsLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19LCBkZWxlZ2F0ZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KGRlbGVnYXRlKQorICAgICl9LAorICAgIHsiZ2V0IGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB1bmRlZmluZWQsIGJvb2wsIHNieXRlLCB1bmRlZmluZWR9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KGdldCkKKyAgICApfSwKKyAgICB7InBhcnRpYWwgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHVzaW5nfX0sIHVzaW5nLCAjdXNpbmd7fX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIHJlYWQsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsIHdyaXRlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQocGFydGlhbCkKKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcCcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdDbGFzc0FuZFByb3BfJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF9fJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcGVyJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdDbGFzc0FuZFByb3AnKQorICAgICl9LAorICAgIHsic2Vjb25kX2NoYW5jZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0UnLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRV8nLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRV9fJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0VTJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KHNlY29uZF9jaGFuY2UpCisgICAgKX0sCisgICAgeyJOT1dfRUFUX1RISVMgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpcywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX18sIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpc19hbmRfdGhpcywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOT1dfRUFUX1RISVMnKQorICAgICl9LAorICAgIHsiVGhlRWRnZUNhc2UgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCB0aGVFZGdlQ2FzZV8sIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlX18sIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZScsIHVuZGVmaW5lZH0sCisgICAgICAgIHs1LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV8nLCB1bmRlZmluZWR9LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCBib29sLCAnVGhlRWRnZUNhc2VfXycsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnVGhlRWRnZUNhc2UnKQorICAgICl9LAorICAgIHsiVHJpY2t5XyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdHJpY2t5LCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnVHJpY2t5JywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUcmlja3lfJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnQ2xhc3NBbmRQcm9wJworICAgICAgICB9fSwgJ0NsYXNzQW5kUHJvcCcsICMnQ2xhc3NBbmRQcm9wJ3t9fSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICBzZWNvbmRfY2hhbmNlCisgICAgICAgIH19LCBzZWNvbmRfY2hhbmNlLCAjc2Vjb25kX2NoYW5jZXt9fSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnTk9XX0VBVF9USElTJworICAgICAgICB9fSwgJ05PV19FQVRfVEhJUycsICMnTk9XX0VBVF9USElTJ3t9fSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnVGhlRWRnZUNhc2UnCisgICAgICAgIH19LCAnVGhlRWRnZUNhc2UnLCAjJ1RoZUVkZ2VDYXNlJ3t9fSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnVHJpY2t5XycKKyAgICAgICAgfX0sICdUcmlja3lfJywgIydUcmlja3lfJ3t9fSwKKyAgICAgICAgezYsIHVuZGVmaW5lZCwge3N0cnVjdCwgeworICAgICAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlcywKKyAgICAgICAgICAnTmVzdGVkJworICAgICAgICB9fSwgJ05lc3RlZCcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkJykKKyAgICApfSwKKyAgICB7IlByb2JsZW1fIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCBwcm9ibGVtLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnUHJvYmxlbScsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnUHJvYmxlbV8nKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7ImV2ZW50IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHBhcnRpYWx9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJldmVudCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsiZXZlbnQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJGb28gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ05lc3RlZCd9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJGb28gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsiRm9vIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnUHJvYmxlbV8nfX19XX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIGV4Y2VwdGlvbnMpCisgICAgKX0KKyAgXS4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy9zdHJlc3Nfc2VydmVyLmVybCBiL2xpYi9lcmwvdGVzdC9zdHJlc3Nfc2VydmVyLmVybApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9lcmwvc3JjL3N0cmVzc19zZXJ2ZXIuZXJsCnJlbmFtZSB0byBsaWIvZXJsL3Rlc3Qvc3RyZXNzX3NlcnZlci5lcmwKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X2NvbnN0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X2NvbnN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjc3NzdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsCkBAIC0wLDAgKzEsNTQgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfY29uc3QpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL2NvbnN0YW50c19kZW1vX3R5cGVzLmhybCIpLgorCituYW1lc3BhY2VfdGVzdCgpIC0+CisgICUlIFZlcmlmeSB0aGF0IHJlY29yZHMgcHJvZHVjZWQgYnkgQ29uc3RhbnRzRGVtby50aHJpZnQgaGF2ZSB0aGUgcmlnaHQgbmFtZXNwYWNlLgorICBpbzpmb3JtYXQodXNlciwgImluIG5hbWVzcGFjZV90ZXN0KClcbiIsIFtdKSwKKyAge3N0cnVjdCwgX30gPSBjb25zdGFudHNfZGVtb190eXBlczpzdHJ1Y3RfaW5mbygnY29uc3RzX3RoaW5nJyksCisgIHtzdHJ1Y3QsIF99ID0gY29uc3RhbnRzX2RlbW9fdHlwZXM6c3RydWN0X2luZm8oJ2NvbnN0c19CbGFoJyksCisgIG9rLgorCitjb25zdF9tYXBfdGVzdCgpIC0+CisgID9hc3NlcnRFcXVhbCgyMzMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDM1NTMyKSksCisgID9hc3NlcnRFcnJvcihmdW5jdGlvbl9jbGF1c2UsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDApKSwKKworICA/YXNzZXJ0RXF1YWwoODUzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCg0MzUyMywgZGVmYXVsdCkpLAorICA/YXNzZXJ0RXF1YWwoZGVmYXVsdCwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMTAxMTAsIGRlZmF1bHQpKSwKKworICA/YXNzZXJ0RXF1YWwoOTgzMjUsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigibGtqc2RmIikpLAorICA/YXNzZXJ0RXJyb3IoZnVuY3Rpb25fY2xhdXNlLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoIm5vbmV4aXN0IikpLAorCisgID9hc3NlcnRFcXVhbCgyMzMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigiaGVsbG8iLCAzMjEpKSwKKyAgP2Fzc2VydEVxdWFsKDMyMSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJnb29kYnllIiwgMzIxKSkuCisKK2NvbnN0X2xpc3RfdGVzdCgpIC0+CisgID9hc3NlcnRFcXVhbCgyMzU5ODM1MiwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDIpKSwKKyAgP2Fzc2VydEVycm9yKGZ1bmN0aW9uX2NsYXVzZSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDApKSwKKworICA/YXNzZXJ0RXF1YWwoMzI1MzUyMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDMsIGRlZmF1bHQpKSwKKyAgP2Fzc2VydEVxdWFsKGRlZmF1bHQsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbGlzdCgxMCwgZGVmYXVsdCkpLgorCistZW5kaWYuICUlIFRFU1QKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X2Rpc2tsb2cuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfZGlza2xvZy5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiNmZjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X2Rpc2tsb2cuZXJsCkBAIC0wLDAgKzEsOTkgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfZGlza2xvZykuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworZGlza2xvZ190ZXN0KCkgLT4KKyAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9CisgICAgdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoCisgICAgICB0ZXN0X2Rpc2tsb2csCisgICAgICBbe2ZpbGUsICIuL3Rlc3RfbG9nIn0sCisgICAgICAge3NpemUsIHsxMDI0KjEwMjQsIDEwfX1dKSwKKyAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0KKyAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KCBUcmFuc3BvcnRGYWN0b3J5LCBbXSksCisgIHtvaywgUHJvdG99ID0gUHJvdG9jb2xGYWN0b3J5KCksCisgIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50Om5ldyhQcm90bywgdGhyaWZ0X3Rlc3RfdGhyaWZ0KSwKKworICBpbzpmb3JtYXQoIkNsaWVudCBzdGFydGVkfm4iKSwKKworICAlIFdlIGhhdmUgdG8gbWFrZSBvbmV3YXkgY2FsbHMgaW50byB0aGlzIGNsaWVudCBvbmx5IHNpbmNlIG90aGVyd2lzZSBpdAorICAlIHdpbGwgdHJ5IHRvIHJlYWQgZnJvbSB0aGUgZGlza2xvZyBhbmQgZ28gYm9vbS4KKyAge0NsaWVudDEsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwLCB0ZXN0T25ld2F5LCBbMTYjZGVhZGJlZWZdKSwKKyAgaW86Zm9ybWF0KCJDYWxsIHdyaXR0ZW5+biIpLAorCisgICUgVXNlIHRoZSBzZW5kX2NhbGwgbWV0aG9kIHRvIHdyaXRlIGEgbm9uLW9uZXdheSBjYWxsIGludG8gdGhlIGxvZworICB7Q2xpZW50Miwgb2t9ID0KKyAgICB0aHJpZnRfY2xpZW50OnNlbmRfY2FsbChDbGllbnQxLCB0ZXN0U3RyaW5nLCBbPDwiaGVsbG8gd29ybGQiPj5dKSwKKyAgaW86Zm9ybWF0KCJOb24tb25ld2F5IGNhbGwgc2VudH5uIiksCisKKyAge19DbGllbnQzLCBva30gPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudDIpLAorICBpbzpmb3JtYXQoIkNsaWVudCBjbG9zZWR+biIpLAorICAKKyAgbGlzdHM6Zm9yZWFjaChmdW4oRmlsZSkgLT4gZmlsZTpkZWxldGUoRmlsZSkgZW5kLCBbCisgICAgIi4vdGVzdF9sb2cuMSIsCisgICAgIi4vdGVzdF9sb2cuaWR4IiwKKyAgICAiLi90ZXN0X2xvZy5zaXoiCisgIF0pLAorICBpbzpmb3JtYXQoIkNsZWFuaW5nIHVwIHRlc3QgZmlsZXN+biIpLAorCisgIG9rLgorCitkaXNrbG9nX2Jhc2U2NF90ZXN0KCkgLT4KKyAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9CisgICAgdGhyaWZ0X2Rpc2tfbG9nX3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoCisgICAgICB0ZXN0X2Rpc2tsb2csCisgICAgICBbe2ZpbGUsICIuL3Rlc3RfYjY0X2xvZyJ9LAorICAgICAgIHtzaXplLCB7MTAyNCoxMDI0LCAxMH19XSksCisgIHtvaywgQjY0RmFjdG9yeX0gPQorICAgIHRocmlmdF9iYXNlNjRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShUcmFuc3BvcnRGYWN0b3J5KSwKKyAge29rLCBCdWZGYWN0b3J5fSA9CisgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoQjY0RmFjdG9yeSksCisgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9CisgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXdfcHJvdG9jb2xfZmFjdG9yeShCdWZGYWN0b3J5LCBbXSksCisgIHtvaywgUHJvdG99ID0gUHJvdG9jb2xGYWN0b3J5KCksCisgIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50Om5ldyhQcm90bywgdGhyaWZ0X3Rlc3RfdGhyaWZ0KSwKKworICBpbzpmb3JtYXQoIkNsaWVudCBzdGFydGVkfm4iKSwKKworICAlIFdlIGhhdmUgdG8gbWFrZSBvbmV3YXkgY2FsbHMgaW50byB0aGlzIGNsaWVudCBvbmx5IHNpbmNlIG90aGVyd2lzZQorICAlIGl0IHdpbGwgdHJ5IHRvIHJlYWQgZnJvbSB0aGUgZGlza2xvZyBhbmQgZ28gYm9vbS4KKyAge0NsaWVudDEsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwLCB0ZXN0T25ld2F5LCBbMTYjZGVhZGJlZWZdKSwKKyAgaW86Zm9ybWF0KCJDYWxsIHdyaXR0ZW5+biIpLAorCisgICUgVXNlIHRoZSBzZW5kX2NhbGwgbWV0aG9kIHRvIHdyaXRlIGEgbm9uLW9uZXdheSBjYWxsIGludG8gdGhlIGxvZworICB7Q2xpZW50Miwgb2t9ID0KKyAgICB0aHJpZnRfY2xpZW50OnNlbmRfY2FsbChDbGllbnQxLCB0ZXN0U3RyaW5nLCBbPDwiaGVsbG8gd29ybGQiPj5dKSwKKyAgaW86Zm9ybWF0KCJOb24tb25ld2F5IGNhbGwgc2VudH5uIiksCisKKyAge19DbGllbnQzLCBva30gPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudDIpLAorICBpbzpmb3JtYXQoIkNsaWVudCBjbG9zZWR+biIpLAorCisgIGxpc3RzOmZvcmVhY2goZnVuKEZpbGUpIC0+IGZpbGU6ZGVsZXRlKEZpbGUpIGVuZCwgWworICAgICIuL3Rlc3RfYjY0X2xvZy4xIiwKKyAgICAiLi90ZXN0X2I2NF9sb2cuaWR4IiwKKyAgICAiLi90ZXN0X2I2NF9sb2cuc2l6IgorICBdKSwKKyAgaW86Zm9ybWF0KCJDbGVhbmluZyB1cCB0ZXN0IGZpbGVzfm4iKSwKKworICBvay4KKworLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg0MWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwKQEAgLTAsMCArMSw3OSBAQAorLW1vZHVsZSh0ZXN0X29taXQpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfb21pdF93aXRoX3R5cGVzLmhybCIpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKK29taXRfc3RydWN0MV90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgYmFzaWMgdHlwZSAoYW4gaTMyKS4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBBKX19LCBBfSksCisgIHtQMiwge29rLCBPMH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDEsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEEpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgxLCBBKSwgZWxlbWVudCgxLCBPMCkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBBKSwgZWxlbWVudCgyLCBPMCkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCg0LCBBKSwgZWxlbWVudCgzLCBPMCkpLAorCisgIHtQMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAyLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSwgQn0pLAorICB7X1A0LCB7b2ssIE8xfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMywge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8xKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8xKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8xKSksCisKKyAgb2suCisKK29taXRfc3RydWN0Ml90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgc3RydWN0LgorICBBID0gI3Rlc3Qye29uZSA9IDEsIHR3byA9ICN0ZXN0MntvbmUgPSAxMCwgdGhyZWUgPSAzMH0sIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDJ7b25lID0gMSwgdHdvID0gI3Rlc3Qye29uZSA9IDEwLCB0d28gPSAjdGVzdDJ7b25lID0gMTAwfSwgdGhyZWUgPSAzMH0sIHRocmVlID0gM30sCisKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEEpfX0sIEF9KSwKKyAge1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8wKSksCisKKyAge1AzLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDIsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDQsIHtvaywgTzF9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAzLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzEpKSwKKworICBvay4KKworb21pdF9saXN0X3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBsaXN0LgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDN7b25lID0gMSwgdHdvID0gWyBBIF19LAorCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBCKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQiksIGVsZW1lbnQoMiwgTzApKSwKKworICBvay4KKworb21pdF9tYXBfdGVzdCgpIC0+CisgICUlIEluIHRoaXMgdGVzdCwgdGhlIGZpZWxkIHRoYXQgaXMgZGVsZXRlZCBpcyBhIG1hcC4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0d28gPSAyLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Q0e29uZSA9IDEsIHR3byA9IGRpY3Q6ZnJvbV9saXN0KFsgezIsIEF9IF0pfSwKKworICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKSwKKyAge29rLCBQMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorCisgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSwgQn0pLAorICB7X1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEIpLCBlbGVtZW50KDIsIE8wKSksCisKKyAgb2suCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cy5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZjZTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cy5lcmwKQEAgLTAsMCArMSw2OCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKS4KKworLWlmZGVmKFRFU1QpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9kb3VibGVfY29uc3RhbnRzX3Rlc3RfY29uc3RhbnRzLmhybCIpLgorCistZGVmaW5lKEVQU0lMT04sIDAuMDAwMDAwMSkuCisKK3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHNfdGVzdCgpIC0+CisgID9hc3NlcnQoYWJzKDEuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDMuMTQxNTkyNjUzNTkgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwMDAwMC4xIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtMTAwMDAwMC4xIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxLjdlKzMwOCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xLjdlKzMwOCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkuCisKK3JlbmRlcmVkX2RvdWJsZV9saXN0X3Rlc3QoKSAtPgorICA/YXNzZXJ0RXF1YWwoMTIsIGxlbmd0aCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSwKKyAgP2Fzc2VydChhYnMoMS4wIC0gbGlzdHM6bnRoKDEsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMC4wIC0gbGlzdHM6bnRoKDIsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwLjAgLSBsaXN0czpudGgoMywgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicyg5MjIzMzcyMDM2ODU0Nzc1ODA3LjAgLSBsaXN0czpudGgoNCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gbGlzdHM6bnRoKDUsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMy4xNDE1OTI2NTM1OSAtIGxpc3RzOm50aCg2LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEwMDAwMDAuMSAtIGxpc3RzOm50aCg3LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAwMDAwLjEgLSBsaXN0czpudGgoOCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxLjdlKzMwOCAtIGxpc3RzOm50aCg5LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xLjdlKzMwOCAtIGxpc3RzOm50aCgxMCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicyg5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gbGlzdHM6bnRoKDExLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gbGlzdHM6bnRoKDEyLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTikuCisKKy1lbmRpZi4gJSUgVEVTVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF8xMTUxLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF8xMTUxLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE5MTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzExNTEuZXJsCkBAIC0wLDAgKzEsMzQgQEAKKy1tb2R1bGUodGVzdF90aHJpZnRfMTE1MSkuCisKKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdDExNTFfdHlwZXMuaHJsIikuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKwordW5tYXRjaGVkX3N0cnVjdF90ZXN0KCkgLT4KKyAgUzEgPSAjJ1N0cnVjdEMne3g9IydTdHJ1Y3RCJ3t4PTF9fSwKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCisgIHtvaywgUHJvdG9jb2x9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKyAgP2Fzc2VydEV4Y2VwdGlvbigKKyAgICBlcnJvciwKKyAgICBzdHJ1Y3RfdW5tYXRjaGVkLAorICAgIHRocmlmdF9wcm90b2NvbDp3cml0ZSgKKyAgICAgIFByb3RvY29sLAorICAgICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0MTE1MV90eXBlczpzdHJ1Y3RfaW5mbygnU3RydWN0QycpKX0sIFMxfQorICAgICkKKyAgKS4KKworYmFkYXJnX3Rlc3QoKSAtPgorICBTMiA9ICMnU3RydWN0Qyd7eD0jJ1N0cnVjdEEne3g9IjEifX0sCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAorICB7b2ssIFByb3RvY29sfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisgID9hc3NlcnRFeGNlcHRpb24oCisgICAgZXJyb3IsCisgICAgYmFkYXJnLAorICAgIHRocmlmdF9wcm90b2NvbDp3cml0ZSgKKyAgICAgIFByb3RvY29sLAorICAgICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0MTE1MV90eXBlczpzdHJ1Y3RfaW5mbygnU3RydWN0QycpKX0sIFMyfQorICAgICkKKyAgKS4KKworLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzMyMTQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzMyMTQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTU0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMzIxNC5lcmwKQEAgLTAsMCArMSw2MCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfMzIxNCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0MzIxNF90eXBlcy5ocmwiKS4KKworLWlmZGVmKFRFU1QpLgorLWlmbmRlZihvdHAxNl9vcl9sZXNzKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJTdHJpbmdNYXAgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnU3RyaW5nTWFwJywgX30sCisgICAgICAjJ1N0cmluZ01hcCd7ZGF0YT0jezUwID0+ICJmb28ifX0KKyAgICApfSwKKyAgICB7IlN0cmluZ01hcCByZWNvcmQgZGVmYXVsdHMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgeydTdHJpbmdNYXAnLCAjezEgPT4gImEiLCAyID0+ICJiIn19LAorICAgICAgIydTdHJpbmdNYXAne30KKyAgICApfSwKKyAgICB7IlN0cmluZ01hcCByZWNvcmQgZGljdCBmcm9tIGxpc3QiLCA/X2Fzc2VydE5vdEVxdWFsKAorICAgICAgeydTdHJpbmdNYXAnLCBkaWN0OmZyb21fbGlzdChbezEsICJhIn0sIHsyLCAiYiJ9XSl9LAorICAgICAgIydTdHJpbmdNYXAne30KKyAgICApfSwKKyAgICB7IlN0cmluZ01hcCByZWNvcmQgbWFwIGZyb20gbGlzdCIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7J1N0cmluZ01hcCcsIG1hcHM6ZnJvbV9saXN0KFt7MSwgImEifSwgezIsICJiIn1dKX0sCisgICAgICAjJ1N0cmluZ01hcCd7fQorICAgICl9CisgIF0uCisKK3N0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiU3RyaW5nTWFwIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIHN0cmluZ30sICdkYXRhJywgI3sxID0+ICJhIiwgMiA9PiAiYiJ9fQorICAgICAgXX0sCisgICAgICB0aHJpZnQzMjE0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnU3RyaW5nTWFwJykKKyAgICApfQorICBdLgorCistZW5kaWYuCistZW5kaWYuCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MTllODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDM1OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge3RfdHJhbnNwb3J0LCB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LCB7dF9idWZmZXJlZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19LAorICAgICAgICBbXQorICAgICAgfX19LAorICAgICAgbmV3KHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgW119fSkKKyAgICApfQorICBdLgorCisKK3JlYWQoRnJhbWUsIEJ5dGVzKSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OnJlYWQoRnJhbWUsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKworcmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6cmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge2Vycm9yLCBlb2Z9CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKword3JpdGUoRnJhbWVkLCBEYXRhKSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OndyaXRlKEZyYW1lZCwgRGF0YSkuCisKK3dyaXRlX3Rlc3RfKCkgLT4KKyAgWworICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBlbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBbXQorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCBbXV0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgWyJoYWxsbyB3b3JsZCJdCisgICAgICAgIH0sCisgICAgICAgIFtdCisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW1tdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA8PD4+CisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW1siaGFsbG8gd29ybGQiXSwgPDw+Pl0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgWyJoYWxsbyB3b3JsZCJdCisgICAgICAgIH0sCisgICAgICAgIDw8Pj4KKyAgICAgICkKKyAgICApfQorICBdLgorCisKK2ZsdXNoKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIFsKKyAgICB7ImZsdXNoIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICBmbHVzaCh7dF9idWZmZXJlZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIFtdCisgICAgICB9KQorICAgICl9LAorICAgIHsiZmx1c2ggbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICBbPDw+PiwgPDwiaGFsbG8gd29ybGQiPj5dCisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICBmbHVzaCh7dF9idWZmZXJlZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICB9KQorICAgICl9CisgIF0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAgeyJjbG9zZSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgIHt7dF9idWZmZXJlZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIFtdCisgICAgICB9LAorICAgICAgb2sKKyAgICB9LAorICAgIGNsb3NlKHt0X2J1ZmZlcmVkLAorICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICBbXQorICAgIH0pCisgICl9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhNzhjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApAQCAtMCwwICsxLDIxOSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfY29tcGFjdF9wcm90b2NvbCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2wuaHJsIikuCisKKworbmV3KFRyYW5zcG9ydCkgLT4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCkuCituZXcoKSAtPgorICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKSwKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCkuCisKK25ld190ZXN0KCkgLT4KKyAgbmV3KHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpKS4KKword3JpdGUoVGhpcywgVmFsdWUpIC0+IHRocmlmdF9wcm90b2NvbDp3cml0ZShUaGlzLCBWYWx1ZSkuCityZWFkKFRoaXMsIFR5cGUpIC0+IHRocmlmdF9wcm90b2NvbDpyZWFkKFRoaXMsIFR5cGUpLgorCitzdHIoVGhpczAsIFZhbHVlMCkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge3N0cmluZywgVmFsdWUwfSksCisgIHtUaGlzMiwge29rLCBWYWx1ZTF9fSA9IHJlYWQoVGhpczEsIHN0cmluZyksCisgID9hc3NlcnRFcXVhbChWYWx1ZTAsIGJpbmFyeV90b19saXN0KFZhbHVlMSkpLAorICB7VGhpczIsIG9rfS4KK3N0cmluZ190ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSBzdHIoVGhpczAsICJhYWEiKSwKKyAge1RoaXMyLCBva30gPSBzdHIoVGhpczEsICIiKSwKKyAge1RoaXMyLCBva30uCisKK3JvdW5kX3RyaXAoVGhpczAsIFR5cGUsIFZhbHVlMCkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge1R5cGUsIFZhbHVlMH0pLAorICB7VGhpczIsIHtvaywgVmFsdWUxfX0gPSByZWFkKFRoaXMxLCBUeXBlKSwKKyAgP2Fzc2VydEVxdWFsKFZhbHVlMCwgVmFsdWUxKSwKKyAge1RoaXMyLCBva30uCisKK2Jvb2xfdGVzdCgpIC0+CisgIHtvaywgVGhpczB9ID0gbmV3KCksCisgIHtUaGlzMSwgb2t9ID0gcm91bmRfdHJpcChUaGlzMCwgYm9vbCwgdHJ1ZSksCisgIHtUaGlzMiwgb2t9ID0gcm91bmRfdHJpcChUaGlzMSwgYm9vbCwgZmFsc2UpLAorICB7VGhpczIsIG9rfS4KKworYnl0ZShUaGlzMCwgVmFsdWUwKSAtPiByb3VuZF90cmlwKFRoaXMwLCBieXRlLCBWYWx1ZTApLgorYnl0ZV90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSBieXRlKFRoaXMwLCAwKSwKKyAge1RoaXMyLCBva30gPSBieXRlKFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gYnl0ZShUaGlzMiwgLTEpLAorICB7VGhpczQsIG9rfSA9IGJ5dGUoVGhpczMsIC0xMjgpLAorICB7VGhpczQsIG9rfS4KKworaTE2KFRoaXMwLCBWYWx1ZTApIC0+IHJvdW5kX3RyaXAoVGhpczAsIGkxNiwgVmFsdWUwKS4KK2kxNl90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSBpMTYoVGhpczAsIDApLAorICB7VGhpczIsIG9rfSA9IGkxNihUaGlzMSwgNDIpLAorICB7VGhpczMsIG9rfSA9IGkxNihUaGlzMiwgMzAwMDApLAorICB7VGhpczQsIG9rfSA9IGkxNihUaGlzMywgLTEpLAorICB7VGhpczUsIG9rfSA9IGkxNihUaGlzNCwgLTEyOCksCisgIHtUaGlzNiwgb2t9ID0gaTE2KFRoaXM1LCAtMzAwMDApLAorICB7VGhpczYsIG9rfS4KKworaTMyKFRoaXMwLCBWYWx1ZTApIC0+IHJvdW5kX3RyaXAoVGhpczAsIGkzMiwgVmFsdWUwKS4KK2kzMl90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSBpMzIoVGhpczAsIDApLAorICB7VGhpczIsIG9rfSA9IGkzMihUaGlzMSwgNDIpLAorICB7VGhpczMsIG9rfSA9IGkzMihUaGlzMiwgMzAwMDApLAorICB7VGhpczQsIG9rfSA9IGkzMihUaGlzMywgMjAwMDAwMDAwMiksCisgIHtUaGlzNSwgb2t9ID0gaTMyKFRoaXM0LCAtMSksCisgIHtUaGlzNiwgb2t9ID0gaTMyKFRoaXM1LCAtMTI4KSwKKyAge1RoaXM3LCBva30gPSBpMzIoVGhpczYsIC0zMDAwMCksCisgIHtUaGlzOCwgb2t9ID0gaTMyKFRoaXM3LCAtMjAwMDAwMDAwMiksCisgIHtUaGlzOCwgb2t9LgorCitpNjQoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTY0LCBWYWx1ZTApLgoraTY0X3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGk2NChUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTY0KFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTY0KFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTY0KFRoaXMzLCAyMDAwMDAwMDAyKSwKKyAge1RoaXM1LCBva30gPSBpNjQoVGhpczQsIDEwMDAwMDAwMDAwMDAwMDA2NCksCisgIHtUaGlzNiwgb2t9ID0gaTY0KFRoaXM1LCAtMSksCisgIHtUaGlzNywgb2t9ID0gaTY0KFRoaXM2LCAtMTI4KSwKKyAge1RoaXM4LCBva30gPSBpNjQoVGhpczcsIC0zMDAwMCksCisgIHtUaGlzOSwgb2t9ID0gaTY0KFRoaXM4LCAtMjAwMDAwMDAwMiksCisgIHtUaGlzMTAsIG9rfSA9IGk2NChUaGlzOSwgLTEwMDAwMDAwMDAwMDAwMDA2NCksCisgIHtUaGlzMTAsIG9rfS4KKworc3RydWN0X3Rlc3QoKSAtPgorICB7b2ssIFAwfSA9IG5ldygpLAorICB7UDEsIG9rfSA9IHdyaXRlKFAwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM30pLAorICB7UDIsIG9rfSA9IHdyaXRlKFAxLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pLAorICB7UDMsIG9rfSA9IHdyaXRlKFAyLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQxIiwgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSAxfSksCisgIHtQNCwgb2t9ID0gd3JpdGUoUDMsIHtieXRlLCA0Mn0pLAorICB7UDUsIG9rfSA9IHdyaXRlKFA0LCBmaWVsZF9lbmQpLAorICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSAxNH0pLAorICB7UDcsIG9rfSA9IHdyaXRlKFA2LCB7Ynl0ZSwgM30pLAorICB7UDgsIG9rfSA9IHdyaXRlKFA3LCBmaWVsZF9lbmQpLAorICB7UDksIG9rfSA9IHdyaXRlKFA4LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQzIiwgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSA0Mn0pLAorICB7UDEwLCBva30gPSB3cml0ZShQOSwge2J5dGUsIDh9KSwKKyAge1AxMSwgb2t9ID0gd3JpdGUoUDEwLCBmaWVsZF9lbmQpLAorICB7UDEyLCBva30gPSB3cml0ZShQMTEsIGZpZWxkX3N0b3ApLAorICB7UDEzLCBva30gPSB3cml0ZShQMTIsIHN0cnVjdF9lbmQpLAorICB7UDE0LCBva30gPSB3cml0ZShQMTMsIG1lc3NhZ2VfZW5kKSwKKworICB7UDE1LCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM319ID0gcmVhZChQMTQsIG1lc3NhZ2VfYmVnaW4pLAorICB7UDE2LCBva30gPSByZWFkKFAxNSwgc3RydWN0X2JlZ2luKSwKKyAge1AxNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDEgfX0gPSByZWFkKFAxNiwgZmllbGRfYmVnaW4pLAorICB7UDE4LCB7b2ssIDQyfX0gPSByZWFkKFAxNywgYnl0ZSksCisgIHtQMTksIG9rfSA9IHJlYWQoUDE4LCBmaWVsZF9lbmQpLAorICB7UDIwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfSTgsIGlkID0gMTQgfX0gPSByZWFkKFAxOSwgZmllbGRfYmVnaW4pLAorICB7UDIxLCB7b2ssIDN9fSA9IHJlYWQoUDIwLCBieXRlKSwKKyAge1AyMiwgb2t9ID0gcmVhZChQMjEsIGZpZWxkX2VuZCksCisgIHtQMjMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSA0MiB9fSA9IHJlYWQoUDIyLCBmaWVsZF9iZWdpbiksCisgIHtQMjQsIHtvaywgOH19ID0gcmVhZChQMjMsIGJ5dGUpLAorICB7UDI1LCBva30gPSByZWFkKFAyNCwgZmllbGRfZW5kKSwKKyAge1AyNiwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX1NUT1B9fSA9IHJlYWQoUDI1LCBmaWVsZF9iZWdpbiksCisgIHtQMjcsIG9rfSA9IHJlYWQoUDI2LCBzdHJ1Y3RfZW5kKSwKKyAge1AyOCwgb2t9ID0gcmVhZChQMjcsIG1lc3NhZ2VfZW5kKSwKKyAge1AyOCwgb2t9LgorCitib29sX2ZpZWxkX3Rlc3QoKSAtPgorICB7b2ssIFAwfSA9IG5ldygpLAorICB7UDEsIG9rfSA9IHdyaXRlKFAwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM30pLAorICB7UDIsIG9rfSA9IHdyaXRlKFAxLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pLAorICB7UDMsIG9rfSA9IHdyaXRlKFAyLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQxIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDF9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2Jvb2wsIHRydWV9KSwKKyAge1A1LCBva30gPSB3cml0ZShQNCwgZmllbGRfZW5kKSwKKyAge1A2LCBva30gPSB3cml0ZShQNSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMiIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxNH0pLAorICB7UDcsIG9rfSA9IHdyaXRlKFA2LCB7Ym9vbCwgZmFsc2V9KSwKKyAge1A4LCBva30gPSB3cml0ZShQNywgZmllbGRfZW5kKSwKKyAge1A5LCBva30gPSB3cml0ZShQOCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMyIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSA0Mn0pLAorICB7UDEwLCBva30gPSB3cml0ZShQOSwge2Jvb2wsIHRydWV9KSwKKyAge1AxMSwgb2t9ID0gd3JpdGUoUDEwLCBmaWVsZF9lbmQpLAorICB7UDEyLCBva30gPSB3cml0ZShQMTEsIGZpZWxkX3N0b3ApLAorICB7UDEzLCBva30gPSB3cml0ZShQMTIsIHN0cnVjdF9lbmQpLAorICB7UDE0LCBva30gPSB3cml0ZShQMTMsIG1lc3NhZ2VfZW5kKSwKKworICB7UDE1LCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM319ID0gcmVhZChQMTQsIG1lc3NhZ2VfYmVnaW4pLAorICB7UDE2LCBva30gPSByZWFkKFAxNSwgc3RydWN0X2JlZ2luKSwKKyAge1AxNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMSB9fSA9IHJlYWQoUDE2LCBmaWVsZF9iZWdpbiksCisgIHtQMTgsIHtvaywgdHJ1ZX19ID0gcmVhZChQMTcsIGJvb2wpLAorICB7UDE5LCBva30gPSByZWFkKFAxOCwgZmllbGRfZW5kKSwKKyAge1AyMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMTQgfX0gPSByZWFkKFAxOSwgZmllbGRfYmVnaW4pLAorICB7UDIxLCB7b2ssIGZhbHNlfX0gPSByZWFkKFAyMCwgYm9vbCksCisgIHtQMjIsIG9rfSA9IHJlYWQoUDIxLCBmaWVsZF9lbmQpLAorICB7UDIzLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSA0MiB9fSA9IHJlYWQoUDIyLCBmaWVsZF9iZWdpbiksCisgIHtQMjQsIHtvaywgdHJ1ZX19ID0gcmVhZChQMjMsIGJvb2wpLAorICB7UDI1LCBva30gPSByZWFkKFAyNCwgZmllbGRfZW5kKSwKKyAge1AyNiwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX1NUT1B9fSA9IHJlYWQoUDI1LCBmaWVsZF9iZWdpbiksCisgIHtQMjcsIG9rfSA9IHJlYWQoUDI2LCBzdHJ1Y3RfZW5kKSwKKyAge1AyOCwgb2t9ID0gcmVhZChQMjcsIG1lc3NhZ2VfZW5kKSwKKyAge1AyOCwgb2t9LgorCituZXN0aW5nX3Rlc3QoKSAtPgorICB7b2ssIFAwfSA9IG5ldygpLAorICB7UDEsIG9rfSA9IHdyaXRlKFAwLCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsgbmFtZSA9ICJNZXNzYWdlMSIsIHR5cGUgPSA/dFR5cGVfSTgsIHNlcWlkID0gM30pLAorICB7UDIsIG9rfSA9IHdyaXRlKFAxLCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pLAorICB7UDMsIG9rfSA9IHdyaXRlKFAyLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQxIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0fSksCisgIHtQNCwgb2t9ID0gd3JpdGUoUDMsIHtib29sLCB0cnVlfSksCisgIHtQNSwgb2t9ID0gd3JpdGUoUDQsIGZpZWxkX2VuZCksCisKKyAge1A2LCBva30gPSB3cml0ZShQNSwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMiIsIHR5cGUgPSA/dFR5cGVfU1RSVUNULCBpZCA9IDI4fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQOCwgb2t9ID0gd3JpdGUoUDcsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDJfMSIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAzMDAwMH0pLAorICB7UDksIG9rfSA9IHdyaXRlKFA4LCB7Ym9vbCwgZmFsc2V9KSwKKyAge1AxMCwgb2t9ID0gd3JpdGUoUDksIGZpZWxkX2VuZCksCisgIHtQMTEsIG9rfSA9IHdyaXRlKFAxMCwgZmllbGRfc3RvcCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgc3RydWN0X2VuZCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgZmllbGRfZW5kKSwKKworICB7UDE0LCBva30gPSB3cml0ZShQMTMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDMiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gNDJ9KSwKKyAge1AxNSwgb2t9ID0gd3JpdGUoUDE0LCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDE2LCBva30gPSB3cml0ZShQMTUsIGZpZWxkX2VuZCksCisgIHtQMTcsIG9rfSA9IHdyaXRlKFAxNiwgZmllbGRfc3RvcCksCisgIHtQMTgsIG9rfSA9IHdyaXRlKFAxNywgc3RydWN0X2VuZCksCisgIHtQMTksIG9rfSA9IHdyaXRlKFAxOCwgbWVzc2FnZV9lbmQpLAorCisgIHtQMjAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxOSwgbWVzc2FnZV9iZWdpbiksCisgIHtQMjEsIG9rfSA9IHJlYWQoUDIwLCBzdHJ1Y3RfYmVnaW4pLAorICB7UDIyLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxNCB9fSA9IHJlYWQoUDIxLCBmaWVsZF9iZWdpbiksCisgIHtQMjMsIHtvaywgdHJ1ZX19ID0gcmVhZChQMjIsIGJvb2wpLAorICB7UDI0LCBva30gPSByZWFkKFAyMywgZmllbGRfZW5kKSwKKworICB7UDI1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RSVUNULCBpZCA9IDI4IH19ID0gcmVhZChQMjQsIGZpZWxkX2JlZ2luKSwKKyAge1AyNiwgb2t9ID0gcmVhZChQMjUsIHN0cnVjdF9iZWdpbiksCisgIHtQMjcsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDMwMDAwIH19ID0gcmVhZChQMjYsIGZpZWxkX2JlZ2luKSwKKyAge1AyOCwge29rLCBmYWxzZX19ID0gcmVhZChQMjcsIGJvb2wpLAorICB7UDI5LCBva30gPSByZWFkKFAyOCwgZmllbGRfZW5kKSwKKyAge1AzMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX1NUT1AgfX0gPSByZWFkKFAyOSwgZmllbGRfYmVnaW4pLAorICB7UDMxLCBva30gPSByZWFkKFAzMCwgc3RydWN0X2VuZCksCisgIHtQMzIsIG9rfSA9IHJlYWQoUDMxLCBmaWVsZF9lbmQpLAorCisgIHtQMzMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyIH19ID0gcmVhZChQMzIsIGZpZWxkX2JlZ2luKSwKKyAge1AzNCwge29rLCB0cnVlfX0gPSByZWFkKFAzMywgYm9vbCksCisgIHtQMzUsIG9rfSA9IHJlYWQoUDM0LCBmaWVsZF9lbmQpLAorICB7UDM2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUCB9fSA9IHJlYWQoUDM1LCBmaWVsZF9iZWdpbiksCisgIHtQMzcsIG9rfSA9IHJlYWQoUDM2LCBzdHJ1Y3RfZW5kKSwKKyAge1AzOCwgb2t9ID0gcmVhZChQMzcsIG1lc3NhZ2VfZW5kKSwKKyAge1AzOCwgb2t9LgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1YzFkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSwyMTMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoRmlsZSkgLT4gdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0Om5ldyhGaWxlKS4KK25ldyhGaWxlLCBPcHRzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6bmV3KEZpbGUsIE9wdHMpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCByZWFkfX19LAorICAgICAgbmV3KGFfZmFrZV9maWxlLCBbe21vZGUsIHJlYWR9XSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHdyaXRlIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LCB7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7bW9kZSwgd3JpdGV9XSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHNob3VsZF9jbG9zZSB0cnVlIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LCB7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7c2hvdWxkX2Nsb3NlLCB0cnVlfV0pCisgICAgKX0sCisgICAgeyJuZXcgZmlsZSBpbiBzaG91bGRfY2xvc2UgZmFsc2UgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCBmYWxzZSwgd3JpdGV9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7c2hvdWxkX2Nsb3NlLCBmYWxzZX1dKQorICAgICl9CisgIF0uCisKKworcmVhZChGaWxlLCBCeXRlcykgLT4gdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0OnJlYWQoRmlsZSwgQnl0ZXMpLgorCityZWFkX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhmaWxlLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGZpbGUsIHJlYWQsIGZ1bihCaW4sIE4pIC0+CisgICAgICAgIHtSZXN1bHQsIF99ID0gc3BsaXRfYmluYXJ5KEJpbiwgbWluKGlvbGlzdF9zaXplKEJpbiksIE4pKSwKKyAgICAgICAge29rLCBSZXN1bHR9CisgICAgICBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBlbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PD4+LCB0cnVlLCByZWFkfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8ImhhbGxvIHdvcmxkIj4+LCB0cnVlLCByZWFkfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDAgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBmaWxlIGluIHdyaXRlIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge2Vycm9yLCB3cml0ZV9tb2RlfX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDw+PiwgdHJ1ZSwgd3JpdGV9LCAxKQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworcmVhZF9leGFjdChGaWxlLCBCeXRlcykgLT4gdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0OnJlYWRfZXhhY3QoRmlsZSwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhmaWxlLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGZpbGUsIHJlYWQsIGZ1bihCaW4sIE4pIC0+CisgICAgICAgIHtSZXN1bHQsIF99ID0gc3BsaXRfYmluYXJ5KEJpbiwgbWluKGlvbGlzdF9zaXplKEJpbiksIE4pKSwKKyAgICAgICAge29rLCBSZXN1bHR9CisgICAgICBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDw+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCByZWFkfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8ImhhbGxvIHdvcmxkIj4+LCB0cnVlLCByZWFkfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8ImhhbGxvIHdvcmxkIj4+LCB0cnVlLCByZWFkfSwgNjU1MzYpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDAgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDEpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCit3cml0ZShGaWxlLCBEYXRhKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6d3JpdGUoRmlsZSwgRGF0YSkuCisKK3dyaXRlX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhmaWxlLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGZpbGUsIHdyaXRlLCBmdW4oXywgXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZmlsZSkgZW5kLAorICAgIFsKKyAgICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgW10pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCA8PD4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgImhhbGxvIHdvcmxkIikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgPDwiaGFsbG8gd29ybGQiPj4pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBiaW5hcnkgdG8gZmlsZSBpbiByZWFkIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge2Vycm9yLCByZWFkX21vZGV9fSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHJlYWR9LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGxpc3QgdG8gZmlsZSBpbiByZWFkIG1vZGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge2Vycm9yLCByZWFkX21vZGV9fSwKKyAgICAgICAgd3JpdGUoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHJlYWR9LCAiaGFsbG8gd29ybGQiKQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KS4KKworZmx1c2hfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgc3luYywgZnVuKF9GaWxlKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJmbHVzaCBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgZmx1c2goe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSkKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhmaWxlLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGZpbGUsIGNsb3NlLCBmdW4oXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZmlsZSkgZW5kLAorICAgIFsKKyAgICAgIHsiY2xvc2UgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBva30sCisgICAgICAgIGNsb3NlKHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0pCisgICAgICApfQorICAgIF0KKyAgfS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1MzhhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDQwNCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKworbmV3KFRyYW5zcG9ydCkgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge3RfdHJhbnNwb3J0LCB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCwge3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIFtdfX0sCisgICAgICAgIFtdLAorICAgICAgICBbXQorICAgICAgfX19LAorICAgICAgbmV3KHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgW119fSkKKyAgICApfQorICBdLgorCisKK3JlYWQoRnJhbWUsIEJ5dGVzKSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpyZWFkKEZyYW1lLCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBhbiBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDwiYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDw+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKworcmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoRnJhbWUsIEJ5dGVzKS4KKworcmVhZF9leGFjdF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gYW4gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PD4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIDw8Pj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW1tdLDw8ImhhbGxvIHdvcmxkIj4+XSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7ZXJyb3IsIGVvZn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgNjU1MzYKKyAgICAgICkKKyAgICApfQorICBdLgorCisKK3dyaXRlKEZyYW1lZCwgRGF0YSkgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6d3JpdGUoRnJhbWVkLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1tdLCBbXV0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIFtdCisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1siaGFsbG8gd29ybGQiXSwgW11dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtbXSwgPDw+Pl0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDw8Pj4KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBub25lbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtbImhhbGxvIHdvcmxkIl0sIDw8Pj5dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9CisgIF0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIFsKKyAgICB7ImZsdXNoIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2ZyYW1lZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIFtdLAorICAgICAgICBbXQorICAgICAgfSkKKyAgICApfSwKKyAgICB7ImZsdXNoIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICBbPDw+PiwgWzw8MCwgMCwgMCwgMTE+PiwgPDwiaGFsbG8gd29ybGQiPj5dXQorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgZmx1c2goe3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICB9KQorICAgICl9CisgIF0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpjbG9zZShUcmFuc3BvcnQpLgorCitjbG9zZV90ZXN0XygpIC0+CisgIHsiY2xvc2UgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X2ZyYW1lZCwKKyAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgIFtdLAorICAgICAgICBbXQorICAgICAgfSwKKyAgICAgIG9rCisgICAgfSwKKyAgICBjbG9zZSh7dF9mcmFtZWQsCisgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgIFtdLAorICAgICAgW10KKyAgICB9KQorICApfS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODljNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSwxNjcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldygpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLgorbmV3KERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldyhEYXRhKS4KKworbmV3X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmV3IGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsIFtdfX19LAorICAgICAgbmV3KCkKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCA8PD4+IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIF8sIHt0X21lbWJ1ZmZlciwgWzw8Pj5dfX19LAorICAgICAgbmV3KDw8Pj4pCisgICAgKX0sCisgICAgeyJuZXcgbWVtYnVmZmVyIHdpdGggW10iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbXX19fSwKKyAgICAgIG5ldyhbXSkKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCA8PFwiaGFsbG8gd29ybGRcIj4+IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIF8sIHt0X21lbWJ1ZmZlciwgWzw8ImhhbGxvIHdvcmxkIj4+XX19fSwKKyAgICAgIG5ldyg8PCJoYWxsbyB3b3JsZCI+PikKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCBcImhhbGxvIHdvcmxkXCIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCAiaGFsbG8gd29ybGQifX19LAorICAgICAgbmV3KCJoYWxsbyB3b3JsZCIpCisgICAgKX0KKyAgXS4KKworCityZWFkKE1lbWJ1ZmZlciwgQnl0ZXMpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWQoTWVtYnVmZmVyLCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtdfSwgMCkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gYW4gZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59LCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgMCkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIDw8ImFsbG8gd29ybGQiPj59LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgMSkKKyAgICApfSwKKyAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIDw8Pj59LCB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICByZWFkKHt0X21lbWJ1ZmZlciwgW1siaGFsbG8iLCAiICJdLCAid29ybGQiXX0sIDY1NTM2KQorICAgICl9CisgIF0uCisKKworcmVhZF9leGFjdChNZW1idWZmZXIsIEJ5dGVzKSAtPgorICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpyZWFkX2V4YWN0KE1lbWJ1ZmZlciwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtdfSwgMCkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW119LCAxKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59LCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWRfZXhhY3Qoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgMCkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAxKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3Qoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgNjU1MzYpCisgICAgKX0KKyAgXS4KKworCit3cml0ZShNZW1idWZmZXIsIERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OndyaXRlKE1lbWJ1ZmZlciwgRGF0YSkuCisKK3dyaXRlX3Rlc3RfKCkgLT4KKyAgWworICAgIHsid3JpdGUgZW1wdHkgbGlzdCB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCBbXV19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFtdfSwgW10pCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbImhhbGxvIHdvcmxkIiwgW11dfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCAiaGFsbG8gd29ybGQifSwgW10pCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbXSwgPDw+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFtdfSwgPDw+PikKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgWyJoYWxsbyB3b3JsZCIsIDw8Pj5dfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCAiaGFsbG8gd29ybGQifSwgPDw+PikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgbGlzdCB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCAiaGFsbG8gd29ybGQiXX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCAiaGFsbG8gd29ybGQiKQorICAgICl9LAorICAgIHsid3JpdGUgYSBsaXN0IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCBbImhhbGxvIiwgIiAiXX0sICJ3b3JsZCIpCisgICAgKX0sCisgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCA8PCJoYWxsbyB3b3JsZCI+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFtdfSwgPDwiaGFsbG8gd29ybGQiPj4pCisgICAgKX0sCisgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1siaGFsbG8iLCAiICJdLCA8PCJ3b3JsZCI+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFsiaGFsbG8iLCAiICJdfSwgPDwid29ybGQiPj4pCisgICAgKX0KKyAgXS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtdfSwgb2t9LAorICAgICAgZmx1c2goe3RfbWVtYnVmZmVyLCBbXX0pCisgICAgKX0sCisgICAgeyJmbHVzaCBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgWzw8ImhhbGxvIHdvcmxkIj4+XX0sIG9rfSwKKyAgICAgIGZsdXNoKHt0X21lbWJ1ZmZlciwgWzw8ImhhbGxvIHdvcmxkIj4+XX0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAgeyJjbG9zZSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgIHt7dF9tZW1idWZmZXIsIF99LCBva30sCisgICAgY2xvc2Uoe3RfbWVtYnVmZmVyLCBbXX0pCisgICl9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmMwZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMTk5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoU29ja2V0KSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0KS4KK25ldyhTb2NrZXQsIE9wdHMpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIE9wdHMpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCB7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX19fSwKKyAgICAgIG5ldyhhX2Zha2Vfc29ja2V0KQorICAgICl9LAorICAgIHsibmV3IHNvY2tldCB3aXRoIG5vIG9wdGlvbnMiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQsIFtdKQorICAgICl9LAorICAgIHsibmV3IHNvY2tldCB3aXRoIGludGVnZXIgdGltZW91dCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA1MDAwLCBbXX19fSwKKyAgICAgIG5ldyhhX2Zha2Vfc29ja2V0LCBbe3JlY3ZfdGltZW91dCwgNTAwMH1dKQorICAgICl9LAorICAgIHsibmV3IHNvY2tldCB3aXRoIGluZmluaXR5IHRpbWVvdXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgaW5maW5pdHksIFtdfX19LAorICAgICAgbmV3KGFfZmFrZV9zb2NrZXQsIFt7cmVjdl90aW1lb3V0LCBpbmZpbml0eX1dKQorICAgICl9CisgIF0uCisKKworcmVhZChTb2NrZXQsIEJ5dGVzKSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpyZWFkKFNvY2tldCwgQnl0ZXMpLgorCityZWFkX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhnZW5fdGNwLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIHJlY3YsIGZ1bihCaW4sIDAsIF8pIC0+IHtvaywgQmlufSBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChnZW5fdGNwKSBlbmQsCisgICAgWworICAgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBlbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PD4+LCA2MDAwMCwgW119LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDw+PiwgNjAwMDAsIFtdfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBffSwge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImFsbG8gd29ybGQiPj59LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwiYWxsbyI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgNiBieXRlIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJ3b3JsZCI+Pn0sIHtvaywgPDwiaGFsbG8gIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDYpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8Pj59LCB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDY1NTM2KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworcmVhZF9leGFjdChTb2NrZXQsIEJ5dGVzKSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KFNvY2tldCwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhnZW5fdGNwLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIHJlY3YsIGZ1bihCaW4sIE4sIF8pIC0+CisgICAgICAgIGNhc2UgTiBvZgorICAgICAgICAgIDAgLT4ge29rLCBCaW59OworICAgICAgICAgIDEgLT4ge29rLCA8PCJoIj4+fTsKKyAgICAgICAgICBOIHdoZW4gTiA+IDIgLT4ge2Vycm9yLCB0aW1lb3V0fQorICAgICAgICBlbmQKKyAgICAgIGVuZCksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCBjbG9zZSwgZnVuKF8pIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGdlbl90Y3ApIGVuZCwKKyAgICBbCisgICAgICB7InJlYWRfZXhhY3QgemVybyBieXRlcyBmcm9tIGVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8Pj4sIDYwMDAwLCBbXX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgX30sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCAxIGJ5dGUgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBbXX0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBbXX0sIHtlcnJvciwgdGltZW91dH19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgMSBieXRlIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJhbGxvIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCIgd29ybGQiPj4sIDYwMDAwLCA8PCJoYWxsbyI+Pn0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZF9leGFjdCA2IGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIFtdfSwge29rLCA8PCJtb3JlIGgiPj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8ImhhbGxvIj4+LCA2MDAwMCwgPDwibW9yZSAiPj59LCA2KQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgYSB6aWxsaW9uIGJ5dGVzIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJoYWxsbyI+Pn0sIHtlcnJvciwgdGltZW91dH19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCA2NTUzNikKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK3dyaXRlKFNvY2tldCwgRGF0YSkgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6d3JpdGUoU29ja2V0LCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGdlbl90Y3AsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgc2VuZCwgZnVuKF8sIF8pIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGdlbl90Y3ApIGVuZCwKKyAgICBbCisgICAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIFtdKQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICAgIHdyaXRlKHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgPDw+PikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGxpc3QgdG8gc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sICJoYWxsbyB3b3JsZCIpCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBiaW5hcnkgdG8gc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIFsKKyAgICB7ImZsdXNoIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBva30sCisgICAgICBmbHVzaCh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhnZW5fdGNwLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIGNsb3NlLCBmdW4oXykgLT4gb2sgZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsiY2xvc2UgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICBjbG9zZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0pCisgICAgICApfQorICAgIF0KKyAgfS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxOGI4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0LmVybApAQCAtMCwwICsxLDQ5IEBACistbW9kdWxlICh0aHJpZnRfc29ja2V0X3NlcnZlcl90ZXN0KS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSAoInRocmlmdF9jb25zdGFudHMuaHJsIikuCisKK3BhcnNlX2hhbmRsZXJfb3B0aW9uc190ZXN0XygpIC0+CisgICAgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdCA9IFt7P01VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIE1pc3NpbmdFcnJvckhhbmRsZXJPcHRpb25MaXN0ICAgPSBbeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIFdyb25nU2VydmljZTJIYW5kbGVyT3B0aW9uTGlzdCAgPSBbez9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgP01PRFVMRX0sIHsiU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsICJNb2R1bGUifV0sCisgICAgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdCAgICAgICA9IFt7P01VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCA/TU9EVUxFfSwgeydzZXJ2aWNlMScsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIENvcnJlY3RIYW5kbGVyVGVzdEZ1bmN0aW9uID0gZnVuKCkgLT4KKyAgICAgICAgP2Fzc2VydE1hdGNoKHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLF8sXyxfLF8sXyxfLF8sXyxfLF8sXyxffSwgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3R9XSkpLAorICAgICAgICB7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyxfLCBIYW5kbGVyTGlzdCxfLF8sXyxfLF8sXyxfLF8sXyxffSA9IHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0fV0pLAorICAgICAgICBsaXN0czpmb3JlYWNoKGZ1bgorICAgICAgICAgICAgKHtTZXJ2aWNlTmFtZSwgSGFuZGxlck1vZHVsZX0pIC0+CisgICAgICAgICAgICAgICAgP2Fzc2VydE1hdGNoKHtvaywgSGFuZGxlck1vZHVsZX0gd2hlbiBpc19hdG9tKEhhbmRsZXJNb2R1bGUpLCB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6ZmluZChTZXJ2aWNlTmFtZSwgSGFuZGxlckxpc3QpKQorICAgICAgICBlbmQsIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3QpCisgICAgZW5kLAorICAgIFsKKyAgICAgeyJCYWQgYXJndW1lbnQgZm9yIHRoZSBoYW5kbGVyIG9wdGlvbiIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFtdfV0pKX0sCisgICAgIHsiVHJ5IHRvIHBhcnNlIHRoZSBoYW5kbGVyIG9wdGlvbiB0d2ljZSIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsID9NT0RVTEV9LCB7aGFuZGxlciwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IlBhcnNlIHRoZSBoYW5kbGVyIG9wdGlvbiBhcyBhIG5vbiBtdWx0aXBsZXhlZCBzZXJ2aWNlIGhhbmRsZXIiLCA/X2Fzc2VydE1hdGNoKHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLF8sP01PRFVMRSxfLF8sXyxfLF8sXyxfLF8sXyxffSwgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsID9NT0RVTEV9XSkpfSwKKyAgICAgeyJObyBlcnJvciBoYW5kbGVyIHdhcyBkZWZpbmVkIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgTWlzc2luZ0Vycm9ySGFuZGxlck9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJCYWQgaGFuZGxlciBtb2R1bGUgZm9yIFNlcnZpY2UyIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgV3JvbmdTZXJ2aWNlMkhhbmRsZXJPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiQmFkIHNlcnZpY2Uga2V5IGZvciBTZXJ2aWNlMSIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFdyb25nU2VydmljZUtleU9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJUcnkgdG8gcGFyc2UgYSBjb3JyZWN0IGhhbmRsZXIgb3B0aW9uIGxpc3QiLCBDb3JyZWN0SGFuZGxlclRlc3RGdW5jdGlvbn0KKyAgICBdLgorCitwYXJzZV9zZXJ2aWNlX29wdGlvbnNfdGVzdF8oKSAtPgorICAgIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdCA9IFt7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgV3JvbmdTZXJ2aWNlMk1vZHVsZU9wdGlvbkxpc3QgID0gW3siU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsICJ0aHJpZnRfc2VydmljZV9tb2R1bGUifV0sCisgICAgV3JvbmdTZXJ2aWNlS2V5T3B0aW9uTGlzdCAgICAgICA9IFt7J3NlcnZpY2UxJywgP01PRFVMRX0sIHsiU2VydmljZTIiLCA/TU9EVUxFfV0sCisgICAgQ29ycmVjdFNlcnZpY2VNb2R1bGVUZXN0RnVuY3Rpb24gPSBmdW4oKSAtPgorICAgICAgICA/YXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0fV0pKSwKKyAgICAgICAge3RocmlmdF9zb2NrZXRfc2VydmVyLF8sIFNlcnZpY2VNb2R1bGVMaXN0LF8sXyxfLF8sXyxfLF8sXyxfLF8sX30gPSB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0fV0pLAorICAgICAgICBsaXN0czpmb3JlYWNoKGZ1bgorICAgICAgICAgICAgKHtTZXJ2aWNlTmFtZSwgU2VydmljZU1vZHVsZX0pIC0+CisgICAgICAgICAgICAgICAgP2Fzc2VydE1hdGNoKHtvaywgU2VydmljZU1vZHVsZX0gd2hlbiBpc19hdG9tKFNlcnZpY2VNb2R1bGUpLCB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6ZmluZChTZXJ2aWNlTmFtZSwgU2VydmljZU1vZHVsZUxpc3QpKQorICAgICAgICBlbmQsIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdCkKKyAgICBlbmQsCisgICAgWworICAgICB7IkJhZCBhcmd1bWVudCBmb3IgdGhlIHNlcnZpY2Ugb3B0aW9uIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgW119XSkpfSwKKyAgICAgeyJUcnkgdG8gcGFyc2UgdGhlIHNlcnZpY2Ugb3B0aW9uIHR3aWNlIiwgP19hc3NlcnRUaHJvdyhfLCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgP01PRFVMRX0sIHtzZXJ2aWNlLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJQYXJzZSBhIHNlcnZpY2UgbW9kdWxlIGZvciBhIG5vbiBtdWx0aXBsZXhlZCBzZXJ2aWNlIiwgP19hc3NlcnRNYXRjaCh7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyw/TU9EVUxFLF8sXyxfLF8sXyxfLF8sXyxfLF8sX30sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCA/TU9EVUxFfV0pKX0sCisgICAgIHsiQmFkIHNlcnZpY2UgbW9kdWxlIGZvciBTZXJ2aWNlMiIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFdyb25nU2VydmljZTJNb2R1bGVPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiQmFkIHNlcnZpY2Uga2V5IGZvciBTZXJ2aWNlMSIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFdyb25nU2VydmljZUtleU9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJUcnkgdG8gcGFyc2UgYSBjb3JyZWN0IHNlcnZpY2Ugb3B0aW9uIGxpc3QiLCBDb3JyZWN0U2VydmljZU1vZHVsZVRlc3RGdW5jdGlvbn0KKyAgICBdLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3RocmlmdF90ZXN0X3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L3RocmlmdF90ZXN0X3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGY2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwKQEAgLTAsMCArMSw2NDMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCislIGRvbid0IHJlbmFtZSB0aGlzIHRocmlmdF90ZXN0LCBpdCBjbG9iYmVycyBnZW5lcmF0ZWQgZmlsZXMKKy1tb2R1bGUodGhyaWZ0X3Rlc3RfdGVzdCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfdGVzdF9jb25zdGFudHMuaHJsIikuCisKK2NvbnN0YW50X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibXlOdW1iZXJ6IGVxdWFscyAxIiwgP19hc3NlcnRFcXVhbCgxLCA/VEhSSUZUX1RFU1RfTVlOVU1CRVJaKX0KKyAgXS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJCb25rIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkJvbmsnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuQm9uayd7bWVzc2FnZT1udWxsLHR5cGU9bnVsbH0KKyAgICApfSwKKyAgICB7IkJvb2xzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkJvb2xzJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkJvb2xzJ3tpbV90cnVlPW51bGwsaW1fZmFsc2U9bnVsbH0KKyAgICApfSwKKyAgICB7Ilh0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YdHJ1Y3QnLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmc9bnVsbCxieXRlX3RoaW5nPW51bGwsaTMyX3RoaW5nPW51bGwsaTY0X3RoaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJYdHJ1Y3QyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Llh0cnVjdDInLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0Mid7Ynl0ZV90aGluZz1udWxsLHN0cnVjdF90aGluZz1udWxsLGkzMl90aGluZz1udWxsfQorICAgICl9LAorICAgIHsiWHRydWN0MyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YdHJ1Y3QzJywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Llh0cnVjdDMne3N0cmluZ190aGluZz1udWxsLGNoYW5nZWQ9bnVsbCxpMzJfdGhpbmc9bnVsbCxpNjRfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7Ikluc2FuaXR5IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lkluc2FuaXR5JywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lkluc2FuaXR5J3t1c2VyTWFwPW51bGwseHRydWN0cz1udWxsfQorICAgICl9LAorICAgIHsiQ3JhenlOZXN0aW5nIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkNyYXp5TmVzdGluZycsIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5DcmF6eU5lc3RpbmcneworICAgICAgICBzdHJpbmdfZmllbGQ9bnVsbCwKKyAgICAgICAgc2V0X2ZpZWxkPW51bGwsCisgICAgICAgIGxpc3RfZmllbGQ9bnVsbCwKKyAgICAgICAgYmluYXJ5X2ZpZWxkPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlhjZXB0aW9uIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlhjZXB0aW9uJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3tlcnJvckNvZGU9bnVsbCxtZXNzYWdlPW51bGx9CisgICAgKX0sCisgICAgeyJYY2VwdGlvbjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWGNlcHRpb24yJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7ZXJyb3JDb2RlPW51bGwsc3RydWN0X3RoaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJFbXB0eVN0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3QnfSwgIyd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCd7fSl9LAorICAgIHsiT25lRmllbGQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J3RocmlmdC50ZXN0Lk9uZUZpZWxkJywgX30sICMndGhyaWZ0LnRlc3QuT25lRmllbGQne2ZpZWxkPW51bGx9KX0sCisgICAgeyJWZXJzaW9uaW5nVGVzdFYxIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjEnLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMSd7YmVnaW5faW5fYm90aD1udWxsLG9sZF9zdHJpbmc9bnVsbCxlbmRfaW5fYm90aD1udWxsfQorICAgICl9LAorICAgIHsiVmVyc2lvbmluZ1Rlc3RWMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJywgXywgXywgXywgXywgXywgXywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjIneworICAgICAgICBiZWdpbl9pbl9ib3RoPW51bGwsCisgICAgICAgIG5ld2ludD1udWxsLAorICAgICAgICBuZXdieXRlPW51bGwsCisgICAgICAgIG5ld3Nob3J0PW51bGwsCisgICAgICAgIG5ld2xvbmc9bnVsbCwKKyAgICAgICAgbmV3ZG91YmxlPW51bGwsCisgICAgICAgIG5ld3N0cnVjdD1udWxsLAorICAgICAgICBuZXdsaXN0PW51bGwsCisgICAgICAgIG5ld3NldD1udWxsLAorICAgICAgICBuZXdtYXA9bnVsbCwKKyAgICAgICAgbmV3c3RyaW5nPW51bGwsCisgICAgICAgIGVuZF9pbl9ib3RoPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YxIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YxJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YxJ3tteWludHM9bnVsbCxoZWxsbz1udWxsfQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjInLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjIne3N0cmluZ3M9bnVsbCxoZWxsbz1udWxsfQorICAgICl9LAorICAgIHsiR3Vlc3NQcm90b2NvbFN0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0JywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3Qne21hcF9maWVsZD1udWxsfQorICAgICl9LAorICAgIHsiTGFyZ2VEZWx0YXMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTGFyZ2VEZWx0YXMnLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTGFyZ2VEZWx0YXMneworICAgICAgICBiMT1udWxsLAorICAgICAgICBiMTA9bnVsbCwKKyAgICAgICAgYjEwMD1udWxsLAorICAgICAgICBjaGVja190cnVlPW51bGwsCisgICAgICAgIGIxMDAwPW51bGwsCisgICAgICAgIGNoZWNrX2ZhbHNlPW51bGwsCisgICAgICAgIHZlcnR3bzIwMDA9bnVsbCwKKyAgICAgICAgYV9zZXQyNTAwPW51bGwsCisgICAgICAgIHZlcnR3bzMwMDA9bnVsbCwKKyAgICAgICAgYmlnX251bWJlcnM9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNJMzJ4MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngyJywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDIne2ludGVnZXJsaXN0PW51bGx9CisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0kzMngzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDMnLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4Myd7aW50ZWdlcmxpc3Q9bnVsbH0KKyAgICApfSwKKyAgICB7Ik5lc3RlZE1peGVkeDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTmVzdGVkTWl4ZWR4MicsIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRNaXhlZHgyJ3sKKyAgICAgICAgaW50X3NldF9saXN0PW51bGwsCisgICAgICAgIG1hcF9pbnRfc3Ryc2V0PW51bGwsCisgICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiTGlzdEJvbmtzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeyd0aHJpZnQudGVzdC5MaXN0Qm9ua3MnLCBffSwgIyd0aHJpZnQudGVzdC5MaXN0Qm9ua3Mne2Jvbms9bnVsbH0pfSwKKyAgICB7Ik5lc3RlZExpc3RzQm9uayByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0JvbmsnLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNCb25rJ3tib25rPW51bGx9CisgICAgKX0sCisgICAgeyJCb29sVGVzdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5Cb29sVGVzdCcsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5Cb29sVGVzdCd7Yj1udWxsLHM9bnVsbH0KKyAgICApfSwKKyAgICB7IlN0cnVjdEEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J3RocmlmdC50ZXN0LlN0cnVjdEEnLCBffSwgIyd0aHJpZnQudGVzdC5TdHJ1Y3RBJ3tzPW51bGx9KX0sCisgICAgeyJTdHJ1Y3RCIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlN0cnVjdEInLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuU3RydWN0Qid7YWE9bnVsbCxhYj1udWxsfQorICAgICl9CisgIF0uCisKK3N0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiQm9uayBkZWZpbml0aW9uIChzaG9ydCB2ZXJzaW9uKSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHN0cmluZ30sIHsyLCBpMzJ9XX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygndGhyaWZ0LnRlc3QuQm9uaycpCisgICAgKX0sCisgICAgeyJCb25rIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIG1lc3NhZ2UsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGkzMiwgdHlwZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkJvbmsnKQorICAgICl9LAorICAgIHsiQm9vbHMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIGltX3RydWUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIGltX2ZhbHNlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuQm9vbHMnKQorICAgICl9LAorICAgIHsiWHRydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ190aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYnl0ZSwgYnl0ZV90aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezksIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMSwgdW5kZWZpbmVkLCBpNjQsIGk2NF90aGluZywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Llh0cnVjdCcpCisgICAgKX0sCisgICAgeyJYdHJ1Y3QyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBieXRlLCBieXRlX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwgc3RydWN0X3RoaW5nLCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7fX0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWHRydWN0MicpCisgICAgKX0sCisgICAgeyJYdHJ1Y3QzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ190aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgaTMyLCBjaGFuZ2VkLCB1bmRlZmluZWR9LAorICAgICAgICB7OSwgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezExLCB1bmRlZmluZWQsIGk2NCwgaTY0X3RoaW5nLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWHRydWN0MycpCisgICAgKX0sCisgICAgeyJJbnNhbml0eSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge21hcCwgaTMyLCBpNjR9LCB1c2VyTWFwLCBkaWN0Om5ldygpfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuWHRydWN0J319fSwgeHRydWN0cywgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuSW5zYW5pdHknKQorICAgICl9LAorICAgIHsiQ3JhenlOZXN0aW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHN0cmluZ19maWVsZCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIG9wdGlvbmFsLCB7c2V0LCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319fSwgc2V0X2ZpZWxkLCBzZXRzOm5ldygpfSwKKyAgICAgICAgezMsIHJlcXVpcmVkLCB7bGlzdCwge21hcCwKKyAgICAgICAgICB7c2V0LCBpMzJ9LAorICAgICAgICAgIHttYXAsIGkzMiwge3NldCwge2xpc3QsIHttYXAsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknfX0sIHN0cmluZ319fX0KKyAgICAgICAgfX0sIGxpc3RfZmllbGQsIFtdfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgc3RyaW5nLCBiaW5hcnlfZmllbGQsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5DcmF6eU5lc3RpbmcnKQorICAgICl9LAorICAgIHsiWGNlcHRpb24gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgZXJyb3JDb2RlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsIG1lc3NhZ2UsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YY2VwdGlvbicpCisgICAgKX0sCisgICAgeyJYY2VwdGlvbjIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgZXJyb3JDb2RlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwgc3RydWN0X3RoaW5nLCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YY2VwdGlvbjInKQorICAgICl9LAorICAgIHsiRW1wdHlTdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0JykKKyAgICApfSwKKyAgICB7Ik9uZUZpZWxkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J319LCBmaWVsZCwgIyd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCd7fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5PbmVGaWVsZCcpCisgICAgKX0sCisgICAgeyJWZXJzaW9uaW5nVGVzdFYxIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGJlZ2luX2luX2JvdGgsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIHN0cmluZywgb2xkX3N0cmluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezEyLCB1bmRlZmluZWQsIGkzMiwgZW5kX2luX2JvdGgsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYxJykKKyAgICApfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgYmVnaW5faW5fYm90aCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgaTMyLCBuZXdpbnQsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJ5dGUsIG5ld2J5dGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGkxNiwgbmV3c2hvcnQsIHVuZGVmaW5lZH0sCisgICAgICAgIHs1LCB1bmRlZmluZWQsIGk2NCwgbmV3bG9uZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezYsIHVuZGVmaW5lZCwgZG91YmxlLCBuZXdkb3VibGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHs3LCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvbmsnfX0sIG5ld3N0cnVjdCwgIyd0aHJpZnQudGVzdC5Cb25rJ3t9fSwKKyAgICAgICAgezgsIHVuZGVmaW5lZCwge2xpc3QsIGkzMn0sIG5ld2xpc3QsIFtdfSwKKyAgICAgICAgezksIHVuZGVmaW5lZCwge3NldCwgaTMyfSwgbmV3c2V0LCBzZXRzOm5ldygpfSwKKyAgICAgICAgezEwLCB1bmRlZmluZWQsIHttYXAsIGkzMiwgaTMyfSwgbmV3bWFwLCBkaWN0Om5ldygpfSwKKyAgICAgICAgezExLCB1bmRlZmluZWQsIHN0cmluZywgbmV3c3RyaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTIsIHVuZGVmaW5lZCwgaTMyLCBlbmRfaW5fYm90aCwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjInKQorICAgICl9LAorICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBteWludHMsIFtdfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBoZWxsbywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YxJykKKyAgICApfSwKKyAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwgc3RyaW5nfSwgc3RyaW5ncywgW119LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsIGhlbGxvLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTGlzdFR5cGVWZXJzaW9uaW5nVjInKQorICAgICl9LAorICAgIHsiR3Vlc3NQcm90b2NvbFN0cnVjdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezcsIHVuZGVmaW5lZCwge21hcCwgc3RyaW5nLCBzdHJpbmd9LCBtYXBfZmllbGQsIGRpY3Q6bmV3KCl9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdCcpCisgICAgKX0sCisgICAgeyJMYXJnZURlbHRhcyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxLCAjJ3RocmlmdC50ZXN0LkJvb2xzJ3t9fSwKKyAgICAgICAgezEwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvb2xzJ319LCBiMTAsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7MTAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvb2xzJ319LCBiMTAwLCAjJ3RocmlmdC50ZXN0LkJvb2xzJ3t9fSwKKyAgICAgICAgezUwMCwgdW5kZWZpbmVkLCBib29sLCBjaGVja190cnVlLCB1bmRlZmluZWR9LAorICAgICAgICB7MTAwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb29scyd9fSwgYjEwMDAsICMndGhyaWZ0LnRlc3QuQm9vbHMne319LAorICAgICAgICB7MTUwMCwgdW5kZWZpbmVkLCBib29sLCBjaGVja19mYWxzZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid9fSwgdmVydHdvMjAwMCwgIyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ3t9fSwKKyAgICAgICAgezI1MDAsIHVuZGVmaW5lZCwge3NldCwgc3RyaW5nfSwgYV9zZXQyNTAwLCBzZXRzOm5ldygpfSwKKyAgICAgICAgezMwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid9fSwgdmVydHdvMzAwMCwgIyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ3t9fSwKKyAgICAgICAgezQwMDAsIHVuZGVmaW5lZCwge2xpc3QsIGkzMn0sIGJpZ19udW1iZXJzLCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5MYXJnZURlbHRhcycpCisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0kzMngyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge2xpc3QsIGkzMn19LCBpbnRlZ2VybGlzdCwgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4MicpCisgICAgKX0sCisgICAgeyJOZXN0ZWRMaXN0c0kzMngzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge2xpc3QsIHtsaXN0LCBpMzJ9fX0sIGludGVnZXJsaXN0LCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngzJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZE1peGVkeDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7c2V0LCBpMzJ9fSwgaW50X3NldF9saXN0LCBbXX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHttYXAsIGkzMiwge3NldCwgc3RyaW5nfX0sIG1hcF9pbnRfc3Ryc2V0LCBkaWN0Om5ldygpfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwge2xpc3QsIHttYXAsIGkzMiwge3NldCwgc3RyaW5nfX19LCBtYXBfaW50X3N0cnNldF9saXN0LCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5OZXN0ZWRNaXhlZHgyJykKKyAgICApfSwKKyAgICB7Ikxpc3RCb25rcyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvbmsnfX19LCBib25rLCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5MaXN0Qm9ua3MnKQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNCb25rIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge2xpc3QsIHtsaXN0LCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb25rJ319fX19LCBib25rLCBbXX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0JvbmsnKQorICAgICl9LAorICAgIHsiQm9vbFRlc3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBvcHRpb25hbCwgYm9vbCwgYiwgdHJ1ZX0sCisgICAgICAgIHsyLCBvcHRpb25hbCwgc3RyaW5nLCBzLCAidHJ1ZSJ9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuQm9vbFRlc3QnKQorICAgICl9LAorICAgIHsiU3RydWN0QSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgcmVxdWlyZWQsIHN0cmluZywgcywgdW5kZWZpbmVkfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5TdHJ1Y3RBJykKKyAgICApfSwKKyAgICB7IlN0cnVjdEIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBvcHRpb25hbCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuU3RydWN0QSd9fSwgYWEsICMndGhyaWZ0LnRlc3QuU3RydWN0QSd7fX0sCisgICAgICAgIHsyLCByZXF1aXJlZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuU3RydWN0QSd9fSwgYWIsICMndGhyaWZ0LnRlc3QuU3RydWN0QSd7fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5TdHJ1Y3RCJykKKyAgICApfQorICBdLgorCitzZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJ0ZXN0Vm9pZCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFZvaWQsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFZvaWQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFZvaWQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0Vm9pZCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmcgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgc3RyaW5nLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmcgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEJ5dGUgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYnl0ZX1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RCeXRlIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGJ5dGUsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RCeXRlIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0STMyIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGkzMn1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJMzIsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEkzMiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBpMzIsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEkzMiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJMzIsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0STY0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGk2NH1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJNjQsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdEk2NCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBpNjQsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEk2NCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJNjQsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0RG91YmxlIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGRvdWJsZX1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3REb3VibGUsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdERvdWJsZSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBkb3VibGUsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdERvdWJsZSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3REb3VibGUsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RydWN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJ1Y3QsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cnVjdCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cnVjdCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJ1Y3QsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TmVzdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0Mid9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE5lc3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0Mid9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE5lc3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RNYXAgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHttYXAsIGkzMiwgaTMyfX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHttYXAsIGkzMiwgaTMyfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmdNYXAgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHttYXAsIHN0cmluZywgc3RyaW5nfX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZ01hcCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nTWFwIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHttYXAsIHN0cmluZywgc3RyaW5nfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nTWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZ01hcCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RTZXQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzZXQsIGkzMn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFNldCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c2V0LCBpMzJ9LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTZXQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdExpc3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtsaXN0LCBpMzJ9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TGlzdCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bGlzdCwgaTMyfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RMaXN0LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdExpc3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RFbnVtIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBpMzJ9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFbnVtLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RFbnVtIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGkzMiwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFbnVtLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEVudW0gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RUeXBlZGVmIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGk2NH1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RUeXBlZGVmLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RUeXBlZGVmIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIGk2NCwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RUeXBlZGVmLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFR5cGVkZWYgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RNYXBNYXAgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIGkzMn0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwTWFwIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHttYXAsIGkzMiwge21hcCwgaTMyLGkzMn19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNYXBNYXAgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwTWFwLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEluc2FuaXR5IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5JbnNhbml0eSd9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEluc2FuaXR5LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJbnNhbml0eSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bWFwLCBpNjQsIHttYXAsIGkzMiwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5JbnNhbml0eSd9fX19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEluc2FuaXR5LCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdEluc2FuaXR5IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEluc2FuaXR5LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE11bHRpIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBieXRlfSwKKyAgICAgICAgezIsIGkzMn0sCisgICAgICAgIHszLCBpNjR9LAorICAgICAgICB7NCwge21hcCwgaTE2LCBzdHJpbmd9fSwKKyAgICAgICAgezUsIGkzMn0sCisgICAgICAgIHs2LCBpNjR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE11bHRpIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEV4Y2VwdGlvbiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RXhjZXB0aW9uLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RFeGNlcHRpb24gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RFeGNlcHRpb24gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YY2VwdGlvbid9fX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aUV4Y2VwdGlvbiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9LCB7Miwgc3RyaW5nfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aUV4Y2VwdGlvbiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YY2VwdGlvbid9fX0sCisgICAgICAgIHsyLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5YY2VwdGlvbjInfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RPbmV3YXkgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgaTMyfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0T25ld2F5IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIG9uZXdheV92b2lkLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RPbmV3YXkgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsic2Vjb25kdGVzdFN0cmluZyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9XX0sCisgICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InNlY29uZHRlc3RTdHJpbmcgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgc3RyaW5nLAorICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InNlY29uZHRlc3RTdHJpbmcgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCBleGNlcHRpb25zKQorICAgICl9CisgIF0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Zzbi5tayBiL2xpYi9lcmwvdnNuLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWI0MDAxLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdnNuLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVEhSSUZUX1ZTTj0wLjEKZGlmZiAtLWdpdCBhL2xpYi9nby9NYWtlZmlsZS5hbSBiL2xpYi9nby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGZhNWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLgorCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK2luc3RhbGw6CisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnVGhlIEdvIGNsaWVudCBsaWJyYXJ5IHNob3VsZCBiZSBpbnN0YWxsZWQgdmlhICJnbyBnZXQiLCBwbGVhc2Ugc2VlIC9saWIvZ28vUkVBRE1FLm1kJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKK2NoZWNrLWxvY2FsOgorCUdPUEFUSD1gcHdkYCAkKEdPKSB0ZXN0IC1yYWNlIC4vdGhyaWZ0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBwa2cKKworYWxsLWxvY2FsOgorCUdPUEFUSD1gcHdkYCAkKEdPKSBidWlsZCAuL3RocmlmdAorCitFWFRSQV9ESVNUID0gXAorCXRocmlmdCBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvZ28vUkVBRE1FLm1kIGIvbGliL2dvL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZkNWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL1JFQURNRS5tZApAQCAtMCwwICsxLDgzIEBACitUaHJpZnQgR28gU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKK1VzaW5nIFRocmlmdCB3aXRoIEdvCis9PT09PT09PT09PT09PT09PT09PQorCitUaHJpZnQgc3VwcG9ydHMgR28gMS43KworCitJbiBmb2xsb3dpbmcgR28gY29udmVudGlvbnMsIHdlIHJlY29tbWVuZCB5b3UgdXNlIHRoZSAnZ28nIHRvb2wgdG8gaW5zdGFsbAorVGhyaWZ0IGZvciBnby4KKworICAgICQgZ28gZ2V0IGdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0Ly4uLgorCitXaWxsIHJldHJpZXZlIGFuZCBpbnN0YWxsIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLgorCisKK0Egbm90ZSBhYm91dCBvcHRpb25hbCBmaWVsZHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHRocmlmdC10by1HbyBjb21waWxlciB0cmllcyB0byByZXByZXNlbnQgdGhyaWZ0IElETCBzdHJ1Y3RzIGFzIEdvIHN0cnVjdHMuCitXZSBtdXN0IGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgc2V0IHRvIHRoZWlyCitkZWZhdWx0IHZhbHVlIGFuZCBvcHRpb25hbCB2YWx1ZXMgd2hpY2ggYXJlIGFjdHVhbGx5IHVuc2V0LCBzbyB0aGUgZ2VuZXJhdGVkCitjb2RlIHJlcHJlc2VudHMgb3B0aW9uYWwgZmllbGRzIHZpYSBwb2ludGVycy4KKworVGhpcyBpcyBnZW5lcmFsbHkgaW50dWl0aXZlIGFuZCB3b3JrcyB3ZWxsIG11Y2ggb2YgdGhlIHRpbWUsIGJ1dCBHbyBkb2VzIG5vdAoraGF2ZSBhIHN5bnRheCBmb3IgY3JlYXRpbmcgYSBwb2ludGVyIHRvIGEgY29uc3RhbnQgaW4gYSBzaW5nbGUgZXhwcmVzc2lvbi4gVGhhdAoraXMsIGdpdmVuIGEgc3RydWN0IGxpa2UKKworICAgIHN0cnVjdCBTb21lSURMVHlwZSB7CisgICAgCU9wdGlvbmFsRmllbGQgKmludDMyCisgICAgfQorCissIHRoZSBmb2xsb3dpbmcgd2lsbCBub3QgY29tcGlsZToKKworICAgIHggOj0gJlNvbWVJRExUeXBleworICAgIAlPcHRpb25hbEZpZWxkOiAmKDMpLAorICAgIH0KKworKE5vciBpcyB0aGVyZSBhbnkgb3RoZXIgc3ludGF4IHRoYXQncyBidWlsdCBpbiB0byB0aGUgbGFuZ3VhZ2UpCisKK0FzIHN1Y2gsIHdlIHByb3ZpZGUgc29tZSBoZWxwZXJzIHRoYXQgZG8ganVzdCB0aGlzIHVuZGVyIGxpYi9nby90aHJpZnQvLiBFLmcuLAorCisgICAgeCA6PSAmU29tZUlETFR5cGV7CisgICAgCU9wdGlvbmFsRmllbGQ6IHRocmlmdC5JbnQzMlB0cigzKSwKKyAgICB9CisKK0FuZCBzbyBvbi4gVGhlIGNvZGUgZ2VuZXJhdG9yIGFsc28gY3JlYXRlcyBhbmFsb2dvdXMgaGVscGVycyBmb3IgdXNlci1kZWZpbmVkCit0eXBlZGVmcyBhbmQgZW51bXMuCisKK0FkZGluZyBjdXN0b20gdGFncyB0byBnZW5lcmF0ZWQgVGhyaWZ0IHN0cnVjdHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IGNhbiBhZGQgdGFncyB0byB0aGUgYXV0by1nZW5lcmF0ZWQgdGhyaWZ0IHN0cnVjdHMgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgICBzdHJ1Y3QgZm9vIHsKKyAgICAgIDE6IHJlcXVpcmVkIHN0cmluZyBCYXIgKGdvLnRhZyA9ICJzb21lX3RhZzpcInNvbWVfdGFnX3ZhbHVlXCIiKQorICAgIH0KKyAgICAKK3doaWNoIHdpbGwgZ2VuZXJhdGU6CisKKyAgICB0eXBlIEZvbyBzdHJ1Y3QgeworICAgICAgQmFyIHN0cmluZyBgdGhyaWZ0OiJiYXIsMSxyZXF1aXJlZCIgc29tZV90YWc6InNvbWVfdGFnX3ZhbHVlImAKKyAgICB9CmRpZmYgLS1naXQgYS9saWIvZ28vY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9nby9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0JpbmFyeUtleVRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvQmluYXJ5S2V5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjYjYxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0JpbmFyeUtleVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIE1ha2Ugc3VyZSB0aGF0IHRocmlmdCBwcm9kdWNlIGNvbXBpbGFibGUgY29kZSBmb3IgYmluYXJ5IGtleQorc3RydWN0IHRlc3RTdHJ1Y3QgeworICAxOiByZXF1aXJlZCBtYXA8YmluYXJ5LHN0cmluZz4gYmluX3RvX3N0cmluZworfQorCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9Eb250RXhwb3J0UldUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0RvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTVhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9Eb250RXhwb3J0UldUZXN0LnRocmlmdApAQCAtMCwwICsxLDI3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IElubmVyU3RydWN0IHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkCit9CisKK3N0cnVjdCBUZXN0U3RydWN0IHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkCisgIDI6IHJlcXVpcmVkIElubmVyU3RydWN0IGlubmVyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9FcnJvclRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvRXJyb3JUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I2NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvRXJyb3JUZXN0LnRocmlmdApAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworc3RydWN0IFRlc3RTdHJ1Y3QgCit7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gbSwKKyAgMjogbGlzdDxzdHJpbmc+IGwsCisgIDM6IHNldDxzdHJpbmc+IHMsCisgIDQ6IGkzMiBpCit9CisKK3NlcnZpY2UgRXJyb3JUZXN0IAoreworICBUZXN0U3RydWN0ICAgICAgICAgdGVzdFN0cnVjdCgxOiBUZXN0U3RydWN0IHRoaW5nKQorICBzdHJpbmcgICAgICAgICAgICAgdGVzdFN0cmluZygxOiBzdHJpbmcgcykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0dvVGFnVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9Hb1RhZ1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGIzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9Hb1RhZ1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgdGFnZ2VkIHsKKyAgICAxOiBzdHJpbmcgc3RyaW5nX3RoaW5nLAorICAgIDI6IGk2NCBpbnRfdGhpbmcgKGdvLnRhZyA9ICJqc29uOlwiaW50X3RoaW5nLHN0cmluZ1wiIiksCisgICAgMzogb3B0aW9uYWwgaTY0IG9wdGlvbmFsX2ludF90aGluZworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0lnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMGU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0lnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBJZ25vcmVJbml0aWFsaXNtc1Rlc3QgeworICAgIDE6IGk2NCBpZCwKKyAgICAyOiBpNjQgbXlfaWQsCisgICAgMzogaTY0IG51bV9jcHUsCisgICAgNDogaTY0IG51bV9ncHUsCisgICAgNTogaTY0IG15X0lELAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvSW5jbHVkZXNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0luY2x1ZGVzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2MDMyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0luY2x1ZGVzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw2NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGUgIlRocmlmdFRlc3QudGhyaWZ0IgoraW5jbHVkZSAiTmFtZXNwYWNlZFRlc3QudGhyaWZ0IgorCitjb25zdCBUaHJpZnRUZXN0LlVzZXJJZCBVU0VSSUQgPSA0MgorY29uc3QgTmFtZXNwYWNlZFRlc3QuVXNlcklkIFVTRVJJRDEgPSA0MQorY29uc3QgVGhyaWZ0VGVzdC5NYXBUeXBlIE1BUENPTlNUQU5UID0geydoZWxsbyc6e30sICdnb29kbmlnaHQnOnt9fQorCitjb25zdCBpMzIgVFdPID0gTmFtZXNwYWNlZFRlc3QuU3R1ZmYuVFdPCitjb25zdCBpMzIgVEhSRUUgPSBOYW1lc3BhY2VkVGVzdC5USFJFRQorCitzdHJ1Y3QgdGVzdFN0cnVjdCB7CisgIDE6IGxpc3Q8VGhyaWZ0VGVzdC5OdW1iZXJ6PiBsaXN0TnVtYmVycworfQorCitzdHJ1Y3QgVGVzdFN0cnVjdDIgeworICAxOiB0ZXN0U3RydWN0IGJsYWgsCisgIDI6IFRocmlmdFRlc3QuVXNlcklkIGlkLAorICAzOiBOYW1lc3BhY2VkVGVzdC5TdHVmZiBzdHVmZiwKK30KKworc2VydmljZSB0ZXN0U2VydmljZSBleHRlbmRzIFRocmlmdFRlc3QuU2Vjb25kU2VydmljZSB7CisgIFRocmlmdFRlc3QuQ3JhenlOZXN0aW5nIGdldENyYXp5TmVzdGluZygKKyAgICAxOiBUaHJpZnRUZXN0LlN0cnVjdEEgYSwKKyAgICAyOiBUaHJpZnRUZXN0Lk51bWJlcnogbnVtYmVycworICApIHRocm93cygxOiBUaHJpZnRUZXN0LlhjZXB0aW9uIGVycjEpLAorCisgIHZvaWQgZ2V0U29tZVZhbHVlX0RPX05PVF9DQUxMKCksCit9CisKK3NlcnZpY2UgRXh0ZW5kZWRTZXJ2aWNlIGV4dGVuZHMgdGVzdFNlcnZpY2UgeworICB2b2lkIGV4dGVuZGVkTWV0aG9kKCksCisgIE5hbWVzcGFjZWRUZXN0LlN0dWZmU3RydWN0IGV4dGVuZGVkTWV0aG9kMigpLAorfQorCitzZXJ2aWNlIEV4dGVuZGVkMlNlcnZpY2UgZXh0ZW5kcyBOYW1lc3BhY2VkVGVzdC5OYW1lc3BhY2VkU2VydmljZSB7CisgIHZvaWQgZXh0ZW5kZWRNZXRob2QzKCksCit9CisKK3R5cGVkZWYgbWFwPFRocmlmdFRlc3QuVXNlcklkLCBtYXA8TmFtZXNwYWNlZFRlc3QuVXNlcklkLCBsaXN0PFRlc3RTdHJ1Y3QyPiA+ID4gQ29tcGxleE1hcFR5cGUKKworc3RydWN0IENvbXBsZXhNYXBTdHJ1Y3QgeworICAxOiBDb21wbGV4TWFwVHlwZSBjb21wbGV4LAorfQorCitzZXJ2aWNlIENvbXBsZXhNYXBTZXJ2aWNlIHsKKyAgQ29tcGxleE1hcFN0cnVjdCB0cmFuc2Zvcm1NYXAoMTogQ29tcGxleE1hcFN0cnVjdCBpbnB1dCksCit9CisKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0luaXRpYWxpc21zVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9Jbml0aWFsaXNtc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODZhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9Jbml0aWFsaXNtc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgSW5pdGlhbGlzbXNUZXN0IHsKKyAgICAxOiBzdHJpbmcgdXNlcl9pZCwKKyAgICAyOiBzdHJpbmcgc2VydmVyX3VybCwKKyAgICAzOiBzdHJpbmcgaWQsIAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQ0NjgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlRBUkdTID0gLW91dCBnb3BhdGgvc3JjLyAtLWdlbiBnbzp0aHJpZnRfaW1wb3J0PXRocmlmdCQoQ09NUElMRVJfRVhUUkFGTEFHKQorVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCisjIFRocmlmdCBmb3IgR08gaGFzIHByb2JsZW1zIHdpdGggY29tcGxleCBtYXAga2V5czogVEhSSUZULTIwNjMKK2dvcGF0aDogJChUSFJJRlQpICQoVEhSSUZUVEVTVCkgXAorCQkJCUluY2x1ZGVzVGVzdC50aHJpZnQgXAorCQkJCU5hbWVzcGFjZWRUZXN0LnRocmlmdCBcCisJCQkJTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0IFwKKwkJCQlPbmV3YXlUZXN0LnRocmlmdCBcCisJCQkJT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBcCisJCQkJUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IFwKKwkJCQlTZXJ2aWNlc1Rlc3QudGhyaWZ0IFwKKwkJCQlHb1RhZ1Rlc3QudGhyaWZ0IFwKKwkJCQlUeXBlZGVmRmllbGRUZXN0LnRocmlmdCBcCisJCQkJUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IFwKKwkJCQlVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IFwKKwkJCQlVbmlvbkJpbmFyeVRlc3QudGhyaWZ0IFwKKwkJCQlFcnJvclRlc3QudGhyaWZ0IFwKKwkJCQlOYW1lc1Rlc3QudGhyaWZ0IFwKKwkJCQlJbml0aWFsaXNtc1Rlc3QudGhyaWZ0IFwKKwkJCQlEb250RXhwb3J0UldUZXN0LnRocmlmdCBcCisJCQkJZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28gXAorCQkJCUlnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKKwlta2RpciAtcCBnb3BhdGgvc3JjCisJZ3JlcCAtdiBsaXN0LiptYXAuKmxpc3QuKm1hcCAkKFRIUklGVFRFU1QpIHwgZ3JlcCAtdiAnc2V0PEluc2FuaXR5PicgPiBUaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIC1yIEluY2x1ZGVzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBCaW5hcnlLZXlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE11bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE9uZXdheVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFJlcXVpcmVkRmllbGRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFNlcnZpY2VzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBHb1RhZ1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVW5pb25CaW5hcnlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEVycm9yVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBOYW1lc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgSW5pdGlhbGlzbXNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpLHJlYWRfd3JpdGVfcHJpdmF0ZSBEb250RXhwb3J0UldUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpLGlnbm9yZV9pbml0aWFsaXNtcyBJZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CisJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sgfHwgdHJ1ZQorCXNlZCAtaSAncy9cImNvbnRleHRcIi9cImdvbGFuZy5vcmdcL3hcL25ldFwvY29udGV4dFwiL2cnIGdvcGF0aC9zcmMvZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2svY29udHJvbGxlci5nbyB8fCB0cnVlCisJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sKKwlsbiAtbmZzIC4uLy4uLy4uL3RocmlmdCBnb3BhdGgvc3JjL3RocmlmdAorCWxuIC1uZnMgLi4vLi4vdGVzdHMgZ29wYXRoL3NyYy90ZXN0cworCWNwIC1yIC4vZG9udGV4cG9ydHJ3dGVzdCBnb3BhdGgvc3JjCisJdG91Y2ggZ29wYXRoCisKK2NoZWNrOiBnb3BhdGgKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIGJ1aWxkIFwKKwkJCQlpbmNsdWRlc3Rlc3QgXAorCQkJCWJpbmFyeWtleXRlc3QgXAorCQkJCXNlcnZpY2VzdGVzdCBcCisJCQkJdHlwZWRlZmZpZWxkdGVzdCBcCisJCQkJcmVmYW5ub3RhdGlvbmZpZWxkc3Rlc3QgXAorCQkJCWVycm9ydGVzdAlcCisJCQkJbmFtZXN0ZXN0IFwKKwkJCQlpbml0aWFsaXNtc3Rlc3QgXAorCQkJCWRvbnRleHBvcnRyd3Rlc3QgXAorCQkJCWlnbm9yZWluaXRpYWxpc21zdGVzdCBcCisJCQkJdW5pb25iaW5hcnl0ZXN0CisJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSB0ZXN0IHRocmlmdCB0ZXN0cyBkb250ZXhwb3J0cnd0ZXN0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdvcGF0aCBUaHJpZnRUZXN0LnRocmlmdCBnZW4tZ28KKworY2xpZW50OiBzdHVicworCSQoR08pIHJ1biBUZXN0Q2xpZW50LmdvCisKK0VYVFJBX0RJU1QgPSBcCisJZG9udGV4cG9ydHJ3dGVzdCBcCisJdGVzdHMgXAorCUJpbmFyeUtleVRlc3QudGhyaWZ0IFwKKwlHb1RhZ1Rlc3QudGhyaWZ0IFwKKwlJbmNsdWRlc1Rlc3QudGhyaWZ0IFwKKwlNdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQgXAorCU5hbWVzcGFjZWRUZXN0LnRocmlmdCBcCisJT25ld2F5VGVzdC50aHJpZnQgXAorCU9wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQgXAorCVJlcXVpcmVkRmllbGRUZXN0LnRocmlmdCBcCisJUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IFwKKwlVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IFwKKwlVbmlvbkJpbmFyeVRlc3QudGhyaWZ0IFwKKwlTZXJ2aWNlc1Rlc3QudGhyaWZ0IFwKKwlUeXBlZGVmRmllbGRUZXN0LnRocmlmdCBcCisJRXJyb3JUZXN0LnRocmlmdCBcCisJTmFtZXNUZXN0LnRocmlmdCBcCisJSW5pdGlhbGlzbXNUZXN0LnRocmlmdCBcCisJRG9udEV4cG9ydFJXVGVzdC50aHJpZnQgXAorCUlnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L011bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L011bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYzZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXJ2aWNlIEZpcnN0IHsKKyAgICBpNjQgcmV0dXJuT25lKCk7Cit9CisKK3NlcnZpY2UgU2Vjb25kIHsKKyAgICBpNjQgcmV0dXJuVHdvKCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L05hbWVzVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9OYW1lc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTk1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9OYW1lc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgTmFtZXNUZXN0IHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgdHlwZQorfQorCitzZXJ2aWNlIE5hbWVDb2xsaXNpb25PbmUKK3sKKyAgICB2b2lkIGJsYWhCbGFoKCkKK30KKworc2VydmljZSBOYW1lQ29sbGlzaW9uVHdvCit7CisgICAgdm9pZCBibGFoQmxhaCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9OYW1lc3BhY2VkVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9OYW1lc3BhY2VkVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxMDM1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L05hbWVzcGFjZWRUZXN0LnRocmlmdApAQCAtMCwwICsxLDQwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZSAiVGhyaWZ0VGVzdC50aHJpZnQiCisKK25hbWVzcGFjZSBnbyBsaWIuZ28udGVzdC5uYW1lc3BhY2VkdGVzdAorCitlbnVtIFN0dWZmIHsKKyAgT05FID0gMSwKKyAgVFdPID0gMiwKK30KKworY29uc3QgaTMyIFRIUkVFID0gMzsKKwordHlwZWRlZiBpNjQgVXNlcklkCisKK3N0cnVjdCBTdHVmZlN0cnVjdCB7CisgIDI6IFN0dWZmIHN0dWZmLAorfQorCitzZXJ2aWNlIE5hbWVzcGFjZWRTZXJ2aWNlIHsKKyAgVGhyaWZ0VGVzdC5Vc2VySWQgZ2V0VXNlcklEKCksCit9CisKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L09uZXdheVRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvT25ld2F5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0MmY4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L09uZXdheVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXJ2aWNlIE9uZVdheSB7CisgICAgb25ld2F5IHZvaWQgaGkoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIHZvaWQgZW1wdHlmdW5jKCkKKyAgICBpNjQgZWNob19pbnQoMTogaTY0IHBhcmFtKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L09wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmYzE1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L09wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw1MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBzdHJ1Y3RBIHsKKyAxOiByZXF1aXJlZCBpNjQgc2FfaQorfQorCitzdHJ1Y3QgYWxsX29wdGlvbmFsIHsKKyAxOiBvcHRpb25hbCBzdHJpbmcgcyA9ICJERUZBVUxUIiwKKyAyOiBvcHRpb25hbCBpNjQgaSA9IDQyLAorIDM6IG9wdGlvbmFsIGJvb2wgYiA9IGZhbHNlLAorIDQ6IG9wdGlvbmFsIHN0cmluZyBzMiwKKyA1OiBvcHRpb25hbCBpNjQgaTIsCisgNjogb3B0aW9uYWwgYm9vbCBiMiwKKyA3OiBvcHRpb25hbCBzdHJ1Y3RBIGFhLAorIDk6IG9wdGlvbmFsIGxpc3Q8aTY0PiBsLAorIDEwOiBvcHRpb25hbCBsaXN0PGk2ND4gbDIgPSBbMSwgMl0sCisgMTE6IG9wdGlvbmFsIG1hcDxpNjQsIGk2ND4gbSwKKyAxMjogb3B0aW9uYWwgbWFwPGk2NCwgaTY0PiBtMiA9IHsxOjIsIDM6NH0sCisgMTM6IG9wdGlvbmFsIGJpbmFyeSBiaW4sCisgMTQ6IG9wdGlvbmFsIGJpbmFyeSBiaW4yID0gImFzZGYiLAorfQorCitzdHJ1Y3Qgc3RydWN0QiB7CisgMTogcmVxdWlyZWQgc3RydWN0QSByZXF1aXJlZF9zdHJ1Y3RfdGhpbmcKKyAyOiBvcHRpb25hbCBzdHJ1Y3RBIG9wdGlvbmFsX3N0cnVjdF90aGluZworfQorCitzdHJ1Y3Qgc3RydWN0QyB7CisgMTogc3RyaW5nIHMsCisgMjogcmVxdWlyZWQgaTMyIGksCisgMzogb3B0aW9uYWwgYm9vbCBiLAorIDQ6IHJlcXVpcmVkIHN0cmluZyBzMiwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1JlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1JlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2YyOGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNTggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3Qgc3RydWN0QSB7CisgMTogcmVxdWlyZWQgaTY0IHNhX2kKK30KKworc3RydWN0IGFsbF9yZWZlcmVuY2VkIHsKKyAxOiBvcHRpb25hbCBzdHJpbmcgcyA9ICJERUZBVUxUIiAoY3BwLnJlZiA9ICIiKSwKKyAyOiBvcHRpb25hbCBpNjQgaSA9IDQyIChjcHAucmVmID0gIiIpLAorIDM6IG9wdGlvbmFsIGJvb2wgYiA9IGZhbHNlIChjcHAucmVmID0gIiIpLAorIDQ6IG9wdGlvbmFsIHN0cmluZyBzMiAoY3BwLnJlZiA9ICIiKSwKKyA1OiBvcHRpb25hbCBpNjQgaTIgKGNwcC5yZWYgPSAiIiksCisgNjogb3B0aW9uYWwgYm9vbCBiMiAoY3BwLnJlZiA9ICIiKSwKKyA3OiBvcHRpb25hbCBzdHJ1Y3RBIGFhIChjcHAucmVmID0gIiIpLAorIDk6IG9wdGlvbmFsIGxpc3Q8aTY0PiBsIChjcHAucmVmID0gIiIpLAorIDEwOiBvcHRpb25hbCBsaXN0PGk2ND4gbDIgPSBbMSwgMl0gKGNwcC5yZWYgPSAiIiksCisgMTE6IG9wdGlvbmFsIG1hcDxpNjQsIGk2ND4gbSAoY3BwLnJlZiA9ICIiKSwKKyAxMjogb3B0aW9uYWwgbWFwPGk2NCwgaTY0PiBtMiA9IHsxOjIsIDM6NH0gKGNwcC5yZWYgPSAiIiksCisgMTM6IG9wdGlvbmFsIGJpbmFyeSBiaW4gKGNwcC5yZWYgPSAiIiksCisgMTQ6IG9wdGlvbmFsIGJpbmFyeSBiaW4yID0gImFzZGYiIChjcHAucmVmID0gIiIpLAorCisgMTU6IHJlcXVpcmVkIHN0cmluZyByZWZfcyA9ICJERUZBVUxUIiAoY3BwLnJlZiA9ICIiKSwKKyAxNjogcmVxdWlyZWQgaTY0IHJlZl9pID0gNDIgKGNwcC5yZWYgPSAiIiksCisgMTc6IHJlcXVpcmVkIGJvb2wgcmVmX2IgPSBmYWxzZSAoY3BwLnJlZiA9ICIiKSwKKyAxODogcmVxdWlyZWQgc3RyaW5nIHJlZl9zMiAoY3BwLnJlZiA9ICIiKSwKKyAxOTogcmVxdWlyZWQgaTY0IHJlZl9pMiAoY3BwLnJlZiA9ICIiKSwKKyAyMDogcmVxdWlyZWQgYm9vbCByZWZfYjIgKGNwcC5yZWYgPSAiIiksCisgMjE6IHJlcXVpcmVkIHN0cnVjdEEgcmVmX2FhIChjcHAucmVmID0gIiIpLAorIDIyOiByZXF1aXJlZCBsaXN0PGk2ND4gcmVmX2wgKGNwcC5yZWYgPSAiIiksCisgMjM6IHJlcXVpcmVkIGxpc3Q8aTY0PiByZWZfbDIgPSBbMSwgMl0gKGNwcC5yZWYgPSAiIiksCisgMjQ6IHJlcXVpcmVkIG1hcDxpNjQsIGk2ND4gcmVmX20gKGNwcC5yZWYgPSAiIiksCisgMjU6IHJlcXVpcmVkIG1hcDxpNjQsIGk2ND4gcmVmX20yID0gezE6MiwgMzo0fSAoY3BwLnJlZiA9ICIiKSwKKyAyNjogcmVxdWlyZWQgYmluYXJ5IHJlZl9iaW4gKGNwcC5yZWYgPSAiIiksCisgMjc6IHJlcXVpcmVkIGJpbmFyeSByZWZfYmluMiA9ICJhc2RmIiAoY3BwLnJlZiA9ICIiKSwKKworfQorCitzdHJ1Y3Qgc3RydWN0QiB7CisgMTogcmVxdWlyZWQgc3RydWN0QSByZXF1aXJlZF9zdHJ1Y3RfdGhpbmcKKyAyOiBvcHRpb25hbCBzdHJ1Y3RBIG9wdGlvbmFsX3N0cnVjdF90aGluZworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMmRjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9SZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQKQEAgLTAsMCArMSw3IEBACitzdHJ1Y3QgUmVxdWlyZWRGaWVsZCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCit9CisKK3N0cnVjdCBPdGhlclRoaW5nIHsKKyAgMTogcmVxdWlyZWQgaTE2IHZhbHVlCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9TZXJ2aWNlc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvU2VydmljZXNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJiMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvU2VydmljZXNUZXN0LnRocmlmdApAQCAtMCwwICsxLDExMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgV2UgYXJlIG9ubHkgdGVzdGluZyB0aGF0IGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLCBubyBjb3JyZWN0bmVzcyBjaGVja2luZyBpcyBkb25lCisKK2V4Y2VwdGlvbiBtb2RlcmF0ZV9kaXNhc3RlciB7CisgIDE6IGkzMiBlcnJvckNvZGUsCisgIDI6IHN0cmluZyBtZXNzYWdlCit9CisKK2V4Y2VwdGlvbiB0b3RhbF9kaXNhc3RlciB7CisgIDE6IHN0cmluZyBtZXNzYWdlCisgIDI6IG9wdGlvbmFsIGJvb2wgcHJlc2lkZW50X3dhc193b2tlbl91cCA9IGZhbHNlCit9CisKK3N0cnVjdCBzdHJ1Y3RfYSB7CisgIDE6IHJlcXVpcmVkIGk2NCB3aGF0ZXZlcgorfQorCitzZXJ2aWNlIGFfc2VydiB7CisgICAgdm9pZCB2b2lkZnVuYygpLAorICAgIHZvaWQgdm9pZF93aXRoXzFleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHZvaWQgdm9pZF93aXRoXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJpbmcgc3RyaW5nZnVuYygpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIGk2NCBpNjRmdW5jKCkKKyAgICBpNjQgaTY0ZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBpNjQgaTY0ZnVuY18yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jKCkKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmMoKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmMoKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgdm9pZCB2b2lkZnVuY18xaW50KDE6IGk2NCBpKSwKKyAgICB2b2lkIHZvaWRfd2l0aF8xZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgdm9pZCB2b2lkX3dpdGhfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18xaW50KDE6IGk2NCBpKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIGk2NCBpNjRmdW5jXzFpbnQoMTogaTY0IGkpCisgICAgaTY0IGk2NGZ1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGk2NCBpNjRmdW5jXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzFpbnQoMTogaTY0IGkpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMWludCgxOiBpNjQgaSkKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMWludCgxOiBpNjQgaSkKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgdm9pZCB2b2lkZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcyksCisgICAgdm9pZCB2b2lkX3dpdGhfMWV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICB2b2lkIHZvaWRfd2l0aF8yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIGk2NCBpNjRmdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIGk2NCBpNjRmdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgaTY0IGk2NGZ1bmNfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xc3RydWN0X2EoMTogc3RydWN0X2Egc3QpCisKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1R5cGVkZWZGaWVsZFRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwZThjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1R5cGVkZWZGaWVsZFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFdlIGFyZSBvbmx5IHRlc3RpbmcgdGhhdCBnZW5lcmF0ZWQgY29kZSBjb21waWxlcywgbm8gY29ycmVjdG5lc3MgY2hlY2tpbmcgaXMgZG9uZQorCitlbnVtIERldGFpbHMgeworICBFdmVyeXRoaW5nID0gMAorICBTdGF0ZU9ubHkgPSAxCisgIFN0YXRlQW5kT3B0aW9ucyA9IDIKKyAgU29tZXRoaW5nRWxzZSA9IDMKK30KKwordHlwZWRlZiBsaXN0PCBEZXRhaWxzPiAgRGV0YWlsc1dhbnRlZAorCitzdHJ1Y3QgQmFzZVJlcXVlc3QgeworICAxIDogb3B0aW9uYWwgc3RyaW5nIFJlcXVlc3RJRAorfQorCitzdHJ1Y3QgR2V0TXlEZXRhaWxzIHsKKyAgMSA6IHJlcXVpcmVkIEJhc2VSZXF1ZXN0IGJhc2VfCisgIDIgOiByZXF1aXJlZCBzdHJpbmcgT2JqZWN0SUQKKyAgMyA6IG9wdGlvbmFsIERldGFpbHNXYW50ZWQgRGV0YWlsc1dhbnRlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvVW5pb25CaW5hcnlUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MTEyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NzMKK3VuaW9uIFNhbXBsZSB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdTEsCisgIDI6IGJpbmFyeSB1MiwKKyAgMzogbGlzdDxzdHJpbmc+IHUzCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9VbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzkzNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdApAQCAtMCwwICsxLDM0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IE9wdGlvbjEgeworfQorCitzdHJ1Y3QgT3B0aW9uMiB7CisgIDE6IG9wdGlvbmFsIHN0cmluZyBuYW1lCit9CisKK3VuaW9uIERlc2NlbmRhbnQgeworICAxOiBPcHRpb24xIG9wdGlvbjEKKyAgMjogT3B0aW9uMiBvcHRpb24yCit9CisKK3N0cnVjdCBUZXN0U3RydWN0IHsKKyAgMTogb3B0aW9uYWwgRGVzY2VuZGFudCBkZXNjZW5kYW50ID0geyAib3B0aW9uMSI6IHt9fQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjY3NjNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28KQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRvbnRleHBvcnRyd3Rlc3QKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworLy8gTWFrZSBzdXJlIHRoYXQgdGhyaWZ0IGdlbmVyYXRlcyBub24tZXhwb3J0ZWQgcmVhZC93cml0ZSBtZXRob2RzIGlmCisvLyByZWFkX3dyaXRlX3ByaXZhdGUgb3B0aW9uIGlzIHNwZWNpZmllZAorZnVuYyBUZXN0UmVhZFdyaXRlTWV0aG9kc0FyZVByaXZhdGUodCAqdGVzdGluZy5UKSB7CisJLy8gVGhpcyB3aWxsIG9ubHkgY29tcGlsZSBpZiByZWFkL3dyaXRlIG1ldGhvZHMgZXhpc3QKKwlzIDo9IE5ld1Rlc3RTdHJ1Y3QoKQorCV8gPSBzLnJlYWQKKwlfID0gcy53cml0ZQorCisJaXMgOj0gTmV3SW5uZXJTdHJ1Y3QoKQorCV8gPSBpcy5yZWFkCisJXyA9IGlzLndyaXRlCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9iaW5hcnlfa2V5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9iaW5hcnlfa2V5X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5NjE5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2JpbmFyeV9rZXlfdGVzdC5nbwpAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiYmluYXJ5a2V5dGVzdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0QmluYXJ5TWFwS2V5R2VuZXJhdGVzU3RyaW5nKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gYmluYXJ5a2V5dGVzdC5OZXdUZXN0U3RydWN0KCkKKwkvL1RoaXMgd2lsbCBvbmx5IGNvbXBpbGUgaWYgQmluVG9TdHJpbmcgaGFzIHR5cGUgb2YgbWFwW3N0cmluZ11zdHJpbmcKKwlzLkJpblRvU3RyaW5nID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvY2xpZW50X2Vycm9yX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlYzRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCkBAIC0wLDAgKzEsODczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZXJyb3JzIgorCSJlcnJvcnRlc3QiCisJInRlc3RpbmciCisJInRocmlmdCIKKworCSJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKKykKKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIFNldHVwIG1vY2sgdG8gZmFpbCBhdCBhIGNlcnRhaW4gcG9zaXRpb24uIFJldHVybiB0cnVlIGlmIHBvc2l0aW9uIGV4aXN0cyBvdGhlcndpc2UgZmFsc2UuCitmdW5jIHByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wgKk1vY2tUUHJvdG9jb2wsIGZhaWxBdCBpbnQsIGZhaWxXaXRoIGVycm9yKSBib29sIHsKKwl2YXIgZXJyIGVycm9yID0gbmlsCisKKwlpZiBmYWlsQXQgPT0gMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgOj0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJ1Y3QiLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLlJldHVybihlcnIpCisJaWYgZmFpbEF0ID09IDAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RydWN0X2FyZ3MiKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJ0aGluZyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSVUNUKSwgaW50MTYoMSkpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJUZXN0U3RydWN0IikuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigibSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTUFQKSwgaW50MTYoMSkpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1hcEJlZ2luKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNYXBFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImwiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkxJU1QpLCBpbnQxNigyKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTGlzdEJlZ2luKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUxpc3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKworCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNFVCksIGludDE2KDMpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVNldEJlZ2luKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTZXRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJpIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNig0KSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVJMzIoaW50MzIoMykpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIxIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDIyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cnVjdCIsIHRocmlmdC5SRVBMWSwgaW50MzIoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RydWN0X2FyZ3MiLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJVQ1QpLCBpbnQxNigwKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlRlc3RTdHJ1Y3QiLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJtIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5NQVApLCBpbnQxNigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWFwQmVnaW4oKS5SZXR1cm4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDAsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1hcEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJsIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5MSVNUKSwgaW50MTYoMiksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZExpc3RCZWdpbigpLlJldHVybih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDAsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzYgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZExpc3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU0VUKSwgaW50MTYoMyksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFNldEJlZ2luKCkuUmV0dXJuKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0MCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU2V0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oImkiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkkzMiksIGludDE2KDQpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRJMzIoKS5SZXR1cm4oaW50MzIoMyksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNig1KSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0NSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0NiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0OCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0OSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNTAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA1MCB7CisJCXJldHVybiB0cnVlCisJfQorCXJldHVybiBmYWxzZQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUcmFuc3BvcnRFcnJvciBvbiBmYWlsLgorZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFRyYW5zcG9ydEVycm9ycyh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLlMgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLkkgPSAzCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRFeGNlcHRpb24odGhyaWZ0LlRJTUVEX09VVCwgInRlc3QiKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKKwkJaWYgIW9rIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYXNwb3J0RXhjZXB0aW9uIikKKwkJfQorCisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlRJTUVEX09VVCB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUcmFuc3BvcnRFcnJvciBvbiBmYWlsLgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50UmVwb3J0VFRyYW5zcG9ydEVycm9ycywgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwl0aGluZyA6PSBlcnJvcnRlc3QuTmV3VGVzdFN0cnVjdCgpCisJdGhpbmcuTSA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJdGhpbmcuTCA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKKwkJaWYgIW9rIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYXNwb3J0RXhjZXB0aW9uIikKKwkJfQorCisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlRJTUVEX09VVCB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUUHJvdG9jb2xFcnJvcnMgb24gZmFpbC4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRQcm90b2NvbEVycm9ycyh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLlMgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLkkgPSAzCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKHRocmlmdC5JTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoInRlc3QiKSkKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCWlmICFwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sLCBpLCBlcnIpIHsKKwkJCXJldHVybgorCQl9CisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwkJaWYgIW9rIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFByb3RvY29sRXhjZXB0aW9uIikKKwkJfQorCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX0RBVEEgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9EQVRBIGVycm9yIikKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIEV4cGVjdGluZyBUVFByb3RvY29sRXJyb3JzIG9uIGZhaWwuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnMsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFByb3RvY29sRXJyb3JzTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwl0aGluZyA6PSBlcnJvcnRlc3QuTmV3VGVzdFN0cnVjdCgpCisJdGhpbmcuTSA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJdGhpbmcuTCA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgZXJyb3JzLk5ldygidGVzdCIpKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwkJaWYgIW9rIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFByb3RvY29sRXhjZXB0aW9uIikKKwkJfQorCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX0RBVEEgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgSU5WQUxJRF9EQVRBIGVycm9yIikKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBTZXR1cCBtb2NrIHRvIGZhaWwgYXQgYSBjZXJ0YWluIHBvc2l0aW9uLiBSZXR1cm4gdHJ1ZSBpZiBwb3NpdGlvbiBleGlzdHMgb3RoZXJ3aXNlIGZhbHNlLgorZnVuYyBwcmVwYXJlQ2xpZW50Q2FsbEV4Y2VwdGlvbihwcm90b2NvbCAqTW9ja1RQcm90b2NvbCwgZmFpbEF0IGludCwgZmFpbFdpdGggZXJyb3IpIGJvb2wgeworCXZhciBlcnIgZXJyb3IgPSBuaWwKKworCS8vIE5vIG5lZWQgdG8gdGVzdCBmYWlsdXJlIGluIHRoaXMgYmxvY2ssIGJlY2F1c2UgaXQgaXMgY292ZXJlZCBpbiBvdGhlciB0ZXN0IGNhc2VzCisJbGFzdCA6PSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIikuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKS5BZnRlcihsYXN0KQorCisJLy8gUmVhZGluZyB0aGUgZXhjZXB0aW9uLCBtaWdodCBmYWlsLgorCWlmIGZhaWxBdCA9PSAwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuRVhDRVBUSU9OLCBpbnQzMigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJUQXBwbGljYXRpb25FeGNlcHRpb24iLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigibWVzc2FnZSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJpbmcoKS5SZXR1cm4oInRlc3QiLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDUgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oInR5cGUiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkkzMiksIGludDE2KDIpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkSTMyKCkuUmV0dXJuKGludDMyKHRocmlmdC5QUk9UT0NPTF9FUlJPUiksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gOCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDIpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDggeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gOSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisKKwlyZXR1cm4gZmFsc2UKK30KKworLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCitmdW5jIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwllcnIgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRFeGNlcHRpb24odGhyaWZ0LlRJTUVEX09VVCwgInRlc3QiKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJd2lsbENvbXBsZXRlIDo9ICFwcmVwYXJlQ2xpZW50Q2FsbEV4Y2VwdGlvbihwcm90b2NvbCwgaSwgZXJyKQorCisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJCWlmICF3aWxsQ29tcGxldGUgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKKwkJCWlmICFvayB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIikKKwkJCX0KKwkJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlRJTUVEX09VVCB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgVElNRURfT1VUIGVycm9yIikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwkJCWlmICFvayB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuUFJPVE9DT0xfRVJST1IgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIFBST1RPQ09MX0VSUk9SIGVycm9yIikKKwkJCX0KKwkJCWJyZWFrCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBjYWxsIGFuZCByZXBseSB3aXRoIGV4Y2VwdGlvbiB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50Q2FsbEV4Y2VwdGlvbiwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwllcnIgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRFeGNlcHRpb24odGhyaWZ0LlRJTUVEX09VVCwgInRlc3QiKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJd2lsbENvbXBsZXRlIDo9ICFwcmVwYXJlQ2xpZW50Q2FsbEV4Y2VwdGlvbihwcm90b2NvbCwgaSwgZXJyKQorCisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCQlpZiAhd2lsbENvbXBsZXRlIHsKKwkJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pCisJCQlpZiAhb2sgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5USU1FRF9PVVQgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCQl9CisJCX0gZWxzZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJCQlpZiAhb2sgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwkJCX0KKwkJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlBST1RPQ09MX0VSUk9SIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBQUk9UT0NPTF9FUlJPUiBlcnJvciIpCisJCQl9CisJCQlicmVhaworCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogTWlzbWF0Y2hpbmcgc2VxdWVuY2UgaWQgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KK2Z1bmMgVGVzdENsaWVudFNlcUlkTWlzbWF0Y2godCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigyKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuQkFEX1NFUVVFTkNFX0lEIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgQkFEX1NFUVVFTkNFX0lEIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBNaXNtYXRjaGluZyBzZXF1ZW5jZSBpZCBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50U2VxSWRNaXNtYXRjaCwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRTZXFJZE1pc21hdGNoTGVnZWFjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5SRVBMWSwgaW50MzIoMiksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5CQURfU0VRVUVOQ0VfSUQgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBCQURfU0VRVUVOQ0VfSUQgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1ldGhvZCBuYW1lIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuV1JPTkdfTUVUSE9EX05BTUUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBXUk9OR19NRVRIT0RfTkFNRSBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWV0aG9kIG5hbWUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFdyb25nTWV0aG9kTmFtZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWVMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInVua25vd24iLCB0aHJpZnQuUkVQTFksIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuV1JPTkdfTUVUSE9EX05BTUUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBXUk9OR19NRVRIT0RfTkFNRSBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWVzc2FnZSB0eXBlIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04geworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04gZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1lc3NhZ2UgdHlwZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50V3JvbmdNZXNzYWdlVHlwZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LklOVkFMSURfVE1FU1NBR0VfVFlQRSwgaW50MzIoMSksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04geworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04gZXJyb3IiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2NvbnRleHQuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5M2E4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorKQorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9lbmNvZGluZ19qc29uX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9lbmNvZGluZ19qc29uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNDU2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2VuY29kaW5nX2pzb25fdGVzdC5nbwpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiZW5jb2RpbmciCisJImVuY29kaW5nL2pzb24iCisJInRlc3RpbmciCisJInRocmlmdHRlc3QiCispCisKK2Z1bmMgVGVzdEVudW1Jc1RleHRNYXJzaGFsbGVyKHQgKnRlc3RpbmcuVCkgeworCW9uZSA6PSB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FCisJdmFyIHRtIGVuY29kaW5nLlRleHRNYXJzaGFsZXIgPSBvbmUKKwliLCBlcnIgOj0gdG0uTWFyc2hhbFRleHQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBmcm9tIE1hcnNoYWxUZXh0OiAlcyIsIGVycikKKwl9CisJaWYgc3RyaW5nKGIpICE9IG9uZS5TdHJpbmcoKSB7CisJCXQuRXJyb3JmKCJNYXJzaGFsVGV4dCglcykgPSAlcywgZXhwZWN0ZWQgPSAlcyIsIG9uZSwgYiwgb25lKQorCX0KK30KKworZnVuYyBUZXN0RW51bUlzVGV4dFVubWFyc2hhbGxlcih0ICp0ZXN0aW5nLlQpIHsKKwl2YXIgdG0gZW5jb2RpbmcuVGV4dFVubWFyc2hhbGVyID0gdGhyaWZ0dGVzdC5OdW1iZXJ6UHRyKHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJZXJyIDo9IHRtLlVubWFyc2hhbFRleHQoW11ieXRlKCJUV08iKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBVbm1hcnNoYWxUZXh0KFRXTyk6ICVzIiwgZXJyKQorCX0KKwlpZiAqKHRtLigqdGhyaWZ0dGVzdC5OdW1iZXJ6KSkgIT0gdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTyB7CisJCXQuRXJyb3JmKCJVbm1hcnNoYWxUZXh0KFRXTykgPSAlcyIsIHRtKQorCX0KKworCWVyciA9IHRtLlVubWFyc2hhbFRleHQoW11ieXRlKCJOQU4iKSkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5FcnJvcmYoIkVycm9yIGZyb20gVW5tYXJzaGFsVGV4dChOQU4pIikKKwl9Cit9CisKK2Z1bmMgVGVzdEpTT05NYXJzaGFsVW5tYXJzaGFsKHQgKnRlc3RpbmcuVCkgeworCXMxIDo9IHRocmlmdHRlc3QuU3RydWN0QnsKKwkJQWE6ICZ0aHJpZnR0ZXN0LlN0cnVjdEF7UzogIkFhIn0sCisJCUFiOiAmdGhyaWZ0dGVzdC5TdHJ1Y3RBe1M6ICJBYiJ9LAorCX0KKworCWIsIGVyciA6PSBqc29uLk1hcnNoYWwoczEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGZyb20ganNvbi5NYXJzaGFsOiAlcyIsIGVycikKKwl9CisKKwlzMiA6PSB0aHJpZnR0ZXN0LlN0cnVjdEJ7fQorCWVyciA9IGpzb24uVW5tYXJzaGFsKGIsICZzMikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBqc29uLlVubWFyc2hhbDogJXMiLCBlcnIpCisJfQorCisJaWYgKnMxLkFhICE9ICpzMi5BYSB8fCAqczEuQWIgIT0gKnMyLkFiIHsKKwkJdC5Mb2dmKCJzMSA9ICUrdiIsIHMxKQorCQl0LkxvZ2YoInMyID0gJSt2IiwgczIpCisJCXQuRXJyb3JmKCJqc29uOiBVbm1hcnNoYWwoTWFyc2hhbChzKSkgIT0gcyIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvZ290YWdfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2dvdGFnX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmMDU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2dvdGFnX3Rlc3QuZ28KQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImdvdGFndGVzdCIKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0RGVmYXVsdFRhZyh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGdvdGFndGVzdC5UYWdnZWR7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJZmllbGQsIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJTdHJpbmdUaGluZyIpCisJaWYgIW9rIHx8IGZpZWxkLlRhZy5HZXQoImpzb24iKSAhPSAic3RyaW5nX3RoaW5nIiB7CisJCXQuRXJyb3IoIlVuZXhwZWN0ZWQgZGVmYXVsdCB0YWcgdmFsdWUiKQorCX0KK30KKworZnVuYyBUZXN0Q3VzdG9tVGFnKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gZ290YWd0ZXN0LlRhZ2dlZHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlmaWVsZCwgb2sgOj0gc3QuRmllbGRCeU5hbWUoIkludFRoaW5nIikKKwlpZiAhb2sgfHwgZmllbGQuVGFnLkdldCgianNvbiIpICE9ICJpbnRfdGhpbmcsc3RyaW5nIiB7CisJCXQuRXJyb3IoIlVuZXhwZWN0ZWQgY3VzdG9tIHRhZyB2YWx1ZSIpCisJfQorfQorCitmdW5jIFRlc3RPcHRpb25hbFRhZyh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGdvdGFndGVzdC5UYWdnZWR7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJZmllbGQsIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJPcHRpb25hbEludFRoaW5nIikKKwlpZiAhb2sgfHwgZmllbGQuVGFnLkdldCgianNvbiIpICE9ICJvcHRpb25hbF9pbnRfdGhpbmcsb21pdGVtcHR5IiB7CisJCXQuRXJyb3IoIlVuZXhwZWN0ZWQgZGVmYXVsdCB0YWcgdmFsdWUgZm9yIG9wdGlvbmFsIGZpZWxkIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9pZ25vcmVpbml0aWFsaXNtc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvaWdub3JlaW5pdGlhbGlzbXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Q1ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvaWdub3JlaW5pdGlhbGlzbXNfdGVzdC5nbwpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiaWdub3JlaW5pdGlhbGlzbXN0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RJZ25vcmVJbml0aWFsaXNtc0ZsYWdJc0hvbm91cmVkKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gaWdub3JlaW5pdGlhbGlzbXN0ZXN0Lklnbm9yZUluaXRpYWxpc21zVGVzdHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlfLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiSWQiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIklkIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIk15SWQiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk15SWQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiTnVtQ3B1IikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJOdW1DcHUgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiTnVtR3B1IikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJOdW1HcHUgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiTXlfSUQiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk15X0lEIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvaW5pdGlhbGlzbXNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2luaXRpYWxpc21zX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5MjNkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2luaXRpYWxpc21zX3Rlc3QuZ28KQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImluaXRpYWxpc21zdGVzdCIKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0VGhhdENvbW1vbkluaXRpYWxpc21zQXJlRml4ZWQodCAqdGVzdGluZy5UKSB7CisJcyA6PSBpbml0aWFsaXNtc3Rlc3QuSW5pdGlhbGlzbXNUZXN0e30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCV8sIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJVc2VySUQiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIlVzZXJJRCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJTZXJ2ZXJVUkwiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIlNlcnZlclVSTCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJJRCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiSUQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvbXVsdGlwbGV4ZWRfcHJvdG9jb2xfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFjNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvbXVsdGlwbGV4ZWRfcHJvdG9jb2xfdGVzdC5nbwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJIm11bHRpcGxleGVkcHJvdG9jb2x0ZXN0IgorCSJuZXQiCisJInRlc3RpbmciCisJInRocmlmdCIKKwkidGltZSIKKykKKworZnVuYyBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpIG5ldC5BZGRyIHsKKwlpZiBsLCBlcnIgOj0gbmV0Lkxpc3RlbigidGNwIiwgIjEyNy4wLjAuMTowIik7IGVyciAhPSBuaWwgeworCQlwYW5pYygiQ291bGQgbm90IGZpbmQgYXZhaWxhYmxlIHNlcnZlciBwb3J0IikKKwl9IGVsc2UgeworCQlkZWZlciBsLkNsb3NlKCkKKwkJcmV0dXJuIGwuQWRkcigpCisJfQorfQorCit0eXBlIEZpcnN0SW1wbCBzdHJ1Y3R7fQorCitmdW5jIChmICpGaXJzdEltcGwpIFJldHVybk9uZShjdHggY29udGV4dC5Db250ZXh0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIDEsIG5pbAorfQorCit0eXBlIFNlY29uZEltcGwgc3RydWN0e30KKworZnVuYyAocyAqU2Vjb25kSW1wbCkgUmV0dXJuVHdvKGN0eCBjb250ZXh0LkNvbnRleHQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gMiwgbmlsCit9CisKK2Z1bmMgY3JlYXRlVHJhbnNwb3J0KGFkZHIgbmV0LkFkZHIpICh0aHJpZnQuVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQorCWVyciA6PSB0cmFuc3BvcnQuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gdHJhbnNwb3J0LCBuaWwKK30KKworZnVuYyBUZXN0TXVsdGlwbGV4ZWRQcm90b2NvbEZpcnN0KHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KSwgIkZpcnN0U2VydmljZSIpCisKKwljbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCisJcmV0LCBlcnIgOj0gY2xpZW50LlJldHVybk9uZShkZWZhdWx0Q3R4KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY2FsbCBmaXJzdCBzZXJ2ZXI6IiwgZXJyKQorCX0gZWxzZSBpZiByZXQgIT0gMSB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gc2VydmVyOiAiLCByZXQpCisJfQorfQorCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sU2Vjb25kKHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KSwgIlNlY29uZFNlcnZpY2UiKQorCisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIHNlY29uZCBzZXJ2ZXI6IiwgZXJyKQorCX0gZWxzZSBpZiByZXQgIT0gMiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gc2VydmVyOiAiLCByZXQpCisJfQorfQorCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCisJLy9leHBlY3QgZXJyb3Igc2luY2UgZGVmYXVsdCBwcm9jZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0aW5nIGVycm9yIikKKwl9CisKKwkvL3JlZ2lzdGVyIGRlZmF1bHQgcHJvY2Vzc29yIGFuZCBjYWxsIGFnYWluCisJcHJvY2Vzc29yLlJlZ2lzdGVyRGVmYXVsdChtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkpCisJdHJhbnNwb3J0LCBlcnIgPSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCisJcHJvdG9jb2wgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKKwljbGllbnQgPSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCisJcmV0LCBlcnIgPSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIGxlZ2FjeSBzZXJ2ZXI6IiwgZXJyKQorCX0KKwlpZiByZXQgIT0gMiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gc2VydmVyOiAiLCByZXQpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvbmFtZXNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL25hbWVzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiNjNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL25hbWVzX3Rlc3QuZ28KQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJIm5hbWVzdGVzdCIKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0VGhhdEF0dHJpYnV0ZU5hbWVTdWJzdGl0dWlvbkRvZXNOb3RPY2N1cih0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IG5hbWVzdGVzdC5OYW1lc1Rlc3R7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJXywgb2sgOj0gc3QuRmllbGRCeU5hbWUoIlR5cGUiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIlR5cGUgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkMGJiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbwpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJuZXQiCisJIm9uZXdheXRlc3QiCisJInRlc3RpbmciCisJInRocmlmdCIKKwkidGltZSIKKykKKworZnVuYyBmaW5kUG9ydCgpIG5ldC5BZGRyIHsKKwlpZiBsLCBlcnIgOj0gbmV0Lkxpc3RlbigidGNwIiwgIjEyNy4wLjAuMTowIik7IGVyciAhPSBuaWwgeworCQlwYW5pYygiQ291bGQgbm90IGZpbmQgYXZhaWxhYmxlIHNlcnZlciBwb3J0IikKKwl9IGVsc2UgeworCQlkZWZlciBsLkNsb3NlKCkKKwkJcmV0dXJuIGwuQWRkcigpCisJfQorfQorCit0eXBlIGltcGwgc3RydWN0e30KKworZnVuYyAoaSAqaW1wbCkgSGkoY3R4IGNvbnRleHQuQ29udGV4dCwgaW4gaW50NjQsIHMgc3RyaW5nKSAoZXJyIGVycm9yKSAgICAgICAgeyBmbXQuUHJpbnRsbigiSGkhIik7IHJldHVybiB9CitmdW5jIChpICppbXBsKSBFbXB0eWZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB9CitmdW5jIChpICppbXBsKSBFY2hvSW50KGN0eCBjb250ZXh0LkNvbnRleHQsIHBhcmFtIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7IHJldHVybiBwYXJhbSwgbmlsIH0KKworY29uc3QgVElNRU9VVCA9IHRpbWUuU2Vjb25kCisKK3ZhciBhZGRyIG5ldC5BZGRyCit2YXIgc2VydmVyICp0aHJpZnQuVFNpbXBsZVNlcnZlcgordmFyIGNsaWVudCAqb25ld2F5dGVzdC5PbmVXYXlDbGllbnQKKworZnVuYyBUZXN0SW5pdE9uZXdheSh0ICp0ZXN0aW5nLlQpIHsKKwl2YXIgZXJyIGVycm9yCisJYWRkciA9IGZpbmRQb3J0KCkKKwlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorCX0KKwlwcm9jZXNzb3IgOj0gb25ld2F5dGVzdC5OZXdPbmVXYXlQcm9jZXNzb3IoJmltcGx7fSkKKwlzZXJ2ZXIgPSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCisKKwlnbyBzZXJ2ZXIuU2VydmUoKQorCXRpbWUuU2xlZXAoMTAgKiB0aW1lLk1pbGxpc2Vjb25kKQorfQorCitmdW5jIFRlc3RJbml0T25ld2F5Q2xpZW50KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXByb3RvY29sIDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCWNsaWVudCA9IG9uZXdheXRlc3QuTmV3T25lV2F5Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwllcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQorCX0KK30KKworZnVuYyBUZXN0Q2FsbE9uZXdheVNlcnZlcih0ICp0ZXN0aW5nLlQpIHsKKwkvL2NhbGwgb25ld2F5IGZ1bmN0aW9uCisJZXJyIDo9IGNsaWVudC5IaShkZWZhdWx0Q3R4LCAxLCAiIikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvcjogIiwgZXJyKQorCX0KKwkvL1RoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgcHJvdG9jb2wgcHJvYmxlbXMgd2l0aCBzaW5nbGUgb25ld2F5IGNhbGwgc28gd2UgY2FsbCBpdCBzZWNvbmQgdGltZQorCWksIGVyciA6PSBjbGllbnQuRWNob0ludChkZWZhdWx0Q3R4LCA0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvcjogIiwgZXJyKQorCX0KKwlpZiBpICE9IDQyIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXR1cm5lZCB2YWx1ZTogIiwgaSkKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9vcHRpb25hbF9maWVsZHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL29wdGlvbmFsX2ZpZWxkc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YWQ2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9vcHRpb25hbF9maWVsZHNfdGVzdC5nbwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImJ5dGVzIgorCWdvbW9jayAiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCisJIm9wdGlvbmFsZmllbGRzdGVzdCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorKQorCitmdW5jIFRlc3RJc1NldFJldHVybkZhbHNlT25DcmVhdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWlmIGFvLklzU2V0UygpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIFMgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRJKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgSSBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBCIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0UzIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBTMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEkyKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgSTIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRCMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEIyIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0QWEoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBBYSBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEwoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBMIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0TDIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBMMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldE0oKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBNIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0TTIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBNMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEJpbigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEJpbiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEJpbjIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBCaW4yIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorfQorCitmdW5jIFRlc3REZWZhdWx0VmFsdWVzT25DcmVhdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWlmIGFvLkdldFMoKSAhPSAiREVGQVVMVCIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgUyIsIGFvLkdldFMoKSkKKwl9CisJaWYgYW8uR2V0SSgpICE9IDQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEkiLCBhby5HZXRJKCkpCisJfQorCWlmIGFvLkdldEIoKSAhPSBmYWxzZSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBCIiwgYW8uR2V0QigpKQorCX0KKwlpZiBhby5HZXRTMigpICE9ICIiIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIFMyIiwgYW8uR2V0UzIoKSkKKwl9CisJaWYgYW8uR2V0STIoKSAhPSAwIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEkyIiwgYW8uR2V0STIoKSkKKwl9CisJaWYgYW8uR2V0QjIoKSAhPSBmYWxzZSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBCMiIsIGFvLkdldEIyKCkpCisJfQorCWlmIGwgOj0gYW8uR2V0TCgpOyBsZW4obCkgIT0gMCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBMIiwgbCkKKwl9CisJaWYgbCA6PSBhby5HZXRMMigpOyBsZW4obCkgIT0gMiB8fCBsWzBdICE9IDEgfHwgbFsxXSAhPSAyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEwyIiwgbCkKKwl9CisJLy9GSVhNRTogc2hvdWxkIHdlIHJldHVybiBlbXB0eSBtYXAgaGVyZT8KKwlpZiBtIDo9IGFvLkdldE0oKTsgbSAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgTSIsIG0pCisJfQorCWlmIG0gOj0gYW8uR2V0TTIoKTsgbGVuKG0pICE9IDIgfHwgbVsxXSAhPSAyIHx8IG1bM10gIT0gNCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBNMiIsIG0pCisJfQorCWlmIGJ2IDo9IGFvLkdldEJpbigpOyBidiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgQmluIiwgYnYpCisJfQorCWlmIGJ2IDo9IGFvLkdldEJpbjIoKTsgIWJ5dGVzLkVxdWFsKGJ2LCBbXWJ5dGUoImFzZGYiKSkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgQmluMiIsIGJ2KQorCX0KK30KKworZnVuYyBUZXN0SW5pdGlhbFZhbHVlc09uQ3JlYXRpb24odCAqdGVzdGluZy5UKSB7CisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlpZiBhby5TICE9ICJERUZBVUxUIiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBTIiwgYW8uUykKKwl9CisJaWYgYW8uSSAhPSA0MiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBJIiwgYW8uSSkKKwl9CisJaWYgYW8uQiAhPSBmYWxzZSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBCIiwgYW8uQikKKwl9CisJaWYgYW8uUzIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIFMyIiwgYW8uUzIpCisJfQorCWlmIGFvLkkyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBJMiIsIGFvLkkyKQorCX0KKwlpZiBhby5CMiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgQjIiLCBhby5CMikKKwl9CisJaWYgYW8uTCAhPSBuaWwgfHwgbGVuKGFvLkwpICE9IDAgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgTCIsIGFvLkwpCisJfQorCWlmIGFvLkwyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBMMiIsIGFvLkwyKQorCX0KKwlpZiBhby5NICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBNIiwgYW8uTSkKKwl9CisJaWYgYW8uTTIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIE0yIiwgYW8uTTIpCisJfQorCWlmIGFvLkJpbiAhPSBuaWwgfHwgbGVuKGFvLkJpbikgIT0gMCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBCaW4iLCBhby5CaW4pCisJfQorCWlmICFieXRlcy5FcXVhbChhby5CaW4yLCBbXWJ5dGUoImFzZGYiKSkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgQmluMiIsIGFvLkJpbjIpCisJfQorfQorCitmdW5jIFRlc3RJc1NldFJldHVyblRydWVBZnRlclVwZGF0ZSh0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLlMgPSAic29tZXZhbHVlIgorCWFvLkkgPSAxMjMKKwlhby5CID0gdHJ1ZQorCWFvLkFhID0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld1N0cnVjdEEoKQorCWlmICFhby5Jc1NldFMoKSB7CisJCXQuRXJyb3JmKCJGaWVsZCBTIHNob3VsZCBiZSBzZXQiKQorCX0KKwlpZiAhYW8uSXNTZXRJKCkgeworCQl0LkVycm9yZigiRmllbGQgSSBzaG91bGQgYmUgc2V0IikKKwl9CisJaWYgIWFvLklzU2V0QigpIHsKKwkJdC5FcnJvcmYoIkZpZWxkIEIgc2hvdWxkIGJlIHNldCIpCisJfQorCWlmICFhby5Jc1NldEFhKCkgeworCQl0LkVycm9yZigiRmllbGQgYWEgc2hvdWxkIGJlIHNldCIpCisJfQorfQorCitmdW5jIFRlc3RMaXN0Tm90RW1wdHkodCAqdGVzdGluZy5UKSB7CisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5MID0gW11pbnQ2NHsxLCAyLCAzfQorCWlmICFhby5Jc1NldEwoKSB7CisJCXQuRXJyb3JmKCJGaWVsZCBMIHNob3VsZCBiZSBzZXQiKQorCX0KK30KKworLy9NYWtlIHN1cmUgdGhhdCBvcHRpb25hbCBmaWVsZHMgYXJlIG5vdCBiZWluZyBzZXJpYWxpemVkCitmdW5jIFRlc3ROb09wdGlvbmFsVW5zZXRGaWVsZHNPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLldyaXRlKHByb3RvKQorfQorCitmdW5jIFRlc3ROb1NldFRvRGVmYXVsdEZpZWxkc09uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uSSA9IDQyCisJYW8uV3JpdGUocHJvdG8pCit9CisKKy8vTWFrZSBzdXJlIHRoYXQgb25seSBvbmUgZmllbGQgaXMgYmVpbmcgc2VyaWFsaXplZCB3aGVuIHNldCB0byBub24tZGVmYXVsdAorZnVuYyBUZXN0T25lSVNldEZpZWxkT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJpIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JNjQpLCBpbnQxNigyKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlSTY0KGludDY0KDEyMykpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uSSA9IDEyMworCWFvLldyaXRlKHByb3RvKQorfQorCitmdW5jIFRlc3RPbmVMU2V0RmllbGRPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImwiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkxJU1QpLCBpbnQxNig5KSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlTGlzdEJlZ2luKHRocmlmdC5UVHlwZSh0aHJpZnQuSTY0KSwgMikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlSTY0KGludDY0KDEpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVJNjQoaW50NjQoMikpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUxpc3RFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkwgPSBbXWludDY0ezEsIDJ9CisJYW8uV3JpdGUocHJvdG8pCit9CisKK2Z1bmMgVGVzdE9uZUJpblNldEZpZWxkT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJiaW4iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEzKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlQmluYXJ5KFtdYnl0ZSgic29tZWJ5dGVzdHJpbmciKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5CaW4gPSBbXWJ5dGUoInNvbWVieXRlc3RyaW5nIikKKwlhby5Xcml0ZShwcm90bykKK30KKworZnVuYyBUZXN0T25lRW1wdHlCaW5TZXRGaWVsZE9uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigiYmluIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxMykpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUJpbmFyeShbXWJ5dGV7fSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5CaW4gPSBbXWJ5dGV7fQorCWFvLldyaXRlKHByb3RvKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sX21vY2suZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkN2EwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sX21vY2suZ28KQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgTW9ja0dlbi4gRE8gTk9UIEVESVQhCisvLyBTb3VyY2U6IHRocmlmdCAoaW50ZXJmYWNlczogVFByb3RvY29sKQorCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJdGhyaWZ0ICJ0aHJpZnQiCisKKwlnb21vY2sgImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgorKQorCisvLyBNb2NrIG9mIFRQcm90b2NvbCBpbnRlcmZhY2UKK3R5cGUgTW9ja1RQcm90b2NvbCBzdHJ1Y3QgeworCWN0cmwgICAgICpnb21vY2suQ29udHJvbGxlcgorCXJlY29yZGVyICpfTW9ja1RQcm90b2NvbFJlY29yZGVyCit9CisKKy8vIFJlY29yZGVyIGZvciBNb2NrVFByb3RvY29sIChub3QgZXhwb3J0ZWQpCit0eXBlIF9Nb2NrVFByb3RvY29sUmVjb3JkZXIgc3RydWN0IHsKKwltb2NrICpNb2NrVFByb3RvY29sCit9CisKK2Z1bmMgTmV3TW9ja1RQcm90b2NvbChjdHJsICpnb21vY2suQ29udHJvbGxlcikgKk1vY2tUUHJvdG9jb2wgeworCW1vY2sgOj0gJk1vY2tUUHJvdG9jb2x7Y3RybDogY3RybH0KKwltb2NrLnJlY29yZGVyID0gJl9Nb2NrVFByb3RvY29sUmVjb3JkZXJ7bW9ja30KKwlyZXR1cm4gbW9jaworfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgRVhQRUNUKCkgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIgeworCXJldHVybiBfbS5yZWNvcmRlcgorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJGbHVzaCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiRmx1c2giKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEJpbmFyeSgpIChbXWJ5dGUsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRCaW5hcnkiKQorCXJldDAsIF8gOj0gcmV0WzBdLihbXWJ5dGUpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEJpbmFyeSgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRCaW5hcnkiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEJvb2woKSAoYm9vbCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEJvb2wiKQorCXJldDAsIF8gOj0gcmV0WzBdLihib29sKQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRCb29sKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEJvb2wiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEJ5dGUiKQorCXJldDAsIF8gOj0gcmV0WzBdLihpbnQ4KQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRCeXRlKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEJ5dGUiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZERvdWJsZSgpIChmbG9hdDY0LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkRG91YmxlIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZmxvYXQ2NCkKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkRG91YmxlKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZERvdWJsZSIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChzdHJpbmcsIHRocmlmdC5UVHlwZSwgaW50MTYsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRGaWVsZEJlZ2luIikKKwlyZXQwLCBfIDo9IHJldFswXS4oc3RyaW5nKQorCXJldDEsIF8gOj0gcmV0WzFdLih0aHJpZnQuVFR5cGUpCisJcmV0MiwgXyA6PSByZXRbMl0uKGludDE2KQorCXJldDMsIF8gOj0gcmV0WzNdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MSwgcmV0MiwgcmV0MworfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRGaWVsZEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEZpZWxkQmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkRmllbGRFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRGaWVsZEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRGaWVsZEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkSTE2KCkgKGludDE2LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkSTE2IikKKwlyZXQwLCBfIDo9IHJldFswXS4oaW50MTYpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEkxNigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRJMTYiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEkzMiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGludDMyKQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRJMzIoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkSTMyIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRJNjQoKSAoaW50NjQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRJNjQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihpbnQ2NCkKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkSTY0KCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEk2NCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTGlzdEJlZ2luKCkgKHRocmlmdC5UVHlwZSwgaW50LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTGlzdEJlZ2luIikKKwlyZXQwLCBfIDo9IHJldFswXS4odGhyaWZ0LlRUeXBlKQorCXJldDEsIF8gOj0gcmV0WzFdLihpbnQpCisJcmV0MiwgXyA6PSByZXRbMl0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZExpc3RCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRMaXN0QmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZExpc3RFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRMaXN0RW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTGlzdEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRMaXN0RW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRNYXBCZWdpbigpICh0aHJpZnQuVFR5cGUsIHRocmlmdC5UVHlwZSwgaW50LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTWFwQmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnQuVFR5cGUpCisJcmV0MSwgXyA6PSByZXRbMV0uKHRocmlmdC5UVHlwZSkKKwlyZXQyLCBfIDo9IHJldFsyXS4oaW50KQorCXJldDMsIF8gOj0gcmV0WzNdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MSwgcmV0MiwgcmV0MworfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRNYXBCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRNYXBCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTWFwRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTWFwRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTWFwRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZE1hcEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKHN0cmluZywgdGhyaWZ0LlRNZXNzYWdlVHlwZSwgaW50MzIsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRNZXNzYWdlQmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLihzdHJpbmcpCisJcmV0MSwgXyA6PSByZXRbMV0uKHRocmlmdC5UTWVzc2FnZVR5cGUpCisJcmV0MiwgXyA6PSByZXRbMl0uKGludDMyKQorCXJldDMsIF8gOj0gcmV0WzNdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MSwgcmV0MiwgcmV0MworfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRNZXNzYWdlQmVnaW4oKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkTWVzc2FnZUJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkTWVzc2FnZUVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZE1lc3NhZ2VFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkTWVzc2FnZUVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAodGhyaWZ0LlRUeXBlLCBpbnQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRTZXRCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHRocmlmdC5UVHlwZSkKKwlyZXQxLCBfIDo9IHJldFsxXS4oaW50KQorCXJldDIsIF8gOj0gcmV0WzJdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MSwgcmV0MgorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRTZXRCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRTZXRCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkU2V0RW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkU2V0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZFNldEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZFN0cmluZyIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkU3RyaW5nKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZFN0cmluZyIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAoc3RyaW5nLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkU3RydWN0QmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLihzdHJpbmcpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZFN0cnVjdEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZFN0cnVjdEJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRTdHJ1Y3RFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRTdHJ1Y3RFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkU3RydWN0RW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFNraXAoX3BhcmFtMCB0aHJpZnQuVFR5cGUpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiU2tpcCIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgU2tpcChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJTa2lwIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFRyYW5zcG9ydCgpIHRocmlmdC5UVHJhbnNwb3J0IHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVHJhbnNwb3J0IikKKwlyZXQwLCBfIDo9IHJldFswXS4odGhyaWZ0LlRUcmFuc3BvcnQpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBUcmFuc3BvcnQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUcmFuc3BvcnQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVCaW5hcnkoX3BhcmFtMCBbXWJ5dGUpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVCaW5hcnkiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlQmluYXJ5KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlQmluYXJ5IiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlQm9vbChfcGFyYW0wIGJvb2wpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVCb29sIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUJvb2woYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVCb29sIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlQnl0ZShfcGFyYW0wIGludDgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVCeXRlIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUJ5dGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVCeXRlIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlRG91YmxlKF9wYXJhbTAgZmxvYXQ2NCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZURvdWJsZSIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVEb3VibGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVEb3VibGUiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKF9wYXJhbTAgc3RyaW5nLCBfcGFyYW0xIHRocmlmdC5UVHlwZSwgX3BhcmFtMiBpbnQxNikgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUZpZWxkQmVnaW4iLCBfcGFyYW0wLCBfcGFyYW0xLCBfcGFyYW0yKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlRmllbGRCZWdpbihhcmcwLCBhcmcxLCBhcmcyIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUZpZWxkQmVnaW4iLCBhcmcwLCBhcmcxLCBhcmcyKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVGaWVsZEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVGaWVsZEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlRmllbGRFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlRmllbGRTdG9wIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUZpZWxkU3RvcCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlRmllbGRTdG9wIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlSTE2KF9wYXJhbTAgaW50MTYpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVJMTYiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlSTE2KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlSTE2IiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlSTMyKF9wYXJhbTAgaW50MzIpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVJMzIiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlSTMyKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlSTMyIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlSTY0KF9wYXJhbTAgaW50NjQpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVJNjQiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlSTY0KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlSTY0IiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKF9wYXJhbTAgdGhyaWZ0LlRUeXBlLCBfcGFyYW0xIGludCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUxpc3RCZWdpbiIsIF9wYXJhbTAsIF9wYXJhbTEpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVMaXN0QmVnaW4oYXJnMCwgYXJnMSBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVMaXN0QmVnaW4iLCBhcmcwLCBhcmcxKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUxpc3RFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlTGlzdEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTGlzdEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZU1hcEJlZ2luKF9wYXJhbTAgdGhyaWZ0LlRUeXBlLCBfcGFyYW0xIHRocmlmdC5UVHlwZSwgX3BhcmFtMiBpbnQpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVNYXBCZWdpbiIsIF9wYXJhbTAsIF9wYXJhbTEsIF9wYXJhbTIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVNYXBCZWdpbihhcmcwLCBhcmcxLCBhcmcyIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZU1hcEJlZ2luIiwgYXJnMCwgYXJnMSwgYXJnMikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZU1hcEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVNYXBFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZU1hcEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihfcGFyYW0wIHN0cmluZywgX3BhcmFtMSB0aHJpZnQuVE1lc3NhZ2VUeXBlLCBfcGFyYW0yIGludDMyKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTWVzc2FnZUJlZ2luIiwgX3BhcmFtMCwgX3BhcmFtMSwgX3BhcmFtMikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZU1lc3NhZ2VCZWdpbihhcmcwLCBhcmcxLCBhcmcyIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZU1lc3NhZ2VCZWdpbiIsIGFyZzAsIGFyZzEsIGFyZzIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTWVzc2FnZUVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVNZXNzYWdlRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVNZXNzYWdlRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oX3BhcmFtMCB0aHJpZnQuVFR5cGUsIF9wYXJhbTEgaW50KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlU2V0QmVnaW4iLCBfcGFyYW0wLCBfcGFyYW0xKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlU2V0QmVnaW4oYXJnMCwgYXJnMSBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVTZXRCZWdpbiIsIGFyZzAsIGFyZzEpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZVNldEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVTZXRFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlU2V0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVTZXRFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVTdHJpbmcoX3BhcmFtMCBzdHJpbmcpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVTdHJpbmciLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlU3RyaW5nKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlU3RyaW5nIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4oX3BhcmFtMCBzdHJpbmcpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVTdHJ1Y3RCZWdpbiIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTdHJ1Y3RCZWdpbihhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZVN0cnVjdEJlZ2luIiwgYXJnMCkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZVN0cnVjdEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTdHJ1Y3RFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZVN0cnVjdEVuZCIpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZmQ5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbHNfdGVzdC5nbwpAQCAtMCwwICsxLDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aHJpZnR0ZXN0IgorKQorCitmdW5jIFJ1blNvY2tldFRlc3RTdWl0ZSh0ICp0ZXN0aW5nLlQsIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwKKwl0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSkgeworCS8vIHNlcnZlcgorCXZhciBlcnIgZXJyb3IKKwlhZGRyID0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXByb2Nlc3NvciA6PSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RQcm9jZXNzb3IoTmV3VGhyaWZ0VGVzdEhhbmRsZXIoKSkKKwlzZXJ2ZXIgPSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKwlzZXJ2ZXIuTGlzdGVuKCkKKworCWdvIHNlcnZlci5TZXJ2ZSgpCisKKwkvLyBjbGllbnQKKwl2YXIgdHJhbnNwb3J0IHRocmlmdC5UVHJhbnNwb3J0ID0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKKwl0cmFuc3BvcnQsIGVyciA9IHRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCXZhciBwcm90b2NvbCB0aHJpZnQuVFByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkKKwl0aHJpZnRUZXN0Q2xpZW50IDo9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJZXJyID0gdHJhbnNwb3J0Lk9wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQorCX0KKworCWRyaXZlciA6PSBOZXdUaHJpZnRUZXN0RHJpdmVyKHQsIHRocmlmdFRlc3RDbGllbnQpCisJZHJpdmVyLlN0YXJ0KCkKK30KKworLy8gUnVuIHRlc3Qgc3VpdGUgdXNpbmcgVEpTT05Qcm90b2NvbAorZnVuYyBUZXN0VEpTT05Qcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODkxMikpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpKQorfQorCisvLyBSdW4gdGVzdCBzdWl0ZSB1c2luZyBUQmluYXJ5UHJvdG9jb2wKK2Z1bmMgVGVzdFRCaW5hcnlQcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCksCisJCXRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkJdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoODkxMikpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAorCQl0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpKQorfQorCisvLyBSdW4gdGVzdCBzdWl0ZSB1c2luZyBUQ29tcGFjdEJpbmFyeVByb3RvY29sCitmdW5jIFRlc3RUQ29tcGFjdFByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4OTEyKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3JlcXVpcmVkX2ZpZWxkc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTQxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgorCSJvcHRpb25hbGZpZWxkc3Rlc3QiCisJInJlcXVpcmVkZmllbGR0ZXN0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCispCisKK2Z1bmMgVGVzdFJlcXVpcmVkRmllbGRfU3VjZWNzc1doZW5TZXQodCAqdGVzdGluZy5UKSB7CisJLy8gY3JlYXRlIGEgbmV3IFJlcXVpcmVkRmllbGQgaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWlyZWQgZmllbGQgc2V0CisJc291cmNlIDo9ICZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke05hbWU6ICJ0aGlzIGlzIGEgdGVzdCJ9CisJc291cmNlRGF0YSwgZXJyIDo9IHRocmlmdC5OZXdUU2VyaWFsaXplcigpLldyaXRlKGNvbnRleHQuQmFja2dyb3VuZCgpLCBzb3VyY2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJmYWlsZWQgdG8gc2VyaWFsaXplICVUOiAldiIsIHNvdXJjZSwgZXJyKQorCX0KKworCWQgOj0gdGhyaWZ0Lk5ld1REZXNlcmlhbGl6ZXIoKQorCWVyciA9IGQuUmVhZCgmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHt9LCBzb3VyY2VEYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRGlkIG5vdCBleHBlY3QgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gZGVzZXJpYWxpemUgdGhlIHJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGQ6ICV2IiwgZXJyKQorCX0KK30KKworZnVuYyBUZXN0UmVxdWlyZWRGaWVsZF9FcnJvcldoZW5NaXNzaW5nKHQgKnRlc3RpbmcuVCkgeworCS8vIGNyZWF0ZSBhIG5ldyBPdGhlclRoaW5nIGluc3RhbmNlLCB3aXRob3V0IHNldHRpbmcgdGhlIHJlcXVpcmVkIGZpZWxkCisJc291cmNlIDo9ICZyZXF1aXJlZGZpZWxkdGVzdC5PdGhlclRoaW5ne30KKwlzb3VyY2VEYXRhLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJpYWxpemVyKCkuV3JpdGUoY29udGV4dC5CYWNrZ3JvdW5kKCksIHNvdXJjZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoImZhaWxlZCB0byBzZXJpYWxpemUgJVQ6ICV2Iiwgc291cmNlLCBlcnIpCisJfQorCisJLy8gYXR0ZW1wdCB0byBkZXNlcmlhbGl6ZSBpbnRvIGEgZGlmZmVyZW50IHR5cGUgKHdoaWNoIHNob3VsZCBmYWlsKQorCWQgOj0gdGhyaWZ0Lk5ld1REZXNlcmlhbGl6ZXIoKQorCWVyciA9IGQuUmVhZCgmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHt9LCBzb3VyY2VEYXRhKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byBkZXNlcmlhbGl6ZSBhbiBvYmplY3Qgd2hpY2ggaXMgbWlzc2luZyBhIHJlcXVpcmVkIGZpZWxkIikKKwl9Cit9CisKK2Z1bmMgVGVzdFN0cnVjdFJlYWRSZXF1aXJlZEZpZWxkcyh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJdGVzdFN0cnVjdCA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3U3RydWN0QygpCisKKwkvLyBOb25lIG9mIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0CisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiU3RydWN0QyIsIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisKKwllcnIgOj0gdGVzdFN0cnVjdC5SZWFkKHByb3RvY29sKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIGZhaWwiKQorCX0KKwllcnIyLCBvayA6PSBlcnIuKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKwlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX0RBVEEgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgVFByb3RvY29sRXhjZXB0aW9uIikKKwl9CisKKwkvLyBPbmUgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcyBpcyBzZXQKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJTdHJ1Y3RDIiwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIkkiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkkzMiksIGludDE2KDIpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkSTMyKCkuUmV0dXJuKGludDMyKDEpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKworCWVyciA9IHRlc3RTdHJ1Y3QuUmVhZChwcm90b2NvbCkKKwltb2NrQ3RybC5GaW5pc2goKQorCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgcmVhZCB0byBmYWlsIikKKwl9CisJZXJyMiwgb2sgPSBlcnIuKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKwlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX0RBVEEgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgVFByb3RvY29sRXhjZXB0aW9uIikKKwl9CisKKwkvLyBCb3RoIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMgYXJlIHNldAorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlN0cnVjdEMiLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiaSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoMiksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRJMzIoKS5SZXR1cm4oaW50MzIoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiczIiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDQpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RyaW5nKCkuUmV0dXJuKCJ0ZXN0IiwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisKKwllcnIgPSB0ZXN0U3RydWN0LlJlYWQocHJvdG9jb2wpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgcmVhZCB0byBzdWNjZWVkIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlOWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbwpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwlzdCAic2VydmljZXN0ZXN0IgorKQorCisvL3RoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkLCBpdCB3aWxsIGZhaWwgdG8gY29tcGlsZSBpZiBjaGVjayBpcyBmYWlsZWQKK2Z1bmMgc3RhdGljQ2hlY2tTdHJ1Y3RBcmdzUmVzdWx0cygpIHsKKwkvL0NoZWNrIHRoYXQgc3RydWN0IGFyZ3MgYW5kIHJlc3VsdHMgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UKKwl2YXIgc2EgKnN0LlN0cnVjdEEgPSAmc3QuU3RydWN0QXt9CisJdmFyIGlmYWNlIHN0LkFTZXJ2CisJdmFyIGVyciBlcnJvcgorCisJc2EsIGVyciA9IGlmYWNlLlN0cnVjdEFGdW5jXzFzdHJ1Y3RBKGRlZmF1bHRDdHgsIHNhKQorCV8gPSBlcnIKKwlfID0gc2EKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfZHJpdmVyLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1NGNiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfZHJpdmVyLmdvCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkicmVmbGVjdCIKKwkidGVzdGluZyIKKwkidGhyaWZ0dGVzdCIKKykKKwordHlwZSBUaHJpZnRUZXN0RHJpdmVyIHN0cnVjdCB7CisJY2xpZW50IHRocmlmdHRlc3QuVGhyaWZ0VGVzdAorCXQgICAgICAqdGVzdGluZy5UCit9CisKK2Z1bmMgTmV3VGhyaWZ0VGVzdERyaXZlcih0ICp0ZXN0aW5nLlQsIGNsaWVudCB0aHJpZnR0ZXN0LlRocmlmdFRlc3QpICpUaHJpZnRUZXN0RHJpdmVyIHsKKwlyZXR1cm4gJlRocmlmdFRlc3REcml2ZXJ7Y2xpZW50LCB0fQorfQorCitmdW5jIChwICpUaHJpZnRUZXN0RHJpdmVyKSBTdGFydCgpIHsKKwljbGllbnQgOj0gcC5jbGllbnQKKwl0IDo9IHAudAorCisJaWYgY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RWb2lkIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJUZXN0Iik7IHIgIT0gIlRlc3QiIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggc2ltcGxlIHRleHQgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgIiIpOyByICE9ICIiIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggZW1wdHkgdGV4dCBmYWlsZWQiKQorCX0KKworCXN0cmluZ1Rlc3QgOj0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiICsKKwkJIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKKwkJItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCisJCSLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIgKworCQkiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKKwkJIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCisJCSJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIgKworCQkiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKKwkJIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKworCQkiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIiArCisJCSJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKworCQki4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKKwkJIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIiArCisJCSJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKKwkJIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKKwkJIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIgKworCQkiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKKwkJIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKKwkJIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiICsKKwkJItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCisJCSJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKworCQkiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiICsKKwkJIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKworCQkiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCisJCSJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iCisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgc3RyaW5nVGVzdCk7IHIgIT0gc3RyaW5nVGVzdCB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIGFsbCBsYW5ndWFnZXMgZmFpbGVkIikKKwl9CisKKwlzcGVjaWFsQ2hhcmFjdGVycyA6PSAicXVvdGU6IFwiIGJhY2tzbGFzaDoiICsKKwkJIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiArCisJCSIgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAnXFxcYlxuXHJcdCciICsKKwkJIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IiArCisJCSIgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXFwiIH19fXsgW1tbICIKKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCBzcGVjaWFsQ2hhcmFjdGVycyk7IHIgIT0gc3BlY2lhbENoYXJhY3RlcnMgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBzcGVjaWFsQ2hhcmFjdGVycyBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgMSk7IHIgIT0gMSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEJ5dGUoMSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAwKTsgciAhPSAwIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Qnl0ZSgwKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEJ5dGUoLTEpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgLTEyNyk7IHIgIT0gLTEyNyB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEJ5dGUoLTEyNykgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgLTEpOyByICE9IC0xIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STMyKC0xKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgMSk7IHIgIT0gMSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEkzMigxKSBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCAtNSk7IHIgIT0gLTUgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJNjQoLTUpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA1KTsgciAhPSA1IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STY0KDUpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCAtMzQzNTk3MzgzNjgpOyByICE9IC0zNDM1OTczODM2OCB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEk2NCgtMzQzNTk3MzgzNjgpIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKGRlZmF1bHRDdHgsIC01LjIwOTg1MjMpOyByICE9IC01LjIwOTg1MjMgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3REb3VibGUoLTUuMjA5ODUyMykgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKGRlZmF1bHRDdHgsIC03LjAxMjA1MjE3NTIxNTA0NCk7IHIgIT0gLTcuMDEyMDUyMTc1MjE1MDQ0IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RG91YmxlKC03LjAxMjA1MjE3NTIxNTA0NCkgZmFpbGVkIikKKwl9CisKKwkvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKworCW91dCA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJb3V0LlN0cmluZ1RoaW5nID0gIlplcm8iCisJb3V0LkJ5dGVUaGluZyA9IDEKKwlvdXQuSTMyVGhpbmcgPSAtMworCW91dC5JNjRUaGluZyA9IDEwMDAwMDAKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgb3V0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG91dCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJ1Y3QgZmFpbGVkIikKKwl9CisKKwlvdXQyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCisJb3V0Mi5CeXRlVGhpbmcgPSAxCisJb3V0Mi5TdHJ1Y3RUaGluZyA9IG91dAorCW91dDIuSTMyVGhpbmcgPSA1CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdChkZWZhdWx0Q3R4LCBvdXQyKTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG91dDIpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0TmVzdCBmYWlsZWQiKQorCX0KKworCW1hcG91dCA6PSBtYWtlKG1hcFtpbnQzMl1pbnQzMikKKwlmb3IgaSA6PSBpbnQzMigwKTsgaSA8IDU7IGkrKyB7CisJCW1hcG91dFtpXSA9IGkgLSAxMAorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbWFwb3V0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcG91dCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RNYXAgZmFpbGVkIikKKwl9CisKKwltYXBUZXN0SW5wdXQgOj0gbWFwW3N0cmluZ11zdHJpbmd7CisJCSJhIjogIjEyMyIsICJhIGIiOiAid2l0aCBzcGFjZXMgIiwgInNhbWUiOiAic2FtZSIsICIwIjogIm51bWVyaWMga2V5IiwKKwkJImxvbmdWYWx1ZSI6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICJsb25nIGtleSIsCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZ01hcChkZWZhdWx0Q3R4LCBtYXBUZXN0SW5wdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwVGVzdElucHV0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZ01hcCBmYWlsZWQiKQorCX0KKworCXNldFRlc3RJbnB1dCA6PSBbXWludDMyezEsIDIsIDN9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U2V0KGRlZmF1bHRDdHgsIHNldFRlc3RJbnB1dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBzZXRUZXN0SW5wdXQpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U2V0IGZhaWxlZCIpCisJfQorCisJbGlzdFRlc3QgOj0gW11pbnQzMnsxLCAyLCAzfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdExpc3QoZGVmYXVsdEN0eCwgbGlzdFRlc3QpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbGlzdFRlc3QpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0TGlzdCBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEVudW0oZGVmYXVsdEN0eCwgdGhyaWZ0dGVzdC5OdW1iZXJ6X09ORSk7IHIgIT0gdGhyaWZ0dGVzdC5OdW1iZXJ6X09ORSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEVudW0gZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RUeXBlZGVmKGRlZmF1bHRDdHgsIDY5KTsgciAhPSA2OSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFR5cGVkZWYgZmFpbGVkIikKKwl9CisKKwltYXBNYXBUZXN0IDo9IG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzJ7CisJCTQ6ICB7MTogMSwgMjogMiwgMzogMywgNDogNH0sCisJCS00OiB7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKGRlZmF1bHRDdHgsIDEpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwTWFwVGVzdCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RNYXBNYXAgZmFpbGVkIikKKwl9CisKKwljcmF6eVgxIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwljcmF6eVgxLlN0cmluZ1RoaW5nID0gIkdvb2RieWU0IgorCWNyYXp5WDEuQnl0ZVRoaW5nID0gNAorCWNyYXp5WDEuSTMyVGhpbmcgPSA0CisJY3JhenlYMS5JNjRUaGluZyA9IDQKKworCWNyYXp5WDIgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCWNyYXp5WDIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgorCWNyYXp5WDIuQnl0ZVRoaW5nID0gMgorCWNyYXp5WDIuSTMyVGhpbmcgPSAyCisJY3JhenlYMi5JNjRUaGluZyA9IDIKKworCWNyYXp5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCWNyYXp5LlVzZXJNYXAgPSBtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklkezU6IDUsIDg6IDh9CisJY3JhenkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0e2NyYXp5WDEsIGNyYXp5WDJ9CisKKwljcmF6eUVtcHR5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCWNyYXp5RW1wdHkuVXNlck1hcCA9IG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWR7fQorCWNyYXp5RW1wdHkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0e30KKworCWluc2FuaXR5IDo9IG1hcFt0aHJpZnR0ZXN0LlVzZXJJZF1tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5eworCQkxOiB7dGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTzogY3JhenksIHRocmlmdHRlc3QuTnVtYmVyel9USFJFRTogY3Jhenl9LAorCQkyOiB7dGhyaWZ0dGVzdC5OdW1iZXJ6X1NJWDogY3JhenlFbXB0eX0sCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGRlZmF1bHRDdHgsIGNyYXp5KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGluc2FuaXR5KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEluc2FuaXR5IGZhaWxlZCIpCisJfQorCisJaWYgZXJyIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJURXhjZXB0aW9uIik7IGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFRFeGNlcHRpb24gZmFpbGVkIikKKwl9CisKKwlpZiBlcnIsIG9rIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIpLigqdGhyaWZ0dGVzdC5YY2VwdGlvbik7IG9rID09IGZhbHNlIHx8IGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFhjZXB0aW9uIGZhaWxlZCIpCisJfSBlbHNlIGlmIGVyci5FcnJvckNvZGUgIT0gMTAwMSB8fCBlcnIuTWVzc2FnZSAhPSAiWGNlcHRpb24iIHsKKwkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBYY2VwdGlvbiBmYWlsZWQiKQorCX0KKworCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAibm8gRXhjZXB0aW9uIik7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIG5vIEV4Y2VwdGlvbiBmYWlsZWQiKQorCX0KKworCWlmIGVyciA6PSBjbGllbnQuVGVzdE9uZXdheShkZWZhdWx0Q3R4LCAwKTsgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RPbmV3YXkgZmFpbGVkIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2hhbmRsZXIuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2hhbmRsZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiOWVlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkidGhyaWZ0IgorCSJ0aHJpZnR0ZXN0IgorCSJ0aW1lIgorKQorCit0eXBlIFNlY29uZFNlcnZpY2VIYW5kbGVyIHN0cnVjdCB7Cit9CisKK2Z1bmMgTmV3U2Vjb25kU2VydmljZUhhbmRsZXIoKSAqU2Vjb25kU2VydmljZUhhbmRsZXIgeworCXJldHVybiAmU2Vjb25kU2VydmljZUhhbmRsZXJ7fQorfQorCitmdW5jIChwICpTZWNvbmRTZXJ2aWNlSGFuZGxlcikgQmxhaEJsYWgoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqU2Vjb25kU2VydmljZUhhbmRsZXIpIFNlY29uZHRlc3RTdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK3R5cGUgVGhyaWZ0VGVzdEhhbmRsZXIgc3RydWN0IHsKK30KKworZnVuYyBOZXdUaHJpZnRUZXN0SGFuZGxlcigpICpUaHJpZnRUZXN0SGFuZGxlciB7CisJcmV0dXJuICZUaHJpZnRUZXN0SGFuZGxlcnt9Cit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Vm9pZChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCb29sKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Qnl0ZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEkzMihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0STY0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3REb3VibGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCaW5hcnkoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11ieXRlKSAociBbXWJ5dGUsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RydWN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdCkgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE5lc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgKnRocmlmdHRlc3QuWHRydWN0MikgKHIgKnRocmlmdHRlc3QuWHRydWN0MiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RyaW5nTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtzdHJpbmddc3RyaW5nKSAociBtYXBbc3RyaW5nXXN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTZXQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RMaXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RW51bShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyB0aHJpZnR0ZXN0Lk51bWJlcnopIChyIHRocmlmdHRlc3QuTnVtYmVyeiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RUeXBlZGVmKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHRocmlmdHRlc3QuVXNlcklkKSAociB0aHJpZnR0ZXN0LlVzZXJJZCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNYXBNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgaGVsbG8gaW50MzIpIChyIG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworCXIgPSBtYWtlKG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIpCisJcG9zIDo9IG1ha2UobWFwW2ludDMyXWludDMyKQorCW5lZyA6PSBtYWtlKG1hcFtpbnQzMl1pbnQzMikKKworCWZvciBpIDo9IGludDMyKDEpOyBpIDwgNTsgaSsrIHsKKwkJcG9zW2ldID0gaQorCQluZWdbLWldID0gLWkKKwl9CisJcls0XSA9IHBvcworCXJbLTRdID0gbmVnCisKKwlyZXR1cm4gciwgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0SW5zYW5pdHkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJndW1lbnQgKnRocmlmdHRlc3QuSW5zYW5pdHkpIChyIG1hcFt0aHJpZnR0ZXN0LlVzZXJJZF1tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5LCBlcnIgZXJyb3IpIHsKKwloZWxsbyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJaGVsbG8uU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgorCWhlbGxvLkJ5dGVUaGluZyA9IDIKKwloZWxsby5JMzJUaGluZyA9IDIKKwloZWxsby5JNjRUaGluZyA9IDIKKworCWdvb2RieWUgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCWdvb2RieWUuU3RyaW5nVGhpbmcgPSAiR29vZGJ5ZTQiCisJZ29vZGJ5ZS5CeXRlVGhpbmcgPSA0CisJZ29vZGJ5ZS5JMzJUaGluZyA9IDQKKwlnb29kYnllLkk2NFRoaW5nID0gNAorCisJY3JhenkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCisJY3JhenkuVXNlck1hcCA9IG1ha2UobWFwW3RocmlmdHRlc3QuTnVtYmVyel10aHJpZnR0ZXN0LlVzZXJJZCkKKwljcmF6eS5Vc2VyTWFwW3RocmlmdHRlc3QuTnVtYmVyel9FSUdIVF0gPSA4CisJY3JhenkuVXNlck1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfRklWRV0gPSA1CisJY3JhenkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0e2dvb2RieWUsIGhlbGxvfQorCisJZmlyc3RfbWFwIDo9IG1ha2UobWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSkKKwlzZWNvbmRfbWFwIDo9IG1ha2UobWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSkKKworCWZpcnN0X21hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPXSA9IGNyYXp5CisJZmlyc3RfbWFwW3RocmlmdHRlc3QuTnVtYmVyel9USFJFRV0gPSBjcmF6eQorCisJbG9vbmV5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCXNlY29uZF9tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X1NJWF0gPSBsb29uZXkKKworCXZhciBpbnNhbmUgPSBtYWtlKG1hcFt0aHJpZnR0ZXN0LlVzZXJJZF1tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5KQorCWluc2FuZVsxXSA9IGZpcnN0X21hcAorCWluc2FuZVsyXSA9IHNlY29uZF9tYXAKKworCXJldHVybiBpbnNhbmUsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE11bHRpKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgaW50OCwgYXJnMSBpbnQzMiwgYXJnMiBpbnQ2NCwgYXJnMyBtYXBbaW50MTZdc3RyaW5nLCBhcmc0IHRocmlmdHRlc3QuTnVtYmVyeiwgYXJnNSB0aHJpZnR0ZXN0LlVzZXJJZCkgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlyID0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCXIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgorCXIuQnl0ZVRoaW5nID0gYXJnMAorCXIuSTMyVGhpbmcgPSBhcmcxCisJci5JNjRUaGluZyA9IGFyZzIKKwlyZXR1cm4gciwgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBzdHJpbmcpIChlcnIgZXJyb3IpIHsKKwlpZiBhcmcgPT0gIlhjZXB0aW9uIiB7CisJCXggOj0gdGhyaWZ0dGVzdC5OZXdYY2VwdGlvbigpCisJCXguRXJyb3JDb2RlID0gMTAwMQorCQl4Lk1lc3NhZ2UgPSBhcmcKKwkJcmV0dXJuIHgKKwl9IGVsc2UgaWYgYXJnID09ICJURXhjZXB0aW9uIiB7CisJCXJldHVybiB0aHJpZnQuVEV4Y2VwdGlvbihlcnJvcnMuTmV3KGFyZykpCisJfSBlbHNlIHsKKwkJcmV0dXJuIG5pbAorCX0KK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CisJaWYgYXJnMCA9PSAiWGNlcHRpb24iIHsKKwkJeCA6PSB0aHJpZnR0ZXN0Lk5ld1hjZXB0aW9uKCkKKwkJeC5FcnJvckNvZGUgPSAxMDAxCisJCXguTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorCQlyZXR1cm4gbmlsLCB4CisJfSBlbHNlIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIgeworCQl4MiA6PSB0aHJpZnR0ZXN0Lk5ld1hjZXB0aW9uMigpCisJCXgyLkVycm9yQ29kZSA9IDIwMDIKKwkJeDIuU3RydWN0VGhpbmcgPSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJCXgyLlN0cnVjdFRoaW5nLlN0cmluZ1RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorCQlyZXR1cm4gbmlsLCB4MgorCX0KKworCXJlcyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJcmVzLlN0cmluZ1RoaW5nID0gYXJnMQorCXJldHVybiByZXMsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE9uZXdheShjdHggY29udGV4dC5Db250ZXh0LCBzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgeworCXRpbWUuU2xlZXAodGltZS5TZWNvbmQgKiB0aW1lLkR1cmF0aW9uKHNlY29uZHNUb1NsZWVwKSkKKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9iaW5hcnlfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2JpbmFyeV90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYWUyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9iaW5hcnlfdGVzdC5nbwpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkidW5pb25iaW5hcnl0ZXN0IgorKQorCisKKy8vIFNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTczCitmdW5jIFRlc3RVbmlvbkJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IHVuaW9uYmluYXJ5dGVzdC5OZXdTYW1wbGUoKQorCXMuVTEgPSBtYXBbc3RyaW5nXXN0cmluZ3t9CisJcy5VMiA9IFtdYnl0ZXt9CisJaWYgbiA6PSBzLkNvdW50U2V0RmllbGRzU2FtcGxlKCk7IG4gIT0gMiB7CisJCXQuRXJyb3JmKCJFeHBlY3RlZCAyIHNldCBmaWVsZHMsIGdvdCAlZCEiLCBuKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2RlZmF1bHRfdmFsdWVfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2RlZmF1bHRfdmFsdWVfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNiZjRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fZGVmYXVsdF92YWx1ZV90ZXN0LmdvCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorCSJ1bmlvbmRlZmF1bHR2YWx1ZXRlc3QiCispCisKK2Z1bmMgVGVzdFVuaW9uRGVmYXVsdFZhbHVlKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gdW5pb25kZWZhdWx0dmFsdWV0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCWQgOj0gcy5HZXREZXNjZW5kYW50KCkKKwlpZiBkID09IG5pbCB7CisJCXQuRXJyb3IoIkRlZmF1bHQgVW5pb24gdmFsdWUgbm90IHNldCEiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkN2VlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2NvbnN0ICgKKwlVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAgPSAwCisJVU5LTk9XTl9NRVRIT0QgICAgICAgICAgICAgICAgID0gMQorCUlOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiA9IDIKKwlXUk9OR19NRVRIT0RfTkFNRSAgICAgICAgICAgICAgPSAzCisJQkFEX1NFUVVFTkNFX0lEICAgICAgICAgICAgICAgID0gNAorCU1JU1NJTkdfUkVTVUxUICAgICAgICAgICAgICAgICA9IDUKKwlJTlRFUk5BTF9FUlJPUiAgICAgICAgICAgICAgICAgPSA2CisJUFJPVE9DT0xfRVJST1IgICAgICAgICAgICAgICAgID0gNworKQorCit2YXIgZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT046ICAidW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iLAorCVVOS05PV05fTUVUSE9EOiAgICAgICAgICAgICAgICAgInVua25vd24gbWV0aG9kIiwKKwlJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT046ICJpbnZhbGlkIG1lc3NhZ2UgdHlwZSIsCisJV1JPTkdfTUVUSE9EX05BTUU6ICAgICAgICAgICAgICAid3JvbmcgbWV0aG9kIG5hbWUiLAorCUJBRF9TRVFVRU5DRV9JRDogICAgICAgICAgICAgICAgImJhZCBzZXF1ZW5jZSBJRCIsCisJTUlTU0lOR19SRVNVTFQ6ICAgICAgICAgICAgICAgICAibWlzc2luZyByZXN1bHQiLAorCUlOVEVSTkFMX0VSUk9SOiAgICAgICAgICAgICAgICAgInVua25vd24gaW50ZXJuYWwgZXJyb3IiLAorCVBST1RPQ09MX0VSUk9SOiAgICAgICAgICAgICAgICAgInVua25vd24gcHJvdG9jb2wgZXJyb3IiLAorfQorCisvLyBBcHBsaWNhdGlvbiBsZXZlbCBUaHJpZnQgZXhjZXB0aW9uCit0eXBlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCVRFeGNlcHRpb24KKwlUeXBlSWQoKSBpbnQzMgorCVJlYWQoaXByb3QgVFByb3RvY29sKSBlcnJvcgorCVdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IKK30KKwordHlwZSB0QXBwbGljYXRpb25FeGNlcHRpb24gc3RydWN0IHsKKwltZXNzYWdlIHN0cmluZworCXR5cGVfICAgaW50MzIKK30KKworZnVuYyAoZSB0QXBwbGljYXRpb25FeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKKwlpZiBlLm1lc3NhZ2UgIT0gIiIgeworCQlyZXR1cm4gZS5tZXNzYWdlCisJfQorCXJldHVybiBkZWZhdWx0QXBwbGljYXRpb25FeGNlcHRpb25NZXNzYWdlW2UudHlwZV9dCit9CisKK2Z1bmMgTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGVfIGludDMyLCBtZXNzYWdlIHN0cmluZykgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKwlyZXR1cm4gJnRBcHBsaWNhdGlvbkV4Y2VwdGlvbnttZXNzYWdlLCB0eXBlX30KK30KKworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBUeXBlSWQoKSBpbnQzMiB7CisJcmV0dXJuIHAudHlwZV8KK30KKworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCS8vIFRPRE86IHRoaXMgc2hvdWxkIHJlYWxseSBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyCisJXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwltZXNzYWdlIDo9ICIiCisJdHlwZV8gOj0gaW50MzIoVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04pCisKKwlmb3IgeworCQlfLCB0dHlwZSwgaWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWlmIHR0eXBlID09IFNUT1AgeworCQkJYnJlYWsKKwkJfQorCQlzd2l0Y2ggaWQgeworCQljYXNlIDE6CisJCQlpZiB0dHlwZSA9PSBTVFJJTkcgeworCQkJCWlmIG1lc3NhZ2UsIGVyciA9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9CisJCWNhc2UgMjoKKwkJCWlmIHR0eXBlID09IEkzMiB7CisJCQkJaWYgdHlwZV8sIGVyciA9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7CisJCQkJCXJldHVybiBlcnIKKwkJCQl9CisJCQl9CisJCWRlZmF1bHQ6CisJCQlpZiBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJfQorCQlpZiBlcnIgPSBpcHJvdC5SZWFkRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwl9CisJaWYgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwlwLm1lc3NhZ2UgPSBtZXNzYWdlCisJcC50eXBlXyA9IHR5cGVfCisKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgV3JpdGUob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbigiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwlpZiBsZW4ocC5FcnJvcigpKSA+IDAgeworCQllcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIm1lc3NhZ2UiLCBTVFJJTkcsIDEpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwkJZXJyID0gb3Byb3QuV3JpdGVTdHJpbmcocC5FcnJvcigpKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJCWVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigidHlwZSIsIEkzMiwgMikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlSTMyKHAudHlwZV8pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwllcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlRmllbGRTdG9wKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCWVyciA9IG9wcm90LldyaXRlU3RydWN0RW5kKCkKKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDMzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHQgKnRlc3RpbmcuVCkgeworCWV4YyA6PSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04sICIiKQorCWlmIGV4Yy5FcnJvcigpICE9IGRlZmF1bHRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1lc3NhZ2VbVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT05dIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGVkIGVtcHR5IHN0cmluZyBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLkVycm9yKCkpCisJfQorCWlmIGV4Yy5UeXBlSWQoKSAhPSBVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCB0eXBlIFVOS05PV04gZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyV2JyIsIGV4Yy5UeXBlSWQoKSkKKwl9CisJZXhjID0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFdST05HX01FVEhPRF9OQU1FLCAianVua19tZXRob2QiKQorCWlmIGV4Yy5FcnJvcigpICE9ICJqdW5rX21ldGhvZCIgeworCQl0LkZhdGFsZigiRXhwZWN0ZWQgJ2p1bmtfbWV0aG9kJyBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLkVycm9yKCkpCisJfQorCWlmIGV4Yy5UeXBlSWQoKSAhPSBXUk9OR19NRVRIT0RfTkFNRSB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCB0eXBlIFdST05HX01FVEhPRF9OQU1FIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICcldiciLCBleGMuVHlwZUlkKCkpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjkwYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSw1MDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImNvbnRleHQiCisJImVuY29kaW5nL2JpbmFyeSIKKwkiZXJyb3JzIgorCSJmbXQiCisJImlvIgorCSJtYXRoIgorKQorCit0eXBlIFRCaW5hcnlQcm90b2NvbCBzdHJ1Y3QgeworCXRyYW5zICAgICAgICAgVFJpY2hUcmFuc3BvcnQKKwlvcmlnVHJhbnNwb3J0IFRUcmFuc3BvcnQKKwlyZWFkZXIgICAgICAgIGlvLlJlYWRlcgorCXdyaXRlciAgICAgICAgaW8uV3JpdGVyCisJc3RyaWN0UmVhZCAgICBib29sCisJc3RyaWN0V3JpdGUgICBib29sCisJYnVmZmVyICAgICAgICBbNjRdYnl0ZQorfQorCit0eXBlIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnkgc3RydWN0IHsKKwlzdHJpY3RSZWFkICBib29sCisJc3RyaWN0V3JpdGUgYm9vbAorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0IFRUcmFuc3BvcnQpICpUQmluYXJ5UHJvdG9jb2wgeworCXJldHVybiBOZXdUQmluYXJ5UHJvdG9jb2wodCwgZmFsc2UsIHRydWUpCit9CisKK2Z1bmMgTmV3VEJpbmFyeVByb3RvY29sKHQgVFRyYW5zcG9ydCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUgYm9vbCkgKlRCaW5hcnlQcm90b2NvbCB7CisJcCA6PSAmVEJpbmFyeVByb3RvY29se29yaWdUcmFuc3BvcnQ6IHQsIHN0cmljdFJlYWQ6IHN0cmljdFJlYWQsIHN0cmljdFdyaXRlOiBzdHJpY3RXcml0ZX0KKwlpZiBldCwgb2sgOj0gdC4oVFJpY2hUcmFuc3BvcnQpOyBvayB7CisJCXAudHJhbnMgPSBldAorCX0gZWxzZSB7CisJCXAudHJhbnMgPSBOZXdUUmljaFRyYW5zcG9ydCh0KQorCX0KKwlwLnJlYWRlciA9IHAudHJhbnMKKwlwLndyaXRlciA9IHAudHJhbnMKKwlyZXR1cm4gcAorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KGZhbHNlLCB0cnVlKQorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbEZhY3Rvcnkoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUgYm9vbCkgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVEJpbmFyeVByb3RvY29sRmFjdG9yeXtzdHJpY3RSZWFkOiBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZTogc3RyaWN0V3JpdGV9Cit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHQgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKKwlyZXR1cm4gTmV3VEJpbmFyeVByb3RvY29sKHQsIHAuc3RyaWN0UmVhZCwgcC5zdHJpY3RXcml0ZSkKK30KKworLyoqCisgKiBXcml0aW5nIE1ldGhvZHMKKyAqLworCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMikgZXJyb3IgeworCWlmIHAuc3RyaWN0V3JpdGUgeworCQl2ZXJzaW9uIDo9IHVpbnQzMihWRVJTSU9OXzEpIHwgdWludDMyKHR5cGVJZCkKKwkJZSA6PSBwLldyaXRlSTMyKGludDMyKHZlcnNpb24pKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gZQorCQl9CisJCWUgPSBwLldyaXRlU3RyaW5nKG5hbWUpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBlCisJCX0KKwkJZSA9IHAuV3JpdGVJMzIoc2VxSWQpCisJCXJldHVybiBlCisJfSBlbHNlIHsKKwkJZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBlCisJCX0KKwkJZSA9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSkKKwkJaWYgZSAhPSBuaWwgeworCQkJcmV0dXJuIGUKKwkJfQorCQllID0gcC5Xcml0ZUkzMihzZXFJZCkKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJZSA6PSBwLldyaXRlQnl0ZShpbnQ4KHR5cGVJZCkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwllID0gcC5Xcml0ZUkxNihpZCkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUJ5dGUoU1RPUCkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUJ5dGUoaW50OChrZXlUeXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWUgPSBwLldyaXRlQnl0ZShpbnQ4KHZhbHVlVHlwZSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwllID0gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVCeXRlKGludDgoZWxlbVR5cGUpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJZSA9IHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCisJcmV0dXJuIGUKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGVsZW1UeXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWUgPSBwLldyaXRlSTMyKGludDMyKHNpemUpKQorCXJldHVybiBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvciB7CisJaWYgdmFsdWUgeworCQlyZXR1cm4gcC5Xcml0ZUJ5dGUoMSkKKwl9CisJcmV0dXJuIHAuV3JpdGVCeXRlKDApCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVCeXRlKHZhbHVlIGludDgpIGVycm9yIHsKKwllIDo9IHAudHJhbnMuV3JpdGVCeXRlKGJ5dGUodmFsdWUpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUkxNih2YWx1ZSBpbnQxNikgZXJyb3IgeworCXYgOj0gcC5idWZmZXJbMDoyXQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDE2KHYsIHVpbnQxNih2YWx1ZSkpCisJXywgZSA6PSBwLndyaXRlci5Xcml0ZSh2KQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUkzMih2YWx1ZSBpbnQzMikgZXJyb3IgeworCXYgOj0gcC5idWZmZXJbMDo0XQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDMyKHYsIHVpbnQzMih2YWx1ZSkpCisJXywgZSA6PSBwLndyaXRlci5Xcml0ZSh2KQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgZXJyb3IgeworCXYgOj0gcC5idWZmZXJbMDo4XQorCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDY0KHYsIHVpbnQ2NCh2YWx1ZSkpCisJXywgZXJyIDo9IHAud3JpdGVyLldyaXRlKHYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVEb3VibGUodmFsdWUgZmxvYXQ2NCkgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTY0KGludDY0KG1hdGguRmxvYXQ2NGJpdHModmFsdWUpKSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVJMzIoaW50MzIobGVuKHZhbHVlKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlfLCBlcnIgOj0gcC50cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUJpbmFyeSh2YWx1ZSBbXWJ5dGUpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVJMzIoaW50MzIobGVuKHZhbHVlKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlfLCBlcnIgOj0gcC53cml0ZXIuV3JpdGUodmFsdWUpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8qKgorICogUmVhZGluZyBtZXRob2RzCisgKi8KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJc2l6ZSwgZSA6PSBwLlJlYWRJMzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCB0eXBlSWQsIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBzaXplIDwgMCB7CisJCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShzaXplICYgMHgwZmYpCisJCXZlcnNpb24gOj0gaW50NjQoaW50NjQoc2l6ZSkgJiBWRVJTSU9OX01BU0spCisJCWlmIHZlcnNpb24gIT0gVkVSU0lPTl8xIHsKKwkJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShCQURfVkVSU0lPTiwgZm10LkVycm9yZigiQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbiIpKQorCQl9CisJCW5hbWUsIGUgPSBwLlJlYWRTdHJpbmcoKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJc2VxSWQsIGUgPSBwLlJlYWRJMzIoKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAorCX0KKwlpZiBwLnN0cmljdFJlYWQgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoQkFEX1ZFUlNJT04sIGZtdC5FcnJvcmYoIk1pc3NpbmcgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luIikpCisJfQorCW5hbWUsIGUyIDo9IHAucmVhZFN0cmluZ0JvZHkoc2l6ZSkKKwlpZiBlMiAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZTIKKwl9CisJYiwgZTMgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZTMgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGUzCisJfQorCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShiKQorCXNlcUlkLCBlNCA6PSBwLlJlYWRJMzIoKQorCWlmIGU0ICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlNAorCX0KKwlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgc2VxSWQgaW50MTYsIGVyciBlcnJvcikgeworCXQsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwl0eXBlSWQgPSBUVHlwZSh0KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWlmIHQgIT0gU1RPUCB7CisJCXNlcUlkLCBlcnIgPSBwLlJlYWRJMTYoKQorCX0KKwlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKwordmFyIGludmFsaWREYXRhTGVuZ3RoID0gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJJbnZhbGlkIGRhdGEgbGVuZ3RoIikpCisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtUeXBlLCB2VHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWssIGUgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWtUeXBlID0gVFR5cGUoaykKKwl2LCBlIDo9IHAuUmVhZEJ5dGUoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwl2VHlwZSA9IFRUeXBlKHYpCisJc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWlmIHNpemUzMiA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisJc2l6ZSA9IGludChzaXplMzIpCisJcmV0dXJuIGtUeXBlLCB2VHlwZSwgc2l6ZSwgbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1hcEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWIsIGUgOj0gcC5SZWFkQnl0ZSgpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWVsZW1UeXBlID0gVFR5cGUoYikKKwlzaXplMzIsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJaWYgc2l6ZTMyIDwgMCB7CisJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCXJldHVybgorCX0KKwlzaXplID0gaW50KHNpemUzMikKKworCXJldHVybgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwliLCBlIDo9IHAuUmVhZEJ5dGUoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwllbGVtVHlwZSA9IFRUeXBlKGIpCisJc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWlmIHNpemUzMiA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisJc2l6ZSA9IGludChzaXplMzIpCisJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBlcnJvcikgeworCWIsIGUgOj0gcC5SZWFkQnl0ZSgpCisJdiA6PSB0cnVlCisJaWYgYiAhPSAxIHsKKwkJdiA9IGZhbHNlCisJfQorCXJldHVybiB2LCBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC50cmFucy5SZWFkQnl0ZSgpCisJcmV0dXJuIGludDgodiksIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikgeworCWJ1ZiA6PSBwLmJ1ZmZlclswOjJdCisJZXJyID0gcC5yZWFkQWxsKGJ1ZikKKwl2YWx1ZSA9IGludDE2KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGJ1ZikpCisJcmV0dXJuIHZhbHVlLCBlcnIKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpIHsKKwlidWYgOj0gcC5idWZmZXJbMDo0XQorCWVyciA9IHAucmVhZEFsbChidWYpCisJdmFsdWUgPSBpbnQzMihiaW5hcnkuQmlnRW5kaWFuLlVpbnQzMihidWYpKQorCXJldHVybiB2YWx1ZSwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIGVycm9yKSB7CisJYnVmIDo9IHAuYnVmZmVyWzA6OF0KKwllcnIgPSBwLnJlYWRBbGwoYnVmKQorCXZhbHVlID0gaW50NjQoYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoYnVmKSkKKwlyZXR1cm4gdmFsdWUsIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJYnVmIDo9IHAuYnVmZmVyWzA6OF0KKwllcnIgPSBwLnJlYWRBbGwoYnVmKQorCXZhbHVlID0gbWF0aC5GbG9hdDY0ZnJvbWJpdHMoYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoYnVmKSkKKwlyZXR1cm4gdmFsdWUsIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlzaXplLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gIiIsIGUKKwl9CisJaWYgc2l6ZSA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisKKwlyZXR1cm4gcC5yZWFkU3RyaW5nQm9keShzaXplKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXNpemUsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGUKKwl9CisJaWYgc2l6ZSA8IDAgeworCQlyZXR1cm4gbmlsLCBpbnZhbGlkRGF0YUxlbmd0aAorCX0KKworCWlzaXplIDo9IGludChzaXplKQorCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgaXNpemUpCisJXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGJ1ZikKKwlyZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHAudHJhbnMuRmx1c2goY3R4KSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC5vcmlnVHJhbnNwb3J0Cit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgcmVhZEFsbChidWYgW11ieXRlKSBlcnJvciB7CisJXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAucmVhZGVyLCBidWYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2NvbnN0IHJlYWRMaW1pdCA9IDMyNzY4CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgcmVhZFN0cmluZ0JvZHkoc2l6ZSBpbnQzMikgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7CisJaWYgc2l6ZSA8IDAgeworCQlyZXR1cm4gIiIsIG5pbAorCX0KKworCXZhciAoCisJCWJ1ZiBieXRlcy5CdWZmZXIKKwkJZSAgIGVycm9yCisJCWIgICBbXWJ5dGUKKwkpCisKKwlzd2l0Y2ggeworCWNhc2UgaW50KHNpemUpIDw9IGxlbihwLmJ1ZmZlcik6CisJCWIgPSBwLmJ1ZmZlcls6c2l6ZV0gLy8gYXZvaWRzIGFsbG9jYXRpb24gZm9yIHNtYWxsIHJlYWRzCisJY2FzZSBpbnQoc2l6ZSkgPCByZWFkTGltaXQ6CisJCWIgPSBtYWtlKFtdYnl0ZSwgc2l6ZSkKKwlkZWZhdWx0OgorCQliID0gbWFrZShbXWJ5dGUsIHJlYWRMaW1pdCkKKwl9CisKKwlmb3Igc2l6ZSA+IDAgeworCQlfLCBlID0gaW8uUmVhZEZ1bGwocC50cmFucywgYikKKwkJYnVmLldyaXRlKGIpCisJCWlmIGUgIT0gbmlsIHsKKwkJCWJyZWFrCisJCX0KKwkJc2l6ZSAtPSByZWFkTGltaXQKKwkJaWYgc2l6ZSA8IHJlYWRMaW1pdCAmJiBzaXplID4gMCB7CisJCQliID0gYls6c2l6ZV0KKwkJfQorCX0KKwlyZXR1cm4gYnVmLlN0cmluZygpLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjJjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0UmVhZFdyaXRlQmluYXJ5UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CisJUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQsIE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzAyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJjb250ZXh0IgorKQorCit0eXBlIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlzaXplIGludAorfQorCit0eXBlIFRCdWZmZXJlZFRyYW5zcG9ydCBzdHJ1Y3QgeworCWJ1ZmlvLlJlYWRXcml0ZXIKKwl0cCBUVHJhbnNwb3J0Cit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCBwLnNpemUpLCBuaWwKK30KKworZnVuYyBOZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KGJ1ZmZlclNpemUgaW50KSAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5e3NpemU6IGJ1ZmZlclNpemV9Cit9CisKK2Z1bmMgTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQsIGJ1ZmZlclNpemUgaW50KSAqVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlRCdWZmZXJlZFRyYW5zcG9ydHsKKwkJUmVhZFdyaXRlcjogYnVmaW8uUmVhZFdyaXRlcnsKKwkJCVJlYWRlcjogYnVmaW8uTmV3UmVhZGVyU2l6ZSh0cmFucywgYnVmZmVyU2l6ZSksCisJCQlXcml0ZXI6IGJ1ZmlvLk5ld1dyaXRlclNpemUodHJhbnMsIGJ1ZmZlclNpemUpLAorCQl9LAorCQl0cDogdHJhbnMsCisJfQorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIElzT3BlbigpIGJvb2wgeworCXJldHVybiBwLnRwLklzT3BlbigpCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgT3BlbigpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcC50cC5PcGVuKCkKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBDbG9zZSgpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcC50cC5DbG9zZSgpCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgUmVhZChiIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwluLCBlcnIgOj0gcC5SZWFkV3JpdGVyLlJlYWQoYikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLlJlYWRlci5SZXNldChwLnRwKQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgV3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuUmVhZFdyaXRlci5Xcml0ZShiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLlJlYWRXcml0ZXIuV3JpdGVyLlJlc2V0KHAudHApCisJfQorCXJldHVybiBuLCBlcnIKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJaWYgZXJyIDo9IHAuUmVhZFdyaXRlci5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLldyaXRlci5SZXNldChwLnRwKQorCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiBwLnRwLkZsdXNoKGN0eCkKK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJcmV0dXJuIHAudHAuUmVtYWluaW5nQnl0ZXMoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlYzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RCdWZmZXJlZFRyYW5zcG9ydCh0ICp0ZXN0aW5nLlQpIHsKKwl0cmFucyA6PSBOZXdUQnVmZmVyZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCAxMDI0MCkKKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY2xpZW50LmdvIGIvbGliL2dvL3RocmlmdC9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3OTFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY2xpZW50LmdvCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKykKKwordHlwZSBUQ2xpZW50IGludGVyZmFjZSB7CisJQ2FsbChjdHggY29udGV4dC5Db250ZXh0LCBtZXRob2Qgc3RyaW5nLCBhcmdzLCByZXN1bHQgVFN0cnVjdCkgZXJyb3IKK30KKwordHlwZSBUU3RhbmRhcmRDbGllbnQgc3RydWN0IHsKKwlzZXFJZCAgICAgICAgaW50MzIKKwlpcHJvdCwgb3Byb3QgVFByb3RvY29sCit9CisKKy8vIFRTdGFuZGFyZENsaWVudCBpbXBsZW1lbnRzIFRDbGllbnQsIGFuZCB1c2VzIHRoZSBzdGFuZGFyZCBtZXNzYWdlIGZvcm1hdCBmb3IgVGhyaWZ0LgorLy8gSXQgaXMgbm90IHNhZmUgZm9yIGNvbmN1cnJlbnQgdXNlLgorZnVuYyBOZXdUU3RhbmRhcmRDbGllbnQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgVFByb3RvY29sKSAqVFN0YW5kYXJkQ2xpZW50IHsKKwlyZXR1cm4gJlRTdGFuZGFyZENsaWVudHsKKwkJaXByb3Q6IGlucHV0UHJvdG9jb2wsCisJCW9wcm90OiBvdXRwdXRQcm90b2NvbCwKKwl9Cit9CisKK2Z1bmMgKHAgKlRTdGFuZGFyZENsaWVudCkgU2VuZChjdHggY29udGV4dC5Db250ZXh0LCBvcHJvdCBUUHJvdG9jb2wsIHNlcUlkIGludDMyLCBtZXRob2Qgc3RyaW5nLCBhcmdzIFRTdHJ1Y3QpIGVycm9yIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kLCBDQUxMLCBzZXFJZCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBhcmdzLldyaXRlKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gb3Byb3QuRmx1c2goY3R4KQorfQorCitmdW5jIChwICpUU3RhbmRhcmRDbGllbnQpIFJlY3YoaXByb3QgVFByb3RvY29sLCBzZXFJZCBpbnQzMiwgbWV0aG9kIHN0cmluZywgcmVzdWx0IFRTdHJ1Y3QpIGVycm9yIHsKKwlyTWV0aG9kLCByVHlwZUlkLCByU2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCWlmIG1ldGhvZCAhPSByTWV0aG9kIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgZm10LlNwcmludGYoIiVzOiB3cm9uZyBtZXRob2QgbmFtZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHNlcUlkICE9IHJTZXFJZCB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oQkFEX1NFUVVFTkNFX0lELCBmbXQuU3ByaW50ZigiJXM6IG91dCBvZiBvcmRlciBzZXF1ZW5jZSByZXNwb25zZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHJUeXBlSWQgPT0gRVhDRVBUSU9OIHsKKwkJdmFyIGV4Y2VwdGlvbiB0QXBwbGljYXRpb25FeGNlcHRpb24KKwkJaWYgZXJyIDo9IGV4Y2VwdGlvbi5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlpZiBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlyZXR1cm4gJmV4Y2VwdGlvbgorCX0gZWxzZSBpZiByVHlwZUlkICE9IFJFUExZIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04sIGZtdC5TcHJpbnRmKCIlczogaW52YWxpZCBtZXNzYWdlIHR5cGUiLCBtZXRob2QpKQorCX0KKworCWlmIGVyciA6PSByZXN1bHQuUmVhZChpcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJcmV0dXJuIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkKK30KKworZnVuYyAocCAqVFN0YW5kYXJkQ2xpZW50KSBDYWxsKGN0eCBjb250ZXh0LkNvbnRleHQsIG1ldGhvZCBzdHJpbmcsIGFyZ3MsIHJlc3VsdCBUU3RydWN0KSBlcnJvciB7CisJcC5zZXFJZCsrCisJc2VxSWQgOj0gcC5zZXFJZAorCisJaWYgZXJyIDo9IHAuU2VuZChjdHgsIHAub3Byb3QsIHNlcUlkLCBtZXRob2QsIGFyZ3MpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCS8vIG1ldGhvZCBpcyBvbmV3YXkKKwlpZiByZXN1bHQgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKworCXJldHVybiBwLlJlY3YocC5pcHJvdCwgc2VxSWQsIG1ldGhvZCwgcmVzdWx0KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1OTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKK3R5cGUgbW9ja1Byb2Nlc3NvciBzdHJ1Y3QgeworCVByb2Nlc3NGdW5jIGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCitmdW5jIChtICptb2NrUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCXJldHVybiBtLlByb2Nlc3NGdW5jKGluLCBvdXQpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwMGQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbwpAQCAtMCwwICsxLDgxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iaW5hcnkiCisJImZtdCIKKwkiaW8iCisJIm1hdGgiCispCisKK2NvbnN0ICgKKwlDT01QQUNUX1BST1RPQ09MX0lEICAgICAgID0gMHgwODIKKwlDT01QQUNUX1ZFUlNJT04gICAgICAgICAgID0gMQorCUNPTVBBQ1RfVkVSU0lPTl9NQVNLICAgICAgPSAweDFmCisJQ09NUEFDVF9UWVBFX01BU0sgICAgICAgICA9IDB4MEUwCisJQ09NUEFDVF9UWVBFX0JJVFMgICAgICAgICA9IDB4MDcKKwlDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UID0gNQorKQorCit0eXBlIHRDb21wYWN0VHlwZSBieXRlCisKK2NvbnN0ICgKKwlDT01QQUNUX0JPT0xFQU5fVFJVRSAgPSAweDAxCisJQ09NUEFDVF9CT09MRUFOX0ZBTFNFID0gMHgwMgorCUNPTVBBQ1RfQllURSAgICAgICAgICA9IDB4MDMKKwlDT01QQUNUX0kxNiAgICAgICAgICAgPSAweDA0CisJQ09NUEFDVF9JMzIgICAgICAgICAgID0gMHgwNQorCUNPTVBBQ1RfSTY0ICAgICAgICAgICA9IDB4MDYKKwlDT01QQUNUX0RPVUJMRSAgICAgICAgPSAweDA3CisJQ09NUEFDVF9CSU5BUlkgICAgICAgID0gMHgwOAorCUNPTVBBQ1RfTElTVCAgICAgICAgICA9IDB4MDkKKwlDT01QQUNUX1NFVCAgICAgICAgICAgPSAweDBBCisJQ09NUEFDVF9NQVAgICAgICAgICAgID0gMHgwQgorCUNPTVBBQ1RfU1RSVUNUICAgICAgICA9IDB4MEMKKykKKwordmFyICgKKwl0dHlwZVRvQ29tcGFjdFR5cGUgbWFwW1RUeXBlXXRDb21wYWN0VHlwZQorKQorCitmdW5jIGluaXQoKSB7CisJdHR5cGVUb0NvbXBhY3RUeXBlID0gbWFwW1RUeXBlXXRDb21wYWN0VHlwZXsKKwkJU1RPUDogICBTVE9QLAorCQlCT09MOiAgIENPTVBBQ1RfQk9PTEVBTl9UUlVFLAorCQlCWVRFOiAgIENPTVBBQ1RfQllURSwKKwkJSTE2OiAgICBDT01QQUNUX0kxNiwKKwkJSTMyOiAgICBDT01QQUNUX0kzMiwKKwkJSTY0OiAgICBDT01QQUNUX0k2NCwKKwkJRE9VQkxFOiBDT01QQUNUX0RPVUJMRSwKKwkJU1RSSU5HOiBDT01QQUNUX0JJTkFSWSwKKwkJTElTVDogICBDT01QQUNUX0xJU1QsCisJCVNFVDogICAgQ09NUEFDVF9TRVQsCisJCU1BUDogICAgQ09NUEFDVF9NQVAsCisJCVNUUlVDVDogQ09NUEFDVF9TVFJVQ1QsCisJfQorfQorCit0eXBlIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSAqVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVENvbXBhY3RQcm90b2NvbEZhY3Rvcnl7fQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKKwlyZXR1cm4gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKK30KKwordHlwZSBUQ29tcGFjdFByb3RvY29sIHN0cnVjdCB7CisJdHJhbnMgICAgICAgICBUUmljaFRyYW5zcG9ydAorCW9yaWdUcmFuc3BvcnQgVFRyYW5zcG9ydAorCisJLy8gVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKwkvLyBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorCWxhc3RGaWVsZCAgIFtdaW50CisJbGFzdEZpZWxkSWQgaW50CisKKwkvLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKwkvLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisJYm9vbGVhbkZpZWxkTmFtZSAgICBzdHJpbmcKKwlib29sZWFuRmllbGRJZCAgICAgIGludDE2CisJYm9vbGVhbkZpZWxkUGVuZGluZyBib29sCisKKwkvLyBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKwkvLyB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZEJvb2wgY2FuIHVzZSBpdC4KKwlib29sVmFsdWUgICAgICAgICAgYm9vbAorCWJvb2xWYWx1ZUlzTm90TnVsbCBib29sCisJYnVmZmVyICAgICAgICAgICAgIFs2NF1ieXRlCit9CisKKy8vIENyZWF0ZSBhIFRDb21wYWN0UHJvdG9jb2wgZ2l2ZW4gYSBUVHJhbnNwb3J0CitmdW5jIE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgKlRDb21wYWN0UHJvdG9jb2wgeworCXAgOj0gJlRDb21wYWN0UHJvdG9jb2x7b3JpZ1RyYW5zcG9ydDogdHJhbnMsIGxhc3RGaWVsZDogW11pbnR7fX0KKwlpZiBldCwgb2sgOj0gdHJhbnMuKFRSaWNoVHJhbnNwb3J0KTsgb2sgeworCQlwLnRyYW5zID0gZXQKKwl9IGVsc2UgeworCQlwLnRyYW5zID0gTmV3VFJpY2hUcmFuc3BvcnQodHJhbnMpCisJfQorCisJcmV0dXJuIHAKKworfQorCisvLworLy8gUHVibGljIFdyaXRpbmcgbWV0aG9kcy4KKy8vCisKKy8vIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKKy8vIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSBlcnJvciB7CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KENPTVBBQ1RfUFJPVE9DT0xfSUQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwllcnIgPSBwLndyaXRlQnl0ZURpcmVjdCgoQ09NUEFDVF9WRVJTSU9OICYgQ09NUEFDVF9WRVJTSU9OX01BU0spIHwgKChieXRlKHR5cGVJZCkgPDwgQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCkgJiBDT01QQUNUX1RZUEVfTUFTSykpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlfLCBlcnIgPSBwLndyaXRlVmFyaW50MzIoc2VxaWQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwllIDo9IHAuV3JpdGVTdHJpbmcobmFtZSkKKwlyZXR1cm4gZQorCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQorLy8gdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisvLyBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIGVycm9yIHsKKwlwLmxhc3RGaWVsZCA9IGFwcGVuZChwLmxhc3RGaWVsZCwgcC5sYXN0RmllbGRJZCkKKwlwLmxhc3RGaWVsZElkID0gMAorCXJldHVybiBuaWwKK30KKworLy8gV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKKy8vIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorLy8gb2YgdGhlIGZpZWxkIHN0YWNrLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcC5sYXN0RmllbGRJZCA9IHAubGFzdEZpZWxkW2xlbihwLmxhc3RGaWVsZCktMV0KKwlwLmxhc3RGaWVsZCA9IHAubGFzdEZpZWxkWzpsZW4ocC5sYXN0RmllbGQpLTFdCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yIHsKKwlpZiB0eXBlSWQgPT0gQk9PTCB7CisJCS8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCisJCXAuYm9vbGVhbkZpZWxkTmFtZSwgcC5ib29sZWFuRmllbGRJZCwgcC5ib29sZWFuRmllbGRQZW5kaW5nID0gbmFtZSwgaWQsIHRydWUKKwkJcmV0dXJuIG5pbAorCX0KKwlfLCBlcnIgOj0gcC53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0eXBlSWQsIGlkLCAweEZGKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorLy8gJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKKy8vIGJvb2xlYW4gZmllbGQgY2FzZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCB0eXBlT3ZlcnJpZGUgYnl0ZSkgKGludCwgZXJyb3IpIHsKKwkvLyBzaG9ydCBsYXN0RmllbGQgPSBsYXN0RmllbGRfLnBvcCgpOworCisJLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorCXZhciB0eXBlVG9Xcml0ZSBieXRlCisJaWYgdHlwZU92ZXJyaWRlID09IDB4RkYgeworCQl0eXBlVG9Xcml0ZSA9IGJ5dGUocC5nZXRDb21wYWN0VHlwZSh0eXBlSWQpKQorCX0gZWxzZSB7CisJCXR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlCisJfQorCS8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorCWZpZWxkSWQgOj0gaW50KGlkKQorCXdyaXR0ZW4gOj0gMAorCWlmIGZpZWxkSWQgPiBwLmxhc3RGaWVsZElkICYmIGZpZWxkSWQtcC5sYXN0RmllbGRJZCA8PSAxNSB7CisJCS8vIHdyaXRlIHRoZW0gdG9nZXRoZXIKKwkJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUoKGZpZWxkSWQtcC5sYXN0RmllbGRJZCk8PDQpIHwgdHlwZVRvV3JpdGUpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIGVycgorCQl9CisJfSBlbHNlIHsKKwkJLy8gd3JpdGUgdGhlbSBzZXBhcmF0ZQorCQllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIGVycgorCQl9CisJCWVyciA9IHAuV3JpdGVJMTYoaWQpCisJCXdyaXR0ZW4gPSAxICsgMgorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiAwLCBlcnIKKwkJfQorCX0KKworCXAubGFzdEZpZWxkSWQgPSBmaWVsZElkCisJLy8gcC5sYXN0RmllbGQuUHVzaChmaWVsZC5pZCk7CisJcmV0dXJuIHdyaXR0ZW4sIG5pbAorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KFNUT1ApCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIHNpemUgPT0gMCB7CisJCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCgwKQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJXywgZXJyIDo9IHAud3JpdGVWYXJpbnQzMihpbnQzMihzaXplKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWVyciA9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUocC5nZXRDb21wYWN0VHlwZShrZXlUeXBlKSk8PDQgfCBieXRlKHAuZ2V0Q29tcGFjdFR5cGUodmFsdWVUeXBlKSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBXcml0ZSBhIHNldCBoZWFkZXIuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVNldEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvciB7CisJdiA6PSBieXRlKENPTVBBQ1RfQk9PTEVBTl9GQUxTRSkKKwlpZiB2YWx1ZSB7CisJCXYgPSBieXRlKENPTVBBQ1RfQk9PTEVBTl9UUlVFKQorCX0KKwlpZiBwLmJvb2xlYW5GaWVsZFBlbmRpbmcgeworCQkvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKwkJXywgZXJyIDo9IHAud3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwocC5ib29sZWFuRmllbGROYW1lLCBCT09MLCBwLmJvb2xlYW5GaWVsZElkLCB2KQorCQlwLmJvb2xlYW5GaWVsZFBlbmRpbmcgPSBmYWxzZQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUuCisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KHYpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvciB7CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUodmFsdWUpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhbiBJMTYgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJMTYodmFsdWUgaW50MTYpIGVycm9yIHsKKwlfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKHAuaW50MzJUb1ppZ3phZyhpbnQzMih2YWx1ZSkpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJMzIodmFsdWUgaW50MzIpIGVycm9yIHsKKwlfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKHAuaW50MzJUb1ppZ3phZyh2YWx1ZSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGFuIGk2NCBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgZXJyb3IgeworCV8sIGVyciA6PSBwLndyaXRlVmFyaW50NjQocC5pbnQ2NFRvWmlnemFnKHZhbHVlKSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLy8gV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIGVycm9yIHsKKwlidWYgOj0gcC5idWZmZXJbMDo4XQorCWJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDY0KGJ1ZiwgbWF0aC5GbG9hdDY0Yml0cyh2YWx1ZSkpCisJXywgZXJyIDo9IHAudHJhbnMuV3JpdGUoYnVmKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBlcnJvciB7CisJXywgZSA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIobGVuKHZhbHVlKSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGxlbih2YWx1ZSkgPiAwIHsKKwl9CisJXywgZSA9IHAudHJhbnMuV3JpdGVTdHJpbmcodmFsdWUpCisJcmV0dXJuIGUKK30KKworLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUJpbmFyeShiaW4gW11ieXRlKSBlcnJvciB7CisJXywgZSA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIobGVuKGJpbikpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBsZW4oYmluKSA+IDAgeworCQlfLCBlID0gcC50cmFucy5Xcml0ZShiaW4pCisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcmV0dXJuIG5pbAorfQorCisvLworLy8gUmVhZGluZyBtZXRob2RzLgorLy8KKworLy8gUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBlcnJvcikgeworCisJcHJvdG9jb2xJZCwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlpZiBwcm90b2NvbElkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHByb3RvY29sIGlkICUwMnggYnV0IGdvdCAlMDJ4IiwgQ09NUEFDVF9QUk9UT0NPTF9JRCwgcHJvdG9jb2xJZCkKKwkJcmV0dXJuICIiLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShCQURfVkVSU0lPTiwgZSkKKwl9CisKKwl2ZXJzaW9uQW5kVHlwZSwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwl2ZXJzaW9uIDo9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0sKKwl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoKHZlcnNpb25BbmRUeXBlID4+IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX0JJVFMpCisJaWYgdmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04geworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHZlcnNpb24gJTAyeCBidXQgZ290ICUwMngiLCBDT01QQUNUX1ZFUlNJT04sIHZlcnNpb24pCisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKEJBRF9WRVJTSU9OLCBlKQorCQlyZXR1cm4KKwl9CisJc2VxSWQsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwluYW1lLCBlcnIgPSBwLlJlYWRTdHJpbmcoKQorCXJldHVybgorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlwLmxhc3RGaWVsZCA9IGFwcGVuZChwLmxhc3RGaWVsZCwgcC5sYXN0RmllbGRJZCkKKwlwLmxhc3RGaWVsZElkID0gMAorCXJldHVybgorfQorCisvLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgZXJyb3IgeworCS8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgcmVhZCBvZmYgdGhlIHdpcmUuCisJcC5sYXN0RmllbGRJZCA9IHAubGFzdEZpZWxkW2xlbihwLmxhc3RGaWVsZCktMV0KKwlwLmxhc3RGaWVsZCA9IHAubGFzdEZpZWxkWzpsZW4ocC5sYXN0RmllbGQpLTFdCisJcmV0dXJuIG5pbAorfQorCisvLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgZXJyb3IpIHsKKwl0LCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCS8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKwlpZiAodCAmIDB4MGYpID09IFNUT1AgeworCQlyZXR1cm4gIiIsIFNUT1AsIDAsIG5pbAorCX0KKworCS8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKwltb2RpZmllciA6PSBpbnQxNigodCAmIDB4ZjApID4+IDQpCisJaWYgbW9kaWZpZXIgPT0gMCB7CisJCS8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKwkJaWQsIGVyciA9IHAuUmVhZEkxNigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwl9IGVsc2UgeworCQkvLyBoYXMgYSBkZWx0YS4gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCByZWFkIGZpZWxkIGlkLgorCQlpZCA9IGludDE2KHAubGFzdEZpZWxkSWQpICsgbW9kaWZpZXIKKwl9CisJdHlwZUlkLCBlIDo9IHAuZ2V0VFR5cGUodENvbXBhY3RUeXBlKHQgJiAweDBmKSkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisKKwkvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorCWlmIHAuaXNCb29sVHlwZSh0KSB7CisJCS8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorCQlwLmJvb2xWYWx1ZSA9IChieXRlKHQpJjB4MGYgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUpCisJCXAuYm9vbFZhbHVlSXNOb3ROdWxsID0gdHJ1ZQorCX0KKworCS8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorCXAubGFzdEZpZWxkSWQgPSBpbnQoaWQpCisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCByZWFkaW5nIHRoZSBrZXkKKy8vIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisvLyAiY29ycmVjdCIgdHlwZXMuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJc2l6ZTMyLCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJaWYgc2l6ZTMyIDwgMCB7CisJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCXJldHVybgorCX0KKwlzaXplID0gaW50KHNpemUzMikKKworCWtleUFuZFZhbHVlVHlwZSA6PSBieXRlKFNUT1ApCisJaWYgc2l6ZSAhPSAwIHsKKwkJa2V5QW5kVmFsdWVUeXBlLCBlcnIgPSBwLnJlYWRCeXRlRGlyZWN0KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCX0KKwlrZXlUeXBlLCBfID0gcC5nZXRUVHlwZSh0Q29tcGFjdFR5cGUoa2V5QW5kVmFsdWVUeXBlID4+IDQpKQorCXZhbHVlVHlwZSwgXyA9IHAuZ2V0VFR5cGUodENvbXBhY3RUeXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpCisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRNYXBFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorLy8gdHJ1ZSBzaXplLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCXNpemVfYW5kX3R5cGUsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCXNpemUgPSBpbnQoKHNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmKQorCWlmIHNpemUgPT0gMTUgeworCQlzaXplMiwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJcmV0dXJuCisJCX0KKwkJaWYgc2l6ZTIgPCAwIHsKKwkJCWVyciA9IGludmFsaWREYXRhTGVuZ3RoCisJCQlyZXR1cm4KKwkJfQorCQlzaXplID0gaW50KHNpemUyKQorCX0KKwllbGVtVHlwZSwgZSA6PSBwLmdldFRUeXBlKHRDb21wYWN0VHlwZShzaXplX2FuZF90eXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKy8vIHRydWUgc2l6ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiBwLlJlYWRMaXN0QmVnaW4oKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorLy8gYWxyZWFkeSBoYXZlIGJlZW4gcmVhZCBkdXJpbmcgcmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgcmVhZCBhIGJ5dGUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpIHsKKwlpZiBwLmJvb2xWYWx1ZUlzTm90TnVsbCB7CisJCXAuYm9vbFZhbHVlSXNOb3ROdWxsID0gZmFsc2UKKwkJcmV0dXJuIHAuYm9vbFZhbHVlLCBuaWwKKwl9CisJdiwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCXJldHVybiB2ID09IENPTVBBQ1RfQk9PTEVBTl9UUlVFLCBlcnIKK30KKworLy8gUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKKy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEkxNigpICh2YWx1ZSBpbnQxNiwgZXJyIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEkzMigpCisJcmV0dXJuIGludDE2KHYpLCBlcnIKK30KKworLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpIHsKKwl2LCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJdmFsdWUgPSBwLnppZ3phZ1RvSW50MzIodikKKwlyZXR1cm4gdmFsdWUsIG5pbAorfQorCisvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRJNjQoKSAodmFsdWUgaW50NjQsIGVyciBlcnJvcikgeworCXYsIGUgOj0gcC5yZWFkVmFyaW50NjQoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwl2YWx1ZSA9IHAuemlnemFnVG9JbnQ2NCh2KQorCXJldHVybiB2YWx1ZSwgbmlsCit9CisKKy8vIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZERvdWJsZSgpICh2YWx1ZSBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKKwlsb25nQml0cyA6PSBwLmJ1ZmZlclswOjhdCisJXywgZSA6PSBpby5SZWFkRnVsbChwLnRyYW5zLCBsb25nQml0cykKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAwLjAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlyZXR1cm4gbWF0aC5GbG9hdDY0ZnJvbWJpdHMocC5ieXRlc1RvVWludDY0KGxvbmdCaXRzKSksIG5pbAorfQorCisvLyBSZWFkcyBhIFtdYnl0ZSAodmlhIHJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFN0cmluZygpICh2YWx1ZSBzdHJpbmcsIGVyciBlcnJvcikgeworCWxlbmd0aCwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBsZW5ndGggPCAwIHsKKwkJcmV0dXJuICIiLCBpbnZhbGlkRGF0YUxlbmd0aAorCX0KKworCWlmIGxlbmd0aCA9PSAwIHsKKwkJcmV0dXJuICIiLCBuaWwKKwl9CisJdmFyIGJ1ZiBbXWJ5dGUKKwlpZiBsZW5ndGggPD0gaW50MzIobGVuKHAuYnVmZmVyKSkgeworCQlidWYgPSBwLmJ1ZmZlclswOmxlbmd0aF0KKwl9IGVsc2UgeworCQlidWYgPSBtYWtlKFtdYnl0ZSwgbGVuZ3RoKQorCX0KKwlfLCBlID0gaW8uUmVhZEZ1bGwocC50cmFucywgYnVmKQorCXJldHVybiBzdHJpbmcoYnVmKSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCit9CisKKy8vIFJlYWQgYSBbXWJ5dGUgZnJvbSB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAodmFsdWUgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlsZW5ndGgsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGxlbmd0aCA9PSAwIHsKKwkJcmV0dXJuIFtdYnl0ZXt9LCBuaWwKKwl9CisJaWYgbGVuZ3RoIDwgMCB7CisJCXJldHVybiBuaWwsIGludmFsaWREYXRhTGVuZ3RoCisJfQorCisJYnVmIDo9IG1ha2UoW11ieXRlLCBsZW5ndGgpCisJXywgZSA9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGJ1ZikKKwlyZXR1cm4gYnVmLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaChjdHgpKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7CisJcmV0dXJuIHAub3JpZ1RyYW5zcG9ydAorfQorCisvLworLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCisvLworCisvLyBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisvLyB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIChpbnQsIGVycm9yKSB7CisJaWYgc2l6ZSA8PSAxNCB7CisJCXJldHVybiAxLCBwLndyaXRlQnl0ZURpcmVjdChieXRlKGludDMyKHNpemU8PDQpIHwgaW50MzIocC5nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpKSkKKwl9CisJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KDB4ZjAgfCBieXRlKHAuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwltLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKGludDMyKHNpemUpKQorCXJldHVybiAxICsgbSwgZXJyCit9CisKKy8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisvLyBUT0RPKHBvbWFjayk6IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2Ugd3JpdGVWYXJpbnQ2ND8KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlVmFyaW50MzIobiBpbnQzMikgKGludCwgZXJyb3IpIHsKKwlpMzJidWYgOj0gcC5idWZmZXJbMDo1XQorCWlkeCA6PSAwCisJZm9yIHsKKwkJaWYgKG4gJiBeMHg3RikgPT0gMCB7CisJCQlpMzJidWZbaWR4XSA9IGJ5dGUobikKKwkJCWlkeCsrCisJCQkvLyBwLndyaXRlQnl0ZURpcmVjdChieXRlKG4pKTsKKwkJCWJyZWFrCisJCQkvLyByZXR1cm47CisJCX0gZWxzZSB7CisJCQlpMzJidWZbaWR4XSA9IGJ5dGUoKG4gJiAweDdGKSB8IDB4ODApCisJCQlpZHgrKworCQkJLy8gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZSgoKG4gJiAweDdGKSB8IDB4ODApKSk7CisJCQl1IDo9IHVpbnQzMihuKQorCQkJbiA9IGludDMyKHUgPj4gNykKKwkJfQorCX0KKwlyZXR1cm4gcC50cmFucy5Xcml0ZShpMzJidWZbMDppZHhdKQorfQorCisvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlVmFyaW50NjQobiBpbnQ2NCkgKGludCwgZXJyb3IpIHsKKwl2YXJpbnQ2NG91dCA6PSBwLmJ1ZmZlclswOjEwXQorCWlkeCA6PSAwCisJZm9yIHsKKwkJaWYgKG4gJiBeMHg3RikgPT0gMCB7CisJCQl2YXJpbnQ2NG91dFtpZHhdID0gYnl0ZShuKQorCQkJaWR4KysKKwkJCWJyZWFrCisJCX0gZWxzZSB7CisJCQl2YXJpbnQ2NG91dFtpZHhdID0gYnl0ZSgobiAmIDB4N0YpIHwgMHg4MCkKKwkJCWlkeCsrCisJCQl1IDo9IHVpbnQ2NChuKQorCQkJbiA9IGludDY0KHUgPj4gNykKKwkJfQorCX0KKwlyZXR1cm4gcC50cmFucy5Xcml0ZSh2YXJpbnQ2NG91dFswOmlkeF0pCit9CisKKy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGludDY0VG9aaWd6YWcobCBpbnQ2NCkgaW50NjQgeworCXJldHVybiAobCA8PCAxKSBeIChsID4+IDYzKQorfQorCisvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBpbnQzMlRvWmlnemFnKG4gaW50MzIpIGludDMyIHsKKwlyZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgZml4ZWRVaW50NjRUb0J5dGVzKG4gdWludDY0LCBidWYgW11ieXRlKSB7CisJYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCBuKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBmaXhlZEludDY0VG9CeXRlcyhuIGludDY0LCBidWYgW11ieXRlKSB7CisJYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCB1aW50NjQobikpCit9CisKKy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIHdyaXRlIGEgYnl0ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlQnl0ZURpcmVjdChiIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gcC50cmFucy5Xcml0ZUJ5dGUoYikKK30KKworLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUludEFzQnl0ZURpcmVjdChuIGludCkgKGludCwgZXJyb3IpIHsKKwlyZXR1cm4gMSwgcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZShuKSkKK30KKworLy8KKy8vIEludGVybmFsIHJlYWRpbmcgbWV0aG9kcworLy8KKworLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSByZWFkVmFyaW50MzIoKSAoaW50MzIsIGVycm9yKSB7CisJLy8gaWYgdGhlIHdpcmUgY29udGFpbnMgdGhlIHJpZ2h0IHN0dWZmLCB0aGlzIHdpbGwganVzdCB0cnVuY2F0ZSB0aGUgaTY0IHdlCisJLy8gcmVhZCBhbmQgZ2V0IHVzIHRoZSByaWdodCBzaWduLgorCXYsIGVyciA6PSBwLnJlYWRWYXJpbnQ2NCgpCisJcmV0dXJuIGludDMyKHYpLCBlcnIKK30KKworLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHJlYWRWYXJpbnQ2NCgpIChpbnQ2NCwgZXJyb3IpIHsKKwlzaGlmdCA6PSB1aW50KDApCisJcmVzdWx0IDo9IGludDY0KDApCisJZm9yIHsKKwkJYiwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiAwLCBlcnIKKwkJfQorCQlyZXN1bHQgfD0gaW50NjQoYiYweDdmKSA8PCBzaGlmdAorCQlpZiAoYiAmIDB4ODApICE9IDB4ODAgeworCQkJYnJlYWsKKwkJfQorCQlzaGlmdCArPSA3CisJfQorCXJldHVybiByZXN1bHQsIG5pbAorfQorCisvLyBSZWFkIGEgYnl0ZSwgdW5saWtlIFJlYWRCeXRlIHRoYXQgcmVhZHMgVGhyaWZ0LWJ5dGUgdGhhdCBpcyBpOC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHJlYWRCeXRlRGlyZWN0KCkgKGJ5dGUsIGVycm9yKSB7CisJcmV0dXJuIHAudHJhbnMuUmVhZEJ5dGUoKQorfQorCisvLworLy8gZW5jb2RpbmcgaGVscGVycworLy8KKworLy8gQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgemlnemFnVG9JbnQzMihuIGludDMyKSBpbnQzMiB7CisJdSA6PSB1aW50MzIobikKKwlyZXR1cm4gaW50MzIodT4+MSkgXiAtKG4gJiAxKQorfQorCisvLyBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHppZ3phZ1RvSW50NjQobiBpbnQ2NCkgaW50NjQgeworCXUgOj0gdWludDY0KG4pCisJcmV0dXJuIGludDY0KHU+PjEpIF4gLShuICYgMSkKK30KKworLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGJ5dGVzVG9JbnQ2NChiIFtdYnl0ZSkgaW50NjQgeworCXJldHVybiBpbnQ2NChiaW5hcnkuTGl0dGxlRW5kaWFuLlVpbnQ2NChiKSkKK30KKworLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGJ5dGVzVG9VaW50NjQoYiBbXWJ5dGUpIHVpbnQ2NCB7CisJcmV0dXJuIGJpbmFyeS5MaXR0bGVFbmRpYW4uVWludDY0KGIpCit9CisKKy8vCisvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKy8vCisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGlzQm9vbFR5cGUoYiBieXRlKSBib29sIHsKKwlyZXR1cm4gKGImMHgwZikgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUgfHwgKGImMHgwZikgPT0gQ09NUEFDVF9CT09MRUFOX0ZBTFNFCit9CisKKy8vIEdpdmVuIGEgdENvbXBhY3RUeXBlIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nCisvLyBUVHlwZSB2YWx1ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGdldFRUeXBlKHQgdENvbXBhY3RUeXBlKSAoVFR5cGUsIGVycm9yKSB7CisJc3dpdGNoIGJ5dGUodCkgJiAweDBmIHsKKwljYXNlIFNUT1A6CisJCXJldHVybiBTVE9QLCBuaWwKKwljYXNlIENPTVBBQ1RfQk9PTEVBTl9GQUxTRSwgQ09NUEFDVF9CT09MRUFOX1RSVUU6CisJCXJldHVybiBCT09MLCBuaWwKKwljYXNlIENPTVBBQ1RfQllURToKKwkJcmV0dXJuIEJZVEUsIG5pbAorCWNhc2UgQ09NUEFDVF9JMTY6CisJCXJldHVybiBJMTYsIG5pbAorCWNhc2UgQ09NUEFDVF9JMzI6CisJCXJldHVybiBJMzIsIG5pbAorCWNhc2UgQ09NUEFDVF9JNjQ6CisJCXJldHVybiBJNjQsIG5pbAorCWNhc2UgQ09NUEFDVF9ET1VCTEU6CisJCXJldHVybiBET1VCTEUsIG5pbAorCWNhc2UgQ09NUEFDVF9CSU5BUlk6CisJCXJldHVybiBTVFJJTkcsIG5pbAorCWNhc2UgQ09NUEFDVF9MSVNUOgorCQlyZXR1cm4gTElTVCwgbmlsCisJY2FzZSBDT01QQUNUX1NFVDoKKwkJcmV0dXJuIFNFVCwgbmlsCisJY2FzZSBDT01QQUNUX01BUDoKKwkJcmV0dXJuIE1BUCwgbmlsCisJY2FzZSBDT01QQUNUX1NUUlVDVDoKKwkJcmV0dXJuIFNUUlVDVCwgbmlsCisJfQorCXJldHVybiBTVE9QLCBURXhjZXB0aW9uKGZtdC5FcnJvcmYoImRvbid0IGtub3cgd2hhdCB0eXBlOiAldiIsIHQmMHgwZikpCit9CisKKy8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBnZXRDb21wYWN0VHlwZSh0IFRUeXBlKSB0Q29tcGFjdFR5cGUgeworCXJldHVybiB0dHlwZVRvQ29tcGFjdFR5cGVbdF0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmNzdmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFJlYWRXcml0ZUNvbXBhY3RQcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKKwlSZWFkV3JpdGVQcm90b2NvbFRlc3QodCwgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKKworCXRyYW5zcG9ydHMgOj0gW11UVHJhbnNwb3J0eworCQlOZXdUTWVtb3J5QnVmZmVyKCksCisJCU5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTYzODQpKSksCisJCU5ld1RGcmFtZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpKSwKKwl9CisKKwl6bGliMCwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIDApCisJemxpYjYsIF8gOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCA2KQorCXpsaWI5LCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KE5ld1RGcmFtZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpKSwgOSkKKwl0cmFuc3BvcnRzID0gYXBwZW5kKHRyYW5zcG9ydHMsIHpsaWIwLCB6bGliNiwgemxpYjkpCisKKwlmb3IgXywgdHJhbnMgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXAgOj0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMTYodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbnRleHQuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbnRleHQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1YzFiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29udGV4dC5nbwpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAiY29udGV4dCIKKwordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9kZWJ1Z19wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5NDNlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkibG9nIgorKQorCit0eXBlIFREZWJ1Z1Byb3RvY29sIHN0cnVjdCB7CisJRGVsZWdhdGUgIFRQcm90b2NvbAorCUxvZ1ByZWZpeCBzdHJpbmcKK30KKwordHlwZSBURGVidWdQcm90b2NvbEZhY3Rvcnkgc3RydWN0IHsKKwlVbmRlcmx5aW5nIFRQcm90b2NvbEZhY3RvcnkKKwlMb2dQcmVmaXggIHN0cmluZworfQorCitmdW5jIE5ld1REZWJ1Z1Byb3RvY29sRmFjdG9yeSh1bmRlcmx5aW5nIFRQcm90b2NvbEZhY3RvcnksIGxvZ1ByZWZpeCBzdHJpbmcpICpURGVidWdQcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVERlYnVnUHJvdG9jb2xGYWN0b3J5eworCQlVbmRlcmx5aW5nOiB1bmRlcmx5aW5nLAorCQlMb2dQcmVmaXg6ICBsb2dQcmVmaXgsCisJfQorfQorCitmdW5jICh0ICpURGVidWdQcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7CisJcmV0dXJuICZURGVidWdQcm90b2NvbHsKKwkJRGVsZWdhdGU6ICB0LlVuZGVybHlpbmcuR2V0UHJvdG9jb2wodHJhbnMpLAorCQlMb2dQcmVmaXg6IHQuTG9nUHJlZml4LAorCX0KK30KKworZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlSWQsIHNlcWlkKQorCWxvZy5QcmludGYoIiVzV3JpdGVNZXNzYWdlQmVnaW4obmFtZT0lI3YsIHR5cGVJZD0lI3YsIHNlcWlkPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgdHlwZUlkLCBzZXFpZCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTWVzc2FnZUVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZU1lc3NhZ2VFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVTdHJ1Y3RCZWdpbihuYW1lKQorCWxvZy5QcmludGYoIiVzV3JpdGVTdHJ1Y3RCZWdpbihuYW1lPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVTdHJ1Y3RFbmQoKQorCWxvZy5QcmludGYoIiVzV3JpdGVTdHJ1Y3RFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUZpZWxkQmVnaW4obmFtZSwgdHlwZUlkLCBpZCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlRmllbGRCZWdpbihuYW1lPSUjdiwgdHlwZUlkPSUjdiwgaWQlI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIHR5cGVJZCwgaWQsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVGaWVsZEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZUZpZWxkRW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVGaWVsZFN0b3AoKQorCWxvZy5QcmludGYoIiVzV3JpdGVGaWVsZFN0b3AoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTWFwQmVnaW4oa2V5VHlwZT0lI3YsIHZhbHVlVHlwZT0lI3YsIHNpemU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZU1hcEVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTWFwRW5kKCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTWFwRW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCisJbG9nLlByaW50ZigiJXNXcml0ZUxpc3RCZWdpbihlbGVtVHlwZT0lI3YsIHNpemU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlbGVtVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTGlzdEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZUxpc3RFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpCisJbG9nLlByaW50ZigiJXNXcml0ZVNldEJlZ2luKGVsZW1UeXBlPSUjdiwgc2l6ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVsZW1UeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZVNldEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZVNldEVuZCgpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUJvb2wodmFsdWUgYm9vbCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVCb29sKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVCb29sKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUJ5dGUodmFsdWUgaW50OCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVCeXRlKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVCeXRlKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUkxNih2YWx1ZSBpbnQxNikgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVJMTYodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUkxNih2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVJMzIodmFsdWUgaW50MzIpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlSTMyKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVJMzIodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlSTY0KHZhbHVlIGludDY0KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUk2NCh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlSTY0KHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZURvdWJsZSh2YWx1ZSBmbG9hdDY0KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZURvdWJsZSh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlRG91YmxlKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZVN0cmluZyh2YWx1ZSBzdHJpbmcpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlU3RyaW5nKHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVTdHJpbmcodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlQmluYXJ5KHZhbHVlIFtdYnl0ZSkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVCaW5hcnkodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUJpbmFyeSh2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorCitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJbmFtZSwgdHlwZUlkLCBzZXFpZCwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRNZXNzYWdlQmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lPSUjdiwgdHlwZUlkPSUjdiwgc2VxaWQ9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIHR5cGVJZCwgc2VxaWQsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkTWVzc2FnZUVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkTWVzc2FnZUVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikgeworCW5hbWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU3RydWN0QmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUlI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZFN0cnVjdEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkU3RydWN0RW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgZXJyb3IpIHsKKwluYW1lLCB0eXBlSWQsIGlkLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEZpZWxkQmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZEZpZWxkQmVnaW4oKSAobmFtZT0lI3YsIHR5cGVJZD0lI3YsIGlkPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBuYW1lLCB0eXBlSWQsIGlkLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkRmllbGRFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRGaWVsZEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkRmllbGRFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRNYXBCZWdpbigpCisJbG9nLlByaW50ZigiJXNSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZT0lI3YsIHZhbHVlVHlwZT0lI3YsIHNpemU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZE1hcEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZE1hcEVuZCgpCisJbG9nLlByaW50ZigiJXNSZWFkTWFwRW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwllbGVtVHlwZSwgc2l6ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRMaXN0QmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZT0lI3YsIHNpemU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGVsZW1UeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTGlzdEVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZExpc3RFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZExpc3RFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJZWxlbVR5cGUsIHNpemUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU2V0QmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlPSUjdiwgc2l6ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZWxlbVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRTZXRFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZFNldEVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRCb29sKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRCb29sKCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEJ5dGUoKSAodmFsdWUgaW50OCwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkQnl0ZSgpCisJbG9nLlByaW50ZigiJXNSZWFkQnl0ZSgpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEkxNigpCisJbG9nLlByaW50ZigiJXNSZWFkSTE2KCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkSTMyKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRJMzIoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkSTY0KCkgKHZhbHVlIGludDY0LCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRJNjQoKQorCWxvZy5QcmludGYoIiVzUmVhZEk2NCgpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkRG91YmxlKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWREb3VibGUoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkU3RyaW5nKCkgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU3RyaW5nKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRTdHJpbmcoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkQmluYXJ5KCkgKHZhbHVlIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkQmluYXJ5KCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRCaW5hcnkoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5Ta2lwKGZpZWxkVHlwZSkKKwlsb2cuUHJpbnRmKCIlc1NraXAoZmllbGRUeXBlPSUjdikgKGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZmllbGRUeXBlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLkZsdXNoKGN0eCkKKwlsb2cuUHJpbnRmKCIlc0ZsdXNoKCkgKGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorCitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gdGRwLkRlbGVnYXRlLlRyYW5zcG9ydCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2Rlc2VyaWFsaXplci5nbyBiL2xpYi9nby90aHJpZnQvZGVzZXJpYWxpemVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTA5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2Rlc2VyaWFsaXplci5nbwpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK3R5cGUgVERlc2VyaWFsaXplciBzdHJ1Y3QgeworCVRyYW5zcG9ydCBUVHJhbnNwb3J0CisJUHJvdG9jb2wgIFRQcm90b2NvbAorfQorCitmdW5jIE5ld1REZXNlcmlhbGl6ZXIoKSAqVERlc2VyaWFsaXplciB7CisJdmFyIHRyYW5zcG9ydCBUVHJhbnNwb3J0CisJdHJhbnNwb3J0ID0gTmV3VE1lbW9yeUJ1ZmZlckxlbigxMDI0KQorCisJcHJvdG9jb2wgOj0gTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKwlyZXR1cm4gJlREZXNlcmlhbGl6ZXJ7CisJCXRyYW5zcG9ydCwKKwkJcHJvdG9jb2x9Cit9CisKK2Z1bmMgKHQgKlREZXNlcmlhbGl6ZXIpIFJlYWRTdHJpbmcobXNnIFRTdHJ1Y3QsIHMgc3RyaW5nKSAoZXJyIGVycm9yKSB7CisJZXJyID0gbmlsCisJaWYgXywgZXJyID0gdC5UcmFuc3BvcnQuV3JpdGUoW11ieXRlKHMpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiBlcnIgPSBtc2cuUmVhZCh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlyZXR1cm4KK30KKworZnVuYyAodCAqVERlc2VyaWFsaXplcikgUmVhZChtc2cgVFN0cnVjdCwgYiBbXWJ5dGUpIChlcnIgZXJyb3IpIHsKKwllcnIgPSBuaWwKKwlpZiBfLCBlcnIgPSB0LlRyYW5zcG9ydC5Xcml0ZShiKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiBlcnIgPSBtc2cuUmVhZCh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlyZXR1cm4KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4ZDZmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZXJyb3JzIgorKQorCisvLyBHZW5lcmljIFRocmlmdCBleGNlcHRpb24KK3R5cGUgVEV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCWVycm9yCit9CisKKy8vIFByZXBlbmRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYW4gZXJyb3Igd2l0aG91dCBsb3NpbmcgdGhlIFRocmlmdCBleGNlcHRpb24gaW50ZXJmYWNlCitmdW5jIFByZXBlbmRFcnJvcihwcmVwZW5kIHN0cmluZywgZXJyIGVycm9yKSBlcnJvciB7CisJaWYgdCwgb2sgOj0gZXJyLihUVHJhbnNwb3J0RXhjZXB0aW9uKTsgb2sgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0LlR5cGVJZCgpLCBwcmVwZW5kK3QuRXJyb3IoKSkKKwl9CisJaWYgdCwgb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0LlR5cGVJZCgpLCBlcnJvcnMuTmV3KHByZXBlbmQrZXJyLkVycm9yKCkpKQorCX0KKwlpZiB0LCBvayA6PSBlcnIuKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0LlR5cGVJZCgpLCBwcmVwZW5kK3QuRXJyb3IoKSkKKwl9CisKKwlyZXR1cm4gZXJyb3JzLk5ldyhwcmVwZW5kICsgZXJyLkVycm9yKCkpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2V4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb25fdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY1ZTJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9leGNlcHRpb25fdGVzdC5nbwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImVycm9ycyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0UHJlcGVuZEVycm9yKHQgKnRlc3RpbmcuVCkgeworCWVyciA6PSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oSU5URVJOQUxfRVJST1IsICJvcmlnaW5hbCBlcnJvciIpCisJZXJyMiwgb2sgOj0gUHJlcGVuZEVycm9yKCJQcmVwZW5kOiAiLCBlcnIpLihUQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiQ291bGRuJ3QgY2FzdCBlcnJvciBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBlcnIyLkVycm9yKCkgIT0gIlByZXBlbmQ6IG9yaWdpbmFsIGVycm9yIiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3Igc3RyaW5nIikKKwl9CisJaWYgZXJyMi5UeXBlSWQoKSAhPSBJTlRFUk5BTF9FUlJPUiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgdHlwZSBlcnJvciIpCisJfQorCisJZXJyMyA6PSBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoIm9yaWdpbmFsIGVycm9yIikpCisJZXJyNCwgb2sgOj0gUHJlcGVuZEVycm9yKCJQcmVwZW5kOiAiLCBlcnIzKS4oVFByb3RvY29sRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkNvdWxkbid0IGNhc3QgZXJyb3IgVFByb3RvY29sRXhjZXB0aW9uIikKKwl9CisJaWYgZXJyNC5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorCWlmIGVycjQuVHlwZUlkKCkgIT0gSU5WQUxJRF9EQVRBIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCB0eXBlIGVycm9yIikKKwl9CisKKwllcnI1IDo9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVElNRURfT1VULCAib3JpZ2luYWwgZXJyb3IiKQorCWVycjYsIG9rIDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyNSkuKFRUcmFuc3BvcnRFeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiQ291bGRuJ3QgY2FzdCBlcnJvciBUVHJhbnNwb3J0RXhjZXB0aW9uIikKKwl9CisJaWYgZXJyNi5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorCWlmIGVycjYuVHlwZUlkKCkgIT0gVElNRURfT1VUIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCB0eXBlIGVycm9yIikKKwl9CisKKwllcnI3IDo9IGVycm9ycy5OZXcoIm9yaWdpbmFsIGVycm9yIikKKwllcnI4IDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyNykKKwlpZiBlcnI4LkVycm9yKCkgIT0gIlByZXBlbmQ6IG9yaWdpbmFsIGVycm9yIiB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3Igc3RyaW5nIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2ZpZWxkLmdvIGIvbGliL2dvL3RocmlmdC9maWVsZC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY2NTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9maWVsZC5nbwpAQCAtMCwwICsxLDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBmaWVsZCBtZXRhZGF0YS4KK3R5cGUgZmllbGQgc3RydWN0IHsKKwluYW1lICAgc3RyaW5nCisJdHlwZUlkIFRUeXBlCisJaWQgICAgIGludAorfQorCitmdW5jIG5ld0ZpZWxkKG4gc3RyaW5nLCB0IFRUeXBlLCBpIGludCkgKmZpZWxkIHsKKwlyZXR1cm4gJmZpZWxke25hbWU6IG4sIHR5cGVJZDogdCwgaWQ6IGl9Cit9CisKK2Z1bmMgKHAgKmZpZWxkKSBOYW1lKCkgc3RyaW5nIHsKKwlpZiBwID09IG5pbCB7CisJCXJldHVybiAiIgorCX0KKwlyZXR1cm4gcC5uYW1lCit9CisKK2Z1bmMgKHAgKmZpZWxkKSBUeXBlSWQoKSBUVHlwZSB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gVFR5cGUoVk9JRCkKKwl9CisJcmV0dXJuIHAudHlwZUlkCit9CisKK2Z1bmMgKHAgKmZpZWxkKSBJZCgpIGludCB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gLTEKKwl9CisJcmV0dXJuIHAuaWQKK30KKworZnVuYyAocCAqZmllbGQpIFN0cmluZygpIHN0cmluZyB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gIjxuaWw+IgorCX0KKwlyZXR1cm4gIjxURmllbGQgbmFtZTonIiArIHAubmFtZSArICInIHR5cGU6IiArIHN0cmluZyhwLnR5cGVJZCkgKyAiIGZpZWxkLWlkOiIgKyBzdHJpbmcocC5pZCkgKyAiPiIKK30KKwordmFyIEFOT05ZTU9VU19GSUVMRCAqZmllbGQKKwordHlwZSBmaWVsZFNsaWNlIFtdZmllbGQKKworZnVuYyAocCBmaWVsZFNsaWNlKSBMZW4oKSBpbnQgeworCXJldHVybiBsZW4ocCkKK30KKworZnVuYyAocCBmaWVsZFNsaWNlKSBMZXNzKGksIGogaW50KSBib29sIHsKKwlyZXR1cm4gcFtpXS5JZCgpIDwgcFtqXS5JZCgpCit9CisKK2Z1bmMgKHAgZmllbGRTbGljZSkgU3dhcChpLCBqIGludCkgeworCXBbaV0sIHBbal0gPSBwW2pdLCBwW2ldCit9CisKK2Z1bmMgaW5pdCgpIHsKKwlBTk9OWU1PVVNfRklFTEQgPSBuZXdGaWVsZCgiIiwgU1RPUCwgMCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZhNjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJieXRlcyIKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmluYXJ5IgorCSJmbXQiCisJImlvIgorKQorCitjb25zdCBERUZBVUxUX01BWF9MRU5HVEggPSAxNjM4NDAwMAorCit0eXBlIFRGcmFtZWRUcmFuc3BvcnQgc3RydWN0IHsKKwl0cmFuc3BvcnQgVFRyYW5zcG9ydAorCWJ1ZiAgICAgICBieXRlcy5CdWZmZXIKKwlyZWFkZXIgICAgKmJ1ZmlvLlJlYWRlcgorCWZyYW1lU2l6ZSB1aW50MzIgLy9DdXJyZW50IHJlbWFpbmluZyBzaXplIG9mIHRoZSBmcmFtZS4gaWYgPT0wIHJlYWQgbmV4dCBmcmFtZSBoZWFkZXIKKwlidWZmZXIgICAgWzRdYnl0ZQorCW1heExlbmd0aCB1aW50MzIKK30KKwordHlwZSB0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCWZhY3RvcnkgICBUVHJhbnNwb3J0RmFjdG9yeQorCW1heExlbmd0aCB1aW50MzIKK30KKworZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeShmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5KSBUVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeXtmYWN0b3J5OiBmYWN0b3J5LCBtYXhMZW5ndGg6IERFRkFVTFRfTUFYX0xFTkdUSH0KK30KKworZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeU1heExlbmd0aChmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBtYXhMZW5ndGggdWludDMyKSBUVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeXtmYWN0b3J5OiBmYWN0b3J5LCBtYXhMZW5ndGg6IG1heExlbmd0aH0KK30KKworZnVuYyAocCAqdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydChiYXNlIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXR0LCBlcnIgOj0gcC5mYWN0b3J5LkdldFRyYW5zcG9ydChiYXNlKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIE5ld1RGcmFtZWRUcmFuc3BvcnRNYXhMZW5ndGgodHQsIHAubWF4TGVuZ3RoKSwgbmlsCit9CisKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQgVFRyYW5zcG9ydCkgKlRGcmFtZWRUcmFuc3BvcnQgeworCXJldHVybiAmVEZyYW1lZFRyYW5zcG9ydHt0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgcmVhZGVyOiBidWZpby5OZXdSZWFkZXIodHJhbnNwb3J0KSwgbWF4TGVuZ3RoOiBERUZBVUxUX01BWF9MRU5HVEh9Cit9CisKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydE1heExlbmd0aCh0cmFuc3BvcnQgVFRyYW5zcG9ydCwgbWF4TGVuZ3RoIHVpbnQzMikgKlRGcmFtZWRUcmFuc3BvcnQgeworCXJldHVybiAmVEZyYW1lZFRyYW5zcG9ydHt0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgcmVhZGVyOiBidWZpby5OZXdSZWFkZXIodHJhbnNwb3J0KSwgbWF4TGVuZ3RoOiBtYXhMZW5ndGh9Cit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIE9wZW4oKSBlcnJvciB7CisJcmV0dXJuIHAudHJhbnNwb3J0Lk9wZW4oKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gcC50cmFuc3BvcnQuSXNPcGVuKCkKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgQ2xvc2UoKSBlcnJvciB7CisJcmV0dXJuIHAudHJhbnNwb3J0LkNsb3NlKCkKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVhZChidWYgW11ieXRlKSAobCBpbnQsIGVyciBlcnJvcikgeworCWlmIHAuZnJhbWVTaXplID09IDAgeworCQlwLmZyYW1lU2l6ZSwgZXJyID0gcC5yZWFkRnJhbWVIZWFkZXIoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWlmIHAuZnJhbWVTaXplIDwgdWludDMyKGxlbihidWYpKSB7CisJCWZyYW1lU2l6ZSA6PSBwLmZyYW1lU2l6ZQorCQl0bXAgOj0gbWFrZShbXWJ5dGUsIHAuZnJhbWVTaXplKQorCQlsLCBlcnIgPSBwLlJlYWQodG1wKQorCQljb3B5KGJ1ZiwgdG1wKQorCQlpZiBlcnIgPT0gbmlsIHsKKwkJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZm10LkVycm9yZigiTm90IGVub3VnaCBmcmFtZSBzaXplICVkIHRvIHJlYWQgJWQgYnl0ZXMiLCBmcmFtZVNpemUsIGxlbihidWYpKSkKKwkJCXJldHVybgorCQl9CisJfQorCWdvdCwgZXJyIDo9IHAucmVhZGVyLlJlYWQoYnVmKQorCXAuZnJhbWVTaXplID0gcC5mcmFtZVNpemUgLSB1aW50MzIoZ290KQorCS8vc2FuaXR5IGNoZWNrCisJaWYgcC5mcmFtZVNpemUgPCAwIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiTmVnYXRpdmUgZnJhbWUgc2l6ZSIpCisJfQorCXJldHVybiBnb3QsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBSZWFkQnl0ZSgpIChjIGJ5dGUsIGVyciBlcnJvcikgeworCWlmIHAuZnJhbWVTaXplID09IDAgeworCQlwLmZyYW1lU2l6ZSwgZXJyID0gcC5yZWFkRnJhbWVIZWFkZXIoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfQorCWlmIHAuZnJhbWVTaXplIDwgMSB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGZtdC5FcnJvcmYoIk5vdCBlbm91Z2ggZnJhbWUgc2l6ZSAlZCB0byByZWFkICVkIGJ5dGVzIiwgcC5mcmFtZVNpemUsIDEpKQorCX0KKwljLCBlcnIgPSBwLnJlYWRlci5SZWFkQnl0ZSgpCisJaWYgZXJyID09IG5pbCB7CisJCXAuZnJhbWVTaXplLS0KKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuYnVmLldyaXRlKGJ1ZikKKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFdyaXRlQnl0ZShjIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gcC5idWYuV3JpdGVCeXRlKGMpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiBwLmJ1Zi5Xcml0ZVN0cmluZyhzKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJc2l6ZSA6PSBwLmJ1Zi5MZW4oKQorCWJ1ZiA6PSBwLmJ1ZmZlcls6NF0KKwliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQzMihidWYsIHVpbnQzMihzaXplKSkKKwlfLCBlcnIgOj0gcC50cmFuc3BvcnQuV3JpdGUoYnVmKQorCWlmIGVyciAhPSBuaWwgeworCQlwLmJ1Zi5UcnVuY2F0ZSgwKQorCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCWlmIHNpemUgPiAwIHsKKwkJaWYgbiwgZXJyIDo9IHAuYnVmLldyaXRlVG8ocC50cmFuc3BvcnQpOyBlcnIgIT0gbmlsIHsKKwkJCXByaW50KCJFcnJvciB3aGlsZSBmbHVzaGluZyB3cml0ZSBidWZmZXIgb2Ygc2l6ZSAiLCBzaXplLCAiIHRvIHRyYW5zcG9ydCwgb25seSB3cm90ZSAiLCBuLCAiIGJ5dGVzOiAiLCBlcnIuRXJyb3IoKSwgIlxuIikKKwkJCXAuYnVmLlRydW5jYXRlKDApCisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJCX0KKwl9CisJZXJyID0gcC50cmFuc3BvcnQuRmx1c2goY3R4KQorCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgcmVhZEZyYW1lSGVhZGVyKCkgKHVpbnQzMiwgZXJyb3IpIHsKKwlidWYgOj0gcC5idWZmZXJbOjRdCisJaWYgXywgZXJyIDo9IGlvLlJlYWRGdWxsKHAucmVhZGVyLCBidWYpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwlzaXplIDo9IGJpbmFyeS5CaWdFbmRpYW4uVWludDMyKGJ1ZikKKwlpZiBzaXplIDwgMCB8fCBzaXplID4gcC5tYXhMZW5ndGggeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sIGZtdC5TcHJpbnRmKCJJbmNvcnJlY3QgZnJhbWUgc2l6ZSAoJWQpIiwgc2l6ZSkpCisJfQorCXJldHVybiBzaXplLCBuaWwKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiB1aW50NjQocC5mcmFtZVNpemUpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjgzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEZyYW1lZFRyYW5zcG9ydCh0ICp0ZXN0aW5nLlQpIHsKKwl0cmFucyA6PSBOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSkKKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODJiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJjb250ZXh0IgorCSJpbyIKKwkiaW8vaW91dGlsIgorCSJuZXQvaHR0cCIKKwkibmV0L3VybCIKKwkic3RyY29udiIKKykKKworLy8gRGVmYXVsdCB0byB1c2luZyB0aGUgc2hhcmVkIGh0dHAgY2xpZW50LiBMaWJyYXJ5IHVzZXJzIGFyZQorLy8gZnJlZSB0byBjaGFuZ2UgdGhpcyBnbG9iYWwgY2xpZW50IG9yIHNwZWNpZnkgb25lIHRocm91Z2gKKy8vIFRIdHRwQ2xpZW50T3B0aW9ucy4KK3ZhciBEZWZhdWx0SHR0cENsaWVudCAqaHR0cC5DbGllbnQgPSBodHRwLkRlZmF1bHRDbGllbnQKKwordHlwZSBUSHR0cENsaWVudCBzdHJ1Y3QgeworCWNsaWVudCAgICAgICAgICAgICAqaHR0cC5DbGllbnQKKwlyZXNwb25zZSAgICAgICAgICAgKmh0dHAuUmVzcG9uc2UKKwl1cmwgICAgICAgICAgICAgICAgKnVybC5VUkwKKwlyZXF1ZXN0QnVmZmVyICAgICAgKmJ5dGVzLkJ1ZmZlcgorCWhlYWRlciAgICAgICAgICAgICBodHRwLkhlYWRlcgorCW5zZWNDb25uZWN0VGltZW91dCBpbnQ2NAorCW5zZWNSZWFkVGltZW91dCAgICBpbnQ2NAorfQorCit0eXBlIFRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCW9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zCisJdXJsICAgICBzdHJpbmcKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgdHJhbnMgIT0gbmlsIHsKKwkJdCwgb2sgOj0gdHJhbnMuKCpUSHR0cENsaWVudCkKKwkJaWYgb2sgJiYgdC51cmwgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHQudXJsLlN0cmluZygpLCBwLm9wdGlvbnMpCisJCX0KKwl9CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMocC51cmwsIHAub3B0aW9ucykKK30KKwordHlwZSBUSHR0cENsaWVudE9wdGlvbnMgc3RydWN0IHsKKwkvLyBJZiBuaWwsIERlZmF1bHRIdHRwQ2xpZW50IGlzIHVzZWQKKwlDbGllbnQgKmh0dHAuQ2xpZW50Cit9CisKK2Z1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQorCitmdW5jIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeXt1cmw6IHVybCwgb3B0aW9uczogb3B0aW9uc30KK30KKworZnVuYyBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlwYXJzZWRVUkwsIGVyciA6PSB1cmwuUGFyc2UodXJsc3RyKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJYnVmIDo9IG1ha2UoW11ieXRlLCAwLCAxMDI0KQorCWNsaWVudCA6PSBvcHRpb25zLkNsaWVudAorCWlmIGNsaWVudCA9PSBuaWwgeworCQljbGllbnQgPSBEZWZhdWx0SHR0cENsaWVudAorCX0KKwlodHRwSGVhZGVyIDo9IG1hcFtzdHJpbmddW11zdHJpbmd7IkNvbnRlbnQtVHlwZSI6IHsiYXBwbGljYXRpb24veC10aHJpZnQifX0KKwlyZXR1cm4gJlRIdHRwQ2xpZW50e2NsaWVudDogY2xpZW50LCB1cmw6IHBhcnNlZFVSTCwgcmVxdWVzdEJ1ZmZlcjogYnl0ZXMuTmV3QnVmZmVyKGJ1ZiksIGhlYWRlcjogaHR0cEhlYWRlcn0sIG5pbAorfQorCitmdW5jIE5ld1RIdHRwQ2xpZW50KHVybHN0ciBzdHJpbmcpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgVEh0dHBDbGllbnRPcHRpb25ze30pCit9CisKKy8vIFNldCB0aGUgSFRUUCBIZWFkZXIgZm9yIHRoaXMgc3BlY2lmaWMgVGhyaWZ0IFRyYW5zcG9ydAorLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGZpcnN0IGFzc2VydCB0aGUgVFRyYW5zcG9ydCBhcyBhIFRIdHRwQ2xpZW50IHR5cGUKKy8vIGxpa2Ugc286CisvLworLy8gaHR0cFRyYW5zIDo9IHRyYW5zLihUSHR0cENsaWVudCkKKy8vIGh0dHBUcmFucy5TZXRIZWFkZXIoIlVzZXItQWdlbnQiLCJUaHJpZnQgQ2xpZW50IDEuMCIpCitmdW5jIChwICpUSHR0cENsaWVudCkgU2V0SGVhZGVyKGtleSBzdHJpbmcsIHZhbHVlIHN0cmluZykgeworCXAuaGVhZGVyLkFkZChrZXksIHZhbHVlKQorfQorCisvLyBHZXQgdGhlIEhUVFAgSGVhZGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdXBwbGllZCBIZWFkZXIgS2V5IGZvciB0aGlzIHNwZWNpZmljIFRocmlmdCBUcmFuc3BvcnQKKy8vIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBmaXJzdCBhc3NlcnQgdGhlIFRUcmFuc3BvcnQgYXMgYSBUSHR0cENsaWVudCB0eXBlCisvLyBsaWtlIHNvOgorLy8KKy8vIGh0dHBUcmFucyA6PSB0cmFucy4oVEh0dHBDbGllbnQpCisvLyBoZHJWYWx1ZSA6PSBodHRwVHJhbnMuR2V0SGVhZGVyKCJVc2VyLUFnZW50IikKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBHZXRIZWFkZXIoa2V5IHN0cmluZykgc3RyaW5nIHsKKwlyZXR1cm4gcC5oZWFkZXIuR2V0KGtleSkKK30KKworLy8gRGVsZXRlcyB0aGUgSFRUUCBIZWFkZXIgZ2l2ZW4gYSBIZWFkZXIgS2V5IGZvciB0aGlzIHNwZWNpZmljIFRocmlmdCBUcmFuc3BvcnQKKy8vIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBmaXJzdCBhc3NlcnQgdGhlIFRUcmFuc3BvcnQgYXMgYSBUSHR0cENsaWVudCB0eXBlCisvLyBsaWtlIHNvOgorLy8KKy8vIGh0dHBUcmFucyA6PSB0cmFucy4oVEh0dHBDbGllbnQpCisvLyBodHRwVHJhbnMuRGVsSGVhZGVyKCJVc2VyLUFnZW50IikKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBEZWxIZWFkZXIoa2V5IHN0cmluZykgeworCXAuaGVhZGVyLkRlbChrZXkpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBPcGVuKCkgZXJyb3IgeworCS8vIGRvIG5vdGhpbmcKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gcC5yZXNwb25zZSAhPSBuaWwgfHwgcC5yZXF1ZXN0QnVmZmVyICE9IG5pbAorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgY2xvc2VSZXNwb25zZSgpIGVycm9yIHsKKwl2YXIgZXJyIGVycm9yCisJaWYgcC5yZXNwb25zZSAhPSBuaWwgJiYgcC5yZXNwb25zZS5Cb2R5ICE9IG5pbCB7CisJCS8vIFRoZSBkb2NzIHNwZWNpZnkgdGhhdCBpZiBrZWVwYWxpdmUgaXMgZW5hYmxlZCBhbmQgdGhlIHJlc3BvbnNlIGJvZHkgaXMgbm90CisJCS8vIHJlYWQgdG8gY29tcGxldGlvbiB0aGUgY29ubmVjdGlvbiB3aWxsIG5ldmVyIGJlIHJldHVybmVkIHRvIHRoZSBwb29sIGFuZAorCQkvLyByZXVzZWQuIEVycm9ycyBhcmUgYmVpbmcgaWdub3JlZCBoZXJlIGJlY2F1c2UgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW52YWxpZAorCQkvLyBhbmQgdGhpcyBmYWlscyBmb3Igc29tZSByZWFzb24sIHRoZSBDbG9zZSgpIG1ldGhvZCB3aWxsIGRvIGFueSByZW1haW5pbmcKKwkJLy8gY2xlYW51cC4KKwkJaW8uQ29weShpb3V0aWwuRGlzY2FyZCwgcC5yZXNwb25zZS5Cb2R5KQorCisJCWVyciA9IHAucmVzcG9uc2UuQm9keS5DbG9zZSgpCisJfQorCisJcC5yZXNwb25zZSA9IG5pbAorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIENsb3NlKCkgZXJyb3IgeworCWlmIHAucmVxdWVzdEJ1ZmZlciAhPSBuaWwgeworCQlwLnJlcXVlc3RCdWZmZXIuUmVzZXQoKQorCQlwLnJlcXVlc3RCdWZmZXIgPSBuaWwKKwl9CisJcmV0dXJuIHAuY2xvc2VSZXNwb25zZSgpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgcC5yZXNwb25zZSA9PSBuaWwgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKQorCX0KKwluLCBlcnIgOj0gcC5yZXNwb25zZS5Cb2R5LlJlYWQoYnVmKQorCWlmIG4gPiAwICYmIChlcnIgPT0gbmlsIHx8IGVyciA9PSBpby5FT0YpIHsKKwkJcmV0dXJuIG4sIG5pbAorCX0KKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZWFkQnl0ZSgpIChjIGJ5dGUsIGVyciBlcnJvcikgeworCXJldHVybiByZWFkQnl0ZShwLnJlc3BvbnNlLkJvZHkpCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBXcml0ZShidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLnJlcXVlc3RCdWZmZXIuV3JpdGUoYnVmKQorCXJldHVybiBuLCBlcnIKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIFdyaXRlQnl0ZShjIGJ5dGUpIGVycm9yIHsKKwlyZXR1cm4gcC5yZXF1ZXN0QnVmZmVyLldyaXRlQnl0ZShjKQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgV3JpdGVTdHJpbmcocyBzdHJpbmcpIChuIGludCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHAucmVxdWVzdEJ1ZmZlci5Xcml0ZVN0cmluZyhzKQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCS8vIENsb3NlIGFueSBwcmV2aW91cyByZXNwb25zZSBib2R5IHRvIGF2b2lkIGxlYWtpbmcgY29ubmVjdGlvbnMuCisJcC5jbG9zZVJlc3BvbnNlKCkKKworCXJlcSwgZXJyIDo9IGh0dHAuTmV3UmVxdWVzdCgiUE9TVCIsIHAudXJsLlN0cmluZygpLCBwLnJlcXVlc3RCdWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmVxLkhlYWRlciA9IHAuaGVhZGVyCisJaWYgY3R4ICE9IG5pbCB7CisJCXJlcSA9IHJlcS5XaXRoQ29udGV4dChjdHgpCisJfQorCXJlc3BvbnNlLCBlcnIgOj0gcC5jbGllbnQuRG8ocmVxKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCWlmIHJlc3BvbnNlLlN0YXR1c0NvZGUgIT0gaHR0cC5TdGF0dXNPSyB7CisJCS8vIENsb3NlIHRoZSByZXNwb25zZSB0byBhdm9pZCBsZWFraW5nIGZpbGUgZGVzY3JpcHRvcnMuIGNsb3NlUmVzcG9uc2UgZG9lcworCQkvLyBtb3JlIHRoYW4ganVzdCBjYWxsIENsb3NlKCksIHNvIHRlbXBvcmFyaWx5IGFzc2lnbiBpdCBhbmQgcmV1c2UgdGhlIGxvZ2ljLgorCQlwLnJlc3BvbnNlID0gcmVzcG9uc2UKKwkJcC5jbG9zZVJlc3BvbnNlKCkKKworCQkvLyBUT0RPKHBvbWFjaykgbG9nIGJhZCByZXNwb25zZQorCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJIVFRQIFJlc3BvbnNlIGNvZGU6ICIrc3RyY29udi5JdG9hKHJlc3BvbnNlLlN0YXR1c0NvZGUpKQorCX0KKwlwLnJlc3BvbnNlID0gcmVzcG9uc2UKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJbGVuIDo9IHAucmVzcG9uc2UuQ29udGVudExlbmd0aAorCWlmIGxlbiA+PSAwIHsKKwkJcmV0dXJuIHVpbnQ2NChsZW4pCisJfQorCisJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKKwlyZXR1cm4gbWF4U2l6ZSAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSh1cmwgc3RyaW5nKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zIGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCwgb3B0aW9ucykKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnModXJsc3RyIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgb3B0aW9ucykKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50IGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudCh1cmxzdHIgc3RyaW5nKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzY4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50X3Rlc3QuZ28KQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkibmV0L2h0dHAiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEh0dHBDbGllbnQodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisJdHJhbnMsIGVyciA6PSBOZXdUSHR0cFBvc3RDbGllbnQoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RIdHRwQ2xpZW50SGVhZGVycyh0ICp0ZXN0aW5nLlQpIHsKKwlsLCBhZGRyIDo9IEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCkKKwlpZiBsICE9IG5pbCB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCX0KKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudCgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCit9CisKK2Z1bmMgVGVzdEh0dHBDdXN0b21DbGllbnQodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisKKwlodHRwVHJhbnNwb3J0IDo9ICZjdXN0b21IdHRwVHJhbnNwb3J0e30KKworCXRyYW5zLCBlcnIgOj0gTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnMoImh0dHA6Ly8iK2FkZHIuU3RyaW5nKCksIFRIdHRwQ2xpZW50T3B0aW9uc3sKKwkJQ2xpZW50OiAmaHR0cC5DbGllbnR7CisJCQlUcmFuc3BvcnQ6IGh0dHBUcmFuc3BvcnQsCisJCX0sCisJfSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydEhlYWRlclRlc3QodCwgdHJhbnMsIHRyYW5zKQorCisJaWYgIWh0dHBUcmFuc3BvcnQuaGl0IHsKKwkJdC5GYXRhbGYoIkN1c3RvbSBjbGllbnQgd2FzIG5vdCB1c2VkIikKKwl9Cit9CisKK2Z1bmMgVGVzdEh0dHBDdXN0b21DbGllbnRQYWNrYWdlU2NvcGUodCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisJaHR0cFRyYW5zcG9ydCA6PSAmY3VzdG9tSHR0cFRyYW5zcG9ydHt9CisJRGVmYXVsdEh0dHBDbGllbnQgPSAmaHR0cC5DbGllbnR7CisJCVRyYW5zcG9ydDogaHR0cFRyYW5zcG9ydCwKKwl9CisKKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudCgiaHR0cDovLyIgKyBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQlsLkNsb3NlKCkKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwl9CisJVHJhbnNwb3J0SGVhZGVyVGVzdCh0LCB0cmFucywgdHJhbnMpCisKKwlpZiAhaHR0cFRyYW5zcG9ydC5oaXQgeworCQl0LkZhdGFsZigiQ3VzdG9tIGNsaWVudCB3YXMgbm90IHVzZWQiKQorCX0KK30KKwordHlwZSBjdXN0b21IdHRwVHJhbnNwb3J0IHN0cnVjdCB7CisJaGl0IGJvb2wKK30KKworZnVuYyAoYyAqY3VzdG9tSHR0cFRyYW5zcG9ydCkgUm91bmRUcmlwKHJlcSAqaHR0cC5SZXF1ZXN0KSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKSB7CisJYy5oaXQgPSB0cnVlCisJcmV0dXJuIGh0dHAuRGVmYXVsdFRyYW5zcG9ydC5Sb3VuZFRyaXAocmVxKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9odHRwX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmMGYzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb21wcmVzcy9nemlwIgorCSJpbyIKKwkibmV0L2h0dHAiCisJInN0cmluZ3MiCispCisKKy8vIE5ld1RocmlmdEhhbmRsZXJGdW5jIGlzIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGUgYSByZWFkeSB0byB1c2UgQXBhY2hlIFRocmlmdCBIYW5kbGVyIGZ1bmN0aW9uCitmdW5jIE5ld1RocmlmdEhhbmRsZXJGdW5jKHByb2Nlc3NvciBUUHJvY2Vzc29yLAorCWluUGZhY3RvcnksIG91dFBmYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpIGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKworCXJldHVybiBneihmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisJCXcuSGVhZGVyKCkuQWRkKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorCisJCXRyYW5zcG9ydCA6PSBOZXdTdHJlYW1UcmFuc3BvcnQoci5Cb2R5LCB3KQorCQlwcm9jZXNzb3IuUHJvY2VzcyhyLkNvbnRleHQoKSwgaW5QZmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpLCBvdXRQZmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpKQorCX0pCit9CisKKy8vIGd6IHRyYW5zcGFyZW50bHkgY29tcHJlc3NlcyB0aGUgSFRUUCByZXNwb25zZSBpZiB0aGUgY2xpZW50IHN1cHBvcnRzIGl0LgorZnVuYyBneihoYW5kbGVyIGh0dHAuSGFuZGxlckZ1bmMpIGh0dHAuSGFuZGxlckZ1bmMgeworCXJldHVybiBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisJCWlmICFzdHJpbmdzLkNvbnRhaW5zKHIuSGVhZGVyLkdldCgiQWNjZXB0LUVuY29kaW5nIiksICJnemlwIikgeworCQkJaGFuZGxlcih3LCByKQorCQkJcmV0dXJuCisJCX0KKwkJdy5IZWFkZXIoKS5TZXQoIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpCisJCWd6IDo9IGd6aXAuTmV3V3JpdGVyKHcpCisJCWRlZmVyIGd6LkNsb3NlKCkKKwkJZ3p3IDo9IGd6aXBSZXNwb25zZVdyaXRlcntXcml0ZXI6IGd6LCBSZXNwb25zZVdyaXRlcjogd30KKwkJaGFuZGxlcihnencsIHIpCisJfQorfQorCit0eXBlIGd6aXBSZXNwb25zZVdyaXRlciBzdHJ1Y3QgeworCWlvLldyaXRlcgorCWh0dHAuUmVzcG9uc2VXcml0ZXIKK30KKworZnVuYyAodyBnemlwUmVzcG9uc2VXcml0ZXIpIFdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCXJldHVybiB3LldyaXRlci5Xcml0ZShiKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE5M2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnVmaW8iCisJImNvbnRleHQiCisJImlvIgorKQorCisvLyBTdHJlYW1UcmFuc3BvcnQgaXMgYSBUcmFuc3BvcnQgbWFkZSBvZiBhbiBpby5SZWFkZXIgYW5kL29yIGFuIGlvLldyaXRlcgordHlwZSBTdHJlYW1UcmFuc3BvcnQgc3RydWN0IHsKKwlpby5SZWFkZXIKKwlpby5Xcml0ZXIKKwlpc1JlYWRXcml0ZXIgYm9vbAorCWNsb3NlZCAgICAgICBib29sCit9CisKK3R5cGUgU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCVJlYWRlciAgICAgICBpby5SZWFkZXIKKwlXcml0ZXIgICAgICAgaW8uV3JpdGVyCisJaXNSZWFkV3JpdGVyIGJvb2wKK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCWlmIHRyYW5zICE9IG5pbCB7CisJCXQsIG9rIDo9IHRyYW5zLigqU3RyZWFtVHJhbnNwb3J0KQorCQlpZiBvayB7CisJCQlpZiB0LmlzUmVhZFdyaXRlciB7CisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHQuUmVhZGVyLihpby5SZWFkV3JpdGVyKSksIG5pbAorCQkJfQorCQkJaWYgdC5SZWFkZXIgIT0gbmlsICYmIHQuV3JpdGVyICE9IG5pbCB7CisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydCh0LlJlYWRlciwgdC5Xcml0ZXIpLCBuaWwKKwkJCX0KKwkJCWlmIHQuUmVhZGVyICE9IG5pbCAmJiB0LldyaXRlciA9PSBuaWwgeworCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSKHQuUmVhZGVyKSwgbmlsCisJCQl9CisJCQlpZiB0LlJlYWRlciA9PSBuaWwgJiYgdC5Xcml0ZXIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Vyh0LldyaXRlciksIG5pbAorCQkJfQorCQkJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7fSwgbmlsCisJCX0KKwl9CisJaWYgcC5pc1JlYWRXcml0ZXIgeworCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UlcocC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKSwgbmlsCisJfQorCWlmIHAuUmVhZGVyICE9IG5pbCAmJiBwLldyaXRlciAhPSBuaWwgeworCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0KHAuUmVhZGVyLCBwLldyaXRlciksIG5pbAorCX0KKwlpZiBwLlJlYWRlciAhPSBuaWwgJiYgcC5Xcml0ZXIgPT0gbmlsIHsKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFIocC5SZWFkZXIpLCBuaWwKKwl9CisJaWYgcC5SZWFkZXIgPT0gbmlsICYmIHAuV3JpdGVyICE9IG5pbCB7CisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRXKHAuV3JpdGVyKSwgbmlsCisJfQorCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30sIG5pbAorfQorCitmdW5jIE5ld1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkocmVhZGVyIGlvLlJlYWRlciwgd3JpdGVyIGlvLldyaXRlciwgaXNSZWFkV3JpdGVyIGJvb2wpICpTdHJlYW1UcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydEZhY3Rvcnl7UmVhZGVyOiByZWFkZXIsIFdyaXRlcjogd3JpdGVyLCBpc1JlYWRXcml0ZXI6IGlzUmVhZFdyaXRlcn0KK30KKworZnVuYyBOZXdTdHJlYW1UcmFuc3BvcnQociBpby5SZWFkZXIsIHcgaW8uV3JpdGVyKSAqU3RyZWFtVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHtSZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcihyKSwgV3JpdGVyOiBidWZpby5OZXdXcml0ZXIodyl9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0UihyIGlvLlJlYWRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7UmVhZGVyOiBidWZpby5OZXdSZWFkZXIocil9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0Vyh3IGlvLldyaXRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7V3JpdGVyOiBidWZpby5OZXdXcml0ZXIodyl9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0UlcocncgaW8uUmVhZFdyaXRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJYnVmcncgOj0gYnVmaW8uTmV3UmVhZFdyaXRlcihidWZpby5OZXdSZWFkZXIocncpLCBidWZpby5OZXdXcml0ZXIocncpKQorCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e1JlYWRlcjogYnVmcncsIFdyaXRlcjogYnVmcncsIGlzUmVhZFdyaXRlcjogdHJ1ZX0KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gIXAuY2xvc2VkCit9CisKKy8vIGltcGxpY2l0bHkgb3BlbmVkIG9uIGNyZWF0aW9uLCBjYW4ndCBiZSByZW9wZW5lZCBvbmNlIGNsb3NlZAorZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBPcGVuKCkgZXJyb3IgeworCWlmICFwLmNsb3NlZCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlN0cmVhbVRyYW5zcG9ydCBhbHJlYWR5IG9wZW4uIikKKwl9IGVsc2UgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgImNhbm5vdCByZW9wZW4gU3RyZWFtVHJhbnNwb3J0LiIpCisJfQorfQorCisvLyBDbG9zZXMgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlpZiBwLmNsb3NlZCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiU3RyZWFtVHJhbnNwb3J0IGFscmVhZHkgY2xvc2VkLiIpCisJfQorCXAuY2xvc2VkID0gdHJ1ZQorCWNsb3NlZFJlYWRlciA6PSBmYWxzZQorCWlmIHAuUmVhZGVyICE9IG5pbCB7CisJCWMsIG9rIDo9IHAuUmVhZGVyLihpby5DbG9zZXIpCisJCWlmIG9rIHsKKwkJCWUgOj0gYy5DbG9zZSgpCisJCQljbG9zZWRSZWFkZXIgPSB0cnVlCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIGUKKwkJCX0KKwkJfQorCQlwLlJlYWRlciA9IG5pbAorCX0KKwlpZiBwLldyaXRlciAhPSBuaWwgJiYgKCFjbG9zZWRSZWFkZXIgfHwgIXAuaXNSZWFkV3JpdGVyKSB7CisJCWMsIG9rIDo9IHAuV3JpdGVyLihpby5DbG9zZXIpCisJCWlmIG9rIHsKKwkJCWUgOj0gYy5DbG9zZSgpCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIGUKKwkJCX0KKwkJfQorCQlwLldyaXRlciA9IG5pbAorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIEZsdXNoZXMgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBpZiBub3QgbnVsbC4KK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCWlmIHAuV3JpdGVyID09IG5pbCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IGZsdXNoIG51bGwgb3V0cHV0U3RyZWFtIikKKwl9CisJZiwgb2sgOj0gcC5Xcml0ZXIuKEZsdXNoZXIpCisJaWYgb2sgeworCQllcnIgOj0gZi5GbHVzaCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCQl9CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBSZWFkKGMgW11ieXRlKSAobiBpbnQsIGVyciBlcnJvcikgeworCW4sIGVyciA9IHAuUmVhZGVyLlJlYWQoYykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFJlYWRCeXRlKCkgKGMgYnl0ZSwgZXJyIGVycm9yKSB7CisJZiwgb2sgOj0gcC5SZWFkZXIuKGlvLkJ5dGVSZWFkZXIpCisJaWYgb2sgeworCQljLCBlcnIgPSBmLlJlYWRCeXRlKCkKKwl9IGVsc2UgeworCQljLCBlcnIgPSByZWFkQnl0ZShwLlJlYWRlcikKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBXcml0ZShjIFtdYnl0ZSkgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwluLCBlcnIgPSBwLldyaXRlci5Xcml0ZShjKQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgV3JpdGVCeXRlKGMgYnl0ZSkgKGVyciBlcnJvcikgeworCWYsIG9rIDo9IHAuV3JpdGVyLihpby5CeXRlV3JpdGVyKQorCWlmIG9rIHsKKwkJZXJyID0gZi5Xcml0ZUJ5dGUoYykKKwl9IGVsc2UgeworCQllcnIgPSB3cml0ZUJ5dGUocC5Xcml0ZXIsIGMpCisJfQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgV3JpdGVTdHJpbmcocyBzdHJpbmcpIChuIGludCwgZXJyIGVycm9yKSB7CisJZiwgb2sgOj0gcC5Xcml0ZXIuKHN0cmluZ1dyaXRlcikKKwlpZiBvayB7CisJCW4sIGVyciA9IGYuV3JpdGVTdHJpbmcocykKKwl9IGVsc2UgeworCQluLCBlcnIgPSBwLldyaXRlci5Xcml0ZShbXWJ5dGUocykpCisJfQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhNjExNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0U3RyZWFtVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zIDo9IE5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpKQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RTdHJlYW1UcmFuc3BvcnRPcGVuQ2xvc2UodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3U3RyZWFtVHJhbnNwb3J0UlcoYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkpCisJaWYgIXRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBiZSBhbHJlYWR5IG9wZW4iKQorCX0KKwlpZiB0cmFucy5PcGVuKCkgPT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCByZXR1cm4gZXJyb3Igd2hlbiBvcGVuIHR3aWNlIikKKwl9CisJaWYgdHJhbnMuQ2xvc2UoKSAhPSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIG5vdCByZXR1cm4gZXJyb3Igd2hlbiBjbG9zaW5nIG9wZW4gdHJhbnNwb3J0IikKKwl9CisJaWYgdHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIG5vdCBiZSBvcGVuIGFmdGVyIGNsb3NlIikKKwl9CisJaWYgdHJhbnMuQ2xvc2UoKSA9PSBuaWwgeworCQl0LkZhdGFsKCJTdHJlYW1UcmFuc3BvcnQgc2hvdWxkIHJldHVybiBlcnJvciB3aGVuIGNsb3NpbmcgYSBub24gb3BlbiB0cmFuc3BvcnQiKQorCX0KKwlpZiB0cmFucy5PcGVuKCkgPT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBub3QgYmUgYWJsZSB0byByZW9wZW4iKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU2ODVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsNTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVuY29kaW5nL2Jhc2U2NCIKKwkiZm10IgorKQorCitjb25zdCAoCisJVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiA9IDEKKykKKworLy8gZm9yIHJlZmVyZW5jZXMgdG8gX1BhcnNlQ29udGV4dCBzZWUgdHNpbXBsZWpzb25fcHJvdG9jb2wuZ28KKworLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorLy8KKy8vIFRoaXMgcHJvdG9jb2wgcHJvZHVjZXMvY29uc3VtZXMgYSBzaW1wbGUgb3V0cHV0IGZvcm1hdAorLy8gc3VpdGFibGUgZm9yIHBhcnNpbmcgYnkgc2NyaXB0aW5nIGxhbmd1YWdlcy4gIEl0IHNob3VsZCBub3QgYmUKKy8vIGNvbmZ1c2VkIHdpdGggdGhlIGZ1bGwtZmVhdHVyZWQgVEpTT05Qcm90b2NvbC4KKy8vCit0eXBlIFRKU09OUHJvdG9jb2wgc3RydWN0IHsKKwkqVFNpbXBsZUpTT05Qcm90b2NvbAorfQorCisvLyBDb25zdHJ1Y3RvcgorZnVuYyBOZXdUSlNPTlByb3RvY29sKHQgVFRyYW5zcG9ydCkgKlRKU09OUHJvdG9jb2wgeworCXYgOj0gJlRKU09OUHJvdG9jb2x7VFNpbXBsZUpTT05Qcm90b2NvbDogTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0KX0KKwl2LnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHYucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCisJdi5kdW1wQ29udGV4dCA9IGFwcGVuZCh2LmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQorCXJldHVybiB2Cit9CisKKy8vIEZhY3RvcnkKK3R5cGUgVEpTT05Qcm90b2NvbEZhY3Rvcnkgc3RydWN0e30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7CisJcmV0dXJuIE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCit9CisKK2Z1bmMgTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSAqVEpTT05Qcm90b2NvbEZhY3RvcnkgeworCXJldHVybiAmVEpTT05Qcm90b2NvbEZhY3Rvcnl7fQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIpIGVycm9yIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTMyKFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTMyKHNlcUlkKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0T2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJaWYgZSA6PSBwLldyaXRlSTE2KGlkKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0T2JqZWN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKHR5cGVJZCkKKwlpZiBlMSAhPSBuaWwgeworCQlyZXR1cm4gZTEKKwl9CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHMpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRPYmplY3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKGtleVR5cGUpCisJaWYgZTEgIT0gbmlsIHsKKwkJcmV0dXJuIGUxCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhzKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA9IHAuVHlwZUlkVG9TdHJpbmcodmFsdWVUeXBlKQorCWlmIGUxICE9IG5pbCB7CisJCXJldHVybiBlMQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRPYmplY3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RFbmQoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUJvb2woYiBib29sKSBlcnJvciB7CisJaWYgYiB7CisJCXJldHVybiBwLldyaXRlSTMyKDEpCisJfQorCXJldHVybiBwLldyaXRlSTMyKDApCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGludDgpIGVycm9yIHsKKwlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihiKSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVJMTYodiBpbnQxNikgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTMyKGludDMyKHYpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUkzMih2IGludDMyKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUk2NCh2IGludDY0KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZURvdWJsZSh2IGZsb2F0NjQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRGNjQodikKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJpbmcodiBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRTdHJpbmcodikKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVCaW5hcnkodiBbXWJ5dGUpIGVycm9yIHsKKwkvLyBKU09OIGxpYnJhcnkgb25seSB0YWtlcyBpbiBhIHN0cmluZywKKwkvLyBub3QgYW4gYXJiaXRyYXJ5IGJ5dGUgYXJyYXksIHRvIGVuc3VyZSBieXRlcyBhcmUgdHJhbnNtaXR0ZWQKKwkvLyBlZmZpY2llbnRseSB3ZSBtdXN0IGNvbnZlcnQgdGhpcyBpbnRvIGEgdmFsaWQgSlNPTiBzdHJpbmcKKwkvLyB0aGVyZWZvcmUgd2UgdXNlIGJhc2U2NCBlbmNvZGluZyB0byBhdm9pZCBleGNlc3NpdmUgZXNjYXBpbmcvcXVvdGluZworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQorCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKKy8vIFJlYWRpbmcgbWV0aG9kcy4KK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwl2ZXJzaW9uLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiB2ZXJzaW9uICE9IFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04geworCQllIDo9IGZtdC5FcnJvcmYoIlVua25vd24gUHJvdG9jb2wgdmVyc2lvbiAlZCwgZXhwZWN0ZWQgdmVyc2lvbiAlZCIsIHZlcnNpb24sIFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pCisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisKKwl9CisJaWYgbmFtZSwgZXJyID0gcC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWJUeXBlSWQsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoYlR5cGVJZCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiBzZXFJZCwgZXJyID0gcC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7CisJZXJyIDo9IHAuUGFyc2VMaXN0RW5kKCkKKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKSB7CisJXywgZXJyID0gcC5QYXJzZU9iamVjdFN0YXJ0KCkKKwlyZXR1cm4gIiIsIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlT2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAoc3RyaW5nLCBUVHlwZSwgaW50MTYsIGVycm9yKSB7CisJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGIpIDwgMSB8fCBiWzBdID09IEpTT05fUkJSQUNFWzBdIHx8IGJbMF0gPT0gSlNPTl9SQlJBQ0tFVFswXSB7CisJCXJldHVybiAiIiwgU1RPUCwgLTEsIG5pbAorCX0KKwlmaWVsZElkLCBlcnIgOj0gcC5SZWFkSTE2KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBTVE9QLCBmaWVsZElkLCBlcnIKKwl9CisJaWYgXywgZXJyID0gcC5QYXJzZU9iamVjdFN0YXJ0KCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIFNUT1AsIGZpZWxkSWQsIGVycgorCX0KKwlzVHlwZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgU1RPUCwgZmllbGRJZCwgZXJyCisJfQorCWZUeXBlLCBlcnIgOj0gcC5TdHJpbmdUb1R5cGVJZChzVHlwZSkKKwlyZXR1cm4gIiIsIGZUeXBlLCBmaWVsZElkLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlT2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgVk9JRCwgMCwgZQorCX0KKworCS8vIHJlYWQga2V5VHlwZQorCXNLZXlUeXBlLCBlIDo9IHAuUmVhZFN0cmluZygpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCWtleVR5cGUsIGUgPSBwLlN0cmluZ1RvVHlwZUlkKHNLZXlUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgdmFsdWVUeXBlCisJc1ZhbHVlVHlwZSwgZSA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKwl2YWx1ZVR5cGUsIGUgPSBwLlN0cmluZ1RvVHlwZUlkKHNWYWx1ZVR5cGUpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCisJLy8gcmVhZCBzaXplCisJaVNpemUsIGUgOj0gcC5SZWFkSTY0KCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKKwl9CisJc2l6ZSA9IGludChpU2l6ZSkKKworCV8sIGUgPSBwLlBhcnNlT2JqZWN0U3RhcnQoKQorCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1hcEVuZCgpIGVycm9yIHsKKwllIDo9IHAuUGFyc2VPYmplY3RFbmQoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlyZXR1cm4gcC5QYXJzZUVsZW1MaXN0QmVnaW4oKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTGlzdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFNldEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBlcnJvcikgeworCXZhbHVlLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwlyZXR1cm4gKHZhbHVlICE9IDApLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDE2KHYpLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50MzIodiksIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkSTY0KCkgKGludDY0LCBlcnJvcikgeworCXYsIF8sIGVyciA6PSBwLlBhcnNlSTY0KCkKKwlyZXR1cm4gdiwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWREb3VibGUoKSAoZmxvYXQ2NCwgZXJyb3IpIHsKKwl2LCBfLCBlcnIgOj0gcC5QYXJzZUY2NCgpCisJcmV0dXJuIHYsIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgZXJyb3IpIHsKKwl2YXIgdiBzdHJpbmcKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gdiwgZXJyCisJfQorCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQl2YWx1ZSwgZXJyIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJdiA9IHZhbHVlCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIGVycgorCQl9CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlpZiBzdHJpbmcoYikgIT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhiKSkKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9IGVsc2UgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGYpKQorCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXZhciB2IFtdYnl0ZQorCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9RVU9URSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJdmFsdWUsIGVyciA6PSBwLlBhcnNlQmFzZTY0RW5jb2RlZEJvZHkoKQorCQl2ID0gdmFsdWUKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgZXJyCisJCX0KKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0gZWxzZSB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCisJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCisJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJZXJyID0gcC53cml0ZXIuRmx1c2goKQorCWlmIGVyciA9PSBuaWwgeworCQllcnIgPSBwLnRyYW5zLkZsdXNoKGN0eCkKKwl9CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIFNraXBEZWZhdWx0RGVwdGgocCwgZmllbGRUeXBlKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBUcmFuc3BvcnQoKSBUVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC50cmFucworfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBPdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKGVsZW1UeXBlKQorCWlmIGUxICE9IG5pbCB7CisJCXJldHVybiBlMQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFBhcnNlRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgMCwgZQorCX0KKwlzRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgc2l6ZSwgZXJyCisJfQorCWVsZW1UeXBlLCBlcnIgPSBwLlN0cmluZ1RvVHlwZUlkKHNFbGVtVHlwZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIKKwl9CisJblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KG5TaXplKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSByZWFkRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgMCwgZQorCX0KKwlzRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgc2l6ZSwgZXJyCisJfQorCWVsZW1UeXBlLCBlcnIgPSBwLlN0cmluZ1RvVHlwZUlkKHNFbGVtVHlwZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIKKwl9CisJblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KG5TaXplKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSB3cml0ZUVsZW1MaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXMsIGUxIDo9IHAuVHlwZUlkVG9TdHJpbmcoZWxlbVR5cGUpCisJaWYgZTEgIT0gbmlsIHsKKwkJcmV0dXJuIGUxCisJfQorCWlmIGUgOj0gcC5PdXRwdXRTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLk91dHB1dEk2NChpbnQ2NChzaXplKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBUeXBlSWRUb1N0cmluZyhmaWVsZFR5cGUgVFR5cGUpIChzdHJpbmcsIGVycm9yKSB7CisJc3dpdGNoIGJ5dGUoZmllbGRUeXBlKSB7CisJY2FzZSBCT09MOgorCQlyZXR1cm4gInRmIiwgbmlsCisJY2FzZSBCWVRFOgorCQlyZXR1cm4gImk4IiwgbmlsCisJY2FzZSBJMTY6CisJCXJldHVybiAiaTE2IiwgbmlsCisJY2FzZSBJMzI6CisJCXJldHVybiAiaTMyIiwgbmlsCisJY2FzZSBJNjQ6CisJCXJldHVybiAiaTY0IiwgbmlsCisJY2FzZSBET1VCTEU6CisJCXJldHVybiAiZGJsIiwgbmlsCisJY2FzZSBTVFJJTkc6CisJCXJldHVybiAic3RyIiwgbmlsCisJY2FzZSBTVFJVQ1Q6CisJCXJldHVybiAicmVjIiwgbmlsCisJY2FzZSBNQVA6CisJCXJldHVybiAibWFwIiwgbmlsCisJY2FzZSBTRVQ6CisJCXJldHVybiAic2V0IiwgbmlsCisJY2FzZSBMSVNUOgorCQlyZXR1cm4gImxzdCIsIG5pbAorCX0KKworCWUgOj0gZm10LkVycm9yZigiVW5rbm93biBmaWVsZFR5cGU6ICVkIiwgaW50KGZpZWxkVHlwZSkpCisJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFN0cmluZ1RvVHlwZUlkKGZpZWxkVHlwZSBzdHJpbmcpIChUVHlwZSwgZXJyb3IpIHsKKwlzd2l0Y2ggZmllbGRUeXBlIHsKKwljYXNlICJ0ZiI6CisJCXJldHVybiBUVHlwZShCT09MKSwgbmlsCisJY2FzZSAiaTgiOgorCQlyZXR1cm4gVFR5cGUoQllURSksIG5pbAorCWNhc2UgImkxNiI6CisJCXJldHVybiBUVHlwZShJMTYpLCBuaWwKKwljYXNlICJpMzIiOgorCQlyZXR1cm4gVFR5cGUoSTMyKSwgbmlsCisJY2FzZSAiaTY0IjoKKwkJcmV0dXJuIFRUeXBlKEk2NCksIG5pbAorCWNhc2UgImRibCI6CisJCXJldHVybiBUVHlwZShET1VCTEUpLCBuaWwKKwljYXNlICJzdHIiOgorCQlyZXR1cm4gVFR5cGUoU1RSSU5HKSwgbmlsCisJY2FzZSAicmVjIjoKKwkJcmV0dXJuIFRUeXBlKFNUUlVDVCksIG5pbAorCWNhc2UgIm1hcCI6CisJCXJldHVybiBUVHlwZShNQVApLCBuaWwKKwljYXNlICJzZXQiOgorCQlyZXR1cm4gVFR5cGUoU0VUKSwgbmlsCisJY2FzZSAibHN0IjoKKwkJcmV0dXJuIFRUeXBlKExJU1QpLCBuaWwKKwl9CisKKwllIDo9IGZtdC5FcnJvcmYoIlVua25vd24gdHlwZSBpZGVudGlmaWVyOiAlcyIsIGZpZWxkVHlwZSkKKwlyZXR1cm4gVFR5cGUoU1RPUCksIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljNGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsNjUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVuY29kaW5nL2Jhc2U2NCIKKwkiZW5jb2RpbmcvanNvbiIKKwkiZm10IgorCSJtYXRoIgorCSJzdHJjb252IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQm9vbCh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWV4cGVjdGVkIDo9ICIiCisJCWlmIHZhbHVlIHsKKwkJCWV4cGVjdGVkID0gIjEiCisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA9ICIwIgorCQl9CisJCWlmIHMgIT0gZXhwZWN0ZWQgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIGV4cGVjdGVkIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSAtMQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgKHYgIT0gMCkgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQlpZiB2YWx1ZSB7CisJCQl0cmFucy5Xcml0ZShbXWJ5dGV7JzEnfSkgLy8gbm90IEpTT05fVFJVRQorCQl9IGVsc2UgeworCQkJdHJhbnMuV3JpdGUoW11ieXRleycwJ30pIC8vIG5vdCBKU09OX0ZBTFNFCisJCX0KKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRCb29sKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdnYgOj0gLTEKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnZ2KTsgZXJyICE9IG5pbCB8fCAodnYgIT0gMCkgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdnYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYnl0ZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQnl0ZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQ4KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJ5dGUiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEJ5dGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MTYiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMTYodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50MTYoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQxNiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEkxNigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQzMigwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDY0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDY0KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50NjQiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTY0KCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImRvdWJsZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkFOKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJCXYgOj0gZmxvYXQ2NCgwKQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiZG91YmxlIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKKwkJdHJhbnMuV3JpdGVTdHJpbmcobi5TdHJpbmcoKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWREb3VibGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgIW1hdGguSXNJbmYodiwgMSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKKwkJCWlmICFtYXRoLklzSW5mKHYsIC0xKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiAhbWF0aC5Jc05hTih2KSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHNbMF0gIT0gJyInIHx8IHNbbGVuKHMpLTFdICE9ICciJyB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAnJXYnLCB3cm90ZSAnJXYnLCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgZm10LlNwcmludCgiXCIiLCB2YWx1ZSwgIlwiIikpCisJCX0KKwkJdiA6PSBuZXcoc3RyaW5nKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2KTsgZXJyICE9IG5pbCB8fCAqdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzdHJpbmciCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUodmFsdWUpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXYxIDo9IG5ldyhzdHJpbmcpCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYmluYXJ5IgorCXZhbHVlIDo9IHByb3RvY29sX2JkYXRhCisJYjY0dmFsdWUgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihwcm90b2NvbF9iZGF0YSkpKQorCWJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGUoYjY0dmFsdWUsIHZhbHVlKQorCWI2NFN0cmluZyA6PSBzdHJpbmcoYjY0dmFsdWUpCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWlmIGUgOj0gcC5Xcml0ZUJpbmFyeSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlzIDo9IHRyYW5zLlN0cmluZygpCisJZXhwZWN0ZWRTdHJpbmcgOj0gZm10LlNwcmludCgiXCIiLCBiNjRTdHJpbmcsICJcIiIpCisJaWYgcyAhPSBleHBlY3RlZFN0cmluZyB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2XG4gIHdyb3RlOiAgXCIldlwiXG5leHBlY3RlZDogXCIldlwiIiwgdGhldHlwZSwgdmFsdWUsIHMsIGV4cGVjdGVkU3RyaW5nKQorCX0KKwl2MSwgZXJyIDo9IHAuUmVhZEJpbmFyeSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCBiaW5hcnk6ICVzIiwgZXJyLkVycm9yKCkpCisJfQorCWlmIGxlbih2MSkgIT0gbGVuKHZhbHVlKSB7CisJCXQuRmF0YWxmKCJJbnZhbGlkIHZhbHVlIGZvciBiaW5hcnlcbmV4cGVjdGVkOiBcIiV2XCJcbiAgIHJlYWQ6IFwiJXZcIiIsIHZhbHVlLCB2MSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgdmFsdWUgeworCQlpZiB2MVtrXSAhPSB2IHsKKwkJCXQuRmF0YWxmKCJJbnZhbGlkIHZhbHVlIGZvciBiaW5hcnkgYXQgJXZcbmV4cGVjdGVkOiBcIiV2XCJcbiAgIHJlYWQ6IFwiJXZcIiIsIGssIHYsIHYxW2tdKQorCQl9CisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJiaW5hcnkiCisJdmFsdWUgOj0gcHJvdG9jb2xfYmRhdGEKKwliNjR2YWx1ZSA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZWRMZW4obGVuKHByb3RvY29sX2JkYXRhKSkpCisJYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZShiNjR2YWx1ZSwgdmFsdWUpCisJYjY0U3RyaW5nIDo9IHN0cmluZyhiNjR2YWx1ZSkKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKGI2NFN0cmluZykpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJcyA6PSB0cmFucy5TdHJpbmcoKQorCXYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgbGVuKHYpICE9IGxlbih2YWx1ZSkgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSBsZW5ndGggJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQgbGVuZ3RoOiAldiIsIHRoZXR5cGUsIGxlbih2YWx1ZSksIHMsIGxlbih2KSkKKwl9CisJZm9yIGkgOj0gMDsgaSA8IGxlbih2KTsgaSsrIHsKKwkJaWYgdltpXSAhPSB2YWx1ZVtpXSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAlZCB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCBpLCB2YWx1ZVtpXSwgcywgdltpXSkKKwkJfQorCX0KKwl2MSA6PSBuZXcoc3RyaW5nKQorCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gYjY0U3RyaW5nIHsKKwkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbExpc3QodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAibGlzdCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZUxpc3RCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCisJfQorCWwgOj0gKnN0cjEKKwlpZiBsZW4obCkgPCAyIHsKKwkJdC5GYXRhbGYoIkxpc3QgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBsWzBdICE9ICJkYmwiIHsKKwkJdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBsaXN0LCBleHBlY3RlZDogIiwgU1RSSU5HLCAiLCBidXQgd2FzOiAiLCBsWzBdKQorCX0KKwlpZiBpbnQobFsxXS4oZmxvYXQ2NCkpICE9IGxlbihET1VCTEVfVkFMVUVTKSB7CisJCXQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBsaXN0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXMgOj0gbFtrKzJdCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4geworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTiksIHN0cikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sU2V0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInNldCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZVNldEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwl9CisJcC5Xcml0ZVNldEVuZCgpCisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCisJfQorCXN0ciA6PSB0cmFucy5TdHJpbmcoKQorCXN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCisJZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzdHIpLCBzdHIxKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGRlY29kZSAlcywgd3JvdGU6ICVzIiwgdGhldHlwZSwgc3RyKQorCX0KKwlsIDo9ICpzdHIxCisJaWYgbGVuKGwpIDwgMiB7CisJCXQuRmF0YWxmKCJTZXQgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBsWzBdICE9ICJkYmwiIHsKKwkJdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBET1VCTEUsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCisJfQorCWlmIGludChsWzFdLihmbG9hdDY0KSkgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKKwkJdC5GYXRhbCgiSW52YWxpZCBsZW5ndGggZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzIDo9IGxbaysyXQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbE1hcCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJtYXAiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVNYXBCZWdpbihUVHlwZShJMzIpLCBUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMzIoaW50MzIoaykpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGtleSBpbnQzMiB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgZmxvYXQ2NCB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCX0KKwlwLldyaXRlTWFwRW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAldiwgaW4gZ286ICV2IiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQorCX0KKwlleHBlY3RlZEtleVR5cGUsIGV4cGVjdGVkVmFsdWVUeXBlLCBleHBlY3RlZFNpemUsIGVyciA6PSBwLlJlYWRNYXBCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJFcnJvciB3aGlsZSByZWFkaW5nIG1hcCBiZWdpbjogJXMiLCBlcnIuRXJyb3IoKSkKKwl9CisJaWYgZXhwZWN0ZWRLZXlUeXBlICE9IEkzMiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCBrZXkgdHlwZSAiLCBJMzIsICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRLZXlUeXBlKQorCX0KKwlpZiBleHBlY3RlZFZhbHVlVHlwZSAhPSBET1VCTEUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgdmFsdWUgdHlwZSAiLCBET1VCTEUsICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRWYWx1ZVR5cGUpCisJfQorCWlmIGV4cGVjdGVkU2l6ZSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgc2l6ZSBvZiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRTaXplKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlrLCBlcnIgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkZhdGFsZigiQmFkIGtleSBmb3IgJXMgaW5kZXggJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2LCBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBpaywgc3RyaW5nKGspLCBlcnIuRXJyb3IoKSkKKwkJfQorCQlpZiBpbnQoaWspICE9IGsgeworCQkJdC5GYXRhbGYoIkJhZCBrZXkgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIGlrLCBrKQorCQl9CisJCWR2LCBlcnIgOj0gcC5SZWFkRG91YmxlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIGR2LCB2YWx1ZSwgZXJyLkVycm9yKCkpCisJCX0KKwkJcyA6PSBzdHJjb252LkZvcm1hdEZsb2F0KGR2LCAnZycsIDEwLCA2NCkKKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgIW1hdGguSXNJbmYoZHYsIDEpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgeworCQkJaWYgIW1hdGguSXNJbmYoZHYsIDApIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgIW1hdGguSXNOYU4oZHYpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA6PSBzdHJjb252LkZvcm1hdEZsb2F0KHZhbHVlLCAnZycsIDEwLCA2NCkKKwkJCWlmIHMgIT0gZXhwZWN0ZWQgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGV4cGVjdGVkKQorCQkJfQorCQkJdiA6PSBmbG9hdDY0KDApCisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCX0KKwllcnIgPSBwLlJlYWRNYXBFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRXJyb3Igd2hpbGUgcmVhZGluZyBtYXAgZW5kOiAlcyIsIGVyci5FcnJvcigpKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2xvd2xldmVsX2JlbmNobWFya3NfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzM2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2xvd2xldmVsX2JlbmNobWFya3NfdGVzdC5nbwpAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkidGVzdGluZyIKKykKKwordmFyIGJpbmFyeVByb3RvRiA9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKK3ZhciBjb21wYWN0UHJvdG9GID0gTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCit2YXIgYnVmID0gYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkKKwordmFyIHRmdiA9IFtdVFRyYW5zcG9ydEZhY3Rvcnl7CisJTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCksCisJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCisJTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qnl0ZV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMTZfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5STY0XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkxNl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkzMl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlJNjRfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTY0KGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5RG91YmxlXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeVN0cmluZ18xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlCaW5hcnlfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQmluYXJ5KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCb29sXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJ5dGVfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STE2XzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STMyXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCb29sXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcwKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCb29sXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcxKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RCb29sXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkxNl8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0STMyXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0STY0XzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0RG91YmxlMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RTdHJpbmcyKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJpbmFyeTIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzZkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28KQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkiY29udGV4dCIKKykKKworLy8gTWVtb3J5IGJ1ZmZlci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCit0eXBlIFRNZW1vcnlCdWZmZXIgc3RydWN0IHsKKwkqYnl0ZXMuQnVmZmVyCisJc2l6ZSBpbnQKK30KKwordHlwZSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCXNpemUgaW50Cit9CisKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgdHJhbnMgIT0gbmlsIHsKKwkJdCwgb2sgOj0gdHJhbnMuKCpUTWVtb3J5QnVmZmVyKQorCQlpZiBvayAmJiB0LnNpemUgPiAwIHsKKwkJCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyTGVuKHQuc2l6ZSksIG5pbAorCQl9CisJfQorCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyTGVuKHAuc2l6ZSksIG5pbAorfQorCitmdW5jIE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KHNpemUgaW50KSAqVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnl7c2l6ZTogc2l6ZX0KK30KKworZnVuYyBOZXdUTWVtb3J5QnVmZmVyKCkgKlRNZW1vcnlCdWZmZXIgeworCXJldHVybiAmVE1lbW9yeUJ1ZmZlcntCdWZmZXI6ICZieXRlcy5CdWZmZXJ7fSwgc2l6ZTogMH0KK30KKworZnVuYyBOZXdUTWVtb3J5QnVmZmVyTGVuKHNpemUgaW50KSAqVE1lbW9yeUJ1ZmZlciB7CisJYnVmIDo9IG1ha2UoW11ieXRlLCAwLCBzaXplKQorCXJldHVybiAmVE1lbW9yeUJ1ZmZlcntCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcihidWYpLCBzaXplOiBzaXplfQorfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gdHJ1ZQorfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBPcGVuKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgQ2xvc2UoKSBlcnJvciB7CisJcC5CdWZmZXIuUmVzZXQoKQorCXJldHVybiBuaWwKK30KKworLy8gRmx1c2hpbmcgYSBtZW1vcnkgYnVmZmVyIGlzIGEgbm8tb3AKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwlyZXR1cm4gdWludDY0KHAuQnVmZmVyLkxlbigpKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjJlOGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyX3Rlc3QuZ28KQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RNZW1vcnlCdWZmZXIodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlckxlbigxMDI0KQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tZXNzYWdldHlwZS5nbyBiL2xpYi9nby90aHJpZnQvbWVzc2FnZXR5cGUuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhYjJlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbWVzc2FnZXR5cGUuZ28KQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBNZXNzYWdlIHR5cGUgY29uc3RhbnRzIGluIHRoZSBUaHJpZnQgcHJvdG9jb2wuCit0eXBlIFRNZXNzYWdlVHlwZSBpbnQzMgorCitjb25zdCAoCisJSU5WQUxJRF9UTUVTU0FHRV9UWVBFIFRNZXNzYWdlVHlwZSA9IDAKKwlDQUxMICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gMQorCVJFUExZICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUgPSAyCisJRVhDRVBUSU9OICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDMKKwlPTkVXQVkgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gNAorKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyOGEzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJzdHJpbmdzIgorKQorCisvKgorVE11bHRpcGxleGVkUHJvdG9jb2wgaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKK3RoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCitieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorCitOT1RFOiBUSElTIElTIE5PVCBVU0VEIEJZIFNFUlZFUlMuICBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0Citmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKworVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorCitzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKK3RyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCitwcm90b2NvbCA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKKworbXAgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpCitzZXJ2aWNlIDo9IENhbGN1bGF0b3IuTmV3Q2FsY3VsYXRvckNsaWVudChtcCkKKworbXAyIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKQorc2VydmljZTIgOj0gV2VhdGhlclJlcG9ydC5OZXdXZWF0aGVyUmVwb3J0Q2xpZW50KG1wMikKKworZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKK2lmIGVyciAhPSBuaWwgeworCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCit9CisKK2ZtdC5QcmludGxuKHNlcnZpY2UuQWRkKDIsMikpCitmbXQuUHJpbnRsbihzZXJ2aWNlMi5HZXRUZW1wZXJhdHVyZSgpKQorKi8KKwordHlwZSBUTXVsdGlwbGV4ZWRQcm90b2NvbCBzdHJ1Y3QgeworCVRQcm90b2NvbAorCXNlcnZpY2VOYW1lIHN0cmluZworfQorCitjb25zdCBNVUxUSVBMRVhFRF9TRVBBUkFUT1IgPSAiOiIKKworZnVuYyBOZXdUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCBUUHJvdG9jb2wsIHNlcnZpY2VOYW1lIHN0cmluZykgKlRNdWx0aXBsZXhlZFByb3RvY29sIHsKKwlyZXR1cm4gJlRNdWx0aXBsZXhlZFByb3RvY29seworCQlUUHJvdG9jb2w6ICAgcHJvdG9jb2wsCisJCXNlcnZpY2VOYW1lOiBzZXJ2aWNlTmFtZSwKKwl9Cit9CisKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIGVycm9yIHsKKwlpZiB0eXBlSWQgPT0gQ0FMTCB8fCB0eXBlSWQgPT0gT05FV0FZIHsKKwkJcmV0dXJuIHQuVFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKHQuc2VydmljZU5hbWUrTVVMVElQTEVYRURfU0VQQVJBVE9SK25hbWUsIHR5cGVJZCwgc2VxaWQpCisJfSBlbHNlIHsKKwkJcmV0dXJuIHQuVFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGVJZCwgc2VxaWQpCisJfQorfQorCisvKgorVE11bHRpcGxleGVkUHJvY2Vzc29yIGlzIGEgVFByb2Nlc3NvciBhbGxvd2luZworYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorCitUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKK3ZhciBwcm9jZXNzb3IgPSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKworZmlyc3RQcm9jZXNzb3IgOj0KK3Byb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKK3Byb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgIkNhbGN1bGF0b3IiLAorICBDYWxjdWxhdG9yLk5ld0NhbGN1bGF0b3JQcm9jZXNzb3IoJkNhbGN1bGF0b3JIYW5kbGVye30pLAorKQorCitwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICJXZWF0aGVyUmVwb3J0IiwKKyAgV2VhdGhlclJlcG9ydC5OZXdXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKCZXZWF0aGVyUmVwb3J0SGFuZGxlcnt9KSwKKykKKworc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCitpZiBlcnIgIT0gbmlsIHsKKyAgdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorfQorc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyMihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKK3NlcnZlci5TZXJ2ZSgpOworKi8KKwordHlwZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3Igc3RydWN0IHsKKwlzZXJ2aWNlUHJvY2Vzc29yTWFwIG1hcFtzdHJpbmddVFByb2Nlc3NvcgorCURlZmF1bHRQcm9jZXNzb3IgICAgVFByb2Nlc3NvcgorfQorCitmdW5jIE5ld1RNdWx0aXBsZXhlZFByb2Nlc3NvcigpICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworCXJldHVybiAmVE11bHRpcGxleGVkUHJvY2Vzc29yeworCQlzZXJ2aWNlUHJvY2Vzc29yTWFwOiBtYWtlKG1hcFtzdHJpbmddVFByb2Nlc3NvciksCisJfQorfQorCitmdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIFJlZ2lzdGVyRGVmYXVsdChwcm9jZXNzb3IgVFByb2Nlc3NvcikgeworCXQuRGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcgorfQorCitmdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIFJlZ2lzdGVyUHJvY2Vzc29yKG5hbWUgc3RyaW5nLCBwcm9jZXNzb3IgVFByb2Nlc3NvcikgeworCWlmIHQuc2VydmljZVByb2Nlc3Nvck1hcCA9PSBuaWwgeworCQl0LnNlcnZpY2VQcm9jZXNzb3JNYXAgPSBtYWtlKG1hcFtzdHJpbmddVFByb2Nlc3NvcikKKwl9CisJdC5zZXJ2aWNlUHJvY2Vzc29yTWFwW25hbWVdID0gcHJvY2Vzc29yCit9CisKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwluYW1lLCB0eXBlSWQsIHNlcWlkLCBlcnIgOj0gaW4uUmVhZE1lc3NhZ2VCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyCisJfQorCWlmIHR5cGVJZCAhPSBDQUxMICYmIHR5cGVJZCAhPSBPTkVXQVkgeworCQlyZXR1cm4gZmFsc2UsIGZtdC5FcnJvcmYoIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlICV2IiwgdHlwZUlkKQorCX0KKwkvL2V4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorCXYgOj0gc3RyaW5ncy5TcGxpdE4obmFtZSwgTVVMVElQTEVYRURfU0VQQVJBVE9SLCAyKQorCWlmIGxlbih2KSAhPSAyIHsKKwkJaWYgdC5EZWZhdWx0UHJvY2Vzc29yICE9IG5pbCB7CisJCQlzbWIgOj0gTmV3U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCBuYW1lLCB0eXBlSWQsIHNlcWlkKQorCQkJcmV0dXJuIHQuRGVmYXVsdFByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc21iLCBvdXQpCisJCX0KKwkJcmV0dXJuIGZhbHNlLCBmbXQuRXJyb3JmKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogJXMuICBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IiwgbmFtZSkKKwl9CisJYWN0dWFsUHJvY2Vzc29yLCBvayA6PSB0LnNlcnZpY2VQcm9jZXNzb3JNYXBbdlswXV0KKwlpZiAhb2sgeworCQlyZXR1cm4gZmFsc2UsIGZtdC5FcnJvcmYoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICVzLiAgRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIsIHZbMF0pCisJfQorCXNtYiA6PSBOZXdTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHZbMV0sIHR5cGVJZCwgc2VxaWQpCisJcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc21iLCBvdXQpCit9CisKKy8vUHJvdG9jb2wgdGhhdCB1c2Ugc3RvcmVkIG1lc3NhZ2UgZm9yIFJlYWRNZXNzYWdlQmVnaW4KK3R5cGUgc3RvcmVkTWVzc2FnZVByb3RvY29sIHN0cnVjdCB7CisJVFByb3RvY29sCisJbmFtZSAgIHN0cmluZworCXR5cGVJZCBUTWVzc2FnZVR5cGUKKwlzZXFpZCAgaW50MzIKK30KKworZnVuYyBOZXdTdG9yZWRNZXNzYWdlUHJvdG9jb2wocHJvdG9jb2wgVFByb3RvY29sLCBuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpICpzdG9yZWRNZXNzYWdlUHJvdG9jb2wgeworCXJldHVybiAmc3RvcmVkTWVzc2FnZVByb3RvY29se3Byb3RvY29sLCBuYW1lLCB0eXBlSWQsIHNlcWlkfQorfQorCitmdW5jIChzICpzdG9yZWRNZXNzYWdlUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcy5uYW1lLCBzLnR5cGVJZCwgcy5zZXFpZCwgbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L251bWVyaWMuZ28gYi9saWIvZ28vdGhyaWZ0L251bWVyaWMuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZGFhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbnVtZXJpYy5nbwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJtYXRoIgorCSJzdHJjb252IgorKQorCit0eXBlIE51bWVyaWMgaW50ZXJmYWNlIHsKKwlJbnQ2NCgpIGludDY0CisJSW50MzIoKSBpbnQzMgorCUludDE2KCkgaW50MTYKKwlCeXRlKCkgYnl0ZQorCUludCgpIGludAorCUZsb2F0NjQoKSBmbG9hdDY0CisJRmxvYXQzMigpIGZsb2F0MzIKKwlTdHJpbmcoKSBzdHJpbmcKKwlpc051bGwoKSBib29sCit9CisKK3R5cGUgbnVtZXJpYyBzdHJ1Y3QgeworCWlWYWx1ZSBpbnQ2NAorCWRWYWx1ZSBmbG9hdDY0CisJc1ZhbHVlIHN0cmluZworCWlzTmlsICBib29sCit9CisKK3ZhciAoCisJSU5GSU5JVFkgICAgICAgICAgTnVtZXJpYworCU5FR0FUSVZFX0lORklOSVRZIE51bWVyaWMKKwlOQU4gICAgICAgICAgICAgICBOdW1lcmljCisJWkVSTyAgICAgICAgICAgICAgTnVtZXJpYworCU5VTUVSSUNfTlVMTCAgICAgIE51bWVyaWMKKykKKworZnVuYyBOZXdOdW1lcmljRnJvbURvdWJsZShkVmFsdWUgZmxvYXQ2NCkgTnVtZXJpYyB7CisJaWYgbWF0aC5Jc0luZihkVmFsdWUsIDEpIHsKKwkJcmV0dXJuIElORklOSVRZCisJfQorCWlmIG1hdGguSXNJbmYoZFZhbHVlLCAtMSkgeworCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKKwl9CisJaWYgbWF0aC5Jc05hTihkVmFsdWUpIHsKKwkJcmV0dXJuIE5BTgorCX0KKwlpVmFsdWUgOj0gaW50NjQoZFZhbHVlKQorCXNWYWx1ZSA6PSBzdHJjb252LkZvcm1hdEZsb2F0KGRWYWx1ZSwgJ2cnLCAxMCwgNjQpCisJaXNOaWwgOj0gZmFsc2UKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tSTY0KGlWYWx1ZSBpbnQ2NCkgTnVtZXJpYyB7CisJZFZhbHVlIDo9IGZsb2F0NjQoaVZhbHVlKQorCXNWYWx1ZSA6PSBzdHJpbmcoaVZhbHVlKQorCWlzTmlsIDo9IGZhbHNlCisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc05pbH0KK30KKworZnVuYyBOZXdOdW1lcmljRnJvbUkzMihpVmFsdWUgaW50MzIpIE51bWVyaWMgeworCWRWYWx1ZSA6PSBmbG9hdDY0KGlWYWx1ZSkKKwlzVmFsdWUgOj0gc3RyaW5nKGlWYWx1ZSkKKwlpc05pbCA6PSBmYWxzZQorCXJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGludDY0KGlWYWx1ZSksIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tU3RyaW5nKHNWYWx1ZSBzdHJpbmcpIE51bWVyaWMgeworCWlmIHNWYWx1ZSA9PSBJTkZJTklUWS5TdHJpbmcoKSB7CisJCXJldHVybiBJTkZJTklUWQorCX0KKwlpZiBzVmFsdWUgPT0gTkVHQVRJVkVfSU5GSU5JVFkuU3RyaW5nKCkgeworCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IE5BTi5TdHJpbmcoKSB7CisJCXJldHVybiBOQU4KKwl9CisJaVZhbHVlLCBfIDo9IHN0cmNvbnYuUGFyc2VJbnQoc1ZhbHVlLCAxMCwgNjQpCisJZFZhbHVlLCBfIDo9IHN0cmNvbnYuUGFyc2VGbG9hdChzVmFsdWUsIDY0KQorCWlzTmlsIDo9IGxlbihzVmFsdWUpID09IDAKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQorfQorCitmdW5jIE5ld051bWVyaWNGcm9tSlNPTlN0cmluZyhzVmFsdWUgc3RyaW5nLCBpc051bGwgYm9vbCkgTnVtZXJpYyB7CisJaWYgaXNOdWxsIHsKKwkJcmV0dXJuIE5ld051bGxOdW1lcmljKCkKKwl9CisJaWYgc1ZhbHVlID09IEpTT05fSU5GSU5JVFkgeworCQlyZXR1cm4gSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IEpTT05fTkFOIHsKKwkJcmV0dXJuIE5BTgorCX0KKwlpVmFsdWUsIF8gOj0gc3RyY29udi5QYXJzZUludChzVmFsdWUsIDEwLCA2NCkKKwlkVmFsdWUsIF8gOj0gc3RyY29udi5QYXJzZUZsb2F0KHNWYWx1ZSwgNjQpCisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc051bGx9Cit9CisKK2Z1bmMgTmV3TnVsbE51bWVyaWMoKSBOdW1lcmljIHsKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IDAuMCwgc1ZhbHVlOiAiIiwgaXNOaWw6IHRydWV9Cit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEludDY0KCkgaW50NjQgeworCXJldHVybiBwLmlWYWx1ZQorfQorCitmdW5jIChwICpudW1lcmljKSBJbnQzMigpIGludDMyIHsKKwlyZXR1cm4gaW50MzIocC5pVmFsdWUpCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEludDE2KCkgaW50MTYgeworCXJldHVybiBpbnQxNihwLmlWYWx1ZSkKK30KKworZnVuYyAocCAqbnVtZXJpYykgQnl0ZSgpIGJ5dGUgeworCXJldHVybiBieXRlKHAuaVZhbHVlKQorfQorCitmdW5jIChwICpudW1lcmljKSBJbnQoKSBpbnQgeworCXJldHVybiBpbnQocC5pVmFsdWUpCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEZsb2F0NjQoKSBmbG9hdDY0IHsKKwlyZXR1cm4gcC5kVmFsdWUKK30KKworZnVuYyAocCAqbnVtZXJpYykgRmxvYXQzMigpIGZsb2F0MzIgeworCXJldHVybiBmbG9hdDMyKHAuZFZhbHVlKQorfQorCitmdW5jIChwICpudW1lcmljKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwLnNWYWx1ZQorfQorCitmdW5jIChwICpudW1lcmljKSBpc051bGwoKSBib29sIHsKKwlyZXR1cm4gcC5pc05pbAorfQorCitmdW5jIGluaXQoKSB7CisJSU5GSU5JVFkgPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogbWF0aC5JbmYoMSksIHNWYWx1ZTogIkluZmluaXR5IiwgaXNOaWw6IGZhbHNlfQorCU5FR0FUSVZFX0lORklOSVRZID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IG1hdGguSW5mKC0xKSwgc1ZhbHVlOiAiLUluZmluaXR5IiwgaXNOaWw6IGZhbHNlfQorCU5BTiA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiBtYXRoLk5hTigpLCBzVmFsdWU6ICJOYU4iLCBpc05pbDogZmFsc2V9CisJWkVSTyA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiAwLCBzVmFsdWU6ICIwIiwgaXNOaWw6IGZhbHNlfQorCU5VTUVSSUNfTlVMTCA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiAwLCBzVmFsdWU6ICIwIiwgaXNOaWw6IHRydWV9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3BvaW50ZXJpemUuZ28gYi9saWIvZ28vdGhyaWZ0L3BvaW50ZXJpemUuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2YjJjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcG9pbnRlcml6ZS5nbwpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoaXMgZmlsZSBpcyBob21lIHRvIGhlbHBlcnMgdGhhdCBjb252ZXJ0IGZyb20gdmFyaW91cyBiYXNlIHR5cGVzIHRvCisvLyByZXNwZWN0aXZlIHBvaW50ZXIgdHlwZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgR28gZG9lcyBub3QgcGVybWl0CisvLyByZWZlcmVuY2VzIHRvIGNvbnN0YW50cywgbm9yIGNhbiBhIHBvaW50ZXIgdHlwZSB0byBiYXNlIHR5cGUgYmUgYWxsb2NhdGVkCisvLyBhbmQgaW5pdGlhbGl6ZWQgaW4gYSBzaW5nbGUgZXhwcmVzc2lvbi4KKy8vCisvLyBFLmcuLCB0aGlzIGlzIG5vdCBhbGxvd2VkOgorLy8KKy8vICAgIHZhciBpcCAqaW50ID0gJjUKKy8vCisvLyBCdXQgdGhpcyAqaXMqIGFsbG93ZWQ6CisvLworLy8gICAgZnVuYyBJbnRQdHIoaSBpbnQpICppbnQgeyByZXR1cm4gJmkgfQorLy8gICAgdmFyIGlwICppbnQgPSBJbnRQdHIoNSkKKy8vCisvLyBTaW5jZSBwb2ludGVycyB0byBiYXNlIHR5cGVzIGFyZSBjb21tb25wbGFjZSBhcyBbb3B0aW9uYWxdIGZpZWxkcyBpbgorLy8gZXhwb3J0ZWQgdGhyaWZ0IHN0cnVjdHMsIHdlIGZhY3RvciBzdWNoIGhlbHBlcnMgaGVyZS4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworZnVuYyBGbG9hdDMyUHRyKHYgZmxvYXQzMikgKmZsb2F0MzIgeyByZXR1cm4gJnYgfQorZnVuYyBGbG9hdDY0UHRyKHYgZmxvYXQ2NCkgKmZsb2F0NjQgeyByZXR1cm4gJnYgfQorZnVuYyBJbnRQdHIodiBpbnQpICppbnQgICAgICAgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBJbnQzMlB0cih2IGludDMyKSAqaW50MzIgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBJbnQ2NFB0cih2IGludDY0KSAqaW50NjQgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBTdHJpbmdQdHIodiBzdHJpbmcpICpzdHJpbmcgICAgeyByZXR1cm4gJnYgfQorZnVuYyBVaW50MzJQdHIodiB1aW50MzIpICp1aW50MzIgICAgeyByZXR1cm4gJnYgfQorZnVuYyBVaW50NjRQdHIodiB1aW50NjQpICp1aW50NjQgICAgeyByZXR1cm4gJnYgfQorZnVuYyBCb29sUHRyKHYgYm9vbCkgKmJvb2wgICAgICAgICAgeyByZXR1cm4gJnYgfQorZnVuYyBCeXRlU2xpY2VQdHIodiBbXWJ5dGUpICpbXWJ5dGUgeyByZXR1cm4gJnYgfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiMTMyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKKy8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisvLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgordHlwZSBUUHJvY2Vzc29yIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCit9CisKK3R5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCisvLyBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KKy8vIGluc3RhbmNlLgordHlwZSBUUHJvY2Vzc29yRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb2Nlc3Nvcih0cmFucyBUVHJhbnNwb3J0KSBUUHJvY2Vzc29yCit9CisKK3R5cGUgdFByb2Nlc3NvckZhY3Rvcnkgc3RydWN0IHsKKwlwcm9jZXNzb3IgVFByb2Nlc3NvcgorfQorCitmdW5jIE5ld1RQcm9jZXNzb3JGYWN0b3J5KHAgVFByb2Nlc3NvcikgVFByb2Nlc3NvckZhY3RvcnkgeworCXJldHVybiAmdFByb2Nlc3NvckZhY3Rvcnl7cHJvY2Vzc29yOiBwfQorfQorCitmdW5jIChwICp0UHJvY2Vzc29yRmFjdG9yeSkgR2V0UHJvY2Vzc29yKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3IgeworCXJldHVybiBwLnByb2Nlc3NvcgorfQorCisvKioKKyAqIFRoZSBkZWZhdWx0IHByb2Nlc3NvciBmYWN0b3J5IGp1c3QgcmV0dXJucyBhIHNpbmdsZXRvbgorICogaW5zdGFuY2UuCisgKi8KK3R5cGUgVFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb2Nlc3NvckZ1bmN0aW9uKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3JGdW5jdGlvbgorfQorCit0eXBlIHRQcm9jZXNzb3JGdW5jdGlvbkZhY3Rvcnkgc3RydWN0IHsKKwlwcm9jZXNzb3IgVFByb2Nlc3NvckZ1bmN0aW9uCit9CisKK2Z1bmMgTmV3VFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeShwIFRQcm9jZXNzb3JGdW5jdGlvbikgVFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSB7CisJcmV0dXJuICZ0UHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5e3Byb2Nlc3NvcjogcH0KK30KKworZnVuYyAocCAqdFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeSkgR2V0UHJvY2Vzc29yRnVuY3Rpb24odHJhbnMgVFRyYW5zcG9ydCkgVFByb2Nlc3NvckZ1bmN0aW9uIHsKKwlyZXR1cm4gcC5wcm9jZXNzb3IKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWI3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImVycm9ycyIKKwkiZm10IgorKQorCitjb25zdCAoCisJVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMAorCVZFUlNJT05fMSAgICA9IDB4ODAwMTAwMDAKKykKKwordHlwZSBUUHJvdG9jb2wgaW50ZXJmYWNlIHsKKwlXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIGVycm9yCisJV3JpdGVNZXNzYWdlRW5kKCkgZXJyb3IKKwlXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBlcnJvcgorCVdyaXRlU3RydWN0RW5kKCkgZXJyb3IKKwlXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIGVycm9yCisJV3JpdGVGaWVsZEVuZCgpIGVycm9yCisJV3JpdGVGaWVsZFN0b3AoKSBlcnJvcgorCVdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IKKwlXcml0ZU1hcEVuZCgpIGVycm9yCisJV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvcgorCVdyaXRlTGlzdEVuZCgpIGVycm9yCisJV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yCisJV3JpdGVTZXRFbmQoKSBlcnJvcgorCVdyaXRlQm9vbCh2YWx1ZSBib29sKSBlcnJvcgorCVdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvcgorCVdyaXRlSTE2KHZhbHVlIGludDE2KSBlcnJvcgorCVdyaXRlSTMyKHZhbHVlIGludDMyKSBlcnJvcgorCVdyaXRlSTY0KHZhbHVlIGludDY0KSBlcnJvcgorCVdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIGVycm9yCisJV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBlcnJvcgorCVdyaXRlQmluYXJ5KHZhbHVlIFtdYnl0ZSkgZXJyb3IKKworCVJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyLCBlcnIgZXJyb3IpCisJUmVhZE1lc3NhZ2VFbmQoKSBlcnJvcgorCVJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKQorCVJlYWRTdHJ1Y3RFbmQoKSBlcnJvcgorCVJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgZXJyb3IpCisJUmVhZEZpZWxkRW5kKCkgZXJyb3IKKwlSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKQorCVJlYWRNYXBFbmQoKSBlcnJvcgorCVJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpCisJUmVhZExpc3RFbmQoKSBlcnJvcgorCVJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikKKwlSZWFkU2V0RW5kKCkgZXJyb3IKKwlSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgZXJyb3IpCisJUmVhZEJ5dGUoKSAodmFsdWUgaW50OCwgZXJyIGVycm9yKQorCVJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikKKwlSZWFkSTMyKCkgKHZhbHVlIGludDMyLCBlcnIgZXJyb3IpCisJUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIGVycm9yKQorCVJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKQorCVJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgZXJyb3IpCisJUmVhZEJpbmFyeSgpICh2YWx1ZSBbXWJ5dGUsIGVyciBlcnJvcikKKworCVNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKQorCUZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpCisKKwlUcmFuc3BvcnQoKSBUVHJhbnNwb3J0Cit9CisKKy8vIFRoZSBtYXhpbXVtIHJlY3Vyc2l2ZSBkZXB0aCB0aGUgc2tpcCgpIGZ1bmN0aW9uIHdpbGwgdHJhdmVyc2UKK2NvbnN0IERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIID0gNjQKKworLy8gU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KK2Z1bmMgU2tpcERlZmF1bHREZXB0aChwcm90IFRQcm90b2NvbCwgdHlwZUlkIFRUeXBlKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIFNraXAocHJvdCwgdHlwZUlkLCBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSCkKK30KKworLy8gU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KK2Z1bmMgU2tpcChzZWxmIFRQcm90b2NvbCwgZmllbGRUeXBlIFRUeXBlLCBtYXhEZXB0aCBpbnQpIChlcnIgZXJyb3IpIHsKKworCWlmIG1heERlcHRoIDw9IDAgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoREVQVEhfTElNSVQsIGVycm9ycy5OZXcoIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIikpCisJfQorCisJc3dpdGNoIGZpZWxkVHlwZSB7CisJY2FzZSBTVE9QOgorCQlyZXR1cm4KKwljYXNlIEJPT0w6CisJCV8sIGVyciA9IHNlbGYuUmVhZEJvb2woKQorCQlyZXR1cm4KKwljYXNlIEJZVEU6CisJCV8sIGVyciA9IHNlbGYuUmVhZEJ5dGUoKQorCQlyZXR1cm4KKwljYXNlIEkxNjoKKwkJXywgZXJyID0gc2VsZi5SZWFkSTE2KCkKKwkJcmV0dXJuCisJY2FzZSBJMzI6CisJCV8sIGVyciA9IHNlbGYuUmVhZEkzMigpCisJCXJldHVybgorCWNhc2UgSTY0OgorCQlfLCBlcnIgPSBzZWxmLlJlYWRJNjQoKQorCQlyZXR1cm4KKwljYXNlIERPVUJMRToKKwkJXywgZXJyID0gc2VsZi5SZWFkRG91YmxlKCkKKwkJcmV0dXJuCisJY2FzZSBTVFJJTkc6CisJCV8sIGVyciA9IHNlbGYuUmVhZFN0cmluZygpCisJCXJldHVybgorCWNhc2UgU1RSVUNUOgorCQlpZiBfLCBlcnIgPSBzZWxmLlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlmb3IgeworCQkJXywgdHlwZUlkLCBfLCBfIDo9IHNlbGYuUmVhZEZpZWxkQmVnaW4oKQorCQkJaWYgdHlwZUlkID09IFNUT1AgeworCQkJCWJyZWFrCisJCQl9CisJCQllcnIgOj0gU2tpcChzZWxmLCB0eXBlSWQsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCQlzZWxmLlJlYWRGaWVsZEVuZCgpCisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZFN0cnVjdEVuZCgpCisJY2FzZSBNQVA6CisJCWtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZXJyIDo9IHNlbGYuUmVhZE1hcEJlZ2luKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7CisJCQllcnIgOj0gU2tpcChzZWxmLCBrZXlUeXBlLCBtYXhEZXB0aC0xKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQkJc2VsZi5Ta2lwKHZhbHVlVHlwZSkKKwkJfQorCQlyZXR1cm4gc2VsZi5SZWFkTWFwRW5kKCkKKwljYXNlIFNFVDoKKwkJZWxlbVR5cGUsIHNpemUsIGVyciA6PSBzZWxmLlJlYWRTZXRCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQkJZXJyIDo9IFNraXAoc2VsZiwgZWxlbVR5cGUsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZFNldEVuZCgpCisJY2FzZSBMSVNUOgorCQllbGVtVHlwZSwgc2l6ZSwgZXJyIDo9IHNlbGYuUmVhZExpc3RCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQkJZXJyIDo9IFNraXAoc2VsZiwgZWxlbVR5cGUsIG1heERlcHRoLTEpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZExpc3RFbmQoKQorCWRlZmF1bHQ6CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVua25vd24gZGF0YSB0eXBlICVkIiwgZmllbGRUeXBlKSkpCisJfQorCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhYjc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZW5jb2RpbmcvYmFzZTY0IgorKQorCisvLyBUaHJpZnQgUHJvdG9jb2wgZXhjZXB0aW9uCit0eXBlIFRQcm90b2NvbEV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCVRFeGNlcHRpb24KKwlUeXBlSWQoKSBpbnQKK30KKworY29uc3QgKAorCVVOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OID0gMAorCUlOVkFMSURfREFUQSAgICAgICAgICAgICAgID0gMQorCU5FR0FUSVZFX1NJWkUgICAgICAgICAgICAgID0gMgorCVNJWkVfTElNSVQgICAgICAgICAgICAgICAgID0gMworCUJBRF9WRVJTSU9OICAgICAgICAgICAgICAgID0gNAorCU5PVF9JTVBMRU1FTlRFRCAgICAgICAgICAgID0gNQorCURFUFRIX0xJTUlUICAgICAgICAgICAgICAgID0gNgorKQorCit0eXBlIHRQcm90b2NvbEV4Y2VwdGlvbiBzdHJ1Y3QgeworCXR5cGVJZCAgaW50CisJbWVzc2FnZSBzdHJpbmcKK30KKworZnVuYyAocCAqdFByb3RvY29sRXhjZXB0aW9uKSBUeXBlSWQoKSBpbnQgeworCXJldHVybiBwLnR5cGVJZAorfQorCitmdW5jIChwICp0UHJvdG9jb2xFeGNlcHRpb24pIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHAubWVzc2FnZQorfQorCitmdW5jIChwICp0UHJvdG9jb2xFeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5tZXNzYWdlCit9CisKK2Z1bmMgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVyciBlcnJvcikgVFByb3RvY29sRXhjZXB0aW9uIHsKKwlpZiBlcnIgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlpZiBlLCBvayA6PSBlcnIuKFRQcm90b2NvbEV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgb2sgOj0gZXJyLihiYXNlNjQuQ29ycnVwdElucHV0RXJyb3IpOyBvayB7CisJCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue0lOVkFMSURfREFUQSwgZXJyLkVycm9yKCl9CisJfQorCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue1VOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OLCBlcnIuRXJyb3IoKX0KK30KKworZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShlcnJUeXBlIGludCwgZXJyIGVycm9yKSBUUHJvdG9jb2xFeGNlcHRpb24geworCWlmIGVyciA9PSBuaWwgeworCQlyZXR1cm4gbmlsCisJfQorCXJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue2VyclR5cGUsIGVyci5FcnJvcigpfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF9mYWN0b3J5LmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF9mYWN0b3J5LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGY3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2ZhY3RvcnkuZ28KQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBGYWN0b3J5IGludGVyZmFjZSBmb3IgY29uc3RydWN0aW5nIHByb3RvY29sIGluc3RhbmNlcy4KK3R5cGUgVFByb3RvY29sRmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDA1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28KQEAgLTAsMCArMSw1MTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImNvbnRleHQiCisJImlvL2lvdXRpbCIKKwkibWF0aCIKKwkibmV0IgorCSJuZXQvaHR0cCIKKwkidGVzdGluZyIKKykKKworY29uc3QgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRSA9IDE1NQorCit2YXIgKAorCXByb3RvY29sX2JkYXRhIFtdYnl0ZSAvLyB0ZXN0IGRhdGEgZm9yIHdyaXRpbmc7IHNhbWUgYXMgZGF0YQorCUJPT0xfVkFMVUVTICAgIFtdYm9vbAorCUJZVEVfVkFMVUVTICAgIFtdaW50OAorCUlOVDE2X1ZBTFVFUyAgIFtdaW50MTYKKwlJTlQzMl9WQUxVRVMgICBbXWludDMyCisJSU5UNjRfVkFMVUVTICAgW11pbnQ2NAorCURPVUJMRV9WQUxVRVMgIFtdZmxvYXQ2NAorCVNUUklOR19WQUxVRVMgIFtdc3RyaW5nCispCisKK2Z1bmMgaW5pdCgpIHsKKwlwcm90b2NvbF9iZGF0YSA9IG1ha2UoW11ieXRlLCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFKQorCWZvciBpIDo9IDA7IGkgPCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFOyBpKysgeworCQlwcm90b2NvbF9iZGF0YVtpXSA9IGJ5dGUoKGkgKyAnYScpICUgMjU1KQorCX0KKwlCT09MX1ZBTFVFUyA9IFtdYm9vbHtmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlfQorCUJZVEVfVkFMVUVTID0gW11pbnQ4ezExNywgMCwgMSwgMzIsIDEyNywgLTEyOCwgLTF9CisJSU5UMTZfVkFMVUVTID0gW11pbnQxNns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAtMzI3Njh9CisJSU5UMzJfVkFMVUVTID0gW11pbnQzMns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzUzNX0KKwlJTlQ2NF9WQUxVRVMgPSBbXWludDY0ezQ1OSwgMCwgMSwgLTEsIC0xMjgsIDEyNywgMzI3NjcsIDIxNDc0ODM2NDcsIC0yMTQ3NDgzNTM1LCAzNDM1OTczODQ4MSwgLTM1MTg0MzcyMDg4NzE5LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgOTIyMzM3MjAzNjg1NDc3NTgwN30KKwlET1VCTEVfVkFMVUVTID0gW11mbG9hdDY0ezQ1OS4zLCAwLjAsIC0xLjAsIDEuMCwgMC41LCAwLjMzMzMsIDMuMTQxNTksIDEuNTM3ZS0zOCwgMS42NzNlMjUsIDYuMDIyMTQxNzllMjMsIC02LjAyMjE0MTc5ZTIzLCBJTkZJTklUWS5GbG9hdDY0KCksIE5FR0FUSVZFX0lORklOSVRZLkZsb2F0NjQoKSwgTkFOLkZsb2F0NjQoKX0KKwlTVFJJTkdfVkFMVUVTID0gW11zdHJpbmd7IiIsICJhIiwgInN0W3VmXWYiLCAic3QsdTpmZiB3aXRoIHNwYWNlcyIsICJzdHVmZlx0d2l0aFxuZXNjYXBlXFxjaGFyYWN0ZXJzJy4uLlwibG90c3tvZn1mdW48L3htbD4ifQorfQorCit0eXBlIEhUVFBFY2hvU2VydmVyIHN0cnVjdHt9Cit0eXBlIEhUVFBIZWFkZXJFY2hvU2VydmVyIHN0cnVjdHt9CisKK2Z1bmMgKHAgKkhUVFBFY2hvU2VydmVyKSBTZXJ2ZUhUVFAodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByZXEgKmh0dHAuUmVxdWVzdCkgeworCWJ1ZiwgZXJyIDo9IGlvdXRpbC5SZWFkQWxsKHJlcS5Cb2R5KQorCWlmIGVyciAhPSBuaWwgeworCQl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzQmFkUmVxdWVzdCkKKwkJdy5Xcml0ZShidWYpCisJfSBlbHNlIHsKKwkJdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c09LKQorCQl3LldyaXRlKGJ1ZikKKwl9Cit9CisKK2Z1bmMgKHAgKkhUVFBIZWFkZXJFY2hvU2VydmVyKSBTZXJ2ZUhUVFAodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByZXEgKmh0dHAuUmVxdWVzdCkgeworCWJ1ZiwgZXJyIDo9IGlvdXRpbC5SZWFkQWxsKHJlcS5Cb2R5KQorCWlmIGVyciAhPSBuaWwgeworCQl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzQmFkUmVxdWVzdCkKKwkJdy5Xcml0ZShidWYpCisJfSBlbHNlIHsKKwkJdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c09LKQorCQl3LldyaXRlKGJ1ZikKKwl9Cit9CisKK2Z1bmMgSHR0cENsaWVudFNldHVwRm9yVGVzdCh0ICp0ZXN0aW5nLlQpIChuZXQuTGlzdGVuZXIsIG5ldC5BZGRyKSB7CisJYWRkciwgZXJyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KDQwMDAwKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGZpbmQgYXZhaWxhYmxlIHRjcCBwb3J0IGFkZHI6ICVzIiwgZXJyKQorCQlyZXR1cm4gbmlsLCBhZGRyCisJfQorCWwsIGVyciA6PSBuZXQuTGlzdGVuKGFkZHIuTmV0d29yaygpLCBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHNldHVwIHRjcCBsaXN0ZW5lciBvbiAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJCXJldHVybiBsLCBhZGRyCisJfQorCWdvIGh0dHAuU2VydmUobCwgJkhUVFBFY2hvU2VydmVye30pCisJcmV0dXJuIGwsIGFkZHIKK30KKworZnVuYyBIdHRwQ2xpZW50U2V0dXBGb3JIZWFkZXJUZXN0KHQgKnRlc3RpbmcuVCkgKG5ldC5MaXN0ZW5lciwgbmV0LkFkZHIpIHsKKwlhZGRyLCBlcnIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoNDAwMDApCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZmluZCBhdmFpbGFibGUgdGNwIHBvcnQgYWRkcjogJXMiLCBlcnIpCisJCXJldHVybiBuaWwsIGFkZHIKKwl9CisJbCwgZXJyIDo9IG5ldC5MaXN0ZW4oYWRkci5OZXR3b3JrKCksIGFkZHIuU3RyaW5nKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gc2V0dXAgdGNwIGxpc3RlbmVyIG9uICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKKwkJcmV0dXJuIGwsIGFkZHIKKwl9CisJZ28gaHR0cC5TZXJ2ZShsLCAmSFRUUEhlYWRlckVjaG9TZXJ2ZXJ7fSkKKwlyZXR1cm4gbCwgYWRkcgorfQorCitmdW5jIFJlYWRXcml0ZVByb3RvY29sVGVzdCh0ICp0ZXN0aW5nLlQsIHByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSB7CisJYnVmIDo9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpCisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJZGVmZXIgbC5DbG9zZSgpCisJdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnRGYWN0b3J5eworCQlOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSwKKwkJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCisJCU5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoMCwgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeSg2LCBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KDksIE5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSksCisJCU5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSksCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMTYodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCisJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKKwkJUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKQorCQlSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUJvb2wodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoQk9PTCkKKwl0aGVsZW4gOj0gbGVuKEJPT0xfVkFMVUVTKQorCWVyciA6PSBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCB0aGV0eXBlKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCWVyciA9IHAuV3JpdGVCb29sKHYpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciB3cml0aW5nIGJvb2wgaW4gbGlzdCBhdCBpbmRleCAldjogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKKwl9CisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBsaXN0OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEJvb2woKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3IgcmVhZGluZyBib29sIGF0IGluZGV4ICV2OiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogaW5kZXggJXYgJXYgJXYgJXYgIT0gJXYiLCAiUmVhZFdyaXRlQm9vbCIsIGssIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwllcnIgPSBwLlJlYWRMaXN0RW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUJ5dGUodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoQllURSkKKwl0aGVsZW4gOj0gbGVuKEJZVEVfVkFMVUVTKQorCWVyciA6PSBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCB0aGV0eXBlKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCWVyciA9IHAuV3JpdGVCeXRlKHYpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGJ5dGUgaW4gbGlzdCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwl9CisJZXJyID0gcC5Xcml0ZUxpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKKwl9CisJZXJyID0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciBmbHVzaGluZyBsaXN0IG9mIGJ5dGVzOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCisJfQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGJ5dGUgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWVyciA9IHAuUmVhZExpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlSTE2KHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKEkxNikKKwl0aGVsZW4gOj0gbGVuKElOVDE2X1ZBTFVFUykKKwlwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlmb3IgXywgdiA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQlwLldyaXRlSTE2KHYpCisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCBlcnIsIElOVDE2X1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCisJCX0KKwkJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJdmFsdWUsIGVyciA6PSBwLlJlYWRJMTYoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBpbnQxNiBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJWQgIT0gJWQiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWVyciA9IHAuUmVhZExpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVJMzIodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoSTMyKQorCXRoZWxlbiA6PSBsZW4oSU5UMzJfVkFMVUVTKQorCXAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWZvciBfLCB2IDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCXAuV3JpdGVJMzIodikKKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVyciwgSU5UMzJfVkFMVUVTKQorCX0KKwlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKKwlpZiAhb2sgeworCQlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEkzMigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGludDMyIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUk2NCh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShJNjQpCisJdGhlbGVuIDo9IGxlbihJTlQ2NF9WQUxVRVMpCisJcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJZm9yIF8sIHYgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJcC5Xcml0ZUk2NCh2KQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyLCBJTlQ2NF9WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkSTY0KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgaW50NjQgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxICE9ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlRG91YmxlKHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKERPVUJMRSkKKwl0aGVsZW4gOj0gbGVuKERPVUJMRV9WQUxVRVMpCisJcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJZm9yIF8sIHYgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXAuV3JpdGVEb3VibGUodikKKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgbGlzdDogJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgRE9VQkxFX1ZBTFVFUykKKwl9CisJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwl9CisJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkRG91YmxlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgZG91YmxlIGF0IGluZGV4ICVkOiAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIG1hdGguSXNOYU4odikgeworCQkJaWYgIW1hdGguSXNOYU4odmFsdWUpIHsKKwkJCQl0LkVycm9yZigiJXM6ICVUICVUIG1hdGguSXNOYU4oJXYpICE9IG1hdGguSXNOYU4oJXYpIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCX0KKwkJfSBlbHNlIGlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiAhPSAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJZXJyID0gcC5SZWFkTGlzdEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZVN0cmluZyh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShTVFJJTkcpCisJdGhlbGVuIDo9IGxlbihTVFJJTkdfVkFMVUVTKQorCXAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWZvciBfLCB2IDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQlwLldyaXRlU3RyaW5nKHYpCisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCBlcnIsIFNUUklOR19WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZFN0cmluZygpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIHN0cmluZyBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXYiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVCaW5hcnkodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXYgOj0gcHJvdG9jb2xfYmRhdGEKKwlwLldyaXRlQmluYXJ5KHYpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl2YWx1ZSwgZXJyIDo9IHAuUmVhZEJpbmFyeSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgYmluYXJ5OiAlcyIsICJSZWFkV3JpdGVCaW5hcnkiLCBwLCB0cmFucywgZXJyLkVycm9yKCkpCisJfQorCWlmIGxlbih2KSAhPSBsZW4odmFsdWUpIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4odikgIT0gbGVuKHZhbHVlKS4uLiAlZCAhPSAlZCIsICJSZWFkV3JpdGVCaW5hcnkiLCBwLCB0cmFucywgbGVuKHYpLCBsZW4odmFsdWUpKQorCX0gZWxzZSB7CisJCWZvciBpIDo9IDA7IGkgPCBsZW4odik7IGkrKyB7CisJCQlpZiB2W2ldICE9IHZhbHVlW2ldIHsKKwkJCQl0LkVycm9yZigiJXM6ICVUICVUICVzICE9ICVzIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjViZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICJpbyIKKwordHlwZSBSaWNoVHJhbnNwb3J0IHN0cnVjdCB7CisJVFRyYW5zcG9ydAorfQorCisvLyBXcmFwcyBUcmFuc3BvcnQgdG8gcHJvdmlkZSBUUmljaFRyYW5zcG9ydCBpbnRlcmZhY2UKK2Z1bmMgTmV3VFJpY2hUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKlJpY2hUcmFuc3BvcnQgeworCXJldHVybiAmUmljaFRyYW5zcG9ydHt0cmFuc30KK30KKworZnVuYyAociAqUmljaFRyYW5zcG9ydCkgUmVhZEJ5dGUoKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcmVhZEJ5dGUoci5UVHJhbnNwb3J0KQorfQorCitmdW5jIChyICpSaWNoVHJhbnNwb3J0KSBXcml0ZUJ5dGUoYyBieXRlKSBlcnJvciB7CisJcmV0dXJuIHdyaXRlQnl0ZShyLlRUcmFuc3BvcnQsIGMpCit9CisKK2Z1bmMgKHIgKlJpY2hUcmFuc3BvcnQpIFdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiByLldyaXRlKFtdYnl0ZShzKSkKK30KKworZnVuYyAociAqUmljaFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiByLlRUcmFuc3BvcnQuUmVtYWluaW5nQnl0ZXMoKQorfQorCitmdW5jIHJlYWRCeXRlKHIgaW8uUmVhZGVyKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKKwl2IDo9IFsxXWJ5dGV7MH0KKwluLCBlcnIgOj0gci5SZWFkKHZbMDoxXSkKKwlpZiBuID4gMCAmJiAoZXJyID09IG5pbCB8fCBlcnIgPT0gaW8uRU9GKSB7CisJCXJldHVybiB2WzBdLCBuaWwKKwl9CisJaWYgbiA+IDAgJiYgZXJyICE9IG5pbCB7CisJCXJldHVybiB2WzBdLCBlcnIKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBlcnIKKwl9CisJcmV0dXJuIHZbMF0sIG5pbAorfQorCitmdW5jIHdyaXRlQnl0ZSh3IGlvLldyaXRlciwgYyBieXRlKSBlcnJvciB7CisJdiA6PSBbMV1ieXRle2N9CisJXywgZXJyIDo9IHcuV3JpdGUodlswOjFdKQorCXJldHVybiBlcnIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMzZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImVycm9ycyIKKwkiaW8iCisJInJlZmxlY3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdEVuc3VyZVRyYW5zcG9ydHNBcmVSaWNoKHQgKnRlc3RpbmcuVCkgeworCWJ1ZiA6PSBieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDEwMjQpKQorCisJdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnRGYWN0b3J5eworCQlOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSwKKwkJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCisJCU5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeSgiaHR0cDovLzEyNy4wLjAuMSIpLAorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJXywgb2sgOj0gdHJhbnMuKFRSaWNoVHJhbnNwb3J0KQorCQlpZiAhb2sgeworCQkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlcyBkb2VzIG5vdCBpbXBsZW1lbnQgVFJpY2hUcmFuc3BvcnQgaW50ZXJmYWNlIiwgcmVmbGVjdC5WYWx1ZU9mKHRyYW5zKSkKKwkJfQorCX0KK30KKworLy8gVGVzdFJlYWRCeXRlIHRlc3RzIHdoZXRoZXIgcmVhZEJ5dGUgaGFuZGxlcyBlcnJvciBjYXNlcyBjb3JyZWN0bHkuCitmdW5jIFRlc3RSZWFkQnl0ZSh0ICp0ZXN0aW5nLlQpIHsKKwlmb3IgaSwgdGVzdCA6PSByYW5nZSByZWFkQnl0ZVRlc3RzIHsKKwkJdiwgZXJyIDo9IHJlYWRCeXRlKHRlc3QucikKKwkJaWYgdiAhPSB0ZXN0LnYgeworCQkJdC5GYXRhbGYoIlRlc3RSZWFkQnl0ZSAlZDogdmFsdWUgZGlmZmVycy4gRXhwZWN0ZWQgJWQsIGdvdCAlZCIsIGksIHRlc3QudiwgdGVzdC5yLnYpCisJCX0KKwkJaWYgZXJyICE9IHRlc3QuZXJyIHsKKwkJCXQuRmF0YWxmKCJUZXN0UmVhZEJ5dGUgJWQ6IGVycm9yIGRpZmZlcnMuIEV4cGVjdGVkICVzLCBnb3QgJXMiLCBpLCB0ZXN0LmVyciwgdGVzdC5yLmVycikKKwkJfQorCX0KK30KKwordmFyIHNvbWVFcnJvciA9IGVycm9ycy5OZXcoIlNvbWUgZXJyb3IiKQordmFyIHJlYWRCeXRlVGVzdHMgPSBbXXN0cnVjdCB7CisJciAgICptb2NrUmVhZGVyCisJdiAgIGJ5dGUKKwllcnIgZXJyb3IKK317CisJeyZtb2NrUmVhZGVyezAsIDU1LCBpby5FT0Z9LCAwLCBpby5FT0Z9LCAgICAgICAgLy8gcmVhZGVyIHNlbmRzIEVPRiB3L28gZGF0YQorCXsmbW9ja1JlYWRlcnswLCA1NSwgc29tZUVycm9yfSwgMCwgc29tZUVycm9yfSwgIC8vIHJlYWRlciBzZW5kcyBzb21lIG90aGVyIGVycm9yCisJeyZtb2NrUmVhZGVyezEsIDU1LCBuaWx9LCA1NSwgbmlsfSwgICAgICAgICAgICAgLy8gcmVhZGVyIHNlbmRzIGRhdGEgdy9vIGVycm9yCisJeyZtb2NrUmVhZGVyezEsIDU1LCBpby5FT0Z9LCA1NSwgbmlsfSwgICAgICAgICAgLy8gcmVhZGVyIHNlbmRzIGRhdGEgd2l0aCBFT0YKKwl7Jm1vY2tSZWFkZXJ7MSwgNTUsIHNvbWVFcnJvcn0sIDU1LCBzb21lRXJyb3J9LCAvLyByZWFkZXIgc2VuZHMgZGF0YSB3aXRoc29tZSBlcnJvcgorfQorCit0eXBlIG1vY2tSZWFkZXIgc3RydWN0IHsKKwluICAgaW50CisJdiAgIGJ5dGUKKwllcnIgZXJyb3IKK30KKworZnVuYyAociAqbW9ja1JlYWRlcikgUmVhZChwIFtdYnl0ZSkgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwlpZiByLm4gPiAwIHsKKwkJcFswXSA9IHIudgorCX0KKwlyZXR1cm4gci5uLCByLmVycgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjRkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28KQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorKQorCit0eXBlIFRTZXJpYWxpemVyIHN0cnVjdCB7CisJVHJhbnNwb3J0ICpUTWVtb3J5QnVmZmVyCisJUHJvdG9jb2wgIFRQcm90b2NvbAorfQorCit0eXBlIFRTdHJ1Y3QgaW50ZXJmYWNlIHsKKwlXcml0ZShwIFRQcm90b2NvbCkgZXJyb3IKKwlSZWFkKHAgVFByb3RvY29sKSBlcnJvcgorfQorCitmdW5jIE5ld1RTZXJpYWxpemVyKCkgKlRTZXJpYWxpemVyIHsKKwl0cmFuc3BvcnQgOj0gTmV3VE1lbW9yeUJ1ZmZlckxlbigxMDI0KQorCXByb3RvY29sIDo9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisJcmV0dXJuICZUU2VyaWFsaXplcnsKKwkJdHJhbnNwb3J0LAorCQlwcm90b2NvbH0KK30KKworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlU3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAocyBzdHJpbmcsIGVyciBlcnJvcikgeworCXQuVHJhbnNwb3J0LlJlc2V0KCkKKworCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJcmV0dXJuIHQuVHJhbnNwb3J0LlN0cmluZygpLCBuaWwKK30KKworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAoYiBbXWJ5dGUsIGVyciBlcnJvcikgeworCXQuVHJhbnNwb3J0LlJlc2V0KCkKKworCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWlmIGVyciA9IHQuVHJhbnNwb3J0LkZsdXNoKGN0eCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwliID0gYXBwZW5kKGIsIHQuVHJhbnNwb3J0LkJ5dGVzKCkuLi4pCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjI3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImZtdCIKKwkidGVzdGluZyIKKykKKwordHlwZSBQcm90b2NvbEZhY3RvcnkgaW50ZXJmYWNlIHsKKwlHZXRQcm90b2NvbCh0IFRUcmFuc3BvcnQpIFRQcm90b2NvbAorfQorCitmdW5jIGNvbXBhcmVTdHJ1Y3RzKG0sIG0xIE15VGVzdFN0cnVjdCkgKGJvb2wsIGVycm9yKSB7CisJc3dpdGNoIHsKKwljYXNlIG0uT24gIT0gbTEuT246CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQm9vbGVhbiBub3QgZXF1YWwiKQorCWNhc2UgbS5CICE9IG0xLkI6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQnl0ZSBub3QgZXF1YWwiKQorCWNhc2UgbS5JbnQxNiAhPSBtMS5JbnQxNjoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJJbnQxNiBub3QgZXF1YWwiKQorCWNhc2UgbS5JbnQzMiAhPSBtMS5JbnQzMjoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJJbnQzMiBub3QgZXF1YWwiKQorCWNhc2UgbS5JbnQ2NCAhPSBtMS5JbnQ2NDoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJJbnQ2NCBub3QgZXF1YWwiKQorCWNhc2UgbS5EICE9IG0xLkQ6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiRG91YmxlIG5vdCBlcXVhbCIpCisJY2FzZSBtLlN0ICE9IG0xLlN0OgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIlN0cmluZyBub3QgZXF1YWwiKQorCisJY2FzZSBsZW4obS5CaW4pICE9IGxlbihtMS5CaW4pOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkJpbmFyeSBzaXplIG5vdCBlcXVhbCIpCisJY2FzZSBsZW4obS5CaW4pID09IGxlbihtMS5CaW4pOgorCQlmb3IgaSA6PSByYW5nZSBtLkJpbiB7CisJCQlpZiBtLkJpbltpXSAhPSBtMS5CaW5baV0geworCQkJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiQmluYXJ5IG5vdCBlcXVhbCIpCisJCQl9CisJCX0KKwljYXNlIGxlbihtLlN0cmluZ01hcCkgIT0gbGVuKG0xLlN0cmluZ01hcCk6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiU3RyaW5nTWFwIHNpemUgbm90IGVxdWFsIikKKwljYXNlIGxlbihtLlN0cmluZ0xpc3QpICE9IGxlbihtMS5TdHJpbmdMaXN0KToKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJTdHJpbmdMaXN0IHNpemUgbm90IGVxdWFsIikKKwljYXNlIGxlbihtLlN0cmluZ1NldCkgIT0gbGVuKG0xLlN0cmluZ1NldCk6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiU3RyaW5nU2V0IHNpemUgbm90IGVxdWFsIikKKworCWNhc2UgbS5FICE9IG0xLkU6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiTXlUZXN0RW51bSBub3QgZXF1YWwiKQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIHRydWUsIG5pbAorCisJfQorCXJldHVybiB0cnVlLCBuaWwKK30KKworZnVuYyBQcm90b2NvbFRlc3QxKHRlc3QgKnRlc3RpbmcuVCwgcGYgUHJvdG9jb2xGYWN0b3J5KSAoYm9vbCwgZXJyb3IpIHsKKwl0IDo9IE5ld1RTZXJpYWxpemVyKCkKKwl0LlByb3RvY29sID0gcGYuR2V0UHJvdG9jb2wodC5UcmFuc3BvcnQpCisJdmFyIG0gPSBNeVRlc3RTdHJ1Y3R7fQorCW0uT24gPSB0cnVlCisJbS5CID0gaW50OCgwKQorCW0uSW50MTYgPSAxCisJbS5JbnQzMiA9IDIKKwltLkludDY0ID0gMworCW0uRCA9IDQuMQorCW0uU3QgPSAiVGVzdCIKKwltLkJpbiA9IG1ha2UoW11ieXRlLCAxMCkKKwltLlN0cmluZ01hcCA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcsIDUpCisJbS5TdHJpbmdMaXN0ID0gbWFrZShbXXN0cmluZywgNSkKKwltLlN0cmluZ1NldCA9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSwgNSkKKwltLkUgPSAyCisKKwlzLCBlcnIgOj0gdC5Xcml0ZVN0cmluZyhjb250ZXh0LkJhY2tncm91bmQoKSwgJm0pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIFNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKKwl9CisKKwl0MSA6PSBOZXdURGVzZXJpYWxpemVyKCkKKwl0MS5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQxLlRyYW5zcG9ydCkKKwl2YXIgbTEgPSBNeVRlc3RTdHJ1Y3R7fQorCWlmIGVyciA9IHQxLlJlYWRTdHJpbmcoJm0xLCBzKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIERlc2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQorCisJfQorCisJcmV0dXJuIGNvbXBhcmVTdHJ1Y3RzKG0sIG0xKQorCit9CisKK2Z1bmMgUHJvdG9jb2xUZXN0Mih0ZXN0ICp0ZXN0aW5nLlQsIHBmIFByb3RvY29sRmFjdG9yeSkgKGJvb2wsIGVycm9yKSB7CisJdCA6PSBOZXdUU2VyaWFsaXplcigpCisJdC5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQuVHJhbnNwb3J0KQorCXZhciBtID0gTXlUZXN0U3RydWN0e30KKwltLk9uID0gZmFsc2UKKwltLkIgPSBpbnQ4KDApCisJbS5JbnQxNiA9IDEKKwltLkludDMyID0gMgorCW0uSW50NjQgPSAzCisJbS5EID0gNC4xCisJbS5TdCA9ICJUZXN0IgorCW0uQmluID0gbWFrZShbXWJ5dGUsIDEwKQorCW0uU3RyaW5nTWFwID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZywgNSkKKwltLlN0cmluZ0xpc3QgPSBtYWtlKFtdc3RyaW5nLCA1KQorCW0uU3RyaW5nU2V0ID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCA1KQorCW0uRSA9IDIKKworCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKGNvbnRleHQuQmFja2dyb3VuZCgpLCAmbSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gU2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQorCisJfQorCisJdDEgOj0gTmV3VERlc2VyaWFsaXplcigpCisJdDEuUHJvdG9jb2wgPSBwZi5HZXRQcm90b2NvbCh0MS5UcmFuc3BvcnQpCisJdmFyIG0xID0gTXlUZXN0U3RydWN0e30KKwlpZiBlcnIgPSB0MS5SZWFkU3RyaW5nKCZtMSwgcyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVuYWJsZSB0byBEZXNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKKworCX0KKworCXJldHVybiBjb21wYXJlU3RydWN0cyhtLCBtMSkKKworfQorCitmdW5jIFRlc3RTZXJpYWxpemVyKHQgKnRlc3RpbmcuVCkgeworCisJdmFyIHByb3RvY29sX2ZhY3RvcmllcyBtYXBbc3RyaW5nXVByb3RvY29sRmFjdG9yeQorCXByb3RvY29sX2ZhY3RvcmllcyA9IG1ha2UobWFwW3N0cmluZ11Qcm90b2NvbEZhY3RvcnkpCisJcHJvdG9jb2xfZmFjdG9yaWVzWyJCaW5hcnkiXSA9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwlwcm90b2NvbF9mYWN0b3JpZXNbIkNvbXBhY3QiXSA9IE5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKwkvL3Byb3RvY29sX2ZhY3Rvcmllc1siU2ltcGxlSlNPTiJdID0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSAtIHdyaXRlIG9ubHksIGNhbid0IGJlIHJlYWQgYmFjayBieSBkZXNpZ24KKwlwcm90b2NvbF9mYWN0b3JpZXNbIkpTT04iXSA9IE5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkKKworCXZhciB0ZXN0cyBtYXBbc3RyaW5nXWZ1bmMoKnRlc3RpbmcuVCwgUHJvdG9jb2xGYWN0b3J5KSAoYm9vbCwgZXJyb3IpCisJdGVzdHMgPSBtYWtlKG1hcFtzdHJpbmddZnVuYygqdGVzdGluZy5ULCBQcm90b2NvbEZhY3RvcnkpIChib29sLCBlcnJvcikpCisJdGVzdHNbIlRlc3QgMSJdID0gUHJvdG9jb2xUZXN0MQorCXRlc3RzWyJUZXN0IDIiXSA9IFByb3RvY29sVGVzdDIKKwkvL3Rlc3RzWyJUZXN0IDMiXSA9IFByb3RvY29sVGVzdDMgLy8gRXhhbXBsZSBvZiBob3cgdG8gYWRkIGFkZGl0aW9uYWwgdGVzdHMKKworCWZvciBuYW1lLCBwZiA6PSByYW5nZSBwcm90b2NvbF9mYWN0b3JpZXMgeworCisJCWZvciB0ZXN0LCBmIDo9IHJhbmdlIHRlc3RzIHsKKworCQkJaWYgcywgZXJyIDo9IGYodCwgcGYpOyAhcyB8fCBlcnIgIT0gbmlsIHsKKwkJCQl0LkVycm9yZigiJXMgRmFpbGVkIGZvciAlcyBwcm90b2NvbFxuXHQgJXMiLCB0ZXN0LCBuYW1lLCBlcnIpCisJCQl9CisKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQ3MmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28KQEAgLTAsMCArMSw2MzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKEZJWE1FKQorLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworCisvKiBUSEUgRk9MTE9XSU5HIFRIUklGVCBGSUxFIFdBUyBVU0VEIFRPIENSRUFURSBUSElTCisKK2VudW0gTXlUZXN0RW51bSB7CisJRklSU1QgPSAxLAorCVNFQ09ORCA9IDIsCisJVEhJUkQgPSAzLAorCUZPVVJUSCA9IDQsCit9CisKK3N0cnVjdCBNeVRlc3RTdHJ1Y3QgeworCTE6IGJvb2wgb24sCisJMjogYnl0ZSBiLAorCTM6IGkxNiBpbnQxNiwKKwk0OiBpMzIgaW50MzIsCisJNTogaTY0IGludDY0LAorCTY6IGRvdWJsZSBkLAorCTc6IHN0cmluZyBzdCwKKwk4OiBiaW5hcnkgYmluLAorCTk6IG1hcDxzdHJpbmcsIHN0cmluZz4gc3RyaW5nTWFwLAorCTEwOiBsaXN0PHN0cmluZz4gc3RyaW5nTGlzdCwKKwkxMTogc2V0PHN0cmluZz4gc3RyaW5nU2V0LAorCTEyOiBNeVRlc3RFbnVtIGUsCit9CisqLworCitpbXBvcnQgKAorCSJmbXQiCispCisKKy8vIChuZWVkZWQgdG8gZW5zdXJlIHNhZmV0eSBiZWNhdXNlIG9mIG5haXZlIGltcG9ydCBsaXN0IGNvbnN0cnVjdGlvbi4pCit2YXIgXyA9IFpFUk8KK3ZhciBfID0gZm10LlByaW50ZgorCit2YXIgR29VbnVzZWRQcm90ZWN0aW9uX18gaW50CisKK3R5cGUgTXlUZXN0RW51bSBpbnQ2NAorCitjb25zdCAoCisJTXlUZXN0RW51bV9GSVJTVCAgTXlUZXN0RW51bSA9IDEKKwlNeVRlc3RFbnVtX1NFQ09ORCBNeVRlc3RFbnVtID0gMgorCU15VGVzdEVudW1fVEhJUkQgIE15VGVzdEVudW0gPSAzCisJTXlUZXN0RW51bV9GT1VSVEggTXlUZXN0RW51bSA9IDQKKykKKworZnVuYyAocCBNeVRlc3RFbnVtKSBTdHJpbmcoKSBzdHJpbmcgeworCXN3aXRjaCBwIHsKKwljYXNlIE15VGVzdEVudW1fRklSU1Q6CisJCXJldHVybiAiRklSU1QiCisJY2FzZSBNeVRlc3RFbnVtX1NFQ09ORDoKKwkJcmV0dXJuICJTRUNPTkQiCisJY2FzZSBNeVRlc3RFbnVtX1RISVJEOgorCQlyZXR1cm4gIlRISVJEIgorCWNhc2UgTXlUZXN0RW51bV9GT1VSVEg6CisJCXJldHVybiAiRk9VUlRIIgorCX0KKwlyZXR1cm4gIjxVTlNFVD4iCit9CisKK2Z1bmMgTXlUZXN0RW51bUZyb21TdHJpbmcocyBzdHJpbmcpIChNeVRlc3RFbnVtLCBlcnJvcikgeworCXN3aXRjaCBzIHsKKwljYXNlICJGSVJTVCI6CisJCXJldHVybiBNeVRlc3RFbnVtX0ZJUlNULCBuaWwKKwljYXNlICJTRUNPTkQiOgorCQlyZXR1cm4gTXlUZXN0RW51bV9TRUNPTkQsIG5pbAorCWNhc2UgIlRISVJEIjoKKwkJcmV0dXJuIE15VGVzdEVudW1fVEhJUkQsIG5pbAorCWNhc2UgIkZPVVJUSCI6CisJCXJldHVybiBNeVRlc3RFbnVtX0ZPVVJUSCwgbmlsCisJfQorCXJldHVybiBNeVRlc3RFbnVtKDApLCBmbXQuRXJyb3JmKCJub3QgYSB2YWxpZCBNeVRlc3RFbnVtIHN0cmluZyIpCit9CisKK2Z1bmMgTXlUZXN0RW51bVB0cih2IE15VGVzdEVudW0pICpNeVRlc3RFbnVtIHsgcmV0dXJuICZ2IH0KKwordHlwZSBNeVRlc3RTdHJ1Y3Qgc3RydWN0IHsKKwlPbiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgYHRocmlmdDoib24sMSIganNvbjoib24iYAorCUIgICAgICAgICAgaW50OCAgICAgICAgICAgICAgICBgdGhyaWZ0OiJiLDIiIGpzb246ImIiYAorCUludDE2ICAgICAgaW50MTYgICAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQxNiwzIiBqc29uOiJpbnQxNiJgCisJSW50MzIgICAgICBpbnQzMiAgICAgICAgICAgICAgIGB0aHJpZnQ6ImludDMyLDQiIGpzb246ImludDMyImAKKwlJbnQ2NCAgICAgIGludDY0ICAgICAgICAgICAgICAgYHRocmlmdDoiaW50NjQsNSIganNvbjoiaW50NjQiYAorCUQgICAgICAgICAgZmxvYXQ2NCAgICAgICAgICAgICBgdGhyaWZ0OiJkLDYiIGpzb246ImQiYAorCVN0ICAgICAgICAgc3RyaW5nICAgICAgICAgICAgICBgdGhyaWZ0OiJzdCw3IiBqc29uOiJzdCJgCisJQmluICAgICAgICBbXWJ5dGUgICAgICAgICAgICAgIGB0aHJpZnQ6ImJpbiw4IiBqc29uOiJiaW4iYAorCVN0cmluZ01hcCAgbWFwW3N0cmluZ11zdHJpbmcgICBgdGhyaWZ0OiJzdHJpbmdNYXAsOSIganNvbjoic3RyaW5nTWFwImAKKwlTdHJpbmdMaXN0IFtdc3RyaW5nICAgICAgICAgICAgYHRocmlmdDoic3RyaW5nTGlzdCwxMCIganNvbjoic3RyaW5nTGlzdCJgCisJU3RyaW5nU2V0ICBtYXBbc3RyaW5nXXN0cnVjdHt9IGB0aHJpZnQ6InN0cmluZ1NldCwxMSIganNvbjoic3RyaW5nU2V0ImAKKwlFICAgICAgICAgIE15VGVzdEVudW0gICAgICAgICAgYHRocmlmdDoiZSwxMiIganNvbjoiZSJgCit9CisKK2Z1bmMgTmV3TXlUZXN0U3RydWN0KCkgKk15VGVzdFN0cnVjdCB7CisJcmV0dXJuICZNeVRlc3RTdHJ1Y3R7fQorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldE9uKCkgYm9vbCB7CisJcmV0dXJuIHAuT24KK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRCKCkgaW50OCB7CisJcmV0dXJuIHAuQgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEludDE2KCkgaW50MTYgeworCXJldHVybiBwLkludDE2Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0SW50MzIoKSBpbnQzMiB7CisJcmV0dXJuIHAuSW50MzIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRJbnQ2NCgpIGludDY0IHsKKwlyZXR1cm4gcC5JbnQ2NAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEQoKSBmbG9hdDY0IHsKKwlyZXR1cm4gcC5ECit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3QoKSBzdHJpbmcgeworCXJldHVybiBwLlN0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0QmluKCkgW11ieXRlIHsKKwlyZXR1cm4gcC5CaW4KK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRTdHJpbmdNYXAoKSBtYXBbc3RyaW5nXXN0cmluZyB7CisJcmV0dXJuIHAuU3RyaW5nTWFwCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nTGlzdCgpIFtdc3RyaW5nIHsKKwlyZXR1cm4gcC5TdHJpbmdMaXN0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nU2V0KCkgbWFwW3N0cmluZ11zdHJ1Y3R7fSB7CisJcmV0dXJuIHAuU3RyaW5nU2V0Cit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0RSgpIE15VGVzdEVudW0geworCXJldHVybiBwLkUKK30KK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgUmVhZChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiBfLCBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCByZWFkIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlmb3IgeworCQlfLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCBmaWVsZCAlZCByZWFkIGVycm9yOiAiLCBwLCBmaWVsZElkKSwgZXJyKQorCQl9CisJCWlmIGZpZWxkVHlwZUlkID09IFNUT1AgeworCQkJYnJlYWsKKwkJfQorCQlzd2l0Y2ggZmllbGRJZCB7CisJCWNhc2UgMToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDEoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMjoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDIoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMzoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDMoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNDoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDQoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDUoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNjoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDYoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgNzoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDcoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgODoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDgoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgOToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDkoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMTA6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQxMChpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSAxMToKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDExKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDEyOgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMTIoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWRlZmF1bHQ6CisJCQlpZiBlcnIgOj0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJfQorCQlpZiBlcnIgOj0gaXByb3QuUmVhZEZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCByZWFkIHN0cnVjdCBlbmQgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQxKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQm9vbCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAxOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5PbiA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDIoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRCeXRlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDI6ICIsIGVycikKKwl9IGVsc2UgeworCQl0ZW1wIDo9IGludDgodikKKwkJcC5CID0gdGVtcAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMyhpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEkxNigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAzOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5JbnQxNiA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDQoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgNDogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuSW50MzIgPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ1KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTY0KCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDU6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLkludDY0ID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkNihpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZERvdWJsZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA2OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5EID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkNyhpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA3OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5TdCA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDgoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRCaW5hcnkoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgODogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuQmluID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkOShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlfLCBfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZE1hcEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBtYXAgYmVnaW46ICIsIGVycikKKwl9CisJdE1hcCA6PSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nLCBzaXplKQorCXAuU3RyaW5nTWFwID0gdE1hcAorCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQl2YXIgX2tleTAgc3RyaW5nCisJCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAiLCBlcnIpCisJCX0gZWxzZSB7CisJCQlfa2V5MCA9IHYKKwkJfQorCQl2YXIgX3ZhbDEgc3RyaW5nCisJCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAiLCBlcnIpCisJCX0gZWxzZSB7CisJCQlfdmFsMSA9IHYKKwkJfQorCQlwLlN0cmluZ01hcFtfa2V5MF0gPSBfdmFsMQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZE1hcEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBtYXAgZW5kOiAiLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQxMChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgbGlzdCBiZWdpbjogIiwgZXJyKQorCX0KKwl0U2xpY2UgOj0gbWFrZShbXXN0cmluZywgMCwgc2l6ZSkKKwlwLlN0cmluZ0xpc3QgPSB0U2xpY2UKKwlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJdmFyIF9lbGVtMiBzdHJpbmcKKwkJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDA6ICIsIGVycikKKwkJfSBlbHNlIHsKKwkJCV9lbGVtMiA9IHYKKwkJfQorCQlwLlN0cmluZ0xpc3QgPSBhcHBlbmQocC5TdHJpbmdMaXN0LCBfZWxlbTIpCisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBsaXN0IGVuZDogIiwgZXJyKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMTEoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgc2V0IGJlZ2luOiAiLCBlcnIpCisJfQorCXRTZXQgOj0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCBzaXplKQorCXAuU3RyaW5nU2V0ID0gdFNldAorCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQl2YXIgX2VsZW0zIHN0cmluZworCQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMDogIiwgZXJyKQorCQl9IGVsc2UgeworCQkJX2VsZW0zID0gdgorCQl9CisJCXAuU3RyaW5nU2V0W19lbGVtM10gPSBzdHJ1Y3R7fXt9CisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkU2V0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIHNldCBlbmQ6ICIsIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDEyKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDEyOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJdGVtcCA6PSBNeVRlc3RFbnVtKHYpCisJCXAuRSA9IHRlbXAKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIFdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCJNeVRlc3RTdHJ1Y3QiKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIHN0cnVjdCBiZWdpbiBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMihvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQzKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDQob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkNShvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ2KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDcob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkOChvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ5KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEwKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDExKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDEyKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRTdG9wKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJ3cml0ZSBmaWVsZCBzdG9wIGVycm9yOiAiLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigid3JpdGUgc3RydWN0IHN0b3AgZXJyb3I6ICIsIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIm9uIiwgQk9PTCwgMSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxOm9uOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCb29sKGJvb2wocC5PbikpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQub24gKDEpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDE6b246ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMihvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJiIiwgQllURSwgMik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAyOmI6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUJ5dGUoaW50OChwLkIpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmIgKDIpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDI6YjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQzKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDE2IiwgSTE2LCAzKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDM6aW50MTY6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUkxNihpbnQxNihwLkludDE2KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5pbnQxNiAoMykgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMzppbnQxNjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ0KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDMyIiwgSTMyLCA0KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDQ6aW50MzI6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLkludDMyKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5pbnQzMiAoNCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNDppbnQzMjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ1KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImludDY0IiwgSTY0LCA1KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDU6aW50NjQ6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUk2NChpbnQ2NChwLkludDY0KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5pbnQ2NCAoNSkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgNTppbnQ2NDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ2KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImQiLCBET1VCTEUsIDYpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgNjpkOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVEb3VibGUoZmxvYXQ2NChwLkQpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULmQgKDYpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDY6ZDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ3KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN0IiwgU1RSSU5HLCA3KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDc6c3Q6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcocC5TdCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuc3QgKDcpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDc6c3Q6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkOChvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJiaW4iLCBTVFJJTkcsIDgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgODpiaW46ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUJpbmFyeShwLkJpbik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5iaW4gKDgpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDg6YmluOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDkob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3RyaW5nTWFwIiwgTUFQLCA5KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDk6c3RyaW5nTWFwOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBCZWdpbihTVFJJTkcsIFNUUklORywgbGVuKHAuU3RyaW5nTWFwKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIG1hcCBiZWdpbjogIiwgZXJyKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBwLlN0cmluZ01hcCB7CisJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcoaykpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJCX0KKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgbWFwIGVuZDogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDk6c3RyaW5nTWFwOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDEwKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN0cmluZ0xpc3QiLCBMSVNULCAxMCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxMDpzdHJpbmdMaXN0OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0QmVnaW4oU1RSSU5HLCBsZW4ocC5TdHJpbmdMaXN0KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICIsIGVycikKKwl9CisJZm9yIF8sIHYgOj0gcmFuZ2UgcC5TdHJpbmdMaXN0IHsKKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIGxpc3QgZW5kOiAiLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTA6c3RyaW5nTGlzdDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJzdHJpbmdTZXQiLCBTRVQsIDExKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDExOnN0cmluZ1NldDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0QmVnaW4oU1RSSU5HLCBsZW4ocC5TdHJpbmdTZXQpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgc2V0IGJlZ2luOiAiLCBlcnIpCisJfQorCWZvciB2IDo9IHJhbmdlIHAuU3RyaW5nU2V0IHsKKwkJaWYgZXJyIDo9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyh2KSk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuICgwKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwkJfQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTZXRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgc2V0IGVuZDogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDExOnN0cmluZ1NldDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMihvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJlIiwgSTMyLCAxMik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxMjplOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJMzIoaW50MzIocC5FKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5lICgxMikgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgMTI6ZTogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIFN0cmluZygpIHN0cmluZyB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gIjxuaWw+IgorCX0KKwlyZXR1cm4gZm10LlNwcmludGYoIk15VGVzdFN0cnVjdCglK3YpIiwgKnApCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlci5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTNmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlci5nbwpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK3R5cGUgVFNlcnZlciBpbnRlcmZhY2UgeworCVByb2Nlc3NvckZhY3RvcnkoKSBUUHJvY2Vzc29yRmFjdG9yeQorCVNlcnZlclRyYW5zcG9ydCgpIFRTZXJ2ZXJUcmFuc3BvcnQKKwlJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeQorCU91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeQorCUlucHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeQorCU91dHB1dFByb3RvY29sRmFjdG9yeSgpIFRQcm90b2NvbEZhY3RvcnkKKworCS8vIFN0YXJ0cyB0aGUgc2VydmVyCisJU2VydmUoKSBlcnJvcgorCS8vIFN0b3BzIHRoZSBzZXJ2ZXIuIFRoaXMgaXMgb3B0aW9uYWwgb24gYSBwZXItaW1wbGVtZW50YXRpb24gYmFzaXMuIE5vdAorCS8vIGFsbCBzZXJ2ZXJzIGFyZSByZXF1aXJlZCB0byBiZSBjbGVhbmx5IHN0b3BwYWJsZS4KKwlTdG9wKCkgZXJyb3IKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQyNGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJIm5ldCIKKwkic3luYyIKKwkidGltZSIKKykKKwordHlwZSBUU2VydmVyU29ja2V0IHN0cnVjdCB7CisJbGlzdGVuZXIgICAgICBuZXQuTGlzdGVuZXIKKwlhZGRyICAgICAgICAgIG5ldC5BZGRyCisJY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uCisKKwkvLyBQcm90ZWN0cyB0aGUgaW50ZXJydXB0ZWQgdmFsdWUgdG8gbWFrZSBpdCB0aHJlYWQgc2FmZS4KKwltdSAgICAgICAgICBzeW5jLlJXTXV0ZXgKKwlpbnRlcnJ1cHRlZCBib29sCit9CisKK2Z1bmMgTmV3VFNlcnZlclNvY2tldChsaXN0ZW5BZGRyIHN0cmluZykgKCpUU2VydmVyU29ja2V0LCBlcnJvcikgeworCXJldHVybiBOZXdUU2VydmVyU29ja2V0VGltZW91dChsaXN0ZW5BZGRyLCAwKQorfQorCitmdW5jIE5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGxpc3RlbkFkZHIgc3RyaW5nLCBjbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNlcnZlclNvY2tldCwgZXJyb3IpIHsKKwlhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKCJ0Y3AiLCBsaXN0ZW5BZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuICZUU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIGNsaWVudFRpbWVvdXQ6IGNsaWVudFRpbWVvdXR9LCBuaWwKK30KKworLy8gQ3JlYXRlcyBhIFRTZXJ2ZXJTb2NrZXQgZnJvbSBhIG5ldC5BZGRyCitmdW5jIE5ld1RTZXJ2ZXJTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciBuZXQuQWRkciwgY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNlcnZlclNvY2tldCB7CisJcmV0dXJuICZUU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIGNsaWVudFRpbWVvdXQ6IGNsaWVudFRpbWVvdXR9Cit9CisKK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIExpc3RlbigpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQlyZXR1cm4gbmlsCisJfQorCWwsIGVyciA6PSBuZXQuTGlzdGVuKHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlwLmxpc3RlbmVyID0gbAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNlcnZlclNvY2tldCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcC5tdS5STG9jaygpCisJaW50ZXJydXB0ZWQgOj0gcC5pbnRlcnJ1cHRlZAorCXAubXUuUlVubG9jaygpCisKKwlpZiBpbnRlcnJ1cHRlZCB7CisJCXJldHVybiBuaWwsIGVyclRyYW5zcG9ydEludGVycnVwdGVkCisJfQorCisJcC5tdS5Mb2NrKCkKKwlsaXN0ZW5lciA6PSBwLmxpc3RlbmVyCisJcC5tdS5VbmxvY2soKQorCWlmIGxpc3RlbmVyID09IG5pbCB7CisJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQiKQorCX0KKworCWNvbm4sIGVyciA6PSBsaXN0ZW5lci5BY2NlcHQoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuIE5ld1RTb2NrZXRGcm9tQ29ublRpbWVvdXQoY29ubiwgcC5jbGllbnRUaW1lb3V0KSwgbmlsCit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgbGlzdGVuaW5nLgorZnVuYyAocCAqVFNlcnZlclNvY2tldCkgSXNMaXN0ZW5pbmcoKSBib29sIHsKKwlyZXR1cm4gcC5saXN0ZW5lciAhPSBuaWwKK30KKworLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKKwl9CisJaWYgbCwgZXJyIDo9IG5ldC5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlwLmxpc3RlbmVyID0gbAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEFkZHIoKSBuZXQuQWRkciB7CisJaWYgcC5saXN0ZW5lciAhPSBuaWwgeworCQlyZXR1cm4gcC5saXN0ZW5lci5BZGRyKCkKKwl9CisJcmV0dXJuIHAuYWRkcgorfQorCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKKwl2YXIgZXJyIGVycm9yCisJcC5tdS5Mb2NrKCkKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQllcnIgPSBwLmxpc3RlbmVyLkNsb3NlKCkKKwkJcC5saXN0ZW5lciA9IG5pbAorCX0KKwlwLm11LlVubG9jaygpCisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcC5tdS5Mb2NrKCkKKwlwLmludGVycnVwdGVkID0gdHJ1ZQorCXAubXUuVW5sb2NrKCkKKwlwLkNsb3NlKCkKKworCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlMTk4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZm10IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RTb2NrZXRJc250TGlzdGVuaW5nQWZ0ZXJJbnRlcnJ1cHQodCAqdGVzdGluZy5UKSB7CisJaG9zdCA6PSAiMTI3LjAuMC4xIgorCXBvcnQgOj0gOTA5MAorCWFkZHIgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXNvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwlzb2NrZXQuTGlzdGVuKCkKKwlzb2NrZXQuSW50ZXJydXB0KCkKKworCW5ld1NvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwllcnIgOj0gbmV3U29ja2V0Lkxpc3RlbigpCisJZGVmZXIgbmV3U29ja2V0LkludGVycnVwdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJGYWlsZWQgdG8gcmViaW5kczogJXMiLCBlcnIpCisJfQorfQorCitmdW5jIFRlc3RTb2NrZXRDb25jdXJyZW5jeSh0ICp0ZXN0aW5nLlQpIHsKKwlob3N0IDo9ICIxMjcuMC4wLjEiCisJcG9ydCA6PSA5MDkwCisJYWRkciA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQorCisJc29ja2V0IDo9IENyZWF0ZVNlcnZlclNvY2tldCh0LCBhZGRyKQorCWdvIGZ1bmMoKSB7IHNvY2tldC5MaXN0ZW4oKSB9KCkKKwlnbyBmdW5jKCkgeyBzb2NrZXQuSW50ZXJydXB0KCkgfSgpCit9CisKK2Z1bmMgQ3JlYXRlU2VydmVyU29ja2V0KHQgKnRlc3RpbmcuVCwgYWRkciBzdHJpbmcpICpUU2VydmVyU29ja2V0IHsKKwlzb2NrZXQsIGVyciA6PSBOZXdUU2VydmVyU29ja2V0KGFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJGYWlsZWQgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQ6ICVzIiwgZXJyKQorCX0KKwlyZXR1cm4gc29ja2V0Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmFmNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdGVzdC5nbwpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdE5vdGhpbmcodCAqdGVzdGluZy5UKSB7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM0MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gU2VydmVyIHRyYW5zcG9ydC4gT2JqZWN0IHdoaWNoIHByb3ZpZGVzIGNsaWVudCB0cmFuc3BvcnRzLgordHlwZSBUU2VydmVyVHJhbnNwb3J0IGludGVyZmFjZSB7CisJTGlzdGVuKCkgZXJyb3IKKwlBY2NlcHQoKSAoVFRyYW5zcG9ydCwgZXJyb3IpCisJQ2xvc2UoKSBlcnJvcgorCisJLy8gT3B0aW9uYWwgbWV0aG9kIGltcGxlbWVudGF0aW9uLiBUaGlzIHNpZ25hbHMgdG8gdGhlIHNlcnZlciB0cmFuc3BvcnQKKwkvLyB0aGF0IGl0IHNob3VsZCBicmVhayBvdXQgb2YgYW55IGFjY2VwdCgpIG9yIGxpc3RlbigpIHRoYXQgaXQgaXMgY3VycmVudGx5CisJLy8gYmxvY2tlZCBvbi4gVGhpcyBtZXRob2QsIGlmIGltcGxlbWVudGVkLCBNVVNUIGJlIHRocmVhZCBzYWZlLCBhcyBpdCBtYXkKKwkvLyBiZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgY29udGV4dCB0aGFuIHRoZSBvdGhlciBUU2VydmVyVHJhbnNwb3J0CisJLy8gbWV0aG9kcy4KKwlJbnRlcnJ1cHQoKSBlcnJvcgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4YTcxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KQEAgLTAsMCArMSwxMzM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJieXRlcyIKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmFzZTY0IgorCSJlbmNvZGluZy9qc29uIgorCSJmbXQiCisJImlvIgorCSJtYXRoIgorCSJzdHJjb252IgorKQorCit0eXBlIF9QYXJzZUNvbnRleHQgaW50CisKK2NvbnN0ICgKKwlfQ09OVEVYVF9JTl9UT1BMRVZFTCAgICAgICAgICBfUGFyc2VDb250ZXh0ID0gMQorCV9DT05URVhUX0lOX0xJU1RfRklSU1QgICAgICAgIF9QYXJzZUNvbnRleHQgPSAyCisJX0NPTlRFWFRfSU5fTElTVCAgICAgICAgICAgICAgX1BhcnNlQ29udGV4dCA9IDMKKwlfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QgICAgICBfUGFyc2VDb250ZXh0ID0gNAorCV9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWSAgIF9QYXJzZUNvbnRleHQgPSA1CisJX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUUgX1BhcnNlQ29udGV4dCA9IDYKKykKKworZnVuYyAocCBfUGFyc2VDb250ZXh0KSBTdHJpbmcoKSBzdHJpbmcgeworCXN3aXRjaCBwIHsKKwljYXNlIF9DT05URVhUX0lOX1RPUExFVkVMOgorCQlyZXR1cm4gIlRPUExFVkVMIgorCWNhc2UgX0NPTlRFWFRfSU5fTElTVF9GSVJTVDoKKwkJcmV0dXJuICJMSVNULUZJUlNUIgorCWNhc2UgX0NPTlRFWFRfSU5fTElTVDoKKwkJcmV0dXJuICJMSVNUIgorCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUOgorCQlyZXR1cm4gIk9CSkVDVC1GSVJTVCIKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJcmV0dXJuICJPQkpFQ1QtTkVYVC1LRVkiCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJcmV0dXJuICJPQkpFQ1QtTkVYVC1WQUxVRSIKKwl9CisJcmV0dXJuICJVTktOT1dOLVBBUlNFLUNPTlRFWFQiCit9CisKKy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKy8vCisvLyBUaGlzIHByb3RvY29sIHByb2R1Y2VzL2NvbnN1bWVzIGEgc2ltcGxlIG91dHB1dCBmb3JtYXQKKy8vIHN1aXRhYmxlIGZvciBwYXJzaW5nIGJ5IHNjcmlwdGluZyBsYW5ndWFnZXMuICBJdCBzaG91bGQgbm90IGJlCisvLyBjb25mdXNlZCB3aXRoIHRoZSBmdWxsLWZlYXR1cmVkIFRKU09OUHJvdG9jb2wuCisvLwordHlwZSBUU2ltcGxlSlNPTlByb3RvY29sIHN0cnVjdCB7CisJdHJhbnMgVFRyYW5zcG9ydAorCisJcGFyc2VDb250ZXh0U3RhY2sgW11pbnQKKwlkdW1wQ29udGV4dCAgICAgICBbXWludAorCisJd3JpdGVyICpidWZpby5Xcml0ZXIKKwlyZWFkZXIgKmJ1ZmlvLlJlYWRlcgorfQorCisvLyBDb25zdHJ1Y3RvcgorZnVuYyBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHQgVFRyYW5zcG9ydCkgKlRTaW1wbGVKU09OUHJvdG9jb2wgeworCXYgOj0gJlRTaW1wbGVKU09OUHJvdG9jb2x7dHJhbnM6IHQsCisJCXdyaXRlcjogYnVmaW8uTmV3V3JpdGVyKHQpLAorCQlyZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcih0KSwKKwl9CisJdi5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZCh2LnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQorCXYuZHVtcENvbnRleHQgPSBhcHBlbmQodi5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX1RPUExFVkVMKSkKKwlyZXR1cm4gdgorfQorCisvLyBGYWN0b3J5Cit0eXBlIFRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KSBHZXRQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgeworCXJldHVybiBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorfQorCitmdW5jIE5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkgKlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gJlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5e30KK30KKwordmFyICgKKwlKU09OX0NPTU1BICAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fQ09MT04gICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9MQlJBQ0UgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX1JCUkFDRSAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fTEJSQUNLRVQgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9SQlJBQ0tFVCAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX1FVT1RFICAgICAgICAgICAgICAgICAgIGJ5dGUKKwlKU09OX1FVT1RFX0JZVEVTICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fTlVMTCAgICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9UUlVFICAgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX0ZBTFNFICAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fSU5GSU5JVFkgICAgICAgICAgICAgICAgc3RyaW5nCisJSlNPTl9ORUdBVElWRV9JTkZJTklUWSAgICAgICBzdHJpbmcKKwlKU09OX05BTiAgICAgICAgICAgICAgICAgICAgIHN0cmluZworCUpTT05fSU5GSU5JVFlfQllURVMgICAgICAgICAgW11ieXRlCisJSlNPTl9ORUdBVElWRV9JTkZJTklUWV9CWVRFUyBbXWJ5dGUKKwlKU09OX05BTl9CWVRFUyAgICAgICAgICAgICAgIFtdYnl0ZQorCWpzb25fbm9uYmFzZV9tYXBfZWxlbV9ieXRlcyAgW11ieXRlCispCisKK2Z1bmMgaW5pdCgpIHsKKwlKU09OX0NPTU1BID0gW11ieXRleycsJ30KKwlKU09OX0NPTE9OID0gW11ieXRleyc6J30KKwlKU09OX0xCUkFDRSA9IFtdYnl0ZXsneyd9CisJSlNPTl9SQlJBQ0UgPSBbXWJ5dGV7J30nfQorCUpTT05fTEJSQUNLRVQgPSBbXWJ5dGV7J1snfQorCUpTT05fUkJSQUNLRVQgPSBbXWJ5dGV7J10nfQorCUpTT05fUVVPVEUgPSAnIicKKwlKU09OX1FVT1RFX0JZVEVTID0gW11ieXRleyciJ30KKwlKU09OX05VTEwgPSBbXWJ5dGV7J24nLCAndScsICdsJywgJ2wnfQorCUpTT05fVFJVRSA9IFtdYnl0ZXsndCcsICdyJywgJ3UnLCAnZSd9CisJSlNPTl9GQUxTRSA9IFtdYnl0ZXsnZicsICdhJywgJ2wnLCAncycsICdlJ30KKwlKU09OX0lORklOSVRZID0gIkluZmluaXR5IgorCUpTT05fTkVHQVRJVkVfSU5GSU5JVFkgPSAiLUluZmluaXR5IgorCUpTT05fTkFOID0gIk5hTiIKKwlKU09OX0lORklOSVRZX0JZVEVTID0gW11ieXRleydJJywgJ24nLCAnZicsICdpJywgJ24nLCAnaScsICd0JywgJ3knfQorCUpTT05fTkVHQVRJVkVfSU5GSU5JVFlfQllURVMgPSBbXWJ5dGV7Jy0nLCAnSScsICduJywgJ2YnLCAnaScsICduJywgJ2knLCAndCcsICd5J30KKwlKU09OX05BTl9CWVRFUyA9IFtdYnl0ZXsnTicsICdhJywgJ04nfQorCWpzb25fbm9uYmFzZV9tYXBfZWxlbV9ieXRlcyA9IFtdYnl0ZXsnXScsICcsJywgJ1snfQorfQorCitmdW5jIGpzb25RdW90ZShzIHN0cmluZykgc3RyaW5nIHsKKwliLCBfIDo9IGpzb24uTWFyc2hhbChzKQorCXMxIDo9IHN0cmluZyhiKQorCXJldHVybiBzMQorfQorCitmdW5jIGpzb25VbnF1b3RlKHMgc3RyaW5nKSAoc3RyaW5nLCBib29sKSB7CisJczEgOj0gbmV3KHN0cmluZykKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCBzMSkKKwlyZXR1cm4gKnMxLCBlcnIgPT0gbmlsCit9CisKK2Z1bmMgbWlzbWF0Y2goZXhwZWN0ZWQsIGFjdHVhbCBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gZm10LkVycm9yZigiRXhwZWN0ZWQgJyVzJyBidXQgZm91bmQgJyVzJyB3aGlsZSBwYXJzaW5nIEpTT04uIiwgZXhwZWN0ZWQsIGFjdHVhbCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBlcnJvciB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodHlwZUlkKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTMyKHNlcUlkKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRPYmplY3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0T2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwkvL3JldHVybiBwLk91dHB1dExpc3RFbmQoKQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGtleVR5cGUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgodmFsdWVUeXBlKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlQm9vbChiIGJvb2wpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRCb29sKGIpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGludDgpIGVycm9yIHsKKwlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihiKSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVJMTYodiBpbnQxNikgZXJyb3IgeworCXJldHVybiBwLldyaXRlSTMyKGludDMyKHYpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUkzMih2IGludDMyKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUk2NCh2IGludDY0KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZURvdWJsZSh2IGZsb2F0NjQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRGNjQodikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVTdHJpbmcodiBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRTdHJpbmcodikKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVCaW5hcnkodiBbXWJ5dGUpIGVycm9yIHsKKwkvLyBKU09OIGxpYnJhcnkgb25seSB0YWtlcyBpbiBhIHN0cmluZywKKwkvLyBub3QgYW4gYXJiaXRyYXJ5IGJ5dGUgYXJyYXksIHRvIGVuc3VyZSBieXRlcyBhcmUgdHJhbnNtaXR0ZWQKKwkvLyBlZmZpY2llbnRseSB3ZSBtdXN0IGNvbnZlcnQgdGhpcyBpbnRvIGEgdmFsaWQgSlNPTiBzdHJpbmcKKwkvLyB0aGVyZWZvcmUgd2UgdXNlIGJhc2U2NCBlbmNvZGluZyB0byBhdm9pZCBleGNlc3NpdmUgZXNjYXBpbmcvcXVvdGluZworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQorCWlmIF8sIGUgOj0gd3JpdGVyLldyaXRlKHYpOyBlICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgZSA6PSB3cml0ZXIuQ2xvc2UoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKKy8vIFJlYWRpbmcgbWV0aG9kcy4KK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKKwlpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiBuYW1lLCBlcnIgPSBwLlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJYlR5cGVJZCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQorCXR5cGVJZCA9IFRNZXNzYWdlVHlwZShiVHlwZUlkKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWlmIHNlcUlkLCBlcnIgPSBwLlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikgeworCV8sIGVyciA9IHAuUGFyc2VPYmplY3RTdGFydCgpCisJcmV0dXJuICIiLCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZU9iamVjdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKHN0cmluZywgVFR5cGUsIGludDE2LCBlcnJvcikgeworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgU1RPUCwgMCwgZXJyCisJfQorCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihiKSA+IDAgeworCQlzd2l0Y2ggYlswXSB7CisJCWNhc2UgSlNPTl9SQlJBQ0VbMF06CisJCQlyZXR1cm4gIiIsIFNUT1AsIDAsIG5pbAorCQljYXNlIEpTT05fUVVPVEU6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQluYW1lLCBlcnIgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQorCQkJLy8gc2ltcGxlanNvbiBpcyBub3QgbWVhbnQgdG8gYmUgcmVhZCBiYWNrIGludG8gdGhyaWZ0CisJCQkvLyAtIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRVc2FnZUphdmEKKwkJCS8vIC0gdXNlIEpTT04gaW5zdGVhZAorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgorCQkJfQorCQkJcmV0dXJuIG5hbWUsIFNUT1AsIC0xLCBwLlBhcnNlUG9zdFZhbHVlKCkKKwkJCS8qCisJCQkgICBpZiBlcnIgPSBwLlBhcnNlUG9zdFZhbHVlKCk7IGVyciAhPSBuaWwgeworCQkJICAgICByZXR1cm4gbmFtZSwgU1RPUCwgMCwgZXJyCisJCQkgICB9CisJCQkgICBpZiBpc051bGwsIGVyciA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJCSAgICAgcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgorCQkJICAgfQorCQkJICAgYlR5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwkJCSAgIHRoZXR5cGUgOj0gVFR5cGUoYlR5cGUpCisJCQkgICBpZiBlcnIgIT0gbmlsIHsKKwkJCSAgICAgcmV0dXJuIG5hbWUsIHRoZXR5cGUsIDAsIGVycgorCQkJICAgfQorCQkJICAgaWQsIGVyciA6PSBwLlJlYWRJMTYoKQorCQkJICAgcmV0dXJuIG5hbWUsIHRoZXR5cGUsIGlkLCBlcnIKKwkJCSovCisJCX0KKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIn1cIiBvciAnXCInLCBidXQgZm91bmQ6ICclcyciLCBzdHJpbmcoYikpCisJCXJldHVybiAiIiwgU1RPUCwgMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gIiIsIFNUT1AsIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihpby5FT0YpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCisJLy9yZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCWlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7CisJCXJldHVybiBWT0lELCBWT0lELCAwLCBlCisJfQorCisJLy8gcmVhZCBrZXlUeXBlCisJYktleVR5cGUsIGUgOj0gcC5SZWFkQnl0ZSgpCisJa2V5VHlwZSA9IFRUeXBlKGJLZXlUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgdmFsdWVUeXBlCisJYlZhbHVlVHlwZSwgZSA6PSBwLlJlYWRCeXRlKCkKKwl2YWx1ZVR5cGUgPSBUVHlwZShiVmFsdWVUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgc2l6ZQorCWlTaXplLCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KGlTaXplKQorCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWFwRW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZExpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCXJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJvb2woKSAoYm9vbCwgZXJyb3IpIHsKKwl2YXIgdmFsdWUgYm9vbAorCisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIHZhbHVlLCBlcnIKKwl9CisJZiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGYpID4gMCB7CisJCXN3aXRjaCBmWzBdIHsKKwkJY2FzZSBKU09OX1RSVUVbMF06CisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9UUlVFKSkKKwkJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCQl9CisJCQlpZiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fVFJVRSkgeworCQkJCXZhbHVlID0gdHJ1ZQorCQkJfSBlbHNlIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwidHJ1ZVwiIGJ1dCBmb3VuZDogJXMiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlicmVhaworCQljYXNlIEpTT05fRkFMU0VbMF06CisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9GQUxTRSkpCisJCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQkJfQorCQkJaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX0ZBTFNFKSB7CisJCQkJdmFsdWUgPSBmYWxzZQorCQkJfSBlbHNlIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwiZmFsc2VcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnJlYWsKKwkJY2FzZSBKU09OX05VTExbMF06CisJCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCQl9CisJCQlpZiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJCXZhbHVlID0gZmFsc2UKKwkJCX0gZWxzZSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIm51bGxcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQlkZWZhdWx0OgorCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcInRydWVcIiwgXCJmYWxzZVwiLCBvciBcIm51bGxcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGYpKQorCQkJcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9CisJcmV0dXJuIHZhbHVlLCBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoaW50OCwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50OCh2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDE2KHYpLCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgZXJyb3IpIHsKKwl2LCBlcnIgOj0gcC5SZWFkSTY0KCkKKwlyZXR1cm4gaW50MzIodiksIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkSTY0KCkgKGludDY0LCBlcnJvcikgeworCXYsIF8sIGVyciA6PSBwLlBhcnNlSTY0KCkKKwlyZXR1cm4gdiwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWREb3VibGUoKSAoZmxvYXQ2NCwgZXJyb3IpIHsKKwl2LCBfLCBlcnIgOj0gcC5QYXJzZUY2NCgpCisJcmV0dXJuIHYsIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgZXJyb3IpIHsKKwl2YXIgdiBzdHJpbmcKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gdiwgZXJyCisJfQorCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQl2YWx1ZSwgZXJyIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJdiA9IHZhbHVlCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIGVycgorCQl9CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlpZiBzdHJpbmcoYikgIT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhiKSkKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9IGVsc2UgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGYpKQorCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRCaW5hcnkoKSAoW11ieXRlLCBlcnJvcikgeworCXZhciB2IFtdYnl0ZQorCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9RVU9URSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJdmFsdWUsIGVyciA6PSBwLlBhcnNlQmFzZTY0RW5jb2RlZEJvZHkoKQorCQl2ID0gdmFsdWUKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgZXJyCisJCX0KKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQl9CisJCWlmIHN0cmluZyhiKSAhPSBzdHJpbmcoSlNPTl9OVUxMKSB7CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGIpKQorCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0gZWxzZSB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoZikpCisJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCisJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLndyaXRlci5GbHVzaCgpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7CisJcmV0dXJuIHAudHJhbnMKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0UHJlVmFsdWUoKSBlcnJvciB7CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dFtsZW4ocC5kdW1wQ29udGV4dCktMV0pCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0NPTU1BKTsgZSAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQl9CisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fQ09MT04pOyBlICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCX0KKwkJYnJlYWsKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRQb3N0VmFsdWUoKSBlcnJvciB7CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dFtsZW4ocC5kdW1wQ29udGV4dCktMV0pCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUOgorCQlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX0xJU1QpKQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUOgorCQlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFKSkKKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCQlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCQlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpKQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dEJvb2wodmFsdWUgYm9vbCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXZhciB2IHN0cmluZworCWlmIHZhbHVlIHsKKwkJdiA9IHN0cmluZyhKU09OX1RSVUUpCisJfSBlbHNlIHsKKwkJdiA9IHN0cmluZyhKU09OX0ZBTFNFKQorCX0KKwlzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkgeworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCXYgPSBqc29uUXVvdGUodikKKwlkZWZhdWx0OgorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXROdWxsKCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX05VTEwpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0RjY0KHZhbHVlIGZsb2F0NjQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwl2YXIgdiBzdHJpbmcKKwlpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyBKU09OX05BTiArIHN0cmluZyhKU09OX1FVT1RFKQorCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyBKU09OX0lORklOSVRZICsgc3RyaW5nKEpTT05fUVVPVEUpCisJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyBKU09OX05FR0FUSVZFX0lORklOSVRZICsgc3RyaW5nKEpTT05fUVVPVEUpCisJfSBlbHNlIHsKKwkJdiA9IHN0cmNvbnYuRm9ybWF0RmxvYXQodmFsdWUsICdnJywgLTEsIDY0KQorCQlzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkgeworCQljYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQkJdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIHYgKyBzdHJpbmcoSlNPTl9RVU9URSkKKwkJZGVmYXVsdDoKKwkJfQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRJNjQodmFsdWUgaW50NjQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwl2IDo9IHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkKKwlzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0W2xlbihwLmR1bXBDb250ZXh0KS0xXSkgeworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCXYgPSBqc29uUXVvdGUodikKKwlkZWZhdWx0OgorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRTdHJpbmcocyBzdHJpbmcpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YShqc29uUXVvdGUocykpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFN0cmluZ0RhdGEocyBzdHJpbmcpIGVycm9yIHsKKwlfLCBlIDo9IHAud3JpdGUoW11ieXRlKHMpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0T2JqZWN0QmVnaW4oKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTEJSQUNFKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRPYmplY3RFbmQoKSBlcnJvciB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUkJSQUNFKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwlpZiBlIDo9IHAuT3V0cHV0UG9zdFZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRMaXN0QmVnaW4oKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTEJSQUNLRVQpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fTElTVF9GSVJTVCkpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRMaXN0RW5kKCkgZXJyb3IgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1JCUkFDS0VUKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwlpZiBlIDo9IHAuT3V0cHV0UG9zdFZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVCeXRlKGludDgoZWxlbVR5cGUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVJNjQoaW50NjQoc2l6ZSkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VQcmVWYWx1ZSgpIGVycm9yIHsKKwlpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFja1tsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0pCisJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNUOgorCQlpZiBsZW4oYikgPiAwIHsKKwkJCXN3aXRjaCBiWzBdIHsKKwkJCWNhc2UgSlNPTl9SQlJBQ0tFVFswXToKKwkJCQlyZXR1cm4gbmlsCisJCQljYXNlIEpTT05fQ09NTUFbMF06CisJCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlyZXR1cm4gbmlsCisJCQlkZWZhdWx0OgorCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJdXCIgb3IgXCIsXCIgaW4gbGlzdCBjb250ZXh0LCBidXQgZm91bmQgXCIlc1wiIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCX0KKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJaWYgbGVuKGIpID4gMCB7CisJCQlzd2l0Y2ggYlswXSB7CisJCQljYXNlIEpTT05fUkJSQUNFWzBdOgorCQkJCXJldHVybiBuaWwKKwkJCWNhc2UgSlNPTl9DT01NQVswXToKKwkJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQkJaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQkJfQorCQkJCXJldHVybiBuaWwKKwkJCWRlZmF1bHQ6CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcIn1cIiBvciBcIixcIiBpbiBvYmplY3QgY29udGV4dCwgYnV0IGZvdW5kIFwiJXNcIiIsIHN0cmluZyhiKSkKKwkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQl9CisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJaWYgbGVuKGIpID4gMCB7CisJCQlzd2l0Y2ggYlswXSB7CisJCQljYXNlIEpTT05fQ09MT05bMF06CisJCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlyZXR1cm4gbmlsCisJCQlkZWZhdWx0OgorCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCI6XCIgaW4gb2JqZWN0IGNvbnRleHQsIGJ1dCBmb3VuZCBcIiVzXCIiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJfQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlUG9zdFZhbHVlKCkgZXJyb3IgeworCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlzd2l0Y2ggY3h0IHsKKwljYXNlIF9DT05URVhUX0lOX0xJU1RfRklSU1Q6CisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBwLnBhcnNlQ29udGV4dFN0YWNrWzpsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0KKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fTElTVCkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHAucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHAucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpKQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKSBlcnJvciB7CisJZm9yIHsKKwkJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJCWlmIGxlbihiKSA8IDEgeworCQkJcmV0dXJuIG5pbAorCQl9CisJCXN3aXRjaCBiWzBdIHsKKwkJY2FzZSAnICcsICdccicsICdcbicsICdcdCc6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQljb250aW51ZQorCQlkZWZhdWx0OgorCQkJYnJlYWsKKwkJfQorCQlicmVhaworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlU3RyaW5nQm9keSgpIChzdHJpbmcsIGVycm9yKSB7CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9RVU9URSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlsIDo9IGxlbihsaW5lKQorCS8vIGNvdW50IG51bWJlciBvZiBlc2NhcGVzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGtlZXAgZ29pbmcKKwlpIDo9IDEKKwlmb3IgOyBpIDwgbDsgaSsrIHsKKwkJaWYgbGluZVtsLWktMV0gIT0gJ1xcJyB7CisJCQlicmVhaworCQl9CisJfQorCWlmIGkmMHgwMSA9PSAxIHsKKwkJdiwgb2sgOj0ganNvblVucXVvdGUoc3RyaW5nKEpTT05fUVVPVEUpICsgbGluZSkKKwkJaWYgIW9rIHsKKwkJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlyZXR1cm4gdiwgbmlsCisJfQorCXMsIGVyciA6PSBwLlBhcnNlUXVvdGVkU3RyaW5nQm9keSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJc3RyIDo9IHN0cmluZyhKU09OX1FVT1RFKSArIGxpbmUgKyBzCisJdiwgb2sgOj0ganNvblVucXVvdGUoc3RyKQorCWlmICFvayB7CisJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIGFzIEpTT04gc3RyaW5nICVzIiwgc3RyKQorCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJcmV0dXJuIHYsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZVF1b3RlZFN0cmluZ0JvZHkoKSAoc3RyaW5nLCBlcnJvcikgeworCWxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkU3RyaW5nKEpTT05fUVVPVEUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJbCA6PSBsZW4obGluZSkKKwkvLyBjb3VudCBudW1iZXIgb2YgZXNjYXBlcyB0byBzZWUgaWYgd2UgbmVlZCB0byBrZWVwIGdvaW5nCisJaSA6PSAxCisJZm9yIDsgaSA8IGw7IGkrKyB7CisJCWlmIGxpbmVbbC1pLTFdICE9ICdcXCcgeworCQkJYnJlYWsKKwkJfQorCX0KKwlpZiBpJjB4MDEgPT0gMSB7CisJCXJldHVybiBsaW5lLCBuaWwKKwl9CisJcywgZXJyIDo9IHAuUGFyc2VRdW90ZWRTdHJpbmdCb2R5KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwl2IDo9IGxpbmUgKyBzCisJcmV0dXJuIHYsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUJhc2U2NEVuY29kZWRCb2R5KCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwlsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZEJ5dGVzKEpTT05fUVVPVEUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBsaW5lLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlsaW5lMiA6PSBsaW5lWzAgOiBsZW4obGluZSktMV0KKwlsIDo9IGxlbihsaW5lMikKKwlpZiAobCAlIDQpICE9IDAgeworCQlwYWQgOj0gNCAtIChsICUgNCkKKwkJZmlsbCA6PSBbLi4uXWJ5dGV7Jz0nLCAnPScsICc9J30KKwkJbGluZTIgPSBhcHBlbmQobGluZTIsIGZpbGxbOnBhZF0uLi4pCisJCWwgPSBsZW4obGluZTIpCisJfQorCW91dHB1dCA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZWRMZW4obCkpCisJbiwgZXJyIDo9IGJhc2U2NC5TdGRFbmNvZGluZy5EZWNvZGUob3V0cHV0LCBsaW5lMikKKwlyZXR1cm4gb3V0cHV0WzA6bl0sIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlSTY0KCkgKGludDY0LCBib29sLCBlcnJvcikgeworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBmYWxzZSwgZXJyCisJfQorCXZhciB2YWx1ZSBpbnQ2NAorCXZhciBpc251bGwgYm9vbAorCWlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJcC5yZWFkZXIuUmVhZChtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpKQorCQlpc251bGwgPSB0cnVlCisJfSBlbHNlIHsKKwkJbnVtLCBlcnIgOj0gcC5yZWFkTnVtZXJpYygpCisJCWlzbnVsbCA9IChudW0gPT0gbmlsKQorCQlpZiAhaXNudWxsIHsKKwkJCXZhbHVlID0gbnVtLkludDY0KCkKKwkJfQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2YWx1ZSwgaXNudWxsLCBlcnIKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWUsIGlzbnVsbCwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlRjY0KCkgKGZsb2F0NjQsIGJvb2wsIGVycm9yKSB7CisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGZhbHNlLCBlcnIKKwl9CisJdmFyIHZhbHVlIGZsb2F0NjQKKwl2YXIgaXNudWxsIGJvb2wKKwlpZiBwLnNhZmVQZWVrQ29udGFpbnMoSlNPTl9OVUxMKSB7CisJCXAucmVhZGVyLlJlYWQobWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKSkKKwkJaXNudWxsID0gdHJ1ZQorCX0gZWxzZSB7CisJCW51bSwgZXJyIDo9IHAucmVhZE51bWVyaWMoKQorCQlpc251bGwgPSAobnVtID09IG5pbCkKKwkJaWYgIWlzbnVsbCB7CisJCQl2YWx1ZSA9IG51bS5GbG9hdDY0KCkKKwkJfQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2YWx1ZSwgaXNudWxsLCBlcnIKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWUsIGlzbnVsbCwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlT2JqZWN0U3RhcnQoKSAoYm9vbCwgZXJyb3IpIHsKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycgorCX0KKwl2YXIgYiBbXWJ5dGUKKwliLCBlcnIgOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycgorCX0KKwlpZiBsZW4oYikgPiAwICYmIGJbMF0gPT0gSlNPTl9MQlJBQ0VbMF0geworCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQocC5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkpCisJCXJldHVybiBmYWxzZSwgbmlsCisJfSBlbHNlIGlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJcmV0dXJuIHRydWUsIG5pbAorCX0KKwllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkICd7JyBvciBudWxsLCBidXQgZm91bmQgJyVzJyIsIHN0cmluZyhiKSkKKwlyZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VPYmplY3RFbmQoKSBlcnJvciB7CisJaWYgaXNOdWxsLCBlcnIgOj0gcC5yZWFkSWZOdWxsKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlpZiAoY3h0ICE9IF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkgJiYgKGN4dCAhPSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCB0byBiZSBpbiB0aGUgT2JqZWN0IENvbnRleHQsIGJ1dCBub3QgaW4gT2JqZWN0IENvbnRleHQgKCVkKSIsIGN4dCkKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9SQlJBQ0VbMF0pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlmb3IgXywgY2hhciA6PSByYW5nZSBsaW5lIHsKKwkJc3dpdGNoIGNoYXIgeworCQlkZWZhdWx0OgorCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RpbmcgZW5kIG9mIG9iamVjdCBcIn1cIiwgYnV0IGZvdW5kOiBcIiVzXCIiLCBsaW5lKQorCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJY2FzZSAnICcsICdcbicsICdccicsICdcdCcsICd9JzoKKwkJCWJyZWFrCisJCX0KKwl9CisJcC5wYXJzZUNvbnRleHRTdGFjayA9IHAucGFyc2VDb250ZXh0U3RhY2tbOmxlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXQorCXJldHVybiBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VMaXN0QmVnaW4oKSAoaXNOdWxsIGJvb2wsIGVyciBlcnJvcikgeworCWlmIGUgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlCisJfQorCXZhciBiIFtdYnl0ZQorCWIsIGVyciA9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnIKKwl9CisJaWYgbGVuKGIpID49IDEgJiYgYlswXSA9PSBKU09OX0xCUkFDS0VUWzBdIHsKKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fTElTVF9GSVJTVCkpCisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJaXNOdWxsID0gZmFsc2UKKwl9IGVsc2UgaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlpc051bGwgPSB0cnVlCisJfSBlbHNlIHsKKwkJZXJyID0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJudWxsXCIgb3IgXCJbXCIsIHJlY2VpdmVkICVxIiwgYikKKwl9CisJcmV0dXJuIGlzTnVsbCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnIpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgMCwgZQorCX0KKwliRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwllbGVtVHlwZSA9IFRUeXBlKGJFbGVtVHlwZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBlcnIKKwl9CisJblNpemUsIGVycjIgOj0gcC5SZWFkSTY0KCkKKwlzaXplID0gaW50KG5TaXplKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUxpc3RFbmQoKSBlcnJvciB7CisJaWYgaXNOdWxsLCBlcnIgOj0gcC5yZWFkSWZOdWxsKCk7IGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwljeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkKKwlpZiBjeHQgIT0gX0NPTlRFWFRfSU5fTElTVCB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgdG8gYmUgaW4gdGhlIExpc3QgQ29udGV4dCwgYnV0IG5vdCBpbiBMaXN0IENvbnRleHQgKCVkKSIsIGN4dCkKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9SQlJBQ0tFVFswXSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWZvciBfLCBjaGFyIDo9IHJhbmdlIGxpbmUgeworCQlzd2l0Y2ggY2hhciB7CisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGluZyBlbmQgb2YgbGlzdCBcIl1cIiwgYnV0IGZvdW5kOiBcIiV2XCIiLCBsaW5lKQorCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJY2FzZSAnICcsICdcbicsICdccicsICdcdCcsIHJ1bmUoSlNPTl9SQlJBQ0tFVFswXSk6CisJCQlicmVhaworCQl9CisJfQorCXAucGFyc2VDb250ZXh0U3RhY2sgPSBwLnBhcnNlQ29udGV4dFN0YWNrWzpsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0KKwlpZiBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2tbbGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdKSA9PSBfQ09OVEVYVF9JTl9UT1BMRVZFTCB7CisJCXJldHVybiBuaWwKKwl9CisJcmV0dXJuIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkU2luZ2xlVmFsdWUoKSAoaW50ZXJmYWNle30sIFRUeXBlLCBlcnJvcikgeworCWUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwliLCBlIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oYikgPiAwIHsKKwkJYyA6PSBiWzBdCisJCXN3aXRjaCBjIHsKKwkJY2FzZSBKU09OX05VTExbMF06CisJCQlidWYgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQorCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZikKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gbmlsLCBWT0lELCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHN0cmluZyhKU09OX05VTEwpICE9IHN0cmluZyhidWYpIHsKKwkJCQllID0gbWlzbWF0Y2goc3RyaW5nKEpTT05fTlVMTCksIHN0cmluZyhidWYpKQorCQkJCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCXJldHVybiBuaWwsIFZPSUQsIG5pbAorCQljYXNlIEpTT05fUVVPVEU6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQl2LCBlIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gdiwgVVRGOCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQl9CisJCQlpZiB2ID09IEpTT05fSU5GSU5JVFkgeworCQkJCXJldHVybiBJTkZJTklUWSwgRE9VQkxFLCBuaWwKKwkJCX0gZWxzZSBpZiB2ID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXJldHVybiBORUdBVElWRV9JTkZJTklUWSwgRE9VQkxFLCBuaWwKKwkJCX0gZWxzZSBpZiB2ID09IEpTT05fTkFOIHsKKwkJCQlyZXR1cm4gTkFOLCBET1VCTEUsIG5pbAorCQkJfQorCQkJcmV0dXJuIHYsIFVURjgsIG5pbAorCQljYXNlIEpTT05fVFJVRVswXToKKwkJCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fVFJVRSkpCisJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmKQorCQkJaWYgZSAhPSBuaWwgeworCQkJCXJldHVybiB0cnVlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHN0cmluZyhKU09OX1RSVUUpICE9IHN0cmluZyhidWYpIHsKKwkJCQllIDo9IG1pc21hdGNoKHN0cmluZyhKU09OX1RSVUUpLCBzdHJpbmcoYnVmKSkKKwkJCQlyZXR1cm4gdHJ1ZSwgQk9PTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJcmV0dXJuIHRydWUsIEJPT0wsIG5pbAorCQljYXNlIEpTT05fRkFMU0VbMF06CisJCQlidWYgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX0ZBTFNFKSkKKwkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWYpCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCX0KKwkJCWlmIHN0cmluZyhKU09OX0ZBTFNFKSAhPSBzdHJpbmcoYnVmKSB7CisJCQkJZSA6PSBtaXNtYXRjaChzdHJpbmcoSlNPTl9GQUxTRSksIHN0cmluZyhidWYpKQorCQkJCXJldHVybiBmYWxzZSwgQk9PTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJcmV0dXJuIGZhbHNlLCBCT09MLCBuaWwKKwkJY2FzZSBKU09OX0xCUkFDS0VUWzBdOgorCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQlyZXR1cm4gbWFrZShbXWludGVyZmFjZXt9LCAwKSwgTElTVCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCWNhc2UgSlNPTl9MQlJBQ0VbMF06CisJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCXJldHVybiBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pLCBTVFJVQ1QsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQljYXNlICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2UnLCAnRScsICcuJywgJysnLCAnLScsIEpTT05fSU5GSU5JVFlbMF0sIEpTT05fTkFOWzBdOgorCQkJLy8gYXNzdW1lIG51bWVyaWMKKwkJCXYsIGUgOj0gcC5yZWFkTnVtZXJpYygpCisJCQlyZXR1cm4gdiwgRE9VQkxFLCBlCisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGVsZW1lbnQgaW4gbGlzdCBidXQgZm91bmQgJyVzJyB3aGlsZSBwYXJzaW5nIEpTT04uIiwgc3RyaW5nKGMpKQorCQkJcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CisJfQorCWUgPSBmbXQuRXJyb3JmKCJDYW5ub3QgcmVhZCBhIHNpbmdsZSBlbGVtZW50IHdoaWxlIHBhcnNpbmcgSlNPTi4iKQorCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKworfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkSWZOdWxsKCkgKGJvb2wsIGVycm9yKSB7CisJY29udCA6PSB0cnVlCisJZm9yIGNvbnQgeworCQliLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwkJaWYgbGVuKGIpIDwgMSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9CisJCXN3aXRjaCBiWzBdIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCWNhc2UgSlNPTl9OVUxMWzBdOgorCQkJY29udCA9IGZhbHNlCisJCQlicmVhaworCQljYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JzoKKwkJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCWJyZWFrCisJCX0KKwl9CisJaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlwLnJlYWRlci5SZWFkKG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkpCisJCXJldHVybiB0cnVlLCBuaWwKKwl9CisJcmV0dXJuIGZhbHNlLCBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZFF1b3RlSWZOZXh0KCkgeworCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX1FVT1RFIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCX0KK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZE51bWVyaWMoKSAoTnVtZXJpYywgZXJyb3IpIHsKKwlpc051bGwsIGVyciA6PSBwLnJlYWRJZk51bGwoKQorCWlmIGlzTnVsbCB8fCBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgZXJyCisJfQorCWhhc0RlY2ltYWxQb2ludCA6PSBmYWxzZQorCW5leHRDYW5CZVNpZ24gOj0gdHJ1ZQorCWhhc0UgOj0gZmFsc2UKKwlNQVhfTEVOIDo9IDQwCisJYnVmIDo9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgTUFYX0xFTikpCisJY29udGludWVGb3IgOj0gdHJ1ZQorCWluUXVvdGVzIDo9IGZhbHNlCisJZm9yIGNvbnRpbnVlRm9yIHsKKwkJYywgZXJyIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlpZiBlcnIgPT0gaW8uRU9GIHsKKwkJCQlicmVhaworCQkJfQorCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlzd2l0Y2ggYyB7CisJCWNhc2UgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknOgorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJbmV4dENhbkJlU2lnbiA9IGZhbHNlCisJCWNhc2UgJy4nOgorCQkJaWYgaGFzRGVjaW1hbFBvaW50IHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgd2l0aCBtdWx0aXBsZSBkZWNpbWFsIHBvaW50cyAnJXMuJyIsIGJ1Zi5TdHJpbmcoKSkKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlpZiBoYXNFIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgd2l0aCBkZWNpbWFsIHBvaW50cyBpbiB0aGUgZXhwb25lbnQgJyVzLiciLCBidWYuU3RyaW5nKCkpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJaGFzRGVjaW1hbFBvaW50LCBuZXh0Q2FuQmVTaWduID0gdHJ1ZSwgZmFsc2UKKwkJY2FzZSAnZScsICdFJzoKKwkJCWlmIGhhc0UgeworCQkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciB3aXRoIG11bHRpcGxlIGV4cG9uZW50cyAnJXMlYyciLCBidWYuU3RyaW5nKCksIGMpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJaGFzRSwgbmV4dENhbkJlU2lnbiA9IHRydWUsIHRydWUKKwkJY2FzZSAnLScsICcrJzoKKwkJCWlmICFuZXh0Q2FuQmVTaWduIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIk5lZ2F0aXZlIHNpZ24gd2l0aGluIG51bWJlciIpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnVmLldyaXRlQnl0ZShjKQorCQkJbmV4dENhbkJlU2lnbiA9IGZhbHNlCisJCWNhc2UgJyAnLCAwLCAnXHQnLCAnXG4nLCAnXHInLCBKU09OX1JCUkFDRVswXSwgSlNPTl9SQlJBQ0tFVFswXSwgSlNPTl9DT01NQVswXSwgSlNPTl9DT0xPTlswXToKKwkJCXAucmVhZGVyLlVucmVhZEJ5dGUoKQorCQkJY29udGludWVGb3IgPSBmYWxzZQorCQljYXNlIEpTT05fTkFOWzBdOgorCQkJaWYgYnVmLkxlbigpID09IDAgeworCQkJCWJ1ZmZlciA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTkFOKSkKKwkJCQlidWZmZXJbMF0gPSBjCisJCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZmZlclsxOl0pCisJCQkJaWYgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJaWYgSlNPTl9OQU4gIT0gc3RyaW5nKGJ1ZmZlcikgeworCQkJCQllIDo9IG1pc21hdGNoKEpTT05fTkFOLCBzdHJpbmcoYnVmZmVyKSkKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJCX0KKwkJCQlpZiBpblF1b3RlcyB7CisJCQkJCXAucmVhZFF1b3RlSWZOZXh0KCkKKwkJCQl9CisJCQkJcmV0dXJuIE5BTiwgbmlsCisJCQl9IGVsc2UgeworCQkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciBzdGFydGluZyB3aXRoIGNoYXJhY3RlciAnJWMnIiwgYykKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCWNhc2UgSlNPTl9JTkZJTklUWVswXToKKwkJCWlmIGJ1Zi5MZW4oKSA9PSAwIHx8IChidWYuTGVuKCkgPT0gMSAmJiBidWYuQnl0ZXMoKVswXSA9PSAnKycpIHsKKwkJCQlidWZmZXIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX0lORklOSVRZKSkKKwkJCQlidWZmZXJbMF0gPSBjCisJCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZmZlclsxOl0pCisJCQkJaWYgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJaWYgSlNPTl9JTkZJTklUWSAhPSBzdHJpbmcoYnVmZmVyKSB7CisJCQkJCWUgOj0gbWlzbWF0Y2goSlNPTl9JTkZJTklUWSwgc3RyaW5nKGJ1ZmZlcikpCisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCQl9CisJCQkJaWYgaW5RdW90ZXMgeworCQkJCQlwLnJlYWRRdW90ZUlmTmV4dCgpCisJCQkJfQorCQkJCXJldHVybiBJTkZJTklUWSwgbmlsCisJCQl9IGVsc2UgaWYgYnVmLkxlbigpID09IDEgJiYgYnVmLkJ5dGVzKClbMF0gPT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWVswXSB7CisJCQkJYnVmZmVyIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9ORUdBVElWRV9JTkZJTklUWSkpCisJCQkJYnVmZmVyWzBdID0gSlNPTl9ORUdBVElWRV9JTkZJTklUWVswXQorCQkJCWJ1ZmZlclsxXSA9IGMKKwkJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmZmVyWzI6XSkKKwkJCQlpZiBlICE9IG5pbCB7CisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlpZiBKU09OX05FR0FUSVZFX0lORklOSVRZICE9IHN0cmluZyhidWZmZXIpIHsKKwkJCQkJZSA6PSBtaXNtYXRjaChKU09OX05FR0FUSVZFX0lORklOSVRZLCBzdHJpbmcoYnVmZmVyKSkKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJCX0KKwkJCQlpZiBpblF1b3RlcyB7CisJCQkJCXAucmVhZFF1b3RlSWZOZXh0KCkKKwkJCQl9CisJCQkJcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZLCBuaWwKKwkJCX0gZWxzZSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHN0YXJ0aW5nIHdpdGggY2hhcmFjdGVyICclYycgZHVlIHRvIGV4aXN0aW5nIGJ1ZmZlciAlcyIsIGMsIGJ1Zi5TdHJpbmcoKSkKKwkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCWNhc2UgSlNPTl9RVU9URToKKwkJCWlmICFpblF1b3RlcyB7CisJCQkJaW5RdW90ZXMgPSB0cnVlCisJCQl9IGVsc2UgeworCQkJCWJyZWFrCisJCQl9CisJCWRlZmF1bHQ6CisJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgc3RhcnRpbmcgd2l0aCBjaGFyYWN0ZXIgJyVjJyIsIGMpCisJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9CisJaWYgYnVmLkxlbigpID09IDAgeworCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgZnJvbSBlbXB0eSBzdHJpbmcgJyciKQorCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCXJldHVybiBOZXdOdW1lcmljRnJvbUpTT05TdHJpbmcoYnVmLlN0cmluZygpLCBmYWxzZSksIG5pbAorfQorCisvLyBTYWZlbHkgcGVla3MgaW50byB0aGUgYnVmZmVyLCByZWFkaW5nIG9ubHkgd2hhdCBpcyBuZWNlc3NhcnkKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHNhZmVQZWVrQ29udGFpbnMoYiBbXWJ5dGUpIGJvb2wgeworCWZvciBpIDo9IDA7IGkgPCBsZW4oYik7IGkrKyB7CisJCWEsIF8gOj0gcC5yZWFkZXIuUGVlayhpICsgMSkKKwkJaWYgbGVuKGEpID09IDAgfHwgYVtpXSAhPSBiW2ldIHsKKwkJCXJldHVybiBmYWxzZQorCQl9CisJfQorCXJldHVybiB0cnVlCit9CisKKy8vIFJlc2V0IHRoZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlLgorZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVzZXRDb250ZXh0U3RhY2soKSB7CisJcC5wYXJzZUNvbnRleHRTdGFjayA9IFtdaW50e2ludChfQ09OVEVYVF9JTl9UT1BMRVZFTCl9CisJcC5kdW1wQ29udGV4dCA9IFtdaW50e2ludChfQ09OVEVYVF9JTl9UT1BMRVZFTCl9Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLndyaXRlci5Xcml0ZShiKQorCWlmIGVyciAhPSBuaWwgeworCQlwLndyaXRlci5SZXNldChwLnRyYW5zKSAvLyBUSFJJRlQtMzczNQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ODA4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbwpAQCAtMCwwICsxLDcxNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iYXNlNjQiCisJImVuY29kaW5nL2pzb24iCisJImZtdCIKKwkibWF0aCIKKwkic3RyY29udiIKKwkic3RyaW5ncyIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCb29sKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJvb2xlYW4iCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUJvb2wodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gZmFsc2UKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYm9vbGVhbiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQlpZiB2YWx1ZSB7CisJCQl0cmFucy5Xcml0ZShKU09OX1RSVUUpCisJCX0gZWxzZSB7CisJCQl0cmFucy5Xcml0ZShKU09OX0ZBTFNFKQorCQl9CisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkQm9vbCgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYnl0ZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlQnl0ZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQ4KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJ5dGUiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEJ5dGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MTYiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMTYodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50MTYoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQxNiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEkxNigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDMyX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQzMigwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTMyKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTMyKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJMzJOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCXZhbHVlIDo9ICJudWxsIgorCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZEkzMigpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAwIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDY0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDY0KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50NjQiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHZhbHVlLCAxMCkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkSTY0KCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJNjROdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDMyIgorCXZhbHVlIDo9ICJudWxsIgorCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZEk2NCgpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAwIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImRvdWJsZSIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkFOKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJCXYgOj0gZmxvYXQ2NCgwKQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiZG91YmxlIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKKwkJdHJhbnMuV3JpdGVTdHJpbmcobi5TdHJpbmcoKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWREb3VibGUoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgIW1hdGguSXNJbmYodiwgMSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKKwkJCWlmICFtYXRoLklzSW5mKHYsIC0xKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiAhbWF0aC5Jc05hTih2KSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHNbMF0gIT0gJyInIHx8IHNbbGVuKHMpLTFdICE9ICciJyB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAnJXYnLCB3cm90ZSAnJXYnLCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgZm10LlNwcmludCgiXCIiLCB2YWx1ZSwgIlwiIikpCisJCX0KKwkJdiA6PSBuZXcoc3RyaW5nKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2KTsgZXJyICE9IG5pbCB8fCAqdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzdHJpbmciCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUodmFsdWUpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXYxIDo9IG5ldyhzdHJpbmcpCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmdOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInN0cmluZyIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiB2ICE9ICIiIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQorCWI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKKwliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKKwliNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlpZiBlIDo9IHAuV3JpdGVCaW5hcnkodmFsdWUpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJcyA6PSB0cmFucy5TdHJpbmcoKQorCWlmIHMgIT0gZm10LlNwcmludCgiXCIiLCBiNjRTdHJpbmcsICJcIiIpIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXZcbiAgd3JvdGU6ICV2XG5leHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgIlwiIitiNjRTdHJpbmcrIlwiIikKKwl9CisJdjEgOj0gbmV3KHN0cmluZykKKwlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2MSk7IGVyciAhPSBuaWwgfHwgKnYxICE9IGI2NFN0cmluZyB7CisJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQorCWI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKKwliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKKwliNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUoYjY0U3RyaW5nKSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRCaW5hcnkoKQorCWlmIGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiBsZW4odikgIT0gbGVuKHZhbHVlKSB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlIGxlbmd0aCAldiwgd3JvdGU6ICV2LCByZWNlaXZlZCBsZW5ndGg6ICV2IiwgdGhldHlwZSwgbGVuKHZhbHVlKSwgcywgbGVuKHYpKQorCX0KKwlmb3IgaSA6PSAwOyBpIDwgbGVuKHYpOyBpKysgeworCQlpZiB2W2ldICE9IHZhbHVlW2ldIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICVkIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIGksIHZhbHVlW2ldLCBzLCB2W2ldKQorCQl9CisJfQorCXYxIDo9IG5ldyhzdHJpbmcpCisJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSBiNjRTdHJpbmcgeworCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCisJfQorCXRyYW5zLlJlc2V0KCkKKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnlOdWxsKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJYiwgZSA6PSBwLlJlYWRCaW5hcnkoKQorCXYgOj0gc3RyaW5nKGIpCisKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAiIiB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbExpc3QodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAibGlzdCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZUxpc3RCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCisJfQorCWwgOj0gKnN0cjEKKwlpZiBsZW4obCkgPCAyIHsKKwkJdC5GYXRhbGYoIkxpc3QgbXVzdCBiZSBhdCBsZWFzdCBvZiBsZW5ndGggdHdvIHRvIGluY2x1ZGUgbWV0YWRhdGEiKQorCX0KKwlpZiBpbnQobFswXS4oZmxvYXQ2NCkpICE9IERPVUJMRSB7CisJCXQuRmF0YWwoIkludmFsaWQgdHlwZSBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIERPVUJMRSwgIiwgYnV0IHdhczogIiwgbFswXSkKKwl9CisJaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzIDo9IGxbaysyXQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbFNldCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzZXQiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVTZXRCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVTZXRFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlzdHIxIDo9IG5ldyhbXWludGVyZmFjZXt9KQorCWVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKKwl9CisJbCA6PSAqc3RyMQorCWlmIGxlbihsKSA8IDIgeworCQl0LkZhdGFsZigiU2V0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKKwl9CisJaWYgaW50KGxbMF0uKGZsb2F0NjQpKSAhPSBET1VCTEUgeworCQl0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIERPVUJMRSwgIiwgYnV0IHdhczogIiwgbFswXSkKKwl9CisJaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3Igc2V0LCBleHBlY3RlZDogIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzOiAiLCBsWzFdKQorCX0KKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXMgOj0gbFtrKzJdCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9ORUdBVElWRV9JTkZJTklUWSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMuKHN0cmluZykgIT0gSlNPTl9OQU4geworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTiksIHN0cikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIHMuKGZsb2F0NjQpICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sTWFwKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gIm1hcCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJcC5Xcml0ZU1hcEJlZ2luKFRUeXBlKEkzMiksIFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKKwlmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUkzMihpbnQzMihrKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMga2V5IGludDMyIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSBmbG9hdDY0IHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVNYXBFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlpZiBzdHJbMF0gIT0gJ1snIHx8IHN0cltsZW4oc3RyKS0xXSAhPSAnXScgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICV2LCBpbiBnbzogJXYiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCisJfQorCWwgOj0gc3RyaW5ncy5TcGxpdChzdHJbMTpsZW4oc3RyKS0xXSwgIiwiKQorCWlmIGxlbihsKSA8IDMgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBsaXN0IG9mIGF0IGxlYXN0IGxlbmd0aCAzIGZvciBtYXAgZm9yIG1ldGFkYXRhLCBidXQgd2FzIG9mIGxlbmd0aCAiLCBsZW4obCkpCisJfQorCWV4cGVjdGVkS2V5VHlwZSwgXyA6PSBzdHJjb252LkF0b2kobFswXSkKKwlleHBlY3RlZFZhbHVlVHlwZSwgXyA6PSBzdHJjb252LkF0b2kobFsxXSkKKwlleHBlY3RlZFNpemUsIF8gOj0gc3RyY29udi5BdG9pKGxbMl0pCisJaWYgZXhwZWN0ZWRLZXlUeXBlICE9IEkzMiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCBrZXkgdHlwZSAiLCBJMzIsICIsIGJ1dCB3YXMgIiwgbFswXSkKKwl9CisJaWYgZXhwZWN0ZWRWYWx1ZVR5cGUgIT0gRE9VQkxFIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIHZhbHVlIHR5cGUgIiwgRE9VQkxFLCAiLCBidXQgd2FzICIsIGxbMV0pCisJfQorCWlmIGV4cGVjdGVkU2l6ZSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAgc2l6ZSBvZiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXMgIiwgbFsyXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzdHJrIDo9IGxbayoyKzNdCisJCXN0cnYgOj0gbFtrKjIrNF0KKwkJaWssIGVyciA6PSBzdHJjb252LkF0b2koc3RyaykKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIHN0cmssIHN0cmluZyhrKSwgZXJyLkVycm9yKCkpCisJCX0KKwkJaWYgaWsgIT0gayB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCBzdHJrLCBrKQorCQl9CisJCXMgOj0gc3RydgorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9OQU4pIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05BTikpCisJCQl9CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA6PSBzdHJjb252LkZvcm1hdEZsb2F0KHZhbHVlLCAnZycsIDEwLCA2NCkKKwkJCWlmIHMgIT0gZXhwZWN0ZWQgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGV4cGVjdGVkKQorCQkJfQorCQkJdiA6PSBmbG9hdDY0KDApCisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDM1ODAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImxvZyIKKwkicnVudGltZS9kZWJ1ZyIKKwkic3luYyIKKwkic3luYy9hdG9taWMiCispCisKKy8qCisgKiBUaGlzIGlzIG5vdCBhIHR5cGljYWwgVFNpbXBsZVNlcnZlciBhcyBpdCBpcyBub3QgYmxvY2tlZCBhZnRlciBhY2NlcHQgYSBzb2NrZXQuCisgKiBJdCBpcyBtb3JlIGxpa2UgYSBUVGhyZWFkZWRTZXJ2ZXIgdGhhdCBjYW4gaGFuZGxlIGRpZmZlcmVudCBjb25uZWN0aW9ucyBpbiBkaWZmZXJlbnQgZ29yb3V0aW5lcy4KKyAqIFRoaXMgd2lsbCB3b3JrIGlmIGdvbGFuZyB1c2VyIGltcGxlbWVudHMgYSBjb25uLXBvb2wgbGlrZSB0aGluZyBpbiBjbGllbnQgc2lkZS4KKyAqLwordHlwZSBUU2ltcGxlU2VydmVyIHN0cnVjdCB7CisJY2xvc2VkIGludDMyCisJd2cgICAgIHN5bmMuV2FpdEdyb3VwCisJbXUgICAgIHN5bmMuTXV0ZXgKKworCXByb2Nlc3NvckZhY3RvcnkgICAgICAgVFByb2Nlc3NvckZhY3RvcnkKKwlzZXJ2ZXJUcmFuc3BvcnQgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQKKwlpbnB1dFRyYW5zcG9ydEZhY3RvcnkgIFRUcmFuc3BvcnRGYWN0b3J5CisJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeQorCWlucHV0UHJvdG9jb2xGYWN0b3J5ICAgVFByb3RvY29sRmFjdG9yeQorCW91dHB1dFByb3RvY29sRmFjdG9yeSAgVFByb3RvY29sRmFjdG9yeQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXIyKHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTIoTmV3VFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0KQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk0KE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJdHJhbnNwb3J0RmFjdG9yeSwKKwkJcHJvdG9jb2xGYWN0b3J5LAorCSkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyNihwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorCQlvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorCQlpbnB1dFByb3RvY29sRmFjdG9yeSwKKwkJb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorCSkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTIocHJvY2Vzc29yRmFjdG9yeSBUUHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSwKKwkJTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSwKKwkJTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkJTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkpCit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk0KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTYocHJvY2Vzc29yRmFjdG9yeSwKKwkJc2VydmVyVHJhbnNwb3J0LAorCQl0cmFuc3BvcnRGYWN0b3J5LAorCQl0cmFuc3BvcnRGYWN0b3J5LAorCQlwcm90b2NvbEZhY3RvcnksCisJCXByb3RvY29sRmFjdG9yeSwKKwkpCit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7CisJcmV0dXJuICZUU2ltcGxlU2VydmVyeworCQlwcm9jZXNzb3JGYWN0b3J5OiAgICAgICBwcm9jZXNzb3JGYWN0b3J5LAorCQlzZXJ2ZXJUcmFuc3BvcnQ6ICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisJCWlucHV0VHJhbnNwb3J0RmFjdG9yeTogIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKwkJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKwkJaW5wdXRQcm90b2NvbEZhY3Rvcnk6ICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisJCW91dHB1dFByb3RvY29sRmFjdG9yeTogIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKwl9Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIFByb2Nlc3NvckZhY3RvcnkoKSBUUHJvY2Vzc29yRmFjdG9yeSB7CisJcmV0dXJuIHAucHJvY2Vzc29yRmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBTZXJ2ZXJUcmFuc3BvcnQoKSBUU2VydmVyVHJhbnNwb3J0IHsKKwlyZXR1cm4gcC5zZXJ2ZXJUcmFuc3BvcnQKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgSW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBwLmlucHV0VHJhbnNwb3J0RmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgSW5wdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gcC5pbnB1dFByb3RvY29sRmFjdG9yeQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gcC5vdXRwdXRQcm90b2NvbEZhY3RvcnkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgTGlzdGVuKCkgZXJyb3IgeworCXJldHVybiBwLnNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBpbm5lckFjY2VwdCgpIChpbnQzMiwgZXJyb3IpIHsKKwljbGllbnQsIGVyciA6PSBwLnNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKQorCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWNsb3NlZCA6PSBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkKKwlpZiBjbG9zZWQgIT0gMCB7CisJCXJldHVybiBjbG9zZWQsIG5pbAorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIDAsIGVycgorCX0KKwlpZiBjbGllbnQgIT0gbmlsIHsKKwkJcC53Zy5BZGQoMSkKKwkJZ28gZnVuYygpIHsKKwkJCWRlZmVyIHAud2cuRG9uZSgpCisJCQlpZiBlcnIgOj0gcC5wcm9jZXNzUmVxdWVzdHMoY2xpZW50KTsgZXJyICE9IG5pbCB7CisJCQkJbG9nLlByaW50bG4oImVycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDoiLCBlcnIpCisJCQl9CisJCX0oKQorCX0KKwlyZXR1cm4gMCwgbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIEFjY2VwdExvb3AoKSBlcnJvciB7CisJZm9yIHsKKwkJY2xvc2VkLCBlcnIgOj0gcC5pbm5lckFjY2VwdCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWlmIGNsb3NlZCAhPSAwIHsKKwkJCXJldHVybiBuaWwKKwkJfQorCX0KK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgU2VydmUoKSBlcnJvciB7CisJZXJyIDo9IHAuTGlzdGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlwLkFjY2VwdExvb3AoKQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgU3RvcCgpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKKwlpZiBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkgIT0gMCB7CisJCXJldHVybiBuaWwKKwl9CisJYXRvbWljLlN0b3JlSW50MzIoJnAuY2xvc2VkLCAxKQorCXAuc2VydmVyVHJhbnNwb3J0LkludGVycnVwdCgpCisJcC53Zy5XYWl0KCkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIHByb2Nlc3NSZXF1ZXN0cyhjbGllbnQgVFRyYW5zcG9ydCkgZXJyb3IgeworCXByb2Nlc3NvciA6PSBwLnByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCkKKwlpbnB1dFRyYW5zcG9ydCwgZXJyIDo9IHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJb3V0cHV0VHJhbnNwb3J0LCBlcnIgOj0gcC5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaW5wdXRQcm90b2NvbCA6PSBwLmlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KQorCW91dHB1dFByb3RvY29sIDo9IHAub3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCkKKwlkZWZlciBmdW5jKCkgeworCQlpZiBlIDo9IHJlY292ZXIoKTsgZSAhPSBuaWwgeworCQkJbG9nLlByaW50ZigicGFuaWMgaW4gcHJvY2Vzc29yOiAlczogJXMiLCBlLCBkZWJ1Zy5TdGFjaygpKQorCQl9CisJfSgpCisKKwlpZiBpbnB1dFRyYW5zcG9ydCAhPSBuaWwgeworCQlkZWZlciBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpCisJfQorCWlmIG91dHB1dFRyYW5zcG9ydCAhPSBuaWwgeworCQlkZWZlciBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKQorCX0KKwlmb3IgeworCQlpZiBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkgIT0gMCB7CisJCQlyZXR1cm4gbmlsCisJCX0KKworCQlvaywgZXJyIDo9IHByb2Nlc3Nvci5Qcm9jZXNzKGRlZmF1bHRDdHgsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKQorCQlpZiBlcnIsIG9rIDo9IGVyci4oVFRyYW5zcG9ydEV4Y2VwdGlvbik7IG9rICYmIGVyci5UeXBlSWQoKSA9PSBFTkRfT0ZfRklMRSB7CisJCQlyZXR1cm4gbmlsCisJCX0gZWxzZSBpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlpZiBlcnIsIG9rIDo9IGVyci4oVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsgb2sgJiYgZXJyLlR5cGVJZCgpID09IFVOS05PV05fTUVUSE9EIHsKKwkJCWNvbnRpbnVlCisJCX0KKwkJaWYgIW9rIHsKKwkJCWJyZWFrCisJCX0KKwl9CisJcmV0dXJuIG5pbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE0OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28KQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkiZXJyb3JzIgorCSJydW50aW1lIgorKQorCit0eXBlIG1vY2tTZXJ2ZXJUcmFuc3BvcnQgc3RydWN0IHsKKwlMaXN0ZW5GdW5jICAgIGZ1bmMoKSBlcnJvcgorCUFjY2VwdEZ1bmMgICAgZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikKKwlDbG9zZUZ1bmMgICAgIGZ1bmMoKSBlcnJvcgorCUludGVycnVwdEZ1bmMgZnVuYygpIGVycm9yCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIExpc3RlbigpIGVycm9yIHsKKwlyZXR1cm4gbS5MaXN0ZW5GdW5jKCkKK30KKworZnVuYyAobSAqbW9ja1NlcnZlclRyYW5zcG9ydCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIG0uQWNjZXB0RnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCXJldHVybiBtLkNsb3NlRnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIEludGVycnVwdCgpIGVycm9yIHsKKwlyZXR1cm4gbS5JbnRlcnJ1cHRGdW5jKCkKK30KKwordHlwZSBtb2NrVFRyYW5zcG9ydCBzdHJ1Y3QgeworCVRUcmFuc3BvcnQKK30KKworZnVuYyAobSAqbW9ja1RUcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyBUZXN0TXVsdGlwbGVTdG9wKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl2YXIgaW50ZXJydXB0Q2FsbGVkIGJvb2wKKwljIDo9IG1ha2UoY2hhbiBzdHJ1Y3R7fSkKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJPC1jCisJCQlyZXR1cm4gbmlsLCBuaWwKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJYyA8LSBzdHJ1Y3R7fXt9CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlpbnRlcnJ1cHRDYWxsZWQgPSB0cnVlCisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlzZXJ2LlN0b3AoKQorCWlmICFpbnRlcnJ1cHRDYWxsZWQgeworCQl0LkVycm9yKCJmaXJzdCBzZXJ2ZXIgdHJhbnNwb3J0IHNob3VsZCBoYXZlIGJlZW4gaW50ZXJydXB0ZWQiKQorCX0KKworCXNlcnYgPSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlpbnRlcnJ1cHRDYWxsZWQgPSBmYWxzZQorCWdvIHNlcnYuU2VydmUoKQorCXNlcnYuU3RvcCgpCisJaWYgIWludGVycnVwdENhbGxlZCB7CisJCXQuRXJyb3IoInNlY29uZCBzZXJ2ZXIgdHJhbnNwb3J0IHNob3VsZCBoYXZlIGJlZW4gaW50ZXJydXB0ZWQiKQorCX0KK30KKworZnVuYyBUZXN0V2FpdFJhY2UodCAqdGVzdGluZy5UKSB7CisJcHJvYyA6PSAmbW9ja1Byb2Nlc3NvcnsKKwkJUHJvY2Vzc0Z1bmM6IGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9LAorCX0KKworCXRyYW5zIDo9ICZtb2NrU2VydmVyVHJhbnNwb3J0eworCQlMaXN0ZW5GdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlBY2NlcHRGdW5jOiBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJCQlyZXR1cm4gJm1vY2tUVHJhbnNwb3J0e30sIG5pbAorCQl9LAorCQlDbG9zZUZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlydW50aW1lLkdvc2NoZWQoKQorCXNlcnYuU3RvcCgpCit9CisKK2Z1bmMgVGVzdE5vSGFuZ0R1cmluZ1N0b3BGcm9tRGFuZ2xpbmdMb2NrQWNxdWlyZUR1cmluZ0FjY2VwdExvb3AodCAqdGVzdGluZy5UKSB7CisJcHJvYyA6PSAmbW9ja1Byb2Nlc3NvcnsKKwkJUHJvY2Vzc0Z1bmM6IGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9LAorCX0KKworCXRyYW5zIDo9ICZtb2NrU2VydmVyVHJhbnNwb3J0eworCQlMaXN0ZW5GdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlBY2NlcHRGdW5jOiBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJCQlyZXR1cm4gbmlsLCBlcnJvcnMuTmV3KCJubyBzaXIiKQorCQl9LAorCQlDbG9zZUZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlydW50aW1lLkdvc2NoZWQoKQorCXNlcnYuU3RvcCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc29ja2V0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTQyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJuZXQiCisJInRpbWUiCispCisKK3R5cGUgVFNvY2tldCBzdHJ1Y3QgeworCWNvbm4gICAgbmV0LkNvbm4KKwlhZGRyICAgIG5ldC5BZGRyCisJdGltZW91dCB0aW1lLkR1cmF0aW9uCit9CisKKy8vIE5ld1RTb2NrZXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQKKy8vCisvLyBFeGFtcGxlOgorLy8gCXRyYW5zLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTb2NrZXQoImxvY2FsaG9zdDo5MDkwIikKK2Z1bmMgTmV3VFNvY2tldChob3N0UG9ydCBzdHJpbmcpICgqVFNvY2tldCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFNvY2tldFRpbWVvdXQoaG9zdFBvcnQsIDApCit9CisKKy8vIE5ld1RTb2NrZXRUaW1lb3V0IGNyZWF0ZXMgYSBuZXQuQ29ubi1iYWNrZWQgVFRyYW5zcG9ydCwgZ2l2ZW4gYSBob3N0IGFuZCBwb3J0CisvLyBpdCBhbHNvIGFjY2VwdHMgYSB0aW1lb3V0IGFzIGEgdGltZS5EdXJhdGlvbgorZnVuYyBOZXdUU29ja2V0VGltZW91dChob3N0UG9ydCBzdHJpbmcsIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKCpUU29ja2V0LCBlcnJvcikgeworCS8vY29ubiwgZXJyIDo9IG5ldC5EaWFsVGltZW91dChuZXR3b3JrLCBhZGRyZXNzLCB0aW1lb3V0KQorCWFkZHIsIGVyciA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIGhvc3RQb3J0KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIE5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgdGltZW91dCksIG5pbAorfQorCisvLyBDcmVhdGVzIGEgVFNvY2tldCBmcm9tIGEgbmV0LkFkZHIKK2Z1bmMgTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyIG5ldC5BZGRyLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU29ja2V0IHsKKwlyZXR1cm4gJlRTb2NrZXR7YWRkcjogYWRkciwgdGltZW91dDogdGltZW91dH0KK30KKworLy8gQ3JlYXRlcyBhIFRTb2NrZXQgZnJvbSBhbiBleGlzdGluZyBuZXQuQ29ubgorZnVuYyBOZXdUU29ja2V0RnJvbUNvbm5UaW1lb3V0KGNvbm4gbmV0LkNvbm4sIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKlRTb2NrZXQgeworCXJldHVybiAmVFNvY2tldHtjb25uOiBjb25uLCBhZGRyOiBjb25uLlJlbW90ZUFkZHIoKSwgdGltZW91dDogdGltZW91dH0KK30KKworLy8gU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKK2Z1bmMgKHAgKlRTb2NrZXQpIFNldFRpbWVvdXQodGltZW91dCB0aW1lLkR1cmF0aW9uKSBlcnJvciB7CisJcC50aW1lb3V0ID0gdGltZW91dAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNvY2tldCkgcHVzaERlYWRsaW5lKHJlYWQsIHdyaXRlIGJvb2wpIHsKKwl2YXIgdCB0aW1lLlRpbWUKKwlpZiBwLnRpbWVvdXQgPiAwIHsKKwkJdCA9IHRpbWUuTm93KCkuQWRkKHRpbWUuRHVyYXRpb24ocC50aW1lb3V0KSkKKwl9CisJaWYgcmVhZCAmJiB3cml0ZSB7CisJCXAuY29ubi5TZXREZWFkbGluZSh0KQorCX0gZWxzZSBpZiByZWFkIHsKKwkJcC5jb25uLlNldFJlYWREZWFkbGluZSh0KQorCX0gZWxzZSBpZiB3cml0ZSB7CisJCXAuY29ubi5TZXRXcml0ZURlYWRsaW5lKHQpCisJfQorfQorCisvLyBDb25uZWN0cyB0aGUgc29ja2V0LCBjcmVhdGluZyBhIG5ldyBzb2NrZXQgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KK2Z1bmMgKHAgKlRTb2NrZXQpIE9wZW4oKSBlcnJvciB7CisJaWYgcC5Jc09wZW4oKSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZC4iKQorCX0KKwlpZiBwLmFkZHIgPT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBuaWwgYWRkcmVzcy4iKQorCX0KKwlpZiBsZW4ocC5hZGRyLk5ldHdvcmsoKSkgPT0gMCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIG5ldHdvcmsgbmFtZS4iKQorCX0KKwlpZiBsZW4ocC5hZGRyLlN0cmluZygpKSA9PSAwIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgYWRkcmVzcy4iKQorCX0KKwl2YXIgZXJyIGVycm9yCisJaWYgcC5jb25uLCBlcnIgPSBuZXQuRGlhbFRpbWVvdXQocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLnRpbWVvdXQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sIGVyci5FcnJvcigpKQorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIFJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIG5ldC5Db25uCitmdW5jIChwICpUU29ja2V0KSBDb25uKCkgbmV0LkNvbm4geworCXJldHVybiBwLmNvbm4KK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4KK2Z1bmMgKHAgKlRTb2NrZXQpIElzT3BlbigpIGJvb2wgeworCWlmIHAuY29ubiA9PSBuaWwgeworCQlyZXR1cm4gZmFsc2UKKwl9CisJcmV0dXJuIHRydWUKK30KKworLy8gQ2xvc2VzIHRoZSBzb2NrZXQuCitmdW5jIChwICpUU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKKwkvLyBDbG9zZSB0aGUgc29ja2V0CisJaWYgcC5jb25uICE9IG5pbCB7CisJCWVyciA6PSBwLmNvbm4uQ2xvc2UoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlwLmNvbm4gPSBuaWwKKwl9CisJcmV0dXJuIG5pbAorfQorCisvL1JldHVybnMgdGhlIHJlbW90ZSBhZGRyZXNzIG9mIHRoZSBzb2NrZXQuCitmdW5jIChwICpUU29ja2V0KSBBZGRyKCkgbmV0LkFkZHIgeworCXJldHVybiBwLmFkZHIKK30KKworZnVuYyAocCAqVFNvY2tldCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKKwl9CisJcC5wdXNoRGVhZGxpbmUodHJ1ZSwgZmFsc2UpCisJbiwgZXJyIDo9IHAuY29ubi5SZWFkKGJ1ZikKKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQorCX0KKwlwLnB1c2hEZWFkbGluZShmYWxzZSwgdHJ1ZSkKKwlyZXR1cm4gcC5jb25uLldyaXRlKGJ1ZikKK30KKworZnVuYyAocCAqVFNvY2tldCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gcC5jb25uLkNsb3NlKCkKK30KKworZnVuYyAocCAqVFNvY2tldCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3YWZjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY3J5cHRvL3RscyIKKwkibmV0IgorCSJ0aW1lIgorKQorCit0eXBlIFRTU0xTZXJ2ZXJTb2NrZXQgc3RydWN0IHsKKwlsaXN0ZW5lciAgICAgIG5ldC5MaXN0ZW5lcgorCWFkZHIgICAgICAgICAgbmV0LkFkZHIKKwljbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24KKwlpbnRlcnJ1cHRlZCAgIGJvb2wKKwljZmcgICAgICAgICAgICp0bHMuQ29uZmlnCit9CisKK2Z1bmMgTmV3VFNTTFNlcnZlclNvY2tldChsaXN0ZW5BZGRyIHN0cmluZywgY2ZnICp0bHMuQ29uZmlnKSAoKlRTU0xTZXJ2ZXJTb2NrZXQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RTU0xTZXJ2ZXJTb2NrZXRUaW1lb3V0KGxpc3RlbkFkZHIsIGNmZywgMCkKK30KKworZnVuYyBOZXdUU1NMU2VydmVyU29ja2V0VGltZW91dChsaXN0ZW5BZGRyIHN0cmluZywgY2ZnICp0bHMuQ29uZmlnLCBjbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNTTFNlcnZlclNvY2tldCwgZXJyb3IpIHsKKwlpZiBjZmcuTWluVmVyc2lvbiA9PSAwIHsKKwkJY2ZnLk1pblZlcnNpb24gPSB0bHMuVmVyc2lvblRMUzEwCisJfQorCWFkZHIsIGVyciA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIGxpc3RlbkFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gJlRTU0xTZXJ2ZXJTb2NrZXR7YWRkcjogYWRkciwgY2xpZW50VGltZW91dDogY2xpZW50VGltZW91dCwgY2ZnOiBjZmd9LCBuaWwKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgTGlzdGVuKCkgZXJyb3IgeworCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBuaWwKKwl9CisJbCwgZXJyIDo9IHRscy5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlwLmxpc3RlbmVyID0gbAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgcC5pbnRlcnJ1cHRlZCB7CisJCXJldHVybiBuaWwsIGVyclRyYW5zcG9ydEludGVycnVwdGVkCisJfQorCWlmIHAubGlzdGVuZXIgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldCIpCisJfQorCWNvbm4sIGVyciA6PSBwLmxpc3RlbmVyLkFjY2VwdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4gTmV3VFNTTFNvY2tldEZyb21Db25uVGltZW91dChjb25uLCBwLmNmZywgcC5jbGllbnRUaW1lb3V0KSwgbmlsCit9CisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgbGlzdGVuaW5nLgorZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgSXNMaXN0ZW5pbmcoKSBib29sIHsKKwlyZXR1cm4gcC5saXN0ZW5lciAhPSBuaWwKK30KKworLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKKwl9CisJaWYgbCwgZXJyIDo9IHRscy5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfSBlbHNlIHsKKwkJcC5saXN0ZW5lciA9IGwKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBBZGRyKCkgbmV0LkFkZHIgeworCXJldHVybiBwLmFkZHIKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgQ2xvc2UoKSBlcnJvciB7CisJZGVmZXIgZnVuYygpIHsKKwkJcC5saXN0ZW5lciA9IG5pbAorCX0oKQorCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CisJCXJldHVybiBwLmxpc3RlbmVyLkNsb3NlKCkKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU2VydmVyU29ja2V0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcC5pbnRlcnJ1cHRlZCA9IHRydWUKKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2MzM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJjcnlwdG8vdGxzIgorCSJuZXQiCisJInRpbWUiCispCisKK3R5cGUgVFNTTFNvY2tldCBzdHJ1Y3QgeworCWNvbm4gbmV0LkNvbm4KKwkvLyBob3N0UG9ydCBjb250YWlucyBob3N0OnBvcnQgKGUuZy4gImFzZGYuY29tOjEyMzQ1IikuIFRoZSBmaWVsZCBpcworCS8vIG9ubHkgdmFsaWQgaWYgYWRkciBpcyBuaWwuCisJaG9zdFBvcnQgc3RyaW5nCisJLy8gYWRkciBpcyBuaWwgd2hlbiBob3N0UG9ydCBpcyBub3QgIiIsIGFuZCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUKKwkvLyBUU1NMU29ja2V0IGlzIGNvbnN0cnVjdGVkIGZyb20gYSBuZXQuQWRkci4KKwlhZGRyICAgIG5ldC5BZGRyCisJdGltZW91dCB0aW1lLkR1cmF0aW9uCisJY2ZnICAgICAqdGxzLkNvbmZpZworfQorCisvLyBOZXdUU1NMU29ja2V0IGNyZWF0ZXMgYSBuZXQuQ29ubi1iYWNrZWQgVFRyYW5zcG9ydCwgZ2l2ZW4gYSBob3N0IGFuZCBwb3J0IGFuZCB0bHMgQ29uZmlndXJhdGlvbgorLy8KKy8vIEV4YW1wbGU6CisvLyAJdHJhbnMsIGVyciA6PSB0aHJpZnQuTmV3VFNTTFNvY2tldCgibG9jYWxob3N0OjkwOTAiLCBuaWwpCitmdW5jIE5ld1RTU0xTb2NrZXQoaG9zdFBvcnQgc3RyaW5nLCBjZmcgKnRscy5Db25maWcpICgqVFNTTFNvY2tldCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFNTTFNvY2tldFRpbWVvdXQoaG9zdFBvcnQsIGNmZywgMCkKK30KKworLy8gTmV3VFNTTFNvY2tldFRpbWVvdXQgY3JlYXRlcyBhIG5ldC5Db25uLWJhY2tlZCBUVHJhbnNwb3J0LCBnaXZlbiBhIGhvc3QgYW5kIHBvcnQKKy8vIGl0IGFsc28gYWNjZXB0cyBhIHRscyBDb25maWd1cmF0aW9uIGFuZCBhIHRpbWVvdXQgYXMgYSB0aW1lLkR1cmF0aW9uCitmdW5jIE5ld1RTU0xTb2NrZXRUaW1lb3V0KGhvc3RQb3J0IHN0cmluZywgY2ZnICp0bHMuQ29uZmlnLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNTTFNvY2tldCwgZXJyb3IpIHsKKwlpZiBjZmcuTWluVmVyc2lvbiA9PSAwIHsKKwkJY2ZnLk1pblZlcnNpb24gPSB0bHMuVmVyc2lvblRMUzEwCisJfQorCXJldHVybiAmVFNTTFNvY2tldHtob3N0UG9ydDogaG9zdFBvcnQsIHRpbWVvdXQ6IHRpbWVvdXQsIGNmZzogY2ZnfSwgbmlsCit9CisKKy8vIENyZWF0ZXMgYSBUU1NMU29ja2V0IGZyb20gYSBuZXQuQWRkcgorZnVuYyBOZXdUU1NMU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIgbmV0LkFkZHIsIGNmZyAqdGxzLkNvbmZpZywgdGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNTTFNvY2tldCB7CisJcmV0dXJuICZUU1NMU29ja2V0e2FkZHI6IGFkZHIsIHRpbWVvdXQ6IHRpbWVvdXQsIGNmZzogY2ZnfQorfQorCisvLyBDcmVhdGVzIGEgVFNTTFNvY2tldCBmcm9tIGFuIGV4aXN0aW5nIG5ldC5Db25uCitmdW5jIE5ld1RTU0xTb2NrZXRGcm9tQ29ublRpbWVvdXQoY29ubiBuZXQuQ29ubiwgY2ZnICp0bHMuQ29uZmlnLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU1NMU29ja2V0IHsKKwlyZXR1cm4gJlRTU0xTb2NrZXR7Y29ubjogY29ubiwgYWRkcjogY29ubi5SZW1vdGVBZGRyKCksIHRpbWVvdXQ6IHRpbWVvdXQsIGNmZzogY2ZnfQorfQorCisvLyBTZXRzIHRoZSBzb2NrZXQgdGltZW91dAorZnVuYyAocCAqVFNTTFNvY2tldCkgU2V0VGltZW91dCh0aW1lb3V0IHRpbWUuRHVyYXRpb24pIGVycm9yIHsKKwlwLnRpbWVvdXQgPSB0aW1lb3V0CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU1NMU29ja2V0KSBwdXNoRGVhZGxpbmUocmVhZCwgd3JpdGUgYm9vbCkgeworCXZhciB0IHRpbWUuVGltZQorCWlmIHAudGltZW91dCA+IDAgeworCQl0ID0gdGltZS5Ob3coKS5BZGQodGltZS5EdXJhdGlvbihwLnRpbWVvdXQpKQorCX0KKwlpZiByZWFkICYmIHdyaXRlIHsKKwkJcC5jb25uLlNldERlYWRsaW5lKHQpCisJfSBlbHNlIGlmIHJlYWQgeworCQlwLmNvbm4uU2V0UmVhZERlYWRsaW5lKHQpCisJfSBlbHNlIGlmIHdyaXRlIHsKKwkJcC5jb25uLlNldFdyaXRlRGVhZGxpbmUodCkKKwl9Cit9CisKKy8vIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgorZnVuYyAocCAqVFNTTFNvY2tldCkgT3BlbigpIGVycm9yIHsKKwl2YXIgZXJyIGVycm9yCisJLy8gSWYgd2UgaGF2ZSBhIGhvc3RuYW1lLCB3ZSBuZWVkIHRvIHBhc3MgdGhlIGhvc3RuYW1lIHRvIHRscy5EaWFsIGZvcgorCS8vIGNlcnRpZmljYXRlIGhvc3RuYW1lIGNoZWNrcy4KKwlpZiBwLmhvc3RQb3J0ICE9ICIiIHsKKwkJaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbFdpdGhEaWFsZXIoJm5ldC5EaWFsZXJ7CisJCQlUaW1lb3V0OiBwLnRpbWVvdXR9LCAidGNwIiwgcC5ob3N0UG9ydCwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKKwkJfQorCX0gZWxzZSB7CisJCWlmIHAuSXNPcGVuKCkgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpCisJCX0KKwkJaWYgcC5hZGRyID09IG5pbCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG5pbCBhZGRyZXNzLiIpCisJCX0KKwkJaWYgbGVuKHAuYWRkci5OZXR3b3JrKCkpID09IDAgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgbmV0d29yayBuYW1lLiIpCisJCX0KKwkJaWYgbGVuKHAuYWRkci5TdHJpbmcoKSkgPT0gMCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhZCBhZGRyZXNzLiIpCisJCX0KKwkJaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbFdpdGhEaWFsZXIoJm5ldC5EaWFsZXJ7CisJCQlUaW1lb3V0OiBwLnRpbWVvdXR9LCBwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCksIHAuY2ZnKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgZXJyLkVycm9yKCkpCisJCX0KKwl9CisJcmV0dXJuIG5pbAorfQorCisvLyBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBuZXQuQ29ubgorZnVuYyAocCAqVFNTTFNvY2tldCkgQ29ubigpIG5ldC5Db25uIHsKKwlyZXR1cm4gcC5jb25uCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBvcGVuCitmdW5jIChwICpUU1NMU29ja2V0KSBJc09wZW4oKSBib29sIHsKKwlpZiBwLmNvbm4gPT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCXJldHVybiB0cnVlCit9CisKKy8vIENsb3NlcyB0aGUgc29ja2V0LgorZnVuYyAocCAqVFNTTFNvY2tldCkgQ2xvc2UoKSBlcnJvciB7CisJLy8gQ2xvc2UgdGhlIHNvY2tldAorCWlmIHAuY29ubiAhPSBuaWwgeworCQllcnIgOj0gcC5jb25uLkNsb3NlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJcC5jb25uID0gbmlsCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKKwl9CisJcC5wdXNoRGVhZGxpbmUodHJ1ZSwgZmFsc2UpCisJbiwgZXJyIDo9IHAuY29ubi5SZWFkKGJ1ZikKKwlyZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJaWYgIXAuSXNPcGVuKCkgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQorCX0KKwlwLnB1c2hEZWFkbGluZShmYWxzZSwgdHJ1ZSkKKwlyZXR1cm4gcC5jb25uLldyaXRlKGJ1ZikKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gcC5jb25uLkNsb3NlKCkKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTI3MzhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImlvIgorKQorCit2YXIgZXJyVHJhbnNwb3J0SW50ZXJydXB0ZWQgPSBlcnJvcnMuTmV3KCJUcmFuc3BvcnQgSW50ZXJydXB0ZWQiKQorCit0eXBlIEZsdXNoZXIgaW50ZXJmYWNlIHsKKwlGbHVzaCgpIChlcnIgZXJyb3IpCit9CisKK3R5cGUgQ29udGV4dEZsdXNoZXIgaW50ZXJmYWNlIHsKKwlGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKQorfQorCit0eXBlIFJlYWRTaXplUHJvdmlkZXIgaW50ZXJmYWNlIHsKKwlSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KQorfQorCisvLyBFbmNhcHN1bGF0ZXMgdGhlIEkvTyBsYXllcgordHlwZSBUVHJhbnNwb3J0IGludGVyZmFjZSB7CisJaW8uUmVhZFdyaXRlQ2xvc2VyCisJQ29udGV4dEZsdXNoZXIKKwlSZWFkU2l6ZVByb3ZpZGVyCisKKwkvLyBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9uCisJT3BlbigpIGVycm9yCisKKwkvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisJSXNPcGVuKCkgYm9vbAorfQorCit0eXBlIHN0cmluZ1dyaXRlciBpbnRlcmZhY2UgeworCVdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikKK30KKworLy8gVGhpcyBpcyAiZW5jaGFuY2VkIiB0cmFuc3BvcnQgd2l0aCBleHRyYSBjYXBhYmlsaXRpZXMuIFlvdSBuZWVkIHRvIHVzZSBvbmUgb2YgdGhlc2UKKy8vIHRvIGNvbnN0cnVjdCBwcm90b2NvbC4KKy8vIE5vdGFibHksIFRTb2NrZXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgaXQgaXMgYWx3YXlzIGEgbWlzdGFrZSB0byB1c2UKKy8vIFRTb2NrZXQgZGlyZWN0bHkgaW4gcHJvdG9jb2wuCit0eXBlIFRSaWNoVHJhbnNwb3J0IGludGVyZmFjZSB7CisJaW8uUmVhZFdyaXRlcgorCWlvLkJ5dGVSZWFkZXIKKwlpby5CeXRlV3JpdGVyCisJc3RyaW5nV3JpdGVyCisJQ29udGV4dEZsdXNoZXIKKwlSZWFkU2l6ZVByb3ZpZGVyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb24uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwNWI0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbi5nbwpAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImVycm9ycyIKKwkiaW8iCispCisKK3R5cGUgdGltZW91dGFibGUgaW50ZXJmYWNlIHsKKwlUaW1lb3V0KCkgYm9vbAorfQorCisvLyBUaHJpZnQgVHJhbnNwb3J0IGV4Y2VwdGlvbgordHlwZSBUVHJhbnNwb3J0RXhjZXB0aW9uIGludGVyZmFjZSB7CisJVEV4Y2VwdGlvbgorCVR5cGVJZCgpIGludAorCUVycigpIGVycm9yCit9CisKK2NvbnN0ICgKKwlVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04gPSAwCisJTk9UX09QRU4gICAgICAgICAgICAgICAgICAgID0gMQorCUFMUkVBRFlfT1BFTiAgICAgICAgICAgICAgICA9IDIKKwlUSU1FRF9PVVQgICAgICAgICAgICAgICAgICAgPSAzCisJRU5EX09GX0ZJTEUgICAgICAgICAgICAgICAgID0gNAorKQorCit0eXBlIHRUcmFuc3BvcnRFeGNlcHRpb24gc3RydWN0IHsKKwl0eXBlSWQgaW50CisJZXJyICAgIGVycm9yCit9CisKK2Z1bmMgKHAgKnRUcmFuc3BvcnRFeGNlcHRpb24pIFR5cGVJZCgpIGludCB7CisJcmV0dXJuIHAudHlwZUlkCit9CisKK2Z1bmMgKHAgKnRUcmFuc3BvcnRFeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5lcnIuRXJyb3IoKQorfQorCitmdW5jIChwICp0VHJhbnNwb3J0RXhjZXB0aW9uKSBFcnIoKSBlcnJvciB7CisJcmV0dXJuIHAuZXJyCit9CisKK2Z1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0IGludCwgZSBzdHJpbmcpIFRUcmFuc3BvcnRFeGNlcHRpb24geworCXJldHVybiAmdFRyYW5zcG9ydEV4Y2VwdGlvbnt0eXBlSWQ6IHQsIGVycjogZXJyb3JzLk5ldyhlKX0KK30KKworZnVuYyBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGUgZXJyb3IpIFRUcmFuc3BvcnRFeGNlcHRpb24geworCWlmIGUgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKworCWlmIHQsIG9rIDo9IGUuKFRUcmFuc3BvcnRFeGNlcHRpb24pOyBvayB7CisJCXJldHVybiB0CisJfQorCisJc3dpdGNoIHYgOj0gZS4odHlwZSkgeworCWNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKwkJcmV0dXJuIHYKKwljYXNlIHRpbWVvdXRhYmxlOgorCQlpZiB2LlRpbWVvdXQoKSB7CisJCQlyZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiBUSU1FRF9PVVQsIGVycjogZX0KKwkJfQorCX0KKworCWlmIGUgPT0gaW8uRU9GIHsKKwkJcmV0dXJuICZ0VHJhbnNwb3J0RXhjZXB0aW9ue3R5cGVJZDogRU5EX09GX0ZJTEUsIGVycjogZX0KKwl9CisKKwlyZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiBVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sIGVycjogZX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZXhjZXB0aW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0MzE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbl90ZXN0LmdvCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiZm10IgorCSJpbyIKKworCSJ0ZXN0aW5nIgorKQorCit0eXBlIHRpbWVvdXQgc3RydWN0eyB0aW1lZG91dCBib29sIH0KKworZnVuYyAodCAqdGltZW91dCkgVGltZW91dCgpIGJvb2wgeworCXJldHVybiB0LnRpbWVkb3V0Cit9CisKK2Z1bmMgKHQgKnRpbWVvdXQpIEVycm9yKCkgc3RyaW5nIHsKKwlyZXR1cm4gZm10LlNwcmludGYoIlRpbWVvdXQ6ICV2IiwgdC50aW1lZG91dCkKK30KKworZnVuYyBUZXN0VEV4Y2VwdGlvblRpbWVvdXQodCAqdGVzdGluZy5UKSB7CisJdGltZW91dCA6PSAmdGltZW91dHt0cnVlfQorCWV4Y2VwdGlvbiA6PSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKHRpbWVvdXQpCisJaWYgdGltZW91dC5FcnJvcigpICE9IGV4Y2VwdGlvbi5FcnJvcigpIHsKKwkJdC5GYXRhbGYoIkVycm9yIGRpZCBub3QgbWF0Y2g6IGV4cGVjdGVkICVxLCBnb3QgJXEiLCB0aW1lb3V0LkVycm9yKCksIGV4Y2VwdGlvbi5FcnJvcigpKQorCX0KKworCWlmIGV4Y2VwdGlvbi5UeXBlSWQoKSAhPSBUSU1FRF9PVVQgeworCQl0LkZhdGFsZigiVHlwZUlkIHdhcyBub3QgVElNRURfT1VUOiBleHBlY3RlZCAldiwgZ290ICV2IiwgVElNRURfT1VULCBleGNlcHRpb24uVHlwZUlkKCkpCisJfQorfQorCitmdW5jIFRlc3RURXhjZXB0aW9uRU9GKHQgKnRlc3RpbmcuVCkgeworCWV4Y2VwdGlvbiA6PSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGlvLkVPRikKKwlpZiBpby5FT0YuRXJyb3IoKSAhPSBleGNlcHRpb24uRXJyb3IoKSB7CisJCXQuRmF0YWxmKCJFcnJvciBkaWQgbm90IG1hdGNoOiBleHBlY3RlZCAlcSwgZ290ICVxIiwgaW8uRU9GLkVycm9yKCksIGV4Y2VwdGlvbi5FcnJvcigpKQorCX0KKworCWlmIGV4Y2VwdGlvbi5UeXBlSWQoKSAhPSBFTkRfT0ZfRklMRSB7CisJCXQuRmF0YWxmKCJUeXBlSWQgd2FzIG5vdCBFTkRfT0ZfRklMRTogZXhwZWN0ZWQgJXYsIGdvdCAldiIsIEVORF9PRl9GSUxFLCBleGNlcHRpb24uVHlwZUlkKCkpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwNTgwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgVHJhbnNwb3J0cy4KKy8vIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQorLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCisvLyBhIEJ1ZmZlcmVkVHJhbnNwb3J0IGZyb20gdGhlIHVuZGVybHlpbmcgYmFzZSB0cmFuc3BvcnQpCit0eXBlIFRUcmFuc3BvcnRGYWN0b3J5IGludGVyZmFjZSB7CisJR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikKK30KKwordHlwZSB0VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQorCisvLyBSZXR1cm4gYSB3cmFwcGVkIGluc3RhbmNlIG9mIHRoZSBiYXNlIFRyYW5zcG9ydC4KK2Z1bmMgKHAgKnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIHRyYW5zLCBuaWwKK30KKworZnVuYyBOZXdUVHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJnRUcmFuc3BvcnRGYWN0b3J5e30KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjc4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImlvIgorCSJuZXQiCisJInN0cmNvbnYiCisJInRlc3RpbmciCispCisKK2NvbnN0IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFID0gNDA5NgorCit2YXIgKAorCXRyYW5zcG9ydF9iZGF0YSAgW11ieXRlIC8vIHRlc3QgZGF0YSBmb3Igd3JpdGluZzsgc2FtZSBhcyBkYXRhCisJdHJhbnNwb3J0X2hlYWRlciBtYXBbc3RyaW5nXXN0cmluZworKQorCitmdW5jIGluaXQoKSB7CisJdHJhbnNwb3J0X2JkYXRhID0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCWZvciBpIDo9IDA7IGkgPCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRTsgaSsrIHsKKwkJdHJhbnNwb3J0X2JkYXRhW2ldID0gYnl0ZSgoaSArICdhJykgJSAyNTUpCisJfQorCXRyYW5zcG9ydF9oZWFkZXIgPSBtYXBbc3RyaW5nXXN0cmluZ3sia2V5IjogIlVzZXItQWdlbnQiLAorCQkidmFsdWUiOiAiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4yOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMzIuMC4xNjY3LjAgU2FmYXJpLzUzNy4zNiJ9Cit9CisKK2Z1bmMgVHJhbnNwb3J0VGVzdCh0ICp0ZXN0aW5nLlQsIHdyaXRlVHJhbnMgVFRyYW5zcG9ydCwgcmVhZFRyYW5zIFRUcmFuc3BvcnQpIHsKKwlidWYgOj0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCWlmICF3cml0ZVRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBub3Qgb3BlbjogJXMiLCB3cml0ZVRyYW5zLCB3cml0ZVRyYW5zKQorCX0KKwlpZiAhcmVhZFRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBub3Qgb3BlbjogJXMiLCByZWFkVHJhbnMsIHJlYWRUcmFucykKKwl9CisJXywgZXJyIDo9IHdyaXRlVHJhbnMuV3JpdGUodHJhbnNwb3J0X2JkYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKKwl9CisJZXJyID0gd3JpdGVUcmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgb2YgYmluYXJ5IGRhdGE6ICVzIiwgd3JpdGVUcmFucywgZXJyKQorCX0KKwluLCBlcnIgOj0gaW8uUmVhZEZ1bGwocmVhZFRyYW5zLCBidWYpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHJlYWQgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHJlYWRUcmFucywgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUsIGVycikKKwl9CisJaWYgbiAhPSBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgcmVhZCBvbmx5ICVkIGluc3RlYWQgb2YgJWQgYnl0ZXMgb2YgYmluYXJ5IGRhdGEiLCByZWFkVHJhbnMsIG4sIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBidWYgeworCQlpZiB2ICE9IHRyYW5zcG9ydF9iZGF0YVtrXSB7CisJCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIHJlYWQgJWQgaW5zdGVhZCBvZiAlZCBmb3IgaW5kZXggJWQgb2YgYmluYXJ5IGRhdGEgMiIsIHJlYWRUcmFucywgdiwgdHJhbnNwb3J0X2JkYXRhW2tdLCBrKQorCQl9CisJfQorCV8sIGVyciA9IHdyaXRlVHJhbnMuV3JpdGUodHJhbnNwb3J0X2JkYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSAyIG9mIGxlbmd0aCAlZDogJXMiLCB3cml0ZVRyYW5zLCBsZW4odHJhbnNwb3J0X2JkYXRhKSwgZXJyKQorCX0KKwllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBmbHVzaCB3cml0ZSBiaW5hcnkgZGF0YSAyOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKKwl9CisJYnVmID0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCXJlYWQgOj0gMQorCWZvciBuID0gMDsgbiA8IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFICYmIHJlYWQgIT0gMDsgeworCQlyZWFkLCBlcnIgPSByZWFkVHJhbnMuUmVhZChidWZbbjpdKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHJlYWQgYmluYXJ5IGRhdGEgMiBvZiB0b3RhbCBsZW5ndGggJWQgZnJvbSBvZmZzZXQgJWQ6ICVzIiwgcmVhZFRyYW5zLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSwgbiwgZXJyKQorCQl9CisJCW4gKz0gcmVhZAorCX0KKwlpZiBuICE9IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZWFkIG9ubHkgJWQgaW5zdGVhZCBvZiAlZCBieXRlcyBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCBuLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgYnVmIHsKKwkJaWYgdiAhPSB0cmFuc3BvcnRfYmRhdGFba10geworCQkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCByZWFkICVkIGluc3RlYWQgb2YgJWQgZm9yIGluZGV4ICVkIG9mIGJpbmFyeSBkYXRhIDIiLCByZWFkVHJhbnMsIHYsIHRyYW5zcG9ydF9iZGF0YVtrXSwgaykKKwkJfQorCX0KK30KKworZnVuYyBUcmFuc3BvcnRIZWFkZXJUZXN0KHQgKnRlc3RpbmcuVCwgd3JpdGVUcmFucyBUVHJhbnNwb3J0LCByZWFkVHJhbnMgVFRyYW5zcG9ydCkgeworCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCisJaWYgIXdyaXRlVHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIG5vdCBvcGVuOiAlcyIsIHdyaXRlVHJhbnMsIHdyaXRlVHJhbnMpCisJfQorCWlmICFyZWFkVHJhbnMuSXNPcGVuKCkgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIG5vdCBvcGVuOiAlcyIsIHJlYWRUcmFucywgcmVhZFRyYW5zKQorCX0KKwkvLyBOZWVkIHRvIGFzc2VydCB0eXBlIG9mIFRUcmFuc3BvcnQgdG8gVEh0dHBDbGllbnQgdG8gZXhwb3NlIHRoZSBTZXR0ZXIKKwlodHRwV1Bvc3RUcmFucyA6PSB3cml0ZVRyYW5zLigqVEh0dHBDbGllbnQpCisJaHR0cFdQb3N0VHJhbnMuU2V0SGVhZGVyKHRyYW5zcG9ydF9oZWFkZXJbImtleSJdLCB0cmFuc3BvcnRfaGVhZGVyWyJ2YWx1ZSJdKQorCisJXywgZXJyIDo9IHdyaXRlVHJhbnMuV3JpdGUodHJhbnNwb3J0X2JkYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKKwl9CisJZXJyID0gd3JpdGVUcmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgb2YgYmluYXJ5IGRhdGE6ICVzIiwgd3JpdGVUcmFucywgZXJyKQorCX0KKwkvLyBOZWVkIHRvIGFzc2VydCB0eXBlIG9mIFRUcmFuc3BvcnQgdG8gVEh0dHBDbGllbnQgdG8gZXhwb3NlIHRoZSBHZXR0ZXIKKwlodHRwUlBvc3RUcmFucyA6PSByZWFkVHJhbnMuKCpUSHR0cENsaWVudCkKKwlyZWFkSGVhZGVyIDo9IGh0dHBSUG9zdFRyYW5zLkdldEhlYWRlcih0cmFuc3BvcnRfaGVhZGVyWyJrZXkiXSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgcmVhZCBIVFRQIEhlYWRlciBWYWx1ZSIsIGh0dHBSUG9zdFRyYW5zKQorCX0KKworCWlmIHRyYW5zcG9ydF9oZWFkZXJbInZhbHVlIl0gIT0gcmVhZEhlYWRlciB7CisJCXQuRXJyb3JmKCJFeHBlY3RlZCBIVFRQIEhlYWRlciBWYWx1ZSAlcywgZ290ICVzIiwgdHJhbnNwb3J0X2hlYWRlclsidmFsdWUiXSwgcmVhZEhlYWRlcikKKwl9CisJbiwgZXJyIDo9IGlvLlJlYWRGdWxsKHJlYWRUcmFucywgYnVmKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCByZWFkVHJhbnMsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFLCBlcnIpCisJfQorCWlmIG4gIT0gVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIHJlYWQgb25seSAlZCBpbnN0ZWFkIG9mICVkIGJ5dGVzIG9mIGJpbmFyeSBkYXRhIiwgcmVhZFRyYW5zLCBuLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgYnVmIHsKKwkJaWYgdiAhPSB0cmFuc3BvcnRfYmRhdGFba10geworCQkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCByZWFkICVkIGluc3RlYWQgb2YgJWQgZm9yIGluZGV4ICVkIG9mIGJpbmFyeSBkYXRhIDIiLCByZWFkVHJhbnMsIHYsIHRyYW5zcG9ydF9iZGF0YVtrXSwgaykKKwkJfQorCX0KK30KKworZnVuYyBDbG9zZVRyYW5zcG9ydHModCAqdGVzdGluZy5ULCByZWFkVHJhbnMgVFRyYW5zcG9ydCwgd3JpdGVUcmFucyBUVHJhbnNwb3J0KSB7CisJZXJyIDo9IHJlYWRUcmFucy5DbG9zZSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGNsb3NlIHJlYWQgdHJhbnNwb3J0OiAlcyIsIHJlYWRUcmFucywgZXJyKQorCX0KKwlpZiB3cml0ZVRyYW5zICE9IHJlYWRUcmFucyB7CisJCWVyciA9IHdyaXRlVHJhbnMuQ2xvc2UoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGNsb3NlIHdyaXRlIHRyYW5zcG9ydDogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCisJCX0KKwl9Cit9CisKK2Z1bmMgRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoc3RhcnRQb3J0IGludCkgKG5ldC5BZGRyLCBlcnJvcikgeworCWZvciBpIDo9IHN0YXJ0UG9ydDsgaSA8IDY1NTM1OyBpKysgeworCQlzIDo9ICIxMjcuMC4wLjE6IiArIHN0cmNvbnYuSXRvYShpKQorCQlsLCBlcnIgOj0gbmV0Lkxpc3RlbigidGNwIiwgcykKKwkJaWYgZXJyID09IG5pbCB7CisJCQlsLkNsb3NlKCkKKwkJCXJldHVybiBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIHMpCisJCX0KKwl9CisJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJDb3VsZCBub3QgZmluZCBhdmFpbGFibGUgc2VydmVyIHBvcnQiKQorfQorCitmdW5jIHZhbHVlSW5TbGljZSh2YWx1ZSBzdHJpbmcsIHNsaWNlIFtdc3RyaW5nKSBib29sIHsKKwlmb3IgXywgdiA6PSByYW5nZSBzbGljZSB7CisJCWlmIHZhbHVlID09IHYgeworCQkJcmV0dXJuIHRydWUKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2UKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHlwZS5nbyBiL2xpYi9nby90aHJpZnQvdHlwZS5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkyZmZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC90eXBlLmdvCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gVHlwZSBjb25zdGFudHMgaW4gdGhlIFRocmlmdCBwcm90b2NvbAordHlwZSBUVHlwZSBieXRlCisKK2NvbnN0ICgKKwlTVE9QICAgPSAwCisJVk9JRCAgID0gMQorCUJPT0wgICA9IDIKKwlCWVRFICAgPSAzCisJSTA4ICAgID0gMworCURPVUJMRSA9IDQKKwlJMTYgICAgPSA2CisJSTMyICAgID0gOAorCUk2NCAgICA9IDEwCisJU1RSSU5HID0gMTEKKwlVVEY3ICAgPSAxMQorCVNUUlVDVCA9IDEyCisJTUFQICAgID0gMTMKKwlTRVQgICAgPSAxNAorCUxJU1QgICA9IDE1CisJVVRGOCAgID0gMTYKKwlVVEYxNiAgPSAxNworCS8vQklOQVJZID0gMTggICB3cm9uZyBhbmQgdW51c3VlZAorKQorCit2YXIgdHlwZU5hbWVzID0gbWFwW2ludF1zdHJpbmd7CisJU1RPUDogICAiU1RPUCIsCisJVk9JRDogICAiVk9JRCIsCisJQk9PTDogICAiQk9PTCIsCisJQllURTogICAiQllURSIsCisJRE9VQkxFOiAiRE9VQkxFIiwKKwlJMTY6ICAgICJJMTYiLAorCUkzMjogICAgIkkzMiIsCisJSTY0OiAgICAiSTY0IiwKKwlTVFJJTkc6ICJTVFJJTkciLAorCVNUUlVDVDogIlNUUlVDVCIsCisJTUFQOiAgICAiTUFQIiwKKwlTRVQ6ICAgICJTRVQiLAorCUxJU1Q6ICAgIkxJU1QiLAorCVVURjg6ICAgIlVURjgiLAorCVVURjE2OiAgIlVURjE2IiwKK30KKworZnVuYyAocCBUVHlwZSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlpZiBzLCBvayA6PSB0eXBlTmFtZXNbaW50KHApXTsgb2sgeworCQlyZXR1cm4gcworCX0KKwlyZXR1cm4gIlVua25vd24iCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q0MjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCisJImNvbnRleHQiCisJImlvIgorCSJsb2ciCispCisKKy8vIFRabGliVHJhbnNwb3J0RmFjdG9yeSBpcyBhIGZhY3RvcnkgZm9yIFRabGliVHJhbnNwb3J0IGluc3RhbmNlcwordHlwZSBUWmxpYlRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlsZXZlbCAgIGludAorCWZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkKK30KKworLy8gVFpsaWJUcmFuc3BvcnQgaXMgYSBUVHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRoYXQgbWFrZXMgdXNlIG9mIHpsaWIgY29tcHJlc3Npb24uCit0eXBlIFRabGliVHJhbnNwb3J0IHN0cnVjdCB7CisJcmVhZGVyICAgIGlvLlJlYWRDbG9zZXIKKwl0cmFuc3BvcnQgVFRyYW5zcG9ydAorCXdyaXRlciAgICAqemxpYi5Xcml0ZXIKK30KKworLy8gR2V0VHJhbnNwb3J0IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTmV3VFpsaWJUcmFuc3BvcnQKK2Z1bmMgKHAgKlRabGliVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCWlmIHAuZmFjdG9yeSAhPSBuaWwgeworCQkvLyB3cmFwIG90aGVyIGZhY3RvcnkKKwkJdmFyIGVyciBlcnJvcgorCQl0cmFucywgZXJyID0gcC5mYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFucykKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gbmlsLCBlcnIKKwkJfQorCX0KKwlyZXR1cm4gTmV3VFpsaWJUcmFuc3BvcnQodHJhbnMsIHAubGV2ZWwpCit9CisKKy8vIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeSBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeQorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkobGV2ZWwgaW50KSAqVFpsaWJUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlRabGliVHJhbnNwb3J0RmFjdG9yeXtsZXZlbDogbGV2ZWwsIGZhY3Rvcnk6IG5pbH0KK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgVFpsaWJUcmFuc3BvcnRGYWN0b3J5CisvLyBhcyBhIHdyYXBwZXIgb3ZlciBleGlzdGluZyB0cmFuc3BvcnQgZmFjdG9yeQorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeShsZXZlbCBpbnQsIGZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkpICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbCwgZmFjdG9yeTogZmFjdG9yeX0KK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnQgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUWmxpYlRyYW5zcG9ydAorZnVuYyBOZXdUWmxpYlRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0LCBsZXZlbCBpbnQpICgqVFpsaWJUcmFuc3BvcnQsIGVycm9yKSB7CisJdywgZXJyIDo9IHpsaWIuTmV3V3JpdGVyTGV2ZWwodHJhbnMsIGxldmVsKQorCWlmIGVyciAhPSBuaWwgeworCQlsb2cuUHJpbnRsbihlcnIpCisJCXJldHVybiBuaWwsIGVycgorCX0KKworCXJldHVybiAmVFpsaWJUcmFuc3BvcnR7CisJCXdyaXRlcjogICAgdywKKwkJdHJhbnNwb3J0OiB0cmFucywKKwl9LCBuaWwKK30KKworLy8gQ2xvc2UgY2xvc2VzIHRoZSByZWFkZXIgYW5kIHdyaXRlciAoZmx1c2hpbmcgYW55IHVud3JpdHRlbiBkYXRhKSBhbmQgY2xvc2VzCisvLyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgQ2xvc2UoKSBlcnJvciB7CisJaWYgei5yZWFkZXIgIT0gbmlsIHsKKwkJaWYgZXJyIDo9IHoucmVhZGVyLkNsb3NlKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJfQorCWlmIGVyciA6PSB6LndyaXRlci5DbG9zZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gei50cmFuc3BvcnQuQ2xvc2UoKQorfQorCisvLyBGbHVzaCBmbHVzaGVzIHRoZSB3cml0ZXIgYW5kIGl0cyB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJaWYgZXJyIDo9IHoud3JpdGVyLkZsdXNoKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiB6LnRyYW5zcG9ydC5GbHVzaChjdHgpCit9CisKKy8vIElzT3BlbiByZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgSXNPcGVuKCkgYm9vbCB7CisJcmV0dXJuIHoudHJhbnNwb3J0LklzT3BlbigpCit9CisKKy8vIE9wZW4gb3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbgorZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIE9wZW4oKSBlcnJvciB7CisJcmV0dXJuIHoudHJhbnNwb3J0Lk9wZW4oKQorfQorCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgUmVhZChwIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlpZiB6LnJlYWRlciA9PSBuaWwgeworCQlyLCBlcnIgOj0gemxpYi5OZXdSZWFkZXIoei50cmFuc3BvcnQpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCQl9CisJCXoucmVhZGVyID0gcgorCX0KKworCXJldHVybiB6LnJlYWRlci5SZWFkKHApCit9CisKKy8vIFJlbWFpbmluZ0J5dGVzIHJldHVybnMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgdGhhdCBpcyBzdGlsbCB0byBiZQorLy8gcmVhZC4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBSZW1haW5pbmdCeXRlcygpIHVpbnQ2NCB7CisJcmV0dXJuIHoudHJhbnNwb3J0LlJlbWFpbmluZ0J5dGVzKCkKK30KKworZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIFdyaXRlKHAgW11ieXRlKSAoaW50LCBlcnJvcikgeworCXJldHVybiB6LndyaXRlci5Xcml0ZShwKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmYxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb21wcmVzcy96bGliIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RabGliVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgeworCXRyYW5zLCBlcnIgOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCB6bGliLkJlc3RDb21wcmVzc2lvbikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCit0eXBlIER1bW15VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQorCitmdW5jIChwICpEdW1teVRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlcigpLCBuaWwKK30KKworZnVuYyBUZXN0WmxpYkZhY3RvcnlUcmFuc3BvcnRXaXRoRmFjdG9yeSh0ICp0ZXN0aW5nLlQpIHsKKwlmYWN0b3J5IDo9IE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KAorCQl6bGliLkJlc3RDb21wcmVzc2lvbiwKKwkJJkR1bW15VHJhbnNwb3J0RmFjdG9yeXt9LAorCSkKKwlidWZmZXIgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJdHJhbnMsIGVyciA6PSBmYWN0b3J5LkdldFRyYW5zcG9ydChidWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KKworZnVuYyBUZXN0WmxpYkZhY3RvcnlUcmFuc3BvcnRXaXRob3V0RmFjdG9yeSh0ICp0ZXN0aW5nLlQpIHsKKwlmYWN0b3J5IDo9IE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KHpsaWIuQmVzdENvbXByZXNzaW9uLCBuaWwpCisJYnVmZmVyIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXRyYW5zLCBlcnIgOj0gZmFjdG9yeS5HZXRUcmFuc3BvcnQoYnVmZmVyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9SRUFETUUubWQgYi9saWIvaGF4ZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0Yjc3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL1JFQURNRS5tZApAQCAtMCwwICsxLDE2NCBAQAorVGhyaWZ0IEhheGUgU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitVc2luZyBUaHJpZnQgd2l0aCBIYXhlCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworSGF4ZSBzZXR1cAorLS0tLS0tLS0tLS0tLS0tCisKK1RocmlmdCByZXF1aXJlcyBIYXhlIDMuMS4zLiBJbnN0YWxsZXJzIGZvciBXaW5kb3dzIGFuZCBPU1gKK3BsYXRmb3JtcyBhcmUgYXZhaWxhYmxlIGF0IGBodHRwOi8vaGF4ZS5vcmcvZG93bmxvYWRgLiAKKworRGVwZW5kaW5nIG9uIHRoZSBkZXNpcmVkIHRhcmdldHMsIHlvdSBtYXkgaGF2ZSB0byBpbnN0YWxsIHRoZSBhcHByb3ByaWF0ZSBIYXhlTGlicyAKK2FmdGVyIGluc3RhbGxpbmcgSGF4ZSBpdHNlbGYuIEZvciBleGFtcGxlLCBpZiB5b3UgcGxhbiB0byB0YXJnZXQgQyMsIEphdmEgYW5kIEMrKywKK2VudGVyIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWZ0ZXIgaW5zdGFsbGluZyBIYXhlOgorCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4amF2YQorICAgIGhheGVsaWIgaW5zdGFsbCBoeGNzCisKK0ZvciBvdGhlciB0YXJnZXRzLCBwbGVhc2UgY29uc3VsdCB0aGUgSGF4ZSBkb2N1bWVudGF0aW9uIHdoZXRoZXIgb3Igbm90IGFueSBhZGRpdGlvbmFsCit0YXJnZXQgbGlicmFyaWVzIG5lZWQgdG8gYmUgaW5zdGFsbGVkIGFuZCBob3cgdG8gYWNoaWV2ZSB0aGlzLgorCisKK0hheGUgb24gTGludXggCistLS0tLS0tLS0tLS0tLS0KKworRm9yIExpbnV4IHBsYXRmb3JtcyBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGRpc3Ryby1zcGVjaWZpYyBwYWNrYWdlCittYW5hZ2VyLCB3aGVyZSBwb3NzaWJsZS4gTW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQgdGhlIAorSGF4ZSBMaW51eCBkb3dubG9hZCBzZWN0aW9uOiBodHRwOi8vaGF4ZS5vcmcvZG93bmxvYWQvbGludXgKKworSWYgeW91IHJ1biBpbnRvIHRoZSBlcnJvciBtZXNzYWdlIAorCisgICAgVW5jYXVnaHQgZXhjZXB0aW9uIC0gbG9hZC5jKDIzNykgOiBGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5IDogL3Vzci9saWIvbmVrby9yZWdleHAubmRsbCAgCisJKGxpYnBjcmUuc28uMzogY2Fubm90IG9wZW4gc2hhcmVkIG9iamVjdCBmaWxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5KQorCit0aGlzIGNhbiBiZSBzb2x2ZWQgZGVwZW5kaW5nIG9uIHlvdXIgT1NlcyBiaXRuZXNzIGJ5IGVpdGhlcgorCisgICAgc3VkbyBsbiAtc2YgL3Vzci9saWIvbGlicGNyZS5zby4xIC91c3IvbGliL2xpYnBjcmUuc28uMworICAgIHN1ZG8gbGRjb25maWcKKwkKK29yCisKKyAgICBzdWRvIGxuIC1zZiAvdXNyL2xpYjY0L2xpYnBjcmUuc28uMSAvdXNyL2xpYjY0L2xpYnBjcmUuc28uMworICAgIHN1ZG8gbGRjb25maWcKKworVGhyaWZ0IEhheGUgYmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKwkKK1RocmlmdCBIYXhlIGJpbmRpbmdzIGNhbiBiZSBzZXQgdXAgdmlhIHRoZSBgaGF4ZWxpYmAgdG9vbCAgCitlaXRoZXIgZnJvbSB0aGUgb2ZmaWNpYWwgQVNGIHJlcG8sIG9yIHZpYSB0aGUgZ2l0aHViIG1pcnJvci4KKworLSBUbyBzZXQgdXAgYW55ICoqc3RhYmxlIHZlcnNpb24qKiwgY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBicmFuY2ggKGUuZy4gYDEuMC4wYCwgZXRjLik6CisKKyAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0IDEuMC4wIGxpYi9oYXhlYAorICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgMS4wLjAgbGliL2hheGVgCisKKy0gVG8gc2V0IHVwIHRoZSBjdXJyZW50ICoqZGV2ZWxvcG1lbnQgdmVyc2lvbioqLCB1c2UgdGhlIGBtYXN0ZXJgIGJyYW5jaDoKKyAgCisgICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdCBtYXN0ZXIgbGliL2hheGVgCQorICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgbWFzdGVyIGxpYi9oYXhlYAorCitBcyB1c3VhbCwgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGNhbiBiZSB1cGRhdGVkIHVzaW5nIGBoYXhlbGliIHVwZ3JhZGVgIAorb3IgYGhheGVsaWIgdXBkYXRlIHRocmlmdGAuCisKK0luIG9yZGVyIHRvIHdvcmsgd2l0aCBUaHJpZnQsIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUgVGhyaWZ0IGNvbXBpbGVyIAorb3IgYnVpbGQgZnJvbSBzb3VyY2UsIGRlcGVuZGluZyBvbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uIEFwcHJvcHJpYXRlIAorZG93bmxvYWRzIGFuZCBtb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKwkKK1RvIGdldCBzdGFydGVkLCB2aXNpdCB0aGUgL3R1dG9yaWFsL2hheGUgYW5kIC90ZXN0L2hheGUgZGlycyBmb3IgZXhhbXBsZXMuIAorSWYgeW91IGFyZSB1c2luZyBISURFIG9yIHRoZSBGbGFzaERldmVsb3AgSURFLCB5b3UnbGwgZmluZCBhcHByb3ByaWF0ZSAKK3Byb2plY3QgZmlsZXMgaW4gdGhlc2UgZm9sZGVycy4KKworCitDdXJyZW50IHN0YXR1cworPT09PT09PT09PT09PT09PT09PT09PT09CistIHRlc3RlZCB3aXRoIEhheGUgQysrIHRhcmdldAorLSB0ZXN0ZWQgd2l0aCBIYXhlIFBIUCB0YXJnZXQgKGNvbnNvbGUvd2ViIHNlcnZlciwgYmluYXJ5IHByb3RvY29scykKKy0gdHJhbnNwb3J0czogU29ja2V0LCBIVFRQIChzZXJ2ZXJzIHJ1biBpbnNpZGUgUEhQIHNlcnZlci9QSFAgdGFyZ2V0IG9ubHkpLCBTdHJlYW0KKy0gcHJvdG9jb2xzOiBCaW5hcnksIEpTT04sIE11bHRpcGxleCwgQ29tcGFjdAorLSB0dXRvcmlhbCBjbGllbnQgYW5kIHNlcnZlciBhdmFpbGFibGUKKy0gY3Jvc3MtdGVzdCBjbGllbnQgYW5kIHNlcnZlciBhdmFpbGFibGUgCisKKworRnVydGhlciBkZXZlbG9wbWVudHMKKz09PT09PT09PT09PT09PT09PT09PT09PQorLSBpbXByb3ZlIHRvIHdvcmsgd2l0aCBDIywgSmF2YSBhbmQgSmF2YVNjcmlwdCBIYXhlL09wZW5GTCB0YXJnZXRzCistIGltcHJvdmUgdG8gd29yayB3aXRoIG1vcmUgKGlkZWFsbHkgYWxsKSBIYXhlL09wZW5GTCB0YXJnZXRzCistIGFkZCBIVFRQIHNlcnZlciwgdXBkYXRlIHR1dG9yaWFsIGFuZCB0ZXN0cyBhY2NvcmRpbmdseQorCisKK0tub3duIHJlc3RyaWN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09CisKK0FsdGhvdWdoIGRlc2lnbmVkIHdpdGggbWF4aW11bSBwb3J0YWJpbGl0eSBpbiBtaW5kLCBmb3IgdGVjaG5pY2FsIHJlYXNvbnMgc29tZSBwbGF0Zm9ybXMKK21heSBvbmx5IHN1cHBvcnQgcGFydHMgb2YgdGhlIGxpYnJhcnksIG9yIG5vdCBiZSBjb21wYXRpYmxlIGF0IGFsbC4KKworSmF2YXNjcmlwdDoKKy0gdHV0b3JpYWwgZmFpbHMgdG8gYnVpbGQgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCBTeXMuYXJncworCitQSFAgSFRUUCBTZXJ2ZXIgbm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PQorCistIHlvdSBoYXZlIHRvIGltcG9ydCBQSFAgZmlsZXMgZ2VuZXJhdGVkIGJ5IGhheGUgaW50byBQSFAKK2BgYHBocAorcmVxdWlyZV9vbmNlICBkaXJuYW1lKF9fRklMRV9fKSAuICcvYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwJzsKK2BgYAorCistIHRyYWNlKCkgYnkgZGVmYXVsdCBvdXRwdXRzIGludG8gc3Rkb3V0IChodHRwIHJlc3BvbnNlKSwgc28geW91IGhhdmUgdG8gcmVkaXJlY3QgaXQgdG8gc3RkZXJyIG9yIHlvdSBvd24gbG9ncywgc29tZXRoaW5nIGxpa2UKK2BgYGhheGUKKy8vcmVtYXAgdHJhY2UgdG8gZXJyb3IgbG9nCitoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uKHY6RHluYW1pYywgP2luZm9zOmhheGUuUG9zSW5mb3MpIAoreyAKKwkvL3NpbXVsYXRlIG5vcm1hbCB0cmFjZSBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9ibG9iL2RldmVsb3BtZW50L3N0ZC9oYXhlL0xvZy5oeAorCXZhciBuZXdWYWx1ZSA6IER5bmFtaWM7CisJaWYgKGluZm9zICE9IG51bGwgJiYgaW5mb3MuY3VzdG9tUGFyYW1zIT1udWxsKSB7CisJCXZhciBleHRyYTpTdHJpbmcgPSAiIjsKKwkJZm9yKCB2IGluIGluZm9zLmN1c3RvbVBhcmFtcyApCisJCQlleHRyYSArPSAiLCIgKyB2OworCQluZXdWYWx1ZSA9IHYgKyBleHRyYTsKKwl9CisJZWxzZSB7CisJCW5ld1ZhbHVlID0gdjsKKwl9CisJdmFyIG1zZyA9IGluZm9zICE9IG51bGwgPyBpbmZvcy5maWxlTmFtZSArICc6JyArIGluZm9zLmxpbmVOdW1iZXIgKyAnOiAnIDogJyc7CisJU3lzLnN0ZGVycigpLndyaXRlU3RyaW5nKCcke21zZ30ke25ld1ZhbHVlfVxuJyk7Cit9CitgYGAKKworLSB0byBhbGxvdyB0aHJpZnQgc2VydmVyIHRvIHJlYWQvd3JpdGUgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlLCBpdCBzaG91bGQgYmUgcG9pbnRlZCBvdXQgdG8gcGhwIHN0cmVhbXMKK2BgYGhheGUKK3RyYW5zcG9ydCA9CW5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisJCQkJbmV3IFRTdHJlYW1UcmFuc3BvcnQoCisJCQkJCW5ldyBURmlsZVN0cmVhbSgicGhwOi8vaW5wdXQiLCBSZWFkKSwKKwkJCQkJbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9vdXRwdXQiLCBBcHBlbmQpCisJCQkJCSkKKwkJCQkpOworYGBgCisKKy0gVFNpbXBsZVNlcnZlciBkb2Vzbid0IHN0b3AgYWZ0ZXIgZmlyc3QgY2FsbCwgc28gcHJvY2Vzc29yLnByb2Nlc3MoKSBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQsIG9yIHVzZSBydW5PbmNlIHByb3BlcnR5IAorYGBgaGF4ZQordmFyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNmYWN0b3J5LCBwcm90ZmFjdG9yeSk7CitzZXJ2ZXIucnVuT25jZSA9IHRydWU7CitgYGAKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9oYXhlL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9oYXhlbGliLmpzb24gYi9saWIvaGF4ZS9oYXhlbGliLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyYWQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL2hheGVsaWIuanNvbgpAQCAtMCwwICsxLDEyIEBACit7CisJIm5hbWUiOiAidGhyaWZ0IiwKKwkidXJsIiA6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorCSJsaWNlbnNlIjogIkFwYWNoZSIsCisJInRhZ3MiOiBbInRocmlmdCIsICJycGMiLCAic2VyaWFsaXphdGlvbiIsICJjcm9zcyIsICJmcmFtZXdvcmsiXSwKKwkiZGVzY3JpcHRpb24iOiAiSGF4ZSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIGFuZCBzZXJpYWxpemF0aW9uIGZyYW1ld29yayIsCisJInZlcnNpb24iOiAiMS4wLjAiLAorCSJyZWxlYXNlbm90ZSI6ICJMaWNlbnNlZCB1bmRlciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5LiIsCisJImNvbnRyaWJ1dG9ycyI6IFsiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikiXSwKKwkiZGVwZW5kZW5jaWVzIjogeyB9LAorCSJjbGFzc1BhdGgiOiAic3JjIgorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0Fic3RyYWN0TWV0aG9kRXJyb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQWJzdHJhY3RNZXRob2RFcnJvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGI4MTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0Fic3RyYWN0TWV0aG9kRXJyb3IuaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisjaWYgZmxhc2gKK2ltcG9ydCBmbGFzaC5lcnJvcnMuSWxsZWdhbE9wZXJhdGlvbkVycm9yOworI2Vsc2UKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworI2VuZAorCitjbGFzcyBBYnN0cmFjdE1ldGhvZEVycm9yCisjaWYgZmxhc2gKK2V4dGVuZHMgSWxsZWdhbE9wZXJhdGlvbkVycm9yCisjZWxzZQorZXh0ZW5kcyBURXhjZXB0aW9uCisjZW5kCit7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG1lc3NhZ2UgOiBTdHJpbmc9IiIpIHsKKyAgICAgICAgICBzdXBlcigiQXR0ZW1wdCB0byBjYWxsIGFuIGFic3RyYWN0IG1ldGhvZCIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FyZ3VtZW50RXJyb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXJndW1lbnRFcnJvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2EwNGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FyZ3VtZW50RXJyb3IuaHgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisjaWYgISBmbGFzaAorLy8gcHJlZGVmaW5lZCBmb3IgZmxhc2ggb25seQorY2xhc3MgQXJndW1lbnRFcnJvciBleHRlbmRzIFRFeGNlcHRpb24geworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobXNnIDogU3RyaW5nID0gIiIpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICB9Cit9CisjZW5kCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvTGltaXRzLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0xpbWl0cy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVlYzNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0xpbWl0cy5oeApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2NsYXNzIExpbWl0cyB7CisKKyAgICAvLyBIYXhlIGxpbWl0cyBhcmUgbm90IGZpeGVkIHZhbHVlcywgdGhleSBkZXBlbmQgb24gdGhlIHRhcmdldCBwbGF0Zm9ybQorICAgIC8vIEZvciBleGFtcGxlLCBuZWtvIGxpbWl0cyBhbiBpbnQgdG8gMzEgYml0cyBpbnN0ZWFkIG9mIDMyLiBTbyB3ZSBkZXRlY3QKKyAgICAvLyB0aGUgdmFsdWVzIG9uY2UgZHVyaW5nIGludGlhbGlzYXRpb24gaW4gb3JkZXIgdG8KKyAgICAvLyAoYSkgZ2V0IHRoZSByaWdodCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50ICBwbGF0Zm9ybSwgYW5kCisgICAgLy8gKGIpIHByZXZlbnQgdXMgZnJvbSBkZXBlbmRlY2llcyB0byBhIGJ1bmNoIG9mIGRlZmluZXMKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEkzMl9NQVggPSB7CisgICAgICAgIHZhciBsYXN0IDogSW50ID0gMDsKKyAgICAgICAgdmFyIG5leHQgOiBJbnQgPSAwOworICAgICAgICBmb3IoYml0IGluIDAgLi4uIDMyKSB7CisgICAgICAgICAgICBsYXN0ID0gbmV4dDsKKyAgICAgICAgICAgIG5leHQgPSBsYXN0IHwgKDEgPDwgYml0KTsKKyAgICAgICAgICAgIGlmKG5leHQgPCAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGFzdDsgLy8gZmluYWwgdmFsdWUKKyAgICB9CisKKyAgICAvLyBhZGQgd2hhdGV2ZXIgeW91IG5lZWQKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU4NDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oeApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGU7CisKKyAgLyoqCisgICAqIEFwcGxpY2F0aW9uIGxldmVsIGV4Y2VwdGlvbgorICAgKi8KK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIFRBUFBMSUNBVElPTl9FWENFUFRJT05fU1RSVUNUID0geyBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7IH07CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIE1FU1NBR0VfRklFTEQgPSB7IG5ldyBURmllbGQoIm1lc3NhZ2UiLCBUVHlwZS5TVFJJTkcsIDEpOyB9OworICAgIHByaXZhdGUgc3RhdGljIHZhciBUWVBFX0ZJRUxEID0geyBuZXcgVEZpZWxkKCJ0eXBlIiwgVFR5cGUuSTMyLCAyKTsgfTsKKworICAgIC8vIFdBUk5JTkc6IFRoZXNlIGFyZSBzdWJqZWN0IHRvIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUsIHNvIHdlIGNhbid0IHVzZSBlbnVtcworICAgIC8vIHdpdGggSGF4ZSAzLjEuMyBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjQ5CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOS05PV04gOiBJbnQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTktOT1dOX01FVEhPRCA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfTUVTU0FHRV9UWVBFIDogSW50ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgV1JPTkdfTUVUSE9EX05BTUUgOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCQURfU0VRVUVOQ0VfSUQgOiBJbnQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBNSVNTSU5HX1JFU1VMVCA6IEludCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVEVSTkFMX0VSUk9SIDogSW50ID0gNjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgUFJPVE9DT0xfRVJST1IgOiBJbnQgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJTlZBTElEX1RSQU5TRk9STSA6IEludCA9IDg7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfUFJPVE9DT0wgOiBJbnQgPSA5OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA6IEludCA9IDEwOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0eXBlIDogSW50ID0gVU5LTk9XTiwgbWVzc2FnZSA6IFN0cmluZyA9ICIiKSB7CisgICAgICBzdXBlcihtZXNzYWdlLCB0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB2YXIgZmllbGQ6VEZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICAgIHZhciBtZXNzYWdlIDogU3RyaW5nID0gbnVsbDsKKyAgICAgIHZhciB0eXBlIDogSW50ID0gVU5LTk9XTjsKKworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChmaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICAgIHR5cGUgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZCB7CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QpOworICAgICAgICBpZiAoZXJyb3JNc2cgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihNRVNTQUdFX0ZJRUxEKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhlcnJvck1zZyk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihUWVBFX0ZJRUxEKTsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoZXJyb3JJRCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGUwYmViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmh4CkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLy8gTWFrZSBzdXJlIHdlIHVzZSBhdCBsZWFzdCAzLjEuMworLy8gU29tZSBMaW51eCBwbGF0Zm9ybXMgaGF2ZSB3YWFhYXkgdG9vIG9sZCBwYWNrYWdlcyBpbiB0aGVpciByZXBvcworLy8gUHJvIFRpcDogTG9vayBhdCBodHRwOi8vb3BlbmZsLmNvbSBmb3IgYSBnb29kIExpbnV4IGluc3RhbGwgc2NyaXB0CisjaWYoIGhheGVfdmVyIDwgMy4xMDMpCisjZXJyb3IgSGF4ZSAzLjEuMyBvciBuZXdlciByZXF1aXJlZCwgc29ycnkhCisjZW5kCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CisKKyAgLyoqCisgICAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KKyAgICoKKyAgICovCitpbnRlcmZhY2UgVEJhc2UgeworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCkgOiBWb2lkOworCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHJvdCBPdXRwdXQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpIDogVm9pZDsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGEgZmllbGQgaXMgY3VycmVudGx5IHNldCBvciB1bnNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZElkIFRoZSBmaWVsZCdzIGlkIHRhZyBhcyBmb3VuZCBpbiB0aGUgSURMLgorICAgICAqLworICAgIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSWQgOiBJbnQpIDogQm9vbDsKKworICAgIC8qKgorICAgICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgaWQuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlCisgICAgICogYXBwcm9wcmlhdGUgImJveGVkIiB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZElkIFRoZSBmaWVsZCdzIGlkIHRhZyBhcyBmb3VuZCBpbiB0aGUgSURMLgorICAgICAqLworICAgIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJZCA6IEludCkgOiBEeW5hbWljOworCisgICAgLyoqCisgICAgICogU2V0IGEgZmllbGQncyB2YWx1ZSBieSBpZC4gUHJpbWl0aXZlIHR5cGVzIG11c3QgYmUgImJveGVkIiBpbiB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSBvYmplY3Qgd3JhcHBlciB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCisgICAgICovCisgICAgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElkIDogSW50LCB2YWx1ZSA6IER5bmFtaWMpIDogVm9pZDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URXhjZXB0aW9uLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmYTFmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworY2xhc3MgVEV4Y2VwdGlvbiB7CisKKyAgICBAOmlzVmFyCisgICAgcHVibGljIHZhciBlcnJvcklEKGRlZmF1bHQsbnVsbCkgOiBJbnQ7CisgICAgQDppc1ZhcgorICAgIHB1YmxpYyB2YXIgZXJyb3JNc2coZGVmYXVsdCxudWxsKSA6IFN0cmluZzsKKworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhtc2cgOiBTdHJpbmcgPSAiIiwgaWQgOiBJbnQgPSAwKSB7CisgICAgICAgIGVycm9ySUQgPSBpZDsKKyAgICAgICAgZXJyb3JNc2cgPSBtc2c7CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URmllbGRSZXF1aXJlbWVudFR5cGUuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5YTJjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URmllbGRSZXF1aXJlbWVudFR5cGUuaHgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisgIC8qKgorICAgKiBSZXF1aXJlbWVudCB0eXBlIGNvbnN0YW50cy4KKyAgICoKKyAgICovCitAOmVudW0KK2Fic3RyYWN0IFRGaWVsZFJlcXVpcmVtZW50VHlwZShJbnQpICBmcm9tIEludCB0byBJbnQgIHsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgUkVRVUlSRUQgOiBJbnQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBPUFRJT05BTCA6IEludCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERFRkFVTFQgIDogSW50ID0gMzsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiNmY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yLmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworLyoqCisgKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorICogd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KKyAqLworaW50ZXJmYWNlIFRQcm9jZXNzb3IgeworICAgIGZ1bmN0aW9uIHByb2Nlc3MoaW5wdXQ6VFByb3RvY29sLCBvdXRwdXQ6VFByb3RvY29sKSA6IEJvb2w7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0JpdENvbnZlcnRlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvQml0Q29udmVydGVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGFhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0JpdENvbnZlcnRlci5oeApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworCitjbGFzcyBCaXRDb252ZXJ0ZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBEb3VibGVUb0ludDY0Qml0cyggZGIgOiBGbG9hdCkgOiBJbnQ2NCB7CisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFkZERvdWJsZSggZGIpOworICAgICAgICByZXR1cm4gYnl0ZXNUb0xvbmcoIGJ1Zi5nZXRCeXRlcygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSW50NjRCaXRzVG9Eb3VibGUoIGk2NCA6IEludDY0KSA6IEZsb2F0IHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBidWYuYWRkKCBmaXhlZExvbmdUb0J5dGVzKCBpNjQpKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5nZXRCeXRlcygpLmdldERvdWJsZSgwKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nCisgICAgICogdW50aWwgb2ZmKzcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaXhlZExvbmdUb0J5dGVzKCBuIDogSW50NjQpICA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIGJ1ZiA9IEJ5dGVzLmFsbG9jKDgpOworICAgICAgICAjaWYoIGhheGVfdmVyIDwgMy4yKQorICAgICAgICBidWYuc2V0KCAwLCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggbiwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggMSwgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgOCksICBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCAyLCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAxNiksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDMsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDI0KSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggNCwgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgMzIpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCA1LCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA0MCksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDYsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQ4KSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggNywgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgNTYpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICAjZWxzZQorICAgICAgICBidWYuc2V0KCAwLCBJbnQ2NC5hbmQoIG4sIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDEsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA4KSwgIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDIsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAxNiksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDMsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAyNCksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDQsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAzMiksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDUsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA0MCksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDYsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA0OCksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgIGJ1Zi5zZXQoIDcsIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA1NiksIEludDY0Lm1ha2UoMCwgMHhmZikpLmxvdyk7CisgICAgICAgICNlbmQKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywKKyAgICAgKiBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBieXRlc1RvTG9uZyggYnl0ZXMgOiBCeXRlcykgOiBJbnQ2NCB7CisgICAgICAgIHZhciByZXN1bHQgOiBJbnQ2NCA9IEludDY0Lm1ha2UoMCwgMCk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCg3KSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoNikpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDUpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCg0KSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoMykpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDIpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCgxKSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoMCkpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3RCVEwoIHRlc3QgOiBJbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA6IEJ5dGVzID0gZml4ZWRMb25nVG9CeXRlcyggdGVzdCk7CisgICAgICAgIHZhciBlcmcgPSBieXRlc1RvTG9uZyhidWYpOworICAgICAgICBpZiAoIEludDY0LmNvbXBhcmUoIGVyZywgdGVzdCkgIT0gMCkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIuYnl0ZXNUb0xvbmdUZXN0KCR0ZXN0KSBmYWlsZWQ6ICRlcmcnOworICAgIH0KKyAgICAjZW5kCisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3RQYWlyKCBhIDogRmxvYXQsIGIgOiBJbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ4ID0gRG91YmxlVG9JbnQ2NEJpdHMoYSk7CisgICAgICAgIGlmICggSW50NjQuY29tcGFyZSggYngsIGIpICE9IDApCisgICAgICAgICAgICB0aHJvdyAnQml0Q29udmVydGVyLlRlc3RQYWlyOiBEb3VibGVUb0ludDY0Qml0cygkYSk6IGV4cGVjdGVkICRiLCBnb3QgJGJ4JzsKKyAgICAgICAgdmFyIGF4ID0gSW50NjRCaXRzVG9Eb3VibGUoYik7CisgICAgICAgIGlmKCBheCAhPSBhKQorICAgICAgICAgICAgdGhyb3cgJ0JpdENvbnZlcnRlci5UZXN0UGFpcjogSW50NjRCaXRzVG9Eb3VibGUoJGI6IGV4cGVjdGVkICRhLCBnb3QgICRheCc7CisgICAgfQorICAgICNlbmQKKworCisgICAgI2lmIGRlYnVnCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBVbml0VGVzdCgpIDogVm9pZCB7CisKKyAgICAgICAgLy8gYnl0ZXNUb0xvbmcoKQorICAgICAgICB2YXIgaSA6IEludDsKKyAgICAgICAgVGVzdEJUTCggSW50NjQubWFrZSgwLDApKTsKKyAgICAgICAgZm9yICggaSBpbiAwIC4uLiA2MikgeworICAgICAgICAgICAgVGVzdEJUTCggSW50NjQuc2hsKCBJbnQ2NC5tYWtlKDAsMSksIGkpKTsKKyAgICAgICAgICAgIFRlc3RCVEwoIEludDY0LnN1YiggSW50NjQubWFrZSgwLDApLCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpKTsKKyAgICAgICAgfQorICAgICAgICBUZXN0QlRMKCBJbnQ2NC5tYWtlKDB4N0ZGRkZGRkYsMHhGRkZGRkZGRikpOworICAgICAgICBUZXN0QlRMKCBJbnQ2NC5tYWtlKGNhc3QoMHg4MDAwMDAwMCxJbnQpLDB4MDAwMDAwMDApKTsKKworICAgICAgICAvLyBEb3VibGVUb0ludDY0Qml0czsKKyAgICAgICAgVGVzdFBhaXIoIDEuMDAwMDAwMDAwMDAwMDAwMEUrMDAwLCAgSW50NjQubWFrZShjYXN0KDB4M0ZGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS41MDAwMDAwMDAwMDAwMDAwRSswMDEsICBJbnQ2NC5tYWtlKGNhc3QoMHg0MDJFMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAyLjU1MDAwMDAwMDAwMDAwMDBFKzAwMiwgIEludDY0Lm1ha2UoY2FzdCgweDQwNkZFMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDQuMjk0OTY3Mjk1MDAwMDAwMEUrMDA5LCAgSW50NjQubWFrZShjYXN0KDB4NDFFRkZGRkYsSW50KSxjYXN0KDB4RkZFMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMy45MDYyNTAwMDAwMDAwMDAwRS0wMDMsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRjcwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAyLjMyODMwNjQzNjUzODY5NjNFLTAxMCwgIEludDY0Lm1ha2UoY2FzdCgweDNERjAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzMDAwMEUtMzAwLCAgSW50NjQubWFrZShjYXN0KDB4MDFBQTc0RkUsSW50KSxjYXN0KDB4MUMxRTdFNDUsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTAwRS0xNTAsICBJbnQ2NC5tYWtlKGNhc3QoMHgyMEQwMkEzNixJbnQpLGNhc3QoMHg1ODZEQjRCQixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjVFKzAwMCwgIEludDY0Lm1ha2UoY2FzdCgweDNGRjNDMENBLEludCksY2FzdCgweDQyOEM1OUZBLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2N0UrMDAwLCAgSW50NjQubWFrZShjYXN0KDB4M0ZGM0MwQ0EsSW50KSxjYXN0KDB4NDI4QzU5RkIsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRkYzQzBDQSxJbnQpLGNhc3QoMHg0MjhDNTlGQyxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjlFKzE1MCwgIEludDY0Lm1ha2UoY2FzdCgweDVGMTgyMzQ0LEludCksY2FzdCgweENEM0NERjlGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2OUUrMzAwLCAgSW50NjQubWFrZShjYXN0KDB4N0UzRDdFRTgsSW50KSxjYXN0KDB4QkNCQkQzNTIsSW50KSkpOworICAgICAgICBUZXN0UGFpciggLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCBJbnQ2NC5tYWtlKGNhc3QoMHhGRkVGRkZGRixJbnQpLGNhc3QoMHhGRkZGRkZGRixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgIEludDY0Lm1ha2UoY2FzdCgweDdGRUZGRkZGLEludCksY2FzdCgweEZGRkZGRkZGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDQuOTQwNjU2NDU4NDEyNDY1NEUtMzI0LCAgSW50NjQubWFrZShjYXN0KDB4MDAwMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDEsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMC4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCA0Ljk0MDY1NjQ1ODQxMjQ3RS0zMjQsICAgIEludDY0Lm1ha2UoY2FzdCgweDAwMDAwMDAwLEludCksY2FzdCgweDAwMDAwMDAxLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDMuMjM3ODU5MjEwMDIwNjA5MkUtMzE5LCAgSW50NjQubWFrZShjYXN0KDB4MDAwMDAwMDAsSW50KSxjYXN0KDB4MDAwMEZGRkYsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4zOTA2NzExNjE1NjY5OTU5RS0zMDksICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwRkZGRixJbnQpLGNhc3QoMHhGRkZGRkZGRixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCBNYXRoLk5FR0FUSVZFX0lORklOSVRZLCAgIEludDY0Lm1ha2UoY2FzdCgweEZGRjAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIE1hdGguUE9TSVRJVkVfSU5GSU5JVFksICAgSW50NjQubWFrZShjYXN0KDB4N0ZGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworCisgICAgICAgIC8vIE5hTiBpcyBzcGVjaWFsCisgICAgICAgIHZhciBpNjRuYW4gPSBEb3VibGVUb0ludDY0Qml0cyggTWF0aC5OYU4pOworICAgICAgICB2YXIgaTY0Y21wID0gSW50NjQubWFrZShjYXN0KDB4RkZGODAwMDAsIEludCksIGNhc3QoMHgwMDAwMDAwMCwgSW50KSk7CisgICAgICAgIGlmICggISBNYXRoLmlzTmFOKCBJbnQ2NEJpdHNUb0RvdWJsZSggaTY0Y21wKSkpCisgICAgICAgICAgICB0aHJvdyAnQml0Q29udmVydGVyIE5hTi1UZXN0ICMxOiBleHBlY3RlZCBOYU4nOworCisgICAgICAgIC8vIEZvciBkb3VibGVzLCBhIHF1aWV0IE5hTiBpcyBhIGJpdCBwYXR0ZXJuCisgICAgICAgIC8vIGJldHdlZW4gN0ZGODAwMDAwMDAwMDAwMCBhbmQgN0ZGRkZGRkZGRkZGRkZGRgorICAgICAgICAvLyAgICAgIG9yIEZGRjgwMDAwMDAwMDAwMDAgYW5kIEZGRkZGRkZGRkZGRkZGRkYKKyAgICAgICAgdmFyIG1pbjEgPSBJbnQ2NC5tYWtlKCBjYXN0KDB4N0ZGODAwMDAsIEludCksIGNhc3QoMHgwMDAwMDAwMCwgSW50KSk7CisgICAgICAgIHZhciBtYXgxID0gSW50NjQubWFrZSggY2FzdCgweDdGRkZGRkZGLCBJbnQpLCBjYXN0KDB4RkZGRkZGRkYsIEludCkpOworICAgICAgICB2YXIgbWluMiA9IEludDY0Lm1ha2UoIGNhc3QoMHhGRkY4MDAwMCwgSW50KSwgY2FzdCgweDAwMDAwMDAwLCBJbnQpKTsKKyAgICAgICAgdmFyIG1heDIgPSBJbnQ2NC5tYWtlKCBjYXN0KDB4RkZGRkZGRkYsIEludCksIGNhc3QoMHhGRkZGRkZGRiwgSW50KSk7CisgICAgICAgIHZhciBvazEgPSAgKEludDY0LmNvbXBhcmUoIG1pbjEsIGk2NG5hbikgPD0gMCkgJiYgKEludDY0LmNvbXBhcmUoIGk2NG5hbiwgbWF4MSkgPD0gMCk7CisgICAgICAgIHZhciBvazIgPSAgKEludDY0LmNvbXBhcmUoIG1pbjIsIGk2NG5hbikgPD0gMCkgJiYgKEludDY0LmNvbXBhcmUoIGk2NG5hbiwgbWF4MikgPD0gMCk7CisgICAgICAgIGlmKCAhIChvazEgfHwgb2syKSkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIgTmFOLVRlc3QgIzI6IGZhaWxlZCc7CisgICAgfQorICAgICNlbmQKKworfQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50NjRNYXAuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludDY0TWFwLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDVmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludDY0TWFwLmh4CkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5kcy5JbnRNYXA7CisKKworLy8gSW50NjRNYXAgYWxsb3dzIG1hcHBpbmcgb2YgSW50NjQga2V5cyB0byBhcmJpdHJhcnkgdmFsdWVzLgorLy8gT2JqZWN0TWFwPD4gY2Fubm90IGJlIHVzZWQsIHNpbmNlIHdlIHdhbnQgdG8gY29tcGFyZSBieSB2YWx1ZSwgbm90IGFkZHJlc3MKKworY2xhc3MgSW50NjRNYXA8VD4gaW1wbGVtZW50cyBJTWFwPCBJbnQ2NCwgVD4geworCisgICAgcHJpdmF0ZSB2YXIgU3ViTWFwcyA6IEludE1hcDwgSW50TWFwPCBUPj47ICAvLyBIaSAtPiBMbyAtPiBWYWx1ZQorCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIDogVm9pZCB7CisgICAgICAgIFN1Yk1hcHMgPSBuZXcgSW50TWFwPCBJbnRNYXA8IFQ+PigpOworICAgIH07CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEdldFN1Yk1hcCggaGkgOiBoYXhlLkludDMyLCBjYW5DcmVhdGUgOiBCb29sKSA6IEludE1hcDwgVD4geworICAgICAgICBpZiggU3ViTWFwcy5leGlzdHMoaGkpKSB7CisgICAgICAgICAgICByZXR1cm4gU3ViTWFwcy5nZXQoaGkpOworICAgICAgICB9CisKKyAgICAgICAgaWYoICEgY2FuQ3JlYXRlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IG5ldyBJbnRNYXA8IFQ+KCk7CisgICAgICAgIFN1Yk1hcHMuc2V0KCBoaSwgbG9tYXApOworICAgICAgICByZXR1cm4gbG9tYXA7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEdldExvd01hcCgga2V5IDogaGF4ZS5JbnQ2NCwgY2FuQ3JlYXRlIDogQm9vbCkgOiBJbnRNYXA8IFQ+IHsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgcmV0dXJuIEdldFN1Yk1hcCggSW50NjQuZ2V0SGlnaChrZXkpLCBjYW5DcmVhdGUpOworICAgICAgICAjZWxzZQorICAgICAgICByZXR1cm4gR2V0U3ViTWFwKCBrZXkuaGlnaCwgY2FuQ3JlYXRlKTsKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBHZXRMb3dJbmRleCgga2V5IDogaGF4ZS5JbnQ2NCkgOiBoYXhlLkludDMyIHsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgcmV0dXJuIEludDY0LmdldExvdyhrZXkpOworICAgICAgICAjZWxzZQorICAgICAgICByZXR1cm4ga2V5LmxvdzsKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBOdWxsQ2hlY2soIGtleSA6IGhheGUuSW50NjQpIDogQm9vbCB7CisgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgIHJldHVybiAoa2V5ICE9IG51bGwpOworICAgICAgICAjZWxzZQorICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEludDY0IGlzIG5vdCBudWxsYWJsZSBhbnltb3JlIChpdCBuZXZlciByZWFsbHkgd2FzKQorICAgICAgICAjZW5kCisgICAgfTsKKworCisKKyAgICAvKioKKyAgICAgICAgTWFwcyBga2V5YCB0byBgdmFsdWVgLgorICAgICAgICBJZiBga2V5YCBhbHJlYWR5IGhhcyBhIG1hcHBpbmcsIHRoZSBwcmV2aW91cyB2YWx1ZSBkaXNhcHBlYXJzLgorICAgICAgICBJZiBga2V5YCBpcyBudWxsLCB0aGUgcmVzdWx0IGlzIHVuc3BlY2lmaWVkLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoIGtleSA6IEludDY0LCB2YWx1ZSA6IFQgKSA6IFZvaWQgeworICAgICAgICBpZiggISBOdWxsQ2hlY2soa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gR2V0TG93TWFwKCBrZXksIHRydWUpOworICAgICAgICBsb21hcC5zZXQoIEdldExvd0luZGV4KGtleSksIHZhbHVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IG1hcHBpbmcgb2YgYGtleWAuCisgICAgICAgIElmIG5vIHN1Y2ggbWFwcGluZyBleGlzdHMsIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICAgIElmIGBrZXlgIGlzIG51bGwsIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCisKKyAgICAgICAgTm90ZSB0aGF0IGEgY2hlY2sgbGlrZSBgbWFwLmdldChrZXkpID09IG51bGxgIGNhbiBob2xkIGZvciB0d28gcmVhc29uczoKKworICAgICAgICAgICAgMS4gdGhlIG1hcCBoYXMgbm8gbWFwcGluZyBmb3IgYGtleWAKKyAgICAgICAgICAgIDIuIHRoZSBtYXAgaGFzIGEgbWFwcGluZyB3aXRoIGEgdmFsdWUgb2YgYG51bGxgCisKKyAgICAgICAgSWYgaXQgaXMgaW1wb3J0YW50IHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGNhc2VzLCBgZXhpc3RzKClgIHNob3VsZCBiZQorICAgICAgICB1c2VkLgorCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldCgga2V5IDogSW50NjQpIDogTnVsbDxUPiB7CisgICAgICAgIGlmKCAhIE51bGxDaGVjayhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IEdldExvd01hcCgga2V5LCB0cnVlKTsKKyAgICAgICAgaWYoIGxvbWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvbWFwLmdldCggR2V0TG93SW5kZXgoa2V5KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdHJ1ZSBpZiBga2V5YCBoYXMgYSBtYXBwaW5nLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgIElmIGBrZXlgIGlzIG51bGwsIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGV4aXN0cygga2V5IDogSW50NjQpIDogQm9vbCB7CisgICAgICAgIGlmKCAhIE51bGxDaGVjayhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbG9tYXAgPSBHZXRMb3dNYXAoIGtleSwgdHJ1ZSk7CisgICAgICAgIGlmKCBsb21hcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbG9tYXAuZXhpc3RzKCBHZXRMb3dJbmRleChrZXkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgUmVtb3ZlcyB0aGUgbWFwcGluZyBvZiBga2V5YCBhbmQgcmV0dXJucyB0cnVlIGlmIHN1Y2ggYSBtYXBwaW5nIGV4aXN0ZWQsCisgICAgICAgIGZhbHNlIG90aGVyd2lzZS4gSWYgYGtleWAgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKCBrZXkgOiBJbnQ2NCkgOiBCb29sIHsKKyAgICAgICAgaWYoICEgTnVsbENoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IEdldExvd01hcCgga2V5LCB0cnVlKTsKKyAgICAgICAgaWYoIGxvbWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsb21hcC5yZW1vdmUoIEdldExvd0luZGV4KGtleSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgYW4gSXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBgdGhpc2AgTWFwLgorICAgICAgICBUaGUgb3JkZXIgb2Yga2V5cyBpcyB1bmRlZmluZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGtleXMoKSA6IEl0ZXJhdG9yPEludDY0PiB7CisgICAgICAgIHJldHVybiBuZXcgSW50NjRLZXlJdGVyYXRvcjxUPihTdWJNYXBzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgYHRoaXNgIE1hcC4KKyAgICAgICAgVGhlIG9yZGVyIG9mIHZhbHVlcyBpcyB1bmRlZmluZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCkgOiBJdGVyYXRvcjxUPiB7CisgICAgICAgIHJldHVybiBuZXcgSW50NjRWYWx1ZUl0ZXJhdG9yPFQ+KFN1Yk1hcHMpOworICAgIH0KKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGB0aGlzYCBNYXAuCisgICAgICAgIFRoZSBleGFjdCByZXByZXNlbnRhdGlvbiBkZXBlbmRzIG9uIHRoZSBwbGF0Zm9ybSBhbmQga2V5LXR5cGUuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgICB2YXIgcmVzdWx0IDogU3RyaW5nID0gInsiOworCisgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvcigga2V5IGluIHRoaXMua2V5cygpKSB7CisgICAgICAgICAgICBpZiggZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiwiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQgKz0gIiAiOworICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIHJlc3VsdCArPSBJbnQ2NC50b1N0cihrZXkpICsgJyA9PiAkdmFsdWUnOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdCArICJ9IjsKKyAgICB9CisKK30KKworCisvLyBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIEludDY0TWFwPFQ+CisvLyBhbGwgY2xhc3Mgd2l0aCBtYXRjaGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGl0ZXJhdG9yIChkdWNrIHR5cGluZykKK3ByaXZhdGUgY2xhc3MgSW50NjRNYXBJdGVyYXRvckJhc2U8VD4geworCisgICAgcHJpdmF0ZSB2YXIgU3ViTWFwcyA6IEludE1hcDwgSW50TWFwPCBUPj47ICAvLyBIaSAtPiBMbyAtPiBWYWx1ZQorCisgICAgcHJpdmF0ZSB2YXIgSGlJdGVyYXRvciA6IEl0ZXJhdG9yPCBJbnQ+ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBMb0l0ZXJhdG9yIDogSXRlcmF0b3I8IEludD4gPSBudWxsOworICAgIHByaXZhdGUgdmFyIEN1cnJlbnRIaSA6IEludCA9IDA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBkYXRhIDogSW50TWFwPCBJbnRNYXA8IFQ+PikgOiBWb2lkIHsKKyAgICAgICAgU3ViTWFwcyA9IGRhdGE7CisgICAgICAgIEhpSXRlcmF0b3IgPSBTdWJNYXBzLmtleXMoKTsKKyAgICAgICAgTG9JdGVyYXRvciA9IG51bGw7CisgICAgICAgIEN1cnJlbnRIaSA9IDA7CisgICAgfTsKKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBpdGVyYXRpb24gaXMgY29tcGxldGUsIHRydWUgb3RoZXJ3aXNlLgorCisgICAgICAgIFVzdWFsbHkgaXRlcmF0aW9uIGlzIGNvbnNpZGVyZWQgdG8gYmUgY29tcGxldGUgaWYgYWxsIGVsZW1lbnRzIG9mIHRoZQorICAgICAgICB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlIHdlcmUgaGFuZGxlZCB0aHJvdWdoIGNhbGxzIHRvIG5leHQoKS4gSG93ZXZlciwKKyAgICAgICAgaW4gY3VzdG9tIGl0ZXJhdG9ycyBhbnkgbG9naWMgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb21wbGV0aW9uCisgICAgICAgIHN0YXRlLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNOZXh0KCkgOiBCb29sIHsKKworICAgICAgICBpZiggKExvSXRlcmF0b3IgIT0gbnVsbCkgJiYgTG9JdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUoIChIaUl0ZXJhdG9yICE9IG51bGwpICYmIEhpSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBDdXJyZW50SGkgPSBIaUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIExvSXRlcmF0b3IgPSBTdWJNYXBzLmdldChDdXJyZW50SGkpLmtleXMoKTsKKyAgICAgICAgICAgIGlmKCAoTG9JdGVyYXRvciAhPSBudWxsKSAmJiBMb0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSGlJdGVyYXRvciA9IG51bGw7CisgICAgICAgIExvSXRlcmF0b3IgPSBudWxsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CisKKworLy8gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGZvciBJbnQ2NE1hcDxUPgorLy8gYWxsIGNsYXNzIHdpdGggbWF0Y2hpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCBhcyBpdGVyYXRvciAoZHVjayB0eXBpbmcpCitwcml2YXRlIGNsYXNzIEludDY0S2V5SXRlcmF0b3I8VD5leHRlbmRzIEludDY0TWFwSXRlcmF0b3JCYXNlPFQ+IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGRhdGEgOiBJbnRNYXA8IEludE1hcDwgVD4+KSA6IFZvaWQgeworICAgICAgICBzdXBlcihkYXRhKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgaXRlbSBvZiB0aGUgSXRlcmF0b3IgYW5kIGFkdmFuY2VzIHRvIHRoZSBuZXh0IG9uZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBub3QgcmVxdWlyZWQgdG8gY2hlY2sgaGFzTmV4dCgpIGZpcnN0LiBBIGNhbGwgdG8gdGhpcworICAgICAgICBtZXRob2Qgd2hpbGUgaGFzTmV4dCgpIGlzIGZhbHNlIHlpZWxkcyB1bnNwZWNpZmllZCBiZWhhdmlvci4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV4dCgpIDogSW50NjQgeworICAgICAgICBpZiggaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gSW50NjQubWFrZSggQ3VycmVudEhpLCBMb0l0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyAibm8gbW9yZSBlbGVtZW50cyI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGZvciBJbnQ2NE1hcDxUPgorLy8gYWxsIGNsYXNzIHdpdGggbWF0Y2hpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCBhcyBpdGVyYXRvciAoZHVjayB0eXBpbmcpCitwcml2YXRlIGNsYXNzIEludDY0VmFsdWVJdGVyYXRvcjxUPiBleHRlbmRzIEludDY0TWFwSXRlcmF0b3JCYXNlPFQ+IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGRhdGEgOiBJbnRNYXA8IEludE1hcDwgVD4+KSA6IFZvaWQgeworICAgICAgICBzdXBlcihkYXRhKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgaXRlbSBvZiB0aGUgSXRlcmF0b3IgYW5kIGFkdmFuY2VzIHRvIHRoZSBuZXh0IG9uZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBub3QgcmVxdWlyZWQgdG8gY2hlY2sgaGFzTmV4dCgpIGZpcnN0LiBBIGNhbGwgdG8gdGhpcworICAgICAgICBtZXRob2Qgd2hpbGUgaGFzTmV4dCgpIGlzIGZhbHNlIHlpZWxkcyB1bnNwZWNpZmllZCBiZWhhdmlvci4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV4dCgpIDogVCB7CisgICAgICAgIGlmKCBoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdWJNYXBzLmdldChDdXJyZW50SGkpLmdldChMb0l0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyAibm8gbW9yZSBlbGVtZW50cyI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gRU9GCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludFNldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50U2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTVkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL0ludFNldC5oeApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworCisKK2NsYXNzIEludFNldCB7CisKKyAgICBwcml2YXRlIHZhciBfZWxlbWVudHMgPSBuZXcgaGF4ZS5kcy5JbnRNYXA8SW50PigpOworICAgIHByaXZhdGUgdmFyIF9zaXplIDogSW50ID0gMDsKKyAgICBwdWJsaWMgdmFyIHNpemUoZ2V0LG5ldmVyKSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHZhbHVlcyA6IEFycmF5PEludD4gPSBudWxsKSB7CisgICAgICAgIGlmICggdmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoIHZhbHVlIGluIHZhbHVlcykgeworICAgICAgICAgICAgICAgICBhZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCk6SXRlcmF0b3I8SW50PiB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMua2V5cygpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0cmFjZUFsbCgpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCckX3NpemUgZW50cmllcycpOworICAgICAgICBmb3IoZW50cnkgaW4gdGhpcykgeworICAgICAgICAgICAgdmFyIHllcyA9IGNvbnRhaW5zKGVudHJ5KTsKKyAgICAgICAgICAgIHRyYWNlKCctICRlbnRyeSwgY29udGFpbnMoKSA9ICR5ZXMnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobyA6IEludCkgOiBCb29sIHsKKyAgICAgICAgaWYoIF9lbGVtZW50cy5leGlzdHMobykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSsrOworICAgICAgICBfZWxlbWVudHMuc2V0KG8sX3NpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKSA6IFZvaWQgeworICAgICAgICB3aGlsZSggX3NpemUgPiAwKSB7CisgICAgICAgICAgICByZW1vdmUoIF9lbGVtZW50cy5rZXlzKCkubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhvIDogSW50KSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmV4aXN0cyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUobyA6IEludCkgOiBCb29sIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zKG8pKSB7CisgICAgICAgICAgICBfZWxlbWVudHMucmVtb3ZlKG8pOworICAgICAgICAgICAgX3NpemUtLTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoKSA6IEFycmF5PEludD4geworICAgICAgICB2YXIgcmV0IDogQXJyYXk8SW50PiA9IG5ldyBBcnJheTxJbnQ+KCk7CisgICAgICAgIGZvciAoa2V5IGluIF9lbGVtZW50cy5rZXlzKCkpIHsKKyAgICAgICAgICAgIHJldC5wdXNoKGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3NpemUoKSA6IEludCB7CisgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICB9Cit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9PYmplY3RTZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL09iamVjdFNldC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Y3MmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9PYmplY3RTZXQuaHgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKKworaW1wb3J0IE1hcDsKKworCitjbGFzcyBPYmplY3RTZXQ8Sz4geworCisgICAgcHJpdmF0ZSB2YXIgX2VsZW1lbnRzID0gbmV3IGhheGUuZHMuT2JqZWN0TWFwPEssSW50PigpOworICAgIHByaXZhdGUgdmFyIF9zaXplIDogSW50ID0gMDsKKyAgICBwdWJsaWMgdmFyIHNpemUoZ2V0LG5ldmVyKSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHZhbHVlcyA6IEFycmF5PEs+ID0gbnVsbCkgeworICAgICAgICBpZiAoIHZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKCB2YWx1ZSBpbiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgYWRkKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpdGVyYXRvcigpOkl0ZXJhdG9yPEs+IHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRyYWNlQWxsKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoJyRfc2l6ZSBlbnRyaWVzJyk7CisgICAgICAgIGZvcihlbnRyeSBpbiB0aGlzKSB7CisgICAgICAgICAgICB2YXIgeWVzID0gY29udGFpbnMoZW50cnkpOworICAgICAgICAgICAgdHJhY2UoJy0gJGVudHJ5LCBjb250YWlucygpID0gJHllcycpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZChvIDogSykgOiBCb29sIHsKKyAgICAgICAgaWYoIF9lbGVtZW50cy5leGlzdHMobykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSsrOworICAgICAgICBfZWxlbWVudHMuc2V0KG8sX3NpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKSA6IFZvaWQgeworICAgICAgICB3aGlsZSggX3NpemUgPiAwKSB7CisgICAgICAgICAgICByZW1vdmUoIF9lbGVtZW50cy5rZXlzKCkubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhvIDogSykgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5leGlzdHMobyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX3NpemUgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKG8gOiBLKSA6IEJvb2wgeworICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgIF9lbGVtZW50cy5yZW1vdmUobyk7CisgICAgICAgICAgICBfc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9BcnJheSgpIDogQXJyYXk8Sz4geworICAgICAgICB2YXIgcmV0IDogQXJyYXk8Sz4gPSBuZXcgQXJyYXk8Sz4oKTsKKyAgICAgICAgZm9yIChrZXkgaW4gX2VsZW1lbnRzLmtleXMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2l6ZSgpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1N0cmluZ1NldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvU3RyaW5nU2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzBkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1N0cmluZ1NldC5oeApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworCisKK2NsYXNzIFN0cmluZ1NldCB7CisKKyAgICBwcml2YXRlIHZhciBfZWxlbWVudHMgPSBuZXcgaGF4ZS5kcy5TdHJpbmdNYXA8SW50PigpOworICAgIHByaXZhdGUgdmFyIF9zaXplIDogSW50ID0gMDsKKyAgICBwdWJsaWMgdmFyIHNpemUoZ2V0LG5ldmVyKSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHZhbHVlcyA6IEFycmF5PFN0cmluZz4gPSBudWxsKSB7CisgICAgICAgIGlmICggdmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoIHZhbHVlIGluIHZhbHVlcykgeworICAgICAgICAgICAgICAgICBhZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCk6SXRlcmF0b3I8U3RyaW5nPiB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMua2V5cygpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0cmFjZUFsbCgpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCckX3NpemUgZW50cmllcycpOworICAgICAgICBmb3IoZW50cnkgaW4gdGhpcykgeworICAgICAgICAgICAgdmFyIHllcyA9IGNvbnRhaW5zKGVudHJ5KTsKKyAgICAgICAgICAgIHRyYWNlKCctICRlbnRyeSwgY29udGFpbnMoKSA9ICR5ZXMnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobyA6IFN0cmluZykgOiBCb29sIHsKKyAgICAgICAgaWYoIF9lbGVtZW50cy5leGlzdHMobykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBfc2l6ZSsrOworICAgICAgICBfZWxlbWVudHMuc2V0KG8sX3NpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKSA6IFZvaWQgeworICAgICAgICB3aGlsZSggX3NpemUgPiAwKSB7CisgICAgICAgICAgICByZW1vdmUoIF9lbGVtZW50cy5rZXlzKCkubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhvIDogU3RyaW5nKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmV4aXN0cyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUobyA6IFN0cmluZykgOiBCb29sIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zKG8pKSB7CisgICAgICAgICAgICBfZWxlbWVudHMucmVtb3ZlKG8pOworICAgICAgICAgICAgX3NpemUtLTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoKSA6IEFycmF5PFN0cmluZz4geworICAgICAgICB2YXIgcmV0IDogQXJyYXk8U3RyaW5nPiA9IG5ldyBBcnJheTxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoa2V5IGluIF9lbGVtZW50cy5rZXlzKCkpIHsKKyAgICAgICAgICAgIHJldC5wdXNoKGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3NpemUoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiBfc2l6ZTsKKyAgICB9Cit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9aaWdaYWcuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg2MDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9aaWdaYWcuaHgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBoYXhlLkludDY0OworaW1wb3J0IGhheGUuSW50MzI7CisKK2NsYXNzIFppZ1phZyB7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGcm9tSW50KCBuIDogSW50KSA6IFVJbnQgICAgeworICAgICAgICAjaWYgcGhwCisKKyAgICAgICAgcmV0dXJuIGNhc3QoY2FzdChjYXN0KG4sSW50MzIpIDw8IDEsSW50MzIpIF4gY2FzdChjYXN0KG4sSW50MzIpID4+IDMxLEludDMyKSxVSW50KTsKKworICAgICAgICAjZWxzZQorCisgICAgICAgIHJldHVybiBjYXN0KG4gPDwgMSxVSW50KSBeIGNhc3QobiA+PiAzMSxVSW50KTsKKworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUb0ludCggbiA6IFVJbnQpIDogSW50IHsKKyAgICAgICAgI2lmIHBocAorCisgICAgICAgIHZhciBhID0gKDB4N0ZGRkZGRkYgJiBjYXN0KG4gPj4gMSxJbnQpKTsKKyAgICAgICAgdmFyIGIgPSAoY2FzdChuICYgMSxJbnQpKTsKKyAgICAgICAgYiA9IC1iOyAgLy8gd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzUyODgKKyAgICAgICAgcmV0dXJuIGEgXiBiOworCisgICAgICAgICNlbHNlCisKKyAgICAgICAgcmV0dXJuICgweDdGRkZGRkZGICYgY2FzdChuID4+IDEsSW50KSkgXiAoLWNhc3QobiAmIDEsSW50KSk7CisKKyAgICAgICAgI2VuZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEZyb21Mb25nKCBuIDogSW50NjQpIDogSW50NjQgeworICAgICAgICByZXR1cm4gSW50NjQueG9yKCBJbnQ2NC5zaGwobiwgMSksIEludDY0LnNocihuLCA2MykpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBUb0xvbmcoIG4gOiBJbnQ2NCkgOiBJbnQ2NCB7CisgICAgICAgIHJldHVybiBJbnQ2NC54b3IoCisgICAgICAgICAgICBJbnQ2NC5hbmQoCisgICAgICAgICAgICAgICAgSW50NjQuc2hyKG4sIDEpLAorICAgICAgICAgICAgICAgIEludDY0Lm1ha2UoMHg3RkZGRkZGRiwgMHhGRkZGRkZGRikpLAorICAgICAgICAgICAgSW50NjQuc3ViKAorICAgICAgICAgICAgICAgIEludDY0Lm1ha2UoMCwgMCksCisgICAgICAgICAgICAgICAgSW50NjQuYW5kKG4sIEludDY0Lm1ha2UoMCwxKSkpKTsKKyAgICB9CisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3QzMiggdGVzdCA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGEgOiBVSW50ID0gWmlnWmFnLkZyb21JbnQoIHRlc3QpOworICAgICAgICB2YXIgYiA6IEludCA9IFppZ1phZy5Ub0ludChhKTsKKyAgICAgICAgI2lmIHBocAorICAgICAgICB0ZXN0ID0gdGVzdCAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgICAjZW5kCisgICAgICAgIGlmKCB0ZXN0ICE9IGIpCisgICAgICAgICAgICB0aHJvdyAnWmlnWmFnLlRlc3QzMigkdGVzdCkgZmFpbGVkOiBhID0gJGEsIGIgPSAkYic7CisgICAgfQorICAgICNlbmQKKworCisKKyAgICAjaWYgZGVidWcKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBUZXN0NjQoIHRlc3QgOiBoYXhlLkludDY0KSA6IFZvaWQgeworICAgICAgICB2YXIgYSA6IEludDY0ID0gWmlnWmFnLkZyb21Mb25nKCB0ZXN0KTsKKyAgICAgICAgdmFyIGIgOiBJbnQ2NCA9IFppZ1phZy5Ub0xvbmcoYSk7CisgICAgICAgIGlmKCBJbnQ2NC5jb21wYXJlKCB0ZXN0LCBiKSAhPSAwKQorICAgICAgICAgICAgdGhyb3cgJ1ppZ1phZy5UZXN0NjQoJHRlc3QpIGZhaWxlZDogYSA9ICRhLCBiID0gJGInOworICAgIH0KKyAgICAjZW5kCisKKworICAgICNpZiBkZWJ1ZworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVW5pdFRlc3QoKSA6IFZvaWQgeworICAgICAgdmFyIHUxIDogVUludCA9IDB4RkZGRkZGRkU7CisgICAgICB2YXIgdTIgOiBVSW50ID0gMHhGRkZGRkZGRjsKKyAgICAgIHZhciBpMSA6IEludCA9IDIxNDc0ODM2NDc7CisgICAgICB2YXIgaTIgOiBJbnQgPSAtMjE0NzQ4MzY0ODsKKworICAgICAgI2lmIHBocAorICAgICAgaTIgPSBpMiAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgI2VuZAorCisgICAgICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKKyAgICAgIGlmKCBGcm9tSW50KDApICAhPSAwKSB0aHJvdyAncGIgIzEgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KC0xKSAhPSAxKSB0aHJvdyAncGIgIzIgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KDEpICAhPSAyKSB0aHJvdyAncGIgIzMgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KC0yKSAhPSAzKSB0aHJvdyAncGIgIzQgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KGkxKSAhPSB1MSkgdGhyb3cgJ3BiICM1IHRvIFppZ1phZyc7CisgICAgICBpZiggRnJvbUludChpMikgIT0gdTIpIHRocm93ICdwYiAjNiB0byBaaWdaYWcnOworCisgICAgICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKKyAgICAgIGlmKCBUb0ludCgwKSAhPSAwKSB0aHJvdyAncGIgIzEgZnJvbSBaaWdaYWcnOworICAgICAgaWYoIFRvSW50KDEpICE9IC0xKSB0aHJvdyAncGIgIzIgZnJvbSBaaWdaYWcnOworICAgICAgaWYoIFRvSW50KDIpICE9IDEpIHRocm93ICdwYiAjMyBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQoMykgIT0gLTIpIHRocm93ICdwYiAjNCBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQodTEpICE9IGkxKSB0aHJvdyAncGIgIzUgZnJvbSBaaWdaYWcsIGdvdCAke1RvSW50KHUxKX0gZXhwZWN0ZWQgJGkxJzsKKyAgICAgIGlmKCBUb0ludCh1MikgIT0gaTIpIHRocm93ICdwYiAjNiBmcm9tIFppZ1phZywgZ290ICR7VG9JbnQodTIpfSBleHBlY3RlZCAkaTInOworCisgICAgICAvLyBiYWNrIGFuZCBmb3J0aCAzMgorICAgICAgVGVzdDMyKCAwKTsKKyAgICAgIGZvciggaSBpbiAwIC4uLiAzMCkgeworICAgICAgICBUZXN0MzIoIDEgPDwgaSk7CisgICAgICAgIFRlc3QzMiggLSgxICA8PCBpKSk7CisgICAgICB9CisgICAgICBUZXN0MzIoIDB4N0ZGRkZGRkYpOworICAgICAgVGVzdDMyKCBjYXN0KDB4ODAwMDAwMDAsSW50KSk7CisKKyAgICAgIC8vIGJhY2sgYW5kIGZvcnRoIDY0CisgICAgICBUZXN0NjQoIEludDY0Lm1ha2UoMCwwKSk7CisgICAgICBmb3IoIGkgaW4gMCAuLi4gNjIpIHsKKyAgICAgICAgVGVzdDY0KCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpOworICAgICAgICBUZXN0NjQoIEludDY0LnN1YiggSW50NjQubWFrZSgwLDApLCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpKTsKKyAgICAgIH0KKyAgICAgIFRlc3Q2NCggSW50NjQubWFrZSgweDdGRkZGRkZGLDB4RkZGRkZGRkYpKTsKKyAgICAgIFRlc3Q2NCggSW50NjQubWFrZShjYXN0KDB4ODAwMDAwMDAsSW50KSwweDAwMDAwMDAwKSk7CisgICAgfQorICAgICNlbmQKK30KKworICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGIxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuaHgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YTsKKworaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7CisKKy8qKgorKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgbWV0YSBkYXRhIGFib3V0IHRocmlmdCBmaWVsZHMuIEV2ZXJ5IGZpZWxkIGluIGEKKyogYSBzdHJ1Y3Qgc2hvdWxkIGhhdmUgYSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZGVzY3JpYmluZyBpdC4KKyoKKyovCitjbGFzcyBGaWVsZE1ldGFEYXRhIHsKKworICBwdWJsaWMgdmFyIGZpZWxkTmFtZSA6IFN0cmluZzsKKyAgcHVibGljIHZhciByZXF1aXJlbWVudFR5cGUgOiBJbnQ7CisgIHB1YmxpYyB2YXIgdmFsdWVNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgcHJpdmF0ZSBzdGF0aWMgdmFyIHN0cnVjdE1hcDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsKKworICBwdWJsaWMgZnVuY3Rpb24gRmllbGRNZXRhRGF0YShuYW1lIDogU3RyaW5nLCByZXEgOiBJbnQsIHZNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEpIHsKKyAgICB0aGlzLmZpZWxkTmFtZSA9IG5hbWU7CisgICAgdGhpcy5yZXF1aXJlbWVudFR5cGUgPSByZXE7CisgICAgdGhpcy52YWx1ZU1ldGFEYXRhID0gdk1ldGFEYXRhOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChzQ2xhc3M6Q2xhc3MsIG1hcDpEaWN0aW9uYXJ5KSA6IFZvaWR7CisgICAgc3RydWN0TWFwW3NDbGFzc10gPSBtYXA7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIG1hcCB3aXRoIG1ldGFkYXRhIChpLmUuIGluc3RhbmNlcyBvZiBGaWVsZE1ldGFEYXRhKSB0aGF0CisgICAqIGRlc2NyaWJlIHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIGNsYXNzLgorICAgKgorICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3RydWN0TWV0YURhdGFNYXAoc0NsYXNzOkNsYXNzKTpEaWN0aW9uYXJ5IHsKKyAgICByZXR1cm4gc3RydWN0TWFwW3NDbGFzc107CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3OWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworLyoqCisgKiBGaWVsZFZhbHVlTWV0YURhdGEgYW5kIGNvbGxlY3Rpb24gb2Ygc3ViY2xhc3NlcyB0byBzdG9yZSBtZXRhZGF0YSBhYm91dAorICogdGhlIHZhbHVlKHMpIG9mIGEgZmllbGQKKyAqLworY2xhc3MgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICBwdWJsaWMgdmFyIHR5cGUgOiBJbnQ7CisKKyAgcHVibGljIGZ1bmN0aW9uIEZpZWxkVmFsdWVNZXRhRGF0YSh0eXBlIDogSW50KSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cnVjdCgpIDogQm9vbCB7CisgICAgcmV0dXJuIHR5cGUgPT0gVFR5cGUuU1RSVUNUOworICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIGlzQ29udGFpbmVyKCkgOiBCb29sIHsKKyAgICByZXR1cm4gdHlwZSA9PSBUVHlwZS5MSVNUIHx8IHR5cGUgPT0gVFR5cGUuTUFQIHx8IHR5cGUgPT0gVFR5cGUuU0VUOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0xpc3RNZXRhRGF0YS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2EzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0xpc3RNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBMaXN0TWV0YURhdGEgZXh0ZW5kcyBGaWVsZFZhbHVlTWV0YURhdGEgeworCisgICAgcHVibGljIHZhciBlbGVtTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhOworCisgICAgcHVibGljIGZ1bmN0aW9uIExpc3RNZXRhRGF0YSh0eXBlIDogSW50LCBlTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhKSB7CisgICAgICBzdXBlcih0eXBlKTsKKyAgICAgIHRoaXMuZWxlbU1ldGFEYXRhID0gZU1ldGFEYXRhOworICAgIH0KK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9NYXBNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDYzZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9NYXBNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBNYXBNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIGtleU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YTsKKyAgICBwdWJsaWMgdmFyIHZhbHVlTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhOworCisgICAgcHVibGljIGZ1bmN0aW9uIE1hcE1ldGFEYXRhKHR5cGUgOiBJbnQsIGtNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEsIHZNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEpIHsKKyAgICAgIHN1cGVyKHR5cGUpOworICAgICAgdGhpcy5rZXlNZXRhRGF0YSA9IGtNZXRhRGF0YTsKKyAgICAgIHRoaXMudmFsdWVNZXRhRGF0YSA9IHZNZXRhRGF0YTsKKyAgICB9Cit9CisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TZXRNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzM2N2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TZXRNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBTZXRNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1NZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU2V0TWV0YURhdGEodHlwZSA6IEludCwgZU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSkgeworICAgICAgc3VwZXIodHlwZSk7CisgICAgICB0aGlzLmVsZW1NZXRhRGF0YSA9IGVNZXRhRGF0YTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TdHJ1Y3RNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIyZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TdHJ1Y3RNZXRhRGF0YS5oeApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitjbGFzcyBTdHJ1Y3RNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIHN0cnVjdENsYXNzOkNsYXNzOworCisgICAgcHVibGljIGZ1bmN0aW9uIFN0cnVjdE1ldGFEYXRhKHR5cGUgOiBJbnQsIHNDbGFzczpDbGFzcykgeworICAgICAgc3VwZXIodHlwZSk7CisgICAgICB0aGlzLnN0cnVjdENsYXNzID0gc0NsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjI5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmh4CkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorKiBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUmVjdXJzaW9uVHJhY2tlciBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgQU5PTllNT1VTX1NUUlVDVDpUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVkVSU0lPTl9NQVNLIDogaGF4ZS5JbnQzMiA9IDB4ZmZmZjAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBWRVJTSU9OXzEgOiBoYXhlLkludDMyID0gMHg4MDAxMDAwMDsKKworICAgIHByaXZhdGUgdmFyIHN0cmljdFJlYWRfIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgdmFyIHN0cmljdFdyaXRlXyA6IEJvb2wgPSB0cnVlOworICAgIHByaXZhdGUgdmFyIHRyYW5zXyA6IFRUcmFuc3BvcnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcodHJhbnM6VFRyYW5zcG9ydCwgc3RyaWN0UmVhZCA6IEJvb2w9ZmFsc2UsIHN0cmljdFdyaXRlIDogQm9vbD10cnVlKSB7CisgICAgICB0cmFuc18gPSB0cmFuczsKKyAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKTpUVHJhbnNwb3J0IHsKKyAgICAgIHJldHVybiB0cmFuc187CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2U6VE1lc3NhZ2UpIDogVm9pZCB7CisgICAgICAgIGlmIChzdHJpY3RXcml0ZV8pIHsKKyAgICAgICAgICB2YXIgdmVyc2lvbiA6IEludCA9IFZFUlNJT05fMSB8IG1lc3NhZ2UudHlwZTsKKyAgICAgICAgICB3cml0ZUkzMih2ZXJzaW9uKTsKKyAgICAgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICAgICAgd3JpdGVCeXRlKG1lc3NhZ2UudHlwZSk7CisgICAgICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3Q6VFN0cnVjdCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oZmllbGQ6VEZpZWxkKSA6IFZvaWQgeworICAgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOworICAgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKSA6IFZvaWQgeworICAgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQgeworICAgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKKyAgICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKKyAgICAgIHdyaXRlSTMyKG1hcC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbihsaXN0OlRMaXN0KSA6IFZvaWQgeworICAgICAgICB3cml0ZUJ5dGUobGlzdC5lbGVtVHlwZSk7CisgICAgICAgIHdyaXRlSTMyKGxpc3Quc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oc2V0OlRTZXQpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnl0ZShzZXQuZWxlbVR5cGUpOworICAgICAgICB3cml0ZUkzMihzZXQuc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICB3cml0ZUJ5dGUoYiA/IDEgOiAwKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoYiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlQnl0ZShiKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoaTE2IDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVJbnQxNihpMTYpOworICAgICAgICB0cmFuc18ud3JpdGUob3V0LmdldEJ5dGVzKCksIDAsIDIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMihpMzIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBvdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgb3V0LmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIG91dC53cml0ZUludDMyKGkzMik7CisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KGk2NCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIHZhciBvdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgb3V0LmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgIHZhciBoaSA9IEludDY0LmdldEhpZ2goaTY0KTsKKyAgICAgICAgdmFyIGxvID0gSW50NjQuZ2V0TG93KGk2NCk7CisgICAgICAgIG91dC53cml0ZUludDMyKGhpKTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIobG8pOworICAgICAgICAjZWxzZQorICAgICAgICBvdXQud3JpdGVJbnQzMihpNjQuaGlnaCk7CisgICAgICAgIG91dC53cml0ZUludDMyKGk2NC5sb3cpOworICAgICAgICAjZW5kCisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGR1YjpGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlRG91YmxlKGR1Yik7CisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlU3RyaW5nKHN0cik7CisgICAgICAgIHZhciBieXRlcyA9IG91dC5nZXRCeXRlcygpOworICAgICAgICB3cml0ZUkzMiggYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCaW5hcnkoYmluOkJ5dGVzKSA6IFZvaWQgeworICAgICAgICB3cml0ZUkzMihiaW4ubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKGJpbiwgMCwgYmluLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZGluZyBtZXRob2RzLgorICAgICAqLworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKTpUTWVzc2FnZSB7CisgICAgICAgIHZhciBzaXplIDogSW50ID0gcmVhZEkzMigpOworICAgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIHZhciB2ZXJzaW9uIDogSW50ID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShyZWFkU3RyaW5nKCksIHNpemUgJiAweDAwMDAwMGZmLCByZWFkSTMyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN0cmljdFJlYWRfKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UocmVhZFN0cmluZ0JvZHkoc2l6ZSksIHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKTpUU3RydWN0IHsKKyAgICAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpIDogVEZpZWxkIHsKKyAgICAgICAgdmFyIHR5cGUgOiBJbnQgPSByZWFkQnl0ZSgpOworICAgICAgICB2YXIgaWQgOiBJbnQgPSAwOworICAgICAgICBpZiAodHlwZSAhPSBUVHlwZS5TVE9QKQorICAgICAgICB7CisgICAgICAgICAgICBpZCA9IHJlYWRJMTYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFRGaWVsZCgiIiwgdHlwZSwgaWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oKSA6IFRNYXAgeworICAgICAgICByZXR1cm4gbmV3IFRNYXAocmVhZEJ5dGUoKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oKTpUTGlzdCB7CisgICAgICAgIHJldHVybiBuZXcgVExpc3QocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKSA6IFRTZXQgeworICAgICAgcmV0dXJuIG5ldyBUU2V0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgpIDogSW50IHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB2YXIgbGVuID0gdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgMSk7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDEpOworICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGlucC5yZWFkQnl0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCAyKTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgMik7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWRJbnQxNigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCkgOiBJbnQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCA0KTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCkgOiBoYXhlLkludDY0IHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB2YXIgbGVuID0gdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgOCk7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDgpOworICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgdmFyIGhpID0gaW5wLnJlYWRJbnQzMigpOworICAgICAgICB2YXIgbG8gPSBpbnAucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBJbnQ2NC5tYWtlKGhpLGxvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgpOkZsb2F0IHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB2YXIgbGVuID0gdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgOCk7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDgpOworICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGlucC5yZWFkRG91YmxlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiByZWFkU3RyaW5nQm9keSggcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZ0JvZHkobGVuIDogSW50KSA6IFN0cmluZyB7CisgICAgICAgIGlmKCBsZW4gPiAwKSB7CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCBsZW4pOworICAgICAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgbGVuKTsKKyAgICAgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGlucC5yZWFkU3RyaW5nKGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpIDogQnl0ZXMgeworICAgICAgICB2YXIgbGVuIDogSW50ID0gcmVhZEkzMigpOworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBidWZmZXIuZ2V0Qnl0ZXMoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE5YmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisqIEJpbmFyeSBQcm90b2NvbCBGYWN0b3J5CisqLworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0UmVhZF8gOiBCb29sID0gZmFsc2U7CisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0V3JpdGVfIDogQm9vbCA9IHRydWU7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBzdHJpY3RSZWFkIDogQm9vbCA9IGZhbHNlLCBzdHJpY3RXcml0ZSA6IEJvb2wgPSB0cnVlKSB7CisgICAgICAgIHN0cmljdFJlYWRfICA9IHN0cmljdFJlYWQ7CisgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCggdHJhbnMgOiBUVHJhbnNwb3J0KSA6IFRQcm90b2NvbCAgeworICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCggdHJhbnMsIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOworICAgIH0KK30KKworCisKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjEzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oeApAQCAtMCwwICsxLDcxOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmRzLkdlbmVyaWNTdGFjazsKK2ltcG9ydCBoYXhlLkludDMyOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5VdGY4OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuWmlnWmFnOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci5CaXRDb252ZXJ0ZXI7CisKKworLyoqCisqIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFJlY3Vyc2lvblRyYWNrZXIgaW1wbGVtZW50cyBUUHJvdG9jb2wgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIEFOT05ZTU9VU19TVFJVQ1QgOiBUU3RydWN0ID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgIHByaXZhdGUgc3RhdGljIHZhciBUU1RPUCA6IFRGaWVsZCA9IG5ldyBURmllbGQoIiIsIFRUeXBlLlNUT1AsIDApOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBQUk9UT0NPTF9JRCA6IEludCA9IDB4ODI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBWRVJTSU9OIDogSW50ID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFZFUlNJT05fTUFTSyA6IEludCA9IDB4MWY7IC8vIDAwMDEgMTExMQorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVFlQRV9NQVNLIDogSW50ID0gMHhFMDsgLy8gMTExMCAwMDAwCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBUWVBFX0JJVFMgOiBJbnQgPSAweDA3OyAvLyAwMDAwIDAxMTEKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFRZUEVfU0hJRlRfQU1PVU5UIDogSW50ID0gNTsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHR0eXBlVG9Db21wYWN0VHlwZSA9IFsKKyAgICAgICAgVFR5cGUuU1RPUCAgICA9PiBUQ29tcGFjdFR5cGVzLlNUT1AsCisgICAgICAgIFRUeXBlLkJPT0wgICAgPT4gVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUsCisgICAgICAgIFRUeXBlLkJZVEUgICAgPT4gVENvbXBhY3RUeXBlcy5CWVRFLAorICAgICAgICBUVHlwZS5ET1VCTEUgID0+IFRDb21wYWN0VHlwZXMuRE9VQkxFLAorICAgICAgICBUVHlwZS5JMTYgICAgID0+IFRDb21wYWN0VHlwZXMuSTE2LAorICAgICAgICBUVHlwZS5JMzIgICAgID0+IFRDb21wYWN0VHlwZXMuSTMyLAorICAgICAgICBUVHlwZS5JNjQgICAgID0+IFRDb21wYWN0VHlwZXMuSTY0LAorICAgICAgICBUVHlwZS5TVFJJTkcgID0+IFRDb21wYWN0VHlwZXMuQklOQVJZLAorICAgICAgICBUVHlwZS5TVFJVQ1QgID0+IFRDb21wYWN0VHlwZXMuU1RSVUNULAorICAgICAgICBUVHlwZS5NQVAgICAgID0+IFRDb21wYWN0VHlwZXMuTUFQLAorICAgICAgICBUVHlwZS5TRVQgICAgID0+IFRDb21wYWN0VHlwZXMuU0VULAorICAgICAgICBUVHlwZS5MSVNUICAgID0+IFRDb21wYWN0VHlwZXMuTElTVAorICAgIF07CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdGNvbXBhY3RUeXBlVG9UeXBlID0gWworICAgICAgICBUQ29tcGFjdFR5cGVzLlNUT1AgICAgICAgICAgPT4gVFR5cGUuU1RPUCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUgID0+IFRUeXBlLkJPT0wsCisgICAgICAgIFRDb21wYWN0VHlwZXMuQk9PTEVBTl9GQUxTRSA9PiBUVHlwZS5CT09MLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkJZVEUgICAgICAgICAgPT4gVFR5cGUuQllURSwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5JMTYgICAgICAgICAgID0+IFRUeXBlLkkxNiwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5JMzIgICAgICAgICAgID0+IFRUeXBlLkkzMiwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5JNjQgICAgICAgICAgID0+IFRUeXBlLkk2NCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5ET1VCTEUgICAgICAgID0+IFRUeXBlLkRPVUJMRSwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5CSU5BUlkgICAgICAgID0+IFRUeXBlLlNUUklORywKKyAgICAgICAgVENvbXBhY3RUeXBlcy5MSVNUICAgICAgICAgID0+IFRUeXBlLkxJU1QsCisgICAgICAgIFRDb21wYWN0VHlwZXMuU0VUICAgICAgICAgICA9PiBUVHlwZS5TRVQsCisgICAgICAgIFRDb21wYWN0VHlwZXMuTUFQICAgICAgICAgICA9PiBUVHlwZS5NQVAsCisgICAgICAgIFRDb21wYWN0VHlwZXMuU1RSVUNUICAgICAgICA9PiBUVHlwZS5TVFJVQ1QKKyAgICBdOworCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgICAqIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgICovCisgICAgcHJpdmF0ZSB2YXIgbGFzdEZpZWxkXyA6IEdlbmVyaWNTdGFjazxJbnQ+ID0gbmV3IEdlbmVyaWNTdGFjazxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgbGFzdEZpZWxkSWRfIDogSW50ID0gMDsKKworICAgIC8qKgorICAgICAqIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgorICAgICAqIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhciBib29sZWFuRmllbGRfIDogTnVsbDxURmllbGQ+OworCisgICAgLyoqCisgICAgICogSWYgd2UgUmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgICAgICogdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2YXIgYm9vbFZhbHVlXyA6IE51bGw8Qm9vbD47CisKKworICAgIC8vIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGhvbGRzIFN0cmluZ3MgYXMgVVRGLTgKKyAgICAvLyBodHRwOi8vb2xkLmhheGUub3JnL21hbnVhbC9lbmNvZGluZworICAgIHByaXZhdGUgc3RhdGljIHZhciB1dGY4U3RyaW5ncyA9IGhheGUuVXRmOC52YWxpZGF0ZSgiw4ctw58tw4Yt0K4t0KgiKTsKKworICAgIC8vIHRoZSB0cmFuc3BvcnQgdXNlZAorICAgIHB1YmxpYyB2YXIgdHJhbnMoZGVmYXVsdCxudWxsKSA6IFRUcmFuc3BvcnQ7CisKKworICAgIC8vIFRDb21wYWN0UHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFucyA6IFRUcmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcy50cmFucyA9IHRyYW5zOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKSA6IFRUcmFuc3BvcnQgeworICAgICAgcmV0dXJuIHRyYW5zOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIFJlc2V0KCkgOiBWb2lkeworICAgICAgICB3aGlsZSAoICEgbGFzdEZpZWxkXy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxhc3RGaWVsZF8ucG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUJ5dGVEaXJlY3QoIGIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBidWYgPSBCeXRlcy5hbGxvYygxKTsKKyAgICAgICAgYnVmLnNldCggMCwgYik7CisgICAgICAgIHRyYW5zLndyaXRlKCBidWYsIDAsIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZVZhcmludDMyKCBuIDogVUludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGkzMmJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChuICYgfjB4N0YpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaTMyYnVmLmFkZEJ5dGUoIG4gJiAweEZGKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpMzJidWYuYWRkQnl0ZSggKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgdG1wID0gaTMyYnVmLmdldEJ5dGVzKCk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICogV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorICAgICogcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oIG1lc3NhZ2UgOiBUTWVzc2FnZSkgOiBWb2lkIHsKKyAgICAgICAgUmVzZXQoKTsKKworICAgICAgICB2YXIgdmVyc2lvbkFuZFR5cGUgOiBJbnQgPSAgKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwgKChtZXNzYWdlLnR5cGUgPDwgVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9NQVNLKTsKKyAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCBQUk9UT0NPTF9JRCk7CisgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggdmVyc2lvbkFuZFR5cGUpOworICAgICAgICBXcml0ZVZhcmludDMyKCBjYXN0KCBtZXNzYWdlLnNlcWlkLCBVSW50KSk7CisgICAgICAgIHdyaXRlU3RyaW5nKCBtZXNzYWdlLm5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQorICAgICAqIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAorICAgICAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKHN0cnVjdDpUU3RydWN0KSA6IFZvaWQgeworICAgICAgICBsYXN0RmllbGRfLmFkZCggbGFzdEZpZWxkSWRfKTsKKyAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQorICAgICAqIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorICAgICAqIG9mIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnBvcCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKKyAgICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCisgICAgICogdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQorICAgICAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZCB7CisgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpCisgICAgICAgICAgICBib29sZWFuRmllbGRfID0gZmllbGQ7IC8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAweEZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd29ya2hvcnNlIG9mIFdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICAgICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCisgICAgICogYm9vbGVhbiBmaWVsZCBjYXNlLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGZpZWxkIDogVEZpZWxkLCB0eXBlT3ZlcnJpZGUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgICAgICAgdmFyIHR5cGVUb1dyaXRlIDogSW50OworICAgICAgICBpZiAoIHR5cGVPdmVycmlkZSA9PSAweEZGKQorICAgICAgICAgICAgdHlwZVRvV3JpdGUgPSBnZXRDb21wYWN0VHlwZSggZmllbGQudHlwZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlOworCisgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgICAgICBpZiAoZmllbGQuaWQgPiBsYXN0RmllbGRJZF8gJiYgZmllbGQuaWQgLSBsYXN0RmllbGRJZF8gPD0gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoZmllbGQuaWQgLSBsYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpOworICAgICAgICAgICAgd3JpdGVJMTYoZmllbGQuaWQpOworICAgICAgICB9CisKKyAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggY2FzdChUQ29tcGFjdFR5cGVzLlNUT1AsIEludCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisgICAgICogaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQgeworICAgICAgICBpZiAobWFwLnNpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGt2dHlwZSA9IChnZXRDb21wYWN0VHlwZShtYXAua2V5VHlwZSkgPDwgNCkgfCBnZXRDb21wYWN0VHlwZShtYXAudmFsdWVUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoIGNhc3QoIG1hcC5zaXplLCBVSW50KSk7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIGt2dHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbiggbGlzdCA6IFRMaXN0KSA6IFZvaWQgeworICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggbGlzdC5lbGVtVHlwZSwgbGlzdC5zaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNldCBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oIHNldCA6IFRTZXQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBzZXQuZWxlbVR5cGUsIHNldC5zaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgKiB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorICAgICAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAgICAgKiBPdGhlcndpc2UsIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbChiIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJjdCA6IEludCA9IGIgPyBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSA6IFRDb21wYWN0VHlwZXMuQk9PTEVBTl9GQUxTRTsKKworICAgICAgICBpZiAoYm9vbGVhbkZpZWxkXyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBib29sZWFuRmllbGRfLCBiY3QpOworICAgICAgICAgICAgYm9vbGVhbkZpZWxkXyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggYmN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCBiIDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCBpMTYgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlVmFyaW50MzIoIFppZ1phZy5Gcm9tSW50KCBpMTYpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMiggaTMyIDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZVZhcmludDMyKCBaaWdaYWcuRnJvbUludCggaTMyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoIGk2NCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlVmFyaW50NjQoICBaaWdaYWcuRnJvbUxvbmcoIGk2NCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCBkdWIgOiBGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGRhdGEgPSBCaXRDb252ZXJ0ZXIuZml4ZWRMb25nVG9CeXRlcyggQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGR1YikpOworICAgICAgICB0cmFucy53cml0ZSggZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBpZiggdXRmOFN0cmluZ3MpCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBzdHIpOyAgLy8gbm8gbmVlZCB0byBlbmNvZGUgb24gVVRGOCB0YXJnZXRzLCB0aGUgc3RyaW5nIGlzIGp1c3QgZmluZQorICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBVdGY4LmVuY29kZSggc3RyKSk7CisgICAgICAgIHZhciB0bXAgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgd3JpdGVCaW5hcnkoIHRtcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KCBiaW4gOiBCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVWYXJpbnQzMiggY2FzdChiaW4ubGVuZ3RoLFVJbnQpKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIGJpbiwgMCwgYmluLmxlbmd0aCk7CisgICAgfQorCisKKyAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmUKKyAgICAvLyBvdXRwdXQgb3IgcHVycG9zZS4KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZCB7IH0KKworICAgIC8vCisgICAgLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KKyAgICAgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUNvbGxlY3Rpb25CZWdpbiggZWxlbVR5cGUgOiBJbnQsIHNpemUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGlmIChzaXplIDw9IDE0KSAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIHNpemUgPDwgNCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIDB4ZjAgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMiggY2FzdChzaXplLCBVSW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlVmFyaW50NjQobiA6IGhheGUuSW50NjQpIDogVm9pZCAgICB7CisgICAgICAgIHZhciB2YXJpbnQ2NG91dCA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIEludDY0LmlzWmVybyggSW50NjQuYW5kKCBuLCBJbnQ2NC5uZWcoSW50NjQubWFrZSgwLDB4N0YpKSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgICAgICAgICAgdmFyaW50NjRvdXQuYWRkQnl0ZSggSW50NjQuZ2V0TG93KG4pKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHZhcmludDY0b3V0LmFkZEJ5dGUoIG4ubG93KTsKKyAgICAgICAgICAgICAgICAjZW5kCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmICggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgICAgICAgICAgdmFyaW50NjRvdXQuYWRkQnl0ZSggKEludDY0LmdldExvdyhuKSAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dC5hZGRCeXRlKCAobi5sb3cgJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBuID0gSW50NjQuc2hyKCBuLCA3KTsKKyAgICAgICAgICAgICAgICBuID0gSW50NjQuYW5kKCBuLCBJbnQ2NC5tYWtlKDB4MDFGRkZGRkYsMHhGRkZGRkZGRikpOyAgLy8gY2xlYW4gb3V0IHRoZSBzaGlmdGVkIDcgYml0cworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZhciB0bXAgPSB2YXJpbnQ2NG91dC5nZXRCeXRlcygpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpOlRNZXNzYWdlIHsKKyAgICAgICAgUmVzZXQoKTsKKworICAgICAgICB2YXIgcHJvdG9jb2xJZCA6IEludCA9IHJlYWRCeXRlKCk7CisgICAgICAgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgcHJvdG9jb2wgaWQgIiArIFN0cmluZ1Rvb2xzLmhleChQUk9UT0NPTF9JRCwyKSArICIgYnV0IGdvdCAiICsgU3RyaW5nVG9vbHMuaGV4KHByb3RvY29sSWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB2ZXJzaW9uQW5kVHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisgICAgICAgIHZhciB2ZXJzaW9uIDogSW50ID0gKHZlcnNpb25BbmRUeXBlICYgVkVSU0lPTl9NQVNLKTsKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIHZlcnNpb24gIiArIFZFUlNJT04gKyAiIGJ1dCBnb3QgIiArIHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHR5cGUgOiBJbnQgPSAoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUyk7CisgICAgICAgIHZhciBzZXFpZCA6IEludCA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICB2YXIgbXNnTm0gOiBTdHJpbmcgPSByZWFkU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UoIG1zZ05tLCB0eXBlLCBzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisgICAgICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKTpUU3RydWN0IHsKKyAgICAgICAgbGFzdEZpZWxkXy5hZGQobGFzdEZpZWxkSWRfKTsKKyAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKKyAgICAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKyAgICAgKiB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8ucG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCkgOiBURmllbGQgeworICAgICAgICB2YXIgdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisKKyAgICAgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyLgorICAgICAgICBpZiAodHlwZSA9PSBjYXN0KFRDb21wYWN0VHlwZXMuU1RPUCxJbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gVFNUT1A7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZmllbGRJZCA6IEludDsKKworICAgICAgICAvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgICAgICAgIHZhciBtb2RpZmllciA6IEludCA9ICgodHlwZSAmIDB4ZjApID4+IDQpOworICAgICAgICBpZiAobW9kaWZpZXIgPT0gMCkKKyAgICAgICAgICAgIGZpZWxkSWQgPSByZWFkSTE2KCk7ICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpZWxkSWQgPSBsYXN0RmllbGRJZF8gKyBtb2RpZmllcjsgLy8gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorCisgICAgICAgIHZhciBmaWVsZCA6IFRGaWVsZCAgPSBuZXcgVEZpZWxkKCAiIiwgY2FzdChnZXRUVHlwZSh0eXBlICYgMHgwZiksSW50KSwgZmllbGRJZCk7CisKKyAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgICAgICAgaWYgKGlzQm9vbFR5cGUodHlwZSkpIHsKKyAgICAgICAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICAgICAgICAgICAgYm9vbFZhbHVlXyA9ICgodHlwZSAmIDB4MGYpID09IGNhc3QoVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUsSW50KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgUmVhZGluZyB0aGUga2V5CisgICAgICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKyAgICAgKiAiY29ycmVjdCIgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpIDogVE1hcCB7CisgICAgICAgIHZhciBzaXplIDogSW50ID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIHZhciBrZXlBbmRWYWx1ZVR5cGUgOiBJbnQgPSAoKHNpemUgPT0gMCkgID8gIDAgIDogIHJlYWRCeXRlKCkpOworICAgICAgICB2YXIga2V5IDogSW50ID0gY2FzdCggZ2V0VFR5cGUoIChrZXlBbmRWYWx1ZVR5cGUgJiAweEYwKSA+PiA0KSwgSW50KTsKKyAgICAgICAgdmFyIHZhbCA6IEludCA9IGNhc3QoIGdldFRUeXBlKCBrZXlBbmRWYWx1ZVR5cGUgJiAweDBGKSwgSW50KTsKKyAgICAgICAgcmV0dXJuIG5ldyBUTWFwKCBrZXksIHZhbCwgc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCisgICAgICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAqIHRydWUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpOlRMaXN0IHsKKyAgICAgICAgdmFyIHNpemVfYW5kX3R5cGUgOiBJbnQgPSByZWFkQnl0ZSgpOworCisgICAgICAgIHZhciBzaXplIDogSW50ID0gKChzaXplX2FuZF90eXBlICYgMHhGMCkgPj4gNCkgJiAweDBGOworICAgICAgICBpZiAoc2l6ZSA9PSAxNSkgeworICAgICAgICAgICAgc2l6ZSA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHR5cGUgPSBnZXRUVHlwZShzaXplX2FuZF90eXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUTGlzdCggdHlwZSwgc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAqIHRydWUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCkgOiBUU2V0IHsKKyAgICAgICAgdmFyIHNpemVfYW5kX3R5cGUgOiBJbnQgPSByZWFkQnl0ZSgpOworCisgICAgICAgIHZhciBzaXplIDogSW50ID0gKChzaXplX2FuZF90eXBlICYgMHhGMCkgPj4gNCkgJiAweDBGOworICAgICAgICBpZiAoc2l6ZSA9PSAxNSkgeworICAgICAgICAgICAgc2l6ZSA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHR5cGUgPSBnZXRUVHlwZShzaXplX2FuZF90eXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUU2V0KCB0eXBlLCBzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCisgICAgICogYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAgICAgKiBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgpIDogQm9vbCB7CisgICAgICAgIGlmIChib29sVmFsdWVfICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgOiBCb29sID0gYm9vbFZhbHVlXzsKKyAgICAgICAgICAgIGJvb2xWYWx1ZV8gPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSBjYXN0KFRDb21wYWN0VHlwZXMuQk9PTEVBTl9UUlVFLEludCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludCB7CisgICAgICAgIHZhciBieXRlUmF3QnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zLnJlYWRBbGwoIGJ5dGVSYXdCdWYsIDAsIDEpOworICAgICAgICByZXR1cm4gYnl0ZVJhd0J1Zi5nZXRCeXRlcygpLmdldCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIFppZ1phZy5Ub0ludCggUmVhZFZhcmludDMyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gWmlnWmFnLlRvSW50KCBSZWFkVmFyaW50MzIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQgeworICAgICAgICByZXR1cm4gWmlnWmFnLlRvTG9uZyggUmVhZFZhcmludDY0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IFJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCk6RmxvYXQgeworICAgICAgICB2YXIgbG9uZ0JpdHMgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggbG9uZ0JpdHMsIDAsIDgpOworICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkludDY0Qml0c1RvRG91YmxlKCBCaXRDb252ZXJ0ZXIuYnl0ZXNUb0xvbmcoIGxvbmdCaXRzLmdldEJ5dGVzKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgICB2YXIgbGVuZ3RoIDogSW50ID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zLnJlYWRBbGwoIGJ1ZiwgMCwgbGVuZ3RoKTsKKworICAgICAgICBsZW5ndGggPSBidWYubGVuZ3RoOworICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1Zi5nZXRCeXRlcygpKTsKKyAgICAgICAgdmFyIHN0ciA9IGlucC5yZWFkU3RyaW5nKCBsZW5ndGgpOworICAgICAgICBpZiggdXRmOFN0cmluZ3MpCisgICAgICAgICAgICByZXR1cm4gc3RyOyAgLy8gbm8gbmVlZCB0byBkZWNvZGUgb24gVVRGOCB0YXJnZXRzLCB0aGUgc3RyaW5nIGlzIGp1c3QgZmluZQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gVXRmOC5kZWNvZGUoIHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHZhciBsZW5ndGggOiBJbnQgPSBjYXN0KCBSZWFkVmFyaW50MzIoKSwgSW50KTsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZXMuYWxsb2MoMCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHRyYW5zLnJlYWRBbGwoIGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5nZXRCeXRlcygpOworICAgIH0KKworCisgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQorICAgIC8vIGVuY29kaW5nLgorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7IH0KKworICAgIC8vCisgICAgLy8gSW50ZXJuYWwgUmVhZGluZyBtZXRob2RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRWYXJpbnQzMigpIDogVUludCB7CisgICAgICAgIHZhciByZXN1bHQgOiBVSW50ID0gMDsKKyAgICAgICAgdmFyIHNoaWZ0IDogSW50ID0gMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHZhciBiIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCB8PSBjYXN0KChiICYgMHg3ZikgPDwgc2hpZnQsIFVJbnQpOworICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZFZhcmludDY0KCkgOiBJbnQ2NCB7CisgICAgICAgIHZhciBzaGlmdCA6IEludCA9IDA7CisgICAgICAgIHZhciByZXN1bHQgOiBJbnQ2NCA9IEludDY0Lm1ha2UoMCwwKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHZhciBiIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCByZXN1bHQsIEludDY0LnNobCggSW50NjQubWFrZSgwLGIgJiAweDdmKSwgc2hpZnQpKTsKKyAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgLy8KKyAgICAvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKyAgICAvLworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0Jvb2xUeXBlKCBiIDogSW50KSA6IEJvb2wgeworICAgICAgICB2YXIgbG93ZXJOaWJibGUgOiBJbnQgPSBiICYgMHgwZjsKKyAgICAgICAgc3dpdGNoKGxvd2VyTmliYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRDb21wYWN0VHlwZXMuQk9PTEVBTl9UUlVFOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgVENvbXBhY3RUeXBlcy5CT09MRUFOX0ZBTFNFOiByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0VHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBUVHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFRUeXBlKCB0eXBlIDogSW50KSA6IEludCB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGNvbXBhY3RUeXBlVG9UeXBlW3R5cGVdOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0dCA6IEludCA9ICh0eXBlICYgMHgwZik7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgJ2RvblwndCBrbm93IHdoYXQgdHlwZTogJHR0ICgkZSknKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RUeXBlcyBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldENvbXBhY3RUeXBlKCB0dHlwZSA6IEludCkgOiBJbnQKKyAgICB7CisgICAgICAgIHJldHVybiBjYXN0KCB0dHlwZVRvQ29tcGFjdFR5cGVbdHR5cGVdLCBJbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY3M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorKiBDb21wYWN0IFByb3RvY29sIEZhY3RvcnkKKyovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woIHRyYW5zIDogVFRyYW5zcG9ydCkgOiBUUHJvdG9jb2wgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCB0cmFucyk7CisgICAgfQorfQorCisKKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFR5cGVzLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0VHlwZXMuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkM2Q4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFR5cGVzLmh4CkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKKy8qKgorICogQWxsIG9mIHRoZSBvbi13aXJlIHR5cGUgY29kZXMuCisgKi8KK0A6ZW51bQorYWJzdHJhY3QgVENvbXBhY3RUeXBlcyhJbnQpICBmcm9tIEludCB0byBJbnQgIHsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RPUCAgICAgICAgICA9IDB4MDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJPT0xFQU5fVFJVRSAgPSAweDAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCT09MRUFOX0ZBTFNFID0gMHgwMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQllURSAgICAgICAgICA9IDB4MDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkxNiAgICAgICAgICAgPSAweDA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJMzIgICAgICAgICAgID0gMHgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSTY0ICAgICAgICAgICA9IDB4MDY7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERPVUJMRSAgICAgICAgPSAweDA3OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCSU5BUlkgICAgICAgID0gMHgwODsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTElTVCAgICAgICAgICA9IDB4MDk7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNFVCAgICAgICAgICAgPSAweDBBOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBNQVAgICAgICAgICAgID0gMHgwQjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RSVUNUICAgICAgICA9IDB4MEM7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNTQ5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmh4CkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVEZpZWxkIHsKKworICAgIHB1YmxpYyB2YXIgbmFtZSA6IFN0cmluZzsKKyAgICBwdWJsaWMgdmFyIHR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBpZCA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobiA6IFN0cmluZyA9ICIiLCB0IDogSW50ID0gMCwgaSA6IEludCA9IDApIHsKKyAgICAgIG5hbWUgPSBuOworICAgICAgdHlwZSA9IHQ7CisgICAgICBpZCA9IGk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgcmV0dXJuICc8VEZpZWxkIG5hbWU6IiRuYW1lIiB0eXBlOiIkdHlwZSIgZmllbGQtaWQ6IiRpZCI+JzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKCBvdGhlckZpZWxkIDogVEZpZWxkKSA6IEJvb2wgeworICAgICAgcmV0dXJuICh0eXBlID09IG90aGVyRmllbGQudHlwZSkKKyAgICAgICAgICAmJiAoaWQgPT0gb3RoZXJGaWVsZC5pZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGZmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oeApAQCAtMCwwICsxLDEwNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmRzLkdlbmVyaWNTdGFjazsKK2ltcG9ydCBoYXhlLlV0Zjg7CitpbXBvcnQgaGF4ZS5jcnlwdG8uQmFzZTY0OworaW1wb3J0IGhheGUuSW50NjQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworCisvKiBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisqICBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgorKgorKiAgUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgd2lyZSBmb3JtYXQuCisqCisqICBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KKyovCitjbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFJlY3Vyc2lvblRyYWNrZXIgaW1wbGVtZW50cyBUUHJvdG9jb2wgeworCisgICAgcHVibGljIHZhciB0cmFucyhkZWZhdWx0LG51bGwpIDogVFRyYW5zcG9ydDsKKworICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgIHByaXZhdGUgdmFyIGNvbnRleHRTdGFjayA6IEdlbmVyaWNTdGFjazxKU09OQmFzZUNvbnRleHQ+ID0gbmV3IEdlbmVyaWNTdGFjazxKU09OQmFzZUNvbnRleHQ+KCk7CisKKyAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICBwcml2YXRlIHZhciBjb250ZXh0IDogSlNPTkJhc2VDb250ZXh0OworCisgICAgLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKKyAgICBwcml2YXRlIHZhciByZWFkZXIgOiBMb29rYWhlYWRSZWFkZXI7CisKKyAgICAvLyB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBob2xkcyBTdHJpbmdzIGFzIFVURi04CisgICAgLy8gaHR0cDovL29sZC5oYXhlLm9yZy9tYW51YWwvZW5jb2RpbmcKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdXRmOFN0cmluZ3MgPSBoYXhlLlV0ZjgudmFsaWRhdGUoIsOHLcOfLcOGLdCuLdCoIik7CisKKyAgICAvLyBUSlNPTlByb3RvY29sIENvbnN0cnVjdG9yCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdHJhbnMgOiBUVHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgdGhpcy50cmFucyA9IHRyYW5zOworICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgSlNPTkJhc2VDb250ZXh0KHRoaXMpOworICAgICAgICB0aGlzLnJlYWRlciA9IG5ldyBMb29rYWhlYWRSZWFkZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gdHJhbnM7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2U6VE1lc3NhZ2UpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggSlNPTkNvbnN0YW50cy5WRVJTSU9OKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcobWVzc2FnZS5uYW1lKSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIG1lc3NhZ2UudHlwZSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKHN0cnVjdDpUU3RydWN0KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oZmllbGQ6VEZpZWxkKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBmaWVsZC5pZCApOworICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggZmllbGQudHlwZSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7IH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkdldFR5cGVOYW1lRm9yVHlwZUlEKCBtYXAua2V5VHlwZSkpKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuR2V0VHlwZU5hbWVGb3JUeXBlSUQoIG1hcC52YWx1ZVR5cGUpKSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIG1hcC5zaXplKTsKKyAgICAgICAgV3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4obGlzdDpUTGlzdCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggbGlzdC5lbGVtVHlwZSApKSk7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGxpc3Quc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oc2V0OlRTZXQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuR2V0VHlwZU5hbWVGb3JUeXBlSUQoIHNldC5lbGVtVHlwZSkpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggc2V0LnNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbChiIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIGIpCisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlciggMCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZShiIDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoaTE2IDogSW50KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBpMTYpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMihpMzIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KGk2NCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludDY0KCBpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZShkdWI6RmxvYXQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkRvdWJsZShkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZyhzdHIgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKHN0cikpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJpbmFyeShiaW46Qnl0ZXMpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkJhc2U2NChiaW4pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCk6VE1lc3NhZ2UgeworICAgICAgICB2YXIgbWVzc2FnZSA6IFRNZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICBpZiAoUmVhZEpTT05JbnRlZ2VyKCkgIT0gSlNPTkNvbnN0YW50cy5WRVJTSU9OKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgICAgICB9CisKKyAgICAgICAgbWVzc2FnZS5uYW1lID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICBtZXNzYWdlLnR5cGUgPSBSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgbWVzc2FnZS5zZXFpZCA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3QgeworICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKSA6IFRGaWVsZCB7CisgICAgICAgIHZhciBmaWVsZCA6IFRGaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICAgICAgdmFyIGNoID0gcmVhZGVyLlBlZWsoKTsKKyAgICAgICAgaWYgKFN0cmluZ0Zyb21CeXRlcyhjaCkgPT0gSlNPTkNvbnN0YW50cy5SQlJBQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpZWxkLnR5cGUgPSBUVHlwZS5TVE9QOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZmllbGQuaWQgPSBSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgIGZpZWxkLnR5cGUgPSBKU09OQ29uc3RhbnRzLkdldFR5cGVJREZvclR5cGVOYW1lKCBSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCkgOiBUTWFwIHsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIHZhciBLZXlUeXBlID0gSlNPTkNvbnN0YW50cy5HZXRUeXBlSURGb3JUeXBlTmFtZSggUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgdmFyIFZhbHVlVHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIHZhciBDb3VudCA6IEludCA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICBSZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisKKyAgICAgICAgdmFyIG1hcCA9IG5ldyBUTWFwKCBLZXlUeXBlLCBWYWx1ZVR5cGUsIENvdW50KTsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpOlRMaXN0IHsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIHZhciBFbGVtZW50VHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIHZhciBDb3VudCA6IEludCA9IFJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0KCBFbGVtZW50VHlwZSwgQ291bnQpOworICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigpIDogVFNldCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICB2YXIgRWxlbWVudFR5cGUgPSBKU09OQ29uc3RhbnRzLkdldFR5cGVJREZvclR5cGVOYW1lKCBSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB2YXIgQ291bnQgOiBJbnQgPSBSZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQoIEVsZW1lbnRUeXBlLCBDb3VudCk7CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIChSZWFkSlNPTkludGVnZXIoKSAhPSAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkludGVnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIFJlYWRKU09OSW50ZWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05JbnQ2NCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCk6RmxvYXQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05Eb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpIDogQnl0ZXMgeworICAgICAgICByZXR1cm4gUmVhZEpTT05CYXNlNjQoKTsKKyAgICB9CisKKyAgICAvLyBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgICBwcml2YXRlIGZ1bmN0aW9uICBQdXNoQ29udGV4dChjIDogSlNPTkJhc2VDb250ZXh0KSA6IFZvaWQgeworICAgICAgICBjb250ZXh0U3RhY2suYWRkKGNvbnRleHQpOworICAgICAgICBjb250ZXh0ID0gYzsKKyAgICB9CisKKyAgICAvLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICBwcml2YXRlIGZ1bmN0aW9uICBQb3BDb250ZXh0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dCA9IGNvbnRleHRTdGFjay5wb3AoKTsKKyAgICB9CisKKworICAgIC8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OU3RyaW5nKCBiIDogQnl0ZXMpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisKKyAgICAgICAgZm9yIChpIGluIDAgLi4uIGIubGVuZ3RoKSB7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSBiLmdldChpKTsKKworICAgICAgICAgICAgaWYgKCh2YWx1ZSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSkgPT0gSlNPTkNvbnN0YW50cy5CQUNLU0xBU0guY2hhckF0KDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkJBQ0tTTEFTSCArIEpTT05Db25zdGFudHMuQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCBiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG51bSA9IEpTT05Db25zdGFudHMuSlNPTl9DSEFSX1RBQkxFW3ZhbHVlXTsKKyAgICAgICAgICAgICAgICBpZiAobnVtID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucy53cml0ZSggYiwgaSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG51bSA+IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGUoIG51bSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBKU09OQ29uc3RhbnRzLkVTQ1NFUSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEhleENoYXIoICh2YWx1ZSAmIDB4RkYwMDAwMDApID4+IDEyKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEhleENoYXIoICh2YWx1ZSAmIDB4MDBGRjAwMDApID4+IDgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSGV4Q2hhciggKHZhbHVlICYgMHgwMDAwRkYwMCkgPj4gNCkpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBIZXhDaGFyKCB2YWx1ZSAmIDB4MDAwMDAwRkYpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywKKyAgICAvLyBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OSW50ZWdlciggbnVtIDogSW50KSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9ICIiOworICAgICAgICB2YXIgZXNjYXBlTnVtIDogQm9vbCA9IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgc3RyICs9IFN0ZC5zdHJpbmcobnVtKTsKKworICAgICAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICAgICAgICBzdHIgKz0gSlNPTkNvbnN0YW50cy5RVU9URTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIHN0cik7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywKKyAgICAvLyBpdCB3aWxsIGJlIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OSW50NjQoIG51bSA6IEludDY0KSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9ICIiOworICAgICAgICB2YXIgZXNjYXBlTnVtIDogQm9vbCA9IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgc3RyICs9IFN0ZC5zdHJpbmcobnVtKTsKKworICAgICAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICAgICAgICBzdHIgKz0gSlNPTkNvbnN0YW50cy5RVU9URTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIHN0cik7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgICAvLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05Eb3VibGUobnVtIDogRmxvYXQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworCisgICAgICAgIHZhciBzcGVjaWFsIDogQm9vbCA9IGZhbHNlOworICAgICAgICB2YXIgcmVuZGVyZWQgOiBTdHJpbmcgPSAiIjsKKyAgICAgICAgaWYoIE1hdGguaXNOYU4obnVtKSkgeworICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICByZW5kZXJlZCA9IEpTT05Db25zdGFudHMuRkxPQVRfSVNfTkFOOworICAgICAgICB9IGVsc2UgaWYgKCEgTWF0aC5pc0Zpbml0ZShudW0pKSB7CisgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmKCBudW0gPiAwKSB7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQgPSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX1BPU19JTkY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlbmRlcmVkID0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19ORUdfSU5GOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVuZGVyZWQgPSBTdGQuc3RyaW5nKG51bSk7ICAvLyBwbGFpbiBhbmQgc2ltcGxlIGZsb2F0IG51bWJlcgorICAgICAgICB9CisKKyAgICAgICAgLy8gY29tcG9zZSBvdXRwdXQKKyAgICAgICAgdmFyIGVzY2FwZU51bSA6IEJvb2wgPSBzcGVjaWFsIHx8IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisgICAgICAgIHN0ciArPSByZW5kZXJlZDsKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBzdHIpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBvdXQgY29udGVudHMgb2YgYnl0ZSBhcnJheSBiIGFzIGEgSlNPTiBzdHJpbmcgd2l0aCBiYXNlLTY0IGVuY29kZWQgZGF0YQorICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OQmFzZTY0KCBiIDogQnl0ZXMpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICBidWYuYWRkU3RyaW5nKCBCYXNlNjQuZW5jb2RlKGIpKTsKKyAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5RVU9URSk7CisKKyAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkxCUkFDRSk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICBQdXNoQ29udGV4dCggbmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05PYmplY3RFbmQoKSA6IFZvaWQgeworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuUkJSQUNFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05BcnJheVN0YXJ0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkxCUkFDS0VUKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIFB1c2hDb250ZXh0KCBuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTkFycmF5RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICB2YXIgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLlJCUkFDS0VUKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICovCisKKyAgICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggY2hhciwgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgcHVibGljIGZ1bmN0aW9uIFJlYWRKU09OU3ludGF4Q2hhciggY2hhciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIGIgPSBCeXRlc0Zyb21TdHJpbmcoIGNoYXIpOworCisgICAgICAgIHZhciBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgIGlmIChjaC5nZXQoMCkgIT0gYi5nZXQoMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyOiAkY2gnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4KKyAgICAvLyBTa2lwIFJlYWRpbmcgZnJvbSB0aGUgY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05TdHJpbmcoc2tpcENvbnRleHQgOiBCb29sKSA6IFN0cmluZworICAgIHsKKyAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmZmVyIDogQnl0ZXNCdWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNoID0gcmVhZGVyLlJlYWQoKTsKKworICAgICAgICAgICAgLy8gZW5kIG9mIHN0cmluZz8KKyAgICAgICAgICAgIGlmIChTdHJpbmdGcm9tQnl0ZXMoY2gpID09IEpTT05Db25zdGFudHMuUVVPVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGVzY2FwZWQ/CisgICAgICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKGNoKSAhPSBKU09OQ29uc3RhbnRzLkVTQ1NFUS5jaGFyQXQoMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFkZEJ5dGUoIGNoLmdldCgwKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gXHVYWFhYIChoZXggdW5pY29kZSkgYW5kIFxYIChjb250cm9sIGNoYXJzKQorICAgICAgICAgICAgY2ggPSByZWFkZXIuUmVhZCgpOworICAgICAgICAgICAgaWYgKFN0cmluZ0Zyb21CeXRlcyhjaCkgIT0gSlNPTkNvbnN0YW50cy5FU0NTRVEuY2hhckF0KDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IEpTT05Db25zdGFudHMuRVNDQVBFX0NIQVJTX1RPX1ZBTFVFU1tjaC5nZXQoMCldOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmZXIuYWRkQnl0ZSggdmFsdWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIGl0J3MgXHVYWFhYCisgICAgICAgICAgICB2YXIgaGV4YnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB2YXIgaGV4bGVuID0gdHJhbnMucmVhZEFsbCggaGV4YnVmLCAwLCA0KTsKKyAgICAgICAgICAgIGlmKCBoZXhsZW4gIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiTm90IGVub3VnaCBkYXRhIGZvciBcXHVOTk5OIHNlcXVlbmNlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBoZXhkaWdpdHMgPSBoZXhidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgIHZhciBjaGFyY29kZSA9IDA7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDApKSk7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDEpKSk7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDIpKSk7CisgICAgICAgICAgICBjaGFyY29kZSA9IChjaGFyY29kZSA8PCA0KSArIEhleFZhbCggU3RyaW5nLmZyb21DaGFyQ29kZShoZXhkaWdpdHMuZ2V0KDMpKSk7CisgICAgICAgICAgICBidWZmZXIuYWRkU3RyaW5nKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJjb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gU3RyaW5nRnJvbUJ5dGVzKCBidWZmZXIuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGUgY291bGQgYmUgYSB2YWxpZCBwYXJ0IG9mIGEgSlNPTiBudW1iZXIuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBJc0pTT05OdW1lcmljKGIgOiBJbnQpIDogQm9vbCB7CisgICAgICAgIHN3aXRjaCAoYikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAiKyIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiLSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiLiIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMCIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMiIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiMyIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNCIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNiIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiNyIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiOCIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiOSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiRSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAiZSIuY29kZTogIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGluIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGwgdmFsaWQgaW4gSlNPTiBudW1iZXJzLiBEb2VzCisgICAgLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05OdW1lcmljQ2hhcnMoKSA6IFN0cmluZworICAgIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA6IEJ5dGVzQnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2ggPSByZWFkZXIuUGVlaygpOworICAgICAgICAgICAgaWYoICEgSXNKU09OTnVtZXJpYyggY2guZ2V0KDApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci5hZGRCeXRlKCByZWFkZXIuUmVhZCgpLmdldCgwKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZ0Zyb21CeXRlcyggYnVmZmVyLmdldEJ5dGVzKCkpOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OSW50ZWdlcigpIDogSW50IHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHZhbHVlID0gU3RkLnBhcnNlSW50KHN0cik7CisgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05JbnQ2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIGNvbnRleHQuUmVhZCgpOworCisgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzdHIgOiBTdHJpbmcgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOworICAgICAgICBpZiggc3RyLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIHNpZ24KKyAgICAgICAgdmFyIGJNaW51cyA9IGZhbHNlOworICAgICAgICB2YXIgc3RhcnRBdCA9IDA7CisgICAgICAgIGlmKCAoc3RyLmNoYXJBdCgwKSA9PSAiKyIpIHx8IChzdHIuY2hhckF0KDApID09ICItIikpIHsKKyAgICAgICAgICAgIGJNaW51cyA9IChzdHIuY2hhckF0KDApID09ICItIik7CisgICAgICAgICAgICBzdGFydEF0Kys7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIGRpZ2l0cworICAgICAgICB2YXIgdmFsdWUgOiBJbnQ2NCA9IEludDY0Lm1ha2UoMCwwKTsKKyAgICAgICAgdmFyIGJHb3REaWdpdHMgPSBmYWxzZTsKKyAgICAgICAgZm9yKCBpIGluIHN0YXJ0QXQgLi4uIHN0ci5sZW5ndGgpIHsKKyAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7CisgICAgICAgICAgICB2YXIgZGlnaXQgPSBKU09OQ29uc3RhbnRzLkRFQ0lNQUxfRElHSVRTW2NoXTsKKyAgICAgICAgICAgIGlmKCBkaWdpdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnQmFkIG51bWVyaWMgZGF0YTogJHN0cicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYkdvdERpZ2l0cyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBkZWNpbWFsIGRpZ2l0cworICAgICAgICAgICAgdmFsdWUgPSBJbnQ2NC5tdWwoIHZhbHVlLCBJbnQ2NC5tYWtlKDAsMTApKTsKKyAgICAgICAgICAgIHZhbHVlID0gSW50NjQuYWRkKCB2YWx1ZSwgSW50NjQubWFrZSgwLGRpZ2l0KSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIHBlbmRpbmcgbWludXMgc2lnbiwgaWYgYXBwbGljYWJsZQorICAgICAgICAvLyB0aGlzIHNob3VsZCBhbHNvIGhhbmRsZSB0aGUgZWRnZSBjYXNlIE1JTl9JTlQ2NCBjb3JyZWN0bHkKKyAgICAgICAgaWYoIGJNaW51cyAmJiAoSW50NjQuY29tcGFyZSh2YWx1ZSxJbnQ2NC5tYWtlKDAsMCkpID4gMCkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gSW50NjQubmVnKCB2YWx1ZSk7CisgICAgICAgICAgICBiTWludXMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhIGJHb3REaWdpdHMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBkb3VibGUgdmFsdWUuIFRocm93IGlmIHRoZSB2YWx1ZSBpcyBub3Qgd3JhcHBlZCBpbiBxdW90ZXMKKyAgICAvLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05Eb3VibGUoKSA6IEZsb2F0IHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9ICIiOworICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKHJlYWRlci5QZWVrKCkpID09IEpTT05Db25zdGFudHMuUVVPVEUpIHsKKyAgICAgICAgICAgIHN0ciA9IFJlYWRKU09OU3RyaW5nKHRydWUpOworCisgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2VzCisgICAgICAgICAgICBpZiggc3RyID09IEpTT05Db25zdGFudHMuRkxPQVRfSVNfTkFOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguTmFOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHN0ciA9PSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX1BPU19JTkYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5QT1NJVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBzdHIgPT0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19ORUdfSU5GKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguTkVHQVRJVkVfSU5GSU5JVFk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhIGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSAgICB7CisgICAgICAgICAgICAgICAgLy8gdGhyb3cgLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBFc2NhcGVOdW1iZXJzKCkgPT0gdHJ1ZQorICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ciA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwYXJzZSBhbmQgY2hlY2sgLSB3ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgdmFsaWQgZGlnaXQKKyAgICAgICAgdmFyIGR1YiA9IFN0ZC5wYXJzZUZsb2F0KCBzdHIpOworICAgICAgICBpZiggKHN0ci5sZW5ndGggPT0gMCkgfHwgTWF0aC5pc05hTihkdWIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZHViOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkJhc2U2NCgpIDogQnl0ZXMKKyAgICB7CisgICAgICAgIHZhciBzdHIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgIHJldHVybiBCYXNlNjQuZGVjb2RlKCBzdHIpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05PYmplY3RTdGFydCgpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuTEJSQUNFKTsKKyAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTk9iamVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5SQlJBQ0UpOworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkFycmF5U3RhcnQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLkxCUkFDS0VUKTsKKyAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkFycmF5RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlJCUkFDS0VUKTsKKyAgICAgICAgUG9wQ29udGV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBCeXRlc0Zyb21TdHJpbmcoIHN0ciA6IFN0cmluZykgOiBCeXRlcyB7CisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgaWYoIHV0ZjhTdHJpbmdzKQorICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggc3RyKTsgIC8vIG5vIG5lZWQgdG8gZW5jb2RlIG9uIFVURjggdGFyZ2V0cywgdGhlIHN0cmluZyBpcyBqdXN0IGZpbmUKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggVXRmOC5lbmNvZGUoIHN0cikpOworICAgICAgICByZXR1cm4gYnVmLmdldEJ5dGVzKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTdHJpbmdGcm9tQnl0ZXMoIGJ1ZiA6IEJ5dGVzKSA6IFN0cmluZyB7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmKTsKKyAgICAgICAgaWYoIGJ1Zi5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAiIjsgIC8vIHJlYWRTdHJpbmcoKSB3b3VsZCByZXR1cm4gbnVsbCBpbiB0aGF0IGNhc2UsIHdoaWNoIGlzIHdyb25nCisgICAgICAgIHZhciBzdHIgPSBpbnAucmVhZFN0cmluZyggYnVmLmxlbmd0aCk7CisgICAgICAgIGlmKCB1dGY4U3RyaW5ncykKKyAgICAgICAgICAgIHJldHVybiBzdHI7ICAvLyBubyBuZWVkIHRvIGRlY29kZSBvbiBVVEY4IHRhcmdldHMsIHRoZSBzdHJpbmcgaXMganVzdCBmaW5lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBVdGY4LmRlY29kZSggc3RyKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMgY29ycmVzcG9uZGluZyBoZXggdmFsdWUKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBIZXhWYWwoY2hhciA6IFN0cmluZykgOiBJbnQgeworICAgICAgICB2YXIgdmFsdWUgPSBKU09OQ29uc3RhbnRzLkhFWF9ESUdJVFNbY2hhcl07CisgICAgICAgIGlmKCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdFeHBlY3RlZCBoZXggY2hhcmFjdGVyOiAkY2hhcicpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IG5pYmJsZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gSGV4Q2hhcihuaWJibGUgOiBJbnQpIDogU3RyaW5nCisgICAgeworICAgICAgICByZXR1cm4gIjAxMjM0NTY3ODlhYmNkZWYiLmNoYXJBdChuaWJibGUgJiAweDBGKTsKKyAgICB9CisKKworfQorCisKK0A6YWxsb3coVEpTT05Qcm90b2NvbCkKK2NsYXNzIEpTT05Db25zdGFudHMgeworICAgIHB1YmxpYyBzdGF0aWMgdmFyIENPTU1BID0gIiwiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIENPTE9OID0gIjoiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIExCUkFDRSA9ICJ7IjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBSQlJBQ0UgPSAifSI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTEJSQUNLRVQgPSAiWyI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgUkJSQUNLRVQgPSAiXSI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgUVVPVEUgPSAiXCIiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEJBQ0tTTEFTSCA9ICJcXCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFU0NTRVEgPSAiXFx1IjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEZMT0FUX0lTX05BTiA9ICJOYU4iOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEZMT0FUX0lTX1BPU19JTkYgPSAiSW5maW5pdHkiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEZMT0FUX0lTX05FR19JTkYgPSAiLUluZmluaXR5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIFZFUlNJT04gPSAxOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEpTT05fQ0hBUl9UQUJMRSA9IFsKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgICJiIi5jb2RlLCAidCIuY29kZSwgIm4iLmNvZGUsICAwLCAiZiIuY29kZSwgInIiLmNvZGUsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAxLCAgMSwgIlwiIi5jb2RlLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIF07CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFU0NBUEVfQ0hBUlMgICAgID0gWyciJywnXFwnLCcvJywnYicsJ2YnLCduJywncicsJ3QnXTsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFU0NBUEVfQ0hBUlNfVE9fVkFMVUVTID0gWworICAgICAgICAiXCIiLmNvZGUgPT4gMHgyMiwKKyAgICAgICAgIlxcIi5jb2RlID0+IDB4NUMsCisgICAgICAgICIvIi5jb2RlICA9PiAweDJGLAorICAgICAgICAiYiIuY29kZSAgPT4gMHgwOCwKKyAgICAgICAgImYiLmNvZGUgID0+IDB4MEMsCisgICAgICAgICJuIi5jb2RlICA9PiAweDBBLAorICAgICAgICAiciIuY29kZSAgPT4gMHgwRCwKKyAgICAgICAgInQiLmNvZGUgID0+IDB4MDkKKyAgICBdOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgREVDSU1BTF9ESUdJVFMgPSBbCisgICAgICAgICIwIiA9PiAwLAorICAgICAgICAiMSIgPT4gMSwKKyAgICAgICAgIjIiID0+IDIsCisgICAgICAgICIzIiA9PiAzLAorICAgICAgICAiNCIgPT4gNCwKKyAgICAgICAgIjUiID0+IDUsCisgICAgICAgICI2IiA9PiA2LAorICAgICAgICAiNyIgPT4gNywKKyAgICAgICAgIjgiID0+IDgsCisgICAgICAgICI5IiA9PiA5CisgICAgXTsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEhFWF9ESUdJVFMgPSBbCisgICAgICAgICIwIiA9PiAwLAorICAgICAgICAiMSIgPT4gMSwKKyAgICAgICAgIjIiID0+IDIsCisgICAgICAgICIzIiA9PiAzLAorICAgICAgICAiNCIgPT4gNCwKKyAgICAgICAgIjUiID0+IDUsCisgICAgICAgICI2IiA9PiA2LAorICAgICAgICAiNyIgPT4gNywKKyAgICAgICAgIjgiID0+IDgsCisgICAgICAgICI5IiA9PiA5LAorICAgICAgICAiQSIgPT4gMTAsCisgICAgICAgICJhIiA9PiAxMCwKKyAgICAgICAgIkIiID0+IDExLAorICAgICAgICAiYiIgPT4gMTEsCisgICAgICAgICJDIiA9PiAxMiwKKyAgICAgICAgImMiID0+IDEyLAorICAgICAgICAiRCIgPT4gMTMsCisgICAgICAgICJkIiA9PiAxMywKKyAgICAgICAgIkUiID0+IDE0LAorICAgICAgICAiZSIgPT4gMTQsCisgICAgICAgICJGIiA9PiAxNSwKKyAgICAgICAgImYiID0+IDE1CisgICAgXTsKKworCisgICAgcHVibGljIHN0YXRpYyB2YXIgREVGX1NUUklOR19TSVpFID0gMTY7CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0JPT0wgICA9ICd0Zic7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9CWVRFICAgPSAnaTgnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfSTE2ICAgID0gJ2kxNic7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9JMzIgICAgPSAnaTMyJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0k2NCAgICA9ICdpNjQnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfRE9VQkxFID0gJ2RibCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9TVFJVQ1QgPSAncmVjJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX1NUUklORyA9ICdzdHInOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfTUFQICAgID0gJ21hcCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9MSVNUICAgPSAnbHN0JzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX1NFVCAgICA9ICdzZXQnOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRUeXBlTmFtZUZvclR5cGVJRCh0eXBlSUQgOiBJbnQpIDogU3RyaW5nIHsKKyAgICAgICAgc3dpdGNoICh0eXBlSUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDogICAgIHJldHVybiBOQU1FX0JPT0w7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkJZVEU6ICAgICByZXR1cm4gTkFNRV9CWVRFOworICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6ICAgICAgICAgcmV0dXJuIE5BTUVfSTE2OworICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6ICAgICAgICAgcmV0dXJuIE5BTUVfSTMyOworICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6ICAgICAgICAgcmV0dXJuIE5BTUVfSTY0OworICAgICAgICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6ICAgICByZXR1cm4gTkFNRV9ET1VCTEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlLlNUUklORzogICAgIHJldHVybiBOQU1FX1NUUklORzsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOiAgICAgcmV0dXJuIE5BTUVfU1RSVUNUOworICAgICAgICAgICAgY2FzZSBUVHlwZS5NQVA6ICAgICAgICAgcmV0dXJuIE5BTUVfTUFQOworICAgICAgICAgICAgY2FzZSBUVHlwZS5TRVQ6ICAgICAgICAgcmV0dXJuIE5BTUVfU0VUOworICAgICAgICAgICAgY2FzZSBUVHlwZS5MSVNUOiAgICAgcmV0dXJuIE5BTUVfTElTVDsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZhciBOQU1FU19UT19UWVBFUyA9IFsKKyAgICAgICAgTkFNRV9CT09MICAgPT4gVFR5cGUuQk9PTCwKKyAgICAgICAgTkFNRV9CWVRFICAgPT4gVFR5cGUuQllURSwKKyAgICAgICAgTkFNRV9JMTYgICAgPT4gVFR5cGUuSTE2LAorICAgICAgICBOQU1FX0kzMiAgICA9PiBUVHlwZS5JMzIsCisgICAgICAgIE5BTUVfSTY0ICAgID0+IFRUeXBlLkk2NCwKKyAgICAgICAgTkFNRV9ET1VCTEUgPT4gVFR5cGUuRE9VQkxFLAorICAgICAgICBOQU1FX1NUUklORyA9PiBUVHlwZS5TVFJJTkcsCisgICAgICAgIE5BTUVfU1RSVUNUID0+IFRUeXBlLlNUUlVDVCwKKyAgICAgICAgTkFNRV9NQVAgICAgPT4gVFR5cGUuTUFQLAorICAgICAgICBOQU1FX1NFVCAgICA9PiBUVHlwZS5TRVQsCisgICAgICAgIE5BTUVfTElTVCAgID0+IFRUeXBlLkxJU1QKKyAgICBdOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRUeXBlSURGb3JUeXBlTmFtZShuYW1lIDogU3RyaW5nKSA6IEludAorICAgIHsKKyAgICAgICAgdmFyIHR5cGUgPSBOQU1FU19UT19UWVBFU1tuYW1lXTsKKyAgICAgICAgaWYoIG51bGwgIT0gdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB9CisKK30KKworCisvLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUgaW5zZXJ0aW5nL1JlYWRpbmcKKy8vIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycy4gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTkJhc2VDb250ZXh0Cit7CisgICAgcHJpdmF0ZSB2YXIgcHJvdG8gOiBUSlNPTlByb3RvY29sOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhwcm90byA6IFRKU09OUHJvdG9jb2wgKQorICAgIHsKKyAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBXcml0ZSgpIDogVm9pZCB7IH0KKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVhZCgpIDogVm9pZCB7IH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworCisvLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLgorLy8gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQgZm9yIHRoZSBmaXJzdCBvbmUKK0A6YWxsb3coVEpTT05Qcm90b2NvbCkKK2NsYXNzIEpTT05MaXN0Q29udGV4dCBleHRlbmRzIEpTT05CYXNlQ29udGV4dAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb3RvIDogVEpTT05Qcm90b2NvbCkgeworICAgICAgICBzdXBlcihwcm90byk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBXcml0ZSgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuQ09NTUEpOworICAgICAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgcHJvdG8udHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gUmVhZCgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5DT01NQSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLgorLy8gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uIG9mIGVhY2ggcmVjb3JkCisvLyBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbiBhZGRpdGlvbiwKKy8vIHdpbGwgaW5kaWNhdGUgdGhhdCBudW1iZXJzIGluIHRoZSBrZXkgcG9zaXRpb24gbmVlZCB0byBiZSBlc2NhcGVkCisvLyBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTlBhaXJDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG8gOiBUSlNPTlByb3RvY29sICkgeworICAgICAgICBzdXBlciggcHJvdG8pOworICAgIH0KKworICAgIHByaXZhdGUgdmFyIGZpcnN0IDogQm9vbCA9IHRydWU7CisgICAgcHJpdmF0ZSB2YXIgY29sb24gOiBCb29sICA9IHRydWU7CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gV3JpdGUoKSA6IFZvaWQgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBjb2xvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBjb2xvbiA/IEpTT05Db25zdGFudHMuQ09MT04gOiBKU09OQ29uc3RhbnRzLkNPTU1BKTsKKyAgICAgICAgICAgIHZhciB0bXAgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgIHByb3RvLnRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgY29sb24gPSAhY29sb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gUmVhZCgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RvLlJlYWRKU09OU3ludGF4Q2hhciggY29sb24gPyBKU09OQ29uc3RhbnRzLkNPTE9OIDogSlNPTkNvbnN0YW50cy5DT01NQSk7CisgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBFc2NhcGVOdW1iZXJzKCkgOiBCb29sCisgICAgeworICAgICAgICByZXR1cm4gY29sb247CisgICAgfQorfQorCisvLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKK0A6YWxsb3coVEpTT05Qcm90b2NvbCkKK2NsYXNzIExvb2thaGVhZFJlYWRlciB7CisKKyAgICBwcml2YXRlIHZhciBwcm90byA6IFRKU09OUHJvdG9jb2w7CisgICAgcHJpdmF0ZSB2YXIgZGF0YSA6IEJ5dGVzOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG8gOiBUSlNPTlByb3RvY29sICkgeworICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICAgIGRhdGEgPSBudWxsOworICAgIH0KKworCisgICAgLy8gUmV0dXJuIGFuZCBjb25zdW1lIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCwgZWl0aGVyIHRha2luZyBpdCBmcm9tIHRoZQorICAgIC8vIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgIHB1YmxpYyBmdW5jdGlvbiBSZWFkKCkgOiBCeXRlcyB7CisgICAgICAgIHZhciByZXR2YWwgPSBQZWVrKCk7CisgICAgICAgIGRhdGEgPSBudWxsOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKKyAgICAvLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbFJlYWR5LgorICAgIHB1YmxpYyBmdW5jdGlvbiBQZWVrKCkgOiBCeXRlcyB7CisgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHByb3RvLnRyYW5zLnJlYWRBbGwoYnVmLCAwLCAxKTsKKyAgICAgICAgICAgIGRhdGEgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjM1NThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2xGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorKiBKU09OIFByb3RvY29sIEZhY3RvcnkKKyovCitjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woIHRyYW5zIDogVFRyYW5zcG9ydCkgOiBUUHJvdG9jb2wgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKCB0cmFucyk7CisgICAgfQorfQorCisKKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTGlzdC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTGlzdC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTFmYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0Lmh4CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVExpc3QgeworCisgICAgcHVibGljIHZhciBlbGVtVHlwZSA6IEludDsKKyAgICBwdWJsaWMgdmFyIHNpemUgOiBJbnQ7CisKKyAgICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcodCA6IEludCA9IDAsIHMgOiBJbnQgPSAwKSB7CisgICAgICAgIGVsZW1UeXBlID0gdDsKKyAgICAgICAgc2l6ZSA9IHM7CisgICAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1hcC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTYyODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1hcC5oeApAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2NsYXNzIFRNYXAgeworCisgICAgcHVibGljIHZhciBrZXlUeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgdmFsdWVUeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2l6ZSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoayA6IEludCA9IDAsIHYgOiBJbnQgPSAwLCBzIDogSW50ID0gMCkgeworICAgICAga2V5VHlwZSA9IGs7CisgICAgICB2YWx1ZVR5cGUgPSB2OworICAgICAgc2l6ZSA9IHM7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTI2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuaHgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBUTWVzc2FnZSB7CisKKyAgICBwdWJsaWMgdmFyIG5hbWUgOiBTdHJpbmc7CisgICAgcHVibGljIHZhciB0eXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2VxaWQgOiBJbnQ7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG4gOiBTdHJpbmcgPSAiIiwgdCA6IEludCA9IDAsIHMgOiBJbnQgPSAwKSB7CisgICAgICBuYW1lID0gbjsKKyAgICAgIHR5cGUgPSB0OworICAgICAgc2VxaWQgPSBzOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpIDogU3RyaW5nIHsKKyAgICAgIHJldHVybiAiPFRNZXNzYWdlIG5hbWU6JyIgKyBuYW1lICsgIicgdHlwZTogIiArIHR5cGUgKyAiIHNlcWlkOiIgKyBzZXFpZCArICI+IjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG90aGVyOlRNZXNzYWdlKSA6IEJvb2wgeworICAgICAgcmV0dXJuIG5hbWUgPT0gb3RoZXIubmFtZSAmJiB0eXBlID09IG90aGVyLnR5cGUgJiYgc2VxaWQgPT0gb3RoZXIuc2VxaWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZVR5cGUuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZDMyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZVR5cGUuaHgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitAOmVudW0KK2Fic3RyYWN0IFRNZXNzYWdlVHlwZShJbnQpICBmcm9tIEludCB0byBJbnQgIHsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQ0FMTCAgICAgIDogSW50ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgUkVQTFkgICAgIDogSW50ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgRVhDRVBUSU9OIDogSW50ID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgT05FV0FZICAgIDogSW50ID0gNDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYWEzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmh4CkBAIC0wLDAgKzEsMTc3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5kcy5TdHJpbmdNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyAqIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpcyBhIFRQcm9jZXNzb3IgYWxsb3dpbmcgYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorICogVG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgcHJvY2Vzc29ycyB3aXRoIGl0LAorICogYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICoKKyAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAorICogICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgVFNlcnZlclRyYW5zcG9ydCB0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICoKKyAqICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIGltcGxlbWVudHMgVFByb2Nlc3NvcgoreworICAgIHByaXZhdGUgdmFyIHNlcnZpY2VQcm9jZXNzb3JNYXAgOiBTdHJpbmdNYXA8VFByb2Nlc3Nvcj4gPSBuZXcgU3RyaW5nTWFwPFRQcm9jZXNzb3I+KCk7CisgICAgcHJpdmF0ZSB2YXIgZGVmYXVsdFByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBudWxsOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiBUaGlzIGFsbG93cyB1cyB0byBicm9rZXIKKyAgICAgKiByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQXJnczoKKyAgICAgKiAtIHNlcnZpY2VOYW1lICAgIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgICogLSBwcm9jZXNzb3IgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgImhhbmRsZXJzIiwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIFJlZ2lzdGVyUHJvY2Vzc29yKHNlcnZpY2VOYW1lIDogU3RyaW5nLCBwcm9jZXNzb3IgOiBUUHJvY2Vzc29yLCBhc0RlZmF1bHQgOiBCb29sID0gZmFsc2UpIDogVm9pZCB7CisgICAgICAgIHNlcnZpY2VQcm9jZXNzb3JNYXAuc2V0KHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworICAgICAgICBpZiAoIGFzRGVmYXVsdCkgeworICAgICAgICAgICAgaWYoIGRlZmF1bHRQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOLCAiQ2FuJ3QgaGF2ZSBtdWx0aXBsZSBkZWZhdWx0IHByb2Nlc3NvcnMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBGYWlsKCBvcHJvdCA6IFRQcm90b2NvbCwgbWVzc2FnZSA6IFRNZXNzYWdlLCBleHR5cGUgOiBJbnQsIGV0eHQgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIHZhciBhcHBleCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oIGV4dHlwZSwgZXR4dCk7CisKKyAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UobWVzc2FnZS5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtZXNzYWdlLnNlcWlkKTsKKworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXdNZXNzYWdlKTsKKyAgICAgICAgYXBwZXgud3JpdGUoIG9wcm90KTsKKyAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgorICAgICAqIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCisgICAgICogLSBVc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLgorICAgICAqIC0gRGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICAgKiAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KKyAgICAgKgorICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYKKyAgICAgKiAtIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLAorICAgICAqIC0gdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvcgorICAgICAqIC0gdGhlIHNlcnZpY2UgbmFtZSBoYXMgbm90IGJlZW4gUmVnaXN0ZXJQcm9jZXNzb3IoKWVkLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogQm9vbCB7CisgICAgICAgIC8qICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiAgVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLiAqLworCisgICAgICAgIHZhciBtZXNzYWdlIDogVE1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIHZhciBtZXRob2ROYW1lIDogU3RyaW5nID0gIiI7CisKKyAgICAgICAgaWYgKChtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwpICYmIChtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uSU5WQUxJRF9NRVNTQUdFX1RZUEUsCisgICAgICAgICAgICAgICAgICAiTWVzc2FnZSB0eXBlIENBTEwgb3IgT05FV0FZIGV4cGVjdGVkIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgdmFyIGFjdHVhbFByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBudWxsOworICAgICAgICB2YXIgaW5kZXggPSBtZXNzYWdlLm5hbWUuaW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IHByb2Nlc3NvcgorICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1lc3NhZ2UubmFtZTsKKyAgICAgICAgICAgIGFjdHVhbFByb2Nlc3NvciA9IGRlZmF1bHRQcm9jZXNzb3I7CisgICAgICAgICAgICBpZiggYWN0dWFsUHJvY2Vzc29yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGYWlsKG9wcm90LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG1lc3NhZ2UubmFtZSArICIgYW5kIG5vIGRlZmF1bHQgcHJvY2Vzc29yIGRlZmluZWQuICIgKworICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzZXJ2aWNlIG5hbWUgZ2l2ZW4KKyAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoIHNlcnZpY2VOYW1lLmxlbmd0aCArIFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi5sZW5ndGgpOworICAgICAgICAgICAgYWN0dWFsUHJvY2Vzc29yID0gc2VydmljZVByb2Nlc3Nvck1hcC5nZXQoIHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICAgIGlmKCBhY3R1YWxQcm9jZXNzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBSZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgICAgIHZhciBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKCBtZXRob2ROYW1lLCBtZXNzYWdlLnR5cGUsIG1lc3NhZ2Uuc2VxaWQpOworICAgICAgICB2YXIgc3RvcmVkTXNnID0gbmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbCggaXByb3QsIG5ld01lc3NhZ2UpOworICAgICAgICByZXR1cm4gYWN0dWFsUHJvY2Vzc29yLnByb2Nlc3MoIHN0b3JlZE1zZywgb3Byb3QpOworICAgIH0KK30KKworCisvKioKKyAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAorICogIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCBhIFRNZXNzYWdlIGluIGV4YWN0bHkKKyAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgKi8KK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvcgoreworICAgIHByaXZhdGUgdmFyIG1lc3NhZ2VCZWdpbiA6IFRNZXNzYWdlOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG9jb2wgOiBUUHJvdG9jb2wsIG1lc3NhZ2VCZWdpbiA6IFRNZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKCBwcm90b2NvbCk7CisgICAgICAgIHRoaXMubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCkgOiBUTWVzc2FnZSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQmVnaW47CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjZDFkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oeApAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisgKiBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICogY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCisgKiB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgKgorICogTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICogT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgKgorICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICoKKyAqICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAqICAgICB0cmFuc3BvcnQub3BlbigpOworICoKKyAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAqCisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAqCisgKi8KK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yIHsKKworICAgIC8qKiBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lICovCisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNFUEFSQVRPUiA6IFN0cmluZyA9ICI6IjsKKworICAgIHByaXZhdGUgdmFyIHNlcnZpY2UgOiBTdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEFyZ3M6CisgICAgICogIHByb3RvY29sICAgICAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbAorICAgICAqICBzZXJ2aWNlTmFtZSAgICAgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb3RvY29sIDogVFByb3RvY29sLCBzZXJ2aWNlTmFtZSA6IFN0cmluZykgICAgeworICAgICAgICBzdXBlciggcHJvdG9jb2wpOworICAgICAgICBzZXJ2aWNlID0gc2VydmljZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KKyAgICAgKiBBcmdzOgorICAgICAqICAgdE1lc3NhZ2UgICAgIFRoZSBvcmlnaW5hbCBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbiggbWVzc2FnZSA6IFRNZXNzYWdlKSA6IFZvaWQgeworICAgICAgICBzd2l0Y2goIG1lc3NhZ2UudHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuQ0FMTDoKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgKyBTRVBBUkFUT1IgKyBtZXNzYWdlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXFpZCkpOworCisgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5PTkVXQVk6CisgICAgICAgICAgICAgICAgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlICsgU0VQQVJBVE9SICsgbWVzc2FnZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VxaWQpKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmMzg0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyogUHJvdG9jb2wgaW50ZXJmYWNlIGRlZmluaXRpb24KKyovCitpbnRlcmZhY2UgVFByb3RvY29sIHsKKworICAgIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydDsKKworICAgIC8qKgorICAgICAqIFdyaXRpbmcgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlOlRNZXNzYWdlKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oc3RydWN0OlRTdHJ1Y3QpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oZmllbGQ6VEZpZWxkKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKG1hcDpUTWFwKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4obGlzdDpUTGlzdCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKHNldDpUU2V0KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVCeXRlKGIgOiBJbnQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUkxNihpMTYgOiBJbnQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUkzMihpMzIgOiBJbnQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUk2NChpNjQgOiBoYXhlLkludDY0KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVEb3VibGUoZHViIDogRmxvYXQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVN0cmluZyhzdHIgOiBTdHJpbmcpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUJpbmFyeShiaW4gOiBCeXRlcykgOiBWb2lkOworCisgICAgLyoqCisgICAgICogUmVhZGluZyBtZXRob2RzLgorICAgICAqLworICAgIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKTpUTWVzc2FnZTsKKyAgICBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKTpUU3RydWN0OworICAgIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKTpURmllbGQ7CisgICAgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpOlRNYXA7CisgICAgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCk6VExpc3Q7CisgICAgZnVuY3Rpb24gcmVhZExpc3RFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCk6VFNldDsKKyAgICBmdW5jdGlvbiByZWFkU2V0RW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sOworICAgIGZ1bmN0aW9uIHJlYWRCeXRlKCkgOiBJbnQ7CisgICAgZnVuY3Rpb24gcmVhZEkxNigpIDogSW50OworICAgIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludDsKKyAgICBmdW5jdGlvbiByZWFkSTY0KCkgOiBoYXhlLkludDY0OworICAgIGZ1bmN0aW9uIHJlYWREb3VibGUoKSA6IEZsb2F0OworICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZzsKKyAgICBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlczsKKworICAgIC8vIHJlY3Vyc2lvbiB0cmFja2luZworICAgIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5ZTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaHgKQEAgLTAsMCArMSwyMjYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuSW50NjQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyAqIFRQcm90b2NvbERlY29yYXRvciBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQgVFByb3RvY29sIGluc3RhbmNlLAorICogcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiAgV2hpbGUgaXQgaGFzCisgKiBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAqIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wuCisgKgorICogU2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKQorICogU2VlIFRNdWx0aXBsZXhlZFByb3RvY29sCisgKi8KK2NsYXNzIFRQcm90b2NvbERlY29yYXRvciBpbXBsZW1lbnRzIFRQcm90b2NvbAoreworICAgIHByaXZhdGUgdmFyIHdyYXBwZWQgOiBUUHJvdG9jb2w7CisKKyAgICAvKioKKyAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBuZXcoIHByb3RvY29sIDogVFByb3RvY29sKSAgLy8gbm90IHRvIGJlIGluc3RhbnRpYXRlZCwgbXVzdCBkZXJpdmUgYSBjbGFzcworICAgIHsKKyAgICAgICAgd3JhcHBlZCA9IHByb3RvY29sOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKSA6IFRUcmFuc3BvcnQgeworICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0VHJhbnNwb3J0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCB2YWx1ZSA6IFRNZXNzYWdlKSA6IFZvaWQgICAgeworICAgICAgICB3cmFwcGVkLndyaXRlTWVzc2FnZUJlZ2luKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4odmFsdWUgOiBUU3RydWN0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU3RydWN0QmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbih2YWx1ZSA6IFRGaWVsZCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUZpZWxkQmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbiggdmFsdWUgOiBUTWFwKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlTWFwQmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCB2YWx1ZSA6IFRMaXN0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlTGlzdEJlZ2luKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oIHZhbHVlIDogVFNldCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZVNldEJlZ2luKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZVNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2wodmFsdWUgOiBCb29sKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlQm9vbCggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUodmFsdWUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVCeXRlKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KHZhbHVlIDogSW50KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlSTE2KCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKHZhbHVlIDogSW50KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlSTMyKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KHZhbHVlIDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUk2NCggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSh2YWx1ZSA6IEZsb2F0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlRG91YmxlKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHZhbHVlIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU3RyaW5nKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KHZhbHVlIDogQnl0ZXMgKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlQmluYXJ5KCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKSA6IFRNZXNzYWdlIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCkgOiBUU3RydWN0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKSA6IFRGaWVsZCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpIDogVE1hcCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRNYXBCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oKSA6IFRMaXN0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZExpc3RCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZExpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCkgOiBUU2V0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZFNldEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLnJlYWRTZXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woKSA6IEJvb2wKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRCb29sKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkQnl0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkSTE2KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRJMzIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRJNjQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgpIDogRmxvYXQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkRG91YmxlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJpbmFyeSgpIDogQnl0ZXMgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkQmluYXJ5KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjM3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworCisgICAgLy8gV0FSTklORzogVGhlc2UgYXJlIHN1YmplY3QgdG8gYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSwgc28gd2UgY2FuJ3QgdXNlIGVudW1zCisgICAgLy8gd2l0aCBIYXhlIDMuMS4zIGJlY2F1c2Ugb2YgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzM2NDkKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgVU5LTk9XTiA6IEludCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfREFUQSA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE5FR0FUSVZFX1NJWkUgOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTSVpFX0xJTUlUIDogSW50ID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQkFEX1ZFUlNJT04gOiBJbnQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBOT1RfSU1QTEVNRU5URUQgOiBJbnQgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBERVBUSF9MSU1JVCA6IEludCA9IDY7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGVycm9yIDogSW50ID0gVU5LTk9XTiwgbWVzc2FnZSA6IFN0cmluZyA9ICIiKSB7CisgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvcik7CisgICAgfQorCisKK30gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJkNjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKK2ludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgZnVuY3Rpb24gZ2V0UHJvdG9jb2wodHJhbnM6VFRyYW5zcG9ydCk6VFByb3RvY29sOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxZTQwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4CkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworCisgIC8qKgorICAgKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvdG9jb2wgZGF0YQorICAgKiBzdHJlYW1zLgorICAgKgorICAgKi8KK2NsYXNzIFRQcm90b2NvbFV0aWwgeworCisgICAgLyoqCisgICAgICogU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90ICB0aGUgcHJvdG9jb2wgb2JqZWN0IHRvIHJlYWQgZnJvbQorICAgICAqIEBwYXJhbSB0eXBlICB0aGUgbmV4dCB2YWx1ZSB3aWxsIGJlIGludGVwcmV0ZWQgYXMgdGhpcyBUVHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXAocHJvdDpUUHJvdG9jb2wsIHR5cGUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQm9vbCgpOworCisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCeXRlKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTE2KCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTMyKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTY0KCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQmluYXJ5KCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZDpURmllbGQgPSBwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIG1hcDpUTWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIDAgLi4uIG1hcC5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIG1hcC5rZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbWFwLnZhbHVlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNldDpUU2V0ID0gcHJvdC5yZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqIGluIDAgLi4uIHNldC5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIHNldC5lbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkU2V0RW5kKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0OlRMaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayBpbiAwIC4uLiBsaXN0LnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbGlzdC5lbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkTGlzdEVuZCgpOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKwkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgIlVua25vd24gZmllbGQgdHlwZSAke3R5cGV9Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChlOkR5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUmVjdXJzaW9uVHJhY2tlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUmVjdXJzaW9uVHJhY2tlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAyMTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4CkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CisKKworY2xhc3MgVFJlY3Vyc2lvblRyYWNrZXIgeworCisgICAgLy8gZGVmYXVsdAorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9SRUNVUlNJT05fREVQVEggOiBJbnQgPSA2NDsKKworICAgIC8vIGxpbWl0IGFuZCBhY3R1YWwgdmFsdWUKKyAgICBwdWJsaWMgdmFyIHJlY3Vyc2lvbkxpbWl0IDogSW50ID0gREVGQVVMVF9SRUNVUlNJT05fREVQVEg7CisgICAgcHJpdmF0ZSB2YXIgcmVjdXJzaW9uRGVwdGggOiBJbnQgPSAwOworCisgICAgcHVibGljIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkCisgICAgeworICAgICAgICBpZiAocmVjdXJzaW9uRGVwdGggPCByZWN1cnNpb25MaW1pdCkKKyAgICAgICAgICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIC0tcmVjdXJzaW9uRGVwdGg7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYWIzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2V0Lmh4CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVFNldCB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1UeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2l6ZSA6IEludDsKKworICAgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0IDogSW50ID0gMCwgcyA6IEludCA9IDApIHsKKyAgICAgICAgZWxlbVR5cGUgPSB0OworICAgICAgICBzaXplID0gczsKKyAgICAgIH0KKworfSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFN0cnVjdC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMGI3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFN0cnVjdC5oeApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2NsYXNzIFRTdHJ1Y3QgeworCisgICAgcHVibGljIHZhciBuYW1lIDogU3RyaW5nOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhuIDogU3RyaW5nID0gIiIpIHsKKyAgICAgIG5hbWUgPSBuOworICAgIH0KKworfSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUeXBlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUeXBlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYmJjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuaHgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitAOmVudW0KK2Fic3RyYWN0IFRUeXBlKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVE9QIDogSW50ICAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBWT0lEIDogSW50ICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCT09MIDogSW50ICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCWVRFIDogSW50ICAgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBET1VCTEUgOiBJbnQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJMTYgOiBJbnQgICAgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJMzIgOiBJbnQgICAgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJNjQgOiBJbnQgICAgPSAxMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RSSU5HIDogSW50ID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNUUlVDVCA6IEludCA9IDEyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBNQVAgOiBJbnQgICAgPSAxMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU0VUIDogSW50ICAgID0gMTQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIExJU1QgOiBJbnQgICA9IDE1OworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZWVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaHgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2NsYXNzIFRTZXJ2ZXIKK3sKKyAgICBwcml2YXRlIHZhciBwcm9jZXNzb3IgOiBUUHJvY2Vzc29yID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBzZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBpbnB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgdmFyIG91dHB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworCisgICAgLy8gc2VydmVyIGV2ZW50cworICAgIHB1YmxpYyB2YXIgc2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlciA9IG51bGw7CisKKyAgICAvLyBMb2cgZGVsZWdhdGlvbgorICAgIHByaXZhdGUgdmFyIF9sb2dEZWxlZ2F0ZSA6IER5bmFtaWMtPlZvaWQgID0gbnVsbDsKKyAgICBwdWJsaWMgdmFyIGxvZ0RlbGVnYXRlKGdldCxzZXQpIDogRHluYW1pYy0+Vm9pZDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlIDogRHluYW1pYy0+Vm9pZCA9IG51bGwpCisgICAgeworICAgICAgdGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgdGhpcy5sb2dEZWxlZ2F0ZSA9IGxvZ0RlbGVnYXRlOworCisgICAgICBBcHBseU1pc3NpbmdEZWZhdWx0cygpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gQXBwbHlNaXNzaW5nRGVmYXVsdHMoKSB7CisgICAgICAgIGlmKCBwcm9jZXNzb3IgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIHNlcnZlciBjb25maWd1cmF0aW9uOiBwcm9jZXNzb3IgbWlzc2luZyI7CisgICAgICAgIGlmKCBzZXJ2ZXJUcmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIHNlcnZlciBjb25maWd1cmF0aW9uOiBzZXJ2ZXJUcmFuc3BvcnQgbWlzc2luZyI7CisgICAgICAgIGlmKCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICBpZiggb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSAgPT0gbnVsbCkKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICAgICAgaWYoIGlucHV0UHJvdG9jb2xGYWN0b3J5ICA9PSBudWxsKQorICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgICAgICBpZiggb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID09IG51bGwpCisgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgIGlmKCBsb2dEZWxlZ2F0ZSA9PSBudWxsKQorICAgICAgICAgICAgbG9nRGVsZWdhdGUgPSBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHNldF9sb2dEZWxlZ2F0ZSh2YWx1ZSA6IER5bmFtaWMtPlZvaWQpIDogRHluYW1pYy0+Vm9pZCB7CisgICAgICAgIGlmKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9sb2dEZWxlZ2F0ZSA9IHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX2xvZ0RlbGVnYXRlID0gRGVmYXVsdExvZ0RlbGVnYXRlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbG9nRGVsZWdhdGU7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9sb2dEZWxlZ2F0ZSgpIDogRHluYW1pYy0+Vm9pZCB7CisgICAgICAgIHJldHVybiBfbG9nRGVsZWdhdGU7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIERlZmF1bHRMb2dEZWxlZ2F0ZSh2YWx1ZSA6IER5bmFtaWMpIDogVm9pZCAgeworICAgICAgICB0cmFjZSggdmFsdWUpOworICAgIH0KKworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU2VydmUoKSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIFN0b3AoKSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM5OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmh4CkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CisKKworLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlcgoraW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworCisgICAgLy8gQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucworICAgIGZ1bmN0aW9uIHByZVNlcnZlKCkgOiBWb2lkOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcKKyAgICBmdW5jdGlvbiBjcmVhdGVDb250ZXh0KCBpbnB1dCA6IFRQcm90b2NvbCwgb3V0cHV0IDogVFByb3RvY29sKSA6IER5bmFtaWM7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQKKyAgICBmdW5jdGlvbiBkZWxldGVDb250ZXh0KCBzZXJ2ZXJDb250ZXh0IDogRHluYW1pYywgaW5wdXQgOiBUUHJvdG9jb2wsIG91dHB1dCA6IFRQcm90b2NvbCkgOiBWb2lkOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yCisgICAgZnVuY3Rpb24gcHJvY2Vzc0NvbnRleHQoIHNlcnZlckNvbnRleHQgOiBEeW5hbWljLCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0KSA6IFZvaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwMDc0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcKK2NsYXNzIFRTaW1wbGVTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyICB7CisKKyAgICBwcml2YXRlIHZhciBzdG9wIDogQm9vbCA9IGZhbHNlOworCisgICAgLy9zdG9wcyBqdXN0IGFmdGVyIGlucHV0IHRyYW5zcG9ydCByZXR1cm5zIEVPRgorICAgIC8vdXNlZnVsIGZvciBsaW1pdGVkIHNjZW5hcmlvcywgbGlrZSBlbWJlZGluZyBpbnRvIHBocCBzZXJ2ZXIKKyAgICBwdWJsaWMgdmFyIHJ1bk9uY2UgOiBCb29sID0gZmFsc2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm9jZXNzb3IgOiBUUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIgOiBEeW5hbWljLT5Wb2lkID0gbnVsbCkgeworICAgICAgc3VwZXIoIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbG9nZ2VyKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBTZXJ2ZSgpIDogVm9pZAorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAodHR4IDogVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCwKKyAgICAgICAgLy8gYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCisgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSggISBzdG9wKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2xpZW50IDogVFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICB2YXIgaW5wdXRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBvdXRwdXRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBpbnB1dFByb3RvY29sIDogVFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBvdXRwdXRQcm90b2NvbCA6IFRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICB2YXIgY29ubmVjdGlvbkNvbnRleHQgOiBEeW5hbWljID0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KCBjbGllbnQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydCggY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKCBvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFJlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0CisgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIHByb2Nlc3Nvci5wcm9jZXNzKCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCB0dHggOiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFVzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICBpZihydW5PbmNlICYmIHR0eC5lcnJvcklEID09IFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgICAgICAgICAgIC8vaW5wdXQgcmV0dXJucyBlb2YsIGV4aXQKKyAgICAgICAgICAgICAgICAgIC8vZm9sbG93cyBsaWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCisgICAgICAgICAgICAgICAgICBTdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHBleCA6IFRQcm90b2NvbEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgnJHBleCAke3BleC5lcnJvcklEfSAke3BleC5lcnJvck1zZ30nKTsgLy8gVW5leHBlY3RlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKGUpOyAvLyBVbmV4cGVjdGVkCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGNsaWVudCAhPSBudWxsICYmICFydW5PbmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBTdG9wKCkgOiBWb2lkCisgICAgeworICAgICAgc3RvcCA9IHRydWU7CisgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzNmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworCitpbXBvcnQgaGF4ZS5pby5Fb2Y7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworCisKK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvLyBjb25zdGFudHMKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9CVUZTSVpFIDogSW50ID0gMHgxMDAwOyAgICAvLyA0MDk2IEJ5dGVzCisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1JTl9CVUZTSVpFIDogSW50ID0gMHgxMDA7ICAgICAgICAgLy8gMjU2IEJ5dGVzCisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1BWF9CVUZTSVpFIDogSW50ID0gMHgxMDAwMDA7ICAgICAgLy8gMSBNQgorCisgICAgLy8gVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICBwdWJsaWMgdmFyIHRyYW5zcG9ydChkZWZhdWx0LG51bGwpIDogIFRUcmFuc3BvcnQgPSBudWxsOworCisgICAgLy8gQnVmZmVyIGZvciBpbnB1dC9vdXRwdXQKKyAgICBwcml2YXRlIHZhciByZWFkQnVmZmVyXyA6IEJ5dGVzSW5wdXQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHdyaXRlQnVmZmVyXyA6IEJ5dGVzT3V0cHV0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBidWZTaXplIDogSW50OworCisgICAgLy8gQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnNwb3J0CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgYnVmU2l6ZSA6IEludCA9IERFRkFVTFRfQlVGU0laRSkgeworCisgICAgICAgIC8vIGVuc3VyZSBidWZmZXIgc2l6ZSBpcyBpbiB0aGUgcmFuZ2UKKyAgICAgICAgaWYgKCBidWZTaXplIDwgTUlOX0JVRlNJWkUpCisgICAgICAgICAgICBidWZTaXplID0gTUlOX0JVRlNJWkU7CisgICAgICAgIGVsc2UgaWYoIGJ1ZlNpemUgPiBNQVhfQlVGU0laRSkKKyAgICAgICAgICAgIGJ1ZlNpemUgPSBNQVhfQlVGU0laRTsKKworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgICAgdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpIDogVm9pZCB7CisgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGlzT3BlbigpIDogQm9vbCB7CisgICAgICAgIHJldHVybiB0cmFuc3BvcnQuaXNPcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgZGF0YSA9IEJ5dGVzLmFsbG9jKGxlbik7CisKKyAgICAgICAgICAgIHdoaWxlKCB0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZWFkQnVmZmVyXyAhPSBudWxsKSAmJiAocmVhZEJ1ZmZlcl8ucG9zaXRpb24gPCByZWFkQnVmZmVyXy5sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBnb3QgPSByZWFkQnVmZmVyXy5yZWFkQnl0ZXMoZGF0YSwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLCAwLCBnb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIHBvaW50IGluIGJ1ZmZlcmluZyB3aGVuZXZlciB0aGUKKyAgICAgICAgICAgICAgICAvLyByZW1haW5pbmcgbGVuZ3RoIGV4Y2VlZHMgdGhlIGJ1ZmZlciBzaXplCisgICAgICAgICAgICAgICAgaWYgKCBsZW4gPj0gYnVmU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICB2YXIgZ290ID0gdHJhbnNwb3J0LnJlYWQoIGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGVzKGRhdGEsIDAsIGdvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmlsbCB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgaWYgKCByZWFkQ2h1bmsoKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiByZWFkQ2h1bmsoKSA6IEludCB7CisgICAgICAgIHZhciBzaXplID0gYnVmU2l6ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHNpemUgPSB0cmFuc3BvcnQucmVhZCggYnVmZmVyLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJfID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJfLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChlb2YgOiBFb2YpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsICdDYW5cJ3QgcmVhZCAkc2l6ZSBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVDaHVuayhmb3JjZVdyaXRlIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIHdyaXRlQnVmZmVyXy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBpZiAoIGZvcmNlV3JpdGUgfHwgKHdyaXRlQnVmZmVyXy5sZW5ndGggPj0gYnVmU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICB2YXIgYnVmID0gd3JpdGVCdWZmZXJfLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXJfID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgICAgICAgICAgd3JpdGVCdWZmZXJfLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmIDogQnl0ZXMsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgaGFsZlNpemUgOiBJbnQgPSBTdGQuaW50KGJ1ZlNpemUgLyAyKTsKKworICAgICAgICAvLyBObyBwb2ludCBpbiBidWZmZXJpbmcgaWYgbGVuIGV4Y2VlZHMgdGhlIGJ1ZmZlciBzaXplLgorICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgYnVmZmVyIGlzIGxlc3MgdGhhbiBoYWxmIGZ1bGwgd2Ugc2hvdWxkIHN0aWxsIGNvbnNpZGVyCisgICAgICAgIC8vIHNxdWFzaGluZyBhbGwgaW50byBvbmUgd3JpdGUsIGV4Y2VwdCB3aGVuIHRoZSBhY3R1YWwgd3JpdGUgbGVuIGlzIHZlcnkgbGFyZ2UuCisgICAgICAgIHZhciBodWdlX3dyaXRlIDogQm9vbCA9IChsZW4gPj0gKDIgKiBidWZTaXplKSk7CisgICAgICAgIHZhciBleGNlZWRzX2J1ZiA6IEJvb2wgPSBodWdlX3dyaXRlIHx8IChsZW4gPj0gYnVmU2l6ZSk7CisgICAgICAgIHZhciB3cml0ZV90aHJ1IDogQm9vbCA9IGV4Y2VlZHNfYnVmICYmICh3cml0ZUJ1ZmZlcl8ubGVuZ3RoID49IGhhbGZTaXplKTsKKyAgICAgICAgaWYgKCB3cml0ZV90aHJ1KSB7CisgICAgICAgICAgICB3cml0ZUNodW5rKHRydWUpOyAvLyBmb3JjZSBzZW5kIHdoYXRldmVyIHdlIGhhdmUgaW4gdGhlcmUKKyAgICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShidWYsIG9mZiwgbGVuKTsgIC8vIHdyaXRlIHRocnUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlQnVmZmVyXy53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgd3JpdGVDaHVuayhmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goIGNhbGxiYWNrIDogRHluYW1pYy0+Vm9pZCA9bnVsbCkgOiBWb2lkIHsKKyAgICAgICAgd3JpdGVDaHVuayh0cnVlKTsKKyAgICAgICAgdHJhbnNwb3J0LmZsdXNoKGNhbGxiYWNrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5ZTcyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5oeApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CisKKworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIHByaXZhdGUgdmFyIGJ1ZlNpemUgOiBJbnQ7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGJ1ZlNpemUgOiBJbnQgPSBUQnVmZmVyZWRUcmFuc3BvcnQuREVGQVVMVF9CVUZTSVpFKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuYnVmU2l6ZSA9IGJ1ZlNpemU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldFRyYW5zcG9ydChiYXNlIDogVFRyYW5zcG9ydCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgcmV0dXJuIG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoYmFzZSwgYnVmU2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVN0cmVhbS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVTdHJlYW0uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4YWQxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVTdHJlYW0uaHgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5pby5JbnB1dDsKK2ltcG9ydCBoYXhlLmlvLk91dHB1dDsKKworCitlbnVtIFRGaWxlTW9kZSB7CisgICAgQ3JlYXRlTmV3OworICAgIEFwcGVuZDsKKyAgICBSZWFkOworfQorCisKK2NsYXNzIFRGaWxlU3RyZWFtIGltcGxlbWVudHMgVFN0cmVhbSB7CisKKyAgICBwdWJsaWMgdmFyIEZpbGVOYW1lKGRlZmF1bHQsbnVsbCkgOiBTdHJpbmc7CisKKyAgICBwcml2YXRlIHZhciBJbnB1dCAgOiBzeXMuaW8uRmlsZUlucHV0OworICAgIHByaXZhdGUgdmFyIE91dHB1dCA6IHN5cy5pby5GaWxlT3V0cHV0OworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBmbmFtZSA6IFN0cmluZywgbW9kZSA6IFRGaWxlTW9kZSkgeworICAgICAgICBGaWxlTmFtZSA9IGZuYW1lOworICAgICAgICBzd2l0Y2ggKCBtb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRGaWxlTW9kZS5DcmVhdGVOZXc6CisgICAgICAgICAgICAgICAgT3V0cHV0ID0gc3lzLmlvLkZpbGUud3JpdGUoIGZuYW1lLCB0cnVlKTsKKworICAgICAgICAgICAgY2FzZSBURmlsZU1vZGUuQXBwZW5kOgorICAgICAgICAgICAgICAgIE91dHB1dCA9IHN5cy5pby5GaWxlLmFwcGVuZCggZm5hbWUsIHRydWUpOworCisgICAgICAgICAgICBjYXNlIFRGaWxlTW9kZS5SZWFkOgorICAgICAgICAgICAgICAgIElucHV0ID0gc3lzLmlvLkZpbGUucmVhZCggZm5hbWUsIHRydWUpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBtb2RlIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZCB7CisgICAgICAgIGlmKCBJbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnB1dC5jbG9zZSgpOworICAgICAgICAgICAgSW5wdXQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmKCBPdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgT3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICBPdXRwdXQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFBlZWsoKSA6IEJvb2wgeworICAgICAgICBpZiggSW5wdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiRmlsZSBub3Qgb3BlbiBmb3IgaW5wdXQiKTsKKworICAgICAgICByZXR1cm4gKCEgSW5wdXQuZW9mKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBSZWFkKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBJbnQgeworICAgICAgICBpZiggSW5wdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiRmlsZSBub3Qgb3BlbiBmb3IgaW5wdXQiKTsKKworICAgICAgICByZXR1cm4gSW5wdXQucmVhZEJ5dGVzKCBidWYsIG9mZnNldCwgY291bnQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBXcml0ZSggYnVmIDogQnl0ZXMsIG9mZnNldCA6IEludCwgY291bnQgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGlmKCBPdXRwdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiRmlsZSBub3Qgb3BlbiBmb3Igb3V0cHV0Iik7CisKKyAgICAgICAgT3V0cHV0LndyaXRlQnl0ZXMoIGJ1Ziwgb2Zmc2V0LCBjb3VudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEZsdXNoKCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIE91dHB1dCAhPSBudWxsKQorICAgICAgICAgICAgT3V0cHV0LmZsdXNoKCk7CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjgyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKKworaW1wb3J0IGhheGUuaW8uRW9mOworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKKworCisvKioKKyAqIFRGcmFtZWRUcmFuc3BvcnQgaXMgYSBidWZmZXJlZCBUVHJhbnNwb3J0IHRoYXQgZW5zdXJlcyBhIGZ1bGx5IHJlYWQgbWVzc2FnZQorICogZXZlcnkgdGltZSBieSBwcmVjZWRpbmcgbWVzc2FnZXMgd2l0aCBhIDQtYnl0ZSBmcmFtZSBzaXplLgorICovCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX01BWF9MRU5HVEggPSAxNjM4NDAwMDsKKworICAgIHZhciBtYXhMZW5ndGhfIDogIEludDsKKworICAgIC8qKgorICAgICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICovCisgICAgdmFyIHRyYW5zcG9ydF8gOiAgVFRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIG91dHB1dAorICAgICAqLworICAgIHZhciB3cml0ZUJ1ZmZlcl8gOiBCeXRlc091dHB1dCA9IG5ldyBCeXRlc091dHB1dCgpOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciBpbnB1dAorICAgICAqLworICAgIHZhciByZWFkQnVmZmVyXyA6IEJ5dGVzSW5wdXQgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgbWF4TGVuZ3RoIDogSW50ID0gREVGQVVMVF9NQVhfTEVOR1RIKSB7CisgICAgICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgICAgICAgIG1heExlbmd0aF8gPSBtYXhMZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKSA6IFZvaWQgeworICAgICAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhbnNwb3J0Xy5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKGJ1ZiA6IEJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGRhdGEgPSBCeXRlcy5hbGxvYyhsZW4pOworCisgICAgICAgICAgICBpZiAoKHJlYWRCdWZmZXJfICE9IG51bGwpICYmIChyZWFkQnVmZmVyXy5wb3NpdGlvbiA8IHJlYWRCdWZmZXJfLmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICB2YXIgZ290IDogSW50ID0gcmVhZEJ1ZmZlcl8ucmVhZEJ5dGVzKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYWRkQnl0ZXMoZGF0YSwwLGdvdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCisgICAgICAgICAgICByZWFkRnJhbWUoKTsKKworICAgICAgICAgICAgdmFyIGdvdCA9IHJlYWRCdWZmZXJfLnJlYWRCeXRlcyhkYXRhLCBvZmYsIGxlbik7CisgICAgICAgICAgICBidWYuYWRkQnl0ZXMoZGF0YSwwLGdvdCk7CisgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlb2YgOiBFb2YpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsICdDYW5cJ3QgcmVhZCAkbGVuIGJ5dGVzIScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBmdW5jdGlvbiByZWFkRnJhbWVTaXplKCkgOiBJbnQgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgdmFyIGxlbiA9IHRyYW5zcG9ydF8ucmVhZEFsbCggYnVmZmVyLCAwLCA0KTsKKyAgICAgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIDQpOworICAgICAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gaW5wLnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkIDQgYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGZ1bmN0aW9uIHJlYWRGcmFtZSgpIDogVm9pZCB7CisgICAgICAgIHZhciBzaXplIDogSW50ID0gcmVhZEZyYW1lU2l6ZSgpOworCisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCRzaXplKSEnKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKHNpemUgPiBtYXhMZW5ndGhfKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdGcmFtZSBzaXplICgkc2l6ZSkgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoJG1heExlbmd0aF8pIScpOworICAgICAgICB9OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICBzaXplID0gdHJhbnNwb3J0Xy5yZWFkQWxsKCBidWZmZXIsIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChlb2YgOiBFb2YpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsICdDYW5cJ3QgcmVhZCAkc2l6ZSBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWYgOiBCeXRlcywgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnVmZmVyXy53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIGZ1bmN0aW9uIHdyaXRlRnJhbWVTaXplKGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIobGVuKTsKKyAgICAgICAgdHJhbnNwb3J0Xy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKCBjYWxsYmFjayA6IER5bmFtaWMtPlZvaWQgPW51bGwpIDogVm9pZCB7CisgICAgICAgIHZhciBidWYgOiBCeXRlcyA9IHdyaXRlQnVmZmVyXy5nZXRCeXRlcygpOworICAgICAgICB2YXIgbGVuIDogSW50ID0gYnVmLmxlbmd0aDsKKyAgICAgICAgd3JpdGVCdWZmZXJfID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisKKyAgICAgICAgd3JpdGVGcmFtZVNpemUobGVuKTsKKyAgICAgICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgIHRyYW5zcG9ydF8uZmx1c2goY2FsbGJhY2spOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQ1YTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5oeApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CisKKworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgICB2YXIgbWF4TGVuZ3RoXyA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobWF4TGVuZ3RoIDogSW50ID0gVEZyYW1lZFRyYW5zcG9ydC5ERUZBVUxUX01BWF9MRU5HVEgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgbWF4TGVuZ3RoXyA9IG1heExlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KGJhc2UgOiBUVHJhbnNwb3J0KSA6IFRUcmFuc3BvcnQgeworICAgICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYmFzZSwgbWF4TGVuZ3RoXyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTcyODUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuaHgKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBmbGFzaC5lcnJvcnMuRU9GRXJyb3I7CitpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50OworaW1wb3J0IGZsYXNoLmV2ZW50cy5JT0Vycm9yRXZlbnQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLlByb2dyZXNzRXZlbnQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLlNlY3VyaXR5RXJyb3JFdmVudDsKK2ltcG9ydCBmbGFzaC5uZXQuVVJMTG9hZGVyOworaW1wb3J0IGZsYXNoLm5ldC5VUkxMb2FkZXJEYXRhRm9ybWF0OworaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0OworaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0TWV0aG9kOworaW1wb3J0IGZsYXNoLnV0aWxzLklEYXRhSW5wdXQ7CitpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBmbGFzaC5uZXQuU29ja2V0OworaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7CisKKworICAgIC8qKgorICAgICAqIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQorICAgICAqIFRocmlmdCB3ZWIgc2VydmljZXMgaW1wbGVtZW50YXRpb24uCisgICAgICogVW5saWtlIEh0dHAgQ2xpZW50LCBpdCB1c2VzIGEgc2luZ2xlIFBPU1QsIGFuZCBjaHVuay1lbmNvZGluZyB0byB0cmFuc2ZlciBhbGwgbWVzc2FnZXMuCisgICAgICovCisKKyAgICBwdWJsaWMgY2xhc3MgVEZ1bGxEdXBsZXhIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSB2YXIgc29ja2V0IDogU29ja2V0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgaG9zdCAgOiAgU3RyaW5nOworICAgICAgICBwcml2YXRlIHZhciBwb3J0ICA6ICBJbnQ7CisgICAgICAgIHByaXZhdGUgdmFyIHJlc291cmNlICA6ICBTdHJpbmc7CisgICAgICAgIHByaXZhdGUgdmFyIHN0cmlwcGVkICA6ICBCb29sID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgdmFyIG9idWZmZXIgOiBCeXRlcyA9IG5ldyBCeXRlcygpOworICAgICAgICBwcml2YXRlIHZhciBpbnB1dCA6IElEYXRhSW5wdXQ7CisgICAgICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IElEYXRhT3V0cHV0OworICAgICAgICBwcml2YXRlIHZhciBieXRlc0luQ2h1bmsgIDogIEludCA9IDA7CisgICAgICAgIHByaXZhdGUgdmFyIENSTEYgOiBCeXRlcyA9IG5ldyBCeXRlcygpOworICAgICAgICBwcml2YXRlIHZhciBpb0NhbGxiYWNrIDogVEV4Y2VwdGlvbi0+Vm9pZCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgdmFyIGV2ZW50RGlzcGF0Y2hlciA6IEV2ZW50RGlzcGF0Y2hlciA9IG5ldyBFdmVudERpc3BhdGNoZXIoKTsKKworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGhvc3QgIDogIFN0cmluZywgcG9ydCAgOiAgSW50LCByZXNvdXJjZSAgOiAgU3RyaW5nKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICBDUkxGLndyaXRlQnl0ZSgxMyk7CisgICAgICAgICAgICBDUkxGLndyaXRlQnl0ZSgxMCk7CisgICAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBudWxsOworICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSBudWxsOworICAgICAgICAgICAgdGhpcy5zdHJpcHBlZCA9IGZhbHNlOworICAgICAgICAgICAgc29ja2V0LmNsb3NlKCkKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBwZWVrKCkgIDogIEJvb2wKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc29ja2V0LmNvbm5lY3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiQnl0ZXMgcmVtYWluZWQ6IiArIHNvY2tldC5ieXRlc0F2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5ieXRlc0F2YWlsYWJsZT4wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmIDogQnl0ZXMsIG9mZiAgOiAgSW50LCBsZW4gIDogIEludCkgIDogIEludAorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbjEgIDogIEludCA9IDAsIG4yICA6ICBJbnQgPSAwLCBuMyAgOiAgSW50ID0gMCwgbjQgIDogIEludCA9IDAsIGNpZHggIDogIEludCA9IDI7CisgICAgICAgICAgICB2YXIgY2h1bmtTaXplIDogQnl0ZXMgPSBuZXcgQnl0ZXMoKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFzdHJpcHBlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG4xID0gbjI7CisgICAgICAgICAgICAgICAgICAgIG4yID0gbjM7CisgICAgICAgICAgICAgICAgICAgIG4zID0gbjQ7CisgICAgICAgICAgICAgICAgICAgIG40ID0gaW5wdXQucmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChuMSA9PSAxMykgJiYgKG4yID09IDEwKSAmJiAobjMgPT0gMTMpICYmIChuNCA9PSAxMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlYWQgY2h1bmsgc2l6ZQorICAgICAgICAgICAgICAgIGlmIChieXRlc0luQ2h1bmsgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG4xID0gaW5wdXQucmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbjIgPSBpbnB1dC5yZWFkQnl0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZS53cml0ZUJ5dGUobjEpOworICAgICAgICAgICAgICAgICAgICBjaHVua1NpemUud3JpdGVCeXRlKG4yKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoISgobjEgPT0gMTMpICYmIChuMiA9PSAxMCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuMSA9IG4yOworICAgICAgICAgICAgICAgICAgICAgICAgbjIgPSBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplLndyaXRlQnl0ZShuMik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBieXRlc0luQ2h1bmsgPSBwYXJzZUludChjaHVua1NpemUudG9TdHJpbmcoKSwgMTYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlucHV0LnJlYWRCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBkZWJ1Z0J1ZmZlcihidWYpOworICAgICAgICAgICAgICAgIGJ5dGVzSW5DaHVuayAtPSBsZW47CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNJbkNodW5rID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRoZSAgOiAgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgIGlucHV0LnJlYWRVVEZCeXRlcygyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRU9GRXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbiAkZScpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoZSA6IEVycm9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0JhZCBJTyBlcnJvcjogJGUnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdCYWQgSU8gZXJyb3I6ICRlJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBkZWJ1Z0J1ZmZlcihidWYgOiBCeXRlcykgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGRlYnVnICA6ICBTdHJpbmcgPSAiQlVGRkVSID4+IjsKKyAgICAgICAgICAgIHZhciBpICA6ICBJbnQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlYnVnICs9IGJ1ZltpXSBhcyBpbnQ7CisgICAgICAgICAgICAgICAgZGVidWcgKz0gIiAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjZShkZWJ1ZyArICI8PCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZiA6IEJ5dGVzLCBvZmYgIDogIEludCwgbGVuICA6ICBJbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIG9idWZmZXIud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUgIDogIFN0cmluZywgbGlzdGVuZXIgOiBGdW5jdGlvbiwgdXNlQ2FwdHVyZSAgOiAgQm9vbCA9IGZhbHNlLCBwcmlvcml0eSAgOiAgSW50ID0gMCwgdXNlV2Vha1JlZmVyZW5jZSAgOiAgQm9vbCA9IGZhbHNlKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlLCBwcmlvcml0eSwgdXNlV2Vha1JlZmVyZW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihFdmVudC5DT05ORUNULCBzb2NrZXRDb25uZWN0ZWQpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihJT0Vycm9yRXZlbnQuSU9fRVJST1IsIHNvY2tldEVycm9yKTsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoU2VjdXJpdHlFcnJvckV2ZW50LlNFQ1VSSVRZX0VSUk9SLCBzb2NrZXRTZWN1cml0eUVycm9yKTsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoUHJvZ3Jlc3NFdmVudC5TT0NLRVRfREFUQSwgc29ja2V0RGF0YUhhbmRsZXIpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXRDb25uZWN0ZWQoZXZlbnQgOiBFdmVudCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSB0aGlzLnNvY2tldDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSB0aGlzLnNvY2tldDsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKCAiQ09OTkVDVCAiICsgcmVzb3VyY2UgKyAiIEhUVFAvMS4xXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkhvc3QgOiAgIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZXItQWdlbnQgOiAgVGhyaWZ0L0hheGVcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUcmFuc2Zlci1FbmNvZGluZyA6ICBjaHVua2VkXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29udGVudC10eXBlIDogIGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWNjZXB0IDogICovKlxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxyXG4iKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldEVycm9yKGV2ZW50IDogSU9FcnJvckV2ZW50KSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgiRXJyb3IgQ29ubmVjdGluZzoiICsgZXZlbnQpOworICAgICAgICAgICAgdGhpcy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGlvQ2FsbGJhY2sgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpb0NhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIklPRXJyb3IgOiAgIiArIGV2ZW50LnRleHQpKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldFNlY3VyaXR5RXJyb3IoZXZlbnQgOiBTZWN1cml0eUVycm9yRXZlbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJTZWN1cml0eSBFcnJvciBDb25uZWN0aW5nOiIgKyBldmVudCk7CisgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CisgICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzb2NrZXREYXRhSGFuZGxlcihldmVudCA6IFByb2dyZXNzRXZlbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJHb3QgRGF0YSBjYWxsOiIgK2lvQ2FsbGJhY2spOworICAgICAgICAgICAgaWYgKGlvQ2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrIDogRXJyb3ItPlZvaWQgPSBudWxsKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgic2V0IGNhbGxiYWNrOiIgKyBjYWxsYmFjayk7CisgICAgICAgICAgICB0aGlzLmlvQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKHRoaXMub2J1ZmZlci5sZW5ndGgudG9TdHJpbmcoMTYpKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXMoQ1JMRik7CisgICAgICAgICAgICB0aGlzLm91dHB1dC53cml0ZUJ5dGVzKHRoaXMub2J1ZmZlcik7CisgICAgICAgICAgICB0aGlzLm91dHB1dC53cml0ZUJ5dGVzKENSTEYpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuZmx1c2goKTsKKyAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yICBuZXcgRmxleCBzZGsgMy41CisgICAgICAgICAgICAvL3RoaXMub2J1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgdGhpcy5vYnVmZmVyID0gbmV3IEJ5dGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgIDogIEJvb2wKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICh0aGlzLnNvY2tldCA9PSBudWxsID8gZmFsc2UgIDogIHRoaXMuc29ja2V0LmNvbm5lY3RlZCk7CisgICAgICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Zjg2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmh4CkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CisKK2ltcG9ydCBoYXhlLkh0dHA7CisKKworCisvKioKKyogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFVzZWQgZm9yIHdvcmtpbmcgd2l0aCBhCisqIFRocmlmdCB3ZWIgc2VydmljZXMgaW1wbGVtZW50YXRpb24uCisqLworCitjbGFzcyBUSHR0cENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQgeworCisgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdEJ1ZmZlcl8gIDogQnl0ZXNPdXRwdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICBwcml2YXRlIHZhciByZXNwb25zZUJ1ZmZlcl8gOiBCeXRlc0lucHV0ID0gbnVsbDsKKworICAgIHByaXZhdGUgdmFyIHJlcXVlc3RfICAgICAgICA6IEh0dHAgPSBudWxsOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCByZXF1ZXN0VXJsIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICAgIHJlcXVlc3RfID0gbmV3IEh0dHAocmVxdWVzdFVybCk7CisgICAgICAgIHJlcXVlc3RfLmFkZEhlYWRlciggImNvbnRlbnRUeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpIDogVm9pZCB7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKGJ1ZjpCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgaWYgKHJlc3BvbnNlQnVmZmVyXyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICJSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGF0YSA9Qnl0ZXMuYWxsb2MobGVuKTsKKyAgICAgICAgbGVuID0gcmVzcG9uc2VCdWZmZXJfLnJlYWRCeXRlcyhkYXRhLCBvZmYsIGxlbik7CisgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLDAsbGVuKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgIHJlcXVlc3RCdWZmZXJfLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2s6RHluYW1pYy0+Vm9pZCA9IG51bGwpIDogVm9pZCB7CisgICAgICAgIHZhciBidWZmZXIgPSByZXF1ZXN0QnVmZmVyXzsKKyAgICAgICAgcmVxdWVzdEJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgcmVzcG9uc2VCdWZmZXJfID0gbnVsbDsKKworICAgICAgICByZXF1ZXN0Xy5vbkRhdGEgPSBmdW5jdGlvbihkYXRhIDogU3RyaW5nKSB7CisgICAgICAgICAgICB2YXIgdG1wID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB0bXAuYWRkU3RyaW5nKGRhdGEpOworICAgICAgICAgICAgcmVzcG9uc2VCdWZmZXJfID0gbmV3IEJ5dGVzSW5wdXQodG1wLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgaWYoIGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICByZXF1ZXN0Xy5vbkVycm9yID0gZnVuY3Rpb24obXNnIDogU3RyaW5nKSB7CisgICAgICAgICAgICBpZiggY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIklPRXJyb3I6ICIgKyBtc2cpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICByZXF1ZXN0Xy5zZXRQb3N0RGF0YShidWZmZXIuZ2V0Qnl0ZXMoKS50b1N0cmluZygpKTsKKyAgICAgICAgcmVxdWVzdF8ucmVxdWVzdCh0cnVlLypQT1NUKi8pOworICAgIH0KKworfQorCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYWRiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLnJlbW90aW5nLlNvY2tldFByb3RvY29sOworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLklucHV0OworaW1wb3J0IGhheGUuaW8uT3V0cHV0OworaW1wb3J0IGhheGUuaW8uRW9mOworCisvL2ltcG9ydCBmbGFzaC5uZXQuU2VydmVyU29ja2V0OyAtIG5vdCB5ZXQgYXZhaWxhYmxlIG9uIEhheGUgMy4xLjMKKyNpZiAhIChmbGFzaCB8fCBodG1sNSkKKworaW1wb3J0IHN5cy5uZXQuSG9zdDsKKworCitjbGFzcyBUU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydCB7CisKKyAgICAvLyBVbmRlcmx5aW5nIHNlcnZlciB3aXRoIHNvY2tldAorICAgIHByaXZhdGUgdmFyIF9zb2NrZXQgOiBTb2NrZXQ9IG51bGw7CisKKyAgICAvLyBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdAorICAgIHByaXZhdGUgdmFyIF9jbGllbnRUaW1lb3V0IDogRmxvYXQgPSA1OworCisgICAgLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCisgICAgcHJpdmF0ZSB2YXIgX3VzZUJ1ZmZlcmVkU29ja2V0cyA6IEJvb2wgPSBmYWxzZTsKKworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyg/YWRkcmVzcyA6IFN0cmluZyA9ICdsb2NhbGhvc3QnLCAgcG9ydCA6IEludCwgY2xpZW50VGltZW91dCA6IEZsb2F0ID0gNSwgdXNlQnVmZmVyZWRTb2NrZXRzIDogQm9vbCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgX2NsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBfc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICAgICAgX3NvY2tldC5iaW5kKCBuZXcgSG9zdChhZGRyZXNzKSwgcG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICRwb3J0OiAkZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gTGlzdGVuKCkgOiBWb2lkCisgICAgeworICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICBpZiAoX3NvY2tldCAhPSBudWxsKSAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjaWYgIXBocAorICAgICAgICAgICAgICAgIF9zb2NrZXQubGlzdGVuKDEpOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnRXJyb3IgJGUnKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAkZScpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBvdmVycmlkZSBmdW5jdGlvbiBBY2NlcHRJbXBsKCkgOiBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBpZiAoX3NvY2tldCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYWNjZXB0ZWQgPSBfc29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRTb2NrZXQuZnJvbVNvY2tldChhY2NlcHRlZCk7CisgICAgICAgICAgICByZXN1bHQuc2V0VGltZW91dCggX2NsaWVudFRpbWVvdXQpOworCisgICAgICAgICAgICBpZiggX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAiYnVmZmVyZWQgdHJhbnNwb3J0IG5vdCB5ZXQgc3VwcG9ydGVkIjsgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICAvL3Jlc3VsdCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJyRlJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gQ2xvc2UoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIGlmIChfc29ja2V0ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnRXJyb3IgJGUnKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICRlJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZApkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODk5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworY2xhc3MgVFNlcnZlclRyYW5zcG9ydCB7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gQWNjZXB0KCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA9IEFjY2VwdEltcGwoKTsKKyAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBMaXN0ZW4oKSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBBY2NlcHRJbXBsKCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0MWFiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeApAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworI2lmIGZsYXNoCitpbXBvcnQgZmxhc2gubmV0LlNvY2tldDsKKyNlbHNlaWYganMKK2ltcG9ydCBqcy5odG1sLldlYlNvY2tldDsKKyNlbHNlCitpbXBvcnQgaGF4ZS5yZW1vdGluZy5Tb2NrZXRQcm90b2NvbDsKKyNlbmQKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLklucHV0OworaW1wb3J0IGhheGUuaW8uT3V0cHV0OworaW1wb3J0IGhheGUuaW8uRW9mOworCisKKyNpZiAhIChmbGFzaCB8fCBqcykKK2ltcG9ydCBzeXMubmV0Lkhvc3Q7CisjZW5kCisKKworICAvKioKKyAgICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVXNlZCBmb3Igd29ya2luZyB3aXRoIGEKKyAgICogVGhyaWZ0IFNvY2tldCBTZXJ2ZXIgYmFzZWQgaW1wbGVtZW50YXRpb25zLgorICAgKi8KKworY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQgIHsKKworICAgICNpZiAoZmxhc2ggfHwganMpCisgICAgcHJpdmF0ZSB2YXIgaG9zdCAgOiAgU3RyaW5nOworICAgICNlbHNlCisgICAgcHJpdmF0ZSB2YXIgaG9zdCAgOiAgSG9zdDsKKyAgICAjZW5kCisKKyAgICBwcml2YXRlIHZhciBwb3J0ICA6ICBJbnQ7CisKKyAgICAjaWYganMKKyAgICBwcml2YXRlIHZhciBzb2NrZXQgOiBXZWJTb2NrZXQgPSBudWxsOworICAgICNlbHNlCisgICAgcHJpdmF0ZSB2YXIgc29ja2V0IDogU29ja2V0ID0gbnVsbDsKKyAgICAjZW5kCisKKyAgICAjaWYganMKKyAgICBwcml2YXRlIHZhciBpbnB1dCA6IER5bmFtaWMgPSBudWxsOworICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IFdlYlNvY2tldCA9IG51bGw7CisgICAgI2Vsc2VpZiBmbGFzaAorICAgIHByaXZhdGUgdmFyIGlucHV0IDogU29ja2V0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBvdXRwdXQgOiBTb2NrZXQgPSBudWxsOworICAgICNlbHNlCisgICAgcHJpdmF0ZSB2YXIgaW5wdXQgOiBJbnB1dCA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0IDogT3V0cHV0ID0gbnVsbDsKKyAgICAjZW5kCisKKyAgICBwcml2YXRlIHZhciB0aW1lb3V0IDogRmxvYXQgPSAzMDsKKworICAgIHByaXZhdGUgdmFyIG9idWZmZXIgOiBCeXRlc091dHB1dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgIHByaXZhdGUgdmFyIGlvQ2FsbGJhY2sgOiBURXhjZXB0aW9uLT5Wb2lkID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciByZWFkQ291bnQgOiBJbnQgPSAwOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhob3N0IDogU3RyaW5nLCBwb3J0ICA6ICBJbnQpICA6ICBWb2lkICB7CisgICAgICAgICNpZiAoZmxhc2ggfHwganMpCisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICNlbHNlCisgICAgICAgIHRoaXMuaG9zdCA9IG5ldyBIb3N0KGhvc3QpOworICAgICAgICAjZW5kCisKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB9CisKKyAgICAjaWYgISAoZmxhc2ggfHwganMpCisgICAgLy8gdXNlZCBieSBUU29ja2V0U2VydmVyCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU29ja2V0KCBzb2NrZXQgOiBTb2NrZXQpIDogVFNvY2tldCAgeworICAgICAgICB2YXIgc29ja2V0SG9zdCA9IHNvY2tldC5ob3N0KCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVFNvY2tldChzb2NrZXRIb3N0Lmhvc3QudG9TdHJpbmcoKSwgc29ja2V0SG9zdC5wb3J0KTsKKyAgICAgICAgcmVzdWx0LmFzc2lnblNvY2tldChzb2NrZXQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAjZW5kCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSAgOiAgVm9pZCAgeworICAgICAgICBpbnB1dCA9IG51bGw7CisgICAgICAgIG91dHB1dCA9IG51bGw7CisgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBwZWVrKCkgIDogIEJvb2wgIHsKKyAgICAgICAgaWYoIChpbnB1dCA9PSBudWxsKSB8fCAoc29ja2V0ID09IG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjaWYgZmxhc2gKKyAgICAgICAgICAgIHJldHVybiAoaW5wdXQuYnl0ZXNBdmFpbGFibGUgPiAwKTsKKyAgICAgICAgICAgICNlbHNlaWYganMKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIHZhciByZWFkeSA9IFNvY2tldC5zZWxlY3QoIFtzb2NrZXRdLCBudWxsLCBudWxsLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAocmVhZHkucmVhZC5sZW5ndGggPiAwKTsKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBpbnRvIGJ1ZmZlciBidWYsIHN0YXJ0aW5nIGF0dCBvZmZzZXQgb2ZmLgorICAgIC8vIE1heSByZXR1cm4gbGVzcyBieXRlcyB0aGFuIGxlbiByZXF1aXJlZAorICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKCBidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50ICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgI2lmIGZsYXNoCisKKyAgICAgICAgICAgIHZhciByZW1haW5pbmcgPSBsZW47CisgICAgICAgICAgICB3aGlsZSggcmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlKCBpbnB1dC5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgICAgICAtLXJlbWFpbmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW47CisKKyAgICAgICAgICAgICNlbHNlaWYganMKKworICAgICAgICAgICAgaWYoIGlucHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICJTdGlsbCBubyBkYXRhICIpOyAgLy8gZG9uJ3QgYmxvY2sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBuciA9IGxlbjsKKyAgICAgICAgICAgIHdoaWxlKCBuciA8IGxlbikgeworICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlKCBpbnB1dC5nZXQob2ZmK25yKSk7CisgICAgICAgICAgICAgICAgKytucjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW47CisKKyAgICAgICAgICAgICNlbHNlCisKKyAgICAgICAgICAgIC8vc29ja2V0LndhaXRGb3JSZWFkKCk7ICAtICBubywgdGhpcyBpZ25vcmVzIHRpbWVvdXQgYW5kIGJsb2NrcyBpbmZpbml0ZWx5CisgICAgICAgICAgICBpZihyZWFkQ291bnQgPCBvZmYpIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5yZWFkKG9mZi1yZWFkQ291bnQpOworICAgICAgICAgICAgICAgIHJlYWRDb3VudCA9IG9mZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGRhdGEgPSBCeXRlcy5hbGxvYyhsZW4pOworICAgICAgICAgICAgdmFyIGdvdCA9IGlucHV0LnJlYWRCeXRlcyhkYXRhLCAwLCBsZW4pOworICAgICAgICAgICAgYnVmLmFkZEJ5dGVzKCBkYXRhLCAwLCBnb3QpOworICAgICAgICAgICAgcmVhZENvdW50ICs9IGdvdDsKKyAgICAgICAgICAgIHJldHVybiBnb3Q7CisKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IEVvZikKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0VvZiAkZScpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUuIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbiAkZScpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQmFkIElPIGVycm9yIDogJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZiA6IEJ5dGVzLCBvZmYgIDogIEludCwgbGVuICA6ICBJbnQpICA6ICBWb2lkCisgICAgeworICAgICAgICBvYnVmZmVyLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjayA6IER5bmFtaWMtPlZvaWQgPSBudWxsKSAgOiAgVm9pZAorICAgIHsKKyAgICAgICAgaWYoICEgaXNPcGVuKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJUcmFuc3BvcnQgbm90IG9wZW4iKTsKKyAgICAgICAgfQorCisgICAgICAgICNpZiBmbGFzaAorCisgICAgICAgIHZhciBieXRlcyA9IG5ldyBmbGFzaC51dGlscy5CeXRlQXJyYXkoKTsKKyAgICAgICAgdmFyIGRhdGEgPSBvYnVmZmVyLmdldEJ5dGVzKCk7CisgICAgICAgIHZhciBsZW4gPSAwOworICAgICAgICB3aGlsZSggbGVuIDwgZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGJ5dGVzLndyaXRlQnl0ZShkYXRhLmdldChsZW4pKTsKKyAgICAgICAgICAgICsrbGVuOworICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiBqcworCisgICAgICAgIHZhciBkYXRhID0gb2J1ZmZlci5nZXRCeXRlcygpOworICAgICAgICB2YXIgb3V0YnVmID0gbmV3IGpzLmh0bWwuSW50OEFycmF5KGRhdGEubGVuZ3RoKTsKKyAgICAgICAgdmFyIGxlbiA9IDA7CisgICAgICAgIHdoaWxlKCBsZW4gPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgb3V0YnVmLnNldCggW2RhdGEuZ2V0KGxlbildLCBsZW4pOworICAgICAgICAgICAgKytsZW47CisgICAgICAgIH0KKyAgICAgICAgdmFyIGJ5dGVzID0gb3V0YnVmLmJ1ZmZlcjsKKworICAgICAgICAjZWxzZQorCisgICAgICAgIHZhciBieXRlcyA9IG9idWZmZXIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aDsKKworICAgICAgICAjZW5kCisKKyAgICAgICAgb2J1ZmZlciA9IG5ldyBCeXRlc091dHB1dCgpOworCisKKyAgICAgICAgaW9DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZENvdW50ID0gMDsKKworICAgICAgICAgICAgI2lmIGpzCisgICAgICAgICAgICBvdXRwdXQuc2VuZCggYnl0ZXMpOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIG91dHB1dC53cml0ZUJ5dGVzKCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgICNlbmQKKworICAgICAgICAgICAgaWYoaW9DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW9DYWxsYmFjayhudWxsKTsgIC8vIHN1Y2Nlc3MgY2FsbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ1RFeGNlcHRpb24gJGUsIG1lc3NhZ2UgOiAke2UuZXJyb3JNc2d9Jyk7CisgICAgICAgICAgICBpZihpb0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykgeworICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICBpZihpb0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0JhZCBJTyBlcnJvciA6ICRlJykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGlzT3BlbigpICA6ICBCb29sCisgICAgeworICAgICAgICByZXR1cm4gKHNvY2tldCAhPSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpICA6ICBWb2lkCisgICAgeworICAgICAgICAjaWYganMKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCBldmVudCA6IGpzLmh0bWwuTWVzc2FnZUV2ZW50KSB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gZXZlbnQuZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgICNlbHNlaWYgZmxhc2gKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisKKyAgICAgICAgI2Vsc2VpZiBwaHAKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgICAgIHNvY2tldC5zZXRCbG9ja2luZyh0cnVlKTsKKyAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgdmFyIHNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgICAgc29ja2V0LnNldEJsb2NraW5nKHRydWUpOworICAgICAgICBzb2NrZXQuc2V0RmFzdFNlbmQodHJ1ZSk7CisgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHRpbWVvdXQpOworICAgICAgICBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKworICAgICAgICAjZW5kCisKKyAgICAgICAgYXNzaWduU29ja2V0KCBzb2NrZXQpOworICAgIH0KKworICAgICNpZiBqcworICAgIHByaXZhdGUgZnVuY3Rpb24gYXNzaWduU29ja2V0KCBzb2NrZXQgOiBXZWJTb2NrZXQpICA6ICBWb2lkCisgICAgI2Vsc2UKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGFzc2lnblNvY2tldCggc29ja2V0IDogU29ja2V0KSAgOiAgVm9pZAorICAgICNlbmQKKyAgICB7CisgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0OworCisgICAgICAgICNpZiAoZmxhc2ggfHwganMpCisgICAgICAgIG91dHB1dCA9IHNvY2tldDsKKyAgICAgICAgaW5wdXQgPSBzb2NrZXQ7CisKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgb3V0cHV0ID0gc29ja2V0Lm91dHB1dDsKKyAgICAgICAgaW5wdXQgPSBzb2NrZXQuaW5wdXQ7CisKKyAgICAgICAgI2VuZAorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0KCB0aW1lb3V0IDogRmxvYXQgKSA6IFZvaWQgeworICAgICAgICBpZihpc09wZW4oKSkgeworICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0cmVhbS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0cmVhbS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIzZWQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtLmh4CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CisKKworaW50ZXJmYWNlIFRTdHJlYW0geworICAgIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIFBlZWsoKSA6IEJvb2w7CisgICAgZnVuY3Rpb24gUmVhZCggYnVmIDogQnl0ZXMsIG9mZnNldCA6IEludCwgY291bnQgOiBJbnQpIDogSW50OworICAgIGZ1bmN0aW9uIFdyaXRlKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIEZsdXNoKCkgOiBWb2lkOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTdjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuaHgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKKworCitjbGFzcyBUU3RyZWFtVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgICBwdWJsaWMgdmFyIElucHV0U3RyZWFtKGRlZmF1bHQsbnVsbCkgOiBUU3RyZWFtOworICAgIHB1YmxpYyB2YXIgT3V0cHV0U3RyZWFtKGRlZmF1bHQsbnVsbCkgOiBUU3RyZWFtOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBpbnB1dCA6IFRTdHJlYW0sIG91dHB1dCA6IFRTdHJlYW0pIHsKKyAgICAgICAgdGhpcy5JbnB1dFN0cmVhbSA9IGlucHV0OworICAgICAgICB0aGlzLk91dHB1dFN0cmVhbSA9IG91dHB1dDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gKElucHV0U3RyZWFtICE9IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgICAgICBpZiAoSW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoT3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZWFkKCBidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgaWYgKElucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBJbnB1dFN0cmVhbSIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGRhdGEgOiBCeXRlcyA9ICBCeXRlcy5hbGxvYyhsZW4pOworICAgICAgICB2YXIgc2l6ZSA9IElucHV0U3RyZWFtLlJlYWQoIGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgYnVmLmFkZEJ5dGVzKCBkYXRhLCAwLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZjpCeXRlcywgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCB3cml0ZSB0byBudWxsIE91dHB1dFN0cmVhbSIpOworICAgICAgICB9CisKKyAgICAgICAgT3V0cHV0U3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjazpEeW5hbWljLT5Wb2lkID1udWxsKSA6IFZvaWQgeworICAgICAgICBpZiAoT3V0cHV0U3RyZWFtID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBmbHVzaCBudWxsIE91dHB1dFN0cmVhbSIpOworICAgICAgICAgICAgaWYoY2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IGVycjsKKyAgICAgICAgfQorCisgICAgICAgIE91dHB1dFN0cmVhbS5GbHVzaCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YjMxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBoYXhlLmlvLkVvZjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuQWJzdHJhY3RNZXRob2RFcnJvcjsKKworY2xhc3MgVFRyYW5zcG9ydCB7CisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoZXJlIG1vcmUgZGF0YSB0byBiZSByZWFkPworICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZW1vdGUgc2lkZSBpcyBzdGlsbCBhbGl2ZSBhbmQgZmVlZGluZyB1cworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwZWVrKCkgOiBCb29sIHsKKyAgICAgICAgICByZXR1cm4gaXNPcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSB0cmFuc3BvcnQgY291bGQgbm90IGJlIG9wZW5lZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIDogVm9pZCB7CisgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIEFycmF5IHRvIHJlYWQgaW50bworICAgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgICAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgICAqIEByZXR1cm4gVGhlIGJ5dGVzIGNvdW50IGFjdHVhbGx5IHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICAgICAqLworICAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCggYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBsZW4gYnl0ZXMgYXJlIGFjdHVhbGx5IHJlYWQgb2ZmIHRoZSB0cmFuc3BvcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIEFycmF5IHRvIHJlYWQgaW50bworICAgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgICAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvIGxlbgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgIHZhciBnb3QgOiBJbnQgPSAwOworICAgICAgICB2YXIgcmV0IDogSW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGdvdCA8IGxlbikgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXQgPSByZWFkKGJ1Ziwgb2ZmK2dvdCwgbGVuLWdvdCk7CisgICAgICAgICAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIFRyaWVkIHRvIHJlYWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIGxlbiArICIgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAiICsgZ290ICsgIiBieXRlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgICAgfQorICAgICAgICAgIGdvdCArPSByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdvdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBvdXRwdXQgZGF0YSBidWZmZXIKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUFsbChidWY6Qnl0ZXMpIDogVm9pZCB7CisgICAgICAgIHdyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHVwIHRvIGxlbiBieXRlcyBmcm9tIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBvdXRwdXQgZGF0YSBidWZmZXIKKyAgICAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBmcm9tCisgICAgICogQHBhcmFtIGxlbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIHRyYW5zcG9ydCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgb3V0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrOkR5bmFtaWMtPlZvaWQgPW51bGwpIDogVm9pZCB7CisgICAgICAgIGlmKGNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICBjYWxsYmFjayhuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDAyOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgICAvLyBXQVJOSU5HOiBUaGVzZSBhcmUgc3ViamVjdCB0byBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlLCBzbyB3ZSBjYW4ndCB1c2UgZW51bXMKKyAgICAvLyB3aXRoIEhheGUgMy4xLjMgYmVjYXVzZSBvZiBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzY0OQorICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTktOT1dOIDogSW50ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTk9UX09QRU4gOiBJbnQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBBTFJFQURZX09QRU4gOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBUSU1FRF9PVVQgOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBFTkRfT0ZfRklMRSA6IEludCA9IDQ7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGVycm9yIDogSW50ID0gVU5LTk9XTiwgbWVzc2FnZSA6IFN0cmluZyA9ICIiKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yKTsKKyAgICB9CisKK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjFmMzVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5oeApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisvKioKKyAqIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICogVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgKiBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAqIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAqCisgKi8KK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgKiBSZXR1cm4gYSB3cmFwcGVkIGluc3RhbmNlIG9mIHRoZSBiYXNlIFRyYW5zcG9ydC4KKyAgICAqCisgICAgKiBAcGFyYW0gdHJhbnMgVGhlIGJhc2UgdHJhbnNwb3J0CisgICAgKiBAcmV0dXJuIFdyYXBwZWQgVHJhbnNwb3J0CisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCB0cmFucyA6IFRUcmFuc3BvcnQpIDogVFRyYW5zcG9ydCB7CisgICAgICAgIHJldHVybiB0cmFuczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyNzJmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0Lmh4CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKworLyoKKyAgIHdyYXBzIHJlYWwgdHJhbnNwb3J0LCBwcm92aWRlZCBieSBjb25zdHJ1Y3RvcgorKi8KK2NsYXNzIFRXcmFwcGluZ1NlcnZlclRyYW5zcG9ydCBleHRlbmRzIFRTZXJ2ZXJUcmFuc3BvcnQgeworCisgIHByaXZhdGUgdmFyIHRyYW5zcG9ydChkZWZhdWx0LG51bGwpIDogVFRyYW5zcG9ydDsKKworICBwdWJsaWMgZnVuY3Rpb24gbmV3KHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQpIHsKKyAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBMaXN0ZW4oKSA6IFZvaWQKKyAgeworICB9CisKKyAgcHJpdmF0ZSBvdmVycmlkZSBmdW5jdGlvbiBBY2NlcHRJbXBsKCkgOiBUVHJhbnNwb3J0CisgIHsKKyAgICByZXR1cm4gdHJhbnNwb3J0OworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkCisgIHsKKworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L0hheGVUZXN0cy5oeHByb2ogYi9saWIvaGF4ZS90ZXN0L0hheGVUZXN0cy5oeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlZWQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvSGF4ZVRlc3RzLmh4cHJvagpAQCAtMCwwICsxLDY5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHByb2plY3QgdmVyc2lvbj0iMiI+CisgIDwhLS0gT3V0cHV0IFNXRiBvcHRpb25zIC0tPgorICA8b3V0cHV0PgorICAgIDxtb3ZpZSBvdXRwdXRUeXBlPSJBcHBsaWNhdGlvbiIgLz4KKyAgICA8bW92aWUgaW5wdXQ9IiIgLz4KKyAgICA8bW92aWUgcGF0aD0iYmluL0hheGVUZXN0cyIgLz4KKyAgICA8bW92aWUgZnBzPSIzMCIgLz4KKyAgICA8bW92aWUgd2lkdGg9IjgwMCIgLz4KKyAgICA8bW92aWUgaGVpZ2h0PSI2MDAiIC8+CisgICAgPG1vdmllIHZlcnNpb249IjEiIC8+CisgICAgPG1vdmllIG1pbm9yVmVyc2lvbj0iMCIgLz4KKyAgICA8bW92aWUgcGxhdGZvcm09IkMrKyIgLz4KKyAgICA8bW92aWUgYmFja2dyb3VuZD0iI0ZGRkZGRiIgLz4KKyAgPC9vdXRwdXQ+CisgIDwhLS0gT3RoZXIgY2xhc3NlcyB0byBiZSBjb21waWxlZCBpbnRvIHlvdXIgU1dGIC0tPgorICA8Y2xhc3NwYXRocz4KKyAgICA8Y2xhc3MgcGF0aD0ic3JjIiAvPgorICAgIDxjbGFzcyBwYXRoPSJnZW4taGF4ZSIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iLi4vc3JjIiAvPgorICA8L2NsYXNzcGF0aHM+CisgIDwhLS0gQnVpbGQgb3B0aW9ucyAtLT4KKyAgPGJ1aWxkPgorICAgIDxvcHRpb24gZGlyZWN0aXZlcz0iIiAvPgorICAgIDxvcHRpb24gZmxhc2hTdHJpY3Q9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbm9JbmxpbmVPbkRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG1haW5DbGFzcz0iTWFpbiIgLz4KKyAgICA8b3B0aW9uIGVuYWJsZWRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIGFkZGl0aW9uYWw9IiIgLz4KKyAgPC9idWlsZD4KKyAgPCEtLSBoYXhlbGliIGxpYnJhcmllcyAtLT4KKyAgPGhheGVsaWI+CisgICAgPCEtLSBleGFtcGxlOiA8bGlicmFyeSBuYW1lPSIuLi4iIC8+IC0tPgorICA8L2hheGVsaWI+CisgIDwhLS0gQ2xhc3MgZmlsZXMgdG8gY29tcGlsZSAob3RoZXIgcmVmZXJlbmNlZCBjbGFzc2VzIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZCkgLS0+CisgIDxjb21waWxlVGFyZ2V0cz4KKyAgICA8IS0tIGV4YW1wbGU6IDxjb21waWxlIHBhdGg9Ii4uLiIgLz4gLS0+CisgIDwvY29tcGlsZVRhcmdldHM+CisgIDwhLS0gUGF0aHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHRyZWUgLS0+CisgIDxoaWRkZW5QYXRocz4KKyAgICA8aGlkZGVuIHBhdGg9Im9iaiIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNwcC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3NoYXJwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJmbGFzaC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YS5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YXNjcmlwdC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuYmF0IiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuc2giIC8+CisgICAgPGhpZGRlbiBwYXRoPSJNYWtlZmlsZS5hbSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im5la28uaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InBocC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHJvamVjdC5oaWRlIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHl0aG9uLmh4bWwiIC8+CisgIDwvaGlkZGVuUGF0aHM+CisgIDwhLS0gRXhlY3V0ZWQgYmVmb3JlIGJ1aWxkIC0tPgorICA8cHJlQnVpbGRDb21tYW5kPnRocmlmdCAtciAtZ2VuIGhheGUgIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uLy4uLy4uL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0PC9wcmVCdWlsZENvbW1hbmQ+CisgIDwhLS0gRXhlY3V0ZWQgYWZ0ZXIgYnVpbGQgLS0+CisgIDxwb3N0QnVpbGRDb21tYW5kIGFsd2F5c1J1bj0iRmFsc2UiIC8+CisgIDwhLS0gT3RoZXIgcHJvamVjdCBvcHRpb25zIC0tPgorICA8b3B0aW9ucz4KKyAgICA8b3B0aW9uIHNob3dIaWRkZW5QYXRocz0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiB0ZXN0TW92aWU9IkN1c3RvbSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZUNvbW1hbmQ9ImJpbi9IYXhlVGVzdHMvTWFpbi5leGUgc2VydmVyIG11bHRpcGxleCIgLz4KKyAgPC9vcHRpb25zPgorICA8IS0tIFBsdWdpbiBzdG9yYWdlIC0tPgorICA8c3RvcmFnZSAvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvaGF4ZS90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOGIyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlRDTUQgPSAkKFRIUklGVCkgLS1nZW4gaGF4ZSAtcgorVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorQUdHUiA9ICQodG9wX3NyY2RpcikvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CitCRU5DSE1BUksgPSAkKHRvcF9zcmNkaXIpL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorCitCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCisKK2dlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHg6ICQoVEhSSUZUVEVTVCkKKwkkKFRIUklGVENNRCkgJChUSFJJRlRURVNUKQorCitnZW4taGF4ZS90aHJpZnQvdGVzdC9BZ2dyLmh4OiAkKEFHR1IpCisJJChUSFJJRlRDTUQpICQoQUdHUikKKworZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeDogJChCRU5DSE1BUkspCisJJChUSFJJRlRDTUQpICQoQkVOQ0hNQVJLKQorCithbGwtbG9jYWw6ICQoQklOX0NQUCkgJChCSU5fUEhQKQorCiskKEJJTl9DUFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQWdnci5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L0JlbmNobWFya1NlcnZpY2UuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIGNwcC5oeG1sCisKKyQoQklOX1BIUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9BZ2dyLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworCisjVE9ETzogb3RoZXIgaGF4ZSB0YXJnZXRzCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGNzaGFycAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBmbGFzaAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGphdmFzY3JpcHQKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgbmVrbworIyAgICAkKEhBWEUpICAtLWN3ZCAuICBweXRob24gICMgbmVlZHMgSGF4ZSAzLjIuMAorCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1oYXhlIGJpbgorCitjaGVjazogJChCSU5fQ1BQKSAkKEJJTl9QSFApCisJJChCSU5fQ1BQKQorCXBocCAtZiAkKEJJTl9QSFApCisKK0VYVFJBX0RJU1QgPSBcCisgICAgICAgICAgICAgc3JjIFwKKyAgICAgICAgICAgICBjcHAuaHhtbCBcCisgICAgICAgICAgICAgY3NoYXJwLmh4bWwgXAorICAgICAgICAgICAgIGZsYXNoLmh4bWwgXAorICAgICAgICAgICAgIGphdmEuaHhtbCBcCisgICAgICAgICAgICAgamF2YXNjcmlwdC5oeG1sIFwKKyAgICAgICAgICAgICBuZWtvLmh4bWwgXAorICAgICAgICAgICAgIHBocC5oeG1sIFwKKyAgICAgICAgICAgICBweXRob24uaHhtbCBcCisgICAgICAgICAgICAgcHJvamVjdC5oaWRlIFwKKyAgICAgICAgICAgICBIYXhlVGVzdHMuaHhwcm9qIFwKKyAgICAgICAgICAgICBtYWtlX2FsbC5iYXQgXAorICAgICAgICAgICAgIG1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2NwcC5oeG1sIGIvbGliL2hheGUvdGVzdC9jcHAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzg0OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9jcHAuaHhtbApAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1BQIHRhcmdldAorLWNwcCBiaW4KKworI1RvIHByb2R1Y2UgNjQgYml0IGJpbmFyaWVzIHRoZSBmaWxlIHNob3VsZCBkZWZpbmUgdGhlIEhYQ1BQX002NCBjb21waWxlIHZhcmlhYmxlOgorIy1EIEhYQ1BQX002NAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9jc2hhcnAuaHhtbCBiL2xpYi9oYXhlL3Rlc3QvY3NoYXJwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzNGIwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvY3NoYXJwLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0NTSEFSUCB0YXJnZXQKKy1jcyBiaW4vVGVzdC5leGUKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvZmxhc2guaHhtbCBiL2xpYi9oYXhlL3Rlc3QvZmxhc2guaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjE3NjMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9mbGFzaC5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNGbGFzaCB0YXJnZXQKKy1zd2YgYmluL1Rlc3Quc3dmCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2phdmEuaHhtbCBiL2xpYi9oYXhlL3Rlc3QvamF2YS5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDcxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2phdmEuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YSB0YXJnZXQKKy1qYXZhIGJpbi9UZXN0LmphcgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9qYXZhc2NyaXB0Lmh4bWwgYi9saWIvaGF4ZS90ZXN0L2phdmFzY3JpcHQuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQ5OTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9qYXZhc2NyaXB0Lmh4bWwKQEAgLTAsMCArMSw0NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0phdmFTY3JpcHQgdGFyZ2V0CistanMgYmluL1Rlc3QuanMKKworI1lvdSBjYW4gdXNlIC1EIHNvdXJjZS1tYXAtY29udGVudCAocmVxdWlyZXMgSGF4ZSAzLjErKSB0byBoYXZlIHRoZSAuaHggCisjZmlsZXMgZGlyZWN0bHkgZW1iZWRkZWQgaW50byB0aGUgbWFwIGZpbGUsIHRoaXMgd2F5IHlvdSBvbmx5IGhhdmUgdG8gCisjdXBsb2FkIGl0LCBhbmQgaXQgd2lsbCBiZSBhbHdheXMgaW4gc3luYyB3aXRoIHRoZSBjb21waWxlZCAuanMgZXZlbiBpZiAKKyN5b3UgbW9kaWZ5IHlvdXIgLmh4IGZpbGVzLgorLUQgc291cmNlLW1hcC1jb250ZW50CisKKyNHZW5lcmF0ZSBzb3VyY2UgbWFwIGFuZCBhZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L21ha2VfYWxsLmJhdCBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTRlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L21ha2VfYWxsLmJhdApAQCAtMCwwICsxLDcwIEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KKworc2V0bG9jYWwKK2lmICIlSE9NRURSSVZFJSI9PSIiIGdvdG8gTUlTU0lOR1ZBUlMKK2lmICIlSE9NRVBBVEglIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIQVhFUEFUSCUiPT0iIiBnb3RvIE5PVElOU1RBTExFRAorCitzZXQgcGF0aD0lSEFYRVBBVEglOyVIQVhFUEFUSCVcLi5cbmVrbzslcGF0aCUKKworcmVtICMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uXC4uXC4uXHRlc3RcVGhyaWZ0VGVzdC50aHJpZnQKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uXC4uXC4uXGNvbnRyaWJcYXN5bmMtdGVzdFxhZ2dyLnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi5cLi5cLi5cbGliXHJiXGJlbmNobWFya1xCZW5jaG1hcmsudGhyaWZ0CitpZiBlcnJvcmxldmVsIDEgZ290byBTVE9QCisKK3JlbSAjIGludm9rZSBIYXhlIGNvbXBpbGVyIGZvciBhbGwgdGFyZ2V0cworZm9yICUlYSBpbiAoKi5oeG1sKSBkbyAoCisJcmVtICogZmlsdGVyIFB5dGhvbiwgYXMgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBIYXhlIDMuMS4zIChidXQgd2lsbCBiZSBpbiAzLjEuNCkKKwlpZiBub3QgIiUlYSI9PSJweXRob24uaHhtbCIgKAorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWVjaG8gQnVpbGRpbmcgJSVhIC4uLgorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWhheGUgIC0tY3dkIC4gICUlYQorCSkKKykKKworCitlY2hvLgorZWNobyBkb25lLgorcGF1c2UKK2dvdG8gZW9mCisKKzpOT1RJTlNUQUxMRUQKK2VjaG8gRkFUQUw6IEVpdGhlciBIYXhlIGlzIG5vdCBpbnN0YWxsZWQsIG9yIHRoZSBIQVhFUEFUSCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorcGF1c2UKK2dvdG8gZW9mCisKKzpNSVNTSU5HVkFSUworZWNobyBGQVRBTDogVW5hYmxlIHRvIGxvY2F0ZSBob21lIGZvbGRlci4KK2VjaG8uCitlY2hvIEJvdGggSE9NRURSSVZFIGFuZCBIT01FUEFUSCBuZWVkIHRvIGJlIHNldCB0byBwb2ludCB0byB5b3VyIEhvbWUgZm9sZGVyLgorZWNobyBUaGUgY3VycmVudCB2YWx1ZXMgYXJlOgorZWNobyBIT01FRFJJVkU9JUhPTUVEUklWRSUKK2VjaG8gSE9NRVBBVEg9JUhPTUVQQVRIJQorcGF1c2UKK2dvdG8gZW9mCisKKzpTVE9QCitwYXVzZQorZ290byBlb2YKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5zaCBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyZjVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL3NoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQKKworIyBvdXRwdXQgZm9sZGVyCitpZiBbICEgLWQgYmluIF07IHRoZW4KKyAgbWtkaXIgIGJpbgorZmkKKworIyBpbnZva2UgSGF4ZSBjb21waWxlcgorZm9yIHRhcmdldCBpbiAqLmh4bWw7IGRvIAorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGVjaG8gQnVpbGRpbmcgJHt0YXJnZXR9IC4uLgorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlmIFsgISAtZCBiaW4vJHt0YXJnZXR9IF07IHRoZW4KKyAgICBta2RpciAgYmluLyR7dGFyZ2V0fQorICBmaQorICBoYXhlICAtLWN3ZCAuICAke3RhcmdldH0gCitkb25lCisKKworI2VvZgpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9uZWtvLmh4bWwgYi9saWIvaGF4ZS90ZXN0L25la28uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI3MGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9uZWtvLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI25la28gdGFyZ2V0CistbmVrbyBiaW4vVGVzdC5uCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3BocC5oeG1sIGIvbGliL2hheGUvdGVzdC9waHAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGYyYjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9waHAuaHhtbApAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUEhQIHRhcmdldAorLXBocCBiaW4vcGhwLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9wcm9qZWN0LmhpZGUgYi9saWIvaGF4ZS90ZXN0L3Byb2plY3QuaGlkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmVmOThlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9wcm9qZWN0LmhpZGUKQEAgLTAsMCArMSw2NyBAQAoreworICAgICAidHlwZSIgOiAwCisgICAgLCJ0YXJnZXQiIDogNAorICAgICwibmFtZSIgOiAiVGVzdCIKKyAgICAsIm1haW4iIDogbnVsbAorICAgICwicHJvamVjdFBhY2thZ2UiIDogIiIKKyAgICAsImNvbXBhbnkiIDogIiIKKyAgICAsImxpY2Vuc2UiIDogIiIKKyAgICAsInVybCIgOiAiIgorICAgICwidGFyZ2V0RGF0YSIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImZsYXNoLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW4vVGVzdC5zd2YiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YXNjcmlwdC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxpbmRleC5odG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogIm5la28uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogIm5la28gYmluL1Rlc3QubiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJwaHAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjcHAuaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9NYWluLWRlYnVnLmV4ZSIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3NoYXJwLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicHl0aG9uLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJweXRob24gYmluL1Rlc3QucHkiCisgICAgICAgIH0KKyAgICBdCisgICAgLCJmaWxlcyIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGgiIDogInNyY1xcTWFpbi5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDEzCisgICAgICAgIH0KKyAgICBdCisgICAgLCJhY3RpdmVGaWxlIiA6ICJzcmNcXE1haW4uaHgiCisgICAgLCJvcGVuRkxUYXJnZXQiIDogbnVsbAorICAgICwib3BlbkZMQnVpbGRNb2RlIiA6ICJEZWJ1ZyIKKyAgICAsInJ1bkFjdGlvblR5cGUiIDogbnVsbAorICAgICwicnVuQWN0aW9uVGV4dCIgOiBudWxsCisgICAgLCJidWlsZEFjdGlvbkNvbW1hbmQiIDogbnVsbAorICAgICwiaGlkZGVuSXRlbXMiIDogWworCisgICAgXQorICAgICwic2hvd0hpZGRlbkl0ZW1zIiA6IGZhbHNlCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9weXRob24uaHhtbCBiL2xpYi9oYXhlL3Rlc3QvcHl0aG9uLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2YTEzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvcHl0aG9uLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1B5dGhvbiB0YXJnZXQKKy1weXRob24gYmluL1Rlc3QucHkKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3Qvc3JjL01haW4uaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9NYWluLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjYyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9NYWluLmh4CkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2VudW0gV2hhdFRlc3RzIHsKKyAgICBOb3JtYWw7CisgICAgTXVsdGlwbGV4OworfQorCitjbGFzcyBNYWluCit7CisgICAgc3RhdGljIHByaXZhdGUgdmFyIHRlc3RzIDogV2hhdFRlc3RzID0gTm9ybWFsOworICAgIHN0YXRpYyBwcml2YXRlIHZhciBzZXJ2ZXIgOiBCb29sID0gZmFsc2U7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBpbmxpbmUgdmFyIENNRExJTkVIRUxQIDogU3RyaW5nCisgICAgICAgID0gIlxuSGF4ZVRlc3RzICBbY2xpZW50fHNlcnZlcl0gIFttdWx0aXBsZXhdXG4iCisgICAgICAgICsgIiAgY2xpZW50fHNlcnZlciAgLi4uIGRldGVybWluZXMgcnVuIG1vZGUgZm9yIHNvbWUgdGVzdHMsIGRlZmF1bHQgaXMgY2xpZW50XG4iCisgICAgICAgICsgIiAgbXVsdGlwbGV4IC4uLi4uLi4uIHJ1biBtdWx0aXBsZXggdGVzdCBzZXJ2ZXIgb3IgY2xpZW50XG4iOworCisgICAgc3RhdGljIHByaXZhdGUgZnVuY3Rpb24gUGFyc2VBcmdzKCkgeworICAgICAgICAjaWYgc3lzCisKKyAgICAgICAgdmFyIGFyZ3MgPSBTeXMuYXJncygpOworICAgICAgICBpZiAoIGFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICggYXJnIGluIGFyZ3MpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goYXJnLnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2xpZW50IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjYXNlICJzZXJ2ZXIiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIm11bHRpcGxleCIgOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMgPSBNdWx0aXBsZXg7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgJ0ludmFsaWQgYXJndW1lbnQgIiRhcmciXG4nK0NNRExJTkVIRUxQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmQKKyAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIGZ1bmN0aW9uIG1haW4oKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnNlQXJncygpOworCisgICAgICAgICAgICBzd2l0Y2goIHRlc3RzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb3JtYWw6CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbVRlc3QuUnVuKHNlcnZlcik7CisgICAgICAgICAgICAgICAgY2FzZSBNdWx0aXBsZXg6CisgICAgICAgICAgICAgICAgICAgIE11bHRpcGxleFRlc3QuUnVuKHNlcnZlcik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0ZXN0IG1vZGUgJHRlc3RzIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhY2UoIkFsbCB0ZXN0cyBjb21wbGV0ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGU6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCckZScpOworICAgICAgICAgICAgI2lmIHN5cworICAgICAgICAgICAgU3lzLmV4aXQoMSk7ICAvLyBpbmRpY2F0ZSBlcnJvcgorICAgICAgICAgICAgI2VuZAorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3Qvc3JjL011bHRpcGxleFRlc3QuaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9NdWx0aXBsZXhUZXN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MThiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9NdWx0aXBsZXhUZXN0Lmh4CkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBoYXhlLkludDY0OworaW1wb3J0IGhheGUuSW50MzI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKKy8vIGRlYnVnIG9ubHkKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvY2Vzc29yOworCisvLyBnZW5lcmF0ZWQgY29kZSBpbXBvcnRzCitpbXBvcnQgQWdncjsKK2ltcG9ydCBBZ2dySW1wbDsKK2ltcG9ydCBBZ2dyUHJvY2Vzc29yOworaW1wb3J0IEJlbmNobWFya1NlcnZpY2U7CitpbXBvcnQgQmVuY2htYXJrU2VydmljZUltcGw7CitpbXBvcnQgQmVuY2htYXJrU2VydmljZVByb2Nlc3NvcjsKK2ltcG9ydCBFcnJvcjsKKworCitjbGFzcyBCZW5jaG1hcmtTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIEJlbmNobWFya1NlcnZpY2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBmaWJvbmFjY2kobiA6IGhheGUuSW50MzIpIDogaGF4ZS5JbnQzMiB7CisgICAgICAgIHRyYWNlKCdCZW5jaG1hcmsuZmlib25hY2NpKCRuKScpOworICAgICAgICB2YXIgbmV4dCA6IEludDsKKyAgICAgICAgdmFyIHByZXYgICA9IDA7CisgICAgICAgIHZhciByZXN1bHQgPSAxOworICAgICAgICB3aGlsZSggbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgICA9IHJlc3VsdCArIHByZXY7CisgICAgICAgICAgICBwcmV2ICAgPSByZXN1bHQ7CisgICAgICAgICAgICByZXN1bHQgPSBuZXh0OworICAgICAgICAgICAgLS1uOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQorCisKK2NsYXNzIEFnZ3JTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIEFnZ3IKK3sKKyAgICBwcml2YXRlIHZhciB2YWx1ZXMgOiBMaXN0PGhheGUuSW50MzI+ID0gbmV3IExpc3Q8aGF4ZS5JbnQzMj4oKTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZFZhbHVlKHZhbHVlIDogaGF4ZS5JbnQzMikgOiBWb2lkICAgIHsKKyAgICAgICAgdHJhY2UoJ0FnZ3IuYWRkVmFsdWUoJHZhbHVlKScpOworICAgICAgICB2YWx1ZXMuYWRkKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlcygpIDogTGlzdDwgaGF4ZS5JbnQzMj4geworICAgICAgICB0cmFjZSgnQWdnci5nZXRWYWx1ZXMoKScpOworICAgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0KK30KKworCisKK2NsYXNzIE11bHRpcGxleFRlc3QgZXh0ZW5kcyBUZXN0QmFzZSB7CisKKyAgICBwcml2YXRlIGlubGluZSBzdGF0aWMgdmFyIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSA6IFN0cmluZyA9ICJCZW5jaG1hcmtTZXJ2aWNlIjsKKyAgICBwcml2YXRlIGlubGluZSBzdGF0aWMgdmFyIE5BTUVfQUdHUiAgICAgICAgICAgICA6IFN0cmluZyAgPSAiQWdnciI7CisKKworICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZnVuY3Rpb24gUnVuKHNlcnZlciA6IEJvb2wpIDogVm9pZCB7CisgICAgICAgIGlmICggc2VydmVyKSB7CisgICAgICAgICAgICBSdW5NdWx0aXBsZXhTZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJ1bk11bHRpcGxleENsaWVudCgpOworICAgICAgICAgICAgUnVuRGVmYXVsdENsaWVudCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBydW4gdGhlIG11bHRpcGxleCBzZXJ2ZXIKKyAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGZ1bmN0aW9uIFJ1bk11bHRpcGxleFNlcnZlcigpIDogVm9pZCAgeworICAgICAgIHRyeQorICAgICAgIHsKKyAgICAgICAgICAgIHZhciBiZW5jaEhhbmRsZXIgOiBCZW5jaG1hcmtTZXJ2aWNlID0gbmV3IEJlbmNobWFya1NlcnZpY2VIYW5kbGVyKCk7CisgICAgICAgICAgICB2YXIgYmVuY2hQcm9jZXNzb3IgOiBUUHJvY2Vzc29yID0gbmV3IEJlbmNobWFya1NlcnZpY2VQcm9jZXNzb3IoIGJlbmNoSGFuZGxlcik7CisKKyAgICAgICAgICAgIHZhciBhZ2dySGFuZGxlciA6IEFnZ3IgPSBuZXcgQWdnclNlcnZpY2VIYW5kbGVyKCk7CisgICAgICAgICAgICB2YXIgYWdnclByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBuZXcgQWdnclByb2Nlc3NvciggYWdnckhhbmRsZXIpOworCisgICAgICAgICAgICB2YXIgbXVsdGlwbGV4IDogVE11bHRpcGxleGVkUHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yLCB0cnVlKTsgIC8vIGRlZmF1bHQKKyAgICAgICAgICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvciggTkFNRV9BR0dSLCBhZ2dyUHJvY2Vzc29yKTsKKworICAgICAgICAgICAgLy8gcHJvdG9jb2wrdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgcHJvdGZhY3QgOiBUUHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkodHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJ0cmFucyA6IFRTZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCggOTA5MCwgNSwgZmFsc2UpOworICAgICAgICAgICAgdmFyIHRyYW5zZmFjdCA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgICAgICAgIHZhciBzZXJ2ZXIgOiBUU2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIG11bHRpcGxleCwgc2VydmVydHJhbnMsIHRyYW5zZmFjdCwgcHJvdGZhY3QpOworCisgICAgICAgICAgICB0cmFjZSgiU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4iKTsKKyAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOworICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJHtlLmVycm9ySUR9ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcnVuIG11bHRpcGxleCBjbGllbnQgYWdhaW5zdCBtdWx0aXBsZXggc2VydmVyCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW5NdWx0aXBsZXhDbGllbnQoKSA6IFZvaWQgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFucyA6IFRUcmFuc3BvcnQ7CisgICAgICAgICAgICB0cmFucyA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgdHJhbnMub3BlbigpOworCisgICAgICAgICAgICB2YXIgcHJvdG9jb2wgOiBUUHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLHRydWUsdHJ1ZSk7CisgICAgICAgICAgICB2YXIgbXVsdGlwbGV4IDogVE11bHRpcGxleGVkUHJvdG9jb2w7CisKKyAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCggcHJvdG9jb2wsIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CisgICAgICAgICAgICB2YXIgYmVuY2ggPSBuZXcgQmVuY2htYXJrU2VydmljZUltcGwoIG11bHRpcGxleCk7CisKKyAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCggcHJvdG9jb2wsIE5BTUVfQUdHUik7CisgICAgICAgICAgICB2YXIgYWdnciA9IG5ldyBBZ2dySW1wbCggbXVsdGlwbGV4KTsKKworICAgICAgICAgICAgdHJhY2UoJ2NhbGxpbmcgYWdnci5hZGQoIGJlbmNoLmZpYm8oKSkuLi4nKTsKKyAgICAgICAgICAgIGZvciggaSBpbiAxIC4uLiAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnJGknKTsKKyAgICAgICAgICAgICAgICBhZ2dyLmFkZFZhbHVlKCBiZW5jaC5maWJvbmFjY2koaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjZSgnY2FsbGluZyBhZ2dyIC4uLicpOworICAgICAgICAgICAgdmFyIGkgPSAxOworICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGFnZ3IuZ2V0VmFsdWVzKCk7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QodmFsdWVzICE9IG51bGwsJ2FnZ3IuZ2V0VmFsdWVzKCkgPT0gbnVsbCcpOworICAgICAgICAgICAgZm9yKCBrIGluIHZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnZmliKCRpKSA9ICRrJyk7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFucy5jbG9zZSgpOworICAgICAgICAgICAgdHJhY2UoJ2RvbmUuJyk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCcke2UuZXJyb3JJRH0gJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCckZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBydW4gbm9uLW11bHRpcGxleCBjbGllbnQgYWdhaW5zdCBtdWx0aXBsZXggc2VydmVyIHRvIHRlc3QgZGVmYXVsdCBmYWxsYmFjaworICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZnVuY3Rpb24gUnVuRGVmYXVsdENsaWVudCgpIDogVm9pZCAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICB0cmFucy5vcGVuKCk7CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsdHJ1ZSx0cnVlKTsKKworICAgICAgICAgICAgdmFyIGJlbmNoID0gbmV3IEJlbmNobWFya1NlcnZpY2VJbXBsKCBwcm90b2NvbCk7CisKKyAgICAgICAgICAgIHRyYWNlKCdjYWxsaW5nIGJlbmNoICh2aWEgZGVmYXVsdCkgLi4uJyk7CisgICAgICAgICAgICBmb3IoIGkgaW4gMSAuLi4gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGsgPSBiZW5jaC5maWJvbmFjY2koaSk7CisgICAgICAgICAgICAgICAgdHJhY2UoJ2ZpYigkaSkgPSAkaycpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFucy5jbG9zZSgpOworICAgICAgICAgICAgdHJhY2UoJ2RvbmUuJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJHtlLmVycm9ySUR9ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdChmYWxzZSwnJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3Qvc3JjL1N0cmVhbVRlc3QuaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9TdHJlYW1UZXN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NGYxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9TdHJlYW1UZXN0Lmh4CkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgc3lzLkZpbGVTeXN0ZW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKKworCitjbGFzcyBTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdEJhc2UgeworCisKKyAgICBwcml2YXRlIGlubGluZSBzdGF0aWMgdmFyIHRtcGZpbGUgOiBTdHJpbmcgPSAiZGF0YS50bXAiOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBNYWtlVGVzdERhdGEoKSA6IFh0cnVjdCB7CisgICAgICAgIHZhciBkYXRhIDogWHRydWN0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICBkYXRhLnN0cmluZ190aGluZyA9ICJTdHJlYW10ZXN0IjsKKyAgICAgICAgZGF0YS5ieXRlX3RoaW5nID0gLTEyODsKKyAgICAgICAgZGF0YS5pMzJfdGhpbmcgPSA0NzExOworICAgICAgICBkYXRhLmk2NF90aGluZyA9IEludDY0Lm1ha2UoMHgxMjM0NTY3OCwweDlBQkNERUYwKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBXcml0ZURhdGEoKSA6IFh0cnVjdAorICAgIHsKKyAgICAgICAgdmFyIHN0cmVhbSA6IFRTdHJlYW0gPSBuZXcgVEZpbGVTdHJlYW0oIHRtcGZpbGUsIENyZWF0ZU5ldyk7CisgICAgICAgIHZhciB0cmFucyA6IFRUcmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydCggbnVsbCwgc3RyZWFtKTsKKyAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCggdHJhbnMpOworCisgICAgICAgIHZhciBkYXRhID0gTWFrZVRlc3REYXRhKCk7CisgICAgICAgIGRhdGEud3JpdGUocHJvdCk7CisgICAgICAgIHRyYW5zLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSZWFkRGF0YSgpIDogWHRydWN0CisgICAgeworICAgICAgICB2YXIgc3RyZWFtIDogVFN0cmVhbSA9IG5ldyBURmlsZVN0cmVhbSggdG1wZmlsZSwgUmVhZCk7CisgICAgICAgIHZhciB0cmFucyA6IFRUcmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydCggc3RyZWFtLCBudWxsKTsKKyAgICAgICAgdmFyIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCggdHJhbnMpOworCisgICAgICAgIHZhciBkYXRhIDogWHRydWN0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICBkYXRhLnJlYWQocHJvdCk7CisgICAgICAgIHRyYW5zLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW4oc2VydmVyIDogQm9vbCkgOiBWb2lkCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHdyaXR0ZW4gPSBXcml0ZURhdGEoKTsKKyAgICAgICAgICAgIHZhciByZWFkID0gUmVhZERhdGEoKTsKKyAgICAgICAgICAgIEZpbGVTeXN0ZW0uZGVsZXRlRmlsZSh0bXBmaWxlKTsKKworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KCByZWFkLnN0cmluZ190aGluZyA9PSB3cml0dGVuLnN0cmluZ190aGluZywgInN0cmluZyBkYXRhIik7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoIHJlYWQuYnl0ZV90aGluZyA9PSB3cml0dGVuLmJ5dGVfdGhpbmcsICJieXRlIGRhdGEiKTsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdCggcmVhZC5pMzJfdGhpbmcgPT0gd3JpdHRlbi5pMzJfdGhpbmcsICJpMzIgZGF0YSIpOworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCByZWFkLmk2NF90aGluZywgd3JpdHRlbi5pNjRfdGhpbmcpID09IDAsICJpNjQgZGF0YSIpOworCisgICAgICAgIH0gY2F0Y2goZTpEeW5hbWljKSB7CisgICAgICAgICAgICBGaWxlU3lzdGVtLmRlbGV0ZUZpbGUodG1wZmlsZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvVGVzdEJhc2UuaHggYi9saWIvaGF4ZS90ZXN0L3NyYy9UZXN0QmFzZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjMyNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9zcmMvVGVzdEJhc2UuaHgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCisKK2NsYXNzIFRlc3RCYXNlIHsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gbmV3KCkgeworICAgICAgICAvLyBvdmVycmlkZSwgaWYgbmVjZXNzYXJ5CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSdW4oc2VydmVyIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRXhwZWN0KCBleHByIDogQm9vbCwgaW5mbyA6IFN0cmluZywgP3BvcyA6IGhheGUuUG9zSW5mb3MpIDogVm9pZCB7CisgICAgICAgIGlmKCAhIGV4cHIpIHsKKyAgICAgICAgICAgIHRocm93ICgnVGVzdCAiJGluZm8iIGZhaWxlZCBhdCAnK3Bvcy5tZXRob2ROYW1lKycgaW4gJytwb3MuZmlsZU5hbWUrJzonK3Bvcy5saW5lTnVtYmVyKTsKKyAgICAgICAgfQorICAgIH0KKworfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9ocy9DTWFrZUxpc3RzLnR4dCBiL2xpYi9ocy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBhMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFJlYnVpbGQgd2hlbiBhbnkgb2YgdGhlc2UgZmlsZXMgY2hhbmdlcworc2V0KGhhc2tlbGxfc291cmNlcworICAgIHNyYy9UaHJpZnQuaHMKKyAgICBzcmMvVGhyaWZ0L0FyYml0cmFyaWVzLmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC5ocworICAgIHNyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCisgICAgc3JjL1RocmlmdC9TZXJ2ZXIuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0VtcHR5LmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvRnJhbWVkLmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0lPQnVmZmVyLmhzCisgICAgc3JjL1RocmlmdC9UeXBlcy5ocworICAgIHRocmlmdC5jYWJhbAorKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGxpc3QoQVBQRU5EIGhhc2tlbGxfc29ydWNlcworICAgICAgICB0ZXN0L1NwZWMuaHMKKyAgICAgICAgdGVzdC9CaW5hcnlTcGVjLmhzCisgICAgICAgIHRlc3QvQ29tcGFjdFNwZWMuaHMKKyAgICAgICAgdGVzdC9KU09OU3BlYy5ocworICAgICkKKyAgICBzZXQoaHNfZW5hYmxlX3Rlc3QgIi0tZW5hYmxlLXRlc3RzIikKK2VuZGlmKCkKKworc2V0KGhhc2tlbGxfYXJ0aWZhY3RzIHRocmlmdF9jYWJhbC5zdGFtcCkKKyMgQWRkaW5nICouaGkgZmlsZXMgc28gdGhhdCBhbnkgbWlzc2luZyBmaWxlIHRyaWdnZXJzIHRoZSBidWlsZAorZm9yZWFjaChTUkMgJHtoYXNrZWxsX3NvdXJjZXN9KQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoRVggJHtTUkN9IEVYVCkKKyAgICBpZigke0VYfSBTVFJFUVVBTCAiLmhzIikKKyAgICAgICAgZmlsZShSRUxBVElWRV9QQVRIIFJFTCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke1NSQ30pCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoRElSICR7UkVMfSBESVJFQ1RPUlkpCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoQkFTRSAke1JFTH0gTkFNRV9XRSkKKyAgICAgICAgbGlzdChBUFBFTkQgaGFza2VsbF9hcnRpZmFjdHMgZGlzdC9idWlsZC8ke0RJUn0vJHtCQVNFfS5oaSkKKyAgICBlbmRpZigpCitlbmRmb3JlYWNoKCkKKworaWYoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiRGVidWciKQorICAgIHNldChoc19vcHRpbWl6ZSAtTzApCitlbHNlaWYoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiUmVsZWFzZSIpCisgICAgc2V0KGhzX29wdGltaXplIC1PMSkKK2VuZGlmKCkKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAke2hhc2tlbGxfYXJ0aWZhY3RzfQorICAgIENPTU1BTkQgJHtDQUJBTH0gdXBkYXRlCisgICAgIyBCdWlsZCBkZXBlbmRlbmNpZXMgZmlyc3Qgd2l0aG91dCAtLWJ1aWxkZGlyLCBvdGhlcndpc2UgaXQgZmFpbHMuCisgICAgQ09NTUFORCAke0NBQkFMfSBpbnN0YWxsIC0tb25seS1kZXBlbmRlbmNpZXMgJHtoc19lbmFibGVfdGVzdH0KKyAgICBDT01NQU5EICR7Q0FCQUx9IGNvbmZpZ3VyZSAke2hzX29wdGltaXplfSAke2hzX2VuYWJsZV90ZXN0fSAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgQ09NTUFORCAke0NBQkFMfSBidWlsZCAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgQ09NTUFORCAke0NBQkFMfSBpbnN0YWxsIC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdF9jYWJhbC5zdGFtcAorICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgIERFUEVORFMgJHtoYXNrZWxsX3NvdXJjZXN9CisgICAgQ09NTUVOVCAiQnVpbGRpbmcgSGFza2VsbCBsaWJyYXJ5IikKKworYWRkX2N1c3RvbV90YXJnZXQoaGFza2VsbF9saWJyYXJ5IEFMTAorICAgIERFUEVORFMgJHtoYXNrZWxsX2FydGlmYWN0c30pCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsQ2FiYWxDaGVjaworICAgICAgICAgICAgQ09NTUFORCAke0NBQkFMfSBjaGVjaworICAgICAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICAgIGFkZF90ZXN0KE5BTUUgSGFza2VsbENhYmFsVGVzdAorICAgICAgICAgICAgIyBDYWJhbCBmYWlscyB0byBmaW5kIGJ1aWx0IGV4ZWN1dGFibGUgd2hlbiAtLWJ1aWxkZGlyIGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgICMgU28gd2UgaW52b2tlIHRoZSBleGVjdXRhYmxlIGRpcmVjdGx5LgorICAgICAgICAgICAgIyBDT01NQU5EICR7Q0FCQUx9IHRlc3QgLS1idWlsZGRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGlzdAorICAgICAgICAgICAgIyBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgICAgICAgICBDT01NQU5EIGRpc3QvYnVpbGQvc3BlYy9zcGVjKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2hzL0xJQ0VOU0UgYi9saWIvaHMvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ1Njk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL0xJQ0VOU0UKQEAgLTAsMCArMSwyMDIgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9saWIvaHMvTWFrZWZpbGUuYW0gYi9saWIvaHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkOGI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworRVhUUkFfRElTVCA9IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJTElDRU5TRSBcCisJUkVBRE1FLm1kIFwKKwlTZXR1cC5saHMgXAorCVRPRE8gXAorCXRocmlmdC5jYWJhbCBcCisJc3JjIFwKKwl0ZXN0CisKK2FsbC1sb2NhbDoKKwkkKENBQkFMKSB1cGRhdGUKKwkkKENBQkFMKSBpbnN0YWxsCisKK2luc3RhbGwtZXhlYy1ob29rOgorCSQoQ0FCQUwpIGluc3RhbGwKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgSGFza2VsbCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCSQoQ0FCQUwpIGNsZWFuCisKK21haW50YWluZXItY2xlYW4tbG9jYWw6CisJJChDQUJBTCkgY2xlYW4KKworY2hlY2stbG9jYWw6CisJJChDQUJBTCkgY2hlY2sKKwkkKENBQkFMKSBpbnN0YWxsIC0tb25seS1kZXBlbmRlbmNpZXMgLS1lbmFibGUtdGVzdHMKKwkkKENBQkFMKSBjb25maWd1cmUgLS1lbmFibGUtdGVzdHMKKwkkKENBQkFMKSBidWlsZAorCSQoQ0FCQUwpIHRlc3QKZGlmZiAtLWdpdCBhL2xpYi9ocy9SRUFETUUgYi9saWIvaHMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNThjOGM5Li4wMDAwMDAwCi0tLSBhL2xpYi9ocy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1IYXNrZWxsIFRocmlmdCBCaW5kaW5ncwotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1SdW5uaW5nCi09PT09PT09Ci0KLVlvdSBuZWVkIC1mZ2xhc2dvdy1leHRzLiBVc2UgQ2FiYWwgdG8gY29tcGlsZSBhbmQgaW5zdGFsbC4gSWYgeW91J3JlIHRyeWluZyB0bwotbWFudWFsbHkgY29tcGlsZSBvciBsb2FkIHZpYSBnaGNpLCBhbmQgeW91J3JlIHVzaW5nIGdoYyA2LjEwIChvciByZWFsbHkgaWYgeW91cgotZGVmYXVsdCBiYXNlIHBhY2thZ2UgaGFzIG1ham9yIHZlcnNpb24gbnVtYmVyIDQpLCB5b3UgbXVzdCBzcGVjaWZ5IGEgdmVyc2lvbiBvZgotdGhlIGJhc2UgcGFja2FnZSB3aXRoIG1ham9yIHZlcnNpb24gbnVtYmVyIDMuIEZ1cnRoZXJtb3JlIGlmIHlvdSBoYXZlIHRoZSBzeWIKLXBhY2thZ2UgaW5zdGFsbGVkIHlvdSBuZWVkIHRvIGhpZGUgdGhhdCBwYWNrYWdlIHRvIGF2b2lkIGltcG9ydCBjb25mbGljdHMuCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiB3aGF0IEknbSB0YWxraW5nIGFib3V0OgotCi0gIGdoY2kgLWZnbGFzZ293LWV4dHMgLXBhY2thZ2UgYmFzZS0zLjAuMy4wIC1oaWRlLXBhY2thZ2Ugc3liIC1pc3JjIFRocmlmdC5ocwotCi1UbyBkZXRlcm1pbmUgd2hpY2ggdmVyc2lvbnMgb2YgdGhlIGJhc2UgcGFja2FnZSB5b3UgaGF2ZSBpbnN0YWxsZWQgdXNlIHRoZQotZm9sbG93aW5nIGNvbW1hbmQ6Ci0KLSAgZ2hjLXBrZyBsaXN0IGJhc2UKLQotQWxsIG9mIHRoaXMgaXMgdGFrZW4gY2FyZSBvZiBmb3IgeW91IGlmIHlvdSB1c2UgQ2FiYWwuCi0KLQotRW51bXMKLT09PT09Ci0KLWJlY29tZSBoYXNrZWxsIGRhdGEgdHlwZXMuIFVzZSBmcm9tRW51bSB0byBnZXQgb3V0IHRoZSBpbnQgdmFsdWUuCi0KLVN0cnVjdHMKLT09PT09PT0KLQotYmVjb21lIHJlY29yZHMuIEZpZWxkIGxhYmVscyBhcmUgdWdseSwgb2YgdGhlIGZvcm0gZl9TVFJVQ1ROQU1FX0ZJRUxETkFNRS4gQWxsCi1maWVsZHMgYXJlIE1heWJlIHR5cGVzLgotCi1FeGNlcHRpb25zCi09PT09PT09PT09Ci0KLWlkZW50aWNhbCB0byBzdHJ1Y3RzLiBUaHJvdyB0aGVtIHdpdGggdGhyb3dEeW4uIENhdGNoIHRoZW0gd2l0aCBjYXRjaER5bi4KLQotQ2xpZW50Ci09PT09PT0KLQotanVzdCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucy4gWW91IG1heSBoYXZlIHRvIGltcG9ydCBhIGJ1bmNoIG9mIGNsaWVudCBmaWxlcyB0bwotZGVhbCB3aXRoIGluaGVyaXRhbmNlLgotCi1JbnRlcmZhY2UKLT09PT09PT09PQotCi1Zb3Ugc2hvdWxkIG9ubHkgaGF2ZSB0byBpbXBvcnQgdGhlIGxhc3Qgb25lIGluIHRoZSBjaGFpbiBvZiBpbmhlcml0b3JzLiBUbyBtYWtlCi1hbiBpbnRlcmZhY2UsIGRlY2xhcmUgYSBsYWJlbDoKLQotICBkYXRhIE15SWZhY2UgPSBNeUlmYWNlCi0KLWFuZCB0aGVuIGRlY2xhcmUgaXQgYW4gaW5zdGFuY2Ugb2YgZWFjaCBpZmFjZSBjbGFzcywgc3RhcnRpbmcgd2l0aCB0aGUgc3VwZXJlc3QKLWNsYXNzIGFuZCBwcm9jZWRpbmcgZG93biAoYWxsIHRoZSB3aGlsZSBkZWZpbmluZyB0aGUgbWV0aG9kcykuICBUaGVuIHBhc3MgeW91cgotbGFiZWwgdG8gcHJvY2VzcyBhcyB0aGUgaGFuZGxlci4KLQotUHJvY2Vzc29yCi09PT09PT09PT0KLQotSnVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBoYW5kbGVyIGxhYmVsLCBwcm90b2NvbHMuIEl0IGNhbGxzIHRoZQotc3VwZXJjbGFzc2VzIHByb2Nlc3MgaWYgdGhlcmUgaXMgYSBzdXBlcmNsYXNzLgotCmRpZmYgLS1naXQgYS9saWIvaHMvUkVBRE1FLm1kIGIvbGliL2hzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWEwYTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL1JFQURNRS5tZApAQCAtMCwwICsxLDk5IEBACitIYXNrZWxsIFRocmlmdCBCaW5kaW5ncworCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitDb21waWxlCis9PT09PT09CisKK1VzZSBDYWJhbCB0byBjb21waWxlIGFuZCBpbnN0YWxsOyAuL2NvbmZpZ3VyZSB1c2VzIENhYmFsIHVuZGVybmVhdGgsIGFuZCB0aGF0CitwYXRoIGlzIG5vdCB5ZXQgd2VsbCB0ZXN0ZWQuIFRocmlmdCdzIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBjb21waWxlCit3aXRoIHByZXR0eSBtdWNoIGFueSBHSEMgZXh0ZW5zaW9ucyBvciB3YXJuaW5ncyB5b3UgZW5hYmxlIChvciBkaXNhYmxlKS4KK1BsZWFzZSByZXBvcnQgdGhpcyBub3QgYmVpbmcgdGhlIGNhc2UgYXMgYSBidWcgb24KK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9zZWN1cmUvQ3JlYXRlSXNzdWUhZGVmYXVsdC5qc3BhCisKK0NoYW5jZXMgeW91J2xsIG5lZWQgdG8gbXVjayBhIGJpdCB3aXRoIENhYmFsIGZsYWdzIHRvIGluc3RhbGwgVGhyaWZ0OgorCitDQUJBTF9DT05GSUdVUkVfRkxBR1M9Ii0tdXNlciIgLi9jb25maWd1cmUKKworQmFzZSBUeXBlcworPT09PT09PT09PQorCitUaGUgbWFwcGluZyBmcm9tIFRocmlmdCB0eXBlcyB0byBIYXNrZWxsJ3MgaXM6CisKKyAqIGRvdWJsZSAtPiBEb3VibGUKKyAqIGJ5dGUgLT4gRGF0YS5JbnQuSW50OAorICogaTE2IC0+IERhdGEuSW50LkludDE2CisgKiBpMzIgLT4gRGF0YS5JbnQuSW50MzIKKyAqIGk2NCAtPiBEYXRhLkludC5JbnQ2NAorICogc3RyaW5nIC0+IFRleHQKKyAqIGJpbmFyeSAtPiBEYXRhLkJ5dGVTdHJpbmcuTGF6eQorICogYm9vbCAtPiBCb29sZWFuCisKK0VudW1zCis9PT09PQorCitCZWNvbWUgSGFza2VsbCAnZGF0YScgdHlwZXMuIFVzZSBmcm9tRW51bSB0byBnZXQgb3V0IHRoZSBpbnQgdmFsdWUuCisKK0xpc3RzCis9PT09PQorCitCZWNvbWUgRGF0YS5WZWN0b3IuVmVjdG9yIGZyb20gdGhlIHZlY3RvciBwYWNrYWdlLgorCitNYXBzIGFuZCBTZXRzCis9PT09PT09PT09PT09CisKK0JlY29tZSBEYXRhLkhhc2hNYXAuU3RyaWN0Lk1hcCBhbmQgRGF0YS5IYXNoU2V0LlNldCBmcm9tIHRoZQordW5vcmRlcmVkLWNvbnRhaW5lcnMgcGFja2FnZS4KKworU3RydWN0cworPT09PT09PQorCitCZWNvbWUgcmVjb3Jkcy4gRmllbGQgbGFiZWxzIGFyZSB1Z2x5LCBvZiB0aGUgZm9ybSBmX1NUUlVDVE5BTUVfRklFTEROQU1FLiBBbGwKK2ZpZWxkcyBhcmUgTWF5YmUgdHlwZXMuCisKK0V4Y2VwdGlvbnMKKz09PT09PT09PT0KKworSWRlbnRpY2FsIHRvIHN0cnVjdHMuIFVzZSB0aGVtIHdpdGggdGhyb3cgYW5kIGNhdGNoIGZyb20gQ29udHJvbC5FeGNlcHRpb24uCisKK0NsaWVudAorPT09PT09CisKK0p1c3QgYSBidW5jaCBvZiBmdW5jdGlvbnMuIFlvdSBtYXkgaGF2ZSB0byBpbXBvcnQgYSBidW5jaCBvZiBjbGllbnQgZmlsZXMgdG8KK2RlYWwgd2l0aCBpbmhlcml0YW5jZS4KKworSW50ZXJmYWNlCis9PT09PT09PT0KKworWW91IHNob3VsZCBvbmx5IGhhdmUgdG8gaW1wb3J0IHRoZSBsYXN0IG9uZSBpbiB0aGUgY2hhaW4gb2YgaW5oZXJpdG9ycy4gVG8gbWFrZQorYW4gaW50ZXJmYWNlLCBkZWNsYXJlIGEgbGFiZWw6CisKKyAgZGF0YSBNeUlmYWNlID0gTXlJZmFjZQorCithbmQgdGhlbiBkZWNsYXJlIGl0IGFuIGluc3RhbmNlIG9mIGVhY2ggaWZhY2UgY2xhc3MsIHN0YXJ0aW5nIHdpdGggdGhlIHN1cGVyZXN0CitjbGFzcyBhbmQgcHJvY2VlZGluZyBkb3duIChhbGwgdGhlIHdoaWxlIGRlZmluaW5nIHRoZSBtZXRob2RzKS4gIFRoZW4gcGFzcyB5b3VyCitsYWJlbCB0byBwcm9jZXNzIGFzIHRoZSBoYW5kbGVyLgorCitQcm9jZXNzb3IKKz09PT09PT09PQorCitKdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGhhbmRsZXIgbGFiZWwsIHByb3RvY29scy4gSXQgY2FsbHMgdGhlCitzdXBlcmNsYXNzZXMgcHJvY2VzcyBpZiB0aGVyZSBpcyBhIHN1cGVyY2xhc3MuCmRpZmYgLS1naXQgYS9saWIvaHMvU2V0dXAubGhzIGIvbGliL2hzL1NldHVwLmxocwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGM5ZTZkOTcuLmQ1MmFlOTQKLS0tIGEvbGliL2hzL1NldHVwLmxocworKysgYi9saWIvaHMvU2V0dXAubGhzCkBAIC0xLDIzICsxLDIxIEBACiAjIS91c3IvYmluL2VudiBydW5oYXNrZWxsCiAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIworPiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCis+IC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCis+IC0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCis+IC0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorPiAtLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCis+IC0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKz4gLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis+IC0tIAorPiAtLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorPiAtLSAKKz4gLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorPiAtLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorPiAtLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKz4gLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKz4gLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworPiAtLSB1bmRlciB0aGUgTGljZW5zZS4KIAogPiBpbXBvcnQgRGlzdHJpYnV0aW9uLlNpbXBsZQogPiBtYWluID0gZGVmYXVsdE1haW4KZGlmZiAtLWdpdCBhL2xpYi9ocy9UaHJpZnQuY2FiYWwgYi9saWIvaHMvVGhyaWZ0LmNhYmFsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWIyZTgxLi4wMDAwMDAwCi0tLSBhL2xpYi9ocy9UaHJpZnQuY2FiYWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0tLQotLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLS0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0tLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLS0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLS0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLS0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLS0KLS0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0tLQotLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLS0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLS0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLS0tIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0KLQotTmFtZTogICAgICAgICAgIFRocmlmdAotVmVyc2lvbjogICAgICAgIDAuMS4xCi1DYWJhbC1WZXJzaW9uOiAgPj0gMS4yCi1MaWNlbnNlOiAgICAgICAgQXBhY2hlMgotQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KLUJ1aWxkLVR5cGU6ICAgICBTaW1wbGUKLVN5bm9wc2lzOiAgICAgICBUaHJpZnQgbGlicmFyeSBwYWNrYWdlCi0KLUxpYnJhcnkKLSAgSHMtU291cmNlLURpcnM6Ci0gICAgc3JjCi0gIEJ1aWxkLURlcGVuZHM6Ci0gICAgYmFzZSA+PTQsIG5ldHdvcmssIGdoYy1wcmltLCBiaW5hcnksIGJ5dGVzdHJpbmcsIEhUVFAKLSAgZ2hjLW9wdGlvbnM6Ci0gICAgLWZnbGFzZ293LWV4dHMKLSAgRXh0ZW5zaW9uczoKLSAgICBEZXJpdmVEYXRhVHlwZWFibGUKLSAgRXhwb3NlZC1Nb2R1bGVzOgotICAgIFRocmlmdCwgVGhyaWZ0LlByb3RvY29sLCBUaHJpZnQuVHJhbnNwb3J0LCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5Ci0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUsIFRocmlmdC5UcmFuc3BvcnQuSHR0cENsaWVudCwgIFRocmlmdC5TZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9ocy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2hzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQuaHMgYi9saWIvaHMvc3JjL1RocmlmdC5ocwppbmRleCAyOTFiY2FlLi42NTgwMjA5IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC5ocwpAQCAtMSwzICsxLDYgQEAKK3stIyBMQU5HVUFHRSBEZXJpdmVEYXRhVHlwZWFibGUgIy19Cit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19Cit7LSMgTEFOR1VBR0UgUmFua05UeXBlcyAjLX0KIC0tCiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAtLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMjcsMTQgKzMwLDE3IEBACiAgICAgLCBUaHJpZnRFeGNlcHRpb24oLi4pCiAgICAgKSB3aGVyZQogCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAoIHdoZW4gKQogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCiAKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuVGV4dC5MYXp5ICggVGV4dCwgcGFjaywgdW5wYWNrICkKK2ltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZwogaW1wb3J0IERhdGEuVHlwZWFibGUgKCBUeXBlYWJsZSApCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCiAKLWltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sCi0KK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlR5cGVzCiAKIGRhdGEgVGhyaWZ0RXhjZXB0aW9uID0gVGhyaWZ0RXhjZXB0aW9uCiAgIGRlcml2aW5nICggU2hvdywgVHlwZWFibGUgKQpAQCAtNDcsNiArNTMsMTEgQEAKICAgICB8IEFFX1dST05HX01FVEhPRF9OQU1FCiAgICAgfCBBRV9CQURfU0VRVUVOQ0VfSUQKICAgICB8IEFFX01JU1NJTkdfUkVTVUxUCisgICAgfCBBRV9JTlRFUk5BTF9FUlJPUgorICAgIHwgQUVfUFJPVE9DT0xfRVJST1IKKyAgICB8IEFFX0lOVkFMSURfVFJBTlNGT1JNCisgICAgfCBBRV9JTlZBTElEX1BST1RPQ09MCisgICAgfCBBRV9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRQogICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdywgVHlwZWFibGUgKQogCiBpbnN0YW5jZSBFbnVtIEFwcEV4blR5cGUgd2hlcmUKQEAgLTU2LDYgKzY3LDEyIEBACiAgICAgdG9FbnVtIDMgPSBBRV9XUk9OR19NRVRIT0RfTkFNRQogICAgIHRvRW51bSA0ID0gQUVfQkFEX1NFUVVFTkNFX0lECiAgICAgdG9FbnVtIDUgPSBBRV9NSVNTSU5HX1JFU1VMVAorICAgIHRvRW51bSA2ID0gQUVfSU5URVJOQUxfRVJST1IKKyAgICB0b0VudW0gNyA9IEFFX1BST1RPQ09MX0VSUk9SCisgICAgdG9FbnVtIDggPSBBRV9JTlZBTElEX1RSQU5TRk9STQorICAgIHRvRW51bSA5ID0gQUVfSU5WQUxJRF9QUk9UT0NPTAorICAgIHRvRW51bSAxMCA9IEFFX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFCisgICAgdG9FbnVtIHQgPSBlcnJvciAkICJJbnZhbGlkIEFwcEV4blR5cGUgIiArKyBzaG93IHQKIAogICAgIGZyb21FbnVtIEFFX1VOS05PV04gPSAwCiAgICAgZnJvbUVudW0gQUVfVU5LTk9XTl9NRVRIT0QgPSAxCkBAIC02Myw0OSArODAsMzUgQEAKICAgICBmcm9tRW51bSBBRV9XUk9OR19NRVRIT0RfTkFNRSA9IDMKICAgICBmcm9tRW51bSBBRV9CQURfU0VRVUVOQ0VfSUQgPSA0CiAgICAgZnJvbUVudW0gQUVfTUlTU0lOR19SRVNVTFQgPSA1CisgICAgZnJvbUVudW0gQUVfSU5URVJOQUxfRVJST1IgPSA2CisgICAgZnJvbUVudW0gQUVfUFJPVE9DT0xfRVJST1IgPSA3CisgICAgZnJvbUVudW0gQUVfSU5WQUxJRF9UUkFOU0ZPUk0gPSA4CisgICAgZnJvbUVudW0gQUVfSU5WQUxJRF9QUk9UT0NPTCA9IDkKKyAgICBmcm9tRW51bSBBRV9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwCiAKIGRhdGEgQXBwRXhuID0gQXBwRXhuIHsgYWVfdHlwZSA6OiBBcHBFeG5UeXBlLCBhZV9tZXNzYWdlIDo6IFN0cmluZyB9CiAgIGRlcml2aW5nICggU2hvdywgVHlwZWFibGUgKQogaW5zdGFuY2UgRXhjZXB0aW9uIEFwcEV4bgogCi13cml0ZUFwcEV4biA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBBcHBFeG4gLT4gSU8gKCkKLXdyaXRlQXBwRXhuIHB0IGFlID0gZG8KLSAgICB3cml0ZVN0cnVjdEJlZ2luIHB0ICJUQXBwbGljYXRpb25FeGNlcHRpb24iCit3cml0ZUFwcEV4biA6OiBQcm90b2NvbCBwID0+IHAgLT4gQXBwRXhuIC0+IElPICgpCit3cml0ZUFwcEV4biBwdCBhZSA9IHdyaXRlVmFsIHB0ICQgVFN0cnVjdCAkIE1hcC5mcm9tTGlzdAorICAgICAgICAgICAgICAgICAgICBbICgxLCAoIm1lc3NhZ2UiLCBUU3RyaW5nICQgZW5jb2RlVXRmOCAkIHBhY2sgJCBhZV9tZXNzYWdlIGFlKSkKKyAgICAgICAgICAgICAgICAgICAgLCAoMiwgKCJ0eXBlIiwgVEkzMiAkIGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIChhZV90eXBlIGFlKSkpCisgICAgICAgICAgICAgICAgICAgIF0KIAotICAgIHdoZW4gKGFlX21lc3NhZ2UgYWUgLz0gIiIpICQgZG8KLSAgICAgICAgd3JpdGVGaWVsZEJlZ2luIHB0ICgibWVzc2FnZSIsIFRfU1RSSU5HICwgMSkKLSAgICAgICAgd3JpdGVTdHJpbmcgcHQgKGFlX21lc3NhZ2UgYWUpCi0gICAgICAgIHdyaXRlRmllbGRFbmQgcHQKLQotICAgIHdyaXRlRmllbGRCZWdpbiBwdCAoInR5cGUiLCBUX0kzMiwgMik7Ci0gICAgd3JpdGVJMzIgcHQgKGZyb21FbnVtIChhZV90eXBlIGFlKSkKLSAgICB3cml0ZUZpZWxkRW5kIHB0Ci0gICAgd3JpdGVGaWVsZFN0b3AgcHQKLSAgICB3cml0ZVN0cnVjdEVuZCBwdAotCi1yZWFkQXBwRXhuIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IElPIEFwcEV4bgorcmVhZEFwcEV4biA6OiBQcm90b2NvbCBwID0+IHAgLT4gSU8gQXBwRXhuCiByZWFkQXBwRXhuIHB0ID0gZG8KLSAgICByZWFkU3RydWN0QmVnaW4gcHQKLSAgICByZWMgPC0gcmVhZEFwcEV4bkZpZWxkcyBwdCAoQXBwRXhuIHthZV90eXBlID0gdW5kZWZpbmVkLCBhZV9tZXNzYWdlID0gdW5kZWZpbmVkfSkKLSAgICByZWFkU3RydWN0RW5kIHB0Ci0gICAgcmV0dXJuIHJlYworICAgIGxldCB0eXBlbWFwID0gTWFwLmZyb21MaXN0IFsoMSwoIm1lc3NhZ2UiLFRfU1RSSU5HKSksKDIsKCJ0eXBlIixUX0kzMikpXQorICAgIFRTdHJ1Y3QgZmllbGRzIDwtIHJlYWRWYWwgcHQgJCBUX1NUUlVDVCB0eXBlbWFwCisgICAgcmV0dXJuICQgcmVhZEFwcEV4bkZpZWxkcyBmaWVsZHMKIAotcmVhZEFwcEV4bkZpZWxkcyBwdCByZWMgPSBkbwotICAgIChuLCBmdCwgaWQpIDwtIHJlYWRGaWVsZEJlZ2luIHB0Ci0gICAgaWYgZnQgPT0gVF9TVE9QCi0gICAgICAgIHRoZW4gcmV0dXJuIHJlYwotICAgICAgICBlbHNlIGNhc2UgaWQgb2YKLSAgICAgICAgICAgICAgICAgMSAtPiBpZiBmdCA9PSBUX1NUUklORyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHMgPC0gcmVhZFN0cmluZyBwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXBwRXhuRmllbGRzIHB0IHJlY3thZV9tZXNzYWdlID0gc30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkbyBza2lwIHB0IGZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFwcEV4bkZpZWxkcyBwdCByZWMKLSAgICAgICAgICAgICAgICAgMiAtPiBpZiBmdCA9PSBUX0kzMiB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvIGkgPC0gcmVhZEkzMiBwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXBwRXhuRmllbGRzIHB0IHJlY3thZV90eXBlID0gKHRvRW51bSAgaSl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZG8gc2tpcCBwdCBmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBcHBFeG5GaWVsZHMgcHQgcmVjCi0gICAgICAgICAgICAgICAgIF8gLT4gZG8gc2tpcCBwdCBmdAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRGaWVsZEVuZCBwdAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBcHBFeG5GaWVsZHMgcHQgcmVjCi0KK3JlYWRBcHBFeG5GaWVsZHMgOjogTWFwLkhhc2hNYXAgSW50MTYgKFRleHQsIFRocmlmdFZhbCkgLT4gQXBwRXhuCityZWFkQXBwRXhuRmllbGRzIGZpZWxkcyA9IEFwcEV4bnsKKyAgYWVfbWVzc2FnZSA9IG1heWJlIHVuZGVmaW5lZCB1bndyYXBNZXNzYWdlICQgTWFwLmxvb2t1cCAxIGZpZWxkcywKKyAgYWVfdHlwZSAgICA9IG1heWJlIHVuZGVmaW5lZCB1bndyYXBUeXBlICQgTWFwLmxvb2t1cCAyIGZpZWxkcworICB9CisgIHdoZXJlCisgICAgdW53cmFwTWVzc2FnZSAoXywgVFN0cmluZyBzKSA9IHVucGFjayAkIGRlY29kZVV0ZjggcworICAgIHVud3JhcE1lc3NhZ2UgXyA9IHVuZGVmaW5lZAorICAgIHVud3JhcFR5cGUgKF8sIFRJMzIgaSkgPSB0b0VudW0gJCBmcm9tSW50ZWdyYWwgaQorICAgIHVud3JhcFR5cGUgXyA9IHVuZGVmaW5lZApkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWMwZmMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKQEAgLTAsMCArMSw1NSBAQAorey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1vcnBoYW5zICMtfQorCittb2R1bGUgVGhyaWZ0LkFyYml0cmFyaWVzIHdoZXJlCisKK2ltcG9ydCBEYXRhLkJpdHMoKQorCitpbXBvcnQgVGVzdC5RdWlja0NoZWNrLkFyYml0cmFyeQorCitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZSAoKDwkPikpCitpbXBvcnQgRGF0YS5NYXAgKE1hcCkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3IKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgVGV4dAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgSFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIEhNYXAKK2ltcG9ydCBEYXRhLkhhc2hhYmxlIChIYXNoYWJsZSkKKworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5IChCeXRlU3RyaW5nKQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBCUworCistLSBTdHJpbmcgaGFzIGFuIEFyYml0cmFyeSBpbnN0YW5jZSBhbHJlYWR5CistLSBCb29sIGhhcyBhbiBBcmJpdHJhcnkgaW5zdGFuY2UgYWxyZWFkeQorLS0gQSBUaHJpZnQgJ2xpc3QnIGlzIGEgVmVjdG9yLgorCitpbnN0YW5jZSBBcmJpdHJhcnkgQnl0ZVN0cmluZyB3aGVyZQorICBhcmJpdHJhcnkgPSBCUy5wYWNrIC4gZmlsdGVyICgvPSAwKSA8JD4gYXJiaXRyYXJ5CisKK2luc3RhbmNlIChBcmJpdHJhcnkgaykgPT4gQXJiaXRyYXJ5IChWZWN0b3IuVmVjdG9yIGspIHdoZXJlCisgIGFyYml0cmFyeSA9IFZlY3Rvci5mcm9tTGlzdCA8JD4gYXJiaXRyYXJ5CisKK2luc3RhbmNlIEFyYml0cmFyeSBUZXh0LlRleHQgd2hlcmUKKyAgYXJiaXRyYXJ5ID0gVGV4dC5wYWNrIC4gZmlsdGVyICgvPSAnXDAnKSA8JD4gYXJiaXRyYXJ5CisKK2luc3RhbmNlIChFcSBrLCBIYXNoYWJsZSBrLCBBcmJpdHJhcnkgaykgPT4gQXJiaXRyYXJ5IChIU2V0Lkhhc2hTZXQgaykgd2hlcmUKKyAgYXJiaXRyYXJ5ID0gSFNldC5mcm9tTGlzdCA8JD4gYXJiaXRyYXJ5CisKK2luc3RhbmNlIChFcSBrLCBIYXNoYWJsZSBrLCBBcmJpdHJhcnkgaywgQXJiaXRyYXJ5IHYpID0+CisgICAgQXJiaXRyYXJ5IChITWFwLkhhc2hNYXAgayB2KSB3aGVyZQorICBhcmJpdHJhcnkgPSBITWFwLmZyb21MaXN0IDwkPiBhcmJpdHJhcnkKKworey0KKyAgIFRvIGhhbmRsZSBUaHJpZnQgJ2VudW0nIHdlIHdvdWxkIGlkZWFsbHkgdXNlIHNvbWV0aGluZyBsaWtlOgorCitpbnN0YW5jZSAoRW51bSBhLCBCb3VuZGVkIGEpID0+IEFyYml0cmFyeSBhCisgICAgd2hlcmUgYXJiaXRyYXJ5ID0gZWxlbWVudHMgKGVudW1Gcm9tVG8gbWluQm91bmQgbWF4Qm91bmQpCisKK1VuZm9ydHVuYXRlbHkgdGhpcyBkb2Vzbid0IHBsYXkgbmljZWx5IHdpdGggdGhlIHR5cGUgc3lzdGVtLgorSW5zdGVhZCB3ZSdsbCBnZW5lcmF0ZSBhbiBhcmJpdHJhcnkgaW5zdGFuY2UgYWxvbmcgd2l0aCB0aGUgY29kZS4KKy19CisKK3stCisgICAgVGhlcmUgbWlnaHQgYmUgc29tZSB3YXkgdG8gaW50cm9zcGVjdCBvbiB0aGUgSGFza2VsbCBzdHJ1Y3R1cmUgb2YgYQorICAgIFRocmlmdCAnc3RydWN0JyBvciAnZXhjZXB0aW9uJyBidXQgZ2VuZXJhdGluZyB0aGUgY29kZSBkaXJlY3RseSBpcyBzaW1wbGVyLgorLX0KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMKaW5kZXggOGZhMDYwZS4uNjdhOTE3NSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMKQEAgLTEsMyArMSw2IEBACit7LSMgTEFOR1VBR0UgQ1BQICMtfQorey0jIExBTkdVQUdFIERlcml2ZURhdGFUeXBlYWJsZSAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KIC0tCiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAtLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTksMTY0ICsyMiw0NiBAQAogCiBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCiAgICAgKCBQcm90b2NvbCguLikKLSAgICAsIHNraXAKLSAgICAsIE1lc3NhZ2VUeXBlKC4uKQotICAgICwgVGhyaWZ0VHlwZSguLikKKyAgICAsIFN0YXRlbGVzc1Byb3RvY29sKC4uKQogICAgICwgUHJvdG9jb2xFeG4oLi4pCiAgICAgLCBQcm90b2NvbEV4blR5cGUoLi4pCisgICAgLCBnZXRUeXBlT2YKKyAgICAsIHJ1blBhcnNlcgorICAgICwgYnNUb0RvdWJsZQorICAgICwgYnNUb0RvdWJsZUxFCiAgICAgKSB3aGVyZQogCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAoIHJlcGxpY2F0ZU1fLCB1bmxlc3MgKQogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCi0KLWltcG9ydCBEYXRhLlR5cGVhYmxlICggVHlwZWFibGUgKQoraW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nCitpbXBvcnQgRGF0YS5CaXRzCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLlVuc2FmZQoraW1wb3J0IERhdGEuRnVuY3RvciAoKDwkPikpCiBpbXBvcnQgRGF0YS5JbnQKK2ltcG9ydCBEYXRhLk1vbm9pZCAobWVtcHR5KQoraW1wb3J0IERhdGEuVGV4dC5MYXp5IChUZXh0KQoraW1wb3J0IERhdGEuVHlwZWFibGUgKFR5cGVhYmxlKQoraW1wb3J0IERhdGEuV29yZAoraW1wb3J0IEZvcmVpZ24uUHRyIChjYXN0UHRyKQoraW1wb3J0IEZvcmVpZ24uU3RvcmFibGUgKHBlZWssIHBva2UpCitpbXBvcnQgU3lzdGVtLklPLlVuc2FmZQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcgYXMgQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCiAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Ci0KLQotZGF0YSBUaHJpZnRUeXBlCi0gICAgPSBUX1NUT1AKLSAgICB8IFRfVk9JRAotICAgIHwgVF9CT09MCi0gICAgfCBUX0JZVEUKLSAgICB8IFRfRE9VQkxFCi0gICAgfCBUX0kxNgotICAgIHwgVF9JMzIKLSAgICB8IFRfSTY0Ci0gICAgfCBUX1NUUklORwotICAgIHwgVF9TVFJVQ1QKLSAgICB8IFRfTUFQCi0gICAgfCBUX1NFVAotICAgIHwgVF9MSVNUCi0gICAgICBkZXJpdmluZyAoIEVxICkKLQotaW5zdGFuY2UgRW51bSBUaHJpZnRUeXBlIHdoZXJlCi0gICAgZnJvbUVudW0gVF9TVE9QICAgPSAwCi0gICAgZnJvbUVudW0gVF9WT0lEICAgPSAxCi0gICAgZnJvbUVudW0gVF9CT09MICAgPSAyCi0gICAgZnJvbUVudW0gVF9CWVRFICAgPSAzCi0gICAgZnJvbUVudW0gVF9ET1VCTEUgPSA0Ci0gICAgZnJvbUVudW0gVF9JMTYgICAgPSA2Ci0gICAgZnJvbUVudW0gVF9JMzIgICAgPSA4Ci0gICAgZnJvbUVudW0gVF9JNjQgICAgPSAxMAotICAgIGZyb21FbnVtIFRfU1RSSU5HID0gMTEKLSAgICBmcm9tRW51bSBUX1NUUlVDVCA9IDEyCi0gICAgZnJvbUVudW0gVF9NQVAgICAgPSAxMwotICAgIGZyb21FbnVtIFRfU0VUICAgID0gMTQKLSAgICBmcm9tRW51bSBUX0xJU1QgICA9IDE1Ci0KLSAgICB0b0VudW0gMCAgPSBUX1NUT1AKLSAgICB0b0VudW0gMSAgPSBUX1ZPSUQKLSAgICB0b0VudW0gMiAgPSBUX0JPT0wKLSAgICB0b0VudW0gMyAgPSBUX0JZVEUKLSAgICB0b0VudW0gNCAgPSBUX0RPVUJMRQotICAgIHRvRW51bSA2ICA9IFRfSTE2Ci0gICAgdG9FbnVtIDggID0gVF9JMzIKLSAgICB0b0VudW0gMTAgPSBUX0k2NAotICAgIHRvRW51bSAxMSA9IFRfU1RSSU5HCi0gICAgdG9FbnVtIDEyID0gVF9TVFJVQ1QKLSAgICB0b0VudW0gMTMgPSBUX01BUAotICAgIHRvRW51bSAxNCA9IFRfU0VUCi0gICAgdG9FbnVtIDE1ID0gVF9MSVNUCi0KLWRhdGEgTWVzc2FnZVR5cGUKLSAgICA9IE1fQ0FMTAotICAgIHwgTV9SRVBMWQotICAgIHwgTV9FWENFUFRJT04KLSAgICAgIGRlcml2aW5nICggRXEgKQotCi1pbnN0YW5jZSBFbnVtIE1lc3NhZ2VUeXBlIHdoZXJlCi0gICAgZnJvbUVudW0gTV9DQUxMICAgICAgPSAgMQotICAgIGZyb21FbnVtIE1fUkVQTFkgICAgID0gIDIKLSAgICBmcm9tRW51bSBNX0VYQ0VQVElPTiA9ICAzCi0KLSAgICB0b0VudW0gMSA9IE1fQ0FMTAotICAgIHRvRW51bSAyID0gTV9SRVBMWQotICAgIHRvRW51bSAzID0gTV9FWENFUFRJT04KLQoraW1wb3J0IFRocmlmdC5UeXBlcwogCiBjbGFzcyBQcm90b2NvbCBhIHdoZXJlCi0gICAgZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiB0CisgIHJlYWRCeXRlIDo6IGEgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKKyAgcmVhZFZhbCA6OiBhIC0+IFRocmlmdFR5cGUgLT4gSU8gVGhyaWZ0VmFsCisgIHJlYWRNZXNzYWdlIDo6IGEgLT4gKChUZXh0LCBNZXNzYWdlVHlwZSwgSW50MzIpIC0+IElPIGIpIC0+IElPIGIKIAotICAgIHdyaXRlTWVzc2FnZUJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoU3RyaW5nLCBNZXNzYWdlVHlwZSwgSW50KSAtPiBJTyAoKQotICAgIHdyaXRlTWVzc2FnZUVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQorICB3cml0ZVZhbCA6OiBhIC0+IFRocmlmdFZhbCAtPiBJTyAoKQorICB3cml0ZU1lc3NhZ2UgOjogYSAtPiAoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyAoKSAtPiBJTyAoKQogCi0gICAgd3JpdGVTdHJ1Y3RCZWdpbiA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gU3RyaW5nIC0+IElPICgpCi0gICAgd3JpdGVTdHJ1Y3RFbmQgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICB3cml0ZUZpZWxkQmVnaW4gIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoU3RyaW5nLCBUaHJpZnRUeXBlLCBJbnQpIC0+IElPICgpCi0gICAgd3JpdGVGaWVsZEVuZCAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICB3cml0ZUZpZWxkU3RvcCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHdyaXRlTWFwQmVnaW4gICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IChUaHJpZnRUeXBlLCBUaHJpZnRUeXBlLCBJbnQpIC0+IElPICgpCi0gICAgd3JpdGVNYXBFbmQgICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICB3cml0ZUxpc3RCZWdpbiAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoVGhyaWZ0VHlwZSwgSW50KSAtPiBJTyAoKQotICAgIHdyaXRlTGlzdEVuZCAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgd3JpdGVTZXRCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRocmlmdFR5cGUsIEludCkgLT4gSU8gKCkKLSAgICB3cml0ZVNldEVuZCAgICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotCi0gICAgd3JpdGVCb29sICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEJvb2wgLT4gSU8gKCkKLSAgICB3cml0ZUJ5dGUgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSW50IC0+IElPICgpCi0gICAgd3JpdGVJMTYgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEludCAtPiBJTyAoKQotICAgIHdyaXRlSTMyICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJbnQgLT4gSU8gKCkKLSAgICB3cml0ZUk2NCAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSW50NjQgLT4gSU8gKCkKLSAgICB3cml0ZURvdWJsZSA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gRG91YmxlIC0+IElPICgpCi0gICAgd3JpdGVTdHJpbmcgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFN0cmluZyAtPiBJTyAoKQotICAgIHdyaXRlQmluYXJ5IDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBTdHJpbmcgLT4gSU8gKCkKLQotCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFN0cmluZywgTWVzc2FnZVR5cGUsIEludCkKLSAgICByZWFkTWVzc2FnZUVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotCi0gICAgcmVhZFN0cnVjdEJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBTdHJpbmcKLSAgICByZWFkU3RydWN0RW5kICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgcmVhZEZpZWxkQmVnaW4gIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoU3RyaW5nLCBUaHJpZnRUeXBlLCBJbnQpCi0gICAgcmVhZEZpZWxkRW5kICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHJlYWRNYXBCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFRocmlmdFR5cGUsIFRocmlmdFR5cGUsIEludCkKLSAgICByZWFkTWFwRW5kICAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgcmVhZExpc3RCZWdpbiAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoVGhyaWZ0VHlwZSwgSW50KQotICAgIHJlYWRMaXN0RW5kICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICByZWFkU2V0QmVnaW4gICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIChUaHJpZnRUeXBlLCBJbnQpCi0gICAgcmVhZFNldEVuZCAgICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotCi0gICAgcmVhZEJvb2wgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gQm9vbAotICAgIHJlYWRCeXRlICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEludAotICAgIHJlYWRJMTYgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEludAotICAgIHJlYWRJMzIgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEludAotICAgIHJlYWRJNjQgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEludDY0Ci0gICAgcmVhZERvdWJsZSA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gRG91YmxlCi0gICAgcmVhZFN0cmluZyA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gU3RyaW5nCi0gICAgcmVhZEJpbmFyeSA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gU3RyaW5nCi0KLQotc2tpcCA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBUaHJpZnRUeXBlIC0+IElPICgpCi1za2lwIHAgVF9TVE9QID0gcmV0dXJuICgpCi1za2lwIHAgVF9WT0lEID0gcmV0dXJuICgpCi1za2lwIHAgVF9CT09MID0gcmVhZEJvb2wgcCA+PiByZXR1cm4gKCkKLXNraXAgcCBUX0JZVEUgPSByZWFkQnl0ZSBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfSTE2ID0gcmVhZEkxNiBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfSTMyID0gcmVhZEkzMiBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfSTY0ID0gcmVhZEk2NCBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfRE9VQkxFID0gcmVhZERvdWJsZSBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfU1RSSU5HID0gcmVhZFN0cmluZyBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfU1RSVUNUID0gZG8gcmVhZFN0cnVjdEJlZ2luIHAKLSAgICAgICAgICAgICAgICAgICAgIHNraXBGaWVsZHMgcAotICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cnVjdEVuZCBwCi1za2lwIHAgVF9NQVAgPSBkbyAoaywgdiwgcykgPC0gcmVhZE1hcEJlZ2luIHAKLSAgICAgICAgICAgICAgICAgIHJlcGxpY2F0ZU1fIHMgKHNraXAgcCBrID4+IHNraXAgcCB2KQotICAgICAgICAgICAgICAgICAgcmVhZE1hcEVuZCBwCi1za2lwIHAgVF9TRVQgPSBkbyAodCwgbikgPC0gcmVhZFNldEJlZ2luIHAKLSAgICAgICAgICAgICAgICAgIHJlcGxpY2F0ZU1fIG4gKHNraXAgcCB0KQotICAgICAgICAgICAgICAgICAgcmVhZFNldEVuZCBwCi1za2lwIHAgVF9MSVNUID0gZG8gKHQsIG4pIDwtIHJlYWRMaXN0QmVnaW4gcAotICAgICAgICAgICAgICAgICAgIHJlcGxpY2F0ZU1fIG4gKHNraXAgcCB0KQotICAgICAgICAgICAgICAgICAgIHJlYWRMaXN0RW5kIHAKLQotCi1za2lwRmllbGRzIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IElPICgpCi1za2lwRmllbGRzIHAgPSBkbwotICAgIChfLCB0LCBfKSA8LSByZWFkRmllbGRCZWdpbiBwCi0gICAgdW5sZXNzICh0ID09IFRfU1RPUCkgKHNraXAgcCB0ID4+IHJlYWRGaWVsZEVuZCBwID4+IHNraXBGaWVsZHMgcCkKLQorY2xhc3MgUHJvdG9jb2wgYSA9PiBTdGF0ZWxlc3NQcm90b2NvbCBhIHdoZXJlCisgIHNlcmlhbGl6ZVZhbCA6OiBhIC0+IFRocmlmdFZhbCAtPiBMQlMuQnl0ZVN0cmluZworICBkZXNlcmlhbGl6ZVZhbCA6OiBhIC0+IFRocmlmdFR5cGUgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gVGhyaWZ0VmFsCiAKIGRhdGEgUHJvdG9jb2xFeG5UeXBlCiAgICAgPSBQRV9VTktOT1dOCkBAIC0xODQsOCArNjksNjggQEAKICAgICB8IFBFX05FR0FUSVZFX1NJWkUKICAgICB8IFBFX1NJWkVfTElNSVQKICAgICB8IFBFX0JBRF9WRVJTSU9OCisgICAgfCBQRV9OT1RfSU1QTEVNRU5URUQKKyAgICB8IFBFX01JU1NJTkdfUkVRVUlSRURfRklFTEQKICAgICAgIGRlcml2aW5nICggRXEsIFNob3csIFR5cGVhYmxlICkKIAogZGF0YSBQcm90b2NvbEV4biA9IFByb3RvY29sRXhuIFByb3RvY29sRXhuVHlwZSBTdHJpbmcKICAgZGVyaXZpbmcgKCBTaG93LCBUeXBlYWJsZSApCiBpbnN0YW5jZSBFeGNlcHRpb24gUHJvdG9jb2xFeG4KKworZ2V0VHlwZU9mIDo6IFRocmlmdFZhbCAtPiBUaHJpZnRUeXBlCitnZXRUeXBlT2YgdiA9ICBjYXNlIHYgb2YKKyAgVFN0cnVjdHt9IC0+IFRfU1RSVUNUIE1hcC5lbXB0eQorICBUTWFwe30gLT4gVF9NQVAgVF9WT0lEIFRfVk9JRAorICBUTGlzdHt9IC0+IFRfTElTVCBUX1ZPSUQKKyAgVFNldHt9IC0+IFRfU0VUIFRfVk9JRAorICBUQm9vbHt9IC0+IFRfQk9PTAorICBUQnl0ZXt9IC0+IFRfQllURQorICBUSTE2e30gLT4gVF9JMTYKKyAgVEkzMnt9IC0+IFRfSTMyCisgIFRJNjR7fSAtPiBUX0k2NAorICBUU3RyaW5ne30gLT4gVF9TVFJJTkcKKyAgVEJpbmFyeXt9IC0+IFRfQklOQVJZCisgIFREb3VibGV7fSAtPiBUX0RPVUJMRQorCitydW5QYXJzZXIgOjogKFByb3RvY29sIHAsIFNob3cgYSkgPT4gcCAtPiBQYXJzZXIgYSAtPiBJTyBhCitydW5QYXJzZXIgcHJvdCBwID0gcmVmaWxsID4+PSBnZXRSZXN1bHQgLiBwYXJzZSBwCisgIHdoZXJlCisgICAgcmVmaWxsID0gaGFuZGxlIGhhbmRsZUVPRiAkIExCUy50b1N0cmljdCA8JD4gcmVhZEJ5dGUgcHJvdAorICAgIGdldFJlc3VsdCAoRG9uZSBfIGEpID0gcmV0dXJuIGEKKyAgICBnZXRSZXN1bHQgKFBhcnRpYWwgaykgPSByZWZpbGwgPj49IGdldFJlc3VsdCAuIGsKKyAgICBnZXRSZXN1bHQgZiA9IHRocm93ICQgUHJvdG9jb2xFeG4gUEVfSU5WQUxJRF9EQVRBIChzaG93IGYpCisKK2hhbmRsZUVPRiA6OiBTb21lRXhjZXB0aW9uIC0+IElPIEJTLkJ5dGVTdHJpbmcKK2hhbmRsZUVPRiA9IGNvbnN0ICQgcmV0dXJuIG1lbXB0eQorCistLSB8IENvbnZlcnRzIGEgQnl0ZVN0cmluZyB0byBhIEZsb2F0aW5nIHBvaW50IG51bWJlcgorLS0gVGhlIEJ5dGVTdHJpbmcgaXMgYXNzdW1lZCB0byBiZSBlbmNvZGVkIGluIG5ldHdvcmsgb3JkZXIgKEJpZyBFbmRpYW4pCistLSB0aGVyZWZvcmUgdGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gdmFyaWVzIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGxvY2FsCistLSBtYWNoaW5lIGlzIGJpZyBlbmRpYW4gb3IgbGl0dGxlIGVuZGlhbi4KK2JzVG9Eb3VibGUgOjogQlMuQnl0ZVN0cmluZyAtPiBEb3VibGUKK2JzVG9Eb3VibGVMRSA6OiBCUy5CeXRlU3RyaW5nIC0+IERvdWJsZQorI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KK2JzVG9Eb3VibGUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCc1N3YXBwZWQKK2JzVG9Eb3VibGVMRSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzCisjZWxzZQorYnNUb0RvdWJsZSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzCitic1RvRG91YmxlTEUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCc1N3YXBwZWQKKyNlbmRpZgorCisKK2Nhc3RCc1N3YXBwZWQgY2hyUHRyID0gZG8KKyAgdyA8LSBwZWVrIChjYXN0UHRyIGNoclB0cikKKyAgcG9rZSAoY2FzdFB0ciBjaHJQdHIpIChieXRlU3dhcCB3KQorICBwZWVrIChjYXN0UHRyIGNoclB0cikKK2Nhc3RCcyA9IHBlZWsgLiBjYXN0UHRyCisKKy0tIHwgU3dhcCBlbmRpYW5uZXNzIG9mIGEgNjQtYml0IHdvcmQKK2J5dGVTd2FwIDo6IFdvcmQ2NCAtPiBXb3JkNjQKK2J5dGVTd2FwIHcgPSAodyBgc2hpZnRMYCA1NiAuJi4gMHhGRjAwMDAwMDAwMDAwMDAwKSAufC4KKyAgICAgICAgICAgICAodyBgc2hpZnRMYCA0MCAuJi4gMHgwMEZGMDAwMDAwMDAwMDAwKSAufC4KKyAgICAgICAgICAgICAodyBgc2hpZnRMYCAyNCAuJi4gMHgwMDAwRkYwMDAwMDAwMDAwKSAufC4KKyAgICAgICAgICAgICAodyBgc2hpZnRMYCA4ICAuJi4gMHgwMDAwMDBGRjAwMDAwMDAwKSAufC4KKyAgICAgICAgICAgICAodyBgc2hpZnRSYCA4ICAuJi4gMHgwMDAwMDAwMEZGMDAwMDAwKSAufC4KKyAgICAgICAgICAgICAodyBgc2hpZnRSYCAyNCAuJi4gMHgwMDAwMDAwMDAwRkYwMDAwKSAufC4KKyAgICAgICAgICAgICAodyBgc2hpZnRSYCA0MCAuJi4gMHgwMDAwMDAwMDAwMDBGRjAwKSAufC4KKyAgICAgICAgICAgICAodyBgc2hpZnRSYCA1NiAuJi4gMHgwMDAwMDAwMDAwMDAwMEZGKQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCmluZGV4IGZhOWEyMDcuLjdiMGFjZDkgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKQEAgLTE3LDEzNiArMTcsMTk2IEBACiAtLSB1bmRlciB0aGUgTGljZW5zZS4KIC0tCiAKK3stIyBMQU5HVUFHRSBDUFAgIy19Cit7LSMgTEFOR1VBR0UgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KK3stIyBMQU5HVUFHRSBTY29wZWRUeXBlVmFyaWFibGVzICMtfQorCiBtb2R1bGUgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQogICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAogICAgICwgQmluYXJ5UHJvdG9jb2woLi4pCisgICAgLCB2ZXJzaW9uTWFzaworICAgICwgdmVyc2lvbjEKICAgICApIHdoZXJlCiAKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKLWltcG9ydCBDb250cm9sLk1vbmFkICggbGlmdE0gKQotCitpbXBvcnQgQ29udHJvbC5Nb25hZAogaW1wb3J0IERhdGEuQml0cworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKIGltcG9ydCBEYXRhLkludAotaW1wb3J0IERhdGEuTGlzdCAoIGZvbGRsJyApCi0KLWltcG9ydCBHSEMuRXh0cwotaW1wb3J0IEdIQy5Xb3JkCitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKQoraW1wb3J0IERhdGEuV29yZAogCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UeXBlcwogCi1pbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkxhenkgYXMgTFAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkgYXMgQmluYXJ5CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVAogCi12ZXJzaW9uX21hc2sgPSAweGZmZmYwMDAwCi12ZXJzaW9uXzEgICAgPSAweDgwMDEwMDAwCit2ZXJzaW9uTWFzayA6OiBJbnQzMgordmVyc2lvbk1hc2sgPSBmcm9tSW50ZWdyYWwgKDB4ZmZmZjAwMDAgOjogV29yZDMyKQorCit2ZXJzaW9uMSA6OiBJbnQzMgordmVyc2lvbjEgPSBmcm9tSW50ZWdyYWwgKDB4ODAwMTAwMDAgOjogV29yZDMyKQogCiBkYXRhIEJpbmFyeVByb3RvY29sIGEgPSBUcmFuc3BvcnQgYSA9PiBCaW5hcnlQcm90b2NvbCBhCiAKK2dldFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiBCaW5hcnlQcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoQmluYXJ5UHJvdG9jb2wgdCkgPSB0CiAKLWluc3RhbmNlIFByb3RvY29sIEJpbmFyeVByb3RvY29sIHdoZXJlCi0gICAgZ2V0VHJhbnNwb3J0IChCaW5hcnlQcm90b2NvbCB0KSA9IHQKKy0tIE5PVEU6IFJlYWRpbmcgYW5kIFdyaXRpbmcgZnVuY3Rpb25zIHJlbHkgb24gQnVpbGRlcnMgYW5kIERhdGEuQmluYXJ5IHRvCistLSBlbmNvZGUgYW5kIGRlY29kZSBkYXRhLiAgRGF0YS5CaW5hcnkgYXNzdW1lcyB0aGF0IHRoZSBiaW5hcnkgdmFsdWVzIGl0IGlzCistLSBlbmNvZGluZyB0byBhbmQgZGVjb2RpbmcgZnJvbSBhcmUgaW4gQklHIEVORElBTiBmb3JtYXQsIGFuZCBjb252ZXJ0cyB0aGUKKy0tIGVuZGlhbm5lc3MgYXMgbmVjZXNzYXJ5IHRvIG1hdGNoIHRoZSBsb2NhbCBtYWNoaW5lLgoraW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gUHJvdG9jb2wgKEJpbmFyeVByb3RvY29sIHQpIHdoZXJlCisgICAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQorICAgIC0tIGZsdXNoVHJhbnNwb3J0IHAgPSB0Rmx1c2ggKGdldFRyYW5zcG9ydCBwKQorICAgIHdyaXRlTWVzc2FnZSBwIChuLCB0LCBzKSBmID0gZG8KKyAgICAgIHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIG1lc3NhZ2VCZWdpbgorICAgICAgZgorICAgICAgdEZsdXNoICQgZ2V0VHJhbnNwb3J0IHAKKyAgICAgIHdoZXJlCisgICAgICAgIG1lc3NhZ2VCZWdpbiA9IHRvTGF6eUJ5dGVTdHJpbmcgJAorICAgICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRJMzIgKHZlcnNpb24xIC58LiBmcm9tSW50ZWdyYWwgKGZyb21FbnVtIHQpKSkgPD4KKyAgICAgICAgICBidWlsZEJpbmFyeVZhbHVlIChUU3RyaW5nICQgZW5jb2RlVXRmOCBuKSA8PgorICAgICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRJMzIgcykKIAotICAgIHdyaXRlTWVzc2FnZUJlZ2luIHAgKG4sIHQsIHMpID0gZG8KLSAgICAgICAgd3JpdGVJMzIgcCAodmVyc2lvbl8xIC58LiAoZnJvbUVudW0gdCkpCi0gICAgICAgIHdyaXRlU3RyaW5nIHAgbgotICAgICAgICB3cml0ZUkzMiBwIHMKLSAgICB3cml0ZU1lc3NhZ2VFbmQgXyA9IHJldHVybiAoKQotCi0gICAgd3JpdGVTdHJ1Y3RCZWdpbiBfIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZVN0cnVjdEVuZCBfID0gcmV0dXJuICgpCi0gICAgd3JpdGVGaWVsZEJlZ2luIHAgKF8sIHQsIGkpID0gd3JpdGVUeXBlIHAgdCA+PiB3cml0ZUkxNiBwIGkKLSAgICB3cml0ZUZpZWxkRW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZUZpZWxkU3RvcCBwID0gd3JpdGVUeXBlIHAgVF9TVE9QCi0gICAgd3JpdGVNYXBCZWdpbiBwIChrLCB2LCBuKSA9IHdyaXRlVHlwZSBwIGsgPj4gd3JpdGVUeXBlIHAgdiA+PiB3cml0ZUkzMiBwIG4KLSAgICB3cml0ZU1hcEVuZCBwID0gcmV0dXJuICgpCi0gICAgd3JpdGVMaXN0QmVnaW4gcCAodCwgbikgPSB3cml0ZVR5cGUgcCB0ID4+IHdyaXRlSTMyIHAgbgotICAgIHdyaXRlTGlzdEVuZCBfID0gcmV0dXJuICgpCi0gICAgd3JpdGVTZXRCZWdpbiBwICh0LCBuKSA9IHdyaXRlVHlwZSBwIHQgPj4gd3JpdGVJMzIgcCBuCi0gICAgd3JpdGVTZXRFbmQgXyA9IHJldHVybiAoKQotCi0gICAgd3JpdGVCb29sIHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgTEJTLnNpbmdsZXRvbiAkIHRvRW51bSAkIGlmIGIgdGhlbiAxIGVsc2UgMAotICAgIHdyaXRlQnl0ZSBwIGIgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAoZ2V0Qnl0ZXMgYiAxKQotICAgIHdyaXRlSTE2IHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIChnZXRCeXRlcyBiIDIpCi0gICAgd3JpdGVJMzIgcCBiID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgKGdldEJ5dGVzIGIgNCkKLSAgICB3cml0ZUk2NCBwIGIgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAoZ2V0Qnl0ZXMgYiA4KQotICAgIHdyaXRlRG91YmxlIHAgZCA9IHdyaXRlSTY0IHAgKGZyb21JbnRlZ3JhbCAkIGZsb2F0Qml0cyBkKQotICAgIHdyaXRlU3RyaW5nIHAgcyA9IHdyaXRlSTMyIHAgKGxlbmd0aCBzKSA+PiB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAoTEJTLnBhY2sgcykKLSAgICB3cml0ZUJpbmFyeSA9IHdyaXRlU3RyaW5nCi0KLSAgICByZWFkTWVzc2FnZUJlZ2luIHAgPSBkbwotICAgICAgICB2ZXIgPC0gcmVhZEkzMiBwCi0gICAgICAgIGlmICh2ZXIgLiYuIHZlcnNpb25fbWFzayAvPSB2ZXJzaW9uXzEpCisgICAgcmVhZE1lc3NhZ2UgcCA9IChyZWFkTWVzc2FnZUJlZ2luIHAgPj49KQorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiBwID0gcnVuUGFyc2VyIHAgJCBkbworICAgICAgICAgIFRJMzIgdmVyIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9JMzIKKyAgICAgICAgICBpZiB2ZXIgLiYuIHZlcnNpb25NYXNrIC89IHZlcnNpb24xCiAgICAgICAgICAgICB0aGVuIHRocm93ICQgUHJvdG9jb2xFeG4gUEVfQkFEX1ZFUlNJT04gIk1pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyIgogICAgICAgICAgICAgZWxzZSBkbwotICAgICAgICAgICAgICBzIDwtIHJlYWRTdHJpbmcgcAotICAgICAgICAgICAgICBzeiA8LSByZWFkSTMyIHAKLSAgICAgICAgICAgICAgcmV0dXJuIChzLCB0b0VudW0gJCB2ZXIgLiYuIDB4RkYsIHN6KQotICAgIHJlYWRNZXNzYWdlRW5kIF8gPSByZXR1cm4gKCkKLSAgICByZWFkU3RydWN0QmVnaW4gXyA9IHJldHVybiAiIgotICAgIHJlYWRTdHJ1Y3RFbmQgXyA9IHJldHVybiAoKQotICAgIHJlYWRGaWVsZEJlZ2luIHAgPSBkbwotICAgICAgICB0IDwtIHJlYWRUeXBlIHAKLSAgICAgICAgbiA8LSBpZiB0IC89IFRfU1RPUCB0aGVuIHJlYWRJMTYgcCBlbHNlIHJldHVybiAwCi0gICAgICAgIHJldHVybiAoIiIsIHQsIG4pCi0gICAgcmVhZEZpZWxkRW5kIF8gPSByZXR1cm4gKCkKLSAgICByZWFkTWFwQmVnaW4gcCA9IGRvCi0gICAgICAgIGt0IDwtIHJlYWRUeXBlIHAKLSAgICAgICAgdnQgPC0gcmVhZFR5cGUgcAotICAgICAgICBuIDwtIHJlYWRJMzIgcAotICAgICAgICByZXR1cm4gKGt0LCB2dCwgbikKLSAgICByZWFkTWFwRW5kIF8gPSByZXR1cm4gKCkKLSAgICByZWFkTGlzdEJlZ2luIHAgPSBkbwotICAgICAgICB0IDwtIHJlYWRUeXBlIHAKLSAgICAgICAgbiA8LSByZWFkSTMyIHAKLSAgICAgICAgcmV0dXJuICh0LCBuKQotICAgIHJlYWRMaXN0RW5kIF8gPSByZXR1cm4gKCkKLSAgICByZWFkU2V0QmVnaW4gcCA9IGRvCi0gICAgICAgIHQgPC0gcmVhZFR5cGUgcAotICAgICAgICBuIDwtIHJlYWRJMzIgcAotICAgICAgICByZXR1cm4gKHQsIG4pCi0gICAgcmVhZFNldEVuZCBfID0gcmV0dXJuICgpCisgICAgICAgICAgICAgIFRTdHJpbmcgcyA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfU1RSSU5HCisgICAgICAgICAgICAgIFRJMzIgc3ogPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgorICAgICAgICAgICAgICByZXR1cm4gKGRlY29kZVV0ZjggcywgdG9FbnVtICQgZnJvbUludGVncmFsICQgdmVyIC4mLiAweEZGLCBzeikKIAotICAgIHJlYWRCb29sIHAgPSAoPT0gMSkgYGZtYXBgIHJlYWRCeXRlIHAKLSAgICByZWFkQnl0ZSBwID0gZG8KLSAgICAgICAgYnMgPC0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCi0gICAgICAgIHJldHVybiAkIGZyb21JbnRlZ3JhbCAoY29tcG9zZUJ5dGVzIGJzIDo6IEludDgpCi0gICAgcmVhZEkxNiBwID0gZG8KLSAgICAgICAgYnMgPC0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAyCi0gICAgICAgIHJldHVybiAkIGZyb21JbnRlZ3JhbCAoY29tcG9zZUJ5dGVzIGJzIDo6IEludDE2KQotICAgIHJlYWRJMzIgcCA9IGNvbXBvc2VCeXRlcyBgZm1hcGAgdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSA0Ci0gICAgcmVhZEk2NCBwID0gY29tcG9zZUJ5dGVzIGBmbWFwYCB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDgKLSAgICByZWFkRG91YmxlIHAgPSBkbwotICAgICAgICBicyA8LSByZWFkSTY0IHAKLSAgICAgICAgcmV0dXJuICQgZmxvYXRPZkJpdHMgJCBmcm9tSW50ZWdyYWwgYnMKLSAgICByZWFkU3RyaW5nIHAgPSBkbwotICAgICAgICBpIDwtIHJlYWRJMzIgcAotICAgICAgICBMQlMudW5wYWNrIGBsaWZ0TWAgdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSBpCisgICAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQmluYXJ5VmFsdWUKKyAgICByZWFkVmFsIHAgPSBydW5QYXJzZXIgcCAuIHBhcnNlQmluYXJ5VmFsdWUKIAotICAgIHJlYWRCaW5hcnkgPSByZWFkU3RyaW5nCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBTdGF0ZWxlc3NQcm90b2NvbCAoQmluYXJ5UHJvdG9jb2wgdCkgd2hlcmUKKyAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEJpbmFyeVZhbHVlCisgICAgZGVzZXJpYWxpemVWYWwgXyB0eSBicyA9CisgICAgICBjYXNlIExQLmVpdGhlclJlc3VsdCAkIExQLnBhcnNlIChwYXJzZUJpbmFyeVZhbHVlIHR5KSBicyBvZgorICAgICAgICBMZWZ0IHMgLT4gZXJyb3IgcworICAgICAgICBSaWdodCB2YWwgLT4gdmFsCisKKy0tIHwgV3JpdGluZyBGdW5jdGlvbnMKK2J1aWxkQmluYXJ5VmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkQmluYXJ5VmFsdWUgKFRTdHJ1Y3QgZmllbGRzKSA9IGJ1aWxkQmluYXJ5U3RydWN0IGZpZWxkcyA8PiBidWlsZFR5cGUgVF9TVE9QCitidWlsZEJpbmFyeVZhbHVlIChUTWFwIGt5IHZ0IGVudHJpZXMpID0KKyAgYnVpbGRUeXBlIGt5IDw+CisgIGJ1aWxkVHlwZSB2dCA8PgorICBpbnQzMkJFIChmcm9tSW50ZWdyYWwgKGxlbmd0aCBlbnRyaWVzKSkgPD4KKyAgYnVpbGRCaW5hcnlNYXAgZW50cmllcworYnVpbGRCaW5hcnlWYWx1ZSAoVExpc3QgdHkgZW50cmllcykgPQorICBidWlsZFR5cGUgdHkgPD4KKyAgaW50MzJCRSAoZnJvbUludGVncmFsIChsZW5ndGggZW50cmllcykpIDw+CisgIGJ1aWxkQmluYXJ5TGlzdCBlbnRyaWVzCitidWlsZEJpbmFyeVZhbHVlIChUU2V0IHR5IGVudHJpZXMpID0KKyAgYnVpbGRUeXBlIHR5IDw+CisgIGludDMyQkUgKGZyb21JbnRlZ3JhbCAobGVuZ3RoIGVudHJpZXMpKSA8PgorICBidWlsZEJpbmFyeUxpc3QgZW50cmllcworYnVpbGRCaW5hcnlWYWx1ZSAoVEJvb2wgYikgPQorICB3b3JkOCAkIHRvRW51bSAkIGlmIGIgdGhlbiAxIGVsc2UgMAorYnVpbGRCaW5hcnlWYWx1ZSAoVEJ5dGUgYikgPSBpbnQ4IGIKK2J1aWxkQmluYXJ5VmFsdWUgKFRJMTYgaSkgPSBpbnQxNkJFIGkKK2J1aWxkQmluYXJ5VmFsdWUgKFRJMzIgaSkgPSBpbnQzMkJFIGkKK2J1aWxkQmluYXJ5VmFsdWUgKFRJNjQgaSkgPSBpbnQ2NEJFIGkKK2J1aWxkQmluYXJ5VmFsdWUgKFREb3VibGUgZCkgPSBkb3VibGVCRSBkCitidWlsZEJpbmFyeVZhbHVlIChUU3RyaW5nIHMpID0gaW50MzJCRSBsZW4gPD4gbGF6eUJ5dGVTdHJpbmcgcworICB3aGVyZQorICAgIGxlbiA6OiBJbnQzMiA9IGZyb21JbnRlZ3JhbCAoTEJTLmxlbmd0aCBzKQorYnVpbGRCaW5hcnlWYWx1ZSAoVEJpbmFyeSBzKSA9IGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgcykKKworYnVpbGRCaW5hcnlTdHJ1Y3QgOjogTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkgLT4gQnVpbGRlcgorYnVpbGRCaW5hcnlTdHJ1Y3QgPSBNYXAuZm9sZHJXaXRoS2V5IGNvbWJpbmUgbWVtcHR5CisgIHdoZXJlCisgICAgY29tYmluZSBmaWQgKF8sdmFsKSBzID0KKyAgICAgIGJ1aWxkVHlwZU9mIHZhbCA8PiBpbnQxNkJFIGZpZCA8PiBidWlsZEJpbmFyeVZhbHVlIHZhbCA8PiBzCisKK2J1aWxkQmluYXJ5TWFwIDo6IFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXSAtPiBCdWlsZGVyCitidWlsZEJpbmFyeU1hcCA9IGZvbGRsIGNvbWJpbmUgbWVtcHR5CisgIHdoZXJlCisgICAgY29tYmluZSBzIChrZXksIHZhbCkgPSBzIDw+IGJ1aWxkQmluYXJ5VmFsdWUga2V5IDw+IGJ1aWxkQmluYXJ5VmFsdWUgdmFsCisKK2J1aWxkQmluYXJ5TGlzdCA6OiBbVGhyaWZ0VmFsXSAtPiBCdWlsZGVyCitidWlsZEJpbmFyeUxpc3QgPSBmb2xkciAobWFwcGVuZCAuIGJ1aWxkQmluYXJ5VmFsdWUpIG1lbXB0eQorCistLSB8IFJlYWRpbmcgRnVuY3Rpb25zCitwYXJzZUJpbmFyeVZhbHVlIDo6IFRocmlmdFR5cGUgLT4gUC5QYXJzZXIgVGhyaWZ0VmFsCitwYXJzZUJpbmFyeVZhbHVlIChUX1NUUlVDVCB0bWFwKSA9IFRTdHJ1Y3QgPCQ+IHBhcnNlQmluYXJ5U3RydWN0IHRtYXAKK3BhcnNlQmluYXJ5VmFsdWUgKFRfTUFQIF8gXykgPSBkbworICBrdCA8LSBwYXJzZVR5cGUKKyAgdnQgPC0gcGFyc2VUeXBlCisgIG4gPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorICBUTWFwIGt0IHZ0IDwkPiBwYXJzZUJpbmFyeU1hcCBrdCB2dCBuCitwYXJzZUJpbmFyeVZhbHVlIChUX0xJU1QgXykgPSBkbworICB0IDwtIHBhcnNlVHlwZQorICBuIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKKyAgVExpc3QgdCA8JD4gcGFyc2VCaW5hcnlMaXN0IHQgbgorcGFyc2VCaW5hcnlWYWx1ZSAoVF9TRVQgXykgPSBkbworICB0IDwtIHBhcnNlVHlwZQorICBuIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKKyAgVFNldCB0IDwkPiBwYXJzZUJpbmFyeUxpc3QgdCBuCitwYXJzZUJpbmFyeVZhbHVlIFRfQk9PTCA9IFRCb29sIC4gKC89MCkgPCQ+IFAuYW55V29yZDgKK3BhcnNlQmluYXJ5VmFsdWUgVF9CWVRFID0gVEJ5dGUgLiBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAxCitwYXJzZUJpbmFyeVZhbHVlIFRfSTE2ID0gVEkxNiAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDIKK3BhcnNlQmluYXJ5VmFsdWUgVF9JMzIgPSBUSTMyIC4gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorcGFyc2VCaW5hcnlWYWx1ZSBUX0k2NCA9IFRJNjQgLiBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA4CitwYXJzZUJpbmFyeVZhbHVlIFRfRE9VQkxFID0gVERvdWJsZSAuIGJzVG9Eb3VibGUgPCQ+IFAudGFrZSA4CitwYXJzZUJpbmFyeVZhbHVlIFRfU1RSSU5HID0gcGFyc2VCaW5hcnlTdHJpbmcgVFN0cmluZworcGFyc2VCaW5hcnlWYWx1ZSBUX0JJTkFSWSA9IHBhcnNlQmluYXJ5U3RyaW5nIFRCaW5hcnkKK3BhcnNlQmluYXJ5VmFsdWUgdHkgPSBlcnJvciAkICJDYW5ub3QgcmVhZCB2YWx1ZSBvZiB0eXBlICIgKysgc2hvdyB0eQorCitwYXJzZUJpbmFyeVN0cmluZyB0eSA9IGRvCisgIGkgOjogSW50MzIgIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKKyAgdHkgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIChmcm9tSW50ZWdyYWwgaSkKKworcGFyc2VCaW5hcnlTdHJ1Y3QgOjogVHlwZU1hcCAtPiBQLlBhcnNlciAoTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkpCitwYXJzZUJpbmFyeVN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IDwkPiBQLm1hbnlUaWxsIHBhcnNlRmllbGQgKG1hdGNoVHlwZSBUX1NUT1ApCisgIHdoZXJlCisgICAgcGFyc2VGaWVsZCA9IGRvCisgICAgICB0IDwtIHBhcnNlVHlwZQorICAgICAgbiA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAyCisgICAgICB2IDwtIGNhc2UgKHQsIE1hcC5sb29rdXAgbiB0bWFwKSBvZgorICAgICAgICAgICAgIChUX1NUUklORywgSnVzdCAoXywgVF9CSU5BUlkpKSAtPiBwYXJzZUJpbmFyeVZhbHVlIFRfQklOQVJZCisgICAgICAgICAgICAgXyAtPiBwYXJzZUJpbmFyeVZhbHVlIHQKKyAgICAgIHJldHVybiAobiwgKCIiLCB2KSkKKworcGFyc2VCaW5hcnlNYXAgOjogVGhyaWZ0VHlwZSAtPiBUaHJpZnRUeXBlIC0+IEludDMyIC0+IFAuUGFyc2VyIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQorcGFyc2VCaW5hcnlNYXAga3QgdnQgbiB8IG4gPD0gMCA9IHJldHVybiBbXQorICAgICAgICAgICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IGRvCisgIGsgPC0gcGFyc2VCaW5hcnlWYWx1ZSBrdAorICB2IDwtIHBhcnNlQmluYXJ5VmFsdWUgdnQKKyAgKChrLHYpIDopIDwkPiBwYXJzZUJpbmFyeU1hcCBrdCB2dCAobi0xKQorCitwYXJzZUJpbmFyeUxpc3QgOjogVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPiBQLlBhcnNlciBbVGhyaWZ0VmFsXQorcGFyc2VCaW5hcnlMaXN0IHR5IG4gfCBuIDw9IDAgPSByZXR1cm4gW10KKyAgICAgICAgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gbGlmdE0yICg6KSAocGFyc2VCaW5hcnlWYWx1ZSB0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnNlQmluYXJ5TGlzdCB0eSAobi0xKSkKKwogCiAKIC0tIHwgV3JpdGUgYSB0eXBlIGFzIGEgYnl0ZQotd3JpdGVUeXBlIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IFRocmlmdFR5cGUgLT4gSU8gKCkKLXdyaXRlVHlwZSBwIHQgPSB3cml0ZUJ5dGUgcCAoZnJvbUVudW0gdCkKK2J1aWxkVHlwZSA6OiBUaHJpZnRUeXBlIC0+IEJ1aWxkZXIKK2J1aWxkVHlwZSB0ID0gd29yZDggJCBmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSB0CisKKy0tIHwgV3JpdGUgdHlwZSBvZiBhIFRocmlmdFZhbCBhcyBhIGJ5dGUKK2J1aWxkVHlwZU9mIDo6IFRocmlmdFZhbCAtPiBCdWlsZGVyCitidWlsZFR5cGVPZiA9IGJ1aWxkVHlwZSAuIGdldFR5cGVPZgogCiAtLSB8IFJlYWQgYSBieXRlIGFzIHRob3VnaCBpdCB3ZXJlIGEgVGhyaWZ0VHlwZQotcmVhZFR5cGUgOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gSU8gVGhyaWZ0VHlwZQotcmVhZFR5cGUgcCA9IHRvRW51bSBgZm1hcGAgcmVhZEJ5dGUgcAorcGFyc2VUeXBlIDo6IFAuUGFyc2VyIFRocmlmdFR5cGUKK3BhcnNlVHlwZSA9IHRvRW51bSAuIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAogCi1jb21wb3NlQnl0ZXMgOjogKEJpdHMgYikgPT4gTEJTLkJ5dGVTdHJpbmcgLT4gYgotY29tcG9zZUJ5dGVzID0gKGZvbGRsJyBmbiAwKSAuIChtYXAgKGZyb21JbnRlZ3JhbCAuIGZyb21FbnVtKSkgLiBMQlMudW5wYWNrCi0gICAgd2hlcmUgZm4gYWNjIGIgPSAoYWNjIGBzaGlmdExgIDgpIC58LiBiCi0KLWdldEJ5dGUgOjogQml0cyBhID0+IGEgLT4gSW50IC0+IGEKLWdldEJ5dGUgaSBuID0gMjU1IC4mLiAoaSBgc2hpZnRSYCAoOCAqIG4pKQotCi1nZXRCeXRlcyA6OiAoQml0cyBhLCBJbnRlZ3JhbCBhKSA9PiBhIC0+IEludCAtPiBMQlMuQnl0ZVN0cmluZwotZ2V0Qnl0ZXMgaSAwID0gTEJTLmVtcHR5Ci1nZXRCeXRlcyBpIG4gPSAodG9FbnVtICQgZnJvbUludGVncmFsICQgZ2V0Qnl0ZSBpIChuLTEpKSBgTEJTLmNvbnNgIChnZXRCeXRlcyBpIChuLTEpKQotCi1mbG9hdEJpdHMgOjogRG91YmxlIC0+IFdvcmQ2NAotZmxvYXRCaXRzIChEIyBkIykgPSBXNjQjICh1bnNhZmVDb2VyY2UjIGQjKQotCi1mbG9hdE9mQml0cyA6OiBXb3JkNjQgLT4gRG91YmxlCi1mbG9hdE9mQml0cyAoVzY0IyBiIykgPSBEIyAodW5zYWZlQ29lcmNlIyBiIykKLQorbWF0Y2hUeXBlIDo6IFRocmlmdFR5cGUgLT4gUC5QYXJzZXIgVGhyaWZ0VHlwZQorbWF0Y2hUeXBlIHQgPSB0IDwkIFAud29yZDggKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM5NzBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocwpAQCAtMCwwICsxLDMxMSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBMQU5HVUFHRSBDUFAgIy19Cit7LSMgTEFOR1VBR0UgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KK3stIyBMQU5HVUFHRSBTY29wZWRUeXBlVmFyaWFibGVzICMtfQorCittb2R1bGUgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKKyAgICAoIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKKyAgICAsIENvbXBhY3RQcm90b2NvbCguLikKKyAgICAsIHBhcnNlVmFyaW50CisgICAgLCBidWlsZFZhcmludAorICAgICkgd2hlcmUKKworaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAoraW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkxhenkgYXMgTFAKK2ltcG9ydCBEYXRhLkJpdHMKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyIGFzIEIKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuTGlzdCBhcyBMaXN0CitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBEYXRhLldvcmQKK2ltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKQorCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UeXBlcworCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFQKKworLS0gfCB0aGUgQ29tcGFjdCBQcm90b2NvbCBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBUaHJpZnQgJ1RDb21wYWN0UHJvY290b2wnCistLSB3aGljaCBpcyBzaW1pbGFyIHRvIHRoZSAnVEJpbmFyeVByb3RvY29sJywgYnV0IHRha2VzIGxlc3Mgc3BhY2Ugb24gdGhlIHdpcmUuCistLSBJbnRlZ3JhbCB0eXBlcyBhcmUgZW5jb2RlZCB1c2luZyBhcyB2YXJpbnRzLgorZGF0YSBDb21wYWN0UHJvdG9jb2wgYSA9IENvbXBhY3RQcm90b2NvbCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgLS0gXiBDb25zdHVjdCBhICdDb21wYWN0UHJvdG9jb2wnIHdpdGggYSAnVHJhbnNwb3J0JworCitwcm90b2NvbElELCB2ZXJzaW9uLCB2ZXJzaW9uTWFzaywgdHlwZU1hc2ssIHR5cGVCaXRzIDo6IFdvcmQ4Citwcm90b2NvbElEICA9IDB4ODIgLS0gMTAwMCAwMDEwCit2ZXJzaW9uICAgICA9IDB4MDEKK3ZlcnNpb25NYXNrID0gMHgxZiAtLSAwMDAxIDExMTEKK3R5cGVNYXNrICAgID0gMHhlMCAtLSAxMTEwIDAwMDAKK3R5cGVCaXRzICAgID0gMHgwNyAtLSAwMDAwIDAxMTEKK3R5cGVTaGlmdEFtb3VudCA6OiBJbnQKK3R5cGVTaGlmdEFtb3VudCA9IDUKKworZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IENvbXBhY3RQcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoQ29tcGFjdFByb3RvY29sIHQpID0gdAorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoQ29tcGFjdFByb3RvY29sIHQpIHdoZXJlCisgICAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQorICAgIHdyaXRlTWVzc2FnZSBwIChuLCB0LCBzKSBmID0gZG8KKyAgICAgIHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIG1lc3NhZ2VCZWdpbgorICAgICAgZgorICAgICAgdEZsdXNoICQgZ2V0VHJhbnNwb3J0IHAKKyAgICAgIHdoZXJlCisgICAgICAgIG1lc3NhZ2VCZWdpbiA9IHRvTGF6eUJ5dGVTdHJpbmcgJAorICAgICAgICAgIEIud29yZDggcHJvdG9jb2xJRCA8PgorICAgICAgICAgIEIud29yZDggKCh2ZXJzaW9uIC4mLiB2ZXJzaW9uTWFzaykgLnwuCisgICAgICAgICAgICAgICAgICAoKChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSB0KSBgc2hpZnRMYAorICAgICAgICAgICAgICAgICAgdHlwZVNoaWZ0QW1vdW50KSAuJi4gdHlwZU1hc2spKSA8PgorICAgICAgICAgIGJ1aWxkVmFyaW50IChpMzJUb1ppZ1phZyBzKSA8PgorICAgICAgICAgIGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nICQgZW5jb2RlVXRmOCBuKQorCisgICAgcmVhZE1lc3NhZ2UgcCBmID0gcmVhZE1lc3NhZ2VCZWdpbiA+Pj0gZgorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHJ1blBhcnNlciBwICQgZG8KKyAgICAgICAgICBwaWQgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CisgICAgICAgICAgd2hlbiAocGlkIC89IHByb3RvY29sSUQpICQgZXJyb3IgIkJhZCBQcm90b2NvbCBJRCIKKyAgICAgICAgICB3IDwtIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAorICAgICAgICAgIGxldCB2ZXIgPSB3IC4mLiB2ZXJzaW9uTWFzaworICAgICAgICAgIHdoZW4gKHZlciAvPSB2ZXJzaW9uKSAkIGVycm9yICJCYWQgUHJvdG9jb2wgdmVyc2lvbiIKKyAgICAgICAgICBsZXQgdHlwID0gKHcgYHNoaWZ0UmAgdHlwZVNoaWZ0QW1vdW50KSAuJi4gdHlwZUJpdHMKKyAgICAgICAgICBzZXFJZCA8LSBwYXJzZVZhcmludCB6aWdaYWdUb0kzMgorICAgICAgICAgIFRTdHJpbmcgbmFtZSA8LSBwYXJzZUNvbXBhY3RWYWx1ZSBUX1NUUklORworICAgICAgICAgIHJldHVybiAoZGVjb2RlVXRmOCBuYW1lLCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCB0eXAsIHNlcUlkKQorCisgICAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQ29tcGFjdFZhbHVlCisgICAgcmVhZFZhbCBwIHR5ID0gcnVuUGFyc2VyIHAgJCBwYXJzZUNvbXBhY3RWYWx1ZSB0eQorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBTdGF0ZWxlc3NQcm90b2NvbCAoQ29tcGFjdFByb3RvY29sIHQpIHdoZXJlCisgICAgc2VyaWFsaXplVmFsIF8gPSB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRDb21wYWN0VmFsdWUKKyAgICBkZXNlcmlhbGl6ZVZhbCBfIHR5IGJzID0KKyAgICAgIGNhc2UgTFAuZWl0aGVyUmVzdWx0ICQgTFAucGFyc2UgKHBhcnNlQ29tcGFjdFZhbHVlIHR5KSBicyBvZgorICAgICAgICBMZWZ0IHMgLT4gZXJyb3IgcworICAgICAgICBSaWdodCB2YWwgLT4gdmFsCisKKy0tIHwgV3JpdGluZyBGdW5jdGlvbnMKK2J1aWxkQ29tcGFjdFZhbHVlIDo6IFRocmlmdFZhbCAtPiBCdWlsZGVyCitidWlsZENvbXBhY3RWYWx1ZSAoVFN0cnVjdCBmaWVsZHMpID0gYnVpbGRDb21wYWN0U3RydWN0IGZpZWxkcworYnVpbGRDb21wYWN0VmFsdWUgKFRNYXAga3QgdnQgZW50cmllcykgPQorICBsZXQgbGVuID0gZnJvbUludGVncmFsICQgbGVuZ3RoIGVudHJpZXMgOjogV29yZDMyIGluCisgIGlmIGxlbiA9PSAwCisgIHRoZW4gQi53b3JkOCAweDAwCisgIGVsc2UgYnVpbGRWYXJpbnQgbGVuIDw+CisgICAgICAgQi53b3JkOCAoZnJvbVRUeXBlIGt0IGBzaGlmdExgIDQgLnwuIGZyb21UVHlwZSB2dCkgPD4KKyAgICAgICBidWlsZENvbXBhY3RNYXAgZW50cmllcworYnVpbGRDb21wYWN0VmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpID0KKyAgbGV0IGxlbiA9IGxlbmd0aCBlbnRyaWVzIGluCisgIChpZiBsZW4gPCAxNQorICAgdGhlbiBCLndvcmQ4ICQgKGZyb21JbnRlZ3JhbCBsZW4gYHNoaWZ0TGAgNCkgLnwuIGZyb21UVHlwZSB0eQorICAgZWxzZSBCLndvcmQ4ICgweEYwIC58LiBmcm9tVFR5cGUgdHkpIDw+CisgICAgICAgIGJ1aWxkVmFyaW50IChmcm9tSW50ZWdyYWwgbGVuIDo6IFdvcmQzMikpIDw+CisgIGJ1aWxkQ29tcGFjdExpc3QgZW50cmllcworYnVpbGRDb21wYWN0VmFsdWUgKFRTZXQgdHkgZW50cmllcykgPSBidWlsZENvbXBhY3RWYWx1ZSAoVExpc3QgdHkgZW50cmllcykKK2J1aWxkQ29tcGFjdFZhbHVlIChUQm9vbCBiKSA9CisgIEIud29yZDggJCB0b0VudW0gJCBpZiBiIHRoZW4gMSBlbHNlIDAKK2J1aWxkQ29tcGFjdFZhbHVlIChUQnl0ZSBiKSA9IGludDggYgorYnVpbGRDb21wYWN0VmFsdWUgKFRJMTYgaSkgPSBidWlsZFZhcmludCAkIGkxNlRvWmlnWmFnIGkKK2J1aWxkQ29tcGFjdFZhbHVlIChUSTMyIGkpID0gYnVpbGRWYXJpbnQgJCBpMzJUb1ppZ1phZyBpCitidWlsZENvbXBhY3RWYWx1ZSAoVEk2NCBpKSA9IGJ1aWxkVmFyaW50ICQgaTY0VG9aaWdaYWcgaQorYnVpbGRDb21wYWN0VmFsdWUgKFREb3VibGUgZCkgPSBkb3VibGVMRSBkCitidWlsZENvbXBhY3RWYWx1ZSAoVFN0cmluZyBzKSA9IGJ1aWxkVmFyaW50IGxlbiA8PiBsYXp5Qnl0ZVN0cmluZyBzCisgIHdoZXJlCisgICAgbGVuID0gZnJvbUludGVncmFsIChMQlMubGVuZ3RoIHMpIDo6IFdvcmQzMgorYnVpbGRDb21wYWN0VmFsdWUgKFRCaW5hcnkgcykgPSBidWlsZENvbXBhY3RWYWx1ZSAoVFN0cmluZyBzKQorCitidWlsZENvbXBhY3RTdHJ1Y3QgOjogTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkgLT4gQnVpbGRlcgorYnVpbGRDb21wYWN0U3RydWN0ID0gZmxpcCAobG9vcCAwKSBtZW1wdHkgLiBNYXAudG9MaXN0CisgIHdoZXJlCisgICAgbG9vcCBfIFtdIGFjYyA9IGFjYyA8PiBCLndvcmQ4IChmcm9tVFR5cGUgVF9TVE9QKQorICAgIGxvb3AgbGFzdElkICgoZmlkLCAoXyx2YWwpKSA6IGZpZWxkcykgYWNjID0gbG9vcCBmaWQgZmllbGRzICQgYWNjIDw+CisgICAgICAoaWYgZmlkID4gbGFzdElkICYmIGZpZCAtIGxhc3RJZCA8PSAxNQorICAgICAgIHRoZW4gQi53b3JkOCAkIGZyb21JbnRlZ3JhbCAoKGZpZCAtIGxhc3RJZCkgYHNoaWZ0TGAgNCkgLnwuIHR5cGVPZiB2YWwKKyAgICAgICBlbHNlIEIud29yZDggKHR5cGVPZiB2YWwpIDw+IGJ1aWxkVmFyaW50IChpMTZUb1ppZ1phZyBmaWQpKSA8PgorICAgICAgKGlmIHR5cGVPZiB2YWwgPiAweDAyIC0tIE5vdCBhIFRfQk9PTAorICAgICAgIHRoZW4gYnVpbGRDb21wYWN0VmFsdWUgdmFsCisgICAgICAgZWxzZSBtZW1wdHkpIC0tIFRfQk9PTHMgYXJlIGVuY29kZWQgaW4gdGhlIHR5cGUKK2J1aWxkQ29tcGFjdE1hcCA6OiBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0gLT4gQnVpbGRlcgorYnVpbGRDb21wYWN0TWFwID0gZm9sZGwgY29tYmluZSBtZW1wdHkKKyAgd2hlcmUKKyAgICBjb21iaW5lIHMgKGtleSwgdmFsKSA9IGJ1aWxkQ29tcGFjdFZhbHVlIGtleSA8PiBidWlsZENvbXBhY3RWYWx1ZSB2YWwgPD4gcworCitidWlsZENvbXBhY3RMaXN0IDo6IFtUaHJpZnRWYWxdIC0+IEJ1aWxkZXIKK2J1aWxkQ29tcGFjdExpc3QgPSBmb2xkciAobWFwcGVuZCAuIGJ1aWxkQ29tcGFjdFZhbHVlKSBtZW1wdHkKKworLS0gfCBSZWFkaW5nIEZ1bmN0aW9ucworcGFyc2VDb21wYWN0VmFsdWUgOjogVGhyaWZ0VHlwZSAtPiBQYXJzZXIgVGhyaWZ0VmFsCitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9TVFJVQ1QgdG1hcCkgPSBUU3RydWN0IDwkPiBwYXJzZUNvbXBhY3RTdHJ1Y3QgdG1hcAorcGFyc2VDb21wYWN0VmFsdWUgKFRfTUFQIGt0JyB2dCcpID0gZG8KKyAgbiA8LSBwYXJzZVZhcmludCBpZAorICBpZiBuID09IDAKKyAgICB0aGVuIHJldHVybiAkIFRNYXAga3QnIHZ0JyBbXQorICAgIGVsc2UgZG8KKyAgICB3IDwtIFAuYW55V29yZDgKKyAgICBsZXQga3QgPSB0eXBlRnJvbSAkIHcgYHNoaWZ0UmAgNAorICAgICAgICB2dCA9IHR5cGVGcm9tICQgdyAuJi4gMHgwRgorICAgIFRNYXAga3QgdnQgPCQ+IHBhcnNlQ29tcGFjdE1hcCBrdCB2dCBuCitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9MSVNUIHR5KSA9IFRMaXN0IHR5IDwkPiBwYXJzZUNvbXBhY3RMaXN0CitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9TRVQgdHkpID0gVFNldCB0eSA8JD4gcGFyc2VDb21wYWN0TGlzdAorcGFyc2VDb21wYWN0VmFsdWUgVF9CT09MID0gVEJvb2wgLiAoLz0wKSA8JD4gUC5hbnlXb3JkOAorcGFyc2VDb21wYWN0VmFsdWUgVF9CWVRFID0gVEJ5dGUgLiBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKK3BhcnNlQ29tcGFjdFZhbHVlIFRfSTE2ID0gVEkxNiA8JD4gcGFyc2VWYXJpbnQgemlnWmFnVG9JMTYKK3BhcnNlQ29tcGFjdFZhbHVlIFRfSTMyID0gVEkzMiA8JD4gcGFyc2VWYXJpbnQgemlnWmFnVG9JMzIKK3BhcnNlQ29tcGFjdFZhbHVlIFRfSTY0ID0gVEk2NCA8JD4gcGFyc2VWYXJpbnQgemlnWmFnVG9JNjQKK3BhcnNlQ29tcGFjdFZhbHVlIFRfRE9VQkxFID0gVERvdWJsZSAuIGJzVG9Eb3VibGVMRSA8JD4gUC50YWtlIDgKK3BhcnNlQ29tcGFjdFZhbHVlIFRfU1RSSU5HID0gcGFyc2VDb21wYWN0U3RyaW5nIFRTdHJpbmcKK3BhcnNlQ29tcGFjdFZhbHVlIFRfQklOQVJZID0gcGFyc2VDb21wYWN0U3RyaW5nIFRCaW5hcnkKK3BhcnNlQ29tcGFjdFZhbHVlIHR5ID0gZXJyb3IgJCAiQ2Fubm90IHJlYWQgdmFsdWUgb2YgdHlwZSAiICsrIHNob3cgdHkKKworcGFyc2VDb21wYWN0U3RyaW5nIHR5ID0gZG8KKyAgbGVuIDo6IFdvcmQzMiA8LSBwYXJzZVZhcmludCBpZAorICB0eSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgKGZyb21JbnRlZ3JhbCBsZW4pCisKK3BhcnNlQ29tcGFjdFN0cnVjdCA6OiBUeXBlTWFwIC0+IFBhcnNlciAoTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkpCitwYXJzZUNvbXBhY3RTdHJ1Y3QgdG1hcCA9IE1hcC5mcm9tTGlzdCA8JD4gcGFyc2VGaWVsZHMgMAorICB3aGVyZQorICAgIHBhcnNlRmllbGRzIDo6IEludDE2IC0+IFBhcnNlciBbKEludDE2LCAoTFQuVGV4dCwgVGhyaWZ0VmFsKSldCisgICAgcGFyc2VGaWVsZHMgbGFzdElkID0gZG8KKyAgICAgIHcgPC0gUC5hbnlXb3JkOAorICAgICAgaWYgdyA9PSAweDAwCisgICAgICAgIHRoZW4gcmV0dXJuIFtdCisgICAgICAgIGVsc2UgZG8KKyAgICAgICAgICBsZXQgdHkgPSB0eXBlRnJvbSAodyAuJi4gMHgwRikKKyAgICAgICAgICAgICAgbW9kaWZpZXIgPSAodyAuJi4gMHhGMCkgYHNoaWZ0UmAgNAorICAgICAgICAgIGZpZCA8LSBpZiBtb2RpZmllciAvPSAwCisgICAgICAgICAgICAgICAgIHRoZW4gcmV0dXJuIChsYXN0SWQgKyBmcm9tSW50ZWdyYWwgbW9kaWZpZXIpCisgICAgICAgICAgICAgICAgIGVsc2UgcGFyc2VWYXJpbnQgemlnWmFnVG9JMTYKKyAgICAgICAgICB2YWwgPC0gaWYgdHkgPT0gVF9CT09MCisgICAgICAgICAgICAgICAgIHRoZW4gcmV0dXJuIChUQm9vbCAkICh3IC4mLiAweDBGKSA9PSAweDAxKQorICAgICAgICAgICAgICAgICBlbHNlIGNhc2UgKHR5LCBNYXAubG9va3VwIGZpZCB0bWFwKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgKFRfU1RSSU5HLCBKdXN0IChfLCBUX0JJTkFSWSkpIC0+IHBhcnNlQ29tcGFjdFZhbHVlIFRfQklOQVJZCisgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IHBhcnNlQ29tcGFjdFZhbHVlIHR5CisgICAgICAgICAgKChmaWQsIChMVC5lbXB0eSwgdmFsKSkgOiApIDwkPiBwYXJzZUZpZWxkcyBmaWQKKworcGFyc2VDb21wYWN0TWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPgorICAgICAgICAgICAgICAgICAgIFBhcnNlciBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KK3BhcnNlQ29tcGFjdE1hcCBrdCB2dCBuIHwgbiA8PSAwID0gcmV0dXJuIFtdCisgICAgICAgICAgICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IGRvCisgIGsgPC0gcGFyc2VDb21wYWN0VmFsdWUga3QKKyAgdiA8LSBwYXJzZUNvbXBhY3RWYWx1ZSB2dAorICAoKGssdikgOikgPCQ+IHBhcnNlQ29tcGFjdE1hcCBrdCB2dCAobi0xKQorCitwYXJzZUNvbXBhY3RMaXN0IDo6IFBhcnNlciBbVGhyaWZ0VmFsXQorcGFyc2VDb21wYWN0TGlzdCA9IGRvCisgIHcgPC0gUC5hbnlXb3JkOAorICBsZXQgdHkgPSB0eXBlRnJvbSAkIHcgLiYuIDB4MEYKKyAgICAgIGxzaXplID0gdyBgc2hpZnRSYCA0CisgIHNpemUgPC0gaWYgbHNpemUgPT0gMHhGCisgICAgICAgICAgdGhlbiBwYXJzZVZhcmludCBpZAorICAgICAgICAgIGVsc2UgcmV0dXJuICQgZnJvbUludGVncmFsIGxzaXplCisgIGxvb3AgdHkgc2l6ZQorICB3aGVyZQorICAgIGxvb3AgOjogVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPiBQYXJzZXIgW1RocmlmdFZhbF0KKyAgICBsb29wIHR5IG4gfCBuIDw9IDAgPSByZXR1cm4gW10KKyAgICAgICAgICAgICAgfCBvdGhlcndpc2UgPSBsaWZ0TTIgKDopIChwYXJzZUNvbXBhY3RWYWx1ZSB0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCB0eSAobi0xKSkKKworLS0gU2lnbmVkIG51bWJlcnMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gIlppZyBaYWciIGZvcm1hdCBiZWZvcmUgdGhleSBjYW4gYmUKKy0tIHNlcmlhbGl6ZWQgaW4gdGhlIFZhcmludCBmb3JtYXQKK2kxNlRvWmlnWmFnIDo6IEludDE2IC0+IFdvcmQxNgoraTE2VG9aaWdaYWcgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdExgIDEpIGB4b3JgIChuIGBzaGlmdFJgIDE1KQorCit6aWdaYWdUb0kxNiA6OiBXb3JkMTYgLT4gSW50MTYKK3ppZ1phZ1RvSTE2IG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRSYCAxKSBgeG9yYCBuZWdhdGUgKG4gLiYuIDB4MSkKKworaTMyVG9aaWdaYWcgOjogSW50MzIgLT4gV29yZDMyCitpMzJUb1ppZ1phZyBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0TGAgMSkgYHhvcmAgKG4gYHNoaWZ0UmAgMzEpCisKK3ppZ1phZ1RvSTMyIDo6IFdvcmQzMiAtPiBJbnQzMgoremlnWmFnVG9JMzIgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdFJgIDEpIGB4b3JgIG5lZ2F0ZSAobiAuJi4gMHgxKQorCitpNjRUb1ppZ1phZyA6OiBJbnQ2NCAtPiBXb3JkNjQKK2k2NFRvWmlnWmFnIG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRMYCAxKSBgeG9yYCAobiBgc2hpZnRSYCA2MykKKworemlnWmFnVG9JNjQgOjogV29yZDY0IC0+IEludDY0Cit6aWdaYWdUb0k2NCBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0UmAgMSkgYHhvcmAgbmVnYXRlIChuIC4mLiAweDEpCisKK2J1aWxkVmFyaW50IDo6IChCaXRzIGEsIEludGVncmFsIGEpICA9PiBhIC0+IEJ1aWxkZXIKK2J1aWxkVmFyaW50IG4gfCBuIC4mLiBjb21wbGVtZW50IDB4N0YgPT0gMCA9IEIud29yZDggJCBmcm9tSW50ZWdyYWwgbgorICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IEIud29yZDggKDB4ODAgLnwuIChmcm9tSW50ZWdyYWwgbiAuJi4gMHg3RikpIDw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRWYXJpbnQgKG4gYHNoaWZ0UmAgNykKKworcGFyc2VWYXJpbnQgOjogKEJpdHMgYSwgSW50ZWdyYWwgYSwgT3JkIGEpID0+IChhIC0+IGIpIC0+IFBhcnNlciBiCitwYXJzZVZhcmludCBmcm9tWmlnWmFnID0gZG8KKyAgYnl0ZXN0ZW1wIDwtIEJTLnVucGFjayA8JD4gUC50YWtlVGlsbCAobm90IC4gZmxpcCB0ZXN0Qml0IDcpCisgIGxzYiA8LSBQLmFueVdvcmQ4CisgIGxldCBieXRlcyA9IGxzYiA6IExpc3QucmV2ZXJzZSBieXRlc3RlbXAKKyAgcmV0dXJuICQgZnJvbVppZ1phZyAkIExpc3QuZm9sZGwnIGNvbWJpbmUgMHgwMCBieXRlcworICB3aGVyZSBjb21iaW5lIGEgYiA9IChhIGBzaGlmdExgIDcpIC58LiAoZnJvbUludGVncmFsIGIgLiYuIDB4N2YpCisKKy0tIHwgQ29tcHV0ZSB0aGUgQ29tcGFjdCBUeXBlCitmcm9tVFR5cGUgOjogVGhyaWZ0VHlwZSAtPiBXb3JkOAorZnJvbVRUeXBlIHR5ID0gY2FzZSB0eSBvZgorICBUX1NUT1AgLT4gMHgwMAorICBUX0JPT0wgLT4gMHgwMQorICBUX0JZVEUgLT4gMHgwMworICBUX0kxNiAtPiAweDA0CisgIFRfSTMyIC0+IDB4MDUKKyAgVF9JNjQgLT4gMHgwNgorICBUX0RPVUJMRSAtPiAweDA3CisgIFRfU1RSSU5HIC0+IDB4MDgKKyAgVF9CSU5BUlkgLT4gMHgwOAorICBUX0xJU1R7fSAtPiAweDA5CisgIFRfU0VUe30gLT4gMHgwQQorICBUX01BUHt9IC0+IDB4MEIKKyAgVF9TVFJVQ1R7fSAtPiAweDBDCisgIFRfVk9JRCAtPiBlcnJvciAiTm8gQ29tcGFjdCB0eXBlIGZvciBUX1ZPSUQiCisKK3R5cGVPZiA6OiBUaHJpZnRWYWwgLT4gV29yZDgKK3R5cGVPZiB2ID0gY2FzZSB2IG9mCisgIFRCb29sIFRydWUgLT4gMHgwMQorICBUQm9vbCBGYWxzZSAtPiAweDAyCisgIFRCeXRlIF8gLT4gMHgwMworICBUSTE2IF8gLT4gMHgwNAorICBUSTMyIF8gLT4gMHgwNQorICBUSTY0IF8gLT4gMHgwNgorICBURG91YmxlIF8gLT4gMHgwNworICBUU3RyaW5nIF8gLT4gMHgwOAorICBUQmluYXJ5IF8gLT4gMHgwOAorICBUTGlzdHt9IC0+IDB4MDkKKyAgVFNldHt9IC0+IDB4MEEKKyAgVE1hcHt9IC0+IDB4MEIKKyAgVFN0cnVjdHt9IC0+IDB4MEMKKwordHlwZUZyb20gOjogV29yZDggLT4gVGhyaWZ0VHlwZQordHlwZUZyb20gdyA9IGNhc2UgdyBvZgorICAweDAxIC0+IFRfQk9PTAorICAweDAyIC0+IFRfQk9PTAorICAweDAzIC0+IFRfQllURQorICAweDA0IC0+IFRfSTE2CisgIDB4MDUgLT4gVF9JMzIKKyAgMHgwNiAtPiBUX0k2NAorICAweDA3IC0+IFRfRE9VQkxFCisgIDB4MDggLT4gVF9TVFJJTkcKKyAgMHgwOSAtPiBUX0xJU1QgVF9WT0lECisgIDB4MEEgLT4gVF9TRVQgVF9WT0lECisgIDB4MEIgLT4gVF9NQVAgVF9WT0lEIFRfVk9JRAorICAweDBDIC0+IFRfU1RSVUNUIE1hcC5lbXB0eQorICBuIC0+IGVycm9yICQgInR5cGVGcm9tOiAiICsrIHNob3cgbiArKyAiIGlzIG5vdCBhIGNvbXBhY3QgdHlwZSIKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQyZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzCkBAIC0wLDAgKzEsMTQxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworCittb2R1bGUgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgSGVhZGVyUHJvdG9jb2woLi4pCisgICAgLCBnZXRQcm90b2NvbFR5cGUKKyAgICAsIHNldFByb3RvY29sVHlwZQorICAgICwgZ2V0SGVhZGVycworICAgICwgZ2V0V3JpdGVIZWFkZXJzCisgICAgLCBzZXRIZWFkZXIKKyAgICAsIHNldEhlYWRlcnMKKyAgICAsIGNyZWF0ZUhlYWRlclByb3RvY29sCisgICAgLCBjcmVhdGVIZWFkZXJQcm90b2NvbDEKKyAgICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlcgoraW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCisKK2RhdGEgUHJvdG9jb2xXcmFwID0gZm9yYWxsIGEuIChQcm90b2NvbCBhKSA9PiBQcm90b2NvbFdyYXAoYSkKKworaW5zdGFuY2UgUHJvdG9jb2wgUHJvdG9jb2xXcmFwIHdoZXJlCisgIHJlYWRCeXRlIChQcm90b2NvbFdyYXAgcCkgPSByZWFkQnl0ZSBwCisgIHJlYWRWYWwgKFByb3RvY29sV3JhcCBwKSA9IHJlYWRWYWwgcAorICByZWFkTWVzc2FnZSAoUHJvdG9jb2xXcmFwIHApID0gcmVhZE1lc3NhZ2UgcAorICB3cml0ZVZhbCAoUHJvdG9jb2xXcmFwIHApID0gd3JpdGVWYWwgcAorICB3cml0ZU1lc3NhZ2UgKFByb3RvY29sV3JhcCBwKSA9IHdyaXRlTWVzc2FnZSBwCisKK2RhdGEgSGVhZGVyUHJvdG9jb2wgaSBvID0gKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgeworICAgIHRyYW5zIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8sCisgICAgd3JhcHBlZFByb3RvIDo6IElPUmVmIFByb3RvY29sV3JhcAorICB9CisKK2NyZWF0ZVByb3RvY29sV3JhcCA6OiBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbFR5cGUgLT4gdCAtPiBQcm90b2NvbFdyYXAKK2NyZWF0ZVByb3RvY29sV3JhcCB0eXAgdCA9CisgIGNhc2UgdHlwIG9mCisgICAgVEJpbmFyeSAtPiBQcm90b2NvbFdyYXAgJCBCaW5hcnlQcm90b2NvbCB0CisgICAgVENvbXBhY3QgLT4gUHJvdG9jb2xXcmFwICQgQ29tcGFjdFByb3RvY29sIHQKKyAgICBUSlNPTiAtPiBQcm90b2NvbFdyYXAgJCBKU09OUHJvdG9jb2wgdAorCitjcmVhdGVIZWFkZXJQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBpIC0+IG8gLT4gSU8oSGVhZGVyUHJvdG9jb2wgaSBvKQorY3JlYXRlSGVhZGVyUHJvdG9jb2wgaSBvID0gZG8KKyAgdCA8LSBvcGVuSGVhZGVyVHJhbnNwb3J0IGkgbworICBwaWQgPC0gcmVhZElPUmVmICQgcHJvdG9jb2xUeXBlIHQKKyAgcHJvdG8gPC0gbmV3SU9SZWYgJCBjcmVhdGVQcm90b2NvbFdyYXAgcGlkIHQKKyAgcmV0dXJuICQgSGVhZGVyUHJvdG9jb2wgeyB0cmFucyA9IHQsIHdyYXBwZWRQcm90byA9IHByb3RvIH0KKworY3JlYXRlSGVhZGVyUHJvdG9jb2wxIDo6IFRyYW5zcG9ydCB0ID0+IHQgLT4gSU8oSGVhZGVyUHJvdG9jb2wgdCB0KQorY3JlYXRlSGVhZGVyUHJvdG9jb2wxIHQgPSBjcmVhdGVIZWFkZXJQcm90b2NvbCB0IHQKKworcmVzZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gKCkKK3Jlc2V0UHJvdG9jb2wgcCA9IGRvCisgIHBpZCA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisgIHdyaXRlSU9SZWYgKHdyYXBwZWRQcm90byBwKSAkIGNyZWF0ZVByb3RvY29sV3JhcCBwaWQgJCB0cmFucyBwCisKK2dldFdyYXBwZWQgPSByZWFkSU9SZWYgLiB3cmFwcGVkUHJvdG8KKworc2V0VHJhbnNwb3J0IDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0VHJhbnNwb3J0IHAgdCA9IHAgeyB0cmFucyA9IHQgfQorCit1cGRhdGVUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IChIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclRyYW5zcG9ydCBpIG8pLT4gSGVhZGVyUHJvdG9jb2wgaSBvCit1cGRhdGVUcmFuc3BvcnQgcCBmID0gc2V0VHJhbnNwb3J0IHAgKGYgJCB0cmFucyBwKQorCit0eXBlIEhlYWRlcnMgPSBNYXAuTWFwIFN0cmluZyBTdHJpbmcKKworLS0gVE9ETzogd2Ugd2FudCB0byBzZXQgaGVhZGVycyB3aXRob3V0IHJlY3JlYXRpbmcgY2xpZW50Li4uCitzZXRIZWFkZXIgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFN0cmluZyAtPiBTdHJpbmcgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRIZWFkZXIgcCBrIHYgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZUhlYWRlcnMgPSBNYXAuaW5zZXJ0IGsgdiAkIHdyaXRlSGVhZGVycyB0IH0KKworc2V0SGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSGVhZGVycyAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldEhlYWRlcnMgcCBoID0gdXBkYXRlVHJhbnNwb3J0IHAgJCBcdCAtPiB0IHsgd3JpdGVIZWFkZXJzID0gaCB9CisKKy0tIFRPRE86IG1ha2UgaXQgcHVibGljIG9uY2Ugd2UgaGF2ZSBmaXJzdCB0cmFuc2Zvcm0gaW1wbGVtZW50YXRpb24gZm9yIEhhc2tlbGwKK3NldFRyYW5zZm9ybXMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFtUcmFuc2Zvcm1UeXBlXSAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldFRyYW5zZm9ybXMgcCB0cnMgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZVRyYW5zZm9ybXMgPSB0cnMgfQorCitzZXRUcmFuc2Zvcm0gOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFRyYW5zZm9ybVR5cGUgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRUcmFuc2Zvcm0gcCB0ciA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlVHJhbnNmb3JtcyA9IHRyOih3cml0ZVRyYW5zZm9ybXMgdCkgfQorCitnZXRXcml0ZUhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IEhlYWRlcnMKK2dldFdyaXRlSGVhZGVycyA9IHdyaXRlSGVhZGVycyAuIHRyYW5zCisKK2dldEhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFsoU3RyaW5nLCBTdHJpbmcpXQorZ2V0SGVhZGVycyA9IHJlYWRJT1JlZiAuIGhlYWRlcnMgLiB0cmFucworCitnZXRQcm90b2NvbFR5cGUgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFByb3RvY29sVHlwZQorZ2V0UHJvdG9jb2xUeXBlIHAgPSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisKK3NldFByb3RvY29sVHlwZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gUHJvdG9jb2xUeXBlIC0+IElPICgpCitzZXRQcm90b2NvbFR5cGUgcCB0eXAgPSBkbworICB0eXAwIDwtIGdldFByb3RvY29sVHlwZSBwCisgIGlmIHR5cCA9PSB0eXAwCisgICAgdGhlbiByZXR1cm4gKCkKKyAgICBlbHNlIGRvCisgICAgICB0U2V0UHJvdG9jb2wgKHRyYW5zIHApIHR5cAorICAgICAgcmVzZXRQcm90b2NvbCBwCisKK2luc3RhbmNlIChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IFByb3RvY29sIChIZWFkZXJQcm90b2NvbCBpIG8pIHdoZXJlCisgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAodHJhbnMgcCkgMQorCisgIHJlYWRWYWwgcCB0cCA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZFZhbCBwcm90byB0cAorCisgIHJlYWRNZXNzYWdlIHAgZiA9IGRvCisgICAgdFJlc2V0UHJvdG9jb2wgKHRyYW5zIHApCisgICAgcmVzZXRQcm90b2NvbCBwCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZE1lc3NhZ2UgcHJvdG8gZgorCisgIHdyaXRlVmFsIHAgdiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVWYWwgcHJvdG8gdgorCisgIHdyaXRlTWVzc2FnZSBwIHggZiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVNZXNzYWdlIHByb3RvIHggZgorCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzllZGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocwpAQCAtMCwwICsxLDM2MiBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3stIyBMQU5HVUFHRSBDUFAgIy19Cit7LSMgTEFOR1VBR0UgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KK3stIyBMQU5HVUFHRSBTY29wZWRUeXBlVmFyaWFibGVzICMtfQorey0jIExBTkdVQUdFIFR1cGxlU2VjdGlvbnMgIy19CisKK21vZHVsZSBUaHJpZnQuUHJvdG9jb2wuSlNPTgorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgSlNPTlByb3RvY29sKC4uKQorICAgICkgd2hlcmUKKworaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoYnJhY2tldCkKK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAoraW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkNoYXI4IGFzIFBDCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAoraW1wb3J0IERhdGEuQnl0ZVN0cmluZy5CYXNlNjQuTGF6eSBhcyBCNjRDCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlciBhcyBCCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkludGVybmFsIChjMncsIHcyYykKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuTGlzdAoraW1wb3J0IERhdGEuTWF5YmUgKGNhdE1heWJlcykKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nCitpbXBvcnQgRGF0YS5Xb3JkCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlR5cGVzCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIExCU0MKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFQKKworLS0gfCBUaGUgSlNPTiBQcm90b2NvbCBkYXRhIHVzZXMgdGhlIHN0YW5kYXJkICdUSlNPTlByb3RvY29sJy4gIERhdGEgaXMKKy0tIGVuY29kZWQgYXMgYSBKU09OICdCeXRlU3RyaW5nJworZGF0YSBKU09OUHJvdG9jb2wgdCA9IEpTT05Qcm90b2NvbCB0CisgICAgICAgICAgICAgICAgICAgICAgLS0gXiBDb25zdHJ1Y3QgYSAnSlNPTlByb3RvY29sJyB3aXRoIGEgJ1RyYW5zcG9ydCcKK2dldFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiBKU09OUHJvdG9jb2wgdCAtPiB0CitnZXRUcmFuc3BvcnQgKEpTT05Qcm90b2NvbCB0KSA9IHQKKworaW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gUHJvdG9jb2wgKEpTT05Qcm90b2NvbCB0KSB3aGVyZQorICAgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDEKKworICAgIHdyaXRlTWVzc2FnZSAoSlNPTlByb3RvY29sIHQpIChzLCB0eSwgc3EpID0gYnJhY2tldCByZWFkTWVzc2FnZUJlZ2luIHJlYWRNZXNzYWdlRW5kIC4gY29uc3QKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWRNZXNzYWdlQmVnaW4gPSB0V3JpdGUgdCAkIHRvTGF6eUJ5dGVTdHJpbmcgJAorICAgICAgICAgIEIuY2hhcjggJ1snIDw+IGJ1aWxkU2hvd2FibGUgKDEgOjogSW50MzIpIDw+CisgICAgICAgICAgQi5zdHJpbmc4ICIsXCIiIDw+IGVzY2FwZSAoZW5jb2RlVXRmOCBzKSA8PiBCLmNoYXI4ICdcIicgPD4KKyAgICAgICAgICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIChmcm9tRW51bSB0eSkgPD4KKyAgICAgICAgICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIHNxIDw+CisgICAgICAgICAgQi5jaGFyOCAnLCcKKyAgICAgICAgcmVhZE1lc3NhZ2VFbmQgXyA9IGRvCisgICAgICAgICAgdFdyaXRlIHQgIl0iCisgICAgICAgICAgdEZsdXNoIHQKKworICAgIHJlYWRNZXNzYWdlIHAgPSBicmFja2V0IHJlYWRNZXNzYWdlQmVnaW4gcmVhZE1lc3NhZ2VFbmQKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWRNZXNzYWdlQmVnaW4gPSBydW5QYXJzZXIgcCAkIHNraXBTcGFjZSAqPiBkbworICAgICAgICAgIF92ZXIgOjogSW50MzIgPC0gbGV4ZW1lIChQQy5jaGFyOCAnWycpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpCisgICAgICAgICAgYnMgPC0gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSBlc2NhcGVkU3RyaW5nCisgICAgICAgICAgY2FzZSBkZWNvZGVVdGY4JyBicyBvZgorICAgICAgICAgICAgTGVmdCBfIC0+IGZhaWwgInJlYWRNZXNzYWdlOiBpbnZhbGlkIHRleHQgZW5jb2RpbmciCisgICAgICAgICAgICBSaWdodCBzdHIgLT4gZG8KKyAgICAgICAgICAgICAgdHkgPC0gdG9FbnVtIDwkPiAobGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpKQorICAgICAgICAgICAgICBzZXFOdW0gPC0gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpCisgICAgICAgICAgICAgIF8gPC0gUEMuY2hhcjggJywnCisgICAgICAgICAgICAgIHJldHVybiAoc3RyLCB0eSwgc2VxTnVtKQorICAgICAgICByZWFkTWVzc2FnZUVuZCBfID0gdm9pZCAkIHJ1blBhcnNlciBwIChQQy5jaGFyOCAnXScpCisKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRKU09OVmFsdWUKKyAgICByZWFkVmFsIHAgdHkgPSBydW5QYXJzZXIgcCAkIHNraXBTcGFjZSAqPiBwYXJzZUpTT05WYWx1ZSB0eQorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBTdGF0ZWxlc3NQcm90b2NvbCAoSlNPTlByb3RvY29sIHQpIHdoZXJlCisgICAgc2VyaWFsaXplVmFsIF8gPSB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRKU09OVmFsdWUKKyAgICBkZXNlcmlhbGl6ZVZhbCBfIHR5IGJzID0KKyAgICAgIGNhc2UgTFAuZWl0aGVyUmVzdWx0ICQgTFAucGFyc2UgKHBhcnNlSlNPTlZhbHVlIHR5KSBicyBvZgorICAgICAgICBMZWZ0IHMgLT4gZXJyb3IgcworICAgICAgICBSaWdodCB2YWwgLT4gdmFsCisKKy0tIFdyaXRpbmcgRnVuY3Rpb25zCisKK2J1aWxkSlNPTlZhbHVlIDo6IFRocmlmdFZhbCAtPiBCdWlsZGVyCitidWlsZEpTT05WYWx1ZSAoVFN0cnVjdCBmaWVsZHMpID0gQi5jaGFyOCAneycgPD4gYnVpbGRKU09OU3RydWN0IGZpZWxkcyA8PiBCLmNoYXI4ICd9JworYnVpbGRKU09OVmFsdWUgKFRNYXAga3QgdnQgZW50cmllcykgPQorICBCLmNoYXI4ICdbJyA8PiBCLmNoYXI4ICciJyA8PiBnZXRUeXBlTmFtZSBrdCA8PiBCLmNoYXI4ICciJyA8PgorICBCLmNoYXI4ICcsJyA8PiBCLmNoYXI4ICciJyA8PiBnZXRUeXBlTmFtZSB2dCA8PiBCLmNoYXI4ICciJyA8PgorICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIChsZW5ndGggZW50cmllcykgPD4KKyAgQi5jaGFyOCAnLCcgPD4gQi5jaGFyOCAneycgPD4gYnVpbGRKU09OTWFwIGVudHJpZXMgPD4gQi5jaGFyOCAnfScgPD4KKyAgQi5jaGFyOCAnXScKK2J1aWxkSlNPTlZhbHVlIChUTGlzdCB0eSBlbnRyaWVzKSA9CisgIEIuY2hhcjggJ1snIDw+IEIuY2hhcjggJyInIDw+IGdldFR5cGVOYW1lIHR5IDw+IEIuY2hhcjggJyInIDw+CisgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGxlbmd0aCBlbnRyaWVzKSA8PgorICAoaWYgbGVuZ3RoIGVudHJpZXMgPiAwCisgICB0aGVuIEIuY2hhcjggJywnIDw+IGJ1aWxkSlNPTkxpc3QgZW50cmllcworICAgZWxzZSBtZW1wdHkpIDw+CisgIEIuY2hhcjggJ10nCitidWlsZEpTT05WYWx1ZSAoVFNldCB0eSBlbnRyaWVzKSA9IGJ1aWxkSlNPTlZhbHVlIChUTGlzdCB0eSBlbnRyaWVzKQorYnVpbGRKU09OVmFsdWUgKFRCb29sIGIpID0gaWYgYiB0aGVuIEIuY2hhcjggJzEnIGVsc2UgQi5jaGFyOCAnMCcKK2J1aWxkSlNPTlZhbHVlIChUQnl0ZSBiKSA9IGJ1aWxkU2hvd2FibGUgYgorYnVpbGRKU09OVmFsdWUgKFRJMTYgaSkgPSBidWlsZFNob3dhYmxlIGkKK2J1aWxkSlNPTlZhbHVlIChUSTMyIGkpID0gYnVpbGRTaG93YWJsZSBpCitidWlsZEpTT05WYWx1ZSAoVEk2NCBpKSA9IGJ1aWxkU2hvd2FibGUgaQorYnVpbGRKU09OVmFsdWUgKFREb3VibGUgZCkgPSBidWlsZFNob3dhYmxlIGQKK2J1aWxkSlNPTlZhbHVlIChUU3RyaW5nIHMpID0gQi5jaGFyOCAnXCInIDw+IGVzY2FwZSBzIDw+IEIuY2hhcjggJ1wiJworYnVpbGRKU09OVmFsdWUgKFRCaW5hcnkgcykgPSBCLmNoYXI4ICdcIicgPD4gKEIubGF6eUJ5dGVTdHJpbmcgLiBCNjRDLmVuY29kZSAkIHMpIDw+IEIuY2hhcjggJ1wiJworCitidWlsZEpTT05TdHJ1Y3QgOjogTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkgLT4gQnVpbGRlcgorYnVpbGRKU09OU3RydWN0ID0gbWNvbmNhdCAuIGludGVyc3BlcnNlIChCLmNoYXI4ICcsJykgLiBNYXAuZm9sZHJXaXRoS2V5IGJ1aWxkRmllbGQgW10KKyAgd2hlcmUgCisgICAgYnVpbGRGaWVsZCBmaWQgKF8sdmFsKSA9ICg6KSAkCisgICAgICBCLmNoYXI4ICciJyA8PiBidWlsZFNob3dhYmxlIGZpZCA8PiBCLnN0cmluZzggIlwiOiIgPD4gCisgICAgICBCLmNoYXI4ICd7JyA8PgorICAgICAgQi5jaGFyOCAnIicgPD4gZ2V0VHlwZU5hbWUgKGdldFR5cGVPZiB2YWwpIDw+IEIuc3RyaW5nOCAiXCI6IiA8PgorICAgICAgYnVpbGRKU09OVmFsdWUgdmFsIDw+CisgICAgICBCLmNoYXI4ICd9JworCitidWlsZEpTT05NYXAgOjogWyhUaHJpZnRWYWwsIFRocmlmdFZhbCldIC0+IEJ1aWxkZXIKK2J1aWxkSlNPTk1hcCA9IG1jb25jYXQgLiBpbnRlcnNwZXJzZSAoQi5jaGFyOCAnLCcpIC4gbWFwIGJ1aWxkS1YKKyAgd2hlcmUKKyAgICBidWlsZEtWIChrZXlAKFRTdHJpbmcgXyksIHZhbCkgPQorICAgICAgYnVpbGRKU09OVmFsdWUga2V5IDw+IEIuY2hhcjggJzonIDw+IGJ1aWxkSlNPTlZhbHVlIHZhbAorICAgIGJ1aWxkS1YgKGtleSwgdmFsKSA9CisgICAgICBCLmNoYXI4ICdcIicgPD4gYnVpbGRKU09OVmFsdWUga2V5IDw+IEIuc3RyaW5nOCAiXCI6IiA8PiBidWlsZEpTT05WYWx1ZSB2YWwKK2J1aWxkSlNPTkxpc3QgOjogW1RocmlmdFZhbF0gLT4gQnVpbGRlcgorYnVpbGRKU09OTGlzdCA9IG1jb25jYXQgLiBpbnRlcnNwZXJzZSAoQi5jaGFyOCAnLCcpIC4gbWFwIGJ1aWxkSlNPTlZhbHVlCisKK2J1aWxkU2hvd2FibGUgOjogU2hvdyBhID0+IGEgLT4gIEJ1aWxkZXIKK2J1aWxkU2hvd2FibGUgPSBCLnN0cmluZzggLiBzaG93CisKKy0tIFJlYWRpbmcgRnVuY3Rpb25zCisKK3BhcnNlSlNPTlZhbHVlIDo6IFRocmlmdFR5cGUgLT4gUGFyc2VyIFRocmlmdFZhbAorcGFyc2VKU09OVmFsdWUgKFRfU1RSVUNUIHRtYXApID0KKyAgVFN0cnVjdCA8JD4gKGxleGVtZSAoUEMuY2hhcjggJ3snKSAqPiBwYXJzZUpTT05TdHJ1Y3QgdG1hcCA8KiBQQy5jaGFyOCAnfScpCitwYXJzZUpTT05WYWx1ZSAoVF9NQVAga3QgdnQpID0gZm1hcCAoVE1hcCBrdCB2dCkgJAorICBiZXR3ZWVuICdbJyAnXScgJAorICAgIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPgorICAgIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPgorICAgIGxleGVtZSBkZWNpbWFsICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPgorICAgIGJldHdlZW4gJ3snICd9JyAocGFyc2VKU09OTWFwIGt0IHZ0KQorcGFyc2VKU09OVmFsdWUgKFRfTElTVCB0eSkgPSBmbWFwIChUTGlzdCB0eSkgJAorICBiZXR3ZWVuICdbJyAnXScgJCBkbworICAgIGxlbiA8LSBsZXhlbWUgZXNjYXBlZFN0cmluZyAqPiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGRlY2ltYWwKKyAgICBpZiBsZW4gPiAwCisgICAgICB0aGVuIGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBwYXJzZUpTT05MaXN0IHR5CisgICAgICBlbHNlIHJldHVybiBbXQorcGFyc2VKU09OVmFsdWUgKFRfU0VUIHR5KSA9IGZtYXAgKFRTZXQgdHkpICQKKyAgYmV0d2VlbiAnWycgJ10nICQgZG8KKyAgICBsZW4gPC0gbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSBkZWNpbWFsCisgICAgaWYgbGVuID4gMAorICAgICAgdGhlbiAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IHBhcnNlSlNPTkxpc3QgdHkKKyAgICAgIGVsc2UgcmV0dXJuIFtdCitwYXJzZUpTT05WYWx1ZSBUX0JPT0wgPQorICAoVEJvb2wgVHJ1ZSA8JCBQQy5jaGFyOCAnMScpIDx8PiAoVEJvb2wgRmFsc2UgPCQgUEMuY2hhcjggJzAnKQorcGFyc2VKU09OVmFsdWUgVF9CWVRFID0gVEJ5dGUgPCQ+IHNpZ25lZCBkZWNpbWFsCitwYXJzZUpTT05WYWx1ZSBUX0kxNiA9IFRJMTYgPCQ+IHNpZ25lZCBkZWNpbWFsCitwYXJzZUpTT05WYWx1ZSBUX0kzMiA9IFRJMzIgPCQ+IHNpZ25lZCBkZWNpbWFsCitwYXJzZUpTT05WYWx1ZSBUX0k2NCA9IFRJNjQgPCQ+IHNpZ25lZCBkZWNpbWFsCitwYXJzZUpTT05WYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgPCQ+IGRvdWJsZQorcGFyc2VKU09OVmFsdWUgVF9TVFJJTkcgPSBUU3RyaW5nIDwkPiBlc2NhcGVkU3RyaW5nCitwYXJzZUpTT05WYWx1ZSBUX0JJTkFSWSA9IFRCaW5hcnkgPCQ+IGJhc2U2NFN0cmluZworcGFyc2VKU09OVmFsdWUgVF9TVE9QID0gZmFpbCAicGFyc2VKU09OVmFsdWU6IGNhbm5vdCBwYXJzZSB0eXBlIFRfU1RPUCIKK3BhcnNlSlNPTlZhbHVlIFRfVk9JRCA9IGZhaWwgInBhcnNlSlNPTlZhbHVlOiBjYW5ub3QgcGFyc2UgdHlwZSBUX1ZPSUQiCisKK3BhcnNlQW55VmFsdWUgOjogUGFyc2VyICgpCitwYXJzZUFueVZhbHVlID0gY2hvaWNlICQKKyAgICAgICAgICAgICAgICBza2lwQmV0d2VlbiAneycgJ30nIDoKKyAgICAgICAgICAgICAgICBza2lwQmV0d2VlbiAnWycgJ10nIDoKKyAgICAgICAgICAgICAgICBtYXAgKHZvaWQgLiBwYXJzZUpTT05WYWx1ZSkKKyAgICAgICAgICAgICAgICAgIFsgVF9CT09MCisgICAgICAgICAgICAgICAgICAsIFRfSTE2CisgICAgICAgICAgICAgICAgICAsIFRfSTMyCisgICAgICAgICAgICAgICAgICAsIFRfSTY0CisgICAgICAgICAgICAgICAgICAsIFRfRE9VQkxFCisgICAgICAgICAgICAgICAgICAsIFRfU1RSSU5HCisgICAgICAgICAgICAgICAgICAsIFRfQklOQVJZCisgICAgICAgICAgICAgICAgICBdCisgIHdoZXJlCisgICAgc2tpcEJldHdlZW4gOjogQ2hhciAtPiBDaGFyIC0+IFBhcnNlciAoKQorICAgIHNraXBCZXR3ZWVuIGEgYiA9IGJldHdlZW4gYSBiICQgdm9pZCAoUEMuc2F0aXNmeSAoXGMgLT4gYyAvPSBhICYmIGMgLz0gYikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8fD4gc2tpcEJldHdlZW4gYSBiCisKK3BhcnNlSlNPTlN0cnVjdCA6OiBUeXBlTWFwIC0+IFBhcnNlciAoTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkpCitwYXJzZUpTT05TdHJ1Y3QgdG1hcCA9IE1hcC5mcm9tTGlzdCAuIGNhdE1heWJlcyA8JD4gcGFyc2VGaWVsZAorICAgICAgICAgICAgICAgICAgICAgICBgc2VwQnlgIGxleGVtZSAoUEMuY2hhcjggJywnKQorICB3aGVyZQorICAgIHBhcnNlRmllbGQgPSBkbworICAgICAgZmlkIDwtIGxleGVtZSAoYmV0d2VlbiAnIicgJyInIGRlY2ltYWwpIDwqIGxleGVtZSAoUEMuY2hhcjggJzonKQorICAgICAgY2FzZSBNYXAubG9va3VwIGZpZCB0bWFwIG9mCisgICAgICAgIEp1c3QgKHN0ciwgZnR5cGUpIC0+IGJldHdlZW4gJ3snICd9JyAkIGRvCisgICAgICAgICAgXyA8LSBsZXhlbWUgKGVzY2FwZWRTdHJpbmcpICo+IGxleGVtZSAoUEMuY2hhcjggJzonKQorICAgICAgICAgIHZhbCA8LSBsZXhlbWUgKHBhcnNlSlNPTlZhbHVlIGZ0eXBlKQorICAgICAgICAgIHJldHVybiAkIEp1c3QgKGZpZCwgKHN0ciwgdmFsKSkKKyAgICAgICAgTm90aGluZyAtPiBsZXhlbWUgcGFyc2VBbnlWYWx1ZSAqPiByZXR1cm4gTm90aGluZworCitwYXJzZUpTT05NYXAgOjogVGhyaWZ0VHlwZSAtPiBUaHJpZnRUeXBlIC0+IFBhcnNlciBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KK3BhcnNlSlNPTk1hcCBrdCB2dCA9CisgICgoLCkgPCQ+IGxleGVtZSAocGFyc2VKU09OS2V5IGt0KSA8Kj4KKyAgIChsZXhlbWUgKFBDLmNoYXI4ICc6JykgKj4gbGV4ZW1lIChwYXJzZUpTT05WYWx1ZSB2dCkpKSBgc2VwQnlgCisgIGxleGVtZSAoUEMuY2hhcjggJywnKQorICB3aGVyZQorICAgIHBhcnNlSlNPTktleSBUX1NUUklORyA9IHBhcnNlSlNPTlZhbHVlIFRfU1RSSU5HCisgICAgcGFyc2VKU09OS2V5IFRfQklOQVJZID0gcGFyc2VKU09OVmFsdWUgVF9CSU5BUlkKKyAgICBwYXJzZUpTT05LZXkga3QgPSBQQy5jaGFyOCAnIicgKj4gcGFyc2VKU09OVmFsdWUga3QgPCogUEMuY2hhcjggJyInCisKK3BhcnNlSlNPTkxpc3QgOjogVGhyaWZ0VHlwZSAtPiBQYXJzZXIgW1RocmlmdFZhbF0KK3BhcnNlSlNPTkxpc3QgdHkgPSBsZXhlbWUgKHBhcnNlSlNPTlZhbHVlIHR5KSBgc2VwQnlgIGxleGVtZSAoUEMuY2hhcjggJywnKQorCitlc2NhcGVkU3RyaW5nIDo6IFBhcnNlciBMQlMuQnl0ZVN0cmluZworZXNjYXBlZFN0cmluZyA9IFBDLmNoYXI4ICciJyAqPgorICAgICAgICAgICAgICAgIChMQlMucGFjayA8JD4gUC5tYW55JyAoZXNjYXBlZENoYXIgPHw+IG5vdENoYXI4ICciJykpIDwqCisgICAgICAgICAgICAgICAgUEMuY2hhcjggJyInCisKK2Jhc2U2NFN0cmluZyA6OiBQYXJzZXIgTEJTLkJ5dGVTdHJpbmcKK2Jhc2U2NFN0cmluZyA9IFBDLmNoYXI4ICciJyAqPgorICAgICAgICAgICAgICAgKGRlY29kZUJhc2U2NCAuIExCU0MucGFjayA8JD4gUC5tYW55JyAoUEMubm90Q2hhciAnIicpKSA8KgorICAgICAgICAgICAgICAgUEMuY2hhcjggJyInCisgICAgICAgICAgICAgICB3aGVyZQorICAgICAgICAgICAgICAgICBkZWNvZGVCYXNlNjQgYiA9CisgICAgICAgICAgICAgICAgICAgbGV0IHBhZGRlZCA9IGNhc2UgKExCUy5sZW5ndGggYikgYG1vZGAgNCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgLT4gTEJTLmFwcGVuZCBiICI9PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0+IExCUy5hcHBlbmQgYiAiPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IGIgaW4KKyAgICAgICAgICAgICAgICAgICBjYXNlIEI2NEMuZGVjb2RlIHBhZGRlZCBvZgorICAgICAgICAgICAgICAgICAgICAgUmlnaHQgcyAtPiBzCisgICAgICAgICAgICAgICAgICAgICBMZWZ0IHggLT4gZXJyb3IgeAorCitlc2NhcGVkQ2hhciA6OiBQYXJzZXIgV29yZDgKK2VzY2FwZWRDaGFyID0gUEMuY2hhcjggJ1xcJyAqPiAoYzJ3IDwkPiBjaG9pY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAnXFNPSCcgPCQgUC5zdHJpbmcgInUwMDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcU1RYJyA8JCBQLnN0cmluZyAidTAwMDIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFVFgnIDwkIFAuc3RyaW5nICJ1MDAwMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVPVCcgPCQgUC5zdHJpbmcgInUwMDA0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRU5RJyA8JCBQLnN0cmluZyAidTAwMDUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xBQ0snIDwkIFAuc3RyaW5nICJ1MDAwNiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEJFTCcgPCQgUC5zdHJpbmcgInUwMDA3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQlMnICA8JCBQLnN0cmluZyAidTAwMDgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xWVCcgIDwkIFAuc3RyaW5nICJ1MDAwYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEZGJyAgPCQgUC5zdHJpbmcgInUwMDBjIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQ1InICA8JCBQLnN0cmluZyAidTAwMGQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTTycgIDwkIFAuc3RyaW5nICJ1MDAwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFNJJyAgPCQgUC5zdHJpbmcgInUwMDBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRExFJyA8JCBQLnN0cmluZyAidTAwMTAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xEQzEnIDwkIFAuc3RyaW5nICJ1MDAxMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERDMicgPCQgUC5zdHJpbmcgInUwMDEyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcREMzJyA8JCBQLnN0cmluZyAidTAwMTMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xEQzQnIDwkIFAuc3RyaW5nICJ1MDAxNCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXE5BSycgPCQgUC5zdHJpbmcgInUwMDE1IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcU1lOJyA8JCBQLnN0cmluZyAidTAwMTYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFVEInIDwkIFAuc3RyaW5nICJ1MDAxNyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXENBTicgPCQgUC5zdHJpbmcgInUwMDE4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRU0nICA8JCBQLnN0cmluZyAidTAwMTkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTVUInIDwkIFAuc3RyaW5nICJ1MDAxYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVTQycgPCQgUC5zdHJpbmcgInUwMDFiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRlMnICA8JCBQLnN0cmluZyAidTAwMWMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xHUycgIDwkIFAuc3RyaW5nICJ1MDAxZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFJTJyAgPCQgUC5zdHJpbmcgInUwMDFlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcVVMnICA8JCBQLnN0cmluZyAidTAwMWYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xERUwnIDwkIFAuc3RyaW5nICJ1MDA3ZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXDAnIDwkIFBDLmNoYXIgJzAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xhJyA8JCBQQy5jaGFyICdhJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcYicgPCQgUEMuY2hhciAnYicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXGYnIDwkIFBDLmNoYXIgJ2YnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xuJyA8JCBQQy5jaGFyICduJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdccicgPCQgUEMuY2hhciAncicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXHQnIDwkIFBDLmNoYXIgJ3QnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1x2JyA8JCBQQy5jaGFyICd2JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcIicgPCQgUEMuY2hhciAnIicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXCcnIDwkIFBDLmNoYXIgJ1wnJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcXCcgPCQgUEMuY2hhciAnXFwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJy8nICA8JCBQQy5jaGFyICcvJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCitlc2NhcGUgOjogTEJTLkJ5dGVTdHJpbmcgLT4gQnVpbGRlcgorZXNjYXBlID0gTEJTLmZvbGRsJyBlc2NhcGVDaGFyIG1lbXB0eQorICB3aGVyZQorICAgIGVzY2FwZUNoYXIgYiB3ID0gYiA8PiAoQi5sYXp5Qnl0ZVN0cmluZyAkIGNhc2UgdzJjIHcgb2YKKyAgICAgICdcMCcgLT4gIlxcMCIKKyAgICAgICdcYicgLT4gIlxcYiIKKyAgICAgICdcZicgLT4gIlxcZiIKKyAgICAgICdcbicgLT4gIlxcbiIKKyAgICAgICdccicgLT4gIlxcciIKKyAgICAgICdcdCcgLT4gIlxcdCIKKyAgICAgICdcIicgLT4gIlxcXCIiCisgICAgICAnXFwnIC0+ICJcXFxcIgorICAgICAgJ1xTT0gnIC0+ICJcXHUwMDAxIgorICAgICAgJ1xTVFgnIC0+ICJcXHUwMDAyIgorICAgICAgJ1xFVFgnIC0+ICJcXHUwMDAzIgorICAgICAgJ1xFT1QnIC0+ICJcXHUwMDA0IgorICAgICAgJ1xFTlEnIC0+ICJcXHUwMDA1IgorICAgICAgJ1xBQ0snIC0+ICJcXHUwMDA2IgorICAgICAgJ1xCRUwnIC0+ICJcXHUwMDA3IgorICAgICAgJ1xWVCcgIC0+ICJcXHUwMDBiIgorICAgICAgJ1xTTycgIC0+ICJcXHUwMDBlIgorICAgICAgJ1xTSScgIC0+ICJcXHUwMDBmIgorICAgICAgJ1xETEUnIC0+ICJcXHUwMDEwIgorICAgICAgJ1xEQzEnIC0+ICJcXHUwMDExIgorICAgICAgJ1xEQzInIC0+ICJcXHUwMDEyIgorICAgICAgJ1xEQzMnIC0+ICJcXHUwMDEzIgorICAgICAgJ1xEQzQnIC0+ICJcXHUwMDE0IgorICAgICAgJ1xOQUsnIC0+ICJcXHUwMDE1IgorICAgICAgJ1xTWU4nIC0+ICJcXHUwMDE2IgorICAgICAgJ1xFVEInIC0+ICJcXHUwMDE3IgorICAgICAgJ1xDQU4nIC0+ICJcXHUwMDE4IgorICAgICAgJ1xFTScgIC0+ICJcXHUwMDE5IgorICAgICAgJ1xTVUInIC0+ICJcXHUwMDFhIgorICAgICAgJ1xFU0MnIC0+ICJcXHUwMDFiIgorICAgICAgJ1xGUycgIC0+ICJcXHUwMDFjIgorICAgICAgJ1xHUycgIC0+ICJcXHUwMDFkIgorICAgICAgJ1xSUycgIC0+ICJcXHUwMDFlIgorICAgICAgJ1xVUycgIC0+ICJcXHUwMDFmIgorICAgICAgJ1xERUwnIC0+ICJcXHUwMDdmIgorICAgICAgXyAtPiBMQlMuc2luZ2xldG9uIHcpCisKK2xleGVtZSA6OiBQYXJzZXIgYSAtPiBQYXJzZXIgYQorbGV4ZW1lID0gKDwqIHNraXBTcGFjZSkKKworbm90Q2hhcjggOjogQ2hhciAtPiBQYXJzZXIgV29yZDgKK25vdENoYXI4IGMgPSBQLnNhdGlzZnkgKC89IGMydyBjKQorCitiZXR3ZWVuIDo6IENoYXIgLT4gQ2hhciAtPiBQYXJzZXIgYSAtPiBQYXJzZXIgYQorYmV0d2VlbiBhIGIgcCA9IGxleGVtZSAoUEMuY2hhcjggYSkgKj4gbGV4ZW1lIHAgPCogbGV4ZW1lIChQQy5jaGFyOCBiKQorCitnZXRUeXBlTmFtZSA6OiBUaHJpZnRUeXBlIC0+IEJ1aWxkZXIKK2dldFR5cGVOYW1lIHR5ID0gQi5zdHJpbmc4ICQgY2FzZSB0eSBvZgorICBUX1NUUlVDVCBfIC0+ICJyZWMiCisgIFRfTUFQIF8gXyAgLT4gIm1hcCIKKyAgVF9MSVNUIF8gICAtPiAibHN0IgorICBUX1NFVCBfICAgIC0+ICJzZXQiCisgIFRfQk9PTCAgICAgLT4gInRmIgorICBUX0JZVEUgICAgIC0+ICJpOCIKKyAgVF9JMTYgICAgICAtPiAiaTE2IgorICBUX0kzMiAgICAgIC0+ICJpMzIiCisgIFRfSTY0ICAgICAgLT4gImk2NCIKKyAgVF9ET1VCTEUgICAtPiAiZGJsIgorICBUX1NUUklORyAgIC0+ICJzdHIiCisgIFRfQklOQVJZICAgLT4gInN0ciIKKyAgXyAtPiBlcnJvciAiVW5yZWNvZ25pemVkIFR5cGUiCisKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocwppbmRleCA3NzA5NjVmLi41NDNmMzM4IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzCkBAIC0xLDMgKzEsNCBAQAorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19CiAtLQogLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTMxLDM1ICszMiwzNSBAQAogaW1wb3J0IFN5c3RlbS5JTwogCiBpbXBvcnQgVGhyaWZ0Ci1pbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZSgpCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQogCiAKIC0tIHwgQSB0aHJlYWRlZCBzZXZlciB0aGF0IGlzIGNhcGFibGUgb2YgdXNpbmcgYW55IFRyYW5zcG9ydCBvciBQcm90b2NvbAogLS0gaW5zdGFuY2VzLgotcnVuVGhyZWFkZWRTZXJ2ZXIgOjogKFRyYW5zcG9ydCB0LCBQcm90b2NvbCBpLCBQcm90b2NvbCBvKQotICAgICAgICAgICAgICAgICAgPT4gKFNvY2tldCAtPiBJTyAoaSB0LCBvIHQpKQorcnVuVGhyZWFkZWRTZXJ2ZXIgOjogKFByb3RvY29sIGksIFByb3RvY29sIG8pCisgICAgICAgICAgICAgICAgICA9PiAoU29ja2V0IC0+IElPIChpLCBvKSkKICAgICAgICAgICAgICAgICAgIC0+IGgKLSAgICAgICAgICAgICAgICAgIC0+IChoIC0+IChpIHQsIG8gdCkgLT4gSU8gQm9vbCkKKyAgICAgICAgICAgICAgICAgIC0+IChoIC0+IChpLCBvKSAtPiBJTyBCb29sKQogICAgICAgICAgICAgICAgICAgLT4gUG9ydElECiAgICAgICAgICAgICAgICAgICAtPiBJTyBhCi1ydW5UaHJlYWRlZFNlcnZlciBhY2NlcHRlciBoYW5kIHByb2MgcG9ydCA9IGRvCitydW5UaHJlYWRlZFNlcnZlciBhY2NlcHRlciBoYW5kIHByb2NfIHBvcnQgPSBkbwogICAgIHNvY2tldCA8LSBsaXN0ZW5PbiBwb3J0Ci0gICAgYWNjZXB0TG9vcCAoYWNjZXB0ZXIgc29ja2V0KSAocHJvYyBoYW5kKQorICAgIGFjY2VwdExvb3AgKGFjY2VwdGVyIHNvY2tldCkgKHByb2NfIGhhbmQpCiAKIC0tIHwgQSBiYXNpYyB0aHJlYWRlZCBiaW5hcnkgcHJvdG9jb2wgc29ja2V0IHNlcnZlci4KIHJ1bkJhc2ljU2VydmVyIDo6IGgKICAgICAgICAgICAgICAgIC0+IChoIC0+IChCaW5hcnlQcm90b2NvbCBIYW5kbGUsIEJpbmFyeVByb3RvY29sIEhhbmRsZSkgLT4gSU8gQm9vbCkKICAgICAgICAgICAgICAgIC0+IFBvcnROdW1iZXIKICAgICAgICAgICAgICAgIC0+IElPIGEKLXJ1bkJhc2ljU2VydmVyIGhhbmQgcHJvYyBwb3J0ID0gcnVuVGhyZWFkZWRTZXJ2ZXIgYmluYXJ5QWNjZXB0IGhhbmQgcHJvYyAoUG9ydE51bWJlciBwb3J0KQorcnVuQmFzaWNTZXJ2ZXIgaGFuZCBwcm9jXyBwb3J0ID0gcnVuVGhyZWFkZWRTZXJ2ZXIgYmluYXJ5QWNjZXB0IGhhbmQgcHJvY18gKFBvcnROdW1iZXIgcG9ydCkKICAgd2hlcmUgYmluYXJ5QWNjZXB0IHMgPSBkbwogICAgICAgICAgICAgKGgsIF8sIF8pIDwtIGFjY2VwdCBzCiAgICAgICAgICAgICByZXR1cm4gKEJpbmFyeVByb3RvY29sIGgsIEJpbmFyeVByb3RvY29sIGgpCiAKIGFjY2VwdExvb3AgOjogSU8gdCAtPiAodCAtPiBJTyBCb29sKSAtPiBJTyBhCi1hY2NlcHRMb29wIGFjY2VwdGVyIHByb2MgPSBmb3JldmVyICQKK2FjY2VwdExvb3AgYWNjZXB0ZXIgcHJvY18gPSBmb3JldmVyICQKICAgICBkbyBwcyA8LSBhY2NlcHRlcgotICAgICAgIGZvcmtJTyAkIGhhbmRsZSAoXChlIDo6IFNvbWVFeGNlcHRpb24pIC0+IHJldHVybiAoKSkKLSAgICAgICAgICAgICAgICAgIChsb29wICQgcHJvYyBwcykKKyAgICAgICBmb3JrSU8gJCBoYW5kbGUgKFwoXyA6OiBTb21lRXhjZXB0aW9uKSAtPiByZXR1cm4gKCkpCisgICAgICAgICAgICAgICAgICAobG9vcCAkIHByb2NfIHBzKQogICB3aGVyZSBsb29wIG0gPSBkbyB7IGNvbnRpbnVlIDwtIG07IHdoZW4gY29udGludWUgKGxvb3AgbSkgfQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0LmhzCmluZGV4IDgwZTQ5MTQuLjMwNmVkYzIgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQuaHMKQEAgLTEsMyArMSw1IEBACit7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfQorey0jIExBTkdVQUdFIE11bHRpUGFyYW1UeXBlQ2xhc3NlcyAjLX0KIC0tCiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAtLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMjUsMjggKzI3LDMwIEBACiAKIGltcG9ydCBDb250cm9sLk1vbmFkICggd2hlbiApCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCBFeGNlcHRpb24sIHRocm93ICkKLQoraW1wb3J0IERhdGEuRnVuY3RvciAoICg8JD4pICkKIGltcG9ydCBEYXRhLlR5cGVhYmxlICggVHlwZWFibGUgKQoraW1wb3J0IERhdGEuV29yZAogCi1pbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKIGltcG9ydCBEYXRhLk1vbm9pZAogCiBjbGFzcyBUcmFuc3BvcnQgYSB3aGVyZQogICAgIHRJc09wZW4gOjogYSAtPiBJTyBCb29sCiAgICAgdENsb3NlICA6OiBhIC0+IElPICgpCiAgICAgdFJlYWQgICA6OiBhIC0+IEludCAtPiBJTyBMQlMuQnl0ZVN0cmluZworICAgIHRQZWVrICAgOjogYSAtPiBJTyAoTWF5YmUgV29yZDgpCiAgICAgdFdyaXRlICA6OiBhIC0+IExCUy5CeXRlU3RyaW5nIC0+IElPICgpCiAgICAgdEZsdXNoICA6OiBhIC0+IElPICgpCiAgICAgdFJlYWRBbGwgOjogYSAtPiBJbnQgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKIAotICAgIHRSZWFkQWxsIGEgMCA9IHJldHVybiBtZW1wdHkKKyAgICB0UmVhZEFsbCBfIDAgPSByZXR1cm4gbWVtcHR5CiAgICAgdFJlYWRBbGwgYSBsZW4gPSBkbwogICAgICAgICByZXN1bHQgPC0gdFJlYWQgYSBsZW4KICAgICAgICAgbGV0IHJsZW4gPSBmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHJlc3VsdAogICAgICAgICB3aGVuIChybGVuID09IDApICh0aHJvdyAkIFRyYW5zcG9ydEV4biAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIiBURV9VTktOT1dOKQogICAgICAgICBpZiBsZW4gPD0gcmxlbgotICAgICAgICAgICAgdGhlbiByZXR1cm4gcmVzdWx0Ci0gICAgICAgICAgICBlbHNlIChyZXN1bHQgYG1hcHBlbmRgKSBgZm1hcGAgKHRSZWFkQWxsIGEgKGxlbiAtIHJsZW4pKQorICAgICAgICAgIHRoZW4gcmV0dXJuIHJlc3VsdAorICAgICAgICAgIGVsc2UgKHJlc3VsdCBgbWFwcGVuZGApIDwkPiB0UmVhZEFsbCBhIChsZW4gLSBybGVuKQogCiBkYXRhIFRyYW5zcG9ydEV4biA9IFRyYW5zcG9ydEV4biBTdHJpbmcgVHJhbnNwb3J0RXhuVHlwZQogICBkZXJpdmluZyAoIFNob3csIFR5cGVhYmxlICkKQEAgLTU5LDQgKzYzLDMgQEAKICAgICB8IFRFX1RJTUVEX09VVAogICAgIHwgVEVfRU5EX09GX0ZJTEUKICAgICAgIGRlcml2aW5nICggRXEsIFNob3csIFR5cGVhYmxlICkKLQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0VtcHR5LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0VtcHR5LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YWY1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRW1wdHkuaHMKQEAgLTAsMCArMSwzNiBAQAorey0jIExBTkdVQUdFIE11bHRpUGFyYW1UeXBlQ2xhc3NlcyAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5FbXB0eQorICAgICAgICggRW1wdHlUcmFuc3BvcnQoLi4pCisgICAgICAgKSB3aGVyZQorCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAorCitkYXRhIEVtcHR5VHJhbnNwb3J0ID0gRW1wdHlUcmFuc3BvcnQKKworaW5zdGFuY2UgVHJhbnNwb3J0IEVtcHR5VHJhbnNwb3J0IHdoZXJlCisgICAgdElzT3BlbiA9IGNvbnN0ICQgcmV0dXJuIEZhbHNlCisgICAgdENsb3NlICA9IGNvbnN0ICQgcmV0dXJuICgpCisgICAgdFJlYWQgXyBfID0gcmV0dXJuICIiCisgICAgdFBlZWsgPSBjb25zdCAkIHJldHVybiBOb3RoaW5nCisgICAgdFdyaXRlIF8gXyA9IHJldHVybiAoKQorICAgIHRGbHVzaCA9IGNvbnN0JCByZXR1cm4gKCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9GcmFtZWQuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRnJhbWVkLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZmM0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRnJhbWVkLmhzCkBAIC0wLDAgKzEsOTkgQEAKK3stIyBMQU5HVUFHRSBGbGV4aWJsZUluc3RhbmNlcyAjLX0KK3stIyBMQU5HVUFHRSBNdWx0aVBhcmFtVHlwZUNsYXNzZXMgIy19CistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuRnJhbWVkCisgICAgKCBtb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydAorICAgICwgRnJhbWVkVHJhbnNwb3J0CisgICAgLCBvcGVuRnJhbWVkVHJhbnNwb3J0CisgICAgKSB3aGVyZQorCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIKKworaW1wb3J0IERhdGEuSW50IChJbnQzMikKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkgYXMgQgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKKworCistLSB8IEZyYW1lZFRyYW5zcG9ydCB3cmFwcyBhIGdpdmVuIHRyYW5zcG9ydCBpbiBmcmFtZWQgbW9kZS4KK2RhdGEgRnJhbWVkVHJhbnNwb3J0IHQgPSBGcmFtZWRUcmFuc3BvcnQgeworICAgICAgd3JhcHBlZFRyYW5zIDo6IHQsICAgICAgICAgICAtLSBeIFVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAgd3JpdGVCdWZmZXIgIDo6IFdyaXRlQnVmZmVyLCAtLSBeIFdyaXRlIGJ1ZmZlci4KKyAgICAgIHJlYWRCdWZmZXIgICA6OiBSZWFkQnVmZmVyICAgLS0gXiBSZWFkIGJ1ZmZlci4KKyAgICB9CisKKy0tIHwgQ3JlYXRlIGEgbmV3IGZyYW1lZCB0cmFuc3BvcnQgd2hpY2ggd3JhcHMgdGhlIGdpdmVuIHRyYW5zcG9ydC4KK29wZW5GcmFtZWRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gdCAtPiBJTyAoRnJhbWVkVHJhbnNwb3J0IHQpCitvcGVuRnJhbWVkVHJhbnNwb3J0IHRyYW5zID0gZG8KKyAgd2J1ZiA8LSBuZXdXcml0ZUJ1ZmZlcgorICByYnVmIDwtIG5ld1JlYWRCdWZmZXIKKyAgcmV0dXJuIEZyYW1lZFRyYW5zcG9ydHsgd3JhcHBlZFRyYW5zID0gdHJhbnMsIHdyaXRlQnVmZmVyID0gd2J1ZiwgcmVhZEJ1ZmZlciA9IHJidWYgfQorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBUcmFuc3BvcnQgKEZyYW1lZFRyYW5zcG9ydCB0KSB3aGVyZQorCisgICAgdENsb3NlID0gdENsb3NlIC4gd3JhcHBlZFRyYW5zCisKKyAgICB0UmVhZCB0cmFucyBuID0gZG8KKyAgICAgIC0tIEZpcnN0LCBjaGVjayB0aGUgcmVhZCBidWZmZXIgZm9yIGFueSBkYXRhLgorICAgICAgYnMgPC0gcmVhZEJ1ZiAocmVhZEJ1ZmZlciB0cmFucykgbgorICAgICAgaWYgTEJTLm51bGwgYnMKKyAgICAgICAgIHRoZW4KKyAgICAgICAgIC0tIFdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0eSwgcmVhZCBhbm90aGVyIGZyYW1lIGZyb20gdGhlCisgICAgICAgICAtLSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgICAgICAgZG8gbGVuIDwtIHJlYWRGcmFtZSB0cmFucworICAgICAgICAgICAgICBpZiBsZW4gPiAwCisgICAgICAgICAgICAgICAgIHRoZW4gdFJlYWQgdHJhbnMgbgorICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBicworICAgICAgICAgZWxzZSByZXR1cm4gYnMKKyAgICB0UGVlayB0cmFucyA9IGRvCisgICAgICBtdyA8LSBwZWVrQnVmIChyZWFkQnVmZmVyIHRyYW5zKQorICAgICAgY2FzZSBtdyBvZgorICAgICAgICBKdXN0IF8gLT4gcmV0dXJuIG13CisgICAgICAgIE5vdGhpbmcgLT4gZG8KKyAgICAgICAgICBsZW4gPC0gcmVhZEZyYW1lIHRyYW5zCisgICAgICAgICAgaWYgbGVuID4gMAorICAgICAgICAgICAgIHRoZW4gdFBlZWsgdHJhbnMKKyAgICAgICAgICAgICBlbHNlIHJldHVybiBOb3RoaW5nCisKKyAgICB0V3JpdGUgPSB3cml0ZUJ1ZiAuIHdyaXRlQnVmZmVyCisKKyAgICB0Rmx1c2ggdHJhbnMgPSBkbworICAgICAgYnMgPC0gZmx1c2hCdWYgKHdyaXRlQnVmZmVyIHRyYW5zKQorICAgICAgbGV0IHN6QnMgPSBCLmVuY29kZSAkIChmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIGJzIDo6IEludDMyKQorICAgICAgdFdyaXRlICh3cmFwcGVkVHJhbnMgdHJhbnMpIHN6QnMKKyAgICAgIHRXcml0ZSAod3JhcHBlZFRyYW5zIHRyYW5zKSBicworICAgICAgdEZsdXNoICh3cmFwcGVkVHJhbnMgdHJhbnMpCisKKyAgICB0SXNPcGVuID0gdElzT3BlbiAuIHdyYXBwZWRUcmFucworCityZWFkRnJhbWUgOjogVHJhbnNwb3J0IHQgPT4gRnJhbWVkVHJhbnNwb3J0IHQgLT4gSU8gSW50CityZWFkRnJhbWUgdHJhbnMgPSBkbworICAtLSBSZWFkIGFuZCBkZWNvZGUgdGhlIGZyYW1lIHNpemUuCisgIHN6QnMgPC0gdFJlYWQgKHdyYXBwZWRUcmFucyB0cmFucykgNAorICBsZXQgc3ogPSBmcm9tSW50ZWdyYWwgKEIuZGVjb2RlIHN6QnMgOjogSW50MzIpCisKKyAgLS0gUmVhZCB0aGUgZnJhbWUgYW5kIHN0dWZmIGl0IGludG8gdGhlIHJlYWQgYnVmZmVyLgorICBicyA8LSB0UmVhZCAod3JhcHBlZFRyYW5zIHRyYW5zKSBzegorICBmaWxsQnVmIChyZWFkQnVmZmVyIHRyYW5zKSBicworCisgIC0tIFJldHVybiB0aGUgZnJhbWUgc2l6ZSBzbyB0aGF0IHRoZSBjYWxsZXIga25vd3Mgd2hldGhlciB0byBleHBlY3QKKyAgLS0gc29tZXRoaW5nIGluIHRoZSByZWFkIGJ1ZmZlciBvciBub3QuCisgIHJldHVybiBzegpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKaW5kZXggMGIxY2I3NS4uZmY2Mjk1YiAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCkBAIC0xLDMgKzEsOCBAQAorey0jIExBTkdVQUdFIEZsZXhpYmxlSW5zdGFuY2VzICMtfQorey0jIExBTkdVQUdFIE11bHRpUGFyYW1UeXBlQ2xhc3NlcyAjLX0KK3stIyBMQU5HVUFHRSBTY29wZWRUeXBlVmFyaWFibGVzICMtfQorey0jIExBTkdVQUdFIFR5cGVTeW5vbnltSW5zdGFuY2VzICMtfQorey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1vcnBoYW5zICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yMiw4ICsyNyw5IEBACiAgICAgLCBIYW5kbGVTb3VyY2UoLi4pCiAgICAgKSB3aGVyZQogCi1pbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCB0aHJvdyApCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAoIHJlcGxpY2F0ZU0gKQoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggY2F0Y2gsIHRocm93ICkKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuSW50ZXJuYWwgKGMydykKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKIAogaW1wb3J0IE5ldHdvcmsKIApAQCAtMzIsMTQgKzM4LDIxIEBACiAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CiAKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUwogaW1wb3J0IERhdGEuTW9ub2lkCiAKIGluc3RhbmNlIFRyYW5zcG9ydCBIYW5kbGUgd2hlcmUKICAgICB0SXNPcGVuID0gaElzT3BlbgotICAgIHRDbG9zZSBoICAgID0gaENsb3NlIGgKLSAgICB0UmVhZCAgaCBuICA9IExCUy5oR2V0IGggbiBgY2F0Y2hgIGhhbmRsZUVPRgotICAgIHRXcml0ZSBoIHMgID0gTEJTLmhQdXQgaCBzCisgICAgdENsb3NlID0gaENsb3NlCisgICAgdFJlYWQgaCBuID0gcmVhZCBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIGhhbmRsZUVPRiBtZW1wdHkKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWQgPSBkbworICAgICAgICAgIGhMb29rQWhlYWQgaAorICAgICAgICAgIExCUy5oR2V0Tm9uQmxvY2tpbmcgaCBuCisgICAgdFJlYWRBbGwgXyAwID0gcmV0dXJuIG1lbXB0eQorICAgIHRSZWFkQWxsIGggbiA9IExCUy5oR2V0IGggbiBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIHRocm93VHJhbnNwb3J0RXhuCisgICAgdFBlZWsgaCA9IChKdXN0IC4gYzJ3IDwkPiBoTG9va0FoZWFkIGgpIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgaGFuZGxlRU9GIE5vdGhpbmcKKyAgICB0V3JpdGUgPSBMQlMuaFB1dAogICAgIHRGbHVzaCA9IGhGbHVzaAogCiAKQEAgLTU0LDcgKzY3LDEyIEBACiBpbnN0YW5jZSBIYW5kbGVTb3VyY2UgKEhvc3ROYW1lLCBQb3J0SUQpIHdoZXJlCiAgICAgaE9wZW4gPSB1bmN1cnJ5IGNvbm5lY3RUbwogCit0aHJvd1RyYW5zcG9ydEV4biA6OiBJT0Vycm9yIC0+IElPIGEKK3Rocm93VHJhbnNwb3J0RXhuIGUgPSBpZiBpc0VPRkVycm9yIGUKKyAgICB0aGVuIHRocm93ICQgVHJhbnNwb3J0RXhuICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4iIFRFX1VOS05PV04KKyAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJIYW5kbGUgdFJlYWRBbGw6IENvdWxkIG5vdCByZWFkIiBURV9VTktOT1dOCiAKLWhhbmRsZUVPRiBlID0gaWYgaXNFT0ZFcnJvciBlCi0gICAgdGhlbiByZXR1cm4gbWVtcHR5Ci0gICAgZWxzZSB0aHJvdyAkIFRyYW5zcG9ydEV4biAiVENoYW5uZWxUcmFuc3BvcnQ6IENvdWxkIG5vdCByZWFkIiBURV9VTktOT1dOCitoYW5kbGVFT0YgOjogYSAtPiBJT0Vycm9yIC0+IElPIGEKK2hhbmRsZUVPRiBhIGUgPSBpZiBpc0VPRkVycm9yIGUKKyAgICB0aGVuIHJldHVybiBhCisgICAgZWxzZSB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGFuZGxlOiBDb3VsZCBub3QgcmVhZCIgVEVfVU5LTk9XTgpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IZWFkZXIuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhY2FkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IZWFkZXIuaHMKQEAgLTAsMCArMSwzNTQgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5IZWFkZXIKKyAgKCBtb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydAorICAsIEhlYWRlclRyYW5zcG9ydCguLikKKyAgLCBvcGVuSGVhZGVyVHJhbnNwb3J0CisgICwgUHJvdG9jb2xUeXBlKC4uKQorICAsIFRyYW5zZm9ybVR5cGUoLi4pCisgICwgQ2xpZW50VHlwZSguLikKKyAgLCB0UmVzZXRQcm90b2NvbAorICAsIHRTZXRQcm90b2NvbAorICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKK2ltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlCitpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCB0aHJvdyApCitpbXBvcnQgQ29udHJvbC5Nb25hZAoraW1wb3J0IERhdGEuQml0cworaW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgRGF0YS5Xb3JkCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeSBhcyBCaW5hcnkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nIGFzIEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5DaGFyOCBhcyBDCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyIGFzIEIKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCisKK2RhdGEgUHJvdG9jb2xUeXBlID0gVEJpbmFyeSB8IFRDb21wYWN0IHwgVEpTT04gZGVyaXZpbmcgKEVudW0sIEVxKQorZGF0YSBDbGllbnRUeXBlID0gSGVhZGVyQ2xpZW50IHwgRnJhbWVkIHwgVW5mcmFtZWQgZGVyaXZpbmcgKEVudW0sIEVxKQorCitpbmZvSWRLZXlWYWx1ZSA9IDEKKwordHlwZSBIZWFkZXJzID0gTWFwLk1hcCBTdHJpbmcgU3RyaW5nCisKK2RhdGEgVHJhbnNmb3JtVHlwZSA9IFpsaWJUcmFuc2Zvcm0gZGVyaXZpbmcgKEVudW0sIEVxKQorCitmcm9tVHJhbnNwb3J0VHlwZSA6OiBUcmFuc2Zvcm1UeXBlIC0+IEludDE2Citmcm9tVHJhbnNwb3J0VHlwZSBabGliVHJhbnNmb3JtID0gMQorCit0b1RyYW5zcG9ydFR5cGUgOjogSW50MTYgLT4gVHJhbnNmb3JtVHlwZQordG9UcmFuc3BvcnRUeXBlIDEgPSBabGliVHJhbnNmb3JtCit0b1RyYW5zcG9ydFR5cGUgXyA9ICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBVbmtub3duIHRyYW5zZm9ybSBJRCIgVEVfVU5LTk9XTgorCitkYXRhIEhlYWRlclRyYW5zcG9ydCBpIG8gPSAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQKKyAgICB7IHJlYWRCdWZmZXIgOjogSU9SZWYgTEJTLkJ5dGVTdHJpbmcKKyAgICAsIHdyaXRlQnVmZmVyIDo6IElPUmVmIEIuQnVpbGRlcgorICAgICwgaW5UcmFucyA6OiBpCisgICAgLCBvdXRUcmFucyA6OiBvCisgICAgLCBjbGllbnRUeXBlIDo6IElPUmVmIENsaWVudFR5cGUKKyAgICAsIHByb3RvY29sVHlwZSA6OiBJT1JlZiBQcm90b2NvbFR5cGUKKyAgICAsIGhlYWRlcnMgOjogSU9SZWYgWyhTdHJpbmcsIFN0cmluZyldCisgICAgLCB3cml0ZUhlYWRlcnMgOjogSGVhZGVycworICAgICwgdHJhbnNmb3JtcyA6OiBJT1JlZiBbVHJhbnNmb3JtVHlwZV0KKyAgICAsIHdyaXRlVHJhbnNmb3JtcyA6OiBbVHJhbnNmb3JtVHlwZV0KKyAgICB9CisKK29wZW5IZWFkZXJUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gaSAtPiBvIC0+IElPIChIZWFkZXJUcmFuc3BvcnQgaSBvKQorb3BlbkhlYWRlclRyYW5zcG9ydCBpIG8gPSBkbworICBwaWQgPC0gbmV3SU9SZWYgVENvbXBhY3QKKyAgckJ1ZiA8LSBuZXdJT1JlZiBMQlMuZW1wdHkKKyAgd0J1ZiA8LSBuZXdJT1JlZiBtZW1wdHkKKyAgY1R5cGUgPC0gbmV3SU9SZWYgSGVhZGVyQ2xpZW50CisgIGggPC0gbmV3SU9SZWYgW10KKyAgdHJhbnMgPC0gbmV3SU9SZWYgW10KKyAgcmV0dXJuIEhlYWRlclRyYW5zcG9ydAorICAgICAgeyByZWFkQnVmZmVyID0gckJ1ZgorICAgICAgLCB3cml0ZUJ1ZmZlciA9IHdCdWYKKyAgICAgICwgaW5UcmFucyA9IGkKKyAgICAgICwgb3V0VHJhbnMgPSBvCisgICAgICAsIGNsaWVudFR5cGUgPSBjVHlwZQorICAgICAgLCBwcm90b2NvbFR5cGUgPSBwaWQKKyAgICAgICwgaGVhZGVycyA9IGgKKyAgICAgICwgd3JpdGVIZWFkZXJzID0gTWFwLmVtcHR5CisgICAgICAsIHRyYW5zZm9ybXMgPSB0cmFucworICAgICAgLCB3cml0ZVRyYW5zZm9ybXMgPSBbXQorICAgICAgfQorCitpc0ZyYW1lZCB0ID0gKC89IFVuZnJhbWVkKSA8JD4gcmVhZElPUmVmIChjbGllbnRUeXBlIHQpCisKK3JlYWRGcmFtZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IElPIEJvb2wKK3JlYWRGcmFtZSB0ID0gZG8KKyAgbGV0IGlucHV0ID0gaW5UcmFucyB0CisgIGxldCByQnVmID0gcmVhZEJ1ZmZlciB0CisgIGxldCBjVHlwZSA9IGNsaWVudFR5cGUgdAorICBsc3ogPC0gdFJlYWQgaW5wdXQgNAorICBsZXQgc3ogPSBMQlMudG9TdHJpY3QgbHN6CisgIGNhc2UgUC5wYXJzZU9ubHkgUC5lbmRPZklucHV0IHN6IG9mCisgICAgUmlnaHQgXyAtPiBkbyByZXR1cm4gRmFsc2UKKyAgICBMZWZ0IF8gLT4gZG8KKyAgICAgIGNhc2UgcGFyc2VCaW5hcnlNYWdpYyBzeiBvZgorICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgd3JpdGVJT1JlZiByQnVmICQgbHN6CisgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBVbmZyYW1lZAorICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQmluYXJ5CisgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgY2FzZSBwYXJzZUNvbXBhY3RNYWdpYyBzeiBvZgorICAgICAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBsc3oKKyAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBVbmZyYW1lZAorICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVENvbXBhY3QKKyAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgICAgICBsZXQgbGVuID0gQmluYXJ5LmRlY29kZSBsc3ogOjogSW50MzIKKyAgICAgICAgICAgICAgbGJ1ZiA8LSB0UmVhZEFsbCBpbnB1dCAkIGZyb21JbnRlZ3JhbCBsZW4KKyAgICAgICAgICAgICAgbGV0IGJ1ZiA9IExCUy50b1N0cmljdCBsYnVmCisgICAgICAgICAgICAgIGNhc2UgcGFyc2VCaW5hcnlNYWdpYyBidWYgb2YKKyAgICAgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIEZyYW1lZAorICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRCaW5hcnkKKyAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiBsYnVmCisgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgY2FzZSBwYXJzZUNvbXBhY3RNYWdpYyBidWYgb2YKKyAgICAgICAgICAgICAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgRnJhbWVkCisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRDb21wYWN0CisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmIGxidWYKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIHBhcnNlSGVhZGVyTWFnaWMgYnVmIG9mCisgICAgICAgICAgICAgICAgICAgICAgICBSaWdodCBmbGFncyAtPiBkbworICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgKGZsYWdzLCBzZXFOdW0sIGhlYWRlciwgYm9keSkgPSBleHRyYWN0SGVhZGVyIGJ1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIEhlYWRlckNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVIZWFkZXIgdCBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA8LSB1bnRyYW5zZm9ybSB0IGJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmICQgTEJTLmZyb21TdHJpY3QgJCBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBMZWZ0IF8gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogdW5rb253biBjbGllbnQgdHlwZSIgVEVfVU5LTk9XTgorCitwYXJzZUJpbmFyeU1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4ODAgKj4gUC53b3JkOCAweDAxICo+IFAud29yZDggMHgwMCAqPiBQLmFueVdvcmQ4CitwYXJzZUNvbXBhY3RNYWdpYyA9IFAucGFyc2VPbmx5ICQgUC53b3JkOCAweDgyICo+IFAuc2F0aXNmeSAoXGIgLT4gYiAuJi4gMHgxZiA9PSAweDAxKQorcGFyc2VIZWFkZXJNYWdpYyA9IFAucGFyc2VPbmx5ICQgUC53b3JkOCAweDBmICo+IFAud29yZDggMHhmZiAqPiAoUC5jb3VudCAyIFAuYW55V29yZDgpCisKK3BhcnNlSTMyIDo6IFAuUGFyc2VyIEludDMyCitwYXJzZUkzMiA9IEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKK3BhcnNlSTE2IDo6IFAuUGFyc2VyIEludDE2CitwYXJzZUkxNiA9IEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDIKKworZXh0cmFjdEhlYWRlciA6OiBCUy5CeXRlU3RyaW5nIC0+IChJbnQxNiwgSW50MzIsIEJTLkJ5dGVTdHJpbmcsIEJTLkJ5dGVTdHJpbmcpCitleHRyYWN0SGVhZGVyIGJzID0KKyAgY2FzZSBQLnBhcnNlIGV4dHJhY3RIZWFkZXJfIGJzIG9mCisgICAgUC5Eb25lIHJlbWFpbiAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyKSAtPiAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyLCByZW1haW4pCisgICAgXyAtPiB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBJbnZhbGlkIGhlYWRlciIgVEVfVU5LTk9XTgorICB3aGVyZQorICAgIGV4dHJhY3RIZWFkZXJfID0gZG8KKyAgICAgIG1hZ2ljIDwtIFAud29yZDggMHgwZiAqPiBQLndvcmQ4IDB4ZmYKKyAgICAgIGZsYWdzIDwtIHBhcnNlSTE2CisgICAgICBzZXFOdW0gPC0gcGFyc2VJMzIKKyAgICAgIChoZWFkZXJTaXplIDo6IEludCkgPC0gKCogNCkgLiBmcm9tSW50ZWdyYWwgPCQ+IHBhcnNlSTE2CisgICAgICBoZWFkZXIgPC0gUC50YWtlIGhlYWRlclNpemUKKyAgICAgIHJldHVybiAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyKQorCitoYW5kbGVIZWFkZXIgdCBoZWFkZXIgPQorICBjYXNlIFAucGFyc2VPbmx5IHBhcnNlSGVhZGVyIGhlYWRlciBvZgorICAgIFJpZ2h0IChwVHlwZSwgdHJhbnMsIGluZm8pIC0+IGRvCisgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgcFR5cGUKKyAgICAgIHdyaXRlSU9SZWYgKHRyYW5zZm9ybXMgdCkgdHJhbnMKKyAgICAgIHdyaXRlSU9SZWYgKGhlYWRlcnMgdCkgaW5mbworICAgIF8gLT4gdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogSW52YWxpZCBoZWFkZXIiIFRFX1VOS05PV04KKworCitpdzE2IDo6IEludDE2IC0+IFdvcmQxNgoraXcxNiA9IGZyb21JbnRlZ3JhbAoraXczMiA6OiBJbnQzMiAtPiBXb3JkMzIKK2l3MzIgPSBmcm9tSW50ZWdyYWwKK3dpMTYgOjogV29yZDE2IC0+IEludDE2Cit3aTE2ID0gZnJvbUludGVncmFsCit3aTMyIDo6IFdvcmQzMiAtPiBJbnQzMgord2kzMiA9IGZyb21JbnRlZ3JhbAorCitwYXJzZUhlYWRlciA6OiBQLlBhcnNlciAoUHJvdG9jb2xUeXBlLCBbVHJhbnNmb3JtVHlwZV0sIFsoU3RyaW5nLCBTdHJpbmcpXSkKK3BhcnNlSGVhZGVyID0gZG8KKyAgcHJvdG9jb2xUeXBlIDwtIHRvUHJvdG9jb2xUeXBlIDwkPiBwYXJzZVZhcmludCB3aTE2CisgIG51bVRyYW5zIDwtIGZyb21JbnRlZ3JhbCA8JD4gcGFyc2VWYXJpbnQgd2kxNgorICB0cmFucyA8LSByZXBsaWNhdGVNIG51bVRyYW5zIHBhcnNlVHJhbnNmb3JtCisgIGluZm8gPC0gcGFyc2VJbmZvCisgIHJldHVybiAocHJvdG9jb2xUeXBlLCB0cmFucywgaW5mbykKKwordG9Qcm90b2NvbFR5cGUgOjogSW50MTYgLT4gUHJvdG9jb2xUeXBlCit0b1Byb3RvY29sVHlwZSAwID0gVEJpbmFyeQordG9Qcm90b2NvbFR5cGUgMSA9IFRKU09OCit0b1Byb3RvY29sVHlwZSAyID0gVENvbXBhY3QKKworZnJvbVByb3RvY29sVHlwZSA6OiBQcm90b2NvbFR5cGUgLT4gSW50MTYKK2Zyb21Qcm90b2NvbFR5cGUgVEJpbmFyeSA9IDAKK2Zyb21Qcm90b2NvbFR5cGUgVEpTT04gPSAxCitmcm9tUHJvdG9jb2xUeXBlIFRDb21wYWN0ID0gMgorCitwYXJzZVRyYW5zZm9ybSA6OiBQLlBhcnNlciBUcmFuc2Zvcm1UeXBlCitwYXJzZVRyYW5zZm9ybSA9IHRvVHJhbnNwb3J0VHlwZSA8JD4gcGFyc2VWYXJpbnQgd2kxNgorCitwYXJzZUluZm8gOjogUC5QYXJzZXIgWyhTdHJpbmcsIFN0cmluZyldCitwYXJzZUluZm8gPSBkbworICBuIDwtIFAuZWl0aGVyUCBQLmVuZE9mSW5wdXQgKHBhcnNlVmFyaW50IHdpMzIpCisgIGNhc2UgbiBvZgorICAgIExlZnQgXyAtPiByZXR1cm4gW10KKyAgICBSaWdodCBuMCAtPgorICAgICAgcmVwbGljYXRlTSAoZnJvbUludGVncmFsIG4wKSAkIGRvCisgICAgICAgIGtsZW4gPC0gcGFyc2VWYXJpbnQgd2kxNgorICAgICAgICBrIDwtIFAudGFrZSAkIGZyb21JbnRlZ3JhbCBrbGVuCisgICAgICAgIHZsZW4gPC0gcGFyc2VWYXJpbnQgd2kxNgorICAgICAgICB2IDwtIFAudGFrZSAkIGZyb21JbnRlZ3JhbCB2bGVuCisgICAgICAgIHJldHVybiAoQy51bnBhY2sgaywgQy51bnBhY2sgdikKKworcGFyc2VTdHJpbmcgOjogUC5QYXJzZXIgQlMuQnl0ZVN0cmluZworcGFyc2VTdHJpbmcgPSBwYXJzZVZhcmludCB3aTMyID4+PSAoUC50YWtlIC4gZnJvbUludGVncmFsKQorCitidWlsZEhlYWRlciA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IElPIEIuQnVpbGRlcgorYnVpbGRIZWFkZXIgdCA9IGRvCisgIHBUeXBlIDwtIHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSB0CisgIGxldCBwSWQgPSBidWlsZFZhcmludCAkIGl3MTYgJCBmcm9tUHJvdG9jb2xUeXBlIHBUeXBlCisgIGxldCBoZWFkZXJDb250ZW50ID0gcElkIDw+IChidWlsZFRyYW5zZm9ybXMgdCkgPD4gKGJ1aWxkSW5mbyB0KQorICBsZXQgbGVuID0gZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCAkIEIudG9MYXp5Qnl0ZVN0cmluZyBoZWFkZXJDb250ZW50CisgIC0tIFRPRE86IGxlbmd0aCBsaW1pdCBjaGVjaworICBsZXQgcGFkZGluZyA9IG1jb25jYXQgJCByZXBsaWNhdGUgKG1vZCBsZW4gNCkgJCBCLndvcmQ4IDAKKyAgbGV0IGNvZGVkTGVuID0gQi5pbnQxNkJFIChmcm9tSW50ZWdyYWwgJCAocXVvdCAobGVuIC0gMSkgNCkgKyAxKQorICBsZXQgZmxhZ3MgPSAwCisgIGxldCBzZXFOdW0gPSAwCisgIHJldHVybiAkIEIuaW50MTZCRSAweDBmZmYgPD4gQi5pbnQxNkJFIGZsYWdzIDw+IEIuaW50MzJCRSBzZXFOdW0gPD4gY29kZWRMZW4gPD4gaGVhZGVyQ29udGVudCA8PiBwYWRkaW5nCisKK2J1aWxkVHJhbnNmb3JtcyA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEIuQnVpbGRlcgorLS0gVE9ETzogY2hlY2sgbGVuZ3RoIGxpbWl0CitidWlsZFRyYW5zZm9ybXMgdCA9CisgIGxldCB0cmFucyA9IHdyaXRlVHJhbnNmb3JtcyB0IGluCisgIChidWlsZFZhcmludCAkIGl3MTYgJCBmcm9tSW50ZWdyYWwgJCBsZW5ndGggdHJhbnMpIDw+CisgIChtY29uY2F0ICQgbWFwIChidWlsZFZhcmludCAuIGl3MTYgLiBmcm9tVHJhbnNwb3J0VHlwZSkgdHJhbnMpCisKK2J1aWxkSW5mbyA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEIuQnVpbGRlcgorYnVpbGRJbmZvIHQgPQorICBsZXQgaCA9IE1hcC5hc3NvY3MgJCB3cml0ZUhlYWRlcnMgdCBpbgorICAtLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKKyAgY2FzZSBsZW5ndGggaCBvZgorICAgIDAgLT4gbWVtcHR5CisgICAgbGVuIC0+IChidWlsZFZhcmludCAkIGl3MTYgJCBmcm9tSW50ZWdyYWwgJCBsZW4pIDw+IChtY29uY2F0ICQgbWFwIGJ1aWxkSW5mb0VudHJ5IGgpCisgIHdoZXJlCisgICAgYnVpbGRJbmZvRW50cnkgKGssIHYpID0gYnVpbGRWYXJTdHIgayA8PiBidWlsZFZhclN0ciB2CisgICAgLS0gVE9ETzogY2hlY2sgbGVuZ3RoIGxpbWl0CisgICAgYnVpbGRWYXJTdHIgcyA9IChidWlsZFZhcmludCAkIGl3MTYgJCBmcm9tSW50ZWdyYWwgJCBsZW5ndGggcykgPD4gQi5zdHJpbmc4IHMKKwordFJlc2V0UHJvdG9jb2wgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBJTyBCb29sCit0UmVzZXRQcm90b2NvbCB0ID0gZG8KKyAgckJ1ZiA8LSByZWFkSU9SZWYgJCByZWFkQnVmZmVyIHQKKyAgd3JpdGVJT1JlZiAoY2xpZW50VHlwZSB0KSBIZWFkZXJDbGllbnQKKyAgcmVhZEZyYW1lIHQKKwordFNldFByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gUHJvdG9jb2xUeXBlIC0+IElPICgpCit0U2V0UHJvdG9jb2wgdCA9IHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KQorCit0cmFuc2Zvcm0gOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBMQlMuQnl0ZVN0cmluZyAtPiBMQlMuQnl0ZVN0cmluZwordHJhbnNmb3JtIHQgYnMgPQorICBmb2xkciBhcHBseVRyYW5zZm9ybSBicyAkIHdyaXRlVHJhbnNmb3JtcyB0CisgIHdoZXJlCisgICAgLS0gYXBwbHlUcmFuc2Zvcm0gYnMgWmxpYlRyYW5zZm9ybSA9CisgICAgLS0gICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBub3QgaW1wbGVtZW50ZWQ6IFpsaWJUcmFuc2Zvcm0gICIgVEVfVU5LTk9XTgorICAgIGFwcGx5VHJhbnNmb3JtIGJzIF8gPQorICAgICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogVW5rbm93biB0cmFuc2Zvcm0iIFRFX1VOS05PV04KKwordW50cmFuc2Zvcm0gOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBCUy5CeXRlU3RyaW5nIC0+IElPIEJTLkJ5dGVTdHJpbmcKK3VudHJhbnNmb3JtIHQgYnMgPSBkbworICB0cmFucyA8LSByZWFkSU9SZWYgJCB0cmFuc2Zvcm1zIHQKKyAgcmV0dXJuICQgZm9sZGwgdW5hcHBseVRyYW5zZm9ybSBicyB0cmFucworICB3aGVyZQorICAgIC0tIHVuYXBwbHlUcmFuc2Zvcm0gYnMgWmxpYlRyYW5zZm9ybSA9CisgICAgLS0gICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBub3QgaW1wbGVtZW50ZWQ6IFpsaWJUcmFuc2Zvcm0gICIgVEVfVU5LTk9XTgorICAgIHVuYXBwbHlUcmFuc2Zvcm0gYnMgXyA9CisgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBVbmtub3duIHRyYW5zZm9ybSIgVEVfVU5LTk9XTgorCitpbnN0YW5jZSAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBUcmFuc3BvcnQgKEhlYWRlclRyYW5zcG9ydCBpIG8pIHdoZXJlCisgIHRJc09wZW4gdCA9IGRvCisgICAgdElzT3BlbiAoaW5UcmFucyB0KQorICAgIHRJc09wZW4gKG91dFRyYW5zIHQpCisKKyAgdENsb3NlIHQgPSBkbworICAgIHRDbG9zZShvdXRUcmFucyB0KQorICAgIHRDbG9zZShpblRyYW5zIHQpCisKKyAgdFJlYWQgdCBsZW4gPSBkbworICAgIHJCdWYgPC0gcmVhZElPUmVmICQgcmVhZEJ1ZmZlciB0CisgICAgaWYgbm90ICQgTEJTLm51bGwgckJ1ZgorICAgICAgdGhlbiBkbworICAgICAgICBsZXQgKGNvbnN1bWVkLCByZW1haW4pID0gTEJTLnNwbGl0QXQgKGZyb21JbnRlZ3JhbCBsZW4pIHJCdWYKKyAgICAgICAgd3JpdGVJT1JlZiAocmVhZEJ1ZmZlciB0KSByZW1haW4KKyAgICAgICAgcmV0dXJuIGNvbnN1bWVkCisgICAgICBlbHNlIGRvCisgICAgICAgIGZyYW1lZCA8LSBpc0ZyYW1lZCB0CisgICAgICAgIGlmIG5vdCBmcmFtZWQKKyAgICAgICAgICB0aGVuIHRSZWFkIChpblRyYW5zIHQpIGxlbgorICAgICAgICAgIGVsc2UgZG8KKyAgICAgICAgICAgIG9rIDwtIHJlYWRGcmFtZSB0CisgICAgICAgICAgICBpZiBvaworICAgICAgICAgICAgICB0aGVuIHRSZWFkIHQgbGVuCisgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIExCUy5lbXB0eQorCisgIHRQZWVrIHQgPSBkbworICAgIHJCdWYgPC0gcmVhZElPUmVmIChyZWFkQnVmZmVyIHQpCisgICAgaWYgbm90ICQgTEJTLm51bGwgckJ1ZgorICAgICAgdGhlbiByZXR1cm4gJCBKdXN0ICQgTEJTLmhlYWQgckJ1ZgorICAgICAgZWxzZSBkbworICAgICAgICBmcmFtZWQgPC0gaXNGcmFtZWQgdAorICAgICAgICBpZiBub3QgZnJhbWVkCisgICAgICAgICAgdGhlbiB0UGVlayAoaW5UcmFucyB0KQorICAgICAgICAgIGVsc2UgZG8KKyAgICAgICAgICAgIG9rIDwtIHJlYWRGcmFtZSB0CisgICAgICAgICAgICBpZiBvaworICAgICAgICAgICAgICB0aGVuIHRQZWVrIHQKKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gTm90aGluZworCisgIHRXcml0ZSB0IGJ1ZiA9IGRvCisgICAgbGV0IHdCdWYgPSB3cml0ZUJ1ZmZlciB0CisgICAgZnJhbWVkIDwtIGlzRnJhbWVkIHQKKyAgICBpZiBmcmFtZWQKKyAgICAgIHRoZW4gbW9kaWZ5SU9SZWYgd0J1ZiAoPD4gQi5sYXp5Qnl0ZVN0cmluZyBidWYpCisgICAgICBlbHNlCisgICAgICAgIC0tIFRPRE86IHdoYXQgc2hvdWxkIHdlIGRvIHdoZW4gc3dpdGNoZWQgdG8gdW5mcmFtZWQgaW4gdGhlIG1pZGRsZSA/CisgICAgICAgIHRXcml0ZShvdXRUcmFucyB0KSBidWYKKworICB0Rmx1c2ggdCA9IGRvCisgICAgY1R5cGUgPC0gcmVhZElPUmVmICQgY2xpZW50VHlwZSB0CisgICAgY2FzZSBjVHlwZSBvZgorICAgICAgVW5mcmFtZWQgLT4gdEZsdXNoICQgb3V0VHJhbnMgdAorICAgICAgRnJhbWVkIC0+IGZsdXNoQnVmZmVyIHQgaWQgbWVtcHR5CisgICAgICBIZWFkZXJDbGllbnQgLT4gYnVpbGRIZWFkZXIgdCA+Pj0gZmx1c2hCdWZmZXIgdCAodHJhbnNmb3JtIHQpCisgICAgd2hlcmUKKyAgICAgIGZsdXNoQnVmZmVyIHQgZiBoZWFkZXIgPSBkbworICAgICAgICB3QnVmIDwtIHJlYWRJT1JlZiAkIHdyaXRlQnVmZmVyIHQKKyAgICAgICAgd3JpdGVJT1JlZiAod3JpdGVCdWZmZXIgdCkgbWVtcHR5CisgICAgICAgIGxldCBwYXlsb2FkID0gQi50b0xhenlCeXRlU3RyaW5nIChoZWFkZXIgPD4gd0J1ZikKKyAgICAgICAgdFdyaXRlIChvdXRUcmFucyB0KSAkIEJpbmFyeS5lbmNvZGUgKGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcGF5bG9hZCA6OiBJbnQzMikKKyAgICAgICAgdFdyaXRlIChvdXRUcmFucyB0KSAkIGYgcGF5bG9hZAorICAgICAgICB0Rmx1c2ggKG91dFRyYW5zIHQpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IdHRwQ2xpZW50LmhzCmluZGV4IDIyNjgyNjEuLmVkZWIzMjAgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IdHRwQ2xpZW50LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IdHRwQ2xpZW50LmhzCkBAIC0xLDMgKzEsNCBAQAorey0jIExBTkdVQUdFIEZsZXhpYmxlSW5zdGFuY2VzICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yMSwyMCArMjIsMTcgQEAKICAgICAoIG1vZHVsZSBUaHJpZnQuVHJhbnNwb3J0CiAgICAgLCBIdHRwQ2xpZW50ICguLikKICAgICAsIG9wZW5IdHRwQ2xpZW50Ci0gICAgKSB3aGVyZQorKSB3aGVyZQogCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIKIGltcG9ydCBOZXR3b3JrLlVSSQogaW1wb3J0IE5ldHdvcmsuSFRUUCBoaWRpbmcgKHBvcnQsIGhvc3QpCi1pbXBvcnQgTmV0d29yay5UQ1AKIAotaW1wb3J0IENvbnRyb2wuTW9uYWQgKGxpZnRNKQogaW1wb3J0IERhdGEuTWF5YmUgKGZyb21KdXN0KQotaW1wb3J0IERhdGEuTW9ub2lkIChtYXBwZW5kLCBtZW1wdHkpCitpbXBvcnQgRGF0YS5Nb25vaWQgKG1lbXB0eSkKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAodGhyb3cpCi1pbXBvcnQgQ29udHJvbC5Db25jdXJyZW50Lk1WYXIKLWltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkuQnVpbGRlciBhcyBCCi1pbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKIAogCiAtLSB8ICdIdHRwQ2xpZW50Jywgb3IgVEh0dHBDbGllbnQgaW1wbGVtZW50cyB0aGUgVGhyaWZ0IFRyYW5zcG9ydApAQCAtNDcsMzQgKzQ1LDM5IEBACiAgICAgICByZWFkQnVmZmVyIDo6IFJlYWRCdWZmZXIKICAgICB9CiAKK3VyaUF1dGggOjogVVJJIC0+IFVSSUF1dGgKIHVyaUF1dGggPSBmcm9tSnVzdCAuIHVyaUF1dGhvcml0eQorCitob3N0IDo6IFVSSSAtPiBTdHJpbmcKIGhvc3QgPSB1cmlSZWdOYW1lIC4gdXJpQXV0aAogCiBwb3J0IDo6IFVSSSAtPiBJbnQKLXBvcnQgdXJpID0KK3BvcnQgdXJpXyA9CiAgICAgaWYgcG9ydFN0ciA9PSBtZW1wdHkgdGhlbgogICAgICAgICBodHRwUG9ydAogICAgIGVsc2UKICAgICAgICAgcmVhZCBwb3J0U3RyCiAgICAgd2hlcmUKLSAgICAgIHBvcnRTdHIgPSBkcm9wV2hpbGUgKD09ICc6JykgJCB1cmlQb3J0ICQgdXJpQXV0aCB1cmkKKyAgICAgIHBvcnRTdHIgPSBkcm9wV2hpbGUgKD09ICc6JykgJCB1cmlQb3J0ICQgdXJpQXV0aCB1cmlfCiAgICAgICBodHRwUG9ydCA9IDgwCiAKIC0tIHwgVXNlICdvcGVuSHR0cENsaWVudCcgdG8gY3JlYXRlIGFuIEh0dHBDbGllbnQgY29ubmVjdGVkIHRvIEB1cmlACiBvcGVuSHR0cENsaWVudCA6OiBVUkkgLT4gSU8gSHR0cENsaWVudAotb3Blbkh0dHBDbGllbnQgdXJpID0gZG8KLSAgc3RyZWFtIDwtIG9wZW5UQ1BDb25uZWN0aW9uIChob3N0IHVyaSkgKHBvcnQgdXJpKQorb3Blbkh0dHBDbGllbnQgdXJpXyA9IGRvCisgIHN0cmVhbSA8LSBvcGVuVENQQ29ubmVjdGlvbiAoaG9zdCB1cmlfKSAocG9ydCB1cmlfKQogICB3YnVmIDwtIG5ld1dyaXRlQnVmZmVyCiAgIHJidWYgPC0gbmV3UmVhZEJ1ZmZlcgotICByZXR1cm4gJCBIdHRwQ2xpZW50IHN0cmVhbSB1cmkgd2J1ZiByYnVmCisgIHJldHVybiAkIEh0dHBDbGllbnQgc3RyZWFtIHVyaV8gd2J1ZiByYnVmCiAKIGluc3RhbmNlIFRyYW5zcG9ydCBIdHRwQ2xpZW50IHdoZXJlCiAKLSAgICB0Q2xvc2UgID0gY2xvc2UgLiBoc3RyZWFtCisgICAgdENsb3NlID0gY2xvc2UgLiBoc3RyZWFtCiAKLSAgICB0UmVhZCBoY2xpZW50IG4gPSByZWFkQnVmIChyZWFkQnVmZmVyIGhjbGllbnQpIG4KKyAgICB0UGVlayA9IHBlZWtCdWYgLiByZWFkQnVmZmVyCiAKLSAgICB0V3JpdGUgaGNsaWVudCA9IHdyaXRlQnVmICh3cml0ZUJ1ZmZlciBoY2xpZW50KQorICAgIHRSZWFkID0gcmVhZEJ1ZiAuIHJlYWRCdWZmZXIKKworICAgIHRXcml0ZSA9IHdyaXRlQnVmIC4gd3JpdGVCdWZmZXIKIAogICAgIHRGbHVzaCBoY2xpZW50ID0gZG8KICAgICAgIGJvZHkgPC0gZmx1c2hCdWYgJCB3cml0ZUJ1ZmZlciBoY2xpZW50CkBAIC04OSwzNiArOTIsMTAgQEAKIAogICAgICAgcmVzIDwtIHNlbmRIVFRQIChoc3RyZWFtIGhjbGllbnQpIHJlcXVlc3QKICAgICAgIGNhc2UgcmVzIG9mCi0gICAgICAgIFJpZ2h0IHJlcyAtPiBkbwotICAgICAgICAgICAgZmlsbEJ1ZiAocmVhZEJ1ZmZlciBoY2xpZW50KSAocnNwQm9keSByZXMpCi0gICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICBSaWdodCByZXNwb25zZSAtPgorICAgICAgICAgIGZpbGxCdWYgKHJlYWRCdWZmZXIgaGNsaWVudCkgKHJzcEJvZHkgcmVzcG9uc2UpCisgICAgICAgIExlZnQgXyAtPgogICAgICAgICAgICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIlRIdHRwQ29ubmVjdGlvbjogSFRUUCBmYWlsdXJlIGZyb20gc2VydmVyIiBURV9VTktOT1dOCiAgICAgICByZXR1cm4gKCkKIAogICAgIHRJc09wZW4gXyA9IHJldHVybiBUcnVlCi0tLSBNaW5pIElPIGJ1ZmZlcnMKLQotdHlwZSBXcml0ZUJ1ZmZlciA9IE1WYXIgKEIuQnVpbGRlcikKLQotbmV3V3JpdGVCdWZmZXIgOjogSU8gV3JpdGVCdWZmZXIKLW5ld1dyaXRlQnVmZmVyID0gbmV3TVZhciBtZW1wdHkKLQotd3JpdGVCdWYgOjogV3JpdGVCdWZmZXIgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKLXdyaXRlQnVmIHcgcyA9IG1vZGlmeU1WYXJfIHcgJCByZXR1cm4gLiAoXGJ1aWxkZXIgLT4KLSAgICAgICAgICAgICAgICAgYnVpbGRlciBgbWFwcGVuZGAgKEIuZnJvbUxhenlCeXRlU3RyaW5nIHMpKQotCi1mbHVzaEJ1ZiA6OiBXcml0ZUJ1ZmZlciAtPiBJTyAoTEJTLkJ5dGVTdHJpbmcpCi1mbHVzaEJ1ZiB3ID0gQi50b0xhenlCeXRlU3RyaW5nIGBsaWZ0TWAgc3dhcE1WYXIgdyBtZW1wdHkKLQotCi10eXBlIFJlYWRCdWZmZXIgPSBNVmFyIChMQlMuQnl0ZVN0cmluZykKLQotbmV3UmVhZEJ1ZmZlciA6OiBJTyBSZWFkQnVmZmVyCi1uZXdSZWFkQnVmZmVyID0gbmV3TVZhciBtZW1wdHkKLQotZmlsbEJ1ZiA6OiBSZWFkQnVmZmVyIC0+IExCUy5CeXRlU3RyaW5nIC0+IElPICgpCi1maWxsQnVmIHIgcyA9IHN3YXBNVmFyIHIgcyA+PiByZXR1cm4gKCkKLQotcmVhZEJ1ZiA6OiBSZWFkQnVmZmVyIC0+IEludCAtPiBJTyAoTEJTLkJ5dGVTdHJpbmcpCi1yZWFkQnVmIHIgbiA9IG1vZGlmeU1WYXIgciAkIHJldHVybiAuIGZsaXBQYWlyIC4gTEJTLnNwbGl0QXQgKGZyb21JbnRlZ3JhbCBuKQotICAgIHdoZXJlIGZsaXBQYWlyIChhLCBiKSA9IChiLCBhKQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0lPQnVmZmVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0lPQnVmZmVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYmQ3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSU9CdWZmZXIuaHMKQEAgLTAsMCArMSw2OSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0LklPQnVmZmVyCisgICAgICAgKCBXcml0ZUJ1ZmZlcgorICAgICAgICwgbmV3V3JpdGVCdWZmZXIKKyAgICAgICAsIHdyaXRlQnVmCisgICAgICAgLCBmbHVzaEJ1ZgorICAgICAgICwgUmVhZEJ1ZmZlcgorICAgICAgICwgbmV3UmVhZEJ1ZmZlcgorICAgICAgICwgZmlsbEJ1ZgorICAgICAgICwgcmVhZEJ1ZgorICAgICAgICwgcGVla0J1ZgorICAgICAgICkgd2hlcmUKKworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKK2ltcG9ydCBEYXRhLklPUmVmCitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBEYXRhLldvcmQKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKKwordHlwZSBXcml0ZUJ1ZmZlciA9IElPUmVmIEJ1aWxkZXIKK3R5cGUgUmVhZEJ1ZmZlciA9IElPUmVmIExCUy5CeXRlU3RyaW5nCisKK25ld1dyaXRlQnVmZmVyIDo6IElPIFdyaXRlQnVmZmVyCituZXdXcml0ZUJ1ZmZlciA9IG5ld0lPUmVmIG1lbXB0eQorCit3cml0ZUJ1ZiA6OiBXcml0ZUJ1ZmZlciAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQord3JpdGVCdWYgdyBzID0gbW9kaWZ5SU9SZWYgdyAoIDw+IGxhenlCeXRlU3RyaW5nIHMpCisKK2ZsdXNoQnVmIDo6IFdyaXRlQnVmZmVyIC0+IElPIExCUy5CeXRlU3RyaW5nCitmbHVzaEJ1ZiB3ID0gZG8KKyAgYnVmIDwtIHJlYWRJT1JlZiB3CisgIHdyaXRlSU9SZWYgdyBtZW1wdHkKKyAgcmV0dXJuICQgdG9MYXp5Qnl0ZVN0cmluZyBidWYKKworbmV3UmVhZEJ1ZmZlciA6OiBJTyBSZWFkQnVmZmVyCituZXdSZWFkQnVmZmVyID0gbmV3SU9SZWYgbWVtcHR5CisKK2ZpbGxCdWYgOjogUmVhZEJ1ZmZlciAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQorZmlsbEJ1ZiA9IHdyaXRlSU9SZWYKKworcmVhZEJ1ZiA6OiBSZWFkQnVmZmVyIC0+IEludCAtPiBJTyBMQlMuQnl0ZVN0cmluZworcmVhZEJ1ZiByIG4gPSBkbworICBicyA8LSByZWFkSU9SZWYgcgorICBsZXQgKGhkLCB0bCkgPSBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIG4pIGJzCisgIHdyaXRlSU9SZWYgciB0bAorICByZXR1cm4gaGQKKworcGVla0J1ZiA6OiBSZWFkQnVmZmVyIC0+IElPIChNYXliZSBXb3JkOCkKK3BlZWtCdWYgciA9IChmbWFwIGZzdCAuIExCUy51bmNvbnMpIDwkPiByZWFkSU9SZWYgcgpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L01lbW9yeS5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9NZW1vcnkuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5M2FmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9NZW1vcnkuaHMKQEAgLTAsMCArMSw3NyBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQorICAgICAgICggb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICwgTWVtb3J5QnVmZmVyKC4uKQorICAgICAgICkgd2hlcmUKKworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKK2ltcG9ydCBEYXRhLklPUmVmCitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCisKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CisKKworZGF0YSBNZW1vcnlCdWZmZXIgPSBNZW1vcnlCdWZmZXIgeworICB3cml0ZUJ1ZmZlciA6OiBJT1JlZiBCdWlsZGVyLAorICByZWFkQnVmZmVyIDo6IElPUmVmIExCUy5CeXRlU3RyaW5nCit9CisKK29wZW5NZW1vcnlCdWZmZXIgOjogSU8gTWVtb3J5QnVmZmVyCitvcGVuTWVtb3J5QnVmZmVyID0gZG8KKyAgd2J1ZiA8LSBuZXdJT1JlZiBtZW1wdHkKKyAgcmJ1ZiA8LSBuZXdJT1JlZiBtZW1wdHkKKyAgcmV0dXJuIE1lbW9yeUJ1ZmZlciB7CisgICAgd3JpdGVCdWZmZXIgPSB3YnVmLAorICAgIHJlYWRCdWZmZXIgPSByYnVmCisgIH0KKworaW5zdGFuY2UgVHJhbnNwb3J0IE1lbW9yeUJ1ZmZlciB3aGVyZQorICB0SXNPcGVuID0gY29uc3QgJCByZXR1cm4gRmFsc2UKKyAgdENsb3NlICA9IGNvbnN0ICQgcmV0dXJuICgpCisgIHRGbHVzaCB0cmFucyA9IGRvCisgICAgbGV0IHdCdWYgPSB3cml0ZUJ1ZmZlciB0cmFucworICAgIHdiIDwtIHJlYWRJT1JlZiB3QnVmCisgICAgbW9kaWZ5SU9SZWYgKHJlYWRCdWZmZXIgdHJhbnMpICQgXHJiIC0+IG1hcHBlbmQgcmIgJCB0b0xhenlCeXRlU3RyaW5nIHdiCisgICAgd3JpdGVJT1JlZiB3QnVmIG1lbXB0eQorCisgIHRSZWFkIF8gMCA9IHJldHVybiBtZW1wdHkKKyAgdFJlYWQgdHJhbnMgbiA9IGRvCisgICAgbGV0IHJidWYgPSByZWFkQnVmZmVyIHRyYW5zCisgICAgcmIgPC0gcmVhZElPUmVmIHJidWYKKyAgICBsZXQgbGVuID0gZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCByYgorICAgIGlmIGxlbiA9PSAwCisgICAgICB0aGVuIGRvCisgICAgICAgIHRGbHVzaCB0cmFucworICAgICAgICByYjIgPC0gcmVhZElPUmVmIChyZWFkQnVmZmVyIHRyYW5zKQorICAgICAgICBpZiAoZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCByYjIpID09IDAKKyAgICAgICAgICB0aGVuIHJldHVybiBtZW1wdHkKKyAgICAgICAgICBlbHNlIHRSZWFkIHRyYW5zIG4KKyAgICAgIGVsc2UgZG8KKyAgICAgICAgbGV0IChyZXQsIHJlbWFpbikgPSBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIG4pIHJiCisgICAgICAgIHdyaXRlSU9SZWYgcmJ1ZiByZW1haW4KKyAgICAgICAgcmV0dXJuIHJldAorCisgIHRQZWVrIHRyYW5zID0gKGZtYXAgZnN0IC4gTEJTLnVuY29ucykgPCQ+IHJlYWRJT1JlZiAocmVhZEJ1ZmZlciB0cmFucykKKworICB0V3JpdGUgdHJhbnMgdiA9IGRvCisgICAgbW9kaWZ5SU9SZWYgKHdyaXRlQnVmZmVyIHRyYW5zKSAoPD4gbGF6eUJ5dGVTdHJpbmcgdikKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHlwZXMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyMDAyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCkBAIC0wLDAgKzEsMTMwIEBACistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCit7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW9ycGhhbnMgIy19CisKK21vZHVsZSBUaHJpZnQuVHlwZXMgd2hlcmUKKworaW1wb3J0IERhdGEuRm9sZGFibGUgKGZvbGRsJykKK2ltcG9ydCBEYXRhLkhhc2hhYmxlICggSGFzaGFibGUsIGhhc2hXaXRoU2FsdCApCitpbXBvcnQgRGF0YS5JbnQKK2ltcG9ydCBUZXN0LlF1aWNrQ2hlY2suQXJiaXRyYXJ5CitpbXBvcnQgVGVzdC5RdWlja0NoZWNrLkdlbiAoZWxlbWVudHMpCitpbXBvcnQgRGF0YS5UZXh0LkxhenkgKFRleHQpCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgorCitpbnN0YW5jZSAoSGFzaGFibGUgYSkgPT4gSGFzaGFibGUgKFZlY3Rvci5WZWN0b3IgYSkgd2hlcmUKKyAgaGFzaFdpdGhTYWx0ID0gVmVjdG9yLmZvbGRsJyBoYXNoV2l0aFNhbHQKKworCit0eXBlIFR5cGVNYXAgPSBNYXAuSGFzaE1hcCBJbnQxNiAoVGV4dCwgVGhyaWZ0VHlwZSkKKworZGF0YSBUaHJpZnRWYWwgPSBUU3RydWN0IChNYXAuSGFzaE1hcCBJbnQxNiAoVGV4dCwgVGhyaWZ0VmFsKSkKKyAgICAgICAgICAgICAgIHwgVE1hcCBUaHJpZnRUeXBlIFRocmlmdFR5cGUgWyhUaHJpZnRWYWwsIFRocmlmdFZhbCldCisgICAgICAgICAgICAgICB8IFRMaXN0IFRocmlmdFR5cGUgW1RocmlmdFZhbF0KKyAgICAgICAgICAgICAgIHwgVFNldCBUaHJpZnRUeXBlIFtUaHJpZnRWYWxdCisgICAgICAgICAgICAgICB8IFRCb29sIEJvb2wKKyAgICAgICAgICAgICAgIHwgVEJ5dGUgSW50OAorICAgICAgICAgICAgICAgfCBUSTE2IEludDE2CisgICAgICAgICAgICAgICB8IFRJMzIgSW50MzIKKyAgICAgICAgICAgICAgIHwgVEk2NCBJbnQ2NAorICAgICAgICAgICAgICAgfCBUU3RyaW5nIExCUy5CeXRlU3RyaW5nCisgICAgICAgICAgICAgICB8IFRCaW5hcnkgTEJTLkJ5dGVTdHJpbmcKKyAgICAgICAgICAgICAgIHwgVERvdWJsZSBEb3VibGUKKyAgICAgICAgICAgICAgICAgZGVyaXZpbmcgKEVxLCBTaG93KQorCistLSBJbmZvcm1hdGlvbiBpcyBuZWVkZWQgaGVyZSBmb3IgY29sbGVjdGlvbiB0eXBlcyAoaWUgVF9TVFJVQ1QsIFRfTUFQLAorLS0gVF9MSVNULCBhbmQgVF9TRVQpIHNvIHRoYXQgd2Uga25vdyB3aGF0IHR5cGVzIHRob3NlIGNvbGxlY3Rpb25zIGFyZQorLS0gcGFyYW1ldGVyaXplZCBieS4gIEluIG1vc3QgcHJvdG9jb2xzLCB0aGlzIGNhbm5vdCBiZSBkaXNjZXJuZWQgZGlyZWN0bHkKKy0tIGZyb20gdGhlIGRhdGEgYmVpbmcgcmVhZC4KK2RhdGEgVGhyaWZ0VHlwZQorICAgID0gVF9TVE9QCisgICAgfCBUX1ZPSUQKKyAgICB8IFRfQk9PTAorICAgIHwgVF9CWVRFCisgICAgfCBUX0RPVUJMRQorICAgIHwgVF9JMTYKKyAgICB8IFRfSTMyCisgICAgfCBUX0k2NAorICAgIHwgVF9TVFJJTkcKKyAgICB8IFRfQklOQVJZCisgICAgfCBUX1NUUlVDVCBUeXBlTWFwCisgICAgfCBUX01BUCBUaHJpZnRUeXBlIFRocmlmdFR5cGUKKyAgICB8IFRfU0VUIFRocmlmdFR5cGUKKyAgICB8IFRfTElTVCBUaHJpZnRUeXBlCisgICAgICBkZXJpdmluZyAoIEVxLCBTaG93ICkKKworLS0gTk9URTogd2hlbiB1c2luZyB0b0VudW0gaW5mb3JtYXRpb24gYWJvdXQgcGFyYW1ldGl6ZWQgdHlwZXMgaXMgTk9UIHByZXNlcnZlZC4KKy0tIFRoaXMgZGVzaWduIGNob2ljZSBpcyBjb25zaXN0ZW50IHdvdGggdGhlIFRocmlmdCBpbXBsZW1lbnRhdGlvbiBpbiBvdGhlcgorLS0gbGFuZ3VhZ2VzCitpbnN0YW5jZSBFbnVtIFRocmlmdFR5cGUgd2hlcmUKKyAgICBmcm9tRW51bSBUX1NUT1AgICAgICAgPSAwCisgICAgZnJvbUVudW0gVF9WT0lEICAgICAgID0gMQorICAgIGZyb21FbnVtIFRfQk9PTCAgICAgICA9IDIKKyAgICBmcm9tRW51bSBUX0JZVEUgICAgICAgPSAzCisgICAgZnJvbUVudW0gVF9ET1VCTEUgICAgID0gNAorICAgIGZyb21FbnVtIFRfSTE2ICAgICAgICA9IDYKKyAgICBmcm9tRW51bSBUX0kzMiAgICAgICAgPSA4CisgICAgZnJvbUVudW0gVF9JNjQgICAgICAgID0gMTAKKyAgICBmcm9tRW51bSBUX1NUUklORyAgICAgPSAxMQorICAgIGZyb21FbnVtIFRfQklOQVJZICAgICA9IDExCisgICAgZnJvbUVudW0gKFRfU1RSVUNUIF8pID0gMTIKKyAgICBmcm9tRW51bSAoVF9NQVAgXyBfKSAgPSAxMworICAgIGZyb21FbnVtIChUX1NFVCBfKSAgICA9IDE0CisgICAgZnJvbUVudW0gKFRfTElTVCBfKSAgID0gMTUKKworICAgIHRvRW51bSAwICA9IFRfU1RPUAorICAgIHRvRW51bSAxICA9IFRfVk9JRAorICAgIHRvRW51bSAyICA9IFRfQk9PTAorICAgIHRvRW51bSAzICA9IFRfQllURQorICAgIHRvRW51bSA0ICA9IFRfRE9VQkxFCisgICAgdG9FbnVtIDYgID0gVF9JMTYKKyAgICB0b0VudW0gOCAgPSBUX0kzMgorICAgIHRvRW51bSAxMCA9IFRfSTY0CisgICAgdG9FbnVtIDExID0gVF9TVFJJTkcKKyAgICAtLSB0b0VudW0gMTEgPSBUX0JJTkFSWQorICAgIHRvRW51bSAxMiA9IFRfU1RSVUNUIE1hcC5lbXB0eQorICAgIHRvRW51bSAxMyA9IFRfTUFQIFRfVk9JRCBUX1ZPSUQKKyAgICB0b0VudW0gMTQgPSBUX1NFVCBUX1ZPSUQKKyAgICB0b0VudW0gMTUgPSBUX0xJU1QgVF9WT0lECisgICAgdG9FbnVtIHQgPSBlcnJvciAkICJJbnZhbGlkIFRocmlmdFR5cGUgIiArKyBzaG93IHQKKworZGF0YSBNZXNzYWdlVHlwZQorICAgID0gTV9DQUxMCisgICAgfCBNX1JFUExZCisgICAgfCBNX0VYQ0VQVElPTgorICAgIHwgTV9PTkVXQVkKKyAgICAgIGRlcml2aW5nICggRXEsIFNob3cgKQorCitpbnN0YW5jZSBFbnVtIE1lc3NhZ2VUeXBlIHdoZXJlCisgICAgZnJvbUVudW0gTV9DQUxMICAgICAgPSAgMQorICAgIGZyb21FbnVtIE1fUkVQTFkgICAgID0gIDIKKyAgICBmcm9tRW51bSBNX0VYQ0VQVElPTiA9ICAzCisgICAgZnJvbUVudW0gTV9PTkVXQVkgICAgPSAgNAorCisgICAgdG9FbnVtIDEgPSBNX0NBTEwKKyAgICB0b0VudW0gMiA9IE1fUkVQTFkKKyAgICB0b0VudW0gMyA9IE1fRVhDRVBUSU9OCisgICAgdG9FbnVtIDQgPSBNX09ORVdBWQorICAgIHRvRW51bSB0ID0gZXJyb3IgJCAiSW52YWxpZCBNZXNzYWdlVHlwZSAiICsrIHNob3cgdAorCitpbnN0YW5jZSBBcmJpdHJhcnkgTWVzc2FnZVR5cGUgd2hlcmUKKyAgYXJiaXRyYXJ5ID0gZWxlbWVudHMgW01fQ0FMTCwgTV9SRVBMWSwgTV9FWENFUFRJT04sIE1fT05FV0FZXQpkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvQmluYXJ5U3BlYy5ocyBiL2xpYi9ocy90ZXN0L0JpbmFyeVNwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MmZhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L0JpbmFyeVNwZWMuaHMKQEAgLTAsMCArMSw5MSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBCaW5hcnlTcGVjIHdoZXJlCisKK2ltcG9ydCBUZXN0LkhzcGVjCitpbXBvcnQgVGVzdC5Ic3BlYy5RdWlja0NoZWNrIChwcm9wKQorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5DaGFyOCBhcyBDCisKK2ltcG9ydCBUaHJpZnQuVHlwZXMKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CisKK3NwZWMgOjogU3BlYworc3BlYyA9IGRvCisgIGRlc2NyaWJlICJCaW5hcnlQcm90b2NvbCIgJCBkbworICAgIGRlc2NyaWJlICJkb3VibGUiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgdmFsID0gMiAqKiA1MworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChURG91YmxlIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDgKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgWzY3LCA2NCwgMCwgMCwgMCwgMCwgMCwgMF0KKworICAgICAgaXQgInJlYWRzIGluIGJpZyBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IGJpbiA9IExCUy5wYWNrIFs2NywgNjQsIDAsIDAsIDAsIDAsIDAsIDBdCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIGJpbgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byBUX0RPVUJMRQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVERvdWJsZSAkIDIgKiogNTMpCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgVERvdWJsZSB2YWwKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVERvdWJsZSB2YWwpCisKKyAgICBkZXNjcmliZSAic3RyaW5nIiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSBDLnBhY2sgImFhYSIKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFN0cmluZyB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyA3CisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbMCwgMCwgMCwgMywgOTcsIDk3LCA5N10KKworICAgIGRlc2NyaWJlICJiaW5hcnkiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIFs0MiwgNDMsIDQ0XSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWzAsIDAsIDAsIDMsIDQyLCA0MywgNDRdCisKKyAgICAgIGl0ICJyZWFkcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIExCUy5wYWNrIFswLCAwLCAwLCAzLCA0MiwgNDMsIDQ0XQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9Db21wYWN0U3BlYy5ocyBiL2xpYi9ocy90ZXN0L0NvbXBhY3RTcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDBlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9Db21wYWN0U3BlYy5ocwpAQCAtMCwwICsxLDgxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIENvbXBhY3RTcGVjIHdoZXJlCisKK2ltcG9ydCBUZXN0LkhzcGVjCitpbXBvcnQgVGVzdC5Ic3BlYy5RdWlja0NoZWNrIChwcm9wKQorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCitpbXBvcnQgVGhyaWZ0LlR5cGVzCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkNvbXBhY3RQcm90b2NvbCIgJCBkbworICAgIGRlc2NyaWJlICJkb3VibGUiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgaW4gbGl0dGxlIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgdmFsID0gMiAqKiA1MworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVERvdWJsZSB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZEFsbCB0cmFucyA4CisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYFswLCAwLCAwLCAwLCAwLCAwLCA2NCwgNjddCisKKyAgICAgIGl0ICJyZWFkcyBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCBiaW4gPSBMQlMucGFjayBbMCwgMCwgMCwgMCwgMCwgMCwgNjQsIDY3XQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgYmluCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChURG91YmxlICQgMiAqKiA1MykKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgVERvdWJsZSB2YWwKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVERvdWJsZSB2YWwpCisKKyAgICBkZXNjcmliZSAiYmluYXJ5IiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbMywgNDIsIDQzLCA0NF0KKworICAgICAgaXQgInJlYWRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIExCUy5wYWNrIFszLCA0MiwgNDMsIDQ0XQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvSlNPTlNwZWMuaHMgYi9saWIvaHMvdGVzdC9KU09OU3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJjODI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvSlNPTlNwZWMuaHMKQEAgLTAsMCArMSwyMjUgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgSlNPTlNwZWMgd2hlcmUKKworaW1wb3J0IFRlc3QuSHNwZWMKK2ltcG9ydCBUZXN0LkhzcGVjLlF1aWNrQ2hlY2sgKHByb3ApCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIEMKKworaW1wb3J0IFRocmlmdC5UeXBlcworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5KU09OCisKK3RTdHJpbmcgOjogW0NoYXJdIC0+IFRocmlmdFZhbAordFN0cmluZyA9IFRTdHJpbmcgLiBDLnBhY2sKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkpTT05Qcm90b2NvbCIgJCBkbworICAgIGRlc2NyaWJlICJib29sIiAkIGRvCisgICAgICBpdCAid3JpdGVzIHRydWUgYXMgMSIgJCBkbworICAgICAgICBsZXQgdmFsID0gVHJ1ZQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJvb2wgdmFsKQorICAgICAgICBiaW4gPC10UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbJzEnXQorCisgICAgICBpdCAid3JpdGVzIGZhbHNlIGFzIDAiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IEZhbHNlCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQm9vbCB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbJzAnXQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCBUQm9vbCB2YWwKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIFRfQk9PTAorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCb29sIHZhbCkKKworICAgIGRlc2NyaWJlICJzdHJpbmciICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTdHJpbmcgJCBDLnBhY2sgIlwiYSIpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiXCJcXFwiYVwiIgorCisgICAgICBpdCAicmVhZHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgQy5wYWNrICJcIlxcXCJhXCIiCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NUUklORykKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTdHJpbmcgJCBDLnBhY2sgIlwiYSIpCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFN0cmluZyAkIEMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9TVFJJTkcpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVFN0cmluZyAkIEMucGFjayB2YWwpCisKKyAgICBkZXNjcmliZSAiYmluYXJ5IiAkIGRvCisgICAgICBpdCAid3JpdGVzIHdpdGggcGFkZGluZyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIFsxXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJcIkFRPT1cIiIKKworICAgICAgaXQgInJlYWRzIHdpdGggcGFkZGluZyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBDLnBhY2sgIlwiQVE9PVwiIgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzFdKQorCisgICAgICBpdCAicmVhZHMgd2l0aG91dCBwYWRkaW5nIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIEMucGFjayAiXCJBUVwiIgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzFdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKworICAgIGRlc2NyaWJlICJsaXN0IiAkIGRvCisgICAgICBpdCAid3JpdGVzIGVtcHR5IGxpc3QiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRMaXN0IFRfQllURSBbXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJbXCJpOFwiLDBdIgorCisgICAgICBpdCAicmVhZHMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9MSVNUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRMaXN0IFRfQllURSBbXSkKKworICAgICAgaXQgIndyaXRlcyBzaW5nbGUgZWxlbWVudCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVExpc3QgVF9CWVRFIFtUQnl0ZSAwXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJbXCJpOFwiLDEsMF0iCisKKyAgICAgIGl0ICJyZWFkcyBzaW5nbGUgZWxlbWVudCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwxLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTElTVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTGlzdCBUX0JZVEUgW1RCeXRlIDBdKQorCisgICAgICBpdCAicmVhZHMgZWxlbWVudHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMiw0MiwgNDNdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTElTVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTGlzdCBUX0JZVEUgW1RCeXRlIDQyLCBUQnl0ZSA0M10pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIChUTGlzdCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvICQgVF9MSVNUIFRfU1RSSU5HCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVExpc3QgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisKKyAgICBkZXNjcmliZSAic2V0IiAkIGRvCisgICAgICBpdCAid3JpdGVzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU2V0IFRfQllURSBbXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJbXCJpOFwiLDBdIgorCisgICAgICBpdCAicmVhZHMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TRVQgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFNldCBUX0JZVEUgW10pCisKKyAgICAgIGl0ICJyZWFkcyBzaW5nbGUgZWxlbWVudCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwxLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU0VUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTZXQgVF9CWVRFIFtUQnl0ZSAwXSkKKworICAgICAgaXQgInJlYWRzIGVsZW1lbnRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDIsNDIsIDQzXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NFVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU2V0IFRfQllURSBbVEJ5dGUgNDIsIFRCeXRlIDQzXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgKFRTZXQgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAkIFRfU0VUIFRfU1RSSU5HCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVFNldCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKworICAgIGRlc2NyaWJlICJtYXAiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRNYXAgVF9CWVRFIFRfQllURSBbXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIltcImk4XCIsXCJpOFwiLDAse31dIgorCisgICAgICBpdCAicmVhZHMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsXCJpOFwiLDAse31dIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTUFQIFRfQllURSBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTWFwIFRfQllURSBUX0JZVEUgW10pCisKKyAgICAgIGl0ICJyZWFkcyBzdHJpbmctc3RyaW5nIiAkIGRvCisgICAgICAgIGxldCBiaW4gPSAiW1wic3RyXCIsXCJzdHJcIiwyLHtcImFcIjpcIjJcIixcImJcIjpcImJsYWhcIn1dIgorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayBiaW4pCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX01BUCBUX1NUUklORyBUX1NUUklORykKKyAgICAgICAgdmFsYHNob3VsZEJlYCAoVE1hcCBUX1NUUklORyBUX1NUUklORyBbKHRTdHJpbmcgImEiLCB0U3RyaW5nICIyIiksICh0U3RyaW5nICJiIiwgdFN0cmluZyAiYmxhaCIpXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgKFRNYXAgVF9TVFJJTkcgVF9TVFJJTkcgJCBtYXAgdG9LViB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAkIFRfTUFQIFRfU1RSSU5HIFRfU1RSSU5HCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVE1hcCBUX1NUUklORyBUX1NUUklORyAkIG1hcCB0b0tWIHZhbCkKKyAgICAgICAgd2hlcmUKKyAgICAgICAgICB0b0tWIHYgPSAodFN0cmluZyB2LCB0U3RyaW5nIHYpCisKZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L1NwZWMuaHMgYi9saWIvaHMvdGVzdC9TcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzlhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9TcGVjLmhzCkBAIC0wLDAgKzEsMzggQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCistLSBPdXIgQ0kgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggYXV0byBkaXNjb3Zlci4KKy0tIE5lZWQgdG8gYWRkIGJ1aWxkLXRpbWUgUEFUSCB2YXJpYWJsZSB0byBoc3BlYy1kaXNjb3ZlciBkaXIgZnJvbSBDTWFrZQorLS0gb3IgaW5zdGFsbCBoc3BlYyBzeXN0ZW0td2lkZSBmb3IgdGhlIGZvbGxvd2luZyB0byB3b3JrLgorLS0gey0jIE9QVElPTlNfR0hDIC1GIC1wZ21GIGhzcGVjLWRpc2NvdmVyICMtfQorCitpbXBvcnQgVGVzdC5Ic3BlYworCitpbXBvcnQgcXVhbGlmaWVkIEJpbmFyeVNwZWMKK2ltcG9ydCBxdWFsaWZpZWQgQ29tcGFjdFNwZWMKK2ltcG9ydCBxdWFsaWZpZWQgSlNPTlNwZWMKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IGhzcGVjIHNwZWMKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkJpbmFyeSIgQmluYXJ5U3BlYy5zcGVjCisgIGRlc2NyaWJlICJDb21wYWN0IiBDb21wYWN0U3BlYy5zcGVjCisgIGRlc2NyaWJlICJKU09OIiBKU09OU3BlYy5zcGVjCmRpZmYgLS1naXQgYS9saWIvaHMvdGhyaWZ0LmNhYmFsIGIvbGliL2hzL3RocmlmdC5jYWJhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE1NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3RocmlmdC5jYWJhbApAQCAtMCwwICsxLDg0IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworTmFtZTogICAgICAgICAgIHRocmlmdAorVmVyc2lvbjogICAgICAgIDEuMC4wCitDYWJhbC1WZXJzaW9uOiAgMS4yNAorTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQorQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KK0J1aWxkLVR5cGU6ICAgICBTaW1wbGUKK1N5bm9wc2lzOiAgICAgICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCitIb21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKK01haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKK0xpY2Vuc2UtRmlsZTogICBMSUNFTlNFCisKK0Rlc2NyaXB0aW9uOgorICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCisKK2ZsYWcgbmV0d29yay11cmkKKyAgIGRlc2NyaXB0aW9uOiBHZXQgTmV0d29yay5VUkkgZnJvbSB0aGUgbmV0d29yay11cmkgcGFja2FnZQorICAgZGVmYXVsdDogVHJ1ZQorCitMaWJyYXJ5CisgIEhzLVNvdXJjZS1EaXJzOgorICAgIHNyYworICBCdWlsZC1EZXBlbmRzOgorICAgIGJhc2UgPj0gNCwgYmFzZSA8IDUsIGNvbnRhaW5lcnMsIGdoYy1wcmltLCBhdHRvcGFyc2VjLCBiaW5hcnksIGJ5dGVzdHJpbmcgPj0gMC4xMCwgYmFzZTY0LWJ5dGVzdHJpbmcsIGhhc2hhYmxlLCBIVFRQLCB0ZXh0LCBoc3BlYy1jb3JlID4gMi40LjAsIHVub3JkZXJlZC1jb250YWluZXJzID49IDAuMi42LCB2ZWN0b3IgPj0gMC4xMC4xMi4yLCBRdWlja0NoZWNrID49IDIuOC4yLCBzcGxpdAorICBpZiBmbGFnKG5ldHdvcmstdXJpKQorICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrLXVyaSA+PSAyLjYsIG5ldHdvcmsgPj0gMi42CisgIGVsc2UKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yayA8IDIuNgorICBFeHBvc2VkLU1vZHVsZXM6CisgICAgVGhyaWZ0LAorICAgIFRocmlmdC5BcmJpdHJhcmllcworICAgIFRocmlmdC5Qcm90b2NvbCwKKyAgICBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyLAorICAgIFRocmlmdC5Qcm90b2NvbC5CaW5hcnksCisgICAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QsCisgICAgVGhyaWZ0LlByb3RvY29sLkpTT04sCisgICAgVGhyaWZ0LlNlcnZlciwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LAorICAgIFRocmlmdC5UcmFuc3BvcnQuRW1wdHksCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5IZWFkZXIsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50LAorICAgIFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnksCisgICAgVGhyaWZ0LlR5cGVzCisgIERlZmF1bHQtTGFuZ3VhZ2U6IEhhc2tlbGwyMDEwCisgIERlZmF1bHQtRXh0ZW5zaW9uczoKKyAgICBEZXJpdmVEYXRhVHlwZWFibGUsCisgICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKKyAgICBGbGV4aWJsZUluc3RhbmNlcywKKyAgICBLaW5kU2lnbmF0dXJlcywKKyAgICBNYWdpY0hhc2gsCisgICAgUmFua05UeXBlcywKKyAgICBSZWNvcmRXaWxkQ2FyZHMsCisgICAgU2NvcGVkVHlwZVZhcmlhYmxlcywKKyAgICBUeXBlU3lub255bUluc3RhbmNlcworCitUZXN0LVN1aXRlIHNwZWMKKyAgVHlwZTogZXhpdGNvZGUtc3RkaW8tMS4wCisgIEhzLVNvdXJjZS1EaXJzOiB0ZXN0CisgIEdoYy1PcHRpb25zOiAtV2FsbAorICBtYWluLWlzOiBTcGVjLmhzCisgIEJ1aWxkLURlcGVuZHM6IGJhc2UsIHRocmlmdCwgaHNwZWMsIFF1aWNrQ2hlY2sgPj0gMi44LjIsIGJ5dGVzdHJpbmcgPj0gMC4xMCwgdW5vcmRlcmVkLWNvbnRhaW5lcnMgPj0gMC4yLjYKKyAgRGVmYXVsdC1MYW5ndWFnZTogSGFza2VsbDIwMTAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL0NNYWtlTGlzdHMudHh0IGIvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwNjRlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsODcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZihBTkRST0lEKQorICAgIHNldChUSFJJRlRfQUFSIG91dHB1dHMvYWFyL3RocmlmdC1kZWJ1Zy5hYXIgb3V0cHV0cy9hYXIvdGhyaWZ0LXJlbGVhc2UuYWFyKQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICR7VEhSSUZUX0FBUn0KKyAgICAgICAgQ09NTUFORCAke0dSQURMRV9FWEVDVVRBQkxFfQorICAgICAgICAgICAgLXAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9hbmRyb2lkIgorICAgICAgICAgICAgIi1QYnVpbGREaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2FuZHJvaWQvYnVpbGQiIGFzc2VtYmxlCisgICAgKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KHRocmlmdF9hYXIgQUxMIERFUEVORFMgJHtUSFJJRlRfQUFSfSkKKworZWxzZShBTkRST0lEKQorCisgICAgaWYoSVNfQUJTT0xVVEUgIiR7TElCX0lOU1RBTExfRElSfSIpCisgICAgICAgIHNldChKQVZBX0lOU1RBTExfRElSICIke0xJQl9JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZWxzZSgpCisgICAgICAgIHNldChKQVZBX0lOU1RBTExfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS8ke0xJQl9JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZW5kaWYoKQorCisgICAgaWYoSVNfQUJTT0xVVEUgIiR7RE9DX0lOU1RBTExfRElSfSIpCisgICAgICAgIHNldChKQVZBX0RPQ19JTlNUQUxMX0RJUiAiJHtET0NfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoSkFWQV9ET0NfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9LyR7RE9DX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbmRpZigpCisKKyAgICBhZGRfY3VzdG9tX3RhcmdldChUaHJpZnRKYXZhIEFMTAorICAgICAgICBDT01NRU5UICJCdWlsZGluZyBKYXZhIGxpYnJhcnkgdXNpbmcgR3JhZGxlIFdyYXBwZXIiCisgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IGFzc2VtYmxlCisgICAgICAgICAgICAtLWNvbnNvbGU9cGxhaW4gLS1uby1kYWVtb24KKyAgICAgICAgICAgIC1QcmVsZWFzZT10cnVlCisgICAgICAgICAgICAtUHRocmlmdC52ZXJzaW9uPSR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgICAgICAiLVBidWlsZC5kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkIgorICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICApCisKKyAgICAjIEVuYWJsZSBwdWJsaXNoaW5nIGZyb20gQ01ha2UgaWYgdGhlIHB1Ymxpc2hpbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKKyAgICBhZGRfY3VzdG9tX3RhcmdldChNYXZlblB1Ymxpc2gKKyAgICAgICAgQ09NTUVOVCAiUHVibGlzaGluZyBKYXZhIExpYnJhcnkgdG8gQXBhY2hlIE1hdmVuIHN0YWdpbmciCisgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IGNsZWFuIHVwbG9hZEFyY2hpdmVzCisgICAgICAgICAgICAtLWNvbnNvbGU9cGxhaW4gLS1uby1kYWVtb24KKyAgICAgICAgICAgIC1QcmVsZWFzZT10cnVlCisgICAgICAgICAgICAtUHRocmlmdC52ZXJzaW9uPSR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgICAgICAiLVBidWlsZC5kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkIgorICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICApCisKKyAgICAjIEhvb2sgdGhlIENNYWtlIGluc3RhbGwgcHJvY2VzcyB0byB0aGUgcmVzdWx0cyBmcm9tIG1ha2UgQUxMLgorICAgICMgVGhpcyB3b3JrcyBiZXN0IHdoZW4gJ21ha2UgYWxsICYmIHN1ZG8gbWFrZSBpbnN0YWxsL2Zhc3QnIGlzIHVzZWQuCisgICAgIyBVc2luZyBzbGFzaCB0byBlbmQgdGhlIHNvdXJjZSBsb2NhdGlvbiB0byBhdm9pZCBjb3B5aW5nIHRoZSBkaXJlY3RvcnkgcGF0aC4KKyAgICBpbnN0YWxsKERJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQvbGlicy8KKyAgICAgICAgICAgIERFU1RJTkFUSU9OICR7SkFWQV9JTlNUQUxMX0RJUn0KKyAgICAgICAgICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gImxpYnRocmlmdC0ke3RocmlmdF9WRVJTSU9OfS5qYXIiKQorICAgIGluc3RhbGwoRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZC9kZXBzLworICAgICAgICAgICAgREVTVElOQVRJT04gJHtKQVZBX0lOU1RBTExfRElSfQorICAgICAgICAgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5qYXIiKQorICAgIGluc3RhbGwoRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZC9kb2NzL2phdmFkb2MvCisgICAgICAgICAgICBERVNUSU5BVElPTiAke0pBVkFfRE9DX0lOU1RBTExfRElSfSkKKworICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGFkZF90ZXN0KE5BTUUgSmF2YVRlc3QKKyAgICAgICAgICAgICAgICBDT01NQU5EICR7R1JBRExFV19FWEVDVVRBQkxFfSAke0dSQURMRV9PUFRTfSB0ZXN0CisgICAgICAgICAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgICAgICAgICAtUHJlbGVhc2U9dHJ1ZQorICAgICAgICAgICAgICAgICAgICAtUHRocmlmdC52ZXJzaW9uPSR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgICAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgICAgICAgICAgICAgICItUHRocmlmdC5jb21waWxlcj0ke1RIUklGVF9DT01QSUxFUn0iCisgICAgICAgICAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICAgIGVuZGlmKCkKK2VuZGlmKEFORFJPSUQpCmRpZmYgLS1naXQgYS9saWIvamF2YS9NYWtlZmlsZS5hbSBiL2xpYi9qYXZhL01ha2VmaWxlLmFtCmluZGV4IGNiMTMzMmUuLjY1OTgxY2EgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL01ha2VmaWxlLmFtCisrKyBiL2xpYi9qYXZhL01ha2VmaWxlLmFtCkBAIC0xNywyMiArMTcsNTYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLUVYVFJBX0RJU1QgPSBidWlsZC54bWwgaXZ5LnhtbCBzcmMgdGVzdAotCiBleHBvcnQgQ0xBU1NQQVRICiAKIGFsbC1sb2NhbDoKLQkkKEFOVCkgJChBTlRfRkxBR1MpCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIGFzc2VtYmxlIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS0tY29uc29sZT1wbGFpbgogCiBpbnN0YWxsLWV4ZWMtaG9vazoKLQkkKEFOVCkgJChBTlRfRkxBR1MpIGluc3RhbGwgLURpbnN0YWxsLnBhdGg9JChERVNURElSKSQoSkFWQV9QUkVGSVgpIFwKLQkJLURpbnN0YWxsLmphdmFkb2MucGF0aD0kKERFU1RESVIpJChkb2NkaXIpL2phdmEKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgaW5zdGFsbCBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVBpbnN0YWxsLnBhdGg9JChERVNURElSKSQoSkFWQV9QUkVGSVgpIFwKKwkJLVBpbnN0YWxsLmphdmFkb2MucGF0aD0kKERFU1RESVIpJChkb2NkaXIpL2phdmEgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS0tY29uc29sZT1wbGFpbgogCi0jIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCiBjbGVhbi1sb2NhbDoKLQlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAotCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBjbGVhbiAtLWNvbnNvbGU9cGxhaW4KIAotY2hlY2stbG9jYWw6IGFsbAotCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorcHJlY3Jvc3M6ICQoVEhSSUZUKQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBzaGFkb3dKYXIgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLVB0aHJpZnQuY29tcGlsZXI9JChUSFJJRlQpIFwKKwkJLS1jb25zb2xlPXBsYWluCiAKK2NoZWNrLWxvY2FsOiAkKFRIUklGVCkKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgdGVzdCBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktUHRocmlmdC5jb21waWxlcj0kKFRIUklGVCkgXAorCQktLWNvbnNvbGU9cGxhaW4KKworbWF2ZW4tcHVibGlzaDoKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgdXBsb2FkQXJjaGl2ZXMgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLS1jb25zb2xlPXBsYWluCisKK0VYVFJBX0RJU1QgPSBcCisJYnVpbGQuZ3JhZGxlIFwKKwlncmFkbGUucHJvcGVydGllcyBcCisJc2V0dGluZ3MuZ3JhZGxlIFwKKwlncmFkbGUgXAorCWdyYWRsZXcgXAorCWdyYWRsZXcuYmF0IFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJYW5kcm9pZCBcCisJc3JjIFwKKwl0ZXN0IFwKKwljb2RlX3F1YWxpdHlfdG9vbHMgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL2phdmEvUkVBRE1FIGIvbGliL2phdmEvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjhkMzUxLi4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLVRocmlmdCBKYXZhIFNvZnR3YXJlIExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVXNpbmcgVGhyaWZ0IHdpdGggSmF2YQotPT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgVGhyaWZ0IEphdmEgc291cmNlIGlzIG5vdCBidWlsZCB1c2luZyB0aGUgR05VIHRvb2xzLCBidXQgcmF0aGVyIHVzZXMKLXRoZSBBcGFjaGUgQW50IGJ1aWxkIHN5c3RlbSwgd2hpY2ggdGVuZHMgdG8gYmUgcHJlZG9taW5hbnQgYW1vbmdzdCBKYXZhCi1kZXZlbG9wZXJzLgotCi1UbyBjb21waWxlIHRoZSBKYXZhIFRocmlmdCBsaWJyYXJpZXMsIHNpbXBseSBkbyB0aGUgZm9sbG93aW5nOgotCi1hbnQKLQotWWVwLCB0aGF0J3MgZWFzeS4gTG9vayBmb3IgbGlidGhyaWZ0LmphciBpbiB0aGUgYmFzZSBkaXJlY3RvcnkuCi0KLVRvIGluY2x1ZGUgVGhyaWZ0IGluIHlvdXIgYXBwbGljYXRpb25zIHNpbXBseSBhZGQgbGlidGhyaWZ0LmphciB0byB5b3VyCi1jbGFzc3BhdGgsIG9yIGluc3RhbGwgaWYgaW4geW91ciBkZWZhdWx0IHN5c3RlbSBjbGFzc3BhdGggb2YgY2hvaWNlLgotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotCi1BcGFjaGUgQW50Ci1odHRwOi8vYW50LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS9saWIvamF2YS9SRUFETUUubWQgYi9saWIvamF2YS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1ZjBkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL1JFQURNRS5tZApAQCAtMCwwICsxLDE3NiBAQAorVGhyaWZ0IEphdmEgU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitCdWlsZGluZyBhbmQgaW5zdGFsbGluZyBmcm9tIHNvdXJjZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2hlbiB1c2luZyBhIENNYWtlIGJ1aWxkIGZyb20gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb24gTGludXggdGhlCitlYXNpZXN0IHdheSB0byBidWlsZCBhbmQgaW5zdGFsbCBpcyB0aGlzIHNpbXBsZSBjb21tYW5kIGxpbmU6CisKKyAgICBtYWtlIGFsbCAmJiBzdWRvIG1ha2UgaW5zdGFsbC9mYXN0CisKK0l0IGlzIGltcG9ydGFudCB0byB1c2UgdGhlIGluc3RhbGwvZmFzdCBvcHRpb24gdG8gZWxpbWluYXRlCit0aGUgYXV0b21hdGljIHJlYnVpbGQgYnkgZGVwZW5kZW5jeSB0aGF0IGNhdXNlcyBpc3N1ZXMgYmVjYXVzZQordGhlIGJ1aWxkIHRvb2xpbmcgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGNhY2hlZCBmaWxlcyBpbiB0aGUKK3VzZXIgaG9tZSBkaXJlY3RvcnkgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiBJbnN0ZWFkIHRoaXMgYnVpbGRzCit0aGUgY29kZSBpbiB0aGUgZXhwZWN0ZWQgbG9jYWwgYnVpbGQgdHJlZSBhbmQgdGhlbiB1c2VzIENNYWtlCitpbnN0YWxsIGNvZGUgdG8gY29weSB0byB0aGUgdGFyZ2V0IGRlc3RpbmF0aW9uLgorCitCdWlsZGluZyBUaHJpZnQgd2l0aCBHcmFkbGUgd2l0aG91dCBDTWFrZS9BdXRvY29uZgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIFRocmlmdCBKYXZhIHNvdXJjZSBpcyBub3QgYnVpbGQgdXNpbmcgdGhlIEdOVSB0b29scywgYnV0IHJhdGhlciB1c2VzCit0aGUgR3JhZGxlIGJ1aWxkIHN5c3RlbSwgd2hpY2ggdGVuZHMgdG8gYmUgcHJlZG9taW5hbnQgYW1vbmdzdCBKYXZhCitkZXZlbG9wZXJzLgorCitUbyBjb21waWxlIHRoZSBKYXZhIFRocmlmdCBsaWJyYXJpZXMsIHNpbXBseSBkbyB0aGUgZm9sbG93aW5nOgorCisgICAgLi9ncmFkbGV3CisKK1llcCwgdGhhdCdzIGVhc3kuIExvb2sgZm9yIGxpYnRocmlmdC08dmVyc2lvbj4uamFyIGluIHRoZSBidWlsZC9saWJzIGRpcmVjdG9yeS4KKworVGhlIGRlZmF1bHQgYnVpbGQgd2lsbCBydW4gdGhlIHVuaXQgdGVzdHMgd2hpY2ggZXhwZWN0IGEgdXNhYmxlCitUaHJpZnQgY29tcGlsZXIgdG8gZXhpc3Qgb24gdGhlIHN5c3RlbS4gWW91IGhhdmUgdHdvIGNob2ljZXMgZm9yCit0aGF0LgorCisqIEJ1aWxkIHRoZSBUaHJpZnQgZXhlY3V0YWJsZSBmcm9tIHNvdXJjZSBhdCB0aGUgZGVmYXVsdAorICBsb2NhdGlvbiBpbiB0aGUgc291cmNlIHRyZWUuIFRoZSBwcm9qZWN0IGlzIGNvbmZpZ3VyZWQKKyAgdG8gbG9vayBmb3IgaXQgdGhlcmUuCisqIEluc3RhbGwgdGhlIHB1Ymxpc2hlZCBiaW5hcnkgZGlzdHJpYnV0aW9uIHRvIGhhdmUgVGhyaWZ0CisgIGV4ZWN1dGFibGUgaW4gYSBrbm93biBsb2NhdGlvbiBhbmQgYWRkIHRoZSBwYXRoIHRvIHRoZQorICB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZSB1c2luZyB0aGUgcHJvcGVydHkgbmFtZQorICAidGhyaWZ0LmNvbXBpbGVyIi4gRm9yIGV4YW1wbGUgdGhpcyB3b3VsZCBzZXQgdGhlIHBhdGggaW4KKyAgYSBXaW5kb3dzIGJveCBpZiBUaHJpZnQgd2FzIGluc3RhbGxlZCB1bmRlciBDOlxUaHJpZnQKKworICAgIHRocmlmdC5jb21waWxlcj1DOi9UaHJpZnQvdGhyaWZ0LmV4ZQorCitUbyBqdXN0IGJ1aWxkIHRoZSBsaWJyYXJ5IHdpdGhvdXQgcnVubmluZyB1bml0IHRlc3RzIHlvdSBzaW1wbHkgZG8gdGhpcy4KKworICAgIC4vZ3JhZGxldyBhc3NlbWJsZQorCitUbyBpbnN0YWxsIHRoZSBsaWJyYXJ5IGluIHRoZSBsb2NhbCBNYXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uCit3aGVyZSBvdGhlciBNYXZlbiBvciBHcmFkbGUgYnVpbGRzIGNhbiByZWZlcmVuY2UgaXQgc2ltcGx5IGRvIHRoaXMuCisKKyAgICAuL2dyYWRsZXcgaW5zdGFsbAorCitUaGUgbGlicmFyeSB3aWxsIGJlIHBsYWNlZCBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5IHVuZGVyIC5tMi9yZXBvc2l0b3J5CisKK1RvIGluY2x1ZGUgVGhyaWZ0IGluIHlvdXIgYXBwbGljYXRpb25zIHNpbXBseSBhZGQgbGlidGhyaWZ0LmphciB0byB5b3VyCitjbGFzc3BhdGgsIG9yIGluc3RhbGwgaWYgaW4geW91ciBkZWZhdWx0IHN5c3RlbSBjbGFzc3BhdGggb2YgY2hvaWNlLgorCisKK0J1aWxkIFRocmlmdCBiZWhpbmQgYSBwcm94eToKKworICAgIC4vZ3JhZGxldyAtRGh0dHAucHJveHlIb3N0PW15cHJveHlob3N0IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCAtRGh0dHAucHJveHlVc2VyPXRocmlmdHVzZXIgLURodHRwLnByb3h5UGFzc3dvcmQ9dG9wc2VjcmV0CisKK29yIHZpYQorCisgICAgLi9jb25maWd1cmUgLS13aXRoLWphdmEgR1JBRExFX09QVFM9Jy1EaHR0cC5wcm94eUhvc3Q9bXlwcm94eWhvc3QgLURodHRwLnByb3h5UG9ydD04MDgwIC1EaHR0cC5wcm94eVVzZXI9dGhyaWZ0dXNlciAtRGh0dHAucHJveHlQYXNzd29yZD10b3BzZWNyZXQnCisKKworVW5pdCBUZXN0IEhUTUwgUmVwb3J0cworPT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgYnVpbGQgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGFuIEhUTUwgVW5pdCBUZXN0IHJlcG9ydC4gVGhpcyBjYW4gYmUgZm91bmQKK3VuZGVyIGJ1aWxkL3JlcG9ydHMvdGVzdHMvdGVzdC9pbmRleC5odG1sLiBJdCBjYW4gYmUgdmlld2VkIHdpdGggYSBicm93c2VyCitkaXJlY3RseSBmcm9tIHRoYXQgbG9jYXRpb24uCisKKworQ2xvdmVyIENvZGUgQ292ZXJhZ2UgZm9yIFRocmlmdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgYnVpbGQgd2lsbCBvcHRpb25hbGx5IGdlbmVyYXRlIENsb3ZlciBDb2RlIGNvdmVyYWdlIGlmIHRoZSBHcmFkbGUgcHJvcGVydHkKK2BjbG92ZXJFbmFibGVkPXRydWVgIGlzIHNldCBpbiB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgb3Igb24gdGhlIGNvbW1hbmQgbGluZQordmlhIGAtUGNsb3ZlckVuYWJsZWQ9dHJ1ZWAuIFRoZSBnZW5lcmF0ZWQgcmVwb3J0IGNhbiBiZSBmb3VuZCB1bmRlciB0aGUgbG9jYXRpb24KK2J1aWxkL3JlcG9ydHMvY2xvdmVyL2h0bWwvaW5kZXguaHRtbC4gSXQgY2FuIGJlIHZpZXdlZCB3aXRoIGEgYnJvd3NlcgorZGlyZWN0bHkgZnJvbSB0aGF0IGxvY2F0aW9uLiBBZGRpdGlvbmFsbHksIGEgUERGIHJlcG9ydCBpcyBnZW5lcmF0ZWQgYW5kIGlzIGZvdW5kCit1bmRlciB0aGUgbG9jYXRpb24gYnVpbGQvcmVwb3J0cy9jbG92ZXIvY2xvdmVyLnBkZi4KKworVGhlIGZvbGxvd2luZyBjb21tYW5kIHdpbGwgYnVpbGQsIHVuaXQgdGVzdCwgYW5kIGdlbmVyYXRlIENsb3ZlciByZXBvcnRzOgorCisgICAgLi9ncmFkbGV3IC1QY2xvdmVyRW5hYmxlZD10cnVlCisKKworUHVibGlzaGluZyBNYXZlbiBBcnRpZmFjdHMgdG8gTWF2ZW4gQ2VudHJhbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgQXV0b21ha2UgYnVpbGQgZ2VuZXJhdGVzIGEgTWFrZWZpbGUgdGhhdCBwcm92aWRlcyB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzCit3aGVuIHlvdSBydW4gdGhlIGJ1aWxkIHByb3ZpZGVkIHRoZSBjb25maWd1cmUuYWMgaGFzIGJlZW4gc2V0IHdpdGggdGhlIGNvcnJlY3QKK3ZlcnNpb24gbnVtYmVyLiBUaGUgR3JhZGxlIGJ1aWxkIHdpbGwgcmVjZWl2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhlIGJ1aWxkLgorVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgQ01ha2UgYnVpbGQsIHRoZSB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmUuYWMgZmlsZSB3aWxsCitiZSB1c2VkIGlmIHlvdSBleGVjdXRlIHRoZXNlIGNvbW1hbmRzOgorCisgICAgbWFrZSBtYXZlbi1wdWJsaXNoICAgLS0gVGhpcyBpcyBmb3IgYW4gQXV0b21ha2UgTGludXggYnVpbGQKKyAgICBtYWtlIE1hdmVuUHVibGlzaCAgICAtLSBUaGlzIGlzIGZvciBhIENNYWtlIGdlbmVyYXRlZCBidWlsZAorCitUaGUgdXBsb2FkQXJjaGl2ZXMgdGFzayBpbiBHcmFkbGUgaXMgcHJlY29uZmlndXJlZCB3aXRoIGFsbCBuZWNlc3NhcnkgZGV0YWlscwordG8gc2lnbiBhbmQgcHVibGlzaCB0aGUgYXJ0aWZhY3RzIGZyb20gdGhlIGJ1aWxkIHRvIHRoZSBBcGFjaGUgTWF2ZW4gc3RhZ2luZworcmVwb3NpdG9yeS4gVGhlIHRhc2sgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBleHRlcm5hbGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgdG8KK2F1dGhlbnRpY2F0ZSB0byB0aGUgcmVwb3NpdG9yeSBhbmQgc2lnbiB0aGUgYXJ0aWZhY3RzLiBUaGUgcHJlZmVycmVkIGFwcHJvYWNoCitpcyB0byBjcmVhdGUgb3IgZWRpdCB0aGUgfi8uZ3JhZGxlL2dyYWRsZS5wcm9wZXJ0aWVzIGZpbGUgYW5kIGFkZCB0aGUgZm9sbG93aW5nCitwcm9wZXJ0aWVzIHRvIGl0LgorCisgICAgIyBTaWduaW5nIGtleSBpbmZvcm1hdGlvbiBmb3IgYXJ0aWZhY3RzIFBHUCBzaWduYXR1cmUgKHZhbHVlcyBhcmUgZXhhbXBsZXMpCisgICAgc2lnbmluZy5rZXlJZD0yNDg3NUQ3MworICAgIHNpZ25pbmcucGFzc3dvcmQ9c2VjcmV0CisgICAgc2lnbmluZy5zZWNyZXRLZXlSaW5nRmlsZT0vVXNlcnMvbWUvLmdudXBnL3NlY3JpbmcuZ3BnCisKKyAgICAjIEFwYWNoZSBNYXZlbiBzdGFnaW5nIHJlcG9zaXRvcnkgdXNlciBjcmVkZW50aWFscworICAgIG1hdmVuVXNlcj1tZU15c2VsZkFuZEkKKyAgICBtYXZlblBhc3N3b3JkPU15U3VwZXJBd2Vzb21lU2VjcmV0UGFzc3dvcmQKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBtYW51YWxseSBwdWJsaXNoIHVzaW5nIHRoZSBHcmFkbGUgYnVpbGQgZGlyZWN0bHkuCitXaXRoIHRoZSBrZXkgaW5mb3JtYXRpb24gYW5kIGNyZWRlbnRpYWxzIGluIHBsYWNlIHRoZSBmb2xsb3dpbmcgd2lsbCBnZW5lcmF0ZQoraWYgbmVlZGVkIHRoZSBidWlsZCBhcnRpZmFjdHMgYW5kIHByb2NlZWQgdG8gcHVibGlzaCB0aGUgcmVzdWx0cy4KKworICAgIC4vZ3JhZGxldyAtUHJlbGVhc2U9dHJ1ZSAtUHRocmlmdC52ZXJzaW9uPTAuMTEuMCB1cGxvYWRBcmNoaXZlcworCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBmb3IgdGhlIE1hdmVuIFB1YmxpY2F0aW9uCitieSB1c2luZyBhIEdyYWRsZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGUgeW91IGNhbiBwdWJsaXNoIHNpZ25lZCBKQVIgZmlsZXMgdG8geW91cgorY29tcGFueSBpbnRlcm5hbCBzZXJ2ZXIgaWYgeW91IGFkZCB0aGlzIHRvIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gdGhlCit+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZS4gVGhlIFVSTCBiZWxvdyBhc3N1bWVzIGEgTmV4dXMgUmVwb3NpdG9yeS4KKworICAgIG1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vbXkuY29tcGFueS5jb20vc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIKKworT3IgdGhlIHNhbWUgb24gdGhlIGNvbW1hbmQgbGluZToKKworICAgIC4vZ3JhZGxldyAtUG1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vbXkuY29tcGFueS5jb20vc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIgLVByZWxlYXNlPXRydWUgLVB0aHJpZnQudmVyc2lvbj0wLjExLjAgdXBsb2FkQXJjaGl2ZXMKKworCitEZXBlbmRlbmNpZXMKKz09PT09PT09PT09PQorCitHcmFkbGUKK2h0dHA6Ly9ncmFkbGUub3JnLworCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMi4wCisKK1RoZSBhY2Nlc3MgbW9kaWZpZXIgb2YgdGhlIEF1dG9FeHBhbmRpbmdCdWZmZXIgY2xhc3MgaGFzIGJlZW4gY2hhbmdlZCBmcm9tCitwdWJsaWMgdG8gZGVmYXVsdCAocGFja2FnZSkgYW5kIHdpbGwgbm8gbG9uZ2VyIGJlIGFjY2Vzc2libGUgYnkgdGhpcmQtcGFydHkKK2xpYnJhcmllcy4KKworVGhlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgU2hvcnRTdGFjayBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KK3B1YmxpYyB0byBkZWZhdWx0IChwYWNrYWdlKSBhbmQgd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZSBieSB0aGlyZC1wYXJ0eQorbGlicmFyaWVzLgorCmRpZmYgLS1naXQgYS9saWIvamF2YS9hbmRyb2lkL2J1aWxkLmdyYWRsZSBiL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTg0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9hbmRyb2lkL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2FwcGx5IHBsdWdpbjogJ2NvbS5hbmRyb2lkLmxpYnJhcnknCisKK2FuZHJvaWQgeworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDIzCisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjIzLjAuMSIKKyAgICB1c2VMaWJyYXJ5ICdvcmcuYXBhY2hlLmh0dHAubGVnYWN5JworICAgIHNvdXJjZVNldHMubWFpbi5qYXZhIHsKKyAgICAgICAgc3JjRGlyICcuLi9zcmMnCisgICAgICAgIGV4Y2x1ZGUgJ29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhJworICAgICAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YScKKyAgICAgICAgZXhjbHVkZSAnb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEnCisgICAgfQorfQorCityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuQ2VudHJhbCgpCit9CitkZXBlbmRlbmNpZXMgeworICAgIGNvbXBpbGUgJ29yZy5zbGY0ajpzbGY0ai1hcGk6MS43LjEzJworICAgIGNvbXBpbGUgJ2phdmF4LnNlcnZsZXQ6c2VydmxldC1hcGk6Mi41JworICAgIGNvbXBpbGUgJ29yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNvcmU6NC40LjQnCit9CisKK2J1aWxkc2NyaXB0IHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBtYXZlbkNlbnRyYWwoKQorICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZToxLjUuMCcKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9hbmRyb2lkL3NldHRpbmdzLmdyYWRsZSBiL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZTk3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9hbmRyb2lkL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxIEBACityb290UHJvamVjdC5uYW1lPSd0aHJpZnQnCmRpZmYgLS1naXQgYS9saWIvamF2YS9hbmRyb2lkL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWIvamF2YS9hbmRyb2lkL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhYmRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgcGFja2FnZT0ib3JnLmFwYWNoZS50aHJpZnQiPgorICA8YXBwbGljYXRpb24gLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC5ncmFkbGUgYi9saWIvamF2YS9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwMmY3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVzaW5nIHRoZSBsZWdhY3kgcGx1Z2luIGNsYXNzcGF0aCBmb3IgQ2xvdmVyIHNvIGl0IGNhbiBiZSBsb2FkZWQgb3B0aW9uYWxseQorYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIGdvb2dsZSgpCisgICAgICAgIGpjZW50ZXIoKQorICAgICAgICBncmFkbGVQbHVnaW5Qb3J0YWwoKQorICAgIH0KKworICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmJtdXNjaGtvOmdyYWRsZS1jbG92ZXItcGx1Z2luOjIuMi4wJworICAgIH0KK30KKworcGx1Z2lucyB7CisgICAgaWQgJ2phdmEnCisgICAgaWQgJ21hdmVuJworICAgIGlkICdzaWduaW5nJworICAgIGlkICdjb20uZ2l0aHViLmpvaG5yZW5nZWxtYW4uc2hhZG93JyB2ZXJzaW9uICcyLjAuMicKK30KKworZGVzY3JpcHRpb24gPSAnQXBhY2hlIFRocmlmdCBKYXZhIExpYnJhcnknCisKK2RlZmF1bHRUYXNrcyAnYnVpbGQnCisKKy8vIFZlcnNpb24gY29tcG9uZW50cyBmb3IgdGhpcyBwcm9qZWN0Citncm91cCA9IHByb3BlcnR5KCd0aHJpZnQuZ3JvdXBpZCcpCisKKy8vIERyb3AgdGhlIC1kZXYgc3VmZml4LCB3ZSB1c2UgdGhlIFNOQVBTSE9UIHN1ZmZpeCBmb3Igbm9uLXJlbGVhc2UgdmVyc2lvbnMKK2RlZiBwYXJzZWRWZXJzaW9uID0gcHJvcGVydHkoJ3RocmlmdC52ZXJzaW9uJykudG9TdHJpbmcoKS5yZXBsYWNlKCctZGV2JywgJycpCitpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvamVjdC5yZWxlYXNlKSkgeworICAgIHZlcnNpb24gPSBwYXJzZWRWZXJzaW9uCit9IGVsc2UgeworICAgIHZlcnNpb24gPSBwYXJzZWRWZXJzaW9uICsgJy1TTkFQU0hPVCcKK30KKworLy8gS2VlcGluZyB0aGUgcmVzdCBvZiB0aGUgYnVpbGQgbG9naWMgaW4gZnVuY3Rpb25hbCBuYW1lZCBzY3JpcHRzIGZvciBjbGFyaXR5CithcHBseSBmcm9tOiAnZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2FkZGl0aW9uYWxBcnRpZmFjdHMuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2Z1bmN0aW9uYWxUZXN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9jb2RlUXVhbGl0eUNoZWNrcy5ncmFkbGUnCmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC54bWwgYi9saWIvamF2YS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmU1ZTMuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgbmFtZT0ibGlidGhyaWZ0IiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIgotICB4bWxuczppdnk9ImFudGxpYjpvcmcuYXBhY2hlLml2eS5hbnQiCi0gIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgotCi0gIDxkZXNjcmlwdGlvbj5UaHJpZnQgQnVpbGQgRmlsZTwvZGVzY3JpcHRpb24+Ci0KLSAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Imdlbi1qYXZhIiAvPgotICA8cHJvcGVydHkgbmFtZT0iZ2VuYmVhbiIgbG9jYXRpb249Imdlbi1qYXZhYmVhbiIgLz4KLSAgPHByb3BlcnR5IG5hbWU9Im12bi5hbnQudGFzay52ZXJzaW9uIiB2YWx1ZT0iMi4xLjAiIC8+Ci0gIAotICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0ic3JjIiAvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MiIGxvY2F0aW9uPSIke2J1aWxkfS9qYXZhZG9jIiAvPgotICA8cHJvcGVydHkgbmFtZT0iaW5zdGFsbC5wYXRoIiB2YWx1ZT0iL3Vzci9sb2NhbC9saWIiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMudGVzdCIgbG9jYXRpb249InRlc3QiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50ZXN0IiBsb2NhdGlvbj0iJHtidWlsZH0vdGVzdCIgLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGhyaWZ0LmhvbWUiIGxvY2F0aW9uPSIuLi8uLi90ZXN0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQucm9vdCIgbG9jYXRpb249Ii4uLy4uLyIvPgotICA8cHJvcGVydHkgbmFtZT0iamFyLmZpbGUiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L2xpYnRocmlmdC5qYXIiIC8+ICAKLQotICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9Ly50aHJpZnQtYnVpbGQucHJvcGVydGllcyIgLz4KLQotICA8IS0tIGl2eSBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0iaXZ5LnZlcnNpb24iIHZhbHVlPSIyLjAuMC1yYzIiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJpdnkuZGlyIiBsb2NhdGlvbj0iJHtidWlsZH0vaXZ5IiAvPgotICA8cHJvcGVydHkgbmFtZT0iaXZ5LmphciIgbG9jYXRpb249IiR7aXZ5LmRpcn0vaXZ5LSR7aXZ5LnZlcnNpb259LmphciIvPgotICA8cHJvcGVydHkgbmFtZT0iaXZ5LmxpYi5kaXIiIGxvY2F0aW9uPSIke2l2eS5kaXJ9L2xpYiIgLz4KLSAgPHByb3BlcnR5IG5hbWU9Iml2eV9yZXBvX3VybCIgdmFsdWU9Imh0dHA6Ly9yZXBvMi5tYXZlbi5vcmcvbWF2ZW4yL29yZy9hcGFjaGUvaXZ5L2l2eS8ke2l2eS52ZXJzaW9ufS9pdnktJHtpdnkudmVyc2lvbn0uamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJpdnlzZXR0aW5ncy54bWwiIGxvY2F0aW9uPSIke2l2eS5kaXJ9L2l2eXNldHRpbmdzLnhtbCIgLz4KLSAgPHByb3BlcnR5IG5hbWU9Im12bl9hbnRfdGFza191cmwiIHZhbHVlPSJodHRwOi8vd3d3LnJldmVyc2UubmV0L3B1Yi9hcGFjaGUvbWF2ZW4vYmluYXJpZXMvbWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphciIgLz4KLSAgPHByb3BlcnR5IG5hbWU9Im12bi5hbnQudGFzay5qYXIiIGxvY2F0aW9uPSIke2l2eS5kaXJ9L21hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzb3VyY2VzLnppcCIgbG9jYXRpb249IiR7YnVpbGR9L2xpYnRocmlmdC1zcmMuemlwIiAvPgotICA8cHJvcGVydHkgbmFtZT0icG9tLmZpbGUiIGxvY2F0aW9uPSIke2J1aWxkfS9wb20ueG1sIiAvPgotICAKLSAgPCEtLSBUT0RPOiBHZXQgdGhlIGFwcHJvcHJpYXRlIHRva2VucyAvIFVSTCBmb3IgdXBsb2FkIC0tPiAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJhcGFjaGUuc25hcHNob3QucmVwb3NpdG9yeSIgdmFsdWU9Imh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3NuYXBzaG90cyIgLz4KLSAgCi0gIDxwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2l2eS5saWIuZGlyfSI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLSAgICA8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLQotICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgotICAgIDxwYXRoIHJlZmlkPSJjb21waWxlLmNsYXNzcGF0aCIgLz4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtlbnYuQ0xBU1NQQVRIfSIgLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QiIC8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phci5maWxlfSIgLz4KLSAgPC9wYXRoPgotCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcCAvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50ZXN0fSIgLz4KLSAgICA8IS0tCi0gICAgQWxsb3cgSXZ5IHRvIGJlIGRpc2FibGVkIHdpdGggIi1Ebm9pdnk9Ii4KLSAgICBJdCBpcyBraW5kIG9mIGEgaGFjayB0byBwcmV0ZW5kIHRoYXQgd2UgYWxyZWFkeSBmb3VuZCBpdCwKLSAgICBidXQgQW50IGRvZXNuJ3QgcHJvdmlkZSBhbiBlYXN5IHdheSBvZiBibG9ja2luZyBkZXBlbmRlbmNpZXMKLSAgICBmcm9tIGV4ZWN1dGluZyBvciBjaGVja2luZyBtdWx0aXBsZSBjb25kaXRpb25zLgotICAgIC0tPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Iml2eS5mb3VuZCI+PGlzc2V0IHByb3BlcnR5PSJub2l2eSIgLz48L2NvbmRpdGlvbj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJvZmZsaW5lIj48aXNzZXQgcHJvcGVydHk9Im5vaXZ5IiAvPjwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Iml2eS1pbml0LWRpcnMiPgotICAgIDxta2RpciBkaXI9IiR7aXZ5LmRpcn0iIC8+Ci0gICAgPG1rZGlyIGRpcj0iJHtpdnkubGliLmRpcn0iIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iaXZ5LWRvd25sb2FkIiBkZXBlbmRzPSJpdnktaW5pdC1kaXJzIiBkZXNjcmlwdGlvbj0iVG8gZG93bmxvYWQgaXZ5IiB1bmxlc3M9Im9mZmxpbmUiPgotICAgIDxnZXQgc3JjPSIke2l2eV9yZXBvX3VybH0iIGRlc3Q9IiR7aXZ5Lmphcn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Iml2eS1wcm9iZS1hbnRsaWIiPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Iml2eS5mb3VuZCI+Ci0gICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUuaXZ5LmFudCIgbmFtZT0iY2xlYW5jYWNoZSIvPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Iml2eS1pbml0LWFudGxpYiIgZGVwZW5kcz0iaXZ5LWRvd25sb2FkLGl2eS1wcm9iZS1hbnRsaWIiIHVubGVzcz0iaXZ5LmZvdW5kIj4KLSAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLml2eS5hbnQiIG9uZXJyb3I9ImZhaWwiCi0gICAgICBsb2FkZXJSZWY9Iml2eUxvYWRlciI+Ci0gICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aXZ5Lmphcn0iLz4KLSAgICAgIDwvY2xhc3NwYXRoPgotICAgIDwvdHlwZWRlZj4KLSAgICA8ZmFpbD4KLSAgICAgIDxjb25kaXRpb24gPgotICAgICAgICA8bm90PgotICAgICAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5pdnkuYW50IiBuYW1lPSJjbGVhbmNhY2hlIi8+Ci0gICAgICAgIDwvbm90PgotICAgICAgPC9jb25kaXRpb24+Ci0gICAgICBZb3UgbmVlZCBBcGFjaGUgSXZ5IDIuMCBvciBsYXRlciBmcm9tIGh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8KLSAgICAgIEl0IGNvdWxkIG5vdCBiZSBsb2FkZWQgZnJvbSAke2l2eV9yZXBvX3VybH0KLSAgICA8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icmVzb2x2ZSIgZGVwZW5kcz0iaXZ5LWluaXQtYW50bGliIiBkZXNjcmlwdGlvbj0icmV0cmlldmUgZGVwZW5kZW5jaWVzIHdpdGggaXZ5IiB1bmxlc3M9Im5vaXZ5Ij4KLSAgICA8aXZ5OnJldHJpZXZlIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCxyZXNvbHZlIj4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBzb3VyY2U9IjEuNSIgdGFyZ2V0PSIxLjUiIGRlYnVnPSJ0cnVlIiBjbGFzc3BhdGhyZWY9ImNvbXBpbGUuY2xhc3NwYXRoIiAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlcGVuZHM9ImluaXQiPgotICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjfSIKLSAgICAgIGRlc3RkaXI9IiR7amF2YWRvY30iCi0gICAgICB2ZXJzaW9uPSJ0cnVlIgotICAgICAgd2luZG93dGl0bGU9IlRocmlmdCBKYXZhIEFQSSIKLSAgICAgIGRvY3RpdGxlPSJUaHJpZnQgSmF2YSBBUEkiPgotICAgIDwvamF2YWRvYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9NRVRBLUlORiIvPgotICAgIDxjb3B5IGZpbGU9IiR7dGhyaWZ0LnJvb3R9L0xJQ0VOU0UiIHRvZmlsZT0iJHtidWlsZH0vTUVUQS1JTkYvTElDRU5TRS50eHQiLz4KLSAgICA8Y29weSBmaWxlPSIke3RocmlmdC5yb290fS9OT1RJQ0UiIHRvZmlsZT0iJHtidWlsZH0vTUVUQS1JTkYvTk9USUNFLnR4dCIvPgotICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZmlsZX0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdGhyaWZ0LyoqLyouY2xhc3MiIC8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoudHh0IiAvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9qYXI+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iaW5zdGFsbCIgZGVwZW5kcz0iZGlzdCxqYXZhZG9jIj4KLSAgICA8Y29weSB0b2Rpcj0iJHtpbnN0YWxsLnBhdGh9Ij4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIuIj48aW5jbHVkZSBuYW1lPSIqLmphciIgLz48L2ZpbGVzZXQ+Ci0gICAgPC9jb3B5PgotICAgIDxjb3B5IHRvZGlyPSIke2luc3RhbGwuamF2YWRvYy5wYXRofSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YWRvY30iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qIiAvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29weT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9IiAvPgotICAgIDxkZWxldGUgZGlyPSIke2dlbn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW5iZWFufSIvPgotICAgIDxkZWxldGUgZGlyPSIke2phdmFkb2N9Ii8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke2phci5maWxlfSIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3QiIGRlc2NyaXB0aW9uPSJCdWlsZCB0aGUgdGVzdCBzdWl0ZSBjbGFzc2VzIiBkZXBlbmRzPSJnZW5lcmF0ZSxkaXN0Ij4KLSAgICA8amF2YWMgZGVidWc9InRydWUiIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3R9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbmJlYW59IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3R9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke3NyYy50ZXN0fSIgZGVzdGRpcj0iJHtidWlsZC50ZXN0fSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRlc3QiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qdW5pdC5vdXRwdXQuZm9ybWF0IiB2YWx1ZT0icGxhaW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGltZW91dCIgdmFsdWU9IjIwMDAwMDAiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3Quc3JjLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5sb2cuZGlyIiB2YWx1ZT0iJHtidWlsZC50ZXN0fS9sb2ciLz4KLQotICA8dGFyZ2V0IG5hbWU9Imp1bml0LXRlc3QiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIEpVbml0IHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0LmxvZy5kaXJ9Ii8+Ci0gICAgPGp1bml0Ci0gICAgICBwcmludHN1bW1hcnk9InllcyIgc2hvd291dHB1dD0iJHt0ZXN0Lm91dHB1dH0iIAotICAgICAgaGFsdG9uZmFpbHVyZT0ibm8iIGZvcms9InllcyIgZm9ya21vZGU9Im9uY2UiIG1heG1lbW9yeT0iNTEybSIKLSAgICAgIGVycm9yUHJvcGVydHk9InRlc3RzLmZhaWxlZCIgZmFpbHVyZVByb3BlcnR5PSJ0ZXN0cy5mYWlsZWQiCi0gICAgICB0aW1lb3V0PSIke3Rlc3QudGltZW91dH0iCi0gICAgPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdCIgdmFsdWU9IiR7YnVpbGQudGVzdH0iLz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7dGVzdC5qdW5pdC5vdXRwdXQuZm9ybWF0fSIgLz4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5sb2cuZGlyfSIgdW5sZXNzPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9IiBpbmNsdWRlcz0iKiovVGVzdCouamF2YSIgLz4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0LmxvZy5kaXJ9IiBpZj0idGVzdGNhc2UiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5zcmMuZGlyfSIgaW5jbHVkZXM9IioqLyR7dGVzdGNhc2V9LmphdmEiIC8+Ci0gICAgICA8L2JhdGNodGVzdD4KLSAgICA8L2p1bml0PgotICAgIDxmYWlsIGlmPSJ0ZXN0cy5mYWlsZWQiPlRlc3RzIGZhaWxlZCE8L2ZhaWw+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZGVwcmVjYXRlZC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBub24tSlVuaXQgdGVzdCBzdWl0ZSIgZGVwZW5kcz0iY29tcGlsZS10ZXN0Ij4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuRXF1YWxpdHlUZXN0IgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiIC8+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRvU3RyaW5nVGVzdCIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIiAvPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5KYXZhQmVhbnNUZXN0IgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgZnVsbCB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJqdW5pdC10ZXN0LGRlcHJlY2F0ZWQtdGVzdCIvPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdGNsaWVudCIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3QgY2xpZW50Ij4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdENsaWVudCIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iJHt0ZXN0YXJnc30iIC8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IHNlcnZlciI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RTZXJ2ZXIiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9IiR7dGVzdGFyZ3N9IiAvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0bm9uYmxvY2tpbmdzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IG5vbmJsb2NraW5nIHNlcnZlciI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3ROb25ibG9ja2luZ1NlcnZlciIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iJHt0ZXN0YXJnc30iIC8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9UaHJpZnRUZXN0LnRocmlmdCIgLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmhhc2hjb2RlICR7dGVzdC50aHJpZnQuaG9tZX0vRGVidWdQcm90b1Rlc3QudGhyaWZ0IiAvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQiIC8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpiZWFucyxub2NhbWVsICR7dGVzdC50aHJpZnQuaG9tZX0vSmF2YUJlYW5zVGVzdC50aHJpZnQiIC8+Ci0gICAgPC9leGVjPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0Ij4KLSAgICA8Z2V0IHNyYz0iJHttdm5fYW50X3Rhc2tfdXJsfSIgZGVzdD0iJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIiAvPiAKLSAgICA8cGF0aCBpZD0ibWF2ZW4tYW50LXRhc2tzLmNsYXNzcGF0aCIgcGF0aD0iJHttdm4uYW50LnRhc2suamFyfSIgLz4KLSAgPHRhc2tkZWYgcmVzb3VyY2U9Im9yZy9hcGFjaGUvbWF2ZW4vYXJ0aWZhY3QvYW50L2FudGxpYi54bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIKLSAgICAgICAgICBjbGFzc3BhdGhyZWY9Im1hdmVuLWFudC10YXNrcy5jbGFzc3BhdGgiIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icGFjay5zcmMiPgotICAgIDx6aXAgZGVzdGZpbGU9IiR7c291cmNlcy56aXB9IiBiYXNlZGlyPSIke3NyY30iIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUucG9tIiBkZXBlbmRzPSJpbml0LHJlc29sdmUiIGRlc2NyaXB0aW9uPSJHZW5lcmF0ZSBhIE1hdmVuIFBPTSBmaWxlIGZvciBsaWJ0aHJpZnQiPgotICAgIDxpdnk6bWFrZXBvbSBpdnlmaWxlPSIke2Jhc2VkaXJ9L2l2eS54bWwiIHBvbWZpbGU9IiR7cG9tLmZpbGV9IiA+Ci0gICAgICA8bWFwcGluZyBjb25mPSJkZWZhdWx0IiBzY29wZT0iY29tcGlsZSIgLz4KLSAgICAgIDxtYXBwaW5nIGNvbmY9InJ1bnRpbWUiIHNjb3BlPSJydW50aW1lIiAvPgotICAgIDwvaXZ5Om1ha2Vwb20+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0icHVibGlzaCIgZGVwZW5kcz0idGVzdCxkaXN0LG12bi5pbml0LGdlbmVyYXRlLnBvbSxwYWNrLnNyYyI+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiBmaWxlPSIke3BvbS5maWxlfSIgLz4KLQotICAgIDxhcnRpZmFjdDppbnN0YWxsIGZpbGU9IiR7amFyLmZpbGV9Ij4KLSAgICAgIDxwb20gcmVmaWQ9InBvbSIvPgotICAgICAgPGF0dGFjaCBmaWxlPSIke3NvdXJjZXMuemlwfSIgY2xhc3NpZmllcj0ic291cmNlIiAvPgotICAgIDwvYXJ0aWZhY3Q6aW5zdGFsbD4KLQotICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJyZW1vdGUucmVwb3NpdG9yeSIgdXJsPSIke2FwYWNoZS5zbmFwc2hvdC5yZXBvc2l0b3J5fSIgLz4KLQotICAgIDxhcnRpZmFjdDpkZXBsb3kgZmlsZT0iJHtqYXIuZmlsZX0iPgotICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9InJlbW90ZS5yZXBvc2l0b3J5IiAvPgotICAgICAgPHBvbSByZWZpZD0icG9tIi8+Ci0gICAgICA8YXR0YWNoIGZpbGU9IiR7c291cmNlcy56aXB9IiBjbGFzc2lmaWVyPSJzb3VyY2UiIC8+Ci0gICAgPC9hcnRpZmFjdDpkZXBsb3k+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvY29kZV9xdWFsaXR5X3Rvb2xzL2ZpbmRidWdzLWZpbHRlci54bWwgYi9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTkzYjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvY29kZV9xdWFsaXR5X3Rvb2xzL2ZpbmRidWdzLWZpbHRlci54bWwKQEAgLTAsMCArMSw1MSBAQAorPEZpbmRCdWdzRmlsdGVyPgorICAgIDwhLS0KKyAgICAgICAgVGhpcyBmaWxlIGNvbnRyb2xzIGZpbHRlcmluZyBzb21lIG9mIHRoZSBtb3JlIG9ibm94aW91cyBmaW5kYnVncyByZXBvcnRzLgorICAgICAgICBTb21lIG1heSBiZSB3b3J0aHkgb2YgZXhhbWluYXRpb24gYW5kIHJlc29sdXRpb24sIG90aGVycyBhcmUgdG9vIG5pdC1waWNreS4KKyAgICAtLT4KKyAgICA8TWF0Y2g+CisgICAgICAgIDxPcj4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIHRoZSBtaXNzaW5nIHNlcmlhbFZlcnNpb25VSUQgZXJyb3JzIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJTblZJIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgTWFsaWNpb3VzIGNvZGUgdnVsbmVyYWJpbGl0eSBXYXJuaW5ncyAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iRUksRUkyIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgVW5jaGVja2VkL3VuY29uZmlybWVkIGNhc3QgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IkJDIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgU2hvdWxkIHJldHVybiBhIHplcm8gbGVuZ3RoIGFycmF5IHJhdGhlciB0aGFuIG51bGw/IC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJQWkxBIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgUmVkdW5kYW50IG51bGxjaGVjayAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iUkNOIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgRXhjZXB0aW9uIGlzIGNhdWdodCB3aGVuIEV4Y2VwdGlvbiBpcyBub3QgdGhyb3duIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJSRUMiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBTd2l0Y2ggc3RhdGVtZW50IGZvdW5kIHdoZXJlIGRlZmF1bHQgY2FzZSBpcyBtaXNzaW5nIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJTRiIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFVucmVhZCBwdWJsaWMvcHJvdGVjdGVkIGZpZWxkIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJVckYiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBGaWVsZCBub3QgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYW5kIGRlcmVmZXJlbmNlZCAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iVXdGIiAvPgorICAgICAgICA8L09yPgorICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgbWV0aG9kIGludm9rZXMgU3lzdGVtLmV4aXQoLi4uKSwgd2hpY2ggc2h1dHMgZG93biB0aGUgZW50aXJlIHZpcnR1YWwgbWFjaGluZSAtLT4KKyAgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URmlsZVRyYW5zcG9ydCIgLz4KKyAgICAgICAgPE1ldGhvZCBuYW1lPSJwcmludFVzYWdlIiAvPgorICAgICAgICA8QnVnIGNvZGU9IkRtIiAvPgorICAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIG1ldGhvZCBtaWdodCBpZ25vcmUgamF2YS5sYW5nLkV4Y2VwdGlvbiAtLT4KKyAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTaW1wbGVGaWxlVHJhbnNwb3J0IiAvPgorICAgICAgIDxNZXRob2QgbmFtZT0iY2xvc2UiIC8+CisgICAgICAgPEJ1ZyBjb2RlPSJERSIgLz4KKyAgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8IS0tIEZpbHRlciBtZXRob2QgbWlnaHQgaWdub3JlIGphdmEubGFuZy5FeGNlcHRpb24gLS0+CisgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LlROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQkTXVsdGlGZXRjaCIgLz4KKyAgICAgICA8TWV0aG9kIG5hbWU9InJ1biIgLz4KKyAgICAgICA8QnVnIGNvZGU9IkRFIiAvPgorICAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIENsYXNzIGRlZmluZXMgbm9uLXRyYW5zaWVudCBub24tc2VyaWFsaXphYmxlIGluc3RhbmNlIGZpZWxkIC0tPgorICAgICAgIDxDbGFzcyBuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNlcnZsZXQiIC8+CisgICAgICAgPEJ1ZyBjb2RlPSJTZSIgLz4KKyAgICAgPC9NYXRjaD4KKzwvRmluZEJ1Z3NGaWx0ZXI+CmRpZmYgLS1naXQgYS9saWIvamF2YS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2phdmEvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzIGIvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2YTk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzMgQEAKKyMgVGhpcyBmaWxlIGlzIHNoYXJlZCBjdXJyZW50bHkgYmV0d2VlbiB0aGlzIEdyYWRsZSBidWlsZCBhbmQgdGhlCisjIEFudCBidWlsZHMgZm9yIGZkMzAzIGFuZCBKYXZhU2NyaXB0LiBLZWVwIHRoZSBkb3R0ZWQgbm90YXRpb24gZm9yCisjIHRoZSBwcm9wZXJ0aWVzIHRvIG1pbmltaXplIHRoZSBjaGFuZ2VzIGluIHRoZSBkZXBlbmRlbmNpZXMuCit0aHJpZnQudmVyc2lvbj0xLjAuMAordGhyaWZ0Lmdyb3VwaWQ9b3JnLmFwYWNoZS50aHJpZnQKK3JlbGVhc2U9dHJ1ZQorCisjIExvY2FsIEluc3RhbGwgcGF0aHMKK2luc3RhbGwucGF0aD0vdXNyL2xvY2FsL2xpYgoraW5zdGFsbC5qYXZhZG9jLnBhdGg9L3Vzci9sb2NhbC9saWIKKworIyBUZXN0IGV4ZWN1dGlvbiBwcm9wZXJ0aWVzCit0ZXN0UG9ydD05MDkwCisKKyMgVGVzdCB3aXRoIENsb3ZlciBDb2RlIGNvdmVyYWdlIChkaXNhYmxlZCBieSBkZWZhdWx0KQorY2xvdmVyRW5hYmxlZD1mYWxzZQorCisjIE1hdmVuIGRlcGVuZGVuY3kgZG93bmxvYWQgbG9jYXRpb25zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorYXBhY2hlLnJlcG89aHR0cHM6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvcmVsZWFzZXMKKworIyBBcGFjaGUgTWF2ZW4gcHVibGlzaAorbGljZW5zZT1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0CittYXZlbi1yZXBvc2l0b3J5LXVybD1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMgorbWF2ZW4tcmVwb3NpdG9yeS1pZD1hcGFjaGUucmVsZWFzZXMuaHR0cHMKKworIyBEZXBlbmRlbmN5IHZlcnNpb25zCitodHRwY2xpZW50LnZlcnNpb249NC40LjEKK2h0dHBjb3JlLnZlcnNpb249NC40LjEKK3NsZjRqLnZlcnNpb249MS43LjEyCitzZXJ2bGV0LnZlcnNpb249Mi41CitqdW5pdC52ZXJzaW9uPTQuMTIKK21vY2tpdG8udmVyc2lvbj0xLjkuNQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL2FkZGl0aW9uYWxBcnRpZmFjdHMuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2FkZGl0aW9uYWxBcnRpZmFjdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTQ2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKK3Rhc2sgc291cmNlc0phcih0eXBlOiBKYXIsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgbWFpbiBKYXZhIHNvdXJjZXMuJworCisgICAgY2xhc3NpZmllciAnc291cmNlcycKKyAgICBmcm9tIHNvdXJjZVNldHMubWFpbi5hbGxTb3VyY2UKK30KKwordGFzayBqYXZhZG9jSmFyKHR5cGU6IEphciwgZGVwZW5kc09uOiBqYXZhZG9jLCBncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0Fzc2VtYmxlcyBhIGphciBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIEphdmFEb2MuJworCisgICAgY2xhc3NpZmllciAnamF2YWRvYycKKyAgICBmcm9tIGphdmFkb2MuZGVzdGluYXRpb25EaXIKK30KKworYXJ0aWZhY3RzIHsKKyAgICBhcmNoaXZlcyBzb3VyY2VzSmFyCisgICAgYXJjaGl2ZXMgamF2YWRvY0phcgorfQorCmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2Nsb3ZlckNvdmVyYWdlLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWYwZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2Nsb3ZlckNvdmVyYWdlLmdyYWRsZQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gS2VlcCB0aGlzIGFzIGFuIG9wdGlvbmFsIGZlYXR1cmUgZm9yIG5vdywgZGlzYWJsZWQgYnkgZGVmYXVsdAoraWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb2plY3QuY2xvdmVyRW5hYmxlZCkpIHsKKyAgICBhcHBseSBwbHVnaW46ICdjb20uYm11c2Noa28uY2xvdmVyJworCisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xvdmVyICdvcmcub3BlbmNsb3ZlcjpjbG92ZXI6NC4yLisnCisgICAgfQorCisgICAgY2xvdmVyIHsKKworICAgICAgICB0ZXN0SW5jbHVkZXMgPSBbJyoqL1Rlc3QqLmphdmEnXQorICAgICAgICAvLyBFeGNsdWRlIHRoZSBnZW5lcmF0ZWQgdGVzdCBjb2RlIGZyb20gY29kZSBjb3ZlcmFnZQorICAgICAgICB0ZXN0RXhjbHVkZXMgPSBbJ3RocmlmdC90ZXN0L1Rlc3QqLmphdmEnXQorCisgICAgICAgIGNvbXBpbGVyIHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gJ1VURi04JworICAgICAgICAgICAgZGVidWcgPSB0cnVlCisgICAgICAgIH0KKworICAgICAgICByZXBvcnQgeworICAgICAgICAgICAgaHRtbCA9IHRydWUKKyAgICAgICAgICAgIHBkZiA9IHRydWUKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1aWxkLmRlcGVuZHNPbiBjbG92ZXJHZW5lcmF0ZVJlcG9ydAorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9jb2RlUXVhbGl0eUNoZWNrcy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmMWMyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9jb2RlUXVhbGl0eUNoZWNrcy5ncmFkbGUKQEAgLTAsMCArMSwzOSBAQAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29uZmlndXJlIHRoZSBHcmFkbGUgY29kZSBxdWFsaXR5IHBsdWdpbnMgaGVyZS4KKy8vCisKK2FwcGx5IHBsdWdpbjogJ2ZpbmRidWdzJworCitmaW5kYnVncyB7CisgICAgaWdub3JlRmFpbHVyZXMgPSB0cnVlCisgICAgdG9vbFZlcnNpb24gPSAnMy4wLjEnCisgICAgc291cmNlU2V0cyA9IFsgc291cmNlU2V0cy5tYWluIF0KKyAgICBlZmZvcnQgPSAnbWF4JworICAgIHJlcG9ydExldmVsID0gJ2xvdycKKyAgICBleGNsdWRlRmlsdGVyID0gZmlsZSgnY29kZV9xdWFsaXR5X3Rvb2xzL2ZpbmRidWdzLWZpbHRlci54bWwnKQorfQorCit0YXNrcy53aXRoVHlwZShGaW5kQnVncykgeworICAgIHJlcG9ydHMgeworICAgICAgICB0ZXh0LmVuYWJsZWQgPSBmYWxzZQorICAgICAgICBodG1sLmVuYWJsZWQgPSB0cnVlCisgICAgICAgIHhtbC5lbmFibGVkID0gZmFsc2UKKyAgICB9Cit9CisKK2FwcGx5IHBsdWdpbjogJ3BtZCcKKworcG1kIHsKKyAgICBpZ25vcmVGYWlsdXJlcyA9IHRydWUKKyAgICB0b29sVmVyc2lvbiA9ICc2LjAuMCcKKyAgICBzb3VyY2VTZXRzID0gWyBzb3VyY2VTZXRzLm1haW4gXQorICAgIHJ1bGVTZXRzID0gWyAnamF2YS1iYXNpYycgXQorfQorCit0YXNrcy53aXRoVHlwZShQbWQpIHsKKyAgICByZXBvcnRzIHsKKyAgICAgICAgaHRtbC5lbmFibGVkID0gdHJ1ZQorICAgICAgICB4bWwuZW5hYmxlZCA9IGZhbHNlCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9lbnZpcm9ubWVudC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3ZWIxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9lbnZpcm9ubWVudC5ncmFkbGUKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIE92ZXJyaWRlIHRoZSBidWlsZCBkaXJlY3RvcnkgaWYgQ01ha2UgaXMgdXNlZCAoYWxsb3dzIGZvciBvdXQtb2YtdHJlZS1idWlsZHMpCitpZiAoaGFzUHJvcGVydHkoJ2J1aWxkLmRpcicpKSB7CisgICAgYnVpbGREaXIgPSBmaWxlKHByb3BlcnR5KCdidWlsZC5kaXInKSkKK30KKworLy8gSW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCBvdGhlciBBbnQgYmFzZWQgYnVpbGRzIGluIHRoZSBzeXN0ZW0KKy8vIHdlIGNvbnZlcnQgdGhlIGdyYWRsZS5wcm9wZXJ0aWVzIGludG8gRFNMIGZyaWVuZGx5IGNhbWVsQ2FzZWQgcHJvcGVydGllcworZXh0Lmluc3RhbGxQYXRoID0gcHJvcGVydHkoJ2luc3RhbGwucGF0aCcpCitleHQuaW5zdGFsbEphdmFkb2NQYXRoID0gcHJvcGVydHkoJ2luc3RhbGwuamF2YWRvYy5wYXRoJykKKworZXh0LnRocmlmdFJvb3QgPSBmaWxlKCcuLi8uLicpCisKK2lmIChoYXNQcm9wZXJ0eSgndGhyaWZ0LmNvbXBpbGVyJykpIHsKKyAgICBleHQudGhyaWZ0Q29tcGlsZXIgPSBwcm9wZXJ0eSgndGhyaWZ0LmNvbXBpbGVyJykKK30gZWxzZSB7CisgICAgZXh0LnRocmlmdENvbXBpbGVyID0gIiR0aHJpZnRSb290L2NvbXBpbGVyL2NwcC90aHJpZnQiCit9CisKK2V4dC5tdm5SZXBvID0gcHJvcGVydHkoJ212bi5yZXBvJykKK2V4dC5hcGFjaGVSZXBvID0gcHJvcGVydHkoJ2FwYWNoZS5yZXBvJykKK2V4dC5tYXZlblJlcG9zaXRvcnlVcmwgPSBwcm9wZXJ0eSgnbWF2ZW4tcmVwb3NpdG9yeS11cmwnKQorCisvLyBWZXJzaW9ucyB1c2VkIGluIHRoaXMgcHJvamVjdAorZXh0Lmh0dHBjbGllbnRWZXJzaW9uID0gcHJvcGVydHkoJ2h0dHBjbGllbnQudmVyc2lvbicpCitleHQuaHR0cGNvcmVWZXJzaW9uID0gcHJvcGVydHkoJ2h0dHBjb3JlLnZlcnNpb24nKQorZXh0LnNlcnZsZXRWZXJzaW9uID0gcHJvcGVydHkoJ3NlcnZsZXQudmVyc2lvbicpCitleHQuc2xmNGpWZXJzaW9uID0gcHJvcGVydHkoJ3NsZjRqLnZlcnNpb24nKQorZXh0Lmp1bml0VmVyc2lvbiA9IHByb3BlcnR5KCdqdW5pdC52ZXJzaW9uJykKK2V4dC5tb2NraXRvVmVyc2lvbiA9IHByb3BlcnR5KCdtb2NraXRvLnZlcnNpb24nKQorCisvLyBJbiB0aGlzIHNlY3Rpb24geW91IGRlY2xhcmUgd2hlcmUgdG8gZmluZCB0aGUgZGVwZW5kZW5jaWVzIG9mIHlvdXIgcHJvamVjdAorcmVwb3NpdG9yaWVzIHsKKyAgICBtYXZlbiB7CisgICAgICAgIG5hbWUgJ01hdmVuIENlbnRyYWwgUmVwb3NpdG9yeScKKyAgICAgICAgdXJsIG12blJlcG8KKyAgICB9CisgICAgbWF2ZW4geworICAgICAgICBuYW1lICdBcGFjaGUgTWF2ZW4gUmVwb3NpdG9yeScKKyAgICAgICAgdXJsIGFwYWNoZVJlcG8KKyAgICB9Cit9CisKK2RlcGVuZGVuY2llcyB7CisgICAgY29tcGlsZSAib3JnLnNsZjRqOnNsZjRqLWFwaToke3NsZjRqVmVyc2lvbn0iCisgICAgY29tcGlsZSAib3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY2xpZW50OiR7aHR0cGNsaWVudFZlcnNpb259IgorICAgIGNvbXBpbGUgIm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNvcmU6JHtodHRwY29yZVZlcnNpb259IgorICAgIGNvbXBpbGUgImphdmF4LnNlcnZsZXQ6c2VydmxldC1hcGk6JHtzZXJ2bGV0VmVyc2lvbn0iCisKKyAgICB0ZXN0Q29tcGlsZSAianVuaXQ6anVuaXQ6JHtqdW5pdFZlcnNpb259IgorICAgIHRlc3RDb21waWxlICJvcmcubW9ja2l0bzptb2NraXRvLWFsbDoke21vY2tpdG9WZXJzaW9ufSIKKyAgICB0ZXN0UnVudGltZSAib3JnLnNsZjRqOnNsZjRqLWxvZzRqMTI6JHtzbGY0alZlcnNpb259IgorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL2Z1bmN0aW9uYWxUZXN0cy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIwZDEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2Z1bmN0aW9uYWxUZXN0cy5ncmFkbGUKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbmFsIHRlc3RpbmcgaGFybmVzcyBjcmVhdGlvbi4gVGhpcyBoZWxwcyBydW4gdGhlIGNyb3NzLWNoZWNrIHRlc3RzLgorLy8gVGhlIE1ha2VmaWxlIHByZWNyb3NzIHRhcmdldCBpbnZva2VzIHRoZSBzaGFkb3dKYXIgdGFzayBhbmQgdGhlIHRlc3RzLmpzb24KKy8vIGNvZGUgaXMgY2hhbmdlZCB0byBjYWxsIHJ1bmNsaWVudCBvciBydW5zZXJ2ZXIgYXMgbmVlZGVkLgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDcm9zcyBUZXN0IHNvdXJjZXMgYXJlIHNlcGFyYXRlZCBpbiB0aGVpciBvd24gc291cmNlU2V0CisvLworc291cmNlU2V0cyB7CisgICAgY3Jvc3NUZXN0IHsKKyAgICAgICAgamF2YSB7CisgICAgICAgICAgICBzcmNEaXIgJ3Rlc3QnCisgICAgICAgICAgICBpbmNsdWRlICcqKi90ZXN0L1Rlc3RDbGllbnQuamF2YScKKyAgICAgICAgICAgIGluY2x1ZGUgJyoqL3Rlc3QvVGVzdFNlcnZlci5qYXZhJworICAgICAgICAgICAgaW5jbHVkZSAnKiovdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YScKKyAgICAgICAgfQorICAgIH0KK30KKworY29uZmlndXJhdGlvbnMgeworICAgIGNyb3NzVGVzdENvbXBpbGUgeyBleHRlbmRzRnJvbSB0ZXN0Q29tcGlsZSB9CisgICAgY3Jvc3NUZXN0UnVudGltZSB7IGV4dGVuZHNGcm9tIGNyb3NzVGVzdENvbXBpbGUsIHRlc3RSdW50aW1lIH0KK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICBjcm9zc1Rlc3RDb21waWxlIHNvdXJjZVNldHMubWFpbi5vdXRwdXQKKyAgICBjcm9zc1Rlc3RDb21waWxlIHNvdXJjZVNldHMudGVzdC5vdXRwdXQKK30KKworLy8gSSBhbSB1c2luZyBzaGFkb3cgcGx1Z2luIHRvIG1ha2UgYSBzZWxmIGNvbnRhaW5lZCBmdW5jdGlvbmFsIHRlc3QgVWJlciBKQVIgdGhhdAorLy8gZWxpbWluYXRlcyBzdGFydHVwIHByb2JsZW1zIHdpdGggd3JhcHBpbmcgdGhlIGNyb3NzLWNoZWNrIGhhcm5lc3MgaW4gR3JhZGxlLgorLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBydW5uZXIgc2NyaXB0cyBhcyB0aGUgc2luZ2xlIGNsYXNzcGF0aCBlbnRyeSB3aGljaAorLy8gYWxsb3dzIHRoZSBwcm9jZXNzIHRvIGJlIGFzIGxpZ2h0d2VpZ2h0IGFzIGl0IGNhbi4KK3NoYWRvd0phciB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGUgYSB0ZXN0IEpBUiBmaWxlIGZvciBjcm9zcy1jaGVjayBleGVjdXRpb24nCisgICAgLy8gbWFrZSBzdXJlIHRoZSBydW5uZXJzIGFyZSBjcmVhdGVkIHdoZW4gdGhpcyBydW5zCisgICAgZGVwZW5kc09uICdnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvckNsaWVudCcsICdnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvclNlcnZlcicsICdnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvck5vbmJsb2NraW5nU2VydmVyJworCisgICAgYmFzZU5hbWUgPSAnZnVuY3Rpb25hbFRlc3QnCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKCIkYnVpbGREaXIvZnVuY3Rpb25hbFRlc3RKYXIiKQorICAgIGNsYXNzaWZpZXIgPSBudWxsCisKKyAgICAvLyBXZSBkbyBub3QgbmVlZCBhIHZlcnNpb24gbnVtYmVyIGZvciB0aGlzIGludGVybmFsIGphcgorICAgIHZlcnNpb24gPSBudWxsCisKKyAgICAvLyBCdW5kbGUgdGhlIGNvbXBsZXRlIHNldCBvZiB1bml0IHRlc3QgY2xhc3NlcyBpbmNsdWRpbmcgZ2VuZXJhdGVkIGNvZGUKKyAgICAvLyBhbmQgdGhlIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIGluIG9uZSBKQVIgdG8gZXhwZWRpdGUgZXhlY3V0aW9uLgorICAgIGZyb20gc291cmNlU2V0cy50ZXN0Lm91dHB1dAorICAgIGZyb20gc291cmNlU2V0cy5jcm9zc1Rlc3Qub3V0cHV0CisgICAgY29uZmlndXJhdGlvbnMgPSBbcHJvamVjdC5jb25maWd1cmF0aW9ucy50ZXN0UnVudGltZV0KK30KKworLy8gQ29tbW9uIHNjcmlwdCBydW5uZXIgY29uZmlndXJhdGlvbiBlbGVtZW50cworZGVmIHNjcmlwdEV4dCA9ICcnCitkZWYgZXhlY0V4dCA9ICcnCitkZWYgc2NyaXB0SGVhZCA9ICcjIS9iaW4vYmFzaCcKK2RlZiBhcmdzID0gJyQqJworCisvLyBBbHRob3VnaCB0aGlzIGlzIG1hcmtlZCBpbnRlcm5hbCBpdCBpcyBhbiBhdmFpbGFibGUgYW5kIHN0YWJsZSBpbnRlcmZhY2UKK2lmIChvcmcuZ3JhZGxlLmludGVybmFsLm9zLk9wZXJhdGluZ1N5c3RlbS5jdXJyZW50KCkud2luZG93cykgeworICAgIHNjcmlwdEV4dCA9ICcuYmF0JworICAgIGV4ZWNFeHQgPSAnLmV4ZScKKyAgICBzY3JpcHRIZWFkID0gJ0BlY2hvIG9mZicKKyAgICBhcmdzID0gJyUqJworfQorCisvLyBUaGUgSmF2YSBleGVjdXRhYmxlIHRvIHVzZSB3aXRoIHRoZSBydW5uZXIgc2NyaXB0cworZGVmIGphdmFFeGUgPSBmaWxlKCIke1N5c3RlbS5nZXRQcm9wZXJ0eSgnamF2YS5ob21lJyl9L2Jpbi9qYXZhJHtleGVjRXh0fSIpLmNhbm9uaWNhbFBhdGgKKy8vIFRoZSBjb21tb24gVWJlciBqYXIgcGF0aAorZGVmIGphclBhdGggPSBzaGFkb3dKYXIuYXJjaGl2ZVBhdGguY2Fub25pY2FsUGF0aAorZGVmIHRydXN0U3RvcmUgPSBmaWxlKCd0ZXN0Ly50cnVzdHN0b3JlJykuY2Fub25pY2FsUGF0aAorZGVmIGtleVN0b3JlID0gZmlsZSgndGVzdC8ua2V5c3RvcmUnKS5jYW5vbmljYWxQYXRoCisKK3Rhc2sgZ2VuZXJhdGVSdW5uZXJTY3JpcHRGb3JDbGllbnQoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhIHJ1bm5lciBzY3JpcHQgZm9yIGNyb3NzLWNoZWNrIHRlc3RzIHdpdGggVGVzdENsaWVudCcKKworICAgIGRlZiBjbGllbnRGaWxlID0gZmlsZSgiJGJ1aWxkRGlyL3J1bmNsaWVudCR7c2NyaXB0RXh0fSIpCisKKyAgICBkZWYgcnVuQ2xpZW50VGV4dCA9ICIiIlwKKyR7c2NyaXB0SGVhZH0KKworIiR7amF2YUV4ZX0iIC1jcCAiJGphclBhdGgiICItRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZT0kdHJ1c3RTdG9yZSIgLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZD10aHJpZnQgb3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0Q2xpZW50ICRhcmdzCisiIiIKKyAgICBpbnB1dHMucHJvcGVydHkgJ3J1bkNsaWVudFRleHQnLCBydW5DbGllbnRUZXh0CisgICAgb3V0cHV0cy5maWxlIGNsaWVudEZpbGUKKworICAgIGRvTGFzdCB7CisgICAgICAgIGNsaWVudEZpbGUucGFyZW50RmlsZS5ta2RpcnMoKQorICAgICAgICBjbGllbnRGaWxlLnRleHQgPSBydW5DbGllbnRUZXh0CisgICAgICAgIGNsaWVudEZpbGUuc2V0RXhlY3V0YWJsZSh0cnVlLCBmYWxzZSkKKyAgICB9Cit9CisKK3Rhc2sgZ2VuZXJhdGVSdW5uZXJTY3JpcHRGb3JTZXJ2ZXIoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhIHJ1bm5lciBzY3JpcHQgZm9yIGNyb3NzLWNoZWNrIHRlc3RzIHdpdGggVGVzdFNlcnZlcicKKworICAgIGRlZiBzZXJ2ZXJGaWxlID0gZmlsZSgiJGJ1aWxkRGlyL3J1bnNlcnZlciR7c2NyaXB0RXh0fSIpCisKKyAgICBkZWYgcnVuU2VydmVyVGV4dCA9ICIiIlwKKyR7c2NyaXB0SGVhZH0KKworIiR7amF2YUV4ZX0iIC1jcCAiJGphclBhdGgiICItRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9JGtleVN0b3JlIiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZD10aHJpZnQgb3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0U2VydmVyICRhcmdzCisiIiIKKworICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuU2VydmVyVGV4dCcsIHJ1blNlcnZlclRleHQKKyAgICBvdXRwdXRzLmZpbGUgc2VydmVyRmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgc2VydmVyRmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIHNlcnZlckZpbGUudGV4dCA9IHJ1blNlcnZlclRleHQKKyAgICAgICAgc2VydmVyRmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvck5vbmJsb2NraW5nU2VydmVyKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYSBydW5uZXIgc2NyaXB0IGZvciBjcm9zcy1jaGVjayB0ZXN0cyB3aXRoIFRlc3ROb25ibG9ja2luZ1NlcnZlcicKKworICAgIGRlZiBzZXJ2ZXJGaWxlID0gZmlsZSgiJGJ1aWxkRGlyL3J1bm5vbmJsb2NraW5nc2VydmVyJHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5TZXJ2ZXJUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT0ka2V5U3RvcmUiIC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3ROb25ibG9ja2luZ1NlcnZlciAkYXJncworIiIiCisKKyAgICBpbnB1dHMucHJvcGVydHkgJ3J1blNlcnZlclRleHQnLCBydW5TZXJ2ZXJUZXh0CisgICAgb3V0cHV0cy5maWxlIHNlcnZlckZpbGUKKworICAgIGRvTGFzdCB7CisgICAgICAgIHNlcnZlckZpbGUucGFyZW50RmlsZS5ta2RpcnMoKQorICAgICAgICBzZXJ2ZXJGaWxlLnRleHQgPSBydW5TZXJ2ZXJUZXh0CisgICAgICAgIHNlcnZlckZpbGUuc2V0RXhlY3V0YWJsZSh0cnVlLCBmYWxzZSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZ2VuZXJhdGVUZXN0VGhyaWZ0LmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTM3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvZ2VuZXJhdGVUZXN0VGhyaWZ0LmdyYWRsZQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIEdlbmVyYXRlZCBjb2RlIGxvY2F0aW9ucyBmb3IgVW5pdCB0ZXN0cworZXh0LmdlblNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tamF2YSIpCitleHQuZ2VuQmVhblNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tamF2YWJlYW4iKQorZXh0LmdlblJldXNlU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhcmV1c2UiKQorZXh0LmdlbkZ1bGxDYW1lbFNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tZnVsbGNhbWVsIikKK2V4dC5nZW5VbnNhZmVTcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLXVuc2FmZSIpCisKKy8vIEFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgZGlyZWN0b3JpZXMgdG8gdGhlIHRlc3Qgc291cmNlIHNldAorc291cmNlU2V0cyB7CisgICAgdGVzdC5qYXZhLnNyY0RpcnMgZ2VuU3JjLCBnZW5CZWFuU3JjLCBnZW5SZXVzZVNyYywgZ2VuRnVsbENhbWVsU3JjLCBnZW5VbnNhZmVTcmMKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBnZW5lcmF0aW9uIGZvciBVbml0IFRlc3RpbmcKKworLy8gQSBjYWxsYWJsZSBjbG9zdXJlIHRvIG1ha2UgdGhpcyBlYXNpZXIKK2V4dC50aHJpZnRDb21waWxlID0geyBUYXNrIHRhc2ssIFN0cmluZyB0aHJpZnRGaWxlTmFtZSwgU3RyaW5nIGdlbmVyYXRvciA9ICdqYXZhJywgRmlsZSBvdXRwdXREaXIgPSBnZW5TcmMgLT4KKyAgICBkZWYgdGhyaWZ0RmlsZSA9IGZpbGUoIiR0aHJpZnRSb290L3Rlc3QvJHRocmlmdEZpbGVOYW1lIikKKyAgICBhc3NlcnQgdGhyaWZ0RmlsZS5leGlzdHMoKQorCisgICAgdGFzay5pbnB1dHMuZmlsZSB0aHJpZnRGaWxlCisgICAgdGFzay5vdXRwdXRzLmRpciBvdXRwdXREaXIKKworICAgIHRhc2suZG9MYXN0IHsKKyAgICAgICAgb3V0cHV0RGlyLm1rZGlycygpCisgICAgICAgIGRlZiByZXN1bHQgPSBleGVjIHsKKyAgICAgICAgICAgIGV4ZWN1dGFibGUgZmlsZSh0aHJpZnRDb21waWxlcikKKyAgICAgICAgICAgIGFyZ3MgJy0tZ2VuJywgZ2VuZXJhdG9yCisgICAgICAgICAgICBhcmdzICctb3V0Jywgb3V0cHV0RGlyCisgICAgICAgICAgICBhcmdzIHRocmlmdEZpbGUKKyAgICAgICAgICAgIHN0YW5kYXJkT3V0cHV0ID0gdGFzay5vdXRwdXRCdWZmZXIKKyAgICAgICAgICAgIGVycm9yT3V0cHV0ID0gdGFzay5vdXRwdXRCdWZmZXIKKyAgICAgICAgICAgIGlnbm9yZUV4aXRWYWx1ZSA9IHRydWUKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0LmV4aXRWYWx1ZSAhPSAwKSB7CisgICAgICAgICAgICAvLyBPbmx5IHNob3cgdGhlIFRocmlmdCBjb21waWxlciBvdXRwdXQgb24gZmFpbHVyZXMsIGN1dHMgZG93biBvbiBub2lzZSEKKyAgICAgICAgICAgIHByaW50bG4gdGFzay5vdXRwdXRCdWZmZXIudG9TdHJpbmcoKQorICAgICAgICAgICAgcmVzdWx0LnJldGhyb3dGYWlsdXJlKCkKKyAgICAgICAgfQorICAgIH0KK30KKwordGFzayBnZW5lcmF0ZShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGFsbCB1bml0IHRlc3QgVGhyaWZ0IHNvdXJjZXMnCisgICAgY29tcGlsZVRlc3RKYXZhLmRlcGVuZHNPbiBpdAorfQorCit0YXNrIGdlbmVyYXRlSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmEgc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ1RocmlmdFRlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnSmF2YVR5cGVzLnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0RlYnVnUHJvdG9UZXN0LnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnTWFueU9wdGlvbmFscy50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhRGVlcENvcHlUZXN0LnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0VudW1Db250YWluZXJzVGVzdC50aHJpZnQnKQorfQorCit0YXNrIGdlbmVyYXRlQmVhbkphdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhYmVhbiBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnSmF2YUJlYW5zVGVzdC50aHJpZnQnLCAnamF2YTpiZWFucyxub2NhbWVsJywgZ2VuQmVhblNyYykKK30KKwordGFzayBnZW5lcmF0ZVJldXNlSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmFyZXVzZSBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRnVsbENhbWVsVGVzdC50aHJpZnQnLCAnamF2YTpmdWxsY2FtZWwnLCBnZW5GdWxsQ2FtZWxTcmMpCit9CisKK3Rhc2sgZ2VuZXJhdGVGdWxsQ2FtZWxKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tZnVsbGNhbWVsIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdSZXVzZU9iamVjdHMudGhyaWZ0JywgJ2phdmE6cmV1c2Utb2JqZWN0cycsIGdlblJldXNlU3JjKQorfQorCit0YXNrIGdlbmVyYXRlVW5zYWZlQmluYXJpZXNKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tdW5zYWZlYmluYXJpZXMgc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ1Vuc2FmZVR5cGVzLnRocmlmdCcsICdqYXZhOnVuc2FmZV9iaW5hcmllcycsIGdlblVuc2FmZVNyYykKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9wdWJsaXNoaW5nLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9wdWJsaXNoaW5nLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjA0MDQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5zdGFsbGF0aW9uIHN1YnRhc2tzLCBub3QgdXNlZCBjdXJyZW50bHksIHdlIHVzZSAibWFrZSBpbnN0YWxsL2Zhc3QiCit0YXNrIGluc3RhbGxEaXN0KHR5cGU6IENvcHksIGdyb3VwOiAnSW5zdGFsbCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICJDb3B5IFRocmlmdCBKQVIgYW5kIGRlcGVuZGVuY2llcyBpbnRvICRpbnN0YWxsUGF0aCBsb2NhdGlvbiIKKworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZShpbnN0YWxsUGF0aCkKKworICAgIGZyb20gamFyCisgICAgZnJvbSBjb25maWd1cmF0aW9ucy5jb21waWxlCit9CisKK3Rhc2sgaW5zdGFsbEphdmFkb2ModHlwZTogQ29weSwgZ3JvdXA6ICdJbnN0YWxsJywgZGVwZW5kc09uOiBqYXZhZG9jKSB7CisgICAgZGVzY3JpcHRpb24gPSAiSW5zdGFsbCBUaHJpZnQgSmF2YURvYyBpbnRvICRpbnN0YWxsSmF2YWRvY1BhdGggbG9jYXRpb24iCisKKyAgICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoaW5zdGFsbEphdmFkb2NQYXRoKQorCisgICAgZnJvbSBqYXZhZG9jLmRlc3RpbmF0aW9uRGlyCit9CisKKy8vIFRoaXMgaXMgbm90IG5lZWRlZCBieSBHcmFkbGUgYnVpbGRzIGJ1dCB0aGUgcmVtYWluaW5nIEFudCBidWlsZHMgc2VlbSB0bworLy8gbmVlZCBhY2Nlc3MgdG8gdGhlIGdlbmVyYXRlZCB0ZXN0IGNsYXNzZXMgZm9yIFRocmlmdCB1bml0IHRlc3RzIHNvIHdlCisvLyBhc3Npc3QgdGhlbSB0byB1c2UgaXQgdGhpcyB3YXkuCit0YXNrIGNvcHlEZXBlbmRlbmNpZXModHlwZTogQ29weSwgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdDb3B5IHJ1bnRpbWUgZGVwZW5kZW5jaWVzIGluIGEgY29tbW9uIGxvY2F0aW9uIGZvciBvdGhlciBBbnQgYmFzZWQgcHJvamVjdHMnCisgICAgcHJvamVjdC5hc3NlbWJsZS5kZXBlbmRzT24gaXQKKworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZSgiJGJ1aWxkRGlyL2RlcHMiKQorICAgIGZyb20gY29uZmlndXJhdGlvbnMudGVzdFJ1bnRpbWUKKyAgICAvLyBleGNsdWRlIHNvbWUgdmVyeSBzcGVjaWZpYyB1bml0IHRlc3QgZGVwZW5kZW5jaWVzCisgICAgZXhjbHVkZSAnKiovanVuaXQqLmphcicsICcqKi9tb2NraXRvKi5qYXInLCAnKiovaGFtY3Jlc3QqLmphcicKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWxsb3cgdGhpcyBjb25maWd1cmF0aW9uIHRvIGJlIHNoYXJlZCBiZXR3ZWVuIGluc3RhbGwgYW5kIHVwbG9hZEFyY2hpdmVzIHRhc2tzCitkZWYgY29uZmlndXJlUG9tKHBvbSkgeworICAgIHBvbS5wcm9qZWN0IHsKKyAgICAgICAgbmFtZSAnQXBhY2hlIFRocmlmdCcKKyAgICAgICAgZGVzY3JpcHRpb24gJ1RocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuJworICAgICAgICBwYWNrYWdpbmcgJ2phcicKKyAgICAgICAgdXJsICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnCisKKyAgICAgICAgc2NtIHsKKyAgICAgICAgICAgIHVybCAnaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0JworICAgICAgICAgICAgY29ubmVjdGlvbiAnc2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQnCisgICAgICAgICAgICBkZXZlbG9wZXJDb25uZWN0aW9uICdzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCcKKyAgICAgICAgfQorCisgICAgICAgIGxpY2Vuc2VzIHsKKyAgICAgICAgICAgIGxpY2Vuc2UgeworICAgICAgICAgICAgICAgIG5hbWUgJ1RoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAnCisgICAgICAgICAgICAgICAgdXJsICIke3Byb2plY3QubGljZW5zZX0iCisgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uICdyZXBvJworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGV2ZWxvcGVycyB7CisgICAgICAgICAgICBkZXZlbG9wZXIgeworICAgICAgICAgICAgICAgIGlkICdkZXYnCisgICAgICAgICAgICAgICAgbmFtZSAnQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJworICAgICAgICAgICAgICAgIGVtYWlsICdkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwb20ud2hlbkNvbmZpZ3VyZWQgeworICAgICAgICAvLyBGaXh1cCB0aGUgc2NvcGUgZm9yIHNlcnZsZXQtYXBpIHRvIGJlICdwcm92aWRlZCcgaW5zdGVhZCBvZiAnY29tcGlsZScKKyAgICAgICAgZGVwZW5kZW5jaWVzLmZpbmQgeyBkZXAgLT4gZGVwLmdyb3VwSWQgPT0gJ2phdmF4LnNlcnZsZXQnICYmIGRlcC5hcnRpZmFjdElkID09ICdzZXJ2bGV0LWFwaScgfS53aXRoIHsKKyAgICAgICAgICAgIC8vIGl0Lm9wdGlvbmFsID0gdHJ1ZQorICAgICAgICAgICAgaXQuc2NvcGUgPSAncHJvdmlkZWQnCisgICAgICAgIH0KKyAgICB9Cit9CisKK2luc3RhbGwgeworICAgIHJlcG9zaXRvcmllcy5tYXZlbkluc3RhbGxlciB7CisgICAgICAgIGNvbmZpZ3VyZVBvbShwb20pCisgICAgfQorfQorCit1cGxvYWRBcmNoaXZlcyB7CisgICAgZGVwZW5kc09uIHRlc3QgLy8gbWFrZSBzdXJlIHdlIHJ1biB1bml0IHRlc3RzIHdoZW4gcHVibGlzaGluZworICAgIHJlcG9zaXRvcmllcy5tYXZlbkRlcGxveWVyIHsKKyAgICAgICAgLy8gc2lnblBvbSB3aWxsIHNpbGVudGx5IGRvIG5vdGhpbmcgd2hlbiBubyBzaWduaW5nIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkCisgICAgICAgIGJlZm9yZURlcGxveW1lbnQgeyBNYXZlbkRlcGxveW1lbnQgZGVwbG95bWVudCAtPiBzaWduaW5nLnNpZ25Qb20oZGVwbG95bWVudCkgfQorICAgICAgICByZXBvc2l0b3J5KHVybDogcHJvamVjdC5tYXZlblJlcG9zaXRvcnlVcmwpIHsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCdtYXZlblVzZXInKSAmJiBwcm9qZWN0Lmhhc1Byb3BlcnR5KCdtYXZlblBhc3N3b3JkJykpIHsKKyAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbih1c2VyTmFtZTogbWF2ZW5Vc2VyLCBwYXNzd29yZDogbWF2ZW5QYXNzd29yZCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb25maWd1cmVQb20ocG9tKQorICAgIH0KK30KKworLy8gU2lnbmluZyBjb25maWd1cmF0aW9uLCBvcHRpb25hbCwgb25seSB3aGVuIHJlbGVhc2UgYW5kIHVwbG9hZEFyY2hpdmVzIGlzIGFjdGl2YXRlZAorc2lnbmluZyB7CisgICAgcmVxdWlyZWQgeyAhdmVyc2lvbi5lbmRzV2l0aCgiU05BUFNIT1QiKSAmJiBncmFkbGUudGFza0dyYXBoLmhhc1Rhc2soInVwbG9hZEFyY2hpdmVzIikgfQorICAgIHNpZ24gY29uZmlndXJhdGlvbnMuYXJjaGl2ZXMKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9zb3VyY2VDb25maWd1cmF0aW9uLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9zb3VyY2VDb25maWd1cmF0aW9uLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGQwMzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzb3VyY2Ugc2V0cyBmb3IgbWFpbiBhbmQgdGVzdCBzb3VyY2VzCitzb3VyY2VTZXRzIHsKKyAgICBtYWluIHsKKyAgICAgICAgamF2YSB7CisgICAgICAgICAgICBzcmNEaXIgJ3NyYycKKyAgICAgICAgfQorICAgIH0KKyAgICB0ZXN0IHsKKyAgICAgICAgamF2YSB7CisgICAgICAgICAgICBzcmNEaXIgJ3Rlc3QnCisgICAgICAgICAgICAvLyBzZWUgZnVuY3Rpb25hbFRlc3RzLmdyYWRsZSBmb3IgdGhlc2UgZmlsZXMKKyAgICAgICAgICAgIGV4Y2x1ZGUgJyoqL3Rlc3QvVGVzdENsaWVudC5qYXZhJworICAgICAgICAgICAgZXhjbHVkZSAnKiovdGVzdC9UZXN0U2VydmVyLmphdmEnCisgICAgICAgICAgICBleGNsdWRlICcqKi90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhJworICAgICAgICB9CisgICAgICAgIHJlc291cmNlcyB7CisgICAgICAgICAgICBzcmNEaXIgJ3Rlc3QnCisgICAgICAgICAgICBpbmNsdWRlICdsb2c0ai5wcm9wZXJ0aWVzJworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21waWxlciBjb25maWd1cmF0aW9uIGRldGFpbHMKKworc291cmNlQ29tcGF0aWJpbGl0eSA9ICcxLjgnCit0YXJnZXRDb21wYXRpYmlsaXR5ID0gJzEuOCcKKwordGFza3Mud2l0aFR5cGUoSmF2YUNvbXBpbGUpIHsKKyAgICBvcHRpb25zLmVuY29kaW5nID0gJ1VURi04JworICAgIG9wdGlvbnMuZGVidWcgPSB0cnVlCisgICAgb3B0aW9ucy5kZXByZWNhdGlvbiA9IHRydWUKKyAgICAvLyBvcHRpb25zLmNvbXBpbGVyQXJncy5hZGRBbGwoJy1YbGludDp1bmNoZWNrZWQnKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKYXIgcGFja2FnaW5nIGRldGFpbHMKK3Byb2Nlc3NSZXNvdXJjZXMgeworICAgIGludG8oJ01FVEEtSU5GJykgeworICAgICAgICBmcm9tICIkdGhyaWZ0Um9vdC9MSUNFTlNFIgorICAgICAgICBmcm9tICIkdGhyaWZ0Um9vdC9OT1RJQ0UiCisgICAgICAgIHJlbmFtZSgnKC4rKScsICckMS50eHQnKQorICAgIH0KK30KKworamFyIHsKKyAgICBwcm9qZWN0LnRlc3QuZGVwZW5kc09uIGl0CisgICAgbWFuaWZlc3QgeworICAgICAgICBhdHRyaWJ1dGVzKFsKKyAgICAgICAgICAgICJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIjogIiR7cHJvamVjdC52ZXJzaW9ufSIsCisgICAgICAgICAgICAiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiI6ICIyIiwKKyAgICAgICAgICAgICJCdW5kbGUtU3ltYm9saWNOYW1lIjogIiR7cHJvamVjdC5ncm91cH0iLAorICAgICAgICAgICAgIkJ1bmRsZS1OYW1lIjogIkFwYWNoZSBUaHJpZnQiLAorICAgICAgICAgICAgIkJ1bmRsZS1WZXJzaW9uIjogIiR7cHJvamVjdC52ZXJzaW9ufSIsCisgICAgICAgICAgICAiQnVuZGxlLURlc2NyaXB0aW9uIjogIkFwYWNoZSBUaHJpZnQgbGlicmFyeSIsCisgICAgICAgICAgICAiQnVuZGxlLUxpY2Vuc2UiOiAiJHtwcm9qZWN0LmxpY2Vuc2V9IiwKKyAgICAgICAgICAgICJCdW5kbGUtQWN0aXZhdGlvblBvbGljeSI6ICJsYXp5IiwKKyAgICAgICAgICAgICJFeHBvcnQtUGFja2FnZSI6ICIke3Byb2plY3QuZ3JvdXB9LmFzeW5jO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS5wcm90b2NvbCwke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCxvcmcuc2xmNGosJHtwcm9qZWN0Lmdyb3VwfVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5wcm90b2NvbDt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0LCR7cHJvamVjdC5ncm91cH0sJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWVcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0uc2VydmVyO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsJHtwcm9qZWN0Lmdyb3VwfS5wcm90b2NvbCwke3Byb2plY3QuZ3JvdXB9LG9yZy5zbGY0aixqYXZheC5zZXJ2bGV0LGphdmF4LnNlcnZsZXQuaHR0cFwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQ7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0sb3JnLmFwYWNoZS5odHRwLmNsaWVudCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHksb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLG9yZy5hcGFjaGUuaHR0cCxvcmcuc2xmNGosamF2YXgubmV0LnNzbCxqYXZheC5uZXQsamF2YXguc2VjdXJpdHkuc2FzbCxqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrXCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9O3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS5wcm90b2NvbCwke3Byb2plY3QuZ3JvdXB9LmFzeW5jLCR7cHJvamVjdC5ncm91cH0uc2VydmVyLCR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0LG9yZy5zbGY0aixvcmcuYXBhY2hlLmxvZzRqLCR7cHJvamVjdC5ncm91cH0uc2NoZW1lXCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9Lm1ldGFfZGF0YTt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH1cIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0uc2NoZW1lO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS5wcm90b2NvbCwke3Byb2plY3QuZ3JvdXB9XCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiIsCisgICAgICAgICAgICAiSW1wb3J0LVBhY2thZ2UiOiAiamF2YXgubmV0LGphdmF4Lm5ldC5zc2wsamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjayxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlcnZsZXQ7cmVzb2x1dGlvbjo9b3B0aW9uYWwsamF2YXguc2VydmxldC5odHRwO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5zbGY0ajtyZXNvbHV0aW9uOj1vcHRpb25hbDt2ZXJzaW9uPVwiWzEuNCwyKVwiLG9yZy5hcGFjaGUuaHR0cC5jbGllbnQ7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLnBhcmFtcztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAuZW50aXR5O3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHA7cmVzb2x1dGlvbjo9b3B0aW9uYWwiCisgICAgICAgIF0pCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3VuaXRUZXN0cy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWYyZmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3VuaXRUZXN0cy5ncmFkbGUKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIEJ1bmRsZSB0aGUgdGVzdCBjbGFzc2VzIGluIGEgSkFSIGZvciBvdGhlciBBbnQgYmFzZWQgYnVpbGRzCit0YXNrIHRlc3RKYXIodHlwZTogSmFyLCBncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0Fzc2VtYmxlcyBhIGphciBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIHRlc3QgY2xhc3Nlcy4nCisgICAgcHJvamVjdC50ZXN0LmRlcGVuZHNPbiBpdAorCisgICAgY2xhc3NpZmllciAndGVzdCcKKyAgICBmcm9tIHNvdXJjZVNldHMudGVzdC5vdXRwdXQKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVW5pdCB0ZXN0IHRhc2tzIGFuZCBjb25maWd1cmF0aW9ucworCisvLyBIZWxwIHRoZSB1cCB0byBkYXRlIGFsZ29yaXRobSB0byBtYWtlIHRoZXNlIHRlc3RzIGRvbmUKK2V4dC5tYXJrVGFza0RvbmUgPSB7IHRhc2sgLT4KKyAgICBkZWYgYnVpbGRGaWxlID0gZmlsZSgiJGJ1aWxkRGlyLyR7dGFzay5uYW1lfS5mbGFnIikKKyAgICB0YXNrLmlucHV0cy5maWxlcyB0YXNrLmNsYXNzcGF0aAorICAgIHRhc2sub3V0cHV0cy5maWxlIGJ1aWxkRmlsZQorICAgIHRhc2suZG9MYXN0IHsKKyAgICAgICAgYnVpbGRGaWxlLnRleHQgPSAnUGFzc2VkIScKKyAgICB9Cit9CisKK3Rhc2sgZGVwcmVjYXRlZEVxdWFsaXR5VGVzdCh0eXBlOiBKYXZhRXhlYywgZ3JvdXA6ICdWZXJpZmljYXRpb24nKSB7CisgICAgZGVzY3JpcHRpb24gPSAnUnVuIHRoZSBub24tSlVuaXQgdGVzdCBzdWl0ZSAnCisgICAgY2xhc3NwYXRoID0gc291cmNlU2V0cy50ZXN0LnJ1bnRpbWVDbGFzc3BhdGgKKyAgICBtYWluICdvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkVxdWFsaXR5VGVzdCcKKyAgICBtYXJrVGFza0RvbmUoaXQpCit9CisKK3Rhc2sgZGVwcmVjYXRlZEphdmFCZWFuc1Rlc3QodHlwZTogSmF2YUV4ZWMsIGdyb3VwOiAnVmVyaWZpY2F0aW9uJykgeworICAgIGRlc2NyaXB0aW9uID0gJ1J1biB0aGUgbm9uLUpVbml0IHRlc3Qgc3VpdGUgJworICAgIGNsYXNzcGF0aCA9IHNvdXJjZVNldHMudGVzdC5ydW50aW1lQ2xhc3NwYXRoCisgICAgbWFpbiAnb3JnLmFwYWNoZS50aHJpZnQudGVzdC5KYXZhQmVhbnNUZXN0JworICAgIG1hcmtUYXNrRG9uZShpdCkKK30KKworLy8gTWFpbiBVbml0IFRlc3QgdGFzayBjb25maWd1cmF0aW9uCit0ZXN0IHsKKyAgICBkZXNjcmlwdGlvbj0iUnVuIHRoZSBmdWxsIHRlc3Qgc3VpdGUiCisgICAgZGVwZW5kc09uIGRlcHJlY2F0ZWRFcXVhbGl0eVRlc3QsIGRlcHJlY2F0ZWRKYXZhQmVhbnNUZXN0CisKKyAgICAvLyBBbGxvdyByZXBlYXRpbmcgdGVzdHMgZXZlbiBhZnRlciBzdWNjZXNzZnVsIGV4ZWN1dGlvbgorICAgIGlmIChwcm9qZWN0Lmhhc1Byb3BlcnR5KCdyZXJ1blRlc3RzJykpIHsKKyAgICAgICAgb3V0cHV0cy51cFRvRGF0ZVdoZW4geyBmYWxzZSB9CisgICAgfQorCisgICAgaW5jbHVkZSAnKiovVGVzdCouY2xhc3MnCisgICAgZXhjbHVkZSAnKiovVGVzdCpcJCouY2xhc3MnCisKKyAgICBtYXhIZWFwU2l6ZSA9ICc1MTJtJworICAgIGZvcmtFdmVyeSA9IDEKKworICAgIHN5c3RlbVByb3BlcnRpZXMgPSBbCisgICAgICAgICdidWlsZC50ZXN0JzogIiR7Y29tcGlsZVRlc3RKYXZhLmRlc3RpbmF0aW9uRGlyfSIsCisgICAgICAgICd0ZXN0LnBvcnQnOiAiJHt0ZXN0UG9ydH0iLAorICAgICAgICAnamF2YXgubmV0LnNzbC50cnVzdFN0b3JlJzogIiR7cHJvamVjdERpcn0vdGVzdC8udHJ1c3RzdG9yZSIsCisgICAgICAgICdqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCc6ICd0aHJpZnQnLAorICAgICAgICAnamF2YXgubmV0LnNzbC5rZXlTdG9yZSc6ICIke3Byb2plY3REaXJ9L3Rlc3QvLmtleXN0b3JlIiwKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCc6ICd0aHJpZnQnCisgICAgXQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzQwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyBiL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyYmJlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1IEBACitkaXN0cmlidXRpb25CYXNlPUdSQURMRV9VU0VSX0hPTUUKK2Rpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cworemlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUKK3ppcFN0b3JlUGF0aD13cmFwcGVyL2Rpc3RzCitkaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS00LjQuMS1iaW4uemlwCmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGV3IGIvbGliL2phdmEvZ3JhZGxldwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jY2NkZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxldwpAQCAtMCwwICsxLDE3MiBAQAorIyEvdXNyL2Jpbi9lbnYgc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgIEdyYWRsZSBzdGFydCB1cCBzY3JpcHQgZm9yIFVOKlgKKyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBdHRlbXB0IHRvIHNldCBBUFBfSE9NRQorIyBSZXNvbHZlIGxpbmtzOiAkMCBtYXkgYmUgYSBsaW5rCitQUkc9IiQwIgorIyBOZWVkIHRoaXMgZm9yIHJlbGF0aXZlIHN5bWxpbmtzLgord2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCisgICAgbHM9YGxzIC1sZCAiJFBSRyJgCisgICAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICAgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIFBSRz0iJGxpbmsiCisgICAgZWxzZQorICAgICAgICBQUkc9YGRpcm5hbWUgIiRQUkciYCIvJGxpbmsiCisgICAgZmkKK2RvbmUKK1NBVkVEPSJgcHdkYCIKK2NkICJgZGlybmFtZSBcIiRQUkdcImAvIiA+L2Rldi9udWxsCitBUFBfSE9NRT0iYHB3ZCAtUGAiCitjZCAiJFNBVkVEIiA+L2Rldi9udWxsCisKK0FQUF9OQU1FPSJHcmFkbGUiCitBUFBfQkFTRV9OQU1FPWBiYXNlbmFtZSAiJDAiYAorCisjIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0LgorREVGQVVMVF9KVk1fT1BUUz0iIgorCisjIFVzZSB0aGUgbWF4aW11bSBhdmFpbGFibGUsIG9yIHNldCBNQVhfRkQgIT0gLTEgdG8gdXNlIHRoYXQgdmFsdWUuCitNQVhfRkQ9Im1heGltdW0iCisKK3dhcm4gKCkgeworICAgIGVjaG8gIiQqIgorfQorCitkaWUgKCkgeworICAgIGVjaG8KKyAgICBlY2hvICIkKiIKKyAgICBlY2hvCisgICAgZXhpdCAxCit9CisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydCAobXVzdCBiZSAndHJ1ZScgb3IgJ2ZhbHNlJykuCitjeWd3aW49ZmFsc2UKK21zeXM9ZmFsc2UKK2Rhcndpbj1mYWxzZQorbm9uc3RvcD1mYWxzZQorY2FzZSAiYHVuYW1lYCIgaW4KKyAgQ1lHV0lOKiApCisgICAgY3lnd2luPXRydWUKKyAgICA7OworICBEYXJ3aW4qICkKKyAgICBkYXJ3aW49dHJ1ZQorICAgIDs7CisgIE1JTkdXKiApCisgICAgbXN5cz10cnVlCisgICAgOzsKKyAgTk9OU1RPUCogKQorICAgIG5vbnN0b3A9dHJ1ZQorICAgIDs7Citlc2FjCisKK0NMQVNTUEFUSD0kQVBQX0hPTUUvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCisKKyMgRGV0ZXJtaW5lIHRoZSBKYXZhIGNvbW1hbmQgdG8gdXNlIHRvIHN0YXJ0IHRoZSBKVk0uCitpZiBbIC1uICIkSkFWQV9IT01FIiBdIDsgdGhlbgorICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvanJlL3NoL2phdmEiIF0gOyB0aGVuCisgICAgICAgICMgSUJNJ3MgSkRLIG9uIEFJWCB1c2VzIHN0cmFuZ2UgbG9jYXRpb25zIGZvciB0aGUgZXhlY3V0YWJsZXMKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIKKyAgICBlbHNlCisgICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvYmluL2phdmEiCisgICAgZmkKKyAgICBpZiBbICEgLXggIiRKQVZBQ01EIiBdIDsgdGhlbgorICAgICAgICBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAkSkFWQV9IT01FCisKK1BsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iCisgICAgZmkKK2Vsc2UKKyAgICBKQVZBQ01EPSJqYXZhIgorICAgIHdoaWNoIGphdmEgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguCisKK1BsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iCitmaQorCisjIEluY3JlYXNlIHRoZSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvcnMgaWYgd2UgY2FuLgoraWYgWyAiJGN5Z3dpbiIgPSAiZmFsc2UiIC1hICIkZGFyd2luIiA9ICJmYWxzZSIgLWEgIiRub25zdG9wIiA9ICJmYWxzZSIgXSA7IHRoZW4KKyAgICBNQVhfRkRfTElNSVQ9YHVsaW1pdCAtSCAtbmAKKyAgICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuCisgICAgICAgIGlmIFsgIiRNQVhfRkQiID0gIm1heGltdW0iIC1vICIkTUFYX0ZEIiA9ICJtYXgiIF0gOyB0aGVuCisgICAgICAgICAgICBNQVhfRkQ9IiRNQVhfRkRfTElNSVQiCisgICAgICAgIGZpCisgICAgICAgIHVsaW1pdCAtbiAkTUFYX0ZECisgICAgICAgIGlmIFsgJD8gLW5lIDAgXSA7IHRoZW4KKyAgICAgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBzZXQgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkQiCisgICAgICAgIGZpCisgICAgZWxzZQorICAgICAgICB3YXJuICJDb3VsZCBub3QgcXVlcnkgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkRfTElNSVQiCisgICAgZmkKK2ZpCisKKyMgRm9yIERhcndpbiwgYWRkIG9wdGlvbnMgdG8gc3BlY2lmeSBob3cgdGhlIGFwcGxpY2F0aW9uIGFwcGVhcnMgaW4gdGhlIGRvY2sKK2lmICRkYXJ3aW47IHRoZW4KKyAgICBHUkFETEVfT1BUUz0iJEdSQURMRV9PUFRTIFwiLVhkb2NrOm5hbWU9JEFQUF9OQU1FXCIgXCItWGRvY2s6aWNvbj0kQVBQX0hPTUUvbWVkaWEvZ3JhZGxlLmljbnNcIiIKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgc3dpdGNoIHBhdGhzIHRvIFdpbmRvd3MgZm9ybWF0IGJlZm9yZSBydW5uaW5nIGphdmEKK2lmICRjeWd3aW4gOyB0aGVuCisgICAgQVBQX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRBUFBfSE9NRSJgCisgICAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQ0xBU1NQQVRIImAKKyAgICBKQVZBQ01EPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFDTUQiYAorCisgICAgIyBXZSBidWlsZCB0aGUgcGF0dGVybiBmb3IgYXJndW1lbnRzIHRvIGJlIGNvbnZlcnRlZCB2aWEgY3lncGF0aAorICAgIFJPT1RESVJTUkFXPWBmaW5kIC1MIC8gLW1heGRlcHRoIDEgLW1pbmRlcHRoIDEgLXR5cGUgZCAyPi9kZXYvbnVsbGAKKyAgICBTRVA9IiIKKyAgICBmb3IgZGlyIGluICRST09URElSU1JBVyA7IGRvCisgICAgICAgIFJPT1RESVJTPSIkUk9PVERJUlMkU0VQJGRpciIKKyAgICAgICAgU0VQPSJ8IgorICAgIGRvbmUKKyAgICBPVVJDWUdQQVRURVJOPSIoXigkUk9PVERJUlMpKSIKKyAgICAjIEFkZCBhIHVzZXItZGVmaW5lZCBwYXR0ZXJuIHRvIHRoZSBjeWdwYXRoIGFyZ3VtZW50cworICAgIGlmIFsgIiRHUkFETEVfQ1lHUEFUVEVSTiIgIT0gIiIgXSA7IHRoZW4KKyAgICAgICAgT1VSQ1lHUEFUVEVSTj0iJE9VUkNZR1BBVFRFUk58KCRHUkFETEVfQ1lHUEFUVEVSTikiCisgICAgZmkKKyAgICAjIE5vdyBjb252ZXJ0IHRoZSBhcmd1bWVudHMgLSBrbHVkZ2UgdG8gbGltaXQgb3Vyc2VsdmVzIHRvIC9iaW4vc2gKKyAgICBpPTAKKyAgICBmb3IgYXJnIGluICIkQCIgOyBkbworICAgICAgICBDSEVDSz1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIiRPVVJDWUdQQVRURVJOIiAtYAorICAgICAgICBDSEVDSzI9YGVjaG8gIiRhcmcifGVncmVwIC1jICJeLSJgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIERldGVybWluZSBpZiBhbiBvcHRpb24KKworICAgICAgICBpZiBbICRDSEVDSyAtbmUgMCBdICYmIFsgJENIRUNLMiAtZXEgMCBdIDsgdGhlbiAgICAgICAgICAgICAgICAgICAgIyMjIEFkZGVkIGEgY29uZGl0aW9uCisgICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9YGN5Z3BhdGggLS1wYXRoIC0taWdub3JlIC0tbWl4ZWQgIiRhcmciYAorICAgICAgICBlbHNlCisgICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9IlwiJGFyZ1wiIgorICAgICAgICBmaQorICAgICAgICBpPSQoKGkrMSkpCisgICAgZG9uZQorICAgIGNhc2UgJGkgaW4KKyAgICAgICAgKDApIHNldCAtLSA7OworICAgICAgICAoMSkgc2V0IC0tICIkYXJnczAiIDs7CisgICAgICAgICgyKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgOzsKKyAgICAgICAgKDMpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiA7OworICAgICAgICAoNCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiIDs7CisgICAgICAgICg1KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgOzsKKyAgICAgICAgKDYpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiA7OworICAgICAgICAoNykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiIDs7CisgICAgICAgICg4KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgOzsKKyAgICAgICAgKDkpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiAiJGFyZ3M4IiA7OworICAgIGVzYWMKK2ZpCisKKyMgRXNjYXBlIGFwcGxpY2F0aW9uIGFyZ3MKK3NhdmUgKCkgeworICAgIGZvciBpIGRvIHByaW50ZiAlc1xcbiAiJGkiIHwgc2VkICJzLycvJ1xcXFwnJy9nOzFzL14vJy87XCRzL1wkLycgXFxcXC8iIDsgZG9uZQorICAgIGVjaG8gIiAiCit9CitBUFBfQVJHUz0kKHNhdmUgIiRAIikKKworIyBDb2xsZWN0IGFsbCBhcmd1bWVudHMgZm9yIHRoZSBqYXZhIGNvbW1hbmQsIGZvbGxvd2luZyB0aGUgc2hlbGwgcXVvdGluZyBhbmQgc3Vic3RpdHV0aW9uIHJ1bGVzCitldmFsIHNldCAtLSAkREVGQVVMVF9KVk1fT1BUUyAkSkFWQV9PUFRTICRHUkFETEVfT1BUUyAiXCItRG9yZy5ncmFkbGUuYXBwbmFtZT0kQVBQX0JBU0VfTkFNRVwiIiAtY2xhc3NwYXRoICJcIiRDTEFTU1BBVEhcIiIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICIkQVBQX0FSR1MiCisKKyMgYnkgZGVmYXVsdCB3ZSBzaG91bGQgYmUgaW4gdGhlIGNvcnJlY3QgcHJvamVjdCBkaXIsIGJ1dCB3aGVuIHJ1biBmcm9tIEZpbmRlciBvbiBNYWMsIHRoZSBjd2QgaXMgd3JvbmcKK2lmIFsgIiQodW5hbWUpIiA9ICJEYXJ3aW4iIF0gJiYgWyAiJEhPTUUiID0gIiRQV0QiIF07IHRoZW4KKyAgY2QgIiQoZGlybmFtZSAiJDAiKSIKK2ZpCisKK2V4ZWMgIiRKQVZBQ01EIiAiJEAiCmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGV3LmJhdCBiL2xpYi9qYXZhL2dyYWRsZXcuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NTUzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGV3LmJhdApAQCAtMCwwICsxLDg0IEBACitAaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZgorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQHJlbQorQHJlbSAgR3JhZGxlIHN0YXJ0dXAgc2NyaXB0IGZvciBXaW5kb3dzCitAcmVtCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0ByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgc2V0bG9jYWwKKworc2V0IERJUk5BTUU9JX5kcDAKK2lmICIlRElSTkFNRSUiID09ICIiIHNldCBESVJOQU1FPS4KK3NldCBBUFBfQkFTRV9OQU1FPSV+bjAKK3NldCBBUFBfSE9NRT0lRElSTkFNRSUKKworQHJlbSBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KK3NldCBERUZBVUxUX0pWTV9PUFRTPQorCitAcmVtIEZpbmQgamF2YS5leGUKK2lmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUKKworc2V0IEpBVkFfRVhFPWphdmEuZXhlCislSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQoraWYgIiVFUlJPUkxFVkVMJSIgPT0gIjAiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmZpbmRKYXZhRnJvbUphdmFIb21lCitzZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lCitzZXQgSkFWQV9FWEU9JUpBVkFfSE9NRSUvYmluL2phdmEuZXhlCisKK2lmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQKKworZWNoby4KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlCitlY2hvLgorZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4KKworZ290byBmYWlsCisKKzppbml0CitAcmVtIEdldCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBoYW5kbGluZyBXaW5kb3dzIHZhcmlhbnRzCisKK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGdvdG8gd2luOXhNRV9hcmdzCisKKzp3aW45eE1FX2FyZ3MKK0ByZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCitzZXQgQ01EX0xJTkVfQVJHUz0KK3NldCBfU0tJUD0yCisKKzp3aW45eE1FX2FyZ3Nfc2x1cnAKK2lmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlCisKK3NldCBDTURfTElORV9BUkdTPSUqCisKKzpleGVjdXRlCitAcmVtIFNldHVwIHRoZSBjb21tYW5kIGxpbmUKKworc2V0IENMQVNTUEFUSD0lQVBQX0hPTUUlXGdyYWRsZVx3cmFwcGVyXGdyYWRsZS13cmFwcGVyLmphcgorCitAcmVtIEV4ZWN1dGUgR3JhZGxlCisiJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUKKworOmVuZAorQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJUVSUk9STEVWRUwlIj09IjAiIGdvdG8gbWFpbkVuZAorCis6ZmFpbAorcmVtIFNldCB2YXJpYWJsZSBHUkFETEVfRVhJVF9DT05TT0xFIGlmIHlvdSBuZWVkIHRoZSBfc2NyaXB0XyByZXR1cm4gY29kZSBpbnN0ZWFkIG9mCityZW0gdGhlIF9jbWQuZXhlIC9jXyByZXR1cm4gY29kZSEKK2lmICBub3QgIiIgPT0gIiVHUkFETEVfRVhJVF9DT05TT0xFJSIgZXhpdCAxCitleGl0IC9iIDEKKworOm1haW5FbmQKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIGVuZGxvY2FsCisKKzpvbWVnYQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvaXZ5LnhtbCBiL2xpYi9qYXZhL2l2eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNTVkZWYuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvaXZ5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxpdnktbW9kdWxlIHZlcnNpb249IjEuMCI+Ci0gICAgPGluZm8gb3JnYW5pc2F0aW9uPSJvcmcuYXBhY2hlLnRocmlmdCIgbW9kdWxlPSJsaWJ0aHJpZnQiIHJldmlzaW9uPSIwLjMuMC0yMDEwMDExNiIgPgotICAgICAgPGxpY2Vuc2UgbmFtZT0iYXBhY2hlIiAvPgotICAgICAgPGl2eWF1dGhvciBuYW1lPSJUaHJpZnQgVGVhbSIgdXJsPSJ0aHJpZnQtZGV2QGluY3ViYXRvci5hcGFjaGUub3JnIiAvPgotICAgICAgPHJlcG9zaXRvcnkgbmFtZT0iYXBhY2hlIHJlcG9zaXRvcnkiIHVybD0iaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL3RocmlmdC8iIC8+Ci0gICAgICA8ZGVzY3JpcHRpb24gaG9tZXBhZ2U9Imh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy90aHJpZnQvIiAvPgotICAgIDwvaW5mbz4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLnNsZjRqIiBuYW1lPSJzbGY0ai1hcGkiIHJldj0iMS41LjgiIGNvbmY9IiogLT4gKiwhc291cmNlcywhamF2YWRvYyIvPgotICAgICAgIDxkZXBlbmRlbmN5IG9yZz0ib3JnLnNsZjRqIiBuYW1lPSJzbGY0ai1zaW1wbGUiIHJldj0iMS41LjgiIGNvbmY9IiogLT4gKiwhc291cmNlcywhamF2YWRvYyIvPgotICAgICAgIDxkZXBlbmRlbmN5IG9yZz0iY29tbW9ucy1sYW5nIiBuYW1lPSJjb21tb25zLWxhbmciIHJldj0iMi40IiBjb25mPSIqIC0+ICosIXNvdXJjZXMsIWphdmFkb2MiLz4KLSAgICAgICA8ZGVwZW5kZW5jeSBvcmc9Imp1bml0IiBuYW1lPSJqdW5pdCIgcmV2PSI0LjQiIGNvbmY9IiogLT4gKiwhc291cmNlcywhamF2YWRvYyIvPgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9pdnktbW9kdWxlPgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc2V0dGluZ3MuZ3JhZGxlIGIvbGliL2phdmEvc2V0dGluZ3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YmQ4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCityb290UHJvamVjdC5uYW1lID0gJ2xpYnRocmlmdCcKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzYzhkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksIFQgZXh0ZW5kcyBUQmFzZSwgUj4geworICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lOworCisgICAgcHVibGljIEFzeW5jUHJvY2Vzc0Z1bmN0aW9uKFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNPbmV3YXkoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0KEkgaWZhY2UsIFQgYXJncywgQXN5bmNNZXRob2RDYWxsYmFjazxSPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBUIGdldEVtcHR5QXJnc0luc3RhbmNlKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQXN5bmNNZXRob2RDYWxsYmFjazxSPiBnZXRSZXN1bHRIYW5kbGVyKGZpbmFsIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlciBmYiwgaW50IHNlcWlkKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZFJlc3BvbnNlKGZpbmFsIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgVFNlcmlhbGl6YWJsZSByZXN1bHQsIGZpbmFsIGJ5dGUgdHlwZSwgZmluYWwgaW50IHNlcWlkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIFRQcm90b2NvbCBvcHJvdCA9IGZiLmdldE91dHB1dFByb3RvY29sKCk7CisKKyAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgdHlwZSwgc2VxaWQpKTsKKyAgICAgICAgcmVzdWx0LndyaXRlKG9wcm90KTsKKyAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisKKyAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9FbmNvZGluZ1V0aWxzLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvRW5jb2RpbmdVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTRlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvRW5jb2RpbmdVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKy8qKgorICogVXRpbGl0eSBtZXRob2RzIGZvciB1c2Ugd2hlbiBlbmNvZGluZy9kZWNvZGluZyByYXcgZGF0YSBhcyBieXRlIGFycmF5cy4KKyAqLworcHVibGljIGNsYXNzIEVuY29kaW5nVXRpbHMgeworCisgIC8qKgorICAgKiBFbmNvZGUgPGNvZGU+aW50ZWdlcjwvY29kZT4gYXMgYSBzZXJpZXMgb2YgNCBieXRlcyBpbnRvIDxjb2RlPmJ1ZjwvY29kZT4KKyAgICogc3RhcnRpbmcgYXQgcG9zaXRpb24gMCB3aXRoaW4gdGhhdCBidWZmZXIuCisgICAqIAorICAgKiBAcGFyYW0gaW50ZWdlcgorICAgKiAgICAgICAgICBUaGUgaW50ZWdlciB0byBlbmNvZGUuCisgICAqIEBwYXJhbSBidWYKKyAgICogICAgICAgICAgVGhlIGJ1ZmZlciB0byB3cml0ZSB0by4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBlbmNvZGVCaWdFbmRpYW4oZmluYWwgaW50IGludGVnZXIsIGZpbmFsIGJ5dGVbXSBidWYpIHsKKyAgICBlbmNvZGVCaWdFbmRpYW4oaW50ZWdlciwgYnVmLCAwKTsKKyAgfQorCisgIC8qKgorICAgKiBFbmNvZGUgPGNvZGU+aW50ZWdlcjwvY29kZT4gYXMgYSBzZXJpZXMgb2YgNCBieXRlcyBpbnRvIDxjb2RlPmJ1ZjwvY29kZT4KKyAgICogc3RhcnRpbmcgYXQgcG9zaXRpb24gPGNvZGU+b2Zmc2V0PC9jb2RlPi4KKyAgICogCisgICAqIEBwYXJhbSBpbnRlZ2VyCisgICAqICAgICAgICAgIFRoZSBpbnRlZ2VyIHRvIGVuY29kZS4KKyAgICogQHBhcmFtIGJ1ZgorICAgKiAgICAgICAgICBUaGUgYnVmZmVyIHRvIHdyaXRlIHRvLgorICAgKiBAcGFyYW0gb2Zmc2V0CisgICAqICAgICAgICAgIFRoZSBvZmZzZXQgd2l0aGluIDxjb2RlPmJ1ZjwvY29kZT4gdG8gc3RhcnQgdGhlIGVuY29kaW5nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGVuY29kZUJpZ0VuZGlhbihmaW5hbCBpbnQgaW50ZWdlciwgZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgeworICAgIGJ1ZltvZmZzZXRdID0gKGJ5dGUpICgweGZmICYgKGludGVnZXIgPj4gMjQpKTsKKyAgICBidWZbb2Zmc2V0ICsgMV0gPSAoYnl0ZSkgKDB4ZmYgJiAoaW50ZWdlciA+PiAxNikpOworICAgIGJ1ZltvZmZzZXQgKyAyXSA9IChieXRlKSAoMHhmZiAmIChpbnRlZ2VyID4+IDgpKTsKKyAgICBidWZbb2Zmc2V0ICsgM10gPSAoYnl0ZSkgKDB4ZmYgJiAoaW50ZWdlcikpOworICB9CisKKyAgLyoqCisgICAqIERlY29kZSBhIHNlcmllcyBvZiA0IGJ5dGVzIGZyb20gPGNvZGU+YnVmPC9jb2RlPiwgc3RhcnRpbmcgYXQgcG9zaXRpb24gMCwKKyAgICogYW5kIGludGVycHJldCB0aGVtIGFzIGFuIGludGVnZXIuCisgICAqIAorICAgKiBAcGFyYW0gYnVmCisgICAqICAgICAgICAgIFRoZSBidWZmZXIgdG8gcmVhZCBmcm9tLgorICAgKiBAcmV0dXJuIEFuIGludGVnZXIsIGFzIHJlYWQgZnJvbSB0aGUgYnVmZmVyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVjb2RlQmlnRW5kaWFuKGZpbmFsIGJ5dGVbXSBidWYpIHsKKyAgICByZXR1cm4gZGVjb2RlQmlnRW5kaWFuKGJ1ZiwgMCk7CisgIH0KKworICAvKioKKyAgICogRGVjb2RlIGEgc2VyaWVzIG9mIDQgYnl0ZXMgZnJvbSA8Y29kZT5idWY8L2NvZGU+LCBzdGFydCBhdAorICAgKiA8Y29kZT5vZmZzZXQ8L2NvZGU+LCBhbmQgaW50ZXJwcmV0IHRoZW0gYXMgYW4gaW50ZWdlci4KKyAgICogCisgICAqIEBwYXJhbSBidWYKKyAgICogICAgICAgICAgVGhlIGJ1ZmZlciB0byByZWFkIGZyb20uCisgICAqIEBwYXJhbSBvZmZzZXQKKyAgICogICAgICAgICAgVGhlIG9mZnNldCB3aXRoIDxjb2RlPmJ1ZjwvY29kZT4gdG8gc3RhcnQgdGhlIGRlY29kaW5nLgorICAgKiBAcmV0dXJuIEFuIGludGVnZXIsIGFzIHJlYWQgZnJvbSB0aGUgYnVmZmVyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVjb2RlQmlnRW5kaWFuKGZpbmFsIGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKKyAgICByZXR1cm4gKChidWZbb2Zmc2V0XSAmIDB4ZmYpIDw8IDI0KSB8ICgoYnVmW29mZnNldCArIDFdICYgMHhmZikgPDwgMTYpCisgICAgICAgIHwgKChidWZbb2Zmc2V0ICsgMl0gJiAweGZmKSA8PCA4KSB8ICgoYnVmW29mZnNldCArIDNdICYgMHhmZikpOworICB9CisKKyAgLyoqCisgICAqIEJpdGZpZWxkIHV0aWxpdGllcy4KKyAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBiaXQgYXQgcG9zaXRpb24gaXMgc2V0IGluIHYuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGVzdEJpdChieXRlIHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiB0ZXN0Qml0KChpbnQpdiwgcG9zaXRpb24pOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRlc3RCaXQoc2hvcnQgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIHRlc3RCaXQoKGludCl2LCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdGVzdEJpdChpbnQgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuICh2ICYgKDEgPDwgcG9zaXRpb24pKSAhPSAwOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHRlc3RCaXQobG9uZyB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gKHYgJiAoMUwgPDwgcG9zaXRpb24pKSAhPSAwTDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHYsIHdpdGggdGhlIGJpdCBhdCBwb3NpdGlvbiBzZXQgdG8gemVyby4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBjbGVhckJpdChieXRlIHYsIGludCBwb3NpdGlvbikgeworICAgIHJldHVybiAoYnl0ZSljbGVhckJpdCgoaW50KXYsIHBvc2l0aW9uKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgY2xlYXJCaXQoc2hvcnQgdiwgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIChzaG9ydCljbGVhckJpdCgoaW50KXYsIHBvc2l0aW9uKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNsZWFyQml0KGludCB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gdiAmIH4oMSA8PCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgY2xlYXJCaXQobG9uZyB2LCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gdiAmIH4oMUwgPDwgcG9zaXRpb24pOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdiwgd2l0aCB0aGUgYml0IGF0IHBvc2l0aW9uIHNldCB0byAxIG9yIDAgZGVwZW5kaW5nIG9uIHZhbHVlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIHNldEJpdChieXRlIHYsIGludCBwb3NpdGlvbiwgYm9vbGVhbiB2YWx1ZSkgeworICAgIHJldHVybiAoYnl0ZSlzZXRCaXQoKGludCl2LCBwb3NpdGlvbiwgdmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBzZXRCaXQoc2hvcnQgdiwgaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7CisgICAgcmV0dXJuIChzaG9ydClzZXRCaXQoKGludCl2LCBwb3NpdGlvbiwgdmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2V0Qml0KGludCB2LCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZih2YWx1ZSkKKyAgICAgIHJldHVybiB2IHwgKDEgPDwgcG9zaXRpb24pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBjbGVhckJpdCh2LCBwb3NpdGlvbik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2V0Qml0KGxvbmcgdiwgaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7CisgICAgaWYodmFsdWUpCisgICAgICByZXR1cm4gdiB8ICgxTCA8PCBwb3NpdGlvbik7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGNsZWFyQml0KHYsIHBvc2l0aW9uKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2QzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvT3B0aW9uLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3B0aW9uIHR5cGUgcGF0dGVybgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3B0aW9uPFQ+IHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3B0aW9uIE5PTkUgPSBuZXcgTm9uZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgT3B0aW9uIGlzIGRlZmluZWQgb3Igbm90CisgICAgICogQHJldHVybgorICAgICAqICAgICAgICAgdHJ1ZSBpZiB0aGUgT3B0aW9uIGlzIGRlZmluZWQgKG9mIHR5cGUgU29tZSkKKyAgICAgKiAgICAgICAgIGZhbHNlIGlmIHRoZSBPcHRpb24gaXMgbm90IGRlZmluZWQgKG9mIHR5cGUgTm9uZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RlZmluZWQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIE9wdGlvbiAoaWYgaXQgaXMgZGVmaW5lZCkKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGNhbGxlZCBvbiBhIE5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVCBnZXQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGFpbmVkIHZhbHVlIChpZiBkZWZpbmVkKSBvciBlbHNlIHJldHVybiBhIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBAcGFyYW0gb3RoZXIgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkIChhIE5vbmUpCisgICAgICogQHJldHVybiBlaXRoZXIgdGhlIHZhbHVlLCBvciBvdGhlciBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZmluZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgVCBvcihUIG90aGVyKSB7CisgICAgICAgIGlmIChpc0RlZmluZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG90aGVyOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRoZSBOb25lIHR5cGUsIHJlcHJlc2VudGluZyBhbiBhYnNlbnQgdmFsdWUgKGluc3RlYWQgb2YgIm51bGwiKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uZTxUPiBleHRlbmRzIE9wdGlvbjxUPiB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmaW5lZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUIGdldCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBjYWxsIGdldCgpIG9uIE5vbmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIk5vbmUiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFNvbWUgdHlwZSwgcmVwcmVzZW50aW5nIGFuIGV4aXN0ZW5jZSBvZiBzb21lIHZhbHVlCisgICAgICogQHBhcmFtIDxUPiBUaGUgdHlwZSBvZiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU29tZTxUPiBleHRlbmRzIE9wdGlvbjxUPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgVCB2YWx1ZTsKKyAgICAgICAgcHVibGljIFNvbWUoVCB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZpbmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJTb21lKCIgKyB2YWx1ZSArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXBzIHZhbHVlIGluIGFuIE9wdGlvbiB0eXBlLCBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgdmFsdWUgaXMgbnVsbAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqIEBwYXJhbSA8VD4gdHlwZSBvZiB2YWx1ZQorICAgICAqIEByZXR1cm4gU29tZSh2YWx1ZSkgaWYgdmFsdWUgaXMgbm90IG51bGwsIE5vbmUgaWYgdmFsdWUgaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IE9wdGlvbjxUPiBmcm9tTnVsbGFibGUoVCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHNvbWUodmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5vbmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgdmFsdWUgaW4gYSBTb21lIHR5cGUgKE5CISB2YWx1ZSBtdXN0IG5vdCBiZSBudWxsISkKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdmFsdWUKKyAgICAgKiBAcmV0dXJuIGEgbmV3IFNvbWUodmFsdWUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gU29tZTxUPiBzb21lKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTb21lPFQ+KHZhbHVlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBOb25lPFQ+IG5vbmUoKSB7CisgICAgICAgIHJldHVybiAoTm9uZTxUPikgTk9ORTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjEzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzRnVuY3Rpb248SSwgVCBleHRlbmRzIFRCYXNlPiB7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWU7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2Nlc3NGdW5jdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisgIHB1YmxpYyBQcm9jZXNzRnVuY3Rpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworICB9CisKKyAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBJIGlmYWNlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVCBhcmdzID0gZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKyAgICB0cnkgeworICAgICAgYXJncy5yZWFkKGlwcm90KTsKKyAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gZSkgeworICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uUFJPVE9DT0xfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7CisgICAgICB4LndyaXRlKG9wcm90KTsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICBUU2VyaWFsaXphYmxlIHJlc3VsdCA9IG51bGw7CisgICAgYnl0ZSBtc2dUeXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZOworCisgICAgdHJ5IHsKKyAgICAgIHJlc3VsdCA9IGdldFJlc3VsdChpZmFjZSwgYXJncyk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJUcmFuc3BvcnQgZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICB0aHJvdyBleDsKKyAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJuYWwgYXBwbGljYXRpb24gZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICByZXN1bHQgPSBleDsKKyAgICAgIG1zZ1R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIGV4KTsKKyAgICAgIGlmKHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCkpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSwgZXgpOworICAgICAgaWYoIWlzT25ld2F5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICAgICAiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgICAgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT047CisgICAgICB9CisgICAgfQorCisgICAgaWYoIWlzT25ld2F5KCkpIHsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIG1zZ1R5cGUsIHNlcWlkKSk7CisgICAgICByZXN1bHQud3JpdGUob3Byb3QpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT25ld2F5KCkpIHsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCkpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsKKyAgICAgIHgud3JpdGUob3Byb3QpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBib29sZWFuIHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCl7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNPbmV3YXkoKTsKKworICBwdWJsaWMgYWJzdHJhY3QgVEJhc2UgZ2V0UmVzdWx0KEkgaWZhY2UsIFQgYXJncykgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IFQgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKworICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7CisgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU3ZDFjLi4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwotCi0vKioKLSAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcwotICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKLSAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG9ydFN0YWNrIHsKLQotICBwcml2YXRlIHNob3J0W10gdmVjdG9yOwotICBwcml2YXRlIGludCB0b3AgPSAtMTsKLQotICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07Ci0gIH0KLQotICBwdWJsaWMgc2hvcnQgcG9wKCkgewotICAgIHJldHVybiB2ZWN0b3JbdG9wLS1dOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKLSAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3AgKyAxKSB7Ci0gICAgICBncm93KCk7Ci0gICAgfQotICAgIHZlY3RvclsrK3RvcF0gPSBwdXNoZWQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZ3JvdygpIHsKLSAgICBzaG9ydFtdIG5ld1ZlY3RvciA9IG5ldyBzaG9ydFt2ZWN0b3IubGVuZ3RoICogMl07Ci0gICAgU3lzdGVtLmFycmF5Y29weSh2ZWN0b3IsIDAsIG5ld1ZlY3RvciwgMCwgdmVjdG9yLmxlbmd0aCk7Ci0gICAgdmVjdG9yID0gbmV3VmVjdG9yOwotICB9Ci0KLSAgcHVibGljIHNob3J0IHBlZWsoKSB7Ci0gICAgcmV0dXJuIHZlY3Rvclt0b3BdOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgdG9wID0gLTE7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBzYi5hcHBlbmQoIjxTaG9ydFN0YWNrIHZlY3RvcjpbIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3IubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpID09IHRvcCkgewotICAgICAgICBzYi5hcHBlbmQoIj4+Iik7Ci0gICAgICB9Ci0KLSAgICAgIHNiLmFwcGVuZCh2ZWN0b3JbaV0pOwotCi0gICAgICBpZiAoaSA9PSB0b3ApIHsKLSAgICAgICAgc2IuYXBwZW5kKCI8PCIpOwotICAgICAgfQotICAgIH0KLSAgICBzYi5hcHBlbmQoIl0+Iik7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQppbmRleCBjMjk0ZmMzLi40ZDY5M2Q5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAgKiBBcHBsaWNhdGlvbiBsZXZlbCBleGNlcHRpb24KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKK3B1YmxpYyBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIGltcGxlbWVudHMgVFNlcmlhbGl6YWJsZSB7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVEZpZWxkIE1FU1NBR0VfRklFTEQgPSBuZXcgVEZpZWxkKCJtZXNzYWdlIiwgVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CkBAIC00NSw4ICs0NSwxMiBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX1JFU1VMVCA9IDU7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX0VSUk9SID0gNjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVE9DT0xfRVJST1IgPSA3OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUFJPVE9DT0wgPSA5OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOworICBwcml2YXRlIFN0cmluZyBtZXNzYWdlXyA9IG51bGw7CiAKICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHsKICAgICBzdXBlcigpOwpAQCAtNzAsNyArNzQsMTggQEAKICAgICByZXR1cm4gdHlwZV87CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIGlmIChtZXNzYWdlXyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJldHVybiBtZXNzYWdlXzsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgewogICAgIFRGaWVsZCBmaWVsZDsKICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKIApAQCAtODMsMzIgKzk4LDQzIEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgc3dpdGNoIChmaWVsZC5pZCkgewotICAgICAgY2FzZSAxOgotICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7Ci0gICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKICAgICB9CiAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgdHlwZV8gPSB0eXBlOworICAgIG1lc3NhZ2VfID0gbWVzc2FnZTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAvKioKKyAgICogQ29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBnaXZlbiBhIFRQcm90b2NvbCBpbnB1dAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUQXBwbGljYXRpb25FeGNlcHRpb24gcmVhZEZyb20oVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CisgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHJlc3VsdCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICByZXN1bHQucmVhZChpcHJvdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgewogICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QpOwogICAgIGlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCkgewogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE1FU1NBR0VfRklFTEQpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzM2U3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLkFzeW5jRnJhbWVCdWZmZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgVEFzeW5jUHJvY2Vzc29yIHsKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBjYWxsIGZiLnJlc3BvbnNlUmVhZHkoKSBvbmNlIHByb2Nlc3NpbmcgaXMgY29tcGxldGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKGZpbmFsIEFzeW5jRnJhbWVCdWZmZXIgZmIpIHRocm93cyBURXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQppbmRleCA2NGVjZTgwLi5lMTQ4OWQ1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQpAQCAtMjcsMjkgKzI3LDEyIEBACiAgKiBHZW5lcmljIGJhc2UgaW50ZXJmYWNlIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IG9iamVjdHMuCiAgKgogICovCi1wdWJsaWMgaW50ZXJmYWNlIFRCYXNlPFQgZXh0ZW5kcyBUQmFzZSwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gZXh0ZW5kcyBDb21wYXJhYmxlPFQ+LCAgU2VyaWFsaXphYmxlIHsKK3B1YmxpYyBpbnRlcmZhY2UgVEJhc2U8VCBleHRlbmRzIFRCYXNlPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGV4dGVuZHMgQ29tcGFyYWJsZTxUPiwgIFRTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZSB7CiAKICAgLyoqCi0gICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKKyAgICogR2V0IHRoZSBGIGluc3RhbmNlIHRoYXQgY29ycmVzcG9uZHMgdG8gZmllbGRJZC4KICAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKLSAgICoKLSAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ2hlY2sgaWYgYSBmaWVsZCBpcyBjdXJyZW50bHkgc2V0IG9yIHVuc2V0LgotICAgKgotICAgKiBAcGFyYW0gZmllbGRJZCBUaGUgZmllbGQncyBpZCB0YWcgYXMgZm91bmQgaW4gdGhlIElETC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0KGludCBmaWVsZElkKTsKKyAgcHVibGljIEYgZmllbGRGb3JJZChpbnQgZmllbGRJZCk7CiAKICAgLyoqCiAgICAqIENoZWNrIGlmIGEgZmllbGQgaXMgY3VycmVudGx5IHNldCBvciB1bnNldC4KQEAgLTU5LDE2ICs0Miw3IEBACiAgIHB1YmxpYyBib29sZWFuIGlzU2V0KEYgZmllbGQpOwogCiAgIC8qKgotICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGlkLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluIHRoZSAKLSAgICogYXBwcm9wcmlhdGUgImJveGVkIiB0eXBlcy4KLSAgICoKLSAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoaW50IGZpZWxkSWQpOwotCi0gIC8qKgotICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluIAorICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluCiAgICAqIHRoZSBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgogICAgKgogICAgKiBAcGFyYW0gZmllbGQKQEAgLTc2LDE1ICs1MCw2IEBACiAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShGIGZpZWxkKTsKIAogICAvKioKLSAgICogU2V0IGEgZmllbGQncyB2YWx1ZSBieSBpZC4gUHJpbWl0aXZlIHR5cGVzIG11c3QgYmUgImJveGVkIiBpbiB0aGUgCi0gICAqIGFwcHJvcHJpYXRlIG9iamVjdCB3cmFwcGVyIHR5cGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWVsZElkIFRoZSBmaWVsZCdzIGlkIHRhZyBhcyBmb3VuZCBpbiB0aGUgSURMLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShpbnQgZmllbGRJZCwgT2JqZWN0IHZhbHVlKTsKLQotICAvKioKICAgICogU2V0IGEgZmllbGQncyB2YWx1ZSBieSBmaWVsZCB2YXJpYWJsZS4gUHJpbWl0aXZlIHR5cGVzIG11c3QgYmUgImJveGVkIiBpbgogICAgKiB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0IHdyYXBwZXIgdHlwZS4KICAgICoKQEAgLTkyLDUgKzU3LDExIEBACiAgICAqLwogICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKEYgZmllbGQsIE9iamVjdCB2YWx1ZSk7CiAKLSAgcHVibGljIFRCYXNlPFQsIEY+IGRlZXBDb3B5KCk7CisgIHB1YmxpYyBUIGRlZXBDb3B5KCk7CisKKyAgLyoqCisgICAqIFJldHVybiB0byB0aGUgc3RhdGUgb2YgaGF2aW5nIGp1c3QgYmVlbiBpbml0aWFsaXplZCwgYXMgdGhvdWdoIHlvdSBoYWQganVzdAorICAgKiBjYWxsZWQgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAqLworICBwdWJsaWMgdm9pZCBjbGVhcigpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlQXN5bmNQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUFzeW5jUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiMTgyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUFzeW5jUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFRCYXNlQXN5bmNQcm9jZXNzb3I8ST4gaW1wbGVtZW50cyBUQXN5bmNQcm9jZXNzb3IsIFRQcm9jZXNzb3IgeworICAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCisgICAgZmluYWwgSSBpZmFjZTsKKyAgICBmaW5hbCBNYXA8U3RyaW5nLEFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyBUQmFzZSw/Pj4gcHJvY2Vzc01hcDsKKworICAgIHB1YmxpYyBUQmFzZUFzeW5jUHJvY2Vzc29yKEkgaWZhY2UsIE1hcDxTdHJpbmcsIEFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyBUQmFzZSw/Pj4gcHJvY2Vzc01hcCkgeworICAgICAgICB0aGlzLmlmYWNlID0gaWZhY2U7CisgICAgICAgIHRoaXMucHJvY2Vzc01hcCA9IHByb2Nlc3NNYXA7CisgICAgfQorCisgICAgcHVibGljIE1hcDxTdHJpbmcsQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIFRCYXNlLD8+PiBnZXRQcm9jZXNzTWFwVmlldygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwcm9jZXNzTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKGZpbmFsIEFzeW5jRnJhbWVCdWZmZXIgZmIpIHRocm93cyBURXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBUUHJvdG9jb2wgaW4gPSBmYi5nZXRJbnB1dFByb3RvY29sKCk7CisgICAgICAgIGZpbmFsIFRQcm90b2NvbCBvdXQgPSBmYi5nZXRPdXRwdXRQcm90b2NvbCgpOworCisgICAgICAgIC8vRmluZCBwcm9jZXNzaW5nIGZ1bmN0aW9uCisgICAgICAgIGZpbmFsIFRNZXNzYWdlIG1zZyA9IGluLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgQXN5bmNQcm9jZXNzRnVuY3Rpb24gZm4gPSBwcm9jZXNzTWFwLmdldChtc2cubmFtZSk7CisgICAgICAgIGlmIChmbiA9PSBudWxsKSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaW4sIFRUeXBlLlNUUlVDVCk7CisgICAgICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELAorICAgICAgICAgICAgICAgICJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnIiArIG1zZy5uYW1lICsgIiciKTsKKyAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiSW52YWxpZCBtZXRob2QgbmFtZSIsIHgpOworCisgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIGl0IGlzIGEgdHdvLXdheSByZXF1ZXN0LCBzbyB3ZSBjYW4gc2VuZCBhIHJlcGx5CisgICAgICAgICAgICBpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwpIHsKKyAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7CisgICAgICAgICAgICAgIHgud3JpdGUob3V0KTsKKyAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgICBvdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZiLnJlc3BvbnNlUmVhZHkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy9HZXQgQXJncworICAgICAgICBUQmFzZSBhcmdzID0gZm4uZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXJncy5yZWFkKGluKTsKKyAgICAgICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGluLnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJDb3VsZCBub3QgcmV0cmlldmUgZnVuY3Rpb24gYXJndW1lbnRzIiwgeCk7CisKKyAgICAgICAgICAgIGlmICghZm4uaXNPbmV3YXkoKSkgeworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsKKyAgICAgICAgICAgICAgeC53cml0ZShvdXQpOworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICAgIG91dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaW4ucmVhZE1lc3NhZ2VFbmQoKTsKKworICAgICAgICBpZiAoZm4uaXNPbmV3YXkoKSkgeworICAgICAgICAgIGZiLnJlc3BvbnNlUmVhZHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vc3RhcnQgb2ZmIHByb2Nlc3NpbmcgZnVuY3Rpb24KKyAgICAgICAgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyID0gZm4uZ2V0UmVzdWx0SGFuZGxlcihmYiwgbXNnLnNlcWlkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmbi5zdGFydChpZmFjZSwgYXJncywgcmVzdWx0SGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmRlYnVnKCJFeGNlcHRpb24gaGFuZGxpbmcgZnVuY3Rpb24iLCBlKTsKKyAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKaW5kZXggZmNjZWNlOC4uNmY2YzZlYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKQEAgLTE3LDcyICsxNyw2NCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCi1wdWJsaWMgY2xhc3MgVEJhc2VIZWxwZXIgeworcHVibGljIGZpbmFsIGNsYXNzIFRCYXNlSGVscGVyIHsKKworICBwcml2YXRlIFRCYXNlSGVscGVyKCl7fQogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBOZXN0ZWRTdHJ1Y3R1cmVDb21wYXJhdG9yKCk7CiAKKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgaWYgKG8xIGluc3RhbmNlb2YgQ29tcGFyYWJsZSkgeworICAgICAgcmV0dXJuIGNvbXBhcmVUbygoQ29tcGFyYWJsZSlvMSwgKENvbXBhcmFibGUpbzIpOworICAgIH0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICByZXR1cm4gY29tcGFyZVRvKChMaXN0KW8xLCAoTGlzdClvMik7CisgICAgfSBlbHNlIGlmIChvMSBpbnN0YW5jZW9mIFNldCkgeworICAgICAgcmV0dXJuIGNvbXBhcmVUbygoU2V0KW8xLCAoU2V0KW8yKTsKKyAgICB9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgTWFwKSB7CisgICAgICByZXR1cm4gY29tcGFyZVRvKChNYXApbzEsIChNYXApbzIpOworICAgIH0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgIHJldHVybiBjb21wYXJlVG8oKGJ5dGVbXSlvMSwgKGJ5dGVbXSlvMik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBjb21wYXJlIG9iamVjdHMgb2YgdHlwZSAiICsgbzEuZ2V0Q2xhc3MoKSk7CisgICAgfQorICB9CisKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJvb2xlYW4gYSwgYm9vbGVhbiBiKSB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihhKS5jb21wYXJlVG8oYik7CisgICAgcmV0dXJuIEJvb2xlYW4uY29tcGFyZShhLCBiKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhieXRlIGEsIGJ5dGUgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIEJ5dGUuY29tcGFyZShhLCBiKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhzaG9ydCBhLCBzaG9ydCBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gU2hvcnQuY29tcGFyZShhLGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGludCBhLCBpbnQgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIEludGVnZXIuY29tcGFyZShhLCBiKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhsb25nIGEsIGxvbmcgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIExvbmcuY29tcGFyZShhLCBiKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhkb3VibGUgYSwgZG91YmxlIGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBEb3VibGUuY29tcGFyZShhLCBiKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKQEAgLTkwLDE3ICs4MiwxNiBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGVbXSBhLCBieXRlW10gYikgewotICAgIGludCBzaXplQ29tcGFyZSA9IGNvbXBhcmVUbyhhLmxlbmd0aCwgYi5sZW5ndGgpOwotICAgIGlmIChzaXplQ29tcGFyZSAhPSAwKSB7Ci0gICAgICByZXR1cm4gc2l6ZUNvbXBhcmU7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewotICAgICAgaW50IGJ5dGVDb21wYXJlID0gY29tcGFyZVRvKGFbaV0sIGJbaV0pOwotICAgICAgaWYgKGJ5dGVDb21wYXJlICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGJ5dGVDb21wYXJlOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJlVG8oYVtpXSwgYltpXSk7CisgICAgICAgIGlmIChjb21wYXJlICE9IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGFyZTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhDb21wYXJhYmxlIGEsIENvbXBhcmFibGUgYikgewpAQCAtMTA4LDQxICs5OSwzOSBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKExpc3QgYSwgTGlzdCBiKSB7Ci0gICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7Ci0gICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7Ci0gICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZShhLmdldChpKSwgYi5nZXQoaSkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmUoYS5nZXQoaSksIGIuZ2V0KGkpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFNldCBhLCBTZXQgYikgewotICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOwotICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7Ci0gICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247Ci0gICAgfQotICAgIFNvcnRlZFNldCBzb3J0ZWRBID0gbmV3IFRyZWVTZXQoY29tcGFyYXRvcik7Ci0gICAgc29ydGVkQS5hZGRBbGwoYSk7Ci0gICAgU29ydGVkU2V0IHNvcnRlZEIgPSBuZXcgVHJlZVNldChjb21wYXJhdG9yKTsKLSAgICBzb3J0ZWRCLmFkZEFsbChiKTsKKyAgICBpbnQgY29tcGFyZSA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOworICAgIGlmIChjb21wYXJlID09IDApIHsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRBID0gbmV3IEFycmF5TGlzdChhKTsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRCID0gbmV3IEFycmF5TGlzdChiKTsKIAotICAgIEl0ZXJhdG9yIGl0ZXJBID0gc29ydGVkQS5pdGVyYXRvcigpOwotICAgIEl0ZXJhdG9yIGl0ZXJCID0gc29ydGVkQi5pdGVyYXRvcigpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRBLCBjb21wYXJhdG9yKTsKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkQiwgY29tcGFyYXRvcik7CiAKLSAgICAvLyBDb21wYXJlIGVhY2ggaXRlbS4KLSAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgewotICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJhdG9yLmNvbXBhcmUoaXRlckEubmV4dCgpLCBpdGVyQi5uZXh0KCkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgSXRlcmF0b3IgaXRlckEgPSBzb3J0ZWRBLml0ZXJhdG9yKCk7CisgICAgICBJdGVyYXRvciBpdGVyQiA9IHNvcnRlZEIuaXRlcmF0b3IoKTsKKworICAgICAgLy8gQ29tcGFyZSBlYWNoIGl0ZW0uCisgICAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgeworICAgICAgICBjb21wYXJlID0gY29tcGFyYXRvci5jb21wYXJlKGl0ZXJBLm5leHQoKSwgaXRlckIubmV4dCgpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBhcmU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTWFwIGEsIE1hcCBiKSB7CkBAIC0xNzksNyArMTY4LDcgQEAKICAgLyoqCiAgICAqIENvbXBhcmF0b3IgdG8gY29tcGFyZSBpdGVtcyBpbnNpZGUgYSBzdHJ1Y3R1cmUgKGUuZy4gYSBsaXN0LCBzZXQsIG9yIG1hcCkuCiAgICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXN0ZWRTdHJ1Y3R1cmVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3RlZFN0cnVjdHVyZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yLCBTZXJpYWxpemFibGUgewogICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb0EsIE9iamVjdCBvQikgewogICAgICAgaWYgKG9BID09IG51bGwgJiYgb0IgPT0gbnVsbCkgewogICAgICAgICByZXR1cm4gMDsKQEAgLTIwMSw0ICsxOTAsMTA4IEBACiAgICAgfQogICB9CiAKKyAgcHVibGljIHN0YXRpYyB2b2lkIHRvU3RyaW5nKENvbGxlY3Rpb248Qnl0ZUJ1ZmZlcj4gYmJzLCBTdHJpbmdCdWlsZGVyIHNiKSB7CisgICAgSXRlcmF0b3I8Qnl0ZUJ1ZmZlcj4gaXQgPSBiYnMuaXRlcmF0b3IoKTsKKyAgICBpZiAoIWl0Lmhhc05leHQoKSkgeworICAgICAgc2IuYXBwZW5kKCJbXSIpOworICAgIH0gZWxzZSB7CisgICAgICBzYi5hcHBlbmQoIlsiKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBpdC5uZXh0KCk7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKGJiLCBzYik7CisgICAgICAgIGlmICghaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB0b1N0cmluZyhCeXRlQnVmZmVyIGJiLCBTdHJpbmdCdWlsZGVyIHNiKSB7CisgICAgYnl0ZVtdIGJ1ZiA9IGJiLmFycmF5KCk7CisKKyAgICBpbnQgYXJyYXlPZmZzZXQgPSBiYi5hcnJheU9mZnNldCgpOworICAgIGludCBvZmZzZXQgPSBhcnJheU9mZnNldCArIGJiLnBvc2l0aW9uKCk7CisgICAgaW50IG9yaWdMaW1pdCA9IGFycmF5T2Zmc2V0ICsgYmIubGltaXQoKTsKKyAgICBpbnQgbGltaXQgPSAob3JpZ0xpbWl0IC0gb2Zmc2V0ID4gMTI4KSA/IG9mZnNldCArIDEyOCA6IG9yaWdMaW1pdDsKKworICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBsaW1pdDsgaSsrKSB7CisgICAgICBpZiAoaSA+IG9mZnNldCkgeworICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgIH0KKyAgICAgIHNiLmFwcGVuZChwYWRkZWRCeXRlU3RyaW5nKGJ1ZltpXSkpOworICAgIH0KKyAgICBpZiAob3JpZ0xpbWl0ICE9IGxpbWl0KSB7CisgICAgICBzYi5hcHBlbmQoIi4uLiIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZGRlZEJ5dGVTdHJpbmcoYnl0ZSBiKSB7CisgICAgaW50IGV4dGVuZGVkID0gKGIgfCAweDEwMCkgJiAweDFmZjsKKyAgICByZXR1cm4gSW50ZWdlci50b0hleFN0cmluZyhleHRlbmRlZCkudG9VcHBlckNhc2UoKS5zdWJzdHJpbmcoMSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBieXRlQnVmZmVyVG9CeXRlQXJyYXkoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyKSB7CisgICAgaWYgKHdyYXBzRnVsbEFycmF5KGJ5dGVCdWZmZXIpKSB7CisgICAgICByZXR1cm4gYnl0ZUJ1ZmZlci5hcnJheSgpOworICAgIH0KKyAgICBieXRlW10gdGFyZ2V0ID0gbmV3IGJ5dGVbYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKV07CisgICAgYnl0ZUJ1ZmZlclRvQnl0ZUFycmF5KGJ5dGVCdWZmZXIsIHRhcmdldCwgMCk7CisgICAgcmV0dXJuIHRhcmdldDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cmFwc0Z1bGxBcnJheShCeXRlQnVmZmVyIGJ5dGVCdWZmZXIpIHsKKyAgICByZXR1cm4gYnl0ZUJ1ZmZlci5oYXNBcnJheSgpCisgICAgICAmJiBieXRlQnVmZmVyLnBvc2l0aW9uKCkgPT0gMAorICAgICAgJiYgYnl0ZUJ1ZmZlci5hcnJheU9mZnNldCgpID09IDAKKyAgICAgICYmIGJ5dGVCdWZmZXIucmVtYWluaW5nKCkgPT0gYnl0ZUJ1ZmZlci5jYXBhY2l0eSgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgYnl0ZUJ1ZmZlclRvQnl0ZUFycmF5KEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciwgYnl0ZVtdIHRhcmdldCwgaW50IG9mZnNldCkgeworICAgIGludCByZW1haW5pbmcgPSBieXRlQnVmZmVyLnJlbWFpbmluZygpOworICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZUJ1ZmZlci5hcnJheSgpLAorICAgICAgICBieXRlQnVmZmVyLmFycmF5T2Zmc2V0KCkgKyBieXRlQnVmZmVyLnBvc2l0aW9uKCksCisgICAgICAgIHRhcmdldCwKKyAgICAgICAgb2Zmc2V0LAorICAgICAgICByZW1haW5pbmcpOworICAgIHJldHVybiByZW1haW5pbmc7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgcmlnaHRTaXplKEJ5dGVCdWZmZXIgaW4pIHsKKyAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIGlmICh3cmFwc0Z1bGxBcnJheShpbikpIHsKKyAgICAgIHJldHVybiBpbjsKKyAgICB9CisgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChieXRlQnVmZmVyVG9CeXRlQXJyYXkoaW4pKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBjb3B5QmluYXJ5KGZpbmFsIEJ5dGVCdWZmZXIgb3JpZykgeworICAgIGlmIChvcmlnID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBCeXRlQnVmZmVyIGNvcHkgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbb3JpZy5yZW1haW5pbmcoKV0pOworICAgIGlmIChvcmlnLmhhc0FycmF5KCkpIHsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZy5hcnJheSgpLCBvcmlnLmFycmF5T2Zmc2V0KCkgKyBvcmlnLnBvc2l0aW9uKCksIGNvcHkuYXJyYXkoKSwgMCwgb3JpZy5yZW1haW5pbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG9yaWcuc2xpY2UoKS5nZXQoY29weS5hcnJheSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29weTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNvcHlCaW5hcnkoZmluYWwgYnl0ZVtdIG9yaWcpIHsKKyAgICByZXR1cm4gKG9yaWcgPT0gbnVsbCkgPyBudWxsIDogQXJyYXlzLmNvcHlPZihvcmlnLCBvcmlnLmxlbmd0aCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIExvbmcuaGFzaENvZGUodmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoZG91YmxlIHZhbHVlKSB7CisgICAgcmV0dXJuIERvdWJsZS5oYXNoQ29kZSh2YWx1ZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZVByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhOWE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlUHJvY2Vzc29yPEk+IGltcGxlbWVudHMgVFByb2Nlc3NvciB7CisgIHByaXZhdGUgZmluYWwgSSBpZmFjZTsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2U+PiBwcm9jZXNzTWFwOworCisgIHByb3RlY3RlZCBUQmFzZVByb2Nlc3NvcihJIGlmYWNlLCBNYXA8U3RyaW5nLCBQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzIFRCYXNlPj4gcHJvY2Vzc0Z1bmN0aW9uTWFwKSB7CisgICAgdGhpcy5pZmFjZSA9IGlmYWNlOworICAgIHRoaXMucHJvY2Vzc01hcCA9IHByb2Nlc3NGdW5jdGlvbk1hcDsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLFByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2U+PiBnZXRQcm9jZXNzTWFwVmlldygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHByb2Nlc3NNYXApOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVE1lc3NhZ2UgbXNnID0gaW4ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIFByb2Nlc3NGdW5jdGlvbiBmbiA9IHByb2Nlc3NNYXAuZ2V0KG1zZy5uYW1lKTsKKyAgICBpZiAoZm4gPT0gbnVsbCkgeworICAgICAgVFByb3RvY29sVXRpbC5za2lwKGluLCBUVHlwZS5TVFJVQ1QpOworICAgICAgaW4ucmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsICJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnIittc2cubmFtZSsiJyIpOworICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7CisgICAgICB4LndyaXRlKG91dCk7CisgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICBvdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBmbi5wcm9jZXNzKG1zZy5zZXFpZCwgaW4sIG91dCwgaWZhY2UpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlMzVmYmNiLi4zYTJkNTZjIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIC8qKgogICogQ2xhc3MgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGJ1ZiB3aXRob3V0IGRvaW5nIGRlZXAKQEAgLTI3LDIwICsyOCwzNCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0geworCisgIHByaXZhdGUgZmluYWwgaW50IGluaXRpYWxTaXplOworCiAgIHB1YmxpYyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGludCBzaXplKSB7CiAgICAgc3VwZXIoc2l6ZSk7CisgICAgdGhpcy5pbml0aWFsU2l6ZSA9IHNpemU7CiAgIH0KIAogICBwdWJsaWMgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpIHsKLSAgICBzdXBlcigpOworICAgIHRoaXMoMzIpOwogICB9CiAKLQogICBwdWJsaWMgYnl0ZVtdIGdldCgpIHsKICAgICByZXR1cm4gYnVmOwogICB9CiAKKyAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgc3VwZXIucmVzZXQoKTsKKyAgICBpZiAoYnVmLmxlbmd0aCA+IGluaXRpYWxTaXplKSB7CisgICAgICBidWYgPSBuZXcgYnl0ZVtpbml0aWFsU2l6ZV07CisgICAgfQorICB9CisKICAgcHVibGljIGludCBsZW4oKSB7CiAgICAgcmV0dXJuIGNvdW50OwogICB9CisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhDaGFyc2V0IGNoYXJzZXQpIHsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIGNvdW50LCBjaGFyc2V0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKaW5kZXggM2M0M2E0NS4uZDFkMzk2NiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkOwpAQCAtNjMsMTAgKzY0LDIzIEBACiAgICAqIEBwYXJhbSBieXRlcyBUaGUgYXJyYXkgdG8gcmVhZCBmcm9tCiAgICAqLwogICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShUQmFzZSBiYXNlLCBieXRlW10gYnl0ZXMpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGRlc2VyaWFsaXplKGJhc2UsIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICB9CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGZyb20gYSBieXRlIGFycmF5LgorICAgKgorICAgKiBAcGFyYW0gYmFzZSBUaGUgb2JqZWN0IHRvIHJlYWQgaW50bworICAgKiBAcGFyYW0gYnl0ZXMgVGhlIGFycmF5IHRvIHJlYWQgZnJvbQorICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB7QGNvZGUgYnl0ZXN9CisgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCB0byByZWFkIGZyb20ge0Bjb2RlIGJ5dGVzfQorICAgKi8KKyAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoVEJhc2UgYmFzZSwgYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKLSAgICAgIHRyYW5zXy5yZXNldChieXRlcyk7CisgICAgICB0cmFuc18ucmVzZXQoYnl0ZXMsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgIGJhc2UucmVhZChwcm90b2NvbF8pOwogICAgIH0gZmluYWxseSB7CisgICAgICB0cmFuc18uY2xlYXIoKTsKICAgICAgIHByb3RvY29sXy5yZXNldCgpOwogICAgIH0KICAgfQpAQCAtOTEsNjIgKzEwNSwyMjggQEAKIAogICAvKioKICAgICogRGVzZXJpYWxpemUgb25seSBhIHNpbmdsZSBUaHJpZnQgb2JqZWN0IChhZGRyZXNzZWQgYnkgcmVjdXJzaXZlbHkgdXNpbmcgZmllbGQgaWQpCi0gICAqIGZyb20gYSBieXRlIHJlY29yZC4KLSAgICogQHBhcmFtIHJlY29yZCBUaGUgb2JqZWN0IHRvIHJlYWQgZnJvbQorICAgKiBmcm9tIGEgYnl0ZSByZWNvcmQuICAgCiAgICAqIEBwYXJhbSB0YiBUaGUgb2JqZWN0IHRvIHJlYWQgaW50bwotICAgKiBAcGFyYW0gZmllbGRJZFBhdGggVGhlIEZpZWxkSWQncyB0aGF0IGRlZmluZSBhIHBhdGggdGIKKyAgICogQHBhcmFtIGJ5dGVzIFRoZSBzZXJpYWxpemVkIG9iamVjdCB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIGZpZWxkSWRQYXRoRmlyc3QgRmlyc3Qgb2YgdGhlIEZpZWxkSWQncyB0aGF0IGRlZmluZSBhIHBhdGggdGIKKyAgICogQHBhcmFtIGZpZWxkSWRQYXRoUmVzdCBUaGUgcmVzdCBGaWVsZElkJ3MgdGhhdCBkZWZpbmUgYSBwYXRoIHRiCiAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiAKICAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnRpYWxEZXNlcmlhbGl6ZShUQmFzZSB0YiwgYnl0ZVtdIGJ5dGVzLCBURmllbGRJZEVudW0gLi4uIGZpZWxkSWRQYXRoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIHBhcnRpYWxEZXNlcmlhbGl6ZShUQmFzZSB0YiwgYnl0ZVtdIGJ5dGVzLCBURmllbGRJZEVudW0gZmllbGRJZFBhdGhGaXJzdCwgVEZpZWxkSWRFbnVtIC4uLiBmaWVsZElkUGF0aFJlc3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGluIHRoZSBwYXRoLCB0aGVuIHRoZSB1c2VyIGlzIGxvb2tpbmcgZm9yIHRoZSAKLSAgICAgIC8vIHJlZ3VsYXIgZGVzZXJpYWxpemUgbWV0aG9kCi0gICAgICAvLyBUT0RPOiBpdCBtaWdodCBiZSBuaWNlIG5vdCB0byBoYXZlIHRvIGRvIHRoaXMgY2hlY2sgZXZlcnkgdGltZSB0byBzYXZlCi0gICAgICAvLyBzb21lIHBlcmZvcm1hbmNlLgotICAgICAgaWYgKGZpZWxkSWRQYXRoLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgIGRlc2VyaWFsaXplKHRiLCBieXRlcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgdHJhbnNfLnJlc2V0KGJ5dGVzKTsKLQotICAgICAgLy8gaW5kZXggaW50byBmaWVsZCBJRCBwYXRoIGJlaW5nIGN1cnJlbnRseSBzZWFyY2hlZCBmb3IKLSAgICAgIGludCBjdXJQYXRoSW5kZXggPSAwOwotCi0gICAgICBwcm90b2NvbF8ucmVhZFN0cnVjdEJlZ2luKCk7Ci0KLSAgICAgIHdoaWxlIChjdXJQYXRoSW5kZXggPCBmaWVsZElkUGF0aC5sZW5ndGgpIHsKLSAgICAgICAgVEZpZWxkIGZpZWxkID0gcHJvdG9jb2xfLnJlYWRGaWVsZEJlZ2luKCk7Ci0gICAgICAgIC8vIHdlIGNhbiBzdG9wIHNlYXJjaGluZyBpZiB3ZSBlaXRoZXIgc2VlIGEgc3RvcCBvciB3ZSBnbyBwYXN0IHRoZSBmaWVsZCAKLSAgICAgICAgLy8gaWQgd2UncmUgbG9va2luZyBmb3IgKHNpbmNlIGZpZWxkcyBzaG91bGQgbm93IGJlIHNlcmlhbGl6ZWQgaW4gYXNjCi0gICAgICAgIC8vIG9yZGVyKS4KLSAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCB8fCBmaWVsZC5pZCA+IGZpZWxkSWRQYXRoW2N1clBhdGhJbmRleF0uZ2V0VGhyaWZ0RmllbGRJZCgpKSB7IAotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWVsZC5pZCAhPSBmaWVsZElkUGF0aFtjdXJQYXRoSW5kZXhdLmdldFRocmlmdEZpZWxkSWQoKSkgewotICAgICAgICAgIC8vIE5vdCB0aGUgZmllbGQgd2UncmUgbG9va2luZyBmb3IuIFNraXAgZmllbGQuCi0gICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKHByb3RvY29sXywgZmllbGQudHlwZSk7Ci0gICAgICAgICAgcHJvdG9jb2xfLnJlYWRGaWVsZEVuZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgdGhlIG5leHQgc3RlcCBpbiB0aGUgcGF0aC4gU3RlcCBpbnRvIGZpZWxkLgotICAgICAgICAgIGN1clBhdGhJbmRleCsrOwotICAgICAgICAgIGlmIChjdXJQYXRoSW5kZXggPCBmaWVsZElkUGF0aC5sZW5ndGgpIHsKLSAgICAgICAgICAgIHByb3RvY29sXy5yZWFkU3RydWN0QmVnaW4oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gd2hlbiB0aGlzIGxpbmUgaXMgcmVhY2hlZCwgaXByb3Qgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0Yi4KLSAgICAgIHRiLnJlYWQocHJvdG9jb2xfKTsKKyAgICAgIGlmIChsb2NhdGVGaWVsZChieXRlcywgZmllbGRJZFBhdGhGaXJzdCwgZmllbGRJZFBhdGhSZXN0KSAhPSBudWxsKSB7CisgICAgICAgIC8vIGlmIHRoaXMgbGluZSBpcyByZWFjaGVkLCBpcHJvdCB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mIHRiLgorICAgICAgICB0Yi5yZWFkKHByb3RvY29sXyk7CisgICAgICB9ICAgICAgCiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGUpOwogICAgIH0gZmluYWxseSB7CisgICAgICB0cmFuc18uY2xlYXIoKTsKICAgICAgIHByb3RvY29sXy5yZXNldCgpOwogICAgIH0KICAgfQogCiAgIC8qKgorICAgKiBEZXNlcmlhbGl6ZSBvbmx5IGEgYm9vbGVhbiBmaWVsZCAoYWRkcmVzc2VkIGJ5IHJlY3Vyc2l2ZWx5IHVzaW5nIGZpZWxkIGlkKQorICAgKiBmcm9tIGEgYnl0ZSByZWNvcmQuCisgICAqIEBwYXJhbSBieXRlcyBUaGUgc2VyaWFsaXplZCBvYmplY3QgdG8gcmVhZCBmcm9tCisgICAqIEBwYXJhbSBmaWVsZElkUGF0aEZpcnN0IEZpcnN0IG9mIHRoZSBGaWVsZElkJ3MgdGhhdCBkZWZpbmUgYSBwYXRoIHRvIGEgYm9vbGVhbiBmaWVsZAorICAgKiBAcGFyYW0gZmllbGRJZFBhdGhSZXN0IFRoZSByZXN0IEZpZWxkSWQncyB0aGF0IGRlZmluZSBhIHBhdGggdG8gYSBib29sZWFuIGZpZWxkCisgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIEJvb2xlYW4gcGFydGlhbERlc2VyaWFsaXplQm9vbChieXRlW10gYnl0ZXMsIFRGaWVsZElkRW51bSBmaWVsZElkUGF0aEZpcnN0LCBURmllbGRJZEVudW0gLi4uIGZpZWxkSWRQYXRoUmVzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAoQm9vbGVhbikgcGFydGlhbERlc2VyaWFsaXplRmllbGQoVFR5cGUuQk9PTCwgYnl0ZXMsIGZpZWxkSWRQYXRoRmlyc3QsIGZpZWxkSWRQYXRoUmVzdCk7CisgIH0KKworICAvKioKKyAgICogRGVzZXJpYWxpemUgb25seSBhIGJ5dGUgZmllbGQgKGFkZHJlc3NlZCBieSByZWN1cnNpdmVseSB1c2luZyBmaWVsZCBpZCkKKyAgICogZnJvbSBhIGJ5dGUgcmVjb3JkLgorICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNlcmlhbGl6ZWQgb2JqZWN0IHRvIHJlYWQgZnJvbQorICAgKiBAcGFyYW0gZmllbGRJZFBhdGhGaXJzdCBGaXJzdCBvZiB0aGUgRmllbGRJZCdzIHRoYXQgZGVmaW5lIGEgcGF0aCB0byBhIGJ5dGUgZmllbGQKKyAgICogQHBhcmFtIGZpZWxkSWRQYXRoUmVzdCBUaGUgcmVzdCBGaWVsZElkJ3MgdGhhdCBkZWZpbmUgYSBwYXRoIHRvIGEgYnl0ZSBmaWVsZAorICAgKiBAdGhyb3dzIFRFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBCeXRlIHBhcnRpYWxEZXNlcmlhbGl6ZUJ5dGUoYnl0ZVtdIGJ5dGVzLCBURmllbGRJZEVudW0gZmllbGRJZFBhdGhGaXJzdCwgVEZpZWxkSWRFbnVtIC4uLiBmaWVsZElkUGF0aFJlc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gKEJ5dGUpIHBhcnRpYWxEZXNlcmlhbGl6ZUZpZWxkKFRUeXBlLkJZVEUsIGJ5dGVzLCBmaWVsZElkUGF0aEZpcnN0LCBmaWVsZElkUGF0aFJlc3QpOworICB9CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXplIG9ubHkgYSBkb3VibGUgZmllbGQgKGFkZHJlc3NlZCBieSByZWN1cnNpdmVseSB1c2luZyBmaWVsZCBpZCkKKyAgICogZnJvbSBhIGJ5dGUgcmVjb3JkLgorICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNlcmlhbGl6ZWQgb2JqZWN0IHRvIHJlYWQgZnJvbQorICAgKiBAcGFyYW0gZmllbGRJZFBhdGhGaXJzdCBGaXJzdCBvZiB0aGUgRmllbGRJZCdzIHRoYXQgZGVmaW5lIGEgcGF0aCB0byBhIGRvdWJsZSBmaWVsZAorICAgKiBAcGFyYW0gZmllbGRJZFBhdGhSZXN0IFRoZSByZXN0IEZpZWxkSWQncyB0aGF0IGRlZmluZSBhIHBhdGggdG8gYSBkb3VibGUgZmllbGQKKyAgICogQHRocm93cyBURXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgRG91YmxlIHBhcnRpYWxEZXNlcmlhbGl6ZURvdWJsZShieXRlW10gYnl0ZXMsIFRGaWVsZElkRW51bSBmaWVsZElkUGF0aEZpcnN0LCBURmllbGRJZEVudW0gLi4uIGZpZWxkSWRQYXRoUmVzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAoRG91YmxlKSBwYXJ0aWFsRGVzZXJpYWxpemVGaWVsZChUVHlwZS5ET1VCTEUsIGJ5dGVzLCBmaWVsZElkUGF0aEZpcnN0LCBmaWVsZElkUGF0aFJlc3QpOworICB9CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXplIG9ubHkgYW4gaTE2IGZpZWxkIChhZGRyZXNzZWQgYnkgcmVjdXJzaXZlbHkgdXNpbmcgZmllbGQgaWQpCisgICAqIGZyb20gYSBieXRlIHJlY29yZC4KKyAgICogQHBhcmFtIGJ5dGVzIFRoZSBzZXJpYWxpemVkIG9iamVjdCB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIGZpZWxkSWRQYXRoRmlyc3QgRmlyc3Qgb2YgdGhlIEZpZWxkSWQncyB0aGF0IGRlZmluZSBhIHBhdGggdG8gYW4gaTE2IGZpZWxkCisgICAqIEBwYXJhbSBmaWVsZElkUGF0aFJlc3QgVGhlIHJlc3QgRmllbGRJZCdzIHRoYXQgZGVmaW5lIGEgcGF0aCB0byBhbiBpMTYgZmllbGQKKyAgICogQHRocm93cyBURXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgU2hvcnQgcGFydGlhbERlc2VyaWFsaXplSTE2KGJ5dGVbXSBieXRlcywgVEZpZWxkSWRFbnVtIGZpZWxkSWRQYXRoRmlyc3QsIFRGaWVsZElkRW51bSAuLi4gZmllbGRJZFBhdGhSZXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChTaG9ydCkgcGFydGlhbERlc2VyaWFsaXplRmllbGQoVFR5cGUuSTE2LCBieXRlcywgZmllbGRJZFBhdGhGaXJzdCwgZmllbGRJZFBhdGhSZXN0KTsKKyAgfQorCisgIC8qKgorICAgKiBEZXNlcmlhbGl6ZSBvbmx5IGFuIGkzMiBmaWVsZCAoYWRkcmVzc2VkIGJ5IHJlY3Vyc2l2ZWx5IHVzaW5nIGZpZWxkIGlkKQorICAgKiBmcm9tIGEgYnl0ZSByZWNvcmQuCisgICAqIEBwYXJhbSBieXRlcyBUaGUgc2VyaWFsaXplZCBvYmplY3QgdG8gcmVhZCBmcm9tCisgICAqIEBwYXJhbSBmaWVsZElkUGF0aEZpcnN0IEZpcnN0IG9mIHRoZSBGaWVsZElkJ3MgdGhhdCBkZWZpbmUgYSBwYXRoIHRvIGFuIGkzMiBmaWVsZAorICAgKiBAcGFyYW0gZmllbGRJZFBhdGhSZXN0IFRoZSByZXN0IEZpZWxkSWQncyB0aGF0IGRlZmluZSBhIHBhdGggdG8gYW4gaTMyIGZpZWxkCisgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIEludGVnZXIgcGFydGlhbERlc2VyaWFsaXplSTMyKGJ5dGVbXSBieXRlcywgVEZpZWxkSWRFbnVtIGZpZWxkSWRQYXRoRmlyc3QsIFRGaWVsZElkRW51bSAuLi4gZmllbGRJZFBhdGhSZXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChJbnRlZ2VyKSBwYXJ0aWFsRGVzZXJpYWxpemVGaWVsZChUVHlwZS5JMzIsIGJ5dGVzLCBmaWVsZElkUGF0aEZpcnN0LCBmaWVsZElkUGF0aFJlc3QpOworICB9CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXplIG9ubHkgYW4gaTY0IGZpZWxkIChhZGRyZXNzZWQgYnkgcmVjdXJzaXZlbHkgdXNpbmcgZmllbGQgaWQpCisgICAqIGZyb20gYSBieXRlIHJlY29yZC4KKyAgICogQHBhcmFtIGJ5dGVzIFRoZSBzZXJpYWxpemVkIG9iamVjdCB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIGZpZWxkSWRQYXRoRmlyc3QgRmlyc3Qgb2YgdGhlIEZpZWxkSWQncyB0aGF0IGRlZmluZSBhIHBhdGggdG8gYW4gaTY0IGZpZWxkCisgICAqIEBwYXJhbSBmaWVsZElkUGF0aFJlc3QgVGhlIHJlc3QgRmllbGRJZCdzIHRoYXQgZGVmaW5lIGEgcGF0aCB0byBhbiBpNjQgZmllbGQKKyAgICogQHRocm93cyBURXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgTG9uZyBwYXJ0aWFsRGVzZXJpYWxpemVJNjQoYnl0ZVtdIGJ5dGVzLCBURmllbGRJZEVudW0gZmllbGRJZFBhdGhGaXJzdCwgVEZpZWxkSWRFbnVtIC4uLiBmaWVsZElkUGF0aFJlc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gKExvbmcpIHBhcnRpYWxEZXNlcmlhbGl6ZUZpZWxkKFRUeXBlLkk2NCwgYnl0ZXMsIGZpZWxkSWRQYXRoRmlyc3QsIGZpZWxkSWRQYXRoUmVzdCk7CisgIH0KKworICAvKioKKyAgICogRGVzZXJpYWxpemUgb25seSBhIHN0cmluZyBmaWVsZCAoYWRkcmVzc2VkIGJ5IHJlY3Vyc2l2ZWx5IHVzaW5nIGZpZWxkIGlkKQorICAgKiBmcm9tIGEgYnl0ZSByZWNvcmQuCisgICAqIEBwYXJhbSBieXRlcyBUaGUgc2VyaWFsaXplZCBvYmplY3QgdG8gcmVhZCBmcm9tCisgICAqIEBwYXJhbSBmaWVsZElkUGF0aEZpcnN0IEZpcnN0IG9mIHRoZSBGaWVsZElkJ3MgdGhhdCBkZWZpbmUgYSBwYXRoIHRvIGEgc3RyaW5nIGZpZWxkCisgICAqIEBwYXJhbSBmaWVsZElkUGF0aFJlc3QgVGhlIHJlc3QgRmllbGRJZCdzIHRoYXQgZGVmaW5lIGEgcGF0aCB0byBhIHN0cmluZyBmaWVsZAorICAgKiBAdGhyb3dzIFRFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgcGFydGlhbERlc2VyaWFsaXplU3RyaW5nKGJ5dGVbXSBieXRlcywgVEZpZWxkSWRFbnVtIGZpZWxkSWRQYXRoRmlyc3QsIFRGaWVsZElkRW51bSAuLi4gZmllbGRJZFBhdGhSZXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChTdHJpbmcpIHBhcnRpYWxEZXNlcmlhbGl6ZUZpZWxkKFRUeXBlLlNUUklORywgYnl0ZXMsIGZpZWxkSWRQYXRoRmlyc3QsIGZpZWxkSWRQYXRoUmVzdCk7CisgIH0KKworICAvKioKKyAgICogRGVzZXJpYWxpemUgb25seSBhIGJpbmFyeSBmaWVsZCAoYWRkcmVzc2VkIGJ5IHJlY3Vyc2l2ZWx5IHVzaW5nIGZpZWxkIGlkKQorICAgKiBmcm9tIGEgYnl0ZSByZWNvcmQuCisgICAqIEBwYXJhbSBieXRlcyBUaGUgc2VyaWFsaXplZCBvYmplY3QgdG8gcmVhZCBmcm9tCisgICAqIEBwYXJhbSBmaWVsZElkUGF0aEZpcnN0IEZpcnN0IG9mIHRoZSBGaWVsZElkJ3MgdGhhdCBkZWZpbmUgYSBwYXRoIHRvIGEgYmluYXJ5IGZpZWxkCisgICAqIEBwYXJhbSBmaWVsZElkUGF0aFJlc3QgVGhlIHJlc3QgRmllbGRJZCdzIHRoYXQgZGVmaW5lIGEgcGF0aCB0byBhIGJpbmFyeSBmaWVsZAorICAgKiBAdGhyb3dzIFRFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIHBhcnRpYWxEZXNlcmlhbGl6ZUJ5dGVBcnJheShieXRlW10gYnl0ZXMsIFRGaWVsZElkRW51bSBmaWVsZElkUGF0aEZpcnN0LCBURmllbGRJZEVudW0gLi4uIGZpZWxkSWRQYXRoUmVzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIC8vIFRUeXBlIGRvZXMgbm90IGhhdmUgYmluYXJ5LCBzbyB3ZSB1c2UgdGhlIGFyYml0cmFyeSBudW0gMTAwCisgICAgcmV0dXJuIChCeXRlQnVmZmVyKSBwYXJ0aWFsRGVzZXJpYWxpemVGaWVsZCgoYnl0ZSkxMDAsIGJ5dGVzLCBmaWVsZElkUGF0aEZpcnN0LCBmaWVsZElkUGF0aFJlc3QpOworICB9CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXplIG9ubHkgdGhlIGlkIG9mIHRoZSBmaWVsZCBzZXQgaW4gYSBUVW5pb24gKGFkZHJlc3NlZCBieSByZWN1cnNpdmVseSB1c2luZyBmaWVsZCBpZCkKKyAgICogZnJvbSBhIGJ5dGUgcmVjb3JkLgorICAgKiBAcGFyYW0gYnl0ZXMgVGhlIHNlcmlhbGl6ZWQgb2JqZWN0IHRvIHJlYWQgZnJvbQorICAgKiBAcGFyYW0gZmllbGRJZFBhdGhGaXJzdCBGaXJzdCBvZiB0aGUgRmllbGRJZCdzIHRoYXQgZGVmaW5lIGEgcGF0aCB0byBhIFRVbmlvbgorICAgKiBAcGFyYW0gZmllbGRJZFBhdGhSZXN0IFRoZSByZXN0IEZpZWxkSWQncyB0aGF0IGRlZmluZSBhIHBhdGggdG8gYSBUVW5pb24KKyAgICogQHRocm93cyBURXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgU2hvcnQgcGFydGlhbERlc2VyaWFsaXplU2V0RmllbGRJZEluVW5pb24oYnl0ZVtdIGJ5dGVzLCBURmllbGRJZEVudW0gZmllbGRJZFBhdGhGaXJzdCwgVEZpZWxkSWRFbnVtIC4uLiBmaWVsZElkUGF0aFJlc3QpICB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFRGaWVsZCBmaWVsZCA9IGxvY2F0ZUZpZWxkKGJ5dGVzLCBmaWVsZElkUGF0aEZpcnN0LCBmaWVsZElkUGF0aFJlc3QpOworICAgICAgaWYgKGZpZWxkICE9IG51bGwpeworICAgICAgICBwcm90b2NvbF8ucmVhZFN0cnVjdEJlZ2luKCk7IC8vIFRoZSBVbmlvbgorICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRGaWVsZEJlZ2luKCkuaWQ7IC8vIFRoZSBmaWVsZCBzZXQgaW4gdGhlIHVuaW9uCisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHRyYW5zXy5jbGVhcigpOworICAgICAgcHJvdG9jb2xfLnJlc2V0KCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBPYmplY3QgcGFydGlhbERlc2VyaWFsaXplRmllbGQoYnl0ZSB0dHlwZSwgYnl0ZVtdIGJ5dGVzLCBURmllbGRJZEVudW0gZmllbGRJZFBhdGhGaXJzdCwgVEZpZWxkSWRFbnVtIC4uLiBmaWVsZElkUGF0aFJlc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgVEZpZWxkIGZpZWxkID0gbG9jYXRlRmllbGQoYnl0ZXMsIGZpZWxkSWRQYXRoRmlyc3QsIGZpZWxkSWRQYXRoUmVzdCk7CisgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgeworICAgICAgICBpZiAodHR5cGUgPT0gZmllbGQudHlwZSkgeworICAgICAgICAgIC8vIGlmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgaXByb3Qgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZgorICAgICAgICAgIC8vIHRoZSBmaWVsZAorICAgICAgICAgIHN3aXRjaCAodHR5cGUpIHsKKyAgICAgICAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCb29sKCk7CisgICAgICAgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQnl0ZSgpOworICAgICAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkRG91YmxlKCk7CisgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMTYoKTsKKyAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkzMigpOworICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTY0KCk7CisgICAgICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGhhY2sgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHN0cmluZyBhbmQgYmluYXJ5CisgICAgICAgIGlmICh0dHlwZSA9PSAxMDAgJiYgZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCaW5hcnkoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGUpOworICAgIH0gZmluYWxseSB7CisgICAgICB0cmFuc18uY2xlYXIoKTsKKyAgICAgIHByb3RvY29sXy5yZXNldCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgVEZpZWxkIGxvY2F0ZUZpZWxkKGJ5dGVbXSBieXRlcywgVEZpZWxkSWRFbnVtIGZpZWxkSWRQYXRoRmlyc3QsIFRGaWVsZElkRW51bSAuLi4gZmllbGRJZFBhdGhSZXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJhbnNfLnJlc2V0KGJ5dGVzKTsKKworICAgIFRGaWVsZElkRW51bVtdIGZpZWxkSWRQYXRoID0gbmV3IFRGaWVsZElkRW51bVtmaWVsZElkUGF0aFJlc3QubGVuZ3RoICsgMV07CisgICAgZmllbGRJZFBhdGhbMF0gPSBmaWVsZElkUGF0aEZpcnN0OworICAgIFN5c3RlbS5hcnJheWNvcHkoZmllbGRJZFBhdGhSZXN0LCAwLCBmaWVsZElkUGF0aCwgMSwgZmllbGRJZFBhdGhSZXN0Lmxlbmd0aCk7CisKKyAgICAvLyBpbmRleCBpbnRvIGZpZWxkIElEIHBhdGggYmVpbmcgY3VycmVudGx5IHNlYXJjaGVkIGZvcgorICAgIGludCBjdXJQYXRoSW5kZXggPSAwOworCisgICAgLy8gdGhpcyB3aWxsIGJlIHRoZSBsb2NhdGVkIGZpZWxkLCBvciBudWxsIGlmIGl0IGlzIG5vdCBsb2NhdGVkCisgICAgVEZpZWxkIGZpZWxkID0gbnVsbDsKKworICAgIHByb3RvY29sXy5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgIHdoaWxlIChjdXJQYXRoSW5kZXggPCBmaWVsZElkUGF0aC5sZW5ndGgpIHsKKyAgICAgIGZpZWxkID0gcHJvdG9jb2xfLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAvLyB3ZSBjYW4gc3RvcCBzZWFyY2hpbmcgaWYgd2UgZWl0aGVyIHNlZSBhIHN0b3Agb3Igd2UgZ28gcGFzdCB0aGUgZmllbGQKKyAgICAgIC8vIGlkIHdlJ3JlIGxvb2tpbmcgZm9yIChzaW5jZSBmaWVsZHMgc2hvdWxkIG5vdyBiZSBzZXJpYWxpemVkIGluIGFzYworICAgICAgLy8gb3JkZXIpLgorICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCB8fCBmaWVsZC5pZCA+IGZpZWxkSWRQYXRoW2N1clBhdGhJbmRleF0uZ2V0VGhyaWZ0RmllbGRJZCgpKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBpZiAoZmllbGQuaWQgIT0gZmllbGRJZFBhdGhbY3VyUGF0aEluZGV4XS5nZXRUaHJpZnRGaWVsZElkKCkpIHsKKyAgICAgICAgLy8gTm90IHRoZSBmaWVsZCB3ZSdyZSBsb29raW5nIGZvci4gU2tpcCBmaWVsZC4KKyAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKHByb3RvY29sXywgZmllbGQudHlwZSk7CisgICAgICAgIHByb3RvY29sXy5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgdGhlIG5leHQgc3RlcCBpbiB0aGUgcGF0aC4gU3RlcCBpbnRvIGZpZWxkLgorICAgICAgICBjdXJQYXRoSW5kZXgrKzsKKyAgICAgICAgaWYgKGN1clBhdGhJbmRleCA8IGZpZWxkSWRQYXRoLmxlbmd0aCkgeworICAgICAgICAgIHByb3RvY29sXy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmllbGQ7CisgIH0KKworICAvKioKICAgICogRGVzZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZnJvbSBhIEphdmEgc3RyaW5nLCB1c2luZyB0aGUgZGVmYXVsdCBKVk0KICAgICogY2hhcnNldCBlbmNvZGluZy4KICAgICoKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjNzc4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIFRFbnVtCisgKi8KK3B1YmxpYyBjbGFzcyBURW51bUhlbHBlciB7CisKKyAgLyoqCisgICAqIEdpdmVuIGEgVEVudW0gY2xhc3MgYW5kIGludGVnZXIgdmFsdWUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuCisgICAqIHRoZSBhc3NvY2lhdGVkIGNvbnN0YW50IGZyb20gdGhlIGdpdmVuIFRFbnVtIGNsYXNzLgorICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIG1vZGlmaWVkIHNob3VsZCB0aGUgbmFtZSBvZiB0aGUgJ2ZpbmRCeVZhbHVlJyBtZXRob2QKKyAgICogY2hhbmdlLgorICAgKgorICAgKiBAcGFyYW0gZW51bUNsYXNzIFRFbnVtIGZyb20gd2hpY2ggdG8gcmV0dXJuIGEgbWF0Y2hpbmcgY29uc3RhbnQuCisgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBjb25zdGFudC4KKyAgICoKKyAgICogQHJldHVybiBUaGUgY29uc3RhbnQgaW4gJ2VudW1DbGFzcycgd2hvc2UgdmFsdWUgaXMgJ3ZhbHVlJyBvciBudWxsIGlmCisgICAqICAgICAgICAgc29tZXRoaW5nIHdlbnQgd3JvbmcuCisgICAqLworICBwdWJsaWMgc3RhdGljIFRFbnVtIGdldEJ5VmFsdWUoQ2xhc3M8PyBleHRlbmRzIFRFbnVtPiBlbnVtQ2xhc3MsIGludCB2YWx1ZSkgeworICAgIHRyeSB7CisgICAgICBNZXRob2QgbWV0aG9kID0gZW51bUNsYXNzLmdldE1ldGhvZCgiZmluZEJ5VmFsdWUiLCBpbnQuY2xhc3MpOworICAgICAgcmV0dXJuIChURW51bSkgbWV0aG9kLmludm9rZShudWxsLCB2YWx1ZSk7CisgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjNTYwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPiBpcyBhIDxjb2RlPlRQcm9jZXNzb3I8L2NvZGU+IGFsbG93aW5nCisgKiBhIHNpbmdsZSA8Y29kZT5UU2VydmVyPC9jb2RlPiB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorICoKKyAqIDxwPlRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsCisgKiBwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+CisgKgorICogPGJsb2NrcXVvdGU+PGNvZGU+CisgKiAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiQ2FsY3VsYXRvciIsCisgKiAgICAgICAgIG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworICoKKyAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAqICAgICAgICAgbmV3IFdlYXRoZXJSZXBvcnQuUHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisgKgorICogICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICogICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0KTsKKyAqCisgKiAgICAgc2VydmVyLnNlcnZlKCk7CisgKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgorICovCitwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIGltcGxlbWVudHMgVFByb2Nlc3NvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsVFByb2Nlc3Nvcj4gU0VSVklDRV9QUk9DRVNTT1JfTUFQCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZyxUUHJvY2Vzc29yPigpOworICAgIHByaXZhdGUgVFByb2Nlc3NvciBkZWZhdWx0UHJvY2Vzc29yOworCisgICAgLyoqCisgICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCisgICAgICogYWxsb3dzIHVzIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlCisgICAgICogbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKKyAgICAgKiBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgICogQHBhcmFtIHByb2Nlc3NvciBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8KKyAgICAgKiBhcyAiaGFuZGxlcnMiLCBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0LklmYWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUHJvY2Vzc29yKFN0cmluZyBzZXJ2aWNlTmFtZSwgVFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKKyAgICAgICAgU0VSVklDRV9QUk9DRVNTT1JfTUFQLnB1dChzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIHNlcnZpY2UgdG8gYmUgY2FsbGVkIHRvIHByb2Nlc3MgcXVlcmllcyB3aXRob3V0IHNlcnZpY2UgbmFtZQorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRlZmF1bHQoVFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKKyAgICAgICAgZGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnByb2Nlc3M8L2NvZGU+IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICoKKyAgICAgKiA8b2w+CisgICAgICogICAgIDxsaT5SZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPkV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLjwvbGk+CisgICAgICogICAgIDxsaT5Vc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLjwvbGk+CisgICAgICogICAgIDxsaT5EaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAqICAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIElmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLCBpZgorICAgICAqIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IgaWYgdGhlIHNlcnZpY2UKKyAgICAgKiBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLiAgWW91IGNhbGxlZCB7QGxpbmsgI3JlZ2lzdGVyUHJvY2Vzc29yKFN0cmluZywgVFByb2Nlc3NvcikgcmVnaXN0ZXJQcm9jZXNzb3J9CisgICAgICogZHVyaW5nIGluaXRpYWxpemF0aW9uLCByaWdodD8gOikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIC8qCisgICAgICAgICAgICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiAgVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgorICAgICAgICAqLworICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOworCisgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwgJiYgbWVzc2FnZS50eXBlICE9IFRNZXNzYWdlVHlwZS5PTkVXQVkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgaW50IGluZGV4ID0gbWVzc2FnZS5uYW1lLmluZGV4T2YoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgIGlmIChkZWZhdWx0UHJvY2Vzc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9jZXNzb3IucHJvY2VzcyhuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBtZXNzYWdlKSwgb3Byb3QpOworICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG1lc3NhZ2UubmFtZSArICIuICBEaWQgeW91ICIgKworICAgICAgICAgICAgICAgICAgICAiZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBUUHJvdG9jb2wKKyAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbWVzc2FnZS5uYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgIFRQcm9jZXNzb3IgYWN0dWFsUHJvY2Vzc29yID0gU0VSVklDRV9QUk9DRVNTT1JfTUFQLmdldChzZXJ2aWNlTmFtZSk7CisgICAgICAgIGlmIChhY3R1YWxQcm9jZXNzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICIgKyBzZXJ2aWNlTmFtZSArICIuICBEaWQgeW91IGZvcmdldCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICBUTWVzc2FnZSBzdGFuZGFyZE1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbWVzc2FnZS5uYW1lLnN1YnN0cmluZyhzZXJ2aWNlTmFtZS5sZW5ndGgoKStUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IubGVuZ3RoKCkpLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcWlkCisgICAgICAgICk7CisKKyAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICByZXR1cm4gYWN0dWFsUHJvY2Vzc29yLnByb2Nlc3MobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgc3RhbmRhcmRNZXNzYWdlKSwgb3Byb3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAorICAgICAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5CisgICAgICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IgeworICAgICAgICBUTWVzc2FnZSBtZXNzYWdlQmVnaW47CisgICAgICAgIHB1YmxpYyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBUTWVzc2FnZSBtZXNzYWdlQmVnaW4pIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3RvY29sKTsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlQmVnaW47CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmQ5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMzk5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworCisKKy8qKgorICogVGhpcyBjbGFzcyB1c2VzIGEgc2luZ2xlIHRocmVhZCB0byBzZXQgdXAgbm9uLWJsb2NraW5nIHNvY2tldHMgdG8gYSBzZXQKKyAqIG9mIHJlbW90ZSBzZXJ2ZXJzIChob3N0bmFtZSBhbmQgcG9ydCBwYWlycyksIGFuZCBzZW5kcyBhIHNhbWUgcmVxdWVzdCB0bworICogYWxsIHRoZXNlIHNlcnZlcnMuIEl0IHRoZW4gZmV0Y2hlcyByZXNwb25zZXMgZnJvbSBzZXJ2ZXJzLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgIGludCBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIgLSBhbiB1cHBlciBsaW1pdCBmb3IgcmVjZWl2ZSBidWZmZXIgc2l6ZQorICogcGVyIHNlcnZlciAoaW4gYnl0ZSkuIElmIGEgcmVzcG9uc2UgZnJvbSBhIHNlcnZlciBleGNlZWRzIHRoaXMgbGltaXQsIHRoZQorICogY2xpZW50IHdpbGwgbm90IGFsbG9jYXRlIG1lbW9yeSBvciByZWFkIHJlc3BvbnNlIGRhdGEgZm9yIGl0LgorICoKKyAqICAgaW50IGZldGNoVGltZW91dFNlY29uZHMgLSB0aW1lIGxpbWl0IGZvciBmZXRjaGluZyByZXNwb25zZXMgZnJvbSBhbGwKKyAqIHNlcnZlcnMgKGluIHNlY29uZCkuIEFmdGVyIHRoZSB0aW1lb3V0LCB0aGUgZmV0Y2ggam9iIGlzIHN0b3BwZWQgYW5kCisgKiBhdmFpbGFibGUgcmVzcG9uc2VzIGFyZSByZXR1cm5lZC4KKyAqCisgKiAgIEJ5dGVCdWZmZXIgcmVxdWVzdEJ1ZiAtIHJlcXVlc3QgbWVzc2FnZSB0aGF0IGlzIHNlbnQgdG8gYWxsIHNlcnZlcnMuCisgKgorICogT3V0cHV0OgorICogICBSZXNwb25zZXMgYXJlIHN0b3JlZCBpbiBhbiBhcnJheSBvZiBCeXRlQnVmZmVycy4gSW5kZXggb2YgZWxlbWVudHMgaW4KKyAqIHRoaXMgYXJyYXkgY29ycmVzcG9uZHMgdG8gaW5kZXggb2Ygc2VydmVycyBpbiB0aGUgc2VydmVyIGxpc3QuIENvbnRlbnQgaW4KKyAqIGEgQnl0ZUJ1ZmZlciBtYXkgYmUgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6CisgKiAgIDEuIEZpcnN0IDQgYnl0ZXMgZm9ybSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgbGVuZ3RoIG9mIGZvbGxvd2luZyBkYXRhLAorICogdGhlbiBmb2xsb3dlZCBieSB0aGUgZGF0YS4KKyAqICAgMi4gRmlyc3QgNCBieXRlcyBmb3JtIGFuIGludGVnZXIgaW5kaWNhdGluZyBsZW5ndGggb2YgZm9sbG93aW5nIGRhdGEsCisgKiB0aGVuIGZvbGxvd2VkIGJ5IG5vdGhpbmcgLSB0aGlzIGhhcHBlbnMgd2hlbiB0aGUgcmVzcG9uc2UgZGF0YSBzaXplCisgKiBleGNlZWRzIG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlciwgYW5kIHRoZSBjbGllbnQgd2lsbCBub3QgcmVhZCBhbnkKKyAqIHJlc3BvbnNlIGRhdGEuCisgKiAgIDMuIE5vIGRhdGEgaW4gdGhlIEJ5dGVCdWZmZXIgLSB0aGlzIGhhcHBlbnMgd2hlbiB0aGUgc2VydmVyIGRvZXMgbm90CisgKiByZXR1cm4gYW55IHJlc3BvbnNlIHdpdGhpbiBmZXRjaFRpbWVvdXRTZWNvbmRzLgorICoKKyAqICAgSW4gc29tZSBzcGVjaWFsIGNhc2VzIChubyBzZXJ2ZXJzIGFyZSBnaXZlbiwgZmV0Y2hUaW1lb3V0U2Vjb25kcyBsZXNzCisgKiB0aGFuIG9yIGVxdWFsIHRvIDAsIHJlcXVlc3RCdWYgaXMgbnVsbCksIHRoZSByZXR1cm4gaXMgbnVsbC4KKyAqCisgKiBOb3RlOgorICogICBJdCBhc3N1bWVzIGFsbCByZW1vdGUgc2VydmVycyBhcmUgVE5vbmJsb2NraW5nU2VydmVycyBhbmQgdXNlCisgKiBURnJhbWVkVHJhbnNwb3J0LgorICoKKyAqLworcHVibGljIGNsYXNzIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQgeworICAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKAorICAgIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuY2xhc3MuZ2V0TmFtZSgpCisgICk7CisKKyAgLy8gaWYgdGhlIHNpemUgb2YgdGhlIHJlc3BvbnNlIG1zZyBleGNlZWRzIHRoaXMgbGltaXQgKGluIGJ5dGUpLCB3ZSB3aWxsCisgIC8vIG5vdCByZWFkIHRoZSBtc2cKKyAgcHJpdmF0ZSBpbnQgbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyOworCisgIC8vIHRpbWUgbGltaXQgZm9yIGZldGNoaW5nIGRhdGEgZnJvbSBhbGwgc2VydmVycyAoaW4gc2Vjb25kKQorICBwcml2YXRlIGludCBmZXRjaFRpbWVvdXRTZWNvbmRzOworCisgIC8vIHN0b3JlIHJlcXVlc3QgdGhhdCB3aWxsIGJlIHNlbnQgdG8gc2VydmVycyAgCisgIHByaXZhdGUgQnl0ZUJ1ZmZlciByZXF1ZXN0QnVmOworICBwcml2YXRlIEJ5dGVCdWZmZXIgcmVxdWVzdEJ1ZkR1cGxpY2F0aW9uOworCisgIC8vIGEgbGlzdCBvZiByZW1vdGUgc2VydmVycworICBwcml2YXRlIExpc3Q8SW5ldFNvY2tldEFkZHJlc3M+IHNlcnZlcnM7CisKKyAgLy8gc3RvcmUgZmV0Y2ggcmVzdWx0cworICBwcml2YXRlIFROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cyBzdGF0czsKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyW10gcmVjdkJ1ZjsKKworICBwdWJsaWMgVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudChpbnQgbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyLAorICAgIGludCBmZXRjaFRpbWVvdXRTZWNvbmRzLCBCeXRlQnVmZmVyIHJlcXVlc3RCdWYsCisgICAgTGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gc2VydmVycykgeworICAgIHRoaXMubWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyID0gbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyOworICAgIHRoaXMuZmV0Y2hUaW1lb3V0U2Vjb25kcyA9IGZldGNoVGltZW91dFNlY29uZHM7CisgICAgdGhpcy5yZXF1ZXN0QnVmID0gcmVxdWVzdEJ1ZjsKKyAgICB0aGlzLnNlcnZlcnMgPSBzZXJ2ZXJzOworICAgICAgCisgICAgc3RhdHMgPSBuZXcgVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzKCk7CisgICAgcmVjdkJ1ZiA9IG51bGw7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRNYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIoKSB7CisgICAgcmV0dXJuIG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlcjsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEZldGNoVGltZW91dFNlY29uZHMoKSB7CisgICAgcmV0dXJuIGZldGNoVGltZW91dFNlY29uZHM7CisgIH0KKworICAvKioKKyAgICogcmV0dXJuIGEgZHVwbGljYXRpb24gb2YgcmVxdWVzdEJ1Ziwgc28gdGhhdCByZXF1ZXN0QnVmIHdpbGwgbm90CisgICAqIGJlIG1vZGlmaWVkIGJ5IG90aGVycy4KKyAgICovCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQnl0ZUJ1ZmZlciBnZXRSZXF1ZXN0QnVmKCkgeworICAgIGlmIChyZXF1ZXN0QnVmID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gZWxzZSB7CisgICAgICBpZiAocmVxdWVzdEJ1ZkR1cGxpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgcmVxdWVzdEJ1ZkR1cGxpY2F0aW9uID0gcmVxdWVzdEJ1Zi5kdXBsaWNhdGUoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXF1ZXN0QnVmRHVwbGljYXRpb247ICAKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8SW5ldFNvY2tldEFkZHJlc3M+IGdldFNlcnZlckxpc3QoKSB7CisgICAgaWYgKHNlcnZlcnMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHNlcnZlcnMpOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBUTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMgZ2V0RmV0Y2hTdGF0cygpIHsKKyAgICByZXR1cm4gc3RhdHM7CisgIH0KKworICAvKioKKyAgICogbWFpbiBlbnRyeSBmdW5jdGlvbiBmb3IgZmV0Y2hpbmcgZnJvbSBzZXJ2ZXJzCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIEJ5dGVCdWZmZXJbXSBmZXRjaCgpIHsKKyAgICAvLyBjbGVhciBwcmV2aW91cyByZXN1bHRzCisgICAgcmVjdkJ1ZiA9IG51bGw7CisgICAgc3RhdHMuY2xlYXIoKTsKKworICAgIGlmIChzZXJ2ZXJzID09IG51bGwgfHwgc2VydmVycy5zaXplKCkgPT0gMCB8fAorICAgICAgICByZXF1ZXN0QnVmID09IG51bGwgfHwgZmV0Y2hUaW1lb3V0U2Vjb25kcyA8PSAwKSB7CisgICAgICByZXR1cm4gcmVjdkJ1ZjsKKyAgICB9CisKKyAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICBNdWx0aUZldGNoIG11bHRpRmV0Y2ggPSBuZXcgTXVsdGlGZXRjaCgpOworICAgIEZ1dHVyZVRhc2s8Pz4gdGFzayA9IG5ldyBGdXR1cmVUYXNrKG11bHRpRmV0Y2gsIG51bGwpOworICAgIGV4ZWN1dG9yLmV4ZWN1dGUodGFzayk7CisgICAgdHJ5IHsKKyAgICAgIHRhc2suZ2V0KGZldGNoVGltZW91dFNlY29uZHMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgIC8vIGF0dGVtcHQgdG8gY2FuY2VsIGV4ZWN1dGlvbiBvZiB0aGUgdGFzay4KKyAgICAgIHRhc2suY2FuY2VsKHRydWUpOworICAgICAgTE9HR0VSLmVycm9yKCJpbnRlcnJ1cHRlZCBkdXJpbmcgZmV0Y2g6ICIraWUudG9TdHJpbmcoKSk7CisgICAgfSBjYXRjaChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKKyAgICAgIC8vIGF0dGVtcHQgdG8gY2FuY2VsIGV4ZWN1dGlvbiBvZiB0aGUgdGFzay4KKyAgICAgIHRhc2suY2FuY2VsKHRydWUpOworICAgICAgTE9HR0VSLmVycm9yKCJleGNlcHRpb24gZHVyaW5nIGZldGNoOiAiK2VlLnRvU3RyaW5nKCkpOworICAgIH0gY2F0Y2goVGltZW91dEV4Y2VwdGlvbiB0ZSkgeworICAgICAgLy8gYXR0ZW1wdCB0byBjYW5jZWwgZXhlY3V0aW9uIG9mIHRoZSB0YXNrLiAgCisgICAgICB0YXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgIExPR0dFUi5lcnJvcigidGltZW91dCBmb3IgZmV0Y2g6ICIrdGUudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICBtdWx0aUZldGNoLmNsb3NlKCk7CisgICAgcmV0dXJuIHJlY3ZCdWY7CisgIH0KKworICAvKioKKyAgICogUHJpdmF0ZSBjbGFzcyB0aGF0IGRvZXMgcmVhbCBmZXRjaCBqb2IuCisgICAqIFVzZXJzIGFyZSBub3QgYWxsb3dlZCB0byBkaXJlY3RseSB1c2UgdGhpcyBjbGFzcywgYXMgaXRzIHJ1bigpCisgICAqIGZ1bmN0aW9uIG1heSBydW4gZm9yZXZlci4KKyAgICovCisgIHByaXZhdGUgY2xhc3MgTXVsdGlGZXRjaCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICBwcml2YXRlIFNlbGVjdG9yIHNlbGVjdG9yOworCisgICAgLyoqCisgICAgICogbWFpbiBlbnRyeSBmdW5jdGlvbiBmb3IgZmV0Y2hpbmcuCisgICAgICoKKyAgICAgKiBTZXJ2ZXIgcmVzcG9uc2VzIGFyZSBzdG9yZWQgaW4gVE5vbmJsb2NpbmdNdWx0aUZldGNoQ2xpZW50LnJlY3ZCdWYsCisgICAgICogYW5kIGZldGNoIHN0YXRpc3RpY3MgaXMgaW4gVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5zdGF0cy4KKyAgICAgKgorICAgICAqIFNhbml0eSBjaGVjayBmb3IgcGFyYW1ldGVycyBoYXMgYmVlbiBkb25lIGluCisgICAgICogVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgIGxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgaW50IG51bVRvdGFsU2VydmVycyA9IHNlcnZlcnMuc2l6ZSgpOworICAgICAgc3RhdHMuc2V0TnVtVG90YWxTZXJ2ZXJzKG51bVRvdGFsU2VydmVycyk7CisKKyAgICAgIC8vIGJ1ZmZlciBmb3IgcmVjZWl2aW5nIHJlc3BvbnNlIGZyb20gc2VydmVycworICAgICAgcmVjdkJ1ZiAgICAgICAgICAgICAgICAgICAgID0gbmV3IEJ5dGVCdWZmZXJbbnVtVG90YWxTZXJ2ZXJzXTsKKyAgICAgIC8vIGJ1ZmZlciBmb3Igc2VuZGluZyByZXF1ZXN0CisgICAgICBCeXRlQnVmZmVyIHNlbmRCdWZbXSAgICAgICAgPSBuZXcgQnl0ZUJ1ZmZlcltudW1Ub3RhbFNlcnZlcnNdOworICAgICAgbG9uZyBudW1CeXRlc1JlYWRbXSAgICAgICAgID0gbmV3IGxvbmdbbnVtVG90YWxTZXJ2ZXJzXTsKKyAgICAgIGludCBmcmFtZVNpemVbXSAgICAgICAgICAgICA9IG5ldyBpbnRbbnVtVG90YWxTZXJ2ZXJzXTsKKyAgICAgIGJvb2xlYW4gaGFzUmVhZEZyYW1lU2l6ZVtdICA9IG5ldyBib29sZWFuW251bVRvdGFsU2VydmVyc107CisKKyAgICAgIHRyeSB7CisgICAgICAgIHNlbGVjdG9yID0gU2VsZWN0b3Iub3BlbigpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoInNlbGVjdG9yIG9wZW5zIGVycm9yOiAiK2UudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub3RhbFNlcnZlcnM7IGkrKykgeworICAgICAgICAvLyBjcmVhdGUgYnVmZmVyIHRvIHNlbmQgcmVxdWVzdCB0byBzZXJ2ZXIuCisgICAgICAgIHNlbmRCdWZbaV0gPSByZXF1ZXN0QnVmLmR1cGxpY2F0ZSgpOworICAgICAgICAvLyBjcmVhdGUgYnVmZmVyIHRvIHJlYWQgcmVzcG9uc2UncyBmcmFtZSBzaXplIGZyb20gc2VydmVyCisgICAgICAgIHJlY3ZCdWZbaV0gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQpOworICAgICAgICBzdGF0cy5pbmNUb3RhbFJlY3ZCdWZCeXRlcyg0KTsKKworICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBzZXJ2ZXIgPSBzZXJ2ZXJzLmdldChpKTsKKyAgICAgICAgU29ja2V0Q2hhbm5lbCBzID0gbnVsbDsKKyAgICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcyA9IFNvY2tldENoYW5uZWwub3BlbigpOworICAgICAgICAgIHMuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOworICAgICAgICAgIC8vIG5vdyB0aGlzIG1ldGhvZCBpcyBub24tYmxvY2tpbmcKKyAgICAgICAgICBzLmNvbm5lY3Qoc2VydmVyKTsKKyAgICAgICAgICBrZXkgPSBzLnJlZ2lzdGVyKHNlbGVjdG9yLCBzLnZhbGlkT3BzKCkpOworICAgICAgICAgIC8vIGF0dGFjaCBpbmRleCBvZiB0aGUga2V5CisgICAgICAgICAga2V5LmF0dGFjaChpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBzdGF0cy5pbmNOdW1Db25uZWN0RXJyb3JTZXJ2ZXJzKCk7ICAKKyAgICAgICAgICBTdHJpbmcgZXJyID0gU3RyaW5nLmZvcm1hdCgic2V0IHVwIHNvY2tldCB0byBzZXJ2ZXIgJXMgZXJyb3I6ICVzIiwKKyAgICAgICAgICAgIHNlcnZlci50b1N0cmluZygpLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgIExPR0dFUi5lcnJvcihlcnIpOworICAgICAgICAgIC8vIGZyZWUgcmVzb3VyY2UKKyAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkge3MuY2xvc2UoKTt9IGNhdGNoIChFeGNlcHRpb24gZXgpIHt9CisgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgeworICAgICAgICAgICAgIGtleS5jYW5jZWwoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gd2FpdCBmb3IgZXZlbnRzCisgICAgICB3aGlsZSAoc3RhdHMuZ2V0TnVtUmVhZENvbXBsZXRlZFNlcnZlcnMoKSArCisgICAgICAgIHN0YXRzLmdldE51bUNvbm5lY3RFcnJvclNlcnZlcnMoKSA8IHN0YXRzLmdldE51bVRvdGFsU2VydmVycygpKSB7CisgICAgICAgIC8vIGlmIHRoZSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQgKGUuZy4sIHRhc2sgaXMgY2FuY2VsbGVkKSAgCisgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeXsKKyAgICAgICAgICBzZWxlY3Rvci5zZWxlY3QoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoInNlbGVjdG9yIHNlbGVjdHMgZXJyb3I6ICIrZS50b1N0cmluZygpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gaXQgPSBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgU2VsZWN0aW9uS2V5IHNlbEtleSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICBpdC5yZW1vdmUoKTsKKworICAgICAgICAgIC8vIGdldCBwcmV2aW91c2x5IGF0dGFjaGVkIGluZGV4CisgICAgICAgICAgaW50IGluZGV4ID0gKEludGVnZXIpc2VsS2V5LmF0dGFjaG1lbnQoKTsKKworICAgICAgICAgIGlmIChzZWxLZXkuaXNWYWxpZCgpICYmIHNlbEtleS5pc0Nvbm5lY3RhYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgc29ja2V0IHRocm93cyBhbiBleGNlcHRpb24gKGUuZy4sIGNvbm5lY3Rpb24gcmVmdXNlZCksCisgICAgICAgICAgICAvLyBwcmludCBlcnJvciBtc2cgYW5kIHNraXAgaXQuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBTb2NrZXRDaGFubmVsIHNDaGFubmVsID0gKFNvY2tldENoYW5uZWwpc2VsS2V5LmNoYW5uZWwoKTsKKyAgICAgICAgICAgICAgc0NoYW5uZWwuZmluaXNoQ29ubmVjdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgc3RhdHMuaW5jTnVtQ29ubmVjdEVycm9yU2VydmVycygpOworICAgICAgICAgICAgICBTdHJpbmcgZXJyID0gU3RyaW5nLmZvcm1hdCgic29ja2V0ICVkIGNvbm5lY3RzIHRvIHNlcnZlciAlcyAiICsKKyAgICAgICAgICAgICAgICAiZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICBpbmRleCwgc2VydmVycy5nZXQoaW5kZXgpLnRvU3RyaW5nKCksIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgIExPR0dFUi5lcnJvcihlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzZWxLZXkuaXNWYWxpZCgpICYmIHNlbEtleS5pc1dyaXRhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChzZW5kQnVmW2luZGV4XS5oYXNSZW1haW5pbmcoKSkgeworICAgICAgICAgICAgICAvLyBpZiB0aGlzIHNvY2tldCB0aHJvd3MgYW4gZXhjZXB0aW9uLCBwcmludCBlcnJvciBtc2cgYW5kCisgICAgICAgICAgICAgIC8vIHNraXAgaXQuCisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU29ja2V0Q2hhbm5lbCBzQ2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKXNlbEtleS5jaGFubmVsKCk7CisgICAgICAgICAgICAgICAgc0NoYW5uZWwud3JpdGUoc2VuZEJ1ZltpbmRleF0pOworICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJzb2NrZXQgJWQgd3JpdGVzIHRvIHNlcnZlciAlcyAiICsKKyAgICAgICAgICAgICAgICAgICJlcnJvcjogJXMiLAorICAgICAgICAgICAgICAgICAgaW5kZXgsIHNlcnZlcnMuZ2V0KGluZGV4KS50b1N0cmluZygpLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIExPR0dFUi5lcnJvcihlcnIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHNlbEtleS5pc1ZhbGlkKCkgJiYgc2VsS2V5LmlzUmVhZGFibGUoKSkgeworICAgICAgICAgICAgLy8gaWYgdGhpcyBzb2NrZXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcHJpbnQgZXJyb3IgbXNnIGFuZAorICAgICAgICAgICAgLy8gc2tpcCBpdC4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIFNvY2tldENoYW5uZWwgc0NoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbClzZWxLZXkuY2hhbm5lbCgpOworICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gc0NoYW5uZWwucmVhZChyZWN2QnVmW2luZGV4XSk7CisKKyAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHsKKyAgICAgICAgICAgICAgICBudW1CeXRlc1JlYWRbaW5kZXhdICs9IGJ5dGVzUmVhZDsKKworICAgICAgICAgICAgICAgIGlmICghaGFzUmVhZEZyYW1lU2l6ZVtpbmRleF0gJiYKKyAgICAgICAgICAgICAgICAgICAgcmVjdkJ1ZltpbmRleF0ucmVtYWluaW5nKCk9PTApIHsKKyAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmcmFtZSBzaXplIGhhcyBiZWVuIHJlYWQgY29tcGxldGVseSwgdGhlbiBwcmVwYXJlCisgICAgICAgICAgICAgICAgICAvLyB0byByZWFkIHRoZSBhY3R1YWwgZnJhbWUuCisgICAgICAgICAgICAgICAgICBmcmFtZVNpemVbaW5kZXhdID0gcmVjdkJ1ZltpbmRleF0uZ2V0SW50KDApOworCisgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplW2luZGV4XSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRzLmluY051bUludmFsaWRGcmFtZVNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoIlJlYWQgYW4gaW52YWxpZCBmcmFtZSBzaXplICVkIgorICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tICVzLiBEb2VzIHRoZSBzZXJ2ZXIgdXNlIFRGcmFtZWRUcmFuc3BvcnQ/ICIsCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplW2luZGV4XSwgc2VydmVycy5nZXQoaW5kZXgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgc0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChmcmFtZVNpemVbaW5kZXhdICsgNCA+IHN0YXRzLmdldE1heFJlc3BvbnNlQnl0ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0cy5zZXRNYXhSZXNwb25zZUJ5dGVzKGZyYW1lU2l6ZVtpbmRleF0rNCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChmcmFtZVNpemVbaW5kZXhdICsgNCA+IG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0cy5pbmNOdW1PdmVyZmxvd2VkUmVjdkJ1ZigpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyID0gU3RyaW5nLmZvcm1hdCgiUmVhZCBmcmFtZSBzaXplICVkIGZyb20gJXMsIgorICAgICAgICAgICAgICAgICAgICAgICsgIiB0b3RhbCBidWZmZXIgc2l6ZSB3b3VsZCBleGNlZWQgbGltaXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZVtpbmRleF0sIHNlcnZlcnMuZ2V0KGluZGV4KS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgIG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlcik7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5lcnJvcihlcnIpOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc0NoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgYnVmZmVyIGZvciBhY3R1YWwgZnJhbWUgZGF0YQorICAgICAgICAgICAgICAgICAgcmVjdkJ1ZltpbmRleF0gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGZyYW1lU2l6ZVtpbmRleF0gKyA0KTsKKyAgICAgICAgICAgICAgICAgIHJlY3ZCdWZbaW5kZXhdLnB1dEludChmcmFtZVNpemVbaW5kZXhdKTsKKworICAgICAgICAgICAgICAgICAgc3RhdHMuaW5jVG90YWxSZWN2QnVmQnl0ZXMoZnJhbWVTaXplW2luZGV4XSk7CisgICAgICAgICAgICAgICAgICBoYXNSZWFkRnJhbWVTaXplW2luZGV4XSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGhhc1JlYWRGcmFtZVNpemVbaW5kZXhdICYmCisgICAgICAgICAgICAgICAgICBudW1CeXRlc1JlYWRbaW5kZXhdID49IGZyYW1lU2l6ZVtpbmRleF0rNCkgeworICAgICAgICAgICAgICAgICAgLy8gaGFzIHJlYWQgYWxsIGRhdGEKKyAgICAgICAgICAgICAgICAgIHNDaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICBzdGF0cy5pbmNOdW1SZWFkQ29tcGxldGVkU2VydmVycygpOworICAgICAgICAgICAgICAgICAgbG9uZyB0MiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgc3RhdHMuc2V0UmVhZFRpbWUodDItdDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoInNvY2tldCAlZCByZWFkcyBmcm9tIHNlcnZlciAlcyAiICsKKyAgICAgICAgICAgICAgICAiZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICBpbmRleCwgc2VydmVycy5nZXQoaW5kZXgpLnRvU3RyaW5nKCksIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgIExPR0dFUi5lcnJvcihlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRpc3Bvc2UgYW55IHJlc291cmNlIGFsbG9jYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKHNlbGVjdG9yLmlzT3BlbigpKSB7CisgICAgICAgICAgSXRlcmF0b3I8U2VsZWN0aW9uS2V5PiBpdCA9IHNlbGVjdG9yLmtleXMoKS5pdGVyYXRvcigpOworICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFNlbGVjdGlvbktleSBzZWxLZXkgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBTb2NrZXRDaGFubmVsIHNDaGFubmVsID0gKFNvY2tldENoYW5uZWwpc2VsS2V5LmNoYW5uZWwoKTsKKyAgICAgICAgICAgIHNDaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoImZyZWUgcmVzb3VyY2UgZXJyb3I6ICIrZS50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiODYyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiBzdGF0aXN0aWNzIGZvciBUTm9uYmxvY2tpbk11bHRpRmV0Y2hDbGllbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBUTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMgeworICBwcml2YXRlIGludCAgICBudW1Ub3RhbFNlcnZlcnM7CisgIHByaXZhdGUgaW50ICAgIG51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzOworICBwcml2YXRlIGludCAgICBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzOworICBwcml2YXRlIGludCAgICB0b3RhbFJlY3ZCdWZCeXRlczsKKyAgcHJpdmF0ZSBpbnQgICAgbWF4UmVzcG9uc2VCeXRlczsKKyAgcHJpdmF0ZSBpbnQgICAgbnVtT3ZlcmZsb3dlZFJlY3ZCdWY7CisgIHByaXZhdGUgaW50ICAgIG51bUludmFsaWRGcmFtZVNpemU7CisgIC8vIHRpbWUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZldGNoKCkgZnVuY3Rpb24gdG8gdGhlIHJlYWRpbmcgZmluaXNoCisgIC8vIHRpbWUgb2YgdGhlIGxhc3Qgc29ja2V0IChpbiBtaWxsaS1zZWNvbmQpCisgIHByaXZhdGUgbG9uZyAgIHJlYWRUaW1lOworCisgIHB1YmxpYyBUTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMoKSB7CisgICAgY2xlYXIoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIG51bVRvdGFsU2VydmVycyA9IDA7CisgICAgbnVtUmVhZENvbXBsZXRlZFNlcnZlcnMgPSAwOworICAgIG51bUNvbm5lY3RFcnJvclNlcnZlcnMgPSAwOworICAgIHRvdGFsUmVjdkJ1ZkJ5dGVzID0gMDsKKyAgICBtYXhSZXNwb25zZUJ5dGVzID0gMDsKKyAgICBudW1PdmVyZmxvd2VkUmVjdkJ1ZiA9IDA7CisgICAgbnVtSW52YWxpZEZyYW1lU2l6ZSA9IDA7CisgICAgcmVhZFRpbWUgPSAwOworICB9CisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmcgc3RhdHMgPSBTdHJpbmcuZm9ybWF0KCJudW1Ub3RhbFNlcnZlcnM9JWQsICIgKworICAgICAgIm51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzPSVkLCBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzPSVkLCAiICsKKyAgICAgICJudW1VbnJlc3BvbnNpdmVTZXJ2ZXJzPSVkLCB0b3RhbFJlY3ZCdWZCeXRlcz0lZk0sICIgKworICAgICAgIm1heFJlc3BvbnNlQnl0ZXM9JWQsIG51bU92ZXJmbG93ZWRSZWN2QnVmPSVkLCAiICsKKyAgICAgICJudW1JbnZhbGlkRnJhbWVTaXplPSVkLCByZWFkVGltZT0lZG1zIiwKKyAgICAgIG51bVRvdGFsU2VydmVycywgbnVtUmVhZENvbXBsZXRlZFNlcnZlcnMsIG51bUNvbm5lY3RFcnJvclNlcnZlcnMsCisgICAgICAobnVtVG90YWxTZXJ2ZXJzLW51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzLW51bUNvbm5lY3RFcnJvclNlcnZlcnMpLAorICAgICAgdG90YWxSZWN2QnVmQnl0ZXMvMTAyNC4wLzEwMjQsIG1heFJlc3BvbnNlQnl0ZXMsIG51bU92ZXJmbG93ZWRSZWN2QnVmLAorICAgICAgbnVtSW52YWxpZEZyYW1lU2l6ZSwgcmVhZFRpbWUpOworICAgIHJldHVybiBzdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE51bVRvdGFsU2VydmVycyhpbnQgdmFsKSAgICB7IG51bVRvdGFsU2VydmVycyA9IHZhbDsgfQorICBwdWJsaWMgdm9pZCBzZXRNYXhSZXNwb25zZUJ5dGVzKGludCB2YWwpICAgeyBtYXhSZXNwb25zZUJ5dGVzID0gdmFsOyB9CisgIHB1YmxpYyB2b2lkIHNldFJlYWRUaW1lKGxvbmcgdmFsKSAgICAgICAgICB7IHJlYWRUaW1lID0gdmFsOyB9CisgIHB1YmxpYyB2b2lkIGluY051bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzKCkgICB7IG51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzKys7IH0KKyAgcHVibGljIHZvaWQgaW5jTnVtQ29ubmVjdEVycm9yU2VydmVycygpICAgIHsgbnVtQ29ubmVjdEVycm9yU2VydmVycysrOyB9CisgIHB1YmxpYyB2b2lkIGluY051bU92ZXJmbG93ZWRSZWN2QnVmKCkgICAgICB7IG51bU92ZXJmbG93ZWRSZWN2QnVmKys7IH0KKyAgcHVibGljIHZvaWQgaW5jVG90YWxSZWN2QnVmQnl0ZXMoaW50IHZhbCkgIHsgdG90YWxSZWN2QnVmQnl0ZXMgKz0gdmFsOyB9CisgIHB1YmxpYyB2b2lkIGluY051bUludmFsaWRGcmFtZVNpemUoKSAgICAgICB7IG51bUludmFsaWRGcmFtZVNpemUrKzsgfQorCisgIHB1YmxpYyBpbnQgZ2V0TWF4UmVzcG9uc2VCeXRlcygpICAgICAgICB7IHJldHVybiBtYXhSZXNwb25zZUJ5dGVzOyB9CisgIHB1YmxpYyBpbnQgZ2V0TnVtUmVhZENvbXBsZXRlZFNlcnZlcnMoKSB7IHJldHVybiBudW1SZWFkQ29tcGxldGVkU2VydmVyczsgfQorICBwdWJsaWMgaW50IGdldE51bUNvbm5lY3RFcnJvclNlcnZlcnMoKSAgeyByZXR1cm4gbnVtQ29ubmVjdEVycm9yU2VydmVyczsgfQorICBwdWJsaWMgaW50IGdldE51bVRvdGFsU2VydmVycygpICAgICAgICAgeyByZXR1cm4gbnVtVG90YWxTZXJ2ZXJzOyB9CisgIHB1YmxpYyBpbnQgZ2V0TnVtT3ZlcmZsb3dlZFJlY3ZCdWYoKSAgICB7IHJldHVybiBudW1PdmVyZmxvd2VkUmVjdkJ1Zjt9CisgIHB1YmxpYyBpbnQgZ2V0VG90YWxSZWN2QnVmQnl0ZXMoKSAgICAgICB7IHJldHVybiB0b3RhbFJlY3ZCdWZCeXRlczt9CisgIHB1YmxpYyBpbnQgZ2V0TnVtSW52YWxpZEZyYW1lU2l6ZSgpICAgICB7IHJldHVybiBudW1JbnZhbGlkRnJhbWVTaXplOyB9CisgIHB1YmxpYyBsb25nIGdldFJlYWRUaW1lKCkgICAgICAgICAgICAgICB7IHJldHVybiByZWFkVGltZTsgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YQppbmRleCBiY2Q4YTM4Li44MTkzM2EyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YQpAQCAtMzYsNCArMzYsOCBAQAogICBwdWJsaWMgVFByb2Nlc3NvciBnZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucykgewogICAgIHJldHVybiBwcm9jZXNzb3JfOwogICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNBc3luY1Byb2Nlc3NvcigpIHsKKyAgICAgIHJldHVybiBwcm9jZXNzb3JfIGluc3RhbmNlb2YgVEFzeW5jUHJvY2Vzc29yOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6YWJsZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJpYWxpemFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDAwMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJpYWxpemFibGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CisKKy8qKgorICogR2VuZXJpYyBiYXNlIGludGVyZmFjZSBmb3IgZ2VuZXJhdGVkIFRocmlmdCBvYmplY3RzLgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBUU2VyaWFsaXphYmxlIHsKKworICAvKioKKyAgICogUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCisgICAqCisgICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAorICAgKi8KKyAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uOworCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAorICAgKgorICAgKiBAcGFyYW0gb3Byb3QgT3V0cHV0IHByb3RvY29sCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhCmluZGV4IGVlMDdiNzguLjAwYTM2ZWUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhCkBAIC0xOSwyMSArMTksNzMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiAKIC8qKgogICogQSBUU2VydmljZUNsaWVudCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYSBUU2VydmljZSBpbXBsZW1lbnRhdGlvbgogICogYWNyb3NzIHByb3RvY29scyBhbmQgdHJhbnNwb3J0cy4KICAqLwotcHVibGljIGludGVyZmFjZSBUU2VydmljZUNsaWVudCB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZpY2VDbGllbnQgeworICBwdWJsaWMgVFNlcnZpY2VDbGllbnQoVFByb3RvY29sIHByb3QpIHsKKyAgICB0aGlzKHByb3QsIHByb3QpOworICB9CisKKyAgcHVibGljIFRTZXJ2aWNlQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB7CisgICAgaXByb3RfID0gaXByb3Q7CisgICAgb3Byb3RfID0gb3Byb3Q7CisgIH0KKworICBwcm90ZWN0ZWQgVFByb3RvY29sIGlwcm90XzsKKyAgcHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87CisKKyAgcHJvdGVjdGVkIGludCBzZXFpZF87CisKICAgLyoqCiAgICAqIEdldCB0aGUgVFByb3RvY29sIGJlaW5nIHVzZWQgYXMgdGhlIGlucHV0IChyZWFkKSBwcm90b2NvbC4KLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHRoZSBUUHJvdG9jb2wgYmVpbmcgdXNlZCBhcyB0aGUgaW5wdXQgKHJlYWQpIHByb3RvY29sLgogICAgKi8KLSAgcHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCk7CisgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpIHsKKyAgICByZXR1cm4gdGhpcy5pcHJvdF87CisgIH0KKwogICAvKioKICAgICogR2V0IHRoZSBUUHJvdG9jb2wgYmVpbmcgdXNlZCBhcyB0aGUgb3V0cHV0ICh3cml0ZSkgcHJvdG9jb2wuCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiB0aGUgVFByb3RvY29sIGJlaW5nIHVzZWQgYXMgdGhlIG91dHB1dCAod3JpdGUpIHByb3RvY29sLgogICAgKi8KLSAgcHVibGljIFRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpOworICBwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCkgeworICAgIHJldHVybiB0aGlzLm9wcm90XzsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHNlbmRCYXNlKFN0cmluZyBtZXRob2ROYW1lLCBUQmFzZTw/LD8+IGFyZ3MpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBzZW5kQmFzZShtZXRob2ROYW1lLCBhcmdzLCBUTWVzc2FnZVR5cGUuQ0FMTCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBzZW5kQmFzZU9uZXdheShTdHJpbmcgbWV0aG9kTmFtZSwgVEJhc2U8Pyw/PiBhcmdzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgc2VuZEJhc2UobWV0aG9kTmFtZSwgYXJncywgVE1lc3NhZ2VUeXBlLk9ORVdBWSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc2VuZEJhc2UoU3RyaW5nIG1ldGhvZE5hbWUsIFRCYXNlPD8sPz4gYXJncywgYnl0ZSB0eXBlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgb3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtZXRob2ROYW1lLCB0eXBlLCArK3NlcWlkXykpOworICAgIGFyZ3Mud3JpdGUob3Byb3RfKTsKKyAgICBvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgb3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCByZWNlaXZlQmFzZShUQmFzZTw/LD8+IHJlc3VsdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIGlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7CisgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIHgucmVhZChpcHJvdF8pOworICAgICAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgICB0aHJvdyB4OworICAgIH0KKyAgICBpZiAobXNnLnNlcWlkICE9IHNlcWlkXykgeworICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELAorICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlOiBleHBlY3RlZCAlZCBidXQgZ290ICVkIiwgbWV0aG9kTmFtZSwgc2VxaWRfLCBtc2cuc2VxaWQpKTsKKyAgICB9CisgICAgcmVzdWx0LnJlYWQoaXByb3RfKTsKKyAgICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50RmFjdG9yeS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50RmFjdG9yeS5qYXZhCmluZGV4IDgwOGQ1ZTYuLjk4OGU2NTUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudEZhY3RvcnkuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnRGYWN0b3J5LmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKICAgLyoqCiAgICAqIEdldCBhIGJyYW5kLW5ldyBUIHVzaW5nIDxpPnByb3Q8L2k+IGFzIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wuCiAgICAqIEBwYXJhbSBwcm90Ci0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiBBIGJyYW5kLW5ldyBUIHVzaW5nIDxpPnByb3Q8L2k+IGFzIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2wuCiAgICAqLwogICBwdWJsaWMgVCBnZXRDbGllbnQoVFByb3RvY29sIHByb3QpOwogCkBAIC0zOSw3ICszOSw3IEBACiAgICAqIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzIG1heSBiZSB0aGUgc2FtZSBpbnN0YW5jZS4KICAgICogQHBhcmFtIGlwcm90CiAgICAqIEBwYXJhbSBvcHJvdAotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gYSBicmFuZCBuZXcgVCB1c2luZyB0aGUgc3BlY2lmaWVkIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzCiAgICAqLwogICBwdWJsaWMgVCBnZXRDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhCmluZGV4IGY1YTczODcuLjFlZjExZGYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTI4LDggKzI5LDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVW5pb248VCBleHRlbmRzIFRVbmlvbiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gaW1wbGVtZW50cyBUQmFzZTxULCBGPiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFVuaW9uPFQgZXh0ZW5kcyBUVW5pb248VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gaW1wbGVtZW50cyBUQmFzZTxULCBGPiB7CiAKICAgcHJvdGVjdGVkIE9iamVjdCB2YWx1ZV87CiAgIHByb3RlY3RlZCBGIHNldEZpZWxkXzsKQEAgLTM4LDYgKzQzLDEyIEBACiAgICAgc2V0RmllbGRfID0gbnVsbDsKICAgICB2YWx1ZV8gPSBudWxsOwogICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgVFVuaW9uU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgVFVuaW9uVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CiAKICAgcHJvdGVjdGVkIFRVbmlvbihGIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsKICAgICBzZXRGaWVsZFZhbHVlKHNldEZpZWxkLCB2YWx1ZSk7CkBAIC01NCwxMSArNjUsOCBAQAogICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZGVlcENvcHlPYmplY3QoT2JqZWN0IG8pIHsKICAgICBpZiAobyBpbnN0YW5jZW9mIFRCYXNlKSB7CiAgICAgICByZXR1cm4gKChUQmFzZSlvKS5kZWVwQ29weSgpOwotICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgYnl0ZVtdIG90aGVyX3ZhbCA9IChieXRlW10pbzsKLSAgICAgIGJ5dGVbXSB0aGlzX3ZhbCA9IG5ldyBieXRlW290aGVyX3ZhbC5sZW5ndGhdOwotICAgICAgU3lzdGVtLmFycmF5Y29weShvdGhlcl92YWwsIDAsIHRoaXNfdmFsLCAwLCBvdGhlcl92YWwubGVuZ3RoKTsKLSAgICAgIHJldHVybiB0aGlzX3ZhbDsKKyAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBCeXRlQnVmZmVyKSB7CisgICAgICByZXR1cm4gVEJhc2VIZWxwZXIuY29weUJpbmFyeSgoQnl0ZUJ1ZmZlcilvKTsKICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7CiAgICAgICByZXR1cm4gZGVlcENvcHlMaXN0KChMaXN0KW8pOwogICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFNldCkgewpAQCAtNzEsNyArNzksNyBAQAogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGRlZXBDb3B5TWFwKE1hcDxPYmplY3QsIE9iamVjdD4gbWFwKSB7Ci0gICAgTWFwIGNvcHkgPSBuZXcgSGFzaE1hcCgpOworICAgIE1hcCBjb3B5ID0gbmV3IEhhc2hNYXAobWFwLnNpemUoKSk7CiAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKICAgICAgIGNvcHkucHV0KGRlZXBDb3B5T2JqZWN0KGVudHJ5LmdldEtleSgpKSwgZGVlcENvcHlPYmplY3QoZW50cnkuZ2V0VmFsdWUoKSkpOwogICAgIH0KQEAgLTc5LDcgKzg3LDcgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIFNldCBkZWVwQ29weVNldChTZXQgc2V0KSB7Ci0gICAgU2V0IGNvcHkgPSBuZXcgSGFzaFNldCgpOworICAgIFNldCBjb3B5ID0gbmV3IEhhc2hTZXQoc2V0LnNpemUoKSk7CiAgICAgZm9yIChPYmplY3QgbyA6IHNldCkgewogICAgICAgY29weS5hZGQoZGVlcENvcHlPYmplY3QobykpOwogICAgIH0KQEAgLTEwNiw3ICsxMTQsNyBAQAogICAgIGlmIChmaWVsZElkICE9IHNldEZpZWxkXykgewogICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGdldCB0aGUgdmFsdWUgb2YgZmllbGQgIiArIGZpZWxkSWQgKyAiIGJlY2F1c2UgdW5pb24ncyBzZXQgZmllbGQgaXMgIiArIHNldEZpZWxkXyk7CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoKTsKICAgfQogCkBAIC0xMTcsNyArMTI1LDcgQEAKICAgcHVibGljIGJvb2xlYW4gaXNTZXQoKSB7CiAgICAgcmV0dXJuIHNldEZpZWxkXyAhPSBudWxsOwogICB9Ci0gIAorCiAgIHB1YmxpYyBib29sZWFuIGlzU2V0KEYgZmllbGRJZCkgewogICAgIHJldHVybiBzZXRGaWVsZF8gPT0gZmllbGRJZDsKICAgfQpAQCAtMTI3LDI0ICsxMzUsNyBAQAogICB9CiAKICAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBzZXRGaWVsZF8gPSBudWxsOwotICAgIHZhbHVlXyA9IG51bGw7Ci0KLSAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKLQotICAgIFRGaWVsZCBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7Ci0KLSAgICB2YWx1ZV8gPSByZWFkVmFsdWUoaXByb3QsIGZpZWxkKTsKLSAgICBpZiAodmFsdWVfICE9IG51bGwpIHsKLSAgICAgIHNldEZpZWxkXyA9IGVudW1Gb3JJZChmaWVsZC5pZCk7Ci0gICAgfQotCi0gICAgaXByb3QucmVhZEZpZWxkRW5kKCk7Ci0gICAgLy8gdGhpcyBpcyBzbyB0aGF0IHdlIHdpbGwgZWF0IHRoZSBzdG9wIGJ5dGUuIHdlIGNvdWxkIHB1dCBhIGNoZWNrIGhlcmUgdG8KLSAgICAvLyBtYWtlIHN1cmUgdGhhdCBpdCBhY3R1YWxseSAqaXMqIHRoZSBzdG9wIGJ5dGUsIGJ1dCBpdCdzIGZhc3RlciB0byBkbyBpdAotICAgIC8vIHRoaXMgd2F5LgotICAgIGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7Ci0gICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoRiBmaWVsZElkLCBPYmplY3QgdmFsdWUpIHsKQEAgLTE1OCwxNSArMTQ5LDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGlmIChnZXRTZXRGaWVsZCgpID09IG51bGwgfHwgZ2V0RmllbGRWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSBhIFRVbmlvbiB3aXRoIG5vIHNldCB2YWx1ZSEiKTsKLSAgICB9Ci0gICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihnZXRTdHJ1Y3REZXNjKCkpOwotICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihnZXRGaWVsZERlc2Moc2V0RmllbGRfKSk7Ci0gICAgd3JpdGVWYWx1ZShvcHJvdCk7Ci0gICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOwotICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7Ci0gICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOwogICB9CiAKICAgLyoqCkBAIC0xODEsMTEgKzE2NCwxMyBAQAogICAgKiBJbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIHJlYWQgdGhlIHJpZ2h0IHN0dWZmIGZyb20gdGhlIHdpcmUgCiAgICAqIGJhc2VkIG9uIHRoZSBmaWVsZCBoZWFkZXIuIAogICAgKiBAcGFyYW0gZmllbGQKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHJlYWQgT2JqZWN0IGJhc2VkIG9uIHRoZSBmaWVsZCBoZWFkZXIsIGFzIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQuCiAgICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IHJlYWRWYWx1ZShUUHJvdG9jb2wgaXByb3QsIFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb247Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IHN0YW5kYXJkU2NoZW1lUmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3RhbmRhcmRTY2hlbWVXcml0ZVZhbHVlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247CisgIAorICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IHR1cGxlU2NoZW1lUmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgc2hvcnQgZmllbGRJRCkgdGhyb3dzIFRFeGNlcHRpb247CisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHR1cGxlU2NoZW1lV3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOwogCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBUU3RydWN0IGdldFN0cnVjdERlc2MoKTsKIApAQCAtMTk1LDM1ICsxODAsMTAwIEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICI8IiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiICI7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgc2IuYXBwZW5kKCI8Iik7CisgICAgc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgIHNiLmFwcGVuZCgiICIpOwogCiAgICAgaWYgKGdldFNldEZpZWxkKCkgIT0gbnVsbCkgewogICAgICAgT2JqZWN0IHYgPSBnZXRGaWVsZFZhbHVlKCk7Ci0gICAgICBTdHJpbmcgdlN0ciA9IG51bGw7Ci0gICAgICBpZiAodiBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgICB2U3RyID0gYnl0ZXNUb1N0cigoYnl0ZVtdKXYpOworICAgICAgc2IuYXBwZW5kKGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsKKyAgICAgIHNiLmFwcGVuZCgiOiIpOworICAgICAgaWYodiBpbnN0YW5jZW9mIEJ5dGVCdWZmZXIpIHsKKyAgICAgICAgVEJhc2VIZWxwZXIudG9TdHJpbmcoKEJ5dGVCdWZmZXIpdiwgc2IpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgdlN0ciA9IHYudG9TdHJpbmcoKTsKKyAgICAgICAgc2IuYXBwZW5kKHYudG9TdHJpbmcoKSk7CiAgICAgICB9Ci0gICAgICByZXN1bHQgKz0gZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUgKyAiOiIgKyB2U3RyOwogICAgIH0KLQotICAgIHJldHVybiByZXN1bHQgKyAiPiI7CisgICAgc2IuYXBwZW5kKCI+Iik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnl0ZXNUb1N0cihieXRlW10gYnl0ZXMpIHsKLSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBpbnQgc2l6ZSA9IE1hdGgubWluKGJ5dGVzLmxlbmd0aCwgMTI4KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy5zZXRGaWVsZF8gPSBudWxsOworICAgIHRoaXMudmFsdWVfID0gbnVsbDsKKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVFVuaW9uU3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIFRVbmlvblN0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgVFVuaW9uU3RhbmRhcmRTY2hlbWUoKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRVbmlvblN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8VFVuaW9uPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCwgVFVuaW9uIHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgc3RydWN0LnNldEZpZWxkXyA9IG51bGw7CisgICAgICBzdHJ1Y3QudmFsdWVfID0gbnVsbDsKKworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICAgIFRGaWVsZCBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisKKyAgICAgIHN0cnVjdC52YWx1ZV8gPSBzdHJ1Y3Quc3RhbmRhcmRTY2hlbWVSZWFkVmFsdWUoaXByb3QsIGZpZWxkKTsKKyAgICAgIGlmIChzdHJ1Y3QudmFsdWVfICE9IG51bGwpIHsKKyAgICAgICAgc3RydWN0LnNldEZpZWxkXyA9IHN0cnVjdC5lbnVtRm9ySWQoZmllbGQuaWQpOwogICAgICAgfQotICAgICAgU3RyaW5nIGRpZ2l0ID0gSW50ZWdlci50b0hleFN0cmluZyhieXRlc1tpXSAmIDB4RkYpOwotICAgICAgc2IuYXBwZW5kKGRpZ2l0Lmxlbmd0aCgpID4gMSA/IGRpZ2l0IDogIjAiICsgZGlnaXQpOworCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIC8vIHRoaXMgaXMgc28gdGhhdCB3ZSB3aWxsIGVhdCB0aGUgc3RvcCBieXRlLiB3ZSBjb3VsZCBwdXQgYSBjaGVjayBoZXJlIHRvCisgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBpdCBhY3R1YWxseSAqaXMqIHRoZSBzdG9wIGJ5dGUsIGJ1dCBpdCdzIGZhc3RlciB0byBkbyBpdAorICAgICAgLy8gdGhpcyB3YXkuCisgICAgICBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOwogICAgIH0KLSAgICBpZiAoYnl0ZXMubGVuZ3RoID4gMTI4KSB7Ci0gICAgICBzYi5hcHBlbmQoIiAuLi4iKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCwgVFVuaW9uIHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKHN0cnVjdC5nZXRTZXRGaWVsZCgpID09IG51bGwgfHwgc3RydWN0LmdldEZpZWxkVmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSBhIFRVbmlvbiB3aXRoIG5vIHNldCB2YWx1ZSEiKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oc3RydWN0LmdldFN0cnVjdERlc2MoKSk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oc3RydWN0LmdldEZpZWxkRGVzYyhzdHJ1Y3Quc2V0RmllbGRfKSk7CisgICAgICBzdHJ1Y3Quc3RhbmRhcmRTY2hlbWVXcml0ZVZhbHVlKG9wcm90KTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOwogICAgIH0KLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVFVuaW9uVHVwbGVTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIFRVbmlvblR1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgVFVuaW9uVHVwbGVTY2hlbWUoKTsKKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRVbmlvblR1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8VFVuaW9uPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCwgVFVuaW9uIHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgc3RydWN0LnNldEZpZWxkXyA9IG51bGw7CisgICAgICBzdHJ1Y3QudmFsdWVfID0gbnVsbDsKKyAgICAgIHNob3J0IGZpZWxkSUQgPSBpcHJvdC5yZWFkSTE2KCk7CisgICAgICBzdHJ1Y3QudmFsdWVfID0gc3RydWN0LnR1cGxlU2NoZW1lUmVhZFZhbHVlKGlwcm90LCBmaWVsZElEKTsKKyAgICAgIGlmIChzdHJ1Y3QudmFsdWVfICE9IG51bGwpIHsKKyAgICAgICAgc3RydWN0LnNldEZpZWxkXyA9IHN0cnVjdC5lbnVtRm9ySWQoZmllbGRJRCk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90LCBUVW5pb24gc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc3RydWN0LmdldFNldEZpZWxkKCkgPT0gbnVsbCB8fCBzdHJ1Y3QuZ2V0RmllbGRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIGEgVFVuaW9uIHdpdGggbm8gc2V0IHZhbHVlISIpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVJMTYoc3RydWN0LnNldEZpZWxkXy5nZXRUaHJpZnRGaWVsZElkKCkpOworICAgICAgc3RydWN0LnR1cGxlU2NoZW1lV3JpdGVWYWx1ZShvcHJvdCk7CisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYW5ub3RhdGlvbi9OdWxsYWJsZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRiMDFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKiBBbm5vdGF0aW9uIGluZGljYXRpbmcgYSBmaWVsZCwgbWV0aG9kIHJldHVybiwgb3IgbWV0aG9kIHBhcmFtZXRlciBtYXkgYmUge0Bjb2RlIG51bGx9LgorICogV2UgcGFja2FnZSBvdXIgb3duIGFubm90YXRpb24gdG8gYXZvaWQgYSBtYW5kYXRvcnkgdGhpcmQtcGFydHkgZGVwZW5kZW5jeS4KKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuQ0xBU1MpCitwdWJsaWMgQGludGVyZmFjZSBOdWxsYWJsZSB7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYmRlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CisKKy8qKgorICogQSBoYW5kbGVyIGludGVyZmFjZSBhc3luY2hyb25vdXMgY2xpZW50cyBjYW4gaW1wbGVtZW50IHRvIHJlY2VpdmUgZnV0dXJlCisgKiBub3RpY2Ugb2YgdGhlIHJlc3VsdHMgb2YgYW4gYXN5bmNocm9ub3VzIG1ldGhvZCBjYWxsLgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBhc3luY2hyb25vdXNseSBpbnZva2VkIG1ldGhvZC4KKyAqLworcHVibGljIGludGVyZmFjZSBBc3luY01ldGhvZENhbGxiYWNrPFQ+IHsKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlbW90ZSBzaWRlIGhhcyBjb21wbGV0ZWQgaW52b2tpbmcKKyAgICogeW91ciBtZXRob2QgY2FsbCBhbmQgdGhlIHJlc3VsdCBpcyBmdWxseSByZWFkLiBGb3Ige0Bjb2RlIG9uZXdheX0gbWV0aG9kCisgICAqIGNhbGxzLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcyBzb29uIGFzIHdlIGhhdmUgY29tcGxldGVkIHdyaXRpbmcgb3V0CisgICAqIHRoZSByZXF1ZXN0LgorICAgKgorICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYXN5bmNocm9ub3VzbHkgaW52b2tlZCBtZXRob2Q7CisgICAqICAgICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0gZm9yIHZvaWQgbWV0aG9kcyB3aGljaCBpbmNsdWRlcworICAgKiAgICAgICAgICAgICAgICAge0Bjb2RlIG9uZXdheX0gbWV0aG9kcy4KKyAgICovCisgIHZvaWQgb25Db21wbGV0ZShUIHJlc3BvbnNlKTsKKworICAvKioKKyAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBlaXRoZXIgYW4gdW5leHBlY3RlZCBjbGllbnQtc2lkZQorICAgKiBleGNlcHRpb24gbGlrZSBhbiBJT0V4Y2VwdGlvbiBvciBlbHNlIHdoZW4gdGhlIHJlbW90ZSBtZXRob2QgcmFpc2VzIGFuCisgICAqIGV4Y2VwdGlvbiwgZWl0aGVyIGRlY2xhcmVkIGluIHRoZSBJREwgb3IgZHVlIHRvIGFuIHVuZXhwZWN0ZWQgc2VydmVyLXNpZGUKKyAgICogZXJyb3IuCisgICAqCisgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIHRoZSB0aGUgYXN5bmNocm9ub3VzCisgICAqICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGwsIG1heSBiZSBhIGxvY2FsIGV4Y2VwdGlvbiBvciBhbiB1bm1hcnNoYWxsZWQKKyAgICogICAgICAgICAgICAgICAgICByZW1vdGUgZXhjZXB0aW9uLgorICAgKi8KKyAgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTAxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUQXN5bmNDbGllbnQgeworICBwcm90ZWN0ZWQgZmluYWwgVFByb3RvY29sRmFjdG9yeSBfX19wcm90b2NvbEZhY3Rvcnk7CisgIHByb3RlY3RlZCBmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgX19fdHJhbnNwb3J0OworICBwcm90ZWN0ZWQgZmluYWwgVEFzeW5jQ2xpZW50TWFuYWdlciBfX19tYW5hZ2VyOworICBwcm90ZWN0ZWQgVEFzeW5jTWV0aG9kQ2FsbCBfX19jdXJyZW50TWV0aG9kOworICBwcml2YXRlIEV4Y2VwdGlvbiBfX19lcnJvcjsKKyAgcHJpdmF0ZSBsb25nIF9fX3RpbWVvdXQ7CisKKyAgcHVibGljIFRBc3luY0NsaWVudChUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgVEFzeW5jQ2xpZW50TWFuYWdlciBtYW5hZ2VyLCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgdGhpcyhwcm90b2NvbEZhY3RvcnksIG1hbmFnZXIsIHRyYW5zcG9ydCwgMCk7CisgIH0KKworICBwdWJsaWMgVEFzeW5jQ2xpZW50KFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBUQXN5bmNDbGllbnRNYW5hZ2VyIG1hbmFnZXIsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQsIGxvbmcgdGltZW91dCkgeworICAgIHRoaXMuX19fcHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OworICAgIHRoaXMuX19fbWFuYWdlciA9IG1hbmFnZXI7CisgICAgdGhpcy5fX190cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgdGhpcy5fX190aW1lb3V0ID0gdGltZW91dDsKKyAgfQorCisgIHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IGdldFByb3RvY29sRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gX19fcHJvdG9jb2xGYWN0b3J5OworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0VGltZW91dCgpIHsKKyAgICByZXR1cm4gX19fdGltZW91dDsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGhhc1RpbWVvdXQoKSB7CisgICAgcmV0dXJuIF9fX3RpbWVvdXQgPiAwOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICB0aGlzLl9fX3RpbWVvdXQgPSB0aW1lb3V0OworICB9CisKKyAgLyoqCisgICAqIElzIHRoZSBjbGllbnQgaW4gYW4gZXJyb3Igc3RhdGU/CisgICAqIEByZXR1cm4gSWYgY2xpZW50IGluIGFuIGVycm9yIHN0YXRlPworICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKSB7CisgICAgcmV0dXJuIF9fX2Vycm9yICE9IG51bGw7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBjbGllbnQncyBlcnJvciAtIHJldHVybnMgbnVsbCBpZiBubyBlcnJvcgorICAgKiBAcmV0dXJuIEdldCB0aGUgY2xpZW50J3MgZXJyb3IuIDxwPiByZXR1cm5zIG51bGwgaWYgbm8gZXJyb3IKKyAgICovCisgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXJyb3IoKSB7CisgICAgcmV0dXJuIF9fX2Vycm9yOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgY2hlY2tSZWFkeSgpIHsKKyAgICAvLyBFbnN1cmUgd2UgYXJlIG5vdCBjdXJyZW50bHkgZXhlY3V0aW5nIGEgbWV0aG9kCisgICAgaWYgKF9fX2N1cnJlbnRNZXRob2QgIT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2xpZW50IGlzIGN1cnJlbnRseSBleGVjdXRpbmcgYW5vdGhlciBtZXRob2Q6ICIgKyBfX19jdXJyZW50TWV0aG9kLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvLyBFbnN1cmUgd2UncmUgbm90IGluIGFuIGVycm9yIHN0YXRlCisgICAgaWYgKF9fX2Vycm9yICE9IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNsaWVudCBoYXMgYW4gZXJyb3IhIiwgX19fZXJyb3IpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgZGVsZWdhdGUgbWV0aG9kIHdoZW4gZmluaXNoZWQKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIG9uQ29tcGxldGUoKSB7CisgICAgX19fY3VycmVudE1ldGhvZCA9IG51bGw7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJ5IGRlbGVnYXRlIG1ldGhvZCBvbiBlcnJvcgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgX19fdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgX19fY3VycmVudE1ldGhvZCA9IG51bGw7CisgICAgX19fZXJyb3IgPSBleGNlcHRpb247CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnRGYWN0b3J5LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZmViNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OworCitwdWJsaWMgaW50ZXJmYWNlIFRBc3luY0NsaWVudEZhY3Rvcnk8VCBleHRlbmRzIFRBc3luY0NsaWVudD4geworICBwdWJsaWMgVCBnZXRBc3luY0NsaWVudChUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwN2NjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRTZWxlY3RvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIENvbnRhaW5zIHNlbGVjdG9yIHRocmVhZCB3aGljaCB0cmFuc2l0aW9ucyBtZXRob2QgY2FsbCBvYmplY3RzCisgKi8KK3B1YmxpYyBjbGFzcyBUQXN5bmNDbGllbnRNYW5hZ2VyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRBc3luY0NsaWVudE1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwcml2YXRlIGZpbmFsIFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQ7CisgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudExpbmtlZFF1ZXVlPFRBc3luY01ldGhvZENhbGw+IHBlbmRpbmdDYWxscyA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8VEFzeW5jTWV0aG9kQ2FsbD4oKTsKKworICBwdWJsaWMgVEFzeW5jQ2xpZW50TWFuYWdlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5zZWxlY3RUaHJlYWQgPSBuZXcgU2VsZWN0VGhyZWFkKCk7CisgICAgc2VsZWN0VGhyZWFkLnN0YXJ0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjYWxsKFRBc3luY01ldGhvZENhbGwgbWV0aG9kKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaWYgKCFpc1J1bm5pbmcoKSkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlbGVjdFRocmVhZCBpcyBub3QgcnVubmluZyIpOworICAgIH0KKyAgICBtZXRob2QucHJlcGFyZU1ldGhvZENhbGwoKTsKKyAgICBwZW5kaW5nQ2FsbHMuYWRkKG1ldGhvZCk7CisgICAgc2VsZWN0VGhyZWFkLmdldFNlbGVjdG9yKCkud2FrZXVwKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgIHNlbGVjdFRocmVhZC5maW5pc2goKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICByZXR1cm4gc2VsZWN0VGhyZWFkLmlzQWxpdmUoKTsKKyAgfQorCisgIHByaXZhdGUgY2xhc3MgU2VsZWN0VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBydW5uaW5nOworICAgIHByaXZhdGUgZmluYWwgVHJlZVNldDxUQXN5bmNNZXRob2RDYWxsPiB0aW1lb3V0V2F0Y2hTZXQgPSBuZXcgVHJlZVNldDxUQXN5bmNNZXRob2RDYWxsPihuZXcgVEFzeW5jTWV0aG9kQ2FsbFRpbWVvdXRDb21wYXJhdG9yKCkpOworCisgICAgcHVibGljIFNlbGVjdFRocmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICB0aGlzLnNlbGVjdG9yID0gU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpLm9wZW5TZWxlY3RvcigpOworICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTsKKyAgICAgIHRoaXMuc2V0TmFtZSgiVEFzeW5jQ2xpZW50TWFuYWdlciNTZWxlY3RvclRocmVhZCAiICsgdGhpcy5nZXRJZCgpKTsKKworICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBob2xkIHVwIHRoZSBKVk0gd2hlbiBzaHV0dGluZyBkb3duCisgICAgICBzZXREYWVtb24odHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFNlbGVjdG9yIGdldFNlbGVjdG9yKCkgeworICAgICAgcmV0dXJuIHNlbGVjdG9yOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgIHNlbGVjdG9yLndha2V1cCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgIHdoaWxlIChydW5uaW5nKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0V2F0Y2hTZXQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgLy8gTm8gdGltZW91dHMsIHNvIHNlbGVjdCBpbmRlZmluaXRlbHkKKyAgICAgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgdGltZW91dCBwZW5kaW5nLCBzbyBjYWxjdWxhdGUgdGhlIHRpbWUgdW50aWwgdGhlbiBhbmQgc2VsZWN0IGFwcHJvcHJpYXRlbHkKKyAgICAgICAgICAgICAgbG9uZyBuZXh0VGltZW91dCA9IHRpbWVvdXRXYXRjaFNldC5maXJzdCgpLmdldFRpbWVvdXRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgbG9uZyBzZWxlY3RUaW1lID0gbmV4dFRpbWVvdXQgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgaWYgKHNlbGVjdFRpbWUgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gTmV4dCB0aW1lb3V0IGlzIGluIHRoZSBmdXR1cmUsIHNlbGVjdCBhbmQgd2FrZSB1cCB0aGVuCisgICAgICAgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KHNlbGVjdFRpbWUpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE5leHQgdGltZW91dCBpcyBub3cgb3IgaW4gcGFzdCwgc2VsZWN0IGltbWVkaWF0ZWx5IHNvIHdlIGNhbiB0aW1lIG91dAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLnNlbGVjdE5vdygpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJDYXVnaHQgSU9FeGNlcHRpb24gaW4gVEFzeW5jQ2xpZW50TWFuYWdlciEiLCBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdHJhbnNpdGlvbk1ldGhvZHMoKTsKKyAgICAgICAgICB0aW1lb3V0TWV0aG9kcygpOworICAgICAgICAgIHN0YXJ0UGVuZGluZ01ldGhvZHMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiSWdub3JpbmcgdW5jYXVnaHQgZXhjZXB0aW9uIGluIFNlbGVjdFRocmVhZCIsIGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdHJ5IHsKKyAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIExPR0dFUi53YXJuKCJDb3VsZCBub3QgY2xvc2Ugc2VsZWN0b3IuIFRoaXMgbWF5IHJlc3VsdCBpbiBsZWFrZWQgcmVzb3VyY2VzISIsIGV4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUcmFuc2l0aW9uIG1ldGhvZHMgZm9yIHJlYWR5IGtleXMKKyAgICBwcml2YXRlIHZvaWQgdHJhbnNpdGlvbk1ldGhvZHMoKSB7CisgICAgICB0cnkgeworICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IGtleXMgPSBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0ga2V5cy5uZXh0KCk7CisgICAgICAgICAga2V5cy5yZW1vdmUoKTsKKyAgICAgICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgbWV0aG9kIGNhbGwgZXhwZXJpZW5jZWQgYW4gZXJyb3IgYW5kIHRoZQorICAgICAgICAgICAgLy8ga2V5IHdhcyBjYW5jZWxsZWQuIGNhbiBhbHNvIGhhcHBlbiBpZiB3ZSB0aW1lb3V0IGEgbWV0aG9kLCB3aGljaAorICAgICAgICAgICAgLy8gcmVzdWx0cyBpbiBhIGNoYW5uZWwgY2xvc2UuCisgICAgICAgICAgICAvLyBqdXN0IHNraXAKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBUQXN5bmNNZXRob2RDYWxsIG1ldGhvZENhbGwgPSAoVEFzeW5jTWV0aG9kQ2FsbClrZXkuYXR0YWNobWVudCgpOworICAgICAgICAgIG1ldGhvZENhbGwudHJhbnNpdGlvbihrZXkpOworCisgICAgICAgICAgLy8gSWYgZG9uZSBvciBlcnJvciBvY2N1cnJlZCwgcmVtb3ZlIGZyb20gdGltZW91dCB3YXRjaCBzZXQKKyAgICAgICAgICBpZiAobWV0aG9kQ2FsbC5pc0ZpbmlzaGVkKCkgfHwgbWV0aG9kQ2FsbC5nZXRDbGllbnQoKS5oYXNFcnJvcigpKSB7CisgICAgICAgICAgICB0aW1lb3V0V2F0Y2hTZXQucmVtb3ZlKG1ldGhvZENhbGwpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoQ2xvc2VkU2VsZWN0b3JFeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIkNhdWdodCBDbG9zZWRTZWxlY3RvckV4Y2VwdGlvbiBpbiBUQXN5bmNDbGllbnRNYW5hZ2VyISIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRpbWVvdXQgYW55IGV4aXN0aW5nIG1ldGhvZCBjYWxscworICAgIHByaXZhdGUgdm9pZCB0aW1lb3V0TWV0aG9kcygpIHsKKyAgICAgIEl0ZXJhdG9yPFRBc3luY01ldGhvZENhbGw+IGl0ZXJhdG9yID0gdGltZW91dFdhdGNoU2V0Lml0ZXJhdG9yKCk7CisgICAgICBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgIFRBc3luY01ldGhvZENhbGwgbWV0aG9kQ2FsbCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRUaW1lID49IG1ldGhvZENhbGwuZ2V0VGltZW91dFRpbWVzdGFtcCgpKSB7CisgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgbWV0aG9kQ2FsbC5vbkVycm9yKG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJPcGVyYXRpb24gIiArIG1ldGhvZENhbGwuZ2V0Q2xhc3MoKSArICIgdGltZWQgb3V0IGFmdGVyICIgKyAoY3VycmVudFRpbWUgLSBtZXRob2RDYWxsLmdldFN0YXJ0VGltZSgpKSArICIgbXMuIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gU3RhcnQgYW55IG5ldyBjYWxscworICAgIHByaXZhdGUgdm9pZCBzdGFydFBlbmRpbmdNZXRob2RzKCkgeworICAgICAgVEFzeW5jTWV0aG9kQ2FsbCBtZXRob2RDYWxsOworICAgICAgd2hpbGUgKChtZXRob2RDYWxsID0gcGVuZGluZ0NhbGxzLnBvbGwoKSkgIT0gbnVsbCkgeworICAgICAgICAvLyBDYXRjaCByZWdpc3RyYXRpb24gZXJyb3JzLiBtZXRob2Qgd2lsbCBjYXRjaCB0cmFuc2l0aW9uIGVycm9ycyBhbmQgY2xlYW51cC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBtZXRob2RDYWxsLnN0YXJ0KHNlbGVjdG9yKTsKKworICAgICAgICAgIC8vIElmIHRpbWVvdXQgc3BlY2lmaWVkIGFuZCBmaXJzdCB0cmFuc2l0aW9uIHdlbnQgc21vb3RobHksIGFkZCB0byB0aW1lb3V0IHdhdGNoIHNldAorICAgICAgICAgIFRBc3luY0NsaWVudCBjbGllbnQgPSBtZXRob2RDYWxsLmdldENsaWVudCgpOworICAgICAgICAgIGlmIChjbGllbnQuaGFzVGltZW91dCgpICYmICFjbGllbnQuaGFzRXJyb3IoKSkgeworICAgICAgICAgICAgdGltZW91dFdhdGNoU2V0LmFkZChtZXRob2RDYWxsKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICBMT0dHRVIud2FybigiQ2F1Z2h0IGV4Y2VwdGlvbiBpbiBUQXN5bmNDbGllbnRNYW5hZ2VyISIsIGV4Y2VwdGlvbik7CisgICAgICAgICAgbWV0aG9kQ2FsbC5vbkVycm9yKGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiogQ29tcGFyYXRvciB1c2VkIGluIFRyZWVTZXQgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVEFzeW5jTWV0aG9kQ2FsbFRpbWVvdXRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxUQXN5bmNNZXRob2RDYWxsPiwgU2VyaWFsaXphYmxlIHsKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoVEFzeW5jTWV0aG9kQ2FsbCBsZWZ0LCBUQXN5bmNNZXRob2RDYWxsIHJpZ2h0KSB7CisgICAgICBpZiAobGVmdC5nZXRUaW1lb3V0VGltZXN0YW1wKCkgPT0gcmlnaHQuZ2V0VGltZW91dFRpbWVzdGFtcCgpKSB7CisgICAgICAgIHJldHVybiAoaW50KShsZWZ0LmdldFNlcXVlbmNlSWQoKSAtIHJpZ2h0LmdldFNlcXVlbmNlSWQoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKGludCkobGVmdC5nZXRUaW1lb3V0VGltZXN0YW1wKCkgLSByaWdodC5nZXRUaW1lb3V0VGltZXN0YW1wKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmMTc0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIEVuY2Fwc3VsYXRlcyBhbiBhc3luYyBtZXRob2QgY2FsbC4KKyAqIDxwPgorICogTmVlZCB0byBnZW5lcmF0ZToKKyAqIDx1bD4KKyAqICAgPGxpPnByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlX2FyZ3MoVFByb3RvY29sIHByb3RvY29sKTwvbGk+CisgKiAgIDxsaT5wcm90ZWN0ZWQgYWJzdHJhY3QgVCBnZXRSZXN1bHQoKSB0aHJvd3MgJmx0O0V4Y2VwdGlvbl8xJmd0OywgJmx0O0V4Y2VwdGlvbl8yJmd0OywgLi4uPC9saT4KKyAqIDwvdWw+CisgKgorICogQHBhcmFtIDxUPiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGVuY2Fwc3VsYXRlZCBtZXRob2QgY2FsbC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRBc3luY01ldGhvZENhbGw8VD4geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX01FTU9SWV9CVUZGRVJfU0laRSA9IDEyODsKKyAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljTG9uZyBzZXF1ZW5jZUlkQ291bnRlciA9IG5ldyBBdG9taWNMb25nKDApOworCisgIHB1YmxpYyBzdGF0aWMgZW51bSBTdGF0ZSB7CisgICAgQ09OTkVDVElORywKKyAgICBXUklUSU5HX1JFUVVFU1RfU0laRSwKKyAgICBXUklUSU5HX1JFUVVFU1RfQk9EWSwKKyAgICBSRUFESU5HX1JFU1BPTlNFX1NJWkUsCisgICAgUkVBRElOR19SRVNQT05TRV9CT0RZLAorICAgIFJFU1BPTlNFX1JFQUQsCisgICAgRVJST1I7CisgIH0KKworICAvKioKKyAgICogTmV4dCBzdGVwIGluIHRoZSBjYWxsLCBpbml0aWFsaXplZCBieSBzdGFydCgpCisgICAqLworICBwcml2YXRlIFN0YXRlIHN0YXRlID0gbnVsbDsKKworICBwcm90ZWN0ZWQgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgcHJpdmF0ZSBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKyAgcHJvdGVjdGVkIGZpbmFsIFRBc3luY0NsaWVudCBjbGllbnQ7CisgIHByaXZhdGUgZmluYWwgQXN5bmNNZXRob2RDYWxsYmFjazxUPiBjYWxsYmFjazsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzT25ld2F5OworICBwcml2YXRlIGxvbmcgc2VxdWVuY2VJZDsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWVvdXQ7CisKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHNpemVCdWZmZXI7CisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHNpemVCdWZmZXJBcnJheSA9IG5ldyBieXRlWzRdOworICBwcml2YXRlIEJ5dGVCdWZmZXIgZnJhbWVCdWZmZXI7CisKKyAgcHJpdmF0ZSBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgIHByb3RlY3RlZCBUQXN5bmNNZXRob2RDYWxsKFRBc3luY0NsaWVudCBjbGllbnQsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0LCBBc3luY01ldGhvZENhbGxiYWNrPFQ+IGNhbGxiYWNrLCBib29sZWFuIGlzT25ld2F5KSB7CisgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgIHRoaXMucHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OworICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgIHRoaXMuaXNPbmV3YXkgPSBpc09uZXdheTsKKyAgICB0aGlzLnNlcXVlbmNlSWQgPSBUQXN5bmNNZXRob2RDYWxsLnNlcXVlbmNlSWRDb3VudGVyLmdldEFuZEluY3JlbWVudCgpOworICAgIHRoaXMudGltZW91dCA9IGNsaWVudC5nZXRUaW1lb3V0KCk7CisgIH0KKworICBwcm90ZWN0ZWQgU3RhdGUgZ2V0U3RhdGUoKSB7CisgICAgcmV0dXJuIHN0YXRlOworICB9CisKKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKKyAgICByZXR1cm4gc3RhdGUgPT0gU3RhdGUuUkVTUE9OU0VfUkVBRDsKKyAgfQorCisgIHByb3RlY3RlZCBsb25nIGdldFN0YXJ0VGltZSgpIHsKKyAgICByZXR1cm4gc3RhcnRUaW1lOworICB9CisgIAorICBwcm90ZWN0ZWQgbG9uZyBnZXRTZXF1ZW5jZUlkKCkgeworICAgIHJldHVybiBzZXF1ZW5jZUlkOworICB9CisKKyAgcHVibGljIFRBc3luY0NsaWVudCBnZXRDbGllbnQoKSB7CisgICAgcmV0dXJuIGNsaWVudDsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaGFzVGltZW91dCgpIHsKKyAgICByZXR1cm4gdGltZW91dCA+IDA7CisgIH0KKyAgCisgIHB1YmxpYyBsb25nIGdldFRpbWVvdXRUaW1lc3RhbXAoKSB7CisgICAgcmV0dXJuIHRpbWVvdXQgKyBzdGFydFRpbWU7CisgIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0UmVzdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogSW5pdGlhbGl6ZSBidWZmZXJzLgorICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gaWYgYnVmZmVyIGluaXRpYWxpemF0aW9uIGZhaWxzCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlTWV0aG9kQ2FsbCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUTWVtb3J5QnVmZmVyIG1lbW9yeUJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyKElOSVRJQUxfTUVNT1JZX0JVRkZFUl9TSVpFKTsKKyAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wobWVtb3J5QnVmZmVyKTsKKyAgICB3cml0ZV9hcmdzKHByb3RvY29sKTsKKworICAgIGludCBsZW5ndGggPSBtZW1vcnlCdWZmZXIubGVuZ3RoKCk7CisgICAgZnJhbWVCdWZmZXIgPSBCeXRlQnVmZmVyLndyYXAobWVtb3J5QnVmZmVyLmdldEFycmF5KCksIDAsIGxlbmd0aCk7CisKKyAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShsZW5ndGgsIHNpemVCdWZmZXJBcnJheSk7CisgICAgc2l6ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIud3JhcChzaXplQnVmZmVyQXJyYXkpOworICB9CisKKyAgLyoqCisgICAqIFJlZ2lzdGVyIHdpdGggc2VsZWN0b3IgYW5kIHN0YXJ0IGZpcnN0IHN0YXRlLCB3aGljaCBjb3VsZCBiZSBlaXRoZXIgY29ubmVjdGluZyBvciB3cml0aW5nLgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHJlZ2lzdGVyIG9yIHN0YXJ0aW5nIGZhaWxzCisgICAqLworICB2b2lkIHN0YXJ0KFNlbGVjdG9yIHNlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTZWxlY3Rpb25LZXkga2V5OworICAgIGlmICh0cmFuc3BvcnQuaXNPcGVuKCkpIHsKKyAgICAgIHN0YXRlID0gU3RhdGUuV1JJVElOR19SRVFVRVNUX1NJWkU7CisgICAgICBrZXkgPSB0cmFuc3BvcnQucmVnaXN0ZXJTZWxlY3RvcihzZWwsIFNlbGVjdGlvbktleS5PUF9XUklURSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXRlID0gU3RhdGUuQ09OTkVDVElORzsKKyAgICAgIGtleSA9IHRyYW5zcG9ydC5yZWdpc3RlclNlbGVjdG9yKHNlbCwgU2VsZWN0aW9uS2V5Lk9QX0NPTk5FQ1QpOworCisgICAgICAvLyBub24tYmxvY2tpbmcgY29ubmVjdCBjYW4gY29tcGxldGUgaW1tZWRpYXRlbHksCisgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBub3QgZXhwZWN0IHRoZSBPUF9DT05ORUNUCisgICAgICBpZiAodHJhbnNwb3J0LnN0YXJ0Q29ubmVjdCgpKSB7CisgICAgICAgIHJlZ2lzdGVyRm9yRmlyc3RXcml0ZShrZXkpOworICAgICAgfQorICAgIH0KKworICAgIGtleS5hdHRhY2godGhpcyk7CisgIH0KKworICB2b2lkIHJlZ2lzdGVyRm9yRmlyc3RXcml0ZShTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN0YXRlID0gU3RhdGUuV1JJVElOR19SRVFVRVNUX1NJWkU7CisgICAga2V5LmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9XUklURSk7CisgIH0KKworICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBnZXRGcmFtZUJ1ZmZlcigpIHsKKyAgICByZXR1cm4gZnJhbWVCdWZmZXI7CisgIH0KKworICAvKioKKyAgICogVHJhbnNpdGlvbiB0byBuZXh0IHN0YXRlLCBkb2luZyB3aGF0ZXZlciB3b3JrIGlzIHJlcXVpcmVkLiBTaW5jZSB0aGlzCisgICAqIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBieSB0aGUgc2VsZWN0b3IgdGhyZWFkLCB3ZSBjYW4gbWFrZSBjaGFuZ2VzIHRvIG91cgorICAgKiBzZWxlY3QgaW50ZXJlc3RzIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgY29uY3VycmVuY3kuCisgICAqIEBwYXJhbSBrZXkKKyAgICovCisgIHZvaWQgdHJhbnNpdGlvbihTZWxlY3Rpb25LZXkga2V5KSB7CisgICAgLy8gRW5zdXJlIGtleSBpcyB2YWxpZAorICAgIGlmICgha2V5LmlzVmFsaWQoKSkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU2VsZWN0aW9uIGtleSBub3QgdmFsaWQhIik7CisgICAgICBvbkVycm9yKGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRyYW5zaXRpb24gZnVuY3Rpb24KKyAgICB0cnkgeworICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIENPTk5FQ1RJTkc6CisgICAgICAgICAgZG9Db25uZWN0aW5nKGtleSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV1JJVElOR19SRVFVRVNUX1NJWkU6CisgICAgICAgICAgZG9Xcml0aW5nUmVxdWVzdFNpemUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXUklUSU5HX1JFUVVFU1RfQk9EWToKKyAgICAgICAgICBkb1dyaXRpbmdSZXF1ZXN0Qm9keShrZXkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFQURJTkdfUkVTUE9OU0VfU0laRToKKyAgICAgICAgICBkb1JlYWRpbmdSZXNwb25zZVNpemUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUFESU5HX1JFU1BPTlNFX0JPRFk6CisgICAgICAgICAgZG9SZWFkaW5nUmVzcG9uc2VCb2R5KGtleSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIFJFU1BPTlNFX1JFQUQsIEVSUk9SLCBvciBidWcKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZXRob2QgY2FsbCBpbiBzdGF0ZSAiICsgc3RhdGUKKyAgICAgICAgICAgICAgKyAiIGJ1dCBzZWxlY3RvciBjYWxsZWQgdHJhbnNpdGlvbiBtZXRob2QuIFNlZW1zIGxpa2UgYSBidWcuLi4iKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAga2V5LmF0dGFjaChudWxsKTsKKyAgICAgIG9uRXJyb3IoZSk7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgeworICAgIGNsaWVudC5vbkVycm9yKGUpOworICAgIGNhbGxiYWNrLm9uRXJyb3IoZSk7CisgICAgc3RhdGUgPSBTdGF0ZS5FUlJPUjsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkb1JlYWRpbmdSZXNwb25zZUJvZHkoU2VsZWN0aW9uS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAodHJhbnNwb3J0LnJlYWQoZnJhbWVCdWZmZXIpIDwgMCkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJSZWFkIGNhbGwgZnJhbWUgZmFpbGVkIik7CisgICAgfQorICAgIGlmIChmcmFtZUJ1ZmZlci5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICBjbGVhblVwQW5kRmlyZUNhbGxiYWNrKGtleSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNsZWFuVXBBbmRGaXJlQ2FsbGJhY2soU2VsZWN0aW9uS2V5IGtleSkgeworICAgIHN0YXRlID0gU3RhdGUuUkVTUE9OU0VfUkVBRDsKKyAgICBrZXkuaW50ZXJlc3RPcHMoMCk7CisgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlIFRBc3luY01ldGhvZCBpbnN0YW5jZSBkb2Vzbid0IGhhbmcgYXJvdW5kCisgICAga2V5LmF0dGFjaChudWxsKTsKKyAgICB0cnkgeworICAgICAgVCByZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpOworICAgICAgY2xpZW50Lm9uQ29tcGxldGUoKTsKKyAgICAgIGNhbGxiYWNrLm9uQ29tcGxldGUocmVzdWx0KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgb25FcnJvcihlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZG9SZWFkaW5nUmVzcG9uc2VTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAodHJhbnNwb3J0LnJlYWQoc2l6ZUJ1ZmZlcikgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlJlYWQgY2FsbCBmcmFtZSBzaXplIGZhaWxlZCIpOworICAgIH0KKyAgICBpZiAoc2l6ZUJ1ZmZlci5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICBzdGF0ZSA9IFN0YXRlLlJFQURJTkdfUkVTUE9OU0VfQk9EWTsKKyAgICAgIGZyYW1lQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShURnJhbWVkVHJhbnNwb3J0LmRlY29kZUZyYW1lU2l6ZShzaXplQnVmZmVyQXJyYXkpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZG9Xcml0aW5nUmVxdWVzdEJvZHkoU2VsZWN0aW9uS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAodHJhbnNwb3J0LndyaXRlKGZyYW1lQnVmZmVyKSA8IDApIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiV3JpdGUgY2FsbCBmcmFtZSBmYWlsZWQiKTsKKyAgICB9CisgICAgaWYgKGZyYW1lQnVmZmVyLnJlbWFpbmluZygpID09IDApIHsKKyAgICAgIGlmIChpc09uZXdheSkgeworICAgICAgICBjbGVhblVwQW5kRmlyZUNhbGxiYWNrKGtleSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0ZSA9IFN0YXRlLlJFQURJTkdfUkVTUE9OU0VfU0laRTsKKyAgICAgICAgc2l6ZUJ1ZmZlci5yZXdpbmQoKTsgIC8vIFByZXBhcmUgdG8gcmVhZCBpbmNvbWluZyBmcmFtZSBzaXplCisgICAgICAgIGtleS5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRvV3JpdGluZ1JlcXVlc3RTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAodHJhbnNwb3J0LndyaXRlKHNpemVCdWZmZXIpIDwgMCkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJXcml0ZSBjYWxsIGZyYW1lIHNpemUgZmFpbGVkIik7CisgICAgfQorICAgIGlmIChzaXplQnVmZmVyLnJlbWFpbmluZygpID09IDApIHsKKyAgICAgIHN0YXRlID0gU3RhdGUuV1JJVElOR19SRVFVRVNUX0JPRFk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRvQ29ubmVjdGluZyhTZWxlY3Rpb25LZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICgha2V5LmlzQ29ubmVjdGFibGUoKSB8fCAhdHJhbnNwb3J0LmZpbmlzaENvbm5lY3QoKSkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJub3QgY29ubmVjdGFibGUgb3IgZmluaXNoQ29ubmVjdCByZXR1cm5lZCBmYWxzZSBhZnRlciB3ZSBnb3QgYW4gT1BfQ09OTkVDVCIpOworICAgIH0KKyAgICByZWdpc3RlckZvckZpcnN0V3JpdGUoa2V5KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQppbmRleCBiNjM0MjkxLi40NDVmN2U0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogICAgIHRoaXMudmFsdWVNZXRhRGF0YSA9IHZNZXRhRGF0YTsKICAgfQogICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzLCBNYXA8PyBleHRlbmRzIFRGaWVsZElkRW51bSwgRmllbGRNZXRhRGF0YT4gbWFwKXsKKyAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzczw/IGV4dGVuZHMgVEJhc2U+IHNDbGFzcywgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IG1hcCl7CiAgICAgc3RydWN0TWFwLnB1dChzQ2xhc3MsIG1hcCk7CiAgIH0KIApAQCAtNTUsNyArNTUsNyBAQAogICAgKgogICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKICAgICovCi0gIHB1YmxpYyBzdGF0aWMgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzKXsKKyAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzPD8gZXh0ZW5kcyBUQmFzZT4gc0NsYXNzKXsKICAgICBpZiAoIXN0cnVjdE1hcC5jb250YWluc0tleShzQ2xhc3MpKXsgLy8gTG9hZCBjbGFzcyBpZiBpdCBoYXNuJ3QgYmVlbiBsb2FkZWQKICAgICAgIHRyeXsKICAgICAgICAgc0NsYXNzLm5ld0luc3RhbmNlKCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkVmFsdWVNZXRhRGF0YS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuamF2YQppbmRleCAyYWFkNjVkLi4yMTgwYjA4IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkVmFsdWVNZXRhRGF0YS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmphdmEKQEAgLTMwLDE3ICszMCwyNCBAQAogCiAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1R5cGVkZWZUeXBlOwogICBwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlZGVmTmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmluYXJ5OwogCi0gIHB1YmxpYyBGaWVsZFZhbHVlTWV0YURhdGEoYnl0ZSB0eXBlKSB7CisgIHB1YmxpYyBGaWVsZFZhbHVlTWV0YURhdGEoYnl0ZSB0eXBlLCBib29sZWFuIGJpbmFyeSkgewogICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgdGhpcy5pc1R5cGVkZWZUeXBlID0gZmFsc2U7CiAgICAgdGhpcy50eXBlZGVmTmFtZSA9IG51bGw7CisgICAgdGhpcy5pc0JpbmFyeSA9IGJpbmFyeTsKKyAgfQorCisgIHB1YmxpYyBGaWVsZFZhbHVlTWV0YURhdGEoYnl0ZSB0eXBlKSB7CisgICAgdGhpcyh0eXBlLCBmYWxzZSk7CiAgIH0KIAogICBwdWJsaWMgRmllbGRWYWx1ZU1ldGFEYXRhKGJ5dGUgdHlwZSwgU3RyaW5nIHR5cGVkZWZOYW1lKSB7CiAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICB0aGlzLmlzVHlwZWRlZlR5cGUgPSB0cnVlOwogICAgIHRoaXMudHlwZWRlZk5hbWUgPSB0eXBlZGVmTmFtZTsKKyAgICB0aGlzLmlzQmluYXJ5ID0gZmFsc2U7CiAgIH0KIAogICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVkZWYoKSB7CkBAIC01OCw0ICs2NSw4IEBACiAgIHB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgewogICAgIHJldHVybiB0eXBlID09IFRUeXBlLkxJU1QgfHwgdHlwZSA9PSBUVHlwZS5NQVAgfHwgdHlwZSA9PSBUVHlwZS5TRVQ7CiAgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKKyAgICByZXR1cm4gaXNCaW5hcnk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjU5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcworICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCisgKi8KK2NsYXNzIFNob3J0U3RhY2sgeworCisgIHByaXZhdGUgc2hvcnRbXSB2ZWN0b3I7CisKKyAgLyoqIEFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgbG9jYXRpb24gKi8KKyAgcHJpdmF0ZSBpbnQgdG9wID0gMDsKKworICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07CisgIH0KKworICBwdWJsaWMgc2hvcnQgcG9wKCkgeworICAgIHJldHVybiB2ZWN0b3JbLS10b3BdOworICB9CisKKyAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKKyAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3ApIHsKKyAgICAgIGdyb3coKTsKKyAgICB9CisgICAgdmVjdG9yW3RvcCsrXSA9IHB1c2hlZDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBncm93KCkgeworICAgIHZlY3RvciA9IEFycmF5cy5jb3B5T2YodmVjdG9yLCB2ZWN0b3IubGVuZ3RoIDw8IDEpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdG9wID0gMDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHNiLmFwcGVuZCgiPFNob3J0U3RhY2sgdmVjdG9yOlsiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvci5sZW5ndGg7IGkrKykgeworICAgICAgYm9vbGVhbiBpc1RvcCA9IChpID09ICh0b3AgLSAxKSk7CisgICAgICBzaG9ydCB2YWx1ZSA9IHZlY3RvcltpXTsKKyAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICB9CisgICAgICBpZiAoaXNUb3ApIHsKKyAgICAgICAgc2IuYXBwZW5kKCI+PiIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCI8PCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2IuYXBwZW5kKCJdPiIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKaW5kZXggMzdhOWZkOS4uYWJmYzk2NSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuamF2YQpAQCAtNTYsMjQgKzU2LDIzIEBACiAgICAgaWYgKGxlbiA9PSAzKSB7CiAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQogICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgKyAoc3JjW3NyY09mZisxXSA+PiA0KSkgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYrMV0gPj4gNCkgJiAweDBGKSk7CiAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQogICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZisxXSA8PCAyKSArIChzcmNbc3JjT2ZmKzJdID4+IDYpKSAmIDB4M0YpOworICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmKzJdID4+IDYpICYgMHgwMykpOwogICAgICAgZHN0W2RzdE9mZiArIDNdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdChzcmNbc3JjT2ZmKzJdICYgMHgzRik7CiAgICAgfQogICAgIGVsc2UgaWYgKGxlbiA9PSAyKSB7CiAgICAgICBkc3RbZHN0T2ZmKzFdID0KICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSArIChzcmNbc3JjT2ZmKzFdID4+IDQpKSAmIDB4M0YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYrMV0gPj4gNCkgJiAweDBGKSk7CiAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQotICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmKzFdIDw8IDIpICYgMHgzRik7Ci0KKyAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0MpOwogICAgIH0KICAgICBlbHNlIHsgLy8gbGVuID09IDEpIHsKICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9Ci0gICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzRik7CisgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCk7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQppbmRleCAxY2ZhNjlkLi43OTI0ZTJmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCkBAIC0xOSw3ICsxOSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwpAQCAtMzAsNDQgKzMxLDU5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IEFOT05ZTU9VU19TVFJVQ1QgPSBuZXcgVFN0cnVjdCgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5PX0xFTkdUSF9MSU1JVCA9IC0xOwogCiAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CiAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CiAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBmb3IKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAoc3VjaCBhcyBzdHJpbmdzIG9yIGJpbmFyeSkgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvcgorICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXRfOwogCi0gIHByb3RlY3RlZCBpbnQgcmVhZExlbmd0aF87Ci0gIHByb3RlY3RlZCBib29sZWFuIGNoZWNrUmVhZExlbmd0aF8gPSBmYWxzZTsKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkIGZyb20gdGhlIG5ldHdvcmsgZm9yCisgICAqIGNvbnRhaW5lcnMgKG1hcHMsIHNldHMsIGxpc3RzKSwgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvciB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXRfOworCisgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfOworICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RXcml0ZV87CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaW5vdXRUZW1wID0gbmV3IGJ5dGVbOF07CiAKICAgLyoqCiAgICAqIEZhY3RvcnkKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgewotICAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKLSAgICBwcm90ZWN0ZWQgaW50IHJlYWRMZW5ndGhfOworICAgIHByb3RlY3RlZCBsb25nIHN0cmluZ0xlbmd0aExpbWl0XzsKKyAgICBwcm90ZWN0ZWQgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdF87CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF87CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfOwogCiAgICAgcHVibGljIEZhY3RvcnkoKSB7CiAgICAgICB0aGlzKGZhbHNlLCB0cnVlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRmFjdG9yeShib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKLSAgICAgIHRoaXMoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUsIDApOworICAgICAgdGhpcyhzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSwgTk9fTEVOR1RIX0xJTUlULCBOT19MRU5HVEhfTElNSVQpOwogICAgIH0KIAotICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSwgaW50IHJlYWRMZW5ndGgpIHsKKyAgICBwdWJsaWMgRmFjdG9yeShsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgICB0aGlzKGZhbHNlLCB0cnVlLCBzdHJpbmdMZW5ndGhMaW1pdCwgY29udGFpbmVyTGVuZ3RoTGltaXQpOworICAgIH0KKworICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgICAgc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CisgICAgICBjb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotICAgICAgcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwogICAgIH0KIAogICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotICAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7Ci0gICAgICBpZiAocmVhZExlbmd0aF8gIT0gMCkgewotICAgICAgICBwcm90by5zZXRSZWFkTGVuZ3RoKHJlYWRMZW5ndGhfKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwcm90bzsKKyAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpbmdMZW5ndGhMaW1pdF8sIGNvbnRhaW5lckxlbmd0aExpbWl0Xywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CiAgICAgfQogICB9CiAKQEAgLTc5LDExICs5NSwyMiBAQAogICB9CiAKICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKKyAgICB0aGlzKHRyYW5zLCBOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOworICB9CisKKyAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgdGhpcyh0cmFucywgc3RyaW5nTGVuZ3RoTGltaXQsIGNvbnRhaW5lckxlbmd0aExpbWl0LCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQsIGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSkgewogICAgIHN1cGVyKHRyYW5zKTsKKyAgICBzdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICBjb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKICAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CiAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmIChzdHJpY3RXcml0ZV8pIHsKICAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOwpAQCAtOTcsMTA3ICsxMjQsMTIxIEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOwogICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKICAgICB3cml0ZUJ5dGUobWFwLnZhbHVlVHlwZSk7CiAgICAgd3JpdGVJMzIobWFwLnNpemUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGxpc3QuZWxlbVR5cGUpOwogICAgIHdyaXRlSTMyKGxpc3Quc2l6ZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShzZXQuZWxlbVR5cGUpOwogICAgIHdyaXRlSTMyKHNldC5zaXplKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShiID8gKGJ5dGUpMSA6IChieXRlKTApOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlIFtdIGJvdXQgPSBuZXcgYnl0ZVsxXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBib3V0WzBdID0gYjsKLSAgICB0cmFuc18ud3JpdGUoYm91dCwgMCwgMSk7CisgICAgaW5vdXRUZW1wWzBdID0gYjsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCAxKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGkxNm91dCA9IG5ldyBieXRlWzJdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaTE2b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2ID4+IDgpKTsKLSAgICBpMTZvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMTYpKTsKLSAgICB0cmFuc18ud3JpdGUoaTE2b3V0LCAwLCAyKTsKKyAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMTYgPj4gOCkpOworICAgIGlub3V0VGVtcFsxXSA9IChieXRlKSgweGZmICYgKGkxNikpOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDIpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTMyb3V0ID0gbmV3IGJ5dGVbNF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7Ci0gICAgaTMyb3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDE2KSk7Ci0gICAgaTMyb3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDgpKTsKLSAgICBpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpMzIpKTsKLSAgICB0cmFuc18ud3JpdGUoaTMyb3V0LCAwLCA0KTsKKyAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMjQpKTsKKyAgICBpbm91dFRlbXBbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKKyAgICBpbm91dFRlbXBbMl0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gOCkpOworICAgIGlub3V0VGVtcFszXSA9IChieXRlKSgweGZmICYgKGkzMikpOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDQpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTY0b3V0ID0gbmV3IGJ5dGVbOF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGk2NG91dFswXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA1NikpOwotICAgIGk2NG91dFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOwotICAgIGk2NG91dFsyXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0MCkpOwotICAgIGk2NG91dFszXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAzMikpOwotICAgIGk2NG91dFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOwotICAgIGk2NG91dFs1XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAxNikpOwotICAgIGk2NG91dFs2XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA4KSk7Ci0gICAgaTY0b3V0WzddID0gKGJ5dGUpKDB4ZmYgJiAoaTY0KSk7Ci0gICAgdHJhbnNfLndyaXRlKGk2NG91dCwgMCwgOCk7CisgICAgaW5vdXRUZW1wWzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDU2KSk7CisgICAgaW5vdXRUZW1wWzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQ4KSk7CisgICAgaW5vdXRUZW1wWzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7CisgICAgaW5vdXRUZW1wWzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDMyKSk7CisgICAgaW5vdXRUZW1wWzRdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDI0KSk7CisgICAgaW5vdXRUZW1wWzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7CisgICAgaW5vdXRUZW1wWzZdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDgpKTsKKyAgICBpbm91dFRlbXBbN10gPSAoYnl0ZSkoMHhmZiAmIChpNjQpKTsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCA4KTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVJNjQoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gZGF0ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVJMzIoZGF0Lmxlbmd0aCk7Ci0gICAgICB0cmFuc18ud3JpdGUoZGF0LCAwLCBkYXQubGVuZ3RoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBkYXQgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVJMzIoZGF0Lmxlbmd0aCk7CisgICAgdHJhbnNfLndyaXRlKGRhdCwgMCwgZGF0Lmxlbmd0aCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShieXRlW10gYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgd3JpdGVJMzIoYmluLmxlbmd0aCk7Ci0gICAgdHJhbnNfLndyaXRlKGJpbiwgMCwgYmluLmxlbmd0aCk7CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShCeXRlQnVmZmVyIGJpbikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGludCBsZW5ndGggPSBiaW4ubGltaXQoKSAtIGJpbi5wb3NpdGlvbigpOworICAgIHdyaXRlSTMyKGxlbmd0aCk7CisgICAgdHJhbnNfLndyaXRlKGJpbi5hcnJheSgpLCBiaW4ucG9zaXRpb24oKSArIGJpbi5hcnJheU9mZnNldCgpLCBsZW5ndGgpOwogICB9CiAKICAgLyoqCiAgICAqIFJlYWRpbmcgbWV0aG9kcy4KICAgICovCiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwogICAgIGlmIChzaXplIDwgMCkgewpAQCAtMjE0LDU4ICsyNTUsNzYgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiBBTk9OWU1PVVNfU1RSVUNUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIHR5cGUgPSByZWFkQnl0ZSgpOwogICAgIHNob3J0IGlkID0gdHlwZSA9PSBUVHlwZS5TVE9QID8gMCA6IHJlYWRJMTYoKTsKICAgICByZXR1cm4gbmV3IFRGaWVsZCgiIiwgdHlwZSwgaWQpOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3IFRNYXAocmVhZEJ5dGUoKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICBUTWFwIG1hcCA9IG5ldyBUTWFwKHJlYWRCeXRlKCksIHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKG1hcC5zaXplKTsKKyAgICByZXR1cm4gbWFwOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBUTGlzdChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIFRMaXN0IGxpc3QgPSBuZXcgVExpc3QocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgobGlzdC5zaXplKTsKKyAgICByZXR1cm4gbGlzdDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHJldHVybiBuZXcgVFNldChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIFRTZXQgc2V0ID0gbmV3IFRTZXQocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2V0LnNpemUpOworICAgIHJldHVybiBzZXQ7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICByZXR1cm4gKHJlYWRCeXRlKCkgPT0gMSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBiaW4gPSBuZXcgYnl0ZVsxXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDEpIHsKICAgICAgIGJ5dGUgYiA9IHRyYW5zXy5nZXRCdWZmZXIoKVt0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKV07CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcigxKTsKICAgICAgIHJldHVybiBiOwogICAgIH0KLSAgICByZWFkQWxsKGJpbiwgMCwgMSk7Ci0gICAgcmV0dXJuIGJpblswXTsKKyAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgMSk7CisgICAgcmV0dXJuIGlub3V0VGVtcFswXTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGkxNnJkID0gbmV3IGJ5dGVbMl07CisgIEBPdmVycmlkZQogICBwdWJsaWMgc2hvcnQgcmVhZEkxNigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gYnVmID0gaTE2cmQ7CisgICAgYnl0ZVtdIGJ1ZiA9IGlub3V0VGVtcDsKICAgICBpbnQgb2ZmID0gMDsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDIpIHsKQEAgLTI3Myw3ICszMzIsNyBAQAogICAgICAgb2ZmID0gdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCk7CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcigyKTsKICAgICB9IGVsc2UgewotICAgICAgcmVhZEFsbChpMTZyZCwgMCwgMik7CisgICAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgMik7CiAgICAgfQogCiAgICAgcmV0dXJuCkBAIC0yODIsOSArMzQxLDkgQEAKICAgICAgICAoKGJ1ZltvZmYrMV0gJiAweGZmKSkpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTMycmQgPSBuZXcgYnl0ZVs0XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcmVhZEkzMigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gYnVmID0gaTMycmQ7CisgICAgYnl0ZVtdIGJ1ZiA9IGlub3V0VGVtcDsKICAgICBpbnQgb2ZmID0gMDsKIAogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IDQpIHsKQEAgLTI5Miw3ICszNTEsNyBAQAogICAgICAgb2ZmID0gdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCk7CiAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcig0KTsKICAgICB9IGVsc2UgewotICAgICAgcmVhZEFsbChpMzJyZCwgMCwgNCk7CisgICAgICByZWFkQWxsKGlub3V0VGVtcCwgMCwgNCk7CiAgICAgfQogICAgIHJldHVybgogICAgICAgKChidWZbb2ZmXSAmIDB4ZmYpIDw8IDI0KSB8CkBAIC0zMDEsOSArMzYwLDkgQEAKICAgICAgICgoYnVmW29mZiszXSAmIDB4ZmYpKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGk2NHJkID0gbmV3IGJ5dGVbOF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpNjRyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gOCkgewpAQCAtMzExLDcgKzM3MCw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDgpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGk2NHJkLCAwLCA4KTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCA4KTsKICAgICB9CiAKICAgICByZXR1cm4KQEAgLTMyNSw2NSArMzg0LDc0IEBACiAgICAgICAoKGxvbmcpKGJ1ZltvZmYrN10gJiAweGZmKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShyZWFkSTY0KCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKIAorICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKKwogICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IHNpemUpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBzaXplLCAiVVRGLTgiKTsKLSAgICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIHJldHVybiBzOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgICAgfQorICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksCisgICAgICAgICAgc2l6ZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihzaXplKTsKKyAgICAgIHJldHVybiBzOwogICAgIH0KIAogICAgIHJldHVybiByZWFkU3RyaW5nQm9keShzaXplKTsKICAgfQogCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZ0JvZHkoaW50IHNpemUpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgY2hlY2tSZWFkTGVuZ3RoKHNpemUpOwotICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotICAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgIlVURi04Iik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisKKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgoc2l6ZSk7CisKKyAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBzaXplKSB7CisgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci53cmFwKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIHNpemUpOworICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoc2l6ZSk7CisgICAgICByZXR1cm4gYmI7CisgICAgfQorCisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChidWYpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3RyaW5nUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChzdHJpbmdMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IHN0cmluZ0xlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CiAgICAgfQogICB9CiAKLSAgcHVibGljIGJ5dGVbXSByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGludCBzaXplID0gcmVhZEkzMigpOwotICAgIGNoZWNrUmVhZExlbmd0aChzaXplKTsKLSAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKLSAgICByZXR1cm4gYnVmOworICBwcml2YXRlIHZvaWQgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKGludCBsZW5ndGgpIHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24geworICAgIGlmIChsZW5ndGggPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVnYXRpdmUgbGVuZ3RoOiAiICsgbGVuZ3RoKTsKKyAgICB9CisgICAgaWYgKGNvbnRhaW5lckxlbmd0aExpbWl0XyAhPSBOT19MRU5HVEhfTElNSVQgJiYgbGVuZ3RoID4gY29udGFpbmVyTGVuZ3RoTGltaXRfKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGVuZ3RoIGV4Y2VlZGVkIG1heCBhbGxvd2VkOiAiICsgbGVuZ3RoKTsKKyAgICB9CiAgIH0KIAogICBwcml2YXRlIGludCByZWFkQWxsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBjaGVja1JlYWRMZW5ndGgobGVuKTsKICAgICByZXR1cm4gdHJhbnNfLnJlYWRBbGwoYnVmLCBvZmYsIGxlbik7CiAgIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWFkTGVuZ3RoKGludCByZWFkTGVuZ3RoKSB7Ci0gICAgcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwotICAgIGNoZWNrUmVhZExlbmd0aF8gPSB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hlY2tSZWFkTGVuZ3RoKGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpZiAobGVuZ3RoIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7Ci0gICAgfQotICAgIGlmIChjaGVja1JlYWRMZW5ndGhfKSB7Ci0gICAgICByZWFkTGVuZ3RoXyAtPSBsZW5ndGg7Ci0gICAgICBpZiAocmVhZExlbmd0aF8gPCAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJNZXNzYWdlIGxlbmd0aCBleGNlZWRlZDogIiArIGxlbmd0aCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjQ5Nzk0Mi4uZWUwNTg2OQotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEKQEAgLTIxLDIxICsyMSwyNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNob3J0U3RhY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIAogLyoqCiAgKiBUQ29tcGFjdFByb3RvY29sMiBpcyB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcGFjdCBwcm90b2NvbCBzcGVjaWZpZWQKLSAqIGluIFRIUklGVC0xMTAuIFRoZSBmdW5kYW1lbnRhbCBhcHByb2FjaCB0byByZWR1Y2luZyB0aGUgb3ZlcmhlYWQgb2YgCisgKiBpbiBUSFJJRlQtMTEwLiBUaGUgZnVuZGFtZW50YWwgYXBwcm9hY2ggdG8gcmVkdWNpbmcgdGhlIG92ZXJoZWFkIG9mCiAgKiBzdHJ1Y3R1cmVzIGlzIGEpIHVzZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMgYWxsIG92ZXIgdGhlIHBsYWNlIGFuZCBiKSBtYWtlCi0gKiB1c2Ugb2YgdW51c2VkIGJpdHMgd2hlcmV2ZXIgcG9zc2libGUuIFlvdXIgc2F2aW5ncyB3aWxsIG9idmlvdXNseSB2YXJ5IAotICogYmFzZWQgb24gdGhlIHNwZWNpZmljIG1ha2V1cCBvZiB5b3VyIHN0cnVjdHMsIGJ1dCBpbiBnZW5lcmFsLCB0aGUgbW9yZSAKKyAqIHVzZSBvZiB1bnVzZWQgYml0cyB3aGVyZXZlciBwb3NzaWJsZS4gWW91ciBzYXZpbmdzIHdpbGwgb2J2aW91c2x5IHZhcnkKKyAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyBtYWtldXAgb2YgeW91ciBzdHJ1Y3RzLCBidXQgaW4gZ2VuZXJhbCwgdGhlIG1vcmUKICAqIGZpZWxkcywgbmVzdGVkIHN0cnVjdHVyZXMsIHNob3J0IHN0cmluZ3MgYW5kIGNvbGxlY3Rpb25zLCBhbmQgbG93LXZhbHVlIGkzMgogICogYW5kIGk2NCBmaWVsZHMgeW91IGhhdmUsIHRoZSBtb3JlIGJlbmVmaXQgeW91J2xsIHNlZS4KICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gRU1QVFlfQllURVMgPSBuZXcgYnl0ZVswXTsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQnl0ZUJ1ZmZlciBFTVBUWV9CVUZGRVIgPSBCeXRlQnVmZmVyLndyYXAoRU1QVFlfQllURVMpOworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTk9fTEVOR1RIX0xJTUlUID0gLTE7CiAKICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOwogICBwcml2YXRlIGZpbmFsIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TVE9QLCAoc2hvcnQpMCk7CkBAIC02MSwxMCArNjYsMjQgQEAKICAgICogVFByb3RvY29sRmFjdG9yeSB0aGF0IHByb2R1Y2VzIFRDb21wYWN0UHJvdG9jb2xzLgogICAgKi8KICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7Ci0gICAgcHVibGljIEZhY3RvcnkoKSB7fQorICAgIHByaXZhdGUgZmluYWwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdF87CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0XzsKKworICAgIHB1YmxpYyBGYWN0b3J5KCkgeworICAgICAgdGhpcyhOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCk7CisgICAgfQorCisgICAgcHVibGljIEZhY3RvcnkobG9uZyBzdHJpbmdMZW5ndGhMaW1pdCkgeworICAgICAgdGhpcyhzdHJpbmdMZW5ndGhMaW1pdCwgTk9fTEVOR1RIX0xJTUlUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFjdG9yeShsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgICB0aGlzLmNvbnRhaW5lckxlbmd0aExpbWl0XyA9IGNvbnRhaW5lckxlbmd0aExpbWl0OworICAgICAgdGhpcy5zdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICB9CiAKICAgICBwdWJsaWMgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKLSAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucyk7CisgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMsIHN0cmluZ0xlbmd0aExpbWl0XywgY29udGFpbmVyTGVuZ3RoTGltaXRfKTsKICAgICB9CiAgIH0KIApAQCAtNzIsNiArOTEsNyBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFZFUlNJT04gPSAxOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFZFUlNJT05fTUFTSyA9IDB4MWY7IC8vIDAwMDEgMTExMQogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFRZUEVfTUFTSyA9IChieXRlKTB4RTA7IC8vIDExMTAgMDAwMAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFRZUEVfQklUUyA9IDB4MDc7IC8vIDAwMDAgMDExMQogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKIAogICAvKioKQEAgLTkyLDcgKzExMiw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUUlVDVCAgICAgICAgID0gMHgwQzsKICAgfQogCi0gIC8qKiAKKyAgLyoqCiAgICAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCiAgICAqIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCiAgICAqLwpAQCAtMTAxLDI0ICsxMjEsNzEgQEAKICAgcHJpdmF0ZSBzaG9ydCBsYXN0RmllbGRJZF8gPSAwOwogCiAgIC8qKgotICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4gCisgICAqIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgogICAgKiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCiAgICAqLwogICBwcml2YXRlIFRGaWVsZCBib29sZWFuRmllbGRfID0gbnVsbDsKIAogICAvKioKLSAgICogSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuIAorICAgKiBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KICAgICogdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRCb29sIGNhbiB1c2UgaXQuCiAgICAqLwogICBwcml2YXRlIEJvb2xlYW4gYm9vbFZhbHVlXyA9IG51bGw7CiAKICAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBmb3IKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAoc3VjaCBhcyBzdHJpbmdzIG9yIGJpbmFyeSkgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvcgorICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXRfOworCisgIC8qKgorICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZCBmcm9tIHRoZSBuZXR3b3JrIGZvcgorICAgKiBjb250YWluZXJzIChtYXBzLCBzZXRzLCBsaXN0cyksIG9yIHtAbGluayAjTk9fTEVOR1RIX0xJTUlUfSBmb3IgdW5saW1pdGVkLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0XzsKKworICAvKioKKyAgICogVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgcmVxdWlyZSBhCisgICAqIHNtYWxsIGFsbG9jYXRpb24uCisgICAqLworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSB0ZW1wID0gbmV3IGJ5dGVbMTBdOworCisgIC8qKgorICAgKiBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sLgorICAgKgorICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCisgICAqIEBwYXJhbSBzdHJpbmdMZW5ndGhMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmb3IKKyAgICogICAgIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuCisgICAqIEBwYXJhbSBjb250YWluZXJMZW5ndGhMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVhZAorICAgKiAgICAgZm9yIGNvbnRhaW5lcnMuCisgICAqLworICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgdGhpcy5zdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICB0aGlzLmNvbnRhaW5lckxlbmd0aExpbWl0XyA9IGNvbnRhaW5lckxlbmd0aExpbWl0OworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRDb21wYWN0UHJvdG9jb2wuCisgICAqCisgICAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIFRUcmFuc3BvcnQgb2JqZWN0IHRvIHJlYWQgZnJvbSBvciB3cml0ZSB0by4KKyAgICogQHBhcmFtIHN0cmluZ0xlbmd0aExpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZvcgorICAgKiAgICAgdmFyaWFibGUtbGVuZ3RoIGZpZWxkcy4KKyAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnN0cnVjdG9yIHNwZWNpZnlpbmcgYm90aCBzdHJpbmcgbGltaXQgYW5kIGNvbnRhaW5lciBsaW1pdCBpbnN0ZWFkCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCkgeworICAgIHRoaXModHJhbnNwb3J0LCBzdHJpbmdMZW5ndGhMaW1pdCwgTk9fTEVOR1RIX0xJTUlUKTsKKyAgfQorCisgIC8qKgogICAgKiBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sLgogICAgKgogICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCiAgICAqLwogICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgewotICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgdGhpcyh0cmFuc3BvcnQsIE5PX0xFTkdUSF9MSU1JVCwgTk9fTEVOR1RIX0xJTUlUKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMTM1LDYgKzIwMiw3IEBACiAgICAqIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKICAgICogcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CiAgICAgd3JpdGVCeXRlRGlyZWN0KChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8ICgobWVzc2FnZS50eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOwpAQCAtMTQzLDEwICsyMTEsMTEgQEAKICAgfQogCiAgIC8qKgotICAgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgCisgICAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQogICAgKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOwogICAgIGxhc3RGaWVsZElkXyA9IDA7CkBAIC0xNjMsMTAgKzIzMiwxMCBAQAogCiAgIC8qKgogICAgKiBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCi0gICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKKyAgICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKCZsdDsgMTUpLAogICAgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCiAgICAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAqLyAKKyAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKSB7CiAgICAgICAvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0LgpAQCAtMTc3LDggKzI0Niw4IEBACiAgIH0KIAogICAvKioKLSAgICogVGhlIHdvcmtob3JzZSBvZiB3cml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgCi0gICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIAorICAgKiBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICAgKiAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQogICAgKiBib29sZWFuIGZpZWxkIGNhc2UuCiAgICAqLwogICBwcml2YXRlIHZvaWQgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjA5LDcgKzI3OCw3IEBACiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUgCisgICAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCiAgICAqIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KICAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTIyMCw4ICsyODksOCBAQAogICAgICAgd3JpdGVCeXRlRGlyZWN0KGdldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUobWFwLnZhbHVlVHlwZSkpOwogICAgIH0KICAgfQotICAKLSAgLyoqIAorCisgIC8qKgogICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjM2LDkgKzMwNSw5IEBACiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluIAorICAgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KICAgICogd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKLSAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLiAKKyAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLgogICAgKiBPdGhlcndpc2UsIHdyaXRlIGEgc2luZ2xlIGJ5dGUuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0yNTIsNyArMzIxLDcgQEAKICAgICB9CiAgIH0KIAotICAvKiogCisgIC8qKgogICAgKiBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0yODIsMzYgKzM1MSwzNyBAQAogCiAgIC8qKgogICAgKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgotICAgKi8gCisgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgZGF0YSwgMCk7Ci0gICAgdHJhbnNfLndyaXRlKGRhdGEpOworICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgdGVtcCwgMCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIDgpOwogICB9CiAKICAgLyoqCi0gICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWVkaW5nLgorICAgKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICB3cml0ZUJpbmFyeShzdHIuZ2V0Qnl0ZXMoIlVURi04IikpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQorICAgIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKICAgfQogCiAgIC8qKgotICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4gCisgICAqIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgogICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoYnl0ZVtdIGJpbikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHdyaXRlVmFyaW50MzIoYmluLmxlbmd0aCk7Ci0gICAgdHJhbnNfLndyaXRlKGJpbik7CisgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaW50IGxlbmd0aCA9IGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCk7CisgICAgd3JpdGVCaW5hcnkoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksIGxlbmd0aCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVCaW5hcnkoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlVmFyaW50MzIobGVuZ3RoKTsKKyAgICB0cmFuc18ud3JpdGUoYnVmLCBvZmZzZXQsIGxlbmd0aCk7CiAgIH0KIAogICAvLwotICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmUgCisgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZQogICAvLyBvdXRwdXQgb3IgcHVycG9zZS4KLSAgLy8gCisgIC8vCiAKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KICAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQpAQCAtMzI0LDcgKzM5NCw3IEBACiAgIC8vCiAKICAgLyoqCi0gICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24gCisgICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KICAgICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgogICAgKi8KICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDb2xsZWN0aW9uQmVnaW4oYnl0ZSBlbGVtVHlwZSwgaW50IHNpemUpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTM0MCw0NCArNDEwLDQyIEBACiAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCiAgICAqIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2Ugd3JpdGVWYXJpbnQ2ND8KICAgICovCi0gIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs1XTsKICAgcHJpdmF0ZSB2b2lkIHdyaXRlVmFyaW50MzIoaW50IG4pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgaWR4ID0gMDsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKLSAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKW47CisgICAgICAgIHRlbXBbaWR4KytdID0gKGJ5dGUpbjsKICAgICAgICAgLy8gd3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOwogICAgICAgICBicmVhazsKICAgICAgICAgLy8gcmV0dXJuOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgIHRlbXBbaWR4KytdID0gKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKICAgICAgICAgLy8gd3JpdGVCeXRlRGlyZWN0KChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOwogICAgICAgICBuID4+Pj0gNzsKICAgICAgIH0KICAgICB9Ci0gICAgdHJhbnNfLndyaXRlKGkzMmJ1ZiwgMCwgaWR4KTsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgaWR4KTsKICAgfQogCiAgIC8qKgogICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KICAgICovCi0gIGJ5dGVbXSB2YXJpbnQ2NG91dCA9IG5ldyBieXRlWzEwXTsKICAgcHJpdmF0ZSB2b2lkIHdyaXRlVmFyaW50NjQobG9uZyBuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGlkeCA9IDA7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgewotICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoYnl0ZSluOworICAgICAgICB0ZW1wW2lkeCsrXSA9IChieXRlKW47CiAgICAgICAgIGJyZWFrOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOworICAgICAgICB0ZW1wW2lkeCsrXSA9ICgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKICAgICAgICAgbiA+Pj49IDc7CiAgICAgICB9CiAgICAgfQotICAgIHRyYW5zXy53cml0ZSh2YXJpbnQ2NG91dCwgMCwgaWR4KTsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgaWR4KTsKICAgfQogCiAgIC8qKgotICAgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIAorICAgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCiAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KICAgICovCiAgIHByaXZhdGUgbG9uZyBsb25nVG9aaWd6YWcobG9uZyBsKSB7CkBAIC0zODUsNyArNDUzLDcgQEAKICAgfQogCiAgIC8qKgotICAgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUgCisgICAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQogICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCiAgICAqLwogICBwcml2YXRlIGludCBpbnRUb1ppZ1phZyhpbnQgbikgewpAQCAtMzkzLDcgKzQ2MSw3IEBACiAgIH0KIAogICAvKioKLSAgICogQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nIAorICAgKiBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKICAgICogdW50aWwgb2ZmKzcuCiAgICAqLwogICBwcml2YXRlIHZvaWQgZml4ZWRMb25nVG9CeXRlcyhsb25nIG4sIGJ5dGVbXSBidWYsIGludCBvZmYpIHsKQEAgLTQwNywzMCArNDc1LDI5IEBACiAgICAgYnVmW29mZis3XSA9IChieXRlKSgobiA+PiA1NikgJiAweGZmKTsKICAgfQogCi0gIC8qKiAKLSAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4gCisgIC8qKgorICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIHdyaXRlIGEgYnl0ZS4KICAgICovCi0gIHByaXZhdGUgYnl0ZVtdIGJ5dGVEaXJlY3RCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKICAgcHJpdmF0ZSB2b2lkIHdyaXRlQnl0ZURpcmVjdChieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlRGlyZWN0QnVmZmVyWzBdID0gYjsKLSAgICB0cmFuc18ud3JpdGUoYnl0ZURpcmVjdEJ1ZmZlcik7CisgICAgdGVtcFswXSA9IGI7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIDEpOwogICB9CiAKLSAgLyoqIAotICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAvKioKKyAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCiAgICAqLwogICBwcml2YXRlIHZvaWQgd3JpdGVCeXRlRGlyZWN0KGludCBuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOwogICB9CiAKIAotICAvLyAKKyAgLy8KICAgLy8gUmVhZGluZyBtZXRob2RzLgotICAvLyAKKyAgLy8KIAogICAvKioKLSAgICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLiAKKyAgICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgogICAgKi8KICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYnl0ZSBwcm90b2NvbElkID0gcmVhZEJ5dGUoKTsKQEAgLTQ0Miw3ICs1MDksNyBAQAogICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT04pIHsKICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIHZlcnNpb24gIiArIFZFUlNJT04gKyAiIGJ1dCBnb3QgIiArIHZlcnNpb24pOwogICAgIH0KLSAgICBieXRlIHR5cGUgPSAoYnl0ZSkoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIDB4MDMpOworICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKICAgICBpbnQgc2VxaWQgPSByZWFkVmFyaW50MzIoKTsKICAgICBTdHJpbmcgbWVzc2FnZU5hbWUgPSByZWFkU3RyaW5nKCk7CiAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShtZXNzYWdlTmFtZSwgdHlwZSwgc2VxaWQpOwpAQCAtNDU5LDE2ICs1MjYsMTYgQEAKICAgfQogCiAgIC8qKgotICAgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvciAKKyAgICogRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKICAgICogdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCiAgICAqLwogICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgcmVhZCBvZmYgdGhlIHdpcmUuCiAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5wb3AoKTsKICAgfQotICAKKwogICAvKioKLSAgICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuIAorICAgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KICAgICovCiAgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYnl0ZSB0eXBlID0gcmVhZEJ5dGUoKTsKQEAgLTQ5NiwyNiArNTYzLDI3IEBACiAgICAgaWYgKGlzQm9vbFR5cGUodHlwZSkpIHsKICAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgogICAgICAgYm9vbFZhbHVlXyA9IChieXRlKSh0eXBlICYgMHgwZikgPT0gVHlwZXMuQk9PTEVBTl9UUlVFID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICB9IAorICAgIH0KIAogICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgogICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkLmlkOwogICAgIHJldHVybiBmaWVsZDsKICAgfQogCi0gIC8qKiAKKyAgLyoqCiAgICAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCByZWFkaW5nIHRoZSBrZXkKICAgICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKICAgICogImNvcnJlY3QiIHR5cGVzLgogICAgKi8KICAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZFZhcmludDMyKCk7CisgICAgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKHNpemUpOwogICAgIGJ5dGUga2V5QW5kVmFsdWVUeXBlID0gc2l6ZSA9PSAwID8gMCA6IHJlYWRCeXRlKCk7CiAgICAgcmV0dXJuIG5ldyBUTWFwKGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpLCBnZXRUVHlwZSgoYnl0ZSkoa2V5QW5kVmFsdWVUeXBlICYgMHhmKSksIHNpemUpOwogICB9CiAKICAgLyoqCi0gICAqIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbCAKKyAgICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCiAgICAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgogICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCiAgICAqIHRydWUgc2l6ZS4KQEAgLTUyNiwxMiArNTk0LDEzIEBACiAgICAgaWYgKHNpemUgPT0gMTUpIHsKICAgICAgIHNpemUgPSByZWFkVmFyaW50MzIoKTsKICAgICB9CisgICAgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKHNpemUpOwogICAgIGJ5dGUgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOwogICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7CiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbCAKKyAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAogICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgogICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCiAgICAqIHRydWUgc2l6ZS4KQEAgLTU1NCw3ICs2MjMsNiBAQAogICAgIHJldHVybiByZWFkQnl0ZSgpID09IFR5cGVzLkJPT0xFQU5fVFJVRTsKICAgfQogCi0gIGJ5dGVbXSBieXRlUmF3QnVmID0gbmV3IGJ5dGVbMV07CiAgIC8qKgogICAgKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCiAgICAqLwpAQCAtNTY0LDggKzYzMiw4IEBACiAgICAgICBiID0gdHJhbnNfLmdldEJ1ZmZlcigpW3RyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpXTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDEpOwogICAgIH0gZWxzZSB7Ci0gICAgICB0cmFuc18ucmVhZEFsbChieXRlUmF3QnVmLCAwLCAxKTsKLSAgICAgIGIgPSBieXRlUmF3QnVmWzBdOworICAgICAgdHJhbnNfLnJlYWRBbGwodGVtcCwgMCwgMSk7CisgICAgICBiID0gdGVtcFswXTsKICAgICB9CiAgICAgcmV0dXJuIGI7CiAgIH0KQEAgLTU5NSw5ICs2NjMsOCBAQAogICAgKiBObyBtYWdpYyBoZXJlIC0ganVzdCByZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KICAgICovCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gbG9uZ0JpdHMgPSBuZXcgYnl0ZVs4XTsKLSAgICB0cmFuc18ucmVhZEFsbChsb25nQml0cywgMCwgOCk7Ci0gICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKGJ5dGVzVG9Mb25nKGxvbmdCaXRzKSk7CisgICAgdHJhbnNfLnJlYWRBbGwodGVtcCwgMCwgOCk7CisgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKGJ5dGVzVG9Mb25nKHRlbXApKTsKICAgfQogCiAgIC8qKgpAQCAtNjA1LDQ5ICs2NzIsNzcgQEAKICAgICovCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbGVuZ3RoID0gcmVhZFZhcmludDMyKCk7CisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKGxlbmd0aCk7CiAKICAgICBpZiAobGVuZ3RoID09IDApIHsKICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKLSAgICB0cnkgewotICAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gbGVuZ3RoKSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIGxlbmd0aCwgIlVURi04Iik7Ci0gICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKGxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZWFkQmluYXJ5KGxlbmd0aCksICJVVEYtOCIpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQhIik7CisgICAgZmluYWwgU3RyaW5nIHN0cjsKKyAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKKyAgICAgIHN0ciA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwKKyAgICAgICAgICBsZW5ndGgsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIobGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyID0gbmV3IFN0cmluZyhyZWFkQmluYXJ5KGxlbmd0aCksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIH0KKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgLyoqCisgICAqIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaW50IGxlbmd0aCA9IHJlYWRWYXJpbnQzMigpOworICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChsZW5ndGgpOworICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEVNUFRZX0JVRkZFUjsKKworICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IGxlbmd0aCkgeworICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcCh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBsZW5ndGgpOworICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIobGVuZ3RoKTsKKyAgICAgIHJldHVybiBiYjsKKyAgICB9CisKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChidWYpOworICB9CisKKyAgLyoqCisgICAqIFJlYWQgYSBieXRlW10gb2YgYSBrbm93biBsZW5ndGggZnJvbSB0aGUgd2lyZS4KKyAgICovCisgIHByaXZhdGUgYnl0ZVtdIHJlYWRCaW5hcnkoaW50IGxlbmd0aCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIEVNUFRZX0JZVEVTOworCisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBsZW5ndGgpOworICAgIHJldHVybiBidWY7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKGludCBsZW5ndGgpIHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24geworICAgIGlmIChsZW5ndGggPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVnYXRpdmUgbGVuZ3RoOiAiICsgbGVuZ3RoKTsKKyAgICB9CisgICAgaWYgKHN0cmluZ0xlbmd0aExpbWl0XyAhPSBOT19MRU5HVEhfTElNSVQgJiYgbGVuZ3RoID4gc3RyaW5nTGVuZ3RoTGltaXRfKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGVuZ3RoIGV4Y2VlZGVkIG1heCBhbGxvd2VkOiAiICsgbGVuZ3RoKTsKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLiAKLSAgICovCi0gIHB1YmxpYyBieXRlW10gcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpbnQgbGVuZ3RoID0gcmVhZFZhcmludDMyKCk7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07Ci0KLSAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIGJ1ZjsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuIAotICAgKi8KLSAgcHJpdmF0ZSBieXRlW10gcmVhZEJpbmFyeShpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07Ci0KLSAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIGJ1ZjsKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChjb250YWluZXJMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IGNvbnRhaW5lckxlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQogICB9CiAKICAgLy8KLSAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZSAKKyAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQogICAvLyBlbmNvZGluZy4KICAgLy8KICAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQpAQCAtNjkxLDcgKzc4Niw3IEBACiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldCAKKyAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAogICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgogICAgKi8KICAgcHJpdmF0ZSBsb25nIHJlYWRWYXJpbnQ2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTczMSw3ICs4MjYsNyBAQAogICAgIHJldHVybiAobiA+Pj4gMSkgXiAtKG4gJiAxKTsKICAgfQogCi0gIC8qKiAKKyAgLyoqCiAgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgogICAgKi8KICAgcHJpdmF0ZSBsb25nIHppZ3phZ1RvTG9uZyhsb25nIG4pIHsKQEAgLTczOSw3ICs4MzQsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLCAKKyAgICogTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCiAgICAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCiAgICAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCiAgICAqLwpAQCAtNzY1LDcgKzg2MCw3IEBACiAgIH0KIAogICAvKioKLSAgICogR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIAorICAgKiBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKICAgICogVFR5cGUgdmFsdWUuCiAgICAqLwogICBwcml2YXRlIGJ5dGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YQppbmRleCAwM2FmZmRhLi4zMTMzMWJiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RGaWVsZC5qYXZhCkBAIC00Miw3ICs0MiwyNSBAQAogICAgIHJldHVybiAiPFRGaWVsZCBuYW1lOiciICsgbmFtZSArICInIHR5cGU6IiArIHR5cGUgKyAiIGZpZWxkLWlkOiIgKyBpZCArICI+IjsKICAgfQogCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhURmllbGQgb3RoZXJGaWVsZCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGlkOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB0eXBlOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgVEZpZWxkIG90aGVyRmllbGQgPSAoVEZpZWxkKSBvYmo7CiAgICAgcmV0dXJuIHR5cGUgPT0gb3RoZXJGaWVsZC50eXBlICYmIGlkID09IG90aGVyRmllbGQuaWQ7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IDg5YmE5YjQuLmQzN2M0OTMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQpAQCAtMTksMTIgKzE5LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKIC8qKgogICogSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgogICoKQEAgLTQwLDkgKzQ0LDE2IEBACiAgICAqIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cwogICAgKi8KICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmllbGROYW1lc0FzU3RyaW5nXyA9IGZhbHNlOworCisgICAgcHVibGljIEZhY3RvcnkoKSB7fQorCisgICAgcHVibGljIEZhY3RvcnkoYm9vbGVhbiBmaWVsZE5hbWVzQXNTdHJpbmcpIHsKKyAgICAgIGZpZWxkTmFtZXNBc1N0cmluZ18gPSBmaWVsZE5hbWVzQXNTdHJpbmc7CisgICAgfQogCiAgICAgcHVibGljIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7Ci0gICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zLCBmaWVsZE5hbWVzQXNTdHJpbmdfKTsKICAgICB9CiAKICAgfQpAQCAtNjgsMTAgKzc5LDEwIEBACiAgICAgMSwgIDEsJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgLy8gMgogICB9OwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVfQ0hBUlMgPSAiXCJcXGJmbnJ0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRV9DSEFSUyA9ICJcIlxcL2JmbnJ0IjsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRVNDQVBFX0NIQVJfVkFMUyA9IHsKLSAgICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCisgICAgJyInLCAnXFwnLCAnLycsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCiAgIH07CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBERUZfU1RSSU5HX1NJWkUgPSAxNjsKQEAgLTI4Myw2ICsyOTQsOSBAQAogICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgogICBwcml2YXRlIExvb2thaGVhZFJlYWRlciByZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigpOwogCisgIC8vIFdyaXRlIG91dCB0aGUgVEZpZWxkIG5hbWVzIGFzIGEgc3RyaW5nIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgaW50ZWdlciB2YWx1ZQorICBwcml2YXRlIGJvb2xlYW4gZmllbGROYW1lc0FzU3RyaW5nXyA9IGZhbHNlOworCiAgIC8vIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgogICBwcml2YXRlIHZvaWQgcHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpIHsKICAgICBjb250ZXh0U3RhY2tfLnB1c2goY29udGV4dF8pOwpAQCAtMjk0LDYgKzMwOCwxMyBAQAogICAgIGNvbnRleHRfID0gY29udGV4dFN0YWNrXy5wb3AoKTsKICAgfQogCisgIC8vIFJlc2V0IHRoZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlCisgIHByaXZhdGUgdm9pZCByZXNldENvbnRleHQoKSB7CisgICAgd2hpbGUgKCFjb250ZXh0U3RhY2tfLmlzRW1wdHkoKSkgeworICAgICAgcG9wQ29udGV4dCgpOworICAgIH0KKyAgfQorCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvcgogICAgKi8KQEAgLTMwMSw2ICszMjIsMTEgQEAKICAgICBzdXBlcih0cmFucyk7CiAgIH0KIAorICBwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sZWFuIGZpZWxkTmFtZXNBc1N0cmluZykgeworICAgIHN1cGVyKHRyYW5zKTsKKyAgICBmaWVsZE5hbWVzQXNTdHJpbmdfID0gZmllbGROYW1lc0FzU3RyaW5nOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgIGNvbnRleHRTdGFja18uY2xlYXIoKTsKQEAgLTMxMSw3ICszMzcsNyBAQAogICAvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgc2V2ZXJhbCBtZXRob2RzCiAgIHByaXZhdGUgYnl0ZVtdIHRtcGJ1Zl8gPSBuZXcgYnl0ZVs0XTsKIAotICAvLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y3BldGlvbiBpcyB0aHJvd24uCisgIC8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiWzBdOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgLy8gTWFya2VkIHByb3RlY3RlZCB0byBhdm9pZCBzeW50aGV0aWMgYWNjZXNzb3IgaW4gSlNPTkxpc3RDb250ZXh0LnJlYWQKICAgLy8gYW5kIEpTT05QYWlyQ29udGV4dC5yZWFkCiAgIHByb3RlY3RlZCB2b2lkIHJlYWRKU09OU3ludGF4Q2hhcihieXRlW10gYikgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMzI5LDcgKzM1NSw3IEBACiAgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJzAnKTsKICAgICB9CiAgICAgZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpIHsKLSAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScpOworICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICdhJyArIDEwKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCkBAIC0zNDQsNyArMzcwLDcgQEAKICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICdhJyk7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKSh2YWwgLSAxMCkgKyAnYScpOwogICAgIH0KICAgfQogCkBAIC0zOTIsMTIgKzQxOCw4IEBACiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBidWYgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB0cmFuc18ud3JpdGUoYnVmKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBidWYgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgdHJhbnNfLndyaXRlKGJ1Zik7CiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9CkBAIC00MTksMTggKzQ0MSwxNiBAQAogICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKICAgICAgIH0KICAgICAgIGJyZWFrOwotICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIAogICAgIGJvb2xlYW4gZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBjb250ZXh0Xy5lc2NhcGVOdW0oKTsKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB0cmFuc18ud3JpdGUoYiwgMCwgYi5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgdHJhbnNfLndyaXRlKGIsIDAsIGIubGVuZ3RoKTsKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KQEAgLTQzOCwxMSArNDU4LDExIEBACiAKICAgLy8gV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkCiAgIC8vIGRhdGEKLSAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTkJhc2U2NChieXRlW10gYikgdGhyb3dzIFRFeGNlcHRpb24geworICBwcml2YXRlIHZvaWQgd3JpdGVKU09OQmFzZTY0KGJ5dGVbXSBiLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgY29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwotICAgIGludCBsZW4gPSBiLmxlbmd0aDsKLSAgICBpbnQgb2ZmID0gMDsKKyAgICBpbnQgbGVuID0gbGVuZ3RoOworICAgIGludCBvZmYgPSBvZmZzZXQ7CiAgICAgd2hpbGUgKGxlbiA+PSAzKSB7CiAgICAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKICAgICAgIFRCYXNlNjRVdGlscy5lbmNvZGUoYiwgb2ZmLCAzLCB0bXBidWZfLCAwKTsKQEAgLTQ4MiwxNCArNTAyLDExIEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXNldENvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICB3cml0ZUpTT05BcnJheVN0YXJ0KCk7CiAgICAgd3JpdGVKU09OSW50ZWdlcihWRVJTSU9OKTsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBtZXNzYWdlLm5hbWUuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUpTT05TdHJpbmcoYik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IG1lc3NhZ2UubmFtZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUpTT05TdHJpbmcoYik7CiAgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnR5cGUpOwogICAgIHdyaXRlSlNPTkludGVnZXIobWVzc2FnZS5zZXFpZCk7CiAgIH0KQEAgLTUxMSw3ICs1MjgsMTEgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHdyaXRlSlNPTkludGVnZXIoZmllbGQuaWQpOworICAgIGlmIChmaWVsZE5hbWVzQXNTdHJpbmdfKSB7CisgICAgICB3cml0ZVN0cmluZyhmaWVsZC5uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVKU09OSW50ZWdlcihmaWVsZC5pZCk7CisgICAgfQogICAgIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CiAgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkLnR5cGUpKTsKICAgfQpAQCAtNTk1LDE3ICs2MTYsMTMgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShieXRlW10gYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgd3JpdGVKU09OQmFzZTY0KGJpbik7CisgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQmFzZTY0KGJpbi5hcnJheSgpLCBiaW4ucG9zaXRpb24oKSArIGJpbi5hcnJheU9mZnNldCgpLCBiaW4ubGltaXQoKSAtIGJpbi5wb3NpdGlvbigpIC0gYmluLmFycmF5T2Zmc2V0KCkpOwogICB9CiAKICAgLyoqCkBAIC02MTcsNiArNjM0LDcgQEAKICAgcHJpdmF0ZSBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlYWRKU09OU3RyaW5nKGJvb2xlYW4gc2tpcENvbnRleHQpCiAgICAgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oREVGX1NUUklOR19TSVpFKTsKKyAgICBBcnJheUxpc3Q8Q2hhcmFjdGVyPiBjb2RldW5pdHMgPSBuZXcgQXJyYXlMaXN0PENoYXJhY3Rlcj4oKTsKICAgICBpZiAoIXNraXBDb250ZXh0KSB7CiAgICAgICBjb250ZXh0Xy5yZWFkKCk7CiAgICAgfQpAQCAtNjI5LDEwICs2NDcsNDEgQEAKICAgICAgIGlmIChjaCA9PSBFU0NTRVFbMF0pIHsKICAgICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKICAgICAgICAgaWYgKGNoID09IEVTQ1NFUVsxXSkgewotICAgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihaRVJPKTsKLSAgICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0gICAgICAgICAgdHJhbnNfLnJlYWRBbGwodG1wYnVmXywgMCwgMik7Ci0gICAgICAgICAgY2ggPSAoYnl0ZSkoKGhleFZhbCgoYnl0ZSl0bXBidWZfWzBdKSA8PCA0KSArIGhleFZhbCh0bXBidWZfWzFdKSk7CisgICAgICAgICAgdHJhbnNfLnJlYWRBbGwodG1wYnVmXywgMCwgNCk7CisgICAgICAgICAgc2hvcnQgY3UgPSAoc2hvcnQpKAorICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzBdKSA8PCAxMikgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzFdKSA8PCA4KSArCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMl0pIDw8IDQpICsKKyAgICAgICAgICAgICAgKHNob3J0KWhleFZhbCh0bXBidWZfWzNdKSk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNIaWdoU3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb2RldW5pdHMuYWRkKChjaGFyKWN1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0xvd1N1cnJvZ2F0ZSgoY2hhciljdSkpIHsKKyAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGNvZGV1bml0cy5hZGQoKGNoYXIpY3UpOworICAgICAgICAgICAgICBhcnIud3JpdGUoCisgICAgICAgICAgICAgICAgICAobmV3IFN0cmluZyhuZXcgaW50W10geyBjb2RldW5pdHMuZ2V0KDApLCBjb2RldW5pdHMuZ2V0KDEpIH0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgMikpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgICAgICAgY29kZXVuaXRzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgYXJyLndyaXRlKChuZXcgU3RyaW5nKG5ldyBpbnRbXSB7IGN1IH0sIDAsIDEpKQorICAgICAgICAgICAgICAgICAgLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgIkludmFsaWQgdW5pY29kZSBzZXF1ZW5jZSIpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICBpbnQgb2ZmID0gRVNDQVBFX0NIQVJTLmluZGV4T2YoY2gpOwpAQCAtNzEwLDE5ICs3NTksMTQgQEAKICAgICBjb250ZXh0Xy5yZWFkKCk7CiAgICAgaWYgKHJlYWRlcl8ucGVlaygpID09IFFVT1RFWzBdKSB7CiAgICAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IHJlYWRKU09OU3RyaW5nKHRydWUpOwotICAgICAgdHJ5IHsKLSAgICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS52YWx1ZU9mKGFyci50b1N0cmluZygiVVRGLTgiKSk7Ci0gICAgICAgIGlmICghY29udGV4dF8uZXNjYXBlTnVtKCkgJiYgIURvdWJsZS5pc05hTihkdWIpICYmCi0gICAgICAgICAgICAhRG91YmxlLmlzSW5maW5pdGUoZHViKSkgewotICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQotICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkdWI7CisgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIGlmICghY29udGV4dF8uZXNjYXBlTnVtKCkgJiYgIURvdWJsZS5pc05hTihkdWIpCisgICAgICAgICAgJiYgIURvdWJsZS5pc0luZmluaXRlKGR1YikpIHsKKyAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOwogICAgICAgfQotICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgICB9CisgICAgICByZXR1cm4gZHViOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgewpAQCAtNzQ2LDYgKzc5MCwxMSBAQAogICAgIGludCBsZW4gPSBhcnIubGVuKCk7CiAgICAgaW50IG9mZiA9IDA7CiAgICAgaW50IHNpemUgPSAwOworICAgIC8vIElnbm9yZSBwYWRkaW5nCisgICAgaW50IGJvdW5kID0gbGVuID49IDIgPyBsZW4gLSAyIDogMDsKKyAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSBib3VuZCAmJiBiW2ldID09ICc9JzsgLS1pKSB7CisgICAgICAtLWxlbjsKKyAgICB9CiAgICAgd2hpbGUgKGxlbiA+PSA0KSB7CiAgICAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKICAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKQEAgLTc5MCwxOCArODM5LDEzIEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlc2V0Q29udGV4dCgpOyAvLyBUSFJJRlQtMzc0MwogICAgIHJlYWRKU09OQXJyYXlTdGFydCgpOwogICAgIGlmIChyZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OKSB7CiAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOwogICAgIH0KLSAgICBTdHJpbmcgbmFtZTsKLSAgICB0cnkgewotICAgICAgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBTdHJpbmcgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICBieXRlIHR5cGUgPSAoYnl0ZSkgcmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgaW50IHNlcWlkID0gKGludCkgcmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShuYW1lLCB0eXBlLCBzZXFpZCk7CkBAIC05MTgsMTcgKzk2MiwxMiBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoIlVURi04Iik7Ci0gICAgfQotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgYnl0ZVtdIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRKU09OQmFzZTY0KCk7CisgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChyZWFkSlNPTkJhc2U2NCgpKTsKICAgfQogCiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhCmluZGV4IDE0MzhiMTEuLmYxM2I4Y2EgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhCkBAIC00NCwxNCArNDQsMzMgQEAKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0gICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVE1lc3NhZ2UpIHsKLSAgICAgIHJldHVybiBlcXVhbHMoKFRNZXNzYWdlKSBvdGhlcik7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobmFtZSA9PSBudWxsKSA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgc2VxaWQ7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB0eXBlOworICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVE1lc3NhZ2Ugb3RoZXIpIHsKLSAgICByZXR1cm4gbmFtZS5lcXVhbHMob3RoZXIubmFtZSkgJiYgdHlwZSA9PSBvdGhlci50eXBlICYmIHNlcWlkID09IG90aGVyLnNlcWlkOworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgVE1lc3NhZ2Ugb3RoZXIgPSAoVE1lc3NhZ2UpIG9iajsKKyAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICBpZiAob3RoZXIubmFtZSAhPSBudWxsKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHNlcWlkICE9IG90aGVyLnNlcWlkKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0eXBlICE9IG90aGVyLnR5cGUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhNTY2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCisgKiB0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAorICogYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAqCisgKiA8cD5OT1RFOiBUSElTIElTIE5PVCBVU0VEIEJZIFNFUlZFUlMuICBPbiB0aGUgc2VydmVyLCB1c2Uge0BsaW5rIG9yZy5hcGFjaGUudGhyaWZ0LlRNdWx0aXBsZXhlZFByb2Nlc3NvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3J9IHRvIGhhbmRsZSByZXF1ZXN0cworICogZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgKgorICogPHA+VGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICoKKyAqIDxwcmU+CisgKiB7QGNvZGUKKyAqICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAqICAgICB0cmFuc3BvcnQub3BlbigpOworICoKKyAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAqCisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRGVjb3JhdG9yCisgKi8KK3B1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvciB7CisKKyAgICAvKiogVXNlZCB0byBkZWxpbWl0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICI6IjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRTsKKworICAgIC8qKgorICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3RvY29sIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPGNvZGU+VEJpbmFyeVByb3RvY29sPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgorICAgICAqLworICAgIHB1YmxpYyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFN0cmluZyBzZXJ2aWNlTmFtZSkgeworICAgICAgICBzdXBlcihwcm90b2NvbCk7CisgICAgICAgIFNFUlZJQ0VfTkFNRSA9IHNlcnZpY2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdE1lc3NhZ2UgVGhlIG9yaWdpbmFsIG1lc3NhZ2UuCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIFBhc3NlZCB0aHJvdWdoIGZyb20gd3JhcHBlZCA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0TWVzc2FnZS50eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMIHx8IHRNZXNzYWdlLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgICAgICAgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX05BTUUgKyBTRVBBUkFUT1IgKyB0TWVzc2FnZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICB0TWVzc2FnZS50eXBlLAorICAgICAgICAgICAgICAgICAgICB0TWVzc2FnZS5zZXFpZAorICAgICAgICAgICAgKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbih0TWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmphdmEKaW5kZXggNzhiMDdmOS4uMGU5NjM2OCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuamF2YQpAQCAtMTksNyArMTksMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIAogLyoqCkBAIC05Nyw3ICsxMDEsNyBAQAogCiAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uOwogCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pIHRocm93cyBURXhjZXB0aW9uOworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJpbmFyeShCeXRlQnVmZmVyIGJ1ZikgdGhyb3dzIFRFeGNlcHRpb247CiAKICAgLyoqCiAgICAqIFJlYWRpbmcgbWV0aG9kcy4KQEAgLTE0MSwxMSArMTQ1LDE4IEBACiAKICAgcHVibGljIGFic3RyYWN0IFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb247CiAKLSAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb247CisgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKIAogICAvKioKICAgICogUmVzZXQgYW55IGludGVybmFsIHN0YXRlIGJhY2sgdG8gYSBibGFuayBzbGF0ZS4gVGhpcyBtZXRob2Qgb25seSBuZWVkcyB0bwogICAgKiBiZSBpbXBsZW1lbnRlZCBmb3Igc3RhdGVmdWwgcHJvdG9jb2xzLgogICAgKi8KICAgcHVibGljIHZvaWQgcmVzZXQoKSB7fQorICAKKyAgLyoqCisgICAqIFNjaGVtZSBhY2Nlc3NvcgorICAgKi8KKyAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiBnZXRTY2hlbWUoKSB7CisgICAgcmV0dXJuIFN0YW5kYXJkU2NoZW1lLmNsYXNzOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyOWNkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKy8qKgorICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKKyAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQorICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuICBXaGlsZSBpdCBoYXMgbm8gYWJzdHJhY3QgbWV0aG9kcywgaXQKKyAqIGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLCBpdCBkb2VzIG5vdCBtb2RpZnkKKyAqIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4uCisgKgorICogPHA+U2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKTwvcD4KKyAqIAorICogQHNlZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGV4dGVuZHMgVFByb3RvY29sIHsKKworICAgIHByaXZhdGUgZmluYWwgVFByb3RvY29sIGNvbmNyZXRlUHJvdG9jb2w7CisKKyAgICAvKioKKyAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuCisgICAgICovCisgICAgcHVibGljIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpIHsKKyAgICAgICAgc3VwZXIocHJvdG9jb2wuZ2V0VHJhbnNwb3J0KCkpOworICAgICAgICBjb25jcmV0ZVByb3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgdE1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbih0TWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCB0U3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbih0U3RydWN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgdEZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKHRGaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgdE1hcCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwQmVnaW4odE1hcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCB0TGlzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTGlzdEJlZ2luKHRMaXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHRTZXQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZVNldEJlZ2luKHRTZXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlQm9vbChiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVCeXRlKGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUkxNihpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUkzMihpbnQgaSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlSTMyKGkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KGxvbmcgbCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlSTY0KGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSB2KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVEb3VibGUodik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cmluZyhzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShCeXRlQnVmZmVyIGJ1ZikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlQmluYXJ5KGJ1Zik7CisgICAgfQorCisgICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkTWFwQmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkU2V0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEJvb2woKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEJ5dGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgcmVhZEkxNigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEkxNigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZEkzMigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEkzMigpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHJlYWRJNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRJNjQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWREb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkQmluYXJ5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDI0ODgxNWIuLjg3MGYxYjkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9MSU1JVCA9IDM7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBRF9WRVJTSU9OID0gNDsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVQVEhfTElNSVQgPSA2OwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQppbmRleCA5YmYxMGY2Li5jZGFhMzBiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKQEAgLTUzLDcgKzUzLDcgQEAKICAgICogU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KICAgICoKICAgICogQHBhcmFtIHByb3QgIHRoZSBwcm90b2NvbCBvYmplY3QgdG8gcmVhZCBmcm9tCi0gICAqIEBwYXJhbSB0eXBlICB0aGUgbmV4dCB2YWx1ZSB3aWxsIGJlIGludGVwcmV0ZWQgYXMgdGhpcyBUVHlwZSB2YWx1ZS4KKyAgICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgdGhpcyBUVHlwZSB2YWx1ZS4KICAgICovCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwKFRQcm90b2NvbCBwcm90LCBieXRlIHR5cGUpCiAgICAgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtNjQsNyArNjQsNyBAQAogICAgKiBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgogICAgKgogICAgKiBAcGFyYW0gcHJvdCAgdGhlIHByb3RvY29sIG9iamVjdCB0byByZWFkIGZyb20KLSAgICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgorICAgKiBAcGFyYW0gdHlwZSAgdGhlIG5leHQgdmFsdWUgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgogICAgKiBAcGFyYW0gbWF4RGVwdGggIHRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IHNraXAgY29tcGxleCBvYmplY3RzIHRvIHRoaXMKICAgICogICByZWN1cnNpdmUgZGVwdGgsIHRvIHByZXZlbnQgSmF2YSBzdGFjayBvdmVyZmxvdy4KICAgICovCkBAIC03NCw0MyArNzQsMzUgQEAKICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJNYXhpbXVtIHNraXAgZGVwdGggZXhjZWVkZWQiKTsKICAgICB9CiAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBUVHlwZS5CT09MOgotICAgICAgeworICAgICAgY2FzZSBUVHlwZS5CT09MOgogICAgICAgICBwcm90LnJlYWRCb29sKCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgVFR5cGUuQllURToKLSAgICAgIHsKKworICAgICAgY2FzZSBUVHlwZS5CWVRFOgogICAgICAgICBwcm90LnJlYWRCeXRlKCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgVFR5cGUuSTE2OgotICAgICAgeworCisgICAgICBjYXNlIFRUeXBlLkkxNjoKICAgICAgICAgcHJvdC5yZWFkSTE2KCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgVFR5cGUuSTMyOgotICAgICAgeworCisgICAgICBjYXNlIFRUeXBlLkkzMjoKICAgICAgICAgcHJvdC5yZWFkSTMyKCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgVFR5cGUuSTY0OgotICAgICAgeworCisgICAgICBjYXNlIFRUeXBlLkk2NDoKICAgICAgICAgcHJvdC5yZWFkSTY0KCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgVFR5cGUuRE9VQkxFOgotICAgICAgeworCisgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKICAgICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgVFR5cGUuU1RSSU5HOgotICAgICAgeworCisgICAgICBjYXNlIFRUeXBlLlNUUklORzoKICAgICAgICAgcHJvdC5yZWFkQmluYXJ5KCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgVFR5cGUuU1RSVUNUOgotICAgICAgeworCisgICAgICBjYXNlIFRUeXBlLlNUUlVDVDoKICAgICAgICAgcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICBURmllbGQgZmllbGQgPSBwcm90LnJlYWRGaWVsZEJlZ2luKCk7CkBAIC0xMjIsOSArMTE0LDggQEAKICAgICAgICAgfQogICAgICAgICBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZS5NQVA6Ci0gICAgICB7CisKKyAgICAgIGNhc2UgVFR5cGUuTUFQOgogICAgICAgICBUTWFwIG1hcCA9IHByb3QucmVhZE1hcEJlZ2luKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLnNpemU7IGkrKykgewogICAgICAgICAgIHNraXAocHJvdCwgbWFwLmtleVR5cGUsIG1heERlcHRoIC0gMSk7CkBAIC0xMzIsMjcgKzEyMyw5OSBAQAogICAgICAgICB9CiAgICAgICAgIHByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlLlNFVDoKLSAgICAgIHsKKworICAgICAgY2FzZSBUVHlwZS5TRVQ6CiAgICAgICAgIFRTZXQgc2V0ID0gcHJvdC5yZWFkU2V0QmVnaW4oKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXQuc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgc2tpcChwcm90LCBzZXQuZWxlbVR5cGUsIG1heERlcHRoIC0gMSk7CiAgICAgICAgIH0KICAgICAgICAgcHJvdC5yZWFkU2V0RW5kKCk7CiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIGNhc2UgVFR5cGUuTElTVDoKLSAgICAgIHsKKworICAgICAgY2FzZSBUVHlwZS5MSVNUOgogICAgICAgICBUTGlzdCBsaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplOyBpKyspIHsKICAgICAgICAgICBza2lwKHByb3QsIGxpc3QuZWxlbVR5cGUsIG1heERlcHRoIC0gMSk7CiAgICAgICAgIH0KICAgICAgICAgcHJvdC5yZWFkTGlzdEVuZCgpOwogICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlICIgKyB0eXBlKTsKICAgICB9CiAgIH0KKworICAvKioKKyAgICogQXR0ZW1wdCB0byBkZXRlcm1pbmUgdGhlIHByb3RvY29sIHVzZWQgdG8gc2VyaWFsaXplIHNvbWUgZGF0YS4KKyAgICoKKyAgICogVGhlIGd1ZXNzIGlzIGJhc2VkIG9uIGtub3duIHNwZWNpZmljaXRpZXMgb2Ygc3VwcG9ydGVkIHByb3RvY29scy4KKyAgICogSW4gc29tZSBjYXNlcywgbm8gZ3Vlc3MgY2FuIGJlIGRvbmUsIGluIHRoYXQgY2FzZSB3ZSByZXR1cm4gdGhlCisgICAqIGZhbGxiYWNrIFRQcm90b2NvbEZhY3RvcnkuCisgICAqIFRvIGJlIGNlcnRhaW4gdG8gY29ycmVjdGx5IGRldGVjdCB0aGUgcHJvdG9jb2wsIHRoZSBmaXJzdCBlbmNvZGVkCisgICAqIGZpZWxkIHNob3VsZCBoYXZlIGEgZmllbGQgaWQgJmx0OyAyNTYKKyAgICoKKyAgICogQHBhcmFtIGRhdGEgVGhlIHNlcmlhbGl6ZWQgZGF0YSB0byBndWVzcyB0aGUgcHJvdG9jb2wgZm9yLgorICAgKiBAcGFyYW0gZmFsbGJhY2sgVGhlIFRQcm90b2NvbCB0byByZXR1cm4gaWYgbm8gZ3Vlc3MgY2FuIGJlIG1hZGUuCisgICAqIEByZXR1cm4gYSBDbGFzcyBpbXBsZW1lbnRpbmcgVFByb3RvY29sRmFjdG9yeSB3aGljaCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBkZXNlcmlhbGl6ZXIuCisgICAqLworICBwdWJsaWMgc3RhdGljIFRQcm90b2NvbEZhY3RvcnkgZ3Vlc3NQcm90b2NvbEZhY3RvcnkoYnl0ZVtdIGRhdGEsIFRQcm90b2NvbEZhY3RvcnkgZmFsbGJhY2spIHsKKyAgICAvLworICAgIC8vIElmIHRoZSBmaXJzdCBhbmQgbGFzdCBieXRlcyBhcmUgb3BlbmluZy9jbG9zaW5nIGN1cmx5IGJyYWNlcyB3ZSBndWVzcyB0aGUgcHJvdG9jb2wgYXMKKyAgICAvLyBiZWluZyBUSlNPTlByb3RvY29sLgorICAgIC8vIEl0IGNvdWxkIG5vdCBiZSBhIFRDb21wYWN0QmluYXJ5IGVuY29kaW5nIGZvciBhIGZpZWxkIG9mIHR5cGUgMHhiIChNYXApCisgICAgLy8gd2l0aCBkZWx0YSBpZCA3IGFzIHRoZSBsYXN0IGJ5dGUgZm9yIFRDb21wYWN0QmluYXJ5IGlzIGFsd2F5cyAwLgorICAgIC8vCisKKyAgICBpZiAoJ3snID09IGRhdGFbMF0gJiYgJ30nID09IGRhdGFbZGF0YS5sZW5ndGggLSAxXSkgeworICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sLkZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHRoZSBsYXN0IGJ5dGUgaXMgbm90IDAsIHRoZW4gaXQgY2Fubm90IGJlIFRDb21wYWN0UHJvdG9jb2wsIGl0IG11c3QgYmUKKyAgICAvLyBUQmluYXJ5UHJvdG9jb2wuCisgICAgLy8KKworICAgIGlmIChkYXRhW2RhdGEubGVuZ3RoIC0gMV0gIT0gMCkgeworICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgIH0KKworICAgIC8vCisgICAgLy8gQSBmaXJzdCBieXRlIG9mIHZhbHVlID4gMTYgaW5kaWNhdGVzIFRDb21wYWN0UHJvdG9jb2wgd2FzIHVzZWQsIGFuZCB0aGUgZmlyc3QgYnl0ZQorICAgIC8vIGVuY29kZXMgYSBkZWx0YSBmaWVsZCBpZCAoaWQgPD0gMTUpIGFuZCBhIGZpZWxkIHR5cGUuCisgICAgLy8KKworICAgIGlmIChkYXRhWzBdID4gMHgxMCkgeworICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHRoZSBzZWNvbmQgYnl0ZSBpcyAwIHRoZW4gaXQgaXMgYSBmaWVsZCBpZCA8IDI1NiBlbmNvZGVkIGJ5IFRCaW5hcnlQcm90b2NvbC4KKyAgICAvLyBJdCBjYW5ub3QgcG9zc2libHkgYmUgVENvbXBhY3RQcm90b2NvbCBzaW5jZSBhIHZhbHVlIG9mIDAgd291bGQgaW1wbHkgYSBmaWVsZCBpZAorICAgIC8vIG9mIDAgYXMgdGhlIHppZyB6YWcgdmFyaW50IGVuY29kaW5nIHdvdWxkIGVuZC4KKyAgICAvLworCisgICAgaWYgKGRhdGEubGVuZ3RoID4gMSAmJiAwID09IGRhdGFbMV0pIHsKKyAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIGJpdCA3IG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaWVsZCBpZCBpcyBzZXQgdGhlbiB3ZSBoYXZlIHR3byBjaG9pY2VzOgorICAgIC8vIDEuIEEgZmllbGQgaWQgPiA2MyB3YXMgZW5jb2RlZCB3aXRoIFRDb21wYWN0UHJvdG9jb2wuCisgICAgLy8gMi4gQSBmaWVsZCBpZCA+IDB4N2ZmZiAoMzI3NjcpIHdhcyBlbmNvZGVkIHdpdGggVEJpbmFyeVByb3RvY29sIGFuZCB0aGUgbGFzdCBieXRlIG9mIHRoZQorICAgIC8vICAgIHNlcmlhbGl6ZWQgZGF0YSBpcyAwLgorICAgIC8vIE9wdGlvbiAyIGlzIGltcG9zc2libGUgc2luY2UgZmllbGQgaWRzIGFyZSBzaG9ydCBhbmQgdGh1cyBsaW1pdGVkIHRvIDMyNzY3LgorICAgIC8vCisKKyAgICBpZiAoZGF0YS5sZW5ndGggPiAxICYmIChkYXRhWzFdICYgMHg4MCkgIT0gMCkgeworICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRoZSByZW1haW5pbmcgY2FzZSBpcyBlaXRoZXIgYSBmaWVsZCBpZCA8PSA2MyBlbmNvZGVkIGFzIFRDb21wYWN0UHJvdG9jb2wsCisgICAgLy8gb25lID49IDI1NiBlbmNvZGVkIHdpdGggVEJpbmFyeVByb3RvY29sIHdpdGggYSBsYXN0IGJ5dGUgYXQgMCwgb3IgYW4gZW1wdHkgc3RydWN0dXJlLgorICAgIC8vIEFzIHdlIGNhbm5vdCByZWFsbHkgZGVjaWRlLCB3ZSByZXR1cm4gdGhlIGZhbGxiYWNrIHByb3RvY29sLgorICAgIC8vCisgICAgcmV0dXJuIGZhbGxiYWNrOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YQppbmRleCBhNjBiZGY0Li5lYjdlMjNiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEKQEAgLTE5LDcgKzE5LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwpAQCAtNDQsMTMgKzQ1LDEzIEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQ09NTUEgPSBuZXcgYnl0ZVtdIHsnLCd9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT0xPTiA9IG5ldyBieXRlW10geyc6J307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIExCUkFDRSA9IG5ldyBieXRlW10geyd7J307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFJCUkFDRSA9IG5ldyBieXRlW10geyd9J307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIExCUkFDS0VUID0gbmV3IGJ5dGVbXSB7J1snfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnXSd9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUVVPVEUgPSAnIic7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT01NQSA9IG5ldyBieXRlW10geycsJ307CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT0xPTiA9IG5ldyBieXRlW10geyc6J307CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBMQlJBQ0UgPSBuZXcgYnl0ZVtdIHsneyd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNFID0gbmV3IGJ5dGVbXSB7J30nfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExCUkFDS0VUID0gbmV3IGJ5dGVbXSB7J1snfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFJCUkFDS0VUID0gbmV3IGJ5dGVbXSB7J10nfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBRVU9URSA9ICciJzsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IEFOT05ZTU9VU19TVFJVQ1QgPSBuZXcgVFN0cnVjdCgpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBURmllbGQgQU5PTllNT1VTX0ZJRUxEID0gbmV3IFRGaWVsZCgpOwpAQCAtNTgsOSArNTksMTcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVFNldCBFTVBUWV9TRVQgPSBuZXcgVFNldCgpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUTGlzdCBFTVBUWV9MSVNUID0gbmV3IFRMaXN0KCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRNYXAgRU1QVFlfTUFQID0gbmV3IFRNYXAoKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1QgPSAibGlzdCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVQgPSAic2V0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUCA9ICJtYXAiOwogCiAgIHByb3RlY3RlZCBjbGFzcyBDb250ZXh0IHsKICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYSBrZXkgaW4gYSBtYXAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcEtleSgpIHsgcmV0dXJuICBmYWxzZTsgfQogICB9CiAKICAgcHJvdGVjdGVkIGNsYXNzIExpc3RDb250ZXh0IGV4dGVuZHMgQ29udGV4dCB7CkBAIC05MCw2ICs5OSwyMiBAQAogICAgIH0KICAgfQogCisgIHByb3RlY3RlZCBjbGFzcyBNYXBDb250ZXh0IGV4dGVuZHMgU3RydWN0Q29udGV4dCB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNLZXkgPSB0cnVlOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBzdXBlci53cml0ZSgpOworICAgICAgaXNLZXkgPSAhaXNLZXk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXBLZXkoKSB7CisgICAgICAvLyB3ZSB3YW50IHRvIGNvZXJjZSBtYXAga2V5cyB0byBqc29uIHN0cmluZ3MgcmVnYXJkbGVzcworICAgICAgLy8gb2YgdGhlaXIgdHlwZQorICAgICAgcmV0dXJuIGlzS2V5OworICAgIH0KKyAgfQorCiAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IEJBU0VfQ09OVEVYVCA9IG5ldyBDb250ZXh0KCk7CiAKICAgLyoqCkBAIC0xMTgsMTMgKzE0MywzMyBAQAogICB9CiAKICAgLyoqCisgICAqIFJlc2V0IHRoZSB3cml0ZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlLgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgcmVzZXRXcml0ZUNvbnRleHQoKSB7CisgICAgd2hpbGUgKCF3cml0ZUNvbnRleHRTdGFja18uaXNFbXB0eSgpKSB7CisgICAgICBwb3BXcml0ZUNvbnRleHQoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVXNlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGVuY291bnRlcmluZyBhIG1hcCB3aG9zZSBrZXlzIGFyZSBjb250YWluZXJzCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoU3RyaW5nIGludmFsaWRLZXlUeXBlKSB0aHJvd3MgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiB7CisgICAgaWYgKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgdGhyb3cgbmV3IENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24oIkNhbm5vdCBzZXJpYWxpemUgYSBtYXAgd2l0aCBrZXlzIHRoYXQgYXJlIG9mIHR5cGUgIiArIGludmFsaWRLZXlUeXBlKTsKKyAgICB9CisgIH0KKworICAvKioKICAgICogQ29uc3RydWN0b3IKICAgICovCiAgIHB1YmxpYyBUU2ltcGxlSlNPTlByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKICAgICBzdXBlcih0cmFucyk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlc2V0V3JpdGVDb250ZXh0KCk7IC8vIFRIUklGVC0zNzQzCiAgICAgdHJhbnNfLndyaXRlKExCUkFDS0VUKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgpKTsKICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOwpAQCAtMTMyLDEwMyArMTc3LDEzMyBAQAogICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNLRVQpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgdHJhbnNfLndyaXRlKExCUkFDRSk7CiAgICAgcHVzaFdyaXRlQ29udGV4dChuZXcgU3RydWN0Q29udGV4dCgpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNFKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gTm90ZSB0aGF0IGV4dHJhIHR5cGUgaW5mb3JtYXRpb24gaXMgb21pdHRlZCBpbiBKU09OIQogICAgIHdyaXRlU3RyaW5nKGZpZWxkLm5hbWUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoTUFQKTsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgdHJhbnNfLndyaXRlKExCUkFDRSk7Ci0gICAgcHVzaFdyaXRlQ29udGV4dChuZXcgU3RydWN0Q29udGV4dCgpKTsKKyAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBNYXBDb250ZXh0KCkpOwogICAgIC8vIE5vIG1ldGFkYXRhIQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0UpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoTElTVCk7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwogICAgIHRyYW5zXy53cml0ZShMQlJBQ0tFVCk7CiAgICAgcHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoKSk7CiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShTRVQpOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoTEJSQUNLRVQpOwogICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCkpOwogICAgIC8vIE5vIG1ldGFkYXRhIQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShiID8gKGJ5dGUpMSA6IChieXRlKTApOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUkzMihiKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUkzMihpMTYpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7Ci0gICAgX3dyaXRlU3RyaW5nRGF0YShJbnRlZ2VyLnRvU3RyaW5nKGkzMikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgX3dyaXRlU3RyaW5nRGF0YShTdHJpbmcgcykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHMuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB0cmFuc18ud3JpdGUoYik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgd3JpdGVTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpMzIpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOworICAgICAgX3dyaXRlU3RyaW5nRGF0YShJbnRlZ2VyLnRvU3RyaW5nKGkzMikpOwogICAgIH0KICAgfQogCisgIHB1YmxpYyB2b2lkIF93cml0ZVN0cmluZ0RhdGEoU3RyaW5nIHMpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBieXRlW10gYiA9IHMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgdHJhbnNfLndyaXRlKGIpOworICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwotICAgIF93cml0ZVN0cmluZ0RhdGEoTG9uZy50b1N0cmluZyhpNjQpKTsKKyAgICBpZih3cml0ZUNvbnRleHRfLmlzTWFwS2V5KCkpIHsKKyAgICAgIHdyaXRlU3RyaW5nKExvbmcudG9TdHJpbmcoaTY0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKKyAgICAgIF93cml0ZVN0cmluZ0RhdGEoTG9uZy50b1N0cmluZyhpNjQpKTsKKyAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKLSAgICBfd3JpdGVTdHJpbmdEYXRhKERvdWJsZS50b1N0cmluZyhkdWIpKTsKKyAgICBpZih3cml0ZUNvbnRleHRfLmlzTWFwS2V5KCkpIHsKKyAgICAgIHdyaXRlU3RyaW5nKERvdWJsZS50b1N0cmluZyhkdWIpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOworICAgICAgX3dyaXRlU3RyaW5nRGF0YShEb3VibGUudG9TdHJpbmcoZHViKSk7CisgICAgfQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKQEAgLTI2Myw3ICszMzgsNyBAQAogICAgICAgICBlc2NhcGUuYXBwZW5kKCd0Jyk7CiAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKLSAgICAgICAgLy8gQ29udHJvbCBjaGFyYWNldGVycyEgQWNjb3JkaW5nIHRvIEpTT04gUkZDIHUwMDIwIChzcGFjZSkKKyAgICAgICAgLy8gQ29udHJvbCBjaGFyYWN0ZXJzISBBY2NvcmRpbmcgdG8gSlNPTiBSRkMgdTAwMjAgKHNwYWNlKQogICAgICAgICBpZiAoYyA8ICcgJykgewogICAgICAgICAgIFN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpOwogICAgICAgICAgIGVzY2FwZS5hcHBlbmQoJ1xcJyk7CkBAIC0yODIsOTAgKzM1NywxMDggQEAKICAgICBfd3JpdGVTdHJpbmdEYXRhKGVzY2FwZS50b1N0cmluZygpKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBGaXggdGhpcwotICAgICAgd3JpdGVTdHJpbmcobmV3IFN0cmluZyhiaW4sICJVVEYtOCIpKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoQnl0ZUJ1ZmZlciBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAvLyBUT0RPKG1jc2xlZSk6IEZpeCB0aGlzCisgICAgd3JpdGVTdHJpbmcobmV3IFN0cmluZyhiaW4uYXJyYXkoKSwgYmluLnBvc2l0aW9uKCkgKyBiaW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKSAtIGJpbi5hcnJheU9mZnNldCgpLAorICAgICAgICBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CiAgIH0KIAogICAvKioKICAgICogUmVhZGluZyBtZXRob2RzLgogICAgKi8KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTUVTU0FHRTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gQU5PTllNT1VTX0ZJRUxEOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBFTVBUWV9NQVA7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBFTVBUWV9MSVNUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfU0VUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IDEpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHNob3J0IHJlYWRJMTYoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gMDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gMDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuICIiOwpAQCAtMzc2LDkgKzQ2OSwxNSBAQAogICAgIHJldHVybiAiIjsKICAgfQogCi0gIHB1YmxpYyBieXRlW10gcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKLSAgICByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVswXSk7CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR1cGxlUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UVHVwbGVQcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZjUyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR1cGxlUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCitwdWJsaWMgZmluYWwgY2xhc3MgVFR1cGxlUHJvdG9jb2wgZXh0ZW5kcyBUQ29tcGFjdFByb3RvY29sIHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgICAgcHVibGljIEZhY3RvcnkoKSB7fQorCisgICAgcHVibGljIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICByZXR1cm4gbmV3IFRUdXBsZVByb3RvY29sKHRyYW5zKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgVFR1cGxlUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICBzdXBlcih0cmFuc3BvcnQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4gZ2V0U2NoZW1lKCkgeworICAgIHJldHVybiBUdXBsZVNjaGVtZS5jbGFzczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQml0U2V0KEJpdFNldCBicywgaW50IHZlY3RvcldpZHRoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGJ5dGVzID0gdG9CeXRlQXJyYXkoYnMsIHZlY3RvcldpZHRoKTsKKyAgICBmb3IgKGJ5dGUgYiA6IGJ5dGVzKSB7CisgICAgICB3cml0ZUJ5dGUoYik7CisgICAgfQorICB9CisKKyAgcHVibGljIEJpdFNldCByZWFkQml0U2V0KGludCBpKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaW50IGxlbmd0aCA9IChpbnQpIE1hdGguY2VpbChpLzguMCk7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisgICAgICBieXRlc1tqXSA9IHJlYWRCeXRlKCk7CisgICAgfQorICAgIEJpdFNldCBicyA9IGZyb21CeXRlQXJyYXkoYnl0ZXMpOworICAgIHJldHVybiBiczsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgYml0c2V0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBpbiBieXRlcy4gVGhlIGJ5dGUtb3JkZXJpbmcgbXVzdCBiZQorICAgKiBiaWctZW5kaWFuLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCaXRTZXQgZnJvbUJ5dGVBcnJheShieXRlW10gYnl0ZXMpIHsKKyAgICBCaXRTZXQgYml0cyA9IG5ldyBCaXRTZXQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aCAqIDg7IGkrKykgeworICAgICAgaWYgKChieXRlc1tieXRlcy5sZW5ndGggLSBpIC8gOCAtIDFdICYgKDEgPDwgKGkgJSA4KSkpID4gMCkgeworICAgICAgICBiaXRzLnNldChpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJpdHM7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIGJ5dGUgYXJyYXkgb2YgYXQgbGVhc3QgbGVuZ3RoIDEuIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpbiB0aGUKKyAgICogcmVzdWx0IGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGEgMSAoc2luY2UgQml0U2V0IGRvZXMgbm90IHN1cHBvcnQgc2lnbgorICAgKiBleHRlbnNpb24pLiBUaGUgYnl0ZS1vcmRlcmluZyBvZiB0aGUgcmVzdWx0IGlzIGJpZy1lbmRpYW4gd2hpY2ggbWVhbnMgdGhlCisgICAqIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIGluIGVsZW1lbnQgMC4gVGhlIGJpdCBhdCBpbmRleCAwIG9mIHRoZSBiaXQgc2V0IGlzCisgICAqIGFzc3VtZWQgdG8gYmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KKyAgICogCisgICAqIEBwYXJhbSBiaXRzCisgICAqIEBwYXJhbSB2ZWN0b3JXaWR0aCAKKyAgICogQHJldHVybiBhIGJ5dGUgYXJyYXkgb2YgYXQgbGVhc3QgbGVuZ3RoIDEKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQnl0ZUFycmF5KEJpdFNldCBiaXRzLCBpbnQgdmVjdG9yV2lkdGgpIHsKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsoaW50KSBNYXRoLmNlaWwodmVjdG9yV2lkdGgvOC4wKV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIGlmIChiaXRzLmdldChpKSkgeworICAgICAgICBieXRlc1tieXRlcy5sZW5ndGggLSBpIC8gOCAtIDFdIHw9IDEgPDwgKGkgJSA4KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvSVNjaGVtZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NjaGVtZS9JU2NoZW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzNTUwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvSVNjaGVtZS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVNjaGVtZTxUIGV4dGVuZHMgVEJhc2U+IHsKKworICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdG8sIFQgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3RvLCBUIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU2NoZW1lRmFjdG9yeS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NjaGVtZS9TY2hlbWVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2YTY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU2NoZW1lRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lOworCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtZUZhY3RvcnkgeworCisgIHB1YmxpYyA8UyBleHRlbmRzIElTY2hlbWU+IFMgZ2V0U2NoZW1lKCk7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU3RhbmRhcmRTY2hlbWUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvU3RhbmRhcmRTY2hlbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmFiMDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NjaGVtZS9TdGFuZGFyZFNjaGVtZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGFuZGFyZFNjaGVtZTxUIGV4dGVuZHMgVEJhc2U+IGltcGxlbWVudHMgSVNjaGVtZTxUPiB7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvVHVwbGVTY2hlbWUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zY2hlbWUvVHVwbGVTY2hlbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjUyNDJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NjaGVtZS9UdXBsZVNjaGVtZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUdXBsZVNjaGVtZTxUIGV4dGVuZHMgVEJhc2U+IGltcGxlbWVudHMgSVNjaGVtZTxUPiB7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMDZlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsNjE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEFzeW5jUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCisvKioKKyAqIFByb3ZpZGVzIGNvbW1vbiBtZXRob2RzIGFuZCBjbGFzc2VzIHVzZWQgYnkgbm9uYmxvY2tpbmcgVFNlcnZlcgorICogaW1wbGVtZW50YXRpb25zLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlciBleHRlbmRzIFRTZXJ2ZXIgeworICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzPFQgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxUPj4gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFyZ3M8VD4geworICAgIHB1YmxpYyBsb25nIG1heFJlYWRCdWZmZXJCeXRlcyA9IDI1NiAqIDEwMjQgKiAxMDI0OworCisgICAgcHVibGljIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgICB0cmFuc3BvcnRGYWN0b3J5KG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgd2Ugd2lsbCBhbGxvY2F0ZSB0byBjbGllbnQgSU8gYnVmZmVycyBhdCBhCisgICAqIHRpbWUuIFdpdGhvdXQgdGhpcyBsaW1pdCwgdGhlIHNlcnZlciB3aWxsIGdsYWRseSBhbGxvY2F0ZSBjbGllbnQgYnVmZmVycworICAgKiByaWdodCBpbnRvIGFuIG91dCBvZiBtZW1vcnkgZXhjZXB0aW9uLCByYXRoZXIgdGhhbiB3YWl0aW5nLgorICAgKi8KKyAgZmluYWwgbG9uZyBNQVhfUkVBRF9CVUZGRVJfQllURVM7CisKKyAgLyoqCisgICAqIEhvdyBtYW55IGJ5dGVzIGFyZSBjdXJyZW50bHkgYWxsb2NhdGVkIHRvIHJlYWQgYnVmZmVycy4KKyAgICovCisgIGZpbmFsIEF0b21pY0xvbmcgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkID0gbmV3IEF0b21pY0xvbmcoMCk7CisKKyAgcHVibGljIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIoQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3MgYXJncykgeworICAgIHN1cGVyKGFyZ3MpOworICAgIE1BWF9SRUFEX0JVRkZFUl9CWVRFUyA9IGFyZ3MubWF4UmVhZEJ1ZmZlckJ5dGVzOworICB9CisKKyAgLyoqCisgICAqIEJlZ2luIGFjY2VwdGluZyBjb25uZWN0aW9ucyBhbmQgcHJvY2Vzc2luZyBpbnZvY2F0aW9ucy4KKyAgICovCisgIHB1YmxpYyB2b2lkIHNlcnZlKCkgeworICAgIC8vIHN0YXJ0IGFueSBJTyB0aHJlYWRzCisgICAgaWYgKCFzdGFydFRocmVhZHMoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHN0YXJ0IGxpc3RlbmluZywgb3IgZXhpdAorICAgIGlmICghc3RhcnRMaXN0ZW5pbmcoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNldFNlcnZpbmcodHJ1ZSk7CisKKyAgICAvLyB0aGlzIHdpbGwgYmxvY2sgd2hpbGUgd2Ugc2VydmUKKyAgICB3YWl0Rm9yU2h1dGRvd24oKTsKKworICAgIHNldFNlcnZpbmcoZmFsc2UpOworCisgICAgLy8gZG8gYSBsaXR0bGUgY2xlYW51cAorICAgIHN0b3BMaXN0ZW5pbmcoKTsKKyAgfQorCisgIC8qKgorICAgKiBTdGFydHMgYW55IHRocmVhZHMgcmVxdWlyZWQgZm9yIHNlcnZpbmcuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBldmVyeXRoaW5nIHdlbnQgb2ssIGZhbHNlIGlmIHRocmVhZHMgY291bGQgbm90IGJlIHN0YXJ0ZWQuCisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzdGFydFRocmVhZHMoKTsKKworICAvKioKKyAgICogQSBtZXRob2QgdGhhdCB3aWxsIGJsb2NrIHVudGlsIHdoZW4gdGhyZWFkcyBoYW5kbGluZyB0aGUgc2VydmluZyBoYXZlIGJlZW4KKyAgICogc2h1dCBkb3duLgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd2FpdEZvclNodXRkb3duKCk7CisKKyAgLyoqCisgICAqIEhhdmUgdGhlIHNlcnZlciB0cmFuc3BvcnQgc3RhcnQgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgd2Ugc3RhcnRlZCBsaXN0ZW5pbmcgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZiBzb21ldGhpbmcgd2VudAorICAgKiAgICAgICAgIHdyb25nLgorICAgKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRMaXN0ZW5pbmcoKSB7CisgICAgdHJ5IHsKKyAgICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgeworICAgICAgTE9HR0VSLmVycm9yKCJGYWlsZWQgdG8gc3RhcnQgbGlzdGVuaW5nIG9uIHNlcnZlciBzb2NrZXQhIiwgdHR4KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU3RvcCBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zLgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKKyAgICBzZXJ2ZXJUcmFuc3BvcnRfLmNsb3NlKCk7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybSBhbiBpbnZvY2F0aW9uLiBUaGlzIG1ldGhvZCBjb3VsZCBiZWhhdmUgc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyAtCisgICAqIGludm9rZSBpbW1lZGlhdGVseSBpbmxpbmUsIHF1ZXVlIGZvciBzZXBhcmF0ZSBleGVjdXRpb24sIGV0Yy4KKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIGludm9jYXRpb24gd2FzIHN1Y2Nlc3NmdWxseSByZXF1ZXN0ZWQsIHdoaWNoIGlzIG5vdCBhCisgICAqICAgICAgICAgZ3VhcmFudGVlIHRoYXQgaW52b2NhdGlvbiBoYXMgY29tcGxldGVkLiBGYWxzZSBpZiB0aGUgcmVxdWVzdAorICAgKiAgICAgICAgIGZhaWxlZC4KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlcXVlc3RJbnZva2UoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpOworCisgIC8qKgorICAgKiBBbiBhYnN0cmFjdCB0aHJlYWQgdGhhdCBoYW5kbGVzIHNlbGVjdGluZyBvbiBhIHNldCBvZiB0cmFuc3BvcnRzIGFuZAorICAgKiB7QGxpbmsgRnJhbWVCdWZmZXIgRnJhbWVCdWZmZXJzfSBhc3NvY2lhdGVkIHdpdGggc2VsZWN0ZWQga2V5cworICAgKiBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RzLgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VsZWN0VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICBwcm90ZWN0ZWQgU2VsZWN0b3Igc2VsZWN0b3I7CisKKyAgICAvLyBMaXN0IG9mIEZyYW1lQnVmZmVycyB0aGF0IHdhbnQgdG8gY2hhbmdlIHRoZWlyIHNlbGVjdGlvbiBpbnRlcmVzdHMuCisgICAgcHJvdGVjdGVkIGZpbmFsIFNldDxGcmFtZUJ1ZmZlcj4gc2VsZWN0SW50ZXJlc3RDaGFuZ2VzID0gbmV3IEhhc2hTZXQ8RnJhbWVCdWZmZXI+KCk7CisKKyAgICBwdWJsaWMgQWJzdHJhY3RTZWxlY3RUaHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgdGhpcy5zZWxlY3RvciA9IFNlbGVjdG9yUHJvdmlkZXIucHJvdmlkZXIoKS5vcGVuU2VsZWN0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgc2VsZWN0b3IgaXMgYmxvY2tlZCwgd2FrZSBpdCB1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3YWtldXBTZWxlY3RvcigpIHsKKyAgICAgIHNlbGVjdG9yLndha2V1cCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBGcmFtZUJ1ZmZlciB0byB0aGUgbGlzdCBvZiBzZWxlY3QgaW50ZXJlc3QgY2hhbmdlcyBhbmQgd2FrZSB1cCB0aGUKKyAgICAgKiBzZWxlY3RvciBpZiBpdCdzIGJsb2NrZWQuIFdoZW4gdGhlIHNlbGVjdCgpIGNhbGwgZXhpdHMsIGl0J2xsIGdpdmUgdGhlCisgICAgICogRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gY2hhbmdlIGl0cyBpbnRlcmVzdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CisgICAgICBzeW5jaHJvbml6ZWQgKHNlbGVjdEludGVyZXN0Q2hhbmdlcykgeworICAgICAgICBzZWxlY3RJbnRlcmVzdENoYW5nZXMuYWRkKGZyYW1lQnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIC8vIHdha2V1cCB0aGUgc2VsZWN0b3IsIGlmIGl0J3MgY3VycmVudGx5IGJsb2NrZWQuCisgICAgICBzZWxlY3Rvci53YWtldXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBGcmFtZUJ1ZmZlcnMgdGhhdCBoYXZlIHN3aXRjaGVkIHRoZWlyCisgICAgICogaW50ZXJlc3QgdHlwZSBmcm9tIHJlYWQgdG8gd3JpdGUgb3IgdmljZSB2ZXJzYS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW50ZXJlc3RDaGFuZ2VzKCkgeworICAgICAgc3luY2hyb25pemVkIChzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKKyAgICAgICAgZm9yIChGcmFtZUJ1ZmZlciBmYiA6IHNlbGVjdEludGVyZXN0Q2hhbmdlcykgeworICAgICAgICAgIGZiLmNoYW5nZVNlbGVjdEludGVyZXN0cygpOworICAgICAgICB9CisgICAgICAgIHNlbGVjdEludGVyZXN0Q2hhbmdlcy5jbGVhcigpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHRoZSB3b3JrIHJlcXVpcmVkIHRvIHJlYWQgZnJvbSBhIHJlYWRhYmxlIGNsaWVudC4gSWYgdGhlIGZyYW1lIGlzCisgICAgICogZnVsbHkgcmVhZCwgdGhlbiBpbnZva2UgdGhlIG1ldGhvZCBjYWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlYWQoU2VsZWN0aW9uS2V5IGtleSkgeworICAgICAgRnJhbWVCdWZmZXIgYnVmZmVyID0gKEZyYW1lQnVmZmVyKSBrZXkuYXR0YWNobWVudCgpOworICAgICAgaWYgKCFidWZmZXIucmVhZCgpKSB7CisgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoa2V5KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBpZiB0aGUgYnVmZmVyJ3MgZnJhbWUgcmVhZCBpcyBjb21wbGV0ZSwgaW52b2tlIHRoZSBtZXRob2QuCisgICAgICBpZiAoYnVmZmVyLmlzRnJhbWVGdWxseVJlYWQoKSkgeworICAgICAgICBpZiAoIXJlcXVlc3RJbnZva2UoYnVmZmVyKSkgeworICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoa2V5KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExldCBhIHdyaXRhYmxlIGNsaWVudCBnZXQgd3JpdHRlbiwgaWYgdGhlcmUncyBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlV3JpdGUoU2VsZWN0aW9uS2V5IGtleSkgeworICAgICAgRnJhbWVCdWZmZXIgYnVmZmVyID0gKEZyYW1lQnVmZmVyKSBrZXkuYXR0YWNobWVudCgpOworICAgICAgaWYgKCFidWZmZXIud3JpdGUoKSkgeworICAgICAgICBjbGVhbnVwU2VsZWN0aW9uS2V5KGtleSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8gY29ubmVjdGlvbi1jbG9zZSBjbGVhbnVwIG9uIGEgZ2l2ZW4gU2VsZWN0aW9uS2V5LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFudXBTZWxlY3Rpb25LZXkoU2VsZWN0aW9uS2V5IGtleSkgeworICAgICAgLy8gcmVtb3ZlIHRoZSByZWNvcmRzIGZyb20gdGhlIHR3byBtYXBzCisgICAgICBGcmFtZUJ1ZmZlciBidWZmZXIgPSAoRnJhbWVCdWZmZXIpIGtleS5hdHRhY2htZW50KCk7CisgICAgICBpZiAoYnVmZmVyICE9IG51bGwpIHsKKyAgICAgICAgLy8gY2xvc2UgdGhlIGJ1ZmZlcgorICAgICAgICBidWZmZXIuY2xvc2UoKTsKKyAgICAgIH0KKyAgICAgIC8vIGNhbmNlbCB0aGUgc2VsZWN0aW9uIGtleQorICAgICAga2V5LmNhbmNlbCgpOworICAgIH0KKyAgfSAvLyBTZWxlY3RUaHJlYWQKKworICAvKioKKyAgICogUG9zc2libGUgc3RhdGVzIGZvciB0aGUgRnJhbWVCdWZmZXIgc3RhdGUgbWFjaGluZS4KKyAgICovCisgIHByaXZhdGUgZW51bSBGcmFtZUJ1ZmZlclN0YXRlIHsKKyAgICAvLyBpbiB0aGUgbWlkc3Qgb2YgcmVhZGluZyB0aGUgZnJhbWUgc2l6ZSBvZmYgdGhlIHdpcmUKKyAgICBSRUFESU5HX0ZSQU1FX1NJWkUsCisgICAgLy8gcmVhZGluZyB0aGUgYWN0dWFsIGZyYW1lIGRhdGEgbm93LCBidXQgbm90IGFsbCB0aGUgd2F5IGRvbmUgeWV0CisgICAgUkVBRElOR19GUkFNRSwKKyAgICAvLyBjb21wbGV0ZWx5IHJlYWQgdGhlIGZyYW1lLCBzbyBhbiBpbnZvY2F0aW9uIGNhbiBub3cgaGFwcGVuCisgICAgUkVBRF9GUkFNRV9DT01QTEVURSwKKyAgICAvLyB3YWl0aW5nIHRvIGdldCBzd2l0Y2hlZCB0byBsaXN0ZW5pbmcgZm9yIHdyaXRlIGV2ZW50cworICAgIEFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFLAorICAgIC8vIHN0YXJ0ZWQgd3JpdGluZyByZXNwb25zZSBkYXRhLCBub3QgZnVsbHkgY29tcGxldGUgeWV0CisgICAgV1JJVElORywKKyAgICAvLyBhbm90aGVyIHRocmVhZCB3YW50cyB0aGlzIGZyYW1lYnVmZmVyIHRvIGdvIGJhY2sgdG8gcmVhZGluZworICAgIEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQsCisgICAgLy8gd2Ugd2FudCBvdXIgdHJhbnNwb3J0IGFuZCBzZWxlY3Rpb24ga2V5IGludmFsaWRhdGVkIGluIHRoZSBzZWxlY3RvcgorICAgIC8vIHRocmVhZAorICAgIEFXQUlUSU5HX0NMT1NFCisgIH0KKworICAvKioKKyAgICogQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgc29ydCBvZiBzdGF0ZSBtYWNoaW5lIGFyb3VuZCB0aGUgaW50ZXJhY3Rpb24gd2l0aCBhCisgICAqIGNsaWVudCBhbmQgYW4gaW52b2tlci4gSXQgbWFuYWdlcyByZWFkaW5nIHRoZSBmcmFtZSBzaXplIGFuZCBmcmFtZSBkYXRhLAorICAgKiBnZXR0aW5nIGl0IGhhbmRlZCBvZmYgYXMgd3JhcHBlZCB0cmFuc3BvcnRzLCBhbmQgdGhlbiB0aGUgd3JpdGluZyBvZgorICAgKiByZXNwb25zZSBkYXRhIGJhY2sgdG8gdGhlIGNsaWVudC4gSW4gdGhlIHByb2Nlc3MgaXQgbWFuYWdlcyBmbGlwcGluZyB0aGUKKyAgICogcmVhZCBhbmQgd3JpdGUgYml0cyBvbiB0aGUgc2VsZWN0aW9uIGtleSBmb3IgaXRzIGNsaWVudC4KKyAgICovCisgICBwdWJsaWMgY2xhc3MgRnJhbWVCdWZmZXIgeworICAgIHByaXZhdGUgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKworICAgIC8vIHRoZSBhY3R1YWwgdHJhbnNwb3J0IGhvb2tlZCB1cCB0byB0aGUgY2xpZW50LgorICAgIHByb3RlY3RlZCBmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNfOworCisgICAgLy8gdGhlIFNlbGVjdGlvbktleSB0aGF0IGNvcnJlc3BvbmRzIHRvIG91ciB0cmFuc3BvcnQKKyAgICBwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleV87CisKKyAgICAvLyB0aGUgU2VsZWN0VGhyZWFkIHRoYXQgb3ducyB0aGUgcmVnaXN0cmF0aW9uIG9mIG91ciB0cmFuc3BvcnQKKyAgICBwcm90ZWN0ZWQgZmluYWwgQWJzdHJhY3RTZWxlY3RUaHJlYWQgc2VsZWN0VGhyZWFkXzsKKworICAgIC8vIHdoZXJlIGluIHRoZSBwcm9jZXNzIG9mIHJlYWRpbmcvd3JpdGluZyBhcmUgd2U/CisgICAgcHJvdGVjdGVkIEZyYW1lQnVmZmVyU3RhdGUgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FX1NJWkU7CisKKyAgICAvLyB0aGUgQnl0ZUJ1ZmZlciB3ZSdsbCBiZSB1c2luZyB0byB3cml0ZSBhbmQgcmVhZCwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZQorICAgIHByb3RlY3RlZCBCeXRlQnVmZmVyIGJ1ZmZlcl87CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXNwb25zZV87CisKKyAgICAvLyB0aGUgZnJhbWUgdGhhdCB0aGUgVFRyYW5zcG9ydCBzaG91bGQgd3JhcC4KKyAgICBwcm90ZWN0ZWQgZmluYWwgVE1lbW9yeUlucHV0VHJhbnNwb3J0IGZyYW1lVHJhbnNfOworCisgICAgLy8gdGhlIHRyYW5zcG9ydCB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGNvbm5lY3QgdG8gY2xpZW50cworICAgIHByb3RlY3RlZCBmaW5hbCBUVHJhbnNwb3J0IGluVHJhbnNfOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFRUcmFuc3BvcnQgb3V0VHJhbnNfOworCisgICAgLy8gdGhlIGlucHV0IHByb3RvY29sIHRvIHVzZSBvbiBmcmFtZXMKKyAgICBwcm90ZWN0ZWQgZmluYWwgVFByb3RvY29sIGluUHJvdF87CisKKyAgICAvLyB0aGUgb3V0cHV0IHByb3RvY29sIHRvIHVzZSBvbiBmcmFtZXMKKyAgICBwcm90ZWN0ZWQgZmluYWwgVFByb3RvY29sIG91dFByb3RfOworCisgICAgLy8gY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uCisgICAgcHJvdGVjdGVkIGZpbmFsIFNlcnZlckNvbnRleHQgY29udGV4dF87CisKKyAgICBwdWJsaWMgRnJhbWVCdWZmZXIoZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLAorICAgICAgICBmaW5hbCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5LAorICAgICAgICBmaW5hbCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQpIHsKKyAgICAgIHRyYW5zXyA9IHRyYW5zOworICAgICAgc2VsZWN0aW9uS2V5XyA9IHNlbGVjdGlvbktleTsKKyAgICAgIHNlbGVjdFRocmVhZF8gPSBzZWxlY3RUaHJlYWQ7CisgICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKworICAgICAgZnJhbWVUcmFuc18gPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KCk7CisgICAgICByZXNwb25zZV8gPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgaW5UcmFuc18gPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChmcmFtZVRyYW5zXyk7CisgICAgICBvdXRUcmFuc18gPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChyZXNwb25zZV8pKTsKKyAgICAgIGluUHJvdF8gPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5UcmFuc18pOworICAgICAgb3V0UHJvdF8gPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dFRyYW5zXyk7CisKKyAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgY29udGV4dF8gPSBldmVudEhhbmRsZXJfLmNyZWF0ZUNvbnRleHQoaW5Qcm90Xywgb3V0UHJvdF8pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGV4dF8gID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlIHRoaXMgRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gcmVhZC4gVGhlIHNlbGVjdG9yIGxvb3Agc2hvdWxkIGhhdmUKKyAgICAgKiByZWNlaXZlZCBhIHJlYWQgZXZlbnQgZm9yIHRoaXMgRnJhbWVCdWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGxpdmUgb24sIGZhbHNlIGlmIGl0IHNob3VsZCBiZQorICAgICAqICAgICAgICAgY2xvc2VkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVhZCgpIHsKKyAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FX1NJWkUpIHsKKyAgICAgICAgLy8gdHJ5IHRvIHJlYWQgdGhlIGZyYW1lIHNpemUgY29tcGxldGVseQorICAgICAgICBpZiAoIWludGVybmFsUmVhZCgpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhlIGZyYW1lIHNpemUgaGFzIGJlZW4gcmVhZCBjb21wbGV0ZWx5LCB0aGVuIHByZXBhcmUgdG8gcmVhZCB0aGUKKyAgICAgICAgLy8gYWN0dWFsIGZyYW1lLgorICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICAgICAgLy8gcHVsbCBvdXQgdGhlIGZyYW1lIHNpemUgYXMgYW4gaW50ZWdlci4KKyAgICAgICAgICBpbnQgZnJhbWVTaXplID0gYnVmZmVyXy5nZXRJbnQoMCk7CisgICAgICAgICAgaWYgKGZyYW1lU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIlJlYWQgYW4gaW52YWxpZCBmcmFtZSBzaXplIG9mICIgKyBmcmFtZVNpemUKKyAgICAgICAgICAgICAgICArICIuIEFyZSB5b3UgdXNpbmcgVEZyYW1lZFRyYW5zcG9ydCBvbiB0aGUgY2xpZW50IHNpZGU/Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gaWYgdGhpcyBmcmFtZSB3aWxsIGFsd2F5cyBiZSB0b28gbGFyZ2UgZm9yIHRoaXMgc2VydmVyLCBsb2cgdGhlCisgICAgICAgICAgLy8gZXJyb3IgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgIGlmIChmcmFtZVNpemUgPiBNQVhfUkVBRF9CVUZGRVJfQllURVMpIHsKKyAgICAgICAgICAgIExPR0dFUi5lcnJvcigiUmVhZCBhIGZyYW1lIHNpemUgb2YgIiArIGZyYW1lU2l6ZQorICAgICAgICAgICAgICAgICsgIiwgd2hpY2ggaXMgYmlnZ2VyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dhYmxlIGJ1ZmZlciBzaXplIGZvciBBTEwgY29ubmVjdGlvbnMuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gaWYgdGhpcyBmcmFtZSB3aWxsIHB1c2ggdXMgb3ZlciB0aGUgbWVtb3J5IGxpbWl0LCB0aGVuIHJldHVybi4KKyAgICAgICAgICAvLyB3aXRoIGx1Y2ssIG1vcmUgbWVtb3J5IHdpbGwgZnJlZSB1cCB0aGUgbmV4dCB0aW1lIGFyb3VuZC4KKyAgICAgICAgICBpZiAocmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkLmdldCgpICsgZnJhbWVTaXplID4gTUFYX1JFQURfQlVGRkVSX0JZVEVTKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkIHRvIHJlYWQgYnVmZmVycworICAgICAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5hZGRBbmRHZXQoZnJhbWVTaXplICsgNCk7CisKKyAgICAgICAgICAvLyByZWFsbG9jYXRlIHRoZSByZWFkYnVmZmVyIGFzIGEgZnJhbWUtc2l6ZWQgYnVmZmVyCisgICAgICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoZnJhbWVTaXplICsgNCk7CisgICAgICAgICAgYnVmZmVyXy5wdXRJbnQoZnJhbWVTaXplKTsKKworICAgICAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyB0aGlzIHNraXBzIHRoZSBjaGVjayBvZiBSRUFESU5HX0ZSQU1FIHN0YXRlIGJlbG93LCBzaW5jZSB3ZSBjYW4ndAorICAgICAgICAgIC8vIHBvc3NpYmx5IGdvIG9uIHRvIHRoYXQgc3RhdGUgaWYgdGhlcmUncyBkYXRhIGxlZnQgdG8gYmUgcmVhZCBhdAorICAgICAgICAgIC8vIHRoaXMgb25lLgorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRvIGZhbGwgdGhyb3VnaCBmcm9tIHRoZSBSRUFESU5HX0ZSQU1FX1NJWkUgc2VjdGlvbgorICAgICAgLy8gdG8gUkVBRElOR19GUkFNRSBpZiB0aGVyZSdzIGFscmVhZHkgc29tZSBmcmFtZSBkYXRhIGF2YWlsYWJsZSBvbmNlCisgICAgICAvLyBSRUFESU5HX0ZSQU1FX1NJWkUgaXMgY29tcGxldGUuCisKKyAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FKSB7CisgICAgICAgIGlmICghaW50ZXJuYWxSZWFkKCkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBzaW5jZSB3ZSdyZSBhbHJlYWR5IGluIHRoZSBzZWxlY3QgbG9vcCBoZXJlIGZvciBzdXJlLCB3ZSBjYW4ganVzdAorICAgICAgICAvLyBtb2RpZnkgb3VyIHNlbGVjdGlvbiBrZXkgZGlyZWN0bHkuCisgICAgICAgIGlmIChidWZmZXJfLnJlbWFpbmluZygpID09IDApIHsKKyAgICAgICAgICAvLyBnZXQgcmlkIG9mIHRoZSByZWFkIHNlbGVjdCBpbnRlcmVzdHMKKyAgICAgICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKDApOworICAgICAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICAvLyBpZiB3ZSBmYWxsIHRocm91Z2ggdG8gdGhpcyBwb2ludCwgdGhlbiB0aGUgc3RhdGUgbXVzdCBiZSBpbnZhbGlkLgorICAgICAgTE9HR0VSLmVycm9yKCJSZWFkIHdhcyBjYWxsZWQgYnV0IHN0YXRlIGlzIGludmFsaWQgKCIgKyBzdGF0ZV8gKyAiKSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmUgdGhpcyBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byB3cml0ZSBpdHMgb3V0cHV0IHRvIHRoZSBmaW5hbCBjbGllbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gd3JpdGUoKSB7CisgICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuV1JJVElORykgeworICAgICAgICB0cnkgeworICAgICAgICAgIGlmICh0cmFuc18ud3JpdGUoYnVmZmVyXykgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiBkdXJpbmcgd3JpdGUhIiwgZSk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2UncmUgZG9uZSB3cml0aW5nLiBub3cgd2UgbmVlZCB0byBzd2l0Y2ggYmFjayB0byByZWFkaW5nLgorICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICAgICAgcHJlcGFyZVJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgTE9HR0VSLmVycm9yKCJXcml0ZSB3YXMgY2FsbGVkLCBidXQgc3RhdGUgaXMgaW52YWxpZCAoIiArIHN0YXRlXyArICIpIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHNldCBpdHMgaW50ZXJlc3QgdG8gd3JpdGUsIG9uY2UgZGF0YQorICAgICAqIGhhcyBjb21lIGluLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoYW5nZVNlbGVjdEludGVyZXN0cygpIHsKKyAgICAgIHN3aXRjaCAoc3RhdGVfKSB7CisgICAgICBjYXNlIEFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFOgorICAgICAgICAvLyBzZXQgdGhlIE9QX1dSSVRFIGludGVyZXN0CisgICAgICAgIHNlbGVjdGlvbktleV8uaW50ZXJlc3RPcHMoU2VsZWN0aW9uS2V5Lk9QX1dSSVRFKTsKKyAgICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5XUklUSU5HOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVdBSVRJTkdfUkVHSVNURVJfUkVBRDoKKyAgICAgICAgcHJlcGFyZVJlYWQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFXQUlUSU5HX0NMT1NFOgorICAgICAgICBjbG9zZSgpOworICAgICAgICBzZWxlY3Rpb25LZXlfLmNhbmNlbCgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0dFUi5lcnJvcigKKyAgICAgICAgICAgICJjaGFuZ2VTZWxlY3RJbnRlcmVzdCB3YXMgY2FsbGVkLCBidXQgc3RhdGUgaXMgaW52YWxpZCAoe30pIiwKKyAgICAgICAgICAgIHN0YXRlXyk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2h1dCB0aGUgY29ubmVjdGlvbiBkb3duLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgLy8gaWYgd2UncmUgYmVpbmcgY2xvc2VkIGR1ZSB0byBhbiBlcnJvciwgd2UgbWlnaHQgaGF2ZSBhbGxvY2F0ZWQgYQorICAgICAgLy8gYnVmZmVyIHRoYXQgd2UgbmVlZCB0byBzdWJ0cmFjdCBmb3Igb3VyIG1lbW9yeSBhY2NvdW50aW5nLgorICAgICAgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURJTkdfRlJBTUUgfHwKKyAgICAgICAgICBzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFEX0ZSQU1FX0NPTVBMRVRFIHx8CisgICAgICAgICAgc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfQ0xPU0UpIHsKKyAgICAgICAgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkLmFkZEFuZEdldCgtYnVmZmVyXy5hcnJheSgpLmxlbmd0aCk7CisgICAgICB9CisgICAgICB0cmFuc18uY2xvc2UoKTsKKyAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgZXZlbnRIYW5kbGVyXy5kZWxldGVDb250ZXh0KGNvbnRleHRfLCBpblByb3RfLCBvdXRQcm90Xyk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhpcyBGcmFtZUJ1ZmZlciBoYXMgYSBmdWxsIGZyYW1lIHJlYWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGcmFtZUZ1bGx5UmVhZCgpIHsKKyAgICAgIHJldHVybiBzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFEX0ZSQU1FX0NPTVBMRVRFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFmdGVyIHRoZSBwcm9jZXNzb3IgaGFzIHByb2Nlc3NlZCB0aGUgaW52b2NhdGlvbiwgd2hhdGV2ZXIgdGhyZWFkIGlzCisgICAgICogbWFuYWdpbmcgaW52b2NhdGlvbnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgb24gdGhpcyBGcmFtZUJ1ZmZlciBzbyB3ZQorICAgICAqIGtub3cgaXQncyB0aW1lIHRvIHN0YXJ0IHRyeWluZyB0byB3cml0ZSBhZ2Fpbi4gQWxzbywgaWYgaXQgdHVybnMgb3V0IHRoYXQKKyAgICAgKiB0aGVyZSBhY3R1YWxseSBpc24ndCBhbnkgZGF0YSBpbiB0aGUgcmVzcG9uc2UgYnVmZmVyLCB3ZSdsbCBza2lwIHRyeWluZworICAgICAqIHRvIHdyaXRlIGFuZCBpbnN0ZWFkIGdvIGJhY2sgdG8gcmVhZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNwb25zZVJlYWR5KCkgeworICAgICAgLy8gdGhlIHJlYWQgYnVmZmVyIGlzIGRlZmluaXRlbHkgbm8gbG9uZ2VyIGluIHVzZSwgc28gd2Ugd2lsbCBkZWNyZW1lbnQKKyAgICAgIC8vIG91ciByZWFkIGJ1ZmZlciBjb3VudC4gd2UgZG8gdGhpcyBoZXJlIGFzIHdlbGwgYXMgaW4gY2xvc2UgYmVjYXVzZQorICAgICAgLy8gd2UnZCBsaWtlIHRvIGZyZWUgdGhpcyByZWFkIG1lbW9yeSB1cCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIGZvciBvdGhlcgorICAgICAgLy8gY2xpZW50cy4KKyAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5hZGRBbmRHZXQoLWJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGgpOworCisgICAgICBpZiAocmVzcG9uc2VfLmxlbigpID09IDApIHsKKyAgICAgICAgLy8gZ28gc3RyYWlnaHQgdG8gcmVhZGluZyBhZ2Fpbi4gdGhpcyB3YXMgcHJvYmFibHkgYW4gb25ld2F5IG1ldGhvZAorICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX1JFR0lTVEVSX1JFQUQ7CisgICAgICAgIGJ1ZmZlcl8gPSBudWxsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIud3JhcChyZXNwb25zZV8uZ2V0KCksIDAsIHJlc3BvbnNlXy5sZW4oKSk7CisKKyAgICAgICAgLy8gc2V0IHN0YXRlIHRoYXQgd2UncmUgd2FpdGluZyB0byBiZSBzd2l0Y2hlZCB0byB3cml0ZS4gd2UgZG8gdGhpcworICAgICAgICAvLyBhc3luY2hyb25vdXNseSB0aHJvdWdoIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAgICAgLy8gYSBwb3NzaWJpbGl0eSB0aGF0IHdlJ3JlIG5vdCBpbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCB0aHVzIGN1cnJlbnRseQorICAgICAgICAvLyBibG9ja2VkIGluIHNlbGVjdCgpLiAodGhpcyBmdW5jdGlvbmFsaXR5IGlzIGluIHBsYWNlIGZvciB0aGUgc2FrZSBvZgorICAgICAgICAvLyB0aGUgSHNIYSBzZXJ2ZXIuKQorICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFOworICAgICAgfQorICAgICAgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWN0dWFsbHkgaW52b2tlIHRoZSBtZXRob2Qgc2lnbmlmaWVkIGJ5IHRoaXMgRnJhbWVCdWZmZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52b2tlKCkgeworICAgICAgZnJhbWVUcmFuc18ucmVzZXQoYnVmZmVyXy5hcnJheSgpKTsKKyAgICAgIHJlc3BvbnNlXy5yZXNldCgpOworCisgICAgICB0cnkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcm9jZXNzQ29udGV4dChjb250ZXh0XywgaW5UcmFuc18sIG91dFRyYW5zXyk7CisgICAgICAgIH0KKyAgICAgICAgcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluVHJhbnNfKS5wcm9jZXNzKGluUHJvdF8sIG91dFByb3RfKTsKKyAgICAgICAgcmVzcG9uc2VSZWFkeSgpOworICAgICAgICByZXR1cm47CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHRlKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gd2hpbGUgaW52b2tpbmchIiwgdGUpOworICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJVbmV4cGVjdGVkIHRocm93YWJsZSB3aGlsZSBpbnZva2luZyEiLCB0KTsKKyAgICAgIH0KKyAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGJlIHJlYWNoZWQgd2hlbiB0aGVyZSBpcyBhIHRocm93YWJsZS4KKyAgICAgIHN0YXRlXyA9IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfQ0xPU0U7CisgICAgICByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEgcmVhZCBpbnRvIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZCBzdWNjZWVkZWQsIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBvciB0aGUKKyAgICAgKiAgICAgICAgIGNvbm5lY3Rpb24gY2xvc2VkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpbnRlcm5hbFJlYWQoKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAodHJhbnNfLnJlYWQoYnVmZmVyXykgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIud2FybigiR290IGFuIElPRXhjZXB0aW9uIGluIGludGVybmFsUmVhZCEiLCBlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdlJ3JlIGRvbmUgd3JpdGluZywgc28gcmVzZXQgb3VyIGludGVyZXN0IG9wcyBhbmQgY2hhbmdlIHN0YXRlCisgICAgICogYWNjb3JkaW5nbHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVSZWFkKCkgeworICAgICAgLy8gd2UgY2FuIHNldCBvdXIgaW50ZXJlc3QgZGlyZWN0bHkgd2l0aG91dCB1c2luZyB0aGUgcXVldWUgYmVjYXVzZQorICAgICAgLy8gd2UncmUgaW4gdGhlIHNlbGVjdCB0aHJlYWQuCisgICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9SRUFEKTsKKyAgICAgIC8vIGdldCByZWFkeSBmb3IgYW5vdGhlciBnby1hcm91bmQKKyAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQpOworICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FX1NJWkU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiB0aGlzIEZyYW1lQnVmZmVyIG5lZWRzIHRvIGNoYW5nZSBpdHMgc2VsZWN0IGludGVyZXN0cyBhbmQgZXhlY3V0aW9uCisgICAgICogbWlnaHQgbm90IGJlIGluIGl0cyBzZWxlY3QgdGhyZWFkLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgbWFrZSBzdXJlIHRoZQorICAgICAqIGludGVyZXN0IGNoYW5nZSBnZXRzIGRvbmUgd2hlbiB0aGUgc2VsZWN0IHRocmVhZCB3YWtlcyBiYWNrIHVwLiBXaGVuIHRoZQorICAgICAqIGN1cnJlbnQgdGhyZWFkIGlzIHRoaXMgRnJhbWVCdWZmZXIncyBzZWxlY3QgdGhyZWFkLCB0aGVuIGl0IGp1c3QgZG9lcyB0aGUKKyAgICAgKiBpbnRlcmVzdCBjaGFuZ2UgaW1tZWRpYXRlbHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCkgeworICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gdGhpcy5zZWxlY3RUaHJlYWRfKSB7CisgICAgICAgIGNoYW5nZVNlbGVjdEludGVyZXN0cygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5zZWxlY3RUaHJlYWRfLnJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSh0aGlzKTsKKyAgICAgIH0KKyAgICB9CisgIH0gLy8gRnJhbWVCdWZmZXIKKworICBwdWJsaWMgY2xhc3MgQXN5bmNGcmFtZUJ1ZmZlciBleHRlbmRzIEZyYW1lQnVmZmVyIHsKKyAgICBwdWJsaWMgQXN5bmNGcmFtZUJ1ZmZlcihUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnMsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXksIEFic3RyYWN0U2VsZWN0VGhyZWFkIHNlbGVjdFRocmVhZCkgeworICAgICAgc3VwZXIodHJhbnMsIHNlbGVjdGlvbktleSwgc2VsZWN0VGhyZWFkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVFByb3RvY29sIGdldElucHV0UHJvdG9jb2woKSB7CisgICAgICByZXR1cm4gIGluUHJvdF87CisgICAgfQorCisgICAgcHVibGljIFRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpIHsKKyAgICAgIHJldHVybiBvdXRQcm90XzsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGludm9rZSgpIHsKKyAgICAgIGZyYW1lVHJhbnNfLnJlc2V0KGJ1ZmZlcl8uYXJyYXkoKSk7CisgICAgICByZXNwb25zZV8ucmVzZXQoKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJvY2Vzc0NvbnRleHQoY29udGV4dF8sIGluVHJhbnNfLCBvdXRUcmFuc18pOworICAgICAgICB9CisgICAgICAgICgoVEFzeW5jUHJvY2Vzc29yKXByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpblRyYW5zXykpLnByb2Nlc3ModGhpcyk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkV4Y2VwdGlvbiB3aGlsZSBpbnZva2luZyEiLCB0ZSk7CisgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIlVuZXhwZWN0ZWQgdGhyb3dhYmxlIHdoaWxlIGludm9raW5nISIsIHQpOworICAgICAgfQorICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgYmUgcmVhY2hlZCB3aGVuIHRoZXJlIGlzIGEgdGhyb3dhYmxlLgorICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19DTE9TRTsKKyAgICAgIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9JbnZvY2F0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0ludm9jYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODIxMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9JbnZvY2F0aW9uLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5GcmFtZUJ1ZmZlcjsKKworLyoqCisgKiBBbiBJbnZvY2F0aW9uIHJlcHJlc2VudHMgYSBtZXRob2QgY2FsbCB0aGF0IGlzIHByZXBhcmVkIHRvIGV4ZWN1dGUsIGdpdmVuCisgKiBhbiBpZGxlIHdvcmtlciB0aHJlYWQuIEl0IGNvbnRhaW5zIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scyB0aGUKKyAqIHRocmVhZCdzIHByb2Nlc3NvciBzaG91bGQgdXNlIHRvIHBlcmZvcm0gdGhlIHVzdWFsIFRocmlmdCBpbnZvY2F0aW9uLgorICovCitjbGFzcyBJbnZvY2F0aW9uIGltcGxlbWVudHMgUnVubmFibGUgeworICBwcml2YXRlIGZpbmFsIEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyOworCisgIHB1YmxpYyBJbnZvY2F0aW9uKGZpbmFsIEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CisgICAgdGhpcy5mcmFtZUJ1ZmZlciA9IGZyYW1lQnVmZmVyOworICB9CisKKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIGZyYW1lQnVmZmVyLmludm9rZSgpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJDb250ZXh0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlckNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBiOTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJDb250ZXh0LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEludGVyZmFjZSBmb3Igc3RvcmluZyBzZXJ2ZXIncyBjb25uZWN0aW9uIGNvbnRleHQKKyAqLworIAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgU2VydmVyQ29udGV4dCB7fQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9URXh0ZW5zaWJsZVNlcnZsZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwODJjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorICogU2VydmxldCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBUaHJpZnRTZXJ2ZXIsIHRoYXQgYWxsb3dzIHtAbGluayBUUHJvY2Vzc29yfSBhbmQKKyAqIHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fSB0byBiZSBzdXBwbGllZCBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZCBoYXMKKyAqIGZpbmlzaGVkLiA8YnI+CisgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhYnN0cmFjdCBtZXRob2RzIHRoYXQgcmV0dXJuIHRoZSBUUHJvY2Vzc29yIGFuZAorICogdHdvIFRQcm90b2NvbEZhY3RvcnkuIFRob3NlIG1ldGhvZHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIGV4YWN0bHkgb25jZSwKKyAqIGFuZCB0aGF0IHtAbGluayBTZXJ2bGV0Q29udGV4dH0gaXMgYXZhaWxhYmxlLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEV4dGVuc2libGVTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICBwcml2YXRlIFRQcm9jZXNzb3IgcHJvY2Vzc29yOworCisgIHByaXZhdGUgVFByb3RvY29sRmFjdG9yeSBpbkZhY3Rvcnk7CisKKyAgcHJpdmF0ZSBUUHJvdG9jb2xGYWN0b3J5IG91dEZhY3Rvcnk7CisKKyAgcHJpdmF0ZSBDb2xsZWN0aW9uPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGN1c3RvbUhlYWRlcnM7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHtAbGluayBUUHJvY2Vzc29yfS4gVGhpcyB3aWxsIGJlIGNhbGxlZCA8Yj5vbmNlPC9iPiBqdXN0CisgICAqIGFmdGVyIHRoZSB7QGxpbmsgI2luaXQoKX0gbWV0aG9kCisgICAqIAorICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgVFByb2Nlc3Nvcn0KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBUUHJvY2Vzc29yIGdldFByb2Nlc3NvcigpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBpbiB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0uIFRoaXMgd2lsbCBiZSBjYWxsZWQKKyAgICogPGI+b25jZTwvYj4ganVzdCBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZAorICAgKiAKKyAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW4ge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9CisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb3RvY29sRmFjdG9yeSBnZXRJblByb3RvY29sRmFjdG9yeSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBvdXQge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9LiBUaGlzIHdpbGwgYmUgY2FsbGVkCisgICAqIDxiPm9uY2U8L2I+IGp1c3QgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QKKyAgICogCisgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG91dCB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0KKyAgICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBUUHJvdG9jb2xGYWN0b3J5IGdldE91dFByb3RvY29sRmFjdG9yeSgpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuaW5pdChjb25maWcpOyAvL25vLWFyZ3MgaW5pdCgpIGhhcHBlbnMgaGVyZQorICAgIHRoaXMucHJvY2Vzc29yID0gZ2V0UHJvY2Vzc29yKCk7CisgICAgdGhpcy5pbkZhY3RvcnkgPSBnZXRJblByb3RvY29sRmFjdG9yeSgpOworICAgIHRoaXMub3V0RmFjdG9yeSA9IGdldE91dFByb3RvY29sRmFjdG9yeSgpOworICAgIHRoaXMuY3VzdG9tSGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4oKTsKKworICAgIGlmIChwcm9jZXNzb3IgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oInByb2Nlc3NvciBtdXN0IGJlIHNldCIpOworICAgIH0KKyAgICBpZiAoaW5GYWN0b3J5ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJpbkZhY3RvcnkgbXVzdCBiZSBzZXQiKTsKKyAgICB9CisgICAgaWYgKG91dEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIm91dEZhY3RvcnkgbXVzdCBiZSBzZXQiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQHNlZSBIdHRwU2VydmxldCNkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UKKyAgICogICAgICByZXNwb25zZSkKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFRUcmFuc3BvcnQgaW5UcmFuc3BvcnQgPSBudWxsOworICAgIFRUcmFuc3BvcnQgb3V0VHJhbnNwb3J0ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKworICAgICAgaWYgKG51bGwgIT0gdGhpcy5jdXN0b21IZWFkZXJzKSB7CisJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGhlYWRlciA6IHRoaXMuY3VzdG9tSGVhZGVycykgeworCSAgcmVzcG9uc2UuYWRkSGVhZGVyKGhlYWRlci5nZXRLZXkoKSwgaGVhZGVyLmdldFZhbHVlKCkpOworCX0KKyAgICAgIH0KKworICAgICAgSW5wdXRTdHJlYW0gaW4gPSByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7CisgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRJT1N0cmVhbVRyYW5zcG9ydChpbiwgb3V0KTsKKyAgICAgIGluVHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgb3V0VHJhbnNwb3J0ID0gdHJhbnNwb3J0OworCisgICAgICBUUHJvdG9jb2wgaW5Qcm90b2NvbCA9IGluRmFjdG9yeS5nZXRQcm90b2NvbChpblRyYW5zcG9ydCk7CisgICAgICBUUHJvdG9jb2wgb3V0UHJvdG9jb2wgPSBpbkZhY3RvcnkuZ2V0UHJvdG9jb2wob3V0VHJhbnNwb3J0KTsKKworICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoaW5Qcm90b2NvbCwgb3V0UHJvdG9jb2wpOworICAgICAgb3V0LmZsdXNoKCk7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlCisgICAqICAgICAgcmVzcG9uc2UpCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBkb1Bvc3QocmVxLCByZXNwKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZEN1c3RvbUhlYWRlcihmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMuYWRkKG5ldyBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+KCkgeworICAgICAgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisJcmV0dXJuIGtleTsKKyAgICAgIH0KKworICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwlyZXR1cm4gdmFsdWU7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDdXN0b21IZWFkZXJzKENvbGxlY3Rpb248TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gaGVhZGVycykgeworICAgIHRoaXMuY3VzdG9tSGVhZGVycy5jbGVhcigpOworICAgIHRoaXMuY3VzdG9tSGVhZGVycy5hZGRBbGwoaGVhZGVycyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YQppbmRleCA5MzNhYjE3Li40YzVkN2I1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhCkBAIC0yMiwxNCArMjIsMTAgQEAKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKIAogLyoqCkBAIC0zOCwyMTEgKzM0LDEyOSBAQAogICovCiBwdWJsaWMgY2xhc3MgVEhzSGFTZXJ2ZXIgZXh0ZW5kcyBUTm9uYmxvY2tpbmdTZXJ2ZXIgewogCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXJncyBleHRlbmRzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzPEFyZ3M+IHsKKyAgICBwdWJsaWMgaW50IG1pbldvcmtlclRocmVhZHMgPSA1OworICAgIHB1YmxpYyBpbnQgbWF4V29ya2VyVGhyZWFkcyA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgIHByaXZhdGUgaW50IHN0b3BUaW1lb3V0VmFsID0gNjA7CisgICAgcHJpdmF0ZSBUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTOworICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IG51bGw7CisKKyAgICBwdWJsaWMgQXJncyhUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICBzdXBlcih0cmFuc3BvcnQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWluIGFuZCBtYXggdGhyZWFkcy4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI21pbldvcmtlclRocmVhZHMoaW50KX0gYW5kIHtAbGluayAjbWF4V29ya2VyVGhyZWFkcyhpbnQpfSAgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBBcmdzIHdvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1pbldvcmtlclRocmVhZHMgPSBuOworICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoYXQgdGhlIG1pbiB0aHJlYWRzIHdhcyBzZXQgdG8uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0TWluV29ya2VyVGhyZWFkcygpfSBhbmQge0BsaW5rICNnZXRNYXhXb3JrZXJUaHJlYWRzKCl9IGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgaW50IGdldFdvcmtlclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gbWluV29ya2VyVGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBtaW5Xb3JrZXJUaHJlYWRzKGludCBuKSB7CisgICAgICBtaW5Xb3JrZXJUaHJlYWRzID0gbjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIG1heFdvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1heFdvcmtlclRocmVhZHMgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNaW5Xb3JrZXJUaHJlYWRzKCkgeworICAgICAgcmV0dXJuIG1pbldvcmtlclRocmVhZHM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhXb3JrZXJUaHJlYWRzKCkgeworICAgICAgcmV0dXJuIG1heFdvcmtlclRocmVhZHM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdG9wVGltZW91dFZhbCgpIHsKKyAgICAgIHJldHVybiBzdG9wVGltZW91dFZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFZhbChpbnQgc3RvcFRpbWVvdXRWYWwpIHsKKyAgICAgIHRoaXMuc3RvcFRpbWVvdXRWYWwgPSBzdG9wVGltZW91dFZhbDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lVW5pdCBnZXRTdG9wVGltZW91dFVuaXQoKSB7CisgICAgICByZXR1cm4gc3RvcFRpbWVvdXRVbml0OworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHN0b3BUaW1lb3V0VW5pdChUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQpIHsKKyAgICAgIHRoaXMuc3RvcFRpbWVvdXRVbml0ID0gc3RvcFRpbWVvdXRVbml0OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICByZXR1cm4gZXhlY3V0b3JTZXJ2aWNlOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIGV4ZWN1dG9yU2VydmljZShFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZSA9IGV4ZWN1dG9yU2VydmljZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfQorCisKICAgLy8gVGhpcyB3cmFwcyBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgcXVldWVpbmcgYW5kIHRocmVhZCBwb29sIG1hbmFnZW1lbnQKICAgLy8gZm9yIHRoZSBwYXNzaW5nIG9mIEludm9jYXRpb25zIGZyb20gdGhlIFNlbGVjdG9yIHRvIHdvcmtlcnMuCi0gIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXI7CisgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGludm9rZXI7CiAKLSAgcHJvdGVjdGVkIGZpbmFsIGludCBNSU5fV09SS0VSX1RIUkVBRFM7Ci0gIHByb3RlY3RlZCBmaW5hbCBpbnQgTUFYX1dPUktFUl9USFJFQURTOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IFNUT1BfVElNRU9VVF9WQUw7Ci0gIHByb3RlY3RlZCBmaW5hbCBUaW1lVW5pdCBTVE9QX1RJTUVPVVRfVU5JVDsKKyAgcHJpdmF0ZSBmaW5hbCBBcmdzIGFyZ3M7CiAKICAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBnaXZlbiBwcm9jZXNzb3IsIGFuZCBzZXJ2ZXIgdHJhbnNwb3J0LiBEZWZhdWx0IHNlcnZlcgotICAgKiBvcHRpb25zLCBUQmluYXJ5UHJvdG9jb2wgZm9yIHRoZSBwcm90b2NvbCwgYW5kIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBvbgotICAgKiBib3RoIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cy4gQSBUUHJvY2Vzc29yRmFjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgdGhhdAotICAgKiBhbHdheXMgcmV0dXJucyB0aGUgc3BlY2lmaWVkIHByb2Nlc3Nvci4KKyAgICogQ3JlYXRlIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIEFyZ3MgY29uZmlndXJhdGlvbgogICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IE9wdGlvbnMoKSk7CisgIHB1YmxpYyBUSHNIYVNlcnZlcihBcmdzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKworICAgIGludm9rZXIgPSBhcmdzLmV4ZWN1dG9yU2VydmljZSA9PSBudWxsID8gY3JlYXRlSW52b2tlclBvb2woYXJncykgOiBhcmdzLmV4ZWN1dG9yU2VydmljZTsKKyAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICB9CiAKICAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBnaXZlbiBwcm9jZXNzb3IsIHNlcnZlciB0cmFuc3BvcnQsIGFuZCBzZXJ2ZXIgb3B0aW9ucwotICAgKiB1c2luZyBUQmluYXJ5UHJvdG9jb2wgZm9yIHRoZSBwcm90b2NvbCwgYW5kIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBvbgotICAgKiBib3RoIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cy4gQSBUUHJvY2Vzc29yRmFjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgdGhhdAotICAgKiBhbHdheXMgcmV0dXJucyB0aGUgc3BlY2lmaWVkIHByb2Nlc3Nvci4KKyAgICoge0Bpbmhlcml0RG9jfQogICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucykgewotICAgIHRoaXMobmV3IFRQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwgb3B0aW9ucyk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciB3aXRoIHNwZWNpZmllZCBwcm9jZXNzb3IgZmFjdG9yeSBhbmQgc2VydmVyIHRyYW5zcG9ydC4gVXNlcwotICAgKiBkZWZhdWx0IG9wdGlvbnMuIFRCaW5hcnlQcm90b2NvbCBpcyBhc3N1bWVkLiBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkgaXMKLSAgICogdXNlZCBvbiBib3RoIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cy4KLSAgICovCi0gIHB1YmxpYyBUSHNIYVNlcnZlciggVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBPcHRpb25zKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgcHJvY2Vzc29yIGZhY3RvcnksIHNlcnZlciB0cmFuc3BvcnQsIGFuZCBzZXJ2ZXIKLSAgICogb3B0aW9ucy4gVEJpbmFyeVByb3RvY29sIGlzIGFzc3VtZWQuIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBpcyB1c2VkIG9uCi0gICAqIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzLgotICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKSwKLSAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBvcHRpb25zKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgcHJvY2Vzc29yLCBzZXJ2ZXIgdHJhbnNwb3J0LCBhbmQgaW4vb3V0IHByb3RvY29sCi0gICAqIGZhY3RvcnkuIERlZmF1bHRzIHdpbGwgYmUgdXNlZCBmb3IgaW4vb3V0IHRyYW5zcG9ydCBmYWN0b3J5IGFuZCBzZXJ2ZXIKLSAgICogb3B0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBUSHNIYVNlcnZlciggVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHByb3RvY29sRmFjdG9yeSwgbmV3IE9wdGlvbnMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogU2VydmVyIHdpdGggc3BlY2lmaWVkIHByb2Nlc3Nvciwgc2VydmVyIHRyYW5zcG9ydCwgYW5kIGluL291dCBwcm90b2NvbAotICAgKiBmYWN0b3J5LiBEZWZhdWx0cyB3aWxsIGJlIHVzZWQgZm9yIGluL291dCB0cmFuc3BvcnQgZmFjdG9yeSBhbmQgc2VydmVyCi0gICAqIG9wdGlvbnMuCi0gICAqLwotICBwdWJsaWMgVEhzSGFTZXJ2ZXIoIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgdGhpcyhuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpLAotICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIAotICAgICAgb3B0aW9ucyk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciB3aXRoIHNwZWNpZmllZCBwcm9jZXNzb3IsIHNlcnZlciB0cmFuc3BvcnQsIGluL291dAotICAgKiB0cmFuc3BvcnQgZmFjdG9yeSwgaW4vb3V0IHByb3RvY29sIGZhY3RvcnksIGFuZCBkZWZhdWx0IHNlcnZlciBvcHRpb25zLiBBCi0gICAqIHByb2Nlc3NvciBmYWN0b3J5IHdpbGwgYmUgY3JlYXRlZCB0aGF0IGFsd2F5cyByZXR1cm5zIHRoZSBzcGVjaWZpZWQKLSAgICogcHJvY2Vzc29yLgotICAgKi8KLSAgcHVibGljIFRIc0hhU2VydmVyKCBUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgc2VydmVyIHdpdGggc3BlY2lmaWVkIHByb2Nlc3NvciBmYWN0b3J5LCBzZXJ2ZXIgdHJhbnNwb3J0LCBpbi9vdXQKLSAgICogdHJhbnNwb3J0IGZhY3RvcnksIGluL291dCBwcm90b2NvbCBmYWN0b3J5LCBhbmQgZGVmYXVsdCBzZXJ2ZXIgb3B0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBUSHNIYVNlcnZlciggVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIG5ldyBPcHRpb25zKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgcHJvY2Vzc29yIGZhY3RvcnksIHNlcnZlciB0cmFuc3BvcnQsIGluL291dAotICAgKiB0cmFuc3BvcnQgZmFjdG9yeSwgaW4vb3V0IHByb3RvY29sIGZhY3RvcnksIGFuZCBzZXJ2ZXIgb3B0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBUSHNIYVNlcnZlciggVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucykgewotICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgb3B0aW9ucyk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciB3aXRoIGV2ZXJ5dGhpbmcgc3BlY2lmaWVkLCBleGNlcHQgdXNlIGRlZmF1bHQgc2VydmVyIG9wdGlvbnMuCi0gICAqLwotICBwdWJsaWMgVEhzSGFTZXJ2ZXIoIFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMobmV3IFRQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgc2VydmVyIHdpdGggZXZlcnl0aGluZyBzcGVjaWZpZWQsIGV4Y2VwdCB1c2UgZGVmYXVsdCBzZXJ2ZXIgb3B0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBUSHNIYVNlcnZlciggVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCi0gIHsKLSAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBuZXcgT3B0aW9ucygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgc2VydmVyIHdpdGggZXZlcnkgb3B0aW9uIGZ1bGx5IHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyBUSHNIYVNlcnZlciggVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKQotICB7Ci0gICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBvcHRpb25zKTsKLQotICAgIE1JTl9XT1JLRVJfVEhSRUFEUyA9IG9wdGlvbnMubWluV29ya2VyVGhyZWFkczsKLSAgICBNQVhfV09SS0VSX1RIUkVBRFMgPSBvcHRpb25zLm1heFdvcmtlclRocmVhZHM7Ci0gICAgU1RPUF9USU1FT1VUX1ZBTCA9IG9wdGlvbnMuc3RvcFRpbWVvdXRWYWw7Ci0gICAgU1RPUF9USU1FT1VUX1VOSVQgPSBvcHRpb25zLnN0b3BUaW1lb3V0VW5pdDsKLSAgfQotCi0gIC8qKiBAaW5oZXJpdERvYyAqLwogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2VydmUoKSB7Ci0gICAgaWYgKCFzdGFydEludm9rZXJQb29sKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCBsaXN0ZW5pbmcsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0TGlzdGVuaW5nKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCB0aGUgc2VsZWN0b3IsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0U2VsZWN0b3JUaHJlYWQoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHRoaXMgd2lsbCBibG9jayB3aGlsZSB3ZSBzZXJ2ZQorICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2h1dGRvd24oKSB7CiAgICAgam9pblNlbGVjdG9yKCk7Ci0KICAgICBncmFjZWZ1bGx5U2h1dGRvd25JbnZva2VyUG9vbCgpOwotCi0gICAgLy8gZG8gYSBsaXR0bGUgY2xlYW51cAotICAgIHN0b3BMaXN0ZW5pbmcoKTsKLQotICAgIC8vIHVuZ3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIGludm9rZXIgcG9vbD8KICAgfQogCi0gIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0SW52b2tlclBvb2woKSB7Ci0gICAgLy8gc3RhcnQgdGhlIGludm9rZXIgcG9vbAotICAgIExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+IHF1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCk7Ci0gICAgaW52b2tlciA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoTUlOX1dPUktFUl9USFJFQURTLCBNQVhfV09SS0VSX1RIUkVBRFMsCi0gICAgICBTVE9QX1RJTUVPVVRfVkFMLCBTVE9QX1RJTUVPVVRfVU5JVCwgcXVldWUpOworICAvKioKKyAgICogSGVscGVyIHRvIGNyZWF0ZSBhbiBpbnZva2VyIHBvb2wKKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIGNyZWF0ZUludm9rZXJQb29sKEFyZ3Mgb3B0aW9ucykgeworICAgIGludCBtaW5Xb3JrZXJUaHJlYWRzID0gb3B0aW9ucy5taW5Xb3JrZXJUaHJlYWRzOworICAgIGludCBtYXhXb3JrZXJUaHJlYWRzID0gb3B0aW9ucy5tYXhXb3JrZXJUaHJlYWRzOworICAgIGludCBzdG9wVGltZW91dFZhbCA9IG9wdGlvbnMuc3RvcFRpbWVvdXRWYWw7CisgICAgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gb3B0aW9ucy5zdG9wVGltZW91dFVuaXQ7CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPiBxdWV1ZSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigpOworICAgIEV4ZWN1dG9yU2VydmljZSBpbnZva2VyID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihtaW5Xb3JrZXJUaHJlYWRzLAorICAgICAgbWF4V29ya2VyVGhyZWFkcywgc3RvcFRpbWVvdXRWYWwsIHN0b3BUaW1lb3V0VW5pdCwgcXVldWUpOworCisgICAgcmV0dXJuIGludm9rZXI7CisgIH0KKworICBwcm90ZWN0ZWQgRXhlY3V0b3JTZXJ2aWNlIGdldEludm9rZXIoKSB7CisgICAgcmV0dXJuIGludm9rZXI7CiAgIH0KIAogICBwcm90ZWN0ZWQgdm9pZCBncmFjZWZ1bGx5U2h1dGRvd25JbnZva2VyUG9vbCgpIHsKQEAgLTI1Myw3ICsxNjcsNyBAQAogICAgIC8vIGV4Y2VwdGlvbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB3ZSdsbCBzaHV0IGRvd24gcHJlbWF0dXJlbHkuIFdlIHdhbnQKICAgICAvLyB0byBsZXQgdGhlIGV4ZWN1dG9yU2VydmljZSBjbGVhciBpdCdzIHRhc2sgcXVldWUsIGNsb3NpbmcgY2xpZW50IHNvY2tldHMKICAgICAvLyBhcHByb3ByaWF0ZWx5LgotICAgIGxvbmcgdGltZW91dE1TID0gMTAwMDA7CisgICAgbG9uZyB0aW1lb3V0TVMgPSBhcmdzLnN0b3BUaW1lb3V0VW5pdC50b01pbGxpcyhhcmdzLnN0b3BUaW1lb3V0VmFsKTsKICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgIHdoaWxlICh0aW1lb3V0TVMgPj0gMCkgewogICAgICAgdHJ5IHsKQEAgLTI2OSwzNSArMTgzLDIyIEBACiAKICAgLyoqCiAgICAqIFdlIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBpbnZva2UgbWV0aG9kIGhlcmUgdG8gcXVldWUgdGhlIGludm9jYXRpb24gZm9yCi0gICAqIGludm9rZXIgc2VydmljZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IGludm9raW5nLiBUaGUgdGhyZWFkIHBvb2wgdGFrZXMgY2FyZSBvZiB0aGUgcmVzdC4KKyAgICogaW52b2tlciBzZXJ2aWNlIGluc3RlYWQgb2YgaW1tZWRpYXRlbHkgaW52b2tpbmcuIFRoZSB0aHJlYWQgcG9vbCB0YWtlcyBjYXJlCisgICAqIG9mIHRoZSByZXN0LgogICAgKi8KICAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RJbnZva2UoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKLSAgICBpbnZva2VyLmV4ZWN1dGUobmV3IEludm9jYXRpb24oZnJhbWVCdWZmZXIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbiBJbnZvY2F0aW9uIHJlcHJlc2VudHMgYSBtZXRob2QgY2FsbCB0aGF0IGlzIHByZXBhcmVkIHRvIGV4ZWN1dGUsIGdpdmVuCi0gICAqIGFuIGlkbGUgd29ya2VyIHRocmVhZC4gSXQgY29udGFpbnMgdGhlIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzIHRoZQotICAgKiB0aHJlYWQncyBwcm9jZXNzb3Igc2hvdWxkIHVzZSB0byBwZXJmb3JtIHRoZSB1c3VhbCBUaHJpZnQgaW52b2NhdGlvbi4KLSAgICovCi0gIHByaXZhdGUgY2xhc3MgSW52b2NhdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotICAgIHByaXZhdGUgZmluYWwgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXI7Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvbihmaW5hbCBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgewotICAgICAgdGhpcy5mcmFtZUJ1ZmZlciA9IGZyYW1lQnVmZmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgIGZyYW1lQnVmZmVyLmludm9rZSgpOworICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CisgICAgdHJ5IHsKKyAgICAgIFJ1bm5hYmxlIGludm9jYXRpb24gPSBnZXRSdW5uYWJsZShmcmFtZUJ1ZmZlcik7CisgICAgICBpbnZva2VyLmV4ZWN1dGUoaW52b2NhdGlvbik7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoIChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiByeCkgeworICAgICAgTE9HR0VSLndhcm4oIkV4ZWN1dG9yU2VydmljZSByZWplY3RlZCBleGVjdXRpb24hIiwgcngpOworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3B0aW9ucyBleHRlbmRzIFROb25ibG9ja2luZ1NlcnZlci5PcHRpb25zIHsKLSAgICBwdWJsaWMgaW50IG1pbldvcmtlclRocmVhZHMgPSA1OwotICAgIHB1YmxpYyBpbnQgbWF4V29ya2VyVGhyZWFkcyA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgIHB1YmxpYyBpbnQgc3RvcFRpbWVvdXRWYWwgPSA2MDsKLSAgICBwdWJsaWMgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKKyAgcHJvdGVjdGVkIFJ1bm5hYmxlIGdldFJ1bm5hYmxlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKXsKKyAgICByZXR1cm4gbmV3IEludm9jYXRpb24oZnJhbWVCdWZmZXIpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQppbmRleCAzMWE2ZTI0Li5mZTAzNjVhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmphdmEKQEAgLTIwLDMxICsyMCwxMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCiAvKioKICAqIEEgbm9uYmxvY2tpbmcgVFNlcnZlciBpbXBsZW1lbnRhdGlvbi4gVGhpcyBhbGxvd3MgZm9yIGZhaXJuZXNzIGFtb25nc3QgYWxsCkBAIC01NywxNjggKzM5LDMzIEBACiAgKiB0cmFuc3BvcnQsIG90aGVyd2lzZSB0aGlzIHNlcnZlciB3aWxsIGJlIHVuYWJsZSB0byBkZXRlcm1pbmUgd2hlbiBhIHdob2xlCiAgKiBtZXRob2QgY2FsbCBoYXMgYmVlbiByZWFkIG9mZiB0aGUgd2lyZS4gQ2xpZW50cyBtdXN0IGFsc28gdXNlIFRGcmFtZWRUcmFuc3BvcnQuCiAgKi8KLXB1YmxpYyBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9Ci0gICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVE5vbmJsb2NraW5nU2VydmVyLmNsYXNzLmdldE5hbWUoKSk7CitwdWJsaWMgY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlciB7CiAKLSAgLy8gRmxhZyBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlcgotICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZF87Ci0KLSAgcHJpdmF0ZSBTZWxlY3RUaHJlYWQgc2VsZWN0VGhyZWFkXzsKLQotICAvKioKLSAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB3ZSB3aWxsIGFsbG9jYXRlIHRvIGNsaWVudCBJTyBidWZmZXJzIGF0IGEKLSAgICogdGltZS4gV2l0aG91dCB0aGlzIGxpbWl0LCB0aGUgc2VydmVyIHdpbGwgZ2xhZGx5IGFsbG9jYXRlIGNsaWVudCBidWZmZXJzCi0gICAqIHJpZ2h0IGludG8gYW4gb3V0IG9mIG1lbW9yeSBleGNlcHRpb24sIHJhdGhlciB0aGFuIHdhaXRpbmcuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGxvbmcgTUFYX1JFQURfQlVGRkVSX0JZVEVTOwotCi0gIHByb3RlY3RlZCBmaW5hbCBPcHRpb25zIG9wdGlvbnNfOwotCi0gIC8qKgotICAgKiBIb3cgbWFueSBieXRlcyBhcmUgY3VycmVudGx5IGFsbG9jYXRlZCB0byByZWFkIGJ1ZmZlcnMuCi0gICAqLwotICBwcml2YXRlIGxvbmcgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkID0gMDsKLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciB3aXRoIGdpdmVuIHByb2Nlc3NvciBhbmQgc2VydmVyIHRyYW5zcG9ydCwgdXNpbmcKLSAgICogVEJpbmFyeVByb3RvY29sIGZvciB0aGUgcHJvdG9jb2wsIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBvbiBib3RoIGlucHV0Ci0gICAqIGFuZCBvdXRwdXQgdHJhbnNwb3J0cy4gQSBUUHJvY2Vzc29yRmFjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgdGhhdCBhbHdheXMKLSAgICogcmV0dXJucyB0aGUgc3BlY2lmaWVkIHByb2Nlc3Nvci4KLSAgICovCi0gIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgdGhpcyhuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgc2VydmVyIHdpdGggc3BlY2lmaWVkIHByb2Nlc3NvciBmYWN0b3J5IGFuZCBzZXJ2ZXIgdHJhbnNwb3J0LgotICAgKiBUQmluYXJ5UHJvdG9jb2wgaXMgYXNzdW1lZC4gVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IGlzIHVzZWQgb24gYm90aCBpbnB1dAotICAgKiBhbmQgb3V0cHV0IHRyYW5zcG9ydHMuCi0gICAqLwotICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkgewotICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKLSAgfQotCi0gIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCksCi0gICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKLSAgICB0aGlzKG5ldyBUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBURnJhbWVkVHJhbnNwb3J0LkZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIG5ldyBPcHRpb25zKCkpOwotICB9Ci0KLSAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgbnVsbCwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKLSAgICBvcHRpb25zXyA9IG9wdGlvbnM7Ci0gICAgb3B0aW9uc18udmFsaWRhdGUoKTsKLSAgICBNQVhfUkVBRF9CVUZGRVJfQllURVMgPSBvcHRpb25zLm1heFJlYWRCdWZmZXJCeXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBCZWdpbiBhY2NlcHRpbmcgY29ubmVjdGlvbnMgYW5kIHByb2Nlc3NpbmcgaW52b2NhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICAvLyBzdGFydCBsaXN0ZW5pbmcsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0TGlzdGVuaW5nKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCB0aGUgc2VsZWN0b3IsIG9yIGV4aXQKLSAgICBpZiAoIXN0YXJ0U2VsZWN0b3JUaHJlYWQoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHRoaXMgd2lsbCBibG9jayB3aGlsZSB3ZSBzZXJ2ZQotICAgIGpvaW5TZWxlY3RvcigpOwotCi0gICAgLy8gZG8gYSBsaXR0bGUgY2xlYW51cAotICAgIHN0b3BMaXN0ZW5pbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBIYXZlIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IHN0YXJ0IGFjY2VwdGluZyBjb25uZWN0aW9ucy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHdlIHN0YXJ0ZWQgbGlzdGVuaW5nIHN1Y2Nlc3NmdWxseSwgZmFsc2UgaWYgc29tZXRoaW5nIHdlbnQKLSAgICogd3JvbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydExpc3RlbmluZygpIHsKLSAgICB0cnkgewotICAgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICBMT0dHRVIuZXJyb3IoIkZhaWxlZCB0byBzdGFydCBsaXN0ZW5pbmcgb24gc2VydmVyIHNvY2tldCEiLCB0dHgpOwotICAgICAgcmV0dXJuIGZhbHNlOworICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxBcmdzPiB7CisgICAgcHVibGljIEFyZ3MoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgICAgc3VwZXIodHJhbnNwb3J0KTsKICAgICB9CiAgIH0KIAotICAvKioKLSAgICogU3RvcCBsaXN0ZW5pbmcgZm9yIGNvbmVjdGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotICAgIHNlcnZlclRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgcHJpdmF0ZSBTZWxlY3RBY2NlcHRUaHJlYWQgc2VsZWN0QWNjZXB0VGhyZWFkXzsKKworICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyKEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKICAgfQogCisKICAgLyoqCi0gICAqIFN0YXJ0IHRoZSBzZWxlY3RvciB0aHJlYWQgcnVubmluZyB0byBkZWFsIHdpdGggY2xpZW50cy4KKyAgICogU3RhcnQgdGhlIHNlbGVjdG9yIHRocmVhZCB0byBkZWFsIHdpdGggYWNjZXB0cyBhbmQgY2xpZW50IG1lc3NhZ2VzLgogICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBmYWxzZSBpZiB3ZSBjb3VsZG4ndCBzdGFydCBmb3Igc29tZQogICAgKiByZWFzb24uCiAgICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydFNlbGVjdG9yVGhyZWFkKCkgeworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRUaHJlYWRzKCkgewogICAgIC8vIHN0YXJ0IHRoZSBzZWxlY3RvcgogICAgIHRyeSB7Ci0gICAgICBzZWxlY3RUaHJlYWRfID0gbmV3IFNlbGVjdFRocmVhZCgoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0KXNlcnZlclRyYW5zcG9ydF8pOwotICAgICAgc2VsZWN0VGhyZWFkXy5zdGFydCgpOworICAgICAgc2VsZWN0QWNjZXB0VGhyZWFkXyA9IG5ldyBTZWxlY3RBY2NlcHRUaHJlYWQoKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydClzZXJ2ZXJUcmFuc3BvcnRfKTsKKyAgICAgIHNlbGVjdEFjY2VwdFRocmVhZF8uc3RhcnQoKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgIExPR0dFUi5lcnJvcigiRmFpbGVkIHRvIHN0YXJ0IHNlbGVjdG9yIHRocmVhZCEiLCBlKTsKQEAgLTIyNiwxMyArNzMsMTggQEAKICAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNodXRkb3duKCkgeworICAgIGpvaW5TZWxlY3RvcigpOworICB9CisKICAgLyoqCi0gICAqIEJsb2NrIHVudGlsIHRoZSBzZWxlY3RvciBleGl0cy4KKyAgICogQmxvY2sgdW50aWwgdGhlIHNlbGVjdG9yIHRocmVhZCBleGl0cy4KICAgICovCiAgIHByb3RlY3RlZCB2b2lkIGpvaW5TZWxlY3RvcigpIHsKICAgICAvLyB3YWl0IHVudGlsIHRoZSBzZWxlY3RvciB0aHJlYWQgZXhpdHMKICAgICB0cnkgewotICAgICAgc2VsZWN0VGhyZWFkXy5qb2luKCk7CisgICAgICBzZWxlY3RBY2NlcHRUaHJlYWRfLmpvaW4oKTsKICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAvLyBmb3Igbm93LCBqdXN0IHNpbGVudGx5IGlnbm9yZS4gdGVjaG5pY2FsbHkgdGhpcyBtZWFucyB3ZSdsbCBoYXZlIGxlc3Mgb2YKICAgICAgIC8vIGEgZ3JhY2VmdWwgc2h1dGRvd24gYXMgYSByZXN1bHQuCkBAIC0yNDIsMTAgKzk0LDExIEBACiAgIC8qKgogICAgKiBTdG9wIHNlcnZpbmcgYW5kIHNodXQgZXZlcnl0aGluZyBkb3duLgogICAgKi8KKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CiAgICAgc3RvcHBlZF8gPSB0cnVlOwotICAgIGlmIChzZWxlY3RUaHJlYWRfICE9IG51bGwpIHsKLSAgICAgIHNlbGVjdFRocmVhZF8ud2FrZXVwU2VsZWN0b3IoKTsKKyAgICBpZiAoc2VsZWN0QWNjZXB0VGhyZWFkXyAhPSBudWxsKSB7CisgICAgICBzZWxlY3RBY2NlcHRUaHJlYWRfLndha2V1cFNlbGVjdG9yKCk7CiAgICAgfQogICB9CiAKQEAgLTI1Myw3NyArMTA2LDc0IEBACiAgICAqIFBlcmZvcm0gYW4gaW52b2NhdGlvbi4gVGhpcyBtZXRob2QgY291bGQgYmVoYXZlIHNldmVyYWwgZGlmZmVyZW50IHdheXMKICAgICogLSBpbnZva2UgaW1tZWRpYXRlbHkgaW5saW5lLCBxdWV1ZSBmb3Igc2VwYXJhdGUgZXhlY3V0aW9uLCBldGMuCiAgICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0SW52b2tlKEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyKSB7CiAgICAgZnJhbWVCdWZmZXIuaW52b2tlKCk7CisgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICAvKioKLSAgICogQSBGcmFtZUJ1ZmZlciB3YW50cyB0byBjaGFuZ2UgaXRzIHNlbGVjdGlvbiBwcmVmZXJlbmNlcywgYnV0IG1pZ2h0IG5vdCBiZQotICAgKiBpbiB0aGUgc2VsZWN0IHRocmVhZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgewotICAgIHNlbGVjdFRocmVhZF8ucmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKGZyYW1lQnVmZmVyKTsKKworICBwdWJsaWMgYm9vbGVhbiBpc1N0b3BwZWQoKSB7CisgICAgcmV0dXJuIHNlbGVjdEFjY2VwdFRocmVhZF8uaXNTdG9wcGVkKCk7CiAgIH0KIAogICAvKioKICAgICogVGhlIHRocmVhZCB0aGF0IHdpbGwgYmUgZG9pbmcgYWxsIHRoZSBzZWxlY3RpbmcsIG1hbmFnaW5nIG5ldyBjb25uZWN0aW9ucwogICAgKiBhbmQgdGhvc2UgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHJlYWQuCiAgICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgU2VsZWN0VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgcHJvdGVjdGVkIGNsYXNzIFNlbGVjdEFjY2VwdFRocmVhZCBleHRlbmRzIEFic3RyYWN0U2VsZWN0VGhyZWFkIHsKIAorICAgIC8vIFRoZSBzZXJ2ZXIgdHJhbnNwb3J0IG9uIHdoaWNoIG5ldyBjbGllbnQgdHJhbnNwb3J0cyB3aWxsIGJlIGFjY2VwdGVkCiAgICAgcHJpdmF0ZSBmaW5hbCBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0OwotICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7Ci0KLSAgICAvLyBMaXN0IG9mIEZyYW1lQnVmZmVycyB0aGF0IHdhbnQgdG8gY2hhbmdlIHRoZWlyIHNlbGVjdGlvbiBpbnRlcmVzdHMuCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8RnJhbWVCdWZmZXI+IHNlbGVjdEludGVyZXN0Q2hhbmdlcyA9Ci0gICAgICBuZXcgSGFzaFNldDxGcmFtZUJ1ZmZlcj4oKTsKIAogICAgIC8qKgotICAgICAqIFNldCB1cCB0aGUgU2VsZWN0b3JUaHJlYWQuCisgICAgICogU2V0IHVwIHRoZSB0aHJlYWQgdGhhdCB3aWxsIGhhbmRsZSB0aGUgbm9uLWJsb2NraW5nIGFjY2VwdHMsIHJlYWRzLCBhbmQKKyAgICAgKiB3cml0ZXMuCiAgICAgICovCi0gICAgcHVibGljIFNlbGVjdFRocmVhZChmaW5hbCBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgIHB1YmxpYyBTZWxlY3RBY2NlcHRUaHJlYWQoZmluYWwgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgICB0aGlzLnNlbGVjdG9yID0gU2VsZWN0b3JQcm92aWRlci5wcm92aWRlcigpLm9wZW5TZWxlY3RvcigpOwogICAgICAgc2VydmVyVHJhbnNwb3J0LnJlZ2lzdGVyU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzU3RvcHBlZCgpIHsKKyAgICAgIHJldHVybiBzdG9wcGVkXzsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGUgd29yayBsb29wLiBIYW5kbGVzIGJvdGggc2VsZWN0aW5nIChhbGwgSU8gb3BlcmF0aW9ucykgYW5kIG1hbmFnaW5nCiAgICAgICogdGhlIHNlbGVjdGlvbiBwcmVmZXJlbmNlcyBvZiBhbGwgZXhpc3RpbmcgY29ubmVjdGlvbnMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgd2hpbGUgKCFzdG9wcGVkXykgewotICAgICAgICBzZWxlY3QoKTsKLSAgICAgICAgcHJvY2Vzc0ludGVyZXN0Q2hhbmdlcygpOwotICAgICAgfQotICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXJfLnByZVNlcnZlKCk7CisgICAgICAgIH0KIAotICAgIC8qKgotICAgICAqIElmIHRoZSBzZWxlY3RvciBpcyBibG9ja2VkLCB3YWtlIGl0IHVwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdha2V1cFNlbGVjdG9yKCkgewotICAgICAgc2VsZWN0b3Iud2FrZXVwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIEZyYW1lQnVmZmVyIHRvIHRoZSBsaXN0IG9mIHNlbGVjdCBpbnRlcmVzdCBjaGFuZ2VzIGFuZCB3YWtlIHVwIHRoZQotICAgICAqIHNlbGVjdG9yIGlmIGl0J3MgYmxvY2tlZC4gV2hlbiB0aGUgc2VsZWN0KCkgY2FsbCBleGl0cywgaXQnbGwgZ2l2ZSB0aGUKLSAgICAgKiBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byBjaGFuZ2UgaXRzIGludGVyZXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIpIHsKLSAgICAgIHN5bmNocm9uaXplZCAoc2VsZWN0SW50ZXJlc3RDaGFuZ2VzKSB7Ci0gICAgICAgIHNlbGVjdEludGVyZXN0Q2hhbmdlcy5hZGQoZnJhbWVCdWZmZXIpOworICAgICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CisgICAgICAgICAgc2VsZWN0KCk7CisgICAgICAgICAgcHJvY2Vzc0ludGVyZXN0Q2hhbmdlcygpOworICAgICAgICB9CisgICAgICAgIGZvciAoU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSA6IHNlbGVjdG9yLmtleXMoKSkgeworICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoc2VsZWN0aW9uS2V5KTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJydW4oKSBleGl0aW5nIGR1ZSB0byB1bmNhdWdodCBlcnJvciIsIHQpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzZWxlY3Rvci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmVycm9yKCJHb3QgYW4gSU9FeGNlcHRpb24gd2hpbGUgY2xvc2luZyBzZWxlY3RvciEiLCBlKTsKKyAgICAgICAgfQorICAgICAgICBzdG9wcGVkXyA9IHRydWU7CiAgICAgICB9Ci0gICAgICAvLyB3YWtldXAgdGhlIHNlbGVjdG9yLCBpZiBpdCdzIGN1cnJlbnRseSBibG9ja2VkLgotICAgICAgc2VsZWN0b3Iud2FrZXVwKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2VsZWN0IGFuZCBwcm9jZXNzIElPIGV2ZW50cyBhcHByb3ByaWF0ZWx5OgogICAgICAqIElmIHRoZXJlIGFyZSBjb25uZWN0aW9ucyB0byBiZSBhY2NlcHRlZCwgYWNjZXB0IHRoZW0uCiAgICAgICogSWYgdGhlcmUgYXJlIGV4aXN0aW5nIGNvbm5lY3Rpb25zIHdpdGggZGF0YSB3YWl0aW5nIHRvIGJlIHJlYWQsIHJlYWQgaXQsCi0gICAgICogYnVmZmVycmluZyB1bnRpbCBhIHdob2xlIGZyYW1lIGhhcyBiZWVuIHJlYWQuCisgICAgICogYnVmZmVyaW5nIHVudGlsIGEgd2hvbGUgZnJhbWUgaGFzIGJlZW4gcmVhZC4KICAgICAgKiBJZiB0aGVyZSBhcmUgYW55IHBlbmRpbmcgcmVzcG9uc2VzLCBidWZmZXIgdGhlbSB1bnRpbCB0aGVpciB0YXJnZXQgY2xpZW50CiAgICAgICogaXMgYXZhaWxhYmxlLCBhbmQgdGhlbiBzZW5kIHRoZSBkYXRhLgogICAgICAqLwpAQCAtMzQwLDcgKzE5MCw3IEBACiAKICAgICAgICAgICAvLyBza2lwIGlmIG5vdCB2YWxpZAogICAgICAgICAgIGlmICgha2V5LmlzVmFsaWQoKSkgewotICAgICAgICAgICAgY2xlYW51cFNlbGVjdGlvbmtleShrZXkpOworICAgICAgICAgICAgY2xlYW51cFNlbGVjdGlvbktleShrZXkpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfQogCkBAIC0zNjMsMTcgKzIxMywxMiBAQAogICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IEZyYW1lQnVmZmVycyB0aGF0IGhhdmUgc3dpdGNoZWQgdGhlaXIKLSAgICAgKiBpbnRlcmVzdCB0eXBlIGZyb20gcmVhZCB0byB3cml0ZSBvciB2aWNlIHZlcnNhLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW50ZXJlc3RDaGFuZ2VzKCkgewotICAgICAgc3luY2hyb25pemVkIChzZWxlY3RJbnRlcmVzdENoYW5nZXMpIHsKLSAgICAgICAgZm9yIChGcmFtZUJ1ZmZlciBmYiA6IHNlbGVjdEludGVyZXN0Q2hhbmdlcykgewotICAgICAgICAgIGZiLmNoYW5nZVNlbGVjdEludGVyZXN0cygpOwotICAgICAgICB9Ci0gICAgICAgIHNlbGVjdEludGVyZXN0Q2hhbmdlcy5jbGVhcigpOwotICAgICAgfQorICAgIHByb3RlY3RlZCBGcmFtZUJ1ZmZlciBjcmVhdGVGcmFtZUJ1ZmZlcihmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnMsCisgICAgICAgIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXksCisgICAgICAgIGZpbmFsIEFic3RyYWN0U2VsZWN0VGhyZWFkIHNlbGVjdFRocmVhZCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV8uaXNBc3luY1Byb2Nlc3NvcigpID8KKyAgICAgICAgICAgICAgICAgIG5ldyBBc3luY0ZyYW1lQnVmZmVyKHRyYW5zLCBzZWxlY3Rpb25LZXksIHNlbGVjdFRocmVhZCkgOgorICAgICAgICAgICAgICAgICAgbmV3IEZyYW1lQnVmZmVyKHRyYW5zLCBzZWxlY3Rpb25LZXksIHNlbGVjdFRocmVhZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zODgsMzc4ICsyMzMsMTYgQEAKICAgICAgICAgY2xpZW50S2V5ID0gY2xpZW50LnJlZ2lzdGVyU2VsZWN0b3Ioc2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9SRUFEKTsKIAogICAgICAgICAvLyBhZGQgdGhpcyBrZXkgdG8gdGhlIG1hcAotICAgICAgICBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlciA9IG5ldyBGcmFtZUJ1ZmZlcihjbGllbnQsIGNsaWVudEtleSk7Ci0gICAgICAgIGNsaWVudEtleS5hdHRhY2goZnJhbWVCdWZmZXIpOworICAgICAgICAgIEZyYW1lQnVmZmVyIGZyYW1lQnVmZmVyID0gY3JlYXRlRnJhbWVCdWZmZXIoY2xpZW50LCBjbGllbnRLZXksIFNlbGVjdEFjY2VwdFRocmVhZC50aGlzKTsKKworICAgICAgICAgIGNsaWVudEtleS5hdHRhY2goZnJhbWVCdWZmZXIpOwogICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dGUpIHsKICAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmcgYWNjZXB0aW5nLgogICAgICAgICBMT0dHRVIud2FybigiRXhjZXB0aW9uIHRyeWluZyB0byBhY2NlcHQhIiwgdHRlKTsKICAgICAgICAgdHRlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBpZiAoY2xpZW50S2V5ICE9IG51bGwpIGNsZWFudXBTZWxlY3Rpb25rZXkoY2xpZW50S2V5KTsKKyAgICAgICAgaWYgKGNsaWVudEtleSAhPSBudWxsKSBjbGVhbnVwU2VsZWN0aW9uS2V5KGNsaWVudEtleSk7CiAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgY2xpZW50LmNsb3NlKCk7CiAgICAgICB9CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogRG8gdGhlIHdvcmsgcmVxdWlyZWQgdG8gcmVhZCBmcm9tIGEgcmVhZGFibGUgY2xpZW50LiBJZiB0aGUgZnJhbWUgaXMKLSAgICAgKiBmdWxseSByZWFkLCB0aGVuIGludm9rZSB0aGUgbWV0aG9kIGNhbGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlYWQoU2VsZWN0aW9uS2V5IGtleSkgewotICAgICAgRnJhbWVCdWZmZXIgYnVmZmVyID0gKEZyYW1lQnVmZmVyKWtleS5hdHRhY2htZW50KCk7Ci0gICAgICBpZiAoYnVmZmVyLnJlYWQoKSkgewotICAgICAgICAvLyBpZiB0aGUgYnVmZmVyJ3MgZnJhbWUgcmVhZCBpcyBjb21wbGV0ZSwgaW52b2tlIHRoZSBtZXRob2QuCi0gICAgICAgIGlmIChidWZmZXIuaXNGcmFtZUZ1bGx5UmVhZCgpKSB7Ci0gICAgICAgICAgcmVxdWVzdEludm9rZShidWZmZXIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjbGVhbnVwU2VsZWN0aW9ua2V5KGtleSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGV0IGEgd3JpdGFibGUgY2xpZW50IGdldCB3cml0dGVuLCBpZiB0aGVyZSdzIGRhdGEgdG8gYmUgd3JpdHRlbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlV3JpdGUoU2VsZWN0aW9uS2V5IGtleSkgewotICAgICAgRnJhbWVCdWZmZXIgYnVmZmVyID0gKEZyYW1lQnVmZmVyKWtleS5hdHRhY2htZW50KCk7Ci0gICAgICBpZiAoIWJ1ZmZlci53cml0ZSgpKSB7Ci0gICAgICAgIGNsZWFudXBTZWxlY3Rpb25rZXkoa2V5KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyBjb25uZWN0aW9uLWNsb3NlIGNsZWFudXAgb24gYSBnaXZlbiBTZWxlY3Rpb25LZXkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBTZWxlY3Rpb25rZXkoU2VsZWN0aW9uS2V5IGtleSkgewotICAgICAgLy8gcmVtb3ZlIHRoZSByZWNvcmRzIGZyb20gdGhlIHR3byBtYXBzCi0gICAgICBGcmFtZUJ1ZmZlciBidWZmZXIgPSAoRnJhbWVCdWZmZXIpa2V5LmF0dGFjaG1lbnQoKTsKLSAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkgewotICAgICAgICAvLyBjbG9zZSB0aGUgYnVmZmVyCi0gICAgICAgIGJ1ZmZlci5jbG9zZSgpOwotICAgICAgfQotICAgICAgLy8gY2FuY2VsIHRoZSBzZWxlY3Rpb24ga2V5Ci0gICAgICBrZXkuY2FuY2VsKCk7Ci0gICAgfQotICB9IC8vIFNlbGVjdG9yVGhyZWFkCi0KLSAgLyoqCi0gICAqIENsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHNvcnQgb2Ygc3RhdGUgbWFjaGluZSBhcm91bmQgdGhlIGludGVyYWN0aW9uIHdpdGgKLSAgICogYSBjbGllbnQgYW5kIGFuIGludm9rZXIuIEl0IG1hbmFnZXMgcmVhZGluZyB0aGUgZnJhbWUgc2l6ZSBhbmQgZnJhbWUgZGF0YSwKLSAgICogZ2V0dGluZyBpdCBoYW5kZWQgb2ZmIGFzIHdyYXBwZWQgdHJhbnNwb3J0cywgYW5kIHRoZW4gdGhlIHdyaXRpbmcgb2YKLSAgICogcmVwb25zZSBkYXRhIGJhY2sgdG8gdGhlIGNsaWVudC4gSW4gdGhlIHByb2Nlc3MgaXQgbWFuYWdlcyBmbGlwcGluZyB0aGUKLSAgICogcmVhZCBhbmQgd3JpdGUgYml0cyBvbiB0aGUgc2VsZWN0aW9uIGtleSBmb3IgaXRzIGNsaWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBGcmFtZUJ1ZmZlciB7Ci0gICAgLy8KLSAgICAvLyBQb3NzaWJsZSBzdGF0ZXMgZm9yIHRoZSBGcmFtZUJ1ZmZlciBzdGF0ZSBtYWNoaW5lLgotICAgIC8vCi0gICAgLy8gaW4gdGhlIG1pZHN0IG9mIHJlYWRpbmcgdGhlIGZyYW1lIHNpemUgb2ZmIHRoZSB3aXJlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURJTkdfRlJBTUVfU0laRSA9IDE7Ci0gICAgLy8gcmVhZGluZyB0aGUgYWN0dWFsIGZyYW1lIGRhdGEgbm93LCBidXQgbm90IGFsbCB0aGUgd2F5IGRvbmUgeWV0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURJTkdfRlJBTUUgPSAyOwotICAgIC8vIGNvbXBsZXRlbHkgcmVhZCB0aGUgZnJhbWUsIHNvIGFuIGludm9jYXRpb24gY2FuIG5vdyBoYXBwZW4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9GUkFNRV9DT01QTEVURSA9IDM7Ci0gICAgLy8gd2FpdGluZyB0byBnZXQgc3dpdGNoZWQgdG8gbGlzdGVuaW5nIGZvciB3cml0ZSBldmVudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVdBSVRJTkdfUkVHSVNURVJfV1JJVEUgPSA0OwotICAgIC8vIHN0YXJ0ZWQgd3JpdGluZyByZXNwb25zZSBkYXRhLCBub3QgZnVsbHkgY29tcGxldGUgeWV0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdSSVRJTkcgPSA2OwotICAgIC8vIGFub3RoZXIgdGhyZWFkIHdhbnRzIHRoaXMgZnJhbWVidWZmZXIgdG8gZ28gYmFjayB0byByZWFkaW5nCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQgPSA3OwotICAgIC8vIHdlIHdhbnQgb3VyIHRyYW5zcG9ydCBhbmQgc2VsZWN0aW9uIGtleSBpbnZhbGlkYXRlZCBpbiB0aGUgc2VsZWN0b3IgdGhyZWFkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFXQUlUSU5HX0NMT1NFID0gODsKLQotICAgIC8vCi0gICAgLy8gSW5zdGFuY2UgdmFyaWFibGVzCi0gICAgLy8KLQotICAgIC8vIHRoZSBhY3R1YWwgdHJhbnNwb3J0IGhvb2tlZCB1cCB0byB0aGUgY2xpZW50LgotICAgIHByaXZhdGUgZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zXzsKLQotICAgIC8vIHRoZSBTZWxlY3Rpb25LZXkgdGhhdCBjb3JyZXNwb25kcyB0byBvdXIgdHJhbnNwb3J0Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5XzsKLQotICAgIC8vIHdoZXJlIGluIHRoZSBwcm9jZXNzIG9mIHJlYWRpbmcvd3JpdGluZyBhcmUgd2U/Ci0gICAgcHJpdmF0ZSBpbnQgc3RhdGVfID0gUkVBRElOR19GUkFNRV9TSVpFOwotCi0gICAgLy8gdGhlIEJ5dGVCdWZmZXIgd2UnbGwgYmUgdXNpbmcgdG8gd3JpdGUgYW5kIHJlYWQsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUKLSAgICBwcml2YXRlIEJ5dGVCdWZmZXIgYnVmZmVyXzsKLQotICAgIHByaXZhdGUgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXNwb25zZV87Ci0KLSAgICBwdWJsaWMgRnJhbWVCdWZmZXIoIGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXkpIHsKLSAgICAgIHRyYW5zXyA9IHRyYW5zOwotICAgICAgc2VsZWN0aW9uS2V5XyA9IHNlbGVjdGlvbktleTsKLSAgICAgIGJ1ZmZlcl8gPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmUgdGhpcyBGcmFtZUJ1ZmZlciBhIGNoYW5jZSB0byByZWFkLiBUaGUgc2VsZWN0b3IgbG9vcCBzaG91bGQgaGF2ZQotICAgICAqIHJlY2VpdmVkIGEgcmVhZCBldmVudCBmb3IgdGhpcyBGcmFtZUJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgbGl2ZSBvbiwgZmFsc2UgaWYgaXQgc2hvdWxkIGJlCi0gICAgICogY2xvc2VkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVhZCgpIHsKLSAgICAgIGlmIChzdGF0ZV8gPT0gUkVBRElOR19GUkFNRV9TSVpFKSB7Ci0gICAgICAgIC8vIHRyeSB0byByZWFkIHRoZSBmcmFtZSBzaXplIGNvbXBsZXRlbHkKLSAgICAgICAgaWYgKCFpbnRlcm5hbFJlYWQoKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHRoZSBmcmFtZSBzaXplIGhhcyBiZWVuIHJlYWQgY29tcGxldGVseSwgdGhlbiBwcmVwYXJlIHRvIHJlYWQgdGhlCi0gICAgICAgIC8vIGFjdHVhbCBmcmFtZS4KLSAgICAgICAgaWYgKGJ1ZmZlcl8ucmVtYWluaW5nKCkgPT0gMCkgewotICAgICAgICAgIC8vIHB1bGwgb3V0IHRoZSBmcmFtZSBzaXplIGFzIGFuIGludGVnZXIuCi0gICAgICAgICAgaW50IGZyYW1lU2l6ZSA9IGJ1ZmZlcl8uZ2V0SW50KDApOwotICAgICAgICAgIGlmIChmcmFtZVNpemUgPD0gMCkgewotICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJSZWFkIGFuIGludmFsaWQgZnJhbWUgc2l6ZSBvZiAiICsgZnJhbWVTaXplCi0gICAgICAgICAgICAgICsgIi4gQXJlIHlvdSB1c2luZyBURnJhbWVkVHJhbnNwb3J0IG9uIHRoZSBjbGllbnQgc2lkZT8iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBpZiB0aGlzIGZyYW1lIHdpbGwgYWx3YXlzIGJlIHRvbyBsYXJnZSBmb3IgdGhpcyBzZXJ2ZXIsIGxvZyB0aGUKLSAgICAgICAgICAvLyBlcnJvciBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0gICAgICAgICAgaWYgKGZyYW1lU2l6ZSA+IE1BWF9SRUFEX0JVRkZFUl9CWVRFUykgewotICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJSZWFkIGEgZnJhbWUgc2l6ZSBvZiAiICsgZnJhbWVTaXplCi0gICAgICAgICAgICAgICsgIiwgd2hpY2ggaXMgYmlnZ2VyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dhYmxlIGJ1ZmZlciBzaXplIGZvciBBTEwgY29ubmVjdGlvbnMuIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gaWYgdGhpcyBmcmFtZSB3aWxsIHB1c2ggdXMgb3ZlciB0aGUgbWVtb3J5IGxpbWl0LCB0aGVuIHJldHVybi4KLSAgICAgICAgICAvLyB3aXRoIGx1Y2ssIG1vcmUgbWVtb3J5IHdpbGwgZnJlZSB1cCB0aGUgbmV4dCB0aW1lIGFyb3VuZC4KLSAgICAgICAgICBpZiAocmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkICsgZnJhbWVTaXplID4gTUFYX1JFQURfQlVGRkVSX0JZVEVTKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBpbmNyZW1lbWVudCB0aGUgYW1vdW50IG9mIG1lbW9yeSBhbGxvY2F0ZWQgdG8gcmVhZCBidWZmZXJzCi0gICAgICAgICAgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkICs9IGZyYW1lU2l6ZTsKLQotICAgICAgICAgIC8vIHJlYWxsb2NhdGUgdGhlIHJlYWRidWZmZXIgYXMgYSBmcmFtZS1zaXplZCBidWZmZXIKLSAgICAgICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShmcmFtZVNpemUpOwotCi0gICAgICAgICAgc3RhdGVfID0gUkVBRElOR19GUkFNRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyB0aGlzIHNraXBzIHRoZSBjaGVjayBvZiBSRUFESU5HX0ZSQU1FIHN0YXRlIGJlbG93LCBzaW5jZSB3ZSBjYW4ndAotICAgICAgICAgIC8vIHBvc3NpYmx5IGdvIG9uIHRvIHRoYXQgc3RhdGUgaWYgdGhlcmUncyBkYXRhIGxlZnQgdG8gYmUgcmVhZCBhdAotICAgICAgICAgIC8vIHRoaXMgb25lLgotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRvIGZhbGwgdGhyb3VnaCBmcm9tIHRoZSBSRUFESU5HX0ZSQU1FX1NJWkUgc2VjdGlvbgotICAgICAgLy8gdG8gUkVBRElOR19GUkFNRSBpZiB0aGVyZSdzIGFscmVhZHkgc29tZSBmcmFtZSBkYXRhIGF2YWlsYWJsZSBvbmNlCi0gICAgICAvLyBSRUFESU5HX0ZSQU1FX1NJWkUgaXMgY29tcGxldGUuCi0KLSAgICAgIGlmIChzdGF0ZV8gPT0gUkVBRElOR19GUkFNRSkgewotICAgICAgICBpZiAoIWludGVybmFsUmVhZCgpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2luY2Ugd2UncmUgYWxyZWFkeSBpbiB0aGUgc2VsZWN0IGxvb3AgaGVyZSBmb3Igc3VyZSwgd2UgY2FuIGp1c3QKLSAgICAgICAgLy8gbW9kaWZ5IG91ciBzZWxlY3Rpb24ga2V5IGRpcmVjdGx5LgotICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7Ci0gICAgICAgICAgLy8gZ2V0IHJpZCBvZiB0aGUgcmVhZCBzZWxlY3QgaW50ZXJlc3RzCi0gICAgICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcygwKTsKLSAgICAgICAgICBzdGF0ZV8gPSBSRUFEX0ZSQU1FX0NPTVBMRVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGlmIHdlIGZhbGwgdGhyb3VnaCB0byB0aGlzIHBvaW50LCB0aGVuIHRoZSBzdGF0ZSBtdXN0IGJlIGludmFsaWQuCi0gICAgICBMT0dHRVIuZXJyb3IoIlJlYWQgd2FzIGNhbGxlZCBidXQgc3RhdGUgaXMgaW52YWxpZCAoIiArIHN0YXRlXyArICIpIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHdyaXRlIGl0cyBvdXRwdXQgdG8gdGhlIGZpbmFsIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZSgpIHsKLSAgICAgIGlmIChzdGF0ZV8gPT0gV1JJVElORykgewotICAgICAgICB0cnkgewotICAgICAgICAgIGlmICh0cmFuc18ud3JpdGUoYnVmZmVyXykgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiBkdXJpbmcgd3JpdGUhIiwgZSk7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UncmUgZG9uZSB3cml0aW5nLiBub3cgd2UgbmVlZCB0byBzd2l0Y2ggYmFjayB0byByZWFkaW5nLgotICAgICAgICBpZiAoYnVmZmVyXy5yZW1haW5pbmcoKSA9PSAwKSB7Ci0gICAgICAgICAgcHJlcGFyZVJlYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgTE9HR0VSLmVycm9yKCJXcml0ZSB3YXMgY2FsbGVkLCBidXQgc3RhdGUgaXMgaW52YWxpZCAoIiArIHN0YXRlXyArICIpIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHNldCBpdHMgaW50ZXJlc3QgdG8gd3JpdGUsIG9uY2UgZGF0YQotICAgICAqIGhhcyBjb21lIGluLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoYW5nZVNlbGVjdEludGVyZXN0cygpIHsKLSAgICAgIGlmIChzdGF0ZV8gPT0gQVdBSVRJTkdfUkVHSVNURVJfV1JJVEUpIHsKLSAgICAgICAgLy8gc2V0IHRoZSBPUF9XUklURSBpbnRlcmVzdAotICAgICAgICBzZWxlY3Rpb25LZXlfLmludGVyZXN0T3BzKFNlbGVjdGlvbktleS5PUF9XUklURSk7Ci0gICAgICAgIHN0YXRlXyA9IFdSSVRJTkc7Ci0gICAgICB9IGVsc2UgaWYgKHN0YXRlXyA9PSBBV0FJVElOR19SRUdJU1RFUl9SRUFEKSB7Ci0gICAgICAgIHByZXBhcmVSZWFkKCk7Ci0gICAgICB9IGVsc2UgaWYgKHN0YXRlXyA9PSBBV0FJVElOR19DTE9TRSl7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHNlbGVjdGlvbktleV8uY2FuY2VsKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0dHRVIuZXJyb3IoCi0gICAgICAgICAgImNoYW5nZVNlbGVjdEludGVyZXN0IHdhcyBjYWxsZWQsIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICgiCi0gICAgICAgICAgKyBzdGF0ZV8gKyAiKSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNodXQgdGhlIGNvbm5lY3Rpb24gZG93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgIC8vIGlmIHdlJ3JlIGJlaW5nIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IsIHdlIG1pZ2h0IGhhdmUgYWxsb2NhdGVkIGEKLSAgICAgIC8vIGJ1ZmZlciB0aGF0IHdlIG5lZWQgdG8gc3VidHJhY3QgZm9yIG91ciBtZW1vcnkgYWNjb3VudGluZy4KLSAgICAgIGlmIChzdGF0ZV8gPT0gUkVBRElOR19GUkFNRSB8fCBzdGF0ZV8gPT0gUkVBRF9GUkFNRV9DT01QTEVURSkgewotICAgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQgLT0gYnVmZmVyXy5hcnJheSgpLmxlbmd0aDsKLSAgICAgIH0KLSAgICAgIHRyYW5zXy5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoaXMgRnJhbWVCdWZmZXIgaGFzIGEgZnVsbCBmcmFtZSByZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRnJhbWVGdWxseVJlYWQoKSB7Ci0gICAgICByZXR1cm4gc3RhdGVfID09IFJFQURfRlJBTUVfQ09NUExFVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWZ0ZXIgdGhlIHByb2Nlc3NvciBoYXMgcHJvY2Vzc2VkIHRoZSBpbnZvY2F0aW9uLCB3aGF0ZXZlciB0aHJlYWQgaXMKLSAgICAgKiBtYW5hZ2luZyBpbnZvY2F0aW9ucyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBvbiB0aGlzIEZyYW1lQnVmZmVyIHNvIHdlCi0gICAgICoga25vdyBpdCdzIHRpbWUgdG8gc3RhcnQgdHJ5aW5nIHRvIHdyaXRlIGFnYWluLiBBbHNvLCBpZiBpdCB0dXJucyBvdXQKLSAgICAgKiB0aGF0IHRoZXJlIGFjdHVhbGx5IGlzbid0IGFueSBkYXRhIGluIHRoZSByZXNwb25zZSBidWZmZXIsIHdlJ2xsIHNraXAKLSAgICAgKiB0cnlpbmcgdG8gd3JpdGUgYW5kIGluc3RlYWQgZ28gYmFjayB0byByZWFkaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3BvbnNlUmVhZHkoKSB7Ci0gICAgICAvLyB0aGUgcmVhZCBidWZmZXIgaXMgZGVmaW5pdGVseSBubyBsb25nZXIgaW4gdXNlLCBzbyB3ZSB3aWxsIGRlY3JlbWVudAotICAgICAgLy8gb3VyIHJlYWQgYnVmZmVyIGNvdW50LiB3ZSBkbyB0aGlzIGhlcmUgYXMgd2VsbCBhcyBpbiBjbG9zZSBiZWNhdXNlCi0gICAgICAvLyB3ZSdkIGxpa2UgdG8gZnJlZSB0aGlzIHJlYWQgbWVtb3J5IHVwIGFzIHF1aWNrbHkgYXMgcG9zc2libGUgZm9yIG90aGVyCi0gICAgICAvLyBjbGllbnRzLgotICAgICAgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkIC09IGJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGg7Ci0KLSAgICAgIGlmIChyZXNwb25zZV8ubGVuKCkgPT0gMCkgewotICAgICAgICAvLyBnbyBzdHJhaWdodCB0byByZWFkaW5nIGFnYWluLiB0aGlzIHdhcyBwcm9iYWJseSBhbiBvbmV3YXkgbWV0aG9kCi0gICAgICAgIHN0YXRlXyA9IEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQ7Ci0gICAgICAgIGJ1ZmZlcl8gPSBudWxsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIud3JhcChyZXNwb25zZV8uZ2V0KCksIDAsIHJlc3BvbnNlXy5sZW4oKSk7Ci0KLSAgICAgICAgLy8gc2V0IHN0YXRlIHRoYXQgd2UncmUgd2FpdGluZyB0byBiZSBzd2l0Y2hlZCB0byB3cml0ZS4gd2UgZG8gdGhpcwotICAgICAgICAvLyBhc3luY2hyb25vdXNseSB0aHJvdWdoIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpIGJlY2F1c2UgdGhlcmUgaXMgYQotICAgICAgICAvLyBwb3NzaWJpbGl0eSB0aGF0IHdlJ3JlIG5vdCBpbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCB0aHVzIGN1cnJlbnRseQotICAgICAgICAvLyBibG9ja2VkIGluIHNlbGVjdCgpLiAodGhpcyBmdW5jdGlvbmFsaXR5IGlzIGluIHBsYWNlIGZvciB0aGUgc2FrZSBvZgotICAgICAgICAvLyB0aGUgSHNIYSBzZXJ2ZXIuKQotICAgICAgICBzdGF0ZV8gPSBBV0FJVElOR19SRUdJU1RFUl9XUklURTsKLSAgICAgIH0KLSAgICAgIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdHVhbGx5IGludm9rZSB0aGUgbWV0aG9kIHNpZ25pZmllZCBieSB0aGlzIEZyYW1lQnVmZmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZSgpIHsKLSAgICAgIFRUcmFuc3BvcnQgaW5UcmFucyA9IGdldElucHV0VHJhbnNwb3J0KCk7Ci0gICAgICBUUHJvdG9jb2wgaW5Qcm90ID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGluVHJhbnMpOwotICAgICAgVFByb3RvY29sIG91dFByb3QgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGdldE91dHB1dFRyYW5zcG9ydCgpKTsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluVHJhbnMpLnByb2Nlc3MoaW5Qcm90LCBvdXRQcm90KTsKLSAgICAgICAgcmVzcG9uc2VSZWFkeSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHRlKSB7Ci0gICAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gd2hpbGUgaW52b2tpbmchIiwgdGUpOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgTE9HR0VSLmVycm9yKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGlsZSBpbnZva2luZyEiLCBlKTsKLSAgICAgIH0KLSAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGJlIHJlYWNoZWQgd2hlbiB0aGVyZSBpcyBhbiBleGNlcHRpb24uCi0gICAgICBzdGF0ZV8gPSBBV0FJVElOR19DTE9TRTsKLSAgICAgIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyYXAgdGhlIHJlYWQgYnVmZmVyIGluIGEgbWVtb3J5LWJhc2VkIHRyYW5zcG9ydCBzbyBhIHByb2Nlc3NvciBjYW4gcmVhZAotICAgICAqIHRoZSBkYXRhIGl0IG5lZWRzIHRvIGhhbmRsZSBhbiBpbnZvY2F0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgVFRyYW5zcG9ydCBnZXRJbnB1dFRyYW5zcG9ydCgpIHsKLSAgICAgIHJldHVybiBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KGJ1ZmZlcl8uYXJyYXkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0cmFuc3BvcnQgdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgaW52b2tlciBmb3IgcmVzcG9uZGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRUcmFuc3BvcnQgZ2V0T3V0cHV0VHJhbnNwb3J0KCkgewotICAgICAgcmVzcG9uc2VfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgIHJldHVybiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChyZXNwb25zZV8pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGEgcmVhZCBpbnRvIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZCBzdWNjZWVkZWQsIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBvciB0aGUKLSAgICAgKiBjb25uZWN0aW9uIGNsb3NlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxSZWFkKCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKHRyYW5zXy5yZWFkKGJ1ZmZlcl8pIDwgMCkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgTE9HR0VSLndhcm4oIkdvdCBhbiBJT0V4Y2VwdGlvbiBpbiBpbnRlcm5hbFJlYWQhIiwgZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSdyZSBkb25lIHdyaXRpbmcsIHNvIHJlc2V0IG91ciBpbnRlcmVzdCBvcHMgYW5kIGNoYW5nZSBzdGF0ZSBhY2NvcmRpbmdseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZVJlYWQoKSB7Ci0gICAgICAvLyB3ZSBjYW4gc2V0IG91ciBpbnRlcmVzdCBkaXJlY3RseSB3aXRob3V0IHVzaW5nIHRoZSBxdWV1ZSBiZWNhdXNlCi0gICAgICAvLyB3ZSdyZSBpbiB0aGUgc2VsZWN0IHRocmVhZC4KLSAgICAgIHNlbGVjdGlvbktleV8uaW50ZXJlc3RPcHMoU2VsZWN0aW9uS2V5Lk9QX1JFQUQpOwotICAgICAgLy8gZ2V0IHJlYWR5IGZvciBhbm90aGVyIGdvLWFyb3VuZAotICAgICAgYnVmZmVyXyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7Ci0gICAgICBzdGF0ZV8gPSBSRUFESU5HX0ZSQU1FX1NJWkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiB0aGlzIEZyYW1lQnVmZmVyIG5lZWRzIHRvIGNoYW5nZSBpdCdzIHNlbGVjdCBpbnRlcmVzdHMgYW5kIGV4ZWN1dGlvbgotICAgICAqIG1pZ2h0IG5vdCBiZSBpbiB0aGUgc2VsZWN0IHRocmVhZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIG1ha2Ugc3VyZSB0aGUKLSAgICAgKiBpbnRlcmVzdCBjaGFuZ2UgZ2V0cyBkb25lIHdoZW4gdGhlIHNlbGVjdCB0aHJlYWQgd2FrZXMgYmFjayB1cC4gV2hlbiB0aGUKLSAgICAgKiBjdXJyZW50IHRocmVhZCBpcyB0aGUgc2VsZWN0IHRocmVhZCwgdGhlbiBpdCBqdXN0IGRvZXMgdGhlIGludGVyZXN0IGNoYW5nZQotICAgICAqIGltbWVkaWF0ZWx5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKSB7Ci0gICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBzZWxlY3RUaHJlYWRfKSB7Ci0gICAgICAgIGNoYW5nZVNlbGVjdEludGVyZXN0cygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyLnRoaXMucmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKHRoaXMpOwotICAgICAgfQotICAgIH0KLSAgfSAvLyBGcmFtZUJ1ZmZlcgotCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBPcHRpb25zIHsKLSAgICBwdWJsaWMgbG9uZyBtYXhSZWFkQnVmZmVyQnl0ZXMgPSBMb25nLk1BWF9WQUxVRTsKLQotICAgIHB1YmxpYyBPcHRpb25zKCkge30KLQotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotICAgICAgaWYgKG1heFJlYWRCdWZmZXJCeXRlcyA8PSAxMDI0KSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIllvdSBtdXN0IGFsbG9jYXRlIGF0IGxlYXN0IDFLQiB0byB0aGUgcmVhZCBidWZmZXIuIik7Ci0gICAgICB9Ci0gICAgfQotICB9CisgIH0gLy8gU2VsZWN0QWNjZXB0VGhyZWFkCiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCmluZGV4IGVhZmUwYzEuLmJhYzA2YjIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKQEAgLTMxLDYgKzMyLDY3IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyIHsKIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFyZ3M8QXJncz4geworICAgIHB1YmxpYyBBcmdzKFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICBzdXBlcih0cmFuc3BvcnQpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2ZXJBcmdzPFQgZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFyZ3M8VD4+IHsKKyAgICBmaW5hbCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydDsKKyAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKworICAgIHB1YmxpYyBBYnN0cmFjdFNlcnZlckFyZ3MoVFNlcnZlclRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgIHNlcnZlclRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBwcm9jZXNzb3JGYWN0b3J5KFRQcm9jZXNzb3JGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgIHRoaXMucHJvY2Vzc29yRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgcHJvY2Vzc29yKFRQcm9jZXNzb3IgcHJvY2Vzc29yKSB7CisgICAgICB0aGlzLnByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKTsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVCB0cmFuc3BvcnRGYWN0b3J5KFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gZmFjdG9yeTsKKyAgICAgIHRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgaW5wdXRUcmFuc3BvcnRGYWN0b3J5KFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gZmFjdG9yeTsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgIHRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgcHJvdG9jb2xGYWN0b3J5KFRQcm90b2NvbEZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgaW5wdXRQcm90b2NvbEZhY3RvcnkoVFByb3RvY29sRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gZmFjdG9yeTsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBvdXRwdXRQcm90b2NvbEZhY3RvcnkoVFByb3RvY29sRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorICB9CisKICAgLyoqCiAgICAqIENvcmUgcHJvY2Vzc29yCiAgICAqLwpAQCAtNjEsNTUgKzEyMywyMSBAQAogICAgKi8KICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKIAotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcnMuCi0gICAqLworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaXNTZXJ2aW5nOwogCi0gIHByb3RlY3RlZCBUU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOwotICB9CisgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcl87CiAKLSAgcHJvdGVjdGVkIFRTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpIHsKLSAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOwotICB9CisgIC8vIEZsYWcgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIKKyAgLy8gUGxlYXNlIHNlZSBUSFJJRlQtMTc5NSBmb3IgdGhlIHVzYWdlIG9mIHRoaXMgZmxhZworICBwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBzdG9wcGVkXyA9IGZhbHNlOwogCi0gIHByb3RlY3RlZCBUU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgewotICAgIHRoaXMocHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0gIHByb3RlY3RlZCBUU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgcHJvY2Vzc29yRmFjdG9yeV8gPSBwcm9jZXNzb3JGYWN0b3J5OwotICAgIHNlcnZlclRyYW5zcG9ydF8gPSBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgcHJvdGVjdGVkIFRTZXJ2ZXIoQWJzdHJhY3RTZXJ2ZXJBcmdzIGFyZ3MpIHsKKyAgICBwcm9jZXNzb3JGYWN0b3J5XyA9IGFyZ3MucHJvY2Vzc29yRmFjdG9yeTsKKyAgICBzZXJ2ZXJUcmFuc3BvcnRfID0gYXJncy5zZXJ2ZXJUcmFuc3BvcnQ7CisgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9IGFyZ3MuaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gYXJncy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyA9IGFyZ3MuaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IGFyZ3Mub3V0cHV0UHJvdG9jb2xGYWN0b3J5OwogICB9CiAKICAgLyoqCkBAIC0xMjMsNCArMTUxLDI3IEBACiAgICAqLwogICBwdWJsaWMgdm9pZCBzdG9wKCkge30KIAorICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZpbmcoKSB7CisgICAgcmV0dXJuIGlzU2VydmluZzsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHNldFNlcnZpbmcoYm9vbGVhbiBzZXJ2aW5nKSB7CisgICAgaXNTZXJ2aW5nID0gc2VydmluZzsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFNlcnZlckV2ZW50SGFuZGxlcihUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcikgeworICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CisgIH0KKworICBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKSB7CisgICAgcmV0dXJuIGV2ZW50SGFuZGxlcl87CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBnZXRTaG91bGRTdG9wKCkgeworICAgIHJldHVybiB0aGlzLnN0b3BwZWRfOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U2hvdWxkU3RvcChib29sZWFuIHNob3VsZFN0b3ApIHsKKyAgICB0aGlzLnN0b3BwZWRfID0gc2hvdWxkU3RvcDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDY5YjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisgKiBJbnRlcmZhY2UgdGhhdCBjYW4gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIgY29yZS4gVG8KKyAqIHVzZSB0aGlzIHlvdSBzaG91bGQgc3ViY2xhc3MgaXQgYW5kIGltcGxlbWVudCB0aGUgbWV0aG9kcyB0aGF0IHlvdSBjYXJlCisgKiBhYm91dC4gWW91ciBzdWJjbGFzcyBjYW4gYWxzbyBzdG9yZSBsb2NhbCBkYXRhIHRoYXQgeW91IG1heSBjYXJlIGFib3V0LAorICogc3VjaCBhcyBhZGRpdGlvbmFsICJhcmd1bWVudHMiIHRvIHRoZXNlIG1ldGhvZHMgKHN0b3JlZCBpbiB0aGUgb2JqZWN0CisgKiBpbnN0YW5jZSdzIHN0YXRlKS4KKyAqLworcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKworICAvKioKKyAgICogQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucy4KKyAgICovCisgIHZvaWQgcHJlU2VydmUoKTsKKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCisgICAqLworICBTZXJ2ZXJDb250ZXh0IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIKKyAgICogY29udGV4dC4KKyAgICovCisgIHZvaWQgZGVsZXRlQ29udGV4dChTZXJ2ZXJDb250ZXh0IHNlcnZlckNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dCk7CisKKyAgLyoqCisgICAqIENhbGxlZCB3aGVuIGEgY2xpZW50IGlzIGFib3V0IHRvIGNhbGwgdGhlIHByb2Nlc3Nvci4KKyAgICovCisgIHZvaWQgcHJvY2Vzc0NvbnRleHQoU2VydmVyQ29udGV4dCBzZXJ2ZXJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCwgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmxldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWI5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyAqIFNlcnZsZXQgaW1wbGVtZW50YXRpb24gY2xhc3MgVGhyaWZ0U2VydmVyCisgKi8KK3B1YmxpYyBjbGFzcyBUU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICBwcml2YXRlIGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yOworCisgIHByaXZhdGUgZmluYWwgVFByb3RvY29sRmFjdG9yeSBpblByb3RvY29sRmFjdG9yeTsKKworICBwcml2YXRlIGZpbmFsIFRQcm90b2NvbEZhY3Rvcnkgb3V0UHJvdG9jb2xGYWN0b3J5OworCisgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBjdXN0b21IZWFkZXJzOworCisgIC8qKgorICAgKiBAc2VlIEh0dHBTZXJ2bGV0I0h0dHBTZXJ2bGV0KCkKKyAgICovCisgIHB1YmxpYyBUU2VydmxldChUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBpblByb3RvY29sRmFjdG9yeSwKKyAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0UHJvdG9jb2xGYWN0b3J5KSB7CisgICAgc3VwZXIoKTsKKyAgICB0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICB0aGlzLmluUHJvdG9jb2xGYWN0b3J5ID0gaW5Qcm90b2NvbEZhY3Rvcnk7CisgICAgdGhpcy5vdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgdGhpcy5jdXN0b21IZWFkZXJzID0gbmV3IEFycmF5TGlzdDxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpOworICB9CisKKyAgLyoqCisgICAqIEBzZWUgSHR0cFNlcnZsZXQjSHR0cFNlcnZsZXQoKQorICAgKi8KKyAgcHVibGljIFRTZXJ2bGV0KFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgeworICAgIHRoaXMocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgIH0KKworICAvKioKKyAgICogQHNlZSBIdHRwU2VydmxldCNkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UKKyAgICogICAgICByZXNwb25zZSkKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgVFRyYW5zcG9ydCBpblRyYW5zcG9ydCA9IG51bGw7CisgICAgVFRyYW5zcG9ydCBvdXRUcmFuc3BvcnQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi94LXRocmlmdCIpOworCisgICAgICBpZiAobnVsbCAhPSB0aGlzLmN1c3RvbUhlYWRlcnMpIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGhlYWRlciA6IHRoaXMuY3VzdG9tSGVhZGVycykgeworICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcihoZWFkZXIuZ2V0S2V5KCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgSW5wdXRTdHJlYW0gaW4gPSByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7CisgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRJT1N0cmVhbVRyYW5zcG9ydChpbiwgb3V0KTsKKyAgICAgIGluVHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgb3V0VHJhbnNwb3J0ID0gdHJhbnNwb3J0OworCisgICAgICBUUHJvdG9jb2wgaW5Qcm90b2NvbCA9IGluUHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGluVHJhbnNwb3J0KTsKKyAgICAgIFRQcm90b2NvbCBvdXRQcm90b2NvbCA9IG91dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdXRUcmFuc3BvcnQpOworCisgICAgICBwcm9jZXNzb3IucHJvY2VzcyhpblByb3RvY29sLCBvdXRQcm90b2NvbCk7CisgICAgICBvdXQuZmx1c2goKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEBzZWUgSHR0cFNlcnZsZXQjZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UKKyAgICogICAgICByZXNwb25zZSkKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBkb1Bvc3QocmVxdWVzdCwgcmVzcG9uc2UpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkQ3VzdG9tSGVhZGVyKGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgIHRoaXMuY3VzdG9tSGVhZGVycy5hZGQobmV3IE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4oKSB7CisgICAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgIH0KKworICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUhlYWRlcnMoQ29sbGVjdGlvbjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBoZWFkZXJzKSB7CisgICAgdGhpcy5jdXN0b21IZWFkZXJzLmNsZWFyKCk7CisgICAgdGhpcy5jdXN0b21IZWFkZXJzLmFkZEFsbChoZWFkZXJzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuamF2YQppbmRleCA1ODU4NjVjLi5lODE1YjJjIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuamF2YQpAQCAtMjEsMTQgKzIxLDkgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNlcnZlclRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC00MCw1NyArMzUsMTEgQEAKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVFNpbXBsZVNlcnZlci5jbGFzcy5nZXROYW1lKCkpOwogCi0gIHByaXZhdGUgYm9vbGVhbiBzdG9wcGVkXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkgewotICAgIHN1cGVyKG5ldyBUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQpOworICBwdWJsaWMgVFNpbXBsZVNlcnZlcihBYnN0cmFjdFNlcnZlckFyZ3MgYXJncykgeworICAgIHN1cGVyKGFyZ3MpOwogICB9CiAKLSAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgewotICAgIHN1cGVyKG5ldyBUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKLSAgICBzdXBlcihuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQpOwotICB9Ci0KLSAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgc3VwZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0KICAgcHVibGljIHZvaWQgc2VydmUoKSB7Ci0gICAgc3RvcHBlZF8gPSBmYWxzZTsKICAgICB0cnkgewogICAgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewpAQCAtOTgsNiArNDcsMTMgQEAKICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50CisgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgZXZlbnRIYW5kbGVyXy5wcmVTZXJ2ZSgpOworICAgIH0KKworICAgIHNldFNlcnZpbmcodHJ1ZSk7CisKICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CiAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IG51bGw7CiAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IG51bGw7CkBAIC0xMDUsNiArNjEsNyBAQAogICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwogICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwogICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgIFNlcnZlckNvbnRleHQgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOwogICAgICAgdHJ5IHsKICAgICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0Xy5hY2NlcHQoKTsKICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CkBAIC0xMTMsNyArNzAsMTcgQEAKICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50KTsKICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICB3aGlsZSAocHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7fQorICAgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gZXZlbnRIYW5kbGVyXy5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICB9CisgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQsIG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgpAQCAtMTI3LDYgKzk0LDEwIEBACiAgICAgICAgIH0KICAgICAgIH0KIAorICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgICBldmVudEhhbmRsZXJfLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgIH0KKwogICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpIHsKICAgICAgICAgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKICAgICAgIH0KQEAgLTEzNiw2ICsxMDcsNyBAQAogICAgICAgfQogCiAgICAgfQorICAgIHNldFNlcnZpbmcoZmFsc2UpOwogICB9CiAKICAgcHVibGljIHZvaWQgc3RvcCgpIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YQppbmRleCA1YjQ0MmEwLi4xNjk3YWQ2IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhCkBAIC0xOSwyNiArMTksMjMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2VydmVyVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNlcnZlclRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCiAKIC8qKgogICogU2VydmVyIHdoaWNoIHVzZXMgSmF2YSdzIGJ1aWx0IGluIFRocmVhZFBvb2wgbWFuYWdlbWVudCB0byBzcGF3biBvZmYKQEAgLTQ2LDE0NCArNDMsMTg3IEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyIHsKLQogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVFRocmVhZFBvb2xTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFyZ3M8QXJncz4geworICAgIHB1YmxpYyBpbnQgbWluV29ya2VyVGhyZWFkcyA9IDU7CisgICAgcHVibGljIGludCBtYXhXb3JrZXJUaHJlYWRzID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgcHVibGljIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2U7CisgICAgcHVibGljIGludCBzdG9wVGltZW91dFZhbCA9IDYwOworICAgIHB1YmxpYyBUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTOworICAgIHB1YmxpYyBpbnQgcmVxdWVzdFRpbWVvdXQgPSAyMDsKKyAgICBwdWJsaWMgVGltZVVuaXQgcmVxdWVzdFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKKyAgICBwdWJsaWMgaW50IGJlQmFja29mZlNsb3RMZW5ndGggPSAxMDA7CisgICAgcHVibGljIFRpbWVVbml0IGJlQmFja29mZlNsb3RMZW5ndGhVbml0ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTOworCisgICAgcHVibGljIEFyZ3MoVFNlcnZlclRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgbWluV29ya2VyVGhyZWFkcyhpbnQgbikgeworICAgICAgbWluV29ya2VyVGhyZWFkcyA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBtYXhXb3JrZXJUaHJlYWRzKGludCBuKSB7CisgICAgICBtYXhXb3JrZXJUaHJlYWRzID0gbjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHN0b3BUaW1lb3V0VmFsKGludCBuKSB7CisgICAgICBzdG9wVGltZW91dFZhbCA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFVuaXQoVGltZVVuaXQgdHUpIHsKKyAgICAgIHN0b3BUaW1lb3V0VW5pdCA9IHR1OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgcmVxdWVzdFRpbWVvdXQoaW50IG4pIHsKKyAgICAgIHJlcXVlc3RUaW1lb3V0ID0gbjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHJlcXVlc3RUaW1lb3V0VW5pdChUaW1lVW5pdCB0dSkgeworICAgICAgcmVxdWVzdFRpbWVvdXRVbml0ID0gdHU7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgLy9CaW5hcnkgZXhwb25lbnRpYWwgYmFja29mZiBzbG90IGxlbmd0aAorICAgIHB1YmxpYyBBcmdzIGJlQmFja29mZlNsb3RMZW5ndGgoaW50IG4pIHsKKyAgICAgIGJlQmFja29mZlNsb3RMZW5ndGggPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLy9CaW5hcnkgZXhwb25lbnRpYWwgYmFja29mZiBzbG90IHRpbWUgdW5pdAorICAgIHB1YmxpYyBBcmdzIGJlQmFja29mZlNsb3RMZW5ndGhVbml0KFRpbWVVbml0IHR1KSB7CisgICAgICBiZUJhY2tvZmZTbG90TGVuZ3RoVW5pdCA9IHR1OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgZXhlY3V0b3JTZXJ2aWNlKEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UpIHsKKyAgICAgIHRoaXMuZXhlY3V0b3JTZXJ2aWNlID0gZXhlY3V0b3JTZXJ2aWNlOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICB9CisKICAgLy8gRXhlY3V0b3Igc2VydmljZSBmb3IgaGFuZGxpbmcgY2xpZW50IGNvbm5lY3Rpb25zCiAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZV87CiAKLSAgLy8gRmxhZyBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlcgotICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZF87CisgIHByaXZhdGUgZmluYWwgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0OwogCi0gIC8vIFNlcnZlciBvcHRpb25zCi0gIHByaXZhdGUgT3B0aW9ucyBvcHRpb25zXzsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0b3BUaW1lb3V0VmFsOwogCi0gIC8vIEN1c3RvbWl6YWJsZSBzZXJ2ZXIgb3B0aW9ucwotICBwdWJsaWMgc3RhdGljIGNsYXNzIE9wdGlvbnMgewotICAgIHB1YmxpYyBpbnQgbWluV29ya2VyVGhyZWFkcyA9IDU7Ci0gICAgcHVibGljIGludCBtYXhXb3JrZXJUaHJlYWRzID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgcHVibGljIGludCBzdG9wVGltZW91dFZhbCA9IDYwOwotICAgIHB1YmxpYyBUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTOworICBwcml2YXRlIGZpbmFsIFRpbWVVbml0IHJlcXVlc3RUaW1lb3V0VW5pdDsKKworICBwcml2YXRlIGZpbmFsIGxvbmcgcmVxdWVzdFRpbWVvdXQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIGJlQmFja29mZlNsb3RJbk1pbGxpczsKKworICBwcml2YXRlIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKworICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoQXJncyBhcmdzKSB7CisgICAgc3VwZXIoYXJncyk7CisKKyAgICBzdG9wVGltZW91dFVuaXQgPSBhcmdzLnN0b3BUaW1lb3V0VW5pdDsKKyAgICBzdG9wVGltZW91dFZhbCA9IGFyZ3Muc3RvcFRpbWVvdXRWYWw7CisgICAgcmVxdWVzdFRpbWVvdXRVbml0ID0gYXJncy5yZXF1ZXN0VGltZW91dFVuaXQ7CisgICAgcmVxdWVzdFRpbWVvdXQgPSBhcmdzLnJlcXVlc3RUaW1lb3V0OworICAgIGJlQmFja29mZlNsb3RJbk1pbGxpcyA9IGFyZ3MuYmVCYWNrb2ZmU2xvdExlbmd0aFVuaXQudG9NaWxsaXMoYXJncy5iZUJhY2tvZmZTbG90TGVuZ3RoKTsKKworICAgIGV4ZWN1dG9yU2VydmljZV8gPSBhcmdzLmV4ZWN1dG9yU2VydmljZSAhPSBudWxsID8KKyAgICAgICAgYXJncy5leGVjdXRvclNlcnZpY2UgOiBjcmVhdGVEZWZhdWx0RXhlY3V0b3JTZXJ2aWNlKGFyZ3MpOwogICB9CiAKLSAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKLSAgfQotCi0gIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7Ci0gIH0KLQotICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgdGhpcyhuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgIHN1cGVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk7Ci0gICAgb3B0aW9uc18gPSBuZXcgT3B0aW9ucygpOwotICAgIGV4ZWN1dG9yU2VydmljZV8gPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOwotICB9Ci0KLSAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgdGhpcyhuZXcgVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIG9wdGlvbnMpOwotICB9Ci0KLSAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICBzdXBlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwotCi0gICAgZXhlY3V0b3JTZXJ2aWNlXyA9IG51bGw7Ci0KKyAgcHJpdmF0ZSBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIGNyZWF0ZURlZmF1bHRFeGVjdXRvclNlcnZpY2UoQXJncyBhcmdzKSB7CiAgICAgU3luY2hyb25vdXNRdWV1ZTxSdW5uYWJsZT4gZXhlY3V0b3JRdWV1ZSA9CiAgICAgICBuZXcgU3luY2hyb25vdXNRdWV1ZTxSdW5uYWJsZT4oKTsKLQotICAgIGV4ZWN1dG9yU2VydmljZV8gPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKG9wdGlvbnMubWluV29ya2VyVGhyZWFkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1heFdvcmtlclRocmVhZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvclF1ZXVlKTsKLQotICAgIG9wdGlvbnNfID0gb3B0aW9uczsKKyAgICByZXR1cm4gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihhcmdzLm1pbldvcmtlclRocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5tYXhXb3JrZXJUaHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RvcFRpbWVvdXRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zdG9wVGltZW91dFVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JRdWV1ZSk7CiAgIH0KIAotCi0gIHB1YmxpYyB2b2lkIHNlcnZlKCkgewotICAgIHRyeSB7CisgIHByb3RlY3RlZCBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgeworICAgIHJldHVybiBleGVjdXRvclNlcnZpY2VfOworICB9CisgIAorICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmVTZXJ2ZSgpIHsKKyAgCXRyeSB7CiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOwogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CiAgICAgICBMT0dHRVIuZXJyb3IoIkVycm9yIG9jY3VycmVkIGR1cmluZyBsaXN0ZW5pbmcuIiwgdHR4KTsKLSAgICAgIHJldHVybjsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50CisgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgZXZlbnRIYW5kbGVyXy5wcmVTZXJ2ZSgpOworICAgIH0KICAgICBzdG9wcGVkXyA9IGZhbHNlOworICAgIHNldFNlcnZpbmcodHJ1ZSk7CisgICAgCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKKyAgCWlmICghcHJlU2VydmUoKSkgeworICAJCXJldHVybjsKKyAgCX0KKworICAJZXhlY3V0ZSgpOworICAJd2FpdEZvclNodXRkb3duKCk7CisgICAgCisgICAgc2V0U2VydmluZyhmYWxzZSk7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoKSB7CisgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CiAgICAgd2hpbGUgKCFzdG9wcGVkXykgewotICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CiAgICAgICB0cnkgewogICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KCk7CiAgICAgICAgIFdvcmtlclByb2Nlc3Mgd3AgPSBuZXcgV29ya2VyUHJvY2VzcyhjbGllbnQpOwotICAgICAgICBleGVjdXRvclNlcnZpY2VfLmV4ZWN1dGUod3ApOworCisgICAgICAgIGludCByZXRyeUNvdW50ID0gMDsKKyAgICAgICAgbG9uZyByZW1haW5UaW1lSW5NaWxsaXMgPSByZXF1ZXN0VGltZW91dFVuaXQudG9NaWxsaXMocmVxdWVzdFRpbWVvdXQpOworICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZV8uZXhlY3V0ZSh3cCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgIHJldHJ5Q291bnQrKzsKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluVGltZUluTWlsbGlzID4gMCkgeworICAgICAgICAgICAgICAgICAgLy9kbyBhIHRydW5jYXRlZCAyMCBiaW5hcnkgZXhwb25lbnRpYWwgYmFja29mZiBzbGVlcAorICAgICAgICAgICAgICAgICAgbG9uZyBzbGVlcFRpbWVJbk1pbGxpcyA9ICgobG9uZykgKHJhbmRvbS5uZXh0RG91YmxlKCkgKgorICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCBNYXRoLm1pbihyZXRyeUNvdW50LCAyMCkpKSkgKiBiZUJhY2tvZmZTbG90SW5NaWxsaXM7CisgICAgICAgICAgICAgICAgICBzbGVlcFRpbWVJbk1pbGxpcyA9IE1hdGgubWluKHNsZWVwVGltZUluTWlsbGlzLCByZW1haW5UaW1lSW5NaWxsaXMpOworICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLnNsZWVwKHNsZWVwVGltZUluTWlsbGlzKTsKKyAgICAgICAgICAgICAgICAgIHJlbWFpblRpbWVJbk1pbGxpcyA9IHJlbWFpblRpbWVJbk1pbGxpcyAtIHNsZWVwVGltZUluTWlsbGlzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgIHdwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJUYXNrIGhhcyBiZWVuIHJlamVjdGVkIGJ5IEV4ZWN1dG9yU2VydmljZSAiICsgcmV0cnlDb3VudAorICAgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lcyB0aWxsIHRpbWVkb3V0LCByZWFzb246ICIgKyB0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvIHBsYWNlIGNsaWVudCBvbiBleGVjdXRvciBxdWV1ZS4iKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBFcnJvcikgeworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIkV4ZWN1dG9yU2VydmljZSB0aHJldyBlcnJvcjogIiArIHQsIHQpOworICAgICAgICAgICAgICB0aHJvdyAoRXJyb3IpdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vZm9yIG90aGVyIHBvc3NpYmxlIHJ1bnRpbWUgZXJyb3JzIGZyb20gRXhlY3V0b3JTZXJ2aWNlLCBzaG91bGQgYWxzbyBub3Qga2lsbCBzZXJ2ZQorICAgICAgICAgICAgICBMT0dHRVIud2FybigiRXhlY3V0b3JTZXJ2aWNlIHRocmV3IGVycm9yOiAiICsgdCwgdCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKICAgICAgICAgaWYgKCFzdG9wcGVkXykgewogICAgICAgICAgICsrZmFpbHVyZUNvdW50OwpAQCAtMTkxLDE0ICsyMzEsMTYgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLQotICAgIGV4ZWN1dG9yU2VydmljZV8uc2h1dGRvd24oKTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNodXRkb3duKCkgeworICAJZXhlY3V0b3JTZXJ2aWNlXy5zaHV0ZG93bigpOwogCiAgICAgLy8gTG9vcCB1bnRpbCBhd2FpdFRlcm1pbmF0aW9uIGZpbmFsbHkgZG9lcyByZXR1cm4gd2l0aG91dCBhIGludGVycnVwdGVkCiAgICAgLy8gZXhjZXB0aW9uLiBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGVuIHdlJ2xsIHNodXQgZG93biBwcmVtYXR1cmVseS4gV2Ugd2FudAogICAgIC8vIHRvIGxldCB0aGUgZXhlY3V0b3JTZXJ2aWNlIGNsZWFyIGl0J3MgdGFzayBxdWV1ZSwgY2xvc2luZyBjbGllbnQgc29ja2V0cwogICAgIC8vIGFwcHJvcHJpYXRlbHkuCi0gICAgbG9uZyB0aW1lb3V0TVMgPSBvcHRpb25zXy5zdG9wVGltZW91dFVuaXQudG9NaWxsaXMob3B0aW9uc18uc3RvcFRpbWVvdXRWYWwpOworICAgIGxvbmcgdGltZW91dE1TID0gc3RvcFRpbWVvdXRVbml0LnRvTWlsbGlzKHN0b3BUaW1lb3V0VmFsKTsKICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgIHdoaWxlICh0aW1lb3V0TVMgPj0gMCkgewogICAgICAgdHJ5IHsKQEAgLTI0MiwyOSArMjg0LDYyIEBACiAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CiAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CiAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworCisgICAgICBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlciA9IG51bGw7CisgICAgICBTZXJ2ZXJDb250ZXh0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKwogICAgICAgdHJ5IHsKICAgICAgICAgcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGNsaWVudF8pOwogICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudF8pOwogICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50Xyk7CiAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwogICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKworICAgICAgICBldmVudEhhbmRsZXIgPSBnZXRFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBldmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgIH0KICAgICAgICAgLy8gd2UgY2hlY2sgc3RvcHBlZF8gZmlyc3QgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBiZSBzaHV0dGluZwogICAgICAgICAvLyBkb3duLiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgZ3JhY2VmdWwgc2h1dGRvd24uCi0gICAgICAgIHdoaWxlICghc3RvcHBlZF8gJiYgcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKSB7fQotICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgICAgLy8gQXNzdW1lIHRoZSBjbGllbnQgZGllZCBhbmQgY29udGludWUgc2lsZW50bHkKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKworICAgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgIGV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQsIG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHN0b3BwZWRfIHx8ICFwcm9jZXNzb3IucHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdHgpIHsKICAgICAgICAgTE9HR0VSLmVycm9yKCJUaHJpZnQgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB0eCk7CiAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewotICAgICAgICBMT0dHRVIuZXJyb3IoIkVycm9yIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIiwgeCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgLy8gV2UnbGwgdXN1YWxseSByZWNlaXZlIFJ1bnRpbWVFeGNlcHRpb24gdHlwZXMgaGVyZQorICAgICAgICAvLyBOZWVkIHRvIHVud3JhcCB0byBhc2NlcnRhaW4gcmVhbCBjYXVzaW5nIGV4Y2VwdGlvbiBiZWZvcmUgd2UgY2hvb3NlIHRvIGlnbm9yZQorICAgICAgICBUaHJvd2FibGUgcmVhbENhdXNlID0geC5nZXRDYXVzZSgpOworICAgICAgICAvLyBJZ25vcmUgZXJyLWxvZ2dpbmcgYWxsIHRyYW5zcG9ydC1sZXZlbC90eXBlIGV4Y2VwdGlvbnMKKyAgICAgICAgaWYgKChyZWFsQ2F1c2UgIT0gbnVsbCAmJiByZWFsQ2F1c2UgaW5zdGFuY2VvZiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgfHwgKHggaW5zdGFuY2VvZiBUVHJhbnNwb3J0RXhjZXB0aW9uKSkgeworICAgICAgICAgIExPR0dFUi5kZWJ1ZygKKyAgICAgICAgICAgICAgIlJlY2VpdmVkIFRUcmFuc3BvcnRFeGNlcHRpb24gZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4gSWdub3JpbmcuIiwKKyAgICAgICAgICAgICAgeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gTG9nIHRoZSBleGNlcHRpb24gYXQgZXJyb3IgbGV2ZWwgYW5kIGNvbnRpbnVlCisgICAgICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHgpOworICAgICAgICB9CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50Xy5pc09wZW4oKSkgeworICAgICAgICAgIGNsaWVudF8uY2xvc2UoKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODUwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKQEAgLTAsMCArMSw3NDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RhYmxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIEEgSGFsZi1TeW5jL0hhbGYtQXN5bmMgc2VydmVyIHdpdGggYSBzZXBhcmF0ZSBwb29sIG9mIHRocmVhZHMgdG8gaGFuZGxlCisgKiBub24tYmxvY2tpbmcgSS9PLiBBY2NlcHRzIGFyZSBoYW5kbGVkIG9uIGEgc2luZ2xlIHRocmVhZCwgYW5kIGEgY29uZmlndXJhYmxlCisgKiBudW1iZXIgb2Ygbm9uYmxvY2tpbmcgc2VsZWN0b3IgdGhyZWFkcyBtYW5hZ2UgcmVhZGluZyBhbmQgd3JpdGluZyBvZiBjbGllbnQKKyAqIGNvbm5lY3Rpb25zLiBBIHN5bmNocm9ub3VzIHdvcmtlciB0aHJlYWQgcG9vbCBoYW5kbGVzIHByb2Nlc3Npbmcgb2YgcmVxdWVzdHMuCisgKgorICogUGVyZm9ybXMgYmV0dGVyIHRoYW4gVE5vbmJsb2NraW5nU2VydmVyL1RIc0hhU2VydmVyIGluIG11bHRpLWNvcmUKKyAqIGVudmlyb25tZW50cyB3aGVuIHRoZSB0aGUgYm90dGxlbmVjayBpcyBDUFUgb24gdGhlIHNpbmdsZSBzZWxlY3RvciB0aHJlYWQKKyAqIGhhbmRsaW5nIEkvTy4gSW4gYWRkaXRpb24sIGJlY2F1c2UgdGhlIGFjY2VwdCBoYW5kbGluZyBpcyBkZWNvdXBsZWQgZnJvbQorICogcmVhZHMvd3JpdGVzIGFuZCBpbnZvY2F0aW9uLCB0aGUgc2VydmVyIGhhcyBiZXR0ZXIgYWJpbGl0eSB0byBoYW5kbGUgYmFjay0KKyAqIHByZXNzdXJlIGZyb20gbmV3IGNvbm5lY3Rpb25zIChlLmcuIHN0b3AgYWNjZXB0aW5nIHdoZW4gYnVzeSkuCisgKgorICogTGlrZSBUTm9uYmxvY2tpbmdTZXJ2ZXIsIGl0IHJlbGllcyBvbiB0aGUgdXNlIG9mIFRGcmFtZWRUcmFuc3BvcnQuCisgKi8KK3B1YmxpYyBjbGFzcyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlciBleHRlbmRzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxBcmdzPiB7CisKKyAgICAvKiogVGhlIG51bWJlciBvZiB0aHJlYWRzIGZvciBzZWxlY3Rpbmcgb24gYWxyZWFkeS1hY2NlcHRlZCBjb25uZWN0aW9ucyAqLworICAgIHB1YmxpYyBpbnQgc2VsZWN0b3JUaHJlYWRzID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgZXhlY3V0b3Igc2VydmljZSAoaWYgbm9uZSBpcyBzcGVjaWZpZWQpIHRoYXQgd2lsbCBoYW5kbGUKKyAgICAgKiBpbnZvY2F0aW9ucy4gVGhpcyBtYXkgYmUgc2V0IHRvIDAsIGluIHdoaWNoIGNhc2UgaW52b2NhdGlvbnMgd2lsbCBiZQorICAgICAqIGhhbmRsZWQgZGlyZWN0bHkgb24gdGhlIHNlbGVjdG9yIHRocmVhZHMgKGFzIGlzIGluIFROb25ibG9ja2luZ1NlcnZlcikKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB3b3JrZXJUaHJlYWRzID0gNTsKKyAgICAvKiogVGltZSB0byB3YWl0IGZvciBzZXJ2ZXIgdG8gc3RvcCBncmFjZWZ1bGx5ICovCisgICAgcHJpdmF0ZSBpbnQgc3RvcFRpbWVvdXRWYWwgPSA2MDsKKyAgICBwcml2YXRlIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7CisgICAgLyoqIFRoZSBFeGVjdXRvclNlcnZpY2UgZm9yIGhhbmRsaW5nIGRpc3BhdGNoZWQgcmVxdWVzdHMgKi8KKyAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBudWxsOworICAgIC8qKgorICAgICAqIFRoZSBzaXplIG9mIHRoZSBibG9ja2luZyBxdWV1ZSBwZXIgc2VsZWN0b3IgdGhyZWFkIGZvciBwYXNzaW5nIGFjY2VwdGVkCisgICAgICogY29ubmVjdGlvbnMgdG8gdGhlIHNlbGVjdG9yIHRocmVhZAorICAgICAqLworICAgIHByaXZhdGUgaW50IGFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBzdHJhdGVneSBmb3IgaGFuZGxpbmcgbmV3IGFjY2VwdGVkIGNvbm5lY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBBY2NlcHRQb2xpY3kgeworICAgICAgLyoqCisgICAgICAgKiBSZXF1aXJlIGFjY2VwdGVkIGNvbm5lY3Rpb24gcmVnaXN0cmF0aW9uIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGV4ZWN1dG9yLgorICAgICAgICogSWYgdGhlIHdvcmtlciBwb29sIGlzIHNhdHVyYXRlZCwgZnVydGhlciBhY2NlcHRzIHdpbGwgYmUgY2xvc2VkCisgICAgICAgKiBpbW1lZGlhdGVseS4gU2xpZ2h0bHkgaW5jcmVhc2VzIGxhdGVuY3kgZHVlIHRvIGFuIGV4dHJhIHNjaGVkdWxpbmcuCisgICAgICAgKi8KKyAgICAgIEZBSVJfQUNDRVBULAorICAgICAgLyoqCisgICAgICAgKiBIYW5kbGUgdGhlIGFjY2VwdHMgYXMgZmFzdCBhcyBwb3NzaWJsZSwgZGlzcmVnYXJkaW5nIHRoZSBzdGF0dXMgb2YgdGhlCisgICAgICAgKiBleGVjdXRvciBzZXJ2aWNlLgorICAgICAgICovCisgICAgICBGQVNUX0FDQ0VQVAorICAgIH0KKworICAgIHByaXZhdGUgQWNjZXB0UG9saWN5IGFjY2VwdFBvbGljeSA9IEFjY2VwdFBvbGljeS5GQVNUX0FDQ0VQVDsKKworICAgIHB1YmxpYyBBcmdzKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgIHN1cGVyKHRyYW5zcG9ydCk7CisgICAgfQorCisgICAgcHVibGljIEFyZ3Mgc2VsZWN0b3JUaHJlYWRzKGludCBpKSB7CisgICAgICBzZWxlY3RvclRocmVhZHMgPSBpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTZWxlY3RvclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gc2VsZWN0b3JUaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHdvcmtlclRocmVhZHMoaW50IGkpIHsKKyAgICAgIHdvcmtlclRocmVhZHMgPSBpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXb3JrZXJUaHJlYWRzKCkgeworICAgICAgcmV0dXJuIHdvcmtlclRocmVhZHM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdG9wVGltZW91dFZhbCgpIHsKKyAgICAgIHJldHVybiBzdG9wVGltZW91dFZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFZhbChpbnQgc3RvcFRpbWVvdXRWYWwpIHsKKyAgICAgIHRoaXMuc3RvcFRpbWVvdXRWYWwgPSBzdG9wVGltZW91dFZhbDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUaW1lVW5pdCBnZXRTdG9wVGltZW91dFVuaXQoKSB7CisgICAgICByZXR1cm4gc3RvcFRpbWVvdXRVbml0OworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHN0b3BUaW1lb3V0VW5pdChUaW1lVW5pdCBzdG9wVGltZW91dFVuaXQpIHsKKyAgICAgIHRoaXMuc3RvcFRpbWVvdXRVbml0ID0gc3RvcFRpbWVvdXRVbml0OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICByZXR1cm4gZXhlY3V0b3JTZXJ2aWNlOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIGV4ZWN1dG9yU2VydmljZShFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZSA9IGV4ZWN1dG9yU2VydmljZTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXB0UXVldWVTaXplUGVyVGhyZWFkKCkgeworICAgICAgcmV0dXJuIGFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyBhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQoaW50IGFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZCkgeworICAgICAgdGhpcy5hY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQgPSBhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQ7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQWNjZXB0UG9saWN5IGdldEFjY2VwdFBvbGljeSgpIHsKKyAgICAgIHJldHVybiBhY2NlcHRQb2xpY3k7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgYWNjZXB0UG9saWN5KEFjY2VwdFBvbGljeSBhY2NlcHRQb2xpY3kpIHsKKyAgICAgIHRoaXMuYWNjZXB0UG9saWN5ID0gYWNjZXB0UG9saWN5OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICBpZiAoc2VsZWN0b3JUaHJlYWRzIDw9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3JUaHJlYWRzIG11c3QgYmUgcG9zaXRpdmUuIik7CisgICAgICB9CisgICAgICBpZiAod29ya2VyVGhyZWFkcyA8IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid29ya2VyVGhyZWFkcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4iKTsKKyAgICAgIH0KKyAgICAgIGlmIChhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQgPD0gMCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NlcHRRdWV1ZVNpemVQZXJUaHJlYWQgbXVzdCBiZSBwb3NpdGl2ZS4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBUaGUgdGhyZWFkIGhhbmRsaW5nIGFsbCBhY2NlcHRzCisgIHByaXZhdGUgQWNjZXB0VGhyZWFkIGFjY2VwdFRocmVhZDsKKworICAvLyBUaHJlYWRzIGhhbmRsaW5nIGV2ZW50cyBvbiBjbGllbnQgdHJhbnNwb3J0cworICBwcml2YXRlIGZpbmFsIFNldDxTZWxlY3RvclRocmVhZD4gc2VsZWN0b3JUaHJlYWRzID0gbmV3IEhhc2hTZXQ8U2VsZWN0b3JUaHJlYWQ+KCk7CisKKyAgLy8gVGhpcyB3cmFwcyBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgcXVldWVpbmcgYW5kIHRocmVhZCBwb29sIG1hbmFnZW1lbnQKKyAgLy8gZm9yIHRoZSBwYXNzaW5nIG9mIEludm9jYXRpb25zIGZyb20gdGhlIHNlbGVjdG9yIHRocmVhZChzKSB0byB0aGUgd29ya2VycworICAvLyAoaWYgYW55KS4KKyAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgaW52b2tlcjsKKworICBwcml2YXRlIGZpbmFsIEFyZ3MgYXJnczsKKworICAvKioKKyAgICogQ3JlYXRlIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIEFyZ3MgY29uZmlndXJhdGlvbgorICAgKi8KKyAgcHVibGljIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyKEFyZ3MgYXJncykgeworICAgIHN1cGVyKGFyZ3MpOworICAgIGFyZ3MudmFsaWRhdGUoKTsKKyAgICBpbnZva2VyID0gYXJncy5leGVjdXRvclNlcnZpY2UgPT0gbnVsbCA/IGNyZWF0ZURlZmF1bHRFeGVjdXRvcihhcmdzKSA6IGFyZ3MuZXhlY3V0b3JTZXJ2aWNlOworICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgIH0KKworICAvKioKKyAgICogU3RhcnQgdGhlIGFjY2VwdCBhbmQgc2VsZWN0b3IgdGhyZWFkcyBydW5uaW5nIHRvIGRlYWwgd2l0aCBjbGllbnRzLgorICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBmYWxzZSBpZiB3ZSBjb3VsZG4ndCBzdGFydCBmb3Igc29tZQorICAgKiAgICAgICAgIHJlYXNvbi4KKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydFRocmVhZHMoKSB7CisgICAgdHJ5IHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zZWxlY3RvclRocmVhZHM7ICsraSkgeworICAgICAgICBzZWxlY3RvclRocmVhZHMuYWRkKG5ldyBTZWxlY3RvclRocmVhZChhcmdzLmFjY2VwdFF1ZXVlU2l6ZVBlclRocmVhZCkpOworICAgICAgfQorICAgICAgYWNjZXB0VGhyZWFkID0gbmV3IEFjY2VwdFRocmVhZCgoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0KSBzZXJ2ZXJUcmFuc3BvcnRfLAorICAgICAgICBjcmVhdGVTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlcihzZWxlY3RvclRocmVhZHMpKTsKKyAgICAgIGZvciAoU2VsZWN0b3JUaHJlYWQgdGhyZWFkIDogc2VsZWN0b3JUaHJlYWRzKSB7CisgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgICAgfQorICAgICAgYWNjZXB0VGhyZWFkLnN0YXJ0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBMT0dHRVIuZXJyb3IoIkZhaWxlZCB0byBzdGFydCB0aHJlYWRzISIsIGUpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBKb2lucyB0aGUgYWNjZXB0IGFuZCBzZWxlY3RvciB0aHJlYWRzIGFuZCBzaHV0cyBkb3duIHRoZSBleGVjdXRvciBzZXJ2aWNlLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpIHsKKyAgICB0cnkgeworICAgICAgam9pblRocmVhZHMoKTsKKyAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBOb24tZ3JhY2VmdWwgc2h1dGRvd24gb2NjdXJyZWQKKyAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJydXB0ZWQgd2hpbGUgam9pbmluZyB0aHJlYWRzISIsIGUpOworICAgIH0KKyAgICBncmFjZWZ1bGx5U2h1dGRvd25JbnZva2VyUG9vbCgpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgam9pblRocmVhZHMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIC8vIHdhaXQgdW50aWwgdGhlIGlvIHRocmVhZHMgZXhpdAorICAgIGFjY2VwdFRocmVhZC5qb2luKCk7CisgICAgZm9yIChTZWxlY3RvclRocmVhZCB0aHJlYWQgOiBzZWxlY3RvclRocmVhZHMpIHsKKyAgICAgIHRocmVhZC5qb2luKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFN0b3Agc2VydmluZyBhbmQgc2h1dCBldmVyeXRoaW5nIGRvd24uCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICBzdG9wcGVkXyA9IHRydWU7CisKKyAgICAvLyBTdG9wIHF1ZXVpbmcgY29ubmVjdCBhdHRlbXB0cyBhc2FwCisgICAgc3RvcExpc3RlbmluZygpOworCisgICAgaWYgKGFjY2VwdFRocmVhZCAhPSBudWxsKSB7CisgICAgICBhY2NlcHRUaHJlYWQud2FrZXVwU2VsZWN0b3IoKTsKKyAgICB9CisgICAgaWYgKHNlbGVjdG9yVGhyZWFkcyAhPSBudWxsKSB7CisgICAgICBmb3IgKFNlbGVjdG9yVGhyZWFkIHRocmVhZCA6IHNlbGVjdG9yVGhyZWFkcykgeworICAgICAgICBpZiAodGhyZWFkICE9IG51bGwpCisgICAgICAgICAgdGhyZWFkLndha2V1cFNlbGVjdG9yKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgZ3JhY2VmdWxseVNodXRkb3duSW52b2tlclBvb2woKSB7CisgICAgLy8gdHJ5IHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBleGVjdXRvciBzZXJ2aWNlCisgICAgaW52b2tlci5zaHV0ZG93bigpOworCisgICAgLy8gTG9vcCB1bnRpbCBhd2FpdFRlcm1pbmF0aW9uIGZpbmFsbHkgZG9lcyByZXR1cm4gd2l0aG91dCBhIGludGVycnVwdGVkCisgICAgLy8gZXhjZXB0aW9uLiBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGVuIHdlJ2xsIHNodXQgZG93biBwcmVtYXR1cmVseS4gV2Ugd2FudAorICAgIC8vIHRvIGxldCB0aGUgZXhlY3V0b3JTZXJ2aWNlIGNsZWFyIGl0J3MgdGFzayBxdWV1ZSwgY2xvc2luZyBjbGllbnQgc29ja2V0cworICAgIC8vIGFwcHJvcHJpYXRlbHkuCisgICAgbG9uZyB0aW1lb3V0TVMgPSBhcmdzLnN0b3BUaW1lb3V0VW5pdC50b01pbGxpcyhhcmdzLnN0b3BUaW1lb3V0VmFsKTsKKyAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIHdoaWxlICh0aW1lb3V0TVMgPj0gMCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaW52b2tlci5hd2FpdFRlcm1pbmF0aW9uKHRpbWVvdXRNUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpeCkgeworICAgICAgICBsb25nIG5ld25vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB0aW1lb3V0TVMgLT0gKG5ld25vdyAtIG5vdyk7CisgICAgICAgIG5vdyA9IG5ld25vdzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogV2Ugb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGludm9rZSBtZXRob2QgaGVyZSB0byBxdWV1ZSB0aGUgaW52b2NhdGlvbiBmb3IKKyAgICogaW52b2tlciBzZXJ2aWNlIGluc3RlYWQgb2YgaW1tZWRpYXRlbHkgaW52b2tpbmcuIElmIHRoZXJlIGlzIG5vIHRocmVhZAorICAgKiBwb29sLCBoYW5kbGUgdGhlIGludm9jYXRpb24gaW5saW5lIG9uIHRoaXMgdGhyZWFkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWVzdEludm9rZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICAgIFJ1bm5hYmxlIGludm9jYXRpb24gPSBnZXRSdW5uYWJsZShmcmFtZUJ1ZmZlcik7CisgICAgaWYgKGludm9rZXIgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaW52b2tlci5leGVjdXRlKGludm9jYXRpb24pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gY2F0Y2ggKFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIHJ4KSB7CisgICAgICAgIExPR0dFUi53YXJuKCJFeGVjdXRvclNlcnZpY2UgcmVqZWN0ZWQgZXhlY3V0aW9uISIsIHJ4KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBJbnZva2Ugb24gdGhlIGNhbGxlcidzIHRocmVhZAorICAgICAgaW52b2NhdGlvbi5ydW4oKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBSdW5uYWJsZSBnZXRSdW5uYWJsZShGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlcikgeworICAgIHJldHVybiBuZXcgSW52b2NhdGlvbihmcmFtZUJ1ZmZlcik7CisgIH0KKworICAvKioKKyAgICogSGVscGVyIHRvIGNyZWF0ZSB0aGUgaW52b2tlciBpZiBvbmUgaXMgbm90IHNwZWNpZmllZAorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBFeGVjdXRvclNlcnZpY2UgY3JlYXRlRGVmYXVsdEV4ZWN1dG9yKEFyZ3Mgb3B0aW9ucykgeworICAgIHJldHVybiAob3B0aW9ucy53b3JrZXJUaHJlYWRzID4gMCkgPyBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKG9wdGlvbnMud29ya2VyVGhyZWFkcykgOiBudWxsOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgQmxvY2tpbmdRdWV1ZTxUTm9uYmxvY2tpbmdUcmFuc3BvcnQ+IGNyZWF0ZURlZmF1bHRBY2NlcHRRdWV1ZShpbnQgcXVldWVTaXplKSB7CisgICAgaWYgKHF1ZXVlU2l6ZSA9PSAwKSB7CisgICAgICAvLyBVbmJvdW5kZWQgcXVldWUKKyAgICAgIHJldHVybiBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxUTm9uYmxvY2tpbmdUcmFuc3BvcnQ+KCk7CisgICAgfQorICAgIHJldHVybiBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFROb25ibG9ja2luZ1RyYW5zcG9ydD4ocXVldWVTaXplKTsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgdGhyZWFkIHRoYXQgc2VsZWN0cyBvbiB0aGUgc2VydmVyIHRyYW5zcG9ydCAobGlzdGVuIHNvY2tldCkgYW5kIGFjY2VwdHMKKyAgICogbmV3IGNvbm5lY3Rpb25zIHRvIGhhbmQgb2ZmIHRvIHRoZSBJTyBzZWxlY3RvciB0aHJlYWRzCisgICAqLworICBwcm90ZWN0ZWQgY2xhc3MgQWNjZXB0VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKworICAgIC8vIFRoZSBsaXN0ZW4gc29ja2V0IHRvIGFjY2VwdCBvbgorICAgIHByaXZhdGUgZmluYWwgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydDsKKyAgICBwcml2YXRlIGZpbmFsIFNlbGVjdG9yIGFjY2VwdFNlbGVjdG9yOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlciB0aHJlYWRDaG9vc2VyOworCisgICAgLyoqCisgICAgICogU2V0IHVwIHRoZSBBY2NlcHRUaGVhZAorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBBY2NlcHRUaHJlYWQoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIgdGhyZWFkQ2hvb3NlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgdGhpcy50aHJlYWRDaG9vc2VyID0gdGhyZWFkQ2hvb3NlcjsKKyAgICAgIHRoaXMuYWNjZXB0U2VsZWN0b3IgPSBTZWxlY3RvclByb3ZpZGVyLnByb3ZpZGVyKCkub3BlblNlbGVjdG9yKCk7CisgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydC5yZWdpc3RlclNlbGVjdG9yKGFjY2VwdFNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd29yayBsb29wLiBTZWxlY3RzIG9uIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IGFuZCBhY2NlcHRzLiBJZiB0aGVyZSB3YXMKKyAgICAgKiBhIHNlcnZlciB0cmFuc3BvcnQgdGhhdCBoYWQgYmxvY2tpbmcgYWNjZXB0cywgYW5kIHJldHVybmVkIG9uIGJsb2NraW5nCisgICAgICogY2xpZW50IHRyYW5zcG9ydHMsIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXJfLnByZVNlcnZlKCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CisgICAgICAgICAgc2VsZWN0KCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIExPR0dFUi5lcnJvcigicnVuKCkgb24gQWNjZXB0VGhyZWFkIGV4aXRpbmcgZHVlIHRvIHVuY2F1Z2h0IGVycm9yIiwgdCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGFjY2VwdFNlbGVjdG9yLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoIkdvdCBhbiBJT0V4Y2VwdGlvbiB3aGlsZSBjbG9zaW5nIGFjY2VwdCBzZWxlY3RvciEiLCBlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGlzIHdpbGwgd2FrZSB1cCB0aGUgc2VsZWN0b3IgdGhyZWFkcworICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci50aGlzLnN0b3AoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgc2VsZWN0b3IgaXMgYmxvY2tlZCwgd2FrZSBpdCB1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3YWtldXBTZWxlY3RvcigpIHsKKyAgICAgIGFjY2VwdFNlbGVjdG9yLndha2V1cCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCBhbmQgcHJvY2VzcyBJTyBldmVudHMgYXBwcm9wcmlhdGVseTogSWYgdGhlcmUgYXJlIGNvbm5lY3Rpb25zIHRvCisgICAgICogYmUgYWNjZXB0ZWQsIGFjY2VwdCB0aGVtLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZWxlY3QoKSB7CisgICAgICB0cnkgeworICAgICAgICAvLyB3YWl0IGZvciBjb25uZWN0IGV2ZW50cy4KKyAgICAgICAgYWNjZXB0U2VsZWN0b3Iuc2VsZWN0KCk7CisKKyAgICAgICAgLy8gcHJvY2VzcyB0aGUgaW8gZXZlbnRzIHdlIHJlY2VpdmVkCisgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gc2VsZWN0ZWRLZXlzID0gYWNjZXB0U2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKCFzdG9wcGVkXyAmJiBzZWxlY3RlZEtleXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgU2VsZWN0aW9uS2V5IGtleSA9IHNlbGVjdGVkS2V5cy5uZXh0KCk7CisgICAgICAgICAgc2VsZWN0ZWRLZXlzLnJlbW92ZSgpOworCisgICAgICAgICAgLy8gc2tpcCBpZiBub3QgdmFsaWQKKyAgICAgICAgICBpZiAoIWtleS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChrZXkuaXNBY2NlcHRhYmxlKCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUFjY2VwdCgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dHRVIud2FybigiVW5leHBlY3RlZCBzdGF0ZSBpbiBzZWxlY3QhICIgKyBrZXkuaW50ZXJlc3RPcHMoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJHb3QgYW4gSU9FeGNlcHRpb24gd2hpbGUgc2VsZWN0aW5nISIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2VwdCBhIG5ldyBjb25uZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBY2NlcHQoKSB7CisgICAgICBmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgY2xpZW50ID0gZG9BY2NlcHQoKTsKKyAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAvLyBQYXNzIHRoaXMgY29ubmVjdGlvbiB0byBhIHNlbGVjdG9yIHRocmVhZAorICAgICAgICBmaW5hbCBTZWxlY3RvclRocmVhZCB0YXJnZXRUaHJlYWQgPSB0aHJlYWRDaG9vc2VyLm5leHRUaHJlYWQoKTsKKworICAgICAgICBpZiAoYXJncy5hY2NlcHRQb2xpY3kgPT0gQXJncy5BY2NlcHRQb2xpY3kuRkFTVF9BQ0NFUFQgfHwgaW52b2tlciA9PSBudWxsKSB7CisgICAgICAgICAgZG9BZGRBY2NlcHQodGFyZ2V0VGhyZWFkLCBjbGllbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEZBSVJfQUNDRVBUCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludm9rZXIuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGRvQWRkQWNjZXB0KHRhcmdldFRocmVhZCwgY2xpZW50KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSBjYXRjaCAoUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gcngpIHsKKyAgICAgICAgICAgIExPR0dFUi53YXJuKCJFeGVjdXRvclNlcnZpY2UgcmVqZWN0ZWQgYWNjZXB0IHJlZ2lzdHJhdGlvbiEiLCByeCk7CisgICAgICAgICAgICAvLyBjbG9zZSBpbW1lZGlhdGVseQorICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgZG9BY2NlcHQoKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gKFROb25ibG9ja2luZ1RyYW5zcG9ydCkgc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dGUpIHsKKyAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmcgYWNjZXB0aW5nLgorICAgICAgICBMT0dHRVIud2FybigiRXhjZXB0aW9uIHRyeWluZyB0byBhY2NlcHQhIiwgdHRlKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvQWRkQWNjZXB0KFNlbGVjdG9yVGhyZWFkIHRocmVhZCwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGNsaWVudCkgeworICAgICAgaWYgKCF0aHJlYWQuYWRkQWNjZXB0ZWRDb25uZWN0aW9uKGNsaWVudCkpIHsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICB9CisgICAgfQorICB9IC8vIEFjY2VwdFRocmVhZAorCisgIC8qKgorICAgKiBUaGUgU2VsZWN0b3JUaHJlYWQocykgd2lsbCBiZSBkb2luZyBhbGwgdGhlIHNlbGVjdGluZyBvbiBhY2NlcHRlZCBhY3RpdmUKKyAgICogY29ubmVjdGlvbnMuCisgICAqLworICBwcm90ZWN0ZWQgY2xhc3MgU2VsZWN0b3JUaHJlYWQgZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdFRocmVhZCB7CisKKyAgICAvLyBBY2NlcHRlZCBjb25uZWN0aW9ucyBhZGRlZCBieSB0aGUgYWNjZXB0IHRocmVhZC4KKyAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PiBhY2NlcHRlZFF1ZXVlOworICAgIHByaXZhdGUgaW50IFNFTEVDVE9SX0FVVE9fUkVCVUlMRF9USFJFU0hPTEQgPSA1MTI7CisgICAgcHJpdmF0ZSBsb25nIE1PTklUT1JfUEVSSU9EID0gMTAwMEw7CisgICAgcHJpdmF0ZSBpbnQganZtQnVnID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB1cCB0aGUgU2VsZWN0b3JUaHJlYWQgd2l0aCBhbiB1bmJvdW5kZWQgcXVldWUgZm9yIGluY29taW5nIGFjY2VwdHMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgIGlmIGEgc2VsZWN0b3IgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0b3JUaHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgdGhpcyhuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxUTm9uYmxvY2tpbmdUcmFuc3BvcnQ+KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB1cCB0aGUgU2VsZWN0b3JUaHJlYWQgd2l0aCBhbiBib3VuZGVkIHF1ZXVlIGZvciBpbmNvbWluZyBhY2NlcHRzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICBpZiBhIHNlbGVjdG9yIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgcHVibGljIFNlbGVjdG9yVGhyZWFkKGludCBtYXhQZW5kaW5nQWNjZXB0cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMoY3JlYXRlRGVmYXVsdEFjY2VwdFF1ZXVlKG1heFBlbmRpbmdBY2NlcHRzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGEgc3BlY2lmaWVkIHF1ZXVlIGZvciBjb25uZWN0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2NlcHRlZFF1ZXVlCisgICAgICogICAgICAgICAgVGhlIEJsb2NraW5nUXVldWUgaW1wbGVtZW50YXRpb24gZm9yIGhvbGRpbmcgaW5jb21pbmcgYWNjZXB0ZWQKKyAgICAgKiAgICAgICAgICBjb25uZWN0aW9ucy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgIGlmIGEgc2VsZWN0b3IgY2Fubm90IGJlIGNyZWF0ZWQuCisgICAgICovCisgICAgcHVibGljIFNlbGVjdG9yVGhyZWFkKEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PiBhY2NlcHRlZFF1ZXVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgdGhpcy5hY2NlcHRlZFF1ZXVlID0gYWNjZXB0ZWRRdWV1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kcyBvZmYgYW4gYWNjZXB0ZWQgY29ubmVjdGlvbiB0byBiZSBoYW5kbGVkIGJ5IHRoaXMgdGhyZWFkLiBUaGlzCisgICAgICogbWV0aG9kIHdpbGwgYmxvY2sgaWYgdGhlIHF1ZXVlIGZvciBuZXcgY29ubmVjdGlvbnMgaXMgYXQgY2FwYWNpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXB0ZWQKKyAgICAgKiAgICAgICAgICBUaGUgY29ubmVjdGlvbiB0aGF0IGhhcyBiZWVuIGFjY2VwdGVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWNjZXB0ZWRDb25uZWN0aW9uKFROb25ibG9ja2luZ1RyYW5zcG9ydCBhY2NlcHRlZCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgYWNjZXB0ZWRRdWV1ZS5wdXQoYWNjZXB0ZWQpOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIud2FybigiSW50ZXJydXB0ZWQgd2hpbGUgYWRkaW5nIGFjY2VwdGVkIGNvbm5lY3Rpb24hIiwgZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHNlbGVjdG9yLndha2V1cCgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHdvcmsgbG9vcC4gSGFuZGxlcyBzZWxlY3RpbmcgKHJlYWQvd3JpdGUgSU8pLCBkaXNwYXRjaGluZywgYW5kCisgICAgICogbWFuYWdpbmcgdGhlIHNlbGVjdGlvbiBwcmVmZXJlbmNlcyBvZiBhbGwgZXhpc3RpbmcgY29ubmVjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgd2hpbGUgKCFzdG9wcGVkXykgeworICAgICAgICAgIHNlbGVjdCgpOworICAgICAgICAgIHByb2Nlc3NBY2NlcHRlZENvbm5lY3Rpb25zKCk7CisgICAgICAgICAgcHJvY2Vzc0ludGVyZXN0Q2hhbmdlcygpOworICAgICAgICB9CisgICAgICAgIGZvciAoU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSA6IHNlbGVjdG9yLmtleXMoKSkgeworICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoc2VsZWN0aW9uS2V5KTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJydW4oKSBvbiBTZWxlY3RvclRocmVhZCBleGl0aW5nIGR1ZSB0byB1bmNhdWdodCBlcnJvciIsIHQpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzZWxlY3Rvci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmVycm9yKCJHb3QgYW4gSU9FeGNlcHRpb24gd2hpbGUgY2xvc2luZyBzZWxlY3RvciEiLCBlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGlzIHdpbGwgd2FrZSB1cCB0aGUgYWNjZXB0IHRocmVhZCBhbmQgdGhlIG90aGVyIHNlbGVjdG9yIHRocmVhZHMKKyAgICAgICAgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIudGhpcy5zdG9wKCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0IGFuZCBwcm9jZXNzIElPIGV2ZW50cyBhcHByb3ByaWF0ZWx5OiBJZiB0aGVyZSBhcmUgZXhpc3RpbmcKKyAgICAgKiBjb25uZWN0aW9ucyB3aXRoIGRhdGEgd2FpdGluZyB0byBiZSByZWFkLCByZWFkIGl0LCBidWZmZXJpbmcgdW50aWwgYQorICAgICAqIHdob2xlIGZyYW1lIGhhcyBiZWVuIHJlYWQuIElmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyByZXNwb25zZXMsIGJ1ZmZlcgorICAgICAqIHRoZW0gdW50aWwgdGhlaXIgdGFyZ2V0IGNsaWVudCBpcyBhdmFpbGFibGUsIGFuZCB0aGVuIHNlbmQgdGhlIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdCgpIHsKKyAgICAgIHRyeSB7CisKKyAgICAgICAgZG9TZWxlY3QoKTsKKworICAgICAgICAvLyBwcm9jZXNzIHRoZSBpbyBldmVudHMgd2UgcmVjZWl2ZWQKKyAgICAgICAgSXRlcmF0b3I8U2VsZWN0aW9uS2V5PiBzZWxlY3RlZEtleXMgPSBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoIXN0b3BwZWRfICYmIHNlbGVjdGVkS2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBTZWxlY3Rpb25LZXkga2V5ID0gc2VsZWN0ZWRLZXlzLm5leHQoKTsKKyAgICAgICAgICBzZWxlY3RlZEtleXMucmVtb3ZlKCk7CisKKyAgICAgICAgICAvLyBza2lwIGlmIG5vdCB2YWxpZAorICAgICAgICAgIGlmICgha2V5LmlzVmFsaWQoKSkgeworICAgICAgICAgICAgY2xlYW51cFNlbGVjdGlvbktleShrZXkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGtleS5pc1JlYWRhYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIGRlYWwgd2l0aCByZWFkcworICAgICAgICAgICAgaGFuZGxlUmVhZChrZXkpOworICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmlzV3JpdGFibGUoKSkgeworICAgICAgICAgICAgLy8gZGVhbCB3aXRoIHdyaXRlcworICAgICAgICAgICAgaGFuZGxlV3JpdGUoa2V5KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HR0VSLndhcm4oIlVuZXhwZWN0ZWQgc3RhdGUgaW4gc2VsZWN0ISAiICsga2V5LmludGVyZXN0T3BzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIud2FybigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIHNlbGVjdGluZyEiLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyBzZWxlY3QgYW5kIGp1ZGdlIGVwb2xsIGJ1ZyBoYXBwZW4uCisgICAgICogU2VlIDogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI1MQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBsb25nIGJlZm9yZVNlbGVjdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgaW50IHNlbGVjdGVkTnVtcyA9IHNlbGVjdG9yLnNlbGVjdCgpOworICAgICAgbG9uZyBhZnRlclNlbGVjdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICBpZiAoc2VsZWN0ZWROdW1zID09IDApIHsKKyAgICAgICAganZtQnVnKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfQorCisgICAgICBsb25nIHNlbGVjdGVkVGltZSA9IGFmdGVyU2VsZWN0IC0gYmVmb3JlU2VsZWN0OworICAgICAgaWYgKHNlbGVjdGVkVGltZSA+PSBNT05JVE9SX1BFUklPRCkgeworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfSBlbHNlIGlmIChqdm1CdWcgPiBTRUxFQ1RPUl9BVVRPX1JFQlVJTERfVEhSRVNIT0xEKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJJbiB7fSBtcyBoYXBwZW4ge30gdGltZXMganZtIGJ1ZzsgcmVidWlsZGluZyBzZWxlY3Rvci4iLCBNT05JVE9SX1BFUklPRCwganZtQnVnKTsKKyAgICAgICAgcmVidWlsZFNlbGVjdG9yKCk7CisgICAgICAgIHNlbGVjdG9yLnNlbGVjdE5vdygpOworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgU2VsZWN0b3Igb2YgdGhpcyBTZWxlY3RvclRocmVhZCB3aXRoIG5ld2x5IGNyZWF0ZWQgU2VsZWN0b3IgdG8gd29yaworICAgICAqIGFyb3VuZCB0aGUgaW5mYW1vdXMgZXBvbGwgMTAwJSBDUFUgYnVnLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVidWlsZFNlbGVjdG9yKCkgeworICAgICAgZmluYWwgU2VsZWN0b3Igb2xkU2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgIGlmIChvbGRTZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIFNlbGVjdG9yIG5ld1NlbGVjdG9yID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIG5ld1NlbGVjdG9yID0gU2VsZWN0b3Iub3BlbigpOworICAgICAgICBMT0dHRVIud2FybigiQ3JlYXRlZCBuZXcgU2VsZWN0b3IuIik7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiQ3JlYXRlIG5ldyBTZWxlY3RvciBlcnJvci4iLCBlKTsKKyAgICAgIH0KKworICAgICAgZm9yIChTZWxlY3Rpb25LZXkga2V5IDogb2xkU2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkpIHsKKyAgICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpICYmIGtleS5yZWFkeU9wcygpID09IDApCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSBrZXkuY2hhbm5lbCgpOworICAgICAgICBPYmplY3QgYXR0YWNobWVudCA9IGtleS5hdHRhY2htZW50KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBjaGFubmVsLnJlZ2lzdGVyKG5ld1NlbGVjdG9yLCBrZXkucmVhZHlPcHMoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWwucmVnaXN0ZXIobmV3U2VsZWN0b3IsIGtleS5yZWFkeU9wcygpLCBhdHRhY2htZW50KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsb3NlZENoYW5uZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiUmVnaXN0ZXIgbmV3IHNlbGVjdG9yIGtleSBlcnJvci4iLCBlKTsKKyAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgIHNlbGVjdG9yID0gbmV3U2VsZWN0b3I7CisgICAgICB0cnkgeworICAgICAgICBvbGRTZWxlY3Rvci5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIkNsb3NlIG9sZCBzZWxlY3RvciBlcnJvci4iLCBlKTsKKyAgICAgIH0KKyAgICAgIExPR0dFUi53YXJuKCJSZXBsYWNlIG5ldyBzZWxlY3RvciBzdWNjZXNzLiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQWNjZXB0ZWRDb25uZWN0aW9ucygpIHsKKyAgICAgIC8vIFJlZ2lzdGVyIGFjY2VwdGVkIGNvbm5lY3Rpb25zCisgICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CisgICAgICAgIFROb25ibG9ja2luZ1RyYW5zcG9ydCBhY2NlcHRlZCA9IGFjY2VwdGVkUXVldWUucG9sbCgpOworICAgICAgICBpZiAoYWNjZXB0ZWQgPT0gbnVsbCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJlZ2lzdGVyQWNjZXB0ZWQoYWNjZXB0ZWQpOworICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBGcmFtZUJ1ZmZlciBjcmVhdGVGcmFtZUJ1ZmZlcihmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnMsCisgICAgICAgIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXksCisgICAgICAgIGZpbmFsIEFic3RyYWN0U2VsZWN0VGhyZWFkIHNlbGVjdFRocmVhZCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV8uaXNBc3luY1Byb2Nlc3NvcigpID8KKyAgICAgICAgICAgICAgICAgIG5ldyBBc3luY0ZyYW1lQnVmZmVyKHRyYW5zLCBzZWxlY3Rpb25LZXksIHNlbGVjdFRocmVhZCkgOgorICAgICAgICAgICAgICAgICAgbmV3IEZyYW1lQnVmZmVyKHRyYW5zLCBzZWxlY3Rpb25LZXksIHNlbGVjdFRocmVhZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQWNjZXB0ZWQoVE5vbmJsb2NraW5nVHJhbnNwb3J0IGFjY2VwdGVkKSB7CisgICAgICBTZWxlY3Rpb25LZXkgY2xpZW50S2V5ID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudEtleSA9IGFjY2VwdGVkLnJlZ2lzdGVyU2VsZWN0b3Ioc2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9SRUFEKTsKKworICAgICAgICBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlciA9IGNyZWF0ZUZyYW1lQnVmZmVyKGFjY2VwdGVkLCBjbGllbnRLZXksIFNlbGVjdG9yVGhyZWFkLnRoaXMpOworCisgICAgICAgIGNsaWVudEtleS5hdHRhY2goZnJhbWVCdWZmZXIpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIud2FybigiRmFpbGVkIHRvIHJlZ2lzdGVyIGFjY2VwdGVkIGNvbm5lY3Rpb24gdG8gc2VsZWN0b3IhIiwgZSk7CisgICAgICAgIGlmIChjbGllbnRLZXkgIT0gbnVsbCkgeworICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoY2xpZW50S2V5KTsKKyAgICAgICAgfQorICAgICAgICBhY2NlcHRlZC5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgfSAvLyBTZWxlY3RvclRocmVhZAorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIgdG8gYmUgdXNlZCBieSB0aGUgYWNjZXB0IHRocmVhZCBmb3IKKyAgICogYXNzaWduaW5nIG5ld2x5IGFjY2VwdGVkIGNvbm5lY3Rpb25zIGFjcm9zcyB0aGUgdGhyZWFkcy4KKyAgICovCisgIHByb3RlY3RlZCBTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlciBjcmVhdGVTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWxlY3RvclRocmVhZD4gdGhyZWFkcykgeworICAgIHJldHVybiBuZXcgU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIodGhyZWFkcyk7CisgIH0KKworICAvKioKKyAgICogQSByb3VuZCByb2JpbiBsb2FkIGJhbGFuY2VyIGZvciBjaG9vc2luZyBzZWxlY3RvciB0aHJlYWRzIGZvciBuZXcKKyAgICogY29ubmVjdGlvbnMuCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyIHsKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIFNlbGVjdG9yVGhyZWFkPiB0aHJlYWRzOworICAgIHByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIFNlbGVjdG9yVGhyZWFkPiBuZXh0VGhyZWFkSXRlcmF0b3I7CisKKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBTZWxlY3RvclRocmVhZD4gU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIoQ29sbGVjdGlvbjxUPiB0aHJlYWRzKSB7CisgICAgICBpZiAodGhyZWFkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIHNlbGVjdG9yIHRocmVhZCBpcyByZXF1aXJlZCIpOworICAgICAgfQorICAgICAgdGhpcy50aHJlYWRzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PFQ+KHRocmVhZHMpKTsKKyAgICAgIG5leHRUaHJlYWRJdGVyYXRvciA9IHRoaXMudGhyZWFkcy5pdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBTZWxlY3RvclRocmVhZCBuZXh0VGhyZWFkKCkgeworICAgICAgLy8gQ2hvb3NlIGEgc2VsZWN0b3IgdGhyZWFkIChyb3VuZCByb2JpbikKKyAgICAgIGlmICghbmV4dFRocmVhZEl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICBuZXh0VGhyZWFkSXRlcmF0b3IgPSB0aHJlYWRzLml0ZXJhdG9yKCk7CisgICAgICB9CisgICAgICByZXR1cm4gbmV4dFRocmVhZEl0ZXJhdG9yLm5leHQoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzYWE5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCB3cmFwcyBhIGJ5dGVbXSBzbyB0aGF0IGl0IGNhbiBleHBhbmQgYW5kIGJlIHJldXNlZC4gVXNlcnMKKyAqIHNob3VsZCBjYWxsIHJlc2l6ZUlmTmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGhhcyBzdWl0YWJsZSBjYXBhY2l0eSwKKyAqIGFuZCB0aGVuIHVzZSB0aGUgYXJyYXkgYXMgbmVlZGVkLiBOb3RlIHRoYXQgdGhlIGludGVybmFsIGFycmF5IHdpbGwgZ3JvdyBhdCBhCisgKiByYXRlIHNsaWdodGx5IGZhc3RlciB0aGFuIHRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgd2l0aCB0aGUgKHVudGVzdGVkKQorICogb2JqZWN0aXZlIG9mIGF2b2lkaW5nIGV4cGVuc2l2ZSBidWZmZXIgYWxsb2NhdGlvbnMgYW5kIGNvcGllcy4KKyAqLworY2xhc3MgQXV0b0V4cGFuZGluZ0J1ZmZlciB7CisgIHByaXZhdGUgYnl0ZVtdIGFycmF5OworCisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICB0aGlzLmFycmF5ID0gbmV3IGJ5dGVbaW5pdGlhbENhcGFjaXR5XTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlc2l6ZUlmTmVjZXNzYXJ5KGludCBzaXplKSB7CisgICAgZmluYWwgaW50IGN1cnJlbnRDYXBhY2l0eSA9IHRoaXMuYXJyYXkubGVuZ3RoOworICAgIGlmIChjdXJyZW50Q2FwYWNpdHkgPCBzaXplKSB7CisgICAgICAvLyBJbmNyZWFzZSBieSBhIGZhY3RvciBvZiAxLjV4CisgICAgICBpbnQgZ3Jvd0NhcGFjaXR5ID0gY3VycmVudENhcGFjaXR5ICsgKGN1cnJlbnRDYXBhY2l0eSA+PiAxKTsKKyAgICAgIGludCBuZXdDYXBhY2l0eSA9IE1hdGgubWF4KGdyb3dDYXBhY2l0eSwgc2l6ZSk7CisgICAgICB0aGlzLmFycmF5ID0gQXJyYXlzLmNvcHlPZihhcnJheSwgbmV3Q2FwYWNpdHkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBieXRlW10gYXJyYXkoKSB7CisgICAgcmV0dXJuIHRoaXMuYXJyYXk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhkMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisvKioKKyAqIFRUcmFuc3BvcnQgZm9yIHJlYWRpbmcgZnJvbSBhbiBBdXRvRXhwYW5kaW5nQnVmZmVyLgorICovCitwdWJsaWMgY2xhc3MgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICBwcml2YXRlIGZpbmFsIEF1dG9FeHBhbmRpbmdCdWZmZXIgYnVmOworCisgIHByaXZhdGUgaW50IHBvcyA9IDA7CisgIHByaXZhdGUgaW50IGxpbWl0ID0gMDsKKworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGZpbGwoVFRyYW5zcG9ydCBpblRyYW5zLCBpbnQgbGVuZ3RoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgYnVmLnJlc2l6ZUlmTmVjZXNzYXJ5KGxlbmd0aCk7CisgICAgaW5UcmFucy5yZWFkQWxsKGJ1Zi5hcnJheSgpLCAwLCBsZW5ndGgpOworICAgIHBvcyA9IDA7CisgICAgbGltaXQgPSBsZW5ndGg7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7fQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7IHJldHVybiB0cnVlOyB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgaW50IHJlYWQoYnl0ZVtdIHRhcmdldCwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGludCBhbXRUb1JlYWQgPSBNYXRoLm1pbihsZW4sIGdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSk7CisgICAgU3lzdGVtLmFycmF5Y29weShidWYuYXJyYXkoKSwgcG9zLCB0YXJnZXQsIG9mZiwgYW10VG9SZWFkKTsKKyAgICBjb25zdW1lQnVmZmVyKGFtdFRvUmVhZCk7CisgICAgcmV0dXJuIGFtdFRvUmVhZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIHZvaWQgY29uc3VtZUJ1ZmZlcihpbnQgbGVuKSB7CisgICAgcG9zICs9IGxlbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldEJ1ZmZlcigpIHsKKyAgICByZXR1cm4gYnVmLmFycmF5KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIGludCBnZXRCdWZmZXJQb3NpdGlvbigpIHsKKyAgICByZXR1cm4gcG9zOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gbGltaXQgLSBwb3M7CisgIH0KK30KKyAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3ZTdkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKy8qKgorICogVFRyYW5zcG9ydCBmb3Igd3JpdGluZyB0byBhbiBBdXRvRXhwYW5kaW5nQnVmZmVyLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSBmaW5hbCBBdXRvRXhwYW5kaW5nQnVmZmVyIGJ1ZjsKKyAgcHJpdmF0ZSBpbnQgcG9zOworICBwcml2YXRlIGludCByZXM7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoZSBidWZmZXIKKyAgICogQHBhcmFtIGZyb250UmVzZXJ2ZSBzcGFjZSwgaWYgYW55LCB0byByZXNlcnZlIGF0IHRoZSBiZWdpbm5pbmcgc3VjaAorICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIGZpcnN0IHdyaXRlIGlzIGFmdGVyIHRoaXMgcmVzZXJ2ZS4KKyAgICogICAgICAgICAgICAgICAgICAgICBUaGlzIGFsbG93cyBmcmFtZWQgdHJhbnNwb3J0IHRvIHJlc2VydmUgc3BhY2UKKyAgICogICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGZyYW1lIGJ1ZmZlciBsZW5ndGguCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGluaXRpYWxDYXBhY2l0eSBpcyBsZXNzIHRoYW4gb25lCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGZyb250UmVzZXJ2ZSBpcyBsZXNzIHRoYW4gemVybworICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBmcm9udFJlc2VydmUgaXMgZ3JlYXRlciB0aGFuIGluaXRpYWxDYXBhY2l0eQorICAgKi8KKyAgcHVibGljIEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5LCBpbnQgZnJvbnRSZXNlcnZlKSB7CisgICAgaWYgKGluaXRpYWxDYXBhY2l0eSA8IDEpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluaXRpYWxDYXBhY2l0eSIpOworICAgIH0KKyAgICBpZiAoZnJvbnRSZXNlcnZlIDwgMCB8fCBpbml0aWFsQ2FwYWNpdHkgPCBmcm9udFJlc2VydmUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZyb250UmVzZXJ2ZSIpOworICAgIH0KKyAgICB0aGlzLmJ1ZiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKGluaXRpYWxDYXBhY2l0eSk7CisgICAgdGhpcy5wb3MgPSBmcm9udFJlc2VydmU7CisgICAgdGhpcy5yZXMgPSBmcm9udFJlc2VydmU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7fQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7cmV0dXJuIHRydWU7fQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gdG9Xcml0ZSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGJ1Zi5yZXNpemVJZk5lY2Vzc2FyeShwb3MgKyBsZW4pOworICAgIFN5c3RlbS5hcnJheWNvcHkodG9Xcml0ZSwgb2ZmLCBidWYuYXJyYXkoKSwgcG9zLCBsZW4pOworICAgIHBvcyArPSBsZW47CisgIH0KKworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlciBnZXRCdWYoKSB7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBpbmNsdWRpbmcgYW55IGZyb250IHJlc2VydmUKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgIHJldHVybiBwb3M7CisgIH0KKworICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICBwb3MgPSByZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ5dGVCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ5dGVCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmIwNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnl0ZUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKy8qKgorICogQnl0ZUJ1ZmZlci1iYWNrZWQgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zcG9ydC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRCeXRlQnVmZmVyIGV4dGVuZHMgVFRyYW5zcG9ydCB7CisgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyOworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IFRCeXRlQnVmZmVyIHdyYXBwaW5nIGEgZ2l2ZW4gTklPIEJ5dGVCdWZmZXIuCisgICAqLworICBwdWJsaWMgVEJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyKSB7CisgICAgdGhpcy5ieXRlQnVmZmVyID0gYnl0ZUJ1ZmZlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb3BlbigpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGZpbmFsIGludCBuID0gTWF0aC5taW4oYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKSwgbGVuKTsKKyAgICBpZiAobiA+IDApIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ5dGVCdWZmZXIuZ2V0KGJ1Ziwgb2ZmLCBuKTsKKyAgICAgIH0gY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBidWZmZXIiLCBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG47CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBieXRlQnVmZmVyLnB1dChidWYsIG9mZiwgbGVuKTsKKyAgICB9IGNhdGNoIChCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTm90IGVub3VnaCByb29tIGluIG91dHB1dCBidWZmZXIiLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyLgorICAgKi8KKyAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0Qnl0ZUJ1ZmZlcigpIHsKKyAgICByZXR1cm4gYnl0ZUJ1ZmZlcjsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBjbGVhcigpIG9uIHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyLgorICAgKi8KKyAgcHVibGljIFRCeXRlQnVmZmVyIGNsZWFyKCkgeworICAgIGJ5dGVCdWZmZXIuY2xlYXIoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY2FsbCBmbGlwKCkgb24gdGhlIHVuZGVybHlpbmcgTklPIEJ5dGVCdWZmZXIuCisgICAgICovCisgIHB1YmxpYyBUQnl0ZUJ1ZmZlciBmbGlwKCkgeworICAgIGJ5dGVCdWZmZXIuZmxpcCgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyIHRvIGEKKyAgICogcGxhaW4gb2xkIGJ5dGUgYXJyYXkuCisgICAqLworICBwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgeworICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKV07CisgICAgYnl0ZUJ1ZmZlci5zbGljZSgpLmdldChkYXRhKTsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZmQyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisvKioKKyAqIFRoaXMgdHJhbnNwb3J0IGlzIHdpcmUgY29tcGF0aWJsZSB3aXRoIHtAbGluayBURnJhbWVkVHJhbnNwb3J0fSwgYnV0IG1ha2VzCisgKiB1c2Ugb2YgcmV1c2FibGUsIGV4cGFuZGluZyByZWFkIGFuZCB3cml0ZSBidWZmZXJzIGluIG9yZGVyIHRvIGF2b2lkCisgKiBhbGxvY2F0aW5nIG5ldyBieXRlW11zIGFsbCB0aGUgdGltZS4gU2luY2UgdGhlIGJ1ZmZlcnMgb25seSBleHBhbmQsIHlvdQorICogc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIHRoaXMgdHJhbnNwb3J0IGlmIHlvdXIgbWVzc2FnZXMgYXJlIG5vdCB0b28gdmFyaWFibHkKKyAqIGxhcmdlLCB1bmxlc3MgdGhlIHBlcnNpc3RlbnQgbWVtb3J5IGNvc3QgaXMgbm90IGFuIGlzc3VlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgTk9UIHRocmVhZHNhZmUuCisgKi8KK3B1YmxpYyBjbGFzcyBURmFzdEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgeworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBpbml0aWFsQ2FwYWNpdHk7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4TGVuZ3RoOworCisgICAgcHVibGljIEZhY3RvcnkoKSB7CisgICAgICB0aGlzKERFRkFVTFRfQlVGX0NBUEFDSVRZLCBERUZBVUxUX01BWF9MRU5HVEgpOworICAgIH0KKworICAgIHB1YmxpYyBGYWN0b3J5KGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICAgIHRoaXMoaW5pdGlhbENhcGFjaXR5LCBERUZBVUxUX01BWF9MRU5HVEgpOworICAgIH0KKworICAgIHB1YmxpYyBGYWN0b3J5KGludCBpbml0aWFsQ2FwYWNpdHksIGludCBtYXhMZW5ndGgpIHsKKyAgICAgIHRoaXMuaW5pdGlhbENhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5OworICAgICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICAgIHJldHVybiBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQodHJhbnMsCisgICAgICAgICAgaW5pdGlhbENhcGFjaXR5LAorICAgICAgICAgIG1heExlbmd0aCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEhvdyBiaWcgc2hvdWxkIHRoZSBkZWZhdWx0IHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgYmU/CisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRl9DQVBBQ0lUWSA9IDEwMjQ7CisgIC8qKgorICAgKiBIb3cgYmlnIGlzIHRoZSBsYXJnZXN0IGFsbG93YWJsZSBmcmFtZT8gRGVmYXVsdHMgdG8gMTZNQi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IDE2Mzg0MDAwOworCisgIHByaXZhdGUgZmluYWwgVFRyYW5zcG9ydCB1bmRlcmx5aW5nOworICBwcml2YXRlIGZpbmFsIEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCB3cml0ZUJ1ZmZlcjsKKyAgcHJpdmF0ZSBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCByZWFkQnVmZmVyOworICBwcml2YXRlIGZpbmFsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzRdOworICBwcml2YXRlIGZpbmFsIGludCBtYXhMZW5ndGg7CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgVEZhc3RGcmFtZWRUcmFuc3BvcnR9LiBVc2UgdGhlIGRlZmF1bHRzCisgICAqIGZvciBpbml0aWFsIGJ1ZmZlciBzaXplIGFuZCBtYXggZnJhbWUgbGVuZ3RoLgorICAgKiBAcGFyYW0gdW5kZXJseWluZyBUcmFuc3BvcnQgdGhhdCByZWFsIHJlYWRzIGFuZCB3cml0ZXMgd2lsbCBnbyB0aHJvdWdoIHRvLgorICAgKi8KKyAgcHVibGljIFRGYXN0RnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgeworICAgIHRoaXModW5kZXJseWluZywgREVGQVVMVF9CVUZfQ0FQQUNJVFksIERFRkFVTFRfTUFYX0xFTkdUSCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBURmFzdEZyYW1lZFRyYW5zcG9ydH0uIFVzZSB0aGUgc3BlY2lmaWVkCisgICAqIGluaXRpYWwgYnVmZmVyIGNhcGFjaXR5IGFuZCB0aGUgZGVmYXVsdCBtYXggZnJhbWUgbGVuZ3RoLgorICAgKiBAcGFyYW0gdW5kZXJseWluZyBUcmFuc3BvcnQgdGhhdCByZWFsIHJlYWRzIGFuZCB3cml0ZXMgd2lsbCBnbyB0aHJvdWdoIHRvLgorICAgKiBAcGFyYW0gaW5pdGlhbEJ1ZmZlckNhcGFjaXR5IFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCisgICAqIEluIHByYWN0aWNlLCBpdCdzIG5vdCBjcml0aWNhbCB0byBzZXQgdGhpcyB1bmxlc3MgeW91IGtub3cgaW4gYWR2YW5jZSB0aGF0CisgICAqIHlvdXIgbWVzc2FnZXMgYXJlIGdvaW5nIHRvIGJlIHZlcnkgbGFyZ2UuCisgICAqLworICBwdWJsaWMgVEZhc3RGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgaW5pdGlhbEJ1ZmZlckNhcGFjaXR5KSB7CisgICAgdGhpcyh1bmRlcmx5aW5nLCBpbml0aWFsQnVmZmVyQ2FwYWNpdHksIERFRkFVTFRfTUFYX0xFTkdUSCk7CisgIH0KKworICAvKioKKyAgICoKKyAgICogQHBhcmFtIHVuZGVybHlpbmcgVHJhbnNwb3J0IHRoYXQgcmVhbCByZWFkcyBhbmQgd3JpdGVzIHdpbGwgZ28gdGhyb3VnaCB0by4KKyAgICogQHBhcmFtIGluaXRpYWxCdWZmZXJDYXBhY2l0eSBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgorICAgKiBJbiBwcmFjdGljZSwgaXQncyBub3QgY3JpdGljYWwgdG8gc2V0IHRoaXMgdW5sZXNzIHlvdSBrbm93IGluIGFkdmFuY2UgdGhhdAorICAgKiB5b3VyIG1lc3NhZ2VzIGFyZSBnb2luZyB0byBiZSB2ZXJ5IGxhcmdlLiAoWW91IGNhbiBwYXNzCisgICAqIFRGcmFtZWRUcmFuc3BvcnRXaXRoUmV1c2FibGVCdWZmZXIuREVGQVVMVF9CVUZfQ0FQQUNJVFkgaWYgeW91J3JlIG9ubHkKKyAgICogdXNpbmcgdGhpcyBjb25zdHJ1Y3RvciBiZWNhdXNlIHlvdSB3YW50IHRvIHNldCB0aGUgbWF4TGVuZ3RoLikKKyAgICogQHBhcmFtIG1heExlbmd0aCBUaGUgbWF4IGZyYW1lIHNpemUgeW91IGFyZSB3aWxsaW5nIHRvIHJlYWQuIFlvdSBjYW4gdXNlCisgICAqIHRoaXMgcGFyYW1ldGVyIHRvIGxpbWl0IGhvdyBtdWNoIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkLgorICAgKi8KKyAgcHVibGljIFRGYXN0RnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZywgaW50IGluaXRpYWxCdWZmZXJDYXBhY2l0eSwgaW50IG1heExlbmd0aCkgeworICAgIHRoaXMudW5kZXJseWluZyA9IHVuZGVybHlpbmc7CisgICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7CisgICAgdGhpcy5pbml0aWFsQnVmZmVyQ2FwYWNpdHkgPSBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CisgICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHkpOworICAgIHdyaXRlQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIHVuZGVybHlpbmcuY2xvc2UoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIHVuZGVybHlpbmcuaXNPcGVuKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB1bmRlcmx5aW5nLm9wZW4oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGludCBnb3QgPSByZWFkQnVmZmVyLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgIHJldHVybiBnb3Q7CisgICAgfQorCisgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICByZWFkRnJhbWUoKTsKKworICAgIHJldHVybiByZWFkQnVmZmVyLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZEZyYW1lKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHVuZGVybHlpbmcucmVhZEFsbChpMzJidWYgLCAwLCA0KTsKKyAgICBpbnQgc2l6ZSA9IFRGcmFtZWRUcmFuc3BvcnQuZGVjb2RlRnJhbWVTaXplKGkzMmJ1Zik7CisKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIgKyBzaXplICsgIikhIik7CisgICAgfQorCisgICAgaWYgKHNpemUgPiBtYXhMZW5ndGgpIHsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGggKyAiKSEiKTsKKyAgICB9CisKKyAgICByZWFkQnVmZmVyLmZpbGwodW5kZXJseWluZywgc2l6ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHdyaXRlQnVmZmVyLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNvbnN1bWVCdWZmZXIoaW50IGxlbikgeworICAgIHJlYWRCdWZmZXIuY29uc3VtZUJ1ZmZlcihsZW4pOworICB9CisKKyAgLyoqCisgICAqIE9ubHkgY2xlYXJzIHRoZSByZWFkIGJ1ZmZlciEKKyAgICovCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHJlYWRCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpbnQgcGF5bG9hZExlbmd0aCA9IHdyaXRlQnVmZmVyLmdldExlbmd0aCgpIC0gNDsgICAgICAgIAorICAgIGJ5dGVbXSBkYXRhID0gd3JpdGVCdWZmZXIuZ2V0QnVmKCkuYXJyYXkoKTsKKyAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShwYXlsb2FkTGVuZ3RoLCBkYXRhKTsKKyAgICB1bmRlcmx5aW5nLndyaXRlKGRhdGEsIDAsIHBheWxvYWRMZW5ndGggKyA0KTsKKyAgICB3cml0ZUJ1ZmZlci5yZXNldCgpOworICAgIHVuZGVybHlpbmcuZmx1c2goKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYnl0ZVtdIGdldEJ1ZmZlcigpIHsKKyAgICByZXR1cm4gcmVhZEJ1ZmZlci5nZXRCdWZmZXIoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGdldEJ1ZmZlclBvc2l0aW9uKCkgeworICAgIHJldHVybiByZWFkQnVmZmVyLmdldEJ1ZmZlclBvc2l0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBnZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgeworICAgIHJldHVybiByZWFkQnVmZmVyLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDg3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CisKKy8qKgorICogRmlsZVByb2Nlc3NvcjogaGVscHMgaW4gcHJvY2Vzc2luZyBmaWxlcyBnZW5lcmF0ZWQgYnkgVEZpbGVUcmFuc3BvcnQuCisgKiBQb3J0IG9mIG9yaWdpbmFsIGNwcCBpbXBsZW1lbnRhdGlvbgorICovCitwdWJsaWMgY2xhc3MgVEZpbGVQcm9jZXNzb3IgeworCisgIHByaXZhdGUgVFByb2Nlc3NvciBwcm9jZXNzb3JfOworICBwcml2YXRlIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBwcml2YXRlIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgcHJpdmF0ZSBURmlsZVRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydF87CisgIHByaXZhdGUgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnRfOworCisgIHB1YmxpYyBURmlsZVByb2Nlc3NvcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBURmlsZVRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0KSB7CisgICAgcHJvY2Vzc29yXyA9IHByb2Nlc3NvcjsKKyAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8gPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gcHJvdG9jb2xGYWN0b3J5OworICAgIGlucHV0VHJhbnNwb3J0XyA9IGlucHV0VHJhbnNwb3J0OworICAgIG91dHB1dFRyYW5zcG9ydF8gPSBvdXRwdXRUcmFuc3BvcnQ7CisgIH0KKworICBwdWJsaWMgVEZpbGVQcm9jZXNzb3IoVFByb2Nlc3NvciBwcm9jZXNzb3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVEZpbGVUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCkgeworICAgIHByb2Nlc3Nvcl8gPSBwcm9jZXNzb3I7CisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICBpbnB1dFRyYW5zcG9ydF8gPSBpbnB1dFRyYW5zcG9ydDsKKyAgICBvdXRwdXRUcmFuc3BvcnRfID0gb3V0cHV0VHJhbnNwb3J0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NVbnRpbChpbnQgbGFzdENodW5rKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVFByb3RvY29sIGlwID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7CisgICAgVFByb3RvY29sIG9wID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnRfKTsKKyAgICBpbnQgY3VyQ2h1bmsgPSBpbnB1dFRyYW5zcG9ydF8uZ2V0Q3VyQ2h1bmsoKTsKKworICAgIHRyeSB7CisgICAgICB3aGlsZSAobGFzdENodW5rID49IGN1ckNodW5rKSB7CisgICAgICAgIHByb2Nlc3Nvcl8ucHJvY2VzcyhpcCwgb3ApOworICAgICAgICBpbnQgbmV3Q2h1bmsgPSBpbnB1dFRyYW5zcG9ydF8uZ2V0Q3VyQ2h1bmsoKTsKKyAgICAgICAgY3VyQ2h1bmsgPSBuZXdDaHVuazsKKyAgICAgIH0gCisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBpZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgbGFzdCBjaHVuayAtIHdlIGNvdWxkIGhhdmUganVzdCBoaXQgRU9GCisgICAgICAvLyBvbiBFT0YgLSB0cmFwIHRoZSBlcnJvciBhbmQgc3RvcCBwcm9jZXNzaW5nLgorICAgICAgaWYoZS5nZXRUeXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSkKKyAgICAgICAgdGhyb3cgZTsKKyAgICAgIGVsc2UgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFByb2Nlc3MgZnJvbSBzdGFydCB0byBsYXN0IGNodW5rIGJvdGggaW5jbHVzaXZlIHdoZXJlIGNodW5rcyBiZWdpbiBmcm9tIDAKKworICAgKiBAcGFyYW0gc3RhcnRDaHVua051bSBmaXJzdCBjaHVuayB0byBiZSBwcm9jZXNzZWQKKyAgICogQHBhcmFtIGVuZENodW5rTnVtIGxhc3QgY2h1bmsgdG8gYmUgcHJvY2Vzc2VkCisgICAqLworICBwdWJsaWMgdm9pZCBwcm9jZXNzQ2h1bmsoaW50IHN0YXJ0Q2h1bmtOdW0sIGludCBlbmRDaHVua051bSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGludCBudW1DaHVua3MgPSBpbnB1dFRyYW5zcG9ydF8uZ2V0TnVtQ2h1bmtzKCk7CisgICAgaWYoZW5kQ2h1bmtOdW0gPCAwKQorICAgICAgZW5kQ2h1bmtOdW0gKz0gbnVtQ2h1bmtzOworCisgICAgaWYoc3RhcnRDaHVua051bSA8IDApCisgICAgICBzdGFydENodW5rTnVtICs9IG51bUNodW5rczsKKworICAgIGlmKGVuZENodW5rTnVtIDwgc3RhcnRDaHVua051bSkKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJlbmRDaHVua051bSAiICsgZW5kQ2h1bmtOdW0gKyAiIGlzIGxlc3MgdGhhbiAiICsgc3RhcnRDaHVua051bSk7CisKKyAgICBpbnB1dFRyYW5zcG9ydF8uc2Vla1RvQ2h1bmsoc3RhcnRDaHVua051bSk7CisgICAgcHJvY2Vzc1VudGlsKGVuZENodW5rTnVtKTsKKyAgfQorCisgIC8qKgorICAgKiBQcm9jZXNzIGEgc2luZ2xlIGNodW5rCisgICAqCisgICAqIEBwYXJhbSBjaHVua051bSBjaHVuayB0byBiZSBwcm9jZXNzZWQKKyAgICovCisgIHB1YmxpYyB2b2lkIHByb2Nlc3NDaHVuayhpbnQgY2h1bmtOdW0pIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBwcm9jZXNzQ2h1bmsoY2h1bmtOdW0sIGNodW5rTnVtKTsKKyAgfQorCisgIC8qKgorICAgKiBQcm9jZXNzIGEgY3VycmVudCBjaHVuaworICAgKi8KKyAgcHVibGljIHZvaWQgcHJvY2Vzc0NodW5rKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHByb2Nlc3NDaHVuayhpbnB1dFRyYW5zcG9ydF8uZ2V0Q3VyQ2h1bmsoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDExYzUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogRmlsZVRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKiBDdXJyZW50bHkgdGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBwb3J0IG9mIHRoZSBjcHAgaW1wbGVtZW50YXRpb24KKyAqIAorICogSXQgbWF5IG1ha2UgYmV0dGVyIHNlbnNlIHRvIHByb3ZpZGUgYSBiYXNpYyBzdHJlYW0gYWNjZXNzIG9uIHRvcCBvZiB0aGUgZnJhbWVkIGZpbGUgZm9ybWF0CisgKiBUaGUgRmlsZVRyYW5zcG9ydCBjYW4gdGhlbiBiZSBhIHVzZXIgb2YgdGhpcyBmcmFtZWQgZmlsZSBmb3JtYXQgd2l0aCBzb21lIGFkZGl0aW9uYWwgbG9naWMKKyAqIGZvciBjaHVua2luZy4KKyAqLworcHVibGljIGNsYXNzIFRGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBUcnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbSB7CisgICAgcHVibGljIHZvaWQgdHJ1bmMoKSB7CisgICAgICBwb3MgPSBjb3VudCA9IDA7CisgICAgfSAgICAgICAgCisgICAgcHVibGljIFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgIHN1cGVyKGluKTsKKyAgICB9CisgICAgcHVibGljIFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBzaXplKSB7CisgICAgICBzdXBlcihpbiwgc2l6ZSk7CisgICAgfQorICB9CisKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEV2ZW50IHsKKyAgICBwcml2YXRlIGJ5dGVbXSBidWZfOworICAgIHByaXZhdGUgaW50IG5yZWFkXzsKKyAgICBwcml2YXRlIGludCBuYXZhaWxhYmxlXzsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYW4gZXZlbnQuIEluaXRpYWxseSwgaXQgaGFzIG5vIHZhbGlkIGNvbnRlbnRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIGJ5dGUgYXJyYXkgYnVmZmVyIHRvIHN0b3JlIGV2ZW50IAorICAgICAqLworICAgIHB1YmxpYyBFdmVudChieXRlW10gYnVmKSB7CisgICAgICBidWZfID0gYnVmOworICAgICAgbnJlYWRfID0gbmF2YWlsYWJsZV8gPSAwOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0QnVmKCkgeyByZXR1cm4gYnVmXzt9CisgICAgcHVibGljIGludCBnZXRTaXplKCkgeyByZXR1cm4gYnVmXy5sZW5ndGg7IH0KKworCisgICAgcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlKGludCBzeikgeyBucmVhZF8gPSAwOyBuYXZhaWxhYmxlXz1zejt9CisgICAgcHVibGljIGludCBnZXRSZW1haW5pbmcoKSB7IHJldHVybiAobmF2YWlsYWJsZV8gLSBucmVhZF8pOyB9CisKKyAgICBwdWJsaWMgaW50IGVtaXQoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IG5kZXNpcmVkKSB7CisgICAgICBpZigobmRlc2lyZWQgPT0gMCkgfHwgKG5kZXNpcmVkID4gZ2V0UmVtYWluaW5nKCkpKQorICAgICAgICBuZGVzaXJlZCA9IGdldFJlbWFpbmluZygpOworCisgICAgICBpZihuZGVzaXJlZCA8PSAwKQorICAgICAgICByZXR1cm4gKG5kZXNpcmVkKTsKKworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZfLCBucmVhZF8sIGJ1Ziwgb2Zmc2V0LCBuZGVzaXJlZCk7CisgICAgICBucmVhZF8gKz0gbmRlc2lyZWQ7CisKKyAgICAgIHJldHVybihuZGVzaXJlZCk7CisgICAgfQorICB9OworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2h1bmtTdGF0ZSB7CisgICAgLyoqCisgICAgICogQ2h1bmsgU2l6ZS4gTXVzdCBiZSBzYW1lIGFjcm9zcyBhbGwgaW1wbGVtZW50YXRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DSFVOS19TSVpFID0gMTYgKiAxMDI0ICogMTAyNDsKKworICAgIHByaXZhdGUgaW50IGNodW5rX3NpemVfID0gREVGQVVMVF9DSFVOS19TSVpFOworICAgIHByaXZhdGUgbG9uZyBvZmZzZXRfID0gMDsKKworICAgIHB1YmxpYyBDaHVua1N0YXRlKCkge30KKyAgICBwdWJsaWMgQ2h1bmtTdGF0ZShpbnQgY2h1bmtfc2l6ZSkgeyBjaHVua19zaXplXyA9IGNodW5rX3NpemU7IH0KKworICAgIHB1YmxpYyB2b2lkIHNraXAoaW50IHNpemUpIHtvZmZzZXRfICs9IHNpemU7IH0KKyAgICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgb2Zmc2V0KSB7b2Zmc2V0XyA9IG9mZnNldDt9CisKKyAgICBwdWJsaWMgaW50IGdldENodW5rU2l6ZSgpIHsgcmV0dXJuIGNodW5rX3NpemVfO30KKyAgICBwdWJsaWMgaW50IGdldENodW5rTnVtKCkgeyByZXR1cm4gKChpbnQpKG9mZnNldF8vY2h1bmtfc2l6ZV8pKTt9CisgICAgcHVibGljIGludCBnZXRSZW1haW5pbmcoKSB7IHJldHVybiAoY2h1bmtfc2l6ZV8gLSAoKGludCkob2Zmc2V0XyAlIGNodW5rX3NpemVfKSkpO30KKyAgICBwdWJsaWMgbG9uZyBnZXRPZmZzZXQoKSB7IHJldHVybiAob2Zmc2V0Xyk7fQorICB9CisKKyAgcHVibGljIHN0YXRpYyBlbnVtIFRhaWxQb2xpY3kgeworCisgICAgTk9XQUlUKDAsIDApLAorICAgICAgV0FJVF9GT1JFVkVSKDUwMCwgLTEpOworCisgICAgLyoqCisgICAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIG5leHQgcmVhZAorICAgICAqIElmIDAsIG5vIHNsZWVwCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCB0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBnaXZpbmcgdXAKKyAgICAgKiBpZiAwLCBubyByZXRyaWVzCisgICAgICogaWYgLTEsIHJldHJ5IGZvcmV2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IHJldHJpZXNfOworCisgICAgLyoqCisgICAgICogY3RvciBmb3IgcG9saWN5CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCBzbGVlcCB0aW1lIGZvciB0aGlzIHBhcnRpY3VsYXIgcG9saWN5CisgICAgICogQHBhcmFtIHJldHJpZXMgbnVtYmVyIG9mIHJldHJpZXMKKyAgICAgKi8KKworICAgIFRhaWxQb2xpY3koaW50IHRpbWVvdXQsIGludCByZXRyaWVzKSB7CisgICAgICB0aW1lb3V0XyA9IHRpbWVvdXQ7CisgICAgICByZXRyaWVzXyA9IHJldHJpZXM7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEN1cnJlbnQgdGFpbGluZyBwb2xpY3kKKyAgICovCisgIFRhaWxQb2xpY3kgY3VycmVudFBvbGljeV8gPSBUYWlsUG9saWN5Lk5PV0FJVDsKKworCisgIC8qKiAKKyAgICogVW5kZXJseWluZyBmaWxlIGJlaW5nIHJlYWQKKyAgICovCisgIHByb3RlY3RlZCBUU2Vla2FibGVGaWxlIGlucHV0RmlsZV8gPSBudWxsOworCisgIC8qKiAKKyAgICogVW5kZXJseWluZyBvdXRwdXRTdHJlYW0gCisgICAqLworICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbV8gPSBudWxsOworCisKKyAgLyoqCisgICAqIEV2ZW50IGN1cnJlbnRseSByZWFkIGluCisgICAqLworICBFdmVudCBjdXJyZW50RXZlbnRfID0gbnVsbDsKKworICAvKioKKyAgICogSW5wdXRTdHJlYW0gY3VycmVudGx5IGJlaW5nIHVzZWQgZm9yIHJlYWRpbmcKKyAgICovCisgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtXyA9IG51bGw7CisKKyAgLyoqCisgICAqIGN1cnJlbnQgQ2h1bmsgc3RhdGUKKyAgICovCisgIENodW5rU3RhdGUgY3MgPSBudWxsOworCisgIC8qKgorICAgKiBpcyByZWFkIG9ubHk/CisgICAqLworICBwcml2YXRlIGJvb2xlYW4gcmVhZE9ubHlfID0gZmFsc2U7CisKKyAgLyoqCisgICAqIEdldCBGaWxlIFRhaWxpbmcgUG9saWN5CisgICAqIAorICAgKiBAcmV0dXJuIGN1cnJlbnQgcmVhZCBwb2xpY3kKKyAgICovCisgIHB1YmxpYyBUYWlsUG9saWN5IGdldFRhaWxQb2xpY3koKSB7CisgICAgcmV0dXJuIChjdXJyZW50UG9saWN5Xyk7CisgIH0KKworICAvKioKKyAgICogU2V0IGZpbGUgVGFpbGluZyBQb2xpY3kKKyAgICogCisgICAqIEBwYXJhbSBwb2xpY3kgTmV3IHBvbGljeSB0byBzZXQKKyAgICogQHJldHVybiBPbGQgcG9saWN5CisgICAqLworICBwdWJsaWMgVGFpbFBvbGljeSBzZXRUYWlsUG9saWN5KFRhaWxQb2xpY3kgcG9saWN5KSB7CisgICAgVGFpbFBvbGljeSBvbGQgPSBjdXJyZW50UG9saWN5XzsKKyAgICBjdXJyZW50UG9saWN5XyA9IHBvbGljeTsKKyAgICByZXR1cm4gKG9sZCk7CisgIH0KKworCisgIC8qKgorICAgKiBJbml0aWFsaXplIHJlYWQgaW5wdXQgc3RyZWFtCisgICAqIAorICAgKiBAcmV0dXJuIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20gZmlsZQorICAgKi8KKyAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBJbnB1dFN0cmVhbSBpczsKKyAgICB0cnkgeworICAgICAgaWYoaW5wdXRTdHJlYW1fICE9IG51bGwpIHsKKyAgICAgICAgKChUcnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtKWlucHV0U3RyZWFtXykudHJ1bmMoKTsKKyAgICAgICAgaXMgPSBpbnB1dFN0cmVhbV87CisgICAgICB9IGVsc2UgeworICAgICAgICBpcyA9IG5ldyBUcnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0RmlsZV8uZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNyZWF0ZUlucHV0U3RyZWFtOiAiK2lveC5nZXRNZXNzYWdlKCkpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94LmdldE1lc3NhZ2UoKSwgaW94KTsKKyAgICB9CisgICAgcmV0dXJuKGlzKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkIChwb3RlbnRpYWxseSB0YWlsaW5nKSBhbiBpbnB1dCBzdHJlYW0KKyAgICogCisgICAqIEBwYXJhbSBpcyBJbnB1dFN0cmVhbSB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBpbnRvCisgICAqIEBwYXJhbSBvZmYgT2Zmc2V0IGluIGJ1ZmZlciB0byByZWFkIGludG8KKyAgICogQHBhcmFtIGxlbiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgKiBAcGFyYW0gdHAgIHBvbGljeSB0byB1c2UgaWYgd2UgaGl0IEVPRgorICAgKgorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkCisgICAqLworICBwcml2YXRlIGludCB0YWlsUmVhZChJbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGJ1ZiwgCisgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmYsIGludCBsZW4sIFRhaWxQb2xpY3kgdHApIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpbnQgb3JpZ19sZW4gPSBsZW47CisgICAgdHJ5IHsKKyAgICAgIGludCByZXRyaWVzID0gMDsKKyAgICAgIHdoaWxlKGxlbiA+IDApIHsKKyAgICAgICAgaW50IGNudCA9IGlzLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIGlmKGNudCA+IDApIHsKKyAgICAgICAgICBvZmYgKz0gY250OworICAgICAgICAgIGxlbiAtPSBjbnQ7CisgICAgICAgICAgcmV0cmllcyA9IDA7CisgICAgICAgICAgY3Muc2tpcChjbnQpOyAvLyByZW1lbWJlciB0aGF0IHdlIHJlYWQgc28gbWFueSBieXRlcworICAgICAgICB9IGVsc2UgaWYgKGNudCA9PSAtMSkgeworICAgICAgICAgIC8vIEVPRgorICAgICAgICAgIHJldHJpZXMrKzsKKworICAgICAgICAgIGlmKCh0cC5yZXRyaWVzXyAhPSAtMSkgJiYgdHAucmV0cmllc18gPCByZXRyaWVzKQorICAgICAgICAgICAgcmV0dXJuIChvcmlnX2xlbiAtIGxlbik7CisKKyAgICAgICAgICBpZih0cC50aW1lb3V0XyA+IDApIHsKKyAgICAgICAgICAgIHRyeSB7VGhyZWFkLnNsZWVwKHRwLnRpbWVvdXRfKTt9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIGVpdGhlciBub24temVybyBvciAtMSBpcyB3aGF0IHRoZSBjb250cmFjdCBzYXlzIQorICAgICAgICAgIHRocm93IG5ldworICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVW5leHBlY3RlZCByZXR1cm4gZnJvbSBJbnB1dFN0cmVhbS5yZWFkID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNudCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlveC5nZXRNZXNzYWdlKCksIGlveCk7CisgICAgfQorCisgICAgcmV0dXJuKG9yaWdfbGVuIC0gbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBFdmVudCBpcyBjb3JydXB0ZWQuIERvIHJlY292ZXJ5CisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiByZWNvdmVyeSBjb3VsZCBiZSBwZXJmb3JtZWQgYW5kIHdlIGNhbiByZWFkIG1vcmUgZGF0YQorICAgKiAgICAgICAgIGZhbHNlIGlzIHJldHVybmVkIG9ubHkgd2hlbiBub3RoaW5nIG1vcmUgY2FuIGJlIHJlYWQKKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiBwZXJmb3JtUmVjb3ZlcnkoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaW50IG51bUNodW5rcyA9IGdldE51bUNodW5rcygpOworICAgIGludCBjdXJDaHVuayA9IGNzLmdldENodW5rTnVtKCk7CisKKyAgICBpZihjdXJDaHVuayA+PSAobnVtQ2h1bmtzLTEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNlZWtUb0NodW5rKGN1ckNodW5rKzEpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFJlYWQgZXZlbnQgZnJvbSB1bmRlcmx5aW5nIGZpbGUKKyAgICoKKyAgICogQHJldHVybiB0cnVlIGlmIGV2ZW50IGNvdWxkIGJlIHJlYWQsIGZhbHNlIG90aGVyd2lzZSAob24gRU9GKQorICAgKi8KKyAgcHJpdmF0ZSBib29sZWFuIHJlYWRFdmVudCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBieXRlW10gZWJ5dGVzID0gbmV3IGJ5dGVbNF07CisgICAgaW50IGVzaXplOworICAgIGludCBucmVhZDsKKyAgICBpbnQgbnJlcXVlc3RlZDsKKworICAgIHJldHJ5OgorICAgIGRvIHsKKyAgICAgIC8vIGNvcm5lciBjYXNlLiByZWFkIHRvIGVuZCBvZiBjaHVuaworICAgICAgbnJlcXVlc3RlZCA9IGNzLmdldFJlbWFpbmluZygpOworICAgICAgaWYobnJlcXVlc3RlZCA8IDQpIHsKKyAgICAgICAgbnJlYWQgPSB0YWlsUmVhZChpbnB1dFN0cmVhbV8sIGVieXRlcywgMCwgbnJlcXVlc3RlZCwgY3VycmVudFBvbGljeV8pOworICAgICAgICBpZihucmVhZCAhPSBucmVxdWVzdGVkKSB7CisgICAgICAgICAgcmV0dXJuKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBhc3N1bWluZyBzZXJpYWxpemVkIG9uIGxpdHRsZSBlbmRpYW4gbWFjaGluZQorICAgICAgbnJlYWQgPSB0YWlsUmVhZChpbnB1dFN0cmVhbV8sIGVieXRlcywgMCwgNCwgY3VycmVudFBvbGljeV8pOworICAgICAgaWYobnJlYWQgIT0gNCkgeworICAgICAgICByZXR1cm4oZmFsc2UpOworICAgICAgfQorCisgICAgICBlc2l6ZT0wOworICAgICAgZm9yKGludCBpPTM7IGk+PTA7IGktLSkgeworICAgICAgICBpbnQgdmFsID0gKDB4MDAwMDAwZmYgJiAoaW50KWVieXRlc1tpXSk7CisgICAgICAgIGVzaXplIHw9ICh2YWwgPDwgKGkqOCkpOworICAgICAgfQorCisgICAgICAvLyBjaGVjayBpZiBldmVudCBpcyBjb3JydXB0ZWQgYW5kIGRvIHJlY292ZXJ5IGFzIHJlcXVpcmVkCisgICAgICBpZihlc2l6ZSA+IGNzLmdldFJlbWFpbmluZygpKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGaWxlVHJhbnNwb3J0IGVycm9yOiBiYWQgZXZlbnQgc2l6ZSIpOworICAgICAgICAvKiAgICAgICAgCisgICAgICAgICAgICAgICAgICBpZihwZXJmb3JtUmVjb3ZlcnkoKSkgeworICAgICAgICAgICAgICAgICAgZXNpemU9MDsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICovCisgICAgICB9CisgICAgfSB3aGlsZSAoZXNpemUgPT0gMCk7CisKKyAgICAvLyByZXNldCBleGlzdGluZyBldmVudCBvciBnZXQgYSBsYXJnZXIgb25lCisgICAgaWYoY3VycmVudEV2ZW50Xy5nZXRTaXplKCkgPCBlc2l6ZSkKKyAgICAgIGN1cnJlbnRFdmVudF8gPSBuZXcgRXZlbnQobmV3IGJ5dGUgW2VzaXplXSk7CisKKyAgICAvLyBwb3B1bGF0ZSB0aGUgZXZlbnQKKyAgICBieXRlW10gYnVmID0gY3VycmVudEV2ZW50Xy5nZXRCdWYoKTsKKyAgICBucmVhZCA9IHRhaWxSZWFkKGlucHV0U3RyZWFtXywgYnVmLCAwLCBlc2l6ZSwgY3VycmVudFBvbGljeV8pOworICAgIGlmKG5yZWFkICE9IGVzaXplKSB7CisgICAgICByZXR1cm4oZmFsc2UpOworICAgIH0KKyAgICBjdXJyZW50RXZlbnRfLnNldEF2YWlsYWJsZShlc2l6ZSk7CisgICAgcmV0dXJuKHRydWUpOworICB9CisKKyAgLyoqCisgICAqIG9wZW4gaWYgYm90aCBpbnB1dC9vdXRwdXQgb3BlbiB1bmxlc3MgcmVhZG9ubHkKKyAgICoKKyAgICogQHJldHVybiB0cnVlCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuICgoaW5wdXRTdHJlYW1fICE9IG51bGwpICYmIChyZWFkT25seV8gfHwgKG91dHB1dFN0cmVhbV8gIT0gbnVsbCkpKTsKKyAgfQorCisKKyAgLyoqCisgICAqIERpdmVyZ2luZyBmcm9tIHRoZSBjcHAgbW9kZWwgYW5kIHN0aWNraW5nIHRvIHRoZSBUU29ja2V0IG1vZGVsCisgICAqIEZpbGVzIGFyZSBub3Qgb3BlbmVkIGluIGN0b3IgLSBidXQgaW4gZXhwbGljaXQgb3BlbiBjYWxsCisgICAqLworICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmIChpc09wZW4oKSkgCisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkFMUkVBRFlfT1BFTik7CisKKyAgICB0cnkgeworICAgICAgaW5wdXRTdHJlYW1fID0gY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgIGNzID0gbmV3IENodW5rU3RhdGUoKTsKKyAgICAgIGN1cnJlbnRFdmVudF8gPSBuZXcgRXZlbnQobmV3IGJ5dGUgWzI1Nl0pOworCisgICAgICBpZighcmVhZE9ubHlfKQorICAgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGlucHV0RmlsZV8uZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgICAqLworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoaW5wdXRGaWxlXyAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBpbnB1dEZpbGVfLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBFcnJvciBjbG9zaW5nIGlucHV0IGZpbGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW94LmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgICBpbnB1dEZpbGVfID0gbnVsbDsKKyAgICB9CisgICAgaWYgKG91dHB1dFN0cmVhbV8gIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgb3V0cHV0U3RyZWFtXy5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV0FSTklORzogRXJyb3IgY2xvc2luZyBvdXRwdXQgc3RyZWFtOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlveC5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgICAgb3V0cHV0U3RyZWFtXyA9IG51bGw7CisgICAgfQorICB9CisKKworICAvKioKKyAgICogRmlsZSBUcmFuc3BvcnQgY3RvcgorICAgKgorICAgKiBAcGFyYW0gcGF0aCBGaWxlIHBhdGggdG8gcmVhZCBhbmQgd3JpdGUgZnJvbQorICAgKiBAcGFyYW0gcmVhZE9ubHkgV2hldGhlciB0aGlzIGlzIGEgcmVhZC1vbmx5IHRyYW5zcG9ydAorICAgKi8gCisgIHB1YmxpYyBURmlsZVRyYW5zcG9ydChmaW5hbCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWFkT25seSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnB1dEZpbGVfID0gbmV3IFRTdGFuZGFyZEZpbGUocGF0aCk7CisgICAgcmVhZE9ubHlfID0gcmVhZE9ubHk7CisgIH0KKworICAvKioKKyAgICogRmlsZSBUcmFuc3BvcnQgY3RvcgorICAgKgorICAgKiBAcGFyYW0gaW5wdXRGaWxlIG9wZW4gVFNlZWthYmxlRmlsZSB0byByZWFkL3dyaXRlIGZyb20KKyAgICogQHBhcmFtIHJlYWRPbmx5IFdoZXRoZXIgdGhpcyBpcyBhIHJlYWQtb25seSB0cmFuc3BvcnQKKyAgICovCisgIHB1YmxpYyBURmlsZVRyYW5zcG9ydChUU2Vla2FibGVGaWxlIGlucHV0RmlsZSwgYm9vbGVhbiByZWFkT25seSkgeworICAgIGlucHV0RmlsZV8gPSBpbnB1dEZpbGU7CisgICAgcmVhZE9ubHlfID0gcmVhZE9ubHk7CisgIH0KKworCisgIC8qKgorICAgKiBDbG9uZWQgZnJvbSBUVHJhbnNwb3J0LmphdmE6cmVhZEFsbCgpLiBPbmx5IGRpZmZlcmVuY2UgaXMgdGhyb3dpbmcgYW4gRU9GIGV4Y2VwdGlvbgorICAgKiB3aGVyZSBvbmUgaXMgZGV0ZWN0ZWQuCisgICAqLworICBwdWJsaWMgaW50IHJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaW50IGdvdCA9IDA7CisgICAgaW50IHJldCA9IDA7CisgICAgd2hpbGUgKGdvdCA8IGxlbikgeworICAgICAgcmV0ID0gcmVhZChidWYsIG9mZitnb3QsIGxlbi1nb3QpOworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVycm9yIGluIHJlYWRpbmcgZnJvbSBmaWxlIik7CisgICAgICB9CisgICAgICBpZihyZXQgPT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5kIG9mIEZpbGUgcmVhY2hlZCIpOworICAgICAgfQorICAgICAgZ290ICs9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGdvdDsKKyAgfQorCisKKyAgLyoqCisgICAqIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBpbnRvIGJ1ZmZlciBidWYsIHN0YXJ0aW5nIGF0IG9mZnNldCBvZmYuCisgICAqCisgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgICovCisgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYoIWlzT3BlbigpKSAKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgb3BlbiBiZWZvcmUgcmVhZGluZyIpOworCisgICAgaWYoY3VycmVudEV2ZW50Xy5nZXRSZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICBpZighcmVhZEV2ZW50KCkpCisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBpbnQgbnJlYWQgPSBjdXJyZW50RXZlbnRfLmVtaXQoYnVmLCBvZmYsIGxlbik7CisgICAgcmV0dXJuIG5yZWFkOworICB9CisKKyAgcHVibGljIGludCBnZXROdW1DaHVua3MoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYoIWlzT3BlbigpKSAKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgb3BlbiBiZWZvcmUgZ2V0TnVtQ2h1bmtzIik7CisgICAgdHJ5IHsKKyAgICAgIGxvbmcgbGVuID0gaW5wdXRGaWxlXy5sZW5ndGgoKTsKKyAgICAgIGlmKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGVsc2UgCisgICAgICAgIHJldHVybiAoKChpbnQpKGxlbi9jcy5nZXRDaHVua1NpemUoKSkpICsgMSk7CisKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlveC5nZXRNZXNzYWdlKCksIGlveCk7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRDdXJDaHVuaygpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZighaXNPcGVuKCkpIAorICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBvcGVuIGJlZm9yZSBnZXRDdXJDaHVuayIpOworICAgIHJldHVybiAoY3MuZ2V0Q2h1bmtOdW0oKSk7CisKKyAgfQorCisKKyAgcHVibGljIHZvaWQgc2Vla1RvQ2h1bmsoaW50IGNodW5rKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYoIWlzT3BlbigpKSAKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3Qgb3BlbiBiZWZvcmUgc2Vla2luZyIpOworCisgICAgaW50IG51bUNodW5rcyA9IGdldE51bUNodW5rcygpOworCisgICAgLy8gZmlsZSBpcyBlbXB0eSwgc2Vla2luZyB0byBjaHVuayBpcyBwb2ludGxlc3MKKyAgICBpZiAobnVtQ2h1bmtzID09IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBuZWdhdGl2ZSBpbmRpY2F0ZXMgcmV2ZXJzZSBzZWVrIChmcm9tIHRoZSBlbmQpCisgICAgaWYgKGNodW5rIDwgMCkgeworICAgICAgY2h1bmsgKz0gbnVtQ2h1bmtzOworICAgIH0KKworICAgIC8vIHRvbyBsYXJnZSBhIHZhbHVlIGZvciByZXZlcnNlIHNlZWssIGp1c3Qgc2VlayB0byBiZWdpbm5pbmcKKyAgICBpZiAoY2h1bmsgPCAwKSB7CisgICAgICBjaHVuayA9IDA7CisgICAgfQorCisgICAgbG9uZyBlb2ZPZmZzZXQ9MDsKKyAgICBib29sZWFuIHNlZWtUb0VuZCA9IChjaHVuayA+PSBudW1DaHVua3MpOworICAgIGlmKHNlZWtUb0VuZCkgeworICAgICAgY2h1bmsgPSBjaHVuayAtIDE7CisgICAgICB0cnkgeyBlb2ZPZmZzZXQgPSBpbnB1dEZpbGVfLmxlbmd0aCgpOyB9CisgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7dGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94LmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3gpO30KKyAgICB9CisKKyAgICBpZihjaHVuaypjcy5nZXRDaHVua1NpemUoKSAhPSBjcy5nZXRPZmZzZXQoKSkgeworICAgICAgdHJ5IHsgaW5wdXRGaWxlXy5zZWVrKChsb25nKWNodW5rKmNzLmdldENodW5rU2l6ZSgpKTsgfSAKKyAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJjcmVhdGVJbnB1dFN0cmVhbTogIitpb3guZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlNlZWsgdG8gY2h1bmsgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rICsgIiAiICtpb3guZ2V0TWVzc2FnZSgpLCBpb3gpOworICAgICAgfQorCisgICAgICBjcy5zZWVrKChsb25nKWNodW5rKmNzLmdldENodW5rU2l6ZSgpKTsKKyAgICAgIGN1cnJlbnRFdmVudF8uc2V0QXZhaWxhYmxlKDApOworICAgICAgaW5wdXRTdHJlYW1fID0gY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICB9CisKKyAgICBpZihzZWVrVG9FbmQpIHsKKyAgICAgIC8vIHdhaXRpbmcgZm9yZXZlciBoZXJlIC0gb3RoZXJ3aXNlIHdlIGNhbiBoaXQgRU9GIGFuZCBlbmQgdXAKKyAgICAgIC8vIGhhdmluZyBjb25zdW1lZCBwYXJ0aWFsIGRhdGEgZnJvbSB0aGUgZGF0YSBzdHJlYW0uCisgICAgICBUYWlsUG9saWN5IG9sZCA9IHNldFRhaWxQb2xpY3koVGFpbFBvbGljeS5XQUlUX0ZPUkVWRVIpOworICAgICAgd2hpbGUoY3MuZ2V0T2Zmc2V0KCkgPCBlb2ZPZmZzZXQpIHsgcmVhZEV2ZW50KCk7IH0KKyAgICAgIGN1cnJlbnRFdmVudF8uc2V0QXZhaWxhYmxlKDApOworICAgICAgc2V0VGFpbFBvbGljeShvbGQpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNlZWtUb0VuZCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZighaXNPcGVuKCkpIAorICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBvcGVuIGJlZm9yZSBzZWVraW5nIik7CisgICAgc2Vla1RvQ2h1bmsoZ2V0TnVtQ2h1bmtzKCkpOworICB9CisKKworICAvKioKKyAgICogV3JpdGVzIHVwIHRvIGxlbiBieXRlcyBmcm9tIHRoZSBidWZmZXIuCisgICAqCisgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBmcm9tCisgICAqIEBwYXJhbSBsZW4gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOb3QgU3VwcG9ydGVkIik7CisgIH0KKworICAvKioKKyAgICogRmx1c2ggYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSB0cmFuc3BvcnQgYnVmZmVyLgorICAgKgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgb3V0IGRhdGEuCisgICAqLworICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTm90IFN1cHBvcnRlZCIpOworICB9CisKKyAgLyoqCisgICAqIHRlc3QgcHJvZ3JhbQorICAgKiAKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgaW50IG51bV9jaHVua3MgPSAxMDsKKworICAgIGlmKChhcmdzLmxlbmd0aCA8IDEpIHx8IGFyZ3NbMF0uZXF1YWxzKCItLWhlbHAiKQorICAgICAgIHx8IGFyZ3NbMF0uZXF1YWxzKCItaCIpIHx8IGFyZ3NbMF0uZXF1YWxzKCItPyIpKSB7CisgICAgICBwcmludFVzYWdlKCk7CisgICAgfQorCisgICAgaWYoYXJncy5sZW5ndGggPiAxKSB7CisgICAgICB0cnkgeworICAgICAgICBudW1fY2h1bmtzID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IHBhcnNlICIgKyBhcmdzWzFdKTsgCisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBURmlsZVRyYW5zcG9ydCB0ID0gbmV3IFRGaWxlVHJhbnNwb3J0KGFyZ3NbMF0sIHRydWUpOworICAgIHQub3BlbigpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtQ2h1bmtzPSIrdC5nZXROdW1DaHVua3MoKSk7CisKKyAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oKTsKKyAgICBmb3IoaW50IGo9MDsgajxudW1fY2h1bmtzOyBqKyspIHsKKyAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgIGludCBjbnVtID0gci5uZXh0SW50KHQuZ2V0TnVtQ2h1bmtzKCktMSk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlYWRpbmcgY2h1bmsgIitjbnVtKTsKKyAgICAgIHQuc2Vla1RvQ2h1bmsoY251bSk7CisgICAgICBmb3IoaW50IGk9MDsgaTw0MDk2OyBpKyspIHsKKyAgICAgICAgdC5yZWFkKGJ1ZiwgMCwgNDA5Nik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgeworICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IFRGaWxlVHJhbnNwb3J0IDxmaWxlbmFtZT4gW251bV9jaHVua3NdIik7CisgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICAgICAgKE9wZW5zIGFuZCByZWFkcyBudW1fY2h1bmtzIGNodW5rcyBmcm9tIGZpbGUgcmFuZG9tbHkpIik7CisgICAgU3lzdGVtLmV4aXQoMSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCBmYWI5YzliLi5hMDA2YzNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMjMsMTEgKzIzLDExIEBACiAKIC8qKgogICogVEZyYW1lZFRyYW5zcG9ydCBpcyBhIGJ1ZmZlcmVkIFRUcmFuc3BvcnQgdGhhdCBlbnN1cmVzIGEgZnVsbHkgcmVhZCBtZXNzYWdlCi0gKiBldmVyeSB0aW1lIGJ5IHByZWNlZWRpbmcgbWVzc2FnZXMgd2l0aCBhIDQtYnl0ZSBmcmFtZSBzaXplLiAKKyAqIGV2ZXJ5IHRpbWUgYnkgcHJlY2VkaW5nIG1lc3NhZ2VzIHdpdGggYSA0LWJ5dGUgZnJhbWUgc2l6ZS4KICAqLwogcHVibGljIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9MRU5HVEggPSAweDdGRkZGRkZGOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9MRU5HVEggPSAxNjM4NDAwMDsKIAogICBwcml2YXRlIGludCBtYXhMZW5ndGhfOwogCkBAIC00NSw3ICs0NSw4IEBACiAgIC8qKgogICAgKiBCdWZmZXIgZm9yIGlucHV0CiAgICAqLwotICBwcml2YXRlIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCByZWFkQnVmZmVyXyA9IG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQobmV3IGJ5dGVbMF0pOworICBwcml2YXRlIGZpbmFsIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCByZWFkQnVmZmVyXyA9CisgICAgbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChuZXcgYnl0ZVswXSk7CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgVFRyYW5zcG9ydEZhY3RvcnkgewogICAgIHByaXZhdGUgaW50IG1heExlbmd0aF87CkBAIC01OCwyMiArNTksMzIgQEAKICAgICAgIG1heExlbmd0aF8gPSBtYXhMZW5ndGg7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgYmFzZSkgewogICAgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KGJhc2UsIG1heExlbmd0aF8pOwogICAgIH0KICAgfQogCiAgIC8qKgotICAgKiBDb25zdHJ1Y3RvciB3cmFwcyBhcm91bmQgYW5vdGhlciB0cmFucHNvcnQKKyAgICogU29tZXRoaW5nIHRvIGZpbGwgaW4gdGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIGJ1ZmZlcgorICAgKiB0byBtYWtlIHJvb20gZm9yIHRoZSBmcmFtZSBzaXplLiAgVGhpcyBhbGxvd3MgdGhlCisgICAqIGltcGxlbWVudGF0aW9uIHRvIHdyaXRlIG9uY2UgaW5zdGVhZCBvZiB0d2ljZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBzaXplRmlsbGVyXyA9IG5ldyBieXRlW10geyAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHdyYXBzIGFyb3VuZCBhbm90aGVyIHRyYW5zcG9ydAogICAgKi8KICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBtYXhMZW5ndGgpIHsKICAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OwogICAgIG1heExlbmd0aF8gPSBtYXhMZW5ndGg7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsKICAgfQogCiAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CiAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKICAgICBtYXhMZW5ndGhfID0gVEZyYW1lZFRyYW5zcG9ydC5ERUZBVUxUX01BWF9MRU5HVEg7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CkBAIC04OSwxMSArMTAwLDkgQEAKICAgfQogCiAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgaWYgKHJlYWRCdWZmZXJfICE9IG51bGwpIHsKLSAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgaWYgKGdvdCA+IDApIHsKLSAgICAgICAgcmV0dXJuIGdvdDsKLSAgICAgIH0KKyAgICBpbnQgZ290ID0gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICBpZiAoZ290ID4gMCkgeworICAgICAgcmV0dXJuIGdvdDsKICAgICB9CiAKICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQpAQCAtMTIyLDIxICsxMzEsMjUgQEAKICAgICByZWFkQnVmZmVyXy5jb25zdW1lQnVmZmVyKGxlbik7CiAgIH0KIAotICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlWzRdOworICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICByZWFkQnVmZmVyXy5jbGVhcigpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaTMyYnVmID0gbmV3IGJ5dGVbNF07CisKICAgcHJpdmF0ZSB2b2lkIHJlYWRGcmFtZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICB0cmFuc3BvcnRfLnJlYWRBbGwoaTMycmQsIDAsIDQpOwotICAgIGludCBzaXplID0KLSAgICAgICgoaTMycmRbMF0gJiAweGZmKSA8PCAyNCkgfAotICAgICAgKChpMzJyZFsxXSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgICAoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKLSAgICAgICgoaTMycmRbM10gJiAweGZmKSk7CisgICAgdHJhbnNwb3J0Xy5yZWFkQWxsKGkzMmJ1ZiwgMCwgNCk7CisgICAgaW50IHNpemUgPSBkZWNvZGVGcmFtZVNpemUoaTMyYnVmKTsKIAogICAgIGlmIChzaXplIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aF8pIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGhfICsgIikhIik7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwKKyAgICAgICAgICAiRnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgiICsgbWF4TGVuZ3RoXyArICIpISIpOwogICAgIH0KIAogICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbc2l6ZV07CkBAIC0xNDgsMTggKzE2MSwzMCBAQAogICAgIHdyaXRlQnVmZmVyXy53cml0ZShidWYsIG9mZiwgbGVuKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICBieXRlW10gYnVmID0gd3JpdGVCdWZmZXJfLmdldCgpOwotICAgIGludCBsZW4gPSB3cml0ZUJ1ZmZlcl8ubGVuKCk7CisgICAgaW50IGxlbiA9IHdyaXRlQnVmZmVyXy5sZW4oKSAtIDQ7ICAgICAgIC8vIGFjY291bnQgZm9yIHRoZSBwcmVwZW5kZWQgZnJhbWUgc2l6ZQogICAgIHdyaXRlQnVmZmVyXy5yZXNldCgpOworICAgIHdyaXRlQnVmZmVyXy53cml0ZShzaXplRmlsbGVyXywgMCwgNCk7ICAvLyBtYWtlIHJvb20gZm9yIHRoZSBuZXh0IGZyYW1lJ3Mgc2l6ZSBkYXRhCiAKLSAgICBieXRlW10gaTMyb3V0ID0gbmV3IGJ5dGVbNF07Ci0gICAgaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAobGVuID4+IDI0KSk7Ci0gICAgaTMyb3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAobGVuID4+IDE2KSk7Ci0gICAgaTMyb3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAobGVuID4+IDgpKTsKLSAgICBpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChsZW4pKTsKLSAgICB0cmFuc3BvcnRfLndyaXRlKGkzMm91dCwgMCwgNCk7Ci0gICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbik7CisgICAgZW5jb2RlRnJhbWVTaXplKGxlbiwgYnVmKTsgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGZyYW1lIGxlbmd0aCB3aXRob3V0IHRoZSBmaWxsZXIKKyAgICB0cmFuc3BvcnRfLndyaXRlKGJ1ZiwgMCwgbGVuICsgNCk7ICAgICAgLy8gd2UgaGF2ZSB0byB3cml0ZSB0aGUgZnJhbWUgc2l6ZSBhbmQgZnJhbWUgZGF0YQogICAgIHRyYW5zcG9ydF8uZmx1c2goKTsKICAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBlbmNvZGVGcmFtZVNpemUoZmluYWwgaW50IGZyYW1lU2l6ZSwgZmluYWwgYnl0ZVtdIGJ1ZikgeworICAgIGJ1ZlswXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiAyNCkpOworICAgIGJ1ZlsxXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiAxNikpOworICAgIGJ1ZlsyXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiA4KSk7CisgICAgYnVmWzNdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWNvZGVGcmFtZVNpemUoZmluYWwgYnl0ZVtdIGJ1ZikgeworICAgIHJldHVybgorICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgKChidWZbMV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgKChidWZbMl0gJiAweGZmKSA8PCAgOCkgfAorICAgICAgKChidWZbM10gJiAweGZmKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQppbmRleCA0MTkyMzUzLi5jMzA2M2ZlIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yOCwxNyArMjksNDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkJ5dGVBcnJheUVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkNvcmVDb25uZWN0aW9uUE5hbWVzOworCiAvKioKICAqIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQotICogVGhyaWZ0IHdlYiBzZXJ2aWNlcyBpbXBsZW1lbnRhdGlvbi4KKyAqIFRocmlmdCB3ZWIgc2VydmljZXMgaW1wbGVtZW50YXRpb24gKHVzaW5nIGZvciBleGFtcGxlIFRTZXJ2bGV0KS4KICAqCisgKiBUaGlzIGNsYXNzIG9mZmVycyB0d28gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBIVFRQIHRyYW5zcG9ydC4KKyAqIE9uZSB1c2VzIEh0dHBVUkxDb25uZWN0aW9uIGluc3RhbmNlcywgdGhlIG90aGVyIEh0dHBDbGllbnQgZnJvbSBBcGFjaGUKKyAqIEh0dHAgQ29tcG9uZW50cy4KKyAqIFRoZSBjaG9zZW4gaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiB0aGUgY29uc3RydWN0b3IgdXNlZCB0bworICogY3JlYXRlIHRoZSBUSHR0cENsaWVudCBpbnN0YW5jZS4KKyAqIFVzaW5nIHRoZSBUSHR0cENsaWVudChTdHJpbmcgdXJsKSBjb25zdHJ1Y3RvciBvciBwYXNzaW5nIG51bGwgYXMgdGhlCisgKiBIdHRwQ2xpZW50IHRvIFRIdHRwQ2xpZW50KFN0cmluZyB1cmwsIEh0dHBDbGllbnQgY2xpZW50KSB3aWxsIGNyZWF0ZSBhbgorICogaW5zdGFuY2Ugd2hpY2ggd2lsbCB1c2UgSHR0cFVSTENvbm5lY3Rpb24uCisgKgorICogV2hlbiB1c2luZyBIdHRwQ2xpZW50LCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gbGVhZHMgdG8gNS0xNSUgCisgKiBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiB0aGUgSHR0cFVSTENvbm5lY3Rpb24gaW1wbGVtZW50YXRpb246CisgKgorICogaHR0cC5wcm90b2NvbC52ZXJzaW9uPUh0dHBWZXJzaW9uLkhUVFBfMV8xCisgKiBodHRwLnByb3RvY29sLmNvbnRlbnQtY2hhcnNldD1VVEYtOAorICogaHR0cC5wcm90b2NvbC5leHBlY3QtY29udGludWU9ZmFsc2UKKyAqIGh0dHAuY29ubmVjdGlvbi5zdGFsZWNoZWNrPWZhbHNlCisgKgorICogQWxzbyBub3RlIHRoYXQgdW5kZXIgaGlnaCBsb2FkLCB0aGUgSHR0cFVSTENvbm5lY3Rpb24gaW1wbGVtZW50YXRpb24KKyAqIG1heSBleGhhdXN0IHRoZSBvcGVuIGZpbGUgZGVzY3JpcHRvciBsaW1pdC4KKyAqCisgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTk3MCI+VEhSSUZULTk3MDwvYT4KICAqLworCiBwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKIAogICBwcml2YXRlIFVSTCB1cmxfID0gbnVsbDsKIAotICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXF1ZXN0QnVmZmVyXyA9Ci0gICAgbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXF1ZXN0QnVmZmVyXyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAogICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtXyA9IG51bGw7CiAKQEAgLTQ4LDkgKzc5LDU0IEBACiAKICAgcHJpdmF0ZSBNYXA8U3RyaW5nLFN0cmluZz4gY3VzdG9tSGVhZGVyc18gPSBudWxsOwogCisgIHByaXZhdGUgZmluYWwgSHR0cEhvc3QgaG9zdDsKKyAgCisgIHByaXZhdGUgZmluYWwgSHR0cENsaWVudCBjbGllbnQ7CisgIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXJsOworICAgIHByaXZhdGUgZmluYWwgSHR0cENsaWVudCBjbGllbnQ7CisgICAgCisgICAgcHVibGljIEZhY3RvcnkoU3RyaW5nIHVybCkgeworICAgICAgdGhpcy51cmwgPSB1cmw7CisgICAgICB0aGlzLmNsaWVudCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIEZhY3RvcnkoU3RyaW5nIHVybCwgSHR0cENsaWVudCBjbGllbnQpIHsKKyAgICAgIHRoaXMudXJsID0gdXJsOworICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICB0cnkgeworICAgICAgICBpZiAobnVsbCAhPSBjbGllbnQpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50KHVybCwgY2xpZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50KHVybCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHRlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKyAgfQorCiAgIHB1YmxpYyBUSHR0cENsaWVudChTdHJpbmcgdXJsKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKICAgICAgIHVybF8gPSBuZXcgVVJMKHVybCk7CisgICAgICB0aGlzLmNsaWVudCA9IG51bGw7CisgICAgICB0aGlzLmhvc3QgPSBudWxsOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94KTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgVEh0dHBDbGllbnQoU3RyaW5nIHVybCwgSHR0cENsaWVudCBjbGllbnQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgdXJsXyA9IG5ldyBVUkwodXJsKTsKKyAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgdGhpcy5ob3N0ID0gbmV3IEh0dHBIb3N0KHVybF8uZ2V0SG9zdCgpLCAtMSA9PSB1cmxfLmdldFBvcnQoKSA/IHVybF8uZ2V0RGVmYXVsdFBvcnQoKSA6IHVybF8uZ2V0UG9ydCgpLCB1cmxfLmdldFByb3RvY29sKCkpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94KTsKICAgICB9CkBAIC01OCwxMCArMTM0LDIwIEBACiAKICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKICAgICBjb25uZWN0VGltZW91dF8gPSB0aW1lb3V0OworICAgIGlmIChudWxsICE9IHRoaXMuY2xpZW50KSB7CisgICAgICAvLyBXQVJOSU5HLCB0aGlzIG1vZGlmaWVzIHRoZSBIdHRwQ2xpZW50IHBhcmFtcywgdGhpcyBtaWdodCBoYXZlIGFuIGltcGFjdCBlbHNld2hlcmUgaWYgdGhlCisgICAgICAvLyBzYW1lIEh0dHBDbGllbnQgaXMgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2UuCisgICAgICBjbGllbnQuZ2V0UGFyYW1zKCkuc2V0UGFyYW1ldGVyKENvcmVDb25uZWN0aW9uUE5hbWVzLkNPTk5FQ1RJT05fVElNRU9VVCwgY29ubmVjdFRpbWVvdXRfKTsKKyAgICB9CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXRSZWFkVGltZW91dChpbnQgdGltZW91dCkgewogICAgIHJlYWRUaW1lb3V0XyA9IHRpbWVvdXQ7CisgICAgaWYgKG51bGwgIT0gdGhpcy5jbGllbnQpIHsKKyAgICAgIC8vIFdBUk5JTkcsIHRoaXMgbW9kaWZpZXMgdGhlIEh0dHBDbGllbnQgcGFyYW1zLCB0aGlzIG1pZ2h0IGhhdmUgYW4gaW1wYWN0IGVsc2V3aGVyZSBpZiB0aGUKKyAgICAgIC8vIHNhbWUgSHR0cENsaWVudCBpcyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZS4KKyAgICAgIGNsaWVudC5nZXRQYXJhbXMoKS5zZXRQYXJhbWV0ZXIoQ29yZUNvbm5lY3Rpb25QTmFtZXMuU09fVElNRU9VVCwgcmVhZFRpbWVvdXRfKTsKKyAgICB9CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXRDdXN0b21IZWFkZXJzKE1hcDxTdHJpbmcsU3RyaW5nPiBoZWFkZXJzKSB7CkBAIC0xMTEsNyArMTk3LDEyNiBAQAogICAgIHJlcXVlc3RCdWZmZXJfLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwogICB9CiAKKyAgLyoqCisgICAqIGNvcHkgZnJvbSBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlscyNjb25zdW1lLiBBbmRyb2lkIGhhcyBpdCdzIG93biBodHRwY29yZQorICAgKiB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvbnN1bWUuCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnN1bWUoZmluYWwgSHR0cEVudGl0eSBlbnRpdHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoZW50aXR5LmlzU3RyZWFtaW5nKCkpIHsKKyAgICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IGVudGl0eS5nZXRDb250ZW50KCk7CisgICAgICAgICAgaWYgKGluc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgaW5zdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZmx1c2hVc2luZ0h0dHBDbGllbnQoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgCisgICAgaWYgKG51bGwgPT0gdGhpcy5jbGllbnQpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOdWxsIEh0dHBDbGllbnQsIGFib3J0aW5nLiIpOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgcmVxdWVzdCBhbmQgcmVzZXQgYnVmZmVyCisgICAgYnl0ZVtdIGRhdGEgPSByZXF1ZXN0QnVmZmVyXy50b0J5dGVBcnJheSgpOworICAgIHJlcXVlc3RCdWZmZXJfLnJlc2V0KCk7CisKKyAgICBIdHRwUG9zdCBwb3N0ID0gbnVsbDsKKyAgICAKKyAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgCisgICAgdHJ5IHsgICAgICAKKyAgICAgIC8vIFNldCByZXF1ZXN0IHRvIHBhdGggKyBxdWVyeSBzdHJpbmcKKyAgICAgIHBvc3QgPSBuZXcgSHR0cFBvc3QodGhpcy51cmxfLmdldEZpbGUoKSk7CisgICAgICAKKyAgICAgIC8vCisgICAgICAvLyBIZWFkZXJzIGFyZSBhZGRlZCB0byB0aGUgSHR0cFBvc3QgaW5zdGFuY2UsIG5vdAorICAgICAgLy8gdG8gSHR0cENsaWVudC4KKyAgICAgIC8vCisgICAgICAKKyAgICAgIHBvc3Quc2V0SGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIHBvc3Quc2V0SGVhZGVyKCJBY2NlcHQiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICAgIHBvc3Quc2V0SGVhZGVyKCJVc2VyLUFnZW50IiwgIkphdmEvVEh0dHBDbGllbnQvSEMiKTsKKyAgICAgIAorICAgICAgaWYgKG51bGwgIT0gY3VzdG9tSGVhZGVyc18pIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGhlYWRlciA6IGN1c3RvbUhlYWRlcnNfLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICBwb3N0LnNldEhlYWRlcihoZWFkZXIuZ2V0S2V5KCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwb3N0LnNldEVudGl0eShuZXcgQnl0ZUFycmF5RW50aXR5KGRhdGEpKTsKKyAgICAgIAorICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gdGhpcy5jbGllbnQuZXhlY3V0ZSh0aGlzLmhvc3QsIHBvc3QpOworICAgICAgaW50IHJlc3BvbnNlQ29kZSA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7CisKKyAgICAgIC8vICAgICAgCisgICAgICAvLyBSZXRyaWV2ZSB0aGUgaW5wdXRzdHJlYW0gQkVGT1JFIGNoZWNraW5nIHRoZSBzdGF0dXMgY29kZSBzbworICAgICAgLy8gcmVzb3VyY2VzIGdldCBmcmVlZCBpbiB0aGUgZmluYWxseSBjbGF1c2UuCisgICAgICAvLworCisgICAgICBpcyA9IHJlc3BvbnNlLmdldEVudGl0eSgpLmdldENvbnRlbnQoKTsKKyAgICAgIAorICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIVFRQIFJlc3BvbnNlIGNvZGU6ICIgKyByZXNwb25zZUNvZGUpOworICAgICAgfQorCisgICAgICAvLyBSZWFkIHRoZSByZXNwb25zZXMgaW50byBhIGJ5dGUgYXJyYXkgc28gd2UgY2FuIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24KKyAgICAgIC8vIGVhcmx5LiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgd2hvbGUgY29udGVudCB3aWxsIGhhdmUgdG8gYmUgcmVhZCBpbgorICAgICAgLy8gbWVtb3J5LCBhbmQgdGhhdCBtb21lbnRhcmlseSB3ZSBtaWdodCB1c2UgdXAgdHdpY2UgdGhlIG1lbW9yeSAod2hpbGUgdGhlCisgICAgICAvLyB0aHJpZnQgc3RydWN0IGlzIGJlaW5nIHJlYWQgdXAgdGhlIGNoYWluKS4KKyAgICAgIC8vIFByb2NlZWRpbmcgZGlmZmVyZW50bHkgbWlnaHQgbGVhZCB0byBleGhhdXN0aW9uIG9mIGNvbm5lY3Rpb25zIGFuZCB0aHVzCisgICAgICAvLyB0byBhcHAgZmFpbHVyZS4KKyAgICAgIAorICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAKKyAgICAgIGludCBsZW4gPSAwOworICAgICAgZG8geworICAgICAgICBsZW4gPSBpcy5yZWFkKGJ1Zik7CisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgYmFvcy53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKC0xICE9IGxlbik7CisgICAgICAKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIEluZGljYXRlIHdlJ3JlIGRvbmUgd2l0aCB0aGUgY29udGVudC4KKyAgICAgICAgY29uc3VtZShyZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgLy8gV2UgaWdub3JlIHRoaXMgZXhjZXB0aW9uLCBpdCBtaWdodCBvbmx5IG1lYW4gdGhlIHNlcnZlciBoYXMgbm8KKyAgICAgICAgLy8ga2VlcC1hbGl2ZSBjYXBhYmlsaXR5LgorICAgICAgfQorICAgICAgICAgICAgCisgICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIC8vIEFib3J0IG1ldGhvZCBzbyB0aGUgY29ubmVjdGlvbiBnZXRzIHJlbGVhc2VkIGJhY2sgdG8gdGhlIGNvbm5lY3Rpb24gbWFuYWdlcgorICAgICAgaWYgKG51bGwgIT0gcG9zdCkgeworICAgICAgICBwb3N0LmFib3J0KCk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAobnVsbCAhPSBpcykgeworICAgICAgICAvLyBDbG9zZSB0aGUgZW50aXR5J3MgaW5wdXQgc3RyZWFtLCB0aGlzIHdpbGwgcmVsZWFzZSB0aGUgdW5kZXJseWluZyBjb25uZWN0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHBvc3QgIT0gbnVsbCkgeworICAgICAgICBwb3N0LnJlbGVhc2VDb25uZWN0aW9uKCk7CisgICAgICB9CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisKKyAgICBpZiAobnVsbCAhPSB0aGlzLmNsaWVudCkgeworICAgICAgZmx1c2hVc2luZ0h0dHBDbGllbnQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICAvLyBFeHRyYWN0IHJlcXVlc3QgYW5kIHJlc2V0IGJ1ZmZlcgogICAgIGJ5dGVbXSBkYXRhID0gcmVxdWVzdEJ1ZmZlcl8udG9CeXRlQXJyYXkoKTsKICAgICByZXF1ZXN0QnVmZmVyXy5yZXNldCgpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQppbmRleCA4ODZmY2JmLi5iMTlhYzg2IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQpAQCAtMjAsMTYgKzIwLDE4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIAogLyoqCiAgKiBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KLSAqCiAgKi8KIHB1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyIGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KICAgLyoqCisgICAqIENyZWF0ZSBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhbiBpbml0aWFsIGJ1ZmZlciBzaXplIG9mIDxpPnNpemU8L2k+LiBUaGUKKyAgICogaW50ZXJuYWwgYnVmZmVyIHdpbGwgZ3JvdyBhcyBuZWNlc3NhcnkgdG8gYWNjb21tb2RhdGUgdGhlIHNpemUgb2YgdGhlIGRhdGEKKyAgICogYmVpbmcgd3JpdHRlbiB0byBpdC4KICAgICoKKyAgICogQHBhcmFtIHNpemUgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgYnVmZmVyCiAgICAqLwogICBwdWJsaWMgVE1lbW9yeUJ1ZmZlcihpbnQgc2l6ZSkgewogICAgIGFycl8gPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShzaXplKTsKQEAgLTY5LDIwICs3MSwyMCBAQAogICAvKioKICAgICogT3V0cHV0IHRoZSBjb250ZW50cyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBhIFN0cmluZywgdXNpbmcgdGhlIHN1cHBsaWVkCiAgICAqIGVuY29kaW5nCi0gICAqIEBwYXJhbSBlbmMgIHRoZSBlbmNvZGluZyB0byB1c2UKKyAgICogQHBhcmFtIGNoYXJzZXQgdGhlIGVuY29kaW5nIHRvIHVzZQogICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBhIFN0cmluZwogICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgZW5jKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGFycl8udG9TdHJpbmcoZW5jKTsKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhDaGFyc2V0IGNoYXJzZXQpIHsKKyAgICByZXR1cm4gYXJyXy50b1N0cmluZyhjaGFyc2V0KTsKICAgfQogCiAgIHB1YmxpYyBTdHJpbmcgaW5zcGVjdCgpIHsKLSAgICBTdHJpbmcgYnVmID0gIiI7CisgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgIGJ5dGVbXSBieXRlcyA9IGFycl8udG9CeXRlQXJyYXkoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBidWYgKz0gKHBvc18gPT0gaSA/ICI9PT4iIDogIiIgKSArIEludGVnZXIudG9IZXhTdHJpbmcoYnl0ZXNbaV0gJiAweGZmKSArICIgIjsKKyAgICAgIGJ1Zi5hcHBlbmQocG9zXyA9PSBpID8gIj09PiIgOiAiIiApLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGJ5dGVzW2ldICYgMHhmZikpLmFwcGVuZCgiICIpOwogICAgIH0KLSAgICByZXR1cm4gYnVmOworICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKICAgfQogCiAgIC8vIFRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyCkBAIC05MCw5ICs5MiwxMyBAQAogCiAgIC8vIFBvc2l0aW9uIHRvIHJlYWQgbmV4dCBieXRlIGZyb20KICAgcHJpdmF0ZSBpbnQgcG9zXzsKLSAgCisKICAgcHVibGljIGludCBsZW5ndGgoKSB7CiAgICAgcmV0dXJuIGFycl8uc2l6ZSgpOwogICB9CisKKyAgcHVibGljIGJ5dGVbXSBnZXRBcnJheSgpIHsKKyAgICByZXR1cm4gYXJyXy5nZXQoKTsKKyAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlJbnB1dFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5SW5wdXRUcmFuc3BvcnQuamF2YQppbmRleCAxM2I1ZjgzLi4yNTMwZGNjIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlJbnB1dFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUlucHV0VHJhbnNwb3J0LmphdmEKQEAgLTQ1LDYgKzQ1LDEwIEBACiAgICAgZW5kUG9zXyA9IG9mZnNldCArIGxlbmd0aDsKICAgfQogCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIGJ1Zl8gPSBudWxsOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGNsb3NlKCkge30KIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEKaW5kZXggZTI2YjljZi4uZWY4MmFjMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhCkBAIC0zMCwxMCArMzAsMTQgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CiAKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCiAvKioKICAqIFdyYXBwZXIgYXJvdW5kIFNlcnZlclNvY2tldENoYW5uZWwKICAqLwogcHVibGljIGNsYXNzIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCBleHRlbmRzIFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICAvKioKICAgICogVGhpcyBjaGFubmVsIGlzIHdoZXJlIGFsbCB0aGUgbm9uYmxvY2tpbmcgbWFnaWMgaGFwcGVucy4KQEAgLTQxLDM0ICs0NSwxNyBAQAogICBwcml2YXRlIFNlcnZlclNvY2tldENoYW5uZWwgc2VydmVyU29ja2V0Q2hhbm5lbCA9IG51bGw7CiAKICAgLyoqCi0gICAqIFVuZGVybHlpbmcgc2VydmVyc29ja2V0IG9iamVjdAorICAgKiBVbmRlcmx5aW5nIFNlcnZlclNvY2tldCBvYmplY3QKICAgICovCiAgIHByaXZhdGUgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldF8gPSBudWxsOwogCiAgIC8qKgotICAgKiBQb3J0IHRvIGxpc3RlbiBvbgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgcG9ydF8gPSAwOwotCi0gIC8qKgogICAgKiBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdAogICAgKi8KICAgcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dF8gPSAwOwogCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAotICAgKi8KLSAgLy8gcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSB7Ci0gIC8vICAgdGhpcyhzZXJ2ZXJTb2NrZXQsIDApOwotICAvLyB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0Ci0gICAqLwotICAvLyBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQsIGludCBjbGllbnRUaW1lb3V0KSB7Ci0gIC8vICAgc2VydmVyU29ja2V0XyA9IHNlcnZlclNvY2tldDsKLSAgLy8gICBjbGllbnRUaW1lb3V0XyA9IGNsaWVudFRpbWVvdXQ7Ci0gIC8vIH0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncyBleHRlbmRzCisgICAgICBBYnN0cmFjdFNlcnZlclRyYW5zcG9ydEFyZ3M8Tm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3M+IHt9CiAKICAgLyoqCiAgICAqIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQKQEAgLTgxLDE2ICs2OCwxOSBAQAogICAgKiBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0CiAgICAqLwogICBwdWJsaWMgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIHRoaXMobmV3IEluZXRTb2NrZXRBZGRyZXNzKHBvcnQpLCBjbGllbnRUaW1lb3V0KTsKLSAgICBwb3J0XyA9IHBvcnQ7Ci0gIH0gIAorICAgIHRoaXMobmV3IE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkucG9ydChwb3J0KS5jbGllbnRUaW1lb3V0KGNsaWVudFRpbWVvdXQpKTsKKyAgfQogCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoSW5ldFNvY2tldEFkZHJlc3MgYmluZEFkZHIpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICB0aGlzKGJpbmRBZGRyLCAwKTsKICAgfQogCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoSW5ldFNvY2tldEFkZHJlc3MgYmluZEFkZHIsIGludCBjbGllbnRUaW1lb3V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgY2xpZW50VGltZW91dF8gPSBjbGllbnRUaW1lb3V0OworICAgIHRoaXMobmV3IE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkuYmluZEFkZHIoYmluZEFkZHIpLmNsaWVudFRpbWVvdXQoY2xpZW50VGltZW91dCkpOworICB9CisKKyAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChOb25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncyBhcmdzKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgY2xpZW50VGltZW91dF8gPSBhcmdzLmNsaWVudFRpbWVvdXQ7CiAgICAgdHJ5IHsKICAgICAgIHNlcnZlclNvY2tldENoYW5uZWwgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKICAgICAgIHNlcnZlclNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtMTAwLDEwICs5MCwxMCBAQAogICAgICAgLy8gUHJldmVudCAyTVNMIGRlbGF5IHByb2JsZW0gb24gc2VydmVyIHJlc3RhcnRzCiAgICAgICBzZXJ2ZXJTb2NrZXRfLnNldFJldXNlQWRkcmVzcyh0cnVlKTsKICAgICAgIC8vIEJpbmQgdG8gbGlzdGVuaW5nIHBvcnQKLSAgICAgIHNlcnZlclNvY2tldF8uYmluZChiaW5kQWRkcik7CisgICAgICBzZXJ2ZXJTb2NrZXRfLmJpbmQoYXJncy5iaW5kQWRkciwgYXJncy5iYWNrbG9nKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgIHNlcnZlclNvY2tldF8gPSBudWxsOwotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIGFkZHJlc3MgIiArIGJpbmRBZGRyLnRvU3RyaW5nKCkgKyAiLiIpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIGFkZHJlc3MgIiArIGFyZ3MuYmluZEFkZHIudG9TdHJpbmcoKSArICIuIiwgaW9lKTsKICAgICB9CiAgIH0KIApAQCAtMTUyLDggKzE0Miw3IEBACiAgICAgICB0cnkgewogICAgICAgICBzZXJ2ZXJTb2NrZXRfLmNsb3NlKCk7CiAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpb3guZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgTE9HR0VSLndhcm4oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgaW94LmdldE1lc3NhZ2UoKSk7CiAgICAgICB9CiAgICAgICBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKICAgICB9CkBAIC0xNjUsNCArMTU0LDEwIEBACiAgICAgY2xvc2UoKTsKICAgfQogCisgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICBpZiAoc2VydmVyU29ja2V0XyA9PSBudWxsKQorICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBzZXJ2ZXJTb2NrZXRfLmdldExvY2FsUG9ydCgpOworICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NvY2tldC5qYXZhCmluZGV4IGJjMmQ1MzkuLmY4NmE0OGIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YQpAQCAtMjEsMTM3ICsyMSwxMjQgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKIAoraW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKIC8qKgotICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVG8gYmUgY29tbWVudGVkIHNvb24hCisgKiBUcmFuc3BvcnQgZm9yIHVzZSB3aXRoIGFzeW5jIGNsaWVudC4KICAqLwogcHVibGljIGNsYXNzIFROb25ibG9ja2luZ1NvY2tldCBleHRlbmRzIFROb25ibG9ja2luZ1RyYW5zcG9ydCB7CiAKLSAgcHJpdmF0ZSBTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwgPSBudWxsOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVE5vbmJsb2NraW5nU29ja2V0LmNsYXNzLmdldE5hbWUoKSk7CiAKICAgLyoqCi0gICAqIFdyYXBwZWQgU29ja2V0IG9iamVjdAorICAgKiBIb3N0IGFuZCBwb3J0IGlmIHBhc3NlZCBpbiwgdXNlZCBmb3IgbGF6eSBub24tYmxvY2tpbmcgY29ubmVjdC4KICAgICovCi0gIHByaXZhdGUgU29ja2V0IHNvY2tldF8gPSBudWxsOworICBwcml2YXRlIGZpbmFsIFNvY2tldEFkZHJlc3Mgc29ja2V0QWRkcmVzc187CisKKyAgcHJpdmF0ZSBmaW5hbCBTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWxfOworCisgIHB1YmxpYyBUTm9uYmxvY2tpbmdTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMoaG9zdCwgcG9ydCwgMCk7CisgIH0KIAogICAvKioKLSAgICogUmVtb3RlIGhvc3QKKyAgICogQ3JlYXRlIGEgbmV3IG5vbmJsb2NraW5nIHNvY2tldCB0cmFuc3BvcnQgdGhhdCB3aWxsIGJlIGNvbm5lY3RlZCB0byBob3N0OnBvcnQuCisgICAqIEBwYXJhbSBob3N0CisgICAqIEBwYXJhbSBwb3J0CisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICovCi0gIHByaXZhdGUgU3RyaW5nIGhvc3RfICA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBwb3J0Ci0gICAqLwotICBwcml2YXRlIGludCBwb3J0XyA9IDA7Ci0KLSAgLyoqCi0gICAqIFNvY2tldCB0aW1lb3V0Ci0gICAqLwotICBwcml2YXRlIGludCB0aW1lb3V0XyA9IDA7CisgIHB1YmxpYyBUTm9uYmxvY2tpbmdTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzKFNvY2tldENoYW5uZWwub3BlbigpLCB0aW1lb3V0LCBuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCkpOworICB9CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gYWxyZWFkeSBjcmVhdGVkIHNvY2tldC4KICAgICoKICAgICogQHBhcmFtIHNvY2tldENoYW5uZWwgQWxyZWFkeSBjcmVhdGVkIFNvY2tldENoYW5uZWwgb2JqZWN0Ci0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBzZXR0aW5nIHVwIHRoZSBzdHJlYW1zCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igc2V0dGluZyB1cCB0aGUgc3RyZWFtcwogICAgKi8KLSAgcHVibGljIFROb25ibG9ja2luZ1NvY2tldChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgLy8gbWFrZSBpdCBhIG5vbmJsb2NraW5nIGNoYW5uZWwKLSAgICAgIHNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGUpOwotICAgIH0KKyAgcHVibGljIFROb25ibG9ja2luZ1NvY2tldChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcyhzb2NrZXRDaGFubmVsLCAwLCBudWxsKTsKKyAgICBpZiAoIXNvY2tldENoYW5uZWwuaXNDb25uZWN0ZWQoKSkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTb2NrZXQgbXVzdCBhbHJlYWR5IGJlIGNvbm5lY3RlZCIpOworICB9CiAKLSAgICB0aGlzLnNvY2tldENoYW5uZWwgPSBzb2NrZXRDaGFubmVsOwotICAgIHRoaXMuc29ja2V0XyA9IHNvY2tldENoYW5uZWwuc29ja2V0KCk7Ci0gICAgdHJ5IHsKLSAgICAgIHNvY2tldF8uc2V0U29MaW5nZXIoZmFsc2UsIDApOwotICAgICAgc29ja2V0Xy5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkgewotICAgICAgc3gucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQorICBwcml2YXRlIFROb25ibG9ja2luZ1NvY2tldChTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWwsIGludCB0aW1lb3V0LCBTb2NrZXRBZGRyZXNzIHNvY2tldEFkZHJlc3MpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHNvY2tldENoYW5uZWxfID0gc29ja2V0Q2hhbm5lbDsKKyAgICBzb2NrZXRBZGRyZXNzXyA9IHNvY2tldEFkZHJlc3M7CisKKyAgICAvLyBtYWtlIGl0IGEgbm9uYmxvY2tpbmcgY2hhbm5lbAorICAgIHNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOworCisgICAgLy8gc2V0IG9wdGlvbnMKKyAgICBTb2NrZXQgc29ja2V0ID0gc29ja2V0Q2hhbm5lbC5zb2NrZXQoKTsKKyAgICBzb2NrZXQuc2V0U29MaW5nZXIoZmFsc2UsIDApOworICAgIHNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSk7CisgICAgc2V0VGltZW91dCh0aW1lb3V0KTsKICAgfQogCiAgIC8qKgotICAgKiBSZWdpc3RlciB0aGlzIHNvY2tldCB3aXRoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IgZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUKLSAgICogb3BlcmF0aW9ucy4KKyAgICogUmVnaXN0ZXIgdGhlIG5ldyBTb2NrZXRDaGFubmVsIHdpdGggb3VyIFNlbGVjdG9yLCBpbmRpY2F0aW5nCisgICAqIHdlJ2QgbGlrZSB0byBiZSBub3RpZmllZCB3aGVuIGl0J3MgcmVhZHkgZm9yIEkvTy4KICAgICoKICAgICogQHBhcmFtIHNlbGVjdG9yCiAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBrZXkgZm9yIHRoaXMgc29ja2V0LgogICAgKi8KICAgcHVibGljIFNlbGVjdGlvbktleSByZWdpc3RlclNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgaW50ZXJlc3RzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIFJlZ2lzdGVyIHRoZSBuZXcgU29ja2V0Q2hhbm5lbCB3aXRoIG91ciBTZWxlY3RvciwgaW5kaWNhdGluZwotICAgIC8vIHdlJ2QgbGlrZSB0byBiZSBub3RpZmllZCB3aGVuIHRoZXJlJ3MgZGF0YSB3YWl0aW5nIHRvIGJlIHJlYWQKLSAgICByZXR1cm4gc29ja2V0Q2hhbm5lbC5yZWdpc3RlcihzZWxlY3RvciwgaW50ZXJlc3RzKTsKKyAgICByZXR1cm4gc29ja2V0Q2hhbm5lbF8ucmVnaXN0ZXIoc2VsZWN0b3IsIGludGVyZXN0cyk7CiAgIH0KIAogICAvKioKLSAgICogSW5pdGlhbGl6ZXMgdGhlIHNvY2tldCBvYmplY3QKLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0U29ja2V0KCkgewotICAgIHNvY2tldF8gPSBuZXcgU29ja2V0KCk7Ci0gICAgdHJ5IHsKLSAgICAgIHNvY2tldF8uc2V0U29MaW5nZXIoZmFsc2UsIDApOwotICAgICAgc29ja2V0Xy5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgICAgc29ja2V0Xy5zZXRTb1RpbWVvdXQodGltZW91dF8pOwotICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkgewotICAgICAgc3gucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNvY2tldCB0aW1lb3V0CisgICAqIFNldHMgdGhlIHNvY2tldCB0aW1lb3V0LCBhbHRob3VnaCB0aGlzIGltcGxlbWVudGF0aW9uIG5ldmVyIHVzZXMgYmxvY2tpbmcgb3BlcmF0aW9ucyBzbyBpdCBpcyB1bnVzZWQuCiAgICAqCiAgICAqIEBwYXJhbSB0aW1lb3V0IE1pbGxpc2Vjb25kcyB0aW1lb3V0CiAgICAqLwogICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7Ci0gICAgdGltZW91dF8gPSB0aW1lb3V0OwogICAgIHRyeSB7Ci0gICAgICBzb2NrZXRfLnNldFNvVGltZW91dCh0aW1lb3V0KTsKKyAgICAgIHNvY2tldENoYW5uZWxfLnNvY2tldCgpLnNldFNvVGltZW91dCh0aW1lb3V0KTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKLSAgICAgIHN4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgTE9HR0VSLndhcm4oIkNvdWxkIG5vdCBzZXQgc29ja2V0IHRpbWVvdXQuIiwgc3gpOwogICAgIH0KICAgfQogCiAgIC8qKgotICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKyAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBTb2NrZXRDaGFubmVsLgogICAgKi8KLSAgcHVibGljIFNvY2tldCBnZXRTb2NrZXQoKSB7Ci0gICAgaWYgKHNvY2tldF8gPT0gbnVsbCkgewotICAgICAgaW5pdFNvY2tldCgpOwotICAgIH0KLSAgICByZXR1cm4gc29ja2V0XzsKKyAgcHVibGljIFNvY2tldENoYW5uZWwgZ2V0U29ja2V0Q2hhbm5lbCgpIHsKKyAgICByZXR1cm4gc29ja2V0Q2hhbm5lbF87CiAgIH0KIAogICAvKioKICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCiAgICAqLwogICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7Ci0gICAgaWYgKHNvY2tldF8gPT0gbnVsbCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gc29ja2V0Xy5pc0Nvbm5lY3RlZCgpOworICAgIC8vIGlzQ29ubmVjdGVkKCkgZG9lcyBub3QgcmV0dXJuIGZhbHNlIGFmdGVyIGNsb3NlKCksIGJ1dCBpc09wZW4oKSBkb2VzCisgICAgcmV0dXJuIHNvY2tldENoYW5uZWxfLmlzT3BlbigpICYmIHNvY2tldENoYW5uZWxfLmlzQ29ubmVjdGVkKCk7CiAgIH0KIAogICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCisgICAqIERvIG5vdCBjYWxsLCB0aGUgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgaXRzIG93biBsYXp5IG5vbi1ibG9ja2luZyBjb25uZWN0LgogICAgKi8KICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJvcGVuKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciBUTm9uYmxvY2tpbmdTb2NrZXQiKTsKICAgfQogCiAgIC8qKgogICAgKiBQZXJmb3JtIGEgbm9uYmxvY2tpbmcgcmVhZCBpbnRvIGJ1ZmZlci4KICAgICovCiAgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gc29ja2V0Q2hhbm5lbC5yZWFkKGJ1ZmZlcik7CisgICAgcmV0dXJuIHNvY2tldENoYW5uZWxfLnJlYWQoYnVmZmVyKTsKICAgfQogCiAKQEAgLTE1OSwxMiArMTQ2LDEyIEBACiAgICAqIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtIGlmIG5vdCBudWxsLgogICAgKi8KICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBpZiAoKHNvY2tldENoYW5uZWwudmFsaWRPcHMoKSAmIFNlbGVjdGlvbktleS5PUF9SRUFEKSAhPSBTZWxlY3Rpb25LZXkuT1BfUkVBRCkgeworICAgIGlmICgoc29ja2V0Q2hhbm5lbF8udmFsaWRPcHMoKSAmIFNlbGVjdGlvbktleS5PUF9SRUFEKSAhPSBTZWxlY3Rpb25LZXkuT1BfUkVBRCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKICAgICAgICAgIkNhbm5vdCByZWFkIGZyb20gd3JpdGUtb25seSBzb2NrZXQgY2hhbm5lbCIpOwogICAgIH0KICAgICB0cnkgewotICAgICAgcmV0dXJuIHNvY2tldENoYW5uZWwucmVhZChCeXRlQnVmZmVyLndyYXAoYnVmLCBvZmYsIGxlbikpOworICAgICAgcmV0dXJuIHNvY2tldENoYW5uZWxfLnJlYWQoQnl0ZUJ1ZmZlci53cmFwKGJ1Ziwgb2ZmLCBsZW4pKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgaW94KTsKICAgICB9CkBAIC0xNzQsMjYgKzE2MSwyNiBAQAogICAgKiBQZXJmb3JtIGEgbm9uYmxvY2tpbmcgd3JpdGUgb2YgdGhlIGRhdGEgaW4gYnVmZmVyOwogICAgKi8KICAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gc29ja2V0Q2hhbm5lbC53cml0ZShidWZmZXIpOworICAgIHJldHVybiBzb2NrZXRDaGFubmVsXy53cml0ZShidWZmZXIpOwogICB9CiAKICAgLyoqCiAgICAqIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIGlmICgoc29ja2V0Q2hhbm5lbC52YWxpZE9wcygpICYgU2VsZWN0aW9uS2V5Lk9QX1dSSVRFKSAhPSBTZWxlY3Rpb25LZXkuT1BfV1JJVEUpIHsKKyAgICBpZiAoKHNvY2tldENoYW5uZWxfLnZhbGlkT3BzKCkgJiBTZWxlY3Rpb25LZXkuT1BfV1JJVEUpICE9IFNlbGVjdGlvbktleS5PUF9XUklURSkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKICAgICAgICAgIkNhbm5vdCB3cml0ZSB0byB3cml0ZS1vbmx5IHNvY2tldCBjaGFubmVsIik7CiAgICAgfQogICAgIHRyeSB7Ci0gICAgICBzb2NrZXRDaGFubmVsLndyaXRlKEJ5dGVCdWZmZXIud3JhcChidWYsIG9mZiwgbGVuKSk7CisgICAgICBzb2NrZXRDaGFubmVsXy53cml0ZShCeXRlQnVmZmVyLndyYXAoYnVmLCBvZmYsIGxlbikpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCBpb3gpOwogICAgIH0KICAgfQogCiAgIC8qKgotICAgKiBGbHVzaGVzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaWYgbm90IG51bGwuCisgICAqIE5vb3AuCiAgICAqLwogICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICAvLyBOb3Qgc3VwcG9ydGVkIGJ5IFNvY2tldENoYW5uZWwuCkBAIC0yMDQsMTAgKzE5MSwyMCBAQAogICAgKi8KICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgdHJ5IHsKLSAgICAgIHNvY2tldENoYW5uZWwuY2xvc2UoKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzaWxlbnRseSBpZ25vcmUuCisgICAgICBzb2NrZXRDaGFubmVsXy5jbG9zZSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgTE9HR0VSLndhcm4oIkNvdWxkIG5vdCBjbG9zZSBzb2NrZXQuIiwgaW94KTsKICAgICB9CiAgIH0KIAorICAvKioge0Bpbmhlcml0RG9jfSAqLworICBwdWJsaWMgYm9vbGVhbiBzdGFydENvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBzb2NrZXRDaGFubmVsXy5jb25uZWN0KHNvY2tldEFkZHJlc3NfKTsKKyAgfQorCisgIC8qKiB7QGluaGVyaXREb2N9ICovCisgIHB1YmxpYyBib29sZWFuIGZpbmlzaENvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBzb2NrZXRDaGFubmVsXy5maW5pc2hDb25uZWN0KCk7CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nVHJhbnNwb3J0LmphdmEKaW5kZXggNTE3ZWFjYi4uNDNjMTMwNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1RyYW5zcG9ydC5qYXZhCkBAIC0yMCwxMiArMjAsMjggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFROb25ibG9ja2luZ1RyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgeworCisgIC8qKgorICAgKiBOb24tYmxvY2tpbmcgY29ubmVjdGlvbiBpbml0aWFsaXphdGlvbi4KKyAgICogQHNlZSBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsI2Nvbm5lY3QoU29ja2V0QWRkcmVzcyByZW1vdGUpCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdGFydENvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIE5vbi1ibG9ja2luZyBjb25uZWN0aW9uIGNvbXBsZXRpb24uCisgICAqIEBzZWUgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbCNmaW5pc2hDb25uZWN0KCkKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGZpbmlzaENvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKICAgcHVibGljIGFic3RyYWN0IFNlbGVjdGlvbktleSByZWdpc3RlclNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgaW50ZXJlc3RzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKICAgcHVibGljIGFic3RyYWN0IGludCByZWFkKEJ5dGVCdWZmZXIgYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb247CisKICAgcHVibGljIGFic3RyYWN0IGludCB3cml0ZShCeXRlQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzJhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLktleU1hbmFnZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldEZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXQ7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeTsKKworLyoqCisgKiAgQSBGYWN0b3J5IGZvciBwcm92aWRpbmcgYW5kIHNldHRpbmcgdXAgQ2xpZW50IGFuZCBTZXJ2ZXIgU1NMIHdyYXBwZWQKKyAqICBUU29ja2V0IGFuZCBUU2VydmVyU29ja2V0CisgKi8KK3B1YmxpYyBjbGFzcyBUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgLyoqCisgICAqIEdldCBhIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0LiBJbiB0aGlzCisgICAqIGNvbmZpZ3VyYXRpb24gdGhlIGRlZmF1bHQgc2V0dGluZ3MgYXJlIHVzZWQuIERlZmF1bHQgc2V0dGluZ3MgYXJlIHJldHJpZXZlZAorICAgKiBmcm9tIFN5c3RlbSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHNldC4KKyAgICoKKyAgICogRXhhbXBsZSBzeXN0ZW0gcHJvcGVydGllczoKKyAgICogLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9Jmx0O3RydXN0c3RvcmUgbG9jYXRpb24mZ3Q7CisgICAqIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKKyAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSZsdDtrZXlzdG9yZSBsb2NhdGlvbiZndDsKKyAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKKyAgICoKKyAgICogQHBhcmFtIHBvcnQKKyAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRTZXJ2ZXJTb2NrZXQgZ2V0U2VydmVyU29ja2V0KGludCBwb3J0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGdldFNlcnZlclNvY2tldChwb3J0LCAwKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBkZWZhdWx0IFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0CisgICAqCisgICAqIEBwYXJhbSBwb3J0CisgICAqIEBwYXJhbSBjbGllbnRUaW1lb3V0CisgICAqIEByZXR1cm4gQSBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUU2VydmVyU29ja2V0IGdldFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZ2V0U2VydmVyU29ja2V0KHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBkZWZhdWx0IFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBpbnRlcmZhY2UKKyAgICoKKyAgICogQHBhcmFtIHBvcnQKKyAgICogQHBhcmFtIGNsaWVudFRpbWVvdXQKKyAgICogQHBhcmFtIGlmQWRkcmVzcworICAgKiBAcmV0dXJuIEEgU1NMIHdyYXBwZWQgVFNlcnZlclNvY2tldAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sZWFuIGNsaWVudEF1dGgsIEluZXRBZGRyZXNzIGlmQWRkcmVzcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIFNTTFNlcnZlclNvY2tldEZhY3RvcnkgZmFjdG9yeSA9IChTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5KSBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKKyAgICByZXR1cm4gY3JlYXRlU2VydmVyKGZhY3RvcnksIHBvcnQsIGNsaWVudFRpbWVvdXQsIGNsaWVudEF1dGgsIGlmQWRkcmVzcywgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogR2V0IGEgY29uZmlndXJlZCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgaW50ZXJmYWNlLgorICAgKiBIZXJlIHRoZSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgdGhlIHZhbHVlcyBmb3IgdGhlIGFsZ29yaXRobXMsIGtleXN0b3JlLAorICAgKiB0cnVzdHN0b3JlIGFuZCBvdGhlciBzZXR0aW5ncworICAgKgorICAgKiBAcGFyYW0gcG9ydAorICAgKiBAcGFyYW0gY2xpZW50VGltZW91dAorICAgKiBAcGFyYW0gaWZBZGRyZXNzCisgICAqIEBwYXJhbSBwYXJhbXMKKyAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRTZXJ2ZXJTb2NrZXQgZ2V0U2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgSW5ldEFkZHJlc3MgaWZBZGRyZXNzLCBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAocGFyYW1zID09IG51bGwgfHwgIShwYXJhbXMuaXNLZXlTdG9yZVNldCB8fCBwYXJhbXMuaXNUcnVzdFN0b3JlU2V0KSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVpdGhlciBvbmUgb2YgdGhlIEtleVN0b3JlIG9yIFRydXN0U3RvcmUgbXVzdCBiZSBzZXQgZm9yIFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMiKTsKKyAgICB9CisKKyAgICBTU0xDb250ZXh0IGN0eCA9IGNyZWF0ZVNTTENvbnRleHQocGFyYW1zKTsKKyAgICByZXR1cm4gY3JlYXRlU2VydmVyKGN0eC5nZXRTZXJ2ZXJTb2NrZXRGYWN0b3J5KCksIHBvcnQsIGNsaWVudFRpbWVvdXQsIHBhcmFtcy5jbGllbnRBdXRoLCBpZkFkZHJlc3MsIHBhcmFtcyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBUU2VydmVyU29ja2V0IGNyZWF0ZVNlcnZlcihTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IGZhY3RvcnksIGludCBwb3J0LCBpbnQgdGltZW91dCwgYm9vbGVhbiBjbGllbnRBdXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgaWZBZGRyZXNzLCBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgU1NMU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IChTU0xTZXJ2ZXJTb2NrZXQpIGZhY3RvcnkuY3JlYXRlU2VydmVyU29ja2V0KHBvcnQsIDEwMCwgaWZBZGRyZXNzKTsKKyAgICAgIHNlcnZlclNvY2tldC5zZXRTb1RpbWVvdXQodGltZW91dCk7CisgICAgICBzZXJ2ZXJTb2NrZXQuc2V0TmVlZENsaWVudEF1dGgoY2xpZW50QXV0aCk7CisgICAgICBpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLmNpcGhlclN1aXRlcyAhPSBudWxsKSB7CisgICAgICAgIHNlcnZlclNvY2tldC5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzKHBhcmFtcy5jaXBoZXJTdWl0ZXMpOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBUU2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0LlNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS4KKyAgICAgICAgc2VydmVyU29ja2V0KHNlcnZlclNvY2tldCkuY2xpZW50VGltZW91dCh0aW1lb3V0KSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYmluZCB0byBwb3J0ICIgKyBwb3J0LCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IGEgZGVmYXVsdCBTU0wgd3JhcHBlZCBUU29ja2V0IGNvbm5lY3RlZCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQuIEFsbAorICAgKiB0aGUgY2xpZW50IG1ldGhvZHMgcmV0dXJuIGEgYm91bmQgY29ubmVjdGlvbi4gU28gdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIG9wZW4oKSBvbiB0aGUKKyAgICogVFRyYW5zcG9ydC4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QKKyAgICogQHBhcmFtIHBvcnQKKyAgICogQHBhcmFtIHRpbWVvdXQKKyAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTb2NrZXQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRTb2NrZXQgZ2V0Q2xpZW50U29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBTU0xTb2NrZXRGYWN0b3J5IGZhY3RvcnkgPSAoU1NMU29ja2V0RmFjdG9yeSkgU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CisgICAgcmV0dXJuIGNyZWF0ZUNsaWVudChmYWN0b3J5LCBob3N0LCBwb3J0LCB0aW1lb3V0KTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBkZWZhdWx0IFNTTCB3cmFwcGVkIFRTb2NrZXQgY29ubmVjdGVkIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QKKyAgICogQHBhcmFtIHBvcnQKKyAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTb2NrZXQKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRTb2NrZXQgZ2V0Q2xpZW50U29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHJldHVybiBnZXRDbGllbnRTb2NrZXQoaG9zdCwgcG9ydCwgMCk7CisgIH0KKworICAvKioKKyAgICogR2V0IGEgY3VzdG9tIGNvbmZpZ3VyZWQgU1NMIHdyYXBwZWQgVFNvY2tldC4gVGhlIFNTTCBzZXR0aW5ncyBhcmUgb2J0YWluZWQgZnJvbSB0aGUKKyAgICogcGFzc2VkIGluIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzLgorICAgKgorICAgKiBAcGFyYW0gaG9zdAorICAgKiBAcGFyYW0gcG9ydAorICAgKiBAcGFyYW0gdGltZW91dAorICAgKiBAcGFyYW0gcGFyYW1zCisgICAqIEByZXR1cm4gQSBTU0wgd3JhcHBlZCBUU29ja2V0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUU29ja2V0IGdldENsaWVudFNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0LCBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAocGFyYW1zID09IG51bGwgfHwgIShwYXJhbXMuaXNLZXlTdG9yZVNldCB8fCBwYXJhbXMuaXNUcnVzdFN0b3JlU2V0KSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkVpdGhlciBvbmUgb2YgdGhlIEtleVN0b3JlIG9yIFRydXN0U3RvcmUgbXVzdCBiZSBzZXQgZm9yIFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMiKTsKKyAgICB9CisKKyAgICBTU0xDb250ZXh0IGN0eCA9IGNyZWF0ZVNTTENvbnRleHQocGFyYW1zKTsKKyAgICByZXR1cm4gY3JlYXRlQ2xpZW50KGN0eC5nZXRTb2NrZXRGYWN0b3J5KCksIGhvc3QsIHBvcnQsIHRpbWVvdXQpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU1NMQ29udGV4dCBjcmVhdGVTU0xDb250ZXh0KFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIFNTTENvbnRleHQgY3R4OworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgY3R4ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShwYXJhbXMucHJvdG9jb2wpOworICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBudWxsOworICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gbnVsbDsKKworICAgICAgaWYgKHBhcmFtcy5pc1RydXN0U3RvcmVTZXQpIHsKKyAgICAgICAgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShwYXJhbXMudHJ1c3RNYW5hZ2VyVHlwZSk7CisgICAgICAgIEtleVN0b3JlIHRzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UocGFyYW1zLnRydXN0U3RvcmVUeXBlKTsKKyAgICAgICAgaWYgKHBhcmFtcy50cnVzdFN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICBpbiA9IHBhcmFtcy50cnVzdFN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluID0gZ2V0U3RvcmVBc1N0cmVhbShwYXJhbXMudHJ1c3RTdG9yZSk7CisgICAgICAgIH0KKyAgICAgICAgdHMubG9hZChpbiwKKyAgICAgICAgICAgICAgICAocGFyYW1zLnRydXN0UGFzcyAhPSBudWxsID8gcGFyYW1zLnRydXN0UGFzcy50b0NoYXJBcnJheSgpIDogbnVsbCkpOworICAgICAgICB0bWYuaW5pdCh0cyk7CisgICAgICB9CisKKyAgICAgIGlmIChwYXJhbXMuaXNLZXlTdG9yZVNldCkgeworICAgICAgICBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShwYXJhbXMua2V5TWFuYWdlclR5cGUpOworICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHBhcmFtcy5rZXlTdG9yZVR5cGUpOworICAgICAgICBpZiAocGFyYW1zLmtleVN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgCWlzID0gcGFyYW1zLmtleVN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJaXMgPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy5rZXlTdG9yZSk7CisgICAgICAgIH0KKyAgICAgICAga3MubG9hZChpcywgcGFyYW1zLmtleVBhc3MudG9DaGFyQXJyYXkoKSk7CisgICAgICAgIGttZi5pbml0KGtzLCBwYXJhbXMua2V5UGFzcy50b0NoYXJBcnJheSgpKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhcmFtcy5pc0tleVN0b3JlU2V0ICYmIHBhcmFtcy5pc1RydXN0U3RvcmVTZXQpIHsKKyAgICAgICAgY3R4LmluaXQoa21mLmdldEtleU1hbmFnZXJzKCksIHRtZi5nZXRUcnVzdE1hbmFnZXJzKCksIG51bGwpOworICAgICAgfQorICAgICAgZWxzZSBpZiAocGFyYW1zLmlzS2V5U3RvcmVTZXQpIHsKKyAgICAgICAgY3R4LmluaXQoa21mLmdldEtleU1hbmFnZXJzKCksIG51bGwsIG51bGwpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGN0eC5pbml0KG51bGwsIHRtZi5nZXRUcnVzdE1hbmFnZXJzKCksIG51bGwpOworICAgICAgfQorCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyB0aGUgdHJhbnNwb3J0IiwgZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY3R4OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0U3RvcmVBc1N0cmVhbShTdHJpbmcgc3RvcmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKHN0b3JlKTsKKyAgICB9IGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgfQorCisgICAgSW5wdXRTdHJlYW0gc3RvcmVTdHJlYW0gPSBudWxsOworICAgIHRyeSB7CisgICAgICBzdG9yZVN0cmVhbSA9IG5ldyBVUkwoc3RvcmUpLm9wZW5TdHJlYW0oKTsKKyAgICAgIGlmIChzdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBzdG9yZVN0cmVhbTsKKyAgICAgIH0KKyAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgfQorCisgICAgc3RvcmVTdHJlYW0gPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oc3RvcmUpOworCisgICAgaWYgKHN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBzdG9yZVN0cmVhbTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBmaWxlOiAiICsgc3RvcmUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFRTb2NrZXQgY3JlYXRlQ2xpZW50KFNTTFNvY2tldEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBTU0xTb2NrZXQgc29ja2V0ID0gKFNTTFNvY2tldCkgZmFjdG9yeS5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICBzb2NrZXQuc2V0U29UaW1lb3V0KHRpbWVvdXQpOworICAgICAgcmV0dXJuIG5ldyBUU29ja2V0KHNvY2tldCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY29ubmVjdCB0byAiICsgaG9zdCArICIgb24gcG9ydCAiICsgcG9ydCwgZSk7CisgICAgfQorICB9CisKKworICAvKioKKyAgICogQSBDbGFzcyB0byBob2xkIGFsbCB0aGUgU1NMIHBhcmFtZXRlcnMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgeworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvdG9jb2wgPSAiVExTIjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVN0b3JlOworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVBhc3M7CisgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlNYW5hZ2VyVHlwZSA9IEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVN0b3JlVHlwZSA9ICJKS1MiOworICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RTdG9yZTsKKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gdHJ1c3RTdG9yZVN0cmVhbTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0UGFzczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0TWFuYWdlclR5cGUgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0U3RvcmVUeXBlID0gIkpLUyI7CisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGNpcGhlclN1aXRlczsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjbGllbnRBdXRoID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNLZXlTdG9yZVNldCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVHJ1c3RTdG9yZVNldCA9IGZhbHNlOworCisgICAgcHVibGljIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCkge30KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgdGhlIHByb3RvY29sIGFuZCBjaXBoZXIgc3VpdGVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgVGhlIHNwZWNpZmljIHByb3RvY29sIChUTFMvU1NMKSBjYW4gYmUgc3BlY2lmaWVkIHdpdGggdmVyc2lvbnMKKyAgICAgKiBAcGFyYW0gY2lwaGVyU3VpdGVzCisgICAgICovCisgICAgcHVibGljIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKFN0cmluZyBwcm90b2NvbCwgU3RyaW5nW10gY2lwaGVyU3VpdGVzKSB7CisgICAgICB0aGlzKHByb3RvY29sLCBjaXBoZXJTdWl0ZXMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgcGFyYW1ldGVycyBzcGVjaWZ5aW5nIHRoZSBwcm90b2NvbCwgY2lwaGVyIHN1aXRlcyBhbmQgaWYgY2xpZW50IGF1dGhlbnRpY2F0aW9uCisgICAgICogaXMgcmVxdWlyZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgc3BlY2lmaWMgcHJvdG9jb2wgKFRMUy9TU0wpIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB2ZXJzaW9ucworICAgICAqIEBwYXJhbSBjaXBoZXJTdWl0ZXMKKyAgICAgKiBAcGFyYW0gY2xpZW50QXV0aAorICAgICAqLworICAgIHB1YmxpYyBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyhTdHJpbmcgcHJvdG9jb2wsIFN0cmluZ1tdIGNpcGhlclN1aXRlcywgYm9vbGVhbiBjbGllbnRBdXRoKSB7CisgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkgeworICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7CisgICAgICB9CisgICAgICB0aGlzLmNpcGhlclN1aXRlcyA9IGNpcGhlclN1aXRlcyAhPSBudWxsID8gQXJyYXlzLmNvcHlPZihjaXBoZXJTdWl0ZXMsIGNpcGhlclN1aXRlcy5sZW5ndGgpIDogbnVsbDsKKyAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmUgTG9jYXRpb24gb2YgdGhlIEtleXN0b3JlIG9uIGRpc2sKKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIGtleVN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShTdHJpbmcga2V5U3RvcmUsIFN0cmluZyBrZXlQYXNzLCBTdHJpbmcga2V5TWFuYWdlclR5cGUsIFN0cmluZyBrZXlTdG9yZVR5cGUpIHsKKyAgICAgIHRoaXMua2V5U3RvcmUgPSBrZXlTdG9yZTsKKyAgICAgIHRoaXMua2V5UGFzcyA9IGtleVBhc3M7CisgICAgICBpZiAoa2V5TWFuYWdlclR5cGUgIT0gbnVsbCkgeworICAgICAgICB0aGlzLmtleU1hbmFnZXJUeXBlID0ga2V5TWFuYWdlclR5cGU7CisgICAgICB9CisgICAgICBpZiAoa2V5U3RvcmVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgdGhpcy5rZXlTdG9yZVR5cGUgPSBrZXlTdG9yZVR5cGU7CisgICAgICB9CisgICAgICBpc0tleVN0b3JlU2V0ID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIGtleVN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbSwgU3RyaW5nIGtleVBhc3MsIFN0cmluZyBrZXlNYW5hZ2VyVHlwZSwgU3RyaW5nIGtleVN0b3JlVHlwZSkgeworICAgIAl0aGlzLmtleVN0b3JlU3RyZWFtID0ga2V5U3RvcmVTdHJlYW07CisgICAgCXNldEtleVN0b3JlKCIiLCBrZXlQYXNzLCBrZXlNYW5hZ2VyVHlwZSwga2V5U3RvcmVUeXBlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSBhbmQgcGFzc3dvcmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlTdG9yZSBMb2NhdGlvbiBvZiB0aGUgS2V5c3RvcmUgb24gZGlzaworICAgICAqIEBwYXJhbSBrZXlQYXNzIEtleXN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoU3RyaW5nIGtleVN0b3JlLCBTdHJpbmcga2V5UGFzcykgeworICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmUsIGtleVBhc3MsIG51bGwsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGtleXN0b3JlIGFuZCBwYXNzd29yZAorICAgICAqCisgICAgICogQHBhcmFtIGtleVN0b3JlU3RyZWFtIEtleXN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIGtleVBhc3MgS2V5c3RvcmUgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbSwgU3RyaW5nIGtleVBhc3MpIHsKKyAgICAgIHNldEtleVN0b3JlKGtleVN0b3JlU3RyZWFtLCBrZXlQYXNzLCBudWxsLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlLCBwYXNzd29yZCwgY2VydGlmaWNhdGUgdHlwZSBhbmQgdGhlIHN0b3JlIHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSB0cnVzdFN0b3JlIExvY2F0aW9uIG9mIHRoZSBUcnVzdHN0b3JlIG9uIGRpc2sKKyAgICAgKiBAcGFyYW0gdHJ1c3RQYXNzIFRydXN0c3RvcmUgcGFzc3dvcmQKKyAgICAgKiBAcGFyYW0gdHJ1c3RNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIHRydXN0U3RvcmVUeXBlIFRoZSBkZWZhdWx0IGlzIEpLUworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoU3RyaW5nIHRydXN0U3RvcmUsIFN0cmluZyB0cnVzdFBhc3MsIFN0cmluZyB0cnVzdE1hbmFnZXJUeXBlLCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUpIHsKKyAgICAgIHRoaXMudHJ1c3RTdG9yZSA9IHRydXN0U3RvcmU7CisgICAgICB0aGlzLnRydXN0UGFzcyA9IHRydXN0UGFzczsKKyAgICAgIGlmICh0cnVzdE1hbmFnZXJUeXBlICE9IG51bGwpIHsKKyAgICAgICAgdGhpcy50cnVzdE1hbmFnZXJUeXBlID0gdHJ1c3RNYW5hZ2VyVHlwZTsKKyAgICAgIH0KKyAgICAgIGlmICh0cnVzdFN0b3JlVHlwZSAhPSBudWxsKSB7CisgICAgICAgIHRoaXMudHJ1c3RTdG9yZVR5cGUgPSB0cnVzdFN0b3JlVHlwZTsKKyAgICAgIH0KKyAgICAgIGlzVHJ1c3RTdG9yZVNldCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdHJ1c3RzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVN0cmVhbSBUcnVzdHN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICogQHBhcmFtIHRydXN0TWFuYWdlclR5cGUgVGhlIGRlZmF1bHQgaXMgWDUwOQorICAgICAqIEBwYXJhbSB0cnVzdFN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcnVzdFN0b3JlKElucHV0U3RyZWFtIHRydXN0U3RvcmVTdHJlYW0sIFN0cmluZyB0cnVzdFBhc3MsIFN0cmluZyB0cnVzdE1hbmFnZXJUeXBlLCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUpIHsKKyAgICAgIHRoaXMudHJ1c3RTdG9yZVN0cmVhbSA9IHRydXN0U3RvcmVTdHJlYW07CisgICAgICBzZXRUcnVzdFN0b3JlKCIiLCB0cnVzdFBhc3MsIHRydXN0TWFuYWdlclR5cGUsIHRydXN0U3RvcmVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZSBMb2NhdGlvbiBvZiB0aGUgVHJ1c3RzdG9yZSBvbiBkaXNrCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShTdHJpbmcgdHJ1c3RTdG9yZSwgU3RyaW5nIHRydXN0UGFzcykgeworICAgICAgc2V0VHJ1c3RTdG9yZSh0cnVzdFN0b3JlLCB0cnVzdFBhc3MsIG51bGwsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVN0cmVhbSBUcnVzdHN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtLCBTdHJpbmcgdHJ1c3RQYXNzKSB7CisgICAgICBzZXRUcnVzdFN0b3JlKHRydXN0U3RvcmVTdHJlYW0sIHRydXN0UGFzcywgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGlmIGNsaWVudCBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZAorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudEF1dGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXF1aXJlQ2xpZW50QXV0aChib29sZWFuIGNsaWVudEF1dGgpIHsKKyAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxY2EwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbENsaWVudDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIFdyYXBzIGFub3RoZXIgVGhyaWZ0IDxjb2RlPlRUcmFuc3BvcnQ8L2NvZGU+LCBidXQgcGVyZm9ybXMgU0FTTCBjbGllbnQKKyAqIG5lZ290aWF0aW9uIG9uIHRoZSBjYWxsIHRvIDxjb2RlPm9wZW4oKTwvY29kZT4uIFRoaXMgY2xhc3Mgd2lsbCB3cmFwIGVuc3VpbmcKKyAqIGNvbW11bmljYXRpb24gb3ZlciBpdCwgaWYgYSBTQVNMIFFPUCBpcyBuZWdvdGlhdGVkIHdpdGggdGhlIG90aGVyIHBhcnR5LgorICovCitwdWJsaWMgY2xhc3MgVFNhc2xDbGllbnRUcmFuc3BvcnQgZXh0ZW5kcyBUU2FzbFRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRTYXNsQ2xpZW50VHJhbnNwb3J0LmNsYXNzKTsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhlIG1lY2hhbmlzbSB0aGlzIGNsaWVudCBzdXBwb3J0cy4KKyAgICovCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lY2hhbmlzbTsKKworICAvKioKKyAgICogVXNlcyB0aGUgZ2l2ZW4gPGNvZGU+U2FzbENsaWVudDwvY29kZT4uCisgICAqIAorICAgKiBAcGFyYW0gc2FzbENsaWVudAorICAgKiAgICAgICAgICBUaGUgPGNvZGU+U2FzbENsaWVudDwvY29kZT4gdG8gdXNlIGZvciB0aGUgc3Vic2VxdWVudCBTQVNMCisgICAqICAgICAgICAgIG5lZ290aWF0aW9uLgorICAgKiBAcGFyYW0gdHJhbnNwb3J0CisgICAqICAgICAgICAgIFRyYW5zcG9ydCB1bmRlcmx5aW5nIHRoaXMgb25lLgorICAgKi8KKyAgcHVibGljIFRTYXNsQ2xpZW50VHJhbnNwb3J0KFNhc2xDbGllbnQgc2FzbENsaWVudCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICBzdXBlcihzYXNsQ2xpZW50LCB0cmFuc3BvcnQpOworICAgIG1lY2hhbmlzbSA9IHNhc2xDbGllbnQuZ2V0TWVjaGFuaXNtTmFtZSgpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPiB1c2luZyB0aGUgZ2l2ZW4gU0FTTC1zcGVjaWZpYyBwYXJhbWV0ZXJzLgorICAgKiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgPGNvZGU+U2FzbC5jcmVhdGVTYXNsQ2xpZW50PC9jb2RlPiBmb3IgdGhlCisgICAqIGRldGFpbHMgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqIAorICAgKiBAcGFyYW0gdHJhbnNwb3J0CisgICAqICAgICAgICAgIFRoZSB1bmRlcmx5aW5nIFRocmlmdCB0cmFuc3BvcnQuCisgICAqIEB0aHJvd3MgU2FzbEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIFRTYXNsQ2xpZW50VHJhbnNwb3J0KFN0cmluZyBtZWNoYW5pc20sIFN0cmluZyBhdXRob3JpemF0aW9uSWQsIFN0cmluZyBwcm90b2NvbCwKKyAgICAgIFN0cmluZyBzZXJ2ZXJOYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoLCBUVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgIHRocm93cyBTYXNsRXhjZXB0aW9uIHsKKyAgICBzdXBlcihTYXNsLmNyZWF0ZVNhc2xDbGllbnQobmV3IFN0cmluZ1tdIHsgbWVjaGFuaXNtIH0sIGF1dGhvcml6YXRpb25JZCwgcHJvdG9jb2wsIHNlcnZlck5hbWUsCisgICAgICAgIHByb3BzLCBjYmgpLCB0cmFuc3BvcnQpOworICAgIHRoaXMubWVjaGFuaXNtID0gbWVjaGFuaXNtOworICB9CisKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFNhc2xSb2xlIGdldFJvbGUoKSB7CisgICAgcmV0dXJuIFNhc2xSb2xlLkNMSUVOVDsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIGluaXRpYWwgcG9ydGlvbiBvZiB0aGUgVGhyaWZ0IFNBU0wKKyAgICogcHJvdG9jb2wuIEdlbmVyYXRlcyBhbmQgc2VuZHMgdGhlIGluaXRpYWwgcmVzcG9uc2UgdG8gdGhlIHNlcnZlciwgaW5jbHVkaW5nCisgICAqIHdoaWNoIG1lY2hhbmlzbSB0aGlzIGNsaWVudCB3YW50cyB0byB1c2UuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2FzbFN0YXJ0TWVzc2FnZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBTYXNsRXhjZXB0aW9uIHsKKyAgICBTYXNsQ2xpZW50IHNhc2xDbGllbnQgPSBnZXRTYXNsQ2xpZW50KCk7CisKKyAgICBieXRlW10gaW5pdGlhbFJlc3BvbnNlID0gbmV3IGJ5dGVbMF07CisgICAgaWYgKHNhc2xDbGllbnQuaGFzSW5pdGlhbFJlc3BvbnNlKCkpCisgICAgICBpbml0aWFsUmVzcG9uc2UgPSBzYXNsQ2xpZW50LmV2YWx1YXRlQ2hhbGxlbmdlKGluaXRpYWxSZXNwb25zZSk7CisKKyAgICBMT0dHRVIuZGVidWcoIlNlbmRpbmcgbWVjaGFuaXNtIG5hbWUge30gYW5kIGluaXRpYWwgcmVzcG9uc2Ugb2YgbGVuZ3RoIHt9IiwgbWVjaGFuaXNtLAorICAgICAgICBpbml0aWFsUmVzcG9uc2UubGVuZ3RoKTsKKworICAgIGJ5dGVbXSBtZWNoYW5pc21CeXRlcyA9IG1lY2hhbmlzbS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICBzZW5kU2FzbE1lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuU1RBUlQsCisgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbUJ5dGVzKTsKKyAgICAvLyBTZW5kIGluaXRpYWwgcmVzcG9uc2UKKyAgICBzZW5kU2FzbE1lc3NhZ2Uoc2FzbENsaWVudC5pc0NvbXBsZXRlKCkgPyBOZWdvdGlhdGlvblN0YXR1cy5DT01QTEVURSA6IE5lZ290aWF0aW9uU3RhdHVzLk9LLAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsUmVzcG9uc2UpOworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuZmx1c2goKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YjgxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsU2VydmVyOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBXcmFwcyBhbm90aGVyIFRocmlmdCA8Y29kZT5UVHJhbnNwb3J0PC9jb2RlPiwgYnV0IHBlcmZvcm1zIFNBU0wgc2VydmVyCisgKiBuZWdvdGlhdGlvbiBvbiB0aGUgY2FsbCB0byA8Y29kZT5vcGVuKCk8L2NvZGU+LiBUaGlzIGNsYXNzIHdpbGwgd3JhcCBlbnN1aW5nCisgKiBjb21tdW5pY2F0aW9uIG92ZXIgaXQsIGlmIGEgU0FTTCBRT1AgaXMgbmVnb3RpYXRlZCB3aXRoIHRoZSBvdGhlciBwYXJ0eS4KKyAqLworcHVibGljIGNsYXNzIFRTYXNsU2VydmVyVHJhbnNwb3J0IGV4dGVuZHMgVFNhc2xUcmFuc3BvcnQgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUU2FzbFNlcnZlclRyYW5zcG9ydC5jbGFzcyk7CisKKyAgLyoqCisgICAqIE1hcHBpbmcgZnJvbSBTQVNMIG1lY2hhbmlzbSBuYW1lIC0+IGFsbCB0aGUgcGFyYW1ldGVycyByZXF1aXJlZCB0bworICAgKiBpbnN0YW50aWF0ZSBhIFNBU0wgc2VydmVyLgorICAgKi8KKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUU2FzbFNlcnZlckRlZmluaXRpb24+IHNlcnZlckRlZmluaXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRTYXNsU2VydmVyRGVmaW5pdGlvbj4oKTsKKworICAvKioKKyAgICogQ29udGFpbnMgYWxsIHRoZSBwYXJhbWV0ZXJzIHVzZWQgdG8gZGVmaW5lIGEgU0FTTCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUU2FzbFNlcnZlckRlZmluaXRpb24geworICAgIHB1YmxpYyBTdHJpbmcgbWVjaGFuaXNtOworICAgIHB1YmxpYyBTdHJpbmcgcHJvdG9jb2w7CisgICAgcHVibGljIFN0cmluZyBzZXJ2ZXJOYW1lOworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzOworICAgIHB1YmxpYyBDYWxsYmFja0hhbmRsZXIgY2JoOworCisgICAgcHVibGljIFRTYXNsU2VydmVyRGVmaW5pdGlvbihTdHJpbmcgbWVjaGFuaXNtLCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBzZXJ2ZXJOYW1lLAorICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoKSB7CisgICAgICB0aGlzLm1lY2hhbmlzbSA9IG1lY2hhbmlzbTsKKyAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICAgIHRoaXMuc2VydmVyTmFtZSA9IHNlcnZlck5hbWU7CisgICAgICB0aGlzLnByb3BzID0gcHJvcHM7CisgICAgICB0aGlzLmNiaCA9IGNiaDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVXNlcyB0aGUgZ2l2ZW4gdW5kZXJseWluZyB0cmFuc3BvcnQuIEFzc3VtZXMgdGhhdCBhZGRTZXJ2ZXJEZWZpbml0aW9uIGlzCisgICAqIGNhbGxlZCBsYXRlci4KKyAgICogCisgICAqIEBwYXJhbSB0cmFuc3BvcnQKKyAgICogICAgICAgICAgVHJhbnNwb3J0IHVuZGVybHlpbmcgdGhpcyBvbmUuCisgICAqLworICBwdWJsaWMgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICBzdXBlcih0cmFuc3BvcnQpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSA8Y29kZT5TYXNsU2VydmVyPC9jb2RlPiB1c2luZyB0aGUgZ2l2ZW4gU0FTTC1zcGVjaWZpYyBwYXJhbWV0ZXJzLgorICAgKiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgPGNvZGU+U2FzbC5jcmVhdGVTYXNsU2VydmVyPC9jb2RlPiBmb3IgdGhlCisgICAqIGRldGFpbHMgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqIAorICAgKiBAcGFyYW0gdHJhbnNwb3J0CisgICAqICAgICAgICAgIFRoZSB1bmRlcmx5aW5nIFRocmlmdCB0cmFuc3BvcnQuCisgICAqLworICBwdWJsaWMgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQoU3RyaW5nIG1lY2hhbmlzbSwgU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgc2VydmVyTmFtZSwKKyAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcHMsIENhbGxiYWNrSGFuZGxlciBjYmgsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgICBhZGRTZXJ2ZXJEZWZpbml0aW9uKG1lY2hhbmlzbSwgcHJvdG9jb2wsIHNlcnZlck5hbWUsIHByb3BzLCBjYmgpOworICB9CisKKyAgcHJpdmF0ZSBUU2FzbFNlcnZlclRyYW5zcG9ydChNYXA8U3RyaW5nLCBUU2FzbFNlcnZlckRlZmluaXRpb24+IHNlcnZlckRlZmluaXRpb25NYXAsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgc3VwZXIodHJhbnNwb3J0KTsKKyAgICB0aGlzLnNlcnZlckRlZmluaXRpb25NYXAucHV0QWxsKHNlcnZlckRlZmluaXRpb25NYXApOworICB9CisKKyAgLyoqCisgICAqIEFkZCBhIHN1cHBvcnRlZCBzZXJ2ZXIgZGVmaW5pdGlvbiB0byB0aGlzIHRyYW5zcG9ydC4gU2VlIHRoZSBKYXZhCisgICAqIGRvY3VtZW50YXRpb24gZm9yIDxjb2RlPlNhc2wuY3JlYXRlU2FzbFNlcnZlcjwvY29kZT4gZm9yIHRoZSBkZXRhaWxzIG9mIHRoZQorICAgKiBwYXJhbWV0ZXJzLgorICAgKi8KKyAgcHVibGljIHZvaWQgYWRkU2VydmVyRGVmaW5pdGlvbihTdHJpbmcgbWVjaGFuaXNtLCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBzZXJ2ZXJOYW1lLAorICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wcywgQ2FsbGJhY2tIYW5kbGVyIGNiaCkgeworICAgIHNlcnZlckRlZmluaXRpb25NYXAucHV0KG1lY2hhbmlzbSwgbmV3IFRTYXNsU2VydmVyRGVmaW5pdGlvbihtZWNoYW5pc20sIHByb3RvY29sLCBzZXJ2ZXJOYW1lLAorICAgICAgICBwcm9wcywgY2JoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFNhc2xSb2xlIGdldFJvbGUoKSB7CisgICAgcmV0dXJuIFNhc2xSb2xlLlNFUlZFUjsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIGluaXRpYWwgcG9ydGlvbiBvZiB0aGUgVGhyaWZ0IFNBU0wgcHJvdG9jb2wuCisgICAqIFJlY2VpdmVzIHRoZSBpbml0aWFsIHJlc3BvbnNlIGZyb20gdGhlIGNsaWVudCwgY3JlYXRlcyBhIFNBU0wgc2VydmVyIHVzaW5nCisgICAqIHRoZSBtZWNoYW5pc20gcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQgKGlmIHRoaXMgc2VydmVyIHN1cHBvcnRzIGl0KSwgYW5kCisgICAqIHNlbmRzIHRoZSBmaXJzdCBjaGFsbGVuZ2UgYmFjayB0byB0aGUgY2xpZW50LgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNhc2xTdGFydE1lc3NhZ2UoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgU2FzbEV4Y2VwdGlvbiB7CisgICAgU2FzbFJlc3BvbnNlIG1lc3NhZ2UgPSByZWNlaXZlU2FzbE1lc3NhZ2UoKTsKKworICAgIExPR0dFUi5kZWJ1ZygiUmVjZWl2ZWQgc3RhcnQgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSIsIG1lc3NhZ2Uuc3RhdHVzKTsKKyAgICBpZiAobWVzc2FnZS5zdGF0dXMgIT0gTmVnb3RpYXRpb25TdGF0dXMuU1RBUlQpIHsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuRVJST1IsICJFeHBlY3RpbmcgU1RBUlQgc3RhdHVzLCByZWNlaXZlZCAiICsgbWVzc2FnZS5zdGF0dXMpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgbWVjaGFuaXNtIG5hbWUuCisgICAgU3RyaW5nIG1lY2hhbmlzbU5hbWUgPSBuZXcgU3RyaW5nKG1lc3NhZ2UucGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgVFNhc2xTZXJ2ZXJEZWZpbml0aW9uIHNlcnZlckRlZmluaXRpb24gPSBzZXJ2ZXJEZWZpbml0aW9uTWFwLmdldChtZWNoYW5pc21OYW1lKTsKKyAgICBMT0dHRVIuZGVidWcoIlJlY2VpdmVkIG1lY2hhbmlzbSBuYW1lICd7fSciLCBtZWNoYW5pc21OYW1lKTsKKworICAgIGlmIChzZXJ2ZXJEZWZpbml0aW9uID09IG51bGwpIHsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuQkFELCAiVW5zdXBwb3J0ZWQgbWVjaGFuaXNtIHR5cGUgIiArIG1lY2hhbmlzbU5hbWUpOworICAgIH0KKyAgICBTYXNsU2VydmVyIHNhc2xTZXJ2ZXIgPSBTYXNsLmNyZWF0ZVNhc2xTZXJ2ZXIoc2VydmVyRGVmaW5pdGlvbi5tZWNoYW5pc20sCisgICAgICAgIHNlcnZlckRlZmluaXRpb24ucHJvdG9jb2wsIHNlcnZlckRlZmluaXRpb24uc2VydmVyTmFtZSwgc2VydmVyRGVmaW5pdGlvbi5wcm9wcywKKyAgICAgICAgc2VydmVyRGVmaW5pdGlvbi5jYmgpOworICAgIHNldFNhc2xTZXJ2ZXIoc2FzbFNlcnZlcik7CisgIH0KKworICAvKioKKyAgICogPGNvZGU+VFRyYW5zcG9ydEZhY3Rvcnk8L2NvZGU+IHRvIGNyZWF0ZQorICAgKiA8Y29kZT5UU2FzbFNlcnZlclRyYW5zcG9ydHM8L2NvZGU+LiBFbnN1cmVzIHRoYXQgYSBnaXZlbgorICAgKiB1bmRlcmx5aW5nIDxjb2RlPlRUcmFuc3BvcnQ8L2NvZGU+IGluc3RhbmNlIHJlY2VpdmVzIHRoZSBzYW1lCisgICAqIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0PC9jb2RlPi4gVGhpcyBpcyBraW5kIG9mIGFuIGF3ZnVsIGhhY2sgdG8gd29yaworICAgKiBhcm91bmQgdGhlIGZhY3QgdGhhdCBUaHJpZnQgaXMgZGVzaWduZWQgYXNzdW1pbmcgdGhhdAorICAgKiA8Y29kZT5UVHJhbnNwb3J0PC9jb2RlPiBpbnN0YW5jZXMgYXJlIHN0YXRlbGVzcywgYW5kIHRodXMgdGhlIGV4aXN0aW5nCisgICAqIDxjb2RlPlRTZXJ2ZXJzPC9jb2RlPiB1c2UgZGlmZmVyZW50IDxjb2RlPlRUcmFuc3BvcnQ8L2NvZGU+IGluc3RhbmNlcyBmb3IKKyAgICogaW5wdXQgYW5kIG91dHB1dC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhd2Z1bCBoYWNrIGRlc2NyaWJlZCBhYm92ZS4KKyAgICAgKiA8Y29kZT5XZWFrSGFzaE1hcDwvY29kZT4gaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBsZWFrIG1lbW9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8VFRyYW5zcG9ydCwgV2Vha1JlZmVyZW5jZTxUU2FzbFNlcnZlclRyYW5zcG9ydD4+IHRyYW5zcG9ydE1hcCA9CisgICAgICBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IFdlYWtIYXNoTWFwPFRUcmFuc3BvcnQsIFdlYWtSZWZlcmVuY2U8VFNhc2xTZXJ2ZXJUcmFuc3BvcnQ+PigpKTsKKworICAgIC8qKgorICAgICAqIE1hcHBpbmcgZnJvbSBTQVNMIG1lY2hhbmlzbSBuYW1lIC0+IGFsbCB0aGUgcGFyYW1ldGVycyByZXF1aXJlZCB0bworICAgICAqIGluc3RhbnRpYXRlIGEgU0FTTCBzZXJ2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUU2FzbFNlcnZlckRlZmluaXRpb24+IHNlcnZlckRlZmluaXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRTYXNsU2VydmVyRGVmaW5pdGlvbj4oKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBGYWN0b3J5LiBBc3N1bWVzIHRoYXQgPGNvZGU+YWRkU2VydmVyRGVmaW5pdGlvbjwvY29kZT4gd2lsbAorICAgICAqIGJlIGNhbGxlZCBsYXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmFjdG9yeSgpIHsKKyAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPkZhY3Rvcnk8L2NvZGU+LCBpbml0aWFsbHkgd2l0aCB0aGUgc2luZ2xlIHNlcnZlcgorICAgICAqIGRlZmluaXRpb24gZ2l2ZW4uIFlvdSBtYXkgc3RpbGwgY2FsbCA8Y29kZT5hZGRTZXJ2ZXJEZWZpbml0aW9uPC9jb2RlPgorICAgICAqIGxhdGVyLiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgPGNvZGU+U2FzbC5jcmVhdGVTYXNsU2VydmVyPC9jb2RlPgorICAgICAqIGZvciB0aGUgZGV0YWlscyBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmFjdG9yeShTdHJpbmcgbWVjaGFuaXNtLCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBzZXJ2ZXJOYW1lLAorICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoKSB7CisgICAgICBzdXBlcigpOworICAgICAgYWRkU2VydmVyRGVmaW5pdGlvbihtZWNoYW5pc20sIHByb3RvY29sLCBzZXJ2ZXJOYW1lLCBwcm9wcywgY2JoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzdXBwb3J0ZWQgc2VydmVyIGRlZmluaXRpb24gdG8gdGhlIHRyYW5zcG9ydHMgY3JlYXRlZCBieSB0aGlzCisgICAgICogZmFjdG9yeS4gU2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yCisgICAgICogPGNvZGU+U2FzbC5jcmVhdGVTYXNsU2VydmVyPC9jb2RlPiBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VydmVyRGVmaW5pdGlvbihTdHJpbmcgbWVjaGFuaXNtLCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBzZXJ2ZXJOYW1lLAorICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoKSB7CisgICAgICBzZXJ2ZXJEZWZpbml0aW9uTWFwLnB1dChtZWNoYW5pc20sIG5ldyBUU2FzbFNlcnZlckRlZmluaXRpb24obWVjaGFuaXNtLCBwcm90b2NvbCwgc2VydmVyTmFtZSwKKyAgICAgICAgICBwcm9wcywgY2JoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0PC9jb2RlPiBpbnN0YW5jZSwgb3IgcmV1c2UgdGhlCisgICAgICogZXhpc3Rpbmcgb25lIGlmIGEgPGNvZGU+VFNhc2xTZXJ2ZXJUcmFuc3BvcnQ8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiBjcmVhdGVkIGJlZm9yZSB1c2luZyB0aGUgZ2l2ZW4gPGNvZGU+VFRyYW5zcG9ydDwvY29kZT4gYXMgYW4gdW5kZXJseWluZworICAgICAqIHRyYW5zcG9ydC4gVGhpcyBlbnN1cmVzIHRoYXQgYSBnaXZlbiB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpbnN0YW5jZQorICAgICAqIHJlY2VpdmVzIHRoZSBzYW1lIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCBiYXNlKSB7CisgICAgICBXZWFrUmVmZXJlbmNlPFRTYXNsU2VydmVyVHJhbnNwb3J0PiByZXQgPSB0cmFuc3BvcnRNYXAuZ2V0KGJhc2UpOworICAgICAgaWYgKHJldCA9PSBudWxsIHx8IHJldC5nZXQoKSA9PSBudWxsKSB7CisgICAgICAgIExPR0dFUi5kZWJ1ZygidHJhbnNwb3J0IG1hcCBkb2VzIG5vdCBjb250YWluIGtleSIsIGJhc2UpOworICAgICAgICByZXQgPSBuZXcgV2Vha1JlZmVyZW5jZTxUU2FzbFNlcnZlclRyYW5zcG9ydD4obmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KHNlcnZlckRlZmluaXRpb25NYXAsIGJhc2UpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXQuZ2V0KCkub3BlbigpOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoImZhaWxlZCB0byBvcGVuIHNlcnZlciB0cmFuc3BvcnQiLCBlKTsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICB0cmFuc3BvcnRNYXAucHV0KGJhc2UsIHJldCk7IC8vIE5vIG5lZWQgZm9yIHB1dElmQWJzZW50KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uY3VycmVudCBjYWxscyB0byBnZXRUcmFuc3BvcnQoKSB3aWxsIHBhc3MgaW4gZGlmZmVyZW50IFRUcmFuc3BvcnRzLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HR0VSLmRlYnVnKCJ0cmFuc3BvcnQgbWFwIGRvZXMgY29udGFpbiBrZXkge30iLCBiYXNlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXQuZ2V0KCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkM2IzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDU3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbENsaWVudDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsU2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogQSBzdXBlcmNsYXNzIGZvciBTQVNMIGNsaWVudC9zZXJ2ZXIgdGhyaWZ0IHRyYW5zcG9ydHMuIEEgc3ViY2xhc3MgbmVlZCBvbmx5CisgKiBpbXBsZW1lbnQgdGhlIDxjb2RlPm9wZW48L2NvZGU+IG1ldGhvZC4KKyAqLworYWJzdHJhY3QgY2xhc3MgVFNhc2xUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVFNhc2xUcmFuc3BvcnQuY2xhc3MpOworCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0xFTkdUSCA9IDB4N0ZGRkZGRkY7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUVDSEFOSVNNX05BTUVfQllURVMgPSAxOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQllURVMgPSAxOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQQVlMT0FEX0xFTkdUSF9CWVRFUyA9IDQ7CisKKyAgcHJvdGVjdGVkIHN0YXRpYyBlbnVtIFNhc2xSb2xlIHsKKyAgICBTRVJWRVIsIENMSUVOVDsKKyAgfQorCisgIC8qKgorICAgKiBTdGF0dXMgYnl0ZXMgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgVGhyaWZ0IFNBU0wgaGFuZHNoYWtlLgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBlbnVtIE5lZ290aWF0aW9uU3RhdHVzIHsKKyAgICBTVEFSVCgoYnl0ZSkweDAxKSwKKyAgICBPSygoYnl0ZSkweDAyKSwKKyAgICBCQUQoKGJ5dGUpMHgwMyksCisgICAgRVJST1IoKGJ5dGUpMHgwNCksCisgICAgQ09NUExFVEUoKGJ5dGUpMHgwNSk7CisKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGUgdmFsdWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Qnl0ZSwgTmVnb3RpYXRpb25TdGF0dXM+IHJldmVyc2VNYXAgPQorICAgICAgbmV3IEhhc2hNYXA8Qnl0ZSwgTmVnb3RpYXRpb25TdGF0dXM+KCk7CisgICAgc3RhdGljIHsKKyAgICAgIGZvciAoTmVnb3RpYXRpb25TdGF0dXMgcyA6IE5lZ290aWF0aW9uU3RhdHVzLmNsYXNzLmdldEVudW1Db25zdGFudHMoKSkgeworICAgICAgICByZXZlcnNlTWFwLnB1dChzLmdldFZhbHVlKCksIHMpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTmVnb3RpYXRpb25TdGF0dXMoYnl0ZSB2YWwpIHsKKyAgICAgIHRoaXMudmFsdWUgPSB2YWw7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZ2V0VmFsdWUoKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOZWdvdGlhdGlvblN0YXR1cyBieVZhbHVlKGJ5dGUgdmFsKSB7CisgICAgICByZXR1cm4gcmV2ZXJzZU1hcC5nZXQodmFsKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVHJhbnNwb3J0IHVuZGVybHlpbmcgdGhpcyBvbmUuCisgICAqLworICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0OworCisgIC8qKgorICAgKiBFaXRoZXIgYSBTQVNMIGNsaWVudCBvciBhIFNBU0wgc2VydmVyLgorICAgKi8KKyAgcHJpdmF0ZSBTYXNsUGFydGljaXBhbnQgc2FzbDsKKworICAvKioKKyAgICogV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHdyYXAvdW53cmFwIHJlYWRzL3dyaXRlcy4gRGV0ZXJtaW5lZCBieSB3aGV0aGVyIG9yCisgICAqIG5vdCBhIFFPUCBpcyBuZWdvdGlhdGVkIGR1cmluZyB0aGUgU0FTTCBoYW5kc2hha2UuCisgICAqLworICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkV3JhcCA9IGZhbHNlOworCisgIC8qKgorICAgKiBCdWZmZXIgZm9yIGlucHV0LgorICAgKi8KKyAgcHJpdmF0ZSBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgcmVhZEJ1ZmZlciA9IG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQoKTsKKworICAvKioKKyAgICogQnVmZmVyIGZvciBvdXRwdXQuCisgICAqLworICBwcml2YXRlIGZpbmFsIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gd3JpdGVCdWZmZXIgPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDI0KTsKKworICAvKioKKyAgICogQ3JlYXRlIGEgVFNhc2xUcmFuc3BvcnQuIEl0J3MgYXNzdW1lZCB0aGF0IHNldFNhc2xTZXJ2ZXIgd2lsbCBiZSBjYWxsZWQKKyAgICogbGF0ZXIgdG8gaW5pdGlhbGl6ZSB0aGUgU0FTTCBlbmRwb2ludCB1bmRlcmx5aW5nIHRoaXMgdHJhbnNwb3J0LgorICAgKgorICAgKiBAcGFyYW0gdW5kZXJseWluZ1RyYW5zcG9ydAorICAgKiAgICAgICAgICBUaGUgdGhyaWZ0IHRyYW5zcG9ydCB3aGljaCB0aGlzIHRyYW5zcG9ydCBpcyB3cmFwcGluZy4KKyAgICovCisgIHByb3RlY3RlZCBUU2FzbFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpIHsKKyAgICB0aGlzLnVuZGVybHlpbmdUcmFuc3BvcnQgPSB1bmRlcmx5aW5nVHJhbnNwb3J0OworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIFRTYXNsVHJhbnNwb3J0IHdoaWNoIGFjdHMgYXMgYSBjbGllbnQuCisgICAqCisgICAqIEBwYXJhbSBzYXNsQ2xpZW50CisgICAqICAgICAgICAgIFRoZSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPiB3aGljaCB0aGlzIHRyYW5zcG9ydCB3aWxsIHVzZSBmb3IgU0FTTAorICAgKiAgICAgICAgICBuZWdvdGlhdGlvbi4KKyAgICogQHBhcmFtIHVuZGVybHlpbmdUcmFuc3BvcnQKKyAgICogICAgICAgICAgVGhlIHRocmlmdCB0cmFuc3BvcnQgd2hpY2ggdGhpcyB0cmFuc3BvcnQgaXMgd3JhcHBpbmcuCisgICAqLworICBwcm90ZWN0ZWQgVFNhc2xUcmFuc3BvcnQoU2FzbENsaWVudCBzYXNsQ2xpZW50LCBUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpIHsKKyAgICBzYXNsID0gbmV3IFNhc2xQYXJ0aWNpcGFudChzYXNsQ2xpZW50KTsKKyAgICB0aGlzLnVuZGVybHlpbmdUcmFuc3BvcnQgPSB1bmRlcmx5aW5nVHJhbnNwb3J0OworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgc2V0U2FzbFNlcnZlcihTYXNsU2VydmVyIHNhc2xTZXJ2ZXIpIHsKKyAgICBzYXNsID0gbmV3IFNhc2xQYXJ0aWNpcGFudChzYXNsU2VydmVyKTsKKyAgfQorCisgIC8vIFVzZWQgdG8gcmVhZCB0aGUgc3RhdHVzIGJ5dGUgYW5kIHBheWxvYWQgbGVuZ3RoLgorICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtZXNzYWdlSGVhZGVyID0gbmV3IGJ5dGVbU1RBVFVTX0JZVEVTICsgUEFZTE9BRF9MRU5HVEhfQllURVNdOworCisgIC8qKgorICAgKiBTZW5kIGEgY29tcGxldGUgVGhyaWZ0IFNBU0wgbWVzc2FnZS4KKyAgICoKKyAgICogQHBhcmFtIHN0YXR1cworICAgKiAgICAgICAgICBUaGUgc3RhdHVzIHRvIHNlbmQuCisgICAqIEBwYXJhbSBwYXlsb2FkCisgICAqICAgICAgICAgIFRoZSBkYXRhIHRvIHNlbmQgYXMgdGhlIHBheWxvYWQgb2YgdGhpcyBtZXNzYWdlLgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHNlbmRTYXNsTWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cyBzdGF0dXMsIGJ5dGVbXSBwYXlsb2FkKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKHBheWxvYWQgPT0gbnVsbCkKKyAgICAgIHBheWxvYWQgPSBuZXcgYnl0ZVswXTsKKworICAgIG1lc3NhZ2VIZWFkZXJbMF0gPSBzdGF0dXMuZ2V0VmFsdWUoKTsKKyAgICBFbmNvZGluZ1V0aWxzLmVuY29kZUJpZ0VuZGlhbihwYXlsb2FkLmxlbmd0aCwgbWVzc2FnZUhlYWRlciwgU1RBVFVTX0JZVEVTKTsKKworICAgIExPR0dFUi5kZWJ1Zygie306IFdyaXRpbmcgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAorICAgICAgICBnZXRSb2xlKCksIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOworCisgICAgdW5kZXJseWluZ1RyYW5zcG9ydC53cml0ZShtZXNzYWdlSGVhZGVyKTsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LndyaXRlKHBheWxvYWQpOworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuZmx1c2goKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkIGEgY29tcGxldGUgVGhyaWZ0IFNBU0wgbWVzc2FnZS4KKyAgICoKKyAgICogQHJldHVybiBUaGUgU0FTTCBzdGF0dXMgYW5kIHBheWxvYWQgZnJvbSB0aGlzIG1lc3NhZ2UuCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgVGhyb3duIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcKKyAgICogICAgICAgICAgIHRyYW5zcG9ydCwgb3IgaWYgYSBzdGF0dXMgY29kZSBvZiBCQUQgb3IgRVJST1IgaXMgZW5jb3VudGVyZWQuCisgICAqLworICBwcm90ZWN0ZWQgU2FzbFJlc3BvbnNlIHJlY2VpdmVTYXNsTWVzc2FnZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwobWVzc2FnZUhlYWRlciwgMCwgbWVzc2FnZUhlYWRlci5sZW5ndGgpOworCisgICAgYnl0ZSBzdGF0dXNCeXRlID0gbWVzc2FnZUhlYWRlclswXTsKKworICAgIE5lZ290aWF0aW9uU3RhdHVzIHN0YXR1cyA9IE5lZ290aWF0aW9uU3RhdHVzLmJ5VmFsdWUoc3RhdHVzQnl0ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiSW52YWxpZCBzdGF0dXMgIiArIHN0YXR1c0J5dGUpOworICAgIH0KKworICAgIGludCBwYXlsb2FkQnl0ZXMgPSBFbmNvZGluZ1V0aWxzLmRlY29kZUJpZ0VuZGlhbihtZXNzYWdlSGVhZGVyLCBTVEFUVVNfQllURVMpOworICAgIGlmIChwYXlsb2FkQnl0ZXMgPCAwIHx8IHBheWxvYWRCeXRlcyA+IDEwNDg1NzYwMCAvKiAxMDAgTUIgKi8pIHsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoCisgICAgICAgIE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiSW52YWxpZCBwYXlsb2FkIGhlYWRlciBsZW5ndGg6ICIgKyBwYXlsb2FkQnl0ZXMpOworICAgIH0KKworICAgIGJ5dGVbXSBwYXlsb2FkID0gbmV3IGJ5dGVbcGF5bG9hZEJ5dGVzXTsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOworCisgICAgaWYgKHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5CQUQgfHwgc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SKSB7CisgICAgICBTdHJpbmcgcmVtb3RlTWVzc2FnZSA9IG5ldyBTdHJpbmcocGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOworICAgIH0KKyAgICBMT0dHRVIuZGVidWcoInt9OiBSZWNlaXZlZCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgcmV0dXJuIG5ldyBTYXNsUmVzcG9uc2Uoc3RhdHVzLCBwYXlsb2FkKTsKKyAgfQorCisgIC8qKgorICAgKiBTZW5kIGEgVGhyaWZ0IFNBU0wgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzdGF0dXMgKHVzdWFsbHkgQkFEIG9yIEVSUk9SKSBhbmQKKyAgICogc3RyaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbgorICAgKiBtZXNzYWdlLgorICAgKgorICAgKiBAcGFyYW0gc3RhdHVzCisgICAqICAgICAgICAgIFRoZSBUaHJpZnQgU0FTTCBzdGF0dXMgY29kZSB0byBzZW5kLiBVc3VhbGx5IEJBRCBvciBFUlJPUi4KKyAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICogICAgICAgICAgVGhlIG9wdGlvbmFsIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgb3RoZXIgc2lkZS4KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqICAgICAgICAgICBBbHdheXMgdGhyb3duIHdpdGggdGhlIG1lc3NhZ2UgcHJvdmlkZWQuCisgICAqIEByZXR1cm4gYWx3YXlzIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGJ1dCBkZWNsYXJlcyByZXR1cm4gdHlwZSB0byBhbGxvdworICAgKiAgICAgICAgICB0aHJvdyBzZW5kQW5kVGhyb3dNZXNzYWdlKC4uLikgdG8gaW5mb3JtIGNvbXBpbGVyIGNvbnRyb2wgZmxvdworICAgKi8KKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnRFeGNlcHRpb24gc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cyBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHNlbmRTYXNsTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IHNlbmQgZmFpbHVyZSByZXNwb25zZSIsIGUpOworICAgICAgbWVzc2FnZSArPSAiXG5BbHNvLCBjb3VsZCBub3Qgc2VuZCByZXNwb25zZTogIiArIGUudG9TdHJpbmcoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24obWVzc2FnZSk7CisgIH0KKworICAvKioKKyAgICogSW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBzdGFydCB0aGUgVGhyaWZ0IFNBU0wgaGFuZHNoYWtlIHByb2Nlc3MuIFdoZW4KKyAgICogdGhpcyBtZXRob2QgY29tcGxldGVzLCB0aGUgPGNvZGU+U2FzbFBhcnRpY2lwYW50PC9jb2RlPiBpbiB0aGlzIGNsYXNzIGlzCisgICAqIGFzc3VtZWQgdG8gYmUgaW5pdGlhbGl6ZWQuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiBAdGhyb3dzIFNhc2xFeGNlcHRpb24KKyAgICovCisgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGhhbmRsZVNhc2xTdGFydE1lc3NhZ2UoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgU2FzbEV4Y2VwdGlvbjsKKworICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2FzbFJvbGUgZ2V0Um9sZSgpOworCisgIC8qKgorICAgKiBPcGVucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgaXQncyBub3QgYWxyZWFkeSBvcGVuIGFuZCB0aGVuIHBlcmZvcm1zCisgICAqIFNBU0wgbmVnb3RpYXRpb24uIElmIGEgUU9QIGlzIG5lZ290aWF0ZWQgZHVyaW5nIHRoaXMgU0FTTCBoYW5kc2hha2UsIGl0IHVzZWQKKyAgICogZm9yIGFsbCBjb21tdW5pY2F0aW9uIG9uIHRoaXMgdHJhbnNwb3J0IGFmdGVyIHRoaXMgY2FsbCBpcyBjb21wbGV0ZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIC8qCisgICAgICogcmVhZFNhc2xIZWFkZXIgaXMgdXNlZCB0byB0YWcgd2hldGhlciB0aGUgU0FTTCBoZWFkZXIgaGFzIGJlZW4gcmVhZCBwcm9wZXJseS4KKyAgICAgKiBJZiB0aGVyZSBpcyBhIHByb2JsZW0gaW4gcmVhZGluZyB0aGUgaGVhZGVyLCB0aGVyZSBtaWdodCBub3QgYmUgYW55CisgICAgICogZGF0YSBpbiB0aGUgc3RyZWFtLCBwb3NzaWJseSBhIFRDUCBoZWFsdGggY2hlY2sgZnJvbSBsb2FkIGJhbGFuY2VyLgorICAgICAqLworICAgIGJvb2xlYW4gcmVhZFNhc2xIZWFkZXIgPSBmYWxzZTsKKworICAgIExPR0dFUi5kZWJ1Zygib3BlbmluZyB0cmFuc3BvcnQge30iLCB0aGlzKTsKKyAgICBpZiAoc2FzbCAhPSBudWxsICYmIHNhc2wuaXNDb21wbGV0ZSgpKQorICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlNBU0wgdHJhbnNwb3J0IGFscmVhZHkgb3BlbiIpOworCisgICAgaWYgKCF1bmRlcmx5aW5nVHJhbnNwb3J0LmlzT3BlbigpKQorICAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5vcGVuKCk7CisKKyAgICB0cnkgeworICAgICAgLy8gTmVnb3RpYXRlIGEgU0FTTCBtZWNoYW5pc20uIFRoZSBjbGllbnQgYWxzbyBzZW5kcyBpdHMKKyAgICAgIC8vIGluaXRpYWwgcmVzcG9uc2UsIG9yIGFuIGVtcHR5IG9uZS4KKyAgICAgIGhhbmRsZVNhc2xTdGFydE1lc3NhZ2UoKTsKKyAgICAgIHJlYWRTYXNsSGVhZGVyID0gdHJ1ZTsKKyAgICAgIExPR0dFUi5kZWJ1Zygie306IFN0YXJ0IG1lc3NhZ2UgaGFuZGxlZCIsIGdldFJvbGUoKSk7CisKKyAgICAgIFNhc2xSZXNwb25zZSBtZXNzYWdlID0gbnVsbDsKKyAgICAgIHdoaWxlICghc2FzbC5pc0NvbXBsZXRlKCkpIHsKKyAgICAgICAgbWVzc2FnZSA9IHJlY2VpdmVTYXNsTWVzc2FnZSgpOworICAgICAgICBpZiAobWVzc2FnZS5zdGF0dXMgIT0gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgJiYKKyAgICAgICAgICAgIG1lc3NhZ2Uuc3RhdHVzICE9IE5lZ290aWF0aW9uU3RhdHVzLk9LKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkV4cGVjdGVkIENPTVBMRVRFIG9yIE9LLCBnb3QgIiArIG1lc3NhZ2Uuc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBjaGFsbGVuZ2UgPSBzYXNsLmV2YWx1YXRlQ2hhbGxlbmdlT3JSZXNwb25zZShtZXNzYWdlLnBheWxvYWQpOworCisgICAgICAgIC8vIElmIHdlIGFyZSB0aGUgY2xpZW50LCBhbmQgdGhlIHNlcnZlciBpbmRpY2F0ZXMgQ09NUExFVEUsIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgLy8gc2VuZCBiYWNrIGFueSBmdXJ0aGVyIHJlc3BvbnNlLgorICAgICAgICBpZiAobWVzc2FnZS5zdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgJiYKKyAgICAgICAgICAgIGdldFJvbGUoKSA9PSBTYXNsUm9sZS5DTElFTlQpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoInt9OiBBbGwgZG9uZSEiLCBnZXRSb2xlKCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc2VuZFNhc2xNZXNzYWdlKHNhc2wuaXNDb21wbGV0ZSgpID8gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgOiBOZWdvdGlhdGlvblN0YXR1cy5PSywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZSk7CisgICAgICB9CisgICAgICBMT0dHRVIuZGVidWcoInt9OiBNYWluIG5lZ290aWF0aW9uIGxvb3AgY29tcGxldGUiLCBnZXRSb2xlKCkpOworCisgICAgICAvLyBJZiB3ZSdyZSB0aGUgY2xpZW50LCBhbmQgd2UncmUgY29tcGxldGUsIGJ1dCB0aGUgc2VydmVyIGlzbid0CisgICAgICAvLyBjb21wbGV0ZSB5ZXQsIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXRzIHJlc3BvbnNlLiBUaGlzIHdpbGwgb2NjdXIKKyAgICAgIC8vIHdpdGggQU5PTllNT1VTIGF1dGgsIGZvciBleGFtcGxlLCB3aGVyZSB3ZSBzZW5kIGFuIGluaXRpYWwgcmVzcG9uc2UKKyAgICAgIC8vIGFuZCBhcmUgaW1tZWRpYXRlbHkgY29tcGxldGUuCisgICAgICBpZiAoZ2V0Um9sZSgpID09IFNhc2xSb2xlLkNMSUVOVCAmJgorICAgICAgICAgIChtZXNzYWdlID09IG51bGwgfHwgbWVzc2FnZS5zdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuT0spKSB7CisgICAgICAgIExPR0dFUi5kZWJ1Zygie306IFNBU0wgQ2xpZW50IHJlY2VpdmluZyBsYXN0IG1lc3NhZ2UiLCBnZXRSb2xlKCkpOworICAgICAgICBtZXNzYWdlID0gcmVjZWl2ZVNhc2xNZXNzYWdlKCk7CisgICAgICAgIGlmIChtZXNzYWdlLnN0YXR1cyAhPSBOZWdvdGlhdGlvblN0YXR1cy5DT01QTEVURSkgeworICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgIkV4cGVjdGVkIFNBU0wgQ09NUExFVEUsIGJ1dCBnb3QgIiArIG1lc3NhZ2Uuc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKFNhc2xFeGNlcHRpb24gZSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJTQVNMIG5lZ290aWF0aW9uIGZhaWx1cmUiLCBlKTsKKyAgICAgICAgdGhyb3cgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5CQUQsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8qCisgICAgICAgKiBJZiB0aGVyZSBpcyBuby1kYXRhIG9yIG5vLXNhc2wgaGVhZGVyIGluIHRoZSBzdHJlYW0sIHRocm93IGEgZGlmZmVyZW50CisgICAgICAgKiB0eXBlIG9mIGV4Y2VwdGlvbiBzbyB3ZSBjYW4gaGFuZGxlIHRoaXMgc2NlbmFyaW8gZGlmZmVyZW50bHkuCisgICAgICAgKi8KKyAgICAgIGlmICghcmVhZFNhc2xIZWFkZXIgJiYgZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSkgeworICAgICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIExPR0dFUi5kZWJ1ZygiTm8gZGF0YSBvciBubyBzYXNsIGRhdGEgaW4gdGhlIHN0cmVhbSIpOworICAgICAgICB0aHJvdyBuZXcgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24oIk5vIGRhdGEgb3Igbm8gc2FzbCBkYXRhIGluIHRoZSBzdHJlYW0iKTsKKyAgICAgIH0KKyAgICAgIHRocm93IGU7CisgICAgfQorCisgICAgU3RyaW5nIHFvcCA9IChTdHJpbmcpIHNhc2wuZ2V0TmVnb3RpYXRlZFByb3BlcnR5KFNhc2wuUU9QKTsKKyAgICBpZiAocW9wICE9IG51bGwgJiYgIXFvcC5lcXVhbHNJZ25vcmVDYXNlKCJhdXRoIikpCisgICAgICBzaG91bGRXcmFwID0gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgPGNvZGU+U2FzbENsaWVudDwvY29kZT4uCisgICAqCisgICAqIEByZXR1cm4gVGhlIDxjb2RlPlNhc2xDbGllbnQ8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHRyYW5zcG9ydAorICAgKiAgICAgICAgIGlzIGJhY2tlZCBieSBhIDxjb2RlPlNhc2xTZXJ2ZXI8L2NvZGU+LgorICAgKi8KKyAgcHVibGljIFNhc2xDbGllbnQgZ2V0U2FzbENsaWVudCgpIHsKKyAgICByZXR1cm4gc2FzbC5zYXNsQ2xpZW50OworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdGhhdCBTYXNsIGlzIHVzaW5nLgorICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5UVHJhbnNwb3J0PC9jb2RlPiB0cmFuc3BvcnQKKyAgICovCisgICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeworICAgICByZXR1cm4gdW5kZXJseWluZ1RyYW5zcG9ydDsKKyAgIH0KKworICAvKioKKyAgICogR2V0IHRoZSB1bmRlcmx5aW5nIDxjb2RlPlNhc2xTZXJ2ZXI8L2NvZGU+LgorICAgKgorICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TYXNsU2VydmVyPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0cmFuc3BvcnQKKyAgICogICAgICAgICBpcyBiYWNrZWQgYnkgYSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPi4KKyAgICovCisgIHB1YmxpYyBTYXNsU2VydmVyIGdldFNhc2xTZXJ2ZXIoKSB7CisgICAgcmV0dXJuIHNhc2wuc2FzbFNlcnZlcjsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkIGEgNC1ieXRlIHdvcmQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgYW5kIGludGVycHJldCBpdCBhcyBhbgorICAgKiBpbnRlZ2VyLgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggcHJlZml4IG9mIHRoZSBuZXh0IFNBU0wgbWVzc2FnZSB0byByZWFkLgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICogICAgICAgICAgIFRocm93biBpZiByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGZhaWxzLgorICAgKi8KKyAgcHJvdGVjdGVkIGludCByZWFkTGVuZ3RoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGJ5dGVbXSBsZW5CdWYgPSBuZXcgYnl0ZVs0XTsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwobGVuQnVmLCAwLCBsZW5CdWYubGVuZ3RoKTsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy5kZWNvZGVCaWdFbmRpYW4obGVuQnVmKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSB0aGUgZ2l2ZW4gaW50ZWdlciBhcyA0IGJ5dGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICoKKyAgICogQHBhcmFtIGxlbmd0aAorICAgKiAgICAgICAgICBUaGUgbGVuZ3RoIHByZWZpeCBvZiB0aGUgbmV4dCBTQVNMIG1lc3NhZ2UgdG8gd3JpdGUuCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgVGhyb3duIGlmIHdyaXRpbmcgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGZhaWxzLgorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgd3JpdGVMZW5ndGgoaW50IGxlbmd0aCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGJ5dGVbXSBsZW5CdWYgPSBuZXcgYnl0ZVs0XTsKKyAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShsZW5ndGgsIGxlbkJ1Zik7CisgICAgdW5kZXJseWluZ1RyYW5zcG9ydC53cml0ZShsZW5CdWYpOworICB9CisKKyAgLy8gQmVsb3cgaXMgdGhlIFNBU0wgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGFuZCBkaXNwb3NlcyBvZiB0aGUgU0FTTCBpbXBsZW1lbnRhdGlvbgorICAgKiB1bmRlcmx5aW5nIHRoaXMgdHJhbnNwb3J0LgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICB0cnkgeworICAgICAgc2FzbC5kaXNwb3NlKCk7CisgICAgfSBjYXRjaCAoU2FzbEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBOb3QgbXVjaCB3ZSBjYW4gZG8gaGVyZS4KKyAgICB9CisgIH0KKworICAvKioKKyAgICogVHJ1ZSBpZiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaXMgb3BlbiBhbmQgdGhlIFNBU0wgaGFuZHNoYWtlIGlzCisgICAqIGNvbXBsZXRlLgorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICByZXR1cm4gdW5kZXJseWluZ1RyYW5zcG9ydC5pc09wZW4oKSAmJiBzYXNsICE9IG51bGwgJiYgc2FzbC5pc0NvbXBsZXRlKCk7CisgIH0KKworICAvKioKKyAgICogUmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4gVW53cmFwcyB0aGUgY29udGVudHMgaWYgYSBRT1Agd2FzCisgICAqIG5lZ290aWF0ZWQgZHVyaW5nIHRoZSBTQVNMIGhhbmRzaGFrZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpCisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU0FTTCBhdXRoZW50aWNhdGlvbiBub3QgY29tcGxldGUiKTsKKworICAgIGludCBnb3QgPSByZWFkQnVmZmVyLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgIHJldHVybiBnb3Q7CisgICAgfQorCisgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICB0cnkgeworICAgICAgcmVhZEZyYW1lKCk7CisgICAgfSBjYXRjaCAoU2FzbEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVhZEJ1ZmZlci5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIFJlYWQgYSBzaW5nbGUgZnJhbWUgb2YgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgdW53cmFwcGluZyBpZgorICAgKiBuZWNlc3NhcnkuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgKiAgICAgICAgICAgVGhyb3duIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICogQHRocm93cyBTYXNsRXhjZXB0aW9uCisgICAqICAgICAgICAgICBUaHJvd24gaWYgdGhlcmUncyBhbiBlcnJvciB1bndyYXBwaW5nIHRoZSBkYXRhLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHJlYWRGcmFtZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBTYXNsRXhjZXB0aW9uIHsKKyAgICBpbnQgZGF0YUxlbmd0aCA9IHJlYWRMZW5ndGgoKTsKKworICAgIGlmIChkYXRhTGVuZ3RoIDwgMCkKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIGRhdGFMZW5ndGggKyAiKSEiKTsKKworICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbZGF0YUxlbmd0aF07CisgICAgTE9HR0VSLmRlYnVnKCJ7fTogcmVhZGluZyBkYXRhIGxlbmd0aDoge30iLCBnZXRSb2xlKCksIGRhdGFMZW5ndGgpOworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQucmVhZEFsbChidWZmLCAwLCBkYXRhTGVuZ3RoKTsKKyAgICBpZiAoc2hvdWxkV3JhcCkgeworICAgICAgYnVmZiA9IHNhc2wudW53cmFwKGJ1ZmYsIDAsIGJ1ZmYubGVuZ3RoKTsKKyAgICAgIExPR0dFUi5kZWJ1ZygiZGF0YSBsZW5ndGggYWZ0ZXIgdW53cmFwOiB7fSIsIGJ1ZmYubGVuZ3RoKTsKKyAgICB9CisgICAgcmVhZEJ1ZmZlci5yZXNldChidWZmKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpCisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiU0FTTCBhdXRoZW50aWNhdGlvbiBub3QgY29tcGxldGUiKTsKKworICAgIHdyaXRlQnVmZmVyLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICB9CisKKyAgLyoqCisgICAqIEZsdXNoZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LiBXcmFwcyB0aGUgY29udGVudHMgaWYgYSBRT1Agd2FzCisgICAqIG5lZ290aWF0ZWQgZHVyaW5nIHRoZSBTQVNMIGhhbmRzaGFrZS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnVmID0gd3JpdGVCdWZmZXIuZ2V0KCk7CisgICAgaW50IGRhdGFMZW5ndGggPSB3cml0ZUJ1ZmZlci5sZW4oKTsKKyAgICB3cml0ZUJ1ZmZlci5yZXNldCgpOworCisgICAgaWYgKHNob3VsZFdyYXApIHsKKyAgICAgIExPR0dFUi5kZWJ1ZygiZGF0YSBsZW5ndGggYmVmb3JlIHdyYXA6IHt9IiwgZGF0YUxlbmd0aCk7CisgICAgICB0cnkgeworICAgICAgICBidWYgPSBzYXNsLndyYXAoYnVmLCAwLCBkYXRhTGVuZ3RoKTsKKyAgICAgIH0gY2F0Y2ggKFNhc2xFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICAgIGRhdGFMZW5ndGggPSBidWYubGVuZ3RoOworICAgIH0KKyAgICBMT0dHRVIuZGVidWcoIndyaXRpbmcgZGF0YSBsZW5ndGg6IHt9IiwgZGF0YUxlbmd0aCk7CisgICAgd3JpdGVMZW5ndGgoZGF0YUxlbmd0aCk7CisgICAgdW5kZXJseWluZ1RyYW5zcG9ydC53cml0ZShidWYsIDAsIGRhdGFMZW5ndGgpOworICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuZmx1c2goKTsKKyAgfQorCisgIC8qKgorICAgKiBVc2VkIGV4Y2x1c2l2ZWx5IGJ5IHJlYWRTYXNsTWVzc2FnZSB0byByZXR1cm4gYm90aCBhIHN0YXR1cyBhbmQgZGF0YS4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgU2FzbFJlc3BvbnNlIHsKKyAgICBwdWJsaWMgTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzOworICAgIHB1YmxpYyBieXRlW10gcGF5bG9hZDsKKworICAgIHB1YmxpYyBTYXNsUmVzcG9uc2UoTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzLCBieXRlW10gcGF5bG9hZCkgeworICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VkIHRvIGFic3RyYWN0IG92ZXIgdGhlIDxjb2RlPlNhc2xTZXJ2ZXI8L2NvZGU+IGFuZAorICAgKiA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPiBjbGFzc2VzLCB3aGljaCBzaGFyZSBhIGxvdCBvZiB0aGVpciBpbnRlcmZhY2UsIGJ1dAorICAgKiB1bmZvcnR1bmF0ZWx5IGRvbid0IHNoYXJlIGEgY29tbW9uIHN1cGVyY2xhc3MuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYXNsUGFydGljaXBhbnQgeworICAgIC8vIE9uZSBvZiB0aGVzZSB3aWxsIGFsd2F5cyBiZSBudWxsLgorICAgIHB1YmxpYyBTYXNsU2VydmVyIHNhc2xTZXJ2ZXI7CisgICAgcHVibGljIFNhc2xDbGllbnQgc2FzbENsaWVudDsKKworICAgIHB1YmxpYyBTYXNsUGFydGljaXBhbnQoU2FzbFNlcnZlciBzYXNsU2VydmVyKSB7CisgICAgICB0aGlzLnNhc2xTZXJ2ZXIgPSBzYXNsU2VydmVyOworICAgIH0KKworICAgIHB1YmxpYyBTYXNsUGFydGljaXBhbnQoU2FzbENsaWVudCBzYXNsQ2xpZW50KSB7CisgICAgICB0aGlzLnNhc2xDbGllbnQgPSBzYXNsQ2xpZW50OworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZXZhbHVhdGVDaGFsbGVuZ2VPclJlc3BvbnNlKGJ5dGVbXSBjaGFsbGVuZ2VPclJlc3BvbnNlKSB0aHJvd3MgU2FzbEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc2FzbENsaWVudCAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBzYXNsQ2xpZW50LmV2YWx1YXRlQ2hhbGxlbmdlKGNoYWxsZW5nZU9yUmVzcG9uc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNhc2xTZXJ2ZXIuZXZhbHVhdGVSZXNwb25zZShjaGFsbGVuZ2VPclJlc3BvbnNlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworICAgICAgaWYgKHNhc2xDbGllbnQgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIHNhc2xDbGllbnQuaXNDb21wbGV0ZSgpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc2FzbFNlcnZlci5pc0NvbXBsZXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBTYXNsRXhjZXB0aW9uIHsKKyAgICAgIGlmIChzYXNsQ2xpZW50ICE9IG51bGwpCisgICAgICAgIHNhc2xDbGllbnQuZGlzcG9zZSgpOworICAgICAgZWxzZQorICAgICAgICBzYXNsU2VydmVyLmRpc3Bvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIHVud3JhcChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgU2FzbEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc2FzbENsaWVudCAhPSBudWxsKQorICAgICAgICByZXR1cm4gc2FzbENsaWVudC51bndyYXAoYnVmLCBvZmYsIGxlbik7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzYXNsU2VydmVyLnVud3JhcChidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIHdyYXAoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFNhc2xFeGNlcHRpb24geworICAgICAgaWYgKHNhc2xDbGllbnQgIT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIHNhc2xDbGllbnQud3JhcChidWYsIG9mZiwgbGVuKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHNhc2xTZXJ2ZXIud3JhcChidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE5lZ290aWF0ZWRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpIHsKKyAgICAgIGlmIChzYXNsQ2xpZW50ICE9IG51bGwpCisgICAgICAgIHJldHVybiBzYXNsQ2xpZW50LmdldE5lZ290aWF0ZWRQcm9wZXJ0eShwcm9wTmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzYXNsU2VydmVyLmdldE5lZ290aWF0ZWRQcm9wZXJ0eShwcm9wTmFtZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxODlmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisvKgorICogVGhpcyBleGNlcHRpb24gaXMgdXNlZCB0byB0cmFjayBleGNlcHRpb25zIGluIFRTYXNsVHJhbnNwb3J0CisgKiB0aGF0IGRvZXMgbm90IGhhdmUgU2FzbCBzaWduYXR1cmUgaW4gdGhlaXIgc3RyZWFtLgorICovCitwdWJsaWMgY2xhc3MgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKworICBwdWJsaWMgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24oKSB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIHB1YmxpYyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgfQorCisgIHB1YmxpYyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZWVrYWJsZUZpbGUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlZWthYmxlRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMmQzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZWVrYWJsZUZpbGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIFRTZWVrYWJsZUZpbGUgeworCisgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKaW5kZXggM2VjYTdiYy4uNzlmN2I3ZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKQEAgLTM3LDMzICszNywzNiBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVFNlcnZlclNvY2tldC5jbGFzcy5nZXROYW1lKCkpOwogCiAgIC8qKgotICAgKiBVbmRlcmx5aW5nIHNlcnZlcnNvY2tldCBvYmplY3QKKyAgICogVW5kZXJseWluZyBTZXJ2ZXJTb2NrZXQgb2JqZWN0CiAgICAqLwogICBwcml2YXRlIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKIAogICAvKioKLSAgICogUG9ydCB0byBsaXN0ZW4gb24KLSAgICovCi0gIHByaXZhdGUgaW50IHBvcnRfID0gMDsKLQotICAvKioKICAgICogVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQKICAgICovCiAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXRfID0gMDsKIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdFNlcnZlclRyYW5zcG9ydEFyZ3M8U2VydmVyU29ja2V0VHJhbnNwb3J0QXJncz4geworICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQ7CisKKyAgICBwdWJsaWMgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncyBzZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgeworICAgICAgdGhpcy5zZXJ2ZXJTb2NrZXQgPSBzZXJ2ZXJTb2NrZXQ7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgIH0KKwogICAvKioKICAgICogQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QKICAgICovCi0gIHB1YmxpYyBUU2VydmVyU29ja2V0KFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQpIHsKKyAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIHRoaXMoc2VydmVyU29ja2V0LCAwKTsKICAgfQogCiAgIC8qKgogICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAogICAgKi8KLSAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCwgaW50IGNsaWVudFRpbWVvdXQpIHsKLSAgICBzZXJ2ZXJTb2NrZXRfID0gc2VydmVyU29ja2V0OwotICAgIGNsaWVudFRpbWVvdXRfID0gY2xpZW50VGltZW91dDsKKyAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0aGlzKG5ldyBTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzKCkuc2VydmVyU29ja2V0KHNlcnZlclNvY2tldCkuY2xpZW50VGltZW91dChjbGllbnRUaW1lb3V0KSk7CiAgIH0KIAogICAvKioKQEAgLTc4LDcgKzgxLDYgQEAKICAgICovCiAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIHRoaXMobmV3IEluZXRTb2NrZXRBZGRyZXNzKHBvcnQpLCBjbGllbnRUaW1lb3V0KTsKLSAgICBwb3J0XyA9IHBvcnQ7CiAgIH0KIAogICBwdWJsaWMgVFNlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkcikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtODYsMjIgKzg4LDMwIEBACiAgIH0KIAogICBwdWJsaWMgVFNlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkciwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBjbGllbnRUaW1lb3V0XyA9IGNsaWVudFRpbWVvdXQ7CisgICAgdGhpcyhuZXcgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLmJpbmRBZGRyKGJpbmRBZGRyKS5jbGllbnRUaW1lb3V0KGNsaWVudFRpbWVvdXQpKTsKKyAgfQorCisgIHB1YmxpYyBUU2VydmVyU29ja2V0KFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MgYXJncykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGNsaWVudFRpbWVvdXRfID0gYXJncy5jbGllbnRUaW1lb3V0OworICAgIGlmIChhcmdzLnNlcnZlclNvY2tldCAhPSBudWxsKSB7CisgICAgICB0aGlzLnNlcnZlclNvY2tldF8gPSBhcmdzLnNlcnZlclNvY2tldDsKKyAgICAgIHJldHVybjsKKyAgICB9CiAgICAgdHJ5IHsKICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAogICAgICAgc2VydmVyU29ja2V0XyA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKICAgICAgIC8vIFByZXZlbnQgMk1TTCBkZWxheSBwcm9ibGVtIG9uIHNlcnZlciByZXN0YXJ0cwogICAgICAgc2VydmVyU29ja2V0Xy5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7CiAgICAgICAvLyBCaW5kIHRvIGxpc3RlbmluZyBwb3J0Ci0gICAgICBzZXJ2ZXJTb2NrZXRfLmJpbmQoYmluZEFkZHIpOworICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGFyZ3MuYmluZEFkZHIsIGFyZ3MuYmFja2xvZyk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBhZGRyZXNzICIgKyBiaW5kQWRkci50b1N0cmluZygpICsgIi4iKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIGxpc3RlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgIC8vIE1ha2Ugc3VyZSB0byBibG9jayBvbiBhY2NlcHQKICAgICBpZiAoc2VydmVyU29ja2V0XyAhPSBudWxsKSB7CiAgICAgICB0cnkgewogICAgICAgICBzZXJ2ZXJTb2NrZXRfLnNldFNvVGltZW91dCgwKTsKQEAgLTE0Miw0ICsxNTIsNyBAQAogICAgIGNsb3NlKCk7CiAgIH0KIAorICBwdWJsaWMgU2VydmVyU29ja2V0IGdldFNlcnZlclNvY2tldCgpIHsKKyAgICByZXR1cm4gc2VydmVyU29ja2V0XzsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuamF2YQppbmRleCAxN2ZmODZiLi40MjRlNGZhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuamF2YQpAQCAtMTksMTEgKzE5LDQwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CisKIC8qKgogICogU2VydmVyIHRyYW5zcG9ydC4gT2JqZWN0IHdoaWNoIHByb3ZpZGVzIGNsaWVudCB0cmFuc3BvcnRzLgogICoKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgaW1wbGVtZW50cyBDbG9zZWFibGUgeworCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2ZXJUcmFuc3BvcnRBcmdzPFQgZXh0ZW5kcyBBYnN0cmFjdFNlcnZlclRyYW5zcG9ydEFyZ3M8VD4+IHsKKyAgICBpbnQgYmFja2xvZyA9IDA7IC8vIEEgdmFsdWUgb2YgMCBtZWFucyB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQgKGN1cnJlbnRseSBzZXQgYXQgNTApCisgICAgaW50IGNsaWVudFRpbWVvdXQgPSAwOworICAgIEluZXRTb2NrZXRBZGRyZXNzIGJpbmRBZGRyOworCisgICAgcHVibGljIFQgYmFja2xvZyhpbnQgYmFja2xvZykgeworICAgICAgdGhpcy5iYWNrbG9nID0gYmFja2xvZzsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBjbGllbnRUaW1lb3V0KGludCBjbGllbnRUaW1lb3V0KSB7CisgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUIHBvcnQoaW50IHBvcnQpIHsKKyAgICAgIHRoaXMuYmluZEFkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MocG9ydCk7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgYmluZEFkZHIoSW5ldFNvY2tldEFkZHJlc3MgYmluZEFkZHIpIHsKKyAgICAgIHRoaXMuYmluZEFkZHIgPSBiaW5kQWRkcjsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisgIH0KIAogICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBsaXN0ZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbjsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTAyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CisKKworLyoqCisgKiBCYXNpYyBmaWxlIHN1cHBvcnQgZm9yIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVFNpbXBsZUZpbGVUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IG51bGw7ICAgCisgIHByaXZhdGUgYm9vbGVhbiByZWFkYWJsZTsgICAgICAgICAgICAgICAKKyAgcHJpdmF0ZSBib29sZWFuIHdyaXRhYmxlOyAgICAgICAgICAgICAgIAorICBwcml2YXRlIFN0cmluZyBwYXRoXzsgICAgICAgICAgICAgICAKKworCisgIC8qKgorICAgKiBDcmVhdGUgYSB0cmFuc3BvcnQgYmFja2VkIGJ5IGEgc2ltcGxlIGZpbGUgCisgICAqIAorICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBvcGVuL2NyZWF0ZQorICAgKiBAcGFyYW0gcmVhZCB0cnVlIHRvIHN1cHBvcnQgcmVhZCBvcGVyYXRpb25zCisgICAqIEBwYXJhbSB3cml0ZSB0cnVlIHRvIHN1cHBvcnQgd3JpdGUgb3BlcmF0aW9ucworICAgKiBAcGFyYW0gb3BlbkZpbGUgdHJ1ZSB0byBvcGVuIHRoZSBmaWxlIG9uIGNvbnN0cnVjdGlvbgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBvcGVuIGZhaWxzCisgICAqLworICBwdWJsaWMgVFNpbXBsZUZpbGVUcmFuc3BvcnQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVhZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHdyaXRlLCBib29sZWFuIG9wZW5GaWxlKQorICAgICAgICAgIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAocGF0aC5sZW5ndGgoKSA8PSAwKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTm8gcGF0aCBzcGVjaWZpZWQiKTsKKyAgICB9CisgICAgaWYgKCFyZWFkICYmICF3cml0ZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5laXRoZXIgUkVBRCBub3IgV1JJVEUgc3BlY2lmaWVkIik7CisgICAgfQorICAgIHJlYWRhYmxlID0gcmVhZDsKKyAgICB3cml0YWJsZSA9IHdyaXRlOworICAgIHBhdGhfID0gcGF0aDsKKyAgICBpZiAob3BlbkZpbGUpIHsKKyAgICAgIG9wZW4oKTsKKyAgICB9CisgIH0KKyAgCisgIC8qKgorICAgKiBDcmVhdGUgYSB0cmFuc3BvcnQgYmFja2VkIGJ5IGEgc2ltcGxlIGZpbGUgCisgICAqIEltcGxpY2l0bHkgb3BlbnMgZmlsZSB0byBjb25mb3JtIHRvIEMrKyBiZWhhdmlvci4KKyAgICogCisgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIG9wZW4vY3JlYXRlCisgICAqIEBwYXJhbSByZWFkIHRydWUgdG8gc3VwcG9ydCByZWFkIG9wZXJhdGlvbnMKKyAgICogQHBhcmFtIHdyaXRlIHRydWUgdG8gc3VwcG9ydCB3cml0ZSBvcGVyYXRpb25zCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBmaWxlIG9wZW4gZmFpbHMKKyAgICovCisgIHB1YmxpYyBUU2ltcGxlRmlsZVRyYW5zcG9ydChTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWFkLCBib29sZWFuIHdyaXRlKQorICAgICAgICAgIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0aGlzKHBhdGgsIHJlYWQsIHdyaXRlLCB0cnVlKTsKKyAgfQorICAKKyAgLyoqCisgICAqIENyZWF0ZSBhIHRyYW5zcG9ydCBiYWNrZWQgYnkgYSBzaW1wbGUgcmVhZCBvbmx5IGRpc2sgZmlsZSAoaW1wbGljaXRseSBvcGVucworICAgKiBmaWxlKQorICAgKgorICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBvcGVuL2NyZWF0ZQorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBvcGVuIGZhaWxzCisgICAqLworICBwdWJsaWMgVFNpbXBsZUZpbGVUcmFuc3BvcnQoU3RyaW5nIHBhdGgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0aGlzKHBhdGgsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0IGZpbGUgc3RhdHVzCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVuLCBvdGhlcndpc2UgZmFsc2UKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIChmaWxlICE9IG51bGwpOworICB9CisKKyAgLyoqCisgICAqIE9wZW4gZmlsZSBpZiBub3QgcHJldmlvdXNseSBvcGVuZWQuIAorICAgKgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgb3BlbiBmYWlscworICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKGZpbGUgPT0gbnVsbCl7CisgICAgICB0cnkgeworICAgICAgICBTdHJpbmcgYWNjZXNzID0gInIiOyAgICAgICAvL1JhbmRvbUFjY2Vzc0ZpbGUgb2JqZWN0cyBtdXN0IGJlIHJlYWRhYmxlCisgICAgICAgIGlmICh3cml0YWJsZSkgeworICAgICAgICAgIGFjY2VzcyArPSAidyI7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHBhdGhfLCBhY2Nlc3MpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgIGZpbGUgPSBudWxsOworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gICAgICAKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ2xvc2UgZmlsZSwgc3Vic2VxdWVudCByZWFkL3dyaXRlIGFjdGl2aXR5IHdpbGwgdGhyb3cgZXhjZXB0aW9ucworICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbGUuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vTm90aGluZyB0byBkbworICAgICAgfQorICAgICAgZmlsZSA9IG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlYWQgdXAgdG8gbGVuIG1hbnkgYnl0ZXMgaW50byBidWYgYXQgb2Zmc2V0IAorICAgKgorICAgKiBAcGFyYW0gYnVmIGhvdXNlcyBieXRlcyByZWFkCisgICAqIEBwYXJhbSBvZmYgb2Zmc2V0IGludG8gYnVmZiB0byBiZWdpbiB3cml0aW5nIHRvCisgICAqIEBwYXJhbSBsZW4gbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvbiByZWFkIGZhaWx1cmUKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghcmVhZGFibGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWFkIG9wZXJhdGlvbiBvbiB3cml0ZSBvbmx5IGZpbGUiKTsKKyAgICB9CisgICAgaW50IGlCeXRlc1JlYWQgPSAwOworICAgIHRyeSB7CisgICAgICBpQnl0ZXNSZWFkID0gZmlsZS5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgZmlsZSA9IG51bGw7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGlCeXRlc1JlYWQ7CisgIH0KKworICAvKioKKyAgICogV3JpdGUgbGVuIG1hbnkgYnl0ZXMgZnJvbSBidWZmIHN0YXJ0aW5nIGF0IG9mZnNldCAKKyAgICoKKyAgICogQHBhcmFtIGJ1ZiBidWZmZXIgY29udGFpbmluZyBieXRlcyB0byB3cml0ZQorICAgKiBAcGFyYW0gb2ZmIG9mZnNldCBpbnRvIGJ1ZmZlciB0byBiZWdpbiB3cml0aW5nIGZyb20KKyAgICogQHBhcmFtIGxlbiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIG9uIHdyaXRlIGZhaWx1cmUKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGZpbGUud3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICBmaWxlID0gbnVsbDsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlvZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBNb3ZlIGZpbGUgcG9pbnRlciB0byBzcGVjaWZpZWQgb2Zmc2V0LCBuZXcgcmVhZC93cml0ZSBjYWxscyB3aWxsIGFjdCBoZXJlCisgICAqCisgICAqIEBwYXJhbSBvZmZzZXQgYnl0ZXMgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSB0byBtb3ZlIHBvaW50ZXIgdG8KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlzIHNlZWsgZmFpbHMKKyAgICovCisgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBvZmZzZXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgZmlsZS5zZWVrKG9mZnNldCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIGluIGJ5dGVzCisgICAqCisgICAqIEByZXR1cm4gbGVuZ3RoIG9mIHRoZSBmaWxlIGluIGJ5dGVzCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBmaWxlIGFjY2VzcyBmYWlscworICAgKi8KKyAgcHVibGljIGxvbmcgbGVuZ3RoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gZmlsZS5sZW5ndGgoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJuIGN1cnJlbnQgZmlsZSBwb2ludGVyIHBvc2l0aW9uIGluIGJ5dGVzIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUKKyAgICoKKyAgICogQHJldHVybiBmaWxlIHBvaW50ZXIgcG9zaXRpb24KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGZpbGUgYWNjZXNzIGZhaWxzCisgICAqLworICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCmluZGV4IDYwNmU4YTkuLmIyMGIzMmIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCkBAIC00MCwyMiArNDAsMjcgQEAKICAgLyoqCiAgICAqIFdyYXBwZWQgU29ja2V0IG9iamVjdAogICAgKi8KLSAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0XyA9IG51bGw7CisgIHByaXZhdGUgU29ja2V0IHNvY2tldF87CiAKICAgLyoqCiAgICAqIFJlbW90ZSBob3N0CiAgICAqLwotICBwcml2YXRlIFN0cmluZyBob3N0XyAgPSBudWxsOworICBwcml2YXRlIFN0cmluZyBob3N0XzsKIAogICAvKioKICAgICogUmVtb3RlIHBvcnQKICAgICovCi0gIHByaXZhdGUgaW50IHBvcnRfID0gMDsKKyAgcHJpdmF0ZSBpbnQgcG9ydF87CiAKICAgLyoqCi0gICAqIFNvY2tldCB0aW1lb3V0CisgICAqIFNvY2tldCB0aW1lb3V0IC0gcmVhZCB0aW1lb3V0IG9uIHRoZSBzb2NrZXQKICAgICovCi0gIHByaXZhdGUgaW50IHRpbWVvdXRfID0gMDsKKyAgcHJpdmF0ZSBpbnQgc29ja2V0VGltZW91dF87CisKKyAgLyoqCisgICAqIENvbm5lY3Rpb24gdGltZW91dAorICAgKi8KKyAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXRfOwogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIGFscmVhZHkgY3JlYXRlZCBzb2NrZXQuCkBAIC02OCwxNCArNzMsMTUgQEAKICAgICB0cnkgewogICAgICAgc29ja2V0Xy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7CiAgICAgICBzb2NrZXRfLnNldFRjcE5vRGVsYXkodHJ1ZSk7CisgICAgICBzb2NrZXRfLnNldEtlZXBBbGl2ZSh0cnVlKTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKICAgICAgIExPR0dFUi53YXJuKCJDb3VsZCBub3QgY29uZmlndXJlIHNvY2tldC4iLCBzeCk7CiAgICAgfQogCiAgICAgaWYgKGlzT3BlbigpKSB7CiAgICAgICB0cnkgewotICAgICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrZXRfLmdldElucHV0U3RyZWFtKCksIDEwMjQpOwotICAgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCksIDEwMjQpOworICAgICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrZXRfLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCkpOwogICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIGlveCk7CkBAIC0xMDAsMTIgKzEwNiwyNyBAQAogICAgKgogICAgKiBAcGFyYW0gaG9zdCAgICBSZW1vdGUgaG9zdAogICAgKiBAcGFyYW0gcG9ydCAgICBSZW1vdGUgcG9ydAotICAgKiBAcGFyYW0gdGltZW91dCBTb2NrZXQgdGltZW91dAorICAgKiBAcGFyYW0gdGltZW91dCBTb2NrZXQgdGltZW91dCBhbmQgY29ubmVjdGlvbiB0aW1lb3V0CiAgICAqLwogICBwdWJsaWMgVFNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KSB7CisgICAgdGhpcyhob3N0LCBwb3J0LCB0aW1lb3V0LCB0aW1lb3V0KTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAorICAgKiBvbiB0aGUgZ2l2ZW4gcG9ydCwgd2l0aCBhIHNwZWNpZmljIGNvbm5lY3Rpb24gdGltZW91dCBhbmQgYQorICAgKiBzcGVjaWZpYyBzb2NrZXQgdGltZW91dC4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QgICAgICAgICAgICBSZW1vdGUgaG9zdAorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgICAgIFJlbW90ZSBwb3J0CisgICAqIEBwYXJhbSBzb2NrZXRUaW1lb3V0ICAgU29ja2V0IHRpbWVvdXQKKyAgICogQHBhcmFtIGNvbm5lY3RUaW1lb3V0ICBDb25uZWN0aW9uIHRpbWVvdXQKKyAgICovCisgIHB1YmxpYyBUU29ja2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHNvY2tldFRpbWVvdXQsIGludCBjb25uZWN0VGltZW91dCkgewogICAgIGhvc3RfID0gaG9zdDsKICAgICBwb3J0XyA9IHBvcnQ7Ci0gICAgdGltZW91dF8gPSB0aW1lb3V0OworICAgIHNvY2tldFRpbWVvdXRfID0gc29ja2V0VGltZW91dDsKKyAgICBjb25uZWN0VGltZW91dF8gPSBjb25uZWN0VGltZW91dDsKICAgICBpbml0U29ja2V0KCk7CiAgIH0KIApAQCAtMTE3LDE5ICsxMzgsMzkgQEAKICAgICB0cnkgewogICAgICAgc29ja2V0Xy5zZXRTb0xpbmdlcihmYWxzZSwgMCk7CiAgICAgICBzb2NrZXRfLnNldFRjcE5vRGVsYXkodHJ1ZSk7Ci0gICAgICBzb2NrZXRfLnNldFNvVGltZW91dCh0aW1lb3V0Xyk7CisgICAgICBzb2NrZXRfLnNldEtlZXBBbGl2ZSh0cnVlKTsKKyAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHNvY2tldFRpbWVvdXRfKTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKICAgICAgIExPR0dFUi5lcnJvcigiQ291bGQgbm90IGNvbmZpZ3VyZSBzb2NrZXQuIiwgc3gpOwogICAgIH0KICAgfQogCiAgIC8qKgorICAgKiBTZXRzIHRoZSBzb2NrZXQgdGltZW91dCBhbmQgY29ubmVjdGlvbiB0aW1lb3V0LgorICAgKgorICAgKiBAcGFyYW0gdGltZW91dCBNaWxsaXNlY29uZHMgdGltZW91dAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIHRoaXMuc2V0Q29ubmVjdFRpbWVvdXQodGltZW91dCk7CisgICAgdGhpcy5zZXRTb2NrZXRUaW1lb3V0KHRpbWVvdXQpOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCB3aWxsIHRpbWUgb3V0CisgICAqCisgICAqIEBwYXJhbSB0aW1lb3V0IE1pbGxpc2Vjb25kcyB0aW1lb3V0CisgICAqLworICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIGNvbm5lY3RUaW1lb3V0XyA9IHRpbWVvdXQ7CisgIH0KKworICAvKioKICAgICogU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKICAgICoKICAgICogQHBhcmFtIHRpbWVvdXQgTWlsbGlzZWNvbmRzIHRpbWVvdXQKICAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLSAgICB0aW1lb3V0XyA9IHRpbWVvdXQ7CisgIHB1YmxpYyB2b2lkIHNldFNvY2tldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICBzb2NrZXRUaW1lb3V0XyA9IHRpbWVvdXQ7CiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uc2V0U29UaW1lb3V0KHRpbWVvdXQpOwogICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkgewpAQCAtMTY1LDExICsyMDYsMTEgQEAKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQUxSRUFEWV9PUEVOLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkLiIpOwogICAgIH0KIAotICAgIGlmIChob3N0Xy5sZW5ndGgoKSA9PSAwKSB7CisgICAgaWYgKGhvc3RfID09IG51bGwgfHwgaG9zdF8ubGVuZ3RoKCkgPT0gMCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdC4iKTsKICAgICB9Ci0gICAgaWYgKHBvcnRfIDw9IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQuIik7CisgICAgaWYgKHBvcnRfIDw9IDAgfHwgcG9ydF8gPiA2NTUzNSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkludmFsaWQgcG9ydCAiICsgcG9ydF8pOwogICAgIH0KIAogICAgIGlmIChzb2NrZXRfID09IG51bGwpIHsKQEAgLTE3Nyw5ICsyMTgsOSBAQAogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBzb2NrZXRfLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3RfLCBwb3J0XyksIHRpbWVvdXRfKTsKLSAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSwgMTAyNCk7Ci0gICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCksIDEwMjQpOworICAgICAgc29ja2V0Xy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0XywgcG9ydF8pLCBjb25uZWN0VGltZW91dF8pOworICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICBjbG9zZSgpOwogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0YW5kYXJkRmlsZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RhbmRhcmRGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzM2FmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0YW5kYXJkRmlsZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKKworcHVibGljIGNsYXNzIFRTdGFuZGFyZEZpbGUgaW1wbGVtZW50cyBUU2Vla2FibGVGaWxlIHsKKworICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhfID0gbnVsbDsKKyAgcHJvdGVjdGVkIFJhbmRvbUFjY2Vzc0ZpbGUgaW5wdXRGaWxlXyA9IG51bGw7CisKKyAgcHVibGljIFRTdGFuZGFyZEZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcGF0aF8gPSBwYXRoOworICAgIGlucHV0RmlsZV8gPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwYXRoXywgInIiKTsKKyAgfQorCisgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRGRCgpKTsKKyAgfQorCisgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aF8pOworICB9CisKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmKGlucHV0RmlsZV8gIT0gbnVsbCkgeworICAgICAgaW5wdXRGaWxlXy5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGlucHV0RmlsZV8ubGVuZ3RoKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlucHV0RmlsZV8uc2Vlayhwb3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCmluZGV4IDM3OGVmZGMuLjczYWQ3MzAgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCkBAIC0xOSwxMiArMTksMTQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKKwogLyoqCiAgKiBHZW5lcmljIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBJL08gbGF5ZXIuIFRoaXMgaXMgYmFzaWNhbGx5IGEgdGhpbgogICogd3JhcHBlciBhcm91bmQgdGhlIGNvbWJpbmVkIGZ1bmN0aW9uYWxpdHkgb2YgSmF2YSBpbnB1dC9vdXRwdXQgc3RyZWFtcy4KICAqCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKIAogICAvKioKICAgICogUXVlcmllcyB3aGV0aGVyIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KQEAgLTU2LDcgKzU4LDcgQEAKICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xvc2UoKTsKIAogICAvKioKLSAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCisgICAqIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBpbnRvIGJ1ZmZlciBidWYsIHN0YXJ0aW5nIGF0IG9mZnNldCBvZmYuCiAgICAqCiAgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCiAgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdApAQCAtODMsNyArODUsMTIgQEAKICAgICB3aGlsZSAoZ290IDwgbGVuKSB7CiAgICAgICByZXQgPSByZWFkKGJ1Ziwgb2ZmK2dvdCwgbGVuLWdvdCk7CiAgICAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIgKyBsZW4gKyAiIGJ5dGVzLCBidXQgb25seSBnb3QgIiArIGdvdCArICIgYnl0ZXMuIik7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIKKyAgICAgICAgICAgICAgICArIGxlbgorICAgICAgICAgICAgICAgICsgIiBieXRlcywgYnV0IG9ubHkgZ290ICIKKyAgICAgICAgICAgICAgICArIGdvdAorICAgICAgICAgICAgICAgICsgIiBieXRlcy4gKFRoaXMgaXMgb2Z0ZW4gaW5kaWNhdGl2ZSBvZiBhbiBpbnRlcm5hbCBlcnJvciBvbiB0aGUgc2VydmVyIHNpZGUuIFBsZWFzZSBjaGVjayB5b3VyIHNlcnZlciBsb2dzLikiKTsKICAgICAgIH0KICAgICAgIGdvdCArPSByZXQ7CiAgICAgfQpAQCAtMTIyLDcgKzEyOSw3IEBACiAgIC8qKgogICAgKiBBY2Nlc3MgdGhlIHByb3RvY29sJ3MgdW5kZXJseWluZyBidWZmZXIgZGlyZWN0bHkuIElmIHRoaXMgaXMgbm90IGEKICAgICogYnVmZmVyZWQgdHJhbnNwb3J0LCByZXR1cm4gbnVsbC4KLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHByb3RvY29sJ3MgVW5kZXJseWluZyBidWZmZXIKICAgICovCiAgIHB1YmxpYyBieXRlW10gZ2V0QnVmZmVyKCkgewogICAgIHJldHVybiBudWxsOwpAQCAtMTMxLDcgKzEzOCw4IEBACiAgIC8qKgogICAgKiBSZXR1cm4gdGhlIGluZGV4IHdpdGhpbiB0aGUgdW5kZXJseWluZyBidWZmZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG5leHQgc3BvdAogICAgKiB0aGF0IHNob3VsZCBiZSByZWFkIGZyb20uCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiBpbmRleCB3aXRoaW4gdGhlIHVuZGVybHlpbmcgYnVmZmVyIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXh0IHNwb3QKKyAgICogdGhhdCBzaG91bGQgYmUgcmVhZCBmcm9tCiAgICAqLwogICBwdWJsaWMgaW50IGdldEJ1ZmZlclBvc2l0aW9uKCkgewogICAgIHJldHVybiAwOwpAQCAtMTQwLDcgKzE0OCw4IEBACiAgIC8qKgogICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIHVuZGVybHlpbmcgYnVmZmVyLiBSZXR1cm5zIC0xIGlmCiAgICAqIHRoaXMgaXMgYSBub24tYnVmZmVyZWQgdHJhbnNwb3J0LgotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIHVuZGVybHlpbmcgYnVmZmVyLiA8YnI+IFJldHVybnMgLTEgaWYKKyAgICogdGhpcyBpcyBhIG5vbi1idWZmZXJlZCB0cmFuc3BvcnQuCiAgICAqLwogICBwdWJsaWMgaW50IGdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSB7CiAgICAgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YQppbmRleCBkMDhmM2IwLi5iODg2YmMyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YQpAQCAtMzQsNiArMzQsNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTFJFQURZX09QRU4gPSAyOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FRF9PVVQgPSAzOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfRklMRSA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPUlJVUFRFRF9EQVRBID0gNTsKIAogICBwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTVhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVyOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTsKKworLyoqCisgKiBUWmxpYlRyYW5zcG9ydCBkZWZsYXRlcyBvbiB3cml0ZSBhbmQgaW5mbGF0ZXMgb24gcmVhZC4KKyAqLworcHVibGljIGNsYXNzIFRabGliVHJhbnNwb3J0IGV4dGVuZHMgVElPU3RyZWFtVHJhbnNwb3J0IHsKKworICAgIHByaXZhdGUgVFRyYW5zcG9ydCB0cmFuc3BvcnRfID0gbnVsbDsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgcHVibGljIEZhY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgYmFzZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUWmxpYlRyYW5zcG9ydChiYXNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtICB0cmFuc3BvcnQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHJlYWQgZnJvbSBhbmQgd3JpdGUgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgVFpsaWJUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICAgICAgdGhpcyh0cmFuc3BvcnQsIERlZmxhdGVyLkJFU1RfQ09NUFJFU1NJT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtICB0cmFuc3BvcnQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRvIHJlYWQgZnJvbSBhbmQgd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gIGNvbXByZXNzaW9uTGV2ZWwgMCBmb3Igbm8gY29tcHJlc3Npb24sIDkgZm9yIG1heGltdW0gY29tcHJlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgVFpsaWJUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBjb21wcmVzc2lvbkxldmVsKSB7CisgICAgICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CisgICAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG5ldyBUVHJhbnNwb3J0SW5wdXRTdHJlYW0odHJhbnNwb3J0XyksIG5ldyBJbmZsYXRlcigpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbShuZXcgVFRyYW5zcG9ydE91dHB1dFN0cmVhbSh0cmFuc3BvcnRfKSwgbmV3IERlZmxhdGVyKGNvbXByZXNzaW9uTGV2ZWwsIGZhbHNlKSwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgICAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgICAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgaWYgKHRyYW5zcG9ydF8uaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgVFRyYW5zcG9ydElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICBwdWJsaWMgVFRyYW5zcG9ydElucHV0U3RyZWFtKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICB0cmFuc3BvcnQucmVhZChidWYsIDAsIDEpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZlswXTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LnJlYWQoYiwgb2ZmLCBsZW4pOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgVFRyYW5zcG9ydE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKKworICAgIHB1YmxpYyBUVHJhbnNwb3J0T3V0cHV0U3RyZWFtKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKG5ldyBieXRlW117KGJ5dGUpIGJ9KTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZSBiL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDY2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIGIvbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmZiZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L2xvZzRqLnByb3BlcnRpZXMgYi9saWIvamF2YS90ZXN0L2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5YmViYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3QvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDYgQEAKKyMgbG9nNGogY29uZmlndXJhdGlvbiB1c2VkIGR1cmluZyBidWlsZCBhbmQgdW5pdCB0ZXN0cworbG9nNGoucm9vdExvZ2dlcj1kZWJ1ZyxzdGRvdXQKK2xvZzRqLnRocmVzaG9sZD1BTEwKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCAlY3syfSAoJUY6JU0oJUwpKSAtICVtJW4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YQppbmRleCA3NTA3MGQwLi42MWY0MGE1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhCkBAIC0xNywxMDUgKzE3LDMyNCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuKjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgdGhyaWZ0LnRlc3QuQm9uazsKK2ltcG9ydCB0aHJpZnQudGVzdC5Db21wYWN0UHJvdG9UZXN0U3RydWN0OworaW1wb3J0IHRocmlmdC50ZXN0LkhvbHlNb2xleTsKK2ltcG9ydCB0aHJpZnQudGVzdC5OZXN0aW5nOworaW1wb3J0IHRocmlmdC50ZXN0Lk9uZU9mRWFjaDsKIAogcHVibGljIGNsYXNzIEZpeHR1cmVzIHsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBPbmVPZkVhY2ggb25lT2ZFYWNoOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIE5lc3RpbmcgbmVzdGluZzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBIb2x5TW9sZXkgaG9seU1vbGV5OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgY29tcGFjdFByb3RvVGVzdFN0cnVjdDsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBrVW5pY29kZUJ5dGVzID0gewotICAgIChieXRlKTB4ZDMsIChieXRlKTB4ODAsIChieXRlKTB4ZTIsIChieXRlKTB4ODUsIChieXRlKTB4YWUsIChieXRlKTB4Y2UsCi0gICAgKGJ5dGUpMHg5ZCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHhkMCwgKGJ5dGUpMHg5ZCwgKGJ5dGUpMHhjZSwgKGJ5dGUpMHhiZiwKLSAgICAoYnl0ZSkweGUyLCAoYnl0ZSkweDg1LCAoYnl0ZSkweGJmLCAoYnl0ZSkweGQwLCAoYnl0ZSkweGJlLCAoYnl0ZSkweGM5LAotICAgIChieXRlKTB4YTEsIChieXRlKTB4ZDAsIChieXRlKTB4YjMsIChieXRlKTB4ZDAsIChieXRlKTB4YjAsIChieXRlKTB4Y2YsCi0gICAgKGJ5dGUpMHg4MSwgKGJ5dGUpMHhlMiwgKGJ5dGUpMHg4NCwgKGJ5dGUpMHg4ZSwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHhjZSwKLSAgICAoYnl0ZSkweDkxLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDc0LCAoYnl0ZSkweGNlLCAoYnl0ZSkweGIxLCAoYnl0ZSkweGUyLAotICAgIChieXRlKTB4ODUsIChieXRlKTB4YmQsIChieXRlKTB4Y2UsIChieXRlKTB4YmEsIChieXRlKTB4ODMsIChieXRlKTB4ZTIsCi0gICAgKGJ5dGUpMHg4MCwgKGJ5dGUpMHhiYwotICB9OworCisgIC8vIFRoZXNlIGJ5dGUgYXJyYXlzIGFyZSBzZXJpYWxpemVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBzdHJ1Y3RzLgorICAvLyBUaGV5IHdlcmUgc2VyaWFsaXplZCBpbiBiaW5hcnkgcHJvdG9jb2wgdXNpbmcgdGhyaWZ0IDAuNi54IGFuZCBhcmUgdXNlZCB0bworICAvLyB0ZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcmVzcGVjdCB0byB0aGUgc3RhbmRhcmQgc2NoZW1lLgorICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBwZXJzaXN0ZW50Qnl0ZXNPbmVPZkVhY2ggPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4RDYsCisgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4NjksIChieXRlKSAweDc4LAorICAgIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDY1LAorICAgIChieXRlKSAweEEwLCAoYnl0ZSkgMHhCQywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4NDAsIChieXRlKSAweDA5LCAoYnl0ZSkgMHgyMSwgKGJ5dGUpIDB4RkIsCisgICAgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ0LCAoYnl0ZSkgMHgyRCwgKGJ5dGUpIDB4MTgsIChieXRlKSAweDBCLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4NEEsIChieXRlKSAweDUzLCAoYnl0ZSkgMHg0RiwgKGJ5dGUpIDB4NEUsCisgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU0LCAoYnl0ZSkgMHg0OCwgKGJ5dGUpIDB4NDksIChieXRlKSAweDUzLAorICAgIChieXRlKSAweDIxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4MjIsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwQiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MkUsIChieXRlKSAweEQzLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LAorICAgIChieXRlKSAweEFFLCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OUQsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhEMCwKKyAgICAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEJGLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsCisgICAgKGJ5dGUpIDB4QkYsIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCRSwgKGJ5dGUpIDB4QzksIChieXRlKSAweEExLAorICAgIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCMywgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIwLCAoYnl0ZSkgMHhDRiwKKyAgICAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg0LCAoYnl0ZSkgMHg4RSwgKGJ5dGUpIDB4MjAsCisgICAgKGJ5dGUpIDB4Q0UsIChieXRlKSAweDkxLCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4NzQsIChieXRlKSAweENFLAorICAgIChieXRlKSAweEIxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweEJELCAoYnl0ZSkgMHhDRSwKKyAgICAoYnl0ZSkgMHhCQSwgKGJ5dGUpIDB4RUYsIChieXRlKSAweEJGLCAoYnl0ZSkgMHhCRCwgKGJ5dGUpIDB4RTIsCisgICAgKGJ5dGUpIDB4ODAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBBLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA2LCAoYnl0ZSkgMHg2MiwgKGJ5dGUpIDB4NjEsCisgICAgKGJ5dGUpIDB4NzMsIChieXRlKSAweDY1LCAoYnl0ZSkgMHgzNiwgKGJ5dGUpIDB4MzQsIChieXRlKSAweDBGLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MEYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBFLCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwIH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc05lc3RpbmcgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4N0EsIChieXRlKSAweDY5LCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDEzLAorICAgIChieXRlKSAweDQ5LCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NjEsIChieXRlKSAweDZELCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4NkUsCisgICAgKGJ5dGUpIDB4NkIsIChieXRlKSAweDJFLCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4MkUsIChieXRlKSAweDIwLAorICAgIChieXRlKSAweDc4LCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4NzIsIChieXRlKSAweDIxLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHhENiwKKyAgICAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NzgsCisgICAgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4NjUsCisgICAgKGJ5dGUpIDB4QTAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA3LCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDIxLCAoYnl0ZSkgMHhGQiwKKyAgICAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDQsIChieXRlKSAweDJELCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MEIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBELCAoYnl0ZSkgMHg0QSwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDRGLCAoYnl0ZSkgMHg0RSwKKyAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NTMsCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBCLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4RDMsIChieXRlKSAweDgwLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsCisgICAgKGJ5dGUpIDB4QUUsIChieXRlKSAweENFLCAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweEQwLAorICAgIChieXRlKSAweDlELCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwKKyAgICAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEJFLCAoYnl0ZSkgMHhDOSwgKGJ5dGUpIDB4QTEsCisgICAgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIzLCAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QjAsIChieXRlKSAweENGLAorICAgIChieXRlKSAweDgxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODQsIChieXRlKSAweDhFLCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4Q0UsCisgICAgKGJ5dGUpIDB4QjEsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkQsIChieXRlKSAweENFLAorICAgIChieXRlKSAweEJBLCAoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEJELCAoYnl0ZSkgMHhFMiwKKyAgICAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4QkMsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2MSwKKyAgICAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NjUsIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MEYsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEUsIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwIH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHBlcnNpc3RlbnRCeXRlc0hvbHlNb2xleSA9IG5ldyBieXRlW10geyAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMSwKKyAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgyMywgKGJ5dGUpIDB4MDYsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHg2OSwgKGJ5dGUpIDB4NzgsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweEEwLCAoYnl0ZSkgMHhCQywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDQsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNywgKGJ5dGUpIDB4NDAsCisgICAgKGJ5dGUpIDB4MDksIChieXRlKSAweDIxLCAoYnl0ZSkgMHhGQiwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ0LAorICAgIChieXRlKSAweDJELCAoYnl0ZSkgMHgxOCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4NEEsCisgICAgKGJ5dGUpIDB4NTMsIChieXRlKSAweDRGLCAoYnl0ZSkgMHg0RSwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDU0LAorICAgIChieXRlKSAweDQ4LCAoYnl0ZSkgMHg0OSwgKGJ5dGUpIDB4NTMsIChieXRlKSAweDIxLCAoYnl0ZSkgMHgyMCwKKyAgICAoYnl0ZSkgMHgyMiwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDksCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MkUsIChieXRlKSAweEQzLAorICAgIChieXRlKSAweDgwLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODUsIChieXRlKSAweEFFLCAoYnl0ZSkgMHhDRSwKKyAgICAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweEQwLCAoYnl0ZSkgMHg5RCwgKGJ5dGUpIDB4Q0UsCisgICAgKGJ5dGUpIDB4QkYsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkYsIChieXRlKSAweEQwLAorICAgIChieXRlKSAweEJFLCAoYnl0ZSkgMHhDOSwgKGJ5dGUpIDB4QTEsIChieXRlKSAweEQwLCAoYnl0ZSkgMHhCMywKKyAgICAoYnl0ZSkgMHhEMCwgKGJ5dGUpIDB4QjAsIChieXRlKSAweENGLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4RTIsCisgICAgKGJ5dGUpIDB4ODQsIChieXRlKSAweDhFLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweDkxLAorICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEIxLCAoYnl0ZSkgMHhFMiwKKyAgICAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QkQsIChieXRlKSAweENFLCAoYnl0ZSkgMHhCQSwgKGJ5dGUpIDB4RUYsCisgICAgKGJ5dGUpIDB4QkYsIChieXRlKSAweEJELCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODAsIChieXRlKSAweEJDLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDYsIChieXRlKSAweDYyLCAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NzMsIChieXRlKSAweDY1LAorICAgIChieXRlKSAweDM2LCAoYnl0ZSkgMHgzNCwgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQywKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDBELCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBFLAorICAgIChieXRlKSAweDBBLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweEQ2LCAoYnl0ZSkgMHgwNiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA0LAorICAgIChieXRlKSAweDY5LCAoYnl0ZSkgMHg3OCwgKGJ5dGUpIDB4MDgsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEEsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAxLCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4QTAsIChieXRlKSAweEJDLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA3LCAoYnl0ZSkgMHg0MCwgKGJ5dGUpIDB4MDksCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweEZCLCAoYnl0ZSkgMHg1NCwgKGJ5dGUpIDB4NDQsIChieXRlKSAweDJELAorICAgIChieXRlKSAweDE4LCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELCAoYnl0ZSkgMHg0QSwgKGJ5dGUpIDB4NTMsCisgICAgKGJ5dGUpIDB4NEYsIChieXRlKSAweDRFLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NTQsIChieXRlKSAweDQ4LAorICAgIChieXRlKSAweDQ5LCAoYnl0ZSkgMHg1MywgKGJ5dGUpIDB4MjEsIChieXRlKSAweDIwLCAoYnl0ZSkgMHgyMiwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgyRSwgKGJ5dGUpIDB4RDMsIChieXRlKSAweDgwLAorICAgIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwgKGJ5dGUpIDB4QUUsIChieXRlKSAweENFLCAoYnl0ZSkgMHg5RCwKKyAgICAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4RDAsIChieXRlKSAweDlELCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QkYsCisgICAgKGJ5dGUpIDB4RTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhCRiwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEJFLAorICAgIChieXRlKSAweEM5LCAoYnl0ZSkgMHhBMSwgKGJ5dGUpIDB4RDAsIChieXRlKSAweEIzLCAoYnl0ZSkgMHhEMCwKKyAgICAoYnl0ZSkgMHhCMCwgKGJ5dGUpIDB4Q0YsIChieXRlKSAweDgxLCAoYnl0ZSkgMHhFMiwgKGJ5dGUpIDB4ODQsCisgICAgKGJ5dGUpIDB4OEUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LAorICAgIChieXRlKSAweDc0LCAoYnl0ZSkgMHhDRSwgKGJ5dGUpIDB4QjEsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4NSwKKyAgICAoYnl0ZSkgMHhCRCwgKGJ5dGUpIDB4Q0UsIChieXRlKSAweEJBLCAoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkYsCisgICAgKGJ5dGUpIDB4QkQsIChieXRlKSAweEUyLCAoYnl0ZSkgMHg4MCwgKGJ5dGUpIDB4QkMsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsCisgICAgKGJ5dGUpIDB4NjIsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg3MywgKGJ5dGUpIDB4NjUsIChieXRlKSAweDM2LAorICAgIChieXRlKSAweDM0LCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBELAorICAgIChieXRlKSAweDA2LCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDMsIChieXRlKSAweDBGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MEUsIChieXRlKSAweDBBLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBFLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MEYsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwQiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NkUsCisgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDYxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NkYsIChieXRlKSAweDZFLAorICAgIChieXRlKSAweDY1LCAoYnl0ZSkgMHgyQywgKGJ5dGUpIDB4MjAsIChieXRlKSAweDc0LCAoYnl0ZSkgMHg3NywKKyAgICAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDYsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg3MiwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDY1LAorICAgIChieXRlKSAweDIxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNiwKKyAgICAoYnl0ZSkgMHg0NiwgKGJ5dGUpIDB4NEYsIChieXRlKSAweDU1LCAoYnl0ZSkgMHg1MiwgKGJ5dGUpIDB4MjEsCisgICAgKGJ5dGUpIDB4MjEsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAyLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOSwKKyAgICAoYnl0ZSkgMHg2MSwgKGJ5dGUpIDB4NkUsIChieXRlKSAweDY0LCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NjEsCisgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweDZGLCAoYnl0ZSkgMHg2RSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDksIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2RSwKKyAgICAoYnl0ZSkgMHg2NCwgKGJ5dGUpIDB4MjAsIChieXRlKSAweDYxLCAoYnl0ZSkgMHgyMCwgKGJ5dGUpIDB4NzQsCisgICAgKGJ5dGUpIDB4NzcsIChieXRlKSAweDZGLCAoYnl0ZSkgMHgwRCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAzLAorICAgIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwRiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDMsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDc3LCAoYnl0ZSkgMHg2RiwgKGJ5dGUpIDB4MEMsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDA4LCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDEsCisgICAgKGJ5dGUpIDB4MEIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMiwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4NTcsIChieXRlKSAweDYxLCAoYnl0ZSkgMHg2OSwKKyAgICAoYnl0ZSkgMHg3NCwgKGJ5dGUpIDB4MkUsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwOCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDEsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAyLAorICAgIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDIsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwKKyAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDUsIChieXRlKSAweDU3LCAoYnl0ZSkgMHg2OCwgKGJ5dGUpIDB4NjEsCisgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweDNGLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4NzQsIChieXRlKSAweDY4LCAoYnl0ZSkgMHg3MiwKKyAgICAoYnl0ZSkgMHg2NSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDBDLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLAorICAgIChieXRlKSAweDA0LCAoYnl0ZSkgMHg3QSwgKGJ5dGUpIDB4NjUsIChieXRlKSAweDcyLCAoYnl0ZSkgMHg2RiwKKyAgICAoYnl0ZSkgMHgwQywgKGJ5dGUpIDB4MDAsIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCisgICAgKGJ5dGUpIDB4MDAgfTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10ga1VuaWNvZGVCeXRlcyA9IHsgKGJ5dGUpIDB4ZDMsIChieXRlKSAweDgwLAorICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhhZSwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweDlkLAorICAgICAgKGJ5dGUpIDB4MjAsIChieXRlKSAweGQwLCAoYnl0ZSkgMHg5ZCwgKGJ5dGUpIDB4Y2UsIChieXRlKSAweGJmLAorICAgICAgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg1LCAoYnl0ZSkgMHhiZiwgKGJ5dGUpIDB4ZDAsIChieXRlKSAweGJlLAorICAgICAgKGJ5dGUpIDB4YzksIChieXRlKSAweGExLCAoYnl0ZSkgMHhkMCwgKGJ5dGUpIDB4YjMsIChieXRlKSAweGQwLAorICAgICAgKGJ5dGUpIDB4YjAsIChieXRlKSAweGNmLCAoYnl0ZSkgMHg4MSwgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg0LAorICAgICAgKGJ5dGUpIDB4OGUsIChieXRlKSAweDIwLCAoYnl0ZSkgMHhjZSwgKGJ5dGUpIDB4OTEsIChieXRlKSAweDc0LAorICAgICAgKGJ5dGUpIDB4NzQsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhiMSwgKGJ5dGUpIDB4ZTIsIChieXRlKSAweDg1LAorICAgICAgKGJ5dGUpIDB4YmQsIChieXRlKSAweGNlLCAoYnl0ZSkgMHhiYSwgKGJ5dGUpIDB4ODMsIChieXRlKSAweGUyLAorICAgICAgKGJ5dGUpIDB4ODAsIChieXRlKSAweGJjIH07CiAKICAgc3RhdGljIHsKICAgICB0cnkgewogICAgICAgb25lT2ZFYWNoID0gbmV3IE9uZU9mRWFjaCgpOwotICAgICAgb25lT2ZFYWNoLmltX3RydWUgPSB0cnVlOwotICAgICAgb25lT2ZFYWNoLmltX2ZhbHNlID0gZmFsc2U7Ci0gICAgICBvbmVPZkVhY2guYV9iaXRlID0gKGJ5dGUpIDB4ZDY7Ci0gICAgICBvbmVPZkVhY2guaW50ZWdlcjE2ID0gMjcwMDA7Ci0gICAgICBvbmVPZkVhY2guaW50ZWdlcjMyID0gMSA8PCAyNDsKLSAgICAgIG9uZU9mRWFjaC5pbnRlZ2VyNjQgPSAobG9uZykgNjAwMCAqIDEwMDAgKiAxMDAwOwotICAgICAgb25lT2ZFYWNoLmRvdWJsZV9wcmVjaXNpb24gPSBNYXRoLlBJOwotICAgICAgb25lT2ZFYWNoLnNvbWVfY2hhcmFjdGVycyA9ICJKU09OIFRISVMhIFwiXDEiOwotICAgICAgb25lT2ZFYWNoLnpvbWdfdW5pY29kZSA9IG5ldyBTdHJpbmcoa1VuaWNvZGVCeXRlcywgIlVURi04Iik7Ci0gICAgICBvbmVPZkVhY2guYmFzZTY0ID0gImJhc2U2NCIuZ2V0Qnl0ZXMoKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRJbV90cnVlKHRydWUpOworICAgICAgb25lT2ZFYWNoLnNldEltX2ZhbHNlKGZhbHNlKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRBX2JpdGUoKGJ5dGUpIDB4ZDYpOworICAgICAgb25lT2ZFYWNoLnNldEludGVnZXIxNigoc2hvcnQpIDI3MDAwKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRJbnRlZ2VyMzIoMSA8PCAyNCk7CisgICAgICBvbmVPZkVhY2guc2V0SW50ZWdlcjY0KChsb25nKSA2MDAwICogMTAwMCAqIDEwMDApOworICAgICAgb25lT2ZFYWNoLnNldERvdWJsZV9wcmVjaXNpb24oTWF0aC5QSSk7CisgICAgICBvbmVPZkVhY2guc2V0U29tZV9jaGFyYWN0ZXJzKCJKU09OIFRISVMhIFwiXDEiKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRab21nX3VuaWNvZGUobmV3IFN0cmluZyhrVW5pY29kZUJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICBvbmVPZkVhY2guc2V0QmFzZTY0KEJ5dGVCdWZmZXIud3JhcCgiYmFzZTY0Ii5nZXRCeXRlcygpKSk7CiAgICAgICAvLyBieXRlLCBpMTYsIGFuZCBpNjQgbGlzdHMgYXJlIHBvcHVsYXRlZCBieSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAKICAgICAgIEJvbmsgYm9uayA9IG5ldyBCb25rKCk7Ci0gICAgICBib25rLnR5cGUgPSAzMTMzNzsKLSAgICAgIGJvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKKyAgICAgIGJvbmsuc2V0VHlwZSgzMTMzNyk7CisgICAgICBib25rLnNldE1lc3NhZ2UoIkkgYW0gYSBib25rLi4uIHhvciEiKTsKICAgICAgIG5lc3RpbmcgPSBuZXcgTmVzdGluZyhib25rLCBvbmVPZkVhY2gpOwogCiAgICAgICBob2x5TW9sZXkgPSBuZXcgSG9seU1vbGV5KCk7Ci0gICAgICBob2x5TW9sZXkuYmlnID0gbmV3IEFycmF5TGlzdDxPbmVPZkVhY2g+KCk7Ci0gICAgICBob2x5TW9sZXkuYmlnLmFkZChuZXcgT25lT2ZFYWNoKG9uZU9mRWFjaCkpOwotICAgICAgaG9seU1vbGV5LmJpZy5hZGQobmVzdGluZy5teV9vb2UpOwotICAgICAgaG9seU1vbGV5LmJpZy5nZXQoMCkuYV9iaXRlID0gKGJ5dGUpIDB4MjI7Ci0gICAgICBob2x5TW9sZXkuYmlnLmdldCgxKS5hX2JpdGUgPSAoYnl0ZSkgMHgyMzsKKyAgICAgIExpc3Q8T25lT2ZFYWNoPiBiaWcgPSBuZXcgQXJyYXlMaXN0PE9uZU9mRWFjaD4oKTsKKyAgICAgIGJpZy5hZGQobmV3IE9uZU9mRWFjaChvbmVPZkVhY2gpKTsKKyAgICAgIGJpZy5hZGQobmVzdGluZy5teV9vb2UpOworICAgICAgaG9seU1vbGV5LnNldEJpZyhiaWcpOworICAgICAgaG9seU1vbGV5LmdldEJpZygpLmdldCgwKS5zZXRBX2JpdGUoKGJ5dGUpIDB4MjIpOworICAgICAgaG9seU1vbGV5LmdldEJpZygpLmdldCgwKS5zZXRBX2JpdGUoKGJ5dGUpIDB4MjMpOwogCi0gICAgICBob2x5TW9sZXkuY29udGFpbiA9IG5ldyBIYXNoU2V0PExpc3Q8U3RyaW5nPj4oKTsKKyAgICAgIGhvbHlNb2xleS5zZXRDb250YWluKG5ldyBIYXNoU2V0PExpc3Q8U3RyaW5nPj4oKSk7CiAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzdGFnZTEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMik7CiAgICAgICBzdGFnZTEuYWRkKCJhbmQgYSBvbmUiKTsKICAgICAgIHN0YWdlMS5hZGQoImFuZCBhIHR3byIpOwotICAgICAgaG9seU1vbGV5LmNvbnRhaW4uYWRkKHN0YWdlMSk7CisgICAgICBob2x5TW9sZXkuZ2V0Q29udGFpbigpLmFkZChzdGFnZTEpOwogICAgICAgc3RhZ2UxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDMpOwogICAgICAgc3RhZ2UxLmFkZCgidGhlbiBhIG9uZSwgdHdvIik7CiAgICAgICBzdGFnZTEuYWRkKCJ0aHJlZSEiKTsKICAgICAgIHN0YWdlMS5hZGQoIkZPVVIhISIpOwotICAgICAgaG9seU1vbGV5LmNvbnRhaW4uYWRkKHN0YWdlMSk7CisgICAgICBob2x5TW9sZXkuZ2V0Q29udGFpbigpLmFkZChzdGFnZTEpOwogICAgICAgc3RhZ2UxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDApOwotICAgICAgaG9seU1vbGV5LmNvbnRhaW4uYWRkKHN0YWdlMSk7CisgICAgICBob2x5TW9sZXkuZ2V0Q29udGFpbigpLmFkZChzdGFnZTEpOwogCiAgICAgICBBcnJheUxpc3Q8Qm9uaz4gc3RhZ2UyID0gbmV3IEFycmF5TGlzdDxCb25rPigpOwotICAgICAgaG9seU1vbGV5LmJvbmtzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEJvbms+PigpOworICAgICAgaG9seU1vbGV5LnNldEJvbmtzKG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxCb25rPj4oKSk7CiAgICAgICAvLyBvbmUgZW1wdHkKLSAgICAgIGhvbHlNb2xleS5ib25rcy5wdXQoInplcm8iLCBzdGFnZTIpOwotICAgICAgCisgICAgICBob2x5TW9sZXkuZ2V0Qm9ua3MoKS5wdXQoInplcm8iLCBzdGFnZTIpOworCiAgICAgICAvLyBvbmUgd2l0aCB0d28KICAgICAgIHN0YWdlMiA9IG5ldyBBcnJheUxpc3Q8Qm9uaz4oKTsKICAgICAgIEJvbmsgYiA9IG5ldyBCb25rKCk7Ci0gICAgICBiLnR5cGUgPSAxOwotICAgICAgYi5tZXNzYWdlID0gIldhaXQuIjsKKyAgICAgIGIuc2V0VHlwZSgxKTsKKyAgICAgIGIuc2V0TWVzc2FnZSgiV2FpdC4iKTsKICAgICAgIHN0YWdlMi5hZGQoYik7CiAgICAgICBiID0gbmV3IEJvbmsoKTsKLSAgICAgIGIudHlwZSA9IDI7Ci0gICAgICBiLm1lc3NhZ2UgPSAiV2hhdD8iOwotICAgICAgc3RhZ2UyLmFkZChiKTsgICAgICAKLSAgICAgIGhvbHlNb2xleS5ib25rcy5wdXQoInR3byIsIHN0YWdlMik7Ci0gICAgICAKKyAgICAgIGIuc2V0VHlwZSgyKTsKKyAgICAgIGIuc2V0TWVzc2FnZSgiV2hhdD8iKTsKKyAgICAgIHN0YWdlMi5hZGQoYik7CisgICAgICBob2x5TW9sZXkuZ2V0Qm9ua3MoKS5wdXQoInR3byIsIHN0YWdlMik7CisKICAgICAgIC8vIG9uZSB3aXRoIHRocmVlCiAgICAgICBzdGFnZTIgPSBuZXcgQXJyYXlMaXN0PEJvbms+KCk7CiAgICAgICBiID0gbmV3IEJvbmsoKTsKLSAgICAgIGIudHlwZSA9IDM7Ci0gICAgICBiLm1lc3NhZ2UgPSAicXVvdGgiOworICAgICAgYi5zZXRUeXBlKDMpOworICAgICAgYi5zZXRNZXNzYWdlKCJxdW90aCIpOwogICAgICAgYiA9IG5ldyBCb25rKCk7Ci0gICAgICBiLnR5cGUgPSA0OwotICAgICAgYi5tZXNzYWdlID0gInRoZSByYXZlbiI7CisgICAgICBiLnNldFR5cGUoNCk7CisgICAgICBiLnNldE1lc3NhZ2UoInRoZSByYXZlbiIpOwogICAgICAgYiA9IG5ldyBCb25rKCk7Ci0gICAgICBiLnR5cGUgPSA1OwotICAgICAgYi5tZXNzYWdlID0gIm5ldmVybW9yZSI7Ci0gICAgICBob2x5TW9sZXkuYm9ua3MucHV0KCJ0aHJlZSIsIHN0YWdlMik7CisgICAgICBiLnNldFR5cGUoNSk7CisgICAgICBiLnNldE1lc3NhZ2UoIm5ldmVybW9yZSIpOworICAgICAgaG9seU1vbGV5LmdldEJvbmtzKCkucHV0KCJ0aHJlZSIsIHN0YWdlMik7CiAKICAgICAgIC8vIHN1cGVyaHVnZSBjb21wYWN0IHByb3RvIHRlc3Qgc3RydWN0Ci0gICAgICBjb21wYWN0UHJvdG9UZXN0U3RydWN0ID0gbmV3IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QodGhyaWZ0LnRlc3QuQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVCk7Ci0gICAgICBjb21wYWN0UHJvdG9UZXN0U3RydWN0LmFfYmluYXJ5ID0gbmV3IGJ5dGVbXXswLDEsMiwzLDQsNSw2LDcsOH07CisgICAgICBjb21wYWN0UHJvdG9UZXN0U3RydWN0ID0gbmV3IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoCisgICAgICAgICAgdGhyaWZ0LnRlc3QuRGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNUKTsKKyAgICAgIGNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Quc2V0QV9iaW5hcnkoQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10geyAwLCAxLCAyLAorICAgICAgICAgIDMsIDQsIDUsIDYsIDcsIDggfSkpOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICB9CiAgIH0KLSAgCiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3REZWVwQ29weS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RGVlcENvcHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FmYWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RGVlcENvcHkuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IHRocmlmdC50ZXN0LkRlZXBDb3B5QmFyOworaW1wb3J0IHRocmlmdC50ZXN0LkRlZXBDb3B5Rm9vOworCitwdWJsaWMgY2xhc3MgVGVzdERlZXBDb3B5IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3REZWVwQ29weSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIERlZXBDb3B5Rm9vIGZvbyA9IG5ldyBEZWVwQ29weUZvbygpOworCisgICAgZm9vLmFkZFRvTChuZXcgRGVlcENvcHlCYXIoKSk7CisgICAgZm9vLmFkZFRvUyhuZXcgRGVlcENvcHlCYXIoKSk7CisgICAgZm9vLnB1dFRvTSgidGVzdCAzIiwgbmV3IERlZXBDb3B5QmFyKCkpOworCisgICAgZm9vLmFkZFRvTGkobmV3IHRocmlmdC50ZXN0Lk9iamVjdCgpKTsKKyAgICBmb28uYWRkVG9TaShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0KCkpOworICAgIGZvby5wdXRUb01pKCJ0ZXN0IDMiLCBuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0KCkpOworCisgICAgZm9vLnNldEJhcihuZXcgRGVlcENvcHlCYXIoKSk7CisKKyAgICBmaW5hbCBEZWVwQ29weUZvbyBkZWVwQ29weUZvbyA9IGZvby5kZWVwQ29weSgpOworCisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0QmFyKCksIGRlZXBDb3B5Rm9vLmdldEJhcigpKTsKKworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldEwoKS5nZXQoMCksICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRMKCkuZ2V0KDApKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRTKCkudG9BcnJheShuZXcgRGVlcENvcHlCYXJbMF0pWzBdLCAgZGVlcENvcHlGb28uZ2V0UygpLnRvQXJyYXkobmV3IERlZXBDb3B5QmFyWzBdKVswXSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TSgpLmdldCgidGVzdCAzIiksICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldE0oKS5nZXQoInRlc3QgMyIpKTsKKworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldExpKCkuZ2V0KDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldExpKCkuZ2V0KDApKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRTaSgpLnRvQXJyYXkobmV3IHRocmlmdC50ZXN0Lk9iamVjdFswXSlbMF0sICBkZWVwQ29weUZvby5nZXRTaSgpLnRvQXJyYXkobmV3IHRocmlmdC50ZXN0Lk9iamVjdFswXSlbMF0pOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldE1pKCkuZ2V0KCJ0ZXN0IDMiKSwgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldE1pKCkuZ2V0KCJ0ZXN0IDMiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEVudW1Db250YWluZXJzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RFbnVtQ29udGFpbmVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzI0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RFbnVtQ29udGFpbmVycy5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycy5FbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHM7CitpbXBvcnQgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMuR29kQmVhbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycy5HcmVla0dvZEdvZGRlc3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworcHVibGljIGNsYXNzIFRlc3RFbnVtQ29udGFpbmVycyBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtQ29udGFpbmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBHb2RCZWFuIGIxID0gbmV3IEdvZEJlYW4oKTsKKyAgICAgICAgYjEuYWRkVG9Hb2RkZXNzKEdyZWVrR29kR29kZGVzcy5IRVJBKTsKKyAgICAgICAgYjEuZ2V0R29kZGVzcygpLmFkZChHcmVla0dvZEdvZGRlc3MuQVBIUk9ESVRFKTsKKyAgICAgICAgYjEucHV0VG9Qb3dlcihHcmVla0dvZEdvZGRlc3MuWkVVUywgMTAwMCk7CisgICAgICAgIGIxLmdldFBvd2VyKCkucHV0KEdyZWVrR29kR29kZGVzcy5IRVJBLCAzMzMpOworICAgICAgICBiMS5wdXRUb0J5QWxpYXMoIk1yLiBaIiwgR3JlZWtHb2RHb2RkZXNzLlpFVVMpOworICAgICAgICBiMS5hZGRUb0ltYWdlcygiQmF0aHMgb2YgQXBocm9kaXRlIDAxLmpwZWciKTsKKworICAgICAgICBmaW5hbCBHb2RCZWFuIGIyID0gbmV3IEdvZEJlYW4oYjEpOworCisgICAgICAgIGZpbmFsIEdvZEJlYW4gYjMgPSBuZXcgR29kQmVhbigpOworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBUU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFRTZXJpYWxpemVyKCk7CisgICAgICAgICAgICBmaW5hbCBURGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciA9IG5ldyBURGVzZXJpYWxpemVyKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGIxKTsKKyAgICAgICAgICAgIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShiMywgYnl0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRHb2RkZXNzKCkgIT0gYjIuZ2V0R29kZGVzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRQb3dlcigpICE9IGIyLmdldFBvd2VyKCkpOworCisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0R29kZGVzcygpICE9IGIzLmdldEdvZGRlc3MoKSk7CisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0UG93ZXIoKSAhPSBiMy5nZXRQb3dlcigpKTsKKworICAgICAgICBmb3IgKEdvZEJlYW4gZWFjaCA6IG5ldyBHb2RCZWFuW117YjEsIGIyLCBiM30pIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRHb2RkZXNzKCkuY29udGFpbnMoR3JlZWtHb2RHb2RkZXNzLkhFUkEpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGVhY2guZ2V0R29kZGVzcygpLmNvbnRhaW5zKEdyZWVrR29kR29kZGVzcy5QT1NFSURPTikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEdvZGRlc3MoKSBpbnN0YW5jZW9mIEVudW1TZXQpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwMDApLCBlYWNoLmdldFBvd2VyKCkuZ2V0KEdyZWVrR29kR29kZGVzcy5aRVVTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDMzMyksIGVhY2guZ2V0UG93ZXIoKS5nZXQoR3JlZWtHb2RHb2RkZXNzLkhFUkEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRQb3dlcigpIGluc3RhbmNlb2YgRW51bU1hcCk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRCeUFsaWFzKCkgaW5zdGFuY2VvZiBIYXNoTWFwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRJbWFnZXMoKSBpbnN0YW5jZW9mIEhhc2hTZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVudW1Db25zdGFudHMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygibGlnaHRuaW5nIGJvbHQiLCBFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQVRUUklCVVRFUy5nZXQoR3JlZWtHb2RHb2RkZXNzLlpFVVMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQVRUUklCVVRFUyBpbnN0YW5jZW9mIEVudW1NYXApOworCisgICAgICAgIGFzc2VydFRydWUoRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkJFQVVUWS5jb250YWlucyhHcmVla0dvZEdvZGRlc3MuQVBIUk9ESVRFKSk7CisgICAgICAgIGFzc2VydFRydWUoRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkJFQVVUWSBpbnN0YW5jZW9mIEVudW1TZXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RnVsbENhbWVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5ODg5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuZnVsbGNhbWVsLk9uZU9mRWFjaFpaOworaW1wb3J0IHRocmlmdC50ZXN0LmZ1bGxjYW1lbC5VbmRlcnNjb3JlU3J2OworCisvLyBTYW5pdHkgY2hlY2sgZm9yIHRoZSBjb2RlIGdlbmVyYXRlZCBieSAnZnVsbGNhbWVsJy4KKy8vCitwdWJsaWMgY2xhc3MgVGVzdEZ1bGxDYW1lbCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0Q2FtZWxDYXNlU3ludGF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVFNlcmlhbGl6ZXIgICBiaW5hcnlTZXJpYWxpemVyICAgPSBuZXcgICBUU2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgVERlc2VyaWFsaXplciBiaW5hcnlEZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisKKyAgICBPbmVPZkVhY2haWiBvYmogPSBuZXcgT25lT2ZFYWNoWlooKTsKKyAgICBvYmouc2V0QUJpdGUoKGJ5dGUpIDB4YWUpOworICAgIG9iai5zZXRJbUZhbHNlKHRydWUpOworICAgIGJ5dGVbXSBzZXJCeXRlcyA9IGJpbmFyeVNlcmlhbGl6ZXIuc2VyaWFsaXplKG9iaik7CisgICAgYmluYXJ5RGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKG9iaiwgc2VyQnl0ZXMpOworICAgIGFzc2VydFRydWUoIG9iai5nZXRBQml0ZSgpID09IChieXRlKSAweGFlICk7CisgICAgYXNzZXJ0VHJ1ZSggb2JqLmlzSW1GYWxzZSgpID09IHRydWUgKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDYW1lbENhc2VScGNNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVW5kZXJzY29yZVNydi5JZmFjZSBzcnYgPSBuZXcgVW5kZXJzY29yZVNydi5JZmFjZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGxvbmcgc29tZVJwY0NhbGwoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIDFsOworICAgICAgfQorICAgIH07CisgICAgYXNzZXJ0VHJ1ZSgxbCA9PSBzcnYuc29tZVJwY0NhbGwoInRlc3QiKSk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NzZjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgcHJpdmF0ZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXA7CisgIHByaXZhdGUgVFByb3RvY29sIGlwcm90OworICBwcml2YXRlIFRQcm90b2NvbCBvcHJvdDsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgaXByb3QgPSBtb2NrKFRQcm90b2NvbC5jbGFzcyk7CisgICAgb3Byb3QgPSBtb2NrKFRQcm90b2NvbC5jbGFzcyk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IFRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ01lc3NhZ2VUeXBlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4gKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoInNlcnZpY2U6ZnVuYyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgNDIpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IFRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgIH0KKworICBzdGF0aWMgY2xhc3MgU3R1YlByb2Nlc3NvciBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBUTWVzc2FnZSBtc2cgPSBpbi5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICBpZiAoISJmdW5jIi5lcXVhbHMobXNnLm5hbWUpIHx8IG1zZy50eXBlIT1UTWVzc2FnZVR5cGUuQ0FMTCB8fCBtc2cuc2VxaWQhPTQyKSB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJpbmNvcnJlY3QgcGFyYW1ldGVycyIpOworICAgICAgfQorICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgiZnVuYyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgNDIpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RFeGlzdGluZ1NlcnZpY2UoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd2hlbihpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJzZXJ2aWNlOmZ1bmMiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgNDIpKTsKKyAgICBtcC5yZWdpc3RlclByb2Nlc3Nvcigic2VydmljZSIsIG5ldyBTdHViUHJvY2Vzc29yKCkpOworICAgIG1wLnByb2Nlc3MoaXByb3QsIG9wcm90KTsKKyAgICB2ZXJpZnkob3Byb3QpLndyaXRlTWVzc2FnZUJlZ2luKGFueShUTWVzc2FnZS5jbGFzcykpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgiZnVuYyIsIFRNZXNzYWdlVHlwZS5DQUxMLCA0MikpOworICAgIG1wLnJlZ2lzdGVyRGVmYXVsdChuZXcgU3R1YlByb2Nlc3NvcigpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgICAgdmVyaWZ5KG9wcm90KS53cml0ZU1lc3NhZ2VCZWdpbihhbnkoVE1lc3NhZ2UuY2xhc3MpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RPcHRpb25UeXBlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RPcHRpb25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwMjg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvblR5cGUuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uOworCisvLyBUZXN0cyBhbmQgZG9jdW1lbnRzIGJlaGF2aW9yIGZvciB0aGUgIk9wdGlvbjxUPiIgdHlwZQorcHVibGljIGNsYXNzIFRlc3RPcHRpb25UeXBlIGV4dGVuZHMgVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RTb21lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lID0gIkNodWNrIE5vcnJpcyI7CisgICAgICAgIE9wdGlvbjxTdHJpbmc+IG9wdGlvbiA9IE9wdGlvbi5mcm9tTnVsbGFibGUobmFtZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShvcHRpb24gaW5zdGFuY2VvZiBPcHRpb24uU29tZSk7CisgICAgICAgIGFzc2VydFRydWUob3B0aW9uLmlzRGVmaW5lZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTb21lKENodWNrIE5vcnJpcykiLCBvcHRpb24udG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcHRpb24ub3IoImRlZmF1bHQgdmFsdWUiKSwgIkNodWNrIE5vcnJpcyIpOworICAgICAgICBhc3NlcnRFcXVhbHMob3B0aW9uLmdldCgpLCJDaHVjayBOb3JyaXMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIE9wdGlvbjxTdHJpbmc+IG9wdGlvbiA9IE9wdGlvbi5mcm9tTnVsbGFibGUobmFtZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShvcHRpb24gaW5zdGFuY2VvZiBPcHRpb24uTm9uZSk7CisgICAgICAgIGFzc2VydEZhbHNlKG9wdGlvbi5pc0RlZmluZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTm9uZSIsIG9wdGlvbi50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbi5vcigiZGVmYXVsdCB2YWx1ZSIpLCAiZGVmYXVsdCB2YWx1ZSIpOworICAgICAgICAvLyBFeHBlY3QgZXhjZXB0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvcHRpb24uZ2V0KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIGdvdCBubyBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgZ290IHNvbWUgb3RoZXIgZXhjZXB0aW9uOiAiK2V4LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ha2VTb21lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9wdGlvbjxTdHJpbmc+IHNvbWUgPSBPcHRpb24uc29tZSgid2VlIik7CisgICAgICAgIGFzc2VydFRydWUoc29tZSBpbnN0YW5jZW9mIE9wdGlvbi5Tb21lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFrZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT3B0aW9uPEludGVnZXI+IG5vbmUgPSBPcHRpb24ubm9uZSgpOworICAgICAgICBhc3NlcnRUcnVlKG5vbmUgaW5zdGFuY2VvZiBPcHRpb24uTm9uZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uYWxzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RPcHRpb25hbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTU5MWVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uYWxzLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuT3B0NDsKK2ltcG9ydCB0aHJpZnQudGVzdC5PcHQzMDsKK2ltcG9ydCB0aHJpZnQudGVzdC5PcHQ2NDsKK2ltcG9ydCB0aHJpZnQudGVzdC5PcHQ4MDsKKworLy8gRXhlcmNpc2VzIHRoZSBpc1NldCBtZXRob2RzIHVzaW5nIHN0cnVjdHMgZnJvbSBmcm9tIE1hbnlPcHRpb25hbHMudGhyaWZ0CitwdWJsaWMgY2xhc3MgVGVzdE9wdGlvbmFscyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdEVuY29kaW5nVXRpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTB4OCwgRW5jb2RpbmdVdGlscy5zZXRCaXQoKHNob3J0KTAsIDMsIHRydWUpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTAsIEVuY29kaW5nVXRpbHMuc2V0Qml0KChzaG9ydCkweDgsIDMsIGZhbHNlKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIEVuY29kaW5nVXRpbHMudGVzdEJpdCgoc2hvcnQpMHg4LCAzKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoKHNob3J0KTB4OCwgNCkpOworCisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydClTaG9ydC5NSU5fVkFMVUUsIEVuY29kaW5nVXRpbHMuc2V0Qml0KChzaG9ydCkwLCAxNSwgdHJ1ZSkpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMCwgRW5jb2RpbmdVdGlscy5zZXRCaXQoKHNob3J0KVNob3J0Lk1JTl9WQUxVRSwgMTUsIGZhbHNlKSk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIEVuY29kaW5nVXRpbHMudGVzdEJpdChTaG9ydC5NSU5fVkFMVUUsIDE1KSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoU2hvcnQuTUlOX1ZBTFVFLCAxNCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9wdDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPcHQ0IHggPSBuZXcgT3B0NCgpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjEoKSk7CisgICAgeC5zZXREZWYxKDMpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYyKCkpOworCisgICAgT3B0NCBjb3B5ID0gbmV3IE9wdDQoeCk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvcHkuaXNTZXREZWYxKCkpOworICAgIGNvcHkudW5zZXREZWYxKCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb3B5LmlzU2V0RGVmMSgpKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgeC5pc1NldERlZjEoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3B0MzAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPcHQzMCB4ID0gbmV3IE9wdDMwKCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICB4LnNldERlZjEoMyk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWYxKCkpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjIoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3B0NjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBPcHQ2NCB4ID0gbmV3IE9wdDY0KCk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMSgpKTsKKyAgICB4LnNldERlZjEoMyk7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWYxKCkpOworICAgIGFzc2VydEVxdWFscyhmYWxzZSwgeC5pc1NldERlZjIoKSk7CisgICAgeC5zZXREZWY2NCgyMik7CisgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHguaXNTZXREZWY2NCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWY2MygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPcHQ4MCgpIHRocm93cyBFeGNlcHRpb24geworICAgIE9wdDgwIHggPSBuZXcgT3B0ODAoKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHguaXNTZXREZWYxKCkpOworICAgIHguc2V0RGVmMSgzKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgeC5pc1NldERlZjEoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB4LmlzU2V0RGVmMigpKTsKKworICAgIE9wdDgwIGNvcHkgPSBuZXcgT3B0ODAoeCk7CisgICAgY29weS51bnNldERlZjEoKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNvcHkuaXNTZXREZWYxKCkpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB4LmlzU2V0RGVmMSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MWZlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHRocmlmdC50ZXN0LkRvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHM7CisKK3B1YmxpYyBjbGFzcyBUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEVQU0lMT04gPSAwLjAwMDAwMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgPQorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGRvdWJsZSBjb25zdGFudCBnZW5lcmF0ZWQgYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCA9CisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgbGlzdCBpdGVtIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTID0KKyAgICAgICAgInRoZSByZW5kZXJlZCB2YXJpYWJsZSB3aXRoIG5hbWUgJXMgaXMgbm90IG9mIGRvdWJsZSB0eXBlIjsKKworICAgIC8vIHRvIG1ha2Ugc3VyZSBsaXN0cyBjb250YWluaW5nIGRvdWJsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyZWREb3VibGVMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGRvdWJsZVtdIEVYUEVDVEVEX0xJU1QgPQorICAgICAgICAgICAgezFkLC0xMDBkLDEwMGQsOTIyMzM3MjAzNjg1NDc3NTgwN2QsLTkyMjMzNzIwMzY4NTQ3NzU4MDdkLDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsCisgICAgICAgICAgICAgLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDN9OworICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfTElTVC5sZW5ndGgsIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVYUEVDVEVEX0xJU1QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCwKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNURURfTElTVFtpXSwKKyAgICAgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULmdldChpKSksCisgICAgICAgICAgICAgICAgRVhQRUNURURfTElTVFtpXSwgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULmdldChpKSwgRVBTSUxPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgcHVibGljIHZvaWQgdGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMS4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMTsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwODsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgLy9hc3NlcnRUcnVlKAorICAgICAgICAvLyAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCIpLAorICAgICAgICAvLyAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICAvL2Fzc2VydFRydWUoCisgICAgICAgIC8vICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUIiksCisgICAgICAgIC8vICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRhYmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKKworaW1wb3J0IHRocmlmdC50ZXN0LlJldXNlOworCisvLyBUZXN0cyByZXVzaW5nIG9iamVjdHMgZm9yIGRlc2VyaWFsaXphdGlvbi4KKy8vCitwdWJsaWMgY2xhc3MgVGVzdFJldXNlIGV4dGVuZHMgVGVzdFN0cnVjdCB7CisKKyAgcHVibGljIHZvaWQgdGVzdFJldXNlT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVFNlcmlhbGl6ZXIgICBiaW5hcnlTZXJpYWxpemVyICAgPSBuZXcgICBUU2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgVERlc2VyaWFsaXplciBiaW5hcnlEZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisKKyAgICBSZXVzZSBydTEgPSBuZXcgUmV1c2UoKTsKKyAgICBIYXNoU2V0PFN0cmluZz4gaHMxID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIGJ5dGVbXSBzZXJCeXRlczsgICAgCisgICAgU3RyaW5nIHN0MSA9IG5ldyBTdHJpbmcoInN0cmluZzEiKTsKKyAgICBTdHJpbmcgc3QyID0gbmV3IFN0cmluZygic3RyaW5nMiIpOworCisgICAgcnUxLnNldFZhbDEoMTEpOworICAgIHJ1MS5zZXRWYWwyKGhzMSk7CisgICAgcnUxLmFkZFRvVmFsMihzdDEpOworICAgIAorICAgIHNlckJ5dGVzID0gYmluYXJ5U2VyaWFsaXplci5zZXJpYWxpemUocnUxKTsKKworICAgIC8vIHVwZGF0ZSBoYXNoIHNldCBhZnRlciBzZXJpYWxpemF0aW9uCisgICAgaHMxLmFkZChzdDIpOworCisgICAgYmluYXJ5RGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKHJ1MSwgc2VyQnl0ZXMpOworICAgCisgICAgYXNzZXJ0VHJ1ZSggcnUxLmdldFZhbDIoKSA9PSBoczEgKTsKKyAgICBhc3NlcnRUcnVlKCBoczEuc2l6ZSgpID09IDIgKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODMxZTUuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U2hvcnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2hvcnRTdGFjayBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9UUklBTFMgPSA1OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1JFUFMgPSAxMDAwMDAwMDsKLQotICBwdWJsaWMgdm9pZCB0ZXN0T3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMTApOwotICAgIHMucHVzaCgoc2hvcnQpMTApOwotICAgIHMucHVzaCgoc2hvcnQpMTEpOwotICAgIHMucHVzaCgoc2hvcnQpMTIpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wb3AoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMSwgcy5wb3AoKSk7Ci0gICAgcy5wdXNoKChzaG9ydCk0MCk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpNDAsIHMucG9wKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEwLCBzLnBvcCgpKTsKLSAgICB0cnkgewotICAgICAgcy5wZWVrKCk7Ci0gICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyB5YXkKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgcy5wb3AoKTsKLSAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHlheQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHcm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZm9yIChpbnQgdHJpYWwgPSAwOyB0cmlhbCA8IE5VTV9UUklBTFM7IHRyaWFsKyspIHsKLSAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEwKTsKLSAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgewotICAgICAgICBzLnB1c2goKHNob3J0KTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTExKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMTEpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMjEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMTExKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCk1KTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgIH0KLSAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNob3J0U3RhY2s6ICIgKyAoZW5kLXN0YXJ0KSk7Ci0KLSAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTdGFjazxTaG9ydD4gc3RkU3RhY2sgPSBuZXcgU3RhY2s8U2hvcnQ+KCk7Ci0gICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBOVU1fUkVQUzsgcmVwKyspIHsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTExKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTExKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMik7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMTEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMjExMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCk1KTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgfQotICAgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWx0LWluIHN0YWNrOiAiICsgKGVuZC1zdGFydCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQppbmRleCA3NTU1MzRkLi4zMzc5ZWQxIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zOSwzMiArNDAsMTUgQEAKIGltcG9ydCB0aHJpZnQudGVzdC5DcmF6eU5lc3Rpbmc7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuSG9seU1vbGV5OwogaW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OworaW1wb3J0IHRocmlmdC50ZXN0LkphdmFUZXN0SGVscGVyOwogaW1wb3J0IHRocmlmdC50ZXN0Lk5lc3Rpbmc7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKIGltcG9ydCB0aHJpZnQudGVzdC5PbmVPZkVhY2g7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU3RydWN0QTsKK2ltcG9ydCB0aHJpZnQudGVzdC5TdHJ1Y3RCOwogaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDsKIAogcHVibGljIGNsYXNzIFRlc3RTdHJ1Y3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHVibGljIHN0YXRpYyBPYmplY3QgZGVlcENvcHlWaWFTZXJpYWxpemF0aW9uKE9iamVjdCBvbGRPYmopIHRocm93cyBFeGNlcHRpb24gewotICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBudWxsOwotICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPQotICAgICAgICBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJvcyk7Ci0gICAgICBvb3Mud3JpdGVPYmplY3Qob2xkT2JqKTsKLSAgICAgIG9vcy5mbHVzaCgpOwotICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0KLSAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiaXMpOwotICAgICAgcmV0dXJuIG9pcy5yZWFkT2JqZWN0KCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG9vcy5jbG9zZSgpOwotICAgICAgb2lzLmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KICAgcHVibGljIHZvaWQgdGVzdElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgVFNlcmlhbGl6ZXIgICBiaW5hcnlTZXJpYWxpemVyICAgPSBuZXcgICBUU2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CiAgICAgVERlc2VyaWFsaXplciBiaW5hcnlEZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CkBAIC03Miw3ICs1Niw3IEBACiAgICAgT25lT2ZFYWNoIG9vZSA9IEZpeHR1cmVzLm9uZU9mRWFjaDsKIAogICAgIE5lc3RpbmcgbiA9IG5ldyBOZXN0aW5nKCk7Ci0gICAgbi5teV9vb2UgPSAoT25lT2ZFYWNoKWRlZXBDb3B5VmlhU2VyaWFsaXphdGlvbihvb2UpOworICAgIG4ubXlfb29lID0gb29lOwogICAgIG4ubXlfb29lLmludGVnZXIxNiA9IDE2OwogICAgIG4ubXlfb29lLmludGVnZXIzMiA9IDMyOwogICAgIG4ubXlfb29lLmludGVnZXI2NCA9IDY0OwpAQCAtMTI3LDEwICsxMTEsMTAgQEAKICAgICBhc3NlcnRFcXVhbHMoaG1Db3B5LCBobUNvcHkyKTsKIAogICAgIC8vIGNoYW5nZSBiaW5hcnkgdmFsdWUgaW4gb3JpZ2luYWwgb2JqZWN0Ci0gICAgaG0uYmlnLmdldCgwKS5iYXNlNjRbMF0rKzsKKyAgICBobS5iaWcuZ2V0KDApLmJhc2U2NC5hcnJheSgpWzBdKys7CiAgICAgLy8gbWFrZSBzdXJlIHRoZSBjaGFuZ2UgZGlkbid0IHByb3BhZ2F0ZSB0byB0aGUgY29waWVkIG9iamVjdAogICAgIGFzc2VydEZhbHNlKGhtLmVxdWFscyhobUNvcHkyKSk7Ci0gICAgaG0uYmlnLmdldCgwKS5iYXNlNjRbMF0tLTsgLy8gdW5kbyBjaGFuZ2UKKyAgICBobS5iaWcuZ2V0KDApLmJhc2U2NC5hcnJheSgpWzBdLS07IC8vIHVuZG8gY2hhbmdlCiAKICAgICBobUNvcHkyLmJvbmtzLmdldCgidHdvIikuZ2V0KDEpLm1lc3NhZ2UgPSAiV2hhdCBlbHNlPyI7CiAKQEAgLTIxOCwyMyArMjAyLDI4IEBACiAgICAgTWFwPENyYXp5TmVzdGluZy5fRmllbGRzLCBGaWVsZE1ldGFEYXRhPiBtZE1hcCA9IENyYXp5TmVzdGluZy5tZXRhRGF0YU1hcDsKIAogICAgIC8vIENoZWNrIGZvciBzdHJ1Y3QgZmllbGRzIGV4aXN0ZW5jZQotICAgIGFzc2VydEVxdWFscygzLCBtZE1hcC5zaXplKCkpOworICAgIGFzc2VydEVxdWFscyg0LCBtZE1hcC5zaXplKCkpOwogICAgIGFzc2VydFRydWUobWRNYXAuY29udGFpbnNLZXkoQ3JhenlOZXN0aW5nLl9GaWVsZHMuU0VUX0ZJRUxEKSk7CiAgICAgYXNzZXJ0VHJ1ZShtZE1hcC5jb250YWluc0tleShDcmF6eU5lc3RpbmcuX0ZpZWxkcy5MSVNUX0ZJRUxEKSk7CiAgICAgYXNzZXJ0VHJ1ZShtZE1hcC5jb250YWluc0tleShDcmF6eU5lc3RpbmcuX0ZpZWxkcy5TVFJJTkdfRklFTEQpKTsKKyAgICBhc3NlcnRUcnVlKG1kTWFwLmNvbnRhaW5zS2V5KENyYXp5TmVzdGluZy5fRmllbGRzLkJJTkFSWV9GSUVMRCkpOwogCiAgICAgLy8gQ2hlY2sgZm9yIHN0cnVjdCBmaWVsZHMgY29udGVudHMKICAgICBhc3NlcnRFcXVhbHMoInN0cmluZ19maWVsZCIsIG1kTWFwLmdldChDcmF6eU5lc3RpbmcuX0ZpZWxkcy5TVFJJTkdfRklFTEQpLmZpZWxkTmFtZSk7CiAgICAgYXNzZXJ0RXF1YWxzKCJsaXN0X2ZpZWxkIiwgbWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLkxJU1RfRklFTEQpLmZpZWxkTmFtZSk7CiAgICAgYXNzZXJ0RXF1YWxzKCJzZXRfZmllbGQiLCBtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuU0VUX0ZJRUxEKS5maWVsZE5hbWUpOworICAgIGFzc2VydEVxdWFscygiYmluYXJ5X2ZpZWxkIiwgbWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLkJJTkFSWV9GSUVMRCkuZmllbGROYW1lKTsKIAogICAgIGFzc2VydEVxdWFscyhURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgbWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLlNUUklOR19GSUVMRCkucmVxdWlyZW1lbnRUeXBlKTsKICAgICBhc3NlcnRFcXVhbHMoVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCBtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuTElTVF9GSUVMRCkucmVxdWlyZW1lbnRUeXBlKTsKICAgICBhc3NlcnRFcXVhbHMoVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCBtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuU0VUX0ZJRUxEKS5yZXF1aXJlbWVudFR5cGUpOwogCiAgICAgYXNzZXJ0RXF1YWxzKFRUeXBlLlNUUklORywgbWRNYXAuZ2V0KENyYXp5TmVzdGluZy5fRmllbGRzLlNUUklOR19GSUVMRCkudmFsdWVNZXRhRGF0YS50eXBlKTsKKyAgICBhc3NlcnRGYWxzZShtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuU1RSSU5HX0ZJRUxEKS52YWx1ZU1ldGFEYXRhLmlzQmluYXJ5KCkpOwogICAgIGFzc2VydEVxdWFscyhUVHlwZS5MSVNULCBtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuTElTVF9GSUVMRCkudmFsdWVNZXRhRGF0YS50eXBlKTsKICAgICBhc3NlcnRFcXVhbHMoVFR5cGUuU0VULCBtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuU0VUX0ZJRUxEKS52YWx1ZU1ldGFEYXRhLnR5cGUpOworICAgIGFzc2VydEVxdWFscyhUVHlwZS5TVFJJTkcsIG1kTWFwLmdldChDcmF6eU5lc3RpbmcuX0ZpZWxkcy5CSU5BUllfRklFTEQpLnZhbHVlTWV0YURhdGEudHlwZSk7CisgICAgYXNzZXJ0VHJ1ZShtZE1hcC5nZXQoQ3JhenlOZXN0aW5nLl9GaWVsZHMuQklOQVJZX0ZJRUxEKS52YWx1ZU1ldGFEYXRhLmlzQmluYXJ5KCkpOwogCiAgICAgLy8gQ2hlY2sgbmVzdGVkIHN0cnVjdHVyZXMKICAgICBhc3NlcnRUcnVlKG1kTWFwLmdldChDcmF6eU5lc3RpbmcuX0ZpZWxkcy5MSVNUX0ZJRUxEKS52YWx1ZU1ldGFEYXRhLmlzQ29udGFpbmVyKCkpOwpAQCAtMjYxLDQgKzI1MCwxNDcgQEAKICAgICBhc3NlcnRUcnVlKHZtZC52YWx1ZU1ldGFEYXRhLmlzVHlwZWRlZigpKTsKICAgICBhc3NlcnRGYWxzZSh2bWQua2V5TWV0YURhdGEuaXNUeXBlZGVmKCkpOwogICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSmF2YVRlc3RIZWxwZXIgb2JqZWN0ID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CisgICAgb2JqZWN0LnJlcV9pbnQgPSAwOworICAgIG9iamVjdC5yZXFfb2JqID0gIiI7CisKKyAgICBvYmplY3QucmVxX2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdIHsKKyAgICAgIDAsIC0xLCAyLCAtMywgNCwgLTUsIDYsIC03LCA4LCAtOSwgMTAsIC0xMSwgMTIsIC0xMywgMTQsIC0xNSwKKyAgICAgIDE2LCAtMTcsIDE4LCAtMTksIDIwLCAtMjEsIDIyLCAtMjMsIDI0LCAtMjUsIDI2LCAtMjcsIDI4LCAtMjksCisgICAgICAzMCwgLTMxLCAzMiwgLTMzLCAzNCwgLTM1LCAzNiwgLTM3LCAzOCwgLTM5LCA0MCwgLTQxLCA0MiwgLTQzLCA0NCwKKyAgICAgIC00NSwgNDYsIC00NywgNDgsIC00OSwgNTAsIC01MSwgNTIsIC01MywgNTQsIC01NSwgNTYsIC01NywgNTgsIC01OSwKKyAgICAgIDYwLCAtNjEsIDYyLCAtNjMsIDY0LCAtNjUsIDY2LCAtNjcsIDY4LCAtNjksIDcwLCAtNzEsIDcyLCAtNzMsIDc0LAorICAgICAgLTc1LCA3NiwgLTc3LCA3OCwgLTc5LCA4MCwgLTgxLCA4MiwgLTgzLCA4NCwgLTg1LCA4NiwgLTg3LCA4OCwgLTg5LAorICAgICAgOTAsIC05MSwgOTIsIC05MywgOTQsIC05NSwgOTYsIC05NywgOTgsIC05OSwgMTAwLCAtMTAxLCAxMDIsIC0xMDMsCisgICAgICAxMDQsIC0xMDUsIDEwNiwgLTEwNywgMTA4LCAtMTA5LCAxMTAsIC0xMTEsIDExMiwgLTExMywgMTE0LCAtMTE1LAorICAgICAgMTE2LCAtMTE3LCAxMTgsIC0xMTksIDEyMCwgLTEyMSwgMTIyLCAtMTIzLCAxMjQsIC0xMjUsIDEyNiwgLTEyNywKKyAgICB9KTsKKworICAgIGFzc2VydEVxdWFscygiSmF2YVRlc3RIZWxwZXIocmVxX2ludDowLCByZXFfb2JqOiwgcmVxX2JpbjoiKworICAgICAgICAiMDAgRkYgMDIgRkQgMDQgRkIgMDYgRjkgMDggRjcgMEEgRjUgMEMgRjMgMEUgRjEgMTAgRUYgMTIgRUQgMTQgIisKKyAgICAgICAgIkVCIDE2IEU5IDE4IEU3IDFBIEU1IDFDIEUzIDFFIEUxIDIwIERGIDIyIEREIDI0IERCIDI2IEQ5IDI4IEQ3ICIrCisgICAgICAgICIyQSBENSAyQyBEMyAyRSBEMSAzMCBDRiAzMiBDRCAzNCBDQiAzNiBDOSAzOCBDNyAzQSBDNSAzQyBDMyAzRSAiKworICAgICAgICAiQzEgNDAgQkYgNDIgQkQgNDQgQkIgNDYgQjkgNDggQjcgNEEgQjUgNEMgQjMgNEUgQjEgNTAgQUYgNTIgQUQgIisKKyAgICAgICAgIjU0IEFCIDU2IEE5IDU4IEE3IDVBIEE1IDVDIEEzIDVFIEExIDYwIDlGIDYyIDlEIDY0IDlCIDY2IDk5IDY4ICIrCisgICAgICAgICI5NyA2QSA5NSA2QyA5MyA2RSA5MSA3MCA4RiA3MiA4RCA3NCA4QiA3NiA4OSA3OCA4NyA3QSA4NSA3QyA4MyAiKworICAgICAgICAiN0UgODEpIiwKKyAgICAgICAgb2JqZWN0LnRvU3RyaW5nKCkpOworIAorICAgIG9iamVjdC5yZXFfYmluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10geworICAgICAgMCwgLTEsIDIsIC0zLCA0LCAtNSwgNiwgLTcsIDgsIC05LCAxMCwgLTExLCAxMiwgLTEzLCAxNCwgLTE1LAorICAgICAgMTYsIC0xNywgMTgsIC0xOSwgMjAsIC0yMSwgMjIsIC0yMywgMjQsIC0yNSwgMjYsIC0yNywgMjgsIC0yOSwKKyAgICAgIDMwLCAtMzEsIDMyLCAtMzMsIDM0LCAtMzUsIDM2LCAtMzcsIDM4LCAtMzksIDQwLCAtNDEsIDQyLCAtNDMsIDQ0LAorICAgICAgLTQ1LCA0NiwgLTQ3LCA0OCwgLTQ5LCA1MCwgLTUxLCA1MiwgLTUzLCA1NCwgLTU1LCA1NiwgLTU3LCA1OCwgLTU5LAorICAgICAgNjAsIC02MSwgNjIsIC02MywgNjQsIC02NSwgNjYsIC02NywgNjgsIC02OSwgNzAsIC03MSwgNzIsIC03MywgNzQsCisgICAgICAtNzUsIDc2LCAtNzcsIDc4LCAtNzksIDgwLCAtODEsIDgyLCAtODMsIDg0LCAtODUsIDg2LCAtODcsIDg4LCAtODksCisgICAgICA5MCwgLTkxLCA5MiwgLTkzLCA5NCwgLTk1LCA5NiwgLTk3LCA5OCwgLTk5LCAxMDAsIC0xMDEsIDEwMiwgLTEwMywKKyAgICAgIDEwNCwgLTEwNSwgMTA2LCAtMTA3LCAxMDgsIC0xMDksIDExMCwgLTExMSwgMTEyLCAtMTEzLCAxMTQsIC0xMTUsCisgICAgICAxMTYsIC0xMTcsIDExOCwgLTExOSwgMTIwLCAtMTIxLCAxMjIsIC0xMjMsIDEyNCwgLTEyNSwgMTI2LCAtMTI3LAorICAgICAgMCwKKyAgICB9KTsKKworICAgIGFzc2VydEVxdWFscygiSmF2YVRlc3RIZWxwZXIocmVxX2ludDowLCByZXFfb2JqOiwgcmVxX2JpbjoiKworICAgICAgICAiMDAgRkYgMDIgRkQgMDQgRkIgMDYgRjkgMDggRjcgMEEgRjUgMEMgRjMgMEUgRjEgMTAgRUYgMTIgRUQgMTQgIisKKyAgICAgICAgIkVCIDE2IEU5IDE4IEU3IDFBIEU1IDFDIEUzIDFFIEUxIDIwIERGIDIyIEREIDI0IERCIDI2IEQ5IDI4IEQ3ICIrCisgICAgICAgICIyQSBENSAyQyBEMyAyRSBEMSAzMCBDRiAzMiBDRCAzNCBDQiAzNiBDOSAzOCBDNyAzQSBDNSAzQyBDMyAzRSAiKworICAgICAgICAiQzEgNDAgQkYgNDIgQkQgNDQgQkIgNDYgQjkgNDggQjcgNEEgQjUgNEMgQjMgNEUgQjEgNTAgQUYgNTIgQUQgIisKKyAgICAgICAgIjU0IEFCIDU2IEE5IDU4IEE3IDVBIEE1IDVDIEEzIDVFIEExIDYwIDlGIDYyIDlEIDY0IDlCIDY2IDk5IDY4ICIrCisgICAgICAgICI5NyA2QSA5NSA2QyA5MyA2RSA5MSA3MCA4RiA3MiA4RCA3NCA4QiA3NiA4OSA3OCA4NyA3QSA4NSA3QyA4MyAiKworICAgICAgICAiN0UgODEuLi4pIiwKKyAgICAgICAgb2JqZWN0LnRvU3RyaW5nKCkpOworCisgICAgb2JqZWN0LnJlcV9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXSB7fSk7CisgICAgb2JqZWN0LnNldE9wdF9iaW5Jc1NldCh0cnVlKTsKKworICAgIGFzc2VydEVxdWFscygiSmF2YVRlc3RIZWxwZXIocmVxX2ludDowLCByZXFfb2JqOiwgcmVxX2JpbjopIiwgCisgICAgICAgIG9iamVjdC50b1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlFcXVhbHMoYnl0ZVtdIGV4cGVjdGVkLCBieXRlW10gYWN0dWFsKSB7CisgICAgaWYgKCFqYXZhLnV0aWwuQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSkgeworICAgICAgZmFpbCgiRXhwZWN0ZWQgYnl0ZSBhcnJheSBkaWQgbm90IG1hdGNoIGFjdHVhbC4iKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXNCdWZmZXJGZWF0dXJlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIAorICAgIGZpbmFsIFN0cmluZyB0ZXN0U3RyaW5nID0gInRlc3RCeXRlc0J1ZmZlckZlYXR1cmVzIjsKKyAgICBmaW5hbCBKYXZhVGVzdEhlbHBlciBvID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CisKKyAgICBvLnNldFJlcV9iaW4oKEJ5dGVCdWZmZXIpbnVsbCk7CisgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldFJlcV9iaW4oQnl0ZUJ1ZmZlci53cmFwKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRSZXFfYmluKChieXRlW10pbnVsbCk7CisgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldFJlcV9iaW4odGVzdFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIG51bGwpOworICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgdGVzdFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIG51bGwpOworICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgQnl0ZUJ1ZmZlci53cmFwKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEphdmFTZXJpYWxpemFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKKyAgICAKKyAgICBPbmVPZkVhY2ggb29lID0gRml4dHVyZXMub25lT2ZFYWNoOworCisgICAgLy8gU2VyaWFsaXplIG9vZSB0aGUgSmF2YSB3YXkuLi4KKyAgICBvb3Mud3JpdGVPYmplY3Qob29lKTsKKyAgICBieXRlW10gc2VyaWFsaXplZCA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKworICAgIC8vIEF0dGVtcHQgdG8gZGVzZXJpYWxpemUgaXQKKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlcmlhbGl6ZWQpOworICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKKyAgICBPbmVPZkVhY2ggb29lMiA9IChPbmVPZkVhY2gpIG9pcy5yZWFkT2JqZWN0KCk7CisKKyAgICBhc3NlcnRFcXVhbHMob29lLCBvb2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTdWJTdHJ1Y3RWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RydWN0QSB2YWxpZCA9IG5ldyBTdHJ1Y3RBKCJ2YWxpZCIpOworICAgIFN0cnVjdEEgaW52YWxpZCA9IG5ldyBTdHJ1Y3RBKCk7CisKKyAgICBTdHJ1Y3RCIGIgPSBuZXcgU3RydWN0QigpOworICAgIHRyeSB7CisgICAgICBiLnZhbGlkYXRlKCk7CisgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKworICAgIGIgPSBuZXcgU3RydWN0QigpLnNldEFiKHZhbGlkKTsKKyAgICBiLnZhbGlkYXRlKCk7CisKKyAgICBiID0gbmV3IFN0cnVjdEIoKS5zZXRBYihpbnZhbGlkKTsKKyAgICB0cnkgeworICAgICAgYi52YWxpZGF0ZSgpOworICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgeworICAgICAgLy8gZXhwZWN0ZWQKKyAgICB9CisKKyAgICBiID0gbmV3IFN0cnVjdEIoKS5zZXRBYih2YWxpZCkuc2V0QWEoaW52YWxpZCk7CisgICAgdHJ5IHsKKyAgICAgIGIudmFsaWRhdGUoKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIGV4cGVjdGVkCisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUQmFzZUhlbHBlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VEJhc2VIZWxwZXIuamF2YQppbmRleCA2ZjI0MDkzLi44YjA4NTU1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RUQmFzZUhlbHBlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRCYXNlSGVscGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTEzOSw0ICsxNDAsNzAgQEAKICAgICBiLmFkZChuZXcgYnl0ZVtdeydhJywnYicsICdhJ30pOwogICAgIGFzc2VydFRydWUoVEJhc2VIZWxwZXIuY29tcGFyZVRvKGEsIGIpID4gMCk7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZUJ1ZmZlclRvQnl0ZUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGIxID0gezEwLDksOCw3LDYsNSw0LDMsMiwxLDB9OworICAgIGJ5dGVbXSBiMiA9IFRCYXNlSGVscGVyLmJ5dGVCdWZmZXJUb0J5dGVBcnJheShCeXRlQnVmZmVyLndyYXAoYjEpKTsKKyAgICBhc3NlcnRFcXVhbHMoImIxIGFuZCBiMiBzaG91bGQgYmUgdGhlIGV4YWN0IHNhbWUgYXJyYXkgKGlkZW50aXR5KSBkdWUgdG8gZmFzdCBwYXRoIiwgYjEsIGIyKTsKKworICAgIGJ5dGVbXSBiMyA9IFRCYXNlSGVscGVyLmJ5dGVCdWZmZXJUb0J5dGVBcnJheShCeXRlQnVmZmVyLndyYXAoYjEsIDEsIDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgYjMubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIxLCAxLCAzKSwgQnl0ZUJ1ZmZlci53cmFwKGIzKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmlnaHRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0TnVsbChUQmFzZUhlbHBlci5yaWdodFNpemUobnVsbCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJ5dGVCdWZmZXJUb1N0cmluZygpIHsKKyAgICBieXRlW10gYXJyYXkgPSBuZXcgYnl0ZVtdezEsIDIsIDN9OworICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAoYXJyYXksIDEsIDIpOworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIFRCYXNlSGVscGVyLnRvU3RyaW5nKGJiLCBzYik7CisgICAgYXNzZXJ0RXF1YWxzKCIwMiAwMyIsIHNiLnRvU3RyaW5nKCkpOworICAgIGJiID0gQnl0ZUJ1ZmZlci53cmFwKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOworICAgIGJiLnBvc2l0aW9uKDEpOworICAgIGJiID0gYmIuc2xpY2UoKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgYmIuYXJyYXlPZmZzZXQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIGJiLnBvc2l0aW9uKCkpOworICAgIGFzc2VydEVxdWFscygyLCBiYi5saW1pdCgpKTsKKyAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgVEJhc2VIZWxwZXIudG9TdHJpbmcoYmIsIHNiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjAyIDAzIiwgc2IudG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q29weUJpbmFyeVdpdGhCeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbXXswLCAxLCAyLCAzLCA0LCA1fTsKKyAgICBCeXRlQnVmZmVyIGIgPSBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOworICAgIEJ5dGVCdWZmZXIgYkNvcHkgPSBUQmFzZUhlbHBlci5jb3B5QmluYXJ5KGIpOworICAgIGFzc2VydEVxdWFscyhiLCBiQ29weSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIGIucG9zaXRpb24oKSk7CisKKyAgICBiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCg2KTsKKyAgICBiLnB1dChieXRlcyk7CisgICAgYi5wb3NpdGlvbigwKTsKKyAgICBiQ29weSA9IFRCYXNlSGVscGVyLmNvcHlCaW5hcnkoYik7CisgICAgYXNzZXJ0RXF1YWxzKDYsIGIucmVtYWluaW5nKCkpOworICAgIGFzc2VydEVxdWFscygwLCBiLnBvc2l0aW9uKCkpOworICAgIGFzc2VydEVxdWFscyhiLCBiQ29weSk7CisKKyAgICBiLm1hcmsoKTsKKyAgICBiLmdldCgpOworICAgIGJDb3B5ID0gVEJhc2VIZWxwZXIuY29weUJpbmFyeShiKTsKKyAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzLCAxLCA1KSwgYkNvcHkpOworICAgIGFzc2VydEVxdWFscygxLCBiLnBvc2l0aW9uKCkpOworICAgIGIucmVzZXQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgYi5wb3NpdGlvbigpKTsKKworICAgIGFzc2VydE51bGwoVEJhc2VIZWxwZXIuY29weUJpbmFyeSgoQnl0ZUJ1ZmZlciludWxsKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q29weUJpbmFyeVdpdGhCeXRlQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtdezAsIDEsIDIsIDMsIDQsIDV9OworICAgIGJ5dGVbXSBjb3B5ID0gVEJhc2VIZWxwZXIuY29weUJpbmFyeShieXRlcyk7CisgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChieXRlcyksIEJ5dGVCdWZmZXIud3JhcChjb3B5KSk7CisgICAgYXNzZXJ0Tm90U2FtZShieXRlcywgY29weSk7CisKKyAgICBhc3NlcnROdWxsKFRCYXNlSGVscGVyLmNvcHlCaW5hcnkoKGJ5dGVbXSludWxsKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFREZXNlcmlhbGl6ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFREZXNlcmlhbGl6ZXIuamF2YQppbmRleCA0YmIzZmUyLi5hNGEzNTNkIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RURGVzZXJpYWxpemVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VERlc2VyaWFsaXplci5qYXZhCkBAIC0xOCw2ICsxOCwxMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CkBAIC0yOSw4ICszMyw2IEBACiBpbXBvcnQgdGhyaWZ0LnRlc3QuU3RydWN0V2l0aEFVbmlvbjsKIGltcG9ydCB0aHJpZnQudGVzdC5UZXN0VW5pb247CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KIHB1YmxpYyBjbGFzcyBUZXN0VERlc2VyaWFsaXplciBleHRlbmRzIFRlc3RDYXNlIHsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5W10gUFJPVE9DT0xTID0gbmV3IFRQcm90b2NvbEZhY3RvcnlbXSB7CkBAIC00Myw0MCArNDUsODIgQEAKICAgICAvL1Jvb3Q6U3RydWN0V2l0aEFVbmlvbgogICAgIC8vICAxOlVuaW9uCiAgICAgLy8gICAgMS4zOk9uZU9mRWFjaAotICAgIE9uZU9mRWFjaCBMZXZlbDNPbmVPZkVhY2ggPSBGaXh0dXJlcy5vbmVPZkVhY2g7Ci0gICAgVGVzdFVuaW9uIExldmVsMlRlc3RVbmlvbiA9IG5ldyBUZXN0VW5pb24oVGVzdFVuaW9uLl9GaWVsZHMuU1RSVUNUX0ZJRUxELCBMZXZlbDNPbmVPZkVhY2gpOwotICAgIFN0cnVjdFdpdGhBVW5pb24gTGV2ZWwxU1dVID0gbmV3IFN0cnVjdFdpdGhBVW5pb24oTGV2ZWwyVGVzdFVuaW9uKTsKKyAgICBPbmVPZkVhY2ggbGV2ZWwzT25lT2ZFYWNoID0gRml4dHVyZXMub25lT2ZFYWNoOworICAgIFRlc3RVbmlvbiBsZXZlbDJUZXN0VW5pb24gPSBuZXcgVGVzdFVuaW9uKFRlc3RVbmlvbi5fRmllbGRzLlNUUlVDVF9GSUVMRCwgbGV2ZWwzT25lT2ZFYWNoKTsKKyAgICBTdHJ1Y3RXaXRoQVVuaW9uIGxldmVsMVNXVSA9IG5ldyBTdHJ1Y3RXaXRoQVVuaW9uKGxldmVsMlRlc3RVbmlvbik7CiAKICAgICBCYWNrd2FyZHMgYncgPSBuZXcgQmFja3dhcmRzKDIsIDEpOwogICAgIFByaW1pdGl2ZVRoZW5TdHJ1Y3QgcHRzID0gbmV3IFByaW1pdGl2ZVRoZW5TdHJ1Y3QoMTIzNDUsIDY3ODkwLCBidyk7CiAKICAgICBmb3IgKFRQcm90b2NvbEZhY3RvcnkgZmFjdG9yeSA6IFBST1RPQ09MUykgewotICAgICAgLy9GdWxsIGRlc2VyaWFsaXphdGlvbiB0ZXN0Ci0gICAgICB0ZXN0UGFydGlhbERlc2VyaWFsaXplKGZhY3RvcnksIExldmVsMVNXVSwgbmV3IFN0cnVjdFdpdGhBVW5pb24oKSwgTGV2ZWwxU1dVKTsKIAogICAgICAgLy9MZXZlbCAyIHRlc3QKLSAgICAgIHRlc3RQYXJ0aWFsRGVzZXJpYWxpemUoZmFjdG9yeSwgTGV2ZWwxU1dVLCBuZXcgVGVzdFVuaW9uKCksIExldmVsMlRlc3RVbmlvbiwgU3RydWN0V2l0aEFVbmlvbi5fRmllbGRzLlRFU1RfVU5JT04pOworICAgICAgdGVzdFBhcnRpYWxEZXNlcmlhbGl6ZShmYWN0b3J5LCBsZXZlbDFTV1UsIG5ldyBUZXN0VW5pb24oKSwgbGV2ZWwyVGVzdFVuaW9uLCBTdHJ1Y3RXaXRoQVVuaW9uLl9GaWVsZHMuVEVTVF9VTklPTik7CiAKICAgICAgIC8vTGV2ZWwgMyBvbiAzcmQgZmllbGQgdGVzdAotICAgICAgdGVzdFBhcnRpYWxEZXNlcmlhbGl6ZShmYWN0b3J5LCBMZXZlbDFTV1UsIG5ldyBPbmVPZkVhY2goKSwgTGV2ZWwzT25lT2ZFYWNoLCBTdHJ1Y3RXaXRoQVVuaW9uLl9GaWVsZHMuVEVTVF9VTklPTiwgVGVzdFVuaW9uLl9GaWVsZHMuU1RSVUNUX0ZJRUxEKTsKKyAgICAgIHRlc3RQYXJ0aWFsRGVzZXJpYWxpemUoZmFjdG9yeSwgbGV2ZWwxU1dVLCBuZXcgT25lT2ZFYWNoKCksIGxldmVsM09uZU9mRWFjaCwgU3RydWN0V2l0aEFVbmlvbi5fRmllbGRzLlRFU1RfVU5JT04sIFRlc3RVbmlvbi5fRmllbGRzLlNUUlVDVF9GSUVMRCk7CiAKICAgICAgIC8vVGVzdCBlYXJseSB0ZXJtaW5hdGlvbiB3aGVuIHRyYXZlcnNlZCBwYXRoIEZpZWxkLmlkIGV4Y2VlZHMgdGhlIG9uZSBiZWluZyBzZWFyY2hlZCBmb3IKLSAgICAgIHRlc3RQYXJ0aWFsRGVzZXJpYWxpemUoZmFjdG9yeSwgTGV2ZWwxU1dVLCBuZXcgT25lT2ZFYWNoKCksIG5ldyBPbmVPZkVhY2goKSwgU3RydWN0V2l0aEFVbmlvbi5fRmllbGRzLlRFU1RfVU5JT04sIFRlc3RVbmlvbi5fRmllbGRzLkkzMl9GSUVMRCk7CisgICAgICB0ZXN0UGFydGlhbERlc2VyaWFsaXplKGZhY3RvcnksIGxldmVsMVNXVSwgbmV3IE9uZU9mRWFjaCgpLCBuZXcgT25lT2ZFYWNoKCksIFN0cnVjdFdpdGhBVW5pb24uX0ZpZWxkcy5URVNUX1VOSU9OLCBUZXN0VW5pb24uX0ZpZWxkcy5JMzJfRklFTEQpOwogCiAgICAgICAvL1Rlc3QgdGhhdCByZWFkU3RydWN0QmVnaW4gaXNuJ3QgY2FsbGVkIG9uIHByaW1pdGl2ZQogICAgICAgdGVzdFBhcnRpYWxEZXNlcmlhbGl6ZShmYWN0b3J5LCBwdHMsIG5ldyBCYWNrd2FyZHMoKSwgYncsIFByaW1pdGl2ZVRoZW5TdHJ1Y3QuX0ZpZWxkcy5CVyk7CisKKyAgICAgIC8vVGVzdCBwcmltaXRpdmUgdHlwZXMKKyAgICAgIFREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIoZmFjdG9yeSk7CisKKyAgICAgIEJvb2xlYW4gZXhwZWN0ZWRCb29sID0gbGV2ZWwzT25lT2ZFYWNoLmlzSW1fdHJ1ZSgpOworICAgICAgQm9vbGVhbiByZXN1bHRCb29sID0gZGVzZXJpYWxpemVyLnBhcnRpYWxEZXNlcmlhbGl6ZUJvb2woc2VyaWFsaXplKGxldmVsMVNXVSwgZmFjdG9yeSksIFN0cnVjdFdpdGhBVW5pb24uX0ZpZWxkcy5URVNUX1VOSU9OLCBUZXN0VW5pb24uX0ZpZWxkcy5TVFJVQ1RfRklFTEQsIE9uZU9mRWFjaC5fRmllbGRzLklNX1RSVUUpOworICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQm9vbCwgcmVzdWx0Qm9vbCk7CisKKyAgICAgIEJ5dGUgZXhwZWN0ZWRCeXRlID0gbGV2ZWwzT25lT2ZFYWNoLmdldEFfYml0ZSgpOworICAgICAgQnl0ZSByZXN1bHRCeXRlID0gZGVzZXJpYWxpemVyLnBhcnRpYWxEZXNlcmlhbGl6ZUJ5dGUoc2VyaWFsaXplKGxldmVsMVNXVSwgZmFjdG9yeSksIFN0cnVjdFdpdGhBVW5pb24uX0ZpZWxkcy5URVNUX1VOSU9OLCBUZXN0VW5pb24uX0ZpZWxkcy5TVFJVQ1RfRklFTEQsIE9uZU9mRWFjaC5fRmllbGRzLkFfQklURSk7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRCeXRlLCByZXN1bHRCeXRlKTsKKworICAgICAgRG91YmxlIGV4cGVjdGVkRG91YmxlID0gbGV2ZWwzT25lT2ZFYWNoLmdldERvdWJsZV9wcmVjaXNpb24oKTsKKyAgICAgIERvdWJsZSByZXN1bHREb3VibGUgPSBkZXNlcmlhbGl6ZXIucGFydGlhbERlc2VyaWFsaXplRG91YmxlKHNlcmlhbGl6ZShsZXZlbDFTV1UsIGZhY3RvcnkpLCBTdHJ1Y3RXaXRoQVVuaW9uLl9GaWVsZHMuVEVTVF9VTklPTiwgVGVzdFVuaW9uLl9GaWVsZHMuU1RSVUNUX0ZJRUxELCBPbmVPZkVhY2guX0ZpZWxkcy5ET1VCTEVfUFJFQ0lTSU9OKTsKKyAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZERvdWJsZSwgcmVzdWx0RG91YmxlKTsKKworICAgICAgU2hvcnQgZXhwZWN0ZWRJMTYgPSBsZXZlbDNPbmVPZkVhY2guZ2V0SW50ZWdlcjE2KCk7CisgICAgICBTaG9ydCByZXN1bHRJMTYgPSBkZXNlcmlhbGl6ZXIucGFydGlhbERlc2VyaWFsaXplSTE2KHNlcmlhbGl6ZShsZXZlbDFTV1UsIGZhY3RvcnkpLCBTdHJ1Y3RXaXRoQVVuaW9uLl9GaWVsZHMuVEVTVF9VTklPTiwgVGVzdFVuaW9uLl9GaWVsZHMuU1RSVUNUX0ZJRUxELCBPbmVPZkVhY2guX0ZpZWxkcy5JTlRFR0VSMTYpOworICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkSTE2LCByZXN1bHRJMTYpOworCisgICAgICBJbnRlZ2VyIGV4cGVjdGVkSTMyID0gbGV2ZWwzT25lT2ZFYWNoLmdldEludGVnZXIzMigpOworICAgICAgSW50ZWdlciByZXN1bHRJMzIgPSBkZXNlcmlhbGl6ZXIucGFydGlhbERlc2VyaWFsaXplSTMyKHNlcmlhbGl6ZShsZXZlbDFTV1UsIGZhY3RvcnkpLCBTdHJ1Y3RXaXRoQVVuaW9uLl9GaWVsZHMuVEVTVF9VTklPTiwgVGVzdFVuaW9uLl9GaWVsZHMuU1RSVUNUX0ZJRUxELCBPbmVPZkVhY2guX0ZpZWxkcy5JTlRFR0VSMzIpOworICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkSTMyLCByZXN1bHRJMzIpOworCisgICAgICBMb25nIGV4cGVjdGVkSTY0ID0gbGV2ZWwzT25lT2ZFYWNoLmdldEludGVnZXI2NCgpOworICAgICAgTG9uZyByZXN1bHRJNjQ9IGRlc2VyaWFsaXplci5wYXJ0aWFsRGVzZXJpYWxpemVJNjQoc2VyaWFsaXplKGxldmVsMVNXVSwgZmFjdG9yeSksIFN0cnVjdFdpdGhBVW5pb24uX0ZpZWxkcy5URVNUX1VOSU9OLCBUZXN0VW5pb24uX0ZpZWxkcy5TVFJVQ1RfRklFTEQsIE9uZU9mRWFjaC5fRmllbGRzLklOVEVHRVI2NCk7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRJNjQsIHJlc3VsdEk2NCk7CisKKyAgICAgIFN0cmluZyBleHBlY3RlZFN0cmluZyA9IGxldmVsM09uZU9mRWFjaC5nZXRTb21lX2NoYXJhY3RlcnMoKTsKKyAgICAgIFN0cmluZyByZXN1bHRTdHJpbmcgPSBkZXNlcmlhbGl6ZXIucGFydGlhbERlc2VyaWFsaXplU3RyaW5nKHNlcmlhbGl6ZShsZXZlbDFTV1UsIGZhY3RvcnkpLCBTdHJ1Y3RXaXRoQVVuaW9uLl9GaWVsZHMuVEVTVF9VTklPTiwgVGVzdFVuaW9uLl9GaWVsZHMuU1RSVUNUX0ZJRUxELCBPbmVPZkVhY2guX0ZpZWxkcy5TT01FX0NIQVJBQ1RFUlMpOworICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCByZXN1bHRTdHJpbmcpOworCisgICAgICBieXRlW10gZXhwZWN0ZWRCaW5hcnkgPSBsZXZlbDNPbmVPZkVhY2guZ2V0QmFzZTY0KCk7CisgICAgICBCeXRlQnVmZmVyIHJlc3VsdEJpbmFyeSA9IGRlc2VyaWFsaXplci5wYXJ0aWFsRGVzZXJpYWxpemVCeXRlQXJyYXkoc2VyaWFsaXplKGxldmVsMVNXVSwgZmFjdG9yeSksIFN0cnVjdFdpdGhBVW5pb24uX0ZpZWxkcy5URVNUX1VOSU9OLCBUZXN0VW5pb24uX0ZpZWxkcy5TVFJVQ1RfRklFTEQsIE9uZU9mRWFjaC5fRmllbGRzLkJBU0U2NCk7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRCaW5hcnkubGVuZ3RoLCByZXN1bHRCaW5hcnkubGltaXQoKSAtIHJlc3VsdEJpbmFyeS5wb3NpdGlvbigpIC0gcmVzdWx0QmluYXJ5LmFycmF5T2Zmc2V0KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChleHBlY3RlZEJpbmFyeSksIHJlc3VsdEJpbmFyeSk7CisKKyAgICAgIC8vIFRlc3QgZmllbGQgaWQgaW4gVW5pb24KKyAgICAgIHNob3J0IGlkID0gZGVzZXJpYWxpemVyLnBhcnRpYWxEZXNlcmlhbGl6ZVNldEZpZWxkSWRJblVuaW9uKHNlcmlhbGl6ZShsZXZlbDFTV1UsIGZhY3RvcnkpLCBTdHJ1Y3RXaXRoQVVuaW9uLl9GaWVsZHMuVEVTVF9VTklPTik7CisgICAgICBhc3NlcnRFcXVhbHMobGV2ZWwyVGVzdFVuaW9uLmdldFNldEZpZWxkKCkuZ2V0VGhyaWZ0RmllbGRJZCgpLCBpZCk7CiAgICAgfQogICB9CiAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RQYXJ0aWFsRGVzZXJpYWxpemUoVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFRCYXNlIGlucHV0LCBUQmFzZSBvdXRwdXQsIFRCYXNlIGV4cGVjdGVkLCBURmllbGRJZEVudW0gLi4uIGZpZWxkSWRQYXRoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIHJlY29yZCA9IG5ldyBUU2VyaWFsaXplcihwcm90b2NvbEZhY3RvcnkpLnNlcmlhbGl6ZShpbnB1dCk7CisgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0UGFydGlhbERlc2VyaWFsaXplKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBUQmFzZSBpbnB1dCwgVEJhc2Ugb3V0cHV0LCBUQmFzZSBleHBlY3RlZCwgVEZpZWxkSWRFbnVtIGZpZWxkSWRQYXRoRmlyc3QsIFRGaWVsZElkRW51bSAuLi4gZmllbGRJZFBhdGhSZXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIHJlY29yZCA9IHNlcmlhbGl6ZShpbnB1dCwgcHJvdG9jb2xGYWN0b3J5KTsKICAgICBURGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciA9IG5ldyBURGVzZXJpYWxpemVyKHByb3RvY29sRmFjdG9yeSk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgIFRCYXNlIG91dHB1dENvcHkgPSBvdXRwdXQuZGVlcENvcHkoKTsKLSAgICAgIGRlc2VyaWFsaXplci5wYXJ0aWFsRGVzZXJpYWxpemUob3V0cHV0Q29weSwgcmVjb3JkLCBmaWVsZElkUGF0aCk7CisgICAgICBkZXNlcmlhbGl6ZXIucGFydGlhbERlc2VyaWFsaXplKG91dHB1dENvcHksIHJlY29yZCwgZmllbGRJZFBhdGhGaXJzdCwgZmllbGRJZFBhdGhSZXN0KTsKICAgICAgIGFzc2VydEVxdWFscygib24gYXR0ZW1wdCAiICsgaSArICIsIHdpdGggIiArIHByb3RvY29sRmFjdG9yeS50b1N0cmluZygpIAogICAgICAgICAgICsgIiwgZXhwZWN0ZWQgIiArIGV4cGVjdGVkICsgIiBidXQgZ290ICIgKyBvdXRwdXRDb3B5LAogICAgICAgICAgIGV4cGVjdGVkLCBvdXRwdXRDb3B5KTsKICAgICB9CiAgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gc2VyaWFsaXplKFRCYXNlIGlucHV0LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgdGhyb3dzIFRFeGNlcHRpb257CisgICAgcmV0dXJuIG5ldyBUU2VyaWFsaXplcihwcm90b2NvbEZhY3RvcnkpLnNlcmlhbGl6ZShpbnB1dCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRFbnVtSGVscGVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RURW51bUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2NhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RURW51bUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFRFbnVtSGVscGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRCeVZhbHVlX1ZhbGlkVmFsdWVzKCkgeworICAgIGZvciAoTnVtYmVyeiBuOiBOdW1iZXJ6LnZhbHVlcygpKSB7CisgICAgICBpbnQgdmFsdWUgPSBuLmdldFZhbHVlKCk7CisgICAgICBhc3NlcnRFcXVhbHMobiwgVEVudW1IZWxwZXIuZ2V0QnlWYWx1ZShOdW1iZXJ6LmNsYXNzLCB2YWx1ZSkpOworICAgIH0gCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0R2V0QnlWYWx1ZV9JbnZhbGlkVmFsdWUoKSB7CisgICAgYXNzZXJ0RXF1YWxzKG51bGwsIFRFbnVtSGVscGVyLmdldEJ5VmFsdWUoTnVtYmVyei5jbGFzcywgMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEdldEJ5VmFsdWVfSW52YWxpZENsYXNzKCkgeworICAgIGFzc2VydEVxdWFscyhudWxsLCBURW51bUhlbHBlci5nZXRCeVZhbHVlKFRFbnVtLmNsYXNzLCAwKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFRVbmlvbi5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VFVuaW9uLmphdmEKaW5kZXggMmZmODBlOS4uZjFlNmYwZSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VFVuaW9uLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VFVuaW9uLmphdmEKQEAgLTE4LDE3ICsxOCwzMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKIAogaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhcmFibGVVbmlvbjsKIGltcG9ydCB0aHJpZnQudGVzdC5FbXB0eTsKK2ltcG9ydCB0aHJpZnQudGVzdC5SYW5kb21TdHVmZjsKIGltcG9ydCB0aHJpZnQudGVzdC5Tb21lRW51bTsKIGltcG9ydCB0aHJpZnQudGVzdC5TdHJ1Y3RXaXRoQVVuaW9uOwogaW1wb3J0IHRocmlmdC50ZXN0LlRlc3RVbmlvbjsKIGltcG9ydCB0aHJpZnQudGVzdC5UZXN0VW5pb25NaW51c1N0cmluZ0ZpZWxkOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogcHVibGljIGNsYXNzIFRlc3RUVW5pb24gZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKQEAgLTM2LDYgKzUxLDcgQEAKICAgICBUZXN0VW5pb24gdW5pb24gPSBuZXcgVGVzdFVuaW9uKCk7CiAKICAgICBhc3NlcnRGYWxzZSh1bmlvbi5pc1NldCgpKTsKKyAgICBhc3NlcnRGYWxzZSh1bmlvbi5pc1NldEkzMl9maWVsZCgpKTsKICAgICBhc3NlcnROdWxsKHVuaW9uLmdldEZpZWxkVmFsdWUoKSk7CiAKICAgICB1bmlvbiA9IG5ldyBUZXN0VW5pb24oVGVzdFVuaW9uLl9GaWVsZHMuSTMyX0ZJRUxELCAyNSk7CkBAIC00Myw2ICs1OSw4IEBACiAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNSksIHVuaW9uLmdldEZpZWxkVmFsdWUoKSk7CiAgIAogICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjUpLCB1bmlvbi5nZXRGaWVsZFZhbHVlKFRlc3RVbmlvbi5fRmllbGRzLkkzMl9GSUVMRCkpOworICAgIAorICAgIGFzc2VydFRydWUodW5pb24uaXNTZXRJMzJfZmllbGQoKSk7CiAgIAogICAgIHRyeSB7CiAgICAgICB1bmlvbi5nZXRGaWVsZFZhbHVlKFRlc3RVbmlvbi5fRmllbGRzLlNUUklOR19GSUVMRCk7CkBAIC02MCw2ICs3OCw4IEBACiAgICAgYXNzZXJ0RXF1YWxzKDEsIHVuaW9uLmdldEkzMl9maWVsZCgpKTsKICAgICB1bmlvbi5oYXNoQ29kZSgpOwogCisgICAgYXNzZXJ0RmFsc2UodW5pb24uaXNTZXRTdHJpbmdfZmllbGQoKSk7CisgICAgCiAgICAgdHJ5IHsKICAgICAgIHVuaW9uLmdldFN0cmluZ19maWVsZCgpOwogICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOwpAQCAtODksMTUgKzEwOSwzMSBAQAogICAgIGFzc2VydFRydWUoY3UuY29tcGFyZVRvKGN1MikgPCAwKTsKICAgICBhc3NlcnRUcnVlKGN1Mi5jb21wYXJlVG8oY3UpID4gMCk7CiAKLSAgICBjdTIgPSBDb21wYXJhYmxlVW5pb24uYmluYXJ5X2ZpZWxkKG5ldyBieXRlW117Mn0pOworICAgIGN1MiA9IENvbXBhcmFibGVVbmlvbi5iaW5hcnlfZmllbGQoQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW117Mn0pKTsKIAogICAgIGFzc2VydFRydWUoY3UuY29tcGFyZVRvKGN1MikgPCAwKTsKICAgICBhc3NlcnRUcnVlKGN1Mi5jb21wYXJlVG8oY3UpID4gMCk7CiAKLSAgICBjdSA9IENvbXBhcmFibGVVbmlvbi5iaW5hcnlfZmllbGQobmV3IGJ5dGVbXXsxfSk7CisgICAgY3UgPSBDb21wYXJhYmxlVW5pb24uYmluYXJ5X2ZpZWxkKEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezF9KSk7CiAKICAgICBhc3NlcnRUcnVlKGN1LmNvbXBhcmVUbyhjdTIpIDwgMCk7CiAgICAgYXNzZXJ0VHJ1ZShjdTIuY29tcGFyZVRvKGN1KSA+IDApOworICAgIAorICAgIFRlc3RVbmlvbiB1bmlvbjEgPSBuZXcgVGVzdFVuaW9uKFRlc3RVbmlvbi5fRmllbGRzLlNUUlVDVF9MSVNULCBuZXcgQXJyYXlMaXN0PFJhbmRvbVN0dWZmPigpKTsKKyAgICBUZXN0VW5pb24gdW5pb24yID0gbmV3IFRlc3RVbmlvbihUZXN0VW5pb24uX0ZpZWxkcy5TVFJVQ1RfTElTVCwgbmV3IEFycmF5TGlzdDxSYW5kb21TdHVmZj4oKSk7CisgICAgYXNzZXJ0VHJ1ZSh1bmlvbjEuY29tcGFyZVRvKHVuaW9uMikgPT0gMCk7CisKKyAgICBUZXN0VW5pb24gdW5pb24zID0gbmV3IFRlc3RVbmlvbihUZXN0VW5pb24uX0ZpZWxkcy5JMzJfU0VULCBuZXcgSGFzaFNldDxJbnRlZ2VyPigpKTsKKyAgICBTZXQ8SW50ZWdlcj4gaTMyX3NldCA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7CisgICAgaTMyX3NldC5hZGQoMSk7CisgICAgVGVzdFVuaW9uIHVuaW9uNCA9IG5ldyBUZXN0VW5pb24oVGVzdFVuaW9uLl9GaWVsZHMuSTMyX1NFVCwgaTMyX3NldCk7CisgICAgYXNzZXJ0VHJ1ZSh1bmlvbjMuY29tcGFyZVRvKHVuaW9uNCkgPCAwKTsKKworICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBpMzJfbWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKKyAgICBpMzJfbWFwLnB1dCgxLDEpOworICAgIFRlc3RVbmlvbiB1bmlvbjUgPSBuZXcgVGVzdFVuaW9uKFRlc3RVbmlvbi5fRmllbGRzLkkzMl9NQVAsIGkzMl9tYXApOworICAgIFRlc3RVbmlvbiB1bmlvbjYgPSBuZXcgVGVzdFVuaW9uKFRlc3RVbmlvbi5fRmllbGRzLkkzMl9NQVAsIG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCkpOworICAgIGFzc2VydFRydWUodW5pb241LmNvbXBhcmVUbyh1bmlvbjYpID4gMCk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTExOCw2ICsxNTQsNyBAQAogCiAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgVGVzdFVuaW9uIHVuaW9uID0gbmV3IFRlc3RVbmlvbihUZXN0VW5pb24uX0ZpZWxkcy5JMzJfRklFTEQsIDI1KTsKKyAgICB1bmlvbi5zZXRJMzJfc2V0KENvbGxlY3Rpb25zLnNpbmdsZXRvbig0MikpOwogCiAgICAgVE1lbW9yeUJ1ZmZlciBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKICAgICBUUHJvdG9jb2wgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sKGJ1Zik7CkBAIC0xNDksNiArMTg2LDQxIEBACiAgICAgc3dhdS53cml0ZShwcm90byk7CiAgICAgbmV3IEVtcHR5KCkucmVhZChwcm90byk7CiAgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RUdXBsZVByb3RvY29sU2VyaWFsaXphdGlvbiAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0VW5pb24gdW5pb24gPSBuZXcgVGVzdFVuaW9uKFRlc3RVbmlvbi5fRmllbGRzLkkzMl9GSUVMRCwgMjUpOworICAgIHVuaW9uLnNldEkzMl9zZXQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKDQyKSk7CisKKyAgICBUTWVtb3J5QnVmZmVyIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIFRQcm90b2NvbCBwcm90byA9IG5ldyBUVHVwbGVQcm90b2NvbChidWYpOworCisgICAgdW5pb24ud3JpdGUocHJvdG8pOworCisgICAgVGVzdFVuaW9uIHUyID0gbmV3IFRlc3RVbmlvbigpOworCisgICAgdTIucmVhZChwcm90byk7CisKKyAgICBhc3NlcnRFcXVhbHModTIsIHVuaW9uKTsKKworICAgIFN0cnVjdFdpdGhBVW5pb24gc3dhdSA9IG5ldyBTdHJ1Y3RXaXRoQVVuaW9uKHUyKTsKKworICAgIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbChidWYpOworCisgICAgc3dhdS53cml0ZShwcm90byk7CisKKyAgICBTdHJ1Y3RXaXRoQVVuaW9uIHN3YXUyID0gbmV3IFN0cnVjdFdpdGhBVW5pb24oKTsKKyAgICBhc3NlcnRGYWxzZShzd2F1Mi5lcXVhbHMoc3dhdSkpOworICAgIHN3YXUyLnJlYWQocHJvdG8pOworICAgIGFzc2VydEVxdWFscyhzd2F1Miwgc3dhdSk7CisKKyAgICAvLyB0aGlzIHNob3VsZCBOT1QgdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIHByb3RvID0gbmV3IFRUdXBsZVByb3RvY29sKGJ1Zik7CisKKyAgICBzd2F1LndyaXRlKHByb3RvKTsKKyAgICBuZXcgRW1wdHkoKS5yZWFkKHByb3RvKTsKKyAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RTa2lwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgVGVzdFVuaW9uIHR1ID0gVGVzdFVuaW9uLnN0cmluZ19maWVsZCgic3RyaW5nIik7CkBAIC0xNTgsNCArMjMwLDM5IEBACiAgICAgYXNzZXJ0TnVsbCh0dW1zLmdldFNldEZpZWxkKCkpOwogICAgIGFzc2VydE51bGwodHVtcy5nZXRGaWVsZFZhbHVlKCkpOwogICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERlZXBDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGJ5dGVzID0gezEsIDIsIDN9OworICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOworICAgIENvbXBhcmFibGVVbmlvbiBjdSA9IENvbXBhcmFibGVVbmlvbi5iaW5hcnlfZmllbGQodmFsdWUpOworICAgIENvbXBhcmFibGVVbmlvbiBjb3B5ID0gY3UuZGVlcENvcHkoKTsKKyAgICBhc3NlcnRFcXVhbHMoY3UsIGNvcHkpOworICAgIGFzc2VydE5vdFNhbWUoY3UuYnVmZmVyRm9yQmluYXJ5X2ZpZWxkKCkuYXJyYXkoKSwgY29weS5idWZmZXJGb3JCaW5hcnlfZmllbGQoKS5hcnJheSgpKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYnl0ZVtdIGJ5dGVzID0gezEsIDIsIDN9OworICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOworICAgIENvbXBhcmFibGVVbmlvbiBjdSA9IENvbXBhcmFibGVVbmlvbi5iaW5hcnlfZmllbGQodmFsdWUpOworICAgIFN0cmluZyBleHBlY3RlZFN0cmluZyA9ICI8Q29tcGFyYWJsZVVuaW9uIGJpbmFyeV9maWVsZDowMSAwMiAwMz4iOworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgY3UudG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SmF2YVNlcmlhbGl6YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOworICAgIAorICAgIFRlc3RVbmlvbiB0dSA9IFRlc3RVbmlvbi5zdHJpbmdfZmllbGQoInN0cmluZyIpOworCisgICAgLy8gU2VyaWFsaXplIHR1IHRoZSBKYXZhIHdheS4uLgorICAgIG9vcy53cml0ZU9iamVjdCh0dSk7CisgICAgYnl0ZVtdIHNlcmlhbGl6ZWQgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisKKyAgICAvLyBBdHRlbXB0IHRvIGRlc2VyaWFsaXplIGl0CisgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzZXJpYWxpemVkKTsKKyAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7CisgICAgVGVzdFVuaW9uIHR1MiA9IChUZXN0VW5pb24pIG9pcy5yZWFkT2JqZWN0KCk7CisKKyAgICBhc3NlcnRFcXVhbHModHUsIHR1Mik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmMyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5TYWZlQnl0ZXM7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVW5zYWZlQnl0ZXM7CisKKy8vICB0ZXN0IGdlbmVyYXRpbmcgdHlwZXMgd2l0aCB1bi1jb3BpZWQgYnl0ZVtdL0J5dGVCdWZmZXIgaW5wdXQvb3V0cHV0CisvLworcHVibGljIGNsYXNzIFRlc3RVbnNhZmVCaW5hcmllcyBleHRlbmRzIFRlc3RTdHJ1Y3QgeworCisgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBpbnB1dCgpIHsKKyAgICByZXR1cm4gbmV3IGJ5dGVbXXsxLCAxfTsKKyAgfQorCisgIC8vCisgIC8vICB2ZXJpZnkgdGhhdCB0aGUgdW5zYWZlX2JpbmFyaWVzIG9wdGlvbiBtb2RpZmllcyBiZWhhdmlvcgorICAvLworCisgIC8vICBjb25zdHJ1Y3RvciBkb2Vzbid0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZUNvbnN0cnVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIGdldHRlciBkb2Vzbid0IGNvcHkKKyAgLy8gIG5vdGU6IHRoaXMgYmVoYXZpb3IgaXMgdGhlIHNhbWUgd2l0aC93aXRob3V0IHRoZSBmbGFnLCBidXQgaWYgdGhpcyBkZWZhdWx0IGV2ZXIgY2hhbmdlcywgdGhlIGN1cnJlbnQgYmVoYXZpb3IKKyAgLy8gICAgICAgIHNob3VsZCBiZSByZXRhaW5lZCB3aGVuIHVzaW5nIHRoaXMgZmxhZworICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlR2V0dGVyKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBieXRlW10gdmFsID0gc3RydWN0LmdldEJ5dGVzKCk7CisgICAgdmFsWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIHNldHRlciBkb2Vzbid0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZVNldHRlcigpeworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcygpOworCisgICAgYnl0ZVtdIHZhbCA9IGlucHV0KCk7CisgICAgc3RydWN0LnNldEJ5dGVzKHZhbCk7CisKKyAgICB2YWxbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgYnVmZmVyIGRvZW5zJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlQnVmZmVyRm9yKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBCeXRlQnVmZmVyIHZhbCA9IHN0cnVjdC5idWZmZXJGb3JCeXRlcygpOworICAgIHZhbC5hcnJheSgpWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8KKyAgLy8gIHZlcmlmeSB0aGF0IHRoZSBkZWZhdWx0IGdlbmVyYXRvciBkb2VzIG5vdCBjaGFuZ2UgYmVoYXZpb3IKKyAgLy8KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZUNvbnN0cnVjdG9yKCkgeworCisgICAgYnl0ZVtdIGlucHV0ID0gaW5wdXQoKTsKKyAgICBTYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNhZmVTZXR0ZXIoKSB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZUJ1ZmZlckZvcigpeworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBCeXRlQnVmZmVyIHZhbCA9IHN0cnVjdC5idWZmZXJGb3JCeXRlcygpOworICAgIHZhbC5hcnJheSgpWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyY2EyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuU3J2OworaW1wb3J0IHRocmlmdC50ZXN0LlNydi5Bc3luY0NsaWVudDsKKworcHVibGljIGNsYXNzIFRlc3RUQXN5bmNDbGllbnQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RSYWlzZXNFeGNlcHRpb25XaGVuVXNlZENvbmN1cnJlbnRseSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRBc3luY0NsaWVudE1hbmFnZXIgbW9ja0NsaWVudE1hbmFnZXIgPSBuZXcgVEFzeW5jQ2xpZW50TWFuYWdlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgY2FsbChUQXN5bmNNZXRob2RDYWxsIG1ldGhvZCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICB9CisgICAgfTsKKworICAgIFNydi5Bc3luY0NsaWVudCBjID0gbmV3IEFzeW5jQ2xpZW50KG51bGwsIG1vY2tDbGllbnRNYW5hZ2VyLCBudWxsKTsKKyAgICBjLkphbmt5KDAsIG51bGwpOworICAgIHRyeSB7CisgICAgICBjLmNoZWNrUmVhZHkoKTsKKyAgICAgIGZhaWwoInNob3VsZCBoYXZlIGhpdCBhbiBleGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgLy8gYXdlc29tZQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODNjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuU2VydmVyVGVzdEJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRIc0hhU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5USHNIYVNlcnZlci5BcmdzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NvY2tldDsKKworaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRXhjZXB0aW9uV2l0aEFNYXA7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU3J2OworaW1wb3J0IHRocmlmdC50ZXN0LlNydi5JZmFjZTsKKworcHVibGljIGNsYXNzIFRlc3RUQXN5bmNDbGllbnRNYW5hZ2VyIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgVEhzSGFTZXJ2ZXIgc2VydmVyXzsKKyAgcHJpdmF0ZSBUaHJlYWQgc2VydmVyVGhyZWFkXzsKKyAgcHJpdmF0ZSBUQXN5bmNDbGllbnRNYW5hZ2VyIGNsaWVudE1hbmFnZXJfOworCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc2VydmVyXyA9IG5ldyBUSHNIYVNlcnZlcihuZXcgQXJncyhuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KAorICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Ob25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncygpLnBvcnQoU2VydmVyVGVzdEJhc2UuUE9SVCkpKS4KKyAgICAgIHByb2Nlc3NvcihuZXcgU3J2LlByb2Nlc3NvcihuZXcgU3J2SGFuZGxlcigpKSkpOworICAgIHNlcnZlclRocmVhZF8gPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgc2VydmVyXy5zZXJ2ZSgpOworICAgICAgfQorICAgIH0pOworICAgIHNlcnZlclRocmVhZF8uc3RhcnQoKTsKKyAgICBjbGllbnRNYW5hZ2VyXyA9IG5ldyBUQXN5bmNDbGllbnRNYW5hZ2VyKCk7CisgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHNlcnZlcl8uc3RvcCgpOworICAgIGNsaWVudE1hbmFnZXJfLnN0b3AoKTsKKyAgICBzZXJ2ZXJUaHJlYWRfLmpvaW4oKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0NhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgYmFzaWNDYWxsKGNsaWVudCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNDYWxsV2l0aFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgY2xpZW50LnNldFRpbWVvdXQoNTAwMCk7CisgICAgYmFzaWNDYWxsKGNsaWVudCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFcnJvckNhbGxUZXN0PEMgZXh0ZW5kcyBUQXN5bmNDbGllbnQsIFI+IHsKKyAgICBmaW5hbCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPEV4Y2VwdGlvbj4gZXJyb3IgPSBuZXcgQXRvbWljUmVmZXJlbmNlPEV4Y2VwdGlvbj4oKTsKKyAgICAgIEMgY2xpZW50ID0gZXhlY3V0ZUVycm9yaW5nQ2FsbChuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxSPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoUiByZXNwb25zZSkgeworICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgIGVycm9yLnNldChleGNlcHRpb24pOworICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGxhdGNoLmF3YWl0KDIsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgYXNzZXJ0VHJ1ZShjbGllbnQuaGFzRXJyb3IoKSk7CisgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gZXJyb3IuZ2V0KCk7CisgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7CisgICAgICBhc3NlcnRTYW1lKGV4Y2VwdGlvbiwgY2xpZW50LmdldEVycm9yKCkpOworICAgICAgdmFsaWRhdGVFcnJvcihjbGllbnQsIGV4Y2VwdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSBjYWxsIHRoYXQgaXMgZXhwZWN0ZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSB0ZXN0aW5nIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGluc3RhbGxlZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBjbGllbnQgdGhlIGNhbGwgd2FzIG1hZGUgYWdhaW5zdC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHNldHRpbmcgdXAgdGhlIGNsaWVudCBvciBtYWtpbmcgdGhlIGNhbGwuCisgICAgICovCisgICAgYWJzdHJhY3QgQyBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Uj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBGdXJ0aGVyIHZhbGlkYXRlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgZXJyb3IgcmFpc2VkIGluIHRoZSByZW1vdGUgY2FsbCBhbmQgdGhlIHN0YXRlIG9mIHRoZQorICAgICAqIGNsaWVudCBhZnRlciB0aGF0IGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50IFRoZSBjbGllbnQgcmV0dXJuZWQgZnJvbSB7QGxpbmsgI2V4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjayl9LgorICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgcmVtb3RlIGNhbGwuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZUVycm9yKEMgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuZXhwZWN0ZWRSZW1vdGVFeGNlcHRpb25DYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbmV3IEVycm9yQ2FsbFRlc3Q8U3J2LkFzeW5jQ2xpZW50LCBCb29sZWFuPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgU3J2LkFzeW5jQ2xpZW50IGV4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjazxCb29sZWFuPiBjYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LmRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKGZhbHNlLCBjYWxsYmFjayk7CisgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgdm9pZCB2YWxpZGF0ZUVycm9yKFNydi5Bc3luY0NsaWVudCBjbGllbnQsIEV4Y2VwdGlvbiBlcnJvcikgeworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnQuaGFzVGltZW91dCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvciBpbnN0YW5jZW9mIFRFeGNlcHRpb24pOworICAgICAgfQorICAgIH0ucnVuVGVzdCgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERlY2xhcmVkUmVtb3RlRXhjZXB0aW9uQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG5ldyBFcnJvckNhbGxUZXN0PFNydi5Bc3luY0NsaWVudCwgQm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIFNydi5Bc3luY0NsaWVudCBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Qm9vbGVhbj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgIGNsaWVudC5kZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZCh0cnVlLCBjYWxsYmFjayk7CisgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgdm9pZCB2YWxpZGF0ZUVycm9yKFNydi5Bc3luY0NsaWVudCBjbGllbnQsIEV4Y2VwdGlvbiBlcnJvcikgeworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnQuaGFzVGltZW91dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEV4Y2VwdGlvbldpdGhBTWFwLmNsYXNzLCBlcnJvci5nZXRDbGFzcygpKTsKKyAgICAgICAgRXhjZXB0aW9uV2l0aEFNYXAgZXhjZXB0aW9uV2l0aEFNYXAgPSAoRXhjZXB0aW9uV2l0aEFNYXApIGVycm9yOworICAgICAgICBhc3NlcnRFcXVhbHMoImJsYWgiLCBleGNlcHRpb25XaXRoQU1hcC5nZXRCbGFoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCksIGV4Y2VwdGlvbldpdGhBTWFwLmdldE1hcF9maWVsZCgpKTsKKyAgICAgIH0KKyAgICB9LnJ1blRlc3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaW1lb3V0Q2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG5ldyBFcnJvckNhbGxUZXN0PFNydi5Bc3luY0NsaWVudCwgSW50ZWdlcj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIFNydi5Bc3luY0NsaWVudCBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8SW50ZWdlcj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgIGNsaWVudC5zZXRUaW1lb3V0KDEwMCk7CisgICAgICAgIGNsaWVudC5wcmltaXRpdmVNZXRob2QoY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbGllbnQuaGFzVGltZW91dCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvciBpbnN0YW5jZW9mIFRpbWVvdXRFeGNlcHRpb24pOworICAgICAgfQorICAgIH0ucnVuVGVzdCgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFZvaWRDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgY2xpZW50LnZvaWRNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8Vm9pZD4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVm9pZCByZXNwb25zZSkgeworICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgfQorICAgIH0pOworICAgIGxhdGNoLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpOworICAgIGFzc2VydFRydWUocmV0dXJuZWQuZ2V0KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE9uZXdheUNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICBjbGllbnQub25ld2F5TWV0aG9kKG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPFZvaWQ+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFZvaWQgcmVzcG9uc2UpIHsKKyAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBsYXRjaC5hd2FpdCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICBhc3NlcnRUcnVlKHJldHVybmVkLmdldCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbGxlbENhbGxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gbWFrZSBtdWx0aXBsZSBjYWxscyB3aXRoIGRlc2VyaWFsaXphdGlvbiBpbiB0aGUgc2VsZWN0b3IgdGhyZWFkIChyZXBybyBFcmljJ3MgaXNzdWUpCisgICAgaW50IG51bVRocmVhZHMgPSA1MDsKKyAgICBpbnQgbnVtQ2FsbHNQZXJUaHJlYWQgPSAxMDA7CisgICAgTGlzdDxKYW5reVJ1bm5hYmxlPiBydW5uYWJsZXMgPSBuZXcgQXJyYXlMaXN0PEphbmt5UnVubmFibGU+KCk7CisgICAgTGlzdDxUaHJlYWQ+IHRocmVhZHMgPSBuZXcgQXJyYXlMaXN0PFRocmVhZD4oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykgeworICAgICAgSmFua3lSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBKYW5reVJ1bm5hYmxlKG51bUNhbGxzUGVyVGhyZWFkKTsKKyAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlKTsKKyAgICAgIHRocmVhZC5zdGFydCgpOworICAgICAgdGhyZWFkcy5hZGQodGhyZWFkKTsKKyAgICAgIHJ1bm5hYmxlcy5hZGQocnVubmFibGUpOworICAgIH0KKyAgICBmb3IgKFRocmVhZCB0aHJlYWQgOiB0aHJlYWRzKSB7CisgICAgICB0aHJlYWQuam9pbigpOworICAgIH0KKyAgICBpbnQgbnVtU3VjY2Vzc2VzID0gMDsKKyAgICBmb3IgKEphbmt5UnVubmFibGUgcnVubmFibGUgOiBydW5uYWJsZXMpIHsKKyAgICAgIG51bVN1Y2Nlc3NlcyArPSBydW5uYWJsZS5nZXROdW1TdWNjZXNzZXMoKTsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKG51bVRocmVhZHMgKiBudW1DYWxsc1BlclRocmVhZCwgbnVtU3VjY2Vzc2VzKTsKKyAgfQorCisgIHByaXZhdGUgU3J2LkFzeW5jQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgVE5vbmJsb2NraW5nU29ja2V0IGNsaWVudFNvY2tldCA9IG5ldyBUTm9uYmxvY2tpbmdTb2NrZXQoU2VydmVyVGVzdEJhc2UuSE9TVCwgU2VydmVyVGVzdEJhc2UuUE9SVCk7CisgICAgcmV0dXJuIG5ldyBTcnYuQXN5bmNDbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIGNsaWVudE1hbmFnZXJfLCBjbGllbnRTb2NrZXQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGJhc2ljQ2FsbChTcnYuQXN5bmNDbGllbnQgY2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIGNsaWVudC5KYW5reSgxLCBuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxJbnRlZ2VyPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShJbnRlZ2VyIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXNwb25zZS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTdHJpbmdXcml0ZXIgc2luayA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzaW5rLCB0cnVlKSk7CisgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCBvbkVycm9yIHdpdGggZXhjZXB0aW9uICIgKyBzaW5rLnRvU3RyaW5nKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgbGF0Y2guYXdhaXQoMTAwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICBhc3NlcnRUcnVlKHJldHVybmVkLmdldCgpKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBTcnZIYW5kbGVyIGltcGxlbWVudHMgSWZhY2UgeworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBmb3IgYSBzdGFuZGFyZCBjYWxsIHRlc3RpbmcKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IEphbmt5KGludCBhcmcpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGFzc2VydEVxdWFscygxLCBhcmcpOworICAgICAgcmV0dXJuIDM7CisgICAgfQorCisgICAgLy8gVXNpbmcgdGhpcyBtZXRob2QgZm9yIHRpbWVvdXQgdGVzdGluZyAtIHNsZWVwcyBmb3IgMSBzZWNvbmQgYmVmb3JlIHJldHVybmluZworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcHJpbWl0aXZlTWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWV0aG9kV2l0aERlZmF1bHRBcmdzKGludCBzb21ldGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Qgc3RydWN0TWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdm9pZE1ldGhvZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbmV3YXlNZXRob2QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoYm9vbGVhbiBzaG91bGRUaHJvd0RlY2xhcmVkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc2hvdWxkVGhyb3dEZWNsYXJlZCkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uV2l0aEFNYXAoImJsYWgiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCEiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGYWlsdXJlTGVzc0NhbGxiYWNrPFQ+IGltcGxlbWVudHMgQXN5bmNNZXRob2RDYWxsYmFjazxUPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICBmYWlsKGV4Y2VwdGlvbik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmYWlsKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICBTdHJpbmdXcml0ZXIgc2luayA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzaW5rLCB0cnVlKSk7CisgICAgZmFpbCgidW5leHBlY3RlZCBlcnJvciAiICsgc2luay50b1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgY2xhc3MgSmFua3lSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICBwcml2YXRlIGludCBudW1DYWxsc187CisgICAgcHJpdmF0ZSBpbnQgbnVtU3VjY2Vzc2VzXyA9IDA7CisgICAgcHJpdmF0ZSBTcnYuQXN5bmNDbGllbnQgY2xpZW50XzsKKworICAgIHB1YmxpYyBKYW5reVJ1bm5hYmxlKGludCBudW1DYWxscykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBudW1DYWxsc18gPSBudW1DYWxsczsKKyAgICAgIGNsaWVudF8gPSBnZXRDbGllbnQoKTsKKyAgICAgIGNsaWVudF8uc2V0VGltZW91dCgyMDAwMCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROdW1TdWNjZXNzZXMoKSB7CisgICAgICByZXR1cm4gbnVtU3VjY2Vzc2VzXzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbGxzXyAmJiAhY2xpZW50Xy5oYXNFcnJvcigpOyBpKyspIHsKKyAgICAgICAgZmluYWwgaW50IGl0ZXJhdGlvbiA9IGk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgLy8gY29ubmVjdCBhbiBhc3luYyBjbGllbnQKKyAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICAgIGNsaWVudF8uSmFua3koMSwgbmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8SW50ZWdlcj4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShJbnRlZ2VyIHJlc3VsdCkgeworICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0LmludFZhbHVlKCkpOworICAgICAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzaW5rID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHNpbmssIHRydWUpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIG9uRXJyb3Igb24gaXRlcmF0aW9uICIgKyBpdGVyYXRpb24gKyAiOiAiICsgc2luay50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworCisgICAgICAgICAgYm9vbGVhbiBjYWxsZWRCYWNrID0gbGF0Y2guYXdhaXQoMzAsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgIGFzc2VydFRydWUoIndhc24ndCBjYWxsZWQgYmFjayBpbiB0aW1lIG9uIGl0ZXJhdGlvbiAiICsgaXRlcmF0aW9uLCBjYWxsZWRCYWNrKTsKKyAgICAgICAgICBhc3NlcnRUcnVlKCJvbkNvbXBsZXRlIG5vdCBjYWxsZWQgb24gaXRlcmF0aW9uICIgKyBpdGVyYXRpb24sIHJldHVybmVkLmdldCgpKTsKKyAgICAgICAgICB0aGlzLm51bVN1Y2Nlc3Nlc18rKzsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBmYWlsKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL0JlbmNobWFya1Byb3RvY29scy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9CZW5jaG1hcmtQcm90b2NvbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgxNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9CZW5jaG1hcmtQcm90b2NvbHMuamF2YQpAQCAtMCwwICsxLDg4IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRml4dHVyZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKKworcHVibGljIGNsYXNzIEJlbmNobWFya1Byb3RvY29scyB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFRQcm90b2NvbEZhY3Rvcnk+IEZBQ1RPUklFUyA9IG5ldyBMaW5rZWRIYXNoU2V0PFRQcm90b2NvbEZhY3Rvcnk+KCl7eworICAgIGFkZChuZXcgVFR1cGxlUHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhZGQobmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhZGQobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICB9fTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1JFUFMgPSAxMDAwMDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fVFJJQUxTID0gMTA7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIE1hcDxUUHJvdG9jb2xGYWN0b3J5LCBMaXN0PExvbmc+PiB0aW1lc0J5RmFjdG9yeSA9IG5ldyBIYXNoTWFwPFRQcm90b2NvbEZhY3RvcnksIExpc3Q8TG9uZz4+KCk7CisKKyAgICBmb3IgKGludCB0cmlhbCA9IDA7IHRyaWFsIDwgTlVNX1RSSUFMUzsgdHJpYWwrKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgfQorLy8gICAgICBUUHJvdG9jb2wgcHJvdG8gPSBmYWN0b3J5LmdldFByb3RvY29sKG5ldyBUVHJhbnNwb3J0KCkgeworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisvLyAgICAgICAgICByZXR1cm4gMDsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBAT3ZlcnJpZGUKKy8vICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisvLyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBPdmVycmlkZQorLy8gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworLy8gICAgICAgIH0KKy8vICAgICAgfSk7CisKKworICAgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgOiBGQUNUT1JJRVMpIHsKKyAgICAgICAgaWYgKHRpbWVzQnlGYWN0b3J5LmdldChmYWN0b3J5KSA9PSBudWxsKSB7CisgICAgICAgICAgdGltZXNCeUZhY3RvcnkucHV0KGZhY3RvcnksIG5ldyBBcnJheUxpc3Q8TG9uZz4oKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgeworICAgICAgICAgIFRQcm90b2NvbCBwcm90byA9IGZhY3RvcnkuZ2V0UHJvdG9jb2wobmV3IFRNZW1vcnlCdWZmZXIoMTI4KjEwMjQpKTsKKyAgICAgICAgICBGaXh0dXJlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0LndyaXRlKHByb3RvKTsKKyAgICAgICAgICBGaXh0dXJlcy5uZXN0aW5nLndyaXRlKHByb3RvKTsKKyAgICAgICAgfQorICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB0aW1lc0J5RmFjdG9yeS5nZXQoZmFjdG9yeSkuYWRkKGVuZC1zdGFydCk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgOiBGQUNUT1JJRVMpIHsKKyAgICAgIExpc3Q8TG9uZz4gdGltZXMgPSB0aW1lc0J5RmFjdG9yeS5nZXQoZmFjdG9yeSk7CisvLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmF3IHRpbWVzIHByZS1kcm9wOiAiICsgdGltZXMgKTsKKyAgICAgIHRpbWVzLnJlbW92ZShDb2xsZWN0aW9ucy5tYXgodGltZXMpKTsKKyAgICAgIGxvbmcgdG90YWwgPSAwOworICAgICAgZm9yIChsb25nIHQgOiB0aW1lcykgeworICAgICAgICB0b3RhbCArPSB0OworICAgICAgfQorICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aW1lcyk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgYXZlcmFnZSB0aW1lOiAiICsgKHRvdGFsIC8gdGltZXMuc2l6ZSgpKSArICJtcyIpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyYXcgdGltZXM6ICIgKyB0aW1lcyk7CisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKaW5kZXggMzY1Y2VmNy4uMDM4NmQ4MyAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtNzMsMTIgKzc0LDI5IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZm9yIChieXRlW10gYiA6IEFycmF5cy5hc0xpc3QobmV3IGJ5dGVbMF0sIG5ldyBieXRlW117MCwxLDIsMyw0LDUsNiw3LDgsOSwxMH0sIG5ldyBieXRlW117MCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sIG5ldyBieXRlWzEyOF0pKSB7CisgICAgZm9yIChieXRlW10gYiA6IEFycmF5cy5hc0xpc3QobmV3IGJ5dGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXXswLDEsMiwzLDQsNSw2LDcsOCw5LDEwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdezAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW117MHg1RH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbXXsoYnl0ZSkweEQ1LChieXRlKTB4NUR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW117KGJ5dGUpMHhGRiwoYnl0ZSkweEQ1LChieXRlKTB4NUR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlWzEyOF0pKSB7CiAgICAgICBpZiAoY2FuQmVVc2VkTmFrZWQoKSkgewogICAgICAgICBpbnRlcm5hbFRlc3ROYWtlZEJpbmFyeShiKTsKICAgICAgIH0KICAgICAgIGludGVybmFsVGVzdEJpbmFyeUZpZWxkKGIpOwogICAgIH0KKworICAgIGlmIChjYW5CZVVzZWROYWtlZCgpKSB7CisgICAgICBieXRlW10gZGF0YSA9IHsxLCAyLCAzLCA0LCA1LCA2fTsKKworICAgICAgVE1lbW9yeUJ1ZmZlciBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICAgIFRQcm90b2NvbCBwcm90byA9IGdldEZhY3RvcnkoKS5nZXRQcm90b2NvbChidWYpOworICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcChkYXRhKTsKKyAgICAgIGJiLmdldCgpOworICAgICAgcHJvdG8ud3JpdGVCaW5hcnkoYmIuc2xpY2UoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGRhdGEsIDEsIDUpLCBwcm90by5yZWFkQmluYXJ5KCkpOworICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTIzMSwxOCArMjQ5LDE4IEBACiAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbFRlc3ROYWtlZEJpbmFyeShieXRlW10gZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgVE1lbW9yeUJ1ZmZlciBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKICAgICBUUHJvdG9jb2wgcHJvdG8gPSBnZXRGYWN0b3J5KCkuZ2V0UHJvdG9jb2woYnVmKTsKLSAgICBwcm90by53cml0ZUJpbmFyeShkYXRhKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZGF0YSwgcHJvdG8ucmVhZEJpbmFyeSgpKSk7CisgICAgcHJvdG8ud3JpdGVCaW5hcnkoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpKTsKKyAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpLCBwcm90by5yZWFkQmluYXJ5KCkpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGludGVybmFsVGVzdEJpbmFyeUZpZWxkKGZpbmFsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBpbnRlcm5hbFRlc3RTdHJ1Y3RGaWVsZChuZXcgU3RydWN0RmllbGRUZXN0Q2FzZShUVHlwZS5TVFJJTkcsIChzaG9ydCkxNSkgewogICAgICAgcHVibGljIHZvaWQgd3JpdGVNZXRob2QoVFByb3RvY29sIHByb3RvKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByb3RvLndyaXRlQmluYXJ5KGRhdGEpOworICAgICAgICBwcm90by53cml0ZUJpbmFyeShCeXRlQnVmZmVyLndyYXAoZGF0YSkpOwogICAgICAgfQogCiAgICAgICBwdWJsaWMgdm9pZCByZWFkTWV0aG9kKFRQcm90b2NvbCBwcm90bykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZGF0YSwgcHJvdG8ucmVhZEJpbmFyeSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoZGF0YSksIHByb3RvLnJlYWRCaW5hcnkoKSk7CiAgICAgICB9CiAgICAgfSk7CiAgIH0KQEAgLTMwNSw2ICszMjMsMTUgQEAKIAogICAgICAgcHVibGljIHZvaWQgbWV0aG9kV2l0aERlZmF1bHRBcmdzKGludCBzb21ldGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbmV3YXlNZXRob2QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoYm9vbGVhbiBzaG91bGRUaHJvdykgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2hvdWxkVGhyb3c7CisgICAgICB9CiAgICAgfTsKIAogICAgIFNydi5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9IG5ldyBTcnYuUHJvY2Vzc29yKGhhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0U2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0U2hvcnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTc4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RTaG9ydFN0YWNrLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RTaG9ydFN0YWNrIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RPcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxKTsKKyAgICBzLnB1c2goKHNob3J0KTEwKTsKKyAgICBzLnB1c2goKHNob3J0KTExKTsKKyAgICBzLnB1c2goKHNob3J0KTEyKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBvcCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTExLCBzLnBvcCgpKTsKKyAgICBzLnB1c2goKHNob3J0KTQwKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTQwLCBzLnBvcCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEwLCBzLnBvcCgpKTsKKyAgICB0cnkgeworICAgICAgcy5wb3AoKTsKKyAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHlheQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEJpbmFyeVByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQmluYXJ5UHJvdG9jb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmZDkzNy4uMDAwMDAwMAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQmluYXJ5UHJvdG9jb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKLQotcHVibGljIGNsYXNzIFRlc3RUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbkJlVXNlZE5ha2VkKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQ29tcGFjdFByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQ29tcGFjdFByb3RvY29sLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmYjEzNGU2Li5iNGMwODg4Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRDb21wYWN0UHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQ29tcGFjdFByb3RvY29sLmphdmEKQEAgLTIwLDggKzIwLDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuQm9uazsKIAogcHVibGljIGNsYXNzIFRlc3RUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgUHJvdG9jb2xUZXN0QmFzZSB7CiAgIEBPdmVycmlkZQpAQCAtMzQsNiArMzYsMjAgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCisgIHB1YmxpYyB2b2lkIHRlc3RPT01EZW5pYWxPZlNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBTdHJ1Y3QgaGVhZGVyLCBJbnRlZ2VyLk1BWF9WQUxVRSBsZW5ndGgsIGFuZCBvbmx5IG9uZSByZWFsCisgICAgLy8gYnl0ZSBvZiBkYXRhCisgICAgYnl0ZSBbXSBieXRlcyA9IHsyNCwgLTEsIC0xLCAtMSwgLTE3LCA0OX07CisgICAgVERlc2VyaWFsaXplciBkZXNlciA9IG5ldyBURGVzZXJpYWxpemVyKG5ldyBUQ29tcGFjdFByb3RvY29sCisJCQkJCSAgICAuRmFjdG9yeSgxMDAwKSk7CisgICAgQm9uayBib25rID0gbmV3IEJvbmsoKTsKKyAgICB0cnkgeworCWRlc2VyLmRlc2VyaWFsaXplKGJvbmssIGJ5dGVzKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKwkvLyBJZ25vcmUgYXMgd2UgYXJlIG9ubHkgY2hlY2tpbmcgZm9yIE9PTSBpbiB0aGUgZmFpbHVyZSBjYXNlCisgICAgfQorICB9CisKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgbmV3IFRlc3RUQ29tcGFjdFByb3RvY29sKCkuYmVuY2htYXJrKCk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YQppbmRleCBkNzM3NmFjLi5jMmNhMWZhIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhCkBAIC0xOCw2ICsxOCwxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOworCiBwdWJsaWMgY2xhc3MgVGVzdFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGdldEZhY3RvcnkoKSB7CkBAIC0yOCw0ICszNCwxNSBAQAogICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZVVzZWROYWtlZCgpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlZFVuaWNvZGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGpzb25TdHJpbmcgPSAiXCJoZWxsbyB1bmljb2RlIFxcdTBlMDFcXHVkODM0XFx1ZGQxZSB3b3JsZFwiIjsKKyAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSAiaGVsbG8gdW5pY29kZSBcdTBlMDFcdWQ4MzRcdWRkMWUgd29ybGQiOworCisgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcigxMDAwKTsKKyAgICBUSlNPTlByb3RvY29sIHByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKTsKKyAgICBidWZmZXIud3JpdGUoanNvblN0cmluZy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHByb3RvY29sLnJlYWRTdHJpbmcoKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWNmNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFByb3RvY29sVXRpbCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0R3Vlc3NQcm90b2NvbEZhY3RvcnlfSlNPTigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgYnl0ZVtdIGRhdGEgPSAie2Zvb30iLmdldEJ5dGVzKCk7CisgICAgVFByb3RvY29sRmFjdG9yeSBmYWN0b3J5ID0gVFByb3RvY29sVXRpbC5ndWVzc1Byb3RvY29sRmFjdG9yeShkYXRhLCBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCkpOworICAgIGFzc2VydFRydWUoZmFjdG9yeSBpbnN0YW5jZW9mIFRKU09OUHJvdG9jb2wuRmFjdG9yeSk7CisKKyAgICAvLyBNYWtlIHN1cmUgZGF0YSBzZXJpYWxpemVkIHdpdGggVENvbXBhY3QgYW5kIHdoaWNoIHN0YXJ0cyB3aXRoICd7JworICAgIC8vIGlzIG5vdCBtaXN0YWtlbmx5IGd1ZXNzZWQgYXMgc2VyaWFsaXplZCB3aXRoIEpTT04uCisKKyAgICBHdWVzc1Byb3RvY29sU3RydWN0IHMgPSBuZXcgR3Vlc3NQcm90b2NvbFN0cnVjdCgpOworICAgIHMucHV0VG9NYXBfZmllbGQoIn0iLCJ9Iik7CisgICAgYnl0ZVtdIHNlciA9IG5ldyBUU2VyaWFsaXplcihuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCkpLnNlcmlhbGl6ZShzKTsKKyAgICBmYWN0b3J5ID0gVFByb3RvY29sVXRpbC5ndWVzc1Byb3RvY29sRmFjdG9yeShzZXIsIG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgYXNzZXJ0RmFsc2UoZmFjdG9yeSBpbnN0YW5jZW9mIFRKU09OUHJvdG9jb2wuRmFjdG9yeSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0R3Vlc3NQcm90b2NvbEZhY3RvcnlfQmluYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQ2hlY2sgdGhhdCBhIGxhc3QgYnl0ZSAhPSAwIGlzIGNvcnJlY3RseSByZXBvcnRlZCBhcyBCaW5hcnkKKworICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxXTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBidWZbMF0gPSAoYnl0ZSkgaTsKKyAgICAgIFRQcm90b2NvbEZhY3RvcnkgZmFjdG9yeSA9IFRQcm90b2NvbFV0aWwuZ3Vlc3NQcm90b2NvbEZhY3RvcnkoYnVmLCBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCkpOworICAgICAgYXNzZXJ0VHJ1ZShmYWN0b3J5IGluc3RhbmNlb2YgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgYSBzZWNvbmQgYnl0ZSBzZXQgdG8gMCBpcyByZXBvcnRlZCBhcyBCaW5hcnkKKyAgICBidWYgPSBuZXcgYnl0ZVsyXTsKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgPSBUUHJvdG9jb2xVdGlsLmd1ZXNzUHJvdG9jb2xGYWN0b3J5KGJ1ZiwgbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhc3NlcnRUcnVlKGZhY3RvcnkgaW5zdGFuY2VvZiBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0R3Vlc3NQcm90b2NvbEZhY3RvcnlfQ29tcGFjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIENoZWNrIHRoYXQgYSBmaXJzdCBieXRlID4gMHgxMCBpcyByZXBvcnRlZCBhcyBDb21wYWN0CisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzNdOworICAgIGJ1ZlswXSA9IDB4MTE7IAorICAgIFRQcm90b2NvbEZhY3RvcnkgZmFjdG9yeSA9IFRQcm90b2NvbFV0aWwuZ3Vlc3NQcm90b2NvbEZhY3RvcnkoYnVmLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgYXNzZXJ0VHJ1ZShmYWN0b3J5IGluc3RhbmNlb2YgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KTsKKworICAgIC8vIENoZWNrIHRoYXQgc2Vjb25kIGJ5dGUgPj0gMHg4MCBpcyByZXBvcnRlZCBhcyBDb21wYWN0CisgICAgYnVmWzBdID0gMDsKKyAgICBmb3IgKGludCBpID0gMHg4MDsgaSA8IDB4MTAwOyBpKyspIHsKKyAgICAgIGJ1ZlsxXSA9IChieXRlKSBpOworICAgICAgZmFjdG9yeSA9IFRQcm90b2NvbFV0aWwuZ3Vlc3NQcm90b2NvbEZhY3RvcnkoYnVmLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSk7CisgICAgICBhc3NlcnRUcnVlKGZhY3RvcnkgaW5zdGFuY2VvZiBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHdWVzc1Byb3RvY29sRmFjdG9yeV9VbmRlY2lkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbM107CisgICAgYnVmWzFdID0gMHg3ZTsKKyAgICBUUHJvdG9jb2xGYWN0b3J5IGZhY3RvcnkgPSBUUHJvdG9jb2xVdGlsLmd1ZXNzUHJvdG9jb2xGYWN0b3J5KGJ1ZiwgbmV3IFRTaW1wbGVKU09OUHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBhc3NlcnRUcnVlKGZhY3RvcnkgaW5zdGFuY2VvZiBUU2ltcGxlSlNPTlByb3RvY29sLkZhY3RvcnkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxMjViMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRml4dHVyZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKKworaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuSG9seU1vbGV5OworCitwdWJsaWMgY2xhc3MgVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgVE1lbW9yeUJ1ZmZlciBidWY7CisgIHByaXZhdGUgVFNpbXBsZUpTT05Qcm90b2NvbCBwcm90bzsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigxMDAwKTsKKyAgICBwcm90byA9IG5ldyBUU2ltcGxlSlNPTlByb3RvY29sKGJ1Zik7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBidWZUb1N0cmluZygpIHsKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEhvbHlNb2xleSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBmaW5hbCBIb2x5TW9sZXkgaG9seU1vbGV5ID0gRml4dHVyZXMuaG9seU1vbGV5LmRlZXBDb3B5KCk7CisgICAgLy8gdW5zZXQgc2V0cyB0aGF0IHByb2R1Y2UgaW5jb25zaXN0ZW50IG9yZGVyaW5nIGJldHdlZW4gSkRLNy84CisgICAgaG9seU1vbGV5LnVuc2V0Qm9ua3MoKTsKKyAgICBob2x5TW9sZXkudW5zZXRDb250YWluKCk7CisgICAgaG9seU1vbGV5LndyaXRlKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoIntcImJpZ1wiOlt7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOjM1LFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119LHtcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6LTQyLFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119XX0iLCBidWZUb1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROZXN0aW5nKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIEZpeHR1cmVzLm5lc3Rpbmcud3JpdGUocHJvdG8pOworICAgIGFzc2VydEVxdWFscygie1wibXlfYm9ua1wiOntcInR5cGVcIjozMTMzNyxcIm1lc3NhZ2VcIjpcIkkgYW0gYSBib25rLi4uIHhvciFcIn0sXCJteV9vb2VcIjp7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOi00MixcImludGVnZXIxNlwiOjI3MDAwLFwiaW50ZWdlcjMyXCI6MTY3NzcyMTYsXCJpbnRlZ2VyNjRcIjo2MDAwMDAwMDAwLFwiZG91YmxlX3ByZWNpc2lvblwiOjMuMTQxNTkyNjUzNTg5NzkzLFwic29tZV9jaGFyYWN0ZXJzXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCIsXCJ6b21nX3VuaWNvZGVcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrvv73igLxcIixcIndoYXRfd2hvXCI6MCxcImJhc2U2NFwiOlwiYmFzZTY0XCIsXCJieXRlX2xpc3RcIjpbMSwyLDNdLFwiaTE2X2xpc3RcIjpbMSwyLDNdLFwiaTY0X2xpc3RcIjpbMSwyLDNdfX0iLCBidWZUb1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPbmVPZkVhY2goKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgRml4dHVyZXMub25lT2ZFYWNoLndyaXRlKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoIntcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6LTQyLFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119IiwgYnVmVG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FuZVBhcnRzT2ZDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIC8vIHVuc2V0IGFsbCB0aGUgbWFwcyB3aXRoIGNvbnRhaW5lciBrZXlzCisgICAgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCBzdHJ1Y3QgPSBGaXh0dXJlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0LmRlZXBDb3B5KCk7CisgICAgc3RydWN0LnVuc2V0TGlzdF9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldFNldF9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldE1hcF9ieXRlX21hcCgpOworICAgIC8vIHVuc2V0IHNldHMgYW5kIG1hcHMgdGhhdCBwcm9kdWNlIGluY29uc2lzdGVudCBvcmRlcmluZyBiZXR3ZWVuIEpESzcvOAorICAgIHN0cnVjdC51bnNldEJ5dGVfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STE2X3NldCgpOworICAgIHN0cnVjdC51bnNldEk2NF9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXREb3VibGVfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0U3RyaW5nX3NldCgpOworICAgIHN0cnVjdC51bnNldEkxNl9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldEkzMl9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldEk2NF9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldERvdWJsZV9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldFN0cmluZ19ieXRlX21hcCgpOworICAgIHN0cnVjdC53cml0ZShwcm90byk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhX2J5dGVcIjoxMjcsXCJhX2kxNlwiOjMyMDAwLFwiYV9pMzJcIjoxMDAwMDAwMDAwLFwiYV9pNjRcIjoxMDk5NTExNjI3Nzc1LFwiYV9kb3VibGVcIjo1LjY3ODksXCJhX3N0cmluZ1wiOlwibXkgc3RyaW5nXCIsXCJhX2JpbmFyeVwiOlwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcIixcInRydWVfZmllbGRcIjoxLFwiZmFsc2VfZmllbGRcIjowLFwiZW1wdHlfc3RydWN0X2ZpZWxkXCI6e30sXCJieXRlX2xpc3RcIjpbLTEyNywtMSwwLDEsMTI3XSxcImkxNl9saXN0XCI6Wy0xLDAsMSwzMjc2N10sXCJpMzJfbGlzdFwiOlstMSwwLDI1NSw2NTUzNSwxNjc3NzIxNSwyMTQ3NDgzNjQ3XSxcImk2NF9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDQyOTQ5NjcyOTUsMTA5OTUxMTYyNzc3NSwyODE0NzQ5NzY3MTA2NTUsNzIwNTc1OTQwMzc5Mjc5MzUsOTIyMzM3MjAzNjg1NDc3NTgwN10sXCJkb3VibGVfbGlzdFwiOlswLjEsMC4yLDAuM10sXCJzdHJpbmdfbGlzdFwiOltcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCJdLFwiYm9vbGVhbl9saXN0XCI6WzEsMSwxLDAsMCwwXSxcInN0cnVjdF9saXN0XCI6W3t9LHt9XSxcImkzMl9zZXRcIjpbMSwyLDNdLFwiYm9vbGVhbl9zZXRcIjpbMCwxXSxcInN0cnVjdF9zZXRcIjpbe31dLFwiYnl0ZV9ieXRlX21hcFwiOntcIjFcIjoyfSxcImJvb2xlYW5fYnl0ZV9tYXBcIjp7XCIwXCI6MCxcIjFcIjoxfSxcImJ5dGVfaTE2X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjMyNzY3fSxcImJ5dGVfaTMyX21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjIxNDc0ODM2NDd9LFwiYnl0ZV9pNjRfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6OTIyMzM3MjAzNjg1NDc3NTgwN30sXCJieXRlX2RvdWJsZV9tYXBcIjp7XCIxXCI6MC4xLFwiMlwiOi0wLjEsXCIzXCI6MTAwMDAwMC4xfSxcImJ5dGVfc3RyaW5nX21hcFwiOntcIjFcIjpcIlwiLFwiMlwiOlwiYmxhaFwiLFwiM1wiOlwibG9vb29vb29vb29vb29vbmcgc3RyaW5nXCJ9LFwiYnl0ZV9ib29sZWFuX21hcFwiOntcIjFcIjoxLFwiMlwiOjB9LFwiYnl0ZV9tYXBfbWFwXCI6e1wiMFwiOnt9LFwiMVwiOntcIjFcIjoxfSxcIjJcIjp7XCIxXCI6MSxcIjJcIjoyfX0sXCJieXRlX3NldF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfSxcImJ5dGVfbGlzdF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfX0iLCBidWZUb1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd3NPbkNvbGxlY3Rpb25LZXlzKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBGaXh0dXJlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0LndyaXRlKHByb3RvKTsKKyAgICAgIGZhaWwoInRoaXMgc2hvdWxkIHRocm93IGEgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRTaW1wbGVKU09OUHJvdG9jb2wuQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFR1cGxlUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRUdXBsZVByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NGRiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRUdXBsZVByb3RvY29sLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlREZXNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6ZXI7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5UdXBsZVByb3RvY29sVGVzdFN0cnVjdDsKKworCitwdWJsaWMgY2xhc3MgVGVzdFRUdXBsZVByb3RvY29sIGV4dGVuZHMgUHJvdG9jb2xUZXN0QmFzZSB7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIGNhbkJlVXNlZE5ha2VkKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBnZXRGYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgVFR1cGxlUHJvdG9jb2wuRmFjdG9yeSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEJpdHNldExlbmd0aElzc3VlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3QgdDEgPSBuZXcgVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3QoKTsKKyAgICB0MS5zZXRGaWVsZDEoMCk7CisgICAgdDEuc2V0RmllbGQyKDEyKTsKKyAgICBuZXcgVERlc2VyaWFsaXplcihuZXcgVFR1cGxlUHJvdG9jb2wuRmFjdG9yeSgpKS5kZXNlcmlhbGl6ZShuZXcgVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3QoKSwgbmV3IFRTZXJpYWxpemVyKG5ldyBUVHVwbGVQcm90b2NvbC5GYWN0b3J5KCkpLnNlcmlhbGl6ZSh0MSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NjaGVtZS9UZXN0U3RhbmRhcmRTY2hlbWUuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2NoZW1lL1Rlc3RTdGFuZGFyZFNjaGVtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjIyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NjaGVtZS9UZXN0U3RhbmRhcmRTY2hlbWUuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkZpeHR1cmVzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlREZXNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCitpbXBvcnQgdGhyaWZ0LnRlc3QuSG9seU1vbGV5OworaW1wb3J0IHRocmlmdC50ZXN0Lk5lc3Rpbmc7CitpbXBvcnQgdGhyaWZ0LnRlc3QuT25lT2ZFYWNoOworCitwdWJsaWMgY2xhc3MgVGVzdFN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgVGVzdENhc2UgeworICBUU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFRTZXJpYWxpemVyKCk7CisgIFREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIoKTsKKworICAvKioKKyAgICogVGhpcyB0ZXN0cyB3aGV0aGVyIHRoZSBTdGFuZGFyZCBTY2hlbWUgcHJvcGVybHkgcmVhZHMgc3RydWN0cyBzZXJpYWxpemVkCisgICAqIHVzaW5nIGFuIG9sZGVyIHZlcnNpb24gb2YgdGhyaWZ0LgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRTdHJ1Y3RzKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRBbmRDb21wYXJlKG5ldyBPbmVPZkVhY2goKSwgRml4dHVyZXMub25lT2ZFYWNoLCBGaXh0dXJlcy5wZXJzaXN0ZW50Qnl0ZXNPbmVPZkVhY2gpOworICAgIHJlYWRBbmRDb21wYXJlKG5ldyBIb2x5TW9sZXkoKSwgRml4dHVyZXMuaG9seU1vbGV5LCBGaXh0dXJlcy5wZXJzaXN0ZW50Qnl0ZXNIb2x5TW9sZXkpOworICAgIHJlYWRBbmRDb21wYXJlKG5ldyBOZXN0aW5nKCksIEZpeHR1cmVzLm5lc3RpbmcsIEZpeHR1cmVzLnBlcnNpc3RlbnRCeXRlc05lc3RpbmcpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZEFuZENvbXBhcmUoVEJhc2Ugc3RydWN0LCBUQmFzZSBmaXh0dXJlLCBieXRlW10gaW5wdXRCeXRlcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICB0cmFucy53cml0ZShpbnB1dEJ5dGVzLCAwLCBpbnB1dEJ5dGVzLmxlbmd0aCk7CisgICAgVFByb3RvY29sIGlwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucyk7CisgICAgc3RydWN0LnJlYWQoaXByb3QpOworICAgIGFzc2VydEVxdWFscyhmaXh0dXJlLCBzdHJ1Y3QpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQppbmRleCBhZTU2N2MyLi4xZGVlMjJkIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKQEAgLTI2LDEwICsyNiwxMyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CkBAIC0zNyw2ICs0MCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0LkZhY3Rvcnk7CiAKIGltcG9ydCB0aHJpZnQudGVzdC5JbnNhbml0eTsKIGltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OwpAQCAtNDksMzggKzU0LDU0IEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyVGVzdEJhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuSWZhY2UgewotICAKKwogICAgIHB1YmxpYyBUZXN0SGFuZGxlcigpIHt9Ci0gIAorCiAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Vm9pZCgpXG4iKTsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFN0cmluZyB0ZXN0U3RyaW5nKFN0cmluZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKKyAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0Qm9vbChib29sZWFuIHRoaW5nKSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qm9vbCgiICsgdGhpbmcgKyAiKVxuIik7CisgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCiAgICAgcHVibGljIGJ5dGUgdGVzdEJ5dGUoYnl0ZSB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJ5dGUoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgaW50IHRlc3RJMzIoaW50IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0STMyKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0STY0KCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGRvdWJsZSB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdERvdWJsZSgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKworICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRlc3RCaW5hcnkoQnl0ZUJ1ZmZlciB0aGluZykgeworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaW5nLnJlbWFpbmluZygpICogMyk7CisgICAgICB0aGluZy5tYXJrKCk7CisgICAgICB3aGlsZSAodGhpbmcucmVtYWluaW5nKCkgPiAwKSB7CisgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMDJYICIsIHRoaW5nLmdldCgpKSk7CisgICAgICB9CisgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0QmluYXJ5KCIgKyBzYi50b1N0cmluZygpICsgIilcbiIpOworICAgICAgdGhpbmcucmVzZXQoKTsKKyAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKICAgICBwdWJsaWMgWHRydWN0IHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U3RydWN0KHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHRoaW5nLnN0cmluZ190aGluZyArICJcIiwgIiArCkBAIC04OSw3ICsxMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5pNjRfdGhpbmcgKyAifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpIHsKICAgICAgIFh0cnVjdCB0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOwogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE5lc3QoeyIgKwpAQCAtMTAxLDIyICsxMjIsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5pMzJfdGhpbmcgKyAifSlcbiIpOwogICAgICAgcmV0dXJuIG5lc3Q7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBNYXA8SW50ZWdlcixJbnRlZ2VyPiB0ZXN0TWFwKE1hcDxJbnRlZ2VyLEludGVnZXI+IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TWFwKHsiKTsKLSAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgZm9yIChpbnQga2V5IDogdGhpbmcua2V5U2V0KCkpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgdGhpbmcuZ2V0KGtleSkpOwotICAgICAgfQorICAgICAgU3lzdGVtLm91dC5wcmludCh0aGluZyk7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gdGVzdFN0cmluZ01hcChNYXA8U3RyaW5nLFN0cmluZz4gdGhpbmcpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTdHJpbmdNYXAoeyIpOworICAgICAgU3lzdGVtLm91dC5wcmludCh0aGluZyk7CisgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CisgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCiAgICAgcHVibGljIFNldDxJbnRlZ2VyPiB0ZXN0U2V0KFNldDxJbnRlZ2VyPiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFNldCh7Iik7CiAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKQEAgLTEzMSw3ICsxNTEsNyBAQAogICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiB0ZXN0TGlzdChMaXN0PEludGVnZXI+IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TGlzdCh7Iik7CiAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKQEAgLTE0Niw4MCArMTY2LDU4IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBOdW1iZXJ6IHRlc3RFbnVtKE51bWJlcnogdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGxvbmcgdGVzdFR5cGVkZWYobG9uZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFR5cGVkZWYoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IHRlc3RNYXBNYXAoaW50IGhlbGxvKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TWFwTWFwKCIgKyBoZWxsbyArICIpXG4iKTsKICAgICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtYXBtYXAgPQogICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAKKwogICAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IHBvcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBuZWcgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgICBwb3MucHV0KGksIGkpOwogICAgICAgICBuZWcucHV0KC1pLCAtaSk7CiAgICAgICB9Ci0gIAorCiAgICAgICBtYXBtYXAucHV0KDQsIHBvcyk7CiAgICAgICBtYXBtYXAucHV0KC00LCBuZWcpOwotICAKKwogICAgICAgcmV0dXJuIG1hcG1hcDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+IHRlc3RJbnNhbml0eShJbnNhbml0eSBhcmd1bWVudCkgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEluc2FuaXR5KClcbiIpOwotICAKLSAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7Ci0gICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgICAgaGVsbG8uaTY0X3RoaW5nID0gMjsKLSAgCi0gICAgICBYdHJ1Y3QgZ29vZGJ5ZSA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKLSAgICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IChieXRlKTQ7Ci0gICAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7Ci0gICAgICBnb29kYnllLmk2NF90aGluZyA9IChsb25nKTQ7Ci0gIAotICAgICAgSW5zYW5pdHkgY3JhenkgPSBuZXcgSW5zYW5pdHkoKTsKLSAgICAgIGNyYXp5LnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOwotICAgICAgY3JhenkueHRydWN0cyA9IG5ldyBBcnJheUxpc3Q8WHRydWN0PigpOwotICAKLSAgICAgIGNyYXp5LnVzZXJNYXAucHV0KE51bWJlcnouRUlHSFQsIChsb25nKTgpOwotICAgICAgY3JhenkueHRydWN0cy5hZGQoZ29vZGJ5ZSk7Ci0gIAotICAgICAgSW5zYW5pdHkgbG9vbmV5ID0gbmV3IEluc2FuaXR5KCk7Ci0gICAgICBjcmF6eS51c2VyTWFwLnB1dChOdW1iZXJ6LkZJVkUsIChsb25nKTUpOwotICAgICAgY3JhenkueHRydWN0cy5hZGQoaGVsbG8pOwotICAKKwogICAgICAgSGFzaE1hcDxOdW1iZXJ6LEluc2FuaXR5PiBmaXJzdF9tYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKICAgICAgIEhhc2hNYXA8TnVtYmVyeixJbnNhbml0eT4gc2Vjb25kX21hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIEluc2FuaXR5PigpOzsKLSAgCi0gICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVFdPLCBjcmF6eSk7Ci0gICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVEhSRUUsIGNyYXp5KTsKLSAgCisKKyAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5UV08sIGFyZ3VtZW50KTsKKyAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5USFJFRSwgYXJndW1lbnQpOworCisgICAgICBJbnNhbml0eSBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKICAgICAgIHNlY29uZF9tYXAucHV0KE51bWJlcnouU0lYLCBsb29uZXkpOwotICAKKwogICAgICAgTWFwPExvbmcsTWFwPE51bWJlcnosSW5zYW5pdHk+PiBpbnNhbmUgPQogICAgICAgICBuZXcgSGFzaE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+KCk7CiAgICAgICBpbnNhbmUucHV0KChsb25nKTEsIGZpcnN0X21hcCk7CiAgICAgICBpbnNhbmUucHV0KChsb25nKTIsIHNlY29uZF9tYXApOwotICAKKwogICAgICAgcmV0dXJuIGluc2FuZTsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBNYXA8U2hvcnQsU3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSkgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE11bHRpKClcbiIpOwotICAKKwogICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOzsKICAgICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwogICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CkBAIC0yMjcsMTggKzIyNSwyNCBAQAogICAgICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKICAgICAgIHJldHVybiBoZWxsbzsKICAgICB9Ci0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZykgdGhyb3dzIFhjZXB0aW9uIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZykgdGhyb3dzIFhjZXB0aW9uLCBURXhjZXB0aW9uIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFeGNlcHRpb24oIithcmcrIilcbiIpOwotICAgICAgaWYgKGFyZy5lcXVhbHMoIlhjZXB0aW9uIikpIHsKKyAgICAgIGlmICgiWGNlcHRpb24iLmVxdWFscyhhcmcpKSB7CiAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKICAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwotICAgICAgICB4Lm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgICAgIHgubWVzc2FnZSA9IGFyZzsKICAgICAgICAgdGhyb3cgeDsKKyAgICAgIH0gZWxzZSBpZiAoIlRFeGNlcHRpb24iLmVxdWFscyhhcmcpKSB7CisgICAgICAgIC8vIFVuc3BlY2lmaWVkIGV4Y2VwdGlvbiBzaG91bGQgeWllbGQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gb24gY2xpZW50IHNpZGUKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYXJnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFh0cnVjdCByZXN1bHQgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmc7CiAgICAgICB9CiAgICAgICByZXR1cm47CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhjZXB0aW9uLCBYY2VwdGlvbjIgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE11bHRpRXhjZXB0aW9uKCIgKyBhcmcwICsgIiwgIiArIGFyZzEgKyAiKVxuIik7CiAgICAgICBpZiAoYXJnMC5lcXVhbHMoIlhjZXB0aW9uIikpIHsKQEAgLTI1MywxNyArMjU3LDE3IEBACiAgICAgICAgIHguc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CiAgICAgICAgIHRocm93IHg7CiAgICAgICB9Ci0gIAorCiAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOwogICAgICAgcmVzdWx0LnN0cmluZ190aGluZyA9IGFyZzE7CiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgdm9pZCB0ZXN0T25ld2F5KGludCBzbGVlcEZvcikgewogICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0T25ld2F5KCIgKyBJbnRlZ2VyLnRvU3RyaW5nKHNsZWVwRm9yKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIikgPT4gc2xlZXBpbmcuLi4iKTsKICAgICAgIHRyeSB7Ci0gICAgICAgIFRocmVhZC5zbGVlcChzbGVlcEZvciAqIDEwMDApOworICAgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBGb3IgKiBTTEVFUF9ERUxBWSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSBzbGVlcGluZyEiKTsKICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllKTsKQEAgLTI3NSwxNyArMjc5LDMwIEBACiAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKICAgICAgIG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKSk7CiAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJsb2NhbGhvc3QiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQT1JUID0gOTA5MDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVQgPSAxMDAwOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gImxvY2FsaG9zdCI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlQgPSBJbnRlZ2VyLnZhbHVlT2YoCisgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnBvcnQiLCAiOTA5MCIpKTsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0xFRVBfREVMQVkgPSAxMDAwOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfVElNRU9VVCA9IDE1MDA7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFh0cnVjdCBYU1RSVUNUID0gbmV3IFh0cnVjdCgiWmVybyIsIChieXRlKSAxLCAtMywgLTUpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYdHJ1Y3QyIFhTVFJVQ1QyID0gbmV3IFh0cnVjdDIoKGJ5dGUpMSwgWFNUUlVDVCwgNSk7CiAKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5KSB0aHJvd3MgRXhjZXB0aW9uOworICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHRocm93cyBFeGNlcHRpb257CisgICAgc3RhcnRTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b0ZhY3RvcnksIG51bGwpOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgRXhjZXB0aW9uOwogCiAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3BTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uOwogCi0gIHB1YmxpYyBhYnN0cmFjdCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb247CisgIHB1YmxpYyBhYnN0cmFjdCBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpIHRocm93cyBFeGNlcHRpb247CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RCb29sKFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBib29sZWFuIHQgPSB0ZXN0Q2xpZW50LnRlc3RCb29sKHRydWUpOworICAgIGFzc2VydEVxdWFscyh0cnVlLCB0KTsKKyAgICBib29sZWFuIGYgPSB0ZXN0Q2xpZW50LnRlc3RCb29sKGZhbHNlKTsKKyAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGYpOworICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RCeXRlKFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIGk4ID0gdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkxKTsKQEAgLTMxOCw3ICszMzUsNyBAQAogICAvLyB0b2RvOiBhZGQgYXNzZXJ0aW9ucwogICBwcml2YXRlIHZvaWQgdGVzdEluc2FuaXR5KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBJbnNhbml0eSBpbnNhbmU7Ci0gIAorCiAgICAgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CiAgICAgaW5zYW5lLnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOwogICAgIGluc2FuZS51c2VyTWFwLnB1dChOdW1iZXJ6LkZJVkUsIChsb25nKTUwMDApOwpAQCAtMzM2LDcgKzM1Myw3IEBACiAgICAgZm9yIChsb25nIGtleSA6IHdob2Eua2V5U2V0KCkpIHsKICAgICAgIE1hcDxOdW1iZXJ6LEluc2FuaXR5PiB2YWwgPSB3aG9hLmdldChrZXkpOwogICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+IHsiKTsKLSAgCisKICAgICAgIGZvciAoTnVtYmVyeiBrMiA6IHZhbC5rZXlTZXQoKSkgewogICAgICAgICBJbnNhbml0eSB2MiA9IHZhbC5nZXQoazIpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7CkBAIC0zNDgsNyArMzY1LDcgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7Ci0gIAorCiAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIueHRydWN0czsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOwogICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKSB7CkBAIC0zNTcsNyArMzc0LDcgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSIpOwotICAKKwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKICAgICAgIH0KICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwpAQCAtMzY1LDI3ICszODIsMjggQEAKICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKICAgfQogCisgIHB1YmxpYyBib29sZWFuIHVzZUFzeW5jUHJvY2Vzc29yKCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKLSAgICBmb3IgKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5IDogUFJPVE9DT0xTKSB7Ci0gICAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7Ci0gICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoaGFuZGxlcik7CisgICAgZm9yIChUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSA6IGdldFByb3RvY29scygpKSB7CisgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHVzZUFzeW5jUHJvY2Vzc29yKCkgPyBuZXcgVGhyaWZ0VGVzdC5Bc3luY1Byb2Nlc3NvcjxBc3luY1Rlc3RIYW5kbGVyPihuZXcgQXN5bmNUZXN0SGFuZGxlcigpKSA6IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4obmV3IFRlc3RIYW5kbGVyKCkpOwogCiAgICAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSk7CiAKLSAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OwotCiAgICAgICBUU29ja2V0IHNvY2tldCA9IG5ldyBUU29ja2V0KEhPU1QsIFBPUlQpOwogICAgICAgc29ja2V0LnNldFRpbWVvdXQoU09DS0VUX1RJTUVPVVQpOwotICAgICAgdHJhbnNwb3J0ID0gc29ja2V0OwotICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gZ2V0Q2xpZW50VHJhbnNwb3J0KHNvY2tldCk7CiAKICAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHByb3RvRmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpOwogICAgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CiAKLSAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICBvcGVuKHRyYW5zcG9ydCk7CiAgICAgICB0ZXN0Vm9pZCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RTdHJpbmcodGVzdENsaWVudCk7CisgICAgICB0ZXN0Qm9vbCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RCeXRlKHRlc3RDbGllbnQpOwogICAgICAgdGVzdEkzMih0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RJNjQodGVzdENsaWVudCk7CkBAIC0zOTMsMTkgKzQxMSwzMSBAQAogICAgICAgdGVzdFN0cnVjdCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3ROZXN0ZWRTdHJ1Y3QodGVzdENsaWVudCk7CiAgICAgICB0ZXN0TWFwKHRlc3RDbGllbnQpOworICAgICAgdGVzdFN0cmluZ01hcCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RTZXQodGVzdENsaWVudCk7CiAgICAgICB0ZXN0TGlzdCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RFbnVtKHRlc3RDbGllbnQpOwogICAgICAgdGVzdFR5cGVkZWYodGVzdENsaWVudCk7CiAgICAgICB0ZXN0TmVzdGVkTWFwKHRlc3RDbGllbnQpOwogICAgICAgdGVzdEluc2FuaXR5KHRlc3RDbGllbnQpOworICAgICAgdGVzdEV4Y2VwdGlvbih0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RPbmV3YXkodGVzdENsaWVudCk7CisgICAgICB0ZXN0STMyKHRlc3RDbGllbnQpOwogICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICBzb2NrZXQuY2xvc2UoKTsKIAogICAgICAgc3RvcFNlcnZlcigpOwogICAgIH0KICAgfQogCisgIHB1YmxpYyB2b2lkIG9wZW4oVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxUUHJvdG9jb2xGYWN0b3J5PiBnZXRQcm90b2NvbHMoKSB7CisgICAgcmV0dXJuIFBST1RPQ09MUzsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCB0ZXN0TGlzdChUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgTGlzdDxJbnRlZ2VyPiBsaXN0b3V0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwogICAgIGZvciAoaW50IGkgPSAtMjsgaSA8IDM7ICsraSkgewpAQCAtNDI0LDE5ICs0NTQsMjkgQEAKICAgICBhc3NlcnRFcXVhbHMobWFwb3V0LCBtYXBpbik7CiAgIH0KIAorICBwcml2YXRlIHZvaWQgdGVzdFN0cmluZ01hcChUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZyxTdHJpbmc+IG1hcG91dCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisgICAgbWFwb3V0LnB1dCgiYSIsICIxMjMiKTsKKyAgICBtYXBvdXQucHV0KCIgeCB5ICIsICIgd2l0aCBzcGFjZXMgIik7CisgICAgbWFwb3V0LnB1dCgic2FtZSIsICJzYW1lIik7CisgICAgbWFwb3V0LnB1dCgiMCIsICJudW1lcmljIGtleSIpOworICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBtYXBpbiA9IHRlc3RDbGllbnQudGVzdFN0cmluZ01hcChtYXBvdXQpOworICAgIGFzc2VydEVxdWFscyhtYXBvdXQsIG1hcGluKTsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCB0ZXN0TmVzdGVkTWFwKFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4gbW0gPQogICAgICAgdGVzdENsaWVudC50ZXN0TWFwTWFwKDEpOwogICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtYXBtYXAgPQogICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4oKTsKLSAgCisKICAgICBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4gcG9zID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOwogICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBuZWcgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgICAgIHBvcy5wdXQoaSwgaSk7CiAgICAgICBuZWcucHV0KC1pLCAtaSk7CiAgICAgfQotICAKKwogICAgIG1hcG1hcC5wdXQoNCwgcG9zKTsKICAgICBtYXBtYXAucHV0KC00LCBuZWcpOwogICAgIGFzc2VydEVxdWFscyhtYXBtYXAsIG1tKTsKQEAgLTQ0OCw3ICs0ODgsMTAgQEAKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0T25ld2F5KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRlc3RDbGllbnQudGVzdE9uZXdheSgzKTsKKyAgICBsb25nIGJlZ2luID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDEpOworICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVnaW47CisgICAgYXNzZXJ0VHJ1ZShlbGFwc2VkIDwgNTAwKTsKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0U2V0KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTQ3Nyw0ICs1MjAsMTkyIEBACiAgICAgdGVzdENsaWVudC50ZXN0Vm9pZCgpOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FsbENvdW50aW5nVHJhbnNwb3J0RmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWJsaWMgaW50IGNvdW50ID0gMDsKKyAgICBwcml2YXRlIGZpbmFsIEZhY3RvcnkgZmFjdG9yeTsKKworICAgIHB1YmxpYyBDYWxsQ291bnRpbmdUcmFuc3BvcnRGYWN0b3J5KEZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykgeworICAgICAgY291bnQrKzsKKyAgICAgIHJldHVybiBmYWN0b3J5LmdldFRyYW5zcG9ydCh0cmFucyk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRyYW5zcG9ydEZhY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmb3IgKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5IDogZ2V0UHJvdG9jb2xzKCkpIHsKKyAgICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKyAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yPFRlc3RIYW5kbGVyPiBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3I8VGVzdEhhbmRsZXI+KGhhbmRsZXIpOworCisgICAgICBmaW5hbCBDYWxsQ291bnRpbmdUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ2FsbENvdW50aW5nVHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOworCisgICAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSwgZmFjdG9yeSk7CisgICAgICBhc3NlcnRFcXVhbHMoMCwgZmFjdG9yeS5jb3VudCk7CisKKyAgICAgIFRTb2NrZXQgc29ja2V0ID0gbmV3IFRTb2NrZXQoSE9TVCwgUE9SVCk7CisgICAgICBzb2NrZXQuc2V0VGltZW91dChTT0NLRVRfVElNRU9VVCk7CisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IGdldENsaWVudFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgb3Blbih0cmFuc3BvcnQpOworCisgICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwcm90b0ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpOworICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRlc3RDbGllbnQudGVzdEJ5dGUoKGJ5dGUpIDApKTsKKyAgICAgIGFzc2VydEVxdWFscygyLCBmYWN0b3J5LmNvdW50KTsKKyAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgc3RvcFNlcnZlcigpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB0ZXN0RXhjZXB0aW9uKFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uLCBYY2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgIGFzc2VydCBmYWxzZTsKKyAgICB9IGNhdGNoKFhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscyhlLm1lc3NhZ2UsICJYY2VwdGlvbiIpOworICAgICAgYXNzZXJ0RXF1YWxzKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgYXNzZXJ0IGZhbHNlOworICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiBlKSB7CisgICAgfQorICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIik7CisgIH0KKworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuQXN5bmNJZmFjZSB7CisKKyAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZChBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKFN0cmluZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxTdHJpbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJpbmcodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbChib29sZWFuIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCb29sKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGUoYnl0ZSB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0Qnl0ZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RJMzIoaW50IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RJMzIodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0STY0KGxvbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TG9uZz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEk2NCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoZG91YmxlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPERvdWJsZT4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdERvdWJsZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnkoQnl0ZUJ1ZmZlciB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlQnVmZmVyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0QmluYXJ5KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RydWN0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3QoWHRydWN0MiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3QyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TmVzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoTWFwPEludGVnZXIsIEludGVnZXI+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE1hcCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdNYXAoTWFwPFN0cmluZywgU3RyaW5nPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RyaW5nTWFwKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8U2V0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U2V0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdExpc3QoTGlzdDxJbnRlZ2VyPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxMaXN0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TGlzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtKE51bWJlcnogdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TnVtYmVyej4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEVudW0odGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWRlZihsb25nIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPExvbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RUeXBlZGVmKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE1hcE1hcChpbnQgaGVsbG8sIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TWFwTWFwKGhlbGxvKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50LCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0SW5zYW5pdHkoYXJndW1lbnQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBNYXA8U2hvcnQsIFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TXVsdGkoYXJnMCxhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Vm9pZD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEV4Y2VwdGlvbigiK2FyZysiKVxuIik7CisgICAgICBpZiAoIlhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgICAvLyB0aHJvdyBhbmQgb25FcnJvciB5aWVsZCB0aGUgc2FtZSByZXN1bHQuCisgICAgICAgIC8vIHRocm93IHg7CisgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcih4KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmICgiVEV4Y2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKKyAgICAgICAgLy8gdGhyb3cgYW5kIG9uRXJyb3IgeWllbGQgdGhlIHNhbWUgcmVzdWx0LgorICAgICAgICAvLyByZXN1bHRIYW5kbGVyLm9uRXJyb3IobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgICAgICAgIC8vIHJldHVybjsKKyAgICAgICAgLy8gVW5zcGVjaWZpZWQgZXhjZXB0aW9uIHNob3VsZCB5aWVsZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBvbiBjbGllbnQgc2lkZQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihhcmcpOworICAgICAgfQorICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwLCBBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGhhbmRsZXIudGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7CisgICAgfQorICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RBc3luY1NlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdEFzeW5jU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNTRjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RBc3luY1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitwdWJsaWMgY2xhc3MgVGVzdEFzeW5jU2VydmVyIGV4dGVuZHMgVGVzdE5vbmJsb2NraW5nU2VydmVyIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgYm9vbGVhbiB1c2VBc3luY1Byb2Nlc3NvcigpeworICAgICAgIHJldHVybiB0cnVlOworICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0SHNIYVNlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdEhzSGFTZXJ2ZXIuamF2YQppbmRleCBmODA1NjBiLi42NjM4YTMzIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0SHNIYVNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RIc0hhU2VydmVyLmphdmEKQEAgLTIwLDEwICsyMCwxMSBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5USHNIYVNlcnZlci5BcmdzOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CiAKIHB1YmxpYyBjbGFzcyBUZXN0SHNIYVNlcnZlciBleHRlbmRzIFRlc3ROb25ibG9ja2luZ1NlcnZlciB7CiAgIHByb3RlY3RlZCBUU2VydmVyIGdldFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHNvY2tldCwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHsKLSAgICByZXR1cm4gbmV3IFRIc0hhU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0LCBwcm90b0ZhY3RvcnkpOworICAgIHJldHVybiBuZXcgVEhzSGFTZXJ2ZXIobmV3IEFyZ3Moc29ja2V0KS5wcm9jZXNzb3IocHJvY2Vzc29yKS5wcm90b2NvbEZhY3RvcnkocHJvdG9GYWN0b3J5KSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEKaW5kZXggYzQzYjQ3My4uM2RmM2JkOCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEKQEAgLTIwLDMxICsyMCw0MiBAQAogCiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UTm9uYmxvY2tpbmdTZXJ2ZXIuQXJnczsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CiAKIHB1YmxpYyBjbGFzcyBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBTZXJ2ZXJUZXN0QmFzZSB7CiAKICAgcHJpdmF0ZSBUaHJlYWQgc2VydmVyVGhyZWFkOwogICBwcml2YXRlIFRTZXJ2ZXIgc2VydmVyOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1FVRVJJRVMgPSAxMDAwOwogCi0gIHByb3RlY3RlZCBUU2VydmVyIGdldFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHNvY2tldCwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHsKLSAgICByZXR1cm4gbmV3IFROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgcHJvdG9GYWN0b3J5KTsKKyAgcHJvdGVjdGVkIFRTZXJ2ZXIgZ2V0U2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgc29ja2V0LCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkgeworICAgIGZpbmFsIEFyZ3MgYXJncyA9IG5ldyBBcmdzKHNvY2tldCkucHJvY2Vzc29yKHByb2Nlc3NvcikucHJvdG9jb2xGYWN0b3J5KHByb3RvRmFjdG9yeSk7CisgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgYXJncy50cmFuc3BvcnRGYWN0b3J5KGZhY3RvcnkpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFROb25ibG9ja2luZ1NlcnZlcihhcmdzKTsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBUUHJvY2Vzc29yIHByb2Nlc3NvciwgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHRocm93cyBFeGNlcHRpb24geworICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihmaW5hbCBUUHJvY2Vzc29yIHByb2Nlc3NvciwgZmluYWwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnksIGZpbmFsIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBFeGNlcHRpb24gewogICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgLy8gVHJhbnNwb3J0CiAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPQotICAgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChQT1JUKTsKKyAgICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Ob25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncygpLnBvcnQoUE9SVCkpOwogCi0gICAgICAgICAgc2VydmVyID0gZ2V0U2VydmVyKHByb2Nlc3NvciwgdFNlcnZlclNvY2tldCwgcHJvdG9GYWN0b3J5KTsKKyAgICAgICAgICBzZXJ2ZXIgPSBnZXRTZXJ2ZXIocHJvY2Vzc29yLCB0U2VydmVyU29ja2V0LCBwcm90b0ZhY3RvcnksIGZhY3RvcnkpOwogCiAgICAgICAgICAgLy8gUnVuIGl0CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiArIFBPUlQgKyAiLi4uIik7CkBAIC02OCw5ICs3OSw0NSBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRTb2NrZXQgc29ja2V0ID0gbmV3IFRTb2NrZXQoSE9TVCwgUE9SVCk7Ci0gICAgc29ja2V0LnNldFRpbWVvdXQoU09DS0VUX1RJTUVPVVQpOwotICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpOworICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZ1RyYW5zcG9ydCk7CisgIH0KKworCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhbnVwQWxsU2VsZWN0aW9uS2V5cygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkgOiBnZXRQcm90b2NvbHMoKSkgeworICAgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpOworCisgICAgICBzdGFydFNlcnZlcihwcm9jZXNzb3IsIHByb3RvRmFjdG9yeSk7CisKKyAgICAgIFRTb2NrZXQgc29ja2V0ID0gbmV3IFRTb2NrZXQoSE9TVCwgUE9SVCk7CisgICAgICBzb2NrZXQuc2V0VGltZW91dChTT0NLRVRfVElNRU9VVCk7CisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IGdldENsaWVudFRyYW5zcG9ydChzb2NrZXQpOworCisgICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwcm90b0ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpOworCisgICAgICBvcGVuKHRyYW5zcG9ydCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1FVRVJJRVM7ICsraSkgeworICAgICAgICB0ZXN0Q2xpZW50LnRlc3RJMzIoMSk7CisgICAgICB9CisgICAgICBzZXJ2ZXIuc3RvcCgpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fUVVFUklFUzsgKytpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0STMyKDEpOworICAgICAgICB9IGNhdGNoKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICBmYWlsKCJ0aW1lZCBvdXQgd2hlbiBpdCBzaG91bGQgaGF2ZSB0aHJvd24gYW5vdGhlciBraW5kIG9mIGVycm9yISIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIHN0b3BTZXJ2ZXIoKTsKKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0VGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzI5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0VGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0VGhyZWFkZWRTZWxlY3RvclNlcnZlciBleHRlbmRzIFRlc3ROb25ibG9ja2luZ1NlcnZlciB7CisgIHByb3RlY3RlZCBUU2VydmVyIGdldFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHNvY2tldCwgVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkpIHsKKyAgICByZXR1cm4gbmV3IFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyKG5ldyBBcmdzKHNvY2tldCkucHJvY2Vzc29yKHByb2Nlc3NvcikucHJvdG9jb2xGYWN0b3J5KHByb3RvRmFjdG9yeSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvRXF1YWxpdHlUZXN0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvRXF1YWxpdHlUZXN0LmphdmEKaW5kZXggZjAxMzc4Zi4uOTRiYTU0MyAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L0VxdWFsaXR5VGVzdC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9FcXVhbGl0eVRlc3QuamF2YQpAQCAtMTI5LDcgKzEyOSw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRlc3Q7CiAKIC8vIEdlbmVyYXRlZCBjb2RlCi1pbXBvcnQgdGhyaWZ0LnRlc3QuKjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuSmF2YVRlc3RIZWxwZXI7CiAKIC8qKgogICovCkBAIC00ODYsOCArNDg4LDggQEAKIAogICAgIGxocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwogICAgIHJocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwotICAgIGxocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OwotICAgIHJocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OworICAgIGxocy5yZXFfYmluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW117MSwyfSk7CisgICAgcmhzLnJlcV9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKICAgICBsaHMucmVxX2JpbiA9IG51bGw7CiAgICAgcmhzLnJlcV9iaW4gPSBudWxsOwogICAgIC8vIHRoaXNfcHJlc2VudCA9IEZhbHNlCkBAIC00OTksOCArNTAxLDggQEAKIAogICAgIGxocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwogICAgIHJocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwotICAgIGxocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OwotICAgIHJocy5yZXFfYmluID0gbmV3IGJ5dGVbXXszLDR9OworICAgIGxocy5yZXFfYmluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW117MSwyfSk7CisgICAgcmhzLnJlcV9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXszLDR9KTsKICAgICBsaHMucmVxX2JpbiA9IG51bGw7CiAgICAgcmhzLnJlcV9iaW4gPSBudWxsOwogICAgIC8vIHRoaXNfcHJlc2VudCA9IEZhbHNlCkBAIC01MTIsOCArNTE0LDggQEAKIAogICAgIGxocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwogICAgIHJocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwotICAgIGxocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OwotICAgIHJocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OworICAgIGxocy5yZXFfYmluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW117MSwyfSk7CisgICAgcmhzLnJlcV9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKICAgICBsaHMucmVxX2JpbiA9IG51bGw7CiAgICAgLy8gdGhpc19wcmVzZW50ID0gRmFsc2UKICAgICAvLyB0aGF0X3ByZXNlbnQgPSBUcnVlCkBAIC01MjIsOCArNTI0LDggQEAKIAogICAgIGxocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwogICAgIHJocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwotICAgIGxocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OwotICAgIHJocy5yZXFfYmluID0gbmV3IGJ5dGVbXXszLDR9OworICAgIGxocy5yZXFfYmluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW117MSwyfSk7CisgICAgcmhzLnJlcV9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXszLDR9KTsKICAgICBsaHMucmVxX2JpbiA9IG51bGw7CiAgICAgLy8gdGhpc19wcmVzZW50ID0gRmFsc2UKICAgICAvLyB0aGF0X3ByZXNlbnQgPSBUcnVlCkBAIC01MzIsOCArNTM0LDggQEAKIAogICAgIGxocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwogICAgIHJocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwotICAgIGxocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OwotICAgIHJocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OworICAgIGxocy5yZXFfYmluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW117MSwyfSk7CisgICAgcmhzLnJlcV9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKICAgICByaHMucmVxX2JpbiA9IG51bGw7CiAgICAgLy8gdGhpc19wcmVzZW50ID0gVHJ1ZQogICAgIC8vIHRoYXRfcHJlc2VudCA9IEZhbHNlCkBAIC01NDIsOCArNTQ0LDggQEAKIAogICAgIGxocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwogICAgIHJocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwotICAgIGxocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OwotICAgIHJocy5yZXFfYmluID0gbmV3IGJ5dGVbXXszLDR9OworICAgIGxocy5yZXFfYmluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW117MSwyfSk7CisgICAgcmhzLnJlcV9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXszLDR9KTsKICAgICByaHMucmVxX2JpbiA9IG51bGw7CiAgICAgLy8gdGhpc19wcmVzZW50ID0gVHJ1ZQogICAgIC8vIHRoYXRfcHJlc2VudCA9IEZhbHNlCkBAIC01NTIsOCArNTU0LDggQEAKIAogICAgIGxocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwogICAgIHJocyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOwotICAgIGxocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OwotICAgIHJocy5yZXFfYmluID0gbmV3IGJ5dGVbXXsxLDJ9OworICAgIGxocy5yZXFfYmluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW117MSwyfSk7CisgICAgcmhzLnJlcV9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKICAgICAvLyB0aGlzX3ByZXNlbnQgPSBUcnVlCiAgICAgLy8gdGhhdF9wcmVzZW50ID0gVHJ1ZQogICAgIGlmIChsaHMuZXF1YWxzKHJocykgIT0gdHJ1ZSkKQEAgLTU2Myw4ICs1NjUsOCBAQAogCiAgICAgbGhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CiAgICAgcmhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7Ci0gICAgbGhzLnJlcV9iaW4gPSBuZXcgYnl0ZVtdezEsMn07Ci0gICAgcmhzLnJlcV9iaW4gPSBuZXcgYnl0ZVtdezMsNH07CisgICAgbGhzLnJlcV9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKKyAgICByaHMucmVxX2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezMsNH0pOwogICAgIC8vIHRoaXNfcHJlc2VudCA9IFRydWUKICAgICAvLyB0aGF0X3ByZXNlbnQgPSBUcnVlCiAgICAgaWYgKGxocy5lcXVhbHMocmhzKSAhPSBmYWxzZSkKQEAgLTU3Miw4ICs1NzQsOCBAQAogCiAgICAgbGhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CiAgICAgcmhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7Ci0gICAgbGhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07Ci0gICAgcmhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07CisgICAgbGhzLm9wdF9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKKyAgICByaHMub3B0X2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezEsMn0pOwogICAgIGxocy5vcHRfYmluID0gbnVsbDsKICAgICByaHMub3B0X2JpbiA9IG51bGw7CiAgICAgLy8gdGhpc19wcmVzZW50ID0gRmFsc2UKQEAgLTU4NSw4ICs1ODcsOCBAQAogCiAgICAgbGhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CiAgICAgcmhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7Ci0gICAgbGhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07Ci0gICAgcmhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezMsNH07CisgICAgbGhzLm9wdF9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKKyAgICByaHMub3B0X2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezMsNH0pOwogICAgIGxocy5vcHRfYmluID0gbnVsbDsKICAgICByaHMub3B0X2JpbiA9IG51bGw7CiAgICAgLy8gdGhpc19wcmVzZW50ID0gRmFsc2UKQEAgLTU5OCw4ICs2MDAsOCBAQAogCiAgICAgbGhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CiAgICAgcmhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7Ci0gICAgbGhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07Ci0gICAgcmhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07CisgICAgbGhzLm9wdF9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKKyAgICByaHMub3B0X2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezEsMn0pOwogICAgIGxocy5vcHRfYmluID0gbnVsbDsKICAgICAvLyB0aGlzX3ByZXNlbnQgPSBGYWxzZQogICAgIC8vIHRoYXRfcHJlc2VudCA9IFRydWUKQEAgLTYwOCw4ICs2MTAsOCBAQAogCiAgICAgbGhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CiAgICAgcmhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7Ci0gICAgbGhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07Ci0gICAgcmhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezMsNH07CisgICAgbGhzLm9wdF9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKKyAgICByaHMub3B0X2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezMsNH0pOwogICAgIGxocy5vcHRfYmluID0gbnVsbDsKICAgICAvLyB0aGlzX3ByZXNlbnQgPSBGYWxzZQogICAgIC8vIHRoYXRfcHJlc2VudCA9IFRydWUKQEAgLTYxOCw4ICs2MjAsOCBAQAogCiAgICAgbGhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CiAgICAgcmhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7Ci0gICAgbGhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07Ci0gICAgcmhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07CisgICAgbGhzLm9wdF9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKKyAgICByaHMub3B0X2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezEsMn0pOwogICAgIHJocy5vcHRfYmluID0gbnVsbDsKICAgICAvLyB0aGlzX3ByZXNlbnQgPSBUcnVlCiAgICAgLy8gdGhhdF9wcmVzZW50ID0gRmFsc2UKQEAgLTYyOCw4ICs2MzAsOCBAQAogCiAgICAgbGhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CiAgICAgcmhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7Ci0gICAgbGhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07Ci0gICAgcmhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezMsNH07CisgICAgbGhzLm9wdF9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKKyAgICByaHMub3B0X2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezMsNH0pOwogICAgIHJocy5vcHRfYmluID0gbnVsbDsKICAgICAvLyB0aGlzX3ByZXNlbnQgPSBUcnVlCiAgICAgLy8gdGhhdF9wcmVzZW50ID0gRmFsc2UKQEAgLTYzOCw4ICs2NDAsOCBAQAogCiAgICAgbGhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CiAgICAgcmhzID0gbmV3IEphdmFUZXN0SGVscGVyKCk7Ci0gICAgbGhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07Ci0gICAgcmhzLm9wdF9iaW4gPSBuZXcgYnl0ZVtdezEsMn07CisgICAgbGhzLm9wdF9iaW4gPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXXsxLDJ9KTsKKyAgICByaHMub3B0X2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezEsMn0pOwogICAgIC8vIHRoaXNfcHJlc2VudCA9IFRydWUKICAgICAvLyB0aGF0X3ByZXNlbnQgPSBUcnVlCiAgICAgaWYgKGxocy5lcXVhbHMocmhzKSAhPSB0cnVlKQpAQCAtNjQ5LDggKzY1MSw4IEBACiAKICAgICBsaHMgPSBuZXcgSmF2YVRlc3RIZWxwZXIoKTsKICAgICByaHMgPSBuZXcgSmF2YVRlc3RIZWxwZXIoKTsKLSAgICBsaHMub3B0X2JpbiA9IG5ldyBieXRlW117MSwyfTsKLSAgICByaHMub3B0X2JpbiA9IG5ldyBieXRlW117Myw0fTsKKyAgICBsaHMub3B0X2JpbiA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdezEsMn0pOworICAgIHJocy5vcHRfYmluID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW117Myw0fSk7CiAgICAgLy8gdGhpc19wcmVzZW50ID0gVHJ1ZQogICAgIC8vIHRoYXRfcHJlc2VudCA9IFRydWUKICAgICBpZiAobGhzLmVxdWFscyhyaHMpICE9IGZhbHNlKQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L0phdmFCZWFuc1Rlc3QuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9KYXZhQmVhbnNUZXN0LmphdmEKaW5kZXggYjcyYmQzOC4uNmEyYTBlZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L0phdmFCZWFuc1Rlc3QuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvSmF2YUJlYW5zVGVzdC5qYXZhCkBAIC0xOSw3ICsxOSw5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudGVzdDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKIGltcG9ydCB0aHJpZnQudGVzdC5PbmVPZkVhY2hCZWFuczsKIAogcHVibGljIGNsYXNzIEphdmFCZWFuc1Rlc3QgewpAQCAtNTIsMTMgKzU0LDEzIEBACiAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaXNTZXQgbWV0aG9kIGVycm9yOiB1bnNldCBmaWVsZCByZXR1cm5lZCBhcyBzZXQhIik7CiAKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDEyOyBpKyspewotICAgICAgaWYgKG9vZS5pc1NldChpKSkKKyAgICAgIGlmIChvb2UuaXNTZXQob29lLmZpZWxkRm9ySWQoaSkpKQogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaXNTZXQgbWV0aG9kIGVycm9yOiB1bnNldCBmaWVsZCAiICsgaSArICIgcmV0dXJuZWQgYXMgc2V0ISIpOwogICAgIH0KIAogICAgIC8vIEV2ZXJ5dGhpbmcgaXMgc2V0CiAgICAgb29lLnNldF9hX2JpdGUoKGJ5dGUpIDEpOwotICAgIG9vZS5zZXRfYmFzZTY0KCJieXRlcyIuZ2V0Qnl0ZXMoKSk7CisgICAgb29lLnNldF9iYXNlNjQoQnl0ZUJ1ZmZlci53cmFwKCJieXRlcyIuZ2V0Qnl0ZXMoKSkpOwogICAgIG9vZS5zZXRfYnl0ZV9saXN0KG5ldyBMaW5rZWRMaXN0PEJ5dGU+KCkpOwogICAgIG9vZS5zZXRfZG91YmxlX3ByZWNpc2lvbigxKTsKICAgICBvb2Uuc2V0X2kxNl9saXN0KG5ldyBMaW5rZWRMaXN0PFNob3J0PigpKTsKQEAgLTkzLDE0ICs5NSwxNCBAQAogICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImlzU2V0IG1ldGhvZCBlcnJvcjogc2V0IGZpZWxkIHJldHVybmVkIGFzIHVuc2V0ISIpOwogCiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMjsgaSsrKXsKLSAgICAgIGlmICghb29lLmlzU2V0KGkpKQorICAgICAgaWYgKCFvb2UuaXNTZXQob29lLmZpZWxkRm9ySWQoaSkpKQogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaXNTZXQgbWV0aG9kIGVycm9yOiBzZXQgZmllbGQgIiArIGkgKyAiIHJldHVybmVkIGFzIHVuc2V0ISIpOwogICAgIH0KIAogICAgIC8vIFNob3VsZCB0aHJvdyBleGNlcHRpb24gd2hlbiBmaWVsZCBkb2Vzbid0IGV4aXN0CiAgICAgYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKICAgICB0cnl7Ci0gICAgICBpZiAob29lLmlzU2V0KDEwMCkpOworICAgICAgaWYgKG9vZS5pc1NldChvb2UuZmllbGRGb3JJZCgxMDApKSk7CiAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewogICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFhOTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQpAQCAtMCwwICsxLDgwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRlc3Q7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZhc3RGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLy8gR2VuZXJhdGVkIGNvZGUKK2ltcG9ydCB0aHJpZnQudGVzdC5JbnNhbml0eTsKK2ltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OworaW1wb3J0IHRocmlmdC50ZXN0LlNlY29uZFNlcnZpY2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0OworaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDI7CisKKy8qKgorICogVGVzdCBKYXZhIGNsaWVudCBmb3IgdGhyaWZ0LiBFc3NlbnRpYWxseSBqdXN0IGEgY29weSBvZiB0aGUgQysrIHZlcnNpb24sCisgKiB0aGlzIG1ha2VzIGEgdmFyaWV0eSBvZiByZXF1ZXN0cyB0byBlbmFibGUgdGVzdGluZyBmb3IgYm90aCBwZXJmb3JtYW5jZSBhbmQKKyAqIGNvcnJlY3RuZXNzIG9mIHRoZSBvdXRwdXQuCisgKgorICovCitwdWJsaWMgY2xhc3MgVGVzdENsaWVudCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9CQVNFVFlQRVMgPSAxOworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX1NUUlVDVFMgPSAyOworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX0VYQ0VQVElPTlMgPSA4OworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX1BST1RPQ09MUyA9IDE2OworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX1VOS05PV04gPSA2NDsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworICAgIFN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CisgICAgaW50IHBvcnQgPSA5MDkwOworICAgIGludCBudW1UZXN0cyA9IDE7CisgICAgU3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKKyAgICBTdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOworICAgIGJvb2xlYW4gc3NsID0gZmFsc2U7CisKKyAgICBpbnQgc29ja2V0VGltZW91dCA9IDEwMDA7CisKKyAgICB0cnkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0taG9zdCIpKSB7CisgICAgICAgICAgaG9zdCA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICBob3N0LnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgcG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwKKyAgICAgICAgICAgIGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10ZXN0bG9vcHMiKSl7CisgICAgICAgICAgbnVtVGVzdHMgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS10aW1lb3V0IikpIHsKKyAgICAgICAgICBzb2NrZXRUaW1lb3V0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXByb3RvY29sIikpIHsKKyAgICAgICAgICBwcm90b2NvbF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgIHByb3RvY29sX3R5cGUudHJpbSgpOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10cmFuc3BvcnQiKSkgeworICAgICAgICAgIHRyYW5zcG9ydF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgIHRyYW5zcG9ydF90eXBlLnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1zc2wiKSkgeworICAgICAgICAgIHNzbCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0taGVscCIpKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbGxvd2VkIG9wdGlvbnM6Iik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taGVscFx0XHRcdFByb2R1Y2UgaGVscCBtZXNzYWdlIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taG9zdD1hcmcgKD0iICsgaG9zdCArICIpXHRIb3N0IHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wb3J0PWFyZyAoPSIgKyBwb3J0ICsgIilcdFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10cmFuc3BvcnQ9YXJnICg9IiArIHRyYW5zcG9ydF90eXBlICsgIilcblx0XHRcdFx0VHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBmYXN0ZnJhbWVkLCBodHRwIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10ZXN0bG9vcHNbLS1uXT1hcmcgKD0iICsgbnVtVGVzdHMgKyAiKVx0TnVtYmVyIG9mIFRlc3RzIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW4gbm90IHBhcnNlIGFyZ3VtZW50cyEgU2VlIC0taGVscCIpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHByb3RvY29sIHR5cGUhICIgKyBwcm90b2NvbF90eXBlKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmcmFtZWQiKSkgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZhc3RmcmFtZWQiKSkgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biB0cmFuc3BvcnQgdHlwZSEgIiArIHRyYW5zcG9ydF90eXBlKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSAmJiBzc2wgPT0gdHJ1ZSkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTU0wgaXMgbm90IHN1cHBvcnRlZCBvdmVyIGh0dHAuIik7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CisgICAgfQorCisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSkgeworICAgICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly8iICsgaG9zdCArICI6IiArIHBvcnQgKyAiL3NlcnZpY2UiOworICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQodXJsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRTb2NrZXQgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgaWYgKHNzbCA9PSB0cnVlKSB7CisgICAgICAgICAgc29ja2V0ID0gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KGhvc3QsIHBvcnQsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNvY2tldCA9IG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpOworICAgICAgICB9CisgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHNvY2tldFRpbWVvdXQpOworICAgICAgICB0cmFuc3BvcnQgPSBzb2NrZXQ7CisgICAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CisgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZhc3RmcmFtZWQiKSkgeworICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CisgICAgfQorCisgICAgVFByb3RvY29sIHRQcm90b2NvbCA9IG51bGw7CisgICAgVFByb3RvY29sIHRQcm90b2NvbDIgPSBudWxsOworICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygianNvbiIpIHx8IHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgeworICAgICAgdFByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgIH0gZWxzZSB7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgfQorCisgICAgaWYgKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSkgeworICAgICAgdFByb3RvY29sMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCh0UHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wodFByb3RvY29sLCAiVGhyaWZ0VGVzdCIpOworICAgIH0KKworICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQodFByb3RvY29sKTsKKyAgICBJbnNhbml0eSBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKKworICAgIGxvbmcgdGltZU1pbiA9IDA7CisgICAgbG9uZyB0aW1lTWF4ID0gMDsKKyAgICBsb25nIHRpbWVUb3QgPSAwOworCisgICAgaW50IHJldHVybkNvZGUgPSAwOworICAgIGZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGVzdHM7ICsrdGVzdCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENPTk5FQ1QgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0ICMiICsgKHRlc3QrMSkgKyAiLCAiICsgImNvbm5lY3QgIiArIGhvc3QgKyAiOiIgKyBwb3J0KTsKKworICAgICAgICBpZiAodHJhbnNwb3J0LmlzT3BlbigpID09IGZhbHNlKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKKyAgICAgICAgICAgIHR0eC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29ubmVjdCBmYWlsZWQ6ICIgKyB0dHguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KEVSUl9VTktOT1dOKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZPSUQgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHZvaWRcbiIpOworICAgICAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gdGF4KSB7CisgICAgICAgICAgdGF4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTVFJJTkcgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgICAgU3RyaW5nIHMgPSB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gXCIiICsgcyArICJcIlxuIik7CisgICAgICAgIGlmICghcy5lcXVhbHMoIlRlc3QiKSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTXVsdGlwbGV4ZWQgdGVzdAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSkgeworICAgICAgICAgIFNlY29uZFNlcnZpY2UuQ2xpZW50IHNlY29uZENsaWVudCA9IG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudCh0UHJvdG9jb2wyKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJzZWNvbmR0ZXN0U3RyaW5nKFwiVGVzdDJcIikiKTsKKyAgICAgICAgICBzID0gc2Vjb25kQ2xpZW50LnNlY29uZHRlc3RTdHJpbmcoIlRlc3QyIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gXCIiICsgcyArICJcIlxuIik7CisgICAgICAgICAgaWYgKCFzLmVxdWFscygidGVzdFN0cmluZyhcIlRlc3QyXCIpIikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1BST1RPQ09MUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEJZVEUgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJ5dGUoMSkiKTsKKyAgICAgICAgYnl0ZSBpOCA9IHRlc3RDbGllbnQudGVzdEJ5dGUoKGJ5dGUpMSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBpOCArICJcbiIpOworICAgICAgICBpZiAoaTggIT0gMSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSTMyIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJMzIoLTEpIik7CisgICAgICAgIGludCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgaTMyICsgIlxuIik7CisgICAgICAgIGlmIChpMzIgIT0gLTEpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEk2NCBURVNUCisgICAgICAgICAqLworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICAgICAgbG9uZyBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBpNjQgKyAiXG4iKTsKKyAgICAgICAgaWYgKGk2NCAhPSAtMzQzNTk3MzgzNjhMKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBET1VCTEUgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdERvdWJsZSgtNS4zMjUwOTgyMzUpIik7CisgICAgICAgIGRvdWJsZSBkdWIgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoLTUuMzI1MDk4MjM1KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGR1YiArICJcbiIpOworICAgICAgICBpZiAoTWF0aC5hYnMoZHViIC0gKC01LjMyNTA5ODIzNSkpID4gMC4wMDEpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJJTkFSWSBURVNUCisgICAgICAgICAqLworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCaW5hcnkoLTEyOC4uLjEyNykgPSAiKTsKKyAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10gey0xMjgsIC0xMjcsIC0xMjYsIC0xMjUsIC0xMjQsIC0xMjMsIC0xMjIsIC0xMjEsIC0xMjAsIC0xMTksIC0xMTgsIC0xMTcsIC0xMTYsIC0xMTUsIC0xMTQsIC0xMTMsIC0xMTIsIC0xMTEsIC0xMTAsIC0xMDksIC0xMDgsIC0xMDcsIC0xMDYsIC0xMDUsIC0xMDQsIC0xMDMsIC0xMDIsIC0xMDEsIC0xMDAsIC05OSwgLTk4LCAtOTcsIC05NiwgLTk1LCAtOTQsIC05MywgLTkyLCAtOTEsIC05MCwgLTg5LCAtODgsIC04NywgLTg2LCAtODUsIC04NCwgLTgzLCAtODIsIC04MSwgLTgwLCAtNzksIC03OCwgLTc3LCAtNzYsIC03NSwgLTc0LCAtNzMsIC03MiwgLTcxLCAtNzAsIC02OSwgLTY4LCAtNjcsIC02NiwgLTY1LCAtNjQsIC02MywgLTYyLCAtNjEsIC02MCwgLTU5LCAtNTgsIC01NywgLTU2LCAtNTUsIC01NCwgLTUzLCAtNTIsIC01MSwgLTUwLCAtNDksIC00OCwgLTQ3LCAtNDYsIC00NSwgLTQ0LCAtNDMsIC00MiwgLTQxLCAtNDAsIC0zOSwgLTM4LCAtMzcsIC0zNiwgLTM1LCAtMzQsIC0zMywgLTMyLCAtMzEsIC0zMCwgLTI5LCAtMjgsIC0yNywgLTI2LCAtMjUsIC0yNCwgLTIzLCAtMjIsIC0yMSwgLTIwLCAtMTksIC0xOCwgLTE3LCAtMTYsIC0xNSwgLTE0LCAtMTMsIC0xMiwgLTExLCAtMTAsIC05LCAtOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyN307CisgICAgICAgICAgQnl0ZUJ1ZmZlciBiaW4gPSB0ZXN0Q2xpZW50LnRlc3RCaW5hcnkoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpKTsKKyAgICAgICAgICBiaW4ubWFyaygpOworICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2Jpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCldOworICAgICAgICAgIGJpbi5nZXQoYnl0ZXMpOworICAgICAgICAgIGJpbi5yZXNldCgpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGJ5dGVzW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ9Iik7CisgICAgICAgICAgaWYgKCFCeXRlQnVmZmVyLndyYXAoZGF0YSkuZXF1YWxzKGJpbikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU1RSVUNUIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOworICAgICAgICBYdHJ1Y3Qgb3V0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICBvdXQuc3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICBvdXQuYnl0ZV90aGluZyA9IChieXRlKSAxOworICAgICAgICBvdXQuaTMyX3RoaW5nID0gLTM7CisgICAgICAgIG91dC5pNjRfdGhpbmcgPSAtNTsKKyAgICAgICAgWHRydWN0IGluID0gdGVzdENsaWVudC50ZXN0U3RydWN0KG91dCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgIlwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmJ5dGVfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pMzJfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pNjRfdGhpbmcgKyAifVxuIik7CisgICAgICAgIGlmICghaW4uZXF1YWxzKG91dCkpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBORVNURUQgU1RSVUNUIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOworICAgICAgICBYdHJ1Y3QyIG91dDIgPSBuZXcgWHRydWN0MigpOworICAgICAgICBvdXQyLmJ5dGVfdGhpbmcgPSAoc2hvcnQpMTsKKyAgICAgICAgb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CisgICAgICAgIG91dDIuaTMyX3RoaW5nID0gNTsKKyAgICAgICAgWHRydWN0MiBpbjIgPSB0ZXN0Q2xpZW50LnRlc3ROZXN0KG91dDIpOworICAgICAgICBpbiA9IGluMi5zdHJ1Y3RfdGhpbmc7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgaW4yLmJ5dGVfdGhpbmcgKyAiLCB7IiArICJcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLnN0cmluZ190aGluZyArICJcIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uYnl0ZV90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmk2NF90aGluZyArICJ9LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbjIuaTMyX3RoaW5nICsgIn1cbiIpOworICAgICAgICBpZiAoIWluMi5lcXVhbHMob3V0MikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNQVAgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgTWFwPEludGVnZXIsSW50ZWdlcj4gbWFwb3V0ID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgICAgICAgIG1hcG91dC5wdXQoaSwgaS0xMCk7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE1hcCh7Iik7CisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGludCBrZXkgOiBtYXBvdXQua2V5U2V0KCkpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgbWFwb3V0LmdldChrZXkpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KSIpOworICAgICAgICBNYXA8SW50ZWdlcixJbnRlZ2VyPiBtYXBpbiA9IHRlc3RDbGllbnQudGVzdE1hcChtYXBvdXQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQga2V5IDogbWFwaW4ua2V5U2V0KCkpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgbWFwb3V0LmdldChrZXkpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgaWYgKCFtYXBvdXQuZXF1YWxzKG1hcGluKSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNUUklORyBNQVAgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHNtYXBvdXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICBzbWFwb3V0LnB1dCgiYSIsICIyIik7CisgICAgICAgICAgc21hcG91dC5wdXQoImIiLCAiYmxhaCIpOworICAgICAgICAgIHNtYXBvdXQucHV0KCJzb21lIiwgInRoaW5nIik7CisgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogc21hcG91dC5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+ICIgKyBzbWFwb3V0LmdldChrZXkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSkiKTsKKyAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHNtYXBpbiA9IHRlc3RDbGllbnQudGVzdFN0cmluZ01hcChzbWFwb3V0KTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHNtYXBpbi5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+ICIgKyBzbWFwb3V0LmdldChrZXkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgICAgaWYgKCFzbWFwb3V0LmVxdWFscyhzbWFwaW4pKSB7CisgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNFVCBURVNUCisgICAgICAgICAqLworICAgICAgICBTZXQ8SW50ZWdlcj4gc2V0b3V0ID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICAgICAgc2V0b3V0LmFkZChpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGludCBlbGVtIDogc2V0b3V0KSB7CisgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGVsZW0pOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pIik7CisgICAgICAgIFNldDxJbnRlZ2VyPiBzZXRpbiA9IHRlc3RDbGllbnQudGVzdFNldChzZXRvdXQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgZWxlbSA6IHNldGluKSB7CisgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGVsZW0pOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoIXNldG91dC5lcXVhbHMoc2V0aW4pKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTElTVCBURVNUCisgICAgICAgICAqLworICAgICAgICBMaXN0PEludGVnZXI+IGxpc3RvdXQgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgICAgIGxpc3RvdXQuYWRkKGkpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RMaXN0KHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGludCBlbGVtIDogbGlzdG91dCkgeworICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludChlbGVtKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KSIpOworICAgICAgICBMaXN0PEludGVnZXI+IGxpc3RpbiA9IHRlc3RDbGllbnQudGVzdExpc3QobGlzdG91dCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGludCBlbGVtIDogbGlzdGluKSB7CisgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIsICIpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGVsZW0pOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoIWxpc3RvdXQuZXF1YWxzKGxpc3RpbikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFTlVNIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgICAgTnVtYmVyeiByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouT05FKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShUV08pIik7CisgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5UV08pIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5USFJFRSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5GSVZFKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouRUlHSFQpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUWVBFREVGIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgICAgbG9uZyB1aWQgPSB0ZXN0Q2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgdWlkICsgIlxuIik7CisgICAgICAgIGlmICh1aWQgIT0gMzA5ODU4MjM1MDgyNTIzTCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTkVTVEVEIE1BUCBURVNUCisgICAgICAgICAqLworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtbSA9CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0TWFwTWFwKDEpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgIGZvciAoaW50IGtleSA6IG1tLmtleVNldCgpKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+IHsiKTsKKyAgICAgICAgICBNYXA8SW50ZWdlcixJbnRlZ2VyPiBtMiA9IG1tLmdldChrZXkpOworICAgICAgICAgIGZvciAoaW50IGsyIDogbTIua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazIgKyAiID0+ICIgKyBtMi5nZXQoazIpICsgIiwgIik7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAobW0uc2l6ZSgpICE9IDIgfHwgIW1tLmNvbnRhaW5zS2V5KDQpIHx8ICFtbS5jb250YWluc0tleSgtNCkpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbTEgPSBtbS5nZXQoNCk7CisgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG0yID0gbW0uZ2V0KC00KTsKKyAgICAgICAgICBpZiAobTEuZ2V0KDEpICE9IDEgfHwgbTEuZ2V0KDIpICE9IDIgfHwgbTEuZ2V0KDMpICE9IDMgfHwgbTEuZ2V0KDQpICE9IDQgfHwKKyAgICAgICAgICAgICAgbTIuZ2V0KC0xKSAhPSAtMSB8fCBtMi5nZXQoLTIpICE9IC0yIHx8IG0yLmdldCgtMykgIT0gLTMgfHwgbTIuZ2V0KC00KSAhPSAtNCkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSU5TQU5JVFkgVEVTVAorICAgICAgICAgKi8KKworICAgICAgICBib29sZWFuIGluc2FuaXR5RmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CisgICAgICAgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKKyAgICAgICAgICBoZWxsby5pNjRfdGhpbmcgPSAyOworCisgICAgICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOworICAgICAgICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IChieXRlKTQ7CisgICAgICAgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OworICAgICAgICAgIGdvb2RieWUuaTY0X3RoaW5nID0gKGxvbmcpNDsKKworICAgICAgICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKKyAgICAgICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5FSUdIVCwgKGxvbmcpOCk7CisgICAgICAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNSk7CisgICAgICAgICAgaW5zYW5lLnh0cnVjdHMgPSBuZXcgQXJyYXlMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQoZ29vZGJ5ZSk7CisgICAgICAgICAgaW5zYW5lLnh0cnVjdHMuYWRkKGhlbGxvKTsKKworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJbnNhbml0eSgpIik7CisgICAgICAgICAgTWFwPExvbmcsTWFwPE51bWJlcnosSW5zYW5pdHk+PiB3aG9hID0KKyAgICAgICAgICAgIHRlc3RDbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOworICAgICAgICAgIGZvciAobG9uZyBrZXkgOiB3aG9hLmtleVNldCgpKSB7CisgICAgICAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgIGZvciAoTnVtYmVyeiBrMiA6IHZhbC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbC5nZXQoazIpOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBMb25nPiB1c2VyTWFwID0gdjIudXNlck1hcDsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOworICAgICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChOdW1iZXJ6IGszIDogdXNlck1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMyArICIgPT4gIiArIHVzZXJNYXAuZ2V0KGszKSArICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKKworICAgICAgICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoWHRydWN0IHggOiB4dHJ1Y3RzKSB7CisgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7IiArICJcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIiArIHguYnl0ZV90aGluZyArICIsICIgKyB4LmkzMl90aGluZyArICIsICIrIHguaTY0X3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9Iik7CisKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgICAgaWYgKHdob2Euc2l6ZSgpID09IDIgJiYgd2hvYS5jb250YWluc0tleSgxTCkgJiYgd2hvYS5jb250YWluc0tleSgyTCkpIHsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gZmlyc3RfbWFwID0gd2hvYS5nZXQoMUwpOworICAgICAgICAgICAgTWFwPE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gd2hvYS5nZXQoMkwpOworICAgICAgICAgICAgaWYgKGZpcnN0X21hcC5zaXplKCkgPT0gMiAmJgorICAgICAgICAgICAgICAgIGZpcnN0X21hcC5jb250YWluc0tleShOdW1iZXJ6LlRXTykgJiYKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXAuY29udGFpbnNLZXkoTnVtYmVyei5USFJFRSkgJiYKKyAgICAgICAgICAgICAgICBzZWNvbmRfbWFwLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcC5jb250YWluc0tleShOdW1iZXJ6LlNJWCkgJiYKKyAgICAgICAgICAgICAgICBpbnNhbmUuZXF1YWxzKGZpcnN0X21hcC5nZXQoTnVtYmVyei5UV08pKSAmJgorICAgICAgICAgICAgICAgIGluc2FuZS5lcXVhbHMoZmlyc3RfbWFwLmdldChOdW1iZXJ6LlRIUkVFKSkpIHsKKyAgICAgICAgICAgICAgSW5zYW5pdHkgc2l4ID1zZWNvbmRfbWFwLmdldChOdW1iZXJ6LlNJWCk7CisgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgIm5ldyBJbnNhbml0eSgpLmVxdWFscyhzaXgpIiBiZWNhdXNlIGFzIG9mIG5vdywgc3RydWN0L2NvbnRhaW5lcgorICAgICAgICAgICAgICAvLyBmaWVsZHMgd2l0aCBkZWZhdWx0IHJlcXVpcmVkbmVzcyBoYXZlIGlzc2V0PWZhbHNlIGZvciBsb2NhbCBpbnN0YW5jZXMgYW5kIHlldAorICAgICAgICAgICAgICAvLyByZWNlaXZlZCBlbXB0eSB2YWx1ZXMgZnJvbSBvdGhlciBsYW5ndWFnZXMgbGlrZSBDKysgaGF2ZSBpc3NldD10cnVlIC4KKyAgICAgICAgICAgICAgaWYgKHNpeC5nZXRVc2VyTWFwU2l6ZSgpID09IDAgJiYgc2l4LmdldFh0cnVjdHNTaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICAgICAgaW5zYW5pdHlGYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgIGluc2FuaXR5RmFpbGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluc2FuaXR5RmFpbGVkKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRVhFQ1BUSU9OIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKKyAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHslZCwgXCIlc1wifVxuIiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikgPT4iKTsKKyAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICAgICAgfSBjYXRjaChURXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7XCIlc1wifVxuIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJzdWNjZXNzXCIpID0+Iik7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJzdWNjZXNzIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG4iKTsKKyAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgZXhjZXB0aW9uXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNVUxUSSBFWENFUFRJT04gVEVTVAorICAgICAgICAgKi8KKworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIFwidGVzdCAxXCIpID0+Iik7CisgICAgICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgInRlc3QgMSIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgcmVzdWx0XG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHslZCwgXCIlc1wifVxuIiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIpOworICAgICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAidGVzdCAyIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICAgICAgfSBjYXRjaChYY2VwdGlvbjIgZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHslZCwge1wiJXNcIn19XG4iLCBlLmVycm9yQ29kZSwgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CisgICAgICAgICAgWHRydWN0IHJlc3VsdDsKKyAgICAgICAgICByZXN1bHQgPSB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigic3VjY2VzcyIsICJ0ZXN0IDMiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7e1wiJXNcIn19XG4iLCByZXN1bHQuc3RyaW5nX3RoaW5nKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIGV4Y2VwdGlvblxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPTkVXQVkgVEVTVAorICAgICAgICAgKi8KKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE9uZXdheSgzKS4uLiIpOworICAgICAgICBsb25nIHN0YXJ0T25ld2F5ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgIHRlc3RDbGllbnQudGVzdE9uZXdheSgzKTsKKyAgICAgICAgbG9uZyBvbmV3YXlFbGFwc2VkTWlsbGlzID0gKFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnRPbmV3YXkpIC8gMTAwMDAwMDsKKyAgICAgICAgaWYgKG9uZXdheUVsYXBzZWRNaWxsaXMgPiAyMDApIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9uZXdheSB0ZXN0IGZhaWxlZDogdG9vayAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcyIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3MgLSB0b29rICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG9uZXdheUVsYXBzZWRNaWxsaXMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zIik7CisgICAgICAgIH0KKworCisgICAgICAgIGxvbmcgc3RvcCA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICBsb25nIHRvdCA9IHN0b3Atc3RhcnQ7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCB0aW1lOiAiICsgdG90LzEwMDAgKyAidXMiKTsKKworICAgICAgICBpZiAodGltZU1pbiA9PSAwIHx8IHRvdCA8IHRpbWVNaW4pIHsKKyAgICAgICAgICB0aW1lTWluID0gdG90OworICAgICAgICB9CisgICAgICAgIGlmICh0b3QgPiB0aW1lTWF4KSB7CisgICAgICAgICAgdGltZU1heCA9IHRvdDsKKyAgICAgICAgfQorICAgICAgICB0aW1lVG90ICs9IHRvdDsKKworICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9VTktOT1dOOworICAgICAgfQorICAgIH0KKworICAgIGxvbmcgdGltZUF2ZyA9IHRpbWVUb3QgLyBudW1UZXN0czsKKworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWluIHRpbWU6ICIgKyB0aW1lTWluLzEwMDAgKyAidXMiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1heCB0aW1lOiAiICsgdGltZU1heC8xMDAwICsgInVzIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdmcgdGltZTogIiArIHRpbWVBdmcvMTAwMCArICJ1cyIpOworCisgICAgdHJ5IHsKKyAgICAgIFN0cmluZyBqc29uID0gKG5ldyBUU2VyaWFsaXplcihuZXcgVFNpbXBsZUpTT05Qcm90b2NvbC5GYWN0b3J5KCkpKS50b1N0cmluZyhpbnNhbmUpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNhbXBsZSBUU2ltcGxlSlNPTlByb3RvY29sIG91dHB1dDpcbiIgKyBqc29uKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIHgpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqIik7CisgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgIH0KKworCisgICAgU3lzdGVtLmV4aXQocmV0dXJuQ29kZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWM0YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRIc0hhU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UTm9uYmxvY2tpbmdTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRIc0hhU2VydmVyLkFyZ3M7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuU2VydmVyVGVzdEJhc2UuVGVzdEhhbmRsZXI7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OworCisKK3B1YmxpYyBjbGFzcyBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgZXh0ZW5kcyBUZXN0U2VydmVyIHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKKyAgICB0cnkgeworICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgYm9vbGVhbiBoc2hhID0gZmFsc2U7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1wIikpIHsKKyAgICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaSsrXSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1oc2hhIikpIHsKKyAgICAgICAgICBoc2hhID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy9AVE9ETyBhZGQgb3RoZXIgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCB0eXBlcworCisgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0KKyAgICAgICAgbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0KKyAgICAgICAgbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKworICAgICAgLy8gVHJhbnNwb3J0CisgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9CisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Ob25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncygpLnBvcnQocG9ydCkpOworCisgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKKworICAgICAgaWYgKGhzaGEpIHsKKyAgICAgICAgLy8gSHNIYSBTZXJ2ZXIKKyAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRIc0hhU2VydmVyKG5ldyBBcmdzKHRTZXJ2ZXJTb2NrZXQpLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBOb25ibG9ja2luZyBTZXJ2ZXIKKyAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcihuZXcgQXJncyh0U2VydmVyU29ja2V0KS5wcm9jZXNzb3IodGVzdFByb2Nlc3NvcikpOworICAgICAgfQorCisgICAgICAvLyBSdW4gaXQKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgKyBwb3J0ICsgIi4uLiIpOworICAgICAgc2VydmVyRW5naW5lLnNlcnZlKCk7CisKKyAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb25lLiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNlNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXIuQXJnczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNpbXBsZVNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlclRlc3RCYXNlLlRlc3RIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyRXZlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UVGhyZWFkZWRTZWxlY3RvclNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URmFzdEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNlcnZlclNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNTTFRyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVE11bHRpcGxleGVkUHJvY2Vzc29yOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuSW5zYW5pdHk7CitpbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKK2ltcG9ydCB0aHJpZnQudGVzdC5TZWNvbmRTZXJ2aWNlOworaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb247CitpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb24yOworaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5YdHJ1Y3QyOworCitwdWJsaWMgY2xhc3MgVGVzdFNlcnZlciB7CisKKyAgLy8gTXVsdGlwbGV4ZWQgUHJvdG9jb2wgU3VwcG9ydCBEZXRhaWxzOgorICAvLworICAvLyBGb3IgbXVsdGlwbGV4ZWQgdGVzdGluZyB3ZSBhbHdheXMgdXNlIGJpbmFyeSBwcm90b2NvbCB1bmRlcm5lYXRoLgorICAvLworICAvLyAiVGhyaWZ0VGVzdCIgbmFtZWQgc2VydmljZSBpbXBsZW1lbnRzICJUaHJpZnRUZXN0IiBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CisgIC8vICJTZWNvbmRTZXJ2aWNlIiBuYW1lZCBzZXJ2aWNlIGltcGxlbWVudHMgIlNlY29uZFNlcnZpY2UiIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKKyAgLy8gSW4gYWRkaXRpb24sIHRvIHN1cHBvcnQgb2xkZXIgbm9uLW11bHRpcGxleGVkIGNsaWVudHMgdXNpbmcgdGhlIHNhbWUgY29uY3JldGUgcHJvdG9jb2wKKyAgLy8gdGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciBpcyB0YXVnaHQgdG8gdXNlICJUaHJpZnRUZXN0IiBpZiB0aGUgaW5jb21pbmcgcmVxdWVzdCBoYXMgbm8KKyAgLy8gbXVsdGlwbGV4ZWQgY2FsbCBuYW1lIGRlY29yYXRpb24uCisKKyAgc3RhdGljIGNsYXNzIFNlY29uZEhhbmRsZXIgaW1wbGVtZW50cyB0aHJpZnQudGVzdC5TZWNvbmRTZXJ2aWNlLklmYWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHNlY29uZHRlc3RTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0aGluZykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7IHJldHVybiAidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIikiOyB9CisKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBUZXN0U2VydmVyQ29udGV4dCBpbXBsZW1lbnRzIFNlcnZlckNvbnRleHQgeworCisgICAgICAgIGludCBjb25uZWN0aW9uSWQ7CisKKyAgICAgICAgcHVibGljIFRlc3RTZXJ2ZXJDb250ZXh0KGludCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbklkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbklkKGludCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICB9CisKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBUZXN0U2VydmVyRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgVFNlcnZlckV2ZW50SGFuZGxlciB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbmV4dENvbm5lY3Rpb25JZCA9IDE7CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJlU2VydmUoKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRTZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUgLSBjYWxsZWQgb25seSBvbmNlIGJlZm9yZSBzZXJ2ZXIgc3RhcnRzIGFjY2VwdGluZyBjb25uZWN0aW9ucyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlcnZlckNvbnRleHQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIC8vd2UgY2FuIGNyZWF0ZSBzb21lIGNvbm5lY3Rpb24gbGV2ZWwgZGF0YSB3aGljaCBpcyBzdG9yZWQgd2hpbGUgY29ubmVjdGlvbiBpcyBhbGl2ZSAmIHNlcnZlZAorICAgICAgICAgICAgVGVzdFNlcnZlckNvbnRleHQgY3R4ID0gbmV3IFRlc3RTZXJ2ZXJDb250ZXh0KG5leHRDb25uZWN0aW9uSWQrKyk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRTZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dCAtIGNvbm5lY3Rpb24gIyIrY3R4LmdldENvbm5lY3Rpb25JZCgpKyIgZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBjdHg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZXh0KFNlcnZlckNvbnRleHQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7CisgICAgICAgICAgICBUZXN0U2VydmVyQ29udGV4dCBjdHggPSAoVGVzdFNlcnZlckNvbnRleHQpc2VydmVyQ29udGV4dDsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVFNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0IC0gY29ubmVjdGlvbiAjIitjdHguZ2V0Q29ubmVjdGlvbklkKCkrIiB0ZXJtaW5hdGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGV4dChTZXJ2ZXJDb250ZXh0IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQsIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0KSB7CisgICAgICAgICAgICBUZXN0U2VydmVyQ29udGV4dCBjdHggPSAoVGVzdFNlcnZlckNvbnRleHQpc2VydmVyQ29udGV4dDsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVFNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dCAtIGNvbm5lY3Rpb24gIyIrY3R4LmdldENvbm5lY3Rpb25JZCgpKyIgaXMgcmVhZHkgdG8gcHJvY2VzcyBuZXh0IHJlcXVlc3QiKTsKKyAgICAgICAgfQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworICAgIHRyeSB7CisgICAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgICBib29sZWFuIHNzbCA9IGZhbHNlOworICAgICAgU3RyaW5nIHRyYW5zcG9ydF90eXBlID0gImJ1ZmZlcmVkIjsKKyAgICAgIFN0cmluZyBwcm90b2NvbF90eXBlID0gImJpbmFyeSI7CisgICAgICBTdHJpbmcgc2VydmVyX3R5cGUgPSAidGhyZWFkLXBvb2wiOworICAgICAgU3RyaW5nIGRvbWFpbl9zb2NrZXQgPSAiIjsKKyAgICAgIGludCBzdHJpbmdfbGltaXQgPSAtMTsKKyAgICAgIGludCBjb250YWluZXJfbGltaXQgPSAtMTsKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tc2VydmVyLXR5cGUiKSkgeworICAgICAgICAgICAgc2VydmVyX3R5cGUgPSBhcmdzW2ldLnNwbGl0KCI9IilbMV07CisgICAgICAgICAgICBzZXJ2ZXJfdHlwZS50cmltKCk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgICBwb3J0PUludGVnZXIucGFyc2VJbnQoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1wcm90b2NvbCIpKSB7CisgICAgICAgICAgICBwcm90b2NvbF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgICAgcHJvdG9jb2xfdHlwZS50cmltKCk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tdHJhbnNwb3J0IikpIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgICAgdHJhbnNwb3J0X3R5cGUudHJpbSgpOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tc3NsIikpIHsKKyAgICAgICAgICAgIHNzbCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tc3RyaW5nLWxpbWl0IikpIHsKKyAgICAgICAgICAgIHN0cmluZ19saW1pdCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLWNvbnRhaW5lci1saW1pdCIpKSB7CisgICAgICAgICAgICBjb250YWluZXJfbGltaXQgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWhlbHAiKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbGxvd2VkIG9wdGlvbnM6Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1oZWxwXHRcdFx0UHJvZHVjZSBoZWxwIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXBvcnQ9YXJnICg9IiArIHBvcnQgKyAiKVx0UG9ydCBudW1iZXIgdG8gY29ubmVjdCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tdHJhbnNwb3J0PWFyZyAoPSIgKyB0cmFuc3BvcnRfdHlwZSArICIpXG5cdFx0XHRcdFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgZmFzdGZyYW1lZCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zc2xcdFx0XHRFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc2VydmVyLXR5cGU9YXJnICg9IiArIHNlcnZlcl90eXBlICsiKVxuXHRcdFx0XHRUeXBlIG9mIHNlcnZlcjogc2ltcGxlLCB0aHJlYWQtcG9vbCwgbm9uYmxvY2tpbmcsIHRocmVhZGVkLXNlbGVjdG9yIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zdHJpbmctbGltaXQ9YXJnICg9IiArIHN0cmluZ19saW1pdCArICIpXHRTdHJpbmcgcmVhZCBsZW5ndGggbGltaXQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWNvbnRhaW5lci1saW1pdD1hcmcgKD0iICsgY29udGFpbmVyX2xpbWl0ICsgIilcdENvbnRhaW5lciByZWFkIGxlbmd0aCBsaW1pdCIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbiBub3QgcGFyc2UgYXJndW1lbnRzISBTZWUgLS1oZWxwIik7CisgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJzaW1wbGUiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkLXBvb2wiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSkgeworICAgICAgICAgIGlmIChzc2wgPT0gdHJ1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU1NMIGlzIG5vdCBzdXBwb3J0ZWQgb3ZlciBub25ibG9ja2luZyBzZXJ2ZXJzISIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZGVkLXNlbGVjdG9yIikpIHsKKyAgICAgICAgICBpZiAoc3NsID09IHRydWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlNTTCBpcyBub3Qgc3VwcG9ydGVkIG92ZXIgbm9uYmxvY2tpbmcgc2VydmVycyEiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBzZXJ2ZXIgdHlwZSEgIiArIHNlcnZlcl90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gcHJvdG9jb2wgdHlwZSEgIiArIHByb3RvY29sX3R5cGUpOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmYXN0ZnJhbWVkIikpIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHRyYW5zcG9ydCB0eXBlISAiICsgdHJhbnNwb3J0X3R5cGUpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgIH0KKworICAgICAgLy8gUHJvY2Vzc29ycworICAgICAgVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKyAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IodGVzdEhhbmRsZXIpOworCisgICAgICBTZWNvbmRIYW5kbGVyIHNlY29uZEhhbmRsZXIgPSBuZXcgU2Vjb25kSGFuZGxlcigpOworICAgICAgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3Igc2Vjb25kUHJvY2Vzc29yID0gbmV3IFNlY29uZFNlcnZpY2UuUHJvY2Vzc29yKHNlY29uZEhhbmRsZXIpOworCisgICAgICAvLyBQcm90b2NvbCBmYWN0b3J5CisgICAgICBUUHJvdG9jb2xGYWN0b3J5IHRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpTT05Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KHN0cmluZ19saW1pdCwgY29udGFpbmVyX2xpbWl0KTsKKyAgICAgIH0gZWxzZSB7IC8vIGFsc28gY292ZXJzIG11bHRpCisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3Rvcnkoc3RyaW5nX2xpbWl0LCBjb250YWluZXJfbGltaXQpOworICAgICAgfQorCisgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0VHJhbnNwb3J0RmFjdG9yeSA9IG51bGw7CisKKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CisgICAgICAgIHRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpOworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZhc3RmcmFtZWQiKSkgeworICAgICAgICB0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CisgICAgICB9IGVsc2UgeyAvLyAuZXF1YWxzKCJidWZmZXJlZCIpID0+IGRlZmF1bHQgdmFsdWUKKyAgICAgICAgdFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICAgIH0KKworICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBudWxsOworCisgICAgICAvLyBJZiB3ZSBhcmUgbXVsdGlwbGV4aW5nIHNlcnZpY2VzIGluIG9uZSBzZXJ2ZXIuLi4KKyAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyRGVmYXVsdCAgKHRlc3RQcm9jZXNzb3IpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoIlRocmlmdFRlc3QiLCB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKTsKKworICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSB8fAorICAgICAgICAgIHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkZWQtc2VsZWN0b3IiKSkgeworICAgICAgICAvLyBOb25ibG9ja2luZyBzZXJ2ZXJzCisgICAgICAgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCB0Tm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgPQorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Ob25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncygpLnBvcnQocG9ydCkpOworCisgICAgICAgIGlmIChzZXJ2ZXJfdHlwZS5jb250YWlucygibm9uYmxvY2tpbmciKSkgeworICAgICAgICAgIC8vIE5vbmJsb2NraW5nIFNlcnZlcgorICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlci5BcmdzIHROb25ibG9ja2luZ1NlcnZlckFyZ3MKKyAgICAgICAgICAgICAgPSBuZXcgVE5vbmJsb2NraW5nU2VydmVyLkFyZ3ModE5vbmJsb2NraW5nU2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHROb25ibG9ja2luZ1NlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOworICAgICAgICAgIHROb25ibG9ja2luZ1NlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcih0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzKTsKKyAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRlZC1zZWxlY3RvciIpCisgICAgICAgICAgLy8gVGhyZWFkZWRTZWxlY3RvciBTZXJ2ZXIKKyAgICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncworICAgICAgICAgICAgICA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7CisgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncy5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSk7CisgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOworICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlcih0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBCbG9ja2luZyBzZXJ2ZXJzCisKKyAgICAgICAgLy8gU1NMIHNvY2tldAorICAgICAgICBUU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPSBudWxsOworICAgICAgICBpZiAoc3NsKSB7CisgICAgICAgICAgdFNlcnZlclNvY2tldCA9IFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChwb3J0LCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0U2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQuU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLnBvcnQocG9ydCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygic2ltcGxlIikpIHsKKyAgICAgICAgICAvLyBTaW1wbGUgU2VydmVyCisgICAgICAgICAgVFNlcnZlci5BcmdzIHRTZXJ2ZXJBcmdzID0gbmV3IFRTZXJ2ZXIuQXJncyh0U2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0U2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0U2VydmVyQXJncy5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSk7CisgICAgICAgICAgdFNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIodFNlcnZlckFyZ3MpOworICAgICAgICB9IGVsc2UgeyAvLyBzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZHBvb2wiKQorICAgICAgICAgIC8vIFRocmVhZFBvb2wgU2VydmVyCisgICAgICAgICAgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyB0VGhyZWFkUG9vbFNlcnZlckFyZ3MKKyAgICAgICAgICAgICAgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyh0U2VydmVyU29ja2V0KTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHRUaHJlYWRQb29sU2VydmVyQXJncyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gU2V0IHNlcnZlciBldmVudCBoYW5kbGVyCisgICAgICBzZXJ2ZXJFbmdpbmUuc2V0U2VydmVyRXZlbnRIYW5kbGVyKG5ldyBUZXN0U2VydmVyRXZlbnRIYW5kbGVyKCkpOworCisgICAgICAvLyBSdW4gaXQKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGhlICIgKyAoc3NsID8gInNzbCBzZXJ2ZXIiIDogInNlcnZlciIpICsKKyAgICAgICAgIiBbIiArIHByb3RvY29sX3R5cGUgKyAiLyIgKyB0cmFuc3BvcnRfdHlwZSArICIvIiArIHNlcnZlcl90eXBlICsgIl0gb24gIiArCisgICAgICAgICgoZG9tYWluX3NvY2tldCA9PSAiIikgPyAoInBvcnQgIiArIHBvcnQpIDogKCJ1bml4IHNvY2tldCAiICsgZG9tYWluX3NvY2tldCkpKTsKKyAgICAgIHNlcnZlckVuZ2luZS5zZXJ2ZSgpOworCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9uZS4iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1RvU3RyaW5nVGVzdC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1RvU3RyaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjlhNjFjLi4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9Ub1N0cmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50ZXN0OwotCi1pbXBvcnQgdGhyaWZ0LnRlc3QuKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb1N0cmluZ1Rlc3QgewotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBKYXZhVGVzdEhlbHBlciBvYmplY3QgPSBuZXcgSmF2YVRlc3RIZWxwZXIoKTsKLSAgICBvYmplY3QucmVxX2ludCA9IDA7Ci0gICAgb2JqZWN0LnJlcV9vYmogPSAiIjsKLQotCi0gICAgb2JqZWN0LnJlcV9iaW4gPSBuZXcgYnl0ZVtdIHsKLSAgICAgIDAsIC0xLCAyLCAtMywgNCwgLTUsIDYsIC03LCA4LCAtOSwgMTAsIC0xMSwgMTIsIC0xMywgMTQsIC0xNSwKLSAgICAgIDE2LCAtMTcsIDE4LCAtMTksIDIwLCAtMjEsIDIyLCAtMjMsIDI0LCAtMjUsIDI2LCAtMjcsIDI4LCAtMjksCi0gICAgICAzMCwgLTMxLCAzMiwgLTMzLCAzNCwgLTM1LCAzNiwgLTM3LCAzOCwgLTM5LCA0MCwgLTQxLCA0MiwgLTQzLCA0NCwKLSAgICAgIC00NSwgNDYsIC00NywgNDgsIC00OSwgNTAsIC01MSwgNTIsIC01MywgNTQsIC01NSwgNTYsIC01NywgNTgsIC01OSwKLSAgICAgIDYwLCAtNjEsIDYyLCAtNjMsIDY0LCAtNjUsIDY2LCAtNjcsIDY4LCAtNjksIDcwLCAtNzEsIDcyLCAtNzMsIDc0LAotICAgICAgLTc1LCA3NiwgLTc3LCA3OCwgLTc5LCA4MCwgLTgxLCA4MiwgLTgzLCA4NCwgLTg1LCA4NiwgLTg3LCA4OCwgLTg5LAotICAgICAgOTAsIC05MSwgOTIsIC05MywgOTQsIC05NSwgOTYsIC05NywgOTgsIC05OSwgMTAwLCAtMTAxLCAxMDIsIC0xMDMsCi0gICAgICAxMDQsIC0xMDUsIDEwNiwgLTEwNywgMTA4LCAtMTA5LCAxMTAsIC0xMTEsIDExMiwgLTExMywgMTE0LCAtMTE1LAotICAgICAgMTE2LCAtMTE3LCAxMTgsIC0xMTksIDEyMCwgLTEyMSwgMTIyLCAtMTIzLCAxMjQsIC0xMjUsIDEyNiwgLTEyNywKLSAgICB9OwotCi0gICAgaWYgKCFvYmplY3QudG9TdHJpbmcoKS5lcXVhbHMoCi0gICAgICAgICJKYXZhVGVzdEhlbHBlcihyZXFfaW50OjAsIHJlcV9vYmo6LCByZXFfYmluOiIrCi0gICAgICAgICIwMCBGRiAwMiBGRCAwNCBGQiAwNiBGOSAwOCBGNyAwQSBGNSAwQyBGMyAwRSBGMSAxMCBFRiAxMiBFRCAxNCAiKwotICAgICAgICAiRUIgMTYgRTkgMTggRTcgMUEgRTUgMUMgRTMgMUUgRTEgMjAgREYgMjIgREQgMjQgREIgMjYgRDkgMjggRDcgIisKLSAgICAgICAgIjJBIEQ1IDJDIEQzIDJFIEQxIDMwIENGIDMyIENEIDM0IENCIDM2IEM5IDM4IEM3IDNBIEM1IDNDIEMzIDNFICIrCi0gICAgICAgICJDMSA0MCBCRiA0MiBCRCA0NCBCQiA0NiBCOSA0OCBCNyA0QSBCNSA0QyBCMyA0RSBCMSA1MCBBRiA1MiBBRCAiKwotICAgICAgICAiNTQgQUIgNTYgQTkgNTggQTcgNUEgQTUgNUMgQTMgNUUgQTEgNjAgOUYgNjIgOUQgNjQgOUIgNjYgOTkgNjggIisKLSAgICAgICAgIjk3IDZBIDk1IDZDIDkzIDZFIDkxIDcwIDhGIDcyIDhEIDc0IDhCIDc2IDg5IDc4IDg3IDdBIDg1IDdDIDgzICIrCi0gICAgICAgICI3RSA4MSkiKSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICB9Ci0gCi0gICAgb2JqZWN0LnJlcV9iaW4gPSBuZXcgYnl0ZVtdIHsKLSAgICAgIDAsIC0xLCAyLCAtMywgNCwgLTUsIDYsIC03LCA4LCAtOSwgMTAsIC0xMSwgMTIsIC0xMywgMTQsIC0xNSwKLSAgICAgIDE2LCAtMTcsIDE4LCAtMTksIDIwLCAtMjEsIDIyLCAtMjMsIDI0LCAtMjUsIDI2LCAtMjcsIDI4LCAtMjksCi0gICAgICAzMCwgLTMxLCAzMiwgLTMzLCAzNCwgLTM1LCAzNiwgLTM3LCAzOCwgLTM5LCA0MCwgLTQxLCA0MiwgLTQzLCA0NCwKLSAgICAgIC00NSwgNDYsIC00NywgNDgsIC00OSwgNTAsIC01MSwgNTIsIC01MywgNTQsIC01NSwgNTYsIC01NywgNTgsIC01OSwKLSAgICAgIDYwLCAtNjEsIDYyLCAtNjMsIDY0LCAtNjUsIDY2LCAtNjcsIDY4LCAtNjksIDcwLCAtNzEsIDcyLCAtNzMsIDc0LAotICAgICAgLTc1LCA3NiwgLTc3LCA3OCwgLTc5LCA4MCwgLTgxLCA4MiwgLTgzLCA4NCwgLTg1LCA4NiwgLTg3LCA4OCwgLTg5LAotICAgICAgOTAsIC05MSwgOTIsIC05MywgOTQsIC05NSwgOTYsIC05NywgOTgsIC05OSwgMTAwLCAtMTAxLCAxMDIsIC0xMDMsCi0gICAgICAxMDQsIC0xMDUsIDEwNiwgLTEwNywgMTA4LCAtMTA5LCAxMTAsIC0xMTEsIDExMiwgLTExMywgMTE0LCAtMTE1LAotICAgICAgMTE2LCAtMTE3LCAxMTgsIC0xMTksIDEyMCwgLTEyMSwgMTIyLCAtMTIzLCAxMjQsIC0xMjUsIDEyNiwgLTEyNywKLSAgICAgIDAsCi0gICAgfTsKLQotICAgIGlmICghb2JqZWN0LnRvU3RyaW5nKCkuZXF1YWxzKAotICAgICAgICAiSmF2YVRlc3RIZWxwZXIocmVxX2ludDowLCByZXFfb2JqOiwgcmVxX2JpbjoiKwotICAgICAgICAiMDAgRkYgMDIgRkQgMDQgRkIgMDYgRjkgMDggRjcgMEEgRjUgMEMgRjMgMEUgRjEgMTAgRUYgMTIgRUQgMTQgIisKLSAgICAgICAgIkVCIDE2IEU5IDE4IEU3IDFBIEU1IDFDIEUzIDFFIEUxIDIwIERGIDIyIEREIDI0IERCIDI2IEQ5IDI4IEQ3ICIrCi0gICAgICAgICIyQSBENSAyQyBEMyAyRSBEMSAzMCBDRiAzMiBDRCAzNCBDQiAzNiBDOSAzOCBDNyAzQSBDNSAzQyBDMyAzRSAiKwotICAgICAgICAiQzEgNDAgQkYgNDIgQkQgNDQgQkIgNDYgQjkgNDggQjcgNEEgQjUgNEMgQjMgNEUgQjEgNTAgQUYgNTIgQUQgIisKLSAgICAgICAgIjU0IEFCIDU2IEE5IDU4IEE3IDVBIEE1IDVDIEEzIDVFIEExIDYwIDlGIDYyIDlEIDY0IDlCIDY2IDk5IDY4ICIrCi0gICAgICAgICI5NyA2QSA5NSA2QyA5MyA2RSA5MSA3MCA4RiA3MiA4RCA3NCA4QiA3NiA4OSA3OCA4NyA3QSA4NSA3QyA4MyAiKwotICAgICAgICAiN0UgODEgLi4uKSIpKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotICAgIH0gCi0KLSAgICBvYmplY3QucmVxX2JpbiA9IG5ldyBieXRlW10ge307Ci0gICAgb2JqZWN0LnNldE9wdF9iaW5Jc1NldCh0cnVlKTsKLQotCi0gICAgaWYgKCFvYmplY3QudG9TdHJpbmcoKS5lcXVhbHMoCi0gICAgICAgICJKYXZhVGVzdEhlbHBlcihyZXFfaW50OjAsIHJlcV9vYmo6LCByZXFfYmluOikiKSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICB9IAotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEKaW5kZXggYjJiMWU1Ny4uM2M3NDlmOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEKQEAgLTE4LDMyICsxOCw0NCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogCiBwdWJsaWMgY2xhc3MgUmVhZENvdW50aW5nVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CiAgIHB1YmxpYyBpbnQgcmVhZENvdW50ID0gMDsKICAgcHJpdmF0ZSBUVHJhbnNwb3J0IHRyYW5zOworICBwcml2YXRlIGJvb2xlYW4gb3BlbiA9IHRydWU7CiAKICAgcHVibGljIFJlYWRDb3VudGluZ1RyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcpIHsKICAgICB0cmFucyA9IHVuZGVybHlpbmc7CiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgY2xvc2UoKSB7fQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBvcGVuID0gZmFsc2U7CisgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkge3JldHVybiB0cnVlO30KKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiBvcGVuOworICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQorICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIG9wZW4gPSB0cnVlOworICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIlRyYW5zcG9ydCBpcyBjbG9zZWQiKTsKKyAgICB9CiAgICAgcmVhZENvdW50Kys7CiAgICAgcmV0dXJuIHRyYW5zLnJlYWQoYnVmLCBvZmYsIGxlbik7CiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiVHJhbnNwb3J0IGlzIGNsb3NlZCIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1MzQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdEV4cGFuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBoYXMgZXhwZWN0ZWQgaW5pdGlhbCBjYXBhY2l0eQorICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwKTsKKyAgICBhc3NlcnRFcXVhbHMoMTAsIGIuYXJyYXkoKS5sZW5ndGgpOworCisgICAgLy8gZG9lc24ndCBzaHJpbmsKKyAgICBiLnJlc2l6ZUlmTmVjZXNzYXJ5KDgpOworICAgIGFzc2VydEVxdWFscygxMCwgYi5hcnJheSgpLmxlbmd0aCk7CisKKyAgICAvLyBncm93cyB3aGVuIG1vcmUgY2FwYWNpdHkgaXMgbmVlZGVkCisgICAgYi5yZXNpemVJZk5lY2Vzc2FyeSgxMDApOworICAgIGFzc2VydFRydWUoYi5hcnJheSgpLmxlbmd0aCA+PSAxMDApOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZWJjMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBIVU5EUkVEX0JZVEVTID0gbmV3IGJ5dGVbMTAwXTsKKworICBzdGF0aWMgeworICAgIGZvciAoYnl0ZSBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICBIVU5EUkVEX0JZVEVTW2ldID0gaTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCB0ID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0KDE1MCk7CisKKyAgICBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtYnVmID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChIVU5EUkVEX0JZVEVTKTsKKworICAgIHQuZmlsbChtZW1idWYsIDEwMCk7CisgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdC5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkpOworICAgIGFzc2VydEVxdWFscygwLCB0LmdldEJ1ZmZlclBvc2l0aW9uKCkpOworCisgICAgYnl0ZVtdIHRhcmdldCA9IG5ldyBieXRlWzEwXTsKKyAgICBhc3NlcnRFcXVhbHMoMTAsIHQucmVhZCh0YXJnZXQsIDAsIDEwKSk7CisgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChIVU5EUkVEX0JZVEVTLCAwLCAxMCksIEJ5dGVCdWZmZXIud3JhcCh0YXJnZXQpKTsKKworICAgIGFzc2VydEVxdWFscyg5MCwgdC5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkpOworICAgIGFzc2VydEVxdWFscygxMCwgdC5nZXRCdWZmZXJQb3NpdGlvbigpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjViMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CisKK3B1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHsKKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgdCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoMSwgMCk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHQuZ2V0TGVuZ3RoKCkpOworICAgIGFzc2VydEVxdWFscygxLCB0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKKyAgICBieXRlW10gYjEgPSBuZXcgYnl0ZVtdezEsMiwzfTsKKyAgICB0LndyaXRlKGIxKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgdC5nZXRMZW5ndGgoKSk7CisgICAgYXNzZXJ0VHJ1ZSh0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoID49IDMpOworICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoYjEpLCBCeXRlQnVmZmVyLndyYXAodC5nZXRCdWYoKS5hcnJheSgpLCAwLCAzKSk7CisKKyAgICB0LnJlc2V0KCk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHQuZ2V0TGVuZ3RoKCkpOworICAgIGFzc2VydFRydWUodC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCA+PSAzKTsKKyAgICBieXRlW10gYjIgPSBuZXcgYnl0ZVtdezQsNX07CisgICAgdC53cml0ZShiMik7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHQuZ2V0TGVuZ3RoKCkpOworICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoYjIpLCBCeXRlQnVmZmVyLndyYXAodC5nZXRCdWYoKS5hcnJheSgpLCAwLCAyKSk7CisKKyAgICBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgdXV0ID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCg4LCA0KTsKKyAgICBhc3NlcnRFcXVhbHMoNCwgdXV0LmdldExlbmd0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoOCwgdXV0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKKyAgICB1dXQud3JpdGUoYjEpOworICAgIGFzc2VydEVxdWFscyg3LCB1dXQuZ2V0TGVuZ3RoKCkpOworICAgIGFzc2VydEVxdWFscyg4LCB1dXQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGgpOworICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoYjEpLCBCeXRlQnVmZmVyLndyYXAodXV0LmdldEJ1ZigpLmFycmF5KCksIDQsIDMpKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0QmFkSW5pdGlhbFNpemUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDAsIDApOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RCYWRGcm9udFJlc2VydmVTaXplKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCg0LCAtMSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdFRvb1NtYWxsRnJvbnRSZXNlcnZlU2l6ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoNCwgNSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRCeXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczMDc1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5DaGFyc2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworcHVibGljIGNsYXNzIFRlc3RUQnl0ZUJ1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdFJlYWRXcml0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFRCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBuZXcgVEJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxNikpOworICAgIGJ5dGVCdWZmZXIud3JpdGUoIkhlbGxvIFdvcmxkIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQiLCBuZXcgU3RyaW5nKGJ5dGVCdWZmZXIuZmxpcCgpLnRvQnl0ZUFycmF5KCksIENoYXJzZXRzLlVURl84KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmV1c2VSZWFkV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTYpKTsKKyAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIiwgbmV3IFN0cmluZyhieXRlQnVmZmVyLmZsaXAoKS50b0J5dGVBcnJheSgpLCBDaGFyc2V0cy5VVEZfOCkpOworCisgICAgYnl0ZUJ1ZmZlci5jbGVhcigpOworCisgICAgYnl0ZUJ1ZmZlci53cml0ZSgiR29vZGJ5ZSBIb3JzZXMiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgYXNzZXJ0RXF1YWxzKCJHb29kYnllIEhvcnNlcyIsIG5ldyBTdHJpbmcoYnl0ZUJ1ZmZlci5mbGlwKCkudG9CeXRlQXJyYXkoKSwgQ2hhcnNldHMuVVRGXzgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPdmVyZmxvdygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFRCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBuZXcgVEJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KSk7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVCdWZmZXIud3JpdGUoIkhlbGxvIFdvcmxkIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgd3JpdGUgb3BlcmF0aW9uIHRvIGZhaWwgd2l0aCBUVHJhbnNwb3J0RXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoIk5vdCBlbm91Z2ggcm9vbSBpbiBvdXRwdXQgYnVmZmVyIiwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmVlMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0VEZyYW1lZFRyYW5zcG9ydCB7CisgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IElOSVRJQUxfQ0FQQUNJVFkgPSA1MDsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgeworICAgIHJldHVybiBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZywgSU5JVElBTF9DQVBBQ0lUWSwgMTAgKiAxMDI0ICogMTAyNCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZywgaW50IG1heExlbmd0aCkgeworICAgIHJldHVybiBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZywgSU5JVElBTF9DQVBBQ0lUWSwgbWF4TGVuZ3RoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggMjdkYWQ4MC4uZTMwZDc0YiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwpAQCAtMjksNyArMzAsMTUgQEAKIAogcHVibGljIGNsYXNzIFRlc3RURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVGVzdENhc2UgewogCi0gIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBieXRlU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgIHByb3RlY3RlZCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcpIHsKKyAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZyk7CisgIH0KKworICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgbWF4TGVuZ3RoKSB7CisgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIG1heExlbmd0aCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBieXRlU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2VuZC1zdGFydCsxXTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAoZW5kLXN0YXJ0KTsgaSsrKSB7CiAgICAgICByZXN1bHRbaV0gPSAoYnl0ZSkoc3RhcnQraSk7CkBAIC00MywyNiArNTIsNzEgQEAKICAgICBkb3Mud3JpdGVJbnQoNTApOwogICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgNDkpKTsKIAorICAgIGRvcy53cml0ZUludCgyMjApOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjE5KSk7CisKICAgICBUTWVtb3J5QnVmZmVyIG1lbWJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOwogICAgIG1lbWJ1Zi53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOwogCiAgICAgUmVhZENvdW50aW5nVHJhbnNwb3J0IGNvdW50VHJhbnMgPSBuZXcgUmVhZENvdW50aW5nVHJhbnNwb3J0KG1lbWJ1Zik7Ci0gICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KGNvdW50VHJhbnMpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRUcmFucyk7CiAKICAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzEwXTsKICAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDEwKTsKICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVhZEJ1ZiwgYnl0ZVNlcXVlbmNlKDAsOSkpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRUcmFucy5yZWFkQ291bnQpOwogCiAgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAxMCk7CiAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgxMCwxOSkpKTsKLQogICAgIGFzc2VydEVxdWFscygyLCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CisKKyAgICBhc3NlcnRFcXVhbHMoMzAsIHRyYW5zLnJlYWQobmV3IGJ5dGVbMzBdLCAwLCAzMCkpOworICAgIGFzc2VydEVxdWFscygyLCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CisKKyAgICByZWFkQnVmID0gbmV3IGJ5dGVbMjIwXTsKKyAgICBhc3NlcnRFcXVhbHMoMjIwLCB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDIyMCkpOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMCwgMjE5KSkpOworICAgIGFzc2VydEVxdWFscyg0LCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZyYW1lU2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaW50IG1heExlbmd0aCA9IDEyODsKKworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgZG9zLndyaXRlSW50KDEzMCk7CisgICAgZG9zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAxMjkpKTsKKworICAgIFRNZW1vcnlCdWZmZXIgbWVtYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgbWVtYnVmLndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICBSZWFkQ291bnRpbmdUcmFuc3BvcnQgY291bnRUcmFucyA9IG5ldyBSZWFkQ291bnRpbmdUcmFuc3BvcnQobWVtYnVmKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50VHJhbnMsIG1heExlbmd0aCk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzEwXTsKKyAgICB0cnkgeworICAgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCA0KTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uIGJlY2F1c2UgdGhlIGZyYW1lIHdlJ3JlIHRyeWluZyB0byByZWFkIGlzIGxhcmdlciB0aGFuIG91ciBtYXggZnJhbWUgbGVuZ3RoCisgICAgICBhc3NlcnRFcXVhbHMoVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwgZS5nZXRUeXBlKCkpOworICAgIH0KKworICAgIGFzc2VydEZhbHNlKHRyYW5zLmlzT3BlbigpKTsKKworICAgIHRyeSB7CisgICAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDQpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUaGlzIHRpbWUgd2UgZ2V0IGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQKKyAgICAgIGFzc2VydEVxdWFscyhUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBlLmdldFR5cGUoKSk7CisgICAgfQogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdFdyaXRlKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBXcml0ZUNvdW50aW5nVHJhbnNwb3J0IGNvdW50aW5nVHJhbnMgPSBuZXcgV3JpdGVDb3VudGluZ1RyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KGJhb3MpKTsKLSAgICBUVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoY291bnRpbmdUcmFucyk7CisgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYmFvcykpKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50aW5nVHJhbnMpOwogCiAgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDAsMTAwKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDAsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CkBAIC03MSw2ICsxMjUsMTAgQEAKICAgICBhc3NlcnRFcXVhbHMoMCwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIHRyYW5zLmZsdXNoKCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisKKyAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjQ1KSk7CisgICAgdHJhbnMuZmx1c2goKTsKICAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIERhdGFJbnB1dFN0cmVhbSBkaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKQEAgLTc5LDYgKzEzNywxMSBAQAogICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyNTZdOwogICAgIGRpbi5yZWFkKGJ1ZiwgMCwgMjU2KTsKICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZVNlcXVlbmNlKDAsMjU1KSwgYnVmKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoMjQ2LCBkaW4ucmVhZEludCgpKTsKKyAgICBidWYgPSBuZXcgYnl0ZVsyNDZdOworICAgIGRpbi5yZWFkKGJ1ZiwgMCwgMjQ2KTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZVNlcXVlbmNlKDAsMjQ1KSwgYnVmKSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0UmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CkBAIC04NiwxMiArMTQ5LDE0IEBACiAgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiYW9zKTsKICAgICBkb3Mud3JpdGVJbnQoNTApOwogICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgNDkpKTsKKyAgICBkb3Mud3JpdGVJbnQoNzUpOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMTI1LCAyMDApKTsKIAogICAgIFRNZW1vcnlCdWZmZXIgbWVtYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CiAgICAgbWVtYnVmLndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7CiAKICAgICBSZWFkQ291bnRpbmdUcmFuc3BvcnQgY291bnRUcmFucyA9IG5ldyBSZWFkQ291bnRpbmdUcmFuc3BvcnQobWVtYnVmKTsKLSAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoY291bnRUcmFucyk7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudFRyYW5zKTsKIAogICAgIGFzc2VydEVxdWFscygwLCB0cmFucy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkpOwogCkBAIC0xMDcsNSArMTcyLDQzIEBACiAgICAgYXNzZXJ0RXF1YWxzKDE1LCB0cmFucy5nZXRCdWZmZXJQb3NpdGlvbigpKTsKIAogICAgIGFzc2VydEVxdWFscygyLCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CisKKyAgICBhc3NlcnRFcXVhbHMoMzUsIHRyYW5zLnJlYWQobmV3IGJ5dGVbMzVdLCAwLCAzNSkpOworICAgIGFzc2VydEVxdWFscygwLCB0cmFucy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkpOworICAgIGFzc2VydEVxdWFscyg1MCwgdHJhbnMuZ2V0QnVmZmVyUG9zaXRpb24oKSk7CisKKyAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDEwKTsKKyAgICBhc3NlcnRFcXVhbHMoNCwgY291bnRUcmFucy5yZWFkQ291bnQpOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMTI1LDEzNCkpKTsKKyAgICBhc3NlcnRFcXVhbHMoNjUsIHRyYW5zLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEwLCB0cmFucy5nZXRCdWZmZXJQb3NpdGlvbigpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiYW9zKTsKKyAgICBkb3Mud3JpdGVJbnQoMjIwKTsKKyAgICBkb3Mud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDIxOSkpOworCisgICAgVE1lbW9yeUJ1ZmZlciBtZW1idWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBtZW1idWYud3JpdGUoYmFvcy50b0J5dGVBcnJheSgpKTsKKworICAgIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBjb3VudFRyYW5zID0gbmV3IFJlYWRDb3VudGluZ1RyYW5zcG9ydChtZW1idWYpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRUcmFucyk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzIyMF07CisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAyMjApOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMCwyMTkpKSk7CisKKyAgICBhc3NlcnRUcnVlKHRyYW5zIGluc3RhbmNlb2YgVEZyYW1lZFRyYW5zcG9ydCB8fCB0cmFucyBpbnN0YW5jZW9mIFRGYXN0RnJhbWVkVHJhbnNwb3J0KTsKKyAgICBpZiAodHJhbnMgaW5zdGFuY2VvZiBURnJhbWVkVHJhbnNwb3J0KSB7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpICE9IG51bGwgJiYgdHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gMCk7CisgICAgICAoKFRGcmFtZWRUcmFuc3BvcnQpIHRyYW5zKS5jbGVhcigpOworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKSA9PSBudWxsKTsKKyAgICB9IGVsc2UgaWYgKHRyYW5zIGluc3RhbmNlb2YgVEZhc3RGcmFtZWRUcmFuc3BvcnQpIHsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LklOSVRJQUxfQ0FQQUNJVFkpOworICAgICAgKChURmFzdEZyYW1lZFRyYW5zcG9ydCkgdHJhbnMpLmNsZWFyKCk7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpLmxlbmd0aCA9PSBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuSU5JVElBTF9DQVBBQ0lUWSk7CisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMmMyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlclRlc3RCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2ltcGxlU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyLkFyZ3M7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkgZXh0ZW5kcyBTZXJ2ZXJUZXN0QmFzZSB7CisgIHByaXZhdGUgVGhyZWFkIHNlcnZlclRocmVhZDsKKyAgcHJpdmF0ZSBUU2VydmVyIHNlcnZlcjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29scyA9IG5ldyBBcnJheUxpc3Q8VFByb3RvY29sRmFjdG9yeT4oKTsKKyAgc3RhdGljIHsKKyAgICAvLyBUT0RPOiBPbmx5IHN1cHBvcnRlZCBvbiBUQmluYXJ5UHJvdG9jb2wuIERvZXNuJ3Qgd29yayBmb3IgVENvbXBhY3RQcm90b2NvbAorICAgIHByb3RvY29scy5hZGQobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpCisgIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCk7CisgIH0KKyAgCisgIHByb3RlY3RlZCBUU2VydmVyU29ja2V0IGdldFNlcnZlclRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoZmluYWwgVFByb2Nlc3NvciBwcm9jZXNzb3IsIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5LCBmaW5hbCBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KQorICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gZ2V0U2VydmVyVHJhbnNwb3J0KCk7CisgICAgICAgICAgZmluYWwgQXJncyBhcmdzID0gbmV3IEFyZ3Moc2VydmVyVHJhbnNwb3J0KS5wcm9jZXNzb3IocHJvY2Vzc29yKTsKKyAgICAgICAgICBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihhcmdzKTsKKyAgICAgICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKyAgICBUaHJlYWQuc2xlZXAoU0xFRVBfREVMQVkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHN0b3BTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXIuc3RvcCgpOworICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb3BlbihUVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbiB7fQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxUUHJvdG9jb2xGYWN0b3J5PiBnZXRQcm90b2NvbHMoKSB7CisgICAgcmV0dXJuIHByb3RvY29sczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNwb3J0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIHRoaXMgdGVzdCBkb2Vzbid0IHJlYWxseSBhcHBseSB0byB0aGlzIHN1aXRlLCBzbyBsZXQncyBza2lwIGl0LgorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQxLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDEuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50MSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpCisgIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKworICAgIHBhcmFtcy5zZXRUcnVzdFN0b3JlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiksCisgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIikpOworCisgICAgcmV0dXJuIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldENsaWVudFNvY2tldChIT1NULCBQT1JULCAwLyp0aW1lb3V0Ki8sIHBhcmFtcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWVkNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50Mi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQyIGV4dGVuZHMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRUcmFuc3BvcnQgZ2V0Q2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCkKKyAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3CisgICAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworCisgICAgcGFyYW1zLnNldFRydXN0U3RvcmUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiKSwgbnVsbCk7CisKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmY1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBrZXlTdG9yZUxvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIik7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIpOworICAKKyAgcHVibGljIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeVN0cmVhbWVkU3RvcmUoKSB7CisgICAgc3VwZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiAgT3ZlcnJpZGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gYmUgYWJsZSB0byB0ZXN0IHBhc3NpbmcKKyAgICAgKiAgdGhlIHRydXN0U3RvcmUgYW5kIGtleVN0b3JlIGFzIGlucHV0IHN0cmVhbQorICAgICAqLworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgIiIpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsICIiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KQorICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCk7CisKKyAgICBwYXJhbXMuc2V0VHJ1c3RTdG9yZShuZXcgRmlsZUlucHV0U3RyZWFtKHRydXN0U3RvcmVMb2NhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIpKTsKKyAgICAKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKyAgICAKKyAgICBwYXJhbXMuc2V0S2V5U3RvcmUobmV3IEZpbGVJbnB1dFN0cmVhbShrZXlTdG9yZUxvY2F0aW9uKSwgCisgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIikpOworICAgIAorICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCwgMC8qdGltZW91dCovLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSE9TVCksIHBhcmFtcyk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhMDZlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YQpAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suTmFtZUNhbGxiYWNrOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suUGFzc3dvcmRDYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5BdXRob3JpemVDYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlJlYWxtQ2FsbGJhY2s7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbENsaWVudDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xDbGllbnRGYWN0b3J5OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xTZXJ2ZXI7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsU2VydmVyRmFjdG9yeTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuU2VydmVyVGVzdEJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTaW1wbGVTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXIuQXJnczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgVGVzdFRTYXNsVHJhbnNwb3J0cyBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGVzdFRTYXNsVHJhbnNwb3J0cy5jbGFzcyk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1QgPSAibG9jYWxob3N0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0UgPSAidGhyaWZ0LXRlc3QiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTkNJUEFMID0gInRocmlmdC10ZXN0LXByaW5jaXBhbCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJzdXBlciBzZWNyZXQgcGFzc3dvcmQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTE0gPSAidGhyaWZ0LXRlc3QtcmVhbG0iOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTldSQVBQRURfTUVDSEFOSVNNID0gIkNSQU0tTUQ1IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBVTldSQVBQRURfUFJPUFMgPSBudWxsOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVEX01FQ0hBTklTTSA9ICJESUdFU1QtTUQ1IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBXUkFQUEVEX1BST1BTID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgc3RhdGljIHsKKyAgICBXUkFQUEVEX1BST1BTLnB1dChTYXNsLlFPUCwgImF1dGgtaW50Iik7CisgICAgV1JBUFBFRF9QUk9QUy5wdXQoImNvbS5zdW4uc2VjdXJpdHkuc2FzbC5kaWdlc3QucmVhbG0iLCBSRUFMTSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVzdE1lc3NhZ2UxID0gIkhlbGxvLCB3b3JsZCEgQWxzbywgZm91ciAiCisgICAgICArICJzY29yZSBhbmQgc2V2ZW4geWVhcnMgYWdvIG91ciBmYXRoZXJzIGJyb3VnaHQgZm9ydGggb24gdGhpcyAiCisgICAgICArICJjb250aW5lbnQgYSBuZXcgbmF0aW9uLCBjb25jZWl2ZWQgaW4gbGliZXJ0eSwgYW5kIGRlZGljYXRlZCB0byB0aGUgIgorICAgICAgKyAicHJvcG9zaXRpb24gdGhhdCBhbGwgbWVuIGFyZSBjcmVhdGVkIGVxdWFsLiI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlc3RNZXNzYWdlMiA9ICJJIGhhdmUgYSBkcmVhbSB0aGF0IG9uZSBkYXkgIgorICAgICAgKyAidGhpcyBuYXRpb24gd2lsbCByaXNlIHVwIGFuZCBsaXZlIG91dCB0aGUgdHJ1ZSBtZWFuaW5nIG9mIGl0cyBjcmVlZDogIgorICAgICAgKyAiJ1dlIGhvbGQgdGhlc2UgdHJ1dGhzIHRvIGJlIHNlbGYtZXZpZGVudCwgdGhhdCBhbGwgbWVuIGFyZSBjcmVhdGVkIGVxdWFsLiciOworCisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFNhc2xDYWxsYmFja0hhbmRsZXIgaW1wbGVtZW50cyBDYWxsYmFja0hhbmRsZXIgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhc3N3b3JkOworCisgICAgcHVibGljIFRlc3RTYXNsQ2FsbGJhY2tIYW5kbGVyKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZShDYWxsYmFja1tdIGNhbGxiYWNrcykgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoQ2FsbGJhY2sgYyA6IGNhbGxiYWNrcykgeworICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIE5hbWVDYWxsYmFjaykgeworICAgICAgICAgICgoTmFtZUNhbGxiYWNrKSBjKS5zZXROYW1lKFBSSU5DSVBBTCk7CisgICAgICAgIH0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIFBhc3N3b3JkQ2FsbGJhY2spIHsKKyAgICAgICAgICAoKFBhc3N3b3JkQ2FsbGJhY2spIGMpLnNldFBhc3N3b3JkKHBhc3N3b3JkLnRvQ2hhckFycmF5KCkpOworICAgICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBBdXRob3JpemVDYWxsYmFjaykgeworICAgICAgICAgICgoQXV0aG9yaXplQ2FsbGJhY2spIGMpLnNldEF1dGhvcml6ZWQodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIFJlYWxtQ2FsbGJhY2spIHsKKyAgICAgICAgICAoKFJlYWxtQ2FsbGJhY2spIGMpLnNldFRleHQoUkVBTE0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uKGMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBTZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgIGZpbmFsIFN0cmluZyBtZWNoYW5pc207CisgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wczsKKyAgICB2b2xhdGlsZSBUaHJvd2FibGUgdGhyb3duOworCisgICAgcHVibGljIFNlcnZlclRocmVhZChTdHJpbmcgbWVjaGFuaXNtLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzKSB7CisgICAgICB0aGlzLm1lY2hhbmlzbSA9IG1lY2hhbmlzbTsKKyAgICAgIHRoaXMucHJvcHMgPSBwcm9wczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICB0cnkgeworICAgICAgICBpbnRlcm5hbFJ1bigpOworICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgdGhyb3duID0gdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW50ZXJuYWxSdW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFRTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoCisgICAgICAgIG5ldyBUU2VydmVyU29ja2V0LlNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS4KKyAgICAgICAgICBwb3J0KFNlcnZlclRlc3RCYXNlLlBPUlQpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGFjY2VwdEFuZFdyaXRlKHNlcnZlclNvY2tldCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWNjZXB0QW5kV3JpdGUoVFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIFRUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgVFRyYW5zcG9ydCBzYXNsU2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KAorICAgICAgICBtZWNoYW5pc20sIFNFUlZJQ0UsIEhPU1QsCisgICAgICAgIHByb3BzLCBuZXcgVGVzdFNhc2xDYWxsYmFja0hhbmRsZXIoUEFTU1dPUkQpLCBzZXJ2ZXJUcmFuc3BvcnQpOworCisgICAgICBzYXNsU2VydmVyVHJhbnNwb3J0Lm9wZW4oKTsKKworICAgICAgYnl0ZVtdIGluQnVmID0gbmV3IGJ5dGVbdGVzdE1lc3NhZ2UxLmdldEJ5dGVzKCkubGVuZ3RoXTsKKyAgICAgIC8vIERlbGliZXJhdGVseSByZWFkIGxlc3MgdGhhbiB0aGUgZnVsbCBidWZmZXIgdG8gZW5zdXJlCisgICAgICAvLyB0aGF0IFRTYXNsVHJhbnNwb3J0IGlzIGNvcnJlY3RseSBidWZmZXJpbmcgcmVhZHMuIFRoaXMKKyAgICAgIC8vIHdpbGwgZmFpbCBmb3IgdGhlIFdSQVBQRUQgdGVzdCwgaWYgaXQgZG9lc24ndCB3b3JrLgorICAgICAgc2FzbFNlcnZlclRyYW5zcG9ydC5yZWFkQWxsKGluQnVmLCAwLCA1KTsKKyAgICAgIHNhc2xTZXJ2ZXJUcmFuc3BvcnQucmVhZEFsbChpbkJ1ZiwgNSwgMTApOworICAgICAgc2FzbFNlcnZlclRyYW5zcG9ydC5yZWFkQWxsKGluQnVmLCAxNSwgaW5CdWYubGVuZ3RoIC0gMTUpOworICAgICAgTE9HR0VSLmRlYnVnKCJzZXJ2ZXIgZ290OiB7fSIsIG5ldyBTdHJpbmcoaW5CdWYpKTsKKyAgICAgIGFzc2VydEVxdWFscyhuZXcgU3RyaW5nKGluQnVmKSwgdGVzdE1lc3NhZ2UxKTsKKworICAgICAgTE9HR0VSLmRlYnVnKCJzZXJ2ZXIgd3JpdGluZzoge30iLCB0ZXN0TWVzc2FnZTIpOworICAgICAgc2FzbFNlcnZlclRyYW5zcG9ydC53cml0ZSh0ZXN0TWVzc2FnZTIuZ2V0Qnl0ZXMoKSk7CisgICAgICBzYXNsU2VydmVyVHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHNhc2xTZXJ2ZXJUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgdGVzdFNhc2xPcGVuKGZpbmFsIFN0cmluZyBtZWNoYW5pc20sIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcHMpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkID0gbmV3IFNlcnZlclRocmVhZChtZWNoYW5pc20sIHByb3BzKTsKKyAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKworICAgIHRyeSB7CisgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgLy8gQWggd2VsbC4KKyAgICB9CisKKyAgICB0cnkgeworICAgICAgVFNvY2tldCBjbGllbnRTb2NrZXQgPSBuZXcgVFNvY2tldChIT1NULCBTZXJ2ZXJUZXN0QmFzZS5QT1JUKTsKKyAgICAgIFRUcmFuc3BvcnQgc2FzbENsaWVudFRyYW5zcG9ydCA9IG5ldyBUU2FzbENsaWVudFRyYW5zcG9ydChtZWNoYW5pc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTkNJUEFMLCBTRVJWSUNFLCBIT1NULCBwcm9wcywgbmV3IFRlc3RTYXNsQ2FsbGJhY2tIYW5kbGVyKFBBU1NXT1JEKSwgY2xpZW50U29ja2V0KTsKKyAgICAgIHNhc2xDbGllbnRUcmFuc3BvcnQub3BlbigpOworICAgICAgTE9HR0VSLmRlYnVnKCJjbGllbnQgd3JpdGluZzoge30iLCB0ZXN0TWVzc2FnZTEpOworICAgICAgc2FzbENsaWVudFRyYW5zcG9ydC53cml0ZSh0ZXN0TWVzc2FnZTEuZ2V0Qnl0ZXMoKSk7CisgICAgICBzYXNsQ2xpZW50VHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGJ5dGVbXSBpbkJ1ZiA9IG5ldyBieXRlW3Rlc3RNZXNzYWdlMi5nZXRCeXRlcygpLmxlbmd0aF07CisgICAgICBzYXNsQ2xpZW50VHJhbnNwb3J0LnJlYWRBbGwoaW5CdWYsIDAsIGluQnVmLmxlbmd0aCk7CisgICAgICBMT0dHRVIuZGVidWcoImNsaWVudCBnb3Q6IHt9IiwgbmV3IFN0cmluZyhpbkJ1ZikpOworICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmcoaW5CdWYpLCB0ZXN0TWVzc2FnZTIpOworCisgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIHNhc2xDbGllbnRUcmFuc3BvcnQub3BlbigpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGV4cGVjdGVkRXhjZXB0aW9uID0gZTsKKyAgICAgIH0KKyAgICAgIGFzc2VydE5vdE51bGwoZXhwZWN0ZWRFeGNlcHRpb24pOworCisgICAgICBzYXNsQ2xpZW50VHJhbnNwb3J0LmNsb3NlKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIExPR0dFUi53YXJuKCJFeGNlcHRpb24gY2F1Z2h0IiwgZSk7CisgICAgICB0aHJvdyBlOworICAgIH0gZmluYWxseSB7CisgICAgICBzZXJ2ZXJUaHJlYWQuaW50ZXJydXB0KCk7CisgICAgICB0cnkgeworICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBBaCB3ZWxsLgorICAgICAgfQorICAgICAgYXNzZXJ0TnVsbChzZXJ2ZXJUaHJlYWQudGhyb3duKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW53cmFwcGVkT3BlbigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRlc3RTYXNsT3BlbihVTldSQVBQRURfTUVDSEFOSVNNLCBVTldSQVBQRURfUFJPUFMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdyYXBwZWRPcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVzdFNhc2xPcGVuKFdSQVBQRURfTUVDSEFOSVNNLCBXUkFQUEVEX1BST1BTKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RBbm9ueW1vdXNPcGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgdGVzdFNhc2xPcGVuKCJBTk9OWU1PVVMiLCBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBUZXN0IHRoYXQgd2UgZ2V0IHRoZSBwcm9wZXIgZXhjZXB0aW9ucyB0aHJvd24gYmFjayB0aGUgc2VydmVyIHdoZW4KKyAgICogdGhlIGNsaWVudCBwcm92aWRlcyBpbnZhbGlkIHBhc3N3b3JkLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdEJhZFBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZCA9IG5ldyBTZXJ2ZXJUaHJlYWQoVU5XUkFQUEVEX01FQ0hBTklTTSwgVU5XUkFQUEVEX1BST1BTKTsKKyAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKworICAgIHRyeSB7CisgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgLy8gQWggd2VsbC4KKyAgICB9CisKKyAgICBib29sZWFuIGNsaWVudFNpZGVQYXNzZWQgPSB0cnVlOworCisgICAgdHJ5IHsKKyAgICAgIFRTb2NrZXQgY2xpZW50U29ja2V0ID0gbmV3IFRTb2NrZXQoSE9TVCwgU2VydmVyVGVzdEJhc2UuUE9SVCk7CisgICAgICBUVHJhbnNwb3J0IHNhc2xDbGllbnRUcmFuc3BvcnQgPSBuZXcgVFNhc2xDbGllbnRUcmFuc3BvcnQoCisgICAgICAgIFVOV1JBUFBFRF9NRUNIQU5JU00sIFBSSU5DSVBBTCwgU0VSVklDRSwgSE9TVCwgVU5XUkFQUEVEX1BST1BTLAorICAgICAgICBuZXcgVGVzdFNhc2xDYWxsYmFja0hhbmRsZXIoIk5PVCBUSEUgUEFTU1dPUkQiKSwgY2xpZW50U29ja2V0KTsKKyAgICAgIHNhc2xDbGllbnRUcmFuc3BvcnQub3BlbigpOworICAgICAgY2xpZW50U2lkZVBhc3NlZCA9IGZhbHNlOworICAgICAgZmFpbCgiV2FzIGFibGUgdG8gb3BlbiB0cmFuc3BvcnQgd2l0aCBiYWQgcGFzc3dvcmQiKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0ZSkgeworICAgICAgTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gZm9yIGJhZCBwYXNzd29yZCIsIHR0ZSk7CisgICAgICBhc3NlcnROb3ROdWxsKHR0ZS5nZXRNZXNzYWdlKCkpOworICAgICAgYXNzZXJ0VHJ1ZSh0dGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJJbnZhbGlkIHJlc3BvbnNlIikpOworCisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHNlcnZlclRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisKKyAgICAgIGlmIChjbGllbnRTaWRlUGFzc2VkKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmVyVGhyZWFkLnRocm93bik7CisgICAgICAgIGFzc2VydFRydWUoc2VydmVyVGhyZWFkLnRocm93bi5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkludmFsaWQgcmVzcG9uc2UiKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdpdGhTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgVGVzdFRTYXNsVHJhbnNwb3J0c1dpdGhTZXJ2ZXIoKS50ZXN0SXQoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RUU2FzbFRyYW5zcG9ydHNXaXRoU2VydmVyIGV4dGVuZHMgU2VydmVyVGVzdEJhc2UgeworCisgICAgcHJpdmF0ZSBUaHJlYWQgc2VydmVyVGhyZWFkOworICAgIHByaXZhdGUgVFNlcnZlciBzZXJ2ZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBuZXcgVFNhc2xDbGllbnRUcmFuc3BvcnQoCisgICAgICAgIFdSQVBQRURfTUVDSEFOSVNNLCBQUklOQ0lQQUwsIFNFUlZJQ0UsIEhPU1QsIFdSQVBQRURfUFJPUFMsCisgICAgICAgIG5ldyBUZXN0U2FzbENhbGxiYWNrSGFuZGxlcihQQVNTV09SRCksIHVuZGVybHlpbmdUcmFuc3BvcnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgZmluYWwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRyYW5zcG9ydAorICAgICAgICAgICAgVFNlcnZlclNvY2tldCBzb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldC5TZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzKCkucG9ydChQT1JUKSk7CisKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuRmFjdG9yeSgKKyAgICAgICAgICAgICAgV1JBUFBFRF9NRUNIQU5JU00sIFNFUlZJQ0UsIEhPU1QsIFdSQVBQRURfUFJPUFMsCisgICAgICAgICAgICAgIG5ldyBUZXN0U2FzbENhbGxiYWNrSGFuZGxlcihQQVNTV09SRCkpOworICAgICAgICAgICAgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIobmV3IEFyZ3Moc29ja2V0KS5wcm9jZXNzb3IocHJvY2Vzc29yKS50cmFuc3BvcnRGYWN0b3J5KGZhY3RvcnkpLnByb3RvY29sRmFjdG9yeShwcm90b0ZhY3RvcnkpKTsKKworICAgICAgICAgICAgLy8gUnVuIGl0CisgICAgICAgICAgICBMT0dHRVIuZGVidWcoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCB7fSIsIFBPUlQpOworICAgICAgICAgICAgc2VydmVyLnNlcnZlKCk7CisgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9OworICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgc2VydmVyLnN0b3AoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorICAgIH0KKworICB9CisKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gb2YgU0FTTCBBTk9OWU1PVVMsIHVzZWQgZm9yIHRlc3RpbmcgY2xpZW50LXNpZGUKKyAgICogaW5pdGlhbCByZXNwb25zZXMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbm9ueW1vdXNDbGllbnQgaW1wbGVtZW50cyBTYXNsQ2xpZW50IHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB1c2VybmFtZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzUHJvdmlkZWRJbml0aWFsUmVzcG9uc2U7CisKKyAgICBwdWJsaWMgQW5vbnltb3VzQ2xpZW50KFN0cmluZyB1c2VybmFtZSkgeworICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVjaGFuaXNtTmFtZSgpIHsgcmV0dXJuICJBTk9OWU1PVVMiOyB9CisgICAgcHVibGljIGJvb2xlYW4gaGFzSW5pdGlhbFJlc3BvbnNlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHB1YmxpYyBieXRlW10gZXZhbHVhdGVDaGFsbGVuZ2UoYnl0ZVtdIGNoYWxsZW5nZSkgdGhyb3dzIFNhc2xFeGNlcHRpb24geworICAgICAgaWYgKGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlKSB7CisgICAgICAgIHRocm93IG5ldyBTYXNsRXhjZXB0aW9uKCJBbHJlYWR5IGNvbXBsZXRlISIpOworICAgICAgfQorCisgICAgICBoYXNQcm92aWRlZEluaXRpYWxSZXNwb25zZSA9IHRydWU7CisgICAgICByZXR1cm4gdXNlcm5hbWUuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7IHJldHVybiBoYXNQcm92aWRlZEluaXRpYWxSZXNwb25zZTsgfQorICAgIHB1YmxpYyBieXRlW10gdW53cmFwKGJ5dGVbXSBpbmNvbWluZywgaW50IG9mZnNldCwgaW50IGxlbikgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHB1YmxpYyBieXRlW10gd3JhcChieXRlW10gb3V0Z29pbmcsIGludCBvZmZzZXQsIGludCBsZW4pIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKyAgICBwdWJsaWMgT2JqZWN0IGdldE5lZ290aWF0ZWRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFub255bW91c1NlcnZlciBpbXBsZW1lbnRzIFNhc2xTZXJ2ZXIgeworICAgIHByaXZhdGUgU3RyaW5nIHVzZXI7CisgICAgcHVibGljIFN0cmluZyBnZXRNZWNoYW5pc21OYW1lKCkgeyByZXR1cm4gIkFOT05ZTU9VUyI7IH0KKyAgICBwdWJsaWMgYnl0ZVtdIGV2YWx1YXRlUmVzcG9uc2UoYnl0ZVtdIHJlc3BvbnNlKSB0aHJvd3MgU2FzbEV4Y2VwdGlvbiB7CisgICAgICB0aGlzLnVzZXIgPSBuZXcgU3RyaW5nKHJlc3BvbnNlLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeyByZXR1cm4gdXNlciAhPSBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRBdXRob3JpemF0aW9uSUQoKSB7IHJldHVybiB1c2VyOyB9CisgICAgcHVibGljIGJ5dGVbXSB1bndyYXAoYnl0ZVtdIGluY29taW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisgICAgcHVibGljIGJ5dGVbXSB3cmFwKGJ5dGVbXSBvdXRnb2luZywgaW50IG9mZnNldCwgaW50IGxlbikgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHB1YmxpYyBPYmplY3QgZ2V0TmVnb3RpYXRlZFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFNhc2xBbm9ueW1vdXNGYWN0b3J5CisgICAgaW1wbGVtZW50cyBTYXNsQ2xpZW50RmFjdG9yeSwgU2FzbFNlcnZlckZhY3RvcnkgeworCisgICAgcHVibGljIFNhc2xDbGllbnQgY3JlYXRlU2FzbENsaWVudCgKKyAgICAgIFN0cmluZ1tdIG1lY2hhbmlzbXMsIFN0cmluZyBhdXRob3JpemF0aW9uSWQsIFN0cmluZyBwcm90b2NvbCwKKyAgICAgIFN0cmluZyBzZXJ2ZXJOYW1lLCBNYXA8U3RyaW5nLD8+IHByb3BzLCBDYWxsYmFja0hhbmRsZXIgY2JoKQorICAgIHsKKyAgICAgIGZvciAoU3RyaW5nIG1lY2ggOiBtZWNoYW5pc21zKSB7CisgICAgICAgIGlmICgiQU5PTllNT1VTIi5lcXVhbHMobWVjaCkpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEFub255bW91c0NsaWVudChhdXRob3JpemF0aW9uSWQpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2FzbFNlcnZlciBjcmVhdGVTYXNsU2VydmVyKAorICAgICAgU3RyaW5nIG1lY2hhbmlzbSwgU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgc2VydmVyTmFtZSwgTWFwPFN0cmluZyw/PiBwcm9wcywgQ2FsbGJhY2tIYW5kbGVyIGNiaCkKKyAgICB7CisgICAgICBpZiAoIkFOT05ZTU9VUyIuZXF1YWxzKG1lY2hhbmlzbSkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTZXJ2ZXIoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TWVjaGFuaXNtTmFtZXMoTWFwPFN0cmluZywgPz4gcHJvcHMpIHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiQU5PTllNT1VTIiB9OworICAgIH0KKyAgfQorCisgIHN0YXRpYyB7CisgICAgamF2YS5zZWN1cml0eS5TZWN1cml0eS5hZGRQcm92aWRlcihuZXcgU2FzbEFub255bW91c1Byb3ZpZGVyKCkpOworICB9CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2FzbEFub255bW91c1Byb3ZpZGVyIGV4dGVuZHMgamF2YS5zZWN1cml0eS5Qcm92aWRlciB7CisgICAgcHVibGljIFNhc2xBbm9ueW1vdXNQcm92aWRlcigpIHsKKyAgICAgIHN1cGVyKCJUaHJpZnRTYXNsQW5vbnltb3VzIiwgMS4wLCAiVGhyaWZ0IEFub255bW91cyBTQVNMIHByb3ZpZGVyIik7CisgICAgICBwdXQoIlNhc2xDbGllbnRGYWN0b3J5LkFOT05ZTU9VUyIsIFNhc2xBbm9ueW1vdXNGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICBwdXQoIlNhc2xTZXJ2ZXJGYWN0b3J5LkFOT05ZTU9VUyIsIFNhc2xBbm9ueW1vdXNGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja1RUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICAgIGJ5dGVbXSBiYWRIZWFkZXIgPSBudWxsOworICAgIHByaXZhdGUgVE1lbW9yeUlucHV0VHJhbnNwb3J0IHJlYWRCdWZmZXIgPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KCk7CisKKyAgICBwdWJsaWMgTW9ja1RUcmFuc3BvcnQoaW50IG1vZGUpIHsKKyAgICAgIGlmIChtb2RlPT0xKSB7CisgICAgICAgIC8vIEludmFsaWQgc3RhdHVzIGJ5dGUKKyAgICAgICAgYmFkSGVhZGVyID0gbmV3IGJ5dGVbXSB7IChieXRlKTB4RkYsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDUgfTsKKyAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAyKSB7CisgICAgICAgIC8vIFZhbGlkIHN0YXR1cyBieXRlLCBuZWdhdGl2ZSBwYXlsb2FkIGxlbmd0aAorICAgICAgICBiYWRIZWFkZXIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpMHgwMSwgKGJ5dGUpMHhGRiwgKGJ5dGUpMHhGRiwgKGJ5dGUpMHhGRiwgKGJ5dGUpMHhGRiB9OworICAgICAgfSBlbHNlIGlmIChtb2RlID09IDMpIHsKKyAgICAgICAgLy8gVmFsaWQgc3RhdHVzIGJ5dGUsIGV4Y2Vzc2l2ZWx5IGxhcmdlLCBib2d1cyBwYXlsb2FkIGxlbmd0aAorICAgICAgICBiYWRIZWFkZXIgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpMHgwMSwgKGJ5dGUpMHg2NCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCB9OworICAgICAgfQorICAgICAgcmVhZEJ1ZmZlci5yZXNldChiYWRIZWFkZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7fQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiByZWFkQnVmZmVyLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCYWRIZWFkZXIoKSB7CisgICAgVFNhc2xUcmFuc3BvcnQgc2FzbFRyYW5zcG9ydCA9IG5ldyBUU2FzbFNlcnZlclRyYW5zcG9ydChuZXcgTW9ja1RUcmFuc3BvcnQoMSkpOworICAgIHRyeSB7CisgICAgICBzYXNsVHJhbnNwb3J0LnJlY2VpdmVTYXNsTWVzc2FnZSgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIGFuIGVycm9yIGR1ZSB0byBpbmNvcnJlY3Qgc3RhdHVzIGJ5dGUgdmFsdWUuIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRNZXNzYWdlKCksICJJbnZhbGlkIHN0YXR1cyAtMSIpOworICAgIH0KKyAgICBzYXNsVHJhbnNwb3J0ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KG5ldyBNb2NrVFRyYW5zcG9ydCgyKSk7CisgICAgdHJ5IHsKKyAgICAgIHNhc2xUcmFuc3BvcnQucmVjZWl2ZVNhc2xNZXNzYWdlKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gZXJyb3IgZHVlIHRvIG5lZ2F0aXZlIHBheWxvYWQgbGVuZ3RoLiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0TWVzc2FnZSgpLCAiSW52YWxpZCBwYXlsb2FkIGhlYWRlciBsZW5ndGg6IC0xIik7CisgICAgfQorICAgIHNhc2xUcmFuc3BvcnQgPSBuZXcgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQobmV3IE1vY2tUVHJhbnNwb3J0KDMpKTsKKyAgICB0cnkgeworICAgICAgc2FzbFRyYW5zcG9ydC5yZWNlaXZlU2FzbE1lc3NhZ2UoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBlcnJvciBkdWUgdG8gYm9ndXMgKGxhcmdlKSBwYXlsb2FkIGxlbmd0aC4iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKSwgIkludmFsaWQgcGF5bG9hZCBoZWFkZXIgbGVuZ3RoOiAxNjc3NzIxNjAwIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODgwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0RnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvL1Rlc3Qgd3JpdGUgc2lkZQorICAgIFBhdGggdGVtcEZpbGVQYXRoTmFtZSA9IEZpbGVzLmNyZWF0ZVRlbXBGaWxlKCJUU2ltcGxlRmlsZVRyYW5zcG9ydFRlc3QiLCBudWxsKTsKKyAgICBGaWxlcy5kZWxldGUodGVtcEZpbGVQYXRoTmFtZSk7CisgICAgYnl0ZVtdIGlucHV0X2J1ZiA9IG5ldyBieXRlW117MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9OworICAgIFRTaW1wbGVGaWxlVHJhbnNwb3J0IHRyYW5zX3dyaXRlID0gbmV3IFRTaW1wbGVGaWxlVHJhbnNwb3J0KHRlbXBGaWxlUGF0aE5hbWUudG9TdHJpbmcoKSxmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgIGFzc2VydCAoIXRyYW5zX3dyaXRlLmlzT3BlbigpKTsKKyAgICB0cmFuc193cml0ZS5vcGVuKCk7CisgICAgYXNzZXJ0KHRyYW5zX3dyaXRlLmlzT3BlbigpKTsKKyAgICB0cmFuc193cml0ZS53cml0ZShpbnB1dF9idWYpOworICAgIHRyYW5zX3dyaXRlLndyaXRlKGlucHV0X2J1ZiwyLDIpOworICAgIHRyYW5zX3dyaXRlLmZsdXNoKCk7CisgICAgdHJhbnNfd3JpdGUuY2xvc2UoKTsKKworICAgIC8vVGVzdCByZWFkIHNpZGUKKyAgICBUU2ltcGxlRmlsZVRyYW5zcG9ydCB0cmFucyA9IG5ldyBUU2ltcGxlRmlsZVRyYW5zcG9ydCh0ZW1wRmlsZVBhdGhOYW1lLnRvU3RyaW5nKCksdHJ1ZSwgZmFsc2UpOworICAgIGFzc2VydCh0cmFucy5pc09wZW4oKSk7CisKKyAgICAvL1NpbXBsZSBmaWxlIHRyYW5zIHByb3ZpZGVzIG5vIGJ1ZmZlciBhY2Nlc3MKKyAgICBhc3NlcnQoMCA9PSB0cmFucy5nZXRCdWZmZXJQb3NpdGlvbigpKTsKKyAgICBhc3NlcnQobnVsbCA9PSB0cmFucy5nZXRCdWZmZXIoKSk7CisgICAgYXNzZXJ0KC0xID09IHRyYW5zLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSk7CisKKyAgICAvL1Rlc3QgZmlsZSBwb2ludGVyIG9wZXJhdGlvbnMKKyAgICBhc3NlcnQoMCA9PSB0cmFucy5nZXRGaWxlUG9pbnRlcigpKTsKKyAgICBhc3NlcnQoMTIgPT0gdHJhbnMubGVuZ3RoKCkpOworCisgICAgZmluYWwgaW50IEJVRlNJWiA9IDQ7CisgICAgYnl0ZVtdIGJ1ZjEgPSBuZXcgYnl0ZVtCVUZTSVpdOworICAgIHRyYW5zLnJlYWRBbGwoYnVmMSwgMCwgQlVGU0laKTsKKyAgICBhc3NlcnQoQlVGU0laID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOworICAgIGFzc2VydChBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MSwgMiwgMywgNH0sIGJ1ZjEpKTsKKworICAgIGludCBieXRlc1JlYWQgPSB0cmFucy5yZWFkKGJ1ZjEsIDAsIEJVRlNJWik7CisgICAgYXNzZXJ0KGJ5dGVzUmVhZCA+IDApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNSZWFkOyArK2kpIHsKKyAgICAgIGFzc2VydChidWYxW2ldID09IGkrNSk7CisgICAgfQorCisgICAgdHJhbnMuc2VlaygwKTsKKyAgICBhc3NlcnQoMCA9PSB0cmFucy5nZXRGaWxlUG9pbnRlcigpKTsKKyAgICB0cmFucy5yZWFkQWxsKGJ1ZjEsIDAsIEJVRlNJWik7CisgICAgYXNzZXJ0KEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSwgYnVmMSkpOworICAgIGFzc2VydChCVUZTSVogPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgdHJhbnMuY2xvc2UoKTsKKyAgICBGaWxlcy5kZWxldGUodGVtcEZpbGVQYXRoTmFtZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUWmxpYlRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3ZjljMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUWmxpYlRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC56aXAuRGF0YUZvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RUWmxpYlRyYW5zcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nKSB7CisgICAgcmV0dXJuIG5ldyBUWmxpYlRyYW5zcG9ydCh1bmRlcmx5aW5nKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGJ5dGVTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbZW5kLXN0YXJ0KzFdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IChlbmQtc3RhcnQpOyBpKyspIHsKKyAgICAgIHJlc3VsdFtpXSA9IChieXRlKShzdGFydCtpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBXcml0ZUNvdW50aW5nVHJhbnNwb3J0IGNvdW50aW5nVHJhbnMgPSBuZXcgV3JpdGVDb3VudGluZ1RyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbQorICAgICAgICAoYmFvcykpKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50aW5nVHJhbnMpOworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyNDUpKTsKKyAgICBjb3VudGluZ1RyYW5zLmNsb3NlKCk7CisgICAgdHJhbnMuY2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZU9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KGJhb3MpKTsKKyAgICBieXRlW10gdW5jb21wcmVzc2VkID0gYnl0ZVNlcXVlbmNlKDAsIDI0NSk7CisgICAgdHJhbnMud3JpdGUodW5jb21wcmVzc2VkKTsKKyAgICB0cmFucy5jbG9zZSgpOworICAgIGZpbmFsIGJ5dGVbXSBjb21wcmVzc2VkID0gYmFvcy50b0J5dGVBcnJheSgpOworCisgICAgZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzI1NV07CisgICAgVFRyYW5zcG9ydCB0cmFuc1JlYWQgPSBnZXRUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29tcHJlc3NlZCkpKTsKKyAgICBpbnQgcmVhZEJ5dGVzID0gdHJhbnNSZWFkLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHModW5jb21wcmVzc2VkLmxlbmd0aCwgcmVhZEJ5dGVzKTsKKyAgICB0cmFuc1JlYWQuY2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBEZWZsYXRlck91dHB1dFN0cmVhbSBkZWZsYXRlck91dHB1dFN0cmVhbSA9IG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbShiYW9zKTsKKyAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGRlZmxhdGVyT3V0cHV0U3RyZWFtKTsKKyAgICBkb3Mud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDQ5KSk7CisgICAgZG9zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyMTkpKTsKKworICAgIGRlZmxhdGVyT3V0cHV0U3RyZWFtLmZpbmlzaCgpOworCisgICAgVE1lbW9yeUJ1ZmZlciBtZW1idWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBtZW1idWYud3JpdGUoYmFvcy50b0J5dGVBcnJheSgpKTsKKworICAgIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBjb3VudFRyYW5zID0gbmV3IFJlYWRDb3VudGluZ1RyYW5zcG9ydChtZW1idWYpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRUcmFucyk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzEwXTsKKyAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDEwKTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVhZEJ1ZiwgYnl0ZVNlcXVlbmNlKDAsOSkpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRUcmFucy5yZWFkQ291bnQpOworCisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAxMCk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgxMCwxOSkpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRUcmFucy5yZWFkQ291bnQpOworCisgICAgYXNzZXJ0RXF1YWxzKDMwLCB0cmFucy5yZWFkKG5ldyBieXRlWzMwXSwgMCwgMzApKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRUcmFucy5yZWFkQ291bnQpOworCisgICAgcmVhZEJ1ZiA9IG5ldyBieXRlWzIyMF07CisgICAgYXNzZXJ0RXF1YWxzKDIyMCwgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAyMjApKTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVhZEJ1ZiwgYnl0ZVNlcXVlbmNlKDAsIDIxOSkpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRUcmFucy5yZWFkQ291bnQpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdyaXRlKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBXcml0ZUNvdW50aW5nVHJhbnNwb3J0IGNvdW50aW5nVHJhbnMgPSBuZXcgV3JpdGVDb3VudGluZ1RyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShiYW9zKSkpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRpbmdUcmFucyk7CisKKyAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMTAwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDEwMSwgMjAwKSk7CisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDIwMSwgMjU1KSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisKKyAgICB0cmFucy5mbHVzaCgpOworICAgIGFzc2VydEVxdWFscygyLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworCisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDI0NSkpOworICAgIHRyYW5zLmZsdXNoKCk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisKKyAgICBEYXRhSW5wdXRTdHJlYW0gZGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkpOworICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyNTZdOworICAgIGludCBuID0gZGluLnJlYWQoYnVmLCAwLCAyNTYpOworICAgIGFzc2VydEVxdWFscyhuLCAyNTYpOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhieXRlU2VxdWVuY2UoMCwgMjU1KSwgYnVmKSk7CisKKyAgICBidWYgPSBuZXcgYnl0ZVsyNDZdOworICAgIG4gPSBkaW4ucmVhZChidWYsIDAsIDI0Nik7CisgICAgYXNzZXJ0RXF1YWxzKG4sIDI0Nik7CisgICAgZm9yIChpbnQgaSA9IDA7IGk8YnVmLmxlbmd0aDsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoImZvciAiK2ksIGJ5dGVTZXF1ZW5jZSgwLDI0NSlbaV0sIGJ1ZltpXSk7CisgICAgfQorCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ5dGVTZXF1ZW5jZSgwLDI0NSksIGJ1ZikpOworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1dyaXRlQ291bnRpbmdUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1dyaXRlQ291bnRpbmdUcmFuc3BvcnQuamF2YQppbmRleCAzOWE3ODM2Li4zNThmNWM2IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9Xcml0ZUNvdW50aW5nVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvV3JpdGVDb3VudGluZ1RyYW5zcG9ydC5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBXcml0ZUNvdW50aW5nVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CiAgIHB1YmxpYyBpbnQgd3JpdGVDb3VudCA9IDA7CkBAIC00OCw0ICs0Niw5IEBACiAgICAgd3JpdGVDb3VudCArKzsKICAgICB0cmFucy53cml0ZShidWYsIG9mZiwgbGVuKTsKICAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cmFucy5mbHVzaCgpOworICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2phdmFtZS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODYxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGU7CisKKy8qKgorICogQXBwbGljYXRpb24gbGV2ZWwgZXhjZXB0aW9uCisgKgorICovCitwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDA7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV05fTUVUSE9EID0gMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19NRVRIT0RfTkFNRSA9IDM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBRF9TRVFVRU5DRV9JRCA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfUkVTVUxUID0gNTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJOQUxfRVJST1IgPSA2OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9FUlJPUiA9IDc7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfVFJBTlNGT1JNID0gODsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QUk9UT0NPTCA9IDk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTA7CisKKyAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CisKKyAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihpbnQgdHlwZSkgeworICAgIHN1cGVyKCk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgcmV0dXJuIHR5cGVfOworICB9CisKKyAgcHVibGljIHN0YXRpYyBUQXBwbGljYXRpb25FeGNlcHRpb24gcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBURmllbGQgZmllbGQ7CisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgaW50IHR5cGUgPSBVTktOT1dOOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworCisgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUU3RydWN0IHN0cnVjdCA9IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3QpOworICAgIGlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCkgeworICAgICAgZmllbGQubmFtZSA9ICJtZXNzYWdlIjsKKyAgICAgIGZpZWxkLnR5cGUgPSBUVHlwZS5TVFJJTkc7CisgICAgICBmaWVsZC5pZCA9IDE7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oZmllbGQpOworICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoZ2V0TWVzc2FnZSgpKTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisgICAgZmllbGQubmFtZSA9ICJ0eXBlIjsKKyAgICBmaWVsZC50eXBlID0gVFR5cGUuSTMyOworICAgIGZpZWxkLmlkID0gMjsKKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oZmllbGQpOworICAgIG9wcm90LndyaXRlSTMyKHR5cGVfKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWEwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworLyoqCisgKiBHZW5lcmljIGJhc2UgaW50ZXJmYWNlIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IG9iamVjdHMuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRCYXNlICB7CisKKyAgLyoqCisgICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgorICAgKgorICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKKyAgICoKKyAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb3RoZXIpOworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjMxZDMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBUQmFzZUhlbHBlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKKyAgICAgICAgIHJldHVybiAoYSA9PSBiKSA/IDAgOiAoYSA/IDEgOiAtMSk7CisgICAgCisKKyAgICB9CisgICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhCb29sZWFuIGEsIEJvb2xlYW4gYikgeworICAgICAgICAgcmV0dXJuIChhLmJvb2xlYW5WYWx1ZSgpID09IGIuYm9vbGVhblZhbHVlKCkpID8gMCA6IChhLmJvb2xlYW5WYWx1ZSgpID8gMSA6IC0xKTsKKworCisgICAgfQorICAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oQm9vbGVhbiBhLCBib29sZWFuIGIpIHsKKyAgICAgICAgIHJldHVybiAoYS5ib29sZWFuVmFsdWUoKSA9PSBiKSA/IDAgOiAoYS5ib29sZWFuVmFsdWUoKSA/IDEgOiAtMSk7CisKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiBib29sZWFuVmFsdWVPZihib29sZWFuIGIpIHsKKyAgICAgICAgcmV0dXJuIChiID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGUgYSwgYnl0ZSBiKSB7CisgICAgICAgIGlmIChhIDwgYikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGIgPCBhKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKHNob3J0IGEsIHNob3J0IGIpIHsKKyAgICAgICAgaWYgKGEgPCBiKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oaW50IGEsIGludCBiKSB7CisgICAgICAgIGlmIChhIDwgYikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGIgPCBhKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGxvbmcgYSwgbG9uZyBiKSB7CisgICAgICAgIGlmIChhIDwgYikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGIgPCBhKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGRvdWJsZSBhLCBkb3VibGUgYikgeworICAgICAgICBpZiAoYSA8IGIpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChiIDwgYSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKKyAgICAgICAgcmV0dXJuIGEuY29tcGFyZVRvKGIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhieXRlW10gYSwgYnl0ZVtdIGIpIHsKKyAgICAgICAgaW50IHNpemVDb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgICAgIGlmIChzaXplQ29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZUNvbXBhcmU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYnl0ZUNvbXBhcmUgPSBjb21wYXJlVG8oYSwgYik7CisgICAgICAgICAgICBpZiAoYnl0ZUNvbXBhcmUgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBieXRlQ29tcGFyZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oT2JqZWN0IGEsIE9iamVjdCBiKSB7CisgICAgICAgIGlmIChhIGluc3RhbmNlb2YgVmVjdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZVRvKChWZWN0b3IpYSwgKFZlY3RvciliKTsKKyAgICAgICAgfSBpZiAoYSBpbnN0YW5jZW9mIEhhc2h0YWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVUbygoSGFzaHRhYmxlKWEsIChIYXNodGFibGUpYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKChUQmFzZSlhKS5jb21wYXJlVG8oYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oVmVjdG9yIGEsIFZlY3RvciBiKSB7CisgICAgICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IG9BID0gYS5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBPYmplY3Qgb0IgPSBiLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKG9BLCBvQik7CisgICAgICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhIYXNodGFibGUgYSwgSGFzaHRhYmxlIGIpIHsKKyAgICAgICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gZW51bUEgPSBhLmtleXMoKTsKKyAgICAgICAgRW51bWVyYXRpb24gZW51bUIgPSBiLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKGxhc3RDb21wYXJpc29uID09IDAgJiYgZW51bUEuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBrZXlBID0gZW51bUEubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIE9iamVjdCBrZXlCID0gZW51bUIubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGtleUEsIGtleUIpOworICAgICAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbyhhLmdldChrZXlBKSwgYi5nZXQoa2V5QikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oVEVudW0gYSwgVEVudW0gYikgeworICAgICAgICByZXR1cm4gY29tcGFyZVRvKGEuZ2V0VmFsdWUoKSwgYi5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKgorICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhMaXN0IGEsIExpc3QgYikgeworICAgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBvQSA9IGEuZ2V0KGkpOworICAgICAgICAgICAgT2JqZWN0IG9CID0gYi5nZXQoaSk7CisgICAgICAgICAgICBpZiAob0EgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8oKExpc3QpIG9BLCAoTGlzdCkgb0IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbygoQ29tcGFyYWJsZSkgb0EsIChDb21wYXJhYmxlKSBvQik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgICovCisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHRvU3RyaW5nKGJ5dGVbXSBieXRlcywgU3RyaW5nQnVmZmVyIHNiKSB7CisgICAgdG9TdHJpbmcoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCwgc2IpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHRvU3RyaW5nKGJ5dGVbXSBidWYsIGludCBhcnJheU9mZnNldCwgaW50IG9yaWdMaW1pdCwgU3RyaW5nQnVmZmVyIHNiKSB7CisgICAgaW50IGxpbWl0ID0gKG9yaWdMaW1pdCAtIGFycmF5T2Zmc2V0ID4gMTI4KSA/IGFycmF5T2Zmc2V0ICsgMTI4IDogb3JpZ0xpbWl0OworCisgICAgZm9yIChpbnQgaSA9IGFycmF5T2Zmc2V0OyBpIDwgbGltaXQ7IGkrKykgeworICAgICAgaWYgKGkgPiBhcnJheU9mZnNldCkgeworICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgIH0KKyAgICAgIHNiLmFwcGVuZChwYWRkZWRCeXRlU3RyaW5nKGJ1ZltpXSkpOworICAgIH0KKyAgICBpZiAob3JpZ0xpbWl0ICE9IGxpbWl0KSB7CisgICAgICBzYi5hcHBlbmQoIi4uLiIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZGRlZEJ5dGVTdHJpbmcoYnl0ZSBiKSB7CisgICAgaW50IGV4dGVuZGVkID0gKGIgfCAweDEwMCkgJiAweDFmZjsKKyAgICByZXR1cm4gSW50ZWdlci50b0hleFN0cmluZyhleHRlbmRlZCkudG9VcHBlckNhc2UoKS5zdWJzdHJpbmcoMSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2MyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CisKKy8qKgorICogQ2xhc3MgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGJ1ZiB3aXRob3V0IGRvaW5nIGRlZXAKKyAqIGNvcGllcyBvbiBpdC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4dGVuZHMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHsKKyAgcHVibGljIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oaW50IHNpemUpIHsKKyAgICBzdXBlcihzaXplKTsKKyAgfQorCisgIHB1YmxpYyBieXRlW10gZ2V0KCkgeworICAgIHJldHVybiBidWY7CisgIH0KKworICBwdWJsaWMgaW50IGxlbigpIHsKKyAgICByZXR1cm4gY291bnQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNlYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydDsKKworLyoqCisgKiBHZW5lcmljIHV0aWxpdHkgZm9yIGVhc2lseSBkZXNlcmlhbGl6aW5nIG9iamVjdHMgZnJvbSBhIGJ5dGUgYXJyYXkgb3IgSmF2YQorICogU3RyaW5nLgorICoKKyAqLworcHVibGljIGNsYXNzIFREZXNlcmlhbGl6ZXIgeworICBwcml2YXRlIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5XzsKKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IFREZXNlcmlhbGl6ZXIgdGhhdCB1c2VzIHRoZSBUQmluYXJ5UHJvdG9jb2wgYnkgZGVmYXVsdC4KKyAgICovCisgIHB1YmxpYyBURGVzZXJpYWxpemVyKCkgeworICAgIHRoaXMobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBURGVzZXJpYWxpemVyLiBJdCB3aWxsIHVzZSB0aGUgVFByb3RvY29sIHNwZWNpZmllZCBieSB0aGUKKyAgICogZmFjdG9yeSB0aGF0IGlzIHBhc3NlZCBpbi4KKyAgICoKKyAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBGYWN0b3J5IHRvIGNyZWF0ZSBhIHByb3RvY29sCisgICAqLworICBwdWJsaWMgVERlc2VyaWFsaXplcihUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkgeworICAgIHByb3RvY29sRmFjdG9yeV8gPSBwcm90b2NvbEZhY3Rvcnk7CisgIH0KKworICAvKioKKyAgICogRGVzZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZnJvbSBhIGJ5dGUgYXJyYXkuCisgICAqCisgICAqIEBwYXJhbSBiYXNlIFRoZSBvYmplY3QgdG8gcmVhZCBpbnRvCisgICAqIEBwYXJhbSBieXRlcyBUaGUgYXJyYXkgdG8gcmVhZCBmcm9tCisgICAqLworICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShUQmFzZSBiYXNlLCBieXRlW10gYnl0ZXMpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBiYXNlLnJlYWQoCisgICAgICAgIHByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woCisgICAgICAgICAgbmV3IFRJT1N0cmVhbVRyYW5zcG9ydCgKKyAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcykpKSk7CisgIH0KKworICAvKioKKyAgICogRGVzZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZnJvbSBhIEphdmEgc3RyaW5nLCB1c2luZyBhIHNwZWNpZmllZAorICAgKiBjaGFyYWN0ZXIgc2V0IGZvciBkZWNvZGluZy4KKyAgICoKKyAgICogQHBhcmFtIGJhc2UgVGhlIG9iamVjdCB0byByZWFkIGludG8KKyAgICogQHBhcmFtIGRhdGEgVGhlIHN0cmluZyB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIGNoYXJzZXQgVmFsaWQgSlZNIGNoYXJzZXQKKyAgICovCisgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFRCYXNlIGJhc2UsIFN0cmluZyBkYXRhLCBTdHJpbmcgY2hhcnNldCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBkZXNlcmlhbGl6ZShiYXNlLCBkYXRhLmdldEJ5dGVzKGNoYXJzZXQpKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIEVOQ09ESU5HOiAiICsgY2hhcnNldCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIERlZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgZnJvbSBhIEphdmEgc3RyaW5nLCB1c2luZyB0aGUgZGVmYXVsdCBKVk0KKyAgICogY2hhcnNldCBlbmNvZGluZy4KKyAgICoKKyAgICogQHBhcmFtIGJhc2UgVGhlIG9iamVjdCB0byByZWFkIGludG8KKyAgICogQHBhcmFtIGRhdGEgVGhlIHN0cmluZyB0byByZWFkIGZyb20KKyAgICogQHJldHVybiBTZXJpYWxpemVkIG9iamVjdCBhcyBhIFN0cmluZworICAgKi8KKyAgcHVibGljIHZvaWQgdG9TdHJpbmcoVEJhc2UgYmFzZSwgU3RyaW5nIGRhdGEpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBkZXNlcmlhbGl6ZShiYXNlLCBkYXRhLmdldEJ5dGVzKCkpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNWZkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworcHVibGljIGludGVyZmFjZSBURW51bSB7CisgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjM3NWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLyoqCisgKiBHZW5lcmljIGV4Y2VwdGlvbiBjbGFzcyBmb3IgVGhyaWZ0LgorICoKKyAqLworcHVibGljIGNsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHB1YmxpYyBURXhjZXB0aW9uKCkgeworICAgIHN1cGVyKCk7CisgIH0KKworICBwdWJsaWMgVEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIFRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisJc3VwZXIoY2F1c2UuZ2V0TWVzc2FnZSgpKTsKKyAgfQorCisgIHB1YmxpYyBURXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkgIHN1cGVyKG1lc3NhZ2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URmllbGRSZXF1aXJlbWVudFR5cGUuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNGEzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URmllbGRSZXF1aXJlbWVudFR5cGUuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKy8qKgorICogUmVxdWlyZW1lbnQgdHlwZSBjb25zdGFudHMuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVEZpZWxkUmVxdWlyZW1lbnRUeXBlIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFJFUVVJUkVEICA9IDE7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBPUFRJT05BTCA9IDI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBERUZBVUxUID0gMzsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzk1MjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworLyoqCisgKiBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorICogd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVFByb2Nlc3NvciB7CisgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KQorICAgIHRocm93cyBURXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3NvckZhY3RvcnkuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkOGEzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorICogVGhlIGRlZmF1bHQgcHJvY2Vzc29yIGZhY3RvcnkganVzdCByZXR1cm5zIGEgc2luZ2xldG9uCisgKiBpbnN0YW5jZS4KKyAqLworcHVibGljIGNsYXNzIFRQcm9jZXNzb3JGYWN0b3J5IHsKKworICBwcml2YXRlIGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yXzsKKworICBwdWJsaWMgVFByb2Nlc3NvckZhY3RvcnkoVFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKKyAgICBwcm9jZXNzb3JfID0gcHJvY2Vzc29yOworICB9CisKKyAgcHVibGljIFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICByZXR1cm4gcHJvY2Vzc29yXzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcmlhbGl6ZXIuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxY2U2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0OworCisvKioKKyAqIEdlbmVyaWMgdXRpbGl0eSBmb3IgZWFzaWx5IHNlcmlhbGl6aW5nIG9iamVjdHMgaW50byBhIGJ5dGUgYXJyYXkgb3IgSmF2YQorICogU3RyaW5nLgorICoKKyAqLworcHVibGljIGNsYXNzIFRTZXJpYWxpemVyIHsKKworICAvKioKKyAgICogVGhpcyBpcyB0aGUgYnl0ZSBhcnJheSB0aGF0IGRhdGEgaXMgYWN0dWFsbHkgc2VyaWFsaXplZCBpbnRvCisgICAqLworICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zXyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAvKioKKyAgICogVGhpcyB0cmFuc3BvcnQgd3JhcHMgdGhhdCBieXRlIGFycmF5CisgICAqLworICBwcml2YXRlIGZpbmFsIFRJT1N0cmVhbVRyYW5zcG9ydCB0cmFuc3BvcnRfID0gbmV3IFRJT1N0cmVhbVRyYW5zcG9ydChiYW9zXyk7CisKKyAgLyoqCisgICAqIEludGVybmFsIHByb3RvY29sIHVzZWQgZm9yIHNlcmlhbGl6aW5nIG9iamVjdHMuCisgICAqLworICBwcml2YXRlIFRQcm90b2NvbCBwcm90b2NvbF87CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBUU2VyaWFsaXplciB0aGF0IHVzZXMgdGhlIFRCaW5hcnlQcm90b2NvbCBieSBkZWZhdWx0LgorICAgKi8KKyAgcHVibGljIFRTZXJpYWxpemVyKCkgeworICAgIHRoaXMobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBUU2VyaWFsaXplci4gSXQgd2lsbCB1c2UgdGhlIFRQcm90b2NvbCBzcGVjaWZpZWQgYnkgdGhlCisgICAqIGZhY3RvcnkgdGhhdCBpcyBwYXNzZWQgaW4uCisgICAqCisgICAqIEBwYXJhbSBwcm90b2NvbEZhY3RvcnkgRmFjdG9yeSB0byBjcmVhdGUgYSBwcm90b2NvbAorICAgKi8KKyAgcHVibGljIFRTZXJpYWxpemVyKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgcHJvdG9jb2xfID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydF8pOworICB9CisKKyAgLyoqCisgICAqIFNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBpbnRvIGEgYnl0ZSBhcnJheS4gVGhlIHByb2Nlc3MgaXMgc2ltcGxlLAorICAgKiBqdXN0IGNsZWFyIHRoZSBieXRlIGFycmF5IG91dHB1dCwgd3JpdGUgdGhlIG9iamVjdCBpbnRvIGl0LCBhbmQgZ3JhYiB0aGUKKyAgICogcmF3IGJ5dGVzLgorICAgKgorICAgKiBAcGFyYW0gYmFzZSBUaGUgb2JqZWN0IHRvIHNlcmlhbGl6ZQorICAgKiBAcmV0dXJuIFNlcmlhbGl6ZWQgb2JqZWN0IGluIGJ5dGVbXSBmb3JtYXQKKyAgICovCisgIHB1YmxpYyBieXRlW10gc2VyaWFsaXplKFRCYXNlIGJhc2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBiYW9zXy5yZXNldCgpOworICAgIGJhc2Uud3JpdGUocHJvdG9jb2xfKTsKKyAgICByZXR1cm4gYmFvc18udG9CeXRlQXJyYXkoKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgaW50byBhIEphdmEgc3RyaW5nLCB1c2luZyBhIHNwZWNpZmllZAorICAgKiBjaGFyYWN0ZXIgc2V0IGZvciBlbmNvZGluZy4KKyAgICoKKyAgICogQHBhcmFtIGJhc2UgVGhlIG9iamVjdCB0byBzZXJpYWxpemUKKyAgICogQHBhcmFtIGNoYXJzZXQgVmFsaWQgSlZNIGNoYXJzZXQKKyAgICogQHJldHVybiBTZXJpYWxpemVkIG9iamVjdCBhcyBhIFN0cmluZworICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhUQmFzZSBiYXNlLCBTdHJpbmcgY2hhcnNldCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IFN0cmluZyhzZXJpYWxpemUoYmFzZSksIGNoYXJzZXQpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgRU5DT0RJTkc6ICIgKyBjaGFyc2V0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2VyaWFsaXplIHRoZSBUaHJpZnQgb2JqZWN0IGludG8gYSBKYXZhIHN0cmluZywgdXNpbmcgdGhlIGRlZmF1bHQgSlZNCisgICAqIGNoYXJzZXQgZW5jb2RpbmcuCisgICAqCisgICAqIEBwYXJhbSBiYXNlIFRoZSBvYmplY3QgdG8gc2VyaWFsaXplCisgICAqIEByZXR1cm4gU2VyaWFsaXplZCBvYmplY3QgYXMgYSBTdHJpbmcKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoVEJhc2UgYmFzZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiBuZXcgU3RyaW5nKHNlcmlhbGl6ZShiYXNlKSk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwN2I3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworCisvKioKKyAqIEEgVFNlcnZpY2VDbGllbnQgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgVFNlcnZpY2UgaW1wbGVtZW50YXRpb24KKyAqIGFjcm9zcyBwcm90b2NvbHMgYW5kIHRyYW5zcG9ydHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVFNlcnZpY2VDbGllbnQgeworICAvKioKKyAgICogR2V0IHRoZSBUUHJvdG9jb2wgYmVpbmcgdXNlZCBhcyB0aGUgaW5wdXQgKHJlYWQpIHByb3RvY29sLgorICAgKiBAcmV0dXJuCisgICAqLworICBwdWJsaWMgVFByb3RvY29sIGdldElucHV0UHJvdG9jb2woKTsKKyAgLyoqCisgICAqIEdldCB0aGUgVFByb3RvY29sIGJlaW5nIHVzZWQgYXMgdGhlIG91dHB1dCAod3JpdGUpIHByb3RvY29sLgorICAgKiBAcmV0dXJuCisgICAqLworICBwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2UwMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHN0b3JlIG1ldGEgZGF0YSBhYm91dCB0aHJpZnQgZmllbGRzLiBFdmVyeSBmaWVsZCBpbiBhCisgKiBhIHN0cnVjdCBzaG91bGQgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBkZXNjcmliaW5nIGl0LgorICoKKyAqLworcHVibGljIGNsYXNzIEZpZWxkTWV0YURhdGEgIHsKKyAgcHVibGljIGZpbmFsIFN0cmluZyBmaWVsZE5hbWU7CisgIHB1YmxpYyBmaW5hbCBieXRlIHJlcXVpcmVtZW50VHlwZTsKKyAgcHVibGljIGZpbmFsIEZpZWxkVmFsdWVNZXRhRGF0YSB2YWx1ZU1ldGFEYXRhOworICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgc3RydWN0TWFwOworICAKKyAgc3RhdGljIHsKKyAgICBzdHJ1Y3RNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisgIH0KKyAgCisgIHB1YmxpYyBGaWVsZE1ldGFEYXRhKFN0cmluZyBuYW1lLCBieXRlIHJlcSwgRmllbGRWYWx1ZU1ldGFEYXRhIHZNZXRhRGF0YSl7CisgICAgdGhpcy5maWVsZE5hbWUgPSBuYW1lOworICAgIHRoaXMucmVxdWlyZW1lbnRUeXBlID0gcmVxOworICAgIHRoaXMudmFsdWVNZXRhRGF0YSA9IHZNZXRhRGF0YTsKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MsIEhhc2h0YWJsZSBtYXApeworICAgIHN0cnVjdE1hcC5wdXQoc0NsYXNzLCBtYXApOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBtYXAgd2l0aCBtZXRhZGF0YSAoaS5lLiBpbnN0YW5jZXMgb2YgRmllbGRNZXRhRGF0YSkgdGhhdAorICAgKiBkZXNjcmliZSB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBjbGFzcy4KKyAgICoKKyAgICogQHBhcmFtIHNDbGFzcyBUaGUgVEJhc2UgY2xhc3MgZm9yIHdoaWNoIHRoZSBtZXRhZGF0YSBtYXAgaXMgcmVxdWVzdGVkCisgICAqLworICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBIYXNodGFibGUgZ2V0U3RydWN0TWV0YURhdGFNYXAoQ2xhc3Mgc0NsYXNzKXsKKyAgICBpZiAoIXN0cnVjdE1hcC5jb250YWluc0tleShzQ2xhc3MpKXsgLy8gTG9hZCBjbGFzcyBpZiBpdCBoYXNuJ3QgYmVlbiBsb2FkZWQKKyAgICAgIHRyeXsKKyAgICAgICAgc0NsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBmb3IgVEJhc2UgY2xhc3M6ICIgKyBzQ2xhc3MuZ2V0TmFtZSgpICsgIiwgbWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSl7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGZvciBUQmFzZSBjbGFzczogIiArIHNDbGFzcy5nZXROYW1lKCkgKyAiLCBtZXNzYWdlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKEhhc2h0YWJsZSkgc3RydWN0TWFwLmdldChzQ2xhc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRWYWx1ZU1ldGFEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwMTdiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGU7CisKKworLyoqCisgKiBGaWVsZFZhbHVlTWV0YURhdGEgYW5kIGNvbGxlY3Rpb24gb2Ygc3ViY2xhc3NlcyB0byBzdG9yZSBtZXRhZGF0YSBhYm91dAorICogdGhlIHZhbHVlKHMpIG9mIGEgZmllbGQKKyAqLworcHVibGljIGNsYXNzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisgIHB1YmxpYyBmaW5hbCBieXRlIHR5cGU7ICAKKyAKKyAgcHVibGljIEZpZWxkVmFsdWVNZXRhRGF0YShieXRlIHR5cGUpeworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzU3RydWN0KCkgeworICAgIHJldHVybiB0eXBlID09IFRUeXBlLlNUUlVDVDsgCisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVyKCkgeworICAgIHJldHVybiB0eXBlID09IFRUeXBlLkxJU1QgfHwgdHlwZSA9PSBUVHlwZS5NQVAgfHwgdHlwZSA9PSBUVHlwZS5TRVQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9MaXN0TWV0YURhdGEuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9MaXN0TWV0YURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Q3MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0xpc3RNZXRhRGF0YS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhOworCitwdWJsaWMgY2xhc3MgTGlzdE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKyAgcHVibGljIGZpbmFsIEZpZWxkVmFsdWVNZXRhRGF0YSBlbGVtTWV0YURhdGE7CisgIAorICBwdWJsaWMgTGlzdE1ldGFEYXRhKGJ5dGUgdHlwZSwgRmllbGRWYWx1ZU1ldGFEYXRhIGVNZXRhRGF0YSl7CisgICAgc3VwZXIodHlwZSk7CisgICAgdGhpcy5lbGVtTWV0YURhdGEgPSBlTWV0YURhdGE7CisgIH0gICAgCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTWFwTWV0YURhdGEuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9NYXBNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMWQ2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTWFwTWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YTsKKworcHVibGljIGNsYXNzIE1hcE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKyAgcHVibGljIGZpbmFsIEZpZWxkVmFsdWVNZXRhRGF0YSBrZXlNZXRhRGF0YTsKKyAgcHVibGljIGZpbmFsIEZpZWxkVmFsdWVNZXRhRGF0YSB2YWx1ZU1ldGFEYXRhOworICAKKyAgcHVibGljIE1hcE1ldGFEYXRhKGJ5dGUgdHlwZSwgRmllbGRWYWx1ZU1ldGFEYXRhIGtNZXRhRGF0YSwgRmllbGRWYWx1ZU1ldGFEYXRhIHZNZXRhRGF0YSl7CisgICAgc3VwZXIodHlwZSk7CisgICAgdGhpcy5rZXlNZXRhRGF0YSA9IGtNZXRhRGF0YTsKKyAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CisgIH0gICAgCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU2V0TWV0YURhdGEuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9TZXRNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzY4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU2V0TWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitwdWJsaWMgY2xhc3MgU2V0TWV0YURhdGEgZXh0ZW5kcyBGaWVsZFZhbHVlTWV0YURhdGEgeworICBwdWJsaWMgZmluYWwgRmllbGRWYWx1ZU1ldGFEYXRhIGVsZW1NZXRhRGF0YTsKKyAgCisgIHB1YmxpYyBTZXRNZXRhRGF0YShieXRlIHR5cGUsIEZpZWxkVmFsdWVNZXRhRGF0YSBlTWV0YURhdGEpeworICAgIHN1cGVyKHR5cGUpOworICAgIHRoaXMuZWxlbU1ldGFEYXRhID0gZU1ldGFEYXRhOworICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU3RydWN0TWV0YURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzBkOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGE7CisKKworcHVibGljIGNsYXNzIFN0cnVjdE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKyAgcHVibGljIGZpbmFsIENsYXNzIHN0cnVjdENsYXNzOworICAKKyAgcHVibGljIFN0cnVjdE1ldGFEYXRhKGJ5dGUgdHlwZSwgQ2xhc3Mgc0NsYXNzKXsKKyAgICBzdXBlcih0eXBlKTsKKyAgICB0aGlzLnN0cnVjdENsYXNzID0gc0NsYXNzOworICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZjOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBDbGFzcyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIEJhc2U2NCBkYXRhLgorICoKKyAqIFRoaXMgY2xhc3MgaXMga2VwdCBhdCBwYWNrYWdlIGxldmVsIGJlY2F1c2UgdGhlIGludGVyZmFjZSBkb2VzIG5vIGlucHV0CisgKiB2YWxpZGF0aW9uIGFuZCBpcyB0aGVyZWZvcmUgdG9vIGxvdy1sZXZlbCBmb3IgZ2VuZXJhbGl6ZWQgcmV1c2UuCisgKgorICogTm90ZSBhbHNvIHRoYXQgdGhlIGVuY29kaW5nIGRvZXMgbm90IHBhZCB3aXRoIGVxdWFsIHNpZ25zICwgYXMgZGlzY3Vzc2VkIGluCisgKiBzZWN0aW9uIDIuMiBvZiB0aGUgUkZDIChodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMzU0OC5odG1sKS4gRnVydGhlcm1vcmUsCisgKiBiYWQgZGF0YSBlbmNvdW50ZXJlZCB3aGVuIGRlY29kaW5nIGlzIG5laXRoZXIgcmVqZWN0ZWQgb3IgaWdub3JlZCBidXQgc2ltcGx5CisgKiByZXN1bHRzIGluIGJhZCBkZWNvZGVkIGRhdGEgLS0gdGhpcyBpcyBub3QgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBSRkMgYnV0IGlzCisgKiBkb25lIGluIHRoZSBpbnRlcmVzdCBvZiBwZXJmb3JtYW5jZS4KKyAqCisgKi8KK2NsYXNzIFRCYXNlNjRVdGlscyB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ERV9UQUJMRSA9CisgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCisgIC8qKgorICAgKiBFbmNvZGUgbGVuIGJ5dGVzIG9mIGRhdGEgaW4gc3JjIGF0IG9mZnNldCBzcmNPZmYsIHN0b3JpbmcgdGhlIHJlc3VsdCBpbnRvCisgICAqIGRzdCBhdCBvZmZzZXQgZHN0T2ZmLiBsZW4gbXVzdCBiZSAxLCAyLCBvciAzLiBkc3QgbXVzdCBoYXZlIGF0IGxlYXN0IGxlbisxCisgICAqIGJ5dGVzIG9mIHNwYWNlIGF0IGRzdE9mZi4gc3JjIGFuZCBkc3Qgc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSBvYmplY3QuIFRoaXMKKyAgICogbWV0aG9kIGRvZXMgbm8gdmFsaWRhdGlvbiBvZiB0aGUgaW5wdXQgdmFsdWVzIGluIHRoZSBpbnRlcmVzdCBvZgorICAgKiBwZXJmb3JtYW5jZS4KKyAgICoKKyAgICogQHBhcmFtIHNyYyAgdGhlIHNvdXJjZSBvZiBieXRlcyB0byBlbmNvZGUKKyAgICogQHBhcmFtIHNyY09mZiAgdGhlIG9mZnNldCBpbnRvIHRoZSBzb3VyY2UgdG8gcmVhZCB0aGUgdW5lbmNvZGVkIGJ5dGVzCisgICAqIEBwYXJhbSBsZW4gIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZW5jb2RlIChtdXN0IGJlIDEsIDIsIG9yIDMpLgorICAgKiBAcGFyYW0gZHN0ICB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBlbmNvZGluZworICAgKiBAcGFyYW0gZHN0T2ZmICB0aGUgb2Zmc2V0IGludG8gdGhlIGRlc3RpbmF0aW9uIHRvIHBsYWNlIHRoZSBlbmNvZGVkIGJ5dGVzCisgICAqLworICBzdGF0aWMgZmluYWwgdm9pZCBlbmNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgIGJ5dGVbXSBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0T2ZmKSB7CisgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KChzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0YpOworICAgIGlmIChsZW4gPT0gMykgeworICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYrMV0gPj4gNCkgJiAweDBGKSk7CisgICAgICBkc3RbZHN0T2ZmICsgMl0gPQorICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEUuY2hhckF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmKzJdID4+IDYpICYgMHgwMykpOworICAgICAgZHN0W2RzdE9mZiArIDNdID0KKyAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdChzcmNbc3JjT2ZmKzJdICYgMHgzRik7CisgICAgfQorICAgIGVsc2UgaWYgKGxlbiA9PSAyKSB7CisgICAgICBkc3RbZHN0T2ZmKzFdID0KKyAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmKzFdID4+IDQpICYgMHgwRikpOworICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFLmNoYXJBdCgoc3JjW3NyY09mZisxXSA8PCAyKSAmIDB4M0MpOworICAgIH0KKyAgICBlbHNlIHsgLy8gbGVuID09IDEpIHsKKyAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRS5jaGFyQXQoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIERFQ09ERV9UQUJMRSA9IHsKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSw2MiwtMSwtMSwtMSw2MywKKyAgICA1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKKyAgICAxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCwKKyAgICA0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgfTsKKworICAvKioKKyAgICogRGVjb2RlIGxlbiBieXRlcyBvZiBkYXRhIGluIHNyYyBhdCBvZmZzZXQgc3JjT2ZmLCBzdG9yaW5nIHRoZSByZXN1bHQgaW50bworICAgKiBkc3QgYXQgb2Zmc2V0IGRzdE9mZi4gbGVuIG11c3QgYmUgMiwgMywgb3IgNC4gZHN0IG11c3QgaGF2ZSBhdCBsZWFzdCBsZW4tMQorICAgKiBieXRlcyBvZiBzcGFjZSBhdCBkc3RPZmYuIHNyYyBhbmQgZHN0IG1heSBiZSB0aGUgc2FtZSBvYmplY3QgYXMgbG9uZyBhcworICAgKiBkc3RvZmYgPD0gc3JjT2ZmLiBUaGlzIG1ldGhvZCBkb2VzIG5vIHZhbGlkYXRpb24gb2YgdGhlIGlucHV0IHZhbHVlcyBpbgorICAgKiB0aGUgaW50ZXJlc3Qgb2YgcGVyZm9ybWFuY2UuCisgICAqCisgICAqIEBwYXJhbSBzcmMgIHRoZSBzb3VyY2Ugb2YgYnl0ZXMgdG8gZGVjb2RlCisgICAqIEBwYXJhbSBzcmNPZmYgIHRoZSBvZmZzZXQgaW50byB0aGUgc291cmNlIHRvIHJlYWQgdGhlIGVuY29kZWQgYnl0ZXMKKyAgICogQHBhcmFtIGxlbiAgdGhlIG51bWJlciBvZiBieXRlcyB0byBkZWNvZGUgKG11c3QgYmUgMiwgMywgb3IgNCkKKyAgICogQHBhcmFtIGRzdCAgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgZGVjb2RpbmcKKyAgICogQHBhcmFtIGRzdE9mZiAgdGhlIG9mZnNldCBpbnRvIHRoZSBkZXN0aW5hdGlvbiB0byBwbGFjZSB0aGUgZGVjb2RlZCBieXRlcworICAgKi8KKyAgc3RhdGljIGZpbmFsIHZvaWQgZGVjb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sICBieXRlW10gZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdE9mZikgeworICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpCisgICAgICAoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmXSAmIDB4MEZGXSA8PCAyKSB8CisgICAgICAgKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmKzFdICYgMHgwRkZdID4+IDQpKTsKKyAgICBpZiAobGVuID4gMikgeworICAgICAgZHN0W2RzdE9mZisxXSA9IChieXRlKQorICAgICAgICAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZisxXSAmIDB4MEZGXSA8PCA0KSAmIDB4RjApIHwKKyAgICAgICAgIChERUNPREVfVEFCTEVbc3JjW3NyY09mZisyXSAmIDB4MEZGXSA+PiAyKSk7CisgICAgICBpZiAobGVuID4gMykgeworICAgICAgICBkc3RbZHN0T2ZmKzJdID0gKGJ5dGUpCisgICAgICAgICAgKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYrMl0gJiAweDBGRl0gPDwgNikgJiAweEMwKSB8CisgICAgICAgICAgIERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmKzNdICYgMHgwRkZdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmZTc2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCkBAIC0wLDAgKzEsMzI5IEBACisgLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisgKiBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisKKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF8gPSBmYWxzZTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKworICAvKioKKyAgICogRmFjdG9yeQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF8gPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RXcml0ZV8gPSB0cnVlOworCisgICAgcHVibGljIEZhY3RvcnkoKSB7CisgICAgICB0aGlzKGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFjdG9yeShib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKKyAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgeworICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvcgorICAgKi8KKyAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgdGhpcyh0cmFucywgZmFsc2UsIHRydWUpOworICB9CisKKyAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKKyAgICBzdXBlcih0cmFucyk7CisgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGlmIChzdHJpY3RXcml0ZV8pIHsKKyAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOworICAgICAgd3JpdGVJMzIodmVyc2lvbik7CisgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUJ5dGUobWVzc2FnZS50eXBlKTsKKyAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHt9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkge30KKworICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHt9CisKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlQnl0ZShmaWVsZC50eXBlKTsKKyAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKworICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKKyAgICB3cml0ZUJ5dGUobWFwLnZhbHVlVHlwZSk7CisgICAgd3JpdGVJMzIobWFwLnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUJ5dGUobGlzdC5lbGVtVHlwZSk7CisgICAgd3JpdGVJMzIobGlzdC5zaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlQnl0ZShzZXQuZWxlbVR5cGUpOworICAgIHdyaXRlSTMyKHNldC5zaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkge30KKworICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CisgIH0KKworICBwcml2YXRlIGJ5dGUgW10gYm91dCA9IG5ldyBieXRlWzFdOworICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYm91dFswXSA9IGI7CisgICAgdHJhbnNfLndyaXRlKGJvdXQsIDAsIDEpOworICB9CisKKyAgcHJpdmF0ZSBieXRlW10gaTE2b3V0ID0gbmV3IGJ5dGVbMl07CisgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGkxNm91dFswXSA9IChieXRlKSgweGZmICYgKGkxNiA+PiA4KSk7CisgICAgaTE2b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2KSk7CisgICAgdHJhbnNfLndyaXRlKGkxNm91dCwgMCwgMik7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKKyAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGkzMm91dFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOworICAgIGkzMm91dFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOworICAgIGkzMm91dFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7CisgICAgaTMyb3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyKSk7CisgICAgdHJhbnNfLndyaXRlKGkzMm91dCwgMCwgNCk7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBpNjRvdXQgPSBuZXcgYnl0ZVs4XTsKKyAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBpNjRvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICBpNjRvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICBpNjRvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDApKTsKKyAgICBpNjRvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICBpNjRvdXRbNF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICBpNjRvdXRbNV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMTYpKTsKKyAgICBpNjRvdXRbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOworICAgIGk2NG91dFs3XSA9IChieXRlKSgweGZmICYgKGk2NCkpOworICAgIHRyYW5zXy53cml0ZShpNjRvdXQsIDAsIDgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSTY0KERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGR1YikpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBieXRlW10gZGF0ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgd3JpdGVJMzIoZGF0Lmxlbmd0aCk7CisgICAgICB0cmFuc18ud3JpdGUoZGF0LCAwLCBkYXQubGVuZ3RoKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoYnl0ZVtdIGJpbikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSTMyKGJpbi5sZW5ndGgpOworICAgIHRyYW5zXy53cml0ZShiaW4sIDAsIGJpbi5sZW5ndGgpOworICB9CisKKyAgLyoqCisgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOworCisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICBpbnQgdmVyc2lvbiA9IHNpemUgJiBWRVJTSU9OX01BU0s7CisgICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luIik7CisgICAgICB9CisgICAgICBtZXNzYWdlLnR5cGUgPSAoYnl0ZSkoc2l6ZSAmIDB4MDAwMDAwZmYpOworICAgICAgbWVzc2FnZS5uYW1lID0gcmVhZFN0cmluZygpOworICAgICAgbWVzc2FnZS5zZXFpZCA9IHJlYWRJMzIoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHN0cmljdFJlYWRfKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Iik7CisgICAgICB9CisgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkU3RyaW5nQm9keShzaXplKTsKKyAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRCeXRlKCk7CisgICAgICBtZXNzYWdlLnNlcWlkID0gcmVhZEkzMigpOworICAgIH0KKyAgICByZXR1cm4gbWVzc2FnZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKworICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKworICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICBmaWVsZC50eXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpZiAoZmllbGQudHlwZSAhPSBUVHlwZS5TVE9QKSB7CisgICAgICBmaWVsZC5pZCA9IHJlYWRJMTYoKTsKKyAgICB9CisgICAgcmV0dXJuIGZpZWxkOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKworICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVE1hcCBtYXAgPSBuZXcgVE1hcCgpOworICAgIG1hcC5rZXlUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBtYXAudmFsdWVUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBtYXAuc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICByZXR1cm4gbWFwOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisKKyAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVExpc3QgbGlzdCA9IG5ldyBUTGlzdCgpOworICAgIGxpc3QuZWxlbVR5cGUgPSByZWFkQnl0ZSgpOworICAgIGxpc3Quc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICByZXR1cm4gbGlzdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKworICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVFNldCBzZXQgPSBuZXcgVFNldCgpOworICAgIHNldC5lbGVtVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgc2V0LnNpemUgPSByZWFkSTMyKCk7CisgICAgcmV0dXJuIHNldDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorCisgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKKyAgfQorCisgIHByaXZhdGUgYnl0ZVtdIGJpbiA9IG5ldyBieXRlWzFdOworICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkQWxsKGJpbiwgMCwgMSk7CisgICAgcmV0dXJuIGJpblswXTsKKyAgfQorCisgIHByaXZhdGUgYnl0ZVtdIGkxNnJkID0gbmV3IGJ5dGVbMl07CisgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRBbGwoaTE2cmQsIDAsIDIpOworICAgIHJldHVybgorICAgICAgKHNob3J0KQorICAgICAgKCgoaTE2cmRbMF0gJiAweGZmKSA8PCA4KSB8CisgICAgICAgKChpMTZyZFsxXSAmIDB4ZmYpKSk7CisgIH0KKworICBwcml2YXRlIGJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlWzRdOworICBwdWJsaWMgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEFsbChpMzJyZCwgMCwgNCk7CisgICAgcmV0dXJuCisgICAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICgoaTMycmRbMV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgKChpMzJyZFsyXSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgICAoKGkzMnJkWzNdICYgMHhmZikpOworICB9CisKKyAgcHJpdmF0ZSBieXRlW10gaTY0cmQgPSBuZXcgYnl0ZVs4XTsKKyAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkQWxsKGk2NHJkLCAwLCA4KTsKKyAgICByZXR1cm4KKyAgICAgICgobG9uZykoaTY0cmRbMF0gJiAweGZmKSA8PCA1NikgfAorICAgICAgKChsb25nKShpNjRyZFsxXSAmIDB4ZmYpIDw8IDQ4KSB8CisgICAgICAoKGxvbmcpKGk2NHJkWzJdICYgMHhmZikgPDwgNDApIHwKKyAgICAgICgobG9uZykoaTY0cmRbM10gJiAweGZmKSA8PCAzMikgfAorICAgICAgKChsb25nKShpNjRyZFs0XSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgICAoKGxvbmcpKGk2NHJkWzVdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICgobG9uZykoaTY0cmRbNl0gJiAweGZmKSA8PCAgOCkgfAorICAgICAgKChsb25nKShpNjRyZFs3XSAmIDB4ZmYpKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUocmVhZEk2NCgpKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKKyAgICByZXR1cm4gcmVhZFN0cmluZ0JvZHkoc2l6ZSk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmdCb2R5KGludCBzaXplKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsICJVVEYtOCIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYnl0ZVtdIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIHByaXZhdGUgaW50IHJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiB0cmFuc18ucmVhZEFsbChidWYsIG9mZiwgbGVuKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjExNDBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBmaWVsZCBtZXRhZGF0YS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBURmllbGQgeworICBwdWJsaWMgVEZpZWxkKCkge30KKworICBwdWJsaWMgVEZpZWxkKFN0cmluZyBuLCBieXRlIHQsIHNob3J0IGkpIHsKKyAgICBuYW1lID0gbjsKKyAgICB0eXBlID0gdDsKKyAgICBpZCA9IGk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIG5hbWUgPSAiIjsKKyAgcHVibGljIGJ5dGUgICB0eXBlID0gVFR5cGUuU1RPUDsKKyAgcHVibGljIHNob3J0ICBpZCAgID0gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkxNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCkBAIC0wLDAgKzEsOTczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorICogSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICogVGhpcyBpcyBhIGZ1bGwtZmVhdHVyZWQgcHJvdG9jb2wgc3VwcG9ydGluZyB3cml0ZSBhbmQgcmVhZC4KKyAqIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCisgKiBwcm90b2NvbCdzIHdpcmUgZm9ybWF0LgorICovCitwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisKKyAgLyoqCisgICAqIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cworICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIENPTU1BICAgICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJywnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgQ09MT04gICAgICAgICAgICA9IG5ldyBieXRlW10geyAnOicgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBMQlJBQ0UgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICd7JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIFJCUkFDRSAgICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ30nIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTEJSQUNLRVQgICAgICAgICA9IG5ldyBieXRlW10geyAnWycgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBSQlJBQ0tFVCAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICddJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIFFVT1RFICAgICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJyInIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgQkFDS1NMQVNIICAgICAgICA9IG5ldyBieXRlW10geyAnXFwnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgWkVSTyAgICAgICAgICAgICA9IG5ldyBieXRlW10geyAnMCcgfTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIEVTQ1NFUSAgICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ1xcJywgJ3UnLCAnMCcsICcwJyB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgICAgVkVSU0lPTiAgICAgICAgICA9IDE7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBKU09OX0NIQVJfVEFCTEUgID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAxIDIgMyA0IDUgNiA3IDggOSBBIEIgQyBEIEUgRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgJ2InLCAndCcsICduJywgMCwgJ2YnLCAncicsIDAsIDAsIC8vIDAKKyAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDEKKyAgICAgIDEsIDEsICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgIEVTQ0FQRV9DSEFSUyAgICAgPSAiXCJcXC9iZm5ydCI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBFU0NBUEVfQ0hBUl9WQUxTID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInLCAnXFwnLCAnLycsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgICAgREVGX1NUUklOR19TSVpFICA9IDE2OworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9CT09MICAgICAgICA9IG5ldyBieXRlW10geyAndCcsICdmJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfQllURSAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ2knLCAnOCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX0kxNiAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdpJywgJzEnLCAnNicgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX0kzMiAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdpJywgJzMnLCAnMicgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX0k2NCAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdpJywgJzYnLCAnNCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX0RPVUJMRSAgICAgID0gbmV3IGJ5dGVbXSB7ICdkJywgJ2InLCAnbCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX1NUUlVDVCAgICAgID0gbmV3IGJ5dGVbXSB7ICdyJywgJ2UnLCAnYycgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX1NUUklORyAgICAgID0gbmV3IGJ5dGVbXSB7ICdzJywgJ3QnLCAncicgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX01BUCAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdtJywgJ2EnLCAncCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX0xJU1QgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdsJywgJ3MnLCAndCcgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX1NFVCAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdzJywgJ2UnLCAndCcgfTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IEFOT05ZTU9VU19TVFJVQ1QgPSBuZXcgVFN0cnVjdCgpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBnZXRUeXBlTmFtZUZvclR5cGVJRChieXRlIHR5cGVJRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBzd2l0Y2ggKHR5cGVJRCkgeworICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgIHJldHVybiBOQU1FX0JPT0w7CisgICAgY2FzZSBUVHlwZS5CWVRFOgorICAgICAgcmV0dXJuIE5BTUVfQllURTsKKyAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgIHJldHVybiBOQU1FX0kxNjsKKyAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgIHJldHVybiBOQU1FX0kzMjsKKyAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgIHJldHVybiBOQU1FX0k2NDsKKyAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgIHJldHVybiBOQU1FX0RPVUJMRTsKKyAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgIHJldHVybiBOQU1FX1NUUklORzsKKyAgICBjYXNlIFRUeXBlLlNUUlVDVDoKKyAgICAgIHJldHVybiBOQU1FX1NUUlVDVDsKKyAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgIHJldHVybiBOQU1FX01BUDsKKyAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgIHJldHVybiBOQU1FX1NFVDsKKyAgICBjYXNlIFRUeXBlLkxJU1Q6CisgICAgICByZXR1cm4gTkFNRV9MSVNUOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBnZXRUeXBlSURGb3JUeXBlTmFtZShieXRlW10gbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYnl0ZSByZXN1bHQgPSBUVHlwZS5TVE9QOworICAgIGlmIChuYW1lLmxlbmd0aCA+IDEpIHsKKyAgICAgIHN3aXRjaCAobmFtZVswXSkgeworICAgICAgY2FzZSAnZCc6CisgICAgICAgIHJlc3VsdCA9IFRUeXBlLkRPVUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdpJzoKKyAgICAgICAgc3dpdGNoIChuYW1lWzFdKSB7CisgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJZVEU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkxNjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTMyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc2JzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JNjQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdsJzoKKyAgICAgICAgcmVzdWx0ID0gVFR5cGUuTElTVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdtJzoKKyAgICAgICAgcmVzdWx0ID0gVFR5cGUuTUFQOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3InOgorICAgICAgICByZXN1bHQgPSBUVHlwZS5TVFJVQ1Q7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncyc6CisgICAgICAgIGlmIChuYW1lWzFdID09ICd0JykgeworICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNUUklORzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChuYW1lWzFdID09ICdlJykgeworICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLlNFVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3QnOgorICAgICAgICByZXN1bHQgPSBUVHlwZS5CT09MOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdCA9PSBUVHlwZS5TVE9QKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUgaW5zZXJ0aW5nL3JlYWRpbmcKKyAgLy8gYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzCisgIC8vIFRoaXMgYmFzZSBjb250ZXh0IGRvZXMgbm90aGluZy4KKyAgcHJvdGVjdGVkIGNsYXNzIEpTT05CYXNlQ29udGV4dCB7CisgICAgLyoqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQorCisgICAgLyoqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVhZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlc2NhcGVOdW0oKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvcmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKKyAgLy8gZm9yIHRoZSBmaXJzdCBvbmUKKyAgcHJvdGVjdGVkIGNsYXNzIEpTT05MaXN0Q29udGV4dCBleHRlbmRzIEpTT05CYXNlQ29udGV4dCB7CisgICAgcHJpdmF0ZSBib29sZWFuIGZpcnN0XyA9IHRydWU7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cmFuc18ud3JpdGUoQ09NTUEpOworICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlYWQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoZmlyc3RfKSB7CisgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKENPTU1BKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDb250ZXh0IGZvciBKU09OIHJlY29yZHMuIFdpbGwgaW5zZXJ0L3JlYWQgY29sb25zIGJlZm9yZSB0aGUgdmFsdWUgcG9ydGlvbgorICAvLyBvZiBlYWNoIHJlY29yZCBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbgorICAvLyBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCisgIC8vIGVzY2FwZWQgaW4gcXVvdGVzIChzaW5jZSBKU09OIGtleXMgbXVzdCBiZSBzdHJpbmdzKS4KKyAgcHJvdGVjdGVkIGNsYXNzIEpTT05QYWlyQ29udGV4dCBleHRlbmRzIEpTT05CYXNlQ29udGV4dCB7CisgICAgcHJpdmF0ZSBib29sZWFuIGZpcnN0XyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGNvbG9uXyA9IHRydWU7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0cmFuc18ud3JpdGUoY29sb25fID8gQ09MT04gOiBDT01NQSk7CisgICAgICAgIGNvbG9uXyA9ICFjb2xvbl87CisgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVhZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaXJzdF8pIHsKKyAgICAgICAgZmlyc3RfID0gZmFsc2U7CisgICAgICAgIGNvbG9uXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoY29sb25fID8gQ09MT04gOiBDT01NQSk7CisgICAgICAgIGNvbG9uXyA9ICFjb2xvbl87CisgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXNjYXBlTnVtKCkgeworICAgICAgcmV0dXJuIGNvbG9uXzsKKyAgICB9CisgIH0KKworICAvLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKKyAgcHJvdGVjdGVkIGNsYXNzIExvb2thaGVhZFJlYWRlciB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzRGF0YV87CisgICAgcHJpdmF0ZSBieXRlW10gIGRhdGFfID0gbmV3IGJ5dGVbMV07CisKKyAgICAvLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSByZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgcHJvdGVjdGVkIGJ5dGUgcmVhZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmIChoYXNEYXRhXykgeworICAgICAgICBoYXNEYXRhXyA9IGZhbHNlOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHRyYW5zXy5yZWFkQWxsKGRhdGFfLCAwLCAxKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBkYXRhX1swXTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSByZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCisgICAgLy8gYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxyZWFkeS4KKyAgICBwcm90ZWN0ZWQgYnl0ZSBwZWVrKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKCFoYXNEYXRhXykgeworICAgICAgICB0cmFuc18ucmVhZEFsbChkYXRhXywgMCwgMSk7CisgICAgICB9CisgICAgICBoYXNEYXRhXyA9IHRydWU7CisgICAgICByZXR1cm4gZGF0YV9bMF07CisgICAgfQorICB9CisKKyAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIG9mIHR5cGUgSlNPTkJhc2VDb250ZXh0IHRoYXQgd2UgbWF5IGJlIGluCisgIHByaXZhdGUgU3RhY2sgICAgICAgICAgIGNvbnRleHRTdGFja18gPSBuZXcgU3RhY2soKTsKKworICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgcHJpdmF0ZSBKU09OQmFzZUNvbnRleHQgY29udGV4dF8gICAgICA9IG5ldyBKU09OQmFzZUNvbnRleHQoKTsKKworICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgorICBwcml2YXRlIExvb2thaGVhZFJlYWRlciByZWFkZXJfICAgICAgID0gbmV3IExvb2thaGVhZFJlYWRlcigpOworCisgIC8vIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICBwcml2YXRlIHZvaWQgcHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpIHsKKyAgICBjb250ZXh0U3RhY2tfLnB1c2goY29udGV4dF8pOworICAgIGNvbnRleHRfID0gYzsKKyAgfQorCisgIC8vIFBvcCB0aGUgbGFzdCBKU09OIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICBwcml2YXRlIHZvaWQgcG9wQ29udGV4dCgpIHsKKyAgICBjb250ZXh0XyA9IChKU09OQmFzZUNvbnRleHQpY29udGV4dFN0YWNrXy5wb3AoKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvcgorICAgKi8KKyAgcHVibGljIFRKU09OUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgeworICAgIHN1cGVyKHRyYW5zKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgIGNvbnRleHRTdGFja18uY2xlYXIoKTsKKyAgICBjb250ZXh0XyA9IG5ldyBKU09OQmFzZUNvbnRleHQoKTsKKyAgICByZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigpOworICB9CisKKyAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGJ5IHNldmVyYWwgbWV0aG9kcworICBwcml2YXRlIGJ5dGVbXSB0bXBidWZfID0gbmV3IGJ5dGVbNF07CisKKyAgLy8gUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGJbMF07IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAvLyBNYXJrZWQgcHJvdGVjdGVkIHRvIGF2b2lkIHN5bnRoZXRpYyBhY2Nlc3NvciBpbiBKU09OTGlzdENvbnRleHQucmVhZAorICAvLyBhbmQgSlNPTlBhaXJDb250ZXh0LnJlYWQKKyAgcHJvdGVjdGVkIHZvaWQgcmVhZEpTT05TeW50YXhDaGFyKGJ5dGVbXSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYnl0ZSBjaCA9IHJlYWRlcl8ucmVhZCgpOworICAgIGlmIChjaCAhPSBiWzBdKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiIgKyAoY2hhciljaCk7CisgICAgfQorICB9CisKKyAgLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCBjaGFyICgnMCctJzknIG9yICdhJy0nZicpIGludG8gaXRzCisgIC8vIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgaGV4VmFsKGJ5dGUgY2gpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBpZiAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpIHsKKyAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnMCcpOworICAgIH0KKyAgICBlbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkgeworICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICdhJyArIDEwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIiKTsKKyAgICB9CisgIH0KKworICAvLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IHZhbHVlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBoZXhDaGFyKGJ5dGUgdmFsKSB7CisgICAgdmFsICY9IDB4MEY7CisgICAgaWYgKHZhbCA8IDEwKSB7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICcwJyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0dXJuIChieXRlKSgoY2hhcikodmFsIC0gMTApICsgJ2EnKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSGlnaFN1cnJvZ2F0ZShjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA+PSAnXHVEODAwJyAmJiBjIDw9ICdcdURCRkYnOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvd1N1cnJvZ2F0ZShjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA+PSAnXHVEQzAwJyAmJiBjIDw9ICdcdURGRkYnOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHRvVVRGOChpbnQgY29kZXBvaW50KSB7CisgICAgZmluYWwgaW50W10gRklSU1RfQllURV9NQVNLID0geyAwLCAweGMwLCAweGUwLCAweGYwIH07CisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgaWYgKGNvZGVwb2ludCA8PSAweDdmKSBsZW5ndGggPSAxOworICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDdmZikgbGVuZ3RoID0gMjsKKyAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHhmZmZmKSBsZW5ndGggPSAzOworICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDFmZmZmZikgbGVuZ3RoID0gNDsKKyAgICBlbHNlIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb2RlIHBvaW50IG92ZXIgVSsxRkZGRkYgaXMgbm90IHN1cHBvcnRlZCIpOworCisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICBzd2l0Y2ggKGxlbmd0aCkgeworICAgIGNhc2UgNDoKKyAgICAgIGJ5dGVzWzNdID0gKGJ5dGUpKChjb2RlcG9pbnQgJiAweDNmKSB8IDB4ODApOworICAgICAgY29kZXBvaW50ID4+PSA2OworICAgIGNhc2UgMzoKKyAgICAgIGJ5dGVzWzJdID0gKGJ5dGUpKChjb2RlcG9pbnQgJiAweDNmKSB8IDB4ODApOworICAgICAgY29kZXBvaW50ID4+PSA2OworICAgIGNhc2UgMjoKKyAgICAgIGJ5dGVzWzFdID0gKGJ5dGUpKChjb2RlcG9pbnQgJiAweDNmKSB8IDB4ODApOworICAgICAgY29kZXBvaW50ID4+PSA2OworICAgIGNhc2UgMToKKyAgICAgIGJ5dGVzWzBdID0gKGJ5dGUpKGNvZGVwb2ludCB8IEZJUlNUX0JZVEVfTUFTS1tsZW5ndGggLSAxXSk7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHRvVVRGOChpbnQgaGlnaCwgaW50IGxvdykgeworICAgIGludCBjb2RlcG9pbnQgPSAoMSA8PCAxNikgKyAoKGhpZ2ggJiAweDNmZikgPDwgMTApOworICAgIGNvZGVwb2ludCArPSBsb3cgJiAweDNmZjsKKyAgICByZXR1cm4gdG9VVEY4KGNvZGVwb2ludCk7CisgIH0KKworICAvLyBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTlN0cmluZyhieXRlW10gYikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLndyaXRlKCk7CisgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgICBpbnQgbGVuID0gYi5sZW5ndGg7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgaWYgKChiW2ldICYgMHgwMEZGKSA+PSAweDMwKSB7CisgICAgICAgIGlmIChiW2ldID09IEJBQ0tTTEFTSFswXSkgeworICAgICAgICAgIHRyYW5zXy53cml0ZShCQUNLU0xBU0gpOworICAgICAgICAgIHRyYW5zXy53cml0ZShCQUNLU0xBU0gpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHRyYW5zXy53cml0ZShiLCBpLCAxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHRtcGJ1Zl9bMF0gPSBKU09OX0NIQVJfVEFCTEVbYltpXV07CisgICAgICAgIGlmICh0bXBidWZfWzBdID09IDEpIHsKKyAgICAgICAgICB0cmFuc18ud3JpdGUoYiwgaSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodG1wYnVmX1swXSA+IDEpIHsKKyAgICAgICAgICB0cmFuc18ud3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgICB0cmFuc18ud3JpdGUodG1wYnVmXywgMCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdHJhbnNfLndyaXRlKEVTQ1NFUSk7CisgICAgICAgICAgdG1wYnVmX1swXSA9IGhleENoYXIoKGJ5dGUpKGJbaV0gPj4gNCkpOworICAgICAgICAgIHRtcGJ1Zl9bMV0gPSBoZXhDaGFyKGJbaV0pOworICAgICAgICAgIHRyYW5zXy53cml0ZSh0bXBidWZfLCAwLCAyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICB9CisKKyAgLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLCBpdCB3aWxsIGJlCisgIC8vIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICBwcml2YXRlIHZvaWQgd3JpdGVKU09OSW50ZWdlcihsb25nIG51bSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLndyaXRlKCk7CisgICAgU3RyaW5nIHN0ciA9IExvbmcudG9TdHJpbmcobnVtKTsKKyAgICBib29sZWFuIGVzY2FwZU51bSA9IGNvbnRleHRfLmVzY2FwZU51bSgpOworICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBieXRlW10gYnVmID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgdHJhbnNfLndyaXRlKGJ1Zik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIH0KKyAgfQorCisgIC8vIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgLy8gY29udGV4dCBkaWN0YXRlcyBlc2NhcGluZywgd3JpdGUgb3V0IGFzIEpTT04gc3RyaW5nLgorICBwcml2YXRlIHZvaWQgd3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBEb3VibGUudG9TdHJpbmcobnVtKTsKKyAgICBib29sZWFuIHNwZWNpYWwgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoMCkpIHsKKyAgICBjYXNlICdOJzogLy8gTmFOCisgICAgY2FzZSAnSSc6IC8vIEluZmluaXR5CisgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJy0nOgorICAgICAgaWYgKHN0ci5jaGFyQXQoMSkgPT0gJ0knKSB7IC8vIC1JbmZpbml0eQorICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJvb2xlYW4gZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBjb250ZXh0Xy5lc2NhcGVOdW0oKTsKKyAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIH0KKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICB0cmFuc18ud3JpdGUoYiwgMCwgYi5sZW5ndGgpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgICB9CisgIH0KKworICAvLyBXcml0ZSBvdXQgY29udGVudHMgb2YgYnl0ZSBhcnJheSBiIGFzIGEgSlNPTiBzdHJpbmcgd2l0aCBiYXNlLTY0IGVuY29kZWQKKyAgLy8gZGF0YQorICBwcml2YXRlIHZvaWQgd3JpdGVKU09OQmFzZTY0KGJ5dGVbXSBiLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIGludCBsZW4gPSBsZW5ndGg7CisgICAgaW50IG9mZiA9IG9mZnNldDsKKyAgICB3aGlsZSAobGVuID49IDMpIHsKKyAgICAgIC8vIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgICAgVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIDMsIHRtcGJ1Zl8sIDApOworICAgICAgdHJhbnNfLndyaXRlKHRtcGJ1Zl8sIDAsIDQpOworICAgICAgb2ZmICs9IDM7CisgICAgICBsZW4gLT0gMzsKKyAgICB9CisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgIC8vIEVuY29kZSByZW1haW5kZXIKKyAgICAgIFRCYXNlNjRVdGlscy5lbmNvZGUoYiwgb2ZmLCBsZW4sIHRtcGJ1Zl8sIDApOworICAgICAgdHJhbnNfLndyaXRlKHRtcGJ1Zl8sIDAsIGxlbiArIDEpOworICAgIH0KKyAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLndyaXRlKCk7CisgICAgdHJhbnNfLndyaXRlKExCUkFDRSk7CisgICAgcHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05PYmplY3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcG9wQ29udGV4dCgpOworICAgIHRyYW5zXy53cml0ZShSQlJBQ0UpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTkFycmF5U3RhcnQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICB0cmFuc18ud3JpdGUoTEJSQUNLRVQpOworICAgIHB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVKU09OQXJyYXlFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcG9wQ29udGV4dCgpOworICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgIHdyaXRlSlNPTkludGVnZXIoVkVSU0lPTik7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBiID0gbWVzc2FnZS5uYW1lLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgd3JpdGVKU09OU3RyaW5nKGIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnR5cGUpOworICAgIHdyaXRlSlNPTkludGVnZXIobWVzc2FnZS5zZXFpZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05PYmplY3RTdGFydCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OT2JqZWN0RW5kKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OSW50ZWdlcihmaWVsZC5pZCk7CisgICAgd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGQudHlwZSkpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkge30KKworICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgIHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChtYXAua2V5VHlwZSkpOworICAgIHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChtYXAudmFsdWVUeXBlKSk7CisgICAgd3JpdGVKU09OSW50ZWdlcihtYXAuc2l6ZSk7CisgICAgd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgIHdyaXRlSlNPTkFycmF5RW5kKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgIHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChsaXN0LmVsZW1UeXBlKSk7CisgICAgd3JpdGVKU09OSW50ZWdlcihsaXN0LnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkFycmF5RW5kKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgIHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChzZXQuZWxlbVR5cGUpKTsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKHNldC5zaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkFycmF5RW5kKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OSW50ZWdlcihiID8gKGxvbmcpMSA6IChsb25nKTApOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoYik7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGkxNik7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OSW50ZWdlcihpMzIpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGk2NCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09ORG91YmxlKGR1Yik7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgd3JpdGVKU09OU3RyaW5nKGIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShieXRlW10gYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OQmFzZTY0KGJpbiwgMCwgYmluLmxlbmd0aCk7CisgIH0KKworICAvKioKKyAgICogUmVhZGluZyBtZXRob2RzLgorICAgKi8KKworICAvLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcsIHVuZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuLiBTa2lwIHJlYWRpbmcgZnJvbSB0aGUKKyAgLy8gY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVhZEpTT05TdHJpbmcoYm9vbGVhbiBza2lwQ29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oREVGX1NUUklOR19TSVpFKTsKKyAgICBpbnQgaGlnaFN1cnJvZ2F0ZSA9IDA7CisgICAgaWYgKCFza2lwQ29udGV4dCkgeworICAgICAgY29udGV4dF8ucmVhZCgpOworICAgIH0KKyAgICByZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBieXRlIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgICBpZiAoY2ggPT0gUVVPVEVbMF0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoY2ggPT0gRVNDU0VRWzBdKSB7CisgICAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CisgICAgICAgIGlmIChjaCA9PSBFU0NTRVFbMV0pIHsKKyAgICAgICAgICB0cmFuc18ucmVhZEFsbCh0bXBidWZfLCAwLCA0KTsKKyAgICAgICAgICBzaG9ydCBjdSA9IChzaG9ydCkoCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1syXSkgPDwgNCkgKworICAgICAgICAgICAgICAoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bM10pKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZSgoY2hhciljdSkpIHsKKyAgICAgICAgICAgICAgaWYgKGhpZ2hTdXJyb2dhdGUgIT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSBjdTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGlzTG93U3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoaGlnaFN1cnJvZ2F0ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYXJyLndyaXRlKHRvVVRGOChoaWdoU3Vycm9nYXRlLCBjdSkpOworICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBhcnIud3JpdGUodG9VVEY4KGN1KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKKyAgICAgICAgICAgICAgICAiSlZNIGRvZXMgbm90IHN1cHBvcnQgVVRGLTgiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgIkludmFsaWQgdW5pY29kZSBzZXF1ZW5jZSIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpbnQgb2ZmID0gRVNDQVBFX0NIQVJTLmluZGV4T2YoY2gpOworICAgICAgICAgIGlmIChvZmYgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgICAgfQorICAgICAgICAgIGNoID0gRVNDQVBFX0NIQVJfVkFMU1tvZmZdOworICAgICAgICB9CisgICAgICB9CisgICAgICBhcnIud3JpdGUoY2gpOworICAgIH0KKworICAgIGlmIChoaWdoU3Vycm9nYXRlICE9IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgfQorICAgIHJldHVybiBhcnI7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgcHJpdmF0ZSBib29sZWFuIGlzSlNPTk51bWVyaWMoYnl0ZSBiKSB7CisgICAgc3dpdGNoIChiKSB7CisgICAgY2FzZSAnKyc6CisgICAgY2FzZSAnLSc6CisgICAgY2FzZSAnLic6CisgICAgY2FzZSAnMCc6CisgICAgY2FzZSAnMSc6CisgICAgY2FzZSAnMic6CisgICAgY2FzZSAnMyc6CisgICAgY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6CisgICAgY2FzZSAnNic6CisgICAgY2FzZSAnNyc6CisgICAgY2FzZSAnOCc6CisgICAgY2FzZSAnOSc6CisgICAgY2FzZSAnRSc6CisgICAgY2FzZSAnZSc6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcworICAvLyBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgIHByaXZhdGUgU3RyaW5nIHJlYWRKU09OTnVtZXJpY0NoYXJzKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFN0cmluZ0J1ZmZlciBzdHJidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGJ5dGUgY2ggPSByZWFkZXJfLnBlZWsoKTsKKyAgICAgIGlmICghaXNKU09OTnVtZXJpYyhjaCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzdHJidWYuYXBwZW5kKChjaGFyKXJlYWRlcl8ucmVhZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmJ1Zi50b1N0cmluZygpOworICB9CisKKyAgLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgcmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICBwcml2YXRlIGxvbmcgcmVhZEpTT05JbnRlZ2VyKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLnJlYWQoKTsKKyAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKCkpIHsKKyAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgfQorICAgIFN0cmluZyBzdHIgPSByZWFkSlNPTk51bWVyaWNDaGFycygpOworICAgIGlmIChjb250ZXh0Xy5lc2NhcGVOdW0oKSkgeworICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBMb25nLnZhbHVlT2Yoc3RyKS5sb25nVmFsdWUoKTsKKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgIH0KKyAgfQorCisgIC8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAvLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgorICBwcml2YXRlIGRvdWJsZSByZWFkSlNPTkRvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy5yZWFkKCk7CisgICAgaWYgKHJlYWRlcl8ucGVlaygpID09IFFVT1RFWzBdKSB7CisgICAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IHJlYWRKU09OU3RyaW5nKHRydWUpOworICAgICAgdHJ5IHsKKyAgICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS52YWx1ZU9mKGFyci50b1N0cmluZygiVVRGLTgiKSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0oKSAmJiAhRG91YmxlLmlzTmFOKGR1YikgJiYKKyAgICAgICAgICAgICFEb3VibGUuaXNJbmZpbml0ZShkdWIpKSB7CisgICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZHViOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtID09IHRydWUKKyAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBEb3VibGUudmFsdWVPZihyZWFkSlNPTk51bWVyaWNDaGFycygpKS5kb3VibGVWYWx1ZSgpOworICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgYmFzZS02NCBlbmNvZGVkIGRhdGEgYW5kIGRlY29kZSBpdC4KKyAgcHJpdmF0ZSBieXRlW10gcmVhZEpTT05CYXNlNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSByZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgYnl0ZVtdIGIgPSBhcnIuZ2V0KCk7CisgICAgaW50IGxlbiA9IGFyci5sZW4oKTsKKyAgICBpbnQgb2ZmID0gMDsKKyAgICBpbnQgc2l6ZSA9IDA7CisgICAgLy8gSWdub3JlIHBhZGRpbmcKKyAgICBpbnQgYm91bmQgPSBsZW4gPj0gMiA/IGxlbiAtIDIgOiAwOworICAgIGZvciAoaW50IGkgPSBsZW4gLSAxOyBpID49IGJvdW5kICYmIGJbaV0gPT0gJz0nOyAtLWkpIHsKKyAgICAgIC0tbGVuOworICAgIH0KKyAgICB3aGlsZSAobGVuID49IDQpIHsKKyAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQorICAgICAgVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIDQsIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQorICAgICAgb2ZmICs9IDQ7CisgICAgICBsZW4gLT0gNDsKKyAgICAgIHNpemUgKz0gMzsKKyAgICB9CisgICAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgICAgLy8gYmFzZTY0IGJ1dCBsZWdhbCBmb3Igc2tpcCBvZiByZWd1bGFyIHN0cmluZyB0eXBlKQorICAgIGlmIChsZW4gPiAxKSB7CisgICAgICAvLyBEZWNvZGUgcmVtYWluZGVyCisgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgbGVuLCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgIHNpemUgKz0gbGVuIC0gMTsKKyAgICB9CisgICAgLy8gU2FkbHkgd2UgbXVzdCBjb3B5IHRoZSBieXRlW10gKGFueSB3YXkgYXJvdW5kIHRoaXM/KQorICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIDAsIHJlc3VsdCwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkSlNPTk9iamVjdFN0YXJ0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLnJlYWQoKTsKKyAgICByZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKTsKKyAgICBwdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRKU09OT2JqZWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OU3ludGF4Q2hhcihSQlJBQ0UpOworICAgIHBvcENvbnRleHQoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkSlNPTkFycmF5U3RhcnQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ucmVhZCgpOworICAgIHJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0tFVCk7CisgICAgcHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkSlNPTkFycmF5RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OU3ludGF4Q2hhcihSQlJBQ0tFVCk7CisgICAgcG9wQ29udGV4dCgpOworICB9CisKKyAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgaWYgKHJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT04pIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICB9CisgICAgU3RyaW5nIG5hbWU7CisgICAgdHJ5IHsKKyAgICAgIG5hbWUgPSByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoIlVURi04Iik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgfQorICAgIGJ5dGUgdHlwZSA9IChieXRlKXJlYWRKU09OSW50ZWdlcigpOworICAgIGludCBzZXFpZCA9IChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShuYW1lLCB0eXBlLCBzZXFpZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5RW5kKCk7CisgIH0KKworICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05PYmplY3RTdGFydCgpOworICAgIHJldHVybiBBTk9OWU1PVVNfU1RSVUNUOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTk9iamVjdEVuZCgpOworICB9CisKKyAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBieXRlIGNoID0gcmVhZGVyXy5wZWVrKCk7CisgICAgYnl0ZSB0eXBlOworICAgIHNob3J0IGlkID0gMDsKKyAgICBpZiAoY2ggPT0gUkJSQUNFWzBdKSB7CisgICAgICB0eXBlID0gVFR5cGUuU1RPUDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZCA9IChzaG9ydClyZWFkSlNPTkludGVnZXIoKTsKKyAgICAgIHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgIHR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZShyZWFkSlNPTlN0cmluZyhmYWxzZSkuZ2V0KCkpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRGaWVsZCgiIiwgdHlwZSwgaWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OT2JqZWN0RW5kKCk7CisgIH0KKworICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgYnl0ZSBrZXlUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUocmVhZEpTT05TdHJpbmcoZmFsc2UpLmdldCgpKTsKKyAgICBieXRlIHZhbHVlVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHJlYWRKU09OU3RyaW5nKGZhbHNlKS5nZXQoKSk7CisgICAgaW50IHNpemUgPSAoaW50KXJlYWRKU09OSW50ZWdlcigpOworICAgIHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICByZXR1cm4gbmV3IFRNYXAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICByZWFkSlNPTkFycmF5RW5kKCk7CisgIH0KKworICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICBieXRlIGVsZW1UeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUocmVhZEpTT05TdHJpbmcoZmFsc2UpLmdldCgpKTsKKyAgICBpbnQgc2l6ZSA9IChpbnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgcmV0dXJuIG5ldyBUTGlzdChlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5RW5kKCk7CisgIH0KKworICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgYnl0ZSBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHJlYWRKU09OU3RyaW5nKGZhbHNlKS5nZXQoKSk7CisgICAgaW50IHNpemUgPSAoaW50KXJlYWRKU09OSW50ZWdlcigpOworICAgIHJldHVybiBuZXcgVFNldChlbGVtVHlwZSwgc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAocmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZSk7CisgIH0KKworICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gKGJ5dGUpcmVhZEpTT05JbnRlZ2VyKCk7CisgIH0KKworICBwdWJsaWMgc2hvcnQgcmVhZEkxNigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gKHNob3J0KXJlYWRKU09OSW50ZWdlcigpOworICB9CisKKyAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiAoaW50KXJlYWRKU09OSW50ZWdlcigpOworICB9CisKKyAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZEpTT05JbnRlZ2VyKCk7CisgIH0KKworICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRKU09ORG91YmxlKCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoIlVURi04Iik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgfQorICB9CisKKyAgcHVibGljIGJ5dGVbXSByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiByZWFkSlNPTkJhc2U2NCgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0LmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjY3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTGlzdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgbGlzdCBtZXRhZGF0YS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUTGlzdCB7CisgIHB1YmxpYyBUTGlzdCgpIHt9CisKKyAgcHVibGljIFRMaXN0KGJ5dGUgdCwgaW50IHMpIHsKKyAgICBlbGVtVHlwZSA9IHQ7CisgICAgc2l6ZSA9IHM7CisgIH0KKworICBwdWJsaWMgYnl0ZSBlbGVtVHlwZSA9IFRUeXBlLlNUT1A7CisgIHB1YmxpYyBpbnQgIHNpemUgICAgID0gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNYXAuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MThhMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1hcC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgbWFwIG1ldGFkYXRhLgorICoKKyAqLworcHVibGljIGNsYXNzIFRNYXAgeworICBwdWJsaWMgVE1hcCgpIHt9CisKKyAgcHVibGljIFRNYXAoYnl0ZSBrLCBieXRlIHYsIGludCBzKSB7CisgICAga2V5VHlwZSA9IGs7CisgICAgdmFsdWVUeXBlID0gdjsKKyAgICBzaXplID0gczsKKyAgfQorCisgIHB1YmxpYyBieXRlICBrZXlUeXBlICAgPSBUVHlwZS5TVE9QOworICBwdWJsaWMgYnl0ZSAgdmFsdWVUeXBlID0gVFR5cGUuU1RPUDsKKyAgcHVibGljIGludCAgIHNpemUgICAgICA9IDA7Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDhiMDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIHN0cnVjdCBtZXRhZGF0YS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUTWVzc2FnZSB7CisgIHB1YmxpYyBUTWVzc2FnZSgpIHt9CisKKyAgcHVibGljIFRNZXNzYWdlKFN0cmluZyBuLCBieXRlIHQsIGludCBzKSB7CisgICAgbmFtZSA9IG47CisgICAgdHlwZSA9IHQ7CisgICAgc2VxaWQgPSBzOworICB9CisKKyAgcHVibGljIFN0cmluZyBuYW1lID0gIiI7CisgIHB1YmxpYyBieXRlIHR5cGU7CisgIHB1YmxpYyBpbnQgc2VxaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZVR5cGUuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGVhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZVR5cGUuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKKy8qKgorICogTWVzc2FnZSB0eXBlIGNvbnN0YW50cyBpbiB0aGUgVGhyaWZ0IHByb3RvY29sLgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRNZXNzYWdlVHlwZSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDQUxMICA9IDE7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRVBMWSA9IDI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFWENFUFRJT04gPSAzOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBlNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorICogUHJvdG9jb2wgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sIHsKKworICAvKioKKyAgICogUHJldmVudCBkaXJlY3QgaW5zdGFudGlhdGlvbgorICAgKi8KKyAgcHJpdmF0ZSBUUHJvdG9jb2woKSB7fQorCisgIC8qKgorICAgKiBUcmFuc3BvcnQKKyAgICovCisgIHByb3RlY3RlZCBUVHJhbnNwb3J0IHRyYW5zXzsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IKKyAgICovCisgIHByb3RlY3RlZCBUUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgeworICAgIHRyYW5zXyA9IHRyYW5zOworICB9CisKKyAgLyoqCisgICAqIFRyYW5zcG9ydCBhY2Nlc3NvcgorICAgKi8KKyAgcHVibGljIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KCkgeworICAgIHJldHVybiB0cmFuc187CisgIH0KKworICAvKioKKyAgICogV3JpdGluZyBtZXRob2RzLgorICAgKi8KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woQm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICB3cml0ZUJvb2woYi5ib29sZWFuVmFsdWUoKSk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoQnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICB3cml0ZUJ5dGUoYi5ieXRlVmFsdWUoKSk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KFNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgd3JpdGVJMTYoaTE2LnNob3J0VmFsdWUoKSk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgdm9pZCB3cml0ZUkzMihJbnRlZ2VyIGkzMikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgd3JpdGVJMzIoaTMyLmludFZhbHVlKCkpOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KExvbmcgaTY0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICB3cml0ZUk2NChpNjQubG9uZ1ZhbHVlKCkpOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoRG91YmxlIGQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHdyaXRlRG91YmxlKGQuZG91YmxlVmFsdWUoKSk7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJpbmFyeShieXRlW10gYmluKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogUmVhZGluZyBtZXRob2RzLgorICAgKi8KKworICBwdWJsaWMgYWJzdHJhY3QgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVhZFN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWFkTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCBUU2V0IHJlYWRTZXRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBURXhjZXB0aW9uOworCisgIHB1YmxpYyBhYnN0cmFjdCBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IHNob3J0IHJlYWRJMTYoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICBwdWJsaWMgYWJzdHJhY3QgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb247CisKKyAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4ODE1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKy8qKgorICogUHJvdG9jb2wgZXhjZXB0aW9ucy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKKworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVfU0laRSA9IDI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfTElNSVQgPSAzOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQURfVkVSU0lPTiA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisKKyAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CisKKyAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSkgeworICAgIHN1cGVyKCk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihjYXVzZSk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihjYXVzZSk7CisgIH0KKworICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KKworICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIHR5cGVfID0gdHlwZTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICByZXR1cm4gdHlwZV87CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYTUwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorICogRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGNvbnN0cnVjdGluZyBwcm90b2NvbCBpbnN0YW5jZXMuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkgeworICBwdWJsaWMgVFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjEwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIHByb3RvY29sIGRhdGEKKyAqIHN0cmVhbXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgVFByb3RvY29sVXRpbCB7CisKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIHJlY3Vyc2l2ZSBkZXB0aCB0aGUgc2tpcCgpIGZ1bmN0aW9uIHdpbGwgdHJhdmVyc2UgYmVmb3JlCisgICAqIHRocm93aW5nIGEgVEV4Y2VwdGlvbi4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGludCBtYXhTa2lwRGVwdGggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHJlY3Vyc2l2ZSBkZXB0aCB0aGF0IHRoZSBza2lwIGZ1bmN0aW9uIHdpbGwKKyAgICogdHJhdmVyc2UgYmVmb3JlIHRocm93aW5nIGEgVEV4Y2VwdGlvbi4gIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZywgc28KKyAgICogYW55IGNhbGwgdG8gc2tpcCBpbiB0aGlzIEpWTSB3aWxsIGVuZm9yY2UgdGhpcyB2YWx1ZS4KKyAgICoKKyAgICogQHBhcmFtIGRlcHRoICB0aGUgbWF4aW11bSByZWN1cnNpdmUgZGVwdGguICBBIHZhbHVlIG9mIDIgd291bGQgYWxsb3cKKyAgICogICAgdGhlIHNraXAgZnVuY3Rpb24gdG8gc2tpcCBhIHN0cnVjdHVyZSBvciBjb2xsZWN0aW9uIHdpdGggYmFzaWMgY2hpbGRyZW4sCisgICAqICAgIGJ1dCBpdCB3b3VsZCBub3QgcGVybWl0IHNraXBwaW5nIGEgc3RydWN0IHRoYXQgaGFkIGEgZmllbGQgY29udGFpbmluZworICAgKiAgICBhIGNoaWxkIHN0cnVjdC4gIEEgdmFsdWUgb2YgMSB3b3VsZCBvbmx5IGFsbG93IHNraXBwaW5nIG9mIHNpbXBsZQorICAgKiAgICB0eXBlcyBhbmQgZW1wdHkgc3RydWN0cy9jb2xsZWN0aW9ucy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNYXhTa2lwRGVwdGgoaW50IGRlcHRoKSB7CisgICAgbWF4U2tpcERlcHRoID0gZGVwdGg7CisgIH0KKworICAvKioKKyAgICogU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtIHByb3QgIHRoZSBwcm90b2NvbCBvYmplY3QgdG8gcmVhZCBmcm9tCisgICAqIEBwYXJhbSB0eXBlICB0aGUgbmV4dCB2YWx1ZSB3aWxsIGJlIGludGVwcmV0ZWQgYXMgdGhpcyBUVHlwZSB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwKFRQcm90b2NvbCBwcm90LCBieXRlIHR5cGUpCisgICAgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHNraXAocHJvdCwgdHlwZSwgbWF4U2tpcERlcHRoKTsKKyAgfQorCisgIC8qKgorICAgKiBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gcHJvdCAgdGhlIHByb3RvY29sIG9iamVjdCB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgorICAgKiBAcGFyYW0gbWF4RGVwdGggIHRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IHNraXAgY29tcGxleCBvYmplY3RzIHRvIHRoaXMKKyAgICogICByZWN1cnNpdmUgZGVwdGgsIHRvIHByZXZlbnQgSmF2YSBzdGFjayBvdmVyZmxvdy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwKFRQcm90b2NvbCBwcm90LCBieXRlIHR5cGUsIGludCBtYXhEZXB0aCkKKyAgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGlmIChtYXhEZXB0aCA8PSAwKSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTWF4aW11bSBza2lwIGRlcHRoIGV4Y2VlZGVkIik7CisgICAgfQorICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgIHsKKyAgICAgICAgcHJvdC5yZWFkQm9vbCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICB7CisgICAgICAgIHByb3QucmVhZEJ5dGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICB7CisgICAgICAgIHByb3QucmVhZEkxNigpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgIHsKKyAgICAgICAgcHJvdC5yZWFkSTMyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgeworICAgICAgICBwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICB7CisgICAgICAgIHByb3QucmVhZERvdWJsZSgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgIHsKKyAgICAgICAgcHJvdC5yZWFkQmluYXJ5KCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgeworICAgICAgICBwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IHByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgc2tpcChwcm90LCBmaWVsZC50eXBlLCBtYXhEZXB0aCAtIDEpOworICAgICAgICAgIHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgeworICAgICAgICBUTWFwIG1hcCA9IHByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLnNpemU7IGkrKykgeworICAgICAgICAgIHNraXAocHJvdCwgbWFwLmtleVR5cGUsIG1heERlcHRoIC0gMSk7CisgICAgICAgICAgc2tpcChwcm90LCBtYXAudmFsdWVUeXBlLCBtYXhEZXB0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZE1hcEVuZCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgIHsKKyAgICAgICAgVFNldCBzZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldC5zaXplOyBpKyspIHsKKyAgICAgICAgICBza2lwKHByb3QsIHNldC5lbGVtVHlwZSwgbWF4RGVwdGggLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBUVHlwZS5MSVNUOgorICAgICAgeworICAgICAgICBUTGlzdCBsaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplOyBpKyspIHsKKyAgICAgICAgICBza2lwKHByb3QsIGxpc3QuZWxlbVR5cGUsIG1heERlcHRoIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2V0LmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlOWIxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIHNldCBtZXRhZGF0YS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUU2V0IHsKKyAgcHVibGljIFRTZXQoKSB7fQorCisgIHB1YmxpYyBUU2V0KGJ5dGUgdCwgaW50IHMpIHsKKyAgICBlbGVtVHlwZSA9IHQ7CisgICAgc2l6ZSA9IHM7CisgIH0KKworICBwdWJsaWMgYnl0ZSBlbGVtVHlwZSA9IFRUeXBlLlNUT1A7CisgIHB1YmxpYyBpbnQgIHNpemUgICAgID0gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTdHJ1Y3QuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTdHJ1Y3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNiYmNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFN0cnVjdC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgc3RydWN0IG1ldGFkYXRhLgorICoKKyAqLworcHVibGljIGNsYXNzIFRTdHJ1Y3QgeworICBwdWJsaWMgVFN0cnVjdCgpIHt9CisKKyAgcHVibGljIFRTdHJ1Y3QoU3RyaW5nIG4pIHsKKyAgICBuYW1lID0gbjsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgbmFtZSA9ICIiOworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkYzNjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RUeXBlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCisvKioKKyAqIFR5cGUgY29uc3RhbnRzIGluIHRoZSBUaHJpZnQgcHJvdG9jb2wuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVFR5cGUgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RPUCAgID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFZPSUQgICA9IDE7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBCT09MICAgPSAyOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQllURSAgID0gMzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIERPVUJMRSA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBJMTYgICAgPSA2OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgSTMyICAgID0gODsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEk2NCAgICA9IDEwOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RSSU5HID0gMTE7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVFJVQ1QgPSAxMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1BUCAgICA9IDEzOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VUICAgID0gMTQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMSVNUICAgPSAxNTsKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Mzc0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CisKKy8qKgorICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVG8gYmUgY29tbWVudGVkIHNvb24hCisgKgorICovCitwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgeworCisgIC8qKgorICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgKi8KKyAgcHJpdmF0ZSBUVHJhbnNwb3J0IHRyYW5zcG9ydF8gPSBudWxsOworCisgIC8qKgorICAgKiBCdWZmZXIgZm9yIG91dHB1dAorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHdyaXRlQnVmZmVyXyA9CisgICAgbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAyNCk7CisKKyAgLyoqCisgICAqIEJ1ZmZlciBmb3IgaW5wdXQKKyAgICovCisgIHByaXZhdGUgQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVhZEJ1ZmZlcl8gPSBudWxsOworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWJsaWMgRmFjdG9yeSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCBiYXNlKSB7CisgICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQoYmFzZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHdyYXBzIGFyb3VuZCBhbm90aGVyIHRyYW5wc29ydAorICAgKi8KKyAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OworICB9CisKKyAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cmFuc3BvcnRfLm9wZW4oKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW4oKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKHJlYWRCdWZmZXJfICE9IG51bGwpIHsKKyAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgaWYgKGdvdCA+IDApIHsKKyAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQorICAgIHJlYWRGcmFtZSgpOworCisgICAgcmV0dXJuIHJlYWRCdWZmZXJfLnJlYWQoYnVmLCBvZmYsIGxlbik7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZEZyYW1lKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlWzRdOworICAgIHRyYW5zcG9ydF8ucmVhZEFsbChpMzJyZCwgMCwgNCk7CisgICAgaW50IHNpemUgPQorICAgICAgKChpMzJyZFswXSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgICAoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICgoaTMycmRbMl0gJiAweGZmKSA8PCAgOCkgfAorICAgICAgKChpMzJyZFszXSAmIDB4ZmYpKTsKKworICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgdHJhbnNwb3J0Xy5yZWFkQWxsKGJ1ZmYsIDAsIHNpemUpOworICAgIHJlYWRCdWZmZXJfID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmYpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHdyaXRlQnVmZmVyXy53cml0ZShidWYsIG9mZiwgbGVuKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGJ5dGVbXSBidWYgPSB3cml0ZUJ1ZmZlcl8uZ2V0KCk7CisgICAgaW50IGxlbiA9IHdyaXRlQnVmZmVyXy5sZW4oKTsKKyAgICB3cml0ZUJ1ZmZlcl8ucmVzZXQoKTsKKworICAgIGJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKKyAgICBpMzJvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChsZW4gPj4gMjQpKTsKKyAgICBpMzJvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChsZW4gPj4gMTYpKTsKKyAgICBpMzJvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChsZW4gPj4gOCkpOworICAgIGkzMm91dFszXSA9IChieXRlKSgweGZmICYgKGxlbikpOworICAgIHRyYW5zcG9ydF8ud3JpdGUoaTMyb3V0LCAwLCA0KTsKKyAgICB0cmFuc3BvcnRfLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICB0cmFuc3BvcnRfLmZsdXNoKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmZmJhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmlvLkNvbm5lY3RvcjsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24uaW8uSHR0cENvbm5lY3Rpb247CisKKy8qKgorICogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFVzZWQgZm9yIHdvcmtpbmcgd2l0aCBhCisgKiBUaHJpZnQgd2ViIHNlcnZpY2VzIGltcGxlbWVudGF0aW9uLgorICoKKyAqLworcHVibGljIGNsYXNzIFRIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgdXJsXyA9IG51bGw7CisKKyAgcHJpdmF0ZSBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVxdWVzdEJ1ZmZlcl8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKyAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbV8gPSBudWxsOworCisgIHByaXZhdGUgSHR0cENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7CisKKyAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXRfID0gMDsKKworICBwcml2YXRlIGludCByZWFkVGltZW91dF8gPSAwOworCisgIHByaXZhdGUgSGFzaHRhYmxlIGN1c3RvbUhlYWRlcnNfID0gbnVsbDsKKworICBwdWJsaWMgVEh0dHBDbGllbnQoU3RyaW5nIHVybCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHVybF8gPSB1cmw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0VGltZW91dChpbnQgdGltZW91dCkgeworICAgIGNvbm5lY3RUaW1lb3V0XyA9IHRpbWVvdXQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRSZWFkVGltZW91dChpbnQgdGltZW91dCkgeworICAgIHJlYWRUaW1lb3V0XyA9IHRpbWVvdXQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDdXN0b21IZWFkZXJzKEhhc2h0YWJsZSBoZWFkZXJzKSB7CisgICAgY3VzdG9tSGVhZGVyc18gPSBoZWFkZXJzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q3VzdG9tSGVhZGVyKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgIGlmIChjdXN0b21IZWFkZXJzXyA9PSBudWxsKSB7CisgICAgICBjdXN0b21IZWFkZXJzXyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICB9CisgICAgY3VzdG9tSGVhZGVyc18ucHV0KGtleSwgdmFsdWUpOworICB9CisKKyAgcHVibGljIHZvaWQgb3BlbigpIHt9CisKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKG51bGwgIT0gaW5wdXRTdHJlYW1fKSB7CisgICAgICB0cnkgeworICAgICAgICBpbnB1dFN0cmVhbV8uY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgfQorICAgICAgaW5wdXRTdHJlYW1fID0gbnVsbDsKKyAgICB9CisKKyAgICBpZiAoY29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIH0KKyAgICAgIGNvbm5lY3Rpb24gPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKGlucHV0U3RyZWFtXyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVzcG9uc2UgYnVmZmVyIGlzIGVtcHR5LCBubyByZXF1ZXN0LiIpOworICAgIH0KKyAgICB0cnkgeworICAgICAgaW50IHJldCA9IGlucHV0U3RyZWFtXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXQ7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb3gpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICByZXF1ZXN0QnVmZmVyXy53cml0ZShidWYsIG9mZiwgbGVuKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgLy8gRXh0cmFjdCByZXF1ZXN0IGFuZCByZXNldCBidWZmZXIKKyAgICBieXRlW10gZGF0YSA9IHJlcXVlc3RCdWZmZXJfLnRvQnl0ZUFycmF5KCk7CisgICAgcmVxdWVzdEJ1ZmZlcl8ucmVzZXQoKTsKKworICAgIHRyeSB7CisgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvbiBvYmplY3QKKyAgICAgIGNvbm5lY3Rpb24gPSAoSHR0cENvbm5lY3Rpb24pQ29ubmVjdG9yLm9wZW4odXJsXyk7CisgIAorICAgICAgLy8gTWFrZSB0aGUgcmVxdWVzdAorICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7CisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7CisgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiVXNlci1BZ2VudCIsICJKYXZhTUUvVEh0dHBDbGllbnQiKTsKKworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbm5lY3Rpb24iLCAiS2VlcC1BbGl2ZSIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIktlZXAtQWxpdmUiLCAiNTAwMCIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkh0dHAtdmVyc2lvbiIsICJIVFRQLzEuMSIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNhY2hlLUNvbnRyb2wiLCAibm8tdHJhbnNmb3JtIik7CisKKyAgICAgIGlmIChjdXN0b21IZWFkZXJzXyAhPSBudWxsKSB7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGN1c3RvbUhlYWRlcnNfLmtleXMoKSA7IGUuaGFzTW9yZUVsZW1lbnRzKCkgOykgeworICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWN1c3RvbUhlYWRlcnNfLmdldChrZXkpOworICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgICB9CisgIAorICAgICAgT3V0cHV0U3RyZWFtIG9zID0gY29ubmVjdGlvbi5vcGVuT3V0cHV0U3RyZWFtKCk7CisgICAgICBvcy53cml0ZShkYXRhKTsKKyAgICAgIG9zLmNsb3NlKCk7CisKKyAgICAgIGludCByZXNwb25zZUNvZGUgPSBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSBIdHRwQ29ubmVjdGlvbi5IVFRQX09LKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIVFRQIFJlc3BvbnNlIGNvZGU6ICIgKyByZXNwb25zZUNvZGUpOworICAgICAgfQorCisgICAgICAvLyBSZWFkIHRoZSByZXNwb25zZXMKKyAgICAgIGlucHV0U3RyZWFtXyA9IGNvbm5lY3Rpb24ub3BlbklucHV0U3RyZWFtKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW94LnRvU3RyaW5nKCkpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USU9TdHJlYW1UcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USU9TdHJlYW1UcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y3MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RJT1N0cmVhbVRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBiYXNlIHRyYW5zcG9ydC4gSXQgdGFrZXMgYW4gSW5wdXRTdHJlYW0KKyAqIGFuZCBhbiBPdXRwdXRTdHJlYW0gYW5kIHVzZXMgdGhvc2UgdG8gcGVyZm9ybSBhbGwgdHJhbnNwb3J0IG9wZXJhdGlvbnMuCisgKiBUaGlzIGFsbG93cyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFsbCB0aGUgbmljZSBjb25zdHJ1Y3RzIEphdmEgYWxyZWFkeQorICogaGFzIHRvIHByb3ZpZGUgYSB2YXJpZXR5IG9mIHR5cGVzIG9mIHN0cmVhbXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgVElPU3RyZWFtVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKworICAvKiogVW5kZXJseWluZyBpbnB1dFN0cmVhbSAqLworICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1fID0gbnVsbDsKKworICAvKiogVW5kZXJseWluZyBvdXRwdXRTdHJlYW0gKi8KKyAgcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW1fID0gbnVsbDsKKworICAvKioKKyAgICogU3ViY2xhc3NlcyBjYW4gaW52b2tlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCB0aGVuIGFzc2lnbiB0aGUgaW5wdXQKKyAgICogc3RyZWFtcyBpbiB0aGUgb3BlbiBtZXRob2QuCisgICAqLworICBwcm90ZWN0ZWQgVElPU3RyZWFtVHJhbnNwb3J0KCkge30KKworICAvKioKKyAgICogSW5wdXQgc3RyZWFtIGNvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gaXMgSW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQorICAgKi8KKyAgcHVibGljIFRJT1N0cmVhbVRyYW5zcG9ydChJbnB1dFN0cmVhbSBpcykgeworICAgIGlucHV0U3RyZWFtXyA9IGlzOworICB9CisKKyAgLyoqCisgICAqIE91dHB1dCBzdHJlYW0gY29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBvcyBPdXRwdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQorICAgKi8KKyAgcHVibGljIFRJT1N0cmVhbVRyYW5zcG9ydChPdXRwdXRTdHJlYW0gb3MpIHsKKyAgICBvdXRwdXRTdHJlYW1fID0gb3M7CisgIH0KKworICAvKioKKyAgICogVHdvLXdheSBzdHJlYW0gY29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBpcyBJbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAqIEBwYXJhbSBvcyBPdXRwdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQorICAgKi8KKyAgcHVibGljIFRJT1N0cmVhbVRyYW5zcG9ydChJbnB1dFN0cmVhbSBpcywgT3V0cHV0U3RyZWFtIG9zKSB7CisgICAgaW5wdXRTdHJlYW1fID0gaXM7CisgICAgb3V0cHV0U3RyZWFtXyA9IG9zOworICB9CisKKyAgLyoqCisgICAqIFRoZSBzdHJlYW1zIG11c3QgYWxyZWFkeSBiZSBvcGVuIGF0IGNvbnN0cnVjdGlvbiB0aW1lLCBzbyB0aGlzIHNob3VsZAorICAgKiBhbHdheXMgcmV0dXJuIHRydWUuCisgICAqCisgICAqIEByZXR1cm4gdHJ1ZQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoZSBzdHJlYW1zIG11c3QgYWxyZWFkeSBiZSBvcGVuLiBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisgICAqLworICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KKworICAvKioKKyAgICogQ2xvc2VzIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKyAgICovCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIGlmIChpbnB1dFN0cmVhbV8gIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaW5wdXRTdHJlYW1fLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIH0KKyAgICAgIGlucHV0U3RyZWFtXyA9IG51bGw7CisgICAgfQorICAgIGlmIChvdXRwdXRTdHJlYW1fICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIG91dHB1dFN0cmVhbV8uY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgfQorICAgICAgb3V0cHV0U3RyZWFtXyA9IG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtIGlmIG5vdCBudWxsLgorICAgKi8KKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoaW5wdXRTdHJlYW1fID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRTdHJlYW0iKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBpbnB1dFN0cmVhbV8ucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgaW94KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaWYgbm90IG51bGwuCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKG91dHB1dFN0cmVhbV8gPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkNhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dFN0cmVhbSIpOworICAgIH0KKyAgICB0cnkgeworICAgICAgb3V0cHV0U3RyZWFtXy53cml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgaW94KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmx1c2hlcyB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgorICAgKi8KKyAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKG91dHB1dFN0cmVhbV8gPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIkNhbm5vdCBmbHVzaCBudWxsIG91dHB1dFN0cmVhbSIpOworICAgIH0KKyAgICB0cnkgeworICAgICAgb3V0cHV0U3RyZWFtXy5mbHVzaCgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCBpb3gpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlMWFiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCisvKioKKyAqIE1lbW9yeSBidWZmZXItYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICovCitwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQgeworICAvKioKKyAgICogQ3JlYXRlIGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgYnVmZmVyIHNpemUgb2YgPGk+c2l6ZTwvaT4uIFRoZQorICAgKiBpbnRlcm5hbCBidWZmZXIgd2lsbCBncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICAgKiBiZWluZyB3cml0dGVuIHRvIGl0LgorICAgKi8KKyAgcHVibGljIFRNZW1vcnlCdWZmZXIoaW50IHNpemUpIHsKKyAgICBhcnJfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oc2l6ZSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBvcGVuKCkgeworICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgfQorCisgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgYnl0ZVtdIHNyYyA9IGFycl8uZ2V0KCk7CisgICAgaW50IGFtdFRvUmVhZCA9IChsZW4gPiBhcnJfLmxlbigpIC0gcG9zXyA/IGFycl8ubGVuKCkgLSBwb3NfIDogbGVuKTsKKyAgICBpZiAoYW10VG9SZWFkID4gMCkgeworICAgICAgU3lzdGVtLmFycmF5Y29weShzcmMsIHBvc18sIGJ1Ziwgb2ZmLCBhbXRUb1JlYWQpOworICAgICAgcG9zXyArPSBhbXRUb1JlYWQ7CisgICAgfQorICAgIHJldHVybiBhbXRUb1JlYWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgYXJyXy53cml0ZShidWYsIG9mZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBPdXRwdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGFzIGEgU3RyaW5nLCB1c2luZyB0aGUgc3VwcGxpZWQKKyAgICogZW5jb2RpbmcKKyAgICogCisgICAqIEBwYXJhbSBlbmMgdGhlIGVuY29kaW5nIHRvIHVzZQorICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBhIFN0cmluZworICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgZW5jKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGFycl8udG9TdHJpbmcoZW5jKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgaW5zcGVjdCgpIHsKKyAgICBTdHJpbmcgYnVmID0gIiI7CisgICAgYnl0ZVtdIGJ5dGVzID0gYXJyXy50b0J5dGVBcnJheSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGJ1ZiArPSAocG9zXyA9PSBpID8gIj09PiIgOiAiIikgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGJ5dGVzW2ldICYgMHhmZikgKyAiICI7CisgICAgfQorICAgIHJldHVybiBidWY7CisgIH0KKworICAvLyBUaGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlcgorICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyXzsKKworICAvLyBQb3NpdGlvbiB0byByZWFkIG5leHQgYnl0ZSBmcm9tCisgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICBwb3NfOworCisgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgeworICAgIHJldHVybiBhcnJfLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyBieXRlW10gZ2V0QXJyYXkoKSB7CisgICAgcmV0dXJuIGFycl8uZ2V0KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzA0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisvKioKKyAqIEdlbmVyaWMgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIEkvTyBsYXllci4gVGhpcyBpcyBiYXNpY2FsbHkgYSB0aGluCisgKiB3cmFwcGVyIGFyb3VuZCB0aGUgY29tYmluZWQgZnVuY3Rpb25hbGl0eSBvZiBKYXZhIGlucHV0L291dHB1dCBzdHJlYW1zLgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgeworCisgIC8qKgorICAgKiBRdWVyaWVzIHdoZXRoZXIgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgKgorICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNPcGVuKCk7CisKKyAgLyoqCisgICAqIElzIHRoZXJlIG1vcmUgZGF0YSB0byBiZSByZWFkPworICAgKgorICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlbW90ZSBzaWRlIGlzIHN0aWxsIGFsaXZlIGFuZCBmZWVkaW5nIHVzCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBwZWVrKCkgeworICAgIHJldHVybiBpc09wZW4oKTsKKyAgfQorCisgIC8qKgorICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcuCisgICAqCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGUgdHJhbnNwb3J0IGNvdWxkIG5vdCBiZSBvcGVuZWQKKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9wZW4oKQorICAgIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uOworCisgIC8qKgorICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCk7CisKKyAgLyoqCisgICAqIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBpbnRvIGJ1ZmZlciBidWYsIHN0YXJ0aW5nIGF0dCBvZmZzZXQgb2ZmLgorICAgKgorICAgKiBAcGFyYW0gYnVmIEFycmF5IHRvIHJlYWQgaW50bworICAgKiBAcGFyYW0gb2ZmIEluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgYXQKKyAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgICAqLworICBwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBsZW4gYnl0ZXMgYXJlIGFjdHVhbGx5IHJlYWQgb2ZmIHRoZSB0cmFuc3BvcnQuCisgICAqCisgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAorICAgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGVuCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgICAqLworICBwdWJsaWMgaW50IHJlYWRBbGwoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaW50IGdvdCA9IDA7CisgICAgaW50IHJldCA9IDA7CisgICAgd2hpbGUgKGdvdCA8IGxlbikgeworICAgICAgcmV0ID0gcmVhZChidWYsIG9mZitnb3QsIGxlbi1nb3QpOworICAgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4gVHJpZWQgdG8gcmVhZCAiICsgbGVuICsgIiBieXRlcywgYnV0IG9ubHkgZ290ICIgKyBnb3QgKyAiIGJ5dGVzLiIpOworICAgICAgfQorICAgICAgZ290ICs9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGdvdDsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZXMgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0CisgICAqCisgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgZGF0YQorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHdyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIHVwIHRvIGxlbiBieXRlcyBmcm9tIHRoZSBidWZmZXIuCisgICAqCisgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyBmcm9tCisgICAqIEBwYXJhbSBsZW4gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogRmx1c2ggYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSB0cmFuc3BvcnQgYnVmZmVyLgorICAgKgorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgb3V0IGRhdGEuCisgICAqLworICBwdWJsaWMgdm9pZCBmbHVzaCgpCisgICAgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOGYzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCisvKioKKyAqIFRyYW5zcG9ydCBleGNlcHRpb25zLgorICoKKyAqLworcHVibGljIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX09QRU4gPSAxOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTFJFQURZX09QRU4gPSAyOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FRF9PVVQgPSAzOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfRklMRSA9IDQ7CisKKyAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CisKKyAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oKSB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKGludCB0eXBlKSB7CisgICAgc3VwZXIoKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oaW50IHR5cGUsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihjYXVzZSk7CisgIH0KKworICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICB9CisKKyAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oaW50IHR5cGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgdHlwZV8gPSB0eXBlOworICB9CisKKyAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgIHJldHVybiB0eXBlXzsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YjYwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisvKioKKyAqIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICogVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgKiBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAqIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgLyoqCisgICAqIFJldHVybiBhIHdyYXBwZWQgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgVHJhbnNwb3J0LgorICAgKgorICAgKiBAcGFyYW0gaW4gVGhlIGJhc2UgdHJhbnNwb3J0CisgICAqIEByZXR1cm5zIFdyYXBwZWQgVHJhbnNwb3J0CisgICAqLworICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykgeworICAgIHJldHVybiB0cmFuczsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvanMvR3J1bnRmaWxlLmpzIGIvbGliL2pzL0dydW50ZmlsZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJhMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL0dydW50ZmlsZS5qcwpAQCAtMCwwICsxLDI5MyBAQAorLy9UbyBidWlsZCBkaXN0L3RocmlmdC5qcywgZGlzdC90aHJpZnQubWluLmpzIGFuZCBkb2MvKgorLy9ydW4gZ3J1bnQgYXQgdGhlIGNvbW1hbmQgbGluZSBpbiB0aGlzIGRpcmVjdG9yeS4KKy8vUHJlcmVxdWlzaXRlczoKKy8vIE5vZGUgU2V0dXAgLSAgIG5vZGVqcy5vcmcKKy8vIEdydW50IFNldHVwIC0gIG5wbSBpbnN0YWxsICAvL3JlYWRzIHRoZSAuL3BhY2thZ2UuanNvbiBhbmQgaW5zdGFsbHMgcHJvamVjdCBkZXBlbmRlbmNpZXMKKy8vIFJ1biBncnVudCAtICAgIG5weCBncnVudCAgLy8gdXNlcyBwcm9qZWN0LWxvY2FsIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGdydW50IChmcm9tIHBhY2thZ2UuanNvbikKKworbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihncnVudCkgeworICAndXNlIHN0cmljdCc7CisKKyAgZ3J1bnQuaW5pdENvbmZpZyh7CisgICAgcGtnOiBncnVudC5maWxlLnJlYWRKU09OKCdwYWNrYWdlLmpzb24nKSwKKyAgICBjb25jYXQ6IHsKKyAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgc2VwYXJhdG9yOiAnOycKKyAgICAgIH0sCisgICAgICBkaXN0OiB7CisgICAgICAgIHNyYzogWydzcmMvKiovKi5qcyddLAorICAgICAgICBkZXN0OiAnZGlzdC88JT0gcGtnLm5hbWUgJT4uanMnCisgICAgICB9CisgICAgfSwKKyAgICBqc2RvYyA6IHsKKyAgICAgICAgZGlzdCA6IHsKKyAgICAgICAgICAgIHNyYzogWydzcmMvKi5qcycsICcuL1JFQURNRS5tZCddLAorICAgICAgICAgICAgb3B0aW9uczogeworICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogJ2RvYycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgdWdsaWZ5OiB7CisgICAgICBvcHRpb25zOiB7CisgICAgICAgIGJhbm5lcjogJy8qISA8JT0gcGtnLm5hbWUgJT4gPCU9IGdydW50LnRlbXBsYXRlLnRvZGF5KCJkZC1tbS15eXl5IikgJT4gKi9cbicKKyAgICAgIH0sCisgICAgICBkaXN0OiB7CisgICAgICAgIGZpbGVzOiB7CisgICAgICAgICAgJ2Rpc3QvPCU9IHBrZy5uYW1lICU+Lm1pbi5qcyc6IFsnPCU9IGNvbmNhdC5kaXN0LmRlc3QgJT4nXQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICBzaGVsbDogeworICAgICAgSW5zdGFsbFRocmlmdEpTOiB7CisgICAgICAgIGNvbW1hbmQ6ICdta2RpciAtcCB0ZXN0L2J1aWxkL2pzL2xpYjsgY3Agc3JjL3RocmlmdC5qcyB0ZXN0L2J1aWxkL2pzL3RocmlmdC5qcycKKyAgICAgIH0sCisgICAgICBJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwOiB7CisgICAgICAgIGNvbW1hbmQ6ICdjZCAuLi8uLjsgbnBtIGluc3RhbGwnCisgICAgICB9LAorICAgICAgSW5zdGFsbFRlc3RMaWJzOiB7CisgICAgICAgIGNvbW1hbmQ6ICdjZCB0ZXN0OyBhbnQgZG93bmxvYWRfanNsaWJzJworICAgICAgfSwKKyAgICAgIFRocmlmdEdlbjogeworICAgICAgICBjb21tYW5kOiBbCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLWpzJywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC0tb3V0IHRlc3QvZ2VuLWpzIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLS1vdXQgdGVzdC9nZW4tanMgLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtanF1ZXJ5JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmpxdWVyeSAtLW91dCB0ZXN0L2dlbi1qcy1qcXVlcnkgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcycsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpub2RlIC0tb3V0IHRlc3QvZ2VuLW5vZGVqcyAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtZXM2JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmVzNiAtLW91dCB0ZXN0L2dlbi1qcy1lczYgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcy1lczYnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6bm9kZSxlczYgLS1vdXQgLi90ZXN0L2dlbi1ub2RlanMtZXM2IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICBdLmpvaW4oJyAmJiAnKQorICAgICAgfSwKKyAgICAgIFRocmlmdEdlbkpROiB7CisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IC1nZW4ganM6bm9kZSAtbyB0ZXN0IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yOiB7CisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLW8gdGVzdCAuLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQnCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuRG91YmxlQ29uc3RhbnRzOiB7CisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLW8gdGVzdCAuLi8uLi90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0JworICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXI6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHAuanMiLAorICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXJFUzY6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHAuanMgLS1lczYiLAorICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXJfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBhc3luYzogdHJ1ZSwKKyAgICAgICAgICBleGVjT3B0aW9uczogeworICAgICAgICAgICAgY3dkOiAiLi90ZXN0IiwKKyAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vLi4vbm9kZV9tb2R1bGVzIn0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGNvbW1hbmQ6ICJub2RlIHNlcnZlcl9odHRwcy5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNl9UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHBzLmpzIC0tZXM2IiwKKyAgICAgIH0sCisgICAgfSwKKyAgICBxdW5pdDogeworICAgICAgVGhyaWZ0SlM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1ub2pxLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNKUTogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0V1M6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdHdzLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA5MS90ZXN0LW5vanEuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIFRocmlmdEpTSlFfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA5MS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRXU19UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3R3cy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0RGVlcENvbnN0cnVjdG9yOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIFRocmlmdFdTRVM2OiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3QtZXM2Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICBqc2hpbnQ6IHsKKyAgICAgIC8vIFRoZSBtYWluIHRocmlmdCBsaWJyYXJ5IGZpbGUuIG5vdCBlczYgeWV0IDooCisgICAgICBsaWI6IHsKKyAgICAgICAgc3JjOiBbJ3NyYy8qKi8qLmpzJ10sCisgICAgICB9LAorICAgICAgLy8gVGhlIHRlc3QgZmlsZXMgdXNlIGVzNgorICAgICAgdGVzdDogeworICAgICAgICBzcmM6IFsnR3J1bnRmaWxlLmpzJywgJ3Rlc3QvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgZ2VuX2pzX2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLyouanMnLCAndGVzdC9nZW4tanMtanF1ZXJ5LyouanMnXSwKKyAgICAgIH0sCisgICAgICBnZW5fZXM2X2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLWVzNi8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBnZW5fbm9kZV9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgbm9kZTogdHJ1ZSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9ub2RlX2VzNl9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMtZXM2LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIG5vZGU6IHRydWUsCisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgfSk7CisKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1jb250cmliLXVnbGlmeScpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItanNoaW50Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1xdW5pdCcpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItY29uY2F0Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtanNkb2MnKTsKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1zaGVsbC1zcGF3bicpOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygnd2FpdCcsICdXYWl0IGp1c3Qgb25lIHNlY29uZCBmb3Igc2VydmVyIHRvIHN0YXJ0JywgZnVuY3Rpb24gKCkgeworICAgIHZhciBkb25lID0gdGhpcy5hc3luYygpOworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICBkb25lKHRydWUpOworICAgIH0sIDEwMDApOworICB9KTsKKworICBncnVudC5yZWdpc3RlclRhc2soJ2luc3RhbGxBbmRHZW5lcmF0ZScsIFsKKyAgICAnc2hlbGw6SW5zdGFsbFRocmlmdEpTJywgJ3NoZWxsOkluc3RhbGxUaHJpZnROb2RlSlNEZXAnLCAnc2hlbGw6VGhyaWZ0R2VuJywKKyAgICAnc2hlbGw6VGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yJywgJ3NoZWxsOlRocmlmdEdlbkRvdWJsZUNvbnN0YW50cycsCisgICAgJ3NoZWxsOkluc3RhbGxUZXN0TGlicycsCisgIF0pOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygndGVzdCcsIFsKKyAgICAnaW5zdGFsbEFuZEdlbmVyYXRlJywKKyAgICAnanNoaW50JywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcicsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyX1RMUycsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzYnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNl9UTFMnLAorICAgICd3YWl0JywKKyAgICAncXVuaXQ6VGhyaWZ0RGVlcENvbnN0cnVjdG9yJywKKyAgICAncXVuaXQ6VGhyaWZ0SlMnLCAncXVuaXQ6VGhyaWZ0SlNfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nJywKKyAgICAncXVuaXQ6VGhyaWZ0V1MnLAorICAgICdxdW5pdDpUaHJpZnRKU0pRJywgJ3F1bml0OlRocmlmdEpTSlFfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0V1NFUzYnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyOmtpbGwnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcl9UTFM6a2lsbCcsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzY6a2lsbCcsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2X1RMUzpraWxsJywKKyAgXSk7CisgIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsndGVzdCcsICdjb25jYXQnLCAndWdsaWZ5JywgJ2pzZG9jJ10pOworfTsKZGlmZiAtLWdpdCBhL2xpYi9qcy9NYWtlZmlsZS5hbSBiL2xpYi9qcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWEyMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCisjIFdlIGNhbGwgaW5zdGFsbCB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisjCitpZiBIQVZFX05QTQorU1VCRElSUyA9IHRlc3QKKworY2hlY2stbG9jYWw6IGFsbAorCSQoTlBNKSBpbnN0YWxsIHx8ICQoTlBNKSBpbnN0YWxsCisJJChOUE0pIGxpc3QKKwkuL25vZGVfbW9kdWxlcy8uYmluL2dydW50CitlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2pzL1JFQURNRSBiL2xpYi9qcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZmRjNDMuLjAwMDAwMDAKLS0tIGEvbGliL2pzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLVRocmlmdCBKYXZhc2NyaXB0IExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVXNpbmcgVGhyaWZ0IHdpdGggSmF2YXNjcmlwdAotPT09PT09PT09PT09PT09PT09PT09Ci0KLUFsbG93cyBqYXZhc2NyaXB0IGNsaWVudCBpbnRlcmZhY2VzIHRvIFRocmlmdCBzZXJ2aWNlcy4KLVRoaXMgaXMgZ2VhcmVkIGZvciB1c2UgaW4gYSB3ZWIgYnJvd3Nlci4KLQotVGhpcyBjbGllbnQgY2FuIG9ubHkgc3BlYWsgdGhlIEpTT04gUHJvdG9jb2wgYW5kIHRoZSBvbmx5IHN1cHBvcnRlZAotdHJhbnNwb3J0IGlzIEFKQVguCi0KLVRoZXJlIGlzIGEgdGVzdCBodHRwZCBzZXJ2aWNlIGluIHRoZSB0ZXN0IGRpciB0aGF0IHJlcXVpcmVzCi1odHRwOi8vaGMuYXBhY2hlLm9yZyB1bmRlciB0ZXN0IGRpcgotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotQSBKYXZhU2NyaXB0IGVuYWJsZWQgYnJvd3Nlci4gVGVzdGVkIHdpdGg6Ci0gKklFIDYsNyw4Ci0gKkZGIDIsMwotICpTYWZhcmkgMyAmIDQKZGlmZiAtLWdpdCBhL2xpYi9qcy9SRUFETUUubWQgYi9saWIvanMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTFlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTQwIEBACitUaHJpZnQgSmF2YXNjcmlwdCBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGJyb3dzZXIgYmFzZWQgQXBhY2hlIFRocmlmdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cworUlBDIGNsaWVudHMgdXNpbmcgdGhlIEpTT04gcHJvdG9jb2wgb3ZlciBIdHRwW3NdIHdpdGggWEhSCithbmQgV2ViU29ja2V0LgorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworR3J1bnQgQnVpbGQKKy0tLS0tLS0tLS0tLQorVGhpcyBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IEphdmFTY3JpcHQKK2xpYnJhcnkuIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgR3J1bnRmaWxlLmpzIGFuZCBhCitwYWNrYWdlLmpzb24uIE1hbnkgb2YgdGhlIGJ1aWxkIGFuZCB0ZXN0IHRvb2xzIHVzZWQgaGVyZQorcmVxdWlyZSBhIHJlY2VudCB2ZXJzaW9uIG9mIE5vZGUuanMgdG8gYmUgaW5zdGFsbGVkLiBUbyAKK2luc3RhbGwgdGhlIHN1cHBvcnQgZmlsZXMgZm9yIHRoZSBHcnVudCBidWlsZCB0b29sIGV4ZWN1dGUKK3RoZSBjb21tYW5kOgorCisgICAgbnBtIGluc3RhbGwKKyAgICAKK1RoaXMgcmVhZHMgdGhlIHBhY2thZ2UuanNvbiBhbmQgcHVsbHMgaW4gdGhlIGFwcHJvcHJpYXRlCitzb3VyY2VzIGZyb20gdGhlIGludGVybmV0LiBUbyBidWlsZCB0aGUgSmF2YVNjcmlwdCBicmFuY2gKK29mIEFwYWNoZSBUaHJpZnQgZXhlY3V0ZSB0aGUgY29tbWFuZDoKKworICAgIG5weCBncnVudAorICAgIAorVGhpcyBydW5zIHRoZSBncnVudCBidWlsZCB0b29sIChmcm9tIHdpdGhpbiBgLi9ub2RlX21vZHVsZXMvLmJpbi9gKSwKK2xpbnRpbmcgYWxsIG9mIHRoZSBzb3VyY2UgZmlsZXMsIHNldHRpbmcgdXAgYW5kIHJ1bm5pbmcgdGhlCit0ZXN0cywgY29uY2F0ZW5hdGluZyBhbmQgbWluaWZ5aW5nIHRoZSBtYWluIGxpYnJhcmllcyBhbmQKK2dlbmVyYXRpbmcgdGhlIGh0bWwgZG9jdW1lbnRhdGlvbi4KKworVHJlZQorLS0tLQorVGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcyBhcmUgcHJlc2VudCAoc29tZSBvbmx5IGFmdGVyIHRoZQorZ3J1bnQgYnVpbGQpOgorICAvc3JjICAtIFRoZSBKYXZhU2NyaXB0IEFwYWNoZSBUaHJpZnQgc291cmNlCisgIC9kb2MgIC0gSFRNTCBkb2N1bWVudGF0aW9uCisgIC9kaXN0IC0gRGlzdHJpYnV0aW9uIGZpbGVzICh0aHJpZnQuanMgYW5kIHRocmlmdC5taW4uanMpCisgIC90ZXN0IC0gVmFyaW91cyB0ZXN0cywgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gbG9vayBmb3IKKyAgICAgICAgICBleGFtcGxlIGNvZGUKKyAgL25vZGVfbW9kdWxlcyAtIEJ1aWxkIHN1cHBvcnQgZmlsZXMgaW5zdGFsbGVkIGJ5IG5wbQorCisKK0V4YW1wbGUgSmF2YVNjcmlwdCBDbGllbnQgYW5kIFNlcnZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbGlzdGluZyBiZWxvdyBkZW1vbnN0cmF0ZXMgYSBzaW1wbGUgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0CitUaHJpZnQgY2xpZW50IGFuZCBOb2RlLmpzIEphdmFTY3JpcHQgc2VydmVyIGZvciB0aGUgaGVsbG9fc3ZjIAorc2VydmljZS4gCisKKyMjIyBoZWxsby50aHJpZnQgLSBTZXJ2aWNlIElETCAKKyMjIyBidWlsZCB3aXRoOiAkIHRocmlmdCAtZ2VuIGpzIC1nZW4ganM6bm9kZSBoZWxsby50aHJpZnQKKyAgICBzZXJ2aWNlIGhlbGxvX3N2YyB7CisgICAgICBzdHJpbmcgZ2V0X21lc3NhZ2UoMTogc3RyaW5nIG5hbWUpCisgICAgfQorCisjIyMgaGVsbG8uaHRtbCAtIEJyb3dzZXIgQ2xpZW50CisgICAgPCFET0NUWVBFIGh0bWw+CisgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgICAgICAgPHRpdGxlPkhlbGxvIFRocmlmdDwvdGl0bGU+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgTmFtZTogPGlucHV0IHR5cGU9InRleHQiIGlkPSJuYW1lX2luIj4KKyAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImdldF9tc2ciIHZhbHVlPSJHZXQgTWVzc2FnZSIgPgorICAgICAgICA8ZGl2IGlkPSJvdXRwdXQiPjwvZGl2PgorICAKKyAgICAgICAgPHNjcmlwdCBzcmM9InRocmlmdC5qcyI+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvaGVsbG9fc3ZjLmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdD4KKyAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UWEhSVHJhbnNwb3J0KCIvaGVsbG8iKTsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHZhciBjbGllbnQgICAgPSBuZXcgaGVsbG9fc3ZjQ2xpZW50KHByb3RvY29sKTsKKyAgICAgICAgICAgIHZhciBuYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYW1lX2luIik7CisgICAgICAgICAgICB2YXIgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnZXRfbXNnIikKKyAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBjbGllbnQuZ2V0X21lc3NhZ2UobmFtZUVsZW1lbnQudmFsdWUsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0pOworICAgICAgICAgIH0pKCk7CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKworIyMjIGhlbGxvLmpzIC0gTm9kZSBTZXJ2ZXIKKyAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisgICAgdmFyIGhlbGxvX3N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9oZWxsb19zdmMuanMnKTsKKyAgICAKKyAgICB2YXIgaGVsbG9faGFuZGxlciA9IHsKKyAgICAgIGdldF9tZXNzYWdlOiBmdW5jdGlvbihuYW1lLCByZXN1bHQpIHsKKyAgICAgICAgdmFyIG1zZyA9ICJIZWxsbyAiICsgbmFtZSArICIhIjsKKyAgICAgICAgcmVzdWx0KG51bGwsIG1zZyk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHZhciBoZWxsb19zdmNfb3B0ID0geworICAgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICAgICAgcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorICAgICAgcHJvY2Vzc29yOiBoZWxsb19zdmMsCisgICAgICBoYW5kbGVyOiBoZWxsb19oYW5kbGVyCisgICAgfTsKKyAgICAKKyAgICB2YXIgc2VydmVyX29wdCA9IHsKKyAgICAgIHN0YXRpY0ZpbGVQYXRoOiAiLiIsCisgICAgICBzZXJ2aWNlczogeworICAgICAgICAiL2hlbGxvIjogaGVsbG9fc3ZjX29wdAorICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2YXIgc2VydmVyID0gVGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihzZXJ2ZXJfb3B0KTsKKyAgICB2YXIgcG9ydCA9IDkwOTk7CisgICAgc2VydmVyLmxpc3Rlbihwb3J0KTsKKyAgICBjb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworCisKK1R5cGVTY3JpcHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVHlwZVNjcmlwdCBkZWZpbml0aW9uIGZpbGVzIGNhbiBhbHNvIGJlIGdlbmVyYXRlZCBieSBydW5uaW5nOgorCisgICAgdGhyaWZ0IC0tZ2VuIGpzOnRzIGZpbGUudGhyaWZ0CisKZGlmZiAtLWdpdCBhL2xpYi9qcy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2pzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2pzL3BhY2thZ2UtbG9jay5qc29uIGIvbGliL2pzL3BhY2thZ2UtbG9jay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDgxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvcGFja2FnZS1sb2NrLmpzb24KQEAgLTAsMCArMSwzNzc3IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImxvY2tmaWxlVmVyc2lvbiI6IDEsCisgICJyZXF1aXJlcyI6IHRydWUsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImFiYnJldiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hYmJyZXYvLS9hYmJyZXYtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW5uZTkvSWlRL2h6SWhZNnBkRG5iQnR6N0RqUFRLclkwMFAvenZQU201cE9Ga2w2eHVHckduWG4vVnRUTk5mTnRBZlo5LzFSdGVoa3N6VTlxY1RpaTBRPT0iCisgICAgfSwKKyAgICAiYWdlbnQtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hZ2VudC1iYXNlLy0vYWdlbnQtYmFzZS00LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSlZ3WE1yOW5IWVRVWHNCRktVcWhKd3ZsY1lVL2JscmVPRVVraE5SMmVYWkl2d2QrYytvNVY0TWdEUEtXbk1TLzU2YXdOM1RSeklQK0tvUG4rcm9RdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNpZnkiOiAiXjUuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImFqdiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hanYvLS9hanYtNS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jN1h1eWorclpUNDlQNVFpczBHdFFpQmR5V1U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvIjogIl40LjYuMCIsCisgICAgICAgICJmYXN0LWRlZXAtZXF1YWwiOiAiXjEuMC4wIiwKKyAgICAgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6ICJeMC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYWxpZ24tdGV4dCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbGlnbi10ZXh0Ly0vYWxpZ24tdGV4dC0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUROa0tWaENUODEwS21TVnNJcmNHbERQNjBSYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIsCisgICAgICAgICJsb25nZXN0IjogIl4xLjAuMSIsCisgICAgICAgICJyZXBlYXQtc3RyaW5nIjogIl4xLjUuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13N002dGU0MkRZYmc1aWp3Um9ybjd5ZldWTjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0zLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVlQwWkk2a1pSZFRoOFl5SnczU01iWW0vdStOcWZzQXhFcFdPMFBmOXNxOC9lOTRXeHhPcFBLeDlGUjFGbHlDdE9WRE5PUSs4bnRscUZ4aVJjK3I1cUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLWNvbnZlcnQiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFyZ3BhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmdwYXJzZS8tL2FyZ3BhcnNlLTEuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbzVSb3k2dE5HNFNML0ZPa0NBTjZSemppYWtaUzI1UkxZRnJjTXR0SnFiZGQ4QldybkErZkd6NTdpTjVQYjA2cHZCR3ZsNWdRMEI0OGRKbHNsWHZvVGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAifjEuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQk9hU2IyWW9sVFZQUGRBVklEWXp1RmNwZml3PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImFyci1kaWZmIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci1kaWZmLy0vYXJyLWRpZmYtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xa1lRZFA2LzdISG40VkkxZGhveW1sM0h4U0E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyLWZsYXR0ZW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLWZsYXR0ZW4vLS9hcnItZmxhdHRlbi0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTDNoS1Y1Ui9wNW84MVI3TzAySUdud3BEbWtwNkU5ODJYaHRidXdTZTNPNHFPdE1NTXRvZGljQVNBMUNueTJVK2FDWGNOcG1sK200ZFBzdnNKM2phdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFyci11bmlvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItdW5pb24vLS9hcnItdW5pb24tMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00NXNKcnFuZStHYW84Z2JpaUs5amtadXVPY1E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktZWFjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS1lYWNoLy0vYXJyYXktZWFjaC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA1U3ZEQVdyRjFLRWJ1ZFRvZklSb0Z1Z3hFOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1maW5kLWluZGV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWZpbmQtaW5kZXgvLS9hcnJheS1maW5kLWluZGV4LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3dFS29TaCtGa3U5cHZseU93cVdvZXhCaDZFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LXNsaWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXNsaWNlLy0vYXJyYXktc2xpY2UtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUIxcU1EM1JCUDdPOG8wSDJLYnJYRHlCMEljY2VqTUYxNSs4N0x2bG9yMTJPTlBSSFA2Z1RqWE1Oa3QvZDNadU9HYkFlNjZoRm1hQ2ZFQ0kyNFVmcDZ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS11bmlxdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktdW5pcXVlLy0vYXJyYXktdW5pcXVlLTAuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUpTM1hVdkU5czFubnZNa1NwL1k5R3JpMUNnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzbjEiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNuMS8tL2FzbjEtMC4yLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWp4d3pRcExRalNtV1hnd2FDWkU5TnorZ2xBRzAxeUYxUW5XZ2JoR3dISTVBNkZSSUVZNklWcXRIaEllcEhxSTcva3lFeVFFYWdCQzVtQkVGbElZdmRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIn4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhc3NlcnQtcGx1cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3NlcnQtcGx1cy8tL2Fzc2VydC1wbHVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOFM0UFBGMTNzTEhOMlJScFF1VHBiQjVOMVNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzc2lnbi1zeW1ib2xzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2lnbi1zeW1ib2xzLy0vYXNzaWduLXN5bWJvbHMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XV1ovUWZyZFR5RE12Q3U1YTQxUGYzanNBMmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN0dwaHJsWklEQXc4c2tISlZoamlDSkw1WnlvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jLWxpbWl0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMtbGltaXRlci8tL2FzeW5jLWxpbWl0ZXItMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwL3VGbm9vT2lPK0wyMTFlWk9vU3l6cE9JVE1YeDFyQklUYXVZeWtHM0JSWVB1OGgwVWN4c1BOQjA0UlI1dm80VHl6MytheTE3dFI2SlZmOXF6WVdnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luY2tpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luY2tpdC8tL2FzeW5ja2l0LTAuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteDU3WmYzODB5NDhyb2J5WGtMekRaa2RMUzNrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhdG9iIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F0b2IvLS9hdG9iLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1XbTZ1a29hT0dKaS83M3AvY2wyR3ZMalRJNUpNMWsvTzE0aXNENzNZTUw4U3RySC83L2xSRmdtZzhuSUNaZ0QzYlpadmp3Q0d4dE1PRDN3V05BdThjZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXdzLXNpZ24yIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3cy1zaWduMi8tL2F3cy1zaWduMi0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRHNkpDVFNwV1I4dEwyK0cxK2FwOGJQK2RxZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiYXdzNCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hd3M0Ly0vYXdzNC0xLjguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUmVaeHZOSElPdjg4RmxUN3J4Y1hJSUMwZlB0NEtacVpiT2xpdnlXdFhMdDhFU3g4NHpkM2tNQzZpSzVqVmVTMnF0K2c3ZnRTN3llNGZpMDZYNXJ0UlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJiYWJ5bG9uIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFieWxvbi8tL2JhYnlsb24tNy4wLjAtYmV0YS4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVmcwQzlzL1JFWDYvV0lYTjM3VUtwdjVaaFJpNkE0cGpIbHBrRTM0KzgvYTZjMlcxUTY5Mm4zaG1jK1NaRzVsS1JuYUV4TFVieHRKMVNWVCtLYUNRL0E9PSIKKyAgICB9LAorICAgICJiYWxhbmNlZC1tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWxhbmNlZC1tYXRjaC8tL2JhbGFuY2VkLW1hdGNoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWJUUm1hc3I3a25lRms2Z0s0bk9SaTF4dDJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjExLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jhc2UvLS9iYXNlLTAuMTEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNVQ2UDR4UGdwcDBZREZ2U1d3RVo0Tm9FM2FNNFFCUVhEem1WYnJhQ2tGajh6SE0rbWJhOFN5cUI1RGJaV3lSN21ZSG82WTdCZFFvM01vQTRtMFRlUWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhY2hlLWJhc2UiOiAiXjEuMC4xIiwKKyAgICAgICAgImNsYXNzLXV0aWxzIjogIl4wLjMuNSIsCisgICAgICAgICJjb21wb25lbnQtZW1pdHRlciI6ICJeMS4yLjEiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiLAorICAgICAgICAibWl4aW4tZGVlcCI6ICJeMS4yLjAiLAorICAgICAgICAicGFzY2FsY2FzZSI6ICJeMC4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kcDY2cno5S1k2clRyNTZOTUV5YnZubS9zT1k9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImJjcnlwdC1wYmtkZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iY3J5cHQtcGJrZGYvLS9iY3J5cHQtcGJrZGYtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wREFkT0p0cVEvbTJmL1BLRWFQMlkzNDJEcDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInR3ZWV0bmFjbCI6ICJeMC4xNC4zIgorICAgICAgfQorICAgIH0sCisgICAgImJsdWViaXJkIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JsdWViaXJkLy0vYmx1ZWJpcmQtMy41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRoSFRXTUk3a014NXdoTVFudGw3VnI5QzZCdlYxMGxGWERBYXNucW5yTVloWFZDenprNklPOUZvMkw3NWpYSFQwN1dyT25nTDFXRFhPcCt5WVM5MVlnPT0iCisgICAgfSwKKyAgICAiYnJhY2UtZXhwYW5zaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icmFjZS1leHBhbnNpb24vLS9icmFjZS1leHBhbnNpb24tMS4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pQ3VQSERGZ3JIWDdIMnZFSS81eHB6MDd6U0hCMDBUcHVncWhtWXRWbU1PNjUxOG1DdVJNb09ZRmxkRUJsMGcxODd1Zm96ZGFIZ1dLY1lGYjYxcUdpQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFsYW5jZWQtbWF0Y2giOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1tYXAiOiAiMC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYnJhY2VzIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlcy8tL2JyYWNlcy0yLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYU5kYm5qOVA4UGpkWFU0eWJhV0xLMklGM2pjL0VvRFliQzdBYXpXNnRvM1RSc2ZYeHNjQzlVWE9CNWlEaUVRcmt5SWJXcDJTTFFkYTQrUUFhN25jM3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1mbGF0dGVuIjogIl4xLjEuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJmaWxsLXJhbmdlIjogIl40LjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiLAorICAgICAgICAicmVwZWF0LWVsZW1lbnQiOiAiXjEuMS4yIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInNuYXBkcmFnb24tbm9kZSI6ICJeMi4wLjEiLAorICAgICAgICAic3BsaXQtc3RyaW5nIjogIl4zLjAuMiIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYnJvd3NlcmlmeS16bGliIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXJpZnktemxpYi8tL2Jyb3dzZXJpZnktemxpYi0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXV6WDRwUm4yQU9ENmE0U0ZKQnlYblFGQit5MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYWtvIjogIn4wLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJidWZmZXItZnJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZnJvbS8tL2J1ZmZlci1mcm9tLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NUWNYRVViQ0t0RW83YmhxRXM2NTYwSHlkNFhhb3ZabE8vazlWM2hqVlVGL3p3VzdLQlZkU0s0Z0l0L2J6d1M5TWJSNXFvYitGNWp1c1pzYjBZUUsyQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLXNoaW1zIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1zaGltcy8tL2J1ZmZlci1zaGltcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Yak9NWE9JeGttdGg1TUNqRFIzN3dSS2kxRT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWlsdGluLW1vZHVsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVpbHRpbi1tb2R1bGVzLy0vYnVpbHRpbi1tb2R1bGVzLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnc4SGJGcHl3QzliWmFSOStVeGY0Nko0aVM4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhY2hlLWJhc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FjaGUtYmFzZS8tL2NhY2hlLWJhc2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFLY2RUbkZTV0FUZDUvR0NQUnhyMkNod0lKODVDZXlyRXlqUkhsS3hRNTZkNFhKTUd5bTB1QWlLbjB4YkxPR09sMyt5UnBPVGk0ODRkVkNFYzVBVXpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xsZWN0aW9uLXZpc2l0IjogIl4xLjAuMCIsCisgICAgICAgICJjb21wb25lbnQtZW1pdHRlciI6ICJeMS4yLjEiLAorICAgICAgICAiZ2V0LXZhbHVlIjogIl4yLjAuNiIsCisgICAgICAgICJoYXMtdmFsdWUiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJzZXQtdmFsdWUiOiAiXjIuMC4wIiwKKyAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIsCisgICAgICAgICJ1bmlvbi12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAidW5zZXQtdmFsdWUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mQjBXMW5taHUrV2NvQ3lzN1BzQkhpQWZXaDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FtZWxjYXNlLWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2Uta2V5cy8tL2NhbWVsY2FzZS1rZXlzLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUl2dXIvM3lnUmtGSHZvZGt5SVR5UnVQa3VjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMi4wLjAiLAorICAgICAgICAibWFwLW9iaiI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FzZWxlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nhc2VsZXNzLy0vY2FzZWxlc3MtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJnY0lmK0VBenlDWlVNSkJvbENEUmh4VWR3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjYXRoYXJzaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2F0aGFyc2lzLy0vY2F0aGFyc2lzLTAuOC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbU15SkRLWlMzUzd3NXdzM2tsTVEvNTZRL0lzPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiAifjAuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNlbnRlci1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jZW50ZXItYWxpZ24vLS9jZW50ZXItYWxpZ24tMC4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xZzB5WXB0dTZYSWdCQkhMMUVZY2tIdkN0NjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWxpZ24tdGV4dCI6ICJeMC4xLjMiLAorICAgICAgICAibGF6eS1jYWNoZSI6ICJeMS4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhbGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2JONmgxdjJmVEpTbVVYb1Mzbk1ROTJMYkRLOWJlNFRWKzZHK29tUWxHSkZkY1VYNWhlS2kxTFoxWW5STUlnd1RMRWozRTI0YlQ2dFluaTUwcmxDZlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogIl4zLjIuMSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjUuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNsYXNzLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsYXNzLXV0aWxzLy0vY2xhc3MtdXRpbHMtMC4zLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFPaFBhL0ZqN3M2VFk4SDhlc0d1NVFOcE1NUXh6NzloK3VyenJOWU42bW4rOUJueGxER2Y1UVorWGVDRHN4U2pQcXNTUjU2WE9aT0ptcGV1cm5MTWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInN0YXRpYy1leHRlbmQiOiAiXjAuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGkvLS9jbGktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Jb0YxTlBKTCtrbFF3MDFUTFVqc3ZHSWJqQlE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICIwLjEuMiIsCisgICAgICAgICJnbG9iIjogIl43LjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpdWkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpdWkvLS9jbGl1aS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVMwZFhZUCtBSmt4MkxEb1hHUU11a2NmK29ORT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjZW50ZXItYWxpZ24iOiAiXjAuMS4xIiwKKyAgICAgICAgInJpZ2h0LWFsaWduIjogIl4wLjEuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICIwLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJjbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jby8tL2NvLTQuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYnFhOTg5aFRybFRNdU9SNytndnorUU1mc1lRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJjb2ZmZWVzY3JpcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvZmZlZXNjcmlwdC8tL2NvZmZlZXNjcmlwdC0xLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS01NnFEQVpGKzlpR3pYWW81ODBqYzNSMjM0ejQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29sbGVjdGlvbi12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xsZWN0aW9uLXZpc2l0Ly0vY29sbGVjdGlvbi12aXNpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVM4QTNQQlpMd3lrYlRUYU1ncHp4cUFwWjNLQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgIm9iamVjdC12aXNpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItY29udmVydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1jb252ZXJ0Ly0vY29sb3ItY29udmVydC0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWZBVXRkK3ZGZEF0RlFjQzhDQ3lZdDFmWVd4U3FBaUsyY1NENnpEQjhOM2Nwc0VCQXZSeHA5ek9HZzZHL1NISEpZQVQ4OC9hei9JdURHQUxzTlZiR2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLW5hbWUiOiAiMS4xLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItbmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1uYW1lLy0vY29sb3ItbmFtZS0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA5QlZpOWljUXZlVjNVSXlqM1FJTWNwVHZDVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xvcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3JzLy0vY29sb3JzLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRm9wSEFYVnJhbjlSb1N6Z3lYdjZLTUNFN1dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbWJpbmVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21iaW5lZC1zdHJlYW0vLS9jb21iaW5lZC1zdHJlYW0tMS4wLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJyV2w5eTZ2T0IxeFlQWmNwWmRlM045ekRCeVhUb3NBZU1EbzRwMXd6bzZVTU9YNHZ1bUIrVFAxUlo3NnNmRTZNZDY4UTBOSlNyRS9nYmV6ZDRVbCt3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWxheWVkLXN0cmVhbSI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY29tcG9uZW50LWVtaXR0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29tcG9uZW50LWVtaXR0ZXIvLS9jb21wb25lbnQtZW1pdHRlci0xLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUUza1kxdGVDZy9mZmVtdDhXbVBoUU9hVUplWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25jYXQtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbmNhdC1tYXAvLS9jb25jYXQtbWFwLTAuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMktscjEzL1dqZmQ1T25NRGFqdWcxVUJkUjNzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LXN0cmVhbS8tL2NvbmNhdC1zdHJlYW0tMS42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTI3SEJnaEp4amladElrM1ljdm4vNGtiSmsvMXVadUpGZnVQRW5zNkxhRXZwdkcxZjBoVGVhOGxpbHJvdXlvOW1WYzJHV2RjRVo4T0xvR21TQURsckN3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWZmZXItZnJvbSI6ICJeMS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAiXjIuMC4zIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4yLjIiLAorICAgICAgICAidHlwZWRhcnJheSI6ICJeMC4wLjYiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImNvbnNvbGUtYnJvd3NlcmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25zb2xlLWJyb3dzZXJpZnkvLS9jb25zb2xlLWJyb3dzZXJpZnktMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04Q1FjUlhNS244WXlPeUJ0dnpqdHgwSFF1eEE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGF0ZS1ub3ciOiAiXjAuMS40IgorICAgICAgfQorICAgIH0sCisgICAgImNvcHktZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb3B5LWRlc2NyaXB0b3IvLS9jb3B5LWRlc2NyaXB0b3ItMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aMjl1czhPWmw4THVHc09wSlAxaEpIU1BWNDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29yZS11dGlsLWlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcmUtdXRpbC1pcy8tL2NvcmUtdXRpbC1pcy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRmMVVJZ3FpdkZxMWVxdHhRTWxBZFVVRHdhYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjcm9zcy1zcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jcm9zcy1zcGF3bi8tL2Nyb3NzLXNwYXduLTYuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lVFZMckJTdDdmamJEeWd6ODA1cE1uc3RJczJWVEJOa1JtMHF4WmQrTTdBNVhEZHhWUldPNU14R0JYWmhqWTRjcUxZTGR0ckdxUmY4bUJQbXp3U3BXUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibmljZS10cnkiOiAiXjEuMC40IiwKKyAgICAgICAgInBhdGgta2V5IjogIl4yLjAuMSIsCisgICAgICAgICJzZW12ZXIiOiAiXjUuNS4wIiwKKyAgICAgICAgInNoZWJhbmctY29tbWFuZCI6ICJeMS4yLjAiLAorICAgICAgICAid2hpY2giOiAiXjEuMi45IgorICAgICAgfQorICAgIH0sCisgICAgImN1cnJlbnRseS11bmhhbmRsZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3VycmVudGx5LXVuaGFuZGxlZC8tL2N1cnJlbnRseS11bmhhbmRsZWQtMC40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tSTN6UCtxeGtlOTVtbUUybmRkc0Y2MzVWK289IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktZmluZC1pbmRleCI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiY3ljbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3ljbGUvLS9jeWNsZS0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUllZ0xLK2hZRDVpMGFQTjVRd1ppc0ViRFN0ST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZGFzaGRhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE0LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Rhc2hkYXNoLy0vZGFzaGRhc2gtMS4xNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFR6NkQzeStMKzFkNGdNbXVOMVlFRFgyNHZBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGF0ZS1ub3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGF0ZS1ub3cvLS9kYXRlLW5vdy0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZ2UTUvVTFJU0sxMDVjeDl2dklBWnl1ZU5Gcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkYXRlZm9ybWF0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kYXRlZm9ybWF0Ly0vZGF0ZWZvcm1hdC0xLjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ueEpMWjFsTWszLzNCcE11U21Rc3lvMjcvdWs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXN0ZGluIjogIl40LjAuMSIsCisgICAgICAgICJtZW93IjogIl4zLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWJ1ZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTIuNi45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1iQzdFbHJkSmFKblBiQVArMUVvdFl2cVpzYjNlY2w1d2k2QmZpNkJKVFVjTm93cDZjdnNwZzBqWHpuUlRLRGptL0U3QWRnRkJWZUFQVk1OY0tHc0hNQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibXMiOiAiMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVjYW1lbGl6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWNhbWVsaXplLy0vZGVjYW1lbGl6ZS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlsTk5GUlNDYWJJRFV1ZSs0bTlRSDVvWkVwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWNvZGUtdXJpLWNvbXBvbmVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWNvZGUtdXJpLWNvbXBvbmVudC8tL2RlY29kZS11cmktY29tcG9uZW50LTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNnprVE16UllkMXk0VE5HaCt1QmlFR3U0ZFVVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWp3SzJVVjRjblBwYmNHNytWUkFSS1RaUFVXb3d3WEE4YnpINU5QNnVkMG9lQXh5WVB1R1pVQUM3aE11Z3BDZHo0QmVTWmwyRGw5azY2Q0hKLzQ2WllRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMiIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJkZWxheWVkLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWxheWVkLXN0cmVhbS8tL2RlbGF5ZWQtc3RyZWFtLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM3pyaG1heXQrMzFFQ3FyZ3NwNGljckpPeGhrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRldGVjdC1maWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RldGVjdC1maWxlLy0vZGV0ZWN0LWZpbGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04Tlp0QTJjcWdseXh0enZiUCtZakVNamxVcmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZG9tLXNlcmlhbGl6ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tLXNlcmlhbGl6ZXIvLS9kb20tc2VyaWFsaXplci0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJ6eHBkVWJPQjRET0k3NUtLT0tUNUF2RERJST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICJ+MS4xLjEiLAorICAgICAgICAiZW50aXRpZXMiOiAifjEuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbWVsZW1lbnR0eXBlLy0vZG9tZWxlbWVudHR5cGUtMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdlNoM1BpWkNpQnJzVVZSSkpDbWNYTmdpR0ZzPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImVudGl0aWVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW50aXRpZXMvLS9lbnRpdGllcy0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ibHd0Q2xZaHRkcmE3TytBdVE3ZnRjMTNjdkE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZG9tZWxlbWVudHR5cGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tZWxlbWVudHR5cGUvLS9kb21lbGVtZW50dHlwZS0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXNYcnRndWlyV2VVdDJjR2JGMWJnL0JoeUJNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb21oYW5kbGVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvbWhhbmRsZXIvLS9kb21oYW5kbGVyLTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTGVXYUNDTFZBbityLzI4RExDc2xvcWlyNXpnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZG9tdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tdXRpbHMvLS9kb211dGlscy0xLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTNOaElpaWIxWTlZUWVlU01uM3QrTWpjMmdzOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb20tc2VyaWFsaXplciI6ICIwIiwKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZWNjLWpzYm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWNjLWpzYm4vLS9lY2MtanNibi0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9vT3BCT1ZEVXloNGRNVmt0MVNUaG9TYW1Naz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAianNibiI6ICJ+MC4xLjAiLAorICAgICAgICAic2FmZXItYnVmZmVyIjogIl4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlbnRpdGllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbnRpdGllcy8tL2VudGl0aWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc3BoNm80SVRSL3plWkNzay9meWVUN2NTdnlZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVycm9yLWV4IjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Vycm9yLWV4Ly0vZXJyb3ItZXgtMS4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTdkRkhObXFlRlNFdDJaQnNDcmlvcktubjNaMnBqK2ZkOWttSTZRb1d3NC8vREwraWNFQmZjMFU3cUpDaXNxclRzS1RqdzRmTkZ5MnBXOU9xU3REODRnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1hcnJheWlzaCI6ICJeMC4yLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXM2LXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXM2LXByb21pc2UvLS9lczYtcHJvbWlzZS00LjIuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbjZ3dnBkRTQzVkZ0SnErbFVEWURCRlV3VjhUWmJ1R1hMVjRENndLYWZnMTNsZHpuS3N5RXZhdHVibm1VZTMxemN2ZWxTek9IRitYYmFUK0JsOU9iRGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzNi1wcm9taXNpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lczYtcHJvbWlzaWZ5Ly0vZXM2LXByb21pc2lmeS01LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVVRbldMejVXNnBaOFMyTlFXdThJS1J5S1VnTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlczYtcHJvbWlzZSI6ICJeNC4wLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjYXBlLXN0cmluZy1yZWdleHAvLS9lc2NhcGUtc3RyaW5nLXJlZ2V4cC0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUcySEFWaUdRcU4vMnJqdXl6d0lBeWhNTGh0UT0iCisgICAgfSwKKyAgICAiZXNwcmltYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS0yLjcuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWx1TzNEVmQ1OXExSnpRTW1jOUhERW5aN3BZRT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJldmVudGVtaXR0ZXIyIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjE0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2V2ZW50ZW1pdHRlcjIvLS9ldmVudGVtaXR0ZXIyLTAuNC4xNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWoyRzNYTjRCS3k2ZXNvVFVWRldEdFdRN1lhcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleGl0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4aXQvLS9leGl0LTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQmpKamo0MkhmTWdoQjlNS0QvOGFGOHVoelF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4cGFuZC1icmFja2V0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtYnJhY2tldHMvLS9leHBhbmQtYnJhY2tldHMtMi4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10M2MxNHhYT01QYTI3L0Q0T3dRVkdpSkVsaUk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiXjIuMy4zIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgInBvc2l4LWNoYXJhY3Rlci1jbGFzc2VzIjogIl4wLjEuMCIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi41IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTAuMi41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXcxc2UrUmpzUEprUG1sdkZlK0JLck94Y2dSWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4cGFuZC10aWxkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtdGlsZGUvLS9leHBhbmQtdGlsZGUtMi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sK2dCcWdVdDhDUlUza2F3Sy9ZaFpDemNoUUk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaG9tZWRpci1wb2x5ZmlsbCI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC8tL2V4dGVuZC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZmpxdUM1OWNEN0N5VzZ1ck5YSzBGQnVma1pjb2lHRzgwd1R1UHVqWDU5MGNCNVR0bG4yMEUyVUI0Uy9XQVJWcWhYZmZabDJMTmdTK2dRZFBJSWltL2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KcWNhcndjN09mc2hKeGNuUmhNY0p3UUNqYmc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzaWduLXN5bWJvbHMiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjEuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpcy1leHRlbmRhYmxlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMS4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hcm5YTXhUMWhob0tvOWsxTFpkbWxOeUpkRERmeTJ2MGZYakZsbW9rNCtpOHVsLzZXbGJWZ2U5YmhNNzRPcE5QUVBNR1VUb0R0eitLWGExUG5lSnhPQT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuNCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJleHRnbG9iIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGdsb2IvLS9leHRnbG9iLTIuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ObWI2UVhrRUxzdUJyMjRDSlNraWxvNlVISGdiZWtLNVVpWmdmRTZVSEQzRWIyN1lDNm9EK2JoY1QrdEo2Y2w4ZG1zZ2RReG5XbGNyeThrc0JJQkxwdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImV4cGFuZC1icmFja2V0cyI6ICJeMi4xLjQiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW01aG5IVGtjVnNQZnF4M0FLbHl0dElQYjdKK1h5a0h2SlAyQjliWkRqbGhMSW9FcTRYb0s2NFZnN2JvWmxWV1lLNkxVWTk0ZFlQRUU3TGgwWmtaS2NRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYlJYeTFGbXRBb0NqUWtWbUlWWXd1dXFERlViYU9lRGptZWQxdE9HUHJzTWh0SkE0ckQ5dGtnQTBGMXFKM2dSRlJYY0hZVmtkZWFQNTBRNXJFL2pMUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmVpczVXcVFHVjdwZW9vRHlMbU5FUFVycHM5K1NYWDVjOXBMM3hFQis0ZTlIbkd1RGE3bUI3a0h4SHc0Q2JxUzlrMVQyaE9IM21pTDhuOFd0aVlWdGc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJleHRyYWN0LXppcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRyYWN0LXppcC8tL2V4dHJhY3QtemlwLTEuNi43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUVDMHVLOWtBeVpNamJWL1R4cDBNejc0SCtrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAiMS42LjIiLAorICAgICAgICAiZGVidWciOiAiMi42LjkiLAorICAgICAgICAibWtkaXJwIjogIjAuNS4xIiwKKyAgICAgICAgInlhdXpsIjogIjIuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgImV4dHNwcmludGYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0c3ByaW50Zi8tL2V4dHNwcmludGYtMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1scEdFUU9NRUducEJUNHhTNDhWMDZ6dytIZ1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leWVzLy0vZXllcy0wLjEuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVlzOFNBalRHZzNoZGtDTklxQUR2UGd6Q0M4QT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1kZWVwLWVxdWFsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtZGVlcC1lcXVhbC8tL2Zhc3QtZGVlcC1lcXVhbC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXdGTkhlQmZJYTFIYXFGUElIZ1diY3owQ05oUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvLS9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFSUXNESzdtc1JpZmg5T25ZUkVHVDRiSXUvST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZmQtc2xpY2VyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZkLXNsaWNlci8tL2ZkLXNsaWNlci0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWkxdkwyZXd5ZkZCQnY1cXdJLzFuVVBFWGZtVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwZW5kIjogIn4xLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWd1cmVzIjogeworICAgICAgInZlcnNpb24iOiAiMS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpZ3VyZXMvLS9maWd1cmVzLTEuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteStIanIvenh6VVM0REszKzBvM0hrNmx3SFM0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWxsLXJhbmdlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbGwtcmFuZ2UvLS9maWxsLXJhbmdlLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVVTQkhVS1BtT3NHcGozRUF0SkFQREtNT1BjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNi4xIiwKKyAgICAgICAgInRvLXJlZ2V4LXJhbmdlIjogIl4yLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5kLXVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmQtdXAvLS9maW5kLXVwLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYXk2WUlyR2l6Z3BncTJUV0VPeksxVHl5VFE4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtZXhpc3RzIjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZmluZHVwLXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZHVwLXN5bmMvLS9maW5kdXAtc3luYy0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU41TUtwZGdXdDNmQU5FWGhsbXpHZVFwTUN4WT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIn41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMTUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi01LjAuMTUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzhrMnVlQXZTbUEvekNJdXozWXowd3VMazdFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICAgICAibWluaW1hdGNoIjogIjIgfHwgMyIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZpbmVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmVkLy0vZmluZWQtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMzNJUkxkcUwxNXdnZWlFOThDdU5FOFZOSFk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMiIsCisgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC4zIiwKKyAgICAgICAgIm9iamVjdC5kZWZhdWx0cyI6ICJeMS4xLjAiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMi4wIiwKKyAgICAgICAgInBhcnNlLWZpbGVwYXRoIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmbGFnZ2VkLXJlc3Bhd24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmxhZ2dlZC1yZXNwYXduLy0vZmxhZ2dlZC1yZXNwYXduLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVG5tdW15NnppL2hyTzdWcjgrQ2xhcVg4cTljPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZvci1pbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3ItaW4vLS9mb3ItaW4tMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1nUWFOS1ZxQlF1d0t4eWJHNGlBTU1QdHRYb0E9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZm9yLW93biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3Itb3duLy0vZm9yLW93bi0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXhqTXk5QlhPM0VzRTIvNXd6NE5rbE1VOHRFcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmb3ItaW4iOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZvcmV2ZXItYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZm9yZXZlci1hZ2VudC8tL2ZvcmV2ZXItYWdlbnQtMC42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rOGNmREVHdDZ6ZjViRmQ2MGUxQzJQMnN5cEU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImZvcm0tZGF0YSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3JtLWRhdGEvLS9mb3JtLWRhdGEtMi4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFsTEtCMk11M2FHUDFRLzJlQ094MGZOYlJNZTdYZHdrdHdPcnVoZnFxZDBySUpXd040RGgrRTNoclBTbERDWG5TUjdVdFoxTjM4clZYbSs2K01FaEpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmNraXQiOiAiXjAuNC4wIiwKKyAgICAgICAgImNvbWJpbmVkLXN0cmVhbSI6ICJeMS4wLjYiLAorICAgICAgICAibWltZS10eXBlcyI6ICJeMi4xLjEyIgorICAgICAgfQorICAgIH0sCisgICAgImZyYWdtZW50LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZyYWdtZW50LWNhY2hlLy0vZnJhZ21lbnQtY2FjaGUtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RcEQ2MG44VDZKdm44emVaeHJ4YUNyLy9EUms9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJmcy1leHRyYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mcy1leHRyYS8tL2ZzLWV4dHJhLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtelR6bDkrZkxZVVdJUDhyakdSNllkL2hZZVZBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAianNvbmZpbGUiOiAiXjIuMS4wIiwKKyAgICAgICAgImtsYXciOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJrbGF3IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2xhdy8tL2tsYXctMS4zLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUUloRE8wYXpzYm9sblhoNFhZNlc5enVnSkRrPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS45IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZzLnJlYWxwYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLnJlYWxwYXRoLy0vZnMucmVhbHBhdGgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GUVN0SlNNVmpLcEEyMG9uaDhzQlFSbVU2azg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0LXN0ZGluIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldC1zdGRpbi8tL2dldC1zdGRpbi00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVXakdzS0JEaERKSkF1aS9HbDN6Slhta1VQND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0LXZhbHVlLy0vZ2V0LXZhbHVlLTIuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM0JYS0hHY2poOHAydlRlc0NqbGJvZ1FxTENnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldG9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXRvYmplY3QvLS9nZXRvYmplY3QtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CSHBFbDRuNkZnMEJqMVNHN1pFeUMyN0hpRnc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0cGFzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXRwYXNzLy0vZ2V0cGFzcy0wLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVh2K09QbWhOVnBya3l5c1NnbUJPaTZZaFNmbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUnV2cjBubEpiak5reVlORktzVFlWS3o5WG89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjIiLAorICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYmFsLW1vZHVsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFsLW1vZHVsZXMvLS9nbG9iYWwtbW9kdWxlcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItc0t6cEVrZjExR3BPRnV3MFp6anptdDRCNFVad2pPY0c3NTdQUHZyZmh4Y0xGYnEwd3BzZ3BPcXhweHR4RmlDRzREdEc5M002WFJWYkYyb0dkZXY3Ymc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2JhbC1wcmVmaXgiOiAiXjEuMC4xIiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlc29sdmUtZGlyIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWwtcHJlZml4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2JhbC1wcmVmaXgvLS9nbG9iYWwtcHJlZml4LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMi9kRHhzRkprbGs4WlZWb3kyYnRNc0FTTHI0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4cGFuZC10aWxkZSI6ICJeMi4wLjIiLAorICAgICAgICAiaG9tZWRpci1wb2x5ZmlsbCI6ICJeMS4wLjEiLAorICAgICAgICAiaW5pIjogIl4xLjMuNCIsCisgICAgICAgICJpcy13aW5kb3dzIjogIl4xLjAuMSIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjE0IgorICAgICAgfQorICAgIH0sCisgICAgImdyYWNlZnVsLWZzIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncmFjZWZ1bC1mcy8tL2dyYWNlZnVsLWZzLTQuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURvdmY1TkhkdUlWTlpPQk9wOEFPS2dKdVZsZz0iCisgICAgfSwKKyAgICAiZ3J1bnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQvLS9ncnVudC0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItL0p6bVpOUGZLb3JsQ3JybXhXcVFPNEpWb2RPK0RWZDVYWDREa29jTC8xV2xMbEtWTEU5K1NkRUllbXBPQXhEaFdQeXNMbGU2YWZ2bi9oZzdDazJrOWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvZmZlZXNjcmlwdCI6ICJ+MS4xMC4wIiwKKyAgICAgICAgImRhdGVmb3JtYXQiOiAifjEuMC4xMiIsCisgICAgICAgICJldmVudGVtaXR0ZXIyIjogIn4wLjQuMTMiLAorICAgICAgICAiZXhpdCI6ICJ+MC4xLjEiLAorICAgICAgICAiZmluZHVwLXN5bmMiOiAifjAuMy4wIiwKKyAgICAgICAgImdsb2IiOiAifjcuMC4wIiwKKyAgICAgICAgImdydW50LWNsaSI6ICJ+MS4yLjAiLAorICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LWxvZyI6ICJ+Mi4wLjAiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LXV0aWwiOiAifjEuMS4xIiwKKyAgICAgICAgImljb252LWxpdGUiOiAifjAuNC4xMyIsCisgICAgICAgICJqcy15YW1sIjogIn4zLjUuMiIsCisgICAgICAgICJtaW5pbWF0Y2giOiAifjMuMC4yIiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAibm9wdCI6ICJ+My4wLjYiLAorICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJ+MS4wLjAiLAorICAgICAgICAicmltcmFmIjogIn4yLjYuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ3J1bnQtY2xpIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY2xpLy0vZ3J1bnQtY2xpLTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVZpc1JucnNHbmR0R1NzNG9SVkFiNlhzMXRxZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJmaW5kdXAtc3luYyI6ICJ+MC4zLjAiLAorICAgICAgICAgICAgImdydW50LWtub3duLW9wdGlvbnMiOiAifjEuMS4wIiwKKyAgICAgICAgICAgICJub3B0IjogIn4zLjAuNiIsCisgICAgICAgICAgICAicmVzb2x2ZSI6ICJ+MS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibm9wdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jbGkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY2xpLy0vZ3J1bnQtY2xpLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Vd0JSdS9RcEFqRGM1M0RSTEVreWlsRmRMMHplbnB4dStmZGRUSWxzRi9LSnFkTmNIYVFtdnl1MVczY0Rlc1o5cnFxWmRLSzVBOCtRREl5TFVFV29aUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAiaW50ZXJwcmV0IjogIn4xLjEuMCIsCisgICAgICAgICJsaWZ0b2ZmIjogIn4yLjUuMCIsCisgICAgICAgICJub3B0IjogIn40LjAuMSIsCisgICAgICAgICJ2OGZsYWdzIjogIn4zLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLWNvbmNhdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLWNvbmNhdC8tL2dydW50LWNvbnRyaWItY29uY2F0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVZDWVl3aE9oeDEraHQ1SXdCVWxudGwzUmIwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjAuMCIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjUuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItanNoaW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY29udHJpYi1qc2hpbnQvLS9ncnVudC1jb250cmliLWpzaGludC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5wMlFteVdUeEE2TDU1bEFzaE5BaFF4NU9hdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMS4xLjEiLAorICAgICAgICAiaG9va2VyIjogIl4wLjIuMyIsCisgICAgICAgICJqc2hpbnQiOiAifjIuOS40IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLXF1bml0Ly0vZ3J1bnQtY29udHJpYi1xdW5pdC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItczk5NCtpcEt3YytvVVVJV2FHSXcxc295SUQ0cEV4U0dNZC9jSFFONWgwcDhLYklqUjFMZTNaQzNnaVNEREtYdFpGRTBpK09iZjB1SWpOdmpmdFgyQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV2ZW50ZW1pdHRlcjIiOiAiXjUuMC4xIiwKKyAgICAgICAgInAtZWFjaC1zZXJpZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgInB1cHBldGVlciI6ICIxLjcuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXZlbnRlbWl0dGVyMiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V2ZW50ZW1pdHRlcjIvLS9ldmVudGVtaXR0ZXIyLTUuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVlaZWdsZFg3YTFmb2xDOXYxK3F0WTZDY2xGST0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItdWdsaWZ5Ly0vZ3J1bnQtY29udHJpYi11Z2xpZnktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ybWVrYjVGVDdkVExFWUU2VmV0cHh3MTlzdnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4wLjEiLAorICAgICAgICAibWF4bWluIjogIl4xLjEuMCIsCisgICAgICAgICJ1Z2xpZnktanMiOiAifjIuNi4yIiwKKyAgICAgICAgInVyaS1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWpzZG9jLy0vZ3J1bnQtanNkb2MtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWdDNjZUQ1JYZVFNajNISXlxVlNCSm04emRVejQzZTV2YUcvUExPLzYyN0ExZWRiSm56eGhKVjduRjBLcUx3TU0wUkROdTFpc3RDNmZ2Zm5ZcUZLaTN3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjcm9zcy1zcGF3biI6ICJeNi4wLjUiLAorICAgICAgICAianNkb2MiOiAifjMuNS41IiwKKyAgICAgICAgIm1hcmtlZCI6ICJeMC41LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1hcmtlZCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjUuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcmtlZC8tL21hcmtlZC0wLjUuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlVa0JaZWdDWm91NEFkd2JLVHdTVy9sTkRjejVPdVJTbDNxZGNsMzFJYTBCMlFQRzBKbit0S2JsaC85L2VQOS82KzRoMjd2cG9oOHdlbC92UU9WMHZ3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1rbm93bi1vcHRpb25zIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWtub3duLW9wdGlvbnMvLS9ncnVudC1rbm93bi1vcHRpb25zLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jSHdzTHFvaWdocHU3VHVZajVSb25uRXV4R1ZGbnp0Y1VxVHFwNXJYRkdZTDRPdVBGb2Z3QzRZY2c3bjlmWXd2SzZGNVdiWWdlVk93cGg5Q3JzMmZzUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ3J1bnQtbGVnYWN5LWxvZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1sZWdhY3ktbG9nLy0vZ3J1bnQtbGVnYWN5LWxvZy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW0zKzVRdkRZZlIxbHRyOGhqaWFpTmpkZHhHZFFXY0gwcncxaUtLaVFuRjAreHRnVGF6aXJTVEd1NjhSY2hQeWgxT0JuZzFiQlVqTG1YOHE5TnBvQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9ycyI6ICJ+MS4xLjIiLAorICAgICAgICAiZ3J1bnQtbGVnYWN5LWxvZy11dGlscyI6ICJ+Mi4wLjAiLAorICAgICAgICAiaG9va2VyIjogIn4wLjIuMyIsCisgICAgICAgICJsb2Rhc2giOiAifjQuMTcuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktbG9nLXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS1sb2ctdXRpbHMvLS9ncnVudC1sZWdhY3ktbG9nLXV0aWxzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vN3VIeU8vSitpMnRYRzhyMmJaTmxWazIwdmxJRko5SUVZeUhNQ1FHZldZcnU4SnYzd1RxS1p6dlYzMFlXOXJXRWpxMGVQM2NmbFExcVdvakllOVZGQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAifjIuNC4xIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktdXRpbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1sZWdhY3ktdXRpbC8tL2dydW50LWxlZ2FjeS11dGlsLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05enlBMjl3L2ZCZTZCSWZqR0VObmR3b2UxVXkzMUJJWHhUSDNzOG1nYTBaNUJ6MlNwNFVDamtleXYydEk0NDl5bWt4M3gyNkIrNDZGVjRmWEVkZGw1QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAifjEuNS4yIiwKKyAgICAgICAgImV4aXQiOiAifjAuMS4xIiwKKyAgICAgICAgImdldG9iamVjdCI6ICJ+MC4xLjAiLAorICAgICAgICAiaG9va2VyIjogIn4wLjIuMyIsCisgICAgICAgICJsb2Rhc2giOiAifjQuMTcuMTAiLAorICAgICAgICAidW5kZXJzY29yZS5zdHJpbmciOiAifjMuMy40IiwKKyAgICAgICAgIndoaWNoIjogIn4xLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1zaGVsbC1zcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtc2hlbGwtc3Bhd24vLS9ncnVudC1zaGVsbC1zcGF3bi0wLjMuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1nYnVOUlg3RWZUR0NxSDFqQ08rRVhkKzVTSTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3J1bnQiOiAiPj0wLjQueCIsCisgICAgICAgICJzeW5jLWV4ZWMiOiAifjAuNi4yIgorICAgICAgfQorICAgIH0sCisgICAgImd6aXAtc2l6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nemlwLXNpemUvLS9nemlwLXNpemUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1acytMRUJCSEludVZ1czV1b2RvTUYzN1Z3aTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnJvd3NlcmlmeS16bGliIjogIl4wLjEuNCIsCisgICAgICAgICJjb25jYXQtc3RyZWFtIjogIl4xLjQuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXItc2NoZW1hIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhci1zY2hlbWEvLS9oYXItc2NoZW1hLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcVV3aUpPdkt3RWVDb05rRFZTSHlSelczN0pJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJoYXItdmFsaWRhdG9yIjogeworICAgICAgInZlcnNpb24iOiAiNS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhci12YWxpZGF0b3IvLS9oYXItdmFsaWRhdG9yLTUuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rcW5tTmpJNE9mSDJpcFE5VlFPdzIzYkJkL2lidGZiVmRLMmZZYlk0YWNURHFLVFcvWURwOU1jaW1aZERiRzhpVjlmWml6VXFRTUQ1eHZyaUIxNDZUQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFqdiI6ICJeNS4zLjAiLAorICAgICAgICAiaGFyLXNjaGVtYSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLWFuc2kvLS9oYXMtYW5zaS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5QVUVuT0hzM3lzR1NhOCs4azVGN1RWQmJaRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtZmxhZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtZmxhZy8tL2hhcy1mbGFnLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGRSVTNDR1pyaUpXbWZOR2Zsb0g4N2xWdXYwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhcy12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWUvLS9oYXMtdmFsdWUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HTEtCMmxoYkhGeFIzdkpNa3c3U21ndm1zWGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXZhbHVlIjogIl4yLjAuNiIsCisgICAgICAgICJoYXMtdmFsdWVzIjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLXZhbHVlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWVzLy0vaGFzLXZhbHVlcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxiQzJQK3doUm1HYWIrVi81MVlvMWFPZS9rOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjQuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtNC4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSUlFOTg5Y1Nrb3NnYzNocEdrVUdiNjV5M1ZjPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaGFzaGEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzaGEvLS9oYXNoYS0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVOZkwvQjV0WmpBLzU1ZzNObG1FVVhzdmJ1RT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtc3RyZWFtIjogIl4xLjAuMSIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaG9tZWRpci1wb2x5ZmlsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ob21lZGlyLXBvbHlmaWxsLy0vaG9tZWRpci1wb2x5ZmlsbC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRDdThpbldKbVA3cjllMW9XQTkyMUdkb3RMdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXJzZS1wYXNzd2QiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhvb2tlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ob29rZXIvLS9ob29rZXItMC4yLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11RFQzSTh4S0pDcW1XV05GbmZiWmhNWFQyVms9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaG9zdGVkLWdpdC1pbmZvIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvc3RlZC1naXQtaW5mby8tL2hvc3RlZC1naXQtaW5mby0yLjcuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItN1QvQnhIMTl6YmNDVGE4WGtNbGJLNWxUbzFXdGdrRmkzR3ZkV0V5TnVjNFZleDcvOURxYm5wc2Y0Sk15ZGNmajlIQ2c0elVXRlRMM1phNmxhcGc1L3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImh0bWxwYXJzZXIyIjogeworICAgICAgInZlcnNpb24iOiAiMy44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0bWxwYXJzZXIyLy0vaHRtbHBhcnNlcjItMy44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tV3dvc1pGUmFvdm9aUUduMTVkWDVjY01FR2c9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIsCisgICAgICAgICJkb21oYW5kbGVyIjogIjIuMyIsCisgICAgICAgICJkb211dGlscyI6ICIxLjUiLAorICAgICAgICAiZW50aXRpZXMiOiAiMS4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICIxLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaHR0cC1zaWduYXR1cmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHR0cC1zaWduYXR1cmUvLS9odHRwLXNpZ25hdHVyZS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW11elpKUkZIY3ZQWlcyV21DcnVQZkJqN3JPRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImpzcHJpbSI6ICJeMS4yLjIiLAorICAgICAgICAic3NocGsiOiAiXjEuNy4wIgorICAgICAgfQorICAgIH0sCisgICAgImh0dHBzLXByb3h5LWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2h0dHBzLXByb3h5LWFnZW50Ly0vaHR0cHMtcHJveHktYWdlbnQtMi4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUhQQ1RTMUxXNTFiY3lNWWJ4VUlPTzRIRU9sUTEvMXFSYUZXY3l4dndhcVVTOVRZODhhb0V1SFVZMzNrdUFoMVloVlZhRFFoTFpzblBkK1hOQVJXWmxRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhZ2VudC1iYXNlIjogIl40LjEuMCIsCisgICAgICAgICJkZWJ1ZyI6ICJeMy4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0zLjIuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1lbCtqZjducnRFbDVQbjFReDQ2ekFSWEtEcEJidnplenNlN3A3THFJTm1kb0lrOFBZUDVTeVNheEVtWXY2VFowSnlFS0ExaHNDSWQ2REloZ0lUdFdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImljb252LWxpdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ljb252LWxpdGUvLS9pY29udi1saXRlLTAuNC4yNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdjNNWG5aQWN2bnl3a1RVRVpvbUlBY3RsZTdSWFhlZWRPUjMxd3dsN1ZseW9YTzRRaTlhcnZTZW5OUVduZTFUY1J3aENMMUh3TEkyMWJFcWRwajgvckE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICI+PSAyLjEuMiA8IDMiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5kZW50LXN0cmluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmRlbnQtc3RyaW5nLy0vaW5kZW50LXN0cmluZy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWppMUlOSWRDRWh0S2doaTNvVGZwcFNCSjNJQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXBlYXRpbmciOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImluZmxpZ2h0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZmxpZ2h0Ly0vaW5mbGlnaHQtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TYjFqTWRmUUxRd0p2SkVLRUhXNmdXVzFiZms9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5oZXJpdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5oZXJpdHMvLS9pbmhlcml0cy0yLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl6d3NnK1BhUXFVQzlTUm1BaVNBOUNDQ1lkND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbmkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5pLy0vaW5pLTEuMy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SWlk1aHVJS0NNUldEVXFabEVpNzJmL2xtWEtNdnVzemNNQmR1bGlRM25uV2J4OVgvWkJRTzdEaWpNRVlTOUVoSEJiMnFhY1JVTXRDN3N2THdlMGxjdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW50ZXJwcmV0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ludGVycHJldC8tL2ludGVycHJldC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZ0R3hRUXhxRGc5NHo1WFR1RVFNWS9lTGhoUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1hYnNvbHV0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hYnNvbHV0ZS8tL2lzLWFic29sdXRlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1kT1dvcWZsdmN5ZEFSYTM2MEd2djE4RFovZ1J1SEtpMk5VL3dVNVgxWkZ6ZFlmSDI5bmtpTlpzRjNtcDRPSjNINHlvOU14OEEvdUFHTnpwelBOM3lCQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtcmVsYXRpdmUiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMC4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xZUVzczY2TmgyY243dTg0US9pZ2lYdGNtTlk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1hcnJheWlzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hcnJheWlzaC8tL2lzLWFycmF5aXNoLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZDhtWVFGSjZxT3l4cUxwcGU0QmtXbnFTYXAwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1idWZmZXIvLS9pcy1idWZmZXItMS4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5jZEFMd3BYa1RtNVp2dmJrN293T1VTdlZ2QktEZ0tQNS9ld2ZYRXpubVFGZnM0WlJtYW5PZUtCVGpSVmprYTNRRm9ONlhKKzlGM1VTcWZIcVRhVTV3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1idWlsdGluLW1vZHVsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWJ1aWx0aW4tbW9kdWxlLy0vaXMtYnVpbHRpbi1tb2R1bGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WQVZ5MDA5Nnd4R2ZqM2JEREx3YkhnTjYvNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnVpbHRpbi1tb2R1bGVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kYXRhLWRlc2NyaXB0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQzE3bVNEaU9MSVlDZ3VlVDhZVnY3RDh3RzFZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaXMtZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0wLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYXZEWXIwU0IzRHdPOXpzTW92MGdLQ0VTRllxQ25FNGhxLzR6M1RkVWx1a0V5NXQ5QzBZUnE3SExyc041Mk5BY3FYS2FlcGVDRDBuK0IwYXJuVkczSGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFjY2Vzc29yLWRlc2NyaXB0b3IiOiAiXjAuMS42IiwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMC4xLjQiLAorICAgICAgICAia2luZC1vZiI6ICJeNS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNS4xLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi01LjEuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5HRUVybkg2RjJ2VXVYRGgrT2xiY0tXNy93T2NmZFJIYVo3Vld0cUN6dGZIcmkvKytZS21QNTFPZFdlR1B1cUNPYmE2a2syT1RlNWQwMlZtVEI4MFB3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1leHRlbmRhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWV4dGVuZGFibGUvLS9pcy1leHRlbmRhYmxlLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXJFUTRvbWtjVUdPUHNOcVlYMUhMakFkL0lrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWV4dGdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0Z2xvYi8tL2lzLWV4dGdsb2ItMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xSXdDVTFlUjhDN1RmSGFodWVxWGM4Z3orTUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZmluaXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWZpbml0ZS8tL2lzLWZpbml0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXpHWjNhVllDdmxVTzhSNkxTcVl3VTBLMjBLbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJudW1iZXItaXMtbmFuIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1nbG9iIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWdsb2IvLS9pcy1nbG9iLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZTZXdUpDRjRCS3h3Y0h1V2tpVm5TR3pENkVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWV4dGdsb2IiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLW51bWJlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1udW1iZXIvLS9pcy1udW1iZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KUDFpQWFSNExQVUZZY2dRSjJyOGZSTFhFWlU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1wbGFpbi1vYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGxhaW4tb2JqZWN0Ly0vaXMtcGxhaW4tb2JqZWN0LTIuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1oNVBwZ1hrV2l0YzM4QkJNWWF3VFlNV0pIRlpKVm5CcXVGRTU3eEZwakI4cEpGaUY2Z1orYlUrV3lJL3lxWGlGUjVtZExzZ1lOYVBlOHVhbzZVdjlPZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXJlbGF0aXZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXJlbGF0aXZlLy0vaXMtcmVsYXRpdmUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUt3L1JlSzBpcXdLZXUwTUlUTEZ1ajBqYlBBbUVpT3NJd3lJWHZ2YmZhNlFmbU45cGtEMU0rOHBkazdSbC9kVEtiSDM0L1hCRk1iZ0Q0aU1KaExRYkdBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy11bmMtcGF0aCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXN0cmVhbS8tL2lzLXN0cmVhbS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUV0U2ozVTVvNExlYzY0MjhoQmM2NkEyUnlrUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtdHlwZWRhcnJheSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy10eXBlZGFycmF5Ly0vaXMtdHlwZWRhcnJheS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTVIbklDRmpmREJzUjNkcHBRUGxnRWZ6YVNwbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtdW5jLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdW5jLXBhdGgvLS9pcy11bmMtcGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbXJHcFZkMGZzN1dXTGZWc1N0dmdGNmlFSm5iakRGWmg5L2VtaFJEY0dXVGR1VGZOSGQ5Q0hlVXdIM2dZSWpkYndvNE9uNmh1bmt6dHdPYUF3MHlsbFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuYy1wYXRoLXJlZ2V4IjogIl4wLjEuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy11dGY4IjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXV0ZjgvLS9pcy11dGY4LTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU3cyaFJDRUUwYk0yTkE2QWVYNkdYUE9mZlhJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXdpbmRvd3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtd2luZG93cy8tL2lzLXdpbmRvd3MtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVYSzFVSW5xMmJQbWp5WDZlM1ZISXpNTG9iYzRKOTRpNEFXbitIcHEzT1U1S2tyUkM5Nk9BY1IzUFJKL3BHdTZtOFRSbkJIUDlka1hRVnNUL0NPVklBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc2FycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdTVOZFNGZ3N1aGFNQm9OSlY2VktQZ2NTVHhFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzZXhlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzZXhlLy0vaXNleGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02UHZ6ZE54VmIvaVVlaERjc0ZjdFl6OHMraEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNvYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNvYmplY3QvLS9pc29iamVjdC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRrTWVrckVhbHpGamFxSDV5TkhNdlAycmVOOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc3N0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc3N0cmVhbS8tL2lzc3RyZWFtLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUitZL2V2VmErbStTNFZBT2FRNjR1RktjQ1pvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzLXlhbWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMteWFtbC8tL2pzLXlhbWwtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BM2ZEZ0JmS3ZITWlzTkg3elNXa2tXUWZMNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJncGFyc2UiOiAiXjEuMC4yIiwKKyAgICAgICAgImVzcHJpbWEiOiAiXjIuNi4wIgorICAgICAgfQorICAgIH0sCisgICAgImpzMnhtbHBhcnNlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qczJ4bWxwYXJzZXIvLS9qczJ4bWxwYXJzZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QN1lPcWdpY1ZFRDVNWjlSZGd6TkIrSkpsek09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInhtbGNyZWF0ZSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAianNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2JuLy0vanNibi0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBlWlV3dVdpM3JYeUFkbHM3N3lvREE3eTlSTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqc2RvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2RvYy8tL2pzZG9jLTMuNS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02UHhCNjVUQVU0V08wV3p5ci80L1lobEdvdlhsMEVWWWZwS2JwU3JvU2owcUJ4VDQveG9kL2w0ME9wa20zOGRSSFJkUWdkZVk4MzZNMHVWbkpRRzdrZz09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhYnlsb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAgICJibHVlYmlyZCI6ICJ+My41LjAiLAorICAgICAgICAiY2F0aGFyc2lzIjogIn4wLjguOSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJ+MS4wLjUiLAorICAgICAgICAianMyeG1scGFyc2VyIjogIn4zLjAuMCIsCisgICAgICAgICJrbGF3IjogIn4yLjAuMCIsCisgICAgICAgICJtYXJrZWQiOiAifjAuMy42IiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAicmVxdWl6emxlIjogIn4wLjIuMSIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIsCisgICAgICAgICJ0YWZmeWRiIjogIjIuNi4yIiwKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuOC4zIgorICAgICAgfQorICAgIH0sCisgICAgImpzaGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuOS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2hpbnQvLS9qc2hpbnQtMi45LjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUtPOVNJQUtUbEpRT000bEU2NEdRVXRHQlJwVE91dmJyUnJTWnczQWhVeE1ORzI2Nm5YOWhLMmNLQTRTQmhYT2owaXJKR3lOeUdTTFQ2MkhHT1ZERU9BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjbGkiOiAifjEuMC4wIiwKKyAgICAgICAgImNvbnNvbGUtYnJvd3NlcmlmeSI6ICIxLjEueCIsCisgICAgICAgICJleGl0IjogIjAuMS54IiwKKyAgICAgICAgImh0bWxwYXJzZXIyIjogIjMuOC54IiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIsCisgICAgICAgICJtaW5pbWF0Y2giOiAifjMuMC4yIiwKKyAgICAgICAgInBoYW50b20iOiAifjQuMC4xIiwKKyAgICAgICAgInBoYW50b21qcy1wcmVidWlsdCI6ICJ+Mi4xLjciLAorICAgICAgICAic2hlbGxqcyI6ICIwLjMueCIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIjEuMC54IiwKKyAgICAgICAgInVuaWNvZGUtNS4yLjAiOiAiXjAuNy41IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMS4wLjQudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSGhYN3lzbDlQdW1iOHRjN1RHVnJDQ3U2KzVFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImpzbGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNsaW50Ly0vanNsaW50LTAuMTIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUm9Dc3lJQ2NLQSs2VEZzYnlzOURwS1RmUFZhQzcxTW01UVNqdnJXQTBsRFZOK0xJdng2YXBhNDJGRmlzTXFtQ1R2SjhEeGtjb1FHSjBqN20za1RWb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4aXQiOiAifjAuMS4yIiwKKyAgICAgICAgImdsb2IiOiAifjcuMS4yIiwKKyAgICAgICAgIm5vcHQiOiAifjMuMC4xIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJ+Mi4xLjUiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImdsb2IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNy4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZjZnVpSXhvZ0xWNERsR0JISVVPd0kwSWJySjhIV1BjNE1VN0h6dmlHZU5oby9VSkRmaTZCNXAzc0hlV0lRMEtHSVUwSnB4aTVaSHhlbVFmTGtrQXdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm5vcHQiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4wLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC0zLjAuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14a1pkdndpcnpVMnpXVEYvZWF4b3BrYXlqL2s9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYWJicmV2IjogIjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjciLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9jZXNzLW5leHRpY2stYXJncy8tL3Byb2Nlc3MtbmV4dGljay1hcmdzLTEuMC43LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUZRNGd0MVpaQ3RQNUVKUHlXazhxMkwvekM2TT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0yLjEuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1adnFMY2c0VU9MTmthQjhxMGFZOFlZUkl5ZEE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYnVmZmVyLXNoaW1zIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4xIiwKKyAgICAgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjEuMC42IiwKKyAgICAgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MC4xMC54IiwKKyAgICAgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJ+MS4wLjEiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianNvbi1zY2hlbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEvLS9qc29uLXNjaGVtYS0wLjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRJRElrdVdhTHdXVlRPY252VDhxVG9ndm5oTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEtdHJhdmVyc2UvLS9qc29uLXNjaGVtYS10cmF2ZXJzZS0wLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5KcHRSTVU2VWQ2SnRBZ0Z4ZFhsbTBGOU0wQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zdHJpbmdpZnktc2FmZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXN0cmluZ2lmeS1zYWZlLy0vanNvbi1zdHJpbmdpZnktc2FmZS01LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUVwYWkxWS9VWHhtZzlzNEIxbGNCNHNjMXR1cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAianNvbmZpbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uZmlsZS8tL2pzb25maWxlLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnphaXRDaTRlNzJneklPMVA2UFdNNk5jS3VnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjYiCisgICAgICB9CisgICAgfSwKKyAgICAianNwcmltIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzcHJpbS8tL2pzcHJpbS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1UNW12QjVjd0c1RGk4RzNTWnd1WEZhc3RxST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiMS4wLjAiLAorICAgICAgICAiZXh0c3ByaW50ZiI6ICIxLjMuMCIsCisgICAgICAgICJqc29uLXNjaGVtYSI6ICIwLjIuMyIsCisgICAgICAgICJ2ZXJyb3IiOiAiMS4xMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImtldyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rZXcvLS9rZXctMC43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lZGs5TFRNMlBXL2RLWEN6TmRrVUd0V1IxNXM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImtpbmQtb2YiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtNi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXM1a0xPY25IMFhxRE8rRnZ1YUxYOEREaloxOENHRms3VnlnSDQwUW9LUFVRaFc0ZTJydk0wcndVcTB0OElRRE93WVNlTEswMVU5ME9qekJUbWUyUXFBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJrbGF3IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tsYXcvLS9rbGF3LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NFbzROeGM1QkFnRVZFWlR1dWN2NFdHVVBZPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICB9CisgICAgfSwKKyAgICAibGF6eS1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sYXp5LWNhY2hlLy0vbGF6eS1jYWNoZS0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW9kZVB3NlVFZE11QWhGMDdPMjRkcEpwRWJvND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsaWZ0b2ZmIjogeworICAgICAgInZlcnNpb24iOiAiMi41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZnRvZmYvLS9saWZ0b2ZmLTIuNS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSUFrcEc3TWM2b1lidnhDbndWb295dmRjTWV3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4dGVuZCI6ICJeMy4wLjAiLAorICAgICAgICAiZmluZHVwLXN5bmMiOiAiXjIuMC4wIiwKKyAgICAgICAgImZpbmVkIjogIl4xLjAuMSIsCisgICAgICAgICJmbGFnZ2VkLXJlc3Bhd24iOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjQiLAorICAgICAgICAib2JqZWN0Lm1hcCI6ICJeMS4wLjAiLAorICAgICAgICAicmVjaG9pciI6ICJeMC42LjIiLAorICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjciCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImZpbmR1cC1zeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZHVwLXN5bmMvLS9maW5kdXAtc3luYy0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1reWF4U0l3aTBhWUlobENvYVFHeTJha0tMTHc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZGV0ZWN0LWZpbGUiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1nbG9iIjogIl4zLjEuMCIsCisgICAgICAgICAgICAibWljcm9tYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAgICAgInJlc29sdmUtZGlyIjogIl4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJsb2FkLWpzb24tZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2xvYWQtanNvbi1maWxlLy0vbG9hZC1qc29uLWZpbGUtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sV2tGY0kxWXRMcTB3aVliQlBXZk1jbVRkTUE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS4yIiwKKyAgICAgICAgInBhcnNlLWpzb24iOiAiXjIuMi4wIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIsCisgICAgICAgICJzdHJpcC1ib20iOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImxvZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMTcuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvZGFzaC8tL2xvZGFzaC00LjE3LjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jUUtoOGlnbzVRVWhaN2xnMzhEWVdBeE12alNBS0cwQTh3R1NWaW1QMDdTSVVFSzJVTythclNSS2JSWld0ZWxNdE41VjBIa3doNXJ5T3RvL1NzaFlJZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibG9uZ2VzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb25nZXN0Ly0vbG9uZ2VzdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1LQ3kyamozTjNEb0tVb05JdVppWHRkOUFKYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsb3VkLXJlamVjdGlvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb3VkLXJlamVjdGlvbi8tL2xvdWQtcmVqZWN0aW9uLTEuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVzBiNEFVZnQ3bGVJY1BDRzBFZ2h6NW1PVlI4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImN1cnJlbnRseS11bmhhbmRsZWQiOiAiXjAuNC4xIiwKKyAgICAgICAgInNpZ25hbC1leGl0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYWtlLWl0ZXJhdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21ha2UtaXRlcmF0b3IvLS9tYWtlLWl0ZXJhdG9yLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1weGl1WGgwaVZFcTdWTTdLTUloczVneHNmeEN1eDJVUnB0VVFhWG80aVpaSnhCQXpUUE9MRTJCdW1PNWRiZlZZcS9oQkpGQlIvYTFtRkRtT3g1QUdtdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAibWFwLWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC1jYWNoZS8tL21hcC1jYWNoZS0wLjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXd5cTlDOVpTWFpzRkZrVzdUeWFzWGNtS0RiOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtYXAtb2JqIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC1vYmovLS9tYXAtb2JqLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMlRQT3VTQmRncjNQU0liMmRDdmNLMDNxRkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcC12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXAtdmlzaXQvLS9tYXAtdmlzaXQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03TnlvOFRGRTVtRHh0YjFCOFM4MGVkbU4rNDg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib2JqZWN0LXZpc2l0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYXJrZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMTkiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFya2VkLy0vbWFya2VkLTAuMy4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZWEyZUdXT3FOeFBjWHY4ZHlFUmRTci82Rm16dld3empNeHBmR0Ivc2JNY2NYb2N0K3hZK1l1a1BEK1FUVVp3eXZLN0Jad2NyNG0yMVdCT1c0MXBBa2c9PSIKKyAgICB9LAorICAgICJtYXhtaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWF4bWluLy0vbWF4bWluLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtY1RaZWhLbWQyUGl6OTlYOTR2QU5Ibjl6dm1FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjAuMCIsCisgICAgICAgICJmaWd1cmVzIjogIl4xLjAuMSIsCisgICAgICAgICJnemlwLXNpemUiOiAiXjEuMC4wIiwKKyAgICAgICAgInByZXR0eS1ieXRlcyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJtZW93IjogeworICAgICAgInZlcnNpb24iOiAiMy43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWVvdy8tL21lb3ctMy43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jc3RtaTBKU0tDa0t1L3FGYUpKWWN3aW9BZnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlLWtleXMiOiAiXjIuMC4wIiwKKyAgICAgICAgImRlY2FtZWxpemUiOiAiXjEuMS4yIiwKKyAgICAgICAgImxvdWQtcmVqZWN0aW9uIjogIl4xLjAuMCIsCisgICAgICAgICJtYXAtb2JqIjogIl4xLjAuMSIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4xLjMiLAorICAgICAgICAibm9ybWFsaXplLXBhY2thZ2UtZGF0YSI6ICJeMi4zLjQiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4wLjEiLAorICAgICAgICAicmVhZC1wa2ctdXAiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlZGVudCI6ICJeMS4wLjAiLAorICAgICAgICAidHJpbS1uZXdsaW5lcyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJtaWNyb21hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taWNyb21hdGNoLy0vbWljcm9tYXRjaC0zLjEuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1XaWtnbDluOU0zdyticHNZM0hlOEwrdzllRjkzMzh4Umw4SUFPNXZpRGl6d1N6emlGRXlVem8yeHJybG9CNjRBRGJUZjh1QTh2UnFxdHREVE9tY2NnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItZGlmZiI6ICJeNC4wLjAiLAorICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJicmFjZXMiOiAiXjIuMy4xIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgImV4dGdsb2IiOiAiXjIuMC40IiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIsCisgICAgICAgICJuYW5vbWF0Y2giOiAiXjEuMi45IiwKKyAgICAgICAgIm9iamVjdC5waWNrIjogIl4xLjMuMCIsCisgICAgICAgICJyZWdleC1ub3QiOiAiXjEuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24iOiAiXjAuOC4xIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJtaW1lIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWUvLS9taW1lLTIuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRVVsbGNWb3lkQkhHTjF6ODR5ZlFEaW1uNThwWk5OTlhnWmxIWFNib3hNbEZ2Z0k2TVhTV3BXS3BGUnJhN0gxSHhwVmhIVGtyZ2hmUlc0OWs2eWplZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS1kYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMzcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS1kYi8tL21pbWUtZGItMS4zNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SM0M0ZGI2YmdRaGxJaFBVNDhmVXRkVm1LbmZscStoUmRhZDdJeUtodEZqMDZWUE5WZGsyUmhpWUwzVWpRSWxzbzhMK1l4QXRGa29iVDBWSytTL3liZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltZS10eXBlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4yMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS10eXBlcy8tL21pbWUtdHlwZXMtMi4xLjIxLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zaUw2RGJ3cHlMempSM3hIU0ZORmViOU56L004V0RrWDMzdDFHRlFuRk9sbFdrOHBPcmgvTFNyQjVPWGxubFc1UDlMSDczWDZsb1cvZW9nYytGNWxKZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltZS1kYiI6ICJ+MS4zNy4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlKSFZRRWh5cVBMVVRndDlCODNQWHU2VzNyeDRNdnZIdlNVdlRvb2dwd29HRE9VUSt5RHJSMEhSb3QreU9DZENPN3U0aFgzcFdmdDZrV0JCY3FoMFVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicmFjZS1leHBhbnNpb24iOiAiXjEuMS43IgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0wLjAuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhYL0t2OE01ZlNZbHVDS0NZdWhxcDZBUnNGMD0iCisgICAgfSwKKyAgICAibWl4aW4tZGVlcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taXhpbi1kZWVwLy0vbWl4aW4tZGVlcC0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOFpJdExIZUVnYXFFdmQ1bFlCWGZtNEVaU0ZDWDI5SmI5SytsQUhoREt6UmVLQlFLajNSKzdOT0Y2dGpxWWk5dDRvSThWVWZhV0lUSlFtODZ3blhHTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjIiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMS4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRlbmRhYmxlLy0vaXMtZXh0ZW5kYWJsZS0xLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFyblhNeFQxaGhvS285azFMWmRtbE55SmRERGZ5MnYwZlhqRmxtb2s0K2k4dWwvNldsYlZnZTliaE03NE9wTlBRUE1HVVRvRHR6K0tYYTFQbmVKeE9BPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC40IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1rZGlycCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21rZGlycC8tL21rZGlycC0wLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1BVjBPT3JHejMrTVIyZnpoa2pXYVgxMXlRTT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAiMC4wLjgiCisgICAgICB9CisgICAgfSwKKyAgICAibXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZnaXVyZndBdm13cEFkOWZtR0Y0amVEVmw4Zz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYW5vbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMTMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25hbm9tYXRjaC8tL25hbm9tYXRjaC0xLjIuMTMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZwb2UyVDBSYkh3QlRCVU9mdEFmQlBhREVpMDZ1ZmFVYWkwbUU2WW4xa2FjYzNTblRFcmZiL2grWDk0Vlh6STY0cktGSFlJbVhTdmR3R0dDbXdPcUNBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItZGlmZiI6ICJeNC4wLjAiLAorICAgICAgICAiYXJyYXktdW5pcXVlIjogIl4wLjMuMiIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjIuMC4yIiwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4zLjAuMiIsCisgICAgICAgICJmcmFnbWVudC1jYWNoZSI6ICJeMC4yLjEiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjIiLAorICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMy4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm5pY2UtdHJ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25pY2UtdHJ5Ly0vbmljZS10cnktMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFuaDQ1ZGVlYjVvbE5ZN2VYODJCa1BPN1NTeFI1U1NZSmlQVHJUZEZVVll3QWw4Q0tNQTVOOVBqVFlrSGlSamlzVmN4Y1ExSFhkTGh4MnF4eEp6TE5RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJub3B0IjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtME5Sb1d2MVVGUms4akhVRllDME5GODFrUjAwPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMSIsCisgICAgICAgICJvc2VudiI6ICJeMC4xLjQiCisgICAgICB9CisgICAgfSwKKyAgICAibm9ybWFsaXplLXBhY2thZ2UtZGF0YSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3JtYWxpemUtcGFja2FnZS1kYXRhLy0vbm9ybWFsaXplLXBhY2thZ2UtZGF0YS0yLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOWpqVUZiVFBmRXkzUi9hZC8yb05iS3RXOUhnb3ZsNU8xRnZGV0trS2JsTlhvTi9Pb3U2KzkrS0tvaFBLMTNZYzMvVHl1bnlXaEpwNmd2Uk5SL1BQQXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhvc3RlZC1naXQtaW5mbyI6ICJeMi4xLjQiLAorICAgICAgICAiaXMtYnVpbHRpbi1tb2R1bGUiOiAiXjEuMC4wIiwKKyAgICAgICAgInNlbXZlciI6ICIyIHx8IDMgfHwgNCB8fCA1IiwKKyAgICAgICAgInZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm51bWJlci1pcy1uYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnVtYmVyLWlzLW5hbi8tL251bWJlci1pcy1uYW4tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DWHRnSzFOQ0tsSXNHdnVIa0RHRE5wUWFBUjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2F1dGgtc2lnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYXV0aC1zaWduLy0vb2F1dGgtc2lnbi0wLjkuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZmV4aFVGRlBUR1Y4eWJBdFNJR2JWNmdPa1N2OFV0UmJEQm5BeUxRdzRRUEtrZ05sc0gyQnlQR3RNVXFkV2tvczZZQ1JtQXFWaXdnWnJKYy9tUkR6WlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtYXNzaWduIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1hc3NpZ24vLS9vYmplY3QtYXNzaWduLTQuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVFtdHg1WlloOC9BWEx2VVFzckl2N3MyQ0dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1jb3B5IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1jb3B5Ly0vb2JqZWN0LWNvcHktMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mbjJGaTNnYjE4bVJwQnVwZGUwNEVuVk9tWXc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29weS1kZXNjcmlwdG9yIjogIl4wLjEuMCIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjAuMi41IiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4zIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QtdmlzaXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LXZpc2l0Ly0vb2JqZWN0LXZpc2l0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOTV4RWs2OE1VM2UxbitPZE9WNUJCQzNRUmJzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QuZGVmYXVsdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LmRlZmF1bHRzLy0vb2JqZWN0LmRlZmF1bHRzLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT24rR2d6UzBCOTZnYmFGdGlOWE5LZVExL3M4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LWVhY2giOiAiXjEuMC4xIiwKKyAgICAgICAgImFycmF5LXNsaWNlIjogIl4xLjAuMCIsCisgICAgICAgICJmb3Itb3duIjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib2JqZWN0Lm1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QubWFwLy0vb2JqZWN0Lm1hcC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXo0UGxuY2o4d0sxZlFsRGg5NHM3Z2IyQUhUYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmb3Itb3duIjogIl4xLjAuMCIsCisgICAgICAgICJtYWtlLWl0ZXJhdG9yIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QucGljayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QucGljay8tL29iamVjdC5waWNrLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaDZFS3hNRnBTOUxoeS9VMWthWmhRZnRkMTBjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmNlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uY2UvLS9vbmNlLTEuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV0RzYXAzV1dIVXNST3NGOW5GQzY3NTNYYTlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgIm9zLWhvbWVkaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtaG9tZWRpci8tL29zLWhvbWVkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vN3hKaUROdURvTTk0TUZveCs4VklTR3FmN009IgorICAgIH0sCisgICAgIm9zLXRtcGRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy10bXBkaXIvLS9vcy10bXBkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11K1owQnNlYXFGeGMvc2RtL2xjMFZWMzZFblE9IgorICAgIH0sCisgICAgIm9zZW52IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zZW52Ly0vb3NlbnYtMC4xLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTBDV2NDRUNkTVZjMlJ3M1U1dzlaanFYNmdhNnViazF4RFZLeHRCUVBLN3dpcy8wRjJyOVQ2azR5ZEdZaGVjbDdZVUJ4QlZ4aEw1b2lzUHNOeEFQZTJnPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib3MtaG9tZWRpciI6ICJeMS4wLjAiLAorICAgICAgICAib3MtdG1wZGlyIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwLWVhY2gtc2VyaWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3AtZWFjaC1zZXJpZXMvLS9wLWVhY2gtc2VyaWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEta3c4OUV0MGZVT2REUkZlaUxOYndTc2F0ZjNFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInAtcmVkdWNlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwLXJlZHVjZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wLXJlZHVjZS8tL3AtcmVkdWNlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtR01LdzNaTnFScENsS2ZnakgxaWcvYmFrZmZvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBha28iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFrby8tL3Bha28tMC4yLjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04L2RTTDA3M2dqU05xQlliclo3UDFSdjRPblU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFyc2UtZmlsZXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtZmlsZXBhdGgvLS9wYXJzZS1maWxlcGF0aC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBqSVNmMU9xODlGWWR2V0hMei82eDJQV3lKRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1hYnNvbHV0ZSI6ICJeMS4wLjAiLAorICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMCIsCisgICAgICAgICJwYXRoLXJvb3QiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLWpzb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2UtanNvbi8tL3BhcnNlLWpzb24tMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05SUQwQkRUdmdIUWZoR2tKbjQzcUdQVmFUY2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXJyb3ItZXgiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhcnNlLXBhc3N3ZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1wYXNzd2QvLS9wYXJzZS1wYXNzd2QtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iVnVUU2tWcGs3STlOL1FLT0MxdkZtYW81Y1k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFzY2FsY2FzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXNjYWxjYXNlLy0vcGFzY2FsY2FzZS0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMyUGxYb0FHeW0vaUY0VFMyeUs5RmRlUmZ4UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWV4aXN0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWV4aXN0cy8tL3BhdGgtZXhpc3RzLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRCt0c1pQRDhVWTJhZFUzVjc3WXNjQ0oySDBzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwYXRoLWlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtaXMtYWJzb2x1dGUvLS9wYXRoLWlzLWFic29sdXRlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRjB1U2FITlZOUCs4ZXM1cjlUcGFuaHRjWDE4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgta2V5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgta2V5Ly0vcGF0aC1rZXktMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RUnl0dFhURm9VRFRwTEdSRFVEWURNbjBDMEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1yb290IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcm9vdC8tL3BhdGgtcm9vdC0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1rcG9GTXJCd00xek5ncVY4eUNEeU9wSFJiYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXRoLXJvb3QtcmVnZXgiOiAiXjAuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhdGgtcm9vdC1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLXJvb3QtcmVnZXgvLS9wYXRoLXJvb3QtcmVnZXgtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS12OHpjamZXeExjVXNpMFBzT05HTmNzQkxxVzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC10eXBlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtdHlwZS8tL3BhdGgtdHlwZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdjUlBmdVNSMm5CTnBCWGFXa0J3dWsrUDVFRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGVuZC8tL3BlbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lbGZyVlFwbmcva1JVekg4OUdZOVhJNEFlbEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGVyZm9ybWFuY2Utbm93IjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BlcmZvcm1hbmNlLW5vdy8tL3BlcmZvcm1hbmNlLW5vdy0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl3bjA0T1g2a1Q3QnhwTUhyalpMU3pkOG5ucz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicGhhbnRvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGhhbnRvbS8tL3BoYW50b20tNC4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UejgyWGh0UG13Q2sxRkZQbWVjeTd5UkdaRzJidHB6WTJLSTlmY29QVDd6VDlkZXQwQ2NNeWZCRlBwMVM4RHF6c25Rbm04WllFZmR5NTI4bXdWdGtzQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBoYW50b21qcy1wcmVidWlsdCI6ICJeMi4xLjE2IiwKKyAgICAgICAgInNwbGl0IjogIl4xLjAuMSIsCisgICAgICAgICJ3aW5zdG9uIjogIl4yLjQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwaGFudG9tanMtcHJlYnVpbHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMTYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BoYW50b21qcy1wcmVidWlsdC8tL3BoYW50b21qcy1wcmVidWlsdC0yLjEuMTYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03OUlTcEtPV2JUWkhhRTZvdW5pRlNiNHE3Kzg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNlIjogIl40LjAuMyIsCisgICAgICAgICJleHRyYWN0LXppcCI6ICJeMS42LjUiLAorICAgICAgICAiZnMtZXh0cmEiOiAiXjEuMC4wIiwKKyAgICAgICAgImhhc2hhIjogIl4yLjIuMCIsCisgICAgICAgICJrZXciOiAiXjAuNy4wIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4xLjEuOCIsCisgICAgICAgICJyZXF1ZXN0IjogIl4yLjgxLjAiLAorICAgICAgICAicmVxdWVzdC1wcm9ncmVzcyI6ICJeMi4wLjEiLAorICAgICAgICAid2hpY2giOiAiXjEuMi4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpZnkvLS9waWZ5LTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1JRYWFzQkRxRW5xV0lTWTU5eW9zVk13NlF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUvLS9waW5raWUtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jbFZyZ00rZzFJcVhUb0RuY2tqb0R0VDMrSEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLXByb21pc2UvLS9waW5raWUtcHJvbWlzZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlUWFczNmVqV01CcHJKc1hoM1lvZ2loRkQvbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBvc2l4LWNoYXJhY3Rlci1jbGFzc2VzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bvc2l4LWNoYXJhY3Rlci1jbGFzc2VzLy0vcG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BZXJBL2p0YTl4b3FiQUwrcTdqQi92ZmdEcXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJldHR5LWJ5dGVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0eS1ieXRlcy8tL3ByZXR0eS1ieXRlcy0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNpTG9JUVlKclRWVUw0eU5YU0Zaci9CMUhJUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIiwKKyAgICAgICAgIm1lb3ciOiAiXjMuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10RUMxVHFOMEVVNW5lcGhhSjRyQXRUaEh0Qzg2ZE5OOXFDdUVodHNodnBWQmtBVzVaTzdCQVNOOVJFbkY5ZW9YR2NSdWIrcEZ1S0VwT0hFK0hiRU13PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMS4xLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00bURIajJGaHpkbXc1V3pENEtoZDRYeDZWNzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInByb3h5LWZyb20tZW52IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb3h5LWZyb20tZW52Ly0vcHJveHktZnJvbS1lbnYtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NOFVEbVBjT3ArdVcwaDk3Z1hZd3BWZVJ4KzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHNsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjI5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wc2wvLS9wc2wtMS4xLjI5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1BZVVtUTBvTE4wMmZsVkhYV2g5c1NKRjdtY2RGcTBwcGlkL0prRXJ1ZmMzaEdJVi9BTWE4Rm85VmdEby9jVDJqRmRPV29GdkhwOTBxcUJINTRXK2dqUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInB1bnljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bnljb2RlLy0vcHVueWNvZGUtMS40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13TldtT3ljWWdBclk0ZXNQcFNhY2hOMUJoRjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInB1cHBldGVlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdXBwZXRlZXIvLS9wdXBwZXRlZXItMS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWYrMUR4S0hQcWNlNkNYVUJ6MmVWTzJXY0FUZVZlUVNPUEc5R1lhR09iRVpEQ2lDRVV3Rytnb2dqTXNydm43aGUyd0hUcU5WYjVwNlJVcndtcjhYRkJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICJeMy4xLjAiLAorICAgICAgICAiZXh0cmFjdC16aXAiOiAiXjEuNi42IiwKKyAgICAgICAgImh0dHBzLXByb3h5LWFnZW50IjogIl4yLjIuMSIsCisgICAgICAgICJtaW1lIjogIl4yLjAuMyIsCisgICAgICAgICJwcm9ncmVzcyI6ICJeMi4wLjAiLAorICAgICAgICAicHJveHktZnJvbS1lbnYiOiAiXjEuMC4wIiwKKyAgICAgICAgInJpbXJhZiI6ICJeMi42LjEiLAorICAgICAgICAid3MiOiAiXjUuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMy4yLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tZWwramY3bnJ0RWw1UG4xUXg0NnpBUlhLRHBCYnZ6ZXpzZTdwN0xxSU5tZG9JazhQWVA1U3lTYXhFbVl2NlRaMEp5RUtBMWhzQ0lkNkRJaGdJVHRXUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibXMiOiAiXjIuMS4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1zIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRncCtkbDVjR2syOHV0WWt0QnNyRnFBN0hLZ3JoZ1BzZzZaL0VmaFdJNGdsMUh3cThCL0dtWS8wb1haNm5GOGhEVmVzUy9GcG5ZYUQva09XaFlRdnlnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRSthNnZ6cWF6YytLNkx4SnJYNVVQeUtGdkduTDVDWW1xMmpGR05JQldIcGM0UXlFNDkvWU91bWNycFFGSnBmZWptdlJ0Ykp6Z08xelBtTUNxbGJCZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicXMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcXMvLS9xcy02LjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTjVaQVg0L0x4Sm1GKzd3Tjc0cFVENnFBaDkvd252ZFFjanE5VFpqZXZ2WHpTVW83YmZtdzkxc2FxTWp6R1MyeHE5MS9vZE4yZFcvV09sN3FRSE5ER0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJyZWFkLXBrZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkLXBrZy8tL3JlYWQtcGtnLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWYrcVhzMHB5ekhBUjB2S2ZYVnJhN0tlUHlnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImxvYWQtanNvbi1maWxlIjogIl4xLjAuMCIsCisgICAgICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogIl4yLjMuMiIsCisgICAgICAgICJwYXRoLXR5cGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlYWQtcGtnLXVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWQtcGtnLXVwLy0vcmVhZC1wa2ctdXAtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uV1BCTW5iQVpaR05WL0FDcFg5QW9iWkQrd0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmluZC11cCI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZC1wa2ciOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMS4xLjE0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZlBURlR2Wkk0NEV3aE1ZMjNTQjU0V2JBZ2RrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4xIiwKKyAgICAgICAgImlzYXJyYXkiOiAiMC4wLjEiLAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjAuMTAueCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXNhcnJheSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTAuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWloaXMvS21vOUJkK0NhdjhZRGlUbXdYUjd0OD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZWNob2lyIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlY2hvaXIvLS9yZWNob2lyLTAuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFNCTFZOdW9MVmRDNG95V2RXNzBPdlVPTTRRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlc29sdmUiOiAiXjEuMS42IgorICAgICAgfQorICAgIH0sCisgICAgInJlZGVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWRlbnQvLS9yZWRlbnQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16NUZxc2YxZkh4YmZzZ2dpM1c3SDl6RENyOTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaW5kZW50LXN0cmluZyI6ICJeMi4xLjAiLAorICAgICAgICAic3RyaXAtaW5kZW50IjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZWdleC1ub3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVnZXgtbm90Ly0vcmVnZXgtbm90LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KNlNEalVnRHhRajVOdXNuT3RkRnhEd04vK0hXeWtSOEdFTHdjdEo3bWRxaGN5eTF4RWM0U1JGSFVYdnhUcDY2MVlhVktBamZSTFo5Y0NxUzZ0bjMyQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgInNhZmUtcmVnZXgiOiAiXjEuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcGVhdC1lbGVtZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdC1lbGVtZW50Ly0vcmVwZWF0LWVsZW1lbnQtMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFoR3EwWm5WNW01WHRaTE1iK3ZQNzZrY0FNNW5rTHFrMGxwcUF1b2pTS0dnUXRuNGVSaTRaWkdtMm9sbzJ6S0ZIK3NNc1dhcU9DVzFkcUFuT3J1NzJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXBlYXQtc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdC1zdHJpbmcvLS9yZXBlYXQtc3RyaW5nLTEuNi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtamNya2NPSElpcnd0WUEvL1NuZGlodHAxNWpjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcGVhdGluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXBlYXRpbmcvLS9yZXBlYXRpbmctMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VaFRGT3BKdE5WSndkU2Y3cTBGZHZBalFiZG89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZmluaXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1ZXN0IjogeworICAgICAgInZlcnNpb24iOiAiMi44OC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1ZXN0Ly0vcmVxdWVzdC0yLjg4LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5BcUJTcmlqR0xaZE0wV1pOc0luTEpwa0pva0w3MlhZalVwbkIwaXdzUmd4aDdkQjZDT3JIblRCTndOMEUrbEhEQUp6dTdrTEFrRGVZMDh6Mi9BMGhnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXdzLXNpZ24yIjogIn4wLjcuMCIsCisgICAgICAgICJhd3M0IjogIl4xLjguMCIsCisgICAgICAgICJjYXNlbGVzcyI6ICJ+MC4xMi4wIiwKKyAgICAgICAgImNvbWJpbmVkLXN0cmVhbSI6ICJ+MS4wLjYiLAorICAgICAgICAiZXh0ZW5kIjogIn4zLjAuMiIsCisgICAgICAgICJmb3JldmVyLWFnZW50IjogIn4wLjYuMSIsCisgICAgICAgICJmb3JtLWRhdGEiOiAifjIuMy4yIiwKKyAgICAgICAgImhhci12YWxpZGF0b3IiOiAifjUuMS4wIiwKKyAgICAgICAgImh0dHAtc2lnbmF0dXJlIjogIn4xLjIuMCIsCisgICAgICAgICJpcy10eXBlZGFycmF5IjogIn4xLjAuMCIsCisgICAgICAgICJpc3N0cmVhbSI6ICJ+MC4xLjIiLAorICAgICAgICAianNvbi1zdHJpbmdpZnktc2FmZSI6ICJ+NS4wLjEiLAorICAgICAgICAibWltZS10eXBlcyI6ICJ+Mi4xLjE5IiwKKyAgICAgICAgIm9hdXRoLXNpZ24iOiAifjAuOS4wIiwKKyAgICAgICAgInBlcmZvcm1hbmNlLW5vdyI6ICJeMi4xLjAiLAorICAgICAgICAicXMiOiAifjYuNS4yIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjEuMiIsCisgICAgICAgICJ0b3VnaC1jb29raWUiOiAifjIuNC4zIiwKKyAgICAgICAgInR1bm5lbC1hZ2VudCI6ICJeMC42LjAiLAorICAgICAgICAidXVpZCI6ICJeMy4zLjIiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWVzdC1wcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1ZXN0LXByb2dyZXNzLy0vcmVxdWVzdC1wcm9ncmVzcy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVhUYTdWNVljWnpxbHQ0amJ5QlFmM3lPMFRnZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3R0bGVpdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWl6emxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVpenpsZS8tL3JlcXVpenpsZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWFVUERVd3hObW41RzhjM2RVY0ZZL0djTTI5ND0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLy0vcmVzb2x2ZS0xLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlERVUyQ3JTeGUyZWpnUVJzNU1vZGVpSjZYcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXNvbHZlLWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLWRpci8tL3Jlc29sdmUtZGlyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZWFRR1JNTml2b0x5YnYvbk9jbTdVNElFYjBNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImV4cGFuZC10aWxkZSI6ICJeMi4wLjAiLAorICAgICAgICAiZ2xvYmFsLW1vZHVsZXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlc29sdmUtdXJsIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtdXJsLy0vcmVzb2x2ZS11cmwtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1MR04vNTN5Sk92MHFaai9pR3FrSUFHamlCU289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmV0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjE1IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXQvLS9yZXQtMC4xLjE1LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UVGxZcGErT0wrdk1NTkcyNHhTbFFHRUozQi9SekVmVWxMY3Q3YjVHL3l0YXYrd1BycGxDcFZNRnV3elhia2VjSnJiNklZbzFpRmIwUzl2Mzc3NTRtZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmlnaHQtYWxpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmlnaHQtYWxpZ24vLS9yaWdodC1hbGlnbi0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVlUT2JjaS9tbzFGV2lTRU5KT0ZNbGhTR0UrOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbGlnbi10ZXh0IjogIl4wLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyaW1yYWYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmltcmFmLy0vcmltcmFmLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1scmVld0xLL0JsZ2hteHRmSDM2WVlWZzFpOElBY2U0VEk3b2FvNzVJMWcyNDUrNkJjdHFUVlFpQlAzWVVKOUM2RFFPWEpta1lSOVg5ZkNMdENPSmM1dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYiI6ICJeNy4wLjUiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZS1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1idWZmZXIvLS9zYWZlLWJ1ZmZlci01LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2QyVVpCSkRrWGxZN0diSnhmc0U4L252S2tVRVUxRzM4YzFzaU42UVA2YTlQVDlNbUhCOEducHNjU21NSlNvRjhMT0lydDh1ZC93UHRvanlzNEc2K2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNhZmUtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1yZWdleC8tL3NhZmUtcmVnZXgtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RS05tbnpzSGZSNlVQVVJpbmhWOTFJQWp2eTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmV0IjogIn4wLjEuMTAiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZXItYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NhZmVyLWJ1ZmZlci8tL3NhZmVyLWJ1ZmZlci0yLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWVpvM0s4MlNEN1JpeWkwRTFFUVBvakx6N2twZXBuU1FJOUl5UGJISGcxWFhYZXZiNWRKSTd0cHlOMkFEeEdjUWJIRzd2Y3lSSGswY2J3cWNRcmlVdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNlbXZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZW12ZXIvLS9zZW12ZXItNS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJTOVI2UjM1TllnUW4rK2ZrRFdhT21xR29qNEVrOWdHcytEUHhOVVpLdXdFMTgzeGpKcm9LdnlvMUl6VkZlWHZVcnZtQUx5NkZXRDV4cmRKVDI1Z01nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LXZhbHVlLy0vc2V0LXZhbHVlLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1odzB5eGs5R1QvSHI1eUpFWW5ITktZWGtJQThtVkpnZDlkaXRZWkNlMTZaY3pjYUVMWVljZnZhWGVzTkFDazJPOE8wblRpUFFjUWhHVVFqOEpMemVlZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjMiLAorICAgICAgICAic3BsaXQtc3RyaW5nIjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzaGViYW5nLWNvbW1hbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1jb21tYW5kLy0vc2hlYmFuZy1jb21tYW5kLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUktyR1cybGJBem1KYU1PZk5qL3VYZXI5OGVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNoZWJhbmctcmVnZXgiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1yZWdleC8tL3NoZWJhbmctcmVnZXgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ya0wwbDBEQXRDMnl5cGNvVnh5eGtNbU8vcU09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2hlbGxqcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGVsbGpzLy0vc2hlbGxqcy0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5aYm1NSHA0RlVUMWtmTjlwaGcyRHpIYlY3RT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaWduYWwtZXhpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaWduYWwtZXhpdC8tL3NpZ25hbC1leGl0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYzQWp4S0g2aEY0WW81QlhpVVRLM05rYkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNuYXBkcmFnb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc25hcGRyYWdvbi8tL3NuYXBkcmFnb24tMC44LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUZ0eU9uV04vd0NIVFZYT013dlN2MjZkK2tvNXZXbElERDZ6b1VKN0xXOHZoK1pCQzhRZGxqdmVSUCtjck5ydEJ3aW9FVVd5LzRkTXRiQmpBNGlvTmxnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYXNlIjogIl4wLjExLjEiLAorICAgICAgICAiZGVidWciOiAiXjIuMi4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgIm1hcC1jYWNoZSI6ICJeMC4yLjIiLAorICAgICAgICAic291cmNlLW1hcCI6ICJeMC41LjYiLAorICAgICAgICAic291cmNlLW1hcC1yZXNvbHZlIjogIl4wLjUuMCIsCisgICAgICAgICJ1c2UiOiAiXjMuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic25hcGRyYWdvbi1ub2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NuYXBkcmFnb24tbm9kZS8tL3NuYXBkcmFnb24tbm9kZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTzI3bDR4YU1ZdC9SU1E1VFIzdnBXQ0FCNUtiL2N6SWNxVUZPTS9DNGZZY0xuYlpVYzFQa2pUQU1qb2YycEJXYVNUd09VZDZxVUhjRkdWR2o3YUl3bnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInNuYXBkcmFnb24tdXRpbCI6ICJeMy4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kcDY2cno5S1k2clRyNTZOTUV5YnZubS9zT1k9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNuYXBkcmFnb24tdXRpbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbmFwZHJhZ29uLXV0aWwvLS9zbmFwZHJhZ29uLXV0aWwtMy4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1iS2tNZFFLc2pYNEJBTDRiUllUajIxZWRPZjhjTjdYSGRZVUpFZStabjk5aFZFWWNNdktQY3QxSXFOZTcrQVpQaXJuOEJDRE9RQkhRWmtucW1LbFpRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjIuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjUuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC41LjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pZ09kTFJBaDBpMGVvVXlBMk9wR2k2THZQOHc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic291cmNlLW1hcC1yZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAtcmVzb2x2ZS8tL3NvdXJjZS1tYXAtcmVzb2x2ZS0wLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTWpxc3ZOd3l6MXMwazgxR296Lzl2UkJlOVNaZEIwOUJkdysvell5TyszQ3VQazZmb3VUYXhzY0hrZ3RFOGpLdmYwMWtWZmw4cmlIekVSUS9rZWZhU0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImF0b2IiOiAiXjIuMS4xIiwKKyAgICAgICAgImRlY29kZS11cmktY29tcG9uZW50IjogIl4wLjIuMCIsCisgICAgICAgICJyZXNvbHZlLXVybCI6ICJeMC4yLjEiLAorICAgICAgICAic291cmNlLW1hcC11cmwiOiAiXjAuNC4wIiwKKyAgICAgICAgInVyaXgiOiAiXjAuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInNvdXJjZS1tYXAtdXJsIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAtdXJsLy0vc291cmNlLW1hcC11cmwtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QcE5kZmQxell4dVhaWmxXMVZFbzZIdFFoS009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3BkeC1jb3JyZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtY29ycmVjdC8tL3NwZHgtY29ycmVjdC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcTloZWR0enlYSHI1UzBBMXZFUG9LLzdsOE5wZmtGWVRxNmlDWStQbm8yWmJkWlI2V2V4WkZ0cWVWR2tHeFczVEVKTU45MTRaNTVFbkFHTW1lbmxJUVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6ICJeMy4wLjAiLAorICAgICAgICAic3BkeC1saWNlbnNlLWlkcyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3BkeC1leGNlcHRpb25zIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtZXhjZXB0aW9ucy8tL3NwZHgtZXhjZXB0aW9ucy0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMlhRQUNmRWxLaTlTbFZiMUNZYWRLRFh2b2FqUGdCVlBuL2dPUUxyVHZIZEVsYVZocjdaRWJxSmFSbkpMVk5lYUk0Y01FQWdWQ2VCTUtGNk1XUkRDUkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWV4cHJlc3Npb24tcGFyc2UvLS9zcGR4LWV4cHJlc3Npb24tcGFyc2UtMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVlnNkQzWHBSRDRra09tVHBkZ2JVaUVKRktnaEpIMDNmaUMxT1BsbDVoLzBzTzZuZWgyanFSRFZIT1E0by9MTWVhMHRnQ2tiTWdlYTVpcC9lK01rV3lnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcGR4LWV4Y2VwdGlvbnMiOiAiXjIuMS4wIiwKKyAgICAgICAgInNwZHgtbGljZW5zZS1pZHMiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNwZHgtbGljZW5zZS1pZHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1saWNlbnNlLWlkcy8tL3NwZHgtbGljZW5zZS1pZHMtMy4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRmT2ZQY1lHQkI1c0R1UG4zZGVCeXhQaG1mZWdBaHBEWUtTT1haUU44MU95cnJpZjhaQ29kT0x6SzNBZXNFTG5DeDAza2lraHlEd2gwcGZ2dlF2Rjh3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzcGxpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGxpdC8tL3NwbGl0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tVHlPb1Bicml2dFhud25JeFpSRllSclBOdEVGS2xwQjJmdmpTbkNRVWlBQTZxQVp6cXduYTVlbnZLNHVrNk9JZVAxN0NzZEYzclNCR1lWQnNVMFRrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRocm91Z2giOiAiMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGxpdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BsaXQtc3RyaW5nLy0vc3BsaXQtc3RyaW5nLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Oek5WaEpEWXB3Y2VWVmlpOC9IdTZES2ZEMkcrTnJRSGxTL1YvcWd2NzYzRVl1ZFZ3RWNNUU54ZDJsaCswVnJVQnlYTi9vSmtsNWdyT2hZV3ZRVVlpdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNwcmludGYtanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OcjU0TWdyK1dBSDJ6cVB1ZUxibHFybEE2Z3c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3NocGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE1LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NzaHBrLy0vc3NocGstMS4xNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tU2RnTlVhaWRrK2RSVTVNaFl0Tjl6ZWJkekYyaUcwY05QV3k4SEcrVzh5K2ZUMUpuU2toMGZ6enBqT2EwTDdQOGkxUnNjejM4dDBoNGdQY0t6NDN4QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzbjEiOiAifjAuMi4zIiwKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIsCisgICAgICAgICJiY3J5cHQtcGJrZGYiOiAiXjEuMC4wIiwKKyAgICAgICAgImRhc2hkYXNoIjogIl4xLjEyLjAiLAorICAgICAgICAiZWNjLWpzYm4iOiAifjAuMS4xIiwKKyAgICAgICAgImdldHBhc3MiOiAiXjAuMS4xIiwKKyAgICAgICAgImpzYm4iOiAifjAuMS4wIiwKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICJeMi4wLjIiLAorICAgICAgICAidHdlZXRuYWNsIjogIn4wLjE0LjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RhY2stdHJhY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YWNrLXRyYWNlLy0vc3RhY2stdHJhY2UtMC4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVkh4d3MwZm8weXRPRUk2aG9xRlo1ZjNlR2NBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJzdGF0aWMtZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YXRpYy1leHRlbmQvLS9zdGF0aWMtZXh0ZW5kLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWUlDY09jdi9WVE55SnYxZUMxSVBOQjhmdGNZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAib2JqZWN0LWNvcHkiOiAiXjAuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMC4xMC4zMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0wLjEwLjMxLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXVJRHZFRjJiR3dveWZ5RU1CMnJIRk1RK3BRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN0cmlwLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1hbnNpLy0vc3RyaXAtYW5zaS0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWFqaGZ1SVU5bFMxZjhGME9pcStVSjQzR1BjOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1ib20iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtYm9tLy0vc3RyaXAtYm9tLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWWhtb1ZoWlNCSkh6VjRpOXZ4UkhxWngrYXc0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXV0ZjgiOiAiXjAuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWluZGVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1pbmRlbnQvLS9zdHJpcC1pbmRlbnQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ESGxpcHEzdnA3dlVyRFprWUtZNFZTcmhvS0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXN0ZGluIjogIl40LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWpzb24tY29tbWVudHMvLS9zdHJpcC1qc29uLWNvbW1lbnRzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUEZNWlF1a0l3bWw4RHNORWhZd29iSHlncGdvPSIKKyAgICB9LAorICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTUuNS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RalZqd2RYSXQ0MDhNSWlBcUNYNG9VS3NnVTJFcUFHenMyUHBrbTRhUVliam0rWkVXRWNXNFNmRk5UcjR1TU5abWEwZXk0ZjVsZ0xya0IwYVgwUU1vdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzLWZsYWciOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN5bmMtZXhlYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zeW5jLWV4ZWMvLS9zeW5jLWV4ZWMtMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jWDBpekZQd3poM3ZWWlEyTHpxSm91dTVFUVU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGFmZnlkYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWZmeWRiLy0vdGFmZnlkYi0yLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZMeTJTMW9VRzJvdS9DeGRMR2UwNFZDeW9tZz0iCisgICAgfSwKKyAgICAidGhyb3R0bGVpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90aHJvdHRsZWl0Ly0vdGhyb3R0bGVpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5uaFlOdHIwWjBNVVdsbUV0aWFOZ29Vb3JHdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAidGhyb3VnaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm91Z2gvLS90aHJvdWdoLTIuMy44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRGRUSi82cThOWGxnc2Jja0VWMStEb2FpNGZVPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJ0by1vYmplY3QtcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1vYmplY3QtcGF0aC8tL3RvLW9iamVjdC1wYXRoLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtS1hXSXQ3RG40S3dJNEU1bkw0WEI5Sm1lRjY4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidG8tcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tcmVnZXgvLS90by1yZWdleC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRld0bGVOQXRaL0tpMnF0cWVqMkNYVE9heU9IOWJIRFFGK1E0OFZwV3lEWGpiWXhBNFl6OGlEQjMxelhPQlVsT0hIS2lkRGJxR1ZyVFV2UU1QbUJHQnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidG8tcmVnZXgtcmFuZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tcmVnZXgtcmFuZ2UvLS90by1yZWdleC1yYW5nZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZJREJlNTMrdmxtZUp6WitEVTNWV1FGQjJ6Zz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1udW1iZXIiOiAiXjMuMC4wIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNi4xIgorICAgICAgfQorICAgIH0sCisgICAgInRvdWdoLWNvb2tpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90b3VnaC1jb29raWUvLS90b3VnaC1jb29raWUtMi40LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVE1c3JrLzR2RE01NFdKc0ppbzNYTm42SzJzQ0crQ1E4RzVXejZiWmhSWm9BZS8rVHhqV0IvR2xGQW5ZRWJrWVZsT045Rk1rL2ZFM2gyUkxwUFhvNGxRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHNsIjogIl4xLjEuMjQiLAorICAgICAgICAicHVueWNvZGUiOiAiXjEuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgInRyaW0tbmV3bGluZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHJpbS1uZXdsaW5lcy8tL3RyaW0tbmV3bGluZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XSWVXYTdXQ3BGQTZRZXRTVDMwMUFSZ1ZwaE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHVubmVsLWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R1bm5lbC1hZ2VudC8tL3R1bm5lbC1hZ2VudC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUo2WGVvR3Myc0VvS21XWjNTeWtJYVBEOFFQMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInR3ZWV0bmFjbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHdlZXRuYWNsLy0vdHdlZXRuYWNsLTAuMTQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVd1YUJkL0dTMUVWaWFkRUlyNmsvK0hRL1QyUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R5cGVkYXJyYXkvLS90eXBlZGFycmF5LTAuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaG5ySFRqaGtHSHNkUFVmWmxxZU94Y2lEQjNjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVnbGlmeS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS1qcy8tL3VnbGlmeS1qcy0yLjYuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVplb3Zzd1djazVScEx4WCsySHdyTnNGcm10OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MC4yLjYiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC41LjEiLAorICAgICAgICAidWdsaWZ5LXRvLWJyb3dzZXJpZnkiOiAifjEuMC4wIiwKKyAgICAgICAgInlhcmdzIjogIn4zLjEwLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMi4xMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0wLjIuMTAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdHJ2Z3NHZExuWEdYQ01vNDNvd2pmTFVtdzlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVnbGlmeS10by1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS10by1icm93c2VyaWZ5Ly0vdWdsaWZ5LXRvLWJyb3dzZXJpZnktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iZ2trMXIybXRhL2pTZU9hYldNb1VLRDRncmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5jLXBhdGgtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5jLXBhdGgtcmVnZXgvLS91bmMtcGF0aC1yZWdleC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTV6M1QxN0RYeGUyRys2eHJDdWZZeHFhZFVQbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgInZlcnNpb24iOiAiMS44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuOC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVHorMU94QnVZSmY4K2N0QkNmS2w2YjM2VUNJPSIKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS1jb250cmliLy0vdW5kZXJzY29yZS1jb250cmliLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmx0bXdrZUQrUG9yR01uNHk3RGl4OVNNSnNjPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIjEuNi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS42LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaXppeERLemU5ak0zdUxKT1QvaHRSYTZsS2FnPSIKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVuZGVyc2NvcmUuc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUuc3RyaW5nLy0vdW5kZXJzY29yZS5zdHJpbmctMy4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWcrZHBtZ24rWEJuZUxtWFhvK3NHbFc1eFFFdDRFcmtTM21nZU4yR0ZicmVtWWVNQlNKS3I5V2YyS0pwbFFWYWlQWS9mN0ZONmF0b3NXWU5tOW92cllnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogIl4xLjAuMyIsCisgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidW5pY29kZS01LjIuMCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmljb2RlLTUuMi4wLy0vdW5pY29kZS01LjIuMC0wLjcuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS1ZHTFcxQnJpMzB4MDB5djRITk04a0J4b3FGWHIwU2JvNTU3MzVudnJsc3g0UFlCWm9sM1V0b1dnTzQ5MmZTd21zZXR6UEVaenk3M3JiVThPR1hKY0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuaW9uLXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuaW9uLXZhbHVlLy0vdW5pb24tdmFsdWUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1YSEhEVExXNjFkenI0K29NMElJSHVscWhycVE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLXVuaW9uIjogIl4zLjEuMCIsCisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgInNldC12YWx1ZSI6ICJeMC40LjMiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic2V0LXZhbHVlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LXZhbHVlLy0vc2V0LXZhbHVlLTAuNC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWZiQ1BuVDBpM0g5NDVUcnp3NzlHWnV6ZnpQRT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4xIiwKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC4xIiwKKyAgICAgICAgICAgICJ0by1vYmplY3QtcGF0aCI6ICJeMC4zLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5zZXQtdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5zZXQtdmFsdWUvLS91bnNldC12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWczYUhQMzBqTlJlZit4NXZ3Nmp0RGZ5S3RWaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtdmFsdWUiOiAiXjAuMy4xIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaGFzLXZhbHVlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXZhbHVlLy0vaGFzLXZhbHVlLTAuMy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWV4OVl1dHBpeW9KK3dLSUhnQ1ZsU0VXWlhoOD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC4zIiwKKyAgICAgICAgICAgICJoYXMtdmFsdWVzIjogIl4wLjEuNCIsCisgICAgICAgICAgICAiaXNvYmplY3QiOiAiXjIuMC4wIgorICAgICAgICAgIH0sCisgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgICAgICJpc29iamVjdCI6IHsKKyAgICAgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNvYmplY3QvLS9pc29iamVjdC0yLjEuMC50Z3oiLAorICAgICAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOEdWV0VKYWo4ZG91OUdKeStCWElRTmgrRElrPSIsCisgICAgICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAgICAgImlzYXJyYXkiOiAiMS4wLjAiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJoYXMtdmFsdWVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXZhbHVlcy8tL2hhcy12YWx1ZXMtMC4xLjQudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYldIZWxka2QvS201b0NDSnJUaEwvNDlpdDNFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVyaS1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaS1wYXRoLy0vdXJpLXBhdGgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sMGZ3R0RXSk04TWQ0UHpQMkMwVGptY21Makk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXJpeCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91cml4Ly0vdXJpeC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJwTi9lbUxpSCt3ZjBZMUpzMXdwTlFaNmJIST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1c2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXNlLy0vdXNlLTMuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jd0VTVlhsTzN1cmw5WVdsRlcvVEE5Y3NoQ0VodHU3SUtKL3A1c29KL2dHcGo3dmJ2RnJBWS9lSWlvUTZEdzIzS2paaFlnaUlvOEhPczFuUTJ2ci9vUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXRpbC1kZXByZWNhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbC1kZXByZWNhdGUvLS91dGlsLWRlcHJlY2F0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJRMU55ZnB3M25Nbll2dlMxS0tKZ1VHYURNOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dWlkIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V1aWQvLS91dWlkLTMuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15WEptZU5hdzNEbm5LQU9LSkU1MXNML1phWWZXSlJsMXBLOWRyMTlZRkN1ME9iUzIzMUFCMS9MYnFUS1JBUTVrdzhBOTByQTZmcjRyaU9VcFRadlFaQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInY4ZmxhZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdjhmbGFncy8tL3Y4ZmxhZ3MtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZzZ1NLb0Z3MVVwVVBkM2NGZEY3UUduckg2dERlQmdXMUYzdjlneThnTFkwbWxiaUJYcThzb3k4YVFwWTZ4ZWVDakg1SytKdkM2MkFjcDdndGw3d1dBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ2YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UvLS92YWxpZGF0ZS1ucG0tcGFja2FnZS1saWNlbnNlLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1EcEttMlVpL3hONy9IUUtDdHBaeG9SV0JoWjlaMGtxdHlnRzhYQ2dOUThabERueHVRbVdoajU2Nmo4Zk40Q3UzL0ptYmhzRG83ZmNBSnE0czloMjdFdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1jb3JyZWN0IjogIl4zLjAuMCIsCisgICAgICAgICJzcGR4LWV4cHJlc3Npb24tcGFyc2UiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInZlcnJvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmVycm9yLy0vdmVycm9yLTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9oQmNvWEJUcjFYVzRuREIrQ2lHZ3VHTnBBQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICIxLjAuMiIsCisgICAgICAgICJleHRzcHJpbnRmIjogIl4xLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3aGljaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC8tL3doaWNoLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1IeEpkWVdxMU1USVFiSjNudzBjcXNzSG9UTlUyNjdLbHJEdUdaMVdZbHhEU3RVdEtVaE9hSm1oMTEyL1RabUh4eFVmdUpxUFhTT203dER5YXMwT1NJUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNleGUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIndpbmRvdy1zaXplIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpbmRvdy1zaXplLy0vd2luZG93LXNpemUtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WRGpOTHFrN0lDNzZPaG4raUlldTU4bFBuSjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid2luc3RvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aW5zdG9uLy0vd2luc3Rvbi0yLjQuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkJvMlBlcG40aEs0VjAxVWZjV2NEbG1pVlRzN1ZUQjFoN2JnbkIwcmdQMTQ2YlloTXhYMHlwQ3ozbEJPZk54Q080WnVlazd5ZVQreS96TTFPZk13NFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MS4wLjAiLAorICAgICAgICAiY29sb3JzIjogIjEuMC54IiwKKyAgICAgICAgImN5Y2xlIjogIjEuMC54IiwKKyAgICAgICAgImV5ZXMiOiAiMC4xLngiLAorICAgICAgICAiaXNzdHJlYW0iOiAiMC4xLngiLAorICAgICAgICAic3RhY2stdHJhY2UiOiAiMC4wLngiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLStQd0V5am9UZUVyZW5oWkJyNWhYalB2V1I2az0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNvbG9ycyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9ycy8tL2NvbG9ycy0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CRFAwVFlDV2dQM3JZTzBtRHhzTUppNkNwQXM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ3b3Jkd3JhcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93b3Jkd3JhcC8tL3dvcmR3cmFwLTAuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdDVacHUwTHN0QW40UFZnOHJWTEtGK3FoWkQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndyYXBweSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cmFwcHkvLS93cmFwcHktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10U1E5ano3QnFqWHhOa1lGdkEwUU51TUt0cDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3MiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3MvLS93cy01LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamFIRkQ2UEZ2NlVnb0lWZGE2cVpsbHB0UXNNbERFSmtUUWN5Ynp6WERZTTFYTzlZOGVtNjkxRkdNUG1NNDZXR3lMVTR6OUtNZ1FOK3FydXgvbmhsSEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jLWxpbWl0ZXIiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInhtbGNyZWF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94bWxjcmVhdGUvLS94bWxjcmVhdGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rbXYzWXFZS1FUK3ozWTlMQThXeWFTT05NSTg9IgorICAgIH0sCisgICAgInlhcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMy4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3lhcmdzLy0veWFyZ3MtMy4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOSs1NzJGZmRmQjB0T01EblR2dldnZEZESDlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6ICJeMS4wLjIiLAorICAgICAgICAiY2xpdWkiOiAiXjIuMS4wIiwKKyAgICAgICAgImRlY2FtZWxpemUiOiAiXjEuMC4wIiwKKyAgICAgICAgIndpbmRvdy1zaXplIjogIjAuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2UiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYW1lbGNhc2UvLS9jYW1lbGNhc2UtMS4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbTdVd1RTNExWbW1MTEhXTENLUHFxZHFsaWprPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInlhdXpsIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3lhdXpsLy0veWF1emwtMi40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sU2owUXRxeHNpaE9XTFEzbTdHVTRpNE1RQVU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmQtc2xpY2VyIjogIn4xLjAuMSIKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qcy9wYWNrYWdlLmpzb24gYi9saWIvanMvcGFja2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OWNkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvcGFja2FnZS5qc29uCkBAIC0wLDAgKzEsMTkgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAiZGV2RGVwZW5kZW5jaWVzIjogeworICAgICJncnVudCI6ICJeMS4wLjIiLAorICAgICJncnVudC1jbGkiOiAiXjEuMi4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1jb25jYXQiOiAiXjEuMC4xIiwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiAiXjEuMC4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6ICJeMy4wLjEiLAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6ICJeMS4wLjEiLAorICAgICJncnVudC1qc2RvYyI6ICJeMi4yLjEiLAorICAgICJncnVudC1zaGVsbC1zcGF3biI6ICJeMC4zLjEwIiwKKyAgICAianNsaW50IjogIl4wLjEyLjAiCisgIH0sCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImpzZG9jIjogIl4zLjUuNSIsCisgICAgIm5vcHQiOiAiXjQuMC4xIgorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvanMvc3JjL3RocmlmdC5qcyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjgxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvc3JjL3RocmlmdC5qcwpAQCAtMCwwICsxLDE1NjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLypqc2hpbnQgZXZpbDp0cnVlKi8KKworLyoqCisgKiBUaGUgVGhyaWZ0IG5hbWVzcGFjZSBob3VzZXMgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5CisgKiBlbGVtZW50cyBwcm92aWRpbmcgSmF2YVNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDCisgKiBzeXN0ZW0uIEVuZCB1c2VycyB3aWxsIHR5cGljYWxseSBvbmx5IGRpcmVjdGx5IG1ha2UgdXNlIG9mIHRoZQorICogVHJhbnNwb3J0IChUWEhSVHJhbnNwb3J0L1RXZWJTb2NrZXRUcmFuc3BvcnQpIGFuZCBQcm90b2NvbAorICogKFRKU09OUFJvdG9jb2wvVEJpbmFyeVByb3RvY29sKSBjb25zdHJ1Y3RvcnMuCisgKgorICogT2JqZWN0IG1ldGhvZHMgYmVnaW5uaW5nIHdpdGggYSBfXyAoZS5nLiBfX29uT3BlbigpKSBhcmUgaW50ZXJuYWwKKyAqIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSBvYmplY3QncyBvd24gbWV0aG9kcy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgY3JlYXRlcyBvbmUgZ2xvYmFsIG9iamVjdDogVGhyaWZ0CisgKiBDb2RlIGluIHRoaXMgbGlicmFyeSBtdXN0IG5ldmVyIGNyZWF0ZSBhZGRpdGlvbmFsIGdsb2JhbCBpZGVudGlmaWVycywKKyAqIGFsbCBmZWF0dXJlcyBtdXN0IGJlIHNjb3BlZCB3aXRoaW4gdGhlIFRocmlmdCBuYW1lc3BhY2UuCisgKiBAbmFtZXNwYWNlCisgKiBAZXhhbXBsZQorICogICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnaHR0cDovL2xvY2FsaG9zdDo4NTg1Jyk7CisgKiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqICAgICB2YXIgY2xpZW50ID0gbmV3IE15VGhyaWZ0U3ZjQ2xpZW50KHByb3RvY29sKTsKKyAqICAgICB2YXIgcmVzdWx0ID0gY2xpZW50Lk15TWV0aG9kKCk7CisgKi8KK3ZhciBUaHJpZnQgPSB7CisgICAgLyoqCisgICAgICogVGhyaWZ0IEphdmFTY3JpcHQgbGlicmFyeSB2ZXJzaW9uLgorICAgICAqIEByZWFkb25seQorICAgICAqIEBjb25zdCB7c3RyaW5nfSBWZXJzaW9uCisgICAgICogQG1lbWJlcm9mIFRocmlmdAorICAgICAqLworICAgIFZlcnNpb246ICcxLjAuMCcsCisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVE9QICAgLSBFbmQgb2YgYSBzZXQgb2YgZmllbGRzLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVk9JRCAgIC0gTm8gdmFsdWUgKG9ubHkgbGVnYWwgZm9yIHJldHVybiB0eXBlcykuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCT09MICAgLSBUcnVlL0ZhbHNlIGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCWVRFICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkwOCAgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRE9VQkxFIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTE2ICAgIC0gU2lnbmVkIDE2IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTMyICAgIC0gU2lnbmVkIDMyIGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTY0ICAgIC0gU2lnbmVkIDY0IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgU1RSSU5HIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVVEY3ICAgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgVVRGNyBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVFJVQ1QgLSBBIG11bHRpZmllbGQgdHlwZS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIE1BUCAgICAtIEEgY29sbGVjdGlvbiB0eXBlIChtYXAvYXNzb2NpYXRpdmUtYXJyYXkvZGljdGlvbmFyeSkuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTRVQgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkIGFuZCB3aXRob3V0IHJlcGVhdGVkIHZhbHVlcykuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBMSVNUICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjggICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEY4IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjE2ICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEYxNiBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgVHlwZTogeworICAgICAgICBTVE9QOiAwLAorICAgICAgICBWT0lEOiAxLAorICAgICAgICBCT09MOiAyLAorICAgICAgICBCWVRFOiAzLAorICAgICAgICBJMDg6IDMsCisgICAgICAgIERPVUJMRTogNCwKKyAgICAgICAgSTE2OiA2LAorICAgICAgICBJMzI6IDgsCisgICAgICAgIEk2NDogMTAsCisgICAgICAgIFNUUklORzogMTEsCisgICAgICAgIFVURjc6IDExLAorICAgICAgICBTVFJVQ1Q6IDEyLAorICAgICAgICBNQVA6IDEzLAorICAgICAgICBTRVQ6IDE0LAorICAgICAgICBMSVNUOiAxNSwKKyAgICAgICAgVVRGODogMTYsCisgICAgICAgIFVURjE2OiAxNworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgUlBDIG1lc3NhZ2UgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIENBTEwgICAgICAtIFJQQyBjYWxsIHNlbnQgZnJvbSBjbGllbnQgdG8gc2VydmVyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgUkVQTFkgICAgIC0gUlBDIGNhbGwgbm9ybWFsIHJlc3BvbnNlIGZyb20gc2VydmVyIHRvIGNsaWVudC4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEVYQ0VQVElPTiAtIFJQQyBjYWxsIGV4Y2VwdGlvbiByZXNwb25zZSBmcm9tIHNlcnZlciB0byBjbGllbnQuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBPTkVXQVkgICAgLSBPbmV3YXkgUlBDIGNhbGwgZnJvbSBjbGllbnQgdG8gc2VydmVyIHdpdGggbm8gcmVzcG9uc2UuCisgICAgICovCisgICAgTWVzc2FnZVR5cGU6IHsKKyAgICAgICAgQ0FMTDogMSwKKyAgICAgICAgUkVQTFk6IDIsCisgICAgICAgIEVYQ0VQVElPTjogMywKKyAgICAgICAgT05FV0FZOiA0CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBjb3VudCBvZiBhbiBvYmplY3QncyBvd24gcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqIC0gT2JqZWN0IHRvIHRlc3QuCisgICAgICogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzCisgICAgICovCisgICAgb2JqZWN0TGVuZ3RoOiBmdW5jdGlvbihvYmopIHsKKyAgICAgICAgdmFyIGxlbmd0aCA9IDA7CisgICAgICAgIGZvciAodmFyIGsgaW4gb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGspKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBlc3RhYmxpc2ggcHJvdG90eXBlIGluaGVyaXRhbmNlLgorICAgICAqIEBzZWUge0BsaW5rIGh0dHA6Ly9qYXZhc2NyaXB0LmNyb2NrZm9yZC5jb20vcHJvdG90eXBhbC5odG1sfFByb3RvdHlwYWwgSW5oZXJpdGFuY2V9CisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3IgLSBDb250c3RydWN0b3IgZnVuY3Rpb24gdG8gc2V0IGFzIGRlcml2ZWQuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDb25zdHJ1Y3RvciAtIENvbnRzdHJ1Y3RvciBmdW5jdGlvbiB0byBzZXQgYXMgYmFzZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVHlwZSBuYW1lIHRvIHNldCBhcyBuYW1lIHByb3BlcnR5IGluIGRlcml2ZWQgcHJvdG90eXBlLgorICAgICAqLworICAgIGluaGVyaXRzOiBmdW5jdGlvbihjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgbmFtZSkgeworICAgICAgZnVuY3Rpb24gRigpIHt9CisgICAgICBGLnByb3RvdHlwZSA9IHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlOworICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IEYoKTsKKyAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5uYW1lID0gbmFtZSB8fCAnJzsKKyAgICB9Cit9OworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRFeGNlcHRpb24gaW5zdGFuY2UuCisgKiBAY29uc3RydWN0b3IKKyAqIEBhdWdtZW50cyBFcnJvcgorICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgVEV4Y2VwdGlvbiBtZXNzYWdlIChkaXN0aW5jdCBmcm9tIHRoZSBFcnJvciBtZXNzYWdlKS4KKyAqIEBjbGFzc2Rlc2MgVEV4Y2VwdGlvbiBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBleGNlcHRpb25zIHR5cGVzLgorICovCitUaHJpZnQuVEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVEV4Y2VwdGlvbiwgRXJyb3IsICdURXhjZXB0aW9uJyk7CisKKy8qKgorICogUmV0dXJucyB0aGUgbWVzc2FnZSBzZXQgb24gdGhlIGV4Y2VwdGlvbi4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge3N0cmluZ30gZXhjZXB0aW9uIG1lc3NhZ2UKKyAqLworVGhyaWZ0LlRFeGNlcHRpb24ucHJvdG90eXBlLmdldE1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5tZXNzYWdlOworfTsKKworLyoqCisgKiBUaHJpZnQgQXBwbGljYXRpb24gRXhjZXB0aW9uIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5LTk9XTiAgICAgICAgICAgICAgICAgLSBVbmtub3duL3VuZGVmaW5lZC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5LTk9XTl9NRVRIT0QgICAgICAgICAgLSBDbGllbnQgYXR0ZW1wdGVkIHRvIGNhbGwgYSBtZXRob2QgdW5rbm93biB0byB0aGUgc2VydmVyLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX01FU1NBR0VfVFlQRSAgICAtIENsaWVudCBwYXNzZWQgYW4gdW5rbm93bi91bnN1cHBvcnRlZCBNZXNzYWdlVHlwZS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgLSBVbnVzZWQuCisgKiBAcHJvcGVydHkge251bWJlcn0gIEJBRF9TRVFVRU5DRV9JRCAgICAgICAgIC0gVW51c2VkIGluIFRocmlmdCBSUEMsIHVzZWQgdG8gZmxhZyBwcm9wcmlldGFyeSBzZXF1ZW5jZSBudW1iZXIgZXJyb3JzLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBNSVNTSU5HX1JFU1VMVCAgICAgICAgICAtIFJhaXNlZCBieSBhIHNlcnZlciBwcm9jZXNzb3IgaWYgYSBoYW5kbGVyIGZhaWxzIHRvIHN1cHBseSB0aGUgcmVxdWlyZWQgcmV0dXJuIHJlc3VsdC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSU5URVJOQUxfRVJST1IgICAgICAgICAgLSBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBQUk9UT0NPTF9FUlJPUiAgICAgICAgICAtIFRoZSBwcm90b2NvbCBsYXllciBmYWlsZWQgdG8gc2VyaWFsaXplIG9yIGRlc2VyaWFsaXplIGRhdGEuCisgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfVFJBTlNGT1JNICAgICAgIC0gVW51c2VkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlZBTElEX1BST1RPQ09MICAgICAgICAtIFRoZSBwcm90b2NvbCAob3IgdmVyc2lvbikgaXMgbm90IHN1cHBvcnRlZC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgLSBVbnVzZWQuCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0geworICAgIFVOS05PV046IDAsCisgICAgVU5LTk9XTl9NRVRIT0Q6IDEsCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEU6IDIsCisgICAgV1JPTkdfTUVUSE9EX05BTUU6IDMsCisgICAgQkFEX1NFUVVFTkNFX0lEOiA0LAorICAgIE1JU1NJTkdfUkVTVUxUOiA1LAorICAgIElOVEVSTkFMX0VSUk9SOiA2LAorICAgIFBST1RPQ09MX0VSUk9SOiA3LAorICAgIElOVkFMSURfVFJBTlNGT1JNOiA4LAorICAgIElOVkFMSURfUFJPVE9DT0w6IDksCisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6IDEwCit9OworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQGF1Z21lbnRzIFRocmlmdC5URXhjZXB0aW9uCisgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBUQXBwbGljYXRpb25FeGNlcHRpb24gbWVzc2FnZSAoZGlzdGluY3QgZnJvbSB0aGUgRXJyb3IgbWVzc2FnZSkuCisgKiBAcGFyYW0ge1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlfSBbY29kZV0gLSBUaGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSBjb2RlLgorICogQGNsYXNzZGVzYyBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyB1c2VkIHRvIHByb3BhZ2F0ZSBleGNlcHRpb25zIGZyb20gYW4gUlBDIHNlcnZlciBiYWNrIHRvIGEgY2FsbGluZyBjbGllbnQuCisqLworVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGNvZGUpIHsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRoaXMuY29kZSA9IHR5cGVvZiBjb2RlID09PSAnbnVtYmVyJyA/IGNvZGUgOiAwOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBUaHJpZnQuVEV4Y2VwdGlvbiwgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisvKioKKyAqIFJlYWQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gZnJvbSB0aGUgc3VwcGxpZWQgcHJvdG9jb2wuCisgKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBUaGUgaW5wdXQgcHJvdG9jb2wgdG8gcmVhZCBmcm9tLgorICovCitUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB2YXIgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKworICAgICAgICBpZiAocmV0LmZ0eXBlID09IFRocmlmdC5UeXBlLlNUT1ApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGZpZCA9IHJldC5maWQ7CisKKyAgICAgICAgc3dpdGNoIChmaWQpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAocmV0LmZ0eXBlID09IFRocmlmdC5UeXBlLlNUUklORykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJldC52YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuSTMyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlID0gcmV0LnZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOworfTsKKworLyoqCisgKiBXaXRlIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHRvIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBvdXRwdXQgLSBUaGUgb3V0cHV0IHByb3RvY29sIHRvIHdyaXRlIHRvLgorICovCitUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCkgeworICAgIG91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKworICAgIGlmICh0aGlzLm1lc3NhZ2UpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRocmlmdC5UeXBlLlNUUklORywgMSk7CisgICAgICAgIG91dHB1dC53cml0ZVN0cmluZyh0aGlzLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgaWYgKHRoaXMuY29kZSkgeworICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVGhyaWZ0LlR5cGUuSTMyLCAyKTsKKyAgICAgICAgb3V0cHV0LndyaXRlSTMyKHRoaXMuY29kZSk7CisgICAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgb3V0cHV0LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3V0cHV0LndyaXRlU3RydWN0RW5kKCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBjb2RlIHNldCBvbiB0aGUgZXhjZXB0aW9uLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7VGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGV9IGV4Y2VwdGlvbiBjb2RlCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLmdldENvZGUgPSBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5jb2RlOworfTsKKworVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSB7CisgICAgVU5LTk9XTjogMCwKKyAgICBJTlZBTElEX0RBVEE6IDEsCisgICAgTkVHQVRJVkVfU0laRTogMiwKKyAgICBTSVpFX0xJTUlUOiAzLAorICAgIEJBRF9WRVJTSU9OOiA0LAorICAgIE5PVF9JTVBMRU1FTlRFRDogNSwKKyAgICBERVBUSF9MSU1JVDogNgorfTsKKworVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgICAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKK1RocmlmdC5pbmhlcml0cyhUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uLCBUaHJpZnQuVEV4Y2VwdGlvbiwgJ1RQcm90b2NvbEV4Y2VwdGlvbicpOworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgWEhSIHRyYW5zcG9ydC4KKyAqIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHVybCB0aGVuIHlvdSBtdXN0IGhhbmRsZSBYSFIgb3BlcmF0aW9ucyBvbgorICogeW91ciBvd24uIFRoaXMgdHlwZSBjYW4gYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgVHJhbnNwb3J0IGFsaWFzCisgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRYSFJUcmFuc3BvcnQgb2JqZWN0CisgKiB1c2VzIEh0dHBbc10vWEhSLiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCB0aGUgaHR0cFtzXSB0cmFuc3BvcnQKKyAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCisgKiBAZXhhbXBsZQorICogICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NSIpOworICovCitUaHJpZnQuVHJhbnNwb3J0ID0gVGhyaWZ0LlRYSFJUcmFuc3BvcnQgPSBmdW5jdGlvbih1cmwsIG9wdGlvbnMpIHsKKyAgICB0aGlzLnVybCA9IHVybDsKKyAgICB0aGlzLndwb3MgPSAwOworICAgIHRoaXMucnBvcyA9IDA7CisgICAgdGhpcy51c2VDT1JTID0gKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VDT1JTKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMgPSBvcHRpb25zID8gKG9wdGlvbnMuY3VzdG9tSGVhZGVycyA/IG9wdGlvbnMuY3VzdG9tSGVhZGVycyA6IHt9KToge307CisgICAgdGhpcy5zZW5kX2J1ZiA9ICcnOworICAgIHRoaXMucmVjdl9idWYgPSAnJzsKK307CisKK1RocmlmdC5UWEhSVHJhbnNwb3J0LnByb3RvdHlwZSA9IHsKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBicm93c2VyIHNwZWNpZmljIFhtbEh0dHBSZXF1ZXN0IE9iamVjdC4KKyAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAorICAgICAqLworICAgIGdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB9IGNhdGNoIChlMSkgeyB9CisgICAgICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKTsgfSBjYXRjaCAoZTIpIHsgfQorICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUzKSB7IH0KKworICAgICAgICB0aHJvdyAiWW91ciBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBYSFIuIjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIGN1cnJlbnQgWFJIIHJlcXVlc3QgaWYgdGhlIHRyYW5zcG9ydCB3YXMgY3JlYXRlZCB3aXRoIGEgVVJMCisgICAgICogYW5kIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgZmFsc2UuIElmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBjcmVhdGVkIHdpdGgKKyAgICAgKiBhIFVSTCwgb3IgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBUcnVlIGFuZCBubyBjYWxsYmFjayBpcyBwcm92aWRlZCwgb3IKKyAgICAgKiB0aGUgVVJMIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWYgdHJ1ZSB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBPcHRpb25hbCBhc3luYyBjb21wbGV0aW9uIGNhbGxiYWNrCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgb3IgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIuCisgICAgICogQHRocm93cyB7c3RyaW5nfSBJZiBYSFIgZmFpbHMuCisgICAgICovCisgICAgZmx1c2g6IGZ1bmN0aW9uKGFzeW5jLCBjYWxsYmFjaykgeworICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICAgIGlmICgoYXN5bmMgJiYgIWNhbGxiYWNrKSB8fCB0aGlzLnVybCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudXJsID09PSAnJykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgICAgICAgIH0KKworICAgICAgICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKTsKKworICAgICAgICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKSB7CisgICAgICAgICAgICB4cmVxLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICAgICAgLy9JZ25vcmUgWEhSIGNhbGxiYWNrcyB1bnRpbCB0aGUgZGF0YSBhcnJpdmVzLCB0aGVuIGNhbGwgdGhlCisgICAgICAgICAgICAvLyAgY2xpZW50J3MgY2FsbGJhY2sKKyAgICAgICAgICAgIHhyZXEub25yZWFkeXN0YXRlY2hhbmdlID0KKyAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCAmJiB0aGlzLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKHRoaXMucmVzcG9uc2VUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KCkpOworCisgICAgICAgICAgICAvLyBkZXRlY3QgbmV0OjpFUlJfQ09OTkVDVElPTl9SRUZVU0VEIGFuZCBjYWxsIHRoZSBjYWxsYmFjay4KKyAgICAgICAgICAgIHhyZXEub25lcnJvciA9CisgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfSgpKTsKKworICAgICAgICB9CisKKyAgICAgICAgeHJlcS5vcGVuKCdQT1NUJywgdGhpcy51cmwsICEhYXN5bmMpOworCisgICAgICAgIC8vIGFkZCBjdXN0b20gaGVhZGVycworICAgICAgICBPYmplY3Qua2V5cyhzZWxmLmN1c3RvbUhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24ocHJvcCkgeworICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKHByb3AsIHNlbGYuY3VzdG9tSGVhZGVyc1twcm9wXSk7CisgICAgICAgIH0pOworCisgICAgICAgIGlmICh4cmVxLnNldFJlcXVlc3RIZWFkZXIpIHsKKyAgICAgICAgICAgIHhyZXEuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKKyAgICAgICAgICAgIHhyZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0Lmpzb247IGNoYXJzZXQ9dXRmLTgnKTsKKyAgICAgICAgfQorCisgICAgICAgIHhyZXEuc2VuZCh0aGlzLnNlbmRfYnVmKTsKKyAgICAgICAgaWYgKGFzeW5jICYmIGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoeHJlcS5yZWFkeVN0YXRlICE9IDQpIHsKKyAgICAgICAgICAgIHRocm93ICdlbmNvdW50ZXJlZCBhbiB1bmtub3duIGFqYXggcmVhZHkgc3RhdGU6ICcgKyB4cmVxLnJlYWR5U3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeHJlcS5zdGF0dXMgIT0gMjAwKSB7CisgICAgICAgICAgICB0aHJvdyAnZW5jb3VudGVyZWQgYSB1bmtub3duIHJlcXVlc3Qgc3RhdHVzOiAnICsgeHJlcS5zdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJlY3ZfYnVmID0geHJlcS5yZXNwb25zZVRleHQ7CisgICAgICAgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMucnBvcyA9IDA7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBqUXVlcnkgWEhSIG9iamVjdCB0byBiZSB1c2VkIGZvciBhIFRocmlmdCBzZXJ2ZXIgY2FsbC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2xpZW50IC0gVGhlIFRocmlmdCBTZXJ2aWNlIGNsaWVudCBvYmplY3QgZ2VuZXJhdGVkIGJ5IHRoZSBJREwgY29tcGlsZXIuCisgICAgICogQHBhcmFtIHtvYmplY3R9IHBvc3REYXRhIC0gVGhlIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgc2VydmVyLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGFyZ3MgLSBUaGUgb3JpZ2luYWwgY2FsbCBhcmd1bWVudHMgd2l0aCB0aGUgc3VjY2VzcyBjYWxsIGJhY2sgYXQgdGhlIGVuZC4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZWN2X21ldGhvZCAtIFRoZSBUaHJpZnQgU2VydmljZSBDbGllbnQgcmVjZWl2ZSBtZXRob2QgZm9yIHRoZSBjYWxsLgorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IEEgbmV3IGpRdWVyeSBYSFIgb2JqZWN0LgorICAgICAqIEB0aHJvd3Mge3N0cmluZ30gSWYgdGhlIGpRdWVyeSB2ZXJzaW9uIGlzIHByaW9yIHRvIDEuNSBvciBpZiBqUXVlcnkgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIGpxUmVxdWVzdDogZnVuY3Rpb24oY2xpZW50LCBwb3N0RGF0YSwgYXJncywgcmVjdl9tZXRob2QpIHsKKyAgICAgICAgaWYgKHR5cGVvZiBqUXVlcnkgPT09ICd1bmRlZmluZWQnIHx8CisgICAgICAgICAgICB0eXBlb2YgalF1ZXJ5LkRlZmVycmVkID09PSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAgdGhyb3cgJ1RocmlmdC5qcyByZXF1aXJlcyBqUXVlcnkgMS41KyB0byB1c2UgYXN5bmNocm9ub3VzIHJlcXVlc3RzJzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0aHJpZnRUcmFuc3BvcnQgPSB0aGlzOworCisgICAgICAgIHZhciBqcVhIUiA9IGpRdWVyeS5hamF4KHsKKyAgICAgICAgICAgIHVybDogdGhpcy51cmwsCisgICAgICAgICAgICBkYXRhOiBwb3N0RGF0YSwKKyAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKKyAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcsCisgICAgICAgICAgICBkYXRhVHlwZTogJ3RleHQgdGhyaWZ0JywKKyAgICAgICAgICAgIGNvbnZlcnRlcnM6IHsKKyAgICAgICAgICAgICAgICAndGV4dCB0aHJpZnQnIDogZnVuY3Rpb24ocmVzcG9uc2VEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmlmdFRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHJlc3BvbnNlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlY3ZfbWV0aG9kLmNhbGwoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBjb250ZXh0OiBjbGllbnQsCisgICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkubWFrZUFycmF5KGFyZ3MpLnBvcCgpCisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBqcVhIUjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHByb3ZpZGUgdGhlIHByb3RvY29sIHdoZW4gZGVzZXJpYWxpemluZy4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzdXBwbHkgdGhlIHByb3RvY29sLgorICAgICAqLworICAgIHNldFJlY3ZCdWZmZXI6IGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0aGlzLnJlY3ZfYnVmID0gYnVmOworICAgICAgICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLnJwb3MgPSAwOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLCBYSFIgYWx3YXlzIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCisgICAgICovCisgICAgaXNPcGVuOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgd2l0aCBYSFIgdGhpcyBpcyBhIG5vcC4KKyAgICAgKi8KKyAgICBvcGVuOiBmdW5jdGlvbigpIHt9LAorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgd2l0aCBYSFIgdGhpcyBpcyBhIG5vcC4KKyAgICAgKi8KKyAgICBjbG9zZTogZnVuY3Rpb24oKSB7fSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSByZXNwb25zZQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkOiBmdW5jdGlvbihsZW4pIHsKKyAgICAgICAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zOworCisgICAgICAgIGlmIChhdmFpbCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICcnOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGdpdmUgPSBsZW47CisKKyAgICAgICAgaWYgKGF2YWlsIDwgbGVuKSB7CisgICAgICAgICAgICBnaXZlID0gYXZhaWw7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgICAgICAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgICAgICAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkQWxsOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVjdl9idWY7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqLworICAgIHdyaXRlOiBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdGhpcy5zZW5kX2J1ZiA9IGJ1ZjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICAgICAqLworICAgIGdldFNlbmRCdWZmZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKKyAgICB9CisKK307CisKKworLyoqCisgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAqIEBjbGFzc2Rlc2MgVGhlIEFwYWNoZSBUaHJpZnQgVHJhbnNwb3J0IGxheWVyIHBlcmZvcm1zIGJ5dGUgbGV2ZWwgSS9PCisgKiBiZXR3ZWVuIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLiBUaGUgSmF2YVNjcmlwdCBUV2ViU29ja2V0VHJhbnNwb3J0IG9iamVjdAorICogdXNlcyB0aGUgV2ViU29ja2V0IHByb3RvY29sLiBUYXJnZXQgc2VydmVycyBtdXN0IGltcGxlbWVudCBXZWJTb2NrZXQuCisgKiAoc2VlOiBub2RlLmpzIGV4YW1wbGUgc2VydmVyX2h0dHAuanMpLgorICogQGV4YW1wbGUKKyAqICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCgiaHR0cDovL2xvY2FsaG9zdDo4NTg1Iik7CisgKi8KK1RocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24odXJsKSB7CisgICAgdGhpcy5fX3Jlc2V0KHVybCk7Cit9OworCitUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUgPSB7CisgICAgX19yZXNldDogZnVuY3Rpb24odXJsKSB7CisgICAgICB0aGlzLnVybCA9IHVybDsgICAgICAgICAgICAgLy9XaGVyZSB0byBjb25uZWN0CisgICAgICB0aGlzLnNvY2tldCA9IG51bGw7ICAgICAgICAgLy9UaGUgd2ViIHNvY2tldAorICAgICAgdGhpcy5jYWxsYmFja3MgPSBbXTsgICAgICAgIC8vUGVuZGluZyBjYWxsYmFja3MKKyAgICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107ICAgICAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50CisgICAgICB0aGlzLnNlbmRfYnVmID0gJyc7ICAgICAgICAgLy9PdXRib3VuZCBkYXRhLCBpbW11dGFibGUgdW50aWwgc2VudAorICAgICAgdGhpcy5yZWN2X2J1ZiA9ICcnOyAgICAgICAgIC8vSW5ib3VuZCBkYXRhCisgICAgICB0aGlzLnJiX3dwb3MgPSAwOyAgICAgICAgICAgLy9OZXR3b3JrIHdyaXRlIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgICAgICB0aGlzLnJiX3Jwb3MgPSAwOyAgICAgICAgICAgLy9DbGllbnQgcmVhZCBwb3NpdGlvbiBpbiByZWNlaXZlIGJ1ZmZlcgorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBXUyByZXF1ZXN0IGFuZCByZWdpc3RlcnMgY2FsbGJhY2suIFRoZSBhc3luYworICAgICAqIHBhcmFtZXRlciBpcyBpZ25vcmVkIChXUyBmbHVzaCBpcyBhbHdheXMgYXN5bmMpIGFuZCB0aGUgY2FsbGJhY2sKKyAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWdub3JlZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCisgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkKKyAgICAgKi8KKyAgICBmbHVzaDogZnVuY3Rpb24oYXN5bmMsIGNhbGxiYWNrKSB7CisgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgICAgICAvL1NlbmQgZGF0YSBhbmQgcmVnaXN0ZXIgYSBjYWxsYmFjayB0byBpbnZva2UgdGhlIGNsaWVudCBjYWxsYmFjaworICAgICAgICB0aGlzLnNvY2tldC5zZW5kKHRoaXMuc2VuZF9idWYpOworICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obXNnKSB7CisgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgfSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgorICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5wdXNoKHsKKyAgICAgICAgICBidWY6IHRoaXMuc2VuZF9idWYsCisgICAgICAgICAgY2I6IGNhbGxiYWNrCisgICAgICAgIH0pOworICAgICAgfQorICAgIH0sCisKKyAgICBfX29uT3BlbjogZnVuY3Rpb24oKSB7CisgICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgLy9JZiB0aGUgdXNlciBtYWRlIGNhbGxzIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZnVsbHkKKyAgICAgICAgICAvL29wZW4sIHNlbmQgdGhlbSBub3cKKyAgICAgICAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHsKKyAgICAgICAgICAgICBzZWxmLnNvY2tldC5zZW5kKGVsZW0uYnVmKTsKKyAgICAgICAgICAgICBzZWxmLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGVsZW0uY2I7CisgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24obXNnKSB7CisgICAgICAgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgIH0oKSkpOworICAgICAgICAgIH0pOworICAgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107CisgICAgICAgfQorICAgIH0sCisKKyAgICBfX29uQ2xvc2U6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgdGhpcy5fX3Jlc2V0KHRoaXMudXJsKTsKKyAgICB9LAorCisgICAgX19vbk1lc3NhZ2U6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCkgeworICAgICAgICB0aGlzLmNhbGxiYWNrcy5zaGlmdCgpKGV2dC5kYXRhKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgX19vbkVycm9yOiBmdW5jdGlvbihldnQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAnICsgZXZ0LnRvU3RyaW5nKCkpOworICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYnVmZmVyIHRvIHVzZSB3aGVuIHJlY2VpdmluZyBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAgICAgKi8KKyAgICBzZXRSZWN2QnVmZmVyOiBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdGhpcy5yZWN2X2J1ZiA9IGJ1ZjsKKyAgICAgICAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLndwb3MgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy5ycG9zID0gMDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbgorICAgICAqIEByZWFkb25seQorICAgICAqIEByZXR1cm5zIHtib29sZWFufQorICAgICAqLworICAgIGlzT3BlbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09IHRoaXMuc29ja2V0Lk9QRU47CisgICAgfSwKKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICAgICAqLworICAgIG9wZW46IGZ1bmN0aW9uKCkgeworICAgICAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucworICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8vSWYgdGhlcmUgaXMgbm8gc29ja2V0IG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkOgorICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX19vbk1lc3NhZ2UuYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0aGlzLl9fb25FcnJvci5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBjbG9zZTogZnVuY3Rpb24oKSB7CisgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVzcG9uc2UKKyAgICAgKiBidWZmZXIuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbiAtIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZXR1cm4uCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZDogZnVuY3Rpb24obGVuKSB7CisgICAgICAgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICAgICAgICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBnaXZlID0gbGVuOworCisgICAgICAgIGlmIChhdmFpbCA8IGxlbikgeworICAgICAgICAgICAgZ2l2ZSA9IGF2YWlsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJldCA9IHRoaXMucmVhZF9idWYuc3Vic3RyKHRoaXMucnBvcywgZ2l2ZSk7CisgICAgICAgIHRoaXMucnBvcyArPSBnaXZlOworCisgICAgICAgIC8vY2xlYXIgYnVmIHdoZW4gY29tcGxldGU/CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudGlyZSByZXNwb25zZSBidWZmZXIuCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZEFsbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKi8KKyAgICB3cml0ZTogZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRoaXMuc2VuZF9idWYgPSBidWY7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICAgICAqIEByZWFkb25seQorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBnZXRTZW5kQnVmZmVyOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgICAgfQorCit9OworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEpTT04gcHJvdG9jb2wgaW5zdGFuY2UuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KKyAqIEBjbGFzc2Rlc2MgQXBhY2hlIFRocmlmdCBQcm90b2NvbHMgcGVyZm9ybSBzZXJpYWxpemF0aW9uIHdoaWNoIGVuYWJsZXMgY3Jvc3MKKyAqIGxhbmd1YWdlIFJQQy4gVGhlIFByb3RvY29sIHR5cGUgaXMgdGhlIEphdmFTY3JpcHQgYnJvd3NlciBpbXBsZW1lbnRhdGlvbgorICogb2YgdGhlIEFwYWNoZSBUaHJpZnQgVEpTT05Qcm90b2NvbC4KKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqLworVGhyaWZ0LlRKU09OUHJvdG9jb2wgPSBUaHJpZnQuUHJvdG9jb2wgPSBmdW5jdGlvbih0cmFuc3BvcnQpIHsKKyAgICB0aGlzLnRzdGFjayA9IFtdOworICAgIHRoaXMudHBvcyA9IFtdOworICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworfTsKKworLyoqCisgKiBUaHJpZnQgSURMIHR5cGUgSWQgdG8gc3RyaW5nIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBzZWUge0BsaW5rIFRocmlmdC5UeXBlfQorICovCitUaHJpZnQuUHJvdG9jb2wuVHlwZSA9IHt9OworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuQk9PTF0gPSAnInRmIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5CWVRFXSA9ICciaTgiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkkxNl0gPSAnImkxNiInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuSTMyXSA9ICciaTMyIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5JNjRdID0gJyJpNjQiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkRPVUJMRV0gPSAnImRibCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuU1RSVUNUXSA9ICcicmVjIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5TVFJJTkddID0gJyJzdHIiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLk1BUF0gPSAnIm1hcCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuTElTVF0gPSAnImxzdCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuU0VUXSA9ICcic2V0Iic7CisKKy8qKgorICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICogQHJlYWRvbmx5CisgKiBAc2VlIHtAbGluayBUaHJpZnQuVHlwZX0KKyAqLworVGhyaWZ0LlByb3RvY29sLlJUeXBlID0ge307CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUudGYgPSBUaHJpZnQuVHlwZS5CT09MOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmk4ID0gVGhyaWZ0LlR5cGUuQllURTsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5pMTYgPSBUaHJpZnQuVHlwZS5JMTY7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUuaTMyID0gVGhyaWZ0LlR5cGUuSTMyOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmk2NCA9IFRocmlmdC5UeXBlLkk2NDsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5kYmwgPSBUaHJpZnQuVHlwZS5ET1VCTEU7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUucmVjID0gVGhyaWZ0LlR5cGUuU1RSVUNUOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLnN0ciA9IFRocmlmdC5UeXBlLlNUUklORzsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5tYXAgPSBUaHJpZnQuVHlwZS5NQVA7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUubHN0ID0gVGhyaWZ0LlR5cGUuTElTVDsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5zZXQgPSBUaHJpZnQuVHlwZS5TRVQ7CisKKy8qKgorICogVGhlIFRKU09OUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgKiBAcmVhZG9ubHkKKyAqIEBjb25zdCB7bnVtYmVyfSBWZXJzaW9uCisgKiBAbWVtYmVyb2YgVGhyaWZ0LlByb3RvY29sCisgKi8KKyBUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbiA9IDE7CisKK1RocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUgPSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge1RocmlmdC5UcmFuc3BvcnR9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBnZXRUcmFuc3BvcnQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQ7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzZXJ2aWNlIG1ldGhvZCB0byBjYWxsLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtZXNzYWdlVHlwZSAtIFRoZSB0eXBlIG9mIG1ldGhvZCBjYWxsLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBjYWxsIChhbHdheXMgMCBpbiBBcGFjaGUgVGhyaWZ0KS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VCZWdpbjogZnVuY3Rpb24obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKSB7CisgICAgICAgIHRoaXMudHN0YWNrID0gW107CisgICAgICAgIHRoaXMudHBvcyA9IFtdOworCisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5WZXJzaW9uLCAnIicgKworICAgICAgICAgICAgbmFtZSArICciJywgbWVzc2FnZVR5cGUsIHNlcWlkXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgb2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisKKyAgICAgICAgdGhpcy53b2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgIHRoaXMud29iai5wdXNoKG9iaik7CisKKyAgICAgICAgdGhpcy53YnVmID0gJ1snICsgdGhpcy53b2JqLmpvaW4oJywnKSArICddJzsKKworICAgICAgICB0aGlzLnRyYW5zcG9ydC53cml0ZSh0aGlzLndidWYpOworICAgICB9LAorCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0LgorICAgICAqLworICAgIHdyaXRlU3RydWN0QmVnaW46IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaCh7fSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICB3cml0ZVN0cnVjdEVuZDogZnVuY3Rpb24oKSB7CisKKyAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisgICAgICAgIHZhciBzdHJ1Y3QgPSB0aGlzLnRzdGFja1twXTsKKyAgICAgICAgdmFyIHN0ciA9ICd7JzsKKyAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yICh2YXIga2V5IGluIHN0cnVjdCkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyICs9ICcsJzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyICs9IGtleSArICc6JyArIHN0cnVjdFtrZXldOworICAgICAgICB9CisKKyAgICAgICAgc3RyICs9ICd9JzsKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSBzdHI7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdCBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5Qcm90b2NvbC5UeXBlfSBmaWVsZFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gZmllbGRJZCAtIFRoZSBmaWVsZCdzIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICAqLworICAgIHdyaXRlRmllbGRCZWdpbjogZnVuY3Rpb24obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKSB7CisgICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goeyAnZmllbGRJZCc6ICciJyArCisgICAgICAgICAgICBmaWVsZElkICsgJyInLCAnZmllbGRUeXBlJzogVGhyaWZ0LlByb3RvY29sLlR5cGVbZmllbGRUeXBlXQorICAgICAgICB9KTsKKworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4KKyAgICAgKi8KKyAgICB3cml0ZUZpZWxkRW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgIHZhciBmaWVsZEluZm8gPSB0aGlzLnRzdGFjay5wb3AoKTsKKworICAgICAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKworICAgICAgICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIHZhbHVlICsgJ30nOworICAgICAgICB0aGlzLnRwb3MucG9wKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QuCisgICAgICovCisgICAgd3JpdGVGaWVsZFN0b3A6IGZ1bmN0aW9uKCkgeworICAgICAgICAvL25hCisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGtleVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBrZXkuCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gdmFsVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZV0gLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAgKGlnbm9yZWQpLgorICAgICAqLworICAgIHdyaXRlTWFwQmVnaW46IGZ1bmN0aW9uKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVba2V5VHlwZV0sCisgICAgICAgICAgICBUaHJpZnQuUHJvdG9jb2wuVHlwZVt2YWxUeXBlXSwgMF0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgICovCisgICAgd3JpdGVNYXBFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICAgICAgICBpZiAocCA9PSB0aGlzLnRzdGFjay5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpICUgMiAhPT0gMCkgeworICAgICAgICAgICAgdGhpcy50c3RhY2sucHVzaCgnJyk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc2l6ZSA9ICh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkgLyAyOworCisgICAgICAgIHRoaXMudHN0YWNrW3BdW3RoaXMudHN0YWNrW3BdLmxlbmd0aCAtIDFdID0gc2l6ZTsKKworICAgICAgICB2YXIgbWFwID0gJ30nOworICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICAgICAgICAgIHZhciB2ID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgICAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpOworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFwID0gJywnICsgbWFwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoISBpc05hTihrKSkgeyBrID0gJyInICsgayArICciJzsgfSAvL2pzb24gImtleXMiIG5lZWQgdG8gYmUgc3RyaW5ncworICAgICAgICAgICAgbWFwID0gayArICc6JyArIHYgKyBtYXA7CisgICAgICAgIH0KKyAgICAgICAgbWFwID0gJ3snICsgbWFwOworCisgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKTsKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZUxpc3RCZWdpbjogZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVbZWxlbVR5cGVdLCBzaXplXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgICovCisgICAgd3JpdGVMaXN0RW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisKKyAgICAgICAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOworICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZVNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LgorICAgICAqLworICAgIHdyaXRlU2V0RW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisKKyAgICAgICAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOworICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIGJvb2xlYW4gKi8KKyAgICB3cml0ZUJvb2w6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2godmFsdWUgPyAxIDogMCk7CisgICAgfSwKKworICAgIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCisgICAgd3JpdGVCeXRlOiBmdW5jdGlvbihpOCkgeworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGk4KTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUkxNjogZnVuY3Rpb24oaTE2KSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTE2KTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUkzMjogZnVuY3Rpb24oaTMyKSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTMyKTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUk2NDogZnVuY3Rpb24oaTY0KSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTY0KTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24oZGJsKSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goZGJsKTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KKyAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7CisgICAgICAgIC8vIFdlIGRvIG5vdCBlbmNvZGUgdXJpIGNvbXBvbmVudHMgZm9yIHdpcmUgdHJhbnNmZXI6CisgICAgICAgIGlmIChzdHIgPT09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2gobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjb25jYXQgbWF5IGJlIHNsb3dlciB0aGFuIGJ1aWxkaW5nIGEgYnl0ZSBidWZmZXIKKyAgICAgICAgICAgIHZhciBlc2NhcGVkU3RyaW5nID0gJyc7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7ICAgICAgLy8gYSBzaW5nbGUgZG91YmxlIHF1b3RlOiAiCisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXCInKSB7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXCInOyAvLyB3cml0ZSBvdXQgYXM6IFwiCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc2xhc2gKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhcyBkb3VibGUgYmFja3NsYXNoCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxmJzsgIC8vIHdyaXRlIG91dCBhczogXGYiCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xuJykgeyAgICAvLyBhIHNpbmdsZSBuZXdsaW5lOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxuJzsgIC8vIHdyaXRlIG91dCBhczogXG4iCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xyJykgeyAgICAvLyBhIHNpbmdsZSByZXR1cm46IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHInOyAgLy8gd3JpdGUgb3V0IGFzOiBcciIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHQnKSB7ICAgIC8vIGEgc2luZ2xlIHRhYjogaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcdCc7ICAvLyB3cml0ZSBvdXQgYXM6IFx0IgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gY2g7ICAgICAvLyBFbHNlIGl0IG5lZWQgbm90IGJlIGVzY2FwZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGVzY2FwZWRTdHJpbmcgKyAnIicpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCisgICAgd3JpdGVCaW5hcnk6IGZ1bmN0aW9uKGJpbmFyeSkgeworICAgICAgICB2YXIgc3RyID0gJyc7CisgICAgICAgIGlmICh0eXBlb2YgYmluYXJ5ID09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICBzdHIgPSBiaW5hcnk7CisgICAgICAgIH0gZWxzZSBpZiAoYmluYXJ5IGluc3RhbmNlb2YgVWludDhBcnJheSkgeworICAgICAgICAgICAgdmFyIGFyciA9IGJpbmFyeTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dyaXRlQmluYXJ5IG9ubHkgYWNjZXB0cyBTdHJpbmcgb3IgVWludDhBcnJheS4nKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGJ0b2Eoc3RyKSArICciJyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtzdHJpbmd9IGZuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kLgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgY2FsbC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gcnNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWVzc2FnZSAoMCBpbiBUaHJpZnQgUlBDKS4KKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuCisgICAgICogQHJldHVybnMge0Fub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRNZXNzYWdlQmVnaW46IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJzdGFjayA9IFtdOworICAgICAgICB0aGlzLnJwb3MgPSBbXTsKKworICAgICAgICBpZiAodHlwZW9mIEpTT04gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBKU09OLnBhcnNlID09PSAnZnVuY3Rpb24nKSB7CisgICAgICAgICAgICB0aGlzLnJvYmogPSBKU09OLnBhcnNlKHRoaXMudHJhbnNwb3J0LnJlYWRBbGwoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpRdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IGpRdWVyeS5wYXJzZUpTT04odGhpcy50cmFuc3BvcnQucmVhZEFsbCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IGV2YWwodGhpcy50cmFuc3BvcnQucmVhZEFsbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHZhciB2ZXJzaW9uID0gdGhpcy5yb2JqLnNoaWZ0KCk7CisKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gVGhyaWZ0LlByb3RvY29sLlZlcnNpb24pIHsKKyAgICAgICAgICAgIHRocm93ICdXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogJyArIHZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICByLmZuYW1lID0gdGhpcy5yb2JqLnNoaWZ0KCk7CisgICAgICAgIHIubXR5cGUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgICAgICAgci5yc2VxaWQgPSB0aGlzLnJvYmouc2hpZnQoKTsKKworCisgICAgICAgIC8vZ2V0IHRvIHRoZSBtYWluIG9iagorICAgICAgICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucm9iai5zaGlmdCgpKTsKKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWVzc2FnZS4gKi8KKyAgICByZWFkTWVzc2FnZUVuZDogZnVuY3Rpb24oKSB7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0IChpZ25vcmVkKQorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGZuYW1lIHByb3BlcnR5CisgICAgICovCisgICAgcmVhZFN0cnVjdEJlZ2luOiBmdW5jdGlvbihuYW1lKSB7CisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHIuZm5hbWUgPSAnJzsKKworICAgICAgICAvL2luY2FzZSB0aGlzIGlzIGFuIGFycmF5IG9mIHN0cnVjdHMKKyAgICAgICAgaWYgKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0uc2hpZnQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LiAqLworICAgIHJlYWRTdHJ1Y3RFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMl0gaW5zdGFuY2VvZiBBcnJheSkgeworICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRGaWVsZEJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtzdHJpbmd9IGZuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIChhbHdheXMgJycpLgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IGZpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4KKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRGaWVsZEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRGaWVsZEJlZ2luOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB7fTsKKworICAgICAgICB2YXIgZmlkID0gLTE7CisgICAgICAgIHZhciBmdHlwZSA9IFRocmlmdC5UeXBlLlNUT1A7CisKKyAgICAgICAgLy9nZXQgYSBmaWVsZElkCisgICAgICAgIGZvciAodmFyIGYgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgeworICAgICAgICAgICAgaWYgKGYgPT09IG51bGwpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpZCA9IHBhcnNlSW50KGYsIDEwKTsKKyAgICAgICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7CisKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07CisKKyAgICAgICAgICAgIC8vcmVtb3ZlIHNvIHdlIGRvbid0IHNlZSBpdCBhZ2FpbgorICAgICAgICAgICAgZGVsZXRlIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07CisKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2goZmllbGQpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWQgIT0gLTEpIHsKKworICAgICAgICAgICAgLy9zaG91bGQgb25seSBiZSAxIG9mIHRoZXNlIGJ1dCB0aGlzIGlzIHRoZSBvbmx5CisgICAgICAgICAgICAvL3dheSB0byBtYXRjaCBhIGtleQorICAgICAgICAgICAgZm9yICh2YXIgaSBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7CisgICAgICAgICAgICAgICAgaWYgKFRocmlmdC5Qcm90b2NvbC5SVHlwZVtpXSA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmdHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVtpXTsKKyAgICAgICAgICAgICAgICB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSA9CisgICAgICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgci5mbmFtZSA9ICcnOworICAgICAgICByLmZ0eXBlID0gZnR5cGU7CisgICAgICAgIHIuZmlkID0gZmlkOworCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4gKi8KKyAgICByZWFkRmllbGRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpOworCisgICAgICAgIC8vZ2V0IGJhY2sgdG8gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBzdGFjaworICAgICAgICB3aGlsZSAodGhpcy5yc3RhY2subGVuZ3RoID4gcG9zKSB7CisgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgfQorCisgICAgfSwKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkTWFwQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBrdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSB2dHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwLgorICAgICAqLworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZE1hcEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRNYXBCZWdpbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBtYXAgPSB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgdmFyIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChtYXApOworICAgICAgICAgIG1hcCA9IGZpcnN0OworICAgICAgICAgIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgciA9IHt9OworICAgICAgICByLmt0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ZpcnN0XTsKKyAgICAgICAgci52dHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVttYXAuc2hpZnQoKV07CisgICAgICAgIHIuc2l6ZSA9IG1hcC5zaGlmdCgpOworCisKKyAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy5yc3RhY2sucHVzaChtYXAuc2hpZnQoKSk7CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4gKi8KKyAgICByZWFkTWFwRW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRDb2xCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGV0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZENvbEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRMaXN0QmVnaW46IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgbGlzdCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworCisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHIuZXR5cGUgPSBUaHJpZnQuUHJvdG9jb2wuUlR5cGVbbGlzdC5zaGlmdCgpXTsKKyAgICAgICAgci5zaXplID0gbGlzdC5zaGlmdCgpOworCisgICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7CisgICAgICAgIHRoaXMucnN0YWNrLnB1c2gobGlzdC5zaGlmdCgpKTsKKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4gKi8KKyAgICByZWFkTGlzdEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCkgLSAyOworICAgICAgICB2YXIgc3QgPSB0aGlzLnJzdGFjazsKKyAgICAgICAgc3QucG9wKCk7CisgICAgICAgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5ICYmIHN0Lmxlbmd0aCA+IHBvcyAmJiBzdFtwb3NdLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICBzdC5wdXNoKHN0W3Bvc10uc2hpZnQoKSk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZFNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LiAqLworICAgIHJlYWRTZXRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkTGlzdEVuZCgpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0bworICAgICAqICBGYWxzZSB1bmxlc3MgdGhlIG5leHQgbnVtYmVyIGluIHRoZSBwcm90b2NvbCBidWZmZXIKKyAgICAgKiAgaXMgMSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgcHJvcGVydHkgaXMgVHJ1ZSAqLworICAgIHJlYWRCb29sOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKKworICAgICAgICBpZiAociAhPT0gbnVsbCAmJiByLnZhbHVlID09ICcxJykgeworICAgICAgICAgICAgci52YWx1ZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLnZhbHVlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkQnl0ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkSTE2OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRJMzI6IGZ1bmN0aW9uKGYpIHsKKyAgICAgICAgaWYgKGYgPT09IHVuZGVmaW5lZCkgeworICAgICAgICAgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHIgPSB7fTsKKworICAgICAgICBpZiAoZiBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgICAgICAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgICAgICByLnZhbHVlID0gdW5kZWZpbmVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIWYuaXNSZXZlcnNlZCkgeworICAgICAgICAgICAgICAgICAgICBmLnJldmVyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZi5pc1JldmVyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgci52YWx1ZSA9IGYucG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZiBpbnN0YW5jZW9mIE9iamVjdCkgeworICAgICAgICAgICBmb3IgKHZhciBpIGluIGYpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrLnB1c2goZltpXSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGZbaV07CisKKyAgICAgICAgICAgICAgICByLnZhbHVlID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgci52YWx1ZSA9IGY7CisgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRJNjQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZEJpbmFyeTogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkSTMyKCk7CisgICAgICAgIHIudmFsdWUgPSBhdG9iKHIudmFsdWUpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhICovCisgICAgc2tpcDogZnVuY3Rpb24odHlwZSkgeworICAgICAgICB2YXIgcmV0LCBpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5CT09MOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRCb29sKCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkQnl0ZSgpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkkxNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTE2KCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuSTMyOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEk2NCgpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkRG91YmxlKCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRTdHJpbmcoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwKHJldC5mdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLk1BUDoKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXQuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucnN0YWNrLmxlbmd0aCA+IHRoaXMucnBvc1t0aGlzLnJwb3MubGVuZ3RoIC0gMV0gKyAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwKHJldC5rdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcChyZXQudnR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TRVQ6CisgICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5yZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmV0LnNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0LmV0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmV0LnNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0LmV0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBNdXRpbHBsZXhQcm90b2NvbCBJbXBsZW1lbnRhdGlvbiBhcyBhIFdyYXBwZXIgZm9yIFRocmlmdC5Qcm90b2NvbAorICogQGNvbnN0cnVjdG9yCisgKi8KK1RocmlmdC5NdWx0aXBsZXhQcm90b2NvbCA9IGZ1bmN0aW9uKHNydk5hbWUsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSkgeworICAgIFRocmlmdC5Qcm90b2NvbC5jYWxsKHRoaXMsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSk7CisgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNydk5hbWU7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5NdWx0aXBsZXhQcm90b2NvbCwgVGhyaWZ0LlByb3RvY29sLCAnbXVsdGlwbGV4UHJvdG9jb2wnKTsKKworLyoqIE92ZXJyaWRlIHdyaXRlTWVzc2FnZUJlZ2luIG1ldGhvZCBvZiBwcm90b3R5cGUqLworVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisKKyAgICBpZiAodHlwZSA9PT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgfHwgdHlwZSA9PT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgdGhpcy5zZXJ2aWNlTmFtZSArICc6JyArIG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgc2VxaWQpOworICAgIH0KK307CisKK1RocmlmdC5NdWx0aXBsZXhlciA9IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuc2VxaWQgPSAwOworfTsKKworLyoqIEluc3RhbnRpYXRlcyBhIG11bHRpcGxleGVkIGNsaWVudCBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7U3RyaW5nfSBzZXJ2aWNlTmFtZSAtIFRoZSB0cmFuc3BvcnQgdG8gc2VyaWFsaXplIHRvL2Zyb20uCisgKiBAcGFyYW0ge1RocmlmdC5TZXJ2aWNlQ2xpZW50fSBTQ2wgLSBUaGUgU2VydmljZSBDbGllbnQgQ2xhc3MKKyAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVGhyaWZ0LlRyYW5zcG9ydCBpbnN0YW5jZSB3aGljaCBwcm92aWRlcyByZW1vdGUgaG9zdDpwb3J0CisgKiBAZXhhbXBsZQorICogICAgdmFyIG1wID0gbmV3IFRocmlmdC5NdWx0aXBsZXhlcigpOworICogICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0OjkwOTAvZm9vLnRocmlmdCIpOworICogICAgdmFyIHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICogICAgdmFyIGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgnQXV0aFNlcnZpY2UnLCBBdXRoU2VydmljZUNsaWVudCwgdHJhbnNwb3J0KTsKKyovCitUaHJpZnQuTXVsdGlwbGV4ZXIucHJvdG90eXBlLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uKHNlcnZpY2VOYW1lLCBTQ2wsIHRyYW5zcG9ydCkgeworICAgIGlmIChTQ2wuQ2xpZW50KSB7CisgICAgICAgIFNDbCA9IFNDbC5DbGllbnQ7CisgICAgfQorICAgIHZhciBzZWxmID0gdGhpczsKKyAgICBTQ2wucHJvdG90eXBlLm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgeworICAgICAgICBzZWxmLnNlcWlkICs9IDE7CisgICAgICAgIHJldHVybiBzZWxmLnNlcWlkOworICAgIH07CisgICAgdmFyIGNsaWVudCA9IG5ldyBTQ2wobmV3IFRocmlmdC5NdWx0aXBsZXhQcm90b2NvbChzZXJ2aWNlTmFtZSwgdHJhbnNwb3J0KSk7CisKKyAgICByZXR1cm4gY2xpZW50OworfTsKKworCisKK3ZhciBjb3B5TGlzdCwgY29weU1hcDsKKworY29weUxpc3QgPSBmdW5jdGlvbihsc3QsIHR5cGVzKSB7CisKKyAgaWYgKCFsc3QpIHtyZXR1cm4gbHN0OyB9CisKKyAgdmFyIHR5cGU7CisKKyAgaWYgKHR5cGVzLnNoaWZ0ID09PSB1bmRlZmluZWQpIHsKKyAgICB0eXBlID0gdHlwZXM7CisgIH0KKyAgZWxzZSB7CisgICAgdHlwZSA9IHR5cGVzWzBdOworICB9CisgIHZhciBUeXBlID0gdHlwZTsKKworICB2YXIgbGVuID0gbHN0Lmxlbmd0aCwgcmVzdWx0ID0gW10sIGksIHZhbDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgdmFsID0gbHN0W2ldOworICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICByZXN1bHQucHVzaCh2YWwpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICByZXN1bHQucHVzaCh0eXBlKHZhbCwgdHlwZXMuc2xpY2UoMSkpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXN1bHQucHVzaChuZXcgVHlwZSh2YWwpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK2NvcHlNYXAgPSBmdW5jdGlvbihvYmosIHR5cGVzKSB7CisKKyAgaWYgKCFvYmopIHtyZXR1cm4gb2JqOyB9CisKKyAgdmFyIHR5cGU7CisKKyAgaWYgKHR5cGVzLnNoaWZ0ID09PSB1bmRlZmluZWQpIHsKKyAgICB0eXBlID0gdHlwZXM7CisgIH0KKyAgZWxzZSB7CisgICAgdHlwZSA9IHR5cGVzWzBdOworICB9CisgIHZhciBUeXBlID0gdHlwZTsKKworICB2YXIgcmVzdWx0ID0ge30sIHZhbDsKKyAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsKKyAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7CisgICAgICB2YWwgPSBvYmpbcHJvcF07CisgICAgICBpZiAodHlwZSA9PT0gbnVsbCkgeworICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWw7CisgICAgICB9CisgICAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gbmV3IFR5cGUodmFsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK1RocmlmdC5jb3B5TWFwID0gY29weU1hcDsKK1RocmlmdC5jb3B5TGlzdCA9IGNvcHlMaXN0OwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvanMvdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNDkyN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2V4cG9ydCBDTEFTU1BBVEgKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKKwkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KKworY2hlY2stbG9jYWw6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9SRUFETUUubWQgYi9saWIvanMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMTQwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDY4IEBACitUaHJpZnQgSmF2YXNjcmlwdCBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGJyb3dzZXIgYmFzZWQgQXBhY2hlIFRocmlmdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cworUlBDIGNsaWVudHMgdXNpbmcgdGhlIEpTT04gcHJvdG9jb2wgb3ZlciBIdHRwW3NdIHdpdGggWEhSCithbmQgV2ViU29ja2V0LgorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVGVzdCBTZXJ2ZXJzCistLS0tLS0tLS0tLS0KK2Ryd3hyLXhyLXggMiByYW5keSByYW5keSAgNDA5NiBGZWIgIDggMTU6NDQgc2VjCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDIxODMgRmViICA5IDA0OjAxIHNlcnZlcl9odHRwLmpzCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDIzODYgRmViICA5IDA1OjM5IHNlcnZlcl9odHRwcy5qcworCitzZXJ2ZXJfaHR0cC5qcyBpcyBhIE5vZGUuanMgd2ViIHNlcnZlciB3aGljaCBzdXBwb3J0IHRoZQorc3RhbmRhcmQgQXBhY2hlIFRocmlmdCB0ZXN0IHN1aXRlICh0aHJpZnQvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCkuCitUaGUgc2VydmVyIHN1cHBvcnRzIEFwYWNoZSBUaHJpZnQgWEhSIGFuZCBXZWJTb2NrZXQgY2xpZW50cy4KKworc2VydmVyX2h0dHBzLmpzIGlzIHRoZSBzYW1lIGJ1dCB1c2VzIFNTTC9UTFMuIFRoZSBzZXJ2ZXIga2V5IAorYW5kIGNlcnQgYXJlIHB1bGxlZCBmcm9tIHRoZSB0aHJpZnQvdGVzdC9rZXlzIGZvbGRlci4KKworQm90aCBvZiB0aGVzZSBzZXJ2ZXJzIHN1cHBvcnQgV2ViU29ja2V0ICh0aGUgaHR0cDogc3VwcG9ydHMgd3M6LAorYW5kIHRoZSBodHRwczogc3VwcG9ydCB3c3M6KS4KKworVG8gcnVuIHRoZSBjbGllbnQgdGVzdCB3aXRoIHRoZSBKYXZhIHRlc3Qgc2VydmVyIHVzZTogCiskIG1ha2UgY2hlY2sgKHJlcXVpcmVzIHRoZSBBcGFjaGUgVGhyaWZ0IEphdmEgYnJhbmNoIAorYW5kIG1ha2UgY2hlY2sgbXVzdCBoYXZlIGJlZW4gcnVuIGluIHRocmlmdC9saWIvamF2YSAKK3ByZXZpb3VzbHkpLgorCitUbyBydW4gdGhlIGNsaWVudCB0ZXN0cyB3aXRoIHRoZSBOb2RlIHNlcnZlcnMgcnVuIHRoZSBncnVudAorIGJ1aWxkIGluIHRoZSBwYXJlbnQganMgZGlyZWN0b3J5IChzZWUgUkVBRE1FIHRoZXJlKS4KKyAKK1Rlc3QgQ2xpZW50cworLS0tLS0tLS0tLS0tCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgMTM1NTggRmViICA5IDA3OjE4IHRlc3QtYXN5bmMuanMKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgNTcyNCBGZWIgIDkgMDM6NDUgdGVzdF9oYW5kbGVyLmpzCistcnd4ci14ci14IDEgcmFuZHkgcmFuZHkgIDI3MTkgRmViICA5IDA2OjA0IHRlc3QuaHRtbAorLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5ICA0NjExIEZlYiAgOSAwNjowNSB0ZXN0LWpxLmpzCistcnd4ci14ci14IDEgcmFuZHkgcmFuZHkgMTIxNTMgRmViICA5IDA2OjA0IHRlc3QuanMKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgMjU5MyBGZWIgIDkgMDY6MTYgdGVzdC1ub2pxLmh0bWwKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgMTQ1MCBGZWIgIDkgMDY6MTQgdGVzdC1ub2pxLmpzCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDI4NDcgRmViICA5IDA2OjMxIHRlc3R3cy5odG1sCisKK1RoZXJlIGFyZSB0aHJlZSBodG1sIHRlc3QgZHJpdmVyIGZpbGVzLCBhbGwgb2Ygd2hpY2ggYXJlCitRVW5pdCBiYXNlZC4gdGVzdC5odG1sIHRlc3RzIHRoZSBBcGFjaGUgVGhyaWZ0IGpRdWVyeQorZ2VuZXJhdGVkIGNvZGUgKHRocmlmdCAtZ2VuIGpzOmpxdWVyeSkuIFRoZSB0ZXN0LW5vanEuaHRtbAorcnVucyBhbG1vc3QgaWRlbnRpY2FsIHRlc3RzIGFnYWluc3Qgbm9ybWFsIEphdmFTY3JpcHQgYnVpbGRzCisodGhyaWZ0IC1nZW4ganMpLiBCb3RoIG9mIHRoZSBwcmV2aW91cyB0ZXN0cyB1c2UgdGhlIFhIUiAKK3RyYW5zcG9ydC4gVGhlIHRlc3R3cy5odG1sIHJ1bnMgc2ltaWxhciB0ZXN0cyB1c2luZyB0aGUKK1dlYlNvY2tldCB0cmFuc3BvcnQuIFRoZSB0ZXN0Ki5qcyBmaWxlcyBhcmUgbG9hZGVkIGJ5IHRoZQoraHRtbCBkcml2ZXJzIGFuZCBjb250YWluIHRoZSBhY3R1YWwgQXBhY2hlIFRocmlmdCB0ZXN0cy4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L1J1blRlc3RTZXJ2ZXIuc2ggYi9saWIvanMvdGVzdC9SdW5UZXN0U2VydmVyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NzRmN2M1Li4wMDAwMDAwCi0tLSBhL2xpYi9qcy90ZXN0L1J1blRlc3RTZXJ2ZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIS9iaW4vYmFzaCAKLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPRzRKPSIuLi8uLi9qYXZhL2J1aWxkL2l2eS9saWIvc2xmNGotYXBpLTEuNS44LmphcjouLi8uLi9qYXZhL2J1aWxkL2l2eS9saWIvbG9nNGotMS4yLjE1LmphcjouLi8uLi9qYXZhL2J1aWxkL2l2eS9saWIvc2xmNGotc2ltcGxlLTEuNS44LmphciIKLUhUVFBDT1JFPSIuL2h0dHBjb3JlLTQuMC4xLmphciIKLQotaWYgWyAtZiAke0hUVFBDT1JFfSBdCi10aGVuCi0gICAgZWNobyAiY29tcGlsaW5nIHRlc3QuLi4iCi1lbHNlCi0gICAgZWNobyAiTWlzc2luZyByZXF1aXJlZCBmaWxlICR7SFRUUENPUkV9IgotICAgIGVjaG8gIllvdSBjYW4gZG93bmxvYWQgdGhpcyBmcm9tIGh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9odHRwY29tcG9uZW50cy9odHRwY29yZS9iaW5hcnkvaHR0cGNvbXBvbmVudHMtY29yZS00LjAuMS1iaW4udGFyLmd6IgotICAgIGVjaG8gIlBsYWNlIHRoZSBqYXIgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCi0gICAgZXhpdAotZmkKLQotLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBqYXZhIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLS4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCi1qYXZhYyAtY3AgJHtMT0c0Sn06Li4vLi4vamF2YS9saWJ0aHJpZnQuamFyIGdlbi1qYXZhL3RocmlmdC90ZXN0LyouamF2YQotamF2YWMgLWNwICR7TE9HNEp9OiR7SFRUUENPUkV9Oi4uLy4uL2phdmEvbGlidGhyaWZ0LmphcjpnZW4tamF2YS8gc3JjL3Rlc3QvKi5qYXZhIAotamF2YSAtY3AgICR7TE9HNEp9OiR7SFRUUENPUkV9Oi4uLy4uL2phdmEvbGlidGhyaWZ0LmphcjpnZW4tamF2YTpzcmMgdGVzdC5IdHRwZCAuLi8KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorIyBNYXZlbiBBbnQgdGFza3MgSmFyIGRldGFpbHMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9idWlsZC54bWwgYi9saWIvanMvdGVzdC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRjMTM2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L2J1aWxkLnhtbApAQCAtMCwwICsxLDI0OSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9IkphdmEgU2NyaXB0IFRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iCisgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiCisgIHhtbG5zOmpzbD0iYW50bGliOmNvbS5nb29nbGVjb2RlLmpzbGludDRqYXZhIj4KKworICA8ZGVzY3JpcHRpb24+SmF2YSBTY3JpcHQgVGVzdCBiYXNlZCBvbiBUaHJpZnQgSmF2YSBMaWJyYXJ5PC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0ic3JjIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuamF2YSIgbG9jYXRpb249Imdlbi1qYXZhIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuanMiIGxvY2F0aW9uPSJnZW4tanMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIiAvPgorICA8cHJvcGVydHkgbmFtZT0iamFyLmZpbGUiIGxvY2F0aW9uPSIke2J1aWxkfS9qc3Rlc3QuamFyIiAvPgorCisgIDwhLS0gdGhlIHJvb3QgZGlyZWN0b3J5LCB3aGVyZSB5b3UgdW5wYWNrIHRocmlmdCBkaXN0aWJ1dGlvbiAoZS5nLiB0aHJpZnQtMC54LngudGFyLmd6KSAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2xpYi9qYXZhIiAvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPCEtLSBJbmNsdWRlIHRoZSBiYXNlIGphdmEgcHJvcGVydGllcyBmaWxlIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2dyYWRsZS5wcm9wZXJ0aWVzIiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuY29tcGlsZXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2NvbXBpbGVyL2NwcC90aHJpZnQiIC8+CisKKyAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGR9L2xpYiI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgIDwvcGF0aD4KKworICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgorICAgIDxwYXRoIHJlZmlkPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFyLmZpbGV9IiAvPgorICA8L3BhdGg+CisKKyAgPHRhcmdldCBuYW1lPSJkZXBlbmRlbmNpZXMiPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMiI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgICAgWW91IG5lZWQgbGlidGhyaWZ0Ki5qYXIgYW5kIGxpYnRocmlmdCp0ZXN0LmphciBsb2NhdGVkIGF0CisgICAgICAke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicworICAgICAgRGlkIHlvdSBjb21waWxlIFRocmlmdCBKYXZhIGxpYnJhcnkgYW5kIGl0cyB0ZXN0IHN1aXRlIGJ5ICJhbnQgY29tcGlsZS10ZXN0Ij8KKyAgICA8L2ZhaWw+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIke3RocmlmdC5kaXJ9IiBpbmNsdWRlcz0iY29tcGlsZXIvY3BwL3RocmlmdCIvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIFRocmlmdCBjb21waWxlciBpcyBtaXNzaW5nICEKKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iZGVwZW5kZW5jaWVzIj4KKyAgICA8dHN0YW1wIC8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9qcy9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9sb2ciLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS90ZXN0Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vdGVzdC9sb2ciLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkb3dubG9hZF9qc2xpYnMiPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjExLjMubWluLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvanF1ZXJ5LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0yLjYuMi5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0yLjYuMi5jc3MiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5jc3MiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImpzbGlicyIgZGVwZW5kcz0iaW5pdCwgcHJveHksIGRvd25sb2FkX2pzbGlicyI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249ImNvbXBpbGUgdGhlIHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlLCByZXNvbHZlIj4KKyAgICA8IS0tIC8vVE9ETyBlbmFibGUgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQiLz4tLT4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VuamF2YX0iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImpzdGVzdCIgZGVzY3JpcHRpb249ImNyZWF0ZSB0aGUgdGVzdCBzdWl0ZSBqYXIgZmlsZSIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgPGphciBqYXJmaWxlPSIke2phci5maWxlfSIgYmFzZWRpcj0iJHtidWlsZH0vdGVzdCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJydW4gdGhlIHRlc3Qgc2VydmVyIiBkZXBlbmRzPSJqc3Rlc3QsIGpzbGlicyI+CisgICAgPGphdmEgY2xhc3NuYW1lPSJ0ZXN0Lkh0dHBkIiBmb3JrPSJ0cnVlIgorICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0iLi4vIiAvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwcm94eSIgaWY9InByb3h5LmVuYWJsZWQiPgorICAgIDxzZXRwcm94eSBwcm94eWhvc3Q9IiR7cHJveHkuaG9zdH0iIHByb3h5cG9ydD0iJHtwcm94eS5wb3J0fSIKKyAgICAgIHByb3h5dXNlcj0iJHtwcm94eS51c2VyfSIgcHJveHlwYXNzd29yZD0iJHtwcm94eS5wYXNzfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Inh2ZmIiPgorICAgIDxlY2hvPmNoZWNrIGlmIFh2ZmIgaXMgYXZhaWxhYmxlOjwvZWNobz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJYdmZiIiBmYWlsaWZleGVjdXRpb25mYWlscz0ibm8iIHJlc3VsdHByb3BlcnR5PSJ4dmZiLnByZXNlbnQiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cveHZmYi5sb2ciPgorICAgICAgPGFyZyBsaW5lPSItLXZlcnNpb24iLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icGhhbnRvbWpzIiBkZXBlbmRzPSJ4dmZiIiBpZj0ieHZmYi5wcmVzZW50Ij4KKyAgICA8ZWNobz5jaGVjayBpZiBwaGFudG9tanMgaXMgYXZhaWxhYmxlOjwvZWNobz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJwaGFudG9tanMiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJubyIgcmVzdWx0cHJvcGVydHk9InBoYW50b21qcy5wcmVzZW50IiBmYWlsb25lcnJvcj0iZmFsc2UiIG91dHB1dD0iJHtidWlsZH0vbG9nL3BoYW50b21qcy5sb2ciPgorICAgICAgPGFyZyBsaW5lPSItLXZlcnNpb24iLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idW5pdHRlc3QiIGRlc2NyaXB0aW9uPSJkbyB1bml0IHRlc3RzIHdpdGggaGVhZGxlc3MgYnJvd3NlciBwaGFudG9tanMiIGRlcGVuZHM9ImluaXQsIHBoYW50b21qcywganN0ZXN0LCBqc2xpYnMiIGlmPSJwaGFudG9tanMucHJlc2VudCI+CisgICAgPHBhcmFsbGVsPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iWHZmYiIgc3Bhd249InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSI+CisgICAgICAgIDxhcmcgbGluZT0iOjk5IiAvPgorICAgICAgPC9leGVjPgorICAgICAgPGphdmEgY2xhc3NuYW1lPSJ0ZXN0Lkh0dHBkIiBmb3JrPSJ0cnVlIiB0aW1lb3V0PSIxMDAwMCIKKyAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy91bml0dGVzdC5sb2ciPgorICAgICAgICA8YXJnIHZhbHVlPSIuLi8iIC8+CisgICAgICA8L2phdmE+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPHNsZWVwIHNlY29uZHM9IjIiLz4KKyAgICAgICAgPGVjaG8+UnVubmluZyBVbml0IFRlc3RzIHdpdGggaGVhZGxlc3MgYnJvd3NlciE8L2VjaG8+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InBoYW50b21qcyIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgIDxlbnYga2V5PSJESVNQTEFZIiB2YWx1ZT0iOjk5Ii8+CisgICAgICAgICAgPGFyZyBsaW5lPSJwaGFudG9tanMtcXVuaXQuanMgaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3QvdGVzdC5odG1sIiAvPgorICAgICAgICA8L2V4ZWM+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9wYXJhbGxlbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgJHt0aHJpZnQuZGlyfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganM6anF1ZXJ5ICR7dGhyaWZ0LmRpcn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8L2V4ZWM+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzOmpxdWVyeSAke3RocmlmdC5kaXJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQiIC8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gdGVzdCBzdWl0ZSAobGludCwgdW5pdHRlc3QpIiBkZXBlbmRzPSJsaW50LCB1bml0dGVzdCIvPgorCisgIDx0YXJnZXQgbmFtZT0ibGludCIgZGVzY3JpcHRpb249ImNvZGUgcXVhbGl0eSBjaGVja3MgKGpzbGludCBhbmQgZ2pzbGludCBpZiBhdmFpbGFibGUpIiBkZXBlbmRzPSJnZW5lcmF0ZSwgZ2pzbGludCwganNsaW50Ii8+CisKKyAgPHRhcmdldCBuYW1lPSJqc2xpbnQiIGRlcGVuZHM9InJlc29sdmUiPgorICAgIDx0YXNrZGVmIHVyaT0iYW50bGliOmNvbS5nb29nbGVjb2RlLmpzbGludDRqYXZhIiByZXNvdXJjZT0iY29tL2dvb2dsZWNvZGUvanNsaW50NGphdmEvYW50bGliLnhtbCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8IS0tCisgICAgICAgICB0aGUgZm9sbG93aW5nIG9wdGlvbnMgd291bGQgcHJvYmFibHkgbWFrZSBzZW5zZSBpbiB0aGUgZnV0dXJlOgorICAgICAgICAgYnJvd3Nlcix1bmRlZixlcWVxZXEscGx1c3BsdXMsYml0d2lzZSxyZWdleHAsc3RyaWN0LG5ld2NhcCxpbW1lZAorICAgIC0tPgorICAgIDxqc2w6anNsaW50IG9wdGlvbnM9ImV2aWwsZm9yaW4sYnJvd3NlcixiaXR3aXNlLHJlZ2V4cCxuZXdjYXAsaW1tZWQiIGVuY29kaW5nPSJVVEYtOCI+CisgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiAvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2dlbmpzfSIgaW5jbHVkZXM9IioqLyouanMiIC8+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4uL3NyYyIgaW5jbHVkZXM9InRocmlmdC5qcyIgLz4KKworICAgICAgPCEtLSBpc3N1ZXMgd2l0aCB1bnNhZmUgY2hhcmFjdGVyIC0tPgorICAgICAgPCEtLSBmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9Iip0ZXN0Ki5qcyIgLz4gLS0+CisgICAgPC9qc2w6anNsaW50PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNoZWNrLWdqc2xpbnQiPgorICAgIDxlY2hvPmNoZWNrIGlmIGdqc2xpbnQgaXMgYXZhaWxhYmxlOjwvZWNobz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJnanNsaW50IiBmYWlsaWZleGVjdXRpb25mYWlscz0ibm8iIHJlc3VsdHByb3BlcnR5PSJnanNsaW50LnByZXNlbnQiIGZhaWxvbmVycm9yPSJmYWxzZSI+CisgICAgICA8YXJnIGxpbmU9Ii0taGVscHNob3J0Ii8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imdqc2xpbnQiIGRlcGVuZHM9ImNoZWNrLWdqc2xpbnQiIGlmPSJnanNsaW50LnByZXNlbnQiPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Imdqc2xpbnQiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJubyI+CisgICAgICA8YXJnIGxpbmU9Ii0tbm9qc2RvYyIvPgorICAgICAgPGFyZyBsaW5lPSIke2dlbmpzfS8qLmpzIi8+CisgICAgICA8YXJnIGxpbmU9Ii4uL3NyYy90aHJpZnQuanMiLz4KKworICAgICAgPCEtLSBpc3N1ZXMgd2l0aCB1bnNhZmUgY2hhcmFjdGVyLCBldGMuIC0tPgorICAgICAgPCEtLSA8YXJnIGxpbmU9Iip0ZXN0Ki5qcyIvPiAtLT4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW5qYXZhfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW5qc30iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgZGVwZW5kcz0iaW5pdCxtdm4uYW50LnRhc2tzLmNoZWNrIiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmNoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVzb2x2ZSIgZGVwZW5kcz0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgorICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGg9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8ke212bi5hbnQudGFzay5qYXJ9Ii8+CisKKyAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0ianMudGVzdC5kZXBlbmRlbmN5LmphcnMiPgorICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cyIgYXJ0aWZhY3RJZD0iaHR0cGNsaWVudCIgdmVyc2lvbj0iNC4wLjEiLz4KKyAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGVjb2RlLmpzbGludDRqYXZhIiBhcnRpZmFjdElkPSJqc2xpbnQ0amF2YS1hbnQiIHZlcnNpb249IjEuNC42Ii8+CisgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJldS5tZWRzZWEubWltZXV0aWwiIGFydGlmYWN0SWQ9Im1pbWUtdXRpbCIgdmVyc2lvbj0iMi4xLjMiLz4KKyAgICA8L2FydGlmYWN0OmRlcGVuZGVuY2llcz4KKworICAgIDwhLS0gQ29weSB0aGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBidWlsZC9saWIgZGlyIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkfS9saWIiPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9ImpzLnRlc3QuZGVwZW5kZW5jeS5qYXJzIi8+CisgICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KKyAgICA8L2NvcHk+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcyBiL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQzYTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCkBAIC0wLDAgKzEsMjEzIEBACitmdW5jdGlvbiBzZXJpYWxpemUoZGF0YSkgeworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnL3NlcnZpY2UnKTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKCcnLCAwLCAwKTsKKyAgZGF0YS53cml0ZShwcm90b2NvbCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworICByZXR1cm4gdHJhbnNwb3J0LnNlbmRfYnVmOworfQorCitmdW5jdGlvbiBkZXNlcmlhbGl6ZShzZXJpYWxpemVkLCB0eXBlKSB7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlcihzZXJpYWxpemVkKTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgY29uc3QgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGRhdGEucmVhZChwcm90b2NvbCk7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgIHJldHVybiBkYXRhOworfQorCisKK2Z1bmN0aW9uIGNyZWF0ZVRocmlmdE9iaigpIHsKKworICByZXR1cm4gbmV3IENvbXBsZXgoeworCisgICAgc3RydWN0X2ZpZWxkOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2EnfSksCisKKyAgICBzdHJ1Y3RfbGlzdF9maWVsZDogWworICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdiJ30pLAorICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdjJ30pCisgICAgXSwKKworICAgIHN0cnVjdF9zZXRfZmllbGQ6IFsKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnZCd9KSwKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnZSd9KQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7CisgICAgICBBOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2YnfSksCisgICAgICBCOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2cnfSkKKyAgICB9LAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIHsKKyAgICAgICAgICBDOiBbCisgICAgICAgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2gnfSksCisgICAgICAgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2knfSkKKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICBdLAorCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiB7CisgICAgICBEOiBbCisgICAgICAgIHsKKyAgICAgICAgICBEQTogbmV3IFNpbXBsZSh7dmFsdWU6ICdqJ30pCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICBEQjogbmV3IFNpbXBsZSh7dmFsdWU6ICdrJ30pCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorCisgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICAgWydvbmUnLCAndHdvJ10sCisgICAgICAgWyd0aHJlZScsICdmb3VyJ10sCisgICAgICAgWydmaXZlJywgJ3NpeCddCisgICAgXQorICB9CisgICk7Cit9CisKKworZnVuY3Rpb24gY3JlYXRlSnNPYmooKSB7CisKKyAgcmV0dXJuIHsKKworICAgIHN0cnVjdF9maWVsZDoge3ZhbHVlOiAnYSd9LAorCisgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKKyAgICAgIHt2YWx1ZTogJ2InfSwKKyAgICAgIHt2YWx1ZTogJ2MnfQorICAgIF0sCisKKyAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbCisgICAgICB7dmFsdWU6ICdkJ30sCisgICAgICB7dmFsdWU6ICdlJ30KKyAgICBdLAorCisgICAgc3RydWN0X21hcF9maWVsZDogeworICAgICAgQToge3ZhbHVlOiAnZid9LAorICAgICAgQjoge3ZhbHVlOiAnZyd9CisgICAgfSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogWworICAgICAgWworICAgICAgICB7CisgICAgICAgICAgQzogWworICAgICAgICAgICAge3ZhbHVlOiAnaCd9LAorICAgICAgICAgICAge3ZhbHVlOiAnaSd9CisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgXSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKKyAgICAgIEQ6IFsKKyAgICAgICAgeworICAgICAgICAgIERBOiB7dmFsdWU6ICdqJ30KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgIERCOiB7dmFsdWU6ICdrJ30KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsnb25lJywgJ3R3byddLAorICAgICAgWyd0aHJlZScsICdmb3VyJ10sCisgICAgICBbJ2ZpdmUnLCAnc2l4J10KKyAgIF0KKyAgfTsKK30KKworCitmdW5jdGlvbiBhc3NlcnRWYWx1ZXMob2JqLCBhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9maWVsZC52YWx1ZSwgJ2EnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlLCAnYicpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X2xpc3RfZmllbGRbMV0udmFsdWUsICdjJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlLCAnZCcpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSwgJ2UnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9tYXBfZmllbGQuQS52YWx1ZSwgJ2YnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSwgJ2cnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdLnZhbHVlLCAnaCcpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMV0udmFsdWUsICdpJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEudmFsdWUsICdqJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMV0uREIudmFsdWUsICdrJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMF0sICdvbmUnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXSwgJ3R3bycpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdLCAndGhyZWUnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXSwgJ2ZvdXInKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXSwgJ2ZpdmUnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXSwgJ3NpeCcpOworfQorCitjb25zdCBjYXNlcyA9IHsKKworICAnU2VyaWFsaXplL2Rlc2VyaWFsaXplIHNpbXBsZSBzdHJ1Y3Qgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gbmV3IFNpbXBsZSh7dmFsdWU6ICdhJ30pOworICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBTaW1wbGUpOworICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChyZWNlaXZlZCwgdE9iaik7CisgIH0sCisKKworICAnU2VyaWFsaXplL2Rlc2VyaWFsaXplIHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0JzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iaiA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBDb21wbGV4KTsKKyAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQpOworICAgIGFzc2VydC5kZWVwRXF1YWwocmVjZWl2ZWQsIHRPYmopOworICB9LAorCisgICdOZXN0ZWQgc3RydWN0cyBhbmQgY29udGFpbmVycyBpbml0aWFsaXplZCBmcm9tIHBsYWluIGpzIG9iamVjdHMgc2hvdWxkIHNlcmlhbGl6ZSBzYW1lIGFzIGlmIGluaXRpYWxpemVkIGZyb20gdGhyaWZ0IG9iamVjdHMnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqMSA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgIGNvbnN0IHRPYmoyID0gbmV3IENvbXBsZXgoY3JlYXRlSnNPYmooKSk7CisgICAgYXNzZXJ0VmFsdWVzKHRPYmoyLCBhc3NlcnQpOworICAgIGFzc2VydC5lcXVhbChzZXJpYWxpemUodE9iajIpLCBzZXJpYWxpemUodE9iajEpKTsKKyAgfSwKKworICAnTW9kaWZpY2F0aW9ucyB0byBhcmdzIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCBjb25zdHJ1Y3RlZCBUaHJpZnQgb2JqZWN0JzogZnVuY3Rpb24oYXNzZXJ0KSB7CisKKyAgICBjb25zdCBhcmdzID0gY3JlYXRlSnNPYmooKTsKKyAgICBhc3NlcnRWYWx1ZXMoYXJncywgYXNzZXJ0KTsKKworICAgIGNvbnN0IHRPYmogPSBuZXcgQ29tcGxleChhcmdzKTsKKyAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKKworICAgIGFyZ3Muc3RydWN0X2ZpZWxkLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X2xpc3RfZmllbGRbMV0udmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5CLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMV0gPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRCID0gJ1paWic7CisKKyAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKKyAgfSwKKworICAnbnVsbHMgYXJlIG9rJzogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgdE9iaiA9IG5ldyBDb21wbGV4KHsKKyAgICAgIHN0cnVjdF9maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X3NldF9maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9tYXBfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiBudWxsCisgICAgfSk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIENvbXBsZXgpOworICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCh0T2JqLCByZWNlaXZlZCk7CisgIH0KKworfTsKKworT2JqZWN0LmtleXMoY2FzZXMpLmZvckVhY2goZnVuY3Rpb24oY2FzZU5hbWUpIHsKKyAgUVVuaXQudGVzdChjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKK30pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvanNUZXN0RHJpdmVyLmNvbmYgYi9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjE1ODhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvanNUZXN0RHJpdmVyLmNvbmYKQEAgLTAsMCArMSwxOCBAQAorc2VydmVyOiBodHRwOi8vbG9jYWxob3N0Ojk4NzYKKworbG9hZDoKKyMgUXVuaXQgYWRhcHRlcgorICAtIGJ1aWxkL2pzL2xpYi9lcXVpdi5qcworICAtIGJ1aWxkL2pzL2xpYi9RVW5pdEFkYXB0ZXIuanMKKyMgZGVwZW5kZW5jaWVzCisgIC0gYnVpbGQvanMvbGliL2pxdWVyeS5qcworICAtIGJ1aWxkL2pzL3RocmlmdC5qcworICAtIGdlbi1qcy9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5qcworICAtIGdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzCisgIC0gZ2VuLWpzL1RocmlmdFRlc3QuanMKKyMgdGhlIHRlc3Qgc3VpdGUKKyAgLSB0ZXN0LmpzCisKKyMgcmVkaXJlY3QgdG8gdGhlIEphdmEgYmFzZWQgVGhyaWZ0IHRlc3RzZXJ2ZXIKK3Byb3h5OgorIC0ge21hdGNoZXI6ICIqIiwgc2VydmVyOiAiIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4OCJ9CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9waGFudG9tLWNsaWVudC5qcyBiL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MTdlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9waGFudG9tLWNsaWVudC5qcwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisoZnVuY3Rpb24oKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvLyBSdWRpbWVudGFyeSB0ZXN0IGhlbHBlciBmdW5jdGlvbnMKKyAgLy8gVE9ETzogUmV0dXJuIGVycm9yIGNvZGUgYmFzZWQgb24ga2luZCBvZiBlcnJvcnMgcmF0aGVyIHRoYW4gdGhyb3cKKyAgdmFyIG9rID0gZnVuY3Rpb24odCwgbXNnKSB7CisgICAgaWYgKCF0KSB7CisgICAgICBjb25zb2xlLmxvZygnKioqIEZBSUxFRCAqKionKTsKKyAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOworICAgIH0KKyAgfTsKKyAgdmFyIGVxdWFsID0gZnVuY3Rpb24oYSwgYikgeworICAgIGlmIChhICE9PSBiKSB7CisgICAgICBjb25zb2xlLmxvZygnKioqIEZBSUxFRCAqKionKTsKKyAgICAgIHRocm93IG5ldyBFcnJvcigpOworICAgIH0KKyAgfTsKKyAgdmFyIHRlc3QgPSBmdW5jdGlvbihuYW1lLCBmKSB7CisgICAgY29uc29sZS5sb2coJ1RFU1QgOiAnICsgbmFtZSk7CisgICAgZigpOworICAgIGNvbnNvbGUubG9nKCdPS1xuJyk7CisgIH07CisKKyAgdmFyIHBhcnNlQXJncyA9IGZ1bmN0aW9uKGFyZ3MpIHsKKyAgICB2YXIgc2tpcHMgPSBbCisgICAgICAnLS10cmFuc3BvcnQ9aHR0cCcsCisgICAgICAnLS1wcm90b2NvbD1qc29uJworICAgIF07CisgICAgdmFyIG9wdHMgPSB7CisgICAgICBwb3J0OiAnOTA5MCcKKyAgICAgIC8vIHByb3RvY29sOiAnanNvbicsCisgICAgfTsKKyAgICB2YXIga2V5cyA9IHt9OworICAgIGZvciAodmFyIGtleSBpbiBvcHRzKSB7CisgICAgICBrZXlzWyctLScgKyBrZXkgKyAnPSddID0ga2V5OworICAgIH0KKyAgICBmb3IgKHZhciBpIGluIGFyZ3MpIHsKKyAgICAgIHZhciBhcmcgPSBhcmdzW2ldOworICAgICAgaWYgKHNraXBzLmluZGV4T2YoYXJnKSAhPSAtMSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHZhciBoaXQgPSBmYWxzZTsKKyAgICAgIGZvciAodmFyIGsgaW4ga2V5cykgeworICAgICAgICBpZiAoYXJnLnNsaWNlKDAsIGsubGVuZ3RoKSA9PT0gaykgeworICAgICAgICAgIG9wdHNba2V5c1trXV0gPSBhcmcuc2xpY2Uoay5sZW5ndGgpOworICAgICAgICAgIGhpdCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghaGl0KSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBhcmd1bWVudDogJyArIGFyZyk7CisgICAgICB9CisgICAgfQorICAgIG9wdHMucG9ydCA9IHBhcnNlSW50KG9wdHMucG9ydCwgMTApOworICAgIGlmICghb3B0cy5wb3J0IHx8IG9wdHMucG9ydCA8IDEgfHwgb3B0cy5wb3J0ID4gNjU1MzUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwb3J0IG51bWJlcicpOworICAgIH0KKyAgICByZXR1cm4gb3B0czsKKyAgfTsKKworICB2YXIgZXhlY3V0ZSA9IGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCcjIyMgQXBhY2hlIFRocmlmdCBKYXZhc2NyaXB0IHN0YW5kYWxvbmUgdGVzdCBjbGllbnQnKTsKKyAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisKKyAgICBwaGFudG9tLnBhZ2UuaW5qZWN0SnMoJ3NyYy90aHJpZnQuanMnKTsKKyAgICBwaGFudG9tLnBhZ2UuaW5qZWN0SnMoJ3Rlc3QvZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMnKTsKKyAgICBwaGFudG9tLnBhZ2UuaW5qZWN0SnMoJ3Rlc3QvZ2VuLWpzL1RocmlmdFRlc3QuanMnKTsKKworICAgIHZhciBzeXN0ZW0gPSByZXF1aXJlKCdzeXN0ZW0nKTsKKyAgICB2YXIgb3B0cyA9IHBhcnNlQXJncyhzeXN0ZW0uYXJncy5zbGljZSgxKSk7CisgICAgdmFyIHBvcnQgPSBvcHRzLnBvcnQ7CisgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCdodHRwOi8vbG9jYWxob3N0OicgKyBwb3J0ICsgJy9zZXJ2aWNlJyk7CisgICAgdmFyIHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIHZhciBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworCisgICAgLy8gVE9ETzogUmVtb3ZlIGR1cGxpY2F0ZSBjb2RlIHdpdGggdGVzdC5qcy4KKyAgICAvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04CisgICAgdmFyIHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKKyAgICBmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpIHsKKyAgICAgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgeworICAgICAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgICAgZXF1YWwobWFwMSwgbWFwMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yICh2YXIga2V5IGluIG1hcDEpIHsKKyAgICAgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkobWFwMVtrZXldLCBtYXAyW2tleV0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRlc3QoJ1ZvaWQnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICAgIH0pOworICAgIHRlc3QoJ0JpbmFyeSAoU3RyaW5nKScsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGJpbmFyeSA9ICcnOworICAgICAgZm9yICh2YXIgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgICB9CisgICAgICBlcXVhbChjbGllbnQudGVzdEJpbmFyeShiaW5hcnkpLCBiaW5hcnkpOworICAgIH0pOworICAgIHRlc3QoJ0JpbmFyeSAoVWludDhBcnJheSknLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBiaW5hcnkgPSAnJzsKKyAgICAgIGZvciAodmFyIHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgICAgfQorICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgYXJyW2ldID0gYmluYXJ5W2ldLmNoYXJDb2RlQXQoKTsKKyAgICAgIH0KKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGFyciksIGJpbmFyeSk7CisgICAgfSk7CisgICAgdGVzdCgnU3RyaW5nJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZygnJyksICcnKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLCBzdHJpbmdUZXN0KTsKKworICAgICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKworICAgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKKyAgICAgICAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMpLCBzcGVjaWFsQ2hhcmFjdGVycyk7CisgICAgfSk7CisgICAgdGVzdCgnRG91YmxlJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgwKSwgMCk7CisgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgtMSksIC0xKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSksIE1hdGgucG93KDIsIDYwKSk7CisgICAgfSk7CisgICAgdGVzdCgnQm9vbCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCb29sKHRydWUpLCB0cnVlKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qm9vbChmYWxzZSksIGZhbHNlKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdJOCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgweDAxKSwgMHgwMSk7CisgICAgfSk7CisgICAgdGVzdCgnSTMyJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEkzMigwKSwgMCk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCkpLCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSksIC1NYXRoLnBvdygyLCAzMCkpOworICAgIH0pOworICAgIHRlc3QoJ0k2NCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoMCksIDApOworICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpKSwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisKKyAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ05lc3QnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICAgIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDI7CisgICAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOworCisgICAgICB2YXIgbmVzdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCk7CisKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKworICAgICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdNYXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7NzogNzcsIDg6IDg4LCA5OiA5OX07CisKKyAgICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKKworICAgICAgZm9yICh2YXIga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0ZXN0KCdTdHJpbmdNYXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7CisgICAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKKyAgICAgIH07CisKKyAgICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKKworICAgICAgZm9yICh2YXIga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0ZXN0KCdTZXQnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBzZXRUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgICBvayhjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLCBzZXRUZXN0SW5wdXQpOworICAgIH0pOworCisgICAgdGVzdCgnTGlzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGxpc3RUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgICBvayhjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCksIGxpc3RUZXN0SW5wdXQpOworICAgIH0pOworCisgICAgdGVzdCgnRW51bScsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0VHlwZWRlZig2OSksIDY5KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1NraXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICAgIHZhciBtb2RpZmllZENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgICAgICBtb2RpZmllZENsaWVudC5yZWN2X3Rlc3RTdHJ1Y3QgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGlucHV0ID0gbW9kaWZpZWRDbGllbnQuaW5wdXQ7CisgICAgICAgIHZhciB4dHJ1Y3QzID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MygpOworCisgICAgICAgIGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICAgICAgLy8gcmVhZCBYdHJ1Y3QgZGF0YSB3aXRoIFh0cnVjdDMKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgeHRydWN0My5yZWFkKGlucHV0KTsKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIC8vIHJlYWQgVGhyaWZ0LlR5cGUuU1RPUCBtZXNzYWdlCisgICAgICAgIGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOworCisgICAgICAgIGlucHV0LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsKKworICAgICAgICByZXR1cm4geHRydWN0MzsKKyAgICAgIH07CisKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgICB2YXIgc3RydWN0VGVzdE91dHB1dCA9IG1vZGlmaWVkQ2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dCBpbnN0YW5jZW9mIFRocmlmdFRlc3QuWHRydWN0MywgdHJ1ZSk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmNoYW5nZWQsIG51bGwpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgIH0pOworCisgICAgdGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0geworICAgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgICB9OworCisgICAgICB2YXIgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworCisKKyAgICAgIGZvciAodmFyIGtleSBpbiBtYXBNYXBUZXN0T3V0cHV0KSB7CisgICAgICAgIGZvciAodmFyIGtleTIgaW4gbWFwTWFwVGVzdE91dHB1dFtrZXldKSB7CisgICAgICAgICAgZXF1YWwobWFwTWFwVGVzdE91dHB1dFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXBNYXBUZXN0T3V0cHV0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICAgIH0pOworCisgICAgdGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgICAgICBvayhmYWxzZSk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIGVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgICAgZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ25vIEV4Y2VwdGlvbicpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBvayhmYWxzZSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0ZXN0KCdURXhjZXB0aW9uJywgZnVuY3Rpb24oKSB7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpOworICAgICAgICBvayhmYWxzZSk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIG9rKG9rKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHZhciBjcmF6eSA9IHsKKyAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICAgIH1dCisgICAgfTsKKyAgICB0ZXN0KCdJbnNhbml0eScsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGluc2FuaXR5ID0geworICAgICAgICAnMSc6IHsKKyAgICAgICAgICAnMic6IGNyYXp5LAorICAgICAgICAgICczJzogY3JhenkKKyAgICAgICAgfSwKKyAgICAgICAgJzInOiB7ICc2JzogeyAndXNlck1hcCc6IG51bGwsICd4dHJ1Y3RzJzogbnVsbCB9IH0KKyAgICAgIH07CisgICAgICB2YXIgcmVzID0gY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eShjcmF6eSkpOworICAgICAgb2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICAgIG9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworCisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlcywgaW5zYW5pdHkpOworICAgIH0pOworCisgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOworICAgIGNvbnNvbGUubG9nKCcjIyMgQWxsIHRlc3RzIHN1Y2NlZWRlZC4nKTsKKyAgICByZXR1cm4gMDsKKyAgfTsKKworICB0cnkgeworICAgIHZhciByZXQgPSBleGVjdXRlKCk7CisgICAgcGhhbnRvbS5leGl0KHJldCk7CisgIH0gY2F0Y2ggKGVycikgeworICAgIC8vIENhdGNoIGFsbCBhbmQgZXhpdCB0byBhdm9pZCBoYW5nLgorICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKKyAgICBwaGFudG9tLmV4aXQoMSk7CisgIH0KK30pKCk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9waGFudG9tanMtcXVuaXQuanMgYi9saWIvanMvdGVzdC9waGFudG9tanMtcXVuaXQuanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzFkN2E1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcwpAQCAtMCwwICsxLDkxIEBACisvKmpzaGludCBldmlsOnRydWUqLworCisvKiBUaGlzIGZpbGUgaXMgb25seSB1c2VkIGJ5IHRoZSB0ZXN0IHN1aXRlLgorICoKKyAqIE9yaWdpbjogIGh0dHBzOi8vZ2l0aHViLmNvbS9hcml5YS9waGFudG9tanMvYmxvYi9tYXN0ZXIvZXhhbXBsZXMvcnVuLXF1bml0LmpzCisgKiBMaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vYXJpeWEvcGhhbnRvbWpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UuQlNECisgKgorICogSW5jbHVzaW9uIGludG8gQXBhY2hlIHByb2R1Y3RzIGlzIGFsbG93ZWQgYWNjb3JkaW5nIHRvIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9sZWdhbC8zcGFydHkuaHRtbAorICovCisKK3ZhciBzeXN0ZW0gPSByZXF1aXJlKCdzeXN0ZW0nKTsKKworCisvKioKKyAqIFdhaXQgdW50aWwgdGhlIHRlc3QgY29uZGl0aW9uIGlzIHRydWUgb3IgYSB0aW1lb3V0IG9jY3Vycy4gVXNlZnVsIGZvciB3YWl0aW5nCisgKiBvbiBhIHNlcnZlciByZXNwb25zZSBvciBmb3IgYSB1aSBjaGFuZ2UgKGZhZGVJbiwgZXRjLikgdG8gb2NjdXIuCisgKgorICogQHBhcmFtIHRlc3RGeCBqYXZhc2NyaXB0IGNvbmRpdGlvbiB0aGF0IGV2YWx1YXRlcyB0byBhIGJvb2xlYW4sCisgKiBpdCBjYW4gYmUgcGFzc2VkIGluIGFzIGEgc3RyaW5nIChlLmcuOiAiMSA9PSAxIiBvciAiJCgnI2JhcicpLmlzKCc6dmlzaWJsZScpIiBvcgorICogYXMgYSBjYWxsYmFjayBmdW5jdGlvbi4KKyAqIEBwYXJhbSBvblJlYWR5IHdoYXQgdG8gZG8gd2hlbiB0ZXN0RnggY29uZGl0aW9uIGlzIGZ1bGZpbGxlZCwKKyAqIGl0IGNhbiBiZSBwYXNzZWQgaW4gYXMgYSBzdHJpbmcgKGUuZy46ICIxID09IDEiIG9yICIkKCcjYmFyJykuaXMoJzp2aXNpYmxlJykiIG9yCisgKiBhcyBhIGNhbGxiYWNrIGZ1bmN0aW9uLgorICogQHBhcmFtIHRpbWVPdXRNaWxsaXMgdGhlIG1heCBhbW91bnQgb2YgdGltZSB0byB3YWl0LiBJZiBub3Qgc3BlY2lmaWVkLCAzIHNlYyBpcyB1c2VkLgorICovCitmdW5jdGlvbiB3YWl0Rm9yKHRlc3RGeCwgb25SZWFkeSwgdGltZU91dE1pbGxpcykgeworICAgIHZhciBtYXh0aW1lT3V0TWlsbGlzID0gdGltZU91dE1pbGxpcyA/IHRpbWVPdXRNaWxsaXMgOiAzMDAxLCAvLzwgRGVmYXVsdCBNYXggVGltb3V0IGlzIDNzCisgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCksCisgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlLAorICAgICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgaWYgKChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0IDwgbWF4dGltZU91dE1pbGxpcykgJiYgIWNvbmRpdGlvbikgeworICAgICAgICAgICAgICAgIC8vIElmIG5vdCB0aW1lLW91dCB5ZXQgYW5kIGNvbmRpdGlvbiBub3QgeWV0IGZ1bGZpbGxlZAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICh0eXBlb2YodGVzdEZ4KSA9PT0gJ3N0cmluZycgPyBldmFsKHRlc3RGeCkgOiB0ZXN0RngoKSk7IC8vPCBkZWZlbnNpdmUgY29kZQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBjb25kaXRpb24gc3RpbGwgbm90IGZ1bGZpbGxlZCAodGltZW91dCBidXQgY29uZGl0aW9uIGlzICdmYWxzZScpCisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCInd2FpdEZvcigpJyB0aW1lb3V0Iik7CisgICAgICAgICAgICAgICAgICAgIHBoYW50b20uZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25kaXRpb24gZnVsZmlsbGVkICh0aW1lb3V0IGFuZC9vciBjb25kaXRpb24gaXMgJ3RydWUnKQorICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiJ3dhaXRGb3IoKScgZmluaXNoZWQgaW4gIiArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0KSArICdtcy4nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihvblJlYWR5KSA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwob25SZWFkeSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvblJlYWR5KCk7IC8vPCBEbyB3aGF0IGl0J3Mgc3VwcG9zZWQgdG8gZG8gb25jZSB0aGUgY29uZGl0aW9uIGlzIGZ1bGZpbGxlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOyAvLzwgU3RvcCB0aGlzIGludGVydmFsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LCAxMDApOyAvLzwgcmVwZWF0IGNoZWNrIGV2ZXJ5IDI1MG1zCit9CisKKworaWYgKHN5c3RlbS5hcmdzLmxlbmd0aCA9PT0gMSB8fCBzeXN0ZW0uYXJncy5sZW5ndGggPiAzKSB7CisgICAgY29uc29sZS5sb2coJ1VzYWdlOiBwaGFudG9tanMgcGhhbnRvbWpzLXF1bml0LmpzIFVSTCcpOworICAgIHBoYW50b20uZXhpdCgxKTsKK30KKwordmFyIHBhZ2UgPSBuZXcgV2ViUGFnZSgpOworCisvLyBSb3V0ZSAiY29uc29sZS5sb2coKSIgY2FsbHMgZnJvbSB3aXRoaW4gdGhlIFBhZ2UgY29udGV4dCB0byB0aGUgbWFpbiBQaGFudG9tIGNvbnRleHQgKGkuZS4gY3VycmVudCAidGhpcyIpCitwYWdlLm9uQ29uc29sZU1lc3NhZ2UgPSBmdW5jdGlvbihtc2cpIHsKKyAgICBjb25zb2xlLmxvZyhtc2cpOworfTsKKworcGFnZS5vcGVuKHN5c3RlbS5hcmdzWzFdLCBmdW5jdGlvbihzdGF0dXMpIHsKKyAgICBpZiAoc3RhdHVzICE9PSAnc3VjY2VzcycpIHsKKyAgICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBhY2Nlc3MgbmV0d29yaycpOworICAgICAgICBwaGFudG9tLmV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2FpdEZvcihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW5pdC10ZXN0cmVzdWx0Jyk7CisgICAgICAgICAgICAgICAgaWYgKGVsICYmIGVsLmlubmVyVGV4dC5tYXRjaCgnY29tcGxldGVkJykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBmYWlsZWROdW0gPSBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW5pdC10ZXN0cmVzdWx0Jyk7CisgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZWwuaW5uZXJUZXh0KTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmFpbGVkJylbMF0uaW5uZXJIVE1MOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfQorICAgICAgICAgICAgICAgIHJldHVybiAxMDAwMDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcGhhbnRvbS5leGl0KChwYXJzZUludChmYWlsZWROdW0sIDEwKSA+IDApID8gMSA6IDApOworICAgICAgICB9KTsKKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwLmpzIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4MGMzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwLmpzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gIFRoaXMgSFRUUCBzZXJ2ZXIgaXMgZGVzaWduZWQgdG8gc2VydmUgdGhlIHRlc3QuaHRtbCBicm93c2VyCisvLyAgYmFzZWQgSmF2YVNjcmlwdCB0ZXN0IHBhZ2UgKHdoaWNoIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4KKy8vICBUaGlzIHNlcnZlciBhbHNvIHN1cHBsaWVzIHRoZSBUaHJpZnQgYmFzZWQgdGVzdCBzZXJ2aWNlLCB3aGljaCBkZXBlbmRzCisvLyAgb24gdGhlIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IElETCBzZXJ2aWNlICh3aGljaCBtdXN0IGJlIGNvbXBpbGVkCisvLyAgZm9yIE5vZGUgYW5kIGJyb3dzZXIgYmFzZWQgSmF2YVNjcmlwdCBpbiAuL2dlbi1ub2RlanMgYW5kIC4vZ2VuLWpzCisvLyAgcmVzcGVjdGl2ZWx5KS4KKy8vCisvLyAgVXNpbmcgdGhlIGNvbW1hbmQgZmxhZyAtLWVzNiwgdGhpcyBzZXJ2ZXIgY2FuIGJlIHJ1biB1c2luZyBub2RlanMgY29kZSBidWlsdAorLy8gIGZvciB0aGUgZXM2IGVudmlyb25tZW50IG9yIGZvciBwcmUtZXM2IGVudmlyb25tZW50LgorLy8KKworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKK2NvbnN0IGVzNk1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXM2Jyk7Citjb25zdCBnZW5Gb2xkZXIgPSBlczZNb2RlID8gJ2dlbi1ub2RlanMtZXM2JyA6ICdnZW4tbm9kZWpzJzsKK2NvbnN0IFRocmlmdFRlc3RTdmMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0LmpzYCk7Citjb25zdCBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7CisKK2NvbnN0IFRocmlmdFRlc3RTdmNPcHQgPSB7CisJdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorCXByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKwlwcm9jZXNzb3I6IFRocmlmdFRlc3RTdmMsCisJaGFuZGxlcjogVGhyaWZ0VGVzdEhhbmRsZXIKK307CisKK2NvbnN0IFRocmlmdFdlYlNlcnZlck9wdGlvbnMgPSB7CisJZmlsZXM6IF9fZGlybmFtZSwKKwlzZXJ2aWNlczogeworCQknL3NlcnZpY2UnOiBUaHJpZnRUZXN0U3ZjT3B0CisJfQorfTsKKworY29uc3Qgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKK2NvbnN0IHBvcnQgPSBlczZNb2RlID8gODA4OCA6IDgwODk7CitzZXJ2ZXIubGlzdGVuKHBvcnQpOworY29uc29sZS5sb2coYFNlcnZpbmcgZmlsZXMgZnJvbTogJHtfX2Rpcm5hbWV9YCk7Citjb25zb2xlLmxvZyhgSHR0cC9UaHJpZnQgU2VydmVyIChFUzYgbW9kZSAke2VzNk1vZGV9KSBydW5uaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcyBiL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTE3MWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9UaGlzIEhUVFAgc2VydmVyIGlzIGRlc2lnbmVkIHRvIHNlcnZlciB0aGUgdGVzdC5odG1sIGJyb3dzZXIKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgorLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKKy8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKKy8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKKy8vICByZXNwZWN0aXZlbHkpLiBUaGUgY3VycmVudCBkaXJlY3RvcnkgbXVzdCBhbHNvIGluY2x1ZGUgdGhlIGJyb3dzZXIKKy8vICBzdXBwb3J0IGxpYnJhcmllcyBmb3IgdGVzdC5odG1sIChqcXVlcnkuanMsIHF1bml0LmpzIGFuZCBxdW5pdC5jc3MKKy8vICBpbiAuL2J1aWxkL2pzL2xpYikuCisKK2NvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0Jyk7Citjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZShgLi8ke2dlbkZvbGRlcn0vVGhyaWZ0VGVzdC5qc2ApOworY29uc3QgVGhyaWZ0VGVzdEhhbmRsZXIgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlRocmlmdFRlc3RIYW5kbGVyOworCisvL1NldHVwIHRoZSBJL08gc3RhY2sgb3B0aW9ucyBmb3IgdGhlIFRocmlmdFRlc3Qgc2VydmljZQorY29uc3QgVGhyaWZ0VGVzdFN2Y09wdCA9IHsKKyAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgIHByb2Nlc3NvcjogVGhyaWZ0VGVzdFN2YywKKyAgaGFuZGxlcjogVGhyaWZ0VGVzdEhhbmRsZXIKK307CisKK2NvbnN0IFRocmlmdFdlYlNlcnZlck9wdGlvbnMgPSB7CisgIGZpbGVzOiBfX2Rpcm5hbWUsCisgIHRsczogeworICAgICBrZXk6IGZzLnJlYWRGaWxlU3luYygnLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5rZXknKSwKKyAgICAgY2VydDogZnMucmVhZEZpbGVTeW5jKCcuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmNydCcpCisgIH0sCisgIHNlcnZpY2VzOiB7CisgICAgJy9zZXJ2aWNlJzogVGhyaWZ0VGVzdFN2Y09wdAorICB9Cit9OworCitjb25zdCBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOworY29uc3QgcG9ydCA9IGVzNk1vZGUgPyA4MDkwIDogODA5MTsKK3NlcnZlci5saXN0ZW4ocG9ydCk7Citjb25zb2xlLmxvZyhgU2VydmluZyBmaWxlcyBmcm9tOiAke19fZGlybmFtZX1gKTsKK2NvbnNvbGUubG9nKGBIdHRwL1RocmlmdCBTZXJ2ZXIgKEVTNiBtb2RlICR7ZXM2TW9kZX0pIHJ1bm5pbmcgb24gcG9ydDogJHtwb3J0fWApOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvSHR0cGQuamF2YSBiL2xpYi9qcy90ZXN0L3NyYy90ZXN0L0h0dHBkLmphdmEKaW5kZXggMTU1YThiOC4uZTRmYzBjYyAxMDA2NDQKLS0tIGEvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvSHR0cGQuamF2YQorKysgYi9saWIvanMvdGVzdC9zcmMvdGVzdC9IdHRwZC5qYXZhCkBAIC03MCw2ICs3MCwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuU2VydmVyVGVzdEJhc2UuVGVzdEhhbmRsZXI7CisKK2ltcG9ydCBldS5tZWRzZWEubWltZXV0aWwuZGV0ZWN0b3IuRXh0ZW5zaW9uTWltZURldGVjdG9yOworaW1wb3J0IGV1Lm1lZHNlYS5taW1ldXRpbC5NaW1lVXRpbDI7CitpbXBvcnQgZXUubWVkc2VhLm1pbWV1dGlsLk1pbWVUeXBlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAogLyoqCiAgKiBCYXNpYywgeWV0IGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIHNwZWMgY29tcGxpYW50LCBIVFRQLzEuMSBmaWxlIHNlcnZlci4KQEAgLTEzMCw4ICsxMzcsMTIgQEAKICAgICAgICAgICAgICAgICBib2R5LnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiKTsKICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRFbnRpdHkoYm9keSk7CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKHRhcmdldC5pbmRleE9mKCI/IikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnN1YnN0cmluZygxLCB0YXJnZXQuaW5kZXhPZigiPyIpKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLmRvY1Jvb3QsIFVSTERlY29kZXIuZGVjb2RlKHRhcmdldCkpOworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZG9jUm9vdCwgVVJMRGVjb2Rlci5kZWNvZGUodGFyZ2V0LCAiVVRGLTgiKSk7CisKICAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKIAogICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXNDb2RlKEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5EKTsKQEAgLTE3Miw4ICsxODMsMjIgQEAKIAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgICAgICAgICAgICAgICAgIE1pbWVVdGlsMiBtaW1lVXRpbCA9IG5ldyBNaW1lVXRpbDIoKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVXRpbC5yZWdpc3Rlck1pbWVEZXRlY3RvcihFeHRlbnNpb25NaW1lRGV0ZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPE1pbWVUeXBlPiBjb2xsZWN0aW9uID0gbWltZVV0aWwuZ2V0TWltZVR5cGVzKGZpbGUpOworICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNaW1lVHlwZT4gaXRlcmF0b3IgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWltZVR5cGUgbXQgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSA9ICBtdC5nZXRNZWRpYVR5cGUoKSArICIvIiArIG10LmdldFN1YlR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzQ29kZShIdHRwU3RhdHVzLlNDX09LKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZUVudGl0eSBib2R5ID0gbmV3IEZpbGVFbnRpdHkoZmlsZSwgInRleHQvaHRtbCIpOworICAgICAgICAgICAgICAgICAgICBGaWxlRW50aXR5IGJvZHkgPSBuZXcgRmlsZUVudGl0eShmaWxlLCBtaW1lVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgbWltZVR5cGUpOwogICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRFbnRpdHkoYm9keSk7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmluZyBmaWxlICIgKyBmaWxlLmdldFBhdGgoKSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NyYy90ZXN0L1Rlc3RIYW5kbGVyLmphdmEgYi9saWIvanMvdGVzdC9zcmMvdGVzdC9UZXN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjdhMzJiLi4wMDAwMDAwCi0tLSBhL2xpYi9qcy90ZXN0L3NyYy90ZXN0L1Rlc3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSB0ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKLQotaW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OwotaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb247Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb24yOwotaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDsKLWltcG9ydCB0aHJpZnQudGVzdC5YdHJ1Y3QyOwotaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuSWZhY2UgewotCi0gICAgcHVibGljIGJ5dGUgdGVzdEJ5dGUoYnl0ZSB0aGluZykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihTdHJpbmcgYXJnKSB0aHJvd3MgWGNlcHRpb24sIFRFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgWGNlcHRpb24oMSwic2VydmVyIHRlc3QgZXhjZXB0aW9uIik7ICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHRlc3RJNjQobG9uZyB0aGluZykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxMb25nLCBNYXA8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgTWFwPExvbmcsIE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4oKTsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdC5wdXQoTG9uZy52YWx1ZU9mKDEpLCBuZXcgSGFzaE1hcDxOdW1iZXJ6LEluc2FuaXR5PigpKTsKLSAgICAgICAgcmVzdWx0LmdldChMb25nLnZhbHVlT2YoMSkpLnB1dChOdW1iZXJ6Lk9ORSwgYXJndW1lbnQpOwotICAgICAgICAKLSAgICAgICAgcmVzdWx0LnB1dChMb25nLnZhbHVlT2YoMiksIG5ldyBIYXNoTWFwPE51bWJlcnosSW5zYW5pdHk+KCkpOwotICAgICAgICByZXN1bHQuZ2V0KExvbmcudmFsdWVPZigyKSkucHV0KE51bWJlcnouT05FLCBhcmd1bWVudCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IHRlc3RMaXN0KExpc3Q8SW50ZWdlcj4gdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGVzdE1hcChNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsIEludGVnZXI+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICBNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsSW50ZWdlcj4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAgICAgICAKLSAgICAgICAgcmVzdWx0LnB1dChJbnRlZ2VyLnZhbHVlT2YoMSksIG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKSk7Ci0gICAgICAgIHJlc3VsdC5nZXQoSW50ZWdlci52YWx1ZU9mKDEpKS5wdXQoSW50ZWdlci52YWx1ZU9mKDEpLCBJbnRlZ2VyLnZhbHVlT2YoMSkpOwotICAgICAgICByZXN1bHQuZ2V0KEludGVnZXIudmFsdWVPZigxKSkucHV0KEludGVnZXIudmFsdWVPZigyKSwgSW50ZWdlci52YWx1ZU9mKDIpKTsKLSAgICAgICAgcmVzdWx0LmdldChJbnRlZ2VyLnZhbHVlT2YoMikpLnB1dChJbnRlZ2VyLnZhbHVlT2YoMSksIEludGVnZXIudmFsdWVPZigxKSk7Ci0gICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBNYXA8U2hvcnQsIFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgWHRydWN0IHh0ciA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgCi0gICAgICAgIHh0ci5ieXRlX3RoaW5nID0gYXJnMDsKLSAgICAgICAgeHRyLmkzMl90aGluZyAgPSBhcmcxOwotICAgICAgICB4dHIuaTY0X3RoaW5nICA9IGFyZzI7Ci0gICAgICAgIHh0ci5zdHJpbmdfdGhpbmcgPSAic2VydmVyIHN0cmluZyI7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4geHRyOwotICAgIH0KLQotICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhjZXB0aW9uLCBYY2VwdGlvbjIsIFRFeGNlcHRpb24gewotICAgICAgICBYdHJ1Y3QgeHRyID0gbmV3IFh0cnVjdCgpOwotICAgICAgICB4dHIuc2V0U3RyaW5nX3RoaW5nKGFyZzApOwotICAgICAgICB0aHJvdyBuZXcgWGNlcHRpb24yKDEseHRyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIHRoaW5nKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcChzZWNvbmRzVG9TbGVlcCAqIDEwMDApOwotICAgICAgICB9Y2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdFN0cmluZyhTdHJpbmcgdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZiMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwpAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogRnVsbHkgQXN5bmMgSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4KKyAqIFRoZXNlIHRlc3RzIGFyZSBkZXNpZ25lZCB0byBleGVyY2lzZSB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydAorICogKHdoaWNoIGlzIGV4Y2x1c2l2ZWx5IGFzeW5jKS4KKyAqCisgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzIFRocmlmdFRlc3QudGhyaWZ0CisgKi8KKworCisKKy8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKK2NvbnN0IHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKK2Z1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxLCBtYXAyKSB7CisgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgeworICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gbWFwMSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMVtrZXldLCBtYXAyW2tleV0pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitRVW5pdC5tb2R1bGUoJ0Jhc2UgVHlwZXMnKTsKKworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RWb2lkKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoJycsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsICcnKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3RyaW5nVGVzdCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworCisgICAgY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDQpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoNCk7CisgICAgY2xpZW50LnRlc3REb3VibGUoMCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKC0xLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtMSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDMuMTQpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDYwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKQorICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIGNsaWVudC50ZXN0Qnl0ZSgwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEkzMigwLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAwKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RJNjQoMCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCA1MikpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworCisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgIGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgfQorICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdTdHJpbmdNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBtYXBUZXN0SW5wdXQgPSB7CisgICAgICAnYSc6ICcxMjMnLCAnYSBiJzogJ3dpdGggc3BhY2VzICcsICdzYW1lJzogJ3NhbWUnLCAnMCc6ICdudW1lcmljIGtleScsCisgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JworICAgIH07CisKKyAgICBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yIChsZXQga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3Qgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBzZXRUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBsaXN0VGVzdElucHV0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RUeXBlZGVmKDY5LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDY5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CisKKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxNik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgfTsKKworICAgIGNsaWVudC50ZXN0TWFwTWFwKDEsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yIChsZXQga2V5IGluIHJlc3VsdCkgeworICAgICAgICBmb3IgKGxldCBrZXkyIGluIHJlc3VsdFtrZXldKSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXN1bHQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnRXhjZXB0aW9uJyk7CisKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nLCBmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQuZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQub2soIWUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOworCisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMjQpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfSwKKyAgICAgICAgJzMnOiB7CisgICAgICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQorICAgIH07CisgICAgY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpLCBmdW5jdGlvbihyZXMpIHsKKyAgICAgIGFzc2VydC5vayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOworICAgICAgYXNzZXJ0Lm9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlcywgaW5zYW5pdHkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworUVVuaXQubW9kdWxlKCdPbmV3YXknKTsKKworICBRVW5pdC50ZXN0KCd0ZXN0T25ld2F5JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RPbmV3YXkoMSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGZjMGRhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sCkBAIC0wLDAgKzEsNDkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy9Kc0RlZXBDb25zdHJ1Y3RvclRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8IS0tIGpRdWVyeSAtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKwk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKwk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBEZWVwIENvbnN0cnVjdG9yIFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCI+SnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CisgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgorICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDMwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuaHRtbApAQCAtMCwwICsxLDU1IEBACisrPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICAgICAgPHRpdGxlPlJlbmRlcmluZyBEb3VibGUgQ29uc3RhbnRzIGluIEpTOiBVbml0IFRlc3Q8L3RpdGxlPgorCisgICAgICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8IS0tIGRvdWJsZSBjb25zdGFudHMgdG8gY2hlY2sgLS0+CisgICAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL0RvdWJsZUNvbnN0YW50c1Rlc3RfdHlwZXMuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgICAgIDwhLS0galF1ZXJ5IC0tPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgICAgICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgICAgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtZG91YmxlLXJlbmRlcmluZy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgIDwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+UmVuZGVyaW5nIERvdWJsZSBDb25zdGFudHMgaW4gSlM6IFVuaXQgVGVzdDwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+CisgIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTBjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLyoKKyAqIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgZG91YmxlIGNvbnN0YW50cyBpbnNpZGUKKyAqIERvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0LiBUaGVzZSB0ZXN0cyB3aWxsIHJ1biBhZ2FpbnN0IE5vcm1hbCAoLWdlbiBqcykKKyAqIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KKyAqCisgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzIERvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0CisgKi8KKworLy8gZG91YmxlIGFzc2VydGlvbiB0aHJlc2hvbGQKK2NvbnN0IEVQU0lMT04gPSAwLjAwMDAwMDE7CisKKy8vIFdvcmsgYXJvdW5kIGZvciBvbGQgQVBJIHVzZWQgYnkgUVVuaXRBZGFwdGVyIG9mIGpzVGVzdERyaXZlcgoraWYgKHR5cGVvZiBRVW5pdC5sb2cgPT0gJ2Z1bmN0aW9uJykgeworICAvLyBXaGVuIHVzaW5nIHJlYWwgUVVuaXQgKGZyb24gUGhhbnRvbUpTKSBsb2cgZmFpbHVyZXMgdG8gY29uc29sZQorICBRVW5pdC5sb2coZnVuY3Rpb24oZGV0YWlscykgeworICAgIGlmICghZGV0YWlscy5yZXN1bHQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PSBGQUlMID09PT09PT09Jyk7CisgICAgICBjb25zb2xlLmxvZygnVGVzdE5hbWU6ICcgKyBkZXRhaWxzLm5hbWUpOworICAgICAgaWYgKGRldGFpbHMubWVzc2FnZSkgY29uc29sZS5sb2coZGV0YWlscy5tZXNzYWdlKTsKKyAgICAgIGNvbnNvbGUubG9nKCdFeHBlY3RlZDogJyArIGRldGFpbHMuZXhwZWN0ZWQpOworICAgICAgY29uc29sZS5sb2coJ0FjdHVhbCAgOiAnICsgZGV0YWlscy5hY3R1YWwpOworICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT0nKTsKKyAgICB9CisgIH0pOworfQorCitRVW5pdC5tb2R1bGUoJ0RvdWJsZSByZW5kZXJpbmcnKTsKKworICBRVW5pdC50ZXN0KCdEb3VibGUgKHJlbmRlcmluZyknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zb2xlLmxvZygnRG91YmxlIHJlbmRlcmluZyB0ZXN0IC0tIHN0YXJ0cycpOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgPSAxMDAwMDAwLjE7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDg7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgLSBET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9MSVNUID0KKyAgICAgICAgWzEsLTEwMCwxMDAsOTIyMzM3MjAzNjg1NDc3NTgwNywtOTIyMzM3MjAzNjg1NDc3NTgwNywzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LC0xLjdlKzMwOCwKKyAgICAgICAgICAgIDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDNdOworICAgIGFzc2VydC5lcXVhbChET1VCTEVfTElTVF9URVNULmxlbmd0aCwgRVhQRUNURURfRE9VQkxFX0xJU1QubGVuZ3RoKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IEVYUEVDVEVEX0RPVUJMRV9MSVNULmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgIGFzc2VydC5vayhNYXRoLmFicyhFWFBFQ1RFRF9ET1VCTEVfTElTVFtpXSAtIERPVUJMRV9MSVNUX1RFU1RbaV0pIDw9IEVQU0lMT04pOworICAgIH0KKyAgICBjb25zb2xlLmxvZygnRG91YmxlIHJlbmRlcmluZyB0ZXN0IC0tIGVuZHMnKTsKKyAgfSk7CisKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZXM2Lmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LWVzNi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDQ5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWVzNi5odG1sCkBAIC0wLDAgKzEsNjIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1lczYvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtZXM2L1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0galF1ZXJ5IC0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgIDxzY3JpcHQ+CisgICAgY29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uOworICAgIGNvbnN0IHdzX3VyaSA9ICgobG9jLnByb3RvY29sID09PSAiaHR0cHM6IikgPyAid3NzOi8vIiA6ICJ3czovLyIpICsKKyAgICAgICAgICAgICAgICAgICBsb2MuaG9zdG5hbWUgKyAiOiIgKyBsb2MucG9ydCArIGxvYy5wYXRobmFtZTsKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRXZWJTb2NrZXRUcmFuc3BvcnQod3NfdXJpKTsKKyAgICBjb25zdCBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgY29uc3QgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgPC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtZXM2LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZXM2LmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1lczYuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1MTcxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZXM2LmpzCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKy8qCisgKiBGdWxseSBBc3luYyBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUgZm9yIFRocmlmdFRlc3QudGhyaWZ0LgorICogVGhlc2UgdGVzdHMgYXJlIGRlc2lnbmVkIHRvIGV4ZXJjaXNlIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0CisgKiAod2hpY2ggaXMgZXhjbHVzaXZlbHkgYXN5bmMpLgorICoKKyAqIFRvIGNvbXBpbGUgY2xpZW50IGNvZGUgZm9yIHRoaXMgdGVzdCB1c2U6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganM6ZXM2IFRocmlmdFRlc3QudGhyaWZ0CisgKi8KKworCisKKy8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKworY29uc3Qgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKKyAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CisgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgeworICAgICAgICBhc3NlcnQuZXF1YWwobWFwMSwgbWFwMik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1FVbml0Lm1vZHVsZSgnQmFzZSBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1ZvaWQnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0Vm9pZCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdFN0cmluZygnJykudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAnJyk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3RyaW5nVGVzdCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKworICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKKyAgICBjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycykudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBzcGVjaWFsQ2hhcmFjdGVycyk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdERvdWJsZSgtMSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtMSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMy4xNCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA2MCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIGNsaWVudC50ZXN0Qnl0ZSgwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEJ5dGUoMHgwMSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAweDAxKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEkzMigwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCkpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygzKTsKKyAgICBjbGllbnQudGVzdEk2NCgwKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ1N0cnVjdHVyZWQgVHlwZXMnKTsKKworICBRVW5pdC50ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoNSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg3KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIHZhciBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOworICAgIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDI7CisgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7CisgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShyZXN1bHQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKKworICAgIGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCisgICAgfTsKKworICAgIGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1NldCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBzZXRUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIGxpc3RUZXN0SW5wdXQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdFbnVtJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdFR5cGVkZWYoNjkpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCA2OSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOworCisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxNik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQorICAgIH07CisKKyAgICBjbGllbnQudGVzdE1hcE1hcCgxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBmb3IgKHZhciBrZXkyIGluIHJlc3VsdFtrZXldKSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXN1bHQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnRXhjZXB0aW9uJyk7CisKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpLnRoZW4oZnVuY3Rpb24ocmVzKSB7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGUpIHsKKworICAgICAgY29uc29sZS5sb2coYEV4Y2VwdGlvbiBleGNlcHRpb24gZWApOworICAgICAgY29uc29sZS5sb2coZSk7CisgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShlLCBudWxsLCAyKSk7CisKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJykudGhlbihmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQub2soIWUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOworCisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyNCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfSwKKyAgICAgICAgJzMnOiB7CisgICAgICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQorICAgIH07CisgICAgY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpKS50aGVuKGZ1bmN0aW9uKHJlcykgeworICAgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCitRVW5pdC5tb2R1bGUoJ09uZXdheScpOworICBRVW5pdC50ZXN0KCd0ZXN0T25ld2F5JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdE9uZXdheSgxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWpxLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1qcS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJiYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1qcS5qcwpAQCAtMCwwICsxLDE1OSBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKKyAqIHdpbGwgcnVuIG9ubHkgd2l0aCBqUXVlcnkgKC1nZW4ganM6anF1ZXJ5KSBBcGFjaGUgVGhyaWZ0CisgKiBpbnRlcmZhY2VzLiBUbyBjcmVhdGUgY2xpZW50IGNvZGU6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IFRocmlmdFRlc3QudGhyaWZ0CisgKgorICogU2VlIGFsc286CisgKiArKyB0ZXN0LmpzIGZvciBnZW5lcmljIHRlc3RzCisgKiArKyB0ZXN0LW5vanEuanMgZm9yICItZ2VuIGpzIiBvbmx5IHRlc3RzCisgKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvL2pRdWVyeSBhc3luY2hyb25vdXMgdGVzdHMKK2pRdWVyeS5hamF4U2V0dXAoeyB0aW1lb3V0OiAwIH0pOworCitRVW5pdC5tb2R1bGUoJ2pRIEFzeW5jIE1hbnVhbCcpOworCisgIFFVbml0LnRlc3QoJ3Rlc3RJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOworICAgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgICAgY29uc3QganF4aHIgPSBqUXVlcnkuYWpheCh7CisgICAgICB1cmw6ICcvc2VydmljZScsCisgICAgICBkYXRhOiBjbGllbnQuc2VuZF90ZXN0STMyKE1hdGgucG93KC0yLCAzMSkpLAorICAgICAgdHlwZTogJ1BPU1QnLAorICAgICAgY2FjaGU6IGZhbHNlLAorICAgICAgZGF0YVR5cGU6ICd0ZXh0JywKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykgeworICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlcihyZXMpOworICAgICAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnJlY3ZfdGVzdEkzMigpLCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKKyAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ3Rlc3RJNjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOworICAgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgICAgalF1ZXJ5LmFqYXgoeworICAgICAgdXJsOiAnL3NlcnZpY2UnLAorICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MSBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEk2NChNYXRoLnBvdygtMiwgNTIpKSwKKyAgICAgIHR5cGU6ICdQT1NUJywKKyAgICAgIGNhY2hlOiBmYWxzZSwKKyAgICAgIGRhdGFUeXBlOiAndGV4dCcsCisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHsKKyAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzKTsKKyAgICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MSBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnJlY3ZfdGVzdEk2NCgpLCBNYXRoLnBvdygtMiwgNTIpKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKKyAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgICAgICBkb25lKCk7CisgICAgICB9CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnalEgQXN5bmMnKTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDMwKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisKKyAgICBjb25zdCBqcXhociA9IGNsaWVudC50ZXN0STMyKE1hdGgucG93KC0yLCAzMSksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisKKyAgICBqcXhoci5zdWNjZXNzKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOworICAgIH0pCisgICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7IGFzc2VydC5vayhmYWxzZSwgZS5tZXNzYWdlKTsgfSkKKyAgICAuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOworICAgIH0pCisgICAgLmNvbXBsZXRlKGZ1bmN0aW9uKCkgeworICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworCisgICAgY29uc3QgZGZkID0gY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgICAgZG9uZSgpOworICAgIH0pCisgICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7CisgICAgICBhc3NlcnQuZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CisgICAgICAkKGRvY3VtZW50KS5hamF4RXJyb3IoIGZ1bmN0aW9uKCkgeyBkb25lKCk7IH0gKTsKKyAgICB9KTsKKyAgfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODQyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbApAQCAtMCwwICsxLDUyIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgorCisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1ub2pxLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODAxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuanMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKKyAqIHdpbGwgcnVuIG9ubHkgd2l0aCBub3JtYWwgIi1nZW4ganMiIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KKyAqIFRvIGNyZWF0ZSBjbGllbnQgY29kZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBUaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIFNlZSBhbHNvOgorICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cworICogKysgdGVzdC1qcS5qcyBmb3IgIi1nZW4ganM6anF1ZXJ5IiBvbmx5IHRlc3RzCisgKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvL0FzeW5jIGV4Y2VwdGlvbiB0ZXN0cworCitRVW5pdC5tb2R1bGUoJ05valEgQXN5bmMnKTsKKworUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5lcnJvckNvZGUsIDEwMDEpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDU3NTYzY2EuLjhiNjcwMTQKLS0tIGEvbGliL2pzL3Rlc3QvdGVzdC5odG1sCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KIDwhLS0KICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTYsMTE5ICsxNywzOCBAQAogICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci0KLTxodG1sPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgogPGhlYWQ+Ci0gIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5ncyAtIEV4YW1wbGU8L3RpdGxlPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKyAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3Q8L3RpdGxlPgogCi0gIDxzY3JpcHQgc3JjPSIvdGhyaWZ0LmpzIiAgICAgICAgICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtanF1ZXJ5L1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzLWpxdWVyeS9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIAotICA8IS0tIGZvciBhc3luYyBleGFtcGxlIC0tPgotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuMy4yL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0PgorICA8IS0tIGpRdWVyeSAtLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL2pxdWVyeS5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+CisKKyAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtanEuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIDwvaGVhZD4KLTxib2R5IGlkPSJib2R5Ij4KLQotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0KLSAgLy9jcmVhdGUgY2xpZW50Ci0gIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgiL3NlcnZpY2UiKQotICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpCi0gIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKQotCi0gIC8vY3JlYXRlIGluc2FuaXR5IG9iagotICB2YXIgaW5zYW5pdHkgID0gbmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoKQotICBpbnNhbml0eS51c2VyTWFwW1RocmlmdFRlc3QuTnVtYmVyei5PTkVdID0gMQotICBpbnNhbml0eS51c2VyTWFwW1RocmlmdFRlc3QuTnVtYmVyei5UV09dID0gMgotCi0gIHZhciB4dHIgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKQotICB4dHIuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCcKLSAgaW5zYW5pdHkueHRydWN0cy5wdXNoKHh0cikKLQotICB2YXIgeHRyMj0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpCi0gIHh0cjIuc3RydWN0X3RoaW5nID0geHRyCi0KLSAgdmFyIGxpc3QgPSBbMSwyLDNdCi0KLSAgLy9ydW4gdGVzdHMgc3luY2hyb25vdXNseQotCi0gIGRvY3VtZW50LndyaXRlKCI8aDI+PHU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M8L3U+PC9oMj4iKQotICBkb2N1bWVudC53cml0ZSgiPGgyPlN5bmNocm9ub3VzIEV4YW1wbGU8L2gyPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdFN0cmluZygpID0+ICIrKGNsaWVudC50ZXN0U3RyaW5nKCJ3b3JrcyIpICAgICA9PSAid29ya3MiKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RTdHJpbmcodXRmLTgpID0+ICIrKGNsaWVudC50ZXN0U3RyaW5nKCJhh46Sl5xlIikgICA9PSAiYYeOkpecZSIpKyI8YnIvPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdERvdWJsZSgpID0+ICIrKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpICAgICAgICA9PSAzLjE0KSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RCeXRlKCkgICA9PiAiKyhjbGllbnQudGVzdEJ5dGUoMHgwMSkgICAgICAgICAgPT0gMHgwMSkrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0STMyKCkgICAgPT4gIisoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCkpID09IE1hdGgucG93KDIsMzApKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RJNjQoKSAgICA9PiAiKyhjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLDYwKSkgPT0gTWF0aC5wb3coMiw2MCkpKyI8YnIvPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdFN0cnVjdCgpID0+ICIrKGNsaWVudC50ZXN0U3RydWN0KHh0cikuc3RyaW5nX3RoaW5nID09ICJ3b3JrZWQiKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3ROZXN0KCkgICA9PiAiKyhjbGllbnQudGVzdE5lc3QoeHRyMikuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9PSAid29ya2VkIikrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0TWFwKCkgICAgPT4gIisoY2xpZW50LnRlc3RNYXAoaW5zYW5pdHkudXNlck1hcClbVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORV0gPT0gMSkrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0TGlzdCgpICAgPT4gIisoY2xpZW50LnRlc3RMaXN0KGxpc3QpLmxlbmd0aCA9PSAzKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RTZXQoKSAgICA9PiAiKyhjbGllbnQudGVzdFNldChsaXN0KS5sZW5ndGggPT0gMykrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0RW51bSgpICAgPT4gIisoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpID09IFRocmlmdFRlc3QuTnVtYmVyei5PTkUpKyI8YnIvPiIpCi0KLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKCkgPT4gIikKLSAgdHJ5ewotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJnbyIpCi0gICAgZG9jdW1lbnQud3JpdGUoImZhbHNlPGJyLz4iKQotICB9Y2F0Y2goZSl7Ci0gICAgZG9jdW1lbnQud3JpdGUoInRydWU8YnIvPiIpCi0gIH0KLQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RJbnNhbml0eSgpID0+ICIpCi0gIHZhciByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuaXR5KQotCi0gIGRvY3VtZW50LndyaXRlKChyZXNbIjEiXVsiMSJdLnh0cnVjdHNbMF0uc3RyaW5nX3RoaW5nID09ICJ3b3JrZWQiKSsiPGJyLz4iKQotCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgLy9SdW4gc2FtZSB0ZXN0cyBhc3luY2hyb25vdXNseQotCi0gIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpCi0gIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCkKLSAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpCi0KLSAgZG9jdW1lbnQud3JpdGUoIjxoMj5Bc3luY2hyb25vdXMgRXhhbXBsZTwvaDI+IikKLSAgalF1ZXJ5LmFqYXgoewotICAgICB1cmw6ICIvc2VydmljZSIsCi0gICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJMzIoTWF0aC5wb3coMiwzMCkpLAotICAgICB0eXBlOiAiUE9TVCIsCi0gICAgIGNhY2hlOiBmYWxzZSwKLSAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKXsKLSAgICAgICAgICAgIHZhciBfdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKQotICAgICAgICAgICAgdmFyIF9wcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKF90cmFuc3BvcnQpCi0gICAgICAgICAgICB2YXIgX2NsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQoX3Byb3RvY29sKQotCi0gICAgICAgICAgICBfdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIoIHJlcyApCi0KLSAgICAgICAgICAgIHZhciB2ID0gIF9jbGllbnQucmVjdl90ZXN0STMyKCkKLSAgICAgICAgICAgICQoIiNib2R5IikuYXBwZW5kKCJjbGllbnQudGVzdEkzMigpICAgID0+ICIrKHYgPT0gTWF0aC5wb3coMiwzMCkpKyI8YnIvPiIpCi0KLSAgICAgfQotICB9KQotCi0gIGpRdWVyeS5hamF4KHsKLSAgICAgdXJsOiAiL3NlcnZpY2UiLAotICAgICBkYXRhOiBjbGllbnQuc2VuZF90ZXN0STY0KE1hdGgucG93KDIsNjApKSwKLSAgICAgdHlwZTogIlBPU1QiLAotICAgICBjYWNoZTogZmFsc2UsCi0gICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcyl7Ci0gICAgICAgICAgICB2YXIgX3RyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCkKLSAgICAgICAgICAgIHZhciBfcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbChfdHJhbnNwb3J0KQotICAgICAgICAgICAgdmFyIF9jbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KF9wcm90b2NvbCkKLQotICAgICAgICAgICAgX3RyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKCByZXMgKQotCi0gICAgICAgICAgICB2YXIgdiA9ICBfY2xpZW50LnJlY3ZfdGVzdEk2NCgpCi0gICAgICAgICAgICAkKCIjYm9keSIpLmFwcGVuZCgiY2xpZW50LnRlc3RJNjQoKSAgICA9PiAiKyh2ID09IE1hdGgucG93KDIsNjApKSsiPGJyLz4iKQotCi0gICAgIH0KLSAgfSkKLQotCi0KLTwvc2NyaXB0PgotCis8Ym9keT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KKyAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CisgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QuanMgYi9saWIvanMvdGVzdC90ZXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4NmE1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LmpzCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgLyoganNoaW50IC1XMTAwICovCisKKy8qCisgKiBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUgZm9yIFRocmlmdFRlc3QudGhyaWZ0LiBUaGVzZSB0ZXN0cworICogd2lsbCBydW4gYWdhaW5zdCBOb3JtYWwgKC1nZW4ganMpIGFuZCBqUXVlcnkgKC1nZW4ganM6anF1ZXJ5KQorICogQXBhY2hlIFRocmlmdCBpbnRlcmZhY2VzLgorICoKKyAqIFN5bmNocm9ub3VzIGJsb2NraW5nIGNhbGxzIHNob3VsZCBiZSBpZGVudGljYWwgaW4gYm90aAorICogTm9ybWFsIGFuZCBqUXVlcnkgaW50ZXJmYWNlcy4gQWxsIHN5bmNocm9ub3VzIHRlc3RzIGJlbG9uZworICogaGVyZS4KKyAqCisgKiBBc3luY2hyb25vdXMgc3VjY2VzcyBjYWxsYmFja3MgcGFzc2VkIGFzIHRoZSBsYXN0IHBhcmFtZXRlcgorICogb2YgYW4gUlBDIGNhbGwgc2hvdWxkIGJlIGlkZW50aWNhbCBpbiBib3RoIE5vcm1hbCBhbmQgalF1ZXJ5CisgKiBpbnRlcmZhY2VzLiBBc3luYyBzdWNjZXNzIHRlc3RzIGJlbG9uZyBoZXJlLgorICoKKyAqIEFzeW5jaHJvbm91cyBleGNlcHRpb24gcHJvY2Vzc2luZyBpcyBkaWZmZXJlbnQgaW4gTm9ybWFsCisgKiBhbmQgalF1ZXJ5IGludGVyZmFjZXMuIFN1Y2ggdGVzdHMgYmVsb25nIGluIHRoZSB0ZXN0LW5vanEuanMKKyAqIG9yIHRlc3QtanEuanMgZmlsZXMgcmVzcGVjdGl2ZWx5LiBqUXVlcnkgc3BlY2lmaWMgWEhSIG9iamVjdAorICogdGVzdHMgYWxzbyBiZWxvbmcgaW4gdGVzdC1qcS5qcy4gRG8gbm90IGNyZWF0ZSBhbnkgalF1ZXJ5CisgKiBkZXBlbmRlbmNpZXMgaW4gdGhpcyBmaWxlIG9yIGluIHRlc3Qtbm9qcS5qcworICoKKyAqIFRvIGNvbXBpbGUgY2xpZW50IGNvZGUgZm9yIHRoaXMgdGVzdCB1c2U6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganMgVGhyaWZ0VGVzdC50aHJpZnQKKyAqICAgICAgLS0gb3IgLS0KKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqczpqcXVlcnkgVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBTZWUgYWxzbzoKKyAqICsrIHRlc3Qtbm9qcS5qcyBmb3IgIi1nZW4ganMiIG9ubHkgdGVzdHMKKyAqICsrIHRlc3QtanEuanMgZm9yICItZ2VuIGpzOmpxdWVyeSIgb25seSB0ZXN0cworICovCisKK2NvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Citjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCitpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CisgIC8vIFdoZW4gdXNpbmcgcmVhbCBRVW5pdCAoZnJvbiBQaGFudG9tSlMpIGxvZyBmYWlsdXJlcyB0byBjb25zb2xlCisgIFFVbml0LmxvZyhmdW5jdGlvbihkZXRhaWxzKSB7CisgICAgaWYgKCFkZXRhaWxzLnJlc3VsdCkgeworICAgICAgY29uc29sZS5sb2coJz09PT09PT09IEZBSUwgPT09PT09PT0nKTsKKyAgICAgIGNvbnNvbGUubG9nKCdUZXN0TmFtZTogJyArIGRldGFpbHMubmFtZSk7CisgICAgICBpZiAoZGV0YWlscy5tZXNzYWdlKSBjb25zb2xlLmxvZyhkZXRhaWxzLm1lc3NhZ2UpOworICAgICAgY29uc29sZS5sb2coJ0V4cGVjdGVkOiAnICsgZGV0YWlscy5leHBlY3RlZCk7CisgICAgICBjb25zb2xlLmxvZygnQWN0dWFsICA6ICcgKyBkZXRhaWxzLmFjdHVhbCk7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PScpOworICAgIH0KKyAgfSk7Cit9CisKKy8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKK2NvbnN0IHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKK2Z1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxLCBtYXAyKSB7CisgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgeworICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gJ29iamVjdCcpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gbWFwMSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMVtrZXldLCBtYXAyW2tleV0pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitRVW5pdC5tb2R1bGUoJ0Jhc2UgVHlwZXMnKTsKKworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICB9KTsKKyAgUVVuaXQudGVzdCgnQmluYXJ5IChTdHJpbmcpJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgbGV0IGJpbmFyeSA9ICcnOworICAgIGZvciAobGV0IHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICB9CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdCaW5hcnkgKFVpbnQ4QXJyYXkpJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgbGV0IGJpbmFyeSA9ICcnOworICAgIGZvciAobGV0IHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICB9CisgICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7CisgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyArK2kpIHsKKyAgICAgIGFycltpXSA9IGJpbmFyeVtpXS5jaGFyQ29kZUF0KCk7CisgICAgfQorICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJpbmFyeShhcnIpLCBiaW5hcnkpOworICB9KTsKKyAgUVVuaXQudGVzdCgnU3RyaW5nJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KSwgc3RyaW5nVGVzdCk7CisKKyAgICBjb25zdCBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKworICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMpLCBzcGVjaWFsQ2hhcmFjdGVycyk7CisgIH0pOworICBRVW5pdC50ZXN0KCdEb3VibGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMCksIDApOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZSgtMSksIC0xKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCkpLCBNYXRoLnBvdygyLCA2MCkpOworICB9KTsKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJ5dGUoMCksIDApOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOworICB9KTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApKSwgTWF0aC5wb3coMiwgMzApKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSksIC1NYXRoLnBvdygyLCAzMCkpOworICB9KTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KDApLCAwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSksIE1hdGgucG93KDIsIDUyKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdTdHJ1Y3R1cmVkIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnU3RydWN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3Qgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3Qgc3RydWN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CisKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisKKyAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICB9KTsKKworICBRVW5pdC50ZXN0KCdOZXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3QgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAyOworICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OworICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOworCisgICAgY29uc3QgbmVzdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCk7CisKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKworICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OworCisgICAgY29uc3QgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCk7CisKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgYXNzZXJ0LmVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgIH0KKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKKyAgICB9OworCisgICAgY29uc3QgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCk7CisKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgYXNzZXJ0LmVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgIH0KKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3Qgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGFzc2VydC5vayhjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLCBzZXRUZXN0SW5wdXQpOworICB9KTsKKworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBhc3NlcnQub2soY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQpLCBsaXN0VGVzdElucHV0KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICB9KTsKKworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0VHlwZWRlZig2OSksIDY5KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU2tpcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIGNvbnN0IG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKyAgICBtb2RpZmllZENsaWVudC5yZWN2X3Rlc3RTdHJ1Y3QgPSBmdW5jdGlvbigpIHsKKyAgICAgIGNvbnN0IGlucHV0ID0gbW9kaWZpZWRDbGllbnQuaW5wdXQ7CisgICAgICBjb25zdCB4dHJ1Y3QzID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MygpOworCisgICAgICBpbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICBpbnB1dC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgLy8gcmVhZCBYdHJ1Y3QgZGF0YSB3aXRoIFh0cnVjdDMKKyAgICAgIGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICB4dHJ1Y3QzLnJlYWQoaW5wdXQpOworICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisgICAgICAvLyByZWFkIFRocmlmdC5UeXBlLlNUT1AgbWVzc2FnZQorICAgICAgaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOworCisgICAgICBpbnB1dC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICByZXR1cm4geHRydWN0MzsKKyAgICB9OworCisgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICBjb25zdCBzdHJ1Y3RUZXN0T3V0cHV0ID0gbW9kaWZpZWRDbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworCisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQgaW5zdGFuY2VvZiBUaHJpZnRUZXN0Llh0cnVjdDMsIHRydWUpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuY2hhbmdlZCwgbnVsbCk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICB9KTsKKworCitRVW5pdC5tb2R1bGUoJ2RlZXBlciEnKTsKKworICBRVW5pdC50ZXN0KCdNYXBNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQorICAgIH07CisKKyAgICBjb25zdCBtYXBNYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisKKworICAgIGZvciAobGV0IGtleSBpbiBtYXBNYXBUZXN0T3V0cHV0KSB7CisgICAgICBmb3IgKGxldCBrZXkyIGluIG1hcE1hcFRlc3RPdXRwdXRba2V5XSkgeworICAgICAgICBhc3NlcnQuZXF1YWwobWFwTWFwVGVzdE91dHB1dFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgICB9CisgICAgfQorCisgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnRXhjZXB0aW9uJyk7CisKKyAgUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB0cnkgeworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgIH1jYXRjaCAoZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgIH0KKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICB0cnkgeworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ25vIEV4Y2VwdGlvbicpOworICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgIH1jYXRjaCAoZSkgeworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICB9CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAvL1RocmlmdFRlc3QgZG9lcyBub3QgbGlzdCBURXhjZXB0aW9uIGFzIGEgbGVnYWwgZXhjZXB0aW9uIHNvIGl0IHdpbGwKKyAgICAvLyBnZW5lcmF0ZSBhbiBleGNlcHRpb24gb24gdGhlIHNlcnZlciB0aGF0IGRvZXMgbm90IHByb3BhZ2F0ZSBiYWNrIHRvCisgICAgLy8gdGhlIGNsaWVudC4gVGhpcyB0ZXN0IGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVxdWF0ZSB0byAibm8gZXhjZXB0aW9uIgorICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgLy9hc3NlcnQub2soZmFsc2UpOworICAgIH0KKyAgICBhc3NlcnQub2sodHJ1ZSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnSW5zYW5pdHknKTsKKworICBjb25zdCBjcmF6eSA9IHsKKyAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAneHRydWN0cyc6IFt7CisgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICB9LAorICAgIHsKKyAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICB9XQorICB9OworICBRVW5pdC50ZXN0KCd0ZXN0SW5zYW5pdHknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IGNyYXp5LAorICAgICAgICAnMyc6IGNyYXp5CisgICAgICB9LAorICAgICAgJzInOiB7ICc2JzogeyAndXNlck1hcCc6IG51bGwsICd4dHJ1Y3RzJzogbnVsbCB9IH0KKyAgICB9OworICAgIGNvbnN0IHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoY3JhenkpKTsKKyAgICBhc3NlcnQub2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisKKyAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CisgIH0pOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vUnVuIHNhbWUgdGVzdHMgYXN5bmNocm9ub3VzbHkKKworUVVuaXQubW9kdWxlKCdBc3luYycpOworCisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3REb3VibGUoMy4xNDE1OTI2NSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0MTU5MjY1KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMHgwMSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coLTIsIDMxKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZG9uZSgpOworICAgIH0pOworCisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzIGIvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNWY3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkCisvLyAgQXBhY2hlIFRocmlmdCB0ZXN0IHNlcnZpY2UuCisKK2NvbnN0IGVzNk1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXM2Jyk7Citjb25zdCBnZW5Gb2xkZXIgPSBlczZNb2RlID8gJ2dlbi1ub2RlanMtZXM2JyA6ICdnZW4tbm9kZWpzJzsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpLlRFeGNlcHRpb247CisKK2V4cG9ydHMuVGhyaWZ0VGVzdEhhbmRsZXIgPSB7CisgIHRlc3RWb2lkOiBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFZvaWQoKScpOworICAgIHJlc3VsdChudWxsKTsKKyAgfSwKKyAgdGVzdFN0cmluZzogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nKFwnJyArIHRoaW5nICsgJ1wnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RCeXRlOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RCeXRlKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEkzMjogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0STMyKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEk2NDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0STY0KCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdERvdWJsZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0RG91YmxlKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEJpbmFyeTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0QmluYXJ5KFwnJyArIHRoaW5nICsgJ1wnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTdHJ1Y3Q6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cnVjdCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0TmVzdDogZnVuY3Rpb24obmVzdCwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3ROZXN0KCcpOworICAgIGNvbnNvbGUubG9nKG5lc3QpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIG5lc3QpOworICB9LAorICB0ZXN0TWFwOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RNYXAoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdFN0cmluZ01hcDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nTWFwKCcpOworICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTZXQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFNldCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0TGlzdDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TGlzdCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0RW51bTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0RW51bSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RUeXBlZGVmOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RUeXBlZGVmKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdE1hcE1hcDogZnVuY3Rpb24oaGVsbG8sIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwTWFwKCcgKyBoZWxsbyArICcpJyk7CisKKyAgICBjb25zdCBtYXBtYXAgPSBbXTsKKyAgICBjb25zdCBwb3MgPSBbXTsKKyAgICBjb25zdCBuZWcgPSBbXTsKKyAgICBmb3IgKGxldCBpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgcG9zW2ldID0gaTsKKyAgICAgIG5lZ1staV0gPSAtaTsKKyAgICB9CisgICAgbWFwbWFwWzRdID0gcG9zOworICAgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgICByZXN1bHQobnVsbCwgbWFwbWFwKTsKKyAgfSwKKyAgdGVzdEluc2FuaXR5OiBmdW5jdGlvbihhcmd1bWVudCwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RJbnNhbml0eSgnKTsKKyAgICBjb25zb2xlLmxvZyhhcmd1bWVudCk7CisgICAgY29uc29sZS5sb2coJyknKTsKKworICAgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSAyOworICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CisKKyAgICBjb25zdCBnb29kYnllID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICdHb29kYnllNCc7CisgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKKyAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OworCisgICAgY29uc3QgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgY3JhenkudXNlck1hcCA9IFtdOworICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRUlHSFRdID0gODsKKyAgICBjcmF6eS51c2VyTWFwW3R0eXBlcy5OdW1iZXJ6LkZJVkVdID0gNTsKKyAgICBjcmF6eS54dHJ1Y3RzID0gW2dvb2RieWUsIGhlbGxvXTsKKworICAgIGNvbnN0IGZpcnN0X21hcCA9IFtdOworICAgIGNvbnN0IHNlY29uZF9tYXAgPSBbXTsKKworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gY3Jhenk7CisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OworCisgICAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKKworICAgIGNvbnN0IGluc2FuZSA9IFtdOworICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKyAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgICAgY29uc29sZS5sb2coJ2luc2FuZSByZXN1bHQ6Jyk7CisgICAgY29uc29sZS5sb2coaW5zYW5lKTsKKyAgICByZXN1bHQobnVsbCwgaW5zYW5lKTsKKyAgfSwKKyAgdGVzdE11bHRpOiBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE11bHRpKCknKTsKKworICAgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CisgICAgcmVzdWx0KG51bGwsIGhlbGxvKTsKKyAgfSwKKyAgdGVzdEV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignICsgYXJnICsgJyknKTsKKyAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7CisgICAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnID09PSAnVEV4Y2VwdGlvbicpIHsKKyAgICAgIHJlc3VsdChuZXcgVEV4Y2VwdGlvbihhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0KG51bGwpOworICAgIH0KKyAgfSwKKyAgdGVzdE11bHRpRXhjZXB0aW9uOiBmdW5jdGlvbihhcmcwLCBhcmcxLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICAgIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKKyAgICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CisgICAgICByZXN1bHQoeCk7CisgICAgfSBlbHNlIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uMicpKSB7CisgICAgICBjb25zdCB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgICAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOworICAgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgICAgcmVzdWx0KHgyKTsKKyAgICB9CisKKyAgICBjb25zdCByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgIHJlc3VsdChudWxsLCByZXMpOworICB9LAorICB0ZXN0T25ld2F5OiBmdW5jdGlvbihzbGVlcEZvciwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RPbmV3YXkoJyArIHNsZWVwRm9yICsgJykgPT4gSmF2YVNjcmlwdCAobGlrZSBSdXN0KSBuZXZlciBzbGVlcHMhJyk7CisgIH0KK307ICAgLy9UaHJpZnRUZXN0U3ZjSGFuZGxlcgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0d3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQ1MDBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwKQEAgLTAsMCArMSw2MiBAQAor77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KKworICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0galF1ZXJ5IC0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgIDxzY3JpcHQ+CisgICAgY29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uOworICAgIGNvbnN0IHdzX3VyaSA9ICgobG9jLnByb3RvY29sID09PSAiaHR0cHM6IikgPyAid3NzOi8vIiA6ICJ3czovLyIpICsKKyAgICAgICAgICAgICAgICAgICBsb2MuaG9zdG5hbWUgKyAiOiIgKyBsb2MucG9ydCArIGxvYy5wYXRobmFtZTsKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRXZWJTb2NrZXRUcmFuc3BvcnQod3NfdXJpKTsKKyAgICBjb25zdCBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgY29uc3QgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgPC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtYXN5bmMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+CisgIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3RocmlmdC5qcyBiL2xpYi9qcy90aHJpZnQuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDk4NmYuLjAwMDAwMDAKLS0tIGEvbGliL2pzL3RocmlmdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDY3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi12YXIgVGhyaWZ0ID0gewotCi0gICAgVHlwZSA6IHsKLSAgICAgICAgIlNUT1AiICAgOiAwLAotICAgICAgICAiVk9JRCIgICA6IDEsCi0gICAgICAgICJCT09MIiAgIDogMiwKLSAgICAgICAgIkJZVEUiICAgOiAzLAotICAgICAgICAiSTA4IiAgICA6IDMsCi0gICAgICAgICJET1VCTEUiIDogNCwKLSAgICAgICAgIkkxNiIgICAgOiA2LAotICAgICAgICAiSTMyIiAgICA6IDgsCi0gICAgICAgICJJNjQiICAgIDogMTAsCi0gICAgICAgICJTVFJJTkciIDogMTEsCi0gICAgICAgICJVVEY3IiAgIDogMTEsCi0gICAgICAgICJTVFJVQ1QiIDogMTIsCi0gICAgICAgICJNQVAiICAgIDogMTMsCi0gICAgICAgICJTRVQiICAgIDogMTQsCi0gICAgICAgICJMSVNUIiAgIDogMTUsCi0gICAgICAgICJVVEY4IiAgIDogMTYsCi0gICAgICAgICJVVEYxNiIgIDogMTcKLSAgICB9LAotCi0gICAgTWVzc2FnZVR5cGUgOiB7Ci0gICAgICAgICJDQUxMIiAgICAgIDogMSwKLSAgICAgICAgIlJFUExZIiAgICAgOiAyLAotICAgICAgICAiRVhDRVBUSU9OIiA6IDMKLSAgICB9Ci19Ci0KLVRocmlmdC5URXhjZXB0aW9uID0ge30KLVRocmlmdC5URXhjZXB0aW9uLnByb3RvdHlwZSA9IHsgCi0gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oIG1lc3NhZ2UsIGNvZGUgKSB7Ci0gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICAgICAgdGhpcy5jb2RlICAgID0gKGNvZGUgPT0gbnVsbCkgPyAwIDogY29kZTsKLSAgICB9Ci19Ci0KLQotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IHsKLSAgICAiVU5LTk9XTiIgICAgICAgICAgICAgIDogMCwKLSAgICAiVU5LTk9XTl9NRVRIT0QiICAgICAgIDogMSwKLSAgICAiSU5WQUxJRF9NRVNTQUdFX1RZUEUiIDogMiwKLSAgICAiV1JPTkdfTUVUSE9EX05BTUUiICAgIDogMywKLSAgICAiQkFEX1NFUVVFTkNFX0lEIiAgICAgIDogNCwKLSAgICAiTUlTU0lOR19SRVNVTFQiICAgICAgIDogNSAgICAgICAKLX0KLQotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGNvZGUpewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UKLSAgICB0aGlzLmNvZGUgICAgPSAoY29kZSA9PSBudWxsKSA/IDAgOiBjb2RlCi19Ci0KLVRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlID0geyAKLSAgICAgICAKLSAgICByZWFkIDogZnVuY3Rpb24oaW5wdXQpewotICAgICAgICAKLSAgICAgICAgdmFyIGZ0eXBlCi0gICAgICAgIHZhciBmaWQKLSAgICAgICAgdmFyIHJldCA9IGlucHV0LnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSkgCi0gICAgICAgIAotICAgICAgICB0aGlzLmZuYW1lID0gcmV0LmZuYW1lICAgICAgCi0gICAgICAgIAotICAgICAgICB3aGlsZSgxKXsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZihyZXQuZnR5cGUgPT0gVFR5cGUuU1RPUCkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgCi0gICAgICAgICAgICB2YXIgZmlkID0gcmV0LmZpZAotICAgICAgICAgICAgCi0gICAgICAgICAgICBzd2l0Y2goZmlkKXsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IAotICAgICAgICAgICAgICAgICAgICBpZiggcmV0LmZ0eXBlID09IFR5cGUuU1RSSU5HICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJldC52YWx1ZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBpZiggcmV0LmZ0eXBlID09IFR5cGUuSTMyICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkSTMyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZSA9IHJldC52YWx1ZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICAgPSBpbnB1dC5za2lwKHJldC5mdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCkKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnB1dC5yZWFkU3RydWN0RW5kKCkKLSAgICAgICAgCi0gICAgfSwKLSAgICAKLSAgICB3cml0ZTogZnVuY3Rpb24ob3V0cHV0KXsKLSAgICAgICAgdmFyIHhmZXIgICA9IDA7Ci0gICAgICAgIAotICAgICAgICBvdXRwdXQud3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7Ci0gICAgICAgIAotICAgICAgICBpZiAodGhpcy5tZXNzYWdlKSB7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVHlwZS5TVFJJTkcsIDEpCi0gICAgICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcodGhpcy5nZXRNZXNzYWdlKCkpCi0gICAgICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzLmNvZGUpIHsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUeXBlLkkzMiwgMikKLSAgICAgICAgICAgIG91dHB1dC53cml0ZUkzMih0aGlzLmNvZGUpCi0gICAgICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG91dHB1dC53cml0ZUZpZWxkU3RvcCgpCi0gICAgICAgIG91dHB1dC53cml0ZVN0cnVjdEVuZCgpCi0gICAgICAgCi0gICAgfSwKLSAgICAKLSAgICBnZXRDb2RlIDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvZGUKLSAgICB9LAotICAgIAotICAgIGdldE1lc3NhZ2UgOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZQotICAgIH0KLX0KLQotCi0KLS8qKgotICpJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB1cmwgdGhlbiB5b3UgbXVzdCBoYW5kbGUgYWpheCBvbiB5b3VyIG93bi4KLSAqVGhpcyBpcyBob3cgdG8gdXNlIGpzIGJpbmRpbmdzIGluIGEgYXN5bmMgZmFzaGlvbi4KLSAqLwotVGhyaWZ0LlRyYW5zcG9ydCA9IGZ1bmN0aW9uKHVybCl7Ci0gICAgdGhpcy51cmwgICAgICA9IHVybAotICAgIHRoaXMud3BvcyAgICAgPSAwCi0gICAgdGhpcy5ycG9zICAgICA9IDAKLQotICAgIHRoaXMuc2VuZF9idWYgPSAnJwotICAgIHRoaXMucmVjdl9idWYgPSAnJwotfQotCi1UaHJpZnQuVHJhbnNwb3J0LnByb3RvdHlwZSA9IHsKLQotICAgIC8vR2V0cyB0aGUgYnJvd3NlciBzcGVjaWZpYyBYbWxIdHRwUmVxdWVzdCBPYmplY3QKLSAgICBnZXRYbWxIdHRwUmVxdWVzdE9iamVjdCA6IGZ1bmN0aW9uKCkgewotCQotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCkgfSBjYXRjaChlKSB7fQotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIikgfSBjYXRjaCAoZSkge30KLSAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpIH0gY2F0Y2ggKGUpIHt9Ci0KLSAgICAgICAgdGhyb3cgIllvdXIgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIFhtbEh0dHBSZXF1ZXN0IG9iamVjdC4gIFRyeSB1cGdyYWRpbmcgdG8gRmlyZWZveC4iCi0JCi0gICAgfSwKLQotICAgIGZsdXNoIDogZnVuY3Rpb24oKXsKLQotICAgICAgICAvL2FzeW5jIG1vZGUKLSAgICAgICAgaWYodGhpcy51cmwgPT0gdW5kZWZpbmVkIHx8IHRoaXMudXJsID09ICcnKQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7Ci0KLSAgICAgICAgdmFyIHhyZXEgPSB0aGlzLmdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0KCkKLSAgICAgICAgCQkKLSAgICAgICAgaWYgKHhyZXEub3ZlcnJpZGVNaW1lVHlwZSkKLSAgICAgICAgICAgIHhyZXEub3ZlcnJpZGVNaW1lVHlwZSgiYXBwbGljYXRpb24vanNvbiIpCi0gICAgICAgIAotICAgICAgICB4cmVxLm9wZW4oIlBPU1QiLCB0aGlzLnVybCwgZmFsc2UpCi0gICAgICAgIHhyZXEuc2VuZCh0aGlzLnNlbmRfYnVmKQotICAgICAgICAKLSAgICAgICAgaWYgKHhyZXEucmVhZHlTdGF0ZSAhPSA0KQotICAgICAgICAgICAgdGhyb3cgImVuY291bnRlcmVkIGFuIHVua25vd24gYWpheCByZWFkeSBzdGF0ZTogIit4cmVxLnJlYWR5U3RhdGUKLSAgICAgICAgCi0gICAgICAgIGlmICh4cmVxLnN0YXR1cyAhPSAyMDApCi0gICAgICAgICAgICB0aHJvdyAiZW5jb3VudGVyZWQgYSB1bmtub3duIHJlcXVlc3Qgc3RhdHVzOiAiK3hyZXEuc3RhdHVzCi0KLSAgICAgICAgdGhpcy5yZWN2X2J1ZiAgICA9IHhyZXEucmVzcG9uc2VUZXh0Ci0gICAgICAgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aAotICAgICAgICB0aGlzLndwb3MgICAgICAgID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGgKLSAgICAgICAgdGhpcy5ycG9zICAgICAgICA9IDAKLSAgICB9LAotCi0gICAgc2V0UmVjdkJ1ZmZlciA6IGZ1bmN0aW9uKGJ1Zil7Ci0gICAgICAgIHRoaXMucmVjdl9idWYgICAgPSBidWYKLSAgICAgICAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoCi0gICAgICAgIHRoaXMud3BvcyAgICAgICAgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aAotICAgICAgICB0aGlzLnJwb3MgICAgICAgID0gMAotICAgIH0sCi0KLSAgICBpc09wZW4gOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRydWUKLSAgICB9LAotCi0gICAgb3BlbiA6IGZ1bmN0aW9uKCkge30sCi0KLSAgICBjbG9zZTogZnVuY3Rpb24oKSB7fSwKLQotICAgIHJlYWQgOiBmdW5jdGlvbihsZW4pIHsKLSAgICAgICAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zCi0gICAgICAgCi0gICAgICAgIGlmKGF2YWlsID09IDApCi0gICAgICAgICAgICByZXR1cm4gJycKLQotICAgICAgICB2YXIgZ2l2ZSA9IGxlbgotCi0gICAgICAgIGlmKGF2YWlsIDwgbGVuKQotICAgICAgICAgICAgZ2l2ZSA9IGF2YWlsCi0KLSAgICAgICAgdmFyIHJldCA9IHRoaXMucmVhZF9idWYuc3Vic3RyKHRoaXMucnBvcyxnaXZlKQotICAgICAgICB0aGlzLnJwb3MgKz0gZ2l2ZQotCi0gICAgICAgIC8vY2xlYXIgYnVmIHdoZW4gY29tcGxldGU/Ci0gICAgICAgIHJldHVybiByZXQKLSAgICB9LAotCi0gICAgcmVhZEFsbCA6IGZ1bmN0aW9uKCkgewotICAgICAgIHJldHVybiB0aGlzLnJlY3ZfYnVmCi0gICAgfSwKLQotICAgIHdyaXRlIDogZnVuY3Rpb24oYnVmKXsKLSAgICAgICAgdGhpcy5zZW5kX2J1ZiA9IGJ1ZgotICAgIH0sCi0KLSAgICBnZXRTZW5kQnVmZmVyIDogZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWYKLSAgICB9Ci0KLX0KLQotCi0KLVRocmlmdC5Qcm90b2NvbCA9IGZ1bmN0aW9uKHRyYW5zcG9ydCl7Ci0gICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQKLX0KLQotVGhyaWZ0LlByb3RvY29sLlR5cGUgPSB7fQotVGhyaWZ0LlByb3RvY29sLlR5cGVbIFRocmlmdC5UeXBlLkJPT0wgICBdID0gJyJ0ZiInCi1UaHJpZnQuUHJvdG9jb2wuVHlwZVsgVGhyaWZ0LlR5cGUuQllURSAgIF0gPSAnImk4IicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5JMTYgICAgXSA9ICciaTE2IicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5JMzIgICAgXSA9ICciaTMyIicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5JNjQgICAgXSA9ICciaTY0IicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5ET1VCTEUgXSA9ICciZGJsIicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5TVFJVQ1QgXSA9ICcicmVjIicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5TVFJJTkcgXSA9ICcic3RyIicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5NQVAgICAgXSA9ICcibWFwIicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5MSVNUICAgXSA9ICcibHN0IicKLVRocmlmdC5Qcm90b2NvbC5UeXBlWyBUaHJpZnQuVHlwZS5TRVQgICAgXSA9ICcic2V0IicKLQotCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGUgPSB7fQotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAidGYiIF0gPSBUaHJpZnQuVHlwZS5CT09MCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJpOCIgXSA9IFRocmlmdC5UeXBlLkJZVEUKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgImkxNiJdID0gVGhyaWZ0LlR5cGUuSTE2Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJpMzIiXSA9IFRocmlmdC5UeXBlLkkzMgotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAiaTY0Il0gPSBUaHJpZnQuVHlwZS5JNjQgCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJkYmwiXSA9IFRocmlmdC5UeXBlLkRPVUJMRSAKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgInJlYyJdID0gVGhyaWZ0LlR5cGUuU1RSVUNUIAotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAic3RyIl0gPSBUaHJpZnQuVHlwZS5TVFJJTkcKLVRocmlmdC5Qcm90b2NvbC5SVHlwZVsgIm1hcCJdID0gVGhyaWZ0LlR5cGUuTUFQIAotVGhyaWZ0LlByb3RvY29sLlJUeXBlWyAibHN0Il0gPSBUaHJpZnQuVHlwZS5MSVNUCi1UaHJpZnQuUHJvdG9jb2wuUlR5cGVbICJzZXQiXSA9IFRocmlmdC5UeXBlLlNFVCAKLQotVGhyaWZ0LlByb3RvY29sLlZlcnNpb24gPSAxCi0KLVRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUgPSB7Ci0gICAgCi0gICAgZ2V0VHJhbnNwb3J0IDogZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0Ci0gICAgfSwKLQotICAgIC8vV3JpdGUgZnVuY3Rpb25zCi0gICAgd3JpdGVNZXNzYWdlQmVnaW4gOiBmdW5jdGlvbihuYW1lLG1lc3NhZ2VUeXBlLHNlcWlkKXsKLSAgICAgICAgdGhpcy50c3RhY2sgPSBuZXcgQXJyYXkoKQotICAgICAgICB0aGlzLnRwb3MgICA9IG5ldyBBcnJheSgpOwotICAgICAgICAgICAKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlZlcnNpb24sJyInK25hbWUrJyInLG1lc3NhZ2VUeXBlLHNlcWlkXSk7Ci0gICAgfSwKLQotICAgIHdyaXRlTWVzc2FnZUVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHZhciBvYmogPSB0aGlzLnRzdGFjay5wb3AoKQotICAgICAgICAKLSAgICAgICAgdGhpcy53b2JqID0gdGhpcy50c3RhY2sucG9wKCkKLSAgICAgICAgdGhpcy53b2JqLnB1c2gob2JqKQotIAotICAgICAgICB0aGlzLndidWYgPSAiWyIrdGhpcy53b2JqLmpvaW4oIiwiKSsiXSI7Ci0KLSAgICAgICAgdGhpcy50cmFuc3BvcnQud3JpdGUodGhpcy53YnVmKTsgICAgICAgCi0gICAgIH0sCi0KLQotICAgIHdyaXRlU3RydWN0QmVnaW4gOiBmdW5jdGlvbihuYW1lKXsKLSAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKQotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKHt9KQotICAgIH0sCi0KLSAgICB3cml0ZVN0cnVjdEVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIAotICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKQotICAgICAgICB2YXIgc3RydWN0ID0gdGhpcy50c3RhY2tbcF0KLSAgICAgICAgdmFyIHN0ciA9ICJ7IgotICAgICAgICB2YXIgZmlyc3QgPSB0cnVlCi0gICAgICAgIGZvciggdmFyIGtleSBpbiBzdHJ1Y3QgKXsKLSAgICAgICAgICAgIGlmKGZpcnN0KSAKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0ciArPSAiLCI7Ci0KLSAgICAgICAgICAgIHN0ciArPSBrZXkrIjoiK3N0cnVjdFtrZXldCi0gICAgICAgIH0gCi0KLSAgICAgICAgc3RyICs9ICJ9IgotICAgICAgICB0aGlzLnRzdGFja1twXSA9IHN0cjsKLSAgICB9LAotCi0gICAgd3JpdGVGaWVsZEJlZ2luIDogZnVuY3Rpb24obmFtZSxmaWVsZFR5cGUsZmllbGRJZCl7Ci0gICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCkKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaCh7ImZpZWxkSWQiIDogJyInK2ZpZWxkSWQrJyInLCAiZmllbGRUeXBlIiA6IFRocmlmdC5Qcm90b2NvbC5UeXBlW2ZpZWxkVHlwZV19KTsKLSAgICAgICAKLSAgICB9LAotCi0gICAgd3JpdGVGaWVsZEVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHZhciB2YWx1ZSAgICAgPSB0aGlzLnRzdGFjay5wb3AoKQotICAgICAgICB2YXIgZmllbGRJbmZvID0gdGhpcy50c3RhY2sucG9wKCkgCi0gICAgICAgIAotICAgICAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGgtMV1bZmllbGRJbmZvLmZpZWxkSWRdID0gInsiK2ZpZWxkSW5mby5maWVsZFR5cGUrIjoiK3ZhbHVlKyJ9IiAKLSAgICAgICAgdGhpcy50cG9zLnBvcCgpCi0gICAgfSwKLQotICAgIHdyaXRlRmllbGRTdG9wIDogZnVuY3Rpb24oKXsKLSAgICAgICAgLy9uYQotICAgIH0sCi0KLSAgICB3cml0ZU1hcEJlZ2luIDogZnVuY3Rpb24oa2V5VHlwZSx2YWxUeXBlLHNpemUpewotICAgICAgICAvL3NpemUgaXMgaW52YWxpZCwgd2UnbGwgc2V0IGl0IG9uIGVuZC4KLSAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKQotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtrZXlUeXBlXSxUaHJpZnQuUHJvdG9jb2wuVHlwZVt2YWxUeXBlXSwwXSkgCi0gICAgfSwKLQotICAgIHdyaXRlTWFwRW5kIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHAgICA9IHRoaXMudHBvcy5wb3AoKQotICAgICAgICAKLSAgICAgICAgaWYocCA9PSB0aGlzLnRzdGFjay5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBpZigodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpICUgMiAhPSAwKQotICAgICAgICAgICAgdGhpcy50c3RhY2sucHVzaCgiIik7Ci0KLSAgICAgICAgdmFyIHNpemUgPSAodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpLzIKLQotICAgICAgICB0aGlzLnRzdGFja1twXVt0aGlzLnRzdGFja1twXS5sZW5ndGgtMV0gPSBzaXplOwotICAgICAgICAKLSAgICAgICAgdmFyIG1hcCAgID0gInsiCi0gICAgICAgIHZhciBmaXJzdCA9IHRydWUKLSAgICAgICAgd2hpbGUoIHRoaXMudHN0YWNrLmxlbmd0aCA+IHArMSApewotICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnRzdGFjay5wb3AoKQotICAgICAgICAgICAgdmFyIGsgPSB0aGlzLnRzdGFjay5wb3AoKQotICAgICAgICAgICAgaWYoZmlyc3QpewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2UKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIG1hcCArPSAiLCIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgbWFwICArPSAnIicraysnIjonK3YKLSAgICAgICAgfQotICAgICAgICBtYXAgKz0gIn0iCi0gICAgICAgIAotICAgICAgICB0aGlzLnRzdGFja1twXS5wdXNoKG1hcCkKLSAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAiWyIrdGhpcy50c3RhY2tbcF0uam9pbigiLCIpKyJdIgotICAgIH0sCi0KLSAgICB3cml0ZUxpc3RCZWdpbiA6IGZ1bmN0aW9uKGVsZW1UeXBlLHNpemUpewotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpCi0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSxzaXplXSk7Ci0gICAgfSwKLQotICAgIHdyaXRlTGlzdEVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpCi0KLSAgICAgICAgd2hpbGUoIHRoaXMudHN0YWNrLmxlbmd0aCA+IHArMSApewotICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0aGlzLnRzdGFjay5wb3AoKSkKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snK3RoaXMudHN0YWNrW3BdLmpvaW4oIiwiKSsnXSc7Ci0gICAgfSwKLQotICAgIHdyaXRlU2V0QmVnaW4gOiBmdW5jdGlvbihlbGVtVHlwZSxzaXplKXsKLSAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKQotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sc2l6ZV0pOwotICAgIH0sCi0KLSAgICB3cml0ZVNldEVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpCi0KLSAgICAgICAgd2hpbGUoIHRoaXMudHN0YWNrLmxlbmd0aCA+IHArMSApewotICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0aGlzLnRzdGFjay5wb3AoKSkKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snK3RoaXMudHN0YWNrW3BdLmpvaW4oIiwiKSsnXSc7Ci0gICAgfSwKLQotICAgIHdyaXRlQm9vbCA6IGZ1bmN0aW9uKHZhbHVlKXsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaCggdmFsdWUgPyAxIDogMCApOwotICAgIH0sCi0KLSAgICB3cml0ZUJ5dGUgOiBmdW5jdGlvbihpOCl7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTgpOwotICAgIH0sCi0KLSAgICB3cml0ZUkxNiA6IGZ1bmN0aW9uKGkxNil7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTE2KTsKLSAgICB9LAotCi0gICAgd3JpdGVJMzIgOiBmdW5jdGlvbihpMzIpewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGkzMik7Ci0gICAgfSwKLQotICAgIHdyaXRlSTY0IDogZnVuY3Rpb24oaTY0KXsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChpNjQpOwotICAgIH0sCi0KLSAgICB3cml0ZURvdWJsZSA6IGZ1bmN0aW9uKGRibCl7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goZGJsKTsKLSAgICB9LAotCi0gICAgd3JpdGVTdHJpbmcgOiBmdW5jdGlvbihzdHIpewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJytlbmNvZGVVUklDb21wb25lbnQoc3RyKSsnIicpOwotICAgIH0sCi0KLSAgICB3cml0ZUJpbmFyeSA6IGZ1bmN0aW9uKHN0cil7Ci0gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTsKLSAgICB9LAotCi0KLSAgICAKLSAgICAvLyBSZWFkaW5nIGZ1bmN0aW9ucwotICAgIHJlYWRNZXNzYWdlQmVnaW4gOiBmdW5jdGlvbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpewotICAgICAgICB0aGlzLnJzdGFjayA9IG5ldyBBcnJheSgpCi0gICAgICAgIHRoaXMucnBvcyAgID0gbmV3IEFycmF5KCkKLSAgICAgICAKLSAgICAgICAgdGhpcy5yb2JqID0gZXZhbCh0aGlzLnRyYW5zcG9ydC5yZWFkQWxsKCkpCi0gICAgICAgIAotICAgICAgICB2YXIgciA9IHt9ICAgICAKLSAgICAgICAgdmFyIHZlcnNpb24gPSB0aGlzLnJvYmouc2hpZnQoKQotICAgICAgICAKLSAgICAgICAgaWYodmVyc2lvbiAhPSBUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbil7Ci0gICAgICAgICAgICB0aHJvdyAiV3JvbmcgdGhyaWZ0IHByb3RvY29sIHZlcnNpb246ICIrdmVyc2lvbgotICAgICAgICB9Ci0KLSAgICAgICAgclsiZm5hbWUiXSAgPSB0aGlzLnJvYmouc2hpZnQoKQotICAgICAgICByWyJtdHlwZSJdICA9IHRoaXMucm9iai5zaGlmdCgpCi0gICAgICAgIHJbInJzZXFpZCJdID0gdGhpcy5yb2JqLnNoaWZ0KCkKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL2dldCB0byB0aGUgbWFpbiBvYmoKLSAgICAgICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJvYmouc2hpZnQoKSkKLSAgICAgIAotICAgICAgICByZXR1cm4gcgotICAgIH0sCi0KLSAgCi0gICAgcmVhZE1lc3NhZ2VFbmQgOiBmdW5jdGlvbigpewotICAgIH0sCi0KLSAgICByZWFkU3RydWN0QmVnaW4gOiBmdW5jdGlvbihuYW1lKXsKLSAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgclsiZm5hbWUiXSA9ICcnOwotICAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZFN0cnVjdEVuZCA6IGZ1bmN0aW9uKCl7Ci0gICAgfSwKLQotICAgIHJlYWRGaWVsZEJlZ2luIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgCi0gICAgICAgIHZhciBmaWQgICA9IC0xCi0gICAgICAgIHZhciBmdHlwZSA9IFRocmlmdC5UeXBlLlNUT1AgCi0gICAgICAgIAotICAgICAgICAvL2dldCBhIGZpZWxkSWQKLSAgICAgICAgZm9yKHZhciBmIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMV0pKXsKLSAgICAgICAgICAgIGlmKGYgPT0gbnVsbCkgY29udGludWUKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmlkID0gcGFyc2VJbnQoZikKLSAgICAgICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdW2ZpZF0KLSAgICAgICAgICAgCi0gICAgICAgICAgICAvL3JlbW92ZSBzbyB3ZSBkb24ndCBzZWUgaXQgYWdhaW4KLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMV1bZmlkXQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGZpZWxkKSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgaWYoZmlkICE9IC0xKXsgICAgICAKLSAgICAgICAKLSAgICAgICAgICAgIC8vc2hvdWxkIG9ubHkgYmUgMSBvZiB0aGVzZSBidXQgdGhpcyBpcyB0aGUgb25seQotICAgICAgICAgICAgLy93YXkgdG8gbWF0Y2ggYSBrZXkKLSAgICAgICAgICAgIGZvcih2YXIgZiBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdKSl7Ci0gICAgICAgICAgICAgICAgaWYoVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ZdID09IG51bGwgKSBjb250aW51ZQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ZdCi0gICAgICAgICAgICAgICAgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdW2ZdCi0gICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgclsiZm5hbWUiXSA9ICcnCi0gICAgICAgIHJbImZ0eXBlIl0gPSBmdHlwZQotICAgICAgICByWyJmaWQiXSAgID0gZmlkCi0gICAgICAgIAotCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAgIHJlYWRGaWVsZEVuZCA6IGZ1bmN0aW9uKCl7ICAKLSAgICAgICAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKQotICAgICAgICAKLSAgICAgICAgLy9nZXQgYmFjayB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIHN0YWNrCi0gICAgICAgIHdoaWxlKHRoaXMucnN0YWNrLmxlbmd0aCA+IHBvcykKLSAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAKLSAgICB9LAotCi0gICAgcmVhZE1hcEJlZ2luIDogZnVuY3Rpb24oa2V5VHlwZSx2YWxUeXBlLHNpemUpewotICAgICAgICAKLSAgICAgICAgdmFyIG1hcCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aC0xXQotICAgICAgICAKLSAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgclsia3R5cGUiXSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVttYXAuc2hpZnQoKV0KLSAgICAgICAgclsidnR5cGUiXSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVttYXAuc2hpZnQoKV0KLSAgICAgICAgclsic2l6ZSJdICA9IG1hcC5zaGlmdCgpCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKQotICAgICAgICB0aGlzLnJzdGFjay5wdXNoKG1hcC5zaGlmdCgpKQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfSwKLQotICAgIHJlYWRNYXBFbmQgOiBmdW5jdGlvbigpewotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpCi0gICAgfSwKLQotICAgIHJlYWRMaXN0QmVnaW4gOiBmdW5jdGlvbihlbGVtVHlwZSxzaXplKXsKLSAgICAgIAotICAgICAgICB2YXIgbGlzdCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aC0xXQotICAgICAgCi0gICAgICAgIHZhciByID0ge307Ci0gICAgICAgIHJbImV0eXBlIl0gPSBUaHJpZnQuUHJvdG9jb2wuUlR5cGVbbGlzdC5zaGlmdCgpXTsKLSAgICAgICAgclsic2l6ZSIgXSA9IGxpc3Quc2hpZnQoKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOwotICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGxpc3Quc2hpZnQoKSkKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZExpc3RFbmQgOiBmdW5jdGlvbigpewotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpCi0gICAgfSwKLQotICAgIHJlYWRTZXRCZWdpbiA6IGZ1bmN0aW9uKGVsZW1UeXBlLHNpemUpewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLHNpemUpCi0gICAgfSwKLQotICAgIHJlYWRTZXRFbmQgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkTGlzdEVuZCgpCi0gICAgfSwKLQotICAgIHJlYWRCb29sIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKQotICAgIAotICAgICAgICBpZiggciAhPSBudWxsICYmIHJbInZhbHVlIl0gPT0gIjEiICl7Ci0gICAgICAgICAgICByWyJ2YWx1ZSJdID0gdHJ1ZQotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHJbInZhbHVlIl0gPSBmYWxzZQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcgotICAgIH0sCi0KLSAgICByZWFkQnl0ZSA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKQotICAgIH0sCi0KLSAgICByZWFkSTE2IDogZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpCi0gICAgfSwKLSAgIAotCi0gICAgcmVhZEkzMiA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHZhciBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdCi0gICAgICAgIHZhciByID0ge30gICAgCi0gICAgICAgICAgICAKLSAgICAgICAgaWYoZiBpbnN0YW5jZW9mIEFycmF5KXsKLSAgICAgICAgICAgIHJbInZhbHVlIl0gPSBmLnBvcCgpCi0gICAgICAgIAotICAgICAgICB9ZWxzZSBpZihmIGluc3RhbmNlb2YgT2JqZWN0KXsKLSAgICAgICAgICAgZm9yKHZhciBpIGluIGYpewotICAgICAgICAgICAgICAgIGlmKGkgPT0gbnVsbCkgY29udGludWUKLSAgICAgICAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGZbaV0pCi0gICAgICAgICAgICAgICAgZGVsZXRlIGZbaV0gIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJbInZhbHVlIl0gPSBpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgclsidmFsdWUiXSA9IGYKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByCi0gICAgfSwKLQotICAgIHJlYWRJNjQgOiBmdW5jdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCkKLSAgICB9LAotCi0gICAgcmVhZERvdWJsZSA6IGZ1bmN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKQotICAgIH0sCi0KLSAgICByZWFkU3RyaW5nIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKQotICAgICAgICByWyJ2YWx1ZSJdID0gZGVjb2RlVVJJQ29tcG9uZW50KHJbInZhbHVlIl0pCi0gICAgICAgIAotICAgICAgICByZXR1cm4gcgotICAgIH0sCi0KLSAgICByZWFkQmluYXJ5IDogZnVuY3Rpb24oKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZygpCi0gICAgfSwKLQotICAgIAotICAgIC8vTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhLgotICAgIHNraXAgOiBmdW5jdGlvbih0eXBlKXsKLSAgICAgICAgdGhyb3cgInNraXAgbm90IHN1cHBvcnRlZCB5ZXQiCi0gICAgfQotICAgCi19Ci0KLQotCmRpZmYgLS1naXQgYS9saWIvanNvbi9NYWtlZmlsZS5hbSBiL2xpYi9qc29uL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTFiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9CisKK2lmIFdJVEhfSkFWQQorIyBTY2hlbWEgdmFsaWRhdGlvbiB0ZXN0IGRlcGVuZHMgb24gamF2YQorU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitFWFRSQV9ESVNUID0gXAorICAgIHNjaGVtYS5qc29uIFwKKyAgICB0ZXN0CmRpZmYgLS1naXQgYS9saWIvanNvbi9zY2hlbWEuanNvbiBiL2xpYi9qc29uL3NjaGVtYS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNThhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi9zY2hlbWEuanNvbgpAQCAtMCwwICsxLDM0NCBAQAoreworICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorCisgICJpZCI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc2NoZW1hLmpzb24jIiwKKyAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgQXBhY2hlIFRocmlmdCBwcm90b2NvbCBkZXNjcmlwdG9ycyIsCisKKyAgImRlZmluaXRpb25zIjogeworICAgICJ0eXBlLWlkIjogeworICAgICAgInRpdGxlIjogIkFueSB0eXBlIGlkIChuYW1lKSIsCisgICAgICAiZW51bSI6IFsKKyAgICAgICAgInZvaWQiLAorICAgICAgICAic3RyaW5nIiwKKyAgICAgICAgImJvb2wiLAorICAgICAgICAiYnl0ZSIsCisgICAgICAgICJpOCIsCisgICAgICAgICJpMTYiLAorICAgICAgICAiaTMyIiwKKyAgICAgICAgImk2NCIsCisgICAgICAgICJkb3VibGUiLAorICAgICAgICAibGlzdCIsCisgICAgICAgICJzZXQiLAorICAgICAgICAibWFwIiwKKyAgICAgICAgInVuaW9uIiwKKyAgICAgICAgInN0cnVjdCIsCisgICAgICAgICJiaW5hcnkiCisgICAgICBdCisgICAgfSwKKyAgICAiYmFzZS10eXBlIjogeworICAgICAgInRpdGxlIjogIkJhc2UgdHlwZSBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyJ2b2lkIiwgInN0cmluZyIsICJib29sIiwgImJ5dGUiLCAiaTgiLCAiaTE2IiwgImkzMiIsICJpNjQiLCAiZG91YmxlIiwgImJpbmFyeSIgXQorICAgICAgICB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiBdCisgICAgfSwKKyAgICAibGlzdC10eXBlIjogeworICAgICAgInRpdGxlIjogIkxpc3QgYW5kIHNldCBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAibGlzdCIsICJzZXQiIF0KKyAgICAgICAgfSwKKyAgICAgICAgImVsZW1UeXBlSWQiOiAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICJlbGVtVHlwZSI6ICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiLCAiZWxlbVR5cGVJZCIgXQorICAgIH0sCisgICAgIm1hcC10eXBlIjogeworICAgICAgInRpdGxlIjogIk1hcCBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAibWFwIiBdCisgICAgICAgIH0sCisgICAgICAgICJrZXlUeXBlSWQiOiAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAia2V5VHlwZSI6ICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICAidmFsdWVUeXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgInZhbHVlVHlwZSI6ICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJrZXlUeXBlSWQiLCAidmFsdWVUeXBlSWQiIF0KKyAgICB9LAorICAgICJzdHJ1Y3QtdHlwZSI6IHsKKyAgICAgICJ0aXRsZSI6ICJTdHJ1Y3QsIHVuaW9uIGFuZCBleGNlcHRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGVJZCI6IHsKKyAgICAgICAgICAiZW51bSI6IFsgInVuaW9uIiwgInN0cnVjdCIsICJleGNlcHRpb24iIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJjbGFzcyIgXQorICAgIH0sCisgICAgInR5cGUtZGVzYyI6IHsKKyAgICAgICJ0aXRsZSI6ICJUeXBlIGRlc2NyaXB0b3Igc2NoZW1hIiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICJ0eXBlSWQiOiAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICJjbGFzcyI6ICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAib25lT2YiOgorICAgICAgICAgIFsKKyAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9iYXNlLXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbGlzdC10eXBlIiB9LAorICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL21hcC10eXBlIiB9LAorICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdC10eXBlIiB9CisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAibmFtZS1hbmQtZG9jIjogeworICAgICAgInRpdGxlIjogIk5hbWUgYW5kIGRvY3VtZW50YXRpb24gc3ViLXNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICJkb2MiOiB7ICJ0eXBlIjogInN0cmluZyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiIF0KKyAgICB9LAorICAgICJlbnVtIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCAnZW51bScgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm1lbWJlcnMiIF0sCisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAibWVtYmVycyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgICAidmFsdWUiOiB7ICJ0eXBlIjogImludGVnZXIiIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiLCAidmFsdWUiIF0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInR5cGVkZWYiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHR5cGVkZWYgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgImNvbnN0YW50IjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBjb25zdGFudCBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAidmFsdWUiOiB7CisgICAgICAgICAgICAgICJvbmVPZiI6IFsKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm51bWJlciIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImFycmF5IiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9CisgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgInZhbHVlIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJmaWVsZCI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc3RydWN0IGZpZWxkIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAorICAgICAgICAgICAgICAibWluaW11bSI6IDEsCisgICAgICAgICAgICAgICJtYXhpbXVtIjogNjU1MzUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZWQiOiB7CisgICAgICAgICAgICAgICJlbnVtIjogWyAicmVxdWlyZWQiLCAib3B0aW9uYWwiLCAicmVxX291dCIgXQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJ0eXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgICAgICJ0eXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfSwKKyAgICAgICAgICAgICJkZWZhdWx0IjogeworICAgICAgICAgICAgICAib25lT2YiOiBbCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJudW1iZXIiIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJhcnJheSIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm9iamVjdCIgfQorICAgICAgICAgICAgICBdCisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJrZXkiLCAicmVxdWlyZWQiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInN0cnVjdCI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc3RydWN0IGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJpc0V4Y2VwdGlvbiI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKKyAgICAgICAgICAgICJpc1VuaW9uIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAorICAgICAgICAgICAgImZpZWxkcyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9maWVsZCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAiaXNFeGNlcHRpb24iLCAiaXNVbmlvbiIsICJmaWVsZHMiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInVuaW9uIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCB1bmlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKKyAgICB9LAorICAgICJleGNlcHRpb24iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IGV4Y2VwdGlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgIm1pbmltdW0iOiAxLAorICAgICAgICAgICJtYXhpbXVtIjogNjU1MzUKKyAgICAgICAgfSwKKyAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgInR5cGVJZCI6IHsgImVudW0iOiBbICJleGNlcHRpb24iIF0gfSwKKyAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0LXR5cGUiIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJrZXkiLCAibmFtZSIsICJ0eXBlSWQiIF0KKyAgICB9LAorICAgICJmdW5jdGlvbiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc2VydmljZSBmdW5jdGlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAib25ld2F5IjogeworICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXR1cm5UeXBlIjogeworICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJndW1lbnRzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2ZpZWxkIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImV4Y2VwdGlvbnMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4Y2VwdGlvbiIgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAib25ld2F5IiwgImFyZ3VtZW50cyIsICJleGNlcHRpb25zIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJzZXJ2aWNlIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzZXJ2aWNlIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJmdW5jdGlvbnMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZnVuY3Rpb24iCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgImZ1bmN0aW9ucyIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiYW5ub3RhdGlvbnMiOiB7CisgICAgICAidGl0bGUiOiAiTWFwIG9mIGFubm90YXRpb24gbmFtZXMgdG8gdmFsdWVzIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgInR5cGUiOiAib2JqZWN0IiwKKyAgInJlcXVpcmVkIjogWworICAgICJuYW1lIiwKKyAgICAiZW51bXMiLAorICAgICJ0eXBlZGVmcyIsCisgICAgInN0cnVjdHMiLAorICAgICJjb25zdGFudHMiLAorICAgICJzZXJ2aWNlcyIKKyAgXSwKKyAgInByb3BlcnRpZXMiOiB7CisgICAgIm5hbWUiOiB7CisgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgfSwKKyAgICAiaW5jbHVkZXMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0sCisgICAgICAidW5pcXVlSXRlbXMiOiB0cnVlCisgICAgfSwKKyAgICAibmFtZXNwYWNlcyI6IHsKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KKyAgICB9LAorICAgICJlbnVtcyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9lbnVtIgorICAgICAgfQorICAgIH0sCisgICAgInR5cGVkZWZzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGVkZWYiCisgICAgICB9CisgICAgfSwKKyAgICAic3RydWN0cyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QiCisgICAgICB9CisgICAgfSwKKyAgICAiY29uc3RhbnRzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbnN0YW50IgorICAgICAgfQorICAgIH0sCisgICAgInNlcnZpY2VzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NlcnZpY2UiCisgICAgICB9CisgICAgfQorICB9LAorICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQorfQpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9qc29uL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4N2E1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NoZWNrOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2pzb24vdGVzdC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWY2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorIyBKYXIgdmVyc2lvbnMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCisKKyMgRGVwZW5kZW5jeSB2ZXJzaW9ucworanNvbi1zY2hlbWEtdmFsaWRhdG9yLnZlcnNpb249Mi4yLjYKKworIyBNYXZlbiBkZXBlbmRlbmN5IGRvd25sb2FkIGxvY2F0aW9ucworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9idWlsZC54bWwgYi9saWIvanNvbi90ZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZhMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vdGVzdC9idWlsZC54bWwKQEAgLTAsMCArMSwxNDQgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJKU09OIFNjaGVtYSBUZXN0IiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIgorICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KKworICA8ZGVzY3JpcHRpb24+SlNPTiBTY2hlbWEgVmFsaWRhdGlvbiBUZXN0PC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS9idWlsZCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Impzb24uZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Imdlbi5qc29uLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9nZW4tanNvbiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Impzb24uc2NoZW1hIiBsb2NhdGlvbj0iJHtqc29uLmRpcn0vc2NoZW1hLmpzb24iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdG9vbHMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYi5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vbGliIi8+CisKKyAgPCEtLSB0aGUgcm9vdCBkaXJlY3RvcnksIHdoZXJlIHlvdSB1bnBhY2sgdGhyaWZ0IGRpc3RpYnV0aW9uIChlLmcuIHRocmlmdC0wLngueC50YXIuZ3opIC0tPgorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmRpciIgbG9jYXRpb249Ii4uLy4uLy4uLyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC50ZXN0LmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vdGVzdCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vY29tcGlsZXIvY3BwL3RocmlmdCIgLz4KKworICA8IS0tIEdldCBtYXZlbiBkZXBlbmRlbmN5IHZlcnNpb25zIGZyb20gaGVyZSAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KKworICA8cGF0aCBpZD0idGVzdC5jbGFzc3BhdGgiPgorICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgIDwvcGF0aD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGVyLmNoZWNrIj4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBmaWxlPSIke3RocmlmdC5jb21waWxlcn0iLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgICBUaHJpZnQgY29tcGlsZXIgaXMgbWlzc2luZyAhCisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImNvbXBpbGVyLmNoZWNrLCBta2RpcnMsIG12bi5pbml0Ij4KKyAgICA8dHN0YW1wIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWtkaXJzIj4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtnZW4uanNvbi5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLWdlbiBqc29uIi8+CisgICAgICA8YXJnIGxpbmU9Ii1vdXQgJHtnZW4uanNvbi5kaXJ9Ii8+CisgICAgICA8YXJnIGxpbmU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9UaHJpZnRUZXN0LnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganNvbjptZXJnZSIvPgorICAgICAgPGFyZyBsaW5lPSItb3V0ICR7Z2VuLmpzb24uZGlyfSIvPgorICAgICAgPGFyZyBsaW5lPSIke3RocmlmdC50ZXN0LmRpcn0vSW5jbHVkZS50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biBzY2hlbWEgdmFsaWRhdGlvbiIKKyAgICAgICAgICBkZXBlbmRzPSJ2YWxpZGF0ZS1zY2hlbWEsIHZhbGlkYXRlLWdlbmVyYXRlZC1qc29uIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1zY2hlbWEiIGRlcGVuZHM9ImluaXQiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLmdpdGh1Yi5mZ2UuanNvbnNjaGVtYS5tYWluLmNsaS5NYWluIgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgdmFsdWU9Ii0tc3ludGF4Ii8+CisgICAgICA8YXJnIHZhbHVlPSIke2pzb24uc2NoZW1hfSIvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1nZW5lcmF0ZWQtanNvbiIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUiPgorICAgIDx2YWxpZGF0ZS1qc29uIGZpbGU9IiR7Z2VuLmpzb24uZGlyfS9UaHJpZnRUZXN0Lmpzb24iLz4KKyAgICA8dmFsaWRhdGUtanNvbiBmaWxlPSIke2dlbi5qc29uLmRpcn0vSW5jbHVkZS5qc29uIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuLmpzb24uZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiBkZXBlbmRzPSJta2RpcnMsbXZuLmFudC50YXNrcy5jaGVjayIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CisgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iLz4KKworICAgIDxhcnRpZmFjdDpkZXBlbmRlbmNpZXMgZmlsZXNldElkPSJ0ZXN0LmRlcGVuZGVuY3kuamFycyI+CisgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLmZnZSIgYXJ0aWZhY3RJZD0ianNvbi1zY2hlbWEtdmFsaWRhdG9yIiB2ZXJzaW9uPSIke2pzb24tc2NoZW1hLXZhbGlkYXRvci52ZXJzaW9ufSIvPgorICAgIDwvYXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzPgorCisgICAgPCEtLSBDb3B5IHRoZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGJ1aWxkL2xpYiBkaXIgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQubGliLmRpcn0iPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9InRlc3QuZGVwZW5kZW5jeS5qYXJzIi8+CisgICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KKyAgICA8L2NvcHk+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8bWFjcm9kZWYgbmFtZT0idmFsaWRhdGUtanNvbiI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiBkZWZhdWx0PSIiLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxqYXZhIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgICAgICAgZm9yaz0idHJ1ZSIKKyAgICAgICAgICAgIGRpcj0iJHtqc29uLmRpcn0iCisgICAgICAgICAgICBjbGFzc25hbWU9ImNvbS5naXRodWIuZmdlLmpzb25zY2hlbWEubWFpbi5jbGkuTWFpbiIKKyAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiPgorICAgICAgICA8YXJnIGxpbmU9Ii0tZmFrZXJvb3QgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyIvPgorICAgICAgICA8YXJnIHZhbHVlPSIke2pzb24uc2NoZW1hfSIvPgorICAgICAgICA8YXJnIHZhbHVlPSJAe2ZpbGV9Ii8+CisgICAgICA8L2phdmE+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvbHVhL01ha2VmaWxlLmFtIGIvbGliL2x1YS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBmMTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDczIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKK1NVQkRJUlMgPSAuCisKK2xpYl9MVExJQlJBUklFUyA9IFwKKwkJCWxpYmx1YXNvY2tldC5sYSBcCisJCQlsaWJsdWFsb25nbnVtYmVyLmxhIFwKKwkJCWxpYmx1YWJwYWNrLmxhIFwKKwkJCWxpYmx1YWJpdHdpc2UubGEKKworbGlibHVhc29ja2V0X2xhX1NPVVJDRVMgPSBcCisJCQlzcmMvbHVhc29ja2V0LmMgXAorCQkJc3JjL3Vzb2NrZXQuYworCitub2Jhc2VfaW5jbHVkZV9IRUFERVJTID0gc3JjL3NvY2tldC5oCisKK2xpYmx1YXNvY2tldF9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YXNvY2tldF9sYV9MREZMQUdTID0gJChBTV9MREZMQUdTKQorbGlibHVhc29ja2V0X2xhX0xJQkFERCA9ICQoTFVBX0xJQikgLWxtCisKK2xpYmx1YWJwYWNrX2xhX1NPVVJDRVMgPSBzcmMvbHVhYnBhY2suYworCitsaWJsdWFicGFja19sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YWJwYWNrX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFicGFja19sYV9MSUJBREQgPSBsaWJsdWFsb25nbnVtYmVyLmxhICQoTFVBX0xJQikgLWxtCisKK2xpYmx1YWJpdHdpc2VfbGFfU09VUkNFUyA9IHNyYy9sdWFiaXR3aXNlLmMKKworbGlibHVhYml0d2lzZV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTFVBX0lOQ0xVREUpIC1ETFVBX0NPTVBBVF9NT0RVTEUKK2xpYmx1YWJpdHdpc2VfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YWJpdHdpc2VfbGFfTElCQUREID0gJChMVUFfTElCKSAtbG0KKworbGlibHVhbG9uZ251bWJlcl9sYV9TT1VSQ0VTID0gXAorCQlzcmMvbHVhbG9uZ251bWJlci5jIFwKKwkJc3JjL2xvbmdudW1iZXJ1dGlscy5jCisKK2xpYmx1YWxvbmdudW1iZXJfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKExVQV9JTkNMVURFKSAtRExVQV9DT01QQVRfTU9EVUxFCitsaWJsdWFsb25nbnVtYmVyX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFsb25nbnVtYmVyX2xhX0xJQkFERCA9ICQoTFVBX0xJQikgLWxtCisKK0VYVFJBX0RJU1QgPSBcCisJCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCQlUQmluYXJ5UHJvdG9jb2wubHVhIFwKKwkJVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YSBcCisJCVRDb21wYWN0UHJvdG9jb2wubHVhIFwKKwkJVEZyYW1lZFRyYW5zcG9ydC5sdWEgXAorCQlUaHJpZnQubHVhIFwKKwkJVEh0dHBUcmFuc3BvcnQubHVhIFwKKwkJVEpzb25Qcm90b2NvbC5sdWEgXAorCQlUTWVtb3J5QnVmZmVyLmx1YSBcCisJCVRQcm90b2NvbC5sdWEgXAorCQlUU2VydmVyLmx1YSBcCisJCVRTb2NrZXQubHVhIFwKKwkJVFRyYW5zcG9ydC5sdWEKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEJpbmFyeVByb3RvY29sLmx1YSBiL2xpYi9sdWEvVEJpbmFyeVByb3RvY29sLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhlOThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UQmluYXJ5UHJvdG9jb2wubHVhCkBAIC0wLDAgKzEsMjY0IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFByb3RvY29sJworcmVxdWlyZSAnbGlibHVhYnBhY2snCityZXF1aXJlICdsaWJsdWFiaXR3aXNlJworCitUQmluYXJ5UHJvdG9jb2wgPSBfX1RPYmplY3QubmV3KFRQcm90b2NvbEJhc2UsIHsKKyAgX190eXBlID0gJ1RCaW5hcnlQcm90b2NvbCcsCisgIFZFUlNJT05fTUFTSyA9IC02NTUzNiwgLS0gMHhmZmZmMDAwMAorICBWRVJTSU9OXzEgICAgPSAtMjE0NzQxODExMiwgLS0gMHg4MDAxMDAwMAorICBUWVBFX01BU0sgICAgPSAweDAwMDAwMGZmLAorICBzdHJpY3RSZWFkICAgPSBmYWxzZSwKKyAgc3RyaWN0V3JpdGUgID0gdHJ1ZQorfSkKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKyAgaWYgc2VsZi5zdHJpY3RXcml0ZSB0aGVuCisgICAgc2VsZjp3cml0ZUkzMihsaWJsdWFiaXR3aXNlLmJvcihUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xLCB0dHlwZSkpCisgICAgc2VsZjp3cml0ZVN0cmluZyhuYW1lKQorICAgIHNlbGY6d3JpdGVJMzIoc2VxaWQpCisgIGVsc2UKKyAgICBzZWxmOndyaXRlU3RyaW5nKG5hbWUpCisgICAgc2VsZjp3cml0ZUJ5dGUodHR5cGUpCisgICAgc2VsZjp3cml0ZUkzMihzZXFpZCkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlU3RydWN0QmVnaW4obmFtZSkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVTdHJ1Y3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGlkKQorICBzZWxmOndyaXRlQnl0ZSh0dHlwZSkKKyAgc2VsZjp3cml0ZUkxNihpZCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVGaWVsZEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlRmllbGRTdG9wKCkKKyAgc2VsZjp3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQnl0ZShrdHlwZSkKKyAgc2VsZjp3cml0ZUJ5dGUodnR5cGUpCisgIHNlbGY6d3JpdGVJMzIoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVNYXBFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUJ5dGUoZXR5cGUpCisgIHNlbGY6d3JpdGVJMzIoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVMaXN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUJ5dGUoZXR5cGUpCisgIHNlbGY6d3JpdGVJMzIoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6d3JpdGVTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUJvb2woYm9vbCkKKyAgaWYgYm9vbCB0aGVuCisgICAgc2VsZjp3cml0ZUJ5dGUoMSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVCeXRlKDApCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUJ5dGUoYnl0ZSkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgYnl0ZSkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUkxNihpMTYpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygncycsIGkxNikKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUkzMihpMzIpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnaScsIGkzMikKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZUk2NChpNjQpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnbCcsIGk2NCkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZURvdWJsZShkdWIpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnZCcsIGR1YikKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDp3cml0ZVN0cmluZyhzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlSTMyKHN0cmluZy5sZW4oc3RyKSkKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRNZXNzYWdlQmVnaW4oKQorICBsb2NhbCBzeiwgdHR5cGUsIG5hbWUsIHNlcWlkID0gc2VsZjpyZWFkSTMyKCkKKyAgaWYgc3ogPCAwIHRoZW4KKyAgICBsb2NhbCB2ZXJzaW9uID0gbGlibHVhYml0d2lzZS5iYW5kKHN6LCBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLKQorICAgIGlmIHZlcnNpb24gfj0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMSB0aGVuCisgICAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgICAgbWVzc2FnZSA9ICdCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAnIC4uIHN6CisgICAgICB9KQorICAgIGVuZAorICAgIHR0eXBlID0gbGlibHVhYml0d2lzZS5iYW5kKHN6LCBUQmluYXJ5UHJvdG9jb2wuVFlQRV9NQVNLKQorICAgIG5hbWUgPSBzZWxmOnJlYWRTdHJpbmcoKQorICAgIHNlcWlkID0gc2VsZjpyZWFkSTMyKCkKKyAgZWxzZQorICAgIGlmIHNlbGYuc3RyaWN0UmVhZCB0aGVuCisgICAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gJ05vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyJ30pCisgICAgZW5kCisgICAgbmFtZSA9IHNlbGYudHJhbnM6cmVhZEFsbChzeikKKyAgICB0dHlwZSA9IHNlbGY6cmVhZEJ5dGUoKQorICAgIHNlcWlkID0gc2VsZjpyZWFkSTMyKCkKKyAgZW5kCisgIHJldHVybiBuYW1lLCB0dHlwZSwgc2VxaWQKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZE1lc3NhZ2VFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkU3RydWN0QmVnaW4oKQorICByZXR1cm4gbmlsCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTdHJ1Y3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkRmllbGRCZWdpbigpCisgIGxvY2FsIHR0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGlmIHR0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgIHJldHVybiBuaWwsIHR0eXBlLCAwCisgIGVuZAorICBsb2NhbCBpZCA9IHNlbGY6cmVhZEkxNigpCisgIHJldHVybiBuaWwsIHR0eXBlLCBpZAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkRmllbGRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTWFwQmVnaW4oKQorICBsb2NhbCBrdHlwZSA9IHNlbGY6cmVhZEJ5dGUoKQorICBsb2NhbCB2dHlwZSA9IHNlbGY6cmVhZEJ5dGUoKQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkSTMyKCkKKyAgcmV0dXJuIGt0eXBlLCB2dHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkTWFwRW5kKCkKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZExpc3RCZWdpbigpCisgIGxvY2FsIGV0eXBlID0gc2VsZjpyZWFkQnl0ZSgpCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRJMzIoKQorICByZXR1cm4gZXR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2w6cmVhZExpc3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkU2V0QmVnaW4oKQorICBsb2NhbCBldHlwZSA9IHNlbGY6cmVhZEJ5dGUoKQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkSTMyKCkKKyAgcmV0dXJuIGV0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkQm9vbCgpCisgIGxvY2FsIGJ5dGUgPSBzZWxmOnJlYWRCeXRlKCkKKyAgaWYgYnl0ZSA9PSAwIHRoZW4KKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCisgIHJldHVybiB0cnVlCitlbmQKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sOnJlYWRCeXRlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdjJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkSTE2KCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgyKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdzJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkSTMyKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg0KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdpJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkSTY0KCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg4KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdsJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkRG91YmxlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCg4KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdkJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbDpyZWFkU3RyaW5nKCkKKyAgbG9jYWwgbGVuID0gc2VsZjpyZWFkSTMyKCkKKyAgbG9jYWwgc3RyID0gc2VsZi50cmFuczpyZWFkQWxsKGxlbikKKyAgcmV0dXJuIHN0cgorZW5kCisKK1RCaW5hcnlQcm90b2NvbEZhY3RvcnkgPSBUUHJvdG9jb2xGYWN0b3J5Om5ld3sKKyAgX190eXBlID0gJ1RCaW5hcnlQcm90b2NvbEZhY3RvcnknLAorICBzdHJpY3RSZWFkID0gZmFsc2UKK30KKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbCh0cmFucykKKyAgLS0gVE9ETyBFbmZvcmNlIHRoYXQgdGhpcyBtdXN0IGJlIGEgdHJhbnNwb3J0IGNsYXNzIChpZSBub3QgYSBib29sKQorICBpZiBub3QgdHJhbnMgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6bmV3eworICAgIHRyYW5zID0gdHJhbnMsCisgICAgc3RyaWN0UmVhZCA9IHNlbGYuc3RyaWN0UmVhZCwKKyAgICBzdHJpY3RXcml0ZSA9IHRydWUKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RCdWZmZXJlZFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RCdWZmZXJlZFRyYW5zcG9ydC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZjRiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YQpAQCAtMCwwICsxLDkxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFRyYW5zcG9ydCcKKworVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gVFRyYW5zcG9ydEJhc2U6bmV3eworICBfX3R5cGUgPSAnVEJ1ZmZlcmVkVHJhbnNwb3J0JywKKyAgckJ1ZlNpemUgPSAyMDQ4LAorICB3QnVmU2l6ZSA9IDIwNDgsCisgIHdCdWYgPSAnJywKKyAgckJ1ZiA9ICcnCit9CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDpuZXcob2JqKQorICBpZiB0dHlwZShvYmopIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKHR0eXBlKHNlbGYpIC4uICdtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorCisgIC0tIEVuc3VyZSBhIHRyYW5zcG9ydCBpcyBwcm92aWRlZAorICBpZiBub3Qgb2JqLnRyYW5zIHRoZW4KKyAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHRyYW5zJykKKyAgZW5kCisKKyAgcmV0dXJuIFRUcmFuc3BvcnRCYXNlLm5ldyhzZWxmLCBvYmopCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0OmlzT3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOmlzT3BlbigpCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0Om9wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczpvcGVuKCkKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6Y2xvc2UoKQorICByZXR1cm4gc2VsZi50cmFuczpjbG9zZSgpCitlbmQKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0OnJlYWQobGVuKQorICByZXR1cm4gc2VsZi50cmFuczpyZWFkKGxlbikKK2VuZAorCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQ6cmVhZEFsbChsZW4pCisgIHJldHVybiBzZWxmLnRyYW5zOnJlYWRBbGwobGVuKQorZW5kCisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDp3cml0ZShidWYpCisgIHNlbGYud0J1ZiA9IHNlbGYud0J1ZiAuLiBidWYKKyAgaWYgc3RyaW5nLmxlbihzZWxmLndCdWYpID49IHNlbGYud0J1ZlNpemUgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoc2VsZi53QnVmKQorICAgIHNlbGYud0J1ZiA9ICcnCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydDpmbHVzaCgpCisgIGlmIHN0cmluZy5sZW4oc2VsZi53QnVmKSA+IDAgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoc2VsZi53QnVmKQorICAgIHNlbGYud0J1ZiA9ICcnCisgIGVuZAorZW5kCisKK1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgPSBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6bmV3eworICBfX3R5cGUgPSAnVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeScKK30KKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTpnZXRUcmFuc3BvcnQodHJhbnMpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRUcmFuc3BvcnRFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUQnVmZmVyZWRUcmFuc3BvcnQ6bmV3eworICAgIHRyYW5zID0gdHJhbnMKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RDb21wYWN0UHJvdG9jb2wubHVhIGIvbGliL2x1YS9UQ29tcGFjdFByb3RvY29sLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc1OTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UQ29tcGFjdFByb3RvY29sLmx1YQpAQCAtMCwwICsxLDQ1NyBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3JlcXVpcmUgJ1RQcm90b2NvbCcKK3JlcXVpcmUgJ2xpYmx1YWJwYWNrJworcmVxdWlyZSAnbGlibHVhYml0d2lzZScKK3JlcXVpcmUgJ2xpYmx1YWxvbmdudW1iZXInCisKK1RDb21wYWN0UHJvdG9jb2wgPSBfX1RPYmplY3QubmV3KFRQcm90b2NvbEJhc2UsIHsKKyAgX190eXBlID0gJ1RDb21wYWN0UHJvdG9jb2wnLAorICBDT01QQUNUX1BST1RPQ09MX0lEICAgICAgID0gMHg4MiwKKyAgQ09NUEFDVF9WRVJTSU9OICAgICAgICAgICA9IDEsCisgIENPTVBBQ1RfVkVSU0lPTl9NQVNLICAgICAgPSAweDFmLAorICBDT01QQUNUX1RZUEVfTUFTSyAgICAgICAgID0gMHhFMCwKKyAgQ09NUEFDVF9UWVBFX0JJVFMgICAgICAgICA9IDB4MDcsCisgIENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQgPSA1LAorCisgIC0tIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgIC0tIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgIGxhc3RGaWVsZCA9IHt9LAorICBsYXN0RmllbGRJZCA9IDAsCisgIGxhc3RGaWVsZEluZGV4ID0gMSwKKworICAtLSBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKyAgLS0gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICBib29sZWFuRmllbGROYW1lICAgID0gIiIsCisgIGJvb2xlYW5GaWVsZElkICAgICAgPSAwLAorICBib29sZWFuRmllbGRQZW5kaW5nID0gZmFsc2UsCisKKyAgLS0gSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgIC0tIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkQm9vbCBjYW4gdXNlIGl0LgorICBib29sVmFsdWUgICAgICAgICAgPSBmYWxzZSwKKyAgYm9vbFZhbHVlSXNOb3ROdWxsID0gZmFsc2UsCit9KQorCitUQ29tcGFjdFR5cGUgPSB7CisgIENPTVBBQ1RfQk9PTEVBTl9UUlVFICA9IDB4MDEsCisgIENPTVBBQ1RfQk9PTEVBTl9GQUxTRSA9IDB4MDIsCisgIENPTVBBQ1RfQllURSAgICAgICAgICA9IDB4MDMsCisgIENPTVBBQ1RfSTE2ICAgICAgICAgICA9IDB4MDQsCisgIENPTVBBQ1RfSTMyICAgICAgICAgICA9IDB4MDUsCisgIENPTVBBQ1RfSTY0ICAgICAgICAgICA9IDB4MDYsCisgIENPTVBBQ1RfRE9VQkxFICAgICAgICA9IDB4MDcsCisgIENPTVBBQ1RfQklOQVJZICAgICAgICA9IDB4MDgsCisgIENPTVBBQ1RfTElTVCAgICAgICAgICA9IDB4MDksCisgIENPTVBBQ1RfU0VUICAgICAgICAgICA9IDB4MEEsCisgIENPTVBBQ1RfTUFQICAgICAgICAgICA9IDB4MEIsCisgIENPTVBBQ1RfU1RSVUNUICAgICAgICA9IDB4MEMKK30KKworVFR5cGVUb0NvbXBhY3RUeXBlID0ge30KK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TVE9QXSAgID0gVFR5cGUuU1RPUAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkJPT0xdICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5CWVRFXSAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQllURQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkkxNl0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMTYKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5JMzJdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTMyCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuSTY0XSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0k2NAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkRPVUJMRV0gPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9ET1VCTEUKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TVFJJTkddID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQklOQVJZCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuTElTVF0gICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0xJU1QKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TRVRdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfU0VUCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuTUFQXSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX01BUAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLlNUUlVDVF0gPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9TVFJVQ1QKKworQ29tcGFjdFR5cGVUb1RUeXBlID0ge30KK0NvbXBhY3RUeXBlVG9UVHlwZVtUVHlwZS5TVE9QXSAgICAgICAgICAgICAgICAgICAgICAgID0gVFR5cGUuU1RPUAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRV0gPSBUVHlwZS5CT09MCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9GQUxTRV0gPSBUVHlwZS5CT09MCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQllURV0gICAgICAgICA9IFRUeXBlLkJZVEUKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMTZdICAgICAgICAgID0gVFR5cGUuSTE2CitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTMyXSAgICAgICAgICA9IFRUeXBlLkkzMgorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0k2NF0gICAgICAgICAgPSBUVHlwZS5JNjQKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9ET1VCTEVdICAgICAgID0gVFR5cGUuRE9VQkxFCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQklOQVJZXSAgICAgICA9IFRUeXBlLlNUUklORworQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0xJU1RdICAgICAgICAgPSBUVHlwZS5MSVNUCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfU0VUXSAgICAgICAgICA9IFRUeXBlLlNFVAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX01BUF0gICAgICAgICAgPSBUVHlwZS5NQVAKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9TVFJVQ1RdICAgICAgID0gVFR5cGUuU1RSVUNUCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVzZXRMYXN0RmllbGQoKQorICBzZWxmLmxhc3RGaWVsZCA9IHt9CisgIHNlbGYubGFzdEZpZWxkSWQgPSAwCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSAxCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpwYWNrQ29tcGFjdFR5cGUoa3R5cGUsIHZ0eXBlKQorICByZXR1cm4gbGlibHVhYml0d2lzZS5ib3IobGlibHVhYml0d2lzZS5zaGlmdGwoa3R5cGUsIDQpLCB2dHlwZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKyAgc2VsZjp3cml0ZUJ5dGUoVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1BST1RPQ09MX0lEKQorICBzZWxmOndyaXRlQnl0ZShsaWJsdWFicGFjay5wYWNrTWVzZ1R5cGUoVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1ZFUlNJT04sCisgICAgVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1ZFUlNJT05fTUFTSyx0dHlwZSwKKyAgICBUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQsCisgICAgVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1RZUEVfTUFTSykpCisgIHNlbGY6d3JpdGVWYXJpbnQzMihzZXFpZCkKKyAgc2VsZjp3cml0ZVN0cmluZyhuYW1lKQorICBzZWxmOnJlc2V0TGFzdEZpZWxkKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSBzZWxmLmxhc3RGaWVsZEluZGV4ICsgMQorICBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XSA9IHNlbGYubGFzdEZpZWxkSWQKKyAgc2VsZi5sYXN0RmllbGRJZCA9IDAKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU3RydWN0RW5kKCkKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggLSAxCisgIHNlbGYubGFzdEZpZWxkSWQgPSBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR0eXBlLCBpZCkKKyAgaWYgdHR5cGUgPT0gVFR5cGUuQk9PTCB0aGVuCisgICAgc2VsZi5ib29sZWFuRmllbGROYW1lID0gbmFtZQorICAgIHNlbGYuYm9vbGVhbkZpZWxkSWQgICA9IGlkCisgICAgc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nID0gdHJ1ZQorICBlbHNlCisgICAgc2VsZjp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0dHlwZSwgaWQsIC0xKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRmllbGRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZFN0b3AoKQorICBzZWxmOndyaXRlQnl0ZShUVHlwZS5TVE9QKTsKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICBpZiBzaXplID09IDAgdGhlbgorICAgIHNlbGY6d3JpdGVCeXRlKDApCisgIGVsc2UKKyAgICBzZWxmOndyaXRlVmFyaW50MzIoc2l6ZSkKKyAgICBzZWxmOndyaXRlQnl0ZShzZWxmOnBhY2tDb21wYWN0VHlwZShUVHlwZVRvQ29tcGFjdFR5cGVba3R5cGVdLCBUVHlwZVRvQ29tcGFjdFR5cGVbdnR5cGVdKSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZU1hcEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUNvbGxlY3Rpb25CZWdpbihldHlwZSwgc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTGlzdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQ29sbGVjdGlvbkJlZ2luKGV0eXBlLCBzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVCb29sKGJvb2wpCisgIGxvY2FsIHZhbHVlID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9GQUxTRQorICBpZiBib29sIHRoZW4KKyAgICB2YWx1ZSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRQorICBlbmQKKyAgcHJpbnQodmFsdWUsc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nLHNlbGYuYm9vbGVhbkZpZWxkSWQpCisgIGlmIHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyB0aGVuCisgICAgc2VsZjp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChzZWxmLmJvb2xlYW5GaWVsZE5hbWUsIFRUeXBlLkJPT0wsIHNlbGYuYm9vbGVhbkZpZWxkSWQsIHZhbHVlKQorICAgIHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyA9IGZhbHNlCisgIGVsc2UKKyAgICBzZWxmOndyaXRlQnl0ZSh2YWx1ZSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUJ5dGUoYnl0ZSkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgYnl0ZSkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVJMTYoaTE2KQorICBzZWxmOndyaXRlVmFyaW50MzIobGlibHVhYnBhY2suaTMyVG9aaWd6YWcoaTE2KSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlSTMyKGkzMikKKyAgc2VsZjp3cml0ZVZhcmludDMyKGxpYmx1YWJwYWNrLmkzMlRvWmlnemFnKGkzMikpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUk2NChpNjQpCisgIHNlbGY6d3JpdGVWYXJpbnQ2NChsaWJsdWFicGFjay5pNjRUb1ppZ3phZyhpNjQpKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVEb3VibGUoZHViKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2QnLCBkdWIpCisgIHNlbGYudHJhbnM6d3JpdGUoYnVmZikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU3RyaW5nKHN0cikKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIHNlbGY6d3JpdGVCaW5hcnkoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVCaW5hcnkoc3RyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgc2VsZjp3cml0ZVZhcmludDMyKHN0cmluZy5sZW4oc3RyKSkKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0dHlwZSwgaWQsIHR5cGVPdmVycmlkZSkKKyAgaWYgdHlwZU92ZXJyaWRlID09IC0xIHRoZW4KKyAgICB0eXBlT3ZlcnJpZGUgPSBUVHlwZVRvQ29tcGFjdFR5cGVbdHR5cGVdCisgIGVuZAorICBsb2NhbCBvZmZzZXQgPSBpZCAtIHNlbGYubGFzdEZpZWxkSWQKKyAgaWYgaWQgPiBzZWxmLmxhc3RGaWVsZElkIGFuZCBvZmZzZXQgPD0gMTUgdGhlbgorICAgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJpdHdpc2UuYm9yKGxpYmx1YWJpdHdpc2Uuc2hpZnRsKG9mZnNldCwgNCksIHR5cGVPdmVycmlkZSkpCisgIGVsc2UKKyAgICBzZWxmOndyaXRlQnl0ZSh0eXBlT3ZlcnJpZGUpCisgICAgc2VsZjp3cml0ZUkxNihpZCkKKyAgZW5kCisgIHNlbGYubGFzdEZpZWxkSWQgPSBpZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVDb2xsZWN0aW9uQmVnaW4oZXR5cGUsIHNpemUpCisgIGlmIHNpemUgPD0gMTQgdGhlbgorICAgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJpdHdpc2UuYm9yKGxpYmx1YWJpdHdpc2Uuc2hpZnRsKHNpemUsIDQpLCBUVHlwZVRvQ29tcGFjdFR5cGVbZXR5cGVdKSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJpdHdpc2UuYm9yKDB4ZjAsIFRUeXBlVG9Db21wYWN0VHlwZVtldHlwZV0pKQorICAgIHNlbGY6d3JpdGVWYXJpbnQzMihzaXplKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlVmFyaW50MzIoaTMyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgbG9jYWwgc3RyID0gbGlibHVhYnBhY2sudG9WYXJpbnQzMihpMzIpCisgIHNlbGYudHJhbnM6d3JpdGUoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVWYXJpbnQ2NChpNjQpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBsb2NhbCBzdHIgPSBsaWJsdWFicGFjay50b1ZhcmludDY0KGk2NCkKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWVzc2FnZUJlZ2luKCkKKyAgbG9jYWwgcHJvdG9jb2xJZCA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgaWYgcHJvdG9jb2xJZCB+PSBzZWxmLkNPTVBBQ1RfUFJPVE9DT0xfSUQgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICJFeHBlY3RlZCBwcm90b2NvbCBpZCAiIC4uIHNlbGYuQ09NUEFDVF9QUk9UT0NPTF9JRCAuLiAiIGJ1dCBnb3QgIiAuLiBwcm90b2NvbElkfSkKKyAgZW5kCisgIGxvY2FsIHZlcnNpb25BbmRUeXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCB2ZXJzaW9uID0gbGlibHVhYml0d2lzZS5iYW5kKHZlcnNpb25BbmRUeXBlLCBzZWxmLkNPTVBBQ1RfVkVSU0lPTl9NQVNLKQorICBsb2NhbCB0dHlwZSA9IGxpYmx1YWJpdHdpc2UuYmFuZChsaWJsdWFiaXR3aXNlLnNoaWZ0cih2ZXJzaW9uQW5kVHlwZSwKKyAgICBzZWxmLkNPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpLCBzZWxmLkNPTVBBQ1RfVFlQRV9CSVRTKQorICBpZiB2ZXJzaW9uIH49IHNlbGYuQ09NUEFDVF9WRVJTSU9OIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAiRXhwZWN0ZWQgdmVyc2lvbiAiIC4uIHNlbGYuQ09NUEFDVF9WRVJTSU9OIC4uICIgYnV0IGdvdCAiIC4uIHZlcnNpb259KQorICBlbmQKKyAgbG9jYWwgc2VxaWQgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGxvY2FsIG5hbWUgPSBzZWxmOnJlYWRTdHJpbmcoKQorICByZXR1cm4gbmFtZSwgdHR5cGUsIHNlcWlkCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU3RydWN0QmVnaW4oKQorICBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XSA9IHNlbGYubGFzdEZpZWxkSWQKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggKyAxCisgIHNlbGYubGFzdEZpZWxkSWQgPSAwCisgIHJldHVybiBuaWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTdHJ1Y3RFbmQoKQorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gc2VsZi5sYXN0RmllbGRJbmRleCAtIDEKKyAgc2VsZi5sYXN0RmllbGRJZCA9IHNlbGYubGFzdEZpZWxkW3NlbGYubGFzdEZpZWxkSW5kZXhdCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkRmllbGRCZWdpbigpCisgIGxvY2FsIGZpZWxkX2FuZF90dHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgdHR5cGUgPSBzZWxmOmdldFRUeXBlKGZpZWxkX2FuZF90dHlwZSkKKyAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgcmV0dXJuIG5pbCwgdHR5cGUsIDAKKyAgZW5kCisgIC0tIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgbG9jYWwgbW9kaWZpZXIgPSBsaWJsdWFiaXR3aXNlLnNoaWZ0cihsaWJsdWFiaXR3aXNlLmJhbmQoZmllbGRfYW5kX3R0eXBlLCAweGYwKSwgNCkKKyAgbG9jYWwgaWQgPSAwCisgIGlmIG1vZGlmaWVyID09IDAgdGhlbgorICAgIGlkID0gc2VsZjpyZWFkSTE2KCkKKyAgZWxzZQorICAgIGlkID0gc2VsZi5sYXN0RmllbGRJZCArIG1vZGlmaWVyCisgIGVuZAorICBpZiB0dHlwZSA9PSBUVHlwZS5CT09MIHRoZW4KKyAgICBib29sVmFsdWUgPSBsaWJsdWFiaXR3aXNlLmJhbmQoZmllbGRfYW5kX3R0eXBlLCAweDBmKSA9PSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUKKyAgICBib29sVmFsdWVJc05vdE51bGwgPSB0cnVlCisgIGVuZAorICBzZWxmLmxhc3RGaWVsZElkID0gaWQKKyAgcmV0dXJuIG5pbCwgdHR5cGUsIGlkCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkRmllbGRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1hcEJlZ2luKCkKKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgaWYgc2l6ZSA8IDAgdGhlbgorICAgIHJldHVybiBuaWwsbmlsLG5pbAorICBlbmQKKyAgbG9jYWwga3Z0eXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCBrdHlwZSA9IHNlbGY6Z2V0VFR5cGUobGlibHVhYml0d2lzZS5zaGlmdHIoa3Z0eXBlLCA0KSkKKyAgbG9jYWwgdnR5cGUgPSBzZWxmOmdldFRUeXBlKGt2dHlwZSkKKyAgcmV0dXJuIGt0eXBlLCB2dHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1hcEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTGlzdEJlZ2luKCkKKyAgbG9jYWwgc2l6ZV9hbmRfdHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgc2l6ZSA9IGxpYmx1YWJpdHdpc2UuYmFuZChsaWJsdWFiaXR3aXNlLnNoaWZ0cihzaXplX2FuZF90eXBlLCA0KSwgMHgwZikKKyAgaWYgc2l6ZSA9PSAxNSB0aGVuCisgICAgc2l6ZSA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgZW5kCisgIGlmIHNpemUgPCAwIHRoZW4KKyAgICByZXR1cm4gbmlsLG5pbAorICBlbmQKKyAgbG9jYWwgZXR5cGUgPSBzZWxmOmdldFRUeXBlKGxpYmx1YWJpdHdpc2UuYmFuZChzaXplX2FuZF90eXBlLCAweDBmKSkKKyAgcmV0dXJuIGV0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTGlzdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU2V0QmVnaW4oKQorICByZXR1cm4gc2VsZjpyZWFkTGlzdEJlZ2luKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEJvb2woKQorICBpZiBib29sVmFsdWVJc05vdE51bGwgdGhlbgorICAgIGJvb2xWYWx1ZUlzTm90TnVsbCA9IHRydWUKKyAgICByZXR1cm4gYm9vbFZhbHVlCisgIGVuZAorICBsb2NhbCB2YWwgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGlmIHZhbCA9PSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUgdGhlbgorICAgIHJldHVybiB0cnVlCisgIGVuZAorICByZXR1cm4gZmFsc2UKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRCeXRlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdjJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdDJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEkxNigpCisgIHJldHVybiBzZWxmOnJlYWRJMzIoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEkzMigpCisgIGxvY2FsIHYgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGxvY2FsIHZhbHVlID0gbGlibHVhYnBhY2suemlnemFnVG9JMzIodikKKyAgcmV0dXJuIHZhbHVlCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkSTY0KCkKKyAgbG9jYWwgdmFsdWUgPSBzZWxmOnJlYWRWYXJpbnQ2NCgpCisgIHJldHVybiB2YWx1ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZERvdWJsZSgpCisgIGxvY2FsIGJ1ZmYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoOCkKKyAgbG9jYWwgdmFsID0gbGlibHVhYnBhY2suYnVucGFjaygnZCcsIGJ1ZmYpCisgIHJldHVybiB2YWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTdHJpbmcoKQorICByZXR1cm4gc2VsZjpyZWFkQmluYXJ5KCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRCaW5hcnkoKQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBpZiBzaXplIDw9IDAgdGhlbgorICAgIHJldHVybiAiIgorICBlbmQKKyAgcmV0dXJuIHNlbGYudHJhbnM6cmVhZEFsbChzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFZhcmludDMyKCkKKyAgbG9jYWwgc2hpZnRsID0gMAorICBsb2NhbCByZXN1bHQgPSAwCisgIHdoaWxlIHRydWUgZG8KKyAgICBiID0gc2VsZjpyZWFkQnl0ZSgpCisgICAgcmVzdWx0ID0gbGlibHVhYml0d2lzZS5ib3IocmVzdWx0LAorICAgICAgICAgICAgIGxpYmx1YWJpdHdpc2Uuc2hpZnRsKGxpYmx1YWJpdHdpc2UuYmFuZChiLCAweDdmKSwgc2hpZnRsKSkKKyAgICBpZiBsaWJsdWFiaXR3aXNlLmJhbmQoYiwgMHg4MCkgfj0gMHg4MCB0aGVuCisgICAgICBicmVhaworICAgIGVuZAorICAgIHNoaWZ0bCA9IHNoaWZ0bCArIDcKKyAgZW5kCisgIHJldHVybiByZXN1bHQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRWYXJpbnQ2NCgpCisgIGxvY2FsIHJlc3VsdCA9IGxpYmx1YWxvbmdudW1iZXIubmV3CisgIGxvY2FsIGRhdGEgPSByZXN1bHQoMCkKKyAgbG9jYWwgc2hpZnRsID0gMAorICB3aGlsZSB0cnVlIGRvCisgICAgYiA9IHNlbGY6cmVhZEJ5dGUoKQorICAgIGVuZEZsYWcsIGRhdGEgPSBsaWJsdWFicGFjay5mcm9tVmFyaW50NjQoYiwgc2hpZnRsLCBkYXRhKQorICAgIHNoaWZ0bCA9IHNoaWZ0bCArIDcKKyAgICBpZiBlbmRGbGFnID09IDAgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbmQKKyAgZW5kCisgIHJldHVybiBkYXRhCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpnZXRUVHlwZShjdHlwZSkKKyAgcmV0dXJuIENvbXBhY3RUeXBlVG9UVHlwZVtsaWJsdWFiaXR3aXNlLmJhbmQoY3R5cGUsIDB4MGYpXQorZW5kCisKK1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5ID0gVFByb3RvY29sRmFjdG9yeTpuZXd7CisgIF9fdHlwZSA9ICdUQ29tcGFjdFByb3RvY29sRmFjdG9yeScsCit9CisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKHRyYW5zKQorICAtLSBUT0RPIEVuZm9yY2UgdGhhdCB0aGlzIG11c3QgYmUgYSB0cmFuc3BvcnQgY2xhc3MgKGllIG5vdCBhIGJvb2wpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2w6bmV3eworICAgIHRyYW5zID0gdHJhbnMKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhlMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YQpAQCAtMCwwICsxLDExOCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3JlcXVpcmUgJ1RUcmFuc3BvcnQnCityZXF1aXJlICdsaWJsdWFicGFjaycKKworVEZyYW1lZFRyYW5zcG9ydCA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RGcmFtZWRUcmFuc3BvcnQnLAorICBkb1JlYWQgPSB0cnVlLAorICBkb1dyaXRlID0gdHJ1ZSwKKyAgd0J1ZiA9ICcnLAorICByQnVmID0gJycKK30KKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpuZXcob2JqKQorICBpZiB0dHlwZShvYmopIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKHR0eXBlKHNlbGYpIC4uICdtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorCisgIC0tIEVuc3VyZSBhIHRyYW5zcG9ydCBpcyBwcm92aWRlZAorICBpZiBub3Qgb2JqLnRyYW5zIHRoZW4KKyAgICBlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHRyYW5zJykKKyAgZW5kCisKKyAgcmV0dXJuIFRUcmFuc3BvcnRCYXNlLm5ldyhzZWxmLCBvYmopCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDppc09wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczppc09wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6b3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOm9wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6Y2xvc2UoKQorICByZXR1cm4gc2VsZi50cmFuczpjbG9zZSgpCitlbmQKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydDpyZWFkKGxlbikKKyAgaWYgc3RyaW5nLmxlbihzZWxmLnJCdWYpID09IDAgdGhlbgorICAgIHNlbGY6X19yZWFkRnJhbWUoKQorICBlbmQKKworICBpZiBzZWxmLmRvUmVhZCA9PSBmYWxzZSB0aGVuCisgICAgcmV0dXJuIHNlbGYudHJhbnM6cmVhZChsZW4pCisgIGVuZAorCisgIGlmIGxlbiA+IHN0cmluZy5sZW4oc2VsZi5yQnVmKSB0aGVuCisgICAgbG9jYWwgdmFsID0gc2VsZi5yQnVmCisgICAgc2VsZi5yQnVmID0gJycKKyAgICByZXR1cm4gdmFsCisgIGVuZAorCisgIGxvY2FsIHZhbCA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCAwLCBsZW4pCisgIHNlbGYuckJ1ZiA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCBsZW4rMSkKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6X19yZWFkRnJhbWUoKQorICBsb2NhbCBidWYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoNCkKKyAgbG9jYWwgZnJhbWVfbGVuID0gbGlibHVhYnBhY2suYnVucGFjaygnaScsIGJ1ZikKKyAgc2VsZi5yQnVmID0gc2VsZi50cmFuczpyZWFkQWxsKGZyYW1lX2xlbikKK2VuZAorCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6d3JpdGUoYnVmLCBsZW4pCisgIGlmIHNlbGYuZG9Xcml0ZSA9PSBmYWxzZSB0aGVuCisgICAgcmV0dXJuIHNlbGYudHJhbnM6d3JpdGUoYnVmLCBsZW4pCisgIGVuZAorCisgIGlmIGxlbiBhbmQgbGVuIDwgc3RyaW5nLmxlbihidWYpIHRoZW4KKyAgICBidWYgPSBzdHJpbmcuc3ViKGJ1ZiwgMCwgbGVuKQorICBlbmQKKyAgc2VsZi53QnVmID0gc2VsZi53QnVmIC4uIGJ1ZgorZW5kCisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQ6Zmx1c2goKQorICBpZiBzZWxmLmRvV3JpdGUgPT0gZmFsc2UgdGhlbgorICAgIHJldHVybiBzZWxmLnRyYW5zOmZsdXNoKCkKKyAgZW5kCisKKyAgLS0gSWYgdGhlIHdyaXRlIGZhaWxzIHdlIHN0aWxsIHdhbnQgd0J1ZiB0byBiZSBjbGVhcgorICBsb2NhbCB0bXAgPSBzZWxmLndCdWYKKyAgc2VsZi53QnVmID0gJycKKyAgbG9jYWwgZnJhbWVfbGVuX2J1ZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCJpIiwgc3RyaW5nLmxlbih0bXApKQorICB0bXAgPSBmcmFtZV9sZW5fYnVmIC4uIHRtcAorICBzZWxmLnRyYW5zOndyaXRlKHRtcCkKKyAgc2VsZi50cmFuczpmbHVzaCgpCitlbmQKKworVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgPSBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6bmV3eworICBfX3R5cGUgPSAnVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnknCit9CitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeTpnZXRUcmFuc3BvcnQodHJhbnMpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRGcmFtZWRUcmFuc3BvcnQ6bmV3e3RyYW5zID0gdHJhbnN9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEh0dHBUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1MWRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVEh0dHBUcmFuc3BvcnQubHVhCkBAIC0wLDAgKzEsMTgyIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFRyYW5zcG9ydCcKKworVEh0dHBUcmFuc3BvcnQgPSBUVHJhbnNwb3J0QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUSHR0cFRyYW5zcG9ydCcsCisgIHBhdGggPSAnLycsCisgIHdCdWYgPSAnJywKKyAgckJ1ZiA9ICcnLAorICBDUkxGID0gJ1xyXG4nLAorICBWRVJTSU9OID0gdmVyc2lvbiwKKyAgaXNTZXJ2ZXIgPSB0cnVlCit9CisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0Om5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IodHR5cGUoc2VsZikgLi4gJ211c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisKKyAgLS0gRW5zdXJlIGEgdHJhbnNwb3J0IGlzIHByb3ZpZGVkCisgIGlmIG5vdCBvYmoudHJhbnMgdGhlbgorICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgdHJhbnMnKQorICBlbmQKKworICByZXR1cm4gVFRyYW5zcG9ydEJhc2UubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDppc09wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczppc09wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0Om9wZW4oKQorICByZXR1cm4gc2VsZi50cmFuczpvcGVuKCkKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpjbG9zZSgpCisgIHJldHVybiBzZWxmLnRyYW5zOmNsb3NlKCkKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpyZWFkQWxsKGxlbikKKyAgcmV0dXJuIHNlbGY6cmVhZChsZW4pCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6cmVhZChsZW4pCisgIGlmIHN0cmluZy5sZW4oc2VsZi5yQnVmKSA9PSAwIHRoZW4KKyAgICBzZWxmOl9yZWFkTXNnKCkKKyAgZW5kCisgIGlmIGxlbiA+IHN0cmluZy5sZW4oc2VsZi5yQnVmKSB0aGVuCisgICAgbG9jYWwgdmFsID0gc2VsZi5yQnVmCisgICAgc2VsZi5yQnVmID0gJycKKyAgICByZXR1cm4gdmFsCisgIGVuZAorCisgIGxvY2FsIHZhbCA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCAwLCBsZW4pCisgIHNlbGYuckJ1ZiA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCBsZW4rMSkKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0Ol9yZWFkTXNnKCkKKyAgd2hpbGUgdHJ1ZSBkbworICAgIHNlbGYuckJ1ZiA9IHNlbGYuckJ1ZiAuLiBzZWxmLnRyYW5zOnJlYWQoNCkKKyAgICBpZiBzdHJpbmcuZmluZChzZWxmLnJCdWYsIHNlbGYuQ1JMRiAuLiBzZWxmLkNSTEYpIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICBpZiBub3Qgc2VsZi5yQnVmIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICAgIHJldHVybgorICBlbmQKKyAgc2VsZjpnZXRMaW5lKCkKKyAgbG9jYWwgaGVhZGVycyA9IHNlbGY6X3BhcnNlSGVhZGVycygpCisgIGlmIG5vdCBoZWFkZXJzIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICAgIHJldHVybgorICBlbmQKKworICBsb2NhbCBsZW5ndGggPSB0b251bWJlcihoZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdKQorICBpZiBsZW5ndGggdGhlbgorICAgIGxlbmd0aCA9IGxlbmd0aCAtIHN0cmluZy5sZW4oc2VsZi5yQnVmKQorICAgIHNlbGYuckJ1ZiA9IHNlbGYuckJ1ZiAuLiBzZWxmLnRyYW5zOnJlYWRBbGwobGVuZ3RoKQorICBlbmQKKyAgaWYgc2VsZi5yQnVmID09IG5pbCB0aGVuCisgICAgc2VsZi5yQnVmID0gIiIKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6Z2V0TGluZSgpCisgIGxvY2FsIGEsYiA9IHN0cmluZy5maW5kKHNlbGYuckJ1Ziwgc2VsZi5DUkxGKQorICBsb2NhbCBsaW5lID0gIiIKKyAgaWYgYSBhbmQgYiB0aGVuCisgICAgbGluZSA9IHN0cmluZy5zdWIoc2VsZi5yQnVmLCAwLCBhLTEpCisgICAgc2VsZi5yQnVmID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIGIrMSkKKyAgZW5kCisgIHJldHVybiBsaW5lCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6X3BhcnNlSGVhZGVycygpCisgIGxvY2FsIGhlYWRlcnMgPSB7fQorCisgIHJlcGVhdAorICAgIGxvY2FsIGxpbmUgPSBzZWxmOmdldExpbmUoKQorICAgIGZvciBrZXksIHZhbCBpbiBzdHJpbmcuZ21hdGNoKGxpbmUsICIoWyV3JS1dKyklcyo6JXMqKC4rKSIpIGRvCisgICAgICBpZiBoZWFkZXJzW2tleV0gdGhlbgorICAgICAgICBsb2NhbCBkZWxpbWl0ZXIgPSAiLCAiCisgICAgICAgIGlmIGtleSA9PSAiU2V0LUNvb2tpZSIgdGhlbgorICAgICAgICAgIGRlbGltaXRlciA9ICI7ICIKKyAgICAgICAgZW5kCisgICAgICAgIGhlYWRlcnNba2V5XSA9IGhlYWRlcnNba2V5XSAuLiBkZWxpbWl0ZXIgLi4gdG9zdHJpbmcodmFsKQorICAgICAgZWxzZQorICAgICAgICBoZWFkZXJzW2tleV0gPSB0b3N0cmluZyh2YWwpCisgICAgICBlbmQKKyAgICBlbmQKKyAgdW50aWwgc3RyaW5nLmZpbmQobGluZSwgIl4lcyokIikKKworICByZXR1cm4gaGVhZGVycworZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OndyaXRlKGJ1ZiwgbGVuKQorICBpZiBsZW4gYW5kIGxlbiA8IHN0cmluZy5sZW4oYnVmKSB0aGVuCisgICAgYnVmID0gc3RyaW5nLnN1YihidWYsIDAsIGxlbikKKyAgZW5kCisgIHNlbGYud0J1ZiA9IHNlbGYud0J1ZiAuLiBidWYKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDp3cml0ZUh0dHBIZWFkZXIoY29udGVudF9sZW4pCisgIGlmIHNlbGYuaXNTZXJ2ZXIgdGhlbgorICAgIGxvY2FsIGhlYWRlciA9ICAiSFRUUC8xLjEgMjAwIE9LIiAuLiBzZWxmLkNSTEYKKyAgICAgIC4uICJTZXJ2ZXI6IFRocmlmdC8iIC4uIHNlbGYuVkVSU0lPTiAuLiBzZWxmLkNSTEYKKyAgICAgIC4uICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtTGVuZ3RoOiAiIC4uIGNvbnRlbnRfbGVuIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIC4uIHNlbGYuQ1JMRiAuLiBzZWxmLkNSTEYKKyAgICBzZWxmLnRyYW5zOndyaXRlKGhlYWRlcikKKyAgZWxzZQorICAgIGxvY2FsIGhlYWRlciA9ICJQT1NUICIgLi4gc2VsZi5wYXRoIC4uICIgSFRUUC8xLjEiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkhvc3Q6ICIgLi4gc2VsZi50cmFucy5ob3N0IC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkNvbnRlbnQtTGVuZ3RoOiAiIC4uIGNvbnRlbnRfbGVuIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQgIiAuLiBzZWxmLkNSTEYKKyAgICAgIC4uICJVc2VyLUFnZW50OiBUaHJpZnQvIiAuLiBzZWxmLlZFUlNJT04gLi4gIiAoTHVhL1RIdHRwQ2xpZW50KSIKKyAgICAgIC4uIHNlbGYuQ1JMRiAuLiBzZWxmLkNSTEYKKyAgICBzZWxmLnRyYW5zOndyaXRlKGhlYWRlcikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6Zmx1c2goKQorICAtLSBJZiB0aGUgd3JpdGUgZmFpbHMgd2Ugc3RpbGwgd2FudCB3QnVmIHRvIGJlIGNsZWFyCisgIGxvY2FsIHRtcCA9IHNlbGYud0J1ZgorICBzZWxmLndCdWYgPSAnJworICBzZWxmOndyaXRlSHR0cEhlYWRlcihzdHJpbmcubGVuKHRtcCkpCisgIHNlbGYudHJhbnM6d3JpdGUodG1wKQorICBzZWxmLnRyYW5zOmZsdXNoKCkKK2VuZAorCitUSHR0cFRyYW5zcG9ydEZhY3RvcnkgPSBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6bmV3eworICBfX3R5cGUgPSAnVEh0dHBUcmFuc3BvcnRGYWN0b3J5JworfQorZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydCh0cmFucykKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVEh0dHBUcmFuc3BvcnQ6bmV3e3RyYW5zID0gdHJhbnN9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEgYi9saWIvbHVhL1RKc29uUHJvdG9jb2wubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDhlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RKc29uUHJvdG9jb2wubHVhCkBAIC0wLDAgKzEsNzI3IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIiksIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFByb3RvY29sJworcmVxdWlyZSAnbGlibHVhYnBhY2snCityZXF1aXJlICdsaWJsdWFiaXR3aXNlJworCitUSlNPTlByb3RvY29sID0gX19UT2JqZWN0Lm5ldyhUUHJvdG9jb2xCYXNlLCB7CisgIF9fdHlwZSA9ICdUSlNPTlByb3RvY29sJywKKyAgVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiA9IDEsCisgIGpzb25Db250ZXh0ID0ge30sCisgIGpzb25Db250ZXh0VmFsID0ge2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSB0cnVlfSwKKyAganNvbkNvbnRleHRJbmRleCA9IDEsCisgIGhhc1JlYWRCeXRlID0gIiIKK30pCisKK1RUeXBlVG9TdHJpbmcgPSB7fQorVFR5cGVUb1N0cmluZ1tUVHlwZS5CT09MXSAgID0gInRmIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5CWVRFXSAgID0gImk4IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5JMTZdICAgID0gImkxNiIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuSTMyXSAgICA9ICJpMzIiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkk2NF0gICAgPSAiaTY0IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5ET1VCTEVdID0gImRibCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU1RSSU5HXSA9ICJzdHIiCitUVHlwZVRvU3RyaW5nW1RUeXBlLlNUUlVDVF0gPSAicmVjIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5MSVNUXSAgID0gImxzdCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU0VUXSAgICA9ICJzZXQiCitUVHlwZVRvU3RyaW5nW1RUeXBlLk1BUF0gICAgPSAibWFwIgorCitTdHJpbmdUb1RUeXBlID0geworICB0ZiAgPSBUVHlwZS5CT09MLAorICBpOCAgPSBUVHlwZS5CWVRFLAorICBpMTYgPSBUVHlwZS5JMTYsCisgIGkzMiA9IFRUeXBlLkkzMiwKKyAgaTY0ID0gVFR5cGUuSTY0LAorICBkYmwgPSBUVHlwZS5ET1VCTEUsCisgIHN0ciA9IFRUeXBlLlNUUklORywKKyAgcmVjID0gVFR5cGUuU1RSVUNULAorICBtYXAgPSBUVHlwZS5NQVAsCisgIHNldCA9IFRUeXBlLlNFVCwKKyAgbHN0ID0gVFR5cGUuTElTVAorfQorCitKU09OTm9kZSA9IHsKKyAgT2JqZWN0QmVnaW4gPSAneycsCisgIE9iamVjdEVuZCA9ICd9JywKKyAgQXJyYXlCZWdpbiA9ICdbJywKKyAgQXJyYXlFbmQgPSAnXScsCisgIFBhaXJTZXBhcmF0b3IgPSAnOicsCisgIEVsZW1TZXBhcmF0b3IgPSAnLCcsCisgIEJhY2tzbGFzaCA9ICdcXCcsCisgIFN0cmluZ0RlbGltaXRlciA9ICciJywKKyAgWmVyb0NoYXIgPSAnMCcsCisgIEVzY2FwZUNoYXIgPSAndScsCisgIE5hbiA9ICdOYU4nLAorICBJbmZpbml0eSA9ICdJbmZpbml0eScsCisgIE5lZ2F0aXZlSW5maW5pdHkgPSAnLUluZmluaXR5JywKKyAgRXNjYXBlQ2hhcnMgPSAiXCJcXGJmbnJ0IiwKKyAgRXNjYXBlUHJlZml4ID0gIlxcdTAwIgorfQorCitFc2NhcGVDaGFyVmFscyA9IHsKKyAgJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnCit9CisKK0pTT05DaGFyVGFibGUgPSB7CisgIC0tMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRgorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCA5OCwxMTYsMTEwLCAgMCwxMDIsMTE0LCAgMCwgIDAsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAxLCAgMSwzNCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCit9CisKKy0tIGNoYXJhY3RlciB0YWJsZSBzdHJpbmcKK2xvY2FsIGI9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nCisKKy0tIGVuY29kaW5nCitmdW5jdGlvbiBiYXNlNjRfZW5jb2RlKGRhdGEpCisgICAgcmV0dXJuICgoZGF0YTpnc3ViKCcuJywgZnVuY3Rpb24oeCkgCisgICAgICAgIGxvY2FsIHIsYj0nJyx4OmJ5dGUoKQorICAgICAgICBmb3IgaT04LDEsLTEgZG8gcj1yLi4oYiUyXmktYiUyXihpLTEpPjAgYW5kICcxJyBvciAnMCcpIGVuZAorICAgICAgICByZXR1cm4gcjsKKyAgICBlbmQpLi4nMDAwMCcpOmdzdWIoJyVkJWQlZD8lZD8lZD8lZD8nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoI3ggPCA2KSB0aGVuIHJldHVybiAnJyBlbmQKKyAgICAgICAgbG9jYWwgYz0wCisgICAgICAgIGZvciBpPTEsNiBkbyBjPWMrKHg6c3ViKGksaSk9PScxJyBhbmQgMl4oNi1pKSBvciAwKSBlbmQKKyAgICAgICAgcmV0dXJuIGI6c3ViKGMrMSxjKzEpCisgICAgZW5kKS4uKHsgJycsICc9PScsICc9JyB9KVsjZGF0YSUzKzFdKQorZW5kCisKKy0tIGRlY29kaW5nCitmdW5jdGlvbiBiYXNlNjRfZGVjb2RlKGRhdGEpCisgICAgZGF0YSA9IHN0cmluZy5nc3ViKGRhdGEsICdbXicuLmIuLic9XScsICcnKQorICAgIHJldHVybiAoZGF0YTpnc3ViKCcuJywgZnVuY3Rpb24oeCkKKyAgICAgICAgaWYgKHggPT0gJz0nKSB0aGVuIHJldHVybiAnJyBlbmQKKyAgICAgICAgbG9jYWwgcixmPScnLChiOmZpbmQoeCktMSkKKyAgICAgICAgZm9yIGk9NiwxLC0xIGRvIHI9ci4uKGYlMl5pLWYlMl4oaS0xKT4wIGFuZCAnMScgb3IgJzAnKSBlbmQKKyAgICAgICAgcmV0dXJuIHI7CisgICAgZW5kKTpnc3ViKCclZCVkJWQ/JWQ/JWQ/JWQ/JWQ/JWQ/JywgZnVuY3Rpb24oeCkKKyAgICAgICAgaWYgKCN4IH49IDgpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCBjPTAKKyAgICAgICAgZm9yIGk9MSw4IGRvIGM9YysoeDpzdWIoaSxpKT09JzEnIGFuZCAyXig4LWkpIG9yIDApIGVuZAorICAgICAgICByZXR1cm4gc3RyaW5nLmNoYXIoYykKKyAgICBlbmQpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVzZXRDb250ZXh0KCkKKyAgc2VsZi5qc29uQ29udGV4dCA9IHt9CisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSB7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMiwgbnVsbCA9IHRydWV9CisgIHNlbGYuanNvbkNvbnRleHRJbmRleCA9IDEKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOmNvbnRleHRQdXNoKGNvbnRleHQpCisgIHNlbGYuanNvbkNvbnRleHRJbmRleCA9IHNlbGYuanNvbkNvbnRleHRJbmRleCArIDEKKyAgc2VsZi5qc29uQ29udGV4dFtzZWxmLmpzb25Db250ZXh0SW5kZXhdID0gc2VsZi5qc29uQ29udGV4dFZhbAorICBzZWxmLmpzb25Db250ZXh0VmFsID0gY29udGV4dAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6Y29udGV4dFBvcCgpCisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSBzZWxmLmpzb25Db250ZXh0W3NlbGYuanNvbkNvbnRleHRJbmRleF0KKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gc2VsZi5qc29uQ29udGV4dEluZGV4IC0gMQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6ZXNjYXBlTnVtKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICByZXR1cm4gc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbgorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5udWxsIHRoZW4KKyAgICByZXR1cm4KKyAgZW5kCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgdGhlbgorICAgIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgPSBmYWxzZQorICBlbHNlCisgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gdGhlbgorICAgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlBhaXJTZXBhcmF0b3IpCisgICAgICAgIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gPSBmYWxzZQorICAgICAgZWxzZQorICAgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgICAgIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gPSB0cnVlCisgICAgICBlbmQKKyAgICBlbHNlCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6aGV4Q2hhcih2YWwpCisgIHZhbCA9IGxpYmx1YWJpdHdpc2UuYmFuZCh2YWwsIDB4MGYpCisgIGlmIHZhbCA8IDEwIHRoZW4KKyAgICByZXR1cm4gdmFsICsgNDgKKyAgZWxzZQorICAgIHJldHVybiB2YWwgKyA4NworICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkVzY2FwZUNoYXIoY2gpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRXNjYXBlUHJlZml4KQorICBsb2NhbCBvdXRDaCA9IGhleENoYXIobGlibHVhYml0d2lzZS5zaGlmdHIoY2gsIDQpKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBvdXRDaCkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorICBvdXRDaCA9IGhleENoYXIoY2gpCisgIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05DaGFyKGJ5dGUpCisgIGNoID0gc3RyaW5nLmJ5dGUoYnl0ZSkKKyAgaWYgY2ggPj0gMHgzMCB0aGVuCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuQmFja3NsYXNoIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQmFja3NsYXNoKQorICAgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5CYWNrc2xhc2gpCisgICAgZWxzZQorICAgICAgc2VsZi50cmFuczp3cml0ZShieXRlKQorICAgIGVuZAorICBlbHNlCisgICAgbG9jYWwgb3V0Q2ggPSBKU09OQ2hhclRhYmxlW2NoKzFdCisgICAgaWYgb3V0Q2ggPT0gMSB0aGVuCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGUpCisgICAgZWxzZWlmIG91dENoID4gMSB0aGVuCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkJhY2tzbGFzaCkKKyAgICAgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICAgICAgc2VsZi50cmFuczp3cml0ZShidWZmKQorICAgIGVsc2UKKyAgICAgIHNlbGY6d3JpdGVKU09ORXNjYXBlQ2hhcihjaCkKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05TdHJpbmcoc3RyKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICAtLSBUT0RPIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgbG9jYWwgbGVuZ3RoID0gc3RyaW5nLmxlbihzdHIpCisgIGxvY2FsIGlpID0gMQorICB3aGlsZSBpaSA8PSBsZW5ndGggZG8KKyAgICBzZWxmOndyaXRlSlNPTkNoYXIoc3RyaW5nLnN1YihzdHIsIGlpLCBpaSkpCisgICAgaWkgPSBpaSArIDEKKyAgZW5kCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OQmFzZTY0KHN0cikKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgbG9jYWwgbGVuZ3RoID0gc3RyaW5nLmxlbihzdHIpCisgIGxvY2FsIG9mZnNldCA9IDEKKyAgd2hpbGUgbGVuZ3RoID49IDMgZG8KKyAgICAtLSBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICBsb2NhbCBieXRlcyA9IGJhc2U2NF9lbmNvZGUoc3RyaW5nLnN1YihzdHIsIG9mZnNldCwgb2Zmc2V0KzMpKQorICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZXMpCisgICAgbGVuZ3RoID0gbGVuZ3RoIC0gMworICAgIG9mZnNldCA9IG9mZnNldCArIDMKKyAgZW5kCisgIGlmIGxlbmd0aCA+IDAgdGhlbgorICAgIGxvY2FsIGJ5dGVzID0gYmFzZTY0X2VuY29kZShzdHJpbmcuc3ViKHN0ciwgb2Zmc2V0LCBvZmZzZXQrbGVuZ3RoKSkKKyAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGVzKQorICBlbmQKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05JbnRlZ2VyKG51bSkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIGxvY2FsIG51bXN0ciA9ICIiIC4uIG51bQorICBudW1zdHIgPSBzdHJpbmcuc3ViKG51bXN0ciwgc3RyaW5nLmZpbmQobnVtc3RyLCAiXlsrLV0/JWQrIikpCisgIHNlbGYudHJhbnM6d3JpdGUobnVtc3RyKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05Eb3VibGUoZHViKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIGxvY2FsIHZhbCA9ICIiIC4uIGR1YgorICBsb2NhbCBwcmVmaXggPSBzdHJpbmcuc3ViKHZhbCwgMSwgMSkKKyAgbG9jYWwgc3BlY2lhbCA9IGZhbHNlCisgIGlmIHByZWZpeCA9PSAnTicgb3IgcHJlZml4ID09ICduJyB0aGVuCisgICAgdmFsID0gSlNPTk5vZGUuTmFuCisgICAgc3BlY2lhbCA9IHRydWUKKyAgZWxzZWlmIHByZWZpeCA9PSAnSScgb3IgcHJlZml4ID09ICdpJyB0aGVuCisgICAgdmFsID0gSlNPTk5vZGUuSW5maW5pdHkKKyAgICBzcGVjaWFsID0gdHJ1ZQorICBlbHNlaWYgcHJlZml4ID09ICctJyB0aGVuCisgICAgbG9jYWwgc2Vjb25kQnl0ZSA9IHN0cmluZy5zdWIodmFsLCAyLCAyKQorICAgIGlmIHNlY29uZEJ5dGUgPT0gJ0knIG9yIHNlY29uZEJ5dGUgPT0gJ2knIHRoZW4KKyAgICAgIHZhbCA9IEpTT05Ob2RlLk5lZ2F0aXZlSW5maW5pdHkKKyAgICAgIHNwZWNpYWwgPSB0cnVlCisgICAgZW5kCisgIGVuZAorCisgIGlmIHNwZWNpYWwgb3Igc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICBzZWxmLnRyYW5zOndyaXRlKHZhbCkKKyAgaWYgc3BlY2lhbCBvciBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5PYmplY3RCZWdpbikKKyAgc2VsZjpjb250ZXh0UHVzaCh7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMSwgbnVsbCA9IGZhbHNlfSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6Y29udGV4dFBvcCgpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuT2JqZWN0RW5kKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5BcnJheUJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OQXJyYXlFbmQoKQorICBzZWxmOmNvbnRleHRQb3AoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkFycmF5RW5kKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKQorICBzZWxmOnJlc2V0Q29udGV4dCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihUSlNPTlByb3RvY29sLlRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKG5hbWUpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcih0dHlwZSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHNlcWlkKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVNZXNzYWdlRW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTdHJ1Y3RFbmQoKQorICBzZWxmOndyaXRlSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGlkKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoaWQpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW3R0eXBlXSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRFbmQoKQorICBzZWxmOndyaXRlSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUZpZWxkU3RvcCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1trdHlwZV0pCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbdnR5cGVdKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2l6ZSkKKyAgcmV0dXJuIHNlbGY6d3JpdGVKU09OT2JqZWN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVNYXBFbmQoKQorICBzZWxmOndyaXRlSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbZXR5cGVdKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlTGlzdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1tldHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTZXRFbmQoKQorICBzZWxmOndyaXRlSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlQm9vbChib29sKQorICBpZiBib29sIHRoZW4KKyAgICBzZWxmOndyaXRlSlNPTkludGVnZXIoMSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVKU09OSW50ZWdlcigwKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlQnl0ZShieXRlKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2MnLCBieXRlKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdjJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHZhbCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSTE2KGkxNikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdzJywgaTE2KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdzJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHZhbCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSTMyKGkzMikKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdpJywgaTMyKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdpJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHZhbCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSTY0KGk2NCkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdsJywgaTY0KQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdsJywgYnVmZikKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHRvc3RyaW5nKHZhbCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZURvdWJsZShkdWIpCisgIHNlbGY6d3JpdGVKU09ORG91YmxlKHN0cmluZy5mb3JtYXQoIiUuMTZmIiwgZHViKSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlU3RyaW5nKHN0cikKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCaW5hcnkoc3RyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgc2VsZjp3cml0ZUpTT05CYXNlNjQoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05TeW50YXhDaGFyKGNoKQorICBsb2NhbCBjaDIgPSAiIgorICBpZiBzZWxmLmhhc1JlYWRCeXRlIH49ICIiIHRoZW4KKyAgICBjaDIgPSBzZWxmLmhhc1JlYWRCeXRlCisgICAgc2VsZi5oYXNSZWFkQnl0ZSA9ICIiCisgIGVsc2UKKyAgICBjaDIgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgZW5kCisgIGlmIGNoMiB+PSBjaCB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJFeHBlY3RlZCAiLi4gY2ggLi4gIiwgZ290ICIgLi4gY2gyfSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwubnVsbCB0aGVuCisgICAgcmV0dXJuCisgIGVuZAorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLmZpcnN0IHRoZW4KKyAgICBzZWxmLmpzb25Db250ZXh0VmFsLmZpcnN0ID0gZmFsc2UKKyAgZWxzZQorICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwudHR5cGUgPT0gMSB0aGVuCisgICAgICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uIHRoZW4KKyAgICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuUGFpclNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgICAgIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gPSB0cnVlCisgICAgICBlbmQKKyAgICBlbHNlCisgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5FbGVtU2VwYXJhdG9yKQorICAgIGVuZAorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOmhleFZhbChjaCkKKyAgbG9jYWwgdmFsID0gc3RyaW5nLmJ5dGUoY2gpCisgIGlmIHZhbCA+PSA0OCBhbmQgdmFsIDw9IDU3IHRoZW4KKyAgICByZXR1cm4gdmFsIC0gNDgKKyAgZWxzZWlmIHZhbCA+PSA5NyBhbmQgdmFsIDw9IDEwMiB0aGVuCisgICAgcmV0dXJuIHZhbCAtIDg3CisgIGVsc2UKKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIkV4cGVjdGVkIGhleCB2YWwgKFswLTlhLWZdKTsgZ290ICIgLi4gY2h9KQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09ORXNjYXBlQ2hhcihjaCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuWmVyb0NoYXIpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlplcm9DaGFyKQorICBsb2NhbCBiMSA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCBiMiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICByZXR1cm4gbGlibHVhYml0d2lzZS5zaGlmdGwoc2VsZjpoZXhWYWwoYjEpLCA0KSArIHNlbGY6aGV4VmFsKGIyKQorZW5kCisKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTlN0cmluZygpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGxvY2FsIHJlc3VsdCA9ICIiCisgIHdoaWxlIHRydWUgZG8KKyAgICBsb2NhbCBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICAgIGlmIGNoID09IEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlciB0aGVuCisgICAgICBicmVhaworICAgIGVuZAorICAgIGlmIGNoID09IEpTT05Ob2RlLkJhY2tzbGFzaCB0aGVuCisgICAgICBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICAgICAgaWYgY2ggPT0gSlNPTk5vZGUuRXNjYXBlQ2hhciB0aGVuCisgICAgICAgIHNlbGY6cmVhZEpTT05Fc2NhcGVDaGFyKGNoKQorICAgICAgZWxzZQorICAgICAgICBsb2NhbCBwb3MsIF8gPSBzdHJpbmcuZmluZChKU09OTm9kZS5Fc2NhcGVDaGFycywgY2gpCisgICAgICAgIGlmIHBvcyA9PSBuaWwgdGhlbgorICAgICAgICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgIiAuLiBjaH0pCisgICAgICAgIGVuZAorICAgICAgICBjaCA9IEVzY2FwZUNoYXJWYWxzW3Bvc10KKyAgICAgIGVuZAorICAgIGVuZAorICAgIHJlc3VsdCA9IHJlc3VsdCAuLiBjaAorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05CYXNlNjQoKQorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwgbGVuZ3RoID0gc3RyaW5nLmxlbihyZXN1bHQpCisgIGxvY2FsIHN0ciA9ICIiCisgIGxvY2FsIG9mZnNldCA9IDEKKyAgd2hpbGUgbGVuZ3RoID49IDQgZG8KKyAgICBsb2NhbCBieXRlcyA9IHN0cmluZy5zdWIocmVzdWx0LCBvZmZzZXQsIG9mZnNldCs0KQorICAgIHN0ciA9IHN0ciAuLiBiYXNlNjRfZGVjb2RlKGJ5dGVzKQorICAgIG9mZnNldCA9IG9mZnNldCArIDQKKyAgICBsZW5ndGggPSBsZW5ndGggLSA0CisgIGVuZAorICBpZiBsZW5ndGggPj0gMCB0aGVuCisgICAgc3RyID0gc3RyIC4uIGJhc2U2NF9kZWNvZGUoc3RyaW5nLnN1YihyZXN1bHQsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSkKKyAgZW5kCisgIHJldHVybiBzdHIKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgbG9jYWwgcmVzdWx0ID0gIiIKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgaWYgc3RyaW5nLmZpbmQoY2gsICdbLSswLTkuRWVdJykgdGhlbgorICAgICAgcmVzdWx0ID0gcmVzdWx0IC4uIGNoCisgICAgZWxzZQorICAgICAgc2VsZi5oYXNSZWFkQnl0ZSA9IGNoCisgICAgICBicmVhaworICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Mb25nSW50ZWdlcigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgaWYgc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05JbnRlZ2VyKCkKKyAgcmV0dXJuIHRvbnVtYmVyKHNlbGY6cmVhZEpTT05Mb25nSW50ZWdlcigpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Eb3VibGUoKQorICBzZWxmOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgbG9jYWwgZGVsaW1pdGVyID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIG51bSA9IDAuMAorICBpZiBkZWxpbWl0ZXIgPT0gSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyIHRoZW4KKyAgICBsb2NhbCBzdHIgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgICBpZiBzdHIgPT0gSlNPTk5vZGUuTmFuIHRoZW4KKyAgICAgIG51bSA9IDEuMAorICAgIGVsc2VpZiBzdHIgPT0gSlNPTk5vZGUuSW5maW5pdHkgdGhlbgorICAgICAgbnVtID0gbWF0aC5tYXhpbnRlZ2VyCisgICAgZWxzZWlmIHN0ciA9PSBKU09OTm9kZS5OZWdhdGl2ZUluZmluaXR5IHRoZW4KKyAgICAgIG51bSA9IG1hdGgubWluaW50ZWdlcgorICAgIGVsc2UKKyAgICAgIG51bSA9IHRvbnVtYmVyKHN0cikKKyAgICBlbmQKKyAgZWxzZQorICAgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICAgIGVuZAorICAgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgIG51bSA9IHRvbnVtYmVyKGRlbGltaXRlci4uIHJlc3VsdCkKKyAgZW5kCisgIHJldHVybiBudW0KK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICBzZWxmOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuT2JqZWN0QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDEsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLk9iamVjdEVuZCkKKyAgc2VsZjpjb250ZXh0UG9wKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5BcnJheUJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05BcnJheUVuZCgpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkFycmF5RW5kKQorICBzZWxmOmNvbnRleHRQb3AoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZE1lc3NhZ2VCZWdpbigpCisgIHNlbGY6cmVzZXRDb250ZXh0KCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5QmVnaW4oKQorICBsb2NhbCB2ZXJzaW9uID0gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorICBpZiB2ZXJzaW9uIH49IHNlbGYuVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4ifSkKKyAgZW5kCisgIGxvY2FsIG5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwgdHR5cGUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGxvY2FsIHNlcWlkID0gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorICByZXR1cm4gbmFtZSwgdHR5cGUsIHNlcWlkCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWVzc2FnZUVuZCgpCisgIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU3RydWN0QmVnaW4oKQorICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICByZXR1cm4gbmlsCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU3RydWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRmllbGRCZWdpbigpCisgIGxvY2FsIHR0eXBlID0gVFR5cGUuU1RPUAorICBsb2NhbCBpZCA9IDAKKyAgbG9jYWwgY2ggPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgc2VsZi5oYXNSZWFkQnl0ZSA9IGNoCisgIGlmIGNoIH49IEpTT05Ob2RlLk9iamVjdEVuZCB0aGVuCisgICAgaWQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgICAgc2VsZjpyZWFkSlNPTk9iamVjdEJlZ2luKCkKKyAgICBsb2NhbCB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICAgIHR0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgZW5kCisgIHJldHVybiBuaWwsIHR0eXBlLCBpZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEZpZWxkRW5kKCkKKyAgc2VsZjpyZWFkSlNPTk9iamVjdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWFwQmVnaW4oKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgIGxvY2FsIGt0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgdHlwZU5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwgdnR5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICByZXR1cm4ga3R5cGUsIHZ0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWFwRW5kKCkKKyAgc2VsZjpyZWFkSlNPTk9iamVjdEVuZCgpCisgIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTGlzdEJlZ2luKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5QmVnaW4oKQorICBsb2NhbCB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCBldHlwZSA9IFN0cmluZ1RvVFR5cGVbdHlwZU5hbWVdCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHJldHVybiBldHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZExpc3RFbmQoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTZXRCZWdpbigpCisgIHJldHVybiBzZWxmOnJlYWRMaXN0QmVnaW4oKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFNldEVuZCgpCisgIHJldHVybiBzZWxmOnJlYWRKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEJvb2woKQorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHJlc3VsdCA9PSAxIHRoZW4KKyAgICByZXR1cm4gdHJ1ZQorICBlbHNlCisgICAgcmV0dXJuIGZhbHNlCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEJ5dGUoKQorICBsb2NhbCByZXN1bHQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHJlc3VsdCA+PSAyNTYgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiVW5FeHBlY3RlZCBCeXRlICIgLi4gcmVzdWx0fSkKKyAgZW5kCisgIHJldHVybiByZXN1bHQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRJMTYoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkludGVnZXIoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEkzMigpCisgIHJldHVybiBzZWxmOnJlYWRKU09OSW50ZWdlcigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSTY0KCkKKyAgbG9jYWwgbG9uZyA9IGxpYmx1YWxvbmdudW1iZXIubmV3CisgIHJldHVybiBsb25nKHNlbGY6cmVhZEpTT05Mb25nSW50ZWdlcigpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZERvdWJsZSgpCisgIHJldHVybiBzZWxmOnJlYWRKU09ORG91YmxlKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJpbmcoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTlN0cmluZygpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQmluYXJ5KCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05CYXNlNjQoKQorZW5kCisKK1RKU09OUHJvdG9jb2xGYWN0b3J5ID0gVFByb3RvY29sRmFjdG9yeTpuZXd7CisgIF9fdHlwZSA9ICdUSlNPTlByb3RvY29sRmFjdG9yeScsCit9CisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKHRyYW5zKQorICAtLSBUT0RPIEVuZm9yY2UgdGhhdCB0aGlzIG11c3QgYmUgYSB0cmFuc3BvcnQgY2xhc3MgKGllIG5vdCBhIGJvb2wpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRKU09OUHJvdG9jb2w6bmV3eworICAgIHRyYW5zID0gdHJhbnMKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RNZW1vcnlCdWZmZXIubHVhIGIvbGliL2x1YS9UTWVtb3J5QnVmZmVyLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIyZjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UTWVtb3J5QnVmZmVyLmx1YQpAQCAtMCwwICsxLDkxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVFRyYW5zcG9ydCcKKworVE1lbW9yeUJ1ZmZlciA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RNZW1vcnlCdWZmZXInLAorICBidWZmZXIgPSAnJywKKyAgYnVmZmVyU2l6ZSA9IDEwMjQsCisgIHdQb3MgPSAwLAorICByUG9zID0gMAorfQorZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjppc09wZW4oKQorICByZXR1cm4gMQorZW5kCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOm9wZW4oKSBlbmQKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6Y2xvc2UoKSBlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpwZWFrKCkKKyAgcmV0dXJuIHNlbGYuclBvcyA8IHNlbGYud1BvcworZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6Z2V0QnVmZmVyKCkKKyAgcmV0dXJuIHNlbGYuYnVmZmVyCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjpyZXNldEJ1ZmZlcihidWYpCisgIGlmIGJ1ZiB0aGVuCisgICAgc2VsZi5idWZmZXIgPSBidWYKKyAgICBzZWxmLmJ1ZmZlclNpemUgPSBzdHJpbmcubGVuKGJ1ZikKKyAgZWxzZQorICAgIHNlbGYuYnVmZmVyID0gJycKKyAgICBzZWxmLmJ1ZmZlclNpemUgPSAxMDI0CisgIGVuZAorICBzZWxmLndQb3MgPSBzdHJpbmcubGVuKGJ1ZikKKyAgc2VsZi5yUG9zID0gMAorZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6YXZhaWxhYmxlKCkKKyAgcmV0dXJuIHNlbGYud1BvcyAtIHNlbGYuclBvcworZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6cmVhZChsZW4pCisgIGxvY2FsIGF2YWlsID0gc2VsZjphdmFpbGFibGUoKQorICBpZiBhdmFpbCA9PSAwIHRoZW4KKyAgICByZXR1cm4gJycKKyAgZW5kCisKKyAgaWYgYXZhaWwgPCBsZW4gdGhlbgorICAgIGxlbiA9IGF2YWlsCisgIGVuZAorCisgIGxvY2FsIHZhbCA9IHN0cmluZy5zdWIoc2VsZi5idWZmZXIsIHNlbGYuclBvcyArIDEsIHNlbGYuclBvcyArIGxlbikKKyAgc2VsZi5yUG9zID0gc2VsZi5yUG9zICsgbGVuCisgIHJldHVybiB2YWwKK2VuZAorCitmdW5jdGlvbiBUTWVtb3J5QnVmZmVyOnJlYWRBbGwobGVuKQorICBsb2NhbCBhdmFpbCA9IHNlbGY6YXZhaWxhYmxlKCkKKworICBpZiBhdmFpbCA8IGxlbiB0aGVuCisgICAgbG9jYWwgbXNnID0gc3RyaW5nLmZvcm1hdCgnQXR0ZW1wdCB0byByZWFkQWxsKCVkKSBmb3VuZCBvbmx5ICVkIGF2YWlsYWJsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGF2YWlsKQorICAgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gbXNnfSkKKyAgZW5kCisgIC0tIHJlYWQgc2hvdWxkIGJsb2NrIHNvIHdlIGRvbid0IG5lZWQgYSBsb29wIGhlcmUKKyAgcmV0dXJuIHNlbGY6cmVhZChsZW4pCitlbmQKKworZnVuY3Rpb24gVE1lbW9yeUJ1ZmZlcjp3cml0ZShidWYpCisgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXIgLi4gYnVmCisgIHNlbGYud1BvcyA9IHNlbGYud1BvcyArIHN0cmluZy5sZW4oYnVmKQorZW5kCisKK2Z1bmN0aW9uIFRNZW1vcnlCdWZmZXI6Zmx1c2goKSBlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVFByb3RvY29sLmx1YSBiL2xpYi9sdWEvVFByb3RvY29sLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZlMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UUHJvdG9jb2wubHVhCkBAIC0wLDAgKzEsMTYyIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVGhyaWZ0JworCitUUHJvdG9jb2xFeGNlcHRpb24gPSBURXhjZXB0aW9uOm5ldyB7CisgIFVOS05PV04gICAgICAgICAgPSAwLAorICBJTlZBTElEX0RBVEEgICAgID0gMSwKKyAgTkVHQVRJVkVfU0laRSAgICA9IDIsCisgIFNJWkVfTElNSVQgICAgICAgPSAzLAorICBCQURfVkVSU0lPTiAgICAgID0gNCwKKyAgSU5WQUxJRF9QUk9UT0NPTCA9IDUsCisgIERFUFRIX0xJTUlUICAgICAgPSA2LAorICBlcnJvckNvZGUgICAgICAgID0gMCwKKyAgX190eXBlID0gJ1RQcm90b2NvbEV4Y2VwdGlvbicKK30KK2Z1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbjpfX2Vycm9yQ29kZVRvU3RyaW5nKCkKKyAgaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX0RBVEEgdGhlbgorICAgIHJldHVybiAnSW52YWxpZCBkYXRhJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5ORUdBVElWRV9TSVpFIHRoZW4KKyAgICByZXR1cm4gJ05lZ2F0aXZlIHNpemUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlNJWkVfTElNSVQgdGhlbgorICAgIHJldHVybiAnU2l6ZSBsaW1pdCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuQkFEX1ZFUlNJT04gdGhlbgorICAgIHJldHVybiAnQmFkIHZlcnNpb24nCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfUFJPVE9DT0wgdGhlbgorICAgIHJldHVybiAnSW52YWxpZCBwcm90b2NvbCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuREVQVEhfTElNSVQgdGhlbgorICAgIHJldHVybiAnRXhjZWVkZWQgc2l6ZSBsaW1pdCcKKyAgZWxzZQorICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93biknCisgIGVuZAorZW5kCisKK1RQcm90b2NvbEJhc2UgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnVFByb3RvY29sQmFzZScsCisgIHRyYW5zCit9CisKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6bmV3KG9iaikKKyAgaWYgdHR5cGUob2JqKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcih0dHlwZShzZWxmKSAuLiAnbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBFbnN1cmUgYSB0cmFuc3BvcnQgaXMgcHJvdmlkZWQKKyAgaWYgbm90IG9iai50cmFucyB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYSB0cmFucycpCisgIGVuZAorCisgIHJldHVybiBfX1RPYmplY3QubmV3KHNlbGYsIG9iaikKK2VuZAorCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTWVzc2FnZUVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZVN0cnVjdEJlZ2luKG5hbWUpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZVN0cnVjdEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGlkKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVGaWVsZEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUZpZWxkU3RvcCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTWFwRW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlTGlzdEJlZ2luKHR0eXBlLCBzaXplKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVMaXN0RW5kKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlU2V0QmVnaW4odHR5cGUsIHNpemUpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZVNldEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTp3cml0ZUJvb2woYm9vbCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOndyaXRlQnl0ZShieXRlKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVJMTYoaTE2KSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVJMzIoaTMyKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVJNjQoaTY0KSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVEb3VibGUoZHViKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6d3JpdGVTdHJpbmcoc3RyKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZE1lc3NhZ2VCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTWVzc2FnZUVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkU3RydWN0QmVnaW4oKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZFN0cnVjdEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkRmllbGRCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkRmllbGRFbmQoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZE1hcEJlZ2luKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRNYXBFbmQoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZExpc3RCZWdpbigpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkTGlzdEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkU2V0QmVnaW4oKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZFNldEVuZCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkQm9vbCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkQnl0ZSgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkSTE2KCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRJMzIoKSBlbmQKK2Z1bmN0aW9uIFRQcm90b2NvbEJhc2U6cmVhZEk2NCgpIGVuZAorZnVuY3Rpb24gVFByb3RvY29sQmFzZTpyZWFkRG91YmxlKCkgZW5kCitmdW5jdGlvbiBUUHJvdG9jb2xCYXNlOnJlYWRTdHJpbmcoKSBlbmQKKworZnVuY3Rpb24gVFByb3RvY29sQmFzZTpza2lwKHR0eXBlKQorICBpZiB0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgIHJldHVybgorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuQk9PTCB0aGVuCisgICAgc2VsZjpyZWFkQm9vbCgpCisgIGVsc2VpZiB0dHlwZSA9PSBUVHlwZS5CWVRFIHRoZW4KKyAgICBzZWxmOnJlYWRCeXRlKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkkxNiB0aGVuCisgICAgc2VsZjpyZWFkSTE2KCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkkzMiB0aGVuCisgICAgc2VsZjpyZWFkSTMyKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkk2NCB0aGVuCisgICAgc2VsZjpyZWFkSTY0KCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLkRPVUJMRSB0aGVuCisgICAgc2VsZjpyZWFkRG91YmxlKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLlNUUklORyB0aGVuCisgICAgc2VsZjpyZWFkU3RyaW5nKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLlNUUlVDVCB0aGVuCisgICAgbG9jYWwgbmFtZSA9IHNlbGY6cmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSB0cnVlIGRvCisgICAgICBsb2NhbCBuYW1lLCB0dHlwZSwgaWQgPSBzZWxmOnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIHR0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgICAgICBicmVhaworICAgICAgZW5kCisgICAgICBzZWxmOnNraXAodHR5cGUpCisgICAgICBzZWxmOnJlYWRGaWVsZEVuZCgpCisgICAgZW5kCisgICAgc2VsZjpyZWFkU3RydWN0RW5kKCkKKyAgZWxzZWlmIHR0eXBlID09IFRUeXBlLk1BUCB0aGVuCisgICAgbG9jYWwga3R0eXBlLCB2dHR5cGUsIHNpemUgPSBzZWxmOnJlYWRNYXBCZWdpbigpCisgICAgZm9yIGkgPSAxLCBzaXplLCAxIGRvCisgICAgICBzZWxmOnNraXAoa3R0eXBlKQorICAgICAgc2VsZjpza2lwKHZ0dHlwZSkKKyAgICBlbmQKKyAgICBzZWxmOnJlYWRNYXBFbmQoKQorICBlbHNlaWYgdHR5cGUgPT0gVFR5cGUuU0VUIHRoZW4KKyAgICBsb2NhbCBldHR5cGUsIHNpemUgPSBzZWxmOnJlYWRTZXRCZWdpbigpCisgICAgZm9yIGkgPSAxLCBzaXplLCAxIGRvCisgICAgICBzZWxmOnNraXAoZXR0eXBlKQorICAgIGVuZAorICAgIHNlbGY6cmVhZFNldEVuZCgpCisgIGVsc2VpZiB0dHlwZSA9PSBUVHlwZS5MSVNUIHRoZW4KKyAgICBsb2NhbCBldHR5cGUsIHNpemUgPSBzZWxmOnJlYWRMaXN0QmVnaW4oKQorICAgIGZvciBpID0gMSwgc2l6ZSwgMSBkbworICAgICAgc2VsZjpza2lwKGV0dHlwZSkKKyAgICBlbmQKKyAgICBzZWxmOnJlYWRMaXN0RW5kKCkKKyAgZW5kCitlbmQKKworVFByb3RvY29sRmFjdG9yeSA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdUUHJvdG9jb2xGYWN0b3J5JywKK30KK2Z1bmN0aW9uIFRQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2wodHJhbnMpIGVuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9UU2VydmVyLmx1YSBiL2xpYi9sdWEvVFNlcnZlci5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzN2Q1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVFNlcnZlci5sdWEKQEAgLTAsMCArMSwxNDAgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUaHJpZnQnCityZXF1aXJlICdURnJhbWVkVHJhbnNwb3J0JworcmVxdWlyZSAnVEJpbmFyeVByb3RvY29sJworCistLSBUU2VydmVyCitUU2VydmVyID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RTZXJ2ZXInCit9CisKKy0tIDIgcG9zc2libGUgY29uc3RydWN0b3JzCistLSAgIDEuIHtwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydH0KKy0tICAgMi4ge3Byb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3Rvcnl9CitmdW5jdGlvbiBUU2VydmVyOm5ldyhhcmdzKQorICBpZiB0dHlwZShhcmdzKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcignVFNlcnZlciBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YWJsZScpCisgIGVuZAorICBpZiBhcmdzLnByb2Nlc3NvciA9PSBuaWwgdGhlbgorICAgIHRlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHByb2Nlc3NvcicpCisgIGVuZAorICBpZiBhcmdzLnNlcnZlclRyYW5zcG9ydCA9PSBuaWwgdGhlbgorICAgIHRlcnJvcignWW91IG11c3QgcHJvdmlkZSAnIC4uIHR0eXBlKHNlbGYpIC4uICcgd2l0aCBhIHNlcnZlclRyYW5zcG9ydCcpCisgIGVuZAorCisgIC0tIENyZWF0ZSB0aGUgb2JqZWN0CisgIGxvY2FsIG9iaiA9IF9fVE9iamVjdC5uZXcoc2VsZiwgYXJncykKKworICBpZiBvYmoudHJhbnNwb3J0RmFjdG9yeSB0aGVuCisgICAgb2JqLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IG9iai50cmFuc3BvcnRGYWN0b3J5CisgICAgb2JqLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvYmoudHJhbnNwb3J0RmFjdG9yeQorICAgIG9iai50cmFuc3BvcnRGYWN0b3J5ID0gbmlsCisgIGVsc2UKKyAgICBvYmouaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gVEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk6bmV3e30KKyAgICBvYmoub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG9iai5pbnB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgZW5kCisKKyAgaWYgb2JqLnByb3RvY29sRmFjdG9yeSB0aGVuCisgICAgb2JqLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gb2JqLnByb3RvY29sRmFjdG9yeQorICAgIG9iai5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvYmoucHJvdG9jb2xGYWN0b3J5CisgICAgb2JqLnByb3RvY29sRmFjdG9yeSA9IG5pbAorICBlbHNlCisgICAgb2JqLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeTpuZXd7fQorICAgIG9iai5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvYmouaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgZW5kCisKKyAgLS0gU2V0IHRoZSBfX3NlcnZlciB2YXJpYWJsZSBpbiB0aGUgaGFuZGxlciBzbyB3ZSBjYW4gc3RvcCB0aGUgc2VydmVyCisgIG9iai5wcm9jZXNzb3IuaGFuZGxlci5fX3NlcnZlciA9IHNlbGYKKworICByZXR1cm4gb2JqCitlbmQKKworZnVuY3Rpb24gVFNlcnZlcjpzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoaGFuZGxlcikKKyAgc2VsZi5zZXJ2ZXJFdmVudEhhbmRsZXIgPSBoYW5kbGVyCitlbmQKKworZnVuY3Rpb24gVFNlcnZlcjpfY2xpZW50QmVnaW4oY29udGVudCwgaXByb3QsIG9wcm90KQorICBpZiBzZWxmLnNlcnZlckV2ZW50SGFuZGxlciBhbmQKKyAgICB0eXBlKHNlbGYuc2VydmVyRXZlbnRIYW5kbGVyLmNsaWVudEJlZ2luKSA9PSAnZnVuY3Rpb24nIHRoZW4KKyAgICBzZWxmLnNlcnZlckV2ZW50SGFuZGxlcjpjbGllbnRCZWdpbihpcHJvdCwgb3Byb3QpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXI6X3ByZVNlcnZlKCkKKyAgaWYgc2VsZi5zZXJ2ZXJFdmVudEhhbmRsZXIgYW5kCisgICAgdHlwZShzZWxmLnNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSkgPT0gJ2Z1bmN0aW9uJyB0aGVuCisgICAgc2VsZi5zZXJ2ZXJFdmVudEhhbmRsZXI6cHJlU2VydmUoc2VsZi5zZXJ2ZXJUcmFuc3BvcnQ6Z2V0U29ja2V0SW5mbygpKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyOl9oYW5kbGVFeGNlcHRpb24oZXJyKQorICBpZiBzdHJpbmcuZmluZChlcnIsICdUVHJhbnNwb3J0RXhjZXB0aW9uJykgPT0gbmlsIHRoZW4KKyAgICBwcmludChlcnIpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRTZXJ2ZXI6c2VydmUoKSBlbmQKK2Z1bmN0aW9uIFRTZXJ2ZXI6aGFuZGxlKGNsaWVudCkKKyAgbG9jYWwgaXRyYW5zLCBvdHJhbnMgPQorICAgIHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydChjbGllbnQpLAorICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeTpnZXRUcmFuc3BvcnQoY2xpZW50KQorICBsb2NhbCBpcHJvdCwgb3Byb3QgPQorICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2woaXRyYW5zKSwKKyAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbChvdHJhbnMpCisKKyAgc2VsZjpfY2xpZW50QmVnaW4oaXByb3QsIG9wcm90KQorICB3aGlsZSB0cnVlIGRvCisgICAgbG9jYWwgcmV0LCBlcnIgPSBwY2FsbChzZWxmLnByb2Nlc3Nvci5wcm9jZXNzLCBzZWxmLnByb2Nlc3NvciwgaXByb3QsIG9wcm90KQorICAgIGlmIHJldCA9PSBmYWxzZSBhbmQgZXJyIHRoZW4KKyAgICAgIGlmIG5vdCBzdHJpbmcuZmluZChlcnIsICJUVHJhbnNwb3J0RXhjZXB0aW9uIikgdGhlbgorICAgICAgICBzZWxmOl9oYW5kbGVFeGNlcHRpb24oZXJyKQorICAgICAgZW5kCisgICAgICBicmVhaworICAgIGVuZAorICBlbmQKKyAgaXRyYW5zOmNsb3NlKCkKKyAgb3RyYW5zOmNsb3NlKCkKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyOmNsb3NlKCkKKyAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQ6Y2xvc2UoKQorZW5kCisKKy0tIFRTaW1wbGVTZXJ2ZXIKKy0tICBTaW5nbGUgdGhyZWFkZWQgc2VydmVyIHRoYXQgaGFuZGxlcyBvbmUgdHJhbnNwb3J0IChjb25uZWN0aW9uKQorVFNpbXBsZVNlcnZlciA9IF9fVE9iamVjdDpuZXcoVFNlcnZlciwgeworICBfX3R5cGUgPSAnVFNpbXBsZVNlcnZlcicsCisgIF9fc3RvcCA9IGZhbHNlCit9KQorCitmdW5jdGlvbiBUU2ltcGxlU2VydmVyOnNlcnZlKCkKKyAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQ6bGlzdGVuKCkKKyAgc2VsZjpfcHJlU2VydmUoKQorICB3aGlsZSBub3Qgc2VsZi5fX3N0b3AgZG8KKyAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydDphY2NlcHQoKQorICAgIHNlbGY6aGFuZGxlKGNsaWVudCkKKyAgZW5kCisgIHNlbGY6Y2xvc2UoKQorZW5kCisKK2Z1bmN0aW9uIFRTaW1wbGVTZXJ2ZXI6c3RvcCgpCisgIHNlbGYuX19zdG9wID0gdHJ1ZQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RTb2NrZXQubHVhIGIvbGliL2x1YS9UU29ja2V0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzFmYzFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UU29ja2V0Lmx1YQpAQCAtMCwwICsxLDEzMiBAQAorLS0tLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworcmVxdWlyZSAnbGlibHVhc29ja2V0JworCistLSBUU29ja2V0QmFzZQorVFNvY2tldEJhc2UgPSBUVHJhbnNwb3J0QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUU29ja2V0QmFzZScsCisgIHRpbWVvdXQgPSAxMDAwLAorICBob3N0ID0gJ2xvY2FsaG9zdCcsCisgIHBvcnQgPSA5MDkwLAorICBoYW5kbGUKK30KKworZnVuY3Rpb24gVFNvY2tldEJhc2U6Y2xvc2UoKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgc2VsZi5oYW5kbGU6ZGVzdHJveSgpCisgICAgc2VsZi5oYW5kbGUgPSBuaWwKKyAgZW5kCitlbmQKKworLS0gUmV0dXJucyBhIHRhYmxlIHdpdGggdGhlIGZpZWxkcyBob3N0IGFuZCBwb3J0CitmdW5jdGlvbiBUU29ja2V0QmFzZTpnZXRTb2NrZXRJbmZvKCkKKyAgaWYgc2VsZi5oYW5kbGUgdGhlbgorICAgIHJldHVybiBzZWxmLmhhbmRsZTpnZXRzb2NraW5mbygpCisgIGVuZAorICB0ZXJyb3IoVFRyYW5zcG9ydEV4Y2VwdGlvbjpuZXd7ZXJyb3JDb2RlID0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTn0pCitlbmQKKworZnVuY3Rpb24gVFNvY2tldEJhc2U6c2V0VGltZW91dCh0aW1lb3V0KQorICBpZiB0aW1lb3V0IGFuZCB0dHlwZSh0aW1lb3V0KSA9PSAnbnVtYmVyJyB0aGVuCisgICAgaWYgc2VsZi5oYW5kbGUgdGhlbgorICAgICAgc2VsZi5oYW5kbGU6c2V0dGltZW91dCh0aW1lb3V0KQorICAgIGVuZAorICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKKyAgZW5kCitlbmQKKworLS0gVFNvY2tldAorVFNvY2tldCA9IFRTb2NrZXRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RTb2NrZXQnLAorICBob3N0ID0gJ2xvY2FsaG9zdCcsCisgIHBvcnQgPSA5MDkwCit9CisKK2Z1bmN0aW9uIFRTb2NrZXQ6aXNPcGVuKCkKKyAgaWYgc2VsZi5oYW5kbGUgdGhlbgorICAgIHJldHVybiB0cnVlCisgIGVuZAorICByZXR1cm4gZmFsc2UKK2VuZAorCitmdW5jdGlvbiBUU29ja2V0Om9wZW4oKQorICBpZiBzZWxmLmhhbmRsZSB0aGVuCisgICAgc2VsZjpjbG9zZSgpCisgIGVuZAorCisgIC0tIENyZWF0ZSBsb2NhbCBoYW5kbGUKKyAgbG9jYWwgc29jaywgZXJyID0gbHVhc29ja2V0LmNyZWF0ZV9hbmRfY29ubmVjdCgKKyAgICBzZWxmLmhvc3QsIHNlbGYucG9ydCwgc2VsZi50aW1lb3V0KQorICBpZiBlcnIgPT0gbmlsIHRoZW4KKyAgICBzZWxmLmhhbmRsZSA9IHNvY2sKKyAgZW5kCisKKyAgaWYgZXJyIHRoZW4KKyAgICB0ZXJyb3IoVFRyYW5zcG9ydEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvICcgLi4gc2VsZi5ob3N0IC4uICc6JyAuLiBzZWxmLnBvcnQKKyAgICAgICAgLi4gJyAoJyAuLiBlcnIgLi4gJyknCisgICAgfSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVFNvY2tldDpyZWFkKGxlbikKKyAgbG9jYWwgYnVmID0gc2VsZi5oYW5kbGU6cmVjZWl2ZShzZWxmLmhhbmRsZSwgbGVuKQorICBpZiBub3QgYnVmIG9yIHN0cmluZy5sZW4oYnVmKSB+PSBsZW4gdGhlbgorICAgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3tlcnJvckNvZGUgPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV059KQorICBlbmQKKyAgcmV0dXJuIGJ1ZgorZW5kCisKK2Z1bmN0aW9uIFRTb2NrZXQ6d3JpdGUoYnVmKQorICBzZWxmLmhhbmRsZTpzZW5kKHNlbGYuaGFuZGxlLCBidWYpCitlbmQKKworZnVuY3Rpb24gVFNvY2tldDpmbHVzaCgpCitlbmQKKworLS0gVFNlcnZlclNvY2tldAorVFNlcnZlclNvY2tldCA9IFRTb2NrZXRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RTZXJ2ZXJTb2NrZXQnLAorICBob3N0ID0gJ2xvY2FsaG9zdCcsCisgIHBvcnQgPSA5MDkwCit9CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXQ6bGlzdGVuKCkKKyAgaWYgc2VsZi5oYW5kbGUgdGhlbgorICAgIHNlbGY6Y2xvc2UoKQorICBlbmQKKworICBsb2NhbCBzb2NrLCBlcnIgPSBsdWFzb2NrZXQuY3JlYXRlKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorICBpZiBub3QgZXJyIHRoZW4KKyAgICBzZWxmLmhhbmRsZSA9IHNvY2sKKyAgZWxzZQorICAgIHRlcnJvcihlcnIpCisgIGVuZAorICBzZWxmLmhhbmRsZTpzZXR0aW1lb3V0KHNlbGYudGltZW91dCkKKyAgc2VsZi5oYW5kbGU6bGlzdGVuKCkKK2VuZAorCitmdW5jdGlvbiBUU2VydmVyU29ja2V0OmFjY2VwdCgpCisgIGxvY2FsIGNsaWVudCwgZXJyID0gc2VsZi5oYW5kbGU6YWNjZXB0KCkKKyAgaWYgZXJyIHRoZW4KKyAgICB0ZXJyb3IoZXJyKQorICBlbmQKKyAgcmV0dXJuIFRTb2NrZXQ6bmV3KHtoYW5kbGUgPSBjbGllbnR9KQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9UVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWM3ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UVHJhbnNwb3J0Lmx1YQpAQCAtMCwwICsxLDkzIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworcmVxdWlyZSAnVGhyaWZ0JworCitUVHJhbnNwb3J0RXhjZXB0aW9uID0gVEV4Y2VwdGlvbjpuZXcgeworICBVTktOT1dOICAgICAgICAgICAgID0gMCwKKyAgTk9UX09QRU4gICAgICAgICAgICA9IDEsCisgIEFMUkVBRFlfT1BFTiAgICAgICAgPSAyLAorICBUSU1FRF9PVVQgICAgICAgICAgID0gMywKKyAgRU5EX09GX0ZJTEUgICAgICAgICA9IDQsCisgIElOVkFMSURfRlJBTUVfU0laRSAgPSA1LAorICBJTlZBTElEX1RSQU5TRk9STSAgID0gNiwKKyAgSU5WQUxJRF9DTElFTlRfVFlQRSA9IDcsCisgIGVycm9yQ29kZSAgICAgICAgPSAwLAorICBfX3R5cGUgPSAnVFRyYW5zcG9ydEV4Y2VwdGlvbicKK30KKworZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbjpfX2Vycm9yQ29kZVRvU3RyaW5nKCkKKyAgaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5OT1RfT1BFTiB0aGVuCisgICAgcmV0dXJuICdUcmFuc3BvcnQgbm90IG9wZW4nCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLkFMUkVBRFlfT1BFTiB0aGVuCisgICAgcmV0dXJuICdUcmFuc3BvcnQgYWxyZWFkeSBvcGVuJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5USU1FRF9PVVQgdGhlbgorICAgIHJldHVybiAnVHJhbnNwb3J0IHRpbWVkIG91dCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuRU5EX09GX0ZJTEUgdGhlbgorICAgIHJldHVybiAnRW5kIG9mIGZpbGUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfRlJBTUVfU0laRSB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIGZyYW1lIHNpemUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLklOVkFMSURfVFJBTlNGT1JNIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgdHJhbnNmb3JtJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX0NMSUVOVF9UWVBFIHRoZW4KKyAgICByZXR1cm4gJ0ludmFsaWQgY2xpZW50IHR5cGUnCisgIGVsc2UKKyAgICByZXR1cm4gJ0RlZmF1bHQgKHVua25vd24pJworICBlbmQKK2VuZAorCitUVHJhbnNwb3J0QmFzZSA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdUVHJhbnNwb3J0QmFzZScKK30KKworZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6aXNPcGVuKCkgZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTpvcGVuKCkgZW5kCitmdW5jdGlvbiBUVHJhbnNwb3J0QmFzZTpjbG9zZSgpIGVuZAorZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6cmVhZChsZW4pIGVuZAorZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6cmVhZEFsbChsZW4pCisgIGxvY2FsIGJ1ZiwgaGF2ZSwgY2h1bmsgPSAnJywgMAorICB3aGlsZSBoYXZlIDwgbGVuIGRvCisgICAgY2h1bmsgPSBzZWxmOnJlYWQobGVuIC0gaGF2ZSkKKyAgICBoYXZlID0gaGF2ZSArIHN0cmluZy5sZW4oY2h1bmspCisgICAgYnVmID0gYnVmIC4uIGNodW5rCisKKyAgICBpZiBzdHJpbmcubGVuKGNodW5rKSA9PSAwIHRoZW4KKyAgICAgIHRlcnJvcihUVHJhbnNwb3J0RXhjZXB0aW9uOm5ld3sKKyAgICAgICAgZXJyb3JDb2RlID0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRQorICAgICAgfSkKKyAgICBlbmQKKyAgZW5kCisgIHJldHVybiBidWYKK2VuZAorZnVuY3Rpb24gVFRyYW5zcG9ydEJhc2U6d3JpdGUoYnVmKSBlbmQKK2Z1bmN0aW9uIFRUcmFuc3BvcnRCYXNlOmZsdXNoKCkgZW5kCisKK1RTZXJ2ZXJUcmFuc3BvcnRCYXNlID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ1RTZXJ2ZXJUcmFuc3BvcnRCYXNlJworfQorZnVuY3Rpb24gVFNlcnZlclRyYW5zcG9ydEJhc2U6bGlzdGVuKCkgZW5kCitmdW5jdGlvbiBUU2VydmVyVHJhbnNwb3J0QmFzZTphY2NlcHQoKSBlbmQKK2Z1bmN0aW9uIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlOmNsb3NlKCkgZW5kCisKK1RUcmFuc3BvcnRGYWN0b3J5QmFzZSA9IF9fVE9iamVjdDpuZXd7CisgIF9fdHlwZSA9ICdUVHJhbnNwb3J0RmFjdG9yeUJhc2UnCit9CitmdW5jdGlvbiBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6Z2V0VHJhbnNwb3J0KHRyYW5zKQorICByZXR1cm4gdHJhbnMKK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9UaHJpZnQubHVhIGIvbGliL2x1YS9UaHJpZnQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDRiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL1RocmlmdC5sdWEKQEAgLTAsMCArMSwyODEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCistLS0tIG5hbWVzcGFjZSB0aHJpZnQKKy0tdGhyaWZ0ID0ge30KKy0tc2V0bWV0YXRhYmxlKHRocmlmdCwge19faW5kZXggPSBfR30pIC0tPiBwZXJmIGhpdCBmb3IgYWNjZXNzaW5nIGdsb2JhbCBtZXRob2RzCistLXNldGZlbnYoMSwgdGhyaWZ0KQorCitwYWNrYWdlLmNwYXRoID0gcGFja2FnZS5jcGF0aCAuLiAnO2Jpbi8/LnNvJyAtLSBUT0RPIEZJWAorZnVuY3Rpb24gdHR5cGUob2JqKQorICBpZiB0eXBlKG9iaikgPT0gJ3RhYmxlJyBhbmQKKyAgICBvYmouX190eXBlIGFuZAorICAgIHR5cGUob2JqLl9fdHlwZSkgPT0gJ3N0cmluZycgdGhlbgorICAgICAgcmV0dXJuIG9iai5fX3R5cGUKKyAgZW5kCisgIHJldHVybiB0eXBlKG9iaikKK2VuZAorCitmdW5jdGlvbiB0ZXJyb3IoZSkKKyAgaWYgZSBhbmQgZS5fX3Rvc3RyaW5nIHRoZW4KKyAgICBlcnJvcihlOl9fdG9zdHJpbmcoKSkKKyAgICByZXR1cm4KKyAgZW5kCisgIGVycm9yKGUpCitlbmQKKworZnVuY3Rpb24gdHRhYmxlX3NpemUodCkKKyAgbG9jYWwgY291bnQgPSAwCisgIGZvciBrLCB2IGluIHBhaXJzKHQpIGRvCisgICAgY291bnQgPSBjb3VudCArIDEKKyAgZW5kCisgIHJldHVybiBjb3VudAorZW5kCisKK3ZlcnNpb24gPSAnMS4wLjAnCisKK1RUeXBlID0geworICBTVE9QICAgPSAwLAorICBWT0lEICAgPSAxLAorICBCT09MICAgPSAyLAorICBCWVRFICAgPSAzLAorICBJMDggICAgPSAzLAorICBET1VCTEUgPSA0LAorICBJMTYgICAgPSA2LAorICBJMzIgICAgPSA4LAorICBJNjQgICAgPSAxMCwKKyAgU1RSSU5HID0gMTEsCisgIFVURjcgICA9IDExLAorICBTVFJVQ1QgPSAxMiwKKyAgTUFQICAgID0gMTMsCisgIFNFVCAgICA9IDE0LAorICBMSVNUICAgPSAxNSwKKyAgVVRGOCAgID0gMTYsCisgIFVURjE2ICA9IDE3Cit9CisKK1RNZXNzYWdlVHlwZSA9IHsKKyAgQ0FMTCAgPSAxLAorICBSRVBMWSA9IDIsCisgIEVYQ0VQVElPTiA9IDMsCisgIE9ORVdBWSA9IDQKK30KKworLS0gUmVjdXJzaXZlIF9faW5kZXggZnVuY3Rpb24gdG8gYWNoaWV2ZSBpbmhlcml0YW5jZQorZnVuY3Rpb24gX190b2JqX2luZGV4KHNlbGYsIGtleSkKKyAgbG9jYWwgdiA9IHJhd2dldChzZWxmLCBrZXkpCisgIGlmIHYgfj0gbmlsIHRoZW4KKyAgICByZXR1cm4gdgorICBlbmQKKworICBsb2NhbCBwID0gcmF3Z2V0KHNlbGYsICdfX3BhcmVudCcpCisgIGlmIHAgdGhlbgorICAgIHJldHVybiBfX3RvYmpfaW5kZXgocCwga2V5KQorICBlbmQKKworICByZXR1cm4gbmlsCitlbmQKKworLS0gQmFzaWMgVGhyaWZ0LUx1YSBPYmplY3QKK19fVE9iamVjdCA9IHsKKyAgX190eXBlID0gJ19fVE9iamVjdCcsCisgIF9fbXQgPSB7CisgICAgX19pbmRleCA9IF9fdG9ial9pbmRleAorICB9Cit9CitmdW5jdGlvbiBfX1RPYmplY3Q6bmV3KGluaXRfb2JqKQorICBsb2NhbCBvYmogPSB7fQorICBpZiB0dHlwZShvYmopID09ICd0YWJsZScgdGhlbgorICAgIG9iaiA9IGluaXRfb2JqCisgIGVuZAorCisgIC0tIFVzZSB0aGUgX19wYXJlbnQga2V5IGFuZCB0aGUgX19pbmRleCBmdW5jdGlvbiB0byBhY2hpZXZlIGluaGVyaXRhbmNlCisgIG9iai5fX3BhcmVudCA9IHNlbGYKKyAgc2V0bWV0YXRhYmxlKG9iaiwgX19UT2JqZWN0Ll9fbXQpCisgIHJldHVybiBvYmoKK2VuZAorCistLSBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW55IGx1YSB2YXJpYWJsZQorZnVuY3Rpb24gdGhyaWZ0X3ByaW50X3IodCkKKyAgbG9jYWwgcmV0ID0gJycKKyAgbG9jYWwgbHR5cGUgPSB0eXBlKHQpCisgIGlmIChsdHlwZSA9PSAndGFibGUnKSB0aGVuCisgICAgcmV0ID0gcmV0IC4uICd7ICcKKyAgICBmb3Iga2V5LHZhbHVlIGluIHBhaXJzKHQpIGRvCisgICAgICByZXQgPSByZXQgLi4gdG9zdHJpbmcoa2V5KSAuLiAnPScgLi4gdGhyaWZ0X3ByaW50X3IodmFsdWUpIC4uICcgJworICAgIGVuZAorICAgIHJldCA9IHJldCAuLiAnfScKKyAgZWxzZWlmIGx0eXBlID09ICdzdHJpbmcnIHRoZW4KKyAgICByZXQgPSByZXQgLi4gIiciIC4uIHRvc3RyaW5nKHQpIC4uICInIgorICBlbHNlCisgICAgcmV0ID0gcmV0IC4uIHRvc3RyaW5nKHQpCisgIGVuZAorICByZXR1cm4gcmV0CitlbmQKKworLS0gQmFzaWMgRXhjZXB0aW9uCitURXhjZXB0aW9uID0gX19UT2JqZWN0Om5ld3sKKyAgbWVzc2FnZSwKKyAgZXJyb3JDb2RlLAorICBfX3R5cGUgPSAnVEV4Y2VwdGlvbicKK30KK2Z1bmN0aW9uIFRFeGNlcHRpb246X190b3N0cmluZygpCisgIGlmIHNlbGYubWVzc2FnZSB0aGVuCisgICAgcmV0dXJuIHN0cmluZy5mb3JtYXQoJyVzOiAlcycsIHNlbGYuX190eXBlLCBzZWxmLm1lc3NhZ2UpCisgIGVsc2UKKyAgICBsb2NhbCBtZXNzYWdlCisgICAgaWYgc2VsZi5lcnJvckNvZGUgYW5kIHNlbGYuX19lcnJvckNvZGVUb1N0cmluZyB0aGVuCisgICAgICBtZXNzYWdlID0gc3RyaW5nLmZvcm1hdCgnJWQ6ICVzJywgc2VsZi5lcnJvckNvZGUsIHNlbGY6X19lcnJvckNvZGVUb1N0cmluZygpKQorICAgIGVsc2UKKyAgICAgIG1lc3NhZ2UgPSB0aHJpZnRfcHJpbnRfcihzZWxmKQorICAgIGVuZAorICAgIHJldHVybiBzdHJpbmcuZm9ybWF0KCclczolcycsIHNlbGYuX190eXBlLCBtZXNzYWdlKQorICBlbmQKK2VuZAorCitUQXBwbGljYXRpb25FeGNlcHRpb24gPSBURXhjZXB0aW9uOm5ld3sKKyAgVU5LTk9XTiAgICAgICAgICAgICAgICAgPSAwLAorICBVTktOT1dOX01FVEhPRCAgICAgICAgICA9IDEsCisgIElOVkFMSURfTUVTU0FHRV9UWVBFICAgID0gMiwKKyAgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgPSAzLAorICBCQURfU0VRVUVOQ0VfSUQgICAgICAgICA9IDQsCisgIE1JU1NJTkdfUkVTVUxUICAgICAgICAgID0gNSwKKyAgSU5URVJOQUxfRVJST1IgICAgICAgICAgPSA2LAorICBQUk9UT0NPTF9FUlJPUiAgICAgICAgICA9IDcsCisgIElOVkFMSURfVFJBTlNGT1JNICAgICAgID0gOCwKKyAgSU5WQUxJRF9QUk9UT0NPTCAgICAgICAgPSA5LAorICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwLAorICBlcnJvckNvZGUgICAgICAgICAgICAgICA9IDAsCisgIF9fdHlwZSA9ICdUQXBwbGljYXRpb25FeGNlcHRpb24nCit9CisKK2Z1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpfX2Vycm9yQ29kZVRvU3RyaW5nKCkKKyAgaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5VTktOT1dOX01FVEhPRCB0aGVuCisgICAgcmV0dXJuICdVbmtub3duIG1ldGhvZCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9NRVNTQUdFX1RZUEUgdGhlbgorICAgIHJldHVybiAnSW52YWxpZCBtZXNzYWdlIHR5cGUnCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLldST05HX01FVEhPRF9OQU1FIHRoZW4KKyAgICByZXR1cm4gJ1dyb25nIG1ldGhvZCBuYW1lJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5CQURfU0VRVUVOQ0VfSUQgdGhlbgorICAgIHJldHVybiAnQmFkIHNlcXVlbmNlIElEJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5NSVNTSU5HX1JFU1VMVCB0aGVuCisgICAgcmV0dXJuICdNaXNzaW5nIHJlc3VsdCcKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5URVJOQUxfRVJST1IgdGhlbgorICAgIHJldHVybiAnSW50ZXJuYWwgZXJyb3InCisgIGVsc2VpZiBzZWxmLmVycm9yQ29kZSA9PSBzZWxmLlBST1RPQ09MX0VSUk9SIHRoZW4KKyAgICByZXR1cm4gJ1Byb3RvY29sIGVycm9yJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5JTlZBTElEX1RSQU5TRk9STSB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIHRyYW5zZm9ybScKKyAgZWxzZWlmIHNlbGYuZXJyb3JDb2RlID09IHNlbGYuSU5WQUxJRF9QUk9UT0NPTCB0aGVuCisgICAgcmV0dXJuICdJbnZhbGlkIHByb3RvY29sJworICBlbHNlaWYgc2VsZi5lcnJvckNvZGUgPT0gc2VsZi5VTlNVUFBPUlRFRF9DTElFTlRfVFlQRSB0aGVuCisgICAgcmV0dXJuICdVbnN1cHBvcnRlZCBjbGllbnQgdHlwZScKKyAgZWxzZQorICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93biknCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRFeGNlcHRpb246cmVhZChpcHJvdCkKKyAgaXByb3Q6cmVhZFN0cnVjdEJlZ2luKCkKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIGZuYW1lLCBmdHlwZSwgZmlkID0gaXByb3Q6cmVhZEZpZWxkQmVnaW4oKQorICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1AgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbHNlaWYgZmlkID09IDEgdGhlbgorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HIHRoZW4KKyAgICAgICAgc2VsZi5tZXNzYWdlID0gaXByb3Q6cmVhZFN0cmluZygpCisgICAgICBlbHNlCisgICAgICAgIGlwcm90OnNraXAoZnR5cGUpCisgICAgICBlbmQKKyAgICBlbHNlaWYgZmlkID09IDIgdGhlbgorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyIHRoZW4KKyAgICAgICAgc2VsZi5lcnJvckNvZGUgPSBpcHJvdDpyZWFkSTMyKCkKKyAgICAgIGVsc2UKKyAgICAgICAgaXByb3Q6c2tpcChmdHlwZSkKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIGlwcm90OnNraXAoZnR5cGUpCisgICAgZW5kCisgICAgaXByb3Q6cmVhZEZpZWxkRW5kKCkKKyAgZW5kCisgIGlwcm90OnJlYWRTdHJ1Y3RFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRFeGNlcHRpb246d3JpdGUob3Byb3QpCisgIG9wcm90OndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCisgIGlmIHNlbGYubWVzc2FnZSB0aGVuCisgICAgb3Byb3Q6d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVFR5cGUuU1RSSU5HLCAxKQorICAgIG9wcm90OndyaXRlU3RyaW5nKHNlbGYubWVzc2FnZSkKKyAgICBvcHJvdDp3cml0ZUZpZWxkRW5kKCkKKyAgZW5kCisgIGlmIHNlbGYuZXJyb3JDb2RlIHRoZW4KKyAgICBvcHJvdDp3cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZS5JMzIsIDIpCisgICAgb3Byb3Q6d3JpdGVJMzIoc2VsZi5lcnJvckNvZGUpCisgICAgb3Byb3Q6d3JpdGVGaWVsZEVuZCgpCisgIGVuZAorICBvcHJvdDp3cml0ZUZpZWxkU3RvcCgpCisgIG9wcm90OndyaXRlU3RydWN0RW5kKCkKK2VuZAorCistLSBCYXNpYyBDbGllbnQgKHVzZWQgaW4gZ2VuZXJhdGVkIGx1YSBjb2RlKQorX19UQ2xpZW50ID0gX19UT2JqZWN0Om5ld3sKKyAgX190eXBlID0gJ19fVENsaWVudCcsCisgIF9zZXFpZCA9IDAKK30KK2Z1bmN0aW9uIF9fVENsaWVudDpuZXcob2JqKQorICBpZiB0dHlwZShvYmopIH49ICd0YWJsZScgdGhlbgorICAgIGVycm9yKCdUQ2xpZW50IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHRhYmxlJykKKyAgZW5kCisKKyAgLS0gU2V0IGlwcm90ICYgb3Byb3QKKyAgaWYgb2JqLnByb3RvY29sIHRoZW4KKyAgICBvYmouaXByb3QgPSBvYmoucHJvdG9jb2wKKyAgICBvYmoub3Byb3QgPSBvYmoucHJvdG9jb2wKKyAgICBvYmoucHJvdG9jb2wgPSBuaWwKKyAgZWxzZWlmIG5vdCBvYmouaXByb3QgdGhlbgorICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGFuIGlwcm90JykKKyAgZW5kCisgIGlmIG5vdCBvYmoub3Byb3QgdGhlbgorICAgIG9iai5vcHJvdCA9IG9iai5pcHJvdAorICBlbmQKKworICByZXR1cm4gX19UT2JqZWN0Lm5ldyhzZWxmLCBvYmopCitlbmQKKworZnVuY3Rpb24gX19UQ2xpZW50OmNsb3NlKCkKKyAgc2VsZi5pcHJvdC50cmFuczpjbG9zZSgpCisgIHNlbGYub3Byb3QudHJhbnM6Y2xvc2UoKQorZW5kCisKKy0tIEJhc2ljIFByb2Nlc3NvciAodXNlZCBpbiBnZW5lcmF0ZWQgbHVhIGNvZGUpCitfX1RQcm9jZXNzb3IgPSBfX1RPYmplY3Q6bmV3eworICBfX3R5cGUgPSAnX19UUHJvY2Vzc29yJworfQorZnVuY3Rpb24gX19UUHJvY2Vzc29yOm5ldyhvYmopCisgIGlmIHR0eXBlKG9iaikgfj0gJ3RhYmxlJyB0aGVuCisgICAgZXJyb3IoJ1RQcm9jZXNzb3IgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBFbnN1cmUgYSBoYW5kbGVyIGlzIHByb3ZpZGVkCisgIGlmIG5vdCBvYmouaGFuZGxlciB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYSBoYW5kbGVyJykKKyAgZW5kCisKKyAgcmV0dXJuIF9fVE9iamVjdC5uZXcoc2VsZiwgb2JqKQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvbHVhL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2xvbmdudW1iZXJ1dGlscy5jIGIvbGliL2x1YS9zcmMvbG9uZ251bWJlcnV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjNjc4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvc3JjL2xvbmdudW1iZXJ1dGlscy5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSA8bHVhLmg+CisjaW5jbHVkZSA8bGF1eGxpYi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK2NvbnN0IGNoYXIgKiBMT05HX05VTV9UWVBFID0gIl9fdGhyaWZ0X2xvbmdudW1iZXIiOworaW50NjRfdCBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhsdWFfU3RhdGUgKkwsIGludCBpbmRleCkgeworICBzd2l0Y2ggKGx1YV90eXBlKEwsIGluZGV4KSkgeworICAgIGNhc2UgTFVBX1ROVU1CRVI6CisgICAgICByZXR1cm4gKGludDY0X3QpbHVhX3RvbnVtYmVyKEwsIGluZGV4KTsKKyAgICBjYXNlIExVQV9UU1RSSU5HOgorICAgICAgcmV0dXJuIGF0b2xsKGx1YV90b3N0cmluZyhMLCBpbmRleCkpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKigoaW50NjRfdCAqKWx1YUxfY2hlY2t1ZGF0YShMLCBpbmRleCwgTE9OR19OVU1fVFlQRSkpOworICB9Cit9CisKKy8vIENyZWF0ZXMgYSBuZXcgbG9uZ251bWJlciBhbmQgcHVzaGVzIGl0IG9udG8gdGhlIHN0YXRjaworaW50NjRfdCAqIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcobHVhX1N0YXRlICpMLCBpbnQ2NF90ICp2YWwpIHsKKyAgaW50NjRfdCAqZGF0YSA9IChpbnQ2NF90ICopbHVhX25ld3VzZXJkYXRhKEwsIHNpemVvZihpbnQ2NF90KSk7IC8vIGxvbmdudW0KKyAgbHVhTF9nZXRtZXRhdGFibGUoTCwgTE9OR19OVU1fVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvbmdudW0sIG10CisgIGx1YV9zZXRtZXRhdGFibGUoTCwgLTIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb25nbnVtCisgIGlmICh2YWwpIHsKKyAgICAqZGF0YSA9ICp2YWw7CisgIH0KKyAgcmV0dXJuIGRhdGE7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YWJpdHdpc2UuYyBiL2xpYi9sdWEvc3JjL2x1YWJpdHdpc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA3ZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvbHVhYml0d2lzZS5jCkBAIC0wLDAgKzEsODMgQEAKKy8vCisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSA8bHVhLmg+CisjaW5jbHVkZSA8bGF1eGxpYi5oPgorCitzdGF0aWMgaW50IGxfbm90KGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYSA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBhID0gfmE7CisgIGx1YV9wdXNobnVtYmVyKEwsIGEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBsX3hvcihsdWFfU3RhdGUgKkwpIHsKKyAgaW50IGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50IGIgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgYSBePSBiOworICBsdWFfcHVzaG51bWJlcihMLCBhKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9hbmQobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludCBiID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGEgJj0gYjsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxfb3IobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludCBiID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGEgfD0gYjsKKyAgbHVhX3B1c2hudW1iZXIoTCwgYSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxfc2hpZnRyKGx1YV9TdGF0ZSAqTCkgeworICBpbnQgYSA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQgYiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDIpOworICBhID0gYSA+PiBiOworICBsdWFfcHVzaG51bWJlcihMLCBhKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbF9zaGlmdGwobHVhX1N0YXRlICpMKSB7CisgIGludCBhID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludCBiID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGEgPSBhIDw8IGI7CisgIGx1YV9wdXNobnVtYmVyKEwsIGEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyBmdW5jc1tdID0geworICB7ImJhbmQiLCBsX2FuZH0sCisgIHsiYm9yIiwgbF9vcn0sCisgIHsiYnhvciIsIGxfeG9yfSwKKyAgeyJibm90IiwgbF9ub3R9LAorICB7InNoaWZ0bCIsIGxfc2hpZnRsfSwKKyAgeyJzaGlmdHIiLCBsX3NoaWZ0cn0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworaW50IGx1YW9wZW5fbGlibHVhYml0d2lzZShsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9yZWdpc3RlcihMLCAibGlibHVhYml0d2lzZSIsIGZ1bmNzKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvbHVhL3NyYy9sdWFicGFjay5jIGIvbGliL2x1YS9zcmMvbHVhYnBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzdiNmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvbHVhYnBhY2suYwpAQCAtMCwwICsxLDMwOCBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxsYXV4bGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKK2V4dGVybiBpbnQ2NF90IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4KTsKK2V4dGVybiBpbnQ2NF90IGx1YWxvbmdudW1iZXJfcHVzaGxvbmcobHVhX1N0YXRlICpMLCBpbnQ2NF90ICp2YWwpOworCisvLyBob3N0IG9yZGVyIHRvIG5ldHdvcmsgb3JkZXIgKDY0LWJpdCkKK3N0YXRpYyBpbnQ2NF90IFRfaHRvbmxsKHVpbnQ2NF90IGRhdGEpIHsKKyAgdWludDMyX3QgZDEgPSBodG9ubCgodWludDMyX3QpZGF0YSk7CisgIHVpbnQzMl90IGQyID0gaHRvbmwoKHVpbnQzMl90KShkYXRhID4+IDMyKSk7CisgIHJldHVybiAoKHVpbnQ2NF90KWQxIDw8IDMyKSArICh1aW50NjRfdClkMjsKK30KKworLy8gbmV0d29yayBvcmRlciB0byBob3N0IG9yZGVyICg2NC1iaXQpCitzdGF0aWMgaW50NjRfdCBUX250b2hsbCh1aW50NjRfdCBkYXRhKSB7CisgIHVpbnQzMl90IGQxID0gbnRvaGwoKHVpbnQzMl90KWRhdGEpOworICB1aW50MzJfdCBkMiA9IG50b2hsKCh1aW50MzJfdCkoZGF0YSA+PiAzMikpOworICByZXR1cm4gKCh1aW50NjRfdClkMSA8PCAzMikgKyAodWludDY0X3QpZDI7Cit9CisKKy8qKgorICogYnBhY2sodHlwZSwgZGF0YSkKKyAqICBjIC0gU2lnbmVkIEJ5dGUKKyAqICBzIC0gU2lnbmVkIFNob3J0CisgKiAgaSAtIFNpZ25lZCBJbnQKKyAqICBsIC0gU2lnbmVkIExvbmcKKyAqICBkIC0gRG91YmxlCisgKi8KK3N0YXRpYyBpbnQgbF9icGFjayhsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqY29kZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGx1YUxfYXJnY2hlY2soTCwgY29kZVsxXSA9PSAnXDAnLCAwLCAiRm9ybWF0IGNvZGUgbXVzdCBiZSBvbmUgY2hhcmFjdGVyLiIpOworICBsdWFMX0J1ZmZlciBidWY7CisgIGx1YUxfYnVmZmluaXQoTCwgJmJ1Zik7CisKKyAgc3dpdGNoIChjb2RlWzBdKSB7CisgICAgY2FzZSAnYyc6IHsKKyAgICAgIGludDhfdCBkYXRhID0gbHVhTF9jaGVja251bWJlcihMLCAyKTsKKyAgICAgIGx1YUxfYWRkbHN0cmluZygmYnVmLCAodm9pZCopJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAncyc6IHsKKyAgICAgIGludDE2X3QgZGF0YSA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgICAgICBkYXRhID0gKGludDE2X3QpaHRvbnMoZGF0YSk7CisgICAgICBsdWFMX2FkZGxzdHJpbmcoJmJ1ZiwgKHZvaWQqKSZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ2knOiB7CisgICAgICBpbnQzMl90IGRhdGEgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAyKTsKKyAgICAgIGRhdGEgPSAoaW50MzJfdClodG9ubChkYXRhKTsKKyAgICAgIGx1YUxfYWRkbHN0cmluZygmYnVmLCAodm9pZCopJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnbCc6IHsKKyAgICAgIGludDY0X3QgZGF0YSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICAgICAgZGF0YSA9IChpbnQ2NF90KVRfaHRvbmxsKGRhdGEpOworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdkJzogeworICAgICAgZG91YmxlIGRhdGEgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgbHVhTF9hcmdjaGVjayhMLCAwLCAwLCAiSW52YWxpZCBmb3JtYXQgY29kZS4iKTsKKyAgfQorCisgIGx1YUxfcHVzaHJlc3VsdCgmYnVmKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogYnVucGFjayh0eXBlLCBkYXRhKQorICogIGMgLSBTaWduZWQgQnl0ZQorICogIEMgLSBVbnNpZ25lZCBCeXRlCisgKiAgcyAtIFNpZ25lZCBTaG9ydAorICogIGkgLSBTaWduZWQgSW50CisgKiAgbCAtIFNpZ25lZCBMb25nCisgKiAgZCAtIERvdWJsZQorICovCitzdGF0aWMgaW50IGxfYnVucGFjayhsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqY29kZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CisgIGx1YUxfYXJnY2hlY2soTCwgY29kZVsxXSA9PSAnXDAnLCAwLCAiRm9ybWF0IGNvZGUgbXVzdCBiZSBvbmUgY2hhcmFjdGVyLiIpOworICBjb25zdCBjaGFyICpkYXRhID0gbHVhTF9jaGVja3N0cmluZyhMLCAyKTsKKyNpZiBMVUFfVkVSU0lPTl9OVU0gPj0gNTAyCisgIHNpemVfdCBsZW4gPSBsdWFfcmF3bGVuKEwsIDIpOworI2Vsc2UKKyAgc2l6ZV90IGxlbiA9IGx1YV9vYmpsZW4oTCwgMik7CisjZW5kaWYKKworICBzd2l0Y2ggKGNvZGVbMF0pIHsKKyAgICBjYXNlICdjJzogeworICAgICAgaW50OF90IHZhbDsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKKyAgICAgIG1lbWNweSgmdmFsLCBkYXRhLCBzaXplb2YodmFsKSk7CisgICAgICBsdWFfcHVzaG51bWJlcihMLCB2YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qKgorICAgICAqIHVucGFjayB1bnNpZ25lZCBCeXRlLgorICAgICAqLworICAgIGNhc2UgJ0MnOiB7CisgICAgICB1aW50OF90IHZhbDsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKKyAgICAgIG1lbWNweSgmdmFsLCBkYXRhLCBzaXplb2YodmFsKSk7CisgICAgICBsdWFfcHVzaG51bWJlcihMLCB2YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ3MnOiB7CisgICAgICBpbnQxNl90IHZhbDsKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgbGVuID09IHNpemVvZih2YWwpLCAxLCAiSW52YWxpZCBpbnB1dCBzdHJpbmcgc2l6ZS4iKTsKKyAgICAgIG1lbWNweSgmdmFsLCBkYXRhLCBzaXplb2YodmFsKSk7CisgICAgICB2YWwgPSAoaW50MTZfdCludG9ocyh2YWwpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICdpJzogeworICAgICAgaW50MzJfdCB2YWw7CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CisgICAgICBtZW1jcHkoJnZhbCwgZGF0YSwgc2l6ZW9mKHZhbCkpOworICAgICAgdmFsID0gKGludDMyX3QpbnRvaGwodmFsKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAnbCc6IHsKKyAgICAgIGludDY0X3QgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIHZhbCA9IChpbnQ2NF90KVRfbnRvaGxsKHZhbCk7CisgICAgICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZ2YWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgJ2QnOiB7CisgICAgICBkb3VibGUgdmFsOworICAgICAgbHVhTF9hcmdjaGVjayhMLCBsZW4gPT0gc2l6ZW9mKHZhbCksIDEsICJJbnZhbGlkIGlucHV0IHN0cmluZyBzaXplLiIpOworICAgICAgbWVtY3B5KCZ2YWwsIGRhdGEsIHNpemVvZih2YWwpKTsKKyAgICAgIGx1YV9wdXNobnVtYmVyKEwsIHZhbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGx1YUxfYXJnY2hlY2soTCwgMCwgMCwgIkludmFsaWQgZm9ybWF0IGNvZGUuIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitzdGF0aWMgaW50IGxfaTY0VG9aaWd6YWcobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgbiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBpbnQ2NF90IHJlc3VsdCA9IChuIDw8IDEpIF4gKG4gPj4gNjMpOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZyZXN1bHQpOworICByZXR1cm4gMTsKK30KKy8qKgorICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF9pMzJUb1ppZ3phZyhsdWFfU3RhdGUgKkwpIHsKKyAgaW50MzJfdCBuID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIHVpbnQzMl90IHJlc3VsdCA9ICh1aW50MzJfdCkobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgbHVhX3B1c2hudW1iZXIoTCwgcmVzdWx0KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICovCitzdGF0aWMgaW50IGxfemlnemFnVG9JMzIobHVhX1N0YXRlICpMKSB7CisgIHVpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgaW50MzJfdCByZXN1bHQgPSAoaW50MzJfdCkobiA+PiAxKSBeICh1aW50MzJfdCkoLShpbnQzMl90KShuICYgMSkpOworICBsdWFfcHVzaG51bWJlcihMLCByZXN1bHQpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAqLworc3RhdGljIGludCBsX3ppZ3phZ1RvSTY0KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IG4gPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgaW50NjRfdCByZXN1bHQgPSAoaW50NjRfdCkobiA+PiAxKSBeICh1aW50NjRfdCkoLShpbnQ2NF90KShuICYgMSkpOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZyZXN1bHQpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGFuIGkzMiB0byBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBsX3RvVmFyaW50MzIobHVhX1N0YXRlICpMKSB7CisgIHVpbnQ4X3QgYnVmWzVdOworICB1aW50MzJfdCBuID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICB3aGlsZSAoMSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKyAgbHVhX3B1c2hsc3RyaW5nKEwsIGJ1Ziwgd3NpemUpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGFuIGk2NCB0byBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgbF90b1ZhcmludDY0KGx1YV9TdGF0ZSAqTCkgeworICB1aW50OF90IGRhdGFbMTBdOworICB1aW50NjRfdCBuID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIHVpbnQzMl90IHdzaXplID0gMDsKKyAgbHVhTF9CdWZmZXIgYnVmOworICBsdWFMX2J1ZmZpbml0KEwsICZidWYpOworCisgIHdoaWxlICgxKSB7CisgICAgaWYgKChuICYgfjB4N0ZMKSA9PSAwKSB7CisgICAgICBkYXRhW3dzaXplKytdID0gKGludDhfdCluOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGFbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorCisgIGx1YUxfYWRkbHN0cmluZygmYnVmLCAodm9pZCopJmRhdGEsIHdzaXplKTsKKyAgbHVhTF9wdXNocmVzdWx0KCZidWYpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGEgdmFyaW50IHRvIGk2NC4KKyAqLworc3RhdGljIGludCBsX2Zyb21WYXJpbnQ2NChsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCByZXN1bHQ7CisgIHVpbnQ4X3QgYnl0ZSA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMSk7CisgIGludDMyX3Qgc2hpZnQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDIpOworICB1aW50NjRfdCBuID0gKHVpbnQ2NF90KWx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDMpOworICBuIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworCisgIGlmICghKGJ5dGUgJiAweDgwKSkgeworICAgIHJlc3VsdCA9IChpbnQ2NF90KShuID4+IDEpIF4gKHVpbnQ2NF90KSgtKGludDY0X3QpKG4gJiAxKSk7CisgICAgbHVhX3B1c2hudW1iZXIoTCwgMCk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gbjsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAxKTsKKyAgfQorICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZyZXN1bHQpOworICByZXR1cm4gMjsKK30KKworLyoqCisgKiBUbyBwYWNrIG1lc3NhZ2UgdHlwZSBvZiBjb21wYWN0IHByb3RvY29sLgorICovCitzdGF0aWMgaW50IGxfcGFja01lc2dUeXBlKGx1YV9TdGF0ZSAqTCkgeworICBpbnQzMl90IHZlcnNpb25fbiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQzMl90IHZlcnNpb25fbWFzayA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDIpOworICBpbnQzMl90IG1lc3NhZ2V0eXBlID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMyk7CisgIGludDMyX3QgdHlwZV9zaGlmdF9hbW91bnQgPSBsdWFMX2NoZWNraW50ZWdlcihMLCA0KTsKKyAgaW50MzJfdCB0eXBlX21hc2sgPSBsdWFMX2NoZWNraW50ZWdlcihMLCA1KTsKKyAgaW50MzJfdCB0b19tZXNnX3R5cGUgPSAodmVyc2lvbl9uICYgdmVyc2lvbl9tYXNrKSB8CisgICAgKCgoaW50MzJfdCltZXNzYWdldHlwZSA8PCB0eXBlX3NoaWZ0X2Ftb3VudCkgJiB0eXBlX21hc2spOworICBsdWFfcHVzaG51bWJlcihMLCB0b19tZXNnX3R5cGUpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyBsdWFfYnBhY2tbXSA9IHsKKyAgeyJicGFjayIsIGxfYnBhY2t9LAorICB7ImJ1bnBhY2siLCBsX2J1bnBhY2t9LAorICB7ImkzMlRvWmlnemFnIiwgbF9pMzJUb1ppZ3phZ30sCisgIHsiaTY0VG9aaWd6YWciLCBsX2k2NFRvWmlnemFnfSwKKyAgeyJ6aWd6YWdUb0kzMiIsIGxfemlnemFnVG9JMzJ9LAorICB7InppZ3phZ1RvSTY0IiwgbF96aWd6YWdUb0k2NH0sCisgIHsidG9WYXJpbnQzMiIsIGxfdG9WYXJpbnQzMn0sCisgIHsidG9WYXJpbnQ2NCIsIGxfdG9WYXJpbnQ2NH0sCisgIHsiZnJvbVZhcmludDY0IiwgbF9mcm9tVmFyaW50NjR9LAorICB7InBhY2tNZXNnVHlwZSIsIGxfcGFja01lc2dUeXBlfSwKKyAge05VTEwsIE5VTEx9Cit9OworCitpbnQgbHVhb3Blbl9saWJsdWFicGFjayhsdWFfU3RhdGUgKkwpIHsKKyAgbHVhTF9yZWdpc3RlcihMLCAibGlibHVhYnBhY2siLCBsdWFfYnBhY2spOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YWxvbmdudW1iZXIuYyBiL2xpYi9sdWEvc3JjL2x1YWxvbmdudW1iZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDAxZTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9zcmMvbHVhbG9uZ251bWJlci5jCkBAIC0wLDAgKzEsMjI4IEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgPGx1YS5oPgorI2luY2x1ZGUgPGxhdXhsaWIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIGNvbnN0IGNoYXIgKiBMT05HX05VTV9UWVBFOworZXh0ZXJuIGludDY0X3QgbHVhbG9uZ251bWJlcl9jaGVja2xvbmcobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgpOworZXh0ZXJuIGludDY0X3QgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhsdWFfU3RhdGUgKkwsIGludDY0X3QgKnZhbCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIGxfc2VyaWFsaXplKGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50NjRfdCB2YWwpIHsKKyAgc25wcmludGYoYnVmLCBsZW4sICIlIlBSSWQ2NCwgdmFsKTsKK30KKworc3RhdGljIGludDY0X3QgbF9kZXNlcmlhbGl6ZShjb25zdCBjaGFyICpidWYpIHsKKyAgaW50NjRfdCBkYXRhOworICBpbnQgcnY7CisgIC8vIFN1cHBvcnQgaGV4IHByZWZpeGVkIHdpdGggJzB4JworICBpZiAoc3Ryc3RyKGJ1ZiwgIjB4IikgPT0gYnVmKSB7CisgICAgcnYgPSBzc2NhbmYoYnVmLCAiJSJQUkl4NjQsICZkYXRhKTsKKyAgfSBlbHNlIHsKKyAgICBydiA9IHNzY2FuZihidWYsICIlIlBSSWQ2NCwgJmRhdGEpOworICB9CisgIGlmIChydiA9PSAxKSB7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKyAgcmV0dXJuIDA7IC8vIEZhaWxlZAorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgaW50IGxfbmV3KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IHZhbDsKKyAgY29uc3QgY2hhciAqc3RyID0gTlVMTDsKKyAgaWYgKGx1YV90eXBlKEwsIDEpID09IExVQV9UU1RSSU5HKSB7CisgICAgc3RyID0gbHVhX3Rvc3RyaW5nKEwsIDEpOworICAgIHZhbCA9IGxfZGVzZXJpYWxpemUoc3RyKTsKKyAgfSBlbHNlIGlmIChsdWFfdHlwZShMLCAxKSA9PSBMVUFfVE5VTUJFUikgeworICAgIHZhbCA9IChpbnQ2NF90KWx1YV90b251bWJlcihMLCAxKTsKKyAgICBzdHIgPSAoY29uc3QgY2hhciAqKTE7CisgIH0KKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAoc3RyID8gJnZhbCA6IE5VTEwpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIGEgKyBiCitzdGF0aWMgaW50IGxfYWRkKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGIsIGM7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gYSArIGI7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8gYSAvIGIKK3N0YXRpYyBpbnQgbF9kaXYobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYiwgYzsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBiID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMik7CisgIGMgPSBhIC8gYjsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLyBhID09IGIgKGJvdGggYSBhbmQgYiBhcmUgbHVhbG9uZ251bWJlcidzKQorc3RhdGljIGludCBsX2VxKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGI7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBsdWFfcHVzaGJvb2xlYW4oTCwgKGEgPT0gYiA/IDEgOiAwKSk7CisgIHJldHVybiAxOworfQorCisvLyBnYXJiYWdlIGNvbGxlY3Rpb24KK3N0YXRpYyBpbnQgbF9nYyhsdWFfU3RhdGUgKkwpIHsKKyAgbHVhX3B1c2huaWwoTCk7CisgIGx1YV9zZXRtZXRhdGFibGUoTCwgMSk7CisgIHJldHVybiAwOworfQorCisvLyBhIDwgYgorc3RhdGljIGludCBsX2x0KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGI7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBsdWFfcHVzaGJvb2xlYW4oTCwgKGEgPCBiID8gMSA6IDApKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgPD0gYgorc3RhdGljIGludCBsX2xlKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGI7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBsdWFfcHVzaGJvb2xlYW4oTCwgKGEgPD0gYiA/IDEgOiAwKSk7CisgIHJldHVybiAxOworfQorCisvLyBhICUgYgorc3RhdGljIGludCBsX21vZChsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhLCBiLCBjOworICBhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGIgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAyKTsKKyAgYyA9IGEgJSBiOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZjKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGEgKiBiCitzdGF0aWMgaW50IGxfbXVsKGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IGEsIGIsIGM7CisgIGEgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDIpOworICBjID0gYSAqIGI7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8gYSBeIGIKK3N0YXRpYyBpbnQgbF9wb3cobHVhX1N0YXRlICpMKSB7CisgIGxvbmcgZG91YmxlIGEsIGI7CisgIGludDY0X3QgYzsKKyAgYSA9IChsb25nIGRvdWJsZSlsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgYiA9IChsb25nIGRvdWJsZSlsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAyKTsKKyAgYyA9IChpbnQ2NF90KXBvdyhhLCBiKTsKKyAgbHVhbG9uZ251bWJlcl9wdXNobG9uZyhMLCAmYyk7CisgIHJldHVybiAxOworfQorCisvLyBhIC0gYgorc3RhdGljIGludCBsX3N1YihsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhLCBiLCBjOworICBhID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGIgPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAyKTsKKyAgYyA9IGEgLSBiOworICBsdWFsb25nbnVtYmVyX3B1c2hsb25nKEwsICZjKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIHRvc3RyaW5nKCkKK3N0YXRpYyBpbnQgbF90b3N0cmluZyhsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBhOworICBjaGFyIHN0clsyNTZdOworICBsX3NlcmlhbGl6ZShzdHIsIDI1NiwgbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSkpOworICBsdWFfcHVzaHN0cmluZyhMLCBzdHIpOworICByZXR1cm4gMTsKK30KKworLy8gLWEKK3N0YXRpYyBpbnQgbF91bm0obHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgYSwgYzsKKyAgYSA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBjID0gLWE7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJmMpOworICByZXR1cm4gMTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IGx1YUxfUmVnIG1ldGhvZHNbXSA9IHsKKyAgeyJfX2FkZCIsIGxfYWRkfSwKKyAgeyJfX2RpdiIsIGxfZGl2fSwKKyAgeyJfX2VxIiwgbF9lcX0sCisgIHsiX19nYyIsIGxfZ2N9LAorICB7Il9fbHQiLCBsX2x0fSwKKyAgeyJfX2xlIiwgbF9sZX0sCisgIHsiX19tb2QiLCBsX21vZH0sCisgIHsiX19tdWwiLCBsX211bH0sCisgIHsiX19wb3ciLCBsX3Bvd30sCisgIHsiX19zdWIiLCBsX3N1Yn0sCisgIHsiX190b3N0cmluZyIsIGxfdG9zdHJpbmd9LAorICB7Il9fdW5tIiwgbF91bm19LAorICB7TlVMTCwgTlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgbHVhTF9SZWcgZnVuY3NbXSA9IHsKKyAgeyJuZXciLCBsX25ld30sCisgIHtOVUxMLCBOVUxMfQorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgc2V0X21ldGhvZHMobHVhX1N0YXRlICpMLAorICBjb25zdCBjaGFyICptZXRhdGFibGVuYW1lLAorICBjb25zdCBzdHJ1Y3QgbHVhTF9SZWcgKm1ldGhvZHMpIHsKKyAgbHVhTF9nZXRtZXRhdGFibGUoTCwgbWV0YXRhYmxlbmFtZSk7ICAgLy8gbXQKKyAgLy8gTm8gbmVlZCBmb3IgYSBfX2luZGV4IHRhYmxlIHNpbmNlIGV2ZXJ5dGhpbmcgaXMgX18qCisgIGZvciAoOyBtZXRob2RzLT5uYW1lOyBtZXRob2RzKyspIHsKKyAgICBsdWFfcHVzaHN0cmluZyhMLCBtZXRob2RzLT5uYW1lKTsgICAgLy8gbXQsICJuYW1lIgorICAgIGx1YV9wdXNoY2Z1bmN0aW9uKEwsIG1ldGhvZHMtPmZ1bmMpOyAvLyBtdCwgIm5hbWUiLCBmdW5jCisgICAgbHVhX3Jhd3NldChMLCAtMyk7ICAgICAgICAgICAgICAgICAgIC8vIG10CisgIH0KKyAgbHVhX3BvcChMLCAxKTsKK30KKworTFVBTElCX0FQSSBpbnQgbHVhb3Blbl9saWJsdWFsb25nbnVtYmVyKGx1YV9TdGF0ZSAqTCkgeworICBsdWFMX25ld21ldGF0YWJsZShMLCBMT05HX05VTV9UWVBFKTsKKyAgbHVhX3BvcChMLCAxKTsKKyAgc2V0X21ldGhvZHMoTCwgTE9OR19OVU1fVFlQRSwgbWV0aG9kcyk7CisKKyAgbHVhTF9yZWdpc3RlcihMLCAibGlibHVhbG9uZ251bWJlciIsIGZ1bmNzKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvbHVhL3NyYy9sdWFzb2NrZXQuYyBiL2xpYi9sdWEvc3JjL2x1YXNvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODM1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9sdWFzb2NrZXQuYwpAQCAtMCwwICsxLDM4MCBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxsdWEuaD4KKyNpbmNsdWRlIDxsYXV4bGliLmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzb2NrZXQuaCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IGNoYXIgKlNPQ0tFVF9BTlkgICAgID0gIl9fdGhyaWZ0X3NvY2tldF9hbnkiOworc3RhdGljIGNvbnN0IGNoYXIgKlNPQ0tFVF9DT05OICAgID0gIl9fdGhyaWZ0X3NvY2tldF9jb25uZWN0ZWQiOworCitzdGF0aWMgY29uc3QgY2hhciAqU09DS0VUX0dFTkVSSUMgPSAiX190aHJpZnRfc29ja2V0X2dlbmVyaWMiOworc3RhdGljIGNvbnN0IGNoYXIgKlNPQ0tFVF9DTElFTlQgID0gIl9fdGhyaWZ0X3NvY2tldF9jbGllbnQiOworc3RhdGljIGNvbnN0IGNoYXIgKlNPQ0tFVF9TRVJWRVIgID0gIl9fdGhyaWZ0X3NvY2tldF9zZXJ2ZXIiOworCitzdGF0aWMgY29uc3QgY2hhciAqREVGQVVMVF9IT1NUICAgPSAibG9jYWxob3N0IjsKKwordHlwZWRlZiBzdHJ1Y3QgX190X3RjcCB7CisgIHRfc29ja2V0IHNvY2s7CisgIGludCB0aW1lb3V0OyAvLyBNaWxsaXNlY29uZHMKK30gdF90Y3A7Cit0eXBlZGVmIHRfdGNwICpwX3RjcDsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFV0aWwKKworc3RhdGljIHZvaWQgdGhyb3dfYXJnZXJyb3IobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmV4cGVjdGVkKSB7CisgIGNoYXIgbXNnWzI1Nl07CisgIHNwcmludGYobXNnLCAiJXMgZXhwZWN0ZWQsIGdvdCAlcyIsIGV4cGVjdGVkLCBsdWFMX3R5cGVuYW1lKEwsIGluZGV4KSk7CisgIGx1YUxfYXJnZXJyb3IoTCwgaW5kZXgsIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkICpjaGVja2dyb3VwKGx1YV9TdGF0ZSAqTCwgaW50IGluZGV4LCBjb25zdCBjaGFyICpncm91cG5hbWUpIHsKKyAgaWYgKCFsdWFfZ2V0bWV0YXRhYmxlKEwsIGluZGV4KSkgeworICAgIHRocm93X2FyZ2Vycm9yKEwsIGluZGV4LCBncm91cG5hbWUpOworICB9CisKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZ3JvdXBuYW1lKTsKKyAgbHVhX3Jhd2dldChMLCAtMik7CisgIGlmIChsdWFfaXNuaWwoTCwgLTEpKSB7CisgICAgbHVhX3BvcChMLCAyKTsKKyAgICB0aHJvd19hcmdlcnJvcihMLCBpbmRleCwgZ3JvdXBuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBsdWFfcG9wKEwsIDIpOworICAgIHJldHVybiBsdWFfdG91c2VyZGF0YShMLCBpbmRleCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7IC8vIE5vdCByZWFjaGFibGUKK30KKworc3RhdGljIHZvaWQgKmNoZWNrdHlwZShsdWFfU3RhdGUgKkwsIGludCBpbmRleCwgY29uc3QgY2hhciAqdHlwZW5hbWUpIHsKKyAgaWYgKHN0cmNtcCh0eXBlbmFtZSwgU09DS0VUX0FOWSkgPT0gMCB8fAorICAgICAgc3RyY21wKHR5cGVuYW1lLCBTT0NLRVRfQ09OTikgPT0gMCkgeworICAgIHJldHVybiBjaGVja2dyb3VwKEwsIGluZGV4LCB0eXBlbmFtZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGx1YUxfY2hlY2t1ZGF0YShMLCBpbmRleCwgdHlwZW5hbWUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNldHR5cGUobHVhX1N0YXRlICpMLCBpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKnR5cGVuYW1lKSB7CisgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIHR5cGVuYW1lKTsKKyAgbHVhX3NldG1ldGF0YWJsZShMLCBpbmRleCk7Cit9CisKKyNkZWZpbmUgTFVBX1NVQ0NFU1NfUkVUVVJOKEwpIFwKKyAgbHVhX3B1c2hudW1iZXIoTCwgMSk7IFwKKyAgcmV0dXJuIDEKKworI2RlZmluZSBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycikgXAorICBpZiAoZXJyKSB7IFwKKyAgICBsdWFfcHVzaG5pbChMKTsgXAorICAgIGx1YV9wdXNoc3RyaW5nKEwsIGVycik7IFwKKyAgICByZXR1cm4gMjsgXAorICB9IFwKKyAgTFVBX1NVQ0NFU1NfUkVUVVJOKEwpCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgbF9zb2NrZXRfY3JlYXRlKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X2Rlc3Ryb3kobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbF9zb2NrZXRfc2V0dGltZW91dChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9nZXRzb2NraW5mbyhsdWFfU3RhdGUgKkwpOworCitzdGF0aWMgaW50IGxfc29ja2V0X2FjY2VwdChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9saXN0ZW4obHVhX1N0YXRlICpMKTsKKworc3RhdGljIGludCBsX3NvY2tldF9jcmVhdGVfYW5kX2Nvbm5lY3QobHVhX1N0YXRlICpMKTsKK3N0YXRpYyBpbnQgbF9zb2NrZXRfY29ubmVjdChsdWFfU3RhdGUgKkwpOworc3RhdGljIGludCBsX3NvY2tldF9zZW5kKGx1YV9TdGF0ZSAqTCk7CitzdGF0aWMgaW50IGxfc29ja2V0X3JlY2VpdmUobHVhX1N0YXRlICpMKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyBtZXRob2RzX2dlbmVyaWNbXSA9IHsKKyAgeyJkZXN0cm95IiwgICAgIGxfc29ja2V0X2Rlc3Ryb3l9LAorICB7InNldHRpbWVvdXQiLCAgbF9zb2NrZXRfc2V0dGltZW91dH0sCisgIHsiZ2V0c29ja2luZm8iLCBsX3NvY2tldF9nZXRzb2NraW5mb30sCisgIHsibGlzdGVuIiwgICAgICBsX3NvY2tldF9saXN0ZW59LAorICB7ImNvbm5lY3QiLCAgICAgbF9zb2NrZXRfY29ubmVjdH0sCisgIHtOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBsdWFMX1JlZyBtZXRob2RzX3NlcnZlcltdID0geworICB7ImRlc3Ryb3kiLCAgICAgbF9zb2NrZXRfZGVzdHJveX0sCisgIHsiZ2V0c29ja2luZm8iLCBsX3NvY2tldF9nZXRzb2NraW5mb30sCisgIHsiYWNjZXB0IiwgICAgICBsX3NvY2tldF9hY2NlcHR9LAorICB7InNlbmQiLCAgICAgICAgbF9zb2NrZXRfc2VuZH0sCisgIHsicmVjZWl2ZSIsICAgICBsX3NvY2tldF9yZWNlaXZlfSwKKyAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIG1ldGhvZHNfY2xpZW50W10gPSB7CisgIHsiZGVzdHJveSIsICAgICBsX3NvY2tldF9kZXN0cm95fSwKKyAgeyJzZXR0aW1lb3V0IiwgIGxfc29ja2V0X3NldHRpbWVvdXR9LAorICB7ImdldHNvY2tpbmZvIiwgbF9zb2NrZXRfZ2V0c29ja2luZm99LAorICB7InNlbmQiLCAgICAgICAgbF9zb2NrZXRfc2VuZH0sCisgIHsicmVjZWl2ZSIsICAgICBsX3NvY2tldF9yZWNlaXZlfSwKKyAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIGZ1bmNzX2x1YXNvY2tldFtdID0geworICB7ImNyZWF0ZSIsICAgICAgICAgICAgIGxfc29ja2V0X2NyZWF0ZX0sCisgIHsiY3JlYXRlX2FuZF9jb25uZWN0IiwgbF9zb2NrZXRfY3JlYXRlX2FuZF9jb25uZWN0fSwKKyAge05VTEwsIE5VTEx9Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBDaGVjay9lbmZvcmNlIGluaGVyaXRhbmNlCitzdGF0aWMgdm9pZCBhZGRfdG9fZ3JvdXAobHVhX1N0YXRlICpMLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWV0YXRhYmxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmdyb3VwbmFtZSkgeworICBsdWFMX2dldG1ldGF0YWJsZShMLCBtZXRhdGFibGVuYW1lKTsgLy8gbXQKKyAgbHVhX3B1c2hzdHJpbmcoTCwgZ3JvdXBuYW1lKTsgICAgICAgIC8vIG10LCAibmFtZSIKKyAgbHVhX3B1c2hib29sZWFuKEwsIDEpOyAgICAgICAgICAgICAgIC8vIG10LCAibmFtZSIsIHRydWUKKyAgbHVhX3Jhd3NldChMLCAtMyk7ICAgICAgICAgICAgICAgICAgIC8vIG10CisgIGx1YV9wb3AoTCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tZXRob2RzKGx1YV9TdGF0ZSAqTCwKKyAgY29uc3QgY2hhciAqbWV0YXRhYmxlbmFtZSwKKyAgY29uc3Qgc3RydWN0IGx1YUxfUmVnICptZXRob2RzKSB7CisgIGx1YUxfZ2V0bWV0YXRhYmxlKEwsIG1ldGF0YWJsZW5hbWUpOyAgIC8vIG10CisgIC8vIENyZWF0ZSB0aGUgX19pbmRleCB0YWJsZQorICBsdWFfcHVzaHN0cmluZyhMLCAiX19pbmRleCIpOyAgICAgICAgICAvLyBtdCwgIl9faW5kZXgiCisgIGx1YV9uZXd0YWJsZShMKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIG10LCAiX19pbmRleCIsIHQKKyAgZm9yICg7IG1ldGhvZHMtPm5hbWU7IG1ldGhvZHMrKykgeworICAgIGx1YV9wdXNoc3RyaW5nKEwsIG1ldGhvZHMtPm5hbWUpOyAgICAvLyBtdCwgIl9faW5kZXgiLCB0LCAibmFtZSIKKyAgICBsdWFfcHVzaGNmdW5jdGlvbihMLCBtZXRob2RzLT5mdW5jKTsgLy8gbXQsICJfX2luZGV4IiwgdCwgIm5hbWUiLCBmdW5jCisgICAgbHVhX3Jhd3NldChMLCAtMyk7ICAgICAgICAgICAgICAgICAgIC8vIG10LCAiX19pbmRleCIsIHQKKyAgfQorICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAgICAvLyBtdAorICBsdWFfcG9wKEwsIDEpOworfQorCitpbnQgbHVhb3Blbl9saWJsdWFzb2NrZXQobHVhX1N0YXRlICpMKSB7CisgIGx1YUxfbmV3bWV0YXRhYmxlKEwsIFNPQ0tFVF9HRU5FUklDKTsKKyAgbHVhTF9uZXdtZXRhdGFibGUoTCwgU09DS0VUX0NMSUVOVCk7CisgIGx1YUxfbmV3bWV0YXRhYmxlKEwsIFNPQ0tFVF9TRVJWRVIpOworICBsdWFfcG9wKEwsIDMpOworICBhZGRfdG9fZ3JvdXAoTCwgU09DS0VUX0dFTkVSSUMsIFNPQ0tFVF9BTlkpOworICBhZGRfdG9fZ3JvdXAoTCwgU09DS0VUX0NMSUVOVCwgU09DS0VUX0FOWSk7CisgIGFkZF90b19ncm91cChMLCBTT0NLRVRfU0VSVkVSLCBTT0NLRVRfQU5ZKTsKKyAgYWRkX3RvX2dyb3VwKEwsIFNPQ0tFVF9DTElFTlQsIFNPQ0tFVF9DT05OKTsKKyAgYWRkX3RvX2dyb3VwKEwsIFNPQ0tFVF9TRVJWRVIsIFNPQ0tFVF9DT05OKTsKKyAgc2V0X21ldGhvZHMoTCwgU09DS0VUX0dFTkVSSUMsIG1ldGhvZHNfZ2VuZXJpYyk7CisgIHNldF9tZXRob2RzKEwsIFNPQ0tFVF9DTElFTlQsIG1ldGhvZHNfY2xpZW50KTsKKyAgc2V0X21ldGhvZHMoTCwgU09DS0VUX1NFUlZFUiwgbWV0aG9kc19zZXJ2ZXIpOworCisgIGx1YUxfcmVnaXN0ZXIoTCwgImx1YXNvY2tldCIsIGZ1bmNzX2x1YXNvY2tldCk7CisgIHJldHVybiAxOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR2VuZXJhbAorCisvLyBzb2NrLGVyciBjcmVhdGUoYmluZF9ob3N0LCBiaW5kX3BvcnQpCisvLyBzb2NrLGVyciBjcmVhdGUoYmluZF9ob3N0KSAtPiBhbnkgcG9ydAorLy8gc29jayxlcnIgY3JlYXRlKCkgLT4gYW55IHBvcnQgb24gbG9jYWxob3N0CitzdGF0aWMgaW50IGxfc29ja2V0X2NyZWF0ZShsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZXJyOworICB0X3NvY2tldCBzb2NrOworICBjb25zdCBjaGFyICphZGRyID0gbHVhX3Rvc3RyaW5nKEwsIDEpOworICBpZiAoIWFkZHIpIHsKKyAgICBhZGRyID0gREVGQVVMVF9IT1NUOworICB9CisgIHVuc2lnbmVkIHNob3J0IHBvcnQgPSBsdWFfdG9udW1iZXIoTCwgMik7CisgIGVyciA9IHRjcF9jcmVhdGUoJnNvY2spOworICBpZiAoIWVycikgeworICAgIGVyciA9IHRjcF9iaW5kKCZzb2NrLCBhZGRyLCBwb3J0KTsgLy8gYmluZCBvbiBjcmVhdGUKKyAgICBpZiAoZXJyKSB7CisgICAgICB0Y3BfZGVzdHJveSgmc29jayk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgbHVhX25ld3VzZXJkYXRhKEwsIHNpemVvZih0X3RjcCkpOworICAgICAgc2V0dHlwZShMLCAtMiwgU09DS0VUX0dFTkVSSUMpOworICAgICAgc29ja2V0X3NldG5vbmJsb2NraW5nKCZzb2NrKTsKKyAgICAgIHRjcC0+c29jayA9IHNvY2s7CisgICAgICB0Y3AtPnRpbWVvdXQgPSAwOworICAgICAgcmV0dXJuIDE7IC8vIFJldHVybiB1c2VyZGF0YQorICAgIH0KKyAgfQorICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKKy8vIGRlc3Ryb3koKQorc3RhdGljIGludCBsX3NvY2tldF9kZXN0cm95KGx1YV9TdGF0ZSAqTCkgeworICBwX3RjcCB0Y3AgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfQU5ZKTsKKyAgY29uc3QgY2hhciAqZXJyID0gdGNwX2Rlc3Ryb3koJnRjcC0+c29jayk7CisgIExVQV9DSEVDS19SRVRVUk4oTCwgZXJyKTsKK30KKworLy8gc2VuZChzb2NrZXQsIGRhdGEpCitzdGF0aWMgaW50IGxfc29ja2V0X3NlbmQobHVhX1N0YXRlICpMKSB7CisgIHBfdGNwIHNlbGYgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfQ09OTik7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDIsIFNPQ0tFVF9DT05OKTsKKyAgc2l6ZV90IGxlbjsKKyAgY29uc3QgY2hhciAqZGF0YSA9IGx1YUxfY2hlY2tsc3RyaW5nKEwsIDMsICZsZW4pOworICBjb25zdCBjaGFyICplcnIgPQorICAgIHRjcF9zZW5kKCZ0Y3AtPnNvY2ssIGRhdGEsIGxlbiwgdGNwLT50aW1lb3V0KTsKKyAgTFVBX0NIRUNLX1JFVFVSTihMLCBlcnIpOworfQorCisjZGVmaW5lIExVQV9SRUFEX1NURVAgODE5Mgorc3RhdGljIGludCBsX3NvY2tldF9yZWNlaXZlKGx1YV9TdGF0ZSAqTCkgeworICBwX3RjcCBzZWxmID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMSwgU09DS0VUX0NPTk4pOworICBwX3RjcCBoYW5kbGUgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAyLCBTT0NLRVRfQ09OTik7CisgIHNpemVfdCBsZW4gPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDMpOworICBjaGFyIGJ1ZltMVUFfUkVBRF9TVEVQXTsKKyAgY29uc3QgY2hhciAqZXJyID0gTlVMTDsKKyAgaW50IHJlY2VpdmVkOworICBzaXplX3QgZ290ID0gMCwgc3RlcCA9IDA7CisgIGx1YUxfQnVmZmVyIGI7CisKKyAgbHVhTF9idWZmaW5pdChMLCAmYik7CisgIGRvIHsKKyAgICBzdGVwID0gKExVQV9SRUFEX1NURVAgPCBsZW4gLSBnb3QgPyBMVUFfUkVBRF9TVEVQIDogbGVuIC0gZ290KTsKKyAgICBlcnIgPSB0Y3BfcmF3X3JlY2VpdmUoJmhhbmRsZS0+c29jaywgYnVmLCBzdGVwLCBzZWxmLT50aW1lb3V0LCAmcmVjZWl2ZWQpOworICAgIGlmIChlcnIgPT0gTlVMTCkgeworICAgICAgbHVhTF9hZGRsc3RyaW5nKCZiLCBidWYsIHJlY2VpdmVkKTsKKyAgICAgIGdvdCArPSByZWNlaXZlZDsKKyAgICB9CisgIH0gd2hpbGUgKGVyciA9PSBOVUxMICYmIGdvdCA8IGxlbik7CisKKyAgaWYgKGVycikgeworICAgIGx1YV9wdXNobmlsKEwpOworICAgIGx1YV9wdXNoc3RyaW5nKEwsIGVycik7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgbHVhTF9wdXNocmVzdWx0KCZiKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIHNldHRpbWVvdXQodGltZW91dCkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfc2V0dGltZW91dChsdWFfU3RhdGUgKkwpIHsKKyAgcF90Y3Agc2VsZiA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9BTlkpOworICBpbnQgdGltZW91dCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgIHNlbGYtPnRpbWVvdXQgPSB0aW1lb3V0OworICBMVUFfU1VDQ0VTU19SRVRVUk4oTCk7Cit9CisKKy8vIHRhYmxlIGdldHNvY2tpbmZvKCkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfZ2V0c29ja2luZm8obHVhX1N0YXRlICpMKSB7CisgIGNoYXIgYnVmWzI1Nl07CisgIHNob3J0IHBvcnQgPSAwOworICBwX3RjcCB0Y3AgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfQU5ZKTsKKyAgaWYgKHNvY2tldF9nZXRfaW5mbygmdGNwLT5zb2NrLCAmcG9ydCwgYnVmLCAyNTYpID09IFNVQ0NFU1MpIHsKKyAgICBsdWFfbmV3dGFibGUoTCk7ICAgICAgICAgICAgICAgICAgICAvLyB0CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgImhvc3QiKTsgICAgICAgICAgLy8gdCwgImhvc3QiCisgICAgbHVhX3B1c2hzdHJpbmcoTCwgYnVmKTsgICAgICAgICAgICAgLy8gdCwgImhvc3QiLCBidWYKKyAgICBsdWFfcmF3c2V0KEwsIC0zKTsgICAgICAgICAgICAgICAgICAvLyB0CisgICAgbHVhX3B1c2hzdHJpbmcoTCwgInBvcnQiKTsgICAgICAgICAgLy8gdCwgInBvcnQiCisgICAgbHVhX3B1c2hudW1iZXIoTCwgcG9ydCk7ICAgICAgICAgICAgLy8gdCwgInBvcnQiLCBwb3J0CisgICAgbHVhX3Jhd3NldChMLCAtMyk7ICAgICAgICAgICAgICAgICAgLy8gdAorICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2VydmVyCisKKy8vIGFjY2VwdCgpCitzdGF0aWMgaW50IGxfc29ja2V0X2FjY2VwdChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZXJyOworICBwX3RjcCBzZWxmID0gKHBfdGNwKSBjaGVja3R5cGUoTCwgMSwgU09DS0VUX1NFUlZFUik7CisgIHRfc29ja2V0IHNvY2s7CisgIGVyciA9IHRjcF9hY2NlcHQoJnNlbGYtPnNvY2ssICZzb2NrLCBzZWxmLT50aW1lb3V0KTsKKyAgaWYgKCFlcnIpIHsgLy8gU3VjY2VzcworICAgIC8vIENyZWF0ZSBhIHJlZmVyZW5jZSB0byB0aGUgY2xpZW50CisgICAgcF90Y3AgY2xpZW50ID0gKHBfdGNwKSBsdWFfbmV3dXNlcmRhdGEoTCwgc2l6ZW9mKHRfdGNwKSk7CisgICAgc2V0dHlwZShMLCAyLCBTT0NLRVRfQ0xJRU5UKTsKKyAgICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoJnNvY2spOworICAgIGNsaWVudC0+c29jayA9IHNvY2s7CisgICAgY2xpZW50LT50aW1lb3V0ID0gc2VsZi0+dGltZW91dDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKK3N0YXRpYyBpbnQgbF9zb2NrZXRfbGlzdGVuKGx1YV9TdGF0ZSAqTCkgeworICBjb25zdCBjaGFyKiBlcnI7CisgIHBfdGNwIHRjcCA9IChwX3RjcCkgY2hlY2t0eXBlKEwsIDEsIFNPQ0tFVF9HRU5FUklDKTsKKyAgaW50IGJhY2tsb2cgPSAxMDsKKyAgZXJyID0gdGNwX2xpc3RlbigmdGNwLT5zb2NrLCBiYWNrbG9nKTsKKyAgaWYgKCFlcnIpIHsKKyAgICAvLyBTZXQgdGhlIGN1cnJlbnQgYXMgYSBzZXJ2ZXIKKyAgICBzZXR0eXBlKEwsIDEsIFNPQ0tFVF9TRVJWRVIpOyAvLyBOb3cgYSBzZXJ2ZXIKKyAgfQorICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGllbnQKKworLy8gY3JlYXRlX2FuZF9jb25uZWN0KGhvc3QsIHBvcnQsIHRpbWVvdXQpCitleHRlcm4gZG91YmxlIF9fZ2V0dGltZSgpOworc3RhdGljIGludCBsX3NvY2tldF9jcmVhdGVfYW5kX2Nvbm5lY3QobHVhX1N0YXRlICpMKSB7CisgIGNvbnN0IGNoYXIqIGVyciA9IE5VTEw7CisgIGRvdWJsZSBlbmQ7CisgIHRfc29ja2V0IHNvY2s7CisgIGNvbnN0IGNoYXIgKmhvc3QgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDEpOworICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gbHVhTF9jaGVja251bWJlcihMLCAyKTsKKyAgaW50IHRpbWVvdXQgPSBsdWFMX2NoZWNrbnVtYmVyKEwsIDMpOworCisgIC8vIENyZWF0ZSBhbmQgY29ubmVjdCBsb29wIGZvciB0aW1lb3V0IG1pbGxpc2Vjb25kcworICBlbmQgPSBfX2dldHRpbWUoKSArIHRpbWVvdXQvMTAwMDsKKyAgZG8geworICAgIC8vIENyZWF0ZSB0aGUgc29ja2V0CisgICAgZXJyID0gdGNwX2NyZWF0ZSgmc29jayk7CisgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgLy8gQ29ubmVjdAorICAgICAgICBlcnIgPSB0Y3BfY29ubmVjdCgmc29jaywgaG9zdCwgcG9ydCwgdGltZW91dCk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICB0Y3BfZGVzdHJveSgmc29jayk7CisgICAgICAgICAgdXNsZWVwKDEwMDAwMCk7IC8vIHNsZWVwIGZvciAxMDBtcworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBfdGNwIHRjcCA9IChwX3RjcCkgbHVhX25ld3VzZXJkYXRhKEwsIHNpemVvZih0X3RjcCkpOworICAgICAgICAgIHNldHR5cGUoTCwgLTIsIFNPQ0tFVF9DTElFTlQpOworICAgICAgICAgIHNvY2tldF9zZXRub25ibG9ja2luZygmc29jayk7CisgICAgICAgICAgdGNwLT5zb2NrID0gc29jazsKKyAgICAgICAgICB0Y3AtPnRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgIHJldHVybiAxOyAvLyBSZXR1cm4gdXNlcmRhdGEKKyAgICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoZXJyICYmIF9fZ2V0dGltZSgpIDwgZW5kKTsKKworICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CisKKy8vIGNvbm5lY3QoaG9zdCwgcG9ydCkKK3N0YXRpYyBpbnQgbF9zb2NrZXRfY29ubmVjdChsdWFfU3RhdGUgKkwpIHsKKyAgY29uc3QgY2hhciAqZXJyOworICBwX3RjcCB0Y3AgPSAocF90Y3ApIGNoZWNrdHlwZShMLCAxLCBTT0NLRVRfR0VORVJJQyk7CisgIGNvbnN0IGNoYXIgKmhvc3QgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOworICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gbHVhTF9jaGVja251bWJlcihMLCAzKTsKKyAgZXJyID0gdGNwX2Nvbm5lY3QoJnRjcC0+c29jaywgaG9zdCwgcG9ydCwgdGNwLT50aW1lb3V0KTsKKyAgaWYgKCFlcnIpIHsKKyAgICBzZXR0eXBlKEwsIDEsIFNPQ0tFVF9DTElFTlQpOyAvLyBOb3cgYSBjbGllbnQKKyAgfQorICBMVUFfQ0hFQ0tfUkVUVVJOKEwsIGVycik7Cit9CmRpZmYgLS1naXQgYS9saWIvbHVhL3NyYy9zb2NrZXQuaCBiL2xpYi9sdWEvc3JjL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjgyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbHVhL3NyYy9zb2NrZXQuaApAQCAtMCwwICsxLDc4IEBACisvLworLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2lmbmRlZiBMVUFfVEhSSUZUX1NPQ0tFVF9ICisjZGVmaW5lIExVQV9USFJJRlRfU09DS0VUX0gKKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2lmZGVmIF9XSU4zMgorLy8gU09MCisjZWxzZQordHlwZWRlZiBpbnQgdF9zb2NrZXQ7Cit0eXBlZGVmIHRfc29ja2V0KiBwX3NvY2tldDsKKyNlbmRpZgorCisvLyBFcnJvciBDb2RlcworZW51bSB7CisgIFNVQ0NFU1MgPSAwLAorICBUSU1FT1VUID0gLTEsCisgIENMT1NFRCA9IC0yLAorfTsKK3R5cGVkZWYgaW50IFRfRVJSQ09ERTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBUSU1FT1VUX01TRyA9ICJUaW1lb3V0IjsKK3N0YXRpYyBjb25zdCBjaGFyICogQ0xPU0VEX01TRyA9ICJDb25uZWN0aW9uIENsb3NlZCI7CisKK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyIHRfc2E7Cit0eXBlZGVmIHRfc2EgKiBwX3NhOworCitUX0VSUkNPREUgc29ja2V0X2NyZWF0ZShwX3NvY2tldCBzb2NrLCBpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTsKK1RfRVJSQ09ERSBzb2NrZXRfZGVzdHJveShwX3NvY2tldCBzb2NrKTsKK1RfRVJSQ09ERSBzb2NrZXRfYmluZChwX3NvY2tldCBzb2NrLCBwX3NhIGFkZHIsIGludCBhZGRyX2xlbik7CitUX0VSUkNPREUgc29ja2V0X2dldF9pbmZvKHBfc29ja2V0IHNvY2ssIHNob3J0ICpwb3J0LCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworVF9FUlJDT0RFIHNvY2tldF9zZW5kKHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0KTsKK1RfRVJSQ09ERSBzb2NrZXRfcmVjdihwX3NvY2tldCBzb2NrLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBpbnQgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJlY2VpdmVkKTsKKworVF9FUlJDT0RFIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKK1RfRVJSQ09ERSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgc29jayk7CisKK1RfRVJSQ09ERSBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHNvY2ssIHBfc29ja2V0IHNpYmxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBwX3NhIGFkZHIsIHNvY2tsZW5fdCAqYWRkcl9sZW4sIGludCB0aW1lb3V0KTsKK1RfRVJSQ09ERSBzb2NrZXRfbGlzdGVuKHBfc29ja2V0IHNvY2ssIGludCBiYWNrbG9nKTsKKworVF9FUlJDT0RFIHNvY2tldF9jb25uZWN0KHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuLCBpbnQgdGltZW91dCk7CisKK2NvbnN0IGNoYXIgKiB0Y3BfY3JlYXRlKHBfc29ja2V0IHNvY2spOworY29uc3QgY2hhciAqIHRjcF9kZXN0cm95KHBfc29ja2V0IHNvY2spOworY29uc3QgY2hhciAqIHRjcF9iaW5kKHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHNob3J0IHBvcnQpOworY29uc3QgY2hhciAqIHRjcF9zZW5kKHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCB3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dCk7Citjb25zdCBjaGFyICogdGNwX3JlY2VpdmUocF9zb2NrZXQgc29jaywgY2hhciAqZGF0YSwgc2l6ZV90IHJfbGVuLCBpbnQgdGltZW91dCk7Citjb25zdCBjaGFyICogdGNwX3Jhd19yZWNlaXZlKHBfc29ja2V0IHNvY2ssIGNoYXIgKiBkYXRhLCBzaXplX3Qgcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0LCBpbnQgKnJlY2VpdmVkKTsKKworY29uc3QgY2hhciAqIHRjcF9saXN0ZW4ocF9zb2NrZXQgc29jaywgaW50IGJhY2tsb2cpOworY29uc3QgY2hhciAqIHRjcF9hY2NlcHQocF9zb2NrZXQgc29jaywgcF9zb2NrZXQgY2xpZW50LCBpbnQgdGltZW91dCk7CisKK2NvbnN0IGNoYXIgKiB0Y3BfY29ubmVjdChwX3NvY2tldCBzb2NrLCBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBzaG9ydCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvbHVhL3NyYy91c29ja2V0LmMgYi9saWIvbHVhL3NyYy91c29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExYjU0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYwpAQCAtMCwwICsxLDM3NiBAQAorLy8KKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4gLy8gVE9ETyBSRU1PVkUKKworI2luY2x1ZGUgInNvY2tldC5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUHJpdmF0ZQorCisvLyBOdW0gc2Vjb25kcyBzaW5jZSBKYW4gMSAxOTcwIChVVEMpCisjaWZkZWYgX1dJTjMyCisvLyBTT0wKKyNlbHNlCisgIGRvdWJsZSBfX2dldHRpbWUoKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdjsKKyAgICBnZXR0aW1lb2ZkYXkoJnYsIChzdHJ1Y3QgdGltZXpvbmUqKSBOVUxMKTsKKyAgICByZXR1cm4gdi50dl9zZWMgKyB2LnR2X3VzZWMvMS4wZTY7CisgIH0KKyNlbmRpZgorCisjZGVmaW5lIFdBSVRfTU9ERV9SICAxCisjZGVmaW5lIFdBSVRfTU9ERV9XICAyCisjZGVmaW5lIFdBSVRfTU9ERV9DICAoV0FJVF9NT0RFX1J8V0FJVF9NT0RFX1cpCitUX0VSUkNPREUgc29ja2V0X3dhaXQocF9zb2NrZXQgc29jaywgaW50IG1vZGUsIGludCB0aW1lb3V0KSB7CisgIGludCByZXQgPSAwOworICBmZF9zZXQgcmZkcywgd2ZkczsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIGRvdWJsZSBlbmQsIHQ7CisgIGlmICghdGltZW91dCkgeworICAgIHJldHVybiBUSU1FT1VUOworICB9CisKKyAgZW5kID0gX19nZXR0aW1lKCkgKyB0aW1lb3V0LzEwMDA7CisgIGRvIHsKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBGRF9aRVJPKCZ3ZmRzKTsKKworICAgIC8vIFNwZWNpZnkgd2hhdCBJL08gb3BlcmF0aW9ucyB3ZSBjYXJlIGFib3V0CisgICAgaWYgKG1vZGUgJiBXQUlUX01PREVfUikgeworICAgICAgRkRfU0VUKCpzb2NrLCAmcmZkcyk7CisgICAgfQorICAgIGlmIChtb2RlICYgV0FJVF9NT0RFX1cpIHsKKyAgICAgIEZEX1NFVCgqc29jaywgJndmZHMpOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciB0aW1lb3V0CisgICAgdCA9IGVuZCAtIF9fZ2V0dGltZSgpOworICAgIGlmICh0IDwgMC4wKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBXYWl0CisgICAgdHYudHZfc2VjID0gKGludCl0OworICAgIHR2LnR2X3VzZWMgPSAoaW50KSgodCAtIHR2LnR2X3NlYykgKiAxLjBlNik7CisgICAgcmV0ID0gc2VsZWN0KCpzb2NrKzEsICZyZmRzLCAmd2ZkcywgTlVMTCwgJnR2KTsKKyAgfSB3aGlsZSAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKyAgaWYgKHJldCA9PSAtMSkgeworICAgIHJldHVybiBlcnJubzsKKyAgfQorCisgIC8vIENoZWNrIGZvciB0aW1lb3V0CisgIGlmIChyZXQgPT0gMCkgeworICAgIHJldHVybiBUSU1FT1VUOworICB9CisKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIGFjdHVhbGx5IHJlYWQgZnJvbSB0aGUgcmVtb3RlIGhvc3QKKyAgaWYgKG1vZGUgJiBXQUlUX01PREVfQyAmJiBGRF9JU1NFVCgqc29jaywgJnJmZHMpICYmCisgICAgICByZWN2KCpzb2NrLCAoY2hhciopICZyZmRzLCAwLCAwKSAhPSAwKSB7CisgICAgcmV0dXJuIGVycm5vOworICB9CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHZW5lcmFsCisKK1RfRVJSQ09ERSBzb2NrZXRfY3JlYXRlKHBfc29ja2V0IHNvY2ssIGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpIHsKKyAgKnNvY2sgPSBzb2NrZXQoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgIGlmICgqc29jayA+IDApIHsKKyAgICByZXR1cm4gU1VDQ0VTUzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZXJybm87CisgIH0KK30KKworVF9FUlJDT0RFIHNvY2tldF9kZXN0cm95KHBfc29ja2V0IHNvY2spIHsKKyAgLy8gVE9ETyBGaWd1cmUgb3V0IGlmIEkgc2hvdWxkIGJlIGZyZWUtaW5nIHRoaXMKKyAgaWYgKCpzb2NrID4gMCkgeworICAgICh2b2lkKXNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgICBjbG9zZSgqc29jayk7CisgICAgKnNvY2sgPSAtMTsKKyAgfQorICByZXR1cm4gU1VDQ0VTUzsKK30KKworVF9FUlJDT0RFIHNvY2tldF9iaW5kKHBfc29ja2V0IHNvY2ssIHBfc2EgYWRkciwgaW50IGFkZHJfbGVuKSB7CisgIGludCByZXQgPSBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGlmIChyZXQgIT0gU1VDQ0VTUykgeworICAgIHJldHVybiByZXQ7CisgIH0KKyAgaWYgKGJpbmQoKnNvY2ssIGFkZHIsIGFkZHJfbGVuKSkgeworICAgIHJldCA9IGVycm5vOworICB9CisgIGludCByZXQyID0gc29ja2V0X3NldG5vbmJsb2NraW5nKHNvY2spOworICByZXR1cm4gcmV0ID09IFNVQ0NFU1MgPyByZXQyIDogcmV0OworfQorCitUX0VSUkNPREUgc29ja2V0X2dldF9pbmZvKHBfc29ja2V0IHNvY2ssIHNob3J0ICpwb3J0LCBjaGFyICpidWYsIHNpemVfdCBsZW4pIHsKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgIG1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworICBzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihzYSk7CisgIGludCByYyA9IGdldHNvY2tuYW1lKCpzb2NrLCAoc3RydWN0IHNvY2thZGRyKikmc2EsICZhZGRybGVuKTsKKyAgaWYgKCFyYykgeworICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KikoJnNhKTsKKyAgICAgIGlmICghaW5ldF9udG9wKEFGX0lORVQ2LCAmc2luLT5zaW42X2FkZHIsIGJ1ZiwgbGVuKSkgeworICAgICAgICByZXR1cm4gZXJybm87CisgICAgICB9CisgICAgICAqcG9ydCA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgc3RydWN0IHNvY2thZGRyX2luKiBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luKikoJnNhKTsKKyAgICAgIGlmICghaW5ldF9udG9wKEFGX0lORVQsICZzaW4tPnNpbl9hZGRyLCBidWYsIGxlbikpIHsKKyAgICAgICAgcmV0dXJuIGVycm5vOworICAgICAgfQorICAgICAgKnBvcnQgPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKKyAgICB9CisgICAgcmV0dXJuIFNVQ0NFU1M7CisgIH0KKyAgcmV0dXJuIGVycm5vOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2VydmVyCisKK1RfRVJSQ09ERSBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHNvY2ssIHBfc29ja2V0IGNsaWVudCwKKyAgICAgICAgICAgICAgICAgIHBfc2EgYWRkciwgc29ja2xlbl90ICphZGRybGVuLCBpbnQgdGltZW91dCkgeworICBpbnQgZXJyOworICBpZiAoKnNvY2sgPCAwKSB7CisgICAgcmV0dXJuIENMT1NFRDsKKyAgfQorICBkbyB7CisgICAgKmNsaWVudCA9IGFjY2VwdCgqc29jaywgYWRkciwgYWRkcmxlbik7CisgICAgaWYgKCpjbGllbnQgPiAwKSB7CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICB9CisgIH0gd2hpbGUgKChlcnIgPSBlcnJubykgPT0gRUlOVFIpOworCisgIGlmIChlcnIgPT0gRUFHQUlOIHx8IGVyciA9PSBFQ09OTkFCT1JURUQpIHsKKyAgICByZXR1cm4gc29ja2V0X3dhaXQoc29jaywgV0FJVF9NT0RFX1IsIHRpbWVvdXQpOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworVF9FUlJDT0RFIHNvY2tldF9saXN0ZW4ocF9zb2NrZXQgc29jaywgaW50IGJhY2tsb2cpIHsKKyAgaW50IHJldCA9IHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaWYgKHJldCAhPSBTVUNDRVNTKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAobGlzdGVuKCpzb2NrLCBiYWNrbG9nKSkgeworICAgIHJldCA9IGVycm5vOworICB9CisgIGludCByZXQyID0gc29ja2V0X3NldG5vbmJsb2NraW5nKHNvY2spOworICByZXR1cm4gcmV0ID09IFNVQ0NFU1MgPyByZXQyIDogcmV0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xpZW50CisKK1RfRVJSQ09ERSBzb2NrZXRfY29ubmVjdChwX3NvY2tldCBzb2NrLCBwX3NhIGFkZHIsIGludCBhZGRyX2xlbiwgaW50IHRpbWVvdXQpIHsKKyAgaW50IGVycjsKKyAgaWYgKCpzb2NrIDwgMCkgeworICAgIHJldHVybiBDTE9TRUQ7CisgIH0KKworICBkbyB7CisgICAgaWYgKGNvbm5lY3QoKnNvY2ssIGFkZHIsIGFkZHJfbGVuKSA9PSAwKSB7CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICB9CisgIH0gd2hpbGUgKChlcnIgPSBlcnJubykgPT0gRUlOVFIpOworICBpZiAoZXJyICE9IEVJTlBST0dSRVNTICYmIGVyciAhPSBFQUdBSU4pIHsKKyAgICByZXR1cm4gZXJyOworICB9CisgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfQywgdGltZW91dCk7Cit9CisKK1RfRVJSQ09ERSBzb2NrZXRfc2VuZCgKKyAgcF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgaW50IHRpbWVvdXQpIHsKKyAgaW50IGVyciwgcHV0ID0gMDsKKyAgaWYgKCpzb2NrIDwgMCkgeworICAgIHJldHVybiBDTE9TRUQ7CisgIH0KKyAgZG8geworICAgIHB1dCA9IHNlbmQoKnNvY2ssIGRhdGEsIGxlbiwgMCk7CisgICAgaWYgKHB1dCA+IDApIHsKKyAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKyAgfSB3aGlsZSAoKGVyciA9IGVycm5vKSA9PSBFSU5UUik7CisKKyAgaWYgKGVyciA9PSBFQUdBSU4pIHsKKyAgICByZXR1cm4gc29ja2V0X3dhaXQoc29jaywgV0FJVF9NT0RFX1csIHRpbWVvdXQpOworICB9CisKKyAgcmV0dXJuIGVycjsKK30KKworVF9FUlJDT0RFIHNvY2tldF9yZWN2KAorICBwX3NvY2tldCBzb2NrLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBpbnQgdGltZW91dCwgaW50ICpyZWNlaXZlZCkgeworICBpbnQgZXJyLCBnb3QgPSAwOworICBpZiAoKnNvY2sgPCAwKSB7CisgICAgcmV0dXJuIENMT1NFRDsKKyAgfQorICAqcmVjZWl2ZWQgPSAwOworCisgIGRvIHsKKyAgICBnb3QgPSByZWN2KCpzb2NrLCBkYXRhLCBsZW4sIDApOworICAgIGlmIChnb3QgPiAwKSB7CisgICAgICAqcmVjZWl2ZWQgPSBnb3Q7CisgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICB9CisgICAgZXJyID0gZXJybm87CisKKyAgICAvLyBDb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCBieSBwZWVyCisgICAgaWYgKGdvdCA9PSAwKSB7CisgICAgICByZXR1cm4gQ0xPU0VEOworICAgIH0KKyAgfSB3aGlsZSAoZXJyID09IEVJTlRSKTsKKworICBpZiAoZXJyID09IEVBR0FJTikgeworICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfUiwgdGltZW91dCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVXRpbAorCitUX0VSUkNPREUgc29ja2V0X3NldG5vbmJsb2NraW5nKHBfc29ja2V0IHNvY2spIHsKKyAgaW50IGZsYWdzID0gZmNudGwoKnNvY2ssIEZfR0VURkwsIDApOworICBmbGFncyB8PSBPX05PTkJMT0NLOworICByZXR1cm4gZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKSAhPSAtMSA/IFNVQ0NFU1MgOiBlcnJubzsKK30KKworVF9FUlJDT0RFIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKSB7CisgIGludCBmbGFncyA9IGZjbnRsKCpzb2NrLCBGX0dFVEZMLCAwKTsKKyAgZmxhZ3MgJj0gKH4oT19OT05CTE9DSykpOworICByZXR1cm4gZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKSAhPSAtMSA/IFNVQ0NFU1MgOiBlcnJubzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRDUAorCisjZGVmaW5lIEVSUk9SU1RSX1JFVFVSTihlcnIpIFwKKyAgaWYgKGVyciA9PSBTVUNDRVNTKSB7IFwKKyAgICByZXR1cm4gTlVMTDsgXAorICB9IGVsc2UgaWYgKGVyciA9PSBUSU1FT1VUKSB7IFwKKyAgICByZXR1cm4gVElNRU9VVF9NU0c7IFwKKyAgfSBlbHNlIGlmIChlcnIgPT0gQ0xPU0VEKSB7IFwKKyAgICByZXR1cm4gQ0xPU0VEX01TRzsgXAorICB9IFwKKyAgcmV0dXJuIHN0cmVycm9yKGVycikKKworY29uc3QgY2hhciAqIHRjcF9jcmVhdGUocF9zb2NrZXQgc29jaykgeworICBpbnQgZXJyID0gc29ja2V0X2NyZWF0ZShzb2NrLCBBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgIEVSUk9SU1RSX1JFVFVSTihlcnIpOworfQorCitjb25zdCBjaGFyICogdGNwX2Rlc3Ryb3kocF9zb2NrZXQgc29jaykgeworICBpbnQgZXJyID0gc29ja2V0X2Rlc3Ryb3koc29jayk7CisgIEVSUk9SU1RSX1JFVFVSTihlcnIpOworfQorCitjb25zdCBjaGFyICogdGNwX2JpbmQocF9zb2NrZXQgc29jaywgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgc2hvcnQgcG9ydCkgeworICBpbnQgZXJyOworICBzdHJ1Y3QgaG9zdGVudCAqaDsKKyAgc3RydWN0IHNvY2thZGRyX2luIGxvY2FsOworICBtZW1zZXQoJmxvY2FsLCAwLCBzaXplb2YobG9jYWwpKTsKKyAgbG9jYWwuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgIGxvY2FsLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworICBsb2NhbC5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICBpZiAoc3RyY21wKGhvc3QsICIqIikgJiYgIWluZXRfYXRvbihob3N0LCAmbG9jYWwuc2luX2FkZHIpKSB7CisgICAgaCA9IGdldGhvc3RieW5hbWUoaG9zdCk7CisgICAgaWYgKCFoKSB7CisgICAgICByZXR1cm4gaHN0cmVycm9yKGhfZXJybm8pOworICAgIH0KKyAgICBtZW1jcHkoJmxvY2FsLnNpbl9hZGRyLAorICAgICAgICAgICAoc3RydWN0IGluX2FkZHIgKiloLT5oX2FkZHJfbGlzdFswXSwKKyAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgIH0KKyAgZXJyID0gc29ja2V0X2JpbmQoc29jaywgKHBfc2EpICZsb2NhbCwgc2l6ZW9mKGxvY2FsKSk7CisgIEVSUk9SU1RSX1JFVFVSTihlcnIpOworfQorCitjb25zdCBjaGFyICogdGNwX2xpc3RlbihwX3NvY2tldCBzb2NrLCBpbnQgYmFja2xvZykgeworICBpbnQgZXJyID0gc29ja2V0X2xpc3Rlbihzb2NrLCBiYWNrbG9nKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfYWNjZXB0KHBfc29ja2V0IHNvY2ssIHBfc29ja2V0IGNsaWVudCwgaW50IHRpbWVvdXQpIHsKKyAgaW50IGVyciA9IHNvY2tldF9hY2NlcHQoc29jaywgY2xpZW50LCBOVUxMLCBOVUxMLCB0aW1lb3V0KTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKK2NvbnN0IGNoYXIgKiB0Y3BfY29ubmVjdChwX3NvY2tldCBzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dCkgeworICBpbnQgZXJyOworICBzdHJ1Y3QgaG9zdGVudCAqaDsKKyAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZTsKKyAgbWVtc2V0KCZyZW1vdGUsIDAsIHNpemVvZihyZW1vdGUpKTsKKyAgcmVtb3RlLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICByZW1vdGUuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgaWYgKHN0cmNtcChob3N0LCAiKiIpICYmICFpbmV0X2F0b24oaG9zdCwgJnJlbW90ZS5zaW5fYWRkcikpIHsKKyAgICBoID0gZ2V0aG9zdGJ5bmFtZShob3N0KTsKKyAgICBpZiAoIWgpIHsKKyAgICAgIHJldHVybiBoc3RyZXJyb3IoaF9lcnJubyk7CisgICAgfQorICAgIG1lbWNweSgmcmVtb3RlLnNpbl9hZGRyLAorICAgICAgICAgICAoc3RydWN0IGluX2FkZHIgKiloLT5oX2FkZHJfbGlzdFswXSwKKyAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgIH0KKyAgZXJyID0gc29ja2V0X2Nvbm5lY3Qoc29jaywgKHBfc2EpICZyZW1vdGUsIHNpemVvZihyZW1vdGUpLCB0aW1lb3V0KTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CisKKyNkZWZpbmUgV1JJVEVfU1RFUCA4MTkyCitjb25zdCBjaGFyICogdGNwX3NlbmQoCisgIHBfc29ja2V0IHNvY2ssIGNvbnN0IGNoYXIgKiBkYXRhLCBzaXplX3Qgd19sZW4sIGludCB0aW1lb3V0KSB7CisgIGludCBlcnI7CisgIHNpemVfdCBwdXQgPSAwLCBzdGVwOworICBpZiAoIXdfbGVuKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBkbyB7CisgICAgc3RlcCA9IChXUklURV9TVEVQIDwgd19sZW4gLSBwdXQgPyBXUklURV9TVEVQIDogd19sZW4gLSBwdXQpOworICAgIGVyciA9IHNvY2tldF9zZW5kKHNvY2ssIGRhdGEgKyBwdXQsIHN0ZXAsIHRpbWVvdXQpOworICAgIHB1dCArPSBzdGVwOworICB9IHdoaWxlIChlcnIgPT0gU1VDQ0VTUyAmJiBwdXQgPCB3X2xlbik7CisgIEVSUk9SU1RSX1JFVFVSTihlcnIpOworfQorCitjb25zdCBjaGFyICogdGNwX3Jhd19yZWNlaXZlKAorICBwX3NvY2tldCBzb2NrLCBjaGFyICogZGF0YSwgc2l6ZV90IHJfbGVuLCBpbnQgdGltZW91dCwgaW50ICpyZWNlaXZlZCkgeworICBpbnQgZXJyID0gc29ja2V0X3JlY3Yoc29jaywgZGF0YSwgcl9sZW4sIHRpbWVvdXQsIHJlY2VpdmVkKTsKKyAgRVJST1JTVFJfUkVUVVJOKGVycik7Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9NYWtlZmlsZS5hbSBiL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjNmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK2NoZWNrLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgdGVzdCBUZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvagorCSR7RE9UTkVUQ09SRX0gdGVzdCBUZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgVGhyaWZ0L2JpbgorCSQoUk0pIC1yIFRocmlmdC9vYmoKKworRVhUUkFfRElTVCA9IFwKKwlSRUFETUUubWQgXAorCVRlc3RzIFwKKwlUaHJpZnQgXAorCVRocmlmdC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2ggXAorCXJ1bnRlc3RzLmNtZCBcCisJcnVudGVzdHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1JFQURNRS5tZCBiL2xpYi9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGIwNDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjQgQEAKKyMgQXBhY2hlIFRocmlmdCBuZXRjb3JlCisKK1RocmlmdCBjbGllbnQgbGlicmFyeSBwb3J0ZWQgdG8gTWljcm9zb2Z0IC5OZXQgQ29yZSAKKworIyBDb250ZW50CistIFRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMgLSBwcm9qZWN0IGZvciBjaGVja2luZyBwdWJsaWMgaW50ZXJmYWNlcyBkdXJpbmcgYWRkaW5nIGNoYW5nZXMgdG8gVGhyaWZ0IGxpYnJhcnkKKy0gVGhyaWZ0IC0gVGhyaWZ0IGxpYnJhcnkgCisKKyMgUmV1c2VkIGNvbXBvbmVudHMgCistIC5ORVQgU3RhbmRhcmQgMS42IChTREsgMi4wLjApCisKKyMgSG93IHRvIGJ1aWxkIG9uIFdpbmRvd3MKKy0gR2V0IFRocmlmdCBJREwgY29tcGlsZXIgZXhlY3V0YWJsZSwgYWRkIHRvIHNvbWUgZm9sZGVyIGFuZCBhZGQgcGF0aCB0byB0aGlzIGZvbGRlciBpbnRvIFBBVEggdmFyaWFibGUKKy0gT3BlbiB0aGUgVGhyaWZ0LnNsbiBwcm9qZWN0IHdpdGggVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQuCitvciAKKy0gQnVpbGQgd2l0aCBzY3JpcHRzCisKKyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgQ29yZSAyLjAuMCBTREsgaW5zdGFsbGVkIG9yIHVzZSB0aGUgVWJ1bnR1IFhlbmlhbCBkb2NrZXIgaW1hZ2UKKy0gRm9sbG93IGNvbW1vbiBidWlsZCBwcmFjdGljZSBmb3IgVGhyaWZ0OiBib290c3RyYXAsIGNvbmZpZ3VyZSwgYW5kIG1ha2UKKworIyBLbm93biBpc3N1ZXMKKy0gSW4gdHJhY2UgbG9nZ2luZyBtb2RlIHlvdSBjYW4gc2VlIHNvbWUgbm90IGltcG9ydGFudCBpbnRlcm5hbCBleGNlcHRpb25zCisKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTRjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9BcGFjaGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsNTAyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBLZWxsZXJtYW5Tb2Z0d2FyZS5Db21wYXJlTmV0T2JqZWN0czsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5Qcm90b2NvbHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBQcm90b2NvbHNPcGVyYXRpb25zVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQ29tcGFyZUxvZ2ljIF9jb21wYXJlTG9naWMgPSBuZXcgQ29tcGFyZUxvZ2ljKCk7CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuT25ld2F5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZE1lc3NhZ2VfVGVzdChUeXBlIHByb3RvY29sVHlwZSwgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVE1lc3NhZ2UobmFtZW9mKFRNZXNzYWdlKSwgbWVzc2FnZVR5cGUsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxNZXNzYWdlID0gYXdhaXQgcHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWxNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkU3RydWN0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUU3RydWN0KG5hbWVvZihUU3RydWN0KSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRGaWVsZF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVEZpZWxkKG5hbWVvZihURmllbGQpLCBUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTWFwX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUTWFwKFRUeXBlLlN0cmluZywgVFR5cGUuU3RyaW5nLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTWFwQmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZExpc3RfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRMaXN0KFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVMaXN0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTGlzdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFNldF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVFNldChUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTZXRFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJvb2xfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJvb2xBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQm9vbEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkQnl0ZV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBzYnl0ZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJ5dGVBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQnl0ZUFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTE2X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IHNob3J0Lk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTE2QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEkxNkFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTMyX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGludC5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUkzMkFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRJMzJBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEk2NF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBsb25nLk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTY0QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEk2NEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkRG91YmxlX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGRvdWJsZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZURvdWJsZUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWREb3VibGVBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFN0cmluZ19UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuYW1lb2YoU3RyaW5nKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cmluZ0FzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTdHJpbmdBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJpbmFyeV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKG5hbWVvZihTdHJpbmcpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJpbmFyeUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRCaW5hcnlBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+IEdldFByb3RvY29sSW5zdGFuY2UoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB2YXIgc3RyZWFtQ2xpZW50VHJhbnNwb3J0ID0gbmV3IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQobWVtb3J5U3RyZWFtLCBtZW1vcnlTdHJlYW0pOworICAgICAgICAgICAgdmFyIHByb3RvY29sID0gKFRQcm90b2NvbCkgQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHByb3RvY29sVHlwZSwgc3RyZWFtQ2xpZW50VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+KG1lbW9yeVN0cmVhbSwgcHJvdG9jb2wpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWRhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKQEAgLTAsMCArMSwyOSBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0LkludGVncmF0aW9uVGVzdHM8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlRocmlmdC5JbnRlZ3JhdGlvblRlc3RzPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkNvbXBhcmVORVRPYmplY3RzIiBWZXJzaW9uPSI0LjMuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuTkVULlRlc3QuU2RrIiBWZXJzaW9uPSIxNS41LjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RBZGFwdGVyIiBWZXJzaW9uPSIxLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEZyYW1ld29yayIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSI0LjQuMCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MmE3ZjQ4ZC0zYjUwLTRiMWUtYjgyZS0zYWRhODIxMGMzNTh9IiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvLmdpdGlnbm9yZSBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTkyOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9UaHJpZnRUZXN0CisvQXBhY2hlCisvRmFjZWJvb2sKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvQ2Fzc2FuZHJhVGVzdC50aHJpZnQgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTI3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNzA1IEBACisjIS91c3IvbG9jYWwvYmluL3RocmlmdCAtLWphdmEgLS1waHAgLS1weQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyMgKioqIFBMRUFTRSBSRU1FTUJFUiBUTyBFRElUIFRIRSBWRVJTSU9OIENPTlNUQU5UIFdIRU4gTUFLSU5HIENIQU5HRVMgKioqCisjIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisjCisjIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBDYXNzYW5kcmEgU2VydmljZQorIworCituYW1lc3BhY2UgbmV0Y29yZSBBcGFjaGUuQ2Fzc2FuZHJhLlRlc3QKKworIyBUaHJpZnQucmIgaGFzIGEgYnVnIHdoZXJlIHRvcC1sZXZlbCBtb2R1bGVzIHRoYXQgaW5jbHVkZSBtb2R1bGVzIAorIyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIG5vdCBwcm9wZXJseSByZWZlcmVuY2VkLCBzbyB3ZSBjYW4ndCBkbworIyBDYXNzYW5kcmE6OkNhc3NhbmRyYTo6Q2xpZW50LgorbmFtZXNwYWNlIHJiIENhc3NhbmRyYVRocmlmdAorCisjIFRoZSBBUEkgdmVyc2lvbiAoTk9UIHRoZSBwcm9kdWN0IHZlcnNpb24pLCBjb21wb3NlZCBhcyBhIGRvdCBkZWxpbWl0ZWQKKyMgc3RyaW5nIHdpdGggbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggbGV2ZWwgY29tcG9uZW50cy4KKyMKKyMgIC0gTWFqb3I6IEluY3JlbWVudGVkIGZvciBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlcy4gQW4gZXhhbXBsZSB3b3VsZAorIyAgICAgICAgICAgYmUgY2hhbmdlcyB0byB0aGUgbnVtYmVyIG9yIGRpc3Bvc2l0aW9uIG9mIG1ldGhvZCBhcmd1bWVudHMuCisjICAtIE1pbm9yOiBJbmNyZW1lbnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBjaGFuZ2VzLiBBbiBleGFtcGxlIHdvdWxkCisjICAgICAgICAgICBiZSB0aGUgYWRkaXRpb24gb2YgYSBuZXcgKG9wdGlvbmFsKSBtZXRob2QuCisjICAtIFBhdGNoOiBJbmNyZW1lbnRlZCBmb3IgYnVnIGZpeGVzLiBUaGUgcGF0Y2ggbGV2ZWwgc2hvdWxkIGJlIGluY3JlYXNlZAorIyAgICAgICAgICAgZm9yIGV2ZXJ5IGVkaXQgdGhhdCBkb2Vzbid0IHJlc3VsdCBpbiBhIGNoYW5nZSB0byBtYWpvci9taW5vci4KKyMKKyMgU2VlIHRoZSBTZW1hbnRpYyBWZXJzaW9uaW5nIFNwZWNpZmljYXRpb24gKFNlbVZlcikgaHR0cDovL3NlbXZlci5vcmcuCitjb25zdCBzdHJpbmcgVkVSU0lPTiA9ICIxOS4yNC4wIgorCisKKyMKKyMgZGF0YSBzdHJ1Y3R1cmVzCisjCisKKy8qKiBCYXNpYyB1bml0IG9mIGRhdGEgd2l0aGluIGEgQ29sdW1uRmFtaWx5LgorICogQHBhcmFtIG5hbWUsIHRoZSBuYW1lIGJ5IHdoaWNoIHRoaXMgY29sdW1uIGlzIHNldCBhbmQgcmV0cmlldmVkLiAgTWF4aW11bSA2NEtCIGxvbmcuCisgKiBAcGFyYW0gdmFsdWUuIFRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZS4gIE1heGltdW0gMkdCIGxvbmcsIGJ1dCBpbiBwcmFjdGljZSB5b3Ugc2hvdWxkIGxpbWl0IGl0IHRvIHNtYWxsIG51bWJlcnMgb2YgTUIgKHNpbmNlIFRocmlmdCBtdXN0IHJlYWQgdGhlIGZ1bGwgdmFsdWUgaW50byBtZW1vcnkgdG8gb3BlcmF0ZSBvbiBpdCkuCisgKiBAcGFyYW0gdGltZXN0YW1wLiBUaGUgdGltZXN0YW1wIGlzIHVzZWQgZm9yIGNvbmZsaWN0IGRldGVjdGlvbi9yZXNvbHV0aW9uIHdoZW4gdHdvIGNvbHVtbnMgd2l0aCBzYW1lIG5hbWUgbmVlZCB0byBiZSBjb21wYXJlZC4KKyAqIEBwYXJhbSB0dGwuIEFuIG9wdGlvbmFsLCBwb3NpdGl2ZSBkZWxheSAoaW4gc2Vjb25kcykgYWZ0ZXIgd2hpY2ggdGhlIGNvbHVtbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4gCisgKi8KK3N0cnVjdCBDb2x1bW4geworICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAyOiBvcHRpb25hbCBiaW5hcnkgdmFsdWUsCisgICAzOiBvcHRpb25hbCBpNjQgdGltZXN0YW1wLAorICAgNDogb3B0aW9uYWwgaTMyIHR0bCwKK30KKworLyoqIEEgbmFtZWQgbGlzdCBvZiBjb2x1bW5zLgorICogQHBhcmFtIG5hbWUuIHNlZSBDb2x1bW4ubmFtZS4KKyAqIEBwYXJhbSBjb2x1bW5zLiBBIGNvbGxlY3Rpb24gb2Ygc3RhbmRhcmQgQ29sdW1ucy4gIFRoZSBjb2x1bW5zIHdpdGhpbiBhIHN1cGVyIGNvbHVtbiBhcmUgZGVmaW5lZCBpbiBhbiBhZGhvYyBtYW5uZXIuCisgKiAgICAgICAgICAgICAgICAgQ29sdW1ucyB3aXRoaW4gYSBzdXBlciBjb2x1bW4gZG8gbm90IGhhdmUgdG8gaGF2ZSBtYXRjaGluZyBzdHJ1Y3R1cmVzIChzaW1pbGFybHkgbmFtZWQgY2hpbGQgY29sdW1ucykuCisgKi8KK3N0cnVjdCBTdXBlckNvbHVtbiB7CisgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uPiBjb2x1bW5zLAorfQorCitzdHJ1Y3QgQ291bnRlckNvbHVtbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAgMjogcmVxdWlyZWQgaTY0IHZhbHVlCit9CisKK3N0cnVjdCBDb3VudGVyU3VwZXJDb2x1bW4geworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q291bnRlckNvbHVtbj4gY29sdW1ucworfQorCisvKioKKyAgICBNZXRob2RzIGZvciBmZXRjaGluZyByb3dzL3JlY29yZHMgZnJvbSBDYXNzYW5kcmEgd2lsbCByZXR1cm4gZWl0aGVyIGEgc2luZ2xlIGluc3RhbmNlIG9mIENvbHVtbk9yU3VwZXJDb2x1bW4gb3IgYSBsaXN0CisgICAgb2YgQ29sdW1uT3JTdXBlckNvbHVtbnMgKGdldF9zbGljZSgpKS4gSWYgeW91J3JlIGxvb2tpbmcgdXAgYSBTdXBlckNvbHVtbiAob3IgbGlzdCBvZiBTdXBlckNvbHVtbnMpIHRoZW4gdGhlIHJlc3VsdGluZworICAgIGluc3RhbmNlcyBvZiBDb2x1bW5PclN1cGVyQ29sdW1uIHdpbGwgaGF2ZSB0aGUgcmVxdWVzdGVkIFN1cGVyQ29sdW1uIGluIHRoZSBhdHRyaWJ1dGUgc3VwZXJfY29sdW1uLiBGb3IgcXVlcmllcyByZXN1bHRpbmcKKyAgICBpbiBDb2x1bW5zLCB0aG9zZSB2YWx1ZXMgd2lsbCBiZSBpbiB0aGUgYXR0cmlidXRlIGNvbHVtbi4gVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgYmV0d2VlbiAwLjMgYW5kIDAuNCB0byBzdGFuZGFyZGl6ZSBvbgorICAgIHNpbmdsZSBxdWVyeSBtZXRob2RzIHRoYXQgbWF5IHJldHVybiBlaXRoZXIgYSBTdXBlckNvbHVtbiBvciBDb2x1bW4uCisKKyAgICBJZiB0aGUgcXVlcnkgd2FzIG9uIGEgY291bnRlciBjb2x1bW4gZmFtaWx5LCB5b3Ugd2lsbCBlaXRoZXIgZ2V0IGEgY291bnRlcl9jb2x1bW4gKGluc3RlYWQgb2YgYSBjb2x1bW4pIG9yIGEgCisgICAgY291bnRlcl9zdXBlcl9jb2x1bW4gKGluc3RlYWQgb2YgYSBzdXBlcl9jb2x1bW4pCisKKyAgICBAcGFyYW0gY29sdW1uLiBUaGUgQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICAgIEBwYXJhbSBzdXBlcl9jb2x1bW4uIFRoZSBTdXBlckNvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAgICBAcGFyYW0gY291bnRlcl9jb2x1bW4uIFRoZSBDb3VudGVyb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgICAgQHBhcmFtIGNvdW50ZXJfc3VwZXJfY29sdW1uLiBUaGUgQ291bnRlclN1cGVyQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICovCitzdHJ1Y3QgQ29sdW1uT3JTdXBlckNvbHVtbiB7CisgICAgMTogb3B0aW9uYWwgQ29sdW1uIGNvbHVtbiwKKyAgICAyOiBvcHRpb25hbCBTdXBlckNvbHVtbiBzdXBlcl9jb2x1bW4sCisgICAgMzogb3B0aW9uYWwgQ291bnRlckNvbHVtbiBjb3VudGVyX2NvbHVtbiwKKyAgICA0OiBvcHRpb25hbCBDb3VudGVyU3VwZXJDb2x1bW4gY291bnRlcl9zdXBlcl9jb2x1bW4KK30KKworCisjCisjIEV4Y2VwdGlvbnMKKyMgKG5vdGUgdGhhdCBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JzIHdpbGwgcmFpc2UgYSBUQXBwbGljYXRpb25FeGNlcHRpb24sIGNvdXJ0ZXN5IG9mIFRocmlmdCkKKyMKKworLyoqIEEgc3BlY2lmaWMgY29sdW1uIHdhcyByZXF1ZXN0ZWQgdGhhdCBkb2VzIG5vdCBleGlzdC4gKi8KK2V4Y2VwdGlvbiBOb3RGb3VuZEV4Y2VwdGlvbiB7Cit9CisKKy8qKiBJbnZhbGlkIHJlcXVlc3QgY291bGQgbWVhbiBrZXlzcGFjZSBvciBjb2x1bW4gZmFtaWx5IGRvZXMgbm90IGV4aXN0LCByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLCBvciBhIHBhcmFtZXRlciBpcyBtYWxmb3JtZWQuIAorICAgIHdoeSBjb250YWlucyBhbiBhc3NvY2lhdGVkIGVycm9yIG1lc3NhZ2UuCisqLworZXhjZXB0aW9uIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBOb3QgYWxsIHRoZSByZXBsaWNhcyByZXF1aXJlZCBjb3VsZCBiZSBjcmVhdGVkIGFuZC9vciByZWFkLiAqLworZXhjZXB0aW9uIFVuYXZhaWxhYmxlRXhjZXB0aW9uIHsKK30KKworLyoqIFJQQyB0aW1lb3V0IHdhcyBleGNlZWRlZC4gIGVpdGhlciBhIG5vZGUgZmFpbGVkIG1pZC1vcGVyYXRpb24sIG9yIGxvYWQgd2FzIHRvbyBoaWdoLCBvciB0aGUgcmVxdWVzdGVkIG9wIHdhcyB0b28gbGFyZ2UuICovCitleGNlcHRpb24gVGltZWRPdXRFeGNlcHRpb24geworfQorCisvKiogaW52YWxpZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IChpbnZhbGlkIGtleXNwYWNlLCB1c2VyIGRvZXMgbm90IGV4aXN0LCBvciBjcmVkZW50aWFscyBpbnZhbGlkKSAqLworZXhjZXB0aW9uIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBpbnZhbGlkIGF1dGhvcml6YXRpb24gcmVxdWVzdCAodXNlciBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBrZXlzcGFjZSkgKi8KK2V4Y2VwdGlvbiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBzY2hlbWFzIGFyZSBub3QgaW4gYWdyZWVtZW50IGFjcm9zcyBhbGwgbm9kZXMgKi8KK2V4Y2VwdGlvbiBTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24geworfQorCisKKyMKKyMgc2VydmljZSBhcGkKKyMKKy8qKiAKKyAqIFRoZSBDb25zaXN0ZW5jeUxldmVsIGlzIGFuIGVudW0gdGhhdCBjb250cm9scyBib3RoIHJlYWQgYW5kIHdyaXRlCisgKiBiZWhhdmlvciBiYXNlZCBvbiB0aGUgUmVwbGljYXRpb25GYWN0b3Igb2YgdGhlIGtleXNwYWNlLiAgVGhlCisgKiBkaWZmZXJlbnQgY29uc2lzdGVuY3kgbGV2ZWxzIGhhdmUgZGlmZmVyZW50IG1lYW5pbmdzLCBkZXBlbmRpbmcgb24KKyAqIGlmIHlvdSdyZSBkb2luZyBhIHdyaXRlIG9yIHJlYWQgb3BlcmF0aW9uLiAKKyAqCisgKiBJZiBXICsgUiA+IFJlcGxpY2F0aW9uRmFjdG9yLCB3aGVyZSBXIGlzIHRoZSBudW1iZXIgb2Ygbm9kZXMgdG8KKyAqIGJsb2NrIGZvciBvbiB3cml0ZSwgYW5kIFIgdGhlIG51bWJlciB0byBibG9jayBmb3Igb24gcmVhZHMsIHlvdQorICogd2lsbCBoYXZlIHN0cm9uZ2x5IGNvbnNpc3RlbnQgYmVoYXZpb3I7IHRoYXQgaXMsIHJlYWRlcnMgd2lsbAorICogYWx3YXlzIHNlZSB0aGUgbW9zdCByZWNlbnQgd3JpdGUuIE9mIHRoZXNlLCB0aGUgbW9zdCBpbnRlcmVzdGluZyBpcworICogdG8gZG8gUVVPUlVNIHJlYWRzIGFuZCB3cml0ZXMsIHdoaWNoIGdpdmVzIHlvdSBjb25zaXN0ZW5jeSB3aGlsZQorICogc3RpbGwgYWxsb3dpbmcgYXZhaWxhYmlsaXR5IGluIHRoZSBmYWNlIG9mIG5vZGUgZmFpbHVyZXMgdXAgdG8gaGFsZgorICogb2YgPFJlcGxpY2F0aW9uRmFjdG9yPi4gT2YgY291cnNlIGlmIGxhdGVuY3kgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbgorICogY29uc2lzdGVuY3kgdGhlbiB5b3UgY2FuIHVzZSBsb3dlciB2YWx1ZXMgZm9yIGVpdGhlciBvciBib3RoLgorICogCisgKiBTb21lIENvbnNpc3RlbmN5TGV2ZWxzIChPTkUsIFRXTywgVEhSRUUpIHJlZmVyIHRvIGEgc3BlY2lmaWMgbnVtYmVyCisgKiBvZiByZXBsaWNhcyByYXRoZXIgdGhhbiBhIGxvZ2ljYWwgY29uY2VwdCB0aGF0IGFkanVzdHMKKyAqIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgcmVwbGljYXRpb24gZmFjdG9yLiAgT2YgdGhlc2UsIG9ubHkgT05FIGlzCisgKiBjb21tb25seSB1c2VkOyBUV08gYW5kIChldmVuIG1vcmUgcmFyZWx5KSBUSFJFRSBhcmUgb25seSB1c2VmdWwKKyAqIHdoZW4geW91IGNhcmUgbW9yZSBhYm91dCBndWFyYW50ZWVpbmcgYSBjZXJ0YWluIGxldmVsIG9mCisgKiBkdXJhYmlsaXR5LCB0aGFuIGNvbnNpc3RlbmN5LgorICogCisgKiBXcml0ZSBjb25zaXN0ZW5jeSBsZXZlbHMgbWFrZSB0aGUgZm9sbG93aW5nIGd1YXJhbnRlZXMgYmVmb3JlIHJlcG9ydGluZyBzdWNjZXNzIHRvIHRoZSBjbGllbnQ6CisgKiAgIEFOWSAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiBvbmNlIHNvbWV3aGVyZSwgaW5jbHVkaW5nIHBvc3NpYmx5IGJlaW5nIGhpbnRlZCBpbiBhIG5vbi10YXJnZXQgbm9kZS4KKyAqICAgT05FICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIGF0IGxlYXN0IDEgbm9kZSdzIGNvbW1pdCBsb2cgYW5kIG1lbW9yeSB0YWJsZQorICogICBUV08gICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXQgbGVhc3QgMiBub2RlJ3MgY29tbWl0IGxvZyBhbmQgbWVtb3J5IHRhYmxlCisgKiAgIFRIUkVFICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byBhdCBsZWFzdCAzIG5vZGUncyBjb21taXQgbG9nIGFuZCBtZW1vcnkgdGFibGUKKyAqICAgUVVPUlVNICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIDxSZXBsaWNhdGlvbkZhY3Rvcj4gLyAyICsgMSBub2RlcworICogICBMT0NBTF9RVU9SVU0gRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzLCB3aXRoaW4gdGhlIGxvY2FsIGRhdGFjZW50ZXIgKHJlcXVpcmVzIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5KQorICogICBFQUNIX1FVT1JVTSAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzIGluIGVhY2ggZGF0YWNlbnRlciAocmVxdWlyZXMgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kpCisgKiAgIEFMTCAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaXMgd3JpdHRlbiB0byA8Y29kZT4mbHQ7UmVwbGljYXRpb25GYWN0b3ImZ3Q7PC9jb2RlPiBub2RlcyBiZWZvcmUgcmVzcG9uZGluZyB0byB0aGUgY2xpZW50LgorICogCisgKiBSZWFkIGNvbnNpc3RlbmN5IGxldmVscyBtYWtlIHRoZSBmb2xsb3dpbmcgZ3VhcmFudGVlcyBiZWZvcmUgcmV0dXJuaW5nIHN1Y2Nlc3NmdWwgcmVzdWx0cyB0byB0aGUgY2xpZW50OgorICogICBBTlkgICAgICAgICAgTm90IHN1cHBvcnRlZC4gWW91IHByb2JhYmx5IHdhbnQgT05FIGluc3RlYWQuCisgKiAgIE9ORSAgICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgb2J0YWluZWQgZnJvbSBhIHNpbmdsZSByZXBsaWNhLgorICogICBUV08gICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIHR3byByZXBsaWNhcyBoYXZlIHJlcGxpZWQuCisgKiAgIFRIUkVFICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgdGhyZWUgcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBRVU9SVU0gICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBMT0NBTF9RVU9SVU0gUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgd2l0aGluIHRoZSBsb2NhbCBkYXRhY2VudGVyIGhhdmUgcmVwbGllZC4KKyAqICAgRUFDSF9RVU9SVU0gIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhIG1ham9yaXR5IG9mIHJlcGxpY2FzIHdpdGhpbiBlYWNoIGRhdGFjZW50ZXIgaGF2ZSByZXBsaWVkLgorICogICBBTEwgICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGFsbCByZXBsaWNhcyBoYXZlIHJlcGxpZWQgKGltcGxpZXMgbm8gcmVwbGljYSBtYXkgYmUgZG93bikuLgorKi8KK2VudW0gQ29uc2lzdGVuY3lMZXZlbCB7CisgICAgT05FID0gMSwKKyAgICBRVU9SVU0gPSAyLAorICAgIExPQ0FMX1FVT1JVTSA9IDMsCisgICAgRUFDSF9RVU9SVU0gPSA0LAorICAgIEFMTCA9IDUsCisgICAgQU5ZID0gNiwKKyAgICBUV08gPSA3LAorICAgIFRIUkVFID0gOCwKK30KKworLyoqCisgICAgQ29sdW1uUGFyZW50IGlzIHVzZWQgd2hlbiBzZWxlY3RpbmcgZ3JvdXBzIG9mIGNvbHVtbnMgZnJvbSB0aGUgc2FtZSBDb2x1bW5GYW1pbHkuIEluIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGVybXMsIGltYWdpbmUKKyAgICBDb2x1bW5QYXJlbnQgYXMgQ29sdW1uUGF0aCArICcvLi4vJy4KKworICAgIFNlZSBhbHNvIDxhIGhyZWY9ImNhc3NhbmRyYS5odG1sI1N0cnVjdF9Db2x1bW5QYXRoIj5Db2x1bW5QYXRoPC9hPgorICovCitzdHJ1Y3QgQ29sdW1uUGFyZW50IHsKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgY29sdW1uX2ZhbWlseSwKKyAgICA0OiBvcHRpb25hbCBiaW5hcnkgc3VwZXJfY29sdW1uLAorfQorCisvKiogVGhlIENvbHVtblBhdGggaXMgdGhlIHBhdGggdG8gYSBzaW5nbGUgY29sdW1uIGluIENhc3NhbmRyYS4gSXQgbWlnaHQgbWFrZSBzZW5zZSB0byB0aGluayBvZiBDb2x1bW5QYXRoIGFuZAorICogQ29sdW1uUGFyZW50IGluIHRlcm1zIG9mIGEgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqCisgKiBDb2x1bW5QYXRoIGlzIHVzZWQgdG8gbG9va2luZyB1cCBhIHNpbmdsZSBjb2x1bW4uCisgKgorICogQHBhcmFtIGNvbHVtbl9mYW1pbHkuIFRoZSBuYW1lIG9mIHRoZSBDRiBvZiB0aGUgY29sdW1uIGJlaW5nIGxvb2tlZCB1cC4KKyAqIEBwYXJhbSBzdXBlcl9jb2x1bW4uIFRoZSBzdXBlciBjb2x1bW4gbmFtZS4KKyAqIEBwYXJhbSBjb2x1bW4uIFRoZSBjb2x1bW4gbmFtZS4KKyAqLworc3RydWN0IENvbHVtblBhdGggeworICAgIDM6IHJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5LAorICAgIDQ6IG9wdGlvbmFsIGJpbmFyeSBzdXBlcl9jb2x1bW4sCisgICAgNTogb3B0aW9uYWwgYmluYXJ5IGNvbHVtbiwKK30KKworLyoqCisgICAgQSBzbGljZSByYW5nZSBpcyBhIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBiYXNpYyByYW5nZSwgb3JkZXJpbmcgYW5kIGxpbWl0IGluZm9ybWF0aW9uIGZvciBhIHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4KKyAgICBtdWx0aXBsZSBjb2x1bW5zLiBJdCBjb3VsZCBiZSB0aG91Z2h0IG9mIGFzIENhc3NhbmRyYSdzIHZlcnNpb24gb2YgTElNSVQgYW5kIE9SREVSIEJZCisKKyAgICBAcGFyYW0gc3RhcnQuIFRoZSBjb2x1bW4gbmFtZSB0byBzdGFydCB0aGUgc2xpY2Ugd2l0aC4gVGhpcyBhdHRyaWJ1dGUgaXMgbm90IHJlcXVpcmVkLCB0aG91Z2ggdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGFuZCBjYW4gYmUgc2FmZWx5IHNldCB0byAnJywgaS5lLiwgYW4gZW1wdHkgYnl0ZSBhcnJheSwgdG8gc3RhcnQgd2l0aCB0aGUgZmlyc3QgY29sdW1uIG5hbWUuIE90aGVyd2lzZSwgaXQKKyAgICAgICAgICAgICAgICAgIG11c3QgYSB2YWxpZCB2YWx1ZSB1bmRlciB0aGUgcnVsZXMgb2YgdGhlIENvbXBhcmF0b3IgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIENvbHVtbkZhbWlseS4KKyAgICBAcGFyYW0gZmluaXNoLiBUaGUgY29sdW1uIG5hbWUgdG8gc3RvcCB0aGUgc2xpY2UgYXQuIFRoaXMgYXR0cmlidXRlIGlzIG5vdCByZXF1aXJlZCwgdGhvdWdoIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgYW5kIGNhbiBiZSBzYWZlbHkgc2V0IHRvIGFuIGVtcHR5IGJ5dGUgYXJyYXkgdG8gbm90IHN0b3AgdW50aWwgJ2NvdW50JyByZXN1bHRzIGFyZSBzZWVuLiBPdGhlcndpc2UsIGl0CisgICAgICAgICAgICAgICAgICAgbXVzdCBhbHNvIGJlIGEgdmFsaWQgdmFsdWUgdG8gdGhlIENvbHVtbkZhbWlseSBDb21wYXJhdG9yLgorICAgIEBwYXJhbSByZXZlcnNlZC4gV2hldGhlciB0aGUgcmVzdWx0cyBzaG91bGQgYmUgb3JkZXJlZCBpbiByZXZlcnNlZCBvcmRlci4gU2ltaWxhciB0byBPUkRFUiBCWSBibGFoIERFU0MgaW4gU1FMLgorICAgIEBwYXJhbSBjb3VudC4gSG93IG1hbnkgY29sdW1ucyB0byByZXR1cm4uIFNpbWlsYXIgdG8gTElNSVQgaW4gU1FMLiBNYXkgYmUgYXJiaXRyYXJpbHkgbGFyZ2UsIGJ1dCBUaHJpZnQgd2lsbAorICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxpemUgdGhlIHdob2xlIHJlc3VsdCBpbnRvIG1lbW9yeSBiZWZvcmUgcmV0dXJuaW5nIGl0IHRvIHRoZSBjbGllbnQsIHNvIGJlIGF3YXJlIHRoYXQgeW91IG1heQorICAgICAgICAgICAgICAgICAgYmUgYmV0dGVyIHNlcnZlZCBieSBpdGVyYXRpbmcgdGhyb3VnaCBzbGljZXMgYnkgcGFzc2luZyB0aGUgbGFzdCB2YWx1ZSBvZiBvbmUgY2FsbCBpbiBhcyB0aGUgJ3N0YXJ0JworICAgICAgICAgICAgICAgICAgb2YgdGhlIG5leHQgaW5zdGVhZCBvZiBpbmNyZWFzaW5nICdjb3VudCcgYXJiaXRyYXJpbHkgbGFyZ2UuCisgKi8KK3N0cnVjdCBTbGljZVJhbmdlIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgc3RhcnQsCisgICAgMjogcmVxdWlyZWQgYmluYXJ5IGZpbmlzaCwKKyAgICAzOiByZXF1aXJlZCBib29sIHJldmVyc2VkPTAsCisgICAgNDogcmVxdWlyZWQgaTMyIGNvdW50PTEwMCwKK30KKworLyoqCisgICAgQSBTbGljZVByZWRpY2F0ZSBpcyBzaW1pbGFyIHRvIGEgbWF0aGVtYXRpYyBwcmVkaWNhdGUgKHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByZWRpY2F0ZV8obWF0aGVtYXRpY2FsX2xvZ2ljKSksCisgICAgd2hpY2ggaXMgZGVzY3JpYmVkIGFzICJhIHByb3BlcnR5IHRoYXQgdGhlIGVsZW1lbnRzIG9mIGEgc2V0IGhhdmUgaW4gY29tbW9uLiIKKworICAgIFNsaWNlUHJlZGljYXRlJ3MgaW4gQ2Fzc2FuZHJhIGFyZSBkZXNjcmliZWQgd2l0aCBlaXRoZXIgYSBsaXN0IG9mIGNvbHVtbl9uYW1lcyBvciBhIFNsaWNlUmFuZ2UuICBJZiBjb2x1bW5fbmFtZXMgaXMKKyAgICBzcGVjaWZpZWQsIHNsaWNlX3JhbmdlIGlzIGlnbm9yZWQuCisKKyAgICBAcGFyYW0gY29sdW1uX25hbWUuIEEgbGlzdCBvZiBjb2x1bW4gbmFtZXMgdG8gcmV0cmlldmUuIFRoaXMgY2FuIGJlIHVzZWQgc2ltaWxhciB0byBNZW1jYWNoZWQncyAibXVsdGktZ2V0IiBmZWF0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICB0byBmZXRjaCBOIGtub3duIGNvbHVtbiBuYW1lcy4gRm9yIGluc3RhbmNlLCBpZiB5b3Uga25vdyB5b3Ugd2lzaCB0byBmZXRjaCBjb2x1bW5zICdKb2UnLCAnSmFjaycsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgJ0ppbScgeW91IGNhbiBwYXNzIHRob3NlIGNvbHVtbiBuYW1lcyBhcyBhIGxpc3QgdG8gZmV0Y2ggYWxsIHRocmVlIGF0IG9uY2UuCisgICAgQHBhcmFtIHNsaWNlX3JhbmdlLiBBIFNsaWNlUmFuZ2UgZGVzY3JpYmluZyBob3cgdG8gcmFuZ2UsIG9yZGVyLCBhbmQvb3IgbGltaXQgdGhlIHNsaWNlLgorICovCitzdHJ1Y3QgU2xpY2VQcmVkaWNhdGUgeworICAgIDE6IG9wdGlvbmFsIGxpc3Q8YmluYXJ5PiBjb2x1bW5fbmFtZXMsCisgICAgMjogb3B0aW9uYWwgU2xpY2VSYW5nZSAgIHNsaWNlX3JhbmdlLAorfQorCitlbnVtIEluZGV4T3BlcmF0b3IgeworICAgIEVRLAorICAgIEdURSwKKyAgICBHVCwKKyAgICBMVEUsCisgICAgTFQKK30KKworc3RydWN0IEluZGV4RXhwcmVzc2lvbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGNvbHVtbl9uYW1lLAorICAgIDI6IHJlcXVpcmVkIEluZGV4T3BlcmF0b3Igb3AsCisgICAgMzogcmVxdWlyZWQgYmluYXJ5IHZhbHVlLAorfQorCitzdHJ1Y3QgSW5kZXhDbGF1c2UgeworICAgIDE6IHJlcXVpcmVkIGxpc3Q8SW5kZXhFeHByZXNzaW9uPiBleHByZXNzaW9ucworICAgIDI6IHJlcXVpcmVkIGJpbmFyeSBzdGFydF9rZXksCisgICAgMzogcmVxdWlyZWQgaTMyIGNvdW50PTEwMCwKK30KKworLyoqCitUaGUgc2VtYW50aWNzIG9mIHN0YXJ0IGtleXMgYW5kIHRva2VucyBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50LgorS2V5cyBhcmUgc3RhcnQtaW5jbHVzaXZlOyB0b2tlbnMgYXJlIHN0YXJ0LWV4Y2x1c2l2ZS4gIFRva2VuCityYW5nZXMgbWF5IGFsc28gd3JhcCAtLSB0aGF0IGlzLCB0aGUgZW5kIHRva2VuIG1heSBiZSBsZXNzCit0aGFuIHRoZSBzdGFydCBvbmUuICBUaHVzLCBhIHJhbmdlIGZyb20ga2V5WCB0byBrZXlYIGlzIGEKK29uZS1lbGVtZW50IHJhbmdlLCBidXQgYSByYW5nZSBmcm9tIHRva2VuWSB0byB0b2tlblkgaXMgdGhlCitmdWxsIHJpbmcuCisqLworc3RydWN0IEtleVJhbmdlIHsKKyAgICAxOiBvcHRpb25hbCBiaW5hcnkgc3RhcnRfa2V5LAorICAgIDI6IG9wdGlvbmFsIGJpbmFyeSBlbmRfa2V5LAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyBzdGFydF90b2tlbiwKKyAgICA0OiBvcHRpb25hbCBzdHJpbmcgZW5kX3Rva2VuLAorICAgIDU6IHJlcXVpcmVkIGkzMiBjb3VudD0xMDAKK30KKworLyoqCisgICAgQSBLZXlTbGljZSBpcyBrZXkgZm9sbG93ZWQgYnkgdGhlIGRhdGEgaXQgbWFwcyB0by4gQSBjb2xsZWN0aW9uIG9mIEtleVNsaWNlIGlzIHJldHVybmVkIGJ5IHRoZSBnZXRfcmFuZ2Vfc2xpY2Ugb3BlcmF0aW9uLgorCisgICAgQHBhcmFtIGtleS4gYSByb3cga2V5CisgICAgQHBhcmFtIGNvbHVtbnMuIExpc3Qgb2YgZGF0YSByZXByZXNlbnRlZCBieSB0aGUga2V5LiBUeXBpY2FsbHksIHRoZSBsaXN0IGlzIHBhcmVkIGRvd24gdG8gb25seSB0aGUgY29sdW1ucyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgYSBTbGljZVByZWRpY2F0ZS4KKyAqLworc3RydWN0IEtleVNsaWNlIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4gY29sdW1ucywKK30KKworc3RydWN0IEtleUNvdW50IHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGkzMiBjb3VudAorfQorCisvKioKKyAqIE5vdGUgdGhhdCB0aGUgdGltZXN0YW1wIGlzIG9ubHkgb3B0aW9uYWwgaW4gY2FzZSBvZiBjb3VudGVyIGRlbGV0aW9uLgorICovCitzdHJ1Y3QgRGVsZXRpb24geworICAgIDE6IG9wdGlvbmFsIGk2NCB0aW1lc3RhbXAsCisgICAgMjogb3B0aW9uYWwgYmluYXJ5IHN1cGVyX2NvbHVtbiwKKyAgICAzOiBvcHRpb25hbCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCit9CisKKy8qKgorICAgIEEgTXV0YXRpb24gaXMgZWl0aGVyIGFuIGluc2VydCAocmVwcmVzZW50ZWQgYnkgZmlsbGluZyBjb2x1bW5fb3Jfc3VwZXJjb2x1bW4pIG9yIGEgZGVsZXRpb24gKHJlcHJlc2VudGVkIGJ5IGZpbGxpbmcgdGhlIGRlbGV0aW9uIGF0dHJpYnV0ZSkuCisgICAgQHBhcmFtIGNvbHVtbl9vcl9zdXBlcmNvbHVtbi4gQW4gaW5zZXJ0IHRvIGEgY29sdW1uIG9yIHN1cGVyY29sdW1uIChwb3NzaWJseSBjb3VudGVyIGNvbHVtbiBvciBzdXBlcmNvbHVtbikKKyAgICBAcGFyYW0gZGVsZXRpb24uIEEgZGVsZXRpb24gb2YgYSBjb2x1bW4gb3Igc3VwZXJjb2x1bW4KKyovCitzdHJ1Y3QgTXV0YXRpb24geworICAgIDE6IG9wdGlvbmFsIENvbHVtbk9yU3VwZXJDb2x1bW4gY29sdW1uX29yX3N1cGVyY29sdW1uLAorICAgIDI6IG9wdGlvbmFsIERlbGV0aW9uIGRlbGV0aW9uLAorfQorCitzdHJ1Y3QgRW5kcG9pbnREZXRhaWxzIHsKKyAgICAxOiBzdHJpbmcgaG9zdCwKKyAgICAyOiBzdHJpbmcgZGF0YWNlbnRlciwKKyAgICAzOiBvcHRpb25hbCBzdHJpbmcgcmFjaworfQorCisvKioKKyAgICBBIFRva2VuUmFuZ2UgZGVzY3JpYmVzIHBhcnQgb2YgdGhlIENhc3NhbmRyYSByaW5nLCBpdCBpcyBhIG1hcHBpbmcgZnJvbSBhIHJhbmdlIHRvCisgICAgZW5kcG9pbnRzIHJlc3BvbnNpYmxlIGZvciB0aGF0IHJhbmdlLgorICAgIEBwYXJhbSBzdGFydF90b2tlbiBUaGUgZmlyc3QgdG9rZW4gaW4gdGhlIHJhbmdlCisgICAgQHBhcmFtIGVuZF90b2tlbiBUaGUgbGFzdCB0b2tlbiBpbiB0aGUgcmFuZ2UKKyAgICBAcGFyYW0gZW5kcG9pbnRzIFRoZSBlbmRwb2ludHMgcmVzcG9uc2libGUgZm9yIHRoZSByYW5nZSAobGlzdGVkIGJ5IHRoZWlyIGNvbmZpZ3VyZWQgbGlzdGVuX2FkZHJlc3MpCisgICAgQHBhcmFtIHJwY19lbmRwb2ludHMgVGhlIGVuZHBvaW50cyByZXNwb25zaWJsZSBmb3IgdGhlIHJhbmdlIChsaXN0ZWQgYnkgdGhlaXIgY29uZmlndXJlZCBycGNfYWRkcmVzcykKKyovCitzdHJ1Y3QgVG9rZW5SYW5nZSB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHN0YXJ0X3Rva2VuLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBlbmRfdG9rZW4sCisgICAgMzogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IGVuZHBvaW50cywKKyAgICA0OiBvcHRpb25hbCBsaXN0PHN0cmluZz4gcnBjX2VuZHBvaW50cworICAgIDU6IG9wdGlvbmFsIGxpc3Q8RW5kcG9pbnREZXRhaWxzPiBlbmRwb2ludF9kZXRhaWxzLAorfQorCisvKioKKyAgICBBdXRoZW50aWNhdGlvbiByZXF1ZXN0cyBjYW4gY29udGFpbiBhbnkgZGF0YSwgZGVwZW5kZW50IG9uIHRoZSBJQXV0aGVudGljYXRvciB1c2VkCisqLworc3RydWN0IEF1dGhlbnRpY2F0aW9uUmVxdWVzdCB7CisgICAgMTogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiBjcmVkZW50aWFscworfQorCitlbnVtIEluZGV4VHlwZSB7CisgICAgS0VZUywKKyAgICBDVVNUT00KK30KKworLyogZGVzY3JpYmVzIGEgY29sdW1uIGluIGEgY29sdW1uIGZhbWlseS4gKi8KK3N0cnVjdCBDb2x1bW5EZWYgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyB2YWxpZGF0aW9uX2NsYXNzLAorICAgIDM6IG9wdGlvbmFsIEluZGV4VHlwZSBpbmRleF90eXBlLAorICAgIDQ6IG9wdGlvbmFsIHN0cmluZyBpbmRleF9uYW1lLAorICAgIDU6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBpbmRleF9vcHRpb25zCit9CisKKworLyogZGVzY3JpYmVzIGEgY29sdW1uIGZhbWlseS4gKi8KK3N0cnVjdCBDZkRlZiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBuYW1lLAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyBjb2x1bW5fdHlwZT0iU3RhbmRhcmQiLAorICAgIDU6IG9wdGlvbmFsIHN0cmluZyBjb21wYXJhdG9yX3R5cGU9IkJ5dGVzVHlwZSIsCisgICAgNjogb3B0aW9uYWwgc3RyaW5nIHN1YmNvbXBhcmF0b3JfdHlwZSwKKyAgICA4OiBvcHRpb25hbCBzdHJpbmcgY29tbWVudCwKKyAgICAxMjogb3B0aW9uYWwgZG91YmxlIHJlYWRfcmVwYWlyX2NoYW5jZT0xLjAsCisgICAgMTM6IG9wdGlvbmFsIGxpc3Q8Q29sdW1uRGVmPiBjb2x1bW5fbWV0YWRhdGEsCisgICAgMTQ6IG9wdGlvbmFsIGkzMiBnY19ncmFjZV9zZWNvbmRzLAorICAgIDE1OiBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWxpZGF0aW9uX2NsYXNzLAorICAgIDE2OiBvcHRpb25hbCBpMzIgaWQsCisgICAgMTc6IG9wdGlvbmFsIGkzMiBtaW5fY29tcGFjdGlvbl90aHJlc2hvbGQsCisgICAgMTg6IG9wdGlvbmFsIGkzMiBtYXhfY29tcGFjdGlvbl90aHJlc2hvbGQsCisgICAgMjQ6IG9wdGlvbmFsIGJvb2wgcmVwbGljYXRlX29uX3dyaXRlLAorICAgIDI1OiBvcHRpb25hbCBkb3VibGUgbWVyZ2Vfc2hhcmRzX2NoYW5jZSwKKyAgICAyNjogb3B0aW9uYWwgc3RyaW5nIGtleV92YWxpZGF0aW9uX2NsYXNzLAorICAgIDI4OiBvcHRpb25hbCBiaW5hcnkga2V5X2FsaWFzLAorICAgIDI5OiBvcHRpb25hbCBzdHJpbmcgY29tcGFjdGlvbl9zdHJhdGVneSwKKyAgICAzMDogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGNvbXBhY3Rpb25fc3RyYXRlZ3lfb3B0aW9ucywKKyAgICAzMjogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGNvbXByZXNzaW9uX29wdGlvbnMsCisgICAgMzM6IG9wdGlvbmFsIGRvdWJsZSBibG9vbV9maWx0ZXJfZnBfY2hhbmNlLAorfQorCisvKiBkZXNjcmliZXMgYSBrZXlzcGFjZS4gKi8KK3N0cnVjdCBLc0RlZiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUsCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIHN0cmF0ZWd5X2NsYXNzLAorICAgIDM6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBzdHJhdGVneV9vcHRpb25zLAorCisgICAgLyoqIEBkZXByZWNhdGVkICovCisgICAgNDogb3B0aW9uYWwgaTMyIHJlcGxpY2F0aW9uX2ZhY3RvciwgCisKKyAgICA1OiByZXF1aXJlZCBsaXN0PENmRGVmPiBjZl9kZWZzLAorICAgIDY6IG9wdGlvbmFsIGJvb2wgZHVyYWJsZV93cml0ZXM9MSwKK30KKworLyoqIENRTCBxdWVyeSBjb21wcmVzc2lvbiAqLworZW51bSBDb21wcmVzc2lvbiB7CisgICAgR1pJUCA9IDEsCisgICAgTk9ORSA9IDIKK30KKworZW51bSBDcWxSZXN1bHRUeXBlIHsKKyAgICBST1dTID0gMSwKKyAgICBWT0lEID0gMiwKKyAgICBJTlQgPSAzCit9CisKKy8qKiBSb3cgcmV0dXJuZWQgZnJvbSBhIENRTCBxdWVyeSAqLworc3RydWN0IENxbFJvdyB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAyOiByZXF1aXJlZCBsaXN0PENvbHVtbj4gY29sdW1ucworfQorCitzdHJ1Y3QgQ3FsTWV0YWRhdGEgeworICAgIDE6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiBuYW1lX3R5cGVzLAorICAgIDI6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiB2YWx1ZV90eXBlcywKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgZGVmYXVsdF9uYW1lX3R5cGUsCisgICAgNDogcmVxdWlyZWQgc3RyaW5nIGRlZmF1bHRfdmFsdWVfdHlwZQorfQorCitzdHJ1Y3QgQ3FsUmVzdWx0IHsKKyAgICAxOiByZXF1aXJlZCBDcWxSZXN1bHRUeXBlIHR5cGUsCisgICAgMjogb3B0aW9uYWwgbGlzdDxDcWxSb3c+IHJvd3MsCisgICAgMzogb3B0aW9uYWwgaTMyIG51bSwKKyAgICA0OiBvcHRpb25hbCBDcWxNZXRhZGF0YSBzY2hlbWEKK30KKworc3RydWN0IENxbFByZXBhcmVkUmVzdWx0IHsKKyAgICAxOiByZXF1aXJlZCBpMzIgaXRlbUlkLAorICAgIDI6IHJlcXVpcmVkIGkzMiBjb3VudAorfQorCisKK3NlcnZpY2UgQ2Fzc2FuZHJhIHsKKyAgIyBhdXRoIG1ldGhvZHMKKyAgdm9pZCBsb2dpbigxOiByZXF1aXJlZCBBdXRoZW50aWNhdGlvblJlcXVlc3QgYXV0aF9yZXF1ZXN0KSB0aHJvd3MgKDE6QXV0aGVudGljYXRpb25FeGNlcHRpb24gYXV0aG54LCAyOkF1dGhvcml6YXRpb25FeGNlcHRpb24gYXV0aHp4KSwKKyAKKyAgIyBzZXQga2V5c3BhY2UKKyAgdm9pZCBzZXRfa2V5c3BhY2UoMTogcmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKSB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKyAgCisgICMgcmV0cmlldmFsIG1ldGhvZHMKKworICAvKioKKyAgICBHZXQgdGhlIENvbHVtbiBvciBTdXBlckNvbHVtbiBhdCB0aGUgZ2l2ZW4gY29sdW1uX3BhdGguIElmIG5vIHZhbHVlIGlzIHByZXNlbnQsIE5vdEZvdW5kRXhjZXB0aW9uIGlzIHRocm93bi4gKFRoaXMgaXMKKyAgICB0aGUgb25seSBtZXRob2QgdGhhdCBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIHVuZGVyIG5vbi1mYWlsdXJlIGNvbmRpdGlvbnMuKQorICAgKi8KKyAgQ29sdW1uT3JTdXBlckNvbHVtbiBnZXQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhdGggY29sdW1uX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOk5vdEZvdW5kRXhjZXB0aW9uIG5mZSwgMzpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgNDpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgR2V0IHRoZSBncm91cCBvZiBjb2x1bW5zIGNvbnRhaW5lZCBieSBjb2x1bW5fcGFyZW50IChlaXRoZXIgYSBDb2x1bW5GYW1pbHkgbmFtZSBvciBhIENvbHVtbkZhbWlseS9TdXBlckNvbHVtbiBuYW1lCisgICAgcGFpcikgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBTbGljZVByZWRpY2F0ZS4gSWYgbm8gbWF0Y2hpbmcgdmFsdWVzIGFyZSBmb3VuZCwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KKyAgICovCisgIGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4gZ2V0X3NsaWNlKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBtYXRjaGluZyA8Y29kZT5wcmVkaWNhdGU8L2NvZGU+IGZvciBhIHBhcnRpY3VsYXIgPGNvZGU+a2V5PC9jb2RlPiwgCisgICAgPGNvZGU+Q29sdW1uRmFtaWx5PC9jb2RlPiBhbmQgb3B0aW9uYWxseSA8Y29kZT5TdXBlckNvbHVtbjwvY29kZT4uCisgICovCisgIGkzMiBnZXRfY291bnQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBQZXJmb3JtcyBhIGdldF9zbGljZSBmb3IgY29sdW1uX3BhcmVudCBhbmQgcHJlZGljYXRlIGZvciB0aGUgZ2l2ZW4ga2V5cyBpbiBwYXJhbGxlbC4KKyAgKi8KKyAgbWFwPGJpbmFyeSxsaXN0PENvbHVtbk9yU3VwZXJDb2x1bW4+PiBtdWx0aWdldF9zbGljZSgxOnJlcXVpcmVkIGxpc3Q8YmluYXJ5PiBrZXlzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIFBlcmZvcm0gYSBnZXRfY291bnQgaW4gcGFyYWxsZWwgb24gdGhlIGdpdmVuIGxpc3Q8YmluYXJ5PiBrZXlzLiBUaGUgcmV0dXJuIHZhbHVlIG1hcHMga2V5cyB0byB0aGUgY291bnQgZm91bmQuCisgICovCisgIG1hcDxiaW5hcnksIGkzMj4gbXVsdGlnZXRfY291bnQoMTpyZXF1aXJlZCBsaXN0PGJpbmFyeT4ga2V5cywKKyAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgcmV0dXJucyBhIHN1YnNldCBvZiBjb2x1bW5zIGZvciBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2Yga2V5cy4KKyAgKi8KKyAgbGlzdDxLZXlTbGljZT4gZ2V0X3JhbmdlX3NsaWNlcygxOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIEtleVJhbmdlIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqIFJldHVybnMgdGhlIHN1YnNldCBvZiBjb2x1bW5zIHNwZWNpZmllZCBpbiBTbGljZVByZWRpY2F0ZSBmb3IgdGhlIHJvd3MgbWF0Y2hpbmcgdGhlIEluZGV4Q2xhdXNlICovCisgIGxpc3Q8S2V5U2xpY2U+IGdldF9pbmRleGVkX3NsaWNlcygxOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBJbmRleENsYXVzZSBpbmRleF9jbGF1c2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIGNvbHVtbl9wcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgICMgbW9kaWZpY2F0aW9uIG1ldGhvZHMKKworICAvKioKKyAgICogSW5zZXJ0IGEgQ29sdW1uIGF0IHRoZSBnaXZlbiBjb2x1bW5fcGFyZW50LmNvbHVtbl9mYW1pbHkgYW5kIG9wdGlvbmFsIGNvbHVtbl9wYXJlbnQuc3VwZXJfY29sdW1uLgorICAgKi8KKyAgdm9pZCBpbnNlcnQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgICAgMzpyZXF1aXJlZCBDb2x1bW4gY29sdW1uLAorICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAqIEluY3JlbWVudCBvciBkZWNyZW1lbnQgYSBjb3VudGVyLgorICAgKi8KKyAgdm9pZCBhZGQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAzOnJlcXVpcmVkIENvdW50ZXJDb2x1bW4gY29sdW1uLAorICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgUmVtb3ZlIGRhdGEgZnJvbSB0aGUgcm93IHNwZWNpZmllZCBieSBrZXkgYXQgdGhlIGdyYW51bGFyaXR5IHNwZWNpZmllZCBieSBjb2x1bW5fcGF0aCwgYW5kIHRoZSBnaXZlbiB0aW1lc3RhbXAuIE5vdGUKKyAgICB0aGF0IGFsbCB0aGUgdmFsdWVzIGluIGNvbHVtbl9wYXRoIGJlc2lkZXMgY29sdW1uX3BhdGguY29sdW1uX2ZhbWlseSBhcmUgdHJ1bHkgb3B0aW9uYWw6IHlvdSBjYW4gcmVtb3ZlIHRoZSBlbnRpcmUKKyAgICByb3cgYnkganVzdCBzcGVjaWZ5aW5nIHRoZSBDb2x1bW5GYW1pbHksIG9yIHlvdSBjYW4gcmVtb3ZlIGEgU3VwZXJDb2x1bW4gb3IgYSBzaW5nbGUgQ29sdW1uIGJ5IHNwZWNpZnlpbmcgdGhvc2UgbGV2ZWxzIHRvby4KKyAgICovCisgIHZvaWQgcmVtb3ZlKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXRoIGNvbHVtbl9wYXRoLAorICAgICAgICAgICAgICAzOnJlcXVpcmVkIGk2NCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgIDQ6Q29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICogUmVtb3ZlIGEgY291bnRlciBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgKiBOb3RlIHRoYXQgY291bnRlcnMgaGF2ZSBsaW1pdGVkIHN1cHBvcnQgZm9yIGRlbGV0ZXM6IGlmIHlvdSByZW1vdmUgYSBjb3VudGVyLCB5b3UgbXVzdCB3YWl0IHRvIGlzc3VlIGFueSBmb2xsb3dpbmcgdXBkYXRlCisgICAqIHVudGlsIHRoZSBkZWxldGUgaGFzIHJlYWNoZWQgYWxsIHRoZSBub2RlcyBhbmQgYWxsIG9mIHRoZW0gaGF2ZSBiZWVuIGZ1bGx5IGNvbXBhY3RlZC4KKyAgICovCisgIHZvaWQgcmVtb3ZlX2NvdW50ZXIoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGF0aCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisKKyAgLyoqCisgICAgTXV0YXRlIG1hbnkgY29sdW1ucyBvciBzdXBlciBjb2x1bW5zIGZvciBtYW55IHJvdyBrZXlzLiBTZWUgYWxzbzogTXV0YXRpb24uCisKKyAgICBtdXRhdGlvbl9tYXAgbWFwcyBrZXkgdG8gY29sdW1uIGZhbWlseSB0byBhIGxpc3Qgb2YgTXV0YXRpb24gb2JqZWN0cyB0byB0YWtlIHBsYWNlIGF0IHRoYXQgc2NvcGUuCisgICoqLworICB2b2lkIGJhdGNoX211dGF0ZSgxOnJlcXVpcmVkIG1hcDxiaW5hcnksIG1hcDxzdHJpbmcsIGxpc3Q8TXV0YXRpb24+Pj4gbXV0YXRpb25fbWFwLAorICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisgICAgICAgCisgIC8qKgorICAgVHJ1bmNhdGUgd2lsbCBtYXJrIGFuZCBlbnRpcmUgY29sdW1uIGZhbWlseSBhcyBkZWxldGVkLgorICAgRnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRydW5jYXRlIHdpbGwgcmVzdWx0IGNvbXBsZXRlIGRhdGEgZGVsZXRpb24gZnJvbSBjZm5hbWUuCisgICBJbnRlcm5hbGx5LCBob3dldmVyLCBkaXNrIHNwYWNlIHdpbGwgbm90IGJlIGltbWVkaWF0aWx5IHJlbGVhc2VkLCBhcyB3aXRoIGFsbCBkZWxldGVzIGluIGNhc3NhbmRyYSwgdGhpcyBvbmUKKyAgIG9ubHkgbWFya3MgdGhlIGRhdGEgYXMgZGVsZXRlZC4KKyAgIFRoZSBvcGVyYXRpb24gc3VjY2VlZHMgb25seSBpZiBhbGwgaG9zdHMgaW4gdGhlIGNsdXN0ZXIgYXQgYXZhaWxhYmxlIGFuZCB3aWxsIHRocm93IGFuIFVuYXZhaWxhYmxlRXhjZXB0aW9uIGlmIAorICAgc29tZSBob3N0cyBhcmUgZG93bi4KKyAgKi8KKyAgdm9pZCB0cnVuY2F0ZSgxOnJlcXVpcmVkIHN0cmluZyBjZm5hbWUpCisgICAgICAgdGhyb3dzICgxOiBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6IFVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOiBUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKworICAgIAorICAvLyBNZXRhLUFQSXMgLS0gQVBJcyB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGUgb3IgY2x1c3RlciwKKyAgLy8gcmF0aGVyIHRoYW4gdXNlciBkYXRhLiAgVGhlIG5vZGVwcm9iZSBwcm9ncmFtIHByb3ZpZGVzIHVzYWdlIGV4YW1wbGVzLgorICAKKyAgLyoqIAorICAgKiBmb3IgZWFjaCBzY2hlbWEgdmVyc2lvbiBwcmVzZW50IGluIHRoZSBjbHVzdGVyLCByZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBhdCB0aGF0IHZlcnNpb24uCisgICAqIGhvc3RzIHRoYXQgZG8gbm90IHJlc3BvbmQgd2lsbCBiZSB1bmRlciB0aGUga2V5IERhdGFiYXNlRGVzY3JpcHRvci5JTklUSUFMX1ZFUlNJT04uIAorICAgKiB0aGUgY2x1c3RlciBpcyBhbGwgb24gdGhlIHNhbWUgdmVyc2lvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgbWFwIGlzIDEuIAorICAgKi8KKyAgbWFwPHN0cmluZywgbGlzdDxzdHJpbmc+PiBkZXNjcmliZV9zY2hlbWFfdmVyc2lvbnMoKQorICAgICAgIHRocm93cyAoMTogSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogbGlzdCB0aGUgZGVmaW5lZCBrZXlzcGFjZXMgaW4gdGhpcyBjbHVzdGVyICovCisgIGxpc3Q8S3NEZWY+IGRlc2NyaWJlX2tleXNwYWNlcygpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGdldCB0aGUgY2x1c3RlciBuYW1lICovCisgIHN0cmluZyBkZXNjcmliZV9jbHVzdGVyX25hbWUoKSwKKworICAvKiogZ2V0IHRoZSB0aHJpZnQgYXBpIHZlcnNpb24gKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3ZlcnNpb24oKSwKKworICAvKiogZ2V0IHRoZSB0b2tlbiByaW5nOiBhIG1hcCBvZiByYW5nZXMgdG8gaG9zdCBhZGRyZXNzZXMsCisgICAgICByZXByZXNlbnRlZCBhcyBhIHNldCBvZiBUb2tlblJhbmdlIGluc3RlYWQgb2YgYSBtYXAgZnJvbSByYW5nZQorICAgICAgdG8gbGlzdCBvZiBlbmRwb2ludHMsIGJlY2F1c2UgeW91IGNhbid0IHVzZSBUaHJpZnQgc3RydWN0cyBhcworICAgICAgbWFwIGtleXM6CisgICAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjIgCisKKyAgICAgIGZvciB0aGUgc2FtZSByZWFzb24sIHdlIGNhbid0IHJldHVybiBhIHNldCBoZXJlLCBldmVuIHRob3VnaAorICAgICAgb3JkZXIgaXMgbmVpdGhlciBpbXBvcnRhbnQgbm9yIHByZWRpY3RhYmxlLiAqLworICBsaXN0PFRva2VuUmFuZ2U+IGRlc2NyaWJlX3JpbmcoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIHJldHVybnMgdGhlIHBhcnRpdGlvbmVyIHVzZWQgYnkgdGhpcyBjbHVzdGVyICovCisgIHN0cmluZyBkZXNjcmliZV9wYXJ0aXRpb25lcigpLAorCisgIC8qKiByZXR1cm5zIHRoZSBzbml0Y2ggdXNlZCBieSB0aGlzIGNsdXN0ZXIgKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3NuaXRjaCgpLAorCisgIC8qKiBkZXNjcmliZSBzcGVjaWZpZWQga2V5c3BhY2UgKi8KKyAgS3NEZWYgZGVzY3JpYmVfa2V5c3BhY2UoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgdGhyb3dzICgxOk5vdEZvdW5kRXhjZXB0aW9uIG5mZSwgMjpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBleHBlcmltZW50YWwgQVBJIGZvciBoYWRvb3AvcGFyYWxsZWwgcXVlcnkgc3VwcG9ydC4gIAorICAgICAgbWF5IGNoYW5nZSB2aW9sZW50bHkgYW5kIHdpdGhvdXQgd2FybmluZy4gCisKKyAgICAgIHJldHVybnMgbGlzdCBvZiB0b2tlbiBzdHJpbmdzIHN1Y2ggdGhhdCBmaXJzdCBzdWJyYW5nZSBpcyAobGlzdFswXSwgbGlzdFsxXV0sCisgICAgICBuZXh0IGlzIChsaXN0WzFdLCBsaXN0WzJdXSwgZXRjLiAqLworICBsaXN0PHN0cmluZz4gZGVzY3JpYmVfc3BsaXRzKDE6cmVxdWlyZWQgc3RyaW5nIGNmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIHN0cmluZyBzdGFydF90b2tlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBzdHJpbmcgZW5kX3Rva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgaTMyIGtleXNfcGVyX3NwbGl0KQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBhZGRzIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9hZGRfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIENmRGVmIGNmX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAgIAorICAvKiogZHJvcHMgYSBjb2x1bW4gZmFtaWx5LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2Ryb3BfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5KQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksIAorICAKKyAgLyoqIGFkZHMgYSBrZXlzcGFjZSBhbmQgYW55IGNvbHVtbiBmYW1pbGllcyB0aGF0IGFyZSBwYXJ0IG9mIGl0LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2FkZF9rZXlzcGFjZSgxOnJlcXVpcmVkIEtzRGVmIGtzX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqIGRyb3BzIGEga2V5c3BhY2UgYW5kIGFueSBjb2x1bW4gZmFtaWxpZXMgdGhhdCBhcmUgcGFydCBvZiBpdC4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9kcm9wX2tleXNwYWNlKDE6cmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgIAorICAvKiogdXBkYXRlcyBwcm9wZXJ0aWVzIG9mIGEga2V5c3BhY2UuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fdXBkYXRlX2tleXNwYWNlKDE6cmVxdWlyZWQgS3NEZWYga3NfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgICAgICAgIAorICAvKiogdXBkYXRlcyBwcm9wZXJ0aWVzIG9mIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV91cGRhdGVfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIENmRGVmIGNmX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqCisgICAqIEV4ZWN1dGVzIGEgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBhbmQgcmV0dXJucyBhCisgICAqIENxbFJlc3VsdCBjb250YWluaW5nIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ3FsUmVzdWx0IGV4ZWN1dGVfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgYmluYXJ5IHF1ZXJ5LCAyOnJlcXVpcmVkIENvbXByZXNzaW9uIGNvbXByZXNzaW9uKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsCisgICAgICAgICAgICAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLAorICAgICAgICAgICAgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSwKKyAgICAgICAgICAgIDQ6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgIC8qKgorICAgKiBQcmVwYXJlIGEgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBieSBjb21waWxpbmcgYW5kIHJldHVybmluZworICAgKiAtIHRoZSB0eXBlIG9mIENRTCBzdGF0ZW1lbnQKKyAgICogLSBhbiBpZCB0b2tlbiBvZiB0aGUgY29tcGlsZWQgQ1FMIHN0b3JlZCBvbiB0aGUgc2VydmVyIHNpZGUuCisgICAqIC0gYSBjb3VudCBvZiB0aGUgZGlzY292ZXJlZCBib3VuZCBtYXJrZXJzIGluIHRoZSBzdGF0ZW1lbnQgCisgICAqLworICBDcWxQcmVwYXJlZFJlc3VsdCBwcmVwYXJlX2NxbF9xdWVyeSgxOnJlcXVpcmVkIGJpbmFyeSBxdWVyeSwgMjpyZXF1aXJlZCBDb21wcmVzc2lvbiBjb21wcmVzc2lvbikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKQorCisgICAgICAgICAgICAgCisgIC8qKgorICAgKiBFeGVjdXRlcyBhIHByZXBhcmVkIENRTCAoQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlKSBzdGF0ZW1lbnQgYnkgcGFzc2luZyBhbiBpZCB0b2tlbiBhbmQgIGEgbGlzdCBvZiB2YXJpYWJsZXMKKyAgICogdG8gYmluZCBhbmQgcmV0dXJucyBhIENxbFJlc3VsdCBjb250YWluaW5nIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ3FsUmVzdWx0IGV4ZWN1dGVfcHJlcGFyZWRfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgaTMyIGl0ZW1JZCwgMjpyZXF1aXJlZCBsaXN0PHN0cmluZz4gdmFsdWVzKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsCisgICAgICAgICAgICAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLAorICAgICAgICAgICAgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSwKKyAgICAgICAgICAgIDQ6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSkKKyAgICAgICAgICAgCisKK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImQwZDM3MDZiLWZlZDUtNGNmNS1iOTg0LTA0ZjQ0OGRlOWQ3YiIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2ogYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTg0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qCkBAIC0wLDAgKzEsMzYgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvUGFja2FnZUlkPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi8uLi9UaHJpZnQvVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjEuMCwpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlOTliNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcwpAQCAtMCwwICsxLDgzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9uc1Rlc3RzCisgICAgeworICAgICAgICAvL1RPRE86IEFkZCB0ZXN0cyBmb3IgSUVudW1lcmFibGUgd2l0aCBvYmplY3RzIGFuZCBwcmltaXRpdmUgdmFsdWVzIGluc2lkZQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjEgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjIgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX0RpZmZlcmVudF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8aW50PiB7IDEsIDIsIDMgfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PGludD4geyAxLCAyIH07CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09iamVjdHNfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgLy8gcmVmZXJlbmNlcyB0byBkaWZmZXJlbnQgY29sbGVjdGlvbnMKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09uZUFuZFRoZVNhbWVPYmplY3RfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IGNvbGxlY3Rpb24xOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVENvbGxlY3Rpb25zLkVxdWFscyhjb2xsZWN0aW9uMSwgY29sbGVjdGlvbjIpOworCisgICAgICAgICAgICAvLyByZWZlcmVuY2VzIHRvIG9uZSBhbmQgdGhlIHNhbWUgY29sbGVjdGlvbgorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFeGFtcGxlQ2xhc3MKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBYIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RIYXNoU2V0VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlNTczZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzCkBAIC0wLDAgKzEsNzEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUSGFzaFNldFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVEhhc2hTZXRfRXF1YWxzX1ByaW1pdGl2ZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMTsKKworICAgICAgICAgICAgdmFyIGhhc2hTZXQgPSBuZXcgVEhhc2hTZXQ8aW50PiB7dmFsdWV9OworICAgICAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ29udGFpbnModmFsdWUpKTsKKworICAgICAgICAgICAgaGFzaFNldC5SZW1vdmUodmFsdWUpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ291bnQgPT0gMCk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQ2xlYXIoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvdW50ID09IDApOworCisgICAgICAgICAgICB2YXIgbmV3QXJyID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKyAgICAgICAgICAgIGhhc2hTZXQuQ29weVRvKG5ld0FyciwgMCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobmV3QXJyLkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIHZhciBlbiA9IGhhc2hTZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgZW4uTW92ZU5leHQoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoaW50KWVuLkN1cnJlbnQgPT0gdmFsdWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICB1c2luZyAodmFyIGllbiA9ICgoSUVudW1lcmFibGU8aW50PiloYXNoU2V0KS5HZXRFbnVtZXJhdG9yKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWVuLk1vdmVOZXh0KCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGllbi5DdXJyZW50ID09IHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sSGVscGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjODMxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzCkBAIC0wLDAgKzEsMTcyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLlByb3RvY29scworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2xIZWxwZXJUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVOYW1lRm9yVHlwZUlkX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZCh0Lkl0ZW0xKSA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9UU3RvcF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChUVHlwZS5TdG9wKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9Ob25FeGlzdGluZ1RUeXBlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKChUVHlwZSkxMDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZSh0Lkl0ZW0yKSA9PSB0Lkl0ZW0xLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlSWRGb3JUeXBlTmFtZV9UU3RvcFR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKG5ldyBbXXsoYnl0ZSlUVHlwZS5TdG9wLCAoYnl0ZSlUVHlwZS5TdG9wfSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfTm9uRXhpc3RpbmdUeXBlTmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdezEwMH0pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX0VtcHR5TmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdIHt9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0pzb25OdW1lcmljX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBjb3JyZWN0SnNvbk51bWVyaWMgPSAiKy0uMDEyMzQ1Njc4OUVlIjsKKyAgICAgICAgICAgIHZhciBpbmNvcnJlY3RKc29uTnVtZXJpYyA9ICJBYUJjRGQvKlxcIjsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIHRydWUpKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHNldHMuQWRkUmFuZ2UoaW5jb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIGZhbHNlKSkpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5Jc0pzb25OdW1lcmljKHQuSXRlbTEpID09IHQuSXRlbTIsICQiV3JvbmcgbWFwcGluZyBvZiBDaGFyIHt0Lkl0ZW0xfSB0byBib29sOiB7dC5JdGVtMn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleFZhbF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgY2hhcnMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRIZXhWYWx1ZXMgPSBuZXcgYnl0ZVtdIHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1fTsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjaGFycy5TZWxlY3QoKGNoLCBpKSA9PiBuZXcgVHVwbGU8Y2hhciwgYnl0ZT4oY2gsIGV4cGVjdGVkSGV4VmFsdWVzW2ldKSkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFjdHVhbFJlc3VsdCA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpdC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGNoYXIgYnl0ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgaGV4IHZhbHVlOiB7dC5JdGVtMn0uIEFjdHVhbCBoZXggdmFsdWU6IHthY3R1YWxSZXN1bHR9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgVG9IZXhWYWxfV3JvbmdJbnB1dENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpJ3MnKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIGhleFZhbHVlcyA9IG5ldyBieXRlW10geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRDaGFycyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICB2YXIgc2V0cyA9IGhleFZhbHVlcy5TZWxlY3QoKGh2LCBpKSA9PiBuZXcgVHVwbGU8Ynl0ZSwgY2hhcj4oaHYsIGV4cGVjdGVkQ2hhcnNbaV0pKS5Ub0xpc3QoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWN0dWFsUmVzdWx0ID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleENoYXIodC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGhleCB2YWx1ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgY2hhcjoge3QuSXRlbTJ9LiBBY3R1YWwgaGV4IHZhbHVlOiB7YWN0dWFsUmVzdWx0fSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzNzM2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgTlN1YnN0aXR1dGU7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVEpTT05Qcm90b2NvbF9DYW5fQ3JlYXRlX0luc3RhbmNlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaHR0cENsaWVudFRyYW5zcG9ydCA9IFN1YnN0aXR1dGUuRm9yPFRIdHRwQ2xpZW50VHJhbnNwb3J0PihuZXcgVXJpKCJodHRwOi8vbG9jYWxob3N0IiksIG51bGwpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFRKU09OUHJvdG9jb2xXcmFwcGVyKGh0dHBDbGllbnRUcmFuc3BvcnQpOworCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5XcmFwcGVkQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5XcmFwcGVkUmVhZGVyKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LlRyYW5zcG9ydCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVjdXJzaW9uRGVwdGggPT0gMCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVjdXJzaW9uTGltaXQgPT0gVFByb3RvY29sLkRlZmF1bHRSZWN1cnNpb25EZXB0aCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LlRyYW5zcG9ydC5FcXVhbHMoaHR0cENsaWVudFRyYW5zcG9ydCkpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuV3JhcHBlZENvbnRleHQuR2V0VHlwZSgpLk5hbWUuRXF1YWxzKCJKU09OQmFzZUNvbnRleHQiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVhZGVyLkdldFR5cGUoKS5OYW1lLkVxdWFscygiTG9va2FoZWFkUmVhZGVyIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBUSlNPTlByb3RvY29sV3JhcHBlciA6IFRKc29uUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRKU09OUHJvdG9jb2xXcmFwcGVyKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpIDogYmFzZSh0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBXcmFwcGVkQ29udGV4dCA9PiBDb250ZXh0OworICAgICAgICAgICAgcHVibGljIG9iamVjdCBXcmFwcGVkUmVhZGVyID0+IFJlYWRlcjsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgV3JhcHBlZFJlY3Vyc2lvbkRlcHRoID0+IFJlY3Vyc2lvbkRlcHRoOworICAgICAgICAgICAgcHVibGljIGludCBXcmFwcGVkUmVjdXJzaW9uTGltaXQgPT4gUmVjdXJzaW9uTGltaXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvaiBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmYxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvagpAQCAtMCwwICsxLDE4IEBACivvu788UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJDb21wYXJlTkVUT2JqZWN0cyIgVmVyc2lvbj0iNC4zLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5FVC5UZXN0LlNkayIgVmVyc2lvbj0iMTUuNS4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0QWRhcHRlciIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RGcmFtZXdvcmsiIFZlcnNpb249IjEuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik5TdWJzdGl0dXRlIiBWZXJzaW9uPSIzLjEuMCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MmE3ZjQ4ZC0zYjUwLTRiMWUtYjgyZS0zYWRhODIxMGMzNTh9IiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQuc2xuIGIvbGliL25ldGNvcmUvVGhyaWZ0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTMwYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0LnNsbgpAQCAtMCwwICsxLDg1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjczMC4xMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiVGVzdHMiLCAiVGVzdHMiLCAie0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICJUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0LkludGVncmF0aW9uVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIiwgIns5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQuVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oiLCAiezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0c1xUaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvaiIsICJ7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oTmVzdGVkUHJvamVjdHMpID0gcHJlU29sdXRpb24KKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0gPSB7RjUxRkM0REEtQ0FDMC00OEIxLUEwNjktQjE3MTJCQ0FBNUJFfQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfSA9IHtGNTFGQzREQS1DQUMwLTQ4QjEtQTA2OS1CMTcxMkJDQUE1QkV9CisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9ID0ge0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0KKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0ge0ZEMjBCQzRBLTAxMDktNDFEOC04QzBDLTg5M0U3ODREN0VGOX0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2JmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCkBAIC0wLDAgKzEsMTAxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQ29sbGVjdGlvbnMKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBUaGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgdmFsdWUtd2lzZSB0aGUgc2FtZS4KKyAgICAgICAgLy8vICAgICBJZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9ucyB3aWxsIGJlIGNvbXBhcmVkIHVzaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXF1YWxzKElFbnVtZXJhYmxlIGZpcnN0LCBJRW51bWVyYWJsZSBzZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsICYmIHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmaXRlciA9IGZpcnN0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgICAgIHZhciBzaXRlciA9IHNlY29uZC5HZXRFbnVtZXJhdG9yKCk7CisKKyAgICAgICAgICAgIHZhciBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICB2YXIgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCgpOworCisgICAgICAgICAgICB3aGlsZSAoZm5leHQgJiYgc25leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZlbnVtID0gZml0ZXIuQ3VycmVudCBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICB2YXIgc2VudW0gPSBzaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworCisgICAgICAgICAgICAgICAgaWYgKGZlbnVtICE9IG51bGwgJiYgc2VudW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghRXF1YWxzKGZlbnVtLCBzZW51bSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmZW51bSA9PSBudWxsIF4gc2VudW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUVxdWFscyhmaXRlci5DdXJyZW50LCBzaXRlci5DdXJyZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZm5leHQgPT0gc25leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVGhpcyByZXR1cm5zIGEgaGFzaGNvZGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBlbnVtZXJhYmxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRIYXNoQ29kZShJRW51bWVyYWJsZSBlbnVtZXJhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW51bWVyYWJsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaGFzaGNvZGUgPSAwOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgb2JqIGluIGVudW1lcmFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGVudW0yID0gb2JqIGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIHZhciBvYmpIYXNoID0gZW51bTIgPT0gbnVsbCA/IG9iai5HZXRIYXNoQ29kZSgpIDogR2V0SGFzaENvZGUoZW51bTIpOworCisgICAgICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoYXNoY29kZSA9IChoYXNoY29kZSozOTcpIF4gKG9iakhhc2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFmMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgVGhyaWZ0LkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEhhc2hTZXQ8VD4gOiBJQ29sbGVjdGlvbjxUPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBIYXNoU2V0PFQ+IF9zZXQgPSBuZXcgSGFzaFNldDxUPigpOworCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgPT4gX3NldC5Db3VudDsKKworICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5ID0+IGZhbHNlOworCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQWRkKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBfc2V0LkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2V0LkNvbnRhaW5zKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKFRbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3I8VD4gSUVudW1lcmFibGU8VD4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlPFQ+KSBfc2V0KS5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NldC5SZW1vdmUoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0lUQXN5bmNQcm9jZXNzb3IuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRBc3luY1Byb2Nlc3Nvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjhlNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0lUQXN5bmNQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwyOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBJVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9JVFByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzNlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRQcm9jZXNzb3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMjggQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBJVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIElUQXN5bmNQcm9jZXNzb3IgR2V0QXN5bmNQcm9jZXNzb3IoVENsaWVudFRyYW5zcG9ydCB0cmFucywgVEJhc2VTZXJ2ZXIgYmFzZVNlcnZlciA9IG51bGwpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0MTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQyMgLk5FVCBDb3JlIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorLy9AVE9ETyB3aGVyZSB0byBwdXQgTGljZW5zZSBpbmZvcm1hdGlvbj8KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIGV4VHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgZXhUeXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJkZjNmOGVmMC1lMGEzLTRjODYtYTY1Yi04ZWM4NGUwMTZiMWQiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RGaWVsZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzExNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVEZpZWxkCisgICAgeworICAgICAgICBwdWJsaWMgVEZpZWxkKHN0cmluZyBuYW1lLCBUVHlwZSB0eXBlLCBzaG9ydCBpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIElEID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZyAtIGRvIG5vdCByZW5hbWUgLSBpdCB1c2VkIGZvciBnZW5lcmF0aW9uIAorICAgICAgICBwdWJsaWMgc2hvcnQgSUQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RMaXN0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIzMjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpAQCAtMCwwICsxLDMzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUTGlzdAorICAgIHsKKyAgICAgICAgcHVibGljIFRMaXN0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICBDb3VudCA9IGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNYXAuY3MKQEAgLTAsMCArMSwzNiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1hcAorICAgIHsKKyAgICAgICAgcHVibGljIFRNYXAoVFR5cGUga2V5VHlwZSwgVFR5cGUgdmFsdWVUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEtleVR5cGUgPSBrZXlUeXBlOworICAgICAgICAgICAgVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBLZXlUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgVmFsdWVUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmNDkyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIFNlcUlEID0gc2VxaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcgLSBkbyBub3QgcmVuYW1lIC0gaXQgdXNlZCBmb3IgZ2VuZXJhdGlvbiAKKyAgICAgICAgcHVibGljIGludCBTZXFJRCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZVR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiOWEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzCkBAIC0wLDAgKzEsMjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGUKKyAgICB7CisgICAgICAgIENhbGwgPSAxLAorICAgICAgICBSZXBseSA9IDIsCisgICAgICAgIEV4Y2VwdGlvbiA9IDMsCisgICAgICAgIE9uZXdheSA9IDQKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODNiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTZXQuY3MKQEAgLTAsMCArMSwzOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVFNldAorICAgIHsKKyAgICAgICAgcHVibGljIFRTZXQoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNldChUTGlzdCBsaXN0KQorICAgICAgICAgICAgOiB0aGlzKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhkY2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU3RydWN0LmNzCkBAIC0wLDAgKzEsMzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKKyAgICB7CisgICAgICAgIHB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFR5cGUuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTc4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCkBAIC0wLDAgKzEsMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUVHlwZSA6IGJ5dGUKKyAgICB7CisgICAgICAgIFN0b3AgPSAwLAorICAgICAgICBWb2lkID0gMSwKKyAgICAgICAgQm9vbCA9IDIsCisgICAgICAgIEJ5dGUgPSAzLAorICAgICAgICBEb3VibGUgPSA0LAorICAgICAgICBJMTYgPSA2LAorICAgICAgICBJMzIgPSA4LAorICAgICAgICBJNjQgPSAxMCwKKyAgICAgICAgU3RyaW5nID0gMTEsCisgICAgICAgIFN0cnVjdCA9IDEyLAorICAgICAgICBNYXAgPSAxMywKKyAgICAgICAgU2V0ID0gMTQsCisgICAgICAgIExpc3QgPSAxNQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0lUUHJvdG9jb2xGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M1Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpAQCAtMCwwICsxLDI3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRQcm90b2NvbEZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm90b2NvbCBHZXRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTg2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RBYnN0cmFjdEJhc2UuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJhc2UuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGUxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCYXNlLmNzCkBAIC0wLDAgKzEsMjggQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBUQmFzZSA6IFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIFRhc2sgUmVhZEFzeW5jKFRQcm90b2NvbCB0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCaW5hcnlQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWVjODVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmluYXJ5UHJvdG9jb2wuY3MKQEAgLTAsMCArMSw2MTMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICAvL1RPRE86IFVuaXQgdGVzdHMKKyAgICAgICAgLy9UT0RPOiBMb2NhbGl6YXRpb24KKyAgICAgICAgLy9UT0RPOiBwcmFnbWEKKworICAgICAgICBwcm90ZWN0ZWQgY29uc3QgdWludCBWZXJzaW9uTWFzayA9IDB4ZmZmZjAwMDA7CisgICAgICAgIHByb3RlY3RlZCBjb25zdCB1aW50IFZlcnNpb24xID0gMHg4MDAxMDAwMDsKKworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RSZWFkOworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RXcml0ZTsKKworICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IHRoaXModHJhbnMsIGZhbHNlLCB0cnVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMsIGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICBTdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gVmVyc2lvbjEgfCAodWludCkgbWVzc2FnZS5UeXBlOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMoKGludCkgdmVyc2lvbiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RyaW5nQXN5bmMobWVzc2FnZS5OYW1lLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJpbmdBc3luYyhtZXNzYWdlLk5hbWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1lc3NhZ2UuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMobWVzc2FnZS5TZXFJRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgVFR5cGUuU3RvcCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBtYXAuS2V5VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBtYXAuVmFsdWVUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKG1hcC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgbGlzdC5FbGVtZW50VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhsaXN0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgc2V0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKGIgPyAoc2J5dGUpIDEgOiAoc2J5dGUpIDAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYm91dCA9IG5ldyBieXRlWzFdOworCisgICAgICAgICAgICBib3V0WzBdID0gKGJ5dGUpIGI7CisKKyAgICAgICAgICAgIHJldHVybiBib3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBib3V0ID0gQ3JlYXRlV3JpdGVCeXRlKGIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhib3V0LCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBDcmVhdGVXcml0ZUkxNihzaG9ydCBzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTE2T3V0ID0gbmV3IGJ5dGVbMl07CisKKyAgICAgICAgICAgIGkxNk91dFswXSA9IChieXRlKSAoMHhmZiAmIChzID4+IDgpKTsKKyAgICAgICAgICAgIGkxNk91dFsxXSA9IChieXRlKSAoMHhmZiAmIHMpOworCisgICAgICAgICAgICByZXR1cm4gaTE2T3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTE2T3V0ID0gQ3JlYXRlV3JpdGVJMTYoaTE2KTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoaTE2T3V0LCAwLCAyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBDcmVhdGVXcml0ZUkzMihpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTMyT3V0ID0gbmV3IGJ5dGVbNF07CisKKyAgICAgICAgICAgIGkzMk91dFswXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gMjQpKTsKKyAgICAgICAgICAgIGkzMk91dFsxXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gMTYpKTsKKyAgICAgICAgICAgIGkzMk91dFsyXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gOCkpOworICAgICAgICAgICAgaTMyT3V0WzNdID0gKGJ5dGUpICgweGZmICYgaTMyKTsKKworICAgICAgICAgICAgcmV0dXJuIGkzMk91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMzJPdXQgPSBDcmVhdGVXcml0ZUkzMihpMzIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpMzJPdXQsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTY0KGxvbmcgaTY0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTY0T3V0ID0gbmV3IGJ5dGVbOF07CisKKyAgICAgICAgICAgIGk2NE91dFswXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICAgICAgICAgIGk2NE91dFsxXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICAgICAgICAgIGk2NE91dFsyXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNDApKTsKKyAgICAgICAgICAgIGk2NE91dFszXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICAgICAgICAgIGk2NE91dFs0XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICAgICAgICAgIGk2NE91dFs1XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMTYpKTsKKyAgICAgICAgICAgIGk2NE91dFs2XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gOCkpOworICAgICAgICAgICAgaTY0T3V0WzddID0gKGJ5dGUpICgweGZmICYgaTY0KTsKKworICAgICAgICAgICAgcmV0dXJuIGk2NE91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTY0T3V0ID0gQ3JlYXRlV3JpdGVJNjQoaTY0KTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoaTY0T3V0LCAwLCA4LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVJNjRBc3luYyhCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQmluYXJ5QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhieXRlcy5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWVzc2FnZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOworICAgICAgICAgICAgdmFyIHNpemUgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKHNpemUgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gKHVpbnQpIHNpemUgJiBWZXJzaW9uTWFzazsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgJCJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiB7dmVyc2lvbn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkgKHNpemUgJiAweDAwMDAwMGZmKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdHJpY3RSZWFkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdCb2R5QXN5bmMoc2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vVE9ETzogbm8gcmVhZCBmcm9tIGludGVybmFsIHRyYW5zcG9ydD8KKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRGaWVsZD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlICE9IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSBhd2FpdCBSZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNYXA+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBUTWFwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS2V5VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgVmFsdWVUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBDb3VudCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRMaXN0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudFR5cGUgPSAoVFR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLAorICAgICAgICAgICAgICAgIENvdW50ID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VFNldD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgQ291bnQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxib29sPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSAxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2J5dGU+IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2J5dGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJpbiA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJpbiwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOyAvL1RPRE86IHdoeSByZWFkYWxsID8KKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpIGJpblswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2hvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGkxNkluID0gbmV3IGJ5dGVbMl07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoaTE2SW4sIDAsIDIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAoc2hvcnQpICgoKGkxNkluWzBdICYgMHhmZikgPDwgOCkgfCBpMTZJblsxXSAmIDB4ZmYpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTMySW4gPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhpMzJJbiwgMCwgNCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gCisgICAgICAgICAgICAgICAgKChpMzJJblswXSAmIDB4ZmYpIDw8IDI0KSB8IAorICAgICAgICAgICAgICAgICgoaTMySW5bMV0gJiAweGZmKSA8PCAxNikgfCAKKyAgICAgICAgICAgICAgICAoKGkzMkluWzJdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIGkzMkluWzNdICYgMHhmZjsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2NzUKKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgbG9uZyBDcmVhdGVSZWFkSTY0KGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPQorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbMl0gJiAweGZmKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbNV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1Zls2XSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICBidWZbN10gJiAweGZmOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDY3NQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxsb25nPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpNjRJbiA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGk2NEluLCAwLCA4LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVhZEk2NChpNjRJbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxkb3VibGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGQgPSBhd2FpdCBSZWFkSTY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGVbXT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2l6ZSA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0JvZHlBc3luYyhpbnQgc2l6ZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzdHJpbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJ1ZiwgMCwgc2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFJlYWQ7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RXcml0ZTsKKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoKQorICAgICAgICAgICAgICAgIDogdGhpcyhmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmljdFJlYWQgPSBzdHJpY3RSZWFkOworICAgICAgICAgICAgICAgIFN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgU3RyaWN0UmVhZCwgU3RyaWN0V3JpdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVENvbXBhY3RQcm90b2NvbC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVENvbXBhY3RQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNkZjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQ29tcGFjdFByb3RvY29sLmNzCkBAIC0wLDAgKzEsOTIyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy9UT0RPOiBpbXBsZW1lbnRhdGlvbiBvZiBUUHJvdG9jb2wKKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBQcm90b2NvbElkID0gMHg4MjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFZlcnNpb24gPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVmVyc2lvbk1hc2sgPSAweDFmOyAvLyAwMDAxIDExMTEKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFR5cGVNYXNrID0gMHhFMDsgLy8gMTExMCAwMDAwCisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBUeXBlQml0cyA9IDB4MDc7IC8vIDAwMDAgMDExMQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBUeXBlU2hpZnRBbW91bnQgPSA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUU3RydWN0IEFub255bW91c1N0cnVjdCA9IG5ldyBUU3RydWN0KHN0cmluZy5FbXB0eSk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRGaWVsZCBUc3RvcCA9IG5ldyBURmllbGQoc3RyaW5nLkVtcHR5LCBUVHlwZS5TdG9wLCAwKTsKKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBieXRlW10gVFR5cGVUb0NvbXBhY3RUeXBlID0gbmV3IGJ5dGVbMTZdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLCBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0YWNrPHNob3J0PiBfbGFzdEZpZWxkID0gbmV3IFN0YWNrPHNob3J0PigxNSk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVEZpZWxkPyBfYm9vbGVhbkZpZWxkOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbD8gX2Jvb2xWYWx1ZTsKKworICAgICAgICBwcml2YXRlIHNob3J0IF9sYXN0RmllbGRJZDsKKworICAgICAgICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RvcF0gPSBUeXBlcy5TdG9wOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkJvb2xdID0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuQnl0ZV0gPSBUeXBlcy5CeXRlOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkkxNl0gPSBUeXBlcy5JMTY7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuSTMyXSA9IFR5cGVzLkkzMjsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5JNjRdID0gVHlwZXMuSTY0OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkRvdWJsZV0gPSBUeXBlcy5Eb3VibGU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RyaW5nXSA9IFR5cGVzLkJpbmFyeTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5MaXN0XSA9IFR5cGVzLkxpc3Q7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU2V0XSA9IFR5cGVzLlNldDsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5NYXBdID0gVHlwZXMuTWFwOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLlN0cnVjdF0gPSBUeXBlcy5TdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9sYXN0RmllbGQuQ2xlYXIoKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtQcm90b2NvbElkfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICBUcmFucy5Xcml0ZUFzeW5jKAorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7KGJ5dGUpICgoVmVyc2lvbiAmIFZlcnNpb25NYXNrKSB8ICgoKHVpbnQpIG1lc3NhZ2UuVHlwZSA8PCBUeXBlU2hpZnRBbW91bnQpICYgVHlwZU1hc2spKX0sCisgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgbWVzc2FnZS5TZXFJRCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKG1lc3NhZ2UuTmFtZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICAgIC8vLyAgICAgdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgICAgICAgIC8vLyAgICAgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkLlB1c2goX2xhc3RGaWVsZElkKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkludGVybmFsQXN5bmMoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGEgZXhUeXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgICAgICAgICAgIHZhciB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gR2V0Q29tcGFjdFR5cGUoZmllbGQuVHlwZSkgOiB0eXBlT3ZlcnJpZGU7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgICAgICAgICAgaWYgKChmaWVsZC5JRCA+IF9sYXN0RmllbGRJZCkgJiYgKGZpZWxkLklEIC0gX2xhc3RGaWVsZElkIDw9IDE1KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSAoKChmaWVsZC5JRCAtIF9sYXN0RmllbGRJZCkgPDwgNCkgfCB0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge2J9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge3R5cGVUb1dyaXRlfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gZmllbGQuSUQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5Cb29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ib29sZWFuRmllbGQgPSBmaWVsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbEFzeW5jKGZpZWxkLCAweEZGLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtUeXBlcy5TdG9wfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFzeW5jIFRhc2sgV3JpdGVDb2xsZWN0aW9uQmVnaW5Bc3luYyhUVHlwZSBlbGVtVHlwZSwgaW50IHNpemUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAgICAgICAgIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSBleFR5cGUgaW5kaWNhdG9yLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKHNpemUgPD0gMTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpICgoc2l6ZSA8PCA0KSB8IEdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSl9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpICgweGYwIHwgR2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKX0sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIHNpemUpOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVDb2xsZWN0aW9uQmVnaW5Bc3luYyhzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgICAgICAgIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICAgICAgICByaWdodCBleFR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAgICAgICAgICAgIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGlmIChfYm9vbGVhbkZpZWxkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxBc3luYyhfYm9vbGVhbkZpZWxkLlZhbHVlLCBiID8gVHlwZXMuQm9vbGVhblRydWUgOiBUeXBlcy5Cb29sZWFuRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgX2Jvb2xlYW5GaWVsZCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7YiA/IFR5cGVzLkJvb2xlYW5UcnVlIDogVHlwZXMuQm9vbGVhbkZhbHNlfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10geyhieXRlKSBifSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKEludFRvWmlnemFnKGkxNikpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBUdXBsZTxieXRlW10sIGludD4gQ3JlYXRlV3JpdGVWYXJJbnQzMih1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC5SZXN1bHRzIGluIDEgLSA1IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAgICAgICAgdmFyIGkzMkJ1ZiA9IG5ldyBieXRlWzVdOworICAgICAgICAgICAgdmFyIGlkeCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaTMyQnVmW2lkeCsrXSA9IChieXRlKSBuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpMzJCdWZbaWR4KytdID0gKGJ5dGUpICgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxieXRlW10sIGludD4oaTMyQnVmLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMihJbnRUb1ppZ3phZyhpMzIpKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgVHVwbGU8Ynl0ZVtdLCBpbnQ+IENyZWF0ZVdyaXRlVmFySW50NjQodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbMTBdOworICAgICAgICAgICAgdmFyIGlkeCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4odWxvbmcpIDB4N0ZMKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2lkeCsrXSA9IChieXRlKSBuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmW2lkeCsrXSA9IChieXRlKSAoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8Ynl0ZVtdLCBpbnQ+KGJ1ZiwgaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDY0KExvbmdUb1ppZ3phZyhpNjQpKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgICAgIEZpeGVkTG9uZ1RvQnl0ZXMoQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGQpLCBkYXRhLCAwKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoZGF0YSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJpbmdBc3luYyhzdHJpbmcgc3RyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzdHIpOworCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBieXRlcy5MZW5ndGgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBieXRlcy5MZW5ndGgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10geyhieXRlKSAwfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIG1hcC5Db3VudCk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICBUcmFucy5Xcml0ZUFzeW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3W10geyhieXRlKSAoKEdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKSA8PCA0KSB8IEdldENvbXBhY3RUeXBlKG1hcC5WYWx1ZVR5cGUpKX0sCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWVzc2FnZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcHJvdG9jb2xJZCA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChwcm90b2NvbElkICE9IFByb3RvY29sSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkV4cGVjdGVkIHByb3RvY29sIGlkIHtQcm90b2NvbElkOlh9IGJ1dCBnb3Qge3Byb3RvY29sSWQ6WH0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHZlcnNpb25BbmRUeXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHZlcnNpb24gPSAoYnl0ZSkgKHZlcnNpb25BbmRUeXBlICYgVmVyc2lvbk1hc2spOworCisgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJCJFeHBlY3RlZCB2ZXJzaW9uIHtWZXJzaW9ufSBidXQgZ290IHt2ZXJzaW9ufSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdHlwZSA9IChieXRlKSAoKHZlcnNpb25BbmRUeXBlID4+IFR5cGVTaGlmdEFtb3VudCkgJiBUeXBlQml0cyk7CisgICAgICAgICAgICB2YXIgc2VxaWQgPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgbWVzc2FnZU5hbWUgPSBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKSB0eXBlLCBzZXFpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VFN0cnVjdD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzb21lIG1hZ2ljIGlzIGhlcmUgKQorCisgICAgICAgICAgICBfbGFzdEZpZWxkLlB1c2goX2xhc3RGaWVsZElkKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiBBbm9ueW1vdXNTdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAgICAgICAgdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIFJlYWQgb2ZmIHRoZSB3aXJlLgorICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gX2xhc3RGaWVsZC5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgdHlwZSA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKyAgICAgICAgICAgIGlmICh0eXBlID09IFR5cGVzLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRzdG9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaG9ydCBmaWVsZElkOworICAgICAgICAgICAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSBleFR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgICAgICAgICAgICB2YXIgbW9kaWZpZXIgPSAoc2hvcnQpICgodHlwZSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgaWYgKG1vZGlmaWVyID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRJZCA9IGF3YWl0IFJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRJZCA9IChzaG9ydCkgKF9sYXN0RmllbGRJZCArIG1vZGlmaWVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZChzdHJpbmcuRW1wdHksIEdldFRUeXBlKChieXRlKSAodHlwZSAmIDB4MGYpKSwgZmllbGRJZCk7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgZXhUeXBlCisgICAgICAgICAgICBpZiAoSXNCb29sVHlwZSh0eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYm9vbFZhbHVlID0gKGJ5dGUpICh0eXBlICYgMHgwZikgPT0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gZmllbGQuSUQ7CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VE1hcD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorICAgICAgICAgICAgYW5kIHZhbHVlIGV4VHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICAgICAgICAgICAgImNvcnJlY3QiIHR5cGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNpemUgPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIga2V5QW5kVmFsdWVUeXBlID0gc2l6ZSA9PSAwID8gKGJ5dGUpIDAgOiAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNYXAoR2V0VFR5cGUoKGJ5dGUpIChrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpLCBHZXRUVHlwZSgoYnl0ZSkgKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAgICAgYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorICAgICAgICAgICAgb2YgdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgICAgICB0cnVlIHNpemUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRTZXQoYXdhaXQgUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJvb2w+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgICAgICAgIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisgICAgICAgICAgICBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKF9ib29sVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2Jvb2xWYWx1ZS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBfYm9vbFZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikgPT0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzYnl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKSBidWZbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHNob3J0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpIFppZ3phZ1RvSW50KGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFppZ3phZ1RvSW50KGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8bG9uZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWmlnemFnVG9Mb25nKGF3YWl0IFJlYWRWYXJJbnQ2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxkb3VibGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGxvbmdCaXRzID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMobG9uZ0JpdHMsIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShCeXRlc1RvTG9uZyhsb25nQml0cykpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzdHJpbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZHMgYSBieXRlW10gKHZpYSBSZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KKyAgICAgICAgICAgIHZhciBsZW5ndGggPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGVbXT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgbGVuZ3RoID0gKGludCkgYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VExpc3Q+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAgICAgYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgICAgICAgIG9mIHRoZSBlbGVtZW50IGV4VHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAgICAgICAgdHJ1ZSBzaXplLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNpemVBbmRUeXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHNpemUgPSAoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweDBmOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHR5cGUgPSBHZXRUVHlwZShzaXplQW5kVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRMaXN0KHR5cGUsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgR2V0Q29tcGFjdFR5cGUoVFR5cGUgdHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCisgICAgICAgICAgICByZXR1cm4gVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIHR0eXBlXTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHVpbnQ+IFJlYWRWYXJJbnQzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHVpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOworICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGIgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1aW50KSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazx1bG9uZz4gUmVhZFZhckludDY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8dWludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHZhciBzaGlmdCA9IDA7CisgICAgICAgICAgICB1bG9uZyByZXN1bHQgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGIgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1bG9uZykgKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgWmlnemFnVG9JbnQodWludCBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludCkgKG4gPj4gMSkgXiAtKGludCkgKG4gJiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgWmlnemFnVG9Mb25nKHVsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobG9uZykgKG4gPj4gMSkgXiAtKGxvbmcpIChuICYgMSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIEJ5dGVzVG9Mb25nKGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKKyAgICAgICAgICAgIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzddICYgMHhmZkwpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1s2XSAmIDB4ZmZMKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbNV0gJiAweGZmTCkgPDwgNDApIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzRdICYgMHhmZkwpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgKChieXRlc1szXSAmIDB4ZmZMKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbMl0gJiAweGZmTCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzFdICYgMHhmZkwpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoYnl0ZXNbMF0gJiAweGZmTCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIElzQm9vbFR5cGUoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG93ZXJOaWJibGUgPSBiICYgMHgwZjsKKyAgICAgICAgICAgIHJldHVybiAobG93ZXJOaWJibGUgPT0gVHlwZXMuQm9vbGVhblRydWUpIHx8IChsb3dlck5pYmJsZSA9PSBUeXBlcy5Cb29sZWFuRmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFR5cGUgR2V0VFR5cGUoYnl0ZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVFR5cGUgdmFsdWUuCisgICAgICAgICAgICBzd2l0Y2ggKChieXRlKSAodHlwZSAmIDB4MGYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU3RvcDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0b3A7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5Cb29sZWFuRmFsc2U6CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5Cb29sZWFuVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CeXRlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQnl0ZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU2V0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RydWN0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJCJEb24ndCBrbm93IHdoYXQgZXhUeXBlOiB7KGJ5dGUpICh0eXBlICYgMHgwZil9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB1bG9uZyBMb25nVG9aaWd6YWcobG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludAorICAgICAgICAgICAgcmV0dXJuICh1bG9uZykgKG4gPDwgMSkgXiAodWxvbmcpIChuID4+IDYzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHVpbnQgSW50VG9aaWd6YWcoaW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZSByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQKKyAgICAgICAgICAgIHJldHVybiAodWludCkgKG4gPDwgMSkgXiAodWludCkgKG4gPj4gMzEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGaXhlZExvbmdUb0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGJ1ZiwgaW50IG9mZikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nIHVudGlsIG9mZis3LgorICAgICAgICAgICAgYnVmW29mZiArIDBdID0gKGJ5dGUpIChuICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMV0gPSAoYnl0ZSkgKChuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMl0gPSAoYnl0ZSkgKChuID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDNdID0gKGJ5dGUpICgobiA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA0XSA9IChieXRlKSAoKG4gPj4gMzIpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNV0gPSAoYnl0ZSkgKChuID4+IDQwKSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDZdID0gKGJ5dGUpICgobiA+PiA0OCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA3XSA9IChieXRlKSAoKG4gPj4gNTYpICYgMHhmZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEFsbCBvZiB0aGUgb24td2lyZSBleFR5cGUgY29kZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFN0b3AgPSAweDAwOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQm9vbGVhblRydWUgPSAweDAxOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQm9vbGVhbkZhbHNlID0gMHgwMjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJ5dGUgPSAweDAzOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTE2ID0gMHgwNDsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEkzMiA9IDB4MDU7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJNjQgPSAweDA2OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgRG91YmxlID0gMHgwNzsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJpbmFyeSA9IDB4MDg7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBMaXN0ID0gMHgwOTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNldCA9IDB4MEE7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBNYXAgPSAweDBCOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU3RydWN0ID0gMHgwQzsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RKU09OUHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RKU09OUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzM2YwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEpTT05Qcm90b2NvbC5jcwpAQCAtMCwwICsxLDk4MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAgICAvLy8gICAgIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCisgICAgLy8vICAgICBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgIC8vLyAgICAgcHJvdG9jb2wncyB3aXJlIGZvcm1hdC4KKyAgICAvLy8gICAgIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEpzb25Qcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBsb25nIFZlcnNpb24gPSAxOworCisgICAgICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX3RlbXBCdWZmZXIgPSBuZXcgYnl0ZVs0XTsKKworICAgICAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICAgICAgcHJvdGVjdGVkIEpTT05CYXNlQ29udGV4dCBDb250ZXh0OworCisgICAgICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8SlNPTkJhc2VDb250ZXh0PiBDb250ZXh0U3RhY2sgPSBuZXcgU3RhY2s8SlNPTkJhc2VDb250ZXh0PigpOworCisgICAgICAgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgICAgICAgIHByb3RlY3RlZCBMb29rYWhlYWRSZWFkZXIgUmVhZGVyOworCisgICAgICAgIC8vIERlZmF1bHQgZW5jb2RpbmcKKyAgICAgICAgcHJvdGVjdGVkIEVuY29kaW5nIFV0ZjhFbmNvZGluZyA9IEVuY29kaW5nLlVURjg7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRKc29uUHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRKc29uUHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dCA9IG5ldyBKU09OQmFzZUNvbnRleHQodGhpcyk7CisgICAgICAgICAgICBSZWFkZXIgPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dFN0YWNrLlB1c2goQ29udGV4dCk7CisgICAgICAgICAgICBDb250ZXh0ID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnRleHQgPSBDb250ZXh0U3RhY2suUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGJbMF07IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAvLy8gICAgIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5SZWFkCisgICAgICAgIC8vLyAgICAgYW5kIEpTT05QYWlyQ29udGV4dC5SZWFkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBhc3luYyBUYXNrIFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGNoICE9IGJ5dGVzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogeyhjaGFyKSBjaH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvblN0cmluZ0FzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLkxlbmd0aDsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChieXRlc1tpXSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1tpXSA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaFswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcy5Ub0FycmF5KCksIGksIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuSnNvbkNoYXJUYWJsZVtieXRlc1tpXV07CisgICAgICAgICAgICAgICAgICAgIGlmIChfdGVtcEJ1ZmZlclswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ5dGVzLCBpLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3RlbXBCdWZmZXJbMF0gPiAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKF90ZW1wQnVmZmVyLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjU2VxdWVuY2VzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhDaGFyKChieXRlKSAoYnl0ZXNbaV0gPj4gNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgX3RlbXBCdWZmZXJbMV0gPSBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4Q2hhcihieXRlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKF90ZW1wQnVmZmVyLCAwLCAyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgICAgICAgLy8vICAgICB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkludGVnZXJBc3luYyhsb25nIG51bSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgc3RyID0gbnVtLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIHZhciBlc2NhcGVOdW0gPSBDb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBieXRlcyA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgICAgICAgLy8vICAgICBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25Eb3VibGVBc3luYyhkb3VibGUgbnVtLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBzdHIgPSBudW0uVG9TdHJpbmcoIkcxNyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgdmFyIHNwZWNpYWwgPSBmYWxzZTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnTic6IC8vIE5hTgorICAgICAgICAgICAgICAgIGNhc2UgJ0knOiAvLyBJbmZpbml0eQorICAgICAgICAgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbMV0gPT0gJ0knKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAtSW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBDb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAorICAgICAgICAvLy8gICAgIGRhdGEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkJhc2U2NEFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBvZmYgPSAwOworCisgICAgICAgICAgICB3aGlsZSAobGVuID49IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5FbmNvZGUoYnl0ZXMsIG9mZiwgMywgX3RlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBvZmYgKz0gMzsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRW5jb2RlKGJ5dGVzLCBvZmYsIGxlbiwgX3RlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIGxlbiArIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbk9iamVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUmlnaHRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhWZXJzaW9uLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHZhciBiID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYygobG9uZykgbWVzc2FnZS5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobWVzc2FnZS5TZXFJRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luQXN5bmMoVEZpZWxkIGZpZWxkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGZpZWxkLklELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoZmllbGQuVHlwZSksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKG1hcC5LZXlUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChtYXAuVmFsdWVUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKG1hcC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKGxpc3QuRWxlbWVudFR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobGlzdC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoc2V0LkVsZW1lbnRUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoYiA/IDEgOiAwLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGkxNiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGkzMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhpNjQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25Eb3VibGVBc3luYyhkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGIgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMocyk7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkJhc2U2NEFzeW5jKGJ5dGVzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCisgICAgICAgIC8vLyAgICAgY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkSnNvblN0cmluZ0FzeW5jKGJvb2wgc2tpcENvbnRleHQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29kZXVuaXRzID0gbmV3IExpc3Q8Y2hhcj4oKTsKKworCisgICAgICAgICAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZVswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkPworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Fc2NTZXF1ZW5jZXNbMF0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKG5ld1tdIHtjaH0sIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggYW5kIFw/CisgICAgICAgICAgICAgICAgICAgIGNoID0gYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY1NlcXVlbmNlc1sxXSkgLy8gY29udHJvbCBjaGFycyBsaWtlIFxuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmYgPSBBcnJheS5JbmRleE9mKFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjYXBlQ2hhcnMsIChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2ZmID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY2FwZUNoYXJWYWx1ZXNbb2ZmXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKG5ld1tdIHtjaH0sIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKF90ZW1wQnVmZmVyLCAwLCA0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHdjaCA9IChzaG9ydCkgKChUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzBdKSA8PCAxMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzNdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXIuSXNIaWdoU3Vycm9nYXRlKChjaGFyKSB3Y2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5BZGQoKGNoYXIpIHdjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhci5Jc0xvd1N1cnJvZ2F0ZSgoY2hhcikgd2NoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcikgd2NoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMoY29kZXVuaXRzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBidWZmZXIuV3JpdGVBc3luYyh0bXAsIDAsIHRtcC5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5DbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhuZXdbXSB7KGNoYXIpIHdjaH0pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmModG1wLCAwLCB0bXAuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXIuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAgICAgLy8vICAgICBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHJibGQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9UT0RPOiB3b3JrYXJvdW5kIGZvciBwcmltaXRpdmUgdHlwZXMgd2l0aCBUSnNvblByb3RvY29sLCB0aGluayAtIGhvdyB0byByZXdyaXRlIGludG8gbW9yZSBlYXN5IGZvcm0gd2l0aG91dCBleGNlcHRpb25zCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUSlNPTlByb3RvY29sSGVscGVyLklzSnNvbk51bWVyaWMoY2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IChjaGFyKWF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBzdHJibGQuQXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSnNvbkludGVnZXJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN0ciA9IGF3YWl0IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvbmcuUGFyc2Uoc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgICAgICAvLy8gICAgIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWRKc29uRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhcnIgPSBhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKHRydWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB2YXIgZHViID0gZG91YmxlLlBhcnNlKFV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyLCAwLCBhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIUNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFkb3VibGUuSXNOYU4oZHViKSAmJiAhZG91YmxlLklzSW5maW5pdHkoZHViKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBkdWI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChDb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShhd2FpdCBSZWFkSnNvbk51bWVyaWNDaGFyc0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkSnNvbkJhc2U2NEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBsZW4gPSBiLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBvZmYgPSAwOworICAgICAgICAgICAgdmFyIHNpemUgPSAwOworCisgICAgICAgICAgICAvLyByZWR1Y2UgbGVuIHRvIGlnbm9yZSBmaWxsIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAoKGxlbiA+IDApICYmIChiW2xlbiAtIDFdID09ICc9JykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlYWQgJiBkZWNvZGUgZnVsbCBieXRlIHRyaXBsZXRzID0gNCBzb3VyY2UgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPiA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgb2ZmICs9IDQ7CisgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgICAgICAgICAgc2l6ZSArPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgICAgICAgICAgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgZXhUeXBlKQorICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRGVjb2RlKGIsIG9mZiwgbGVuLCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBzaXplICs9IGxlbiAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNhZGx5IHdlIG11c3QgY29weSB0aGUgYnl0ZVtdIChhbnkgd2F5IGFyb3VuZCB0aGlzPykKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoYiwgMCwgcmVzdWx0LCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuTGVmdEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFJlYWRKc29uQXJyYXlFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IFZlcnNpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IFV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlBlZWtBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoY2ggPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gKHNob3J0KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICBtYXAuVmFsdWVUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbWFwLkNvdW50ID0gKGludCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBsaXN0LkVsZW1lbnRUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbGlzdC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQoKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHNldC5FbGVtZW50VHlwZSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUoYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgICAgIHNldC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRKc29uRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gVXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkJhc2U2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBJVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKKyAgICAgICAgLy8vICAgICBpbnNlcnRpbmcvUmVhZGluZyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMKKyAgICAgICAgLy8vICAgICBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIFRKc29uUHJvdG9jb2wgUHJvdG87CisKKyAgICAgICAgICAgIHB1YmxpYyBKU09OQmFzZUNvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQcm90byA9IHByb3RvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKKyAgICAgICAgLy8vICAgICBmb3IgdGhlIGZpcnN0IG9uZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfZmlyc3QgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgSlNPTkxpc3RDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5SZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgICAgICAgIC8vLyAgICAgb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KKyAgICAgICAgLy8vICAgICBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCisgICAgICAgIC8vLyAgICAgZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfY29sb24gPSB0cnVlOworCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgX2ZpcnN0ID0gdHJ1ZTsKKworICAgICAgICAgICAgcHVibGljIEpTT05QYWlyQ29udGV4dChUSnNvblByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlRyYW5zLldyaXRlQXN5bmMoX2NvbG9uID8gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Db2xvbiA6IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlJlYWRKc29uU3ludGF4Q2hhckFzeW5jKF9jb2xvbiA/IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29sb24gOiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9ICFfY29sb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF9kYXRhID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzRGF0YTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBUSnNvblByb3RvY29sIFByb3RvOworCisgICAgICAgICAgICBwdWJsaWMgTG9va2FoZWFkUmVhZGVyKFRKc29uUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLy8gICAgIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJ5dGU+IFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZGF0YVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCisgICAgICAgICAgICAvLy8gICAgIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ynl0ZT4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGFbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdlNGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpAQCAtMCwwICsxLDkxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLyoqCisgICAgKiBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICAgICogY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCisgICAgKiB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgICAgKgorICAgICogTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICAgICogT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgICAgKgorICAgICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICAgICoKKyAgICAqICAgICBUU29ja2V0Q2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAqICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICoKKyAgICAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgKgorICAgICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICAgICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICAgICoKKyAgICAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAgICAqCisgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAgICAqCisgICAgKi8KKworICAgIC8vVE9ETzogaW1wbGVtZW50YXRpb24gb2YgVFByb3RvY29sCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgIHsKKyAgICAgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBTZXBhcmF0b3IgPSAiOiI7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3NlcnZpY2VOYW1lOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCisgICAgICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQXJnczoKKyAgICAgICAgICogIHByb3RvY29sICAgICAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbAorICAgICAgICAgKiAgc2VydmljZU5hbWUgICAgIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgc3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS5UeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLkNhbGw6CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuT25ld2F5OgorICAgICAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKCQie19zZXJ2aWNlTmFtZX17U2VwYXJhdG9yfXttZXNzYWdlLk5hbWV9IiwgbWVzc2FnZS5UeXBlLCBtZXNzYWdlLlNlcUlEKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sLmNzCkBAIC0wLDAgKzEsMzc2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRSZWN1cnNpb25EZXB0aCA9IDY0OworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByb3RlY3RlZCBpbnQgUmVjdXJzaW9uRGVwdGg7CisKKyAgICAgICAgcHJvdGVjdGVkIFRDbGllbnRUcmFuc3BvcnQgVHJhbnM7CisKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFucyA9IHRyYW5zOworICAgICAgICAgICAgUmVjdXJzaW9uTGltaXQgPSBEZWZhdWx0UmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICBSZWN1cnNpb25EZXB0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVENsaWVudFRyYW5zcG9ydCBUcmFuc3BvcnQgPT4gVHJhbnM7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBSZWN1cnNpb25MaW1pdCB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSZWN1cnNpb25EZXB0aCA8IFJlY3Vyc2lvbkxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrUmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICAtLVJlY3Vyc2lvbkRlcHRoOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoVHJhbnMgYXMgSURpc3Bvc2FibGUpPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luQXN5bmMoVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZU1hcEJlZ2luQXN5bmMobWFwLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVMaXN0QmVnaW5Bc3luYyhsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTZXRCZWdpbkFzeW5jKHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU2V0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQm9vbEFzeW5jKGIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYyhiLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkxNkFzeW5jKGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTY0QXN5bmMoaTY0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRG91YmxlQXN5bmMoZCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKHMsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZE1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZE1hcEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8c2J5dGU+IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8ZG91YmxlPiBSZWFkRG91YmxlQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8ZG91YmxlPiBSZWFkRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbERlY29yYXRvci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRGVjb3JhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjI3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbERlY29yYXRvci5jcwpAQCAtMCwwICsxLDI0NyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgVFByb3RvY29sRGVjb3JhdG9yIGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCBUUHJvdG9jb2wgaW5zdGFuY2UsCisgICAgLy8vICAgICBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuV2hpbGUgaXQgaGFzCisgICAgLy8vICAgICBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAgICAvLy8gICAgIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfd3JhcHBlZFByb3RvY29sOworCisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sLlRyYW5zcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dyYXBwZWRQcm90b2NvbCA9IHByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKEBzdHJ1Y3QsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW5Bc3luYyhtYXAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luQXN5bmMobGlzdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEJlZ2luQXN5bmMoc2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUJvb2xBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUJ5dGVBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJMTZBc3luYyhpMTYsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJMzJBc3luYyhpMzIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlSTY0QXN5bmMoaTY0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZURvdWJsZUFzeW5jKGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU3RyaW5nQXN5bmMocywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkTWFwQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRMaXN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZERvdWJsZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzY3YzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw1OSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gUmVTaGFycGVyIGRpc2FibGUgSW5jb25zaXN0ZW50TmFtaW5nCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIHB1YmxpYyBjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBkbyBub3QgcmVuYW1lIHB1YmxpYyBjb25zdGFudHMgLSB0aGV5IHVzZWQgaW4gZ2VuZXJhdGVkIGZpbGVzCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERVBUSF9MSU1JVCA9IDY7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBUeXBlID0gVU5LTk9XTjsKKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBHZXRFeGNlcHRpb25UeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFR5cGU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NEhlbHBlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmZjVlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRIZWxwZXIuY3MKQEAgLTAsMCArMSwxMDEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVEJhc2U2NEhlbHBlcgorICAgIHsKKyAgICAgICAgLy9UT0RPOiBDb25zdGFudHMKKyAgICAgICAgLy9UT0RPOiBDaGVjayBmb3IgYXJncworICAgICAgICAvL1RPRE86IFVuaXRlc3RzCisKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVuY29kZVRhYmxlID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludFtdIERlY29kZVRhYmxlID0KKyAgICAgICAgeworICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjIsIC0xLCAtMSwgLTEsIDYzLAorICAgICAgICAgICAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgICAgICAgICAgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICAgICAgICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorICAgICAgICB9OworCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEVuY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LCBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yoc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0ZdOworCisgICAgICAgICAgICBpZiAobGVuID09IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmICsgMl0gPj4gNikgJiAweDAzKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDNdID0gKGJ5dGUpIEVuY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4M0ZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGVuID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbGVuID09IDEKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBEZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSAoKERlY29kZVRhYmxlW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwgKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA+PiA0KSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAoKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPDwgNCkgJiAweEYwKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPj4gMikpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdIDw8IDYpICYgMHhDMCkgfCBEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgM10gJiAweDBGRl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0VXRpbHMuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0VXRpbHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmZDQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRVdGlscy5jcwpAQCAtMCwwICsxLDEwMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUQmFzZTY0VXRpbHMKKyAgICB7CisgICAgICAgIC8vVE9ETzogQ29uc3RhbnRzCisgICAgICAgIC8vVE9ETzogQ2hlY2sgZm9yIGFyZ3MKKyAgICAgICAgLy9UT0RPOiBVbml0ZXN0cworCisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBFbmNvZGVUYWJsZSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnRbXSBEZWNvZGVUYWJsZSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDYyLCAtMSwgLTEsIC0xLCA2MywKKyAgICAgICAgICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAgICAgICAgIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsCisgICAgICAgICAgICA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKKyAgICAgICAgfTsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBFbmNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZl0gPj4gMikgJiAweDNGXTsKKworICAgICAgICAgICAgaWYgKGxlbiA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDKSB8ICgoc3JjW3NyY09mZiArIDJdID4+IDYpICYgMHgwMyldOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAzXSA9IChieXRlKSBFbmNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDNGXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0NdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGxlbiA9PSAxCisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRGVjb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihzcmMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSkgKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmXSAmIDB4MEZGXSA8PCAyKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPj4gNCkpOworCisgICAgICAgICAgICBpZiAobGVuID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdIDw8IDQpICYgMHhGMCkgfCAoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdID4+IDIpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA8PCA2KSAmIDB4QzApIHwgRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDNdICYgMHgwRkZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbENvbnN0YW50cy5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xDb25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlZmY3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xDb25zdGFudHMuY3MKQEAgLTAsMCArMSw2MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRKU09OUHJvdG9jb2xDb25zdGFudHMKKyAgICB7CisgICAgICAgIC8vVE9ETyBDaGVjayBmb3IgcGVyZm9ybWFuY2UgZm9yIHJldXNpbmcgSW1tdXRhYmxlQXJyYXkgZnJvbSBTeXN0ZW0uQ29sbGVjdGlvbnMuSW1tdXRhYmxlIChodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS9kb3RuZXQvMjAxMy8wNi8yNC9wbGVhc2Utd2VsY29tZS1pbW11dGFibGVhcnJheXQvKQorICAgICAgICAvLyBjYW4gYmUgcG9zc2libGUgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZSBhbmQgYWxzbyBiZXR0ZXIgR0MKKworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBDb21tYSA9IHsoYnl0ZSkgJywnfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gQ29sb24gPSB7KGJ5dGUpICc6J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIExlZnRCcmFjZSA9IHsoYnl0ZSkgJ3snfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUmlnaHRCcmFjZSA9IHsoYnl0ZSkgJ30nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTGVmdEJyYWNrZXQgPSB7KGJ5dGUpICdbJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIFJpZ2h0QnJhY2tldCA9IHsoYnl0ZSkgJ10nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUXVvdGUgPSB7KGJ5dGUpICciJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEJhY2tzbGFzaCA9IHsoYnl0ZSkgJ1xcJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gSnNvbkNoYXJUYWJsZSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIChieXRlKSAnYicsIChieXRlKSAndCcsIChieXRlKSAnbicsIDAsIChieXRlKSAnZicsIChieXRlKSAncicsIDAsIDAsCisgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgMSwgMSwgKGJ5dGUpICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY2hhcltdIEVzY2FwZUNoYXJzID0gIlwiXFwvYmZucnQiLlRvQ2hhckFycmF5KCk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY2FwZUNoYXJWYWx1ZXMgPSB7KGJ5dGUpICciJywgKGJ5dGUpICdcXCcsIChieXRlKSAnLycsIChieXRlKSAnXGInLCAoYnl0ZSkgJ1xmJywgKGJ5dGUpICdcbicsIChieXRlKSAnXHInLCAoYnl0ZSkgJ1x0J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY1NlcXVlbmNlcyA9IHsoYnl0ZSkgJ1xcJywgKGJ5dGUpICd1JywgKGJ5dGUpICcwJywgKGJ5dGUpICcwJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlTmFtZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUJvb2wgPSB7IChieXRlKSd0JywgKGJ5dGUpJ2YnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lQnl0ZSA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknOCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMTYgPSB7IChieXRlKSdpJywgKGJ5dGUpJzEnLCAoYnl0ZSknNicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMzIgPSB7IChieXRlKSdpJywgKGJ5dGUpJzMnLCAoYnl0ZSknMicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJNjQgPSB7IChieXRlKSdpJywgKGJ5dGUpJzYnLCAoYnl0ZSknNCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVEb3VibGUgPSB7IChieXRlKSdkJywgKGJ5dGUpJ2InLCAoYnl0ZSknbCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJ1Y3QgPSB7IChieXRlKSdyJywgKGJ5dGUpJ2UnLCAoYnl0ZSknYycgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJpbmcgPSB7IChieXRlKSdzJywgKGJ5dGUpJ3QnLCAoYnl0ZSkncicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVNYXAgPSB7IChieXRlKSdtJywgKGJ5dGUpJ2EnLCAoYnl0ZSkncCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVMaXN0ID0geyAoYnl0ZSknbCcsIChieXRlKSdzJywgKGJ5dGUpJ3QnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lU2V0ID0geyAoYnl0ZSkncycsIChieXRlKSdlJywgKGJ5dGUpJ3QnIH07CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbEhlbHBlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjMjZhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MKQEAgLTAsMCArMSwxNzYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUSlNPTlByb3RvY29sSGVscGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBHZXRUeXBlTmFtZUZvclR5cGVJZChUVHlwZSB0eXBlSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZUlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQm9vbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQnl0ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCeXRlOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzI7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZURvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmc7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU3RydWN0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZU1hcDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQ7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUxpc3Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIGV4VHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUVHlwZSBHZXRUeXBlSWRGb3JUeXBlTmFtZShieXRlW10gbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICBpZiAobmFtZS5MZW5ndGggPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVswXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnaSc6CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzgnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnMSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICc2JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnbCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdtJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLk1hcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAncic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpICd0JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lWzFdID09IChieXRlKSAnZScpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICd0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIGV4VHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzSnNvbk51bWVyaWMoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknKyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknRSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknZSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgICAgICAgLy8vICAgICBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGUgVG9IZXhWYWwoYnl0ZSBjaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoICs9IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCB2YWx1ZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBUb0hleENoYXIoYnl0ZSB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCAmPSAweDBGOworICAgICAgICAgICAgaWYgKHZhbCA8IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCAtPSAxMDsKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UUHJvdG9jb2xVdGlsLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVFByb3RvY29sVXRpbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIwMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVFByb3RvY29sVXRpbC5jcwpAQCAtMCwwICsxLDExMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVFByb3RvY29sVXRpbAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrIFNraXBBc3luYyhUUHJvdG9jb2wgcHJvdG9jb2wsIFRUeXBlIHR5cGUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90b2NvbC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGRlY29kZSB0aGUgc3RyaW5nLCBqdXN0IHNraXAgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQmluYXJ5QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gYXdhaXQgcHJvdG9jb2wuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBTa2lwQXN5bmMocHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IGF3YWl0IHByb3RvY29sLlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBtYXAuS2V5VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgbWFwLlZhbHVlVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXQgPSBhd2FpdCBwcm90b2NvbC5SZWFkU2V0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgc2V0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgbGlzdC5FbGVtZW50VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIlVua25vd24gZGF0YSB0eXBlICIgKyB0eXBlLlRvU3RyaW5nKCJkIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90b2NvbC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9Bc3luY0Jhc2VTZXJ2ZXIuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL0FzeW5jQmFzZVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVjMzljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9Bc3luY0Jhc2VTZXJ2ZXIuY3MKQEAgLTAsMCArMSwxODMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvL1RPRE86IHVuaGFuZGxlZCBleGNlcHRpb25zLCBldGMuCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBBc3luY0Jhc2VTZXJ2ZXIgOiBUQmFzZVNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFdhaXRpbmdEZWxheTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUYXNrIF9zZXJ2ZXJUYXNrOworCisgICAgICAgIHB1YmxpYyBBc3luY0Jhc2VTZXJ2ZXIoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnksIGludCBjbGllbnRXYWl0aW5nRGVsYXkgPSAxMCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgIGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihBc3luY0Jhc2VTZXJ2ZXIpKSwgY2xpZW50V2FpdGluZ0RlbGF5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXN5bmNCYXNlU2VydmVyKElUUHJvY2Vzc29yRmFjdG9yeSBpdFByb2Nlc3NvckZhY3RvcnksIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXIgbG9nZ2VyLCBpbnQgY2xpZW50V2FpdGluZ0RlbGF5ID0gMTApCisgICAgICAgICAgICA6IGJhc2UoaXRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnRXYWl0aW5nRGVsYXkgPSBjbGllbnRXYWl0aW5nRGVsYXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBTZXJ2ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjYW5jZWxhdGlvbiB0b2tlbgorICAgICAgICAgICAgICAgIF9zZXJ2ZXJUYXNrID0gVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IFN0YXJ0TGlzdGVuaW5nKGNhbmNlbGxhdGlvblRva2VuKSwgVGFza0NyZWF0aW9uT3B0aW9ucy5Mb25nUnVubmluZyk7CisgICAgICAgICAgICAgICAgYXdhaXQgX3NlcnZlclRhc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBTdGFydExpc3RlbmluZyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIlN0YXJ0ZWQgbGlzdGVuaW5nIGF0IHNlcnZlciIpOworCisgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByZVNlcnZlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJUcmFuc3BvcnQuSXNDbGllbnRQZW5kaW5nKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIldhaXRpbmcgZm9yIGNsaWVudCBjb25uZWN0aW9uIik7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBhd2FpdCBTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IEV4ZWN1dGUoY2xpZW50LCBjYW5jZWxsYXRpb25Ub2tlbiksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgkIlRyYW5zcG9ydCBleGNlcHRpb246IHt0dHh9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5EZWxheShUaW1lU3Bhbi5Gcm9tTWlsbGlzZWNvbmRzKF9jbGllbnRXYWl0aW5nRGVsYXkpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goVGFza0NhbmNlbGVkRXhjZXB0aW9uKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIkNvbXBsZXRlZCBsaXN0ZW5pbmcgYXQgc2VydmVyIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIEV4ZWN1dGUoVENsaWVudFRyYW5zcG9ydCBjbGllbnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIlN0YXJ0ZWQgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyIpOworCisgICAgICAgICAgICB2YXIgcHJvY2Vzc29yID0gSXRQcm9jZXNzb3JGYWN0b3J5LkdldEFzeW5jUHJvY2Vzc29yKGNsaWVudCwgdGhpcyk7CisKKyAgICAgICAgICAgIFRDbGllbnRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gSW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IE91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gSW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IGF3YWl0IFNlcnZlckV2ZW50SGFuZGxlci5DcmVhdGVDb250ZXh0QXN5bmMoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhd2FpdCBpbnB1dFRyYW5zcG9ydC5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByb2Nlc3NDb250ZXh0QXN5bmMoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IHByb2Nlc3Nvci5Qcm9jZXNzQXN5bmMoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCQiVHJhbnNwb3J0IGV4Y2VwdGlvbjoge3R0eH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoJCJFcnJvcjoge3h9Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBTZXJ2ZXJFdmVudEhhbmRsZXIuRGVsZXRlQ29udGV4dEFzeW5jKGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCJDb21wbGV0ZWQgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UQmFzZVNlcnZlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVEJhc2VTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZGQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVEJhc2VTZXJ2ZXIuY3MKQEAgLTAsMCArMSw3OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlU2VydmVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXI7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBJbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IElucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvY2Vzc29yRmFjdG9yeSBJdFByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworCisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIFNlcnZlckV2ZW50SGFuZGxlcjsKKyAgICAgICAgcHJvdGVjdGVkIFRTZXJ2ZXJUcmFuc3BvcnQgU2VydmVyVHJhbnNwb3J0OworCisgICAgICAgIHByb3RlY3RlZCBUQmFzZVNlcnZlcihJVFByb2Nlc3NvckZhY3RvcnkgaXRQcm9jZXNzb3JGYWN0b3J5LCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LCBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBJTG9nZ2VyIGxvZ2dlcikKKyAgICAgICAgeworICAgICAgICAgICAgSXRQcm9jZXNzb3JGYWN0b3J5ID0gaXRQcm9jZXNzb3JGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGl0UHJvY2Vzc29yRmFjdG9yeSkpOworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0VHJhbnNwb3J0RmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkpOworICAgICAgICAgICAgSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihpbnB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgTG9nZ2VyID0gbG9nZ2VyID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGxvZ2dlcikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0RXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2ZXJFdmVudEhhbmRsZXIgPSBzZWg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciBHZXRFdmVudEhhbmRsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU2VydmVyRXZlbnRIYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgU3RvcCgpOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2JiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKQEAgLTAsMCArMSw1NCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuU2VydmVyCit7CisgICAgLy9UT0RPOiByZXBsYWNlbWVudCBieSBldmVudD8KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBzZXJ2ZXIgdXNlcnMgdG8gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucyAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrIFByZVNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZyAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrPG9iamVjdD4gQ3JlYXRlQ29udGV4dEFzeW5jKFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQgKi8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVGFzayBEZWxldGVDb250ZXh0QXN5bmMob2JqZWN0IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2sgUHJvY2Vzc0NvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTEyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwzOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkgOiBJVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVRBc3luY1Byb2Nlc3NvciBfdEFzeW5jUHJvY2Vzc29yOworCisgICAgICAgIHB1YmxpYyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeShJVEFzeW5jUHJvY2Vzc29yIHRBc3luY1Byb2Nlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgX3RBc3luY1Byb2Nlc3NvciA9IHRBc3luY1Byb2Nlc3NvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJVEFzeW5jUHJvY2Vzc29yIEdldEFzeW5jUHJvY2Vzc29yKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMsIFRCYXNlU2VydmVyIGJhc2VTZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3RBc3luY1Byb2Nlc3NvcjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWMxNDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDE1MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgVW5rbm93bk1ldGhvZCwKKyAgICAgICAgICAgIEludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIFdyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIEJhZFNlcXVlbmNlSWQsCisgICAgICAgICAgICBNaXNzaW5nUmVzdWx0LAorICAgICAgICAgICAgSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3IsCisgICAgICAgICAgICBJbnZhbGlkVHJhbnNmb3JtLAorICAgICAgICAgICAgSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBNZXNzYWdlVHlwZUZpZWxkSWQgPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFeFR5cGVGaWVsZElkID0gMjsKKworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSBUeXBlOworCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2s8VEFwcGxpY2F0aW9uRXhjZXB0aW9uPiBSZWFkQXN5bmMoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICB2YXIgdHlwZSA9IEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKKworICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLklEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZUZpZWxkSWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZFN0cmluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpbnB1dFByb3RvY29sLCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFeFR5cGVGaWVsZElkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuSTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlucHV0UHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaW5wdXRQcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZFN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBtZXNzYWdlVHlwZUZpZWxkTmFtZSA9ICJtZXNzYWdlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBleFR5cGVGaWVsZE5hbWUgPSAiZXhUeXBlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBzdHJ1Y3RBcHBsaWNhdGlvbkV4Y2VwdGlvbk5hbWUgPSAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIjsKKworICAgICAgICAgICAgdmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3Qoc3RydWN0QXBwbGljYXRpb25FeGNlcHRpb25OYW1lKTsKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsKKworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuTmFtZSA9IG1lc3NhZ2VUeXBlRmllbGROYW1lOworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSBNZXNzYWdlVHlwZUZpZWxkSWQ7CisgICAgICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZVN0cmluZ0FzeW5jKE1lc3NhZ2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWVsZC5OYW1lID0gZXhUeXBlRmllbGROYW1lOworICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgIGZpZWxkLklEID0gRXhUeXBlRmllbGRJZDsKKworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlSTMyQXN5bmMoKGludCkgVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTkyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEJhc2VDbGllbnQuY3MKQEAgLTAsMCArMSw5MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBUQmFzZUNsaWVudC4KKyAgICAvLy8gICAgIEJhc2UgY2xpZW50IGZvciBnZW5lcmF0ZWQgY2xpZW50cy4KKyAgICAvLy8gICAgIERvIG5vdCBjaGFuZ2UgdGhpcyBjbGFzcyB3aXRob3V0IGNoZWNraW5nIGdlbmVyYXRlZCBjb2RlIChuYW1pbmdzLCBldGMuKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlQ2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfaW5wdXRQcm90b2NvbDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2wgX291dHB1dFByb3RvY29sOworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgaW50IF9zZXFJZDsKKyAgICAgICAgcHVibGljIHJlYWRvbmx5IEd1aWQgQ2xpZW50SWQgPSBHdWlkLk5ld0d1aWQoKTsKKworICAgICAgICBwcm90ZWN0ZWQgVEJhc2VDbGllbnQoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2lucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0UHJvdG9jb2wpKTsKKyAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wgPT4gX2lucHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbCBPdXRwdXRQcm90b2NvbCA9PiBfb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIGludCBTZXFJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKytfc2VxSWQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlblRyYW5zcG9ydEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlblRyYW5zcG9ydEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBPcGVuVHJhbnNwb3J0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lucHV0UHJvdG9jb2wuVHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9vdXRwdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRQcm90b2NvbD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0UHJvdG9jb2w/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9URXhjZXB0aW9uLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9URXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBURXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCkBAIC0wLDAgKzEsMTQzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBJVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICAvL1RPRE86IExvY2FsaXphdGlvbgorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIElUQXN5bmNQcm9jZXNzb3I+IF9zZXJ2aWNlUHJvY2Vzc29yTWFwID0KKyAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgSVRBc3luY1Byb2Nlc3Nvcj4oKTsKKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ym9vbD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IGF3YWl0IGlwcm90LlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICBpZiAoKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuQ2FsbCkgJiYgKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuT25ld2F5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgZXhUeXBlIENBTEwgb3IgT05FV0FZIGV4cGVjdGVkIiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gbWVzc2FnZS5OYW1lLkluZGV4T2YoVE11bHRpcGxleGVkUHJvdG9jb2wuU2VwYXJhdG9yLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWwpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBGYWlsQXN5bmMob3Byb3QsIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICQiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHttZXNzYWdlLk5hbWV9LiBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBUUHJvdG9jb2wKKyAgICAgICAgICAgICAgICB2YXIgc2VydmljZU5hbWUgPSBtZXNzYWdlLk5hbWUuU3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBJVEFzeW5jUHJvY2Vzc29yIGFjdHVhbFByb2Nlc3NvcjsKKyAgICAgICAgICAgICAgICBpZiAoIV9zZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKHNlcnZpY2VOYW1lLCBvdXQgYWN0dWFsUHJvY2Vzc29yKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICQiU2VydmljZSBuYW1lIG5vdCBmb3VuZDoge3NlcnZpY2VOYW1lfS4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBSZWdpc3RlclByb2Nlc3NvcigpPyIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICB2YXIgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lLlN1YnN0cmluZyhzZXJ2aWNlTmFtZS5MZW5ndGggKyBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TZXBhcmF0b3IuTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlNlcUlEKTsKKworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzQXN5bmMobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgbmV3TWVzc2FnZSksIG9wcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNpbWlsYXIgdG8gYWxsIG90aGVyIHByb2Nlc3NvcnMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlZ2lzdGVyUHJvY2Vzc29yKHN0cmluZyBzZXJ2aWNlTmFtZSwgSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmljZVByb2Nlc3Nvck1hcC5Db250YWluc0tleShzZXJ2aWNlTmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICQiUHJvY2Vzc29yIG1hcCBhbHJlYWR5IGNvbnRhaW5zIHByb2Nlc3NvciB3aXRoIG5hbWU6ICd7c2VydmljZU5hbWV9JyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfc2VydmljZVByb2Nlc3Nvck1hcC5BZGQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgRmFpbEFzeW5jKFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLAorICAgICAgICAgICAgc3RyaW5nIGV0eHQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXBwZXggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGV4dHlwZSwgZXR4dCk7CisKKyAgICAgICAgICAgIHZhciBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKG1lc3NhZ2UuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbWVzc2FnZS5TZXFJRCk7CisKKyAgICAgICAgICAgIGF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3TWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgYXBwZXguV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3Byb3QuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZG9ubHkgVE1lc3NhZ2UgX21zZ0JlZ2luOworCisgICAgICAgICAgICBwdWJsaWMgU3RvcmVkTWVzc2FnZVByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbXNnQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9tc2dCZWdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvaiBiL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDZmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvagpAQCAtMCwwICsxLDMxIEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldHN0YW5kYXJkMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlRocmlmdDwvUGFja2FnZUlkPgorICAgIDxBdXRvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzPnRydWU8L0F1dG9HZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHM+CisgICAgPEdlbmVyYXRlQmluZGluZ1JlZGlyZWN0c091dHB1dFR5cGU+dHJ1ZTwvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VmVyc2lvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVZlcnNpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlGaWxlVmVyc2lvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUZpbGVWZXJzaW9uQXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZSIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmciIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nLkNvbnNvbGUiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nLkRlYnVnIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLklPLlBpcGVzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwLldpbkh0dHBIYW5kbGVyIiBWZXJzaW9uPSI0LjQuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lk5hbWVSZXNvbHV0aW9uIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5SZXF1ZXN0cyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuU2VjdXJpdHkiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWYxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjA2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9idWZTaXplOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfaW5wdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfb3V0cHV0QnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgwKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQ2xpZW50VHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICAvL1RPRE86IHNob3VsZCBzdXBwb3J0IG9ubHkgc3BlY2lmaWVkIGlucHV0IHRyYW5zcG9ydD8KKyAgICAgICAgcHVibGljIFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUgPSAxMDI0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmU2l6ZSA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGJ1ZlNpemUpLCAiQnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZih0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgIF9idWZTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQ2xpZW50VHJhbnNwb3J0IFVuZGVybHlpbmdUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIF90cmFuc3BvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gIV9pc0Rpc3Bvc2VkICYmIF90cmFuc3BvcnQuSXNPcGVuOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0Lk9wZW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgX3RyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvL1RPRE86IGludmVzdGlnYXRlIGhvdyBpdCBzaG91bGQgd29yayBjb3JyZWN0bHkKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPCBfYnVmU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPSBfYnVmU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdvdCA9IGF3YWl0IF9pbnB1dEJ1ZmZlci5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSk7CisKKyAgICAgICAgICAgIEFycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisKKyAgICAgICAgICAgIC8vIGludmVzdGlnYXRlCisgICAgICAgICAgICB2YXIgZmlsbGVkID0gYXdhaXQgX3RyYW5zcG9ydC5SZWFkQXN5bmMoYnVmU2VnbWVudC5BcnJheSwgMCwgKGludCkgX2lucHV0QnVmZmVyLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlNldExlbmd0aChmaWxsZWQpOworCisgICAgICAgICAgICBpZiAoZmlsbGVkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVsYXRpdmUgb2Zmc2V0IGZyb20gIm9mZiIgYXJndW1lbnQKKyAgICAgICAgICAgIHZhciB3cml0dGVuQ291bnQgPSAwOworICAgICAgICAgICAgaWYgKF9vdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2FwYSA9IChpbnQpIChfb3V0cHV0QnVmZmVyLkNhcGFjaXR5IC0gX291dHB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIHZhciB3cml0ZVNpemUgPSBjYXBhIDw9IGxlbmd0aCA/IGNhcGEgOiBsZW5ndGg7CisgICAgICAgICAgICAgICAgYXdhaXQgX291dHB1dEJ1ZmZlci5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCB3cml0ZVNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHdyaXR0ZW5Db3VudCArPSB3cml0ZVNpemU7CisgICAgICAgICAgICAgICAgaWYgKHdyaXRlU2l6ZSA9PSBjYXBhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgLy9fb3V0cHV0QnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gX291dHB1dEJ1ZmZlci5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIC8vYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGJ1ZlNlZ21lbnQuQXJyYXksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGRhdGEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAobGVuZ3RoIC0gd3JpdHRlbkNvdW50ID49IF9idWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCArIHdyaXR0ZW5Db3VudCwgX2J1ZlNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuQ291bnQgKz0gX2J1ZlNpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZW1haW4gPSBsZW5ndGggLSB3cml0dGVuQ291bnQ7CisgICAgICAgICAgICBpZiAocmVtYWluID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX291dHB1dEJ1ZmZlci5DYXBhY2l0eSA8IF9idWZTaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlci5DYXBhY2l0eSA9IF9idWZTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhd2FpdCBfb3V0cHV0QnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQgKyB3cml0dGVuQ291bnQsIHJlbWFpbiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfb3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IF9vdXRwdXRCdWZmZXIuVG9BcnJheSgpOyAvLyBUcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworCisgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGRhdGEgLypidWZTZWdtZW50LkFycmF5Ki8sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbihuYW1lb2YoX3RyYW5zcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2lucHV0QnVmZmVyPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyYW5zcG9ydD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEZyYW1lZENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9URnJhbWVkQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWJiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEZyYW1lZENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDIwMSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvL1RPRE86IGNoZWNrIGZvciBjb3JyZWN0IGltcGxlbWVudGF0aW9uIAorCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEZyYW1lZENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEhlYWRlclNpemUgPSA0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBfaGVhZGVyQnVmID0gbmV3IGJ5dGVbSGVhZGVyU2l6ZV07CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9yZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQ2xpZW50VHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF93cml0ZUJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHRyYW5zcG9ydCkpOworCisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiAhX2lzRGlzcG9zZWQgJiYgX3RyYW5zcG9ydC5Jc09wZW47CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBfdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBnb3QgPSBhd2FpdCBfcmVhZEJ1ZmZlci5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICAgICAgICAgIGF3YWl0IFJlYWRGcmFtZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZWFkQnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEZyYW1lQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuUmVhZEFsbEFzeW5jKF9oZWFkZXJCdWYsIDAsIEhlYWRlclNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIHNpemUgPSBEZWNvZGVGcmFtZVNpemUoX2hlYWRlckJ1Zik7CisKKyAgICAgICAgICAgIF9yZWFkQnVmZmVyLlNldExlbmd0aChzaXplKTsKKyAgICAgICAgICAgIF9yZWFkQnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgIEFycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgX3JlYWRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKworICAgICAgICAgICAgdmFyIGJ1ZmYgPSBidWZTZWdtZW50LkFycmF5OworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LlJlYWRBbGxBc3luYyhidWZmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3dyaXRlQnVmZmVyLkxlbmd0aCArIGxlbmd0aCA+IGludC5NYXhWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBGbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX3dyaXRlQnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICAvL193cml0ZUJ1ZmZlci5UcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworICAgICAgICAgICAgLy92YXIgYnVmID0gYnVmU2VnbWVudC5BcnJheTsKKyAgICAgICAgICAgIHZhciBidWYgPSBfd3JpdGVCdWZmZXIuVG9BcnJheSgpOworCisgICAgICAgICAgICAvL3ZhciBsZW4gPSAoaW50KV93cml0ZUJ1ZmZlci5MZW5ndGg7CisgICAgICAgICAgICB2YXIgZGF0YUxlbiA9IChpbnQpIF93cml0ZUJ1ZmZlci5MZW5ndGggLSBIZWFkZXJTaXplOworICAgICAgICAgICAgaWYgKGRhdGFMZW4gPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluamVjdCBtZXNzYWdlIGhlYWRlciBpbnRvIHRoZSByZXNlcnZlZCBidWZmZXIgc3BhY2UKKyAgICAgICAgICAgIEVuY29kZUZyYW1lU2l6ZShkYXRhTGVuLCBidWYpOworCisgICAgICAgICAgICAvLyBTZW5kIHRoZSBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoYnVmLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRXcml0ZUJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIG1lc3NhZ2UgaGVhZGVyIHRvIGJlIHB1dCByaWdodCBiZWZvcmUgc2VuZGluZyBpdCBvdXQKKyAgICAgICAgICAgIF93cml0ZUJ1ZmZlci5TZXRMZW5ndGgoSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICBfd3JpdGVCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEVuY29kZUZyYW1lU2l6ZShpbnQgZnJhbWVTaXplLCBieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBidWZbMF0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDI0KSk7CisgICAgICAgICAgICBidWZbMV0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDE2KSk7CisgICAgICAgICAgICBidWZbMl0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDgpKTsKKyAgICAgICAgICAgIGJ1ZlszXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBEZWNvZGVGcmFtZVNpemUoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ1ZlsyXSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoYnVmWzNdICYgMHhmZik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiVEZyYW1lZENsaWVudFRyYW5zcG9ydCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3JlYWRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlQnVmZmVyPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF90cmFuc3BvcnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2QzODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMjYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHA7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHAuSGVhZGVyczsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZVtdIF9jZXJ0aWZpY2F0ZXM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVXJpIF91cmk7CisKKyAgICAgICAgLy8gVGltZW91dHMgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgIHByaXZhdGUgaW50IF9jb25uZWN0VGltZW91dCA9IDMwMDAwOworICAgICAgICBwcml2YXRlIEh0dHBDbGllbnQgX2h0dHBDbGllbnQ7CisgICAgICAgIHByaXZhdGUgU3RyZWFtIF9pbnB1dFN0cmVhbTsKKworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIF9vdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gY3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgIDogdGhpcyh1LCBFbnVtZXJhYmxlLkVtcHR5PFg1MDlDZXJ0aWZpY2F0ZT4oKSwgY3VzdG9tSGVhZGVycykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRW51bWVyYWJsZTxYNTA5Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcywKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBfdXJpID0gdTsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZXMgPSAoY2VydGlmaWNhdGVzID8/IEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICBDdXN0b21IZWFkZXJzID0gY3VzdG9tSGVhZGVyczsKKworICAgICAgICAgICAgLy8gZHVlIHRvIGN1cnJlbnQgYnVnIHdpdGggcGVyZm9ybWFuY2Ugb2YgRGlzcG9zZSBpbiBuZXRjb3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3RuZXQvY29yZWZ4L2lzc3Vlcy84ODA5CisgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSBzd2l0Y2hlZCB0byBkZWZhdWx0IHdheSAoY3JlYXRlIGNsaWVudC0+dXNlLT5kaXNwb3NlIHBlciBmbHVzaCkgbGF0ZXIKKyAgICAgICAgICAgIF9odHRwQ2xpZW50ID0gQ3JlYXRlQ2xpZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvbm5lY3RUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldCB7IF9jb25uZWN0VGltZW91dCA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfb3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaHR0cENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9odHRwQ2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfaHR0cENsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgX2lucHV0U3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX291dHB1dFN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSHR0cENsaWVudCBDcmVhdGVDbGllbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBIdHRwQ2xpZW50SGFuZGxlcigpOworICAgICAgICAgICAgaGFuZGxlci5DbGllbnRDZXJ0aWZpY2F0ZXMuQWRkUmFuZ2UoX2NlcnRpZmljYXRlcyk7CisKKyAgICAgICAgICAgIHZhciBodHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoaGFuZGxlcik7CisKKyAgICAgICAgICAgIGlmIChfY29ubmVjdFRpbWVvdXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuVGltZW91dCA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKF9jb25uZWN0VGltZW91dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0dHBDbGllbnQuRGVmYXVsdFJlcXVlc3RIZWFkZXJzLkFjY2VwdC5BZGQobmV3IE1lZGlhVHlwZVdpdGhRdWFsaXR5SGVhZGVyVmFsdWUoImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikpOworICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuVXNlckFnZW50LkFkZChuZXcgUHJvZHVjdEluZm9IZWFkZXJWYWx1ZSgiVEh0dHBDbGllbnRUcmFuc3BvcnQiLCAiMS4wLjAiKSk7CisKKyAgICAgICAgICAgIGlmIChDdXN0b21IZWFkZXJzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gQ3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuRGVmYXVsdFJlcXVlc3RIZWFkZXJzLkFkZChpdGVtLktleSwgaXRlbS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaHR0cENsaWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9vdXRwdXRTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBvdXRTdHJlYW0gPSBuZXcgU3RyZWFtQ29udGVudChfb3V0cHV0U3RyZWFtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IGF3YWl0IF9odHRwQ2xpZW50LlBvc3RBc3luYyhfdXJpLCBvdXRTdHJlYW0sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbXNnLkVuc3VyZVN1Y2Nlc3NTdGF0dXNDb2RlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IGF3YWl0IG1zZy5Db250ZW50LlJlYWRBc1N0cmVhbUFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lucHV0U3RyZWFtLkNhblNlZWspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChIdHRwUmVxdWVzdEV4Y2VwdGlvbiB3eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX2h0dHBDbGllbnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTU1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDk3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfYnl0ZVN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2J5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydChieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBfYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIGRvIG5vdGhpbmcgKiovCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfYnl0ZVN0cmVhbS5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX2J5dGVTdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF9ieXRlU3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gR2V0QnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9ieXRlU3RyZWFtLlRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ieXRlU3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlNGJhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTUgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlQ2xpZW50U3RyZWFtIF9jbGllbnQ7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHBpcGUpIDogdGhpcygiLiIsIHBpcGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBzZXJ2ZXIsIHN0cmluZyBwaXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VydmVyTmFtZSA9IHN0cmluZy5Jc051bGxPcldoaXRlU3BhY2Uoc2VydmVyKSA/IHNlcnZlciA6ICIuIjsKKworICAgICAgICAgICAgX2NsaWVudCA9IG5ldyBOYW1lZFBpcGVDbGllbnRTdHJlYW0oc2VydmVyTmFtZSwgcGlwZSwgUGlwZURpcmVjdGlvbi5Jbk91dCwgUGlwZU9wdGlvbnMuTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gX2NsaWVudCAhPSBudWxsICYmIF9jbGllbnQuSXNDb25uZWN0ZWQ7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IF9jbGllbnQuQ29ubmVjdEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfY2xpZW50LlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX2NsaWVudC5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFNvY2tldENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjlkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFNvY2tldENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDEzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNvY2tldENsaWVudFRyYW5zcG9ydCA6IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICBwdWJsaWMgVFNvY2tldENsaWVudFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBUY3BDbGllbnQgPSBjbGllbnQgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoY2xpZW50KSk7CisKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEhvc3QgPSBob3N0OworICAgICAgICAgICAgUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgICAgIFRjcENsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIFRjcENsaWVudC5SZWNlaXZlVGltZW91dCA9IFRjcENsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBUY3BDbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgSG9zdCB7IGdldDsgfQorICAgICAgICBwdWJsaWMgaW50IFBvcnQgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFRjcENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGNwQ2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gVGNwQ2xpZW50LlNlbmRUaW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUY3BDbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGNwQ2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFBvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkludmFsaWQgb3Igbm90IGluaXRpYWxpemVkIHRjcCBjbGllbnQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVGNwQ2xpZW50LkNvbm5lY3RBc3luYyhIb3N0LCBQb3J0KTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBUY3BDbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBUY3BDbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKworICAgICAgICAgICAgaWYgKFRjcENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRjcENsaWVudC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRjcENsaWVudD8uRGlzcG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFN0cmVhbUNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU3RyZWFtQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTY0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFN0cmVhbUNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDExMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHByb3RlY3RlZCBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTdHJlYW1DbGllbnRUcmFuc3BvcnQoU3RyZWFtIGlucHV0U3RyZWFtLCBTdHJlYW0gb3V0cHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmVhbSBPdXRwdXRTdHJlYW0geyBnZXQ7IHNldDsgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gSW5wdXRTdHJlYW0geyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IElucHV0U3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgT3V0cHV0U3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3V0cHV0U3RyZWFtLkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiZTRlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjM3IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy9UT0RPOiBjaGVjayBmb3IgY29ycmVjdCB3b3JrCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0IDogVFN0cmVhbUNsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYNTA5Q2VydGlmaWNhdGUyIF9jZXJ0aWZpY2F0ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBfY2VydFZhbGlkYXRvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJUEFkZHJlc3MgX2hvc3Q7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfaXNTZXJ2ZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBfc3NsUHJvdG9jb2xzOworICAgICAgICBwcml2YXRlIFRjcENsaWVudCBfY2xpZW50OworICAgICAgICBwcml2YXRlIFNzbFN0cmVhbSBfc2VjdXJlU3RyZWFtOworICAgICAgICBwcml2YXRlIGludCBfdGltZW91dDsKKworICAgICAgICBwdWJsaWMgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLCBib29sIGlzU2VydmVyID0gZmFsc2UsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisgICAgICAgICAgICBfaXNTZXJ2ZXIgPSBpc1NlcnZlcjsKKworICAgICAgICAgICAgaWYgKGlzU2VydmVyICYmIGNlcnRpZmljYXRlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0IG5lZWRzIGNlcnRpZmljYXRlIHRvIGJlIHVzZWQgZm9yIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgIG5hbWVvZihjZXJ0aWZpY2F0ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIGNlcnRpZmljYXRlUGF0aCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsCisgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydGlmaWNhdGVQYXRoKSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUgPSBudWxsLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwKKyAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF90aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQgeyBfY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudC5TZW5kVGltZW91dCA9IF90aW1lb3V0ID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50ID0+IF9jbGllbnQ7CisKKyAgICAgICAgcHVibGljIElQQWRkcmVzcyBIb3N0ID0+IF9ob3N0OworCisgICAgICAgIHB1YmxpYyBpbnQgUG9ydCA9PiBfcG9ydDsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnQgPSBuZXcgVGNwQ2xpZW50KCk7CisgICAgICAgICAgICBfY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudC5TZW5kVGltZW91dCA9IF90aW1lb3V0OworICAgICAgICAgICAgX2NsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgWDUwOUNoYWluIGNoYWluLAorICAgICAgICAgICAgU3NsUG9saWN5RXJyb3JzIHNzbFZhbGlkYXRpb25FcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzc2xWYWxpZGF0aW9uRXJyb3JzID09IFNzbFBvbGljeUVycm9ycy5Ob25lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2hvc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3BvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBfY2xpZW50LkNvbm5lY3RBc3luYyhfaG9zdCwgX3BvcnQpOworICAgICAgICAgICAgICAgIGF3YWl0IFNldHVwVGxzQXN5bmMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFNldHVwVGxzQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdmFsaWRhdG9yID0gX2NlcnRWYWxpZGF0b3IgPz8gRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yOworCisgICAgICAgICAgICBpZiAoX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKF9jbGllbnQuR2V0U3RyZWFtKCksIGZhbHNlLCB2YWxpZGF0b3IsIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKF9jbGllbnQuR2V0U3RyZWFtKCksIGZhbHNlLCB2YWxpZGF0b3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2lzU2VydmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIGF3YWl0CisgICAgICAgICAgICAgICAgICAgICAgICBfc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzU2VydmVyQXN5bmMoX2NlcnRpZmljYXRlLCBfY2VydFZhbGlkYXRvciAhPSBudWxsLCBfc3NsUHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgdmFyIGNlcnRzID0gX2NlcnRpZmljYXRlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24ge19jZXJ0aWZpY2F0ZX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9IF9ob3N0LlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IF9zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNDbGllbnRBc3luYyh0YXJnZXRIb3N0LCBjZXJ0cywgX3NzbFByb3RvY29scywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IF9zZWN1cmVTdHJlYW07CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBfc2VjdXJlU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisgICAgICAgICAgICBpZiAoX2NsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9jbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlY3VyZVN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RIdHRwU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5IdHRwOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSHR0cFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHN0cmluZyBDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxvZ2dlciBfbG9nZ2VyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlcXVlc3REZWxlZ2F0ZSBfbmV4dDsKKyAgICAgICAgcHJvdGVjdGVkIEVuY29kaW5nIEVuY29kaW5nID0gRW5jb2RpbmcuVVRGODsKKworICAgICAgICBwcm90ZWN0ZWQgSVRQcm90b2NvbEZhY3RvcnkgSW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgcHJvdGVjdGVkIElUQXN5bmNQcm9jZXNzb3IgUHJvY2Vzc29yOworCisgICAgICAgIHB1YmxpYyBUSHR0cFNlcnZlclRyYW5zcG9ydChJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgUmVxdWVzdERlbGVnYXRlIG5leHQsIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV4dCwgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwU2VydmVyVHJhbnNwb3J0KElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBJVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFJlcXVlc3REZWxlZ2F0ZSBuZXh0LAorICAgICAgICAgICAgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBuZXh0LCBsb2dnZXJGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCwgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxvZ2dlckZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihsb2dnZXJGYWN0b3J5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFByb2Nlc3NvciA9IHByb2Nlc3NvciA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihwcm9jZXNzb3IpKTsKKyAgICAgICAgICAgIElucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaW5wdXRQcm90b2NvbEZhY3RvcnkpKTsKKyAgICAgICAgICAgIE91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihvdXRwdXRQcm90b2NvbEZhY3RvcnkpKTsKKworICAgICAgICAgICAgX25leHQgPSBuZXh0OworICAgICAgICAgICAgX2xvZ2dlciA9IGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyPFRIdHRwU2VydmVyVHJhbnNwb3J0PigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgSW52b2tlKEh0dHBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudFR5cGUgPSBDb250ZW50VHlwZTsKKyAgICAgICAgICAgIGF3YWl0IFByb2Nlc3NSZXF1ZXN0QXN5bmMoY29udGV4dCwgY29udGV4dC5SZXF1ZXN0QWJvcnRlZCk7IC8vVE9ETzogY2hlY2sgZm9yIGNvcnJlY3QgbG9naWMKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFByb2Nlc3NSZXF1ZXN0QXN5bmMoSHR0cENvbnRleHQgY29udGV4dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFN0cmVhbUNsaWVudFRyYW5zcG9ydChjb250ZXh0LlJlcXVlc3QuQm9keSwgY29udGV4dC5SZXNwb25zZS5Cb2R5KTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gSW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoYXdhaXQgUHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dCwgb3V0cHV0LCBjYW5jZWxsYXRpb25Ub2tlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENsaWVudCBkaWVkLCBqdXN0IG1vdmUgb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Njc4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE5MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFBpcGUgb24gdGhlIGxvY2FsaG9zdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3BpcGVBZGRyZXNzOworCisgICAgICAgIHByaXZhdGUgYm9vbCBfYXN5bmNNb2RlID0gdHJ1ZTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIF9pc1BlbmRpbmcgPSB0cnVlOworCisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlU2VydmVyU3RyZWFtIF9zdHJlYW0gPSBudWxsOworCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHN0cmluZyBwaXBlQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgX3BpcGVBZGRyZXNzID0gcGlwZUFkZHJlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgZm9yIGRpc2NvbmVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbS5EaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgX2lzUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfaXNQZW5kaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVBpcGVJbnN0YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFBpcGVEaXJlY3Rpb24uSW5PdXQ7CisgICAgICAgICAgICAgICAgdmFyIG1heGNvbm4gPSAyNTQ7CisgICAgICAgICAgICAgICAgdmFyIG1vZGUgPSBQaXBlVHJhbnNtaXNzaW9uTW9kZS5CeXRlOworICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gX2FzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7CisgICAgICAgICAgICAgICAgdmFyIGluYnVmID0gNDA5NjsKKyAgICAgICAgICAgICAgICB2YXIgb3V0YnVmID0gNDA5NjsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzZWN1cml0eQorCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShfcGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgaW5idWYsIG91dGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbikgLy8gTW9ubyBzdGlsbCBkb2VzIG5vdCBzdXBwb3J0IGFzeW5jLCBmYWxsYmFjayB0byBzeW5jCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2FzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmPSAoflBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShfcGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgaW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hc3luY01vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW5zdXJlUGlwZUluc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBhd2FpdCBfc3RyZWFtLldhaXRGb3JDb25uZWN0aW9uQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFNlcnZlclRyYW5zcG9ydChfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsgLy8gcGFzcyBvd25lcnNoaXAgdG8gU2VydmVyVHJhbnNwb3J0CisKKyAgICAgICAgICAgICAgICAvL19pc1BlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgU2VydmVyVHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE5hbWVkUGlwZVNlcnZlclN0cmVhbSBfc3RyZWFtOworCisgICAgICAgICAgICBwdWJsaWMgU2VydmVyVHJhbnNwb3J0KE5hbWVkUGlwZVNlcnZlclN0cmVhbSBzdHJlYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IF9zdHJlYW0gIT0gbnVsbCAmJiBfc3RyZWFtLklzQ29ubmVjdGVkOworCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfc3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF3YWl0IF9zdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg2ZTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNTAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50VGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRDbGllbnRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVEZyYW1lZENsaWVudFRyYW5zcG9ydCB0U29ja2V0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2YXIgdGNwQ2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQobmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQodGNwQ2xpZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRTb2NrZXRUcmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodFNvY2tldFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSkgdGNwQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ZDhhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0VHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFRpbWVvdXQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMpOgorICAgICAgICAgICAgdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCB1c2VCdWZmZXJlZFNvY2tldHMsIGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsIGJvb2wgdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgX3VzZUZyYW1lZFRyYW5zcG9ydCA9IHVzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRDbGllbnRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0U29ja2V0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2YXIgdGNwQ2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQodGNwQ2xpZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQodFNvY2tldFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUZyYW1lZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRTb2NrZXRUcmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodFNvY2tldFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSkgdGNwQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5ZmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgX2NsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9jbGllbnRUaW1lb3V0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlMiBfc2VydmVyQ2VydGlmaWNhdGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIF9zc2xQcm90b2NvbHM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIGZhbHNlLCBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKSAKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCB1c2VCdWZmZXJlZFNvY2tldHMsIGZhbHNlLCBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICBjbGllbnRDZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCisgICAgICAgICAgICBib29sIHVzZUZyYW1lZFRyYW5zcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjZXJ0aWZpY2F0ZS5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICAgICAiWW91ciBzZXJ2ZXItY2VydGlmaWNhdGUgbmVlZHMgdG8gaGF2ZSBhIHByaXZhdGUga2V5Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9zZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX3VzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgICAgIF91c2VGcmFtZWRUcmFuc3BvcnQgPSB1c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICBfY2xpZW50Q2VydFZhbGlkYXRvciA9IGNsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgX3NzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKElQQWRkcmVzcy5BbnksIF9wb3J0KTsKKyAgICAgICAgICAgICAgICBfc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0IHtwb3J0fS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhY2NlcHQgaXMgbm90IGJsb2NraW5nCisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6IHtzeC5NZXNzYWdlfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VydmVyLlBlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VENsaWVudFRyYW5zcG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworICAgICAgICAgICAgICAgIGNsaWVudC5TZW5kVGltZW91dCA9IGNsaWVudC5SZWNlaXZlVGltZW91dCA9IF9jbGllbnRUaW1lb3V0OworCisgICAgICAgICAgICAgICAgLy93cmFwIHRoZSBjbGllbnQgaW4gYW4gU1NMIFNvY2tldCBwYXNzaW5nIGluIHRoZSBTU0wgY2VydAorICAgICAgICAgICAgICAgIHZhciB0VGxzU29ja2V0ID0gbmV3IFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoY2xpZW50LCBfc2VydmVyQ2VydGlmaWNhdGUsIHRydWUsIF9jbGllbnRDZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBfc3NsUHJvdG9jb2xzKTsKKworICAgICAgICAgICAgICAgIGF3YWl0IHRUbHNTb2NrZXQuU2V0dXBUbHNBc3luYygpOworCisgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0cmFucyA9IHRUbHNTb2NrZXQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKF91c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6IHtleH0iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVENsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ5NmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE3OSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgY2xpZW50IGluZm8gCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVENsaWVudFRyYW5zcG9ydCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICAvL1RPRE86IHRoaW5rIGhvdyB0byBhdm9pZCBwZWVrIGJ5dGUKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX3BlZWtCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNQZWVrQnl0ZTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNPcGVuIHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgICAgICBHQy5TdXBwcmVzc0ZpbmFsaXplKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvL0lmIHdlIGFscmVhZHkgaGF2ZSBhIGJ5dGUgcmVhZCBidXQgbm90IGNvbnN1bWVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9JZiB0cmFuc3BvcnQgY2xvc2VkIHdlIGNhbid0IHBlZWsuCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vVHJ5IHRvIHJlYWQgb25lIGJ5dGUuIElmIHN1Y2NlZWRzIHdlIHdpbGwgbmVlZCB0byBzdG9yZSBpdCBmb3IgdGhlIG5leHQgcmVhZC4KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBieXRlcyA9IGF3YWl0IFJlYWRBc3luYyhfcGVla0J1ZmZlciwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihvZmZzZXQpLCAiQnVmZmVyIG9mZnNldCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YobGVuZ3RoKSwgIkJ1ZmZlciBsZW5ndGggaXMgc21hbGxlciB0aGFuIHplcm8uIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGJ1ZmZlciksICJOb3QgZW5vdWdoIGRhdGEuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEFsbEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJldHJpZXZlZCA9IDA7CisKKyAgICAgICAgICAgIC8vSWYgd2UgcHJldmlvdXNseSBwZWVrZWQgYSBieXRlLCB3ZSBuZWVkIHRvIHVzZSB0aGF0IGZpcnN0LgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgcmV0cmlldmVkKytdID0gX3BlZWtCdWZmZXJbMF07CisgICAgICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChyZXRyaWV2ZWQgPCBsZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvdW50ID0gYXdhaXQgUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0ICsgcmV0cmlldmVkLCBsZW5ndGggLSByZXRyaWV2ZWQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWRDb3VudCA8PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXRyaWV2ZWQgKz0gcmV0dXJuZWRDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRyaWV2ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUFzeW5jKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgRmx1c2hBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RTZXJ2ZXJUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0NWE1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw1NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIExpc3RlbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc0NsaWVudFBlbmRpbmcoKTsKKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEFjY2VwdEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhd2FpdCBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQie25hbWVvZihBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKX0gc2hvdWxkIG5vdCByZXR1cm4gbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzQyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24sCisgICAgICAgICAgICBOb3RPcGVuLAorICAgICAgICAgICAgQWxyZWFkeU9wZW4sCisgICAgICAgICAgICBUaW1lZE91dCwKKyAgICAgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgICAgIEludGVycnVwdGVkCisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSBFeFR5cGU7CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIGV4VHlwZSkKKyAgICAgICAgICAgIDogdGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4VHlwZSA9IGV4VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgZXhUeXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBFeFR5cGUgPSBleFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlID0+IEV4VHlwZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmMzY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MKQEAgLTAsMCArMSwzNSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgRnJvbSBNYXJrIFNsZWUgJiBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKKyAgICAvLy8gICAgIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICAgIC8vLyAgICAgVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgICAgLy8vICAgICBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAgICAvLy8gICAgIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBUQ2xpZW50VHJhbnNwb3J0IEdldFRyYW5zcG9ydChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvYnVpbGQuY21kIGIvbGliL25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2M0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNyBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCisKK3NldGxvY2FsCisKK3RocmlmdCAtdmVyc2lvbgorZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkIAorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9idWlsZC5zaCBiL2xpYi9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMThiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDMyIEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworI3NldCAtZQorCit0aHJpZnQgLS12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQgCisKKyNyZXZpc2lvbj0ke1RSQVZJU19KT0JfSUQ6PTF9ICAKKyNyZXZpc2lvbj0kKHByaW50ZiAiJTA0ZCIgJHJldmlzaW9uKSAKKworI2RvdG5ldCBwYWNrIC4vc3JjL1BST0pFQ1RfTkFNRSAtYyBSZWxlYXNlIC1vIC4vYXJ0aWZhY3RzIC0tdmVyc2lvbi1zdWZmaXg9JHJldmlzaW9uICAKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZCBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE0YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuY21kCkBAIC0wLDAgKzEsMjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvcnVudGVzdHMuc2ggYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZjYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL01ha2VmaWxlLmFtIGIvbGliL25vZGVqcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGVhM2VhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBXZSBjYWxsIG5wbSB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisKK3N0dWJzOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSAtbyB0ZXN0LyAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworZGVwczogJCh0b3Bfc3JjZGlyKS9wYWNrYWdlLmpzb24KKwkkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLyB8fCAkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLworCithbGwtbG9jYWw6IGRlcHMKKworcHJlY3Jvc3M6IGRlcHMgc3R1YnMKKworIyBUT0RPOiBMaW50IG5vZGVqcyBsaWIgYW5kIGdlbi1jb2RlIGFzIHBhcnQgb2YgYnVpbGQKK2NoZWNrOiBkZXBzCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKE5QTSkgdGVzdCAmJiAkKE5QTSkgcnVuIGxpbnQtdGVzdHMgJiYgY2QgbGliL25vZGVqcworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciB0ZXN0L2dlbi1ub2RlanMKKwkkKFJNKSAtciAkKHRvcF9zcmNkaXIpL25vZGVfbW9kdWxlcworCitFWFRSQV9ESVNUID0gXAorCWV4YW1wbGVzIFwKKwlsaWIgXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9SRUFETUUubWQgYi9saWIvbm9kZWpzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFjZmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9SRUFETUUubWQKQEAgLTAsMCArMSw3MCBAQAorVGhyaWZ0IE5vZGUuanMgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyMgQ29tcGF0aWJpbGl0eQorCitub2RlIHZlcnNpb24gNiBvciBsYXRlciBpcyByZXF1aXJlZAorCisjIyBJbnN0YWxsCisKKyAgICBucG0gaW5zdGFsbCB0aHJpZnQgCisKKyMjIFRocmlmdCBDb21waWxlcgorCitZb3UgY2FuIGNvbXBpbGUgSURMIHNvdXJjZXMgZm9yIE5vZGUuanMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgICB0aHJpZnQgLS1nZW4ganM6bm9kZSB0aHJpZnRfZmlsZQorCisjIyBDYXNzYW5kcmEgQ2xpZW50IEV4YW1wbGU6CisKK0hlcmUgaXMgYSBDYXNzYW5kcmEgZXhhbXBsZToKKworYGBganMKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKKyAgICBDYXNzYW5kcmEgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2Fzc2FuZHJhJykKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvY2Fzc2FuZHJhX3R5cGVzJyk7CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkxNjApLAorICAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoQ2Fzc2FuZHJhLCBjb25uZWN0aW9uKTsKKworY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgY29uc29sZS5lcnJvcihlcnIpOworfSk7CisKK2NsaWVudC5nZXRfc2xpY2UoIktleXNwYWNlIiwgImtleSIsIG5ldyB0dHlwZXMuQ29sdW1uUGFyZW50KHtjb2x1bW5fZmFtaWx5OiAiRXhhbXBsZUNGIn0pLCBuZXcgdHR5cGVzLlNsaWNlUHJlZGljYXRlKHtzbGljZV9yYW5nZTogbmV3IHR0eXBlcy5TbGljZVJhbmdlKHtzdGFydDogJycsIGZpbmlzaDogJyd9KX0pLCB0dHlwZXMuQ29uc2lzdGVuY3lMZXZlbC5PTkUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgeworICBpZiAoZXJyKSB7CisgICAgLy8gaGFuZGxlIGVycgorICB9IGVsc2UgeworICAgIC8vIGRhdGEgPT0gW3R0eXBlcy5Db2x1bW5PclN1cGVyQ29sdW1uLCAuLi5dCisgIH0KKyAgY29ubmVjdGlvbi5lbmQoKTsKK30pOworYGBgCisKKzxhIG5hbWU9ImludDY0Ij48L2E+CisjIyBJbnQ2NAorCitTaW5jZSBKYXZhU2NyaXB0IHJlcHJlc2VudHMgYWxsIG51bWJlcnMgYXMgZG91YmxlcywgaW50NjQgdmFsdWVzIGNhbm5vdCBiZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkIG5hdHVyYWxseS4gVG8gc29sdmUgdGhpcywgaW50NjQgdmFsdWVzIGluIHJlc3BvbnNlcyB3aWxsIGJlIHdyYXBwZWQgd2l0aCBUaHJpZnQuSW50NjQgb2JqZWN0cy4gVGhlIEludDY0IGltcGxlbWVudGF0aW9uIHVzZWQgaXMgW2Jyb29mYS9ub2RlLWludDY0XShodHRwczovL2dpdGh1Yi5jb20vYnJvb2ZhL25vZGUtaW50NjQpLgorCisjIyBDbGllbnQgYW5kIHNlcnZlciBleGFtcGxlcworCitTZXZlcmFsIGV4YW1wbGUgY2xpZW50cyBhbmQgc2VydmVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHRocmlmdC9saWIvbm9kZWpzL2V4YW1wbGVzIGZvbGRlciBhbmQgdGhlIGNyb3NzIGxhbmd1YWdlIHR1dG9yaWFsIHRocmlmdC90dXRvcmlhbC9ub2RlanMgZm9sZGVyLgpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL25vZGVqcy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL01ha2VmaWxlIGIvbGliL25vZGVqcy9leGFtcGxlcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzE1N2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9NYWtlZmlsZQpAQCAtMCwwICsxLDI0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KK2FsbDoJCisJLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBqczpub2RlIHVzZXIudGhyaWZ0CisKK3NlcnZlcjogYWxsCQorCU5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdDokKE5PREVfUEFUSCkgbm9kZSBzZXJ2ZXIuanMKKworY2xpZW50OiBhbGwJCisJTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0OiQoTk9ERV9QQVRIKSBub2RlIGNsaWVudC5qcwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzUwYzEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorIyBUaHJpZnQgTm9kZS5qcyBFeGFtcGxlcworCisjIyBMaWNlbnNlCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyMgUnVubmluZyB0aGUgdXNlciBleGFtcGxlCisKK0dlbmVyYXRlIHRoZSBiaW5kaW5nczoKKworICAgIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSB1c2VyLnRocmlmdAorICAgIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSAtLWdlbiBweSBoZWxsby50aHJpZnQKKworVG8gcnVuIHRoZSB1c2VyIGV4YW1wbGUsIGZpcnN0IHN0YXJ0IHVwIHRoZSBzZXJ2ZXIgaW4gb25lIHRlcm1pbmFsOgorCisgICAgTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0IG5vZGUgc2VydmVyLmpzCisKK05vdyBydW4gdGhlIGNsaWVudDoKKworICAgIE5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdCBub2RlIGNsaWVudC5qcworCitGb3IgYW4gZXhhbXBsZSB1c2luZyBKYXZhU2NyaXB0IGluIHRoZSBicm93c2VyIHRvIGNvbm5lY3QgdG8KK2Egbm9kZS5qcyBzZXJ2ZXIgbG9vayBhdCBoZWxsby5odG1sLCBoZWxsby5qcyBhbmQgaGVsbG8udGhyaWZ0CisKK0hUVFAgZXhhbXBsZXMgYXJlIHByb3ZpZGVkIGFsc286IGh0dHBDbGllbnQuanMgYW5kIGh0dHBTZXJ2ZXIuanMKK1lvdSBjYW4gdGVzdCBIVFRQIGNyb3NzIHBsYXRmb3JtIHdpdGggdGhlIGh0dHBTZXJ2ZXIucHkgUHl0aG9uIHNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnQuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNiMzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnQuanMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworCit2YXIgVXNlclN0b3JhZ2UgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVXNlclN0b3JhZ2UuanMnKSwKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdXNlcl90eXBlcycpOworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCdsb2NhbGhvc3QnLCA5MDkwKSwKKyAgICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KFVzZXJTdG9yYWdlLCBjb25uZWN0aW9uKTsKKwordmFyIHVzZXIgPSBuZXcgdHR5cGVzLlVzZXJQcm9maWxlKHt1aWQ6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJNYXJrIFNsZWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVyYjogIkknbGwgZmluZCBzb21ldGhpbmcgdG8gcHV0IGhlcmUuIn0pOworCitjb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICBjb25zb2xlLmVycm9yKGVycik7Cit9KTsKKworY2xpZW50LnN0b3JlKHVzZXIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgaWYgKGVycikgeworICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zb2xlLmxvZygiY2xpZW50IHN0b3JlZDoiLCB1c2VyLnVpZCk7CisgICAgY2xpZW50LnJldHJpZXZlKHVzZXIudWlkLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlVXNlcikgeworICAgICAgaWYgKGVycikgeworICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zb2xlLmxvZygiY2xpZW50IHJldHJpZXZlZDoiLCByZXNwb25zZVVzZXIudWlkKTsKKyAgICAgICAgY29ubmVjdGlvbi5lbmQoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudF9tdWx0aXRyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvY2xpZW50X211bHRpdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzdkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2NsaWVudF9tdWx0aXRyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JyksCisgICAgdHRyYW5zcG9ydCA9IHJlcXVpcmUoJ3RocmlmdC90cmFuc3BvcnQnKTsKKwordmFyIFVzZXJTdG9yYWdlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1VzZXJTdG9yYWdlJyksCisgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3VzZXJfdHlwZXMnKTsKKwordmFyIGZfY29ubiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCdsb2NhbGhvc3QnLCA5MDkwKSwgLy8gZGVmYXVsdDogZnJhbWVkCisgICAgZl9jbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KFVzZXJTdG9yYWdlLCBmX2Nvbm4pOwordmFyIGJfY29ubiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCdsb2NhbGhvc3QnLCA5MDkxLCB7dHJhbnNwb3J0OiB0dHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydH0pLAorICAgIGJfY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChVc2VyU3RvcmFnZSwgYl9jb25uKTsKK3ZhciB1c2VyMSA9IG5ldyB0dHlwZXMuVXNlclByb2ZpbGUoe3VpZDogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJNYXJrIFNsZWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1cmI6ICJJJ2xsIGZpbmQgc29tZXRoaW5nIHRvIHB1dCBoZXJlLiJ9KTsKK3ZhciB1c2VyMiA9IG5ldyB0dHlwZXMuVXNlclByb2ZpbGUoe3VpZDogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJTYXRvc2hpIFRhZ29tb3JpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdXJiOiAib2ssIGxldCdzIHRlc3Qgd2l0aCBidWZmZXJlZCB0cmFuc3BvcnQuIn0pOworCitmX2Nvbm4ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgIGNvbnNvbGUuZXJyb3IoImZyYW1lZDoiLCBlcnIpOworfSk7CisKK2ZfY2xpZW50LnN0b3JlKHVzZXIxLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgIGlmIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyByZXR1cm47IH0KKworICBjb25zb2xlLmxvZygic3RvcmVkOiIsIHVzZXIxLnVpZCwgIiBhcyAiLCB1c2VyMS5uYW1lKTsKKyAgYl9jbGllbnQucmV0cmlldmUodXNlcjEudWlkLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlVXNlcikgeworICAgIGlmIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyByZXR1cm47IH0KKyAgICBjb25zb2xlLmxvZygicmV0cmlldmVkOiIsIHJlc3BvbnNlVXNlci51aWQsICIgYXMgIiwgcmVzcG9uc2VVc2VyLm5hbWUpOworICB9KTsKK30pOworCitiX2NsaWVudC5zdG9yZSh1c2VyMiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICBpZiAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgcmV0dXJuOyB9CisKKyAgY29uc29sZS5sb2coInN0b3JlZDoiLCB1c2VyMi51aWQsICIgYXMgIiwgdXNlcjIubmFtZSk7CisgIGZfY2xpZW50LnJldHJpZXZlKHVzZXIyLnVpZCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZVVzZXIpIHsKKyAgICBpZiAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoZXJyKTsgcmV0dXJuOyB9CisgICAgY29uc29sZS5sb2coInJldHJpZXZlZDoiLCByZXNwb25zZVVzZXIudWlkLCAiIGFzICIsIHJlc3BvbnNlVXNlci5uYW1lKTsKKyAgfSk7Cit9KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uaHRtbCBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTg1YTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5odG1sCkBAIC0wLDAgKzEsNjUgQEAKKzwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgICA8dGl0bGU+QXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IEJyb3dzZXIgQ2xpZW50IERlbW88L3RpdGxlPgorICAgIDxzY3JpcHQgc3JjPSJ0aHJpZnQuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9IZWxsb1N2Yy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RpbWVzVHdvLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBCcm93c2VyIENsaWVudCBEZW1vPC9oMT4KKyAgICA8cD5UaGlzIGh0bWwgZmlsZSBkZW1vbnN0cmF0ZXMgQXBhY2hlIFRocmlmdCBKYXZhU2NycHQgUlBDIGJldHdlZW4gYSBicm93c2VyIGNsaWVudCB0byBhIG5vZGUuanMgc2VydmVyLiBDbGlja2luZyB0aGUgYnV0dG9ucyBiZWxvdyB3aWxsIGNhbGwgdGhlIFJQQyBmdW5jdGlvbnMgaG9zdGVkIGJ5IHRoZSBBcGFjaGUgVGhyaWZ0IHNlcnZlciBhdCBsb2NhbGhvc3Q6ODU4NS4gVGhlIGZpbGUgaGVsbG8uanMgY29udGFpbnMgdGhlIEphdmFTY3JpcHQgbm9kZS5qcyBzZXJ2ZXIgcmVxdWlyZWQuIEhlcmUgYXJlIHRoZSBzdGVwcyB0byBnZXQgdGhlIGV4YW1wbGUgcnVubmluZzo8L3A+CisgICAgPG9sPgorICAgICAgICA8bGk+SW5zdGFsbCBOb2RlLmpzIDxwcmU+PGEgaHJlZj0iaHR0cDovL25vZGVqcy5vcmciPm5vZGVqcy5vcmc8L2E+PC9wcmU+PC9saT4KKyAgICAgICAgPGxpPkluc3RhbGwgQXBhY2hlIFRocmlmdCBmb3Igbm9kZSAobm90ZSB0aGF0IHRoZSBub2RlIHBhY2thZ2UgbWFuYWdlciB3aWxsIGNyZWF0ZSB0aGUgbm9kZV9tb2R1bGVzIGZvbGRlciBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc28gbWFrZSBzdXJlIHRvIHJ1biBucG0gZnJvbSB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaGVsbG8uanMgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBmaW5kIHRoZSBUaHJpZnQgbGlicmFyaWVzLiBUaGlzIGV4YW1wbGUgcmVxdWlyZXMgQXBhY2hlIFRocmlmdCAwLjkuMispIDxwcmU+JCBucG0gaW5zdGFsbCB0aHJpZnQ8L3ByZT48L2xpPgorICAgICAgICA8bGk+Q29tcGlsZSB0aGUgaGVsbG8uaWRsIGZvciBKYXZhU2NyaXB0IGFuZCBOb2RlLmpzICh5b3UnbGwgbmVlZCB0byBoYXZlIHRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGluc3RhbGxlZCBmb3IgdGhpcyBzdGVwLiBUaGlzIGFsc28gbmVlZHMgdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGhlbGxvLmpzIGJlY2F1c2UgaGVsbG8uanMgYW5kIGhlbGxvLmh0bWwgbG9vayBmb3IgdGhlIGdlbi1ub2RlanMgYW5kIGdlbi1qcyBkaXJlY3RvcmllcyBoZXJlLik8cHJlPiQgdGhyaWZ0IC1nZW4ganMgLWdlbiBqczpub2RlIGhlbGxvLnRocmlmdDwvcHJlPjwvbGk+CisgICAgICAgIDxsaT5SdW4gdGhlIG5vZGUgc2VydmVyIGluIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGUgaGVsbG8uaHRtbCBmaWxlPHByZT4kIG5vZGUgaGVsbG8uanM8L3ByZT48L2xpPgorICAgICAgICA8bGk+Q29weSB0aGUgQXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IGxpYnJhcnksIHRocmlmdC5qcywgaW50byB0aGUgZGlyZWN0b3J5IHdpdGggdGhpcyBodG1sIGZpbGUuPHByZT4kIGNwIC4uLi4uL3RocmlmdC5qcyAuICh5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIEJvd2VyIHRvIGluc3RhbGwgdGhlIGJyb3dzZXIgYmFzZWQgQXBhY2hlIFRocmlmdCBsaWJyYXJ5IGluIHRoZSBuZWFyIGZ1dHVyZS4pPC9wcmU+CisgICAgICAgIDxsaT5SZWxvYWQgdGhpcyBwYWdlIGluIGEgYnJvd3NlciB0aHJvdWdoIHRoZSBub2RlIHNlcnZlciB1c2luZyB1c2luZyB0aGUgVVJMOiA8cHJlPmh0dHA6Ly9sb2NhbGhvc3Q6ODU4NS9oZWxsby5odG1sPC9wcmU+dGhlbiBjbGljayBhIGJ1dHRvbiBiZWxvdyB0byBtYWtlIGFuIFJQQyBjYWxsPC9saT4KKyAgICA8L29sPgorICAgIDxidXR0b24gaWQ9ImJ0biI+R2V0IE1lc3NhZ2UgZnJvbSBOb2RlIFNlcnZlcjwvYnV0dG9uPgorICAgIDxidXR0b24gaWQ9ImJ0bkRibCI+RG91YmxlIDI1PC9idXR0b24+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBnZXRNZXNzYWdlLCBmYWxzZSk7CisKKyAgICAgICAgZnVuY3Rpb24gZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NS9oZWxsbyIpOworICAgICAgICAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBIZWxsb1N2Y0NsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICB2YXIgbXNnID0gY2xpZW50LmhlbGxvX2Z1bmMoKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKS5pbm5lckhUTUwgPSBtc2c7CisgICAgICAgIH0KKworICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuRGJsIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBkYmxNZXNzYWdlLCBmYWxzZSk7CisKKyAgICAgICAgZnVuY3Rpb24gZGJsTWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NS9kYmwiKTsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgVGltZXNUd29DbGllbnQocHJvdG9jb2wpOworICAgICAgICAgICAgdmFyIHZhbCA9IGNsaWVudC5kYmwoMjUpOworICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dDIiKS5pbm5lckhUTUwgPSB2YWw7CisgICAgICAgIH0KKyAgICA8L3NjcmlwdD4KKyAgICA8aDI+U2VydmVyIFJlc3BvbnNlOiA8ZGl2IGlkPSJvdXRwdXQiPjwvZGl2PjwvaDI+CisgICAgPGgyPlNlcnZlciBEYmw6IDxkaXYgaWQ9Im91dHB1dDIiPjwvZGl2PjwvaDI+Cis8L2JvZHk+IAorPC9odG1sPgorCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdjNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5qcwpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgSGVsbG9TdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvSGVsbG9TdmMuanMnKTsKK3ZhciBUaW1lc1R3b1N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaW1lc1R3by5qcycpOworCit2YXIgaGVsbG9IYW5kbGVyID0geworCWhlbGxvX2Z1bmM6IGZ1bmN0aW9uKHJlc3VsdCkgeworCQl0aGlzLmNhbGxfY291bnRlciA9IHRoaXMuY2FsbF9jb3VudGVyIHx8IDA7CisJCWNvbnNvbGUubG9nKCJDbGllbnQgY2FsbDogIiArICgrK3RoaXMuY2FsbF9jb3VudGVyKSk7CisJCXJlc3VsdChudWxsLCAiSGVsbG8gQXBhY2hlIFRocmlmdCBmb3IgSmF2YVNjcmlwdCAiICsgdGhpcy5jYWxsX2NvdW50ZXIpOworCX0KK30KKwordmFyIHRpbWVzVHdvSGFuZGxlciA9IHsKKwlkYmw6IGZ1bmN0aW9uKHZhbCwgcmVzdWx0KSB7CisJCWNvbnNvbGUubG9nKCJDbGllbnQgY2FsbDogIiArIHZhbCk7CisJCXJlc3VsdChudWxsLCB2YWwgKiAyKTsKKwl9Cit9CisKK3ZhciBoZWxsb1NlcnZpY2UgPSB7CisJdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorCXByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKwlwcm9jZXNzb3I6IEhlbGxvU3ZjLAorCWhhbmRsZXI6IGhlbGxvSGFuZGxlcgorfTsKKwordmFyIGRibFNlcnZpY2UgPSB7CisJdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorCXByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKwlwcm9jZXNzb3I6IFRpbWVzVHdvU3ZjLAorCWhhbmRsZXI6IHRpbWVzVHdvSGFuZGxlcgorfTsKKwordmFyIFNlcnZlck9wdGlvbnMgPSB7CisJZmlsZXM6ICIuIiwKKwlzZXJ2aWNlczogeworCQkiL2hlbGxvIjogaGVsbG9TZXJ2aWNlLAorCQkiL2RibCI6IGRibFNlcnZpY2UsCisJfQorfQorCit2YXIgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihTZXJ2ZXJPcHRpb25zKTsKK3ZhciBwb3J0ID0gODU4NTsKK3NlcnZlci5saXN0ZW4ocG9ydCk7Citjb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby50aHJpZnQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFmNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby50aHJpZnQKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworc2VydmljZSBIZWxsb1N2YyB7CisgICAgc3RyaW5nIGhlbGxvX2Z1bmMoKSwKK30KKworc2VydmljZSBUaW1lc1R3byB7CisgICAgaTY0IGRibCgxOiBpNjQgdmFsKSwKK30KKworCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBDbGllbnQuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBDbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljYzBjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cENsaWVudC5qcwpAQCAtMCwwICsxLDIzIEBACit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgaGVsbG9TdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvSGVsbG9TdmMuanMnKTsKKwordmFyIG9wdGlvbnMgPSB7CisgICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgICBwYXRoOiAiL2hlbGxvIiwKKyAgIGhlYWRlcnM6IHsiQ29ubmVjdGlvbiI6ICJjbG9zZSJ9LAorICAgaHR0cHM6IGZhbHNlCit9OworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVIdHRwQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTA5MCwgb3B0aW9ucyk7Cit2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUh0dHBDbGllbnQoaGVsbG9TdmMsIGNvbm5lY3Rpb24pOworCitjb25uZWN0aW9uLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGVycikgeworICAgY29uc29sZS5sb2coIkVycm9yOiAiICsgZXJyKTsKK30pOworCitjbGllbnQuaGVsbG9fZnVuYyhmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7CisgICBjb25zb2xlLmxvZygiTXNnIGZyb20gc2VydmVyOiAiICsgcmVzdWx0KTsKK30pOworCisKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FlMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLmpzCkBAIC0wLDAgKzEsMzEgQEAKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsgICAgICAgICAgICAgICAgIAkKK3ZhciBoZWxsb1N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9IZWxsb1N2YycpOworCisvL1NlcnZpY2VIYW5kbGVyOiBJbXBsZW1lbnQgdGhlIGhlbGxvIHNlcnZpY2UgCit2YXIgaGVsbG9IYW5kbGVyID0geworICBoZWxsb19mdW5jOiBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coIlJlY2VpdmVkIEhlbGxvIGNhbGwiKTsKKyAgICByZXN1bHQobnVsbCwgIkhlbGxvIGZyb20gTm9kZS5qcyIpOworICB9Cit9OworCisvL1NlcnZpY2VPcHRpb25zOiBUaGUgSS9PIHN0YWNrIGZvciB0aGUgc2VydmljZQordmFyIGhlbGxvU3ZjT3B0ID0geyAgICAgICAgICAgICAgICAgICAgICAgCQkKKyAgICBoYW5kbGVyOiBoZWxsb0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgIAkKKyAgICBwcm9jZXNzb3I6IGhlbGxvU3ZjLCAgICAgICAgICAgICAgICAgICAgICAgICAJCisgICAgcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLCAgICAgICAgICAgICAgICAgCisgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0IAkJCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLy9TZXJ2ZXJPcHRpb25zOiBEZWZpbmUgc2VydmVyIGZlYXR1cmVzCit2YXIgc2VydmVyT3B0ID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgCQorICAgc2VydmljZXM6IHsgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAiL2hlbGxvIjogaGVsbG9TdmNPcHQgICAgICAgICAgICAgICAgIAorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvL0NyZWF0ZSBhbmQgc3RhcnQgdGhlIHdlYiBzZXJ2ZXIgCit2YXIgcG9ydCA9IDkwOTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCit0aHJpZnQuY3JlYXRlV2ViU2VydmVyKHNlcnZlck9wdCkubGlzdGVuKHBvcnQpOyAgICAgICAgICAgICAgICAgICAgICAgIAkJCitjb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMmZjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weQpAQCAtMCwwICsxLDE4IEBACitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCisKK2Zyb20gaGVsbG8gaW1wb3J0IEhlbGxvU3ZjCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUSHR0cFNlcnZlcgorCitjbGFzcyBIZWxsb1N2Y0hhbmRsZXI6CisgIGRlZiBoZWxsb19mdW5jKHNlbGYpOgorICAgIHByaW50KCJIZWxsbyBDYWxsZWQiKQorICAgIHJldHVybiAiaGVsbG8gZnJvbSBQeXRob24iCisKK3Byb2Nlc3NvciA9IEhlbGxvU3ZjLlByb2Nlc3NvcihIZWxsb1N2Y0hhbmRsZXIoKSkKK3Byb3RvRmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQorcG9ydCA9IDkwOTAKK3NlcnZlciA9IFRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCJsb2NhbGhvc3QiLCBwb3J0KSwgcHJvdG9GYWN0b3J5KQorcHJpbnQgIlB5dGhvbiBzZXJ2ZXIgcnVubmluZyBvbiBwb3J0ICIgKyBzdHIocG9ydCkKK3NlcnZlci5zZXJ2ZSgpCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3BhcnNlLmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9wYXJzZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjhhMWFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9wYXJzZS5qcwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKworICBUaGlzIGlzIGEgc3RhbmRhbG9uZSBkZXNlcmlhbGl6ZS9wYXJzZSBleGFtcGxlIGlmIHlvdSBqdXN0IHdhbnQgdG8gZGVzZXJpYWxpemUKKyAgdGhyaWZ0IGRlY291cGxlZCBmcm9tIGNhc3NhbmRyYSBzZXJ2ZXIKKworICAxLiAgYWNxdWlyZSB0aHJpZnQgdGVtcGxhdGUgc3BlY2lmaWNhdGlvbiBmaWxlcyBmcm9tIHdobyBldmVyIGJ1aWx0IGl0IChlZzogRVhBTVBMRS50aHJpZnQpCisKKyAgMi4gIEluc3RhbGwgdGhyaWZ0IG9uIGxvY2FsIG1hY2hpbmUKKworICAzLiAgZ2VuZXJhdGUgdGhyaWZ0IGNsaWVudHMgZm9yIG5vZGVqcyB1c2luZyB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uIGZpbGVzICgjMSkKKyAgICAgIHRocmlmdCAtLWdlbiBqczpub2RlIHNjaGVtYS9FWEFNUExFLnRocmlmdAorCisgICAgICBUaGlzIGNyZWF0ZXMgY3JlYXRlcyBnZW4tbm9kZS5qcyBkaXJlY3RvcnkgY29udGFpbmluZyBhIG5ldyBmaWxlLCBHRU5FUkFURUQuanMKKworICA0LiAgSW5zaWRlIEdFTkVSQVRFRC5qcyBpcyBhIGNsYXNzIHlvdSB3aWxsIHdhbnQgdG8gaW5zdGFuY2lhdGUuICBGaW5kIHRoaXMgY2xhc3MgbmFtZSBhbmQgcGx1ZyAKKyAgICAgIGl0IGludG8gdGhlIGV4YW1wbGUgY29kZSBiZWxvdyAgKGllLCAiWU9VUl9DTEFTU19OQU1FIikKKyAqLworCitmdW5jdGlvbiBwYXJzZVRocmlmdCh0aHJpZnRFbmNvZGVkRGF0YSwgY2FsbGJhY2spIHsKKyAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworICB2YXIgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHRocmlmdEVuY29kZWREYXRhKTsKKyAgdmFyIHByb3RvY29sICA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgdmFyIGNsaWVudENsYXNzID0gcmVxdWlyZSgnLi4vZ2VuLW5vZGVqcy9HRU5FUkFURUQnKS5ZT1VSX0NMQVNTX05BTUU7CisgIHZhciBjbGllbnQgPSBuZXcgY2xpZW50Q2xhc3MoKTsKKyAgY2xpZW50LnJlYWQocHJvdG9jb2wpOworICBjYWxsYmFjayhudWxsLCBjbGllbnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQ4MmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXIuanMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworCit2YXIgVXNlclN0b3JhZ2UgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVXNlclN0b3JhZ2UuanMnKSwKKyAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdXNlcl90eXBlcycpOworCit2YXIgdXNlcnMgPSB7fTsKKwordmFyIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVXNlclN0b3JhZ2UsIHsKKyAgc3RvcmU6IGZ1bmN0aW9uKHVzZXIsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCJzZXJ2ZXIgc3RvcmVkOiIsIHVzZXIudWlkKTsKKyAgICB1c2Vyc1t1c2VyLnVpZF0gPSB1c2VyOworICAgIHJlc3VsdChudWxsKTsKKyAgfSwKKworICByZXRyaWV2ZTogZnVuY3Rpb24odWlkLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygic2VydmVyIHJldHJpZXZlZDoiLCB1aWQpOworICAgIHJlc3VsdChudWxsLCB1c2Vyc1t1aWRdKTsKKyAgfSwKK30pOworCitzZXJ2ZXIubGlzdGVuKDkwOTApOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXJfaHR0cC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX2h0dHAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZGM4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX2h0dHAuanMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIGNvbm5lY3QgPSByZXF1aXJlKCdjb25uZWN0Jyk7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisKK3ZhciBVc2VyU3RvcmFnZSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9Vc2VyU3RvcmFnZScpLAorICAgIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy91c2VyX3R5cGVzJyk7CisKK3ZhciB1c2VycyA9IHt9OworCit2YXIgc3RvcmUgPSBmdW5jdGlvbih1c2VyLCByZXN1bHQpIHsKKyAgY29uc29sZS5sb2coInN0b3JlZDoiLCB1c2VyLnVpZCk7CisgIHVzZXJzW3VzZXIudWlkXSA9IHVzZXI7CisgIHJlc3VsdChudWxsKTsKK307Cit2YXIgcmV0cmlldmUgPSBmdW5jdGlvbih1aWQsIHJlc3VsdCkgeworICBjb25zb2xlLmxvZygicmV0cmlldmVkOiIsIHVpZCk7CisgIHJlc3VsdChudWxsLCB1c2Vyc1t1aWRdKTsKK307CisKK3ZhciBzZXJ2ZXJfaHR0cCA9IHRocmlmdC5jcmVhdGVIdHRwU2VydmVyKFVzZXJTdG9yYWdlLCB7CisgIHN0b3JlOiBzdG9yZSwKKyAgcmV0cmlldmU6IHJldHJpZXZlCit9KTsKK3NlcnZlcl9odHRwLmxpc3Rlbig5MDkwKTsKKwordmFyIHNlcnZlcl9jb25uZWN0ID0gY29ubmVjdCh0aHJpZnQuaHR0cE1pZGRsZXdhcmUoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9KSk7CitzZXJ2ZXJfaHR0cC5saXN0ZW4oOTA5MSk7CisKK3ZhciBzZXJ2ZXJfY29ubmVjdF9qc29uID0gY29ubmVjdCh0aHJpZnQuaHR0cE1pZGRsZXdhcmUoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9LCB7cHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sfSkpOworc2VydmVyX2Nvbm5lY3RfanNvbi5saXN0ZW4oOTA5Mik7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlcl9tdWx0aXRyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDhlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlcl9tdWx0aXRyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JyksCisgICAgdHRyYW5zcG9ydCA9IHJlcXVpcmUoJ3RocmlmdC90cmFuc3BvcnQnKTsKKwordmFyIFVzZXJTdG9yYWdlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1VzZXJTdG9yYWdlJyksCisgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3VzZXJfdHlwZXMnKTsKKwordmFyIHVzZXJzID0ge307CisKK3ZhciBzdG9yZSA9IGZ1bmN0aW9uKHVzZXIsIHJlc3VsdCkgeworICBjb25zb2xlLmxvZygic3RvcmVkOiIsIHVzZXIudWlkKTsKKyAgdXNlcnNbdXNlci51aWRdID0gdXNlcjsKKyAgcmVzdWx0KG51bGwpOworfTsKK3ZhciByZXRyaWV2ZSA9IGZ1bmN0aW9uKHVpZCwgcmVzdWx0KSB7CisgIGNvbnNvbGUubG9nKCJyZXRyaWV2ZWQ6IiwgdWlkKTsKKyAgcmVzdWx0KG51bGwsIHVzZXJzW3VpZF0pOworfTsKKwordmFyIHNlcnZlcl9mcmFtZWQgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFVzZXJTdG9yYWdlLCB7CisgIHN0b3JlOiBzdG9yZSwKKyAgcmV0cmlldmU6IHJldHJpZXZlCit9KTsKK3NlcnZlcl9mcmFtZWQubGlzdGVuKDkwOTApOwordmFyIHNlcnZlcl9idWZmZXJlZCA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9LCB7dHJhbnNwb3J0OiB0dHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydH0pOworc2VydmVyX2J1ZmZlcmVkLmxpc3Rlbig5MDkxKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvdXNlci50aHJpZnQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3VzZXIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODdmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2V4YW1wbGVzL3VzZXIudGhyaWZ0CkBAIC0wLDAgKzEsMjcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzdHJ1Y3QgVXNlclByb2ZpbGUgeworICAxOiBpMzIgdWlkLAorICAyOiBzdHJpbmcgbmFtZSwKKyAgMzogc3RyaW5nIGJsdXJiCit9CisKK3NlcnZpY2UgVXNlclN0b3JhZ2UgeworICB2b2lkIHN0b3JlKDE6IFVzZXJQcm9maWxlIHVzZXIpLAorICBVc2VyUHJvZmlsZSByZXRyaWV2ZSgxOiBpMzIgdWlkKQorfQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeS5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxM2ZmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnkuanMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIFBPV184ID0gTWF0aC5wb3coMiwgOCk7Cit2YXIgUE9XXzE2ID0gTWF0aC5wb3coMiwgMTYpOwordmFyIFBPV18yNCA9IE1hdGgucG93KDIsIDI0KTsKK3ZhciBQT1dfMzIgPSBNYXRoLnBvdygyLCAzMik7Cit2YXIgUE9XXzQwID0gTWF0aC5wb3coMiwgNDApOwordmFyIFBPV180OCA9IE1hdGgucG93KDIsIDQ4KTsKK3ZhciBQT1dfNTIgPSBNYXRoLnBvdygyLCA1Mik7Cit2YXIgUE9XXzEwMjIgPSBNYXRoLnBvdygyLCAxMDIyKTsKKworZXhwb3J0cy5yZWFkQnl0ZSA9IGZ1bmN0aW9uKGIpeworCXJldHVybiBiID4gMTI3ID8gYi0yNTYgOiBiOworfTsKKworZXhwb3J0cy5yZWFkSTE2ID0gZnVuY3Rpb24oYnVmZiwgb2ZmKSB7CisgIG9mZiA9IG9mZiB8fCAwOworICB2YXIgdiA9IGJ1ZmZbb2ZmICsgMV07CisgIHYgKz0gYnVmZltvZmZdIDw8IDg7CisgIGlmIChidWZmW29mZl0gJiAxMjgpIHsKKyAgICB2IC09IFBPV18xNjsKKyAgfQorICByZXR1cm4gdjsKK307CisKK2V4cG9ydHMucmVhZEkzMiA9IGZ1bmN0aW9uKGJ1ZmYsIG9mZikgeworICBvZmYgPSBvZmYgfHwgMDsKKyAgdmFyIHYgPSBidWZmW29mZiArIDNdOworICB2ICs9IGJ1ZmZbb2ZmICsgMl0gPDwgODsKKyAgdiArPSBidWZmW29mZiArIDFdIDw8IDE2OworICB2ICs9IGJ1ZmZbb2ZmXSAqIFBPV18yNDsKKyAgaWYgKGJ1ZmZbb2ZmXSAmIDB4ODApIHsKKyAgICB2IC09IFBPV18zMjsKKyAgfQorICByZXR1cm4gdjsKK307CisKK2V4cG9ydHMud3JpdGVJMTYgPSBmdW5jdGlvbihidWZmLCB2KSB7CisgIGJ1ZmZbMV0gPSB2ICYgMHhmZjsKKyAgdiA+Pj0gODsKKyAgYnVmZlswXSA9IHYgJiAweGZmOworICByZXR1cm4gYnVmZjsKK307CisKK2V4cG9ydHMud3JpdGVJMzIgPSBmdW5jdGlvbihidWZmLCB2KSB7CisgIGJ1ZmZbM10gPSB2ICYgMHhmZjsKKyAgdiA+Pj0gODsKKyAgYnVmZlsyXSA9IHYgJiAweGZmOworICB2ID4+PSA4OworICBidWZmWzFdID0gdiAmIDB4ZmY7CisgIHYgPj49IDg7CisgIGJ1ZmZbMF0gPSB2ICYgMHhmZjsKKyAgcmV0dXJuIGJ1ZmY7Cit9OworCitleHBvcnRzLnJlYWREb3VibGUgPSBmdW5jdGlvbihidWZmLCBvZmYpIHsKKyAgb2ZmID0gb2ZmIHx8IDA7CisgIHZhciBzaWduZWQgPSBidWZmW29mZl0gJiAweDgwOworICB2YXIgZSA9IChidWZmW29mZisxXSAmIDB4RjApID4+IDQ7CisgIGUgKz0gKGJ1ZmZbb2ZmXSAmIDB4N0YpIDw8IDQ7CisKKyAgdmFyIG0gPSBidWZmW29mZis3XTsKKyAgbSArPSBidWZmW29mZis2XSA8PCA4OworICBtICs9IGJ1ZmZbb2ZmKzVdIDw8IDE2OworICBtICs9IGJ1ZmZbb2ZmKzRdICogUE9XXzI0OworICBtICs9IGJ1ZmZbb2ZmKzNdICogUE9XXzMyOworICBtICs9IGJ1ZmZbb2ZmKzJdICogUE9XXzQwOworICBtICs9IChidWZmW29mZisxXSAmIDB4MEYpICogUE9XXzQ4OworCisgIHN3aXRjaCAoZSkgeworICAgIGNhc2UgMDoKKyAgICAgIGUgPSAtMTAyMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjA0NzoKKyAgICAgIHJldHVybiBtID8gTmFOIDogKHNpZ25lZCA/IC1JbmZpbml0eSA6IEluZmluaXR5KTsKKyAgICBkZWZhdWx0OgorICAgICAgbSArPSBQT1dfNTI7CisgICAgICBlIC09IDEwMjM7CisgIH0KKworICBpZiAoc2lnbmVkKSB7CisgICAgbSAqPSAtMTsKKyAgfQorCisgIHJldHVybiBtICogTWF0aC5wb3coMiwgZSAtIDUyKTsKK307CisKKy8qCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gdGhlIGpzcGFjayBtb2R1bGU6CisgKiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNwYWNrLworICovCitleHBvcnRzLndyaXRlRG91YmxlID0gZnVuY3Rpb24oYnVmZiwgdikgeworICB2YXIgbSwgZSwgYzsKKworICBidWZmWzBdID0gKHYgPCAwID8gMHg4MCA6IDB4MDApOworCisgIHYgPSBNYXRoLmFicyh2KTsKKyAgaWYgKHYgIT09IHYpIHsKKyAgICAvLyBOYU4sIHVzZSBRTmFOIElFRUUgZm9ybWF0CisgICAgbSA9IDIyNTE3OTk4MTM2ODUyNDg7CisgICAgZSA9IDIwNDc7CisgIH0gZWxzZSBpZiAodiA9PT0gSW5maW5pdHkpIHsKKyAgICBtID0gMDsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIHsKKyAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2KSAvIE1hdGguTE4yKTsKKyAgICBjID0gTWF0aC5wb3coMiwgLWUpOworICAgIGlmICh2ICogYyA8IDEpIHsKKyAgICAgIGUtLTsKKyAgICAgIGMgKj0gMjsKKyAgICB9CisKKyAgICBpZiAoZSArIDEwMjMgPj0gMjA0NykKKyAgICB7CisgICAgICAvLyBPdmVyZmxvdworICAgICAgbSA9IDA7CisgICAgICBlID0gMjA0NzsKKyAgICB9CisgICAgZWxzZSBpZiAoZSArIDEwMjMgPj0gMSkKKyAgICB7CisgICAgICAvLyBOb3JtYWxpemVkIC0gdGVybSBvcmRlciBtYXR0ZXJzLCBhcyBNYXRoLnBvdygyLCA1Mi1lKSBhbmQgdipNYXRoLnBvdygyLCA1MikgY2FuIG92ZXJmbG93CisgICAgICBtID0gKHYqYy0xKSAqIFBPV181MjsKKyAgICAgIGUgKz0gMTAyMzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIERlbm9ybWFsaXplZCAtIGFsc28gY2F0Y2hlcyB0aGUgJzAnIGNhc2UsIHNvbWV3aGF0IGJ5IGNoYW5jZQorICAgICAgbSA9ICh2ICogUE9XXzEwMjIpICogUE9XXzUyOworICAgICAgZSA9IDA7CisgICAgfQorICB9CisKKyAgYnVmZlsxXSA9IChlIDw8IDQpICYgMHhmMDsKKyAgYnVmZlswXSB8PSAoZSA+PiA0KSAmIDB4N2Y7CisKKyAgYnVmZls3XSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzZdID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbNV0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZls0XSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzNdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbMl0gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZlsxXSB8PSBtICYgMHgwZjsKKworICByZXR1cm4gYnVmZjsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdjOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK3ZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgVHlwZSA9IFRocmlmdC5UeXBlOworCittb2R1bGUuZXhwb3J0cyA9IFRCaW5hcnlQcm90b2NvbDsKKworLy8gSmF2YVNjcmlwdCBzdXBwb3J0cyBvbmx5IG51bWVyaWMgZG91YmxlcywgdGhlcmVmb3JlIGV2ZW4gaGV4IHZhbHVlcyBhcmUgYWx3YXlzIHNpZ25lZC4KKy8vIFRoZSBsYXJnZXN0IGludGVnZXIgdmFsdWUgd2hpY2ggY2FuIGJlIHJlcHJlc2VudGVkIGluIEphdmFTY3JpcHQgaXMgKy8tMl41My4KKy8vIEJpdHdpc2Ugb3BlcmF0aW9ucyBjb252ZXJ0IG51bWJlcnMgdG8gMzIgYml0IGludGVnZXJzIGJ1dCBwZXJmb3JtIHNpZ24gZXh0ZW5zaW9uCisvLyB1cG9uIGFzc2lnbmluZyB2YWx1ZXMgYmFjayB0byB2YXJpYWJsZXMuCit2YXIgVkVSU0lPTl9NQVNLID0gLTY1NTM2LCAgIC8vIDB4ZmZmZjAwMDAKKyAgICBWRVJTSU9OXzEgPSAtMjE0NzQxODExMiwgLy8gMHg4MDAxMDAwMAorICAgIFRZUEVfTUFTSyA9IDB4MDAwMDAwZmY7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKKyAgdGhpcy50cmFucyA9IHRyYW5zOworICB0aGlzLnN0cmljdFJlYWQgPSAoc3RyaWN0UmVhZCAhPT0gdW5kZWZpbmVkID8gc3RyaWN0UmVhZCA6IGZhbHNlKTsKKyAgdGhpcy5zdHJpY3RXcml0ZSA9IChzdHJpY3RXcml0ZSAhPT0gdW5kZWZpbmVkID8gc3RyaWN0V3JpdGUgOiB0cnVlKTsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisgICAgaWYgKHRoaXMuc3RyaWN0V3JpdGUpIHsKKyAgICAgIHRoaXMud3JpdGVJMzIoVkVSU0lPTl8xIHwgdHlwZSk7CisgICAgICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOworICAgICAgdGhpcy53cml0ZUkzMihzZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7CisgICAgICB0aGlzLndyaXRlQnl0ZSh0eXBlKTsKKyAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOworICAgIH0KKyAgICAvLyBSZWNvcmQgY2xpZW50IHNlcWlkIHRvIGZpbmQgY2FsbGJhY2sgYWdhaW4KKyAgICBpZiAodGhpcy5fc2VxaWQgIT09IG51bGwpIHsKKyAgICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9zZXFpZCA9IHNlcWlkOworICAgICAgdGhpcy50cmFucy5zZXRDdXJyU2VxSWQoc2VxaWQpOworICAgIH0KK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX3NlcWlkICE9PSBudWxsKSB7CisgICAgICAgIHRoaXMuX3NlcWlkID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2cud2FybmluZygnTm8gc2VxaWQgdG8gdW5zZXQnKTsKKyAgICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIGlkKSB7CisgIHRoaXMud3JpdGVCeXRlKHR5cGUpOworICB0aGlzLndyaXRlSTE2KGlkKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkU3RvcCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndyaXRlQnl0ZShUeXBlLlNUT1ApOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEJlZ2luID0gZnVuY3Rpb24oa3R5cGUsIHZ0eXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVCeXRlKGt0eXBlKTsKKyAgdGhpcy53cml0ZUJ5dGUodnR5cGUpOworICB0aGlzLndyaXRlSTMyKHNpemUpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGV0eXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVCeXRlKGV0eXBlKTsKKyAgdGhpcy53cml0ZUkzMihzaXplKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihldHlwZSwgc2l6ZSkgeworICB0aGlzLndyaXRlQnl0ZShldHlwZSk7CisgIHRoaXMud3JpdGVJMzIoc2l6ZSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKGJvb2wpIHsKKyAgaWYgKGJvb2wpIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgxKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgwKTsKKyAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJ5dGUgPSBmdW5jdGlvbihiKSB7CisgIHRoaXMudHJhbnMud3JpdGUobmV3IEJ1ZmZlcihbYl0pKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMTYgPSBmdW5jdGlvbihpMTYpIHsKKyAgdGhpcy50cmFucy53cml0ZShiaW5hcnkud3JpdGVJMTYobmV3IEJ1ZmZlcigyKSwgaTE2KSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7CisgIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlSTMyKG5ldyBCdWZmZXIoNCksIGkzMikpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUk2NCA9IGZ1bmN0aW9uKGk2NCkgeworICBpZiAoaTY0LmJ1ZmZlcikgeworICAgIHRoaXMudHJhbnMud3JpdGUoaTY0LmJ1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgSW50NjQoaTY0KS5idWZmZXIpOworICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRG91YmxlID0gZnVuY3Rpb24oZHViKSB7CisgIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlRG91YmxlKG5ldyBCdWZmZXIoOCksIGR1YikpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZ09yQmluYXJ5ID0gZnVuY3Rpb24obmFtZSwgZW5jb2RpbmcsIGFyZykgeworICBpZiAodHlwZW9mKGFyZykgPT09ICdzdHJpbmcnKSB7CisgICAgdGhpcy53cml0ZUkzMihCdWZmZXIuYnl0ZUxlbmd0aChhcmcsIGVuY29kaW5nKSk7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKKyAgfSBlbHNlIGlmICgoYXJnIGluc3RhbmNlb2YgQnVmZmVyKSB8fAorICAgICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpKSB7CisgICAgLy8gQnVmZmVycyBpbiBOb2RlLmpzIHVuZGVyIEJyb3dzZXJpZnkgbWF5IGV4dGVuZCBVSW50OEFycmF5IGluc3RlYWQgb2YKKyAgICAvLyBkZWZpbmluZyBhIG5ldyBvYmplY3QuIFdlIGRldGVjdCB0aGVtIGhlcmUgc28gd2UgY2FuIHdyaXRlIHRoZW0KKyAgICAvLyBjb3JyZWN0bHkKKyAgICB0aGlzLndyaXRlSTMyKGFyZy5sZW5ndGgpOworICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IobmFtZSArICcgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlU3RyaW5nJywgJ3V0ZjgnLCBhcmcpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlQmluYXJ5JywgJ2JpbmFyeScsIGFyZyk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHN6ID0gdGhpcy5yZWFkSTMyKCk7CisgIHZhciB0eXBlLCBuYW1lLCBzZXFpZDsKKworICBpZiAoc3ogPCAwKSB7CisgICAgdmFyIHZlcnNpb24gPSBzeiAmIFZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogIiArIHN6KTsKKyAgICB9CisgICAgdHlwZSA9IHN6ICYgVFlQRV9NQVNLOworICAgIG5hbWUgPSB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOworICB9IGVsc2UgeworICAgIGlmICh0aGlzLnN0cmljdFJlYWQpIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXIiKTsKKyAgICB9CisgICAgbmFtZSA9IHRoaXMudHJhbnMucmVhZChzeik7CisgICAgdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOworICB9CisgIHJldHVybiB7Zm5hbWU6IG5hbWUsIG10eXBlOiB0eXBlLCByc2VxaWQ6IHNlcWlkfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB7Zm5hbWU6ICcnfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgaWYgKHR5cGUgPT0gVHlwZS5TVE9QKSB7CisgICAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IHR5cGUsIGZpZDogMH07CisgIH0KKyAgdmFyIGlkID0gdGhpcy5yZWFkSTE2KCk7CisgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiB0eXBlLCBmaWQ6IGlkfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIga3R5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciB2dHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKKyAgcmV0dXJuIHtrdHlwZToga3R5cGUsIHZ0eXBlOiB2dHlwZSwgc2l6ZTogc2l6ZX07Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgZXR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciBzaXplID0gdGhpcy5yZWFkSTMyKCk7CisgIHJldHVybiB7ZXR5cGU6IGV0eXBlLCBzaXplOiBzaXplfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBldHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKKyAgcmV0dXJuIHtldHlwZTogZXR5cGUsIHNpemU6IHNpemV9OworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7CisgIHZhciBiID0gdGhpcy5yZWFkQnl0ZSgpOworICBpZiAoYiA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEkxNiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5yZWFkSTE2KCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEkzMigpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDgpOworICByZXR1cm4gbmV3IEludDY0KGJ1ZmYpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWREb3VibGUoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICB2YXIgbGVuID0gdGhpcy5yZWFkSTMyKCk7CisgIGlmIChsZW4gPT09IDApIHsKKyAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKTsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGJpbmFyeSBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChsZW4pOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKKyAgaWYgKGxlbiA9PT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhsZW4pOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnM7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVHlwZS5TVE9QOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVHlwZS5CT09MOgorICAgICAgdGhpcy5yZWFkQm9vbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkJZVEU6CisgICAgICB0aGlzLnJlYWRCeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTE2OgorICAgICAgdGhpcy5yZWFkSTE2KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTMyOgorICAgICAgdGhpcy5yZWFkSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTY0OgorICAgICAgdGhpcy5yZWFkSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuRE9VQkxFOgorICAgICAgdGhpcy5yZWFkRG91YmxlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSSU5HOgorICAgICAgdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSVUNUOgorICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoci5mdHlwZSA9PT0gVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5za2lwKHIuZnR5cGUpOworICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTUFQOgorICAgICAgdmFyIG1hcEJlZ2luID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwQmVnaW4uc2l6ZTsgKytpKSB7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi5rdHlwZSk7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi52dHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TRVQ6CisgICAgICB2YXIgc2V0QmVnaW4gPSB0aGlzLnJlYWRTZXRCZWdpbigpOworICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHNldEJlZ2luLnNpemU7ICsraTIpIHsKKyAgICAgICAgdGhpcy5za2lwKHNldEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFNldEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkxJU1Q6CisgICAgICB2YXIgbGlzdEJlZ2luID0gdGhpcy5yZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgbGlzdEJlZ2luLnNpemU7ICsraTMpIHsKKyAgICAgICAgdGhpcy5za2lwKGxpc3RCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3ICBFcnJvcigiSW52YWxpZCB0eXBlOiAiICsgdHlwZSk7CisgIH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2U4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcwpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitleHBvcnRzLlRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK3ZhciB4aHJDb25uZWN0aW9uID0gcmVxdWlyZSgnLi94aHJfY29ubmVjdGlvbicpOworZXhwb3J0cy5YSFJDb25uZWN0aW9uID0geGhyQ29ubmVjdGlvbi5YSFJDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVYSFJDb25uZWN0aW9uID0geGhyQ29ubmVjdGlvbi5jcmVhdGVYSFJDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVYSFJDbGllbnQgPSB4aHJDb25uZWN0aW9uLmNyZWF0ZVhIUkNsaWVudDsKKworZXhwb3J0cy5NdWx0aXBsZXhlciA9IHJlcXVpcmUoJy4vbXVsdGlwbGV4ZWRfcHJvdG9jb2wnKS5NdWx0aXBsZXhlcjsKKworZXhwb3J0cy5UV2ViU29ja2V0VHJhbnNwb3J0ID0gcmVxdWlyZSgnLi93c190cmFuc3BvcnQnKTsKK2V4cG9ydHMuVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK2V4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworCitleHBvcnRzLlByb3RvY29sID0gZXhwb3J0cy5USlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7CitleHBvcnRzLlRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7CitleHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKKworZXhwb3J0cy5JbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTAwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK21vZHVsZS5leHBvcnRzID0gVEJ1ZmZlcmVkVHJhbnNwb3J0OworCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQoYnVmZmVyLCBjYWxsYmFjaykgeworICB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSA9IDEwMjQ7CisgIHRoaXMud3JpdGVCdWZmZXJTaXplID0gNTEyOyAvLyBTb2Z0IExpbWl0CisgIHRoaXMuaW5CdWYgPSBuZXcgQnVmZmVyKHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplKTsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKKyAgdGhpcy53cml0ZUN1cnNvciA9IDA7IC8vIGZvciBpbnB1dCBidWZmZXIKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworICB0aGlzLm9uRmx1c2ggPSBjYWxsYmFjazsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5pbkJ1ZiA9IG5ldyBCdWZmZXIodGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUpOworICB0aGlzLnJlYWRDdXJzb3IgPSAwOworICB0aGlzLndyaXRlQ3Vyc29yID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworfQorCitUQnVmZmVyZWRUcmFuc3BvcnQucmVjZWl2ZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgc2VxaWQpIHsKKyAgdmFyIHJlYWRlciA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKworICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgeworICAgIGlmIChyZWFkZXIud3JpdGVDdXJzb3IgKyBkYXRhLmxlbmd0aCA+IHJlYWRlci5pbkJ1Zi5sZW5ndGgpIHsKKyAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHJlYWRlci53cml0ZUN1cnNvciArIGRhdGEubGVuZ3RoKTsKKyAgICAgIHJlYWRlci5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgMCwgcmVhZGVyLndyaXRlQ3Vyc29yKTsKKyAgICAgIHJlYWRlci5pbkJ1ZiA9IGJ1ZjsKKyAgICB9CisgICAgZGF0YS5jb3B5KHJlYWRlci5pbkJ1ZiwgcmVhZGVyLndyaXRlQ3Vyc29yLCAwKTsKKyAgICByZWFkZXIud3JpdGVDdXJzb3IgKz0gZGF0YS5sZW5ndGg7CisKKyAgICBjYWxsYmFjayhyZWFkZXIsIHNlcWlkKTsKKyAgfTsKK307CisKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb21taXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCl7CisgIHZhciB1bnJlYWRTaXplID0gdGhpcy53cml0ZUN1cnNvciAtIHRoaXMucmVhZEN1cnNvcjsKKyAgdmFyIGJ1ZlNpemUgPSAodW5yZWFkU2l6ZSAqIDIgPiB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSkgPworICAgIHVucmVhZFNpemUgKiAyIDogdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemU7CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGJ1ZlNpemUpOworICBpZiAodW5yZWFkU2l6ZSA+IDApIHsKKyAgICB0aGlzLmluQnVmLmNvcHkoYnVmLCAwLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMud3JpdGVDdXJzb3IpOworICB9CisgIHRoaXMucmVhZEN1cnNvciA9IDA7CisgIHRoaXMud3JpdGVDdXJzb3IgPSB1bnJlYWRTaXplOworICB0aGlzLmluQnVmID0gYnVmOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yb2xsYmFja1Bvc2l0aW9uID0gZnVuY3Rpb24oKXsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKK30KKworICAvLyBUT0RPOiBJbXBsZW1lbnQgb3Blbi9jbG9zZSBzdXBwb3J0CitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworfTsKKworICAvLyBTZXQgdGhlIHNlcWlkIG9mIHRoZSBtZXNzYWdlIGluIHRoZSBjbGllbnQKKyAgLy8gU28gdGhhdCBjYWxsYmFja3MgY2FuIGJlIGZvdW5kCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnNldEN1cnJTZXFJZCA9IGZ1bmN0aW9uKHNlcWlkKSB7CisgIHRoaXMuX3NlcWlkID0gc2VxaWQ7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmVuc3VyZUF2YWlsYWJsZSA9IGZ1bmN0aW9uKGxlbikgeworICBpZiAodGhpcy5yZWFkQ3Vyc29yICsgbGVuID4gdGhpcy53cml0ZUN1cnNvcikgeworICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKGxlbik7CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbik7CisgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy5yZWFkQ3Vyc29yICsgbGVuKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IGxlbjsKKyAgcmV0dXJuIGJ1ZjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMSk7CisgIHJldHVybiBiaW5hcnkucmVhZEJ5dGUodGhpcy5pbkJ1Zlt0aGlzLnJlYWRDdXJzb3IrK10pOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDIpOworICB2YXIgaTE2ID0gYmluYXJ5LnJlYWRJMTYodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkQ3Vyc29yKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IDI7CisgIHJldHVybiBpMTY7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoNCk7CisgIHZhciBpMzIgPSBiaW5hcnkucmVhZEkzMih0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOworICB0aGlzLnJlYWRDdXJzb3IgKz0gNDsKKyAgcmV0dXJuIGkzMjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSg4KTsKKyAgdmFyIGQgPSBiaW5hcnkucmVhZERvdWJsZSh0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOworICB0aGlzLnJlYWRDdXJzb3IgKz0gODsKKyAgcmV0dXJuIGQ7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbihsZW4pIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUobGVuKTsKKyAgdmFyIHN0ciA9IHRoaXMuaW5CdWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMucmVhZEN1cnNvciArIGxlbik7CisgIHRoaXMucmVhZEN1cnNvciArPSBsZW47CisgIHJldHVybiBzdHI7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmJvcnJvdyA9IGZ1bmN0aW9uKCkgeworICB2YXIgb2JqID0ge2J1ZjogdGhpcy5pbkJ1ZiwgcmVhZEluZGV4OiB0aGlzLnJlYWRDdXJzb3IsIHdyaXRlSW5kZXg6IHRoaXMud3JpdGVDdXJzb3J9OworICByZXR1cm4gb2JqOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb25zdW1lID0gZnVuY3Rpb24oYnl0ZXNDb25zdW1lZCkgeworICB0aGlzLnJlYWRDdXJzb3IgKz0gYnl0ZXNDb25zdW1lZDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHsKKyAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgeworICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCAndXRmOCcpOworICB9CisgIHRoaXMub3V0QnVmZmVycy5wdXNoKGJ1Zik7CisgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgLy8gSWYgdGhlIHNlcWlkIG9mIHRoZSBjYWxsYmFjayBpcyBhdmFpbGFibGUgcGFzcyBpdCB0byB0aGUgb25GbHVzaAorICAvLyBUaGVuIHJlbW92ZSB0aGUgY3VycmVudCBzZXFpZAorICB2YXIgc2VxaWQgPSB0aGlzLl9zZXFpZDsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOworCisgIGlmICh0aGlzLm91dENvdW50IDwgMSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZhciBtc2cgPSBuZXcgQnVmZmVyKHRoaXMub3V0Q291bnQpLAorICAgICAgcG9zID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzLmZvckVhY2goZnVuY3Rpb24oYnVmKSB7CisgICAgYnVmLmNvcHkobXNnLCBwb3MsIDApOworICAgIHBvcyArPSBidWYubGVuZ3RoOworICB9KTsKKworICBpZiAodGhpcy5vbkZsdXNoKSB7CisgICAgLy8gUGFzc2luZyBzZXFpZCB0aHJvdWdoIHRoaXMgY2FsbCB0byBnZXQgaXQgdG8gdGhlIGNvbm5lY3Rpb24KKyAgICB0aGlzLm9uRmx1c2gobXNnLCBzZXFpZCk7CisgIH0KKworICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKKyAgdGhpcy5vdXRDb3VudCA9IDA7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTMxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDkxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKKworbW9kdWxlLmV4cG9ydHMgPSBUQ29tcGFjdFByb3RvY29sOworCit2YXIgUE9XXzggPSBNYXRoLnBvdygyLCA4KTsKK3ZhciBQT1dfMjQgPSBNYXRoLnBvdygyLCAyNCk7Cit2YXIgUE9XXzMyID0gTWF0aC5wb3coMiwgMzIpOwordmFyIFBPV180MCA9IE1hdGgucG93KDIsIDQwKTsKK3ZhciBQT1dfNDggPSBNYXRoLnBvdygyLCA0OCk7Cit2YXIgUE9XXzUyID0gTWF0aC5wb3coMiwgNTIpOwordmFyIFBPV18xMDIyID0gTWF0aC5wb3coMiwgMTAyMik7CisKKy8qKgorICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBDb21wYWN0IFByb3RvY29sLgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge29iamVjdH0gW3RyYW5zXSAtIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBQcm90b2NvbCBsYXllciBwZXJmb3JtcyBzZXJpYWxpemF0aW9uCisgKiAgICAgb2YgYmFzZSB0eXBlcywgdGhlIGNvbXBhY3QgcHJvdG9jb2wgc2VyaWFsaXplcyBkYXRhIGluIGJpbmFyeQorICogICAgIGZvcm0gd2l0aCBtaW5pbWFsIHNwYWNlIHVzZWQgZm9yIHNjYWxhciB2YWx1ZXMuCisgKi8KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2wodHJhbnMpIHsKKyAgdGhpcy50cmFucyA9IHRyYW5zOworICB0aGlzLmxhc3RGaWVsZF8gPSBbXTsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOworICB0aGlzLnN0cmluZ19saW1pdF8gPSAwOworICB0aGlzLnN0cmluZ19idWZfID0gbnVsbDsKKyAgdGhpcy5zdHJpbmdfYnVmX3NpemVfID0gMDsKKyAgdGhpcy5jb250YWluZXJfbGltaXRfID0gMDsKKyAgdGhpcy5ib29sZWFuRmllbGRfID0geworICAgIG5hbWU6IG51bGwsCisgICAgaGFzQm9vbFZhbHVlOiBmYWxzZQorICB9OworICB0aGlzLmJvb2xWYWx1ZV8gPSB7CisgICAgaGFzQm9vbFZhbHVlOiBmYWxzZSwKKyAgICBib29sVmFsdWU6IGZhbHNlCisgIH07Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIENvbnN0YW50cworLy8KKworLyoqCisgICogQ29tcGFjdCBQcm90b2NvbCBJRCBudW1iZXIuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFBST1RPQ09MX0lECisgICovCitUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEID0gLTEyNjsgIC8vMTAwMCAwMDEwCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFZFUlNJT05fTgorICAqLworVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX04gPSAxOworCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIHZlcnNpb24gbWFzayBmb3IgY29tYmluaW5nIHByb3RvY29sIHZlcnNpb24gYW5kIG1lc3NhZ2UgdHlwZSBpbiBvbmUgYnl0ZS4KKyAgKiBAcmVhZG9ubHkKKyAgKiBAY29uc3Qge251bWJlcn0gVkVSU0lPTl9NQVNLCisgICovCitUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyA9IDB4MWY7IC8vMDAwMSAxMTExCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZSB0eXBlIG1hc2sgZm9yIGNvbWJpbmluZyBwcm90b2NvbCB2ZXJzaW9uIGFuZCBtZXNzYWdlIHR5cGUgaW4gb25lIGJ5dGUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfTUFTSworICAqLworVENvbXBhY3RQcm90b2NvbC5UWVBFX01BU0sgPSAtMzI7ICAgICAvLzExMTAgMDAwMAorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2UgdHlwZSBiaXRzIGZvciBlbnN1cmluZyBtZXNzYWdlIHR5cGUgYml0IHNpemUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfQklUUworICAqLworVENvbXBhY3RQcm90b2NvbC5UWVBFX0JJVFMgPSA3OyAvLzAwMDAgMDExMQorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2UgdHlwZSBzaGlmdCBhbW91bnQgZm9yIGNvbWJpbmluZyBwcm90b2NvbCB2ZXJzaW9uIGFuZCBtZXNzYWdlIHR5cGUgaW4gb25lIGJ5dGUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfU0hJRlRfQU1PVU5UCisgICovCitUQ29tcGFjdFByb3RvY29sLlRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworLyoqCisgKiBDb21wYWN0IFByb3RvY29sIHR5cGUgSURzIHVzZWQgdG8ga2VlcCB0eXBlIGRhdGEgd2l0aGluIG9uZSBuaWJibGUuCisgKiBAcmVhZG9ubHkKKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU1RPUCAgICAgICAgICAtIEVuZCBvZiBhIHNldCBvZiBmaWVsZHMuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JPT0xFQU5fVFJVRSAgLSBGbGFnIGZvciBCb29sZWFuIGZpZWxkIHdpdGggdHJ1ZSB2YWx1ZSAocGFja2VkIGZpZWxkIGFuZCB2YWx1ZSkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JPT0xFQU5fRkFMU0UgLSBGbGFnIGZvciBCb29sZWFuIGZpZWxkIHdpdGggZmFsc2UgdmFsdWUgKHBhY2tlZCBmaWVsZCBhbmQgdmFsdWUpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CWVRFICAgICAgICAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0kxNiAgICAgICAgICAgLSBTaWduZWQgMTYgYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0kzMiAgICAgICAgICAgLSBTaWduZWQgMzIgYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0k2NCAgICAgICAgICAgLSBTaWduZWQgNjQgYml0IGludGVnZXIgKDJeNTMgbWF4IGluIEphdmFTY3JpcHQpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9ET1VCTEUgICAgICAgIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CSU5BUlkgICAgICAgIC0gQXJyYXkgb2YgYnl0ZXMgKHVzZWQgZm9yIHN0cmluZ3MgYWxzbykuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0xJU1QgICAgICAgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU0VUICAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQgYW5kIHdpdGhvdXQgcmVwZWF0ZWQgdmFsdWVzKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfTUFQICAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlIChtYXAvYXNzb2NpYXRpdmUtYXJyYXkvZGljdGlvbmFyeSkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX1NUUlVDVCAgICAgICAgLSBBIG11bHRpZmllbGQgdHlwZS4KKyAqLworVENvbXBhY3RQcm90b2NvbC5UeXBlcyA9IHsKKyAgQ1RfU1RPUDogICAgICAgICAgIDB4MDAsCisgIENUX0JPT0xFQU5fVFJVRTogICAweDAxLAorICBDVF9CT09MRUFOX0ZBTFNFOiAgMHgwMiwKKyAgQ1RfQllURTogICAgICAgICAgIDB4MDMsCisgIENUX0kxNjogICAgICAgICAgICAweDA0LAorICBDVF9JMzI6ICAgICAgICAgICAgMHgwNSwKKyAgQ1RfSTY0OiAgICAgICAgICAgIDB4MDYsCisgIENUX0RPVUJMRTogICAgICAgICAweDA3LAorICBDVF9CSU5BUlk6ICAgICAgICAgMHgwOCwKKyAgQ1RfTElTVDogICAgICAgICAgIDB4MDksCisgIENUX1NFVDogICAgICAgICAgICAweDBBLAorICBDVF9NQVA6ICAgICAgICAgICAgMHgwQiwKKyAgQ1RfU1RSVUNUOiAgICAgICAgIDB4MEMKK307CisKKy8qKgorICogQXJyYXkgbWFwcGluZyBDb21wYWN0IHR5cGUgSURzIHRvIHN0YW5kYXJkIFRocmlmdCB0eXBlIElEcy4KKyAqIEByZWFkb25seQorICovCitUQ29tcGFjdFByb3RvY29sLlRUeXBlVG9DVHlwZSA9IFsKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QLCAgICAgICAgIC8vIFRfU1RPUAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CWVRFLCAgICAgICAgIC8vIFRfQllURQorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0RPVUJMRSwgICAgICAgLy8gVF9ET1VCTEUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kxNiwgICAgICAgICAgLy8gVF9JMTYKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kzMiwgICAgICAgICAgLy8gVF9JMzIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0k2NCwgICAgICAgICAgLy8gVF9JNjQKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CSU5BUlksICAgICAgIC8vIFRfU1RSSU5HCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RSVUNULCAgICAgICAvLyBUX1NUUlVDVAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX01BUCwgICAgICAgICAgLy8gVF9NQVAKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TRVQsICAgICAgICAgIC8vIFRfU0VUCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTElTVCwgICAgICAgICAvLyBUX0xJU1QKK107CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgVXRpbGl0aWVzCisvLworCisvKioKKyAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyLgorICogQHJldHVybiB7b2JqZWN0fSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbGF5ZXIuCisgKi9UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnM7Cit9OworCisvKioKKyAqIExvb2t1cCBhIENvbXBhY3QgUHJvdG9jb2wgVHlwZSB2YWx1ZSBmb3IgYSBnaXZlbiBUaHJpZnQgVHlwZSB2YWx1ZS4KKyAqIE4uQi4gVXNlZCBvbmx5IGludGVybmFsbHkuCisgKiBAcGFyYW0ge251bWJlcn0gdHR5cGUgLSBUaHJpZnQgdHlwZSB2YWx1ZQorICogQHJldHVybnMge251bWJlcn0gQ29tcGFjdCBwcm90b2NvbCB0eXBlIHZhbHVlCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmdldENvbXBhY3RUeXBlID0gZnVuY3Rpb24odHR5cGUpIHsKKyAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVFR5cGVUb0NUeXBlW3R0eXBlXTsKK307CisKKy8qKgorICogTG9va3VwIGEgVGhyaWZ0IFR5cGUgdmFsdWUgZm9yIGEgZ2l2ZW4gQ29tcGFjdCBQcm90b2NvbCBUeXBlIHZhbHVlLgorICogTi5CLiBVc2VkIG9ubHkgaW50ZXJuYWxseS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gQ29tcGFjdCBQcm90b2NvbCB0eXBlIHZhbHVlCisgKiBAcmV0dXJucyB7bnVtYmVyfSBUaHJpZnQgVHlwZSB2YWx1ZQorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5nZXRUVHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm4gVHlwZS5TVE9QOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX0ZBTFNFOgorICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUU6CisgICAgICByZXR1cm4gVHlwZS5CT09MOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CWVRFOgorICAgICAgcmV0dXJuIFR5cGUuQllURTsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTE2OgorICAgICAgcmV0dXJuIFR5cGUuSTE2OworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JMzI6CisgICAgICByZXR1cm4gVHlwZS5JMzI7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0k2NDoKKyAgICAgIHJldHVybiBUeXBlLkk2NDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfRE9VQkxFOgorICAgICAgcmV0dXJuIFR5cGUuRE9VQkxFOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CSU5BUlk6CisgICAgICByZXR1cm4gVHlwZS5TVFJJTkc7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0xJU1Q6CisgICAgICByZXR1cm4gVHlwZS5MSVNUOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TRVQ6CisgICAgICByZXR1cm4gVHlwZS5TRVQ7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX01BUDoKKyAgICAgIHJldHVybiBUeXBlLk1BUDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RSVUNUOgorICAgICAgcmV0dXJuIFR5cGUuU1RSVUNUOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJVbmtub3duIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorICByZXR1cm4gVHlwZS5TVE9QOworfTsKKworCisvLworLy8gQ29tcGFjdCBQcm90b2NvbCB3cml0ZSBvcGVyYXRpb25zCisvLworCisvKioKKyAqIFNlbmQgYW55IGJ1ZmZlcmVkIGJ5dGVzIHRvIHRoZSBlbmQgcG9pbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLmZsdXNoKCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhbiBSUEMgbWVzc2FnZSBoZWFkZXIKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG1ldGhvZCBuYW1lIGZvciB0aGUgbWVzc2FnZS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gVGhlIHR5cGUgb2YgbWVzc2FnZSAoQ0FMTCwgUkVQTFksIEVYQ0VQVElPTiwgT05FV0FZKS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBjYWxsIHNlcXVlbmNlIG51bWJlciAoaWYgYW55KS4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgeworICB0aGlzLndyaXRlQnl0ZShUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEKTsKKyAgdGhpcy53cml0ZUJ5dGUoKFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9OICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICgodHlwZSA8PCBUQ29tcGFjdFByb3RvY29sLlRZUEVfU0hJRlRfQU1PVU5UKSAmIFRDb21wYWN0UHJvdG9jb2wuVFlQRV9NQVNLKSk7CisgIHRoaXMud3JpdGVWYXJpbnQzMihzZXFpZCk7CisgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7CisKKyAgLy8gUmVjb3JkIGNsaWVudCBzZXFpZCB0byBmaW5kIGNhbGxiYWNrIGFnYWluCisgIGlmICh0aGlzLl9zZXFpZCkgeworICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOworICB9IGVsc2UgeworICAgIHRoaXMuX3NlcWlkID0gc2VxaWQ7CisgICAgdGhpcy50cmFucy5zZXRDdXJyU2VxSWQoc2VxaWQpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7CisgIHRoaXMubGFzdEZpZWxkXy5wdXNoKHRoaXMubGFzdEZpZWxkSWRfKTsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSB0aGlzLmxhc3RGaWVsZF8ucG9wKCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIHN0cnVjdCBmaWVsZCBoZWFkZXIKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGZpZWxkIG5hbWUgKG5vdCB3cml0dGVuIHdpdGggdGhlIGNvbXBhY3QgcHJvdG9jb2wpLgorICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgZmllbGQgZGF0YSB0eXBlIChhIG5vcm1hbCBUaHJpZnQgZmllbGQgVHlwZSkuCisgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgSURMIGZpZWxkIElkLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBpZCkgeworICBpZiAodHlwZSAhPSBUeXBlLkJPT0wpIHsKKyAgICByZXR1cm4gdGhpcy53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0eXBlLCBpZCwgLTEpOworICB9CisKKyAgdGhpcy5ib29sZWFuRmllbGRfLm5hbWUgPSBuYW1lOworICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRUeXBlID0gdHlwZTsKKyAgdGhpcy5ib29sZWFuRmllbGRfLmZpZWxkSWQgPSBpZDsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRTdG9wID0gZnVuY3Rpb24oKSB7CisgIHRoaXMud3JpdGVCeXRlKFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RPUCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIG1hcCBjb2xsZWN0aW9uIGhlYWRlcgorICogQHBhcmFtIHtudW1iZXJ9IGtleVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIG1hcCBrZXlzLgorICogQHBhcmFtIHtudW1iZXJ9IHZhbFR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIG1hcCB2YWx1ZXMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2Ygay92IHBhaXJzIGluIHRoZSBtYXAuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKSB7CisgIGlmIChzaXplID09PSAwKSB7CisgICAgdGhpcy53cml0ZUJ5dGUoMCk7CisgIH0gZWxzZSB7CisgICAgdGhpcy53cml0ZVZhcmludDMyKHNpemUpOworICAgIHRoaXMud3JpdGVCeXRlKHRoaXMuZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkgPDwgNCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUodmFsVHlwZSkpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworLyoqCisgKiBXcml0ZXMgYSBsaXN0IGNvbGxlY3Rpb24gaGVhZGVyCisgKiBAcGFyYW0ge251bWJlcn0gZWxlbVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIGxpc3QgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogV3JpdGVzIGEgc2V0IGNvbGxlY3Rpb24gaGVhZGVyCisgKiBAcGFyYW0ge251bWJlcn0gZWxlbVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIHNldCBlbGVtZW50cy4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgaWYgKHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lICE9PSBudWxsKSB7CisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgdGhpcy53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbCh0aGlzLmJvb2xlYW5GaWVsZF8ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA/IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkpOworICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lID0gbnVsbDsKKyAgfSBlbHNlIHsKKyAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZQorICAgIHRoaXMud3JpdGVCeXRlKCh2YWx1ZSA/IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fRkFMU0UpKTsKKyAgfQorfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYikgeworICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoW2JdKSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKGkxNikgeworICB0aGlzLndyaXRlVmFyaW50MzIodGhpcy5pMzJUb1ppZ3phZyhpMTYpKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7CisgIHRoaXMud3JpdGVWYXJpbnQzMih0aGlzLmkzMlRvWmlnemFnKGkzMikpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKKyAgdGhpcy53cml0ZVZhcmludDY0KHRoaXMuaTY0VG9aaWd6YWcoaTY0KSk7Cit9OworCisvLyBMaXR0bGUtZW5kaWFuLCB1bmxpa2UgVEJpbmFyeVByb3RvY29sCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKHYpIHsKKyAgdmFyIGJ1ZmYgPSBuZXcgQnVmZmVyKDgpOworICB2YXIgbSwgZSwgYzsKKworICBidWZmWzddID0gKHYgPCAwID8gMHg4MCA6IDB4MDApOworCisgIHYgPSBNYXRoLmFicyh2KTsKKyAgaWYgKHYgIT09IHYpIHsKKyAgICAvLyBOYU4sIHVzZSBRTmFOIElFRUUgZm9ybWF0CisgICAgbSA9IDIyNTE3OTk4MTM2ODUyNDg7CisgICAgZSA9IDIwNDc7CisgIH0gZWxzZSBpZiAodiA9PT0gSW5maW5pdHkpIHsKKyAgICBtID0gMDsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIHsKKyAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2KSAvIE1hdGguTE4yKTsKKyAgICBjID0gTWF0aC5wb3coMiwgLWUpOworICAgIGlmICh2ICogYyA8IDEpIHsKKyAgICAgIGUtLTsKKyAgICAgIGMgKj0gMjsKKyAgICB9CisKKyAgICBpZiAoZSArIDEwMjMgPj0gMjA0NykKKyAgICB7CisgICAgICAvLyBPdmVyZmxvdworICAgICAgbSA9IDA7CisgICAgICBlID0gMjA0NzsKKyAgICB9CisgICAgZWxzZSBpZiAoZSArIDEwMjMgPj0gMSkKKyAgICB7CisgICAgICAvLyBOb3JtYWxpemVkIC0gdGVybSBvcmRlciBtYXR0ZXJzLCBhcyBNYXRoLnBvdygyLCA1Mi1lKSBhbmQgdipNYXRoLnBvdygyLCA1MikgY2FuIG92ZXJmbG93CisgICAgICBtID0gKHYqYy0xKSAqIFBPV181MjsKKyAgICAgIGUgKz0gMTAyMzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIERlbm9ybWFsaXplZCAtIGFsc28gY2F0Y2hlcyB0aGUgJzAnIGNhc2UsIHNvbWV3aGF0IGJ5IGNoYW5jZQorICAgICAgbSA9ICh2ICogUE9XXzEwMjIpICogUE9XXzUyOworICAgICAgZSA9IDA7CisgICAgfQorICB9CisKKyAgYnVmZls2XSA9IChlIDw8IDQpICYgMHhmMDsKKyAgYnVmZls3XSB8PSAoZSA+PiA0KSAmIDB4N2Y7CisKKyAgYnVmZlswXSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzFdID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbMl0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZlszXSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzRdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbNV0gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZls2XSB8PSBtICYgMHgwZjsKKworICB0aGlzLnRyYW5zLndyaXRlKGJ1ZmYpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmdPckJpbmFyeSA9IGZ1bmN0aW9uKG5hbWUsIGVuY29kaW5nLCBhcmcpIHsKKyAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgdGhpcy53cml0ZVZhcmludDMyKEJ1ZmZlci5ieXRlTGVuZ3RoKGFyZywgZW5jb2RpbmcpKSA7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKKyAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIgfHwKKyAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpIHsKKyAgICAvLyBCdWZmZXJzIGluIE5vZGUuanMgdW5kZXIgQnJvd3NlcmlmeSBtYXkgZXh0ZW5kIFVJbnQ4QXJyYXkgaW5zdGVhZCBvZgorICAgIC8vIGRlZmluaW5nIGEgbmV3IG9iamVjdC4gV2UgZGV0ZWN0IHRoZW0gaGVyZSBzbyB3ZSBjYW4gd3JpdGUgdGhlbQorICAgIC8vIGNvcnJlY3RseQorICAgIHRoaXMud3JpdGVWYXJpbnQzMihhcmcubGVuZ3RoKTsKKyAgICB0aGlzLnRyYW5zLndyaXRlKGFyZyk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyAnIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgIH0KK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVTdHJpbmcnLCAndXRmOCcsIGFyZyk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlQmluYXJ5JywgJ2JpbmFyeScsIGFyZyk7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIGludGVybmFsIHdyaXRlIG1ldGhvZHMKKy8vCisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbkludGVybmFsID0gZnVuY3Rpb24obmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGUpIHsKKyAgLy9JZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgIHZhciB0eXBlVG9Xcml0ZSA9ICh0eXBlT3ZlcnJpZGUgPT0gLTEgPyB0aGlzLmdldENvbXBhY3RUeXBlKGZpZWxkVHlwZSkgOiB0eXBlT3ZlcnJpZGUpOworICAvL0NoZWNrIGlmIHdlIGNhbiBkZWx0YSBlbmNvZGUgdGhlIGZpZWxkIGlkCisgIGlmIChmaWVsZElkID4gdGhpcy5sYXN0RmllbGRJZF8gJiYgZmllbGRJZCAtIHRoaXMubGFzdEZpZWxkSWRfIDw9IDE1KSB7CisgICAgLy9JbmNsdWRlIHRoZSB0eXBlIGRlbHRhIHdpdGggdGhlIGZpZWxkIElECisgICAgdGhpcy53cml0ZUJ5dGUoKGZpZWxkSWQgLSB0aGlzLmxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgfSBlbHNlIHsKKyAgICAvL1dyaXRlIHNlcGFyYXRlIHR5cGUgYW5kIElEIHZhbHVlcworICAgIHRoaXMud3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKKyAgICB0aGlzLndyaXRlSTE2KGZpZWxkSWQpOworICB9CisgIHRoaXMubGFzdEZpZWxkSWRfID0gZmllbGRJZDsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQ29sbGVjdGlvbkJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICAvL0NvbWJpbmUgc2l6ZSBhbmQgdHlwZSBpbiBvbmUgYnl0ZSBpZiBwb3NzaWJsZQorICAgIHRoaXMud3JpdGVCeXRlKHNpemUgPDwgNCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgweGYwIHwgdGhpcy5nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgIHRoaXMud3JpdGVWYXJpbnQzMihzaXplKTsKKyAgfQorfTsKKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVZhcmludDMyID0gZnVuY3Rpb24obikgeworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcig1KTsKKyAgdmFyIHdzaXplID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RikgPT09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IG47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPSBuID4+PiA3OworICAgIH0KKyAgfQorICB2YXIgd2J1ZiA9IG5ldyBCdWZmZXIod3NpemUpOworICBidWYuY29weSh3YnVmLDAsMCx3c2l6ZSk7CisgIHRoaXMudHJhbnMud3JpdGUod2J1Zik7Cit9OworCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICogTi5CLiBub2RlLWludDY0IGlzIGFsd2F5cyBiaWcgZW5kaWFuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlVmFyaW50NjQgPSBmdW5jdGlvbihuKSB7CisgIGlmICh0eXBlb2YgbiA9PT0gIm51bWJlciIpeworICAgIG4gPSBuZXcgSW50NjQobik7CisgIH0KKyAgaWYgKCEgKG4gaW5zdGFuY2VvZiBJbnQ2NCkpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBJbnQ2NCBvciBOdW1iZXIsIGZvdW5kOiAiICsgbik7CisgIH0KKworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcigxMCk7CisgIHZhciB3c2l6ZSA9IDA7CisgIHZhciBoaSA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSgwLCB0cnVlKTsKKyAgdmFyIGxvID0gbi5idWZmZXIucmVhZFVJbnQzMkJFKDQsIHRydWUpOworICB2YXIgbWFzayA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKCgobG8gJiB+MHg3RikgPT09IDApICYmIChoaSA9PT0gMCkpIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGxvOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9ICgobG8gJiAweDdGKSB8IDB4ODApOworICAgICAgbWFzayA9IGhpIDw8IDI1OworICAgICAgbG8gPSBsbyA+Pj4gNzsKKyAgICAgIGhpID0gaGkgPj4+IDc7CisgICAgICBsbyA9IGxvIHwgbWFzazsKKyAgICB9CisgIH0KKyAgdmFyIHdidWYgPSBuZXcgQnVmZmVyKHdzaXplKTsKKyAgYnVmLmNvcHkod2J1ZiwwLDAsd3NpemUpOworICB0aGlzLnRyYW5zLndyaXRlKHdidWYpOworfTsKKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmk2NFRvWmlnemFnID0gZnVuY3Rpb24obCkgeworICBpZiAodHlwZW9mIGwgPT09ICdzdHJpbmcnKSB7CisgICAgbCA9IG5ldyBJbnQ2NChwYXJzZUludChsLCAxMCkpOworICB9IGVsc2UgaWYgKHR5cGVvZiBsID09PSAnbnVtYmVyJykgeworICAgIGwgPSBuZXcgSW50NjQobCk7CisgIH0KKyAgaWYgKCEgKGwgaW5zdGFuY2VvZiBJbnQ2NCkpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBJbnQ2NCBvciBOdW1iZXIsIGZvdW5kOiAiICsgbCk7CisgIH0KKyAgdmFyIGhpID0gbC5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG8gPSBsLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisgIHZhciBzaWduID0gaGkgPj4+IDMxOworICBoaSA9ICgoaGkgPDwgMSkgfCAobG8gPj4+IDMxKSkgXiAoKCEhc2lnbikgPyAweEZGRkZGRkZGIDogMCk7CisgIGxvID0gKGxvIDw8IDEpIF4gKCghIXNpZ24pID8gMHhGRkZGRkZGRiA6IDApOworICByZXR1cm4gbmV3IEludDY0KGhpLCBsbyk7Cit9OworCisvKioKKyAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5pMzJUb1ppZ3phZyA9IGZ1bmN0aW9uKG4pIHsKKyAgcmV0dXJuIChuIDw8IDEpIF4gKChuICYgMHg4MDAwMDAwMCkgPyAweEZGRkZGRkZGIDogMCk7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIHJlYWQgb3BlcmF0aW9ucworLy8KKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICAvL1JlYWQgcHJvdG9jb2wgSUQKKyAgdmFyIHByb3RvY29sSWQgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgIGlmIChwcm90b2NvbElkICE9IFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5CQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCBpZGVudGlmaWVyICIgKyBwcm90b2NvbElkKTsKKyAgfQorCisgIC8vUmVhZCBWZXJzaW9uIGFuZCBUeXBlCisgIHZhciB2ZXJzaW9uQW5kVHlwZSA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKyAgdmFyIHZlcnNpb24gPSAodmVyc2lvbkFuZFR5cGUgJiBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyk7CisgIGlmICh2ZXJzaW9uICE9IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9OKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgdmVyc2lvbiAiICsgdmVyc2lvbik7CisgIH0KKyAgdmFyIHR5cGUgPSAoKHZlcnNpb25BbmRUeXBlID4+IFRDb21wYWN0UHJvdG9jb2wuVFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbC5UWVBFX0JJVFMpOworCisgIC8vUmVhZCBTZXFJZAorICB2YXIgc2VxaWQgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworCisgIC8vUmVhZCBuYW1lCisgIHZhciBuYW1lID0gdGhpcy5yZWFkU3RyaW5nKCk7CisKKyAgcmV0dXJuIHtmbmFtZTogbmFtZSwgbXR5cGU6IHR5cGUsIHJzZXFpZDogc2VxaWR9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmxhc3RGaWVsZF8ucHVzaCh0aGlzLmxhc3RGaWVsZElkXyk7CisgIHRoaXMubGFzdEZpZWxkSWRfID0gMDsKKyAgcmV0dXJuIHtmbmFtZTogJyd9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmxhc3RGaWVsZElkXyA9IHRoaXMubGFzdEZpZWxkXy5wb3AoKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBmaWVsZElkID0gMDsKKyAgdmFyIGIgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKGIpOworICB2YXIgdHlwZSA9IChiICYgMHgwZik7CisKKyAgaWYgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QKSB7CisgICAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IFRocmlmdC5UeXBlLlNUT1AsIGZpZDogMH07CisgIH0KKworICAvL01hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIgdG8gY2hlY2sgZm9yIGZpZWxkIGlkIGRlbHRhLgorICB2YXIgbW9kaWZpZXIgPSAoKGIgJiAweDAwMDAwMGYwKSA+Pj4gNCk7CisgIGlmIChtb2RpZmllciA9PT0gMCkgeworICAgIC8vSWYgbm90IGEgZGVsdGEgcmVhZCB0aGUgZmllbGQgaWQuCisgICAgZmllbGRJZCA9IHRoaXMucmVhZEkxNigpOworICB9IGVsc2UgeworICAgIC8vUmVjb3ZlciB0aGUgZmllbGQgaWQgZnJvbSB0aGUgZGVsdGEKKyAgICBmaWVsZElkID0gKHRoaXMubGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOworICB9CisgIHZhciBmaWVsZFR5cGUgPSB0aGlzLmdldFRUeXBlKHR5cGUpOworCisgIC8vQm9vbGVhbiBhcmUgZW5jb2RlZCB3aXRoIHRoZSB0eXBlCisgIGlmICh0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFIHx8CisgICAgICB0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkgeworICAgIHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSB0cnVlOworICAgIHRoaXMuYm9vbFZhbHVlXy5ib29sVmFsdWUgPQorICAgICAgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2UpOworICB9CisKKyAgLy9TYXZlIHRoZSBuZXcgZmllbGQgZm9yIHRoZSBuZXh0IGRlbHRhIGNvbXB1dGF0aW9uLgorICB0aGlzLmxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7CisgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiBmaWVsZFR5cGUsIGZpZDogZmllbGRJZH07Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgbXNpemUgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworICBpZiAobXNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIG1hcCBzaXplIik7CisgIH0KKworICB2YXIga3ZUeXBlID0gMDsKKyAgaWYgKG1zaXplICE9PSAwKSB7CisgICAga3ZUeXBlID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICB9CisKKyAgdmFyIGtleVR5cGUgPSB0aGlzLmdldFRUeXBlKChrdlR5cGUgJiAweGYwKSA+Pj4gNCk7CisgIHZhciB2YWxUeXBlID0gdGhpcy5nZXRUVHlwZShrdlR5cGUgJiAweGYpOworICByZXR1cm4ge2t0eXBlOiBrZXlUeXBlLCB2dHlwZTogdmFsVHlwZSwgc2l6ZTogbXNpemV9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZV9hbmRfdHlwZSA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKworICB2YXIgbHNpemUgPSAoc2l6ZV9hbmRfdHlwZSA+Pj4gNCkgJiAweDAwMDAwMDBmOworICBpZiAobHNpemUgPT0gMTUpIHsKKyAgICBsc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIH0KKworICBpZiAobHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGxpc3Qgc2l6ZSIpOworICB9CisKKyAgdmFyIGVsZW1UeXBlID0gdGhpcy5nZXRUVHlwZShzaXplX2FuZF90eXBlICYgMHgwMDAwMDAwZik7CisKKyAgcmV0dXJuIHtldHlwZTogZWxlbVR5cGUsIHNpemU6IGxzaXplfTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZExpc3RCZWdpbigpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJvb2wgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHZhbHVlID0gZmFsc2U7CisgIHZhciByc2l6ZSA9IDA7CisgIGlmICh0aGlzLmJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID09PSB0cnVlKSB7CisgICAgdmFsdWUgPSB0aGlzLmJvb2xWYWx1ZV8uYm9vbFZhbHVlOworICAgIHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgcmVzID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICAgIHJzaXplID0gcmVzLnJzaXplOworICAgIHZhbHVlID0gKHJlcy52YWx1ZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRSk7CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy56aWd6YWdUb0kzMih0aGlzLnJlYWRWYXJpbnQzMigpKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuemlnemFnVG9JNjQodGhpcy5yZWFkVmFyaW50NjQoKSk7Cit9OworCisvLyBMaXR0bGUtZW5kaWFuLCB1bmxpa2UgVEJpbmFyeVByb3RvY29sCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDgpOworICB2YXIgb2ZmID0gMDsKKworICB2YXIgc2lnbmVkID0gYnVmZltvZmYgKyA3XSAmIDB4ODA7CisgIHZhciBlID0gKGJ1ZmZbb2ZmKzZdICYgMHhGMCkgPj4gNDsKKyAgZSArPSAoYnVmZltvZmYrN10gJiAweDdGKSA8PCA0OworCisgIHZhciBtID0gYnVmZltvZmZdOworICBtICs9IGJ1ZmZbb2ZmKzFdIDw8IDg7CisgIG0gKz0gYnVmZltvZmYrMl0gPDwgMTY7CisgIG0gKz0gYnVmZltvZmYrM10gKiBQT1dfMjQ7CisgIG0gKz0gYnVmZltvZmYrNF0gKiBQT1dfMzI7CisgIG0gKz0gYnVmZltvZmYrNV0gKiBQT1dfNDA7CisgIG0gKz0gKGJ1ZmZbb2ZmKzZdICYgMHgwRikgKiBQT1dfNDg7CisKKyAgc3dpdGNoIChlKSB7CisgICAgY2FzZSAwOgorICAgICAgZSA9IC0xMDIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDQ3OgorICAgICAgcmV0dXJuIG0gPyBOYU4gOiAoc2lnbmVkID8gLUluZmluaXR5IDogSW5maW5pdHkpOworICAgIGRlZmF1bHQ6CisgICAgICBtICs9IFBPV181MjsKKyAgICAgIGUgLT0gMTAyMzsKKyAgfQorCisgIGlmIChzaWduZWQpIHsKKyAgICBtICo9IC0xOworICB9CisKKyAgcmV0dXJuIG0gKiBNYXRoLnBvdygyLCBlIC0gNTIpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIGlmIChzaXplID09PSAwKSB7CisgICAgcmV0dXJuIG5ldyBCdWZmZXIoMCk7CisgIH0KKworICBpZiAoc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgYmluYXJ5IHNpemUiKTsKKyAgfQorICByZXR1cm4gdGhpcy50cmFucy5yZWFkKHNpemUpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCisgIGlmIChzaXplID09PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhzaXplKTsKK307CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgaW50ZXJuYWwgcmVhZCBvcGVyYXRpb25zCisvLworCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkVmFyaW50MzIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZFZhcmludDY0KCkudG9OdW1iZXIoKTsKK307CisKKy8qKgorICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFZhcmludDY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciByc2l6ZSA9IDA7CisgIHZhciBsbyA9IDA7CisgIHZhciBoaSA9IDA7CisgIHZhciBzaGlmdCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdmFyIGIgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgICAgcnNpemUgKys7CisgICAgaWYgKHNoaWZ0IDw9IDI1KSB7CisgICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOworICAgIH0gZWxzZSBpZiAoMjUgPCBzaGlmdCAmJiBzaGlmdCA8IDMyKSB7CisgICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOworICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpID4+PiAoMzItc2hpZnQpKTsKKyAgICB9IGVsc2UgeworICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpIDw8IChzaGlmdC0zMikpOworICAgIH0KKyAgICBzaGlmdCArPSA3OworICAgIGlmICghKGIgJiAweDgwKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChyc2l6ZSA+PSAxMCkgeworICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgIH0KKyAgfQorICByZXR1cm4gbmV3IEludDY0KGhpLCBsbyk7Cit9OworCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuemlnemFnVG9JMzIgPSBmdW5jdGlvbihuKSB7CisgIHJldHVybiAobiA+Pj4gMSkgXiAoLTEgKiAobiAmIDEpKTsKK307CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnppZ3phZ1RvSTY0ID0gZnVuY3Rpb24obikgeworICB2YXIgaGkgPSBuLmJ1ZmZlci5yZWFkVUludDMyQkUoMCwgdHJ1ZSk7CisgIHZhciBsbyA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKKworICB2YXIgbmVnID0gbmV3IEludDY0KGhpICYgMCwgbG8gJiAxKTsKKyAgbmVnLl8yc2NvbXAoKTsKKyAgdmFyIGhpX25lZyA9IG5lZy5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG9fbmVnID0gbmVnLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisKKyAgdmFyIGhpX2xvID0gKGhpIDw8IDMxKTsKKyAgaGkgPSAoaGkgPj4+IDEpIF4gKGhpX25lZyk7CisgIGxvID0gKChsbyA+Pj4gMSkgfCBoaV9sbykgXiAobG9fbmVnKTsKKyAgcmV0dXJuIG5ldyBJbnQ2NChoaSwgbG8pOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm47CisgICAgY2FzZSBUeXBlLkJPT0w6CisgICAgICB0aGlzLnJlYWRCb29sKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuQllURToKKyAgICAgIHRoaXMucmVhZEJ5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMTY6CisgICAgICB0aGlzLnJlYWRJMTYoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMzI6CisgICAgICB0aGlzLnJlYWRJMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JNjQ6CisgICAgICB0aGlzLnJlYWRJNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICB0aGlzLnJlYWREb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJJTkc6CisgICAgICB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJVQ1Q6CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChyLmZ0eXBlID09PSBUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNraXAoci5mdHlwZSk7CisgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5NQVA6CisgICAgICB2YXIgbWFwQmVnaW4gPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBCZWdpbi5zaXplOyArK2kpIHsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLmt0eXBlKTsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLnZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNFVDoKKyAgICAgIHZhciBzZXRCZWdpbiA9IHRoaXMucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc2V0QmVnaW4uc2l6ZTsgKytpMikgeworICAgICAgICB0aGlzLnNraXAoc2V0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTElTVDoKKyAgICAgIHZhciBsaXN0QmVnaW4gPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkzID0gMDsgaTMgPCBsaXN0QmVnaW4uc2l6ZTsgKytpMykgeworICAgICAgICB0aGlzLnNraXAobGlzdEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgIEVycm9yKCJJbnZhbGlkIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1YzA2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7Cit2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJyk7Cit2YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7Cit2YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOworCit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKwordmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7CisKK3ZhciBDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uID0gZnVuY3Rpb24oc3RyZWFtLCBvcHRpb25zKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7CisKKyAgdGhpcy5zZXFJZDJTZXJ2aWNlID0ge307CisgIHRoaXMuY29ubmVjdGlvbiA9IHN0cmVhbTsKKyAgdGhpcy5zc2wgPSAoc3RyZWFtLmVuY3J5cHRlZCk7CisgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCBUQnVmZmVyZWRUcmFuc3BvcnQ7CisgIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgVEJpbmFyeVByb3RvY29sOworICB0aGlzLm9mZmxpbmVfcXVldWUgPSBbXTsKKyAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKKyAgdGhpcy5pbml0aWFsaXplX3JldHJ5X3ZhcnMoKTsKKworICB0aGlzLl9kZWJ1ZyA9IHRoaXMub3B0aW9ucy5kZWJ1ZyB8fCBmYWxzZTsKKyAgaWYgKHRoaXMub3B0aW9ucy5tYXhfYXR0ZW1wdHMgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMubWF4X2F0dGVtcHRzKSAmJgorICAgICAgdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0cyA+IDApIHsKKyAgICAgdGhpcy5tYXhfYXR0ZW1wdHMgPSArdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0czsKKyAgfQorICB0aGlzLnJldHJ5X21heF9kZWxheSA9IG51bGw7CisgIGlmICh0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5ICE9PSB1bmRlZmluZWQgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5KSAmJgorICAgICAgdGhpcy5vcHRpb25zLnJldHJ5X21heF9kZWxheSA+IDApIHsKKyAgICAgdGhpcy5yZXRyeV9tYXhfZGVsYXkgPSB0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5OworICB9CisgIHRoaXMuY29ubmVjdF90aW1lb3V0ID0gZmFsc2U7CisgIGlmICh0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0ICYmCisgICAgICAhaXNOYU4odGhpcy5vcHRpb25zLmNvbm5lY3RfdGltZW91dCkgJiYKKyAgICAgIHRoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQgPiAwKSB7CisgICAgIHRoaXMuY29ubmVjdF90aW1lb3V0ID0gK3RoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQ7CisgIH0KKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIodGhpcy5zc2wgPyAic2VjdXJlQ29ubmVjdCIgOiAiY29ubmVjdCIsIGZ1bmN0aW9uKCkgeworICAgIHNlbGYuY29ubmVjdGVkID0gdHJ1ZTsKKworICAgIHRoaXMuc2V0VGltZW91dChzZWxmLm9wdGlvbnMudGltZW91dCB8fCAwKTsKKyAgICB0aGlzLnNldE5vRGVsYXkoKTsKKyAgICB0aGlzLmZyYW1lTGVmdCA9IDA7CisgICAgdGhpcy5mcmFtZVBvcyA9IDA7CisgICAgdGhpcy5mcmFtZSA9IG51bGw7CisgICAgc2VsZi5pbml0aWFsaXplX3JldHJ5X3ZhcnMoKTsKKworICAgIHNlbGYub2ZmbGluZV9xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHNlbGYuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKKyAgICB9KTsKKworICAgIHNlbGYuZW1pdCgiY29ubmVjdCIpOworICB9KTsKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CisgICAgLy8gT25seSBlbWl0IHRoZSBlcnJvciBpZiBuby1vbmUgZWxzZSBpcyBsaXN0ZW5pbmcgb24gdGhlIGNvbm5lY3Rpb24KKyAgICAvLyBvciBpZiBzb21lb25lIGlzIGxpc3RlbmluZyBvbiB1cywgYmVjYXVzZSBOb2RlIHR1cm5zIHVuaGFuZGxlZAorICAgIC8vICdlcnJvcicgZXZlbnRzIGludG8gZXhjZXB0aW9ucy4KKyAgICBpZiAoc2VsZi5jb25uZWN0aW9uLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPT09IDEgfHwKKyAgICAgICAgc2VsZi5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoID4gMCkgeworICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CisgICAgfQorICB9KTsKKworICAvLyBBZGQgYSBjbG9zZSBsaXN0ZW5lcgorICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKSB7CisgICAgc2VsZi5jb25uZWN0aW9uX2dvbmUoKTsgLy8gaGFuZGxlIGNsb3NlIGV2ZW50LiB0cnkgdG8gcmVjb25uZWN0CisgIH0pOworCisgIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigidGltZW91dCIsIGZ1bmN0aW9uKCkgeworICAgIHNlbGYuZW1pdCgidGltZW91dCIpOworICB9KTsKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImRhdGEiLCBzZWxmLnRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7CisgICAgdmFyIG1lc3NhZ2UgPSBuZXcgc2VsZi5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIGhlYWRlciA9IG1lc3NhZ2UucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICAgIHZhciBjbGllbnQgPSBzZWxmLmNsaWVudDsKKyAgICAgICAgLy9UaGUgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgc3RvcmVzIGEgaGFzaCBvZiBzZXFpZCB0byBzZXJ2aWNlIG5hbWVzCisgICAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgICAvLyAgbG9va3VwIHRoZSBhcHByb3ByaWF0ZSBjbGllbnQgZm9yIHRoaXMgY2FsbC4KKyAgICAgICAgLy8gIFRoZSBjb25uZWN0aW9uLmNsaWVudCBvYmplY3QgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdAorICAgICAgICAvLyAgbXVsdGlwbGV4aW5nLCB3aGVuIHVzaW5nIG11bHRpcGxleGluZyBpdCBpcyBhIHNlcnZpY2UgbmFtZSBrZXllZAorICAgICAgICAvLyAgaGFzaCBvZiBjbGllbnQgb2JqZWN0cy4KKyAgICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAgIC8vICBjb25uZWN0aW9ucyBhbmQgY2xpZW50cyBpbiB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBhcmUgaXJyZWd1bGFyCisgICAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlCisgICAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgICAgLy8gIG9wZXJhdGlvbiBzb29uLgorICAgICAgICAvLyAgLS1yYQorICAgICAgICB2YXIgc2VydmljZV9uYW1lID0gc2VsZi5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgICBpZiAoc2VydmljZV9uYW1lKSB7CisgICAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRbc2VydmljZV9uYW1lXTsKKyAgICAgICAgfQorICAgICAgICAvKmpzaGludCAtVzA4MyAqLworICAgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKXsKKyAgICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisKKyAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICBpZiAoc2VydmljZV9uYW1lKSB7CisgICAgICAgICAgICBkZWxldGUgc2VsZi5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICAvKmpzaGludCArVzA4MyAqLworCisgICAgICAgIGlmKGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXSkgeworICAgICAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShtZXNzYWdlLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKKyAgICAgICAgICBzZWxmLmVtaXQoImVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBhIHJlc3BvbnNlIHRvIGFuIHVua25vd24gUlBDIGZ1bmN0aW9uIikpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7CisgICAgICB9CisgICAgfQorICB9KSk7Cit9OwordXRpbC5pbmhlcml0cyhDb25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOworCitDb25uZWN0aW9uLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5jb25uZWN0aW9uLmVuZCgpOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmNvbm5lY3Rpb24uZGVzdHJveSgpOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuaW5pdGlhbGl6ZV9yZXRyeV92YXJzID0gZnVuY3Rpb24gKCkgeworICB0aGlzLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgdGhpcy5yZXRyeV90b3RhbHRpbWUgPSAwOworICB0aGlzLnJldHJ5X2RlbGF5ID0gMTUwOworICB0aGlzLnJldHJ5X2JhY2tvZmYgPSAxLjc7CisgIHRoaXMuYXR0ZW1wdHMgPSAwOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7CisgIGlmICghdGhpcy5jb25uZWN0ZWQpIHsKKyAgICB0aGlzLm9mZmxpbmVfcXVldWUucHVzaChkYXRhKTsKKyAgICByZXR1cm47CisgIH0KKyAgdGhpcy5jb25uZWN0aW9uLndyaXRlKGRhdGEpOworfTsKKworQ29ubmVjdGlvbi5wcm90b3R5cGUuY29ubmVjdGlvbl9nb25lID0gZnVuY3Rpb24gKCkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7CisKKyAgLy8gSWYgYSByZXRyeSBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBqdXN0IGxldCB0aGF0IGhhcHBlbgorICBpZiAodGhpcy5yZXRyeV90aW1lcikgeworICAgIHJldHVybjsKKyAgfQorICAvLyBXZSBjYW5ub3QgcmVjb25uZWN0IGEgc2VjdXJlIHNvY2tldC4KKyAgaWYgKCF0aGlzLm1heF9hdHRlbXB0cyB8fCB0aGlzLnNzbCkgeworICAgIHNlbGYuZW1pdCgiY2xvc2UiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodGhpcy5yZXRyeV9tYXhfZGVsYXkgIT09IG51bGwgJiYgdGhpcy5yZXRyeV9kZWxheSA+PSB0aGlzLnJldHJ5X21heF9kZWxheSkgeworICAgIHRoaXMucmV0cnlfZGVsYXkgPSB0aGlzLnJldHJ5X21heF9kZWxheTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnJldHJ5X2RlbGF5ID0gTWF0aC5mbG9vcih0aGlzLnJldHJ5X2RlbGF5ICogdGhpcy5yZXRyeV9iYWNrb2ZmKTsKKyAgfQorCisgIGxvZy5kZWJ1ZygiUmV0cnkgY29ubmVjdGlvbiBpbiAiICsgdGhpcy5yZXRyeV9kZWxheSArICIgbXMiKTsKKworICBpZiAodGhpcy5tYXhfYXR0ZW1wdHMgJiYgdGhpcy5hdHRlbXB0cyA+PSB0aGlzLm1heF9hdHRlbXB0cykgeworICAgIHRoaXMucmV0cnlfdGltZXIgPSBudWxsOworICAgIGNvbnNvbGUuZXJyb3IoInRocmlmdDogQ291bGRuJ3QgZ2V0IHRocmlmdCBjb25uZWN0aW9uIGFmdGVyICIgKyB0aGlzLm1heF9hdHRlbXB0cyArICIgYXR0ZW1wdHMuIik7CisgICAgc2VsZi5lbWl0KCJjbG9zZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHRoaXMuYXR0ZW1wdHMgKz0gMTsKKyAgdGhpcy5lbWl0KCJyZWNvbm5lY3RpbmciLCB7CisgICAgZGVsYXk6IHNlbGYucmV0cnlfZGVsYXksCisgICAgYXR0ZW1wdDogc2VsZi5hdHRlbXB0cworICB9KTsKKworICB0aGlzLnJldHJ5X3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CisgICAgaWYgKHNlbGYuY29ubmVjdGlvbi5kZXN0cm95ZWQpIHsKKyAgICAgIHNlbGYucmV0cnlfdGltZXIgPSBudWxsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvZy5kZWJ1ZygiUmV0cnlpbmcgY29ubmVjdGlvbi4uLiIpOworCisgICAgc2VsZi5yZXRyeV90b3RhbHRpbWUgKz0gc2VsZi5yZXRyeV9kZWxheTsKKworICAgIGlmIChzZWxmLmNvbm5lY3RfdGltZW91dCAmJiBzZWxmLnJldHJ5X3RvdGFsdGltZSA+PSBzZWxmLmNvbm5lY3RfdGltZW91dCkgeworICAgICAgIHNlbGYucmV0cnlfdGltZXIgPSBudWxsOworICAgICAgIGNvbnNvbGUuZXJyb3IoInRocmlmdDogQ291bGRuJ3QgZ2V0IHRocmlmdCBjb25uZWN0aW9uIGFmdGVyICIgKyBzZWxmLnJldHJ5X3RvdGFsdGltZSArICJtcy4iKTsKKyAgICAgICBzZWxmLmVtaXQoImNsb3NlIik7CisgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzZWxmLnBhdGggIT09IHVuZGVmaW5lZCkgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wb3J0LCBzZWxmLmhvc3QpOworICAgIH0KKyAgICBzZWxmLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgfSwgdGhpcy5yZXRyeV9kZWxheSk7Cit9OworCitleHBvcnRzLmNyZWF0ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHZhciBzdHJlYW0gPSBuZXQuY3JlYXRlQ29ubmVjdGlvbihwb3J0LCBob3N0KTsKKyAgdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihzdHJlYW0sIG9wdGlvbnMpOworICBjb25uZWN0aW9uLmhvc3QgPSBob3N0OworICBjb25uZWN0aW9uLnBvcnQgPSBwb3J0OworCisgIHJldHVybiBjb25uZWN0aW9uOworfTsKKworZXhwb3J0cy5jcmVhdGVVRFNDb25uZWN0aW9uID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykgeworICB2YXIgc3RyZWFtID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24ocGF0aCk7CisgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oc3RyZWFtLCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5wYXRoID0gcGF0aDsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK307CisKK2V4cG9ydHMuY3JlYXRlU1NMQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKKyAgaWYgKCEoJ3NlY3VyZVByb3RvY29sJyBpbiBvcHRpb25zKSAmJiAhKCdzZWN1cmVPcHRpb25zJyBpbiBvcHRpb25zKSkgeworICAgIG9wdGlvbnMuc2VjdXJlUHJvdG9jb2wgPSAiU1NMdjIzX21ldGhvZCI7CisgICAgb3B0aW9ucy5zZWN1cmVPcHRpb25zID0gY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MiB8IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjM7CisgIH0KKworICB2YXIgc3RyZWFtID0gdGxzLmNvbm5lY3QocG9ydCwgaG9zdCwgb3B0aW9ucyk7CisgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oc3RyZWFtLCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5ob3N0ID0gaG9zdDsKKyAgY29ubmVjdGlvbi5wb3J0ID0gcG9ydDsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK307CisKKworZXhwb3J0cy5jcmVhdGVDbGllbnQgPSBjcmVhdGVDbGllbnQ7CisKK3ZhciBjaGlsZF9wcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpOwordmFyIFN0ZElPQ29ubmVjdGlvbiA9IGV4cG9ydHMuU3RkSU9Db25uZWN0aW9uID0gZnVuY3Rpb24oY29tbWFuZCwgb3B0aW9ucykgeworICB2YXIgY29tbWFuZF9wYXJ0cyA9IGNvbW1hbmQuc3BsaXQoJyAnKTsKKyAgY29tbWFuZCA9IGNvbW1hbmRfcGFydHNbMF07CisgIHZhciBhcmdzID0gY29tbWFuZF9wYXJ0cy5zcGxpY2UoMSxjb21tYW5kX3BhcnRzLmxlbmd0aCAtMSk7CisgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsYXJncyk7CisKKyAgdmFyIHNlbGYgPSB0aGlzOworICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKKworICB0aGlzLmNvbm5lY3Rpb24gPSBjaGlsZC5zdGRpbjsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CisgIHRoaXMub2ZmbGluZV9xdWV1ZSA9IFtdOworCisgIGlmIChsb2cuZ2V0TG9nTGV2ZWwoKSA9PT0gJ2RlYnVnJykgeworICAgIHRoaXMuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGVycikgeworICAgICAgbG9nLmRlYnVnKGVyci50b1N0cmluZygpLCAnQ0hJTEQgRVJST1InKTsKKyAgICB9KTsKKworICAgIHRoaXMuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSxzaWduYWwpIHsKKyAgICAgIGxvZy5kZWJ1Zyhjb2RlICsgJzonICsgc2lnbmFsLCAnQ0hJTEQgRVhJVEVEJyk7CisgICAgfSk7CisgIH0KKworICB0aGlzLmZyYW1lTGVmdCA9IDA7CisgIHRoaXMuZnJhbWVQb3MgPSAwOworICB0aGlzLmZyYW1lID0gbnVsbDsKKyAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlOworCisgIHNlbGYub2ZmbGluZV9xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHNlbGYuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKKyAgfSk7CisKKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7CisgICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CisgIH0pOworCisgIC8vIEFkZCBhIGNsb3NlIGxpc3RlbmVyCisgIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigiY2xvc2UiLCBmdW5jdGlvbigpIHsKKyAgICBzZWxmLmVtaXQoImNsb3NlIik7CisgIH0pOworCisgIGNoaWxkLnN0ZG91dC5hZGRMaXN0ZW5lcigiZGF0YSIsIHNlbGYudHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgICB2YXIgbWVzc2FnZSA9IG5ldyBzZWxmLnByb3RvY29sKHRyYW5zcG9ydF93aXRoX2RhdGEpOworICAgIHRyeSB7CisgICAgICB2YXIgaGVhZGVyID0gbWVzc2FnZS5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICB2YXIgY2xpZW50ID0gc2VsZi5jbGllbnQ7CisgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKXsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworCisgICAgICAgIHZhciBjYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAgY2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShtZXNzYWdlLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICB9CisgICAgY2F0Y2ggKGUpIHsKKyAgICAgIGlmIChlIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9CisgICAgfQorICB9KSk7Cit9OworCit1dGlsLmluaGVyaXRzKFN0ZElPQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworU3RkSU9Db25uZWN0aW9uLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5jb25uZWN0aW9uLmVuZCgpOworfTsKKworU3RkSU9Db25uZWN0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgaWYgKCF0aGlzLmNvbm5lY3RlZCkgeworICAgIHRoaXMub2ZmbGluZV9xdWV1ZS5wdXNoKGRhdGEpOworICAgIHJldHVybjsKKyAgfQorICB0aGlzLmNvbm5lY3Rpb24ud3JpdGUoZGF0YSk7Cit9OworCitleHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGNvbW1hbmQsb3B0aW9ucyl7CisgIHJldHVybiBuZXcgU3RkSU9Db25uZWN0aW9uKGNvbW1hbmQsb3B0aW9ucyk7Cit9OworCitleHBvcnRzLmNyZWF0ZVN0ZElPQ2xpZW50ID0gY3JlYXRlQ2xpZW50OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NyZWF0ZV9jbGllbnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY3JlYXRlX2NsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI3N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NyZWF0ZV9jbGllbnQuanMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNsaWVudDsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IGNsaWVudCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgVGhyaWZ0IHNlcnZpY2UuCisgKiBAcGFyYW0ge29iamVjdH0gU2VydmljZUNsaWVudCAtIFRoZSBtb2R1bGUgY29udGFpbmluZyB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UgY2xpZW50CisgKiBAcGFyYW0ge0Nvbm5lY3Rpb259IENvbm5lY3Rpb24gLSBUaGUgY29ubmVjdGlvbiB0byB1c2UuCisgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgY2xpZW50IG9iamVjdC4KKyAqLworZnVuY3Rpb24gY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQsIGNvbm5lY3Rpb24pIHsKKyAgLy8gVE9ETyB2YWxpZGF0ZSByZXF1aXJlZCBvcHRpb25zIGFuZCB0aHJvdyBvdGhlcndpc2UKKyAgaWYgKFNlcnZpY2VDbGllbnQuQ2xpZW50KSB7CisgICAgU2VydmljZUNsaWVudCA9IFNlcnZpY2VDbGllbnQuQ2xpZW50OworICB9CisgIC8vIFRPRE8gZGV0YW5nbGUgdGhlc2UgaW5pdGlhbGl6YXRpb24gY2FsbHMKKyAgLy8gY3JlYXRpbmcgImNsaWVudCIgcmVxdWlyZXMKKyAgLy8gICAtIG5ldyBzZXJ2aWNlIGNsaWVudCBpbnN0YW5jZQorICAvLworICAvLyBOZXcgc2VydmljZSBjbGllbnQgaW5zdGFuY2UgcmVxdWlyZXMKKyAgLy8gICAtIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UKKyAgLy8gICAtIHByb3RvY29sIGNsYXNzIHJlZmVyZW5jZQorICAvLworICAvLyBOZXcgdHJhbnNwb3J0IGluc3RhbmNlIHJlcXVpcmVzCisgIC8vICAgLSBCdWZmZXIgdG8gdXNlIChvciBub25lKQorICAvLyAgIC0gQ2FsbGJhY2sgdG8gY2FsbCBvbiBmbHVzaAorCisgIC8vIFdyYXAgdGhlIHdyaXRlIG1ldGhvZAorICB2YXIgd3JpdGVDYiA9IGZ1bmN0aW9uKGJ1Ziwgc2VxaWQpIHsKKyAgICBjb25uZWN0aW9uLndyaXRlKGJ1Ziwgc2VxaWQpOworICB9OworICB2YXIgdHJhbnNwb3J0ID0gbmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgd3JpdGVDYik7CisgIHZhciBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCh0cmFuc3BvcnQsIGNvbm5lY3Rpb24ucHJvdG9jb2wpOworICB0cmFuc3BvcnQuY2xpZW50ID0gY2xpZW50OworICBjb25uZWN0aW9uLmNsaWVudCA9IGNsaWVudDsKKyAgcmV0dXJuIGNsaWVudDsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDc5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgYmluYXJ5ID0gcmVxdWlyZSgnLi9iaW5hcnknKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCittb2R1bGUuZXhwb3J0cyA9IFRGcmFtZWRUcmFuc3BvcnQ7CisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnQoYnVmZmVyLCBjYWxsYmFjaykgeworICB0aGlzLmluQnVmID0gYnVmZmVyIHx8IG5ldyBCdWZmZXIoMCk7CisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKKyAgdGhpcy5yZWFkUG9zID0gMDsKKyAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnJlY2VpdmVyID0gZnVuY3Rpb24oY2FsbGJhY2ssIHNlcWlkKSB7CisgIHZhciByZXNpZHVhbCA9IG51bGw7CisKKyAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAvLyBQcmVwZW5kIGFueSByZXNpZHVhbCBkYXRhIGZyb20gb3VyIHByZXZpb3VzIHJlYWQKKyAgICBpZiAocmVzaWR1YWwpIHsKKyAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtyZXNpZHVhbCwgZGF0YV0pOworICAgICAgcmVzaWR1YWwgPSBudWxsOworICAgIH0KKworICAgIC8vIGZyYW1lZCB0cmFuc3BvcnQKKyAgICB3aGlsZSAoZGF0YS5sZW5ndGgpIHsKKyAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDQpIHsKKyAgICAgICAgLy8gTm90IGVub3VnaCBieXRlcyB0byBjb250aW51ZSwgc2F2ZSBhbmQgcmVzdW1lIG9uIG5leHQgcGFja2V0CisgICAgICAgIHJlc2lkdWFsID0gZGF0YTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgdmFyIGZyYW1lU2l6ZSA9IGJpbmFyeS5yZWFkSTMyKGRhdGEsIDApOworICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgNCArIGZyYW1lU2l6ZSkgeworICAgICAgICAvLyBOb3QgZW5vdWdoIGJ5dGVzIHRvIGNvbnRpbnVlLCBzYXZlIGFuZCByZXN1bWUgb24gbmV4dCBwYWNrZXQKKyAgICAgICAgcmVzaWR1YWwgPSBkYXRhOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhciBmcmFtZSA9IGRhdGEuc2xpY2UoNCwgNCArIGZyYW1lU2l6ZSk7CisgICAgICByZXNpZHVhbCA9IGRhdGEuc2xpY2UoNCArIGZyYW1lU2l6ZSk7CisKKyAgICAgIGNhbGxiYWNrKG5ldyBURnJhbWVkVHJhbnNwb3J0KGZyYW1lKSwgc2VxaWQpOworCisgICAgICBkYXRhID0gcmVzaWR1YWw7CisgICAgICByZXNpZHVhbCA9IG51bGw7CisgICAgfQorICB9OworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuY29tbWl0UG9zaXRpb24gPSBmdW5jdGlvbigpe30sCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yb2xsYmFja1Bvc2l0aW9uID0gZnVuY3Rpb24oKXt9LAorCisgIC8vIFRPRE86IEltcGxlbWVudCBvcGVuL2Nsb3NlIHN1cHBvcnQKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7fTsKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gIGZ1bmN0aW9uKCkge307CisKKyAgLy8gU2V0IHRoZSBzZXFpZCBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgY2xpZW50CisgIC8vIFNvIHRoYXQgY2FsbGJhY2tzIGNhbiBiZSBmb3VuZAorVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuc2V0Q3VyclNlcUlkID0gZnVuY3Rpb24oc2VxaWQpIHsKKyAgdGhpcy5fc2VxaWQgPSBzZXFpZDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmVuc3VyZUF2YWlsYWJsZSA9IGZ1bmN0aW9uKGxlbikgeworICBpZiAodGhpcy5yZWFkUG9zICsgbGVuID4gdGhpcy5pbkJ1Zi5sZW5ndGgpIHsKKyAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7CisgIH0KK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsgLy8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggZnJhbWVzLgorICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgZW5kID0gdGhpcy5yZWFkUG9zICsgbGVuOworCisgIGlmICh0aGlzLmluQnVmLmxlbmd0aCA8IGVuZCkgeworICAgIHRocm93IG5ldyBFcnJvcigncmVhZCgnICsgbGVuICsgJykgZmFpbGVkIC0gbm90IGVub3VnaCBkYXRhJyk7CisgIH0KKworICB2YXIgYnVmID0gdGhpcy5pbkJ1Zi5zbGljZSh0aGlzLnJlYWRQb3MsIGVuZCk7CisgIHRoaXMucmVhZFBvcyA9IGVuZDsKKyAgcmV0dXJuIGJ1ZjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDEpOworICByZXR1cm4gYmluYXJ5LnJlYWRCeXRlKHRoaXMuaW5CdWZbdGhpcy5yZWFkUG9zKytdKTsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMik7CisgIHZhciBpMTYgPSBiaW5hcnkucmVhZEkxNih0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOworICB0aGlzLnJlYWRQb3MgKz0gMjsKKyAgcmV0dXJuIGkxNjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoNCk7CisgIHZhciBpMzIgPSBiaW5hcnkucmVhZEkzMih0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOworICB0aGlzLnJlYWRQb3MgKz0gNDsKKyAgcmV0dXJuIGkzMjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoOCk7CisgIHZhciBkID0gYmluYXJ5LnJlYWREb3VibGUodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkUG9zKTsKKyAgdGhpcy5yZWFkUG9zICs9IDg7CisgIHJldHVybiBkOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKGxlbikgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZShsZW4pOworICB2YXIgc3RyID0gdGhpcy5pbkJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucmVhZFBvcywgdGhpcy5yZWFkUG9zICsgbGVuKTsKKyAgdGhpcy5yZWFkUG9zICs9IGxlbjsKKyAgcmV0dXJuIHN0cjsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmJvcnJvdyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4geworICAgIGJ1ZjogdGhpcy5pbkJ1ZiwKKyAgICByZWFkSW5kZXg6IHRoaXMucmVhZFBvcywKKyAgICB3cml0ZUluZGV4OiB0aGlzLmluQnVmLmxlbmd0aAorICB9OworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uKGJ5dGVzQ29uc3VtZWQpIHsKKyAgdGhpcy5yZWFkUG9zICs9IGJ5dGVzQ29uc3VtZWQ7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZiwgZW5jb2RpbmcpIHsKKyAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgeworICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCBlbmNvZGluZyB8fCAndXRmOCcpOworICB9CisgIHRoaXMub3V0QnVmZmVycy5wdXNoKGJ1Zik7CisgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIC8vIElmIHRoZSBzZXFpZCBvZiB0aGUgY2FsbGJhY2sgaXMgYXZhaWxhYmxlIHBhc3MgaXQgdG8gdGhlIG9uRmx1c2gKKyAgLy8gVGhlbiByZW1vdmUgdGhlIGN1cnJlbnQgc2VxaWQKKyAgdmFyIHNlcWlkID0gdGhpcy5fc2VxaWQ7CisgIHRoaXMuX3NlcWlkID0gbnVsbDsKKworICB2YXIgb3V0ID0gbmV3IEJ1ZmZlcih0aGlzLm91dENvdW50KSwKKyAgICAgIHBvcyA9IDA7CisgIHRoaXMub3V0QnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uKGJ1ZikgeworICAgIGJ1Zi5jb3B5KG91dCwgcG9zLCAwKTsKKyAgICBwb3MgKz0gYnVmLmxlbmd0aDsKKyAgfSk7CisKKyAgaWYgKHRoaXMub25GbHVzaCkgeworICAgIC8vIFRPRE86IG9wdGltaXplIHRoaXMgYmV0dGVyLCBhbGxvY2F0ZSBvbmUgYnVmZmVyIGluc3RlYWQgb2YgYm90aDoKKyAgICB2YXIgbXNnID0gbmV3IEJ1ZmZlcihvdXQubGVuZ3RoICsgNCk7CisgICAgYmluYXJ5LndyaXRlSTMyKG1zZywgb3V0Lmxlbmd0aCk7CisgICAgb3V0LmNvcHkobXNnLCA0LCAwLCBvdXQubGVuZ3RoKTsKKyAgICBpZiAodGhpcy5vbkZsdXNoKSB7CisgICAgICAvLyBQYXNzaW5nIHNlcWlkIHRocm91Z2ggdGhpcyBjYWxsIHRvIGdldCBpdCB0byB0aGUgY29ubmVjdGlvbgorICAgICAgdGhpcy5vbkZsdXNoKG1zZywgc2VxaWQpOworICAgIH0KKyAgfQorCisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJhYjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Cit2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTsKK3ZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7Cit2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyOwordmFyIHRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKwordmFyIGNyZWF0ZUNsaWVudCA9IHJlcXVpcmUoJy4vY3JlYXRlX2NsaWVudCcpOworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQ29ubmVjdE9wdGlvbnMKKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmFuc3BvcnQgLSBUaGUgVGhyaWZ0IGxheWVyZWQgdHJhbnNwb3J0IHRvIHVzZSAoVEJ1ZmZlcmVkVHJhbnNwb3J0LCBldGMpLgorICogQHByb3BlcnR5IHtzdHJpbmd9IHByb3RvY29sIC0gVGhlIFRocmlmdCBzZXJpYWxpemF0aW9uIHByb3RvY29sIHRvIHVzZSAoVEJpbmFyeVByb3RvY29sLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVGhlIFVSTCBwYXRoIHRvIFBPU1QgdG8gKGUuZy4gIi8iLCAiL215U3ZjIiwgIi90aHJpZnQvcXVvdGVTdmMiLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQSBzdGFuZGFyZCBOb2RlLmpzIGhlYWRlciBoYXNoLCBhbiBvYmplY3QgaGFzaCBjb250YWluaW5nIGtleS92YWx1ZQorICogICAgICAgIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGhlYWRlciBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBoZWFkZXIgdmFsdWUgc3RyaW5nLgorICogQHByb3BlcnR5IHtib29sZWFufSBodHRwcyAtIFRydWUgY2F1c2VzIHRoZSBjb25uZWN0aW9uIHRvIHVzZSBodHRwcywgb3RoZXJ3aXNlIGh0dHAgaXMgdXNlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBub2RlT3B0aW9ucyAtIE9wdGlvbnMgcGFzc2VkIG9uIHRvIG5vZGUuCisgKiBAZXhhbXBsZQorICogICAgIC8vVXNlIGEgY29ubmVjdGlvbiB0aGF0IHJlcXVpcmVzIHNzbC90bHMsIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhZnRlciBlYWNoIHJlcXVlc3QsCisgKiAgICAgLy8gIHVzZXMgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydCBsYXllciwgdXNlcyB0aGUgSlNPTiBwcm90b2NvbCBhbmQgZGlyZWN0cyBSUEMgdHJhZmZpYworICogICAgIC8vICB0byBodHRwczovL3RocmlmdC5leGFtcGxlLmNvbTo5MDkwL2hlbGxvCisgKiAgICAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworICogICAgIHZhciBvcHRpb25zID0geworICogICAgICAgIHRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAqICAgICAgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgKiAgICAgICAgcGF0aDogIi9oZWxsbyIsCisgKiAgICAgICAgaGVhZGVyczogeyJDb25uZWN0aW9uIjogImNsb3NlIn0sCisgKiAgICAgICAgaHR0cHM6IHRydWUKKyAqICAgICB9OworICogICAgIHZhciBjb24gPSB0aHJpZnQuY3JlYXRlSHR0cENvbm5lY3Rpb24oInRocmlmdC5leGFtcGxlLmNvbSIsIDkwOTAsIG9wdGlvbnMpOworICogICAgIHZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlSHR0cENsaWVudChteVNlcnZpY2UsIGNvbm5lY3Rpb24pOworICogICAgIGNsaWVudC5teVNlcnZpY2VGdW5jdGlvbigpOworICovCisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSHR0cENvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVIdHRwQ29ubmVjdGlvbigpIHJhdGhlciB0aGFuCisgKiAgICBpbnN0YW50aWF0aW5nIGRpcmVjdGx5KS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgYXJlIHJldGhyb3duCisgKiBAZXZlbnQge2Vycm9yfSBUaGUgImVycm9yIiBldmVudCBpcyBmaXJlZCB3aGVuIGEgTm9kZS5qcyBlcnJvciBldmVudCBvY2N1cnMgZHVyaW5nCisgKiAgICAgcmVxdWVzdCBvciByZXNwb25zZSBwcm9jZXNzaW5nLCBpbiB3aGljaCBjYXNlIHRoZSBub2RlIGVycm9yIGlzIHBhc3NlZCBvbi4gQW4gImVycm9yIgorICogICAgIGV2ZW50IG1heSBhbHNvIGJlIGZpcmVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQorICogICAgIGFwcHJvcHJpYXRlIGNsaWVudCAoYW4gaW50ZXJuYWwgZXJyb3IpLCBnZW5lcmF0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICogQGNsYXNzZGVzYyBIdHRwQ29ubmVjdGlvbiBvYmplY3RzIHByb3ZpZGUgVGhyaWZ0IGVuZCBwb2ludCB0cmFuc3BvcnQKKyAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgb3ZlciB0aGUgTm9kZS5qcyBodHRwLnJlcXVlc3QoKSBtZXRob2QuCisgKiBAc2VlIHtAbGluayBjcmVhdGVIdHRwQ29ubmVjdGlvbn0KKyAqLwordmFyIEh0dHBDb25uZWN0aW9uID0gZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgLy9Jbml0aWFsaXplIHRoZSBlbWl0dGVyIGJhc2Ugb2JqZWN0CisgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOworCisgIC8vU2V0IGNvbmZpZ3VyYXRpb24KKyAgdmFyIHNlbGYgPSB0aGlzOworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICB0aGlzLmhvc3QgPSB0aGlzLm9wdGlvbnMuaG9zdDsKKyAgdGhpcy5wb3J0ID0gdGhpcy5vcHRpb25zLnBvcnQ7CisgIHRoaXMuc29ja2V0UGF0aCA9IHRoaXMub3B0aW9ucy5zb2NrZXRQYXRoOworICB0aGlzLmh0dHBzID0gdGhpcy5vcHRpb25zLmh0dHBzIHx8IGZhbHNlOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRCaW5hcnlQcm90b2NvbDsKKworICAvL1ByZXBhcmUgTm9kZS5qcyBvcHRpb25zCisgIHRoaXMubm9kZU9wdGlvbnMgPSB7CisgICAgaG9zdDogdGhpcy5ob3N0LAorICAgIHBvcnQ6IHRoaXMucG9ydCwKKyAgICBzb2NrZXRQYXRoOiB0aGlzLnNvY2tldFBhdGgsCisgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgJy8nLAorICAgIG1ldGhvZDogJ1BPU1QnLAorICAgIGhlYWRlcnM6IHRoaXMub3B0aW9ucy5oZWFkZXJzIHx8IHt9LAorICAgIHJlc3BvbnNlVHlwZTogdGhpcy5vcHRpb25zLnJlc3BvbnNlVHlwZSB8fCBudWxsCisgIH07CisgIGZvciAodmFyIGF0dHJuYW1lIGluIHRoaXMub3B0aW9ucy5ub2RlT3B0aW9ucykgeworICAgIHRoaXMubm9kZU9wdGlvbnNbYXR0cm5hbWVdID0gdGhpcy5vcHRpb25zLm5vZGVPcHRpb25zW2F0dHJuYW1lXTsKKyAgfQorICAvKmpzaGludCAtVzA2OSAqLworICBpZiAoISB0aGlzLm5vZGVPcHRpb25zLmhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSkgeworICAgIHRoaXMubm9kZU9wdGlvbnMuaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ2tlZXAtYWxpdmUnOworICB9CisgIC8qanNoaW50ICtXMDY5ICovCisKKyAgLy9UaGUgc2VxdWVuY2UgbWFwIGlzIHVzZWQgdG8gbWFwIHNlcUlEcyBiYWNrIHRvIHRoZQorICAvLyAgY2FsbGluZyBjbGllbnQgaW4gbXVsdGlwbGV4ZWQgc2NlbmFyaW9zCisgIHRoaXMuc2VxSWQyU2VydmljZSA9IHt9OworCisgIGZ1bmN0aW9uIGRlY29kZUNhbGxiYWNrKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgICB2YXIgcHJvdG8gPSBuZXcgc2VsZi5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgICB0cnkgeworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIGhlYWRlciA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgICB2YXIgY2xpZW50ID0gc2VsZi5jbGllbnQ7CisgICAgICAgIC8vVGhlIE11bHRpcGxleGVkIFByb3RvY29sIHN0b3JlcyBhIGhhc2ggb2Ygc2VxaWQgdG8gc2VydmljZSBuYW1lcworICAgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KKyAgICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAgIC8vICBUaGUgY2xpZW50IHZhciBpcyBhIHNpbmdsZSBjbGllbnQgb2JqZWN0IHdoZW4gbm90IG11bHRpcGxleGluZywKKyAgICAgICAgLy8gIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIGhhc2ggb2YgY2xpZW50CisgICAgICAgIC8vICBvYmplY3RzLgorICAgICAgICAvL05PVEU6IFRoZSAyIHdheSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHByb3RvY29scywgdHJhbnNwb3J0cywKKyAgICAgICAgLy8gIGNvbm5lY3Rpb25zIGFuZCBjbGllbnRzIGluIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGFyZSBpcnJlZ3VsYXIKKyAgICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgICAgLy8gIHNob3VsZCBicmluZyB0aGlzIHN0dWZmIGlubGluZSB3aXRoIHR5cGljYWwgdGhyaWZ0IEkvTyBzdGFjaworICAgICAgICAvLyAgb3BlcmF0aW9uIHNvb24uCisgICAgICAgIC8vICAtLXJhCisgICAgICAgIHZhciBzZXJ2aWNlX25hbWUgPSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgICBjbGllbnQgPSBzZWxmLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICAgIGRlbGV0ZSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIH0KKyAgICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CisgICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgLypqc2hpbnQgK1cwODMgKi8KKyAgICAgICAgaWYoY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKSB7CisgICAgICAgICAgY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKHByb3RvLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKKyAgICAgICAgICBzZWxmLmVtaXQoImVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBjYXRjaCAoZSkgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKworICAvL1Jlc3BvbnNlIGhhbmRsZXIKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgdGhpcy5yZXNwb25zZUNhbGxiYWNrID0gZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICB2YXIgZGF0YSA9IFtdOworICAgIHZhciBkYXRhTGVuID0gMDsKKworICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHsKKyAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLCBuZXcgVEhUVFBFeGNlcHRpb24ocmVzcG9uc2UpKTsKKyAgICB9CisKKyAgICByZXNwb25zZS5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkgeworICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGUpOworICAgIH0pOworCisgICAgLy8gV2hlbiBydW5uaW5nIGRpcmVjdGx5IHVuZGVyIG5vZGUsIGNodW5rIHdpbGwgYmUgYSBidWZmZXIsCisgICAgLy8gaG93ZXZlciwgd2hlbiBydW5uaW5nIGluIGEgQnJvd3NlciAoZS5nLiBCcm93c2VyaWZ5KSwgY2h1bmsKKyAgICAvLyB3aWxsIGJlIGEgc3RyaW5nIG9yIGFuIEFycmF5QnVmZmVyLgorICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7CisgICAgICBpZiAoKHR5cGVvZiBjaHVuayA9PSAnc3RyaW5nJykgfHwKKyAgICAgICAgICAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNodW5rKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpKSB7CisgICAgICAgIC8vIFdyYXAgQXJyYXlCdWZmZXIvc3RyaW5nIGluIGEgQnVmZmVyIHNvIGRhdGFbaV0uY29weSB3aWxsIHdvcmsKKyAgICAgICAgZGF0YS5wdXNoKG5ldyBCdWZmZXIoY2h1bmspKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEucHVzaChjaHVuayk7CisgICAgICB9CisgICAgICBkYXRhTGVuICs9IGNodW5rLmxlbmd0aDsKKyAgICB9KTsKKworICAgIHJlc3BvbnNlLm9uKCdlbmQnLCBmdW5jdGlvbigpeworICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoZGF0YUxlbik7CisgICAgICBmb3IgKHZhciBpPTAsIGxlbj1kYXRhLmxlbmd0aCwgcG9zPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXS5jb3B5KGJ1ZiwgcG9zKTsKKyAgICAgICAgcG9zICs9IGRhdGFbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgLy9HZXQgdGhlIHJlY2VpdmVyIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNwb3J0IGFuZAorICAgICAgLy8gIGNhbGwgaXQgd2l0aCB0aGUgYnVmZmVyCisgICAgICBzZWxmLnRyYW5zcG9ydC5yZWNlaXZlcihkZWNvZGVDYWxsYmFjaykoYnVmKTsKKyAgICB9KTsKKyAgfTsKK307Cit1dGlsLmluaGVyaXRzKEh0dHBDb25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOworCisvKioKKyAqIFdyaXRlcyBUaHJpZnQgbWVzc2FnZSBkYXRhIHRvIHRoZSBjb25uZWN0aW9uCisgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIEEgTm9kZS5qcyBCdWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byB3cml0ZQorICogQHJldHVybnMge3ZvaWR9IE5vIHJldHVybiB2YWx1ZS4KKyAqIEBldmVudCB7ZXJyb3J9IHRoZSAiZXJyb3IiIGV2ZW50IGlzIHJhaXNlZCB1cG9uIHJlcXVlc3QgZmFpbHVyZSBwYXNzaW5nIHRoZQorICogICAgIE5vZGUuanMgZXJyb3Igb2JqZWN0IHRvIHRoZSBsaXN0ZW5lci4KKyAqLworSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHZhciBvcHRzID0gc2VsZi5ub2RlT3B0aW9uczsKKyAgb3B0cy5oZWFkZXJzWyJDb250ZW50LWxlbmd0aCJdID0gZGF0YS5sZW5ndGg7CisgIGlmICghb3B0cy5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSkKKyAgICBvcHRzLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsgIAorICB2YXIgcmVxID0gKHNlbGYuaHR0cHMpID8KKyAgICAgIGh0dHBzLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKSA6CisgICAgICBodHRwLnJlcXVlc3Qob3B0cywgc2VsZi5yZXNwb25zZUNhbGxiYWNrKTsKKyAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICAgIHNlbGYuZW1pdCgiZXJyb3IiLCBlcnIpOworICB9KTsKKyAgcmVxLndyaXRlKGRhdGEpOworICByZXEuZW5kKCk7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgSHR0cENvbm5lY3Rpb24gb2JqZWN0LCB1c2VkIGJ5IFRocmlmdCBjbGllbnRzIHRvIGNvbm5lY3QKKyAqICAgIHRvIFRocmlmdCBIVFRQIGJhc2VkIHNlcnZlcnMuCisgKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IG5hbWUgb3IgSVAgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gVGhlIFRDUCBwb3J0IHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge0Nvbm5lY3RPcHRpb25zfSBvcHRpb25zIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UuCisgKiBAcmV0dXJucyB7SHR0cENvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIENvbm5lY3RPcHRpb25zfQorICovCitleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICBvcHRpb25zLmhvc3QgPSBob3N0OworICBvcHRpb25zLnBvcnQgPSBwb3J0IHx8IDgwOworICByZXR1cm4gbmV3IEh0dHBDb25uZWN0aW9uKG9wdGlvbnMpOworfTsKKworZXhwb3J0cy5jcmVhdGVIdHRwVURTQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKKyAgb3B0aW9ucy5zb2NrZXRQYXRoID0gcGF0aDsKKyAgcmV0dXJuIG5ldyBIdHRwQ29ubmVjdGlvbihvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlSHR0cENsaWVudCA9IGNyZWF0ZUNsaWVudAorCisKK2Z1bmN0aW9uIFRIVFRQRXhjZXB0aW9uKHJlc3BvbnNlKSB7CisgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTsKKyAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICB0aGlzLnR5cGUgPSB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5QUk9UT0NPTF9FUlJPUjsKKyAgdGhpcy5tZXNzYWdlID0gIlJlY2VpdmVkIGEgcmVzcG9uc2Ugd2l0aCBhIGJhZCBIVFRQIHN0YXR1cyBjb2RlOiAiICsgcmVzcG9uc2Uuc3RhdHVzQ29kZTsKK30KK3V0aWwuaW5oZXJpdHMoVEhUVFBFeGNlcHRpb24sIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTk1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworZXhwb3J0cy5UaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK2V4cG9ydHMuc2V0TG9nRnVuYyA9IGxvZy5zZXRMb2dGdW5jOworZXhwb3J0cy5zZXRMb2dMZXZlbCA9IGxvZy5zZXRMb2dMZXZlbDsKK2V4cG9ydHMuZ2V0TG9nTGV2ZWwgPSBsb2cuZ2V0TG9nTGV2ZWw7CisKK3ZhciBjb25uZWN0aW9uID0gcmVxdWlyZSgnLi9jb25uZWN0aW9uJyk7CitleHBvcnRzLkNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLkNvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUNsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlQ2xpZW50OworZXhwb3J0cy5jcmVhdGVDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVVRFNDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVVRFNDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVTU0xDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVTU0xDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVTdGRJT0NsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9DbGllbnQ7CitleHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9Db25uZWN0aW9uOworCit2YXIgaHR0cENvbm5lY3Rpb24gPSByZXF1aXJlKCcuL2h0dHBfY29ubmVjdGlvbicpOworZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGh0dHBDb25uZWN0aW9uLkh0dHBDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVIdHRwQ29ubmVjdGlvbiA9IGh0dHBDb25uZWN0aW9uLmNyZWF0ZUh0dHBDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVIdHRwVURTQ29ubmVjdGlvbiA9IGh0dHBDb25uZWN0aW9uLmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVIdHRwQ2xpZW50ID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cENsaWVudDsKKwordmFyIHdzQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vd3NfY29ubmVjdGlvbicpOworZXhwb3J0cy5XU0Nvbm5lY3Rpb24gPSB3c0Nvbm5lY3Rpb24uV1NDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVXU0Nvbm5lY3Rpb24gPSB3c0Nvbm5lY3Rpb24uY3JlYXRlV1NDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVXU0NsaWVudCA9IHdzQ29ubmVjdGlvbi5jcmVhdGVXU0NsaWVudDsKKwordmFyIHhockNvbm5lY3Rpb24gPSByZXF1aXJlKCcuL3hocl9jb25uZWN0aW9uJyk7CitleHBvcnRzLlhIUkNvbm5lY3Rpb24gPSB4aHJDb25uZWN0aW9uLlhIUkNvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVhIUkNvbm5lY3Rpb24gPSB4aHJDb25uZWN0aW9uLmNyZWF0ZVhIUkNvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVhIUkNsaWVudCA9IHhockNvbm5lY3Rpb24uY3JlYXRlWEhSQ2xpZW50OworCit2YXIgc2VydmVyID0gcmVxdWlyZSgnLi9zZXJ2ZXInKTsKK2V4cG9ydHMuY3JlYXRlU2VydmVyID0gc2VydmVyLmNyZWF0ZVNlcnZlcjsKK2V4cG9ydHMuY3JlYXRlTXVsdGlwbGV4U2VydmVyID0gc2VydmVyLmNyZWF0ZU11bHRpcGxleFNlcnZlcjsKKwordmFyIHdlYl9zZXJ2ZXIgPSByZXF1aXJlKCcuL3dlYl9zZXJ2ZXInKTsKK2V4cG9ydHMuY3JlYXRlV2ViU2VydmVyID0gd2ViX3NlcnZlci5jcmVhdGVXZWJTZXJ2ZXI7CisKK2V4cG9ydHMuSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7CitleHBvcnRzLlEgPSByZXF1aXJlKCdxJyk7CisKK3ZhciBtcHJvY2Vzc29yID0gcmVxdWlyZSgnLi9tdWx0aXBsZXhlZF9wcm9jZXNzb3InKTsKK3ZhciBtcHJvdG9jb2wgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb3RvY29sJyk7CitleHBvcnRzLk11bHRpcGxleGVyID0gbXByb3RvY29sLk11bHRpcGxleGVyOworZXhwb3J0cy5NdWx0aXBsZXhlZFByb2Nlc3NvciA9IG1wcm9jZXNzb3IuTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKKy8qCisgKiBFeHBvcnQgdHJhbnNwb3J0IGFuZCBwcm90b2NvbCBzbyB0aGV5IGNhbiBiZSB1c2VkIG91dHNpZGUgb2YgYQorICogY2Fzc2FuZHJhL3NlcnZlciBjb250ZXh0CisgKi8KK2V4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworZXhwb3J0cy5UQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOworZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOworZXhwb3J0cy5USlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7CitleHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTU1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yLmpzCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB1dGlsID0gcmVxdWlyZSgidXRpbCIpOworCittb2R1bGUuZXhwb3J0cyA9IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcjsKKworZnVuY3Rpb24gSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKG1lc3NhZ2UpIHsKKyAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKK307CisKK3V0aWwuaW5oZXJpdHMoSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yLCBFcnJvcik7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW50NjRfdXRpbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDcwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW50NjRfdXRpbC5qcwpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKKwordmFyIEludDY0VXRpbCA9IG1vZHVsZS5leHBvcnRzID0ge307CisKK3ZhciBQT1cyXzI0ID0gTWF0aC5wb3coMiwgMjQpOwordmFyIFBPVzJfMzEgPSBNYXRoLnBvdygyLCAzMSk7Cit2YXIgUE9XMl8zMiA9IE1hdGgucG93KDIsIDMyKTsKK3ZhciBQT1cxMF8xMSA9IE1hdGgucG93KDEwLCAxMSk7CisKK0ludDY0VXRpbC50b0RlY2ltYWxTdHJpbmcgPSBmdW5jdGlvbihpNjQpIHsKKyAgdmFyIGIgPSBpNjQuYnVmZmVyOworICB2YXIgbyA9IGk2NC5vZmZzZXQ7CisgIGlmICgoIWJbb10gJiYgIShiW28gKyAxXSAmIDB4ZTApKSB8fAorICAgICAgKCF+YltvXSAmJiAhfihiW28gKyAxXSAmIDB4ZTApKSkgeworICAgIC8vIFRoZSBtYWduaXR1ZGUgaXMgc21hbGwgZW5vdWdoLgorICAgIHJldHVybiBpNjQudG9TdHJpbmcoKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgbmVnYXRpdmUgPSBiW29dICYgMHg4MDsKKyAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgIC8vIDIncyBjb21wbGVtZW50CisgICAgICB2YXIgaW5jcmVtZW50ZWQgPSBmYWxzZTsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgQnVmZmVyKDgpOworICAgICAgZm9yICh2YXIgaSA9IDc7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGJ1ZmZlcltpXSA9ICh+YltvICsgaV0gKyAoaW5jcmVtZW50ZWQgPyAwIDogMSkpICYgMHhmZjsKKyAgICAgICAgaW5jcmVtZW50ZWQgfD0gYltvICsgaV07CisgICAgICB9CisgICAgICBiID0gYnVmZmVyOworICAgIH0KKyAgICB2YXIgaGlnaDIgPSBiW28gKyAxXSArIChiW29dIDw8IDgpOworICAgIC8vIExlc3NlciAxMSBkaWdpdHMgd2l0aCBleGNlZWRpbmcgdmFsdWVzIGJ1dCBpcyB1bmRlciA1MyBiaXRzIGNhcGFjaXR5LgorICAgIHZhciBsb3cgPSBiW28gKyA3XSArIChiW28gKyA2XSA8PCA4KSArIChiW28gKyA1XSA8PCAxNikKKyAgICAgICAgKyBiW28gKyA0XSAqIFBPVzJfMjQgIC8vIEJpdCBzaGlmdCByZW5kZXJzIDMydGggYml0IGFzIHNpZ24sIHNvIHVzZSBtdWx0aXBsaWNhdGlvbgorICAgICAgICArIChiW28gKyAzXSArIChiW28gKyAyXSA8PCA4KSkgKiBQT1cyXzMyICsgaGlnaDIgKiA3NDk3NjcxMDY1NjsgIC8vIFRoZSBsaXRlcmFsIGlzIDJeNDggJSAxMF4xMQorICAgIC8vIDEydGggZGlnaXQgYW5kIGdyZWF0ZXIuCisgICAgdmFyIGhpZ2ggPSBNYXRoLmZsb29yKGxvdyAvIFBPVzEwXzExKSArIGhpZ2gyICogMjgxNDsgIC8vIFRoZSBsaXRlcmFsIGlzIDJeNDggLyAxMF4xMQorICAgIC8vIE1ha2UgaXQgZXhhY3RseSAxMSB3aXRoIGxlYWRpbmcgemVyb3MuCisgICAgbG93ID0gKCcwMDAwMDAwMDAwMCcgKyBTdHJpbmcobG93ICUgUE9XMTBfMTEpKS5zbGljZSgtMTEpOworICAgIHJldHVybiAobmVnYXRpdmUgPyAnLScgOiAnJykgKyBTdHJpbmcoaGlnaCkgKyBsb3c7CisgIH0KK307CisKK0ludDY0VXRpbC5mcm9tRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKHRleHQpIHsKKyAgdmFyIG5lZ2F0aXZlID0gdGV4dC5jaGFyQXQoMCkgPT09ICctJzsKKyAgaWYgKHRleHQubGVuZ3RoIDwgKG5lZ2F0aXZlID8gMTcgOiAxNikpIHsKKyAgICAvLyBUaGUgbWFnbml0dWRlIGlzIHNtYWxsZXIgdGhhbiAyXjUzLgorICAgIHJldHVybiBuZXcgSW50NjQoK3RleHQpOworICB9IGVsc2UgaWYgKHRleHQubGVuZ3RoID4gKG5lZ2F0aXZlID8gMjAgOiAxOSkpIHsKKyAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVG9vIG1hbnkgZGlnaXRzIGZvciBJbnQ2NDogJyArIHRleHQpOworICB9IGVsc2UgeworICAgIC8vIE1vc3Qgc2lnbmlmaWNhbnQgKHVwIHRvIDUpIGRpZ2l0cworICAgIHZhciBoaWdoNSA9ICt0ZXh0LnNsaWNlKG5lZ2F0aXZlID8gMSA6IDAsIC0xNSk7CisgICAgdmFyIGxvdyA9ICt0ZXh0LnNsaWNlKC0xNSkgKyBoaWdoNSAqIDI3NjQ0NzIzMjA7ICAvLyBUaGUgbGl0ZXJhbCBpcyAxMF4xNSAlIDJeMzIKKyAgICB2YXIgaGlnaCA9IE1hdGguZmxvb3IobG93IC8gUE9XMl8zMikgKyBoaWdoNSAqIDIzMjgzMDsgIC8vIFRoZSBsaXRlcmFsIGlzIDEwXjE1IC8gMl4mMzIKKyAgICBsb3cgPSBsb3cgJSBQT1cyXzMyOworICAgIGlmIChoaWdoID49IFBPVzJfMzEgJiYKKyAgICAgICAgIShuZWdhdGl2ZSAmJiBoaWdoID09IFBPVzJfMzEgJiYgbG93ID09IDApICAvLyBBbGxvdyBtaW5pbXVtIEludDY0CisgICAgICAgKSB7CisgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIG1hZ25pdHVkZSBpcyB0b28gbGFyZ2UgZm9yIEludDY0LicpOworICAgIH0KKyAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgIC8vIDIncyBjb21wbGVtZW50CisgICAgICBoaWdoID0gfmhpZ2g7CisgICAgICBpZiAobG93ID09PSAwKSB7CisgICAgICAgIGhpZ2ggPSAoaGlnaCArIDEpICYgMHhmZmZmZmZmZjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvdyA9IH5sb3cgKyAxOworICAgICAgfQorICAgICAgaGlnaCA9IDB4ODAwMDAwMDAgfCBoaWdoOworICAgIH0KKyAgICByZXR1cm4gbmV3IEludDY0KGhpZ2gsIGxvdyk7CisgIH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYjBiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qcwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIEltcG9ydGVkIGZyb20gRG91Z2xhcyBDcm9ja2ZvcmQncyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gd2l0aCBtaW5pbXVtIG1vZGlmaWNhdGlvbgorICogdG8gaGFuZGxlIEludDY0LgorICoKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3VnbGFzY3JvY2tmb3JkL0pTT04tanMvYmxvYi9jOTg5NDhhZTE5NDRhMjhlMmU4ZWJjMzcxNzg5NGU1ODBhZWFhYTA1L2pzb25fcGFyc2UuanMKKyAqCisgKiBPcmlnaW5hbCBsaWNlbnNlIGhlYWRlcjoKKyAqCisgKiBqc29uX3BhcnNlLmpzCisgKiAyMDE1LTA1LTAyCisgKiBQdWJsaWMgRG9tYWluLgorICogTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgorICovCisKKworLypqc2xpbnQgZm9yICovCisKKy8qcHJvcGVydHkKKyAgICBhdCwgYiwgY2FsbCwgY2hhckF0LCBmLCBmcm9tQ2hhckNvZGUsIGhhc093blByb3BlcnR5LCBtZXNzYWdlLCBuLCBuYW1lLAorICAgIHByb3RvdHlwZSwgcHVzaCwgciwgdCwgdGV4dAorKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIEludDY0VXRpbCA9IHJlcXVpcmUoJy4vaW50NjRfdXRpbCcpOworCit2YXIganNvbl9wYXJzZSA9IG1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHsKKyAgICAidXNlIHN0cmljdCI7CisKKy8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBwYXJzZSBhIEpTT04gdGV4dCwgcHJvZHVjaW5nIGEgSmF2YVNjcmlwdAorLy8gZGF0YSBzdHJ1Y3R1cmUuIEl0IGlzIGEgc2ltcGxlLCByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuIEl0IGRvZXMgbm90IHVzZQorLy8gZXZhbCBvciByZWd1bGFyIGV4cHJlc3Npb25zLCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIG1vZGVsIGZvciBpbXBsZW1lbnRpbmcKKy8vIGEgSlNPTiBwYXJzZXIgaW4gb3RoZXIgbGFuZ3VhZ2VzLgorCisvLyBXZSBhcmUgZGVmaW5pbmcgdGhlIGZ1bmN0aW9uIGluc2lkZSBvZiBhbm90aGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNyZWF0aW5nCisvLyBnbG9iYWwgdmFyaWFibGVzLgorCisgICAgdmFyIGF0LCAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAgICBjaCwgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAgICBlc2NhcGVlID0geworICAgICAgICAgICAgJyInOiAnIicsCisgICAgICAgICAgICAnXFwnOiAnXFwnLAorICAgICAgICAgICAgJy8nOiAnLycsCisgICAgICAgICAgICBiOiAnXGInLAorICAgICAgICAgICAgZjogJ1xmJywKKyAgICAgICAgICAgIG46ICdcbicsCisgICAgICAgICAgICByOiAnXHInLAorICAgICAgICAgICAgdDogJ1x0JworICAgICAgICB9LAorICAgICAgICB0ZXh0LAorCisgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKG0pIHsKKworLy8gQ2FsbCBlcnJvciB3aGVuIHNvbWV0aGluZyBpcyB3cm9uZy4KKworICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKG0pOworICAgICAgICB9LAorCisgICAgICAgIG5leHQgPSBmdW5jdGlvbiAoYykgeworCisvLyBJZiBhIGMgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB2ZXJpZnkgdGhhdCBpdCBtYXRjaGVzIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4KKworICAgICAgICAgICAgaWYgKGMgJiYgYyAhPT0gY2gpIHsKKyAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJyIgKyBjICsgIicgaW5zdGVhZCBvZiAnIiArIGNoICsgIiciKTsKKyAgICAgICAgICAgIH0KKworLy8gR2V0IHRoZSBuZXh0IGNoYXJhY3Rlci4gV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjaGFyYWN0ZXJzLAorLy8gcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuCisKKyAgICAgICAgICAgIGNoID0gdGV4dC5jaGFyQXQoYXQpOworICAgICAgICAgICAgYXQgKz0gMTsKKyAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgfSwKKworICAgICAgICBudW1iZXIgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFBhcnNlIGEgbnVtYmVyIHZhbHVlLgorCisgICAgICAgICAgICB2YXIgbnVtYmVyLAorICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnOworCisgICAgICAgICAgICBpZiAoY2ggPT09ICctJykgeworICAgICAgICAgICAgICAgIHN0cmluZyA9ICctJzsKKyAgICAgICAgICAgICAgICBuZXh0KCctJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT09ICcuJykgeworICAgICAgICAgICAgICAgIHN0cmluZyArPSAnLic7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQoKSAmJiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT09ICdlJyB8fCBjaCA9PT0gJ0UnKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1iZXIgPSArc3RyaW5nOworICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShudW1iZXIpKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoIkJhZCBudW1iZXIiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID49IEludDY0Lk1BWF9JTlQgfHwgbnVtYmVyIDw9IEludDY0Lk1JTl9JTlQpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gcmF3IHN0cmluZyBmb3IgZnVydGhlciBwcm9jZXNzIGluIFRKU09OUHJvdG9jb2wKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIHN0cmluZyA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBzdHJpbmcgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBoZXgsCisgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICBzdHJpbmcgPSAnJywKKyAgICAgICAgICAgICAgICB1ZmZmZjsKKworLy8gV2hlbiBwYXJzaW5nIGZvciBzdHJpbmcgdmFsdWVzLCB3ZSBtdXN0IGxvb2sgZm9yICIgYW5kIFwgY2hhcmFjdGVycy4KKworICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAndScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKz0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXggPSBwYXJzZUludChuZXh0KCksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShoZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IHVmZmZmICogMTYgKyBoZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVzY2FwZWVbY2hdID09PSAnc3RyaW5nJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBlc2NhcGVlW2NoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiQmFkIHN0cmluZyIpOworICAgICAgICB9LAorCisgICAgICAgIHdoaXRlID0gZnVuY3Rpb24gKCkgeworCisvLyBTa2lwIHdoaXRlc3BhY2UuCisKKyAgICAgICAgICAgIHdoaWxlIChjaCAmJiBjaCA8PSAnICcpIHsKKyAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgd29yZCA9IGZ1bmN0aW9uICgpIHsKKworLy8gdHJ1ZSwgZmFsc2UsIG9yIG51bGwuCisKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgIG5leHQoJ3QnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdyJyk7CisgICAgICAgICAgICAgICAgbmV4dCgndScpOworICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIG5leHQoJ2YnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdhJyk7CisgICAgICAgICAgICAgICAgbmV4dCgnbCcpOworICAgICAgICAgICAgICAgIG5leHQoJ3MnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdlJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgbmV4dCgnbicpOworICAgICAgICAgICAgICAgIG5leHQoJ3UnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgbmV4dCgnbCcpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyb3IoIlVuZXhwZWN0ZWQgJyIgKyBjaCArICInIik7CisgICAgICAgIH0sCisKKyAgICAgICAgdmFsdWUsICAvLyBQbGFjZSBob2xkZXIgZm9yIHRoZSB2YWx1ZSBmdW5jdGlvbi4KKworICAgICAgICBhcnJheSA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYW4gYXJyYXkgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOworCisgICAgICAgICAgICBpZiAoY2ggPT09ICdbJykgeworICAgICAgICAgICAgICAgIG5leHQoJ1snKTsKKyAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OyAgIC8vIGVtcHR5IGFycmF5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgeworICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgnXScpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5leHQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiQmFkIGFycmF5Iik7CisgICAgICAgIH0sCisKKyAgICAgICAgb2JqZWN0ID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhbiBvYmplY3QgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBrZXksCisgICAgICAgICAgICAgICAgb2JqZWN0ID0ge307CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ3snKSB7CisgICAgICAgICAgICAgICAgbmV4dCgneycpOworICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnfScpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OyAgIC8vIGVtcHR5IG9iamVjdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2gpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG5leHQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgIicgKyBrZXkgKyAnIicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gdmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoJ30nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgb2JqZWN0Iik7CisgICAgICAgIH07CisKKyAgICB2YWx1ZSA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBKU09OIHZhbHVlLiBJdCBjb3VsZCBiZSBhbiBvYmplY3QsIGFuIGFycmF5LCBhIHN0cmluZywgYSBudW1iZXIsCisvLyBvciBhIHdvcmQuCisKKyAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QoKTsKKyAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKKyAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nKCk7CisgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgcmV0dXJuIG51bWJlcigpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOScKKyAgICAgICAgICAgICAgICA/IG51bWJlcigpCisgICAgICAgICAgICAgICAgOiB3b3JkKCk7CisgICAgICAgIH0KKyAgICB9OworCisvLyBSZXR1cm4gdGhlIGpzb25fcGFyc2UgZnVuY3Rpb24uIEl0IHdpbGwgaGF2ZSBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBhYm92ZQorLy8gZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuCisKKyAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSkgeworICAgICAgICB2YXIgcmVzdWx0OworCisgICAgICAgIHRleHQgPSBzb3VyY2U7CisgICAgICAgIGF0ID0gMDsKKyAgICAgICAgY2ggPSAnICc7CisgICAgICAgIHJlc3VsdCA9IHZhbHVlKCk7CisgICAgICAgIHdoaXRlKCk7CisgICAgICAgIGlmIChjaCkgeworICAgICAgICAgICAgZXJyb3IoIlN5bnRheCBlcnJvciIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9OworfSgpKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3YTNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsODAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKK3ZhciB1dGlsID0gcmVxdWlyZSgidXRpbCIpOworCit2YXIgSW50NjRVdGlsID0gcmVxdWlyZSgnLi9pbnQ2NF91dGlsJyk7Cit2YXIganNvbl9wYXJzZSA9IHJlcXVpcmUoJy4vanNvbl9wYXJzZScpOworCit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKworbW9kdWxlLmV4cG9ydHMgPSBUSlNPTlByb3RvY29sOworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEpTT04gcHJvdG9jb2wgaW5zdGFuY2UuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7VGhyaWZ0LlRyYW5zcG9ydH0gdHJhbnMgLSBUaGUgdHJhbnNwb3J0IHRvIHNlcmlhbGl6ZSB0by9mcm9tLgorICogQGNsYXNzZGVzYyBBcGFjaGUgVGhyaWZ0IFByb3RvY29scyBwZXJmb3JtIHNlcmlhbGl6YXRpb24gd2hpY2ggZW5hYmxlcyBjcm9zcworICogbGFuZ3VhZ2UgUlBDLiBUaGUgUHJvdG9jb2wgdHlwZSBpcyB0aGUgSmF2YVNjcmlwdCBicm93c2VyIGltcGxlbWVudGF0aW9uCisgKiBvZiB0aGUgQXBhY2hlIFRocmlmdCBUSlNPTlByb3RvY29sLgorICogQGV4YW1wbGUKKyAqICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICovCitmdW5jdGlvbiBUSlNPTlByb3RvY29sKHRyYW5zKSB7CisgIHRoaXMudHN0YWNrID0gW107CisgIHRoaXMudHBvcyA9IFtdOworICB0aGlzLnRyYW5zID0gdHJhbnM7Cit9OworCisvKioKKyAqIFRocmlmdCBJREwgdHlwZSBJZCB0byBzdHJpbmcgbWFwcGluZy4KKyAqIEByZWFkb25seQorICogQHNlZSB7QGxpbmsgVGhyaWZ0LlR5cGV9CisgKi8KK1RKU09OUHJvdG9jb2wuVHlwZSA9IHt9OworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuQk9PTF0gPSAnInRmIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5CWVRFXSA9ICciaTgiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkkxNl0gPSAnImkxNiInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuSTMyXSA9ICciaTMyIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5JNjRdID0gJyJpNjQiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkRPVUJMRV0gPSAnImRibCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuU1RSVUNUXSA9ICcicmVjIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5TVFJJTkddID0gJyJzdHIiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLk1BUF0gPSAnIm1hcCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuTElTVF0gPSAnImxzdCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuU0VUXSA9ICcic2V0Iic7CisKKy8qKgorICogVGhyaWZ0IElETCB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICogQHJlYWRvbmx5CisgKiBAc2VlIHtAbGluayBUaHJpZnQuVHlwZX0KKyAqLworVEpTT05Qcm90b2NvbC5SVHlwZSA9IHt9OworVEpTT05Qcm90b2NvbC5SVHlwZS50ZiA9IFR5cGUuQk9PTDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuaTggPSBUeXBlLkJZVEU7CitUSlNPTlByb3RvY29sLlJUeXBlLmkxNiA9IFR5cGUuSTE2OworVEpTT05Qcm90b2NvbC5SVHlwZS5pMzIgPSBUeXBlLkkzMjsKK1RKU09OUHJvdG9jb2wuUlR5cGUuaTY0ID0gVHlwZS5JNjQ7CitUSlNPTlByb3RvY29sLlJUeXBlLmRibCA9IFR5cGUuRE9VQkxFOworVEpTT05Qcm90b2NvbC5SVHlwZS5yZWMgPSBUeXBlLlNUUlVDVDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuc3RyID0gVHlwZS5TVFJJTkc7CitUSlNPTlByb3RvY29sLlJUeXBlLm1hcCA9IFR5cGUuTUFQOworVEpTT05Qcm90b2NvbC5SVHlwZS5sc3QgPSBUeXBlLkxJU1Q7CitUSlNPTlByb3RvY29sLlJUeXBlLnNldCA9IFR5cGUuU0VUOworCisvKioKKyAqIFRoZSBUSlNPTlByb3RvY29sIHZlcnNpb24gbnVtYmVyLgorICogQHJlYWRvbmx5CisgKiBAY29uc3Qge251bWJlcn0gVmVyc2lvbgorICogQG1lbWJlcm9mIFRocmlmdC5Qcm90b2NvbAorICovCitUSlNPTlByb3RvY29sLlZlcnNpb24gPSAxOworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKKyAgcmV0dXJuIHRoaXMudHJhbnMuZmx1c2goKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUgPSBmdW5jdGlvbigpIHsKKyAgaWYgKHRoaXMudHN0YWNrLmxlbmd0aCA9PT0gMSkgeworICAgIHRoaXMudHJhbnMud3JpdGUodGhpcy50c3RhY2sucG9wKCkpOworICB9Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuCisgKiBAcGFyYW0ge1RocmlmdC5NZXNzYWdlVHlwZX0gbWVzc2FnZVR5cGUgLSBUaGUgdHlwZSBvZiBtZXRob2QgY2FsbC4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBjYWxsIChhbHdheXMgMCBpbiBBcGFjaGUgVGhyaWZ0KS4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpIHsKKyAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5WZXJzaW9uLCAnIicgKyBuYW1lICsgJyInLCBtZXNzYWdlVHlwZSwgc2VxaWRdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIG9iaiA9IHRoaXMudHN0YWNrLnBvcCgpOworCisgIHRoaXMud29iaiA9IHRoaXMudHN0YWNrLnBvcCgpOworICB0aGlzLndvYmoucHVzaChvYmopOworCisgIHRoaXMud2J1ZiA9ICdbJyArIHRoaXMud29iai5qb2luKCcsJykgKyAnXSc7CisKKyAgLy8gd2UgYXNzdW1lIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0byBjb21lIHNvIHdlIHdyaXRlCisgIHRoaXMudHJhbnMud3JpdGUodGhpcy53YnVmKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEJlZ2luID0gZnVuY3Rpb24obmFtZSkgeworICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICB0aGlzLnRzdGFjay5wdXNoKHt9KTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKyAgdmFyIHN0cnVjdCA9IHRoaXMudHN0YWNrW3BdOworICB2YXIgc3RyID0gJ3snOworICB2YXIgZmlyc3QgPSB0cnVlOworICBmb3IgKHZhciBrZXkgaW4gc3RydWN0KSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBzdHIgKz0gJywnOworICAgIH0KKworICAgIHN0ciArPSBrZXkgKyAnOicgKyBzdHJ1Y3Rba2V5XTsKKyAgfQorCisgIHN0ciArPSAnfSc7CisgIHRoaXMudHN0YWNrW3BdID0gc3RyOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QgZmllbGQuCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAqIEBwYXJhbSB7VGhyaWZ0LlByb3RvY29sLlR5cGV9IGZpZWxkVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkSWQgLSBUaGUgZmllbGQncyB1bmlxdWUgaWRlbnRpZmllci4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKSB7CisgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgIHRoaXMudHN0YWNrLnB1c2goeyAnZmllbGRJZCc6ICciJyArCisgICAgZmllbGRJZCArICciJywgJ2ZpZWxkVHlwZSc6IFRKU09OUHJvdG9jb2wuVHlwZVtmaWVsZFR5cGVdCisgIH0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBmaWVsZC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgdmFsdWUgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgdmFyIGZpZWxkSW5mbyA9IHRoaXMudHN0YWNrLnBvcCgpOworCisgIGlmICgnOicgKyB2YWx1ZSA9PT0gIjpbb2JqZWN0IE9iamVjdF0iKSB7CisgICAgdGhpcy50c3RhY2tbdGhpcy50c3RhY2subGVuZ3RoIC0gMV1bZmllbGRJbmZvLmZpZWxkSWRdID0gJ3snICsKKyAgICAgIGZpZWxkSW5mby5maWVsZFR5cGUgKyAnOicgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnfSc7CisgIH0gZWxzZSB7CisgICAgdGhpcy50c3RhY2tbdGhpcy50c3RhY2subGVuZ3RoIC0gMV1bZmllbGRJbmZvLmZpZWxkSWRdID0gJ3snICsKKyAgICAgIGZpZWxkSW5mby5maWVsZFR5cGUgKyAnOicgKyB2YWx1ZSArICd9JzsKKyAgfQorICB0aGlzLnRwb3MucG9wKCk7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRTdG9wID0gZnVuY3Rpb24oKSB7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcCBjb2xsZWN0aW9uLgorICogQHBhcmFtIHtUaHJpZnQuVHlwZX0ga2V5VHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IHZhbFR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZV0gLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAgKGlnbm9yZWQpLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEJlZ2luID0gZnVuY3Rpb24oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSkgeworICAvL3NpemUgaXMgaW52YWxpZCwgd2UnbGwgc2V0IGl0IG9uIGVuZC4KKyAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5UeXBlW2tleVR5cGVdLCBUSlNPTlByb3RvY29sLlR5cGVbdmFsVHlwZV0sIDBdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWFwLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICBpZiAocCA9PSB0aGlzLnRzdGFjay5sZW5ndGgpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoKHRoaXMudHN0YWNrLmxlbmd0aCAtIHAgLSAxKSAlIDIgIT09IDApIHsKKyAgICB0aGlzLnRzdGFjay5wdXNoKCcnKTsKKyAgfQorCisgIHZhciBzaXplID0gKHRoaXMudHN0YWNrLmxlbmd0aCAtIHAgLSAxKSAvIDI7CisKKyAgdGhpcy50c3RhY2tbcF1bdGhpcy50c3RhY2tbcF0ubGVuZ3RoIC0gMV0gPSBzaXplOworCisgIHZhciBtYXAgPSAnfSc7CisgIHZhciBmaXJzdCA9IHRydWU7CisgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgIHZhciB2ID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgdmFyIGsgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG1hcCA9ICcsJyArIG1hcDsKKyAgICB9CisKKyAgICBpZiAoISBpc05hTihrKSkgeyBrID0gJyInICsgayArICciJzsgfSAvL2pzb24gImtleXMiIG5lZWQgdG8gYmUgc3RyaW5ncworICAgIG1hcCA9IGsgKyAnOicgKyB2ICsgbWFwOworICB9CisgIG1hcCA9ICd7JyArIG1hcDsKKworICB0aGlzLnRzdGFja1twXS5wdXNoKG1hcCk7CisgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0IGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICB0aGlzLnRzdGFja1twXS5wdXNoKHRtcFZhbCk7CisgIH0KKworICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0IGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc2V0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOworICAgIHRoaXMudHN0YWNrLnNwbGljZShwICsgMSwgMSk7CisgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpOworICB9CisKKyAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKiogU2VyaWFsaXplcyBhIGJvb2xlYW4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKGJvb2wpIHsKKyAgdGhpcy50c3RhY2sucHVzaChib29sID8gMSA6IDApOworfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQnl0ZSA9IGZ1bmN0aW9uKGJ5dGUpIHsKKyAgdGhpcy50c3RhY2sucHVzaChieXRlKTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKGkxNikgeworICB0aGlzLnRzdGFjay5wdXNoKGkxNik7Cit9OworCisvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMzIgPSBmdW5jdGlvbihpMzIpIHsKKyAgdGhpcy50c3RhY2sucHVzaChpMzIpOworfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTY0ID0gZnVuY3Rpb24oaTY0KSB7CisgIGlmIChpNjQgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgIHRoaXMudHN0YWNrLnB1c2goSW50NjRVdGlsLnRvRGVjaW1hbFN0cmluZyhpNjQpKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnRzdGFjay5wdXNoKGk2NCk7CisgIH0KK307CisKKy8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKGR1YikgeworICB0aGlzLnRzdGFjay5wdXNoKGR1Yik7Cit9OworCisvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihhcmcpIHsKKyAgLy8gV2UgZG8gbm90IGVuY29kZSB1cmkgY29tcG9uZW50cyBmb3Igd2lyZSB0cmFuc2ZlcjoKKyAgaWYgKGFyZyA9PT0gbnVsbCkgeworICAgICAgdGhpcy50c3RhY2sucHVzaChudWxsKTsKKyAgfSBlbHNlIHsKKyAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgeworICAgICAgICB2YXIgc3RyID0gYXJnOworICAgICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIpIHsKKyAgICAgICAgdmFyIHN0ciA9IGFyZy50b1N0cmluZygndXRmOCcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZVN0cmluZyBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICAgICAgfQorCisgICAgICAvLyBjb25jYXQgbWF5IGJlIHNsb3dlciB0aGFuIGJ1aWxkaW5nIGEgYnl0ZSBidWZmZXIKKyAgICAgIHZhciBlc2NhcGVkU3RyaW5nID0gJyc7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7ICAgICAgLy8gYSBzaW5nbGUgZG91YmxlIHF1b3RlOiAiCisgICAgICAgICAgaWYgKGNoID09PSAnXCInKSB7CisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXCInOyAvLyB3cml0ZSBvdXQgYXM6IFwiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc2xhc2g6IFwKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhczogXFwKKyAgICAgICAgICAvKiBDdXJyZW50bHkgZXNjYXBlZCBmb3J3YXJkIHNsYXNoZXMgYnJlYWsgVEpTT05Qcm90b2NvbC4KKyAgICAgICAgICAgKiBBcyBpdCBzdGFuZHMsIHdlIGNhbiBzaW1wbHkgcGFzcyBmb3J3YXJkIHNsYXNoZXMgaW50bworICAgICAgICAgICAqIG91ciBzdHJpbmdzIGFjcm9zcyB0aGUgd2lyZSB3aXRob3V0IGJlaW5nIGVzY2FwZWQuCisgICAgICAgICAgICogSSB0aGluayB0aGlzIGlzIHRoZSBwcm90b2NvbCdzIGJ1Zywgbm90IHRocmlmdC5qcworICAgICAgICAgICAqIH0gZWxzZSBpZihjaCA9PT0gJy8nKSB7ICAgLy8gYSBzaW5nbGUgZm9yd2FyZCBzbGFzaDogLworICAgICAgICAgICAqICBlc2NhcGVkU3RyaW5nICs9ICdcXC8nOyAgLy8gd3JpdGUgb3V0IGFzIFwvCisgICAgICAgICAgICogfQorICAgICAgICAgICAqLworICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcYicpIHsgICAgLy8gYSBzaW5nbGUgYmFja3NwYWNlOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxiJzsgIC8vIHdyaXRlIG91dCBhczogXGIiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xmJykgeyAgICAvLyBhIHNpbmdsZSBmb3JtZmVlZDogaW52aXNpYmxlCisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcZic7ICAvLyB3cml0ZSBvdXQgYXM6IFxmIgorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcbicpIHsgICAgLy8gYSBzaW5nbGUgbmV3bGluZTogaW52aXNpYmxlCisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcbic7ICAvLyB3cml0ZSBvdXQgYXM6IFxuIgorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdccicpIHsgICAgLy8gYSBzaW5nbGUgcmV0dXJuOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxyJzsgIC8vIHdyaXRlIG91dCBhczogXHIiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1x0JykgeyAgICAvLyBhIHNpbmdsZSB0YWI6IGludmlzaWJsZQorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHQnOyAgLy8gd3JpdGUgb3V0IGFzOiBcdCIKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9IGNoOyAgICAgLy8gRWxzZSBpdCBuZWVkIG5vdCBiZSBlc2NhcGVkCisgICAgICAgICAgfQorICAgICAgfQorICAgICAgdGhpcy50c3RhY2sucHVzaCgnIicgKyBlc2NhcGVkU3RyaW5nICsgJyInKTsKKyAgfQorfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7CisgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykgeworICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGFyZywgJ2JpbmFyeScpOworICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlciB8fAorICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykgIHsKKyAgICB2YXIgYnVmID0gYXJnOworICB9IGVsc2UgeworICAgIHRocm93IG5ldyBFcnJvcignd3JpdGVCaW5hcnkgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgfQorICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGJ1Zi50b1N0cmluZygnYmFzZTY0JykgKyAnIicpOworfTsKKworLyoqCisgKiBAY2xhc3MKKyAqIEBuYW1lIEFub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJuCisgKiBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QuCisgKiBAcHJvcGVydHkge1RocmlmdC5NZXNzYWdlVHlwZX0gbXR5cGUgLSBUaGUgdHlwZSBvZiBtZXNzYWdlIGNhbGwuCisgKiBAcHJvcGVydHkge251bWJlcn0gcnNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWVzc2FnZSAoMCBpbiBUaHJpZnQgUlBDKS4KKyAqLworLyoqCisgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuCisgKiBAcmV0dXJucyB7QW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yc3RhY2sgPSBbXTsKKyAgdGhpcy5ycG9zID0gW107CisKKyAgLy9Cb3Jyb3cgdGhlIGluYm91bmQgdHJhbnNwb3J0IGJ1ZmZlciBhbmQgZW5zdXJlIGRhdGEgaXMgcHJlc2VudC9jb25zaXN0ZW50CisgIHZhciB0cmFuc0J1ZiA9IHRoaXMudHJhbnMuYm9ycm93KCk7CisgIGlmICh0cmFuc0J1Zi5yZWFkSW5kZXggPj0gdHJhbnNCdWYud3JpdGVJbmRleCkgeworICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorICB2YXIgY3Vyc29yID0gdHJhbnNCdWYucmVhZEluZGV4OworCisgIGlmICh0cmFuc0J1Zi5idWZbY3Vyc29yXSAhPT0gMHg1QikgeyAvL1sKKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBKU09OIGlucHV0LCBubyBvcGVuaW5nIGJyYWNrZXQiKTsKKyAgfQorCisgIC8vUGFyc2UgYSBzaW5nbGUgbWVzc2FnZSAodGhlcmUgbWF5IGJlIHNldmVyYWwgaW4gdGhlIGJ1ZmZlcikKKyAgLy8gIFRPRE86IEhhbmRsZSBjaGFyYWN0ZXJzIHVzaW5nIG11bHRpcGxlIGNvZGUgdW5pdHMKKyAgY3Vyc29yKys7CisgIHZhciBvcGVuQnJhY2tldENvdW50ID0gMTsKKyAgdmFyIGluU3RyaW5nID0gZmFsc2U7CisgIGZvciAoOyBjdXJzb3IgPCB0cmFuc0J1Zi53cml0ZUluZGV4OyBjdXJzb3IrKykgeworICAgIHZhciBjaHIgPSB0cmFuc0J1Zi5idWZbY3Vyc29yXTsKKyAgICAvL3dlIHVzZSBoZXhhIGNoYXJjb2RlIGhlcmUgYmVjYXVzZSBkYXRhW2ldIHJldHVybnMgYW4gaW50IGFuZCBub3QgYSBjaGFyCisgICAgaWYgKGluU3RyaW5nKSB7CisgICAgICBpZiAoY2hyID09PSAweDIyKSB7IC8vIgorICAgICAgICBpblN0cmluZyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChjaHIgPT09IDB4NUMpIHsgLy9cCisgICAgICAgIC8vZXNjYXBlZCBjaGFyYWN0ZXIsIHNraXAKKyAgICAgICAgY3Vyc29yICs9IDE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChjaHIgPT09IDB4NUIpIHsgLy9bCisgICAgICAgIG9wZW5CcmFja2V0Q291bnQgKz0gMTsKKyAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAweDVEKSB7IC8vXQorICAgICAgICBvcGVuQnJhY2tldENvdW50IC09IDE7CisgICAgICAgIGlmIChvcGVuQnJhY2tldENvdW50ID09PSAwKSB7CisgICAgICAgICAgLy9lbmQgb2YganNvbiBtZXNzYWdlIGRldGVjdGVkCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAweDIyKSB7IC8vIgorICAgICAgICBpblN0cmluZyA9IHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKG9wZW5CcmFja2V0Q291bnQgIT09IDApIHsKKyAgICAvLyBNaXNzaW5nIGNsb3NpbmcgYnJhY2tldC4gQ2FuIGJlIGJ1ZmZlciB1bmRlcnJ1bi4KKyAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7CisgIH0KKworICAvL1JlY29uc3RpdHV0ZSB0aGUgSlNPTiBvYmplY3QgYW5kIGNvbnVtZSB0aGUgbmVjZXNzYXJ5IGJ5dGVzCisgIHRoaXMucm9iaiA9IGpzb25fcGFyc2UodHJhbnNCdWYuYnVmLnNsaWNlKHRyYW5zQnVmLnJlYWRJbmRleCwgY3Vyc29yKzEpLnRvU3RyaW5nKCkpOworICB0aGlzLnRyYW5zLmNvbnN1bWUoY3Vyc29yICsgMSAtIHRyYW5zQnVmLnJlYWRJbmRleCk7CisKKyAgLy9WZXJpZnkgdGhlIHByb3RvY29sIHZlcnNpb24KKyAgdmFyIHZlcnNpb24gPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgaWYgKHZlcnNpb24gIT0gVEpTT05Qcm90b2NvbC5WZXJzaW9uKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogJyArIHZlcnNpb24pOworICB9CisKKyAgLy9PYmplY3RpZnkgdGhlIHRocmlmdCBtZXNzYWdlIHtuYW1lL3R5cGUvc2VxdWVuY2UtbnVtYmVyfSBmb3IgcmV0dXJuCisgIC8vIGFuZCB0aGVuIHNhdmUgdGhlIEpTT04gb2JqZWN0IGluIHJzdGFjaworICB2YXIgciA9IHt9OworICByLmZuYW1lID0gdGhpcy5yb2JqLnNoaWZ0KCk7CisgIHIubXR5cGUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgci5yc2VxaWQgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJvYmouc2hpZnQoKSk7CisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWVzc2FnZS4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgKGlnbm9yZWQpCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGFuIGVtcHR5IHN0cmluZyBmbmFtZSBwcm9wZXJ0eQorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHIgPSB7fTsKKyAgci5mbmFtZSA9ICcnOworCisgIC8vaW5jYXNlIHRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RydWN0cworICBpZiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBBcnJheSkgeworICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0uc2hpZnQoKSk7CisgIH0KKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHN0cnVjdC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yc3RhY2sucG9wKCk7Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRGaWVsZEJlZ2luUmV0dXJuCisgKiBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKGFsd2F5cyAnJykuCisgKiBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBmdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICogQHByb3BlcnR5IHtudW1iZXJ9IGZpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmllbGQuCisgKi8KKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZC4KKyAqIEByZXR1cm5zIHtBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciByID0ge307CisKKyAgdmFyIGZpZCA9IC0xOworICB2YXIgZnR5cGUgPSBUeXBlLlNUT1A7CisKKyAgLy9nZXQgYSBmaWVsZElkCisgIGZvciAodmFyIGYgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgeworICAgIGlmIChmID09PSBudWxsKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBmaWQgPSBwYXJzZUludChmLCAxMCk7CisgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKworICAgIHZhciBmaWVsZCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ZpZF07CisKKyAgICAvL3JlbW92ZSBzbyB3ZSBkb24ndCBzZWUgaXQgYWdhaW4KKyAgICBkZWxldGUgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgIHRoaXMucnN0YWNrLnB1c2goZmllbGQpOworCisgICAgYnJlYWs7CisgIH0KKworICBpZiAoZmlkICE9IC0xKSB7CisgICAgLy9zaG91bGQgb25seSBiZSAxIG9mIHRoZXNlIGJ1dCB0aGlzIGlzIHRoZSBvbmx5CisgICAgLy93YXkgdG8gbWF0Y2ggYSBrZXkKKyAgICBmb3IgKHZhciBpIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSkpIHsKKyAgICAgIGlmIChUSlNPTlByb3RvY29sLlJUeXBlW2ldID09PSBudWxsKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmdHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbaV07CisgICAgICB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdW2ldOworICAgIH0KKyAgfQorCisgIHIuZm5hbWUgPSAnJzsKKyAgci5mdHlwZSA9IGZ0eXBlOworICByLmZpZCA9IGZpZDsKKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkRW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCk7CisKKyAgLy9nZXQgYmFjayB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIHN0YWNrCisgIHdoaWxlICh0aGlzLnJzdGFjay5sZW5ndGggPiBwb3MpIHsKKyAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgfQorfTsKKworLyoqCisgKiBAY2xhc3MKKyAqIEBuYW1lIEFub25SZWFkTWFwQmVnaW5SZXR1cm4KKyAqIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGt0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICogQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gdnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbWFwLgorICovCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLgorICogQHJldHVybnMge0Fub25SZWFkTWFwQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgbWFwID0gdGhpcy5yc3RhY2sucG9wKCk7CisgIHZhciBmaXJzdCA9IG1hcC5zaGlmdCgpOworICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBBcnJheSkgeworICAgIHRoaXMucnN0YWNrLnB1c2gobWFwKTsKKyAgICBtYXAgPSBmaXJzdDsKKyAgICBmaXJzdCA9IG1hcC5zaGlmdCgpOworICB9CisKKyAgdmFyIHIgPSB7fTsKKyAgci5rdHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbZmlyc3RdOworICByLnZ0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVttYXAuc2hpZnQoKV07CisgIHIuc2l6ZSA9IG1hcC5zaGlmdCgpOworCisKKyAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgdGhpcy5yc3RhY2sucHVzaChtYXAuc2hpZnQoKSk7CisKKyAgcmV0dXJuIHI7Cit9OworCisvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTWFwRW5kID0gZnVuY3Rpb24oKSB7CisgIHRoaXMucmVhZEZpZWxkRW5kKCk7Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRDb2xCZWdpblJldHVybgorICogQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZXR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50LgorICogQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgorICovCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KKyAqIEByZXR1cm5zIHtBbm9uUmVhZENvbEJlZ2luUmV0dXJufQorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBsaXN0ID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisKKyAgdmFyIHIgPSB7fTsKKyAgci5ldHlwZSA9IFRKU09OUHJvdG9jb2wuUlR5cGVbbGlzdC5zaGlmdCgpXTsKKyAgci5zaXplID0gbGlzdC5zaGlmdCgpOworCisgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7CisgIHRoaXMucnN0YWNrLnB1c2gobGlzdC5zaGlmdCgpKTsKKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpIC0gMjsKKyAgdmFyIHN0ID0gdGhpcy5yc3RhY2s7CisgIHN0LnBvcCgpOworICBpZiAoc3QgaW5zdGFuY2VvZiBBcnJheSAmJiBzdC5sZW5ndGggPiBwb3MgJiYgc3RbcG9zXS5sZW5ndGggPiAwKSB7CisgICAgc3QucHVzaChzdFtwb3NdLnNoaWZ0KCkpOworICB9Cit9OworCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LgorICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKCk7Cit9OworCisvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRMaXN0RW5kKCk7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQm9vbCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkVmFsdWUoKSA9PSAnMSc7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQnl0ZSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbihmKSB7CisgIHJldHVybiArdGhpcy5yZWFkVmFsdWUoKTsKK30KKworLyoqIFJldHVybnMgdGhlIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFZhbHVlID0gZnVuY3Rpb24oZikgeworICBpZiAoZiA9PT0gdW5kZWZpbmVkKSB7CisgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOworICB9CisKKyAgdmFyIHIgPSB7fTsKKworICBpZiAoZiBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgaWYgKGYubGVuZ3RoID09PSAwKSB7CisgICAgICByLnZhbHVlID0gdW5kZWZpbmVkOworICAgIH0gZWxzZSB7CisgICAgICByLnZhbHVlID0gZi5zaGlmdCgpOworICAgIH0KKyAgfSBlbHNlIGlmICghKGYgaW5zdGFuY2VvZiBJbnQ2NCkgJiYgZiBpbnN0YW5jZW9mIE9iamVjdCkgeworICAgIGZvciAodmFyIGkgaW4gZikgeworICAgICAgaWYgKGkgPT09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB0aGlzLnJzdGFjay5wdXNoKGZbaV0pOworICAgICAgZGVsZXRlIGZbaV07CisKKyAgICAgIHIudmFsdWUgPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHIudmFsdWUgPSBmOworICAgIHRoaXMucnN0YWNrLnBvcCgpOworICB9CisKKyAgcmV0dXJuIHIudmFsdWU7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciBuID0gdGhpcy5yZWFkVmFsdWUoKQorICBpZiAodHlwZW9mIG4gPT09ICdzdHJpbmcnKSB7CisgICAgLy8gQXNzdW1pbmcgbm8gb25lIGlzIHNlbmRpbmcgaW4gMS4xMTExMWUrMzMgZm9ybWF0CisgICAgcmV0dXJuIEludDY0VXRpbC5mcm9tRGVjaW1hbFN0cmluZyhuKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV3IEludDY0KG4pOworICB9Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCaW5hcnkgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIG5ldyBCdWZmZXIodGhpcy5yZWFkVmFsdWUoKSwgJ2Jhc2U2NCcpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5yZWFkVmFsdWUoKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtUaHJpZnQuVHJhbnNwb3J0fSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFuczsKK307CisKKy8qKgorICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm47CisgICAgY2FzZSBUeXBlLkJPT0w6CisgICAgICB0aGlzLnJlYWRCb29sKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuQllURToKKyAgICAgIHRoaXMucmVhZEJ5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMTY6CisgICAgICB0aGlzLnJlYWRJMTYoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMzI6CisgICAgICB0aGlzLnJlYWRJMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JNjQ6CisgICAgICB0aGlzLnJlYWRJNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICB0aGlzLnJlYWREb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJJTkc6CisgICAgICB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJVQ1Q6CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChyLmZ0eXBlID09PSBUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNraXAoci5mdHlwZSk7CisgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5NQVA6CisgICAgICB2YXIgbWFwQmVnaW4gPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBCZWdpbi5zaXplOyArK2kpIHsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLmt0eXBlKTsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLnZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNFVDoKKyAgICAgIHZhciBzZXRCZWdpbiA9IHRoaXMucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc2V0QmVnaW4uc2l6ZTsgKytpMikgeworICAgICAgICB0aGlzLnNraXAoc2V0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTElTVDoKKyAgICAgIHZhciBsaXN0QmVnaW4gPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkzID0gMDsgaTMgPCBsaXN0QmVnaW4uc2l6ZTsgKytpMykgeworICAgICAgICB0aGlzLnNraXAobGlzdEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgIEVycm9yKCJJbnZhbGlkIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2U4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7CisKK3ZhciBkaXNhYmxlZCA9IGZ1bmN0aW9uICgpIHt9OwordmFyIGxvZ0Z1bmMgPSBjb25zb2xlLmxvZzsKK3ZhciBsb2dMZXZlbCA9ICdlcnJvcic7IC8vIGRlZmF1bHQgbGV2ZWwKKworZnVuY3Rpb24gZmFjdG9yeShsZXZlbCkgeworICByZXR1cm4gZnVuY3Rpb24gKCkgeworICAgIC8vIGJldHRlciB1c2Ugc3ByZWFkIHN5bnRheCwgYnV0IGR1ZSB0byBjb21wYXRpYmlsaXR5LAorICAgIC8vIHVzZSBsZWdhY3kgbWV0aG9kIGhlcmUuCisgICAgdmFyIGFyZ3MgPSBbJ3RocmlmdDogWycgKyBsZXZlbCArICddICddLmNvbmNhdChBcnJheS5mcm9tKGFyZ3VtZW50cykpOworICAgIHJldHVybiBsb2dGdW5jKHV0aWwuZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3MpKTsKKyAgfTsKK30KKwordmFyIHRyYWNlID0gZGlzYWJsZWQ7Cit2YXIgZGVidWcgPSBkaXNhYmxlZDsKK3ZhciBlcnJvciA9IGRpc2FibGVkOwordmFyIHdhcm5pbmcgPSBkaXNhYmxlZDsKK3ZhciBpbmZvID0gZGlzYWJsZWQ7CisKK2V4cG9ydHMuc2V0TG9nRnVuYyA9IGZ1bmN0aW9uIChmdW5jKSB7CisgIGxvZ0Z1bmMgPSBmdW5jOworfTsKKwordmFyIHNldExvZ0xldmVsID0gZXhwb3J0cy5zZXRMb2dMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkgeworICB0cmFjZSA9IGRlYnVnID0gZXJyb3IgPSB3YXJuaW5nID0gaW5mbyA9IGRpc2FibGVkOworICBsb2dMZXZlbCA9IGxldmVsOworICBzd2l0Y2ggKGxvZ0xldmVsKSB7CisgIGNhc2UgJ3RyYWNlJzoKKyAgICB0cmFjZSA9IGZhY3RvcnkoJ1RSQUNFJyk7CisgIGNhc2UgJ2RlYnVnJzoKKyAgICBkZWJ1ZyA9IGZhY3RvcnkoJ0RFQlVHJyk7CisgIGNhc2UgJ2Vycm9yJzoKKyAgICBlcnJvciA9IGZhY3RvcnkoJ0VSUk9SJyk7CisgIGNhc2UgJ3dhcm5pbmcnOgorICAgIHdhcm5pbmcgPSBmYWN0b3J5KCdXQVJOJyk7CisgIGNhc2UgJ2luZm8nOgorICAgIGluZm8gPSBmYWN0b3J5KCdJTkZPJyk7CisgIH0KK307CisKKy8vIHNldCBkZWZhdWx0CitzZXRMb2dMZXZlbChsb2dMZXZlbCk7CisKK2V4cG9ydHMuZ2V0TG9nTGV2ZWwgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBsb2dMZXZlbDsKK307CisKK2V4cG9ydHMudHJhY2UgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0cmFjZS5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy5kZWJ1ZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGRlYnVnLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Cit9OworCitleHBvcnRzLmVycm9yID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZXJyb3IuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMud2FybmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHdhcm5pbmcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMuaW5mbyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGluZm8uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3Nvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I2MmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3Nvci5qcwpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKKworZXhwb3J0cy5NdWx0aXBsZXhlZFByb2Nlc3NvciA9IE11bHRpcGxleGVkUHJvY2Vzc29yOworCitmdW5jdGlvbiBNdWx0aXBsZXhlZFByb2Nlc3NvcihzdHJlYW0sIG9wdGlvbnMpIHsKKyAgdGhpcy5zZXJ2aWNlcyA9IHt9OworfTsKKworTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHJvdG90eXBlLnJlZ2lzdGVyUHJvY2Vzc29yID0gZnVuY3Rpb24obmFtZSwgaGFuZGxlcikgeworICB0aGlzLnNlcnZpY2VzW25hbWVdID0gaGFuZGxlcjsKK307CisKK011bHRpcGxleGVkUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oaW5wLCBvdXQpIHsKKyAgdmFyIGJlZ2luID0gaW5wLnJlYWRNZXNzYWdlQmVnaW4oKTsKKworICBpZiAoYmVnaW4ubXR5cGUgIT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgJiYgYmVnaW4ubXR5cGUgIT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbignVE11bHRpcGxleGVkUHJvY2Vzc29yOiBVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZScpOworICB9CisKKyAgdmFyIHAgPSBiZWdpbi5mbmFtZS5zcGxpdCgnOicpOworICB2YXIgc25hbWUgPSBwWzBdOworICB2YXIgZm5hbWUgPSBwWzFdOworCisgIGlmICghIChzbmFtZSBpbiB0aGlzLnNlcnZpY2VzKSkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbignVE11bHRpcGxleGVkUHJvY2Vzc29yOiBVbmtub3duIHNlcnZpY2U6ICcgKyBzbmFtZSk7CisgIH0KKworICAvL2NvbnN0cnVjdCBhIHByb3h5IG9iamVjdCB3aGljaCBzdHVicyB0aGUgcmVhZE1lc3NhZ2VCZWdpbgorICAvL2ZvciB0aGUgc2VydmljZQorICB2YXIgaW5wUHJveHkgPSB7fTsKKworICBmb3IgKHZhciBhdHRyIGluIGlucCkgeworICAgIGlucFByb3h5W2F0dHJdID0gaW5wW2F0dHJdOworICB9CisKKyAgaW5wUHJveHkucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB7CisgICAgICBmbmFtZTogZm5hbWUsCisgICAgICBtdHlwZTogYmVnaW4ubXR5cGUsCisgICAgICByc2VxaWQ6IGJlZ2luLnJzZXFpZAorICAgIH07CisgIH07CisKKyAgdGhpcy5zZXJ2aWNlc1tzbmFtZV0ucHJvY2VzcyhpbnBQcm94eSwgb3V0KTsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3OGFhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCitleHBvcnRzLk11bHRpcGxleGVyID0gTXVsdGlwbGV4ZXI7CisKK2Z1bmN0aW9uIFdyYXBwZXIoc2VydmljZU5hbWUsIHByb3RvY29sLCBjb25uZWN0aW9uKSB7CisKKyAgZnVuY3Rpb24gTXVsdGlwbGV4UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKSB7CisgICAgcHJvdG9jb2wuY2FsbCh0aGlzLCB0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOworICB9OworCisgIHV0aWwuaW5oZXJpdHMoTXVsdGlwbGV4UHJvdG9jb2wsIHByb3RvY29sKTsKKworICBNdWx0aXBsZXhQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgeworICAgIGlmICh0eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5DQUxMIHx8IHR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgeworICAgICAgY29ubmVjdGlvbi5zZXFJZDJTZXJ2aWNlW3NlcWlkXSA9IHNlcnZpY2VOYW1lOworICAgICAgTXVsdGlwbGV4UHJvdG9jb2wuc3VwZXJfLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbi5jYWxsKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgKyAiOiIgKyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQpOworICAgIH0gZWxzZSB7CisgICAgICBNdWx0aXBsZXhQcm90b2NvbC5zdXBlcl8ucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgc2VxaWQpOworICAgIH0KKyAgfTsKKworICByZXR1cm4gTXVsdGlwbGV4UHJvdG9jb2w7Cit9OworCitmdW5jdGlvbiBNdWx0aXBsZXhlcigpIHsKKyAgdGhpcy5zZXFpZCA9IDA7Cit9OworCitNdWx0aXBsZXhlci5wcm90b3R5cGUuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oc2VydmljZU5hbWUsIFNlcnZpY2VDbGllbnQsIGNvbm5lY3Rpb24pIHsKKyAgaWYgKFNlcnZpY2VDbGllbnQuQ2xpZW50KSB7CisgICAgU2VydmljZUNsaWVudCA9IFNlcnZpY2VDbGllbnQuQ2xpZW50OworICB9CisgIHZhciB3cml0ZUNiID0gZnVuY3Rpb24oYnVmLCBzZXFpZCkgeworICAgIGNvbm5lY3Rpb24ud3JpdGUoYnVmLHNlcWlkKTsKKyAgfTsKKyAgdmFyIHRyYW5zcG9ydCA9IG5ldyBjb25uZWN0aW9uLnRyYW5zcG9ydCh1bmRlZmluZWQsIHdyaXRlQ2IpOworICB2YXIgcHJvdG9jb2xXcmFwcGVyID0gbmV3IFdyYXBwZXIoc2VydmljZU5hbWUsIGNvbm5lY3Rpb24ucHJvdG9jb2wsIGNvbm5lY3Rpb24pOworICB2YXIgY2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQodHJhbnNwb3J0LCBwcm90b2NvbFdyYXBwZXIpOworICB2YXIgc2VsZiA9IHRoaXM7CisgIGNsaWVudC5uZXdfc2VxaWQgPSBmdW5jdGlvbigpIHsKKyAgICBzZWxmLnNlcWlkICs9IDE7CisgICAgcmV0dXJuIHNlbGYuc2VxaWQ7CisgIH07CisKKyAgaWYgKHR5cGVvZiBjb25uZWN0aW9uLmNsaWVudCAhPT0gJ29iamVjdCcpIHsKKyAgICBjb25uZWN0aW9uLmNsaWVudCA9IHt9OworICB9CisgIGNvbm5lY3Rpb24uY2xpZW50W3NlcnZpY2VOYW1lXSA9IGNsaWVudDsKKworICByZXR1cm4gY2xpZW50OworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBlYmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbW9kdWxlLmV4cG9ydHMuVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK21vZHVsZS5leHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKK21vZHVsZS5leHBvcnRzLlRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjRhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBjb25zdGFudHMgPSByZXF1aXJlKCdjb25zdGFudHMnKTsKK3ZhciBuZXQgPSByZXF1aXJlKCduZXQnKTsKK3ZhciB0bHMgPSByZXF1aXJlKCd0bHMnKTsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCisvKioKKyAqIENyZWF0ZSBhIFRocmlmdCBzZXJ2ZXIgd2hpY2ggY2FuIHNlcnZlIG9uZSBvciBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqIEBwYXJhbSB7b2JqZWN0fSBwcm9jZXNzb3IgLSBBIG5vcm1hbCBvciBtdWx0aXBsZXhlZFByb2Nlc3NvciAobXVzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHByZWNvbnN0cnVjdGVkIHdpdGggdGhlIGRlc2lyZWQgaGFuZGxlcikuCisgKiBAcGFyYW0ge1NlcnZlck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25hbCBhZGRpdGlvbmFsIHNlcnZlciBjb25maWd1cmF0aW9uLgorICogQHJldHVybnMge29iamVjdH0gLSBUaGUgQXBhY2hlIFRocmlmdCBNdWx0aXBsZXggU2VydmVyLgorICovCitleHBvcnRzLmNyZWF0ZU11bHRpcGxleFNlcnZlciA9IGZ1bmN0aW9uKHByb2Nlc3Nvciwgb3B0aW9ucykgeworICB2YXIgdHJhbnNwb3J0ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc3BvcnQpID8gb3B0aW9ucy50cmFuc3BvcnQgOiBUQnVmZmVyZWRUcmFuc3BvcnQ7CisgIHZhciBwcm90b2NvbCA9IChvcHRpb25zICYmIG9wdGlvbnMucHJvdG9jb2wpID8gb3B0aW9ucy5wcm90b2NvbCA6IFRCaW5hcnlQcm90b2NvbDsKKworICBmdW5jdGlvbiBzZXJ2ZXJJbXBsKHN0cmVhbSkgeworICAgIHZhciBzZWxmID0gdGhpczsKKyAgICBzdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpOworICAgIH0pOworICAgIHN0cmVhbS5vbignZGF0YScsIHRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRXaXRoRGF0YSkgeworICAgICAgdmFyIGlucHV0ID0gbmV3IHByb3RvY29sKHRyYW5zcG9ydFdpdGhEYXRhKTsKKyAgICAgIHZhciBvdXRwdXQgPSBuZXcgcHJvdG9jb2wobmV3IHRyYW5zcG9ydCh1bmRlZmluZWQsIGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtLndyaXRlKGJ1Zik7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7CisgICAgICAgICAgICBzdHJlYW0uZW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0pKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgZG8geworICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICAgIHRyYW5zcG9ydFdpdGhEYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICAgIH0gd2hpbGUgKHRydWUpOworICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgICAvL1RoZSBsYXN0IGRhdGEgaW4gdGhlIGJ1ZmZlciB3YXMgbm90IGEgY29tcGxldGUgbWVzc2FnZSwgd2FpdCBmb3IgdGhlIHJlc3QKKyAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXJyLm1lc3NhZ2UgPT09ICJJbnZhbGlkIHR5cGU6IHVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAvL05vIG1vcmUgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgLy9UaGlzIHRyYXAgaXMgYSBiaXQgaGFja2lzaAorICAgICAgICAgIC8vVGhlIG5leHQgc3RlcCB0byBpbXByb3ZlIHRoZSBub2RlIGJlaGF2aW9yIGhlcmUgaXMgdG8gaGF2ZQorICAgICAgICAgIC8vICB0aGUgY29tcGlsZXIgZ2VuZXJhdGVkIHByb2Nlc3MgbWV0aG9kIHRocm93IGEgbW9yZSBleHBsaWNpdAorICAgICAgICAgIC8vICBlcnJvciB3aGVuIHRoZSBuZXR3b3JrIGJ1ZmZlciBpcyBlbXB0eSAocmVnYXJkbGVzIG9mIHRoZQorICAgICAgICAgIC8vICBwcm90b2NvbC90cmFuc3BvcnQgc3RhY2sgaW4gdXNlKSBhbmQgcmVwbGFjZSB0aGlzIGhldXJpc3RpYy4KKyAgICAgICAgICAvLyAgQWxzbyB0cmFuc3BvcnRzIHNob3VsZCBwcm9iYWJseSBub3QgZm9yY2UgdXBwZXIgbGF5ZXJzIHRvCisgICAgICAgICAgLy8gIG1hbmFnZSB0aGVpciBidWZmZXIgcG9zaXRpb25zIChpLmUuIHJvbGxiYWNrUG9zaXRpb24oKSBhbmQKKyAgICAgICAgICAvLyAgY29tbWl0UG9zaXRpb24oKSBzaG91bGQgYmUgZWxpbWluYXRlZCBpbiBsaWV1IG9mIGEgdHJhbnNwb3J0CisgICAgICAgICAgLy8gIGVuY2Fwc3VsYXRlZCBidWZmZXIgbWFuYWdlbWVudCBzdHJhdGVneS4pCisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vVW5leHBlY3RlZCBlcnJvcgorICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpOworICAgICAgICAgIHN0cmVhbS5lbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pKTsKKworICAgIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24oKSB7CisgICAgICBzdHJlYW0uZW5kKCk7CisgICAgfSk7CisgIH0KKworICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRscykgeworICAgIGlmICghKCdzZWN1cmVQcm90b2NvbCcgaW4gb3B0aW9ucy50bHMpICYmICEoJ3NlY3VyZU9wdGlvbnMnIGluIG9wdGlvbnMudGxzKSkgeworICAgICAgb3B0aW9ucy50bHMuc2VjdXJlUHJvdG9jb2wgPSAiU1NMdjIzX21ldGhvZCI7CisgICAgICBvcHRpb25zLnRscy5zZWN1cmVPcHRpb25zID0gY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MiB8IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjM7CisgICAgfQorICAgIHJldHVybiB0bHMuY3JlYXRlU2VydmVyKG9wdGlvbnMudGxzLCBzZXJ2ZXJJbXBsKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmV0LmNyZWF0ZVNlcnZlcihzZXJ2ZXJJbXBsKTsKKyAgfQorfTsKKworLyoqCisgKiBDcmVhdGUgYSBzaW5nbGUgc2VydmljZSBBcGFjaGUgVGhyaWZ0IHNlcnZlci4KKyAqIEBwYXJhbSB7b2JqZWN0fSBwcm9jZXNzb3IgLSBBIHNlcnZpY2UgY2xhc3Mgb3IgcHJvY2Vzc29yIGZ1bmN0aW9uLgorICogQHBhcmFtIHtTZXJ2ZXJPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KKyAqIEByZXR1cm5zIHtvYmplY3R9IC0gVGhlIEFwYWNoZSBUaHJpZnQgTXVsdGlwbGV4IFNlcnZlci4KKyAqLworZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSBmdW5jdGlvbihwcm9jZXNzb3IsIGhhbmRsZXIsIG9wdGlvbnMpIHsKKyAgaWYgKHByb2Nlc3Nvci5Qcm9jZXNzb3IpIHsKKyAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3IuUHJvY2Vzc29yOworICB9CisgIHJldHVybiBleHBvcnRzLmNyZWF0ZU11bHRpcGxleFNlcnZlcihuZXcgcHJvY2Vzc29yKGhhbmRsZXIpLCBvcHRpb25zKTsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvdGhyaWZ0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RocmlmdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmIyODk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RocmlmdC5qcwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7CisKK3ZhciBUeXBlID0gZXhwb3J0cy5UeXBlID0geworICBTVE9QOiAwLAorICBWT0lEOiAxLAorICBCT09MOiAyLAorICBCWVRFOiAzLAorICBJMDg6IDMsCisgIERPVUJMRTogNCwKKyAgSTE2OiA2LAorICBJMzI6IDgsCisgIEk2NDogMTAsCisgIFNUUklORzogMTEsCisgIFVURjc6IDExLAorICBTVFJVQ1Q6IDEyLAorICBNQVA6IDEzLAorICBTRVQ6IDE0LAorICBMSVNUOiAxNSwKKyAgVVRGODogMTYsCisgIFVURjE2OiAxNworfTsKKworZXhwb3J0cy5NZXNzYWdlVHlwZSA9IHsKKyAgQ0FMTDogMSwKKyAgUkVQTFk6IDIsCisgIEVYQ0VQVElPTjogMywKKyAgT05FV0FZOiA0Cit9OworCitleHBvcnRzLlRFeGNlcHRpb24gPSBURXhjZXB0aW9uOworCitmdW5jdGlvbiBURXhjZXB0aW9uKG1lc3NhZ2UpIHsKKyAgRXJyb3IuY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKK307Cit1dGlsLmluaGVyaXRzKFRFeGNlcHRpb24sIEVycm9yKTsKKwordmFyIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSBleHBvcnRzLlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSB7CisgIFVOS05PV046IDAsCisgIFVOS05PV05fTUVUSE9EOiAxLAorICBJTlZBTElEX01FU1NBR0VfVFlQRTogMiwKKyAgV1JPTkdfTUVUSE9EX05BTUU6IDMsCisgIEJBRF9TRVFVRU5DRV9JRDogNCwKKyAgTUlTU0lOR19SRVNVTFQ6IDUsCisgIElOVEVSTkFMX0VSUk9SOiA2LAorICBQUk9UT0NPTF9FUlJPUjogNywKKyAgSU5WQUxJRF9UUkFOU0ZPUk06IDgsCisgIElOVkFMSURfUFJPVE9DT0w6IDksCisgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOiAxMAorfTsKKworZXhwb3J0cy5UQXBwbGljYXRpb25FeGNlcHRpb24gPSBUQXBwbGljYXRpb25FeGNlcHRpb247CisKK2Z1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgIFRFeGNlcHRpb24uY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgIHRoaXMudHlwZSA9IHR5cGUgfHwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OwordXRpbC5pbmhlcml0cyhUQXBwbGljYXRpb25FeGNlcHRpb24sIFRFeGNlcHRpb24pOworCitUQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCkgeworICB2YXIgZnR5cGU7CisgIHZhciByZXQgPSBpbnB1dC5yZWFkU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgIHdoaWxlKDEpeworICAgICAgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgIGlmKHJldC5mdHlwZSA9PSBUeXBlLlNUT1ApCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIHN3aXRjaChyZXQuZmlkKXsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5TVFJJTkcgKXsKKyAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJldDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5JMzIgKXsKKyAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHJldDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldCAgID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKyAgfQorICBpbnB1dC5yZWFkU3RydWN0RW5kKCk7Cit9OworCitUQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KXsKKyAgb3V0cHV0LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgIGlmICh0aGlzLm1lc3NhZ2UpIHsKKyAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUeXBlLlNUUklORywgMSk7CisgICAgICBvdXRwdXQud3JpdGVTdHJpbmcodGhpcy5tZXNzYWdlKTsKKyAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CisgIH0KKworICBpZiAodGhpcy5jb2RlKSB7CisgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVHlwZS5JMzIsIDIpOworICAgICAgb3V0cHV0LndyaXRlSTMyKHRoaXMuY29kZSk7CisgICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpOworICB9CisKKyAgb3V0cHV0LndyaXRlRmllbGRTdG9wKCk7CisgIG91dHB1dC53cml0ZVN0cnVjdEVuZCgpOworfTsKKwordmFyIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSBleHBvcnRzLlRQcm90b2NvbEV4Y2VwdGlvblR5cGUgPSB7CisgIFVOS05PV046IDAsCisgIElOVkFMSURfREFUQTogMSwKKyAgTkVHQVRJVkVfU0laRTogMiwKKyAgU0laRV9MSU1JVDogMywKKyAgQkFEX1ZFUlNJT046IDQsCisgIE5PVF9JTVBMRU1FTlRFRDogNSwKKyAgREVQVEhfTElNSVQ6IDYKK307CisKKworZXhwb3J0cy5UUHJvdG9jb2xFeGNlcHRpb24gPSBUUHJvdG9jb2xFeGNlcHRpb247CisKK2Z1bmN0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgIEVycm9yLmNhbGwodGhpcyk7CisgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMudHlwZSA9IHR5cGU7CisgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OwordXRpbC5pbmhlcml0cyhUUHJvdG9jb2xFeGNlcHRpb24sIEVycm9yKTsKKworZXhwb3J0cy5vYmplY3RMZW5ndGggPSBmdW5jdGlvbihvYmopIHsKKyAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoOworfTsKKworZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yKSB7CisgIHV0aWwuaW5oZXJpdHMoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IpOworfTsKKwordmFyIGNvcHlMaXN0LCBjb3B5TWFwOworCitjb3B5TGlzdCA9IGZ1bmN0aW9uKGxzdCwgdHlwZXMpIHsKKworICBpZiAoIWxzdCkge3JldHVybiBsc3Q7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciBsZW4gPSBsc3QubGVuZ3RoLCByZXN1bHQgPSBbXSwgaSwgdmFsOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICB2YWwgPSBsc3RbaV07CisgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHZhbCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlKHZhbCkpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworY29weU1hcCA9IGZ1bmN0aW9uKG9iaiwgdHlwZXMpeworCisgIGlmICghb2JqKSB7cmV0dXJuIG9iajsgfQorCisgIHZhciB0eXBlOworCisgIGlmICh0eXBlcy5zaGlmdCA9PT0gdW5kZWZpbmVkKSB7CisgICAgdHlwZSA9IHR5cGVzOworICB9CisgIGVsc2UgeworICAgIHR5cGUgPSB0eXBlc1swXTsKKyAgfQorICB2YXIgVHlwZSA9IHR5cGU7CisKKyAgdmFyIHJlc3VsdCA9IHt9LCB2YWw7CisgIGZvcih2YXIgcHJvcCBpbiBvYmopIHsKKyAgICBpZihvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgIHZhbCA9IG9ialtwcm9wXTsKKyAgICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gdHlwZSh2YWwsIHR5cGVzLnNsaWNlKDEpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHRbcHJvcF0gPSBuZXcgVHlwZSh2YWwpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworbW9kdWxlLmV4cG9ydHMuY29weU1hcCA9IGNvcHlNYXA7Cittb2R1bGUuZXhwb3J0cy5jb3B5TGlzdCA9IGNvcHlMaXN0OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkYWE5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCittb2R1bGUuZXhwb3J0cy5UQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOworbW9kdWxlLmV4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworbW9kdWxlLmV4cG9ydHMuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzZjQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCkBAIC0wLDAgKzEsNTY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTsKK3ZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7Cit2YXIgdXJsID0gcmVxdWlyZSgidXJsIik7Cit2YXIgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKK3ZhciBmcyA9IHJlcXVpcmUoImZzIik7Cit2YXIgY3J5cHRvID0gcmVxdWlyZSgiY3J5cHRvIik7Cit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKKwordmFyIE11bHRpcGxleGVkUHJvY2Vzc29yID0gcmVxdWlyZSgnLi9tdWx0aXBsZXhlZF9wcm9jZXNzb3InKS5NdWx0aXBsZXhlZFByb2Nlc3NvcjsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCisvLyBXU0ZyYW1lIGNvbnN0cnVjdG9yIGFuZCBwcm90b3R5cGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKiogQXBhY2hlIFRocmlmdCBSUEMgV2ViIFNvY2tldCBUcmFuc3BvcnQKKyAqICBGcmFtZSBsYXlvdXQgY29uZm9ybWluZyB0byBSRkMgNjQ1NSBjaXJjYSAxMi8yMDExCisgKgorICogVGhlb3JldGljYWwgZnJhbWUgc2l6ZSBsaW1pdCBpcyA0R0IqNEdCLCBob3dldmVyIHRoZSBOb2RlIEJ1ZmZlcgorICogbGltaXQgaXMgMUdCIGFzIG9mIHYwLjEwLiBUaGUgZnJhbWUgbGVuZ3RoIGVuY29kaW5nIGlzIGFsc28KKyAqIGNvbmZpZ3VyZWQgZm9yIGEgbWF4IG9mIDRHQiBwcmVzZW50bHkgYW5kIG5lZWRzIHRvIGJlIGFkanVzdGVkCisgKiBpZiBOb2RlL0Jyb3dzZXJzIGJlY29tZSBjYXBhYmlsZSBvZiA+IDRHQiBmcmFtZXMuCisgKgorICogIC0gRklOIGlzIDEgaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxldGUKKyAqICAtIFJTVjEvMi8zIGFyZSBhbHdheXMgMAorICogIC0gT3Bjb2RlIGlzIDEoVEVYVCkgZm9yIFRKU09OUHJvdG9jb2wgYW5kIDIoQklOKSBmb3IgVEJpbmFyeVByb3RvY29sCisgKiAgLSBNYXNrIFByZXNlbnQgYml0IGlzIDEgc2VuZGluZyB0by1zZXJ2ZXIgYW5kIDAgc2VuZGluZyB0by1jbGllbnQKKyAqICAtIFBheWxvYWQgTGVuOgorICogICAgICAgICsgSWYgPCAxMjY6IHRoZW4gcmVwcmVzZW50ZWQgZGlyZWN0bHkKKyAqICAgICAgICArIElmID49MTI2OiBidXQgd2l0aGluIHJhbmdlIG9mIGFuIHVuc2lnbmVkIDE2IGJpdCBpbnRlZ2VyCisgKiAgICAgICAgICAgICB0aGVuIFBheWxvYWQgTGVuIGlzIDEyNiBhbmQgdGhlIHR3byBmb2xsb3dpbmcgYnl0ZXMgc3RvcmUKKyAqICAgICAgICAgICAgIHRoZSBsZW5ndGgKKyAqICAgICAgICArIEVsc2U6IFBheWxvYWQgTGVuIGlzIDEyNyBhbmQgdGhlIGZvbGxvd2luZyA4IGJ5dGVzIHN0b3JlIHRoZQorICogICAgICAgICAgICAgbGVuZ3RoIGFzIGFuIHVuc2lnbmVkIDY0IGJpdCBpbnRlZ2VyCisgKiAgLSBNYXNraW5nIGtleSBpcyBhIDMyIGJpdCBrZXkgb25seSBwcmVzZW50IHdoZW4gc2VuZGluZyB0byB0aGUgc2VydmVyCisgKiAgLSBQYXlsb2FkIGZvbGxvd3MgdGhlIG1hc2tpbmcga2V5IG9yIGxlbmd0aAorICoKKyAqICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiAgICArLSstKy0rLSstLS0tLS0tKy0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfEZ8UnxSfFJ8IG9wY29kZXxNfCBQYXlsb2FkIGxlbiB8ICAgIEV4dGVuZGVkIHBheWxvYWQgbGVuZ3RoICAgIHwKKyAqICAgIHxJfFN8U3xTfCAgKDQpICB8QXwgICAgICg3KSAgICAgfCAgICAgICAgICAgICAoMTYvNjQpICAgICAgICAgICB8CisgKiAgICB8TnxWfFZ8VnwgICAgICAgfFN8ICAgICAgICAgICAgIHwgICAoaWYgcGF5bG9hZCBsZW49PTEyNi8xMjcpICAgfAorICogICAgfCB8MXwyfDN8ICAgICAgIHxLfCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0tLS0tLS0rLSstLS0tLS0tLS0tLS0tKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArCisgKiAgICB8ICAgICBFeHRlbmRlZCBwYXlsb2FkIGxlbmd0aCBjb250aW51ZWQsIGlmIHBheWxvYWQgbGVuID09IDEyNyAgfAorICogICAgKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE1hc2tpbmcta2V5LCBpZiBNQVNLIHNldCB0byAxICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCBNYXNraW5nLWtleSAoY29udGludWVkKSAgICAgICB8ICAgICAgICAgIFBheWxvYWQgRGF0YSAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArCisgKiAgICA6ICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZCBEYXRhIGNvbnRpbnVlZCAuLi4gICAgICAgICAgICAgICAgOgorICogICAgKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkIERhdGEgY29udGludWVkIC4uLiAgICAgICAgICAgICAgICB8CisgKiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICovCit2YXIgd3NGcmFtZSA9IHsKKyAgLyoqIEVuY29kZXMgYSBXZWJTb2NrZXQgZnJhbWUKKyAgICoKKyAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBUaGUgcmF3IGRhdGEgdG8gZW5jb2RlCisgICAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIC0gVGhlIG1hc2sgdG8gYXBwbHkgd2hlbiBzZW5kaW5nIHRvIHNlcnZlciwgbnVsbCBmb3Igbm8gbWFzaworICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJpbkVuY29kaW5nIC0gVHJ1ZSBmb3IgYmluYXJ5IGVuY29kaW5nLCBmYWxzZSBmb3IgdGV4dCBlbmNvZGluZworICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIFRoZSBXZWJTb2NrZXQgZnJhbWUsIHJlYWR5IHRvIHNlbmQKKyAgICovCisgIGVuY29kZTogZnVuY3Rpb24oZGF0YSwgbWFzaywgYmluRW5jb2RpbmcpIHsKKyAgICAgIHZhciBmcmFtZSA9IG5ldyBCdWZmZXIod3NGcmFtZS5mcmFtZVNpemVGcm9tRGF0YShkYXRhLCBtYXNrKSk7CisgICAgICAvL0J5dGUgMCAtIEZJTiAmIE9QQ09ERQorICAgICAgZnJhbWVbMF0gPSB3c0ZyYW1lLmZpbi5GSU4gKworICAgICAgICAgIChiaW5FbmNvZGluZyA/IHdzRnJhbWUuZnJhbWVPcENvZGVzLkJJTiA6IHdzRnJhbWUuZnJhbWVPcENvZGVzLlRFWFQpOworICAgICAgLy9CeXRlIDEgb3IgMS0zIG9yIDEtOSAtIE1BU0sgRkxBRyAmIFNJWkUKKyAgICAgIHZhciBwYXlsb2FkT2Zmc2V0ID0gMjsKKyAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDB4N0UpIHsKKyAgICAgICAgZnJhbWVbMV0gPSBkYXRhLmxlbmd0aCArIChtYXNrID8gd3NGcmFtZS5tYXNrLlRPX1NFUlZFUiA6IHdzRnJhbWUubWFzay5UT19DTElFTlQpOworICAgICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCA8IDB4RkZGRikgeworICAgICAgICBmcmFtZVsxXSA9IDB4N0UgKyAobWFzayA/IHdzRnJhbWUubWFzay5UT19TRVJWRVIgOiB3c0ZyYW1lLm1hc2suVE9fQ0xJRU5UKTsKKyAgICAgICAgZnJhbWUud3JpdGVVSW50MTZCRShkYXRhLmxlbmd0aCwgMiwgdHJ1ZSk7CisgICAgICAgIHBheWxvYWRPZmZzZXQgPSA0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWVbMV0gPSAweDdGICsgKG1hc2sgPyB3c0ZyYW1lLm1hc2suVE9fU0VSVkVSIDogd3NGcmFtZS5tYXNrLlRPX0NMSUVOVCk7CisgICAgICAgIGZyYW1lLndyaXRlVUludDMyQkUoMCwgMiwgdHJ1ZSk7CisgICAgICAgIGZyYW1lLndyaXRlVUludDMyQkUoZGF0YS5sZW5ndGgsIDYsIHRydWUpOworICAgICAgICBwYXlsb2FkT2Zmc2V0ID0gMTA7CisgICAgICB9CisgICAgICAvL01BU0sKKyAgICAgIGlmIChtYXNrKSB7CisgICAgICAgIG1hc2suY29weShmcmFtZSwgcGF5bG9hZE9mZnNldCwgMCwgNCk7CisgICAgICAgIHBheWxvYWRPZmZzZXQgKz0gNDsKKyAgICAgIH0KKyAgICAgIC8vUGF5bG9hZAorICAgICAgZGF0YS5jb3B5KGZyYW1lLCBwYXlsb2FkT2Zmc2V0KTsKKyAgICAgIGlmIChtYXNrKSB7CisgICAgICAgIHdzRnJhbWUuYXBwbHlNYXNrKGZyYW1lLnNsaWNlKHBheWxvYWRPZmZzZXQpLCBmcmFtZS5zbGljZShwYXlsb2FkT2Zmc2V0LTQscGF5bG9hZE9mZnNldCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGZyYW1lOworICB9LAorCisgIC8qKgorICAgKiBAY2xhc3MKKyAgICogQG5hbWUgV1NEZWNvZGVSZXN1bHQKKyAgICogQHByb3BlcnR5IHtCdWZmZXJ9IGRhdGEgLSBUaGUgZGVjb2RlZCBkYXRhIGZvciB0aGUgZmlyc3QgQVRSUEMgbWVzc2FnZQorICAgKiBAcHJvcGVydHkge0J1ZmZlcn0gbWFzayAtIFRoZSBmcmFtZSBtYXNrCisgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gYmluRW5jb2RpbmcgLSBUcnVlIGlmIGJpbmFyeSAoVEJpbmFyeVByb3RvY29sKSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIGlmIHRleHQgKFRKU09OUHJvdG9jb2wpCisgICAqIEBwcm9wZXJ0eSB7QnVmZmVyfSBuZXh0RnJhbWUgLSBNdWx0aXBsZSBBVFJQQyBtZXNzYWdlcyBtYXkgYmUgc2VudCBpbiBhCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgV2ViU29ja2V0IGZyYW1lLCB0aGlzIEJ1ZmZlciBjb250YWlucworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55IGJ5dGVzIHJlbWFpbmluZyB0byBiZSBkZWNvZGVkCisgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gRklOIC0gVHJ1ZSBpcyB0aGUgbWVzc2FnZSBpcyBjb21wbGV0ZQorICAgKi8KKworICAgLyoqIERlY29kZXMgYSBXZWJTb2NrZXQgZnJhbWUKKyAgICoKKyAgICogQHBhcmFtIHtCdWZmZXJ9IGZyYW1lIC0gVGhlIHJhdyBpbmJvdW5kIGZyYW1lLCBpZiB0aGlzIGlzIGEgY29udGludWF0aW9uCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGl0IG11c3QgaGF2ZSBhIG1hc2sgcHJvcGVydHkgd2l0aCB0aGUgbWFzay4KKyAgICogQHJldHVybnMge1dTRGVjb2RlUmVzdWx0fSAtIFRoZSBkZWNvZGVkIHBheWxvYWQKKyAgICoKKyAgICogQHNlZSB7QGxpbmsgV1NEZWNvZGVSZXN1bHR9CisgICAqLworICBkZWNvZGU6IGZ1bmN0aW9uKGZyYW1lKSB7CisgICAgICB2YXIgcmVzdWx0ID0geworICAgICAgICBkYXRhOiBudWxsLAorICAgICAgICBtYXNrOiBudWxsLAorICAgICAgICBiaW5FbmNvZGluZzogZmFsc2UsCisgICAgICAgIG5leHRGcmFtZTogbnVsbCwKKyAgICAgICAgRklOOiB0cnVlCisgICAgICB9OworCisgICAgICAvL0J5dGUgMCAtIEZJTiAmIE9QQ09ERQorICAgICAgaWYgKHdzRnJhbWUuZmluLkZJTiAhPSAoZnJhbWVbMF0gJiB3c0ZyYW1lLmZpbi5GSU4pKSB7CisgICAgICAgIHJlc3VsdC5GSU4gPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5iaW5FbmNvZGluZyA9ICh3c0ZyYW1lLmZyYW1lT3BDb2Rlcy5CSU4gPT0gKGZyYW1lWzBdICYgd3NGcmFtZS5mcmFtZU9wQ29kZXMuQklOKSk7CisgICAgICAvL0J5dGUgMSBvciAxLTMgb3IgMS05IC0gU0laRQorICAgICAgdmFyIGxlbkJ5dGUgPSAoZnJhbWVbMV0gJiAweDAwMDAwMDdGKTsKKyAgICAgIHZhciBsZW4gPSBsZW5CeXRlOworICAgICAgdmFyIGRhdGFPZmZzZXQgPSAyOworICAgICAgaWYgKGxlbkJ5dGUgPT0gMHg3RSkgeworICAgICAgICBsZW4gPSBmcmFtZS5yZWFkVUludDE2QkUoMik7CisgICAgICAgIGRhdGFPZmZzZXQgPSA0OworICAgICAgfSBlbHNlIGlmIChsZW5CeXRlID09IDB4N0YpIHsKKyAgICAgICAgbGVuID0gZnJhbWUucmVhZFVJbnQzMkJFKDYpOworICAgICAgICBkYXRhT2Zmc2V0ID0gMTA7CisgICAgICB9CisgICAgICAvL01BU0sKKyAgICAgIGlmICh3c0ZyYW1lLm1hc2suVE9fU0VSVkVSID09IChmcmFtZVsxXSAmIHdzRnJhbWUubWFzay5UT19TRVJWRVIpKSB7CisgICAgICAgIHJlc3VsdC5tYXNrID0gbmV3IEJ1ZmZlcig0KTsKKyAgICAgICAgZnJhbWUuY29weShyZXN1bHQubWFzaywgMCwgZGF0YU9mZnNldCwgZGF0YU9mZnNldCArIDQpOworICAgICAgICBkYXRhT2Zmc2V0ICs9IDQ7CisgICAgICB9CisgICAgICAvL1BheWxvYWQKKyAgICAgIHJlc3VsdC5kYXRhID0gbmV3IEJ1ZmZlcihsZW4pOworICAgICAgZnJhbWUuY29weShyZXN1bHQuZGF0YSwgMCwgZGF0YU9mZnNldCwgZGF0YU9mZnNldCtsZW4pOworICAgICAgaWYgKHJlc3VsdC5tYXNrKSB7CisgICAgICAgIHdzRnJhbWUuYXBwbHlNYXNrKHJlc3VsdC5kYXRhLCByZXN1bHQubWFzayk7CisgICAgICB9CisgICAgICAvL05leHQgRnJhbWUKKyAgICAgIGlmIChmcmFtZS5sZW5ndGggPiBkYXRhT2Zmc2V0K2xlbikgeworICAgICAgICByZXN1bHQubmV4dEZyYW1lID0gbmV3IEJ1ZmZlcihmcmFtZS5sZW5ndGggLSAoZGF0YU9mZnNldCtsZW4pKTsKKyAgICAgICAgZnJhbWUuY29weShyZXN1bHQubmV4dEZyYW1lLCAwLCBkYXRhT2Zmc2V0K2xlbiwgZnJhbWUubGVuZ3RoKTsKKyAgICAgIH0KKyAgICAgIC8vRG9uJ3QgZm9yd2FyZCBjb250cm9sIGZyYW1lcworICAgICAgaWYgKGZyYW1lWzBdICYgd3NGcmFtZS5mcmFtZU9wQ29kZXMuRklOQ1RSTCkgeworICAgICAgICByZXN1bHQuZGF0YSA9IG51bGw7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgLyoqIE1hc2tzL1VubWFza3MgZGF0YQorICAgKgorICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIGRhdGEgdG8gbWFzay91bm1hc2sgaW4gcGxhY2UKKyAgICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgLSB0aGUgbWFzaworICAgKi8KKyAgYXBwbHlNYXNrOiBmdW5jdGlvbihkYXRhLCBtYXNrKXsKKyAgICAvL1RPRE86IGxvb2sgaW50byB4b3Jpbmcgd29yZHMgYXQgYSB0aW1lCisgICAgdmFyIGRhdGFMZW4gPSBkYXRhLmxlbmd0aDsKKyAgICB2YXIgbWFza0xlbiA9IG1hc2subGVuZ3RoOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbjsgaSsrKSB7CisgICAgICBkYXRhW2ldID0gZGF0YVtpXSBeIG1hc2tbaSVtYXNrTGVuXTsKKyAgICB9CisgIH0sCisKKyAgLyoqIENvbXB1dGVzIGZyYW1lIHNpemUgb24gdGhlIHdpcmUgZnJvbSBkYXRhIHRvIGJlIHNlbnQKKyAgICoKKyAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBkYXRhLmxlbmd0aCBpcyB0aGUgYXNzdW1lZCBwYXlsb2FkIHNpemUKKyAgICogQHBhcmFtIHtCb29sZWFufSBtYXNrIC0gdHJ1ZSBpZiBhIG1hc2sgd2lsbCBiZSBzZW50IChUT19TRVJWRVIpCisgICAqLworICBmcmFtZVNpemVGcm9tRGF0YTogZnVuY3Rpb24oZGF0YSwgbWFzaykgeworICAgIHZhciBoZWFkZXJTaXplID0gMTA7CisgICAgaWYgKGRhdGEubGVuZ3RoIDwgMHg3RSkgeworICAgICAgaGVhZGVyU2l6ZSA9IDI7CisgICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCA8IDB4RkZGRikgeworICAgICAgaGVhZGVyU2l6ZSA9IDQ7CisgICAgfQorICAgIHJldHVybiBoZWFkZXJTaXplICsgZGF0YS5sZW5ndGggKyAobWFzayA/IDQgOiAwKTsKKyAgfSwKKworICBmcmFtZU9wQ29kZXM6IHsKKyAgICBDT05UOiAgICAgMHgwMCwKKyAgICBURVhUOiAgICAgMHgwMSwKKyAgICBCSU46ICAgICAgMHgwMiwKKyAgICBDVFJMOiAgICAgMHg4MAorICB9LAorCisgIG1hc2s6IHsKKyAgICBUT19TRVJWRVI6IDB4ODAsCisgICAgVE9fQ0xJRU5UOiAweDAwCisgIH0sCisKKyAgZmluOiB7CisgICAgQ09OVDogMHgwMCwKKyAgICBGSU46IDB4ODAKKyAgfQorfTsKKworCisvLyBjcmVhdGVXZWJTZXJ2ZXIgY29uc3RydWN0b3IgYW5kIG9wdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgU2VydmVyT3B0aW9ucworICogQHByb3BlcnR5IHthcnJheX0gY29ycyAtIEFycmF5IG9mIENPUlMgb3JpZ2luIHN0cmluZ3MgdG8gcGVybWl0IHJlcXVlc3RzIGZyb20uCisgKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZXMgLSBQYXRoIHRvIHNlcnZlIHN0YXRpYyBmaWxlcyBmcm9tLCBpZiBhYnNlbnQgb3IgIiIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBmaWxlIHNlcnZpY2UgaXMgZGlzYWJsZWQuCisgKiBAcHJvcGVydHkge29iamVjdH0gaGVhZGVycyAtIEFuIG9iamVjdCBoYXNoIG1hcHBpbmcgaGVhZGVyIHN0cmluZ3MgdG8gaGVhZGVyIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MsIHRoZXNlIGhlYWRlcnMgYXJlIHRyYW5zbWl0dGVkIGluIHJlc3BvbnNlIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBmaWxlIEdFVCBvcGVyYXRpb25zLgorICogQHByb3BlcnR5IHtvYmplY3R9IHNlcnZpY2VzIC0gQW4gb2JqZWN0IGhhc2ggbWFwcGluZyBzZXJ2aWNlIFVSSSBzdHJpbmdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBTZXJ2aWNlT3B0aW9ucyBvYmplY3RzCisgKiBAcHJvcGVydHkge29iamVjdH0gdGxzIC0gTm9kZS5qcyBUTFMgb3B0aW9ucyAoc2VlOiBub2RlanMub3JnL2FwaS90bHMuaHRtbCksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHByZXNlbnQgb3IgbnVsbCByZWd1bGFyIGh0dHAgaXMgdXNlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBsZWFzdCBhIGtleSBhbmQgYSBjZXJ0IG11c3QgYmUgZGVmaW5lZCB0byB1c2UgU1NML1RMUworICogQHNlZSB7QGxpbmsgU2VydmljZU9wdGlvbnN9CisgKi8KKworLyoqCisgKiBAY2xhc3MKKyAqIEBuYW1lIFNlcnZpY2VPcHRpb25zCisgKiBAcHJvcGVydHkge29iamVjdH0gdHJhbnNwb3J0IC0gVGhlIGxheWVyZWQgdHJhbnNwb3J0IHRvIHVzZSAoZGVmYXVsdHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUQnVmZmVyZWRUcmFuc3BvcnQpLgorICogQHByb3BlcnR5IHtvYmplY3R9IHByb3RvY29sIC0gVGhlIHNlcmlhbGl6YXRpb24gUHJvdG9jb2wgdG8gdXNlIChkZWZhdWx0cyB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwcm9jZXNzb3IgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgY2xhc3MvcHJvY2Vzc29yIGdlbmVyYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBJREwgQ29tcGlsZXIgZm9yIHRoZSBzZXJ2aWNlICh0aGUgImNscyIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgY2FuIGFsc28gYmUgdXNlZCBmb3IgdGhpcyBhdHRyaWJ1dGUpLgorICogQHByb3BlcnR5IHtvYmplY3R9IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBtZXRob2RzIGZvciB0aGUgVGhyaWZ0IFNlcnZpY2UuCisgKi8KKworLyoqCisgKiBDcmVhdGUgYSBUaHJpZnQgc2VydmVyIHdoaWNoIGNhbiBzZXJ2ZSBzdGF0aWMgZmlsZXMgYW5kL29yIG9uZSBvcgorICogbW9yZSBUaHJpZnQgU2VydmljZXMuCisgKiBAcGFyYW0ge1NlcnZlck9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBBcGFjaGUgVGhyaWZ0IFdlYiBTZXJ2ZXIuCisgKi8KK2V4cG9ydHMuY3JlYXRlV2ViU2VydmVyID0gZnVuY3Rpb24ob3B0aW9ucykgeworICB2YXIgYmFzZURpciA9IG9wdGlvbnMuZmlsZXM7CisgIHZhciBjb250ZW50VHlwZXNCeUV4dGVuc2lvbiA9IHsKKyAgICAnLnR4dCc6ICd0ZXh0L3BsYWluJywKKyAgICAnLmh0bWwnOiAndGV4dC9odG1sJywKKyAgICAnLmNzcyc6ICd0ZXh0L2NzcycsCisgICAgJy54bWwnOiAnYXBwbGljYXRpb24veG1sJywKKyAgICAnLmpzb24nOiAnYXBwbGljYXRpb24vanNvbicsCisgICAgJy5qcyc6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JywKKyAgICAnLmpwZyc6ICdpbWFnZS9qcGVnJywKKyAgICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsCisgICAgJy5naWYnOiAnaW1hZ2UvZ2lmJywKKyAgICAnLnBuZyc6ICdpbWFnZS9wbmcnLAorICAgICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnCisgIH07CisKKyAgLy9TZXR1cCBhbGwgb2YgdGhlIHNlcnZpY2VzCisgIHZhciBzZXJ2aWNlcyA9IG9wdGlvbnMuc2VydmljZXM7CisgIGZvciAodmFyIHVyaSBpbiBzZXJ2aWNlcykgeworICAgIHZhciBzdmNPYmogPSBzZXJ2aWNlc1t1cmldOworCisgICAgLy9TZXR1cCB0aGUgcHJvY2Vzc29yCisgICAgaWYgKHN2Y09iai5wcm9jZXNzb3IgaW5zdGFuY2VvZiBNdWx0aXBsZXhlZFByb2Nlc3NvcikgeworICAgICAgLy9NdWx0aXBsZXggcHJvY2Vzc29ycyBoYXZlIHByZSBlbWJlZGRlZCBwcm9jZXNzb3IvaGFuZGxlciBwYWlycywgc2F2ZSBhcyBpcworICAgICAgc3ZjT2JqLnByb2Nlc3NvciA9IHN2Y09iai5wcm9jZXNzb3I7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vRm9yIGhpc3RvcmljYWwgcmVhc29ucyBOb2RlLmpzIHN1cHBvcnRzIHByb2Nlc3NvcnMgcGFzc2VkIGluIGRpcmVjdGx5IG9yIHZpYSB0aGUKKyAgICAgIC8vICBJREwgQ29tcGlsZXIgZ2VuZXJhdGVkIGNsYXNzIGhvdXNpbmcgdGhlIHByb2Nlc3Nvci4gQWxzbywgdGhlIG9wdGlvbnMgcHJvcGVydHkKKyAgICAgIC8vICBmb3IgYSBQcm9jZXNzb3IgaGFzIGJlZW4gY2FsbGVkIGJvdGggY2xzIGFuZCBwcm9jZXNzb3IgYXQgZGlmZmVyZW50IHRpbWVzLiBXZQorICAgICAgLy8gIHN1cHBvcnQgYW55IG9mIHRoZSBmb3VyIHBvc3NpYmlsaXRpZXMgaGVyZS4KKyAgICAgIHZhciBwcm9jZXNzb3IgPSAoc3ZjT2JqLnByb2Nlc3NvcikgPyAoc3ZjT2JqLnByb2Nlc3Nvci5Qcm9jZXNzb3IgfHwgc3ZjT2JqLnByb2Nlc3NvcikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdmNPYmouY2xzLlByb2Nlc3NvciB8fCBzdmNPYmouY2xzKTsKKyAgICAgIC8vUHJvY2Vzc29ycyBjYW4gYmUgc3VwcGxpZWQgYXMgY29uc3RydWN0ZWQgb2JqZWN0cyB3aXRoIGhhbmRsZXJzIGFscmVhZHkgZW1iZWRkZWQsCisgICAgICAvLyAgaWYgYSBoYW5kbGVyIGlzIHByb3ZpZGVkIHdlIGNvbnN0cnVjdCBhIG5ldyBwcm9jZXNzb3IsIGlmIG5vdCB3ZSB1c2UgdGhlIHByb2Nlc3NvcgorICAgICAgLy8gIG9iamVjdCBkaXJlY3RseQorICAgICAgaWYgKHN2Y09iai5oYW5kbGVyKSB7CisgICAgICAgIHN2Y09iai5wcm9jZXNzb3IgPSBuZXcgcHJvY2Vzc29yKHN2Y09iai5oYW5kbGVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN2Y09iai5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICB9CisgICAgfQorICAgIHN2Y09iai50cmFuc3BvcnQgPSBzdmNPYmoudHJhbnNwb3J0ID8gc3ZjT2JqLnRyYW5zcG9ydCA6IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgICBzdmNPYmoucHJvdG9jb2wgPSBzdmNPYmoucHJvdG9jb2wgPyBzdmNPYmoucHJvdG9jb2wgOiBUQmluYXJ5UHJvdG9jb2w7CisgIH0KKworICAvL1ZlcmlmeSBDT1JTIHJlcXVpcmVtZW50cworICBmdW5jdGlvbiBWZXJpZnlDT1JTQW5kU2V0SGVhZGVycyhyZXF1ZXN0LCByZXNwb25zZSkgeworICAgIGlmIChyZXF1ZXN0LmhlYWRlcnMub3JpZ2luICYmIG9wdGlvbnMuY29ycykgeworICAgICAgaWYgKG9wdGlvbnMuY29yc1siKiJdIHx8IG9wdGlvbnMuY29yc1tyZXF1ZXN0LmhlYWRlcnMub3JpZ2luXSkgeworICAgICAgICAvL0FsbG93LCBvcmlnaW4gYWxsb3dlZAorICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImFjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpbiIsIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4pOworICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImFjY2Vzcy1jb250cm9sLWFsbG93LW1ldGhvZHMiLCAiR0VULCBQT1NULCBPUFRJT05TIik7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiYWNjZXNzLWNvbnRyb2wtYWxsb3ctaGVhZGVycyIsICJjb250ZW50LXR5cGUsIGFjY2VwdCIpOworICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoImFjY2Vzcy1jb250cm9sLW1heC1hZ2UiLCAiNjAiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvL0Rpc2FsbG93LCBvcmlnaW4gZGVuaWVkCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgLy9BbGxvdywgQ09SUyBpcyBub3QgaW4gdXNlCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworCisgIC8vSGFuZGxlIE9QVElPTlMgbWV0aG9kIChDT1JTKQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgZnVuY3Rpb24gcHJvY2Vzc09wdGlvbnMocmVxdWVzdCwgcmVzcG9uc2UpIHsKKyAgICBpZiAoVmVyaWZ5Q09SU0FuZFNldEhlYWRlcnMocmVxdWVzdCwgcmVzcG9uc2UpKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjIwNCIsICJObyBDb250ZW50IiwgeyJjb250ZW50LWxlbmd0aCI6IDB9KTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKCI0MDMiLCAiT3JpZ2luICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIiBub3QgYWxsb3dlZCIsIHt9KTsKKyAgICB9CisgICAgcmVzcG9uc2UuZW5kKCk7CisgIH0KKworCisgIC8vSGFuZGxlIFBPU1QgbWV0aG9kcyAoVFhIUlRyYW5zcG9ydCkKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIGZ1bmN0aW9uIHByb2Nlc3NQb3N0KHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgLy9Mb29rdXAgc2VydmljZQorICAgIHZhciB1cmkgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpLnBhdGhuYW1lOworICAgIHZhciBzdmMgPSBzZXJ2aWNlc1t1cmldOworICAgIGlmICghc3ZjKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjQwMyIsICJObyBBcGFjaGUgVGhyaWZ0IFNlcnZpY2UgYXQgIiArIHVyaSwge30pOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9WZXJpZnkgQ09SUyByZXF1aXJlbWVudHMKKyAgICBpZiAoIVZlcmlmeUNPUlNBbmRTZXRIZWFkZXJzKHJlcXVlc3QsIHJlc3BvbnNlKSkgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKCI0MDMiLCAiT3JpZ2luICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIiBub3QgYWxsb3dlZCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vUHJvY2VzcyBYSFIgcGF5bG9hZAorICAgIHJlcXVlc3Qub24oJ2RhdGEnLCBzdmMudHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydFdpdGhEYXRhKSB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgc3ZjLnByb3RvY29sKHRyYW5zcG9ydFdpdGhEYXRhKTsKKyAgICAgIHZhciBvdXRwdXQgPSBuZXcgc3ZjLnByb3RvY29sKG5ldyBzdmMudHJhbnNwb3J0KHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDIwMCk7CisgICAgICAgICAgcmVzcG9uc2UuZW5kKGJ1Zik7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgICB9CisgICAgICB9KSk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHN2Yy5wcm9jZXNzb3IucHJvY2VzcyhpbnB1dCwgb3V0cHV0KTsKKyAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEuY29tbWl0UG9zaXRpb24oKTsKKyAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSkpOworICB9CisKKworICAvL0hhbmRsZSBHRVQgbWV0aG9kcyAoU3RhdGljIFBhZ2UgU2VydmVyKQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgZnVuY3Rpb24gcHJvY2Vzc0dldChyZXF1ZXN0LCByZXNwb25zZSkgeworICAgIC8vVW5kZWZpbmVkIG9yIGVtcHR5IGJhc2UgZGlyZWN0b3J5IG1lYW5zIGRvIG5vdCBzZXJ2ZSBzdGF0aWMgZmlsZXMKKyAgICBpZiAoIWJhc2VEaXIgfHwgIiIgPT09IGJhc2VEaXIpIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQpOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9WZXJpZnkgQ09SUyByZXF1aXJlbWVudHMKKyAgICBpZiAoIVZlcmlmeUNPUlNBbmRTZXRIZWFkZXJzKHJlcXVlc3QsIHJlc3BvbnNlKSkgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKCI0MDMiLCAiT3JpZ2luICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIiBub3QgYWxsb3dlZCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vTG9jYXRlIHRoZSBmaWxlIHJlcXVlc3RlZCBhbmQgc2VuZCBpdAorICAgIHZhciB1cmkgPSB1cmwucGFyc2UocmVxdWVzdC51cmwpLnBhdGhuYW1lOworICAgIHZhciBmaWxlbmFtZSA9IHBhdGgucmVzb2x2ZShwYXRoLmpvaW4oYmFzZURpciwgdXJpKSk7CisKKyAgICAvL0Vuc3VyZSB0aGUgYmFzZWRpciBwYXRoIGlzIG5vdCBhYmxlIHRvIGJlIGVzY2FwZWQKKyAgICBpZiAoZmlsZW5hbWUuaW5kZXhPZihiYXNlRGlyKSAhPSAwKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoNDAwLCAiSW52YWxpZCByZXF1ZXN0IHBhdGgiLCB7fSk7CisgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcy5leGlzdHMoZmlsZW5hbWUsIGZ1bmN0aW9uKGV4aXN0cykgeworICAgICAgaWYoIWV4aXN0cykgeworICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNDA0KTsKKyAgICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKGZzLnN0YXRTeW5jKGZpbGVuYW1lKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgIGZpbGVuYW1lICs9ICcvaW5kZXguaHRtbCc7CisgICAgICB9CisKKyAgICAgIGZzLnJlYWRGaWxlKGZpbGVuYW1lLCAiYmluYXJ5IiwgZnVuY3Rpb24oZXJyLCBmaWxlKSB7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoNTAwKTsKKyAgICAgICAgICByZXNwb25zZS5lbmQoZXJyICsgIlxuIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZhciBoZWFkZXJzID0ge307CisgICAgICAgIHZhciBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlc0J5RXh0ZW5zaW9uW3BhdGguZXh0bmFtZShmaWxlbmFtZSldOworICAgICAgICBpZiAoY29udGVudFR5cGUpIHsKKyAgICAgICAgICBoZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9IGNvbnRlbnRUeXBlOworICAgICAgICB9CisgICAgICAgIGZvciAodmFyIGsgaW4gb3B0aW9ucy5oZWFkZXJzKSB7CisgICAgICAgICAgaGVhZGVyc1trXSA9IG9wdGlvbnMuaGVhZGVyc1trXTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMjAwLCBoZWFkZXJzKTsKKyAgICAgICAgcmVzcG9uc2Uud3JpdGUoZmlsZSwgImJpbmFyeSIpOworICAgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIH0pOworICAgIH0pOworICB9CisKKworICAvL0hhbmRsZSBXZWJTb2NrZXQgY2FsbHMgKFRXZWJTb2NrZXRUcmFuc3BvcnQpCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICBmdW5jdGlvbiBwcm9jZXNzV1MoZGF0YSwgc29ja2V0LCBzdmMsIGJpbkVuY29kaW5nKSB7CisgICAgc3ZjLnRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRXaXRoRGF0YSkgeworICAgICAgdmFyIGlucHV0ID0gbmV3IHN2Yy5wcm90b2NvbCh0cmFuc3BvcnRXaXRoRGF0YSk7CisgICAgICB2YXIgb3V0cHV0ID0gbmV3IHN2Yy5wcm90b2NvbChuZXcgc3ZjLnRyYW5zcG9ydCh1bmRlZmluZWQsIGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0cnkgeworICAgICAgICAgIHZhciBmcmFtZSA9IHdzRnJhbWUuZW5jb2RlKGJ1ZiwgbnVsbCwgYmluRW5jb2RpbmcpOworICAgICAgICAgIHNvY2tldC53cml0ZShmcmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgIC8vVE9ETzogQWRkIGJldHRlciBlcnJvciBwcm9jZXNzaW5nCisgICAgICAgIH0KKyAgICAgIH0pKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgc3ZjLnByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgfQorICAgICAgY2F0Y2ggKGVycikgeworICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vVE9ETzogQWRkIGJldHRlciBlcnJvciBwcm9jZXNzaW5nCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KShkYXRhKTsKKyAgfQorCisgIC8vQ3JlYXRlIHRoZSBzZXJ2ZXIgKEhUVFAgb3IgSFRUUFMpCisgIHZhciBzZXJ2ZXIgPSBudWxsOworICBpZiAob3B0aW9ucy50bHMpIHsKKyAgICBzZXJ2ZXIgPSBodHRwcy5jcmVhdGVTZXJ2ZXIob3B0aW9ucy50bHMpOworICB9IGVsc2UgeworICAgIHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKCk7CisgIH0KKworICAvL1dpcmUgdXAgbGlzdGVuZXJzIGZvciB1cGdyYWRlKHRvIFdlYlNvY2tldCkgJiByZXF1ZXN0IG1ldGhvZHMgZm9yOgorICAvLyAgIC0gR0VUIHN0YXRpYyBmaWxlcywKKyAgLy8gICAtIFBPU1QgWEhSIFRocmlmdCBzZXJ2aWNlcworICAvLyAgIC0gT1BUSU9OUyBDT1JTIHJlcXVlc3RzCisgIHNlcnZlci5vbigncmVxdWVzdCcsIGZ1bmN0aW9uKHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcpIHsKKyAgICAgIHByb2Nlc3NQb3N0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9IGVsc2UgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnR0VUJykgeworICAgICAgcHJvY2Vzc0dldChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7CisgICAgICBwcm9jZXNzT3B0aW9ucyhyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgfQorICB9KS5vbigndXBncmFkZScsIGZ1bmN0aW9uKHJlcXVlc3QsIHNvY2tldCwgaGVhZCkgeworICAgIC8vTG9va3VwIHNlcnZpY2UKKyAgICB2YXIgc3ZjOworICAgIHRyeSB7CisgICAgICBzdmMgPSBzZXJ2aWNlc1tPYmplY3Qua2V5cyhzZXJ2aWNlcylbMF1dOworICAgIH0gY2F0Y2goZSkgeworICAgICAgc29ja2V0LndyaXRlKCJIVFRQLzEuMSA0MDMgTm8gQXBhY2hlIFRocmlmdCBTZXJ2aWNlIGF2YWlsYWJsZVxyXG5cclxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vUGVyZm9ybSB1cGdyYWRlCisgICAgdmFyIGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgic2hhMSIpOworICAgIGhhc2gudXBkYXRlKHJlcXVlc3QuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1rZXknXSArICIyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEiKTsKKyAgICBzb2NrZXQud3JpdGUoIkhUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzXHJcbiIgKworICAgICAgICAgICAgICAgICAgICJVcGdyYWRlOiB3ZWJzb2NrZXRcclxuIiArCisgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb246IFVwZ3JhZGVcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlNlYy1XZWJTb2NrZXQtQWNjZXB0OiAiICsgaGFzaC5kaWdlc3QoImJhc2U2NCIpICsgIlxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiU2VjLVdlYlNvY2tldC1PcmlnaW46ICIgKyByZXF1ZXN0LmhlYWRlcnMub3JpZ2luICsgIlxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiU2VjLVdlYlNvY2tldC1Mb2NhdGlvbjogd3M6Ly8iICsgcmVxdWVzdC5oZWFkZXJzLmhvc3QgKyByZXF1ZXN0LnVybCArICJcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlxyXG4iKTsKKyAgICAvL0hhbmRsZSBXZWJTb2NrZXQgdHJhZmZpYworICAgIHZhciBkYXRhID0gbnVsbDsKKyAgICBzb2NrZXQub24oJ2RhdGEnLCBmdW5jdGlvbihmcmFtZSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgd2hpbGUgKGZyYW1lKSB7CisgICAgICAgICAgdmFyIHJlc3VsdCA9IHdzRnJhbWUuZGVjb2RlKGZyYW1lKTsKKyAgICAgICAgICAvL1ByZXBlbmQgYW55IGV4aXN0aW5nIGRlY29kZWQgZGF0YQorICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEpIHsKKyAgICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSBuZXcgQnVmZmVyKGRhdGEubGVuZ3RoICsgcmVzdWx0LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgZGF0YS5jb3B5KG5ld0RhdGEpOworICAgICAgICAgICAgICByZXN1bHQuZGF0YS5jb3B5KG5ld0RhdGEsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBuZXdEYXRhOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICAgIC8vSWYgdGhpcyBjb21wbGV0ZXMgYSBtZXNzYWdlIHByb2Nlc3MgaXQKKyAgICAgICAgICBpZiAocmVzdWx0LkZJTikgeworICAgICAgICAgICAgcHJvY2Vzc1dTKHJlc3VsdC5kYXRhLCBzb2NrZXQsIHN2YywgcmVzdWx0LmJpbkVuY29kaW5nKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YSA9IHJlc3VsdC5kYXRhOworICAgICAgICAgIH0KKyAgICAgICAgICAvL1ByZXBhcmUgbmV4dCBmcmFtZSBmb3IgZGVjb2RpbmcgKGlmIGFueSkKKyAgICAgICAgICBmcmFtZSA9IHJlc3VsdC5uZXh0RnJhbWU7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICBsb2cuZXJyb3IoJ1RXZWJTb2NrZXRUcmFuc3BvcnQgRXhjZXB0aW9uOiAnICsgZSk7CisgICAgICAgIHNvY2tldC5kZXN0cm95KCk7CisgICAgICB9CisgICAgfSk7CisgIH0pOworCisgIC8vUmV0dXJuIHRoZSBzZXJ2ZXIKKyAgcmV0dXJuIHNlcnZlcjsKK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93c19jb25uZWN0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmNiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfY29ubmVjdGlvbi5qcwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Cit2YXIgV2ViU29ja2V0ID0gcmVxdWlyZSgnd3MnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciB0dHJhbnNwb3J0ID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKTsKK3ZhciB0cHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJyk7CisKK3ZhciBUQnVmZmVyZWRUcmFuc3BvcnQgPSByZXF1aXJlKCcuL2J1ZmZlcmVkX3RyYW5zcG9ydCcpOwordmFyIFRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCit2YXIgY3JlYXRlQ2xpZW50ID0gcmVxdWlyZSgnLi9jcmVhdGVfY2xpZW50Jyk7CisKK2V4cG9ydHMuV1NDb25uZWN0aW9uID0gV1NDb25uZWN0aW9uOworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgV1NDb25uZWN0T3B0aW9ucworICogQHByb3BlcnR5IHtzdHJpbmd9IHRyYW5zcG9ydCAtIFRoZSBUaHJpZnQgbGF5ZXJlZCB0cmFuc3BvcnQgdG8gdXNlIChUQnVmZmVyZWRUcmFuc3BvcnQsIGV0YykuCisgKiBAcHJvcGVydHkge3N0cmluZ30gcHJvdG9jb2wgLSBUaGUgVGhyaWZ0IHNlcmlhbGl6YXRpb24gcHJvdG9jb2wgdG8gdXNlIChUSlNPTlByb3RvY29sLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gVGhlIFVSTCBwYXRoIHRvIGNvbm5lY3QgdG8gKGUuZy4gIi8iLCAiL215U3ZjIiwgIi90aHJpZnQvcXVvdGVTdmMiLCBldGMuKS4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQSBzdGFuZGFyZCBOb2RlLmpzIGhlYWRlciBoYXNoLCBhbiBvYmplY3QgaGFzaCBjb250YWluaW5nIGtleS92YWx1ZQorICogICAgICAgIHBhaXJzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGhlYWRlciBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBoZWFkZXIgdmFsdWUgc3RyaW5nLgorICogQHByb3BlcnR5IHtib29sZWFufSBzZWN1cmUgLSBUcnVlIGNhdXNlcyB0aGUgY29ubmVjdGlvbiB0byB1c2Ugd3NzLCBvdGhlcndpc2Ugd3MgaXMgdXNlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB3c09wdGlvbnMgLSBPcHRpb25zIHBhc3NlZCBvbiB0byBXZWJTb2NrZXQuCisgKiBAZXhhbXBsZQorICogICAgIC8vVXNlIGEgc2VjdXJlZCB3ZWJzb2NrZXQgY29ubmVjdGlvbgorICogICAgIC8vICB1c2VzIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQgbGF5ZXIsIHVzZXMgdGhlIEpTT04gcHJvdG9jb2wgYW5kIGRpcmVjdHMgUlBDIHRyYWZmaWMKKyAqICAgICAvLyAgdG8gd3NzOi8vdGhyaWZ0LmV4YW1wbGUuY29tOjkwOTAvaGVsbG8KKyAqICAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisgKiAgICAgdmFyIG9wdGlvbnMgPSB7CisgKiAgICAgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICogICAgICAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAqICAgICAgICBwYXRoOiAiL2hlbGxvIiwKKyAqICAgICAgICBzZWN1cmU6IHRydWUKKyAqICAgICB9OworICogICAgIHZhciBjb24gPSB0aHJpZnQuY3JlYXRlV1NDb25uZWN0aW9uKCJ0aHJpZnQuZXhhbXBsZS5jb20iLCA5MDkwLCBvcHRpb25zKTsKKyAqICAgICBjb24ub3BlbigpCisgKiAgICAgdmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVXU0NsaWVudChteVNlcnZpY2UsIGNvbm5lY3Rpb24pOworICogICAgIGNsaWVudC5teVNlcnZpY2VGdW5jdGlvbigpOworICogICAgIGNvbi5jbG9zZSgpCisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyBhIFRocmlmdCBXU0Nvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVXU0Nvbm5lY3Rpb24oKSByYXRoZXIgdGhhbgorICogICAgaW5zdGFudGlhdGluZyBkaXJlY3RseSkuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7V1NDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiB0dHJhbnNwb3J0LklucHV0QnVmZmVyVW5kZXJydW5FcnJvciBhcmUgcmV0aHJvd24KKyAqIEBldmVudCB7ZXJyb3J9IFRoZSAiZXJyb3IiIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBOb2RlLmpzIGVycm9yIGV2ZW50IG9jY3VycyBkdXJpbmcKKyAqICAgICByZXF1ZXN0IG9yIHJlc3BvbnNlIHByb2Nlc3NpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG5vZGUgZXJyb3IgaXMgcGFzc2VkIG9uLiBBbiAiZXJyb3IiCisgKiAgICAgZXZlbnQgbWF5IGFsc28gYmUgZmlyZWQgd2hlbiB0aGUgY29ubmVjdGlzb24gY2FuIG5vdCBtYXAgYSByZXNwb25zZSBiYWNrIHRvIHRoZQorICogICAgIGFwcHJvcHJpYXRlIGNsaWVudCAoYW4gaW50ZXJuYWwgZXJyb3IpLCBnZW5lcmF0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICogQGNsYXNzZGVzYyBXU0Nvbm5lY3Rpb24gb2JqZWN0cyBwcm92aWRlIFRocmlmdCBlbmQgcG9pbnQgdHJhbnNwb3J0CisgKiAgICAgc2VtYW50aWNzIGltcGxlbWVudGVkIHVzaW5nIFdlYnNvY2tldHMuCisgKiBAc2VlIHtAbGluayBjcmVhdGVXU0Nvbm5lY3Rpb259CisgKi8KK2Z1bmN0aW9uIFdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIC8vSW5pdGlhbGl6ZSB0aGUgZW1pdHRlciBiYXNlIG9iamVjdAorICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKKworICAvL1NldCBjb25maWd1cmF0aW9uCisgIHZhciBzZWxmID0gdGhpczsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgdGhpcy5zZWN1cmUgPSB0aGlzLm9wdGlvbnMuc2VjdXJlIHx8IGZhbHNlOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRKU09OUHJvdG9jb2w7CisgIHRoaXMucGF0aCA9IHRoaXMub3B0aW9ucy5wYXRoOworICB0aGlzLnNlbmRfcGVuZGluZyA9IFtdOworCisgIC8vVGhlIHNlcXVlbmNlIG1hcCBpcyB1c2VkIHRvIG1hcCBzZXFJRHMgYmFjayB0byB0aGUKKyAgLy8gIGNhbGxpbmcgY2xpZW50IGluIG11bHRpcGxleGVkIHNjZW5hcmlvcworICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKKworICAvL1ByZXBhcmUgV2ViU29ja2V0IG9wdGlvbnMKKyAgdGhpcy53c09wdGlvbnMgPSB7CisgICAgaG9zdDogdGhpcy5ob3N0LAorICAgIHBvcnQ6IHRoaXMucG9ydCB8fCA4MCwKKyAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCAnLycsCisgICAgaGVhZGVyczogdGhpcy5vcHRpb25zLmhlYWRlcnMgfHwge30KKyAgfTsKKyAgZm9yICh2YXIgYXR0cm5hbWUgaW4gdGhpcy5vcHRpb25zLndzT3B0aW9ucykgeworICAgIHRoaXMud3NPcHRpb25zW2F0dHJuYW1lXSA9IHRoaXMub3B0aW9ucy53c09wdGlvbnNbYXR0cm5hbWVdOworICB9Cit9OwordXRpbC5pbmhlcml0cyhXU0Nvbm5lY3Rpb24sIEV2ZW50RW1pdHRlcik7CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19yZXNldCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldCA9IG51bGw7IC8vVGhlIHdlYiBzb2NrZXQKKyAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsgLy9CdWZmZXJzL0NhbGxiYWNrIHBhaXJzIHdhaXRpbmcgdG8gYmUgc2VudAorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uT3BlbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIHRoaXMuZW1pdCgib3BlbiIpOworICBpZiAodGhpcy5zZW5kX3BlbmRpbmcubGVuZ3RoID4gMCkgeworICAgIC8vSWYgdGhlIHVzZXIgbWFkZSBjYWxscyBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGZ1bGx5CisgICAgLy9vcGVuLCBzZW5kIHRoZW0gbm93CisgICAgdGhpcy5zZW5kX3BlbmRpbmcuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7CisgICAgICBzZWxmLnNvY2tldC5zZW5kKGRhdGEpOworICAgIH0pOworICAgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107CisgIH0KK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19vbkNsb3NlID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuZW1pdCgiY2xvc2UiKTsKKyAgdGhpcy5fX3Jlc2V0KCk7Cit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fZGVjb2RlQ2FsbGJhY2sgPSBmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7CisgIHZhciBwcm90byA9IG5ldyB0aGlzLnByb3RvY29sKHRyYW5zcG9ydF93aXRoX2RhdGEpOworICB0cnkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB2YXIgaGVhZGVyID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIGR1bW15X3NlcWlkID0gaGVhZGVyLnJzZXFpZCAqIC0xOworICAgICAgdmFyIGNsaWVudCA9IHRoaXMuY2xpZW50OworICAgICAgLy9UaGUgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgc3RvcmVzIGEgaGFzaCBvZiBzZXFpZCB0byBzZXJ2aWNlIG5hbWVzCisgICAgICAvLyAgaW4gc2VxSWQyU2VydmljZS4gSWYgdGhlIFNlcUlkIGlzIGZvdW5kIGluIHRoZSBoYXNoIHdlIG5lZWQgdG8KKyAgICAgIC8vICBsb29rdXAgdGhlIGFwcHJvcHJpYXRlIGNsaWVudCBmb3IgdGhpcyBjYWxsLgorICAgICAgLy8gIFRoZSBjbGllbnQgdmFyIGlzIGEgc2luZ2xlIGNsaWVudCBvYmplY3Qgd2hlbiBub3QgbXVsdGlwbGV4aW5nLAorICAgICAgLy8gIHdoZW4gdXNpbmcgbXVsdGlwbGV4aW5nIGl0IGlzIGEgc2VydmljZSBuYW1lIGtleWVkIGhhc2ggb2YgY2xpZW50CisgICAgICAvLyAgb2JqZWN0cy4KKyAgICAgIC8vTk9URTogVGhlIDIgd2F5IGludGVyZGVwZW5kZW5jaWVzIGJldHdlZW4gcHJvdG9jb2xzLCB0cmFuc3BvcnRzLAorICAgICAgLy8gIGNvbm5lY3Rpb25zIGFuZCBjbGllbnRzIGluIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIGFyZSBpcnJlZ3VsYXIKKyAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlCisgICAgICAvLyAgc2hvdWxkIGJyaW5nIHRoaXMgc3R1ZmYgaW5saW5lIHdpdGggdHlwaWNhbCB0aHJpZnQgSS9PIHN0YWNrCisgICAgICAvLyAgb3BlcmF0aW9uIHNvb24uCisgICAgICAvLyAgLS1yYQorICAgICAgdmFyIHNlcnZpY2VfbmFtZSA9IHRoaXMuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgY2xpZW50ID0gdGhpcy5jbGllbnRbc2VydmljZV9uYW1lXTsKKyAgICAgICAgZGVsZXRlIHRoaXMuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgIH0KKyAgICAgIC8qanNoaW50IC1XMDgzICovCisgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKSB7CisgICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEuY29tbWl0UG9zaXRpb24oKTsKKyAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICBpZiAoY2xpZW50Q2FsbGJhY2spIHsKKyAgICAgICAgICBjbGllbnRDYWxsYmFjayhlcnIsIHN1Y2Nlc3MpOworICAgICAgICB9CisgICAgICB9OworICAgICAgLypqc2hpbnQgK1cwODMgKi8KKyAgICAgIGlmIChjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0pIHsKKyAgICAgICAgY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKHByb3RvLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdOworICAgICAgICB0aGlzLmVtaXQoImVycm9yIiwKKyAgICAgICAgICBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgIHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgIlJlY2VpdmVkIGEgcmVzcG9uc2UgdG8gYW4gdW5rbm93biBSUEMgZnVuY3Rpb24iKSk7CisgICAgICB9CisgICAgfQorICB9IGNhdGNoIChlKSB7CisgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEucm9sbGJhY2tQb3NpdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfQorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSA9PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iKSB7CisgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEpOworICB9CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGRhdGEpOworICB0aGlzLnRyYW5zcG9ydC5yZWNlaXZlcih0aGlzLl9fZGVjb2RlQ2FsbGJhY2suYmluZCh0aGlzKSkoYnVmKTsKKworfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uTWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeworICB0aGlzLl9fb25EYXRhKGV2dC5kYXRhKTsKK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19vbkVycm9yID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuZW1pdCgiZXJyb3IiLCBldnQpOworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufQorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PSB0aGlzLnNvY2tldC5PUEVOOworfTsKKworLyoqCisgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7CisgIC8vSWYgT1BFTi9DT05ORUNUSU5HL0NMT1NJTkcgaWdub3JlIGFkZGl0aW9uYWwgb3BlbnMKKyAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7CisgICAgcmV0dXJuOworICB9CisgIC8vSWYgdGhlcmUgaXMgbm8gc29ja2V0IG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkOgorICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmkoKSwgIiIsIHRoaXMud3NPcHRpb25zKTsKKyAgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7CisgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7Cit9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm4gVVJJIGZvciB0aGUgY29ubmVjdGlvbgorICogQHJldHVybnMge3N0cmluZ30gVVJJCisgKi8KK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUudXJpID0gZnVuY3Rpb24oKSB7CisgIHZhciBzY2hlbWEgPSB0aGlzLnNlY3VyZSA/ICd3c3MnIDogJ3dzJzsKKyAgdmFyIHBvcnQgPSAnJzsKKyAgdmFyIHBhdGggPSB0aGlzLnBhdGggfHwgJy8nOworICB2YXIgaG9zdCA9IHRoaXMuaG9zdDsKKworICAvLyBhdm9pZCBwb3J0IGlmIGRlZmF1bHQgZm9yIHNjaGVtYQorICBpZiAodGhpcy5wb3J0ICYmICgoJ3dzcycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA0NDMpIHx8CisgICAgKCd3cycgPT0gc2NoZW1hICYmIHRoaXMucG9ydCAhPSA4MCkpKSB7CisgICAgcG9ydCA9ICc6JyArIHRoaXMucG9ydDsKKyAgfQorCisgIHJldHVybiBzY2hlbWEgKyAnOi8vJyArIGhvc3QgKyBwb3J0ICsgcGF0aDsKK307CisKKy8qKgorICogV3JpdGVzIFRocmlmdCBtZXNzYWdlIGRhdGEgdG8gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gQSBOb2RlLmpzIEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIHdyaXRlCisgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlLgorICogQGV2ZW50IHtlcnJvcn0gdGhlICJlcnJvciIgZXZlbnQgaXMgcmFpc2VkIHVwb24gcmVxdWVzdCBmYWlsdXJlIHBhc3NpbmcgdGhlCisgKiAgICAgTm9kZS5qcyBlcnJvciBvYmplY3QgdG8gdGhlIGxpc3RlbmVyLgorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgeworICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTsKKyAgfSBlbHNlIHsKKyAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgorICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goZGF0YSk7CisgIH0KK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBXU0Nvbm5lY3Rpb24gb2JqZWN0LCB1c2VkIGJ5IFRocmlmdCBjbGllbnRzIHRvIGNvbm5lY3QKKyAqICAgIHRvIFRocmlmdCBIVFRQIGJhc2VkIHNlcnZlcnMuCisgKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IG5hbWUgb3IgSVAgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gVGhlIFRDUCBwb3J0IHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge1dTQ29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtXU0Nvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIFdTQ29ubmVjdE9wdGlvbnN9CisgKi8KK2V4cG9ydHMuY3JlYXRlV1NDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICByZXR1cm4gbmV3IFdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlV1NDbGllbnQgPSBjcmVhdGVDbGllbnQ7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEzYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKKworbW9kdWxlLmV4cG9ydHMgPSBUV2ViU29ja2V0VHJhbnNwb3J0OworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydC4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0CisgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KKyAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCisgKiBAZXhhbXBsZQorICogICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0Ojg1ODUiKTsKKyAqLworZnVuY3Rpb24gVFdlYlNvY2tldFRyYW5zcG9ydCh1cmwpIHsKKyAgICB0aGlzLl9fcmVzZXQodXJsKTsKK307CisKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19yZXNldCA9IGZ1bmN0aW9uKHVybCkgeworICB0aGlzLnVybCA9IHVybDsgICAgICAgICAgICAgLy9XaGVyZSB0byBjb25uZWN0CisgIHRoaXMuc29ja2V0ID0gbnVsbDsgICAgICAgICAvL1RoZSB3ZWIgc29ja2V0CisgIHRoaXMuY2FsbGJhY2tzID0gW107ICAgICAgICAvL1BlbmRpbmcgY2FsbGJhY2tzCisgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107ICAgICAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50CisgIHRoaXMuc2VuZF9idWYgPSAnJzsgICAgICAgICAvL091dGJvdW5kIGRhdGEsIGltbXV0YWJsZSB1bnRpbCBzZW50CisgIHRoaXMucmVjdl9idWYgPSAnJzsgICAgICAgICAvL0luYm91bmQgZGF0YQorICB0aGlzLnJiX3dwb3MgPSAwOyAgICAgICAgICAgLy9OZXR3b3JrIHdyaXRlIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgIHRoaXMucmJfcnBvcyA9IDA7ICAgICAgICAgICAvL0NsaWVudCByZWFkIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCit9OworCisvKioKKyAqIFNlbmRzIHRoZSBjdXJyZW50IFdTIHJlcXVlc3QgYW5kIHJlZ2lzdGVycyBjYWxsYmFjay4gVGhlIGFzeW5jCisgKiBwYXJhbWV0ZXIgaXMgaWdub3JlZCAoV1MgZmx1c2ggaXMgYWx3YXlzIGFzeW5jKSBhbmQgdGhlIGNhbGxiYWNrCisgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZ25vcmVkLgorICogQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIC0gVGhlIGNsaWVudCBjb21wbGV0aW9uIGNhbGxiYWNrLgorICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgKHVuZGVmaW5lZCkKKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihhc3luYywgY2FsbGJhY2spIHsKKyAgdmFyIHNlbGYgPSB0aGlzOworICBpZiAodGhpcy5pc09wZW4oKSkgeworICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgdGhpcy5zb2NrZXQuc2VuZCh0aGlzLnNlbmRfYnVmKTsKKyAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1zZykgeworICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgIH07CisgICAgfSgpKSk7CisgIH0gZWxzZSB7CisgICAgLy9RdWV1ZSB0aGUgc2VuZCB0byBnbyBvdXQgX19vbk9wZW4KKyAgICB0aGlzLnNlbmRfcGVuZGluZy5wdXNoKHsKKyAgICAgIGJ1ZjogdGhpcy5zZW5kX2J1ZiwKKyAgICAgIGNiOiAgY2FsbGJhY2sKKyAgICB9KTsKKyAgfQorfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbk9wZW4gPSBmdW5jdGlvbigpIHsKKyAgIHZhciBzZWxmID0gdGhpczsKKyAgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7CisgICAgICAvL0lmIHRoZSB1c2VyIG1hZGUgY2FsbHMgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBmdWxseQorICAgICAgLy9vcGVuLCBzZW5kIHRoZW0gbm93CisgICAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW0pIHsKKyAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoZWxlbS5idWYpOworICAgICAgICAgdGhpcy5jYWxsYmFja3MucHVzaCgoZnVuY3Rpb24oKSB7CisgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGVsZW0uY2I7CisgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKG1zZyk7CisgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrKCk7CisgICAgICAgICAgIH07CisgICAgICAgICB9KCkpKTsKKyAgICAgIH0pOworICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKKyAgIH0KK307CisKK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLl9fb25DbG9zZSA9IGZ1bmN0aW9uKGV2dCkgeworICB0aGlzLl9fcmVzZXQodGhpcy51cmwpOworfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbk1lc3NhZ2UgPSBmdW5jdGlvbihldnQpIHsKKyAgaWYgKHRoaXMuY2FsbGJhY2tzLmxlbmd0aCkgeworICAgIHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCkoZXZ0LmRhdGEpOworICB9Cit9OworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX29uRXJyb3IgPSBmdW5jdGlvbihldnQpIHsKKyAgbG9nLmVycm9yKCd3ZWJzb2NrZXQ6ICcgKyBldnQudG9TdHJpbmcoKSk7CisgIHRoaXMuc29ja2V0LmNsb3NlKCk7Cit9OworCisvKioKKyAqIFNldHMgdGhlIGJ1ZmZlciB0byB1c2Ugd2hlbiByZWNlaXZpbmcgc2VydmVyIHJlc3BvbnNlcy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHJlY2VpdmUgc2VydmVyIHJlc3BvbnNlcy4KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuc2V0UmVjdkJ1ZmZlciA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnJlY3ZfYnVmID0gYnVmOworICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICB0aGlzLnJwb3MgPSAwOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufQorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5pc09wZW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT0gdGhpcy5zb2NrZXQuT1BFTjsKK307CisKKy8qKgorICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHsKKyAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucworICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPSB0aGlzLnNvY2tldC5DTE9TRUQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy9JZiB0aGVyZSBpcyBubyBzb2NrZXQgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQ6CisgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybCk7CisgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsKKyAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcyk7Cit9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgKiBidWZmZXIuCisgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICByZXR1cm4gJyc7CisgIH0KKworICB2YXIgZ2l2ZSA9IGxlbjsKKworICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICBnaXZlID0gYXZhaWw7CisgIH0KKworICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgcmV0dXJuIHJldDsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkQWxsID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworfTsKKworLyoqCisgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnNlbmRfYnVmID0gYnVmOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5nZXRTZW5kQnVmZmVyID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnNlbmRfYnVmOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC94aHJfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC94aHJfY29ubmVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDU5YzkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3hocl9jb25uZWN0aW9uLmpzCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKworZXhwb3J0cy5YSFJDb25uZWN0aW9uID0gWEhSQ29ubmVjdGlvbjsKKworLyoqCisgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFhIUiBDb25uZWN0aW9uLgorICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgaG9zdCBhbmQgcG9ydCB0aGVuIFhIUkNvbm5lY3Rpb24gd2lsbCBkZWZhdWx0IHRvIHRoZQorICogaG9zdCBhbmQgcG9ydCBvZiB0aGUgcGFnZSBmcm9tIHdoaWNoIHRoaXMgamF2YXNjcmlwdCBpcyBzZXJ2ZWQuCisgKiBAY29uc3RydWN0b3IKKyAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KKyAqIEBjbGFzc2Rlc2MgVFhIUkNvbm5lY3Rpb24gb2JqZWN0cyBwcm92aWRlIFRocmlmdCBlbmQgcG9pbnQgdHJhbnNwb3J0CisgKiAgICAgc2VtYW50aWNzIGltcGxlbWVudGVkIHVzaW5nIFhIUi4KKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFhIUkNvbm5lY3Rpb24oJ2xvY2FsaG9zdCcsIDkwOTksIHt9KTsKKyAqLworZnVuY3Rpb24gWEhSQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgIHRoaXMud3BvcyA9IDA7CisgIHRoaXMucnBvcyA9IDA7CisgIHRoaXMudXNlQ09SUyA9IChvcHRpb25zICYmIG9wdGlvbnMudXNlQ09SUyk7CisgIHRoaXMuc2VuZF9idWYgPSAnJzsKKyAgdGhpcy5yZWN2X2J1ZiA9ICcnOworICB0aGlzLnRyYW5zcG9ydCA9IG9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IG9wdGlvbnMucHJvdG9jb2wgfHwgVEpTT05Qcm90b2NvbDsKKyAgdGhpcy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9OworCisgIGhvc3QgPSBob3N0IHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0OworICBwb3J0ID0gcG9ydCB8fCB3aW5kb3cubG9jYXRpb24ucG9ydDsKKyAgdmFyIHByZWZpeCA9IG9wdGlvbnMuaHR0cHMgPyAnaHR0cHM6Ly8nIDogJ2h0dHA6Ly8nOworICB2YXIgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnLyc7CisKKyAgaWYgKHBvcnQgPT09ICcnKSB7CisgICAgcG9ydCA9IHVuZGVmaW5lZDsKKyAgfQorCisgIGlmICghcG9ydCB8fCBwb3J0ID09PSA4MCB8fCBwb3J0ID09PSAnODAnKSB7CisgICAgdGhpcy51cmwgPSBwcmVmaXggKyBob3N0ICsgcGF0aDsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnVybCA9IHByZWZpeCArIGhvc3QgKyAnOicgKyBwb3J0ICsgcGF0aDsKKyAgfQorCisgIC8vVGhlIHNlcXVlbmNlIG1hcCBpcyB1c2VkIHRvIG1hcCBzZXFJRHMgYmFjayB0byB0aGUKKyAgLy8gIGNhbGxpbmcgY2xpZW50IGluIG11bHRpcGxleGVkIHNjZW5hcmlvcworICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKK307CisKK3V0aWwuaW5oZXJpdHMoWEhSQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworLyoqCisqIEdldHMgdGhlIGJyb3dzZXIgc3BlY2lmaWMgWG1sSHR0cFJlcXVlc3QgT2JqZWN0LgorKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgYnJvd3NlciBYSFIgaW50ZXJmYWNlIG9iamVjdAorKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFhtbEh0dHBSZXF1ZXN0T2JqZWN0ID0gZnVuY3Rpb24oKSB7CisgIHRyeSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgfSBjYXRjaCAoZTEpIHsgfQorICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUyKSB7IH0KKyAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOyB9IGNhdGNoIChlMykgeyB9CisKKyAgdGhyb3cgIllvdXIgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgWEhSLiI7Cit9OworCisvKioKKyAqIFNlbmRzIHRoZSBjdXJyZW50IFhSSCByZXF1ZXN0IGlmIHRoZSB0cmFuc3BvcnQgd2FzIGNyZWF0ZWQgd2l0aCBhIFVSTAorICogYW5kIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgZmFsc2UuIElmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBjcmVhdGVkIHdpdGgKKyAqIGEgVVJMLCBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgYW5kIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBvcgorICogdGhlIFVSTCBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWYgdHJ1ZSB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqIEByZXR1cm5zIHt1bmRlZmluZWR8c3RyaW5nfSBOb3RoaW5nIG9yIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyLgorICogQHRocm93cyB7c3RyaW5nfSBJZiBYSFIgZmFpbHMuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgaWYgKHRoaXMudXJsID09PSB1bmRlZmluZWQgfHwgdGhpcy51cmwgPT09ICcnKSB7CisgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CisgIH0KKworICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKTsKKworICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKSB7CisgICAgeHJlcS5vdmVycmlkZU1pbWVUeXBlKCdhcHBsaWNhdGlvbi9qc29uJyk7CisgIH0KKworICB4cmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCAmJiB0aGlzLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcih0aGlzLnJlc3BvbnNlVGV4dCk7CisgICAgfQorICB9OworCisgIHhyZXEub3BlbignUE9TVCcsIHRoaXMudXJsLCB0cnVlKTsKKworICBPYmplY3Qua2V5cyh0aGlzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyS2V5KSB7CisgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlcktleSwgc2VsZi5oZWFkZXJzW2hlYWRlcktleV0pOworICB9KTsKKworICB4cmVxLnNlbmQodGhpcy5zZW5kX2J1Zik7Cit9OworCisvKioKKyAqIFNldHMgdGhlIGJ1ZmZlciB0byBwcm92aWRlIHRoZSBwcm90b2NvbCB3aGVuIGRlc2VyaWFsaXppbmcuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzdXBwbHkgdGhlIHByb3RvY29sLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5zZXRSZWN2QnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMucmVjdl9idWYgPSBidWY7CisgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMucnBvcyA9IDA7CisKKyAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChidWYpID09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKKyAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CisgIH0KKyAgdmFyIHRoaW5nID0gbmV3IEJ1ZmZlcihkYXRhIHx8IGJ1Zik7CisKKyAgdGhpcy50cmFuc3BvcnQucmVjZWl2ZXIodGhpcy5fX2RlY29kZUNhbGxiYWNrLmJpbmQodGhpcykpKHRoaW5nKTsKKworfTsKKworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuX19kZWNvZGVDYWxsYmFjayA9IGZ1bmN0aW9uKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgdmFyIHByb3RvID0gbmV3IHRoaXMucHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CisgIHRyeSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBoZWFkZXIgPSBwcm90by5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICB2YXIgY2xpZW50ID0gdGhpcy5jbGllbnQ7CisgICAgICAvL1RoZSBNdWx0aXBsZXhlZCBQcm90b2NvbCBzdG9yZXMgYSBoYXNoIG9mIHNlcWlkIHRvIHNlcnZpY2UgbmFtZXMKKyAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAvLyAgVGhlIGNsaWVudCB2YXIgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdCBtdWx0aXBsZXhpbmcsCisgICAgICAvLyAgd2hlbiB1c2luZyBtdWx0aXBsZXhpbmcgaXQgaXMgYSBzZXJ2aWNlIG5hbWUga2V5ZWQgaGFzaCBvZiBjbGllbnQKKyAgICAgIC8vICBvYmplY3RzLgorICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAvLyAgY29ubmVjdGlvbnMgYW5kIGNsaWVudHMgaW4gdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gYXJlIGlycmVndWxhcgorICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgIC8vICBvcGVyYXRpb24gc29vbi4KKyAgICAgIC8vICAtLXJhCisgICAgICB2YXIgc2VydmljZV9uYW1lID0gdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICBjbGllbnQgPSB0aGlzLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICBkZWxldGUgdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgfQorICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF0gPSBmdW5jdGlvbihlcnIsIHN1Y2Nlc3MpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgIGNsaWVudENhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICAvKmpzaGludCArVzA4MyAqLworICAgICAgaWYgKGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXSkgeworICAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0ocHJvdG8sIGhlYWRlci5tdHlwZSwgZHVtbXlfc2VxaWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF07CisgICAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLAorICAgICAgICAgIG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9Cit9OworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sIFhIUiBhbHdheXMgcmV0dXJucyB0cnVlLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7fTsKKworLyoqCisgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge307CisKKy8qKgorICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgKiBidWZmZXIuCisgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHZhciBhdmFpbCA9IHRoaXMud3BvcyAtIHRoaXMucnBvczsKKworICBpZiAoYXZhaWwgPT09IDApIHsKKyAgICByZXR1cm4gJyc7CisgIH0KKworICB2YXIgZ2l2ZSA9IGxlbjsKKworICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICBnaXZlID0gYXZhaWw7CisgIH0KKworICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgcmV0dXJuIHJldDsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5yZWFkQWxsID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlY3ZfYnVmOworfTsKKworLyoqCisgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICovCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZikgeworICB0aGlzLnNlbmRfYnVmID0gYnVmOworICB0aGlzLmZsdXNoKCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmdldFNlbmRCdWZmZXIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc2VuZF9idWY7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgVFhIUlRyYW5zcG9ydCBvYmplY3QsIHVzZWQgYnkgVGhyaWZ0IGNsaWVudHMgdG8gY29ubmVjdAorICogICAgdG8gVGhyaWZ0IEhUVFAgYmFzZWQgc2VydmVycy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7WEhSQ29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtYSFJDb25uZWN0aW9ufSBUaGUgY29ubmVjdGlvbiBvYmplY3QuCisgKiBAc2VlIHtAbGluayBYSFJDb25uZWN0T3B0aW9uc30KKyAqLworZXhwb3J0cy5jcmVhdGVYSFJDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgeworICByZXR1cm4gbmV3IFhIUkNvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7Cit9OworCitleHBvcnRzLmNyZWF0ZVhIUkNsaWVudCA9IGNyZWF0ZUNsaWVudDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcyBiL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODdjZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2JpbmFyeS50ZXN0LmpzCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBiaW5hcnkgPSByZXF1aXJlKCJ0aHJpZnQvYmluYXJ5Iik7CisKK2NvbnN0IGNhc2VzID0geworICAiU2hvdWxkIHJlYWQgc2lnbmVkIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRCeXRlKDB4MDEpKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkQnl0ZSgweGZmKSk7CisKKyAgICBhc3NlcnQuZXF1YWwoMTI3LCBiaW5hcnkucmVhZEJ5dGUoMHg3ZikpOworICAgIGFzc2VydC5lcXVhbCgtMTI4LCBiaW5hcnkucmVhZEJ5dGUoMHg4MCkpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKyAgIlNob3VsZCB3cml0ZSBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgLy9Qcm90b2NvbCBzaW1wbHkgd3JpdGVzIHRvIHRoZSBidWZmZXIuIE5vdGhpbmcgdG8gdGVzdC4uIHlldC4KKyAgICBhc3NlcnQub2sodHJ1ZSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorICAiU2hvdWxkIHJlYWQgSTE2IjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKDAsIGJpbmFyeS5yZWFkSTE2KFsweDAwLCAweDAwXSkpOworICAgIGFzc2VydC5lcXVhbCgxLCBiaW5hcnkucmVhZEkxNihbMHgwMCwgMHgwMV0pKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkSTE2KFsweGZmLCAweGZmXSkpOworCisgICAgLy8gTWluIEkxNgorICAgIGFzc2VydC5lcXVhbCgtMzI3NjgsIGJpbmFyeS5yZWFkSTE2KFsweDgwLCAweDAwXSkpOworICAgIC8vIE1heCBJMTYKKyAgICBhc3NlcnQuZXF1YWwoMzI3NjcsIGJpbmFyeS5yZWFkSTE2KFsweDdmLCAweGZmXSkpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKworICAiU2hvdWxkIHdyaXRlIEkxNiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVJMTYoW10sIDApKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAxKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHhmZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkxNihbXSwgLTEpKTsKKworICAgIC8vIE1pbiBJMTYKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDgwLCAweDAwXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAtMzI3NjgpKTsKKyAgICAvLyBNYXggSTE2CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg3ZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkxNihbXSwgMzI3NjcpKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisKKyAgIlNob3VsZCByZWFkIEkzMiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbCgwLCBiaW5hcnkucmVhZEkzMihbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKTsKKyAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRJMzIoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdKSk7CisgICAgYXNzZXJ0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEkzMihbMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pKTsKKworICAgIC8vIE1pbiBJMzIKKyAgICBhc3NlcnQuZXF1YWwoLTIxNDc0ODM2NDgsIGJpbmFyeS5yZWFkSTMyKFsweDgwLCAweDAwLCAweDAwLCAweDAwXSkpOworICAgIC8vIE1heCBJMzIKKyAgICBhc3NlcnQuZXF1YWwoMjE0NzQ4MzY0NywgYmluYXJ5LnJlYWRJMzIoWzB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmZdKSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgd3JpdGUgSTMyIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZUkzMihbXSwgMCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdLCBiaW5hcnkud3JpdGVJMzIoW10sIDEpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweGZmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAtMSkpOworCisgICAgLy8gTWluIEkzMgorICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVJMzIoW10sIC0yMTQ3NDgzNjQ4KQorICAgICk7CisgICAgLy8gTWF4IEkzMgorICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMzIoW10sIDIxNDc0ODM2NDcpKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisKKyAgIlNob3VsZCByZWFkIGRvdWJsZXMiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAwLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDEsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgzZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAyLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgLTIsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIE1hdGguUEksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg0MCwgMHg5LCAweDIxLCAweGZiLCAweDU0LCAweDQ0LCAweDJkLCAweDE4XSkKKyAgICApOworCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAtSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKworICAgIGFzc2VydC5vaygKKyAgICAgIGlzTmFOKGJpbmFyeS5yZWFkRG91YmxlKFsweDdmLCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCisgICAgKTsKKworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDEgLyAzLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdKQorICAgICk7CisKKyAgICAvLyBNaW4gc3Vibm9ybWFsIHBvc2l0aXZlIGRvdWJsZQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdKQorICAgICk7CisgICAgLy8gTWluIG5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIC8vIE1heCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKQorICAgICk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgd3JpdGUgZG91YmxlcyI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDApCisgICAgKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4M2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxKQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMikKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIC0yKQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIE1hdGguUEkpCisgICAgKTsKKworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIEluZmluaXR5KQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweGZmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgLUluZmluaXR5KQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBOYU4pCisgICAgKTsKKworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgzZiwgMHhkNSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEgLyAzKQorICAgICk7CisKKyAgICAvLyBNaW4gc3Vibm9ybWFsIHBvc2l0aXZlIGRvdWJsZQorICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0KQorICAgICk7CisgICAgLy8gTWluIG5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCkKKyAgICApOworICAgIC8vIE1heCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4KQorICAgICk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9Cit9OworCitPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgeworICB0ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvY2VydGlmaWNhdGVzLlJFQURNRSBiL2xpYi9ub2RlanMvdGVzdC9jZXJ0aWZpY2F0ZXMuUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzUwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvY2VydGlmaWNhdGVzLlJFQURNRQpAQCAtMCwwICsxLDcgQEAKK3NlcnZlci5jcnQgQU5EIHNlcnZlci5rZXkgQVJFIFBST1ZJREVEIEZPUiBURVNUIFBVUlBPU0UgQU5EIFNIT1VMRCAqTkVWRVIqIEJFIFVTRUQgSU4gUFJPRFVDVElPTgorCisKK09yaWdpbiBvZiB0aGUgdGVzdCBrZXkgYW5kIGNlcnQgaXMgdGhlIGZvbGRlciB0ZXN0L2tleXMgb2YgQXBhY2hlIFRocmlmdCBzb3VyY2UgY29kZSBkaXN0cmlidXRpb24KKworV2UgbmVlZCBjb3BpZXMgZm9yIG5wbSBkZXBsb3ltZW50CisKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMgYi9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTNhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzCkBAIC0wLDAgKzEsMTcwIEBACisjIS91c3IvYmluL2VudiBub2RlCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgiYXNzZXJ0Iik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKKworY29uc3QgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RgKTsKK2NvbnN0IFRocmlmdFRlc3REcml2ZXIgPSByZXF1aXJlKCIuL3Rlc3RfZHJpdmVyIikuVGhyaWZ0VGVzdERyaXZlcjsKK2NvbnN0IFRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpCisgIC5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKK2NvbnN0IFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9TZWNvbmRTZXJ2aWNlYCk7CisKK2NvbnN0IHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKKworcHJvZ3JhbQorICAub3B0aW9uKAorICAgICItcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+IiwKKyAgICAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5fGNvbXBhY3R8anNvbikgW3Byb3RvY29sXSIKKyAgKQorICAub3B0aW9uKAorICAgICItdCwgLS10cmFuc3BvcnQgPHRyYW5zcG9ydD4iLAorICAgICJTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkfGh0dHApIFt0cmFuc3BvcnRdIgorICApCisgIC5vcHRpb24oIi0tcG9ydCA8cG9ydD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCBudW1iZXIgdG8gY29ubmVjdCIsIDkwOTApCisgIC5vcHRpb24oIi0taG9zdCA8aG9zdD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgaG9zdCB0byBjb25uZWN0IiwgImxvY2FsaG9zdCIpCisgIC5vcHRpb24oCisgICAgIi0tZG9tYWluLXNvY2tldCA8cGF0aD4iLAorICAgICJTZXQgdGhyaWZ0IHNlcnZlciB1bml4IGRvbWFpbiBzb2NrZXQgdG8gY29ubmVjdCIKKyAgKQorICAub3B0aW9uKCItLXNzbCIsICJ1c2UgU1NMIHRyYW5zcG9ydCIpCisgIC5vcHRpb24oIi0tY2FsbGJhY2siLCAidGVzdCB3aXRoIGNhbGxiYWNrIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oCisgICAgIi10LCAtLXR5cGUgPHR5cGU+IiwKKyAgICAiU2VsZWN0IHNlcnZlciB0eXBlIChodHRwfG11bHRpcGxleHx0Y3B8d2Vic29ja2V0KSIsCisgICAgInRjcCIKKyAgKQorICAub3B0aW9uKCItLWVzNiIsICJVc2UgZXM2IGNvZGUiKQorICAub3B0aW9uKCItLWVzNSIsICJVc2UgZXM1IGNvZGUiKQorICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKKworY29uc3QgaG9zdCA9IHByb2dyYW0uaG9zdDsKK2NvbnN0IHBvcnQgPSBwcm9ncmFtLnBvcnQ7Citjb25zdCBkb21haW5Tb2NrZXQgPSBwcm9ncmFtLmRvbWFpblNvY2tldDsKK2NvbnN0IHNzbCA9IHByb2dyYW0uc3NsOworbGV0IHR5cGUgPSBwcm9ncmFtLnR5cGU7CisKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY3Jvc3MgdGVzdCBpbnZvY2F0aW9uIGZvciBodHRwIHRyYW5zcG9ydCB0ZXN0aW5nICovCitpZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJodHRwIikgeworICBwcm9ncmFtLnRyYW5zcG9ydCA9ICJidWZmZXJlZCI7CisgIHR5cGUgPSAiaHR0cCI7Cit9CisKK2NvbnN0IG9wdGlvbnMgPSB7CisgIHRyYW5zcG9ydDogaGVscGVycy50cmFuc3BvcnRzW3Byb2dyYW0udHJhbnNwb3J0XSwKKyAgcHJvdG9jb2w6IGhlbHBlcnMucHJvdG9jb2xzW3Byb2dyYW0ucHJvdG9jb2xdCit9OworCitpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIG9wdGlvbnMucGF0aCA9ICIvdGVzdCI7Cit9CisKK2lmICh0eXBlID09PSAiaHR0cCIpIHsKKyAgb3B0aW9ucy5oZWFkZXJzID0geyBDb25uZWN0aW9uOiAiY2xvc2UiIH07Cit9CisKK2lmIChzc2wpIHsKKyAgaWYgKHR5cGUgPT09ICJ0Y3AiIHx8IHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgICAgb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQgPSBmYWxzZTsKKyAgfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKKyAgICBvcHRpb25zLm5vZGVPcHRpb25zID0geyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH07CisgICAgb3B0aW9ucy5odHRwcyA9IHRydWU7CisgIH0gZWxzZSBpZiAodHlwZSA9PT0gIndlYnNvY2tldCIpIHsKKyAgICBvcHRpb25zLndzT3B0aW9ucyA9IHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9OworICAgIG9wdGlvbnMuc2VjdXJlID0gdHJ1ZTsKKyAgfQorfQorCitsZXQgY29ubmVjdGlvbjsKK2xldCBjbGllbnQ7Citjb25zdCB0ZXN0RHJpdmVyID0gcHJvZ3JhbS5jYWxsYmFjaworICA/IFRocmlmdFRlc3REcml2ZXIKKyAgOiBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKK2lmIChoZWxwZXJzLmVjbWFNb2RlID09PSAiZXM2IiAmJiBwcm9ncmFtLmNhbGxiYWNrKSB7CisgIGNvbnNvbGUubG9nKCJFUzYgZG9lcyBub3Qgc3VwcG9ydCBjYWxsYmFjayBzdHlsZSIpOworICBwcm9jZXNzLmV4aXQoMCk7Cit9CisKK2lmICh0eXBlID09PSAidGNwIiB8fCB0eXBlID09PSAibXVsdGlwbGV4IikgeworICBpZiAoZG9tYWluU29ja2V0KSB7CisgICAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVVRFNDb25uZWN0aW9uKGRvbWFpblNvY2tldCwgb3B0aW9ucyk7CisgIH0gZWxzZSB7CisgICAgY29ubmVjdGlvbiA9IHNzbAorICAgICAgPyB0aHJpZnQuY3JlYXRlU1NMQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKQorICAgICAgOiB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgfQorfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKKyAgaWYgKGRvbWFpblNvY2tldCkgeworICAgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb24oZG9tYWluU29ja2V0LCBvcHRpb25zKTsKKyAgfSBlbHNlIHsKKyAgICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUh0dHBDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOworICB9Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlV1NDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOworICBjb25uZWN0aW9uLm9wZW4oKTsKK30KKworY29ubmVjdGlvbi5vbigiZXJyb3IiLCBmdW5jdGlvbihlcnIpIHsKKyAgYXNzZXJ0KGZhbHNlLCBlcnIpOworfSk7CisKK2lmICh0eXBlID09PSAidGNwIikgeworICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOworICBydW5UZXN0cygpOworfSBlbHNlIGlmICh0eXBlID09PSAibXVsdGlwbGV4IikgeworICBjb25zdCBtcCA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZXIoKTsKKyAgY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KCJUaHJpZnRUZXN0IiwgVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CisgIGNvbnN0IHNlY29uZGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgKKyAgICAiU2Vjb25kU2VydmljZSIsCisgICAgU2Vjb25kU2VydmljZSwKKyAgICBjb25uZWN0aW9uCisgICk7CisKKyAgY29ubmVjdGlvbi5vbigiY29ubmVjdCIsIGZ1bmN0aW9uKCkgeworICAgIHNlY29uZGNsaWVudC5zZWNvbmR0ZXN0U3RyaW5nKCJUZXN0IiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0KCFlcnIpOworICAgICAgYXNzZXJ0LmVxdWFsKCd0ZXN0U3RyaW5nKCJUZXN0IiknLCByZXNwb25zZSk7CisgICAgfSk7CisKKyAgICBydW5UZXN0cygpOworICB9KTsKK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVIdHRwQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOworICBydW5UZXN0cygpOworfSBlbHNlIGlmICh0eXBlID09PSAid2Vic29ja2V0IikgeworICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlV1NDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CisgIHJ1blRlc3RzKCk7Cit9CisKK2Z1bmN0aW9uIHJ1blRlc3RzKCkgeworICB0ZXN0RHJpdmVyKGNsaWVudCwgZnVuY3Rpb24oc3RhdHVzKSB7CisgICAgY29uc29sZS5sb2coc3RhdHVzKTsKKyAgICBpZiAodHlwZSAhPT0gImh0dHAiICYmIHR5cGUgIT09ICJ3ZWJzb2NrZXQiKSB7CisgICAgICBjb25uZWN0aW9uLmVuZCgpOworICAgIH0KKyAgICBpZiAodHlwZSAhPT0gIm11bHRpcGxleCIpIHsKKyAgICAgIHByb2Nlc3MuZXhpdCgwKTsKKyAgICB9CisgIH0pOworfQorCitleHBvcnRzLmV4cHJlc3NvVGVzdCA9IGZ1bmN0aW9uKCkge307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIGIvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDRkYWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwpAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjb25zdCB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvSnNEZWVwQ29uc3RydWN0b3JUZXN0X3R5cGVzIik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBidWZmZXJFcXVhbHMgPSByZXF1aXJlKCJidWZmZXItZXF1YWxzIik7CisKK2Z1bmN0aW9uIHNlcmlhbGl6ZUJpbmFyeShkYXRhKSB7CisgIGxldCBidWZmOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydChudWxsLCBmdW5jdGlvbihtc2cpIHsKKyAgICBidWZmID0gbXNnOworICB9KTsKKyAgY29uc3QgcHJvdCA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgIGRhdGEud3JpdGUocHJvdCk7CisgIHByb3QuZmx1c2goKTsKKyAgcmV0dXJuIGJ1ZmY7Cit9CisKK2Z1bmN0aW9uIGRlc2VyaWFsaXplQmluYXJ5KHNlcmlhbGl6ZWQsIHR5cGUpIHsKKyAgY29uc3QgdCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydChzZXJpYWxpemVkKTsKKyAgY29uc3QgcCA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHQpOworICBjb25zdCBkYXRhID0gbmV3IHR5cGUoKTsKKyAgZGF0YS5yZWFkKHApOworICByZXR1cm4gZGF0YTsKK30KKworZnVuY3Rpb24gc2VyaWFsaXplSlNPTihkYXRhKSB7CisgIGxldCBidWZmOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydChudWxsLCBmdW5jdGlvbihtc2cpIHsKKyAgICBidWZmID0gbXNnOworICB9KTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgdGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oIiIsIDAsIDApOworICBkYXRhLndyaXRlKHByb3RvY29sKTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisgIHByb3RvY29sLmZsdXNoKCk7CisgIHJldHVybiBidWZmOworfQorCitmdW5jdGlvbiBkZXNlcmlhbGl6ZUpTT04oc2VyaWFsaXplZCwgdHlwZSkgeworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQoc2VyaWFsaXplZCk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IHRocmlmdC5USlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgY29uc3QgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGRhdGEucmVhZChwcm90b2NvbCk7CisgIHByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgIHJldHVybiBkYXRhOworfQorCitmdW5jdGlvbiBjcmVhdGVUaHJpZnRPYmooKSB7CisgIHJldHVybiBuZXcgdHR5cGVzLkNvbXBsZXgoeworICAgIHN0cnVjdF9maWVsZDogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImEiIH0pLAorCisgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKKyAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJiIiB9KSwKKyAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJjIiB9KQorICAgIF0sCisKKyAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZCIgfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZSIgfSkKKyAgICBdLAorCisgICAgc3RydWN0X21hcF9maWVsZDogeworICAgICAgQTogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImYiIH0pLAorICAgICAgQjogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImciIH0pCisgICAgfSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogWworICAgICAgWworICAgICAgICB7CisgICAgICAgICAgQzogWworICAgICAgICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImgiIH0pLAorICAgICAgICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImkiIH0pCisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgXSwKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKKyAgICAgIEQ6IFsKKyAgICAgICAgeworICAgICAgICAgIERBOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiaiIgfSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgIERCOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiayIgfSkKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsibDAwIiwgImwwMSIsICJsMDIiXSwKKyAgICAgIFsibDEwIiwgImwxMSIsICJsMTIiXSwKKyAgICAgIFsibDIwIiwgImwyMSIsICJsMjIiXQorICAgIF0sCisKKyAgICBsaXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWworICAgICAgICBbIm0wMDAiLCAibTAwMSIsICJtMDAyIl0sCisgICAgICAgIFsibTAxMCIsICJtMDExIiwgIm0wMTIiXSwKKyAgICAgICAgWyJtMDIwIiwgIm0wMjEiLCAibTAyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0xMDAiLCAibTEwMSIsICJtMTAyIl0sCisgICAgICAgIFsibTExMCIsICJtMTExIiwgIm0xMTIiXSwKKyAgICAgICAgWyJtMTIwIiwgIm0xMjEiLCAibTEyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0yMDAiLCAibTIwMSIsICJtMjAyIl0sCisgICAgICAgIFsibTIxMCIsICJtMjExIiwgIm0yMTIiXSwKKyAgICAgICAgWyJtMjIwIiwgIm0yMjEiLCAibTIyMiJdCisgICAgICBdCisgICAgXQorICB9KTsKK30KKworZnVuY3Rpb24gY3JlYXRlSnNPYmooKSB7CisgIHJldHVybiB7CisgICAgc3RydWN0X2ZpZWxkOiB7IHZhbHVlOiAiYSIgfSwKKworICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbeyB2YWx1ZTogImIiIH0sIHsgdmFsdWU6ICJjIiB9XSwKKworICAgIHN0cnVjdF9zZXRfZmllbGQ6IFt7IHZhbHVlOiAiZCIgfSwgeyB2YWx1ZTogImUiIH1dLAorCisgICAgc3RydWN0X21hcF9maWVsZDogeworICAgICAgQTogeyB2YWx1ZTogImYiIH0sCisgICAgICBCOiB7IHZhbHVlOiAiZyIgfQorICAgIH0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgeworICAgICAgICAgIEM6IFt7IHZhbHVlOiAiaCIgfSwgeyB2YWx1ZTogImkiIH1dCisgICAgICAgIH0KKyAgICAgIF0KKyAgICBdLAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogeworICAgICAgRDogWworICAgICAgICB7CisgICAgICAgICAgREE6IHsgdmFsdWU6ICJqIiB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICBEQjogeyB2YWx1ZTogImsiIH0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsibDAwIiwgImwwMSIsICJsMDIiXSwKKyAgICAgIFsibDEwIiwgImwxMSIsICJsMTIiXSwKKyAgICAgIFsibDIwIiwgImwyMSIsICJsMjIiXQorICAgIF0sCisKKyAgICBsaXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWworICAgICAgICBbIm0wMDAiLCAibTAwMSIsICJtMDAyIl0sCisgICAgICAgIFsibTAxMCIsICJtMDExIiwgIm0wMTIiXSwKKyAgICAgICAgWyJtMDIwIiwgIm0wMjEiLCAibTAyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0xMDAiLCAibTEwMSIsICJtMTAyIl0sCisgICAgICAgIFsibTExMCIsICJtMTExIiwgIm0xMTIiXSwKKyAgICAgICAgWyJtMTIwIiwgIm0xMjEiLCAibTEyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0yMDAiLCAibTIwMSIsICJtMjAyIl0sCisgICAgICAgIFsibTIxMCIsICJtMjExIiwgIm0yMTIiXSwKKyAgICAgICAgWyJtMjIwIiwgIm0yMjEiLCAibTIyMiJdCisgICAgICBdCisgICAgXQorICB9OworfQorCitmdW5jdGlvbiBhc3NlcnRWYWx1ZXMob2JqLCBhc3NlcnQpIHsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X2ZpZWxkLnZhbHVlLCAiYSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSwgImIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X2xpc3RfZmllbGRbMV0udmFsdWUsICJjIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUsICJkIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUsICJlIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9tYXBfZmllbGQuQS52YWx1ZSwgImYiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X21hcF9maWVsZC5CLnZhbHVlLCAiZyIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXS52YWx1ZSwgImgiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMV0udmFsdWUsICJpIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQS52YWx1ZSwgImoiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzFdLkRCLnZhbHVlLCAiayIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMF0sICJsMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdLCAibDAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXSwgImwwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMF0sICJsMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdLCAibDExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXSwgImwxMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMF0sICJsMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdLCAibDIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXSwgImwyMiIpOworCisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdWzBdLCAibTAwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVsxXSwgIm0wMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMF1bMl0sICJtMDAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdWzBdLCAibTAxMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVsxXSwgIm0wMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMV1bMl0sICJtMDEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdWzBdLCAibTAyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVsxXSwgIm0wMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMl1bMl0sICJtMDIyIik7CisKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMF1bMF0sICJtMTAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzFdLCAibTEwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXVsyXSwgIm0xMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMV1bMF0sICJtMTEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzFdLCAibTExMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXVsyXSwgIm0xMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMl1bMF0sICJtMTIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzFdLCAibTEyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXVsyXSwgIm0xMjIiKTsKKworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXVswXSwgIm0yMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMV0sICJtMjAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdWzJdLCAibTIwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXVswXSwgIm0yMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMV0sICJtMjExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdWzJdLCAibTIxMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXVswXSwgIm0yMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMV0sICJtMjIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdWzJdLCAibTIyMiIpOworfQorCitmdW5jdGlvbiBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplLCBkZXNlcmlhbGl6ZSkgeworICBjb25zdCBjYXNlcyA9IHsKKyAgICAiU2VyaWFsaXplL2Rlc2VyaWFsaXplIHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0IjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICBjb25zdCB0T2JqID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgdHR5cGVzLkNvbXBsZXgpOworICAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkLCAibm90IHRoZSBzYW1lIG9iamVjdCIpOworICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0T2JqLCByZWNlaXZlZCk7CisgICAgICBhc3NlcnQuZW5kKCk7CisgICAgfSwKKworICAgICJOZXN0ZWQgc3RydWN0cyBhbmQgY29udGFpbmVycyBpbml0aWFsaXplZCBmcm9tIHBsYWluIGpzIG9iamVjdHMgc2hvdWxkIHNlcmlhbGl6ZSBzYW1lIGFzIGlmIGluaXRpYWxpemVkIGZyb20gdGhyaWZ0IG9iamVjdHMiOiBmdW5jdGlvbigKKyAgICAgIGFzc2VydAorICAgICkgeworICAgICAgY29uc3QgdE9iajEgPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICAgIGNvbnN0IHRPYmoyID0gbmV3IHR0eXBlcy5Db21wbGV4KGNyZWF0ZUpzT2JqKCkpOworICAgICAgYXNzZXJ0VmFsdWVzKHRPYmoyLCBhc3NlcnQpOworICAgICAgY29uc3QgczEgPSBzZXJpYWxpemUodE9iajEpOworICAgICAgY29uc3QgczIgPSBzZXJpYWxpemUodE9iajIpOworICAgICAgYXNzZXJ0Lm9rKGJ1ZmZlckVxdWFscyhzMSwgczIpKTsKKyAgICAgIGFzc2VydC5lbmQoKTsKKyAgICB9LAorCisgICAgIk1vZGlmaWNhdGlvbnMgdG8gYXJncyBvYmplY3Qgc2hvdWxkIG5vdCBhZmZlY3QgY29uc3RydWN0ZWQgVGhyaWZ0IG9iamVjdCI6IGZ1bmN0aW9uKAorICAgICAgYXNzZXJ0CisgICAgKSB7CisgICAgICBjb25zdCBhcmdzID0gY3JlYXRlSnNPYmooKTsKKyAgICAgIGFzc2VydFZhbHVlcyhhcmdzLCBhc3NlcnQpOworCisgICAgICBjb25zdCB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KGFyZ3MpOworICAgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CisKKyAgICAgIGFyZ3Muc3RydWN0X2ZpZWxkLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzFdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbWFwX2ZpZWxkLkEudmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5CLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREIgPSAiWlpaIjsKKworICAgICAgYXNzZXJ0VmFsdWVzKHRPYmosIGFzc2VydCk7CisgICAgICBhc3NlcnQuZW5kKCk7CisgICAgfSwKKworICAgICJudWxscyBhcmUgb2siOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgIGNvbnN0IHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXgoeworICAgICAgICBzdHJ1Y3RfZmllbGQ6IG51bGwsCisgICAgICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiBudWxsLAorICAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IG51bGwsCisgICAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IG51bGwKKyAgICAgIH0pOworICAgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIHR0eXBlcy5Db21wbGV4KTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0T2JqLnN0cnVjdF9maWVsZCwgbnVsbCk7CisgICAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQpOworICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0T2JqLCByZWNlaXZlZCk7CisgICAgICBhc3NlcnQuZW5kKCk7CisgICAgfSwKKworICAgICJDYW4gbWFrZSBsaXN0IHdpdGggb2JqZWN0cyI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleExpc3QoeworICAgICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogW25ldyB0dHlwZXMuQ29tcGxleCh7fSldCisgICAgICB9KTsKKyAgICAgIGNvbnN0IGlubmVyT2JqID0gdE9iai5zdHJ1Y3RfbGlzdF9maWVsZFswXTsKKyAgICAgIGFzc2VydC5vayhpbm5lck9iaiBpbnN0YW5jZW9mIHR0eXBlcy5Db21wbGV4KTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfZmllbGQsIG51bGwpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9saXN0X2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3Rfc2V0X2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbWFwX2ZpZWxkLCBudWxsKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQsIG51bGwpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIsIG51bGwpOworICAgICAgYXNzZXJ0LmVuZCgpOworICAgIH0KKyAgfTsKKyAgcmV0dXJuIGNhc2VzOworfQorCitmdW5jdGlvbiBydW4obmFtZSwgY2FzZXMpIHsKKyAgT2JqZWN0LmtleXMoY2FzZXMpLmZvckVhY2goZnVuY3Rpb24oY2FzZU5hbWUpIHsKKyAgICB0ZXN0KG5hbWUgKyAiOiAiICsgY2FzZU5hbWUsIGNhc2VzW2Nhc2VOYW1lXSk7CisgIH0pOworfQorCitydW4oImJpbmFyeSIsIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemVCaW5hcnksIGRlc2VyaWFsaXplQmluYXJ5KSk7CitydW4oImpzb24iLCBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplSlNPTiwgZGVzZXJpYWxpemVKU09OKSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvZXhjZXB0aW9ucy5qcyBiL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjc5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvZXhjZXB0aW9ucy5qcwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisidXNlIHN0cmljdCI7Citjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdC90aHJpZnQuanMiKTsKK2NvbnN0IElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yIik7CisKK3Rlc3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigxLCAiZm9vIik7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKKyAgICAiaXMgaW5zdGFuY2VvZiBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICJpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15UQXBwbGljYXRpb25FeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjc6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CisgIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICJoYXMgdHlwZSAxIik7CisgIGFzc2VydC5lbmQoKTsKK30pOworCit0ZXN0KCJ1bmV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAiLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oMSwgMTAwKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLAorICAgICJpcyBpbnN0YW5jZW9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgImlzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogMTAwLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6NzoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsIDEwMCwgImhhcyBlcnJvciBtZXNzYWdlIDEwMCIpOworICBhc3NlcnQuZXF1YWwoZS50eXBlLCAxLCAiaGFzIHR5cGUgMSIpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKKwordGVzdCgiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRFeGNlcHRpb24oImZvbyIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5URXhjZXB0aW9uLCAiaXMgaW5zdGFuY2VvZiBURXhjZXB0aW9uIik7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eVEV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6MjE6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubmFtZSwgIlRFeGNlcHRpb24iLCAiaGFzIGZ1bmN0aW9uIG5hbWUgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CisgIGFzc2VydC5lbmQoKTsKK30pOworCit0ZXN0KCJUUHJvdG9jb2xFeGNlcHRpb24iLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oMSwgImZvbyIpOworICBhc3NlcnQub2soCisgICAgZSBpbnN0YW5jZW9mIHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24sCisgICAgImlzIGluc3RhbmNlb2YgVFByb3RvY29sRXhjZXB0aW9uIgorICApOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRQcm90b2NvbEV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6MzM6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiVFByb3RvY29sRXhjZXB0aW9uIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgVFByb3RvY29sRXhjZXB0aW9uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CisgIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICJoYXMgdHlwZSAxIik7CisgIGFzc2VydC5lbmQoKTsKK30pOworCit0ZXN0KCJJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IiLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcigiZm9vIik7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yLAorICAgICJpcyBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3I6IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjQ2OjExIikgIT09IC0xLAorICAgICJzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4iCisgICk7CisgIGFzc2VydC5lcXVhbCgKKyAgICBlLm5hbWUsCisgICAgIklucHV0QnVmZmVyVW5kZXJydW5FcnJvciIsCisgICAgImhhcyBmdW5jdGlvbiBuYW1lIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgImZvbyIsICdoYXMgZXJyb3IgbWVzc2FnZSAiZm9vIicpOworICBhc3NlcnQuZW5kKCk7Cit9KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9oZWxwZXJzLmpzIGIvbGliL25vZGVqcy90ZXN0L2hlbHBlcnMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkMTI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9oZWxwZXJzLmpzCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworInVzZSBzdHJpY3QiOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdCIpOworCittb2R1bGUuZXhwb3J0cy50cmFuc3BvcnRzID0geworICBidWZmZXJlZDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgZnJhbWVkOiB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydAorfTsKKworbW9kdWxlLmV4cG9ydHMucHJvdG9jb2xzID0geworICBqc29uOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAgYmluYXJ5OiB0aHJpZnQuVEJpbmFyeVByb3RvY29sLAorICBjb21wYWN0OiB0aHJpZnQuVENvbXBhY3RQcm90b2NvbAorfTsKKworbW9kdWxlLmV4cG9ydHMuZWNtYU1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoIi0tZXM2IikgPyAiZXM2IiA6ICJlczUiOworbW9kdWxlLmV4cG9ydHMuZ2VuUGF0aCA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygiLS1lczYiKQorICA/ICJnZW4tbm9kZWpzLWVzNiIKKyAgOiAiZ2VuLW5vZGVqcyI7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmNydCBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWVmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmNydApAQCAtMCwwICsxLDI1IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3NlcnZlci5qcyBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwMjA5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuanMKQEAgLTAsMCArMSwxMzcgQEAKKyMhL3Vzci9iaW4vZW52IG5vZGUKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjb25zdCBmcyA9IHJlcXVpcmUoImZzIik7Citjb25zdCBwYXRoID0gcmVxdWlyZSgicGF0aCIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdCIpOworY29uc3QgcHJvZ3JhbSA9IHJlcXVpcmUoImNvbW1hbmRlciIpOworY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworCitwcm9ncmFtCisgIC5vcHRpb24oCisgICAgIi1wLCAtLXByb3RvY29sIDxwcm90b2NvbD4iLAorICAgICJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnl8Y29tcGFjdHxqc29uKSIsCisgICAgImJpbmFyeSIKKyAgKQorICAub3B0aW9uKAorICAgICItdCwgLS10cmFuc3BvcnQgPHRyYW5zcG9ydD4iLAorICAgICJTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkfGh0dHApIiwKKyAgICAiYnVmZmVyZWQiCisgICkKKyAgLm9wdGlvbigiLS1zc2wiLCAidXNlIHNzbCB0cmFuc3BvcnQiKQorICAub3B0aW9uKCItLXBvcnQgPHBvcnQ+IiwgIlNldCB0aHJpZnQgc2VydmVyIHBvcnQiLCA5MDkwKQorICAub3B0aW9uKCItLWRvbWFpbi1zb2NrZXQgPHBhdGg+IiwgIlNldCB0aGlmdCBzZXJ2ZXIgdW5peCBkb21haW4gc29ja2V0IikKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHlwZSA8dHlwZT4iLAorICAgICJTZWxlY3Qgc2VydmVyIHR5cGUgKGh0dHB8bXVsdGlwbGV4fHRjcHx3ZWJzb2NrZXQpIiwKKyAgICAidGNwIgorICApCisgIC5vcHRpb24oIi0tY2FsbGJhY2siLCAidGVzdCB3aXRoIGNhbGxiYWNrIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oIi0tZXM2IiwgIlVzZSBlczYgY29kZSIpCisgIC5vcHRpb24oIi0tZXM1IiwgIlVzZSBlczUgY29kZSIpCisgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOworCitjb25zdCBUaHJpZnRUZXN0ID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdGApOworY29uc3QgU2Vjb25kU2VydmljZSA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1NlY29uZFNlcnZpY2VgKTsKK2NvbnN0IHsgVGhyaWZ0VGVzdEhhbmRsZXIgfSA9IHJlcXVpcmUoIi4vdGVzdF9oYW5kbGVyIik7CisKK2NvbnN0IHBvcnQgPSBwcm9ncmFtLnBvcnQ7Citjb25zdCBkb21haW5Tb2NrZXQgPSBwcm9ncmFtLmRvbWFpblNvY2tldDsKK2NvbnN0IHNzbCA9IHByb2dyYW0uc3NsOworCitsZXQgdHlwZSA9IHByb2dyYW0udHlwZTsKK2lmIChwcm9ncmFtLnRyYW5zcG9ydCA9PT0gImh0dHAiKSB7CisgIHByb2dyYW0udHJhbnNwb3J0ID0gImJ1ZmZlcmVkIjsKKyAgdHlwZSA9ICJodHRwIjsKK30KKworbGV0IG9wdGlvbnMgPSB7CisgIHRyYW5zcG9ydDogaGVscGVycy50cmFuc3BvcnRzW3Byb2dyYW0udHJhbnNwb3J0XSwKKyAgcHJvdG9jb2w6IGhlbHBlcnMucHJvdG9jb2xzW3Byb2dyYW0ucHJvdG9jb2xdCit9OworCitpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIG9wdGlvbnMuaGFuZGxlciA9IFRocmlmdFRlc3RIYW5kbGVyOworICBvcHRpb25zLnByb2Nlc3NvciA9IFRocmlmdFRlc3Q7CisKKyAgb3B0aW9ucyA9IHsKKyAgICBzZXJ2aWNlczogeyAiL3Rlc3QiOiBvcHRpb25zIH0sCisgICAgY29yczogeworICAgICAgIioiOiB0cnVlCisgICAgfQorICB9OworfQorCitsZXQgcHJvY2Vzc29yOworaWYgKHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgIGNvbnN0IFNlY29uZFNlcnZpY2VIYW5kbGVyID0geworICAgIHNlY29uZHRlc3RTdHJpbmc6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nKCInICsgdGhpbmcgKyAnIiknKTsKKyAgICAgIHJlc3VsdChudWxsLCAndGVzdFN0cmluZygiJyArIHRoaW5nICsgJyIpJyk7CisgICAgfQorICB9OworCisgIHByb2Nlc3NvciA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKworICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgIlRocmlmdFRlc3QiLAorICAgIG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcihUaHJpZnRUZXN0SGFuZGxlcikKKyAgKTsKKworICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgIlNlY29uZFNlcnZpY2UiLAorICAgIG5ldyBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihTZWNvbmRTZXJ2aWNlSGFuZGxlcikKKyAgKTsKK30KKworaWYgKHNzbCkgeworICBpZiAoCisgICAgdHlwZSA9PT0gInRjcCIgfHwKKyAgICB0eXBlID09PSAibXVsdGlwbGV4IiB8fAorICAgIHR5cGUgPT09ICJodHRwIiB8fAorICAgIHR5cGUgPT09ICJ3ZWJzb2NrZXQiCisgICkgeworICAgIG9wdGlvbnMudGxzID0geworICAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgInNlcnZlci5rZXkiKSksCisgICAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgInNlcnZlci5jcnQiKSkKKyAgICB9OworICB9Cit9CisKK2xldCBzZXJ2ZXI7CitpZiAodHlwZSA9PT0gInRjcCIpIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LCBUaHJpZnRUZXN0SGFuZGxlciwgb3B0aW9ucyk7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIocHJvY2Vzc29yLCBvcHRpb25zKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIob3B0aW9ucyk7Cit9CisKK2lmIChkb21haW5Tb2NrZXQpIHsKKyAgc2VydmVyLmxpc3Rlbihkb21haW5Tb2NrZXQpOworfSBlbHNlIGlmICgKKyAgdHlwZSA9PT0gInRjcCIgfHwKKyAgdHlwZSA9PT0gIm11bHRpcGxleCIgfHwKKyAgdHlwZSA9PT0gImh0dHAiIHx8CisgIHR5cGUgPT09ICJ3ZWJzb2NrZXQiCispIHsKKyAgc2VydmVyLmxpc3Rlbihwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIua2V5IGIvbGliL25vZGVqcy90ZXN0L3NlcnZlci5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzY2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIua2V5CkBAIC0wLDAgKzEsMjggQEAKKy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQorTUlJRXZBSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS1l3Z2dTaUFnRUFBb0lCQVFDcUU5VEU5d0VYcDVMUgordExRVkRTR1FHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeQorU044STJYdzZMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSAoraktOZzZaS2cyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQgorR21abU1JVXdBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYawordTYyTGlwa1h3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbQordHJoVlFGNG5BZ01CQUFFQ2dnRUFXL3k1MllZVzZ5cFJPR2JaOTREUXBGVjBrTE83cVQ4cTBLc3h3NXNQTmFJdAorZkVQUkl5bURhOGlreUhXSlM1T3htdzg0d281am5KVjI2amFMbXdlMkx1cHE3WGYxbHFlajhmNUxKdHV2N2NRUgoreGZ6cDF2TTY1S0pGRkpIcDZXcWpHcUo2SFNTWk9wVkRzblFZY1hRalFDZHB5QW1hU1dkM3ArRnFZU1oxbVFtRAorYkZOSTdqcXBjeldTWmhUZG90UTdwN0huOVRWQ2VoZmxQM3lHSUIzYlErd0NjQ0I4NWRPQnoyMDFMK1lnYUljaworU3o0M0E0TnZXYVFJUkxSRHc3czlHVzRqWTVUMEp2MjgyV0llQWxWcFZ4TEl3dTQ4cjRSNHlHVEl4OVlkb3d2cQorNTcrWTVpUFBqQVh4dTBWOXQwMG9TM2JZeERhS2gyRFVmYy81em93cThRS0JnUURZTlZQWG1hRzBhSUg0dmpROQorN2ZSZHcvVURrWWNRYm42Q25nbFFPdTc3L1M4b2dRenBLQ1ZKZ0pna1pOcU9WdFFNRVB6ZWtHRWNMVGJqZTFnVQorOEJreTJrK1BMOVV3YkZ5MGVtbk9WaDRycXJOWEhzUnZKY2VoTlQvUFJiNWhqRjNNVU1GVi8waUQ0YituYUZhRQoranJTV2laMlpYajJxZndBSzUyR0ZidE91QlFLQmdRREpZUXVHaVkwcjIyRTR3YUptQ1NLY3pvQlQzY3dsVnpXagorVjJsamdBOVJITE5UVmt2Tk5ZUUxHdTJxbmdGcnR3cGVhU25zTURlclZHNHdLQVFXeUNuWXp4VnJsbkM0dURySgorSFh1RkVsdEJXaTlGZmJnZnNuZDM3NDlBVDBvQlAxTlQydE1sZWd1eWY1REZnakNSM1ZSSkxkclZhYVo4cm93LworTHFLY0ZNcW5Pd0tCZ0IrT0lPOTlsN0U1ODRZM1ZHNlpkU25lT0x0Tm1SWFgycFQ3dGNaRTQ2NVpkSEdIN0RkMworU1lIaHg5Sy8rWG4reURIK3BMbGkveGxhckFFbGRtU1A2azJXdVRmZnRsQzc4QWZUT2ZBSWQ1ek43Q0RSOTc5MQorRng2N0k5WC9pdHEzM3RTOEVJdVpsNTdQNnVYbS80R1hSbG9XT2E4eHB2UmtWc0JBcHVZUGw4dDFBb0dBVFFEUworeTJzbGxET2JCWHpsZ0diVjJXZ05JZ1NaMzExdG9UdjNqSmlYUXNqYXVXOHlKUkhsbitsNEg5bXphV0Rna2lGYworYW5nMWtVb0RxRjVrMGVGUVB4dFFjWWRoS3dFbldXZndwMzNSYnpmeEEzMkRQbnVidXp6YlpoZnJrSGFLZ25JVworY3lvcjl1RllsbTJsN09EWkxmSmV6MlJLeVRwbFhuT1NzbVF3NmFrQ2dZQXozZGo5SHNreWorSFZKK2h0MU9jRQorYzdhaS9FU2tTQTdWYWpwMHRqSnAwRUtqVy96cThEdlVTWE90Y2RuSmdrS3ljRmx1THdibW5hTjR0eEJkczFDMQorUXI4UnQyc1VDQ0JOWmUxTDZESGUzWEJkYmtKZTlzZ1pWTlRqdFVTUXJ6eThVaHZzQ3FHNFlXZUN1MDdTemNiYworcmRQVVY5L3VRa2R4OFZyU2h4bEQ4QT09CistLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdC1jYXNlcy5qcyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzU2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdC1jYXNlcy5qcwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisidXNlIHN0cmljdCI7CisKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworCisvL2FsbCBMYW5ndWFnZXMgaW4gVVRGLTgKKy8qanNoaW50IC1XMTAwICovCitjb25zdCBzdHJpbmdUZXN0ID0gKG1vZHVsZS5leHBvcnRzLnN0cmluZ1Rlc3QgPQorICAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKworICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKworICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCisgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKworICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCisgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKworICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKKyAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArCisgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKKyAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKworICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCisgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKworICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKworICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsKKyAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKworICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArCisgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgIkLDom4tbMOibS1nw7osIOeyteiqniIpOworLypqc2hpbnQgK1cxMDAgKi8KKworY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAobW9kdWxlLmV4cG9ydHMuc3BlY2lhbENoYXJhY3RlcnMgPQorICAncXVvdGU6ICIgYmFja3NsYXNoOicgKworICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiAvICIgKworICAiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiICsKKyAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXC9cYlxuXHJcdCcgKworICAiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiICsKKyAgJyBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSAiXV0gXFwiIH19fXsgW1tbICcpOworCitjb25zdCBtYXBUZXN0SW5wdXQgPSAobW9kdWxlLmV4cG9ydHMubWFwVGVzdElucHV0ID0geworICBhOiAiMTIzIiwKKyAgImEgYiI6ICJ3aXRoIHNwYWNlcyAiLAorICBzYW1lOiAic2FtZSIsCisgICIwIjogIm51bWVyaWMga2V5IiwKKyAgbG9uZ1ZhbHVlOiBzdHJpbmdUZXN0LAorICBzdHJpbmdUZXN0OiAibG9uZyBrZXkiCit9KTsKKworY29uc3Qgc2ltcGxlID0gWworICBbInRlc3RWb2lkIiwgdW5kZWZpbmVkXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgIlRlc3QiXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgIiJdLAorICBbInRlc3RTdHJpbmciLCBzdHJpbmdUZXN0XSwKKyAgWyJ0ZXN0U3RyaW5nIiwgc3BlY2lhbENoYXJhY3RlcnNdLAorICBbInRlc3RCb29sIiwgdHJ1ZV0sCisgIFsidGVzdEJvb2wiLCBmYWxzZV0sCisgIFsidGVzdEJ5dGUiLCAxXSwKKyAgWyJ0ZXN0Qnl0ZSIsIDBdLAorICBbInRlc3RCeXRlIiwgLTFdLAorICBbInRlc3RCeXRlIiwgLTEyN10sCisgIFsidGVzdEkzMiIsIC0xXSwKKyAgWyJ0ZXN0RG91YmxlIiwgLTUuMjA5ODUyM10sCisgIFsidGVzdERvdWJsZSIsIDcuMDEyMDUyMTc1MjE1MDQ0XSwKKyAgWyJ0ZXN0RW51bSIsIHR0eXBlcy5OdW1iZXJ6Lk9ORV0sCisgIFsidGVzdEk2NCIsIDVdLAorICBbInRlc3RJNjQiLCAtNV0sCisgIFsidGVzdEk2NCIsIDczNDM1OTczODM2OF0sCisgIFsidGVzdEk2NCIsIC03MzQzNTk3MzgzNjhdLAorICBbInRlc3RJNjQiLCBuZXcgSW50NjQobmV3IEJ1ZmZlcihbMCwgMHgyMCwgMCwgMCwgMCwgMCwgMCwgMV0pKV0sIC8vIDJeNTMrMQorICBbCisgICAgInRlc3RJNjQiLAorICAgIG5ldyBJbnQ2NChuZXcgQnVmZmVyKFsweGZmLCAweGRmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSkpCisgIF0sIC8vIC0yXjUzLTEKKyAgWyJ0ZXN0VHlwZWRlZiIsIDY5XQorXTsKKworY29uc3QgbWFwb3V0ID0ge307Citmb3IgKGxldCBpID0gMDsgaSA8IDU7ICsraSkgeworICBtYXBvdXRbaV0gPSBpIC0gMTA7Cit9CisKK2NvbnN0IGRlZXAgPSBbCisgIFsKKyAgICAidGVzdExpc3QiLAorICAgIFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjBdCisgIF0KK107CisKK2NvbnN0IGRlZXBVbm9yZGVyZWQgPSBbCisgIFsidGVzdE1hcCIsIG1hcG91dF0sCisgIFsidGVzdFNldCIsIFsxLCAyLCAzXV0sCisgIFsidGVzdFN0cmluZ01hcCIsIG1hcFRlc3RJbnB1dF0KK107CisKK2NvbnN0IG91dCA9IG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgc3RyaW5nX3RoaW5nOiAiWmVybyIsCisgIGJ5dGVfdGhpbmc6IDEsCisgIGkzMl90aGluZzogLTMsCisgIGk2NF90aGluZzogMTAwMDAwMAorfSk7CisKK2NvbnN0IG91dDIgPSBuZXcgdHR5cGVzLlh0cnVjdDIoKTsKK291dDIuYnl0ZV90aGluZyA9IDE7CitvdXQyLnN0cnVjdF90aGluZyA9IG91dDsKK291dDIuaTMyX3RoaW5nID0gNTsKKworY29uc3QgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKKyAgdXNlck1hcDogeyAiNSI6IDUsICI4IjogOCB9LAorICB4dHJ1Y3RzOiBbCisgICAgbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgc3RyaW5nX3RoaW5nOiAiR29vZGJ5ZTQiLAorICAgICAgYnl0ZV90aGluZzogNCwKKyAgICAgIGkzMl90aGluZzogNCwKKyAgICAgIGk2NF90aGluZzogNAorICAgIH0pLAorICAgIG5ldyB0dHlwZXMuWHRydWN0KHsKKyAgICAgIHN0cmluZ190aGluZzogIkhlbGxvMiIsCisgICAgICBieXRlX3RoaW5nOiAyLAorICAgICAgaTMyX3RoaW5nOiAyLAorICAgICAgaTY0X3RoaW5nOiAyCisgICAgfSkKKyAgXQorfSk7CisKK2NvbnN0IGNyYXp5MiA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoeworICB1c2VyTWFwOiB7ICI1IjogNSwgIjgiOiA4IH0sCisgIHh0cnVjdHM6IFsKKyAgICB7CisgICAgICBzdHJpbmdfdGhpbmc6ICJHb29kYnllNCIsCisgICAgICBieXRlX3RoaW5nOiA0LAorICAgICAgaTMyX3RoaW5nOiA0LAorICAgICAgaTY0X3RoaW5nOiA0CisgICAgfSwKKyAgICB7CisgICAgICBzdHJpbmdfdGhpbmc6ICJIZWxsbzIiLAorICAgICAgYnl0ZV90aGluZzogMiwKKyAgICAgIGkzMl90aGluZzogMiwKKyAgICAgIGk2NF90aGluZzogMgorICAgIH0KKyAgXQorfSk7CisKK2NvbnN0IGluc2FuaXR5ID0geworICAiMSI6IHsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LAorICAiMiI6IHsgIjYiOiB7IHVzZXJNYXA6IHt9LCB4dHJ1Y3RzOiBbXSB9IH0KK307CisKK21vZHVsZS5leHBvcnRzLnNpbXBsZSA9IHNpbXBsZTsKK21vZHVsZS5leHBvcnRzLmRlZXAgPSBkZWVwOworbW9kdWxlLmV4cG9ydHMuZGVlcFVub3JkZXJlZCA9IGRlZXBVbm9yZGVyZWQ7CisKK21vZHVsZS5leHBvcnRzLm91dCA9IG91dDsKK21vZHVsZS5leHBvcnRzLm91dDIgPSBvdXQyOworbW9kdWxlLmV4cG9ydHMuY3JhenkgPSBjcmF6eTsKK21vZHVsZS5leHBvcnRzLmNyYXp5MiA9IGNyYXp5MjsKK21vZHVsZS5leHBvcnRzLmluc2FuaXR5ID0gaW5zYW5pdHk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaCBiL2xpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0ZjFmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaApAQCAtMCwwICsxLDk4IEBACisjISAvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpZiBbIC1uICIkezF9IiBdOyB0aGVuCisgIENPVkVSPSR7MX07CitmaQorCitESVI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkiCisKK0lTVEFOQlVMPSIkRElSLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pc3RhbmJ1bC9saWIvY2xpLmpzIgorCitSRVBPUlRfUFJFRklYPSIke0RJUn0vLi4vY292ZXJhZ2UvcmVwb3J0IgorCitDT1VOVD0wCisKK2V4cG9ydCBOT0RFX1BBVEg9IiR7RElSfToke0RJUn0vLi4vbGliOiR7Tk9ERV9QQVRIfSIKKwordGVzdFNlcnZlcigpCit7CisgIGVjaG8gIiAgW0VDTUEgJDFdIFRlc3RpbmcgJDIgQ2xpZW50L1NlcnZlciB3aXRoIHByb3RvY29sICQzIGFuZCB0cmFuc3BvcnQgJDQgJDUiOworICBSRVQ9MAorICBpZiBbIC1uICIke0NPVkVSfSIgXTsgdGhlbgorICAgICR7SVNUQU5CVUx9IGNvdmVyICR7RElSfS9zZXJ2ZXIuanMgLS1kaXIgJHtSRVBPUlRfUFJFRklYfSR7Q09VTlR9IC0taGFuZGxlLXNpZ2ludCAtLSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgJgorICAgIENPVU5UPSQoKENPVU5UKzEpKQorICBlbHNlCisgICAgbm9kZSAke0RJUn0vc2VydmVyLmpzIC0tJHsxfSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgJgorICBmaQorICBTRVJWRVJQSUQ9JCEKKyAgc2xlZXAgMC4xCisgIGlmIFsgLW4gIiR7Q09WRVJ9IiBdOyB0aGVuCisgICAgJHtJU1RBTkJVTH0gY292ZXIgJHtESVJ9L2NsaWVudC5qcyAtLWRpciAke1JFUE9SVF9QUkVGSVh9JHtDT1VOVH0gLS0gLS0kezF9IC0tdHlwZSAkMiAtcCAkMyAtdCAkNCAkNSB8fCBSRVQ9MQorICAgIENPVU5UPSQoKENPVU5UKzEpKQorICBlbHNlCisgICAgbm9kZSAke0RJUn0vY2xpZW50LmpzIC0tJHsxfSAtLXR5cGUgJDIgLXAgJDMgLXQgJDQgJDUgfHwgUkVUPTEKKyAgZmkKKyAga2lsbCAtMiAkU0VSVkVSUElEIHx8IFJFVD0xCisgIHdhaXQgJFNFUlZFUlBJRAorICByZXR1cm4gJFJFVAorfQorCisKK1RFU1RPSz0wCisKKyNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisKKyR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSAke0RJUn0vLi4vLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0Citta2RpciAke0RJUn0vZ2VuLW5vZGVqcy1lczYKKyR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJHtESVJ9L2dlbi1ub2RlanMtZXM2IC0tZ2VuIGpzOm5vZGUsZXM2ICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICR7RElSfS9nZW4tbm9kZWpzLWVzNiAtLWdlbiBqczpub2RlLGVzNiAke0RJUn0vLi4vLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0CisKKyN1bml0IHRlc3RzCisKK25vZGUgJHtESVJ9L2JpbmFyeS50ZXN0LmpzIHx8IFRFU1RPSz0xCitub2RlICR7RElSfS9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMgfHwgVEVTVE9LPTEKKworI2ludGVncmF0aW9uIHRlc3RzCisKK2ZvciB0eXBlIGluIHRjcCBtdWx0aXBsZXggd2Vic29ja2V0IGh0dHAKK2RvCisgIGZvciBwcm90b2NvbCBpbiBjb21wYWN0IGJpbmFyeSBqc29uCisgIGRvCisgICAgZm9yIHRyYW5zcG9ydCBpbiBidWZmZXJlZCBmcmFtZWQKKyAgICBkbworICAgICAgZm9yIGVjbWFfdmVyc2lvbiBpbiBlczUgZXM2CisgICAgICBkbworICAgICAgICB0ZXN0U2VydmVyICRlY21hX3ZlcnNpb24gJHR5cGUgJHByb3RvY29sICR0cmFuc3BvcnQgfHwgVEVTVE9LPTEKKyAgICAgICAgdGVzdFNlcnZlciAkZWNtYV92ZXJzaW9uICR0eXBlICRwcm90b2NvbCAkdHJhbnNwb3J0IC0tc3NsIHx8IFRFU1RPSz0xCisgICAgICAgIHRlc3RTZXJ2ZXIgJGVjbWFfdmVyc2lvbiAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLWNhbGxiYWNrIHx8IFRFU1RPSz0xCisgICAgICBkb25lCisgICAgZG9uZQorICBkb25lCitkb25lCisKKworaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KKyAgJHtJU1RBTkJVTH0gcmVwb3J0IC0tZGlyICIke0RJUn0vLi4vY292ZXJhZ2UiIC0taW5jbHVkZSAiJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCovY292ZXJhZ2UuanNvbiIgbGNvdiBjb2JlcnR1cmEgaHRtbAorICBybSAtciAke0RJUn0vLi4vY292ZXJhZ2UvcmVwb3J0Ki8qCisgIHJtZGlyICR7RElSfS8uLi9jb3ZlcmFnZS9yZXBvcnQqCitmaQorCitleGl0ICRURVNUT0sKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzlhOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfZHJpdmVyLmpzCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgdGhlIE5vZGUuanMgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0CisvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQorLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4KKy8vCisvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKKy8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZAorLy8gc3VwcG9ydHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdpdGgKKy8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KKworY29uc3QgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKKworY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoInRocmlmdCIpLlRocmlmdC5URXhjZXB0aW9uOworY29uc3QgSW50NjQgPSByZXF1aXJlKCJub2RlLWludDY0Iik7Citjb25zdCB0ZXN0Q2FzZXMgPSByZXF1aXJlKCIuL3Rlc3QtY2FzZXMiKTsKKworZXhwb3J0cy5UaHJpZnRUZXN0RHJpdmVyID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgeworICB0ZXN0KAorICAgICJOb2RlSlMgU3R5bGUgQ2FsbGJhY2sgQ2xpZW50IFRlc3RzIiwKKyAgICB7IHNraXA6IGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiIH0sCisgICAgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CisKKyAgICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbikgeworICAgICAgICByZXR1cm4gZnVuY3Rpb24oYykgeworICAgICAgICAgIGNvbnN0IGZuTmFtZSA9IGNbMF07CisgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAgIGNsaWVudFtmbk5hbWVdKGV4cGVjdGVkLCBmdW5jdGlvbihlcnIsIGFjdHVhbCkgeworICAgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgIjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaCgKKyAgICAgICAgbWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0pIHsKKyAgICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIEludDY0KSB7CisgICAgICAgICAgICBjb25zdCBlNjQgPSBlIGluc3RhbmNlb2YgSW50NjQgPyBlIDogbmV3IEludDY0KGUpOworICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhLmJ1ZmZlciwgZTY0LmJ1ZmZlciwgbSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydC5lcXVhbChhLCBlLCBtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pCisgICAgICApOworICAgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworICAgICAgdGVzdENhc2VzLmRlZXBVbm9yZGVyZWQuZm9yRWFjaCgKKyAgICAgICAgbWFrZUFzc2VydGVyKG1ha2VVbm9yZGVyZWREZWVwRXF1YWwoYXNzZXJ0KSkKKyAgICAgICk7CisKKyAgICAgIGNvbnN0IGFyciA9IFtdOworICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICBhcnJbaV0gPSAyNTUgLSBpOworICAgICAgfQorICAgICAgbGV0IGJ1ZiA9IG5ldyBCdWZmZXIoYXJyKTsKKyAgICAgIGNsaWVudC50ZXN0QmluYXJ5KGJ1ZiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEJpbmFyeTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3BvbnNlLmxlbmd0aCwgMjU2LCAidGVzdEJpbmFyeSIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCBidWYsICJ0ZXN0QmluYXJ5KEJ1ZmZlcikiKTsKKyAgICAgIH0pOworICAgICAgYnVmID0gbmV3IEJ1ZmZlcihhcnIpOworICAgICAgY2xpZW50LnRlc3RCaW5hcnkoYnVmLnRvU3RyaW5nKCJiaW5hcnkiKSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEJpbmFyeTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3BvbnNlLmxlbmd0aCwgMjU2LCAidGVzdEJpbmFyeSIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCBidWYsICJ0ZXN0QmluYXJ5KHN0cmluZykiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE1hcE1hcCg0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBjb25zdCBleHBlY3RlZCA9IHsKKyAgICAgICAgICAiNCI6IHsgIjEiOiAxLCAiMiI6IDIsICIzIjogMywgIjQiOiA0IH0sCisgICAgICAgICAgIi00IjogeyAiLTQiOiAtNCwgIi0zIjogLTMsICItMiI6IC0yLCAiLTEiOiAtMSB9CisgICAgICAgIH07CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0TWFwTWFwOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGV4cGVjdGVkLCByZXNwb25zZSwgInRlc3RNYXBNYXAiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0U3RydWN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEluc2FuaXR5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKAorICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sCisgICAgICAgICAgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZSIKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgInRlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQub2soCisgICAgICAgICAgZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uLAorICAgICAgICAgICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUiCisgICAgICAgICk7CisgICAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICJ0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoCisgICAgICAgICAgIlhjZXB0aW9uIiwKKyAgICAgICAgICBlcnIubWVzc2FnZSwKKyAgICAgICAgICAidGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlIgorICAgICAgICApOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0RXhjZXB0aW9uOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAidGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0T25ld2F5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgICAgY2xpZW50LnRlc3RJMzIoLTEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAiY2hlY2tPZmZCeU9uZTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgZG9uZSgpOworICAgICAgICB9KTsKKyAgICAgIH0sIGNhbGxiYWNrKTsKKyAgICB9CisgICk7CisKKyAgLy8gRVM2IGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUKKyAgaWYgKGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiKSB7CisgICAgY2hlY2tPZmZCeU9uZShkb25lID0+IGRvbmUoKSwgY2FsbGJhY2spOworICB9Cit9OworCitleHBvcnRzLlRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgeworICB0ZXN0KCJQcm9taXNlIENsaWVudCBUZXN0cyIsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGNoZWNrUmVjdXJzaXZlbHkgPSBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0KTsKKworICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbikgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGMpIHsKKyAgICAgICAgY29uc3QgZm5OYW1lID0gY1swXTsKKyAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICBjbGllbnRbZm5OYW1lXShleHBlY3RlZCkKKyAgICAgICAgICAudGhlbihmdW5jdGlvbihhY3R1YWwpIHsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSkKKyAgICAgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoImZuTmFtZSIpKTsKKyAgICAgIH07CisgICAgfQorCisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKAorICAgICAgbWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0pIHsKKyAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgICAgICAgIGNvbnN0IGU2NCA9IGUgaW5zdGFuY2VvZiBJbnQ2NCA/IGUgOiBuZXcgSW50NjQoZSk7CisgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhLmJ1ZmZlciwgZTY0LmJ1ZmZlciwgbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKGEsIGUsIG0pOworICAgICAgICB9CisgICAgICB9KQorICAgICk7CisgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICBtYWtlQXNzZXJ0ZXIobWFrZVVub3JkZXJlZERlZXBFcXVhbChhc3NlcnQpKQorICAgICk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0U3RydWN0KHRlc3RDYXNlcy5vdXQpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdFN0cnVjdCIpKTsKKworICAgIGNsaWVudAorICAgICAgLnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICJ0ZXN0TmVzdCIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdE5lc3QiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5KQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0SW5zYW5pdHkiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5MikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RJbnNhbml0eTIiKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikKKyAgICAgIC50aGVuKGZ1bmN0aW9uKCkgeworICAgICAgICBhc3NlcnQuZmFpbCgidGVzdEV4Y2VwdGlvbjogVEV4Y2VwdGlvbiIpOworICAgICAgfSkKKyAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24pOworICAgICAgfSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpCisgICAgICAudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb246IFhjZXB0aW9uIik7CisgICAgICB9KQorICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikgeworICAgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICBhc3NlcnQuZXF1YWwoIlhjZXB0aW9uIiwgZXJyLm1lc3NhZ2UpOworICAgICAgfSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHVuZGVmaW5lZCwgcmVzcG9uc2UpOyAvL3ZvaWQKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb24iKSk7CisKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0T25ld2F5KDApCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RPbmV3YXk6IHNob3VsZCBub3QgcmVqZWN0IikpOworCisgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICBjbGllbnQKKyAgICAgICAgLnRlc3RJMzIoLTEpCisgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgICAgYXNzZXJ0LmVuZCgpOworICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfSkKKyAgICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJjaGVja09mZkJ5T25lIikpOworICAgIH0sIGNhbGxiYWNrKTsKKyAgfSk7Cit9OworCisvLyBIZWxwZXIgRnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZnVuY3Rpb24gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCkgeworICByZXR1cm4gZnVuY3Rpb24obWFwMSwgbWFwMiwgbXNnKSB7CisgICAgY29uc3QgZXF1YWwgPSBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpOworCisgICAgYXNzZXJ0Lm9rKGVxdWFsLCBtc2cpOworCisgICAgLy8gZGVlcEVxdWFsIGRvZXNuJ3Qgd29yayB3aXRoIGZpZWxkcyB1c2luZyBub2RlLWludDY0CisgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKSB7CisgICAgICBpZiAodHlwZW9mIG1hcDEgIT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG1hcDIgIT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAib2JqZWN0IikgeworICAgICAgICAgIC8vSGFuZGxlIGludDY0IHR5cGVzICh3aGljaCB1c2Ugbm9kZS1pbnQ2NCBpbiBOb2RlLmpzIEphdmFTY3JpcHQpCisgICAgICAgICAgaWYgKAorICAgICAgICAgICAgdHlwZW9mIG1hcDEgPT09ICJudW1iZXIiICYmCisgICAgICAgICAgICB0eXBlb2YgbWFwMiA9PT0gIm9iamVjdCIgJiYKKyAgICAgICAgICAgIG1hcDIuYnVmZmVyICYmCisgICAgICAgICAgICBtYXAyLmJ1ZmZlciBpbnN0YW5jZW9mIEJ1ZmZlciAmJgorICAgICAgICAgICAgbWFwMi5idWZmZXIubGVuZ3RoID09PSA4CisgICAgICAgICAgKSB7CisgICAgICAgICAgICBjb25zdCBuID0gbmV3IEludDY0KG1hcDIuYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiBtYXAxID09PSBuLnRvTnVtYmVyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBtYXAxID09IG1hcDI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXAxKS5ldmVyeShmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKK30KKworZnVuY3Rpb24gY2hlY2tPZmZCeU9uZShkb25lLCBjYWxsYmFjaykgeworICBjb25zdCByZXRyeV9saW1pdCA9IDMwOworICBjb25zdCByZXRyeV9pbnRlcnZhbCA9IDEwMDsKKyAgbGV0IHRlc3RfY29tcGxldGUgPSBmYWxzZTsKKyAgbGV0IHJldHJ5cyA9IDA7CisKKyAgLyoqCisgICAqIHJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieSBvbmUiIC0tCisgICAqIGlmIHRoZSBzZXJ2ZXIgdHJlYXRlZCBvbmV3YXkgdm9pZCBsaWtlIG5vcm1hbCB2b2lkLCB0aGlzIG5leHQgdGVzdCB3aWxsCisgICAqIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CisgICAqIHJlc3VsdC4gSW4gdGhpcyBjaXJjdW1zdGFuY2UsIHRoZSBjbGllbnQgd2lsbCB0aHJvdyB0aGUgZXhjZXB0aW9uOgorICAgKgorICAgKiBCZWNhdXNlIHRoaXMgaXMgdGhlIGxhc3QgdGVzdCBhZ2FpbnN0IHRoZSBzZXJ2ZXIsIHdoZW4gaXQgY29tcGxldGVzCisgICAqIHRoZSBlbnRpcmUgc3VpdGUgaXMgY29tcGxldGUgYnkgZGVmaW5pdGlvbiAodGhlIHRlc3RzIHJ1biBzZXJpYWxseSkuCisgICAqLworICBkb25lKGZ1bmN0aW9uKCkgeworICAgIHRlc3RfY29tcGxldGUgPSB0cnVlOworICB9KTsKKworICAvL1dlIHdhaXQgdXAgdG8gcmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gY29tcGxldGUKKyAgZnVuY3Rpb24gVGVzdEZvckNvbXBsZXRpb24oKSB7CisgICAgaWYgKHRlc3RfY29tcGxldGUgJiYgY2FsbGJhY2spIHsKKyAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgc3VjY2Vzc2Z1bGx5IHRlc3RlZCEiKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCsrcmV0cnlzIDwgcmV0cnlfbGltaXQpIHsKKyAgICAgICAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykgeworICAgICAgICBjYWxsYmFjaygKKyAgICAgICAgICAiU2VydmVyIHRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGFmdGVyICIgKworICAgICAgICAgICAgKHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwpIC8gMTAwMCArCisgICAgICAgICAgICAiIHNlY29uZHMiCisgICAgICAgICk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOworfQorCitmdW5jdGlvbiBtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkgeworICByZXR1cm4gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbmFtZSkgeworICAgIGFzc2VydC5lcXVhbChhY3R1YWwubGVuZ3RoLCBleHBlY3RlZC5sZW5ndGgsIG5hbWUpOworICAgIGZvciAoY29uc3QgayBpbiBhY3R1YWwpIHsKKyAgICAgIGxldCBmb3VuZCA9IGZhbHNlOworICAgICAgZm9yIChjb25zdCBrMiBpbiBleHBlY3RlZCkgeworICAgICAgICBpZiAoYWN0dWFsW2tdID09PSBleHBlY3RlZFtrMl0pIHsKKyAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoIlVuZXhwZWN0ZWQgdmFsdWUgIiArIGFjdHVhbFtrXSArICIgd2l0aCBrZXkgIiArIGspOworICAgICAgfQorICAgIH0KKyAgfTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hhbmRsZXIuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxN2E3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAorLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgorY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoInRocmlmdCIpLlRocmlmdC5URXhjZXB0aW9uOworCitmdW5jdGlvbiBtYWtlU3luY0hhbmRsZXIoKSB7CisgIHJldHVybiBmdW5jdGlvbih0aGluZykgeworICAgIHJldHVybiB0aGluZzsKKyAgfTsKK30KKworY29uc3Qgc3luY0hhbmRsZXJzID0geworICB0ZXN0Vm9pZDogdGVzdFZvaWQsCisgIHRlc3RNYXBNYXA6IHRlc3RNYXBNYXAsCisgIHRlc3RJbnNhbml0eTogdGVzdEluc2FuaXR5LAorICB0ZXN0TXVsdGk6IHRlc3RNdWx0aSwKKyAgdGVzdEV4Y2VwdGlvbjogdGVzdEV4Y2VwdGlvbiwKKyAgdGVzdE11bHRpRXhjZXB0aW9uOiB0ZXN0TXVsdGlFeGNlcHRpb24sCisgIHRlc3RPbmV3YXk6IHRlc3RPbmV3YXkKK307CisKK2Z1bmN0aW9uIG1ha2VBc3luY0hhbmRsZXIobGFiZWwpIHsKKyAgcmV0dXJuIGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICB0aGluZyA9IHN5bmNIYW5kbGVyc1tsYWJlbF0odGhpbmcpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH07Cit9CisKK2NvbnN0IGFzeW5jSGFuZGxlcnMgPSB7CisgIHRlc3RWb2lkOiB0ZXN0Vm9pZEFzeW5jLAorICB0ZXN0TXVsdGk6IHRlc3RNdWx0aUFzeW5jLAorICB0ZXN0RXhjZXB0aW9uOiB0ZXN0RXhjZXB0aW9uQXN5bmMsCisgIHRlc3RNdWx0aUV4Y2VwdGlvbjogdGVzdE11bHRpRXhjZXB0aW9uQXN5bmMsCisgIHRlc3RPbmV3YXk6IHRlc3RPbmV3YXlBc3luYworfTsKKworY29uc3QgaWRlbnRpdHlIYW5kbGVycyA9IFsKKyAgInRlc3RTdHJpbmciLAorICAidGVzdEJvb2wiLAorICAidGVzdEJ5dGUiLAorICAidGVzdEkzMiIsCisgICJ0ZXN0STY0IiwKKyAgInRlc3REb3VibGUiLAorICAidGVzdEJpbmFyeSIsCisgICJ0ZXN0U3RydWN0IiwKKyAgInRlc3ROZXN0IiwKKyAgInRlc3RNYXAiLAorICAidGVzdFN0cmluZ01hcCIsCisgICJ0ZXN0U2V0IiwKKyAgInRlc3RMaXN0IiwKKyAgInRlc3RFbnVtIiwKKyAgInRlc3RUeXBlZGVmIgorXTsKKworZnVuY3Rpb24gdGVzdFZvaWQoKSB7CisgIC8vY29uc29sZS5sb2coJ3Rlc3RWb2lkKCknKTsKK30KKworZnVuY3Rpb24gdGVzdFZvaWRBc3luYyhyZXN1bHQpIHsKKyAgcmVzdWx0KHRlc3RWb2lkKCkpOworfQorCitmdW5jdGlvbiB0ZXN0TWFwTWFwKCkgeworICBjb25zdCBtYXBtYXAgPSBbXTsKKyAgY29uc3QgcG9zID0gW107CisgIGNvbnN0IG5lZyA9IFtdOworICBmb3IgKGxldCBpID0gMTsgaSA8IDU7IGkrKykgeworICAgIHBvc1tpXSA9IGk7CisgICAgbmVnWy1pXSA9IC1pOworICB9CisgIG1hcG1hcFs0XSA9IHBvczsKKyAgbWFwbWFwWy00XSA9IG5lZzsKKworICByZXR1cm4gbWFwbWFwOworfQorCitmdW5jdGlvbiB0ZXN0SW5zYW5pdHkoYXJndW1lbnQpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdEluc2FuaXR5KCcpOworICAvL2NvbnNvbGUubG9nKGFyZ3VtZW50KTsKKyAgLy9jb25zb2xlLmxvZygnKScpOworCisgIGNvbnN0IGZpcnN0X21hcCA9IFtdOworICBjb25zdCBzZWNvbmRfbWFwID0gW107CisKKyAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworCisgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgc2Vjb25kX21hcFt0dHlwZXMuTnVtYmVyei5TSVhdID0gbG9vbmV5OworCisgIGNvbnN0IGluc2FuZSA9IFtdOworICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisKKyAgLy9jb25zb2xlLmxvZygnaW5zYW5lIHJlc3VsdDonKTsKKyAgLy9jb25zb2xlLmxvZyhpbnNhbmUpOworICByZXR1cm4gaW5zYW5lOworfQorCitmdW5jdGlvbiB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMikgeworICAvL2NvbnNvbGUubG9nKCd0ZXN0TXVsdGkoKScpOworCisgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOworICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOworICByZXR1cm4gaGVsbG87Cit9CisKK2Z1bmN0aW9uIHRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIHJlc3VsdCkgeworICBjb25zdCBoZWxsbyA9IHRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKKyAgcmVzdWx0KG51bGwsIGhlbGxvKTsKK30KKworZnVuY3Rpb24gdGVzdEV4Y2VwdGlvbihhcmcpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignK2FyZysnKScpOworICBpZiAoYXJnID09PSAiWGNlcHRpb24iKSB7CisgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgeC5tZXNzYWdlID0gYXJnOworICAgIHRocm93IHg7CisgIH0gZWxzZSBpZiAoYXJnID09PSAiVEV4Y2VwdGlvbiIpIHsKKyAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbihhcmcpOworICB9IGVsc2UgeworICAgIHJldHVybjsKKyAgfQorfQorCitmdW5jdGlvbiB0ZXN0RXhjZXB0aW9uQXN5bmMoYXJnLCByZXN1bHQpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignK2FyZysnKScpOworICBpZiAoYXJnID09PSAiWGNlcHRpb24iKSB7CisgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgeC5tZXNzYWdlID0gYXJnOworICAgIHJlc3VsdCh4KTsKKyAgfSBlbHNlIGlmIChhcmcgPT09ICJURXhjZXB0aW9uIikgeworICAgIHJlc3VsdChuZXcgVEV4Y2VwdGlvbihhcmcpKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQobnVsbCk7CisgIH0KK30KKworZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uKGFyZzAsIGFyZzEpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICB0aHJvdyB4OworICB9IGVsc2UgaWYgKGFyZzAgPT09ICJYY2VwdGlvbjIiKSB7CisgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICB0aHJvdyB4MjsKKyAgfQorCisgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICByZXR1cm4gcmVzOworfQorCitmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb25Bc3luYyhhcmcwLCBhcmcxLCByZXN1bHQpIHsKKyAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICByZXN1bHQoeCk7CisgIH0gZWxzZSBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uMiIpIHsKKyAgICBjb25zdCB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKKyAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOworICAgIHJlc3VsdCh4Mik7CisgIH0gZWxzZSB7CisgICAgY29uc3QgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICByZXN1bHQobnVsbCwgcmVzKTsKKyAgfQorfQorCisvL2NvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOworZnVuY3Rpb24gdGVzdE9uZXdheSgpIHt9CisKK2Z1bmN0aW9uIHRlc3RPbmV3YXlBc3luYyhzbGVlcEZvcikgeworICB0ZXN0T25ld2F5KHNsZWVwRm9yKTsKK30KKworaWRlbnRpdHlIYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsKSB7CisgIHN5bmNIYW5kbGVyc1tsYWJlbF0gPSBtYWtlU3luY0hhbmRsZXIobGFiZWwpOworICBhc3luY0hhbmRsZXJzW2xhYmVsXSA9IG1ha2VBc3luY0hhbmRsZXIobGFiZWwpOworfSk7CisKK1sidGVzdE1hcE1hcCIsICJ0ZXN0SW5zYW5pdHkiXS5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsKSB7CisgIGFzeW5jSGFuZGxlcnNbbGFiZWxdID0gbWFrZUFzeW5jSGFuZGxlcihsYWJlbCk7Cit9KTsKKworZXhwb3J0cy5UaHJpZnRUZXN0SGFuZGxlciA9IGFzeW5jSGFuZGxlcnM7CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzLy5naXRpZ25vcmUgYi9saWIvbm9kZXRzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhYmE4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACit0ZXN0LWNvbXBpbGVkLwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy9NYWtlZmlsZS5hbSBiL2xpYi9ub2RldHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWE2NDBjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgV2UgY2FsbCBucG0gdHdpY2UgdG8gd29yayBhcm91bmQgbnBtIGlzc3VlcworCitzdHViczogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJbWtkaXIgLXAgdGVzdC1jb21waWxlZAorCSQoVEhSSUZUKSAtLWdlbiBqczpub2RlLHRzIC1vIHRlc3QvICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAmJiAkKFRIUklGVCkgLS1nZW4ganM6bm9kZSx0cyAtbyB0ZXN0LWNvbXBpbGVkICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCit0cy1jb21waWxlOiBzdHVicworCW1rZGlyIC1wIHRlc3QtY29tcGlsZWQKKwkuLi8uLi9ub2RlX21vZHVsZXMvdHlwZXNjcmlwdC9iaW4vdHNjIC0tb3V0RGlyIHRlc3QtY29tcGlsZWQvIC0tcHJvamVjdCB0ZXN0L3RzY29uZmlnLmpzb24KKworZGVwczogJCh0b3Bfc3JjZGlyKS9wYWNrYWdlLmpzb24KKwkkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLyB8fCAkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLworCithbGwtbG9jYWw6IGRlcHMgdHMtY29tcGlsZQorCitwcmVjcm9zczogZGVwcyBzdHVicyB0cy1jb21waWxlCisKK2NoZWNrOiBkZXBzIHRzLWNvbXBpbGUKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTlBNKSBydW4gdGVzdC10cyAmJiBjZCBsaWIvbm9kZXRzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIHRlc3QvZ2VuLW5vZGVqcworCSQoUk0pIC1yICQodG9wX3NyY2Rpcikvbm9kZV9tb2R1bGVzCisJJChSTSkgLXIgdGVzdC1jb21waWxlZAorCitFWFRSQV9ESVNUID0gXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9ub2RldHMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L2NsaWVudC50cyBiL2xpYi9ub2RldHMvdGVzdC9jbGllbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhM2MyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC9jbGllbnQudHMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgiYXNzZXJ0Iik7CitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7CitpbXBvcnQgVGhyaWZ0ID0gdGhyaWZ0LlRocmlmdDsKK2ltcG9ydCBUaHJpZnRUZXN0ID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QiKTsKK2ltcG9ydCB0ZXN0X2RyaXZlciA9IHJlcXVpcmUoIi4vdGVzdF9kcml2ZXIiKTsKK2ltcG9ydCBUaHJpZnRUZXN0RHJpdmVyID0gdGVzdF9kcml2ZXIuVGhyaWZ0VGVzdERyaXZlcjsKK2ltcG9ydCBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IHRlc3RfZHJpdmVyLlRocmlmdFRlc3REcml2ZXJQcm9taXNlOworCisvLyB2YXIgcHJvZ3JhbSA9IHJlcXVpcmUoImNvbW1hbmRlciIpOworaW1wb3J0ICogYXMgcHJvZ3JhbSBmcm9tICJjb21tYW5kZXIiOworCitwcm9ncmFtCisgIC5vcHRpb24oIi0tcG9ydCA8cG9ydD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCBudW1iZXIgdG8gY29ubmVjdCIsIDkwOTApCisgIC5vcHRpb24oIi0tcHJvbWlzZSIsICJ0ZXN0IHdpdGggcHJvbWlzZSBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKCItLXByb3RvY29sIiwgIlNldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeSkgW3Byb3RvY29sXSIpCisgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOworCit2YXIgcG9ydDogbnVtYmVyID0gcHJvZ3JhbS5wb3J0OwordmFyIHByb21pc2UgPSBwcm9ncmFtLnByb21pc2U7CisKK3ZhciBvcHRpb25zID0geworICB0cmFuc3BvcnQ6IFRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIHByb3RvY29sOiBUaHJpZnQuVEJpbmFyeVByb3RvY29sCit9OworCit2YXIgdGVzdERyaXZlciA9IHByb21pc2UgPyBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA6IFRocmlmdFRlc3REcml2ZXI7CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIHBvcnQsIG9wdGlvbnMpOworCitjb25uZWN0aW9uLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGVycjogc3RyaW5nKSB7CisgICAgYXNzZXJ0KGZhbHNlLCBlcnIpOworfSk7CisKK3ZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KFRocmlmdFRlc3QuQ2xpZW50LCBjb25uZWN0aW9uKTsKK3J1blRlc3RzKCk7CisKK2Z1bmN0aW9uIHJ1blRlc3RzKCkgeworICB0ZXN0RHJpdmVyKGNsaWVudCwgZnVuY3Rpb24gKHN0YXR1czogc3RyaW5nKSB7CisgICAgY29uc29sZS5sb2coc3RhdHVzKTsKKyAgICBwcm9jZXNzLmV4aXQoMCk7CisgIH0pOworfQorCitleHBvcnRzLmV4cHJlc3NvVGVzdCA9IGZ1bmN0aW9uKCkge307CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvcnVuQ2xpZW50LnNoIGIvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDVlOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaApAQCAtMCwwICsxLDE4IEBACisjISAvYmluL3NoCisKK0RJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKKworbWtkaXIgLXAgJERJUi8uLi90ZXN0LWNvbXBpbGVkCisKK0NPTVBJTEVERElSPSIkKGNkICRESVIgJiYgY2QgLi4vdGVzdC1jb21waWxlZCAmJiBwd2QpIgorZXhwb3J0IE5PREVfUEFUSD0iJHtESVJ9OiR7RElSfS8uLi8uLi9ub2RlanMvbGliOiR7Tk9ERV9QQVRIfSIKKworY29tcGlsZSgpCit7CisgICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7Q09NUElMRURESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK30KK2NvbXBpbGUKKworbm9kZSAke0NPTVBJTEVERElSfS9jbGllbnQuanMgJCoKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9ydW5TZXJ2ZXIuc2ggYi9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlZWU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhIC9iaW4vc2gKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitta2RpciAtcCAkRElSLy4uL3Rlc3QtY29tcGlsZWQKKworQ09NUElMRURESVI9IiQoY2QgJERJUiAmJiBjZCAuLi90ZXN0LWNvbXBpbGVkICYmIHB3ZCkiCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uLy4uL25vZGVqcy9saWI6JHtOT0RFX1BBVEh9IgorCitjb21waWxlKCkKK3sKKyAgI2dlbmVyYXRpbmcgdGhyaWZ0IGNvZGUKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtDT01QSUxFRERJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorfQorY29tcGlsZQorCitub2RlICR7Q09NUElMRURESVJ9L3NlcnZlci5qcyAkKgorCisKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9zZXJ2ZXIudHMgYi9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTUzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzCkBAIC0wLDAgKzEsMjYgQEAKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK3ZhciBwcm9ncmFtID0gcmVxdWlyZSgnY29tbWFuZGVyJyk7CitpbXBvcnQgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Jyk7CitpbXBvcnQgdGVzdF9oYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKTsKKworCitwcm9ncmFtCisgIC5vcHRpb24oJy0tcG9ydCA8cG9ydD4nLCAnU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCcsIDkwOTApCisgIC5vcHRpb24oJy0tcHJvbWlzZScsICd0ZXN0IHdpdGggcHJvbWlzZSBzdHlsZSBmdW5jdGlvbnMnKQorICAub3B0aW9uKCctLXByb3RvY29sJywgJyJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnkpIFtwcm90b2NvbF0iJykKKyAgLnBhcnNlKHByb2Nlc3MuYXJndik7CisKK3ZhciBwb3J0OiBudW1iZXIgPSBwcm9ncmFtLnBvcnQ7CisKK3ZhciBvcHRpb25zOiB0aHJpZnQuU2VydmVyT3B0aW9ucyA9IHsKKyAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBwcm90b2NvbDogdGhyaWZ0LlRCaW5hcnlQcm90b2NvbAorfTsKKwordmFyIHNlcnZlcjogdGhyaWZ0LlNlcnZlcjsKK2lmIChwcm9ncmFtLnByb21pc2UpIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LlByb2Nlc3NvciwgbmV3IHRlc3RfaGFuZGxlci5Bc3luY1RocmlmdFRlc3RIYW5kbGVyKCksIG9wdGlvbnMpOworfSBlbHNlIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LlByb2Nlc3NvciwgbmV3IHRlc3RfaGFuZGxlci5TeW5jVGhyaWZ0VGVzdEhhbmRsZXIoKSwgb3B0aW9ucyk7Cit9CitzZXJ2ZXIubGlzdGVuKHBvcnQpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdC1jYXNlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc0MGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMKQEAgLTAsMCArMSwxMTMgQEAKKyd1c2Ugc3RyaWN0JzsKKworaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzJyk7CisKKy8vYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorLypqc2hpbnQgLVcxMDAgKi8KK2V4cG9ydCB2YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisgICAgIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKKyAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKyAgICAiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKKyAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKyAgICAiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKKyAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworICAgICJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKworICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworICAgICJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKKyAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKyAgICAiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKKyAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisgICAgItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCisgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisgICAgIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKworICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKy8qanNoaW50ICtXMTAwICovCisKK2V4cG9ydCB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCcgKworICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJzsKKworZXhwb3J0IHZhciBtYXBUZXN0SW5wdXQgPSB7CisgICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLAorICAibG9uZ1ZhbHVlIjpzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiJsb25nIGtleSIKK307CisKK2V4cG9ydCB2YXIgc2ltcGxlID0gWworICBbJ3Rlc3RWb2lkJywgdW5kZWZpbmVkXSwKKyAgWyd0ZXN0U3RyaW5nJywgJ1Rlc3QnXSwKKyAgWyd0ZXN0U3RyaW5nJywgJyddLAorICBbJ3Rlc3RTdHJpbmcnLCBzdHJpbmdUZXN0XSwKKyAgWyd0ZXN0U3RyaW5nJywgc3BlY2lhbENoYXJhY3RlcnNdLAorICBbJ3Rlc3RCeXRlJywgMV0sCisgIFsndGVzdEJ5dGUnLCAwXSwKKyAgWyd0ZXN0Qnl0ZScsIC0xXSwKKyAgWyd0ZXN0Qnl0ZScsIC0xMjddLAorICBbJ3Rlc3RJMzInLCAtMV0sCisgIFsndGVzdERvdWJsZScsIC01LjIwOTg1MjNdLAorICBbJ3Rlc3REb3VibGUnLCA3LjAxMjA1MjE3NTIxNTA0NF0sCisgIFsndGVzdEVudW0nLCB0dHlwZXMuTnVtYmVyei5PTkVdCitdOworCitleHBvcnQgdmFyIHNpbXBsZUxvb3NlID0gWworICBbJ3Rlc3RJNjQnLCA1XSwKKyAgWyd0ZXN0STY0JywgLTVdLAorICBbJ3Rlc3RJNjQnLCA3MzQzNTk3MzgzNjhdLAorICBbJ3Rlc3RJNjQnLCAtMzQzNTk3MzgzNjhdLAorICBbJ3Rlc3RJNjQnLCAtNzM0MzU5NzM4MzY4XSwKKyAgWyd0ZXN0VHlwZWRlZicsIDY5XQorXQorCit2YXIgbWFwb3V0OiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0ge307Citmb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkgeworICBtYXBvdXRbaV0gPSBpLTEwOworfQorCitleHBvcnQgdmFyIGRlZXAgPSBbCisgIFsndGVzdE1hcCcsIG1hcG91dF0sCisgIFsndGVzdFNldCcsIFsxLDIsM11dLAorICBbJ3Rlc3RMaXN0JywgWzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwXV0sCisgIFsndGVzdFN0cmluZ01hcCcsIG1hcFRlc3RJbnB1dF0KK107CisKK2V4cG9ydCB2YXIgb3V0ID0gbmV3IHR0eXBlcy5YdHJ1Y3QoeworICBzdHJpbmdfdGhpbmc6ICdaZXJvJywKKyAgYnl0ZV90aGluZzogMSwKKyAgaTMyX3RoaW5nOiAtMywKKyAgaTY0X3RoaW5nOiAxMDAwMDAwCit9KTsKKworZXhwb3J0IHZhciBvdXQyID0gbmV3IHR0eXBlcy5YdHJ1Y3QyKCk7CitvdXQyLmJ5dGVfdGhpbmcgPSAxOworb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CitvdXQyLmkzMl90aGluZyA9IDU7CisKK2V4cG9ydCB2YXIgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKKyAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCisgICJ4dHJ1Y3RzIjpbbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKKyAgICAgICJieXRlX3RoaW5nIjo0LAorICAgICAgImkzMl90aGluZyI6NCwKKyAgICAgICJpNjRfdGhpbmciOjQKKyAgICB9KSwgbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCisgICAgICAiYnl0ZV90aGluZyI6MiwKKyAgICAgICJpMzJfdGhpbmciOjIsCisgICAgICAiaTY0X3RoaW5nIjoyCisgICAgfSldCit9KTsKKworZXhwb3J0IHZhciBpbnNhbml0eTogYW55ID0geworICAiMSI6eyAiMiI6IGNyYXp5LCAiMyI6IGNyYXp5IH0sCisgICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjp7fSwgInh0cnVjdHMiOltdIH0gfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RBbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTdjMDBiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoCkBAIC0wLDAgKzEsMzggQEAKKyMhIC9iaW4vc2gKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitta2RpciAtcCAkRElSLy4uL3Rlc3QtY29tcGlsZWQKKworQ09NUElMRURESVI9IiQoY2QgJERJUiAmJiBjZCAuLi90ZXN0LWNvbXBpbGVkICYmIHB3ZCkiCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uLy4uL25vZGVqcy9saWI6JHtOT0RFX1BBVEh9IgorCitjb21waWxlKCkKK3sKKyAgI2dlbmVyYXRpbmcgdGhyaWZ0IGNvZGUKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtDT01QSUxFRERJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCisgIHRzYyAtLW91dERpciAkQ09NUElMRURESVIgLS1wcm9qZWN0ICRESVIvdHNjb25maWcuanNvbgorfQorY29tcGlsZQorCit0ZXN0U2VydmVyKCkKK3sKKyAgZWNobyAic3RhcnQgc2VydmVyICQxIgorICBSRVQ9MAorICBub2RlICR7Q09NUElMRURESVJ9L3NlcnZlci5qcyAkMSAmCisgIFNFUlZFUlBJRD0kIQorICBzbGVlcCAxCisgIGVjaG8gInN0YXJ0IGNsaWVudCAkMSIKKyAgbm9kZSAke0NPTVBJTEVERElSfS9jbGllbnQuanMgJDEgfHwgUkVUPTEKKyAga2lsbCAtMiAkU0VSVkVSUElEIHx8IFJFVD0xCisgIHJldHVybiAkUkVUCit9CisKKyNpbnRlZ3JhdGlvbiB0ZXN0cworCit0ZXN0U2VydmVyIHx8IFRFU1RPSz0xCit0ZXN0U2VydmVyIC0tcHJvbWlzZSB8fCBURVNUT0s9MQorCitleGl0ICRURVNUT0sKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0X2RyaXZlci50cyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0X2RyaXZlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzQxNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfZHJpdmVyLnRzCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyAvLyBUaGlzIGlzIHRoZSBOb2RlLmpzIHRlc3QgZHJpdmVyIGZvciB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdAorIC8vIHRlc3Qgc2VydmljZS4gVGhlIGRyaXZlciBpbnZva2VzIGV2ZXJ5IGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhlCisgLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4KKyAvLworIC8vIFRoZSBUaHJpZnRUZXN0RHJpdmVyIGZ1bmN0aW9uIHJlcXVpcmVzIGEgY2xpZW50IG9iamVjdAorIC8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZAorIC8vIHN1cHBvcnRzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aXRoCisgLy8gYSBzdGF0dXMgbWVzc2FnZSB3aGVuIHRoZSB0ZXN0IGlzIGNvbXBsZXRlLgorCitpbXBvcnQgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKK2ltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcyIpOworaW1wb3J0IFRocmlmdFRlc3QgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCIpOworaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworaW1wb3J0IFEgPSB0aHJpZnQuUTsKK2ltcG9ydCBURXhjZXB0aW9uID0gdGhyaWZ0LlRocmlmdC5URXhjZXB0aW9uOwordmFyIEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworaW1wb3J0IHRlc3RDYXNlcyA9IHJlcXVpcmUoIi4vdGVzdC1jYXNlcyIpOworCitleHBvcnQgZnVuY3Rpb24gVGhyaWZ0VGVzdERyaXZlcihjbGllbnQ6IFRocmlmdFRlc3QuQ2xpZW50LCBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nKSA9PiB2b2lkKSB7CisKKyAgdGVzdCgiTm9kZUpTIFN0eWxlIENhbGxiYWNrIENsaWVudCBUZXN0cyIsIGZ1bmN0aW9uKGFzc2VydCkgeworCisgICAgdmFyIGNoZWNrUmVjdXJzaXZlbHkgPSBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0KTsKKworICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbjogKGE6IGFueSwgYjogYW55LCBtc2c/OiBzdHJpbmcpID0+IHZvaWQpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihjOiAoc3RyaW5nIHwgYW55KVtdKSB7CisgICAgICAgIHZhciBmbk5hbWUgPSBjWzBdOworICAgICAgICB2YXIgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAoPGFueT5jbGllbnQpW2ZuTmFtZV0oZXhwZWN0ZWQsIGZ1bmN0aW9uKGVycjogYW55LCBhY3R1YWw6IGFueSkgeworICAgICAgICAgIGFzc2VydC5lcnJvcihlcnIsIGZuTmFtZSArICI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgICAgYXNzZXJ0aW9uRm4oYWN0dWFsLCBleHBlY3RlZCwgZm5OYW1lKTsKKyAgICAgICAgfSkKKyAgICAgIH07CisgICAgfQorCisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7CisgICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKKyAgICB9KSk7CisgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworCisgICAgY2xpZW50LnRlc3RNYXBNYXAoNDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIHZhciBleHBlY3RlZDogdHlwZW9mIHJlc3BvbnNlID0geworICAgICAgICAiNCI6IHsiMSI6MSwgIjIiOjIsICIzIjozLCAiNCI6NH0sCisgICAgICAgICItNCI6IHsiLTQiOi00LCAiLTMiOi0zLCAiLTIiOi0yLCAiLTEiOi0xfQorICAgICAgfTsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICd0ZXN0TWFwTWFwOiBubyBjYWxsYmFjayBlcnJvcicpOworICAgICAgYXNzZXJ0LmRlZXBFcXVhbChleHBlY3RlZCwgcmVzcG9uc2UsICJ0ZXN0TWFwTWFwIik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdFN0cnVjdDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dCwgcmVzcG9uc2UsICJ0ZXN0U3RydWN0Iik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QodGVzdENhc2VzLm91dDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0TmVzdDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEluc2FuaXR5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciB0eXBlJyk7CisgICAgICBhc3NlcnQub2soIUJvb2xlYW4ocmVzcG9uc2UpLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiB0dHlwZXMuWGNlcHRpb24sICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUnKTsKKyAgICAgIGFzc2VydC5vayghQm9vbGVhbihyZXNwb25zZSksICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOworICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEsICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIGNvZGUnKTsKKyAgICAgIGFzc2VydC5lcXVhbCgnWGNlcHRpb24nLCBlcnIubWVzc2FnZSwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgbWVzc2FnZScpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICd0ZXN0RXhjZXB0aW9uOiBubyBjYWxsYmFjayBlcnJvcicpOworICAgICAgYXNzZXJ0Lm9rKCFCb29sZWFuKHJlc3BvbnNlKSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE9uZXdheTogbm8gY2FsbGJhY2sgZXJyb3InKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXNwb25zZSwgdW5kZWZpbmVkLCAndGVzdE9uZXdheTogdm9pZCByZXNwb25zZScpOworICAgIH0pOworCisgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICBjbGllbnQudGVzdEkzMigtMSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAiY2hlY2tPZmZCeU9uZTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydC5lbmQoKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSwgY2FsbGJhY2spOworCisgIH0pOworfTsKKworZXhwb3J0IGZ1bmN0aW9uIFRocmlmdFRlc3REcml2ZXJQcm9taXNlKGNsaWVudDogVGhyaWZ0VGVzdC5DbGllbnQsIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQpIHsKKworICB0ZXN0KCJRIFByb21pc2UgQ2xpZW50IFRlc3RzIiwgZnVuY3Rpb24oYXNzZXJ0KSB7CisKKyAgICB2YXIgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOworCisgICAgZnVuY3Rpb24gZmFpbChtc2c6IHN0cmluZykgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVycm9yLCByZXNwb25zZSkgeworICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHsKKyAgICAgICAgICBhc3NlcnQuZmFpbChtc2cpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gbWFrZUFzc2VydGVyKGFzc2VydGlvbkZuOiAoYTogYW55LCBiOiBhbnksIG1zZz86IHN0cmluZykgPT4gdm9pZCkgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGM6IChzdHJpbmcgfCBhbnkpW10pIHsKKyAgICAgICAgdmFyIGZuTmFtZSA9IGNbMF07CisgICAgICAgIHZhciBleHBlY3RlZCA9IGNbMV07CisgICAgICAgICg8YW55PmNsaWVudClbZm5OYW1lXShleHBlY3RlZCkKKyAgICAgICAgICAudGhlbihmdW5jdGlvbihhY3R1YWw6IGFueSkgeworICAgICAgICAgICAgYXNzZXJ0aW9uRm4oYWN0dWFsLCBleHBlY3RlZCwgZm5OYW1lKTsKKyAgICAgICAgICB9KQorICAgICAgICAgIC5mYWlsKGZhaWwoImZuTmFtZSIpKTsKKyAgICAgIH07CisgICAgfQorCisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7CisgICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKKyAgICB9KSk7CisgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0U3RydWN0KHRlc3RDYXNlcy5vdXQpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmYWlsKCJ0ZXN0U3RydWN0IikpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgInRlc3ROZXN0Iik7CisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdE5lc3QiKSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdEluc2FuaXR5IikpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBmYWlsKCJ0ZXN0RXhjZXB0aW9uOiBURXhjZXB0aW9uIik7CisgICAgICB9KQorICAgICAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKKyAgICAgIH0pOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgZmFpbCgidGVzdEV4Y2VwdGlvbjogWGNlcHRpb24iKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbik7CisgICAgICAgIGFzc2VydC5lcXVhbChlcnIuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKCJYY2VwdGlvbiIsIGVyci5tZXNzYWdlKTsKKyAgICAgIH0pOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcXVhbCh1bmRlZmluZWQsIHJlc3BvbnNlKTsgLy92b2lkCisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdEV4Y2VwdGlvbiIpKTsKKworICAgIGNsaWVudC50ZXN0T25ld2F5KDAsIGZhaWwoInRlc3RPbmV3YXk6IHNob3VsZCBub3QgYW5zd2VyIikpOworCisgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RJMzIoLTEpKQorICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pCisgICAgICAgIC5mYWlsKGZhaWwoImNoZWNrT2ZmQnlPbmUiKSk7CisgICAgfSwgY2FsbGJhY2spOworICB9KTsKK307CisKKworLy8gSGVscGVyIEZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2Z1bmN0aW9uIG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQ6IHRlc3QuVGVzdCkgeworCisgIHJldHVybiBmdW5jdGlvbiAobWFwMTogYW55LCBtYXAyOiBhbnksIG1zZzogc3RyaW5nKSB7CisgICAgdmFyIGVxdWFsID0gdHJ1ZTsKKworICAgIHZhciBlcXVhbCA9IGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMik7CisKKyAgICBhc3NlcnQub2soZXF1YWwsIG1zZyk7CisKKyAgICAvLyBkZWVwRXF1YWwgZG9lc24ndCB3b3JrIHdpdGggZmllbGRzIHVzaW5nIG5vZGUtaW50NjQKKyAgICBmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDE6IGFueSwgbWFwMjogYW55KSA6IGJvb2xlYW4geworICAgICAgaWYgKCEodHlwZW9mIG1hcDEgIT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG1hcDIgIT09ICJmdW5jdGlvbiIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gIm9iamVjdCIpIHsKKyAgICAgICAgLy9IYW5kbGUgaW50NjQgdHlwZXMgKHdoaWNoIHVzZSBub2RlLWludDY0IGluIE5vZGUuanMgSmF2YVNjcmlwdCkKKyAgICAgICAgaWYgKCh0eXBlb2YgbWFwMSA9PT0gIm51bWJlciIpICYmICh0eXBlb2YgbWFwMiA9PT0gIm9iamVjdCIpICYmCisgICAgICAgICAgICAobWFwMi5idWZmZXIpICYmIChtYXAyLmJ1ZmZlciBpbnN0YW5jZW9mIEJ1ZmZlcikgJiYgKG1hcDIuYnVmZmVyLmxlbmd0aCA9PT0gOCkpIHsKKyAgICAgICAgICB2YXIgbiA9IG5ldyBJbnQ2NChtYXAyLmJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIG1hcDEgPT09IG4udG9OdW1iZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gbWFwMSA9PSBtYXAyOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwMSkuZXZlcnkoZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgcmV0dXJuIGNoZWNrUmVjdXJzaXZlbHkobWFwMVtrZXldLCBtYXAyW2tleV0pOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworZnVuY3Rpb24gY2hlY2tPZmZCeU9uZShkb25lOiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQsIGNhbGxiYWNrOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkKSB7CisKKyAgdmFyIHJldHJ5X2xpbWl0ID0gMzA7CisgIHZhciByZXRyeV9pbnRlcnZhbCA9IDEwMDsKKyAgdmFyIHRlc3RfY29tcGxldGUgPSBmYWxzZTsKKyAgdmFyIHJldHJ5cyA9IDA7CisKKyAgLyoqCisgICAqIHJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieSBvbmUiIC0tCisgICAqIGlmIHRoZSBzZXJ2ZXIgdHJlYXRlZCBvbmV3YXkgdm9pZCBsaWtlIG5vcm1hbCB2b2lkLCB0aGlzIG5leHQgdGVzdCB3aWxsCisgICAqIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CisgICAqIHJlc3VsdC4gSW4gdGhpcyBjaXJjdW1zdGFuY2UsIHRoZSBjbGllbnQgd2lsbCB0aHJvdyB0aGUgZXhjZXB0aW9uOgorICAgKgorICAgKiBCZWNhdXNlIHRoaXMgaXMgdGhlIGxhc3QgdGVzdCBhZ2FpbnN0IHRoZSBzZXJ2ZXIsIHdoZW4gaXQgY29tcGxldGVzCisgICAqIHRoZSBlbnRpcmUgc3VpdGUgaXMgY29tcGxldGUgYnkgZGVmaW5pdGlvbiAodGhlIHRlc3RzIHJ1biBzZXJpYWxseSkuCisgICAqLworICBkb25lKGZ1bmN0aW9uKCkgeworICAgIHRlc3RfY29tcGxldGUgPSB0cnVlOworICB9KTsKKworICAvL1dlIHdhaXQgdXAgdG8gcmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gY29tcGxldGUKKyAgZnVuY3Rpb24gVGVzdEZvckNvbXBsZXRpb24oKSB7CisgICAgaWYodGVzdF9jb21wbGV0ZSAmJiBjYWxsYmFjaykgeworICAgICAgY2FsbGJhY2soIlNlcnZlciBzdWNjZXNzZnVsbHkgdGVzdGVkISIpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKytyZXRyeXMgPCByZXRyeV9saW1pdCkgeworICAgICAgICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7CisgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgdGVzdCBmYWlsZWQgdG8gY29tcGxldGUgYWZ0ZXIgIiArCisgICAgICAgICAgICAgICAgIChyZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsIC8gMTAwMCkgKyAiIHNlY29uZHMiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdGVzdF9oYW5kbGVyLnRzIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfaGFuZGxlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM4NTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfaGFuZGxlci50cwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RoaXMgaXMgdGhlIHNlcnZlciBzaWRlIE5vZGUgdGVzdCBoYW5kbGVyIGZvciB0aGUgc3RhbmRhcmQKKy8vICBBcGFjaGUgVGhyaWZ0IHRlc3Qgc2VydmljZS4KKworaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzIik7CitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7CitpbXBvcnQgVGhyaWZ0ID0gdGhyaWZ0LlRocmlmdDsKK2ltcG9ydCBRID0gcmVxdWlyZSgicSIpOworCisKK2V4cG9ydCBjbGFzcyBTeW5jVGhyaWZ0VGVzdEhhbmRsZXIgeworICB0ZXN0Vm9pZCgpOiBRLklQcm9taXNlPHZvaWQ+IHsKKyAgICAvL2NvbnNvbGUubG9nKCd0ZXN0Vm9pZCgpJyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZTx2b2lkPih1bmRlZmluZWQpOworICB9CisgIHRlc3RNYXBNYXAoaGVsbG86IG51bWJlcikgeworICAgIC8vY29uc29sZS5sb2coJ3Rlc3RNYXBNYXAoJyArIGhlbGxvICsgJyknKTsKKworICAgIHZhciBtYXBtYXA6IHtba2V5OiBudW1iZXJdOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9fSA9IFtdOworICAgIHZhciBwb3M6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSBbXTsKKyAgICB2YXIgbmVnOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgcmV0dXJuIFEucmVzb2x2ZShtYXBtYXApOworICB9CisgIHRlc3RJbnNhbml0eShhcmd1bWVudDogdHR5cGVzLkluc2FuaXR5KTogUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiBhbnk7IH0+IHsKKyAgICBjb25zdCBmaXJzdF9tYXA6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAgIGNvbnN0IHNlY29uZF9tYXA6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKyAgCisgICAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKKyAgCisgICAgY29uc3QgaW5zYW5lOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisgICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKKworICAgIHJldHVybiBRLnJlc29sdmUoaW5zYW5lKTsKKyAgfQorICB0ZXN0TXVsdGkoYXJnMDogYW55LCBhcmcxOiBudW1iZXIsIGFyZzI6IG51bWJlciwgYXJnMzogeyBbazogbnVtYmVyXTogc3RyaW5nOyB9LCBhcmc0OiB0dHlwZXMuTnVtYmVyeiwgYXJnNTogbnVtYmVyKSB7CisgICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CisgICAgcmV0dXJuIFEucmVzb2x2ZShoZWxsbyk7CisgIH0KKyAgdGVzdEV4Y2VwdGlvbihhcmc6IHN0cmluZyk6IFEuSVByb21pc2U8dm9pZD4geworICAgIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgdGhyb3cgeDsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRFeGNlcHRpb24oYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICAgIH0KKyAgfQorICB0ZXN0TXVsdGlFeGNlcHRpb24oYXJnMDogc3RyaW5nLCBhcmcxOiBzdHJpbmcpIHsKKyAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJzsKKyAgICAgIHRocm93IHg7CisgICAgfSBlbHNlIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uMicpKSB7CisgICAgICB2YXIgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICAgIHRocm93IHgyOworICAgIH0KKworICAgIHZhciByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgIHJldHVybiBRLnJlc29sdmUocmVzKTsKKyAgfQorICB0ZXN0T25ld2F5KHNsZWVwRm9yOiBudW1iZXIpIHsKKyAgfQorCisgIHRlc3RTdHJpbmcodGhpbmc6IHN0cmluZykgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RCb29sKHRoaW5nOiBib29sZWFuKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdEJ5dGUodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RJMzIodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RJNjQodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3REb3VibGUodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RCaW5hcnkodGhpbmc6IEJ1ZmZlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RTdHJ1Y3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0TmVzdCh0aGluZzogdHR5cGVzLlh0cnVjdDIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0TWFwKHRoaW5nOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0U3RyaW5nTWFwKHRoaW5nOiB7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0U2V0KHRoaW5nOiBudW1iZXJbXSkgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RMaXN0KHRoaW5nOiBudW1iZXJbXSkgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RFbnVtKHRoaW5nOiB0dHlwZXMuTnVtYmVyeikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RUeXBlZGVmKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorfQorCitleHBvcnQgY2xhc3MgQXN5bmNUaHJpZnRUZXN0SGFuZGxlciB7CisgIHByaXZhdGUgc3luY0hhbmRsZXI6IFN5bmNUaHJpZnRUZXN0SGFuZGxlcjsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy5zeW5jSGFuZGxlciA9IG5ldyBTeW5jVGhyaWZ0VGVzdEhhbmRsZXIoKTsKKyAgfQorCisgIHRlc3RWb2lkKGNhbGxiYWNrOiAocmVzdWx0OiB2b2lkKSA9PiB2b2lkKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgY2FsbGJhY2sodW5kZWZpbmVkKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE1hcE1hcChoZWxsbzogbnVtYmVyLAorICAgIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogbnVtYmVyXTogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9OyB9KSA9PiB2b2lkKToKKyAgICAgUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH07IH0+IHsKKworICAgIHZhciBtYXBtYXA6IHtba2V5OiBudW1iZXJdOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9fSA9IFtdOworICAgIHZhciBwb3M6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSBbXTsKKyAgICB2YXIgbmVnOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgY2FsbGJhY2sobnVsbCwgbWFwbWFwKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEluc2FuaXR5KGFyZ3VtZW50OiB0dHlwZXMuSW5zYW5pdHksIGNhbGxiYWNrPzogKGVycjogYW55LCByZXN1bHQ6IHsgW2s6IG51bWJlcl06IGFueTsgfSkgPT4gdm9pZCk6IFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogYW55OyB9PiB7CisgICAgY29uc3QgZmlyc3RfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgICBjb25zdCBzZWNvbmRfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgCisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CisgIAorICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisgIAorICAgIGNvbnN0IGluc2FuZTogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOworICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisKKyAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCl7CisgICAgICBjYWxsYmFjayhudWxsLCBpbnNhbmUpOworICAgIH0KKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE11bHRpKGFyZzA6IGFueSwgYXJnMTogbnVtYmVyLCBhcmcyOiBudW1iZXIsIGFyZzM6IHsgW2s6IG51bWJlcl06IHN0cmluZzsgfSwgYXJnNDogdHR5cGVzLk51bWJlcnosIGFyZzU6IG51bWJlciwgcmVzdWx0OiBGdW5jdGlvbik6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIHZhciBoZWxsbyA9IHRoaXMuc3luY0hhbmRsZXIudGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICAgIGhlbGxvLnRoZW4oaGVsbG8gPT4gcmVzdWx0KG51bGwsIGhlbGxvKSk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RFeGNlcHRpb24oYXJnOiBzdHJpbmcsIHJlc3VsdDogKGVycjogYW55KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgaWYgKGFyZyA9PT0gJ1hjZXB0aW9uJykgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgICByZXN1bHQoeCk7CisgICAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgeworICAgICAgcmVzdWx0KG5ldyBUaHJpZnQuVEV4Y2VwdGlvbihhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0KG51bGwpOworICAgIH0KKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE11bHRpRXhjZXB0aW9uKGFyZzA6IHN0cmluZywgYXJnMTogc3RyaW5nLCByZXN1bHQ6IChlcnI6IGFueSwgcmVzPzogdHR5cGVzLlh0cnVjdCkgPT4gdm9pZCk6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CisgICAgICByZXN1bHQoeDIpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgICAgcmVzdWx0KG51bGwsIHJlcyk7CisgICAgfQorICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0T25ld2F5KHNsZWVwRm9yOiBudW1iZXIsIHJlc3VsdDogRnVuY3Rpb24pIHsKKyAgICB0aGlzLnN5bmNIYW5kbGVyLnRlc3RPbmV3YXkoc2xlZXBGb3IpOworICB9CisgIHRlc3RTdHJpbmcodGhpbmc6IHN0cmluZywgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBzdHJpbmcpID0+IHZvaWQpOiBRLklQcm9taXNlPHN0cmluZz4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEJ5dGUodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEJvb2wodGhpbmc6IGJvb2xlYW4sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZCApOiBRLklQcm9taXNlPGJvb2xlYW4+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJMzIodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJNjQodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3REb3VibGUodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RCaW5hcnkodGhpbmc6IEJ1ZmZlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBCdWZmZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPEJ1ZmZlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFN0cnVjdCh0aGluZzogdHR5cGVzLlh0cnVjdCwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB0dHlwZXMuWHRydWN0KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx0dHlwZXMuWHRydWN0PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TmVzdCh0aGluZzogdHR5cGVzLlh0cnVjdDIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLlh0cnVjdDIpID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5YdHJ1Y3QyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TWFwKHRoaW5nOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RTdHJpbmdNYXAodGhpbmc6IHsgW2s6IHN0cmluZ106IHN0cmluZzsgfSwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0pID0+IHZvaWQpOiBRLklQcm9taXNlPHsgW2s6IHN0cmluZ106IHN0cmluZzsgfT4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFNldCh0aGluZzogbnVtYmVyW10sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyW10pID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcltdPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TGlzdCh0aGluZzogbnVtYmVyW10sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyW10pID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcltdPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0RW51bSh0aGluZzogdHR5cGVzLk51bWJlcnosIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLk51bWJlcnopID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5OdW1iZXJ6PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0VHlwZWRlZih0aGluZzogbnVtYmVyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcikgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24gYi9saWIvbm9kZXRzL3Rlc3QvdHNjb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlkMDZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24KQEAgLTAsMCArMSwyMiBAQAoreworICAgICJjb21waWxlck9wdGlvbnMiOiB7CisgICAgICAgICJhbGxvd0pzIjogZmFsc2UsCisgICAgICAgICJhbHdheXNTdHJpY3QiOiB0cnVlLAorICAgICAgICAiYmFzZVVybCI6ICIuIiwKKyAgICAgICAgImRlY2xhcmF0aW9uIjogdHJ1ZSwKKyAgICAgICAgImVtaXREZWNvcmF0b3JNZXRhZGF0YSI6IHRydWUsCisgICAgICAgICJleHBlcmltZW50YWxEZWNvcmF0b3JzIjogdHJ1ZSwKKyAgICAgICAgIm1vZHVsZSI6ICJjb21tb25qcyIsCisgICAgICAgICJtb2R1bGVSZXNvbHV0aW9uIjogIm5vZGUiLAorICAgICAgICAibm9JbXBsaWNpdFRoaXMiOiB0cnVlLAorICAgICAgICAibm9VbnVzZWRMb2NhbHMiOiB0cnVlLAorICAgICAgICAicHJlc2VydmVDb25zdEVudW1zIjogdHJ1ZSwKKyAgICAgICAgInJlbW92ZUNvbW1lbnRzIjogdHJ1ZSwKKyAgICAgICAgInN0cmljdEZ1bmN0aW9uVHlwZXMiOiB0cnVlLAorICAgICAgICAic3RyaWN0TnVsbENoZWNrcyI6IHRydWUsCisgICAgICAgICJ0YXJnZXQiOiAiZXM2IiwKKyAgICAgICAgInBhdGhzIjogeworICAgICAgICAgICAgInRocmlmdCI6IFsiLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQiXQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sLy5naXRpZ25vcmUgYi9saWIvb2NhbWwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlhNmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxMSBAQAorX2J1aWxkLworX3RhZ3MKK2NvbmZpZ3VyZQorc2V0dXAuZGF0YQorc2V0dXAubWwKK215b2NhbWxidWlsZC5tbAorKi9NRVRBCisqLyoubWxsaWIKKyovKi5tbGR5bGliCitNYWtlZmlsZQorT0NhbWxNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL0RFVkVMT1BNRU5UIGIvbGliL29jYW1sL0RFVkVMT1BNRU5UCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvREVWRUxPUE1FTlQKQEAgLTAsMCArMSw3NiBAQAorVGhyaWZ0IE9DYW1sIERldmVsb3BtZW50Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworUHJlcmVxdWlzaXRlcworLS0tLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBidWlsZCB0aGlzIGxpYnJhcnksIHlvdSBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBpbnN0YWxsZWQ6CisKKyAgKiBUaGUgT0NhbWwgY29tcGlsZXIsIHByZWZlcmFibHkgPjQuMDAKKyAgKiBUaGUgT2FzaXMgYnVpbGQgdG9vbAorCitJbiBhZGRpdGlvbiB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBPUEFNLCB3aGljaCB3aWxsIGFsbG93IHlvdSB0byBzZXR1cCBhbgorT0NhbWwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCdzIGlzb2xhdGVkIGZyb20geW91ciBzeXN0ZW0gaW5zdGFsbGF0aW9uLAorbXVjaCBsaWtlIHZpcnV0YWxlbnYgZm9yIFB5dGhvbiBvciB0aGUgbXlyaWFkIHN5c3RlbXMgYXZhaWxhYmxlIGZvciBSdWJ5LiBJZgoreW91IGhhdmUgT1BBTSBpbnN0YWxsZWQsIHRoZW4gaW5zdGFsbGluZyBPYXNpcyBpcyBhcyBzaW1wbGUgYXMgcnVubmluZzoKKworICAkIG9wYW0gaW5zdGFsbCBvYXNpcworCitCdWlsZGluZworLS0tLS0tLS0KKworT25jZSBhbGwgdGhlIHByZXJlcXVpc2l0ZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgJCBvYXNpcyBzZXR1cAorICAkIC4vY29uZmlndXJlCisgICQgbWFrZQorCitUaGUgYG9hc2lzIHNldHVwYCBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIE1ha2VmaWxlLAorYWxvbmcgd2l0aCBvdGhlciBmaWxlcyB0aGF0IG9wYW0gd2lsbCB1c2UgdG8gY3JlYXRlIGFuIGluc3RhbGxhYmxlIGxpYnJhcnkuCitUaGUgY29maWd1cmUgc2NyaXB0IHdpbGwgZW5zdXJlIHRoYXQgYWxsIGJ1aWxkIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkLCBhbmQKK21ha2Ugd2lsbCBhY3R1YWxseSBidWlsZCB0aGUgbGlicmFyeS4KKworVG8gcmVtb3ZlIGZpbGVzIHRoYXQgdGhlIGNvbXBpbGVyIGdlbmVhdGVzLCBydW46CisKKyAgJCBtYWtlIGNsZWFuCisKK1RvIHJlbW92ZSB0aG9zZSBmaWxlcyBfYXMgd2VsbCBhc18gZmlsZXMgdGhhdCB0aGUgc2V0dXAgYW5kIGNvbmZpZ3VyZSBwcm9jZXNzCitnZW5lcmF0ZXMsIHJ1bjoKKworICAkIHJtIGBjYXQgLmdpdGlnbm9yZWAKKworSW5zdGFsbGluZworLS0tLS0tLS0tLQorCitJZiB5b3UncmUgdXNpbmcgb3BhbSwgc2ltcGx5IHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgJCBtYWtlIGluc3RhbGwKKworV2hpbGUgZGV2ZWxvcG1lbnQsIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIHlvdXIgbGF0ZXN0IGJ1aWxkIG9uIHRoZSBzeXN0ZW0gdG8KK3Rlc3QgYWdhaW5zdCBvdGhlciBsaWJyYXJpZXMgb3IgcHJvZ3JhbXMuIFRvIGRvIHRoaXMsIHVzZToKKworICAkIG1ha2UgcmVpbnN0YWxsCisKK0Rpc3RyaWJ1dGlvbgorLS0tLS0tLS0tLS0tCisKK1RoZSBkZSBmYWN0byBwcmVmZXJyZWQgbWV0aG9kIGZvciBkaXN0cmlidXRpbmcgT0NhbWwgbGlicmFyaWVzIGlzIHRocm91Z2ggdGhlCitPUEFNIHBhY2thZ2UgcmVwb3NpdG9yeS4gVG8gcHVibGlzaCB0aGUgbGF0ZXN0IHBhY2thZ2UsIGlzc3VlIGEgcHVsbCByZXF1ZXN0CithZ2FpbnN0IHRoZSBmb2xsb3dpbmcgZ2l0aHViIHJlcG9zaXRvcnk6CisKKyAgaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeQorCitUaGUgcHVsbCByZXF1ZXN0aW9uIHNob3VsZCBhZGQgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIGFuZCBmaWxlczoKKworICBwYWNrYWdlCisgICAgfF9fdGhyaWZ0CisgICAgICAgfF9fdGhyaWZ0LjxWRVJTSU9OPgorICAgICAgICAgIHxfXyBkZXNjcgorICAgICAgICAgIHxfXyBvcGFtCisgICAgICAgICAgfF9fIHVybAorCitUZW1wbGF0ZXMgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBvcGFtLyBzdWJkaXJlY3Rvcnkgb2YKK3RoaXMgbGlicmFyeSdzIHJvb3QsIHdpdGggWFhYKC4uLikgaW5kaWNhdGluZyBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGZpbGxlZAorb3V0LiBZb3UgY2FuIGZpbmQgZnVydGhlciBkb2N1bWVudGF0aW9uIGhlcmU6CisKKyAgaHR0cDovL29wYW0ub2NhbWwub3JnL2RvYy9QYWNrYWdpbmcuaHRtbApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL01ha2VmaWxlIGIvbGliL29jYW1sL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWJlZWU3Li4wMDAwMDAwCi0tLSBhL2xpYi9vY2FtbC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1hbGw6Ci0JY2Qgc3JjOyBtYWtlOyBjZCAuLgotY2xlYW46Ci0JY2Qgc3JjOyBtYWtlIGNsZWFuOyBjZCAuLgpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL09DYW1sTWFrZWZpbGUgYi9saWIvb2NhbWwvT0NhbWxNYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiOTI1Mi4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvT0NhbWxNYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWxNYWtlZmlsZQotIyAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBNYXJrdXMgTW90dGwKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB1cGRhdGVzIHNlZToKLSMgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5vY2FtbC5pbmZvL2hvbWUvb2NhbWxfc291cmNlcy5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBNb2RpZmllZCBieSBkYW1pZW4gZm9yIC5nbGFkZS5tbCBjb21waWxhdGlvbgotCi0jIFNldCB0aGVzZSB2YXJpYWJsZXMgdG8gdGhlIG5hbWVzIG9mIHRoZSBzb3VyY2VzIHRvIGJlIHByb2Nlc3NlZCBhbmQKLSMgdGhlIHJlc3VsdCB2YXJpYWJsZS4gT3JkZXIgbWF0dGVycyBkdXJpbmcgbGlua2FnZSEKLQotaWZuZGVmIFNPVVJDRVMKLSAgU09VUkNFUyA6PSBmb28ubWwKLWVuZGlmCi1leHBvcnQgU09VUkNFUwotCi1pZm5kZWYgUkVTX0NMSUJfU1VGCi0gIFJFU19DTElCX1NVRiA6PSBfc3R1YnMKLWVuZGlmCi1leHBvcnQgUkVTX0NMSUJfU1VGCi0KLWlmbmRlZiBSRVNVTFQKLSAgUkVTVUxUIDo9IGZvbwotZW5kaWYKLWV4cG9ydCBSRVNVTFQgOj0gJChzdHJpcCAkKFJFU1VMVCkpCi0KLWV4cG9ydCBMSUJfUEFDS19OQU1FCi0KLWlmbmRlZiBET0NfRklMRVMKLSAgRE9DX0ZJTEVTIDo9ICQoZmlsdGVyICUubWxpLCAkKFNPVVJDRVMpKQotZW5kaWYKLWV4cG9ydCBET0NfRklMRVMKLUZJUlNUX0RPQ19GSUxFIDo9ICQoZmlyc3R3b3JkICQoRE9DX0ZJTEVTKSkKLQotZXhwb3J0IEJDU1VGRklYCi1leHBvcnQgTkNTVUZGSVgKLQotaWZuZGVmIFRPUFNVRkZJWAotICBUT1BTVUZGSVggOj0gLnRvcAotZW5kaWYKLWV4cG9ydCBUT1BTVUZGSVgKLQotIyBFdmVudHVhbGx5IHNldCBpbmNsdWRlLSBhbmQgbGlicmFyeS1wYXRocywgbGlicmFyaWVzIHRvIGxpbmssCi0jIGFkZGl0aW9uYWwgY29tcGlsYXRpb24tLCBsaW5rLSBhbmQgb2NhbWx5YWNjLWZsYWdzCi0jIFBhdGgtIGFuZCBsaWJyYXJ5IGluZm9ybWF0aW9uIG5lZWRzIG5vdCBiZSB3cml0dGVuIHdpdGggIi1JIiBhbmQgc3VjaC4uLgotIyBEZWZpbmUgVEhSRUFEUyBpZiB5b3UgbmVlZCBpdCwgb3RoZXJ3aXNlIGxlYXZlIGl0IHVuc2V0IChzYW1lIGZvcgotIyBVU0VfQ0FNTFA0KSEKLQotZXhwb3J0IFRIUkVBRFMKLWV4cG9ydCBWTVRIUkVBRFMKLWV4cG9ydCBBTk5PVEFURQotZXhwb3J0IFVTRV9DQU1MUDQKLQotZXhwb3J0IElOQ0RJUlMKLWV4cG9ydCBMSUJESVJTCi1leHBvcnQgRVhUTElCRElSUwotZXhwb3J0IFJFU1VMVERFUFMKLWV4cG9ydCBPQ0FNTF9ERUZBVUxUX0RJUlMKLQotZXhwb3J0IExJQlMKLWV4cG9ydCBDTElCUwotZXhwb3J0IENGUkFNRVdPUktTCi0KLWV4cG9ydCBPQ0FNTEZMQUdTCi1leHBvcnQgT0NBTUxOQ0ZMQUdTCi1leHBvcnQgT0NBTUxCQ0ZMQUdTCi0KLWV4cG9ydCBPQ0FNTExERkxBR1MKLWV4cG9ydCBPQ0FNTE5MREZMQUdTCi1leHBvcnQgT0NBTUxCTERGTEFHUwotCi1leHBvcnQgT0NBTUxNS0xJQl9GTEFHUwotCi1pZm5kZWYgT0NBTUxDUEZMQUdTCi0gIE9DQU1MQ1BGTEFHUyA6PSBhCi1lbmRpZgotZXhwb3J0IE9DQU1MQ1BGTEFHUwotCi1pZm5kZWYgRE9DX0RJUgotICBET0NfRElSIDo9IGRvYwotZW5kaWYKLWV4cG9ydCBET0NfRElSCi0KLWV4cG9ydCBQUEZMQUdTCi0KLWV4cG9ydCBMRkxBR1MKLWV4cG9ydCBZRkxBR1MKLWV4cG9ydCBJRExGTEFHUwotCi1leHBvcnQgT0NBTUxET0NGTEFHUwotCi1leHBvcnQgT0NBTUxGSU5EX0lOU1RGTEFHUwotCi1leHBvcnQgRFZJUFNGTEFHUwotCi1leHBvcnQgU1RBVElDCi0KLSMgQWRkIGEgbGlzdCBvZiBvcHRpb25hbCB0cmFzaCBmaWxlcyB0aGF0IHNob3VsZCBiZSBkZWxldGVkIGJ5ICJtYWtlIGNsZWFuIgotZXhwb3J0IFRSQVNICi0KLUVDSE8gOj0gZWNobwotCi1pZmRlZiBSRUFMTFlfUVVJRVQKLSAgZXhwb3J0IFJFQUxMWV9RVUlFVAotICBFQ0hPIDo9IHRydWUKLSAgTEZMQUdTIDo9ICQoTEZMQUdTKSAtcQotICBZRkxBR1MgOj0gJChZRkxBR1MpIC1xCi1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyAgdmFyaWFibGVzIGRlcGVuZGluZyBvbiB5b3VyIE9DYW1sLWluc3RhbGxhdGlvbgotCi1pZmRlZiBNSU5HVwotICBleHBvcnQgTUlOR1cKLSAgV0lOMzIgICA6PSAxCi0gIENGTEFHU19XSU4zMiA6PSAtbW5vLWN5Z3dpbgotZW5kaWYKLWlmZGVmIE1TVkMKLSAgZXhwb3J0IE1TVkMKLSAgV0lOMzIgICA6PSAxCi0gIGlmbmRlZiBTVEFUSUMKLSAgICBDUFBGTEFHU19XSU4zMiA6PSAtRENBTUxfRExMCi0gIGVuZGlmCi0gIENGTEFHU19XSU4zMiArPSAtbm9sb2dvCi0gIEVYVF9PQkogOj0gb2JqCi0gIEVYVF9MSUIgOj0gbGliCi0gIGlmZXEgKCQoQ0MpLGdjYykKLSAgICAjIHdvcmsgYXJvdW5kIEdOVSBNYWtlIGRlZmF1bHQgdmFsdWUKLSAgICBpZmRlZiBUSFJFQURTCi0gICAgICBDQyA6PSBjbCAtTVQKLSAgICBlbHNlCi0gICAgICBDQyA6PSBjbAotICAgIGVuZGlmCi0gIGVuZGlmCi0gIGlmZXEgKCQoQ1hYKSxnKyspCi0gICAgIyB3b3JrIGFyb3VuZCBHTlUgTWFrZSBkZWZhdWx0IHZhbHVlCi0gICAgQ1hYIDo9ICQoQ0MpCi0gIGVuZGlmCi0gIENGTEFHX08gOj0gLUZvCi1lbmRpZgotaWZkZWYgV0lOMzIKLSAgRVhUX0NYWCA6PSBjcHAKLSAgRVhFICAgICA6PSAuZXhlCi1lbmRpZgotCi1pZm5kZWYgRVhUX09CSgotICBFWFRfT0JKIDo9IG8KLWVuZGlmCi1pZm5kZWYgRVhUX0xJQgotICBFWFRfTElCIDo9IGEKLWVuZGlmCi1pZm5kZWYgRVhUX0NYWAotICBFWFRfQ1hYIDo9IGNjCi1lbmRpZgotaWZuZGVmIEVYRQotICBFWEUgOj0gIyBlbXB0eQotZW5kaWYKLWlmbmRlZiBDRkxBR19PCi0gIENGTEFHX08gOj0gLW8gIyBkbyBub3QgZGVsZXRlIHRoaXMgY29tbWVudCAocHJlc2VydmVzIHRyYWlsaW5nIHdoaXRlc3BhY2UpIQotZW5kaWYKLQotZXhwb3J0IENDCi1leHBvcnQgQ1hYCi1leHBvcnQgQ0ZMQUdTCi1leHBvcnQgQ1hYRkxBR1MKLWV4cG9ydCBMREZMQUdTCi1leHBvcnQgQ1BQRkxBR1MKLQotaWZuZGVmIFJQQVRIX0ZMQUcKLSAgaWZkZWYgRUxGX1JQQVRIX0ZMQUcKLSAgICBSUEFUSF9GTEFHIDo9ICQoRUxGX1JQQVRIX0ZMQUcpCi0gIGVsc2UKLSAgICBSUEFUSF9GTEFHIDo9IC1SCi0gIGVuZGlmCi1lbmRpZgotZXhwb3J0IFJQQVRIX0ZMQUcKLQotaWZuZGVmIE1TVkMKLWlmbmRlZiBQSUNfQ0ZMQUdTCi0gIFBJQ19DRkxBR1MgOj0gLWZQSUMKLWVuZGlmCi1pZm5kZWYgUElDX0NQUEZMQUdTCi0gIFBJQ19DUFBGTEFHUyA6PSAtRFBJQwotZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBQSUNfQ0ZMQUdTCi1leHBvcnQgUElDX0NQUEZMQUdTCi0KLUJDUkVTVUxUICA6PSAkKGFkZHN1ZmZpeCAkKEJDU1VGRklYKSwgJChSRVNVTFQpKQotTkNSRVNVTFQgIDo9ICQoYWRkc3VmZml4ICQoTkNTVUZGSVgpLCAkKFJFU1VMVCkpCi1UT1BSRVNVTFQgOj0gJChhZGRzdWZmaXggJChUT1BTVUZGSVgpLCAkKFJFU1VMVCkpCi0KLWlmbmRlZiBPQ0FNTEZJTkQKLSAgT0NBTUxGSU5EIDo9IG9jYW1sZmluZAotZW5kaWYKLWV4cG9ydCBPQ0FNTEZJTkQKLQotaWZuZGVmIE9DQU1MQwotICBPQ0FNTEMgOj0gb2NhbWxjCi1lbmRpZgotZXhwb3J0IE9DQU1MQwotCi1pZm5kZWYgT0NBTUxPUFQKLSAgT0NBTUxPUFQgOj0gb2NhbWxvcHQKLWVuZGlmCi1leHBvcnQgT0NBTUxPUFQKLQotaWZuZGVmIE9DQU1MTUtUT1AKLSAgT0NBTUxNS1RPUCA6PSBvY2FtbG1rdG9wCi1lbmRpZgotZXhwb3J0IE9DQU1MTUtUT1AKLQotaWZuZGVmIE9DQU1MQ1AKLSAgT0NBTUxDUCA6PSBvY2FtbGNwCi1lbmRpZgotZXhwb3J0IE9DQU1MQ1AKLQotaWZuZGVmIE9DQU1MREVQCi0gIE9DQU1MREVQIDo9IG9jYW1sZGVwCi1lbmRpZgotZXhwb3J0IE9DQU1MREVQCi0KLWlmbmRlZiBPQ0FNTExFWAotICBPQ0FNTExFWCA6PSBvY2FtbGxleAotZW5kaWYKLWV4cG9ydCBPQ0FNTExFWAotCi1pZm5kZWYgT0NBTUxZQUNDCi0gIE9DQU1MWUFDQyA6PSBvY2FtbHlhY2MKLWVuZGlmCi1leHBvcnQgT0NBTUxZQUNDCi0KLWlmbmRlZiBPQ0FNTE1LTElCCi0gIE9DQU1MTUtMSUIgOj0gb2NhbWxta2xpYgotZW5kaWYKLWV4cG9ydCBPQ0FNTE1LTElCCi0KLWlmbmRlZiBPQ0FNTF9HTEFERUNDCi0gIE9DQU1MX0dMQURFQ0MgOj0gbGFibGdsYWRlY2MyCi1lbmRpZgotZXhwb3J0IE9DQU1MX0dMQURFQ0MKLQotaWZuZGVmIE9DQU1MX0dMQURFQ0NfRkxBR1MKLSAgT0NBTUxfR0xBREVDQ19GTEFHUyA6PQotZW5kaWYKLWV4cG9ydCBPQ0FNTF9HTEFERUNDX0ZMQUdTCi0KLWlmbmRlZiBDQU1FTEVPTl9SRVBPUlQKLSAgQ0FNRUxFT05fUkVQT1JUIDo9IHJlcG9ydAotZW5kaWYKLWV4cG9ydCBDQU1FTEVPTl9SRVBPUlQKLQotaWZuZGVmIENBTUVMRU9OX1JFUE9SVF9GTEFHUwotICBDQU1FTEVPTl9SRVBPUlRfRkxBR1MgOj0KLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fUkVQT1JUX0ZMQUdTCi0KLWlmbmRlZiBDQU1FTEVPTl9aT0dHWQotICBDQU1FTEVPTl9aT0dHWSA6PSBjYW1scDRvIHBhX3pvZy5jbWEgcHJfby5jbW8KLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fWk9HR1kKLQotaWZuZGVmIENBTUVMRU9OX1pPR0dZX0ZMQUdTCi0gIENBTUVMRU9OX1pPR0dZX0ZMQUdTIDo9Ci1lbmRpZgotZXhwb3J0IENBTUVMRU9OX1pPR0dZX0ZMQUdTCi0KLWlmbmRlZiBPWFJJREwKLSAgT1hSSURMIDo9IG94cmlkbAotZW5kaWYKLWV4cG9ydCBPWFJJREwKLQotaWZuZGVmIENBTUxJREwKLSAgQ0FNTElETCA6PSBjYW1saWRsCi1lbmRpZgotZXhwb3J0IENBTUxJREwKLQotaWZuZGVmIENBTUxJRExETEwKLSAgQ0FNTElETERMTCA6PSBjYW1saWRsZGxsCi1lbmRpZgotZXhwb3J0IENBTUxJRExETEwKLQotaWZuZGVmIE5PSURMSEVBREVSCi0gIE1BWUJFX0lETF9IRUFERVIgOj0gLWhlYWRlcgotZW5kaWYKLWV4cG9ydCBOT0lETEhFQURFUgotCi1leHBvcnQgTk9fQ1VTVE9NCi0KLWlmbmRlZiBDQU1MUDQKLSAgQ0FNTFA0IDo9IGNhbWxwNAotZW5kaWYKLWV4cG9ydCBDQU1MUDQKLQotaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gIGlmZGVmIFBBQ0tTCi0gICAgaWZuZGVmIENSRUFURV9MSUIKLSAgICAgIGlmZGVmIFRIUkVBRFMKLQlQQUNLUyArPSB0aHJlYWRzCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gICAgZW1wdHkgOj0KLSAgICBzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQotICAgIGNvbW1hIDo9ICwKLSAgICBpZmRlZiBQUkVEUwotICAgICAgUFJFX09DQU1MX0ZJTkRfUFJFRElDQVRFUyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUFJFRFMpKQotICAgICAgUFJFX09DQU1MX0ZJTkRfUEFDS0FHRVMgOj0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBBQ0tTKSkKLSAgICAgIE9DQU1MX0ZJTkRfUFJFRElDQVRFUyA6PSAtcHJlZGljYXRlcyAkKFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMpCi0gICMgICAgT0NBTUxfREVQX1BSRURJQ0FURVMgOj0gLXN5bnRheCAkKFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMpCi0gICAgICBPQ0FNTF9GSU5EX1BBQ0tBR0VTIDo9ICQoT0NBTUxfRklORF9QUkVESUNBVEVTKSAtcGFja2FnZSAkKFBSRV9PQ0FNTF9GSU5EX1BBQ0tBR0VTKQotICAgICAgT0NBTUxfREVQX1BBQ0tBR0VTIDo9ICQoT0NBTUxfREVQX1BSRURJQ0FURVMpIC1wYWNrYWdlICQoUFJFX09DQU1MX0ZJTkRfUEFDS0FHRVMpCi0gICAgZWxzZQotICAgICAgT0NBTUxfRklORF9QQUNLQUdFUyA6PSAtcGFja2FnZSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUEFDS1MpKQotICAgICAgT0NBTUxfREVQX1BBQ0tBR0VTIDo9Ci0gICAgZW5kaWYKLSAgICBPQ0FNTF9GSU5EX0xJTktQS0cgOj0gLWxpbmtwa2cKLSAgICBSRUFMX09DQU1MRklORCA6PSAkKE9DQU1MRklORCkKLSAgZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBPQ0FNTF9GSU5EX1BBQ0tBR0VTCi1leHBvcnQgT0NBTUxfREVQX1BBQ0tBR0VTCi1leHBvcnQgT0NBTUxfRklORF9MSU5LUEtHCi1leHBvcnQgUkVBTF9PQ0FNTEZJTkQKLQotaWZuZGVmIE9DQU1MRE9DCi0gIE9DQU1MRE9DIDo9IG9jYW1sZG9jCi1lbmRpZgotZXhwb3J0IE9DQU1MRE9DCi0KLWlmbmRlZiBMQVRFWAotICBMQVRFWCA6PSBsYXRleAotZW5kaWYKLWV4cG9ydCBMQVRFWAotCi1pZm5kZWYgRFZJUFMKLSAgRFZJUFMgOj0gZHZpcHMKLWVuZGlmCi1leHBvcnQgRFZJUFMKLQotaWZuZGVmIFBTMlBERgotICBQUzJQREYgOj0gcHMycGRmCi1lbmRpZgotZXhwb3J0IFBTMlBERgotCi1pZm5kZWYgT0NBTUxNQUtFRklMRQotICBPQ0FNTE1BS0VGSUxFIDo9IE9DYW1sTWFrZWZpbGUKLWVuZGlmCi1leHBvcnQgT0NBTUxNQUtFRklMRQotCi1pZm5kZWYgT0NBTUxMSUJQQVRICi0gIE9DQU1MTElCUEFUSCA6PSBcCi0gICAgJChzaGVsbCAkKE9DQU1MQykgMj4vZGV2L251bGwgLXdoZXJlIHx8IGVjaG8gL3Vzci9sb2NhbC9saWIvb2NhbWwpCi1lbmRpZgotZXhwb3J0IE9DQU1MTElCUEFUSAotCi1pZm5kZWYgT0NBTUxfTElCX0lOU1RBTEwKLSAgT0NBTUxfTElCX0lOU1RBTEwgOj0gJChPQ0FNTExJQlBBVEgpL2NvbnRyaWIKLWVuZGlmCi1leHBvcnQgT0NBTUxfTElCX0lOU1RBTEwKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjICBjaGFuZ2UgZm9sbG93aW5nIHNlY3Rpb25zIG9ubHkgaWYKLSMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKLQotIyBkZWxldGUgdGFyZ2V0IGZpbGVzIHdoZW4gYSBidWlsZCBjb21tYW5kIGZhaWxzCi0uUEhPTlk6IC5ERUxFVEVfT05fRVJST1IKLS5ERUxFVEVfT05fRVJST1I6Ci0KLSMgZm9yIHBlZGFudHMgdXNpbmcgIi0td2Fybi11bmRlZmluZWQtdmFyaWFibGVzIgotZXhwb3J0IE1BWUJFX0lETAotZXhwb3J0IFJFQUxfUkVTVUxUCi1leHBvcnQgQ0FNTElETEZMQUdTCi1leHBvcnQgVEhSRUFEX0ZMQUcKLWV4cG9ydCBSRVNfQ0xJQgotZXhwb3J0IE1BS0VETEwKLWV4cG9ydCBBTk5PVF9GTEFHCi1leHBvcnQgQ19PWFJJREwKLWV4cG9ydCBTVUJQUk9KUwotZXhwb3J0IENGTEFHU19XSU4zMgotZXhwb3J0IENQUEZMQUdTX1dJTjMyCi0KLUlOQ0ZMQUdTIDo9Ci0KLVNIRUxMIDo9IC9iaW4vc2gKLQotTUxERVBESVIgOj0gLl9kCi1CQ0RJRElSICA6PSAuX2JjZGkKLU5DRElESVIgIDo9IC5fbmNkaQotCi1GSUxURVJfRVhUTlMgOj0gJS5tbGkgJS5tbCAlLm1sbCAlLm1seSAlLmlkbCAlLm94cmlkbCAlLmMgJS5tICUuJChFWFRfQ1hYKSAlLnJlcCAlLnpvZyAlLmdsYWRlCi0KLUZJTFRFUkVEICAgICA6PSAkKGZpbHRlciAkKEZJTFRFUl9FWFROUyksICQoU09VUkNFUykpCi1TT1VSQ0VfRElSUyAgOj0gJChmaWx0ZXItb3V0IC4vLCAkKHNvcnQgJChkaXIgJChGSUxURVJFRCkpKSkKLQotRklMVEVSRURfUkVQIDo9ICQoZmlsdGVyICUucmVwLCAkKEZJTFRFUkVEKSkKLURFUF9SRVAgICAgICA6PSAkKEZJTFRFUkVEX1JFUDolLnJlcD0kKE1MREVQRElSKS8lLmQpCi1BVVRPX1JFUCAgICAgOj0gJChGSUxURVJFRF9SRVA6LnJlcD0ubWwpCi0KLUZJTFRFUkVEX1pPRyA6PSAkKGZpbHRlciAlLnpvZywgJChGSUxURVJFRCkpCi1ERVBfWk9HICAgICAgOj0gJChGSUxURVJFRF9aT0c6JS56b2c9JChNTERFUERJUikvJS5kKQotQVVUT19aT0cgICAgIDo9ICQoRklMVEVSRURfWk9HOi56b2c9Lm1sKQotCi1GSUxURVJFRF9HTEFERSA6PSAkKGZpbHRlciAlLmdsYWRlLCAkKEZJTFRFUkVEKSkKLURFUF9HTEFERSAgICAgIDo9ICQoRklMVEVSRURfR0xBREU6JS5nbGFkZT0kKE1MREVQRElSKS8lLmQpCi1BVVRPX0dMQURFICAgICA6PSAkKEZJTFRFUkVEX0dMQURFOi5nbGFkZT0ubWwpCi0KLUZJTFRFUkVEX01MICA6PSAkKGZpbHRlciAlLm1sLCAkKEZJTFRFUkVEKSkKLURFUF9NTCAgICAgICA6PSAkKEZJTFRFUkVEX01MOiUubWw9JChNTERFUERJUikvJS5kKQotCi1GSUxURVJFRF9NTEkgOj0gJChmaWx0ZXIgJS5tbGksICQoRklMVEVSRUQpKQotREVQX01MSSAgICAgIDo9ICQoRklMVEVSRURfTUxJOi5tbGk9LmRpKQotCi1GSUxURVJFRF9NTEwgOj0gJChmaWx0ZXIgJS5tbGwsICQoRklMVEVSRUQpKQotREVQX01MTCAgICAgIDo9ICQoRklMVEVSRURfTUxMOiUubWxsPSQoTUxERVBESVIpLyUuZCkKLUFVVE9fTUxMICAgICA6PSAkKEZJTFRFUkVEX01MTDoubWxsPS5tbCkKLQotRklMVEVSRURfTUxZIDo9ICQoZmlsdGVyICUubWx5LCAkKEZJTFRFUkVEKSkKLURFUF9NTFkgICAgICA6PSAkKEZJTFRFUkVEX01MWTolLm1seT0kKE1MREVQRElSKS8lLmQpICQoRklMVEVSRURfTUxZOi5tbHk9LmRpKQotQVVUT19NTFkgICAgIDo9ICQoRklMVEVSRURfTUxZOi5tbHk9Lm1saSkgJChGSUxURVJFRF9NTFk6Lm1seT0ubWwpCi0KLUZJTFRFUkVEX0lETCA6PSAkKGZpbHRlciAlLmlkbCwgJChGSUxURVJFRCkpCi1ERVBfSURMICAgICAgOj0gJChGSUxURVJFRF9JREw6JS5pZGw9JChNTERFUERJUikvJS5kKSAkKEZJTFRFUkVEX0lETDouaWRsPS5kaSkKLUNfSURMICAgICAgICA6PSAkKEZJTFRFUkVEX0lETDolLmlkbD0lX3N0dWJzLmMpCi1pZm5kZWYgTk9JRExIRUFERVIKLSBDX0lETCArPSAkKEZJTFRFUkVEX0lETDouaWRsPS5oKQotZW5kaWYKLU9CSl9DX0lETCAgICA6PSAkKEZJTFRFUkVEX0lETDolLmlkbD0lX3N0dWJzLiQoRVhUX09CSikpCi1BVVRPX0lETCAgICAgOj0gJChGSUxURVJFRF9JREw6LmlkbD0ubWxpKSAkKEZJTFRFUkVEX0lETDouaWRsPS5tbCkgJChDX0lETCkKLQotRklMVEVSRURfT1hSSURMIDo9ICQoZmlsdGVyICUub3hyaWRsLCAkKEZJTFRFUkVEKSkKLURFUF9PWFJJREwgICAgICA6PSAkKEZJTFRFUkVEX09YUklETDolLm94cmlkbD0kKE1MREVQRElSKS8lLmQpICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9LmRpKQotQVVUT19PWFJJREwgICAgIDo9ICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9Lm1saSkgJChGSUxURVJFRF9PWFJJREw6Lm94cmlkbD0ubWwpICQoQ19PWFJJREwpCi0KLUZJTFRFUkVEX0NfQ1hYIDo9ICQoZmlsdGVyICUuYyAlLm0gJS4kKEVYVF9DWFgpLCAkKEZJTFRFUkVEKSkKLU9CSl9DX0NYWCAgICAgIDo9ICQoRklMVEVSRURfQ19DWFg6LmM9LiQoRVhUX09CSikpCi1PQkpfQ19DWFggICAgICA6PSAkKE9CSl9DX0NYWDoubT0uJChFWFRfT0JKKSkKLU9CSl9DX0NYWCAgICAgIDo9ICQoT0JKX0NfQ1hYOi4kKEVYVF9DWFgpPS4kKEVYVF9PQkopKQotCi1QUkVfVEFSR0VUUyAgKz0gJChBVVRPX01MTCkgJChBVVRPX01MWSkgJChBVVRPX0lETCkgJChBVVRPX09YUklETCkgJChBVVRPX1pPRykgJChBVVRPX1JFUCkgJChBVVRPX0dMQURFKQotCi1BTExfREVQUyAgICAgOj0gJChERVBfTUwpICQoREVQX01MSSkgJChERVBfTUxMKSAkKERFUF9NTFkpICQoREVQX0lETCkgJChERVBfT1hSSURMKSAkKERFUF9aT0cpICQoREVQX1JFUCkgJChERVBfR0xBREUpCi0KLU1MREVQUyAgICAgICA6PSAkKGZpbHRlciAlLmQsICQoQUxMX0RFUFMpKQotTUxJREVQUyAgICAgIDo9ICQoZmlsdGVyICUuZGksICQoQUxMX0RFUFMpKQotQkNERVBJUyAgICAgIDo9ICQoTUxJREVQUzolLmRpPSQoQkNESURJUikvJS5kaSkKLU5DREVQSVMgICAgICA6PSAkKE1MSURFUFM6JS5kaT0kKE5DRElESVIpLyUuZGkpCi0KLUFMTE1MICAgICAgICA6PSAkKGZpbHRlciAlLm1saSAlLm1sICUubWxsICUubWx5ICUuaWRsICUub3hyaWRsICUucmVwICUuem9nICUuZ2xhZGUsICQoRklMVEVSRUQpKQotCi1JTVBMT19JTlRGICAgOj0gJChBTExNTDolLm1saT0lLm1saS5fXykKLUlNUExPX0lOVEYgICA6PSAkKGZvcmVhY2ggZmlsZSwgJChJTVBMT19JTlRGKSwgXAotICAgICAgICAgICAgICAgICAgJChiYXNlbmFtZSAkKGZpbGUpKS5jbWkgJChiYXNlbmFtZSAkKGZpbGUpKS5jbW8pCi1JTVBMT19JTlRGICAgOj0gJChmaWx0ZXItb3V0ICUubWxpLmNtbywgJChJTVBMT19JTlRGKSkKLUlNUExPX0lOVEYgICA6PSAkKElNUExPX0lOVEY6JS5tbGkuY21pPSUuY21pKQotCi1JTVBMWF9JTlRGICAgOj0gJChJTVBMT19JTlRGOi5jbW89LmNteCkKLQotSU5URiAgICAgICAgIDo9ICQoZmlsdGVyICUuY21pLCAkKElNUExPX0lOVEYpKQotSU1QTF9DTU8gICAgIDo9ICQoZmlsdGVyICUuY21vLCAkKElNUExPX0lOVEYpKQotSU1QTF9DTVggICAgIDo9ICQoSU1QTF9DTU86LmNtbz0uY214KQotSU1QTF9BU00gICAgIDo9ICQoSU1QTF9DTU86LmNtbz0uYXNtKQotSU1QTF9TICAgICAgIDo9ICQoSU1QTF9DTU86LmNtbz0ucykKLQotT0JKX0xJTksgICAgIDo9ICQoT0JKX0NfSURMKSAkKE9CSl9DX0NYWCkKLU9CSl9GSUxFUyAgICA6PSAkKElNUExfQ01POi5jbW89LiQoRVhUX09CSikpICQoT0JKX0xJTkspCi0KLUVYRUNTICAgICAgICA6PSAkKGFkZHN1ZmZpeCAkKEVYRSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNvcnQgJChUT1BSRVNVTFQpICQoQkNSRVNVTFQpICQoTkNSRVNVTFQpKSkKLWlmZGVmIFdJTjMyCi0gIEVYRUNTICAgICAgKz0gJChCQ1JFU1VMVCkuZGxsICQoTkNSRVNVTFQpLmRsbAotZW5kaWYKLQotQ0xJQl9CQVNFICAgIDo9ICQoUkVTVUxUKSQoUkVTX0NMSUJfU1VGKQotaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLSAgUkVTX0NMSUIgICAgIDo9IGxpYiQoQ0xJQl9CQVNFKS4kKEVYVF9MSUIpCi1lbmRpZgotCi1pZmRlZiBXSU4zMgotRExMU09OQU1FIDo9ICQoQ0xJQl9CQVNFKS5kbGwKLWVsc2UKLURMTFNPTkFNRSA6PSBkbGwkKENMSUJfQkFTRSkuc28KLWVuZGlmCi0KLU5PTkVYRUNTICAgICA6PSAkKElOVEYpICQoSU1QTF9DTU8pICQoSU1QTF9DTVgpICQoSU1QTF9BU00pICQoSU1QTF9TKSBcCi0JCSQoT0JKX0ZJTEVTKSAkKFBSRV9UQVJHRVRTKSAkKEJDUkVTVUxUKS5jbWEgJChOQ1JFU1VMVCkuY214YSBcCi0JCSQoTkNSRVNVTFQpLiQoRVhUX0xJQikgJChCQ1JFU1VMVCkuY21pICQoQkNSRVNVTFQpLmNtbyBcCi0JCSQoTkNSRVNVTFQpLmNtaSAkKE5DUkVTVUxUKS5jbXggJChOQ1JFU1VMVCkubyBcCi0JCSQoUkVTX0NMSUIpICQoSU1QTF9DTU86LmNtbz0uYW5ub3QpIFwKLQkJJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbW8gJChMSUJfUEFDS19OQU1FKS5jbXggJChMSUJfUEFDS19OQU1FKS5vCi0KLWlmbmRlZiBTVEFUSUMKLSAgTk9ORVhFQ1MgKz0gJChETExTT05BTUUpCi1lbmRpZgotCi1pZm5kZWYgTElCSU5TVEFMTF9GSUxFUwotICBMSUJJTlNUQUxMX0ZJTEVTIDo9ICQoUkVTVUxUKS5tbGkgJChSRVNVTFQpLmNtaSAkKFJFU1VMVCkuY21hIFwKLQkJICAgICAgJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQikgJChSRVNfQ0xJQikKLSAgaWZuZGVmIFNUQVRJQwotICAgIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0gICAgICBMSUJJTlNUQUxMX0ZJTEVTICs9ICQoRExMU09OQU1FKQotICAgIGVuZGlmCi0gIGVuZGlmCi1lbmRpZgotCi1leHBvcnQgTElCSU5TVEFMTF9GSUxFUwotCi1pZmRlZiBXSU4zMgotICAjIHNvbWUgZXh0cmEgc3R1ZmYgaXMgY3JlYXRlZCB3aGlsZSBsaW5raW5nIERMTHMKLSAgTk9ORVhFQ1MgICArPSAkKEJDUkVTVUxUKS4kKEVYVF9MSUIpICQoQkNSRVNVTFQpLmV4cCAkKE5DUkVTVUxUKS5leHAgJChDTElCX0JBU0UpLmV4cCAkKENMSUJfQkFTRSkubGliCi1lbmRpZgotCi1UQVJHRVRTICAgICAgOj0gJChFWEVDUykgJChOT05FWEVDUykKLQotIyBJZiB0aGVyZSBhcmUgSURMLWZpbGVzCi1pZm5lcSAoJChzdHJpcCAkKEZJTFRFUkVEX0lETCkpLCkKLSAgTUFZQkVfSURMIDo9IC1jY2xpYiAtbGNhbWxpZGwKLWVuZGlmCi0KLWlmZGVmIFVTRV9DQU1MUDQKLSAgQ0FNTFA0UEFUSCA6PSBcCi0gICAgJChzaGVsbCAkKENBTUxQNCkgLXdoZXJlIDI+L2Rldi9udWxsIHx8IGVjaG8gL3Vzci9sb2NhbC9saWIvY2FtbHA0KQotICBJTkNGTEFHUyA6PSAtSSAkKENBTUxQNFBBVEgpCi0gIENJTkNGTEFHUyA6PSAtSSQoQ0FNTFA0UEFUSCkKLWVuZGlmCi0KLURJTkNGTEFHUyA6PSAkKElOQ0ZMQUdTKSAkKFNPVVJDRV9ESVJTOiU9LUkgJSkgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tSSAlKQotSU5DRkxBR1MgOj0gJChESU5DRkxBR1MpICQoSU5DRElSUzolPS1JICUpCi1DSU5DRkxBR1MgKz0gJChTT1VSQ0VfRElSUzolPS1JJSkgJChJTkNESVJTOiU9LUklKSAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1JJSkKLQotaWZuZGVmIE1TVkMKLSAgQ0xJQkZMQUdTICs9ICQoU09VUkNFX0RJUlM6JT0tTCUpICQoTElCRElSUzolPS1MJSkgXAotICAgICAgICAgICAgICAgJChFWFRMSUJESVJTOiU9LUwlKSAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1MJSkKLQotICBpZmVxICgkKEVMRl9SUEFUSCksIHllcykKLSAgICBDTElCRkxBR1MgKz0gJChFWFRMSUJESVJTOiU9LVdsLCQoUlBBVEhfRkxBRyklKQotICBlbmRpZgotZW5kaWYKLQotaWZuZGVmIFBST0ZJTElORwotICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQykKLWVsc2UKLSAgaWZuZGVmIFRIUkVBRFMKLSAgICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQ1ApIC1wICQoT0NBTUxDUEZMQUdTKQotICBlbHNlCi0gICAgIyBPQ2FtbCBkb2VzIG5vdCBzdXBwb3J0IHByb2ZpbGluZyBieXRlIGNvZGUKLSAgICAjIHdpdGggdGhyZWFkcyAoeWV0KSwgdGhlcmVmb3JlIHdlIGZvcmNlIGFuIGVycm9yLgotICAgIGlmbmRlZiBSRUFMX09DQU1MQwotICAgICAgJChlcnJvciBQcm9maWxpbmcgb2YgbXVsdGl0aHJlYWRlZCBieXRlIGNvZGUgbm90IHlldCBzdXBwb3J0ZWQgYnkgT0NhbWwpCi0gICAgZW5kaWYKLSAgICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQykKLSAgZW5kaWYKLWVuZGlmCi0KLWlmbmRlZiBNU1ZDCi0gIENPTU1PTl9MREZMQUdTIDo9ICQoTERGTEFHUzolPS1jY29wdCAlKSAkKFNPVVJDRV9ESVJTOiU9LWNjb3B0IC1MJSkgXAotCQkgICAgJChMSUJESVJTOiU9LWNjb3B0IC1MJSkgJChFWFRMSUJESVJTOiU9LWNjb3B0IC1MJSkgXAotCQkgICAgJChFWFRMSUJESVJTOiU9LWNjb3B0IC1XbCAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1jY29wdCAtTCUpKQotCi0gIGlmZXEgKCQoRUxGX1JQQVRIKSx5ZXMpCi0gICAgQ09NTU9OX0xERkxBR1MgKz0gJChFWFRMSUJESVJTOiU9LWNjb3B0IC1XbCwkKFJQQVRIX0ZMQUcpJSkKLSAgZW5kaWYKLWVsc2UKLSAgQ09NTU9OX0xERkxBR1MgOj0gLWNjb3B0ICIvbGluayAtTk9ERUZBVUxUTElCOkxJQkMgJChMREZMQUdTOiU9JSkgJChTT1VSQ0VfRElSUzolPS1MSUJQQVRIOiUpIFwKLQkJICAgICQoTElCRElSUzolPS1MSUJQQVRIOiUpICQoRVhUTElCRElSUzolPS1MSUJQQVRIOiUpIFwKLQkJICAgICQoT0NBTUxfREVGQVVMVF9ESVJTOiU9LUxJQlBBVEg6JSkgIgotZW5kaWYKLQotQ0xJQlNfT1BUUyA6PSAkKENMSUJTOiU9LWNjbGliIC1sJSkgJChDRlJBTUVXT1JLUzolPS1jY2xpYiAnLWZyYW1ld29yayAlJykKLWlmZGVmIE1TVkMKLSAgaWZuZGVmIFNUQVRJQwotICAjIE1TVkMgbGlicmFyaWVzIGRvIG5vdCBoYXZlICdsaWInIHByZWZpeAotICBDTElCU19PUFRTIDo9ICQoQ0xJQlM6JT0tY2NsaWIgJS5saWIpCi0gIGVuZGlmCi1lbmRpZgotCi1pZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotICBpZmRlZiBDUkVBVEVfTElCCi0gICAgT0JKU19MSUJTIDo9IC1jY2xpYiAtbCQoQ0xJQl9CQVNFKSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotICBlbHNlCi0gICAgT0JKU19MSUJTIDo9ICQoT0JKX0xJTkspICQoQ0xJQlNfT1BUUykgJChNQVlCRV9JREwpCi0gIGVuZGlmCi1lbHNlCi0gIE9CSlNfTElCUyA6PSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotZW5kaWYKLQotIyBJZiB3ZSBoYXZlIHRvIG1ha2UgYnl0ZS1jb2RlCi1pZm5kZWYgUkVBTF9PQ0FNTEMKLSAgQllURV9PQ0FNTCA6PSB5Ci0KLSAgIyBFWFRSQURFUFMgaXMgYWRkZWQgZGVwZW5kZW5jaWVzIHdlIGhhdmUgdG8gaW5zZXJ0IGZvciBhbGwKLSAgIyBleGVjdXRhYmxlIGZpbGVzIHdlIGdlbmVyYXRlLiAgSWRlYWxseSBpdCBzaG91bGQgYmUgYWxsIG9mIHRoZQotICAjIGxpYnJhcmllcyB3ZSB1c2UsIGJ1dCBpdCdzIGhhcmQgdG8gZmluZCB0aGUgb25lcyB0aGF0IGdldCBzZWFyY2hlZCBvbgotICAjIHRoZSBwYXRoIHNpbmNlIEkgZG9uJ3Qga25vdyB0aGUgcGF0aHMgYnVpbHQgaW50byB0aGUgY29tcGlsZXIsIHNvCi0gICMganVzdCBpbmNsdWRlIHRoZSBvbmVzIHdpdGggc2xhc2hlcyBpbiB0aGVpciBuYW1lcy4KLSAgRVhUUkFERVBTIDo9ICQoYWRkc3VmZml4IC5jbWEsJChmb3JlYWNoIGksJChMSUJTKSwkKGlmICQoZmluZHN0cmluZyAvLCQoaSkpLCQoaSkpKSkKLSAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9ICQoT0NBTUxCQ0ZMQUdTKQotCi0gIFJFQUxfT0NBTUxDIDo9ICQoSU5URl9PQ0FNTEMpCi0KLSAgUkVBTF9JTVBMIDo9ICQoSU1QTF9DTU8pCi0gIFJFQUxfSU1QTF9JTlRGIDo9ICQoSU1QTE9fSU5URikKLSAgSU1QTF9TVUYgOj0gLmNtbwotCi0gIERFUEZMQUdTICA6PQotICBNQUtFX0RFUFMgOj0gJChNTERFUFMpICQoQkNERVBJUykKLQotICBpZmRlZiBDUkVBVEVfTElCCi0gICAgb3ZlcnJpZGUgQ0ZMQUdTIDo9ICQoUElDX0NGTEFHUykgJChDRkxBR1MpCi0gICAgb3ZlcnJpZGUgQ1BQRkxBR1MgOj0gJChQSUNfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpCi0gICAgaWZuZGVmIFNUQVRJQwotICAgICAgaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLQlNQUtFRExMIDo9ICQoRExMU09OQU1FKQotCUFMTF9MREZMQUdTIDo9IC1kbGxpYiAkKERMTFNPTkFNRSkKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLQotICBpZm5kZWYgTk9fQ1VTVE9NCi0gICAgaWZuZXEgIiQoc3RyaXAgJChPQkpfTElOSykgJChUSFJFQURTKSAkKE1BWUJFX0lETCkgJChDTElCUykgJChDRlJBTUVXT1JLUykpIiAiIgotICAgICAgQUxMX0xERkxBR1MgKz0gLWN1c3RvbQotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSAgQUxMX0xERkxBR1MgKz0gJChJTkNGTEFHUykgJChPQ0FNTExERkxBR1MpICQoT0NBTUxCTERGTEFHUykgXAotICAgICAgICAgICAgICAgICAkKENPTU1PTl9MREZMQUdTKSAkKExJQlM6JT0lLmNtYSkKLSAgQ0FNTElETERMTEZMQUdTIDo9Ci0KLSAgaWZkZWYgVEhSRUFEUwotICAgIGlmZGVmIFZNVEhSRUFEUwotICAgICAgVEhSRUFEX0ZMQUcgOj0gLXZtdGhyZWFkCi0gICAgZWxzZQotICAgICAgVEhSRUFEX0ZMQUcgOj0gLXRocmVhZAotICAgIGVuZGlmCi0gICAgQUxMX0xERkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTExfTERGTEFHUykKLSAgICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgICAgaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gICAgICAgIEFMTF9MREZMQUdTIDo9IHVuaXguY21hIHRocmVhZHMuY21hICQoQUxMX0xERkxBR1MpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSMgd2UgaGF2ZSB0byBtYWtlIG5hdGl2ZS1jb2RlCi1lbHNlCi0gIEVYVFJBREVQUyA6PSAkKGFkZHN1ZmZpeCAuY214YSwkKGZvcmVhY2ggaSwkKExJQlMpLCQoaWYgJChmaW5kc3RyaW5nIC8sJChpKSksJChpKSkpKQotICBpZm5kZWYgUFJPRklMSU5HCi0gICAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9ICQoT0NBTUxOQ0ZMQUdTKQotICAgIFBMREZMQUdTIDo9Ci0gIGVsc2UKLSAgICBTUEVDSUFMX09DQU1MRkxBR1MgOj0gLXAgJChPQ0FNTE5DRkxBR1MpCi0gICAgUExERkxBR1MgOj0gLXAKLSAgZW5kaWYKLQotICBSRUFMX0lNUEwgOj0gJChJTVBMX0NNWCkKLSAgUkVBTF9JTVBMX0lOVEYgOj0gJChJTVBMWF9JTlRGKQotICBJTVBMX1NVRiA6PSAuY214Ci0KLSAgb3ZlcnJpZGUgQ1BQRkxBR1MgOj0gLUROQVRJVkVfQ09ERSAkKENQUEZMQUdTKQotCi0gIERFUEZMQUdTICA6PSAtbmF0aXZlCi0gIE1BS0VfREVQUyA6PSAkKE1MREVQUykgJChOQ0RFUElTKQotCi0gIEFMTF9MREZMQUdTIDo9ICQoUExERkxBR1MpICQoSU5DRkxBR1MpICQoT0NBTUxMREZMQUdTKSBcCi0gICAgICAgICAgICAgICAgICQoT0NBTUxOTERGTEFHUykgJChDT01NT05fTERGTEFHUykKLSAgQ0FNTElETERMTEZMQUdTIDo9IC1vcHQKLQotICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgIEFMTF9MREZMQUdTICs9ICQoTElCUzolPSUuY214YSkKLSAgZWxzZQotICAgIG92ZXJyaWRlIENGTEFHUyA6PSAkKFBJQ19DRkxBR1MpICQoQ0ZMQUdTKQotICAgIG92ZXJyaWRlIENQUEZMQUdTIDo9ICQoUElDX0NQUEZMQUdTKSAkKENQUEZMQUdTKQotICBlbmRpZgotCi0gIGlmZGVmIFRIUkVBRFMKLSAgICBUSFJFQURfRkxBRyA6PSAtdGhyZWFkCi0gICAgQUxMX0xERkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTExfTERGTEFHUykKLSAgICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgICAgaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gICAgICAgIEFMTF9MREZMQUdTIDo9IHVuaXguY214YSB0aHJlYWRzLmNteGEgJChBTExfTERGTEFHUykKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBNQUtFX0RFUFMKLQotaWZkZWYgQU5OT1RBVEUKLSAgQU5OT1RfRkxBRyA6PSAtZHR5cGVzCi1lbHNlCi1lbmRpZgotCi1BTExfT0NBTUxDRkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSAkKE9DQU1MRkxBR1MpIFwKLSAgICAgICAgICAgICAgICAgICAkKElOQ0ZMQUdTKSAkKFNQRUNJQUxfT0NBTUxGTEFHUykKLQotaWZkZWYgbWFrZV9kZXBzCi0gIC1pbmNsdWRlICQoTUFLRV9ERVBTKQotICBQUkVfVEFSR0VUUyA6PQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFVTRVIgUlVMRVMKLQotIyBDYWxsICJPQ2FtbE1ha2VmaWxlIFFVSUVUPSIgdG8gZ2V0IHJpZCBvZiBhbGwgb2YgdGhlIEAncy4KLVFVSUVUPUAKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIChkZWZhdWx0KQotYnl0ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMKLWJjOglieXRlLWNvZGUKLQotYnl0ZS1jb2RlLW5vbGluazoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIG5vbGluayBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzCi1iY25sOglieXRlLWNvZGUtbm9saW5rCi0KLXRvcDoJCQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChUT1BSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUKLQotbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jOgluYXRpdmUtY29kZQotCi1uYXRpdmUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jbmw6CW5hdGl2ZS1jb2RlLW5vbGluawotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzCi1ieXRlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1iY2w6CWJ5dGUtY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIG5hdGl2ZS1jb2RlIGxpYnJhcmllcwotbmF0aXZlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5jbXhhIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJbWFrZV9kZXBzPXllcwotbmNsOgluYXRpdmUtY29kZS1saWJyYXJ5Ci0KLWlmZGVmIFdJTjMyCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgZGxsCi1ieXRlLWNvZGUtZGxsOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5kbGwgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLWJjZDoJYnl0ZS1jb2RlLWRsbAotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBkbGwKLW5hdGl2ZS1jb2RlLWRsbDoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5kbGwgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jZDoJbmF0aXZlLWNvZGUtZGxsCi1lbmRpZgotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLWRlYnVnLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChCQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGM6CWRlYnVnLWNvZGUKLQotZGVidWctY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGNubDoJZGVidWctY29kZS1ub2xpbmsKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIChuYXRpdmUgY29kZSkKLWRlYnVnLW5hdGl2ZS1jb2RlOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jOglkZWJ1Zy1uYXRpdmUtY29kZQotCi1kZWJ1Zy1uYXRpdmUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jbmw6CWRlYnVnLW5hdGl2ZS1jb2RlLW5vbGluawotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uCi1kZWJ1Zy1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kY2w6CWRlYnVnLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIChuYXRpdmUgY29kZSkKLWRlYnVnLW5hdGl2ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChOQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kbmNsOglkZWJ1Zy1uYXRpdmUtY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBmb3IgcHJvZmlsaW5nCi1wcm9maWxpbmctYnl0ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFBST0ZJTElORz0ieSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBiYzoJcHJvZmlsaW5nLWJ5dGUtY29kZQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZQotCi1wcm9maWxpbmctbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCVBST0ZJTElORz0ieSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBuYzoJcHJvZmlsaW5nLW5hdGl2ZS1jb2RlCi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBsaWJyYXJpZXMKLXByb2ZpbGluZy1ieXRlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgUFJPRklMSU5HPSJ5IiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBiY2w6CXByb2ZpbGluZy1ieXRlLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBsaWJyYXJpZXMKLXByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoTkNSRVNVTFQpLmNteGEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgUFJPRklMSU5HPSJ5IiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBuY2w6CXByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5Ci0KLSMgcGFja3MgYnl0ZS1jb2RlIG9iamVjdHMKLXBhY2stYnl0ZS1jb2RlOgkJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKEJDUkVTVUxUKS5jbW8gXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCVBBQ0tfTElCPXllcyBtYWtlX2RlcHM9eWVzCi1wYWJjOglwYWNrLWJ5dGUtY29kZQotCi0jIHBhY2tzIG5hdGl2ZS1jb2RlIG9iamVjdHMKLXBhY2stbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoTkNSRVNVTFQpLmNteCAkKE5DUkVTVUxUKS5vIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlQQUNLX0xJQj15ZXMgbWFrZV9kZXBzPXllcwotcGFuYzoJcGFjay1uYXRpdmUtY29kZQotCi0jIGdlbmVyYXRlcyBIVE1MLWRvY3VtZW50YXRpb24KLWh0ZG9jOgkkKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sL2luZGV4Lmh0bWwKLQotIyBnZW5lcmF0ZXMgTGF0ZXgtZG9jdW1lbnRhdGlvbgotbGFkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy50ZXgKLQotIyBnZW5lcmF0ZXMgUG9zdFNjcmlwdC1kb2N1bWVudGF0aW9uCi1wc2RvYzoJJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBzCi0KLSMgZ2VuZXJhdGVzIFBERi1kb2N1bWVudGF0aW9uCi1wZGZkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wZGYKLQotIyBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi1kb2M6IGh0ZG9jIGxhZG9jIHBzZG9jIHBkZmRvYwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTE9XIExFVkVMIFJVTEVTCi0KLSQoUkVBTF9SRVNVTFQpOgkJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIFwKLQkJCQkkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpICQoT0NBTUxfRklORF9MSU5LUEtHKSBcCi0JCQkJJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAJChFWEUpIFwKLQkJCQkkKFJFQUxfSU1QTCkKLQotbm9saW5rOgkJCSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspCi0KLWlmZGVmIFdJTjMyCi0kKFJFQUxfUkVTVUxUKS5kbGw6CSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspCi0JCQkkKENBTUxJRExETEwpICQoQ0FNTElETERMTEZMQUdTKSAkKE9CSl9MSU5LKSAkKENMSUJTKSBcCi0JCQkJLW8gJEAgJChSRUFMX0lNUEwpCi1lbmRpZgotCi0lJChUT1BTVUZGSVgpOgkJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MTUtUT1ApIFwKLQkJCQkkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpICQoT0NBTUxfRklORF9MSU5LUEtHKSBcCi0JCQkJJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAJChFWEUpIFwKLQkJCQkkKFJFQUxfSU1QTCkKLQotLlNVRkZJWEVTOgkJLm1saSAubWwgLmNtaSAuY21vIC5jbXggLmNtYSAuY214YSAuJChFWFRfT0JKKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAubWx5IC5kaSAuZCAuJChFWFRfTElCKSAuaWRsICUub3hyaWRsIC5jIC5tIC4kKEVYVF9DWFgpIC5oIC5zbyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAucmVwIC56b2cgLmdsYWRlCi0KLWlmbmRlZiBTVEFUSUMKLWlmZGVmIE1JTkdXCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJJChDQykgJChDRkxBR1MpICQoQ0ZMQUdTX1dJTjMyKSAkKE9CSl9MSU5LKSAtc2hhcmVkIC1vICRAIFwKLQkJCS1XbCwtLXdob2xlLWFyY2hpdmUgJCh3aWxkY2FyZCAkKGZvcmVhY2ggZGlyLCQoTElCRElSUyksJChDTElCUzolPSQoZGlyKS9saWIlLmEpKSkgXAotCQkJICQoT0NBTUxMSUJQQVRIKS9vY2FtbHJ1bi5hIFwKLQkJCS1XbCwtLWV4cG9ydC1hbGwtc3ltYm9scyBcCi0JCQktV2wsLS1uby13aG9sZS1hcmNoaXZlCi1lbHNlCi1pZmRlZiBNU1ZDCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJbGluayAvTk9MT0dPIC9ETEwgL09VVDokQCAkKE9CSl9MSU5LKSBcCi0JCQkgJCh3aWxkY2FyZCAkKGZvcmVhY2ggZGlyLCQoTElCRElSUyksJChDTElCUzolPSQoZGlyKS8lLmxpYikpKSBcCi0JCQkgJChPQ0FNTExJQlBBVEgpL29jYW1scnVuLmxpYgotCi1lbHNlCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJJChPQ0FNTE1LTElCKSAkKElOQ0ZMQUdTKSAkKENMSUJGTEFHUykgXAotCQkJCS1vICQoQ0xJQl9CQVNFKSAkKE9CSl9MSU5LKSAkKENMSUJTOiU9LWwlKSAkKENGUkFNRVdPUktTOiU9LWZyYW1ld29yayAlKSBcCi0JCQkJJChPQ0FNTE1LTElCX0ZMQUdTKQotZW5kaWYKLWVuZGlmCi1lbmRpZgotCi1pZm5kZWYgTElCX1BBQ0tfTkFNRQotJChSRVNVTFQpLmNtYToJCSQoUkVBTF9JTVBMX0lOVEYpICQoTUFLRURMTCkgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1hICQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCAkKFJFQUxfSU1QTCkKLQotJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQik6CSQoUkVBTF9JTVBMX0lOVEYpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MT1BUKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChSRUFMX0lNUEwpCi1lbHNlCi1pZmRlZiBCWVRFX09DQU1MCi0kKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNtbzogJChSRUFMX0lNUExfSU5URikKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1wYWNrIC1vICQoTElCX1BBQ0tfTkFNRSkuY21vICQoT0NBTUxMREZMQUdTKSAkKFJFQUxfSU1QTCkKLWVsc2UKLSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY214OiAkKFJFQUxfSU1QTF9JTlRGKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE9QVCkgLXBhY2sgLW8gJChMSUJfUEFDS19OQU1FKS5jbXggICQoT0NBTUxMREZMQUdTKSAkKFJFQUxfSU1QTCkKLWVuZGlmCi0KLSQoUkVTVUxUKS5jbWE6CQkkKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNtbyAkKE1BS0VETEwpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChMSUJfUEFDS19OQU1FKS5jbW8KLQotJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQik6CSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY214ICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MT1BUKSAtYSAkKGZpbHRlci1vdXQgLWN1c3RvbSwgJChBTExfTERGTEFHUykpICQoT0JKU19MSUJTKSAtbyAkQCAkKExJQl9QQUNLX05BTUUpLmNteAotZW5kaWYKLQotJChSRVNfQ0xJQik6IAkJJChPQkpfTElOSykKLWlmbmRlZiBNU1ZDCi0gIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0JCSAgICAgICQoQVIpIHJjcyAkQCAkKE9CSl9MSU5LKQotICBlbmRpZgotZWxzZQotICBpZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotCQkJbGliIC1ub2xvZ28gLWRlYnVndHlwZTpjdiAtb3V0OiQoUkVTX0NMSUIpICQoT0JKX0xJTkspCi0gIGVuZGlmCi1lbmRpZgotCi0ubWxpLmNtaTogJChFWFRSQURFUFMpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKElOVEZfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgXAotCQkJCSQoT0NBTUxGTEFHUykgJChJTkNGTEFHUykgJDw7IFwKLQkJCWVsc2UgXAotCQkJICAgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChJTlRGX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSBcCi0JCQkJJChPQ0FNTEZMQUdTKSAkKElOQ0ZMQUdTKSAkPDsgXAotCQkJICAgICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQlmaQotCi0ubWwuY21pIC5tbC4kKEVYVF9PQkopIC5tbC5jbXggLm1sLmNtbzogJChFWFRSQURFUFMpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgJChBTExfT0NBTUxDRkxBR1MpICQ8OyBcCi0JCQllbHNlIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwICIkJHBwICQoUFBGTEFHUykiICQoQUxMX09DQU1MQ0ZMQUdTKSAkPDsgXAotCQkJZmkKLQotaWZkZWYgUEFDS19MSUIKLSQoUkVBTF9SRVNVTFQpLmNtbyAkKFJFQUxfUkVTVUxUKS5jbXggJChSRUFMX1JFU1VMVCkubzogJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtcGFjayAkKEFMTF9MREZMQUdTKSBcCi0JCQkJJChPQkpTX0xJQlMpIC1vICRAICQoUkVBTF9JTVBMKQotZW5kaWYKLQotLlBSRUNJT1VTOgkJJS5tbAotJS5tbDoJCQklLm1sbAotCQkJJChPQ0FNTExFWCkgJChMRkxBR1MpICQ8Ci0KLS5QUkVDSU9VUzogICAgICAgICAgICAgICUubWwgJS5tbGkKLSUubWwgJS5tbGk6ICAgICAgICAgICAgICUubWx5Ci0JCQkkKE9DQU1MWUFDQykgJChZRkxBR1MpICQ8Ci0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJ3MvLiooXCpwcCBcKFteKl0qXCkgXCopLiovXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgISAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgIG12ICQqLm1sICQqLm1sLnRlbXBvcmFyeTsgXAotCQkJICBlY2hvICIoKnBwICQkcHAgJChQUEZMQUdTKSopIiA+ICQqLm1sOyBcCi0JCQkgIGNhdCAkKi5tbC50ZW1wb3JhcnkgPj4gJCoubWw7IFwKLQkJCSAgcm0gJCoubWwudGVtcG9yYXJ5OyBcCi0JCQkgIG12ICQqLm1saSAkKi5tbGkudGVtcG9yYXJ5OyBcCi0JCQkgIGVjaG8gIigqcHAgJCRwcCAkKFBQRkxBR1MpKikiID4gJCoubWxpOyBcCi0JCQkgIGNhdCAkKi5tbGkudGVtcG9yYXJ5ID4+ICQqLm1saTsgXAotCQkJICBybSAkKi5tbGkudGVtcG9yYXJ5OyBcCi0JCQlmaQotCi0KLS5QUkVDSU9VUzoJCSUubWwKLSUubWw6CQkJJS5yZXAKLQkJCSQoQ0FNRUxFT05fUkVQT1JUKSAkKENBTUVMRU9OX1JFUE9SVF9GTEFHUykgLWdlbiAkPAotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUuem9nCi0JCQkkKENBTUVMRU9OX1pPR0dZKSAgJChDQU1FTEVPTl9aT0dHWV9GTEFHUykgLWltcGwgJDwgPiAkQAotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUuZ2xhZGUKLQkJCSQoT0NBTUxfR0xBREVDQykgICQoT0NBTUxfR0xBREVDQ19GTEFHUykgJDwgPiAkQAotCi0uUFJFQ0lPVVM6CQklLm1sICUubWxpCi0lLm1sICUubWxpOgkJJS5veHJpZGwKLQkJCSQoT1hSSURMKSAkPAotCi0uUFJFQ0lPVVM6CQklLm1sICUubWxpICVfc3R1YnMuYyAlLmgKLSUubWwgJS5tbGkgJV9zdHVicy5jICUuaDoJCSUuaWRsCi0JCQkkKENBTUxJREwpICQoTUFZQkVfSURMX0hFQURFUikgJChJRExGTEFHUykgXAotCQkJCSQoQ0FNTElETEZMQUdTKSAkPAotCQkJJChRVUlFVClpZiBbICQoTk9JRExIRUFERVIpIF07IHRoZW4gdG91Y2ggJCouaDsgZmkKLQotLmMuJChFWFRfT0JKKToKLQkJCSQoT0NBTUxDKSAtYyAtY2MgIiQoQ0MpIiAtY2NvcHQgIiQoQ0ZMQUdTKSBcCi0JCQkJJChDUFBGTEFHUykgJChDUFBGTEFHU19XSU4zMikgXAotCQkJCSQoQ0ZMQUdTX1dJTjMyKSAkKENJTkNGTEFHUykgJChDRkxBR19PKSRAICIgJDwKLQotLm0uJChFWFRfT0JKKToKLQkJCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKENJTkNGTEFHUykgJChDUFBGTEFHUykgXAotCQkJCS1JJyQoT0NBTUxMSUJQQVRIKScgXAotCQkJCSQ8ICQoQ0ZMQUdfTykkQAotCi0uJChFWFRfQ1hYKS4kKEVYVF9PQkopOgotCQkJJChDWFgpIC1jICQoQ1hYRkxBR1MpICQoQ0lOQ0ZMQUdTKSAkKENQUEZMQUdTKSBcCi0JCQkJLUknJChPQ0FNTExJQlBBVEgpJyBcCi0JCQkJJDwgJChDRkxBR19PKSRACi0KLSQoTUxERVBESVIpLyUuZDoJJS5tbAotCQkJJChRVUlFVClpZiBbICEgLWQgJChARCkgXTsgdGhlbiBta2RpciAtcCAkKEBEKTsgZmkKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJJChESU5DRkxBR1MpICQ8ID4gJEA7IFwKLQkJCWVsc2UgXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJLXBwICIkJHBwICQoUFBGTEFHUykiICQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQlmaQotCi0kKEJDRElESVIpLyUuZGkgJChOQ0RJRElSKS8lLmRpOgklLm1saQotCQkJJChRVUlFVClpZiBbICEgLWQgJChARCkgXTsgdGhlbiBta2RpciAtcCAkKEBEKTsgZmkKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoREVQRkxBR1MpICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSAkKERJTkNGTEFHUykgJDwgPiAkQDsgXAotCQkJZWxzZSBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChERVBGTEFHUykgXAotCQkJICAgIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSBcCi0JCQkgICAgLXBwICIkJHBwICQoUFBGTEFHUykiICQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQlmaQotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sOgotCW1rZGlyIC1wICRACi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2h0bWwvaW5kZXguaHRtbDogJChET0NfRElSKS8kKFJFU1VMVCkvaHRtbCAkKERPQ19GSUxFUykKLQlybSAtcmYgJDwvKgotCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkKEZJUlNUX0RPQ19GSUxFKWA7IFwKLQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCWVsc2UgXAotCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiIC1odG1sIC1kICQ8ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgIiQkcHAgJChQUEZMQUdTKSIgLWh0bWwgLWQgJDwgJChPQ0FNTERPQ0ZMQUdTKSBcCi0JICAJJChJTkNGTEFHUykgJChET0NfRklMRVMpOyBcCi0JZmkKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXg6Ci0JbWtkaXIgLXAgJEAKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnRleDogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXggJChET0NfRklMRVMpCi0Jcm0gLXJmICQ8LyoKLQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJChGSVJTVF9ET0NfRklMRSlgOyBcCi0JaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgJChJTkNGTEFHUykgXAotCSAgCSQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtbGF0ZXggJChPQ0FNTERPQ0ZMQUdTKSAkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUykgXAotCSAgCS1vICRAOyBcCi0JZWxzZSBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgIiQkcHAgJChQUEZMQUdTKSIgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCWZpCi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wczogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnRleAotCWNkICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4ICYmIFwKLQkgICQoTEFURVgpIGRvYy50ZXggJiYgXAotCSAgJChMQVRFWCkgZG9jLnRleCAmJiBcCi0JICAkKERWSVBTKSAkKERWSVBTRkxBR1MpIGRvYy5kdmkgLW8gJChARikKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBkZjogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBzCi0JY2QgJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXggJiYgJChQUzJQREYpICQoPEYpCi0KLWRlZmluZSBtYWtlX3N1YnByb2oKLS5QSE9OWToKLXN1YnByb2pfJCgxKToKLQkkJChldmFsICQkKGNhbGwgUFJPSl8kKDEpKSkKLQkkKFFVSUVUKWlmIFsgIiQoU1VCVEFSR0VUKSIgIT0gImFsbCIgXTsgdGhlbiBcCi0JICAkKE1BS0UpIC1mICQoT0NBTUxNQUtFRklMRSkgJChTVUJUQVJHRVQpOyBcCi0JZmkKLWVuZGVmCi0KLSQoZm9yZWFjaCBzdWJwcm9qLCQoU1VCUFJPSlMpLCQoZXZhbCAkKGNhbGwgbWFrZV9zdWJwcm9qLCQoc3VicHJvaikpKSkKLQotLlBIT05ZOgotc3VicHJvanM6ICQoU1VCUFJPSlM6JT1zdWJwcm9qXyUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAoVU4pSU5TVEFMTCBSVUxFUyBGT1IgTElCUkFSSUVTCi0KLS5QSE9OWTogbGliaW5zdGFsbAotbGliaW5zdGFsbDoJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSAkKExJQklOU1RBTExfRklMRVMpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGliaW5zdGFsbC1ieXRlLWNvZGUKLWxpYmluc3RhbGwtYnl0ZS1jb2RlOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIGJ5dGUtY29kZSBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSBcCi0JICAkKGZpbHRlci1vdXQgJChSRVNVTFQpLiQoRVhUX0xJQikgJChSRVNVTFQpLmNteGEsICQoTElCSU5TVEFMTF9GSUxFUykpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGliaW5zdGFsbC1uYXRpdmUtY29kZQotbGliaW5zdGFsbC1uYXRpdmUtY29kZToJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBuYXRpdmUtY29kZSBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSBcCi0JICAkKGZpbHRlci1vdXQgJChETExTT05BTUUpICQoUkVTVUxUKS5jbWEsICQoTElCSU5TVEFMTF9GSUxFUykpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGlidW5pbnN0YWxsCi1saWJ1bmluc3RhbGw6Ci0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsaW5nIGxpYnJhcnkgd2l0aCBvY2FtbGZpbmRcbiIKLQkkKE9DQU1MRklORCkgcmVtb3ZlICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpCi0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bC5cbiIKLQotLlBIT05ZOiByYXdpbnN0YWxsCi1yYXdpbnN0YWxsOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIGxpYnJhcnkgdG86ICQoT0NBTUxfTElCX0lOU1RBTEwpXG4iCi0JLWluc3RhbGwgLWQgJChPQ0FNTF9MSUJfSU5TVEFMTCkKLQlmb3IgaSBpbiAkKExJQklOU1RBTExfRklMRVMpOyBkbyBcCi0JICBpZiBbIC1mICQkaSBdOyB0aGVuIFwKLQkgICAgaW5zdGFsbCAtYyAtbSAwNjQ0ICQkaSAkKE9DQU1MX0xJQl9JTlNUQUxMKTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogcmF3dW5pbnN0YWxsCi1yYXd1bmluc3RhbGw6Ci0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsaW5nIGxpYnJhcnkgZnJvbTogJChPQ0FNTF9MSUJfSU5TVEFMTClcbiIKLQljZCAkKE9DQU1MX0xJQl9JTlNUQUxMKSAmJiBybSAkKG5vdGRpciAkKExJQklOU1RBTExfRklMRVMpKQotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBNQUlOVEVOQU5DRSBSVUxFUwotCi0uUEhPTlk6CWNsZWFuCi1jbGVhbjo6Ci0Jcm0gLWYgJChUQVJHRVRTKSAkKFRSQVNIKQotCXJtIC1yZiAkKEJDRElESVIpICQoTkNESURJUikgJChNTERFUERJUikKLQotLlBIT05ZOgljbGVhbnVwCi1jbGVhbnVwOjoKLQlybSAtZiAkKE5PTkVYRUNTKSAkKFRSQVNIKQotCXJtIC1yZiAkKEJDRElESVIpICQoTkNESURJUikgJChNTERFUERJUikKLQotLlBIT05ZOiBjbGVhbi1kb2MKLWNsZWFuLWRvYzo6Ci0Jcm0gLXJmICQoRE9DX0RJUikvJChSRVNVTFQpCi0KLS5QSE9OWTogY2xlYW4tYWxsCi1jbGVhbi1hbGw6OiBjbGVhbiBjbGVhbi1kb2MKLQotLlBIT05ZOiBub2JhY2t1cAotbm9iYWNrdXA6Ci0Jcm0gLWYgKi5iYWsgKn4gKi5kdXAKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZSBiL2xpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5N2M2NC4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NDMgKzAsMCBAQAotTk9URSAoYnJ5YW5kdXhidXJ5KTogT0NhbWxNYWtlZmlsZSBpcyBzYWZlIHRvIGluY2x1ZGUgaW4gdGhlIHByb2plY3QgYWZ0ZXIKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTEVHQUwtNTguCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb24gb2YgIm9jYW1sX21ha2UiCi0gICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDYgIE1hcmt1cyBNb3R0bCAtIGZyZWUgdG8gY29weSBhbmQgbW9kaWZ5IQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFIEFUIFlPVVIgT1dOIFJJU0shCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFUkVRVUlTSVRFUwotCi0gICAgICAgICAgICAgKioqIFlPVSBXSUxMIE5FRUQgR05VLU1BS0UgVkVSU0lPTiA+My44MCAqKioKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgQ29udGVudHMgb2YgdGhpcyBkaXN0cmlidXRpb24KLQotQ2hhbmdlcyAgICAgICAgLSBndWVzcyB3aGF0PyA7LSkKLQotT0NhbWxNYWtlZmlsZSAgLSBNYWtlZmlsZSBmb3IgZWFzeSBoYW5kbGluZyBvZiBjb21waWxhdGlvbiBvZiBub3Qgc28gZWFzeQotICAgICAgICAgICAgICAgICBPQ2FtbC1wcm9qZWN0cy4gIEl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMgb2YgT0NhbWwtZmlsZXMKLSAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSwgaXMgYWJsZSB0byBoYW5kbGUgIm9jYW1sbGV4Ii0sCi0gICAgICAgICAgICAgICAgICJvY2FtbHlhY2MiLSwgSURMLSBhbmQgQy1maWxlcywga25vd3MgaG93IHRvIHJ1bgotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzb3JzIGFuZCBnZW5lcmF0ZXMgbmF0aXZlLSBvciBieXRlLWNvZGUsIGFzCi0gICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgb3IgYXMgbGlicmFyeSAtIHdpdGggdGhyZWFkLXN1cHBvcnQgaWYgeW91Ci0gICAgICAgICAgICAgICAgIHdhbnQhIFByb2ZpbGluZyBhbmQgZGVidWdnaW5nIHN1cHBvcnQgY2FuIGJlIGFkZGVkIG9uCi0gICAgICAgICAgICAgICAgIHRoZSBmbHkhICBUaGVyZSBpcyBhbHNvIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgbGlicmFyaWVzLgotICAgICAgICAgICAgICAgICBBaCwgeWVzLCBhbmQgeW91IGNhbiBhbHNvIGNyZWF0ZSB0b3BsZXZlbHMgZnJvbSBhbnkKLSAgICAgICAgICAgICAgICAgc291cmNlczogdGhpcyBhbGxvd3MgeW91IGltbWVkaWF0ZSBpbnRlcmFjdGl2ZSB0ZXN0aW5nLgotICAgICAgICAgICAgICAgICBBdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBkb2N1bWVudGF0aW9uIGlzIGVhc3kgZHVlIHRvCi0gICAgICAgICAgICAgICAgIGludGVncmF0aW9uIG9mIHN1cHBvcnQgZm9yIE9DYW1sZG9jLgotCi1SRUFETUUgICAgICAgICAtIHRoaXMgZmlsZQotCi1jYWxjLyAgICAgICAgICAtIERpcmVjdG9yeSBjb250YWluaW5nIGEgcXVpdGUgZnVsbHktZmVhdHVyZWQgZXhhbXBsZQotICAgICAgICAgICAgICAgICBvZiB3aGF0ICJPQ2FtbE1ha2VmaWxlIiBjYW4gZG8gZm9yIHlvdS4gVGhpcyBleGFtcGxlCi0gICAgICAgICAgICAgICAgIG1ha2VzIHVzZSBvZiAib2NhbWxsZXgiLCAib2NhbWx5YWNjIiwgSURMICsgQyBhbmQKLSAgICAgICAgICAgICAgICAgdGhyZWFkcy4KLQotY2FtbHA0LyAgICAgICAgLSBUaGlzIHNpbXBsZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzIGZpbGVzIHdpdGggdGhlIGNhbWxwNC1wcmVwcm9jZXNzb3IuCi0KLWd0ay8gICAgICAgICAgIC0gRGVtb25zdHJhdGlvbiBvZiBob3cgdG8gdXNlIE9DYW1sTWFrZWZpbGUgd2l0aCBHVEsKLSAgICAgICAgICAgICAgICAgYW5kIHRocmVhZHMuIENvdXJ0ZXN5IG9mIFRpbSBGcmVlbWFuIDx0aW1AZnVuZ2libGUuY29tPi4KLQotaWRsLyAgICAgICAgICAgLSBDb250YWlucyBhIHZlcnkgc21hbGwgZXhhbXBsZSBvZiBob3cgdG8gdXNlCi0gICAgICAgICAgICAgICAgICJjYW1saWRsIiB0b2dldGhlciB3aXRoICJPQ2FtbE1ha2VmaWxlIi4gQWxzbyBpbnRlbmRlZAotICAgICAgICAgICAgICAgICB0byBzaG93LCBob3cgZWFzeSBpdCBpcyB0byBpbnRlcmZhY2UgT0NhbWwgYW5kIEMuCi0KLXRocmVhZHMvICAgICAgIC0gVHdvIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhyZWFkcyAob3JpZ2luYWxseQotICAgICAgICAgICAgICAgICBwb3N0ZWQgYnkgWGF2aWVyIExlcm95IHNvbWUgdGltZSBhZ28pLiBTaG93cyB0aGUgdXNlIG9mCi0gICAgICAgICAgICAgICAgICJPQ2FtbE1ha2VmaWxlIiBpbiBhbiBlbnZpcm9ubWVudCBvZiBtdWx0aXBsZSBjb21waWxhdGlvbgotICAgICAgICAgICAgICAgICB0YXJnZXRzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgIFdoeSBzaG91bGQgeW91IHVzZSBpdD8KLQotRm9yIHNldmVyYWwgcmVhc29uczoKLQotICAqIEl0IGlzIHdlbGwtdGVzdGVkIChJIHVzZSBpdCBpbiBhbGwgb2YgbXkgcHJvamVjdHMpLgotCi0gICogSW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBhcHByb2FjaGVzIGl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMKLSAgICBjb3JyZWN0bHkgYnkgZW5zdXJpbmcgdGhhdCBhbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgT0NhbWwtZmlsZXMKLSAgICBleGlzdCBiZWZvcmUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbi4gIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvCi0gICAgZ3VhcmFudGVlIHRoYXQgIm9jYW1sZGVwIiB3b3JrcyBjb3JyZWN0bHkuCi0KLSAgKiBJdCBpcyBleHRyZW1lbHkgY29udmVuaWVudCAoYXQgbGVhc3QgSSB0aGluayBzbyA7LSkuCi0gICAgRXZlbiBxdWl0ZSBjb21wbGV4IGNvbXBpbGF0aW9uIHByb2Nlc3NlcyAoc2VlIGV4YW1wbGUgImNhbGMubWwiKQotICAgIG5lZWQgdmVyeSBsaXR0bGUgaW5mb3JtYXRpb24gdG8gd29yayBjb3JyZWN0bHkgLSBhY3R1YWxseSBqdXN0IGFib3V0Ci0gICAgdGhlIG1pbmltdW0gKGZpbGUgbmFtZXMgb2Ygc291cmNlcykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICBXaGVuIHlvdSBzaG91bGRuJ3QgdXNlIGl0Li4uCi0KLUluIHByb2plY3RzIHdoZXJlIGV2ZXJ5IGNvbXBpbGF0aW9uIHVuaXQgbmVlZHMgZGlmZmVyZW50IGZsYWdzIC0gYnV0Ci1pbiBzdWNoIGNvbXBsaWNhdGVkIGNhc2VzIHlvdSB3aWxsIGJlIG9uIHlvdXIgb3duIGFueXdheS4gTHVja2lseSwKLXRoaXMgZG9lc24ndCBoYXBwZW4gdG9vIGZyZXF1ZW50bHkuLi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICBIb3cgdG8gdXNlICJPQ2FtbE1ha2VmaWxlIiBpbiB5b3VyIG93biBwcm9qZWN0Ci0gICAgICAgICAoVGFrZSBhIGxvb2sgYXQgdGhlIGV4YW1wbGVzIGZvciBhIHF1aWNrIGludHJvZHVjdGlvbiEpCi0KLUNyZWF0ZSB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIiBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgotCi1Ob3cgdGhlcmUgYXJlIHR3byB3YXlzIG9mIG1ha2luZyB1c2Ugb2YgIk9DYW1sTWFrZWZpbGUiOgotCi0gIDEpIEhhdmUgYSBsb29rIGF0IHRoZSBkZWZhdWx0IHNldHRpbmdzIGluICJPQ2FtbE1ha2VmaWxlIiBhbmQgc2V0Ci0gICAgIHRoZW0gdG8gdGhlIHZhbHVlcyB0aGF0IGFyZSB2YWlsZCBvbiB5b3VyIHN5c3RlbSAtIHdoZXRoZXIgdGhlCi0gICAgIHBhdGggdG8gdGhlIHN0YW5kYXJkIGxpYnJhcmllcyBpcyBvaywgd2hhdCBleGVjdXRhYmxlcyBzaGFsbCBiZQotICAgICB1c2VkLCBldGMuLi4KLQotICAyKSBDb3B5IGl0IGludG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCB0byBiZSBjb21waWxlZC4KLSAgICAgQWRkICItaW5jbHVkZSBPQ2FtbE1ha2VmaWxlIiBhcyBhIGxhc3QgbGluZSBvZiB5b3VyICJNYWtlZmlsZSIuCi0KLSAgMykgUHV0IGl0IHNvbWV3aGVyZSBlbHNlIG9uIHRoZSBzeXN0ZW0uIEluIHRoaXMgY2FzZSB5b3Ugd2lsbCBoYXZlIHRvCi0gICAgIHNldCBhIHZhcmlhYmxlICJPQ0FNTE1BS0VGSUxFIiBpbiB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIi4KLSAgICAgVGhpcyBpcyB0aGUgd2F5IGluIHdoaWNoIHRoZSBleGFtcGxlcyBhcmUgd3JpdHRlbjogc28geW91IG5lZWQKLSAgICAgb25seSBvbmUgdmVyc2lvbiBvZiAiT0NhbWxNYWtlZmlsZSIgdG8gbWFuYWdlIGFsbCB5b3VyIHByb2plY3RzIQotICAgICBTZWUgdGhlIGV4YW1wbGVzIGZvciBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIHVzdWFsbHkgc3BlY2lmeSB0d28gZnVydGhlciB2YXJpYWJsZXMgZm9yIHlvdXIgcHJvamVjdDoKLQotICAqIFNPVVJDRVMgIChkZWZhdWx0OiBmb28ubWwpCi0gICogUkVTVUxUICAgKGRlZmF1bHQ6IGZvbykKLQotUHV0IGFsbCB0aGUgc291cmNlcyBuZWNlc3NhcnkgZm9yIGEgdGFyZ2V0IGludG8gdmFyaWFibGUgIlNPVVJDRVMiLgotVGhlbiBzZXQgIlJFU1VMVCIgdG8gdGhlIG5hbWUgb2YgdGhlIHRhcmdldC4gSWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUKLWxpYnJhcmllcywgeW91IHNob3VsZCAqbm90KiBzcGVjaWZ5IHRoZSBzdWZmaXggKCIuY21hIiwgIi5jbXhhIiwgIi5hIikKLS0gaXQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIHlvdSBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gYnVpbGQKLWEgbGlicmFyeS4KLQotICAgICAgKiogICAgICBEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSAiLm1saSItZmlsZXMsIHRvbyEgICAgICAgICoqCi0gICAgICAqKiAgRG9uJ3QgZm9yZ2V0IHRoYXQgb3JkZXIgb2YgdGhlIHNvdXJjZSBmaWxlcyBtYXR0ZXJzISAgKioKLQotVGhlIG9yZGVyIGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdCBtYXR0ZXJzIGR1cmluZyBsaW5raW5nIGFueXdheQotZHVlIHRvIHBvdGVudGlhbCBzaWRlIGVmZmVjdHMgY2F1c2VkIGF0IHByb2dyYW0gc3RhcnR1cC4gVGhpcyBpcwotd2h5IE9DYW1sTWFrZWZpbGUgZG9lcyBub3QgYXR0ZW1wdCB0byBwYXJ0aWFsbHkgb3JkZXIgZGVwZW5kZW5jaWVzIGJ5Ci1pdHNlbGYsIHdoaWNoIG1pZ2h0IGNvbmZ1c2UgdXNlcnMgZXZlbiBtb3JlLiBJdCBqdXN0IGNvbXBpbGVzIGFuZCBsaW5rcwotT0NhbWwtc291cmNlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCBldmVuIGlmIGl0IGNvdWxkCi1kZXRlcm1pbmUgYXV0b21hdGljYWxseSB0aGF0IHRoZSBvcmRlciBjYW5ub3QgYmUgY29ycmVjdC4KLQotVGhlIG1pbmltdW0gb2YgeW91ciAiTWFrZWZpbGUiIGxvb2tzIGxpa2UgdGhpcyAoYXNzdW1pbmcgdGhhdAotIk9DYW1sTWFrZWZpbGUiIGlzIGluIHRoZSBzZWFyY2ggcGF0aCBvZiAibWFrZSIpOgotCi0gIC1pbmNsdWRlIE9DYW1sTWFrZWZpbGUKLQotVGhpcyB3aWxsIGFzc3VtZSB0aGF0IHlvdSB3YW50IHRvIGNvbXBpbGUgYSBmaWxlICJmb28ubWwiIHRvIGEgYmluYXJ5Ci0iZm9vIi4KLQotT3RoZXJ3aXNlLCB5b3VyIE1ha2VmaWxlIHdpbGwgcHJvYmFibHkgY29udGFpbiBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICAtaW5jbHVkZSBPQ2FtbE1ha2VmaWxlCi0KLUJlIGNhcmVmdWwgd2l0aCB0aGUgbmFtZXMgeW91IHB1dCBpbnRvIHRoZXNlIHZhcmlhYmxlczogaWYgdGhleSBhcmUgd3JvbmcsCi1hICJtYWtlIGNsZWFuIiBtaWdodCBlcmFzZSB0aGUgd3JvbmcgZmlsZXMgLSBidXQgSSBrbm93IHlvdSB3aWxsIG5vdCBkbwotdGhhdCA7LSkKLQotQSBzaW1wbGUgIm1ha2UiIHdpbGwgZ2VuZXJhdGUgYSBieXRlLWNvZGUgZXhlY3V0YWJsZS4gSWYgeW91IHdhbnQgdG8KLWNoYW5nZSB0aGlzLCB5b3UgbWF5IGFkZCBhbiAiYWxsIi1ydWxlIHRoYXQgZ2VuZXJhdGVzIHNvbWV0aGluZyBlbHNlLgotCi1FLmcuOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICBhbGw6IG5hdGl2ZS1jb2RlLWxpYnJhcnkKLSAgLWluY2x1ZGUgT0NhbWxNYWtlZmlsZQotCi1UaGlzIHdpbGwgYnVpbGQgYSBuYXRpdmUtY29kZSBsaWJyYXJ5ICJmb28uY214YSIgKCsgImZvby5hIikgZnJvbSBmaWxlCi0iZm9vLm1sIi4KLQotWW91IG1heSBldmVuIGJ1aWxkIHNldmVyYWwgdGFyZ2V0cyBhdCBvbmNlLiBUbyBwcm9kdWNlIGJ5dGUtIGFuZCBuYXRpdmUtY29kZQotZXhlY3V0YWJsZXMgd2l0aCBvbmUgIm1ha2UiLCBhZGQgdGhlIGZvbGxvd2luZyBydWxlOgotCi0gICAgYWxsOiBieXRlLWNvZGUgbmF0aXZlLWNvZGUKLQotWW91IHdpbGwgcHJvYmFibHkgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgc3VmZml4IGZvciBlYWNoIG9mIHRoZXNlIHRhcmdldHMKLXNvIHRoYXQgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiAoc2VlIG9wdGlvbmFsIHZhcmlhYmxlcyBiZWxvdwotZm9yIGRldGFpbHMpLgotCi1Zb3UgbWF5IGFsc28gdGVsbCAibWFrZSIgYXQgdGhlIGNvbW1hbmQtbGluZSB3aGF0IGtpbmQgb2YgdGFyZ2V0IHRvCi1wcm9kdWNlIChlLmcuICJtYWtlIG5jIikuICBIZXJlIGFsbCB0aGUgcG9zc2liaWxpdGllcyB3aXRoIHNob3J0Y3V0cwotYmV0d2VlbiBwYXJlbnRoZXNpczoKLQotICAgKiBieXRlLWNvZGUgICAgICAgICAgICAgICAgICAgICAoYmMpCi0gICAqIGJ5dGUtY29kZS1ub2xpbmsgICAgICAgICAgICAgIChiY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBieXRlLWNvZGUtbGlicmFyeSAgICAgICAgICAgICAoYmNsKQotICAgKiBuYXRpdmUtY29kZSAgICAgICAgICAgICAgICAgICAobmMpCi0gICAqIG5hdGl2ZS1jb2RlLW5vbGluayAgICAgICAgICAgIChuY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBuYXRpdmUtY29kZS1saWJyYXJ5ICAgICAgICAgICAobmNsKQotICAgKiBkZWJ1Zy1jb2RlICAgICAgICAgICAgICAgICAgICAoZGMpCi0gICAqIGRlYnVnLWNvZGUtbm9saW5rICAgICAgICAgICAgIChkY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBkZWJ1Zy1jb2RlLWxpYnJhcnkgICAgICAgICAgICAoZGNsKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlICAgICAgICAgICAocGJjKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlLWxpYnJhcnkgICAocGJjbCkKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlICAgICAgICAgKHBuYykKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlLWxpYnJhcnkgKHBuY2wpCi0gICAqIGJ5dGUtY29kZS1kbGwgICAgICAgICAgICAgICAgIChiY2QpCi0gICAqIG5hdGl2ZS1jb2RlLWRsbCAgICAgICAgICAgICAgIChuY2QpCi0gICAqIHBhY2stYnl0ZS1jb2RlICAgICAgICAgICAgICAgIChwYWJjKQotICAgKiBwYWNrLW5hdGl2ZS1jb2RlICAgICAgICAgICAgICAocGFuYykKLSAgICogdG9wbGV2ZWwgaW50ZXJwcmV0ZXIgICAgICAgICAgKHRvcCkKLSAgICogc3VicHJvanMKLQotSGVyZSBhIHNob3J0IG5vdGUgY29uY2VybmluZyBidWlsZGluZyBhbmQgbGlua2luZyBieXRlIGNvZGUgbGlicmFyaWVzCi13aXRoIEMtZmlsZXM6Ci0KLSAgT0NhbWwgbGlua3MgQy1vYmplY3QgZmlsZXMgb25seSB3aGVuIHRoZXkgYXJlIHVzZWQgaW4gYW4gZXhlY3V0YWJsZS4KLSAgQWZ0ZXIgY29tcGlsYXRpb24gdGhleSBzaG91bGQgYmUgcGxhY2VkIGluIHNvbWUgZGlyZWN0b3J5IHRoYXQgaXMgaW4KLSAgeW91ciBpbmNsdWRlIHBhdGggaWYgeW91IGxpbmsgeW91ciBsaWJyYXJ5IGFnYWluc3QgYW4gZXhlY3V0YWJsZS4KLQotICBJdCBpcyBzb21ldGltZXMgbW9yZSBjb252ZW5pZW50IHRvIGxpbmsgYWxsIEMtb2JqZWN0IGZpbGVzIGludG8gYQotICBzaW5nbGUgQy1saWJyYXJ5LiBUaGVuIHlvdSBoYXZlIHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgbGluayBmbGFncwotICBvZiB5b3VyIGxpYnJhcnkgdXNpbmcgIi1ub2F1dG9saW5rIiBhbmQgYWRkIGFub3RoZXIgbGlua2ZsYWcgdGhhdAotICBsaW5rcyBpbiB5b3VyIEMtbGlicmFyeSBleHBsaWNpdGx5LgotCi1XaGF0IGNvbmNlcm5zIG1haW50YWluYW5jZToKLQotICAibWFrZSBjbGVhbiIgcmVtb3ZlcyBhbGwgKGFsbCEpIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzIC0gc28KLSAgYWdhaW46IG1ha2Ugc3VyZSB5b3VyIHZhcmlhYmxlcyBhcmUgb2shCi0KLSAgIm1ha2UgY2xlYW51cCIgaXMgc2ltaWxhciB0byAibWFrZSBjbGVhbiIgYnV0IGxlYXZlcyBleGVjdXRhYmxlcy4KLQotQW5vdGhlciB3YXkgdG8gZGVzdHJveSBzb21lIGltcG9ydGFudCBmaWxlcyBpcyBieSBoYXZpbmcgIk9DYW1sTWFrZWZpbGUiCi1hdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZS4gUmVhZCB0aGUgZG9jdW1lbnRhdGlvbgotYWJvdXQgdGhlIHRvb2xzIGluIHRoZSBPQ2FtbC1kaXN0cmlidXRpb24gdG8gc2VlIHdoYXQga2luZCBvZiBmaWxlcyBhcmUKLWdlbmVyYXRlZC4gIk9DYW1sTWFrZWZpbGUiIGFkZGl0aW9uYWxseSBnZW5lcmF0ZXMgKCclJyBpcyBiYXNlbmFtZSBvZgotc291cmNlIGZpbGUpOgotCi0gICVfaWRsLmMgIC0gImNhbWxpZGwiIGdlbmVyYXRlcyBhIGZpbGUgIiUuYyIgZnJvbSAiJS5pZGwiLCBidXQgdGhpcyBpcwotICAgICAgICAgICAgIG5vdCBzdWNoIGEgZ29vZCBpZGVhLCBiZWNhdXNlIHdoZW4gZ2VuZXJhdGluZyBuYXRpdmUtY29kZSwKLSAgICAgICAgICAgICBib3RoIHRoZSBmaWxlICIlLmMiIGFuZCAiJS5tbCIgd291bGQgZ2VuZXJhdGUgZmlsZXMgIiUubyIKLSAgICAgICAgICAgICB3aGljaCB3b3VsZCBvdmVyd3JpdGUgZWFjaCBvdGhlci4gVGh1cywgIk9DYW1sTWFrZWZpbGUiCi0gICAgICAgICAgICAgcmVuYW1lcyAiJS5jIiB0byAiJV9pZGwuYyIgdG8gd29yayBhcm91bmQgdGhpcyBwcm9ibGVtLgotCi1UaGUgZGVwZW5kZW5jaWVzIGFyZSBzdG9yZWQgaW4gdGhyZWUgZGlmZmVyZW50IHN1YmRpcmVjdG9yaWVzIChkb3QgZGlycyk6Ci0KLSAgLl9kICAgIC0gY29udGFpbnMgZGVwZW5kZW5jaWVzIGZvciAubWwtZmlsZXMKLSAgLl9iY2RpIC0gY29udGFpbnMgYnl0ZSBjb2RlIGRlcGVuZGVuY2llcyBmb3IgLm1saS1maWxlcwotICAuX25jZGkgLSBjb250YWlucyBuYXRpdmUgY29kZSBkZXBlbmRlbmNpZXMgZm9yIC5tbGktZmlsZXMKLQotVGhlIGVuZGluZ3Mgb2YgdGhlIGRlcGVuZGVuY3kgZmlsZXMgYXJlOiAiJS5kIiBmb3IgdGhvc2UgZ2VuZXJhdGVkIGZyb20KLSIlLm1sIi1maWxlcywgIiUuZGkiIGZvciBvbmVzIGRlcml2ZWQgZnJvbSAiJS5tbGkiLWZpbGVzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdnaW5nCi0KLSAgVGhpcyBpcyBlYXN5OiBpZiB5b3UgZGlzY292ZXIgYSBidWcsIGp1c3QgZG8gYSAibWFrZSBjbGVhbjsgbWFrZSBkYyIKLSAgdG8gcmVjb21waWxlIHlvdXIgcHJvamVjdCB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhlbiB5b3UgY2FuCi0gIGltbWVkaWF0ZWx5IGFwcGx5ICJvY2FtbGRlYnVnIiB0byB0aGUgZXhlY3V0YWJsZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGluZwotCi0gIEZvciBnZW5lcmF0aW5nIGNvZGUgdGhhdCBjYW4gYmUgcHJvZmlsZWQgd2l0aCAib2NhbWxwcm9mIiAoYnl0ZSBjb2RlKQotICBvciAiZ3Byb2YiIChuYXRpdmUgY29kZSksIGNvbXBpbGUgeW91ciBwcm9qZWN0IHdpdGggb25lIG9mIHRoZSBwcm9maWxpbmcKLSAgdGFyZ2V0cyAoc2VlIHRhcmdldHMgYWJvdmUpLiBFLmcuOgotCi0gICAgKiAibWFrZSBwYmMiIHdpbGwgYnVpbGQgYnl0ZSBjb2RlIHRoYXQgY2FuIGJlIHByb2ZpbGVkIHdpdGgKLSAgICAgICJvY2FtbHByb2YiLgotCi0gICAgKiAibWFrZSBwbmMiIHdpbGwgYnVpbGQgbmF0aXZlIGNvZGUgdGhhdCBjYW4gYmUgcHJvZmlsZWQgd2l0aAotICAgICAgImdwcm9mIi4KLQotICBQbGVhc2Ugbm90ZSB0aGF0IGl0IGlzIG5vdCBjdXJyZW50bHkgcG9zc2libGUgdG8gcHJvZmlsZSBieXRlIGNvZGUgd2l0aAotICB0aHJlYWRzLiBPQ2FtbE1ha2VmaWxlIHdpbGwgZm9yY2UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBkbyB0aGlzLgotCi0gIEEgc2hvcnQgaGludCBmb3IgREVDIEFscGhhLXVzZXJzICh1bmRlciBEaWdpdGFsIFVuaXgpOiB5b3UgbWF5IGFsc28KLSAgY29tcGlsZSB5b3VyIHNvdXJjZXMgdG8gbmF0aXZlIGNvZGUgd2l0aG91dCBhbnkgZnVydGhlciBwcm9maWxpbmcKLSAgb3B0aW9ucy90YXJnZXRzLiBUaGVuIGNhbGwgInBpeGllIG15X2V4ZWMiLCAibXlfZXhlYyIgYmVpbmcgeW91cgotICBleGVjdXRhYmxlLiBUaGlzIHdpbGwgcHJvZHVjZSAoYW1vbmcgb3RoZXIgZmlsZXMpIGFuIGV4ZWN1dGFibGUKLSAgIm15X2V4ZWMucGl4aWUiLiBDYWxsIGl0IGFuZCBpdCB3aWxsIHByb2R1Y2UgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHdoaWNoCi0gIGNhbiBiZSBhbmFseXNlZCB1c2luZyAicHJvZiAtcGl4aWUgbXlfZXhlYyIuIFRoZSByZXN1bHRpbmcgaW5mb3JtYXRpb24KLSAgaXMgZXh0cmVtZWx5IGRldGFpbGVkIGFuZCBhbGxvd3MgYW5hbHlzaXMgdXAgdG8gdGhlIGNsb2NrIGN5Y2xlIGxldmVsLi4uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIFByZXByb2Nlc3NvcnMKLQotICBCZWNhdXNlIG9uZSBjb3VsZCBlbXBsb3kgYW55IGtpbmQgb2YgcHJvZ3JhbSB0aGF0IHJlYWRzIGZyb20gc3RhbmRhcmQKLSAgaW5wdXQgYW5kIHByaW50cyB0byBzdGFuZGFyZCBvdXRwdXQgYXMgcHJlcHJvY2Vzc29yLCB0aGVyZSBjYW5ub3QgYmUgYW55Ci0gIGRlZmF1bHQgd2F5IHRvIGhhbmRsZSBhbGwgb2YgdGhlbSBjb3JyZWN0bHkgd2l0aG91dCBmdXJ0aGVyIGtub3dsZWRnZS4KLQotICBUaGVyZWZvcmUgeW91IGhhdmUgdG8gY29vcGVyYXRlIGEgYml0IHdpdGggT0NhbWxNYWtlZmlsZSB0byBsZXQKLSAgcHJlcHJvY2Vzc2luZyBoYXBwZW4gYXV0b21hdGljYWxseS4gQmFzaWNhbGx5LCB0aGlzIG9ubHkgcmVxdWlyZXMKLSAgdGhhdCB5b3UgcHV0IGEgY29tbWVudCBpbnRvIHRoZSBmaXJzdCBsaW5lIG9mIGZpbGVzIHRoYXQgc2hvdWxkIGJlCi0gIHByZXByb2Nlc3NlZCwgZS5nLjoKLQotICAgICgqcHAgY2F0ICopCi0gICAgLi4uIHJlc3Qgb2YgcHJvZ3JhbSAuLi4KLQotICBPQ2FtbE1ha2VmaWxlIGxvb2tzIGF0IHRoZSBmaXJzdCBsaW5lIG9mIHlvdXIgZmlsZXMsIGFuZCBpZiBpdCBmaW5kcwotICBhIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCAiKCpwcCIsIHRoZW4gaXQgd2lsbCBhc3N1bWUgdGhhdCB0aGUKLSAgcmVzdCBvZiB0aGUgY29tbWVudCB0ZWxscyBpdCBob3cgdG8gY29ycmVjdGx5IGNhbGwgdGhlIGFwcHJvcHJpYXRlCi0gIHByZXByb2Nlc3Nvci4gSW4gdGhpcyBjYXNlIHRoZSBwcm9ncmFtICJjYXQiIHdpbGwgYmUgY2FsbGVkLCB3aGljaCB3aWxsLAotICBvZiBjb3Vyc2UsIGp1c3Qgb3V0cHV0IHRoZSBzb3VyY2UgdGV4dCBhZ2FpbiB3aXRob3V0IGNoYW5naW5nIGl0LgotCi0gIElmIHlvdSBhcmUsIGZvciBleGFtcGxlLCBhbiBhZHZvY2F0ZSBvZiB0aGUgbmV3ICJyZXZpc2VkIHN5bnRheCIsCi0gIHdoaWNoIGlzIHN1cHBvcnRlZCBieSB0aGUgY2FtbHA0IHByZXByb2Nlc3NvciwgeW91IGNvdWxkIHNpbXBseSB3cml0ZToKLQotICAgICgqcHAgY2FtbHA0ciAqKQotICAgIC4uLiByZXN0IG9mIHByb2dyYW0gaW4gcmV2aXNlZCBzeW50YXggLi4uCi0KLSAgU2ltcGxlLCBpc24ndCBpdD8KLQotICBJZiB5b3Ugd2FudCB0byB3cml0ZSB5b3VyIG93biBzeW50YXggZXh0ZW5zaW9ucywganVzdCB0YWtlIGEgbG9vayBhdCB0aGUKLSAgZXhhbXBsZSBpbiB0aGUgZGlyZWN0b3J5ICJjYW1scDQiOiBpdCBpbXBsZW1lbnRzIHRoZSAicmVwZWF0IC4uLiB1bnRpbCIKLSAgZXh0ZW5zaW9uIGFzIGRlc2NyaWJlZCBpbiB0aGUgY2FtbHA0LXR1dG9yaWFsLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgTGlicmFyeSAoVW4tKUluc3RhbGxhdGlvbiBTdXBwb3J0Ci0KLSAgT0NhbWxNYWtlZmlsZSBjb250YWlucyB0d28gdGFyZ2V0cyB1c2luZyAib2NhbWxmaW5kIiBmb3IgdGhpcyBwdXJwb3NlOgotCi0gICAgKiBsaWJpbnN0YWxsCi0gICAgKiBsaWJ1bmluc3RhbGwKLQotICBUaGVzZSB0d28gdGFyZ2V0cyByZXF1aXJlIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHZhcmlhYmxlCi0gICJMSUJJTlNUQUxMX0ZJTEVTIiwgd2hpY2ggc2hvdWxkIGJlIHNldCB0byBhbGwgdGhlIGZpbGVzIHRoYXQgeW91Ci0gIHdhbnQgdG8gaW5zdGFsbCBpbiB0aGUgbGlicmFyeSBkaXJlY3RvcnkgKHVzdWFsbHkgJS5tbGksICUuY21pLCAlLmNtYSwKLSAgJS5jbXhhLCAlLmEgYW5kIHBvc3NpYmx5IGZ1cnRoZXIgQy1saWJyYXJpZXMpLiBUaGUgdGFyZ2V0ICJsaWJpbnN0YWxsIgotICBoYXMgdGhlIGRlcGVuZGVuY3kgImFsbCIgdG8gZm9yY2UgY29tcGlsYXRpb24gb2YgdGhlIGxpYnJhcnkgc28gbWFrZQotICBzdXJlIHlvdSBkZWZpbmUgdGFyZ2V0ICJhbGwiIGluIHlvdXIgTWFrZWZpbGUgYXBwcm9wcmlhdGVseS4KLQotICBUaGUgdGFyZ2V0cyBpbmZvcm0gdGhlIHVzZXIgYWJvdXQgdGhlIGNvbmZpZ3VyZWQgaW5zdGFsbCBwYXRoIGFuZCBhc2sKLSAgZm9yIGNvbmZpcm1hdGlvbiB0byAodW4paW5zdGFsbCB0aGVyZS4gSWYgeW91IHdhbnQgdG8gdXNlIHRoZW0sIGl0Ci0gIGlzIG9mdGVuIGEgZ29vZCBpZGVhIHRvIGp1c3QgYWxpYXMgdGhlbSBpbiB5b3VyIE1ha2VmaWxlIHRvICJpbnN0YWxsIgotICBhbmQgInVuaW5zdGFsbCIgcmVzcGVjdGl2ZWx5LgotCi0gIFR3byBvdGhlciB0YXJnZXRzIGFsbG93IGluc3RhbGxhdGlvbiBvZiBmaWxlcyBpbnRvIGEgcGFydGljdWxhcgotICBkaXJlY3RvcnkgKHdpdGhvdXQgdXNpbmcgb2NhbWxmaW5kKToKLQotICAgICogcmF3aW5zdGFsbAotICAgICogcmF3dW5pbnN0YWxsCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRpbmcgdG9wbGV2ZWxzCi0KLSAgVGhlcmUgaXMganVzdCBvbmUgdGFyZ2V0IGZvciB0aGlzOgotCi0gICAgKiB0b3AKLQotICBUaGUgZ2VuZXJhdGVkIGZpbGUgY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgZm9yIGludGVyYWN0aXZlIHNlc3Npb25zIC0KLSAgZXZlbiB3aXRoIHNjYW5uZXJzLCBwYXJzZXJzLCBDLWZpbGVzLCBldGMuIQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbgotCi0gIFRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBhcmUgc3VwcG9ydGVkOgotCi0gICAqIGh0ZG9jICAgICAgLSBnZW5lcmF0ZXMgSFRNTC1kb2N1bWVudGF0aW9uCi0gICAqIGxhZG9jICAgICAgLSBnZW5lcmF0ZXMgTGF0ZXgtZG9jdW1lbnRhdGlvbgotICAgKiBwc2RvYyAgICAgIC0gZ2VuZXJhdGVzIFBvc3RTY3JpcHQtZG9jdW1lbnRhdGlvbgotICAgKiBwZGZkb2MgICAgIC0gZ2VuZXJhdGVzIFBERi1kb2N1bWVudGF0aW9uCi0gICAqIGRvYyAgICAgICAgLSBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi0gICAqIGNsZWFuLWRvYyAgLSBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi0KLSAgQWxsIG9mIHRoZW0gZ2VuZXJhdGUgYSBzdWItZGlyZWN0b3J5ICJkb2MiLiBNb3JlIHByZWNpc2VseSwgZm9yIEhUTUwgaXQKLSAgaXMgImRvYy8kKFJFU1VMVCkvaHRtbCIgYW5kIGZvciBMYXRleCwgUG9zdFNjcmlwdCBhbmQgUERGIHRoZSBkaXJlY3RvcnkKLSAgImRvYy8kKFJFU1VMVCkvbGF0ZXgiLiBTZWUgdGhlIE9DYW1sZG9jLW1hbnVhbCBmb3IgZGV0YWlscyBhbmQgdGhlCi0gIG9wdGlvbmFsIHZhcmlhYmxlcyBiZWxvdyBmb3Igc2V0dGluZ3MgeW91IGNhbiBjb250cm9sLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxpbmcgc3VicHJvamVjdHMKLQotICBZb3UgY2FuIGhhdmUgc2V2ZXJhbCB0YXJnZXRzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhbmQgbWFuYWdlIHRoZW0KLSAgZnJvbSB3aXRoaW4gYW4gc2luZ2xlIE1ha2VmaWxlLgotCi0gIEdpdmUgZWFjaCBzdWJwcm9qZWN0IGEgbmFtZSwgZS5nLiAicDEiLCAicDIiLCBldGMuIFRoZW4geW91IGV4cG9ydAotICBzZXR0aW5ncyBzcGVjaWZpYyB0byBlYWNoIHByb2plY3QgYnkgdXNpbmcgdmFyaWFibGVzIG9mIHRoZSBmb3JtCi0gICJQUk9KX3AxIiwgIlBST0pfcDIiLCBldGMuICBFLmcuOgotCi0gICAgZGVmaW5lIFBST0pfcDEKLSAgICAgIFNPVVJDRVM9ImZvby5tbCBtYWluLm1sIgotICAgICAgUkVTVUxUPSJwMSIKLSAgICAgIE9DQU1MRkxBR1M9Ii11bnNhZmUiCi0gICAgZW5kZWYKLSAgICBleHBvcnQgUFJPSl9wMQotCi0gICAgZGVmaW5lIFBST0pfcDIKLSAgICAgIC4uLgotICAgIGVuZGVmCi0gICAgZXhwb3J0IFBST0pfcDIKLQotICBZb3UgbWF5IGFsc28gZXhwb3J0IGNvbW1vbiBzZXR0aW5ncyB1c2VkIGJ5IGFsbCBwcm9qZWN0cyBkaXJlY3RseSwgZS5nLgotICAiZXhwb3J0IFRIUkVBRFMgPSB5Ii4KLQotICBOb3cgaXQgaXMgYSBnb29kIGlkZWEgdG8gZGVmaW5lLCB3aGljaCBwcm9qZWN0cyBzaG91bGQgYmUgYWZmZWN0ZWQgYnkKLSAgY29tbWFuZHMgYnkgZGVmYXVsdC4gIEUuZy46Ci0KLSAgICBpZm5kZWYgU1VCUFJPSlMKLSAgICAgIGV4cG9ydCBTVUJQUk9KUyA9IHAxIHAyCi0gICAgZW5kaWYKLQotICBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIGdpdmVuIHRhcmdldCBmb3IgYWxsIHRob3NlCi0gIHN1YnByb2plY3RzIGlmIHRoaXMgdmFyaWFibGUgaGFzIG5vdCBiZWVuIGRlZmluZWQgaW4gdGhlIHNoZWxsCi0gIGVudmlyb25tZW50IG9yIGluIHRoZSBjb21tYW5kIGxpbmUgb2YgdGhlIG1ha2UtaW52b2NhdGlvbiBieSB0aGUgdXNlci4KLSAgRS5nLiwgIm1ha2UgZGMiIHdpbGwgZ2VuZXJhdGUgZGVidWcgY29kZSBmb3IgYWxsIHN1YnByb2plY3RzLgotCi0gIFRoZW4geW91IG5lZWQgdG8gZGVmaW5lIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHlvdXIgc3VicHJvamVjdHMgaWYgIm1ha2UiCi0gIGhhcyBiZWVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50czoKLQotICAgIGFsbDogYmMKLQotICBUaGlzIHdpbGwgYnVpbGQgYnl0ZSBjb2RlIGJ5IGRlZmF1bHQgZm9yIGFsbCBzdWJwcm9qZWN0cy4KLQotICBGaW5hbGx5LCB5b3UnbGwgaGF2ZSB0byBkZWZpbmUgYSBjYXRjaC1hbGwgdGFyZ2V0IHRoYXQgdXNlcyB0aGUgdGFyZ2V0Ci0gIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGZvciBhbGwgc3VicHJvamVjdHMuIEp1c3QgYWRkIChhc3N1bWluZyB0aGF0Ci0gIE9DQU1MTUFLRUZJTEUgaGFzIGJlZW4gZGVmaW5lZCBhcHByb3ByaWF0ZWx5KToKLQotICAgICU6Ci0gICAgICAgICAgICBAbWFrZSAtZiAkKE9DQU1MTUFLRUZJTEUpIHN1YnByb2pzIFNVQlRBUkdFVD0kQAotCi0gIFNlZSB0aGUgInRocmVhZHMiLWRpcmVjdG9yeSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBhIHNob3J0IGV4YW1wbGUhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBPcHRpb25hbCB2YXJpYWJsZXMgdGhhdCBtYXkgYmUgcGFzc2VkIHRvICJPQ2FtbE1ha2VmaWxlIgotCi0gICogTElCX1BBQ0tfTkFNRSAtIHBhY2tzIGFsbCBtb2R1bGVzIG9mIGEgbGlicmFyeSBpbnRvIGEgbW9kdWxlIHdob3NlCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgaXMgZ2l2ZW4gaW4gdmFyaWFibGUgIkxJQl9QQUNLX05BTUUiLgotCi0gICogUkVTX0NMSUJfU1VGICAtIHdoZW4gYnVpbGRpbmcgYSBsaWJyYXJ5IHRoYXQgY29udGFpbnMgQy1zdHVicywgdGhpcwotICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBjb250cm9scyB0aGUgc3VmZml4IGFwcGVuZGVkIHRvIHRoZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgIG9mIHRoZSBDLWxpYnJhcnkgKGRlZmF1bHQ6ICJfc3R1YnMiKS4KLQotICAqIFRIUkVBRFMgICAgICAgLSBzYXkgIlRIUkVBRFMgPSB5ZXMiIGlmIHlvdSBuZWVkIHRocmVhZCBzdXBwb3J0IGNvbXBpbGVkIGluLAotICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgbGVhdmUgaXQgYXdheS4KLQotICAqIFZNVEhSRUFEUyAgICAgLSBzYXkgIlZNVEhSRUFEUyA9IHllcyIgaWYgeW91IHdhbnQgdG8gZm9yY2UgVk0tbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGluZyBvZiB0aHJlYWRzIChieXRlLWNvZGUgb25seSkuCi0KLSAgKiBBTk5PVEFURSAgICAgIC0gc2F5ICJBTk5PVEFURSA9IHllcyIgdG8gZ2VuZXJhdGUgdHlwZSBhbm5vdGF0aW9uIGZpbGVzCi0gICAgICAgICAgICAgICAgICAgICguYW5ub3QpIHRvIHN1cHBvcnQgZGlzcGxheWluZyBvZiB0eXBlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIGluIGVkaXRvcnMuCi0KLSAgKiBVU0VfQ0FNTFA0ICAgIC0gc2F5ICJVU0VfQ0FNTFA0ID0geWVzIiBpbiB5b3VyICJNYWtlZmlsZSIgaWYgeW91Ci0gICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gaW5jbHVkZSB0aGUgY2FtbHA0IGRpcmVjdG9yeSBkdXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkIHByb2Nlc3MsIG90aGVyd2lzZSBsZWF2ZSBpdCBhd2F5LgotCi0gICogSU5DRElSUyAgICAgICAtIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciAiLmNtaSItIGFuZAotICAgICAgICAgICAgICAgICAgICAiLmNtbyItZmlsZXMuICBZb3UgbmVlZCBub3Qgd3JpdGUgIi1JIC4uLiIgLSBqdXN0IHRoZQotICAgICAgICAgICAgICAgICAgICBwbGFpbiBuYW1lcy4KLSAgKiBMSUJESVJTICAgICAgIC0gZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGxpYnJhcmllcwotICAgICAgICAgICAgICAgICAgICBBbHNvIGp1c3QgcHV0IHRoZSBwbGFpbiBwYXRocyBpbnRvIHRoaXMgdmFyaWFibGUKLSAgKiBFWFRMSUJESVJTICAgIC0gU2FtZSBhcyAiTElCRElSUyIsIGJ1dCBwYXRocyBpbiB0aGlzIHZhcmlhYmxlIGFyZQotICAgICAgICAgICAgICAgICAgICBhbHNvIGFkZGVkIHRvIHRoZSBiaW5hcnkgdmlhIHRoZSAiLVIiLWZsYWcgc28gdGhhdAotICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpYnJhcmllcyBpbiBub24tc3RhbmRhcmQgcGxhY2VzIGNhbiBiZSBmb3VuZC4KLSAgKiBSRVNVTFRERVBTICAgIC0gVGFyZ2V0cyBvbiB3aGljaCByZXN1bHRzIChleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMpCi0gICAgICAgICAgICAgICAgICAgIHNob3VsZCBhZGRpdGlvbmFsbHkgZGVwZW5kLgotCi0gICogUEFDS1MgICAgICAgICAtIGFkZHMgcGFja2FnZXMgdW5kZXIgY29udHJvbCBvZiAiZmluZGxpYiIuCi0KLSAgKiBQUkVEUyAgICAgICAgIC0gc3BlY2lmaWVzICJmaW5kbGliIi1wcmVkaWNhdGVzLgotCi0gICogTElCUyAgICAgICAgICAtIE9DYW1sLWxpYnJhcmllcyB0aGF0IHNob3VsZCBiZSBsaW5rZWQgKGp1c3QgcGxhaW4gbmFtZXMpLgotICAgICAgICAgICAgICAgICAgICBFLmcuIGlmIHlvdSB3YW50IHRvIGxpbmsgdGhlIFN0ci1saWJyYXJ5LCBqdXN0IHdyaXRlCi0gICAgICAgICAgICAgICAgICAgICJzdHIiICh3aXRob3V0IHF1b3RlcykuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBuZXcgT0NhbWwtY29tcGlsZXIgaGFuZGxlcyBsaWJyYXJpZXMgaW4gc3VjaAotICAgICAgICAgICAgICAgICAgICBhIHdheSB0aGF0IHRoZXkgInJlbWVtYmVyIiB3aGV0aGVyIHRoZXkgaGF2ZSB0bwotICAgICAgICAgICAgICAgICAgICBiZSBsaW5rZWQgYWdhaW5zdCBhIEMtbGlicmFyeSBhbmQgaXQgZ2V0cyBsaW5rZWQKLSAgICAgICAgICAgICAgICAgICAgaW4gYXV0b21hdGljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBzbGFzaCBpbiB0aGUgbGlicmFyeSBuYW1lIChzdWNoIGFzCi0gICAgICAgICAgICAgICAgICAgICIuL3N0ciIgb3IgImxpYi9mb28iKSB0aGVuIG1ha2UgaXMgdG9sZCB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgZmlsZXMgZGVwZW5kIG9uIHRoZSBsaWJyYXJ5LiAgVGhpcwotICAgICAgICAgICAgICAgICAgICBoZWxwcyB0byBlbnN1cmUgdGhhdCBjaGFuZ2VzIHRvIHlvdXIgbGlicmFyaWVzIGFyZQotICAgICAgICAgICAgICAgICAgICB0YWtlbiBpbnRvIGFjY291bnQsIHdoaWNoIGlzIGltcG9ydGFudCBpZiB5b3UgYXJlCi0gICAgICAgICAgICAgICAgICAgIHJlZ2VuZXJhdGluZyB5b3VyIGxpYnJhcmllcyBmcmVxdWVudGx5LgotICAqIENMSUJTICAgICAgICAgLSBDLWxpYnJhcmllcyB0aGF0IHNob3VsZCBiZSBsaW5rZWQgKGp1c3QgcGxhaW4gbmFtZXMpLgotCi0gICogUFJFX1RBUkdFVFMgICAtIHNldCB0aGlzIHRvIGEgbGlzdCBvZiB0YXJnZXQgZmlsZXMgdGhhdCB5b3Ugd2FudAotICAgICAgICAgICAgICAgICAgICB0byBoYXZlIGJ1aWxkdCBiZWZvcmUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbiBhY3R1YWxseQotICAgICAgICAgICAgICAgICAgICB0YWtlcyBwbGFjZS4gRS5nLiB1c2UgdGhpcyB0byBhdXRvbWF0aWNhbGx5IGNvbXBpbGUKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyBuZWVkZWQgYnkgY2FtbHA0LCB3aGljaCBoYXZlIHRvIGJlIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICBiZWZvcmUgb3RoZXIgbW9kdWxlcyBjYW4gYmUgcGFyc2VkIGF0IGFsbC4KLQotICAgICAgICAgICAgICAgICAgICAqKiBXQVJOSU5HICoqOiB0aGUgZmlsZXMgbWVudGlvbmVkIGluIHRoaXMgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZW1vdmVkIHdoZW4gIm1ha2UgY2xlYW4iIGlzIGV4ZWN1dGVkIQotCi0gICogTElCSU5TVEFMTF9GSUxFUyAtIHRoZSBmaWxlcyBvZiBhIGxpYnJhcnkgdGhhdCBzaG91bGQgYmUgaW5zdGFsbGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICJmaW5kbGliIi4gRGVmYXVsdDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICQoUkVTVUxUKS5tbGkgJChSRVNVTFQpLmNtaSAkKFJFU1VMVCkuY21hCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLmEgbGliJChSRVNVTFQpLmEKLQotICAqIE9DQU1MX0xJQl9JTlNUQUxMIC0gdGFyZ2V0IGRpcmVjdG9yeSBmb3IgInJhd2luc3RhbGwvcmF3dW5pbnN0YWxsIi4KLSAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAkKE9DQU1MTElCUEFUSCkvY29udHJpYikKLQotICAqIERPQ19GSUxFUyAgICAgLSBuYW1lcyBvZiBmaWxlcyBmcm9tIHdoaWNoIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLgotICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogYWxsIC5tbGktZmlsZXMgaW4geW91ciAkKFNPVVJDRVMpKS4KLQotICAqIERPQ19ESVIgICAgICAgLSBuYW1lIG9mIGRpcmVjdG9yeSB3aGVyZSBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBzdG9yZWQuCi0KLSAgKiBPQ0FNTEZMQUdTICAgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBjb21waWxlcnMKLSAgKiBPQ0FNTEJDRkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBieXRlIGNvZGUgY29tcGlsZXIgb25seQotICAqIE9DQU1MTkNGTEFHUyAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIG5hdGl2ZSBjb2RlIGNvbXBpbGVyIG9ubHkKLQotICAqIE9DQU1MTERGTEFHUyAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlcgotICAqIE9DQU1MQkxERkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlciB3aGVuIGxpbmtpbmcgYnl0ZSBjb2RlCi0gICogT0NBTUxOTERGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwtbGlua2VyIHdoZW4gbGlua2luZwotICAgICAgICAgICAgICAgICAgICBuYXRpdmUgY29kZQotCi0gICogT0NBTUxNS0xJQl9GTEFHUyAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwgbGlicmFyeSB0b29sCi0KLSAgKiBPQ0FNTENQRkxBR1MgIC0gcHJvZmlsaW5nIGZsYWdzIHBhc3NlZCB0byAib2NhbWxjcCIgKGRlZmF1bHQ6ICJhIikKLQotICAqIFBQRkxBR1MgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgcHJlcHJvY2Vzc29yIChkZWZhdWx0OiBub25lKQotCi0gICogTEZMQUdTICAgICAgICAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWxsZXgiCi0gICogWUZMQUdTICAgICAgICAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWx5YWNjIgotICAqIElETEZMQUdTICAgICAgLSBmbGFncyBwYXNzZWQgdG8gImNhbWxpZGwiCi0KLSAgKiBPQ0FNTERPQ0ZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGRvYyIKLQotICAqIE9DQU1MRklORF9JTlNURkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1sZmluZCIgZHVyaW5nIGluc3RhbGxhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogbm9uZSkKLQotICAqIERWSVBTRkxBR1MgICAgLSBmbGFncyBwYXNzZWQgdG8gZHZpcHMKLSAgICAgICAgICAgICAgICAgICAgKHdoZW4gZ2VuZXJhdGluZyBkb2N1bWVudGF0aW9uIGluIFBvc3RTY3JpcHQpLgotCi0gICogU1RBVElDICAgICAgICAtIHNldCB0aGlzIHZhcmlhYmxlIGlmIHlvdSB3YW50IHRvIGZvcmNlIGNyZWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG9mIHN0YXRpYyBsaWJyYXJpZXMKLQotICAqIENDICAgICAgICAgICAgLSB0aGUgQy1jb21waWxlciB0byBiZSB1c2VkCi0gICogQ1hYICAgICAgICAgICAtIHRoZSBDKystY29tcGlsZXIgdG8gYmUgdXNlZAotCi0gICogQ0ZMQUdTICAgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDLWNvbXBpbGVyLgotICAgICAgICAgICAgICAgICAgICBUaGUgZmxhZyAiLUROQVRJVkVfQ09ERSIgd2lsbCBiZSBwYXNzZWQgYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICAgICBpZiB5b3UgY2hvb3NlIHRvIGJ1aWxkIG5hdGl2ZSBjb2RlLiBUaGlzIGFsbG93cyB5b3UKLSAgICAgICAgICAgICAgICAgICAgdG8gY29tcGlsZSB5b3VyIEMtZmlsZXMgY29uZGl0aW9uYWxseS4gQnV0IHBsZWFzZQotICAgICAgICAgICAgICAgICAgICBub3RlOiBZb3Ugc2hvdWxkIGRvIGEgIm1ha2UgY2xlYW4iIG9yIHJlbW92ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZpbGVzIG1hbnVhbGx5IG9yIHRvdWNoIHRoZSAlLmMtZmlsZXM6Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgdGhleSBtYXkgbm90IGJlIGNvcnJlY3RseSByZWNvbXBpbGVkCi0gICAgICAgICAgICAgICAgICAgIGJldHdlZW4gZGlmZmVyZW50IGJ1aWxkcy4KLQotICAqIENYWEZMQUdTICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQysrLWNvbXBpbGVyLgotCi0gICogQ1BQRkxBR1MgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDLXByZXByb2Nlc3Nvci4KLQotICAqIENGUkFNRVdPUktTICAgLSBPYmplY3RpdmUtQyBmcmFtZXdvcmsgdG8gcGFzcyB0byBsaW5rZXIgb24gTWFjT1MgWC4KLQotICAqIExERkxBR1MgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1saW5rZXIKLQotICAqIFJQQVRIX0ZMQUcgICAgLSBmbGFnIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBDLWxpbmtlciB0byBzZXQgYSBwYXRoIGZvcgotICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpYnJhcmllcy4gIE1heSBuZWVkIHRvIGJlIHNldCBieSB1c2VyIG9uCi0gICAgICAgICAgICAgICAgICAgIGV4b3RpYyBwbGF0Zm9ybXMuICAoZGVmYXVsdDogIi1SIikuCi0KLSAgKiBFTEZfUlBBVEhfRkxBRyAtIHRoaXMgZmxhZyBpcyB1c2VkIHRvIHNldCB0aGUgcnBhdGggb24gRUxGLXBsYXRmb3Jtcy4KLSAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiLVIiKQotCi0gICogRUxGX1JQQVRIICAgICAtIGlmIHRoaXMgZmxhZyBpcyAieWVzIiwgdGhlbiB0aGUgUlBBVEhfRkxBRyB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgIHBhc3NlZCBieSAiLVdsIiB0byB0aGUgbGlua2VyIGFzIG5vcm1hbCBvbgotICAgICAgICAgICAgICAgICAgICBFTEYtcGxhdGZvcm1zLgotCi0gICogT0NBTUxMSUJQQVRIICAtIHBhdGggdG8gdGhlIE9DYW1sLXN0YW5kYXJkLWxpYnJhcmllcwotICAgICAgICAgICAgICAgICAgICAoZmlyc3QgZGVmYXVsdDogYCQoT0NBTUxDKSAtd2hlcmVgKQotICAgICAgICAgICAgICAgICAgICAoc2Vjb25kIGRlZmF1bHQ6ICIvdXNyL2xvY2FsL2xpYi9vY2FtbCIpCi0KLSAgKiBPQ0FNTF9ERUZBVUxUX0RJUlMgLSBhZGRpdGlvbmFsIHBhdGggaW4gd2hpY2ggdGhlIHVzZXIgY2FuIHN1cHBseQotICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgZGlyZWN0b3JpZXMgdG8gaGlzIG93biBjb2xsZWN0aW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzLiAgVGhlIGlkZWEgaXMgdG8gcGFzcyB0aGlzIGFzIGFuIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgc28gdGhhdCB0aGUgTWFrZWZpbGVzIGRvIG5vdCBoYXZlIHRvIGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhdGggYWxsIHRoZSB0aW1lLgotCi0gICogT0NBTUxGSU5EICAgICAtIG9jYW1sZmluZCBmcm9tIGZpbmRsaWIgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGZpbmQiKQotICAqIE9DQU1MQyAgICAgICAgLSBieXRlLWNvZGUgY29tcGlsZXIgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxjIikKLSAgKiBPQ0FNTE9QVCAgICAgIC0gbmF0aXZlLWNvZGUgY29tcGlsZXIgICAgICAgICAoZGVmYXVsdDogIm9jYW1sb3B0IikKLSAgKiBPQ0FNTE1LVE9QICAgIC0gdG9wLWxldmVsIGNvbXBpbGVyICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sbWt0b3AiKQotICAqIE9DQU1MQ1AgICAgICAgLSBwcm9maWxpbmcgYnl0ZS1jb2RlIGNvbXBpbGVyIChkZWZhdWx0OiAib2NhbWxjcCIpCi0gICogT0NBTUxERVAgICAgICAtIGRlcGVuZGVuY3kgZ2VuZXJhdG9yICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGRlcCIpCi0gICogT0NBTUxMRVggICAgICAtIHNjYW5uZXIgZ2VuZXJhdG9yICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGxleCIpCi0gICogT0NBTUxZQUNDICAgICAtIHBhcnNlciBnZW5lcmF0b3IgICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbHlhY2MiKQotICAqIE9DQU1MTUtMSUIgICAgLSB0b29sIHRvIGNyZWF0ZSBsaWJyYXJpZXMgICAgIChkZWZhdWx0OiAib2NhbWxta2xpYiIpCi0gICogQ0FNTElETCAgICAgICAtIElETC1jb2RlIGdlbmVyYXRvciAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1saWRsIikKLSAgKiBDQU1MSURMRExMICAgIC0gSURMLXV0aWxpdHkgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogImNhbWxpZGxkbGwiKQotICAqIENBTUxQNCAgICAgICAgLSBjYW1scDQgcHJlcHJvY2Vzc29yICAgICAgICAgIChkZWZhdWx0OiAiY2FtbHA0IikKLSAgKiBPQ0FNTERPQyAgICAgIC0gT0NhbWxkb2MtY29tbWFuZCAgICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sZG9jIikKLQotICAqIExBVEVYICAgICAgICAgLSBMYXRleC1wcm9jZXNzb3IgICAgICAgICAgICAgIChkZWZhdWx0OiAibGF0ZXgiKQotICAqIERWSVBTICAgICAgICAgLSBkdmlwcy1jb21tYW5kICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiZHZpcHMiKQotICAqIFBTMlBERiAgICAgICAgLSBQb3N0U2NyaXB0LXRvLVBERiBjb252ZXJ0ZXIgIChkZWZhdWx0OiAicHMycGRmIikKLQotICAqIENBTUVMRU9OX1JFUE9SVCAtIHJlcG9ydCB0b29sIG9mIENhbWVsZW9uICAoZGVmYXVsdDogInJlcG9ydCIpCi0gICogQ0FNRUxFT05fUkVQT1JUX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSByZXBvcnQgdG9vbCBvZiBDYW1lbGVvbgotCi0gICogQ0FNRUxFT05fWk9HR1kgLSB6b2dneSB0b29sIG9mIENhbWVsZW9uCi0gICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogImNhbWxwNG8gcGFfem9nLmNtYSBwcl9vLmNtbyIpCi0gICogQ0FNRUxFT05fWk9HR1lfRkxBR1MgLSBmbGFncyBmb3IgdGhlIHpvZ2d5IHRvb2wgb2YgQ2FtZWxlb24KLQotICAqIE9DQU1MX0dMQURFQ0MgLSBHbGFkZSBjb21waWxlciBmb3IgT0NhbWwgICAgIChkZWZhdWx0OiAibGFibGdsYWRlY2MyIikKLSAgKiBPQ0FNTF9HTEFERUNDX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSBHbGFkZSBjb21waWxlcgotCi0gICogT1hSSURMICAgICAgICAtIE9YUklETC1nZW5lcmF0b3IgIChkZWZhdWx0OiAib3hyaWRsIikKLQotICAqIE5PSURMSEVBREVSICAgLSBzZXQgdG8gInllcyIgdG8gcHJvaGliaXQgIk9DYW1sTWFrZWZpbGUiIGZyb20gdXNpbmcKLSAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgY2FtbGlkbC1mbGFnICItaGVhZGVyIi4KLQotICAqIE5PX0NVU1RPTSAgICAgLSBQcmV2ZW50IGxpbmtpbmcgaW4gY3VzdG9tIG1vZGUuCi0KLSAgKiBRVUlFVCAgICAgICAgIC0gdW5zZXR0aW5nIHRoaXMgdmFyaWFibGUgKGUuZy4gIm1ha2UgUVVJRVQ9IikKLSAgICAgICAgICAgICAgICAgICAgd2lsbCBwcmludCBhbGwgZXhlY3V0ZWQgY29tbWFuZHMsIGluY2x1ZGluZwotICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgb25lcy4gVGhpcyBhbGxvd3MgbW9yZSBjb21mb3J0YWJsZQotICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dpbmcgd2hlbiB0aGluZ3MgZ28gd3JvbmcgZHVyaW5nIGEgYnVpbGQuCi0KLSAgKiBSRUFMTFlfUVVJRVQgIC0gd2hlbiBzZXQgdGhpcyBmbGFnIHR1cm5zIG9mZiBvdXRwdXQgZnJvbSBzb21lIGNvbW1hbmRzLgotCi0gICogT0NBTUxNQUtFRklMRSAtIGxvY2F0aW9uIG9mICg9cGF0aCB0bykgdGhpcyAiT0NhbWxNYWtlZmlsZSIuCi0gICAgICAgICAgICAgICAgICAgIEJlY2F1c2UgaXQgY2FsbGVzIGl0c2VsZiByZWN1cnNpdmVseSwgaXQgaGFzIHRvCi0gICAgICAgICAgICAgICAgICAgIGtub3cgd2hlcmUgaXQgaXMuIChkZWZhdWx0OiAiT0NhbWxNYWtlZmlsZSIgPQotICAgICAgICAgICAgICAgICAgICBsb2NhbCBkaXJlY3RvcnkpCi0KLSAgKiBCQ1NVRkZJWCAgICAgIC0gU3VmZml4IGZvciBhbGwgYnl0ZS1jb2RlIGZpbGVzLiBFLmcuOgotCi0gICAgICAgICAgICAgICAgICAgICAgUkVTVUxUICAgPSBmb28KLSAgICAgICAgICAgICAgICAgICAgICBCQ1NVRkZJWCA9IF9iYwotCi0gICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBwcm9kdWNlIGJ5dGUtY29kZSBleGVjdXRhYmxlcy9saWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgd2l0aCBiYXNlbmFtZSAiZm9vX2JjIi4KLQotICAqIE5DU1VGRklYICAgICAgLSBTaW1pbGFyIHRvICJCQ1NVRkZJWCIsIGJ1dCBmb3IgbmF0aXZlLWNvZGUgZmlsZXMuCi0gICogVE9QU1VGRklYICAgICAtIFN1ZmZpeCBhZGRlZCB0byB0b3BsZXZlbCBpbnRlcnByZXRlcnMgKGRlZmF1bHQ6ICIudG9wIikKLQotICAqIFNVQlBST0pTICAgICAgLSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBzdWJwcm9qZWN0cyB0byBiZQotICAgICAgICAgICAgICAgICAgICBjb21waWxlZC4KLQotICAqIFNVQlRBUkdFVCAgICAgLSB0YXJnZXQgdG8gYmUgYnVpbHQgZm9yIGFsbCBwcm9qZWN0cyBpbiB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICBTVUJQUk9KUy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgdmFyaWFibGVzIGZvciBXaW5kb3dzIHVzZXJzCi0KLSAgKiBNSU5HVyAgICAgICAgIC0gdmFyaWFibGUgdG8gZGV0ZWN0IHRoZSBNSU5HVy1lbnZpcm9ubWVudAotICAqIE1TVkMgICAgICAgICAgLSB2YXJpYWJsZSB0byBkZXRlY3QgdGhlIE1TVkMtY29tcGlsZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVwLXRvLWRhdGUgaW5mb3JtYXRpb24gKG5ld2VzdCByZWxlYXNlIG9mIGRpc3RyaWJ1dGlvbikgY2FuIGFsd2F5cyBiZQotZm91bmQgYXQ6Ci0KLSAgaHR0cDovL3d3dy5vY2FtbC5pbmZvL2hvbWUvb2NhbWxfc291cmNlcy5odG1sCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FbmpveSEKLQotTmV3IFlvcmssIDIwMDctMDQtMjIKLU1hcmt1cyBNb3R0bAotCi1lLW1haWw6IG1hcmt1cy5tb3R0bEBnbWFpbC5jb20KLVdXVzogICAgaHR0cDovL3d3dy5vY2FtbC5pbmZvCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvUkVBRE1FIGIvbGliL29jYW1sL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL29jYW1sL1JFQURNRQpyZW5hbWUgdG8gbGliL29jYW1sL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL19vYXNpcyBiL2xpYi9vY2FtbC9fb2FzaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkOTBkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9fb2FzaXMKQEAgLTAsMCArMSwxOSBAQAorTmFtZTogbGlidGhyaWZ0LW9jYW1sCitWZXJzaW9uOiAxLjAuMAorT0FTSVNGb3JtYXQ6IDAuMworU3lub3BzaXM6IE9DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCitBdXRob3JzOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0xpY2Vuc2U6IEFwYWNoZS0yLjAKK0hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK0J1aWxkVG9vbHM6IG9jYW1sYnVpbGQKK1BsdWdpbnM6ICAgICBNRVRBICgwLjMpLAorICBEZXZGaWxlcyAoMC4zKQorCitMaWJyYXJ5ICJsaWJ0aHJpZnQtb2NhbWwiCisgIFBhdGg6IHNyYworICBGaW5kbGliTmFtZTogdGhyaWZ0CisgIGJ1aWxkVG9vbHM6IG9jYW1sYnVpbGQKKyAgQnVpbGREZXBlbmRzOiB0aHJlYWRzCisgIE1vZHVsZXM6IFRocmlmdCxUQmluYXJ5UHJvdG9jb2wsVFNvY2tldCxURnJhbWVkVHJhbnNwb3J0LFRDaGFubmVsVHJhbnNwb3J0LFRTZXJ2ZXIsVFNpbXBsZVNlcnZlcixUU2VydmVyU29ja2V0LFRUaHJlYWRlZFNlcnZlcgorICBYTUVUQVJlcXVpcmVzOiB0aHJlYWRzCisKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL29jYW1sL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL2Rlc2NyIGIvbGliL29jYW1sL2Rlc2NyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTc0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvZGVzY3IKQEAgLTAsMCArMSBAQAorT0NhbWwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9vcGFtIGIvbGliL29jYW1sL29wYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiYzNkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9vcGFtCkBAIC0wLDAgKzEsOCBAQAorb3BhbS12ZXJzaW9uOiAiMSIKK21haW50YWluZXI6ICJYWFgoRklMTCBNRSBJTiBXSVRIIEVNQUlMKSIKK2J1aWxkOiBbCisgIFttYWtlXQorICBbbWFrZSAiaW5zdGFsbCJdCitdCityZW1vdmU6IFtbIm9jYW1sZmluZCIgInJlbW92ZSIgInRocmlmdCJdXQorZGVwZW5kczogWyJvY2FtbGZpbmQiXQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3NyYy9NYWtlZmlsZSBiL2xpYi9vY2FtbC9zcmMvTWFrZWZpbGUKaW5kZXggNDJlYzhkYi4uYTk3YWRlNSAxMDA2NDQKLS0tIGEvbGliL29jYW1sL3NyYy9NYWtlZmlsZQorKysgYi9saWIvb2NhbWwvc3JjL01ha2VmaWxlCkBAIC0xNyw3ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TT1VSQ0VTID0gVGhyaWZ0Lm1sIFRCaW5hcnlQcm90b2NvbC5tbCBUU29ja2V0Lm1sIFRDaGFubmVsVHJhbnNwb3J0Lm1sIFRTZXJ2ZXIubWwgVFNpbXBsZVNlcnZlci5tbCBUU2VydmVyU29ja2V0Lm1sIFRUaHJlYWRlZFNlcnZlci5tbAorU09VUkNFUyA9IFRocmlmdC5tbCBUQmluYXJ5UHJvdG9jb2wubWwgVFNvY2tldC5tbCBURnJhbWVkVHJhbnNwb3J0Lm1sIFRDaGFubmVsVHJhbnNwb3J0Lm1sIFRTZXJ2ZXIubWwgVFNpbXBsZVNlcnZlci5tbCBUU2VydmVyU29ja2V0Lm1sIFRUaHJlYWRlZFNlcnZlci5tbAogUkVTVUxUID0gdGhyaWZ0CiBMSUJTID0gdW5peCB0aHJlYWRzCiBUSFJFQURTID0geWVzCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvc3JjL1RCaW5hcnlQcm90b2NvbC5tbCBiL2xpYi9vY2FtbC9zcmMvVEJpbmFyeVByb3RvY29sLm1sCmluZGV4IGEwNmNjOWEuLjZkNzUwMGUgMTAwNjQ0Ci0tLSBhL2xpYi9vY2FtbC9zcmMvVEJpbmFyeVByb3RvY29sLm1sCisrKyBiL2xpYi9vY2FtbC9zcmMvVEJpbmFyeVByb3RvY29sLm1sCkBAIC0yMiw2ICsyMiw3IEBACiBtb2R1bGUgUCA9IFByb3RvY29sCiAKIGxldCBnZXRfYnl0ZSBpIGIgPSAyNTUgbGFuZCAoaSBsc3IgKDgqYikpCitsZXQgZ2V0X2J5dGUzMiBpIGIgPSAyNTUgbGFuZCAoSW50MzIudG9faW50IChJbnQzMi5zaGlmdF9yaWdodCBpICg4KmIpKSkKIGxldCBnZXRfYnl0ZTY0IGkgYiA9IDI1NSBsYW5kIChJbnQ2NC50b19pbnQgKEludDY0LnNoaWZ0X3JpZ2h0IGkgKDgqYikpKQogCiAKQEAgLTM1LDcgKzM2LDcgQEAKICAgICBmb3IgaT0wIHRvIChuLTEpIGRvCiAgICAgICBzOj0gSW50MzIubG9nb3IgIXMgKEludDMyLnNoaWZ0X2xlZnQgKEludDMyLm9mX2ludCAoaW50X29mX2NoYXIgYi5baV0pKSAoOCoobi0xLWkpKSkKICAgICBkb25lOwotICAgIEludDMyLnRvX2ludCAoSW50MzIuc2hpZnRfcmlnaHQgKEludDMyLnNoaWZ0X2xlZnQgIXMgc2IpIHNiKQorICAgIEludDMyLnNoaWZ0X3JpZ2h0IChJbnQzMi5zaGlmdF9sZWZ0ICFzIHNiKSBzYgogCiBsZXQgY29tcF9pbnQ2NCBiIG4gPQogICBsZXQgcyA9IHJlZiAwTCBpbgpAQCAtNDQsOCArNDUsOCBAQAogICAgIGRvbmU7CiAgICAgIXMKIAotbGV0IHZlcnNpb25fbWFzayA9IDB4ZmZmZjAwMDAKLWxldCB2ZXJzaW9uXzEgPSAweDgwMDEwMDAwCitsZXQgdmVyc2lvbl9tYXNrID0gMHhmZmZmMDAwMGwKK2xldCB2ZXJzaW9uXzEgPSAweDgwMDEwMDAwbAogCiBjbGFzcyB0IHRyYW5zID0KIG9iamVjdCAoc2VsZikKQEAgLTYzLDcgKzY0LDcgQEAKICAgICAgIGlieXRlLlswXSA8LSBjaGFyX29mX2ludCAoZ2IgMSk7CiAgICAgICB0cmFucyN3cml0ZSBpYnl0ZSAwIDIKICAgbWV0aG9kIHdyaXRlSTMyIGkgPQotICAgIGxldCBnYiA9IGdldF9ieXRlIGkgaW4KKyAgICBsZXQgZ2IgPSBnZXRfYnl0ZTMyIGkgaW4KICAgICAgIGZvciBpPTAgdG8gMyBkbwogICAgICAgICBpYnl0ZS5bMy1pXSA8LSBjaGFyX29mX2ludCAoZ2IgaSkKICAgICAgIGRvbmU7CkBAIC03OCwxMyArNzksMTMgQEAKICAgICBzZWxmI3dyaXRlSTY0IChJbnQ2NC5iaXRzX29mX2Zsb2F0IGQpCiAgIG1ldGhvZCB3cml0ZVN0cmluZyBzPQogICAgIGxldCBuID0gU3RyaW5nLmxlbmd0aCBzIGluCi0gICAgICBzZWxmI3dyaXRlSTMyKG4pOworICAgICAgc2VsZiN3cml0ZUkzMiAoSW50MzIub2ZfaW50IG4pOwogICAgICAgdHJhbnMjd3JpdGUgcyAwIG4KICAgbWV0aG9kIHdyaXRlQmluYXJ5IGEgPSBzZWxmI3dyaXRlU3RyaW5nIGEKICAgbWV0aG9kIHdyaXRlTWVzc2FnZUJlZ2luIChuLHQscykgPQotICAgIHNlbGYjd3JpdGVJMzIgKHZlcnNpb25fMSBsb3IgKFAubWVzc2FnZV90eXBlX3RvX2kgdCkpOworICAgIHNlbGYjd3JpdGVJMzIgKEludDMyLmxvZ29yIHZlcnNpb25fMSAoSW50MzIub2ZfaW50IChQLm1lc3NhZ2VfdHlwZV90b19pIHQpKSk7CiAgICAgc2VsZiN3cml0ZVN0cmluZyBuOwotICAgIHNlbGYjd3JpdGVJMzIgcworICAgIHNlbGYjd3JpdGVJMzIgKEludDMyLm9mX2ludCBzKQogICBtZXRob2Qgd3JpdGVNZXNzYWdlRW5kID0gKCkKICAgbWV0aG9kIHdyaXRlU3RydWN0QmVnaW4gcyA9ICgpCiAgIG1ldGhvZCB3cml0ZVN0cnVjdEVuZCA9ICgpCkBAIC05MywyNiArOTQsMjYgQEAKICAgICBzZWxmI3dyaXRlSTE2IGkKICAgbWV0aG9kIHdyaXRlRmllbGRFbmQgPSAoKQogICBtZXRob2Qgd3JpdGVGaWVsZFN0b3AgPQotICAgIHNlbGYjd3JpdGVCeXRlICh0diAoUHJvdG9jb2wuVF9TVE9QKSkKKyAgICBzZWxmI3dyaXRlQnl0ZSAodHYgKFAuVF9TVE9QKSkKICAgbWV0aG9kIHdyaXRlTWFwQmVnaW4gKGssdixzKSA9CiAgICAgc2VsZiN3cml0ZUJ5dGUgKHR2IGspOwogICAgIHNlbGYjd3JpdGVCeXRlICh0diB2KTsKLSAgICBzZWxmI3dyaXRlSTMyIHMKKyAgICBzZWxmI3dyaXRlSTMyIChJbnQzMi5vZl9pbnQgcykKICAgbWV0aG9kIHdyaXRlTWFwRW5kID0gKCkKICAgbWV0aG9kIHdyaXRlTGlzdEJlZ2luICh0LHMpID0KICAgICBzZWxmI3dyaXRlQnl0ZSAodHYgdCk7Ci0gICAgc2VsZiN3cml0ZUkzMiBzCisgICAgc2VsZiN3cml0ZUkzMiAoSW50MzIub2ZfaW50IHMpCiAgIG1ldGhvZCB3cml0ZUxpc3RFbmQgPSAoKQogICBtZXRob2Qgd3JpdGVTZXRCZWdpbiAodCxzKSA9CiAgICAgc2VsZiN3cml0ZUJ5dGUgKHR2IHQpOwotICAgIHNlbGYjd3JpdGVJMzIgcworICAgIHNlbGYjd3JpdGVJMzIgKEludDMyLm9mX2ludCBzKQogICBtZXRob2Qgd3JpdGVTZXRFbmQgPSAoKQogICBtZXRob2QgcmVhZEJ5dGUgPQogICAgIGlnbm9yZSAodHJhbnMjcmVhZEFsbCBpYnl0ZSAwIDEpOwotICAgIChjb21wX2ludCBpYnl0ZSAxKQorICAgIEludDMyLnRvX2ludCAoY29tcF9pbnQgaWJ5dGUgMSkKICAgbWV0aG9kIHJlYWRJMTYgPQogICAgIGlnbm9yZSAodHJhbnMjcmVhZEFsbCBpYnl0ZSAwIDIpOwotICAgIGNvbXBfaW50IGlieXRlIDIKKyAgICBJbnQzMi50b19pbnQgKGNvbXBfaW50IGlieXRlIDIpCiAgIG1ldGhvZCByZWFkSTMyID0KICAgICBpZ25vcmUgKHRyYW5zI3JlYWRBbGwgaWJ5dGUgMCA0KTsKICAgICBjb21wX2ludCBpYnl0ZSA0CkBAIC0xMjQsMjAgKzEyNSwxOSBAQAogICBtZXRob2QgcmVhZEJvb2wgPQogICAgIHNlbGYjcmVhZEJ5dGUgPSAxCiAgIG1ldGhvZCByZWFkU3RyaW5nID0KLSAgICBsZXQgc3ogPSBzZWxmI3JlYWRJMzIgaW4KKyAgICBsZXQgc3ogPSBJbnQzMi50b19pbnQgKHNlbGYjcmVhZEkzMikgaW4KICAgICBsZXQgYnVmID0gU3RyaW5nLmNyZWF0ZSBzeiBpbgogICAgICAgaWdub3JlICh0cmFucyNyZWFkQWxsIGJ1ZiAwIHN6KTsKICAgICAgIGJ1ZgogICBtZXRob2QgcmVhZEJpbmFyeSA9IHNlbGYjcmVhZFN0cmluZwogICBtZXRob2QgcmVhZE1lc3NhZ2VCZWdpbiA9CiAgICAgbGV0IHZlciA9IHNlbGYjcmVhZEkzMiBpbgotICAgICAgaWYgKHZlciBsYW5kIHZlcnNpb25fbWFzayAhPSB2ZXJzaW9uXzEpIHRoZW4KLSAgICAgICAgKHByaW50X2ludCB2ZXI7Ci0gICAgICAgIHJhaXNlIChQLkUgKFAuQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllciIpKSkKKyAgICAgIGlmIEludDMyLmNvbXBhcmUgKEludDMyLmxvZ2FuZCB2ZXIgdmVyc2lvbl9tYXNrKSB2ZXJzaW9uXzEgIT0gMCB0aGVuCisgICAgICAgIHJhaXNlIChQLkUgKFAuQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllciIpKQogICAgICAgZWxzZQogICAgICAgICBsZXQgcyA9IHNlbGYjcmVhZFN0cmluZyBpbgotICAgICAgICBsZXQgbXQgPSBQLm1lc3NhZ2VfdHlwZV9vZl9pICh2ZXIgbGFuZCAweEZGKSBpbgotICAgICAgICAgIChzLG10LCBzZWxmI3JlYWRJMzIpCisgICAgICAgIGxldCBtdCA9IFAubWVzc2FnZV90eXBlX29mX2kgKEludDMyLnRvX2ludCAoSW50MzIubG9nYW5kIHZlciAweEZGbCkpIGluCisgICAgICAgICAgKHMsbXQsIEludDMyLnRvX2ludCBzZWxmI3JlYWRJMzIpCiAgIG1ldGhvZCByZWFkTWVzc2FnZUVuZCA9ICgpCiAgIG1ldGhvZCByZWFkU3RydWN0QmVnaW4gPQogICAgICIiCkBAIC0xNTIsMTUgKzE1MiwxNSBAQAogICBtZXRob2QgcmVhZE1hcEJlZ2luID0KICAgICBsZXQga3QgPSB2dCAoc2VsZiNyZWFkQnl0ZSkgaW4KICAgICBsZXQgdnQgPSB2dCAoc2VsZiNyZWFkQnl0ZSkgaW4KLSAgICAgIChrdCx2dCwgc2VsZiNyZWFkSTMyKQorICAgICAgKGt0LHZ0LCBJbnQzMi50b19pbnQgc2VsZiNyZWFkSTMyKQogICBtZXRob2QgcmVhZE1hcEVuZCA9ICgpCiAgIG1ldGhvZCByZWFkTGlzdEJlZ2luID0KICAgICBsZXQgdCA9IHZ0IChzZWxmI3JlYWRCeXRlKSBpbgotICAgICh0LHNlbGYjcmVhZEkzMikKKyAgICAodCwgSW50MzIudG9faW50IHNlbGYjcmVhZEkzMikKICAgbWV0aG9kIHJlYWRMaXN0RW5kID0gKCkKICAgbWV0aG9kIHJlYWRTZXRCZWdpbiA9CiAgICAgbGV0IHQgPSB2dCAoc2VsZiNyZWFkQnl0ZSkgaW4KLSAgICAodCwgc2VsZiNyZWFkSTMyKTsKKyAgICAodCwgSW50MzIudG9faW50IHNlbGYjcmVhZEkzMik7CiAgIG1ldGhvZCByZWFkU2V0RW5kID0gKCkKIGVuZAogCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvc3JjL1RGcmFtZWRUcmFuc3BvcnQubWwgYi9saWIvb2NhbWwvc3JjL1RGcmFtZWRUcmFuc3BvcnQubWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlNTFlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9zcmMvVEZyYW1lZFRyYW5zcG9ydC5tbApAQCAtMCwwICsxLDkzIEBACitvcGVuIFRocmlmdAorCittb2R1bGUgVCA9IFRyYW5zcG9ydAorCitsZXQgY18weGZmXzMyID0gSW50MzIub2Zfc3RyaW5nICIweGZmIgorCisoKiBDb3BpZWQgZnJvbSBPQ2FtbG5ldCBydHlwZXMubWwgKikKK2xldCBlbmNvZGVfZnJhbWVfc2l6ZSB4ID0KKwlsZXQgcyA9IFN0cmluZy5jcmVhdGUgNCBpbgorCWxldCBuMyA9IEludDMyLnRvX2ludCAoSW50MzIuc2hpZnRfcmlnaHRfbG9naWNhbCB4IDI0KSBsYW5kIDB4ZmYgaW4KKwlsZXQgbjIgPSBJbnQzMi50b19pbnQgKEludDMyLnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgeCAxNikgbGFuZCAweGZmIGluCisJbGV0IG4xID0gSW50MzIudG9faW50IChJbnQzMi5zaGlmdF9yaWdodF9sb2dpY2FsIHggOCkgbGFuZCAweGZmIGluCisJbGV0IG4wID0gSW50MzIudG9faW50IChJbnQzMi5sb2dhbmQgeCBjXzB4ZmZfMzIpIGluCisJCVN0cmluZy51bnNhZmVfc2V0IHMgMCAoQ2hhci51bnNhZmVfY2hyIG4zKTsKKwkJU3RyaW5nLnVuc2FmZV9zZXQgcyAxIChDaGFyLnVuc2FmZV9jaHIgbjIpOworCQlTdHJpbmcudW5zYWZlX3NldCBzIDIgKENoYXIudW5zYWZlX2NociBuMSk7CisJCVN0cmluZy51bnNhZmVfc2V0IHMgMyAoQ2hhci51bnNhZmVfY2hyIG4wKTsKKwkJcworCQkKK2xldCBkZWNvZGVfZnJhbWVfc2l6ZSBzID0gCisJbGV0IG4zID0gSW50MzIub2ZfaW50IChDaGFyLmNvZGUgcy5bMF0pIGluCisJbGV0IG4yID0gSW50MzIub2ZfaW50IChDaGFyLmNvZGUgcy5bMV0pIGluCisJbGV0IG4xID0gSW50MzIub2ZfaW50IChDaGFyLmNvZGUgcy5bMl0pIGluCisJbGV0IG4wID0gSW50MzIub2ZfaW50IChDaGFyLmNvZGUgcy5bM10pIGluCisJCUludDMyLmxvZ29yCisJCShJbnQzMi5zaGlmdF9sZWZ0IG4zIDI0KQorCQkoSW50MzIubG9nb3IKKwkJCShJbnQzMi5zaGlmdF9sZWZ0IG4yIDE2KQorCQkJKEludDMyLmxvZ29yCisJCQkJKEludDMyLnNoaWZ0X2xlZnQgbjEgOCkKKwkJCQluMCkpCisKK2NsYXNzIHQgPyhtYXhfbGVuZ3RoPVN5cy5tYXhfc3RyaW5nX2xlbmd0aCkgKHRyYW5zcG9ydDogVC50KSA9CitvYmplY3QgKHNlbGYpCisJaW5oZXJpdCBULnQKKworCW1ldGhvZCBpc09wZW4gPSB0cmFuc3BvcnQjaXNPcGVuCisJbWV0aG9kIG9wbiA9IHRyYW5zcG9ydCNvcG4KKwltZXRob2QgY2xvc2UgPSB0cmFuc3BvcnQjY2xvc2UKKyAKKwl2YWwgbXV0YWJsZSByZWFkX2J1ZiA9IE5vbmUKKwl2YWwgbXV0YWJsZSByZWFkX2J1Zl9vZmZzZXQgPSAwCisJdmFsIG11dGFibGUgd3JpdGVfYnVmID0gIiIKKworCW1ldGhvZCBwcml2YXRlIHJlYWRfZnJhbWUgPQorCQlsZXQgbGVuX2J1ZiA9IFN0cmluZy5jcmVhdGUgNCBpbgorCQlhc3NlcnQgKHRyYW5zcG9ydCNyZWFkQWxsIGxlbl9idWYgMCA0ID0gNCk7IAorCQkKKwkJbGV0IHNpemUgPSBJbnQzMi50b19pbnQgKGRlY29kZV9mcmFtZV9zaXplIGxlbl9idWYpIGluCisJCQorCQkoaWYgc2l6ZSA8IDAKKwkJdGhlbiBmYWlsd2l0aCAoUHJpbnRmLnNwcmludGYgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICglaSkhIiBzaXplKSk7CisJCQorCQkoaWYgc2l6ZSA+IG1heF9sZW5ndGgKKwkJdGhlbiBmYWlsd2l0aCAoUHJpbnRmLnNwcmludGYgIkZyYW1lIHNpemUgKCVpKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICglaSkhIiBzaXplIG1heF9sZW5ndGgpKTsKKworCQlsZXQgYnVmID0gU3RyaW5nLmNyZWF0ZSBzaXplIGluCisJCQlhc3NlcnQgKHRyYW5zcG9ydCNyZWFkQWxsIGJ1ZiAwIHNpemUgPSBzaXplKTsKKwkJCXJlYWRfYnVmIDwtIFNvbWUgYnVmOworCQkJcmVhZF9idWZfb2Zmc2V0IDwtIDAKKworCW1ldGhvZCBwcml2YXRlIHJlYWRfZnJvbV9mcmFtZSBmcmFtZSBidWYgb2ZmIGxlbiA9CisJCWxldCB0b19jb3B5ID0gbWluIGxlbiAoKFN0cmluZy5sZW5ndGggZnJhbWUpIC0gcmVhZF9idWZfb2Zmc2V0KSBpbgorCQkJU3RyaW5nLmJsaXQgZnJhbWUgcmVhZF9idWZfb2Zmc2V0IGJ1ZiBvZmYgdG9fY29weTsKKwkJCXJlYWRfYnVmX29mZnNldCA8LSByZWFkX2J1Zl9vZmZzZXQgKyB0b19jb3B5OworCQkJdG9fY29weQorCisJbWV0aG9kIHJlYWQgYnVmIG9mZiBsZW4gPSAKKwkJbWF0Y2ggcmVhZF9idWYgd2l0aAorCQl8IFNvbWUgZnJhbWUgLT4gCisJCQlsZXQgaSA9IHNlbGYjcmVhZF9mcm9tX2ZyYW1lIGZyYW1lIGJ1ZiBvZmYgbGVuIGluCisJCQlpZiBpID4gMAorCQkJdGhlbiBpCisJCQllbHNlIGJlZ2luCisJCQkJc2VsZiNyZWFkX2ZyYW1lOyAKKwkJCQlzZWxmI3JlYWRfZnJvbV9mcmFtZSBmcmFtZSBidWYgb2ZmIGxlbgorCQkJZW5kCisJCXwgTm9uZSAtPgorCQkJCXNlbGYjcmVhZF9mcmFtZTsKKwkJCQlzZWxmI3JlYWQgYnVmIG9mZiBsZW4gCisJIAorCW1ldGhvZCB3cml0ZSBidWYgb2ZmIGxlbiA9IAorCQl3cml0ZV9idWYgPC0gd3JpdGVfYnVmIF4gKFN0cmluZy5zdWIgYnVmIG9mZiBsZW4pCisKKwltZXRob2QgZmx1c2ggPSAKKwkJbGV0IGVuY29kZWRfc2l6ZSA9IGVuY29kZV9mcmFtZV9zaXplIChJbnQzMi5vZl9pbnQgKFN0cmluZy5sZW5ndGggd3JpdGVfYnVmKSkgaW4KKwkJCXRyYW5zcG9ydCN3cml0ZSBlbmNvZGVkX3NpemUgMCAoU3RyaW5nLmxlbmd0aCBlbmNvZGVkX3NpemUpOworCQkJdHJhbnNwb3J0I3dyaXRlIHdyaXRlX2J1ZiAwIChTdHJpbmcubGVuZ3RoIHdyaXRlX2J1Zik7CisJCQl0cmFuc3BvcnQjZmx1c2g7IAorCQkJd3JpdGVfYnVmIDwtICIiCitlbmQKKworCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvc3JjL1RTaW1wbGVTZXJ2ZXIubWwgYi9saWIvb2NhbWwvc3JjL1RTaW1wbGVTZXJ2ZXIubWwKaW5kZXggZDE5ZDhjNS4uMjkyN2MwOCAxMDA2NDQKLS0tIGEvbGliL29jYW1sL3NyYy9UU2ltcGxlU2VydmVyLm1sCisrKyBiL2xpYi9vY2FtbC9zcmMvVFNpbXBsZVNlcnZlci5tbApAQCAtMjYsMTMgKzI2LDE1IEBACiAgIG1ldGhvZCBzZXJ2ZSA9CiAgICAgdHJ5CiAgICAgICBzdCNsaXN0ZW47Ci0gICAgICBsZXQgYyA9IHN0I2FjY2VwdCBpbgotICAgICAgbGV0IHRyYW5zID0gdGYjZ2V0VHJhbnNwb3J0IGMgaW4KLSAgICAgIGxldCBpbnAgPSBpcGYjZ2V0UHJvdG9jb2wgdHJhbnMgaW4KLSAgICAgIGxldCBvcCA9IG9wZiNnZXRQcm90b2NvbCB0cmFucyBpbgotICAgICAgICB0cnkKLSAgICAgICAgICB3aGlsZSAocGYjcHJvY2VzcyBpbnAgb3ApIGRvICgpIGRvbmU7Ci0gICAgICAgICAgdHJhbnMjY2xvc2UKLSAgICAgICAgd2l0aCBlIC0+IHRyYW5zI2Nsb3NlOyByYWlzZSBlCisgICAgICB3aGlsZSB0cnVlIGRvCisgICAgICAgIGxldCBjID0gc3QjYWNjZXB0IGluCisgICAgICAgIGxldCB0cmFucyA9IHRmI2dldFRyYW5zcG9ydCBjIGluCisgICAgICAgIGxldCBpbnAgPSBpcGYjZ2V0UHJvdG9jb2wgdHJhbnMgaW4KKyAgICAgICAgbGV0IG9wID0gb3BmI2dldFByb3RvY29sIHRyYW5zIGluCisgICAgICAgICAgdHJ5CisgICAgICAgICAgICB3aGlsZSAocGYjcHJvY2VzcyBpbnAgb3ApIGRvICgpIGRvbmU7CisgICAgICAgICAgICB0cmFucyNjbG9zZQorICAgICAgICAgIHdpdGggZSAtPiB0cmFucyNjbG9zZTsgcmFpc2UgZQorICAgICAgZG9uZQogICAgIHdpdGggXyAtPiAoKQogZW5kCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvc3JjL1RocmlmdC5tbCBiL2xpYi9vY2FtbC9zcmMvVGhyaWZ0Lm1sCmluZGV4IDhkYzlhZmEuLmYwZDdhNDIgMTAwNjQ0Ci0tLSBhL2xpYi9vY2FtbC9zcmMvVGhyaWZ0Lm1sCisrKyBiL2xpYi9vY2FtbC9zcmMvVGhyaWZ0Lm1sCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICBtZXRob2QgdmlydHVhbCB3cml0ZUJvb2wgOiBib29sIC0+IHVuaXQKICAgICBtZXRob2QgdmlydHVhbCB3cml0ZUJ5dGUgOiBpbnQgLT4gdW5pdAogICAgIG1ldGhvZCB2aXJ0dWFsIHdyaXRlSTE2IDogaW50IC0+IHVuaXQKLSAgICBtZXRob2QgdmlydHVhbCB3cml0ZUkzMiA6IGludCAtPiB1bml0CisgICAgbWV0aG9kIHZpcnR1YWwgd3JpdGVJMzIgOiBJbnQzMi50IC0+IHVuaXQKICAgICBtZXRob2QgdmlydHVhbCB3cml0ZUk2NCA6IEludDY0LnQgLT4gdW5pdAogICAgIG1ldGhvZCB2aXJ0dWFsIHdyaXRlRG91YmxlIDogZmxvYXQgLT4gdW5pdAogICAgIG1ldGhvZCB2aXJ0dWFsIHdyaXRlU3RyaW5nIDogc3RyaW5nIC0+IHVuaXQKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRCb29sIDogYm9vbAogICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRCeXRlIDogaW50CiAgICAgbWV0aG9kIHZpcnR1YWwgcmVhZEkxNiA6IGludAotICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRJMzI6IGludAorICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRJMzI6IEludDMyLnQKICAgICBtZXRob2QgdmlydHVhbCByZWFkSTY0IDogSW50NjQudAogICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWREb3VibGUgOiBmbG9hdAogICAgIG1ldGhvZCB2aXJ0dWFsIHJlYWRTdHJpbmcgOiBzdHJpbmcKQEAgLTI2MSw2ICsyNjEsOCBAQAogICAgICAgfCBORUdBVElWRV9TSVpFCiAgICAgICB8IFNJWkVfTElNSVQKICAgICAgIHwgQkFEX1ZFUlNJT04KKyAgICAgIHwgTk9UX0lNUExFTUVOVEVECisgICAgICB8IERFUFRIX0xJTUlUCiAKICAgZXhjZXB0aW9uIEUgb2YgZXhuX3R5cGUgKiBzdHJpbmc7OwogCkBAIC0yOTIsMjIgKzI5NCwzNyBAQAogICAgICAgfCBXUk9OR19NRVRIT0RfTkFNRQogICAgICAgfCBCQURfU0VRVUVOQ0VfSUQKICAgICAgIHwgTUlTU0lOR19SRVNVTFQKKyAgICAgIHwgSU5URVJOQUxfRVJST1IKKyAgICAgIHwgUFJPVE9DT0xfRVJST1IKKyAgICAgIHwgSU5WQUxJRF9UUkFOU0ZPUk0KKyAgICAgIHwgSU5WQUxJRF9QUk9UT0NPTAorICAgICAgfCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRQogCiAgIGxldCB0eXBfb2ZfaSA9IGZ1bmN0aW9uCi0gICAgICAwIC0+IFVOS05PV04KLSAgICB8IDEgLT4gVU5LTk9XTl9NRVRIT0QKLSAgICB8IDIgLT4gSU5WQUxJRF9NRVNTQUdFX1RZUEUKLSAgICB8IDMgLT4gV1JPTkdfTUVUSE9EX05BTUUKLSAgICB8IDQgLT4gQkFEX1NFUVVFTkNFX0lECi0gICAgfCA1IC0+IE1JU1NJTkdfUkVTVUxUCisgICAgICAwbCAtPiBVTktOT1dOCisgICAgfCAxbCAtPiBVTktOT1dOX01FVEhPRAorICAgIHwgMmwgLT4gSU5WQUxJRF9NRVNTQUdFX1RZUEUKKyAgICB8IDNsIC0+IFdST05HX01FVEhPRF9OQU1FCisgICAgfCA0bCAtPiBCQURfU0VRVUVOQ0VfSUQKKyAgICB8IDVsIC0+IE1JU1NJTkdfUkVTVUxUCisgICAgfCA2bCAtPiBJTlRFUk5BTF9FUlJPUgorICAgIHwgN2wgLT4gUFJPVE9DT0xfRVJST1IKKyAgICB8IDhsIC0+IElOVkFMSURfVFJBTlNGT1JNCisgICAgfCA5bCAtPiBJTlZBTElEX1BST1RPQ09MCisgICAgfCAxMGwgLT4gVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUKICAgICB8IF8gLT4gcmFpc2UgVGhyaWZ0X2Vycm9yOzsKICAgbGV0IHR5cF90b19pID0gZnVuY3Rpb24KLSAgICB8IFVOS05PV04gLT4gMAotICAgIHwgVU5LTk9XTl9NRVRIT0QgLT4gMQotICAgIHwgSU5WQUxJRF9NRVNTQUdFX1RZUEUgLT4gMgotICAgIHwgV1JPTkdfTUVUSE9EX05BTUUgLT4gMwotICAgIHwgQkFEX1NFUVVFTkNFX0lEIC0+IDQKLSAgICB8IE1JU1NJTkdfUkVTVUxUIC0+IDUKKyAgICB8IFVOS05PV04gLT4gMGwKKyAgICB8IFVOS05PV05fTUVUSE9EIC0+IDFsCisgICAgfCBJTlZBTElEX01FU1NBR0VfVFlQRSAtPiAybAorICAgIHwgV1JPTkdfTUVUSE9EX05BTUUgLT4gM2wKKyAgICB8IEJBRF9TRVFVRU5DRV9JRCAtPiA0bAorICAgIHwgTUlTU0lOR19SRVNVTFQgLT4gNWwKKyAgICB8IElOVEVSTkFMX0VSUk9SIC0+IDZsCisgICAgfCBQUk9UT0NPTF9FUlJPUiAtPiA3bAorICAgIHwgSU5WQUxJRF9UUkFOU0ZPUk0gLT4gOGwKKyAgICB8IElOVkFMSURfUFJPVE9DT0wgLT4gOWwKKyAgICB8IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIC0+IDEwbAogCiAgIGNsYXNzIHQgPQogICBvYmplY3QgKHNlbGYpCkBAIC0zMzcsMjMgKzM1NCwyMSBAQAogCiAgIGxldCByZWFkIChpcHJvdCA6IFByb3RvY29sLnQpID0KICAgICBsZXQgbXNnID0gcmVmICIiIGluCi0gICAgbGV0IHR5cCA9IHJlZiAwIGluCisgICAgbGV0IHR5cCA9IHJlZiAwbCBpbgogICAgICAgaWdub3JlIGlwcm90I3JlYWRTdHJ1Y3RCZWdpbjsKICAgICAgICh0cnkKICAgICAgICAgICAgd2hpbGUgdHJ1ZSBkbwogICAgICAgICAgICAgIGxldCAobmFtZSxmdCxpZCkgPWlwcm90I3JlYWRGaWVsZEJlZ2luIGluCi0gICAgICAgICAgICAgICBpZiBmdCA9IFByb3RvY29sLlRfU1RPUCB0aGVuCi0gICAgICAgICAgICAgICAgIHJhaXNlIEJyZWFrCisgICAgICAgICAgICAgICBpZiBmdCA9IFByb3RvY29sLlRfU1RPUAorICAgICAgICAgICAgICAgdGhlbiByYWlzZSBCcmVhawogICAgICAgICAgICAgICAgZWxzZSAoKTsKICAgICAgICAgICAgICAgIChtYXRjaCBpZCB3aXRoCi0gICAgICAgICAgICAgfCAxIC0+IChpZiBmdCA9IFByb3RvY29sLlRfU1RSSU5HIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgOj0gKGlwcm90I3JlYWRTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXByb3Qjc2tpcCBmdCkKLSAgICAgICAgICAgICB8IDIgLT4gKGlmIGZ0ID0gUHJvdG9jb2wuVF9JMzIgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cCA6PSBpcHJvdCNyZWFkSTMyCi0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXByb3Qjc2tpcCBmdCkKKyAgICAgICAgICAgICB8IDEgLT4gKGlmIGZ0ID0gUHJvdG9jb2wuVF9TVFJJTkcKKyAgICAgICAgICAgICAgIHRoZW4gbXNnIDo9IChpcHJvdCNyZWFkU3RyaW5nKQorICAgICAgICAgICAgICAgZWxzZSBpcHJvdCNza2lwIGZ0KQorICAgICAgICAgICAgIHwgMiAtPiAoaWYgZnQgPSBQcm90b2NvbC5UX0kzMgorICAgICAgICAgICAgICAgdGhlbiB0eXAgOj0gaXByb3QjcmVhZEkzMgorICAgICAgICAgICAgICAgZWxzZSBpcHJvdCNza2lwIGZ0KQogICAgICAgICAgICAgIHwgXyAtPiBpcHJvdCNza2lwIGZ0KTsKICAgICAgICAgICAgICAgIGlwcm90I3JlYWRGaWVsZEVuZAogICAgICAgZG9uZQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3VybCBiL2xpYi9vY2FtbC91cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0ZDYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC91cmwKQEAgLTAsMCArMSwyIEBACithcmNoaXZlOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBVUkwpIgorY2hlY2tzdW06ICJYWFgoRklMTCBNRSBJTiBXSVRIIE1ENSkiCmRpZmYgLS1naXQgYS9saWIvcGVybC9NQU5JRkVTVC5TS0lQIGIvbGliL3BlcmwvTUFOSUZFU1QuU0tJUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTYzYjQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvTUFOSUZFU1QuU0tJUApAQCAtMCwwICsxLDEzIEBACitibGliLy4qJAorYnVpbGQtY3Bhbi1kaXN0LnNoCitGaXh1cERpc3QucGwKK01BTklGRVNULmJhaworTUFOSUZFU1QuU0tJUAorTVlNRVRBLmpzb24KK01ha2VmaWxlCitNYWtlZmlsZS5hbQorTWFrZWZpbGUuaW4KK3BtX3RvX2JsaWIKK3Rlc3QvTWFrZWZpbGUuYW0KK3Rlc3QvTWFrZWZpbGUuaW4KK3Rvb2xzL0ZpeHVwRGlzdC5wbApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTWFrZWZpbGUuUEwgYi9saWIvcGVybC9NYWtlZmlsZS5QTAppbmRleCA5NGVhMzdjLi5iZGVhYWQyIDEwMDY0NAotLS0gYS9saWIvcGVybC9NYWtlZmlsZS5QTAorKysgYi9saWIvcGVybC9NYWtlZmlsZS5QTApAQCAtMTcsMTMgKzE3LDIwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwogdXNlIEV4dFV0aWxzOjpNYWtlTWFrZXI7Ci1Xcml0ZU1ha2VmaWxlKCAnTkFNRScgPT4gJ1RocmlmdCcsCi0gICAgICAgICAgICAgICAnVkVSU0lPTl9GUk9NJyA9PiAnbGliL1RocmlmdC5wbScsCi0gICAgICAgICAgICAgICAnUFJFUkVRX1BNJyAgICAgICAgICAgICAgPT4gewotICAgICAgICAgICAgICAgICAgICdCaXQ6OlZlY3RvcicgPT4gMCwKKworV3JpdGVNYWtlZmlsZSggQUJTVFJBQ1QgPT4gJ0FwYWNoZSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LicsCisgICAgICAgICAgICAgICBBVVRIT1IgPT4gJ0FwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4nLAorICAgICAgICAgICAgICAgTElDRU5TRSA9PiAnYXBhY2hlXzJfMCcsCisgICAgICAgICAgICAgICBNSU5fUEVSTF9WRVJTSU9OID0+ICc1LjAxMDAwMCcsCisgICAgICAgICAgICAgICBOQU1FID0+ICdUaHJpZnQnLAorICAgICAgICAgICAgICAgTkVFRFNfTElOS0lORyA9PiAwLAorICAgICAgICAgICAgICAgUFJFUkVRX1BNID0+IHsKKyAgICAgICAgICAgICAgICAgICAnQml0OjpWZWN0b3InICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICdDbGFzczo6QWNjZXNzb3InID0+IDAKICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAoJF0gPj0gNS4wMDUgPwotICggICAgICAgICAgICAgICAgQVVUSE9SICAgICA9PiAnVCBKYWtlIEx1Y2lhbmkgPGpha2Vyc0BnbWFpbC5jb20+JykgOiAoKSksCi0gICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgVkVSU0lPTl9GUk9NID0+ICdsaWIvVGhyaWZ0LnBtJyApOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTWFrZWZpbGUuYW0gYi9saWIvcGVybC9NYWtlZmlsZS5hbQppbmRleCBlYjE5NTYwLi5mYTBmMTZiIDEwMDY0NAotLS0gYS9saWIvcGVybC9NYWtlZmlsZS5hbQorKysgYi9saWIvcGVybC9NYWtlZmlsZS5hbQpAQCAtMjAsMzYgKzIwLDg5IEBACiBTVUJESVJTID0gdGVzdAogCiBNYWtlZmlsZS1wZXJsLm1rIDogTWFrZWZpbGUuUEwKLQkkKFBFUkwpIE1ha2VmaWxlLlBMIE1BS0VGSUxFPU1ha2VmaWxlLXBlcmwubWsgSU5TVEFMTERJUlM9JChJTlNUQUxMRElSUykKKwkkKFBFUkwpIE1ha2VmaWxlLlBMIE1BS0VGSUxFPU1ha2VmaWxlLXBlcmwubWsgSU5TVEFMTERJUlM9JChJTlNUQUxMRElSUykgSU5TVEFMTF9CQVNFPSQoUEVSTF9QUkVGSVgpCiAKIGFsbC1sb2NhbDogTWFrZWZpbGUtcGVybC5tawotCSQoTUFLRSkgLWYgTWFrZWZpbGUtcGVybC5taworCSQoTUFLRSkgLWYgJDwKIAlmaW5kIGJsaWIgLW5hbWUgJ01ha2VmaWxlKicgLWV4ZWMgcm0gLWYge30gXDsKIAotY2hlY2stbG9jYWw6Ci0JJChQRVJMKSAtSWJsaWIvbGliIC1JQGFic19zcmNkaXJAIC1JQGJ1aWxkZGlyQC90ZXN0L2dlbi1wZXJsIFwKLQkJQGFic19zcmNkaXJAL3Rlc3QucGwgQGFic19zcmNkaXJAL3Rlc3QvKi50Ci0KIGluc3RhbGwtZXhlYy1sb2NhbDogTWFrZWZpbGUtcGVybC5tawotCSQoTUFLRSkgLWYgTWFrZWZpbGUtcGVybC5tayBpbnN0YWxsIERFU1RESVI9JChERVNURElSKS8KKwkkKE1BS0UpIC1mICQ8IGluc3RhbGwgREVTVERJUj0kKERFU1RESVIpLwogCiBjbGVhbi1sb2NhbDoKIAlpZiB0ZXN0IC1mIE1ha2VmaWxlLXBlcmwubWsgOyB0aGVuIFwKIAkJJChNQUtFKSAtZiBNYWtlZmlsZS1wZXJsLm1rIGNsZWFuIDsgXAogCWZpCi0Jcm0gLWYgTWFrZWZpbGUtcGVybC5tay5vbGQKKwkkKFJNKSBNYWtlZmlsZS1wZXJsLm1rLm9sZAorCSQoUk0pIC1yIGdlbi1wZXJsIGdlbi1wZXJsMgogCiBFWFRSQV9ESVNUID0gXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCWJ1aWxkLWNwYW4tZGlzdC5zaCBcCiAJTWFrZWZpbGUuUEwgXAogCXRlc3QucGwgXAogCWxpYi9UaHJpZnQucG0gXAogCWxpYi9UaHJpZnQucG0gXAogCWxpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0gXAogCWxpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0gXAorCWxpYi9UaHJpZnQvRXhjZXB0aW9uLnBtIFwKIAlsaWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbSBcCiAJbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtIFwKIAlsaWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbSBcCisJbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbSBcCisJbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbSBcCisJbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtIFwKIAlsaWIvVGhyaWZ0L1Byb3RvY29sLnBtIFwKKwlsaWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtIFwKIAlsaWIvVGhyaWZ0L1NlcnZlci5wbSBcCisJbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0gXAogCWxpYi9UaHJpZnQvU29ja2V0LnBtIFwKLQlsaWIvVGhyaWZ0L1RyYW5zcG9ydC5wbQorCWxpYi9UaHJpZnQvU1NMU29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbSBcCisJbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvVHlwZS5wbSBcCisJbGliL1RocmlmdC9UcmFuc3BvcnQucG0gXAorCVJFQURNRS5tZAorCitUSFJJRlQgPSBAdG9wX2J1aWxkZGlyQC9jb21waWxlci9jcHAvdGhyaWZ0CitUSFJJRlRfSUYgPSBAdG9wX3NyY2RpckAvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorTkFNRV9CRU5DSE1BUktTRVJWSUNFID0gIEB0b3Bfc3JjZGlyQC9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQKK05BTUVfQUdHUiA9IEB0b3Bfc3JjZGlyQC9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKKworVEhSSUZUVEVTVF9HRU4gPSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9Db25zdGFudHMucG0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvU2Vjb25kU2VydmljZS5wbSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnBtIFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L1R5cGVzLnBtCisKK0JFTkNITUFSS19HRU4gPSBcCisJZ2VuLXBlcmwvQmVuY2htYXJrU2VydmljZS5wbSBcCisJZ2VuLXBlcmwvQ29uc3RhbnRzLnBtIFwKKwlnZW4tcGVybC9UeXBlcy5wbQorCitBR0dSX0dFTiA9IFwKKwlnZW4tcGVybDIvQWdnci5wbSBcCisJZ2VuLXBlcmwyL0NvbnN0YW50cy5wbSBcCisJZ2VuLXBlcmwyL1R5cGVzLnBtCisKK1BFUkxfR0VOID0gXAorCSQoVEhSSUZUVEVTVF9HRU4pIFwKKwkkKEJFTkNITUFSS19HRU4pIFwKKwkkKEFHR1JfR0VOKQorCitCVUlMVF9TT1VSQ0VTID0gJChQRVJMX0dFTikKKworY2hlY2stbG9jYWw6ICQoUEVSTF9HRU4pCisJJChQRVJMKSAtSWJsaWIvbGliIC1JQGFic19zcmNkaXJAIC1JQGJ1aWxkZGlyQC9nZW4tcGVybDIgLUlAYnVpbGRkaXJAL2dlbi1wZXJsIFwKKwkJQGFic19zcmNkaXJAL3Rlc3QucGwgQGFic19zcmNkaXJAL3Rlc3QvKi50CisKKyQoVEhSSUZUVEVTVF9HRU4pOiAkKFRIUklGVF9JRikgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIHBlcmwgJDwKKworJChCRU5DSE1BUktfR0VOKTogJChOQU1FX0JFTkNITUFSS1NFUlZJQ0UpICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBwZXJsICQ8CisKKyQoQUdHUl9HRU4pOiAkKE5BTUVfQUdHUikgJChUSFJJRlQpCisJJChNS0RJUl9QKSBnZW4tcGVybDIKKwkkKFRIUklGVCkgLW91dCBnZW4tcGVybDIgLS1nZW4gcGVybCAkPApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvUkVBRE1FIGIvbGliL3BlcmwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTE0ODhiLi4wMDAwMDAwCi0tLSBhL2xpYi9wZXJsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLVRocmlmdCBQZXJsIFNvZnR3YXJlIExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVXNpbmcgVGhyaWZ0IHdpdGggUGVybAotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRocmlmdCByZXF1aXJlcyBQZXJsID49IDUuNi4wCi0KLUV4Y2VwdGlvbnMgYXJlIHRocm93biB3aXRoIGRpZSBzbyBiZSBzdXJlIHRvIHdyYXAgZXZhbHt9IHN0YXRtZW50cwotYXJvdW5kIGFueSBjb2RlIHRoYXQgY29udGFpbnMgZXhjZXB0aW9ucy4KLQotVGhlIDY0Yml0IEludGVnZXJzIHdvcmsgb25seSB1cHRvIDJeNDIgb24gbXkgbWFjaGluZSA6LT8KLU1hdGg6OkJpZ0ludCBpcyBwcm9iYWJseSBuZWVkZWQuCi0KLVBsZWFzZSBzZWUgdHV0b3JhbCBhbmQgdGVzdCBkaXJzIGZvciBleGFtcGxlcy4uLgotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotCi1CaXQ6OlZlY3RvciAgICAgLSBjb21lcyB3aXRoIG1vZGVybiBwZXJsIGluc3RhbGxhdGlvbnMuCi1DbGFzczo6QWNjZXNzb3IKLQpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvUkVBRE1FLm1kIGIvbGliL3BlcmwvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMWU1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9SRUFETUUubWQKQEAgLTAsMCArMSwxMjQgQEAKK1RocmlmdCBQZXJsIFNvZnR3YXJlIExpYnJhcnkKKworIyBTdW1tYXJ5CisKK0FwYWNoZSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LgorSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsKK2VmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBBIGxhbmd1YWdlLW5ldXRyYWwgSURMCitpcyB1c2VkIHRvIGdlbmVyYXRlIGZ1bmN0aW9uaW5nIGNsaWVudCBsaWJyYXJpZXMgYW5kIHNlcnZlci1zaWRlIGhhbmRsaW5nIGZyYW1ld29ya3MuCisKKyMgTGljZW5zZQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyBGb3IgTW9yZSBJbmZvcm1hdGlvbgorCitTZWUgdGhlIFtBcGFjaGUgVGhyaWZ0IFdlYiBTaXRlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIyBVc2luZyBUaHJpZnQgd2l0aCBQZXJsCisKK1RocmlmdCByZXF1aXJlcyBQZXJsID49IDUuMTAuMAorCitVbmV4cGVjdGVkIGV4Y2VwdGlvbnMgaW4gYSBzZXJ2aWNlIGhhbmRsZXIgYXJlIGNvbnZlcnRlZCB0bworVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHdpdGggdHlwZSBJTlRFUk5BTCBFUlJPUiBhbmQgdGhlIHN0cmluZworb2YgdGhlIGV4Y2VwdGlvbiBpcyBkZWxpdmVyZWQgYXMgdGhlIG1lc3NhZ2UuCisKK09uIHRoZSBjbGllbnQgc2lkZSwgZXhjZXB0aW9ucyBhcmUgdGhyb3duIHdpdGggZGllLCBzbyBiZSBzdXJlCit0byB3cmFwIGV2YWx7fSBzdGF0bWVudHMgYXJvdW5kIGFueSBjb2RlIHRoYXQgY29udGFpbnMgZXhjZXB0aW9ucy4KKworUGxlYXNlIHNlZSB0dXRvcmFsIGFuZCB0ZXN0IGRpcnMgZm9yIGV4YW1wbGVzLgorCitUaGUgUGVybCBGb3JraW5nU2VydmVyIGlnbm9yZXMgU0lHQ0hMRCBhbGxvd2luZyB0aGUgZm9ya3MgdG8gYmUKK3JlYXBlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYXR1cmFsbHkgd2hlbiB0aGV5IGV4aXQuICBUaGlzIG1lYW5zCitvbmUgY2Fubm90IHVzZSBhIGN1c3RvbSBTSUdDSExEIGhhbmRsZXIgaW4gdGhlIGNvbnN1bWluZyBwZXJsCitpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbGxzIHNlcnZlKCkuICBJdCBpcyBhY2NlcHRhYmxlIHRvIHVzZQorYSBjdXN0b20gU0lHQ0hMRCBoYW5kbGVyIHdpdGhpbiBhIHRocmlmdCBoYW5kbGVyIGltcGxlbWVudGF0aW9uCithcyB0aGUgRm9ya2luZ1NlcnZlciByZXNldHMgdGhlIGZvcmtlZCBjaGlsZCBwcm9jZXNzIHRvIHVzZQorZGVmYXVsdCBzaWduYWwgaGFuZGxpbmcuCisKKyMgRGVwZW5kZW5jaWVzCisKK1RoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgbm90IHByb3ZpZGVkIGJ5IFBlcmwgNS4xMC4wIGJ1dCBhcmUgcmVxdWlyZWQKK3RvIHVzZSBUaHJpZnQuCisKKyMjIFJ1bnRpbWUKKworICAqIEJpdDo6VmVjdG9yCisgICogQ2xhc3M6OkFjY2Vzc29yCisKKyMjIyBIdHRwQ2xpZW50IFRyYW5zcG9ydAorCitUaGVzZSBhcmUgb25seSByZXF1aXJlZCBpZiB1c2luZyBUaHJpZnQ6Okh0dHBDbGllbnQ6CisKKyAgKiBIVFRQOjpSZXF1ZXN0CisgICogSU86OlN0cmluZworICAqIExXUDo6VXNlckFnZW50CisKKyMjIyBTU0wvVExTCisKK1RoZXNlIGFyZSBvbmx5IHJlcXVpcmVkIGlmIHVzaW5nIFRocmlmdDo6U1NMU29ja2V0IG9yIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OgorCisgICogSU86OlNvY2tldDo6U1NMCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEwLjAKKworVGhlIHNvY2tldCBjbGFzc2VzIHdlcmUgcmVmYWN0b3JlZCBpbiAwLjEwLjAgc28gdGhhdCB0aGVyZSBpcyBvbmUgcGFja2FnZSBwZXIKK2ZpbGUuICBUaGlzIG1lYW5zIGB1c2UgU29ja2V0O2Agbm8gbG9uZ2VyIGRlZmluZXMgU1NMU29ja2V0LiAgWW91IGNhbiB1c2UgdGhpcwordGVjaG5pcXVlIHRvIG1ha2UgeW91ciBhcHBsaWNhdGlvbiBydW4gYWdhaW5zdCAwLjEwLjAgYXMgd2VsbCBhcyBlYXJsaWVyIHZlcnNpb25zOgorCitgZXZhbCB7IHJlcXVpcmUgVGhyaWZ0OjpTU0xTb2NrZXQ7IH0gb3IgZG8geyByZXF1aXJlIFRocmlmdDo6U29ja2V0OyB9YAorCisjIyAwLjExLjAKKworICAqIE5hbWVzcGFjZXMgb2YgcGFja2FnZXMgdGhhdCB3ZXJlIG5vdCBzY29wZWQgd2l0aGluIFRocmlmdCBoYXZlIGJlZW4gZml4ZWQuCisgICoqIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgKiogVEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpURXhjZXB0aW9uCisgICoqIFRNZXNzYWdlVHlwZSBpcyBub3cgVGhyaWZ0OjpUTWVzc2FnZVR5cGUKKyAgKiogVFByb3RvY29sRXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbgorICAqKiBUUHJvdG9jb2xGYWN0b3J5IGlzIG5vdyBUaHJpZnQ6OlRQcm90b2NvbEZhY3RvcnkKKyAgKiogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uCisgICoqIFRUeXBlIGlzIG5vdyBUaHJpZnQ6OlRUeXBlCisKK0lmIHlvdSBuZWVkIGEgc2luZ2xlIHZlcnNpb24gb2YgeW91ciBjb2RlIHRvIHdvcmsgd2l0aCBib3RoIG9sZGVyIGFuZCBuZXdlciB0aHJpZnQKK25hbWVzcGFjZSBjaGFuZ2VzLCB5b3UgY2FuIG1ha2UgdGhlIG5ldywgY29ycmVjdCBuYW1lc3BhY2VzIGJlaGF2ZSBsaWtlIHRoZSBvbGQgb25lcworaW4geW91ciBmaWxlcyB3aXRoIHRoaXMgdGVjaG5pcXVlIHRvIGNyZWF0ZSBhbiBhbGlhcywgd2hpY2ggd2lsbCBhbGxvdyB5b3UgY29kZSB0bworcnVuIGFnYWluc3QgZWl0aGVyIHZlcnNpb24gb2YgdGhlIHBlcmwgcnVudGltZSBmb3IgdGhyaWZ0OgorCitgQkVHSU4geypUVHlwZTo6ID0gKlRocmlmdDo6VFR5cGU6On1gCisKKyAgKiBQYWNrYWdlcyBmb3VuZCBpbiBUaHJpZnQucG0gd2VyZSBtb3ZlZCBpbnRvIHRoZSBUaHJpZnQvIGRpcmVjdG9yeSBpbiBzZXBhcmF0ZSBmaWxlczoKKyAgKiogVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgbm93IGluIFRocmlmdC9FeGNlcHRpb24ucG0KKyAgKiogVGhyaWZ0OjpURXhjZXB0aW9uIGlzIG5vdyBpbiBUaHJpZnQvRXhjZXB0aW9uLnBtCisgICoqIFRocmlmdDo6VE1lc3NhZ2VUeXBlIGlzIG5vdyBpbiBUaHJpZnQvTWVzc2FnZVR5cGUucG0KKyAgKiogVGhyaWZ0OjpUVHlwZSBpcyBub3cgaW4gVGhyaWZ0L1R5cGUucG0KKworSWYgeW91IG5lZWQgdG8gbW9kaWZ5IHlvdXIgY29kZSB0byB3b3JrIGFnYWluc3QgYm90aCBvbGRlciBvciBuZXdlciB0aHJpZnQgdmVyc2lvbnMsCit5b3UgY2FuIGRlYWwgd2l0aCB0aGVzZSBjaGFuZ2VzIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5IGluIHlvdXIgcHJvamVjdHMgdXNpbmcgZXZhbDoKKworYGV2YWwgIHsgcmVxdWlyZSBUaHJpZnQ6OkV4Y2VwdGlvbjsgcmVxdWlyZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOyByZXF1aXJlIFRocmlmdDo6VHlwZTsgfQorIG9yIGRvIHsgcmVxdWlyZSBUaHJpZnQ7IH1gCisKKyMgRGVwcmVjYXRpb25zCisKKyMjIDAuMTEuMAorCitUaHJpZnQ6Okh0dHBDbGllbnQgc2V0UmVjdlRpbWVvdXQoKSBhbmQgc2V0U2VuZFRpbWVvdXQoKSBhcmUgZGVwcmVjYXRlZC4gCitVc2Ugc2V0VGltZW91dCBpbnN0ZWFkLgorCmRpZmYgLS1naXQgYS9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2ggYi9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWUyMmU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2J1aWxkLWNwYW4tZGlzdC5zaApAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vYmFzaAorIworIyBUaGlzIHNjcmlwdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFmdGVyIHRhZ2dpbmcgdGhlIHJlcG9zaXRvcnkgYW5kIHVwZGF0aW5nCisjIHRoZSB2ZXJzaW9uIGZpbGVzIGZvciBhIHJlbGVhc2UuICBJdCB3aWxsIGNyZWF0ZSBhIENQQU4gYXJjaGl2ZS4gIFJ1biB0aGlzCisjIGZyb20gaW5zaWRlIGEgZG9ja2VyIGltYWdlIGxpa2UgdWJ1bnR1LXhlbmlhbC4KKyMKKworc2V0IC1lCisKK3JtIC1mIE1BTklGRVNUCitybSAtcmYgVGhyaWZ0LSoKKworIyBzZXR1cCBjcGFuIHdpdGhvdXQgYSBwcm9tcHQKK2VjaG8gfCBjcGFuCitjcGFuIGluc3RhbGwgSFRUUDo6RGF0ZQorY3BhbiBpbnN0YWxsIENQQU4KK2NwYW4gaW5zdGFsbCBDUEFOOjpNZXRhIEV4dFV0aWxzOjpNYWtlTWFrZXIgSlNPTjo6UFAKKworcGVybCBNYWtlZmlsZS5QTAorcm0gTVlNRVRBLnltbAorbWFrZSBtYW5pZmVzdAorbWFrZSBkaXN0CisKKyMKKyMgV2UgdW5wYWNrIHRoZSBhcmNoaXZlIHNvIHdlIGNhbiBhZGQgdmVyc2lvbiBtZXRhZGF0YSBmb3IgQ1BBTgorIyBzbyB0aGF0IGl0IHByb3Blcmx5IGluZGV4ZXMgVGhyaWZ0IGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgZmlsZXMuCisjCisKK2VjaG8gJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworc2V0IC14CisKK0RJU1RGSUxFPSQobHMgVGhyaWZ0Ki5neikKK05FV0ZJTEU9JHtESVNURklMRS90LXYvdC19CitpZiBbWyAiJERJU1RGSUxFIiAhPSAiJE5FV0ZJTEUiIF1dOyB0aGVuCisgICAgbXYgJERJU1RGSUxFICRORVdGSUxFCisgICAgRElTVEZJTEU9IiRORVdGSUxFIgorZmkKK3RhciB4emYgJERJU1RGSUxFCitybSAkRElTVEZJTEUKK0RJU1RESVI9JChscyAtZCBUaHJpZnQqKQorIyBjcGFuIGRvZXNuJ3QgbGlrZSAiVGhyaWZ0LXYwLm5uLjAgYXMgYSBkaXJlY3RvcnkgbmFtZQorIyBuZWVkcyB0byBiZSBUaHJpZnQtMC5ubi4wCitORVdESVI9JHtESVNURElSL3Qtdi90LX0KK2lmIFtbICIkRElTVERJUiIgIT0gIiRORVdESVIiIF1dOyB0aGVuCisgICAgbXYgJERJU1RESVIgJE5FV0RJUgorICAgIERJU1RESVI9IiRORVdESVIiCitmaQorY2QgJERJU1RESVIKK2NwIC1wIC4uL01ha2VmaWxlLlBMIC4KK3BlcmwgLi4vdG9vbHMvRml4dXBEaXN0LnBsCitjZCAuLgordGFyIGN2emYgJERJU1RGSUxFICRESVNURElSCitybSAtciAkRElTVERJUgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlODI1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSwyIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkuCitBZGRpdGlvbmFsIHBlcmwgY29kaW5nIHN0YW5kYXJkcyBjYW4gYmUgZm91bmQgaW4gW3BlcmxzdHlsZV0oaHR0cDovL3Blcmxkb2MucGVybC5vcmcvcGVybHN0eWxlLmh0bWwpLgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0KaW5kZXggZmUwZjhlNy4uYWI0MDkzMCAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0LnBtCkBAIC0xNywxNjEgKzE3LDIwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1vdXIgJFZFUlNJT04gPSAnMC4xJzsKLQotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiAjCi0jIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CisjIFZlcnNpb25pbmcKICMKLXBhY2thZ2UgVFR5cGU7Ci11c2UgY29uc3RhbnQgU1RPUCAgID0+IDA7Ci11c2UgY29uc3RhbnQgVk9JRCAgID0+IDE7Ci11c2UgY29uc3RhbnQgQk9PTCAgID0+IDI7Ci11c2UgY29uc3RhbnQgQllURSAgID0+IDM7Ci11c2UgY29uc3RhbnQgSTA4ICAgID0+IDM7Ci11c2UgY29uc3RhbnQgRE9VQkxFID0+IDQ7Ci11c2UgY29uc3RhbnQgSTE2ICAgID0+IDY7Ci11c2UgY29uc3RhbnQgSTMyICAgID0+IDg7Ci11c2UgY29uc3RhbnQgSTY0ICAgID0+IDEwOwotdXNlIGNvbnN0YW50IFNUUklORyA9PiAxMTsKLXVzZSBjb25zdGFudCBVVEY3ICAgPT4gMTE7Ci11c2UgY29uc3RhbnQgU1RSVUNUID0+IDEyOwotdXNlIGNvbnN0YW50IE1BUCAgICA9PiAxMzsKLXVzZSBjb25zdGFudCBTRVQgICAgPT4gMTQ7Ci11c2UgY29uc3RhbnQgTElTVCAgID0+IDE1OwotdXNlIGNvbnN0YW50IFVURjggICA9PiAxNjsKLXVzZSBjb25zdGFudCBVVEYxNiAgPT4gMTc7Ci0xOwotCisjIEV2ZXJ5IHBlcmwgbW9kdWxlIGZvciBUaHJpZnQgd2lsbCBoYXZlIHRoZSBzYW1lIHZlcnNpb24KKyMgZGVjbGFyYXRpb24uICBGb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBjaGFuZ2UgaXQgYmVsb3cgdG8KKyMgc29tZXRoaW5nIGxpa2UgInYwLjExLjAiIGFuZCBhbGwgb2YgdGhlIHBhY2thZ2VzIGluIGFsbAorIyBvZiB0aGUgZmlsZXMgd2lsbCBwaWNrIGl0IHVwIGZyb20gaGVyZS4KICMKLSMgTWVzc2FnZSB0eXBlcyBmb3IgUlBDCi0jCi1wYWNrYWdlIFRNZXNzYWdlVHlwZTsKLXVzZSBjb25zdGFudCBDQUxMICAgICAgPT4gMTsKLXVzZSBjb25zdGFudCBSRVBMWSAgICAgPT4gMjsKLXVzZSBjb25zdGFudCBFWENFUFRJT04gPT4gMzsKLXVzZSBjb25zdGFudCBPTkVXQVkgICAgPT4gNDsKLTE7CiAKLXBhY2thZ2UgVGhyaWZ0OjpURXhjZXB0aW9uOwotCi1zdWIgbmV3IHsKLSAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7Ci0gICAgbXkgJHNlbGYgPSB7bWVzc2FnZSA9PiBzaGlmdCwgY29kZSA9PiBzaGlmdCB8fCAwfTsKLQotICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKLX0KLTE7Ci0KLXBhY2thZ2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwotdXNlIGJhc2UoJ1RocmlmdDo6VEV4Y2VwdGlvbicpOwotCi11c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgICAgICAgPT4gMDsKLXVzZSBjb25zdGFudCBVTktOT1dOX01FVEhPRCAgICAgICA9PiAxOwotdXNlIGNvbnN0YW50IElOVkFMSURfTUVTU0FHRV9UWVBFID0+IDI7Ci11c2UgY29uc3RhbnQgV1JPTkdfTUVUSE9EX05BTUUgICAgPT4gMzsKLXVzZSBjb25zdGFudCBCQURfU0VRVUVOQ0VfSUQgICAgICA9PiA0OwotdXNlIGNvbnN0YW50IE1JU1NJTkdfUkVTVUxUICAgICAgID0+IDU7Ci0KLXN1YiBuZXcgewotICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKLQotICAgIG15ICRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygpOwotCi0gICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwotfQotCi1zdWIgcmVhZCB7Ci0gICAgbXkgJHNlbGYgID0gc2hpZnQ7Ci0gICAgbXkgJGlucHV0ID0gc2hpZnQ7Ci0KLSAgICBteSAkeGZlciAgPSAwOwotICAgIG15ICRmbmFtZSA9IHVuZGVmOwotICAgIG15ICRmdHlwZSA9IDA7Ci0gICAgbXkgJGZpZCAgID0gMDsKLQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7Ci0KLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOwotICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBsYXN0OyBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgIFNXSVRDSDogZm9yKCRmaWQpCi0gICAgICB7Ci0gICAgICAgICAgLzEvICYmIGRvewotCi0gICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUUklORykgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RyaW5nKCRzZWxmLT57bWVzc2FnZX0pOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH07Ci0KLSAgICAgICAgICAvMi8gJiYgZG97Ci0gICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OkkzMikgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkSTMyKCRzZWxmLT57Y29kZX0pOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgICB9OwotCi0gICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICB9Ci0KLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotfQotCi1zdWIgd3JpdGUgewotICAgIG15ICRzZWxmICAgPSBzaGlmdDsKLSAgICBteSAkb3V0cHV0ID0gc2hpZnQ7Ci0KLSAgICBteSAkeGZlciAgID0gMDsKLQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwotCi0gICAgaWYgKCRzZWxmLT5nZXRNZXNzYWdlKCkpIHsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVFR5cGU6OlNUUklORywgMSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRzZWxmLT5nZXRNZXNzYWdlKCkpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotCi0gICAgaWYgKCRzZWxmLT5nZXRDb2RlKCkpIHsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGU6OkkzMiwgMik7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlSTMyKCRzZWxmLT5nZXRDb2RlKCkpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotCi0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotfQotCi1zdWIgZ2V0TWVzc2FnZQotewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICByZXR1cm4gJHNlbGYtPnttZXNzYWdlfTsKLX0KLQotc3ViIGdldENvZGUKLXsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgcmV0dXJuICRzZWxmLT57Y29kZX07Ci19CitwYWNrYWdlIFRocmlmdDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoInYxLjAuMCIpOwogCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0KaW5kZXggNjRkNzk1OC4uZDYyNTA5YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtCkBAIC0xNywyNyArMTcsMjkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Ci0KK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi11c2UgdXRmODsKLXVzZSBFbmNvZGU7Ci0KLXVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpQcm90b2NvbDsKLQogdXNlIEJpdDo6VmVjdG9yOwordXNlIEVuY29kZTsKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIFRocmlmdDo6VHlwZTsKK3VzZSB1dGY4OwogCiAjCiAjIEJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgogIwogcGFja2FnZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwogdXNlIGJhc2UoJ1RocmlmdDo6UHJvdG9jb2wnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogdXNlIGNvbnN0YW50IFZFUlNJT05fTUFTSyAgID0+IDB4ZmZmZjAwMDA7CiB1c2UgY29uc3RhbnQgVkVSU0lPTl8xICAgICAgPT4gMHg4MDAxMDAwMDsKK3VzZSBjb25zdGFudCBJU19CSUdfRU5ESUFOICA9PiB1bnBhY2soJ2gqJywgcGFjaygncycsIDEpKSA9fiBtLzAxLzsKIAogc3ViIG5ldwogewpAQCAtNjUsNyArNjcsOCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdWIgd3JpdGVTdHJ1Y3RCZWdpbnsKK3N1YiB3cml0ZVN0cnVjdEJlZ2luCit7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkbmFtZSA9IHNoaWZ0OwogICAgIHJldHVybiAwOwpAQCAtOTYsNyArOTksNyBAQAogc3ViIHdyaXRlRmllbGRTdG9wCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICByZXR1cm4gJHNlbGYtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7CisgICAgcmV0dXJuICRzZWxmLT53cml0ZUJ5dGUoVGhyaWZ0OjpUVHlwZTo6U1RPUCk7CiB9CiAKIHN1YiB3cml0ZU1hcEJlZ2luCkBAIC0yMTEsNyArMjE0LDEyIEBACiAgICAgbXkgJHZhbHVlPSBzaGlmdDsKIAogICAgIG15ICRkYXRhID0gcGFjaygnZCcsICR2YWx1ZSk7Ci0gICAgJHNlbGYtPnt0cmFuc30tPndyaXRlKHNjYWxhciByZXZlcnNlKCRkYXRhKSwgOCk7CisgICAgaWYgKElTX0JJR19FTkRJQU4pIHsKKyAgICAgICRzZWxmLT57dHJhbnN9LT53cml0ZSgkZGF0YSwgOCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgJHNlbGYtPnt0cmFuc30tPndyaXRlKHNjYWxhciByZXZlcnNlKCRkYXRhKSwgOCk7CisgICAgfQogICAgIHJldHVybiA4OwogfQogCkBAIC0yNDYsMTQgKzI1NCwxNiBAQAogICAgIG15ICRyZXN1bHQgPSAkc2VsZi0+cmVhZEkzMihcJHZlcnNpb24pOwogICAgIGlmICgoJHZlcnNpb24gJiBWRVJTSU9OX01BU0spID4gMCkgewogICAgICAgaWYgKCgkdmVyc2lvbiAmIFZFUlNJT05fTUFTSykgIT0gVkVSU0lPTl8xKSB7Ci0gICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicpCisgICAgICAgIGRpZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbi0+bmV3KCdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKICAgICAgIH0KICAgICAgICQkdHlwZSA9ICR2ZXJzaW9uICYgMHgwMDAwMDBmZjsKICAgICAgIHJldHVybgogICAgICAgICAgICRyZXN1bHQgKwogICAgICAgICAgICRzZWxmLT5yZWFkU3RyaW5nKCRuYW1lKSArCiAgICAgICAgICAgJHNlbGYtPnJlYWRJMzIoJHNlcWlkKTsKLSAgICB9IGVsc2UgeyAjIG9sZCBjbGllbnQgc3VwcG9ydCBjb2RlCisgICAgfQorICAgIGVsc2UgeyAjIG9sZCBjbGllbnQgc3VwcG9ydCBjb2RlCiAgICAgICByZXR1cm4KICAgICAgICAgJHJlc3VsdCArCiAgICAgICAgICRzZWxmLT5yZWFkU3RyaW5nQm9keSgkbmFtZSwgJHZlcnNpb24pICsgIyB2ZXJzaW9uIGhlcmUgaG9sZHMgdGhlIHNpemUgb2YgdGhlIHN0cmluZwpAQCAtMjkxLDcgKzMwMSw3IEBACiAKICAgICBteSAkcmVzdWx0ID0gJHNlbGYtPnJlYWRCeXRlKCRmaWVsZFR5cGUpOwogCi0gICAgaWYgKCQkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgaWYgKCQkZmllbGRUeXBlID09IFRocmlmdDo6VFR5cGU6OlNUT1ApIHsKICAgICAgICQkZmllbGRJZCA9IDA7CiAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9CkBAIC00MTksNyArNDI5LDcgQEAKIAogICAgIG15ICgkaGksJGxvKT11bnBhY2soJ05OJywkZGF0YSk7CiAKLSAgICBteSAkdmVjID0gbmV3IEJpdDo6VmVjdG9yKDY0KTsKKyAgICBteSAkdmVjID0gQml0OjpWZWN0b3ItPm5ldyg2NCk7CiAKICAgICAkdmVjLT5DaHVua19TdG9yZSgzMiwzMiwkaGkpOwogICAgICR2ZWMtPkNodW5rX1N0b3JlKDMyLDAsJGxvKTsKQEAgLTQzNCw3ICs0NDQsMTQgQEAKICAgICBteSAkc2VsZiAgPSBzaGlmdDsKICAgICBteSAkdmFsdWUgPSBzaGlmdDsKIAotICAgIG15ICRkYXRhID0gc2NhbGFyIHJldmVyc2UoJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoOCkpOworICAgIG15ICRkYXRhOworICAgIGlmIChJU19CSUdfRU5ESUFOKSB7CisgICAgICAkZGF0YSA9ICRzZWxmLT57dHJhbnN9LT5yZWFkQWxsKDgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICRkYXRhID0gc2NhbGFyIHJldmVyc2UoJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoOCkpOworICAgIH0KKwogICAgIG15IEBhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CiAKICAgICAkJHZhbHVlID0gJGFyclswXTsKQEAgLTQ1Miw3ICs0NjksOCBAQAogCiAgICAgaWYgKCRsZW4pIHsKICAgICAgICQkdmFsdWUgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICQkdmFsdWUgPSAnJzsKICAgICB9CiAKQEAgLTQ2Nyw3ICs0ODUsOCBAQAogCiAgICAgaWYgKCRsZW4pIHsKICAgICAgICQkdmFsdWUgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICQkdmFsdWUgPSAnJzsKICAgICB9CiAKQEAgLTQ3OCw3ICs0OTcsOCBAQAogIyBCaW5hcnkgUHJvdG9jb2wgRmFjdG9yeQogIwogcGFja2FnZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeTsKLXVzZSBiYXNlKCdUUHJvdG9jb2xGYWN0b3J5Jyk7Cit1c2UgYmFzZSgnVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTQ5Miw3ICs1MTIsNyBAQAogICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgIG15ICR0cmFucyA9IHNoaWZ0OwogCi0gICAgcmV0dXJuIG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFucyk7CisgICAgcmV0dXJuIFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkdHJhbnMpOwogfQogCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0KaW5kZXggMzg2OGNhMi4uNmI1YmY3YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtCkBAIC0xNywxNSArMTcsMTcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIHVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKIAogcGFja2FnZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTExMCw2ICsxMTIsNyBAQAogIyBCdWZmZXJlZFRyYW5zcG9ydCBmYWN0b3J5IGNyZWF0ZXMgYnVmZmVyZWQgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCiBwYWNrYWdlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvRXhjZXB0aW9uLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDQwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbQpAQCAtMCwwICsxLDE2MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6VHlwZTsKKworcGFja2FnZSBUaHJpZnQ6OlRFeGNlcHRpb247Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBvdmVybG9hZCAnIiInID0+IHN1YiB7CisgICAgcmV0dXJuCisgICAgICAgIHNwcmludGYgJyVzIGVycm9yOiAlcyAoY29kZSAlcyknLAorICAgICAgICAgIHJlZiggJF9bMF0gKSwKKyAgICAgICAgICAoICRfWzBdLT57bWVzc2FnZX0gfHwgJ2VtcHR5IG1lc3NhZ2UnICksCisgICAgICAgICAgKCBkZWZpbmVkICRfWzBdLT57Y29kZX0gPyAkX1swXS0+e2NvZGV9IDogJ3VuZGVmaW5lZCcgKTsKKyAgICB9OworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSB7bWVzc2FnZSA9PiBzaGlmdCwgY29kZSA9PiBzaGlmdCB8fCAwfTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworcGFja2FnZSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK3VzZSBwYXJlbnQgLW5vcmVxdWlyZSwgJ1RocmlmdDo6VEV4Y2VwdGlvbic7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBjb25zdGFudCBVTktOT1dOICAgICAgICAgICAgICAgICA9PiAwOwordXNlIGNvbnN0YW50IFVOS05PV05fTUVUSE9EICAgICAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9NRVNTQUdFX1RZUEUgICAgPT4gMjsKK3VzZSBjb25zdGFudCBXUk9OR19NRVRIT0RfTkFNRSAgICAgICA9PiAzOwordXNlIGNvbnN0YW50IEJBRF9TRVFVRU5DRV9JRCAgICAgICAgID0+IDQ7Cit1c2UgY29uc3RhbnQgTUlTU0lOR19SRVNVTFQgICAgICAgICAgPT4gNTsKK3VzZSBjb25zdGFudCBJTlRFUk5BTF9FUlJPUiAgICAgICAgICA9PiA2OwordXNlIGNvbnN0YW50IFBST1RPQ09MX0VSUk9SICAgICAgICAgID0+IDc7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9UUkFOU0ZPUk0gICAgICAgPT4gODsKK3VzZSBjb25zdGFudCBJTlZBTElEX1BST1RPQ09MICAgICAgICA9PiA5OwordXNlIGNvbnN0YW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0+IDEwOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgcmVhZCB7CisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGlucHV0ID0gc2hpZnQ7CisKKyAgICBteSAkeGZlciAgPSAwOworICAgIG15ICRmbmFtZSA9IHVuZGVmOworICAgIG15ICRmdHlwZSA9IDA7CisgICAgbXkgJGZpZCAgID0gMDsKKworICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFwkZm5hbWUpOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFwkZm5hbWUsIFwkZnR5cGUsIFwkZmlkKTsKKyAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICBsYXN0OyBuZXh0OworICAgICAgICB9CisKKyAgICAgIFNXSVRDSDogZm9yKCRmaWQpCisgICAgICB7CisgICAgICAgICAgLzEvICYmIGRveworCisgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJpbmcoXCRzZWxmLT57bWVzc2FnZX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgIH07CisKKyAgICAgICAgICAvMi8gJiYgZG97CisgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRJMzIoXCRzZWxmLT57Y29kZX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICB9OworCisgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICB9CisKKyAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOworCisgICAgcmV0dXJuICR4ZmVyOworfQorCitzdWIgd3JpdGUgeworICAgIG15ICRzZWxmICAgPSBzaGlmdDsKKyAgICBteSAkb3V0cHV0ID0gc2hpZnQ7CisKKyAgICBteSAkeGZlciAgID0gMDsKKworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgICAgaWYgKCRzZWxmLT5nZXRNZXNzYWdlKCkpIHsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVGhyaWZ0OjpUVHlwZTo6U1RSSU5HLCAxKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJHNlbGYtPmdldE1lc3NhZ2UoKSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBpZiAoJHNlbGYtPmdldENvZGUoKSkgeworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUaHJpZnQ6OlRUeXBlOjpJMzIsIDIpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkc2VsZi0+Z2V0Q29kZSgpKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CisgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiAkeGZlcjsKK30KKworc3ViIGdldE1lc3NhZ2UKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57bWVzc2FnZX07Cit9CisKK3N1YiBnZXRDb2RlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvZGV9OworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQppbmRleCBiNzhiMTk4Li5iYTg5YmEzIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQpAQCAtMTcsNiArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKQEAgLTMwLDggKzMxLDggQEAKICMgQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAogIwogcGFja2FnZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKLQogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTY4LDcgKzY5LDkgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCi0gICAgJHNlbGYtPnt0cmFuc3BvcnR9LT5jbG9zZSgpOworICAgIGlmIChkZWZpbmVkICRzZWxmLT57dHJhbnNwb3J0fSkgeworICAgICAgICAkc2VsZi0+e3RyYW5zcG9ydH0tPmNsb3NlKCk7CisgICAgfQogfQogCiAjCkBAIC0xNjEsNCArMTY0LDMxIEBACiAKIH0KIAorIworIyBGcmFtZWRUcmFuc3BvcnQgZmFjdG9yeSBjcmVhdGVzIGZyYW1lZCB0cmFuc3BvcnQgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKKyMKK3BhY2thZ2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9IHt9OworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworIworIyBCdWlsZCBhIGZyYW1lZCB0cmFuc3BvcnQgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQKKyMKKyMgQHJldHVybiBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydCB0cmFuc3BvcnQKKyMKK3N1YiBnZXRUcmFuc3BvcnQKK3sKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkdHJhbnMgPSBzaGlmdDsKKworICAgIG15ICRidWZmZXJlZCA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0LT5uZXcoJHRyYW5zKTsKKyAgICByZXR1cm4gJGJ1ZmZlcmVkOworfQorCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtCmluZGV4IGQ2ZmM4YmUuLjQwZWM5Y2UgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0KQEAgLTE3LDI2ICsxNywyNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCit1c2UgSFRUUDo6UmVxdWVzdDsKK3VzZSBJTzo6U3RyaW5nOwordXNlIExXUDo6VXNlckFnZW50OwogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIHVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKIAotdXNlIEhUVFA6OlJlcXVlc3Q7Ci11c2UgTFdQOjpVc2VyQWdlbnQ7Ci11c2UgSU86OlN0cmluZzsKLQogcGFja2FnZSBUaHJpZnQ6Okh0dHBDbGllbnQ7Ci0KIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICR1cmwgICAgICAgPSBzaGlmdCB8fCAnaHR0cDovL2xvY2FsaG9zdDo5MDkwJzsKLSAgICBteSAkZGVidWdIYW5kbGVyID0gc2hpZnQ7CiAKICAgICBteSAkb3V0ID0gSU86OlN0cmluZy0+bmV3OwogICAgIGJpbm1vZGUoJG91dCk7CkBAIC00NCw0NCArNDMsNDQgQEAKICAgICBteSAkc2VsZiA9IHsKICAgICAgICAgdXJsICAgICAgICAgID0+ICR1cmwsCiAgICAgICAgIG91dCAgICAgICAgICA9PiAkb3V0LAotICAgICAgICBkZWJ1Z0hhbmRsZXIgPT4gJGRlYnVnSGFuZGxlciwKLSAgICAgICAgZGVidWcgICAgICAgID0+IDAsCi0gICAgICAgIHNlbmRUaW1lb3V0ICA9PiAxMDAsCi0gICAgICAgIHJlY3ZUaW1lb3V0ICA9PiA3NTAsCisgICAgICAgIHRpbWVvdXQgICAgICA9PiAxMDAsCiAgICAgICAgIGhhbmRsZSAgICAgICA9PiB1bmRlZiwKKyAgICAgICAgaGVhZGVycyAgICAgID0+IHt9LAogICAgIH07CiAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKK3N1YiBzZXRUaW1lb3V0Cit7CisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkdGltZW91dCA9IHNoaWZ0OworCisgICAgJHNlbGYtPnt0aW1lb3V0fSA9ICR0aW1lb3V0OworfQorCitzdWIgc2V0UmVjdlRpbWVvdXQKK3sKKyAgICB3YXJuICdzZXRSZWN2VGltZW91dCBpcyBkZXByZWNhdGVkIC0gdXNlIHNldFRpbWVvdXQgaW5zdGVhZCc7CisgICAgIyBub3RlOiByZWN2VGltZW91dCB3YXMgbmV2ZXIgdXNlZCBzbyB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlCit9CisKIHN1YiBzZXRTZW5kVGltZW91dAogewogICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CiAgICAgbXkgJHRpbWVvdXQgPSBzaGlmdDsKIAotICAgICRzZWxmLT57c2VuZFRpbWVvdXR9ID0gJHRpbWVvdXQ7CisgICAgd2FybiAnc2V0U2VuZFRpbWVvdXQgaXMgZGVwcmVjYXRlZCAtIHVzZSBzZXRUaW1lb3V0IGluc3RlYWQnOworCisgICAgJHNlbGYtPnNldFRpbWVvdXQoJHRpbWVvdXQpOwogfQogCi1zdWIgc2V0UmVjdlRpbWVvdXQKK3N1YiBzZXRIZWFkZXIKIHsKLSAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwotICAgIG15ICR0aW1lb3V0ID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUsICR2YWx1ZSkgPSBAXzsKIAotICAgICRzZWxmLT57cmVjdlRpbWVvdXR9ID0gJHRpbWVvdXQ7Ci19Ci0KLQotIwotI1NldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSMKLSMgQHBhcmFtIGJvb2wgJGRlYnVnCi0jCi1zdWIgc2V0RGVidWcKLXsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkZGVidWcgPSBzaGlmdDsKLQotICAgICRzZWxmLT57ZGVidWd9ID0gJGRlYnVnOworICAgICRzZWxmLT57aGVhZGVyc30tPnskbmFtZX0gPSAkdmFsdWU7CiB9CiAKICMKQEAgLTEwMyw4ICsxMDIsOCBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgaWYgKGRlZmluZWQoJHNlbGYtPntpb30pKSB7Ci0gICAgICBjbG9zZSgkc2VsZi0+e2lvfSk7Ci0gICAgICAkc2VsZi0+e2lvfSA9IHVuZGVmOworICAgICAgICBjbG9zZSgkc2VsZi0+e2lvfSk7CisgICAgICAgICRzZWxmLT57aW99ID0gdW5kZWY7CiAgICAgfQogfQogCkBAIC0xMjIsNyArMTIxLDggQEAKICAgICBteSAkYnVmID0gJHNlbGYtPnJlYWQoJGxlbik7CiAKICAgICBpZiAoIWRlZmluZWQoJGJ1ZikpIHsKLSAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tIGlucHV0IGJ1ZmZlcicpOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoIlRTb2NrZXQ6IENvdWxkIG5vdCByZWFkICRsZW4gYnl0ZXMgZnJvbSBpbnB1dCBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAgICAgfQogICAgIHJldHVybiAkYnVmOwogfQpAQCAtMTQwLDE1ICsxNDAsMTggQEAKICAgICBteSAkaW4gPSAkc2VsZi0+e2lufTsKIAogICAgIGlmICghZGVmaW5lZCgkaW4pKSB7Ci0gICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiUmVzcG9uc2UgYnVmZmVyIGlzIGVtcHR5LCBubyByZXF1ZXN0LiIpOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJ1Jlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAgICAgfQogICAgIGV2YWwgewotICAgICAgbXkgJHJldCA9IHN5c3JlYWQoJGluLCAkYnVmLCAkbGVuKTsKLSAgICAgIGlmICghIGRlZmluZWQoJHJldCkpIHsKLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUuIik7Ci0gICAgICB9Ci0gICAgfTsgaWYoJEApewotICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJEApOworICAgICAgICBteSAkcmV0ID0gc3lzcmVhZCgkaW4sICRidWYsICRsZW4pOworICAgICAgICBpZiAoISBkZWZpbmVkKCRyZXQpKSB7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJ05vIG1vcmUgZGF0YSBhdmFpbGFibGUuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpOworICAgICAgICB9CisgICAgfTsKKyAgICBpZigkQCl7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygiJEAiLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwogICAgIH0KIAogICAgIHJldHVybiAkYnVmOwpAQCAtMTcxLDggKzE3NCw5IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAotICAgIG15ICR1YSA9IExXUDo6VXNlckFnZW50LT5uZXcoJ3RpbWVvdXQnID0+ICgkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDApLAotICAgICAgJ2FnZW50JyA9PiAnUGVybC9USHR0cENsaWVudCcKKyAgICBteSAkdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KAorICAgICAgICAndGltZW91dCcgPT4gKCRzZWxmLT57dGltZW91dH0gLyAxMDAwKSwKKyAgICAgICAgJ2FnZW50JyAgID0+ICdQZXJsL1RIdHRwQ2xpZW50JwogICAgICApOwogICAgICR1YS0+ZGVmYXVsdF9oZWFkZXIoJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CiAgICAgJHVhLT5kZWZhdWx0X2hlYWRlcignQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnKTsKQEAgLTE4Miw3ICsxODYsNyBAQAogICAgICRvdXQtPnNldHBvcygwKTsgIyByZXdpbmQKICAgICBteSAkYnVmID0gam9pbignJywgPCRvdXQ+KTsKIAotICAgIG15ICRyZXF1ZXN0ID0gbmV3IEhUVFA6OlJlcXVlc3QoUE9TVCA9PiAkc2VsZi0+e3VybH0sIHVuZGVmLCAkYnVmKTsKKyAgICBteSAkcmVxdWVzdCA9IEhUVFA6OlJlcXVlc3QtPm5ldyhQT1NUID0+ICRzZWxmLT57dXJsfSwgKCRzZWxmLT57aGVhZGVyc30gfHwgdW5kZWYpLCAkYnVmKTsKICAgICBteSAkcmVzcG9uc2UgPSAkdWEtPnJlcXVlc3QoJHJlcXVlc3QpOwogICAgIG15ICRjb250ZW50X3JlZiA9ICRyZXNwb25zZS0+Y29udGVudF9yZWY7CiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0KaW5kZXggMGIyODY4Ny4uYmU5N2NlNCAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0KQEAgLTE3LDcgKzE3LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIApAQCAtMjYsNiArMjYsNyBAQAogCiBwYWNrYWdlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTM0LDEwICszNSwxMCBAQAogICAgIG15ICRidWZmZXJTaXplPSBzaGlmdCB8fCAxMDI0OwogCiAgICAgbXkgJHNlbGYgPSB7Ci0gICAgICAgIGJ1ZmZlciAgICA9PiAnJywKLSAgICAgICAgYnVmZmVyU2l6ZT0+ICRidWZmZXJTaXplLAotICAgICAgICB3UG9zICAgICAgPT4gMCwKLSAgICAgICAgclBvcyAgICAgID0+IDAsCisgICAgICAgIGJ1ZmZlciAgICAgPT4gJycsCisgICAgICAgIGJ1ZmZlclNpemUgPT4gJGJ1ZmZlclNpemUsCisgICAgICAgIHdQb3MgICAgICAgPT4gMCwKKyAgICAgICAgclBvcyAgICAgICA9PiAwLAogICAgIH07CiAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CkBAIC0xMTYsNyArMTE3LDggQEAKIAogICAgIG15ICRhdmFpbCA9ICgkc2VsZi0+e3dQb3N9IC0gJHNlbGYtPntyUG9zfSk7CiAgICAgaWYgKCRhdmFpbCA8ICRsZW4pIHsKLSAgICAgICAgZGllIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJBdHRlbXB0IHRvIHJlYWRBbGwoJGxlbikgZm91bmQgb25seSAkYXZhaWwgYXZhaWxhYmxlIik7CisgICAgICAgIGRpZSBUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoIkF0dGVtcHQgdG8gcmVhZEFsbCgkbGVuKSBmb3VuZCBvbmx5ICRhdmFpbCBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAgICAgfQogCiAgICAgbXkgJGRhdGEgPSAnJzsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNWMyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKKworIworIyBNZXNzYWdlIHR5cGVzIGZvciBSUEMKKyMKK3BhY2thZ2UgVGhyaWZ0OjpUTWVzc2FnZVR5cGU7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBjb25zdGFudCBDQUxMICAgICAgPT4gMTsKK3VzZSBjb25zdGFudCBSRVBMWSAgICAgPT4gMjsKK3VzZSBjb25zdGFudCBFWENFUFRJT04gPT4gMzsKK3VzZSBjb25zdGFudCBPTkVXQVkgICAgPT4gNDsKKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTI1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtCkBAIC0wLDAgKzEsMTMzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yOworCitwYWNrYWdlIFRocmlmdDo6U3RvcmVkTWVzc2FnZVByb3RvY29sOwordXNlIGJhc2UgcXcoVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcik7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkcHJvdG9jb2wgID0gc2hpZnQ7CisgICAgbXkgJGZuYW1lICA9IHNoaWZ0OworICAgIG15ICRtdHlwZSAgPSBzaGlmdDsKKyAgICBteSAkcnNlcWlkICA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJHByb3RvY29sKTsKKworICAgICRzZWxmLT57Zm5hbWV9ID0gJGZuYW1lOworICAgICRzZWxmLT57bXR5cGV9ID0gJG10eXBlOworICAgICRzZWxmLT57cnNlcWlkfSA9ICRyc2VxaWQ7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3N1YiByZWFkTWVzc2FnZUJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICR0eXBlID0gc2hpZnQ7CisgICAgbXkgJHNlcWlkID0gc2hpZnQ7CisKKyAgICAkJG5hbWUgPSAkc2VsZi0+e2ZuYW1lfTsKKyAgICAkJHR5cGUgPSAkc2VsZi0+e210eXBlfTsKKyAgICAkJHNlcWlkID0gJHNlbGYtPntyc2VxaWR9OworfQorCitwYWNrYWdlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3I7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0ge307CisKKyAgICAkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9ID0ge307CisgICAgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSA9IHVuZGVmOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgZGVmYXVsdFByb2Nlc3NvciB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkcHJvY2Vzc29yID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9ID0gJHByb2Nlc3NvcjsKK30KKworc3ViIHJlZ2lzdGVyUHJvY2Vzc29yIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzZXJ2aWNlTmFtZSA9IHNoaWZ0OworICAgIG15ICRwcm9jZXNzb3IgPSBzaGlmdDsKKworICAgICAkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9LT57JHNlcnZpY2VOYW1lfSA9ICRwcm9jZXNzb3I7Cit9CisKK3N1YiBwcm9jZXNzIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRpbnB1dCA9IHNoaWZ0OworICAgIG15ICRvdXRwdXQgPSBzaGlmdDsKKworICAgICMKKyAgICAjICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICMgIG1lc3NhZ2UgaGVhZGVyLiBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICMgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgorICAgICMKKworICAgIG15ICgkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7CisgICAgJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKFwkZm5hbWUsIFwkbXR5cGUsIFwkcnNlcWlkKTsKKworICAgIGlmICgkbXR5cGUgbmUgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkNBTEwgJiYgJG10eXBlIG5lIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKKyAgICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCdUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/Jyk7CisgICAgfQorCisgICAgIyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgYW5kIHRoZSBuZXcgTWVzc2FnZSBuYW1lLgorICAgIGlmIChpbmRleCgkZm5hbWUsIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbDo6U0VQQVJBVE9SKSA9PSAtMSkgeworICAgICAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9KSB7CisgICAgICAgICAgICByZXR1cm4gJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfS0+cHJvY2VzcygKKyAgICAgICAgICAgICAgICBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbC0+bmV3KCRpbnB1dCwgJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpLCAkb3V0cHV0CisgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogeyRmbmFtZX0gYW5kIG5vIGRlZmF1bHQgcHJvY2Vzc29yIGRlZmluZWQuIERpZCB5b3UgIiAuCisgICAgICAgICAgICAgICAgJ2ZvcmdldCB0byB1c2UgYSBNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIChteSAkc2VydmljZU5hbWUsIG15ICRtZXNzYWdlTmFtZSkgPSBzcGxpdCgnOicsICRmbmFtZSwgMik7CisKKyAgICBpZiAoIWV4aXN0cygkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9LT57JHNlcnZpY2VOYW1lfSkpIHsKKyAgICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiB7JHNlcnZpY2VOYW1lfS4gIERpZCB5b3UgZm9yZ2V0ICIgLgorICAgICAgICAgICAgJ3RvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8nKTsKKyAgICB9CisKKyAgICAjIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICBteSAkcHJvY2Vzc29yID0gJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX07CisgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCisgICAgICAgIFRocmlmdDo6U3RvcmVkTWVzc2FnZVByb3RvY29sLT5uZXcoJGlucHV0LCAkbWVzc2FnZU5hbWUsICRtdHlwZSwgJHJzZXFpZCksICRvdXRwdXQKKyAgICApOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWI2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0KQEAgLTAsMCArMSw2OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yOworCitwYWNrYWdlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3IpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgU0VQQVJBVE9SICA9PiAnOic7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkcHJvdG9jb2wgID0gc2hpZnQ7CisgICAgbXkgJHNlcnZpY2VOYW1lICA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRwcm90b2NvbCk7CisKKyAgICAkc2VsZi0+e3NlcnZpY2VOYW1lfSA9ICRzZXJ2aWNlTmFtZTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworIworIyBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyLgorIyBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgTXVsdGlwbGV4ZWRQcm90b2NvbDo6U0VQQVJBVE9SLgorIworIyBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lLgorIyBAcGFyYW0gaW50ICAgICR0eXBlICBNZXNzYWdlIHR5cGUuCisjIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UuCisjCitzdWIgd3JpdGVNZXNzYWdlQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCkgPSBAXzsKKworICAgIGlmICgkdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6Q0FMTCB8fCAkdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgIG15ICRuYW1lV2l0aFNlcnZpY2UgPSAkc2VsZi0+e3NlcnZpY2VOYW1lfS5TRVBBUkFUT1IuJG5hbWU7CisgICAgICAgICRzZWxmLT5TVVBFUjo6d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWVXaXRoU2VydmljZSwgJHR5cGUsICRzZXFpZCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+U1VQRVI6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbQppbmRleCAwMzQ3MTFmLi4yNmVmNDZhIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0KQEAgLTE3LDIzICsxNywyOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwordXNlIFRocmlmdDo6VHlwZTsKIAogIwogIyBQcm90b2NvbCBleGNlcHRpb25zCiAjCi1wYWNrYWdlIFRQcm90b2NvbEV4Y2VwdGlvbjsKK3BhY2thZ2UgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb247CiB1c2UgYmFzZSgnVGhyaWZ0OjpURXhjZXB0aW9uJyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKLXVzZSBjb25zdGFudCBVTktOT1dOICAgICAgID0+IDA7Ci11c2UgY29uc3RhbnQgSU5WQUxJRF9EQVRBICA9PiAxOwotdXNlIGNvbnN0YW50IE5FR0FUSVZFX1NJWkUgPT4gMjsKLXVzZSBjb25zdGFudCBTSVpFX0xJTUlUICAgID0+IDM7Ci11c2UgY29uc3RhbnQgQkFEX1ZFUlNJT04gICA9PiA0OwordXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgICA9PiAwOwordXNlIGNvbnN0YW50IElOVkFMSURfREFUQSAgICA9PiAxOwordXNlIGNvbnN0YW50IE5FR0FUSVZFX1NJWkUgICA9PiAyOwordXNlIGNvbnN0YW50IFNJWkVfTElNSVQgICAgICA9PiAzOwordXNlIGNvbnN0YW50IEJBRF9WRVJTSU9OICAgICA9PiA0OwordXNlIGNvbnN0YW50IE5PVF9JTVBMRU1FTlRFRCA9PiA1OwordXNlIGNvbnN0YW50IERFUFRIX0xJTUlUICAgICA9PiA2OwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC00Nyw2ICs1Miw3IEBACiAjIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgogIwogcGFja2FnZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC03NSwzNyArODEsMzcgQEAKIHN1YiB3cml0ZU1lc3NhZ2VCZWdpbgogewogICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKICMgQ2xvc2UgdGhlIG1lc3NhZ2UKICMKIHN1YiB3cml0ZU1lc3NhZ2VFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCiAjIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCiAjCiAjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCi0jIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgogIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCiAjCiBzdWIgd3JpdGVTdHJ1Y3RCZWdpbiB7CiAgICAgbXkgKCRuYW1lKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCiAjIENsb3NlIGEgc3RydWN0LgogIwotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlU3RydWN0RW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMTE0LDg1ICsxMjAsODUgQEAKICMgQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQogIyBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCiAjIEBwYXJhbSBpbnQgICAgICAgICRmaWQgIEZpZWxkIGlkCi0jIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgogIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCiAjCiBzdWIgd3JpdGVGaWVsZEJlZ2luIHsKICAgICBteSAoJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUZpZWxkRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlRmllbGRTdG9wIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTWFwQmVnaW4gewogICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVNYXBFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVMaXN0QmVnaW4gewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTGlzdEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZVNldEJlZ2luIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZVNldEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUJvb2wgewogICAgIG15ICgkYm9vbCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUJ5dGUgewogICAgIG15ICgkYnl0ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUkxNiB7CiAgICAgbXkgKCRpMTYpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVJMzIgewogICAgIG15ICgkaTMyKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlSTY0IHsKICAgICBteSAoJGk2NCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZURvdWJsZSB7CiAgICAgbXkgKCRkdWIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTdHJpbmcKIHsKICAgICBteSAoJHN0cik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTIwNSw3ICsyMTEsNyBAQAogc3ViIHJlYWRNZXNzYWdlQmVnaW4KIHsKICAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0yMTMsMTA1ICsyMTksMTA1IEBACiAjCiBzdWIgcmVhZE1lc3NhZ2VFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJ1Y3RCZWdpbgogewogICAgIG15KCRuYW1lKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFN0cnVjdEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEZpZWxkQmVnaW4KIHsKICAgICBteSAoJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRGaWVsZEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZE1hcEJlZ2luCiB7CiAgICAgbXkgKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZE1hcEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZExpc3RCZWdpbgogewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRMaXN0RW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU2V0QmVnaW4KIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU2V0RW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkQm9vbAogewogICAgIG15ICgkYm9vbCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkQnl0ZQogewogICAgIG15ICgkYnl0ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkSTE2CiB7CiAgICAgbXkgKCRpMTYpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEkzMgogewogICAgIG15ICgkaTMyKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRJNjQKIHsKICAgICBteSAoJGk2NCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkRG91YmxlCiB7CiAgICAgbXkgKCRkdWIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFN0cmluZwogewogICAgIG15ICgkc3RyKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMzI5LDM2ICszMzUsMzYgQEAKICAgICBteSAkcmVzdWx0OwogICAgIG15ICRpOwogCi0gICAgaWYoJHR5cGUgPT0gVFR5cGU6OkJPT0wpCisgICAgaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6Qk9PTCkKICAgICB7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEJvb2woXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6QllURSl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6QllURSl7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEJ5dGUoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STE2KXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJMTYpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRJMTYoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STMyKXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJMzIpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRJMzIoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STY0KXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJNjQpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRJNjQoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6RE9VQkxFKXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpET1VCTEUpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWREb3VibGUoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U1RSSU5HKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUklORykKICAgICB7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZFN0cmluZyhcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTVFJVQ1QpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSVUNUKQogICAgIHsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkU3RydWN0QmVnaW4oXCRyZWYpOwogICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgbXkgKCRmdHlwZSwkZmlkKTsKICAgICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnJlYWRGaWVsZEJlZ2luKFwkcmVmLCBcJGZ0eXBlLCBcJGZpZCk7Ci0gICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUT1ApIHsKICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+c2tpcCgkZnR5cGUpOwpAQCAtMzY3LDcgKzM3Myw3IEBACiAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnJlYWRTdHJ1Y3RFbmQoKTsKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpNQVApCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TUFQKQogICAgIHsKICAgICAgICAgbXkoJGtleVR5cGUsJHZhbFR5cGUsJHNpemUpOwogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRNYXBCZWdpbihcJGtleVR5cGUsIFwkdmFsVHlwZSwgXCRzaXplKTsKQEAgLTM3OCw3ICszODQsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkTWFwRW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U0VUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNFVCkKICAgICB7CiAgICAgICAgIG15ICgkZWxlbVR5cGUsJHNpemUpOwogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRTZXRCZWdpbihcJGVsZW1UeXBlLCBcJHNpemUpOwpAQCAtMzg4LDcgKzM5NCw3IEBACiAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnJlYWRTZXRFbmQoKTsKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpMSVNUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkxJU1QpCiAgICAgewogICAgICAgICBteSAoJGVsZW1UeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkTGlzdEJlZ2luKFwkZWxlbVR5cGUsIFwkc2l6ZSk7CkBAIC0zOTksOCArNDA1LDggQEAKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQogCi0KLSAgICByZXR1cm4gMDsKKyAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygiVHlwZSAkdHlwZSBub3QgcmVjb2duaXplZCAtLS0gY29ycnVwdCBkYXRhPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKIAogICB9CiAKQEAgLTQxNiwzMSArNDIyLDMxIEBACiAgICAgbXkgJGl0cmFucyA9IHNoaWZ0OwogICAgIG15ICR0eXBlICAgPSBzaGlmdDsKIAotICAgIGlmKCR0eXBlID09IFRUeXBlOjpCT09MKQotICAgIHsKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6QllURSkKKyAgICBpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCT09MKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMTYpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6QllURSkKKyAgICB7CisgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgIH0KKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJMTYpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgyKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkzMikKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJMzIpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg0KTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Okk2NCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJNjQpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkRPVUJMRSkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpET1VCTEUpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKICAgICB9Ci0gICAgZWxzaWYoICR0eXBlID09IFRUeXBlOjpTVFJJTkcgKQorICAgIGVsc2lmKCAkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJJTkcgKQogICAgIHsKICAgICAgICAgbXkgQGxlbiA9IHVucGFjaygnTicsICRpdHJhbnMtPnJlYWRBbGwoNCkpOwogICAgICAgICBteSAkbGVuID0gJGxlblswXTsKQEAgLTQ0OSwyNSArNDU1LDI1IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDQgKyAkaXRyYW5zLT5yZWFkQWxsKCRsZW4pOwogICAgIH0KLSAgICBlbHNpZiggJHR5cGUgPT0gVFR5cGU6OlNUUlVDVCApCisgICAgZWxzaWYoICR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUlVDVCApCiAgICAgewogICAgICAgICBteSAkcmVzdWx0ID0gMDsKICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICBteSAkZnR5cGUgPSAwOwotICAgICAgICAgIG15ICRmaWQgPSAwOwotICAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgICBteSBAYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAgICRmdHlwZSA9ICRhcnJbMF07Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgIyBJMTYgZmllbGQgaWQKLSAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOworICAgICAgICAgICAgbXkgJGZ0eXBlID0gMDsKKyAgICAgICAgICAgIG15ICRmaWQgPSAwOworICAgICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgbXkgQGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICRmdHlwZSA9ICRhcnJbMF07CisgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBJMTYgZmllbGQgaWQKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Ok1BUCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpNQVApCiAgICAgewogICAgICAgICAjIEt0eXBlCiAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKQEAgLTQ5MSw3ICs0OTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U0VUIHx8ICR0eXBlID09IFRUeXBlOjpMSVNUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNFVCB8fCAkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpMSVNUKQogICAgIHsKICAgICAgICAgIyBWdHlwZQogICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CkBAIC01MTEsMTUgKzUxNywxNSBAQAogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9CiAKLSAgICByZXR1cm4gMDsKLQorICAgIGRpZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbi0+bmV3KCJUeXBlICR0eXBlIG5vdCByZWNvZ25pemVkIC0tLSBjb3JydXB0IGRhdGE/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwogfQogCiAjCiAjIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwotcGFja2FnZSBUUHJvdG9jb2xGYWN0b3J5OwotCitwYWNrYWdlIFRocmlmdDo6VFByb3RvY29sRmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNTM2LDcgKzU0Miw3IEBACiBzdWIgZ2V0UHJvdG9jb2wKIHsKICAgICBteSAoJHRyYW5zKTsKLSAgICBkaWUgImludGVyZmFjZSI7CisgICAgZGllICdpbnRlcmZhY2UnOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNWM5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtCkBAIC0wLDAgKzEsMzYzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbDsKKworcGFja2FnZSBUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yOwordXNlIGJhc2UgcXcoVGhyaWZ0OjpQcm90b2NvbCk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkcHJvdG9jb2wgID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKSk7CisKKyAgICAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9ID0gJHByb3RvY29sOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCisjCisjIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyMKKyMgQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisjIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisjIEBwYXJhbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyMKK3N1YiB3cml0ZU1lc3NhZ2VCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpID0gQF87CisKKyAgICAgIHJldHVybiAgJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworfQorCisjCisjIENsb3NlIHRoZSBtZXNzYWdlCisjCitzdWIgd3JpdGVNZXNzYWdlRW5kIHsKKyAgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNZXNzYWdlRW5kKCk7Cit9CisKKyMKKyMgV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KKyMKKyMgQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKKyMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyMKK3N1YiB3cml0ZVN0cnVjdEJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKK30KKworIworIyBDbG9zZSBhIHN0cnVjdC4KKyMKKyMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyMKK3N1YiB3cml0ZVN0cnVjdEVuZCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZVN0cnVjdEVuZCgpOworfQorCisjCisjIFN0YXJ0cyBhIGZpZWxkLgorIworIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCisjIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKKyMgQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKKyMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyMKK3N1YiB3cml0ZUZpZWxkQmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Cit9CisKK3N1YiB3cml0ZUZpZWxkRW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlRmllbGRFbmQoKTsKK30KKworc3ViIHdyaXRlRmllbGRTdG9wIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlRmllbGRTdG9wKCk7Cit9CisKK3N1YiB3cml0ZU1hcEJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Cit9CisKK3N1YiB3cml0ZU1hcEVuZCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1hcEVuZCgpOworfQorCitzdWIgd3JpdGVMaXN0QmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Cit9CisKK3N1YiB3cml0ZUxpc3RFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVMaXN0RW5kKCk7Cit9CisKK3N1YiB3cml0ZVNldEJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZWxlbVR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Cit9CisKK3N1YiB3cml0ZVNldEVuZCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUxpc3RFbmQoKTsKK30KKworc3ViIHdyaXRlQm9vbCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkYm9vbCA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlQm9vbCgkYm9vbCk7Cit9CisKK3N1YiB3cml0ZUJ5dGUgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGJ5dGUgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUJ5dGUoJGJ5dGUpOworfQorCitzdWIgd3JpdGVJMTYgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGkxNiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlSTE2KCRpMTYpOworfQorCitzdWIgd3JpdGVJMzIgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRpMzIpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVJMzIoJGkzMik7CisKK30KKworc3ViIHdyaXRlSTY0IHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRpNjQgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUk2NCgkaTY0KTsKK30KKworc3ViIHdyaXRlRG91YmxlIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRkdWIgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZURvdWJsZSgkZHViKTsKK30KKworc3ViIHdyaXRlU3RyaW5nIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzdHIgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZVN0cmluZygkc3RyKTsKK30KKworIworIyBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyMKKyMgQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisjIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisjIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyMKK3N1YiByZWFkTWVzc2FnZUJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZE1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Cit9CisKKyMKKyMgUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQorIworc3ViIHJlYWRNZXNzYWdlRW5kCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTWVzc2FnZUVuZCgpOworfQorCitzdWIgcmVhZFN0cnVjdEJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7Cit9CisKK3N1YiByZWFkU3RydWN0RW5kCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkU3RydWN0RW5kKCk7Cit9CisKK3N1YiByZWFkRmllbGRCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkRmllbGRCZWdpbigkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworfQorCitzdWIgcmVhZEZpZWxkRW5kCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkRmllbGRFbmQoKTsKK30KKworc3ViIHJlYWRNYXBCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZE1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworfQorCitzdWIgcmVhZE1hcEVuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZE1hcEVuZCgpOworfQorCitzdWIgcmVhZExpc3RCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZExpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKK30KKworc3ViIHJlYWRMaXN0RW5kCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTGlzdEVuZCgpOworfQorCitzdWIgcmVhZFNldEJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Cit9CisKK3N1YiByZWFkU2V0RW5kCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkU2V0RW5kKCk7Cit9CisKK3N1YiByZWFkQm9vbAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGJvb2wgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkQm9vbCgkYm9vbCk7Cit9CisKK3N1YiByZWFkQnl0ZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGJ5dGUgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkQnl0ZSgkYnl0ZSk7Cit9CisKK3N1YiByZWFkSTE2Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTE2ID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEkxNigkaTE2KTsKK30KKworc3ViIHJlYWRJMzIKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRpMzIgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEkzMigkaTMyKTsKK30KKworc3ViIHJlYWRJNjQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRpNjQgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEk2NCgkaTY0KTsKK30KKworc3ViIHJlYWREb3VibGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRkdWIgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZERvdWJsZSgkZHViKTsKK30KKworc3ViIHJlYWRTdHJpbmcKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzdHIgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkU3RyaW5nKCRzdHIpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjA2NDMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0KQEAgLTAsMCArMSw3NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6U1NMU29ja2V0OwordXNlIFRocmlmdDo6U2VydmVyU29ja2V0OworCit1c2UgSU86OlNvY2tldDo6U1NMOworCitwYWNrYWdlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyU29ja2V0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0b3IuCisjIFRha2VzIGEgaGFzaDoKKyMgU2VlIFRocmlmdDo6U29ja2V0IGZvciBiYXNlIGNsYXNzIHBhcmFtZXRlcnMuCisjIEBwYXJhbVtpbl0gIGNhICAgICBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZmlsZW5hbWUgLSBub3QgcmVxdWlyZWQKKyMgQHBhcmFtW2luXSAgY2VydCAgIGNlcnRpZmljYXRlIGZpbGVuYW1lOyBtYXkgY29udGFpbiBrZXkgaW4gd2hpY2ggY2FzZSBrZXkgaXMgbm90IHJlcXVpcmVkCisjIEBwYXJhbVtpbl0gIGtleSAgICBwcml2YXRlIGtleSBmaWxlbmFtZSBmb3IgdGhlIGNlcnRpZmljYXRlIGlmIGl0IGlzIG5vdCBpbnNpZGUgdGhlIGNlcnQgZmlsZQorIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7CisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIF9fY2xpZW50Cit7CisgIHJldHVybiBUaHJpZnQ6OlNTTFNvY2tldC0+bmV3KCk7Cit9CisKK3N1YiBfX2xpc3RlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG9wdHMgPSB7TGlzdGVuICAgICAgICA9PiAkc2VsZi0+e3F1ZXVlfSwKKyAgICAgICAgICAgICAgICBMb2NhbEFkZHIgICAgID0+ICRzZWxmLT57aG9zdH0sCisgICAgICAgICAgICAgICAgTG9jYWxQb3J0ICAgICA9PiAkc2VsZi0+e3BvcnR9LAorICAgICAgICAgICAgICAgIFByb3RvICAgICAgICAgPT4gJ3RjcCcsCisgICAgICAgICAgICAgICAgUmV1c2VBZGRyICAgICA9PiAxfTsKKworICAgIG15ICR2ZXJpZnkgPSBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfUEVFUiB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKworICAgICRvcHRzLT57U1NMX2NhX2ZpbGV9ICAgICAgPSAkc2VsZi0+e2NhfSAgICAgIGlmIGRlZmluZWQgJHNlbGYtPntjYX07CisgICAgJG9wdHMtPntTU0xfY2VydF9maWxlfSAgICA9ICRzZWxmLT57Y2VydH0gICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NlcnR9OworICAgICRvcHRzLT57U1NMX2NpcGhlcl9saXN0fSAgPSAkc2VsZi0+e2NpcGhlcnN9IGlmIGRlZmluZWQgJHNlbGYtPntjaXBoZXJzfTsKKyAgICAkb3B0cy0+e1NTTF9rZXlfZmlsZX0gICAgID0gJHNlbGYtPntrZXl9ICAgICBpZiBkZWZpbmVkICRzZWxmLT57a2V5fTsKKyAgICAkb3B0cy0+e1NTTF91c2VfY2VydH0gICAgID0gKGRlZmluZWQgJHNlbGYtPntjZXJ0fSkgPyAxIDogMDsKKyAgICAkb3B0cy0+e1NTTF92ZXJpZnlfbW9kZX0gID0gKGRlZmluZWQgJHNlbGYtPntjYX0pID8gJHZlcmlmeSA6IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9OT05FOworICAgICRvcHRzLT57U1NMX3ZlcnNpb259ICAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e3ZlcnNpb259KSA/ICRzZWxmLT57dmVyc2lvbn0gOiAnU1NMdjIzOiFTU0x2MzohU1NMdjInOworCisgICAgcmV0dXJuIElPOjpTb2NrZXQ6OlNTTC0+bmV3KCUkb3B0cyk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDkyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNvY2tldC5wbQpAQCAtMCwwICsxLDEyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6U29ja2V0OworCit1c2UgSU86OlNvY2tldDo6U1NMOworCitwYWNrYWdlIFRocmlmdDo6U1NMU29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6U29ja2V0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0aW9uIGFuZCB1c2FnZQorIworIyBteSAkb3B0cyA9IHt9CisjIG15ICRzb2NrZXQgPSBUaHJpZnQ6OlNTTFNvY2tldC0+bmV3KFwlb3B0cyk7CisjCisjIG9wdGlvbnM6CisjCisjIEFueSBvcHRpb24gZnJvbSBTb2NrZXQucG0gaXMgdmFsaWQsIGFuZCB0aGVuOgorIworIyBjYSAgICAgICAgICA9PiBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZmlsZSAoUEVNIGZpbGUpIHRvIGF1dGhlbnRpY2F0ZSB0aGUKKyMgICAgICAgICAgICAgICAgc2VydmVyIGFnYWluc3Q7IGlmIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgc2VydmVyIGlzIG5vdAorIyAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkCisjIGNlcnQgICAgICAgID0+IGNlcnRpZmljYXRlIHRvIHVzZSBhcyB0aGUgY2xpZW50OyBpZiBub3Qgc3BlY2lmaWVkIHRoZW4KKyMgICAgICAgICAgICAgICAgdGhlIGNsaWVudCBkb2VzIG5vdCBwcmVzZW50IG9uZSBidXQgc3RpbGwgY29ubmVjdHMgdXNpbmcKKyMgICAgICAgICAgICAgICAgc2VjdXJlIHByb3RvY29sCisjIGNpcGhlcnMgICAgID0+IGFsbG93ZWQgY2lwaGVyIGxpc3QKKyMgICAgICAgICAgICAgICAgKHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvYXBwcy9jaXBoZXJzLmh0bWwjQ0lQSEVSX1NUUklOR1MpCisjIGtleSAgICAgICAgID0+IGNlcnRpZmljYXRlIGtleSBmb3IgImNlcnQiIG9wdGlvbgorIyB2ZXJzaW9uICAgICA9PiBhY2NlcHRhYmxlIFNTTC9UTFMgdmVyc2lvbnMgLSBpZiBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlCisjICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgdG8gdXNlIFNTTHYyMyBoYW5kc2hha2UgYnV0IG9ubHkgbmVnb3RpYXRlCisjICAgICAgICAgICAgICAgIGF0IFRMU3YxLjAgb3IgbGF0ZXIKKyMKKworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgX19vcGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkb3B0cyA9IHtQZWVyQWRkciAgICAgID0+ICRzZWxmLT57aG9zdH0sCisgICAgICAgICAgICAgICAgUGVlclBvcnQgICAgICA9PiAkc2VsZi0+e3BvcnR9LAorICAgICAgICAgICAgICAgIFByb3RvICAgICAgICAgPT4gJ3RjcCcsCisgICAgICAgICAgICAgICAgVGltZW91dCAgICAgICA9PiAkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDB9OworCisgICAgbXkgJHZlcmlmeSA9IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9QRUVSIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOworCisgICAgJG9wdHMtPntTU0xfY2FfZmlsZX0gICAgICA9ICRzZWxmLT57Y2F9ICAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NhfTsKKyAgICAkb3B0cy0+e1NTTF9jZXJ0X2ZpbGV9ICAgID0gJHNlbGYtPntjZXJ0fSAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2VydH07CisgICAgJG9wdHMtPntTU0xfY2lwaGVyX2xpc3R9ICA9ICRzZWxmLT57Y2lwaGVyc30gaWYgZGVmaW5lZCAkc2VsZi0+e2NpcGhlcnN9OworICAgICRvcHRzLT57U1NMX2tleV9maWxlfSAgICAgPSAkc2VsZi0+e2tleX0gICAgIGlmIGRlZmluZWQgJHNlbGYtPntrZXl9OworICAgICRvcHRzLT57U1NMX3VzZV9jZXJ0fSAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e2NlcnR9KSA/IDEgOiAwOworICAgICRvcHRzLT57U1NMX3ZlcmlmeV9tb2RlfSAgPSAoZGVmaW5lZCAkc2VsZi0+e2NhfSkgPyAkdmVyaWZ5IDogSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX05PTkU7CisgICAgJG9wdHMtPntTU0xfdmVyc2lvbn0gICAgICA9IChkZWZpbmVkICRzZWxmLT57dmVyc2lvbn0pID8gJHNlbGYtPnt2ZXJzaW9ufSA6ICdTU0x2MjM6IVNTTHYzOiFTU0x2Mic7CisKKyAgICByZXR1cm4gSU86OlNvY2tldDo6U1NMLT5uZXcoJSRvcHRzKTsKK30KKworc3ViIF9fY2xvc2UKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzb2NrID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXTsKKyAgICBpZiAoJHNvY2spIHsKKyAgICAgICRzb2NrLT5jbG9zZShTU0xfbm9fc2h1dGRvd24gPT4gMSk7CisgICAgfQorfQorCitzdWIgX19yZWN2Cit7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRzb2NrID0gc2hpZnQ7CisgIG15ICRsZW4gPSBzaGlmdDsKKyAgbXkgJGJ1ZiA9IHVuZGVmOworICBpZiAoJHNvY2spIHsKKyAgICBzeXNyZWFkKCRzb2NrLCAkYnVmLCAkbGVuKTsKKyAgfQorICByZXR1cm4gJGJ1ZjsKK30KKworc3ViIF9fc2VuZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNvY2sgPSBzaGlmdDsKKyAgICBteSAkYnVmID0gc2hpZnQ7CisgICAgcmV0dXJuIHN5c3dyaXRlKCRzb2NrLCAkYnVmKTsKK30KKworc3ViIF9fd2FpdAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNvY2sgPSAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdOworICAgIGlmICgkc29jayBhbmQgJHNvY2stPnBlbmRpbmcoKSBlcSAwKSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+U1VQRVI6Ol9fd2FpdCgpOworICAgIH0KKyAgICByZXR1cm4gJHNvY2s7Cit9CisKKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXIucG0KaW5kZXggOTYwZmJkMS4uMjg4MjJlOCAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXIucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXIucG0KQEAgLTE3LDI1ICsxNywzMSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwotdXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7CiB1c2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogCiAjCiAjIFNlcnZlciBiYXNlIGNsYXNzIG1vZHVsZQogIwogcGFja2FnZSBUaHJpZnQ6OlNlcnZlcjsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAorIwogIyAzIHBvc3NpYmxlIGNvbnN0cnVjdG9yczoKICMgICAxLiAgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQorIyAgICAgICBVc2VzIGEgQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IGFuZCBhIEJpbmFyeVByb3RvY29sRmFjdG9yeS4KICMgICAyLiAgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisjICAgICAgIFVzZXMgdGhlIHNhbWUgZmFjdG9yeSBmb3IgaW5wdXQgYW5kIG91dHB1dCBvZiBlYWNoIHR5cGUuCiAjICAgMy4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKICMgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKICMgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisjCiBzdWIgbmV3CiB7CiAgICAgbXkgJGNsYXNzbmFtZSAgICA9IHNoaWZ0OwpAQCAtNDUsNyArNTEsNyBAQAogCiAgICAgaWYgKHNjYWxhciBAYXJncyA9PSAyKQogICAgIHsKLSAgICAgICRzZWxmID0gX2luaXQoJGFyZ3NbMF0sICRhcmdzWzFdLAorICAgICAgICAkc2VsZiA9IF9pbml0KCRhcmdzWzBdLCAkYXJnc1sxXSwKICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpLAogICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCksCiAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5uZXcoKSwKQEAgLTYxLDcgKzY3LDcgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIGRpZSAiVGhyaWZ0OjpTZXJ2ZXIgZXhwZWN0cyBleGFjdGx5IDIsIDQsIG9yIDYgYXJncyI7CisgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoJ1RocmlmdDo6U2VydmVyIGV4cGVjdHMgZXhhY3RseSAyLCA0LCBvciA2IGFyZ3MnKTsKICAgICB9CiAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CkBAIC04OCw3ICs5NCw3IEBACiAKIHN1YiBzZXJ2ZQogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgX2NsaWVudEJlZ2luCkBAIC0xMDksNjIgKzExNSw2OCBAQAogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJGUgICAgPSBzaGlmdDsKIAotICAgIGlmICgkZSA9fiBtL1RFeGNlcHRpb24vIGFuZCBleGlzdHMgJGUtPnttZXNzYWdlfSkgeworICAgIGlmICgkZS0+aXNhKCdUaHJpZnQ6OlRFeGNlcHRpb24nKSBhbmQgZXhpc3RzICRlLT57bWVzc2FnZX0pIHsKICAgICAgICAgbXkgJG1lc3NhZ2UgPSAkZS0+e21lc3NhZ2V9OwogICAgICAgICBteSAkY29kZSAgICA9ICRlLT57Y29kZX07CiAgICAgICAgIG15ICRvdXQgICAgID0gJGNvZGUgLiAnOicgLiAkbWVzc2FnZTsKIAogICAgICAgICAkbWVzc2FnZSA9fiBtL1RUcmFuc3BvcnRFeGNlcHRpb24vIGFuZCBkaWUgJG91dDsKLSAgICAgICAgaWYgKCRtZXNzYWdlID1+IG0vVFNvY2tldC8pIHsKLSAgICAgICAgICAgICMgc3VwcHJlc3MgVFNvY2tldCBtZXNzYWdlcwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoJG1lc3NhZ2UgPX4gbS9Tb2NrZXQvKSB7CisgICAgICAgICAgICAjIHN1cHByZXNzIFNvY2tldCBtZXNzYWdlcworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgd2FybiAkb3V0OwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAgIHdhcm4gJGU7CiAgICAgfQogfQogCi0KICMKICMgU2ltcGxlU2VydmVyIGZyb20gdGhlIFNlcnZlciBiYXNlIGNsYXNzIHRoYXQgaGFuZGxlcyBvbmUgY29ubmVjdGlvbiBhdCBhIHRpbWUKICMKIHBhY2thZ2UgVGhyaWZ0OjpTaW1wbGVTZXJ2ZXI7Ci11c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXIgKTsKK3VzZSBwYXJlbnQgLW5vcmVxdWlyZSwgJ1RocmlmdDo6U2VydmVyJzsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKLSAgICBteSBAYXJncyAgICAgID0gQF87CiAKLSAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAYXJncyk7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCiBzdWIgc2VydmUKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzdG9wID0gMDsKIAogICAgICRzZWxmLT57c2VydmVyVHJhbnNwb3J0fS0+bGlzdGVuKCk7Ci0gICAgd2hpbGUgKDEpCi0gICAgeworICAgIHdoaWxlICghJHN0b3ApIHsKICAgICAgICAgbXkgJGNsaWVudCA9ICRzZWxmLT57c2VydmVyVHJhbnNwb3J0fS0+YWNjZXB0KCk7Ci0gICAgICAgIG15ICRpdHJhbnMgPSAkc2VsZi0+e2lucHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKLSAgICAgICAgbXkgJG90cmFucyA9ICRzZWxmLT57b3V0cHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKLSAgICAgICAgbXkgJGlwcm90ICA9ICRzZWxmLT57aW5wdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkaXRyYW5zKTsKLSAgICAgICAgbXkgJG9wcm90ICA9ICRzZWxmLT57b3V0cHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJG90cmFucyk7Ci0gICAgICAgIGV2YWwgewotICAgICAgICAgICAgJHNlbGYtPl9jbGllbnRCZWdpbigkaXByb3QsICRvcHJvdCk7Ci0gICAgICAgICAgICB3aGlsZSAoMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnByb2Nlc3MoJGlwcm90LCAkb3Byb3QpOworICAgICAgICBpZiAoZGVmaW5lZCAkY2xpZW50KSB7CisgICAgICAgICAgICBteSAkaXRyYW5zID0gJHNlbGYtPntpbnB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7CisgICAgICAgICAgICBteSAkb3RyYW5zID0gJHNlbGYtPntvdXRwdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOworICAgICAgICAgICAgbXkgJGlwcm90ICA9ICRzZWxmLT57aW5wdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkaXRyYW5zKTsKKyAgICAgICAgICAgIG15ICRvcHJvdCAgPSAkc2VsZi0+e291dHB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRvdHJhbnMpOworICAgICAgICAgICAgZXZhbCB7CisgICAgICAgICAgICAgICAgJHNlbGYtPl9jbGllbnRCZWdpbigkaXByb3QsICRvcHJvdCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnByb2Nlc3MoJGlwcm90LCAkb3Byb3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZigkQCkgeworICAgICAgICAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfTsgaWYoJEApIHsKLSAgICAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKKyAgICAgICAgICAgICRpdHJhbnMtPmNsb3NlKCk7CisgICAgICAgICAgICAkb3RyYW5zLT5jbG9zZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHN0b3AgPSAxOwogICAgICAgICB9Ci0KLSAgICAgICAgJGl0cmFucy0+Y2xvc2UoKTsKLSAgICAgICAgJG90cmFucy0+Y2xvc2UoKTsKICAgICB9CiB9CiAKQEAgLTE3Myw5ICsxODUsOSBAQAogIyBGb3JraW5nU2VydmVyIHRoYXQgZm9ya3MgYSBuZXcgcHJvY2VzcyBmb3IgZWFjaCByZXF1ZXN0CiAjCiBwYWNrYWdlIFRocmlmdDo6Rm9ya2luZ1NlcnZlcjsKLXVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlciApOwotCi11c2UgUE9TSVggIjpzeXNfd2FpdF9oIjsKK3VzZSBwYXJlbnQgLW5vcmVxdWlyZSwgJ1RocmlmdDo6U2VydmVyJzsKK3VzZSBQT1NJWCAnOnN5c193YWl0X2gnOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0xOTEsNiArMjAzLDkgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCisgICAgIyBUSFJJRlQtMzg0ODogd2l0aG91dCBpZ25vcmluZyBTSUdDSExELCBwZXJsIEZvcmtpbmdTZXJ2ZXIgZ29lcyBpbnRvIGEgdGlnaHQgbG9vcAorICAgICRTSUd7Q0hMRH0gPSAnSUdOT1JFJzsKKwogICAgICRzZWxmLT57c2VydmVyVHJhbnNwb3J0fS0+bGlzdGVuKCk7CiAgICAgd2hpbGUgKDEpCiAgICAgewpAQCAtMjE1LDEzICsyMzAsMTUgQEAKIAogICAgICAgICBteSAkcGlkID0gZm9yaygpOwogCi0gICAgICAgIGlmICgkcGlkKSAjcGFyZW50CisgICAgICAgIGlmICgkcGlkKQogICAgICAgICB7CiAgICAgICAgICAgICAkc2VsZi0+X3BhcmVudCgkcGlkLCAkaXRyYW5zLCAkb3RyYW5zKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICRzZWxmLT5fY2hpbGQoJGl0cmFucywgJG90cmFucywgJGlwcm90LCAkb3Byb3QpOwogICAgICAgICB9Ci0gICAgfTsgaWYoJEApIHsKKyAgICB9OworICAgIGlmKCRAKSB7CiAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKICAgICB9CiB9CkBAIC0yMzMsMTAgKzI1MCw2IEBACiAgICAgbXkgJGl0cmFucyA9IHNoaWZ0OwogICAgIG15ICRvdHJhbnMgPSBzaGlmdDsKIAotICAgICMgYWRkIGJlZm9yZSBjb2xsZWN0LCBvdGhlcndpc2UgeW91IHJhY2Ugdy8gd2FpdHBpZAotICAgICRzZWxmLT57Y2hpbGRyZW59LT57JHBpZH0gPSAxOwotICAgICRzZWxmLT5fY29sbGVjdENoaWxkcmVuKCk7Ci0KICAgICAjIFBhcmVudCBtdXN0IGNsb3NlIHNvY2tldCBvciB0aGUgY29ubmVjdGlvbiBtYXkgbm90IGdldCBjbG9zZWQgcHJvbXB0bHkKICAgICAkc2VsZi0+dHJ5Q2xvc2UoJGl0cmFucyk7CiAgICAgJHNlbGYtPnRyeUNsb3NlKCRvdHJhbnMpOwpAQCAtMjUyLDExICsyNjUsMTQgQEAKIAogICAgIG15ICRlY29kZSA9IDA7CiAgICAgZXZhbCB7CisgICAgICAgICMgVEhSSUZULTQwNjUgZW5zdXJlIGNoaWxkIHByb2Nlc3MgaGFzIG5vcm1hbCBzaWduYWwgaGFuZGxpbmcgaW4gY2FzZSB0aHJpZnQgaGFuZGxlciB1c2VzIGl0CisgICAgICAgICRTSUd7Q0hMRH0gPSAnREVGQVVMVCc7CiAgICAgICAgIHdoaWxlICgxKQogICAgICAgICB7CiAgICAgICAgICAgICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnByb2Nlc3MoJGlwcm90LCAkb3Byb3QpOwogICAgICAgICB9Ci0gICAgfTsgaWYoJEApIHsKKyAgICB9OworICAgIGlmKCRAKSB7CiAgICAgICAgICRlY29kZSA9IDE7CiAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKICAgICB9CkBAIC0yNzcsMzcgKzI5MywxOSBAQAogICAgICAgICB7CiAgICAgICAgICAgJGZpbGUtPmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICB9OyBpZigkQCkgewotICAgICAgICBpZiAoJEAgPX4gbS9URXhjZXB0aW9uLyBhbmQgZXhpc3RzICRALT57bWVzc2FnZX0pIHsKKyAgICB9OworICAgIGlmKCRAKSB7CisgICAgICAgIGlmICgkQC0+aXNhKCdUaHJpZnQ6OlRFeGNlcHRpb24nKSBhbmQgZXhpc3RzICRALT57bWVzc2FnZX0pIHsKICAgICAgICAgICAgIG15ICRtZXNzYWdlID0gJEAtPnttZXNzYWdlfTsKICAgICAgICAgICAgIG15ICRjb2RlICAgID0gJEAtPntjb2RlfTsKICAgICAgICAgICAgIG15ICRvdXQgICAgID0gJGNvZGUgLiAnOicgLiAkbWVzc2FnZTsKIAogICAgICAgICAgICAgd2FybiAkb3V0OwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgd2FybiAkQDsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3ViIF9jb2xsZWN0Q2hpbGRyZW4KLXsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgd2hpbGUgKHNjYWxhciBrZXlzICV7JHNlbGYtPntjaGlsZHJlbn19KQotICAgIHsKLSAgICAgICAgbXkgJHBpZCAgICA9IHdhaXRwaWQoLTEsIFdOT0hBTkcpOwotCi0gICAgICAgIGlmICgkcGlkPjApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZSAkc2VsZi0+e2NoaWxkcmVufS0+eyRwaWR9OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTcyNjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0KQEAgLTAsMCArMSwxMjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIElPOjpTb2NrZXQ6OklORVQ7Cit1c2UgSU86OlNlbGVjdDsKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpTb2NrZXQ7CisKK3BhY2thZ2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJUcmFuc3BvcnQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgTGVnYWN5IGNvbnN0cnVjdGlvbiB0YWtlcyBvbmUgYXJndW1lbnQsIHBvcnQgbnVtYmVyLgorIyBOZXcgY29uc3RydWN0aW9uIHRha2VzIGEgaGFzaDoKKyMgQHBhcmFtW2luXSAgaG9zdCAgIGhvc3QgaW50ZXJmYWNlIHRvIGxpc3RlbiBvbiAodW5kZWYgPSBhbGwgaW50ZXJmYWNlcykKKyMgQHBhcmFtW2luXSAgcG9ydCAgIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbiAocmVxdWlyZWQpCisjIEBwYXJhbVtpbl0gIHF1ZXVlICB0aGUgbGlzdGVuIHF1ZXVlIHNpemUgKGRlZmF1bHQgaWYgbm90IHNwZWNpZmllZCBpcyAxMjgpCisjIEBleGFtcGxlICAgIG15ICRzZXJ2ZXJzb2NrID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQtPm5ldyhob3N0ID0+IHVuZGVmLCBwb3J0ID0+IHBvcnQpCisjCitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRhcmdzICAgICAgPSBzaGlmdDsKKyAgICBteSAkc2VsZjsKKworICAgICMgU3VwcG9ydCBib3RoIG9sZC1zdHlsZSAicG9ydCBudW1iZXIiIGNvbnN0cnVjdGlvbiBhbmQgbmV3ZXIuLi4KKyAgICBpZiAocmVmKCRhcmdzKSBlcSAnSEFTSCcpIHsKKyAgICAgICAgJHNlbGYgPSAkYXJnczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmID0geyBwb3J0ID0+ICRhcmdzIH07CisgICAgfQorCisgICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57cXVldWV9KSB7CisgICAgICAgICRzZWxmLT57cXVldWV9ID0gMTI4OworICAgIH0KKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBsaXN0ZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHNvY2sgPSAkc2VsZi0+X19saXN0ZW4oKSB8fCBkbyB7CisgICAgICAgIG15ICRlcnJvciA9IHJlZigkc2VsZikgLiAnOiBDb3VsZCBub3QgYmluZCB0byAnIC4gJyo6JyAuICRzZWxmLT57cG9ydH0gLiAnICgnIC4gJCEgLiAnKSc7CisKKyAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7CisgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgfTsKKworICAgICRzZWxmLT57aGFuZGxlfSA9ICRzb2NrOworfQorCitzdWIgYWNjZXB0Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmICggZXhpc3RzICRzZWxmLT57aGFuZGxlfSBhbmQgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKSB7CisgICAgICAgIG15ICRjbGllbnQgICAgICAgID0gJHNlbGYtPntoYW5kbGV9LT5hY2NlcHQoKTsKKyAgICAgICAgbXkgJHJlc3VsdCAgICAgICAgPSAkc2VsZi0+X19jbGllbnQoKTsKKyAgICAgICAgJHJlc3VsdC0+e2hhbmRsZX0gPSBJTzo6U2VsZWN0LT5uZXcoJGNsaWVudCk7CisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHJldHVybiB1bmRlZjsKK30KKworc3ViIGNsb3NlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmICggZXhpc3RzICRzZWxmLT57aGFuZGxlfSBhbmQgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKQorICAgIHsKKyAgICAgICAgJHNlbGYtPntoYW5kbGV9LT5jbG9zZSgpOworICAgIH0KK30KKworIyMjCisjIyMgT3ZlcnJpZGFibGUgbWV0aG9kcworIyMjCisKK3N1YiBfX2NsaWVudAoreworICByZXR1cm4gVGhyaWZ0OjpTb2NrZXQtPm5ldygpOworfQorCitzdWIgX19saXN0ZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIHJldHVybiBJTzo6U29ja2V0OjpJTkVULT5uZXcoTG9jYWxBZGRyID0+ICRzZWxmLT57aG9zdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFBvcnQgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvICAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RlbiAgICA9PiAkc2VsZi0+e3F1ZXVlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldXNlQWRkciA9PiAxKTsKK30KKworCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NvY2tldC5wbQppbmRleCA3ZWJlYTM1Li5iYTBkYjVlIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1NvY2tldC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NvY2tldC5wbQpAQCAtMTcsMzcgKzE3LDYzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKIHVzZSBJTzo6U29ja2V0OjpJTkVUOwogdXNlIElPOjpTZWxlY3Q7CiAKIHBhY2thZ2UgVGhyaWZ0OjpTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpUcmFuc3BvcnQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAotdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7CisjCisjIENvbnN0cnVjdGlvbiBhbmQgdXNhZ2UKKyMKKyMgbXkgJG9wdHMgPSB7fQorIyBteSAkc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQtPm5ldyhcJW9wdHMpOworIworIyBvcHRpb25zOgorIworIyBob3N0ICAgICAgICA9PiBob3N0IHRvIGNvbm5lY3QgdG8KKyMgcG9ydCAgICAgICAgPT4gcG9ydCB0byBjb25uZWN0IHRvCisjIHNlbmRUaW1lb3V0ID0+IHRpbWVvdXQgdXNlZCBmb3Igc2VuZCBhbmQgZm9yIGNvbm5lY3QKKyMgcmVjdlRpbWVvdXQgPT4gdGltZW91dCB1c2VkIGZvciByZWN2CisjCiAKIHN1YiBuZXcKIHsKLSAgICBteSAkY2xhc3NuYW1lICAgID0gc2hpZnQ7Ci0gICAgbXkgJGhvc3QgICAgICAgICA9IHNoaWZ0IHx8ICJsb2NhbGhvc3QiOwotICAgIG15ICRwb3J0ICAgICAgICAgPSBzaGlmdCB8fCA5MDkwOwotICAgIG15ICRkZWJ1Z0hhbmRsZXIgPSBzaGlmdDsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJG9wdHMgICAgICA9IHNoaWZ0OwogCisgICAgIyBkZWZhdWx0IHNldHRpbmdzOgogICAgIG15ICRzZWxmID0gewotICAgICAgICBob3N0ICAgICAgICAgPT4gJGhvc3QsCi0gICAgICAgIHBvcnQgICAgICAgICA9PiAkcG9ydCwKLSAgICAgICAgZGVidWdIYW5kbGVyID0+ICRkZWJ1Z0hhbmRsZXIsCi0gICAgICAgIGRlYnVnICAgICAgICA9PiAwLAotICAgICAgICBzZW5kVGltZW91dCAgPT4gMTAwMDAsCisgICAgICAgIGhvc3QgICAgICAgICA9PiAnbG9jYWxob3N0JywKKyAgICAgICAgcG9ydCAgICAgICAgID0+IDkwOTAsCiAgICAgICAgIHJlY3ZUaW1lb3V0ICA9PiAxMDAwMCwKLSAgICAgICAgaGFuZGxlICAgICAgID0+IHVuZGVmLAorICAgICAgICBzZW5kVGltZW91dCAgPT4gMTAwMDAsCisKKyAgICAgICAgaGFuZGxlICAgICAgID0+IHVuZGVmCiAgICAgfTsKIAorICAgIGlmIChkZWZpbmVkICRvcHRzIGFuZCByZWYgJG9wdHMgZXEgcmVmIHt9KSB7CisKKyAgICAgICMgYXJndW1lbnQgaXMgYSBoYXNoIG9mIG9wdGlvbnMgc28gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzCisgICAgICAkc2VsZi0+eyRffSA9ICRvcHRzLT57JF99IGZvciBrZXlzICUkb3B0czsKKworICAgIH0gZWxzZSB7CisKKyAgICAgICMgb2xkZXIgc3R5bGUgY29uc3RydWN0b3IgdGFrZXMgMyBhcmd1bWVudHMsIG5vbmUgb2Ygd2hpY2ggYXJlIHJlcXVpcmVkCisgICAgICAkc2VsZi0+e2hvc3R9ID0gJG9wdHMgfHwgJ2xvY2FsaG9zdCc7CisgICAgICAkc2VsZi0+e3BvcnR9ID0gc2hpZnQgfHwgOTA5MDsKKworICAgIH0KKwogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIApAQCAtNzAsMTkgKzk2LDYgQEAKIAogCiAjCi0jU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgotIwotIyBAcGFyYW0gYm9vbCAkZGVidWcKLSMKLXN1YiBzZXREZWJ1ZwotewotICAgIG15ICRzZWxmICA9IHNoaWZ0OwotICAgIG15ICRkZWJ1ZyA9IHNoaWZ0OwotCi0gICAgJHNlbGYtPntkZWJ1Z30gPSAkZGVidWc7Ci19Ci0KLSMKICMgVGVzdHMgd2hldGhlciB0aGlzIGlzIG9wZW4KICMKICMgQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCkBAIC0xMDUsMjMgKzExOCwxMiBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKLSAgICBteSAkc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldyhQZWVyQWRkciA9PiAkc2VsZi0+e2hvc3R9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyUG9ydCA9PiAkc2VsZi0+e3BvcnR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICA9PiAndGNwJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCAgPT4gJHNlbGYtPntzZW5kVGltZW91dH0vMTAwMCkKLSAgICAgICAgfHwgZG8gewotICAgICAgICAgICAgbXkgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fS4nICgnLiQhLicpJzsKKyAgICBteSAkc29jayA9ICRzZWxmLT5fX29wZW4oKSB8fCBkbyB7CisgICAgICAgIG15ICRlcnJvciA9IHJlZigkc2VsZikuJzogQ291bGQgbm90IGNvbm5lY3QgdG8gJy4kc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LicgKCcuJCEuJyknOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICB9OwogCi0gICAgICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKLSAgICAgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigkZXJyb3IpOwotCi0gICAgICAgIH07Ci0KLQotICAgICRzZWxmLT57aGFuZGxlfSA9IG5ldyBJTzo6U2VsZWN0KCAkc29jayApOworICAgICRzZWxmLT57aGFuZGxlfSA9IElPOjpTZWxlY3QtPm5ldyggJHNvY2sgKTsKIH0KIAogIwpAQCAtMTMwLDkgKzEzMiw4IEBACiBzdWIgY2xvc2UKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgaWYoIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICl7Ci0gICAgICAgIENPUkU6OmNsb3NlKCAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdICk7CisgICAgaWYoIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkgeworICAgICAgJHNlbGYtPl9fY2xvc2UoKTsKICAgICB9CiB9CiAKQEAgLTE1MywzMCArMTU0LDIyIEBACiAgICAgbXkgJHByZSA9ICIiOwogICAgIHdoaWxlICgxKSB7CiAKLSAgICAgICAgI2NoZWNrIGZvciB0aW1lb3V0Ci0gICAgICAgIG15IEBzb2NrZXRzID0gJHNlbGYtPntoYW5kbGV9LT5jYW5fcmVhZCggJHNlbGYtPntyZWN2VGltZW91dH0gLyAxMDAwICk7Ci0KLSAgICAgICAgaWYoQHNvY2tldHMgPT0gMCl7Ci0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7Ci0gICAgICAgIH0KLQotICAgICAgICBteSAkc29jayA9ICRzb2NrZXRzWzBdOwotCi0gICAgICAgIG15ICgkYnVmLCRzeik7Ci0gICAgICAgICRzb2NrLT5yZWN2KCRidWYsICRsZW4pOworICAgICAgICBteSAkc29jayA9ICRzZWxmLT5fX3dhaXQoKTsKKyAgICAgICAgbXkgJGJ1ZiA9ICRzZWxmLT5fX3JlY3YoJHNvY2ssICRsZW4pOwogCiAgICAgICAgIGlmICghZGVmaW5lZCAkYnVmIHx8ICRidWYgZXEgJycpIHsKIAotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKIAotICAgICAgICB9IGVsc2lmICgoJHN6ID0gbGVuZ3RoKCRidWYpKSA8ICRsZW4pIHsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoKG15ICRzeiA9IGxlbmd0aCgkYnVmKSkgPCAkbGVuKSB7CiAKICAgICAgICAgICAgICRwcmUgLj0gJGJ1ZjsKICAgICAgICAgICAgICRsZW4gLT0gJHN6OwogCi0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gJHByZS4kYnVmOwogICAgICAgICB9CiAgICAgfQpAQCAtMTk1LDIzICsxODgsMTMgQEAKIAogICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX07CiAKLSAgICAjY2hlY2sgZm9yIHRpbWVvdXQKLSAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3JlYWQoICRzZWxmLT57cmVjdlRpbWVvdXR9IC8gMTAwMCApOwotCi0gICAgaWYoQHNvY2tldHMgPT0gMCl7Ci0gICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgcmVhZGluZyAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOwotICAgIH0KLQotICAgIG15ICRzb2NrID0gJHNvY2tldHNbMF07Ci0KLSAgICBteSAoJGJ1Ziwkc3opOwotICAgICRzb2NrLT5yZWN2KCRidWYsICRsZW4pOworICAgIG15ICRzb2NrID0gJHNlbGYtPl9fd2FpdCgpOworICAgIG15ICRidWYgPSAkc2VsZi0+X19yZWN2KCRzb2NrLCAkbGVuKTsKIAogICAgIGlmICghZGVmaW5lZCAkYnVmIHx8ICRidWYgZXEgJycpIHsKIAotICAgICAgICBkaWUgbmV3IFRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKIAogICAgIH0KIApAQCAtMjI5LDMwICsyMTIsMjcgQEAKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRidWYgID0gc2hpZnQ7CiAKLQogICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX07CiAKICAgICB3aGlsZSAobGVuZ3RoKCRidWYpID4gMCkgewotCi0KICAgICAgICAgI2NoZWNrIGZvciB0aW1lb3V0CiAgICAgICAgIG15IEBzb2NrZXRzID0gJHNlbGYtPntoYW5kbGV9LT5jYW5fd3JpdGUoICRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMCApOwogCiAgICAgICAgIGlmKEBzb2NrZXRzID09IDApewotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCB3cml0aW5nIHRvIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogdGltZWQgb3V0IHdyaXRpbmcgdG8gYnl0ZXMgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpOwogICAgICAgICB9CiAKLSAgICAgICAgbXkgJHNvY2sgPSAkc29ja2V0c1swXTsKKyAgICAgICAgbXkgJHNlbnQgPSAkc2VsZi0+X19zZW5kKCRzb2NrZXRzWzBdLCAkYnVmKTsKIAotICAgICAgICBteSAkZ290ID0gJHNvY2stPnNlbmQoJGJ1Zik7CisgICAgICAgIGlmICghZGVmaW5lZCAkc2VudCB8fCAkc2VudCA9PSAwICkgewogCi0gICAgICAgIGlmICghZGVmaW5lZCAkZ290IHx8ICRnb3QgPT0gMCApIHsKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJy5sZW5ndGgoJGJ1ZikuJyBieXRlcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntob3N0fSk7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiBDb3VsZCBub3Qgd3JpdGUgJy5sZW5ndGgoJGJ1ZikuJyBieXRlcyAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntob3N0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CisKICAgICAgICAgfQogCi0gICAgICAgICRidWYgPSBzdWJzdHIoJGJ1ZiwgJGdvdCk7CisgICAgICAgICRidWYgPSBzdWJzdHIoJGJ1ZiwgJHNlbnQpOwogICAgIH0KIH0KIApAQCAtMjY1LDY1ICsyNDUsODIgQEAKIAogICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX07CiAKLSAgICBteSAkcmV0ICA9ICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF0tPmZsdXNoOworICAgIG15ICRyZXQgPSAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdLT5mbHVzaDsKIH0KIAorIyMjCisjIyMgT3ZlcnJpZGFibGUgbWV0aG9kcworIyMjCiAKICMKLSMgQnVpbGQgYSBTZXJ2ZXJTb2NrZXQgZnJvbSB0aGUgU2VydmVyVHJhbnNwb3J0IGJhc2UgY2xhc3MKKyMgT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSBzZXJ2ZXIuCiAjCi1wYWNrYWdlICBUaHJpZnQ6OlNlcnZlclNvY2tldDsKLQotdXNlIGJhc2UgcXcoIFRocmlmdDo6U29ja2V0IFRocmlmdDo6U2VydmVyVHJhbnNwb3J0ICk7Ci0KLXVzZSBjb25zdGFudCBMSVNURU5fUVVFVUVfU0laRSA9PiAxMjg7Ci0KLXN1YiBuZXcKLXsKLSAgICBteSAkY2xhc3NuYW1lICAgPSBzaGlmdDsKLSAgICBteSAkcG9ydCAgICAgICAgPSBzaGlmdDsKLQotICAgIG15ICRzZWxmICAgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcodW5kZWYsICRwb3J0LCB1bmRlZik7Ci0gICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwotfQotCi1zdWIgbGlzdGVuCitzdWIgX19vcGVuCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgICMgTGlzdGVuIHRvIGEgbmV3IHNvY2tldAotICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KExvY2FsQWRkciA9PiB1bmRlZiwgIyBhbnkgYWRkcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsUG9ydCA9PiAkc2VsZi0+e3BvcnR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvICAgICA9PiAndGNwJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0ZW4gICAgPT4gTElTVEVOX1FVRVVFX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV1c2VBZGRyID0+IDEpCi0gICAgICAgIHx8IGRvIHsKLSAgICAgICAgICAgIG15ICRlcnJvciA9ICdUU2VydmVyU29ja2V0OiBDb3VsZCBub3QgYmluZCB0byAnIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0gLiAnOicgLiAkc2VsZi0+e3BvcnR9IC4gJyAoJyAuICQhIC4gJyknOwotCi0gICAgICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKLSAgICAgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigkZXJyb3IpOwotICAgICAgICB9OwotCi0gICAgJHNlbGYtPntoYW5kbGV9ID0gJHNvY2s7CisgICAgcmV0dXJuIElPOjpTb2NrZXQ6OklORVQtPm5ldyhQZWVyQWRkciA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCAgPT4gJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwKTsKIH0KIAotc3ViIGFjY2VwdAorIworIyBDbG9zZSB0aGUgY29ubmVjdGlvbgorIworc3ViIF9fY2xvc2UKK3sKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBDT1JFOjpjbG9zZSgoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdKTsKK30KKworIworIyBSZWFkIGRhdGEKKyMKKyMgQHBhcmFtW2luXSAkc29jayB0aGUgc29ja2V0CisjIEBwYXJhbVtpbl0gJGxlbiB0aGUgbGVuZ3RoIHRvIHJlYWQKKyMgQHJldHVybnMgdGhlIGRhdGEgYnVmZmVyIHRoYXQgd2FzIHJlYWQKKyMKK3N1YiBfX3JlY3YKK3sKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHNvY2sgPSBzaGlmdDsKKyAgbXkgJGxlbiA9IHNoaWZ0OworICBteSAkYnVmID0gdW5kZWY7CisgICRzb2NrLT5yZWN2KCRidWYsICRsZW4pOworICByZXR1cm4gJGJ1ZjsKK30KKworIworIyBTZW5kIGRhdGEKKyMKKyMgQHBhcmFtW2luXSAkc29jayB0aGUgc29ja2V0CisjIEBwYXJhbVtpbl0gJGJ1ZiB0aGUgZGF0YSBidWZmZXIKKyMgQHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuCisjCitzdWIgX19zZW5kCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc29jayA9IHNoaWZ0OworICAgIG15ICRidWYgPSBzaGlmdDsKKyAgICByZXR1cm4gJHNvY2stPnNlbmQoJGJ1Zik7Cit9CiAKLSAgICBpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gYW5kIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkKLSAgICB7Ci0gICAgICAgIG15ICRjbGllbnQgICAgICAgID0gJHNlbGYtPntoYW5kbGV9LT5hY2NlcHQoKTsKLSAgICAgICAgbXkgJHJlc3VsdCAgICAgICAgPSBuZXcgVGhyaWZ0OjpTb2NrZXQ7Ci0gICAgICAgICRyZXN1bHQtPntoYW5kbGV9ID0gbmV3IElPOjpTZWxlY3QoJGNsaWVudCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OworIworIyBXYWl0IGZvciBkYXRhIHRvIGJlIHJlYWRhYmxlCisjCisjIEByZXR1cm5zIGEgc29ja2V0IHRoYXQgY2FuIGJlIHJlYWQKKyMKK3N1YiBfX3dhaXQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15IEBzb2NrZXRzID0gJHNlbGYtPntoYW5kbGV9LT5jYW5fcmVhZCggJHNlbGYtPntyZWN2VGltZW91dH0gLyAxMDAwICk7CisKKyAgICBpZiAoQHNvY2tldHMgPT0gMCkgeworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiB0aW1lZCBvdXQgcmVhZGluZyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gJHNvY2tldHNbMF07CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1RyYW5zcG9ydC5wbQppbmRleCA1ZWM2ZmVlLi40MWI3ZTE1IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1RyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1RyYW5zcG9ydC5wbQpAQCAtMTcsMTcgKzE3LDE5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiAKICMKICMgVHJhbnNwb3J0IGV4Y2VwdGlvbnMKICMKLXBhY2thZ2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3BhY2thZ2UgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNlIGJhc2UoJ1RocmlmdDo6VEV4Y2VwdGlvbicpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiB1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgID0+IDA7CiB1c2UgY29uc3RhbnQgTk9UX09QRU4gICAgID0+IDE7CkBAIC0zNSw3ICszNyw3IEBACiB1c2UgY29uc3RhbnQgVElNRURfT1VUICAgID0+IDM7CiB1c2UgY29uc3RhbnQgRU5EX09GX0ZJTEUgID0+IDQ7CiAKLXN1YiBuZXd7CitzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CiAgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOwogCkBAIC00Myw2ICs0NSw3IEBACiB9CiAKIHBhY2thZ2UgVGhyaWZ0OjpUcmFuc3BvcnQ7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKICMKICMgV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgpAQCAtNTEsNyArNTQsNyBAQAogIwogc3ViIGlzT3BlbgogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC02MSw3ICs2NCw3IEBACiAjCiBzdWIgb3BlbgogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC02OSw3ICs3Miw3IEBACiAjCiBzdWIgY2xvc2UKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtODEsOCArODQsNyBAQAogIwogc3ViIHJlYWQKIHsKLSAgICBteSAoJGxlbik7Ci0gICAgZGllKCJhYnN0cmFjdCIpOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0xMTQsOCArMTE2LDcgQEAKICMKIHN1YiB3cml0ZQogewotICAgIG15ICgkYnVmKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMTMwLDYgKzEzMSw3IEBACiAjIFRyYW5zcG9ydEZhY3RvcnkgY3JlYXRlcyB0cmFuc3BvcnQgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKICMKIHBhY2thZ2UgVGhyaWZ0OjpUcmFuc3BvcnRGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC0xNTYsMjAgKzE1OCwyMSBAQAogIyAgU2VydmVyVHJhbnNwb3J0IGJhc2UgY2xhc3MgbW9kdWxlCiAjCiBwYWNrYWdlIFRocmlmdDo6U2VydmVyVHJhbnNwb3J0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbGlzdGVuCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiBhY2NlcHQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIGNsb3NlCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9UeXBlLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9UeXBlLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOGRhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1R5cGUucG0KQEAgLTAsMCArMSw1MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OworCisjCisjIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CisjCitwYWNrYWdlIFRocmlmdDo6VFR5cGU7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBjb25zdGFudCBTVE9QICAgPT4gMDsKK3VzZSBjb25zdGFudCBWT0lEICAgPT4gMTsKK3VzZSBjb25zdGFudCBCT09MICAgPT4gMjsKK3VzZSBjb25zdGFudCBCWVRFICAgPT4gMzsKK3VzZSBjb25zdGFudCBJMDggICAgPT4gMzsKK3VzZSBjb25zdGFudCBET1VCTEUgPT4gNDsKK3VzZSBjb25zdGFudCBJMTYgICAgPT4gNjsKK3VzZSBjb25zdGFudCBJMzIgICAgPT4gODsKK3VzZSBjb25zdGFudCBJNjQgICAgPT4gMTA7Cit1c2UgY29uc3RhbnQgU1RSSU5HID0+IDExOwordXNlIGNvbnN0YW50IFVURjcgICA9PiAxMTsKK3VzZSBjb25zdGFudCBTVFJVQ1QgPT4gMTI7Cit1c2UgY29uc3RhbnQgTUFQICAgID0+IDEzOwordXNlIGNvbnN0YW50IFNFVCAgICA9PiAxNDsKK3VzZSBjb25zdGFudCBMSVNUICAgPT4gMTU7Cit1c2UgY29uc3RhbnQgVVRGOCAgID0+IDE2OwordXNlIGNvbnN0YW50IFVURjE2ICA9PiAxNzsKKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzVlODA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtCkBAIC0wLDAgKzEsODQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKK3VzZSBUaHJpZnQ6OlVuaXhTb2NrZXQ7CisKK3VzZSBJTzo6U29ja2V0OjpVTklYOworCitwYWNrYWdlIFRocmlmdDo6VW5peFNlcnZlclNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdG9yLgorIyBJZiBhIHNpbmdsZSBhcmd1bWVudCBpcyBnaXZlbiB0aGF0IGlzIG5vdCBhIGhhc2gsIHRoYXQgaXMgdGhlIHVuaXggZG9tYWluIHNvY2tldCBwYXRoLgorIyBJZiBhIHNpbmdsZSBhcmd1bWVudCBpcyBnaXZlbiB0aGF0IGlzIGEgaGFzaDoKKyMgQHBhcmFtW2luXSAgcGF0aCAgIHVuaXggZG9tYWluIHNvY2tldCBmaWxlIG5hbWUKKyMgQHBhcmFtW2luXSAgcXVldWUgIHRoZSBsaXN0ZW4gcXVldWUgc2l6ZSAoZGVmYXVsdCBpcyBub3Qgc3BlY2lmaWVkIGlzIHN1cHBsaWVkIGJ5IFNlcnZlclNvY2tldCkKKyMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQtPm5ldygkcGF0aCk7CisjIEBleGFtcGxlICAgIG15ICRzZXJ2ZXJzb2NrID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcocGF0aCA9PiAic29tZXBhdGgiLCBxdWV1ZSA9PiA2NCk7CisjCitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRhcmdzICAgICAgPSBzaGlmdDsKKyAgICBteSAkc2VsZjsKKworICAgIGlmIChyZWYoJGFyZ3MpIGVxICdIQVNIJykgeworICAgICAgICAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJGFyZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgICRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygpOworICAgICAgICAkc2VsZi0+e3BhdGh9ID0gJGFyZ3M7CisgICAgfQorCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIF9fY2xpZW50Cit7CisgIHJldHVybiBUaHJpZnQ6OlVuaXhTb2NrZXQtPm5ldygpOworfQorCitzdWIgX19saXN0ZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpVTklYLT5uZXcoCisgICAgICAgIFR5cGUgICAgICA9PiBJTzo6U29ja2V0OjpTT0NLX1NUUkVBTSwKKyAgICAgICAgTG9jYWwgICAgID0+ICRzZWxmLT57cGF0aH0sCisgICAgICAgIExpc3RlbiAgICA9PiAkc2VsZi0+e3F1ZXVlfSkKKyAgICB8fCBkbyB7CisgICAgICAgIG15ICRlcnJvciA9ICdVbml4U2VydmVyU29ja2V0OiBDb3VsZCBub3QgYmluZCB0byAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntwYXRofSAuICcgKCcgLiAkISAuICcpJzsKKyAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7CisgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CisKKyAgICByZXR1cm4gJHNvY2s7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzODZkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNvY2tldC5wbQpAQCAtMCwwICsxLDY3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTb2NrZXQ7CisKK3VzZSBJTzo6U29ja2V0OjpVTklYOworCitwYWNrYWdlIFRocmlmdDo6VW5peFNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdG9yLgorIyBUYWtlcyBhIHVuaXggZG9tYWluIHNvY2tldCBmaWxlbmFtZS4KKyMgU2VlIFRocmlmdDo6U29ja2V0IGZvciBiYXNlIGNsYXNzIHBhcmFtZXRlcnMuCisjIEBwYXJhbVtpbl0gIHBhdGggICBwYXRoIHRvIHVuaXggc29ja2V0IGZpbGUKKyMgQGV4YW1wbGUgICAgbXkgJHNvY2sgPSBUaHJpZnQ6OlVuaXhTb2NrZXQtPm5ldygkcGF0aCk7CisjCitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCk7CisgICAgJHNlbGYtPntwYXRofSA9IHNoaWZ0OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX29wZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpVTklYLT5uZXcoCisgICAgICAgIFR5cGUgICAgICA9PiBJTzo6U29ja2V0OjpTT0NLX1NUUkVBTSwKKyAgICAgICAgUGVlciAgICAgID0+ICRzZWxmLT57cGF0aH0pCisgICAgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSAnVW5peFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuCisgICAgICAgICAgICAkc2VsZi0+e3BhdGh9IC4gJyAoJyAuICQhIC4gJyknOworICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKKyAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgfTsKKworICAgIHJldHVybiAkc29jazsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtCmluZGV4IDc5NWFhZWQuLmRlMDM5NzEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsMTUgKzE3LDQgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9IEB0b3BfYnVpbGRkaXJAL2NvbXBpbGVyL2NwcC90aHJpZnQKLVRIUklGVF9JRiA9IEB0b3Bfc3JjZGlyQC90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0KLWNoZWNrLWxvY2FsOiBnZW4tcGVybC9UaHJpZnRUZXN0L1R5cGVzLnBtCi0KLWdlbi1wZXJsL1RocmlmdFRlc3QvVHlwZXMucG06ICQoVEhSSUZUX0lGKQotCSQoVEhSSUZUKSAtLWdlbiBwZXJsICQoVEhSSUZUX0lGKQotCi1jbGVhbi1sb2NhbDoKLQlybSAtcmYgZ2VuLXBlcmwKLQotRVhUUkFfRElTVCA9IG1lbW9yeV9idWZmZXIudCBwcm9jZXNzb3IudAorRVhUUkFfRElTVCA9IG1lbW9yeV9idWZmZXIudCBwcm9jZXNzb3IudCBtdWx0aXBsZXgudApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudCBiL2xpYi9wZXJsL3Rlc3QvbXVsdGlwbGV4LnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhOWI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL3Rlc3QvbXVsdGlwbGV4LnQKQEAgLTAsMCArMSwyMDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgVGVzdDo6TW9yZSB0ZXN0cyA9PiA2OworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlcjsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3I7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXI7Cit1c2UgVGhyaWZ0OjpTb2NrZXQ7CisKK3VzZSBCZW5jaG1hcmtTZXJ2aWNlOwordXNlIEFnZ3I7CisKK3VzZSBjb25zdGFudCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UgPT4gJ0JlbmNobWFya1NlcnZpY2UnOwordXNlIGNvbnN0YW50IE5BTUVfQUdHUiAgPT4gICdBZ2dyJzsKKworbXkgJGJ1ZmZlciAgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoMTAyNCk7CitteSAkYWdncl9wcm90b2NvbCAgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJGJ1ZmZlciksIE5BTUVfQUdHUik7CitteSAkYWdncl9jbGllbnQgICAgPSBBZ2dyQ2xpZW50LT5uZXcoJGFnZ3JfcHJvdG9jb2wpOworbXkgJGJlbmNobWFya19wcm90b2NvbCA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbC0+bmV3KFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkYnVmZmVyKSwgTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKK215ICRiZW5jaG1hcmtfY2xpZW50ID0gQmVuY2htYXJrU2VydmljZUNsaWVudC0+bmV3KCRiZW5jaG1hcmtfcHJvdG9jb2wpOyAKKworJGJ1ZmZlci0+b3BlbigpOworCitmb3IobXkgJGkgPSAxOyAkaSA8PSA1OyAkaSsrKSB7CisgICAgJGFnZ3JfY2xpZW50LT5zZW5kX2FkZFZhbHVlKCRpKTsKKyAgICAkYWdncl9jbGllbnQtPntzZXFpZH0rKzsKK30KKworJGFnZ3JfY2xpZW50LT5zZW5kX2dldFZhbHVlcygpOworCitmb3IobXkgJGkgPSAxOyAkaSA8PSA1OyAkaSsrKSB7CisgICAgJGJlbmNobWFya19jbGllbnQtPnNlbmRfZmlib25hY2NpKCRpKTsKKyAgICAkYmVuY2htYXJrX2NsaWVudC0+e3NlcWlkfSsrOworfQorJGJlbmNobWFya19jbGllbnQtPntzZXFpZH0tLTsKKworbXkgJGNsaWVudF9jb21tYW5kX2JpbmFyeSA9ICRidWZmZXItPmdldEJ1ZmZlcjsKKyRidWZmZXItPnJlc2V0QnVmZmVyOworCisKKyMgUHJvY2VzcyBieSBzZXJ2ZXIKK215ICRzZXJ2ZXJfb3V0cHV0X2JpbmFyeTsKK3sKKyAgICBteSAkYmVuY2htYXJrX2hhbmRsZXIgPSBNeTo6QmVuY2htYXJrU2VydmljZS0+bmV3KCk7CisgICAgbXkgJGJlbmNobWFya19wcm9jZXNzb3IgPSBCZW5jaG1hcmtTZXJ2aWNlUHJvY2Vzc29yLT5uZXcoJGJlbmNobWFya19oYW5kbGVyKTsKKyAgICBteSAkYWdncl9oYW5kbGVyID0gTXk6OkFnZ3ItPm5ldygpOyAKKyAgICBteSAkYWdncl9wcm9jZXNzb3IgPSBBZ2dyUHJvY2Vzc29yLT5uZXcoJGFnZ3JfaGFuZGxlcik7CisgICAgCisgICAgbXkgJHByb3RvY29sX2ZhY3RvcnkgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS0+bmV3KCk7CisKKyAgICBteSAkaW5wdXRfYnVmZmVyICAgID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXItPm5ldygpOworICAgICRpbnB1dF9idWZmZXItPndyaXRlKCRjbGllbnRfY29tbWFuZF9iaW5hcnkpOworCisgICAgbXkgJGlucHV0X3Byb3RvY29sICA9ICRwcm90b2NvbF9mYWN0b3J5LT5nZXRQcm90b2NvbCgkaW5wdXRfYnVmZmVyKTsKKworICAgIG15ICRvdXRwdXRfYnVmZmVyICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KCk7CisgICAgbXkgJG91dHB1dF9wcm90b2NvbCA9ICRwcm90b2NvbF9mYWN0b3J5LT5nZXRQcm90b2NvbCgkb3V0cHV0X2J1ZmZlcik7CisKKyAgICBteSAkcHJvY2Vzc29yID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3Nvci0+bmV3KCk7CisKKyAgICAkcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcihOQU1FX0JFTkNITUFSS1NFUlZJQ0UsICRiZW5jaG1hcmtfcHJvY2Vzc29yKTsKKyAgICAkcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcihOQU1FX0FHR1IsICRhZ2dyX3Byb2Nlc3Nvcik7CisgICAgbXkgJHJlc3VsdDsKKyAgICBmb3IobXkgJGkgPSAxOyAkaSA8PSAxMTsgJGkrKykgeworICAgICAgICAkcmVzdWx0ID0gJHByb2Nlc3Nvci0+cHJvY2VzcygkaW5wdXRfcHJvdG9jb2wsICRvdXRwdXRfcHJvdG9jb2wpOworICAgICAgICBwcmludCAicHJvY2VzcyByZXN1bHRlZCBpbiAkcmVzdWx0XG4iOworICAgIH0KKworICAgICRzZXJ2ZXJfb3V0cHV0X2JpbmFyeSA9ICRvdXRwdXRfYnVmZmVyLT5nZXRCdWZmZXIoKTsKK30KKworJGJ1ZmZlci0+d3JpdGUoJHNlcnZlcl9vdXRwdXRfYmluYXJ5KTsKKworCisKK2ZvcihteSAkaSA9IDE7ICRpIDw9IDU7ICRpKyspIHsKKyAgICBteSAoJGZ1bmN0aW9uX25hbWUsICRtZXNzYWdlX3R5cGUsICRzZXF1ZW5jZV9pZCk7CisKKyAgICAkYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKKworICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKKyAgICAgICBkaWU7CisgICAgfQorICAgIAorICAgIG15ICRhZ2dyX3Jlc3VsdCA9IEFnZ3JfYWRkVmFsdWVfcmVzdWx0LT5uZXcoKTsKKyAgICAkYWdncl9yZXN1bHQtPnJlYWQoJGFnZ3JfcHJvdG9jb2wpOworICAgICRhZ2dyX3Byb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOworfQorCitteSAoJGZ1bmN0aW9uX25hbWUsICRtZXNzYWdlX3R5cGUsICRzZXF1ZW5jZV9pZCk7CisKKyRhZ2dyX3Byb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOworCitpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CisgICAgZGllOworfQorICAgIAorbXkgJGFnZ3JfcmVzdWx0ID0gQWdncl9nZXRWYWx1ZXNfcmVzdWx0LT5uZXcoKTsKKyRhZ2dyX3Jlc3VsdC0+cmVhZCgkYWdncl9wcm90b2NvbCk7CiskYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsKKworaXNfZGVlcGx5KCRhZ2dyX3Jlc3VsdC0+c3VjY2VzcygpLCBbMSwyLDMsNCw1XSk7CisgCisKK2ZvcmVhY2ggbXkgJHZhbCgoMSwyLDMsNSw4KSkgeworICAgIG15ICgkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkKTsKKworICAgICRiZW5jaG1hcmtfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CisKKyAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CisgICAgICAgIGRpZTsKKyAgICB9CisgICAgbXkgJGJlbmNobWFya19yZXN1bHQgPSBCZW5jaG1hcmtTZXJ2aWNlX2ZpYm9uYWNjaV9yZXN1bHQtPm5ldygpOworICAgICRiZW5jaG1hcmtfcmVzdWx0LT5yZWFkKCRiZW5jaG1hcmtfcHJvdG9jb2wpOworICAgICRiZW5jaG1hcmtfcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7CisgICAgCisgICAgaXMoJGJlbmNobWFya19yZXN1bHQtPnN1Y2Nlc3MoKSwgJHZhbCk7Cit9CisKKworcGFja2FnZSBNeTo6QWdncjsKK3VzZSBiYXNlIHF3KEFnZ3JJZik7IAorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOyAKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSB7fTsKKyAgICAKKyAgICAkc2VsZi0+e3ZhbHVlc30gPSAoKTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIGFkZFZhbHVleworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHZhbHVlID0gc2hpZnQ7CisKKyAgICBwdXNoIChAeyRzZWxmLT57dmFsdWVzfX0sICR2YWx1ZSk7ICAKK30KKworc3ViIGdldFZhbHVlc3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIAorICAgcmV0dXJuICRzZWxmLT57dmFsdWVzfTsKK30KKworCisKK3BhY2thZ2UgTXk6OkJlbmNobWFya1NlcnZpY2U7Cit1c2UgYmFzZSBxdyhCZW5jaG1hcmtTZXJ2aWNlSWYpOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICByZXR1cm4gYmxlc3Mge30sICRjbGFzczsKK30KKworc3ViIGZpYm9uYWNjaSB7CisgICAgbXkgKCRzZWxmLCAkbikgPSBAXzsKKyAgICAKKyAgICBteSAkcHJldiA9IDA7CisgICAgbXkgJG5leHQ7CisgICAgbXkgJHJlc3VsdCA9IDE7CisgICAgCisgICAgd2hpbGUgKCRuID4gMCkgeworICAgICAgICAkbmV4dCA9ICRyZXN1bHQgKyAkcHJldjsKKyAgICAgICAgJHByZXYgPSAkcmVzdWx0OworICAgICAgICAkcmVzdWx0ID0gJG5leHQ7CisgICAgICAgIC0tJG47CisgICAgfQorICAgIAorICAgIHJldHVybiAkcmVzdWx0OworfQorCmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L3Byb2Nlc3Nvci50IGIvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudAppbmRleCAxZDhiZTczLi5mODMzMDM1IDEwMDY0NAotLS0gYS9saWIvcGVybC90ZXN0L3Byb2Nlc3Nvci50CisrKyBiL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQKQEAgLTIyLDkgKzIyLDkgQEAKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKLXVzZSBUaHJpZnQ7CiB1c2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKIHVzZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlcjsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwogCiB1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKIHVzZSBUaHJpZnRUZXN0OjpUeXBlczsKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CiAgICAgcHJpbnQgIiAgJGZ1bmN0aW9uX25hbWUsICRtZXNzYWdlX3R5cGUsICRzZXF1ZW5jZV9pZFxuIjsKIAotICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgewogICAgICAgICBkaWU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvcGVybC90b29scy9GaXh1cERpc3QucGwgYi9saWIvcGVybC90b29scy9GaXh1cERpc3QucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhMmIyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL3Rvb2xzL0ZpeHVwRGlzdC5wbApAQCAtMCwwICsxLDM1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBUaGlzIHdpbGwgZml4IHVwIHRoZSBkaXN0cmlidXRpb24gc28gdGhhdCBDUEFOIHByb3Blcmx5CisjIGluZGV4ZXMgVGhyaWZ0LgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSB1dGY4OworCit1c2UgRGF0YTo6RHVtcGVyOwordXNlIENQQU46Ok1ldGE7CisKK215ICRtZXRhID0gQ1BBTjo6TWV0YS0+bG9hZF9maWxlKCdNRVRBLmpzb24nKTsKKyRtZXRhLT57J3Byb3ZpZGVzJ30gPSB7ICdUaHJpZnQnID0+IHsgJ2ZpbGUnID0+ICdsaWIvVGhyaWZ0LnBtJywgJ3ZlcnNpb24nID0+ICRtZXRhLT52ZXJzaW9uKCkgfSB9OworJG1ldGEtPnNhdmUoJ01FVEEuanNvbicpOwpkaWZmIC0tZ2l0IGEvbGliL3BocC9NYWtlZmlsZS5hbSBiL2xpYi9waHAvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBiOGQ3ZTkzLi44ZDkwNTBhCi0tLSBhL2xpYi9waHAvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BocC9NYWtlZmlsZS5hbQpAQCAtMTcsMzIgKzE3LDEzMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcGhwZGlyID0gJChQSFBfUFJFRklYKQotcGhwX0RBVEEgPSAgXAotICBzcmMvYXV0b2xvYWQucGhwIFwKLSAgc3JjL1RocmlmdC5waHAKIAotcGhwZXh0ZGlyID0gJChwaHBkaXIpL2V4dC90aHJpZnRfcHJvdG9jb2wKLXBocGV4dF9EQVRBID0gXAotICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgXAotICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcCBcCi0gIHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaAoraWYgV0lUSF9URVNUUworU1VCRElSUyA9IHRlc3QKK2VuZGlmCiAKLXBocHByb3RvY29sZGlyID0gJChwaHBkaXIpL3Byb3RvY29sCitpZiBXSVRIX1BIUF9FWFRFTlNJT04KKyUuc286CisJY2Qgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvICYmICQoTUFLRSkKKworcGhwY29uZmRpcj0kKFBIUF9DT05GSUdfUFJFRklYKQorcGhwY29uZl9EQVRBPXRocmlmdF9wcm90b2NvbC5pbmkKKworcGhwbW9kdWxlZGlyID0gYHBocC1jb25maWcgLS1leHRlbnNpb24tZGlyYAorcGhwbW9kdWxlX1NDUklQVFMgPSBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9tb2R1bGVzL3RocmlmdF9wcm90b2NvbC5zbworCitkaXN0Y2xlYW4tbG9jYWw6CisJY2QgJChwaHBtb2R1bGVfU0NSSVBUUykgJiYgJChQSFBJWkUpIC0tY2xlYW4KKworZW5kaWYKKworcGhwZGlyID0gJChQSFBfUFJFRklYKS8KK3BocF9EQVRBID0gXAorICBsaWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAorCitwaHBiYXNlZGlyID0gJChwaHBkaXIpL0Jhc2UKK3BocGJhc2VfREFUQSA9IFwKKyAgbGliL0Jhc2UvVEJhc2UucGhwCisKK3BocGNsYXNzbG9hZGVyZGlyID0gJChwaHBkaXIpL0NsYXNzTG9hZGVyCitwaHBjbGFzc2xvYWRlcl9EQVRBID0gXAorICBsaWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwCisKK3BocGV4Y2VwdGlvbmRpciA9ICQocGhwZGlyKS9FeGNlcHRpb24KK3BocGV4Y2VwdGlvbl9EQVRBID0gXAorICBsaWIvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAgXAorICBsaWIvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocAorCitwaHBmYWN0b3J5ZGlyID0gJChwaHBkaXIpL0ZhY3RvcnkKK3BocGZhY3RvcnlfREFUQSA9IFwKKyAgbGliL0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBcCisgIGxpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKKworcGhwcHJvdG9jb2xkaXIgPSAkKHBocGRpcikvUHJvdG9jb2wKIHBocHByb3RvY29sX0RBVEEgPSBcCi0gIHNyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwIFwKLSAgc3JjL3Byb3RvY29sL1RQcm90b2NvbC5waHAKKyAgbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UUHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAgXAorICBsaWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKIAotcGhwdHJhbnNwb3J0ZGlyID0gJChwaHBkaXIpL3RyYW5zcG9ydAorcGhwcHJvdG9jb2xqc29uZGlyID0gJChwaHBwcm90b2NvbGRpcikvSlNPTgorcGhwcHJvdG9jb2xqc29uX0RBVEEgPSBcCisgIGxpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAgXAorICBsaWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKKworcGhwcHJvdG9jb2xzaW1wbGVqc29uZGlyID0gJChwaHBwcm90b2NvbGRpcikvU2ltcGxlSlNPTgorcGhwcHJvdG9jb2xzaW1wbGVqc29uX0RBVEEgPSBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9MaXN0Q29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL1N0cnVjdENvbnRleHQucGhwCisKK3BocHNlcmlhbGl6ZXJkaXIgPSAkKHBocGRpcikvU2VyaWFsaXplcgorcGhwc2VyaWFsaXplcl9EQVRBID0gXAorICBsaWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKKworcGhwc2VydmVyZGlyID0gJChwaHBkaXIpL1NlcnZlcgorcGhwc2VydmVyX0RBVEEgPSBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgXAorICBsaWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocCBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlci5waHAgXAorICBsaWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwIFwKKyAgbGliL1NlcnZlci9UU2ltcGxlU2VydmVyLnBocAorCitwaHBzdHJpbmdmdW5jZGlyID0gJChwaHBkaXIpL1N0cmluZ0Z1bmMKK3BocHN0cmluZ2Z1bmNfREFUQSA9IFwKKyAgbGliL1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIFwKKyAgbGliL1N0cmluZ0Z1bmMvQ29yZS5waHAgXAorICBsaWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKKworcGhwdHJhbnNwb3J0ZGlyID0gJChwaHBkaXIpL1RyYW5zcG9ydAogcGhwdHJhbnNwb3J0X0RBVEEgPSBcCi0gIHNyYy90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAgXAotICBzcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgXAotICBzcmMvdHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBcCi0gIHNyYy90cmFuc3BvcnQvVFBocFN0cmVhbS5waHAgXAotICBzcmMvdHJhbnNwb3J0L1RTb2NrZXQucGhwIFwKLSAgc3JjL3RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAgXAotICBzcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCisgIGxpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKIAotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZSBNYWtlZmlsZS5pbgorcGhwdHlwZWRpciA9ICQocGhwZGlyKS9UeXBlCitwaHB0eXBlX0RBVEEgPSBcCisgIGxpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgXAorICBsaWIvVHlwZS9UVHlwZS5waHAgXAorICBsaWIvVHlwZS9UQ29uc3RhbnQucGhwCisKK0VYVFJBX0RJU1QgPSBcCisgIGxpYiBcCisgIHNyYy9hdXRvbG9hZC5waHAgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcudzMyIFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9ydW4tdGVzdHMucGhwIFwKKyAgc3JjL1RocmlmdC5waHAgXAorICBzcmMvVFN0cmluZ1V0aWxzLnBocCBcCisgIGNvZGluZ19zdGFuZGFyZHMubWQgXAorICB0aHJpZnRfcHJvdG9jb2wuaW5pIFwKKyAgUkVBRE1FLmFwYWNoZS5tZCBcCisgIFJFQURNRS5tZAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKyAgTWFrZWZpbGUgXAorICBNYWtlZmlsZS5pbgorCmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRSBiL2xpYi9waHAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjU2NmY0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotVGhyaWZ0IFBIUCBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIFBIUAotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRocmlmdCByZXF1aXJlcyBQSFAgNS4gVGhyaWZ0IG1ha2VzIGFzIGZldyBhc3N1bXB0aW9ucyBhYm91dCB5b3VyIFBIUAotZW52aXJvbm1lbnQgYXMgcG9zc2libGUgd2hpbGUgdHJ5aW5nIHRvIG1ha2Ugc29tZSBtb3JlIGFkdmFuY2VkIFBIUAotZmVhdHVyZXMgKGkuZS4gQVBDIGNhY2hlaW5nIHVzaW5nIGFzYm9sdXRlIHBhdGggVVJMcykgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLgotCi1UbyB1c2UgVGhyaWZ0IGluIHlvdXIgUEhQIGNvZGViYXNlLCB0YWtlIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLSMxKSBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9zcmMgaW50byB5b3VyIFBIUCBjb2RlYmFzZQotIzIpIFNldCAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXSB0byB0aGUgcGF0aCB5b3UgaW5zdGFsbGVkIFRocmlmdAotIzMpIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RocmlmdC5waHAnOwotCi1Ob3RlIHRoYXQgIzMgbXVzdCBiZSBkb25lIGJlZm9yZSBpbmNsdWRpbmcgYW55IG90aGVyIFRocmlmdCBmaWxlcy4KLUlmIHlvdSBkbyBub3QgZG8gIzIsIFRocmlmdC5waHAgd2lsbCBzZXQgdGhpcyBnbG9iYWwgZm9yIHlvdSwgYnV0IGl0IHdpbGwgYmUKLWRvbmUgdXNpbmcgZGlybmFtZShfX0ZJTEVfXyksIHdoaWNoIGlzIGxlc3MgZWZmaWNpZW50IHRoYW4gcHJvdmlkaW5nIHRoZSBzdGF0aWMKLXN0cmluZyB5b3Vyc2VsZi4KLQotV2hlbiB5b3UgZ2VuZXJhdGUgYSBUaHJpZnQgcGFja2FnZSB1c2luZyB0aGUgY29tcGlsZXIsIGl0IG1ha2VzIGFuIGFzc3VtcHRpb24KLWFib3V0IHdoZXJlIHlvdXIgZ2VuZXJhdGVkIGNvZGUgd2lsbCBsaXZlLiBJZiB5b3VyIGZpbGUgaXMgIk15UGFja2FnZS50aHJpZnQiLAotdGhlIGdlbmVyYXRlZCBmaWxlcyBtdXN0IGJlIGluc3RhbGxlZCBpbnRvOgotCi0kR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzL015UGFja2FnZS8nOwotCi1UaGlzIGFsbG93cyB0aGUgY29kZSBnZW5lcmF0b3IgdG8gY29tcGlsZSB5b3VyIGNvZGUgd2l0aG91dCBhbnkgZXh0cmEgZmxhZ3MKLWZvciB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBuYW1lcyB3aGlsZSBzdGlsbCBhbGxvd2luZyB5b3VyIGluY2x1ZGUgcGF0aHMgdG8KLWJlIGFic29sdXRlIChpZiB5b3UgaGF2ZSBhbiBhYnNvbHV0ZSBUSFJJRlRfUk9PVCkuCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLVBIUF9JTlRfU0laRQotCi0gIFRoaXMgYnVpbHQtaW4gc2lnbmFscyB3aGV0aGVyIHlvdXIgYXJjaGl0ZWN0dXJlIGlzIDMyIG9yIDY0IGJpdCBhbmQgaXMKLSAgdXNlZCBieSB0aGUgVEJpbmFyeVByb3RvY29sIHRvIHByb3Blcmx5IHVzZSBwYWNrKCkgYW5kIHVucGFjaygpIHRvCi0gIHNlcmlhbGl6ZSBkYXRhLgotCi1hcGNfZmV0Y2goKSwgYXBjX3N0b3JlKCkKLQotICBBUEMgY2FjaGUgaXMgdXNlZCBieSB0aGUgVFNvY2tldFBvb2wgY2xhc3MuIElmIHlvdSBkbyBub3QgaGF2ZSBBUEMgaW5zdGFsbGVkLAotICBUaHJpZnQgd2lsbCBmaWxsIGluIG51bGwgc3R1YiBmdW5jdGlvbiBkZWZpbml0aW9ucy4KZGlmZiAtLWdpdCBhL2xpYi9waHAvUkVBRE1FLmFwYWNoZSBiL2xpYi9waHAvUkVBRE1FLmFwYWNoZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0MTgzMy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL1JFQURNRS5hcGFjaGUKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1UaHJpZnQgUEhQL0FwYWNoZSBJbnRlZ3JhdGlvbgotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1CdWlsZGluZyBQSFAgVGhyaWZ0IFNlcnZpY2VzIHdpdGggQXBhY2hlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRocmlmdCBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIgd2l0aCBQSFAgaW5zdGFsbGVkLiBTYW1wbGUKLWNvZGUgaXMgcHJvdmlkZWQgYmVsb3cuIE5vdGUgdGhhdCB0byBtYWtlIHJlcXVlc3RzIHRvIHRoaXMgdHlwZSBvZiBzZXJ2ZXIKLXlvdSBtdXN0IHVzZSBhIFRIdHRwQ2xpZW50IHRyYW5zcG9ydC4KLQotU2FtcGxlIENvZGUKLT09PT09PT09PT09Ci0KLTw/cGhwCi0KLS8qKgotICogRXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBUaHJpZnQgc2VydmVyIGluIEFwYWNoZS9QSFAKLSAqCi0gKi8KLQotJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10gPSAnL3lvdXIvdGhyaWZ0L3Jvb3QnOwotCi1pbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJzsKLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzL1NlcnZpY2UvU2VydmljZS5waHAnOwotaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwJzsKLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAnOwotCi1jbGFzcyBTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIFNlcnZpY2VJZiB7Ci0gIC8vIEltcGxlbWVudCB5b3VyIGludGVyZmFjZSBhbmQgbWV0aG9kcyBoZXJlCi19Ci0KLWhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCcpOwotCi0kaGFuZGxlciA9IG5ldyBTZXJ2aWNlSGFuZGxlcigpOwotJHByb2Nlc3NvciA9IG5ldyBTZXJ2aWNlUHJvY2Vzc29yKCRoYW5kbGVyKTsKLQotLy8gVXNlIHRoZSBUUGhwU3RyZWFtIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlIGRpcmVjdGx5IGZyb20gSFRUUAotJHRyYW5zcG9ydCA9IG5ldyBUUGhwU3RyZWFtKFRQaHBTdHJlYW06Ok1PREVfUiB8IFRQaHBTdHJlYW06Ok1PREVfVyk7Ci0kcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotCi0kdHJhbnNwb3J0LT5vcGVuKCk7Ci0kcHJvY2Vzc29yLT5wcm9jZXNzKCRwcm90b2NvbCwgJHByb3RvY29sKTsKLSR0cmFuc3BvcnQtPmNsb3NlKCk7CmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRS5hcGFjaGUubWQgYi9saWIvcGhwL1JFQURNRS5hcGFjaGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5MjU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvUkVBRE1FLmFwYWNoZS5tZApAQCAtMCwwICsxLDc0IEBACitUaHJpZnQgUEhQL0FwYWNoZSBJbnRlZ3JhdGlvbgorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitCdWlsZGluZyBQSFAgVGhyaWZ0IFNlcnZpY2VzIHdpdGggQXBhY2hlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RocmlmdCBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIgd2l0aCBQSFAgaW5zdGFsbGVkLiBTYW1wbGUKK2NvZGUgaXMgcHJvdmlkZWQgYmVsb3cuIE5vdGUgdGhhdCB0byBtYWtlIHJlcXVlc3RzIHRvIHRoaXMgdHlwZSBvZiBzZXJ2ZXIKK3lvdSBtdXN0IHVzZSBhIFRIdHRwQ2xpZW50IHRyYW5zcG9ydC4KKworU2FtcGxlIENvZGUKKz09PT09PT09PT09CisKKzw/cGhwCisKK25hbWVzcGFjZSBNeU5hbWVzcGFjZTsKKworLyoqCisgKiBJbmNsdWRlIHBhdGgKKyAqLworJFRIUklGVF9ST09UID0gJy95b3VyL3RocmlmdC9yb290L2xpYic7CisKKy8qKgorICogSW5pdCBBdXRsb2FkZXIKKyAqLworcmVxdWlyZV9vbmNlICRUSFJJRlRfUk9PVCAuICcvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CisKKyRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKKyRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCAkVEhSSUZUX1JPT1QpOworJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnQnLCAkVEhSSUZUX1JPT1QgLiAnL3BhY2thZ2VzJyk7CiskbG9hZGVyLT5yZWdpc3RlcigpOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUUGhwU3RyZWFtOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7CisKKy8qKgorICogRXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBUaHJpZnQgc2VydmVyIGluIEFwYWNoZS9QSFAKKyAqLworCitjbGFzcyBTZXJ2aWNlSGFuZGxlciBpbXBsZW1lbnRzIFNlcnZpY2VJZiB7CisgIC8vIEltcGxlbWVudCB5b3VyIGludGVyZmFjZSBhbmQgbWV0aG9kcyBoZXJlCit9CisKK2hlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCcpOworCiskaGFuZGxlciA9IG5ldyBTZXJ2aWNlSGFuZGxlcigpOworJHByb2Nlc3NvciA9IG5ldyBTZXJ2aWNlUHJvY2Vzc29yKCRoYW5kbGVyKTsKKworLy8gVXNlIHRoZSBUUGhwU3RyZWFtIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlIGRpcmVjdGx5IGZyb20gSFRUUAorJHRyYW5zcG9ydCA9IG5ldyBUUGhwU3RyZWFtKFRQaHBTdHJlYW06Ok1PREVfUiB8IFRQaHBTdHJlYW06Ok1PREVfVyk7CiskcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworCiskdHJhbnNwb3J0LT5vcGVuKCk7CiskcHJvY2Vzc29yLT5wcm9jZXNzKCRwcm90b2NvbCwgJHByb3RvY29sKTsKKyR0cmFuc3BvcnQtPmNsb3NlKCk7CmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRS5tZCBiL2xpYi9waHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzAxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL1JFQURNRS5tZApAQCAtMCwwICsxLDYwIEBACitUaHJpZnQgUEhQIFNvZnR3YXJlIExpYnJhcnkKKworIyBMaWNlbnNlCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisjIFVzaW5nIFRocmlmdCB3aXRoIFBIUAorCitUaHJpZnQgcmVxdWlyZXMgUEhQIDUuIFRocmlmdCBtYWtlcyBhcyBmZXcgYXNzdW1wdGlvbnMgYWJvdXQgeW91ciBQSFAKK2Vudmlyb25tZW50IGFzIHBvc3NpYmxlIHdoaWxlIHRyeWluZyB0byBtYWtlIHNvbWUgbW9yZSBhZHZhbmNlZCBQSFAKK2ZlYXR1cmVzIChpLmUuIEFQQyBjYWNoZWluZyB1c2luZyBhc2JvbHV0ZSBwYXRoIFVSTHMpIGFzIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworVG8gdXNlIFRocmlmdCBpbiB5b3VyIFBIUCBjb2RlYmFzZSwgdGFrZSB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCisxLiBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9saWIgaW50byB5b3VyIFBIUCBjb2RlYmFzZQorMi4gQ29uZmlndXJlIFN5bWZvbnkgQXV0b2xvYWRlciAob3Igd2hhdGV2ZXIgeW91IHVzdWFsbHkgdXNlKQorCitBZnRlciB0aGF0LCB5b3UgaGF2ZSB0byBtYW51YWxseSBpbmNsdWRlIHRoZSBUaHJpZnQgcGFja2FnZQorY3JlYXRlZCBieSB0aGUgY29tcGlsZXI6CisKK2BgYAorcmVxdWlyZV9vbmNlICdwYWNrYWdlcy9TZXJ2aWNlL1NlcnZpY2UucGhwJzsKK3JlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9UeXBlcy5waHAnOworYGBgCisKKyMgRGVwZW5kZW5jaWVzCisKK1BIUF9JTlRfU0laRQorCisgICAgVGhpcyBidWlsdC1pbiBzaWduYWxzIHdoZXRoZXIgeW91ciBhcmNoaXRlY3R1cmUgaXMgMzIgb3IgNjQgYml0IGFuZCBpcworICAgIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bworICAgIHNlcmlhbGl6ZSBkYXRhLgorCithcGNfZmV0Y2goKSwgYXBjX3N0b3JlKCkKKworICAgIEFQQyBjYWNoZSBpcyB1c2VkIGJ5IHRoZSBUU29ja2V0UG9vbCBjbGFzcy4gSWYgeW91IGRvIG5vdCBoYXZlIEFQQyBpbnN0YWxsZWQsCisgICAgVGhyaWZ0IHdpbGwgZmlsbCBpbiBudWxsIHN0dWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworMS4gW1BTUi00XShodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTQvKSBsb2FkZXIgaXMgbm93IHRoZSBkZWZhdWx0LiBJZiB5b3Ugd2FudCB0byB1c2UgY2xhc3MgbWFwcyBpbnN0ZWFkLCB1c2UgYC1nZW4gcGhwOmNsYXNzbWFwYC4KKworMi4gSWYgdXNpbmcgUFNSLTQsIHVzZSBgJHRocmlmdENsYXNzTG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnbmFtZXNwYWNlJywgJzxwYXRoPicpYCBpbnN0ZWFkIG9mIGAkdGhyaWZ0Q2xhc3NMb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignbmFtZXNwYWNlJywgJzxwYXRoPicpYC4KZGlmZiAtLWdpdCBhL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE3NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNSBAQAorIyMgUEhQIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbUFNSLTJdKGh0dHA6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci0yLykKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwIGIvbGliL3BocC9saWIvQmFzZS9UQmFzZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYjYzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwCkBAIC0wLDAgKzEsMzgyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEJhc2U7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZyb20gd2hpY2ggb3RoZXIgVGhyaWZ0IHN0cnVjdHMgZXh0ZW5kLiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuCisgKiBjdXQgYmFjayBvbiB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hpY2ggaXMgdHVybmluZyBvdXQgdG8gaGF2ZSBhCisgKiBub250cml2aWFsIGNvc3QganVzdCB0byBsb2FkIHRoYW5rcyB0byB0aGUgd29uZHJvdXNseSBhYnlzbWFsIGltcGxlbWVudGF0aW9uCisgKiBvZiBQSFAuIE5vdGUgdGhhdCBjb2RlIGlzIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBoZXJlIHRvIGF2b2lkIG1ha2luZworICogZnVuY3Rpb24gY2FsbHMgZm9yIGV2ZXJ5IGZpZWxkIG9yIG1lbWJlciBvZiBhIGNvbnRhaW5lci4uCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRCYXNlCit7CisgICAgcHVibGljIHN0YXRpYyAkdG1ldGhvZCA9IGFycmF5KAorICAgICAgICBUVHlwZTo6Qk9PTCA9PiAnQm9vbCcsCisgICAgICAgIFRUeXBlOjpCWVRFID0+ICdCeXRlJywKKyAgICAgICAgVFR5cGU6OkkxNiA9PiAnSTE2JywKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAnSTMyJywKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAnSTY0JywKKyAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKKyAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJworICAgICk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzcGVjID0gbnVsbCwgJHZhbHMgPSBudWxsKQorICAgIHsKKyAgICAgICAgaWYgKGlzX2FycmF5KCRzcGVjKSAmJiBpc19hcnJheSgkdmFscykpIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YWxzWyR2YXJdKSkgeworICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9ICR2YWxzWyR2YXJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpCisgICAgeworICAgICAgICAkdGhpcy0+X19jb25zdHJ1Y3QoZ2V0X29iamVjdF92YXJzKCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CisgICAgICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOworICAgICAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3JlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdnJlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR2YXJbJGtleV0gPSAkdmFsOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKKyAgICAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGVyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOworICAgICAgICB9CisgICAgICAgICR2YXIgPSBhcnJheSgpOworICAgICAgICAkX2V0eXBlID0gJHNpemUgPSAwOworICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oJF9ldHlwZSwgJHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgeworICAgICAgICAgICAgJGVsZW0gPSBudWxsOworICAgICAgICAgICAgaWYgKCRlcmVhZCAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107CisgICAgICAgICAgICAgICAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgICAgICR2YXJbJGVsZW1dID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhciBbXSA9ICRlbGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZm5hbWUgPSBudWxsOworICAgICAgICAkZnR5cGUgPSAwOworICAgICAgICAkZmlkID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgeworICAgICAgICAgICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZnR5cGVdOworICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3dyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFska3R5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOworICAgICAgICB9CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKKyAgICAgICAgICAgICR2d3JpdGUgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOworICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRld3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7CisgICAgICAgICAgICAkZXdyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOworICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7CisgICAgICAgICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKKyAgICAgICAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKKyAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAgYi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2MWJkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocApAQCAtMCwwICsxLDIwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ2xhc3NMb2FkZXIgdG8gbG9hZCBUaHJpZnQgbGlicmFyeSBhbmQgZGVmaW5pdGlvbnMKKyAqIEluc3BpcmVkIGZyb20gVW5pdmVyc2FsQ2xhc3NMb2FkZXIgZnJvbSBTeW1mb255IDIKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQuY2xhc3Nsb2FkZXIKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XENsYXNzTG9hZGVyOworCitjbGFzcyBUaHJpZnRDbGFzc0xvYWRlcgoreworICAgIC8qKgorICAgICAqIE5hbWVzcGFjZXMgcGF0aAorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG5hbWVzcGFjZXMgPSBhcnJheSgpOworCisgICAgLyoqCisgICAgICogVGhyaWZ0IGRlZmluaXRpb24gcGF0aHMKKyAgICAgKiBAdmFyIHR5cGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGRlZmluaXRpb25zID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIERvIHdlIHVzZSBBUEMgY2FjaGUgPworICAgICAqIEB2YXIgYm9vbGVhbgorICAgICAqLworICAgIHByb3RlY3RlZCAkYXBjID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBUEMgQ2FjaGUgcHJlZml4CisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGFwY19wcmVmaXg7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYXV0b2xvYWRlciB0byB1c2UgQVBDIGNhY2hlCisgICAgICogQHBhcmFtIGJvb2xlYW4gJGFwYworICAgICAqIEBwYXJhbSBzdHJpbmcgJGFwY19wcmVmaXgKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwYyA9IGZhbHNlLCAkYXBjX3ByZWZpeCA9IG51bGwpCisgICAgeworICAgICAgICAkdGhpcy0+YXBjID0gJGFwYzsKKyAgICAgICAgJHRoaXMtPmFwY19wcmVmaXggPSAkYXBjX3ByZWZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuYW1lc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZQorICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzIFRoZSBsb2NhdGlvbihzKSBvZiB0aGUgbmFtZXNwYWNlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyTmFtZXNwYWNlKCRuYW1lc3BhY2UsICRwYXRocykKKyAgICB7CisgICAgICAgICR0aGlzLT5uYW1lc3BhY2VzWyRuYW1lc3BhY2VdID0gKGFycmF5KSRwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBUaHJpZnQgZGVmaW5pdGlvbiBuYW1lc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgVGhlIGRlZmluaXRpb24gbmFtZXNwYWNlCisgICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkcGF0aHMgVGhlIGxvY2F0aW9uKHMpIG9mIHRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlckRlZmluaXRpb24oJG5hbWVzcGFjZSwgJHBhdGhzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmRlZmluaXRpb25zWyRuYW1lc3BhY2VdID0gKGFycmF5KSRwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgdGhpcyBpbnN0YW5jZSBhcyBhbiBhdXRvbG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIEJvb2xlYW4gJHByZXBlbmQgV2hldGhlciB0byBwcmVwZW5kIHRoZSBhdXRvbG9hZGVyIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcigkcHJlcGVuZCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJyksIHRydWUsICRwcmVwZW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3MsIGRlZmluaXRpb24gb3IgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxvYWRDbGFzcygkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoKHRydWUgPT09ICR0aGlzLT5hcGMgJiYgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlSW5BcGMoJGNsYXNzKSkpIG9yCisgICAgICAgICAgICAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkKKyAgICAgICAgKSB7CisgICAgICAgICAgICByZXF1aXJlX29uY2UgJGZpbGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgaW50ZXJmYWNlIGluIEFQQy4KKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZEZpbGVJbkFwYygkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoZmFsc2UgPT09ICRmaWxlID0gYXBjX2ZldGNoKCR0aGlzLT5hcGNfcHJlZml4IC4gJGNsYXNzKSkgeworICAgICAgICAgICAgYXBjX3N0b3JlKCR0aGlzLT5hcGNfcHJlZml4IC4gJGNsYXNzLCAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGNsYXNzIGluIG5hbWVzcGFjZXMgb3IgZGVmaW5pdGlvbnMgZGlyZWN0b3JpZXMKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MKKyAgICAgKiBAcmV0dXJuIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmaW5kRmlsZSgkY2xhc3MpCisgICAgeworICAgICAgICAvLyBSZW1vdmUgZmlyc3QgYmFja3NsYXNoCisgICAgICAgIGlmICgnXFwnID09ICRjbGFzc1swXSkgeworICAgICAgICAgICAgJGNsYXNzID0gc3Vic3RyKCRjbGFzcywgMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJykpIHsKKyAgICAgICAgICAgIC8vIE5hbWVzcGFjZWQgY2xhc3MgbmFtZQorICAgICAgICAgICAgJG5hbWVzcGFjZSA9IHN1YnN0cigkY2xhc3MsIDAsICRwb3MpOworCisgICAgICAgICAgICAvLyBJdGVyYXRlIGluIG5vcm1hbCBuYW1lc3BhY2VzCisgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+bmFtZXNwYWNlcyBhcyAkbnMgPT4gJGRpcnMpIHsKKyAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCisgICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9IHN1YnN0cigkY2xhc3MsICRwb3MgKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSAuICcucGhwJzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEl0ZXJhdGUgaW4gVGhyaWZ0IG5hbWVzcGFjZXMKKworICAgICAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IHBhcnQgb2YgbmFtZXNwYWNlCisgICAgICAgICAgICAkbSA9IGV4cGxvZGUoJ1xcJywgJGNsYXNzKTsKKworICAgICAgICAgICAgLy8gSWdub3JlIHdyb25nIGNhbGwKKyAgICAgICAgICAgIGlmIChjb3VudCgkbSkgPD0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJGNsYXNzID0gYXJyYXlfcG9wKCRtKTsKKyAgICAgICAgICAgICRuYW1lc3BhY2UgPSBpbXBsb2RlKCdcXCcsICRtKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmRlZmluaXRpb25zIGFzICRucyA9PiAkZGlycykgeworICAgICAgICAgICAgICAgIC8vRG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgYXV0b2xvYWRlcnMKKyAgICAgICAgICAgICAgICBpZiAoMCAhPT0gc3RycG9zKCRuYW1lc3BhY2UsICRucykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgeworICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogQXZhaWxhYmxlIGluIHNlcnZpY2U6IEludGVyZmFjZSwgQ2xpZW50LCBQcm9jZXNzb3IsIFJlc3QKKyAgICAgICAgICAgICAgICAgICAgICogQW5kIGV2ZXJ5IHNlcnZpY2UgbWV0aG9kcyAoXy4rKQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHByZWdfbWF0Y2goJyMoLispKGlmfGNsaWVudHxwcm9jZXNzb3J8cmVzdCkkI2knLCAkY2xhc3MsICRuKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHByZWdfbWF0Y2goJyMoLispX1thLXowLTldK18oYXJnc3xyZXN1bHQpJCNpJywgJGNsYXNzLCAkbikKKyAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJ1R5cGVzJzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSAkblsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkgLgorICAgICAgICAgICAgICAgICAgICAgICAgRElSRUNUT1JZX1NFUEFSQVRPUiAuCisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lIC4gJy5waHAnOworCisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiNmE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsNzYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7CisKK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgc3RhdGljICRfVFNQRUMgPQorICAgICAgICBhcnJheSgxID0+IGFycmF5KCd2YXInID0+ICdtZXNzYWdlJywKKyAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6U1RSSU5HKSwKKyAgICAgICAgICAgIDIgPT4gYXJyYXkoJ3ZhcicgPT4gJ2NvZGUnLAorICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6STMyKSk7CisKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBVTktOT1dOX01FVEhPRCA9IDE7CisgICAgY29uc3QgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOworICAgIGNvbnN0IFdST05HX01FVEhPRF9OQU1FID0gMzsKKyAgICBjb25zdCBCQURfU0VRVUVOQ0VfSUQgPSA0OworICAgIGNvbnN0IE1JU1NJTkdfUkVTVUxUID0gNTsKKyAgICBjb25zdCBJTlRFUk5BTF9FUlJPUiA9IDY7CisgICAgY29uc3QgUFJPVE9DT0xfRVJST1IgPSA3OworICAgIGNvbnN0IElOVkFMSURfVFJBTlNGT1JNID0gODsKKyAgICBjb25zdCBJTlZBTElEX1BST1RPQ09MID0gOTsKKyAgICBjb25zdCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRvdXRwdXQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPl9yZWFkKCdUQXBwbGljYXRpb25FeGNlcHRpb24nLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisgICAgICAgIGlmICgkbWVzc2FnZSA9ICR0aGlzLT5nZXRNZXNzYWdlKCkpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlOjpTVFJJTkcsIDEpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJG1lc3NhZ2UpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlmICgkY29kZSA9ICR0aGlzLT5nZXRDb2RlKCkpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlOjpJMzIsIDIpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJGNvZGUpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGJmODMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsMzg0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxCYXNlXFRCYXNlOworCisvKioKKyAqIE5PVEUobWNzbGVlKTogVGhpcyBjdXJyZW50bHkgY29udGFpbnMgYSB0b24gb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gVEJhc2UKKyAqIGJlY2F1c2Ugd2UgbmVlZCB0byBzYXZlIENQVSBjeWNsZXMgYW5kIHRoaXMgaXMgbm90IHlldCBpbiBhbiBleHRlbnNpb24uCisgKiBJZGVhbGx5IHdlJ2QgbXVsdGlwbHktaW5oZXJpdCBURXhjZXB0aW9uIGZyb20gYm90aCBFeGNlcHRpb24gYW5kIEJhc2UsIGJ1dAorICogdGhhdCdzIG5vdCBwb3NzaWJsZSBpbiBQSFAgYW5kIHRoZXJlIGFyZSBubyBtb2R1bGVzIGVpdGhlciwgc28gZm9yIG5vdyB3ZQorICogYXBvbG9nZXRpY2FsbHkgdGFrZSBhIHRyaXAgdG8gSGFja1Rvd24uCisgKgorICogQ2FuIGJlIGNhbGxlZCB3aXRoIHN0YW5kYXJkIEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSkgb3Igd2l0aAorICogVGhyaWZ0IEJhc2Ugb2JqZWN0IGNvbnN0cnVjdG9yIChzcGVjLCB2YWxzKS4KKyAqCisgKiBAcGFyYW0gbWl4ZWQgJHAxIE1lc3NhZ2UgKHN0cmluZykgb3IgdHlwZS1zcGVjIChhcnJheSkKKyAqIEBwYXJhbSBtaXhlZCAkcDIgQ29kZSAoaW50ZWdlcikgb3IgdmFsdWVzIChhcnJheSkKKyAqLworY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHAxID0gbnVsbCwgJHAyID0gMCkKKyAgICB7CisgICAgICAgIGlmIChpc19hcnJheSgkcDEpICYmIGlzX2FycmF5KCRwMikpIHsKKyAgICAgICAgICAgICRzcGVjID0gJHAxOworICAgICAgICAgICAgJHZhbHMgPSAkcDI7CisgICAgICAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgeworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFsc1skdmFyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwMSwgJHAyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgJHRtZXRob2QgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OkJPT0wgPT4gJ0Jvb2wnLAorICAgICAgICBUVHlwZTo6QllURSA9PiAnQnl0ZScsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gJ0kxNicsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gJ0kzMicsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gJ0k2NCcsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycKKyAgICApOworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CisgICAgICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOworICAgICAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3JlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdnJlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR2YXJbJGtleV0gPSAkdmFsOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKKyAgICAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGVyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOworICAgICAgICB9CisgICAgICAgICR2YXIgPSBhcnJheSgpOworICAgICAgICAkX2V0eXBlID0gJHNpemUgPSAwOworICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oJF9ldHlwZSwgJHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgeworICAgICAgICAgICAgJGVsZW0gPSBudWxsOworICAgICAgICAgICAgaWYgKCRlcmVhZCAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107CisgICAgICAgICAgICAgICAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgICAgICR2YXJbJGVsZW1dID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhciBbXSA9ICRlbGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZm5hbWUgPSBudWxsOworICAgICAgICAkZnR5cGUgPSAwOworICAgICAgICAkZmlkID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgeworICAgICAgICAgICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZnR5cGVdOworICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3dyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFska3R5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOworICAgICAgICB9CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKKyAgICAgICAgICAgICR2d3JpdGUgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOworICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRld3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7CisgICAgICAgICAgICAkZXdyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOworICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7CisgICAgICAgICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKKyAgICAgICAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKKyAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTVkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDUwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqIEBhdXRob3I6IHJtYXJpbiAobWFyaW4ucmFkdUBmYWNlYm9vay5jb20pCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKKy8qKgorICogUHJvdG9jb2wgbW9kdWxlLiBDb250YWlucyBhbGwgdGhlIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50CisgKiBhIHByb3RvY29sIGVuY29kZXIvZGVjb2Rlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCisvKioKKyAqIFByb3RvY29sIGV4Y2VwdGlvbnMKKyAqLworY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgoreworICAgIGNvbnN0IFVOS05PV04gPSAwOworICAgIGNvbnN0IElOVkFMSURfREFUQSA9IDE7CisgICAgY29uc3QgTkVHQVRJVkVfU0laRSA9IDI7CisgICAgY29uc3QgU0laRV9MSU1JVCA9IDM7CisgICAgY29uc3QgQkFEX1ZFUlNJT04gPSA0OworICAgIGNvbnN0IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgICAgY29uc3QgREVQVEhfTElNSVQgPSA2OworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDhkNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKworLyoqCisgKiBUcmFuc3BvcnQgZXhjZXB0aW9ucworICovCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgoreworICAgIGNvbnN0IFVOS05PV04gPSAwOworICAgIGNvbnN0IE5PVF9PUEVOID0gMTsKKyAgICBjb25zdCBBTFJFQURZX09QRU4gPSAyOworICAgIGNvbnN0IFRJTUVEX09VVCA9IDM7CisgICAgY29uc3QgRU5EX09GX0ZJTEUgPSA0OworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTkxODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsNDUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7CisKKy8qKgorICogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkKK3sKKyAgICBwcml2YXRlICRzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgIHByaXZhdGUgJHN0cmljdFdyaXRlXyA9IGZhbHNlOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7CisgICAgICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFucywgJHRoaXMtPnN0cmljdFJlYWRfLCAkdGhpcy0+c3RyaWN0V3JpdGVfKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZmI4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbDsKKworLyoqCisgKiBDb21wYWN0IFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmYjFkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOworCisvKioKKyAqIEpTT04gUHJvdG9jb2wgRmFjdG9yeQorICovCitjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKCR0cmFucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwNjZjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKQEAgLTAsMCArMSwzNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCisvKioKKyAqIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cworICovCitpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeQoreworICAgIC8qKgorICAgICAqIEJ1aWxkIGEgcHJvdG9jb2wgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbCBwcm90b2NvbAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGU0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAKQEAgLTAsMCArMSw2NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxTdHJpbmdGdW5jXENvcmU7Cit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcTWJzdHJpbmc7Cit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcVFN0cmluZ0Z1bmM7CisKK2NsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeQoreworICAgIHByaXZhdGUgc3RhdGljICRfaW5zdGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiBUU3RyaW5nRnVuYyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzCisgICAgICogY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSdzIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTdHJpbmdGdW5jCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCFzZWxmOjokX2luc3RhbmNlKSB7CisgICAgICAgICAgICBzZWxmOjpfc2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZWxmOjokX2luc3RhbmNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9zZXRJbnN0YW5jZSgpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQorICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogU2VlOiBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCisgICAgICAgICAqLworICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMikgeworICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBNYnN0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBtYnN0cmluZyBpcyBub3QgaW5zdGFsbGVkIG9yIGRvZXMgbm90IGhhdmUgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHIqIGZ1bmN0aW9ucyBlbmFibGVkIHNvIHVzZSBQSFAgY29yZSBzdHIqIGZ1bmN0aW9ucyBmb3IKKyAgICAgICAgICAgICAqIGJ5dGUgY291bnRpbmcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgQ29yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2YyZWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKQEAgLTAsMCArMSwxOCBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OworCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQoreworICAgIC8qKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJjYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAKQEAgLTAsMCArMSwzOSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOworCitjbGFzcyBCYXNlQ29udGV4dAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBlc2NhcGVOdW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCkKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY2NTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKQEAgLTAsMCArMSw1NCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7CisKK2NsYXNzIExpc3RDb250ZXh0IGV4dGVuZHMgQmFzZUNvbnRleHQKK3sKKyAgICBwcml2YXRlICRmaXJzdF8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBfID0gJHA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZShUSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnBfLT5yZWFkSlNPTlN5bnRheENoYXIoVEpTT05Qcm90b2NvbDo6Q09NTUEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMThjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKQEAgLTAsMCArMSw1NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOworCitjbGFzcyBMb29rYWhlYWRSZWFkZXIKK3sKKyAgICBwcml2YXRlICRoYXNEYXRhXyA9IGZhbHNlOworICAgIHByaXZhdGUgJGRhdGFfID0gYXJyYXkoKTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+aGFzRGF0YV8pIHsKKyAgICAgICAgICAgICR0aGlzLT5oYXNEYXRhXyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPmRhdGFfID0gJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEFsbCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWJzdHIoJHRoaXMtPmRhdGFfLCAwLCAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcGVlaygpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT5oYXNEYXRhXykgeworICAgICAgICAgICAgJHRoaXMtPmRhdGFfID0gJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEFsbCgxKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT5oYXNEYXRhXyA9IHRydWU7CisKKyAgICAgICAgcmV0dXJuIHN1YnN0cigkdGhpcy0+ZGF0YV8sIDAsIDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzNTNjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCkBAIC0wLDAgKzEsNjQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOworCitjbGFzcyBQYWlyQ29udGV4dCBleHRlbmRzIEJhc2VDb250ZXh0Cit7CisgICAgcHJpdmF0ZSAkZmlyc3RfID0gdHJ1ZTsKKyAgICBwcml2YXRlICRjb2xvbl8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfID0gbnVsbDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZSgkdGhpcy0+Y29sb25fID8gVEpTT05Qcm90b2NvbDo6Q09MT04gOiBUSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gISR0aGlzLT5jb2xvbl87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPnJlYWRKU09OU3ludGF4Q2hhcigkdGhpcy0+Y29sb25fID8gVEpTT05Qcm90b2NvbDo6Q09MT04gOiBUSlNPTlByb3RvY29sOjpDT01NQSk7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gISR0aGlzLT5jb2xvbl87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZXNjYXBlTnVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29sb25fOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMmI4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsMzMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworY2xhc3MgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2UpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmQxNmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApAQCAtMCwwICsxLDM1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK2NsYXNzIENvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNNYXBLZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9MaXN0Q29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzNDZkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwCkBAIC0wLDAgKzEsNDUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUU2ltcGxlSlNPTlByb3RvY29sOworCitjbGFzcyBMaXN0Q29udGV4dCBleHRlbmRzIENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGZpcnN0XyA9IHRydWU7CisgICAgcHJpdmF0ZSAkcF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICAkdGhpcy0+cF8gPSAkcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlKFRTaW1wbGVKU09OUHJvdG9jb2w6OkNPTU1BKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTWFwQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzA2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwCkBAIC0wLDAgKzEsNDcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKworY2xhc3MgTWFwQ29udGV4dCBleHRlbmRzIFN0cnVjdENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGlzS2V5ID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBwYXJlbnQ6OndyaXRlKCk7CisgICAgICAgICR0aGlzLT5pc0tleSA9ICEkdGhpcy0+aXNLZXk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzTWFwS2V5KCkKKyAgICB7CisgICAgICAgIC8vIHdlIHdhbnQgdG8gY29lcmNlIG1hcCBrZXlzIHRvIGpzb24gc3RyaW5ncyByZWdhcmRsZXNzCisgICAgICAgIC8vIG9mIHRoZWlyIHR5cGUKKyAgICAgICAgcmV0dXJuICR0aGlzLT5pc0tleTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL1N0cnVjdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGE2MmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocApAQCAtMCwwICsxLDUyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKKworY2xhc3MgU3RydWN0Q29udGV4dCBleHRlbmRzIENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGZpcnN0XyA9IHRydWU7CisgICAgcHJvdGVjdGVkICRjb2xvbl8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBfID0gJHA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlKAorICAgICAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPworICAgICAgICAgICAgICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sOjpDT0xPTiA6CisgICAgICAgICAgICAgICAgICAgIFRTaW1wbGVKU09OUHJvdG9jb2w6OkNPTU1BCisgICAgICAgICAgICApOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhNWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKQEAgLTAsMCArMSw0NTMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCisgKgorICovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworICAgIGNvbnN0IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisKKyAgICBwcm90ZWN0ZWQgJHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgcHJvdGVjdGVkICRzdHJpY3RXcml0ZV8gPSB0cnVlOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQgPSBmYWxzZSwgJHN0cmljdFdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKKyAgICAgICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7CisgICAgICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5zdHJpY3RXcml0ZV8pIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gc2VsZjo6VkVSU0lPTl8xIHwgJHR5cGU7CisKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVCeXRlKCRmaWVsZFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkxNigkZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgka2V5VHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdmFsVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlID8gMSA6IDApOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnbicsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAyKTsKKworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdOJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDQpOworCisgICAgICAgIHJldHVybiA0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpCisgICAgeworICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAorICAgICAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7CisgICAgICAgICAgICAkbmVnID0gJHZhbHVlIDwgMDsKKworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgKj0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRoaSA9IChpbnQpKCR2YWx1ZSAvIDQyOTQ5NjcyOTYpOworICAgICAgICAgICAgJGxvID0gKGludCkkdmFsdWU7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaTsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvOworICAgICAgICAgICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRoaSA9ICR2YWx1ZSA+PiAzMjsKKyAgICAgICAgICAgICRsbyA9ICR2YWx1ZSAmIDB4RkZGRkZGRkY7CisgICAgICAgICAgICAkZGF0YSA9IHBhY2soJ04yJywgJGhpLCAkbG8pOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2QnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPndyaXRlSTMyKCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkc3opOworICAgICAgICBpZiAoJHN6IDwgMCkgeworICAgICAgICAgICAgJHZlcnNpb24gPSAoaW50KSgkc3ogJiBzZWxmOjpWRVJTSU9OX01BU0spOworICAgICAgICAgICAgaWYgKCR2ZXJzaW9uICE9IChpbnQpc2VsZjo6VkVSU0lPTl8xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJyAuICRzeiwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdHlwZSA9ICRzeiAmIDB4MDAwMDAwZmY7CisgICAgICAgICAgICAkcmVzdWx0ICs9CisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCR0aGlzLT5zdHJpY3RSZWFkXykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JywKKyAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0CisgICAgICAgICAgICAgICAgJG5hbWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRzeik7CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPQorICAgICAgICAgICAgICAgICAgICAkc3ogKworICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgICRuYW1lID0gJyc7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7CisgICAgICAgIGlmICgkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAkZmllbGRJZCA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICB9CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkSWQpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJGtleVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkdmFsVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdID09IDE7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgyKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnbicsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKyAgICAgICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZikgeworICAgICAgICAgICAgJHZhbHVlID0gMCAtICgoJHZhbHVlIC0gMSkgXiAweGZmZmYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg0KTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKyAgICAgICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpOworCisgICAgICAgICRhcnIgPSB1bnBhY2soJ04yJywgJGRhdGEpOworCisgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCisgICAgICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKKyAgICAgICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAorICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKKyAgICAgICAgICAgICRoaSA9ICRhcnJbMV07CisgICAgICAgICAgICAkbG8gPSAkYXJyWzJdOworICAgICAgICAgICAgJGlzTmVnID0gJGhpIDwgMDsKKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICRsbyA9IH4kbG8gJiAoaW50KTB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgICAgICBpZiAoJGxvID09IChpbnQpMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkaGkrKzsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkbG8rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvcmNlIDMyYml0IHdvcmRzIGluIGV4Y2VzcyBvZiAyRyB0byBwZSBwb3NpdGl2ZSAtIHdlIGRlYWwgd2lnaCBzaWduCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IGJlbG93CisKKyAgICAgICAgICAgIGlmICgkaGkgJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkaGkgJj0gKGludCkweDdmZmZmZmZmOworICAgICAgICAgICAgICAgICRoaSArPSAweDgwMDAwMDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgJGxvICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHZhbHVlID0gJGhpICogNDI5NDk2NzI5NiArICRsbzsKKworICAgICAgICAgICAgaWYgKCRpc05lZykgeworICAgICAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVcGNhc3QgbmVnYXRpdmVzIGluIExTQiBiaXQKKyAgICAgICAgICAgIGlmICgkYXJyWzJdICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRhcnJbMl0gPSAkYXJyWzJdICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgICAgIGlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkYXJyWzFdID0gJGFyclsxXSBeIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gXiAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdICogNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAkYXJyWzFdICogNDI5NDk2NzI5NiArICRhcnJbMl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3OTlhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocApAQCAtMCwwICsxLDY3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7CisKKy8qKgorICogQWNjZWxlcmF0ZWQgYmluYXJ5IHByb3RvY29sOiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHRocmlmdF9wcm90b2NvbAorICogZXh0ZW5zaW9uIGZvciBmYXN0ZXIgZGVzZXJpYWxpemF0aW9uCisgKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGV4dGVuZHMgVEJpbmFyeVByb3RvY29sCit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQgPSBmYWxzZSwgJHN0cmljdFdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIC8vIElmIHRoZSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgcHV0QmFjaywgd3JhcCBpdCBpbiBhCisgICAgICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCAod2hpY2ggZG9lcykKKworICAgICAgICAvLyBOT1RFICh0LmhlaW50eik6IFRoaXMgaXMgdmVyeSBldmlsIHRvIGRvLCBiZWNhdXNlIHRoZSBUQnVmZmVyZWRUcmFuc3BvcnQgbWF5IHN3YWxsb3cgYnl0ZXMsIHdoaWNoCisgICAgICAgIC8vIGFyZSB0aGVuIG5ldmVyIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LiBUaGlzIGhhcHBlbnMgcHJlY2lzZWx5IHdoZW4gYSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgLy8gbGVzcyB0aGFuIHRoZSBtYXggYnVmZmVyIHNpemUgKDUxMiBieSBkZWZhdWx0KSBpcyB3cml0dGVuIHRvIHRoZSB0cmFuc3BvcnQgYW5kIHRoZW4gZmx1c2goKSBpcyBOT1QKKyAgICAgICAgLy8gY2FsbGVkLiBJbiB0aGF0IGNhc2UgdGhlIGRhdGEgc3RheXMgaW4gdGhlIHdyaXRlQnVmZmVyIG9mIHRoZSB0cmFuc3BvcnQsIGZyb20gd2hlcmUgaXQgY2FuIG5ldmVyIGJlCisgICAgICAgIC8vIGFjY2Vzc2VkIGFnYWluIChmb3IgZXhhbXBsZSB0aHJvdWdoIHJlYWQoKSkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFNpbmNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdyBhYm91dCB0aGUgd3JhcHBpbmcgdHJhbnNwb3J0LCB0aGlzIGNyZWF0ZXMgYnVncyB3aGljaAorICAgICAgICAvLyBhcmUgdmVyeSBkaWZmaWN1bHQgdG8gZmluZC4gSGVuY2UgdGhlIHdyYXBwaW5nIG9mIGEgdHJhbnNwb3J0IGluIGEgYnVmZmVyIHNob3VsZCBiZSBsZWZ0IHRvIHRoZQorICAgICAgICAvLyBjYWxsaW5nIGNvZGUuIEFuIGludGVyZmFjZSBjb3VsZCB1c2VkIHRvIG1hbmRhdGUgdGhlIHByZXNlbmNlIG9mIHRoZSBwdXRCYWNrKCkgbWV0aG9kIGluIHRoZSB0cmFuc3BvcnQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEkgYW0gbGVhdmluZyB0aGlzIGNvZGUgaW4gbm9uZXRoZWxlc3MsIGJlY2F1c2UgdGhlcmUgbWF5IGJlIGFwcGxpY2F0aW9ucyBkZXBlbmRpbmcgb24gdGhpcyBiZWhhdmlvci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQorCisgICAgICAgIGlmICghbWV0aG9kX2V4aXN0cygkdHJhbnMsICdwdXRCYWNrJykpIHsKKyAgICAgICAgICAgICR0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHRyYW5zKTsKKyAgICAgICAgfQorICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQsICRzdHJpY3RXcml0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0UmVhZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmljdFJlYWRfOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFdyaXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+c3RyaWN0V3JpdGVfOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmMmEyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNzM5IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIENvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KKyAqCisgKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBDT01QQUNUX1NUT1AgPSAweDAwOworICAgIGNvbnN0IENPTVBBQ1RfVFJVRSA9IDB4MDE7CisgICAgY29uc3QgQ09NUEFDVF9GQUxTRSA9IDB4MDI7CisgICAgY29uc3QgQ09NUEFDVF9CWVRFID0gMHgwMzsKKyAgICBjb25zdCBDT01QQUNUX0kxNiA9IDB4MDQ7CisgICAgY29uc3QgQ09NUEFDVF9JMzIgPSAweDA1OworICAgIGNvbnN0IENPTVBBQ1RfSTY0ID0gMHgwNjsKKyAgICBjb25zdCBDT01QQUNUX0RPVUJMRSA9IDB4MDc7CisgICAgY29uc3QgQ09NUEFDVF9CSU5BUlkgPSAweDA4OworICAgIGNvbnN0IENPTVBBQ1RfTElTVCA9IDB4MDk7CisgICAgY29uc3QgQ09NUEFDVF9TRVQgPSAweDBBOworICAgIGNvbnN0IENPTVBBQ1RfTUFQID0gMHgwQjsKKyAgICBjb25zdCBDT01QQUNUX1NUUlVDVCA9IDB4MEM7CisKKyAgICBjb25zdCBTVEFURV9DTEVBUiA9IDA7CisgICAgY29uc3QgU1RBVEVfRklFTERfV1JJVEUgPSAxOworICAgIGNvbnN0IFNUQVRFX1ZBTFVFX1dSSVRFID0gMjsKKyAgICBjb25zdCBTVEFURV9DT05UQUlORVJfV1JJVEUgPSAzOworICAgIGNvbnN0IFNUQVRFX0JPT0xfV1JJVEUgPSA0OworICAgIGNvbnN0IFNUQVRFX0ZJRUxEX1JFQUQgPSA1OworICAgIGNvbnN0IFNUQVRFX0NPTlRBSU5FUl9SRUFEID0gNjsKKyAgICBjb25zdCBTVEFURV9WQUxVRV9SRUFEID0gNzsKKyAgICBjb25zdCBTVEFURV9CT09MX1JFQUQgPSA4OworCisgICAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHgxZjsKKyAgICBjb25zdCBWRVJTSU9OID0gMTsKKyAgICBjb25zdCBQUk9UT0NPTF9JRCA9IDB4ODI7CisgICAgY29uc3QgVFlQRV9NQVNLID0gMHhlMDsKKyAgICBjb25zdCBUWVBFX0JJVFMgPSAweDA3OworICAgIGNvbnN0IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgJGN0eXBlcyA9IGFycmF5KAorICAgICAgICBUVHlwZTo6U1RPUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AsCisgICAgICAgIFRUeXBlOjpCT09MID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSwgLy8gdXNlZCBmb3IgY29sbGVjdGlvbgorICAgICAgICBUVHlwZTo6QllURSA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JZVEUsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JNjQsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlksCisgICAgICAgIFRUeXBlOjpTVFJVQ1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVFJVQ1QsCisgICAgICAgIFRUeXBlOjpMU1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNULAorICAgICAgICBUVHlwZTo6U0VUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VULAorICAgICAgICBUVHlwZTo6TUFQID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTUFQLAorICAgICk7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljICR0dHlwZXMgPSBhcnJheSgKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVE9QID0+IFRUeXBlOjpTVE9QLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUgPT4gVFR5cGU6OkJPT0wsIC8vIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSA9PiBUVHlwZTo6Qk9PTCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFID0+IFRUeXBlOjpCWVRFLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kxNiA9PiBUVHlwZTo6STE2LAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kzMiA9PiBUVHlwZTo6STMyLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0k2NCA9PiBUVHlwZTo6STY0LAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0RPVUJMRSA9PiBUVHlwZTo6RE9VQkxFLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JJTkFSWSA9PiBUVHlwZTo6U1RSSU5HLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUUlVDVCA9PiBUVHlwZTo6U1RSVUNULAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0xJU1QgPT4gVFR5cGU6OkxTVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TRVQgPT4gVFR5cGU6OlNFVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9NQVAgPT4gVFR5cGU6Ok1BUCwKKyAgICApOworCisgICAgcHJvdGVjdGVkICRzdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOworICAgIHByb3RlY3RlZCAkbGFzdEZpZCA9IDA7CisgICAgcHJvdGVjdGVkICRib29sRmlkID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgJGJvb2xWYWx1ZSA9IG51bGw7CisgICAgcHJvdGVjdGVkICRzdHJ1Y3RzID0gYXJyYXkoKTsKKyAgICBwcm90ZWN0ZWQgJGNvbnRhaW5lcnMgPSBhcnJheSgpOworCisgICAgLy8gU29tZSB2YXJpbnQgLyB6aWd6YWcgaGVscGVyIG1ldGhvZHMKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9aaWdaYWcoJG4sICRiaXRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgkbiA8PCAxKSBeICgkbiA+PiAoJGJpdHMgLSAxKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZyb21aaWdaYWcoJG4pCisgICAgeworICAgICAgICByZXR1cm4gKCRuID4+IDEpIF4gLSgkbiAmIDEpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYXJpbnQoJGRhdGEpCisgICAgeworICAgICAgICAkb3V0ID0gIiI7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoKCRkYXRhICYgfjB4N2YpID09PSAwKSB7CisgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoJGRhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkb3V0IC49IGNocigoJGRhdGEgJiAweGZmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICRkYXRhID0gJGRhdGEgPj4gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkb3V0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVZhcmludCgkZGF0YSkKKyAgICB7CisgICAgICAgICRvdXQgPSAkdGhpcy0+Z2V0VmFyaW50KCRkYXRhKTsKKyAgICAgICAgJHJlc3VsdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG91dCwgJHJlc3VsdCk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRWYXJpbnQoJiRyZXN1bHQpCisgICAgeworICAgICAgICAkaWR4ID0gMDsKKyAgICAgICAgJHNoaWZ0ID0gMDsKKyAgICAgICAgJHJlc3VsdCA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOworICAgICAgICAgICAgJGJ5dGUgPSAkYXJyWzFdOworICAgICAgICAgICAgJGlkeCArPSAxOworICAgICAgICAgICAgJHJlc3VsdCB8PSAoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQ7CisgICAgICAgICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICRpZHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkaWR4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHdyaXR0ZW4gPQorICAgICAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT04gfAorICAgICAgICAgICAgICAgICgkdHlwZSA8PCBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVCkpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVZhcmludCgkc2VxaWQpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1dSSVRFOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9XUklURTsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAwOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkb2xkX3ZhbHVlcyA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9ICRvbGRfdmFsdWVzWzBdOworICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRvbGRfdmFsdWVzWzFdOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEhlYWRlcigkdHlwZSwgJGZpZCkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgJGRlbHRhID0gJGZpZCAtICR0aGlzLT5sYXN0RmlkOworICAgICAgICBpZiAoMCA8ICRkZWx0YSAmJiAkZGVsdGEgPD0gMTUpIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoKCRkZWx0YSA8PCA0KSB8ICR0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkxNigkZmlkKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRmaWQ7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkX25hbWUsICRmaWVsZF90eXBlLCAkZmllbGRfaWQpCisgICAgeworICAgICAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVFRZUEU6OkJPT0wpIHsKKyAgICAgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEU7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbEZpZCA9ICRmaWVsZF9pZDsKKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKKworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUZpZWxkSGVhZGVyKHNlbGY6OiRjdHlwZXNbJGZpZWxkX3R5cGVdLCAkZmllbGRfaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbkJlZ2luKCRldHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA8PSAxNCkgeworICAgICAgICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgkc2l6ZSA8PCA0IHwKKyAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgweGYwIHwKKyAgICAgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skZXR5cGVdKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEU7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlfdHlwZSwgJHZhbF90eXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgaWYgKCRzaXplID09IDApIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoc2VsZjo6JGN0eXBlc1ska2V5X3R5cGVdIDw8IDQgfAorICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyR2YWxfdHlwZV0pOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25FbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gYXJyYXlfcG9wKCR0aGlzLT5jb250YWluZXJzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9XUklURSkgeworICAgICAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRTsKKyAgICAgICAgICAgIGlmICgkdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAkY3R5cGUgPSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVGaWVsZEhlYWRlcigkY3R5cGUsICR0aGlzLT5ib29sRmlkKTsKKyAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEUpIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVCeXRlKCR2YWx1ZSA/IDEgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShwYWNrKCdDJywgJGJ5dGUpLCAxKTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMTYpOworCisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMzIpOworCisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpCisgICAgeworICAgICAgICAkbGVuID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR2YWx1ZSk7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVWYXJpbnQoJGxlbik7CisgICAgICAgIGlmICgkbGVuKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdmFsdWUsICRsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRfdHlwZSwgJiRmaWVsZF9pZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRjb21wYWN0X3R5cGVfYW5kX2RlbHRhKTsKKworICAgICAgICAkY29tcGFjdF90eXBlID0gJGNvbXBhY3RfdHlwZV9hbmRfZGVsdGEgJiAweDBmOworCisgICAgICAgIGlmICgkY29tcGFjdF90eXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAkZmllbGRfdHlwZSA9ICRjb21wYWN0X3R5cGU7CisgICAgICAgICAgICAkZmllbGRfaWQgPSAwOworCisgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAkZGVsdGEgPSAkY29tcGFjdF90eXBlX2FuZF9kZWx0YSA+PiA0OworICAgICAgICBpZiAoJGRlbHRhID09IDApIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkX2lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRmaWVsZF9pZCA9ICR0aGlzLT5sYXN0RmlkICsgJGRlbHRhOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZWxkX2lkOworICAgICAgICAkZmllbGRfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkY29tcGFjdF90eXBlKTsKKworICAgICAgICBpZiAoJGNvbXBhY3RfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUpIHsKKyAgICAgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRDsKKyAgICAgICAgICAgICR0aGlzLT5ib29sVmFsdWUgPSB0cnVlOworICAgICAgICB9IGVsc2VpZiAoJGNvbXBhY3RfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0ZBTFNFKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9SRUFEOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9SRUFEOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkVUJ5dGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnQycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFppZ1phZygmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCR2YWx1ZSk7CisgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5mcm9tWmlnWmFnKCR2YWx1ZSk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkcHJvdG9JZCA9IDA7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRwcm90b0lkKTsKKyAgICAgICAgaWYgKCRwcm90b0lkICE9IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgcHJvdG9jb2wgaWQgaW4gVENvbXBhY3QgbWVzc2FnZScpOworICAgICAgICB9CisgICAgICAgICR2ZXJUeXBlID0gMDsKKyAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR2ZXJUeXBlKTsKKyAgICAgICAgJHR5cGUgPSAoJHZlclR5cGUgPj4gVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9CSVRTOworICAgICAgICAkdmVyc2lvbiA9ICR2ZXJUeXBlICYgVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9NQVNLOworICAgICAgICBpZiAoJHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaW4gVENvbXBhY3QgbWVzc2FnZScpOworICAgICAgICB9CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNlcWlkKTsKKyAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQorICAgIHsKKyAgICAgICAgJG5hbWUgPSAnJzsgLy8gdW51c2VkCisgICAgICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfUkVBRDsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAwOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICRsYXN0ID0gYXJyYXlfcG9wKCR0aGlzLT5zdHJ1Y3RzKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gJGxhc3RbMF07CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gJGxhc3RbMV07CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uQmVnaW4oJiR0eXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkc2l6ZVR5cGUgPSAwOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkc2l6ZVR5cGUpOworICAgICAgICAkc2l6ZSA9ICRzaXplVHlwZSA+PiA0OworICAgICAgICAkdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkc2l6ZVR5cGUpOworICAgICAgICBpZiAoJHNpemUgPT0gMTUpIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNpemUpOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlfdHlwZSwgJiR2YWxfdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKKyAgICAgICAgJHR5cGVzID0gMDsKKyAgICAgICAgaWYgKCRzaXplID4gMCkgeworICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR0eXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgJHZhbF90eXBlID0gJHRoaXMtPmdldFRUeXBlKCR0eXBlcyk7CisgICAgICAgICRrZXlfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMgPj4gNCk7CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRhaW5lcnMpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1fdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5ib29sVmFsdWU7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCR2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICcnOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUVHlwZSgkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBzZWxmOjokdHR5cGVzWyRieXRlICYgMHgwZl07CisgICAgfQorCisgICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKKyAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAorCisgICAgLy8gUmVhZCBhbmQgd3JpdGUgSTY0IGFzIHR3byAzMiBiaXQgbnVtYmVycyAkaGkgYW5kICRsbworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIC8vIFJlYWQgdmFyaW50IGZyb20gd2lyZQorICAgICAgICAkaGkgPSAwOworICAgICAgICAkbG8gPSAwOworCisgICAgICAgICRpZHggPSAwOworICAgICAgICAkc2hpZnQgPSAwOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOworICAgICAgICAgICAgJGJ5dGUgPSAkYXJyWzFdOworICAgICAgICAgICAgJGlkeCArPSAxOworICAgICAgICAgICAgLy8gU2hpZnQgaGkgYW5kIGxvIHRvZ2V0aGVyLgorICAgICAgICAgICAgaWYgKCRzaGlmdCA8IDI4KSB7CisgICAgICAgICAgICAgICAgJGxvIHw9ICgoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQpOworICAgICAgICAgICAgfSBlbHNlaWYgKCRzaGlmdCA9PSAyOCkgeworICAgICAgICAgICAgICAgICRsbyB8PSAoKCRieXRlICYgMHgwZikgPDwgMjgpOworICAgICAgICAgICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3MCkgPj4gNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3ZikgPDwgKCRzaGlmdCAtIDMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdywgdW56aWcgaXQuCisgICAgICAgICR4b3JlciA9IDA7CisgICAgICAgIGlmICgkbG8gJiAxKSB7CisgICAgICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOworICAgICAgICB9CisgICAgICAgICRsbyA9ICgkbG8gPj4gMSkgJiAweDdmZmZmZmZmOworICAgICAgICAkbG8gPSAkbG8gfCAoKCRoaSAmIDEpIDw8IDMxKTsKKyAgICAgICAgJGhpID0gKCRoaSA+PiAxKSBeICR4b3JlcjsKKyAgICAgICAgJGxvID0gJGxvIF4gJHhvcmVyOworCisgICAgICAgIC8vIE5vdyBwdXQgJGhpIGFuZCAkbG8gYmFjayB0b2dldGhlcgorICAgICAgICAkaXNOZWcgPSAkaGkgPCAwIHx8ICRoaSAmIDB4ODAwMDAwMDA7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgaWYgKCRpc05lZykgeworICAgICAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICRsbyA9IH4kbG8gJiAoaW50KTB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gYmUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpdGggc2lnbgorICAgICAgICAvLyBleHBsaWNpdGx5IGJlbG93CisKKyAgICAgICAgaWYgKCRoaSAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgJGhpICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICRoaSArPSAweDgwMDAwMDAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRsbyAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgJGxvICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICRsbyArPSAweDgwMDAwMDAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFzIG5lZ2F0aXZlIHZhbHVlIGZpcnN0LCBzaW5jZSB3ZSBjYW4gc3RvcmUgLTJeNjMgYnV0IG5vdCAyXjYzCisgICAgICAgICR2YWx1ZSA9IC0kaGkgKiA0Mjk0OTY3Mjk2IC0gJGxvOworCisgICAgICAgIGlmICghJGlzTmVnKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAtJHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRpZHg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCR2YWx1ZSkKKyAgICB7CisgICAgICAgIC8vIElmIHdlIGFyZSBpbiBhbiBJMzIgcmFuZ2UsIHVzZSB0aGUgZWFzeSBtZXRob2QgYmVsb3cuCisgICAgICAgIGlmICgoJHZhbHVlID4gNDI5NDk2NzI5NikgfHwgKCR2YWx1ZSA8IC00Mjk0OTY3Mjk2KSkgeworICAgICAgICAgICAgLy8gQ29udmVydCAkdmFsdWUgdG8gJGhpIGFuZCAkbG8KKyAgICAgICAgICAgICRuZWcgPSAkdmFsdWUgPCAwOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJGhpID0gKGludCkkdmFsdWUgPj4gMzI7CisgICAgICAgICAgICAkbG8gPSAoaW50KSR2YWx1ZSAmIDB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaTsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvOworICAgICAgICAgICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOb3cgZG8gdGhlIHppZ2dpbmcgYW5kIHphZ2dpbmcuCisgICAgICAgICAgICAkeG9yZXIgPSAwOworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJGxvd2JpdCA9ICgkbG8gPj4gMzEpICYgMTsKKyAgICAgICAgICAgICRoaSA9ICgkaGkgPDwgMSkgfCAkbG93Yml0OworICAgICAgICAgICAgJGxvID0gKCRsbyA8PCAxKTsKKyAgICAgICAgICAgICRsbyA9ICgkbG8gXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICRoaSA9ICgkaGkgXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKKworICAgICAgICAgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgdmFyaW50LCBlbnN1cmluZyB3ZSBzaGlmdCBib3RoIGhpIGFuZCBsbworICAgICAgICAgICAgJG91dCA9ICIiOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIH4weDdmKSA9PT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAkaGkgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoJGxvKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoKCRsbyAmIDB4ZmYpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgICAgICRsbyA9ICRsbyA+PiA3OworICAgICAgICAgICAgICAgICAgICAkbG8gPSAkbG8gfCAoJGhpIDw8IDI1KTsKKyAgICAgICAgICAgICAgICAgICAgJGhpID0gJGhpID4+IDc7CisgICAgICAgICAgICAgICAgICAgIC8vIFJpZ2h0IHNoaWZ0IGNhcnJpZXMgc2lnbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8uCisgICAgICAgICAgICAgICAgICAgICRoaSA9ICRoaSAmICgxMjcgPDwgMjUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRvdXQsICRyZXQpOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgNjQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0NDg4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsODE1IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxCYXNlQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxMb29rYWhlYWRSZWFkZXI7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cUGFpckNvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTGlzdENvbnRleHQ7CisKKy8qKgorICogSlNPTiBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgcHJvdG9jb2wsIHBvcnRlZCBmcm9tIEphdmEuCisgKi8KK2NsYXNzIFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBDT01NQSA9ICcsJzsKKyAgICBjb25zdCBDT0xPTiA9ICc6JzsKKyAgICBjb25zdCBMQlJBQ0UgPSAneyc7CisgICAgY29uc3QgUkJSQUNFID0gJ30nOworICAgIGNvbnN0IExCUkFDS0VUID0gJ1snOworICAgIGNvbnN0IFJCUkFDS0VUID0gJ10nOworICAgIGNvbnN0IFFVT1RFID0gJyInOworICAgIGNvbnN0IEJBQ0tTTEFTSCA9ICdcXCc7CisgICAgY29uc3QgWkVSTyA9ICcwJzsKKyAgICBjb25zdCBFU0NTRVEgPSAnXFwnOworICAgIGNvbnN0IERPVUJMRUVTQyA9ICdfX0RPVUJMRV9FU0NBUEVfU0VRVUVOQ0VfXyc7CisKKyAgICBjb25zdCBWRVJTSU9OID0gMTsKKworICAgIHB1YmxpYyBzdGF0aWMgJEpTT05fQ0hBUl9UQUJMRSA9IGFycmF5KAorICAgICAgICAvKiAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRiAqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAnYicsICd0JywgJ24nLCAwLCAnZicsICdyJywgMCwgMCwgLy8gMAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAxCisgICAgICAgIDEsIDEsICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gMgorICAgICk7CisKKyAgICBwdWJsaWMgc3RhdGljICRFU0NBUEVfQ0hBUlMgPSBhcnJheSgnIicsICdcXCcsICcvJywgImIiLCAiZiIsICJuIiwgInIiLCAidCIpOworCisgICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJfVkFMUyA9IGFycmF5KAorICAgICAgICAnIicsICdcXCcsICcvJywgIlx4MDgiLCAiXGYiLCAiXG4iLCAiXHIiLCAiXHQiLAorICAgICk7CisKKyAgICBjb25zdCBOQU1FX0JPT0wgPSAidGYiOworICAgIGNvbnN0IE5BTUVfQllURSA9ICJpOCI7CisgICAgY29uc3QgTkFNRV9JMTYgPSAiaTE2IjsKKyAgICBjb25zdCBOQU1FX0kzMiA9ICJpMzIiOworICAgIGNvbnN0IE5BTUVfSTY0ID0gImk2NCI7CisgICAgY29uc3QgTkFNRV9ET1VCTEUgPSAiZGJsIjsKKyAgICBjb25zdCBOQU1FX1NUUlVDVCA9ICJyZWMiOworICAgIGNvbnN0IE5BTUVfU1RSSU5HID0gInN0ciI7CisgICAgY29uc3QgTkFNRV9NQVAgPSAibWFwIjsKKyAgICBjb25zdCBOQU1FX0xJU1QgPSAibHN0IjsKKyAgICBjb25zdCBOQU1FX1NFVCA9ICJzZXQiOworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlTmFtZUZvclR5cGVJRCgkdHlwZUlEKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZUlEKSB7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCT09MOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JPT0w7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JZVEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTE2OworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kzMjsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JNjQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfRE9VQkxFOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NUUklORzsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJVQ1Q7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTUFQOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NFVDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9MSVNUOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFR5cGVJREZvclR5cGVOYW1lKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVE9QOworCisgICAgICAgIGlmIChzdHJsZW4oJG5hbWUpID4gMSkgeworICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDAsIDEpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6RE9VQkxFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDEsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJZVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TFNUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpNQVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OlNUUlVDVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJG5hbWUsIDEsIDEpID09ICd0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJJTkc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChzdWJzdHIoJG5hbWUsIDEsIDEpID09ICdlJykgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTRVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6Qk9PTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRyZXN1bHQgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVucmVjb2duaXplZCB0eXBlIiwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljICRjb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKKyAgICBwdWJsaWMgJGNvbnRleHRfOworICAgIHB1YmxpYyAkcmVhZGVyXzsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gcHVzaENvbnRleHQoJGMpCisgICAgeworICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT5jb250ZXh0U3RhY2tfLCAkdGhpcy0+Y29udGV4dF8pOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkYzsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHBvcENvbnRleHQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gYXJyYXlfcG9wKCR0aGlzLT5jb250ZXh0U3RhY2tfKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRTdGFja18gPSBhcnJheSgpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlICR0bXBidWZfID0gYXJyYXkoNCk7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEpTT05TeW50YXhDaGFyKCRiKQorICAgIHsKKyAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKKworICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgIT0gJGIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAiIC4gJGNoLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhleFZhbCgkcykKKyAgICB7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkcyk7ICRpKyspIHsKKyAgICAgICAgICAgICRjaCA9IHN1YnN0cigkcywgJGksIDEpOworCisgICAgICAgICAgICBpZiAoISgkY2ggPj0gImEiICYmICRjaCA8PSAiZiIpICYmICEoJGNoID49ICIwIiAmJiAkY2ggPD0gIjkiKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIgIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhleGRlYygkcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhDaGFyKCR2YWwpCisgICAgeworICAgICAgICByZXR1cm4gZGVjaGV4KCR2YWwpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaGFzSlNPTlVuZXNjYXBlZFVuaWNvZGUoKQorICAgIHsKKyAgICAgICAgaWYgKFBIUF9NQUpPUl9WRVJTSU9OID4gNSB8fCAoUEhQX01BSk9SX1ZFUlNJT04gPT0gNSAmJiBQSFBfTUlOT1JfVkVSU0lPTiA+PSA0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB1bmVzY2FwZWRVbmljb2RlKCRzdHIpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhc0pTT05VbmVzY2FwZWRVbmljb2RlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uX2VuY29kZSgkc3RyLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKKyAgICAgICAgfQorCisgICAgICAgICRqc29uID0ganNvbl9lbmNvZGUoJHN0cik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVW5lc2NhcGVkIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAgICAgICAgICogSGlnaCBzdXJyb2dhdGU6IDB4RDgwMCAtIDB4REJGRgorICAgICAgICAgKiBMb3cgc3Vycm9nYXRlOiAweERDMDAgLSAweERGRkYKKyAgICAgICAgICovCisgICAgICAgICRqc29uID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAorICAgICAgICAgICAgJy9cXFxcdShkWzg5YWJdWzAtOWEtZl17Mn0pXFxcXHUoZFtjZGVmXVswLTlhLWZdezJ9KS9pJywKKyAgICAgICAgICAgIGZ1bmN0aW9uICgkbWF0Y2hlcykgeworICAgICAgICAgICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKHBhY2soJ0gqJywgJG1hdGNoZXNbMV0gLiAkbWF0Y2hlc1syXSksICdVVEYtOCcsICdVVEYtMTZCRScpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICRqc29uCisgICAgICAgICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVW5lc2NhcGVkIGNoYXJhY3RlcnMgd2l0aGluIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAgICAgICAgICovCisgICAgICAgICRqc29uID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAorICAgICAgICAgICAgJy9cXFxcdShbMC05YS1mXXs0fSkvaScsCisgICAgICAgICAgICBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWJfY29udmVydF9lbmNvZGluZyhwYWNrKCdIKicsICRtYXRjaGVzWzFdKSwgJ1VURi04JywgJ1VURi0xNkJFJyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJGpzb24KKyAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gJGpzb247CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05TdHJpbmcoJGIpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR0aGlzLT51bmVzY2FwZWRVbmljb2RlKCRiKSk7CisKKyAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OSW50ZWdlcigkbnVtKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkbnVtKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05Eb3VibGUoJG51bSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoJG51bSkpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkJhc2U2NCgkZGF0YSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZShiYXNlNjRfZW5jb2RlKCRkYXRhKSkpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05TdHJpbmcoJHNraXBDb250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCEkc2tpcENvbnRleHQpIHsKKyAgICAgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgJGpzb25TdHJpbmcgPSAnJzsKKyAgICAgICAgJGxhc3RDaGFyID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7CisgICAgICAgICAgICAkanNvblN0cmluZyAuPSAkY2g7CisgICAgICAgICAgICBpZiAoJGNoID09IHNlbGY6OlFVT1RFICYmCisgICAgICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBudWxsICYmCisgICAgICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBzZWxmOjpFU0NTRVEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkY2ggPT0gc2VsZjo6RVNDU0VRICYmICRsYXN0Q2hhciA9PSBzZWxmOjpFU0NTRVEpIHsKKyAgICAgICAgICAgICAgICAkbGFzdENoYXIgPSBzZWxmOjpET1VCTEVFU0M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRsYXN0Q2hhciA9ICRjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqc29uX2RlY29kZSgkanNvblN0cmluZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0pTT05OdW1lcmljKCRiKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkYikgeworICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgIHsKKyAgICAgICAgJHN0cmJsZCA9IGFycmF5KCk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5wZWVrKCk7CisKKyAgICAgICAgICAgIGlmICghJHRoaXMtPmlzSlNPTk51bWVyaWMoJGNoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkc3RyYmxkW10gPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGltcGxvZGUoIiIsICRzdHJibGQpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX251bWVyaWMoJHN0cikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkludmFsaWQgZGF0YSBpbiBudW1lcmljOiAiIC4gJHN0ciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGludHZhbCgkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZGVudGljYWwgdG8gcmVhZEpTT05JbnRlZ2VyIGJ1dCB3aXRob3V0IHRoZSBmaW5hbCBjYXN0LgorICAgICAqIE5lZWRlZCBmb3IgcHJvcGVyIGhhbmRsaW5nIG9mIGk2NCBvbiAzMiBiaXQgbWFjaGluZXMuICBXaHkgYQorICAgICAqIHNlcGFyYXRlIGZ1bmN0aW9uPyAgU28gd2UgZG9uJ3QgaGF2ZSB0byBmb3JjZSB0aGUgcmVzdCBvZiB0aGUKKyAgICAgKiB1c2UgY2FzZXMgdGhyb3VnaCB0aGUgZXh0cmEgY29uZGl0aW9uYWwuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkludGVnZXJBc1N0cmluZygpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkc3RyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05Eb3VibGUoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKHN1YnN0cigkdGhpcy0+cmVhZGVyXy0+cGVlaygpLCAwLCAxKSA9PSBzZWxmOjpRVU9URSkgeworICAgICAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyh0cnVlKTsKKworICAgICAgICAgICAgaWYgKCRhcnIgPT0gIk5hTiIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkFOOworICAgICAgICAgICAgfSBlbHNlaWYgKCRhcnIgPT0gIkluZmluaXR5IikgeworICAgICAgICAgICAgICAgIHJldHVybiBJTkY7CisgICAgICAgICAgICB9IGVsc2VpZiAoISR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQgIiAuICRhcnIsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCRhcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05CYXNlNjQoKQorICAgIHsKKyAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICRkYXRhID0gYmFzZTY0X2RlY29kZSgkYXJyLCB0cnVlKTsKKworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGJhc2U2NCBkYXRhICIgLiAkYXJyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpSQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoc2VsZjo6VkVSU0lPTik7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGZpZWxkSWQpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGZpZWxkVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGtleVR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJHZhbFR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdEVuZCgpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGVsZW1UeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRib29sID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworCisgICAgICAgIGlmICgkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgIT0gc2VsZjo6VkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24iLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgICRuYW1lID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgJHR5cGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICRzZXFpZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RTdGFydCgpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cGVlaygpOworICAgICAgICAkbmFtZSA9ICIiOworCisgICAgICAgIGlmIChzdWJzdHIoJGNoLCAwLCAxKSA9PSBzZWxmOjpSQlJBQ0UpIHsKKyAgICAgICAgICAgICRmaWVsZFR5cGUgPSBUVHlwZTo6U1RPUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRmaWVsZElkID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgICRmaWVsZFR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJGtleVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICR2YWxUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAkc2l6ZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQorICAgIHsKKyAgICAgICAgJGJvb2wgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgJGJ5dGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCisgICAgeworICAgICAgICAkaTE2ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQorICAgIHsKKyAgICAgICAgJGkzMiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKKyAgICB7CisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT09IDQpIHsKKyAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKKyAgICB7CisgICAgICAgICRkdWIgPSAkdGhpcy0+cmVhZEpTT05Eb3VibGUoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKKyAgICB7CisgICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTc5YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsODUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCisgKiB0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAorICogYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAqCisgKiBAcGFja2FnZSBUaHJpZnRcUHJvdG9jb2wKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IKK3sKKyAgICAvKioKKyAgICAgKiBTZXBhcmF0b3IgYmV0d2VlbiBzZXJ2aWNlIG5hbWUgYW5kIGZ1bmN0aW9uIG5hbWUuCisgICAgICogU2hvdWxkIGJlIHRoZSBzYW1lIGFzIHVzZWQgYXQgbXVsdGlwbGV4ZWQgVGhyaWZ0IHNlcnZlci4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgY29uc3QgU0VQQVJBVE9SID0gIjoiOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2Ygc2VydmljZS4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkc2VydmljZU5hbWVfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igb2YgPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGNsYXNzLgorICAgICAqCisgICAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+JHNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIFRQcm90b2NvbCAkcHJvdG9jb2wKKyAgICAgKiBAcGFyYW0gc3RyaW5nICAgICRzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkc2VydmljZU5hbWUpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbCk7CisgICAgICAgICR0aGlzLT5zZXJ2aWNlTmFtZV8gPSAkc2VydmljZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lLgorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIE1lc3NhZ2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIGlmICgkdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkNBTEwgfHwgJHR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKKyAgICAgICAgICAgICRuYW1lV2l0aFNlcnZpY2UgPSAkdGhpcy0+c2VydmljZU5hbWVfIC4gc2VsZjo6U0VQQVJBVE9SIC4gJG5hbWU7CisgICAgICAgICAgICBwYXJlbnQ6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lV2l0aFNlcnZpY2UsICR0eXBlLCAkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyZW50Ojp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWFjZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocApAQCAtMCwwICsxLDM1MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOworCisvKioKKyAqIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgorICovCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wKK3sKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc187CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfID0gJHRyYW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2Vzc29yIGZvciB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc187CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpOworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCk7CisKKyAgICAvKgorICAgICAqIFN0YXJ0cyBhIGZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKKyAgICAgKiBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKTsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyZW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpOworCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBza2lwIGZ1bmN0aW9uIGlzIGEgdXRpbGl0eSB0byBwYXJzZSBvdmVyIHVucmVjb2duaXplZCBkYXRlIHdpdGhvdXQKKyAgICAgKiBjYXVzaW5nIGNvcnJ1cHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFR5cGUgJHR5cGUgV2hhdCB0eXBlIGlzIGl0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNraXAoJHR5cGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCT09MOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJvb2woJGJvb2wpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCRieXRlKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkxNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMTYoJGkxNik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMzI6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTMyKCRpMzIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STY0OgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEk2NCgkaTY0KTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWREb3VibGUoJGR1Yik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkU3RyaW5nKCRzdHIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRCZWdpbigkbmFtZSwgJGZ0eXBlLCAkZmlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cnVjdEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRrZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkdmFsVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRNYXBFbmQoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU2V0RW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZExpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRlbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRMaXN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVW5rbm93biBmaWVsZCB0eXBlOiAnIC4gJHR5cGUsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZm9yIHNraXBwaW5nIGJpbmFyeSBkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkaXRyYW5zIFRUcmFuc3BvcnQgb2JqZWN0CisgICAgICogQHBhcmFtIGludCAkdHlwZSBGaWVsZCB0eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBza2lwQmluYXJ5KCRpdHJhbnMsICR0eXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZSkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJZVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMzI6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoNCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoOCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJJTkc6CisgICAgICAgICAgICAgICAgJGxlbiA9IHVucGFjaygnTicsICRpdHJhbnMtPnJlYWRBbGwoNCkpOworICAgICAgICAgICAgICAgICRsZW4gPSAkbGVuWzFdOworICAgICAgICAgICAgICAgIGlmICgkbGVuID4gMHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIDQgKyAkaXRyYW5zLT5yZWFkQWxsKCRsZW4pOworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgJGZ0eXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGZpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSTE2IGZpZWxkIGlkCisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAvLyBLdHlwZQorICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAgICAgICAgICRrdHlwZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgLy8gVnR5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFNpemUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoNCk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkc2l6ZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgaWYgKCRzaXplID4gMHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9IDY7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRrdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkdnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgLy8gVnR5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFNpemUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoNCk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAkc2l6ZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgaWYgKCRzaXplID4gMHg3ZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9IDU7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24gZmllbGQgdHlwZTogJyAuICR0eXBlLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODVlMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocApAQCAtMCwwICsxLDI4NSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworLyoqCisgKiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZAorICogPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZSwgcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlCisgKiBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gV2hpbGUgaXQgaGFzIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0CisgKiBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwgaXQgZG9lcyBub3QgbW9kaWZ5CisgKiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+LgorICoKKyAqIEBwYWNrYWdlIFRocmlmdFxQcm90b2NvbAorICovCithYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSBvZiBwcm90b2NvbCwgdG8gd2hpY2ggYWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkZWQuCisgICAgICoKKyAgICAgKiBAdmFyIFRQcm90b2NvbAorICAgICAqLworICAgIHByaXZhdGUgJGNvbmNyZXRlUHJvdG9jb2xfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igb2YgPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBjbGFzcy4KKyAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgICAqCisgICAgICogQHBhcmFtIFRQcm90b2NvbCAkcHJvdG9jb2wgQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgaW5zdGFuY2UuIE11c3QgYmUgbm9uLW51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KFRQcm90b2NvbCAkcHJvdG9jb2wpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCkpOworICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8gPSAkcHJvdG9jb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlQm9vbCgkYm9vbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlQnl0ZSgkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUkxNigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTMyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJNjQoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZURvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RyaW5nKCRzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkRmllbGRCZWdpbigkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1hcEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZExpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZExpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRCb29sKCRib29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEJ5dGUoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEkxNigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJMzIoJGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTY0KCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZERvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJpbmcoJHN0cik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2YxZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKQEAgLTAsMCArMSwzNzQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXExpc3RDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXFN0cnVjdENvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cTWFwQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uOworCisvKioKKyAqIFNpbXBsZUpTT04gaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IHByb3RvY29sLCBwb3J0ZWQgZnJvbSBKYXZhLgorICovCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgQ09NTUEgPSAnLCc7CisgICAgY29uc3QgQ09MT04gPSAnOic7CisgICAgY29uc3QgTEJSQUNFID0gJ3snOworICAgIGNvbnN0IFJCUkFDRSA9ICd9JzsKKyAgICBjb25zdCBMQlJBQ0tFVCA9ICdbJzsKKyAgICBjb25zdCBSQlJBQ0tFVCA9ICddJzsKKyAgICBjb25zdCBRVU9URSA9ICciJzsKKworICAgIGNvbnN0IE5BTUVfTUFQID0gIm1hcCI7CisgICAgY29uc3QgTkFNRV9MSVNUID0gImxzdCI7CisgICAgY29uc3QgTkFNRV9TRVQgPSAic2V0IjsKKworICAgIHByb3RlY3RlZCAkd3JpdGVDb250ZXh0XyA9IG51bGw7CisgICAgcHJvdGVjdGVkICR3cml0ZUNvbnRleHRTdGFja18gPSBbXTsKKworICAgIC8qKgorICAgICAqIFB1c2ggYSBuZXcgd3JpdGUgY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcHVzaFdyaXRlQ29udGV4dChDb250ZXh0ICRjKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dFN0YWNrX1tdID0gJHRoaXMtPndyaXRlQ29udGV4dF87CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gJGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIHRoZSBsYXN0IHdyaXRlIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwb3BXcml0ZUNvbnRleHQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8gPSBhcnJheV9wb3AoJHRoaXMtPndyaXRlQ29udGV4dFN0YWNrXyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGVuY291bnRlcmluZyBhIG1hcCB3aG9zZSBrZXlzIGFyZSBjb250YWluZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFzc2VydENvbnRleHRJc05vdE1hcEtleSgkaW52YWxpZEtleVR5cGUpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPndyaXRlQ29udGV4dF8tPmlzTWFwS2V5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDYW5ub3Qgc2VyaWFsaXplIGEgbWFwIHdpdGgga2V5cyB0aGF0IGFyZSBvZiB0eXBlICIgLgorICAgICAgICAgICAgICAgICRpbnZhbGlkS2V5VHlwZQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OU3RyaW5nKCRiKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoKHN0cmluZykkYikpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OSW50ZWdlcigkbnVtKQorICAgIHsKKyAgICAgICAgJGlzTWFwS2V5ID0gJHRoaXMtPndyaXRlQ29udGV4dF8tPmlzTWFwS2V5KCk7CisKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoKGludCkkbnVtKTsKKworICAgICAgICBpZiAoJGlzTWFwS2V5KSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkRvdWJsZSgkbnVtKQorICAgIHsKKyAgICAgICAgJGlzTWFwS2V5ID0gJHRoaXMtPndyaXRlQ29udGV4dF8tPmlzTWFwS2V5KCk7CisKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoKGZsb2F0KSRudW0pKTsKKworICAgICAgICBpZiAoJGlzTWFwS2V5KSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gbmV3IENvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgU3RydWN0Q29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDRSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJGZpZWxkTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX01BUCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTWFwQ29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDRSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KHNlbGY6Ok5BTUVfTElTVCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAvLyBObyBtZXRhZGF0YSEKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KHNlbGY6Ok5BTUVfU0VUKTsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgICAgIC8vIE5vIG1ldGFkYXRhIQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJvb2wgPyAxIDogMCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRieXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMTYpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTY0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1YikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05Eb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICAgKgorICAgICAqIHNpbXBsZWpzb24gaXMgbm90IG1lYW50IHRvIGJlIHJlYWQgYmFjayBpbnRvIHRocmlmdAorICAgICAqIC0gc2VlIGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvdGhyaWZ0L1RocmlmdFVzYWdlSmF2YQorICAgICAqIC0gdXNlIEpTT04gaW5zdGVhZAorICAgICAqLworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAgYi9saWIvcGhwL2xpYi9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJiMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKQEAgLTAsMCArMSw4NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VyaWFsaXplcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQ7Cit1c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCisgKiBhIHRocmlmdCBvYmplY3QgdXNpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQuCisgKi8KK2NsYXNzIFRCaW5hcnlTZXJpYWxpemVyCit7CisgICAgLy8gTk9URShybWFyaW4pOiBCZWNhdXNlIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkKKyAgICAvLyBhZGRzIGEgYmVnaW4gbWVzc2FnZSBwcmVmaXgsIHlvdSBjYW5ub3Qgc3BlY2lmeQorICAgIC8vIGEgdHJhbnNwb3J0IGluIHdoaWNoIHRvIHNlcmlhbGl6ZSBhbiBvYmplY3QuIEl0IGhhcyB0bworICAgIC8vIGJlIGEgc3RyaW5nLiBPdGhlcndpc2Ugd2Ugd2lsbCBicmVhayB0aGUgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgLy8gbm9ybWFsIGRlc2VyaWFsaXphdGlvbi4KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlcmlhbGl6ZSgkb2JqZWN0KQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7CisgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KAorICAgICAgICAgICAgICAgICRwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAkb2JqZWN0LT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSRVBMWSwKKyAgICAgICAgICAgICAgICAkb2JqZWN0LAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICRwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbigkdW51c2VkX25hbWUsICR1bnVzZWRfdHlwZSwgJHVudXNlZF9zZXFpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkb2JqZWN0LT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICB9CisgICAgICAgICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7CisKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVzZXJpYWxpemUoJHN0cmluZ19vYmplY3QsICRjbGFzc19uYW1lLCAkYnVmZmVyX3NpemUgPSA4MTkyKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5JykpIHsKKyAgICAgICAgICAgIC8vIE5PVEUgKHQuaGVpbnR6KSBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnRlcm5hbGx5IHdyYXBzIG91ciBUTWVtb3J5QnVmZmVyIGluIGEKKyAgICAgICAgICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCwgc28gd2UgaGF2ZSB0byByZXRyaWV2ZSBpdCBhZ2FpbiBvciByaXNrIGxvc2luZyBkYXRhIHdoZW4gd3JpdGluZworICAgICAgICAgICAgLy8gbGVzcyB0aGFuIDUxMiBieXRlcyB0byB0aGUgdHJhbnNwb3J0IChzZWUgdGhlIGNvbW1lbnQgdGhlcmUgYXMgd2VsbCkuCisgICAgICAgICAgICAvLyBAc2VlIFRIUklGVC0xNTc5CisgICAgICAgICAgICAkcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKCcnLCBUTWVzc2FnZVR5cGU6OlJFUExZLCAwKTsKKyAgICAgICAgICAgICRwcm90b2NvbFRyYW5zcG9ydCA9ICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKKyAgICAgICAgICAgICRwcm90b2NvbFRyYW5zcG9ydC0+Zmx1c2goKTsKKworICAgICAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkcHJvdG9jb2wsICRjbGFzc19uYW1lLCAkcHJvdG9jb2wtPmlzU3RyaWN0UmVhZCgpLCAkYnVmZmVyX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRyYW5zcG9ydC0+d3JpdGUoJHN0cmluZ19vYmplY3QpOworICAgICAgICAgICAgJG9iamVjdCA9IG5ldyAkY2xhc3NfbmFtZSgpOworICAgICAgICAgICAgJG9iamVjdC0+cmVhZCgkcHJvdG9jb2wpOworCisgICAgICAgICAgICByZXR1cm4gJG9iamVjdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjZlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCkBAIC0wLDAgKzEsMTI1IEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIEEgZm9ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCitjbGFzcyBURm9ya2luZ1NlcnZlciBleHRlbmRzIFRTZXJ2ZXIKK3sKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHN0b3BfID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIGNoaWxkcmVuLgorICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkY2hpbGRyZW5fID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCisgICAgICogdHJhbnNwb3J0LiBXZSBmb3JrIHdoZW4gYSBuZXcgY29ubmVjdGlvbgorICAgICAqIGFycml2ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOworCisgICAgICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoJHRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICRwaWQgPSBwY250bF9mb3JrKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCRwaWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aGFuZGxlUGFyZW50KCR0cmFuc3BvcnQsICRwaWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHBpZCA9PT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhhbmRsZUNoaWxkKCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ0ZhaWxlZCB0byBmb3JrJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICR0aGlzLT5jb2xsZWN0Q2hpbGRyZW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvZGUgcnVuIGJ5IHRoZSBwYXJlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKKyAgICAgKiBAcGFyYW0gaW50ICRwaWQKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZVBhcmVudChUVHJhbnNwb3J0ICR0cmFuc3BvcnQsICRwaWQpCisgICAgeworICAgICAgICAkdGhpcy0+Y2hpbGRyZW5fWyRwaWRdID0gJHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHJ1biBieSB0aGUgY2hpbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVDaGlsZChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgQCR0cmFuc3BvcnQtPmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIGV4aXQoMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdHMgYW55IGNoaWxkcmVuIHdlIG1heSBoYXZlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGNvbGxlY3RDaGlsZHJlbigpCisgICAgeworICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2hpbGRyZW5fIGFzICRwaWQgPT4gJHRyYW5zcG9ydCkgeworICAgICAgICAgICAgaWYgKHBjbnRsX3dhaXRwaWQoJHBpZCwgJHN0YXR1cywgV05PSEFORykgPiAwKSB7CisgICAgICAgICAgICAgICAgdW5zZXQoJHRoaXMtPmNoaWxkcmVuX1skcGlkXSk7CisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQCR0cmFuc3BvcnQtPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZlciBydW5uaW5nLiBLaWxscyB0aGUgdHJhbnNwb3J0CisgICAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgICAgICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ODliNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU1NMU2VydmVyU29ja2V0LnBocApAQCAtMCwwICsxLDk3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRTU0xTb2NrZXQ7CisKKy8qKgorICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgc2VydmVyIGFnZW50LgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNTTFNlcnZlclNvY2tldCBleHRlbmRzIFRTZXJ2ZXJTb2NrZXQKK3sKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcG9ydAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF8gPSBudWxsOworCisgICAgLyoqCisgICAgICogU2VydmVyU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICogQHBhcmFtIGludCAkcG9ydCBQb3J0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAkY29udGV4dCBTdHJlYW0gY29udGV4dAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCA9ICdsb2NhbGhvc3QnLCAkcG9ydCA9IDkwOTAsICRjb250ZXh0ID0gbnVsbCkKKyAgICB7CisgICAgICAgICRzc2xfaG9zdCA9ICR0aGlzLT5nZXRTU0xIb3N0KCRob3N0KTsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkc3NsX2hvc3QsICRwb3J0KTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFNTTEhvc3QoJGhvc3QpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9IHN0cnBvcygkaG9zdCwgIjovLyIpOworICAgICAgICBpZiAoJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkaG9zdCA9ICdzc2w6Ly8nIC4gJGhvc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGEgbmV3IHNvY2tldCBzZXJ2ZXIgaGFuZGxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5saXN0ZW5lcl8gPSBAc3RyZWFtX3NvY2tldF9zZXJ2ZXIoCisgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8sCisgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgU1RSRUFNX1NFUlZFUl9CSU5EIHwgU1RSRUFNX1NFUlZFUl9MSVNURU4sCisgICAgICAgICAgICAkdGhpcy0+Y29udGV4dF8KKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFNvY2tldAorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkKKyAgICB7CisgICAgICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKKyAgICAgICAgaWYgKCEkaGFuZGxlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgICRzb2NrZXQgPSBuZXcgVFNTTFNvY2tldCgpOworICAgICAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7CisKKyAgICAgICAgcmV0dXJuICRzb2NrZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGMzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlci5waHAKQEAgLTAsMCArMSwxMDIgQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XEZhY3RvcnlcVFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFByb3RvY29sRmFjdG9yeTsKKworLyoqCisgKiBHZW5lcmljIGNsYXNzIGZvciBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCithYnN0cmFjdCBjbGFzcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogUHJvY2Vzc29yIHRvIGhhbmRsZSBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQHZhciBUUHJvY2Vzc29yCisgICAgICovCisgICAgcHJvdGVjdGVkICRwcm9jZXNzb3JfOworCisgICAgLyoqCisgICAgICogU2VydmVyIHRyYW5zcG9ydCB0byBiZSB1c2VkIGZvciBsaXN0ZW5pbmcKKyAgICAgKiBhbmQgYWNjZXB0aW5nIG5ldyBjbGllbnRzCisgICAgICoKKyAgICAgKiBAdmFyIFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCB0cmFuc3BvcnQgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKworICAgIC8qKgorICAgICAqIE91dHB1dCB0cmFuc3BvcnQgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCBwcm90b2NvbCBmYWN0b3J5CisgICAgICoKKyAgICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKworICAgIC8qKgorICAgICAqIE91dHB1dCBwcm90b2NvbCBmYWN0b3J5CisgICAgICoKKyAgICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG91dHB1dFByb3RvY29sRmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIGFsbCB0aGUgZmFjdG9yaWVzLCBldGMKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgJHByb2Nlc3NvcgorICAgICAqIEBwYXJhbSBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeQorICAgICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRwcm9jZXNzb3IsCisgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgJHRyYW5zcG9ydCwKKyAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgJGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPnByb2Nlc3Nvcl8gPSAkcHJvY2Vzc29yOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7CisgICAgICAgICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8gPSAkaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gJG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXMgdGhlIHNlcnZlci4gVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuCisgICAgICogdW5sZXNzIGEgcHJvYmxlbSBwZXJtaXRzIGl0IHRvIGRvIHNvIG9yIGl0CisgICAgICogaXMgaW50ZXJydXB0ZWQgaW50ZW50aW9uYWxseQorICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgc2VydmVyIHNlcnZpbmcKKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzdG9wKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzOGZiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyU29ja2V0LnBocApAQCAtMCwwICsxLDEyNCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0OworCisvKioKKyAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogSGFuZGxlIGZvciB0aGUgbGlzdGVuZXIgc29ja2V0CisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRsaXN0ZW5lcl87CisKKyAgICAvKioKKyAgICAgKiBQb3J0IGZvciB0aGUgbGlzdGVuZXIgdG8gbGlzdGVuIG9uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHdoZW4gbGlzdGVuaW5nIGZvciBhIG5ldyBjbGllbnQKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRhY2NlcHRUaW1lb3V0XyA9IDMwMDAwOworCisgICAgLyoqCisgICAgICogSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFNlcnZlclNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBIb3N0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUG9ydCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFjY2VwdCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRhY2NlcHRUaW1lb3V0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEFjY2VwdFRpbWVvdXQoJGFjY2VwdFRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+YWNjZXB0VGltZW91dF8gPSAkYWNjZXB0VGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhIG5ldyBzb2NrZXQgc2VydmVyIGhhbmRsZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCisgICAgeworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gc3RyZWFtX3NvY2tldF9zZXJ2ZXIoJ3RjcDovLycgLiAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc29ja2V0IHNlcnZlciBoYW5kbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBAZmNsb3NlKCR0aGlzLT5saXN0ZW5lcl8pOworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFNvY2tldAorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkKKyAgICB7CisgICAgICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKKyAgICAgICAgaWYgKCEkaGFuZGxlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgICRzb2NrZXQgPSBuZXcgVFNvY2tldCgpOworICAgICAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7CisKKyAgICAgICAgcmV0dXJuICRzb2NrZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTI3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw1NiBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogR2VuZXJpYyBjbGFzcyBmb3IgU2VydmVyIGFnZW50LgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworYWJzdHJhY3QgY2xhc3MgVFNlcnZlclRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIExpc3QgZm9yIG5ldyBjbGllbnRzCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc2VydmVyCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIHVzZSB0aGlzIHRvIGltcGxlbWVudAorICAgICAqIGFjY2VwdC4KKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gVFRyYW5zcG9ydAorICAgICAqLworICAgIGFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VzIHRoZSBhY2NlcHQgaW1wbGVtdGF0aW9uLiBJZiBudWxsIGlzIHJldHVybmVkLCBhbgorICAgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+YWNjZXB0SW1wbCgpOworCisgICAgICAgIGlmICgkdHJhbnNwb3J0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHRyYW5zcG9ydDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxZGRhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU2ltcGxlU2VydmVyLnBocApAQCAtMCwwICsxLDYwIEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGUgaW1wbGVtdGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCisgKi8KK2NsYXNzIFRTaW1wbGVTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgbmV3IGNsaWVudCB1c2luZyB0aGUgc3VwcGxpZWQKKyAgICAgKiB0cmFuc3BvcnQuIEl0IGhhbmRsZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbnMKKyAgICAgKiB0byBhdm9pZCB0aW1lb3V0cyBldGMga2lsbGluZyBpdAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKKworICAgICAgICB3aGlsZSAoISR0aGlzLT5zdG9wXykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOworCisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAkaW5wdXRUcmFuc3BvcnQgPSAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgJG91dHB1dFByb3RvY29sID0gJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAorICAgICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgICAgICR0aGlzLT5zdG9wXyA9IHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU3RvcmVkTWVzc2FnZVByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhYWFhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAKQEAgLTAsMCArMSw1MyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb2Nlc3NvcgorICovCisKK25hbWVzcGFjZSBUaHJpZnQ7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2xEZWNvcmF0b3I7CisKKy8qKgorICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgdGhlIE1lc3NhZ2UgaW4gZXhhY3RseQorICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gdGhlIE1lc3NhZ2UgbmFtZS4KKyAqLworY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCit7CisgICAgcHJpdmF0ZSAkZm5hbWVfOworICAgIHByaXZhdGUgJG10eXBlXzsKKyAgICBwcml2YXRlICRyc2VxaWRfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFRQcm90b2NvbCAkcHJvdG9jb2wsICRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wpOworICAgICAgICAkdGhpcy0+Zm5hbWVfICA9ICRmbmFtZTsKKyAgICAgICAgJHRoaXMtPm10eXBlXyAgPSAkbXR5cGU7CisgICAgICAgICR0aGlzLT5yc2VxaWRfID0gJHJzZXFpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICRuYW1lICA9ICR0aGlzLT5mbmFtZV87CisgICAgICAgICR0eXBlICA9ICR0aGlzLT5tdHlwZV87CisgICAgICAgICRzZXFpZCA9ICR0aGlzLT5yc2VxaWRfOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvQ29yZS5waHAgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTc1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7CisKK2NsYXNzIENvcmUgaW1wbGVtZW50cyBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CisgICAgICAgIC8vIHNwZWNpZnlpbmcgYSBudWxsICRsZW5ndGggd291bGQgcmV0dXJuIGFuIGVtcHR5IHN0cmluZworICAgICAgICBpZiAoJGxlbmd0aCA9PT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN1YnN0cigkc3RyLCAkc3RhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiBzdHJsZW4oJHN0cik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL01ic3RyaW5nLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhmZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAKQEAgLTAsMCArMSw0NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU3RyaW5nRnVuYzsKKworY2xhc3MgTWJzdHJpbmcgaW1wbGVtZW50cyBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBXZSBuZWVkIHRvIHNldCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBzZWNvbmQKKyAgICAgICAgICogb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCB0aGUgZmlyc3Qgb3B0aW9uYWwgcGFyYW1ldGVyIGNhbid0CisgICAgICAgICAqIGJlIG51bGwgb3IgZmFsc2UgYXMgYSAibWFnaWMiIHZhbHVlIGJlY2F1c2UgdGhhdCB3b3VsZAorICAgICAgICAgKiBjYXVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYmUgcmV0dXJuZWQsIHNvIHdlIG5lZWQgdG8KKyAgICAgICAgICogYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBwcm9wZXIgbGVuZ3RoIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+c3RybGVuKCRzdHIpIC0gJHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgsICc4Yml0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1iX3N0cmxlbigkc3RyLCAnOGJpdCcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNDk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCkBAIC0wLDAgKzEsMjggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7CisKK2ludGVyZmFjZSBUU3RyaW5nRnVuYworeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCk7CisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGE5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCkBAIC0wLDAgKzEsMTE4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCisgKi8KKworbmFtZXNwYWNlIFRocmlmdDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPiBpcyBhIFByb2Nlc3NvciBhbGxvd2luZworICogYSBzaW5nbGUgPGNvZGU+VFNlcnZlcjwvY29kZT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqCisgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgICRwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxDYWxjdWxhdG9yUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisgKgorICogICAgICRwcm9jZXNzb3ItPnByb2Nlc3MoJHByb3RvY29sLCAkcHJvdG9jb2wpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqLworCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IKK3sKKyAgICBwcml2YXRlICRzZXJ2aWNlUHJvY2Vzc29yTWFwXzsKKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcworICAgICAqIGFsbG93cyB1cyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZQorICAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvCisgICAgICogYXMgImhhbmRsZXJzIiwgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzb3IoJHNlcnZpY2VOYW1lLCAkcHJvY2Vzc29yKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV0gPSAkcHJvY2Vzc29yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIDxvbD4KKyAgICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgorICAgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KKyAgICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBNZXNzYWdlLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQorICAgICAqICAgICAgICAgICAgICAgICAgICBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKFRQcm90b2NvbCAkaW5wdXQsIFRQcm90b2NvbCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgICAgICAgICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKi8KKyAgICAgICAgJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsKKworICAgICAgICBpZiAoJG10eXBlICE9PSBUTWVzc2FnZVR5cGU6OkNBTEwgJiYgJG10eXBlICE9IFRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGFuZCB0aGUgbmV3IE1lc3NhZ2UgbmFtZS4KKyAgICAgICAgaWYgKHN0cnBvcygkZm5hbWUsIFRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IpID09PSBmYWxzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7JGZuYW1lfS4gRGlkIHlvdSAiIC4KKyAgICAgICAgICAgICAgICAiZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0KCRzZXJ2aWNlTmFtZSwgJG1lc3NhZ2VOYW1lKSA9IGV4cGxvZGUoJzonLCAkZm5hbWUsIDIpOworICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJHNlcnZpY2VOYW1lLCAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAkcHJvY2Vzc29yID0gJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV07CisKKyAgICAgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCisgICAgICAgICAgICBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLAorICAgICAgICAgICAgJG91dHB1dAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzYzVhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsMjA2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJ1ZmZlcmVkIHRyYW5zcG9ydC4gU3RvcmVzIGRhdGEgdG8gYW4gaW50ZXJuYWwgYnVmZmVyIHRoYXQgaXQgZG9lc24ndAorICogYWN0dWFsbHkgd3JpdGUgb3V0IHVudGlsIGZsdXNoIGlzIGNhbGxlZC4gRm9yIHJlYWRpbmcsIHdlIGRvIGEgZ3JlZWR5CisgKiByZWFkIGFuZCB0aGVuIHNlcnZlIGRhdGEgb3V0IG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVjZWl2ZSBidWZmZXIgc2l6ZQorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJCdWZTaXplXyA9IDUxMjsKKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZSBidWZmZXIgc2l6ZQorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHdCdWZTaXplXyA9IDUxMjsKKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkd0J1Zl8gPSAnJzsKKworICAgIC8qKgorICAgICAqIFRoZSByZWFkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyQnVmXyA9ICcnOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgYSBidWZmZXJlZCB0cmFuc3BvcnQgYXJvdW5kIGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQsICRyQnVmU2l6ZSA9IDUxMiwgJHdCdWZTaXplID0gNTEyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+ckJ1ZlNpemVfID0gJHJCdWZTaXplOworICAgICAgICAkdGhpcy0+d0J1ZlNpemVfID0gJHdCdWZTaXplOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZWFzb24gdGhhdCB3ZSBjdXN0b21pemUgcmVhZEFsbCBoZXJlIGlzIHRoYXQgdGhlIG1ham9yaXR5IG9mIFBIUAorICAgICAqIHN0cmVhbXMgYXJlIGFscmVhZHkgaW50ZXJuYWxseSBidWZmZXJlZCBieSBQSFAuIFRoZSBzb2NrZXQgc3RyZWFtLCBmb3IKKyAgICAgKiBleGFtcGxlLCBidWZmZXJzIGludGVybmFsbHkgYW5kIGJsb2NrcyBpZiB5b3UgY2FsbCByZWFkIHdpdGggJGxlbiBncmVhdGVyCisgICAgICogdGhhbiB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLCB1bmxpa2UgcmVjdigpIGluIEMuCisgICAgICoKKyAgICAgKiBUaGVyZWZvcmUsIHVzZSB0aGUgcmVhZEFsbCBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgdHJhbnNwb3J0IGluc2lkZQorICAgICAqIHRoZSBidWZmZXJlZCByZWFkQWxsLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikKKyAgICB7CisgICAgICAgICRoYXZlID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXyk7CisgICAgICAgIGlmICgkaGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4pOworICAgICAgICB9IGVsc2VpZiAoJGhhdmUgPCAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworICAgICAgICAgICAgJGRhdGEgLj0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJGxlbiAtICRoYXZlKTsKKyAgICAgICAgfSBlbHNlaWYgKCRoYXZlID09ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJyc7CisgICAgICAgIH0gZWxzZWlmICgkaGF2ZSA+ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkdGhpcy0+ckJ1ZlNpemVfKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA8PSAkbGVuKSB7CisgICAgICAgICAgICAkcmV0ID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJyc7CisKKyAgICAgICAgICAgIHJldHVybiAkcmV0OworICAgICAgICB9CisKKyAgICAgICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOworICAgICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKKworICAgICAgICByZXR1cm4gJHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkdGhpcy0+d0J1Zl8gLj0gJGJ1ZjsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID49ICR0aGlzLT53QnVmU2l6ZV8pIHsKKyAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0ZG9jCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID4gMCkgeworICAgICAgICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKKworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgICAgICAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICR0aGlzLT53QnVmXyA9ICcnOworICAgICAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOworICAgICAgICB9CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmI0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCkBAIC0wLDAgKzEsMjc2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEhUVFAgY2xpZW50IGZvciBUaHJpZnQKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRDdXJsQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIHByaXZhdGUgc3RhdGljICRjdXJsSGFuZGxlOworCisgICAgLyoqCisgICAgICogVGhlIGhvc3QgdG8gY29ubmVjdCB0bworICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhvc3RfOworCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgdG8gY29ubmVjdCBvbgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfOworCisgICAgLyoqCisgICAgICogVGhlIFVSSSB0byByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkdXJpXzsKKworICAgIC8qKgorICAgICAqIFRoZSBzY2hlbWUgdG8gdXNlIGZvciB0aGUgcmVxdWVzdCwgaS5lLiBodHRwLCBodHRwcworICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHNjaGVtZV87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlcXVlc3QgZGF0YQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJlcXVlc3RfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXNwb25zZSBkYXRhLgorICAgICAqCisgICAgICogQHZhciBiaW5hcnkgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyZXNwb25zZV87CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEB2YXIgZmxvYXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRpbWVvdXRfOworCisgICAgLyoqCisgICAgICogaHR0cCBoZWFkZXJzCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRoZWFkZXJzXzsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBuZXcgSFRUUCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0CisgICAgICogQHBhcmFtIGludCAkcG9ydAorICAgICAqIEBwYXJhbSBzdHJpbmcgJHVyaQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCwgJHBvcnQgPSA4MCwgJHVyaSA9ICcnLCAkc2NoZW1lID0gJ2h0dHAnKQorICAgIHsKKyAgICAgICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7CisgICAgICAgICAgICAkdXJpID0gJy8nIC4gJHVyaTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+c2NoZW1lXyA9ICRzY2hlbWU7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnVyaV8gPSAkdXJpOworICAgICAgICAkdGhpcy0+cmVxdWVzdF8gPSAnJzsKKyAgICAgICAgJHRoaXMtPnJlc3BvbnNlXyA9IG51bGw7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9IG51bGw7CisgICAgICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHJlYWQgdGltZW91dAorICAgICAqCisgICAgICogQHBhcmFtIGZsb2F0ICR0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICBpZiAoJGxlbiA+PSBzdHJsZW4oJHRoaXMtPnJlc3BvbnNlXykpIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVzcG9uc2VfOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHJldCA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2VfLCAwLCAkbGVuKTsKKyAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgJGxlbik7CisKKyAgICAgICAgICAgIHJldHVybiAkcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuIFNpbmNlIFRDdXJsQ2xpZW50IGdldHMgZW50aXJlIHBheWxvYWQgYXQKKyAgICAgKiBvbmNlLCBwYXJlbnQgcmVhZEFsbCBjYW5ub3QgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT5yZWFkKCRsZW4pOworCisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGRhdGEpICE9PSAkbGVuKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEN1cmxDbGllbnQgY291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfIC49ICRidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmICghc2VsZjo6JGN1cmxIYW5kbGUpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKGFycmF5KCdUaHJpZnRcXFRyYW5zcG9ydFxcVEN1cmxDbGllbnQnLCAnY2xvc2VDdXJsSGFuZGxlJykpOworICAgICAgICAgICAgc2VsZjo6JGN1cmxIYW5kbGUgPSBjdXJsX2luaXQoKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0JJTkFSWVRSQU5TRkVSLCB0cnVlKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ1BIUC9UQ3VybENsaWVudCcpOworICAgICAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgJ1BPU1QnKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX01BWFJFRElSUywgMSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gR29kLCBQSFAgcmVhbGx5IGhhcyBzb21lIGVzb3RlcmljIHdheXMgb2YgZG9pbmcgc2ltcGxlIHRoaW5ncy4KKyAgICAgICAgJGhvc3QgPSAkdGhpcy0+aG9zdF8gLiAoJHRoaXMtPnBvcnRfICE9IDgwID8gJzonIC4gJHRoaXMtPnBvcnRfIDogJycpOworICAgICAgICAkZnVsbFVybCA9ICR0aGlzLT5zY2hlbWVfIC4gIjovLyIgLiAkaG9zdCAuICR0aGlzLT51cmlfOworCisgICAgICAgICRoZWFkZXJzID0gYXJyYXkoKTsKKyAgICAgICAgJGRlZmF1bHRIZWFkZXJzID0gYXJyYXkoJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKKyAgICAgICAgICAgICdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnID0+IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+cmVxdWVzdF8pKTsKKyAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGRlZmF1bHRIZWFkZXJzLCAkdGhpcy0+aGVhZGVyc18pIGFzICRrZXkgPT4gJHZhbHVlKSB7CisgICAgICAgICAgICAkaGVhZGVyc1tdID0gIiRrZXk6ICR2YWx1ZSI7CisgICAgICAgIH0KKworICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaGVhZGVycyk7CisKKyAgICAgICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1RJTUVPVVQsICR0aGlzLT50aW1lb3V0Xyk7CisgICAgICAgIH0KKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPnJlcXVlc3RfKTsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisKKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfVVJMLCAkZnVsbFVybCk7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBjdXJsX2V4ZWMoc2VsZjo6JGN1cmxIYW5kbGUpOworICAgICAgICAkcmVzcG9uc2VFcnJvciA9IGN1cmxfZXJyb3Ioc2VsZjo6JGN1cmxIYW5kbGUpOworCisgICAgICAgICRjb2RlID0gY3VybF9nZXRpbmZvKHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMSU5GT19IVFRQX0NPREUpOworCisgICAgICAgIC8vIEhhbmRsZSBub24gMjAwIHN0YXR1cyBjb2RlIC8gY29ubmVjdCBmYWlsdXJlCisgICAgICAgIGlmICgkdGhpcy0+cmVzcG9uc2VfID09PSBmYWxzZSB8fCAkY29kZSAhPT0gMjAwKSB7CisgICAgICAgICAgICBjdXJsX2Nsb3NlKHNlbGY6OiRjdXJsSGFuZGxlKTsKKyAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgICAgICAgICAgJGVycm9yID0gJ1RDdXJsQ2xpZW50OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4gJGZ1bGxVcmw7CisgICAgICAgICAgICBpZiAoJHJlc3BvbnNlRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAkZXJyb3IgLj0gJywgJyAuICRyZXNwb25zZUVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRjb2RlKSB7CisgICAgICAgICAgICAgICAgJGVycm9yIC49ICcsIEhUVFAgc3RhdHVzIGNvZGU6ICcgLiAkY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCRlcnJvciwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsb3NlQ3VybEhhbmRsZSgpCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlbGY6OiRjdXJsSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7CisgICAgICAgICAgICAgICAgc2VsZjo6JGN1cmxIYW5kbGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICR4KSB7CisgICAgICAgICAgICBlcnJvcl9sb2coJ1RoZXJlIHdhcyBhbiBlcnJvciBjbG9zaW5nIHRoZSBjdXJsIGhhbmRsZTogJyAuICR4LT5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZEhlYWRlcnMoJGhlYWRlcnMpCisgICAgeworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheV9tZXJnZSgkdGhpcy0+aGVhZGVyc18sICRoZWFkZXJzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMTg2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDE5MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEZyYW1lZCB0cmFuc3BvcnQuIFdyaXRlcyBhbmQgcmVhZHMgZGF0YSBpbiBjaHVua3MgdGhhdCBhcmUgc3RhbXBlZCB3aXRoCisgKiB0aGVpciBsZW5ndGguCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydAorICAgICAqLworICAgIHByaXZhdGUgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHJlYWQgZGF0YS4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkckJ1Zl87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHF1ZXVlZCBvdXRwdXQgZGF0YQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlICR3QnVmXzsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZnJhbWUgcmVhZHMKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHJlYWRfOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmcmFtZSB3cml0ZXMKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHdyaXRlXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydCBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0ID0gbnVsbCwgJHJlYWQgPSB0cnVlLCAkd3JpdGUgPSB0cnVlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+cmVhZF8gPSAkcmVhZDsKKyAgICAgICAgJHRoaXMtPndyaXRlXyA9ICR3cml0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgZnJvbSB0aGUgYnVmZmVyLiBXaGVuIG1vcmUgZGF0YSBpcyByZXF1aXJlZCByZWFkcyBhbm90aGVyIGVudGlyZQorICAgICAqIGNodW5rIGFuZCBzZXJ2ZXMgZnV0dXJlIHJlYWRzIG91dCBvZiB0aGF0LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKCEkdGhpcy0+cmVhZF8pIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRGcmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSnVzdCByZXR1cm4gZnVsbCBidWZmCisgICAgICAgIGlmICgkbGVuID49IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pKSB7CisgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuICRvdXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyCisgICAgICAgICRvdXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0IHByZXZpb3VzbHkgcmVhZCBkYXRhIGJhY2sgaW50byB0aGUgYnVmZmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGRhdGEgdG8gcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRGcmFtZSgpCisgICAgeworICAgICAgICAkYnVmID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoNCk7CisgICAgICAgICR2YWwgPSB1bnBhY2soJ04nLCAkYnVmKTsKKyAgICAgICAgJHN6ID0gJHZhbFsxXTsKKworICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkc3opOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBzb21lIGRhdGEgdG8gdGhlIHBlbmRpbmcgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YQorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBMaW1pdCBvZiBieXRlcyB0byB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmLCAkbGVuID0gbnVsbCkKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPndyaXRlXykgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkYnVmLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkbGVuICE9PSBudWxsICYmICRsZW4gPCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikpIHsKKyAgICAgICAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgMCwgJGxlbik7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPndCdWZfIC49ICRidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm1hdCBvZiBhIDQtYnl0ZSBsZW5ndGgKKyAgICAgKiBmb2xsb3dlZCBieSB0aGUgYWN0dWFsIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPndyaXRlXyB8fCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICAkb3V0ID0gcGFjaygnTicsIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pKTsKKyAgICAgICAgJG91dCAuPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAgICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICR0aGlzLT53QnVmXyA9ICcnOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTg4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCkBAIC0wLDAgKzEsMjU4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEhUVFAgY2xpZW50IGZvciBUaHJpZnQKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBVUkkgdG8gcmVxdWVzdAorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHVyaV87CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NoZW1lIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGkuZS4gaHR0cCwgaHR0cHMKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRzY2hlbWVfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXF1ZXN0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRidWZfOworCisgICAgLyoqCisgICAgICogSW5wdXQgc29ja2V0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhhbmRsZV87CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEB2YXIgZmxvYXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRpbWVvdXRfOworCisgICAgLyoqCisgICAgICogaHR0cCBoZWFkZXJzCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRoZWFkZXJzXzsKKworICAgIC8qKgorICAgICAqIENvbnRleHQgYWRkaXRpb25hbCBvcHRpb25zCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRjb250ZXh0XzsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBuZXcgSFRUUCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0CisgICAgICogQHBhcmFtIGludCAgICAkcG9ydAorICAgICAqIEBwYXJhbSBzdHJpbmcgJHVyaQorICAgICAqIEBwYXJhbSBzdHJpbmcgJHNjaGVtZQorICAgICAqIEBwYXJhbSBhcnJheSAgJGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0ID0gODAsICR1cmkgPSAnJywgJHNjaGVtZSA9ICdodHRwJywgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQorICAgIHsKKyAgICAgICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7CisgICAgICAgICAgICAkdXJpID0gJy8nIC4gJHVyaTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+c2NoZW1lXyA9ICRzY2hlbWU7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnVyaV8gPSAkdXJpOworICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9IG51bGw7CisgICAgICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5KCk7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCByZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0U2VjcygkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9ICR0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXykgeworICAgICAgICAgICAgQGZjbG9zZSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCB0byByZWFkCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBAZnJlYWQoJHRoaXMtPmhhbmRsZV8sICRsZW4pOworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlIHx8ICRkYXRhID09PSAnJykgeworICAgICAgICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RIdHRwQ2xpZW50OiB0aW1lZCBvdXQgcmVhZGluZyAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8gLiAkdGhpcy0+dXJpXywKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfIC49ICRidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCisgICAgICAgICRob3N0ID0gJHRoaXMtPmhvc3RfIC4gKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6JyAuICR0aGlzLT5wb3J0XyA6ICcnKTsKKworICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CisgICAgICAgICRkZWZhdWx0SGVhZGVycyA9IGFycmF5KCdIb3N0JyA9PiAkaG9zdCwKKyAgICAgICAgICAgICdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnVXNlci1BZ2VudCcgPT4gJ1BIUC9USHR0cENsaWVudCcsCisgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyA9PiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pKTsKKyAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGRlZmF1bHRIZWFkZXJzLCAkdGhpcy0+aGVhZGVyc18pIGFzICRrZXkgPT4gJHZhbHVlKSB7CisgICAgICAgICAgICAkaGVhZGVyc1tdID0gIiRrZXk6ICR2YWx1ZSI7CisgICAgICAgIH0KKworICAgICAgICAkb3B0aW9ucyA9ICR0aGlzLT5jb250ZXh0XzsKKworICAgICAgICAkYmFzZUh0dHBPcHRpb25zID0gaXNzZXQoJG9wdGlvbnNbImh0dHAiXSkgPyAkb3B0aW9uc1siaHR0cCJdIDogYXJyYXkoKTsKKworICAgICAgICAkaHR0cE9wdGlvbnMgPSAkYmFzZUh0dHBPcHRpb25zICsgYXJyYXkoJ21ldGhvZCcgPT4gJ1BPU1QnLAorICAgICAgICAgICAgJ2hlYWRlcicgPT4gaW1wbG9kZSgiXHJcbiIsICRoZWFkZXJzKSwKKyAgICAgICAgICAgICdtYXhfcmVkaXJlY3RzJyA9PiAxLAorICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICR0aGlzLT5idWZfKTsKKyAgICAgICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKKyAgICAgICAgICAgICRodHRwT3B0aW9uc1sndGltZW91dCddID0gJHRoaXMtPnRpbWVvdXRfOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5idWZfID0gJyc7CisKKyAgICAgICAgJG9wdGlvbnNbImh0dHAiXSA9ICRodHRwT3B0aW9uczsKKyAgICAgICAgJGNvbnRleHRpZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgkb3B0aW9ucyk7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZvcGVuKAorICAgICAgICAgICAgJHRoaXMtPnNjaGVtZV8gLiAnOi8vJyAuICRob3N0IC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAncicsCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICRjb250ZXh0aWQKKyAgICAgICAgKTsKKworICAgICAgICAvLyBDb25uZWN0IGZhaWxlZD8KKyAgICAgICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBmYWxzZSkgeworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICAgICAgJGVycm9yID0gJ1RIdHRwQ2xpZW50OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4gJGhvc3QgLiAkdGhpcy0+dXJpXzsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCRlcnJvciwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZEhlYWRlcnMoJGhlYWRlcnMpCisgICAgeworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheV9tZXJnZSgkdGhpcy0+aGVhZGVyc18sICRoZWFkZXJzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlMDNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocApAQCAtMCwwICsxLDEwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBBIG1lbW9yeSBidWZmZXIgaXMgYSB0cmFucHNvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuCisgKiBpbi1tZW1vcnkgc3RyaW5nIGJ1ZmZlci4gQW55dGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5CisgKiBwbGFjZWQgaW50byBhIGJ1ZmZlciwgYW5kIGFueXRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyByZWFkIGZyb20gdGhhdAorICogYnVmZmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVE1lbW9yeUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gT3B0aW9uYWxseSBwYXNzIGFuIGluaXRpYWwgdmFsdWUKKyAgICAgKiBmb3IgdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGJ1ZiA9ICcnKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSAkYnVmOworICAgIH0KKworICAgIHByb3RlY3RlZCAkYnVmXyA9ICcnOworCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gLj0gJGJ1ZjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJGJ1Zkxlbmd0aCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7CisKKyAgICAgICAgaWYgKCRidWZMZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICdUTWVtb3J5QnVmZmVyOiBDb3VsZCBub3QgcmVhZCAnIC4KKyAgICAgICAgICAgICAgICAkbGVuIC4gJyBieXRlcyBmcm9tIGJ1ZmZlci4nLAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJGJ1Zkxlbmd0aCA8PSAkbGVuKSB7CisgICAgICAgICAgICAkcmV0ID0gJHRoaXMtPmJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorCisgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sIDAsICRsZW4pOworICAgICAgICAkdGhpcy0+YnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+YnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldEJ1ZmZlcigpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmJ1Zl87CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfID0gJGRhdGEgLiAkdGhpcy0+YnVmXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA4NmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDU2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogVHJhbnNwb3J0IHRoYXQgb25seSBhY2NlcHRzIHdyaXRlcyBhbmQgaWdub3JlcyB0aGVtLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIG1lYXN1cmluZyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHN0cnVjdHVyZXMuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUTnVsbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW4ndCByZWFkIGZyb20gVE51bGxUcmFuc3BvcnQuIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjgyM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCkBAIC0wLDAgKzEsMTI0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFBocCBzdHJlYW0gdHJhbnNwb3J0LiBSZWFkcyB0byBhbmQgd3JpdGVzIGZyb20gdGhlIHBocCBzdGFuZGFyZCBzdHJlYW1zCisgKiBwaHA6Ly9pbnB1dCBhbmQgcGhwOi8vb3V0cHV0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUUGhwU3RyZWFtIGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIGNvbnN0IE1PREVfUiA9IDE7CisgICAgY29uc3QgTU9ERV9XID0gMjsKKworICAgIHByaXZhdGUgJGluU3RyZWFtXyA9IG51bGw7CisKKyAgICBwcml2YXRlICRvdXRTdHJlYW1fID0gbnVsbDsKKworICAgIHByaXZhdGUgJHJlYWRfID0gZmFsc2U7CisKKyAgICBwcml2YXRlICR3cml0ZV8gPSBmYWxzZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9SOworICAgICAgICAkdGhpcy0+d3JpdGVfID0gJG1vZGUgJiBzZWxmOjpNT0RFX1c7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5yZWFkXykgeworICAgICAgICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IEBmb3BlbihzZWxmOjppblN0cmVhbU5hbWUoKSwgJ3InKTsKKyAgICAgICAgICAgIGlmICghaXNfcmVzb3VyY2UoJHRoaXMtPmluU3RyZWFtXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vaW5wdXQnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoJHRoaXMtPndyaXRlXykgeworICAgICAgICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBAZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7CisgICAgICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgb3BlbiBwaHA6Ly9vdXRwdXQnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPnJlYWRfKSB7CisgICAgICAgICAgICBAZmNsb3NlKCR0aGlzLT5pblN0cmVhbV8pOworICAgICAgICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgIEBmY2xvc2UoJHRoaXMtPm91dFN0cmVhbV8pOworICAgICAgICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICghJHRoaXMtPnJlYWRfIHx8IGlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSAmJgorICAgICAgICAgICAgKCEkdGhpcy0+d3JpdGVfIHx8IGlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5pblN0cmVhbV8sICRsZW4pOworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlIHx8ICRkYXRhID09PSAnJykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcycpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgd2hpbGUgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSA+IDApIHsKKyAgICAgICAgICAgICRnb3QgPSBAZndyaXRlKCR0aGlzLT5vdXRTdHJlYW1fLCAkYnVmKTsKKyAgICAgICAgICAgIGlmICgkZ290ID09PSAwIHx8ICRnb3QgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgd3JpdGUgJyAuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSAuICcgYnl0ZXMnCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgJGdvdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgQGZmbHVzaCgkdGhpcy0+b3V0U3RyZWFtXyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5TdHJlYW1OYW1lKCkKKyAgICB7CisgICAgICAgIGlmIChwaHBfc2FwaV9uYW1lKCkgPT0gJ2NsaScpIHsKKyAgICAgICAgICAgIHJldHVybiAncGhwOi8vc3RkaW4nOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICdwaHA6Ly9pbnB1dCc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YTBhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNTTFNvY2tldC5waHAKQEAgLTAsMCArMSwxMTcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNTTFNvY2tldCBleHRlbmRzIFRTb2NrZXQKK3sKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcG9ydAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF8gPSBudWxsOworCisgICAgLyoqCisgICAgICogU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IFJlbW90ZSBob3N0bmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUmVtb3RlIHBvcnQKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGNvbnRleHQgU3RyZWFtIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gYm9vbCAkcGVyc2lzdCBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0CisgICAgICogQHBhcmFtIHN0cmluZyAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRob3N0ID0gJ2xvY2FsaG9zdCcsCisgICAgICAgICRwb3J0ID0gOTA5MCwKKyAgICAgICAgJGNvbnRleHQgPSBudWxsLAorICAgICAgICAkZGVidWdIYW5kbGVyID0gbnVsbAorICAgICkgeworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkdGhpcy0+Z2V0U1NMSG9zdCgkaG9zdCk7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkY29udGV4dDsKKyAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8gPSAkZGVidWdIYW5kbGVyID8gJGRlYnVnSGFuZGxlciA6ICdlcnJvcl9sb2cnOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBob3N0IG5hbWUgd2l0aCBTU0wgdHJhbnNwb3J0IHByb3RvY29sCisgICAgICogaWYgbm8gdHJhbnNwb3J0IHByb3RvY29sIGFscmVhZHkgc3BlY2lmaWVkIGluCisgICAgICogdGhlIGhvc3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcmV0dXJuIHN0cmluZyAkaG9zdCAgIEhvc3QgbmFtZSB3aXRoIHRyYW5zcG9ydCBwcm90b2NvbAorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0U1NMSG9zdCgkaG9zdCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnRfcHJvdG9jb2xfbG9jID0gc3RycG9zKCRob3N0LCAiOi8vIik7CisgICAgICAgIGlmICgkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICRob3N0ID0gJ3NzbDovLycgLiAkaG9zdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJGhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmlzT3BlbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0aGlzLT5wb3J0XyA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAc3RyZWFtX3NvY2tldF9jbGllbnQoCisgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8sCisgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyArICgkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyAvIDEwMDAwMDApLAorICAgICAgICAgICAgU1RSRUFNX0NMSUVOVF9DT05ORUNULAorICAgICAgICAgICAgJHRoaXMtPmNvbnRleHRfCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ29ubmVjdCBmYWlsZWQ/CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICRlcnJvciA9ICdUU29ja2V0OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4KKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8gLiAnICgnIC4gJGVycnN0ciAuICcgWycgLiAkZXJybm8gLiAnXSknOworICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0N2VmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0LnBocApAQCAtMCwwICsxLDM2NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIEhhbmRsZSB0byBQSFAgc29ja2V0CisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRoYW5kbGVfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBob3N0bmFtZQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhvc3RfID0gJ2xvY2FsaG9zdCc7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcG9ydAorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfID0gJzkwOTAnOworCisgICAgLyoqCisgICAgICogU2VuZCB0aW1lb3V0IGluIHNlY29uZHMuCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHNlbmRUaW1lb3V0VXNlYyB0aGlzIGlzIHVzZWQgZm9yIHNlbmQgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkc2VuZFRpbWVvdXRTZWNfID0gMDsKKworICAgIC8qKgorICAgICAqIFNlbmQgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHNlbmRUaW1lb3V0U2VjIHRoaXMgaXMgdXNlZCBmb3Igc2VuZCB0aW1lb3V0cy4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRzZW5kVGltZW91dFVzZWNfID0gMTAwMDAwOworCisgICAgLyoqCisgICAgICogUmVjdiB0aW1lb3V0IGluIHNlY29uZHMKKyAgICAgKgorICAgICAqIENvbWJpbmVkIHdpdGggcmVjdlRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRyZWN2VGltZW91dFNlY18gPSAwOworCisgICAgLyoqCisgICAgICogUmVjdiB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcworICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCByZWN2VGltZW91dFNlYyB0aGlzIGlzIHVzZWQgZm9yIHJlY3YgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcmVjdlRpbWVvdXRVc2VjXyA9IDc1MDAwMDsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3RlbnQgc29ja2V0IG9yIHBsYWluPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJvdGVjdGVkICRwZXJzaXN0XyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRGVidWdnaW5nIG9uPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWJ1Z18gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERlYnVnIGhhbmRsZXIKKyAgICAgKgorICAgICAqIEB2YXIgbWl4ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGRlYnVnSGFuZGxlcl8gPSBudWxsOworCisgICAgLyoqCisgICAgICogU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IFJlbW90ZSBob3N0bmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUmVtb3RlIHBvcnQKKyAgICAgKiBAcGFyYW0gYm9vbCAkcGVyc2lzdCBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0CisgICAgICogQHBhcmFtIHN0cmluZyAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRob3N0ID0gJ2xvY2FsaG9zdCcsCisgICAgICAgICRwb3J0ID0gOTA5MCwKKyAgICAgICAgJHBlcnNpc3QgPSBmYWxzZSwKKyAgICAgICAgJGRlYnVnSGFuZGxlciA9IG51bGwKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgICAgICAkdGhpcy0+cGVyc2lzdF8gPSAkcGVyc2lzdDsKKyAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8gPSAkZGVidWdIYW5kbGVyID8gJGRlYnVnSGFuZGxlciA6ICdlcnJvcl9sb2cnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAkaGFuZGxlCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEhhbmRsZSgkaGFuZGxlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSAkaGFuZGxlOworICAgICAgICBzdHJlYW1fc2V0X2Jsb2NraW5nKCR0aGlzLT5oYW5kbGVfLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VuZCB0aW1lb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkdGltZW91dCBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U2VuZFRpbWVvdXQoJHRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfID0gZmxvb3IoJHRpbWVvdXQgLyAxMDAwKTsKKyAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gPQorICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5zZW5kVGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlY2VpdmUgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFJlY3ZUaW1lb3V0KCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7CisgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFVzZWNfID0KKyAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+cmVjdlRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9vbCAkZGVidWcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RGVidWcoJGRlYnVnKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmRlYnVnXyA9ICRkZWJ1ZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIGhvc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SG9zdCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmhvc3RfOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVtb3RlIHBvcnQgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW50IHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UG9ydCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnBvcnRfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBvcGVuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgc29ja2V0IGlzIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc19yZXNvdXJjZSgkdGhpcy0+aGFuZGxlXyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmlzT3BlbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0aGlzLT5wb3J0XyA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0aGlzLT5wZXJzaXN0XykgeworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAcGZzb2Nrb3BlbigKKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8sCisgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgICAgICRlcnJubywKKyAgICAgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZzb2Nrb3BlbigKKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8sCisgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgICAgICRlcnJubywKKyAgICAgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbm5lY3QgZmFpbGVkPworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJyAoJyAuICRlcnJzdHIgLiAnIFsnIC4gJGVycm5vIC4gJ10pJzsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnc29ja2V0X2ltcG9ydF9zdHJlYW0nKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3NvY2tldF9zZXRfb3B0aW9uJykpIHsKKyAgICAgICAgICAgICRzb2NrZXQgPSBzb2NrZXRfaW1wb3J0X3N0cmVhbSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICAgICBzb2NrZXRfc2V0X29wdGlvbigkc29ja2V0LCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgQGZjbG9zZSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGZyb20gdGhlIHNvY2tldCBhdCBtb3N0ICRsZW4gYnl0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCB3YWl0IGZvciBhbGwgdGhlIHJlcXVlc3RlZCBkYXRhLCBpdCB3aWxsIHJldHVybiBhcworICAgICAqIHNvb24gYXMgYW55IGRhdGEgaXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIHN0cmluZyBCaW5hcnkgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICAkbnVsbCA9IG51bGw7CisgICAgICAgICRyZWFkID0gYXJyYXkoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAkcmVhZGFibGUgPSBAc3RyZWFtX3NlbGVjdCgKKyAgICAgICAgICAgICRyZWFkLAorICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAkbnVsbCwKKyAgICAgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFNlY18sCisgICAgICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXworICAgICAgICApOworCisgICAgICAgIGlmICgkcmVhZGFibGUgPiAwKSB7CisgICAgICAgICAgICAkZGF0YSA9IGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKKyAgICAgICAgICAgIGlmICgkZGF0YSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7CisgICAgICAgICAgICB9IGVsc2VpZiAoJGRhdGEgPT0gJycgJiYgZmVvZigkdGhpcy0+aGFuZGxlXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldCByZWFkIDAgYnl0ZXMnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICRkYXRhOworICAgICAgICB9IGVsc2VpZiAoJHJlYWRhYmxlID09PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdG8gdGhlIHNvY2tldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJG51bGwgPSBudWxsOworICAgICAgICAkd3JpdGUgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7CisKKyAgICAgICAgLy8ga2VlcCB3cml0aW5nIHVudGlsIGFsbCB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuCisgICAgICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7CisgICAgICAgICAgICAvLyB3YWl0IGZvciBzdHJlYW0gdG8gYmVjb21lIGF2YWlsYWJsZSBmb3Igd3JpdGluZworICAgICAgICAgICAgJHdyaXRhYmxlID0gQHN0cmVhbV9zZWxlY3QoCisgICAgICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAgICAgJHdyaXRlLAorICAgICAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18sCisgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18KKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBpZiAoJHdyaXRhYmxlID4gMCkgeworICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJ1ZmZlciB0byBzdHJlYW0KKyAgICAgICAgICAgICAgICAkd3JpdHRlbiA9IGZ3cml0ZSgkdGhpcy0+aGFuZGxlXywgJGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCR3cml0dGVuID09PSAtMSB8fCAkd3JpdHRlbiA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgYnVmZmVyIGlzIGxlZnQgdG8gd3JpdGUKKyAgICAgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICR3cml0dGVuKTsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkd3JpdGFibGUgPT09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IHRpbWVkIG91dCB3cml0aW5nICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggb3V0cHV0IHRvIHRoZSBzb2NrZXQuCisgICAgICoKKyAgICAgKiBTaW5jZSByZWFkKCksIHJlYWRBbGwoKSBhbmQgd3JpdGUoKSBvcGVyYXRlIG9uIHRoZSBzb2NrZXRzIGRpcmVjdGx5LAorICAgICAqIHRoaXMgaXMgYSBuby1vcAorICAgICAqCisgICAgICogSWYgeW91IHdpc2ggdG8gaGF2ZSBmbHVzaGFibGUgYnVmZmVyaW5nIGJlaGF2aW91ciwgd3JhcCB0aGlzIFRTb2NrZXQKKyAgICAgKiBpbiBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjllOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocApAQCAtMCwwICsxLDMxMCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgbGlicmFyeSBtYWtlcyB1c2Ugb2YgQVBDIGNhY2hlIHRvIG1ha2UgaG9zdHMgYXMgZG93biBpbiBhIHdlYgorICogZW52aXJvbm1lbnQuIElmIHlvdSBhcmUgcnVubmluZyBmcm9tIHRoZSBDTEkgb3Igb24gYSBzeXN0ZW0gd2l0aG91dCBBUEMKKyAqIGluc3RhbGxlZCwgdGhlbiB0aGVzZSBudWxsIGZ1bmN0aW9ucyB3aWxsIHN0ZXAgaW4gYW5kIGFjdCBsaWtlIGNhY2hlCisgKiBtaXNzZXMuCisgKi8KK2lmICghZnVuY3Rpb25fZXhpc3RzKCdhcGNfZmV0Y2gnKSkgeworICAgIGZ1bmN0aW9uIGFwY19mZXRjaCgka2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIGFwY19zdG9yZSgka2V5LCAkdmFyLCAkdHRsID0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qKgorICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgY29ubmVjdGlvbgorICogdG8gYSBwb29sIG9mIHNlcnZlcnMuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU29ja2V0UG9vbCBleHRlbmRzIFRTb2NrZXQKK3sKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgc2VydmVycy4gQXJyYXkgb2YgYXNzb2NpYXRpdmUgYXJyYXlzIHdpdGggJ2hvc3QnIGFuZCAncG9ydCcga2V5cworICAgICAqLworICAgIHByaXZhdGUgJHNlcnZlcnNfID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0CisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByaXZhdGUgJG51bVJldHJpZXNfID0gMTsKKworICAgIC8qKgorICAgICAqIFJldHJ5IGludGVydmFsIGluIHNlY29uZHMsIGhvdyBsb25nIHRvIG5vdCB0cnkgYSBob3N0IGlmIGl0IGhhcyBiZWVuCisgICAgICogbWFya2VkIGFzIGRvd24uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByaXZhdGUgJHJldHJ5SW50ZXJ2YWxfID0gNjA7CisKKyAgICAvKioKKyAgICAgKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByaXZhdGUgJG1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gMTsKKworICAgIC8qKgorICAgICAqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHJhbmRvbWl6ZV8gPSB0cnVlOworCisgICAgLyoqCisgICAgICogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/CisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRhbHdheXNUcnlMYXN0XyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5ICRob3N0cyBMaXN0IG9mIHJlbW90ZSBob3N0bmFtZXMKKyAgICAgKiBAcGFyYW0gbWl4ZWQgJHBvcnRzIEFycmF5IG9mIHJlbW90ZSBwb3J0cywgb3IgYSBzaW5nbGUgY29tbW9uIHBvcnQKKyAgICAgKiBAcGFyYW0gYm9vbCAkcGVyc2lzdCBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0CisgICAgICogQHBhcmFtIG1peGVkICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gZm9yIGVycm9yIGxvZ2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRob3N0cyA9IGFycmF5KCdsb2NhbGhvc3QnKSwKKyAgICAgICAgJHBvcnRzID0gYXJyYXkoOTA5MCksCisgICAgICAgICRwZXJzaXN0ID0gZmFsc2UsCisgICAgICAgICRkZWJ1Z0hhbmRsZXIgPSBudWxsCisgICAgKSB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QobnVsbCwgMCwgJHBlcnNpc3QsICRkZWJ1Z0hhbmRsZXIpOworCisgICAgICAgIGlmICghaXNfYXJyYXkoJHBvcnRzKSkgeworICAgICAgICAgICAgJHBvcnQgPSAkcG9ydHM7CisgICAgICAgICAgICAkcG9ydHMgPSBhcnJheSgpOworICAgICAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgICAgICRwb3J0c1ska2V5XSA9ICRwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJGhvc3QpIHsKKyAgICAgICAgICAgICR0aGlzLT5zZXJ2ZXJzXyBbXSA9IGFycmF5KCdob3N0JyA9PiAkaG9zdCwKKyAgICAgICAgICAgICAgICAncG9ydCcgPT4gJHBvcnRzWyRrZXldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHlvdSBmcm9tIGFkZGluZyBhIGR1cGxpY2F0ZSBzZXJ2ZXIgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IGhvc3RuYW1lIG9yIElQCisgICAgICogQHBhcmFtIGludCAkcG9ydCBwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZFNlcnZlcigkaG9zdCwgJHBvcnQpCisgICAgeworICAgICAgICAkdGhpcy0+c2VydmVyc19bXSA9IGFycmF5KCdob3N0JyA9PiAkaG9zdCwgJ3BvcnQnID0+ICRwb3J0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBtYW55IHRpbWUgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldE51bVJldHJpZXMoJG51bVJldHJpZXMpCisgICAgeworICAgICAgICAkdGhpcy0+bnVtUmV0cmllc18gPSAkbnVtUmV0cmllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXRyeUludGVydmFsKCRyZXRyeUludGVydmFsKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJldHJ5SW50ZXJ2YWxfID0gJHJldHJ5SW50ZXJ2YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoJG1heENvbnNlY3V0aXZlRmFpbHVyZXMpCisgICAgeworICAgICAgICAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSAkbWF4Q29uc2VjdXRpdmVGYWlsdXJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJHJhbmRvbWl6ZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSYW5kb21pemUoJHJhbmRvbWl6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yYW5kb21pemVfID0gJHJhbmRvbWl6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsd2F5cyB0cnkgdGhlIGxhc3Qgc2VydmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJGFsd2F5c1RyeUxhc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0QWx3YXlzVHJ5TGFzdCgkYWx3YXlzVHJ5TGFzdCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hbHdheXNUcnlMYXN0XyA9ICRhbHdheXNUcnlMYXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQgYnkgaXRlcmF0aW5nIHRocm91Z2ggYWxsIHRoZSBzZXJ2ZXJzIGluIHRoZSBwb29sCisgICAgICogYW5kIHRyeWluZyB0byBmaW5kIG9uZSB0aGF0IHdvcmtzLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIHdhbnQgb3JkZXIgcmFuZG9taXphdGlvbgorICAgICAgICBpZiAoJHRoaXMtPnJhbmRvbWl6ZV8pIHsKKyAgICAgICAgICAgIHNodWZmbGUoJHRoaXMtPnNlcnZlcnNfKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvdW50IHNlcnZlcnMgdG8gaWRlbnRpZnkgdGhlICJsYXN0IiBvbmUKKyAgICAgICAgJG51bVNlcnZlcnMgPSBjb3VudCgkdGhpcy0+c2VydmVyc18pOworCisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRudW1TZXJ2ZXJzOyArKyRpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSAkaG9zdCBhbmQgJHBvcnQgdmFyaWFibGVzCisgICAgICAgICAgICBleHRyYWN0KCR0aGlzLT5zZXJ2ZXJzX1skaV0pOworCisgICAgICAgICAgICAvLyBDaGVjayBBUEMgY2FjaGUgZm9yIGEgcmVjb3JkIG9mIHRoaXMgc2VydmVyIGJlaW5nIGRvd24KKyAgICAgICAgICAgICRmYWlsdGltZUtleSA9ICd0aHJpZnRfZmFpbHRpbWU6JyAuICRob3N0IC4gJzonIC4gJHBvcnQgLiAnfic7CisKKyAgICAgICAgICAgIC8vIENhY2hlIG1pc3M/IEFzc3VtZSBpdCdzIE9LCisgICAgICAgICAgICAkbGFzdEZhaWx0aW1lID0gYXBjX2ZldGNoKCRmYWlsdGltZUtleSk7CisgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAkbGFzdEZhaWx0aW1lID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gQ2FjaGUgaGl0Li4ubWFrZSBzdXJlIGVub3VnaCB0aGUgcmV0cnkgaW50ZXJ2YWwgaGFzIGVsYXBzZWQKKyAgICAgICAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgeworICAgICAgICAgICAgICAgICRlbGFwc2VkID0gdGltZSgpIC0gJGxhc3RGYWlsdGltZTsKKyAgICAgICAgICAgICAgICBpZiAoJGVsYXBzZWQgPiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8pIHsKKyAgICAgICAgICAgICAgICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiByZXRyeUludGVydmFsICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJyAuICR0aGlzLT5yZXRyeUludGVydmFsXyAuICcpICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgcGFzc2VkIGZvciBob3N0ICcgLiAkaG9zdCAuICc6JyAuICRwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPbmx5IGNvbm5lY3QgaWYgbm90IGluIHRoZSBtaWRkbGUgb2YgYSBmYWlsIGludGVydmFsLCBPUiBpZiB0aGlzCisgICAgICAgICAgICAvLyBpcyB0aGUgTEFTVCBzZXJ2ZXIgd2UgYXJlIHRyeWluZywganVzdCBoYW1tZXIgYXdheSBvbiBpdAorICAgICAgICAgICAgJGlzTGFzdFNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHdheXNUcnlMYXN0XykgeworICAgICAgICAgICAgICAgICRpc0xhc3RTZXJ2ZXIgPSAoJGkgPT0gKCRudW1TZXJ2ZXJzIC0gMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKCRsYXN0RmFpbHRpbWUgPT09IDApIHx8CisgICAgICAgICAgICAgICAgKCRpc0xhc3RTZXJ2ZXIpIHx8CisgICAgICAgICAgICAgICAgKCRsYXN0RmFpbHRpbWUgPiAwICYmICRyZXRyeUludGVydmFsUGFzc2VkKSkgeworICAgICAgICAgICAgICAgIC8vIFNldCB1bmRlcmx5aW5nIFRTb2NrZXQgcGFyYW1zIHRvIHRoaXMgb25lCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgdXAgdG8gbnVtUmV0cmllc18gY29ubmVjdGlvbnMgcGVyIHNlcnZlcgorICAgICAgICAgICAgICAgIGZvciAoJGF0dGVtcHQgPSAwOyAkYXR0ZW1wdCA8ICR0aGlzLT5udW1SZXRyaWVzXzsgJGF0dGVtcHQrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSB1bmRlcmx5aW5nIFRTb2NrZXQgb3BlbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OjpvcGVuKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY2xlYXIgdGhlIGZhaWx1cmUgY291bnRzIGlmIHJlcXVpcmVkIHRvIGRvIHNvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCBjb25uZWN0aW9uLCByZXR1cm4gbm93CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJHR4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTWFyayBmYWlsdXJlIG9mIHRoaXMgaG9zdCBpbiB0aGUgY2FjaGUKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHNLZXkgPSAndGhyaWZ0X2NvbnNlY2ZhaWxzOicgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4gJ34nOworCisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNhY2hlIG1pc3NlcworICAgICAgICAgICAgICAgICRjb25zZWNmYWlscyA9IGFwY19mZXRjaCgkY29uc2VjZmFpbHNLZXkpOworICAgICAgICAgICAgICAgIGlmICgkY29uc2VjZmFpbHMgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICRjb25zZWNmYWlscyA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGJ5IG9uZQorICAgICAgICAgICAgICAgICRjb25zZWNmYWlscysrOworCisgICAgICAgICAgICAgICAgLy8gTG9nIGFuZCBjYWNoZSB0aGlzIGZhaWx1cmUKKyAgICAgICAgICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID49ICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXykgeworICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiBtYXJraW5nICcgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGFzIGRvd24gZm9yICcgLiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gLiAnIHNlY3MgJyAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmdGVyICcgLiAkY29uc2VjZmFpbHMgLiAnIGZhaWxlZCBhdHRlbXB0cy4nCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBmYWlsdXJlIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgdGltZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY291bnQgb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMKKyAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgJGNvbnNlY2ZhaWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPaCBubzsgd2UgZmFpbGVkIHRoZW0gYWxsLiBUaGUgc3lzdGVtIGlzIHRvdGFsbHkgaWxsIQorICAgICAgICAkZXJyb3IgPSAnVFNvY2tldFBvb2w6IEFsbCBob3N0cyBpbiBwb29sIGFyZSBkb3duLiAnOworICAgICAgICAkaG9zdHMgPSBhcnJheSgpOworICAgICAgICBmb3JlYWNoICgkdGhpcy0+c2VydmVyc18gYXMgJHNlcnZlcikgeworICAgICAgICAgICAgJGhvc3RzIFtdID0gJHNlcnZlclsnaG9zdCddIC4gJzonIC4gJHNlcnZlclsncG9ydCddOworICAgICAgICB9CisgICAgICAgICRob3N0bGlzdCA9IGltcGxvZGUoJywnLCAkaG9zdHMpOworICAgICAgICAkZXJyb3IgLj0gJygnIC4gJGhvc3RsaXN0IC4gJyknOworICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5MjFjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDk4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJhc2UgaW50ZXJmYWNlIGZvciBhIHRyYW5zcG9ydCBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBvcGVuKCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOworCisgICAgLyoqCisgICAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggdG8gcmVhZAorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbik7CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVzIHRoYXQgdGhlIGZ1bGwgYW1vdW50IG9mIGRhdGEgaXMgcmVhZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAvLyByZXR1cm4gJHRoaXMtPnJlYWQoJGxlbik7CisKKyAgICAgICAgJGRhdGEgPSAnJzsKKyAgICAgICAgJGdvdCA9IDA7CisgICAgICAgIHdoaWxlICgoJGdvdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkZGF0YSkpIDwgJGxlbikgeworICAgICAgICAgICAgJGRhdGEgLj0gJHRoaXMtPnJlYWQoJGxlbiAtICRnb3QpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gZGF0YSBvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscworICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKTsKKworICAgIC8qKgorICAgICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSBidWZmZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwIGIvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNWRhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UeXBlL1RDb25zdGFudC5waHAKQEAgLTAsMCArMSw1MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUeXBlOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGNvbnN0YW50IE1hbmFnZW1lbnQKKyAqLworYWJzdHJhY3QgY2xhc3MgVENvbnN0YW50Cit7CisgICAgLyoqCisgICAgICogRG9uJ3QgaW5zdGFuY2lhdGUgdGhpcyBjbGFzcworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNvbnN0YW50IHZhbHVlCisgICAgICogQHBhcmFtICBzdHJpbmcgJGNvbnN0YW50CisgICAgICogQHJldHVybiBtaXhlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCRjb25zdGFudCkKKyAgICB7CisgICAgICAgIGlmIChpc19udWxsKHN0YXRpYzo6JCRjb25zdGFudCkpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6JCRjb25zdGFudCA9IGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgIHNwcmludGYoJ3N0YXRpYzo6aW5pdF8lcycsICRjb25zdGFudCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdGljOjokJGNvbnN0YW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocCBiL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzlhZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UTWVzc2FnZVR5cGUucGhwCkBAIC0wLDAgKzEsMzQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHlwZTsKKworLyoqCisgKiBNZXNzYWdlIHR5cGVzIGZvciBSUEMKKyAqLworY2xhc3MgVE1lc3NhZ2VUeXBlCit7CisgICAgY29uc3QgQ0FMTCAgPSAxOworICAgIGNvbnN0IFJFUExZID0gMjsKKyAgICBjb25zdCBFWENFUFRJT04gPSAzOworICAgIGNvbnN0IE9ORVdBWSA9IDQ7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocCBiL2xpYi9waHAvbGliL1R5cGUvVFR5cGUucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGIxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocApAQCAtMCwwICsxLDQ3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFR5cGU7CisKKy8qKgorICogRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKKyAqLworY2xhc3MgVFR5cGUKK3sKKyAgICBjb25zdCBTVE9QICAgPSAwOworICAgIGNvbnN0IFZPSUQgICA9IDE7CisgICAgY29uc3QgQk9PTCAgID0gMjsKKyAgICBjb25zdCBCWVRFICAgPSAzOworICAgIGNvbnN0IEkwOCAgICA9IDM7CisgICAgY29uc3QgRE9VQkxFID0gNDsKKyAgICBjb25zdCBJMTYgICAgPSA2OworICAgIGNvbnN0IEkzMiAgICA9IDg7CisgICAgY29uc3QgSTY0ICAgID0gMTA7CisgICAgY29uc3QgU1RSSU5HID0gMTE7CisgICAgY29uc3QgVVRGNyAgID0gMTE7CisgICAgY29uc3QgU1RSVUNUID0gMTI7CisgICAgY29uc3QgTUFQICAgID0gMTM7CisgICAgY29uc3QgU0VUICAgID0gMTQ7CisgICAgY29uc3QgTFNUICAgID0gMTU7ICAgIC8vIE4uQi4gY2Fubm90IHVzZSBMSVNUIGtleXdvcmQgaW4gUEhQIQorICAgIGNvbnN0IFVURjggICA9IDE2OworICAgIGNvbnN0IFVURjE2ICA9IDE3OworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvVFN0cmluZ1V0aWxzLnBocCBiL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0YmFmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAKQEAgLTAsMCArMSw5MCBAQAorPD9waHAKKworaW50ZXJmYWNlIFRTdHJpbmdGdW5jCit7CisgICAgcHVibGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKTsKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpOworfQorCitjbGFzcyBUU3RyaW5nRnVuY19Db3JlCitpbXBsZW1lbnRzIFRTdHJpbmdGdW5jIHsKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpCisgICAgeworICAgICAgICAvLyBzcGVjaWZ5aW5nIGEgbnVsbCAkbGVuZ3RoIHdvdWxkIHJldHVybiBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gc3RybGVuKCRzdHIpOworICAgIH0KK30KKworY2xhc3MgVFN0cmluZ0Z1bmNfTWJzdHJpbmcKK2ltcGxlbWVudHMgVFN0cmluZ0Z1bmMgeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBXZSBuZWVkIHRvIHNldCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHRoZSBzZWNvbmQKKyAgICAgICAgICogb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCB0aGUgZmlyc3Qgb3B0aW9uYWwgcGFyYW1ldGVyIGNhbid0CisgICAgICAgICAqIGJlIG51bGwgb3IgZmFsc2UgYXMgYSAibWFnaWMiIHZhbHVlIGJlY2F1c2UgdGhhdCB3b3VsZAorICAgICAgICAgKiBjYXVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYmUgcmV0dXJuZWQsIHNvIHdlIG5lZWQgdG8KKyAgICAgICAgICogYWN0dWFsbHkgY2FsY3VsYXRlIHRoZSBwcm9wZXIgbGVuZ3RoIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCRsZW5ndGggPT09IG51bGwpIHsKKyAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+c3RybGVuKCRzdHIpIC0gJHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgsICc4Yml0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1iX3N0cmxlbigkc3RyLCAnOGJpdCcpOworICAgIH0KK30KKworY2xhc3MgVFN0cmluZ0Z1bmNGYWN0b3J5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgJF9pbnN0YW5jZTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU2luZ2xldG9uIGluc3RhbmNlIG9mIFRTdHJpbmdGdW5jIGltcGxlbWVudGF0aW9uIHRoYXQgaXMKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgc3lzdGVtJ3MgbWJzdHJpbmcuZnVuY19vdmVybG9hZCBzZXR0aW5ncy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVFN0cmluZ0Z1bmMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRfaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIHNlbGY6Ol9zZXRJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NldEluc3RhbmNlKCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYW5ub3QgdXNlIHN0ciogZnVuY3Rpb25zIGZvciBieXRlIGNvdW50aW5nIGJlY2F1c2UgbXVsdGlieXRlCisgICAgICAgICAqIGNoYXJhY3RlcnMgd2lsbCBiZSByZWFkIGEgc2luZ2xlIGJ5dGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBTZWU6IGh0dHA6Ly91cy5waHAubmV0L21hbnVhbC9lbi9tYnN0cmluZy5vdmVybG9hZC5waHAKKyAgICAgICAgICovCisgICAgICAgIGlmIChpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykgJiAyKSB7CisgICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IFRTdHJpbmdGdW5jX01ic3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIG1ic3RyaW5nIGlzIG5vdCBpbnN0YWxsZWQgb3IgZG9lcyBub3QgaGF2ZSBmdW5jdGlvbiBvdmVybG9hZGluZworICAgICAgICAgKiBvZiB0aGUgc3RyKiBmdW5jdGlvbnMgZW5hYmxlZCBzbyB1c2UgUEhQIGNvcmUgc3RyKiBmdW5jdGlvbnMgZm9yCisgICAgICAgICAqIGJ5dGUgY291bnRpbmcuCisgICAgICAgICAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgVFN0cmluZ0Z1bmNfQ29yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvVGhyaWZ0LnBocCBiL2xpYi9waHAvc3JjL1RocmlmdC5waHAKaW5kZXggZWY2YWI4YS4uNGZlNDM5MiAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvVGhyaWZ0LnBocAorKysgYi9saWIvcGhwL3NyYy9UaHJpZnQucGhwCkBAIC0yMCwxMSArMjAsMTEgQEAKICAqIEBwYWNrYWdlIHRocmlmdAogICovCiAKLQogLyoqCiAgKiBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAogICovCi1jbGFzcyBUVHlwZSB7CitjbGFzcyBUVHlwZQorewogICBjb25zdCBTVE9QICAgPSAwOwogICBjb25zdCBWT0lEICAgPSAxOwogICBjb25zdCBCT09MICAgPSAyOwpAQCAtNDcsNyArNDcsOCBAQAogLyoqCiAgKiBNZXNzYWdlIHR5cGVzIGZvciBSUEMKICAqLwotY2xhc3MgVE1lc3NhZ2VUeXBlIHsKK2NsYXNzIFRNZXNzYWdlVHlwZQorewogICBjb25zdCBDQUxMICA9IDE7CiAgIGNvbnN0IFJFUExZID0gMjsKICAgY29uc3QgRVhDRVBUSU9OID0gMzsKQEAgLTY3LDggKzY4LDEwIEBACiAgKiBAcGFyYW0gbWl4ZWQgJHAxIE1lc3NhZ2UgKHN0cmluZykgb3IgdHlwZS1zcGVjIChhcnJheSkKICAqIEBwYXJhbSBtaXhlZCAkcDIgQ29kZSAoaW50ZWdlcikgb3IgdmFsdWVzIChhcnJheSkKICAqLwotY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMT1udWxsLCAkcDI9MCkgeworY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgoreworICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHAxPW51bGwsICRwMj0wKQorICB7CiAgICAgaWYgKGlzX2FycmF5KCRwMSkgJiYgaXNfYXJyYXkoJHAyKSkgewogICAgICAgJHNwZWMgPSAkcDE7CiAgICAgICAkdmFscyA9ICRwMjsKQEAgLTkxLDcgKzk0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJyk7CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkgeworICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwogICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwpAQCAtMTU0LDEwICsxNTgsMTIgQEAKICAgICAgICR2YXJbJGtleV0gPSAkdmFsOwogICAgIH0KICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwogICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CkBAIC0yMDcsMTAgKzIxMywxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CiAgICAgfQorCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkgeworICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRmbmFtZSA9IG51bGw7CiAgICAgJGZ0eXBlID0gMDsKQEAgLTI1NiwxMCArMjY0LDEyIEBACiAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwogICAgIH0KICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwogICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwpAQCAtMzE0LDEwICszMjQsMTIgQEAKICAgICAgIH0KICAgICB9CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTGlzdCgkdmFyLCAkc3BlYywgJG91dHB1dCwgJHNldD1mYWxzZSkgeworICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CiAgICAgJGV3cml0ZSA9IG51bGw7CkBAIC0zNTcsMTAgKzM2OSwxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKICAgICB9CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpIHsKKyAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewpAQCAtMzkyLDYgKzQwNiw3IEBACiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCkBAIC00MDQsOCArNDE5LDggQEAKICAqIG9mIFBIUC4gTm90ZSB0aGF0IGNvZGUgaXMgaW50ZW50aW9uYWxseSBkdXBsaWNhdGVkIGluIGhlcmUgdG8gYXZvaWQgbWFraW5nCiAgKiBmdW5jdGlvbiBjYWxscyBmb3IgZXZlcnkgZmllbGQgb3IgbWVtYmVyIG9mIGEgY29udGFpbmVyLi4KICAqLwotYWJzdHJhY3QgY2xhc3MgVEJhc2UgewotCithYnN0cmFjdCBjbGFzcyBUQmFzZQorewogICBzdGF0aWMgJHRtZXRob2QgPSBhcnJheShUVHlwZTo6Qk9PTCAgID0+ICdCb29sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkJZVEUgICA9PiAnQnl0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJMTYgICAgPT4gJ0kxNicsCkBAIC00MTQsMTEgKzQyOSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnKTsKIAotICBhYnN0cmFjdCBmdW5jdGlvbiByZWFkKCRpbnB1dCk7CisgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRpbnB1dCk7CiAKLSAgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCk7CisgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KTsKIAotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNwZWM9bnVsbCwgJHZhbHM9bnVsbCkgeworICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNwZWM9bnVsbCwgJHZhbHM9bnVsbCkKKyAgewogICAgIGlmIChpc19hcnJheSgkc3BlYykgJiYgaXNfYXJyYXkoJHZhbHMpKSB7CiAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewogICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKQEAgLTQyOSw3ICs0NDUsOCBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTQ5MiwxMCArNTA5LDEyIEBACiAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkgeworICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldD1mYWxzZSkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKICAgICAkZXJlYWQgPSAkdnJlYWQgPSBudWxsOwpAQCAtNTQ1LDEwICs1NjQsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOwogICAgIH0KKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpIHsKKyAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZm5hbWUgPSBudWxsOwogICAgICRmdHlwZSA9IDA7CkBAIC01OTQsMTAgKzYxNSwxMiBAQAogICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKICAgICB9CiAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkgeworICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKQEAgLTY1MiwxMCArNjc1LDEyIEBACiAgICAgICB9CiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwogICAgICRld3JpdGUgPSBudWxsOwpAQCAtNjk1LDEwICs3MjAsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CiAgICAgfQorCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KSB7CisgIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CiAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKQEAgLTczMCwxMSArNzU3LDEzIEBACiAgICAgfQogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogfQogCi1jbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKICAgc3RhdGljICRfVFNQRUMgPQogICAgIGFycmF5KDEgPT4gYXJyYXkoJ3ZhcicgPT4gJ21lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnID0+IFRUeXBlOjpTVFJJTkcpLApAQCAtNzQ3LDE2ICs3NzYsMjEgQEAKICAgY29uc3QgV1JPTkdfTUVUSE9EX05BTUUgPSAzOwogICBjb25zdCBCQURfU0VRVUVOQ0VfSUQgPSA0OwogICBjb25zdCBNSVNTSU5HX1JFU1VMVCA9IDU7CisgIGNvbnN0IElOVEVSTkFMX0VSUk9SID0gNjsKKyAgY29uc3QgUFJPVE9DT0xfRVJST1IgPSA3OwogCi0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApIHsKKyAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApCisgIHsKICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7CiAgIH0KIAotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KSB7CisgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRvdXRwdXQpCisgIHsKICAgICByZXR1cm4gJHRoaXMtPl9yZWFkKCdUQXBwbGljYXRpb25FeGNlcHRpb24nLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsKICAgfQogCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSB7CisgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwogICAgIGlmICgkbWVzc2FnZSA9ICR0aGlzLT5nZXRNZXNzYWdlKCkpIHsKQEAgLTc3MSw2ICs4MDUsNyBAQAogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIH0KQEAgLTc4Myw1ICs4MTgsNCBAQAogfQogaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcHJvdG9jb2wvVFByb3RvY29sLnBocCc7CiBpbmNsdWRlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAnOwotCi0/PgoraW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvVFN0cmluZ1V0aWxzLnBocCc7CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9hdXRvbG9hZC5waHAgYi9saWIvcGhwL3NyYy9hdXRvbG9hZC5waHAKaW5kZXggM2EzNTU0NS4uODViZDc5NyAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvYXV0b2xvYWQucGhwCisrKyBiL2xpYi9waHAvc3JjL2F1dG9sb2FkLnBocApAQCAtMjAsNyArMjAsNiBAQAogICogQHBhY2thZ2UgdGhyaWZ0CiAgKi8KIAotCiAvKioKICAqIEluY2x1ZGUgdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVzZSBhdXRvbG9hZCB3aXRoIHlvdXIgUEhQIGdlbmVyYXRlZCBUaHJpZnQKICAqIGNvZGUuIFRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsICpub3QqIGluY2x1ZGUgYW55IGRlZmluZWQgVGhyaWZ0IGNsYXNzZXMgYnkKQEAgLTM3LDEyICszNiwxMyBAQAogJEdMT0JBTFNbJ0FVVE9MT0FEX0hPT0tTJ10gPSBhcnJheSgpOwogCiBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnX19hdXRvbG9hZCcpKSB7Ci0gIGZ1bmN0aW9uIF9fYXV0b2xvYWQoJGNsYXNzKSB7CisgIGZ1bmN0aW9uIF9fYXV0b2xvYWQoJGNsYXNzKQorICB7CiAgICAgZ2xvYmFsICRUSFJJRlRfQVVUT0xPQUQ7CiAgICAgJGNsYXNzbCA9IHN0cnRvbG93ZXIoJGNsYXNzKTsKICAgICBpZiAoaXNzZXQoJFRIUklGVF9BVVRPTE9BRFskY2xhc3NsXSkpIHsKICAgICAgIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzLycuJFRIUklGVF9BVVRPTE9BRFskY2xhc3NsXTsKLSAgICB9IGVsc2UgaWYgKCFlbXB0eSgkR0xPQkFMU1snQVVUT0xPQURfSE9PS1MnXSkpIHsKKyAgICB9IGVsc2VpZiAoIWVtcHR5KCRHTE9CQUxTWydBVVRPTE9BRF9IT09LUyddKSkgewogICAgICAgZm9yZWFjaCAoJEdMT0JBTFNbJ0FVVE9MT0FEX0hPT0tTJ10gYXMgJGhvb2spIHsKICAgICAgICAgJGhvb2soJGNsYXNzKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00IGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKaW5kZXggMmMzMzhhMC4uZTIxMzhjOCAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKQEAgLTIsMTQgKzIsMzMgQEAKIGRubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAogZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAogZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KK2RubAorZG5sIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK2RubCBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZG5sIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCitkbmwgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCitkbmwgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorZG5sICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK2RubCB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2RubAorZG5sICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK2RubAorZG5sIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK2RubCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorZG5sICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorZG5sIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitkbmwgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworZG5sIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBQSFBfQVJHX0VOQUJMRSh0aHJpZnRfcHJvdG9jb2wsIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uLAotWyAgLS1lbmFibGUtdGhyaWZ0X3Byb3RvY29sCUVuYWJsZSB0aGUgZmJ0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uXSkKK1sgIC0tZW5hYmxlLXRocmlmdF9wcm90b2NvbAlFbmFibGUgdGhlIHRocmlmdF9wcm90b2NvbCBleHRlbnNpb25dKQogCiBpZiB0ZXN0ICIkUEhQX1RIUklGVF9QUk9UT0NPTCIgIT0gIm5vIjsgdGhlbgogICBQSFBfUkVRVUlSRV9DWFgoKQogICBQSFBfQUREX0xJQlJBUllfV0lUSF9QQVRIKHN0ZGMrKywgIiIsIFRIUklGVF9QUk9UT0NPTF9TSEFSRURfTElCQUREKQogICBQSFBfU1VCU1QoVEhSSUZUX1BST1RPQ09MX1NIQVJFRF9MSUJBREQpCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLXN0ZD1jKysxMSIKKwogICBQSFBfTkVXX0VYVEVOU0lPTih0aHJpZnRfcHJvdG9jb2wsIHBocF90aHJpZnRfcHJvdG9jb2wuY3BwLCAkZXh0X3NoYXJlZCkKIGZpCiAKZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnczMiBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLnczMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGYyNzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcudzMyCkBAIC0wLDAgKzEsOCBAQAorLy8gJElkOiBjb25maWcudzMyIDI1MDQwNCAyMDA4LTAxLTExIDEzOjM3OjI0WiBycmljaGFyZHMgJAorLy8gdmltOmZ0PWphdmFzY3JpcHQKKworQVJHX1dJVEgoInRocmlmdF9wcm90b2NvbCIsICJ3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdGhyaWZ0X3Byb3RvY29sIGV4dGVuc2lvbiIsICJ5ZXMiKTsKKworaWYgKFBIUF9USFJJRlRfUFJPVE9DT0wgPT0gInllcyIpeworICBFWFRFTlNJT04oInRocmlmdF9wcm90b2NvbCIsICJwaHBfdGhyaWZ0X3Byb3RvY29sLmNwcCIpCit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcAppbmRleCBlNmJhOTRhLi42M2M4OTA1IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwCisrKyBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAKQEAgLTE2LDI0ICsxNiw0MyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQogI2lmZGVmIEhBVkVfQ09ORklHX0gKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgogCisjaW5jbHVkZSAicGhwLmgiCisjaW5jbHVkZSAiemVuZF9pbnRlcmZhY2VzLmgiCisjaW5jbHVkZSAiemVuZF9leGNlcHRpb25zLmgiCisjaW5jbHVkZSAicGhwX3RocmlmdF9wcm90b2NvbC5oIgorCisjaWYgUEhQX1ZFUlNJT05fSUQgPj0gNzAwMDAKKwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlbmRpYW4uaD4KLSNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaWZuZGVmIGJzd2FwXzY0CisjZGVmaW5lCWJzd2FwXzY0KHgpICAgICAoKCh1aW50NjRfdCkoeCkgPDwgNTYpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDY0X3QpKHgpIDw8IDQwKSAmIDB4ZmYwMDAwMDAwMDAwMDBVTEwpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDY0X3QpKHgpIDw8IDI0KSAmIDB4ZmYwMDAwMDAwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA8PCA4KSAgJiAweGZmMDAwMDAwMDBVTEwpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDY0X3QpKHgpID4+IDgpICAmIDB4ZmYwMDAwMDBVTEwpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDY0X3QpKHgpID4+IDI0KSAmIDB4ZmYwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA+PiA0MCkgJiAweGZmMDBVTEwpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50NjRfdCkoeCkgID4+IDU2KSkKKyNlbmRpZgogCiAjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgogI2RlZmluZSBodG9ubGwoeCkgYnN3YXBfNjQoeCkKICNkZWZpbmUgbnRvaGxsKHgpIGJzd2FwXzY0KHgpCi0jZWxzZQorI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgogI2RlZmluZSBodG9ubGwoeCkgeAogI2RlZmluZSBudG9obGwoeCkgeAorI2Vsc2UKKyNlcnJvciBVbmtub3duIF9fQllURV9PUkRFUgogI2VuZGlmCiAKIGVudW0gVFR5cGUgewpAQCAtNjYsMjYgKzg1LDIyIEBACiBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CiAKLSNpbmNsdWRlICJwaHAuaCIKLSNpbmNsdWRlICJ6ZW5kX2ludGVyZmFjZXMuaCIKLSNpbmNsdWRlICJ6ZW5kX2V4Y2VwdGlvbnMuaCIKLSNpbmNsdWRlICJwaHBfdGhyaWZ0X3Byb3RvY29sLmgiCi0KLXN0YXRpYyBmdW5jdGlvbl9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfZnVuY3Rpb25zW10gPSB7Ci0gIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5LCBOVUxMKQotICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5LCBOVUxMKQotICB7TlVMTCwgTlVMTCwgTlVMTH0KLX0gOworc3RhdGljIHplbmRfZnVuY3Rpb25fZW50cnkgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9uc1tdID0geworICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSwgbnVsbHB0cikKKyAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSwgbnVsbHB0cikKKyAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luLCBudWxscHRyKQorICB7bnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cn0KK307CiAKIHplbmRfbW9kdWxlX2VudHJ5IHRocmlmdF9wcm90b2NvbF9tb2R1bGVfZW50cnkgPSB7CiAgIFNUQU5EQVJEX01PRFVMRV9IRUFERVIsCiAgICJ0aHJpZnRfcHJvdG9jb2wiLAogICB0aHJpZnRfcHJvdG9jb2xfZnVuY3Rpb25zLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAorICBudWxscHRyLAorICBudWxscHRyLAorICBudWxscHRyLAorICBudWxscHRyLAorICBudWxscHRyLAogICAiMS4wIiwKICAgU1RBTkRBUkRfTU9EVUxFX1BST1BFUlRJRVMKIH07CkBAIC05Niw0MiArMTExLDYxIEBACiAKIGNsYXNzIFBIUEV4Y2VwdGlvbldyYXBwZXIgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gewogcHVibGljOgotICBQSFBFeGNlcHRpb25XcmFwcGVyKHp2YWwqIF9leCkgdGhyb3coKSA6IGV4KF9leCkgewotICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIGV4KTsKKyAgUEhQRXhjZXB0aW9uV3JhcHBlcih6dmFsKiBfZXgpIHRocm93KCkgeworICAgIFpWQUxfQ09QWSgmZXgsIF9leCk7CisgICAgc25wcmludGYoX3doYXQsIDQwLCAiUEhQIGV4Y2VwdGlvbiB6dmFsPSVwIiwgX2V4KTsKICAgfQotICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7IHJldHVybiBfd2hhdDsgfQotICB+UEhQRXhjZXB0aW9uV3JhcHBlcigpIHRocm93KCkge30KLSAgb3BlcmF0b3IgenZhbCooKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8enZhbCo+KGV4KTsgfSAvLyBaZW5kIEFQSSBkb2Vzbid0IGRvICdjb25zdCcuLi4KKworICBQSFBFeGNlcHRpb25XcmFwcGVyKHplbmRfb2JqZWN0KiBfZXhvYmopIHRocm93KCkgeworICAgIFpWQUxfT0JKKCZleCwgX2V4b2JqKTsKKyAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBfZXhvYmopOworICB9CisgIH5QSFBFeGNlcHRpb25XcmFwcGVyKCkgdGhyb3coKSB7CisgICAgenZhbF9kdG9yKCZleCk7CisgIH0KKworICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgICAgcmV0dXJuIF93aGF0OworICB9CisgIG9wZXJhdG9yIHp2YWwqKCkgY29uc3QgdGhyb3coKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8enZhbCo+KCZleCk7CisgIH0gLy8gWmVuZCBBUEkgZG9lc24ndCBkbyAnY29uc3QnLi4uCiBwcm90ZWN0ZWQ6Ci0gIHp2YWwqIGV4OworICB6dmFsIGV4OwogICBjaGFyIF93aGF0WzQwXTsKIH0gOwogCiBjbGFzcyBQSFBUcmFuc3BvcnQgewotcHVibGljOgotICB6dmFsKiBwcm90b2NvbCgpIHsgcmV0dXJuIHA7IH0KLSAgenZhbCogdHJhbnNwb3J0KCkgeyByZXR1cm4gdDsgfQogcHJvdGVjdGVkOgotICBQSFBUcmFuc3BvcnQoKSB7fQorICBQSFBUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUpIHsKKyAgICBhc3NlcnQoWl9UWVBFX1AoX3ApID09IElTX09CSkVDVCk7CiAKLSAgdm9pZCBjb25zdHJ1Y3Rfd2l0aF96dmFsKHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplKSB7CisgICAgWlZBTF9VTkRFRigmdCk7CisKICAgICBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihlbWFsbG9jKF9idWZmZXJfc2l6ZSkpOwogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CiAgICAgYnVmZmVyX3VzZWQgPSAwOwogICAgIGJ1ZmZlcl9zaXplID0gX2J1ZmZlcl9zaXplOwotICAgIHAgPSBfcDsKIAogICAgIC8vIEdldCB0aGUgdHJhbnNwb3J0IGZvciB0aGUgcGFzc2VkIHByb3RvY29sCiAgICAgenZhbCBnZXR0cmFuc3BvcnQ7Ci0gICAgWlZBTF9TVFJJTkcoJmdldHRyYW5zcG9ydCwgImdldFRyYW5zcG9ydCIsIDApOwotICAgIE1BS0VfU1REX1pWQUwodCk7Ci0gICAgWlZBTF9OVUxMKHQpOwotICAgIFRTUk1MU19GRVRDSCgpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZwLCAmZ2V0dHJhbnNwb3J0LCB0LCAwLCBOVUxMIFRTUk1MU19DQyk7CisgICAgWlZBTF9TVFJJTkcoJmdldHRyYW5zcG9ydCwgImdldFRyYW5zcG9ydCIpOworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihudWxscHRyLCBfcCwgJmdldHRyYW5zcG9ydCwgJnQsIDAsIG51bGxwdHIpOworCisgICAgenZhbF9kdG9yKCZnZXR0cmFuc3BvcnQpOworCisgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgIH0KKworICAgIGFzc2VydChaX1RZUEUodCkgPT0gSVNfT0JKRUNUKTsKICAgfQorCiAgIH5QSFBUcmFuc3BvcnQoKSB7CiAgICAgZWZyZWUoYnVmZmVyKTsKLSAgICB6dmFsX3B0cl9kdG9yKCZ0KTsKKyAgICB6dmFsX2R0b3IoJnQpOwogICB9CiAKICAgY2hhciogYnVmZmVyOwpAQCAtMTM5LDI1ICsxNzMsMTggQEAKICAgc2l6ZV90IGJ1ZmZlcl91c2VkOwogICBzaXplX3QgYnVmZmVyX3NpemU7CiAKLSAgenZhbCogcDsKLSAgenZhbCogdDsKKyAgenZhbCB0OwogfTsKIAogCiBjbGFzcyBQSFBPdXRwdXRUcmFuc3BvcnQgOiBwdWJsaWMgUEhQVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgUEhQT3V0cHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgewotICAgIGNvbnN0cnVjdF93aXRoX3p2YWwoX3AsIF9idWZmZXJfc2l6ZSk7Ci0gIH0KLQotICB+UEhQT3V0cHV0VHJhbnNwb3J0KCkgewotICAgIGZsdXNoKCk7Ci0gICAgZGlyZWN0Rmx1c2goKTsKLSAgfQorICBQSFBPdXRwdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSA6IFBIUFRyYW5zcG9ydChfcCwgX2J1ZmZlcl9zaXplKSB7IH0KKyAgflBIUE91dHB1dFRyYW5zcG9ydCgpIHsgfQogCiAgIHZvaWQgd3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewogICAgIGlmICgobGVuICsgYnVmZmVyX3VzZWQpID4gYnVmZmVyX3NpemUpIHsKLSAgICAgIGZsdXNoKCk7CisgICAgICBpbnRlcm5hbEZsdXNoKCk7CiAgICAgfQogICAgIGlmIChsZW4gPiBidWZmZXJfc2l6ZSkgewogICAgICAgZGlyZWN0V3JpdGUoZGF0YSwgbGVuKTsKQEAgLTE5OCw0MSArMjI1LDQ4IEBACiAgIH0KIAogICB2b2lkIGZsdXNoKCkgewotICAgIGlmIChidWZmZXJfdXNlZCkgeworICAgIGludGVybmFsRmx1c2goKTsKKyAgICBkaXJlY3RGbHVzaCgpOworICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBpbnRlcm5hbEZsdXNoKCkgeworICAgICBpZiAoYnVmZmVyX3VzZWQpIHsKICAgICAgIGRpcmVjdFdyaXRlKGJ1ZmZlciwgYnVmZmVyX3VzZWQpOwogICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKICAgICAgIGJ1ZmZlcl91c2VkID0gMDsKICAgICB9CiAgIH0KLQotcHJvdGVjdGVkOgogICB2b2lkIGRpcmVjdEZsdXNoKCkgewotICAgIHp2YWwgcmV0OworICAgIHp2YWwgcmV0LCBmbHVzaGZuOwogICAgIFpWQUxfTlVMTCgmcmV0KTsKLSAgICB6dmFsIGZsdXNoZm47Ci0gICAgWlZBTF9TVFJJTkcoJmZsdXNoZm4sICJmbHVzaCIsIDApOwotICAgIFRTUk1MU19GRVRDSCgpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmZmx1c2hmbiwgJnJldCwgMCwgTlVMTCBUU1JNTFNfQ0MpOwotICAgIHp2YWxfZHRvcigmcmV0KTsKLSAgfQotICB2b2lkIGRpcmVjdFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pIHsKLSAgICB6dmFsIHdyaXRlZm47Ci0gICAgWlZBTF9TVFJJTkcoJndyaXRlZm4sICJ3cml0ZSIsIDApOwotICAgIGNoYXIqIG5ld2J1ZiA9IChjaGFyKillbWFsbG9jKGJ1ZmZlcl91c2VkICsgMSk7Ci0gICAgbWVtY3B5KG5ld2J1ZiwgYnVmZmVyLCBidWZmZXJfdXNlZCk7Ci0gICAgbmV3YnVmW2J1ZmZlcl91c2VkXSA9ICdcMCc7Ci0gICAgenZhbCAqYXJnc1sxXTsKLSAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgIFpWQUxfU1RSSU5HTChhcmdzWzBdLCBuZXdidWYsIGJ1ZmZlcl91c2VkLCAwKTsKLSAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICB6dmFsIHJldDsKLSAgICBaVkFMX05VTEwoJnJldCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZ3cml0ZWZuLCAmcmV0LCAxLCBhcmdzIFRTUk1MU19DQyk7Ci0gICAgenZhbF9wdHJfZHRvcihhcmdzKTsKKyAgICBaVkFMX1NUUklORygmZmx1c2hmbiwgImZsdXNoIik7CisKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmZmx1c2hmbiwgJnJldCwgMCwgbnVsbHB0cik7CisgICAgenZhbF9kdG9yKCZmbHVzaGZuKTsKICAgICB6dmFsX2R0b3IoJnJldCk7CiAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKLSAgICAgIHp2YWwqIGV4ID0gRUcoZXhjZXB0aW9uKTsKLSAgICAgIEVHKGV4Y2VwdGlvbikgPSBOVUxMOworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgfQorICB9CisgIHZvaWQgZGlyZWN0V3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgeworICAgIHp2YWwgYXJnc1sxXSwgcmV0LCB3cml0ZWZuOworCisgICAgWlZBTF9TVFJJTkcoJndyaXRlZm4sICJ3cml0ZSIpOworICAgIFpWQUxfU1RSSU5HTCgmYXJnc1swXSwgZGF0YSwgbGVuKTsKKworICAgIFpWQUxfTlVMTCgmcmV0KTsKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmd3JpdGVmbiwgJnJldCwgMSwgYXJncyk7CisKKyAgICB6dmFsX2R0b3IoJndyaXRlZm4pOworICAgIHp2YWxfZHRvcigmcmV0KTsKKyAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOworCisgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOwogICAgIH0KICAgfQpAQCAtMjQwLDggKzI3NCw3IEBACiAKIGNsYXNzIFBIUElucHV0VHJhbnNwb3J0IDogcHVibGljIFBIUFRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIFBIUElucHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgewotICAgIGNvbnN0cnVjdF93aXRoX3p2YWwoX3AsIF9idWZmZXJfc2l6ZSk7CisgIFBIUElucHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgOiBQSFBUcmFuc3BvcnQoX3AsIF9idWZmZXJfc2l6ZSkgewogICB9CiAKICAgflBIUElucHV0VHJhbnNwb3J0KCkgewpAQCAtMjUwLDI0ICsyODMsMjEgQEAKIAogICB2b2lkIHB1dF9iYWNrKCkgewogICAgIGlmIChidWZmZXJfdXNlZCkgewotICAgICAgenZhbCBwdXRiYWNrZm47Ci0gICAgICBaVkFMX1NUUklORygmcHV0YmFja2ZuLCAicHV0QmFjayIsIDApOwotCi0gICAgICBjaGFyKiBuZXdidWYgPSAoY2hhciopZW1hbGxvYyhidWZmZXJfdXNlZCArIDEpOwotICAgICAgbWVtY3B5KG5ld2J1ZiwgYnVmZmVyX3B0ciwgYnVmZmVyX3VzZWQpOwotICAgICAgbmV3YnVmW2J1ZmZlcl91c2VkXSA9ICdcMCc7Ci0KLSAgICAgIHp2YWwgKmFyZ3NbMV07Ci0gICAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgICAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIG5ld2J1ZiwgYnVmZmVyX3VzZWQsIDApOwotCi0gICAgICBUU1JNTFNfRkVUQ0goKTsKLQotICAgICAgenZhbCByZXQ7CisgICAgICB6dmFsIGFyZ3NbMV0sIHJldCwgcHV0YmFja2ZuOworICAgICAgWlZBTF9TVFJJTkdMKCZhcmdzWzBdLCBidWZmZXJfcHRyLCBidWZmZXJfdXNlZCk7CisgICAgICBaVkFMX1NUUklORygmcHV0YmFja2ZuLCAicHV0QmFjayIpOwogICAgICAgWlZBTF9OVUxMKCZyZXQpOwotICAgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZwdXRiYWNrZm4sICZyZXQsIDEsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisKKyAgICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZwdXRiYWNrZm4sICZyZXQsIDEsIGFyZ3MpOworCisgICAgICB6dmFsX2R0b3IoJnB1dGJhY2tmbik7CiAgICAgICB6dmFsX2R0b3IoJnJldCk7CisgICAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQogICAgIH0KICAgICBidWZmZXJfdXNlZCA9IDA7CiAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKQEAgLTI3NSw3ICszMDUsNyBAQAogCiAgIHZvaWQgc2tpcChzaXplX3QgbGVuKSB7CiAgICAgd2hpbGUgKGxlbikgewotICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSBNSU4obGVuLCBidWZmZXJfdXNlZCk7CisgICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IChzdGQ6Om1pbikobGVuLCBidWZmZXJfdXNlZCk7CiAgICAgICBpZiAoY2h1bmtfc2l6ZSkgewogICAgICAgICBidWZmZXJfcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyX3B0cikgKyBjaHVua19zaXplOwogICAgICAgICBidWZmZXJfdXNlZCAtPSBjaHVua19zaXplOwpAQCAtMjg4LDcgKzMxOCw3IEBACiAKICAgdm9pZCByZWFkQnl0ZXModm9pZCogYnVmLCBzaXplX3QgbGVuKSB7CiAgICAgd2hpbGUgKGxlbikgewotICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSBNSU4obGVuLCBidWZmZXJfdXNlZCk7CisgICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IChzdGQ6Om1pbikobGVuLCBidWZmZXJfdXNlZCk7CiAgICAgICBpZiAoY2h1bmtfc2l6ZSkgewogICAgICAgICBtZW1jcHkoYnVmLCBidWZmZXJfcHRyLCBjaHVua19zaXplKTsKICAgICAgICAgYnVmZmVyX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcl9wdHIpICsgY2h1bmtfc2l6ZTsKQEAgLTMyOSwyOSArMzU5LDI5IEBACiAgIHZvaWQgcmVmaWxsKCkgewogICAgIGFzc2VydChidWZmZXJfdXNlZCA9PSAwKTsKICAgICB6dmFsIHJldHZhbDsKLSAgICBaVkFMX05VTEwoJnJldHZhbCk7Ci0KLSAgICB6dmFsICphcmdzWzFdOwotICAgIE1BS0VfU1REX1pWQUwoYXJnc1swXSk7Ci0gICAgWlZBTF9MT05HKGFyZ3NbMF0sIGJ1ZmZlcl9zaXplKTsKLQotICAgIFRTUk1MU19GRVRDSCgpOwotCisgICAgenZhbCBhcmdzWzFdOwogICAgIHp2YWwgZnVuY25hbWU7Ci0gICAgWlZBTF9TVFJJTkcoJmZ1bmNuYW1lLCAicmVhZCIsIDApOwogCi0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZmdW5jbmFtZSwgJnJldHZhbCwgMSwgYXJncyBUU1JNTFNfQ0MpOwotICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisgICAgWlZBTF9OVUxMKCZyZXR2YWwpOworICAgIFpWQUxfTE9ORygmYXJnc1swXSwgYnVmZmVyX3NpemUpOworCisgICAgWlZBTF9TVFJJTkcoJmZ1bmNuYW1lLCAicmVhZCIpOworCisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJmZ1bmNuYW1lLCAmcmV0dmFsLCAxLCBhcmdzKTsKKyAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOworICAgIHp2YWxfZHRvcigmZnVuY25hbWUpOwogCiAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKICAgICAgIHp2YWxfZHRvcigmcmV0dmFsKTsKLSAgICAgIHp2YWwqIGV4ID0gRUcoZXhjZXB0aW9uKTsKLSAgICAgIEVHKGV4Y2VwdGlvbikgPSBOVUxMOworCisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CiAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKICAgICB9CiAKICAgICBidWZmZXJfdXNlZCA9IFpfU1RSTEVOKHJldHZhbCk7CiAgICAgbWVtY3B5KGJ1ZmZlciwgWl9TVFJWQUwocmV0dmFsKSwgYnVmZmVyX3VzZWQpOworCiAgICAgenZhbF9kdG9yKCZyZXR2YWwpOwogCiAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKQEAgLTM1OSwyMjAgKzM4OSw2MyBAQAogCiB9OwogCitzdGF0aWMKIHZvaWQgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYyk7CitzdGF0aWMKIHZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKTsKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpOwotdm9pZCBza2lwX2VsZW1lbnQobG9uZyB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0KTsKK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKTsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfc2NhbGFyKGludDhfdCB0KTsKIAogLy8gQ3JlYXRlIGEgUEhQIG9iamVjdCBnaXZlbiBhIHR5cGVuYW1lIGFuZCBjYWxsIHRoZSBjdG9yLCBvcHRpb25hbGx5IHBhc3NpbmcgdXAgdG8gMiBhcmd1bWVudHMKLXZvaWQgY3JlYXRlT2JqZWN0KGNoYXIqIG9ial90eXBlbmFtZSwgenZhbCogcmV0dXJuX3ZhbHVlLCBpbnQgbmFyZ3MgPSAwLCB6dmFsKiBhcmcxID0gTlVMTCwgenZhbCogYXJnMiA9IE5VTEwpIHsKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHNpemVfdCBvYmpfdHlwZW5hbWVfbGVuID0gc3RybGVuKG9ial90eXBlbmFtZSk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9mZXRjaF9jbGFzcyhvYmpfdHlwZW5hbWUsIG9ial90eXBlbmFtZV9sZW4sIFpFTkRfRkVUQ0hfQ0xBU1NfREVGQVVMVCBUU1JNTFNfQ0MpOworc3RhdGljCit2b2lkIGNyZWF0ZU9iamVjdChjb25zdCBjaGFyKiBvYmpfdHlwZW5hbWUsIHp2YWwqIHJldHVybl92YWx1ZSwgaW50IG5hcmdzID0gMCwgenZhbCogYXJnMSA9IG51bGxwdHIsIHp2YWwqIGFyZzIgPSBudWxscHRyKSB7CisgIC8qIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGF0IG9uIHRoZSBzdGFjayA/ICovCisgIHplbmRfc3RyaW5nICpvYmpfbmFtZSA9IHplbmRfc3RyaW5nX2luaXQob2JqX3R5cGVuYW1lLCBzdHJsZW4ob2JqX3R5cGVuYW1lKSwgMCk7CisgIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9mZXRjaF9jbGFzcyhvYmpfbmFtZSwgWkVORF9GRVRDSF9DTEFTU19ERUZBVUxUKTsKKyAgemVuZF9zdHJpbmdfcmVsZWFzZShvYmpfbmFtZSk7CisKICAgaWYgKCEgY2UpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiQ2xhc3MgJXMgZG9lcyBub3QgZXhpc3QiLCBvYmpfdHlwZW5hbWUpOworICAgIHBocF9lcnJvcl9kb2NyZWYobnVsbHB0ciwgRV9FUlJPUiwgIkNsYXNzICVzIGRvZXMgbm90IGV4aXN0Iiwgb2JqX3R5cGVuYW1lKTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9CiAKLSAgb2JqZWN0X2FuZF9wcm9wZXJ0aWVzX2luaXQocmV0dXJuX3ZhbHVlLCBjZSwgTlVMTCk7Ci0gIHplbmRfZnVuY3Rpb24qIGNvbnN0cnVjdG9yID0gemVuZF9zdGRfZ2V0X2NvbnN0cnVjdG9yKHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpOwotICB6dmFsKiBjdG9yX3J2ID0gTlVMTDsKLSAgemVuZF9jYWxsX21ldGhvZCgmcmV0dXJuX3ZhbHVlLCBjZSwgJmNvbnN0cnVjdG9yLCBOVUxMLCAwLCAmY3Rvcl9ydiwgbmFyZ3MsIGFyZzEsIGFyZzIgVFNSTUxTX0NDKTsKLSAgenZhbF9wdHJfZHRvcigmY3Rvcl9ydik7CisgIG9iamVjdF9hbmRfcHJvcGVydGllc19pbml0KHJldHVybl92YWx1ZSwgY2UsIG51bGxwdHIpOworICB6ZW5kX2Z1bmN0aW9uKiBjb25zdHJ1Y3RvciA9IHplbmRfc3RkX2dldF9jb25zdHJ1Y3RvcihaX09CSl9QKHJldHVybl92YWx1ZSkpOworICB6dmFsIGN0b3JfcnY7CisgIHplbmRfY2FsbF9tZXRob2QocmV0dXJuX3ZhbHVlLCBjZSwgJmNvbnN0cnVjdG9yLCBOVUxMLCAwLCAmY3Rvcl9ydiwgbmFyZ3MsIGFyZzEsIGFyZzIpOworICB6dmFsX2R0b3IoJmN0b3JfcnYpOworICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIH0KIH0KIAotdm9pZCB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oY2hhciogd2hhdCwgbG9uZyBlcnJvcmNvZGUpIHsKLSAgVFNSTUxTX0ZFVENIKCk7CitzdGF0aWMKK3ZvaWQgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGNvbnN0IGNoYXIqIHdoYXQsIGxvbmcgZXJyb3Jjb2RlKSB7CisgIHp2YWwgendoYXQsIHplcnJvcmNvZGU7CiAKLSAgenZhbCAqendoYXQsICp6ZXJyb3Jjb2RlOwotICBNQUtFX1NURF9aVkFMKHp3aGF0KTsKLSAgTUFLRV9TVERfWlZBTCh6ZXJyb3Jjb2RlKTsKKyAgWlZBTF9TVFJJTkcoJnp3aGF0LCB3aGF0KTsKKyAgWlZBTF9MT05HKCZ6ZXJyb3Jjb2RlLCBlcnJvcmNvZGUpOwogCi0gIFpWQUxfU1RSSU5HKHp3aGF0LCB3aGF0LCAxKTsKLSAgWlZBTF9MT05HKHplcnJvcmNvZGUsIGVycm9yY29kZSk7CisgIHp2YWwgZXg7CisgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uIiwgJmV4LCAyLCAmendoYXQsICZ6ZXJyb3Jjb2RlKTsKIAotICB6dmFsKiBleDsKLSAgTUFLRV9TVERfWlZBTChleCk7Ci0gIGNyZWF0ZU9iamVjdCgiVFByb3RvY29sRXhjZXB0aW9uIiwgZXgsIDIsIHp3aGF0LCB6ZXJyb3Jjb2RlKTsKLSAgenZhbF9wdHJfZHRvcigmendoYXQpOwotICB6dmFsX3B0cl9kdG9yKCZ6ZXJyb3Jjb2RlKTsKLSAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIHp2YWxfZHRvcigmendoYXQpOworICB6dmFsX2R0b3IoJnplcnJvcmNvZGUpOworCisgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoJmV4KTsKIH0KIAogLy8gU2V0cyBFRyhleGNlcHRpb24pLCBjYWxsIHRoaXMgYW5kIHRoZW4gUkVUVVJOX05VTEwoKTsKK3N0YXRpYwogdm9pZCB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7Ci0gIHplbmRfdGhyb3dfZXhjZXB0aW9uKHplbmRfZXhjZXB0aW9uX2dldF9kZWZhdWx0KFRTUk1MU19DQyksIGNvbnN0X2Nhc3Q8Y2hhcio+KGV4LndoYXQoKSksIDAgVFNSTUxTX0NDKTsKKyAgemVuZF90aHJvd19leGNlcHRpb24oemVuZF9leGNlcHRpb25fZ2V0X2RlZmF1bHQoKSwgY29uc3RfY2FzdDxjaGFyKj4oZXgud2hhdCgpKSwgMCk7CiB9CiAKLQotdm9pZCBiaW5hcnlfZGVzZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHJldHVybl92YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKLSAgenZhbCoqIHZhbF9wdHI7Ci0gIFpfVFlQRV9QKHJldHVybl92YWx1ZSkgPSBJU19OVUxMOyAvLyBqdXN0IGluIGNhc2UKLQotICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKLSAgICBjYXNlIFRfU1RPUDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX1NUUlVDVDogewotICAgICAgaWYgKHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImNsYXNzIiwgNiwgKHZvaWQqKikmdmFsX3B0cikgIT0gU1VDQ0VTUykgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIm5vIGNsYXNzIHR5cGUgaW4gc3BlYyIsIElOVkFMSURfREFUQSk7Ci0gICAgICAgIHNraXBfZWxlbWVudChUX1NUUlVDVCwgdHJhbnNwb3J0KTsKLSAgICAgICAgUkVUVVJOX05VTEwoKTsKLSAgICAgIH0KLSAgICAgIGNoYXIqIHN0cnVjdFR5cGUgPSBaX1NUUlZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIGNyZWF0ZU9iamVjdChzdHJ1Y3RUeXBlLCByZXR1cm5fdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QKHJldHVybl92YWx1ZSkgPT0gSVNfTlVMTCkgewotICAgICAgICAvLyB1bmFibGUgdG8gY3JlYXRlIGNsYXNzIGVudHJ5Ci0gICAgICAgIHNraXBfZWxlbWVudChUX1NUUlVDVCwgdHJhbnNwb3J0KTsKLSAgICAgICAgUkVUVVJOX05VTEwoKTsKLSAgICAgIH0KLSAgICAgIFRTUk1MU19GRVRDSCgpOwotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkocmV0dXJuX3ZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIGNoYXIgZXJyYnVmWzEyOF07Ci0gICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAic3BlYyBmb3IgJXMgaXMgd3JvbmcgdHlwZTogJWRcbiIsIHN0cnVjdFR5cGUsIFpfVFlQRV9QKHNwZWMpKTsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgICAgUkVUVVJOX05VTEwoKTsKLSAgICAgIH0KLSAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgVF9CT09MOiB7Ci0gICAgICB1aW50OF90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKLSAgICAgIFJFVFVSTl9CT09MKGMgIT0gMCk7Ci0gICAgfQotICAvL2Nhc2UgVF9JMDg6IC8vIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyBUX0JZVEUKLSAgICBjYXNlIFRfQllURTogewotICAgICAgdWludDhfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7Ci0gICAgICBSRVRVUk5fTE9ORygoaW50OF90KWMpOwotICAgIH0KLSAgICBjYXNlIFRfSTE2OiB7Ci0gICAgICB1aW50MTZfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMik7Ci0gICAgICBSRVRVUk5fTE9ORygoaW50MTZfdCludG9ocyhjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9JMzI6IHsKLSAgICAgIHVpbnQzMl90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA0KTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQzMl90KW50b2hsKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX1U2NDoKLSAgICBjYXNlIFRfSTY0OiB7Ci0gICAgICB1aW50NjRfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgOCk7Ci0gICAgICBSRVRVUk5fTE9ORygoaW50NjRfdCludG9obGwoYykpOwotICAgIH0KLSAgICBjYXNlIFRfRE9VQkxFOiB7Ci0gICAgICB1bmlvbiB7Ci0gICAgICAgIHVpbnQ2NF90IGM7Ci0gICAgICAgIGRvdWJsZSBkOwotICAgICAgfSBhOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmKGEuYyksIDgpOwotICAgICAgYS5jID0gbnRvaGxsKGEuYyk7Ci0gICAgICBSRVRVUk5fRE9VQkxFKGEuZCk7Ci0gICAgfQotICAgIC8vY2FzZSBUX1VURjc6IC8vIGFsaWFzZXMgVF9TVFJJTkcKLSAgICBjYXNlIFRfVVRGODoKLSAgICBjYXNlIFRfVVRGMTY6Ci0gICAgY2FzZSBUX1NUUklORzogewotICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7Ci0gICAgICBpZiAoc2l6ZSkgewotICAgICAgICBjaGFyKiBzdHJidWYgPSAoY2hhciopIGVtYWxsb2Moc2l6ZSArIDEpOwotICAgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHN0cmJ1Ziwgc2l6ZSk7Ci0gICAgICAgIHN0cmJ1ZltzaXplXSA9ICdcMCc7Ci0gICAgICAgIFpWQUxfU1RSSU5HTChyZXR1cm5fdmFsdWUsIHN0cmJ1Ziwgc2l6ZSwgMCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBaVkFMX0VNUFRZX1NUUklORyhyZXR1cm5fdmFsdWUpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIFRfTUFQOiB7IC8vIGFycmF5IG9mIGtleSAtPiB2YWx1ZQotICAgICAgdWludDhfdCB0eXBlc1syXTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXModHlwZXMsIDIpOwotICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7Ci0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImtleSIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiBrZXlzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2YWwiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7Ci0gICAgICAgIHp2YWwgKnZhbHVlOwotICAgICAgICBNQUtFX1NURF9aVkFMKHZhbHVlKTsKLQotICAgICAgICB6dmFsKiBrZXk7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwoa2V5KTsKLQotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMF0sIHRyYW5zcG9ydCwga2V5LCBrZXlzcGVjKTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzFdLCB0cmFuc3BvcnQsIHZhbHVlLCB2YWxzcGVjKTsKLSAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgPT0gSVNfTE9ORykgewotICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9MVkFMX1Aoa2V5KSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyhrZXkpOwotICAgICAgICAgIHplbmRfaGFzaF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9TVFJWQUxfUChrZXkpLCBaX1NUUkxFTl9QKGtleSkgKyAxLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICB6dmFsX3B0cl9kdG9yKCZrZXkpOwotICAgICAgfQotICAgICAgcmV0dXJuOyAvLyByZXR1cm5fdmFsdWUgYWxyZWFkeSBwb3B1bGF0ZWQKLSAgICB9Ci0gICAgY2FzZSBUX0xJU1Q6IHsgLy8gYXJyYXkgd2l0aCBhdXRvZ2VuZXJhdGVkIG51bWVyaWMga2V5cwotICAgICAgaW50OF90IHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7Ci0gICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImVsZW0iLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgewotICAgICAgICB6dmFsICp2YWx1ZTsKLSAgICAgICAgTUFLRV9TVERfWlZBTCh2YWx1ZSk7Ci0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsIHZhbHVlLCBlbGVtc3BlYyk7Ci0gICAgICAgIHplbmRfaGFzaF9uZXh0X2luZGV4X2luc2VydChyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBUX1NFVDogeyAvLyBhcnJheSBvZiBrZXkgLT4gVFJVRQotICAgICAgdWludDhfdCB0eXBlOwotICAgICAgdWludDMyX3Qgc2l6ZTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnR5cGUsIDEpOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmc2l6ZSwgNCk7Ci0gICAgICBzaXplID0gbnRvaGwoc2l6ZSk7Ci0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKLQotICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgewotICAgICAgICB6dmFsKiBrZXk7Ci0gICAgICAgIHp2YWwqIHZhbHVlOwotICAgICAgICBNQUtFX1NURF9aVkFMKGtleSk7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwodmFsdWUpOwotICAgICAgICBaVkFMX1RSVUUodmFsdWUpOwotCi0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsIGtleSwgZWxlbXNwZWMpOwotCi0gICAgICAgIGlmIChaX1RZUEVfUChrZXkpID09IElTX0xPTkcpIHsKLSAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfTFZBTF9QKGtleSksICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmIChaX1RZUEVfUChrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoa2V5KTsKLSAgICAgICAgICB6ZW5kX2hhc2hfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfU1RSVkFMX1Aoa2V5KSwgWl9TVFJMRU5fUChrZXkpICsgMSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgenZhbF9wdHJfZHRvcigma2V5KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH07Ci0KLSAgY2hhciBlcnJidWZbMTI4XTsKLSAgc3ByaW50ZihlcnJidWYsICJVbmtub3duIHRocmlmdCB0eXBlSUQgJWQiLCB0aHJpZnRfdHlwZUlEKTsKLSAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKLX0KLQorc3RhdGljCiB2b2lkIHNraXBfZWxlbWVudChsb25nIHRocmlmdF90eXBlSUQsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQpIHsKICAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7CiAgICAgY2FzZSBUX1NUT1A6CkBAIC02MzIsNzQgKzUwNSw0NzIgQEAKICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKIH0KIAotdm9pZCBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoaW50OF90IGtleXR5cGUsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIGh0LCBIYXNoUG9zaXRpb24mIGh0X3Bvcykgeworc3RhdGljIGlubGluZQorYm9vbCB6dmFsX2lzX2Jvb2woenZhbCogdikgeworICByZXR1cm4gWl9UWVBFX1AodikgPT0gSVNfVFJVRSB8fCBaX1RZUEVfUCh2KSA9PSBJU19GQUxTRTsKK30KKworc3RhdGljCit2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogcmV0dXJuX3ZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgeworICBaVkFMX05VTEwocmV0dXJuX3ZhbHVlKTsKKworICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX1NUUlVDVDogeworICAgICAgenZhbCogdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJjbGFzcyIsIHNpemVvZigiY2xhc3MiKS0xKTsKKyAgICAgIGlmICh2YWxfcHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJubyBjbGFzcyB0eXBlIGluIHNwZWMiLCBJTlZBTElEX0RBVEEpOworICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7CisgICAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICB9CisKKyAgICAgIGNoYXIqIHN0cnVjdFR5cGUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOworICAgICAgLy8gQ3JlYXRlIGFuIG9iamVjdCBpbiBQSFAgdXNlcmxhbmQgYmFzZWQgb24gb3VyIHNwZWMKKyAgICAgIGNyZWF0ZU9iamVjdChzdHJ1Y3RUeXBlLCByZXR1cm5fdmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHJldHVybl92YWx1ZSkgPT0gSVNfTlVMTCkgeworICAgICAgICAvLyB1bmFibGUgdG8gY3JlYXRlIGNsYXNzIGVudHJ5CisgICAgICAgIHNraXBfZWxlbWVudChUX1NUUlVDVCwgdHJhbnNwb3J0KTsKKyAgICAgICAgUkVUVVJOX05VTEwoKTsKKyAgICAgIH0KKworICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIGZhbHNlKTsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB9CisgICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgc25wcmludGYoZXJyYnVmLCAxMjgsICJzcGVjIGZvciAlcyBpcyB3cm9uZyB0eXBlOiAlZFxuIiwgc3RydWN0VHlwZSwgWl9UWVBFX1Aoc3BlYykpOworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworICAgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgfQorICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgICAgcmV0dXJuOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBUX0JPT0w6IHsKKyAgICAgIHVpbnQ4X3QgYzsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOworICAgICAgUkVUVVJOX0JPT0woYyAhPSAwKTsKKyAgICB9CisgIC8vY2FzZSBUX0kwODogLy8gc2FtZSBudW1lcmljIHZhbHVlIGFzIFRfQllURQorICAgIGNhc2UgVF9CWVRFOiB7CisgICAgICB1aW50OF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQ4X3QpYyk7CisgICAgfQorICAgIGNhc2UgVF9JMTY6IHsKKyAgICAgIHVpbnQxNl90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAyKTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQxNl90KW50b2hzKGMpKTsKKyAgICB9CisgICAgY2FzZSBUX0kzMjogeworICAgICAgdWludDMyX3QgYzsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDQpOworICAgICAgUkVUVVJOX0xPTkcoKGludDMyX3QpbnRvaGwoYykpOworICAgIH0KKyAgICBjYXNlIFRfVTY0OgorICAgIGNhc2UgVF9JNjQ6IHsKKyAgICAgIHVpbnQ2NF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA4KTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQ2NF90KW50b2hsbChjKSk7CisgICAgfQorICAgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgYzsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICB9IGE7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCYoYS5jKSwgOCk7CisgICAgICBhLmMgPSBudG9obGwoYS5jKTsKKyAgICAgIFJFVFVSTl9ET1VCTEUoYS5kKTsKKyAgICB9CisgICAgLy9jYXNlIFRfVVRGNzogLy8gYWxpYXNlcyBUX1NUUklORworICAgIGNhc2UgVF9VVEY4OgorICAgIGNhc2UgVF9VVEYxNjoKKyAgICBjYXNlIFRfU1RSSU5HOiB7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIGlmIChzaXplKSB7CisgICAgICAgIGNoYXIgc3RyYnVmW3NpemUrMV07CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoc3RyYnVmLCBzaXplKTsKKyAgICAgICAgc3RyYnVmW3NpemVdID0gJ1wwJzsKKyAgICAgICAgWlZBTF9TVFJJTkdMKHJldHVybl92YWx1ZSwgc3RyYnVmLCBzaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFpWQUxfRU1QVFlfU1RSSU5HKHJldHVybl92YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVF9NQVA6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IHZhbHVlCisgICAgICB1aW50OF90IHR5cGVzWzJdOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyh0eXBlcywgMik7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKworICAgICAgenZhbCAqdmFsX3B0cjsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAia2V5Iiwgc2l6ZW9mKCJrZXkiKS0xKTsKKyAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhbCIsIHNpemVvZigidmFsIiktMSk7CisgICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwga2V5LCB2YWx1ZTsKKworICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMF0sIHRyYW5zcG9ydCwgJmtleSwga2V5c3BlYyk7CisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1sxXSwgdHJhbnNwb3J0LCAmdmFsdWUsIHZhbHNwZWMpOworICAgICAgICBpZiAoWl9UWVBFKGtleSkgPT0gSVNfTE9ORykgeworICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX0xWQUwoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoWl9UWVBFKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygma2V5KTsKKyAgICAgICAgICB6ZW5kX3N5bXRhYmxlX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgenZhbF9kdG9yKCZrZXkpOworICAgICAgfQorICAgICAgcmV0dXJuOyAvLyByZXR1cm5fdmFsdWUgYWxyZWFkeSBwb3B1bGF0ZWQKKyAgICB9CisgICAgY2FzZSBUX0xJU1Q6IHsgLy8gYXJyYXkgd2l0aCBhdXRvZ2VuZXJhdGVkIG51bWVyaWMga2V5cworICAgICAgaW50OF90IHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIHp2YWwgKnZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKyAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKKyAgICAgICAgenZhbCB2YWx1ZTsKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgJnZhbHVlLCBlbGVtc3BlYyk7CisgICAgICAgIHplbmRfaGFzaF9uZXh0X2luZGV4X2luc2VydChaX0FSUl9QKHJldHVybl92YWx1ZSksICZ2YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVF9TRVQ6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IFRSVUUKKyAgICAgIHVpbnQ4X3QgdHlwZTsKKyAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZ0eXBlLCAxKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnNpemUsIDQpOworICAgICAgc2l6ZSA9IG50b2hsKHNpemUpOworICAgICAgenZhbCAqdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7CisgICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOworCisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwga2V5LCB2YWx1ZTsKKyAgICAgICAgWlZBTF9UUlVFKCZ2YWx1ZSk7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgJmtleSwgZWxlbXNwZWMpOworCisgICAgICAgIGlmIChaX1RZUEUoa2V5KSA9PSBJU19MT05HKSB7CisgICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfTFZBTChrZXkpLCAmdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChaX1RZUEUoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKCZrZXkpOworICAgICAgICAgIHplbmRfc3ltdGFibGVfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9TVFIoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICB6dmFsX2R0b3IoJmtleSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9OworCisgIGNoYXIgZXJyYnVmWzEyOF07CisgIHNwcmludGYoZXJyYnVmLCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7CisgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Cit9CisKK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoaW50OF90IGtleXR5cGUsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIGh0LCBIYXNoUG9zaXRpb24mIGh0X3BvcywgSGFzaFRhYmxlKiBzcGVjKSB7CiAgIGJvb2wga2V5dHlwZV9pc19udW1lcmljID0gKCEoKGtleXR5cGUgPT0gVF9TVFJJTkcpIHx8IChrZXl0eXBlID09IFRfVVRGOCkgfHwgKGtleXR5cGUgPT0gVF9VVEYxNikpKTsKIAotICBjaGFyKiBrZXk7CisgIHplbmRfc3RyaW5nKiBrZXk7CiAgIHVpbnQga2V5X2xlbjsKICAgbG9uZyBpbmRleCA9IDA7CiAKLSAgenZhbCogejsKLSAgTUFLRV9TVERfWlZBTCh6KTsKKyAgenZhbCB6OwogCi0gIGludCByZXMgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfa2V5X2V4KGh0LCAma2V5LCAma2V5X2xlbiwgKHVsb25nKikmaW5kZXgsIDAsICZodF9wb3MpOwotICBpZiAoa2V5dHlwZV9pc19udW1lcmljKSB7Ci0gICAgaWYgKHJlcyA9PSBIQVNIX0tFWV9JU19TVFJJTkcpIHsKLSAgICAgIGluZGV4ID0gc3RydG9sKGtleSwgTlVMTCwgMTApOwotICAgIH0KLSAgICBaVkFMX0xPTkcoeiwgaW5kZXgpOworICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgKHplbmRfdWxvbmcqKSZpbmRleCwgJmh0X3Bvcyk7CisgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7CisgICAgWlZBTF9TVFJfQ09QWSgmeiwga2V5KTsKICAgfSBlbHNlIHsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKHJlcyA9PSBIQVNIX0tFWV9JU19TVFJJTkcpIHsKLSAgICAgIGtleV9sZW4gLT0gMTsgLy8gc2tpcCB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gICAgfSBlbHNlIHsKLSAgICAgIHNwcmludGYoYnVmLCAiJWxkIiwgaW5kZXgpOwotICAgICAga2V5ID0gYnVmOyBrZXlfbGVuID0gc3RybGVuKGJ1Zik7Ci0gICAgfQotICAgIFpWQUxfU1RSSU5HTCh6LCBrZXksIGtleV9sZW4sIDEpOworICAgIFpWQUxfTE9ORygmeiwgaW5kZXgpOwogICB9Ci0gIGJpbmFyeV9zZXJpYWxpemUoa2V5dHlwZSwgdHJhbnNwb3J0LCAmeiwgTlVMTCk7Ci0gIHp2YWxfcHRyX2R0b3IoJnopOworICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgJnosIHNwZWMpOworICB6dmFsX2R0b3IoJnopOwogfQogCi1pbmxpbmUgYm9vbCB0dHlwZV9pc19pbnQoaW50OF90IHQpIHsKK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKSB7CisgIGlmICh2YWx1ZSkgeworICAgIFpWQUxfREVSRUYodmFsdWUpOworICB9CisgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHR5cGVJRCAoYW5kIGZpZWxkIG51bSwgaWYgYXBwbGljYWJsZSkgc2hvdWxkJ3ZlIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgd3JpdGUgdGhlIHBheWxvYWQuCisgIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgeworICAgIGNhc2UgVF9TVE9QOgorICAgIGNhc2UgVF9WT0lEOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfT0JKRUNUKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1vYmplY3QgdHlwZSBhcyBhIFRfU1RSVUNUIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUCh2YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgICAgaWYgKHNwZWMgJiYgWl9UWVBFX1Aoc3BlYykgPT0gSVNfUkVGRVJFTkNFKSB7CisgICAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICB9CisgICAgICBpZiAoIXNwZWMgfHwgWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBiaW5hcnlfc2VyaWFsaXplX3NwZWModmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgICAgfSByZXR1cm47CisgICAgY2FzZSBUX0JPT0w6CisgICAgICBpZiAoIXp2YWxfaXNfYm9vbCh2YWx1ZSkpIGNvbnZlcnRfdG9fYm9vbGVhbih2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOChaX1RZUEVfSU5GT19QKHZhbHVlKSA9PSBJU19UUlVFID8gMSA6IDApOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9CWVRFOgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfSTE2OgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KFpfTFZBTF9QKHZhbHVlKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMihaX0xWQUxfUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9JNjQ6CisgICAgY2FzZSBUX1U2NDogeworICAgICAgaW50NjRfdCBsX2RhdGE7CisjaWYgZGVmaW5lZChfTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7CisgICAgICBsX2RhdGEgPSBaX0xWQUxfUCh2YWx1ZSk7CisjZWxzZQorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19ET1VCTEUpIGNvbnZlcnRfdG9fZG91YmxlKHZhbHVlKTsKKyAgICAgIGxfZGF0YSA9IChpbnQ2NF90KVpfRFZBTF9QKHZhbHVlKTsKKyNlbmRpZgorICAgICAgdHJhbnNwb3J0LndyaXRlSTY0KGxfZGF0YSk7CisgICAgfSByZXR1cm47CisgICAgY2FzZSBUX0RPVUJMRTogeworICAgICAgdW5pb24geworICAgICAgICBpbnQ2NF90IGM7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgfSBhOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19ET1VCTEUpIGNvbnZlcnRfdG9fZG91YmxlKHZhbHVlKTsKKyAgICAgIGEuZCA9IFpfRFZBTF9QKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChhLmMpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9VVEY4OgorICAgIGNhc2UgVF9VVEYxNjoKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZVN0cmluZyhaX1NUUlZBTF9QKHZhbHVlKSwgWl9TVFJMRU5fUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9NQVA6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkodmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9NQVApIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAia3R5cGUiLCBzaXplb2YoImt0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidnR5cGUiLCBzaXplb2YoInZ0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YWwiLCBzaXplb2YoInZhbCIpLTEpOworICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKyAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1AoemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImtleSIsIHNpemVvZigia2V5IiktMSkpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyLCBrZXlzcGVjKTsKKyAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOworICAgICAgfQorICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9MSVNUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTElTVCkiLCBJTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1AodmFsdWUpOworICAgICAgenZhbCogdmFsX3B0cjsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIHNpemVvZigiZXR5cGUiKS0xKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7CisgICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsKKyAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKKyAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOworICAgICAgfQorICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9TRVQ6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkodmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9TRVQpIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7CisgICAgICBIYXNoVGFibGUqIHNwZWMgPSBaX0FSUlZBTF9QKHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSkpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7CisgICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICAgIGlmKHR0eXBlX2lzX3NjYWxhcihrZXl0eXBlKSl7CisgICAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsKKyAgICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIsIHNwZWMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICAgIGJpbmFyeV9zZXJpYWxpemUoa2V5dHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCBzcGVjKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gcmV0dXJuOworICB9OworCisgIGNoYXIgZXJyYnVmWzEyOF07CisgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7CisgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Cit9CisKK3N0YXRpYwordm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsKiB0cmFuc3BvcnQsIHplbmRfc3RyaW5nKiBtZXRob2RfbmFtZSwgaW50MzJfdCBtc2d0eXBlLCBpbnQzMl90IHNlcUlEKSB7CisgIHp2YWwgYXJnc1szXTsKKyAgenZhbCByZXQ7CisgIHp2YWwgd3JpdGVNZXNzYWdlZm47CisKKyAgWlZBTF9TVFJfQ09QWSgmYXJnc1swXSwgbWV0aG9kX25hbWUpOworICBaVkFMX0xPTkcoJmFyZ3NbMV0sIG1zZ3R5cGUpOworICBaVkFMX0xPTkcoJmFyZ3NbMl0sIHNlcUlEKTsKKyAgWlZBTF9OVUxMKCZyZXQpOworICBaVkFMX1NUUklORygmd3JpdGVNZXNzYWdlZm4sICJ3cml0ZU1lc3NhZ2VCZWdpbiIpOworCisgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksIHRyYW5zcG9ydCwgJndyaXRlTWVzc2FnZWZuLCAmcmV0LCAzLCBhcmdzKTsKKworICB6dmFsX2R0b3IoJndyaXRlTWVzc2FnZWZuKTsKKyAgenZhbF9kdG9yKCZhcmdzWzJdKTsgenZhbF9kdG9yKCZhcmdzWzFdKTsgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgenZhbF9kdG9yKCZyZXQpOworICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIH0KK30KKworc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19pbnQoaW50OF90IHQpIHsKICAgcmV0dXJuICgodCA9PSBUX0JZVEUpIHx8ICgodCA+PSBUX0kxNikgICYmICh0IDw9IFRfSTY0KSkpOwogfQorc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19zY2FsYXIoaW50OF90IHQpIHsKKyAgcmV0dXJuICEoKHQgPT0gVF9TVFJVQ1QpIHx8ICggdD09IFRfTUFQKSAgfHwgKHQgPT0gVF9TRVQpIHx8ICh0ID09IFRfTElTVCkpOworfQogCi1pbmxpbmUgYm9vbCB0dHlwZXNfYXJlX2NvbXBhdGlibGUoaW50OF90IHQxLCBpbnQ4X3QgdDIpIHsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7CiAgIC8vIEludGVnZXIgdHlwZXMgb2YgZGlmZmVyZW50IHdpZHRocyBhcmUgY29uc2lkZXJlZCBjb21wYXRpYmxlOwogICAvLyBvdGhlcndpc2UgdGhlIHR5cGVJRCBtdXN0IG1hdGNoLgogICByZXR1cm4gKCh0MSA9PSB0MikgfHwgKHR0eXBlX2lzX2ludCh0MSkgJiYgdHR5cGVfaXNfaW50KHQyKSkpOwogfQogCisvL2lzIHVzZWQgdG8gdmFsaWRhdGUgb2JqZWN0cyBiZWZvcmUgc2VyaWFsaXphdGlvbiBhbmQgYWZ0ZXIgZGVzZXJpYWxpemF0aW9uLiBGb3Igbm93LCBvbmx5IHJlcXVpcmVkIGZpZWxkcyBhcmUgdmFsaWRhdGVkLgorc3RhdGljCit2b2lkIHZhbGlkYXRlX3RocmlmdF9vYmplY3QoenZhbCogb2JqZWN0KSB7CisgICAgemVuZF9jbGFzc19lbnRyeSogb2JqZWN0X2NsYXNzX2VudHJ5ID0gWl9PQkpDRV9QKG9iamVjdCk7CisgICAgenZhbCogaXNfdmFsaWRhdGUgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KG9iamVjdF9jbGFzc19lbnRyeSwgImlzVmFsaWRhdGUiLCBzaXplb2YoImlzVmFsaWRhdGUiKS0xLCB0cnVlKTsKKyAgICBpZiAoaXNfdmFsaWRhdGUpIHsKKyAgICAgIFpWQUxfREVSRUYoaXNfdmFsaWRhdGUpOworICAgIH0KKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShvYmplY3RfY2xhc3NfZW50cnksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgIH0KKyAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICB6dmFsKiB2YWxfcHRyOworCisgICAgaWYgKGlzX3ZhbGlkYXRlICYmIFpfVFlQRV9JTkZPX1AoaXNfdmFsaWRhdGUpID09IElTX1RSVUUpIHsKKyAgICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChaX0FSUlZBTF9QKHNwZWMpLCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoWl9BUlJWQUxfUChzcGVjKSwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KFpfQVJSVkFMX1Aoc3BlYyksICZrZXlfcHRyKSkgeworCisgICAgICAgICAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgICAgICAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChaX0FSUlZBTF9QKHNwZWMpLCBudWxscHRyLCAmZmllbGRubywgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICAgICAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJCYWQga2V5dHlwZSBpbiBUU1BFQyAoZXhwZWN0ZWQgJ2xvbmcnKSIsIElOVkFMSURfREFUQSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgICAgICAgLy8gZmllbGQgbmFtZQorICAgICAgICAgICAgenZhbCogenZhcm5hbWUgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICAgICAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHp2YXJuYW1lKTsKKworICAgICAgICAgICAgenZhbCogaXNfcmVxdWlyZWQgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiaXNSZXF1aXJlZCIsIHNpemVvZigiaXNSZXF1aXJlZCIpLTEpOworICAgICAgICAgICAgenZhbCBydjsKKyAgICAgICAgICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkob2JqZWN0X2NsYXNzX2VudHJ5LCBvYmplY3QsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgZmFsc2UsICZydik7CisKKyAgICAgICAgICAgIGlmIChaX1RZUEVfSU5GT19QKGlzX3JlcXVpcmVkKSA9PSBJU19UUlVFICYmIFpfVFlQRV9QKHByb3ApID09IElTX05VTEwpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOworICAgICAgICAgICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAiUmVxdWlyZWQgZmllbGQgJXMuJXMgaXMgdW5zZXQhIiwgWlNUUl9WQUwob2JqZWN0X2NsYXNzX2VudHJ5LT5uYW1lKSwgdmFybmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljCiB2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKICAgLy8gU0VUIGFuZCBMSVNUIGhhdmUgJ2VsZW0nID0+IGFycmF5KCd0eXBlJywgW29wdGlvbmFsXSAnY2xhc3MnKQogICAvLyBNQVAgaGFzICd2YWwnID0+IGFycmF5KCd0eXBlJywgW29wdGlvbmFdICdjbGFzcycpCi0gIFRTUk1MU19GRVRDSCgpOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZ2V0X2NsYXNzX2VudHJ5KHp0aGlzIFRTUk1MU19DQyk7CisgIHplbmRfY2xhc3NfZW50cnkqIGNlID0gWl9PQkpDRV9QKHp0aGlzKTsKICAgd2hpbGUgKHRydWUpIHsKLSAgICB6dmFsKiogdmFsX3B0ciA9IE5VTEw7Ci0KICAgICBpbnQ4X3QgdHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7Ci0gICAgaWYgKHR0eXBlID09IFRfU1RPUCkgcmV0dXJuOworICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgIHZhbGlkYXRlX3RocmlmdF9vYmplY3QoenRoaXMpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGludDE2X3QgZmllbGRubyA9IHRyYW5zcG9ydC5yZWFkSTE2KCk7Ci0gICAgaWYgKHplbmRfaGFzaF9pbmRleF9maW5kKHNwZWMsIGZpZWxkbm8sICh2b2lkKiopJnZhbF9wdHIpID09IFNVQ0NFU1MpIHsKLSAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7CisgICAgenZhbCogdmFsX3B0ciA9IHplbmRfaGFzaF9pbmRleF9maW5kKHNwZWMsIGZpZWxkbm8pOworICAgIGlmICh2YWxfcHRyICE9IG51bGxwdHIpIHsKKyAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKICAgICAgIC8vIHB1bGwgdGhlIGZpZWxkIG5hbWUKLSAgICAgIC8vIHplbmQgaGFzaCB0YWJsZXMgdXNlIHRoZSBudWxsIGF0IHRoZSBlbmQgaW4gdGhlIGxlbmd0aC4uLiBzbyBzdHJsZW4oaGFzaCBrZXkpICsgMS4KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhciIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YXIiLCBzaXplb2YoInZhciIpLTEpOworICAgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1AodmFsX3B0cik7CiAKICAgICAgIC8vIGFuZCB0aGUgdHlwZQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgaW50OF90IGV4cGVjdGVkX3R0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgaW50OF90IGV4cGVjdGVkX3R0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CiAKICAgICAgIGlmICh0dHlwZXNfYXJlX2NvbXBhdGlibGUodHR5cGUsIGV4cGVjdGVkX3R0eXBlKSkgewotICAgICAgICB6dmFsKiBydiA9IE5VTEw7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwocnYpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcnYsIGZpZWxkc3BlYyk7Ci0gICAgICAgIHplbmRfdXBkYXRlX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCBydiBUU1JNTFNfQ0MpOworICAgICAgICB6dmFsIHJ2OworICAgICAgICBaVkFMX1VOREVGKCZydik7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsICZydiwgZmllbGRzcGVjKTsKKyAgICAgICAgemVuZF91cGRhdGVfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksICZydik7CisKICAgICAgICAgenZhbF9wdHJfZHRvcigmcnYpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgc2tpcF9lbGVtZW50KHR0eXBlLCB0cmFuc3BvcnQpOwpAQCAtNzEwLDE2NCArOTgxLDQ0IEBACiAgIH0KIH0KIAotdm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCoqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgewotICAvLyBBdCB0aGlzIHBvaW50IHRoZSB0eXBlSUQgKGFuZCBmaWVsZCBudW0sIGlmIGFwcGxpY2FibGUpIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHdyaXRlIHRoZSBwYXlsb2FkLgotICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKLSAgICBjYXNlIFRfU1RPUDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX09CSkVDVCkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tb2JqZWN0IHR5cGUgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeSgqdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBiaW5hcnlfc2VyaWFsaXplX3NwZWMoKnZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9CT09MOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQk9PTCkgY29udmVydF90b19ib29sZWFuKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChaX0JWQUxfUFAodmFsdWUpID8gMSA6IDApOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9CWVRFOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTE2OgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMTYoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0kzMjoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JNjQ6Ci0gICAgY2FzZSBUX1U2NDoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTY0KFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgaW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGEuZCA9IFpfRFZBTF9QUCh2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKLSAgICB9IHJldHVybjsKLSAgICAvL2Nhc2UgVF9VVEY3OgotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlU3RyaW5nKFpfU1RSVkFMX1BQKHZhbHVlKSwgWl9TVFJMRU5fUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfTUFQOiB7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSgqdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUFAodmFsdWUpOwotICAgICAgenZhbCoqIHZhbF9wdHI7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0cik7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfTElTVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QUCh2YWx1ZSk7Ci0gICAgICB6dmFsKiogdmFsX3B0cjsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplKHZhbHR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgdmFsc3BlYyk7Ci0gICAgICB9Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX1NFVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX1NFVCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1BQKHZhbHVlKTsKLSAgICAgIHp2YWwqKiB2YWxfcHRyOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7Ci0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7Ci0gICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICB9OwotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCi0KK3N0YXRpYwogdm9pZCBiaW5hcnlfc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKKworICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKwogICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgenZhbCoqIHZhbF9wdHI7CisgIHp2YWwqIHZhbF9wdHI7CiAKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9nZXRfY2xhc3NfZW50cnkoenRoaXMgVFNSTUxTX0NDKTsKKyAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChzcGVjLCAma2V5X3B0cik7CisgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChzcGVjLCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChzcGVjLCAma2V5X3B0cikpIHsKIAotICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KHNwZWMsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoc3BlYywgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoc3BlYywgJmtleV9wdHIpKSB7Ci0gICAgdWxvbmcgZmllbGRubzsKLSAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChzcGVjLCBOVUxMLCBOVUxMLCAmZmllbGRubywgMCwgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoc3BlYywgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CiAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkJhZCBrZXl0eXBlIGluIFRTUEVDIChleHBlY3RlZCAnbG9uZycpIiwgSU5WQUxJRF9EQVRBKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgSGFzaFRhYmxlKiBmaWVsZHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKKyAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAKICAgICAvLyBmaWVsZCBuYW1lCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKIAogICAgIC8vIHRocmlmdCB0eXBlCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7CisgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKIAotICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlIFRTUk1MU19DQyk7CisgICAgenZhbCBydjsKKyAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KFpfT0JKQ0VfUCh6dGhpcyksIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgaWYgKFpfVFlQRV9QKHByb3ApID09IElTX1JFRkVSRU5DRSl7CisgICAgICBaVkFMX1VOUkVGKHByb3ApOworICAgIH0KICAgICBpZiAoWl9UWVBFX1AocHJvcCkgIT0gSVNfTlVMTCkgewogICAgICAgdHJhbnNwb3J0LndyaXRlSTgodHR5cGUpOwogICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KGZpZWxkbm8pOwotICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcHJvcCwgZmllbGRzcGVjKTsKKyAgICAgIGJpbmFyeV9zZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcHJvcCwgZmllbGRzcGVjKTsKICAgICB9CiAgIH0KICAgdHJhbnNwb3J0LndyaXRlSTgoVF9TVE9QKTsgLy8gc3RydWN0IGVuZApAQCAtODc1LDYzICsxMDI2LDM4IEBACiAKIC8vIDYgcGFyYW1zOiAkdHJhbnNwb3J0ICRtZXRob2RfbmFtZSAkdHR5cGUgJHJlcXVlc3Rfc3RydWN0ICRzZXFJRCAkc3RyaWN0X3dyaXRlCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKLSAgaWYgKGFyZ2MgPCA2KSB7Ci0gICAgV1JPTkdfUEFSQU1fQ09VTlQ7CisgIHp2YWwgKnByb3RvY29sOworICB6dmFsICpyZXF1ZXN0X3N0cnVjdDsKKyAgemVuZF9zdHJpbmcgKm1ldGhvZF9uYW1lOworICBsb25nIG1zZ3R5cGUsIHNlcUlEOworICB6ZW5kX2Jvb2wgc3RyaWN0X3dyaXRlOworCisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnNfZXgoWkVORF9QQVJTRV9QQVJBTVNfUVVJRVQsIFpFTkRfTlVNX0FSR1MoKSwgIm9TbG9sYiIsCisgICAgJnByb3RvY29sLCAmbWV0aG9kX25hbWUsICZtc2d0eXBlLAorICAgICZyZXF1ZXN0X3N0cnVjdCwgJnNlcUlELCAmc3RyaWN0X3dyaXRlKSA9PSBGQUlMVVJFKSB7CisgICAgICByZXR1cm47CiAgIH0KIAotICB6dmFsICoqKmFyZ3MgPSAoenZhbCoqKikgZW1hbGxvYyhhcmdjICogc2l6ZW9mKHp2YWwqKikpOwotICB6ZW5kX2dldF9wYXJhbWV0ZXJzX2FycmF5X2V4KGFyZ2MsIGFyZ3MpOwotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1swXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjFzdCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAodHJhbnNwb3J0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMV0pICE9IElTX1NUUklORykgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIybmQgcGFyYW1ldGVyIGlzIG5vdCBhIHN0cmluZyAobWV0aG9kIG5hbWUpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1szXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjR0aCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAocmVxdWVzdCBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIFBIUE91dHB1dFRyYW5zcG9ydCB0cmFuc3BvcnQoKmFyZ3NbMF0pOwotICBjb25zdCBjaGFyKiBtZXRob2RfbmFtZSA9IFpfU1RSVkFMX1BQKGFyZ3NbMV0pOwotICBjb252ZXJ0X3RvX2xvbmcoKmFyZ3NbMl0pOwotICBpbnQzMl90IG1zZ3R5cGUgPSBaX0xWQUxfUFAoYXJnc1syXSk7Ci0gIHp2YWwqIHJlcXVlc3Rfc3RydWN0ID0gKmFyZ3NbM107Ci0gIGNvbnZlcnRfdG9fbG9uZygqYXJnc1s0XSk7Ci0gIGludDMyX3Qgc2VxSUQgPSBaX0xWQUxfUFAoYXJnc1s0XSk7Ci0gIGNvbnZlcnRfdG9fYm9vbGVhbigqYXJnc1s1XSk7Ci0gIGJvb2wgc3RyaWN0V3JpdGUgPSBaX0JWQUxfUFAoYXJnc1s1XSk7Ci0gIGVmcmVlKGFyZ3MpOwotICBhcmdzID0gTlVMTDsKLQogICB0cnkgewotICAgIGlmIChzdHJpY3RXcml0ZSkgewotICAgICAgaW50MzJfdCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbXNndHlwZTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih2ZXJzaW9uKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZVN0cmluZyhtZXRob2RfbmFtZSwgc3RybGVuKG1ldGhvZF9uYW1lKSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoc2VxSUQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVTdHJpbmcobWV0aG9kX25hbWUsIHN0cmxlbihtZXRob2RfbmFtZSkpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgobXNndHlwZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoc2VxSUQpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXF1ZXN0X3N0cnVjdCksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOwogICAgIH0KIAotICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJlcXVlc3Rfc3RydWN0IFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOwogICAgIH0KKworICAgIFBIUE91dHB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wpOworICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgKGludDMyX3QpIG1zZ3R5cGUsIChpbnQzMl90KSBzZXFJRCk7CiAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHJlcXVlc3Rfc3RydWN0LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gdGFrZSBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKICAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwpAQCAtOTM5LDM3ICsxMDY1LDIwIEBACiAgIH0KIH0KIAotLy8gMyBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZAorCisvLyA0IHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkICRidWZmZXJfc2l6ZQogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKIAotICBpZiAoYXJnYyA8IDMpIHsKLSAgICBXUk9OR19QQVJBTV9DT1VOVDsKKyAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksICJvU2J8bCIsICZwcm90b2NvbCwgJm9ial90eXBlbmFtZSwgJnN0cmljdF9yZWFkLCAmYnVmZmVyX3NpemUpID09IEZBSUxVUkUpIHsKKyAgICByZXR1cm47CiAgIH0KIAotICB6dmFsICoqKmFyZ3MgPSAoenZhbCoqKikgZW1hbGxvYyhhcmdjICogc2l6ZW9mKHp2YWwqKikpOwotICB6ZW5kX2dldF9wYXJhbWV0ZXJzX2FycmF5X2V4KGFyZ2MsIGFyZ3MpOwotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1swXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjFzdCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAodHJhbnNwb3J0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMV0pICE9IElTX1NUUklORykgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIybmQgcGFyYW1ldGVyIGlzIG5vdCBhIHN0cmluZyAodHlwZW5hbWUgb2YgZXhwZWN0ZWQgcmVzcG9uc2Ugc3RydWN0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBQSFBJbnB1dFRyYW5zcG9ydCB0cmFuc3BvcnQoKmFyZ3NbMF0pOwotICBjaGFyKiBvYmpfdHlwZW5hbWUgPSBaX1NUUlZBTF9QUChhcmdzWzFdKTsKLSAgY29udmVydF90b19ib29sZWFuKCphcmdzWzJdKTsKLSAgYm9vbCBzdHJpY3RfcmVhZCA9IFpfQlZBTF9QUChhcmdzWzJdKTsKLSAgZWZyZWUoYXJncyk7Ci0gIGFyZ3MgPSBOVUxMOwotCiAgIHRyeSB7CisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CiAgICAgaW50OF90IG1lc3NhZ2VUeXBlID0gMDsKICAgICBpbnQzMl90IHN6ID0gdHJhbnNwb3J0LnJlYWRJMzIoKTsKIApAQCAtOTk1LDE5ICsxMTA0LDM0IEBACiAgICAgfQogCiAgICAgaWYgKG1lc3NhZ2VUeXBlID09IFRfRVhDRVBUSU9OKSB7Ci0gICAgICB6dmFsKiBleDsKLSAgICAgIE1BS0VfU1REX1pWQUwoZXgpOwotICAgICAgY3JlYXRlT2JqZWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iLCBleCk7Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShleCBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKGV4LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB6dmFsIGV4OworICAgICAgY3JlYXRlT2JqZWN0KCJcXFRocmlmdFxcRXhjZXB0aW9uXFxUQXBwbGljYXRpb25FeGNlcHRpb24iLCAmZXgpOworICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRShleCksICJfVFNQRUMiLCBzaXplb2YoIl9UUFNFQyIpLTEsIGZhbHNlKTsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB9CisgICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYygmZXgsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKCZleCk7CiAgICAgfQogCi0gICAgY3JlYXRlT2JqZWN0KG9ial90eXBlbmFtZSwgcmV0dXJuX3ZhbHVlKTsKLSAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7CisgICAgY3JlYXRlT2JqZWN0KFpTVFJfVkFMKG9ial90eXBlbmFtZSksIHJldHVybl92YWx1ZSk7CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgIH0KKyAgICBpZiAoIXNwZWMgfHwgWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCBkZXNlcmlhbGl6ZSB0byBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgfQogICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKICAgfSBjYXRjaCAoY29uc3QgUEhQRXhjZXB0aW9uV3JhcHBlciYgZXgpIHsKLSAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QoZXggVFNSTUxTX0NDKTsKKyAgICAvLyBleCB3aWxsIGJlIGRlc3RydWN0ZWQsIHNvIGNvcHkgdG8gYSB6dmFsIHRoYXQgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0IGNhbiBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgenZhbF9kdG9yKHJldHVybl92YWx1ZSk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKICAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwpAQCAtMTAxNSwzICsxMTM5LDM0IEBACiAgIH0KIH0KIAorLy8gNCBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZCAkYnVmZmVyX3NpemUKK1BIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbikgeworICB6dmFsICpwcm90b2NvbDsKKyAgemVuZF9zdHJpbmcgKm9ial90eXBlbmFtZTsKKyAgemVuZF9ib29sIHN0cmljdF9yZWFkOworICBzaXplX3QgYnVmZmVyX3NpemUgPSA4MTkyOworCisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnMoWkVORF9OVU1fQVJHUygpLCAib1NifGwiLCAmcHJvdG9jb2wsICZvYmpfdHlwZW5hbWUsICZzdHJpY3RfcmVhZCwgJmJ1ZmZlcl9zaXplKSA9PSBGQUlMVVJFKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdHJ5IHsKKyAgICBQSFBJbnB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wsIGJ1ZmZlcl9zaXplKTsKKworICAgIGNyZWF0ZU9iamVjdChaU1RSX1ZBTChvYmpfdHlwZW5hbWUpLCByZXR1cm5fdmFsdWUpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCBmYWxzZSk7CisgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gdGFrZSBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKKyAgICBSRVRVUk5fTlVMTCgpOworICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKKyAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOworICAgIFJFVFVSTl9OVUxMKCk7CisgIH0KK30KKworI2VuZGlmIC8qIFBIUF9WRVJTSU9OX0lEID49IDcwMDAwICovCmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaCBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oCmluZGV4IDQ0ZDAzY2MuLjA0MjA5OTcgMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oCisrKyBiL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oCkBAIC0yMSw2ICsyMSw3IEBACiAKIFBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KTsKIFBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkpOworUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luKTsKIAogZXh0ZXJuIHplbmRfbW9kdWxlX2VudHJ5IHRocmlmdF9wcm90b2NvbF9tb2R1bGVfZW50cnk7CiAjZGVmaW5lIHBocGV4dF90aHJpZnRfcHJvdG9jb2xfcHRyICZ0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwIGIvbGliL3BocC9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiYmJmOS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLWluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwJzsKLQotLyoqCi0gKiBCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KLSAqCi0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7Ci0KLSAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKLSAgY29uc3QgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKLQotICBwcm90ZWN0ZWQgJHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gIHByb3RlY3RlZCAkc3RyaWN0V3JpdGVfID0gdHJ1ZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZD1mYWxzZSwgJHN0cmljdFdyaXRlPXRydWUpIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7Ci0gICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7Ci0gICAgJHRoaXMtPnN0cmljdFdyaXRlXyA9ICRzdHJpY3RXcml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkgewotICAgIGlmICgkdGhpcy0+c3RyaWN0V3JpdGVfKSB7Ci0gICAgICAkdmVyc2lvbiA9IHNlbGY6OlZFUlNJT05fMSB8ICR0eXBlOwotICAgICAgcmV0dXJuCi0gICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKwotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybgotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGZpZWxkVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTE2KCRmaWVsZElkKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRrZXlUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUgPyAxIDogMCk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ24nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAyKTsKLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ04nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA0KTsKLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpIHsKLSAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAotICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKLSAgICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0Ci0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7Ci0gICAgICAkbmVnID0gJHZhbHVlIDwgMDsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJHZhbHVlICo9IC0xOwotICAgICAgfQotCi0gICAgICAkaGkgPSAoaW50KSgkdmFsdWUgLyA0Mjk0OTY3Mjk2KTsKLSAgICAgICRsbyA9IChpbnQpJHZhbHVlOwotCi0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkaGkgPSB+JGhpOwotICAgICAgICAkbG8gPSB+JGxvOwotICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgICAkaGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAkaGkgPSAkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAkdmFsdWUgJiAweEZGRkZGRkZGOwotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLSAgICB9Ci0KLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgOCk7Ci0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpIHsKLSAgICAkbGVuID0gc3RybGVuKCR2YWx1ZSk7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZUkzMigkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKLSAgICB9Ci0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJHN6KTsKLSAgICBpZiAoJHN6IDwgMCkgewotICAgICAgJHZlcnNpb24gPSAoaW50KSAoJHN6ICYgc2VsZjo6VkVSU0lPTl9NQVNLKTsKLSAgICAgIGlmICgkdmVyc2lvbiAhPSAoaW50KSBzZWxmOjpWRVJTSU9OXzEpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kc3osIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOwotICAgICAgfQotICAgICAgJHR5cGUgPSAkc3ogJiAweDAwMDAwMGZmOwotICAgICAgJHJlc3VsdCArPQotICAgICAgICAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSkgKwotICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoJHRoaXMtPnN0cmljdFJlYWRfKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0Ci0gICAgICAgICRuYW1lID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkc3opOwotICAgICAgICAkcmVzdWx0ICs9Ci0gICAgICAgICAgJHN6ICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKSB7Ci0gICAgJG5hbWUgPSAnJzsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7Ci0gICAgaWYgKCRmaWVsZFR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICRmaWVsZElkID0gMDsKLSAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZElkKTsKLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgka2V5VHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEkzMigkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdID09IDE7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDIpOwotICAgICRhcnIgPSB1bnBhY2soJ24nLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICBpZiAoJHZhbHVlID4gMHg3ZmZmKSB7Ci0gICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZik7Ci0gICAgfQotICAgIHJldHVybiAyOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg0KTsKLSAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgfQotICAgIHJldHVybiA0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKLQotICAgICRhcnIgPSB1bnBhY2soJ04yJywgJGRhdGEpOwotCi0gICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKLSAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCi0gICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAotICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gNCkgewotCi0gICAgICAkaGkgPSAkYXJyWzFdOwotICAgICAgJGxvID0gJGFyclsyXTsKLSAgICAgICRpc05lZyA9ICRoaSAgPCAwOwotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRpc05lZykgewotICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOwotICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gcGUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpZ2ggc2lnbgotICAgICAgLy8gZXhwbGljaXRseSBiZWxvdwotCi0gICAgICBpZiAoJGhpICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRoaSAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRsbyArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICAkdmFsdWUgPSAkaGkgKiA0Mjk0OTY3Mjk2ICsgJGxvOwotCi0gICAgICBpZiAoJGlzTmVnKSB7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0Ci0gICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gJiAweGZmZmZmZmZmOwotICAgICAgfQotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICR2YWx1ZSA9ICRhcnJbMV0qNDI5NDk2NzI5NiArICRhcnJbMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7Ci0gICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgJHZhbHVlID0gJyc7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotfQotCi0vKioKLSAqIEJpbmFyeSBQcm90b2NvbCBGYWN0b3J5Ci0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5IHsKLSAgcHJpdmF0ZSAkc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgcHJpdmF0ZSAkc3RyaWN0V3JpdGVfID0gZmFsc2U7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJpY3RSZWFkPWZhbHNlLCAkc3RyaWN0V3JpdGU9ZmFsc2UpIHsKLSAgICAkdGhpcy0+c3RyaWN0UmVhZF8gPSAkc3RyaWN0UmVhZDsKLSAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykgewotICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFucywgJHRoaXMtPnN0cmljdFJlYWQsICR0aGlzLT5zdHJpY3RXcml0ZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBBY2NlbGVyYXRlZCBiaW5hcnkgcHJvdG9jb2w6IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdGhyaWZ0X3Byb3RvY29sCi0gKiBleHRlbnNpb24gZm9yIGZhc3RlciBkZXNlcmlhbGl6YXRpb24KLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgZXh0ZW5kcyBUQmluYXJ5UHJvdG9jb2wgewotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZD1mYWxzZSwgJHN0cmljdFdyaXRlPXRydWUpIHsKLSAgICAvLyBJZiB0aGUgdHJhbnNwb3J0IGRvZXNuJ3QgaW1wbGVtZW50IHB1dEJhY2ssIHdyYXAgaXQgaW4gYQotICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCAod2hpY2ggZG9lcykKLSAgICBpZiAoIW1ldGhvZF9leGlzdHMoJHRyYW5zLCAncHV0QmFjaycpKSB7Ci0gICAgICAkdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCR0cmFucyk7Ci0gICAgfQotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZCwgJHN0cmljdFdyaXRlKTsKLSAgfQotICBwdWJsaWMgZnVuY3Rpb24gaXNTdHJpY3RSZWFkKCkgewotICAgIHJldHVybiAkdGhpcy0+c3RyaWN0UmVhZF87Ci0gIH0KLSAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0V3JpdGUoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5zdHJpY3RXcml0ZV87Ci0gIH0KLX0KLQotPz4KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5waHAgYi9saWIvcGhwL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZmNDFhLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotCi0vKioKLSAqIFByb3RvY29sIG1vZHVsZS4gQ29udGFpbnMgYWxsIHRoZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAotICogYSBwcm90b2NvbCBlbmNvZGVyL2RlY29kZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotLyoqCi0gKiBQcm90b2NvbCBleGNlcHRpb25zCi0gKi8KLWNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gewotICBjb25zdCBVTktOT1dOID0gMDsKLSAgY29uc3QgSU5WQUxJRF9EQVRBID0gMTsKLSAgY29uc3QgTkVHQVRJVkVfU0laRSA9IDI7Ci0gIGNvbnN0IFNJWkVfTElNSVQgPSAzOwotICBjb25zdCBCQURfVkVSU0lPTiA9IDQ7Ci0KLSAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2U9bnVsbCwgJGNvZGU9MCkgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKLSAgfQotfQotCi0vKioKLSAqIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgotICovCi1hYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wgewotICAvLyBUaGUgYmVsb3cgbWF5IHNlZW0gc2lsbHksIGJ1dCBpdCBpcyB0byBnZXQgYXJvdW5kIHRoZSBwcm9ibGVtIHRoYXQgdGhlCi0gIC8vICJpbnN0YW5jZW9mIiBvcGVyYXRvciBjYW4gb25seSB0YWtlIGluIGEgVF9WQVJJQUJMRSBhbmQgbm90IGEgVF9TVFJJTkcKLSAgLy8gb3IgVF9DT05TVEFOVF9FTkNBUFNFRF9TVFJJTkcuIFVzaW5nICJpc19hKCkiIGluc3RlYWQgb2YgImluc3RhbmNlb2YiIGlzCi0gIC8vIGEgd29ya2Fyb3VuZCBidXQgaXMgZGVwcmVjYXRlZCBpbiBQSFA1LiBUaGlzIGlzIHVzZWQgaW4gdGhlIGdlbmVyYXRlZAotICAvLyBkZXNlcmlhbGl6YXRpb24gY29kZS4KLSAgc3RhdGljICRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRCA9ICdUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCc7Ci0KLSAgLyoqCi0gICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc187Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKSB7Ci0gICAgJHRoaXMtPnRyYW5zXyA9ICR0cmFuczsKLSAgfQotCi0gIC8qKgotICAgKiBBY2Nlc3NvciBmb3IgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnRyYW5zXzsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQotICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpOwotCi0gIC8qKgotICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICoKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIC8qCi0gICAqIFN0YXJ0cyBhIGZpZWxkLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCi0gICAqIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKLSAgICogQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1Yik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCi0gICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKTsKLQotICAvKioKLSAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNYXBFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTGlzdEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFNldEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEkzMigmJGkzMik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cik7Ci0KLSAgLyoqCi0gICAqIFRoZSBza2lwIGZ1bmN0aW9uIGlzIGEgdXRpbGl0eSB0byBwYXJzZSBvdmVyIHVucmVjb2duaXplZCBkYXRlIHdpdGhvdXQKLSAgICogY2F1c2luZyBjb3JydXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gVFR5cGUgJHR5cGUgV2hhdCB0eXBlIGlzIGl0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2tpcCgkdHlwZSkgewotICAgIHN3aXRjaCAoJHR5cGUpIHsKLSAgICBjYXNlIFRUeXBlOjpCT09MOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQm9vbCgkYm9vbCk7Ci0gICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJ5dGUoJGJ5dGUpOwotICAgIGNhc2UgVFR5cGU6OkkxNjoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkxNigkaTE2KTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMzIoJGkzMik7Ci0gICAgY2FzZSBUVHlwZTo6STY0OgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTY0KCRpNjQpOwotICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZERvdWJsZSgkZHViKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRTdHJpbmcoJHN0cik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmdHlwZSwgJGZpZCk7Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRFbmQoKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkdmFsVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZE1hcEVuZCgpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU2V0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTGlzdEVuZCgpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFV0aWxpdHkgZm9yIHNraXBwaW5nIGJpbmFyeSBkYXRhCi0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICRpdHJhbnMgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHBhcmFtIGludCAgICAgICAgJHR5cGUgICBGaWVsZCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXBCaW5hcnkoJGl0cmFucywgJHR5cGUpIHsKLSAgICBzd2l0Y2ggKCR0eXBlKSB7Ci0gICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIGNhc2UgVFR5cGU6OkJZVEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICBjYXNlIFRUeXBlOjpJMTY6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpET1VCTEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICAkbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7Ci0gICAgICAkbGVuID0gJGxlblsxXTsKLSAgICAgIGlmICgkbGVuID4gMHg3ZmZmZmZmZikgewotICAgICAgICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gNCArICRpdHJhbnMtPnJlYWRBbGwoJGxlbik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gMDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAkZnR5cGUgPSAwOwotICAgICAgICAgICRmaWQgPSAwOwotICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAgICRmdHlwZSA9ICRhcnJbMV07Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIEkxNiBmaWVsZCBpZAotICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICB7Ci0gICAgICAgIC8vIEt0eXBlCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgJGt0eXBlID0gJGFyclsxXTsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDY7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRrdHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6U0VUOgotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDU7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwotICovCi1pbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeSB7Ci0gIC8qKgotICAgKiBCdWlsZCBhIHByb3RvY29sIGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVFByb3Rjb2wgcHJvdG9jb2wKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpOwotfQotCi0KLT8+CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmFlNzY3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogQnVmZmVyZWQgdHJhbnNwb3J0LiBTdG9yZXMgZGF0YSB0byBhbiBpbnRlcm5hbCBidWZmZXIgdGhhdCBpdCBkb2Vzbid0Ci0gKiBhY3R1YWxseSB3cml0ZSBvdXQgdW50aWwgZmx1c2ggaXMgY2FsbGVkLiBGb3IgcmVhZGluZywgd2UgZG8gYSBncmVlZHkKLSAqIHJlYWQgYW5kIHRoZW4gc2VydmUgZGF0YSBvdXQgb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIGJ1ZmZlcmVkIHRyYW5zcG9ydCBhcm91bmQgYW4gdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0PW51bGwsICRyQnVmU2l6ZT01MTIsICR3QnVmU2l6ZT01MTIpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPnJCdWZTaXplXyA9ICRyQnVmU2l6ZTsKLSAgICAkdGhpcy0+d0J1ZlNpemVfID0gJHdCdWZTaXplOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnQKLSAgICovCi0gIHByb3RlY3RlZCAkdHJhbnNwb3J0XyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSByZWNlaXZlIGJ1ZmZlciBzaXplCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHJCdWZTaXplXyA9IDUxMjsKLQotICAvKioKLSAgICogVGhlIHdyaXRlIGJ1ZmZlciBzaXplCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHdCdWZTaXplXyA9IDUxMjsKLQotICAvKioKLSAgICogVGhlIHdyaXRlIGJ1ZmZlci4KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkd0J1Zl8gPSAnJzsKLQotICAvKioKLSAgICogVGhlIHJlYWQgYnVmZmVyLgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRyQnVmXyA9ICcnOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkgewotICAgIGlmIChzdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSByZWFzb24gdGhhdCB3ZSBjdXN0b21pemUgcmVhZEFsbCBoZXJlIGlzIHRoYXQgdGhlIG1ham9yaXR5IG9mIFBIUAotICAgKiBzdHJlYW1zIGFyZSBhbHJlYWR5IGludGVybmFsbHkgYnVmZmVyZWQgYnkgUEhQLiBUaGUgc29ja2V0IHN0cmVhbSwgZm9yCi0gICAqIGV4YW1wbGUsIGJ1ZmZlcnMgaW50ZXJuYWxseSBhbmQgYmxvY2tzIGlmIHlvdSBjYWxsIHJlYWQgd2l0aCAkbGVuIGdyZWF0ZXIKLSAgICogdGhhbiB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLCB1bmxpa2UgcmVjdigpIGluIEMuCi0gICAqCi0gICAqIFRoZXJlZm9yZSwgdXNlIHRoZSByZWFkQWxsIG1ldGhvZCBvZiB0aGUgd3JhcHBlZCB0cmFuc3BvcnQgaW5zaWRlCi0gICAqIHRoZSBidWZmZXJlZCByZWFkQWxsLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikgewotICAgICRoYXZlID0gc3RybGVuKCR0aGlzLT5yQnVmXyk7Ci0gICAgaWYgKCRoYXZlID09IDApIHsKLSAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIGlmICgkaGF2ZSA8ICRsZW4pIHsKLSAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gJyc7Ci0gICAgICAkZGF0YSAuPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuIC0gJGhhdmUpOwotICAgIH0gZWxzZSBpZiAoJGhhdmUgPT0gJGxlbikgewotICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKLSAgICB9IGVsc2UgaWYgKCRoYXZlID4gJGxlbikgewotICAgICAgJGRhdGEgPSBzdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKLSAgICAgICR0aGlzLT5yQnVmXyA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOwotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgaWYgKHN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkdGhpcy0+ckJ1ZlNpemVfKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgewotICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfQotCi0gICAgJHJldCA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOwotICAgICR0aGlzLT5yQnVmXyA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOwotICAgIHJldHVybiAkcmV0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHsKLSAgICAkdGhpcy0+d0J1Zl8gLj0gJGJ1ZjsKLSAgICBpZiAoc3RybGVuKCR0aGlzLT53QnVmXykgPj0gJHRoaXMtPndCdWZTaXplXykgewotICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKLQotICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKLSAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICBpZiAoc3RybGVuKCR0aGlzLT53QnVmXykgPiAwKSB7Ci0gICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJHRoaXMtPndCdWZfKTsKLSAgICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgIH0KLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19Ci0KLT8+CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTczOTIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogRnJhbWVkIHRyYW5zcG9ydC4gV3JpdGVzIGFuZCByZWFkcyBkYXRhIGluIGNodW5rcyB0aGF0IGFyZSBzdGFtcGVkIHdpdGgKLSAqIHRoZWlyIGxlbmd0aC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogVW5kZXJseWluZyB0cmFuc3BvcnQgb2JqZWN0LgotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnQKLSAgICovCi0gIHByaXZhdGUgJHRyYW5zcG9ydF87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgcmVhZCBkYXRhLgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJpdmF0ZSAkckJ1Zl87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgcXVldWVkIG91dHB1dCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICR3QnVmXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byBmcmFtZSByZWFkcwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHJlYWRfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGZyYW1lIHdyaXRlcwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHdyaXRlXzsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQgVW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0PW51bGwsICRyZWFkPXRydWUsICR3cml0ZT10cnVlKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OwotICAgICR0aGlzLT5yZWFkXyA9ICRyZWFkOwotICAgICR0aGlzLT53cml0ZV8gPSAkd3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGZyb20gdGhlIGJ1ZmZlci4gV2hlbiBtb3JlIGRhdGEgaXMgcmVxdWlyZWQgcmVhZHMgYW5vdGhlciBlbnRpcmUKLSAgICogY2h1bmsgYW5kIHNlcnZlcyBmdXR1cmUgcmVhZHMgb3V0IG9mIHRoYXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgaWYgKCEkdGhpcy0+cmVhZF8pIHsKLSAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkbGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yZWFkRnJhbWUoKTsKLSAgICB9Ci0KLSAgICAvLyBKdXN0IHJldHVybiBmdWxsIGJ1ZmYKLSAgICBpZiAoJGxlbiA+PSBzdHJsZW4oJHRoaXMtPnJCdWZfKSkgewotICAgICAgJG91dCA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9IG51bGw7Ci0gICAgICByZXR1cm4gJG91dDsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gc3Vic3RyCi0gICAgJG91dCA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOwotICAgICR0aGlzLT5yQnVmXyA9IHN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOwotICAgIHJldHVybiAkb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGRhdGEgdG8gcmV0dXJuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkgewotICAgIGlmIChzdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gcmVhZEZyYW1lKCkgewotICAgICRidWYgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCg0KTsKLSAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7Ci0gICAgJHN6ID0gJHZhbFsxXTsKLQotICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRzeik7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSB0byB0aGUgcGVuZGluZyBvdXRwdXQgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKLSAgICogQHBhcmFtIGludCAgICAkbGVuIExpbWl0IG9mIGJ5dGVzIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbj1udWxsKSB7Ci0gICAgaWYgKCEkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRidWYsICRsZW4pOwotICAgIH0KLQotICAgIGlmICgkbGVuICE9PSBudWxsICYmICRsZW4gPCBzdHJsZW4oJGJ1ZikpIHsKLSAgICAgICRidWYgPSBzdWJzdHIoJGJ1ZiwgMCwgJGxlbik7Ci0gICAgfQotICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCi0gICAqIGZvbGxvd2VkIGJ5IHRoZSBhY3R1YWwgZGF0YS4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICBpZiAoISR0aGlzLT53cml0ZV8pIHsKLSAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICAkb3V0ID0gcGFjaygnTicsIHN0cmxlbigkdGhpcy0+d0J1Zl8pKTsKLSAgICAkb3V0IC49ICR0aGlzLT53QnVmXzsKLQotICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKLSAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQotICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGQ0MDMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotCi0vKioKLSAqIEhUVFAgY2xpZW50IGZvciBUaHJpZnQKLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkaG9zdF87Ci0KLSAgLyoqCi0gICAqIFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkcG9ydF87Ci0KLSAgLyoqCi0gICAqIFRoZSBVUkkgdG8gcmVxdWVzdAotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICR1cmlfOwotCi0gIC8qKgotICAgKiBUaGUgc2NoZW1lIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGkuZS4gaHR0cCwgaHR0cHMKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkc2NoZW1lXzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXF1ZXN0IGRhdGEKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkYnVmXzsKLQotICAvKioKLSAgICogSW5wdXQgc29ja2V0IHN0cmVhbS4KLSAgICoKLSAgICogQHZhciByZXNvdXJjZQotICAgKi8KLSAgcHJvdGVjdGVkICRoYW5kbGVfOwotCi0gIC8qKgotICAgKiBSZWFkIHRpbWVvdXQKLSAgICoKLSAgICogQHZhciBmbG9hdAotICAgKi8KLSAgcHJvdGVjdGVkICR0aW1lb3V0XzsKLQotICAvKioKLSAgICogTWFrZSBhIG5ldyBIVFRQIGNsaWVudC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdAotICAgKiBAcGFyYW0gaW50ICAgICRwb3J0Ci0gICAqIEBwYXJhbSBzdHJpbmcgJHVyaQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0LCAkcG9ydD04MCwgJHVyaT0nJywgJHNjaGVtZSA9ICdodHRwJykgewotICAgIGlmICgoc3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgewotICAgICAgJHVyaSA9ICcvJy4kdXJpOwotICAgIH0KLSAgICAkdGhpcy0+c2NoZW1lXyA9ICRzY2hlbWU7Ci0gICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7Ci0gICAgJHRoaXMtPnVyaV8gPSAkdXJpOwotICAgICR0aGlzLT5idWZfID0gJyc7Ci0gICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOwotICAgICR0aGlzLT50aW1lb3V0XyA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHJlYWQgdGltZW91dAotICAgKgotICAgKiBAcGFyYW0gZmxvYXQgJHRpbWVvdXQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0U2VjcygkdGltZW91dCkgewotICAgICR0aGlzLT50aW1lb3V0XyA9ICR0aW1lb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KLSAgICoKLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkge30KLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgJGRhdGEgPSBAZnJlYWQoJHRoaXMtPmhhbmRsZV8sICRsZW4pOwotICAgIGlmICgkZGF0YSA9PT0gRkFMU0UgfHwgJGRhdGEgPT09ICcnKSB7Ci0gICAgICAkbWQgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgICBpZiAoJG1kWyd0aW1lZF9vdXQnXSkgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEh0dHBDbGllbnQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4nLycuJHRoaXMtPnVyaV8sIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEh0dHBDbGllbnQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4nLycuJHRoaXMtPnVyaV8sIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT5idWZfIC49ICRidWY7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgotICAgICRob3N0ID0gJHRoaXMtPmhvc3RfLigkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicuJHRoaXMtPnBvcnRfIDogJycpOwotCi0gICAgJGhlYWRlcnMgPSBhcnJheSgnSG9zdDogJy4kaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICdBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50OiBQSFAvVEh0dHBDbGllbnQnLAotICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQnLAotICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoOiAnLnN0cmxlbigkdGhpcy0+YnVmXykpOwotCi0gICAgJG9wdGlvbnMgPSBhcnJheSgnbWV0aG9kJyA9PiAnUE9TVCcsCi0gICAgICAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBpbXBsb2RlKCJcclxuIiwgJGhlYWRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgJ21heF9yZWRpcmVjdHMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAnY29udGVudCcgPT4gJHRoaXMtPmJ1Zl8pOwotICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7Ci0gICAgICAkb3B0aW9uc1sndGltZW91dCddID0gJHRoaXMtPnRpbWVvdXRfOwotICAgIH0KLSAgICAkdGhpcy0+YnVmXyA9ICcnOwotCi0gICAgJGNvbnRleHRpZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZShhcnJheSgnaHR0cCcgPT4gJG9wdGlvbnMpKTsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigkdGhpcy0+c2NoZW1lXy4nOi8vJy4kaG9zdC4kdGhpcy0+dXJpXywgJ3InLCBmYWxzZSwgJGNvbnRleHRpZCk7Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IEZBTFNFKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgICAkZXJyb3IgPSAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJGhvc3QuJHRoaXMtPnVyaV87Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0gIH0KLQotfQotCi0/PgpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWViMGY1Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgotICogaW4tbWVtb3J5IHN0cmluZyBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseQotICogcGxhY2VkIGludG8gYSBidWZmZXIsIGFuZCBhbnl0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgcmVhZCBmcm9tIHRoYXQKLSAqIGJ1ZmZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIE9wdGlvbmFsbHkgcGFzcyBhbiBpbml0aWFsIHZhbHVlCi0gICAqIGZvciB0aGUgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRidWYgPSAnJykgewotICAgICR0aGlzLT5idWZfID0gJGJ1ZjsKLSAgfQotCi0gIHByb3RlY3RlZCAkYnVmXyA9ICcnOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT5idWZfIC49ICRidWY7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgaWYgKHN0cmxlbigkdGhpcy0+YnVmXykgPT09IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUTWVtb3J5QnVmZmVyOiBDb3VsZCBub3QgcmVhZCAnIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLiAnIGJ5dGVzIGZyb20gYnVmZmVyLicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RybGVuKCR0aGlzLT5idWZfKSA8PSAkbGVuKSB7Ci0gICAgICAkcmV0ID0gJHRoaXMtPmJ1Zl87Ci0gICAgICAkdGhpcy0+YnVmXyA9ICcnOwotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfQotCi0gICAgJHJldCA9IHN1YnN0cigkdGhpcy0+YnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPmJ1Zl8gPSBzdWJzdHIoJHRoaXMtPmJ1Zl8sICRsZW4pOwotCi0gICAgcmV0dXJuICRyZXQ7Ci0gIH0KLQotICBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5idWZfOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZSgpIHsKLSAgICByZXR1cm4gc3RybGVuKCR0aGlzLT5idWZfKTsKLSAgfQotfQotCi0/PgpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGE1ZGYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogVHJhbnNwb3J0IHRoYXQgb25seSBhY2NlcHRzIHdyaXRlcyBhbmQgaWdub3JlcyB0aGVtLgotICogVGhpcyBpcyB1c2VmdWwgZm9yIG1lYXN1cmluZyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHN0cnVjdHVyZXMuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUTnVsbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbid0IHJlYWQgZnJvbSBUTnVsbFRyYW5zcG9ydC4iKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7fQotCi19Ci0KLT8+CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFBocFN0cmVhbS5waHAgYi9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFBocFN0cmVhbS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMWM4MGIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKgotICogUGhwIHN0cmVhbSB0cmFuc3BvcnQuIFJlYWRzIHRvIGFuZCB3cml0ZXMgZnJvbSB0aGUgcGhwIHN0YW5kYXJkIHN0cmVhbXMKLSAqIHBocDovL2lucHV0IGFuZCBwaHA6Ly9vdXRwdXQKLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRQaHBTdHJlYW0gZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICBjb25zdCBNT0RFX1IgPSAxOwotICBjb25zdCBNT0RFX1cgPSAyOwotCi0gIHByaXZhdGUgJGluU3RyZWFtXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSAkb3V0U3RyZWFtXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSAkcmVhZF8gPSBmYWxzZTsKLQotICBwcml2YXRlICR3cml0ZV8gPSBmYWxzZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1vZGUpIHsKLSAgICAkdGhpcy0+cmVhZF8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfUjsKLSAgICAkdGhpcy0+d3JpdGVfID0gJG1vZGUgJiBzZWxmOjpNT0RFX1c7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLSAgICBpZiAoJHRoaXMtPnJlYWRfKSB7Ci0gICAgICAkdGhpcy0+aW5TdHJlYW1fID0gQGZvcGVuKHNlbGY6OmluU3RyZWFtTmFtZSgpLCAncicpOwotICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vaW5wdXQnKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKLSAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gQGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOwotICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL291dHB1dCcpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICBpZiAoJHRoaXMtPnJlYWRfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5pblN0cmVhbV8pOwotICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IG51bGw7Ci0gICAgfQotICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5vdXRTdHJlYW1fKTsKLSAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybgotICAgICAgKCEkdGhpcy0+cmVhZF8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPmluU3RyZWFtXykpICYmCi0gICAgICAoISR0aGlzLT53cml0ZV8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPm91dFN0cmVhbV8pKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aW5TdHJlYW1fLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzJyk7Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7Ci0gICAgd2hpbGUgKHN0cmxlbigkYnVmKSA+IDApIHsKLSAgICAgICRnb3QgPSBAZndyaXRlKCR0aGlzLT5vdXRTdHJlYW1fLCAkYnVmKTsKLSAgICAgIGlmICgkZ290ID09PSAwIHx8ICRnb3QgPT09IEZBTFNFKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgd3JpdGUgJy5zdHJsZW4oJGJ1ZikuJyBieXRlcycpOwotICAgICAgfQotICAgICAgJGJ1ZiA9IHN1YnN0cigkYnVmLCAkZ290KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7Ci0gICAgQGZmbHVzaCgkdGhpcy0+b3V0U3RyZWFtXyk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpblN0cmVhbU5hbWUoKSB7Ci0gICAgaWYgKHBocF9zYXBpX25hbWUoKSA9PSAnY2xpJykgewotICAgICAgcmV0dXJuICdwaHA6Ly9zdGRpbic7Ci0gICAgfQotICAgIHJldHVybiAncGhwOi8vaW5wdXQnOwotICB9Ci0KLX0KLQotPz4KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzYTYzMS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTb2NrZXQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogSGFuZGxlIHRvIFBIUCBzb2NrZXQKLSAgICoKLSAgICogQHZhciByZXNvdXJjZQotICAgKi8KLSAgcHJpdmF0ZSAkaGFuZGxlXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBob3N0bmFtZQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOwotCi0gIC8qKgotICAgKiBSZW1vdGUgcG9ydAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKLQotICAvKioKLSAgICogU2VuZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcwotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkc2VuZFRpbWVvdXRfID0gMTAwOwotCi0gIC8qKgotICAgKiBSZWN2IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRyZWN2VGltZW91dF8gPSA3NTA7Ci0KLSAgLyoqCi0gICAqIElzIHNlbmQgdGltZW91dCBzZXQ/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkc2VuZFRpbWVvdXRTZXRfID0gRkFMU0U7Ci0KLSAgLyoqCi0gICAqIFBlcnNpc3RlbnQgc29ja2V0IG9yIHBsYWluPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHBlcnNpc3RfID0gRkFMU0U7Ci0KLSAgLyoqCi0gICAqIERlYnVnZ2luZyBvbj8KLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcm90ZWN0ZWQgJGRlYnVnXyA9IEZBTFNFOwotCi0gIC8qKgotICAgKiBEZWJ1ZyBoYW5kbGVyCi0gICAqCi0gICAqIEB2YXIgbWl4ZWQKLSAgICovCi0gIHByb3RlY3RlZCAkZGVidWdIYW5kbGVyXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFNvY2tldCBjb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0ICAgICAgICAgUmVtb3RlIGhvc3RuYW1lCi0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQgICAgICAgICBSZW1vdGUgcG9ydAotICAgKiBAcGFyYW0gYm9vbCAgICRwZXJzaXN0ICAgICAgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAotICAgKiBAcGFyYW0gc3RyaW5nICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gdG8gY2FsbCBmb3IgZXJyb3IgbG9nZ2luZwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0PSdsb2NhbGhvc3QnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBvcnQ9OTA5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwZXJzaXN0PUZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlYnVnSGFuZGxlcj1udWxsKSB7Ci0gICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7Ci0gICAgJHRoaXMtPnBlcnNpc3RfID0gJHBlcnNpc3Q7Ci0gICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8gPSAkZGVidWdIYW5kbGVyID8gJGRlYnVnSGFuZGxlciA6ICdlcnJvcl9sb2cnOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNlbmQgdGltZW91dC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkdGltZW91dCAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0U2VuZFRpbWVvdXQoJHRpbWVvdXQpIHsKLSAgICAkdGhpcy0+c2VuZFRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVjZWl2ZSB0aW1lb3V0LgotICAgKgotICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0ICBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRSZWN2VGltZW91dCgkdGltZW91dCkgewotICAgICR0aGlzLT5yZWN2VGltZW91dF8gPSAkdGltZW91dDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCi0gICAqCi0gICAqIEBwYXJhbSBib29sICRkZWJ1ZwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldERlYnVnKCRkZWJ1ZykgewotICAgICR0aGlzLT5kZWJ1Z18gPSAkZGVidWc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCi0gICAqCi0gICAqIEByZXR1cm4gc3RyaW5nIGhvc3QKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRIb3N0KCkgewotICAgIHJldHVybiAkdGhpcy0+aG9zdF87Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSByZW1vdGUgcG9ydCB0aGF0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0bwotICAgKgotICAgKiBAcmV0dXJuIGludCBwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UG9ydCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnBvcnRfOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBvcGVuCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZSBzb2NrZXQgaXMgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHRoaXMtPmhhbmRsZV8pOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLQotICAgIGlmICgkdGhpcy0+cGVyc2lzdF8pIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gQHBmc29ja29wZW4oJHRoaXMtPmhvc3RfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cG9ydF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0Xy8xMDAwLjApOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmc29ja29wZW4oJHRoaXMtPmhvc3RfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRfLzEwMDAuMCk7Ci0gICAgfQotCi0gICAgLy8gQ29ubmVjdCBmYWlsZWQ/Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBGQUxTRSkgewotICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJyAoJy4kZXJyc3RyLicgWycuJGVycm5vLiddKSc7Ci0gICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKLSAgICAgIH0KLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gICAgfQotCi0gICAgc3RyZWFtX3NldF90aW1lb3V0KCR0aGlzLT5oYW5kbGVfLCAwLCAkdGhpcy0+c2VuZFRpbWVvdXRfKjEwMDApOwotICAgICR0aGlzLT5zZW5kVGltZW91dFNldF8gPSBUUlVFOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgIGlmICghJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXNlcyBzdHJlYW0gZ2V0IGNvbnRlbnRzIHRvIGRvIHRoZSByZWFkaW5nCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbWFueSBieXRlcwotICAgKiBAcmV0dXJuIHN0cmluZyBCaW5hcnkgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikgewotICAgIGlmICgkdGhpcy0+c2VuZFRpbWVvdXRTZXRfKSB7Ci0gICAgICBzdHJlYW1fc2V0X3RpbWVvdXQoJHRoaXMtPmhhbmRsZV8sIDAsICR0aGlzLT5yZWN2VGltZW91dF8qMTAwMCk7Ci0gICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZXRfID0gRkFMU0U7Ci0gICAgfQotICAgIC8vIFRoaXMgY2FsbCBkb2VzIG5vdCBvYmV5IHN0cmVhbV9zZXRfdGltZW91dCB2YWx1ZXMhCi0gICAgLy8gJGJ1ZiA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLQotICAgICRwcmUgPSBudWxsOwotICAgIHdoaWxlIChUUlVFKSB7Ci0gICAgICAkYnVmID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLSAgICAgIGlmICgkYnVmID09PSBGQUxTRSB8fCAkYnVmID09PSAnJykgewotICAgICAgICAkbWQgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoKCRzeiA9IHN0cmxlbigkYnVmKSkgPCAkbGVuKSB7Ci0gICAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkcHJlIC49ICRidWY7Ci0gICAgICAgICAgJGxlbiAtPSAkc3o7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAkcHJlLiRidWY7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgZnJvbSB0aGUgc29ja2V0Ci0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbWFueSBieXRlcwotICAgKiBAcmV0dXJuIHN0cmluZyBCaW5hcnkgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikgewotICAgIGlmICgkdGhpcy0+c2VuZFRpbWVvdXRTZXRfKSB7Ci0gICAgICBzdHJlYW1fc2V0X3RpbWVvdXQoJHRoaXMtPmhhbmRsZV8sIDAsICR0aGlzLT5yZWN2VGltZW91dF8qMTAwMCk7Ci0gICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZXRfID0gRkFMU0U7Ci0gICAgfQotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgIGlmICghJHRoaXMtPnNlbmRUaW1lb3V0U2V0XykgewotICAgICAgc3RyZWFtX3NldF90aW1lb3V0KCR0aGlzLT5oYW5kbGVfLCAwLCAkdGhpcy0+c2VuZFRpbWVvdXRfKjEwMDApOwotICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2V0XyA9IFRSVUU7Ci0gICAgfQotICAgIHdoaWxlIChzdHJsZW4oJGJ1ZikgPiAwKSB7Ci0gICAgICAkZ290ID0gQGZ3cml0ZSgkdGhpcy0+aGFuZGxlXywgJGJ1Zik7Ci0gICAgICBpZiAoJGdvdCA9PT0gMCB8fCAkZ290ID09PSBGQUxTRSkgewotICAgICAgICAkbWQgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCB3cml0aW5nICcuc3RybGVuKCRidWYpLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJy5zdHJsZW4oJGJ1ZikuJyBieXRlcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkYnVmID0gc3Vic3RyKCRidWYsICRnb3QpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaCBvdXRwdXQgdG8gdGhlIHNvY2tldC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICAkcmV0ID0gZmZsdXNoKCR0aGlzLT5oYW5kbGVfKTsKLSAgICBpZiAoJHJldCA9PT0gRkFMU0UpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgZmx1c2g6ICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgfQotICB9Ci19Ci0KLT8+CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIGIvbGliL3BocC9zcmMvdHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyMWE2NS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi0KLS8qKiBJbmhlcml0cyBmcm9tIFNvY2tldCAqLwotaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RTb2NrZXQucGhwJzsKLQotLyoqCi0gKiBUaGlzIGxpYnJhcnkgbWFrZXMgdXNlIG9mIEFQQyBjYWNoZSB0byBtYWtlIGhvc3RzIGFzIGRvd24gaW4gYSB3ZWIKLSAqIGVudmlyb25tZW50LiBJZiB5b3UgYXJlIHJ1bm5pbmcgZnJvbSB0aGUgQ0xJIG9yIG9uIGEgc3lzdGVtIHdpdGhvdXQgQVBDCi0gKiBpbnN0YWxsZWQsIHRoZW4gdGhlc2UgbnVsbCBmdW5jdGlvbnMgd2lsbCBzdGVwIGluIGFuZCBhY3QgbGlrZSBjYWNoZQotICogbWlzc2VzLgotICovCi1pZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXBjX2ZldGNoJykpIHsKLSAgZnVuY3Rpb24gYXBjX2ZldGNoKCRrZXkpIHsgcmV0dXJuIEZBTFNFOyB9Ci0gIGZ1bmN0aW9uIGFwY19zdG9yZSgka2V5LCAkdmFyLCAkdHRsPTApIHsgcmV0dXJuIEZBTFNFOyB9Ci19Ci0KLS8qKgotICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgY29ubmVjdGlvbgotICogdG8gYSBwb29sIG9mIHNlcnZlcnMuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUU29ja2V0UG9vbCBleHRlbmRzIFRTb2NrZXQgewotCi0gIC8qKgotICAgKiBSZW1vdGUgc2VydmVycy4gQXJyYXkgb2YgYXNzb2NpYXRpdmUgYXJyYXlzIHdpdGggJ2hvc3QnIGFuZCAncG9ydCcga2V5cwotICAgKi8KLSAgcHJpdmF0ZSAkc2VydmVyc18gPSBhcnJheSgpOwotCi0gIC8qKgotICAgKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBlYWNoIGhvc3QgaW4gY29ubmVjdAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkbnVtUmV0cmllc18gPSAxOwotCi0gIC8qKgotICAgKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgotICAgKiBtYXJrZWQgYXMgZG93bi4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHJldHJ5SW50ZXJ2YWxfID0gNjA7Ci0KLSAgLyoqCi0gICAqIE1heCBjb25zZWN1dGl2ZSBmYWlsdXJlcyBiZWZvcmUgbWFya2luZyBhIGhvc3QgZG93bi4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJG1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gMTsKLQotICAvKioKLSAgICogVHJ5IGhvc3RzIGluIG9yZGVyPyBvciBSYW5kb21pemVkPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJHJhbmRvbWl6ZV8gPSBUUlVFOwotCi0gIC8qKgotICAgKiBBbHdheXMgdHJ5IGxhc3QgaG9zdCwgZXZlbiBpZiBtYXJrZWQgZG93bj8KLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRhbHdheXNUcnlMYXN0XyA9IFRSVUU7Ci0KLSAgLyoqCi0gICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBhcnJheSAgJGhvc3RzICAgICAgICBMaXN0IG9mIHJlbW90ZSBob3N0bmFtZXMKLSAgICogQHBhcmFtIG1peGVkICAkcG9ydHMgICAgICAgIEFycmF5IG9mIHJlbW90ZSBwb3J0cywgb3IgYSBzaW5nbGUgY29tbW9uIHBvcnQKLSAgICogQHBhcmFtIGJvb2wgICAkcGVyc2lzdCAgICAgIFdoZXRoZXIgdG8gdXNlIGEgcGVyc2lzdGVudCBzb2NrZXQKLSAgICogQHBhcmFtIG1peGVkICAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIGZvciBlcnJvciBsb2dnaW5nCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3RzPWFycmF5KCdsb2NhbGhvc3QnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwb3J0cz1hcnJheSg5MDkwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwZXJzaXN0PUZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlYnVnSGFuZGxlcj1udWxsKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdChudWxsLCAwLCAkcGVyc2lzdCwgJGRlYnVnSGFuZGxlcik7Ci0KLSAgICBpZiAoIWlzX2FycmF5KCRwb3J0cykpIHsKLSAgICAgICRwb3J0ID0gJHBvcnRzOwotICAgICAgJHBvcnRzID0gYXJyYXkoKTsKLSAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgICAgJHBvcnRzWyRrZXldID0gJHBvcnQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJGhvc3QpIHsKLSAgICAgICR0aGlzLT5zZXJ2ZXJzXyBbXT0gYXJyYXkoJ2hvc3QnID0+ICRob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9ydCcgPT4gJHBvcnRzWyRrZXldKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCi0gICAqCi0gICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcHJldmVudCB5b3UgZnJvbSBhZGRpbmcgYSBkdXBsaWNhdGUgc2VydmVyIGVudHJ5LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IGhvc3RuYW1lIG9yIElQCi0gICAqIEBwYXJhbSBpbnQgJHBvcnQgcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGFkZFNlcnZlcigkaG9zdCwgJHBvcnQpIHsKLSAgICAkdGhpcy0+c2VydmVyc19bXSA9IGFycmF5KCdob3N0JyA9PiAkaG9zdCwgJ3BvcnQnID0+ICRwb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGhvdyBtYW55IHRpbWUgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXROdW1SZXRyaWVzKCRudW1SZXRyaWVzKSB7Ci0gICAgJHRoaXMtPm51bVJldHJpZXNfID0gJG51bVJldHJpZXM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KLSAgICoKLSAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJldHJ5SW50ZXJ2YWwoJHJldHJ5SW50ZXJ2YWwpIHsKLSAgICAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gPSAkcmV0cnlJbnRlcnZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGhvdyBtYW55IHRpbWUgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgYmVmb3JlIG1hcmtpbmcgaXQgYXMgZG93bi4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoJG1heENvbnNlY3V0aXZlRmFpbHVyZXMpIHsKLSAgICAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSAkbWF4Q29uc2VjdXRpdmVGYWlsdXJlczsKLSAgfQotCi0gIC8qKgotICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgotICAgKgotICAgKiBAcGFyYW0gYm9vbCAkcmFuZG9taXplCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0UmFuZG9taXplKCRyYW5kb21pemUpIHsKLSAgICAkdGhpcy0+cmFuZG9taXplXyA9ICRyYW5kb21pemU7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJGFsd2F5c1RyeUxhc3QKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRBbHdheXNUcnlMYXN0KCRhbHdheXNUcnlMYXN0KSB7Ci0gICAgJHRoaXMtPmFsd2F5c1RyeUxhc3RfID0gJGFsd2F5c1RyeUxhc3Q7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb25uZWN0cyB0aGUgc29ja2V0IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB0aGUgc2VydmVycyBpbiB0aGUgcG9vbAotICAgKiBhbmQgdHJ5aW5nIHRvIGZpbmQgb25lIHRoYXQgd29ya3MuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHsKLSAgICAvLyBDaGVjayBpZiB3ZSB3YW50IG9yZGVyIHJhbmRvbWl6YXRpb24KLSAgICBpZiAoJHRoaXMtPnJhbmRvbWl6ZV8pIHsKLSAgICAgIHNodWZmbGUoJHRoaXMtPnNlcnZlcnNfKTsKLSAgICB9Ci0KLSAgICAvLyBDb3VudCBzZXJ2ZXJzIHRvIGlkZW50aWZ5IHRoZSAibGFzdCIgb25lCi0gICAgJG51bVNlcnZlcnMgPSBjb3VudCgkdGhpcy0+c2VydmVyc18pOwotCi0gICAgZm9yICgkaSA9IDA7ICRpIDwgJG51bVNlcnZlcnM7ICsrJGkpIHsKLQotICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgJGhvc3QgYW5kICRwb3J0IHZhcmlhYmxlcwotICAgICAgZXh0cmFjdCgkdGhpcy0+c2VydmVyc19bJGldKTsKLQotICAgICAgLy8gQ2hlY2sgQVBDIGNhY2hlIGZvciBhIHJlY29yZCBvZiB0aGlzIHNlcnZlciBiZWluZyBkb3duCi0gICAgICAkZmFpbHRpbWVLZXkgPSAndGhyaWZ0X2ZhaWx0aW1lOicuJGhvc3QuJzonLiRwb3J0Lid+JzsKLQotICAgICAgLy8gQ2FjaGUgbWlzcz8gQXNzdW1lIGl0J3MgT0sKLSAgICAgICRsYXN0RmFpbHRpbWUgPSBhcGNfZmV0Y2goJGZhaWx0aW1lS2V5KTsKLSAgICAgIGlmICgkbGFzdEZhaWx0aW1lID09PSBGQUxTRSkgewotICAgICAgICAkbGFzdEZhaWx0aW1lID0gMDsKLSAgICAgIH0KLQotICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSBGQUxTRTsKLQotICAgICAgLy8gQ2FjaGUgaGl0Li4ubWFrZSBzdXJlIGVub3VnaCB0aGUgcmV0cnkgaW50ZXJ2YWwgaGFzIGVsYXBzZWQKLSAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgewotICAgICAgICAkZWxhcHNlZCA9IHRpbWUoKSAtICRsYXN0RmFpbHRpbWU7Ci0gICAgICAgIGlmICgkZWxhcHNlZCA+ICR0aGlzLT5yZXRyeUludGVydmFsXykgewotICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gVFJVRTsKLSAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldFBvb2w6IHJldHJ5SW50ZXJ2YWwgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJy4kdGhpcy0+cmV0cnlJbnRlcnZhbF8uJykgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgcGFzc2VkIGZvciBob3N0ICcuJGhvc3QuJzonLiRwb3J0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gT25seSBjb25uZWN0IGlmIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgZmFpbCBpbnRlcnZhbCwgT1IgaWYgdGhpcwotICAgICAgLy8gaXMgdGhlIExBU1Qgc2VydmVyIHdlIGFyZSB0cnlpbmcsIGp1c3QgaGFtbWVyIGF3YXkgb24gaXQKLSAgICAgICRpc0xhc3RTZXJ2ZXIgPSBGQUxTRTsKLSAgICAgIGlmICgkdGhpcy0+YWx3YXlzVHJ5TGFzdF8pIHsKLSAgICAgICAgJGlzTGFzdFNlcnZlciA9ICgkaSA9PSAoJG51bVNlcnZlcnMgLSAxKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoJGxhc3RGYWlsdGltZSA9PT0gMCkgfHwKLSAgICAgICAgICAoJGlzTGFzdFNlcnZlcikgfHwKLSAgICAgICAgICAoJGxhc3RGYWlsdGltZSA+IDAgJiYgJHJldHJ5SW50ZXJ2YWxQYXNzZWQpKSB7Ci0KLSAgICAgICAgLy8gU2V0IHVuZGVybHlpbmcgVFNvY2tldCBwYXJhbXMgdG8gdGhpcyBvbmUKLSAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotCi0gICAgICAgIC8vIFRyeSB1cCB0byBudW1SZXRyaWVzXyBjb25uZWN0aW9ucyBwZXIgc2VydmVyCi0gICAgICAgIGZvciAoJGF0dGVtcHQgPSAwOyAkYXR0ZW1wdCA8ICR0aGlzLT5udW1SZXRyaWVzXzsgJGF0dGVtcHQrKykgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBVc2UgdGhlIHVuZGVybHlpbmcgVFNvY2tldCBvcGVuIGZ1bmN0aW9uCi0gICAgICAgICAgICBwYXJlbnQ6Om9wZW4oKTsKLQotICAgICAgICAgICAgLy8gT25seSBjbGVhciB0aGUgZmFpbHVyZSBjb3VudHMgaWYgcmVxdWlyZWQgdG8gZG8gc28KLSAgICAgICAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgewotICAgICAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCBjb25uZWN0aW9uLCByZXR1cm4gbm93Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uICR0eCkgewotICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBmYWlsZWQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYXJrIGZhaWx1cmUgb2YgdGhpcyBob3N0IGluIHRoZSBjYWNoZQotICAgICAgICAkY29uc2VjZmFpbHNLZXkgPSAndGhyaWZ0X2NvbnNlY2ZhaWxzOicuJGhvc3QuJzonLiRwb3J0Lid+JzsKLQotICAgICAgICAvLyBJZ25vcmUgY2FjaGUgbWlzc2VzCi0gICAgICAgICRjb25zZWNmYWlscyA9IGFwY19mZXRjaCgkY29uc2VjZmFpbHNLZXkpOwotICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID09PSBGQUxTRSkgewotICAgICAgICAgICRjb25zZWNmYWlscyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbmNyZW1lbnQgYnkgb25lCi0gICAgICAgICRjb25zZWNmYWlscysrOwotCi0gICAgICAgIC8vIExvZyBhbmQgY2FjaGUgdGhpcyBmYWlsdXJlCi0gICAgICAgIGlmICgkY29uc2VjZmFpbHMgPj0gJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfKSB7Ci0gICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiBtYXJraW5nICcuJGhvc3QuJzonLiRwb3J0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhcyBkb3duIGZvciAnLiR0aGlzLT5yZXRyeUludGVydmFsXy4nIHNlY3MgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciAnLiRjb25zZWNmYWlscy4nIGZhaWxlZCBhdHRlbXB0cy4nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gU3RvcmUgdGhlIGZhaWx1cmUgdGltZQotICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIHRpbWUoKSk7Ci0KLSAgICAgICAgICAvLyBDbGVhciB0aGUgY291bnQgb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMKLSAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAkY29uc2VjZmFpbHMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT2ggbm87IHdlIGZhaWxlZCB0aGVtIGFsbC4gVGhlIHN5c3RlbSBpcyB0b3RhbGx5IGlsbCEKLSAgICAkZXJyb3IgPSAnVFNvY2tldFBvb2w6IEFsbCBob3N0cyBpbiBwb29sIGFyZSBkb3duLiAnOwotICAgICRob3N0cyA9IGFycmF5KCk7Ci0gICAgZm9yZWFjaCAoJHRoaXMtPnNlcnZlcnNfIGFzICRzZXJ2ZXIpIHsKLSAgICAgICRob3N0cyBbXT0gJHNlcnZlclsnaG9zdCddLic6Jy4kc2VydmVyWydwb3J0J107Ci0gICAgfQotICAgICRob3N0bGlzdCA9IGltcGxvZGUoJywnLCAkaG9zdHMpOwotICAgICRlcnJvciAuPSAnKCcuJGhvc3RsaXN0LicpJzsKLSAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7Ci0gICAgfQotICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gIH0KLX0KLQotPz4KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0NDUyNS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLQotLyoqCi0gKiBUcmFuc3BvcnQgZXhjZXB0aW9ucwotICovCi1jbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7Ci0KLSAgY29uc3QgVU5LTk9XTiA9IDA7Ci0gIGNvbnN0IE5PVF9PUEVOID0gMTsKLSAgY29uc3QgQUxSRUFEWV9PUEVOID0gMjsKLSAgY29uc3QgVElNRURfT1VUID0gMzsKLSAgY29uc3QgRU5EX09GX0ZJTEUgPSA0OwotCi0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgYSB0cmFuc3BvcnQgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1hYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gaXNPcGVuKCk7Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIG9wZW4oKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBjbG9zZSgpOwotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZCgkbGVuKTsKLQotICAvKioKLSAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pIHsKLSAgICAvLyByZXR1cm4gJHRoaXMtPnJlYWQoJGxlbik7Ci0KLSAgICAkZGF0YSA9ICcnOwotICAgICRnb3QgPSAwOwotICAgIHdoaWxlICgoJGdvdCA9IHN0cmxlbigkZGF0YSkpIDwgJGxlbikgewotICAgICAgJGRhdGEgLj0gJHRoaXMtPnJlYWQoJGxlbiAtICRnb3QpOwotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBnaXZlbiBkYXRhIG91dC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmICBUaGUgZGF0YSB0byB3cml0ZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlKCRidWYpOwotCi0gIC8qKgotICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgYnVmZmVyCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7fQotfQotCi0/PgpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1N2Q4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKQEAgLTAsMCArMSwxOTQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnQ7CisKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDsKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDI7Cit1c2UgVGhyaWZ0VGVzdFxOdW1iZXJ6OwordXNlIFRocmlmdFRlc3RcSW5zYW5pdHk7CisKK2NsYXNzIEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkYnVmc2l6ZSA9IDgxOTI7IC8vYmlnIGVub3VnaCB0byByZWFkIGJpZ2dlc3Qgc2VyaWFsaXplZCBGaXh0dXJlIGFyZy4KKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJncyA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3MoKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXSA9CisgICAgICAgICAgICAicXVvdGU6IFxcXCIgYmFja3NsYXNoOiIgLgorICAgICAgICAgICAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFwvICIgLgorICAgICAgICAgICAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiAuCisgICAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFwvXGJcblxyXHQiIC4KKyAgICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjXCQlJigpKCYlJCN7fXt9PD48PjwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXSA9CisgICAgICAgICAgICAic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ10gPQorICAgICAgICAgICAgIuC4quC4p+C4seC4quC4lOC4tS/wnZKvIjsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXSA9IDMuMTQxNTkyNjUzNTg5ODsKKworICAgICAgICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ10gPSAweDAxOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEkzMiddID0gcG93KDIsIDMwKTsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gcG93KDIsIDYwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gIjExNTI5MjE1MDQ2MDY4NDcwMDAiOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J10gPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMzApLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICd3b3JrZWQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDMwKSwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXSA9CisgICAgICAgICAgICBuZXcgWHRydWN0MigKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCisgICAgICAgICAgICAgICAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDE1KQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNyA9PiA3NywKKyAgICAgICAgICAgICAgICA4ID0+IDg4LAorICAgICAgICAgICAgICAgIDkgPT4gOTkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgImEiID0+ICIxMjMiLAorICAgICAgICAgICAgICAgICJhIGIiID0+ICJ3aXRoIHNwYWNlcyAiLAorICAgICAgICAgICAgICAgICJzYW1lIiA9PiAic2FtZSIsCisgICAgICAgICAgICAgICAgIjAiID0+ICJudW1lcmljIGtleSIsCisgICAgICAgICAgICAgICAgImxvbmdWYWx1ZSIgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddLAorICAgICAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSA9PiAibG9uZyBrZXkiCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFNldCddID0gYXJyYXkoMSA9PiB0cnVlLCA1ID0+IHRydWUsIDYgPT4gdHJ1ZSk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddID0gYXJyYXkoMSwgMiwgMyk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RW51bSddID0gTnVtYmVyejo6T05FOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXSA9IDY5OworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNCA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgMSA9PiAxLAorICAgICAgICAgICAgICAgICAgICAyID0+IDIsCisgICAgICAgICAgICAgICAgICAgIDMgPT4gMywKKyAgICAgICAgICAgICAgICAgICAgNCA9PiA0LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgLTQgPT4gYXJyYXkoCisgICAgICAgICAgICAgICAgICAgIC00ID0+IC00LAorICAgICAgICAgICAgICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgICAgICAgICAgICAgLTIgPT4gLTIsCisgICAgICAgICAgICAgICAgICAgIC0xID0+IC0xCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAvLyB0ZXN0SW5zYW5pdHkgLi4uIHRha2VzIGEgZmV3IHN0ZXBzIHRvIHNldCB1cCEKKworICAgICAgICAkeHRydWN0MSA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gNAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJHh0cnVjdDIgPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0hlbGxvMicsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAyCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkdXNlck1hcCA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICBOdW1iZXJ6OjpGSVZFID0+IDUsCisgICAgICAgICAgICAgICAgTnVtYmVyejo6RUlHSFQgPT4gOAorICAgICAgICAgICAgKTsKKworICAgICAgICAkaW5zYW5pdHkyID0KKyAgICAgICAgICAgIG5ldyBJbnNhbml0eSgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+ICR1c2VyTWFwLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdDEsICR4dHJ1Y3QyKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJGluc2FuaXR5MyA9ICRpbnNhbml0eTI7CisKKyAgICAgICAgJGluc2FuaXR5NiA9CisgICAgICAgICAgICBuZXcgSW5zYW5pdHkoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiBudWxsLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gbnVsbAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICIxIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VFdPID0+ICRpbnNhbml0eTIsCisgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlRIUkVFID0+ICRpbnNhbml0eTMKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICIyIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6U0lYID0+ICRpbnNhbml0eTYKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY4NjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCkBAIC0wLDAgKzEsMTE2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcSnNvblNlcmlhbGl6ZTsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIHN0ZENsYXNzOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgSnNvblNlcmlhbGl6ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgJzUuNCcsICc8JykpIHsKKyAgICAgICAgICAgICR0aGlzLT5tYXJrVGVzdFNraXBwZWQoJ1JlcXVpcmVzIFBIUCA1LjQgb3IgbmV3ZXIhJyk7CisgICAgICAgIH0KKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocGpzJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdCgpCisgICAgeworICAgICAgICAkZW1wdHkgPSBuZXcgXFRocmlmdFRlc3RcRW1wdHlTdHJ1Y3QoYXJyYXkoJ25vbl9leGlzdGluZ19rZXknID0+ICdiYXInKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMobmV3IHN0ZENsYXNzKCksIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRlbXB0eSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ3NBbmRJbnRzKCkKKyAgICB7CisgICAgICAgICRpbnB1dCA9IGFycmF5KAorICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2ZvbycsCisgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAxMjM0NTY3ODkwLAorICAgICAgICApOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkaW5wdXQpOworCisgICAgICAgIC8vIFh0cnVjdCdzICdpMzJfdGhpbmcnIGFuZCAnYnl0ZV90aGluZycgZmllbGRzIHNob3VsZCBub3QgYmUgcHJlc2VudCBoZXJlIQorICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5zdHJpbmdfdGhpbmcgPSAkaW5wdXRbJ3N0cmluZ190aGluZyddOworICAgICAgICAkZXhwZWN0ZWQtPmk2NF90aGluZyA9ICRpbnB1dFsnaTY0X3RoaW5nJ107CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0KSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdGVkU3RydWN0cygpCisgICAgeworICAgICAgICAkeHRydWN0MiA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QyKGFycmF5KAorICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQyLAorICAgICAgICAgICAgJ3N0cnVjdF90aGluZycgPT4gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgKKyAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMjM0NTYsCisgICAgICAgICAgICApKSwKKyAgICAgICAgKSk7CisKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ynl0ZV90aGluZyA9ICR4dHJ1Y3QyLT5ieXRlX3RoaW5nOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZyA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nID0gJHh0cnVjdDItPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHh0cnVjdDIpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eSgpCisgICAgeworICAgICAgICAkeGlucHV0ID0gYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2ZvbycpOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkeGlucHV0KTsKKyAgICAgICAgJGluc2FuaXR5ID0gbmV3IFxUaHJpZnRUZXN0XEluc2FuaXR5KGFycmF5KAorICAgICAgICAgICAgJ3h0cnVjdHMnID0+IGFycmF5KCR4dHJ1Y3QsICR4dHJ1Y3QsICR4dHJ1Y3QpCisgICAgICAgICkpOworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT54dHJ1Y3RzID0gYXJyYXkoKG9iamVjdCkkeGlucHV0LCAob2JqZWN0KSR4aW5wdXQsIChvYmplY3QpJHhpbnB1dCk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkaW5zYW5pdHkpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRMaXN0cygpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKGFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpOworICAgICAgICAkbmVzdGVkID0gbmV3IFxUaHJpZnRUZXN0XE5lc3RlZExpc3RzQm9uayhhcnJheSgnYm9uaycgPT4gYXJyYXkoYXJyYXkoYXJyYXkoJGJvbmspKSkpKTsKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ym9uayA9IGFycmF5KGFycmF5KGFycmF5KChvYmplY3QpYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSkpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRuZXN0ZWQpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBzKCkKKyAgICB7CisgICAgICAgICRpbnRtYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoWyd0aGluZycgPT4gWzAgPT4gJ3plcm8nXV0pOworICAgICAgICAkZW1wdHltYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoW10pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InRoaW5nIjp7IjAiOiJ6ZXJvIn19JywganNvbl9lbmNvZGUoJGludG1hcCkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7fScsIGpzb25fZW5jb2RlKCRlbXB0eW1hcCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2NhbGFyVHlwZXMoKQorICAgIHsKKyAgICAgICAgJGIgPSBuZXcgXFRocmlmdFRlc3RcQm9vbHMoWydpbV90cnVlJyA9PiAnMScsICdpbV9mYWxzZScgPT4gJzAnXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3siaW1fdHJ1ZSI6dHJ1ZSwiaW1fZmFsc2UiOmZhbHNlfScsIGpzb25fZW5jb2RlKCRiKSk7CisgICAgICAgICRzID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoWydzJyA9PiA0Ml0pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InMiOiI0MiJ9JywganNvbl9lbmNvZGUoJHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDgyNDY4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworUEhQVU5JVD1waHAgJCh0b3Bfc3JjZGlyKS92ZW5kb3IvYmluL3BocHVuaXQKKworc3R1YnM6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAorCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwCisJJChUSFJJRlQpIC0tZ2VuIHBocCAtciAtLW91dCAuL3BhY2thZ2VzL3BocCAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2bworCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwanMKKwkkKFRIUklGVCkgLS1nZW4gcGhwOnZhbGlkYXRlICAgICAtciAtLW91dCAuL3BhY2thZ2VzL3BocHYgICBUZXN0VmFsaWRhdG9ycy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcGhwOnZhbGlkYXRlLG9vcCAtciAtLW91dCAuL3BhY2thZ2VzL3BocHZvICBUZXN0VmFsaWRhdG9ycy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcGhwOmpzb24gICAgICAgICAtciAtLW91dCAuL3BhY2thZ2VzL3BocGpzICBUZXN0VmFsaWRhdG9ycy50aHJpZnQKKworZGVwczogJCh0b3Bfc3JjZGlyKS9jb21wb3Nlci5qc29uCisJY29tcG9zZXIgaW5zdGFsbCAtLXdvcmtpbmctZGlyPSQodG9wX3NyY2RpcikKKworYWxsLWxvY2FsOiBkZXBzCisKK2NoZWNrLWpzb24tc2VyaWFsaXplcjogZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctanNvbi1zZXJpYWxpemVyLnhtbCBKc29uU2VyaWFsaXplLworCitjaGVjay12YWxpZGF0b3I6IGRlcHMgc3R1YnMKKwkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLXZhbGlkYXRvci54bWwgVmFsaWRhdG9yLworCitjaGVjay1wcm90b2NvbDoJZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctcHJvdG9jb2wueG1sIFByb3RvY29sLworCitjaGVjazogZGVwcyBzdHVicyBcCisgIGNoZWNrLXByb3RvY29sIFwKKyAgY2hlY2stdmFsaWRhdG9yIFwKKyAgY2hlY2stanNvbi1zZXJpYWxpemVyCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIC4vcGFja2FnZXMKKwkkKFJNKSBURVNULSoueG1sCmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL0JpbmFyeVNlcmlhbGl6ZXJUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWIwYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL0JpbmFyeVNlcmlhbGl6ZXJUZXN0LnBocApAQCAtMCwwICsxLDYwIEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGhyaWZ0XFNlcmlhbGl6ZXJcVEJpbmFyeVNlcmlhbGl6ZXI7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKioKKyAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCisgKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgorICoKKyAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAorICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIEJpbmFyeVNlcmlhbGl6ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocCcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlIHRyeSB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIGEgcmFuZG9tIG9iamVjdCB0byBtYWtlIHN1cmUgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duLgorICAgICAqIEBzZWUgVEhSSUZULTE1NzkKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJpbmFyeVNlcmlhbGl6ZXIoKQorICAgIHsKKyAgICAgICAgJHN0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2FiYycpKTsKKyAgICAgICAgJHNlcmlhbGl6ZWQgPSBUQmluYXJ5U2VyaWFsaXplcjo6c2VyaWFsaXplKCRzdHJ1Y3QsICdUaHJpZnRUZXN0XFxYdHJ1Y3QnKTsKKyAgICAgICAgJGRlc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSgkc2VyaWFsaXplZCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRzdHJ1Y3QsICRkZXNlcmlhbGl6ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5MDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sRml4dHVyZXMucGhwCkBAIC0wLDAgKzEsNzQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK2NsYXNzIFRKU09OUHJvdG9jb2xGaXh0dXJlcworeworICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NKU09OKCkKKyAgICB7CisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyIxIjp7InN0ciI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIFwvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZVwn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwXC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7IjEiOnsic3RyIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMyddID0gJ3siMSI6eyJzdHIiOiJzdHJpbmcgdGhhdCBlbmRzIGluIGRvdWJsZS1iYWNrc2xhc2ggXFxcXFxcXFwifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddID0gJ3siMSI6eyJzdHIiOiLguKrguKfguLHguKrguJTguLVcL/Cdkq8ifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7IjEiOnsiZGJsIjozLjE0MTU5MjY1MzU4OTh9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXSA9ICd7IjEiOnsiaTgiOjF9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddID0gJ3siMSI6eyJpMzIiOjEwNzM3NDE4MjR9fSc7CisKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6JyAuIHBvdygyLCA2MCkgLiAnfX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fX19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3siMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX19LCIzIjp7ImkzMiI6MzI3Njh9fX19JzsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10gPSAneyIxIjp7Im1hcCI6WyJzdHIiLCJzdHIiLDYseyJhIjoiMTIzIiwiYSBiIjoid2l0aCBzcGFjZXMgIiwic2FtZSI6InNhbWUiLCIwIjoibnVtZXJpYyBrZXkiLCJsb25nVmFsdWUiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIiwiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSI6Imxvbmcga2V5In1dfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXSA9ICd7IjEiOnsic2V0IjpbImkzMiIsMywxLDUsNl19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXSA9ICd7IjEiOnsibHN0IjpbImkzMiIsMywxLDIsM119fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXSA9ICd7IjEiOnsiaTMyIjoxfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyIxIjp7Imk2NCI6Njl9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddID0gJ3siMCI6eyJtYXAiOlsiaTMyIiwibWFwIiwyLHsiNCI6WyJpMzIiLCJpMzIiLDQseyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fV0sIi00IjpbImkzMiIsImkzMiIsNCx7Ii00IjotNCwiLTMiOi0zLCItMiI6LTIsIi0xIjotMX1dfV19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEluc2FuaXR5J10gPSAneyIwIjp7Im1hcCI6WyJpNjQiLCJtYXAiLDIseyIxIjpbImkzMiIsInJlYyIsMix7IjIiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19LCIzIjp7IjEiOnsibWFwIjpbImkzMiIsImk2NCIsMix7IjUiOjUsIjgiOjh9XX0sIjIiOnsibHN0IjpbInJlYyIsMix7IjEiOnsic3RyIjoiR29vZGJ5ZTQifSwiNCI6eyJpOCI6NH0sIjkiOnsiaTMyIjo0fSwiMTEiOnsiaTY0Ijo0fX0seyIxIjp7InN0ciI6IkhlbGxvMiJ9LCI0Ijp7Imk4IjoyfSwiOSI6eyJpMzIiOjJ9LCIxMSI6eyJpNjQiOjJ9fV19fX1dLCIyIjpbImkzMiIsInJlYyIsMSx7IjYiOnt9fV19XX19JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBlY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xUZXN0LnBocApAQCAtMCwwICsxLDUxOCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVEpTT05Qcm90b2NvbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByaXZhdGUgJHRyYW5zcG9ydDsKKyAgICBwcml2YXRlICRwcm90b2NvbDsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisKKyAgICAgICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKKyAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzSlNPTigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHRoaXMtPnByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woJHRoaXMtPnRyYW5zcG9ydCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXUklURSBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlICRhY3R1YWwgcmV0dXJucyB1bmVzY2FwZWQgc3RyaW5nLgorICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0byB0byBkZWNvZGUgdGhlbiBlbmNvZGUgaXQgYWdhaW4KKyAgICAgICAgICogdG8gZ2V0IHRoZSBleHBlY3RlZCBlc2NhcGVkIHVuaWNvZGUuCisgICAgICAgICAqLworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9lbmNvZGUoanNvbl9kZWNvZGUoJGFjdHVhbCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFNldF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1Xcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEVudW0nXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZldyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUkVBRCBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzNXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMyddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmczJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nNFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RCeXRlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwTWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddCisgICAgICAgICk7CisgICAgICAgICRyZXN1bHQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwTWFwX3Jlc3VsdCgpOworICAgICAgICAkcmVzdWx0LT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEluc2FuaXR5J10KKyAgICAgICAgKTsKKyAgICAgICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJbnNhbml0eV9yZXN1bHQoKTsKKyAgICAgICAgJHJlc3VsdC0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkcmVzdWx0LT5zdWNjZXNzOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2ZkODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApAQCAtMCwwICsxLDY3IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIHRlc3RcVGhyaWZ0XFByb3RvY29sOworCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJnc0pTT04gPSBhcnJheSgpOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpCisgICAgeworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddID0gJ3t9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddID0gJ3sidGhpbmciOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIn0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10gPSAneyJ0aGluZyI6InF1b3RlOiBcXFxcXCIgYmFja3NsYXNoOiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFxcXFwvICBiYWNrc3BhY2U6IFxcXFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcXFxcXFwvXFxcXGJcblxyXHQgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCJ9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ10gPSAneyJ0aGluZyI6My4xNDE1OTI2NTM1ODk4fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXSA9ICd7InRoaW5nIjoxfSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddID0gJ3sidGhpbmciOjEwNzM3NDE4MjR9JzsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7InRoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7InRoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjonIC4gcG93KDIsIDYwKSAuICd9LCJpMzJfdGhpbmciOjMyNzY4fX0nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3sidGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9JzsKKworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjoxMTUyOTIxNTA0NjA2ODQ3MDAwfSwiaTMyX3RoaW5nIjozMjc2OH19JzsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7InRoaW5nIjp7IjciOjc3LCI4Ijo4OCwiOSI6OTl9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddID0gJ3sidGhpbmciOnsiYSI6IjEyMyIsImEgYiI6IndpdGggc3BhY2VzICIsInNhbWUiOiJzYW1lIiwiMCI6Im51bWVyaWMga2V5IiwibG9uZ1ZhbHVlIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSIsIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiOiJsb25nIGtleSJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddID0gJ3sidGhpbmciOlsxLDUsNl19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3sidGhpbmciOlsxLDIsM119JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3sidGhpbmciOjF9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddID0gJ3sidGhpbmciOjY5fSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhMTM3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5waHAKQEAgLTAsMCArMSwyNTQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUZXN0XFRocmlmdFxGaXh0dXJlczsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKioKKyAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCisgKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgorICoKKyAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAorICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2xUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwcml2YXRlICR0cmFuc3BvcnQ7CisgICAgcHJpdmF0ZSAkcHJvdG9jb2w7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFVwQmVmb3JlQ2xhc3MoKQorICAgIHsKKworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisKKyAgICAgICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKKyAgICAgICAgVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHRoaXMtPnByb3RvY29sID0gbmV3IFRTaW1wbGVKU09OUHJvdG9jb2woJHRoaXMtPnRyYW5zcG9ydCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXUklURSBURVNUUworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVGVzdFZhbGlkYXRvcnMudGhyaWZ0IGIvbGliL3BocC90ZXN0L1Rlc3RWYWxpZGF0b3JzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzM4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Rlc3RWYWxpZGF0b3JzLnRocmlmdApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBwaHAgVGVzdFZhbGlkYXRvcnMKKworaW5jbHVkZSAiLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIKKwordW5pb24gVW5pb25PZlN0cmluZ3MgeworICAxOiBzdHJpbmcgYWE7CisgIDI6IHN0cmluZyBiYjsKK30KKworc2VydmljZSBUZXN0U2VydmljZSB7CisgICAgdm9pZCB0ZXN0KCkgdGhyb3dzKDE6IFRocmlmdFRlc3QuWGNlcHRpb24geGNlcHRpb24pOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI5MDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAKQEAgLTAsMCArMSwxNTQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCithYnN0cmFjdCBjbGFzcyBCYXNlVmFsaWRhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdFZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1dyaXRlVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCb25rVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1JlYWRWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzV3JpdGVWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0QVZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzUmVhZFZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNXcml0ZVZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RVbmlvbk9mU3RyaW5nc1ZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVW5pb25PZlN0cmluZ3MnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNlcnZpY2VSZXN1bHRWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vUmVhZFZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFRlc3RTZXJ2aWNlX3Rlc3RfcmVzdWx0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RSZWFkRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoIlwwMDAiKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgJGJvbmstPnJlYWQoJHByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFdyaXRlRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRib25rLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAgICAgJHRoaXMtPmZhaWwoJ0Jvbmsgd2FzIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgb2JqZWN0Jyk7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAkZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RXcml0ZVdpdGhNaXNzaW5nUmVxdWlyZWQoKQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgbm90IGFibGUgdG8gd3JpdGUgU3RydWN0QSB3aXRoIGEgbWlzc2luZyByZXF1aXJlZCBmaWVsZAorICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAkc3RydWN0YS0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgICAgICR0aGlzLT5mYWlsKCdTdHJ1Y3RBIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOworICAgICAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0UmVhZFN0cnVjdEEoKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKGJhc2U2NF9kZWNvZGUoJ0N3QUJBQUFBQTJGaVl3QT0nKSk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHN0cnVjdGEtPnJlYWQoJHByb3RvY29sKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygiYWJjIiwgJHN0cnVjdGEtPnMpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0V3JpdGVTdHJ1Y3RBKCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICRzdHJ1Y3RhLT5zID0gImFiYyI7CisgICAgICAgICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAkd3JpdGVSZXN1bHQgPSBiYXNlNjRfZW5jb2RlKCR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygnQ3dBQkFBQUFBMkZpWXdBPScsICR3cml0ZVJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnRIYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgcmVhZCB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNXcml0ZVZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnROb1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICAkcmMgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOworCisgICAgICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yUmVhZCcpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CisKKyAgICAgICAgcmV0dXJuICRyYy0+aGFzTWV0aG9kKCdfdmFsaWRhdGVGb3JXcml0ZScpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmM3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworLyoqCisgKiBDbGFzcyBUZXN0VmFsaWRhdG9ycworICogQHBhY2thZ2UgVGVzdFxUaHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yVGVzdAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwdicpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmNhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCisvKioKKyAqIENsYXNzIFRlc3RWYWxpZGF0b3JzT29wCisgKiBAcGFja2FnZSBUZXN0XFRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVmFsaWRhdG9yVGVzdE9vcCBleHRlbmRzIEJhc2VWYWxpZGF0b3JUZXN0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHB2bycpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGhyaWZ0X3Byb3RvY29sLmluaSBiL2xpYi9waHAvdGhyaWZ0X3Byb3RvY29sLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjYwZDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90aHJpZnRfcHJvdG9jb2wuaW5pCkBAIC0wLDAgKzEgQEAKK2V4dGVuc2lvbj10aHJpZnRfcHJvdG9jb2wuc28KZGlmZiAtLWdpdCBhL2xpYi9weS9DTWFrZUxpc3RzLnR4dCBiL2xpYi9weS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI5MWZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7UFlUSE9OX0lOQ0xVREVfRElSU30pCisKK2FkZF9jdXN0b21fdGFyZ2V0KHB5dGhvbl9idWlsZCBBTEwKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9IHNldHVwLnB5IGJ1aWxkCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgQ09NTUVOVCAiQnVpbGRpbmcgUHl0aG9uIGxpYnJhcnkiCispCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3Rlc3QoUHl0aG9uVGVzdFNTTFNvY2tldCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC90ZXN0X3NzbHNvY2tldC5weSkKKyAgICBhZGRfdGVzdChQeXRob25UaHJpZnRKc29uICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L3RocmlmdF9qc29uLnB5KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L01BTklGRVNULmluIGIvbGliL3B5L01BTklGRVNULmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvTUFOSUZFU1QuaW4KQEAgLTAsMCArMSBAQAoraW5jbHVkZSBzcmMvZXh0LyoKZGlmZiAtLWdpdCBhL2xpYi9weS9NYWtlZmlsZS5hbSBiL2xpYi9weS9NYWtlZmlsZS5hbQppbmRleCA2ZDNiYmVhLi41ODYxODU4IDEwMDY0NAotLS0gYS9saWIvcHkvTWFrZWZpbGUuYW0KKysrIGIvbGliL3B5L01ha2VmaWxlLmFtCkBAIC0xNiwxMSArMTYsMjEgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKLQorQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cwogREVTVERJUiA/PSAvCi1FWFRSQV9ESVNUID0gc2V0dXAucHkgc3JjCiAKLWFsbC1sb2NhbDoKK2lmIFdJVEhfUFkzCitweTMtYnVpbGQ6CisJJChQWVRIT04zKSBzZXR1cC5weSBidWlsZAorcHkzLXRlc3Q6IHB5My1idWlsZAorCSQoUFlUSE9OMykgdGVzdC90aHJpZnRfanNvbi5weQorCSQoUFlUSE9OMykgdGVzdC90ZXN0X3NzbHNvY2tldC5weQorZWxzZQorcHkzLWJ1aWxkOgorcHkzLXRlc3Q6CitlbmRpZgorCithbGwtbG9jYWw6IHB5My1idWlsZAogCSQoUFlUSE9OKSBzZXR1cC5weSBidWlsZAogCiAjIFdlJ3JlIGlnbm9yaW5nIHByZWZpeCBoZXJlIGJlY2F1c2Ugc2l0ZS1wYWNrYWdlcyBzZWVtcyB0byBiZQpAQCAtMzMsNCArNDMsMTcgQEAKIGNsZWFuLWxvY2FsOgogCSQoUk0pIC1yIGJ1aWxkCiAKLWNoZWNrLWxvY2FsOiBhbGwKK2NoZWNrLWxvY2FsOiBhbGwgcHkzLXRlc3QKKwkkKFBZVEhPTikgdGVzdC90aHJpZnRfanNvbi5weQorCSQoUFlUSE9OKSB0ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CisKK0VYVFJBX0RJU1QgPSBcCisJQ01ha2VMaXN0cy50eHQgXAorCU1BTklGRVNULmluIFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwljb21wYXQgXAorCXNldHVwLnB5IFwKKwlzZXR1cC5jZmcgXAorCXNyYyBcCisJdGVzdCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvcHkvUkVBRE1FIGIvbGliL3B5L1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3B5L1JFQURNRQpyZW5hbWUgdG8gbGliL3B5L1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3B5L2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcHkvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzU2MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw3IEBACisjIyBQeXRob24gQ29kaW5nIFN0YW5kYXJkcworCitQbGVhc2UgZm9sbG93OgorICogW1RocmlmdCBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyAqIENvZGUgU3R5bGUgZm9yIFB5dGhvbiBDb2RlIFtQRVA4XShodHRwOi8vbGVnYWN5LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTAwMDgvKQorCitXaGVuIGluIGRvdWJ0IC0gY2hlY2sgd2l0aCA8aHR0cDovL3d3dy5weWxpbnQub3JnLz4gb3Igb25saW5lIHdpdGggPGh0dHA6Ly9wZXA4b25saW5lLmNvbT4uCmRpZmYgLS1naXQgYS9saWIvcHkvY29tcGF0L3dpbjMyL3N0ZGludC5oIGIvbGliL3B5L2NvbXBhdC93aW4zMi9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDI2MDhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L2NvbXBhdC93aW4zMi9zdGRpbnQuaApAQCAtMCwwICsxLDI0NyBAQAorLy8gSVNPIEM5eCAgY29tcGxpYW50IHN0ZGludC5oIGZvciBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbworLy8gQmFzZWQgb24gSVNPL0lFQyA5ODk5OlRDMiBDb21taXR0ZWUgZHJhZnQgKE1heSA2LCAyMDA1KSBXRzE0L04xMTI0IAorLy8gCisvLyAgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggQWxleGFuZGVyIENoZW1lcmlzCisvLyAKKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLyAKKy8vICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gCisvLyAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIAorLy8gICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vIAorLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLy8gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy8vIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCisvLyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisvLyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKKy8vIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCAKKy8vIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisvLyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisvLyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaWZuZGVmIF9NU0NfVkVSIC8vIFsKKyNlcnJvciAiVXNlIHRoaXMgaGVhZGVyIG9ubHkgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKyBjb21waWxlcnMhIgorI2VuZGlmIC8vIF9NU0NfVkVSIF0KKworI2lmbmRlZiBfTVNDX1NURElOVF9IXyAvLyBbCisjZGVmaW5lIF9NU0NfU1RESU5UX0hfCisKKyNpZiBfTVNDX1ZFUiA+IDEwMDAKKyNwcmFnbWEgb25jZQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLy8gRm9yIFZpc3VhbCBTdHVkaW8gNiBpbiBDKysgbW9kZSBhbmQgZm9yIG1hbnkgVmlzdWFsIFN0dWRpbyB2ZXJzaW9ucyB3aGVuCisvLyBjb21waWxpbmcgZm9yIEFSTSB3ZSBzaG91bGQgd3JhcCA8d2NoYXIuaD4gaW5jbHVkZSB3aXRoICdleHRlcm4gIkMrKyIge30nCisvLyBvciBjb21waWxlciBnaXZlIG1hbnkgZXJyb3JzIGxpa2UgdGhpczoKKy8vICAgZXJyb3IgQzI3MzM6IHNlY29uZCBDIGxpbmthZ2Ugb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbiAnd21lbWNocicgbm90IGFsbG93ZWQKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKyMgIGluY2x1ZGUgPHdjaGFyLmg+CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvLyBEZWZpbmUgX1c2NCBtYWNyb3MgdG8gbWFyayB0eXBlcyBjaGFuZ2luZyB0aGVpciBzaXplLCBsaWtlIGludHB0cl90LgorI2lmbmRlZiBfVzY0CisjICBpZiAhZGVmaW5lZChfX21pZGwpICYmIChkZWZpbmVkKF9YODZfKSB8fCBkZWZpbmVkKF9NX0lYODYpKSAmJiBfTVNDX1ZFUiA+PSAxMzAwCisjICAgICBkZWZpbmUgX1c2NCBfX3c2NAorIyAgZWxzZQorIyAgICAgZGVmaW5lIF9XNjQKKyMgIGVuZGlmCisjZW5kaWYKKworCisvLyA3LjE4LjEgSW50ZWdlciB0eXBlcworCisvLyA3LjE4LjEuMSBFeGFjdC13aWR0aCBpbnRlZ2VyIHR5cGVzCisKKy8vIFZpc3VhbCBTdHVkaW8gNiBhbmQgRW1iZWRkZWQgVmlzdWFsIEMrKyA0IGRvZXNuJ3QKKy8vIHJlYWxpemUgdGhhdCwgZS5nLiBjaGFyIGhhcyB0aGUgc2FtZSBzaXplIGFzIF9faW50OAorLy8gc28gd2UgZ2l2ZSB1cCBvbiBfX2ludFggZm9yIHRoZW0uCisjaWYgKF9NU0NfVkVSIDwgMTMwMCkKKyAgIHR5cGVkZWYgc2lnbmVkIGNoYXIgICAgICAgaW50OF90OworICAgdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgICBpbnQxNl90OworICAgdHlwZWRlZiBzaWduZWQgaW50ICAgICAgICBpbnQzMl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICB1aW50OF90OworICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICB1aW50MTZfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgdWludDMyX3Q7CisjZWxzZQorICAgdHlwZWRlZiBzaWduZWQgX19pbnQ4ICAgICBpbnQ4X3Q7CisgICB0eXBlZGVmIHNpZ25lZCBfX2ludDE2ICAgIGludDE2X3Q7CisgICB0eXBlZGVmIHNpZ25lZCBfX2ludDMyICAgIGludDMyX3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50OCAgIHVpbnQ4X3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgIHVpbnQxNl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyICB1aW50MzJfdDsKKyNlbmRpZgordHlwZWRlZiBzaWduZWQgX19pbnQ2NCAgICAgICBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgICB1aW50NjRfdDsKKworCisvLyA3LjE4LjEuMiBNaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMKK3R5cGVkZWYgaW50OF90ICAgIGludF9sZWFzdDhfdDsKK3R5cGVkZWYgaW50MTZfdCAgIGludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIGludDMyX3QgICBpbnRfbGVhc3QzMl90OwordHlwZWRlZiBpbnQ2NF90ICAgaW50X2xlYXN0NjRfdDsKK3R5cGVkZWYgdWludDhfdCAgIHVpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIHVpbnQxNl90ICB1aW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgdWludDMyX3QgIHVpbnRfbGVhc3QzMl90OwordHlwZWRlZiB1aW50NjRfdCAgdWludF9sZWFzdDY0X3Q7CisKKy8vIDcuMTguMS4zIEZhc3Rlc3QgbWluaW11bS13aWR0aCBpbnRlZ2VyIHR5cGVzCit0eXBlZGVmIGludDhfdCAgICBpbnRfZmFzdDhfdDsKK3R5cGVkZWYgaW50MTZfdCAgIGludF9mYXN0MTZfdDsKK3R5cGVkZWYgaW50MzJfdCAgIGludF9mYXN0MzJfdDsKK3R5cGVkZWYgaW50NjRfdCAgIGludF9mYXN0NjRfdDsKK3R5cGVkZWYgdWludDhfdCAgIHVpbnRfZmFzdDhfdDsKK3R5cGVkZWYgdWludDE2X3QgIHVpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIHVpbnQzMl90ICB1aW50X2Zhc3QzMl90OwordHlwZWRlZiB1aW50NjRfdCAgdWludF9mYXN0NjRfdDsKKworLy8gNy4xOC4xLjQgSW50ZWdlciB0eXBlcyBjYXBhYmxlIG9mIGhvbGRpbmcgb2JqZWN0IHBvaW50ZXJzCisjaWZkZWYgX1dJTjY0IC8vIFsKKyAgIHR5cGVkZWYgc2lnbmVkIF9faW50NjQgICAgaW50cHRyX3Q7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgIHVpbnRwdHJfdDsKKyNlbHNlIC8vIF9XSU42NCBdWworICAgdHlwZWRlZiBfVzY0IHNpZ25lZCBpbnQgICBpbnRwdHJfdDsKKyAgIHR5cGVkZWYgX1c2NCB1bnNpZ25lZCBpbnQgdWludHB0cl90OworI2VuZGlmIC8vIF9XSU42NCBdCisKKy8vIDcuMTguMS41IEdyZWF0ZXN0LXdpZHRoIGludGVnZXIgdHlwZXMKK3R5cGVkZWYgaW50NjRfdCAgIGludG1heF90OwordHlwZWRlZiB1aW50NjRfdCAgdWludG1heF90OworCisKKy8vIDcuMTguMiBMaW1pdHMgb2Ygc3BlY2lmaWVkLXdpZHRoIGludGVnZXIgdHlwZXMKKworI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fU1REQ19MSU1JVF9NQUNST1MpIC8vIFsgICBTZWUgZm9vdG5vdGUgMjIwIGF0IHBhZ2UgMjU3IGFuZCBmb290bm90ZSAyMjEgYXQgcGFnZSAyNTkKKworLy8gNy4xOC4yLjEgTGltaXRzIG9mIGV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMKKyNkZWZpbmUgSU5UOF9NSU4gICAgICgoaW50OF90KV9JOF9NSU4pCisjZGVmaW5lIElOVDhfTUFYICAgICBfSThfTUFYCisjZGVmaW5lIElOVDE2X01JTiAgICAoKGludDE2X3QpX0kxNl9NSU4pCisjZGVmaW5lIElOVDE2X01BWCAgICBfSTE2X01BWAorI2RlZmluZSBJTlQzMl9NSU4gICAgKChpbnQzMl90KV9JMzJfTUlOKQorI2RlZmluZSBJTlQzMl9NQVggICAgX0kzMl9NQVgKKyNkZWZpbmUgSU5UNjRfTUlOICAgICgoaW50NjRfdClfSTY0X01JTikKKyNkZWZpbmUgSU5UNjRfTUFYICAgIF9JNjRfTUFYCisjZGVmaW5lIFVJTlQ4X01BWCAgICBfVUk4X01BWAorI2RlZmluZSBVSU5UMTZfTUFYICAgX1VJMTZfTUFYCisjZGVmaW5lIFVJTlQzMl9NQVggICBfVUkzMl9NQVgKKyNkZWZpbmUgVUlOVDY0X01BWCAgIF9VSTY0X01BWAorCisvLyA3LjE4LjIuMiBMaW1pdHMgb2YgbWluaW11bS13aWR0aCBpbnRlZ2VyIHR5cGVzCisjZGVmaW5lIElOVF9MRUFTVDhfTUlOICAgIElOVDhfTUlOCisjZGVmaW5lIElOVF9MRUFTVDhfTUFYICAgIElOVDhfTUFYCisjZGVmaW5lIElOVF9MRUFTVDE2X01JTiAgIElOVDE2X01JTgorI2RlZmluZSBJTlRfTEVBU1QxNl9NQVggICBJTlQxNl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUMzJfTUlOICAgSU5UMzJfTUlOCisjZGVmaW5lIElOVF9MRUFTVDMyX01BWCAgIElOVDMyX01BWAorI2RlZmluZSBJTlRfTEVBU1Q2NF9NSU4gICBJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUFYICAgSU5UNjRfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1Q4X01BWCAgIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UX0xFQVNUMTZfTUFYICBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1QzMl9NQVggIFVJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDY0X01BWCAgVUlOVDY0X01BWAorCisvLyA3LjE4LjIuMyBMaW1pdHMgb2YgZmFzdGVzdCBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMKKyNkZWZpbmUgSU5UX0ZBU1Q4X01JTiAgICBJTlQ4X01JTgorI2RlZmluZSBJTlRfRkFTVDhfTUFYICAgIElOVDhfTUFYCisjZGVmaW5lIElOVF9GQVNUMTZfTUlOICAgSU5UMTZfTUlOCisjZGVmaW5lIElOVF9GQVNUMTZfTUFYICAgSU5UMTZfTUFYCisjZGVmaW5lIElOVF9GQVNUMzJfTUlOICAgSU5UMzJfTUlOCisjZGVmaW5lIElOVF9GQVNUMzJfTUFYICAgSU5UMzJfTUFYCisjZGVmaW5lIElOVF9GQVNUNjRfTUlOICAgSU5UNjRfTUlOCisjZGVmaW5lIElOVF9GQVNUNjRfTUFYICAgSU5UNjRfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDhfTUFYICAgVUlOVDhfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDE2X01BWCAgVUlOVDE2X01BWAorI2RlZmluZSBVSU5UX0ZBU1QzMl9NQVggIFVJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUNjRfTUFYICBVSU5UNjRfTUFYCisKKy8vIDcuMTguMi40IExpbWl0cyBvZiBpbnRlZ2VyIHR5cGVzIGNhcGFibGUgb2YgaG9sZGluZyBvYmplY3QgcG9pbnRlcnMKKyNpZmRlZiBfV0lONjQgLy8gWworIyAgZGVmaW5lIElOVFBUUl9NSU4gICBJTlQ2NF9NSU4KKyMgIGRlZmluZSBJTlRQVFJfTUFYICAgSU5UNjRfTUFYCisjICBkZWZpbmUgVUlOVFBUUl9NQVggIFVJTlQ2NF9NQVgKKyNlbHNlIC8vIF9XSU42NCBdWworIyAgZGVmaW5lIElOVFBUUl9NSU4gICBJTlQzMl9NSU4KKyMgIGRlZmluZSBJTlRQVFJfTUFYICAgSU5UMzJfTUFYCisjICBkZWZpbmUgVUlOVFBUUl9NQVggIFVJTlQzMl9NQVgKKyNlbmRpZiAvLyBfV0lONjQgXQorCisvLyA3LjE4LjIuNSBMaW1pdHMgb2YgZ3JlYXRlc3Qtd2lkdGggaW50ZWdlciB0eXBlcworI2RlZmluZSBJTlRNQVhfTUlOICAgSU5UNjRfTUlOCisjZGVmaW5lIElOVE1BWF9NQVggICBJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVE1BWF9NQVggIFVJTlQ2NF9NQVgKKworLy8gNy4xOC4zIExpbWl0cyBvZiBvdGhlciBpbnRlZ2VyIHR5cGVzCisKKyNpZmRlZiBfV0lONjQgLy8gWworIyAgZGVmaW5lIFBUUkRJRkZfTUlOICBfSTY0X01JTgorIyAgZGVmaW5lIFBUUkRJRkZfTUFYICBfSTY0X01BWAorI2Vsc2UgIC8vIF9XSU42NCBdWworIyAgZGVmaW5lIFBUUkRJRkZfTUlOICBfSTMyX01JTgorIyAgZGVmaW5lIFBUUkRJRkZfTUFYICBfSTMyX01BWAorI2VuZGlmICAvLyBfV0lONjQgXQorCisjZGVmaW5lIFNJR19BVE9NSUNfTUlOICBJTlRfTUlOCisjZGVmaW5lIFNJR19BVE9NSUNfTUFYICBJTlRfTUFYCisKKyNpZm5kZWYgU0laRV9NQVggLy8gWworIyAgaWZkZWYgX1dJTjY0IC8vIFsKKyMgICAgIGRlZmluZSBTSVpFX01BWCAgX1VJNjRfTUFYCisjICBlbHNlIC8vIF9XSU42NCBdWworIyAgICAgZGVmaW5lIFNJWkVfTUFYICBfVUkzMl9NQVgKKyMgIGVuZGlmIC8vIF9XSU42NCBdCisjZW5kaWYgLy8gU0laRV9NQVggXQorCisvLyBXQ0hBUl9NSU4gYW5kIFdDSEFSX01BWCBhcmUgYWxzbyBkZWZpbmVkIGluIDx3Y2hhci5oPgorI2lmbmRlZiBXQ0hBUl9NSU4gLy8gWworIyAgZGVmaW5lIFdDSEFSX01JTiAgMAorI2VuZGlmICAvLyBXQ0hBUl9NSU4gXQorI2lmbmRlZiBXQ0hBUl9NQVggLy8gWworIyAgZGVmaW5lIFdDSEFSX01BWCAgX1VJMTZfTUFYCisjZW5kaWYgIC8vIFdDSEFSX01BWCBdCisKKyNkZWZpbmUgV0lOVF9NSU4gIDAKKyNkZWZpbmUgV0lOVF9NQVggIF9VSTE2X01BWAorCisjZW5kaWYgLy8gX19TVERDX0xJTUlUX01BQ1JPUyBdCisKKworLy8gNy4xOC40IExpbWl0cyBvZiBvdGhlciBpbnRlZ2VyIHR5cGVzCisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfQ09OU1RBTlRfTUFDUk9TKSAvLyBbICAgU2VlIGZvb3Rub3RlIDIyNCBhdCBwYWdlIDI2MAorCisvLyA3LjE4LjQuMSBNYWNyb3MgZm9yIG1pbmltdW0td2lkdGggaW50ZWdlciBjb25zdGFudHMKKworI2RlZmluZSBJTlQ4X0ModmFsKSAgdmFsIyNpOAorI2RlZmluZSBJTlQxNl9DKHZhbCkgdmFsIyNpMTYKKyNkZWZpbmUgSU5UMzJfQyh2YWwpIHZhbCMjaTMyCisjZGVmaW5lIElOVDY0X0ModmFsKSB2YWwjI2k2NAorCisjZGVmaW5lIFVJTlQ4X0ModmFsKSAgdmFsIyN1aTgKKyNkZWZpbmUgVUlOVDE2X0ModmFsKSB2YWwjI3VpMTYKKyNkZWZpbmUgVUlOVDMyX0ModmFsKSB2YWwjI3VpMzIKKyNkZWZpbmUgVUlOVDY0X0ModmFsKSB2YWwjI3VpNjQKKworLy8gNy4xOC40LjIgTWFjcm9zIGZvciBncmVhdGVzdC13aWR0aCBpbnRlZ2VyIGNvbnN0YW50cworI2RlZmluZSBJTlRNQVhfQyAgIElOVDY0X0MKKyNkZWZpbmUgVUlOVE1BWF9DICBVSU5UNjRfQworCisjZW5kaWYgLy8gX19TVERDX0NPTlNUQU5UX01BQ1JPUyBdCisKKworI2VuZGlmIC8vIF9NU0NfU1RESU5UX0hfIF0KZGlmZiAtLWdpdCBhL2xpYi9weS9zZXR1cC5jZmcgYi9saWIvcHkvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZWQwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsNiBAQAorW2luc3RhbGxdCitvcHRpbWl6ZSA9IDEKK1ttZXRhZGF0YV0KK2Rlc2NyaXB0aW9uLWZpbGUgPSBSRUFETUUubWQKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL2xpYi9weS9zZXR1cC5weSBiL2xpYi9weS9zZXR1cC5weQppbmRleCBkMTExYmIxLi4zY2YxNDY5IDEwMDY0NAotLS0gYS9saWIvcHkvc2V0dXAucHkKKysrIGIvbGliL3B5L3NldHVwLnB5CkBAIC0xOSwyNiArMTksMTIxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCitpbXBvcnQgc3lzCit0cnk6CisgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCitleGNlcHQgRXhjZXB0aW9uOgorICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KIAotZmFzdGJpbmFyeW1vZCA9IEV4dGVuc2lvbigndGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnknLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzID0gWydzcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jJ10sCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0Citmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKKworIyBGaXggdG8gYnVpbGQgc2Rpc3QgdW5kZXIgdmFncmFudAoraW1wb3J0IG9zCitpZiAndmFncmFudCcgaW4gc3RyKG9zLmVudmlyb24pOgorICAgIHRyeToKKyAgICAgICAgZGVsIG9zLmxpbmsKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKKworaW5jbHVkZV9kaXJzID0gWydzcmMnXQoraWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgaW5jbHVkZV9kaXJzLmFwcGVuZCgnY29tcGF0L3dpbjMyJykKKyAgICBleHRfZXJyb3JzID0gKENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIElPRXJyb3IpCitlbHNlOgorICAgIGV4dF9lcnJvcnMgPSAoQ0NvbXBpbGVyRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcikKKworCitjbGFzcyBCdWlsZEZhaWxlZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyB2ZV9idWlsZF9leHQoYnVpbGRfZXh0KToKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWlsZF9leHQucnVuKHNlbGYpCisgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yOgorICAgICAgICAgICAgcmFpc2UgQnVpbGRGYWlsZWQoKQorCisgICAgZGVmIGJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWlsZF9leHQuYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCkKKyAgICAgICAgZXhjZXB0IGV4dF9lcnJvcnM6CisgICAgICAgICAgICByYWlzZSBCdWlsZEZhaWxlZCgpCisKKworZGVmIHJ1bl9zZXR1cCh3aXRoX2JpbmFyeSk6CisgICAgaWYgd2l0aF9iaW5hcnk6CisgICAgICAgIGV4dGVuc2lvbnMgPSBkaWN0KAorICAgICAgICAgICAgZXh0X21vZHVsZXM9WworICAgICAgICAgICAgICAgIEV4dGVuc2lvbigndGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L21vZHVsZS5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvdHlwZXMuY3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L2JpbmFyeS5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvY29tcGFjdC5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgY21kY2xhc3M9ZGljdChidWlsZF9leHQ9dmVfYnVpbGRfZXh0KQorICAgICAgICApCisgICAgZWxzZToKKyAgICAgICAgZXh0ZW5zaW9ucyA9IGRpY3QoKQogCi1zZXR1cChuYW1lID0gJ1RocmlmdCcsCi0gICAgICB2ZXJzaW9uID0gJzAuMScsCi0gICAgICBkZXNjcmlwdGlvbiA9ICdUaHJpZnQgUHl0aG9uIExpYnJhcmllcycsCi0gICAgICBhdXRob3IgPSBbJ1RocmlmdCBEZXZlbG9wZXJzJ10sCi0gICAgICBhdXRob3JfZW1haWwgPSBbJ3RocmlmdC1kZXZAaW5jdWJhdG9yLmFwYWNoZS5vcmcnXSwKLSAgICAgIHVybCA9ICdodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvdGhyaWZ0LycsCi0gICAgICBsaWNlbnNlID0gJ0FwYWNoZSBMaWNlbnNlIDIuMCcsCi0gICAgICBwYWNrYWdlcyA9IFsKLSAgICAgICAgJ3RocmlmdCcsCi0gICAgICAgICd0aHJpZnQucHJvdG9jb2wnLAotICAgICAgICAndGhyaWZ0LnRyYW5zcG9ydCcsCi0gICAgICAgICd0aHJpZnQuc2VydmVyJywKLSAgICAgIF0sCi0gICAgICBwYWNrYWdlX2RpciA9IHsndGhyaWZ0JyA6ICdzcmMnfSwKLSAgICAgIGV4dF9tb2R1bGVzID0gW2Zhc3RiaW5hcnltb2RdLAotICAgICAgKQorICAgIHNzbF9kZXBzID0gW10KKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgIHNzbF9kZXBzLmFwcGVuZCgnaXBhZGRyZXNzJykKKyAgICBpZiBzeXMuaGV4dmVyc2lvbiA8IDB4MDMwNTAwMDA6CisgICAgICAgIHNzbF9kZXBzLmFwcGVuZCgnYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZT49My41JykKKyAgICB0b3JuYWRvX2RlcHMgPSBbJ3Rvcm5hZG8+PTQuMCddCisgICAgdHdpc3RlZF9kZXBzID0gWyd0d2lzdGVkJ10KIAorICAgIHNldHVwKG5hbWU9J3RocmlmdCcsCisgICAgICAgICAgdmVyc2lvbj0nMS4wLjAnLAorICAgICAgICAgIGRlc2NyaXB0aW9uPSdQeXRob24gYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0nLAorICAgICAgICAgIGF1dGhvcj0nQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJywKKyAgICAgICAgICBhdXRob3JfZW1haWw9J2RldkB0aHJpZnQuYXBhY2hlLm9yZycsCisgICAgICAgICAgdXJsPSdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAorICAgICAgICAgIGxpY2Vuc2U9J0FwYWNoZSBMaWNlbnNlIDIuMCcsCisgICAgICAgICAgaW5zdGFsbF9yZXF1aXJlcz1bJ3NpeD49MS43LjInXSwKKyAgICAgICAgICBleHRyYXNfcmVxdWlyZT17CisgICAgICAgICAgICAgICdzc2wnOiBzc2xfZGVwcywKKyAgICAgICAgICAgICAgJ3Rvcm5hZG8nOiB0b3JuYWRvX2RlcHMsCisgICAgICAgICAgICAgICd0d2lzdGVkJzogdHdpc3RlZF9kZXBzLAorICAgICAgICAgICAgICAnYWxsJzogc3NsX2RlcHMgKyB0b3JuYWRvX2RlcHMgKyB0d2lzdGVkX2RlcHMsCisgICAgICAgICAgfSwKKyAgICAgICAgICBwYWNrYWdlcz1bCisgICAgICAgICAgICAgICd0aHJpZnQnLAorICAgICAgICAgICAgICAndGhyaWZ0LnByb3RvY29sJywKKyAgICAgICAgICAgICAgJ3RocmlmdC50cmFuc3BvcnQnLAorICAgICAgICAgICAgICAndGhyaWZ0LnNlcnZlcicsCisgICAgICAgICAgXSwKKyAgICAgICAgICBwYWNrYWdlX2Rpcj17J3RocmlmdCc6ICdzcmMnfSwKKyAgICAgICAgICBjbGFzc2lmaWVycz1bCisgICAgICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlJywKKyAgICAgICAgICAgICAgJ0Vudmlyb25tZW50IDo6IENvbnNvbGUnLAorICAgICAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24nLAorICAgICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDInLAorICAgICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMnLAorICAgICAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKKyAgICAgICAgICAgICAgJ1RvcGljIDo6IFN5c3RlbSA6OiBOZXR3b3JraW5nJworICAgICAgICAgIF0sCisgICAgICAgICAgemlwX3NhZmU9RmFsc2UsCisgICAgICAgICAgKipleHRlbnNpb25zCisgICAgICAgICAgKQorCisKK3RyeToKKyAgICB3aXRoX2JpbmFyeSA9IFRydWUKKyAgICBydW5fc2V0dXAod2l0aF9iaW5hcnkpCitleGNlcHQgQnVpbGRGYWlsZWQ6CisgICAgcHJpbnQoKQorICAgIHByaW50KCcqJyAqIDgwKQorICAgIHByaW50KCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gY29tcGlsZSB3aXRoIHRoZSBDIGV4dGVuc2lvbiBlbmFibGVkIikKKyAgICBwcmludCgiQXR0ZW1wdGluZyB0byBidWlsZCB3aXRob3V0IHRoZSBleHRlbnNpb24gbm93IikKKyAgICBwcmludCgnKicgKiA4MCkKKyAgICBwcmludCgpCisKKyAgICBydW5fc2V0dXAoRmFsc2UpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weSBiL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzVhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQpAQCAtMCwwICsxLDU0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yLCBUTWVzc2FnZVR5cGUsIFRFeGNlcHRpb24KK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xEZWNvcmF0b3IsIFRNdWx0aXBsZXhlZFByb3RvY29sCisKKworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yKFRQcm9jZXNzb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2aWNlcyA9IHt9CisKKyAgICBkZWYgcmVnaXN0ZXJQcm9jZXNzb3Ioc2VsZiwgc2VydmljZU5hbWUsIHByb2Nlc3Nvcik6CisgICAgICAgIHNlbGYuc2VydmljZXNbc2VydmljZU5hbWVdID0gcHJvY2Vzc29yCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOgorICAgICAgICAobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIGlmIHR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwgYW5kIHR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWToKKyAgICAgICAgICAgIHJhaXNlIFRFeGNlcHRpb24oIlRNdWx0aXBsZXhlZCBwcm90b2NvbCBvbmx5IHN1cHBvcnRzIENBTEwgJiBPTkVXQVkiKQorCisgICAgICAgIGluZGV4ID0gbmFtZS5maW5kKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUikKKyAgICAgICAgaWYgaW5kZXggPCAwOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICIgKyBuYW1lICsgIi4gRGlkIHlvdSBmb3JnZXQgdG8gdXNlIFRNdWx0aXBsZXhlZFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCisKKyAgICAgICAgc2VydmljZU5hbWUgPSBuYW1lWzA6aW5kZXhdCisgICAgICAgIGNhbGwgPSBuYW1lW2luZGV4ICsgbGVuKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik6XQorICAgICAgICBpZiBzZXJ2aWNlTmFtZSBub3QgaW4gc2VsZi5zZXJ2aWNlczoKKyAgICAgICAgICAgIHJhaXNlIFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICIgKyBzZXJ2aWNlTmFtZSArICIuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKQorCisgICAgICAgIHN0YW5kYXJkTWVzc2FnZSA9IChjYWxsLCB0eXBlLCBzZXFpZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VydmljZXNbc2VydmljZU5hbWVdLnByb2Nlc3MoU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBzdGFuZGFyZE1lc3NhZ2UpLCBvcHJvdCkKKworCitjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBtZXNzYWdlQmVnaW4pOgorICAgICAgICBzZWxmLm1lc3NhZ2VCZWdpbiA9IG1lc3NhZ2VCZWdpbgorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1lc3NhZ2VCZWdpbgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UUmVjdXJzaXZlLnB5IGIvbGliL3B5L3NyYy9UUmVjdXJzaXZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjIwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkKQEAgLTAsMCArMSw4MyBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscworCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRUeXBlCisKK1RZUEVfSURYID0gMQorU1BFQ19BUkdTX0lEWCA9IDMKK1NQRUNfQVJHU19DTEFTU19SRUZfSURYID0gMAorU1BFQ19BUkdTX1RIUklGVF9TUEVDX0lEWCA9IDEKKworCitkZWYgZml4X3NwZWMoYWxsX3N0cnVjdHMpOgorICAgICIiIldpcmUgdXAgcmVjdXJzaXZlIHJlZmVyZW5jZXMgZm9yIGFsbCBUU3RydWN0IGRlZmluaXRpb25zIGluc2lkZSBvZiBlYWNoIHRocmlmdF9zcGVjLiIiIgorICAgIGZvciBzdHJ1YyBpbiBhbGxfc3RydWN0czoKKyAgICAgICAgc3BlYyA9IHN0cnVjLnRocmlmdF9zcGVjCisgICAgICAgIGZvciB0aHJpZnRfc3BlYyBpbiBzcGVjOgorICAgICAgICAgICAgaWYgdGhyaWZ0X3NwZWMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgICAgIG90aGVyID0gdGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF1bU1BFQ19BUkdTX0NMQVNTX1JFRl9JRFhdLnRocmlmdF9zcGVjCisgICAgICAgICAgICAgICAgdGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF1bU1BFQ19BUkdTX1RIUklGVF9TUEVDX0lEWF0gPSBvdGhlcgorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgICAgICAgICAgX2ZpeF9saXN0X29yX3NldCh0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXSkKKyAgICAgICAgICAgIGVsaWYgdGhyaWZ0X3NwZWNbVFlQRV9JRFhdID09IFRUeXBlLk1BUDoKKyAgICAgICAgICAgICAgICBfZml4X21hcCh0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXSkKKworCitkZWYgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGUpOgorICAgICMgRm9yIGEgbGlzdCBvciBzZXQsIHRoZSB0aHJpZnRfc3BlYyBlbnRyeSBsb29rcyBsaWtlLAorICAgICMgKDEsIFRUeXBlLkxJU1QsICdsaXN0ZXInLCAoVFR5cGUuU1RSVUNULCBbUmVjTGlzdCwgTm9uZV0sIEZhbHNlKSwgTm9uZSwgKSwgICMgMQorICAgICMgc28gYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLlNUUlVDVCwgW1JlY0xpc3QsIE5vbmVdLCBGYWxzZSkKKyAgICBpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICBlbGVtZW50X3R5cGVbMV1bMV0gPSBlbGVtZW50X3R5cGVbMV1bMF0udGhyaWZ0X3NwZWMKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGVbMV0pCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuTUFQOgorICAgICAgICBfZml4X21hcChlbGVtZW50X3R5cGVbMV0pCisKKworZGVmIF9maXhfbWFwKGVsZW1lbnRfdHlwZSk6CisgICAgIyBGb3IgYSBtYXAgb2Yga2V5IC0+IHZhbHVlIHR5cGUsIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLlNUUlVDVCwgW1JlY01hcEJhc2ljLCBOb25lXSwgRmFsc2UpLCBOb25lLCApCisgICAgIyB3aGljaCBpcyBqdXN0IGEgbm9ybWFsIHN0cnVjdCBkZWZpbml0aW9uLgorICAgICMKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gbGlzdCAvIHNldCwgYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuTElTVCwgKFRUeXBlLlNUUlVDVCwgW1JlY01hcExpc3QsIE5vbmVdLCBGYWxzZSksIEZhbHNlKQorICAgICMgYW5kIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgM3JkIGVsZW1lbnQgYXMgYSBsaXN0LgorICAgICMKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gbWFwLCBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5NQVAsIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLlNUUlVDVCwKKyAgICAjICBbUmVjTWFwTWFwLCBOb25lXSwgRmFsc2UpLCBGYWxzZSkKKyAgICAjIGFuZCBuZWVkIHRvIHByb2Nlc3MgM3JkIGVsZW1lbnQgYXMgYSBtYXAuCisKKyAgICAjIElzIHRoZSBtYXAga2V5IGEgc3RydWN0PworICAgIGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVsxXVsxXSA9IGVsZW1lbnRfdHlwZVsxXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzBdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVsxXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVsxXSkKKworICAgICMgSXMgdGhlIG1hcCB2YWx1ZSBhIHN0cnVjdD8KKyAgICBpZiBlbGVtZW50X3R5cGVbMl0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICBlbGVtZW50X3R5cGVbM11bMV0gPSBlbGVtZW50X3R5cGVbM11bMF0udGhyaWZ0X3NwZWMKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVsyXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGVbM10pCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMl0gPT0gVFR5cGUuTUFQOgorICAgICAgICBfZml4X21hcChlbGVtZW50X3R5cGVbM10pCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RTQ29ucy5weSBiL2xpYi9weS9zcmMvVFNDb25zLnB5CmluZGV4IDI0MDQ2MjUuLmJjNjdkNzAgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvVFNDb25zLnB5CisrKyBiL2xpYi9weS9zcmMvVFNDb25zLnB5CkBAIC0xOSwxNSArMTksMTggQEAKIAogZnJvbSBvcyBpbXBvcnQgcGF0aAogZnJvbSBTQ29ucy5CdWlsZGVyIGltcG9ydCBCdWlsZGVyCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgbWFwCisKIAogZGVmIHNjb25zX2VudihlbnYsIGFkZD0nJyk6Ci0gIG9wYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguYWJzcGF0aCgnJFRBUkdFVCcpKQotICBsc3RyID0gJ3RocmlmdCAtLWdlbiBjcHAgLW8gJyArIG9wYXRoICsgJyAnICsgYWRkICsgJyAkU09VUkNFJwotICBjcHBidWlsZCA9IEJ1aWxkZXIoYWN0aW9uID0gbHN0cikKLSAgZW52LkFwcGVuZChCVUlMREVSUyA9IHsnVGhyaWZ0Q3BwJyA6IGNwcGJ1aWxkfSkKKyAgICBvcGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmFic3BhdGgoJyRUQVJHRVQnKSkKKyAgICBsc3RyID0gJ3RocmlmdCAtLWdlbiBjcHAgLW8gJyArIG9wYXRoICsgJyAnICsgYWRkICsgJyAkU09VUkNFJworICAgIGNwcGJ1aWxkID0gQnVpbGRlcihhY3Rpb249bHN0cikKKyAgICBlbnYuQXBwZW5kKEJVSUxERVJTPXsnVGhyaWZ0Q3BwJzogY3BwYnVpbGR9KQorCiAKIGRlZiBnZW5fY3BwKGVudiwgZGlyLCBmaWxlKToKLSAgc2NvbnNfZW52KGVudikKLSAgc3VmZml4ZXMgPSBbJ190eXBlcy5oJywgJ190eXBlcy5jcHAnXQotICB0YXJnZXRzID0gbWFwKGxhbWJkYSBzOiAnZ2VuLWNwcC8nICsgZmlsZSArIHMsIHN1ZmZpeGVzKQotICByZXR1cm4gZW52LlRocmlmdENwcCh0YXJnZXRzLCBkaXIrZmlsZSsnLnRocmlmdCcpCisgICAgc2NvbnNfZW52KGVudikKKyAgICBzdWZmaXhlcyA9IFsnX3R5cGVzLmgnLCAnX3R5cGVzLmNwcCddCisgICAgdGFyZ2V0cyA9IG1hcChsYW1iZGEgczogJ2dlbi1jcHAvJyArIGZpbGUgKyBzLCBzdWZmaXhlcykKKyAgICByZXR1cm4gZW52LlRocmlmdENwcCh0YXJnZXRzLCBkaXIgKyBmaWxlICsgJy50aHJpZnQnKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weSBiL2xpYi9weS9zcmMvVFNlcmlhbGl6YXRpb24ucHkKaW5kZXggYjE5Zjk4YS4uZmJiZTc2OCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weQorKysgYi9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5CkBAIC0xNywxOCArMTcsMjIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gcHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gLnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gLnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCi1kZWYgc2VyaWFsaXplKHRocmlmdF9vYmplY3QsIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKToKKworZGVmIHNlcmlhbGl6ZSh0aHJpZnRfb2JqZWN0LAorICAgICAgICAgICAgICBwcm90b2NvbF9mYWN0b3J5PVRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOgogICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCiAgICAgcHJvdG9jb2wgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCkKICAgICB0aHJpZnRfb2JqZWN0LndyaXRlKHByb3RvY29sKQogICAgIHJldHVybiB0cmFuc3BvcnQuZ2V0dmFsdWUoKQogCi1kZWYgZGVzZXJpYWxpemUoYmFzZSwgYnVmLCBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk6CisKK2RlZiBkZXNlcmlhbGl6ZShiYXNlLAorICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICBwcm90b2NvbF9mYWN0b3J5PVRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOgogICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihidWYpCiAgICAgcHJvdG9jb2wgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCkKICAgICBiYXNlLnJlYWQocHJvdG9jb2wpCiAgICAgcmV0dXJuIGJhc2UKLQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UVG9ybmFkby5weSBiL2xpYi9weS9zcmMvVFRvcm5hZG8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmZjExZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvVFRvcm5hZG8ucHkKQEAgLTAsMCArMSwxODggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdHJ1Y3QKKworZnJvbSAudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24sIFRUcmFuc3BvcnRCYXNlLCBUTWVtb3J5QnVmZmVyCisKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCitmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbiwgaW9zdHJlYW0sIGlvbG9vcCwgdGNwc2VydmVyLCBjb25jdXJyZW50CisKK19fYWxsX18gPSBbJ1RUb3JuYWRvU2VydmVyJywgJ1RUb3JuYWRvU3RyZWFtVHJhbnNwb3J0J10KKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKKworY2xhc3MgX0xvY2sob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3dhaXRlcnMgPSBkZXF1ZSgpCisKKyAgICBkZWYgYWNxdWlyZWQoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fd2FpdGVycykgPiAwCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiBhY3F1aXJlKHNlbGYpOgorICAgICAgICBibG9ja2VyID0gc2VsZi5fd2FpdGVyc1stMV0gaWYgc2VsZi5hY3F1aXJlZCgpIGVsc2UgTm9uZQorICAgICAgICBmdXR1cmUgPSBjb25jdXJyZW50LkZ1dHVyZSgpCisgICAgICAgIHNlbGYuX3dhaXRlcnMuYXBwZW5kKGZ1dHVyZSkKKyAgICAgICAgaWYgYmxvY2tlcjoKKyAgICAgICAgICAgIHlpZWxkIGJsb2NrZXIKKworICAgICAgICByYWlzZSBnZW4uUmV0dXJuKHNlbGYuX2xvY2tfY29udGV4dCgpKQorCisgICAgZGVmIHJlbGVhc2Uoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLmFjcXVpcmVkKCksICdMb2NrIG5vdCBhcXVpcmVkJworICAgICAgICBmdXR1cmUgPSBzZWxmLl93YWl0ZXJzLnBvcGxlZnQoKQorICAgICAgICBmdXR1cmUuc2V0X3Jlc3VsdChOb25lKQorCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIF9sb2NrX2NvbnRleHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisKK2NsYXNzIFRUb3JuYWRvU3RyZWFtVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlKToKKyAgICAiIiJhIGZyYW1lZCwgYnVmZmVyZWQgdHJhbnNwb3J0IG92ZXIgYSBUb3JuYWRvIHN0cmVhbSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCBzdHJlYW09Tm9uZSwgaW9fbG9vcD1Ob25lKToKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuaW9fbG9vcCA9IGlvX2xvb3Agb3IgaW9sb29wLklPTG9vcC5jdXJyZW50KCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgc2VsZi5fcmVhZF9sb2NrID0gX0xvY2soKQorCisgICAgICAgICMgc2VydmVycyBwcm92aWRlIGEgcmVhZHktdG8tZ28gc3RyZWFtCisgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisKKyAgICBkZWYgd2l0aF90aW1lb3V0KHNlbGYsIHRpbWVvdXQsIGZ1dHVyZSk6CisgICAgICAgIHJldHVybiBnZW4ud2l0aF90aW1lb3V0KHRpbWVvdXQsIGZ1dHVyZSwgc2VsZi5pb19sb29wKQorCisgICAgQGdlbi5jb3JvdXRpbmUKKyAgICBkZWYgb3BlbihzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBsb2dnZXIuZGVidWcoJ3NvY2tldCBjb25uZWN0aW5nJykKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSwgMCkKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBpb3N0cmVhbS5JT1N0cmVhbShzb2NrKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbm5lY3QgPSBzZWxmLnN0cmVhbS5jb25uZWN0KChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCisgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYud2l0aF90aW1lb3V0KHRpbWVvdXQsIGNvbm5lY3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIGNvbm5lY3QKKyAgICAgICAgZXhjZXB0IChzb2NrZXQuZXJyb3IsIElPRXJyb3IsIGlvbG9vcC5UaW1lb3V0RXJyb3IpIGFzIGU6CisgICAgICAgICAgICBtZXNzYWdlID0gJ2NvdWxkIG5vdCBjb25uZWN0IHRvIHt9Ont9ICh7fSknLmZvcm1hdChzZWxmLmhvc3QsIHNlbGYucG9ydCwgZSkKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9bWVzc2FnZSkKKworICAgICAgICByYWlzZSBnZW4uUmV0dXJuKHNlbGYpCisKKyAgICBkZWYgc2V0X2Nsb3NlX2NhbGxiYWNrKHNlbGYsIGNhbGxiYWNrKToKKyAgICAgICAgIiIiCisgICAgICAgIFNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlciBvcGVuKCkgcmV0dXJucworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zdHJlYW0uc2V0X2Nsb3NlX2NhbGxiYWNrKGNhbGxiYWNrKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAjIGRvbid0IHJhaXNlIGlmIHdlIGludGVuZCB0byBjbG9zZQorICAgICAgICBzZWxmLnN0cmVhbS5zZXRfY2xvc2VfY2FsbGJhY2soTm9uZSkKKyAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorCisgICAgZGVmIHJlYWQoc2VsZiwgXyk6CisgICAgICAgICMgVGhlIGdlbmVyYXRlZCBjb2RlIGZvciBUb3JuYWRvIHNob3VsZG4ndCBkbyBpbmRpdmlkdWFsIHJlYWRzIC0tIG9ubHkKKyAgICAgICAgIyBmcmFtZXMgYXQgYSB0aW1lCisgICAgICAgIGFzc2VydCBGYWxzZSwgInlvdSdyZSBkb2luZyBpdCB3cm9uZyIKKworICAgIEBjb250ZXh0bWFuYWdlcgorICAgIGRlZiBpb19leGNlcHRpb25fY29udGV4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgZXhjZXB0IChzb2NrZXQuZXJyb3IsIElPRXJyb3IpIGFzIGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlPXN0cihlKSkKKyAgICAgICAgZXhjZXB0IGlvc3RyZWFtLlN0cmVhbUJ1ZmZlckZ1bGxFcnJvciBhcyBlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlPXN0cihlKSkKKworICAgIEBnZW4uY29yb3V0aW5lCisgICAgZGVmIHJlYWRGcmFtZShzZWxmKToKKyAgICAgICAgIyBJT1N0cmVhbSBwcm9jZXNzZXMgcmVhZHMgb25lIGF0IGEgdGltZQorICAgICAgICB3aXRoICh5aWVsZCBzZWxmLl9yZWFkX2xvY2suYWNxdWlyZSgpKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5pb19leGNlcHRpb25fY29udGV4dCgpOgorICAgICAgICAgICAgICAgIGZyYW1lX2hlYWRlciA9IHlpZWxkIHNlbGYuc3RyZWFtLnJlYWRfYnl0ZXMoNCkKKyAgICAgICAgICAgICAgICBpZiBsZW4oZnJhbWVfaGVhZGVyKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBpb3N0cmVhbS5TdHJlYW1DbG9zZWRFcnJvcignUmVhZCB6ZXJvIGJ5dGVzIGZyb20gc3RyZWFtJykKKyAgICAgICAgICAgICAgICBmcmFtZV9sZW5ndGgsID0gc3RydWN0LnVucGFjaygnIWknLCBmcmFtZV9oZWFkZXIpCisgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCBzZWxmLnN0cmVhbS5yZWFkX2J5dGVzKGZyYW1lX2xlbmd0aCkKKyAgICAgICAgICAgICAgICByYWlzZSBnZW4uUmV0dXJuKGZyYW1lKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgZnJhbWUgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCisgICAgICAgIGZyYW1lX2xlbmd0aCA9IHN0cnVjdC5wYWNrKCchaScsIGxlbihmcmFtZSkpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCisgICAgICAgIHdpdGggc2VsZi5pb19leGNlcHRpb25fY29udGV4dCgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RyZWFtLndyaXRlKGZyYW1lX2xlbmd0aCArIGZyYW1lKQorCisKK2NsYXNzIFRUb3JuYWRvU2VydmVyKHRjcHNlcnZlci5UQ1BTZXJ2ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoVFRvcm5hZG9TZXJ2ZXIsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICBzZWxmLl9wcm9jZXNzb3IgPSBwcm9jZXNzb3IKKyAgICAgICAgc2VsZi5faXByb3RfZmFjdG9yeSA9IGlwcm90X2ZhY3RvcnkKKyAgICAgICAgc2VsZi5fb3Byb3RfZmFjdG9yeSA9IChvcHJvdF9mYWN0b3J5IGlmIG9wcm90X2ZhY3RvcnkgaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlwcm90X2ZhY3RvcnkpCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiBoYW5kbGVfc3RyZWFtKHNlbGYsIHN0cmVhbSwgYWRkcmVzcyk6CisgICAgICAgIGhvc3QsIHBvcnQgPSBhZGRyZXNzWzoyXQorICAgICAgICB0cmFucyA9IFRUb3JuYWRvU3RyZWFtVHJhbnNwb3J0KGhvc3Q9aG9zdCwgcG9ydD1wb3J0LCBzdHJlYW09c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvX2xvb3A9c2VsZi5pb19sb29wKQorICAgICAgICBvcHJvdCA9IHNlbGYuX29wcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgbm90IHRyYW5zLnN0cmVhbS5jbG9zZWQoKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZyYW1lID0geWllbGQgdHJhbnMucmVhZEZyYW1lKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLnR5cGUgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHRyID0gVE1lbW9yeUJ1ZmZlcihmcmFtZSkKKyAgICAgICAgICAgICAgICBpcHJvdCA9IHNlbGYuX2lwcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHIpCisgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5fcHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigndGhyaWZ0IGV4Y2VwdGlvbiBpbiBoYW5kbGVfc3RyZWFtJykKKyAgICAgICAgICAgIHRyYW5zLmNsb3NlKCkKKworICAgICAgICBsb2dnZXIuaW5mbygnY2xpZW50IGRpc2Nvbm5lY3RlZCAlczolZCcsIGhvc3QsIHBvcnQpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RocmlmdC5weSBiL2xpYi9weS9zcmMvVGhyaWZ0LnB5CmluZGV4IDVmMjU2NGQuLjAwOTQxZDggMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvVGhyaWZ0LnB5CisrKyBiL2xpYi9weS9zcmMvVGhyaWZ0LnB5CkBAIC0xOSwxMTUgKzE5LDE3NCBAQAogCiBpbXBvcnQgc3lzCiAKLWNsYXNzIFRUeXBlOgotICBTVE9QICAgPSAwCi0gIFZPSUQgICA9IDEKLSAgQk9PTCAgID0gMgotICBCWVRFICAgPSAzCi0gIEkwOCAgICA9IDMKLSAgRE9VQkxFID0gNAotICBJMTYgICAgPSA2Ci0gIEkzMiAgICA9IDgKLSAgSTY0ICAgID0gMTAKLSAgU1RSSU5HID0gMTEKLSAgVVRGNyAgID0gMTEKLSAgU1RSVUNUID0gMTIKLSAgTUFQICAgID0gMTMKLSAgU0VUICAgID0gMTQKLSAgTElTVCAgID0gMTUKLSAgVVRGOCAgID0gMTYKLSAgVVRGMTYgID0gMTcKIAotY2xhc3MgVE1lc3NhZ2VUeXBlOgotICBDQUxMICA9IDEKLSAgUkVQTFkgPSAyCi0gIEVYQ0VQVElPTiA9IDMKLSAgT05FV0FZID0gNAorY2xhc3MgVFR5cGUob2JqZWN0KToKKyAgICBTVE9QID0gMAorICAgIFZPSUQgPSAxCisgICAgQk9PTCA9IDIKKyAgICBCWVRFID0gMworICAgIEkwOCA9IDMKKyAgICBET1VCTEUgPSA0CisgICAgSTE2ID0gNgorICAgIEkzMiA9IDgKKyAgICBJNjQgPSAxMAorICAgIFNUUklORyA9IDExCisgICAgVVRGNyA9IDExCisgICAgU1RSVUNUID0gMTIKKyAgICBNQVAgPSAxMworICAgIFNFVCA9IDE0CisgICAgTElTVCA9IDE1CisgICAgVVRGOCA9IDE2CisgICAgVVRGMTYgPSAxNwogCi1jbGFzcyBUUHJvY2Vzc29yOgorICAgIF9WQUxVRVNfVE9fTkFNRVMgPSAoCisgICAgICAgICdTVE9QJywKKyAgICAgICAgJ1ZPSUQnLAorICAgICAgICAnQk9PTCcsCisgICAgICAgICdCWVRFJywKKyAgICAgICAgJ0RPVUJMRScsCisgICAgICAgIE5vbmUsCisgICAgICAgICdJMTYnLAorICAgICAgICBOb25lLAorICAgICAgICAnSTMyJywKKyAgICAgICAgTm9uZSwKKyAgICAgICAgJ0k2NCcsCisgICAgICAgICdTVFJJTkcnLAorICAgICAgICAnU1RSVUNUJywKKyAgICAgICAgJ01BUCcsCisgICAgICAgICdTRVQnLAorICAgICAgICAnTElTVCcsCisgICAgICAgICdVVEY4JywKKyAgICAgICAgJ1VURjE2JywKKyAgICApCiAKLSAgIiIiQmFzZSBjbGFzcyBmb3IgcHJvY3Nlc3Nvciwgd2hpY2ggd29ya3Mgb24gdHdvIHN0cmVhbXMuIiIiCiAKLSAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KToKLSAgICBwYXNzCitjbGFzcyBUTWVzc2FnZVR5cGUob2JqZWN0KToKKyAgICBDQUxMID0gMQorICAgIFJFUExZID0gMgorICAgIEVYQ0VQVElPTiA9IDMKKyAgICBPTkVXQVkgPSA0CisKKworY2xhc3MgVFByb2Nlc3NvcihvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIHByb2Nlc3Nvciwgd2hpY2ggd29ya3Mgb24gdHdvIHN0cmVhbXMuIiIiCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOgorICAgICAgICBwYXNzCisKIAogY2xhc3MgVEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGFsbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKIAotICAiIiJCYXNlIGNsYXNzIGZvciBhbGwgdGhyaWZ0IGV4Y2VwdGlvbnMuIiIiCisgICAgIyBCYXNlRXhjZXB0aW9uLm1lc3NhZ2UgaXMgZGVwcmVjYXRlZCBpbiBQeXRob24gdlsyLjYsMy4wKQorICAgIGlmICgyLCA2LCAwKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDApOgorICAgICAgICBkZWYgX2dldF9tZXNzYWdlKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21lc3NhZ2UKIAotICAjIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBpcyBkZXByZWNhdGVkIGluIFB5dGhvbiB2WzIuNiwzLjApCi0gIGlmICgyLDYsMCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLDApOgotICAgIGRlZiBfZ2V0X21lc3NhZ2Uoc2VsZik6Ci0JICAgIHJldHVybiBzZWxmLl9tZXNzYWdlCi0gICAgZGVmIF9zZXRfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKLQkgICAgc2VsZi5fbWVzc2FnZSA9IG1lc3NhZ2UKLSAgICBtZXNzYWdlID0gcHJvcGVydHkoX2dldF9tZXNzYWdlLCBfc2V0X21lc3NhZ2UpCisgICAgICAgIGRlZiBfc2V0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQorICAgICAgICBtZXNzYWdlID0gcHJvcGVydHkoX2dldF9tZXNzYWdlLCBfc2V0X21lc3NhZ2UpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorCiAKIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihURXhjZXB0aW9uKToKKyAgICAiIiJBcHBsaWNhdGlvbiBsZXZlbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKIAotICAiIiJBcHBsaWNhdGlvbiBsZXZlbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKKyAgICBVTktOT1dOID0gMAorICAgIFVOS05PV05fTUVUSE9EID0gMQorICAgIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMgorICAgIFdST05HX01FVEhPRF9OQU1FID0gMworICAgIEJBRF9TRVFVRU5DRV9JRCA9IDQKKyAgICBNSVNTSU5HX1JFU1VMVCA9IDUKKyAgICBJTlRFUk5BTF9FUlJPUiA9IDYKKyAgICBQUk9UT0NPTF9FUlJPUiA9IDcKKyAgICBJTlZBTElEX1RSQU5TRk9STSA9IDgKKyAgICBJTlZBTElEX1BST1RPQ09MID0gOQorICAgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKIAotICBVTktOT1dOID0gMAotICBVTktOT1dOX01FVEhPRCA9IDEKLSAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyCi0gIFdST05HX01FVEhPRF9OQU1FID0gMwotICBCQURfU0VRVUVOQ0VfSUQgPSA0Ci0gIE1JU1NJTkdfUkVTVUxUID0gNQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKLQotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICBpZiBzZWxmLm1lc3NhZ2U6Ci0gICAgICByZXR1cm4gc2VsZi5tZXNzYWdlCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gVU5LTk9XTl9NRVRIT0Q6Ci0gICAgICByZXR1cm4gJ1Vua25vd24gbWV0aG9kJwotICAgIGVsaWYgc2VsZi50eXBlID09IElOVkFMSURfTUVTU0FHRV9UWVBFOgotICAgICAgcmV0dXJuICdJbnZhbGlkIG1lc3NhZ2UgdHlwZScKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBXUk9OR19NRVRIT0RfTkFNRToKLSAgICAgIHJldHVybiAnV3JvbmcgbWV0aG9kIG5hbWUnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gQkFEX1NFUVVFTkNFX0lEOgotICAgICAgcmV0dXJuICdCYWQgc2VxdWVuY2UgSUQnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gTUlTU0lOR19SRVNVTFQ6Ci0gICAgICByZXR1cm4gJ01pc3NpbmcgcmVzdWx0JwotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gJ0RlZmF1bHQgKHVua25vd24pIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicKLQotICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6Ci0gICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKLSAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICAgIGJyZWFrCi0gICAgICBpZiBmaWQgPT0gMToKLSAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgotICAgICAgICAgIHNlbGYubWVzc2FnZSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tZXNzYWdlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZQorICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlVOS05PV05fTUVUSE9EOgorICAgICAgICAgICAgcmV0dXJuICdVbmtub3duIG1ldGhvZCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX01FU1NBR0VfVFlQRToKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBtZXNzYWdlIHR5cGUnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuV1JPTkdfTUVUSE9EX05BTUU6CisgICAgICAgICAgICByZXR1cm4gJ1dyb25nIG1ldGhvZCBuYW1lJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLkJBRF9TRVFVRU5DRV9JRDoKKyAgICAgICAgICAgIHJldHVybiAnQmFkIHNlcXVlbmNlIElEJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLk1JU1NJTkdfUkVTVUxUOgorICAgICAgICAgICAgcmV0dXJuICdNaXNzaW5nIHJlc3VsdCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAnSW50ZXJuYWwgZXJyb3InCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuUFJPVE9DT0xfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gJ1Byb3RvY29sIGVycm9yJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfVFJBTlNGT1JNOgorICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIHRyYW5zZm9ybScKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX1BST1RPQ09MOgorICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIHByb3RvY29sJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOgorICAgICAgICAgICAgcmV0dXJuICdVbnN1cHBvcnRlZCBjbGllbnQgdHlwZScKICAgICAgICAgZWxzZToKLSAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgZWxpZiBmaWQgPT0gMjoKLSAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYudHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgZWxzZToKLSAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKLSAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCi0gICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisgICAgICAgICAgICByZXR1cm4gJ0RlZmF1bHQgKHVua25vd24pIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicKIAotICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgotICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpCi0gICAgaWYgc2VsZi5tZXNzYWdlICE9IE5vbmU6Ci0gICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZS5TVFJJTkcsIDEpCi0gICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLm1lc3NhZ2UpCi0gICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKLSAgICBpZiBzZWxmLnR5cGUgIT0gTm9uZToKLSAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlLkkzMiwgMikKLSAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYudHlwZSkKLSAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQotICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKLSAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisgICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgICAgICAgIGVsaWYgZmlkID09IDI6CisgICAgICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnR5cGUgPSBpcHJvdC5yZWFkSTMyKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKQorICAgICAgICBpZiBzZWxmLm1lc3NhZ2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLm1lc3NhZ2UpCisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICAgICAgaWYgc2VsZi50eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGUuSTMyLCAyKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi50eXBlKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisKK2NsYXNzIFRGcm96ZW5EaWN0KGRpY3QpOgorICAgICIiIkEgZGljdGlvbmFyeSB0aGF0IGlzICJmcm96ZW4iIGxpa2UgYSBmcm96ZW5zZXQiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihURnJvemVuRGljdCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAjIFNvcnQgdGhlIGl0ZW1zIHNvIHRoZXkgd2lsbCBiZSBpbiBhIGNvbnNpc3RlbnQgb3JkZXIuCisgICAgICAgICMgWE9SIGluIHRoZSBoYXNoIG9mIHRoZSBjbGFzcyBzbyB3ZSBkb24ndCBjb2xsaWRlIHdpdGgKKyAgICAgICAgIyB0aGUgaGFzaCBvZiBhIGxpc3Qgb2YgdHVwbGVzLgorICAgICAgICBzZWxmLl9faGFzaHZhbCA9IGhhc2goVEZyb3plbkRpY3QpIF4gaGFzaCh0dXBsZShzb3J0ZWQoc2VsZi5pdGVtcygpKSkpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gVEZyZWV6YWJsZURpY3QiKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBtb2RpZnkgZnJvemVuIFRGcmVlemFibGVEaWN0IikKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNodmFsCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2NvbXBhdC5weSBiL2xpYi9weS9zcmMvY29tcGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODI3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2NvbXBhdC5weQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8gYXMgQnVmZmVySU8KKworICAgIGRlZiBiaW5hcnlfdG9fc3RyKGJpbl92YWwpOgorICAgICAgICByZXR1cm4gYmluX3ZhbAorCisgICAgZGVmIHN0cl90b19iaW5hcnkoc3RyX3ZhbCk6CisgICAgICAgIHJldHVybiBzdHJfdmFsCisKKyAgICBkZWYgYnl0ZV9pbmRleChieXRlc192YWwsIGkpOgorICAgICAgICByZXR1cm4gb3JkKGJ5dGVzX3ZhbFtpXSkKKworZWxzZToKKworICAgIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8gYXMgQnVmZmVySU8gICMgbm9xYQorCisgICAgZGVmIGJpbmFyeV90b19zdHIoYmluX3ZhbCk6CisgICAgICAgIHJldHVybiBiaW5fdmFsLmRlY29kZSgndXRmOCcpCisKKyAgICBkZWYgc3RyX3RvX2JpbmFyeShzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIGJ5dGVzKHN0cl92YWwsICd1dGY4JykKKworICAgIGRlZiBieXRlX2luZGV4KGJ5dGVzX3ZhbCwgaSk6CisgICAgICAgIHJldHVybiBieXRlc192YWxbaV0KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAgYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDhkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dC9iaW5hcnkuaCIKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitib29sIEJpbmFyeVByb3RvY29sOjpyZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKSB7CisgIHVpbnQ4X3QgYiA9IDA7CisgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPihiKTsKKyAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIHJlYWRJMTYodGFnKTsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5oIGIvbGliL3B5L3NyYy9leHQvYmluYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwYjBkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX0JJTkFSWV9ICisjZGVmaW5lIFRIUklGVF9QWV9CSU5BUllfSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSAiZXh0L3Byb3RvY29sLmgiCisjaW5jbHVkZSAiZXh0L2VuZGlhbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworY2xhc3MgQmluYXJ5UHJvdG9jb2wgOiBwdWJsaWMgUHJvdG9jb2xCYXNlPEJpbmFyeVByb3RvY29sPiB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkJpbmFyeVByb3RvY29sKCkge30KKworICB2b2lkIHdyaXRlSTgoaW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgc2l6ZW9mKGludDhfdCkpOyB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQxNl90IHZhbCkgeworICAgIGludDE2X3QgbmV0ID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaHRvbnModmFsKSk7CisgICAgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm5ldCksIHNpemVvZihpbnQxNl90KSk7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludDMyX3QgdmFsKSB7CisgICAgaW50MzJfdCBuZXQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihodG9ubCh2YWwpKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmbmV0KSwgc2l6ZW9mKGludDMyX3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50NjRfdCB2YWwpIHsKKyAgICBpbnQ2NF90IG5ldCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGh0b25sbCh2YWwpKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmbmV0KSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgeworICAgIC8vIFVuZm9ydHVuYXRlbHksIGJpdHdpc2VfY2FzdCBkb2Vzbid0IHdvcmsgaW4gQy4gIEJhZCBDIQorICAgIHVuaW9uIHsKKyAgICAgIGRvdWJsZSBmOworICAgICAgaW50NjRfdCB0OworICAgIH0gdHJhbnNmZXI7CisgICAgdHJhbnNmZXIuZiA9IGR1YjsKKyAgICB3cml0ZUk2NCh0cmFuc2Zlci50KTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGludCB2KSB7IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90Pih2KSk7IH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFB5T2JqZWN0KiB2YWx1ZSwgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZUkzMihsZW4pOworICAgIHdyaXRlQnVmZmVyKFB5Qnl0ZXNfQVNfU1RSSU5HKHZhbHVlKSwgbGVuKTsKKyAgfQorCisgIGJvb2wgd3JpdGVMaXN0QmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTZXRMaXN0VHlwZUFyZ3MmIHBhcnNlZGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVCeXRlKHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKTsKKyAgICB3cml0ZUkzMihsZW4pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZU1hcEJlZ2luKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgTWFwVHlwZUFyZ3MmIHBhcnNlZGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVCeXRlKHBhcnNlZGFyZ3Mua3RhZyk7CisgICAgd3JpdGVCeXRlKHBhcnNlZGFyZ3MudnRhZyk7CisgICAgd3JpdGVJMzIobGVuKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVTdHJ1Y3RCZWdpbigpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCB3cml0ZVN0cnVjdEVuZCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCB3cml0ZUZpZWxkKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU3RydWN0SXRlbVNwZWMmIHBhcnNlZHNwZWMpIHsKKyAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFyc2Vkc3BlYy50eXBlKSk7CisgICAgd3JpdGVJMTYocGFyc2Vkc3BlYy50YWcpOworICAgIHJldHVybiBlbmNvZGVWYWx1ZSh2YWx1ZSwgcGFyc2Vkc3BlYy50eXBlLCBwYXJzZWRzcGVjLnR5cGVhcmdzKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihUX1NUT1ApKTsgfQorCisgIGJvb2wgcmVhZEJvb2woYm9vbCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IGJ1ZlswXSA9PSAxOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTgoaW50OF90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTE2KGludDE2X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCBzaXplb2YoaW50MTZfdCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdmFsLCBidWYsIHNpemVvZihpbnQxNl90KSk7CisgICAgdmFsID0gbnRvaHModmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEkzMihpbnQzMl90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1Ziwgc2l6ZW9mKGludDMyX3QpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnZhbCwgYnVmLCBzaXplb2YoaW50MzJfdCkpOworICAgIHZhbCA9IG50b2hsKHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJNjQoaW50NjRfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIHNpemVvZihpbnQ2NF90KSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KCZ2YWwsIGJ1Ziwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICB2YWwgPSBudG9obGwodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZERvdWJsZShkb3VibGUmIHZhbCkgeworICAgIHVuaW9uIHsKKyAgICAgIGludDY0X3QgZjsKKyAgICAgIGRvdWJsZSB0OworICAgIH0gdHJhbnNmZXI7CisKKyAgICBpZiAoIXJlYWRJNjQodHJhbnNmZXIuZikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gdHJhbnNmZXIudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGludDMyX3QgcmVhZFN0cmluZyhjaGFyKiogYnVmKSB7CisgICAgaW50MzJfdCBsZW4gPSAwOworICAgIGlmICghcmVhZEkzMihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgc3RyaW5nTGltaXQoKSkgfHwgIXJlYWRCeXRlcyhidWYsIGxlbikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZXR5cGUpIHsKKyAgICBpbnQzMl90IGxlbjsKKyAgICB1aW50OF90IGIgPSAwOworICAgIGlmICghcmVhZEJ5dGUoYikgfHwgIXJlYWRJMzIobGVuKSB8fCAhY2hlY2tMZW5ndGhMaW1pdChsZW4sIGNvbnRhaW5lckxpbWl0KCkpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KGIpOworICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga3R5cGUsIFRUeXBlJiB2dHlwZSkgeworICAgIGludDMyX3QgbGVuOworICAgIHVpbnQ4X3QgaywgdjsKKyAgICBpZiAoIXJlYWRCeXRlKGspIHx8ICFyZWFkQnl0ZSh2KSB8fCAhcmVhZEkzMihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAga3R5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oayk7CisgICAgdnR5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4odik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGJvb2wgcmVhZFN0cnVjdEJlZ2luKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHJlYWRTdHJ1Y3RFbmQoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgYm9vbCByZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKTsKKworI2RlZmluZSBTS0lQQllURVMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcmVhZEJ5dGVzKCZkdW1teV9idWZfLCAobikpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisgIGJvb2wgc2tpcEJvb2woKSB7IFNLSVBCWVRFUygxKTsgfQorICBib29sIHNraXBCeXRlKCkgeyBTS0lQQllURVMoMSk7IH0KKyAgYm9vbCBza2lwSTE2KCkgeyBTS0lQQllURVMoMik7IH0KKyAgYm9vbCBza2lwSTMyKCkgeyBTS0lQQllURVMoNCk7IH0KKyAgYm9vbCBza2lwSTY0KCkgeyBTS0lQQllURVMoOCk7IH0KKyAgYm9vbCBza2lwRG91YmxlKCkgeyBTS0lQQllURVMoOCk7IH0KKyAgYm9vbCBza2lwU3RyaW5nKCkgeworICAgIGludDMyX3QgbGVuOworICAgIGlmICghcmVhZEkzMihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNLSVBCWVRFUyhsZW4pOworICB9CisjdW5kZWYgU0tJUEJZVEVTCisKK3ByaXZhdGU6CisgIGNoYXIqIGR1bW15X2J1Zl87Cit9OworfQorfQorfQorI2VuZGlmIC8vIFRIUklGVF9QWV9CSU5BUllfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvY29tcGFjdC5jcHAgYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE5OWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvY29tcGFjdC5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dC9jb21wYWN0LmgiCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitjb25zdCB1aW50OF90IENvbXBhY3RQcm90b2NvbDo6VFR5cGVUb0NUeXBlW10gPSB7CisgICAgQ1RfU1RPUCwgICAgICAgICAvLyBUX1NUT1AKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0JPT0xFQU5fVFJVRSwgLy8gVF9CT09MCisgICAgQ1RfQllURSwgICAgICAgICAvLyBUX0JZVEUKKyAgICBDVF9ET1VCTEUsICAgICAgIC8vIFRfRE9VQkxFCisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9JMTYsICAgICAgICAgIC8vIFRfSTE2CisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9JMzIsICAgICAgICAgIC8vIFRfSTMyCisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9JNjQsICAgICAgICAgIC8vIFRfSTY0CisgICAgQ1RfQklOQVJZLCAgICAgICAvLyBUX1NUUklORworICAgIENUX1NUUlVDVCwgICAgICAgLy8gVF9TVFJVQ1QKKyAgICBDVF9NQVAsICAgICAgICAgIC8vIFRfTUFQCisgICAgQ1RfU0VULCAgICAgICAgICAvLyBUX1NFVAorICAgIENUX0xJU1QsICAgICAgICAgLy8gVF9MSVNUCit9OworCitib29sIENvbXBhY3RQcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oVFR5cGUmIHR5cGUsIGludDE2X3QmIHRhZykgeworICB1aW50OF90IGI7CisgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdWludDhfdCBjdHlwZSA9IGIgJiAweGY7CisgIHR5cGUgPSBnZXRUVHlwZShjdHlwZSk7CisgIGlmICh0eXBlID09IC0xKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgdGFnID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB1aW50OF90IGRpZmYgPSAoYiAmIDB4ZjApID4+IDQ7CisgIGlmIChkaWZmKSB7CisgICAgdGFnID0gcmVhZFRhZ3NfLnRvcCgpICsgZGlmZjsKKyAgfSBlbHNlIGlmICghcmVhZEkxNih0YWcpKSB7CisgICAgcmVhZFRhZ3NfLnRvcCgpID0gLTE7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjdHlwZSA9PSBDVF9CT09MRUFOX0ZBTFNFIHx8IGN0eXBlID09IENUX0JPT0xFQU5fVFJVRSkgeworICAgIHJlYWRCb29sXy5leGlzdHMgPSB0cnVlOworICAgIHJlYWRCb29sXy52YWx1ZSA9IGN0eXBlID09IENUX0JPT0xFQU5fVFJVRTsKKyAgfQorICByZWFkVGFnc18udG9wKCkgPSB0YWc7CisgIHJldHVybiB0cnVlOworfQorCitUVHlwZSBDb21wYWN0UHJvdG9jb2w6OmdldFRUeXBlKHVpbnQ4X3QgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX1NUT1A6CisgICAgcmV0dXJuIFRfU1RPUDsKKyAgY2FzZSBDVF9CT09MRUFOX0ZBTFNFOgorICBjYXNlIENUX0JPT0xFQU5fVFJVRToKKyAgICByZXR1cm4gVF9CT09MOworICBjYXNlIENUX0JZVEU6CisgICAgcmV0dXJuIFRfQllURTsKKyAgY2FzZSBDVF9JMTY6CisgICAgcmV0dXJuIFRfSTE2OworICBjYXNlIENUX0kzMjoKKyAgICByZXR1cm4gVF9JMzI7CisgIGNhc2UgQ1RfSTY0OgorICAgIHJldHVybiBUX0k2NDsKKyAgY2FzZSBDVF9ET1VCTEU6CisgICAgcmV0dXJuIFRfRE9VQkxFOworICBjYXNlIENUX0JJTkFSWToKKyAgICByZXR1cm4gVF9TVFJJTkc7CisgIGNhc2UgQ1RfTElTVDoKKyAgICByZXR1cm4gVF9MSVNUOworICBjYXNlIENUX1NFVDoKKyAgICByZXR1cm4gVF9TRVQ7CisgIGNhc2UgQ1RfTUFQOgorICAgIHJldHVybiBUX01BUDsKKyAgY2FzZSBDVF9TVFJVQ1Q6CisgICAgcmV0dXJuIFRfU1RSVUNUOworICBkZWZhdWx0OgorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJkb24ndCBrbm93IHdoYXQgdHlwZTogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VFR5cGU+KC0xKTsKKyAgfQorfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvY29tcGFjdC5oIGIvbGliL3B5L3NyYy9leHQvY29tcGFjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OGQ3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmgKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfQ09NUEFDVF9ICisjZGVmaW5lIFRIUklGVF9QWV9DT01QQUNUX0gKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgImV4dC9wcm90b2NvbC5oIgorI2luY2x1ZGUgImV4dC9lbmRpYW4uaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGFjaz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2NsYXNzIENvbXBhY3RQcm90b2NvbCA6IHB1YmxpYyBQcm90b2NvbEJhc2U8Q29tcGFjdFByb3RvY29sPiB7CitwdWJsaWM6CisgIENvbXBhY3RQcm90b2NvbCgpIHsgcmVhZEJvb2xfLmV4aXN0cyA9IGZhbHNlOyB9CisKKyAgdmlydHVhbCB+Q29tcGFjdFByb3RvY29sKCkge30KKworICB2b2lkIHdyaXRlSTgoaW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgMSk7IH0KKworICB2b2lkIHdyaXRlSTE2KGludDE2X3QgdmFsKSB7IHdyaXRlVmFyaW50KHRvWmlnWmFnKHZhbCkpOyB9CisKKyAgaW50IHdyaXRlSTMyKGludDMyX3QgdmFsKSB7IHJldHVybiB3cml0ZVZhcmludCh0b1ppZ1phZyh2YWwpKTsgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50NjRfdCB2YWwpIHsgd3JpdGVWYXJpbnQ2NCh0b1ppZ1phZzY0KHZhbCkpOyB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgdW5pb24geworICAgICAgZG91YmxlIGY7CisgICAgICBpbnQ2NF90IHQ7CisgICAgfSB0cmFuc2ZlcjsKKyAgICB0cmFuc2Zlci5mID0gaHRvbGVsbChkdWIpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ0cmFuc2Zlci50KSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGludCB2KSB7IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90Pih2ID8gQ1RfQk9PTEVBTl9UUlVFIDogQ1RfQk9PTEVBTl9GQUxTRSkpOyB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhQeU9iamVjdCogdmFsdWUsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVWYXJpbnQobGVuKTsKKyAgICB3cml0ZUJ1ZmZlcihQeUJ5dGVzX0FTX1NUUklORyh2YWx1ZSksIGxlbik7CisgIH0KKworICBib29sIHdyaXRlTGlzdEJlZ2luKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU2V0TGlzdFR5cGVBcmdzJiBhcmdzLCBpbnQzMl90IGxlbikgeworICAgIGludCBjdHlwZSA9IHRvQ29tcGFjdFR5cGUoYXJncy5lbGVtZW50X3R5cGUpOworICAgIGlmIChsZW4gPD0gMTQpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihsZW4gPDwgNCB8IGN0eXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZSgweGYwIHwgY3R5cGUpOworICAgICAgd3JpdGVWYXJpbnQobGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlTWFwQmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBNYXBUeXBlQXJncyYgYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgIHdyaXRlQnl0ZSgwKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQgY3R5cGUgPSB0b0NvbXBhY3RUeXBlKGFyZ3Mua3RhZykgPDwgNCB8IHRvQ29tcGFjdFR5cGUoYXJncy52dGFnKTsKKyAgICB3cml0ZVZhcmludChsZW4pOworICAgIHdyaXRlQnl0ZShjdHlwZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlU3RydWN0QmVnaW4oKSB7CisgICAgd3JpdGVUYWdzXy5wdXNoKDApOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgd3JpdGVUYWdzXy5wb3AoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVGaWVsZChQeU9iamVjdCogdmFsdWUsIGNvbnN0IFN0cnVjdEl0ZW1TcGVjJiBzcGVjKSB7CisgICAgaWYgKHNwZWMudHlwZSA9PSBUX0JPT0wpIHsKKyAgICAgIGRvV3JpdGVGaWVsZEJlZ2luKHNwZWMsIFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSkgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBkb1dyaXRlRmllbGRCZWdpbihzcGVjLCB0b0NvbXBhY3RUeXBlKHNwZWMudHlwZSkpOworICAgICAgcmV0dXJuIGVuY29kZVZhbHVlKHZhbHVlLCBzcGVjLnR5cGUsIHNwZWMudHlwZWFyZ3MpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7IHdyaXRlQnl0ZSgwKTsgfQorCisgIGJvb2wgcmVhZEJvb2woYm9vbCYgdmFsKSB7CisgICAgaWYgKHJlYWRCb29sXy5leGlzdHMpIHsKKyAgICAgIHJlYWRCb29sXy5leGlzdHMgPSBmYWxzZTsKKyAgICAgIHZhbCA9IHJlYWRCb29sXy52YWx1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdID09IENUX0JPT0xFQU5fVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIHJlYWRJOChpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF07CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJMTYoaW50MTZfdCYgdmFsKSB7CisgICAgdWludDE2X3QgdXZhbDsKKyAgICBpZiAocmVhZFZhcmludDx1aW50MTZfdCwgMz4odXZhbCkpIHsKKyAgICAgIHZhbCA9IGZyb21aaWdaYWc8aW50MTZfdCwgdWludDE2X3Q+KHV2YWwpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgcmVhZEkzMihpbnQzMl90JiB2YWwpIHsKKyAgICB1aW50MzJfdCB1dmFsOworICAgIGlmIChyZWFkVmFyaW50PHVpbnQzMl90LCA1Pih1dmFsKSkgeworICAgICAgdmFsID0gZnJvbVppZ1phZzxpbnQzMl90LCB1aW50MzJfdD4odXZhbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZWFkSTY0KGludDY0X3QmIHZhbCkgeworICAgIHVpbnQ2NF90IHV2YWw7CisgICAgaWYgKHJlYWRWYXJpbnQ8dWludDY0X3QsIDEwPih1dmFsKSkgeworICAgICAgdmFsID0gZnJvbVppZ1phZzxpbnQ2NF90LCB1aW50NjRfdD4odXZhbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZWFkRG91YmxlKGRvdWJsZSYgdmFsKSB7CisgICAgdW5pb24geworICAgICAgaW50NjRfdCBmOworICAgICAgZG91YmxlIHQ7CisgICAgfSB0cmFuc2ZlcjsKKworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCA4KSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnRyYW5zZmVyLmYsIGJ1Ziwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICB0cmFuc2Zlci5mID0gbGV0b2hsbCh0cmFuc2Zlci5mKTsKKyAgICB2YWwgPSB0cmFuc2Zlci50OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaW50MzJfdCByZWFkU3RyaW5nKGNoYXIqKiBidWYpIHsKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgc3RyaW5nTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFyZWFkQnl0ZXMoYnVmLCBsZW4pKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGV0eXBlKSB7CisgICAgdWludDhfdCBiOworICAgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZXR5cGUgPSBnZXRUVHlwZShiICYgMHhmKTsKKyAgICBpZiAoZXR5cGUgPT0gLTEpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdWludDMyX3QgbGVuID0gKGIgPj4gNCkgJiAweGY7CisgICAgaWYgKGxlbiA9PSAxNSAmJiAhcmVhZFZhcmludDx1aW50MzJfdCwgNT4obGVuKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgaW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGt0eXBlLCBUVHlwZSYgdnR5cGUpIHsKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICB1aW50OF90IGt2VHlwZTsKKyAgICAgIGlmICghcmVhZEJ5dGUoa3ZUeXBlKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBrdHlwZSA9IGdldFRUeXBlKGt2VHlwZSA+PiA0KTsKKyAgICAgIHZ0eXBlID0gZ2V0VFR5cGUoa3ZUeXBlICYgMHhmKTsKKyAgICAgIGlmIChrdHlwZSA9PSAtMSB8fCB2dHlwZSA9PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBib29sIHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICByZWFkVGFnc18ucHVzaCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgcmVhZFRhZ3NfLnBvcCgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgcmVhZEZpZWxkQmVnaW4oVFR5cGUmIHR5cGUsIGludDE2X3QmIHRhZyk7CisKKyAgYm9vbCBza2lwQm9vbCgpIHsKKyAgICBib29sIHZhbDsKKyAgICByZXR1cm4gcmVhZEJvb2wodmFsKTsKKyAgfQorI2RlZmluZSBTS0lQQllURVMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcmVhZEJ5dGVzKCZkdW1teV9idWZfLCAobikpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorICBib29sIHNraXBCeXRlKCkgeyBTS0lQQllURVMoMSk7IH0KKyAgYm9vbCBza2lwRG91YmxlKCkgeyBTS0lQQllURVMoOCk7IH0KKyAgYm9vbCBza2lwSTE2KCkgeworICAgIGludDE2X3QgdmFsOworICAgIHJldHVybiByZWFkSTE2KHZhbCk7CisgIH0KKyAgYm9vbCBza2lwSTMyKCkgeworICAgIGludDMyX3QgdmFsOworICAgIHJldHVybiByZWFkSTMyKHZhbCk7CisgIH0KKyAgYm9vbCBza2lwSTY0KCkgeworICAgIGludDY0X3QgdmFsOworICAgIHJldHVybiByZWFkSTY0KHZhbCk7CisgIH0KKyAgYm9vbCBza2lwU3RyaW5nKCkgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU0tJUEJZVEVTKGxlbik7CisgIH0KKyN1bmRlZiBTS0lQQllURVMKKworcHJpdmF0ZToKKyAgZW51bSBUeXBlcyB7CisgICAgQ1RfU1RPUCA9IDB4MDAsCisgICAgQ1RfQk9PTEVBTl9UUlVFID0gMHgwMSwKKyAgICBDVF9CT09MRUFOX0ZBTFNFID0gMHgwMiwKKyAgICBDVF9CWVRFID0gMHgwMywKKyAgICBDVF9JMTYgPSAweDA0LAorICAgIENUX0kzMiA9IDB4MDUsCisgICAgQ1RfSTY0ID0gMHgwNiwKKyAgICBDVF9ET1VCTEUgPSAweDA3LAorICAgIENUX0JJTkFSWSA9IDB4MDgsCisgICAgQ1RfTElTVCA9IDB4MDksCisgICAgQ1RfU0VUID0gMHgwQSwKKyAgICBDVF9NQVAgPSAweDBCLAorICAgIENUX1NUUlVDVCA9IDB4MEMKKyAgfTsKKworICBzdGF0aWMgY29uc3QgdWludDhfdCBUVHlwZVRvQ1R5cGVbXTsKKworICBUVHlwZSBnZXRUVHlwZSh1aW50OF90IHR5cGUpOworCisgIGludCB0b0NvbXBhY3RUeXBlKFRUeXBlIHR5cGUpIHsKKyAgICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4odHlwZSk7CisgICAgcmV0dXJuIGkgPCAxNiA/IFRUeXBlVG9DVHlwZVtpXSA6IC0xOworICB9CisKKyAgdWludDMyX3QgdG9aaWdaYWcoaW50MzJfdCB2YWwpIHsgcmV0dXJuICh2YWwgPj4gMzEpIF4gKHZhbCA8PCAxKTsgfQorCisgIHVpbnQ2NF90IHRvWmlnWmFnNjQoaW50NjRfdCB2YWwpIHsgcmV0dXJuICh2YWwgPj4gNjMpIF4gKHZhbCA8PCAxKTsgfQorCisgIGludCB3cml0ZVZhcmludCh1aW50MzJfdCB2YWwpIHsKKyAgICBpbnQgY250ID0gMTsKKyAgICB3aGlsZSAodmFsICYgfjB4N2ZVKSB7CisgICAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4oKHZhbCAmIDB4N2ZVKSB8IDB4ODBVKSk7CisgICAgICB2YWwgPj49IDc7CisgICAgICArK2NudDsKKyAgICB9CisgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KHZhbCkpOworICAgIHJldHVybiBjbnQ7CisgIH0KKworICBpbnQgd3JpdGVWYXJpbnQ2NCh1aW50NjRfdCB2YWwpIHsKKyAgICBpbnQgY250ID0gMTsKKyAgICB3aGlsZSAodmFsICYgfjB4N2ZVTEwpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxjaGFyPigodmFsICYgMHg3ZlVMTCkgfCAweDgwVUxMKSk7CisgICAgICB2YWwgPj49IDc7CisgICAgICArK2NudDsKKyAgICB9CisgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KHZhbCkpOworICAgIHJldHVybiBjbnQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE1heD4KKyAgYm9vbCByZWFkVmFyaW50KFQmIHJlc3VsdCkgeworICAgIHVpbnQ4X3QgYjsKKyAgICBUIHZhbCA9IDA7CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1heDsgKytpKSB7CisgICAgICBpZiAoIXJlYWRCeXRlKGIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChiICYgMHg4MCkgeworICAgICAgICB2YWwgfD0gc3RhdGljX2Nhc3Q8VD4oYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsIHw9IHN0YXRpY19jYXN0PFQ+KGIpIDw8IHNoaWZ0OworICAgICAgICByZXN1bHQgPSB2YWw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJ2YXJpbnQgZXhjZWVkZWQgJWQgYnl0ZXMiLCBNYXgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTLCB0eXBlbmFtZSBVPgorICBTIGZyb21aaWdaYWcoVSB2YWwpIHsKKyAgICByZXR1cm4gKHZhbCA+PiAxKSBeIHN0YXRpY19jYXN0PFU+KC1zdGF0aWNfY2FzdDxTPih2YWwgJiAxKSk7CisgIH0KKworICB2b2lkIGRvV3JpdGVGaWVsZEJlZ2luKGNvbnN0IFN0cnVjdEl0ZW1TcGVjJiBzcGVjLCBpbnQgY3R5cGUpIHsKKyAgICBpbnQgZGlmZiA9IHNwZWMudGFnIC0gd3JpdGVUYWdzXy50b3AoKTsKKyAgICBpZiAoZGlmZiA+IDAgJiYgZGlmZiA8PSAxNSkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRpZmYgPDwgNCB8IGN0eXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihjdHlwZSkpOworICAgICAgd3JpdGVJMTYoc3BlYy50YWcpOworICAgIH0KKyAgICB3cml0ZVRhZ3NfLnRvcCgpID0gc3BlYy50YWc7CisgIH0KKworICBzdGQ6OnN0YWNrPGludD4gd3JpdGVUYWdzXzsKKyAgc3RkOjpzdGFjazxpbnQ+IHJlYWRUYWdzXzsKKyAgc3RydWN0IHsKKyAgICBib29sIGV4aXN0czsKKyAgICBib29sIHZhbHVlOworICB9IHJlYWRCb29sXzsKKyAgY2hhciogZHVtbXlfYnVmXzsKK307Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX0NPTVBBQ1RfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvZW5kaWFuLmggYi9saWIvcHkvc3JjL2V4dC9lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTM3MmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvZW5kaWFuLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9FTkRJQU5fSAorI2RlZmluZSBUSFJJRlRfUFlfRU5ESUFOX0gKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbHNlCisjaW5jbHVkZSA8V2luU29jazIuaD4KKyNwcmFnbWEgY29tbWVudChsaWIsICJ3czJfMzIubGliIikKKyNkZWZpbmUgQklHX0VORElBTiAoNDMyMSkKKyNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKKyNkZWZpbmUgQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZGVmaW5lIGlubGluZSBfX2lubGluZQorI2VuZGlmCisKKy8qIEZpeCBlbmRpYW5uZXNzIGlzc3VlcyBvbiBTb2xhcmlzICovCisjaWYgZGVmaW5lZChfX1NWUjQpICYmIGRlZmluZWQoX19zdW4pCisjaWYgZGVmaW5lZChfX2kzODYpICYmICFkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBfX2kzODZfXworI2VuZGlmCisKKyNpZm5kZWYgQklHX0VORElBTgorI2RlZmluZSBCSUdfRU5ESUFOICg0MzIxKQorI2VuZGlmCisjaWZuZGVmIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKKyNlbmRpZgorCisvKiBJMzg2IGlzIExFLCBldmVuIG9uIFNvbGFyaXMgKi8KKyNpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19CWVRFX09SREVSCisjaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKKyNkZWZpbmUgX19CWVRFX09SREVSIEJZVEVfT1JERVIKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19CSUdfRU5ESUFOIEJJR19FTkRJQU4KKyNlbHNlCisjZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFubmVzcyIKKyNlbmRpZgorI2VuZGlmCisKKy8vIFNhbWUgY29tbWVudCBhcyB0aGUgZW51bS4gIFNvcnJ5LgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgbnRvaGxsKG4pIChuKQorI2RlZmluZSBodG9ubGwobikgKG4pCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNkZWZpbmUgbGV0b2hsbChuKSBic3dhcF82NChuKQorI2RlZmluZSBodG9sZWxsKG4pIGJzd2FwXzY0KG4pCisjZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KKyNkZWZpbmUgbGV0b2hsbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKW50b2hsKG4pKSA8PCAzMikgKyBudG9obChuID4+IDMyKSkKKyNkZWZpbmUgaHRvbGVsbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSkKKyNlbmRpZgorI2VsaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZGVmaW5lIG50b2hsbChuKSBic3dhcF82NChuKQorI2RlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKKyNlbHNlIC8qIEdOVUMgJiBHTElCQyAqLworI2RlZmluZSBudG9obGwobikgKCgoKHVuc2lnbmVkIGxvbmcgbG9uZyludG9obChuKSkgPDwgMzIpICsgbnRvaGwobiA+PiAzMikpCisjZGVmaW5lIGh0b25sbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSkKKyNlbmRpZiAvKiBHTlVDICYgR0xJQkMgKi8KKyNkZWZpbmUgbGV0b2hsbChuKSAobikKKyNkZWZpbmUgaHRvbGVsbChuKSAobikKKyNlbHNlIC8qIF9fQllURV9PUkRFUiAqLworI2Vycm9yICJDYW4ndCBkZWZpbmUgaHRvbmxsIG9yIG50b2hsbCEiCisjZW5kaWYKKworI2VuZGlmIC8vIFRIUklGVF9QWV9FTkRJQU5fSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvbW9kdWxlLmNwcCBiL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1OGI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiYmluYXJ5LmgiCisjaW5jbHVkZSAiY29tcGFjdC5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gVE9ETyhkcmVpc3MpOiBkZWZ2YWwgYXBwZWFycyB0byBiZSB1bnVzZWQuICBMb29rIGludG8gcmVtb3ZpbmcgaXQuCisvLyBUT0RPKGRyZWlzcyk6IE1ha2UgcGFyc2Vfc3BlY19hcmdzIHJlY3Vyc2l2ZSwgYW5kIGNhY2hlIHRoZSBvdXRwdXQKKy8vICAgICAgICAgICAgICAgcGVybWFuZW50bHkgaW4gdGhlIG9iamVjdC4gIChNYWxsb2MgYW5kIG9ycGhhbi4pCisvLyBUT0RPKGRyZWlzcyk6IFdoeSBkbyB3ZSBuZWVkIGNTdHJpbmdJTyBmb3IgcmVhZGluZywgd2h5IG5vdCBqdXN0IGNoYXIqPworLy8gICAgICAgICAgICAgICBDYW4gY1N0cmluZ0lPIGxldCB1cyB3b3JrIHdpdGggYSBCdWZmZXJlZFRyYW5zcG9ydD8KKy8vIFRPRE8oZHJlaXNzKTogRG9uJ3QgaWdub3JlIHRoZSBydiBmcm9tIGN3cml0ZSAobWF5YmUpLgorCisvLyBEb2luZyBhIGJlbmNobWFyayBzaG93cyB0aGF0IGludGVybmluZyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UsIGFtYXppbmdseS4KKworLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCitQeU9iamVjdCogSU5URVJOX1NUUklORyhURnJvemVuRGljdCk7CitQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKK1B5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNvbnRhaW5lcl9sZW5ndGhfbGltaXQpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKHRyYW5zKTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIFB5T2JqZWN0KiBlbmNvZGVfaW1wbChQeU9iamVjdCogYXJncykgeworICBpZiAoIWFyZ3MpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgUHlPYmplY3QqIGVuY19vYmogPSBOVUxMOworICBQeU9iamVjdCogdHlwZV9hcmdzID0gTlVMTDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZlbmNfb2JqLCAmdHlwZV9hcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghZW5jX29iaiB8fCAhdHlwZV9hcmdzKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBUIHByb3RvY29sOworICBpZiAoIXByb3RvY29sLnByZXBhcmVFbmNvZGVCdWZmZXIoKSB8fCAhcHJvdG9jb2wuZW5jb2RlVmFsdWUoZW5jX29iaiwgVF9TVFJVQ1QsIHR5cGVfYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBwcm90b2NvbC5nZXRFbmNvZGVkVmFsdWUoKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIGFzX2xvbmdfdGhlbl9kZWxldGUoUHlPYmplY3QqIHZhbHVlLCBsb25nIGRlZmF1bHRfdmFsdWUpIHsKKyAgU2NvcGVkUHlPYmplY3Qgc2NvcGUodmFsdWUpOworICBsb25nIHYgPSBQeUludF9Bc0xvbmcodmFsdWUpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisgIHJldHVybiB2OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBQeU9iamVjdCogZGVjb2RlX2ltcGwoUHlPYmplY3QqIGFyZ3MpIHsKKyAgUHlPYmplY3QqIG91dHB1dF9vYmogPSBOVUxMOworICBQeU9iamVjdCogb3Byb3QgPSBOVUxMOworICBQeU9iamVjdCogdHlwZWFyZ3MgPSBOVUxMOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTyIsICZvdXRwdXRfb2JqLCAmb3Byb3QsICZ0eXBlYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFQgcHJvdG9jb2w7CisgIGludDMyX3QgZGVmYXVsdF9saW1pdCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCk7CisgIHByb3RvY29sLnNldFN0cmluZ0xlbmd0aExpbWl0KAorICAgICAgYXNfbG9uZ190aGVuX2RlbGV0ZShQeU9iamVjdF9HZXRBdHRyKG9wcm90LCBJTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9saW1pdCkpOworICBwcm90b2NvbC5zZXRDb250YWluZXJMZW5ndGhMaW1pdCgKKyAgICAgIGFzX2xvbmdfdGhlbl9kZWxldGUoUHlPYmplY3RfR2V0QXR0cihvcHJvdCwgSU5URVJOX1NUUklORyhjb250YWluZXJfbGVuZ3RoX2xpbWl0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfbGltaXQpKTsKKyAgU2NvcGVkUHlPYmplY3QgdHJhbnNwb3J0KFB5T2JqZWN0X0dldEF0dHIob3Byb3QsIElOVEVSTl9TVFJJTkcodHJhbnMpKSk7CisgIGlmICghdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOworICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICghcHJvdG9jb2wucHJlcGFyZURlY29kZUJ1ZmZlckZyb21UcmFuc3BvcnQodHJhbnNwb3J0LmdldCgpKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHByb3RvY29sLnJlYWRTdHJ1Y3Qob3V0cHV0X29iaiwgcGFyc2VkYXJncy5rbGFzcywgcGFyc2VkYXJncy5zcGVjKTsKK30KK30KK30KK30KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpweTsKKworLyogLS0gUFlUSE9OIE1PRFVMRSBTRVRVUCBTVFVGRiAtLS0gKi8KKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBQeU9iamVjdCogZW5jb2RlX2JpbmFyeShQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBlbmNvZGVfaW1wbDxCaW5hcnlQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZGVjb2RlX2JpbmFyeShQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBkZWNvZGVfaW1wbDxCaW5hcnlQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZW5jb2RlX2NvbXBhY3QoUHlPYmplY3QqLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gZW5jb2RlX2ltcGw8Q29tcGFjdFByb3RvY29sPihhcmdzKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBkZWNvZGVfY29tcGFjdChQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBkZWNvZGVfaW1wbDxDb21wYWN0UHJvdG9jb2w+KGFyZ3MpOworfQorCitzdGF0aWMgUHlNZXRob2REZWYgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHNbXSA9IHsKKyAgICB7ImVuY29kZV9iaW5hcnkiLCBlbmNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7ImRlY29kZV9iaW5hcnkiLCBkZWNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7ImVuY29kZV9jb21wYWN0IiwgZW5jb2RlX2NvbXBhY3QsIE1FVEhfVkFSQVJHUywgIiJ9LAorICAgIHsiZGVjb2RlX2NvbXBhY3QiLCBkZWNvZGVfY29tcGFjdCwgTUVUSF9WQVJBUkdTLCAiIn0sCisgICAge05VTEwsIE5VTEwsIDAsIE5VTEx9IC8qIFNlbnRpbmVsICovCit9OworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisKK3N0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgVGhyaWZ0RmFzdEJpbmFyeURlZiA9IHtQeU1vZHVsZURlZl9IRUFEX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH07CisKKyNkZWZpbmUgSU5JVEVSUk9SIHJldHVybiBOVUxMOworCitQeU9iamVjdCogUHlJbml0X2Zhc3RiaW5hcnkoKSB7CisKKyNlbHNlCisKKyNkZWZpbmUgSU5JVEVSUk9SIHJldHVybjsKKwordm9pZCBpbml0ZmFzdGJpbmFyeSgpIHsKKworICBQeWNTdHJpbmdfSU1QT1JUOworICBpZiAoUHljU3RyaW5nSU8gPT0gTlVMTCkKKyAgICBJTklURVJST1IKKworI2VuZGlmCisKKyNkZWZpbmUgSU5JVF9JTlRFUk5fU1RSSU5HKHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRFUk5fU1RSSU5HKHZhbHVlKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUlOVEVSTl9TVFJJTkcodmFsdWUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIElOSVRFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworICBJTklUX0lOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpOworICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7CisgIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpOworICBJTklUX0lOVEVSTl9TVFJJTkcoY29udGFpbmVyX2xlbmd0aF9saW1pdCk7CisgIElOSVRfSU5URVJOX1NUUklORyh0cmFucyk7CisjdW5kZWYgSU5JVF9JTlRFUk5fU1RSSU5HCisKKyAgUHlPYmplY3QqIG1vZHVsZSA9CisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisgICAgICBQeU1vZHVsZV9DcmVhdGUoJlRocmlmdEZhc3RCaW5hcnlEZWYpOworI2Vsc2UKKyAgICAgIFB5X0luaXRNb2R1bGUoInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMpOworI2VuZGlmCisgIGlmIChtb2R1bGUgPT0gTlVMTCkKKyAgICBJTklURVJST1I7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgcmV0dXJuIG1vZHVsZTsKKyNlbmRpZgorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaCBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxYjdlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9QUk9UT0NPTF9ICisjZGVmaW5lIFRIUklGVF9QWV9QUk9UT0NPTF9ICisKKyNpbmNsdWRlICJleHQvdHlwZXMuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2NsYXNzIFByb3RvY29sQmFzZSB7CisKK3B1YmxpYzoKKyAgUHJvdG9jb2xCYXNlKCkKKyAgICA6IHN0cmluZ0xpbWl0Xygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSwKKyAgICAgIGNvbnRhaW5lckxpbWl0Xygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSwKKyAgICAgIG91dHB1dF8oTlVMTCkge30KKyAgaW5saW5lIHZpcnR1YWwgflByb3RvY29sQmFzZSgpOworCisgIGJvb2wgcHJlcGFyZURlY29kZUJ1ZmZlckZyb21UcmFuc3BvcnQoUHlPYmplY3QqIHRyYW5zKTsKKworICBQeU9iamVjdCogcmVhZFN0cnVjdChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCoga2xhc3MsIFB5T2JqZWN0KiBzcGVjX3NlcSk7CisKKyAgYm9vbCBwcmVwYXJlRW5jb2RlQnVmZmVyKCk7CisKKyAgYm9vbCBlbmNvZGVWYWx1ZShQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKKyAgUHlPYmplY3QqIGdldEVuY29kZWRWYWx1ZSgpOworCisgIGxvbmcgc3RyaW5nTGltaXQoKSBjb25zdCB7IHJldHVybiBzdHJpbmdMaW1pdF87IH0KKyAgdm9pZCBzZXRTdHJpbmdMZW5ndGhMaW1pdChsb25nIGxpbWl0KSB7IHN0cmluZ0xpbWl0XyA9IGxpbWl0OyB9CisKKyAgbG9uZyBjb250YWluZXJMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRhaW5lckxpbWl0XzsgfQorICB2b2lkIHNldENvbnRhaW5lckxlbmd0aExpbWl0KGxvbmcgbGltaXQpIHsgY29udGFpbmVyTGltaXRfID0gbGltaXQ7IH0KKworcHJvdGVjdGVkOgorICBib29sIHJlYWRCeXRlcyhjaGFyKiogb3V0cHV0LCBpbnQgbGVuKTsKKworICBib29sIHJlYWRCeXRlKHVpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBzdGF0aWNfY2FzdDx1aW50OF90PihidWZbMF0pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZUJ1ZmZlcihjaGFyKiBkYXRhLCBzaXplX3QgbGVuKTsKKworICB2b2lkIHdyaXRlQnl0ZSh1aW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgMSk7IH0KKworICBQeU9iamVjdCogZGVjb2RlVmFsdWUoVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworICBib29sIHNraXAoVFR5cGUgdHlwZSk7CisKKyAgaW5saW5lIGJvb2wgY2hlY2tUeXBlKFRUeXBlIGdvdCwgVFR5cGUgZXhwZWN0ZWQpOworICBpbmxpbmUgYm9vbCBjaGVja0xlbmd0aExpbWl0KGludDMyX3QgbGVuLCBsb25nIGxpbWl0KTsKKworICBpbmxpbmUgYm9vbCBpc1V0ZjgoUHlPYmplY3QqIHR5cGVhcmdzKTsKKworcHJpdmF0ZToKKyAgSW1wbCogaW1wbCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PEltcGwqPih0aGlzKTsgfQorCisgIGxvbmcgc3RyaW5nTGltaXRfOworICBsb25nIGNvbnRhaW5lckxpbWl0XzsKKyAgRW5jb2RlQnVmZmVyKiBvdXRwdXRfOworICBEZWNvZGVCdWZmZXIgaW5wdXRfOworfTsKK30KK30KK30KKworI2luY2x1ZGUgImV4dC9wcm90b2NvbC50Y2MiCisKKyNlbmRpZiAvLyBUSFJJRlRfUFlfUFJPVE9DT0xfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNWRmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC50Y2MKQEAgLTAsMCArMSw5MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfUFJPVE9DT0xfVENDCisjZGVmaW5lIFRIUklGVF9QWV9QUk9UT0NPTF9UQ0MKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorCisjZGVmaW5lIENIRUNLX1JBTkdFKHYsIG1pbiwgbWF4KSAoKCh2KSA8PSAobWF4KSkgJiYgKCh2KSA+PSAobWluKSkpCisjZGVmaW5lIElOSVRfT1VUQlVGX1NJWkUgMTI4CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworI2luY2x1ZGUgPGNTdHJpbmdJTy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworCituYW1lc3BhY2UgZGV0YWlsIHsKKworaW5saW5lIGJvb2wgaW5wdXRfY2hlY2soUHlPYmplY3QqIGlucHV0KSB7CisgIHJldHVybiBQeWNTdHJpbmdJT19JbnB1dENoZWNrKGlucHV0KTsKK30KKworaW5saW5lIEVuY29kZUJ1ZmZlciogbmV3X2VuY29kZV9idWZmZXIoc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+TmV3T3V0cHV0KHNpemUpOworfQorCitpbmxpbmUgaW50IHJlYWRfYnVmZmVyKFB5T2JqZWN0KiBidWYsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImZhaWxlZCB0byBpbXBvcnQgbmF0aXZlIGNTdHJpbmdJTyIpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gUHljU3RyaW5nSU8tPmNyZWFkKGJ1Ziwgb3V0cHV0LCBsZW4pOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBQcm90b2NvbEJhc2U8SW1wbD46On5Qcm90b2NvbEJhc2UoKSB7CisgIGlmIChvdXRwdXRfKSB7CisgICAgUHlfQ0xFQVIob3V0cHV0Xyk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0NoZWNrKHR5cGVhcmdzKSAmJiAhc3RybmNtcChQeVN0cmluZ19BU19TVFJJTkcodHlwZWFyZ3MpLCAiVVRGOCIsIDQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OmdldEVuY29kZWRWYWx1ZSgpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKG91dHB1dF8pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6d3JpdGVCdWZmZXIoY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImZhaWxlZCB0byBpbXBvcnQgbmF0aXZlIGNTdHJpbmdJTyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgbGVuID0gUHljU3RyaW5nSU8tPmN3cml0ZShvdXRwdXRfLCBkYXRhLCBzaXplKTsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImZhaWxlZCB0byB3cml0ZSB0byBjU3RyaW5nSU8gb2JqZWN0Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbikgIT0gc2l6ZSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19FT0ZFcnJvciwgIndyaXRlIGxlbmd0aCBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1IGdvdCAlZCIsIHNpemUsIGxlbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZWxzZQorCituYW1lc3BhY2UgZGV0YWlsIHsKKworaW5saW5lIGJvb2wgaW5wdXRfY2hlY2soUHlPYmplY3QqIGlucHV0KSB7CisgIC8vIFRPRE86IENoZWNrIGZvciBCeXRlc0lPIHR5cGUKKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBFbmNvZGVCdWZmZXIqIG5ld19lbmNvZGVfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgIEVuY29kZUJ1ZmZlciogYnVmZmVyID0gbmV3IEVuY29kZUJ1ZmZlcjsKKyAgYnVmZmVyLT5idWYucmVzZXJ2ZShzaXplKTsKKyAgYnVmZmVyLT5wb3MgPSAwOworICByZXR1cm4gYnVmZmVyOworfQorCitzdHJ1Y3QgYnl0ZXNpbyB7CisgIFB5T2JqZWN0X0hFQUQKKyNpZiBQWV9NSU5PUl9WRVJTSU9OIDwgNQorICAgICAgY2hhciogYnVmOworI2Vsc2UKKyAgICAgIFB5T2JqZWN0KiBidWY7CisjZW5kaWYKKyAgUHlfc3NpemVfdCBwb3M7CisgIFB5X3NzaXplX3Qgc3RyaW5nX3NpemU7Cit9OworCitpbmxpbmUgaW50IHJlYWRfYnVmZmVyKFB5T2JqZWN0KiBidWYsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgYnl0ZXNpbyogYnVmMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Ynl0ZXNpbyo+KGJ1Zik7CisjaWYgUFlfTUlOT1JfVkVSU0lPTiA8IDUKKyAgKm91dHB1dCA9IGJ1ZjItPmJ1ZiArIGJ1ZjItPnBvczsKKyNlbHNlCisgICpvdXRwdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhidWYyLT5idWYpICsgYnVmMi0+cG9zOworI2VuZGlmCisgIFB5X3NzaXplX3QgcG9zMCA9IGJ1ZjItPnBvczsKKyAgYnVmMi0+cG9zID0gKHN0ZDo6bWluKShidWYyLT5wb3MgKyBzdGF0aWNfY2FzdDxQeV9zc2l6ZV90PihsZW4pLCBidWYyLT5zdHJpbmdfc2l6ZSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZjItPnBvcyAtIHBvczApOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBQcm90b2NvbEJhc2U8SW1wbD46On5Qcm90b2NvbEJhc2UoKSB7CisgIGlmIChvdXRwdXRfKSB7CisgICAgZGVsZXRlIG91dHB1dF87CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgLy8gd2hpbGUgY29uZGl0aW9uIGZvciBweTIgaXMgImFyZyA9PSAnVVRGOCciLCBpdCBzaG91bGQgYmUgImFyZyAhPSAnQklOQVJZJyIgZm9yIHB5My4KKyAgLy8gSEFDSzogY2hlY2sgdGhlIGxlbmd0aCBhbmQgZG9uJ3QgYm90aGVyIHJlYWRpbmcgdGhlIHZhbHVlCisgIHJldHVybiAhUHlVbmljb2RlX0NoZWNrKHR5cGVhcmdzKSB8fCBQeVVuaWNvZGVfR0VUX0xFTkdUSCh0eXBlYXJncykgIT0gNjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpnZXRFbmNvZGVkVmFsdWUoKSB7CisgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKG91dHB1dF8tPmJ1Zi5kYXRhKCksIG91dHB1dF8tPmJ1Zi5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6d3JpdGVCdWZmZXIoY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IG5lZWQgPSBzaXplICsgb3V0cHV0Xy0+cG9zOworICBpZiAob3V0cHV0Xy0+YnVmLmNhcGFjaXR5KCkgPCBuZWVkKSB7CisgICAgdHJ5IHsKKyAgICAgIG91dHB1dF8tPmJ1Zi5yZXNlcnZlKG5lZWQpOworICAgIH0gY2F0Y2ggKHN0ZDo6YmFkX2FsbG9jJiBleCkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHdyaXRlIGJ1ZmZlciIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBzdGQ6OmNvcHkoZGF0YSwgZGF0YSArIHNpemUsIHN0ZDo6YmFja19pbnNlcnRlcihvdXRwdXRfLT5idWYpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZgorCituYW1lc3BhY2UgZGV0YWlsIHsKKworI2RlZmluZSBERUNMQVJFX09QX1NDT1BFKG5hbWUsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgbmFtZSMjU2NvcGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEltcGwqIGltcGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgdmFsaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWUjI1Njb3BlKEltcGwqIHRoaXopIDogaW1wbCh0aGl6KSwgdmFsaWQoaW1wbC0+b3AjI0JlZ2luKCkpIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH5uYW1lIyNTY29wZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHZhbGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbXBsLT5vcCMjRW5kKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiB2YWxpZDsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbCwgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lIyNTY29wZTxJbXBsPiBvcCMjU2NvcGUoVDxJbXBsPiogdGhpeikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuYW1lIyNTY29wZTxJbXBsPihzdGF0aWNfY2FzdDxJbXBsKj4odGhpeikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitERUNMQVJFX09QX1NDT1BFKFdyaXRlU3RydWN0LCB3cml0ZVN0cnVjdCkKK0RFQ0xBUkVfT1BfU0NPUEUoUmVhZFN0cnVjdCwgcmVhZFN0cnVjdCkKKyN1bmRlZiBERUNMQVJFX09QX1NDT1BFCisKK2lubGluZSBib29sIGNoZWNrX3NzaXplX3RfMzIoUHlfc3NpemVfdCBsZW4pIHsKKyAgLy8gZXJyb3IgZnJvbSBnZXR0aW5nIHRoZSBpbnQKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGxlbikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFDSEVDS19SQU5HRShsZW4sIDAsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzaXplIG91dCBvZiByYW5nZTogZXhjZWVkZWQgSU5UMzJfTUFYIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgcGFyc2VfcHlpbnQoUHlPYmplY3QqIG8sIFQqIHJldCwgaW50MzJfdCBtaW4sIGludDMyX3QgbWF4KSB7CisgIGxvbmcgdmFsID0gUHlJbnRfQXNMb25nKG8pOworCisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2YWwpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghQ0hFQ0tfUkFOR0UodmFsLCBtaW4sIG1heCkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqcmV0ID0gc3RhdGljX2Nhc3Q8VD4odmFsKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpjaGVja1R5cGUoVFR5cGUgZ290LCBUVHlwZSBleHBlY3RlZCkgeworICBpZiAoZXhwZWN0ZWQgIT0gZ290KSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdvdCB3cm9uZyB0dHlwZSB3aGlsZSByZWFkaW5nIGZpZWxkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpjaGVja0xlbmd0aExpbWl0KGludDMyX3QgbGVuLCBsb25nIGxpbWl0KSB7CisgIGlmIChsZW4gPCAwKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJuZWdhdGl2ZSBsZW5ndGg6ICVsZCIsIGxpbWl0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGxlbiA+IGxpbWl0KSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJzaXplIGV4Y2VlZGVkIHNwZWNpZmllZCBsaW1pdDogJWxkIiwgbGltaXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6cmVhZEJ5dGVzKGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImF0dGVtcHRlZCB0byByZWFkIG5lZ2F0aXZlIGxlbmd0aDogJWQiLCBsZW4pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBUT0RPKGRyZWlzcyk6IERvbid0IGZlYXIgdGhlIG1hbGxvYy4gIFRoaW5rIGFib3V0IHRha2luZyBhIGNvcHkgb2YKKyAgLy8gICAgICAgICAgICAgICB0aGUgcGFydGlhbCByZWFkIGluc3RlYWQgb2YgZm9yY2luZyB0aGUgdHJhbnNwb3J0CisgIC8vICAgICAgICAgICAgICAgdG8gcHJlcGVuZCBpdCB0byBpdHMgYnVmZmVyLgorCisgIGludCBybGVuID0gZGV0YWlsOjpyZWFkX2J1ZmZlcihpbnB1dF8uc3RyaW5naW9idWYuZ2V0KCksIG91dHB1dCwgbGVuKTsKKworICBpZiAocmxlbiA9PSBsZW4pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChybGVuID09IC0xKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIC8vIHVzaW5nIGJ1aWxkaW5nIGZ1bmN0aW9ucyBhcyB0aGlzIGlzIGEgcmFyZSBjb2RlcGF0aAorICAgIFNjb3BlZFB5T2JqZWN0IG5ld2lvYnVmKFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbnB1dF8ucmVmaWxsX2NhbGxhYmxlLmdldCgpLCByZWZpbGxfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCBybGVuLCBsZW4sIE5VTEwpKTsKKyAgICBpZiAoIW5ld2lvYnVmKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbXVzdCBkbyB0aGlzICpBRlRFUiogdGhlIGNhbGwgc28gdGhhdCB3ZSBkb24ndCBkZXJlZiB0aGUgaW8gYnVmZmVyCisgICAgaW5wdXRfLnN0cmluZ2lvYnVmLnJlc2V0KG5ld2lvYnVmLnJlbGVhc2UoKSk7CisKKyAgICBybGVuID0gZGV0YWlsOjpyZWFkX2J1ZmZlcihpbnB1dF8uc3RyaW5naW9idWYuZ2V0KCksIG91dHB1dCwgbGVuKTsKKworICAgIGlmIChybGVuID09IGxlbikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChybGVuID09IC0xKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpcyBjb3VsZCBiZSBhIHZhbGlkIGNvZGUgcGF0aCBmb3IgYmlnIGJpbmFyeSBibG9icy4KKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZWZpbGwgY2xhaW1lZCB0byBoYXZlIHJlZmlsbGVkIHRoZSBidWZmZXIsIGJ1dCBkaWRuJ3QhISIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpwcmVwYXJlRGVjb2RlQnVmZmVyRnJvbVRyYW5zcG9ydChQeU9iamVjdCogdHJhbnMpIHsKKyAgaWYgKGlucHV0Xy5zdHJpbmdpb2J1ZikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGVjb2RlIGJ1ZmZlciBpcyBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU2NvcGVkUHlPYmplY3Qgc3RyaW5naW9idWYoUHlPYmplY3RfR2V0QXR0cih0cmFucywgSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKSkpOworICBpZiAoIXN0cmluZ2lvYnVmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghZGV0YWlsOjppbnB1dF9jaGVjayhzdHJpbmdpb2J1Zi5nZXQoKSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHN0cmluZ2lvIGlucHV0XyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFNjb3BlZFB5T2JqZWN0IHJlZmlsbF9jYWxsYWJsZShQeU9iamVjdF9HZXRBdHRyKHRyYW5zLCBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpKSk7CisgIGlmICghcmVmaWxsX2NhbGxhYmxlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghUHlDYWxsYWJsZV9DaGVjayhyZWZpbGxfY2FsbGFibGUuZ2V0KCkpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBjYWxsYWJsZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlucHV0Xy5zdHJpbmdpb2J1Zi5zd2FwKHN0cmluZ2lvYnVmKTsKKyAgaW5wdXRfLnJlZmlsbF9jYWxsYWJsZS5zd2FwKHJlZmlsbF9jYWxsYWJsZSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpwcmVwYXJlRW5jb2RlQnVmZmVyKCkgeworICBvdXRwdXRfID0gZGV0YWlsOjpuZXdfZW5jb2RlX2J1ZmZlcihJTklUX09VVEJVRl9TSVpFKTsKKyAgcmV0dXJuIG91dHB1dF8gIT0gTlVMTDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6ZW5jb2RlVmFsdWUoUHlPYmplY3QqIHZhbHVlLCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgLyoKKyAgICogUmVmY291bnRpbmcgU3RyYXRlZ3k6CisgICAqCisgICAqIFdlIGFzc3VtZSB0aGF0IGVsZW1lbnRzIG9mIHRoZSB0aHJpZnRfc3BlYyB0dXBsZSBhcmUgbm90IGdvaW5nIHRvIGJlCisgICAqIG11dGF0ZWQsIHNvIHdlIGRvbid0IHJlZiBjb3VudCB0aG9zZSBhdCBhbGwuIE90aGVyIHRoYW4gdGhhdCwgd2UgdHJ5IHRvCisgICAqIGtlZXAgYSByZWZlcmVuY2UgdG8gYWxsIHRoZSB1c2VyLWNyZWF0ZWQgb2JqZWN0cyB3aGlsZSB3ZSB3b3JrIHdpdGggdGhlbS4KKyAgICogZW5jb2RlVmFsdWUgYXNzdW1lcyB0aGF0IGEgcmVmZXJlbmNlIGlzIGFscmVhZHkgaGVsZC4gVGhlICpjYWxsZXIqIGlzCisgICAqIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyByZWZlcmVuY2VzCisgICAqLworCisgIHN3aXRjaCAodHlwZSkgeworCisgIGNhc2UgVF9CT09MOiB7CisgICAgaW50IHYgPSBQeU9iamVjdF9Jc1RydWUodmFsdWUpOworICAgIGlmICh2ID09IC0xKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGltcGwoKS0+d3JpdGVCb29sKHYpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMDg6IHsKKyAgICBpbnQ4X3QgdmFsOworCisgICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJOCh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMTY6IHsKKyAgICBpbnQxNl90IHZhbDsKKworICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJMTYodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFRfSTMyOiB7CisgICAgaW50MzJfdCB2YWw7CisKKyAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTMyKHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBUX0k2NDogeworICAgIGludDY0X3QgbnZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKHZhbHVlKTsKKworICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChudmFsKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghQ0hFQ0tfUkFOR0UobnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTY0KG52YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX0RPVUJMRTogeworICAgIGRvdWJsZSBudmFsID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKG52YWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZURvdWJsZShudmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICBTY29wZWRQeU9iamVjdCBudmFsOworCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgIG52YWwucmVzZXQoUHlVbmljb2RlX0FzVVRGOFN0cmluZyh2YWx1ZSkpOworICAgICAgaWYgKCFudmFsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgIG52YWwucmVzZXQodmFsdWUpOworICAgIH0KKworICAgIFB5X3NzaXplX3QgbGVuID0gUHlCeXRlc19TaXplKG52YWwuZ2V0KCkpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlU3RyaW5nKG52YWwuZ2V0KCksIHN0YXRpY19jYXN0PGludDMyX3Q+KGxlbikpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX0xJU1Q6CisgIGNhc2UgVF9TRVQ6IHsKKyAgICBTZXRMaXN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3NldF9saXN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFB5X3NzaXplX3QgbGVuID0gUHlPYmplY3RfTGVuZ3RoKHZhbHVlKTsKKyAgICBpZiAoIWRldGFpbDo6Y2hlY2tfc3NpemVfdF8zMihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFpbXBsKCktPndyaXRlTGlzdEJlZ2luKHZhbHVlLCBwYXJzZWRhcmdzLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsZW4pKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNjb3BlZFB5T2JqZWN0IGl0ZXJhdG9yKFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpKTsKKyAgICBpZiAoIWl0ZXJhdG9yKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgd2hpbGUgKFB5T2JqZWN0KiByYXdJdGVtID0gUHlJdGVyX05leHQoaXRlcmF0b3IuZ2V0KCkpKSB7CisgICAgICBTY29wZWRQeU9iamVjdCBpdGVtKHJhd0l0ZW0pOworICAgICAgaWYgKCFlbmNvZGVWYWx1ZShpdGVtLmdldCgpLCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSwgcGFyc2VkYXJncy50eXBlYXJncykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX01BUDogeworICAgIFB5X3NzaXplX3QgbGVuID0gUHlEaWN0X1NpemUodmFsdWUpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2VfbWFwX2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaW1wbCgpLT53cml0ZU1hcEJlZ2luKHZhbHVlLCBwYXJzZWRhcmdzLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsZW4pKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCogayA9IE5VTEw7CisgICAgUHlPYmplY3QqIHYgPSBOVUxMOworICAgIC8vIFRPRE8oYm1hdXJlcik6IHNob3VsZCBzdXBwb3J0IGFueSBtYXBwaW5nLCBub3QganVzdCBkaWN0cworICAgIHdoaWxlIChQeURpY3RfTmV4dCh2YWx1ZSwgJnBvcywgJmssICZ2KSkgeworICAgICAgaWYgKCFlbmNvZGVWYWx1ZShrLCBwYXJzZWRhcmdzLmt0YWcsIHBhcnNlZGFyZ3Mua3R5cGVhcmdzKQorICAgICAgICAgIHx8ICFlbmNvZGVWYWx1ZSh2LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHlfc3NpemVfdCBuc3BlYyA9IFB5VHVwbGVfU2l6ZShwYXJzZWRhcmdzLnNwZWMpOworICAgIGlmIChuc3BlYyA9PSAtMSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInNwZWMgaXMgbm90IGEgdHVwbGUiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZXRhaWw6OldyaXRlU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OndyaXRlU3RydWN0U2NvcGUodGhpcyk7CisgICAgaWYgKCFzY29wZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKFB5X3NzaXplX3QgaSA9IDA7IGkgPCBuc3BlYzsgaSsrKSB7CisgICAgICBQeU9iamVjdCogc3BlY190dXBsZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyc2VkYXJncy5zcGVjLCBpKTsKKyAgICAgIGlmIChzcGVjX3R1cGxlID09IFB5X05vbmUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7CisgICAgICBpZiAoIXBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoJnBhcnNlZHNwZWMsIHNwZWNfdHVwbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgaW5zdHZhbChQeU9iamVjdF9HZXRBdHRyKHZhbHVlLCBwYXJzZWRzcGVjLmF0dHJuYW1lKSk7CisKKyAgICAgIGlmICghaW5zdHZhbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0dmFsLmdldCgpID09IFB5X05vbmUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGJvb2wgcmVzID0gaW1wbCgpLT53cml0ZUZpZWxkKGluc3R2YWwuZ2V0KCksIHBhcnNlZHNwZWMpOworICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBpbXBsKCktPndyaXRlRmllbGRTdG9wKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VVEYxNjoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VNjQ6CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUgZm9yIGVuY29kZVZhbHVlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojpza2lwKFRUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVF9CT09MOgorICAgIHJldHVybiBpbXBsKCktPnNraXBCb29sKCk7CisgIGNhc2UgVF9JMDg6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEJ5dGUoKTsKKyAgY2FzZSBUX0kxNjoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwSTE2KCk7CisgIGNhc2UgVF9JMzI6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEkzMigpOworICBjYXNlIFRfSTY0OgorICAgIHJldHVybiBpbXBsKCktPnNraXBJNjQoKTsKKyAgY2FzZSBUX0RPVUJMRToKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwRG91YmxlKCk7CisKKyAgY2FzZSBUX1NUUklORzogeworICAgIHJldHVybiBpbXBsKCktPnNraXBTdHJpbmcoKTsKKyAgfQorCisgIGNhc2UgVF9MSVNUOgorICBjYXNlIFRfU0VUOiB7CisgICAgVFR5cGUgZXR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRMaXN0QmVnaW4oZXR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoIXNraXAoZXR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfTUFQOiB7CisgICAgVFR5cGUga3R5cGUgPSBUX1NUT1A7CisgICAgVFR5cGUgdnR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRNYXBCZWdpbihrdHlwZSwgdnR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoIXNraXAoa3R5cGUpIHx8ICFza2lwKHZ0eXBlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIGRldGFpbDo6UmVhZFN0cnVjdFNjb3BlPEltcGw+IHNjb3BlID0gZGV0YWlsOjpyZWFkU3RydWN0U2NvcGUodGhpcyk7CisgICAgaWYgKCFzY29wZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgVFR5cGUgdHlwZSA9IFRfU1RPUDsKKyAgICAgIGludDE2X3QgdGFnOworICAgICAgaWYgKCFpbXBsKCktPnJlYWRGaWVsZEJlZ2luKHR5cGUsIHRhZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VVEYxNjoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VNjQ6CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUgZm9yIHNraXA6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpkZWNvZGVWYWx1ZShUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisKKyAgY2FzZSBUX0JPT0w6IHsKKyAgICBib29sIHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkQm9vbCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh2KSB7CisgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgfQorICBjYXNlIFRfSTA4OiB7CisgICAgaW50OF90IHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkSTgodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKyAgY2FzZSBUX0kxNjogeworICAgIGludDE2X3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJMTYodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKyAgY2FzZSBUX0kzMjogeworICAgIGludDMyX3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJMzIodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKworICBjYXNlIFRfSTY0OiB7CisgICAgaW50NjRfdCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEk2NCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgd2UgY2FuIHRha2UgdGhpcyBmYXN0cGF0aCBhbHdheXMgd2hlbgorICAgIC8vICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpLgorICAgIGlmIChDSEVDS19SQU5HRSh2LCBMT05HX01JTiwgTE9OR19NQVgpKSB7CisgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdik7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHYpOworICB9CisKKyAgY2FzZSBUX0RPVUJMRTogeworICAgIGRvdWJsZSB2ID0gMC4wOworICAgIGlmICghaW1wbCgpLT5yZWFkRG91YmxlKHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2KTsKKyAgfQorCisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICBjaGFyKiBidWYgPSBOVUxMOworICAgIGludCBsZW4gPSBpbXBsKCktPnJlYWRTdHJpbmcoJmJ1Zik7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaXNVdGY4KHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4KGJ1ZiwgbGVuLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOworICAgIH0KKyAgfQorCisgIGNhc2UgVF9MSVNUOgorICBjYXNlIFRfU0VUOiB7CisgICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFRUeXBlIGV0eXBlID0gVF9TVE9QOworICAgIGludDMyX3QgbGVuID0gaW1wbCgpLT5yZWFkTGlzdEJlZ2luKGV0eXBlKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChsZW4gPiAwICYmICFjaGVja1R5cGUoZXR5cGUsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYm9vbCB1c2VfdHVwbGUgPSB0eXBlID09IFRfTElTVCAmJiBwYXJzZWRhcmdzLmltbXV0YWJsZTsKKyAgICBTY29wZWRQeU9iamVjdCByZXQodXNlX3R1cGxlID8gUHlUdXBsZV9OZXcobGVuKSA6IFB5TGlzdF9OZXcobGVuKSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIFB5T2JqZWN0KiBpdGVtID0gZGVjb2RlVmFsdWUoZXR5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpOworICAgICAgaWYgKCFpdGVtKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgaWYgKHVzZV90dXBsZSkgeworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJldC5nZXQoKSwgaSwgaXRlbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmV0LmdldCgpLCBpLCBpdGVtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIGJpdGluZyB0aGUgYnVsbGV0IGFuZCBtYWtpbmcgdHdvIHNlcGFyYXRlIGNhc2VzCisgICAgLy8gICAgICAgICAgICAgICBmb3IgbGlzdCBhbmQgc2V0LCBhdm9pZGluZyB0aGlzIHBvc3QgZmFjdG8gY29udmVyc2lvbi4KKyAgICBpZiAodHlwZSA9PSBUX1NFVCkgeworICAgICAgUHlPYmplY3QqIHNldHJldDsKKyAgICAgIHNldHJldCA9IHBhcnNlZGFyZ3MuaW1tdXRhYmxlID8gUHlGcm96ZW5TZXRfTmV3KHJldC5nZXQoKSkgOiBQeVNldF9OZXcocmV0LmdldCgpKTsKKyAgICAgIHJldHVybiBzZXRyZXQ7CisgICAgfQorICAgIHJldHVybiByZXQucmVsZWFzZSgpOworICB9CisKKyAgY2FzZSBUX01BUDogeworICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUVHlwZSBrdHlwZSA9IFRfU1RPUDsKKyAgICBUVHlwZSB2dHlwZSA9IFRfU1RPUDsKKyAgICB1aW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRNYXBCZWdpbihrdHlwZSwgdnR5cGUpOworICAgIGlmIChsZW4gPiAwICYmICghY2hlY2tUeXBlKGt0eXBlLCBwYXJzZWRhcmdzLmt0YWcpIHx8ICFjaGVja1R5cGUodnR5cGUsIHBhcnNlZGFyZ3MudnRhZykpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTY29wZWRQeU9iamVjdCByZXQoUHlEaWN0X05ldygpKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBTY29wZWRQeU9iamVjdCBrKGRlY29kZVZhbHVlKGt0eXBlLCBwYXJzZWRhcmdzLmt0eXBlYXJncykpOworICAgICAgaWYgKCFrKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgU2NvcGVkUHlPYmplY3QgdihkZWNvZGVWYWx1ZSh2dHlwZSwgcGFyc2VkYXJncy52dHlwZWFyZ3MpKTsKKyAgICAgIGlmICghdikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChQeURpY3RfU2V0SXRlbShyZXQuZ2V0KCksIGsuZ2V0KCksIHYuZ2V0KCkpID09IC0xKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwYXJzZWRhcmdzLmltbXV0YWJsZSkgeworICAgICAgaWYgKCFUaHJpZnRNb2R1bGUpIHsKKyAgICAgICAgVGhyaWZ0TW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ0aHJpZnQuVGhyaWZ0Iik7CisgICAgICB9CisgICAgICBpZiAoIVRocmlmdE1vZHVsZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgY2xzKFB5T2JqZWN0X0dldEF0dHIoVGhyaWZ0TW9kdWxlLCBJTlRFUk5fU1RSSU5HKFRGcm96ZW5EaWN0KSkpOworICAgICAgaWYgKCFjbHMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGFyZyhQeVR1cGxlX05ldygxKSk7CisgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZy5nZXQoKSwgMCwgcmV0LnJlbGVhc2UoKSk7CisgICAgICByZXQucmVzZXQoUHlPYmplY3RfQ2FsbE9iamVjdChjbHMuZ2V0KCksIGFyZy5nZXQoKSkpOworICAgIH0KKworICAgIHJldHVybiByZXQucmVsZWFzZSgpOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRTdHJ1Y3QoUHlfTm9uZSwgcGFyc2VkYXJncy5rbGFzcywgcGFyc2VkYXJncy5zcGVjKTsKKyAgfQorCisgIGNhc2UgVF9TVE9QOgorICBjYXNlIFRfVk9JRDoKKyAgY2FzZSBUX1VURjE2OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1U2NDoKKyAgZGVmYXVsdDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSBmb3IgZGVjb2RlVmFsdWU6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpyZWFkU3RydWN0KFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBrbGFzcywgUHlPYmplY3QqIHNwZWNfc2VxKSB7CisgIGludCBzcGVjX3NlcV9sZW4gPSBQeVR1cGxlX1NpemUoc3BlY19zZXEpOworICBib29sIGltbXV0YWJsZSA9IG91dHB1dCA9PSBQeV9Ob25lOworICBTY29wZWRQeU9iamVjdCBrd2FyZ3M7CisgIGlmIChzcGVjX3NlcV9sZW4gPT0gLTEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChpbW11dGFibGUpIHsKKyAgICBrd2FyZ3MucmVzZXQoUHlEaWN0X05ldygpKTsKKyAgICBpZiAoIWt3YXJncykgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZhaWxlZCB0byBwcmVwYXJlIGt3YXJndW1lbnQgc3RvcmFnZSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgZGV0YWlsOjpSZWFkU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OnJlYWRTdHJ1Y3RTY29wZSh0aGlzKTsKKyAgaWYgKCFzY29wZSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHdoaWxlICh0cnVlKSB7CisgICAgVFR5cGUgdHlwZSA9IFRfU1RPUDsKKyAgICBpbnQxNl90IHRhZzsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEZpZWxkQmVnaW4odHlwZSwgdGFnKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh0YWcgPCAwIHx8IHRhZyA+PSBzcGVjX3NlcV9sZW4pIHsKKyAgICAgIGlmICghc2tpcCh0eXBlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXJyb3Igd2hpbGUgc2tpcHBpbmcgdW5rbm93biBmaWVsZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFB5T2JqZWN0KiBpdGVtX3NwZWMgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfc2VxLCB0YWcpOworICAgIGlmIChpdGVtX3NwZWMgPT0gUHlfTm9uZSkgeworICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFcnJvciB3aGlsZSBza2lwcGluZyB1bmtub3duIGZpZWxkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBpdGVtX3NwZWMpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHBhcnNlZHNwZWMudHlwZSAhPSB0eXBlKSB7CisgICAgICBpZiAoIXNraXAodHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0cnVjdCBmaWVsZCBoYWQgd3JvbmcgdHlwZTogZXhwZWN0ZWQgJWQgYnV0IGdvdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICBwYXJzZWRzcGVjLnR5cGUsIHR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFNjb3BlZFB5T2JqZWN0IGZpZWxkdmFsKGRlY29kZVZhbHVlKHBhcnNlZHNwZWMudHlwZSwgcGFyc2Vkc3BlYy50eXBlYXJncykpOworICAgIGlmICghZmllbGR2YWwpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICgoaW1tdXRhYmxlICYmIFB5RGljdF9TZXRJdGVtKGt3YXJncy5nZXQoKSwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwuZ2V0KCkpID09IC0xKQorICAgICAgICB8fCAoIWltbXV0YWJsZSAmJiBQeU9iamVjdF9TZXRBdHRyKG91dHB1dCwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwuZ2V0KCkpID09IC0xKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIGlmIChpbW11dGFibGUpIHsKKyAgICBTY29wZWRQeU9iamVjdCBhcmdzKFB5VHVwbGVfTmV3KDApKTsKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJmYWlsZWQgdG8gcHJlcGFyZSBhcmd1bWVudCBzdG9yYWdlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGwoa2xhc3MsIGFyZ3MuZ2V0KCksIGt3YXJncy5nZXQoKSk7CisgIH0KKyAgUHlfSU5DUkVGKG91dHB1dCk7CisgIHJldHVybiBvdXRwdXQ7Cit9Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX1BST1RPQ09MX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcCBiL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ0M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJleHQvdHlwZXMuaCIKKyNpbmNsdWRlICJleHQvcHJvdG9jb2wuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK1B5T2JqZWN0KiBUaHJpZnRNb2R1bGUgPSBOVUxMOworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK2NoYXIgcmVmaWxsX3NpZ25hdHVyZVtdID0geydzJywgJyMnLCAnaSd9OworI2Vsc2UKK2NvbnN0IGNoYXIqIHJlZmlsbF9zaWduYXR1cmUgPSAieSNpIjsKKyNlbmRpZgorCitib29sIHBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoU3RydWN0SXRlbVNwZWMqIGRlc3QsIFB5T2JqZWN0KiBzcGVjX3R1cGxlKSB7CisgIC8vIGknZCBsaWtlIHRvIHVzZSBQYXJzZUFyZ3MgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIGEgYm90dGxlbmVjay4KKyAgaWYgKFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSAhPSA1KSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3Igc3BlYyB0dXBsZSBidXQgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihQeVR1cGxlX1NpemUoc3BlY190dXBsZSkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT50YWcgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMCkpKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnRhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT50eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDEpKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT50eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmF0dHJuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAyKTsKKyAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDMpOworICBkZXN0LT5kZWZ2YWwgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9zZXRfbGlzdF9hcmdzKFNldExpc3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDMpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHR1cGxlIG9mIHNpemUgMyBmb3IgbGlzdC9zZXQgdHlwZSBhcmdzIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+ZWxlbWVudF90eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+ZWxlbWVudF90eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisKKyAgZGVzdC0+aW1tdXRhYmxlID0gUHlfVHJ1ZSA9PSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9tYXBfYXJncyhNYXBUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDUpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIDUgYXJndW1lbnRzIGZvciB0eXBlYXJncyB0byBtYXAiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5rdGFnID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+a3RhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT52dGFnID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dnRhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5rdHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKKyAgZGVzdC0+dnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMyk7CisgIGRlc3QtPmltbXV0YWJsZSA9IFB5X1RydWUgPT0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgNCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICBpZiAoUHlMaXN0X1NpemUodHlwZWFyZ3MpICE9IDIpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIGxpc3Qgb2Ygc2l6ZSAyIGZvciBzdHJ1Y3QgYXJncyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmtsYXNzID0gUHlMaXN0X0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKKyAgZGVzdC0+c3BlYyA9IFB5TGlzdF9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisKKyAgcmV0dXJuIHRydWU7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC90eXBlcy5oIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Q4ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9UWVBFU19ICisjZGVmaW5lIFRIUklGVF9QWV9UWVBFU19ICisKKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFRPRE86IGJldHRlciBtYWNyb3MKKyNkZWZpbmUgUHlJbnRfQXNMb25nKHYpIFB5TG9uZ19Bc0xvbmcodikKKyNkZWZpbmUgUHlJbnRfRnJvbUxvbmcodikgUHlMb25nX0Zyb21Mb25nKHYpCisKKyNkZWZpbmUgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyh2KSBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZyh2KQorCisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5fU1RSSU5HKHZhbHVlKSBfaW50ZXJuXyMjdmFsdWUKKworI2RlZmluZSBJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSAoKCh2KSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKworZXh0ZXJuICJDIiB7CitleHRlcm4gUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpOworZXh0ZXJuIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOworZXh0ZXJuIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworfQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworZXh0ZXJuIFB5T2JqZWN0KiBUaHJpZnRNb2R1bGU7CisKKy8vIFN0b2xlbiBvdXQgb2YgVFByb3RvY29sLmguCisvLyBJdCB3b3VsZCBiZSBhIGh1Z2UgcGFpbiB0byBoYXZlIGJvdGggZ2V0IHRoaXMgZnJvbSBvbmUgcGxhY2UuCitlbnVtIFRUeXBlIHsKKyAgVF9JTlZBTElEID0gLTEsCisgIFRfU1RPUCA9IDAsCisgIFRfVk9JRCA9IDEsCisgIFRfQk9PTCA9IDIsCisgIFRfQllURSA9IDMsCisgIFRfSTA4ID0gMywKKyAgVF9JMTYgPSA2LAorICBUX0kzMiA9IDgsCisgIFRfVTY0ID0gOSwKKyAgVF9JNjQgPSAxMCwKKyAgVF9ET1VCTEUgPSA0LAorICBUX1NUUklORyA9IDExLAorICBUX1VURjcgPSAxMSwKKyAgVF9TVFJVQ1QgPSAxMiwKKyAgVF9NQVAgPSAxMywKKyAgVF9TRVQgPSAxNCwKKyAgVF9MSVNUID0gMTUsCisgIFRfVVRGOCA9IDE2LAorICBUX1VURjE2ID0gMTcKK307CisKKy8vIHJlcGxhY2Ugd2l0aCB1bmlxdWVfcHRyIHdoZW4gd2UncmUgT0sgd2l0aCBDKysxMQorY2xhc3MgU2NvcGVkUHlPYmplY3QgeworcHVibGljOgorICBTY29wZWRQeU9iamVjdCgpIDogb2JqXyhOVUxMKSB7fQorICBleHBsaWNpdCBTY29wZWRQeU9iamVjdChQeU9iamVjdCogcHlfb2JqZWN0KSA6IG9ial8ocHlfb2JqZWN0KSB7fQorICB+U2NvcGVkUHlPYmplY3QoKSB7CisgICAgaWYgKG9ial8pCisgICAgICBQeV9ERUNSRUYob2JqXyk7CisgIH0KKyAgUHlPYmplY3QqIGdldCgpIHRocm93KCkgeyByZXR1cm4gb2JqXzsgfQorICBvcGVyYXRvciBib29sKCkgeyByZXR1cm4gb2JqXzsgfQorICB2b2lkIHJlc2V0KFB5T2JqZWN0KiBweV9vYmplY3QpIHRocm93KCkgeworICAgIGlmIChvYmpfKQorICAgICAgUHlfREVDUkVGKG9ial8pOworICAgIG9ial8gPSBweV9vYmplY3Q7CisgIH0KKyAgUHlPYmplY3QqIHJlbGVhc2UoKSB0aHJvdygpIHsKKyAgICBQeU9iamVjdCogdG1wID0gb2JqXzsKKyAgICBvYmpfID0gTlVMTDsKKyAgICByZXR1cm4gdG1wOworICB9CisgIHZvaWQgc3dhcChTY29wZWRQeU9iamVjdCYgb3RoZXIpIHRocm93KCkgeworICAgIFNjb3BlZFB5T2JqZWN0IHRtcChvdGhlci5yZWxlYXNlKCkpOworICAgIG90aGVyLnJlc2V0KHJlbGVhc2UoKSk7CisgICAgcmVzZXQodG1wLnJlbGVhc2UoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgU2NvcGVkUHlPYmplY3QoY29uc3QgU2NvcGVkUHlPYmplY3QmKSB7fQorICBTY29wZWRQeU9iamVjdCYgb3BlcmF0b3I9KGNvbnN0IFNjb3BlZFB5T2JqZWN0JikgeyByZXR1cm4gKnRoaXM7IH0KKworICBQeU9iamVjdCogb2JqXzsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgdHdvIGtleSBhdHRyaWJ1dGVzIG9mIGEgQ1JlYWRhYmxlVHJhbnNwb3J0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlPYmplY3RfR2V0QXR0ci4KKyAqLworc3RydWN0IERlY29kZUJ1ZmZlciB7CisgIFNjb3BlZFB5T2JqZWN0IHN0cmluZ2lvYnVmOworICBTY29wZWRQeU9iamVjdCByZWZpbGxfY2FsbGFibGU7Cit9OworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK2V4dGVybiBjaGFyIHJlZmlsbF9zaWduYXR1cmVbM107Cit0eXBlZGVmIFB5T2JqZWN0IEVuY29kZUJ1ZmZlcjsKKyNlbHNlCitleHRlcm4gY29uc3QgY2hhciogcmVmaWxsX3NpZ25hdHVyZTsKK3N0cnVjdCBFbmNvZGVCdWZmZXIgeworICBzdGQ6OnZlY3RvcjxjaGFyPiBidWY7CisgIHNpemVfdCBwb3M7Cit9OworI2VuZGlmCisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHNldCBvciBsaXN0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IFNldExpc3RUeXBlQXJncyB7CisgIFRUeXBlIGVsZW1lbnRfdHlwZTsKKyAgUHlPYmplY3QqIHR5cGVhcmdzOworICBib29sIGltbXV0YWJsZTsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIG1hcCwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCisgKi8KK3N0cnVjdCBNYXBUeXBlQXJncyB7CisgIFRUeXBlIGt0YWc7CisgIFRUeXBlIHZ0YWc7CisgIFB5T2JqZWN0KiBrdHlwZWFyZ3M7CisgIFB5T2JqZWN0KiB2dHlwZWFyZ3M7CisgIGJvb2wgaW1tdXRhYmxlOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc3RydWN0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IFN0cnVjdFR5cGVBcmdzIHsKKyAgUHlPYmplY3QqIGtsYXNzOworICBQeU9iamVjdCogc3BlYzsKKyAgYm9vbCBpbW11dGFibGU7Cit9OworCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIGl0ZW0gc3BlYyBmcm9tIGEgc3RydWN0IHNwZWNpZmljYXRpb24sCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU3RydWN0SXRlbVNwZWMgeworICBpbnQgdGFnOworICBUVHlwZSB0eXBlOworICBQeU9iamVjdCogYXR0cm5hbWU7CisgIFB5T2JqZWN0KiB0eXBlYXJnczsKKyAgUHlPYmplY3QqIGRlZnZhbDsKK307CisKK2Jvb2wgcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2VfbWFwX2FyZ3MoTWFwVHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyhTdHJ1Y3RJdGVtU3BlYyogZGVzdCwgUHlPYmplY3QqIHNwZWNfdHVwbGUpOworfQorfQorfQorCisjZW5kaWYgLy8gVEhSSUZUX1BZX1RZUEVTX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTFiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5CkBAIC0wLDAgKzEsODIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKworCitjbGFzcyBUQmFzZShvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkgZm9yIGtleSBpbiBzZWxmLl9fc2xvdHNfX10KKyAgICAgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLl9fc2xvdHNfXzoKKyAgICAgICAgICAgIG15X3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKKyAgICAgICAgICAgIG90aGVyX3ZhbCA9IGdldGF0dHIob3RoZXIsIGF0dHIpCisgICAgICAgICAgICBpZiBteV92YWwgIT0gb3RoZXJfdmFsOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKKyAgICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgICAgIGlmIChpcHJvdC5fZmFzdF9kZWNvZGUgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgaXByb3QuX2Zhc3RfZGVjb2RlKHNlbGYsIGlwcm90LCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXByb3QucmVhZFN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICAgICAgaWYgKG9wcm90Ll9mYXN0X2VuY29kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBvcHJvdC50cmFucy53cml0ZSgKKyAgICAgICAgICAgICAgICBvcHJvdC5fZmFzdF9lbmNvZGUoc2VsZiwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQorCisKK2NsYXNzIFRFeGNlcHRpb25CYXNlKFRCYXNlLCBFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBURnJvemVuQmFzZShUQmFzZSk6CisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBtb2RpZnkgZnJvemVuIHN0cnVjdCIpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gc3RydWN0IikKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBoYXNoKHNlbGYuX19jbGFzc19fKSBeIGhhc2goc2VsZi5fX3Nsb3RzX18pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgcmVhZChjbHMsIGlwcm90KToKKyAgICAgICAgaWYgKGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCisgICAgICAgICAgICAgICAgY2xzLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgIHNlbGYgPSBjbHMoKQorICAgICAgICAgICAgcmV0dXJuIGlwcm90Ll9mYXN0X2RlY29kZShOb25lLCBpcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBpcHJvdC5yZWFkU3RydWN0KGNscywgY2xzLnRocmlmdF9zcGVjLCBUcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQppbmRleCA1MGM2YWE4Li5mNmJlNzcyIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQpAQCAtMTcsMjQzICsxNywyODUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFByb3RvY29sIGltcG9ydCAqCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24KIGZyb20gc3RydWN0IGltcG9ydCBwYWNrLCB1bnBhY2sKIAorCiBjbGFzcyBUQmluYXJ5UHJvdG9jb2woVFByb3RvY29sQmFzZSk6CisgICAgIiIiQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgogCi0gICIiIkJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKKyAgICAjIE5hc3R5SGF4eC4gUHl0aG9uIDIuNCsgb24gMzItYml0IG1hY2hpbmVzIGZvcmNlcyBoZXggY29uc3RhbnRzIHRvIGJlCisgICAgIyBwb3NpdGl2ZSwgY29udmVydGluZyB0aGlzIGludG8gYSBsb25nLiBJZiB3ZSBoYXJkY29kZSB0aGUgaW50IHZhbHVlCisgICAgIyBpbnN0ZWFkIGl0J2xsIHN0YXkgaW4gMzIgYml0LWxhbmQuCiAKLSAgIyBOYXN0eUhheHguIFB5dGhvbiAyLjQrIG9uIDMyLWJpdCBtYWNoaW5lcyBmb3JjZXMgaGV4IGNvbnN0YW50cyB0byBiZQotICAjIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKLSAgIyBpbnN0ZWFkIGl0J2xsIHN0YXkgaW4gMzIgYml0LWxhbmQuCisgICAgIyBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwCisgICAgVkVSU0lPTl9NQVNLID0gLTY1NTM2CiAKLSAgIyBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwCi0gIFZFUlNJT05fTUFTSyA9IC02NTUzNgorICAgICMgVkVSU0lPTl8xID0gMHg4MDAxMDAwMAorICAgIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyCiAKLSAgIyBWRVJTSU9OXzEgPSAweDgwMDEwMDAwCi0gIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyCisgICAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZgogCi0gIFRZUEVfTUFTSyA9IDB4MDAwMDAwZmYKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHN0cmljdFJlYWQ9RmFsc2UsIHN0cmljdFdyaXRlPVRydWUsICoqa3dhcmdzKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgICAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnc3RyaW5nX2xlbmd0aF9saW1pdCcsIE5vbmUpCisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ2NvbnRhaW5lcl9sZW5ndGhfbGltaXQnLCBOb25lKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSk6Ci0gICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKLSAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCi0gICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgICAgZGVmIF9jaGVja19zdHJpbmdfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgotICAgIGlmIHNlbGYuc3RyaWN0V3JpdGU6Ci0gICAgICBzZWxmLndyaXRlSTMyKFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEgfCB0eXBlKQotICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQotICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKLSAgICBlbHNlOgotICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQotICAgICAgc2VsZi53cml0ZUJ5dGUodHlwZSkKLSAgICAgIHNlbGYud3JpdGVJMzIoc2VxaWQpCisgICAgZGVmIF9jaGVja19jb250YWluZXJfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgorICAgICAgICBpZiBzZWxmLnN0cmljdFdyaXRlOgorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xIHwgdHlwZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVTdHJpbmcobmFtZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVJMzIoc2VxaWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKIAotICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIGlkKToKLSAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQotICAgIHNlbGYud3JpdGVJMTYoaWQpCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgaWQpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTE2KGlkKQogCi0gIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKLSAgICBzZWxmLndyaXRlQnl0ZShUVHlwZS5TVE9QKTsKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoa3R5cGUpCi0gICAgc2VsZi53cml0ZUJ5dGUodnR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoVFR5cGUuU1RPUCkKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGt0eXBlKQorICAgICAgICBzZWxmLndyaXRlQnl0ZSh2dHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUkzMihzaXplKQogCi0gIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTMyKHNpemUpCiAKLSAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQotICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTMyKHNpemUpCiAKLSAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKLSAgICBpZiBib29sOgotICAgICAgc2VsZi53cml0ZUJ5dGUoMSkKLSAgICBlbHNlOgotICAgICAgc2VsZi53cml0ZUJ5dGUoMCkKKyAgICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIGJ1ZmYgPSBwYWNrKCIhYiIsIGJ5dGUpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6CisgICAgICAgIGlmIGJvb2w6CisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZUJ5dGUoMCkKIAotICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKLSAgICBidWZmID0gcGFjaygiIWgiLCBpMTYpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhYiIsIGJ5dGUpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKLSAgICBidWZmID0gcGFjaygiIWkiLCBpMzIpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBidWZmID0gcGFjaygiIWgiLCBpMTYpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKLSAgICBidWZmID0gcGFjaygiIXEiLCBpNjQpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBidWZmID0gcGFjaygiIWkiLCBpMzIpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKLSAgICBidWZmID0gcGFjaygiIWQiLCBkdWIpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBidWZmID0gcGFjaygiIXEiLCBpNjQpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyKToKLSAgICBzZWxmLndyaXRlSTMyKGxlbihzdHIpKQotICAgIHNlbGYudHJhbnMud3JpdGUoc3RyKQorICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICBidWZmID0gcGFjaygiIWQiLCBkdWIpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKLSAgICBzeiA9IHNlbGYucmVhZEkzMigpCi0gICAgaWYgc3ogPCAwOgotICAgICAgdmVyc2lvbiA9IHN6ICYgVEJpbmFyeVByb3RvY29sLlZFUlNJT05fTUFTSwotICAgICAgaWYgdmVyc2lvbiAhPSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xOgotICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sIG1lc3NhZ2U9J0JhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICVkJyAlIChzeikpCi0gICAgICB0eXBlID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVFlQRV9NQVNLCi0gICAgICBuYW1lID0gc2VsZi5yZWFkU3RyaW5nKCkKLSAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKLSAgICBlbHNlOgotICAgICAgaWYgc2VsZi5zdHJpY3RSZWFkOgotICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sIG1lc3NhZ2U9J05vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyJykKLSAgICAgIG5hbWUgPSBzZWxmLnRyYW5zLnJlYWRBbGwoc3opCi0gICAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgICBzZXFpZCA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICBkZWYgd3JpdGVCaW5hcnkoc2VsZiwgc3RyKToKKyAgICAgICAgc2VsZi53cml0ZUkzMihsZW4oc3RyKSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShzdHIpCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc3ogPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBpZiBzeiA8IDA6CisgICAgICAgICAgICB2ZXJzaW9uID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLCisgICAgICAgICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICB0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogJWQnICUgKHN6KSkKKyAgICAgICAgICAgIHR5cGUgPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5UWVBFX01BU0sKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJpbmcoKQorICAgICAgICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3RSZWFkOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInKQorICAgICAgICAgICAgbmFtZSA9IHNlbGYudHJhbnMucmVhZEFsbChzeikKKyAgICAgICAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKIAotICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgcmV0dXJuIChOb25lLCB0eXBlLCAwKQotICAgIGlkID0gc2VsZi5yZWFkSTE2KCkKLSAgICByZXR1cm4gKE5vbmUsIHR5cGUsIGlkKQorICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgIHJldHVybiAoTm9uZSwgdHlwZSwgMCkKKyAgICAgICAgaWQgPSBzZWxmLnJlYWRJMTYoKQorICAgICAgICByZXR1cm4gKE5vbmUsIHR5cGUsIGlkKQogCi0gIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6Ci0gICAga3R5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICB2dHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQotICAgIHJldHVybiAoa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAga3R5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgdnR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCiAKLSAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6Ci0gICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKGV0eXBlLCBzaXplKQorICAgIGRlZiByZWFkTWFwRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKKyAgICAgICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgotICAgIGV0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFNldEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgYnl0ZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIGlmIGJ5dGUgPT0gMDoKLSAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCisgICAgZGVmIHJlYWRTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEJ5dGUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgxKQotICAgIHZhbCwgPSB1bnBhY2soJyFiJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBieXRlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGlmIGJ5dGUgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIGRlZiByZWFkSTE2KHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoMikKLSAgICB2YWwsID0gdW5wYWNrKCchaCcsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgxKQorICAgICAgICB2YWwsID0gdW5wYWNrKCchYicsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZEkzMihzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDQpCi0gICAgdmFsLCA9IHVucGFjaygnIWknLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgyKQorICAgICAgICB2YWwsID0gdW5wYWNrKCchaCcsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZEk2NChzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnIXEnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg0KQorICAgICAgICB2YWwsID0gdW5wYWNrKCchaScsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZERvdWJsZShzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnIWQnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEk2NChzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQorICAgICAgICB2YWwsID0gdW5wYWNrKCchcScsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZFN0cmluZyhzZWxmKToKLSAgICBsZW4gPSBzZWxmLnJlYWRJMzIoKQotICAgIHN0ciA9IHNlbGYudHJhbnMucmVhZEFsbChsZW4pCi0gICAgcmV0dXJuIHN0cgorICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFkJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBzZWxmLl9jaGVja19zdHJpbmdfbGVuZ3RoKHNpemUpCisgICAgICAgIHMgPSBzZWxmLnRyYW5zLnJlYWRBbGwoc2l6ZSkKKyAgICAgICAgcmV0dXJuIHMKIAogCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OgotICBkZWYgX19pbml0X18oc2VsZiwgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSk6Ci0gICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAotICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKKyAgICAgICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ3N0cmluZ19sZW5ndGhfbGltaXQnLCBOb25lKQorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBrd2FyZ3MuZ2V0KCdjb250YWluZXJfbGVuZ3RoX2xpbWl0JywgTm9uZSkKIAotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHNlbGYuc3RyaWN0UmVhZCwgc2VsZi5zdHJpY3RXcml0ZSkKLSAgICByZXR1cm4gcHJvdAorICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHNlbGYuc3RyaWN0UmVhZCwgc2VsZi5zdHJpY3RXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PXNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCkKKyAgICAgICAgcmV0dXJuIHByb3QKIAogCiBjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZChUQmluYXJ5UHJvdG9jb2wpOgorICAgICIiIkMtQWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiBUQmluYXJ5UHJvdG9jb2wuCiAKLSAgIiIiQy1BY2NlbGVyYXRlZCB2ZXJzaW9uIG9mIFRCaW5hcnlQcm90b2NvbC4KKyAgICBUaGlzIGNsYXNzIGRvZXMgbm90IG92ZXJyaWRlIGFueSBvZiBUQmluYXJ5UHJvdG9jb2wncyBtZXRob2RzLAorICAgIGJ1dCB0aGUgZ2VuZXJhdGVkIGNvZGUgcmVjb2duaXplcyBpdCBkaXJlY3RseSBhbmQgd2lsbCBjYWxsIGludG8KKyAgICBvdXIgQyBtb2R1bGUgdG8gZG8gdGhlIGVuY29kaW5nLCBieXBhc3NpbmcgdGhpcyBvYmplY3QgZW50aXJlbHkuCisgICAgV2UgaW5oZXJpdCBmcm9tIFRCaW5hcnlQcm90b2NvbCBzbyB0aGF0IHRoZSBub3JtYWwgVEJpbmFyeVByb3RvY29sCisgICAgZW5jb2RpbmcgY2FuIGhhcHBlbiBpZiB0aGUgZmFzdGJpbmFyeSBtb2R1bGUgZG9lc24ndCB3b3JrIGZvciBzb21lCisgICAgcmVhc29uLiAgKFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGhhcHBlbiBzYW5lbHkgaW4gbW9yZSBjYXNlcy4pCisgICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLCBwYXNzIGZhbGxiYWNrPUZhbHNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50LgogCi0gIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgYW55IG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMsCi0gIGJ1dCB0aGUgZ2VuZXJhdGVkIGNvZGUgcmVjb2duaXplcyBpdCBkaXJlY3RseSBhbmQgd2lsbCBjYWxsIGludG8KLSAgb3VyIEMgbW9kdWxlIHRvIGRvIHRoZSBlbmNvZGluZywgYnlwYXNzaW5nIHRoaXMgb2JqZWN0IGVudGlyZWx5LgotICBXZSBpbmhlcml0IGZyb20gVEJpbmFyeVByb3RvY29sIHNvIHRoYXQgdGhlIG5vcm1hbCBUQmluYXJ5UHJvdG9jb2wKLSAgZW5jb2RpbmcgY2FuIGhhcHBlbiBpZiB0aGUgZmFzdGJpbmFyeSBtb2R1bGUgZG9lc24ndCB3b3JrIGZvciBzb21lCi0gIHJlYXNvbi4gIChUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBoYXBwZW4gc2FuZWx5IGluIG1vcmUgY2FzZXMuKQorICAgIEluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIG1vZHVsZSwganVzdCB1c2UKKyAgICBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnN0ZWFkIG9mIFRCaW5hcnlQcm90b2NvbC4KIAotICBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBtb2R1bGUsIGp1c3QgdXNlCi0gIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVEJpbmFyeVByb3RvY29sLgorICAgIE5PVEU6ICBUaGlzIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IGFuIGV4dGVybmFsIGRldmVsb3Blci4KKyAgICAgICAgICAgVGhlIGludGVybmFsIFRocmlmdCB0ZWFtIGhhcyByZXZpZXdlZCBhbmQgdGVzdGVkIGl0LAorICAgICAgICAgICBidXQgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IGlzIHByb2R1Y3Rpb24tcmVhZHkuCisgICAgICAgICAgIFBsZWFzZSBmZWVsIGZyZWUgdG8gcmVwb3J0IGJ1Z3MgYW5kL29yIHN1Y2Nlc3Mgc3RvcmllcworICAgICAgICAgICB0byB0aGUgcHVibGljIG1haWxpbmcgbGlzdC4KKyAgICAiIiIKKyAgICBwYXNzCiAKLSAgTk9URTogIFRoaXMgY29kZSB3YXMgY29udHJpYnV0ZWQgYnkgYW4gZXh0ZXJuYWwgZGV2ZWxvcGVyLgotICAgICAgICAgVGhlIGludGVybmFsIFRocmlmdCB0ZWFtIGhhcyByZXZpZXdlZCBhbmQgdGVzdGVkIGl0LAotICAgICAgICAgYnV0IHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBpdCBpcyBwcm9kdWN0aW9uLXJlYWR5LgotICAgICAgICAgUGxlYXNlIGZlZWwgZnJlZSB0byByZXBvcnQgYnVncyBhbmQvb3Igc3VjY2VzcyBzdG9yaWVzCi0gICAgICAgICB0byB0aGUgcHVibGljIG1haWxpbmcgbGlzdC4KLSAgIiIiCi0KLSAgcGFzcworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBmYWxsYmFjayA9IGt3YXJncy5wb3AoJ2ZhbGxiYWNrJywgVHJ1ZSkKKyAgICAgICAgc3VwZXIoVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IGZhc3RiaW5hcnkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaWYgbm90IGZhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeQorICAgICAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkKIAogCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3Rvcnk6Ci0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zKQorY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBmYWxsYmFjaz1UcnVlKToKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gc3RyaW5nX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBjb250YWluZXJfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuX2ZhbGxiYWNrID0gZmFsbGJhY2sKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgKKyAgICAgICAgICAgIHRyYW5zLAorICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1zZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsCisgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PXNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGZhbGxiYWNrPXNlbGYuX2ZhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODVjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkKQEAgLTAsMCArMSw0NzUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sIGNoZWNrSW50ZWdlckxpbWl0cworZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjaworCitmcm9tIC4uY29tcGF0IGltcG9ydCBiaW5hcnlfdG9fc3RyLCBzdHJfdG9fYmluYXJ5CisKK19fYWxsX18gPSBbJ1RDb21wYWN0UHJvdG9jb2wnLCAnVENvbXBhY3RQcm90b2NvbEZhY3RvcnknXQorCitDTEVBUiA9IDAKK0ZJRUxEX1dSSVRFID0gMQorVkFMVUVfV1JJVEUgPSAyCitDT05UQUlORVJfV1JJVEUgPSAzCitCT09MX1dSSVRFID0gNAorRklFTERfUkVBRCA9IDUKK0NPTlRBSU5FUl9SRUFEID0gNgorVkFMVUVfUkVBRCA9IDcKK0JPT0xfUkVBRCA9IDgKKworCitkZWYgbWFrZV9oZWxwZXIodl9mcm9tLCBjb250YWluZXIpOgorICAgIGRlZiBoZWxwZXIoZnVuYyk6CisgICAgICAgIGRlZiBuZXN0ZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluICh2X2Zyb20sIGNvbnRhaW5lciksIChzZWxmLnN0YXRlLCB2X2Zyb20sIGNvbnRhaW5lcikKKyAgICAgICAgICAgIHJldHVybiBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIG5lc3RlZAorICAgIHJldHVybiBoZWxwZXIKKworCit3cml0ZXIgPSBtYWtlX2hlbHBlcihWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKQorcmVhZGVyID0gbWFrZV9oZWxwZXIoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpCisKKworZGVmIG1ha2VaaWdaYWcobiwgYml0cyk6CisgICAgY2hlY2tJbnRlZ2VyTGltaXRzKG4sIGJpdHMpCisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gKGJpdHMgLSAxKSkKKworCitkZWYgZnJvbVppZ1phZyhuKToKKyAgICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKQorCisKK2RlZiB3cml0ZVZhcmludCh0cmFucywgbik6CisgICAgb3V0ID0gYnl0ZWFycmF5KCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBpZiBuICYgfjB4N2YgPT0gMDoKKyAgICAgICAgICAgIG91dC5hcHBlbmQobikKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXQuYXBwZW5kKChuICYgMHhmZikgfCAweDgwKQorICAgICAgICAgICAgbiA9IG4gPj4gNworICAgIHRyYW5zLndyaXRlKGJ5dGVzKG91dCkpCisKKworZGVmIHJlYWRWYXJpbnQodHJhbnMpOgorICAgIHJlc3VsdCA9IDAKKyAgICBzaGlmdCA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB4ID0gdHJhbnMucmVhZEFsbCgxKQorICAgICAgICBieXRlID0gb3JkKHgpCisgICAgICAgIHJlc3VsdCB8PSAoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0CisgICAgICAgIGlmIGJ5dGUgPj4gNyA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBzaGlmdCArPSA3CisKKworY2xhc3MgQ29tcGFjdFR5cGUob2JqZWN0KToKKyAgICBTVE9QID0gMHgwMAorICAgIFRSVUUgPSAweDAxCisgICAgRkFMU0UgPSAweDAyCisgICAgQllURSA9IDB4MDMKKyAgICBJMTYgPSAweDA0CisgICAgSTMyID0gMHgwNQorICAgIEk2NCA9IDB4MDYKKyAgICBET1VCTEUgPSAweDA3CisgICAgQklOQVJZID0gMHgwOAorICAgIExJU1QgPSAweDA5CisgICAgU0VUID0gMHgwQQorICAgIE1BUCA9IDB4MEIKKyAgICBTVFJVQ1QgPSAweDBDCisKKworQ1RZUEVTID0geworICAgIFRUeXBlLlNUT1A6IENvbXBhY3RUeXBlLlNUT1AsCisgICAgVFR5cGUuQk9PTDogQ29tcGFjdFR5cGUuVFJVRSwgICMgdXNlZCBmb3IgY29sbGVjdGlvbgorICAgIFRUeXBlLkJZVEU6IENvbXBhY3RUeXBlLkJZVEUsCisgICAgVFR5cGUuSTE2OiBDb21wYWN0VHlwZS5JMTYsCisgICAgVFR5cGUuSTMyOiBDb21wYWN0VHlwZS5JMzIsCisgICAgVFR5cGUuSTY0OiBDb21wYWN0VHlwZS5JNjQsCisgICAgVFR5cGUuRE9VQkxFOiBDb21wYWN0VHlwZS5ET1VCTEUsCisgICAgVFR5cGUuU1RSSU5HOiBDb21wYWN0VHlwZS5CSU5BUlksCisgICAgVFR5cGUuU1RSVUNUOiBDb21wYWN0VHlwZS5TVFJVQ1QsCisgICAgVFR5cGUuTElTVDogQ29tcGFjdFR5cGUuTElTVCwKKyAgICBUVHlwZS5TRVQ6IENvbXBhY3RUeXBlLlNFVCwKKyAgICBUVHlwZS5NQVA6IENvbXBhY3RUeXBlLk1BUCwKK30KKworVFRZUEVTID0ge30KK2ZvciBrLCB2IGluIENUWVBFUy5pdGVtcygpOgorICAgIFRUWVBFU1t2XSA9IGsKK1RUWVBFU1tDb21wYWN0VHlwZS5GQUxTRV0gPSBUVHlwZS5CT09MCitkZWwgaworZGVsIHYKKworCitjbGFzcyBUQ29tcGFjdFByb3RvY29sKFRQcm90b2NvbEJhc2UpOgorICAgICIiIkNvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCisKKyAgICBQUk9UT0NPTF9JRCA9IDB4ODIKKyAgICBWRVJTSU9OID0gMQorICAgIFZFUlNJT05fTUFTSyA9IDB4MWYKKyAgICBUWVBFX01BU0sgPSAweGUwCisgICAgVFlQRV9CSVRTID0gMHgwNworICAgIFRZUEVfU0hJRlRfQU1PVU5UID0gNQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSk6CisgICAgICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDTEVBUgorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSAwCisgICAgICAgIHNlbGYuX19ib29sX2ZpZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBOb25lCisgICAgICAgIHNlbGYuX19zdHJ1Y3RzID0gW10KKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMgPSBbXQorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKKworICAgIGRlZiBfY2hlY2tfc3RyaW5nX2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jaGVja19sZW5ndGgoc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LCBsZW5ndGgpCisKKyAgICBkZWYgX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQorCisgICAgZGVmIF9fd3JpdGVWYXJpbnQoc2VsZiwgbik6CisgICAgICAgIHdyaXRlVmFyaW50KHNlbGYudHJhbnMsIG4pCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgorICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShzZWxmLlBST1RPQ09MX0lEKQorICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShzZWxmLlZFUlNJT04gfCAodHlwZSA8PCBzZWxmLlRZUEVfU0hJRlRfQU1PVU5UKSkKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KHNlcWlkKQorICAgICAgICBzZWxmLl9fd3JpdGVCaW5hcnkoc3RyX3RvX2JpbmFyeShuYW1lKSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBWQUxVRV9XUklURQorICAgICAgICBzZWxmLnN0YXRlID0gQ0xFQVIKKworICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoQ0xFQVIsIENPTlRBSU5FUl9XUklURSwgVkFMVUVfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKworICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfV1JJVEUKKyAgICAgICAgc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkID0gc2VsZi5fX3N0cnVjdHMucG9wKCkKKworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQorCisgICAgZGVmIF9fd3JpdGVGaWVsZEhlYWRlcihzZWxmLCB0eXBlLCBmaWQpOgorICAgICAgICBkZWx0YSA9IGZpZCAtIHNlbGYuX19sYXN0X2ZpZAorICAgICAgICBpZiAwIDwgZGVsdGEgPD0gMTU6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShkZWx0YSA8PCA0IHwgdHlwZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUodHlwZSkKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUkxNihmaWQpCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IGZpZAorCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBmaWQpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURSwgc2VsZi5zdGF0ZQorICAgICAgICBpZiB0eXBlID09IFRUeXBlLkJPT0w6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9XUklURQorICAgICAgICAgICAgc2VsZi5fX2Jvb2xfZmlkID0gZmlkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfV1JJVEUKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKENUWVBFU1t0eXBlXSwgZmlkKQorCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQk9PTF9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCisKKyAgICBkZWYgX193cml0ZVVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFCJywgYnl0ZSkpCisKKyAgICBkZWYgX193cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnIWInLCBieXRlKSkKKworICAgIGRlZiBfX3dyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkxNiwgMTYpKQorCisgICAgZGVmIF9fd3JpdGVTaXplKHNlbGYsIGkzMik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChpMzIpCisKKyAgICBkZWYgd3JpdGVDb2xsZWN0aW9uQmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgaWYgc2l6ZSA8PSAxNDoKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNpemUgPDwgNCB8IENUWVBFU1tldHlwZV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZSgweGYwIHwgQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKKyAgICB3cml0ZVNldEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KKyAgICB3cml0ZUxpc3RCZWdpbiA9IHdyaXRlQ29sbGVjdGlvbkJlZ2luCisKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgaWYgc2l6ZSA9PSAwOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlU2l6ZShzaXplKQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoQ1RZUEVTW2t0eXBlXSA8PCA0IHwgQ1RZUEVTW3Z0eXBlXSkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKKworICAgIGRlZiB3cml0ZUNvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKKyAgICB3cml0ZU1hcEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAorICAgIHdyaXRlU2V0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCisgICAgd3JpdGVMaXN0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCisKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgorICAgICAgICBpZiBzZWxmLnN0YXRlID09IEJPT0xfV1JJVEU6CisgICAgICAgICAgICBpZiBib29sOgorICAgICAgICAgICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuVFJVRQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjdHlwZSA9IENvbXBhY3RUeXBlLkZBTFNFCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcihjdHlwZSwgc2VsZi5fX2Jvb2xfZmlkKQorICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFOgorICAgICAgICAgICAgaWYgYm9vbDoKKyAgICAgICAgICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKENvbXBhY3RUeXBlLlRSVUUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoQ29tcGFjdFR5cGUuRkFMU0UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sIikKKworICAgIHdyaXRlQnl0ZSA9IHdyaXRlcihfX3dyaXRlQnl0ZSkKKyAgICB3cml0ZUkxNiA9IHdyaXRlcihfX3dyaXRlSTE2KQorCisgICAgQHdyaXRlcgorICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpMzIsIDMyKSkKKworICAgIEB3cml0ZXIKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTY0LCA2NCkpCisKKyAgICBAd3JpdGVyCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnPGQnLCBkdWIpKQorCisgICAgZGVmIF9fd3JpdGVCaW5hcnkoc2VsZiwgcyk6CisgICAgICAgIHNlbGYuX193cml0ZVNpemUobGVuKHMpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHMpCisgICAgd3JpdGVCaW5hcnkgPSB3cml0ZXIoX193cml0ZUJpbmFyeSkKKworICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRCwgc2VsZi5zdGF0ZQorICAgICAgICB0eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIGlmIHR5cGUgJiAweDBmID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICByZXR1cm4gKE5vbmUsIDAsIDApCisgICAgICAgIGRlbHRhID0gdHlwZSA+PiA0CisgICAgICAgIGlmIGRlbHRhID09IDA6CisgICAgICAgICAgICBmaWQgPSBzZWxmLl9fcmVhZEkxNigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWQgPSBzZWxmLl9fbGFzdF9maWQgKyBkZWx0YQorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKKyAgICAgICAgdHlwZSA9IHR5cGUgJiAweDBmCisgICAgICAgIGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuVFJVRToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKKyAgICAgICAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gVHJ1ZQorICAgICAgICBlbGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuRkFMU0U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECisgICAgICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfUkVBRAorICAgICAgICByZXR1cm4gKE5vbmUsIHNlbGYuX19nZXRUVHlwZSh0eXBlKSwgZmlkKQorCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIEJPT0xfUkVBRCksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1JFQUQKKworICAgIGRlZiBfX3JlYWRVQnl0ZShzZWxmKToKKyAgICAgICAgcmVzdWx0LCA9IHVucGFjaygnIUInLCBzZWxmLnRyYW5zLnJlYWRBbGwoMSkpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX3JlYWRCeXRlKHNlbGYpOgorICAgICAgICByZXN1bHQsID0gdW5wYWNrKCchYicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9fcmVhZFZhcmludChzZWxmKToKKyAgICAgICAgcmV0dXJuIHJlYWRWYXJpbnQoc2VsZi50cmFucykKKworICAgIGRlZiBfX3JlYWRaaWdaYWcoc2VsZik6CisgICAgICAgIHJldHVybiBmcm9tWmlnWmFnKHNlbGYuX19yZWFkVmFyaW50KCkpCisKKyAgICBkZWYgX19yZWFkU2l6ZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fX3JlYWRWYXJpbnQoKQorICAgICAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKCJMZW5ndGggPCAwIikKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCisgICAgICAgIHByb3RvX2lkID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIGlmIHByb3RvX2lkICE9IHNlbGYuUFJPVE9DT0xfSUQ6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWQgcHJvdG9jb2wgaWQgaW4gdGhlIG1lc3NhZ2U6ICVkJyAlIHByb3RvX2lkKQorICAgICAgICB2ZXJfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICB0eXBlID0gKHZlcl90eXBlID4+IHNlbGYuVFlQRV9TSElGVF9BTU9VTlQpICYgc2VsZi5UWVBFX0JJVFMKKyAgICAgICAgdmVyc2lvbiA9IHZlcl90eXBlICYgc2VsZi5WRVJTSU9OX01BU0sKKyAgICAgICAgaWYgdmVyc2lvbiAhPSBzZWxmLlZFUlNJT046CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWQgdmVyc2lvbjogJWQgKGV4cGVjdCAlZCknICUgKHZlcnNpb24sIHNlbGYuVkVSU0lPTikpCisgICAgICAgIHNlcWlkID0gc2VsZi5fX3JlYWRWYXJpbnQoKQorICAgICAgICBuYW1lID0gYmluYXJ5X3RvX3N0cihzZWxmLl9fcmVhZEJpbmFyeSgpKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQorCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgorICAgICAgICBhc3NlcnQgbGVuKHNlbGYuX19zdHJ1Y3RzKSA9PSAwCisKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoQ0xFQVIsIENPTlRBSU5FUl9SRUFELCBWQUxVRV9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLl9fc3RydWN0cy5hcHBlbmQoKHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCkpCisgICAgICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9SRUFECisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9SRUFECisgICAgICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCisKKyAgICBkZWYgcmVhZENvbGxlY3Rpb25CZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzaXplX3R5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNpemVfdHlwZSA+PiA0CisgICAgICAgIHR5cGUgPSBzZWxmLl9fZ2V0VFR5cGUoc2l6ZV90eXBlKQorICAgICAgICBpZiBzaXplID09IDE1OgorICAgICAgICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfUkVBRAorICAgICAgICByZXR1cm4gdHlwZSwgc2l6ZQorICAgIHJlYWRTZXRCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKyAgICByZWFkTGlzdEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgorCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICB0eXBlcyA9IDAKKyAgICAgICAgaWYgc2l6ZSA+IDA6CisgICAgICAgICAgICB0eXBlcyA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICB2dHlwZSA9IHNlbGYuX19nZXRUVHlwZSh0eXBlcykKKyAgICAgICAga3R5cGUgPSBzZWxmLl9fZ2V0VFR5cGUodHlwZXMgPj4gNCkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfUkVBRAorICAgICAgICByZXR1cm4gKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKworICAgIGRlZiByZWFkQ29sbGVjdGlvbkVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1JFQUQsIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuX19jb250YWluZXJzLnBvcCgpCisgICAgcmVhZFNldEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgcmVhZExpc3RFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIHJlYWRNYXBFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0YXRlID09IEJPT0xfUkVBRDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fYm9vbF92YWx1ZSA9PSBDb21wYWN0VHlwZS5UUlVFCisgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcmVhZEJ5dGUoKSA9PSBDb21wYWN0VHlwZS5UUlVFCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sOiAlZCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSkKKworICAgIHJlYWRCeXRlID0gcmVhZGVyKF9fcmVhZEJ5dGUpCisgICAgX19yZWFkSTE2ID0gX19yZWFkWmlnWmFnCisgICAgcmVhZEkxNiA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCisgICAgcmVhZEkzMiA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCisgICAgcmVhZEk2NCA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCisKKyAgICBAcmVhZGVyCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKKyAgICAgICAgdmFsLCA9IHVucGFjaygnPGQnLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgX19yZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfc3RyaW5nX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gc2VsZi50cmFucy5yZWFkQWxsKHNpemUpCisgICAgcmVhZEJpbmFyeSA9IHJlYWRlcihfX3JlYWRCaW5hcnkpCisKKyAgICBkZWYgX19nZXRUVHlwZShzZWxmLCBieXRlKToKKyAgICAgICAgcmV0dXJuIFRUWVBFU1tieXRlICYgMHgwZl0KKworCitjbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSk6CisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAorCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wodHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0KQorCisKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZChUQ29tcGFjdFByb3RvY29sKToKKyAgICAiIiJDLUFjY2VsZXJhdGVkIHZlcnNpb24gb2YgVENvbXBhY3RQcm90b2NvbC4KKworICAgIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgYW55IG9mIFRDb21wYWN0UHJvdG9jb2wncyBtZXRob2RzLAorICAgIGJ1dCB0aGUgZ2VuZXJhdGVkIGNvZGUgcmVjb2duaXplcyBpdCBkaXJlY3RseSBhbmQgd2lsbCBjYWxsIGludG8KKyAgICBvdXIgQyBtb2R1bGUgdG8gZG8gdGhlIGVuY29kaW5nLCBieXBhc3NpbmcgdGhpcyBvYmplY3QgZW50aXJlbHkuCisgICAgV2UgaW5oZXJpdCBmcm9tIFRDb21wYWN0UHJvdG9jb2wgc28gdGhhdCB0aGUgbm9ybWFsIFRDb21wYWN0UHJvdG9jb2wKKyAgICBlbmNvZGluZyBjYW4gaGFwcGVuIGlmIHRoZSBmYXN0YmluYXJ5IG1vZHVsZSBkb2Vzbid0IHdvcmsgZm9yIHNvbWUKKyAgICByZWFzb24uCisgICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLCBwYXNzIGZhbGxiYWNrPUZhbHNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50LgorCisgICAgSW4gb3JkZXIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIEMgbW9kdWxlLCBqdXN0IHVzZQorICAgIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnN0ZWFkIG9mIFRDb21wYWN0UHJvdG9jb2wuCisgICAgIiIiCisgICAgcGFzcworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGZhbGxiYWNrID0ga3dhcmdzLnBvcCgnZmFsbGJhY2snLCBUcnVlKQorICAgICAgICBzdXBlcihUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IGZhc3RiaW5hcnkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaWYgbm90IGZhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IGZhc3RiaW5hcnkuZGVjb2RlX2NvbXBhY3QKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gZmFzdGJpbmFyeS5lbmNvZGVfY29tcGFjdAorCisKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGZhbGxiYWNrPVRydWUpOgorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5fZmFsbGJhY2sgPSBmYWxsYmFjaworCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCgKKyAgICAgICAgICAgIHRyYW5zLAorICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1zZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsCisgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PXNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGZhbGxiYWNrPXNlbGYuX2ZhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjdhNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wucHkKQEAgLTAsMCArMSwyMjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpbXBvcnQgVFByb3RvY29sQmFzZSwgVFByb3RvY29sRXhjZXB0aW9uCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgVE1lc3NhZ2VUeXBlCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVEhlYWRlclRyYW5zcG9ydCBpbXBvcnQgVEhlYWRlclRyYW5zcG9ydCwgVEhlYWRlclN1YnByb3RvY29sSUQsIFRIZWFkZXJDbGllbnRUeXBlCisKKworUFJPVE9DT0xTX0JZX0lEID0geworICAgIFRIZWFkZXJTdWJwcm90b2NvbElELkJJTkFSWTogVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQsCisgICAgVEhlYWRlclN1YnByb3RvY29sSUQuQ09NUEFDVDogVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkLAorfQorCisKK2NsYXNzIFRIZWFkZXJQcm90b2NvbChUUHJvdG9jb2xCYXNlKToKKyAgICAiIiJBIGZyYW1lZCBwcm90b2NvbCB3aXRoIGhlYWRlcnMgYW5kIHBheWxvYWQgdHJhbnNmb3Jtcy4KKworICAgIFRIZWFkZXJQcm90b2NvbCBmcmFtZXMgb3RoZXIgVGhyaWZ0IHByb3RvY29scyBhbmQgYWRkcyBzdXBwb3J0IGZvciBvcHRpb25hbAorICAgIG91dC1vZi1iYW5kIGhlYWRlcnMuIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHN1YnByb3RvY29scyBhcmUKKyAgICBUQmluYXJ5UHJvdG9jb2wgYW5kIFRDb21wYWN0UHJvdG9jb2wuCisKKyAgICBJdCdzIGFsc28gcG9zc2libGUgdG8gYXBwbHkgdHJhbnNmb3JtcyB0byB0aGUgZW5jb2RlZCBtZXNzYWdlIHBheWxvYWQuIFRoZQorICAgIG9ubHkgdHJhbnNmb3JtIGN1cnJlbnRseSBzdXBwb3J0ZWQgaXMgdG8gZ3ppcC4KKworICAgIFdoZW4gdXNlZCBpbiBhIHNlcnZlciwgVEhlYWRlclByb3RvY29sIGNhbiBhY2NlcHQgbWVzc2FnZXMgZnJvbQorICAgIG5vbi1USGVhZGVyUHJvdG9jb2wgY2xpZW50cyBpZiBhbGxvd2VkIChzZWUgYGFsbG93ZWRfY2xpZW50X3R5cGVzYCkuIFRoaXMKKyAgICBpbmNsdWRlcyBmcmFtZWQgYW5kIHVuZnJhbWVkIHRyYW5zcG9ydHMgYW5kIGJvdGggVEJpbmFyeVByb3RvY29sIGFuZAorICAgIFRDb21wYWN0UHJvdG9jb2wuIFRoZSBzZXJ2ZXIgd2lsbCByZXNwb25kIGluIHRoZSBhcHByb3ByaWF0ZSBkaWFsZWN0IGZvcgorICAgIHRoZSBjb25uZWN0ZWQgY2xpZW50LiBIVFRQIGNsaWVudHMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCisgICAgVEhlYWRlclByb3RvY29sIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IFRIVFRQU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsCisgICAgb3IgVFByb2Nlc3NQb29sU2VydmVyLgorCisgICAgU2VlIGRvYy9zcGVjcy9IZWFkZXJGb3JtYXQubWQgZm9yIGRldGFpbHMgb2YgdGhlIHdpcmUgZm9ybWF0LgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcyk6CisgICAgICAgICMgbXVjaCBvZiB0aGUgYWN0dWFsIHdvcmsgZm9yIFRIZWFkZXJQcm90b2NvbCBoYXBwZW5zIGRvd24gaW4KKyAgICAgICAgIyBUSGVhZGVyVHJhbnNwb3J0IHNpbmNlIHdlIG5lZWQgdG8gZG8gbG93LWxldmVsIHNoZW5hbmlnYW5zIHRvIGRldGVjdAorICAgICAgICAjIGlmIHRoZSBjbGllbnQgaXMgc2VuZGluZyB1cyBoZWFkZXJzIG9yIG9uZSBvZiB0aGUgaGVhZGVybGVzcyBmb3JtYXRzCisgICAgICAgICMgd2Ugc3VwcG9ydC4gdGhpcyB3cmFwcyB0aGUgcmVhbCB0cmFuc3BvcnQgd2l0aCB0aGUgb25lIHRoYXQgZG9lcyBhbGwKKyAgICAgICAgIyB0aGUgbWFnaWMuCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRyYW5zcG9ydCwgVEhlYWRlclRyYW5zcG9ydCk6CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBUSGVhZGVyVHJhbnNwb3J0KHRyYW5zcG9ydCwgYWxsb3dlZF9jbGllbnRfdHlwZXMpCisgICAgICAgIHN1cGVyKFRIZWFkZXJQcm90b2NvbCwgc2VsZikuX19pbml0X18odHJhbnNwb3J0KQorICAgICAgICBzZWxmLl9zZXRfcHJvdG9jb2woKQorCisgICAgZGVmIGdldF9oZWFkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50cmFucy5nZXRfaGVhZGVycygpCisKKyAgICBkZWYgc2V0X2hlYWRlcihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi50cmFucy5zZXRfaGVhZGVyKGtleSwgdmFsdWUpCisKKyAgICBkZWYgY2xlYXJfaGVhZGVycyhzZWxmKToKKyAgICAgICAgc2VsZi50cmFucy5jbGVhcl9oZWFkZXJzKCkKKworICAgIGRlZiBhZGRfdHJhbnNmb3JtKHNlbGYsIHRyYW5zZm9ybV9pZCk6CisgICAgICAgIHNlbGYudHJhbnMuYWRkX3RyYW5zZm9ybSh0cmFuc2Zvcm1faWQpCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIHNlcWlkKToKKyAgICAgICAgc2VsZi50cmFucy5zZXF1ZW5jZV9pZCA9IHNlcWlkCisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0dHlwZSwgc2VxaWQpCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkKKworICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTdHJ1Y3RCZWdpbihuYW1lKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTdHJ1Y3RFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgZmlkKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgZmlkKQorCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUZpZWxkRW5kKCkKKworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRmllbGRTdG9wKCkKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWFwRW5kKCkKKworICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKworICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUxpc3RFbmQoKQorCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTZXRCZWdpbihldHlwZSwgc2l6ZSkKKworICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlU2V0RW5kKCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbF92YWwpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVCb29sKGJvb2xfdmFsKQorCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlQnl0ZShieXRlKQorCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUkxNihpMTYpCisKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlSTMyKGkzMikKKworICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVJNjQoaTY0KQorCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZURvdWJsZShkdWIpCisKKyAgICBkZWYgd3JpdGVCaW5hcnkoc2VsZiwgc3RyX3ZhbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUJpbmFyeShzdHJfdmFsKQorCisgICAgZGVmIF9zZXRfcHJvdG9jb2woc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb3RvY29sX2NscyA9IFBST1RPQ09MU19CWV9JRFtzZWxmLnRyYW5zLnByb3RvY29sX2lkXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgIlVua25vd24gcHJvdG9jb2wgcmVxdWVzdGVkLiIsCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5fcHJvdG9jb2wgPSBwcm90b2NvbF9jbHMoc2VsZi50cmFucykKKyAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBzZWxmLl9wcm90b2NvbC5fZmFzdF9lbmNvZGUKKyAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBzZWxmLl9wcm90b2NvbC5fZmFzdF9kZWNvZGUKKworICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRyYW5zLnJlYWRGcmFtZSgwKQorICAgICAgICAgICAgc2VsZi5fc2V0X3Byb3RvY29sKCkKKyAgICAgICAgZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihiIiIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIDApCisgICAgICAgICAgICBleGMud3JpdGUoc2VsZi5fcHJvdG9jb2wpCisgICAgICAgICAgICBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorICAgICAgICAgICAgc2VsZi50cmFucy5mbHVzaCgpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKQorCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKQorCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEZpZWxkQmVnaW4oKQorCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRGaWVsZEVuZCgpCisKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1hcEJlZ2luKCkKKworICAgIGRlZiByZWFkTWFwRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1hcEVuZCgpCisKKyAgICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRMaXN0QmVnaW4oKQorCisgICAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZExpc3RFbmQoKQorCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRTZXRCZWdpbigpCisKKyAgICBkZWYgcmVhZFNldEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRTZXRFbmQoKQorCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEJvb2woKQorCisgICAgZGVmIHJlYWRCeXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEJ5dGUoKQorCisgICAgZGVmIHJlYWRJMTYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkSTE2KCkKKworICAgIGRlZiByZWFkSTMyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEkzMigpCisKKyAgICBkZWYgcmVhZEk2NChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRJNjQoKQorCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkRG91YmxlKCkKKworICAgIGRlZiByZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEJpbmFyeSgpCisKKworY2xhc3MgVEhlYWRlclByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhbGxvd2VkX2NsaWVudF90eXBlcz0oVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUywpKToKKyAgICAgICAgc2VsZi5hbGxvd2VkX2NsaWVudF90eXBlcyA9IGFsbG93ZWRfY2xpZW50X3R5cGVzCisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEhlYWRlclByb3RvY29sKHRyYW5zLCBzZWxmLmFsbG93ZWRfY2xpZW50X3R5cGVzKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjA5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkKQEAgLTAsMCArMSw2NzcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IChUVHlwZSwgVFByb3RvY29sQmFzZSwgVFByb3RvY29sRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKQoraW1wb3J0IGJhc2U2NAoraW1wb3J0IG1hdGgKK2ltcG9ydCBzeXMKKworZnJvbSAuLmNvbXBhdCBpbXBvcnQgc3RyX3RvX2JpbmFyeQorCisKK19fYWxsX18gPSBbJ1RKU09OUHJvdG9jb2wnLAorICAgICAgICAgICAnVEpTT05Qcm90b2NvbEZhY3RvcnknLAorICAgICAgICAgICAnVFNpbXBsZUpTT05Qcm90b2NvbCcsCisgICAgICAgICAgICdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSddCisKK1ZFUlNJT04gPSAxCisKK0NPTU1BID0gYicsJworQ09MT04gPSBiJzonCitMQlJBQ0UgPSBiJ3snCitSQlJBQ0UgPSBiJ30nCitMQlJBQ0tFVCA9IGInWycKK1JCUkFDS0VUID0gYiddJworUVVPVEUgPSBiJyInCitCQUNLU0xBU0ggPSBiJ1xcJworWkVSTyA9IGInMCcKKworRVNDU0VRMCA9IG9yZCgnXFwnKQorRVNDU0VRMSA9IG9yZCgndScpCitFU0NBUEVfQ0hBUl9WQUxTID0geworICAgICciJzogJ1xcIicsCisgICAgJ1xcJzogJ1xcXFwnLAorICAgICdcYic6ICdcXGInLAorICAgICdcZic6ICdcXGYnLAorICAgICdcbic6ICdcXG4nLAorICAgICdccic6ICdcXHInLAorICAgICdcdCc6ICdcXHQnLAorICAgICMgJy8nOiAnXFwvJywKK30KK0VTQ0FQRV9DSEFSUyA9IHsKKyAgICBiJyInOiAnIicsCisgICAgYidcXCc6ICdcXCcsCisgICAgYidiJzogJ1xiJywKKyAgICBiJ2YnOiAnXGYnLAorICAgIGInbic6ICdcbicsCisgICAgYidyJzogJ1xyJywKKyAgICBiJ3QnOiAnXHQnLAorICAgIGInLyc6ICcvJywKK30KK05VTUVSSUNfQ0hBUiA9IGInKy0uMDEyMzQ1Njc4OUVlJworCitDVFlQRVMgPSB7CisgICAgVFR5cGUuQk9PTDogJ3RmJywKKyAgICBUVHlwZS5CWVRFOiAnaTgnLAorICAgIFRUeXBlLkkxNjogJ2kxNicsCisgICAgVFR5cGUuSTMyOiAnaTMyJywKKyAgICBUVHlwZS5JNjQ6ICdpNjQnLAorICAgIFRUeXBlLkRPVUJMRTogJ2RibCcsCisgICAgVFR5cGUuU1RSSU5HOiAnc3RyJywKKyAgICBUVHlwZS5TVFJVQ1Q6ICdyZWMnLAorICAgIFRUeXBlLkxJU1Q6ICdsc3QnLAorICAgIFRUeXBlLlNFVDogJ3NldCcsCisgICAgVFR5cGUuTUFQOiAnbWFwJywKK30KKworSlRZUEVTID0ge30KK2ZvciBrZXkgaW4gQ1RZUEVTLmtleXMoKToKKyAgICBKVFlQRVNbQ1RZUEVTW2tleV1dID0ga2V5CisKKworY2xhc3MgSlNPTkJhc2VDb250ZXh0KG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2wKKyAgICAgICAgc2VsZi5maXJzdCA9IFRydWUKKworICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdyaXRlKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGVzY2FwZU51bShzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKworY2xhc3MgSlNPTkxpc3RDb250ZXh0KEpTT05CYXNlQ29udGV4dCk6CisKKyAgICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6CisgICAgICAgIGlmIHNlbGYuZmlyc3QgaXMgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnVuY3Rpb24oQ09NTUEpCisKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnRyYW5zLndyaXRlKQorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnJlYWRKU09OU3ludGF4Q2hhcikKKworCitjbGFzcyBKU09OUGFpckNvbnRleHQoSlNPTkJhc2VDb250ZXh0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHN1cGVyKEpTT05QYWlyQ29udGV4dCwgc2VsZikuX19pbml0X18ocHJvdG9jb2wpCisgICAgICAgIHNlbGYuY29sb24gPSBUcnVlCisKKyAgICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6CisgICAgICAgIGlmIHNlbGYuZmlyc3Q6CisgICAgICAgICAgICBzZWxmLmZpcnN0ID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuY29sb24gPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmdW5jdGlvbihDT0xPTiBpZiBzZWxmLmNvbG9uIGVsc2UgQ09NTUEpCisgICAgICAgICAgICBzZWxmLmNvbG9uID0gbm90IHNlbGYuY29sb24KKworICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wudHJhbnMud3JpdGUpCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQorCisgICAgZGVmIGVzY2FwZU51bShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29sb24KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzLCBjb2xvbj0lcycgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuY29sb24pCisKKworY2xhc3MgTG9va2FoZWFkUmVhZGVyKCk6CisgICAgaGFzRGF0YSA9IEZhbHNlCisgICAgZGF0YSA9ICcnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2wKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhc0RhdGEgaXMgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuaGFzRGF0YSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnByb3RvY29sLnRyYW5zLnJlYWQoMSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorCisgICAgZGVmIHBlZWsoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBGYWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYucHJvdG9jb2wudHJhbnMucmVhZCgxKQorICAgICAgICBzZWxmLmhhc0RhdGEgPSBUcnVlCisgICAgICAgIHJldHVybiBzZWxmLmRhdGEKKworCitjbGFzcyBUSlNPTlByb3RvY29sQmFzZShUUHJvdG9jb2xCYXNlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6CisgICAgICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorICAgICAgICBzZWxmLnJlc2V0UmVhZENvbnRleHQoKQorCisgICAgIyBXZSBkb24ndCBoYXZlIGxlbmd0aCBsaW1pdCBpbXBsZW1lbnRhdGlvbiBmb3IgSlNPTiBwcm90b2NvbHMKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3RyaW5nX2xlbmd0aF9saW1pdChzZW5mKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjb250YWluZXJfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHJlc2V0V3JpdGVDb250ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQgPSBKU09OQmFzZUNvbnRleHQoc2VsZikKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2sgPSBbc2VsZi5jb250ZXh0XQorCisgICAgZGVmIHJlc2V0UmVhZENvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorICAgICAgICBzZWxmLnJlYWRlciA9IExvb2thaGVhZFJlYWRlcihzZWxmKQorCisgICAgZGVmIHB1c2hDb250ZXh0KHNlbGYsIGN0eCk6CisgICAgICAgIHNlbGYuY29udGV4dFN0YWNrLmFwcGVuZChjdHgpCisgICAgICAgIHNlbGYuY29udGV4dCA9IGN0eAorCisgICAgZGVmIHBvcENvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dFN0YWNrLnBvcCgpCisgICAgICAgIGlmIHNlbGYuY29udGV4dFN0YWNrOgorICAgICAgICAgICAgc2VsZi5jb250ZXh0ID0gc2VsZi5jb250ZXh0U3RhY2tbLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBKU09OQmFzZUNvbnRleHQoc2VsZikKKworICAgIGRlZiB3cml0ZUpTT05TdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAganNvbl9zdHIgPSBbJyInXQorICAgICAgICBmb3IgcyBpbiBzdHJpbmc6CisgICAgICAgICAgICBlc2NhcGVkID0gRVNDQVBFX0NIQVJfVkFMUy5nZXQocywgcykKKyAgICAgICAgICAgIGpzb25fc3RyLmFwcGVuZChlc2NhcGVkKQorICAgICAgICBqc29uX3N0ci5hcHBlbmQoJyInKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHN0cl90b19iaW5hcnkoJycuam9pbihqc29uX3N0cikpKQorCisgICAgZGVmIHdyaXRlSlNPTk51bWJlcihzZWxmLCBudW1iZXIsIGZvcm1hdHRlcj0nezB9Jyk6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIGpzTnVtYmVyID0gc3RyKGZvcm1hdHRlci5mb3JtYXQobnVtYmVyKSkuZW5jb2RlKCdhc2NpaScpCisgICAgICAgIGlmIHNlbGYuY29udGV4dC5lc2NhcGVOdW0oKToKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisgICAgICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGpzTnVtYmVyKQorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoanNOdW1iZXIpCisKKyAgICBkZWYgd3JpdGVKU09OQmFzZTY0KHNlbGYsIGJpbmFyeSk6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYmFzZTY0LmI2NGVuY29kZShiaW5hcnkpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQorCisgICAgZGVmIHdyaXRlSlNPTk9iamVjdFN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDRSkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OUGFpckNvbnRleHQoc2VsZikpCisKKyAgICBkZWYgd3JpdGVKU09OT2JqZWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFJCUkFDRSkKKworICAgIGRlZiB3cml0ZUpTT05BcnJheVN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKExCUkFDS0VUKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05MaXN0Q29udGV4dChzZWxmKSkKKworICAgIGRlZiB3cml0ZUpTT05BcnJheUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5wb3BDb250ZXh0KCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShSQlJBQ0tFVCkKKworICAgIGRlZiByZWFkSlNPTlN5bnRheENoYXIoc2VsZiwgY2hhcmFjdGVyKToKKyAgICAgICAgY3VycmVudCA9IHNlbGYucmVhZGVyLnJlYWQoKQorICAgICAgICBpZiBjaGFyYWN0ZXIgIT0gY3VycmVudDoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcjogJXMiICUgY3VycmVudCkKKworICAgIGRlZiBfaXNIaWdoU3Vycm9nYXRlKHNlbGYsIGNvZGV1bml0KToKKyAgICAgICAgcmV0dXJuIGNvZGV1bml0ID49IDB4ZDgwMCBhbmQgY29kZXVuaXQgPD0gMHhkYmZmCisKKyAgICBkZWYgX2lzTG93U3Vycm9nYXRlKHNlbGYsIGNvZGV1bml0KToKKyAgICAgICAgcmV0dXJuIGNvZGV1bml0ID49IDB4ZGMwMCBhbmQgY29kZXVuaXQgPD0gMHhkZmZmCisKKyAgICBkZWYgX3RvQ2hhcihzZWxmLCBoaWdoLCBsb3c9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBsb3c6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiXFx1JTA0eCIgJSBoaWdoKS5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjaHIoaGlnaCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvZGVwb2ludCA9ICgxIDw8IDE2KSArICgoaGlnaCAmIDB4M2ZmKSA8PCAxMCkKKyAgICAgICAgICAgIGNvZGVwb2ludCArPSBsb3cgJiAweDNmZgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgorICAgICAgICAgICAgICAgIHMgPSAiXFxVJTA4eCIgJSBjb2RlcG9pbnQKKyAgICAgICAgICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjaHIoY29kZXBvaW50KQorCisgICAgZGVmIHJlYWRKU09OU3RyaW5nKHNlbGYsIHNraXBDb250ZXh0KToKKyAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IE5vbmUKKyAgICAgICAgc3RyaW5nID0gW10KKyAgICAgICAgaWYgc2tpcENvbnRleHQgaXMgRmFsc2U6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQucmVhZCgpCisgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgICAgICBpZiBjaGFyYWN0ZXIgPT0gUVVPVEU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG9yZChjaGFyYWN0ZXIpID09IEVTQ1NFUTA6CisgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgb3JkKGNoYXJhY3RlcikgPT0gRVNDU0VRMToKKyAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi50cmFucy5yZWFkKDQpLmRlY29kZSgnYXNjaWknKQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdCA9IGludChjaGFyYWN0ZXIsIDE2KQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc0hpZ2hTdXJyb2dhdGUoY29kZXVuaXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IGNvZGV1bml0CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX2lzTG93U3Vycm9nYXRlKGNvZGV1bml0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBoaWdoU3Vycm9nYXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5fdG9DaGFyKGhpZ2hTdXJyb2dhdGUsIGNvZGV1bml0KQorICAgICAgICAgICAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYuX3RvQ2hhcihjb2RldW5pdCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBjaGFyYWN0ZXIgbm90IGluIEVTQ0FQRV9DSEFSUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBjb250cm9sIGNoYXIiKQorICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBFU0NBUEVfQ0hBUlNbY2hhcmFjdGVyXQorICAgICAgICAgICAgZWxpZiBjaGFyYWN0ZXIgaW4gRVNDQVBFX0NIQVJfVkFMUzoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXNjYXBlZCBjb250cm9sIGNoYXIiKQorICAgICAgICAgICAgZWxpZiBzeXMudmVyc2lvbl9pbmZvWzBdID4gMjoKKyAgICAgICAgICAgICAgICB1dGY4X2J5dGVzID0gYnl0ZWFycmF5KFtvcmQoY2hhcmFjdGVyKV0pCisgICAgICAgICAgICAgICAgd2hpbGUgb3JkKHNlbGYucmVhZGVyLnBlZWsoKSkgPj0gMHg4MDoKKyAgICAgICAgICAgICAgICAgICAgdXRmOF9ieXRlcy5hcHBlbmQob3JkKHNlbGYucmVhZGVyLnJlYWQoKSkpCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gdXRmOF9ieXRlcy5kZWNvZGUoJ3V0ZjgnKQorICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChjaGFyYWN0ZXIpCisKKyAgICAgICAgICAgIGlmIGhpZ2hTdXJyb2dhdGU6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKQorICAgICAgICByZXR1cm4gJycuam9pbihzdHJpbmcpCisKKyAgICBkZWYgaXNKU09OTnVtZXJpYyhzZWxmLCBjaGFyYWN0ZXIpOgorICAgICAgICByZXR1cm4gKFRydWUgaWYgTlVNRVJJQ19DSEFSLmZpbmQoY2hhcmFjdGVyKSAhPSAtIDEgZWxzZSBGYWxzZSkKKworICAgIGRlZiByZWFkSlNPTlF1b3RlcyhzZWxmKToKKyAgICAgICAgaWYgKHNlbGYuY29udGV4dC5lc2NhcGVOdW0oKSk6CisgICAgICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihRVU9URSkKKworICAgIGRlZiByZWFkSlNPTk51bWVyaWNDaGFycyhzZWxmKToKKyAgICAgICAgbnVtZXJpYyA9IFtdCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5wZWVrKCkKKyAgICAgICAgICAgIGlmIHNlbGYuaXNKU09OTnVtZXJpYyhjaGFyYWN0ZXIpIGlzIEZhbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBudW1lcmljLmFwcGVuZChzZWxmLnJlYWRlci5yZWFkKCkpCisgICAgICAgIHJldHVybiBiJycuam9pbihudW1lcmljKS5kZWNvZGUoJ2FzY2lpJykKKworICAgIGRlZiByZWFkSlNPTkludGVnZXIoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlF1b3RlcygpCisgICAgICAgIG51bWVyaWMgPSBzZWxmLnJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlF1b3RlcygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBpbnQobnVtZXJpYykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCisKKyAgICBkZWYgcmVhZEpTT05Eb3VibGUoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgaWYgc2VsZi5yZWFkZXIucGVlaygpID09IFFVT1RFOgorICAgICAgICAgICAgc3RyaW5nID0gc2VsZi5yZWFkSlNPTlN0cmluZyhUcnVlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRvdWJsZSA9IGZsb2F0KHN0cmluZykKKyAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250ZXh0LmVzY2FwZU51bSBpcyBGYWxzZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRoLmlzaW5mKGRvdWJsZSkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBub3QgbWF0aC5pc25hbihkb3VibGUpKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuY29udGV4dC5lc2NhcGVOdW0oKSBpcyBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChzZWxmLnJlYWRKU09OTnVtZXJpY0NoYXJzKCkpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorCisgICAgZGVmIHJlYWRKU09OQmFzZTY0KHNlbGYpOgorICAgICAgICBzdHJpbmcgPSBzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKQorICAgICAgICBzaXplID0gbGVuKHN0cmluZykKKyAgICAgICAgbSA9IHNpemUgJSA0CisgICAgICAgICMgRm9yY2UgcGFkZGluZyBzaW5jZSBiNjRlbmNvZGUgbWV0aG9kIGRvZXMgbm90IGFsbG93IGl0CisgICAgICAgIGlmIG0gIT0gMDoKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDQgLSBtKToKKyAgICAgICAgICAgICAgICBzdHJpbmcgKz0gJz0nCisgICAgICAgIHJldHVybiBiYXNlNjQuYjY0ZGVjb2RlKHN0cmluZykKKworICAgIGRlZiByZWFkSlNPTk9iamVjdFN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQucmVhZCgpCisgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKExCUkFDRSkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OUGFpckNvbnRleHQoc2VsZikpCisKKyAgICBkZWYgcmVhZEpTT05PYmplY3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSkKKyAgICAgICAgc2VsZi5wb3BDb250ZXh0KCkKKworICAgIGRlZiByZWFkSlNPTkFycmF5U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNLRVQpCisgICAgICAgIHNlbGYucHVzaENvbnRleHQoSlNPTkxpc3RDb250ZXh0KHNlbGYpKQorCisgICAgZGVmIHJlYWRKU09OQXJyYXlFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKQorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorCisKK2NsYXNzIFRKU09OUHJvdG9jb2woVEpTT05Qcm90b2NvbEJhc2UpOgorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVzZXRSZWFkQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgaWYgc2VsZi5yZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIikKKyAgICAgICAgbmFtZSA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisgICAgICAgIHR5cGVuID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICBzZXFpZCA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKKyAgICAgICAgcmV0dXJuIChuYW1lLCB0eXBlbiwgc2VxaWQpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5wZWVrKCkKKyAgICAgICAgdHR5cGUgPSAwCisgICAgICAgIGlkID0gMAorICAgICAgICBpZiBjaGFyYWN0ZXIgPT0gUkJSQUNFOgorICAgICAgICAgICAgdHR5cGUgPSBUVHlwZS5TVE9QCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZCA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKKyAgICAgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCisgICAgICAgICAgICB0dHlwZSA9IEpUWVBFU1tzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKV0KKyAgICAgICAgcmV0dXJuIChOb25lLCB0dHlwZSwgaWQpCisKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0RW5kKCkKKworICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAga2V5VHlwZSA9IEpUWVBFU1tzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKV0KKyAgICAgICAgdmFsdWVUeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQorICAgICAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKKworICAgIGRlZiByZWFkTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiByZWFkQ29sbGVjdGlvbkJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlTdGFydCgpCisgICAgICAgIGVsZW1UeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICByZXR1cm4gKGVsZW1UeXBlLCBzaXplKQorICAgIHJlYWRMaXN0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisgICAgcmVhZFNldEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgorCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQorICAgIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIHJlYWRMaXN0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKworICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgcmV0dXJuIChGYWxzZSBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpID09IDAgZWxzZSBUcnVlKQorCisgICAgZGVmIHJlYWROdW1iZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgcmVhZEJ5dGUgPSByZWFkTnVtYmVyCisgICAgcmVhZEkxNiA9IHJlYWROdW1iZXIKKyAgICByZWFkSTMyID0gcmVhZE51bWJlcgorICAgIHJlYWRJNjQgPSByZWFkTnVtYmVyCisKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05Eb3VibGUoKQorCisgICAgZGVmIHJlYWRTdHJpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKQorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRKU09OQmFzZTY0KCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCByZXF1ZXN0X3R5cGUsIHNlcWlkKToKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKFZFUlNJT04pCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKG5hbWUpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHJlcXVlc3RfdHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2VxaWQpCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKworICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgaWQpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpZCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1t0dHlwZV0pCisKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNba3R5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbdnR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1tldHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCisKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKKworICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCisKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xlYW4pOgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcigxIGlmIGJvb2xlYW4gaXMgVHJ1ZSBlbHNlIDApCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoYnl0ZSwgOCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoYnl0ZSkKKworICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTE2LCAxNikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTE2KQorCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMzIsIDMyKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpMzIpCisKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGk2NCwgNjQpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGk2NCkKKworICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkYmwpOgorICAgICAgICAjIDE3IHNpZ25pZmljYW50IGRpZ2l0cyBzaG91bGQgYmUganVzdCBlbm91Z2ggZm9yIGFueSBkb3VibGUgcHJlY2lzaW9uCisgICAgICAgICMgdmFsdWUuCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGRibCwgJ3swOi4xN2d9JykKKworICAgIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHJpbmcpOgorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhzdHJpbmcpCisKKyAgICBkZWYgd3JpdGVCaW5hcnkoc2VsZiwgYmluYXJ5KToKKyAgICAgICAgc2VsZi53cml0ZUpTT05CYXNlNjQoYmluYXJ5KQorCisKK2NsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2wodHJhbnMpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3RyaW5nX2xlbmd0aF9saW1pdChzZW5mKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjb250YWluZXJfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2woVEpTT05Qcm90b2NvbEJhc2UpOgorICAgICIiIlNpbXBsZSwgcmVhZGFibGUsIHdyaXRlLW9ubHkgSlNPTiBwcm90b2NvbC4KKworICAgIFVzZWZ1bCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2VzLgorICAgICIiIgorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHJlcXVlc3RfdHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKworICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgZmlkKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcobmFtZSkKKworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQorCisgICAgZGVmIF93cml0ZUNvbGxlY3Rpb25CZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisKKyAgICBkZWYgX3dyaXRlQ29sbGVjdGlvbkVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCisgICAgd3JpdGVMaXN0QmVnaW4gPSBfd3JpdGVDb2xsZWN0aW9uQmVnaW4KKyAgICB3cml0ZUxpc3RFbmQgPSBfd3JpdGVDb2xsZWN0aW9uRW5kCisgICAgd3JpdGVTZXRCZWdpbiA9IF93cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIHdyaXRlU2V0RW5kID0gX3dyaXRlQ29sbGVjdGlvbkVuZAorCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGJ5dGUsIDgpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGJ5dGUpCisKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkxNiwgMTYpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGkxNikKKworICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTMyLCAzMikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTMyKQorCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpNjQsIDY0KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpNjQpCisKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xlYW4pOgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcigxIGlmIGJvb2xlYW4gaXMgVHJ1ZSBlbHNlIDApCisKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZGJsKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsKQorCisgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBiaW5hcnkpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkJhc2U2NChiaW5hcnkpCisKKworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4MzkwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVFByb3RvY29sRGVjb3JhdG9yCisKK1NFUEFSQVRPUiA9ICI6IgorCisKK2NsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbERlY29yYXRvci5UUHJvdG9jb2xEZWNvcmF0b3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCwgc2VydmljZU5hbWUpOgorICAgICAgICBzZWxmLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgIGlmICh0eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMIG9yCisgICAgICAgICAgICAgICAgdHlwZSA9PSBUTWVzc2FnZVR5cGUuT05FV0FZKToKKyAgICAgICAgICAgIHN1cGVyKFRNdWx0aXBsZXhlZFByb3RvY29sLCBzZWxmKS53cml0ZU1lc3NhZ2VCZWdpbigKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbmFtZSwKKyAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgIHNlcWlkCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdXBlcihUTXVsdGlwbGV4ZWRQcm90b2NvbCwgc2VsZikud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5CmluZGV4IGJlM2NiMTQuLjgzMTRjZjYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5CkBAIC0xNywxODkgKzE3LDQwNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCAqCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24sIFRUeXBlLCBURnJvemVuRGljdAorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KK2Zyb20gLi5jb21wYXQgaW1wb3J0IGJpbmFyeV90b19zdHIsIHN0cl90b19iaW5hcnkKKworaW1wb3J0IHNpeAoraW1wb3J0IHN5cworZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZQorZnJvbSBzaXgubW92ZXMgaW1wb3J0IHppcAorCiAKIGNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbihURXhjZXB0aW9uKToKKyAgICAiIiJDdXN0b20gUHJvdG9jb2wgRXhjZXB0aW9uIGNsYXNzIiIiCiAKLSAgIiIiQ3VzdG9tIFByb3RvY29sIEV4Y2VwdGlvbiBjbGFzcyIiIgorICAgIFVOS05PV04gPSAwCisgICAgSU5WQUxJRF9EQVRBID0gMQorICAgIE5FR0FUSVZFX1NJWkUgPSAyCisgICAgU0laRV9MSU1JVCA9IDMKKyAgICBCQURfVkVSU0lPTiA9IDQKKyAgICBOT1RfSU1QTEVNRU5URUQgPSA1CisgICAgREVQVEhfTElNSVQgPSA2CisgICAgSU5WQUxJRF9QUk9UT0NPTCA9IDcKIAotICBVTktOT1dOID0gMAotICBJTlZBTElEX0RBVEEgPSAxCi0gIE5FR0FUSVZFX1NJWkUgPSAyCi0gIFNJWkVfTElNSVQgPSAzCi0gIEJBRF9WRVJTSU9OID0gNAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKIAotY2xhc3MgVFByb3RvY29sQmFzZToKK2NsYXNzIFRQcm90b2NvbEJhc2Uob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgogCi0gICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKKyAgICAgICAgc2VsZi50cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gTm9uZQorICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IE5vbmUKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgotICAgIHNlbGYudHJhbnMgPSB0cmFucworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2NoZWNrX2xlbmd0aChsaW1pdCwgbGVuZ3RoKToKKyAgICAgICAgaWYgbGVuZ3RoIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTmVnYXRpdmUgbGVuZ3RoOiAlZCcgJSBsZW5ndGgpCisgICAgICAgIGlmIGxpbWl0IGlzIG5vdCBOb25lIGFuZCBsZW5ndGggPiBsaW1pdDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGVuZ3RoIGV4Y2VlZGVkIG1heCBhbGxvd2VkOiAlZCcgJSBsaW1pdCkKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIHNlcWlkKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgaWQpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xfdmFsKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cl92YWwpOgorICAgICAgICBzZWxmLndyaXRlQmluYXJ5KHN0cl90b19iaW5hcnkoc3RyX3ZhbCkpCiAKLSAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlVXRmOChzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgc2VsZi53cml0ZVN0cmluZyhzdHJfdmFsLmVuY29kZSgndXRmOCcpKQogCi0gIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTGlzdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEJ5dGUoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU2V0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRJMTYoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTMyKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEk2NChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRJMTYoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZERvdWJsZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRJMzIoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFN0cmluZyhzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRJNjQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgc2tpcChzZWxmLCB0eXBlKToKLSAgICBpZiB0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICByZXR1cm4KLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuQk9PTDoKLSAgICAgIHNlbGYucmVhZEJvb2woKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5CWVRFOgotICAgICAgc2VsZi5yZWFkQnl0ZSgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLkkxNjoKLSAgICAgIHNlbGYucmVhZEkxNigpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgIHNlbGYucmVhZEkzMigpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLkk2NDoKLSAgICAgIHNlbGYucmVhZEk2NCgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLkRPVUJMRToKLSAgICAgIHNlbGYucmVhZERvdWJsZSgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLlNUUklORzoKLSAgICAgIHNlbGYucmVhZFN0cmluZygpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLlNUUlVDVDoKLSAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJ1Y3RCZWdpbigpCi0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICAobmFtZSwgdHlwZSwgaWQpID0gc2VsZi5yZWFkRmllbGRCZWdpbigpCi0gICAgICAgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgICAgICBicmVhawotICAgICAgICBzZWxmLnNraXAodHlwZSkKLSAgICAgICAgc2VsZi5yZWFkRmllbGRFbmQoKQotICAgICAgc2VsZi5yZWFkU3RydWN0RW5kKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuTUFQOgotICAgICAgKGt0eXBlLCB2dHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRNYXBCZWdpbigpCi0gICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKLSAgICAgICAgc2VsZi5za2lwKGt0eXBlKQotICAgICAgICBzZWxmLnNraXAodnR5cGUpCi0gICAgICBzZWxmLnJlYWRNYXBFbmQoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5TRVQ6Ci0gICAgICAoZXR5cGUsIHNpemUpID0gc2VsZi5yZWFkU2V0QmVnaW4oKQotICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChldHlwZSkKLSAgICAgIHNlbGYucmVhZFNldEVuZCgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLkxJU1Q6Ci0gICAgICAoZXR5cGUsIHNpemUpID0gc2VsZi5yZWFkTGlzdEJlZ2luKCkKLSAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgotICAgICAgICBzZWxmLnNraXAoZXR5cGUpCi0gICAgICBzZWxmLnJlYWRMaXN0RW5kKCkKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcGFzcwogCi1jbGFzcyBUUHJvdG9jb2xGYWN0b3J5OgotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFN0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGJpbmFyeV90b19zdHIoc2VsZi5yZWFkQmluYXJ5KCkpCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHJlYWRVdGY4KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGY4JykKKworICAgIGRlZiBza2lwKHNlbGYsIHR0eXBlKToKKyAgICAgICAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkJPT0w6CisgICAgICAgICAgICBzZWxmLnJlYWRCb29sKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5CWVRFOgorICAgICAgICAgICAgc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTE2OgorICAgICAgICAgICAgc2VsZi5yZWFkSTE2KCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgICBzZWxmLnJlYWRJMzIoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkk2NDoKKyAgICAgICAgICAgIHNlbGYucmVhZEk2NCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgICAgc2VsZi5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICBzZWxmLnJlYWRTdHJpbmcoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIChuYW1lLCB0dHlwZSwgaWQpID0gc2VsZi5yZWFkRmllbGRCZWdpbigpCisgICAgICAgICAgICAgICAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAodHR5cGUpCisgICAgICAgICAgICAgICAgc2VsZi5yZWFkRmllbGRFbmQoKQorICAgICAgICAgICAgc2VsZi5yZWFkU3RydWN0RW5kKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgICAoa3R5cGUsIHZ0eXBlLCBzaXplKSA9IHNlbGYucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChrdHlwZSkKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAodnR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRNYXBFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNFVDoKKyAgICAgICAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRTZXRCZWdpbigpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAoZXR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRTZXRFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkxJU1Q6CisgICAgICAgICAgICAoZXR5cGUsIHNpemUpID0gc2VsZi5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChldHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorCisgICAgIyB0dXBsZSBvZjogKCAncmVhZGVyIG1ldGhvZCcgbmFtZSwgaXNfY29udGFpbmVyIGJvb2wsICd3cml0ZXJfbWV0aG9kJyBuYW1lICkKKyAgICBfVFRZUEVfSEFORExFUlMgPSAoCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDAgVFR5cGUuU1RPUAorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyAxIFRUeXBlLlZPSUQgIyBUT0RPOiBoYW5kbGUgdm9pZD8KKyAgICAgICAgKCdyZWFkQm9vbCcsICd3cml0ZUJvb2wnLCBGYWxzZSksICAjIDIgVFR5cGUuQk9PTAorICAgICAgICAoJ3JlYWRCeXRlJywgJ3dyaXRlQnl0ZScsIEZhbHNlKSwgICMgMyBUVHlwZS5CWVRFIGFuZCBJMDgKKyAgICAgICAgKCdyZWFkRG91YmxlJywgJ3dyaXRlRG91YmxlJywgRmFsc2UpLCAgIyA0IFRUeXBlLkRPVUJMRQorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA1IHVuZGVmaW5lZAorICAgICAgICAoJ3JlYWRJMTYnLCAnd3JpdGVJMTYnLCBGYWxzZSksICAjIDYgVFR5cGUuSTE2CisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDcgdW5kZWZpbmVkCisgICAgICAgICgncmVhZEkzMicsICd3cml0ZUkzMicsIEZhbHNlKSwgICMgOCBUVHlwZS5JMzIKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgOSB1bmRlZmluZWQKKyAgICAgICAgKCdyZWFkSTY0JywgJ3dyaXRlSTY0JywgRmFsc2UpLCAgIyAxMCBUVHlwZS5JNjQKKyAgICAgICAgKCdyZWFkU3RyaW5nJywgJ3dyaXRlU3RyaW5nJywgRmFsc2UpLCAgIyAxMSBUVHlwZS5TVFJJTkcgYW5kIFVURjcKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyU3RydWN0JywgJ3dyaXRlQ29udGFpbmVyU3RydWN0JywgVHJ1ZSksICAjIDEyICouU1RSVUNUCisgICAgICAgICgncmVhZENvbnRhaW5lck1hcCcsICd3cml0ZUNvbnRhaW5lck1hcCcsIFRydWUpLCAgIyAxMyBUVHlwZS5NQVAKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyU2V0JywgJ3dyaXRlQ29udGFpbmVyU2V0JywgVHJ1ZSksICAjIDE0IFRUeXBlLlNFVAorICAgICAgICAoJ3JlYWRDb250YWluZXJMaXN0JywgJ3dyaXRlQ29udGFpbmVyTGlzdCcsIFRydWUpLCAgIyAxNSBUVHlwZS5MSVNUCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDE2IFRUeXBlLlVURjggIyBUT0RPOiBoYW5kbGUgdXRmOCB0eXBlcz8KKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSAgIyAxNyBUVHlwZS5VVEYxNiAjIFRPRE86IGhhbmRsZSB1dGYxNiB0eXBlcz8KKyAgICApCisKKyAgICBkZWYgX3R0eXBlX2hhbmRsZXJzKHNlbGYsIHR0eXBlLCBzcGVjKToKKyAgICAgICAgaWYgc3BlYyA9PSAnQklOQVJZJzoKKyAgICAgICAgICAgIGlmIHR0eXBlICE9IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIGJpbmFyeSBmaWVsZCB0eXBlICVkJyAlIHR0eXBlKQorICAgICAgICAgICAgcmV0dXJuICgncmVhZEJpbmFyeScsICd3cml0ZUJpbmFyeScsIEZhbHNlKQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIHNwZWMgPT0gJ1VURjgnOgorICAgICAgICAgICAgaWYgdHR5cGUgIT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgc3RyaW5nIGZpZWxkIHR5cGUgJWQnICUgdHR5cGUpCisgICAgICAgICAgICByZXR1cm4gKCdyZWFkVXRmOCcsICd3cml0ZVV0ZjgnLCBGYWxzZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX1RUWVBFX0hBTkRMRVJTW3R0eXBlXSBpZiB0dHlwZSA8IGxlbihzZWxmLl9UVFlQRV9IQU5ETEVSUykgZWxzZSAoTm9uZSwgTm9uZSwgRmFsc2UpCisKKyAgICBkZWYgX3JlYWRfYnlfdHR5cGUoc2VsZiwgdHR5cGUsIHNwZWMsIGVzcGVjKToKKyAgICAgICAgcmVhZGVyX25hbWUsIF8sIGlzX2NvbnRhaW5lciA9IHNlbGYuX3R0eXBlX2hhbmRsZXJzKHR0eXBlLCBlc3BlYykKKyAgICAgICAgaWYgcmVhZGVyX25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCB0eXBlICVkJyAlICh0dHlwZSkpCisgICAgICAgIHJlYWRlcl9mdW5jID0gZ2V0YXR0cihzZWxmLCByZWFkZXJfbmFtZSkKKyAgICAgICAgcmVhZCA9IChsYW1iZGE6IHJlYWRlcl9mdW5jKGVzcGVjKSkgaWYgaXNfY29udGFpbmVyIGVsc2UgcmVhZGVyX2Z1bmMKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHlpZWxkIHJlYWQoKQorCisgICAgZGVmIHJlYWRGaWVsZEJ5VFR5cGUoc2VsZiwgdHR5cGUsIHNwZWMpOgorICAgICAgICByZXR1cm4gbmV4dChzZWxmLl9yZWFkX2J5X3R0eXBlKHR0eXBlLCBzcGVjLCBzcGVjKSkKKworICAgIGRlZiByZWFkQ29udGFpbmVyTGlzdChzZWxmLCBzcGVjKToKKyAgICAgICAgdHR5cGUsIHRzcGVjLCBpc19pbW11dGFibGUgPSBzcGVjCisgICAgICAgIChsaXN0X3R5cGUsIGxpc3RfbGVuKSA9IHNlbGYucmVhZExpc3RCZWdpbigpCisgICAgICAgICMgVE9ETzogY29tcGFyZSB0eXBlcyB3ZSBqdXN0IGRlY29kZWQgd2l0aCB0aHJpZnRfc3BlYworICAgICAgICBlbGVtcyA9IGlzbGljZShzZWxmLl9yZWFkX2J5X3R0eXBlKHR0eXBlLCBzcGVjLCB0c3BlYyksIGxpc3RfbGVuKQorICAgICAgICByZXN1bHRzID0gKHR1cGxlIGlmIGlzX2ltbXV0YWJsZSBlbHNlIGxpc3QpKGVsZW1zKQorICAgICAgICBzZWxmLnJlYWRMaXN0RW5kKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgIGRlZiByZWFkQ29udGFpbmVyU2V0KHNlbGYsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIGlzX2ltbXV0YWJsZSA9IHNwZWMKKyAgICAgICAgKHNldF90eXBlLCBzZXRfbGVuKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKKyAgICAgICAgIyBUT0RPOiBjb21wYXJlIHR5cGVzIHdlIGp1c3QgZGVjb2RlZCB3aXRoIHRocmlmdF9zcGVjCisgICAgICAgIGVsZW1zID0gaXNsaWNlKHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHRzcGVjKSwgc2V0X2xlbikKKyAgICAgICAgcmVzdWx0cyA9IChmcm96ZW5zZXQgaWYgaXNfaW1tdXRhYmxlIGVsc2Ugc2V0KShlbGVtcykKKyAgICAgICAgc2VsZi5yZWFkU2V0RW5kKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgIGRlZiByZWFkQ29udGFpbmVyU3RydWN0KHNlbGYsIHNwZWMpOgorICAgICAgICAob2JqX2NsYXNzLCBvYmpfc3BlYykgPSBzcGVjCisgICAgICAgIG9iaiA9IG9ial9jbGFzcygpCisgICAgICAgIG9iai5yZWFkKHNlbGYpCisgICAgICAgIHJldHVybiBvYmoKKworICAgIGRlZiByZWFkQ29udGFpbmVyTWFwKHNlbGYsIHNwZWMpOgorICAgICAgICBrdHlwZSwga3NwZWMsIHZ0eXBlLCB2c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAobWFwX2t0eXBlLCBtYXBfdnR5cGUsIG1hcF9sZW4pID0gc2VsZi5yZWFkTWFwQmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMgYW5kCisgICAgICAgICMgYWJvcnQvc2tpcCBpZiB0eXBlcyBkaXNhZ3JlZQorICAgICAgICBrZXlzID0gc2VsZi5fcmVhZF9ieV90dHlwZShrdHlwZSwgc3BlYywga3NwZWMpCisgICAgICAgIHZhbHMgPSBzZWxmLl9yZWFkX2J5X3R0eXBlKHZ0eXBlLCBzcGVjLCB2c3BlYykKKyAgICAgICAga2V5dmFscyA9IGlzbGljZSh6aXAoa2V5cywgdmFscyksIG1hcF9sZW4pCisgICAgICAgIHJlc3VsdHMgPSAoVEZyb3plbkRpY3QgaWYgaXNfaW1tdXRhYmxlIGVsc2UgZGljdCkoa2V5dmFscykKKyAgICAgICAgc2VsZi5yZWFkTWFwRW5kKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgIGRlZiByZWFkU3RydWN0KHNlbGYsIG9iaiwgdGhyaWZ0X3NwZWMsIGlzX2ltbXV0YWJsZT1GYWxzZSk6CisgICAgICAgIGlmIGlzX2ltbXV0YWJsZToKKyAgICAgICAgICAgIGZpZWxkcyA9IHt9CisgICAgICAgIHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWVsZCA9IHRocmlmdF9zcGVjW2ZpZF0KKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChmdHlwZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgZmllbGQgaXMgbm90IE5vbmUgYW5kIGZ0eXBlID09IGZpZWxkWzFdOgorICAgICAgICAgICAgICAgICAgICBmbmFtZSA9IGZpZWxkWzJdCisgICAgICAgICAgICAgICAgICAgIGZzcGVjID0gZmllbGRbM10KKyAgICAgICAgICAgICAgICAgICAgdmFsID0gc2VsZi5yZWFkRmllbGRCeVRUeXBlKGZ0eXBlLCBmc3BlYykKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNfaW1tdXRhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzW2ZuYW1lXSA9IHZhbAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihvYmosIGZuYW1lLCB2YWwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQorICAgICAgICAgICAgc2VsZi5yZWFkRmllbGRFbmQoKQorICAgICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICBpZiBpc19pbW11dGFibGU6CisgICAgICAgICAgICByZXR1cm4gb2JqKCoqZmllbGRzKQorCisgICAgZGVmIHdyaXRlQ29udGFpbmVyU3RydWN0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHZhbC53cml0ZShzZWxmKQorCisgICAgZGVmIHdyaXRlQ29udGFpbmVyTGlzdChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIF8gPSBzcGVjCisgICAgICAgIHNlbGYud3JpdGVMaXN0QmVnaW4odHR5cGUsIGxlbih2YWwpKQorICAgICAgICBmb3IgXyBpbiBzZWxmLl93cml0ZV9ieV90dHlwZSh0dHlwZSwgdmFsLCBzcGVjLCB0c3BlYyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYud3JpdGVMaXN0RW5kKCkKKworICAgIGRlZiB3cml0ZUNvbnRhaW5lclNldChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIF8gPSBzcGVjCisgICAgICAgIHNlbGYud3JpdGVTZXRCZWdpbih0dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHR0eXBlLCB2YWwsIHNwZWMsIHRzcGVjKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53cml0ZVNldEVuZCgpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJNYXAoc2VsZiwgdmFsLCBzcGVjKToKKyAgICAgICAga3R5cGUsIGtzcGVjLCB2dHlwZSwgdnNwZWMsIF8gPSBzcGVjCisgICAgICAgIHNlbGYud3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIGxlbih2YWwpKQorICAgICAgICBmb3IgXyBpbiB6aXAoc2VsZi5fd3JpdGVfYnlfdHR5cGUoa3R5cGUsIHNpeC5pdGVya2V5cyh2YWwpLCBzcGVjLCBrc3BlYyksCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9ieV90dHlwZSh2dHlwZSwgc2l4Lml0ZXJ2YWx1ZXModmFsKSwgc3BlYywgdnNwZWMpKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53cml0ZU1hcEVuZCgpCisKKyAgICBkZWYgd3JpdGVTdHJ1Y3Qoc2VsZiwgb2JqLCB0aHJpZnRfc3BlYyk6CisgICAgICAgIHNlbGYud3JpdGVTdHJ1Y3RCZWdpbihvYmouX19jbGFzc19fLl9fbmFtZV9fKQorICAgICAgICBmb3IgZmllbGQgaW4gdGhyaWZ0X3NwZWM6CisgICAgICAgICAgICBpZiBmaWVsZCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmbmFtZSA9IGZpZWxkWzJdCisgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKG9iaiwgZm5hbWUpCisgICAgICAgICAgICBpZiB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIHNraXAgd3JpdGluZyBvdXQgdW5zZXQgZmllbGRzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZpZCA9IGZpZWxkWzBdCisgICAgICAgICAgICBmdHlwZSA9IGZpZWxkWzFdCisgICAgICAgICAgICBmc3BlYyA9IGZpZWxkWzNdCisgICAgICAgICAgICBzZWxmLndyaXRlRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCkKKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEJ5VFR5cGUoZnR5cGUsIHZhbCwgZnNwZWMpCisgICAgICAgICAgICBzZWxmLndyaXRlRmllbGRFbmQoKQorICAgICAgICBzZWxmLndyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgc2VsZi53cml0ZVN0cnVjdEVuZCgpCisKKyAgICBkZWYgX3dyaXRlX2J5X3R0eXBlKHNlbGYsIHR0eXBlLCB2YWxzLCBzcGVjLCBlc3BlYyk6CisgICAgICAgIF8sIHdyaXRlcl9uYW1lLCBpc19jb250YWluZXIgPSBzZWxmLl90dHlwZV9oYW5kbGVycyh0dHlwZSwgZXNwZWMpCisgICAgICAgIHdyaXRlcl9mdW5jID0gZ2V0YXR0cihzZWxmLCB3cml0ZXJfbmFtZSkKKyAgICAgICAgd3JpdGUgPSAobGFtYmRhIHY6IHdyaXRlcl9mdW5jKHYsIGVzcGVjKSkgaWYgaXNfY29udGFpbmVyIGVsc2Ugd3JpdGVyX2Z1bmMKKyAgICAgICAgZm9yIHYgaW4gdmFsczoKKyAgICAgICAgICAgIHlpZWxkIHdyaXRlKHYpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJ5VFR5cGUoc2VsZiwgdHR5cGUsIHZhbCwgc3BlYyk6CisgICAgICAgIG5leHQoc2VsZi5fd3JpdGVfYnlfdHR5cGUodHR5cGUsIFt2YWxdLCBzcGVjLCBzcGVjKSkKKworCitkZWYgY2hlY2tJbnRlZ2VyTGltaXRzKGksIGJpdHMpOgorICAgIGlmIGJpdHMgPT0gOCBhbmQgKGkgPCAtMTI4IG9yIGkgPiAxMjcpOgorICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpOCByZXF1aXJlcyAtMTI4IDw9IG51bWJlciA8PSAxMjciKQorICAgIGVsaWYgYml0cyA9PSAxNiBhbmQgKGkgPCAtMzI3Njggb3IgaSA+IDMyNzY3KToKKyAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTE2IHJlcXVpcmVzIC0zMjc2OCA8PSBudW1iZXIgPD0gMzI3NjciKQorICAgIGVsaWYgYml0cyA9PSAzMiBhbmQgKGkgPCAtMjE0NzQ4MzY0OCBvciBpID4gMjE0NzQ4MzY0Nyk6CisgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMiByZXF1aXJlcyAtMjE0NzQ4MzY0OCA8PSBudW1iZXIgPD0gMjE0NzQ4MzY0NyIpCisgICAgZWxpZiBiaXRzID09IDY0IGFuZCAoaSA8IC05MjIzMzcyMDM2ODU0Nzc1ODA4IG9yIGkgPiA5MjIzMzcyMDM2ODU0Nzc1ODA3KToKKyAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0IHJlcXVpcmVzIC05MjIzMzcyMDM2ODU0Nzc1ODA4IDw9IG51bWJlciA8PSA5MjIzMzcyMDM2ODU0Nzc1ODA3IikKKworCitjbGFzcyBUUHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTU0NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkKQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yKG9iamVjdCk6CisgICAgZGVmIF9fbmV3X18oY2xzLCBwcm90b2NvbCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZGVjb3JhdGVkX2NscyA9IHR5cGUoJycuam9pbihbJ0RlY29yYXRlZCcsIHByb3RvY29sLl9fY2xhc3NfXy5fX25hbWVfX10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xzLCBwcm90b2NvbC5fX2NsYXNzX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbC5fX2RpY3RfXykKKyAgICAgICAgcmV0dXJuIG9iamVjdC5fX25ld19fKGRlY29yYXRlZF9jbHMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weQppbmRleCAwMWJmZTE4Li43MTQ4ZjY2IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkKQEAgLTE3LDQgKzE3LDUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLV9fYWxsX18gPSBbJ1RQcm90b2NvbCcsICdUQmluYXJ5UHJvdG9jb2wnLCAnZmFzdGJpbmFyeSddCitfX2FsbF9fID0gWydmYXN0YmluYXJ5JywgJ1RCYXNlJywgJ1RCaW5hcnlQcm90b2NvbCcsICdUQ29tcGFjdFByb3RvY29sJywKKyAgICAgICAgICAgJ1RKU09OUHJvdG9jb2wnLCAnVFByb3RvY29sJ10KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jIGIvbGliL3B5L3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjIxNWEuLjAwMDAwMDAKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9mYXN0YmluYXJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotI2luY2x1ZGUgImNTdHJpbmdJTy5oIgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLS8qIEZpeCBlbmRpYW5uZXNzIGlzc3VlcyBvbiBTb2xhcmlzICovCi0jaWYgZGVmaW5lZCAoX19TVlI0KSAmJiBkZWZpbmVkIChfX3N1bikKLSAjaWYgZGVmaW5lZChfX2kzODYpICYmICFkZWZpbmVkKF9faTM4Nl9fKQotICAjZGVmaW5lIF9faTM4Nl9fCi0gI2VuZGlmCi0KLSAjaWZuZGVmIEJJR19FTkRJQU4KLSAgI2RlZmluZSBCSUdfRU5ESUFOICg0MzIxKQotICNlbmRpZgotICNpZm5kZWYgTElUVExFX0VORElBTgotICAjZGVmaW5lIExJVFRMRV9FTkRJQU4gKDEyMzQpCi0gI2VuZGlmCi0KLSAvKiBJMzg2IGlzIExFLCBldmVuIG9uIFNvbGFyaXMgKi8KLSAjaWYgIWRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChfX2kzODZfXykKLSAgI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLSAjZW5kaWYKLSNlbmRpZgotCi0vLyBUT0RPKGRyZWlzcyk6IGRlZnZhbCBhcHBlYXJzIHRvIGJlIHVudXNlZC4gIExvb2sgaW50byByZW1vdmluZyBpdC4KLS8vIFRPRE8oZHJlaXNzKTogTWFrZSBwYXJzZV9zcGVjX2FyZ3MgcmVjdXJzaXZlLCBhbmQgY2FjaGUgdGhlIG91dHB1dAotLy8gICAgICAgICAgICAgICBwZXJtYW5lbnRseSBpbiB0aGUgb2JqZWN0LiAgKE1hbGxvYyBhbmQgb3JwaGFuLikKLS8vIFRPRE8oZHJlaXNzKTogV2h5IGRvIHdlIG5lZWQgY1N0cmluZ0lPIGZvciByZWFkaW5nLCB3aHkgbm90IGp1c3QgY2hhcio/Ci0vLyAgICAgICAgICAgICAgIENhbiBjU3RyaW5nSU8gbGV0IHVzIHdvcmsgd2l0aCBhIEJ1ZmZlcmVkVHJhbnNwb3J0PwotLy8gVE9ETyhkcmVpc3MpOiBEb24ndCBpZ25vcmUgdGhlIHJ2IGZyb20gY3dyaXRlIChtYXliZSkuCi0KLS8qID09PT09PSBCRUdJTiBVVElMSVRJRVMgPT09PT09ICovCi0KLSNkZWZpbmUgSU5JVF9PVVRCVUZfU0laRSAxMjgKLQotLy8gU3RvbGVuIG91dCBvZiBUUHJvdG9jb2wuaC4KLS8vIEl0IHdvdWxkIGJlIGEgaHVnZSBwYWluIHRvIGhhdmUgYm90aCBnZXQgdGhpcyBmcm9tIG9uZSBwbGFjZS4KLXR5cGVkZWYgZW51bSBUVHlwZSB7Ci0gIFRfU1RPUCAgICAgICA9IDAsCi0gIFRfVk9JRCAgICAgICA9IDEsCi0gIFRfQk9PTCAgICAgICA9IDIsCi0gIFRfQllURSAgICAgICA9IDMsCi0gIFRfSTA4ICAgICAgICA9IDMsCi0gIFRfSTE2ICAgICAgICA9IDYsCi0gIFRfSTMyICAgICAgICA9IDgsCi0gIFRfVTY0ICAgICAgICA9IDksCi0gIFRfSTY0ICAgICAgICA9IDEwLAotICBUX0RPVUJMRSAgICAgPSA0LAotICBUX1NUUklORyAgICAgPSAxMSwKLSAgVF9VVEY3ICAgICAgID0gMTEsCi0gIFRfU1RSVUNUICAgICA9IDEyLAotICBUX01BUCAgICAgICAgPSAxMywKLSAgVF9TRVQgICAgICAgID0gMTQsCi0gIFRfTElTVCAgICAgICA9IDE1LAotICBUX1VURjggICAgICAgPSAxNiwKLSAgVF9VVEYxNiAgICAgID0gMTcKLX0gVFR5cGU7Ci0KLSNpZm5kZWYgX19CWVRFX09SREVSCi0jIGlmIGRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChMSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKEJJR19FTkRJQU4pCi0jICBkZWZpbmUgX19CWVRFX09SREVSIEJZVEVfT1JERVIKLSMgIGRlZmluZSBfX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgotIyAgZGVmaW5lIF9fQklHX0VORElBTiBCSUdfRU5ESUFOCi0jIGVsc2UKLSMgIGVycm9yICJDYW5ub3QgZGV0ZXJtaW5lIGVuZGlhbm5lc3MiCi0jIGVuZGlmCi0jZW5kaWYKLQotLy8gU2FtZSBjb21tZW50IGFzIHRoZSBlbnVtLiAgU29ycnkuCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotIyBkZWZpbmUgbnRvaGxsKG4pIChuKQotIyBkZWZpbmUgaHRvbmxsKG4pIChuKQotI2VsaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgotIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKLSMgIGluY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jICBkZWZpbmUgbnRvaGxsKG4pIGJzd2FwXzY0KG4pCi0jICBkZWZpbmUgaHRvbmxsKG4pIGJzd2FwXzY0KG4pCi0jIGVsc2UgLyogR05VQyAmIEdMSUJDICovCi0jICBkZWZpbmUgbnRvaGxsKG4pICggKCgodW5zaWduZWQgbG9uZyBsb25nKW50b2hsKG4pKSA8PCAzMikgKyBudG9obChuID4+IDMyKSApCi0jICBkZWZpbmUgaHRvbmxsKG4pICggKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSApCi0jIGVuZGlmIC8qIEdOVUMgJiBHTElCQyAqLwotI2Vsc2UgLyogX19CWVRFX09SREVSICovCi0jIGVycm9yICJDYW4ndCBkZWZpbmUgaHRvbmxsIG9yIG50b2hsbCEiCi0jZW5kaWYKLQotLy8gRG9pbmcgYSBiZW5jaG1hcmsgc2hvd3MgdGhhdCBpbnRlcm5pbmcgYWN0dWFsbHkgbWFrZXMgYSBkaWZmZXJlbmNlLCBhbWF6aW5nbHkuCi0jZGVmaW5lIElOVEVSTl9TVFJJTkcodmFsdWUpIF9pbnRlcm5fICMjIHZhbHVlCi0KLSNkZWZpbmUgSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikgKCAoKHYpID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpICkKLSNkZWZpbmUgQ0hFQ0tfUkFOR0UodiwgbWluLCBtYXgpICggKCh2KSA8PSAobWF4KSkgJiYgKCh2KSA+PSAobWluKSkgKQotCi0vLyBQeV9zc2l6ZV90IHdhcyBub3QgZGVmaW5lZCBiZWZvcmUgUHl0aG9uIDIuNQotI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi10eXBlZGVmIGludCBQeV9zc2l6ZV90OwotI2VuZGlmCi0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHNldCBvciBsaXN0LAotICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBUVHlwZSBlbGVtZW50X3R5cGU7Ci0gIFB5T2JqZWN0KiB0eXBlYXJnczsKLX0gU2V0TGlzdFR5cGVBcmdzOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBtYXAsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFRUeXBlIGt0YWc7Ci0gIFRUeXBlIHZ0YWc7Ci0gIFB5T2JqZWN0KiBrdHlwZWFyZ3M7Ci0gIFB5T2JqZWN0KiB2dHlwZWFyZ3M7Ci19IE1hcFR5cGVBcmdzOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBzdHJ1Y3QsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFB5T2JqZWN0KiBrbGFzczsKLSAgUHlPYmplY3QqIHNwZWM7Ci19IFN0cnVjdFR5cGVBcmdzOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIGl0ZW0gc3BlYyBmcm9tIGEgc3RydWN0IHNwZWNpZmljYXRpb24sCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCB0YWc7Ci0gIFRUeXBlIHR5cGU7Ci0gIFB5T2JqZWN0KiBhdHRybmFtZTsKLSAgUHlPYmplY3QqIHR5cGVhcmdzOwotICBQeU9iamVjdCogZGVmdmFsOwotfSBTdHJ1Y3RJdGVtU3BlYzsKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSB0d28ga2V5IGF0dHJpYnV0ZXMgb2YgYSBDUmVhZGFibGVUcmFuc3BvcnQsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeU9iamVjdF9HZXRBdHRyLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFB5T2JqZWN0KiBzdHJpbmdpb2J1ZjsKLSAgUHlPYmplY3QqIHJlZmlsbF9jYWxsYWJsZTsKLX0gRGVjb2RlQnVmZmVyOwotCi0vKiogUG9pbnRlciB0byBpbnRlcm5lZCBzdHJpbmcgdG8gc3BlZWQgdXAgYXR0cmlidXRlIGxvb2t1cC4gKi8KLXN0YXRpYyBQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKLS8qKiBQb2ludGVyIHRvIGludGVybmVkIHN0cmluZyB0byBzcGVlZCB1cCBhdHRyaWJ1dGUgbG9va3VwLiAqLwotc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOwotCi1zdGF0aWMgaW5saW5lIGJvb2wKLWNoZWNrX3NzaXplX3RfMzIoUHlfc3NpemVfdCBsZW4pIHsKLSAgLy8gZXJyb3IgZnJvbSBnZXR0aW5nIHRoZSBpbnQKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGxlbikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFDSEVDS19SQU5HRShsZW4sIDAsIElOVDMyX01BWCkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInN0cmluZyBzaXplIG91dCBvZiByYW5nZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1wYXJzZV9weWludChQeU9iamVjdCogbywgaW50MzJfdCogcmV0LCBpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgpIHsKLSAgbG9uZyB2YWwgPSBQeUludF9Bc0xvbmcobyk7Ci0KLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHZhbCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFDSEVDS19SQU5HRSh2YWwsIG1pbiwgbWF4KSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW50IG91dCBvZiByYW5nZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpyZXQgPSAoaW50MzJfdCkgdmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAtLS0gRlVOQ1RJT05TIFRPIFBBUlNFIFNUUlVDVCBTUEVDSUZJQ0FUT0lOUyAtLS0gKi8KLQotc3RhdGljIGJvb2wKLXBhcnNlX3NldF9saXN0X2FyZ3MoU2V0TGlzdFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gMikgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgdHVwbGUgb2Ygc2l6ZSAyIGZvciBsaXN0L3NldCB0eXBlIGFyZ3MiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5lbGVtZW50X3R5cGUgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+ZWxlbWVudF90eXBlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1wYXJzZV9tYXBfYXJncyhNYXBUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDQpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIDQgYXJndW1lbnRzIGZvciB0eXBlYXJncyB0byBtYXAiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5rdGFnID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDApKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPmt0YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dnRhZyA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT52dGFnKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmt0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOwotICBkZXN0LT52dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXBhcnNlX3N0cnVjdF9hcmdzKFN0cnVjdFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gMikgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgdHVwbGUgb2Ygc2l6ZSAyIGZvciBzdHJ1Y3QgYXJncyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmtsYXNzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCk7Ci0gIGRlc3QtPnNwZWMgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludAotcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyhTdHJ1Y3RJdGVtU3BlYyogZGVzdCwgUHlPYmplY3QqIHNwZWNfdHVwbGUpIHsKLQotICAvLyBpJ2QgbGlrZSB0byB1c2UgUGFyc2VBcmdzIGhlcmUsIGJ1dCBpdCBzZWVtcyB0byBiZSBhIGJvdHRsZW5lY2suCi0gIGlmIChQeVR1cGxlX1NpemUoc3BlY190dXBsZSkgIT0gNSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNSBhcmd1bWVudHMgZm9yIHNwZWMgdHVwbGUiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT50YWcgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAwKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT50YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dHlwZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDEpKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnR5cGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+YXR0cm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDIpOwotICBkZXN0LT50eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMyk7Ci0gIGRlc3QtPmRlZnZhbCA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgNCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiA9PT09PT0gRU5EIFVUSUxJVElFUyA9PT09PT0gKi8KLQotCi0vKiA9PT09PT0gQkVHSU4gV1JJVElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLS8qIC0tLSBMT1ctTEVWRUwgV1JJVElORyBGVU5DVElPTlMgLS0tICovCi0KLXN0YXRpYyB2b2lkIHdyaXRlQnl0ZShQeU9iamVjdCogb3V0YnVmLCBpbnQ4X3QgdmFsKSB7Ci0gIGludDhfdCBuZXQgPSB2YWw7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDhfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZUkxNihQeU9iamVjdCogb3V0YnVmLCBpbnQxNl90IHZhbCkgewotICBpbnQxNl90IG5ldCA9IChpbnQxNl90KWh0b25zKHZhbCk7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDE2X3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVJMzIoUHlPYmplY3QqIG91dGJ1ZiwgaW50MzJfdCB2YWwpIHsKLSAgaW50MzJfdCBuZXQgPSAoaW50MzJfdClodG9ubCh2YWwpOwotICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dGJ1ZiwgKGNoYXIqKSZuZXQsIHNpemVvZihpbnQzMl90KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlSTY0KFB5T2JqZWN0KiBvdXRidWYsIGludDY0X3QgdmFsKSB7Ci0gIGludDY0X3QgbmV0ID0gKGludDY0X3QpaHRvbmxsKHZhbCk7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDY0X3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVEb3VibGUoUHlPYmplY3QqIG91dGJ1ZiwgZG91YmxlIGR1YikgewotICAvLyBVbmZvcnR1bmF0ZWx5LCBiaXR3aXNlX2Nhc3QgZG9lc24ndCB3b3JrIGluIEMuICBCYWQgQyEKLSAgdW5pb24gewotICAgIGRvdWJsZSBmOwotICAgIGludDY0X3QgdDsKLSAgfSB0cmFuc2ZlcjsKLSAgdHJhbnNmZXIuZiA9IGR1YjsKLSAgd3JpdGVJNjQob3V0YnVmLCB0cmFuc2Zlci50KTsKLX0KLQotCi0vKiAtLS0gTUFJTiBSRUNVUlNJVkUgT1VUUFVUIEZVQ05USU9OIC0tICovCi0KLXN0YXRpYyBpbnQKLW91dHB1dF92YWwoUHlPYmplY3QqIG91dHB1dCwgUHlPYmplY3QqIHZhbHVlLCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgLyoKLSAgICogUmVmY291bnRpbmcgU3RyYXRlZ3k6Ci0gICAqCi0gICAqIFdlIGFzc3VtZSB0aGF0IGVsZW1lbnRzIG9mIHRoZSB0aHJpZnRfc3BlYyB0dXBsZSBhcmUgbm90IGdvaW5nIHRvIGJlCi0gICAqIG11dGF0ZWQsIHNvIHdlIGRvbid0IHJlZiBjb3VudCB0aG9zZSBhdCBhbGwuIE90aGVyIHRoYW4gdGhhdCwgd2UgdHJ5IHRvCi0gICAqIGtlZXAgYSByZWZlcmVuY2UgdG8gYWxsIHRoZSB1c2VyLWNyZWF0ZWQgb2JqZWN0cyB3aGlsZSB3ZSB3b3JrIHdpdGggdGhlbS4KLSAgICogb3V0cHV0X3ZhbCBhc3N1bWVzIHRoYXQgYSByZWZlcmVuY2UgaXMgYWxyZWFkeSBoZWxkLiBUaGUgKmNhbGxlciogaXMKLSAgICogcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHJlZmVyZW5jZXMKLSAgICovCi0KLSAgc3dpdGNoICh0eXBlKSB7Ci0KLSAgY2FzZSBUX0JPT0w6IHsKLSAgICBpbnQgdiA9IFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSk7Ci0gICAgaWYgKHYgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCAoaW50OF90KSB2KTsKLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTA4OiB7Ci0gICAgaW50MzJfdCB2YWw7Ci0KLSAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCBJTlQ4X01JTiwgSU5UOF9NQVgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdCkgdmFsKTsKLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTE2OiB7Ci0gICAgaW50MzJfdCB2YWw7Ci0KLSAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCBJTlQxNl9NSU4sIElOVDE2X01BWCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUkxNihvdXRwdXQsIChpbnQxNl90KSB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMzI6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDMyX01JTiwgSU5UMzJfTUFYKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTMyKG91dHB1dCwgdmFsKTsKLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTY0OiB7Ci0gICAgaW50NjRfdCBudmFsID0gUHlMb25nX0FzTG9uZ0xvbmcodmFsdWUpOwotCi0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKG52YWwpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFDSEVDS19SQU5HRShudmFsLCBJTlQ2NF9NSU4sIElOVDY0X01BWCkpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW50IG91dCBvZiByYW5nZSIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTY0KG91dHB1dCwgbnZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfRE9VQkxFOiB7Ci0gICAgZG91YmxlIG52YWwgPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKLSAgICBpZiAobnZhbCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZURvdWJsZShvdXRwdXQsIG52YWwpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX1NUUklORzogewotICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfU2l6ZSh2YWx1ZSk7Ci0KLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTMyKG91dHB1dCwgKGludDMyX3QpIGxlbik7Ci0gICAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRwdXQsIFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKSwgKGludDMyX3QpIGxlbik7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfTElTVDoKLSAgY2FzZSBUX1NFVDogewotICAgIFB5X3NzaXplX3QgbGVuOwotICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIFB5T2JqZWN0ICppdGVtOwotICAgIFB5T2JqZWN0ICppdGVyYXRvcjsKLQotICAgIGlmICghcGFyc2Vfc2V0X2xpc3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbGVuID0gUHlPYmplY3RfTGVuZ3RoKHZhbHVlKTsKLQotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUpOwotICAgIHdyaXRlSTMyKG91dHB1dCwgKGludDMyX3QpIGxlbik7Ci0KLSAgICBpdGVyYXRvciA9ICBQeU9iamVjdF9HZXRJdGVyKHZhbHVlKTsKLSAgICBpZiAoaXRlcmF0b3IgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXJhdG9yKSkpIHsKLSAgICAgIGlmICghb3V0cHV0X3ZhbChvdXRwdXQsIGl0ZW0sIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlLCBwYXJzZWRhcmdzLnR5cGVhcmdzKSkgewotICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVyYXRvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICB9Ci0KLSAgICBQeV9ERUNSRUYoaXRlcmF0b3IpOwotCi0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9NQVA6IHsKLSAgICBQeU9iamVjdCAqaywgKnY7Ci0gICAgUHlfc3NpemVfdCBwb3MgPSAwOwotICAgIFB5X3NzaXplX3QgbGVuOwotCi0gICAgTWFwVHlwZUFyZ3MgcGFyc2VkYXJnczsKLQotICAgIGxlbiA9IFB5RGljdF9TaXplKHZhbHVlKTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghcGFyc2VfbWFwX2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIHBhcnNlZGFyZ3Mua3RhZyk7Ci0gICAgd3JpdGVCeXRlKG91dHB1dCwgcGFyc2VkYXJncy52dGFnKTsKLSAgICB3cml0ZUkzMihvdXRwdXQsIGxlbik7Ci0KLSAgICAvLyBUT0RPKGJtYXVyZXIpOiBzaG91bGQgc3VwcG9ydCBhbnkgbWFwcGluZywgbm90IGp1c3QgZGljdHMKLSAgICB3aGlsZSAoUHlEaWN0X05leHQodmFsdWUsICZwb3MsICZrLCAmdikpIHsKLSAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpbmsgaGFyZCBhYm91dCB3aGV0aGVyIHRoZXNlIElOQ1JFRnMgYWN0dWFsbHkKLSAgICAgIC8vICAgICAgICAgICAgICAgdHVybiBhbnkgdW5zYWZlIHNjZW5hcmlvcyBpbnRvIHNhZmUgc2NlbmFyaW9zLgotICAgICAgUHlfSU5DUkVGKGspOwotICAgICAgUHlfSU5DUkVGKHYpOwotCi0gICAgICBpZiAoIW91dHB1dF92YWwob3V0cHV0LCBrLCBwYXJzZWRhcmdzLmt0YWcsIHBhcnNlZGFyZ3Mua3R5cGVhcmdzKQotICAgICAgICAgIHx8ICFvdXRwdXRfdmFsKG91dHB1dCwgdiwgcGFyc2VkYXJncy52dGFnLCBwYXJzZWRhcmdzLnZ0eXBlYXJncykpIHsKLSAgICAgICAgUHlfREVDUkVGKGspOwotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFB5X0RFQ1JFRihrKTsKLSAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIGJyZWFraW5nIHRoaXMgb3V0IGFzIGEgZnVuY3Rpb24KLSAgLy8gICAgICAgICAgICAgICB0aGUgd2F5IHdlIGRpZCBmb3IgZGVjb2RlX3N0cnVjdC4KLSAgY2FzZSBUX1NUUlVDVDogewotICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlfc3NpemVfdCBuc3BlYzsKLSAgICBQeV9zc2l6ZV90IGk7Ci0KLSAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBuc3BlYyA9IFB5VHVwbGVfU2l6ZShwYXJzZWRhcmdzLnNwZWMpOwotCi0gICAgaWYgKG5zcGVjID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG5zcGVjOyBpKyspIHsKLSAgICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7Ci0gICAgICBQeU9iamVjdCogc3BlY190dXBsZTsKLSAgICAgIFB5T2JqZWN0KiBpbnN0dmFsID0gTlVMTDsKLQotICAgICAgc3BlY190dXBsZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyc2VkYXJncy5zcGVjLCBpKTsKLSAgICAgIGlmIChzcGVjX3R1cGxlID09IFB5X05vbmUpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyAoJnBhcnNlZHNwZWMsIHNwZWNfdHVwbGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaW5zdHZhbCA9IFB5T2JqZWN0X0dldEF0dHIodmFsdWUsIHBhcnNlZHNwZWMuYXR0cm5hbWUpOwotCi0gICAgICBpZiAoIWluc3R2YWwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpZiAoaW5zdHZhbCA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpbnN0dmFsKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpIHBhcnNlZHNwZWMudHlwZSk7Ci0gICAgICB3cml0ZUkxNihvdXRwdXQsIHBhcnNlZHNwZWMudGFnKTsKLQotICAgICAgaWYgKCFvdXRwdXRfdmFsKG91dHB1dCwgaW5zdHZhbCwgcGFyc2Vkc3BlYy50eXBlLCBwYXJzZWRzcGVjLnR5cGVhcmdzKSkgewotICAgICAgICBQeV9ERUNSRUYoaW5zdHZhbCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgUHlfREVDUkVGKGluc3R2YWwpOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpVF9TVE9QKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBmYWxzZTsKLQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogLS0tIFRPUC1MRVZFTCBXUkFQUEVSIEZPUiBPVVRQVVQgLS0gKi8KLQotc3RhdGljIFB5T2JqZWN0ICoKLWVuY29kZV9iaW5hcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gIFB5T2JqZWN0KiBlbmNfb2JqOwotICBQeU9iamVjdCogdHlwZV9hcmdzOwotICBQeU9iamVjdCogYnVmOwotICBQeU9iamVjdCogcmV0ID0gTlVMTDsKLQotICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJmVuY19vYmosICZ0eXBlX2FyZ3MpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBidWYgPSBQeWNTdHJpbmdJTy0+TmV3T3V0cHV0KElOSVRfT1VUQlVGX1NJWkUpOwotICBpZiAob3V0cHV0X3ZhbChidWYsIGVuY19vYmosIFRfU1RSVUNULCB0eXBlX2FyZ3MpKSB7Ci0gICAgcmV0ID0gUHljU3RyaW5nSU8tPmNnZXR2YWx1ZShidWYpOwotICB9Ci0KLSAgUHlfREVDUkVGKGJ1Zik7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qID09PT09PSBFTkQgV1JJVElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLQotLyogPT09PT09IEJFR0lOIFJFQURJTkcgRlVOQ1RJT05TID09PT09PSAqLwotCi0vKiAtLS0gTE9XLUxFVkVMIFJFQURJTkcgRlVOQ1RJT05TIC0tLSAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV9kZWNvZGVidWYoRGVjb2RlQnVmZmVyKiBkKSB7Ci0gIFB5X1hERUNSRUYoZC0+c3RyaW5naW9idWYpOwotICBQeV9YREVDUkVGKGQtPnJlZmlsbF9jYWxsYWJsZSk7Ci19Ci0KLXN0YXRpYyBib29sCi1kZWNvZGVfYnVmZmVyX2Zyb21fb2JqKERlY29kZUJ1ZmZlciogZGVzdCwgUHlPYmplY3QqIG9iaikgewotICBkZXN0LT5zdHJpbmdpb2J1ZiA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpKTsKLSAgaWYgKCFkZXN0LT5zdHJpbmdpb2J1ZikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghUHljU3RyaW5nSU9fSW5wdXRDaGVjayhkZXN0LT5zdHJpbmdpb2J1ZikpIHsKLSAgICBmcmVlX2RlY29kZWJ1ZihkZXN0KTsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHN0cmluZ2lvIGlucHV0Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+cmVmaWxsX2NhbGxhYmxlID0gUHlPYmplY3RfR2V0QXR0cihvYmosIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCkpOwotCi0gIGlmKCFkZXN0LT5yZWZpbGxfY2FsbGFibGUpIHsKLSAgICBmcmVlX2RlY29kZWJ1ZihkZXN0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZGVzdC0+cmVmaWxsX2NhbGxhYmxlKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgY2FsbGFibGUiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgcmVhZEJ5dGVzKERlY29kZUJ1ZmZlciogaW5wdXQsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKLSAgaW50IHJlYWQ7Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBEb24ndCBmZWFyIHRoZSBtYWxsb2MuICBUaGluayBhYm91dCB0YWtpbmcgYSBjb3B5IG9mCi0gIC8vICAgICAgICAgICAgICAgdGhlIHBhcnRpYWwgcmVhZCBpbnN0ZWFkIG9mIGZvcmNpbmcgdGhlIHRyYW5zcG9ydAotICAvLyAgICAgICAgICAgICAgIHRvIHByZXBlbmQgaXQgdG8gaXRzIGJ1ZmZlci4KLQotICByZWFkID0gUHljU3RyaW5nSU8tPmNyZWFkKGlucHV0LT5zdHJpbmdpb2J1Ziwgb3V0cHV0LCBsZW4pOwotCi0gIGlmIChyZWFkID09IGxlbikgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKHJlYWQgPT0gLTEpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgUHlPYmplY3QqIG5ld2lvYnVmOwotCi0gICAgLy8gdXNpbmcgYnVpbGRpbmcgZnVuY3Rpb25zIGFzIHRoaXMgaXMgYSByYXJlIGNvZGVwYXRoCi0gICAgbmV3aW9idWYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oCi0gICAgICAgIGlucHV0LT5yZWZpbGxfY2FsbGFibGUsICJzI2kiLCAqb3V0cHV0LCByZWFkLCBsZW4sIE5VTEwpOwotICAgIGlmIChuZXdpb2J1ZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gbXVzdCBkbyB0aGlzICpBRlRFUiogdGhlIGNhbGwgc28gdGhhdCB3ZSBkb24ndCBkZXJlZiB0aGUgaW8gYnVmZmVyCi0gICAgUHlfQ0xFQVIoaW5wdXQtPnN0cmluZ2lvYnVmKTsKLSAgICBpbnB1dC0+c3RyaW5naW9idWYgPSBuZXdpb2J1ZjsKLQotICAgIHJlYWQgPSBQeWNTdHJpbmdJTy0+Y3JlYWQoaW5wdXQtPnN0cmluZ2lvYnVmLCBvdXRwdXQsIGxlbik7Ci0KLSAgICBpZiAocmVhZCA9PSBsZW4pIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAocmVhZCA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUT0RPKGRyZWlzcyk6IFRoaXMgY291bGQgYmUgYSB2YWxpZCBjb2RlIHBhdGggZm9yIGJpZyBiaW5hcnkgYmxvYnMuCi0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICJyZWZpbGwgY2xhaW1lZCB0byBoYXZlIHJlZmlsbGVkIHRoZSBidWZmZXIsIGJ1dCBkaWRuJ3QhISIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgaW50OF90IHJlYWRCeXRlKERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDhfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuICooaW50OF90KikgYnVmOwotfQotCi1zdGF0aWMgaW50MTZfdCByZWFkSTE2KERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDE2X3QpKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiAoaW50MTZfdCkgbnRvaHMoKihpbnQxNl90KikgYnVmKTsKLX0KLQotc3RhdGljIGludDMyX3QgcmVhZEkzMihEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIGNoYXIqIGJ1ZjsKLSAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIHNpemVvZihpbnQzMl90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIChpbnQzMl90KSBudG9obCgqKGludDMyX3QqKSBidWYpOwotfQotCi0KLXN0YXRpYyBpbnQ2NF90IHJlYWRJNjQoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50NjRfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIChpbnQ2NF90KSBudG9obGwoKihpbnQ2NF90KikgYnVmKTsKLX0KLQotc3RhdGljIGRvdWJsZSByZWFkRG91YmxlKERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgdW5pb24gewotICAgIGludDY0X3QgZjsKLSAgICBkb3VibGUgdDsKLSAgfSB0cmFuc2ZlcjsKLQotICB0cmFuc2Zlci5mID0gcmVhZEk2NChpbnB1dCk7Ci0gIGlmICh0cmFuc2Zlci5mID09IC0xKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiB0cmFuc2Zlci50OwotfQotCi1zdGF0aWMgYm9vbAotY2hlY2tUeXBlQnl0ZShEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSBleHBlY3RlZCkgewotICBUVHlwZSBnb3QgPSByZWFkQnl0ZShpbnB1dCk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChnb3QpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGV4cGVjdGVkICE9IGdvdCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJnb3Qgd3JvbmcgdHR5cGUgd2hpbGUgcmVhZGluZyBmaWVsZCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXNraXAoRGVjb2RlQnVmZmVyKiBpbnB1dCwgVFR5cGUgdHlwZSkgewotI2RlZmluZSBTS0lQQllURVMobikgXAotICBkbyB7IFwKLSAgICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmR1bW15X2J1ZiwgKG4pKSkgeyBcCi0gICAgICByZXR1cm4gZmFsc2U7IFwKLSAgICB9IFwKLSAgfSB3aGlsZSgwKQotCi0gIGNoYXIqIGR1bW15X2J1ZjsKLQotICBzd2l0Y2ggKHR5cGUpIHsKLQotICBjYXNlIFRfQk9PTDoKLSAgY2FzZSBUX0kwODogU0tJUEJZVEVTKDEpOyBicmVhazsKLSAgY2FzZSBUX0kxNjogU0tJUEJZVEVTKDIpOyBicmVhazsKLSAgY2FzZSBUX0kzMjogU0tJUEJZVEVTKDQpOyBicmVhazsKLSAgY2FzZSBUX0k2NDoKLSAgY2FzZSBUX0RPVUJMRTogU0tJUEJZVEVTKDgpOyBicmVhazsKLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBGaW5kIG91dCBpZiB0aGVzZSBjaGVja19zc2l6ZV90MzJzIGFyZSByZWFsbHkgbmVjZXNzYXJ5LgotICAgIGludCBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBTS0lQQllURVMobGVuKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9MSVNUOgotICBjYXNlIFRfU0VUOiB7Ci0gICAgVFR5cGUgZXR5cGU7Ci0gICAgaW50IGxlbiwgaTsKLQotICAgIGV0eXBlID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmIChldHlwZSA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBpZiAoIXNraXAoaW5wdXQsIGV0eXBlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIFRUeXBlIGt0eXBlLCB2dHlwZTsKLSAgICBpbnQgbGVuLCBpOwotCi0gICAga3R5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKGt0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdnR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKHZ0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmICghKHNraXAoaW5wdXQsIGt0eXBlKSAmJiBza2lwKGlucHV0LCB2dHlwZSkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIFRUeXBlIHR5cGU7Ci0KLSAgICAgIHR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgICBpZiAodHlwZSA9PSAtMSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0eXBlID09IFRfU1RPUCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIFNLSVBCWVRFUygyKTsgLy8gdGFnCi0gICAgICBpZiAoIXNraXAoaW5wdXQsIHR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RPUDoKLSAgY2FzZSBUX1ZPSUQ6Ci0gIGNhc2UgVF9VVEYxNjoKLSAgY2FzZSBUX1VURjg6Ci0gIGNhc2UgVF9VNjQ6Ci0gIGRlZmF1bHQ6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotCi0jdW5kZWYgU0tJUEJZVEVTCi19Ci0KLQotLyogLS0tIEhFTFBFUiBGVU5DVElPTiBGT1IgREVDT0RFX1ZBTCAtLS0gKi8KLQotc3RhdGljIFB5T2JqZWN0KgotZGVjb2RlX3ZhbChEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpOwotCi1zdGF0aWMgYm9vbAotZGVjb2RlX3N0cnVjdChEZWNvZGVCdWZmZXIqIGlucHV0LCBQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCogc3BlY19zZXEpIHsKLSAgaW50IHNwZWNfc2VxX2xlbiA9IFB5VHVwbGVfU2l6ZShzcGVjX3NlcSk7Ci0gIGlmIChzcGVjX3NlcV9sZW4gPT0gLTEpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB3aGlsZSAodHJ1ZSkgewotICAgIFRUeXBlIHR5cGU7Ci0gICAgaW50MTZfdCB0YWc7Ci0gICAgUHlPYmplY3QqIGl0ZW1fc3BlYzsKLSAgICBQeU9iamVjdCogZmllbGR2YWwgPSBOVUxMOwotICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7Ci0KLSAgICB0eXBlID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmICh0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICh0eXBlID09IFRfU1RPUCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHRhZyA9IHJlYWRJMTYoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh0YWcpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICh0YWcgPj0gMCAmJiB0YWcgPCBzcGVjX3NlcV9sZW4pIHsKLSAgICAgIGl0ZW1fc3BlYyA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY19zZXEsIHRhZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGl0ZW1fc3BlYyA9IFB5X05vbmU7Ci0gICAgfQotCi0gICAgaWYgKGl0ZW1fc3BlYyA9PSBQeV9Ob25lKSB7Ci0gICAgICBpZiAoIXNraXAoaW5wdXQsIHR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYygmcGFyc2Vkc3BlYywgaXRlbV9zcGVjKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAocGFyc2Vkc3BlYy50eXBlICE9IHR5cGUpIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInN0cnVjdCBmaWVsZCBoYWQgd3JvbmcgdHlwZSB3aGlsZSByZWFkaW5nIGFuZCBjYW4ndCBiZSBza2lwcGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGZpZWxkdmFsID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2Vkc3BlYy50eXBlLCBwYXJzZWRzcGVjLnR5cGVhcmdzKTsKLSAgICBpZiAoZmllbGR2YWwgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChQeU9iamVjdF9TZXRBdHRyKG91dHB1dCwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwpID09IC0xKSB7Ci0gICAgICBQeV9ERUNSRUYoZmllbGR2YWwpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBQeV9ERUNSRUYoZmllbGR2YWwpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIC0tLSBNQUlOIFJFQ1VSU0lWRSBJTlBVVCBGVUNOVElPTiAtLS0gKi8KLQotLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UuCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfdmFsKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBzd2l0Y2ggKHR5cGUpIHsKLQotICBjYXNlIFRfQk9PTDogewotICAgIGludDhfdCB2ID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgc3dpdGNoICh2KSB7Ci0gICAgY2FzZSAwOiBQeV9SRVRVUk5fRkFMU0U7Ci0gICAgY2FzZSAxOiBQeV9SRVRVUk5fVFJVRTsKLSAgICAvLyBEb24ndCBsYXVnaC4gIFRoaXMgaXMgYSBwb3RlbnRpYWxseSBzZXJpb3VzIGlzc3VlLgotICAgIGRlZmF1bHQ6IFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJib29sZWFuIG91dCBvZiByYW5nZSIpOyByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0kwODogewotICAgIGludDhfdCB2ID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOwotICB9Ci0gIGNhc2UgVF9JMTY6IHsKLSAgICBpbnQxNl90IHYgPSByZWFkSTE2KGlucHV0KTsKLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7Ci0gIH0KLSAgY2FzZSBUX0kzMjogewotICAgIGludDMyX3QgdiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKLSAgfQotCi0gIGNhc2UgVF9JNjQ6IHsKLSAgICBpbnQ2NF90IHYgPSByZWFkSTY0KGlucHV0KTsKLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpbmQgb3V0IGlmIHdlIGNhbiB0YWtlIHRoaXMgZmFzdHBhdGggYWx3YXlzIHdoZW4KLSAgICAvLyAgICAgICAgICAgICAgIHNpemVvZihsb25nKSA9PSBzaXplb2YobG9uZyBsb25nKS4KLSAgICBpZiAoQ0hFQ0tfUkFOR0UodiwgTE9OR19NSU4sIExPTkdfTUFYKSkgewotICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2KTsKLSAgfQotCi0gIGNhc2UgVF9ET1VCTEU6IHsKLSAgICBkb3VibGUgdiA9IHJlYWREb3VibGUoaW5wdXQpOwotICAgIGlmICh2ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHYpOwotICB9Ci0KLSAgY2FzZSBUX1NUUklORzogewotICAgIFB5X3NzaXplX3QgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgY2hhciogYnVmOwotICAgIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBsZW4pKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOwotICB9Ci0KLSAgY2FzZSBUX0xJU1Q6Ci0gIGNhc2UgVF9TRVQ6IHsKLSAgICBTZXRMaXN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBpbnQzMl90IGxlbjsKLSAgICBQeU9iamVjdCogcmV0ID0gTlVMTDsKLSAgICBpbnQgaTsKLQotICAgIGlmICghcGFyc2Vfc2V0X2xpc3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIWNoZWNrVHlwZUJ5dGUoaW5wdXQsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldCA9IFB5TGlzdF9OZXcobGVuKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCogaXRlbSA9IGRlY29kZV92YWwoaW5wdXQsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlLCBwYXJzZWRhcmdzLnR5cGVhcmdzKTsKLSAgICAgIGlmICghaXRlbSkgewotICAgICAgICBQeV9ERUNSRUYocmV0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICBQeUxpc3RfU0VUX0lURU0ocmV0LCBpLCBpdGVtKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIGJpdGluZyB0aGUgYnVsbGV0IGFuZCBtYWtpbmcgdHdvIHNlcGFyYXRlIGNhc2VzCi0gICAgLy8gICAgICAgICAgICAgICBmb3IgbGlzdCBhbmQgc2V0LCBhdm9pZGluZyB0aGlzIHBvc3QgZmFjdG8gY29udmVyc2lvbi4KLSAgICBpZiAodHlwZSA9PSBUX1NFVCkgewotICAgICAgUHlPYmplY3QqIHNldHJldDsKLSNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotICAgICAgLy8gaGFjayBuZWVkZWQgZm9yIG9sZGVyIHZlcnNpb25zCi0gICAgICBzZXRyZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCopJlB5U2V0X1R5cGUsIHJldCwgTlVMTCk7Ci0jZWxzZQotICAgICAgLy8gb2ZmaWNpYWwgdmVyc2lvbgotICAgICAgc2V0cmV0ID0gUHlTZXRfTmV3KHJldCk7Ci0jZW5kaWYKLSAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgcmV0dXJuIHNldHJldDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIGNhc2UgVF9NQVA6IHsKLSAgICBpbnQzMl90IGxlbjsKLSAgICBpbnQgaTsKLSAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotCi0gICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIWNoZWNrVHlwZUJ5dGUoaW5wdXQsIHBhcnNlZGFyZ3Mua3RhZykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIWNoZWNrVHlwZUJ5dGUoaW5wdXQsIHBhcnNlZGFyZ3MudnRhZykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlEaWN0X05ldygpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgUHlPYmplY3QqIGsgPSBOVUxMOwotICAgICAgUHlPYmplY3QqIHYgPSBOVUxMOwotICAgICAgayA9IGRlY29kZV92YWwoaW5wdXQsIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpOwotICAgICAgaWYgKGsgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGxvb3BfZXJyb3I7Ci0gICAgICB9Ci0gICAgICB2ID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy52dGFnLCBwYXJzZWRhcmdzLnZ0eXBlYXJncyk7Ci0gICAgICBpZiAodiA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLSAgICAgIGlmIChQeURpY3RfU2V0SXRlbShyZXQsIGssIHYpID09IC0xKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLQotICAgICAgUHlfREVDUkVGKGspOwotICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgY29udGludWU7Ci0KLSAgICAgIC8vIFl1Y2shICBEZXN0cnVjdG9ycywgYW55b25lPwotICAgICAgbG9vcF9lcnJvcjoKLSAgICAgIFB5X1hERUNSRUYoayk7Ci0gICAgICBQeV9YREVDUkVGKHYpOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotCi0gICAgZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihyZXQpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY2FzZSBUX1NUUlVDVDogewotICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBQeU9iamVjdCogcmV0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChwYXJzZWRhcmdzLmtsYXNzLCBOVUxMKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCFkZWNvZGVfc3RydWN0KGlucHV0LCByZXQsIHBhcnNlZGFyZ3Muc3BlYykpIHsKLSAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLQotLyogLS0tIFRPUC1MRVZFTCBXUkFQUEVSIEZPUiBJTlBVVCAtLSAqLwotCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfYmluYXJ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICBQeU9iamVjdCogb3V0cHV0X29iaiA9IE5VTEw7Ci0gIFB5T2JqZWN0KiB0cmFuc3BvcnQgPSBOVUxMOwotICBQeU9iamVjdCogdHlwZWFyZ3MgPSBOVUxMOwotICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICBEZWNvZGVCdWZmZXIgaW5wdXQgPSB7fTsKLQotICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTyIsICZvdXRwdXRfb2JqLCAmdHJhbnNwb3J0LCAmdHlwZWFyZ3MpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICghZGVjb2RlX2J1ZmZlcl9mcm9tX29iaigmaW5wdXQsIHRyYW5zcG9ydCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICghZGVjb2RlX3N0cnVjdCgmaW5wdXQsIG91dHB1dF9vYmosIHBhcnNlZGFyZ3Muc3BlYykpIHsKLSAgICBmcmVlX2RlY29kZWJ1ZigmaW5wdXQpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZnJlZV9kZWNvZGVidWYoJmlucHV0KTsKLQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotLyogPT09PT09IEVORCBSRUFESU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotCi0vKiAtLSBQWVRIT04gTU9EVUxFIFNFVFVQIFNUVUZGIC0tLSAqLwotCi1zdGF0aWMgUHlNZXRob2REZWYgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHNbXSA9IHsKLQotICB7ImVuY29kZV9iaW5hcnkiLCAgZW5jb2RlX2JpbmFyeSwgTUVUSF9WQVJBUkdTLCAiIn0sCi0gIHsiZGVjb2RlX2JpbmFyeSIsICBkZWNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKLQotICB7TlVMTCwgTlVMTCwgMCwgTlVMTH0gICAgICAgIC8qIFNlbnRpbmVsICovCi19OwotCi1QeU1PRElOSVRfRlVOQwotaW5pdGZhc3RiaW5hcnkodm9pZCkgewotI2RlZmluZSBJTklUX0lOVEVSTl9TVFJJTkcodmFsdWUpIFwKLSAgZG8geyBcCi0gICAgSU5URVJOX1NUUklORyh2YWx1ZSkgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCN2YWx1ZSk7IFwKLSAgICBpZighSU5URVJOX1NUUklORyh2YWx1ZSkpIHJldHVybjsgXAotICB9IHdoaWxlKDApCi0KLSAgSU5JVF9JTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOwotICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7Ci0jdW5kZWYgSU5JVF9JTlRFUk5fU1RSSU5HCi0KLSAgUHljU3RyaW5nX0lNUE9SVDsKLSAgaWYgKFB5Y1N0cmluZ0lPID09IE5VTEwpIHJldHVybjsKLQotICAodm9pZCkgUHlfSW5pdE1vZHVsZSgidGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnkiLCBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kcyk7Ci19CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5CmluZGV4IDIxZmMzMTQuLjg1Y2Y0MDAgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5CisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5CkBAIC0xNyw0NyArMTcsOTAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBCYXNlSFRUUFNlcnZlcgoraW1wb3J0IHNzbAorCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKIAogZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIAorCitjbGFzcyBSZXNwb25zZUV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICIiIkFsbG93cyBoYW5kbGVycyB0byBvdmVycmlkZSB0aGUgSFRUUCByZXNwb25zZQorCisgICAgTm9ybWFsbHksIFRIdHRwU2VydmVyIGFsd2F5cyBzZW5kcyBhIDIwMCByZXNwb25zZS4gIElmIGEgaGFuZGxlciB3YW50cworICAgIHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgKGUuZy4sIHRvIHNpbXVsYXRlIGEgbWlzY29uZmlndXJlZCBvcgorICAgIG92ZXJsb2FkZWQgd2ViIHNlcnZlciBkdXJpbmcgdGVzdGluZyksIGl0IGNhbiByYWlzZSBhIFJlc3BvbnNlRXhjZXB0aW9uLgorICAgIFRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlCisgICAgUmVxdWVzdEhhbmRsZXIgYXMgaXRzIG9ubHkgYXJndW1lbnQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBoYW5kbGVyCisKKwogY2xhc3MgVEh0dHBTZXJ2ZXIoVFNlcnZlci5UU2VydmVyKToKLSAgIiIiQSBzaW1wbGUgSFRUUC1iYXNlZCBUaHJpZnQgc2VydmVyCisgICAgIiIiQSBzaW1wbGUgSFRUUC1iYXNlZCBUaHJpZnQgc2VydmVyCiAKLSAgVGhpcyBjbGFzcyBpcyBub3QgdmVyeSBwZXJmb3JtYW50LCBidXQgaXQgaXMgdXNlZnVsIChmb3IgZXhhbXBsZSkgZm9yCi0gIGFjdGluZyBhcyBhIG1vY2sgdmVyc2lvbiBvZiBhbiBBcGFjaGUtYmFzZWQgUEhQIFRocmlmdCBlbmRwb2ludC4iIiIKKyAgICBUaGlzIGNsYXNzIGlzIG5vdCB2ZXJ5IHBlcmZvcm1hbnQsIGJ1dCBpdCBpcyB1c2VmdWwgKGZvciBleGFtcGxlKSBmb3IKKyAgICBhY3RpbmcgYXMgYSBtb2NrIHZlcnNpb24gb2YgYW4gQXBhY2hlLWJhc2VkIFBIUCBUaHJpZnQgZW5kcG9pbnQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgc2VydmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgc2VydmVyX2NsYXNzPUJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICoqa3dhcmdzKToKKyAgICAgICAgIiIiU2V0IHVwIHByb3RvY29sIGZhY3RvcmllcyBhbmQgSFRUUCAob3IgSFRUUFMpIHNlcnZlci4KIAotICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBzZXJ2ZXJfYWRkcmVzcywKLSAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBOb25lKToKLSAgICAiIiJTZXQgdXAgcHJvdG9jb2wgZmFjdG9yaWVzIGFuZCBIVFRQIHNlcnZlci4KKyAgICAgICAgU2VlIEJhc2VIVFRQU2VydmVyIGZvciBzZXJ2ZXJfYWRkcmVzcy4KKyAgICAgICAgU2VlIFRTZXJ2ZXIgZm9yIHByb3RvY29sIGZhY3Rvcmllcy4KIAotICAgIFNlZSBCYXNlSFRUUFNlcnZlciBmb3Igc2VydmVyX2FkZHJlc3MuCi0gICAgU2VlIFRTZXJ2ZXIgZm9yIHByb3RvY29sIGZhY3Rvcmllcy4iIiIKKyAgICAgICAgVG8gbWFrZSBhIHNlY3VyZSBzZXJ2ZXIsIHByb3ZpZGUgdGhlIG5hbWVkIGFyZ3VtZW50czoKKyAgICAgICAgKiBjYWZpbGUgICAgLSB0byB2YWxpZGF0ZSBjbGllbnRzIFtvcHRpb25hbF0KKyAgICAgICAgKiBjZXJ0X2ZpbGUgLSB0aGUgc2VydmVyIGNlcnQKKyAgICAgICAgKiBrZXlfZmlsZSAgLSB0aGUgc2VydmVyJ3Mga2V5CisgICAgICAgICIiIgorICAgICAgICBpZiBvdXRwdXRQcm90b2NvbEZhY3RvcnkgaXMgTm9uZToKKyAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CiAKLSAgICBpZiBvdXRwdXRQcm90b2NvbEZhY3RvcnkgaXMgTm9uZToKLSAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CisgICAgICAgIFRTZXJ2ZXIuVFNlcnZlci5fX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIE5vbmUsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQogCi0gICAgVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSwgTm9uZSwgTm9uZSwKLSAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgdGh0dHBzZXJ2ZXIgPSBzZWxmCiAKLSAgICB0aHR0cHNlcnZlciA9IHNlbGYKKyAgICAgICAgY2xhc3MgUmVxdWVzdEhhbmRlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgorICAgICAgICAgICAgICAgICMgRG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVxdWVzdCBwYXRoLgorICAgICAgICAgICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEZpbGVPYmplY3RUcmFuc3BvcnQoc2VsZi5yZmlsZSkKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRGaWxlT2JqZWN0VHJhbnNwb3J0KHNlbGYud2ZpbGUpCisgICAgICAgICAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgIGl0cmFucywgaW50KHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSkpCisgICAgICAgICAgICAgICAgb3RyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgICAgICAgICBpcHJvdCA9IHRodHRwc2VydmVyLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKKyAgICAgICAgICAgICAgICBvcHJvdCA9IHRodHRwc2VydmVyLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0aHR0cHNlcnZlci5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgICAgICAgICAgZXhjZXB0IFJlc3BvbnNlRXhjZXB0aW9uIGFzIGV4bjoKKyAgICAgICAgICAgICAgICAgICAgZXhuLmhhbmRsZXIoc2VsZikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJjb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShvdHJhbnMuZ2V0dmFsdWUoKSkKIAotICAgIGNsYXNzIFJlcXVlc3RIYW5kZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6Ci0gICAgICBkZWYgZG9fUE9TVChzZWxmKToKLSAgICAgICAgIyBEb24ndCBjYXJlIGFib3V0IHRoZSByZXF1ZXN0IHBhdGguCi0gICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCi0gICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoImNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCi0gICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICBzZWxmLmh0dHBkID0gc2VydmVyX2NsYXNzKHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGVyKQogCi0gICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEZpbGVPYmplY3RUcmFuc3BvcnQoc2VsZi5yZmlsZSkKLSAgICAgICAgb3RyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLndmaWxlKQotICAgICAgICBpcHJvdCA9IHRodHRwc2VydmVyLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICAgICAgb3Byb3QgPSB0aHR0cHNlcnZlci5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotICAgICAgICB0aHR0cHNlcnZlci5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICAgIG90cmFucy5mbHVzaCgpCisgICAgICAgIGlmIChrd2FyZ3MuZ2V0KCdjYWZpbGUnKSBvciBrd2FyZ3MuZ2V0KCdjZXJ0X2ZpbGUnKSBvciBrd2FyZ3MuZ2V0KCdrZXlfZmlsZScpKToKKyAgICAgICAgICAgIGNvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChjYWZpbGU9a3dhcmdzLmdldCgnY2FmaWxlJykpCisgICAgICAgICAgICBjb250ZXh0LmNoZWNrX2hvc3RuYW1lID0gRmFsc2UKKyAgICAgICAgICAgIGNvbnRleHQubG9hZF9jZXJ0X2NoYWluKGt3YXJncy5nZXQoJ2NlcnRfZmlsZScpLCBrd2FyZ3MuZ2V0KCdrZXlfZmlsZScpKQorICAgICAgICAgICAgY29udGV4dC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVEIGlmIGt3YXJncy5nZXQoJ2NhZmlsZScpIGVsc2Ugc3NsLkNFUlRfTk9ORQorICAgICAgICAgICAgc2VsZi5odHRwZC5zb2NrZXQgPSBjb250ZXh0LndyYXBfc29ja2V0KHNlbGYuaHR0cGQuc29ja2V0LCBzZXJ2ZXJfc2lkZT1UcnVlKQogCi0gICAgc2VsZi5odHRwZCA9IEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIoc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kZXIpCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBzZWxmLmh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBzZWxmLmh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgc2VsZi5odHRwZC5zb2NrZXQuY2xvc2UoKQorICAgICAgICAjIHNlbGYuaHR0cGQuc2h1dGRvd24oKSAjIGhhbmdzIGZvcmV2ZXIsIHB5dGhvbiBkb2Vzbid0IGhhbmRsZSBQT0xMTlZBTCBwcm9wZXJseSEKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weQppbmRleCBlYTM0OGEwLi5mNjJkNDg2IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5CkBAIC0xOCwyNSArMTgsMzMgQEAKICMKICIiIkltcGxlbWVudGF0aW9uIG9mIG5vbi1ibG9ja2luZyBzZXJ2ZXIuCiAKLVRoZSBtYWluIGlkZWEgb2YgdGhlIHNlcnZlciBpcyByZWNpdmluZyBhbmQgc2VuZGluZyByZXF1ZXN0cwotb25seSBmcm9tIG1haW4gdGhyZWFkLgorVGhlIG1haW4gaWRlYSBvZiB0aGUgc2VydmVyIGlzIHRvIHJlY2VpdmUgYW5kIHNlbmQgcmVxdWVzdHMKK29ubHkgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCiAKLUl0IGFsc28gbWFrZXMgdGhyZWFkIHBvb2wgc2VydmVyIGluIHRhc2tzIHRlcm1zLCBub3QgY29ubmVjdGlvbnMuCitUaGUgdGhyZWFkIHBvb29sIHNob3VsZCBiZSBzaXplZCBmb3IgY29uY3VycmVudCB0YXNrcywgbm90CittYXhpbXVtIGNvbm5lY3Rpb25zCiAiIiIKLWltcG9ydCB0aHJlYWRpbmcKLWltcG9ydCBzb2NrZXQKLWltcG9ydCBRdWV1ZQotaW1wb3J0IHNlbGVjdAotaW1wb3J0IHN0cnVjdAorCiBpbXBvcnQgbG9nZ2luZworaW1wb3J0IHNlbGVjdAoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN0cnVjdAoraW1wb3J0IHRocmVhZGluZworCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZnJvbSBzaXgubW92ZXMgaW1wb3J0IHF1ZXVlCiAKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5CiAKIF9fYWxsX18gPSBbJ1ROb25ibG9ja2luZ1NlcnZlciddCiAKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCisKIGNsYXNzIFdvcmtlcih0aHJlYWRpbmcuVGhyZWFkKToKICAgICAiIiJXb3JrZXIgaXMgYSBzbWFsbCBoZWxwZXIgdG8gcHJvY2VzcyBpbmNvbWluZyBjb25uZWN0aW9uLiIiIgorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHF1ZXVlKToKICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQogICAgICAgICBzZWxmLnF1ZXVlID0gcXVldWUKQEAgLTUxLDggKzU5LDkgQEAKICAgICAgICAgICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCiAgICAgICAgICAgICAgICAgY2FsbGJhY2soVHJ1ZSwgb3RyYW5zLmdldHZhbHVlKCkpCiAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IikKLSAgICAgICAgICAgICAgICBjYWxsYmFjayhGYWxzZSwgJycpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVxdWVzdCIsIGV4Y19pbmZvPVRydWUpCisgICAgICAgICAgICAgICAgY2FsbGJhY2soRmFsc2UsIGInJykKKwogCiBXQUlUX0xFTiA9IDAKIFdBSVRfTUVTU0FHRSA9IDEKQEAgLTYwLDggKzY5LDkgQEAKIFNFTkRfQU5TV0VSID0gMwogQ0xPU0VEID0gNAogCisKIGRlZiBsb2NrZWQoZnVuYyk6Ci0gICAgIkRlY29yYXRvciB3aGljaCBsb2NrcyBzZWxmLmxvY2suIgorICAgICIiIkRlY29yYXRvciB3aGljaCBsb2NrcyBzZWxmLmxvY2suIiIiCiAgICAgZGVmIG5lc3RlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICBzZWxmLmxvY2suYWNxdWlyZSgpCiAgICAgICAgIHRyeToKQEAgLTcwLDI1ICs4MCw0MCBAQAogICAgICAgICAgICAgc2VsZi5sb2NrLnJlbGVhc2UoKQogICAgIHJldHVybiBuZXN0ZWQKIAorCiBkZWYgc29ja2V0X2V4Y2VwdGlvbihmdW5jKToKLSAgICAiRGVjb3JhdG9yIGNsb3NlIG9iamVjdCBvbiBzb2NrZXQuZXJyb3IuIgorICAgICIiIkRlY29yYXRvciBjbG9zZSBvYmplY3Qgb24gc29ja2V0LmVycm9yLiIiIgogICAgIGRlZiByZWFkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnaWdub3Jpbmcgc29ja2V0IGV4Y2VwdGlvbicsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICByZXR1cm4gcmVhZAogCi1jbGFzcyBDb25uZWN0aW9uOgorCitjbGFzcyBNZXNzYWdlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mZnNldCwgbGVuXywgaGVhZGVyKToKKyAgICAgICAgc2VsZi5vZmZzZXQgPSBvZmZzZXQKKyAgICAgICAgc2VsZi5sZW4gPSBsZW5fCisgICAgICAgIHNlbGYuYnVmZmVyID0gTm9uZQorICAgICAgICBzZWxmLmlzX2hlYWRlciA9IGhlYWRlcgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub2Zmc2V0ICsgc2VsZi5sZW4KKworCitjbGFzcyBDb25uZWN0aW9uKG9iamVjdCk6CiAgICAgIiIiQmFzaWMgY2xhc3MgaXMgcmVwcmVzZW50ZWQgY29ubmVjdGlvbi4KLSAgICAKKwogICAgIEl0IGNhbiBiZSBpbiBzdGF0ZToKICAgICAgICAgV0FJVF9MRU4gLS0tIGNvbm5lY3Rpb24gaXMgcmVhZGluZyByZXF1ZXN0IGxlbi4KICAgICAgICAgV0FJVF9NRVNTQUdFIC0tLSBjb25uZWN0aW9uIGlzIHJlYWRpbmcgcmVxdWVzdC4KLSAgICAgICAgV0FJVF9QUk9DRVNTIC0tLSBjb25uZWN0aW9uIGhhcyBqdXN0IHJlYWQgd2hvbGUgcmVxdWVzdCBhbmQgCi0gICAgICAgICAgICB3YWl0cyBmb3IgY2FsbCByZWFkeSByb3V0aW5lLgorICAgICAgICBXQUlUX1BST0NFU1MgLS0tIGNvbm5lY3Rpb24gaGFzIGp1c3QgcmVhZCB3aG9sZSByZXF1ZXN0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzIGZvciBjYWxsIHJlYWR5IHJvdXRpbmUuCiAgICAgICAgIFNFTkRfQU5TV0VSIC0tLSBjb25uZWN0aW9uIGlzIHNlbmRpbmcgYW5zd2VyIHN0cmluZyAoaW5jbHVkaW5nIGxlbmd0aAotICAgICAgICAgICAgb2YgYW5zd2VyKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG9mIGFuc3dlcikuCiAgICAgICAgIENMT1NFRCAtLS0gc29ja2V0IHdhcyBjbG9zZWQgYW5kIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGRlbGV0ZWQuCiAgICAgIiIiCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5ld19zb2NrZXQsIHdha2VfdXApOgpAQCAtOTYsODAgKzEyMSw3MiBAQAogICAgICAgICBzZWxmLnNvY2tldC5zZXRibG9ja2luZyhGYWxzZSkKICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX0xFTgogICAgICAgICBzZWxmLmxlbiA9IDAKLSAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgc2VsZi5yZWNlaXZlZCA9IGRlcXVlKCkKKyAgICAgICAgc2VsZi5fcmVhZGluZyA9IE1lc3NhZ2UoMCwgNCwgVHJ1ZSkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IGInJworICAgICAgICBzZWxmLl93YnVmID0gYicnCiAgICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICAgc2VsZi53YWtlX3VwID0gd2FrZV91cAotCi0gICAgZGVmIF9yZWFkX2xlbihzZWxmKToKLSAgICAgICAgIiIiUmVhZHMgbGVuZ3RoIG9mIHJlcXVlc3QuCi0gICAgICAgIAotICAgICAgICBJdCdzIHJlYWxseSBwYXJhbm9pYyByb3V0aW5lIGFuZCBpdCBtYXkgYmUgcmVwbGFjZWQgYnkgCi0gICAgICAgIHNlbGYuc29ja2V0LnJlY3YoNCkuIiIiCi0gICAgICAgIHJlYWQgPSBzZWxmLnNvY2tldC5yZWN2KDQgLSBsZW4oc2VsZi5tZXNzYWdlKSkKLSAgICAgICAgaWYgbGVuKHJlYWQpID09IDA6Ci0gICAgICAgICAgICAjIGlmIHdlIHJlYWQgMCBieXRlcyBhbmQgc2VsZi5tZXNzYWdlIGlzIGVtcHR5LCBpdCBtZWFucyBjbGllbnQgY2xvc2UgCi0gICAgICAgICAgICAjIGNvbm5lY3Rpb24KLSAgICAgICAgICAgIGlmIGxlbihzZWxmLm1lc3NhZ2UpICE9IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiY2FuJ3QgcmVhZCBmcmFtZSBzaXplIGZyb20gc29ja2V0IikKLSAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubWVzc2FnZSArPSByZWFkCi0gICAgICAgIGlmIGxlbihzZWxmLm1lc3NhZ2UpID09IDQ6Ci0gICAgICAgICAgICBzZWxmLmxlbiwgPSBzdHJ1Y3QudW5wYWNrKCchaScsIHNlbGYubWVzc2FnZSkKLSAgICAgICAgICAgIGlmIHNlbGYubGVuIDwgMDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJuZWdhdGl2ZSBmcmFtZSBzaXplLCBpdCBzZWVtcyBjbGllbnQiXAotICAgICAgICAgICAgICAgICAgICAiIGRvZXNuJ3QgdXNlIEZyYW1lZFRyYW5zcG9ydCIpCi0gICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICBlbGlmIHNlbGYubGVuID09IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5lcnJvcigiZW1wdHkgZnJhbWUsIGl0J3MgcmVhbGx5IHN0cmFuZ2UiKQotICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSAnJwotICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9NRVNTQUdFCisgICAgICAgIHNlbGYucmVtYWluaW5nID0gRmFsc2UKIAogICAgIEBzb2NrZXRfZXhjZXB0aW9uCiAgICAgZGVmIHJlYWQoc2VsZik6CiAgICAgICAgICIiIlJlYWRzIGRhdGEgZnJvbSBzdHJlYW0gYW5kIHN3aXRjaCBzdGF0ZS4iIiIKICAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdHVzIGluIChXQUlUX0xFTiwgV0FJVF9NRVNTQUdFKQotICAgICAgICBpZiBzZWxmLnN0YXR1cyA9PSBXQUlUX0xFTjoKLSAgICAgICAgICAgIHNlbGYuX3JlYWRfbGVuKCkKLSAgICAgICAgICAgICMgZ28gYmFjayB0byB0aGUgbWFpbiBsb29wIGhlcmUgZm9yIHNpbXBsaWNpdHkgaW5zdGVhZCBvZgotICAgICAgICAgICAgIyBmYWxsaW5nIHRocm91Z2gsIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGEgZ29vZCBjaGFuY2UgdGhhdAotICAgICAgICAgICAgIyB0aGUgbWVzc2FnZSBpcyBhbHJlYWR5IGF2YWlsYWJsZQotICAgICAgICBlbGlmIHNlbGYuc3RhdHVzID09IFdBSVRfTUVTU0FHRToKLSAgICAgICAgICAgIHJlYWQgPSBzZWxmLnNvY2tldC5yZWN2KHNlbGYubGVuIC0gbGVuKHNlbGYubWVzc2FnZSkpCi0gICAgICAgICAgICBpZiBsZW4ocmVhZCkgPT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJjYW4ndCByZWFkIGZyYW1lIGZyb20gc29ja2V0IChnZXQgJWQgb2YgJWQgYnl0ZXMpIiAlCi0gICAgICAgICAgICAgICAgICAgIChsZW4oc2VsZi5tZXNzYWdlKSwgc2VsZi5sZW4pKQorICAgICAgICBhc3NlcnQgbm90IHNlbGYucmVjZWl2ZWQKKyAgICAgICAgYnVmX3NpemUgPSA4MTkyCisgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICBkb25lID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IGRvbmU6CisgICAgICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdihidWZfc2l6ZSkKKyAgICAgICAgICAgIHJsZW4gPSBsZW4ocmVhZCkKKyAgICAgICAgICAgIGRvbmUgPSBybGVuIDwgYnVmX3NpemUKKyAgICAgICAgICAgIHNlbGYuX3JidWYgKz0gcmVhZAorICAgICAgICAgICAgaWYgZmlyc3QgYW5kIHJsZW4gPT0gMDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0YXR1cyAhPSBXQUlUX0xFTiBvciBzZWxmLl9yYnVmOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ2NvdWxkIG5vdCByZWFkIGZyYW1lIGZyb20gc29ja2V0JykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ3JlYWQgemVybyBsZW5ndGguIGNsaWVudCBtaWdodCBoYXZlIGRpc2Nvbm5lY3RlZCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgKz0gcmVhZAotICAgICAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgPT0gc2VsZi5sZW46CisgICAgICAgICAgICB3aGlsZSBsZW4oc2VsZi5fcmJ1ZikgPj0gc2VsZi5fcmVhZGluZy5lbmQ6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fcmVhZGluZy5pc19oZWFkZXI6CisgICAgICAgICAgICAgICAgICAgIG1sZW4sID0gc3RydWN0LnVucGFjaygnIWknLCBzZWxmLl9yYnVmWzo0XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZGluZyA9IE1lc3NhZ2Uoc2VsZi5fcmVhZGluZy5lbmQsIG1sZW4sIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTUVTU0FHRQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcuYnVmZmVyID0gc2VsZi5fcmJ1ZgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY2VpdmVkLmFwcGVuZChzZWxmLl9yZWFkaW5nKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yYnVmID0gc2VsZi5fcmJ1ZltzZWxmLl9yZWFkaW5nLmVuZDpdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKDAsIDQsIFRydWUpCisgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICBpZiBzZWxmLnJlY2VpdmVkOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9QUk9DRVNTCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5yZW1haW5pbmcgPSBub3QgZG9uZQogCiAgICAgQHNvY2tldF9leGNlcHRpb24KICAgICBkZWYgd3JpdGUoc2VsZik6CiAgICAgICAgICIiIldyaXRlcyBkYXRhIGZyb20gc29ja2V0IGFuZCBzd2l0Y2ggc3RhdGUuIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBTRU5EX0FOU1dFUgotICAgICAgICBzZW50ID0gc2VsZi5zb2NrZXQuc2VuZChzZWxmLm1lc3NhZ2UpCi0gICAgICAgIGlmIHNlbnQgPT0gbGVuKHNlbGYubWVzc2FnZSk6CisgICAgICAgIHNlbnQgPSBzZWxmLnNvY2tldC5zZW5kKHNlbGYuX3didWYpCisgICAgICAgIGlmIHNlbnQgPT0gbGVuKHNlbGYuX3didWYpOgogICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX0xFTgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgICAgIHNlbGYubGVuID0gMAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gc2VsZi5tZXNzYWdlW3NlbnQ6XQorICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IHNlbGYuX3didWZbc2VudDpdCiAKICAgICBAbG9ja2VkCiAgICAgZGVmIHJlYWR5KHNlbGYsIGFsbF9vaywgbWVzc2FnZSk6CiAgICAgICAgICIiIkNhbGxiYWNrIGZ1bmN0aW9uIGZvciBzd2l0Y2hpbmcgc3RhdGUgYW5kIHdha2luZyB1cCBtYWluIHRocmVhZC4KLSAgICAgICAgCisKICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgb25seSBmdW5jdGlvbiB3aXRjaCBjYW4gYmUgY2FsbGVkIGFzeW5jaHJvbm91cy4KLSAgICAgICAgCisKICAgICAgICAgVGhlIHJlYWR5IGNhbiBzd2l0Y2ggQ29ubmVjdGlvbiB0byB0aHJlZSBzdGF0ZXM6CiAgICAgICAgICAgICBXQUlUX0xFTiBpZiByZXF1ZXN0IHdhcyBvbmV3YXkuCiAgICAgICAgICAgICBTRU5EX0FOU1dFUiBpZiByZXF1ZXN0IHdhcyBwcm9jZXNzZWQgaW4gbm9ybWFsIHdheS4KICAgICAgICAgICAgIENMT1NFRCBpZiByZXF1ZXN0IHRocm93cyB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4KLSAgICAgICAgCisKICAgICAgICAgVGhlIG9uZSB3YWtlcyB1cCBtYWluIHRocmVhZC4KICAgICAgICAgIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBXQUlUX1BST0NFU1MKQEAgLTE3Nyw2NSArMTk0LDc0IEBACiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAgICAgIHNlbGYud2FrZV91cCgpCiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5sZW4gPSAnJworICAgICAgICBzZWxmLmxlbiA9IDAKICAgICAgICAgaWYgbGVuKG1lc3NhZ2UpID09IDA6CiAgICAgICAgICAgICAjIGl0IHdhcyBhIG9uZXdheSByZXF1ZXN0LCBkbyBub3Qgd3JpdGUgYW5zd2VyCi0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSAnJworICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IGInJwogICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX0xFTgogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gc3RydWN0LnBhY2soJyFpJywgbGVuKG1lc3NhZ2UpKSArIG1lc3NhZ2UKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBzdHJ1Y3QucGFjaygnIWknLCBsZW4obWVzc2FnZSkpICsgbWVzc2FnZQogICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBTRU5EX0FOU1dFUgogICAgICAgICBzZWxmLndha2VfdXAoKQogCiAgICAgQGxvY2tlZAogICAgIGRlZiBpc193cml0ZWFibGUoc2VsZik6Ci0gICAgICAgICJSZXR1cm5zIFRydWUgaWYgY29ubmVjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gd3JpdGUgbGlzdCBvZiBzZWxlY3QuIgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBjb25uZWN0aW9uIHNob3VsZCBiZSBhZGRlZCB0byB3cml0ZSBsaXN0IG9mIHNlbGVjdCIiIgogICAgICAgICByZXR1cm4gc2VsZi5zdGF0dXMgPT0gU0VORF9BTlNXRVIKIAogICAgICMgaXQncyBub3QgbmVjZXNzYXJ5LCBidXQuLi4KICAgICBAbG9ja2VkCiAgICAgZGVmIGlzX3JlYWRhYmxlKHNlbGYpOgotICAgICAgICAiUmV0dXJucyBUcnVlIGlmIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvIHJlYWQgbGlzdCBvZiBzZWxlY3QuIgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBjb25uZWN0aW9uIHNob3VsZCBiZSBhZGRlZCB0byByZWFkIGxpc3Qgb2Ygc2VsZWN0IiIiCiAgICAgICAgIHJldHVybiBzZWxmLnN0YXR1cyBpbiAoV0FJVF9MRU4sIFdBSVRfTUVTU0FHRSkKIAogICAgIEBsb2NrZWQKICAgICBkZWYgaXNfY2xvc2VkKHNlbGYpOgotICAgICAgICAiUmV0dXJucyBUcnVlIGlmIGNvbm5lY3Rpb24gaXMgY2xvc2VkLiIKKyAgICAgICAgIiIiUmV0dXJucyBUcnVlIGlmIGNvbm5lY3Rpb24gaXMgY2xvc2VkLiIiIgogICAgICAgICByZXR1cm4gc2VsZi5zdGF0dXMgPT0gQ0xPU0VECiAKICAgICBkZWYgZmlsZW5vKHNlbGYpOgotICAgICAgICAiUmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBhc3NvY2lhdGVkIHNvY2tldC4iCisgICAgICAgICIiIlJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgYXNzb2NpYXRlZCBzb2NrZXQuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5maWxlbm8oKQogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICAiQ2xvc2VzIGNvbm5lY3Rpb24iCisgICAgICAgICIiIkNsb3NlcyBjb25uZWN0aW9uIiIiCiAgICAgICAgIHNlbGYuc3RhdHVzID0gQ0xPU0VECiAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKIAotY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyOgorCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIob2JqZWN0KToKICAgICAiIiJOb24tYmxvY2tpbmcgc2VydmVyLiIiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGxzb2NrZXQsIGlucHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsIAotICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsIHRocmVhZHM9MTApOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgbHNvY2tldCwKKyAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgIHRocmVhZHM9MTApOgogICAgICAgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgogICAgICAgICBzZWxmLnNvY2tldCA9IGxzb2NrZXQKICAgICAgICAgc2VsZi5pbl9wcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5IG9yIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogICAgICAgICBzZWxmLm91dF9wcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeSBvciBzZWxmLmluX3Byb3RvY29sCiAgICAgICAgIHNlbGYudGhyZWFkcyA9IGludCh0aHJlYWRzKQogICAgICAgICBzZWxmLmNsaWVudHMgPSB7fQotICAgICAgICBzZWxmLnRhc2tzID0gUXVldWUuUXVldWUoKQorICAgICAgICBzZWxmLnRhc2tzID0gcXVldWUuUXVldWUoKQogICAgICAgICBzZWxmLl9yZWFkLCBzZWxmLl93cml0ZSA9IHNvY2tldC5zb2NrZXRwYWlyKCkKICAgICAgICAgc2VsZi5wcmVwYXJlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuX3N0b3AgPSBGYWxzZQogCiAgICAgZGVmIHNldE51bVRocmVhZHMoc2VsZiwgbnVtKToKICAgICAgICAgIiIiU2V0IHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZC4iIiIKICAgICAgICAgIyBpbXBsZW1lbnQgVGhyZWFkUG9vbCBpbnRlcmZhY2UKLSAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLnByZXBhcmVkLCAiWW91IGNhbid0IGNoYW5nZSBudW1iZXIgb2YgdGhyZWFkcyBmb3Igd29ya2luZyBzZXJ2ZXIiCisgICAgICAgIGFzc2VydCBub3Qgc2VsZi5wcmVwYXJlZCwgIkNhbid0IGNoYW5nZSBudW1iZXIgb2YgdGhyZWFkcyBhZnRlciBzdGFydCIKICAgICAgICAgc2VsZi50aHJlYWRzID0gbnVtCiAKICAgICBkZWYgcHJlcGFyZShzZWxmKToKICAgICAgICAgIiIiUHJlcGFyZXMgc2VydmVyIGZvciBzZXJ2ZSByZXF1ZXN0cy4iIiIKKyAgICAgICAgaWYgc2VsZi5wcmVwYXJlZDoKKyAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLnNvY2tldC5saXN0ZW4oKQotICAgICAgICBmb3IgXyBpbiB4cmFuZ2Uoc2VsZi50aHJlYWRzKToKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKICAgICAgICAgICAgIHRocmVhZCA9IFdvcmtlcihzZWxmLnRhc2tzKQogICAgICAgICAgICAgdGhyZWFkLnNldERhZW1vbihUcnVlKQogICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCkKQEAgLTI0Myw1MiArMjY5LDgyIEBACiAKICAgICBkZWYgd2FrZV91cChzZWxmKToKICAgICAgICAgIiIiV2FrZSB1cCBtYWluIHRocmVhZC4KLSAgICAgICAgCi0gICAgICAgIFRoZSBzZXJ2ZXIgdXN1YWx5IHdhaXRzIGluIHNlbGVjdCBjYWxsIGluIHdlIHNob3VsZCB0ZXJtaW5hdGUgb25lLgorCisgICAgICAgIFRoZSBzZXJ2ZXIgdXN1YWxseSB3YWl0cyBpbiBzZWxlY3QgY2FsbCBpbiB3ZSBzaG91bGQgdGVybWluYXRlIG9uZS4KICAgICAgICAgVGhlIHNpbXBsZXN0IHdheSBpcyB1c2luZyBzb2NrZXRwYWlyLgotICAgICAgICAKKwogICAgICAgICBTZWxlY3QgYWx3YXlzIHdhaXQgdG8gcmVhZCBmcm9tIHRoZSBmaXJzdCBzb2NrZXQgb2Ygc29ja2V0cGFpci4KLSAgICAgICAgCisKICAgICAgICAgSW4gdGhpcyBjYXNlLCB3ZSBjYW4ganVzdCB3cml0ZSBhbnl0aGluZyB0byB0aGUgc2Vjb25kIHNvY2tldCBmcm9tCi0gICAgICAgIHNvY2tldHBhaXIuIiIiCi0gICAgICAgIHNlbGYuX3dyaXRlLnNlbmQoJzEnKQorICAgICAgICBzb2NrZXRwYWlyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fd3JpdGUuc2VuZChiJzEnKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgICIiIlN0b3AgdGhlIHNlcnZlci4KKworICAgICAgICBUaGlzIG1ldGhvZCBjYXVzZXMgdGhlIHNlcnZlKCkgbWV0aG9kIHRvIHJldHVybi4gIHN0b3AoKSBtYXkgYmUgaW52b2tlZAorICAgICAgICBmcm9tIHdpdGhpbiB5b3VyIGhhbmRsZXIsIG9yIGZyb20gYW5vdGhlciB0aHJlYWQuCisKKyAgICAgICAgQWZ0ZXIgc3RvcCgpIGlzIGNhbGxlZCwgc2VydmUoKSB3aWxsIHJldHVybiBidXQgdGhlIHNlcnZlciB3aWxsIHN0aWxsCisgICAgICAgIGJlIGxpc3RlbmluZyBvbiB0aGUgc29ja2V0LiAgc2VydmUoKSBtYXkgdGhlbiBiZSBjYWxsZWQgYWdhaW4gdG8gcmVzdW1lCisgICAgICAgIHByb2Nlc3NpbmcgcmVxdWVzdHMuICBBbHRlcm5hdGl2ZWx5LCBjbG9zZSgpIG1heSBiZSBjYWxsZWQgYWZ0ZXIKKyAgICAgICAgc2VydmUoKSByZXR1cm5zIHRvIGNsb3NlIHRoZSBzZXJ2ZXIgc29ja2V0IGFuZCBzaHV0ZG93biBhbGwgd29ya2VyCisgICAgICAgIHRocmVhZHMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9zdG9wID0gVHJ1ZQorICAgICAgICBzZWxmLndha2VfdXAoKQogCiAgICAgZGVmIF9zZWxlY3Qoc2VsZik6CiAgICAgICAgICIiIkRvZXMgc2VsZWN0IG9uIG9wZW4gY29ubmVjdGlvbnMuIiIiCiAgICAgICAgIHJlYWRhYmxlID0gW3NlbGYuc29ja2V0LmhhbmRsZS5maWxlbm8oKSwgc2VsZi5fcmVhZC5maWxlbm8oKV0KICAgICAgICAgd3JpdGFibGUgPSBbXQotICAgICAgICBmb3IgaSwgY29ubmVjdGlvbiBpbiBzZWxmLmNsaWVudHMuaXRlbXMoKToKKyAgICAgICAgcmVtYWluaW5nID0gW10KKyAgICAgICAgZm9yIGksIGNvbm5lY3Rpb24gaW4gbGlzdChzZWxmLmNsaWVudHMuaXRlbXMoKSk6CiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLmlzX3JlYWRhYmxlKCk6CiAgICAgICAgICAgICAgICAgcmVhZGFibGUuYXBwZW5kKGNvbm5lY3Rpb24uZmlsZW5vKCkpCisgICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5yZW1haW5pbmcgb3IgY29ubmVjdGlvbi5yZWNlaXZlZDoKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLmFwcGVuZChjb25uZWN0aW9uLmZpbGVubygpKQogICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5pc193cml0ZWFibGUoKToKICAgICAgICAgICAgICAgICB3cml0YWJsZS5hcHBlbmQoY29ubmVjdGlvbi5maWxlbm8oKSkKICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uaXNfY2xvc2VkKCk6CiAgICAgICAgICAgICAgICAgZGVsIHNlbGYuY2xpZW50c1tpXQotICAgICAgICByZXR1cm4gc2VsZWN0LnNlbGVjdChyZWFkYWJsZSwgd3JpdGFibGUsIHJlYWRhYmxlKQotICAgICAgICAKKyAgICAgICAgaWYgcmVtYWluaW5nOgorICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZywgW10sIFtdLCBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QocmVhZGFibGUsIHdyaXRhYmxlLCByZWFkYWJsZSkgKyAoVHJ1ZSwpCisKICAgICBkZWYgaGFuZGxlKHNlbGYpOgogICAgICAgICAiIiJIYW5kbGUgcmVxdWVzdHMuCi0gICAgICAgCi0gICAgICAgIFdBUk5JTkchIFlvdSBtdXN0IGNhbGwgcHJlcGFyZSBCRUZPUkUgY2FsbGluZyBoYW5kbGUuCisKKyAgICAgICAgV0FSTklORyEgWW91IG11c3QgY2FsbCBwcmVwYXJlKCkgQkVGT1JFIGNhbGxpbmcgaGFuZGxlKCkKICAgICAgICAgIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnByZXBhcmVkLCAiWW91IGhhdmUgdG8gY2FsbCBwcmVwYXJlIGJlZm9yZSBoYW5kbGUiCi0gICAgICAgIHJzZXQsIHdzZXQsIHhzZXQgPSBzZWxmLl9zZWxlY3QoKQorICAgICAgICByc2V0LCB3c2V0LCB4c2V0LCBzZWxlY3RlZCA9IHNlbGYuX3NlbGVjdCgpCiAgICAgICAgIGZvciByZWFkYWJsZSBpbiByc2V0OgogICAgICAgICAgICAgaWYgcmVhZGFibGUgPT0gc2VsZi5fcmVhZC5maWxlbm8oKToKICAgICAgICAgICAgICAgICAjIGRvbid0IGNhcmUgaSBqdXN0IG5lZWQgdG8gY2xlYW4gcmVhZGFibGUgZmxhZwotICAgICAgICAgICAgICAgIHNlbGYuX3JlYWQucmVjdigxMDI0KSAKKyAgICAgICAgICAgICAgICBzZWxmLl9yZWFkLnJlY3YoMTAyNCkKICAgICAgICAgICAgIGVsaWYgcmVhZGFibGUgPT0gc2VsZi5zb2NrZXQuaGFuZGxlLmZpbGVubygpOgotICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc29ja2V0LmFjY2VwdCgpLmhhbmRsZQotICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50c1tjbGllbnQuZmlsZW5vKCldID0gQ29ubmVjdGlvbihjbGllbnQsIHNlbGYud2FrZV91cCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc29ja2V0LmFjY2VwdCgpCisgICAgICAgICAgICAgICAgICAgIGlmIGNsaWVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50c1tjbGllbnQuaGFuZGxlLmZpbGVubygpXSA9IENvbm5lY3Rpb24oY2xpZW50LmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53YWtlX3VwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnZXJyb3Igd2hpbGUgYWNjZXB0aW5nJywgZXhjX2luZm89VHJ1ZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IHNlbGYuY2xpZW50c1tyZWFkYWJsZV0KLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWQoKQotICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uc3RhdHVzID09IFdBSVRfUFJPQ0VTUzoKLSAgICAgICAgICAgICAgICAgICAgaXRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihjb25uZWN0aW9uLm1lc3NhZ2UpCisgICAgICAgICAgICAgICAgaWYgc2VsZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5yZWNlaXZlZDoKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zdGF0dXMgPSBXQUlUX1BST0NFU1MKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gY29ubmVjdGlvbi5yZWNlaXZlZC5wb3BsZWZ0KCkKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihtc2cuYnVmZmVyLCBtc2cub2Zmc2V0KQogICAgICAgICAgICAgICAgICAgICBvdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKICAgICAgICAgICAgICAgICAgICAgaXByb3QgPSBzZWxmLmluX3Byb3RvY29sLmdldFByb3RvY29sKGl0cmFuc3BvcnQpCiAgICAgICAgICAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRfcHJvdG9jb2wuZ2V0UHJvdG9jb2wob3RyYW5zcG9ydCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi50YXNrcy5wdXQoW3NlbGYucHJvY2Vzc29yLCBpcHJvdCwgb3Byb3QsIAorICAgICAgICAgICAgICAgICAgICBzZWxmLnRhc2tzLnB1dChbc2VsZi5wcm9jZXNzb3IsIGlwcm90LCBvcHJvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90cmFuc3BvcnQsIGNvbm5lY3Rpb24ucmVhZHldKQogICAgICAgICBmb3Igd3JpdGVhYmxlIGluIHdzZXQ6CiAgICAgICAgICAgICBzZWxmLmNsaWVudHNbd3JpdGVhYmxlXS53cml0ZSgpCkBAIC0yOTgsMTMgKzM1NCwxNyBAQAogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICAiIiJDbG9zZXMgdGhlIHNlcnZlci4iIiIKLSAgICAgICAgZm9yIF8gaW4geHJhbmdlKHNlbGYudGhyZWFkcyk6CisgICAgICAgIGZvciBfIGluIHJhbmdlKHNlbGYudGhyZWFkcyk6CiAgICAgICAgICAgICBzZWxmLnRhc2tzLnB1dChbTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZV0pCiAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKICAgICAgICAgc2VsZi5wcmVwYXJlZCA9IEZhbHNlCi0gICAgICAgIAorCiAgICAgZGVmIHNlcnZlKHNlbGYpOgotICAgICAgICAiIiJTZXJ2ZSBmb3JldmVyLiIiIgorICAgICAgICAiIiJTZXJ2ZSByZXF1ZXN0cy4KKworICAgICAgICBTZXJ2ZSByZXF1ZXN0cyBmb3JldmVyLCBvciB1bnRpbCBzdG9wKCkgaXMgY2FsbGVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fc3RvcCA9IEZhbHNlCiAgICAgICAgIHNlbGYucHJlcGFyZSgpCi0gICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9zdG9wOgogICAgICAgICAgICAgc2VsZi5oYW5kbGUoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmRjODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3NlcnZlci9UUHJvY2Vzc1Bvb2xTZXJ2ZXIucHkKQEAgLTAsMCArMSwxMjMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK2ltcG9ydCBsb2dnaW5nCisKK2Zyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQcm9jZXNzLCBWYWx1ZSwgQ29uZGl0aW9uCisKK2Zyb20gLlRTZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCisKK2NsYXNzIFRQcm9jZXNzUG9vbFNlcnZlcihUU2VydmVyKToKKyAgICAiIiJTZXJ2ZXIgd2l0aCBhIGZpeGVkIHNpemUgcG9vbCBvZiB3b3JrZXIgc3VicHJvY2Vzc2VzIHRvIHNlcnZpY2UgcmVxdWVzdHMKKworICAgIE5vdGUgdGhhdCBpZiB5b3UgbmVlZCBzaGFyZWQgc3RhdGUgYmV0d2VlbiB0aGUgaGFuZGxlcnMgLSBpdCdzIHVwIHRvIHlvdSEKKyAgICBXcml0dGVuIGJ5IER2aXIgVm9saywgZG9hdC5jb20KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICBzZWxmLm51bVdvcmtlcnMgPSAxMAorICAgICAgICBzZWxmLndvcmtlcnMgPSBbXQorICAgICAgICBzZWxmLmlzUnVubmluZyA9IFZhbHVlKCdiJywgRmFsc2UpCisgICAgICAgIHNlbGYuc3RvcENvbmRpdGlvbiA9IENvbmRpdGlvbigpCisgICAgICAgIHNlbGYucG9zdEZvcmtDYWxsYmFjayA9IE5vbmUKKworICAgIGRlZiBzZXRQb3N0Rm9ya0NhbGxiYWNrKHNlbGYsIGNhbGxiYWNrKToKKyAgICAgICAgaWYgbm90IGNhbGxhYmxlKGNhbGxiYWNrKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVGhpcyBpcyBub3QgYSBjYWxsYmFjayEiKQorICAgICAgICBzZWxmLnBvc3RGb3JrQ2FsbGJhY2sgPSBjYWxsYmFjaworCisgICAgZGVmIHNldE51bVdvcmtlcnMoc2VsZiwgbnVtKToKKyAgICAgICAgIiIiU2V0IHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCIiIgorICAgICAgICBzZWxmLm51bVdvcmtlcnMgPSBudW0KKworICAgIGRlZiB3b3JrZXJQcm9jZXNzKHNlbGYpOgorICAgICAgICAiIiJMb29wIGdldHRpbmcgY2xpZW50cyBmcm9tIHRoZSBzaGFyZWQgcXVldWUgYW5kIHByb2Nlc3MgdGhlbSIiIgorICAgICAgICBpZiBzZWxmLnBvc3RGb3JrQ2FsbGJhY2s6CisgICAgICAgICAgICBzZWxmLnBvc3RGb3JrQ2FsbGJhY2soKQorCisgICAgICAgIHdoaWxlIHNlbGYuaXNSdW5uaW5nLnZhbHVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlQ2xpZW50KGNsaWVudCkKKyAgICAgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgZGVmIHNlcnZlQ2xpZW50KHNlbGYsIGNsaWVudCk6CisgICAgICAgICIiIlByb2Nlc3MgaW5wdXQvb3V0cHV0IGZyb20gYSBjbGllbnQgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUiIiIKKyAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgb3RyYW5zLmNsb3NlKCkKKworICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgIiIiU3RhcnQgd29ya2VycyBhbmQgcHV0IGludG8gcXVldWUiIiIKKyAgICAgICAgIyB0aGlzIGlzIGEgc2hhcmVkIHN0YXRlIHRoYXQgY2FuIHRlbGwgdGhlIHdvcmtlcnMgdG8gZXhpdCB3aGVuIEZhbHNlCisgICAgICAgIHNlbGYuaXNSdW5uaW5nLnZhbHVlID0gVHJ1ZQorCisgICAgICAgICMgZmlyc3QgYmluZCBhbmQgbGlzdGVuIHRvIHRoZSBwb3J0CisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisKKyAgICAgICAgIyBmb3JrIHRoZSBjaGlsZHJlbgorICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLm51bVdvcmtlcnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHcgPSBQcm9jZXNzKHRhcmdldD1zZWxmLndvcmtlclByb2Nlc3MpCisgICAgICAgICAgICAgICAgdy5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICAgICAgdy5zdGFydCgpCisgICAgICAgICAgICAgICAgc2VsZi53b3JrZXJzLmFwcGVuZCh3KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgICAgICAjIHdhaXQgdW50aWwgdGhlIGNvbmRpdGlvbiBpcyBzZXQgYnkgc3RvcCgpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLnN0b3BDb25kaXRpb24uYWNxdWlyZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zdG9wQ29uZGl0aW9uLndhaXQoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgKFN5c3RlbUV4aXQsIEtleWJvYXJkSW50ZXJydXB0KToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgICAgICBzZWxmLmlzUnVubmluZy52YWx1ZSA9IEZhbHNlCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgc2VsZi5pc1J1bm5pbmcudmFsdWUgPSBGYWxzZQorICAgICAgICBzZWxmLnN0b3BDb25kaXRpb24uYWNxdWlyZSgpCisgICAgICAgIHNlbGYuc3RvcENvbmRpdGlvbi5ub3RpZnkoKQorICAgICAgICBzZWxmLnN0b3BDb25kaXRpb24ucmVsZWFzZSgpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weQppbmRleCA2MTUyOTExLi5kZjJhN2JiIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5CisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkKQEAgLTE3LDI1NCArMTcsMzA3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKIGltcG9ydCBsb2dnaW5nCi1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKLWltcG9ydCB0cmFjZWJhY2sKIGltcG9ydCB0aHJlYWRpbmcKLWltcG9ydCBRdWV1ZQogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEhlYWRlclByb3RvY29sIGltcG9ydCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIAotY2xhc3MgVFNlcnZlcjoKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCi0gICIiIkJhc2UgaW50ZXJmYWNlIGZvciBhIHNlcnZlciwgd2hpY2ggbXVzdCBoYXZlIGEgc2VydmUgbWV0aG9kLiIiIgogCi0gICIiIiAzIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHNlcnZlcnM6Ci0gIDEpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKLSAgMikgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCi0gIDMpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIiIiCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgaWYgKGxlbihhcmdzKSA9PSAyKToKLSAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQotICAgIGVsaWYgKGxlbihhcmdzKSA9PSA0KToKLSAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbM10pCi0gICAgZWxpZiAobGVuKGFyZ3MpID09IDYpOgotICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSkKK2NsYXNzIFRTZXJ2ZXIob2JqZWN0KToKKyAgICAiIiJCYXNlIGludGVyZmFjZSBmb3IgYSBzZXJ2ZXIsIHdoaWNoIG11c3QgaGF2ZSBhIHNlcnZlKCkgbWV0aG9kLgogCi0gIGRlZiBfX2luaXRBcmdzX18oc2VsZiwgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOgotICAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCi0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQKLSAgICBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeQotICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKLSAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeQorICAgIFRocmVlIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHNlcnZlcnM6CisgICAgMSkgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQorICAgIDIpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorICAgIDMpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIChsZW4oYXJncykgPT0gMik6CisgICAgICAgICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgZWxpZiAobGVuKGFyZ3MpID09IDQpOgorICAgICAgICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1szXSkKKyAgICAgICAgZWxpZiAobGVuKGFyZ3MpID09IDYpOgorICAgICAgICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBfX2luaXRBcmdzX18oc2VsZiwgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKKyAgICAgICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQKKyAgICAgICAgc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKworICAgICAgICBpbnB1dF9pc19oZWFkZXIgPSBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIG91dHB1dF9pc19oZWFkZXIgPSBpc2luc3RhbmNlKHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KQorICAgICAgICBpZiBhbnkoKGlucHV0X2lzX2hlYWRlciwgb3V0cHV0X2lzX2hlYWRlcikpIGFuZCBpbnB1dF9pc19oZWFkZXIgIT0gb3V0cHV0X2lzX2hlYWRlcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRIZWFkZXJQcm90b2NvbCBzZXJ2ZXJzIHJlcXVpcmUgdGhhdCBib3RoIHRoZSBpbnB1dCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IHByb3RvY29scyBhcmUgVEhlYWRlclByb3RvY29sLiIpCisKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHBhc3MKKwogCiBjbGFzcyBUU2ltcGxlU2VydmVyKFRTZXJ2ZXIpOgorICAgICIiIlNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyIHRoYXQganVzdCBwdW1wcyBhcm91bmQgb25lIHRyYW5zcG9ydC4iIiIKIAotICAiIiJTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciB0aGF0IGp1c3QgcHVtcHMgYXJvdW5kIG9uZSB0cmFuc3BvcnQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKIAotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCi0KLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCi0gICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICB0cnk6CisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQogICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6Ci0gICAgICAgIHBhc3MKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQogCi0gICAgICBpdHJhbnMuY2xvc2UoKQotICAgICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorCisgICAgICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sIGluc3RhbmNlIGZvcgorICAgICAgICAgICAgIyBpbnB1dCBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdAorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcyBpbi4KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgICAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgICAgICBvdHJhbnMuY2xvc2UoKQorCiAKIGNsYXNzIFRUaHJlYWRlZFNlcnZlcihUU2VydmVyKToKKyAgICAiIiJUaHJlYWRlZCBzZXJ2ZXIgdGhhdCBzcGF3bnMgYSBuZXcgdGhyZWFkIHBlciBlYWNoIGNvbm5lY3Rpb24uIiIiCiAKLSAgIiIiVGhyZWFkZWQgc2VydmVyIHRoYXQgc3Bhd25zIGEgbmV3IHRocmVhZCBwZXIgZWFjaCBjb25uZWN0aW9uLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICBzZWxmLmRhZW1vbiA9IGt3YXJncy5nZXQoImRhZW1vbiIsIEZhbHNlKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLmhhbmRsZSwgYXJncz0oY2xpZW50LCkpCisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0ID0gc2VsZi5oYW5kbGUsIGFyZ3M9KGNsaWVudCwpKQotICAgICAgICB0LnN0YXJ0KCkKLSAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcmFpc2UKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgZGVmIGhhbmRsZShzZWxmLCBjbGllbnQpOgorICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQogCi0gIGRlZiBoYW5kbGUoc2VsZiwgY2xpZW50KToKLSAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgdHJ5OgotICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6Ci0gICAgICBwYXNzCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgaW5zdGFuY2UgZm9yIGlucHV0CisgICAgICAgICMgYW5kIG91dHB1dCBzbyB0aGF0IHRoZSByZXNwb25zZSBpcyBpbiB0aGUgc2FtZSBkaWFsZWN0IHRoYXQgdGhlCisgICAgICAgICMgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcyBpbi4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgIG90cmFucyA9IE5vbmUKKyAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCiAKLSAgICBpdHJhbnMuY2xvc2UoKQotICAgIG90cmFucy5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgICAgICBpdHJhbnMuY2xvc2UoKQorICAgICAgICBpZiBvdHJhbnM6CisgICAgICAgICAgICBvdHJhbnMuY2xvc2UoKQorCiAKIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyKFRTZXJ2ZXIpOgorICAgICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHRocmVhZHMgd2hpY2ggc2VydmljZSByZXF1ZXN0cy4iIiIKIAotICAiIiJTZXJ2ZXIgd2l0aCBhIGZpeGVkIHNpemUgcG9vbCBvZiB0aHJlYWRzIHdoaWNoIHNlcnZpY2UgcmVxdWVzdHMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYuY2xpZW50cyA9IHF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi50aHJlYWRzID0gMTAKKyAgICAgICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKIAotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCi0gICAgc2VsZi5jbGllbnRzID0gUXVldWUuUXVldWUoKQotICAgIHNlbGYudGhyZWFkcyA9IDEwCisgICAgZGVmIHNldE51bVRocmVhZHMoc2VsZiwgbnVtKToKKyAgICAgICAgIiIiU2V0IHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCIiIgorICAgICAgICBzZWxmLnRocmVhZHMgPSBudW0KIAotICBkZWYgc2V0TnVtVGhyZWFkcyhzZWxmLCBudW0pOgotICAgICIiIlNldCB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQiIiIKLSAgICBzZWxmLnRocmVhZHMgPSBudW0KKyAgICBkZWYgc2VydmVUaHJlYWQoc2VsZik6CisgICAgICAgICIiIkxvb3AgYXJvdW5kIGdldHRpbmcgY2xpZW50cyBmcm9tIHRoZSBzaGFyZWQgcXVldWUgYW5kIHByb2Nlc3MgdGhlbS4iIiIKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLmNsaWVudHMuZ2V0KCkKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlQ2xpZW50KGNsaWVudCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKLSAgZGVmIHNlcnZlVGhyZWFkKHNlbGYpOgotICAgICIiIkxvb3AgYXJvdW5kIGdldHRpbmcgY2xpZW50cyBmcm9tIHRoZSBzaGFyZWQgcXVldWUgYW5kIHByb2Nlc3MgdGhlbS4iIiIKLSAgICB3aGlsZSBUcnVlOgotICAgICAgdHJ5OgotICAgICAgICBjbGllbnQgPSBzZWxmLmNsaWVudHMuZ2V0KCkKLSAgICAgICAgc2VsZi5zZXJ2ZUNsaWVudChjbGllbnQpCi0gICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgIGRlZiBzZXJ2ZUNsaWVudChzZWxmLCBjbGllbnQpOgorICAgICAgICAiIiJQcm9jZXNzIGlucHV0L291dHB1dCBmcm9tIGEgY2xpZW50IGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIiIiCisgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgZGVmIHNlcnZlQ2xpZW50KHNlbGYsIGNsaWVudCk6Ci0gICAgIiIiUHJvY2VzcyBpbnB1dC9vdXRwdXQgZnJvbSBhIGNsaWVudCBmb3IgYXMgbG9uZyBhcyBwb3NzaWJsZSIiIgotICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLSAgICB0cnk6Ci0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgIHBhc3MKLSAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbCBpbnN0YW5jZSBmb3IgaW5wdXQKKyAgICAgICAgIyBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdCB0aGUKKyAgICAgICAgIyBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKIAotICAgIGl0cmFucy5jbG9zZSgpCi0gICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICAiIiJTdGFydCBhIGZpeGVkIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBhbmQgcHV0IGNsaWVudCBpbnRvIGEgcXVldWUiIiIKLSAgICBmb3IgaSBpbiByYW5nZShzZWxmLnRocmVhZHMpOgotICAgICAgdHJ5OgotICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQgPSBzZWxmLnNlcnZlVGhyZWFkKQotICAgICAgICB0LnN0YXJ0KCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCiAKLSAgICAjIFB1bXAgdGhlIHNvY2tldCBmb3IgY2xpZW50cwotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgICAgc2VsZi5jbGllbnRzLnB1dChjbGllbnQpCi0gICAgICBleGNlcHQgRXhjZXB0aW9uLCB4OgotICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgIiIiU3RhcnQgYSBmaXhlZCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIHB1dCBjbGllbnQgaW50byBhIHF1ZXVlIiIiCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYudGhyZWFkcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuc2VydmVUaHJlYWQpCisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgICMgUHVtcCB0aGUgc29ja2V0IGZvciBjbGllbnRzCisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50cy5wdXQoY2xpZW50KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogCiBjbGFzcyBURm9ya2luZ1NlcnZlcihUU2VydmVyKToKKyAgICAiIiJBIFRocmlmdCBzZXJ2ZXIgdGhhdCBmb3JrcyBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QKIAotICAiIiJBIFRocmlmdCBzZXJ2ZXIgdGhhdCBmb3JrcyBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QiIiIKLSAgIiIiCi0gIFRoaXMgaXMgbW9yZSBzY2FsYWJsZSB0aGFuIHRoZSB0aHJlYWRlZCBzZXJ2ZXIgYXMgaXQgZG9lcyBub3QgY2F1c2UKLSAgR0lMIGNvbnRlbnRpb24uCisgICAgVGhpcyBpcyBtb3JlIHNjYWxhYmxlIHRoYW4gdGhlIHRocmVhZGVkIHNlcnZlciBhcyBpdCBkb2VzIG5vdCBjYXVzZQorICAgIEdJTCBjb250ZW50aW9uLgogCi0gIE5vdGUgdGhhdCB0aGlzIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZyb20gdGhlIHRocmVhZGluZyBzZXJ2ZXIuCi0gIFNwZWNpZmljYWxseSwgdXBkYXRlcyB0byBzaGFyZWQgdmFyaWFibGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNoYXJlZC4KLSAgSXQgd2lsbCBhbHNvIG5vdCB3b3JrIG9uIHdpbmRvd3MuCisgICAgTm90ZSB0aGF0IHRoaXMgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZnJvbSB0aGUgdGhyZWFkaW5nIHNlcnZlci4KKyAgICBTcGVjaWZpY2FsbHksIHVwZGF0ZXMgdG8gc2hhcmVkIHZhcmlhYmxlcyB3aWxsIG5vIGxvbmdlciBiZSBzaGFyZWQuCisgICAgSXQgd2lsbCBhbHNvIG5vdCB3b3JrIG9uIHdpbmRvd3MuCiAKLSAgVGhpcyBjb2RlIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgU29ja2V0U2VydmVyLkZvcmtpbmdNaXhJbiBpbiB0aGUKLSAgUHl0aG9uIHN0ZGxpYi4KLSAgIiIiCisgICAgVGhpcyBjb2RlIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgU29ja2V0U2VydmVyLkZvcmtpbmdNaXhJbiBpbiB0aGUKKyAgICBQeXRob24gc3RkbGliLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKLSAgICBzZWxmLmNoaWxkcmVuID0gW10KLQotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgZGVmIHRyeV9jbG9zZShmaWxlKToKLSAgICAgIHRyeToKLSAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgICBleGNlcHQgSU9FcnJvciwgZToKLSAgICAgICAgbG9nZ2luZy53YXJuaW5nKGUsIGV4Y19pbmZvPVRydWUpCi0KLQotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCi0gICAgICB0cnk6Ci0gICAgICAgIHBpZCA9IG9zLmZvcmsoKQotCi0gICAgICAgIGlmIHBpZDogIyBwYXJlbnQKLSAgICAgICAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKLSAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChwaWQpCi0gICAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKLQotICAgICAgICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0Ci0gICAgICAgICAgIyBjbG9zZWQgcHJvbXB0bHkKLSAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCi0gICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotCi0gICAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLQotICAgICAgICAgIGVjb2RlID0gMAotICAgICAgICAgIHRyeToKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIGRlZiB0cnlfY2xvc2UoZmlsZSk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKLSAgICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oZSkKLSAgICAgICAgICAgICAgZWNvZGUgPSAxCi0gICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCi0gICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZyhlLCBleGNfaW5mbz1UcnVlKQogCi0gICAgICAgICAgb3MuX2V4aXQoZWNvZGUpCisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQogCi0gICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCB0eDoKLSAgICAgICAgcGFzcwotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgICAgICAgICBpZiBwaWQ6ICAjIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQocGlkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQogCisgICAgICAgICAgICAgICAgICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0CisgICAgICAgICAgICAgICAgICAgICMgY2xvc2VkIHByb21wdGx5CisgICAgICAgICAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQorICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgZGVmIGNvbGxlY3RfY2hpbGRyZW4oc2VsZik6Ci0gICAgd2hpbGUgc2VsZi5jaGlsZHJlbjoKLSAgICAgIHRyeToKLSAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKDAsIG9zLldOT0hBTkcpCi0gICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgIHBpZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAjIGluc3RhbmNlIGZvciBpbnB1dCBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluCisgICAgICAgICAgICAgICAgICAgICMgdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZSBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzCisgICAgICAgICAgICAgICAgICAgICMgaW4uCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQogCi0gICAgICBpZiBwaWQ6Ci0gICAgICAgIHNlbGYuY2hpbGRyZW4ucmVtb3ZlKHBpZCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVjb2RlID0gMAorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvZGUgPSAxCisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCiAKKyAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoZWNvZGUpCiAKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZCgwLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBpZCA9IE5vbmUKKworICAgICAgICAgICAgaWYgcGlkOgorICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4ucmVtb3ZlKHBpZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDU2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5CkBAIC0wLDAgKzEsMzUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHpsaWIKKworZnJvbSB0aHJpZnQuY29tcGF0IGltcG9ydCBCdWZmZXJJTywgYnl0ZV9pbmRleAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wsIHJlYWRWYXJpbnQsIHdyaXRlVmFyaW50Citmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0ICgKKyAgICBDUmVhZGFibGVUcmFuc3BvcnQsCisgICAgVE1lbW9yeUJ1ZmZlciwKKyAgICBUVHJhbnNwb3J0QmFzZSwKKyAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLAorKQorCisKK1UxNiA9IHN0cnVjdC5TdHJ1Y3QoIiFIIikKK0kzMiA9IHN0cnVjdC5TdHJ1Y3QoIiFpIikKK0hFQURFUl9NQUdJQyA9IDB4MEZGRgorSEFSRF9NQVhfRlJBTUVfU0laRSA9IDB4M0ZGRkZGRkYKKworCitjbGFzcyBUSGVhZGVyQ2xpZW50VHlwZShvYmplY3QpOgorICAgIEhFQURFUlMgPSAweDAwCisKKyAgICBGUkFNRURfQklOQVJZID0gMHgwMQorICAgIFVORlJBTUVEX0JJTkFSWSA9IDB4MDIKKworICAgIEZSQU1FRF9DT01QQUNUID0gMHgwMworICAgIFVORlJBTUVEX0NPTVBBQ1QgPSAweDA0CisKKworY2xhc3MgVEhlYWRlclN1YnByb3RvY29sSUQob2JqZWN0KToKKyAgICBCSU5BUlkgPSAweDAwCisgICAgQ09NUEFDVCA9IDB4MDIKKworCitjbGFzcyBUSW5mb0hlYWRlclR5cGUob2JqZWN0KToKKyAgICBLRVlfVkFMVUUgPSAweDAxCisKKworY2xhc3MgVEhlYWRlclRyYW5zZm9ybUlEKG9iamVjdCk6CisgICAgWkxJQiA9IDB4MDEKKworCitSRUFEX1RSQU5TRk9STVNfQllfSUQgPSB7CisgICAgVEhlYWRlclRyYW5zZm9ybUlELlpMSUI6IHpsaWIuZGVjb21wcmVzcywKK30KKworCitXUklURV9UUkFOU0ZPUk1TX0JZX0lEID0geworICAgIFRIZWFkZXJUcmFuc2Zvcm1JRC5aTElCOiB6bGliLmNvbXByZXNzLAorfQorCisKK2RlZiBfcmVhZFN0cmluZyh0cmFucyk6CisgICAgc2l6ZSA9IHJlYWRWYXJpbnQodHJhbnMpCisgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAiTmVnYXRpdmUgbGVuZ3RoIgorICAgICAgICApCisgICAgcmV0dXJuIHRyYW5zLnJlYWQoc2l6ZSkKKworCitkZWYgX3dyaXRlU3RyaW5nKHRyYW5zLCB2YWx1ZSk6CisgICAgd3JpdGVWYXJpbnQodHJhbnMsIGxlbih2YWx1ZSkpCisgICAgdHJhbnMud3JpdGUodmFsdWUpCisKKworY2xhc3MgVEhlYWRlclRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcyk6CisgICAgICAgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLl9jbGllbnRfdHlwZSA9IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMKKyAgICAgICAgc2VsZi5fYWxsb3dlZF9jbGllbnRfdHlwZXMgPSBhbGxvd2VkX2NsaWVudF90eXBlcworCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8oYiIiKQorICAgICAgICBzZWxmLl9yZWFkX2hlYWRlcnMgPSB7fQorCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycyA9IHt9CisgICAgICAgIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXMgPSBbXQorCisgICAgICAgIHNlbGYuZmxhZ3MgPSAwCisgICAgICAgIHNlbGYuc2VxdWVuY2VfaWQgPSAwCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZCisgICAgICAgIHNlbGYuX21heF9mcmFtZV9zaXplID0gSEFSRF9NQVhfRlJBTUVfU0laRQorCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYW5zcG9ydC5pc09wZW4oKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQub3BlbigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQuY2xvc2UoKQorCisgICAgZGVmIGdldF9oZWFkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9oZWFkZXJzCisKKyAgICBkZWYgc2V0X2hlYWRlcihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgbmFtZXMgbXVzdCBiZSBieXRlcyIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgdmFsdWVzIG11c3QgYmUgYnl0ZXMiKQorICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIGNsZWFyX2hlYWRlcnMoc2VsZik6CisgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMuY2xlYXIoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgaWYgdHJhbnNmb3JtX2lkIG5vdCBpbiBXUklURV9UUkFOU0ZPUk1TX0JZX0lEOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biB0cmFuc2Zvcm0iKQorICAgICAgICBzZWxmLl93cml0ZV90cmFuc2Zvcm1zLmFwcGVuZCh0cmFuc2Zvcm1faWQpCisKKyAgICBkZWYgc2V0X21heF9mcmFtZV9zaXplKHNlbGYsIHNpemUpOgorICAgICAgICBpZiBub3QgMCA8IHNpemUgPCBIQVJEX01BWF9GUkFNRV9TSVpFOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibWF4aW11bSBmcmFtZSBzaXplIHNob3VsZCBiZSA8ICVkIGFuZCA+IDAiICUgSEFSRF9NQVhfRlJBTUVfU0laRSkKKyAgICAgICAgc2VsZi5fbWF4X2ZyYW1lX3NpemUgPSBzaXplCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJvdG9jb2xfaWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2xfaWQKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZKToKKyAgICAgICAgICAgIHJldHVybiBUSGVhZGVyU3VicHJvdG9jb2xJRC5CSU5BUlkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QsIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgcmV0dXJuIFRIZWFkZXJTdWJwcm90b2NvbElELkNPTVBBQ1QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJQcm90b2NvbCBJRCBub3Qga25vdyBmb3IgY2xpZW50IHR5cGUgJWQiICUgc2VsZi5fY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgICMgaWYgdGhlcmUgYXJlIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciwgcHJvZHVjZSB0aG9zZSBmaXJzdC4KKyAgICAgICAgYnl0ZXNfcmVhZCA9IHNlbGYuX3JlYWRfYnVmZmVyLnJlYWQoc3opCisgICAgICAgIGJ5dGVzX2xlZnRfdG9fcmVhZCA9IHN6IC0gbGVuKGJ5dGVzX3JlYWQpCisgICAgICAgIGlmIGJ5dGVzX2xlZnRfdG9fcmVhZCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQKKworICAgICAgICAjIGlmIHdlJ3ZlIGRldGVybWluZWQgdGhpcyBpcyBhbiB1bmZyYW1lZCBjbGllbnQsIGp1c3QgcGFzcyB0aGUgcmVhZAorICAgICAgICAjIHRocm91Z2ggdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVudGlsIHdlJ3JlIHJlc2V0IGFnYWluIGF0IHRoZQorICAgICAgICAjIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtZXNzYWdlLgorICAgICAgICBpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIHJldHVybiBieXRlc19yZWFkICsgc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorCisgICAgICAgICMgd2UncmUgZW1wdHkgYW5kIChtYXliZSkgZnJhbWVkLiBmaWxsIHRoZSBidWZmZXJzIHdpdGggdGhlIG5leHQgZnJhbWUuCisgICAgICAgIHNlbGYucmVhZEZyYW1lKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQgKyBzZWxmLl9yZWFkX2J1ZmZlci5yZWFkKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKworICAgIGRlZiBfc2V0X2NsaWVudF90eXBlKHNlbGYsIGNsaWVudF90eXBlKToKKyAgICAgICAgaWYgY2xpZW50X3R5cGUgbm90IGluIHNlbGYuX2FsbG93ZWRfY2xpZW50X3R5cGVzOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIkNsaWVudCB0eXBlICVkIG5vdCBhbGxvd2VkIGJ5IHNlcnZlci4iICUgY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuX2NsaWVudF90eXBlID0gY2xpZW50X3R5cGUKKworICAgIGRlZiByZWFkRnJhbWUoc2VsZiwgcmVxX3N6KToKKyAgICAgICAgIyB0aGUgZmlyc3Qgd29yZCBjb3VsZCBlaXRoZXIgYmUgdGhlIGxlbmd0aCBmaWVsZCBvZiBhIGZyYW1lZCBtZXNzYWdlCisgICAgICAgICMgb3IgdGhlIGZpcnN0IGJ5dGVzIG9mIGFuIHVuZnJhbWVkIG1lc3NhZ2UuCisgICAgICAgIGZpcnN0X3dvcmQgPSBzZWxmLl90cmFuc3BvcnQucmVhZEFsbChJMzIuc2l6ZSkKKyAgICAgICAgZnJhbWVfc2l6ZSwgPSBJMzIudW5wYWNrKGZpcnN0X3dvcmQpCisgICAgICAgIGlzX3VuZnJhbWVkID0gRmFsc2UKKyAgICAgICAgaWYgZnJhbWVfc2l6ZSAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlkpCisgICAgICAgICAgICBpc191bmZyYW1lZCA9IFRydWUKKyAgICAgICAgZWxpZiAoYnl0ZV9pbmRleChmaXJzdF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KGZpcnN0X3dvcmQsIDEpICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OKToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKQorICAgICAgICAgICAgaXNfdW5mcmFtZWQgPSBUcnVlCisKKyAgICAgICAgaWYgaXNfdW5mcmFtZWQ6CisgICAgICAgICAgICBieXRlc19sZWZ0X3RvX3JlYWQgPSByZXFfc3ogLSBJMzIuc2l6ZQorICAgICAgICAgICAgaWYgYnl0ZXNfbGVmdF90b19yZWFkID4gMDoKKyAgICAgICAgICAgICAgICByZXN0ID0gc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN0ID0gYiIiCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKGZpcnN0X3dvcmQgKyByZXN0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBvaywgd2UncmUgc3RpbGwgaGVyZSBzbyB3ZSdyZSBmcmFtZWQuCisgICAgICAgIGlmIGZyYW1lX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJGcmFtZSB3YXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICApCisgICAgICAgIHJlYWRfYnVmZmVyID0gQnVmZmVySU8oc2VsZi5fdHJhbnNwb3J0LnJlYWRBbGwoZnJhbWVfc2l6ZSkpCisKKyAgICAgICAgIyB0aGUgbmV4dCB3b3JkIGlzIGVpdGhlciBnb2luZyB0byBiZSB0aGUgdmVyc2lvbiBmaWVsZCBvZiBhCisgICAgICAgICMgYmluYXJ5L2NvbXBhY3QgcHJvdG9jb2wgbWVzc2FnZSBvciB0aGUgbWFnaWMgdmFsdWUgKyBmbGFncyBvZiBhCisgICAgICAgICMgaGVhZGVyIHByb3RvY29sIG1lc3NhZ2UuCisgICAgICAgIHNlY29uZF93b3JkID0gcmVhZF9idWZmZXIucmVhZChJMzIuc2l6ZSkKKyAgICAgICAgdmVyc2lvbiwgPSBJMzIudW5wYWNrKHNlY29uZF93b3JkKQorICAgICAgICByZWFkX2J1ZmZlci5zZWVrKDApCisgICAgICAgIGlmIHZlcnNpb24gPj4gMTYgPT0gSEVBREVSX01BR0lDOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHNlbGYuX3BhcnNlX2hlYWRlcl9mb3JtYXQocmVhZF9idWZmZXIpCisgICAgICAgIGVsaWYgdmVyc2lvbiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSByZWFkX2J1ZmZlcgorICAgICAgICBlbGlmIChieXRlX2luZGV4KHNlY29uZF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KHNlY29uZF93b3JkLCAxKSAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTik6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHJlYWRfYnVmZmVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVjdCBjbGllbnQgdHJhbnNwb3J0IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfcGFyc2VfaGVhZGVyX2Zvcm1hdChzZWxmLCBidWZmZXIpOgorICAgICAgICAjIG1ha2UgQnVmZmVySU8gbG9vayBsaWtlIFRUcmFuc3BvcnQgZm9yIHZhcmludCBoZWxwZXJzCisgICAgICAgIGJ1ZmZlcl90cmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgYnVmZmVyX3RyYW5zcG9ydC5fYnVmZmVyID0gYnVmZmVyCisKKyAgICAgICAgYnVmZmVyLnJlYWQoMikgICMgZGlzY2FyZCB0aGUgbWFnaWMgYnl0ZXMKKyAgICAgICAgc2VsZi5mbGFncywgPSBVMTYudW5wYWNrKGJ1ZmZlci5yZWFkKFUxNi5zaXplKSkKKyAgICAgICAgc2VsZi5zZXF1ZW5jZV9pZCwgPSBJMzIudW5wYWNrKGJ1ZmZlci5yZWFkKEkzMi5zaXplKSkKKworICAgICAgICBoZWFkZXJfbGVuZ3RoID0gVTE2LnVucGFjayhidWZmZXIucmVhZChVMTYuc2l6ZSkpWzBdICogNAorICAgICAgICBlbmRfb2ZfaGVhZGVycyA9IGJ1ZmZlci50ZWxsKCkgKyBoZWFkZXJfbGVuZ3RoCisgICAgICAgIGlmIGVuZF9vZl9oZWFkZXJzID4gbGVuKGJ1ZmZlci5nZXR2YWx1ZSgpKToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyBsYXJnZXIgdGhhbiB3aG9sZSBmcmFtZS4iLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorCisgICAgICAgIHRyYW5zZm9ybXMgPSBbXQorICAgICAgICB0cmFuc2Zvcm1fY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgIGZvciBfIGluIHJhbmdlKHRyYW5zZm9ybV9jb3VudCk6CisgICAgICAgICAgICB0cmFuc2Zvcm1faWQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICBpZiB0cmFuc2Zvcm1faWQgbm90IGluIFJFQURfVFJBTlNGT1JNU19CWV9JRDoKKyAgICAgICAgICAgICAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gdHJhbnNmb3JtOiAlZCIgJSB0cmFuc2Zvcm1faWQsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgdHJhbnNmb3Jtcy5hcHBlbmQodHJhbnNmb3JtX2lkKQorICAgICAgICB0cmFuc2Zvcm1zLnJldmVyc2UoKQorCisgICAgICAgIGhlYWRlcnMgPSB7fQorICAgICAgICB3aGlsZSBidWZmZXIudGVsbCgpIDwgZW5kX29mX2hlYWRlcnM6CisgICAgICAgICAgICBoZWFkZXJfdHlwZSA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgIGlmIGhlYWRlcl90eXBlID09IFRJbmZvSGVhZGVyVHlwZS5LRVlfVkFMVUU6CisgICAgICAgICAgICAgICAgY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoY291bnQpOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBfcmVhZFN0cmluZyhidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9yZWFkU3RyaW5nKGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrICAjIGlnbm9yZSB1bmtub3duIGhlYWRlcnMKKyAgICAgICAgc2VsZi5fcmVhZF9oZWFkZXJzID0gaGVhZGVycworCisgICAgICAgICMgc2tpcCBwYWRkaW5nIC8gYW55dGhpbmcgd2UgZGlkbid0IHVuZGVyc3RhbmQKKyAgICAgICAgYnVmZmVyLnNlZWsoZW5kX29mX2hlYWRlcnMpCisKKyAgICAgICAgcGF5bG9hZCA9IGJ1ZmZlci5yZWFkKCkKKyAgICAgICAgZm9yIHRyYW5zZm9ybV9pZCBpbiB0cmFuc2Zvcm1zOgorICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gUkVBRF9UUkFOU0ZPUk1TX0JZX0lEW3RyYW5zZm9ybV9pZF0KKyAgICAgICAgICAgIHBheWxvYWQgPSB0cmFuc2Zvcm1fZm4ocGF5bG9hZCkKKyAgICAgICAgcmV0dXJuIEJ1ZmZlcklPKHBheWxvYWQpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmZmVyLndyaXRlKGJ1ZikKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGF5bG9hZCA9IHNlbGYuX3dyaXRlX2J1ZmZlci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKworICAgICAgICBidWZmZXIgPSBCdWZmZXJJTygpCisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gV1JJVEVfVFJBTlNGT1JNU19CWV9JRFt0cmFuc2Zvcm1faWRdCisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHRyYW5zZm9ybV9mbihwYXlsb2FkKQorCisgICAgICAgICAgICBoZWFkZXJzID0gQnVmZmVySU8oKQorICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgc2VsZi5fcHJvdG9jb2xfaWQpCisgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBsZW4oc2VsZi5fd3JpdGVfdHJhbnNmb3JtcykpCisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgdHJhbnNmb3JtX2lkKQorICAgICAgICAgICAgaWYgc2VsZi5fd3JpdGVfaGVhZGVyczoKKyAgICAgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBUSW5mb0hlYWRlclR5cGUuS0VZX1ZBTFVFKQorICAgICAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIGxlbihzZWxmLl93cml0ZV9oZWFkZXJzKSkKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl93cml0ZV9oZWFkZXJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCBrZXkpCisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzID0ge30KKyAgICAgICAgICAgIHBhZGRpbmdfbmVlZGVkID0gKDQgLSAobGVuKGhlYWRlcnMuZ2V0dmFsdWUoKSkgJSA0KSkgJSA0CisgICAgICAgICAgICBoZWFkZXJzLndyaXRlKGIiXHgwMCIgKiBwYWRkaW5nX25lZWRlZCkKKyAgICAgICAgICAgIGhlYWRlcl9ieXRlcyA9IGhlYWRlcnMuZ2V0dmFsdWUoKQorCisgICAgICAgICAgICBidWZmZXIud3JpdGUoSTMyLnBhY2soMTAgKyBsZW4oaGVhZGVyX2J5dGVzKSArIGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoVTE2LnBhY2soSEVBREVSX01BR0lDKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhzZWxmLmZsYWdzKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShJMzIucGFjayhzZWxmLnNlcXVlbmNlX2lkKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhsZW4oaGVhZGVyX2J5dGVzKSAvLyA0KSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShoZWFkZXJfYnl0ZXMpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgYnVmZmVyLndyaXRlKEkzMi5wYWNrKGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShwYXlsb2FkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIlVua25vd24gY2xpZW50IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICAjIHRoZSBmcmFtZSBsZW5ndGggZmllbGQgZG9lc24ndCBjb3VudCB0b3dhcmRzIHRoZSBmcmFtZSBwYXlsb2FkIHNpemUKKyAgICAgICAgZnJhbWVfYnl0ZXMgPSBidWZmZXIuZ2V0dmFsdWUoKQorICAgICAgICBmcmFtZV9wYXlsb2FkX3NpemUgPSBsZW4oZnJhbWVfYnl0ZXMpIC0gNAorICAgICAgICBpZiBmcmFtZV9wYXlsb2FkX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHNlbmQgZnJhbWUgdGhhdCBpcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl90cmFuc3BvcnQud3JpdGUoZnJhbWVfYnl0ZXMpCisgICAgICAgIHNlbGYuX3RyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfYnVmZmVyCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgcmVzdWx0ID0gYnl0ZWFycmF5KHBhcnRpYWxyZWFkKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJlc3VsdCArPSBzZWxmLnJlYWQocmVxbGVuIC0gbGVuKHJlc3VsdCkpCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8ocmVzdWx0KQorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9idWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKaW5kZXggMDVjYTUzYS4uMzdiMGE0ZCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKQEAgLTE3LDEwOCArMTcsMTcxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIFRUcmFuc3BvcnQgaW1wb3J0ICoKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotCi1pbXBvcnQgdXJscGFyc2UKLWltcG9ydCBodHRwbGliCitmcm9tIGlvIGltcG9ydCBCeXRlc0lPCitpbXBvcnQgb3MKK2ltcG9ydCBzc2wKK2ltcG9ydCBzeXMKIGltcG9ydCB3YXJuaW5ncwotaW1wb3J0IHNvY2tldAoraW1wb3J0IGJhc2U2NAorCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQKKworZnJvbSAuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UKK2ltcG9ydCBzaXgKKwogCiBjbGFzcyBUSHR0cENsaWVudChUVHJhbnNwb3J0QmFzZSk6CisgICAgIiIiSHR0cCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgIiIiSHR0cCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaV9vcl9ob3N0LCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSwgY2FmaWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLCBrZXlfZmlsZT1Ob25lLCBzc2xfY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiVEh0dHBDbGllbnQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBjb25zdHJ1Y3Rpb246CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaV9vcl9ob3N0LCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSk6Ci0gICAgIiIiVEh0dHBDbGllbnQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCB0eXBlcyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLgorICAgICAgICBUSHR0cENsaWVudChob3N0LCBwb3J0LCBwYXRoKSAtIGRlcHJlY2F0ZWQKKyAgICAgICAgVEh0dHBDbGllbnQodXJpLCBbcG9ydD08bj4sIHBhdGg9PHM+LCBjYWZpbGU9PGZpbGVuYW1lPiwgY2VydF9maWxlPTxmaWxlbmFtZT4sIGtleV9maWxlPTxmaWxlbmFtZT4sIHNzbF9jb250ZXh0PTxjb250ZXh0Pl0pCiAKLSAgICBUSHR0cENsaWVudChob3N0LCBwb3J0LCBwYXRoKSAtIGRlcHJlY2F0ZWQKLSAgICBUSHR0cENsaWVudCh1cmkpCisgICAgICAgIE9ubHkgdGhlIHNlY29uZCBzdXBwb3J0cyBodHRwcy4gIFRvIHByb3Blcmx5IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0IHRoZSBzZXJ2ZXIsCisgICAgICAgIHByb3ZpZGUgdGhlIGNsaWVudCdzIGlkZW50aXR5IGJ5IHNwZWNpZnlpbmcgY2VydF9maWxlIGFuZCBrZXlfZmlsZS4gIFRvIHByb3Blcmx5CisgICAgICAgIGF1dGhlbnRpY2F0ZSB0aGUgc2VydmVyLCBzcGVjaWZ5IGVpdGhlciBjYWZpbGUgb3Igc3NsX2NvbnRleHQgd2l0aCBhIENBIGRlZmluZWQuCisgICAgICAgIE5PVEU6IGlmIGJvdGggY2FmaWxlIGFuZCBzc2xfY29udGV4dCBhcmUgZGVmaW5lZCwgc3NsX2NvbnRleHQgd2lsbCBvdmVycmlkZSBjYWZpbGUuCisgICAgICAgICIiIgorICAgICAgICBpZiBwb3J0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiUGxlYXNlIHVzZSB0aGUgVEh0dHBDbGllbnQoJ2h0dHB7c306Ly9ob3N0OnBvcnQvcGF0aCcpIGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgc2VsZi5ob3N0ID0gdXJpX29yX2hvc3QKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgICAgIGFzc2VydCBwYXRoCisgICAgICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgICAgICBzZWxmLnNjaGVtZSA9ICdodHRwJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVyaV9vcl9ob3N0KQorICAgICAgICAgICAgc2VsZi5zY2hlbWUgPSBwYXJzZWQuc2NoZW1lCisgICAgICAgICAgICBhc3NlcnQgc2VsZi5zY2hlbWUgaW4gKCdodHRwJywgJ2h0dHBzJykKKyAgICAgICAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwX2NsaWVudC5IVFRQX1BPUlQKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHBzJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwX2NsaWVudC5IVFRQU19QT1JUCisgICAgICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRfZmlsZQorICAgICAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IGtleV9maWxlCisgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoY2FmaWxlPWNhZmlsZSkgaWYgKGNhZmlsZSBhbmQgbm90IHNzbF9jb250ZXh0KSBlbHNlIHNzbF9jb250ZXh0CisgICAgICAgICAgICBzZWxmLmhvc3QgPSBwYXJzZWQuaG9zdG5hbWUKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhcnNlZC5wYXRoCisgICAgICAgICAgICBpZiBwYXJzZWQucXVlcnk6CisgICAgICAgICAgICAgICAgc2VsZi5wYXRoICs9ICc/JXMnICUgcGFyc2VkLnF1ZXJ5CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb3h5ID0gdXJsbGliLnJlcXVlc3QuZ2V0cHJveGllcygpW3NlbGYuc2NoZW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwcm94eSA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHVybGxpYi5yZXF1ZXN0LnByb3h5X2J5cGFzcyhzZWxmLmhvc3QpOgorICAgICAgICAgICAgICAgIHByb3h5ID0gTm9uZQorICAgICAgICBpZiBwcm94eToKKyAgICAgICAgICAgIHBhcnNlZCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShwcm94eSkKKyAgICAgICAgICAgIHNlbGYucmVhbGhvc3QgPSBzZWxmLmhvc3QKKyAgICAgICAgICAgIHNlbGYucmVhbHBvcnQgPSBzZWxmLnBvcnQKKyAgICAgICAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQKKyAgICAgICAgICAgIHNlbGYucHJveHlfYXV0aCA9IHNlbGYuYmFzaWNfcHJveHlfYXV0aF9oZWFkZXIocGFyc2VkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZWFsaG9zdCA9IHNlbGYucmVhbHBvcnQgPSBzZWxmLnByb3h5X2F1dGggPSBOb25lCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCisgICAgICAgIHNlbGYuX19odHRwID0gTm9uZQorICAgICAgICBzZWxmLl9faHR0cF9yZXNwb25zZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCisgICAgICAgIHNlbGYuX19jdXN0b21faGVhZGVycyA9IE5vbmUKIAotICAgIE9ubHkgdGhlIHNlY29uZCBzdXBwb3J0cyBodHRwcy4iIiIKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGJhc2ljX3Byb3h5X2F1dGhfaGVhZGVyKHByb3h5KToKKyAgICAgICAgaWYgcHJveHkgaXMgTm9uZSBvciBub3QgcHJveHkudXNlcm5hbWU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBhcCA9ICIlczolcyIgJSAodXJsbGliLnBhcnNlLnVucXVvdGUocHJveHkudXNlcm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliLnBhcnNlLnVucXVvdGUocHJveHkucGFzc3dvcmQpKQorICAgICAgICBjciA9IGJhc2U2NC5iNjRlbmNvZGUoYXApLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuICJCYXNpYyAiICsgY3IKIAotICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6Ci0gICAgICB3YXJuaW5ncy53YXJuKCJQbGVhc2UgdXNlIHRoZSBUSHR0cENsaWVudCgnaHR0cDovL2hvc3Q6cG9ydC9wYXRoJykgc3ludGF4IiwgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgICBzZWxmLmhvc3QgPSB1cmlfb3JfaG9zdAotICAgICAgc2VsZi5wb3J0ID0gcG9ydAotICAgICAgYXNzZXJ0IHBhdGgKLSAgICAgIHNlbGYucGF0aCA9IHBhdGgKLSAgICAgIHNlbGYuc2NoZW1lID0gJ2h0dHAnCi0gICAgZWxzZToKLSAgICAgIHBhcnNlZCA9IHVybHBhcnNlLnVybHBhcnNlKHVyaV9vcl9ob3N0KQotICAgICAgc2VsZi5zY2hlbWUgPSBwYXJzZWQuc2NoZW1lCi0gICAgICBhc3NlcnQgc2VsZi5zY2hlbWUgaW4gKCdodHRwJywgJ2h0dHBzJykKLSAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKLSAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cGxpYi5IVFRQX1BPUlQKLSAgICAgIGVsaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHBzJzoKLSAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cGxpYi5IVFRQU19QT1JUCi0gICAgICBzZWxmLmhvc3QgPSBwYXJzZWQuaG9zdG5hbWUKLSAgICAgIHNlbGYucGF0aCA9IHBhcnNlZC5wYXRoCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX2h0dHAgPSBOb25lCi0gICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCisgICAgZGVmIHVzaW5nX3Byb3h5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFsaG9zdCBpcyBub3QgTm9uZQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKLSAgICAgIHNlbGYuX19odHRwID0gaHR0cGxpYi5IVFRQKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9faHR0cCA9IGh0dHBsaWIuSFRUUFMoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKKyAgICAgICAgICAgIHNlbGYuX19odHRwID0gaHR0cF9jbGllbnQuSFRUUENvbm5lY3Rpb24oc2VsZi5ob3N0LCBzZWxmLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c2VsZi5fX3RpbWVvdXQpCisgICAgICAgIGVsaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHBzJzoKKyAgICAgICAgICAgIHNlbGYuX19odHRwID0gaHR0cF9jbGllbnQuSFRUUFNDb25uZWN0aW9uKHNlbGYuaG9zdCwgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2ZpbGU9c2VsZi5rZXlmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9maWxlPXNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYuX190aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dD1zZWxmLmNvbnRleHQpCisgICAgICAgIGlmIHNlbGYudXNpbmdfcHJveHkoKToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnNldF90dW5uZWwoc2VsZi5yZWFsaG9zdCwgc2VsZi5yZWFscG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJQcm94eS1BdXRob3JpemF0aW9uIjogc2VsZi5wcm94eV9hdXRofSkKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5fX2h0dHAuY2xvc2UoKQotICAgIHNlbGYuX19odHRwID0gTm9uZQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fX2h0dHAuY2xvc2UoKQorICAgICAgICBzZWxmLl9faHR0cCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2h0dHBfcmVzcG9uc2UgPSBOb25lCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX2h0dHAgIT0gTm9uZQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9faHR0cCBpcyBub3QgTm9uZQogCi0gIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKLSAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICdnZXRkZWZhdWx0dGltZW91dCcpOgotICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKKyAgICAgICAgaWYgbXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX190aW1lb3V0ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3RpbWVvdXQgPSBtcyAvIDEwMDAuMAogCi0gICAgaWYgbXMgaXMgTm9uZToKLSAgICAgIHNlbGYuX190aW1lb3V0ID0gTm9uZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9fdGltZW91dCA9IG1zLzEwMDAuMAorICAgIGRlZiBzZXRDdXN0b21IZWFkZXJzKHNlbGYsIGhlYWRlcnMpOgorICAgICAgICBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgPSBoZWFkZXJzCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLl9faHR0cC5maWxlLnJlYWQoc3opCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXR1cm4gc2VsZi5fX2h0dHBfcmVzcG9uc2UucmVhZChzeikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAotICBkZWYgX193aXRoVGltZW91dChmKToKLSAgICBkZWYgX2YoKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgIG9yaWdfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCi0gICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoYXJnc1swXS5fX3RpbWVvdXQpCi0gICAgICByZXN1bHQgPSBmKCphcmdzLCAqKmt3YXJncykKLSAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvcmlnX3RpbWVvdXQpCi0gICAgICByZXR1cm4gcmVzdWx0Ci0gICAgcmV0dXJuIF9mCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmlzT3BlbigpOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIHNlbGYub3BlbigpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIGlmIHNlbGYuaXNPcGVuKCk6Ci0gICAgICBzZWxmLmNsb3NlKCkKLSAgICBzZWxmLm9wZW4oKTsKKyAgICAgICAgIyBQdWxsIGRhdGEgb3V0IG9mIGJ1ZmZlcgorICAgICAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQogCi0gICAgIyBQdWxsIGRhdGEgb3V0IG9mIGJ1ZmZlcgotICAgIGRhdGEgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgICMgSFRUUCByZXF1ZXN0CisgICAgICAgIGlmIHNlbGYudXNpbmdfcHJveHkoKSBhbmQgc2VsZi5zY2hlbWUgPT0gImh0dHAiOgorICAgICAgICAgICAgIyBuZWVkIGZ1bGwgVVJMIG9mIHJlYWwgaG9zdCBmb3IgSFRUUCBwcm94eSBoZXJlIChIVFRQUyB1c2VzIENPTk5FQ1QgdHVubmVsKQorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0cmVxdWVzdCgnUE9TVCcsICJodHRwOi8vJXM6JXMlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5yZWFsaG9zdCwgc2VsZi5yZWFscG9ydCwgc2VsZi5wYXRoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxmLnBhdGgpCiAKLSAgICAjIEhUVFAgcmVxdWVzdAotICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxmLnBhdGgpCisgICAgICAgICMgV3JpdGUgaGVhZGVycworICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXRocmlmdCcpCisgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCBzdHIobGVuKGRhdGEpKSkKKyAgICAgICAgaWYgc2VsZi51c2luZ19wcm94eSgpIGFuZCBzZWxmLnNjaGVtZSA9PSAiaHR0cCIgYW5kIHNlbGYucHJveHlfYXV0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcigiUHJveHktQXV0aG9yaXphdGlvbiIsIHNlbGYucHJveHlfYXV0aCkKIAotICAgICMgV3JpdGUgaGVhZGVycwotICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignSG9zdCcsIHNlbGYuaG9zdCkKLSAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXRocmlmdCcpCi0gICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIHN0cihsZW4oZGF0YSkpKQotICAgIHNlbGYuX19odHRwLmVuZGhlYWRlcnMoKQorICAgICAgICBpZiBub3Qgc2VsZi5fX2N1c3RvbV9oZWFkZXJzIG9yICdVc2VyLUFnZW50JyBub3QgaW4gc2VsZi5fX2N1c3RvbV9oZWFkZXJzOgorICAgICAgICAgICAgdXNlcl9hZ2VudCA9ICdQeXRob24vVEh0dHBDbGllbnQnCisgICAgICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQorICAgICAgICAgICAgaWYgc2NyaXB0OgorICAgICAgICAgICAgICAgIHVzZXJfYWdlbnQgPSAnJXMgKCVzKScgJSAodXNlcl9hZ2VudCwgdXJsbGliLnBhcnNlLnF1b3RlKHNjcmlwdCkpCisgICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ1VzZXItQWdlbnQnLCB1c2VyX2FnZW50KQogCi0gICAgIyBXcml0ZSBwYXlsb2FkCi0gICAgc2VsZi5fX2h0dHAuc2VuZChkYXRhKQorICAgICAgICBpZiBzZWxmLl9fY3VzdG9tX2hlYWRlcnM6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc2l4Lml0ZXJpdGVtcyhzZWxmLl9fY3VzdG9tX2hlYWRlcnMpOgorICAgICAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcihrZXksIHZhbCkKIAotICAgICMgR2V0IHJlcGx5IHRvIGZsdXNoIHRoZSByZXF1ZXN0Ci0gICAgc2VsZi5jb2RlLCBzZWxmLm1lc3NhZ2UsIHNlbGYuaGVhZGVycyA9IHNlbGYuX19odHRwLmdldHJlcGx5KCkKKyAgICAgICAgc2VsZi5fX2h0dHAuZW5kaGVhZGVycygpCiAKLSAgIyBEZWNvcmF0ZSBpZiB3ZSBrbm93IGhvdyB0byB0aW1lb3V0Ci0gIGlmIGhhc2F0dHIoc29ja2V0LCAnZ2V0ZGVmYXVsdHRpbWVvdXQnKToKLSAgICBmbHVzaCA9IF9fd2l0aFRpbWVvdXQoZmx1c2gpCisgICAgICAgICMgV3JpdGUgcGF5bG9hZAorICAgICAgICBzZWxmLl9faHR0cC5zZW5kKGRhdGEpCisKKyAgICAgICAgIyBHZXQgcmVwbHkgdG8gZmx1c2ggdGhlIHJlcXVlc3QKKyAgICAgICAgc2VsZi5fX2h0dHBfcmVzcG9uc2UgPSBzZWxmLl9faHR0cC5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuY29kZSA9IHNlbGYuX19odHRwX3Jlc3BvbnNlLnN0YXR1cworICAgICAgICBzZWxmLm1lc3NhZ2UgPSBzZWxmLl9faHR0cF9yZXNwb25zZS5yZWFzb24KKyAgICAgICAgc2VsZi5oZWFkZXJzID0gc2VsZi5fX2h0dHBfcmVzcG9uc2UubXNnCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRjYTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weQpAQCAtMCwwICsxLDM5NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzc2wKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIC5zc2xjb21wYXQgaW1wb3J0IF9tYXRjaF9ob3N0bmFtZSwgX21hdGNoX2hhc19pcGFkZHJlc3MKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygKKyAgICAnZGVmYXVsdCcsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPV9fbmFtZV9fKQorCisKK2NsYXNzIFRTU0xCYXNlKG9iamVjdCk6CisgICAgIyBTU0xDb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiA8IDIuNy45CisgICAgX2hhc19zc2xfY29udGV4dCA9IHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzA5RjAKKworICAgICMgY2lwaGVycyBhcmd1bWVudCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gPCAyLjcuMAorICAgIF9oYXNfY2lwaGVycyA9IHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzAwRjAKKworICAgICMgRm9yIHB5dGhvbiA+PSAyLjcuOSwgdXNlIGxhdGVzdCBUTFMgdGhhdCBib3RoIGNsaWVudCBhbmQgc2VydmVyCisgICAgIyBzdXBwb3J0cy4KKyAgICAjIFNTTCAyLjAgYW5kIDMuMCBhcmUgZGlzYWJsZWQgdmlhIHNzbC5PUF9OT19TU0x2MiBhbmQgc3NsLk9QX05PX1NTTHYzLgorICAgICMgRm9yIHB5dGhvbiA8IDIuNy45LCB1c2UgVExTIDEuMCBzaW5jZSBUTFN2MV9YIG5vciBPUF9OT19TU0x2WCBpcworICAgICMgdW5hdmFpbGFibGUuCisgICAgX2RlZmF1bHRfcHJvdG9jb2wgPSBzc2wuUFJPVE9DT0xfU1NMdjIzIGlmIF9oYXNfc3NsX2NvbnRleHQgZWxzZSBcCisgICAgICAgIHNzbC5QUk9UT0NPTF9UTFN2MQorCisgICAgZGVmIF9pbml0X2NvbnRleHQoc2VsZiwgc3NsX3ZlcnNpb24pOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICBzZWxmLl9jb250ZXh0ID0gc3NsLlNTTENvbnRleHQoc3NsX3ZlcnNpb24pCisgICAgICAgICAgICBpZiBzZWxmLl9jb250ZXh0LnByb3RvY29sID09IHNzbC5QUk9UT0NPTF9TU0x2MjM6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udGV4dC5vcHRpb25zIHw9IHNzbC5PUF9OT19TU0x2MgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRleHQub3B0aW9ucyB8PSBzc2wuT1BfTk9fU1NMdjMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2NvbnRleHQgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9zc2xfdmVyc2lvbiA9IHNzbF92ZXJzaW9uCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX3Nob3VsZF92ZXJpZnkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb250ZXh0LnZlcmlmeV9tb2RlICE9IHNzbC5DRVJUX05PTkUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNlcnRfcmVxcyAhPSBzc2wuQ0VSVF9OT05FCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3NsX3ZlcnNpb24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbF9jb250ZXh0LnByb3RvY29sCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3NsX3ZlcnNpb24KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzc2xfY29udGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRleHQKKworICAgIFNTTF9WRVJTSU9OID0gX2RlZmF1bHRfcHJvdG9jb2wKKyAgICAiIiIKKyAgRGVmYXVsdCBTU0wgdmVyc2lvbi4KKyAgRm9yIGJhY2t3b3JkIGNvbXBhdGliaWxpdHksIGl0IGNhbiBiZSBtb2RpZmllZC4KKyAgVXNlIF9faW5pdF9fIGtleXdvYXJkIGFyZ3VtZW50ICJzc2xfdmVyc2lvbiIgaW5zdGVhZC4KKyAgIiIiCisKKyAgICBkZWYgX2RlcHJlY2F0ZWRfYXJnKHNlbGYsIGFyZ3MsIGt3YXJncywgcG9zLCBrZXkpOgorICAgICAgICBpZiBsZW4oYXJncykgPD0gcG9zOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJlYWxfcG9zID0gcG9zICsgMworICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgJyVkdGggcG9zaXRpb25hbCBhcmd1bWVudCBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICdwbGVhc2UgdXNlIGtleXdhcmQgYXJndW1lbnQgaW5zdGVhbmQuJworICAgICAgICAgICAgJSByZWFsX3BvcywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTMpCisKKyAgICAgICAgaWYga2V5IGluIGt3YXJnczoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAgICAgICAnRHVwbGljYXRlIGFyZ3VtZW50OiAlZHRoIGFyZ3VtZW50IGFuZCAlcyBrZXl3YXJkIGFyZ3VtZW50LicKKyAgICAgICAgICAgICAgICAlIChyZWFsX3Bvcywga2V5KSkKKyAgICAgICAga3dhcmdzW2tleV0gPSBhcmdzW3Bvc10KKworICAgIGRlZiBfdW5peF9zb2NrZXRfYXJnKHNlbGYsIGhvc3QsIHBvcnQsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgIGtleSA9ICd1bml4X3NvY2tldCcKKyAgICAgICAgaWYgaG9zdCBpcyBOb25lIGFuZCBwb3J0IGlzIE5vbmUgYW5kIGxlbihhcmdzKSA9PSAxIGFuZCBrZXkgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgIGt3YXJnc1trZXldID0gYXJnc1swXQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwga2V5KToKKyAgICAgICAgaWYga2V5ID09ICdTU0xfVkVSU0lPTic6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdTU0xfVkVSU0lPTiBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICAgICAncGxlYXNlIHVzZSBzc2xfdmVyc2lvbiBhdHRyaWJ1dGUgaW5zdGVhZC4nLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsX3ZlcnNpb24KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfc2lkZSwgaG9zdCwgc3NsX29wdHMpOgorICAgICAgICBzZWxmLl9zZXJ2ZXJfc2lkZSA9IHNlcnZlcl9zaWRlCisgICAgICAgIGlmIFRTU0xCYXNlLlNTTF9WRVJTSU9OICE9IHNlbGYuX2RlZmF1bHRfcHJvdG9jb2w6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdTU0xfVkVSU0lPTiBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICAgICAncGxlYXNlIHVzZSBzc2xfdmVyc2lvbiBrZXl3YXJkIGFyZ3VtZW50IGluc3RlYWQuJywKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5fY29udGV4dCA9IHNzbF9vcHRzLnBvcCgnc3NsX2NvbnRleHQnLCBOb25lKQorICAgICAgICBzZWxmLl9zZXJ2ZXJfaG9zdG5hbWUgPSBOb25lCisgICAgICAgIGlmIG5vdCBzZWxmLl9zZXJ2ZXJfc2lkZToKKyAgICAgICAgICAgIHNlbGYuX3NlcnZlcl9ob3N0bmFtZSA9IHNzbF9vcHRzLnBvcCgnc2VydmVyX2hvc3RuYW1lJywgaG9zdCkKKyAgICAgICAgaWYgc2VsZi5fY29udGV4dDoKKyAgICAgICAgICAgIHNlbGYuX2N1c3RvbV9jb250ZXh0ID0gVHJ1ZQorICAgICAgICAgICAgaWYgc3NsX29wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ0luY29tcGF0aWJsZSBhcmd1bWVudHM6IHNzbF9jb250ZXh0IGFuZCAlcycKKyAgICAgICAgICAgICAgICAgICAgJSAnICcuam9pbihzc2xfb3B0cy5rZXlzKCkpKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnc3NsX2NvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB2ZXJzaW9uIG9mIFB5dGhvbicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jdXN0b21fY29udGV4dCA9IEZhbHNlCisgICAgICAgICAgICBzc2xfdmVyc2lvbiA9IHNzbF9vcHRzLnBvcCgnc3NsX3ZlcnNpb24nLCBUU1NMQmFzZS5TU0xfVkVSU0lPTikKKyAgICAgICAgICAgIHNlbGYuX2luaXRfY29udGV4dChzc2xfdmVyc2lvbikKKyAgICAgICAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsX29wdHMucG9wKCdjZXJ0X3JlcXMnLCBzc2wuQ0VSVF9SRVFVSVJFRCkKKyAgICAgICAgICAgIHNlbGYuY2FfY2VydHMgPSBzc2xfb3B0cy5wb3AoJ2NhX2NlcnRzJywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IHNzbF9vcHRzLnBvcCgna2V5ZmlsZScsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gc3NsX29wdHMucG9wKCdjZXJ0ZmlsZScsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmNpcGhlcnMgPSBzc2xfb3B0cy5wb3AoJ2NpcGhlcnMnLCBOb25lKQorCisgICAgICAgICAgICBpZiBzc2xfb3B0czoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnVW5rbm93biBrZXl3b3JkIGFyZ3VtZW50czogJywgJyAnLmpvaW4oc3NsX29wdHMua2V5cygpKSkKKworICAgICAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jYV9jZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICdjYV9jZXJ0cyBpcyBuZWVkZWQgd2hlbiBjZXJ0X3JlcXMgaXMgbm90IHNzbC5DRVJUX05PTkUnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3Moc2VsZi5jYV9jZXJ0cywgb3MuUl9PSyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0NlcnRpZmljYXRlIEF1dGhvcml0eSBjYV9jZXJ0cyBmaWxlICIlcyIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBub3QgcmVhZGFibGUsIGNhbm5vdCB2YWxpZGF0ZSBTU0wgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZXJ0aWZpY2F0ZXMuJyAlIChzZWxmLmNhX2NlcnRzKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjZXJ0ZmlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NlcnRmaWxlCisKKyAgICBAY2VydGZpbGUuc2V0dGVyCisgICAgZGVmIGNlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKKyAgICAgICAgaWYgc2VsZi5fc2VydmVyX3NpZGUgYW5kIG5vdCBjZXJ0ZmlsZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2NlcnRmaWxlIGlzIG5lZWRlZCBmb3Igc2VydmVyLXNpZGUnKQorICAgICAgICBpZiBjZXJ0ZmlsZSBhbmQgbm90IG9zLmFjY2VzcyhjZXJ0ZmlsZSwgb3MuUl9PSyk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdObyBzdWNoIGNlcnRmaWxlIGZvdW5kOiAlcycgJSAoY2VydGZpbGUpKQorICAgICAgICBzZWxmLl9jZXJ0ZmlsZSA9IGNlcnRmaWxlCisKKyAgICBkZWYgX3dyYXBfc29ja2V0KHNlbGYsIHNvY2spOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY3VzdG9tX2NvbnRleHQ6CisgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC52ZXJpZnlfbW9kZSA9IHNlbGYuY2VydF9yZXFzCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jZXJ0ZmlsZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oc2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5rZXlmaWxlKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2lwaGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5zZXRfY2lwaGVycyhzZWxmLmNpcGhlcnMpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VsZi5jYV9jZXJ0cykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbF9jb250ZXh0LndyYXBfc29ja2V0KAorICAgICAgICAgICAgICAgIHNvY2ssIHNlcnZlcl9zaWRlPXNlbGYuX3NlcnZlcl9zaWRlLAorICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT1zZWxmLl9zZXJ2ZXJfaG9zdG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzc2xfb3B0cyA9IHsKKyAgICAgICAgICAgICAgICAnc3NsX3ZlcnNpb24nOiBzZWxmLl9zc2xfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAnc2VydmVyX3NpZGUnOiBzZWxmLl9zZXJ2ZXJfc2lkZSwKKyAgICAgICAgICAgICAgICAnY2FfY2VydHMnOiBzZWxmLmNhX2NlcnRzLAorICAgICAgICAgICAgICAgICdrZXlmaWxlJzogc2VsZi5rZXlmaWxlLAorICAgICAgICAgICAgICAgICdjZXJ0ZmlsZSc6IHNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgJ2NlcnRfcmVxcyc6IHNlbGYuY2VydF9yZXFzLAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgc2VsZi5jaXBoZXJzOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2hhc19jaXBoZXJzOgorICAgICAgICAgICAgICAgICAgICBzc2xfb3B0c1snY2lwaGVycyddID0gc2VsZi5jaXBoZXJzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAnY2lwaGVycyBpcyBzcGVjaWZpZWQgYnV0IGlnbm9yZWQgZHVlIHRvIG9sZCBQeXRob24gdmVyc2lvbicpCisgICAgICAgICAgICByZXR1cm4gc3NsLndyYXBfc29ja2V0KHNvY2ssICoqc3NsX29wdHMpCisKKworY2xhc3MgVFNTTFNvY2tldChUU29ja2V0LlRTb2NrZXQsIFRTU0xCYXNlKToKKyAgICAiIiIKKyAgICBTU0wgaW1wbGVtZW50YXRpb24gb2YgVFNvY2tldAorCisgICAgVGhpcyBjbGFzcyBjcmVhdGVzIG91dGJvdW5kIHNvY2tldHMgd3JhcHBlZCB1c2luZyB0aGUKKyAgICBweXRob24gc3RhbmRhcmQgc3NsIG1vZHVsZSBmb3IgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLgorICAgICIiIgorCisgICAgIyBOZXcgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLAorICAgICMgICAgICAgICAgICAgICoqc3NsX2FyZ3MpOgorICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHZhbGlkYXRlPVRydWUsCisgICAgIyAgICAgICAgICAgICAgY2FfY2VydHM9Tm9uZSwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLAorICAgICMgICAgICAgICAgICAgIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUG9zaXRpb25hbCBhcmd1bWVudHM6IGBgaG9zdGBgLCBgYHBvcnRgYCwgYGB1bml4X3NvY2tldGBgCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6IGBga2V5ZmlsZWBgLCBgYGNlcnRmaWxlYGAsIGBgY2VydF9yZXFzYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYHNzbF92ZXJzaW9uYGAsIGBgY2FfY2VydHNgYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgY2lwaGVyc2BgIChQeXRob24gMi43LjAgb3IgbGF0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYCAoUHl0aG9uIDIuNy45IG9yIGxhdGVyKQorICAgICAgICBQYXNzZWQgdG8gc3NsLndyYXBfc29ja2V0LiBTZWUgc3NsLndyYXBfc29ja2V0IGRvY3VtZW50YXRpb24uCisKKyAgICAgICAgQWx0ZXJuYXRpdmUga2V5d29yZCBhcmd1bWVudHM6IChQeXRob24gMi43Ljkgb3IgbGF0ZXIpCisgICAgICAgICAgYGBzc2xfY29udGV4dGBgOiBzc2wuU1NMQ29udGV4dCB0byBiZSB1c2VkIGZvciBTU0xDb250ZXh0LndyYXBfc29ja2V0CisgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYDogUGFzc2VkIHRvIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKworICAgICAgICBDb21tb24ga2V5d29yZCBhcmd1bWVudDoKKyAgICAgICAgICBgYHZhbGlkYXRlX2NhbGxiYWNrYGAgKGNlcnQsIGhvc3RuYW1lKSAtPiBOb25lOgorICAgICAgICAgICAgICBDYWxsZWQgYWZ0ZXIgU1NMIGhhbmRzaGFrZS4gQ2FuIHJhaXNlIHdoZW4gaG9zdG5hbWUgZG9lcyBub3QKKyAgICAgICAgICAgICAgbWF0Y2ggdGhlIGNlcnQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmlzX3ZhbGlkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wZWVyY2VydCA9IE5vbmUKKworICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gNjoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnQnKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3VuaXhfc29ja2V0X2FyZyhob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMCwgJ3ZhbGlkYXRlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMSwgJ2NhX2NlcnRzJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMiwgJ2tleWZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAzLCAnY2VydGZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA0LCAndW5peF9zb2NrZXQnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA1LCAnY2lwaGVycycpCisKKyAgICAgICAgdmFsaWRhdGUgPSBrd2FyZ3MucG9wKCd2YWxpZGF0ZScsIE5vbmUpCisgICAgICAgIGlmIHZhbGlkYXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY2VydF9yZXFzX25hbWUgPSAnQ0VSVF9SRVFVSVJFRCcgaWYgdmFsaWRhdGUgZWxzZSAnQ0VSVF9OT05FJworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXM9c3NsLiVzIGluc3RlYWQnCisgICAgICAgICAgICAgICAgJSBjZXJ0X3JlcXNfbmFtZSwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIGlmICdjZXJ0X3JlcXMnIGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggdmFsaWRhdGUgYW5kIGNlcnRfcmVxcycpCisgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRfcmVxcyddID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgdmFsaWRhdGUgZWxzZSBzc2wuQ0VSVF9OT05FCisKKyAgICAgICAgdW5peF9zb2NrZXQgPSBrd2FyZ3MucG9wKCd1bml4X3NvY2tldCcsIE5vbmUpCisgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrID0ga3dhcmdzLnBvcCgndmFsaWRhdGVfY2FsbGJhY2snLCBfbWF0Y2hfaG9zdG5hbWUpCisgICAgICAgIFRTU0xCYXNlLl9faW5pdF9fKHNlbGYsIEZhbHNlLCBob3N0LCBrd2FyZ3MpCisgICAgICAgIFRTb2NrZXQuVFNvY2tldC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCB1bml4X3NvY2tldCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICAgICAgd2FybmluZ3Mud2FybigndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXMgaW5zdGVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHJldHVybiBzZWxmLmNlcnRfcmVxcyAhPSBzc2wuQ0VSVF9OT05FCisKKyAgICBAdmFsaWRhdGUuc2V0dGVyCisgICAgZGVmIHZhbGlkYXRlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgd2FybmluZ3Mud2FybigndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXMgaW5zdGVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgdmFsdWUgZWxzZSBzc2wuQ0VSVF9OT05FCisKKyAgICBkZWYgX2RvX29wZW4oc2VsZiwgZmFtaWx5LCBzb2NrdHlwZSk6CisgICAgICAgIHBsYWluX3NvY2sgPSBzb2NrZXQuc29ja2V0KGZhbWlseSwgc29ja3R5cGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl93cmFwX3NvY2tldChwbGFpbl9zb2NrKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgcGxhaW5fc29jay5jbG9zZSgpCisgICAgICAgICAgICBtc2cgPSAnZmFpbGVkIHRvIGluaXRpYWxpemUgU1NMJworICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbihtc2cpCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1zZykKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBzdXBlcihUU1NMU29ja2V0LCBzZWxmKS5vcGVuKCkKKyAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeToKKyAgICAgICAgICAgIHNlbGYucGVlcmNlcnQgPSBzZWxmLmhhbmRsZS5nZXRwZWVyY2VydCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2soc2VsZi5wZWVyY2VydCwgc2VsZi5fc2VydmVyX2hvc3RuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuaXNfdmFsaWQgPSBUcnVlCisgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgc3RyKGV4KSkKKworCitjbGFzcyBUU1NMU2VydmVyU29ja2V0KFRTb2NrZXQuVFNlcnZlclNvY2tldCwgVFNTTEJhc2UpOgorICAgICIiIlNTTCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyU29ja2V0CisKKyAgICBUaGlzIHVzZXMgdGhlIHNzbCBtb2R1bGUncyB3cmFwX3NvY2tldCgpIG1ldGhvZCB0byBwcm92aWRlIFNTTAorICAgIG5lZ290aWF0ZWQgZW5jcnlwdGlvbi4KKyAgICAiIiIKKworICAgICMgTmV3IHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSwgKipzc2xfYXJncyk6CisgICAgIyBEZXByZWNhdGVkIHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCBjZXJ0ZmlsZT0nY2VydC5wZW0nLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUG9zaXRpb25hbCBhcmd1bWVudHM6IGBgaG9zdGBgLCBgYHBvcnRgYCwgYGB1bml4X3NvY2tldGBgCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6IGBga2V5ZmlsZWBgLCBgYGNlcnRmaWxlYGAsIGBgY2VydF9yZXFzYGAsIGBgc3NsX3ZlcnNpb25gYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgY2FfY2VydHNgYCwgYGBjaXBoZXJzYGAgKFB5dGhvbiAyLjcuMCBvciBsYXRlcikKKyAgICAgICAgU2VlIHNzbC53cmFwX3NvY2tldCBkb2N1bWVudGF0aW9uLgorCisgICAgICAgIEFsdGVybmF0aXZlIGtleXdvcmQgYXJndW1lbnRzOiAoUHl0aG9uIDIuNy45IG9yIGxhdGVyKQorICAgICAgICAgIGBgc3NsX2NvbnRleHRgYDogc3NsLlNTTENvbnRleHQgdG8gYmUgdXNlZCBmb3IgU1NMQ29udGV4dC53cmFwX3NvY2tldAorICAgICAgICAgIGBgc2VydmVyX2hvc3RuYW1lYGA6IFBhc3NlZCB0byBTU0xDb250ZXh0LndyYXBfc29ja2V0CisKKyAgICAgICAgQ29tbW9uIGtleXdvcmQgYXJndW1lbnQ6CisgICAgICAgICAgYGB2YWxpZGF0ZV9jYWxsYmFja2BgIChjZXJ0LCBob3N0bmFtZSkgLT4gTm9uZToKKyAgICAgICAgICAgICAgQ2FsbGVkIGFmdGVyIFNTTCBoYW5kc2hha2UuIENhbiByYWlzZSB3aGVuIGhvc3RuYW1lIGRvZXMgbm90CisgICAgICAgICAgICAgIG1hdGNoIHRoZSBjZXJ0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA+IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50JykKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl91bml4X3NvY2tldF9hcmcoaG9zdCwgcG9ydCwgYXJncywga3dhcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDAsICdjZXJ0ZmlsZScpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDEsICd1bml4X3NvY2tldCcpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDIsICdjaXBoZXJzJykKKworICAgICAgICBpZiAnc3NsX2NvbnRleHQnIG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICAjIFByZXNlcnZlIGV4aXN0aW5nIGJlaGF2aW9ycyBmb3IgZGVmYXVsdCB2YWx1ZXMKKyAgICAgICAgICAgIGlmICdjZXJ0X3JlcXMnIG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICAgICAga3dhcmdzWydjZXJ0X3JlcXMnXSA9IHNzbC5DRVJUX05PTkUKKyAgICAgICAgICAgIGlmJ2NlcnRmaWxlJyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIGt3YXJnc1snY2VydGZpbGUnXSA9ICdjZXJ0LnBlbScKKworICAgICAgICB1bml4X3NvY2tldCA9IGt3YXJncy5wb3AoJ3VuaXhfc29ja2V0JywgTm9uZSkKKyAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2sgPSBcCisgICAgICAgICAgICBrd2FyZ3MucG9wKCd2YWxpZGF0ZV9jYWxsYmFjaycsIF9tYXRjaF9ob3N0bmFtZSkKKyAgICAgICAgVFNTTEJhc2UuX19pbml0X18oc2VsZiwgVHJ1ZSwgTm9uZSwga3dhcmdzKQorICAgICAgICBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQpCisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnkgYW5kIG5vdCBfbWF0Y2hfaGFzX2lwYWRkcmVzczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05lZWQgaXBhZGRyZXNzIGFuZCBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZSB0byB2ZXJpZnkgY2xpZW50IGNlcnRpZmljYXRlJykKKworICAgIGRlZiBzZXRDZXJ0ZmlsZShzZWxmLCBjZXJ0ZmlsZSk6CisgICAgICAgICIiIlNldCBvciBjaGFuZ2UgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmaWxlIHVzZWQgdG8gd3JhcCBuZXcKKyAgICAgICAgY29ubmVjdGlvbnMuCisKKyAgICAgICAgQHBhcmFtIGNlcnRmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpLmUuICcvZXRjL2NlcnRzL3NlcnZlci5wZW0nCisgICAgICAgIEB0eXBlIGNlcnRmaWxlOiBzdHIKKworICAgICAgICBSYWlzZXMgYW4gSU9FcnJvciBleGNlcHRpb24gaWYgdGhlIGNlcnRmaWxlIGlzIG5vdCBwcmVzZW50IG9yIHVucmVhZGFibGUuCisgICAgICAgICIiIgorICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgJ3NldENlcnRmaWxlIGlzIGRlcHJlY2F0ZWQuIHBsZWFzZSB1c2UgY2VydGZpbGUgcHJvcGVydHkgaW5zdGVhZC4nLAorICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQorCisgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgcGxhaW5fY2xpZW50LCBhZGRyID0gc2VsZi5oYW5kbGUuYWNjZXB0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5fd3JhcF9zb2NrZXQocGxhaW5fY2xpZW50KQorICAgICAgICBleGNlcHQgKHNzbC5TU0xFcnJvciwgc29ja2V0LmVycm9yLCBPU0Vycm9yKToKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0Vycm9yIHdoaWxlIGFjY2VwdGluZyBmcm9tICVzJywgYWRkcikKKyAgICAgICAgICAgICMgZmFpbGVkIGhhbmRzaGFrZS9zc2wgd3JhcCwgY2xvc2Ugc29ja2V0IHRvIGNsaWVudAorICAgICAgICAgICAgcGxhaW5fY2xpZW50LmNsb3NlKCkKKyAgICAgICAgICAgICMgcmFpc2UKKyAgICAgICAgICAgICMgV2UgY2FuJ3QgcmFpc2UgdGhlIGV4Y2VwdGlvbiwgYmVjYXVzZSBpdCBraWxscyBtb3N0IFRTZXJ2ZXIgZGVyaXZlZAorICAgICAgICAgICAgIyBzZXJ2ZSgpIG1ldGhvZHMuCisgICAgICAgICAgICAjIEluc3RlYWQsIHJldHVybiBOb25lLCBhbmQgbGV0IHRoZSBUU2VydmVyIGluc3RhbmNlIGRlYWwgd2l0aCBpdCBpbgorICAgICAgICAgICAgIyBvdGhlciBleGNlcHRpb24gaGFuZGxpbmcuICAoYnV0IFRTaW1wbGVTZXJ2ZXIgZGllcyBhbnl3YXkpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnk6CisgICAgICAgICAgICBjbGllbnQucGVlcmNlcnQgPSBjbGllbnQuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrKGNsaWVudC5wZWVyY2VydCwgYWRkclswXSkKKyAgICAgICAgICAgICAgICBjbGllbnQuaXNfdmFsaWQgPSBUcnVlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gdmFsaWRhdGUgY2xpZW50IGNlcnRpZmljYXRlIGFkZHJlc3M6ICVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyWzBdLCBleGNfaW5mbz1UcnVlKQorICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpCisgICAgICAgICAgICAgICAgcGxhaW5fY2xpZW50LmNsb3NlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJlc3VsdCA9IFRTb2NrZXQuVFNvY2tldCgpCisgICAgICAgIHJlc3VsdC5oYW5kbGUgPSBjbGllbnQKKyAgICAgICAgcmV0dXJuIHJlc3VsdApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkKaW5kZXggODcxMTk2MS4uYTdkNjYxNyAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5CkBAIC0xNywxMzMgKzE3LDE4NSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBUVHJhbnNwb3J0IGltcG9ydCAqCi1pbXBvcnQgb3MKIGltcG9ydCBlcnJubworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcwogaW1wb3J0IHNvY2tldAoraW1wb3J0IHN5cworCitmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgVFNlcnZlclRyYW5zcG9ydEJhc2UKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKIAogY2xhc3MgVFNvY2tldEJhc2UoVFRyYW5zcG9ydEJhc2UpOgotICBkZWYgX3Jlc29sdmVBZGRyKHNlbGYpOgotICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0IGlzIG5vdCBOb25lOgotICAgICAgcmV0dXJuIFsoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSwgTm9uZSwgTm9uZSwgc2VsZi5fdW5peF9zb2NrZXQpXQotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gc29ja2V0LmdldGFkZHJpbmZvKHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBzb2NrZXQuQUZfVU5TUEVDLCBzb2NrZXQuU09DS19TVFJFQU0sIDAsIHNvY2tldC5BSV9QQVNTSVZFIHwgc29ja2V0LkFJX0FERFJDT05GSUcpCisgICAgZGVmIF9yZXNvbHZlQWRkcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gWyhzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNLCBOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQpXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5nZXRhZGRyaW5mbyhzZWxmLmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc29ja2V0X2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LlNPQ0tfU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuQUlfUEFTU0lWRSB8IHNvY2tldC5BSV9BRERSQ09ORklHKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBpZiBzZWxmLmhhbmRsZToKLSAgICAgIHNlbGYuaGFuZGxlLmNsb3NlKCkKLSAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICBzZWxmLmhhbmRsZS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKwogCiBjbGFzcyBUU29ja2V0KFRTb2NrZXRCYXNlKToKLSAgIiIiU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKKyAgICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zcG9ydCBiYXNlLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUpOgotICAgICIiIkluaXRpYWxpemUgYSBUU29ja2V0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSwgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfVU5TUEVDKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIFRTb2NrZXQKIAotICAgIEBwYXJhbSBob3N0KHN0cikgIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8uCi0gICAgQHBhcmFtIHBvcnQoaW50KSAgVGhlIChUQ1ApIHBvcnQgdG8gY29ubmVjdCB0by4KLSAgICBAcGFyYW0gdW5peF9zb2NrZXQoc3RyKSAgVGhlIGZpbGVuYW1lIG9mIGEgdW5peCBzb2NrZXQgdG8gY29ubmVjdCB0by4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvc3QgYW5kIHBvcnQgd2lsbCBiZSBpZ25vcmVkLikKLSAgICAiIiIKKyAgICAgICAgQHBhcmFtIGhvc3Qoc3RyKSAgVGhlIGhvc3QgdG8gY29ubmVjdCB0by4KKyAgICAgICAgQHBhcmFtIHBvcnQoaW50KSAgVGhlIChUQ1ApIHBvcnQgdG8gY29ubmVjdCB0by4KKyAgICAgICAgQHBhcmFtIHVuaXhfc29ja2V0KHN0cikgIFRoZSBmaWxlbmFtZSBvZiBhIHVuaXggc29ja2V0IHRvIGNvbm5lY3QgdG8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaG9zdCBhbmQgcG9ydCB3aWxsIGJlIGlnbm9yZWQuKQorICAgICAgICBAcGFyYW0gc29ja2V0X2ZhbWlseShpbnQpICBUaGUgc29ja2V0IGZhbWlseSB0byB1c2Ugd2l0aCB0aGlzIHNvY2tldC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAorICAgICAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQorICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5ID0gc29ja2V0X2ZhbWlseQogCi0gICAgc2VsZi5ob3N0ID0gaG9zdAotICAgIHNlbGYucG9ydCA9IHBvcnQKLSAgICBzZWxmLmhhbmRsZSA9IE5vbmUKLSAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0Ci0gICAgc2VsZi5fdGltZW91dCA9IE5vbmUKKyAgICBkZWYgc2V0SGFuZGxlKHNlbGYsIGgpOgorICAgICAgICBzZWxmLmhhbmRsZSA9IGgKIAotICBkZWYgc2V0SGFuZGxlKHNlbGYsIGgpOgotICAgIHNlbGYuaGFuZGxlID0gaAorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZSBpcyBub3QgTm9uZQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuaGFuZGxlICE9IE5vbmUKKyAgICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6CisgICAgICAgIGlmIG1zIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdGltZW91dCA9IG1zIC8gMTAwMC4wCiAKLSAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgotICAgIGlmIG1zIGlzIE5vbmU6Ci0gICAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl90aW1lb3V0ID0gbXMvMTAwMC4wCisgICAgICAgIGlmIHNlbGYuaGFuZGxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQogCi0gICAgaWYgKHNlbGYuaGFuZGxlICE9IE5vbmUpOgotICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgIGRlZiBfZG9fb3BlbihzZWxmLCBmYW1pbHksIHNvY2t0eXBlKToKKyAgICAgICAgcmV0dXJuIHNvY2tldC5zb2NrZXQoZmFtaWx5LCBzb2NrdHlwZSkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICB0cnk6Ci0gICAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQotICAgICAgZm9yIHJlcyBpbiByZXMwOgotICAgICAgICBzZWxmLmhhbmRsZSA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCi0gICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2FkZHJlc3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl91bml4X3NvY2tldCBpZiBzZWxmLl91bml4X3NvY2tldCBlbHNlICclczolZCcgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQUxSRUFEWV9PUEVOKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgc2VsZi5oYW5kbGUuY29ubmVjdChyZXNbNF0pCi0gICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6Ci0gICAgICAgICAgaWYgcmVzIGlzIG5vdCByZXMwWy0xXToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIGUKLSAgICAgICAgYnJlYWsKLSAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgotICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gc29ja2V0ICVzJyAlIHNlbGYuX3VuaXhfc29ja2V0Ci0gICAgICBlbHNlOgotICAgICAgICBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvICVzOiVkJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtZXNzYWdlPW1lc3NhZ2UpCisgICAgICAgICAgICBhZGRycyA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgIG1zZyA9ICdmYWlsZWQgdG8gcmVzb2x2ZSBzb2NrYWRkciBmb3IgJyArIHN0cihzZWxmLl9hZGRyZXNzKQorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbihtc2cpCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1zZykKKyAgICAgICAgZm9yIGZhbWlseSwgc29ja3R5cGUsIF8sIF8sIHNvY2thZGRyIGluIGFkZHJzOgorICAgICAgICAgICAgaGFuZGxlID0gc2VsZi5fZG9fb3BlbihmYW1pbHksIHNvY2t0eXBlKQorICAgICAgICAgICAgaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBoYW5kbGUuY29ubmVjdChzb2NrYWRkcikKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZSA9IGhhbmRsZQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICBoYW5kbGUuY2xvc2UoKQorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDb3VsZCBub3QgY29ubmVjdCB0byAlcycsIHNvY2thZGRyLCBleGNfaW5mbz1UcnVlKQorICAgICAgICBtc2cgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gYW55IG9mICVzJyAlIGxpc3QobWFwKGxhbWJkYSBhOiBhWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJzKSkKKyAgICAgICAgbG9nZ2VyLmVycm9yKG1zZykKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtc2cpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIGJ1ZmYgPSBzZWxmLmhhbmRsZS5yZWN2KHN6KQotICAgIGlmIGxlbihidWZmKSA9PSAwOgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsIG1lc3NhZ2U9J1RTb2NrZXQgcmVhZCAwIGJ5dGVzJykKLSAgICByZXR1cm4gYnVmZgorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnVmZiA9IHNlbGYuaGFuZGxlLnJlY3Yoc3opCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmIChlLmFyZ3NbMF0gPT0gZXJybm8uRUNPTk5SRVNFVCBhbmQKKyAgICAgICAgICAgICAgICAgICAgKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBvciBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnZnJlZWJzZCcpKSk6CisgICAgICAgICAgICAgICAgIyBmcmVlYnNkIGFuZCBNYWNoIGRvbid0IGZvbGxvdyBQT1NJWCBzZW1hbnRpYyBvZiByZWN2CisgICAgICAgICAgICAgICAgIyBhbmQgZmFpbCB3aXRoIEVDT05OUkVTRVQgaWYgcGVlciBwZXJmb3JtZWQgc2h1dGRvd24uCisgICAgICAgICAgICAgICAgIyBTZWUgY29ycmVzcG9uZGluZyBjb21tZW50IGFuZCBjb2RlIGluIFRTb2NrZXQ6OnJlYWQoKQorICAgICAgICAgICAgICAgICMgaW4gbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwLgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICMgVHJpZ2dlciB0aGUgY2hlY2sgdG8gcmFpc2UgdGhlIEVORF9PRl9GSUxFIGV4Y2VwdGlvbiBiZWxvdy4KKyAgICAgICAgICAgICAgICBidWZmID0gJycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgaWYgbGVuKGJ1ZmYpID09IDA6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVFNvY2tldCByZWFkIDAgYnl0ZXMnKQorICAgICAgICByZXR1cm4gYnVmZgogCi0gIGRlZiB3cml0ZShzZWxmLCBidWZmKToKLSAgICBpZiBub3Qgc2VsZi5oYW5kbGU6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbWVzc2FnZT0nVHJhbnNwb3J0IG5vdCBvcGVuJykKLSAgICBzZW50ID0gMAotICAgIGhhdmUgPSBsZW4oYnVmZikKLSAgICB3aGlsZSBzZW50IDwgaGF2ZToKLSAgICAgIHBsdXMgPSBzZWxmLmhhbmRsZS5zZW5kKGJ1ZmYpCi0gICAgICBpZiBwbHVzID09IDA6Ci0gICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCBtZXNzYWdlPSdUU29ja2V0IHNlbnQgMCBieXRlcycpCi0gICAgICBzZW50ICs9IHBsdXMKLSAgICAgIGJ1ZmYgPSBidWZmW3BsdXM6XQorICAgIGRlZiB3cml0ZShzZWxmLCBidWZmKToKKyAgICAgICAgaWYgbm90IHNlbGYuaGFuZGxlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RyYW5zcG9ydCBub3Qgb3BlbicpCisgICAgICAgIHNlbnQgPSAwCisgICAgICAgIGhhdmUgPSBsZW4oYnVmZikKKyAgICAgICAgd2hpbGUgc2VudCA8IGhhdmU6CisgICAgICAgICAgICBwbHVzID0gc2VsZi5oYW5kbGUuc2VuZChidWZmKQorICAgICAgICAgICAgaWYgcGx1cyA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVFNvY2tldCBzZW50IDAgYnl0ZXMnKQorICAgICAgICAgICAgc2VudCArPSBwbHVzCisgICAgICAgICAgICBidWZmID0gYnVmZltwbHVzOl0KIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGFzcworCiAKIGNsYXNzIFRTZXJ2ZXJTb2NrZXQoVFNvY2tldEJhc2UsIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlKToKLSAgIiIiU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQgYmFzZS4iIiIKKyAgICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydCBiYXNlLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUpOgotICAgIHNlbGYuaG9zdCA9IE5vbmUKLSAgICBzZWxmLnBvcnQgPSBwb3J0Ci0gICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAotICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSwgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfVU5TUEVDKToKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuX3VuaXhfc29ja2V0ID0gdW5peF9zb2NrZXQKKyAgICAgICAgc2VsZi5fc29ja2V0X2ZhbWlseSA9IHNvY2tldF9mYW1pbHkKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgICAgIHNlbGYuX2JhY2tsb2cgPSAxMjgKIAotICBkZWYgbGlzdGVuKHNlbGYpOgotICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCi0gICAgZm9yIHJlcyBpbiByZXMwOgotICAgICAgaWYgcmVzWzBdIGlzIHNvY2tldC5BRl9JTkVUNiBvciByZXMgaXMgcmVzMFstMV06Ci0gICAgICAgIGJyZWFrCisgICAgZGVmIHNldEJhY2tsb2coc2VsZiwgYmFja2xvZz1Ob25lKToKKyAgICAgICAgaWYgbm90IHNlbGYuaGFuZGxlOgorICAgICAgICAgICAgc2VsZi5fYmFja2xvZyA9IGJhY2tsb2cKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgV2UgY2Fubid0IHVwZGF0ZSBiYWNrbG9nIHdoZW4gaXQgaXMgYWxyZWFkeSBsaXN0ZW5pbmcsIHNpbmNlIHRoZQorICAgICAgICAgICAgIyBoYW5kbGUgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCdZb3UgaGF2ZSB0byBzZXQgYmFja2xvZyBiZWZvcmUgbGlzdGVuLicpCiAKLSAgICAjIFdlIG5lZWQgcmVtb3ZlIHRoZSBvbGQgdW5peCBzb2NrZXQgaWYgdGhlIGZpbGUgZXhpc3RzIGFuZAotICAgICMgbm9ib2R5IGlzIGxpc3RlbmluZyBvbiBpdC4KLSAgICBpZiBzZWxmLl91bml4X3NvY2tldDoKLSAgICAgIHRtcCA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCi0gICAgICB0cnk6Ci0gICAgICAgIHRtcC5jb25uZWN0KHJlc1s0XSkKLSAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjoKLSAgICAgICAgZW5vLCBtZXNzYWdlID0gZXJyLmFyZ3MKLSAgICAgICAgaWYgZW5vID09IGVycm5vLkVDT05OUkVGVVNFRDoKLSAgICAgICAgICBvcy51bmxpbmsocmVzWzRdKQorICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCisgICAgICAgIHNvY2tldF9mYW1pbHkgPSBzZWxmLl9zb2NrZXRfZmFtaWx5ID09IHNvY2tldC5BRl9VTlNQRUMgYW5kIHNvY2tldC5BRl9JTkVUNiBvciBzZWxmLl9zb2NrZXRfZmFtaWx5CisgICAgICAgIGZvciByZXMgaW4gcmVzMDoKKyAgICAgICAgICAgIGlmIHJlc1swXSBpcyBzb2NrZXRfZmFtaWx5IG9yIHJlcyBpcyByZXMwWy0xXToKKyAgICAgICAgICAgICAgICBicmVhawogCi0gICAgc2VsZi5oYW5kbGUgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQotICAgIHNlbGYuaGFuZGxlLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCi0gICAgaWYgaGFzYXR0cihzZWxmLmhhbmRsZSwgJ3NldF90aW1lb3V0Jyk6Ci0gICAgICBzZWxmLmhhbmRsZS5zZXRfdGltZW91dChOb25lKQotICAgIHNlbGYuaGFuZGxlLmJpbmQocmVzWzRdKQotICAgIHNlbGYuaGFuZGxlLmxpc3RlbigxMjgpCisgICAgICAgICMgV2UgbmVlZCByZW1vdmUgdGhlIG9sZCB1bml4IHNvY2tldCBpZiB0aGUgZmlsZSBleGlzdHMgYW5kCisgICAgICAgICMgbm9ib2R5IGlzIGxpc3RlbmluZyBvbiBpdC4KKyAgICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6CisgICAgICAgICAgICB0bXAgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRtcC5jb25uZWN0KHJlc1s0XSkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgICAgIGVubywgbWVzc2FnZSA9IGVyci5hcmdzCisgICAgICAgICAgICAgICAgaWYgZW5vID09IGVycm5vLkVDT05OUkVGVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHJlc1s0XSkKIAotICBkZWYgYWNjZXB0KHNlbGYpOgotICAgIGNsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCi0gICAgcmVzdWx0ID0gVFNvY2tldCgpCi0gICAgcmVzdWx0LnNldEhhbmRsZShjbGllbnQpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBzZWxmLmhhbmRsZSA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCisgICAgICAgIHNlbGYuaGFuZGxlLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5oYW5kbGUsICdzZXR0aW1lb3V0Jyk6CisgICAgICAgICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuaGFuZGxlLmJpbmQocmVzWzRdKQorICAgICAgICBzZWxmLmhhbmRsZS5saXN0ZW4oc2VsZi5fYmFja2xvZykKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIGNsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCisgICAgICAgIHJlc3VsdCA9IFRTb2NrZXQoKQorICAgICAgICByZXN1bHQuc2V0SGFuZGxlKGNsaWVudCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkKaW5kZXggOTg1OGJiZS4uZDEzMDYwZiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5CkBAIC0xNywzMTAgKzE3LDQzOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi1mcm9tIHN0cnVjdCBpbXBvcnQgcGFjayx1bnBhY2sKK2Zyb20gc3RydWN0IGltcG9ydCBwYWNrLCB1bnBhY2sKIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgorZnJvbSAuLmNvbXBhdCBpbXBvcnQgQnVmZmVySU8KKwogCiBjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRFeGNlcHRpb24pOgorICAgICIiIkN1c3RvbSBUcmFuc3BvcnQgRXhjZXB0aW9uIGNsYXNzIiIiCiAKLSAgIiIiQ3VzdG9tIFRyYW5zcG9ydCBFeGNlcHRpb24gY2xhc3MiIiIKKyAgICBVTktOT1dOID0gMAorICAgIE5PVF9PUEVOID0gMQorICAgIEFMUkVBRFlfT1BFTiA9IDIKKyAgICBUSU1FRF9PVVQgPSAzCisgICAgRU5EX09GX0ZJTEUgPSA0CisgICAgTkVHQVRJVkVfU0laRSA9IDUKKyAgICBTSVpFX0xJTUlUID0gNgorICAgIElOVkFMSURfQ0xJRU5UX1RZUEUgPSA3CiAKLSAgVU5LTk9XTiA9IDAKLSAgTk9UX09QRU4gPSAxCi0gIEFMUkVBRFlfT1BFTiA9IDIKLSAgVElNRURfT1VUID0gMwotICBFTkRfT0ZfRklMRSA9IDQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgotICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKLSAgICBzZWxmLnR5cGUgPSB0eXBlCiAKLWNsYXNzIFRUcmFuc3BvcnRCYXNlOgorY2xhc3MgVFRyYW5zcG9ydEJhc2Uob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgdHJhbnNwb3J0IGxheWVyLiIiIgogCi0gICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCB0cmFuc3BvcnQgbGF5ZXIuIiIiCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEFsbChzZWxmLCBzeik6CisgICAgICAgIGJ1ZmYgPSBiJycKKyAgICAgICAgaGF2ZSA9IDAKKyAgICAgICAgd2hpbGUgKGhhdmUgPCBzeik6CisgICAgICAgICAgICBjaHVuayA9IHNlbGYucmVhZChzeiAtIGhhdmUpCisgICAgICAgICAgICBjaHVua0xlbiA9IGxlbihjaHVuaykKKyAgICAgICAgICAgIGhhdmUgKz0gY2h1bmtMZW4KKyAgICAgICAgICAgIGJ1ZmYgKz0gY2h1bmsKIAotICBkZWYgcmVhZEFsbChzZWxmLCBzeik6Ci0gICAgYnVmZiA9ICcnCi0gICAgaGF2ZSA9IDAKLSAgICB3aGlsZSAoaGF2ZSA8IHN6KToKLSAgICAgIGNodW5rID0gc2VsZi5yZWFkKHN6LWhhdmUpCi0gICAgICBoYXZlICs9IGxlbihjaHVuaykKLSAgICAgIGJ1ZmYgKz0gY2h1bmsKKyAgICAgICAgICAgIGlmIGNodW5rTGVuID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQogCi0gICAgICBpZiBsZW4oY2h1bmspID09IDA6Ci0gICAgICAgIHJhaXNlIEVPRkVycm9yKCkKKyAgICAgICAgcmV0dXJuIGJ1ZmYKIAotICAgIHJldHVybiBidWZmCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIHBhc3MKIAogIyBUaGlzIGNsYXNzIHNob3VsZCBiZSB0aG91Z2h0IG9mIGFzIGFuIGludGVyZmFjZS4KLWNsYXNzIENSZWFkYWJsZVRyYW5zcG9ydDoKLSAgIiIiYmFzZSBjbGFzcyBmb3IgdHJhbnNwb3J0cyB0aGF0IGFyZSByZWFkYWJsZSBmcm9tIEMiIiIKK2NsYXNzIENSZWFkYWJsZVRyYW5zcG9ydChvYmplY3QpOgorICAgICIiImJhc2UgY2xhc3MgZm9yIHRyYW5zcG9ydHMgdGhhdCBhcmUgcmVhZGFibGUgZnJvbSBDIiIiCiAKLSAgIyBUT0RPKGRyZWlzcyk6IFRoaW5rIGFib3V0IGNoYW5naW5nIHRoaXMgaW50ZXJmYWNlIHRvIGFsbG93IHVzIHRvIHVzZQotICAjICAgICAgICAgICAgICAgYSAoUHl0aG9uLCBub3QgYykgU3RyaW5nSU8gaW5zdGVhZCwgYmVjYXVzZSBpdCBhbGxvd3MKLSAgIyAgICAgICAgICAgICAgIHlvdSB0byB3cml0ZSBhZnRlciByZWFkaW5nLgorICAgICMgVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCBjaGFuZ2luZyB0aGlzIGludGVyZmFjZSB0byBhbGxvdyB1cyB0byB1c2UKKyAgICAjICAgICAgICAgICAgICAgYSAoUHl0aG9uLCBub3QgYykgU3RyaW5nSU8gaW5zdGVhZCwgYmVjYXVzZSBpdCBhbGxvd3MKKyAgICAjICAgICAgICAgICAgICAgeW91IHRvIHdyaXRlIGFmdGVyIHJlYWRpbmcuCiAKLSAgIyBOT1RFOiBUaGlzIGlzIGEgY2xhc3NpYyBjbGFzcywgc28gcHJvcGVydGllcyB3aWxsIE5PVCB3b3JrCi0gICMgICAgICAgY29ycmVjdGx5IGZvciBzZXR0aW5nLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgIiIiQSBjU3RyaW5nSU8gYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY2h1bmsgd2UgYXJlIHJlYWRpbmcuIiIiCi0gICAgcGFzcworICAgICMgTk9URTogVGhpcyBpcyBhIGNsYXNzaWMgY2xhc3MsIHNvIHByb3BlcnRpZXMgd2lsbCBOT1Qgd29yaworICAgICMgICAgICAgY29ycmVjdGx5IGZvciBzZXR0aW5nLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICAiIiJBIGNTdHJpbmdJTyBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBjaHVuayB3ZSBhcmUgcmVhZGluZy4iIiIKKyAgICAgICAgcGFzcwogCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgotICAgICIiIlJlZmlsbHMgY3N0cmluZ2lvX2J1Zi4KKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIiIiUmVmaWxscyBjc3RyaW5naW9fYnVmLgogCi0gICAgUmV0dXJucyB0aGUgY3VycmVudGx5IHVzZWQgYnVmZmVyICh3aGljaCBjYW4gYnV0IG5lZWQgbm90IGJlIHRoZSBzYW1lIGFzCi0gICAgdGhlIG9sZCBjc3RyaW5naW9fYnVmKS4gcGFydGlhbHJlYWQgaXMgd2hhdCB0aGUgQyBjb2RlIGhhcyByZWFkIGZyb20gdGhlCi0gICAgYnVmZmVyLCBhbmQgc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIGJ1ZmZlciBiZWZvcmUgYW55IG1vcmUgcmVhZHMuICBUaGUKLSAgICByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIG5ldywgbm90IGJvcnJvd2VkIHJlZmVyZW5jZS4gIFNvbWV0aGluZyBhbG9uZyB0aGUKLSAgICBsaW5lcyBvZiBzZWxmLl9idWYgc2hvdWxkIGJlIGZpbmUuCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnRseSB1c2VkIGJ1ZmZlciAod2hpY2ggY2FuIGJ1dCBuZWVkIG5vdCBiZSB0aGUgc2FtZSBhcworICAgICAgICB0aGUgb2xkIGNzdHJpbmdpb19idWYpLiBwYXJ0aWFscmVhZCBpcyB3aGF0IHRoZSBDIGNvZGUgaGFzIHJlYWQgZnJvbSB0aGUKKyAgICAgICAgYnVmZmVyLCBhbmQgc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIGJ1ZmZlciBiZWZvcmUgYW55IG1vcmUgcmVhZHMuICBUaGUKKyAgICAgICAgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBuZXcsIG5vdCBib3Jyb3dlZCByZWZlcmVuY2UuICBTb21ldGhpbmcgYWxvbmcgdGhlCisgICAgICAgIGxpbmVzIG9mIHNlbGYuX2J1ZiBzaG91bGQgYmUgZmluZS4KIAotICAgIElmIHJlcWxlbiBieXRlcyBjYW4ndCBiZSByZWFkLCB0aHJvdyBFT0ZFcnJvci4KKyAgICAgICAgSWYgcmVxbGVuIGJ5dGVzIGNhbid0IGJlIHJlYWQsIHRocm93IEVPRkVycm9yLgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisKK2NsYXNzIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLiIiIgorCisgICAgZGVmIGxpc3RlbihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCisKKworY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnlCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYSBUcmFuc3BvcnQgRmFjdG9yeSIiIgorCisgICAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiB0cmFucworCisKK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnkob2JqZWN0KToKKyAgICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBidWZmZXJlZCB0cmFuc3BvcnRzIiIiCisKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKKyAgICAgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpCisgICAgICAgIHJldHVybiBidWZmZXJlZAorCisKK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICAiIiJDbGFzcyB0aGF0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBidWZmZXJzIGl0cyBJL08uCisKKyAgICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBhIChjb25maWd1cmFibGUpIGZpeGVkLXNpemUgcmVhZCBidWZmZXIKKyAgICBidXQgYnVmZmVycyBhbGwgd3JpdGVzIHVudGlsIGEgZmx1c2ggaXMgcGVyZm9ybWVkLgogICAgICIiIgotICAgIHBhc3MKKyAgICBERUZBVUxUX0JVRkZFUiA9IDQwOTYKIAotY2xhc3MgVFNlcnZlclRyYW5zcG9ydEJhc2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCByYnVmX3NpemU9REVGQVVMVF9CVUZGRVIpOgorICAgICAgICBzZWxmLl9fdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgIyBQYXNzIHN0cmluZyBhcmd1bWVudCB0byBpbml0aWFsaXplIHJlYWQgYnVmZmVyIGFzIGNTdHJpbmdJTy5JbnB1dFR5cGUKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhiJycpCisgICAgICAgIHNlbGYuX19yYnVmX3NpemUgPSByYnVmX3NpemUKIAotICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgc2VydmVyIHRyYW5zcG9ydHMuIiIiCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQogCi0gIGRlZiBsaXN0ZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQogCi0gIGRlZiBhY2NlcHQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIGlmIGxlbihyZXQpICE9IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oc2VsZi5fX3RyYW5zLnJlYWQobWF4KHN6LCBzZWxmLl9fcmJ1Zl9zaXplKSkpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQogCi1jbGFzcyBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6CisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgIyBvbiBleGNlcHRpb24gcmVzZXQgd2J1ZiBzbyBpdCBkb2Vzbid0IGNvbnRhaW4gYSBwYXJ0aWFsIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAgICAgcmFpc2UgZQogCi0gICIiIkJhc2UgY2xhc3MgZm9yIGEgVHJhbnNwb3J0IEZhY3RvcnkiIiIKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIG91dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX190cmFucy53cml0ZShvdXQpCisgICAgICAgIHNlbGYuX190cmFucy5mbHVzaCgpCiAKLSAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucyk6Ci0gICAgcmV0dXJuIHRyYW5zCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgogCi1jbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OgorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAorICAgICAgICBpZiByZXFsZW4gPCBzZWxmLl9fcmJ1Zl9zaXplOgorICAgICAgICAgICAgIyB0cnkgdG8gbWFrZSBhIHJlYWQgb2YgYXMgbXVjaCBhcyB3ZSBjYW4uCisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5fX3RyYW5zLnJlYWQoc2VsZi5fX3JidWZfc2l6ZSkKIAotICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBidWZmZXJlZCB0cmFuc3BvcnRzIiIiCisgICAgICAgICMgYnV0IG1ha2Ugc3VyZSB3ZSBkbyByZWFkIHJlcWxlbiBieXRlcy4KKyAgICAgICAgaWYgbGVuKHJldHN0cmluZykgPCByZXFsZW46CisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5fX3RyYW5zLnJlYWRBbGwocmVxbGVuIC0gbGVuKHJldHN0cmluZykpCiAKLSAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucyk6Ci0gICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpCi0gICAgcmV0dXJuIGJ1ZmZlcmVkCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ocmV0c3RyaW5nKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAogCi1jbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsQ1JlYWRhYmxlVHJhbnNwb3J0KToKLQotICAiIiJDbGFzcyB0aGF0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBidWZmZXJzIGl0cyBJL08uIiIiCi0KLSAgREVGQVVMVF9CVUZGRVIgPSA0MDk2Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKLSAgICBzZWxmLl9fdHJhbnMgPSB0cmFucwotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oIiIpCi0KLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCi0KLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKLQotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCi0KLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCi0gICAgaWYgbGVuKHJldCkgIT0gMDoKLSAgICAgIHJldHVybiByZXQKLQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oc2VsZi5fX3RyYW5zLnJlYWQobWF4KHN6LCBzZWxmLkRFRkFVTFRfQlVGRkVSKSkpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCi0KLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQotCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fdHJhbnMud3JpdGUob3V0KQotICAgIHNlbGYuX190cmFucy5mbHVzaCgpCi0KLSAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKLQotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAotICAgIGlmIHJlcWxlbiA8IHNlbGYuREVGQVVMVF9CVUZGRVI6Ci0gICAgICAjIHRyeSB0byBtYWtlIGEgcmVhZCBvZiBhcyBtdWNoIGFzIHdlIGNhbi4KLSAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZChzZWxmLkRFRkFVTFRfQlVGRkVSKQotCi0gICAgIyBidXQgbWFrZSBzdXJlIHdlIGRvIHJlYWQgcmVxbGVuIGJ5dGVzLgotICAgIGlmIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgotICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkQWxsKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQotCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhyZXRzdHJpbmcpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmCi0KIGNsYXNzIFRNZW1vcnlCdWZmZXIoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0gICIiIldyYXBzIGEgY1N0cmluZ0lPIG9iamVjdCBhcyBhIFRUcmFuc3BvcnQuCisgICAgIiIiV3JhcHMgYSBjQnl0ZXNJTyBvYmplY3QgYXMgYSBUVHJhbnNwb3J0LgogCi0gIE5PVEU6IFVubGlrZSB0aGUgQysrIHZlcnNpb24gb2YgdGhpcyBjbGFzcywgeW91IGNhbm5vdCB3cml0ZSB0byBpdAotICAgICAgICB0aGVuIGltbWVkaWF0ZWx5IHJlYWQgZnJvbSBpdC4gIElmIHlvdSB3YW50IHRvIHJlYWQgZnJvbSBhCi0gICAgICAgIFRNZW1vcnlCdWZmZXIsIHlvdSBtdXN0IGVpdGhlciBwYXNzIGEgc3RyaW5nIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAgVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgd29yayBsaWtlIHRoZSBDKysgdmVyc2lvbi4KLSAgIiIiCisgICAgTk9URTogVW5saWtlIHRoZSBDKysgdmVyc2lvbiBvZiB0aGlzIGNsYXNzLCB5b3UgY2Fubm90IHdyaXRlIHRvIGl0CisgICAgICAgICAgdGhlbiBpbW1lZGlhdGVseSByZWFkIGZyb20gaXQuICBJZiB5b3Ugd2FudCB0byByZWFkIGZyb20gYQorICAgICAgICAgIFRNZW1vcnlCdWZmZXIsIHlvdSBtdXN0IGVpdGhlciBwYXNzIGEgc3RyaW5nIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyB3b3JrIGxpa2UgdGhlIEMrKyB2ZXJzaW9uLgorICAgICIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT1Ob25lKToKLSAgICAiIiJ2YWx1ZSAtLSBhIHZhbHVlIHRvIHJlYWQgZnJvbSBmb3Igc3RyaW5naW8KKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9Tm9uZSwgb2Zmc2V0PTApOgorICAgICAgICAiIiJ2YWx1ZSAtLSBhIHZhbHVlIHRvIHJlYWQgZnJvbSBmb3Igc3RyaW5naW8KIAotICAgIElmIHZhbHVlIGlzIHNldCwgdGhpcyB3aWxsIGJlIGEgdHJhbnNwb3J0IGZvciByZWFkaW5nLAotICAgIG90aGVyd2lzZSwgaXQgaXMgZm9yIHdyaXRpbmciIiIKLSAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKLSAgICAgIHNlbGYuX2J1ZmZlciA9IFN0cmluZ0lPKHZhbHVlKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9idWZmZXIgPSBTdHJpbmdJTygpCisgICAgICAgIElmIHZhbHVlIGlzIHNldCwgdGhpcyB3aWxsIGJlIGEgdHJhbnNwb3J0IGZvciByZWFkaW5nLAorICAgICAgICBvdGhlcndpc2UsIGl0IGlzIGZvciB3cml0aW5nIiIiCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gQnVmZmVySU8odmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBCdWZmZXJJTygpCisgICAgICAgIGlmIG9mZnNldDoKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlci5zZWVrKG9mZnNldCkKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBub3Qgc2VsZi5fYnVmZmVyLmNsb3NlZAorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fYnVmZmVyLmNsb3NlZAogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBzZWxmLl9idWZmZXIuY2xvc2UoKQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fYnVmZmVyLmNsb3NlKCkKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0dXJuIHNlbGYuX2J1ZmZlci5yZWFkKHN6KQorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1ZmZlci5yZWFkKHN6KQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX2J1ZmZlci53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX2J1ZmZlci53cml0ZShidWYpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgZ2V0dmFsdWUoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX2J1ZmZlci5nZXR2YWx1ZSgpCisgICAgZGVmIGdldHZhbHVlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyLmdldHZhbHVlKCkKIAotICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9idWZmZXIKKyAgICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1ZmZlcgogCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgotICAgICMgb25seSBvbmUgc2hvdCBhdCByZWFkaW5nLi4uCi0gICAgcmFpc2UgRU9GRXJyb3IoKQorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICAjIG9ubHkgb25lIHNob3QgYXQgcmVhZGluZy4uLgorICAgICAgICByYWlzZSBFT0ZFcnJvcigpCiAKLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OgogCi0gICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIGZyYW1lZCB0cmFuc3BvcnRzIiIiCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeShvYmplY3QpOgorICAgICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIGZyYW1lZCB0cmFuc3BvcnRzIiIiCiAKLSAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucyk6Ci0gICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydCh0cmFucykKLSAgICByZXR1cm4gZnJhbWVkCisgICAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucyk6CisgICAgICAgIGZyYW1lZCA9IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpCisgICAgICAgIHJldHVybiBmcmFtZWQKIAogCiBjbGFzcyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgorICAgICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGZyYW1lcyBpdHMgSS9PIHdoZW4gd3JpdGluZy4iIiIKIAotICAiIiJDbGFzcyB0aGF0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBmcmFtZXMgaXRzIEkvTyB3aGVuIHdyaXRpbmcuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCk6CisgICAgICAgIHNlbGYuX190cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oYicnKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsKToKLSAgICBzZWxmLl9fdHJhbnMgPSB0cmFucwotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKLSAgICBpZiBsZW4ocmV0KSAhPSAwOgotICAgICAgcmV0dXJuIHJldAorICAgICAgICBzZWxmLnJlYWRGcmFtZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQogCi0gICAgc2VsZi5yZWFkRnJhbWUoKQotICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgIGRlZiByZWFkRnJhbWUoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLl9fdHJhbnMucmVhZEFsbCg0KQorICAgICAgICBzeiwgPSB1bnBhY2soJyFpJywgYnVmZikKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhzZWxmLl9fdHJhbnMucmVhZEFsbChzeikpCiAKLSAgZGVmIHJlYWRGcmFtZShzZWxmKToKLSAgICBidWZmID0gc2VsZi5fX3RyYW5zLnJlYWRBbGwoNCkKLSAgICBzeiwgPSB1bnBhY2soJyFpJywgYnVmZikKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHNlbGYuX190cmFucy5yZWFkQWxsKHN6KSkKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHdvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHdzeiA9IGxlbih3b3V0KQorICAgICAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgIyBOLkIuOiBEb2luZyB0aGlzIHN0cmluZyBjb25jYXRlbmF0aW9uIGlzIFdBWSBjaGVhcGVyIHRoYW4gbWFraW5nCisgICAgICAgICMgdHdvIHNlcGFyYXRlIGNhbGxzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuIFNvY2tldCB3cml0ZXMgaW4KKyAgICAgICAgIyBQeXRob24gdHVybiBvdXQgdG8gYmUgUkVBTExZIGV4cGVuc2l2ZSwgYnV0IGl0IHNlZW1zIHRvIGRvIGEgcHJldHR5CisgICAgICAgICMgZ29vZCBqb2Igb2YgbWFuYWdpbmcgc3RyaW5nIGJ1ZmZlciBvcGVyYXRpb25zIHdpdGhvdXQgZXhjZXNzaXZlIGNvcGllcworICAgICAgICBidWYgPSBwYWNrKCIhaSIsIHdzeikgKyB3b3V0CisgICAgICAgIHNlbGYuX190cmFucy53cml0ZShidWYpCisgICAgICAgIHNlbGYuX190cmFucy5mbHVzaCgpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIHdvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgd3N6ID0gbGVuKHdvdXQpCi0gICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICAjIE4uQi46IERvaW5nIHRoaXMgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgV0FZIGNoZWFwZXIgdGhhbiBtYWtpbmcKLSAgICAjIHR3byBzZXBhcmF0ZSBjYWxscyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LiBTb2NrZXQgd3JpdGVzIGluCi0gICAgIyBQeXRob24gdHVybiBvdXQgdG8gYmUgUkVBTExZIGV4cGVuc2l2ZSwgYnV0IGl0IHNlZW1zIHRvIGRvIGEgcHJldHR5Ci0gICAgIyBnb29kIGpvYiBvZiBtYW5hZ2luZyBzdHJpbmcgYnVmZmVyIG9wZXJhdGlvbnMgd2l0aG91dCBleGNlc3NpdmUgY29waWVzCi0gICAgYnVmID0gcGFjaygiIWkiLCB3c3opICsgd291dAotICAgIHNlbGYuX190cmFucy53cml0ZShidWYpCi0gICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKKyAgICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKLSAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKLQotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6Ci0gICAgIyBzZWxmLl9fcmJ1ZiB3aWxsIGFscmVhZHkgYmUgZW1wdHkgaGVyZSBiZWNhdXNlIGZhc3RiaW5hcnkgZG9lc24ndAotICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAotICAgICMgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgbmV3IGZyYW1lcyBpbW1lZGlhdGVseS4KLSAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKLSAgICAgIHNlbGYucmVhZEZyYW1lKCkKLSAgICAgIHByZWZpeCArPSBzZWxmLl9fcmJ1Zi5nZXR2YWx1ZSgpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhwcmVmaXgpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgorICAgICAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0CisgICAgICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAorICAgICAgICAjIHdlIGNhbiBzdGFydCByZWFkaW5nIG5ldyBmcmFtZXMgaW1tZWRpYXRlbHkuCisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5yZWFkRnJhbWUoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhwcmVmaXgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgogCiAKIGNsYXNzIFRGaWxlT2JqZWN0VHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlKToKLSAgIiIiV3JhcHMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIG1ha2UgaXQgd29yayBhcyBhIFRocmlmdCB0cmFuc3BvcnQuIiIiCisgICAgIiIiV3JhcHMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIG1ha2UgaXQgd29yayBhcyBhIFRocmlmdCB0cmFuc3BvcnQuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmopOgotICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaik6CisgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBUcnVlCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLmZpbGVvYmoucmVhZChzeikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmoucmVhZChzeikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBzZWxmLmZpbGVvYmouZmx1c2goKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlb2JqLmZsdXNoKCkKKworCitjbGFzcyBUU2FzbENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICAiIiIKKyAgICBTQVNMIHRyYW5zcG9ydAorICAgICIiIgorCisgICAgU1RBUlQgPSAxCisgICAgT0sgPSAyCisgICAgQkFEID0gMworICAgIEVSUk9SID0gNAorICAgIENPTVBMRVRFID0gNQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtPSdHU1NBUEknLAorICAgICAgICAgICAgICAgICAqKnNhc2xfa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIHRyYW5zcG9ydDogYW4gdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gdXNlLCB0eXBpY2FsbHkganVzdCBhIFRTb2NrZXQKKyAgICAgICAgaG9zdDogdGhlIG5hbWUgb2YgdGhlIHNlcnZlciwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgc2VydmljZTogdGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHNlcnZpY2UsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCisgICAgICAgIG1lY2hhbmlzbTogdGhlIG5hbWUgb2YgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gdG8gdXNlCisKKyAgICAgICAgQWxsIG90aGVyIGt3YXJncyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcHVyZXNhc2wuY2xpZW50LlNBU0xDbGllbnQKKyAgICAgICAgY29uc3RydWN0b3IuCisgICAgICAgICIiIgorCisgICAgICAgIGZyb20gcHVyZXNhc2wuY2xpZW50IGltcG9ydCBTQVNMQ2xpZW50CisKKyAgICAgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICAgICAgc2VsZi5zYXNsID0gU0FTTENsaWVudChob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqc2FzbF9rd2FyZ3MpCisKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oYicnKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnRyYW5zcG9ydC5pc09wZW4oKToKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQorCisgICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLlNUQVJULCBzZWxmLnNhc2wubWVjaGFuaXNtKQorICAgICAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5PSywgc2VsZi5zYXNsLnByb2Nlc3MoKSkKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc3RhdHVzLCBjaGFsbGVuZ2UgPSBzZWxmLnJlY3Zfc2FzbF9tc2coKQorICAgICAgICAgICAgaWYgc3RhdHVzID09IHNlbGYuT0s6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuT0ssIHNlbGYuc2FzbC5wcm9jZXNzKGNoYWxsZW5nZSkpCisgICAgICAgICAgICBlbGlmIHN0YXR1cyA9PSBzZWxmLkNPTVBMRVRFOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNhc2wuY29tcGxldGU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzZXJ2ZXIgZXJyb25lb3VzbHkgaW5kaWNhdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGF0IFNBU0wgbmVnb3RpYXRpb24gd2FzIGNvbXBsZXRlIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAiQmFkIFNBU0wgbmVnb3RpYXRpb24gc3RhdHVzOiAlZCAoJXMpIgorICAgICAgICAgICAgICAgICAgICAlIChzdGF0dXMsIGNoYWxsZW5nZSkpCisKKyAgICBkZWYgc2VuZF9zYXNsX21zZyhzZWxmLCBzdGF0dXMsIGJvZHkpOgorICAgICAgICBoZWFkZXIgPSBwYWNrKCI+QkkiLCBzdGF0dXMsIGxlbihib2R5KSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoaGVhZGVyICsgYm9keSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKQorCisgICAgZGVmIHJlY3Zfc2FzbF9tc2coc2VsZik6CisgICAgICAgIGhlYWRlciA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoNSkKKyAgICAgICAgc3RhdHVzLCBsZW5ndGggPSB1bnBhY2soIj5CSSIsIGhlYWRlcikKKyAgICAgICAgaWYgbGVuZ3RoID4gMDoKKyAgICAgICAgICAgIHBheWxvYWQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKGxlbmd0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBheWxvYWQgPSAiIgorICAgICAgICByZXR1cm4gc3RhdHVzLCBwYXlsb2FkCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGRhdGEpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGRhdGEgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIGVuY29kZWQgPSBzZWxmLnNhc2wud3JhcChkYXRhKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZSgnJy5qb2luKChwYWNrKCIhaSIsIGxlbihlbmNvZGVkKSksIGVuY29kZWQpKSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKworICAgICAgICBzZWxmLl9yZWFkX2ZyYW1lKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCisKKyAgICBkZWYgX3JlYWRfZnJhbWUoc2VsZik6CisgICAgICAgIGhlYWRlciA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoNCkKKyAgICAgICAgbGVuZ3RoLCA9IHVucGFjaygnIWknLCBoZWFkZXIpCisgICAgICAgIGVuY29kZWQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKGxlbmd0aCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhzZWxmLnNhc2wudW53cmFwKGVuY29kZWQpKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnNhc2wuZGlzcG9zZSgpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKKworICAgICMgYmFzZWQgb24gVEZyYW1lZFRyYW5zcG9ydAorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKKworICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKKyAgICAgICAgIyBzZWxmLl9fcmJ1ZiB3aWxsIGFscmVhZHkgYmUgZW1wdHkgaGVyZSBiZWNhdXNlIGZhc3RiaW5hcnkgZG9lc24ndAorICAgICAgICAjIGFzayBmb3IgYSByZWZpbGwgdW50aWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBlbXB0eS4gIFRoZXJlZm9yZSwKKyAgICAgICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgorICAgICAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfZnJhbWUoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhwcmVmaXgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQppbmRleCBiNmRjYjRlLi5hMjdmMGFkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQpAQCAtMTYsMzAgKzE2LDMzIEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCi1mcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBpbXBsZW1lbnRzLCBJbnRlcmZhY2UsIEF0dHJpYnV0ZQotZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBQcm90b2NvbCwgU2VydmVyRmFjdG9yeSwgQ2xpZW50RmFjdG9yeSwgXAorCitmcm9tIGlvIGltcG9ydCBCeXRlc0lPCitpbXBvcnQgc3RydWN0CisKK2Zyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IGltcGxlbWVudGVyLCBJbnRlcmZhY2UsIEF0dHJpYnV0ZQorZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBTZXJ2ZXJGYWN0b3J5LCBDbGllbnRGYWN0b3J5LCBcCiAgICAgY29ubmVjdGlvbkRvbmUKIGZyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgZGVmZXIKK2Zyb20gdHdpc3RlZC5pbnRlcm5ldC50aHJlYWRzIGltcG9ydCBkZWZlclRvVGhyZWFkCiBmcm9tIHR3aXN0ZWQucHJvdG9jb2xzIGltcG9ydCBiYXNpYwotZnJvbSB0d2lzdGVkLnB5dGhvbiBpbXBvcnQgbG9nCiBmcm9tIHR3aXN0ZWQud2ViIGltcG9ydCBzZXJ2ZXIsIHJlc291cmNlLCBodHRwCiAKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAKIAogY2xhc3MgVE1lc3NhZ2VTZW5kZXJUcmFuc3BvcnQoVFRyYW5zcG9ydC5UVHJhbnNwb3J0QmFzZSk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQogCiAgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CiAgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAogICAgIGRlZiBmbHVzaChzZWxmKToKICAgICAgICAgbXNnID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgICAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICAgICAgc2VsZi5zZW5kTWVzc2FnZShtc2cpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCisgICAgICAgIHJldHVybiBzZWxmLnNlbmRNZXNzYWdlKG1zZykKIAogICAgIGRlZiBzZW5kTWVzc2FnZShzZWxmLCBtZXNzYWdlKToKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgpAQCAtNTIsNyArNTUsNyBAQAogICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCiAKICAgICBkZWYgc2VuZE1lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6Ci0gICAgICAgIHNlbGYuZnVuYyhtZXNzYWdlKQorICAgICAgICByZXR1cm4gc2VsZi5mdW5jKG1lc3NhZ2UpCiAKIAogY2xhc3MgVGhyaWZ0Q2xpZW50UHJvdG9jb2woYmFzaWMuSW50MzJTdHJpbmdSZWNlaXZlcik6CkBAIC03OSwxMSArODIsMTggQEAKICAgICAgICAgc2VsZi5zdGFydGVkLmNhbGxiYWNrKHNlbGYuY2xpZW50KQogCiAgICAgZGVmIGNvbm5lY3Rpb25Mb3N0KHNlbGYsIHJlYXNvbj1jb25uZWN0aW9uRG9uZSk6Ci0gICAgICAgIGZvciBrLHYgaW4gc2VsZi5jbGllbnQuX3JlcXMuaXRlcml0ZW1zKCk6CisgICAgICAgICMgdGhlIGNhbGxlZCBlcnJiYWNrcyBjYW4gYWRkIGl0ZW1zIHRvIG91ciBjbGllbnQncyBfcmVxcywKKyAgICAgICAgIyBzbyB3ZSBuZWVkIHRvIHVzZSBhIHRtcCwgYW5kIGl0ZXJhdGUgdW50aWwgbm8gbW9yZSByZXF1ZXN0cworICAgICAgICAjIGFyZSBhZGRlZCBkdXJpbmcgZXJyYmFja3MKKyAgICAgICAgaWYgc2VsZi5jbGllbnQ6CiAgICAgICAgICAgICB0ZXggPSBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgdHlwZT1UVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCi0gICAgICAgICAgICAgICAgbWVzc2FnZT0nQ29ubmVjdGlvbiBjbG9zZWQnKQotICAgICAgICAgICAgdi5lcnJiYWNrKHRleCkKKyAgICAgICAgICAgICAgICBtZXNzYWdlPSdDb25uZWN0aW9uIGNsb3NlZCAoJXMpJyAlIHJlYXNvbikKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuY2xpZW50Ll9yZXFzOgorICAgICAgICAgICAgICAgIF8sIHYgPSBzZWxmLmNsaWVudC5fcmVxcy5wb3BpdGVtKCkKKyAgICAgICAgICAgICAgICB2LmVycmJhY2sodGV4KQorICAgICAgICAgICAgZGVsIHNlbGYuY2xpZW50Ll9yZXFzCisgICAgICAgICAgICBzZWxmLmNsaWVudCA9IE5vbmUKIAogICAgIGRlZiBzdHJpbmdSZWNlaXZlZChzZWxmLCBmcmFtZSk6CiAgICAgICAgIHRyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGZyYW1lKQpAQCAtOTksNiArMTA5LDEwOCBAQAogICAgICAgICBtZXRob2QoaXByb3QsIG10eXBlLCByc2VxaWQpCiAKIAorY2xhc3MgVGhyaWZ0U0FTTENsaWVudFByb3RvY29sKFRocmlmdENsaWVudFByb3RvY29sKToKKworICAgIFNUQVJUID0gMQorICAgIE9LID0gMgorICAgIEJBRCA9IDMKKyAgICBFUlJPUiA9IDQKKyAgICBDT01QTEVURSA9IDUKKworICAgIE1BWF9MRU5HVEggPSAyICoqIDMxIC0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNsaWVudF9jbGFzcywgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lLAorICAgICAgICAgICAgICAgICBob3N0PU5vbmUsIHNlcnZpY2U9Tm9uZSwgbWVjaGFuaXNtPSdHU1NBUEknLCAqKnNhc2xfa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIGhvc3Q6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCisgICAgICAgIHNlcnZpY2U6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIncyBzZXJ2aWNlLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQorICAgICAgICBtZWNoYW5pc206IHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIHRvIHVzZQorCisgICAgICAgIEFsbCBvdGhlciBrd2FyZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHB1cmVzYXNsLmNsaWVudC5TQVNMQ2xpZW50CisgICAgICAgIGNvbnN0cnVjdG9yLgorICAgICAgICAiIiIKKworICAgICAgICBmcm9tIHB1cmVzYXNsLmNsaWVudCBpbXBvcnQgU0FTTENsaWVudAorICAgICAgICBzZWxmLlNBU0xDTGllbnQgPSBTQVNMQ2xpZW50CisKKyAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuX19pbml0X18oc2VsZiwgY2xpZW50X2NsYXNzLCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5KQorCisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQgPSBOb25lCisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fc3RhdHVzID0gTm9uZQorICAgICAgICBzZWxmLmNsaWVudCA9IE5vbmUKKworICAgICAgICBpZiBob3N0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jcmVhdGVTQVNMQ2xpZW50KGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbSwgKipzYXNsX2t3YXJncykKKworICAgIGRlZiBjcmVhdGVTQVNMQ2xpZW50KHNlbGYsIGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbSwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLnNhc2wgPSBzZWxmLlNBU0xDbGllbnQoaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtLCAqKmt3YXJncykKKworICAgIGRlZiBkaXNwYXRjaChzZWxmLCBtc2cpOgorICAgICAgICBlbmNvZGVkID0gc2VsZi5zYXNsLndyYXAobXNnKQorICAgICAgICBsZW5fYW5kX2VuY29kZWQgPSAnJy5qb2luKChzdHJ1Y3QucGFjaygnIWknLCBsZW4oZW5jb2RlZCkpLCBlbmNvZGVkKSkKKyAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuZGlzcGF0Y2goc2VsZiwgbGVuX2FuZF9lbmNvZGVkKQorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcworICAgIGRlZiBjb25uZWN0aW9uTWFkZShzZWxmKToKKyAgICAgICAgc2VsZi5fc2VuZFNBU0xNZXNzYWdlKHNlbGYuU1RBUlQsIHNlbGYuc2FzbC5tZWNoYW5pc20pCisgICAgICAgIGluaXRpYWxfbWVzc2FnZSA9IHlpZWxkIGRlZmVyVG9UaHJlYWQoc2VsZi5zYXNsLnByb2Nlc3MpCisgICAgICAgIHNlbGYuX3NlbmRTQVNMTWVzc2FnZShzZWxmLk9LLCBpbml0aWFsX21lc3NhZ2UpCisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHN0YXR1cywgY2hhbGxlbmdlID0geWllbGQgc2VsZi5fcmVjZWl2ZVNBU0xNZXNzYWdlKCkKKyAgICAgICAgICAgIGlmIHN0YXR1cyA9PSBzZWxmLk9LOgorICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgZGVmZXJUb1RocmVhZChzZWxmLnNhc2wucHJvY2VzcywgY2hhbGxlbmdlKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRTQVNMTWVzc2FnZShzZWxmLk9LLCByZXNwb25zZSkKKyAgICAgICAgICAgIGVsaWYgc3RhdHVzID09IHNlbGYuQ09NUExFVEU6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuc2FzbC5jb21wbGV0ZToKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gIlRoZSBzZXJ2ZXIgZXJyb25lb3VzbHkgaW5kaWNhdGVkIHRoYXQgU0FTTCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ290aWF0aW9uIHdhcyBjb21wbGV0ZSIKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKG1zZywgbWVzc2FnZT1tc2cpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbXNnID0gIkJhZCBTQVNMIG5lZ290aWF0aW9uIHN0YXR1czogJWQgKCVzKSIgJSAoc3RhdHVzLCBjaGFsbGVuZ2UpCisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKG1zZywgbWVzc2FnZT1tc2cpCisKKyAgICAgICAgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZCA9IE5vbmUKKyAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuY29ubmVjdGlvbk1hZGUoc2VsZikKKworICAgIGRlZiBfc2VuZFNBU0xNZXNzYWdlKHNlbGYsIHN0YXR1cywgYm9keSk6CisgICAgICAgIGlmIGJvZHkgaXMgTm9uZToKKyAgICAgICAgICAgIGJvZHkgPSAiIgorICAgICAgICBoZWFkZXIgPSBzdHJ1Y3QucGFjaygiPkJJIiwgc3RhdHVzLCBsZW4oYm9keSkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKGhlYWRlciArIGJvZHkpCisKKyAgICBkZWYgX3JlY2VpdmVTQVNMTWVzc2FnZShzZWxmKToKKyAgICAgICAgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZCA9IGRlZmVyLkRlZmVycmVkKCkKKyAgICAgICAgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9zdGF0dXMgPSBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkCisKKyAgICBkZWYgY29ubmVjdGlvbkxvc3Qoc2VsZiwgcmVhc29uPWNvbm5lY3Rpb25Eb25lKToKKyAgICAgICAgaWYgc2VsZi5jbGllbnQ6CisgICAgICAgICAgICBUaHJpZnRDbGllbnRQcm90b2NvbC5jb25uZWN0aW9uTG9zdChzZWxmLCByZWFzb24pCisKKyAgICBkZWYgZGF0YVJlY2VpdmVkKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkOgorICAgICAgICAgICAgIyB3ZSBnb3QgYSBzYXNsIGNoYWxsZW5nZSBpbiB0aGUgZm9ybWF0IChzdGF0dXMsIGxlbmd0aCwgY2hhbGxlbmdlKQorICAgICAgICAgICAgIyBzYXZlIHRoZSBzdGF0dXMsIGxldCBJbnROU3RyaW5nUmVjZWl2ZXIgcGllY2UgdGhlIGNoYWxsZW5nZSBkYXRhIHRvZ2V0aGVyCisgICAgICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX3N0YXR1cywgPSBzdHJ1Y3QudW5wYWNrKCJCIiwgZGF0YVswXSkKKyAgICAgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLmRhdGFSZWNlaXZlZChzZWxmLCBkYXRhWzE6XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbm9ybWFsIGZyYW1lLCBsZXQgSW50TlN0cmluZ1JlY2VpdmVyIHBpZWNlIGl0IHRvZ2V0aGVyCisgICAgICAgICAgICBUaHJpZnRDbGllbnRQcm90b2NvbC5kYXRhUmVjZWl2ZWQoc2VsZiwgZGF0YSkKKworICAgIGRlZiBzdHJpbmdSZWNlaXZlZChzZWxmLCBmcmFtZSk6CisgICAgICAgIGlmIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQ6CisgICAgICAgICAgICAjIHRoZSBmcmFtZSBpcyBqdXN0IGEgU0FTTCBjaGFsbGVuZ2UKKyAgICAgICAgICAgIHJlc3BvbnNlID0gKHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fc3RhdHVzLCBmcmFtZSkKKyAgICAgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQuY2FsbGJhY2socmVzcG9uc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRoZXJlJ3MgYSBzZWNvbmQgNCBieXRlIGxlbmd0aCBwcmVmaXggaW5zaWRlIHRoZSBmcmFtZQorICAgICAgICAgICAgZGVjb2RlZF9mcmFtZSA9IHNlbGYuc2FzbC51bndyYXAoZnJhbWVbNDpdKQorICAgICAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuc3RyaW5nUmVjZWl2ZWQoc2VsZiwgZGVjb2RlZF9mcmFtZSkKKworCiBjbGFzcyBUaHJpZnRTZXJ2ZXJQcm90b2NvbChiYXNpYy5JbnQzMlN0cmluZ1JlY2VpdmVyKToKIAogICAgIE1BWF9MRU5HVEggPSAyICoqIDMxIC0gMQpAQCAtMTI0LDcgKzIzNiw3IEBACiAKICAgICAgICAgZCA9IHNlbGYuZmFjdG9yeS5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCiAgICAgICAgIGQuYWRkQ2FsbGJhY2tzKHNlbGYucHJvY2Vzc09rLCBzZWxmLnByb2Nlc3NFcnJvciwKLSAgICAgICAgICAgIGNhbGxiYWNrQXJncz0odG1vLCkpCisgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQXJncz0odG1vLCkpCiAKIAogY2xhc3MgSVRocmlmdFNlcnZlckZhY3RvcnkoSW50ZXJmYWNlKToKQEAgLTE0NSwxMCArMjU3LDkgQEAKICAgICBvcHJvdF9mYWN0b3J5ID0gQXR0cmlidXRlKCJPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeSIpCiAKIAorQGltcGxlbWVudGVyKElUaHJpZnRTZXJ2ZXJGYWN0b3J5KQogY2xhc3MgVGhyaWZ0U2VydmVyRmFjdG9yeShTZXJ2ZXJGYWN0b3J5KToKIAotICAgIGltcGxlbWVudHMoSVRocmlmdFNlcnZlckZhY3RvcnkpCi0KICAgICBwcm90b2NvbCA9IFRocmlmdFNlcnZlclByb3RvY29sCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOgpAQCAtMTYwLDEwICsyNzEsOSBAQAogICAgICAgICAgICAgc2VsZi5vcHJvdF9mYWN0b3J5ID0gb3Byb3RfZmFjdG9yeQogCiAKK0BpbXBsZW1lbnRlcihJVGhyaWZ0Q2xpZW50RmFjdG9yeSkKIGNsYXNzIFRocmlmdENsaWVudEZhY3RvcnkoQ2xpZW50RmFjdG9yeSk6CiAKLSAgICBpbXBsZW1lbnRzKElUaHJpZnRDbGllbnRGYWN0b3J5KQotCiAgICAgcHJvdG9jb2wgPSBUaHJpZnRDbGllbnRQcm90b2NvbAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNsaWVudF9jbGFzcywgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lKToKQEAgLTE3Niw3ICsyODYsNyBAQAogCiAgICAgZGVmIGJ1aWxkUHJvdG9jb2woc2VsZiwgYWRkcik6CiAgICAgICAgIHAgPSBzZWxmLnByb3RvY29sKHNlbGYuY2xpZW50X2NsYXNzLCBzZWxmLmlwcm90X2ZhY3RvcnksCi0gICAgICAgICAgICBzZWxmLm9wcm90X2ZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3Byb3RfZmFjdG9yeSkKICAgICAgICAgcC5mYWN0b3J5ID0gc2VsZgogICAgICAgICByZXR1cm4gcAogCkBAIC0xODYsNyArMjk2LDcgQEAKICAgICBhbGxvd2VkTWV0aG9kcyA9ICgnUE9TVCcsKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lKToKKyAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUpOgogICAgICAgICByZXNvdXJjZS5SZXNvdXJjZS5fX2luaXRfXyhzZWxmKQogICAgICAgICBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKICAgICAgICAgaWYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IGlzIE5vbmU6CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDg1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weQpAQCAtMCwwICsxLDI0OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyIiIlRabGliVHJhbnNwb3J0IHByb3ZpZGVzIGEgY29tcHJlc3NlZCB0cmFuc3BvcnQgYW5kIHRyYW5zcG9ydCBmYWN0b3J5CitjbGFzcywgdXNpbmcgdGhlIHB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5IHpsaWIgbW9kdWxlIHRvIGltcGxlbWVudAorZGF0YSBjb21wcmVzc2lvbi4KKyIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitpbXBvcnQgemxpYgorZnJvbSAuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydAorZnJvbSAuLmNvbXBhdCBpbXBvcnQgQnVmZmVySU8KKworCitjbGFzcyBUWmxpYlRyYW5zcG9ydEZhY3Rvcnkob2JqZWN0KToKKyAgICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyB6bGliIGNvbXByZXNzZWQgdHJhbnNwb3J0cy4KKworICAgIFRoaXMgZmFjdG9yeSBjYWNoZXMgdGhlIGxhc3Qgc2luZ2xlIGNsaWVudC90cmFuc3BvcnQgdGhhdCBpdCB3YXMgcGFzc2VkCisgICAgYW5kIHJldHVybnMgdGhlIHNhbWUgVFpsaWJUcmFuc3BvcnQgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuCisKKyAgICBUaGlzIGNhY2hpbmcgbWVhbnMgdGhlIFRTZXJ2ZXIgY2xhc3Mgd2lsbCBnZXQgdGhlIF9zYW1lXyB0cmFuc3BvcnQKKyAgICBvYmplY3QgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzIGZyb20gdGhpcyBmYWN0b3J5LgorICAgIChGb3Igbm9uLXRocmVhZGVkIHNjZW5hcmlvcyBvbmx5LCBzaW5jZSB0aGUgY2FjaGUgb25seSBob2xkcyBvbmUgb2JqZWN0KQorCisgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBjYWNoaW5nIGlzIHRvIGFsbG9jYXRlIG9ubHkgb25lIFRabGliVHJhbnNwb3J0IHdoZXJlCisgICAgb25seSBvbmUgaXMgcmVhbGx5IG5lZWRlZCAoc2luY2UgaXQgbXVzdCBoYXZlIHNlcGFyYXRlIHJlYWQvd3JpdGUgYnVmZmVycyksCisgICAgYW5kIG1ha2VzIHRoZSBzdGF0aXN0aWNzIGZyb20gZ2V0Q29tcFNhdmluZ3MoKSBhbmQgZ2V0Q29tcFJhdGlvKCkKKyAgICBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KKyAgICAiIiIKKyAgICAjIGNsYXNzIHNjb3BlZCBjYWNoZSBvZiBsYXN0IHRyYW5zcG9ydCBnaXZlbiBhbmQgemxpYnRyYW5zcG9ydCByZXR1cm5lZAorICAgIF9sYXN0X3RyYW5zID0gTm9uZQorICAgIF9sYXN0X3ogPSBOb25lCisKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zLCBjb21wcmVzc2xldmVsPTkpOgorICAgICAgICAiIiJXcmFwIGEgdHJhbnNwb3J0LCB0cmFucywgd2l0aCB0aGUgVFpsaWJUcmFuc3BvcnQKKyAgICAgICAgY29tcHJlc3NlZCB0cmFuc3BvcnQgY2xhc3MsIHJldHVybmluZyBhIG5ldworICAgICAgICB0cmFuc3BvcnQgdG8gdGhlIGNhbGxlci4KKworICAgICAgICBAcGFyYW0gY29tcHJlc3NsZXZlbDogVGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIHJhbmdpbmcKKyAgICAgICAgZnJvbSAwIChubyBjb21wcmVzc2lvbikgdG8gOSAoYmVzdCBjb21wcmVzc2lvbikuICBEZWZhdWx0cyB0byA5LgorICAgICAgICBAdHlwZSBjb21wcmVzc2xldmVsOiBpbnQKKworICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgVFpsaWJUcmFuc3BvcnQgd2hpY2ggd3JhcHMgdGhlCisgICAgICAgIHBhc3NlZCBDe3RyYW5zfSBUVHJhbnNwb3J0IGRlcml2ZWQgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBpZiB0cmFucyA9PSBzZWxmLl9sYXN0X3RyYW5zOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xhc3RfegorICAgICAgICB6dHJhbnMgPSBUWmxpYlRyYW5zcG9ydCh0cmFucywgY29tcHJlc3NsZXZlbCkKKyAgICAgICAgc2VsZi5fbGFzdF90cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuX2xhc3RfeiA9IHp0cmFucworICAgICAgICByZXR1cm4genRyYW5zCisKKworY2xhc3MgVFpsaWJUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6CisgICAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhIHRyYW5zcG9ydCB3aXRoIHpsaWIsIGNvbXByZXNzaW5nIHdyaXRlcworICAgIGFuZCBkZWNvbXByZXNzZXMgcmVhZHMsIHVzaW5nIHRoZSBweXRob24gc3RhbmRhcmQKKyAgICBsaWJyYXJ5IHpsaWIgbW9kdWxlLgorICAgICIiIgorICAgICMgUmVhZCBidWZmZXIgc2l6ZSBmb3IgdGhlIHB5dGhvbiBmYXN0YmluYXJ5IEMgZXh0ZW5zaW9uLAorICAgICMgdGhlIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGNsYXNzLgorICAgIERFRkFVTFRfQlVGRlNJWkUgPSA0MDk2CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIGNvbXByZXNzbGV2ZWw9OSk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBUWmxpYlRyYW5zcG9ydCwgd3JhcHBpbmcgQ3t0cmFuc30sIGFub3RoZXIKKyAgICAgICAgVFRyYW5zcG9ydCBkZXJpdmVkIG9iamVjdC4KKworICAgICAgICBAcGFyYW0gdHJhbnM6IEEgdGhyaWZ0IHRyYW5zcG9ydCBvYmplY3QsIGkuZS4gYSBUU29ja2V0KCkgb2JqZWN0LgorICAgICAgICBAdHlwZSB0cmFuczogVFRyYW5zcG9ydAorICAgICAgICBAcGFyYW0gY29tcHJlc3NsZXZlbDogVGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIHJhbmdpbmcKKyAgICAgICAgZnJvbSAwIChubyBjb21wcmVzc2lvbikgdG8gOSAoYmVzdCBjb21wcmVzc2lvbikuICBEZWZhdWx0IGlzIDkuCisgICAgICAgIEB0eXBlIGNvbXByZXNzbGV2ZWw6IGludAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5jb21wcmVzc2xldmVsID0gY29tcHJlc3NsZXZlbAorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX2luaXRfemxpYigpCisgICAgICAgIHNlbGYuX2luaXRfc3RhdHMoKQorCisgICAgZGVmIF9yZWluaXRfYnVmZmVycyhzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kIHRvIGluaXRpYWxpemUvcmVzZXQgdGhlIGludGVybmFsIFN0cmluZ0lPIG9iamVjdHMKKyAgICAgICAgZm9yIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisKKyAgICBkZWYgX2luaXRfc3RhdHMoc2VsZik6CisgICAgICAgICIiIkludGVybmFsIG1ldGhvZCB0byByZXNldCB0aGUgaW50ZXJuYWwgc3RhdGlzdGljcyBjb3VudGVycworICAgICAgICBmb3IgY29tcHJlc3Npb24gcmF0aW9zIGFuZCBiYW5kd2lkdGggc2F2aW5ncy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYnl0ZXNfaW4gPSAwCisgICAgICAgIHNlbGYuYnl0ZXNfb3V0ID0gMAorICAgICAgICBzZWxmLmJ5dGVzX2luX2NvbXAgPSAwCisgICAgICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgPSAwCisKKyAgICBkZWYgX2luaXRfemxpYihzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kIGZvciBzZXR0aW5nIHVwIHRoZSB6bGliIGNvbXByZXNzaW9uIGFuZAorICAgICAgICBkZWNvbXByZXNzaW9uIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl96Y29tcF9yZWFkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgc2VsZi5femNvbXBfd3JpdGUgPSB6bGliLmNvbXByZXNzb2JqKHNlbGYuY29tcHJlc3NsZXZlbCkKKworICAgIGRlZiBnZXRDb21wUmF0aW8oc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgY3VycmVudCBtZWFzdXJlZCBjb21wcmVzc2lvbiByYXRpb3MgKGluLG91dCkgZnJvbQorICAgICAgICB0aGlzIHRyYW5zcG9ydC4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgb2Y6CisgICAgICAgIChpbmJvdW5kX2NvbXByZXNzaW9uX3JhdGlvLCBvdXRib3VuZF9jb21wcmVzc2lvbl9yYXRpbykKKworICAgICAgICBUaGUgY29tcHJlc3Npb24gcmF0aW9zIGFyZSBjb21wdXRlZCBhczoKKyAgICAgICAgICAgIGNvbXByZXNzZWQgLyB1bmNvbXByZXNzZWQKKworICAgICAgICBFLmcuLCBkYXRhIHRoYXQgY29tcHJlc3NlcyBieSAxMHggd2lsbCBoYXZlIGEgcmF0aW8gb2Y6IDAuMTAKKyAgICAgICAgYW5kIGRhdGEgdGhhdCBjb21wcmVzc2VzIHRvIGhhbGYgb2YgdHMgb3JpZ2luYWwgc2l6ZSB3aWxsCisgICAgICAgIGhhdmUgYSByYXRpbyBvZiAwLjUKKworICAgICAgICBOb25lIGlzIHJldHVybmVkIGlmIG5vIGJ5dGVzIGhhdmUgeWV0IGJlZW4gcHJvY2Vzc2VkIGluCisgICAgICAgIGEgcGFydGljdWxhciBkaXJlY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICByX3BlcmNlbnQsIHdfcGVyY2VudCA9IChOb25lLCBOb25lKQorICAgICAgICBpZiBzZWxmLmJ5dGVzX2luID4gMDoKKyAgICAgICAgICAgIHJfcGVyY2VudCA9IHNlbGYuYnl0ZXNfaW5fY29tcCAvIHNlbGYuYnl0ZXNfaW4KKyAgICAgICAgaWYgc2VsZi5ieXRlc19vdXQgPiAwOgorICAgICAgICAgICAgd19wZXJjZW50ID0gc2VsZi5ieXRlc19vdXRfY29tcCAvIHNlbGYuYnl0ZXNfb3V0CisgICAgICAgIHJldHVybiAocl9wZXJjZW50LCB3X3BlcmNlbnQpCisKKyAgICBkZWYgZ2V0Q29tcFNhdmluZ3Moc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgY3VycmVudCBjb3VudCBvZiBzYXZlZCBieXRlcyBkdWUgdG8gZGF0YQorICAgICAgICBjb21wcmVzc2lvbi4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgb2Y6CisgICAgICAgIChpbmJvdW5kX3NhdmVkX2J5dGVzLCBvdXRib3VuZF9zYXZlZF9ieXRlcykKKworICAgICAgICBOb3RlOiBpZiBjb21wcmVzc2lvbiBpcyBhY3R1YWxseSBleHBhbmRpbmcgeW91cgorICAgICAgICBkYXRhIChvbmx5IGxpa2VseSB3aXRoIHZlcnkgdGlueSB0aHJpZnQgb2JqZWN0cyksIHRoZW4KKyAgICAgICAgdGhlIHZhbHVlcyByZXR1cm5lZCB3aWxsIGJlIG5lZ2F0aXZlLgorICAgICAgICAiIiIKKyAgICAgICAgcl9zYXZlZCA9IHNlbGYuYnl0ZXNfaW4gLSBzZWxmLmJ5dGVzX2luX2NvbXAKKyAgICAgICAgd19zYXZlZCA9IHNlbGYuYnl0ZXNfb3V0IC0gc2VsZi5ieXRlc19vdXRfY29tcAorICAgICAgICByZXR1cm4gKHJfc2F2ZWQsIHdfc2F2ZWQpCisKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3Mgb3BlbiBzdGF0dXMiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgICIiIk9wZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCisgICAgICAgIHNlbGYuX2luaXRfc3RhdHMoKQorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQorCisgICAgZGVmIGxpc3RlbihzZWxmKToKKyAgICAgICAgIiIiSW52b2tlIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCdzIGxpc3RlbigpIG1ldGhvZCIiIgorICAgICAgICBzZWxmLl9fdHJhbnMubGlzdGVuKCkKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgICIiIkFjY2VwdCBjb25uZWN0aW9ucyBvbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5hY2NlcHQoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIiIiCisgICAgICAgIHNlbGYuX3JlaW5pdF9idWZmZXJzKCkKKyAgICAgICAgc2VsZi5faW5pdF96bGliKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCisKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgICIiIlJlYWQgdXAgdG8gc3ogYnl0ZXMgZnJvbSB0aGUgZGVjb21wcmVzc2VkIGJ5dGVzIGJ1ZmZlciwgYW5kCisgICAgICAgIHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgdGhlIGRlY29tcHJlc3Npb24KKyAgICAgICAgYnVmZmVyIGlzIGVtcHR5LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgPiAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICAjIGtlZXAgcmVhZGluZyBmcm9tIHRyYW5zcG9ydCB1bnRpbCBzb21ldGhpbmcgY29tZXMgYmFjaworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc2VsZi5yZWFkQ29tcChzeik6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIHJlYWRDb21wKHNlbGYsIHN6KToKKyAgICAgICAgIiIiUmVhZCBjb21wcmVzc2VkIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHRoZW4KKyAgICAgICAgZGVjb21wcmVzcyBpdCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBpbnRlcm5hbCBTdHJpbmdJTyByZWFkIGJ1ZmZlcgorICAgICAgICAiIiIKKyAgICAgICAgemJ1ZiA9IHNlbGYuX190cmFucy5yZWFkKHN6KQorICAgICAgICB6YnVmID0gc2VsZi5femNvbXBfcmVhZC51bmNvbnN1bWVkX3RhaWwgKyB6YnVmCisgICAgICAgIGJ1ZiA9IHNlbGYuX3pjb21wX3JlYWQuZGVjb21wcmVzcyh6YnVmKQorICAgICAgICBzZWxmLmJ5dGVzX2luICs9IGxlbih6YnVmKQorICAgICAgICBzZWxmLmJ5dGVzX2luX2NvbXAgKz0gbGVuKGJ1ZikKKyAgICAgICAgb2xkID0gc2VsZi5fX3JidWYucmVhZCgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ob2xkICsgYnVmKQorICAgICAgICBpZiBsZW4ob2xkKSArIGxlbihidWYpID09IDA6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICAiIiJXcml0ZSBzb21lIGJ5dGVzLCBwdXR0aW5nIHRoZW0gaW50byB0aGUgaW50ZXJuYWwgd3JpdGUKKyAgICAgICAgYnVmZmVyIGZvciBldmVudHVhbCBjb21wcmVzc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiRmx1c2ggYW55IHF1ZXVlZCB1cCBkYXRhIGluIHRoZSB3cml0ZSBidWZmZXIgYW5kIGVuc3VyZSB0aGUKKyAgICAgICAgY29tcHJlc3Npb24gYnVmZmVyIGlzIGZsdXNoZWQgb3V0IHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgICAiIiIKKyAgICAgICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgaWYgbGVuKHdvdXQpID4gMDoKKyAgICAgICAgICAgIHpidWYgPSBzZWxmLl96Y29tcF93cml0ZS5jb21wcmVzcyh3b3V0KQorICAgICAgICAgICAgc2VsZi5ieXRlc19vdXQgKz0gbGVuKHdvdXQpCisgICAgICAgICAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6YnVmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemJ1ZiA9ICcnCisgICAgICAgIHp0YWlsID0gc2VsZi5femNvbXBfd3JpdGUuZmx1c2goemxpYi5aX1NZTkNfRkxVU0gpCisgICAgICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgKz0gbGVuKHp0YWlsKQorICAgICAgICBpZiAobGVuKHpidWYpICsgbGVuKHp0YWlsKSkgPiAwOgorICAgICAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICAgICBzZWxmLl9fdHJhbnMud3JpdGUoemJ1ZiArIHp0YWlsKQorICAgICAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgICIiIkltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZSIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKKworICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICAiIiJJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UgZm9yIHJlZmlsbCIiIgorICAgICAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAorICAgICAgICBpZiByZXFsZW4gPCBzZWxmLkRFRkFVTFRfQlVGRlNJWkU6CisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5yZWFkKHNlbGYuREVGQVVMVF9CVUZGU0laRSkKKyAgICAgICAgd2hpbGUgbGVuKHJldHN0cmluZykgPCByZXFsZW46CisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5yZWFkKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHJldHN0cmluZykKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9fX2luaXRfXy5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L19faW5pdF9fLnB5CmluZGV4IDAyYzYwNDguLmM5NTk2ZDkgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L19faW5pdF9fLnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L19faW5pdF9fLnB5CkBAIC0xNyw0ICsxNyw0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1fX2FsbF9fID0gWydUVHJhbnNwb3J0JywgJ1RTb2NrZXQnLCAnVEh0dHBDbGllbnQnXQorX19hbGxfXyA9IFsnVFRyYW5zcG9ydCcsICdUU29ja2V0JywgJ1RIdHRwQ2xpZW50JywgJ1RabGliVHJhbnNwb3J0J10KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L3NzbGNvbXBhdC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L3NzbGNvbXBhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjAwY2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5CkBAIC0wLDAgKzEsMTAwIEBACisjCisjIGxpY2Vuc2VkIHRvIHRoZSBhcGFjaGUgc29mdHdhcmUgZm91bmRhdGlvbiAoYXNmKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIHNlZSB0aGUgbm90aWNlIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIHRoZSBhc2YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgYXBhY2hlIGxpY2Vuc2UsIHZlcnNpb24gMi4wICh0aGUKKyMgImxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBsaWNlbnNlLiB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvbGljZW5zZS0yLjAKKyMKKyMgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgbGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiYXMgaXMiIGJhc2lzLCB3aXRob3V0IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBhbnkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzeXMKKworZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKKworZGVmIGxlZ2FjeV92YWxpZGF0ZV9jYWxsYmFjayhjZXJ0LCBob3N0bmFtZSk6CisgICAgIiIibGVnYWN5IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgcGVlcidzIFNTTCBjZXJ0aWZpY2F0ZSwgYW5kIHRvIGNoZWNrCisgICAgdGhlIGNvbW1vbk5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIHRvIGVuc3VyZSBpdCBtYXRjaGVzIHRoZSBob3N0bmFtZSB3ZQorICAgIHVzZWQgdG8gbWFrZSB0aGlzIGNvbm5lY3Rpb24uICBEb2VzIG5vdCBzdXBwb3J0IHN1YmplY3RBbHROYW1lIHJlY29yZHMKKyAgICBpbiBjZXJ0aWZpY2F0ZXMuCisKKyAgICByYWlzZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGUgY2VydGlmaWNhdGUgZmFpbHMgdmFsaWRhdGlvbi4KKyAgICAiIiIKKyAgICBpZiAnc3ViamVjdCcgbm90IGluIGNlcnQ6CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgJ05vIFNTTCBjZXJ0aWZpY2F0ZSBmb3VuZCBmcm9tICVzJyAlIGhvc3RuYW1lKQorICAgIGZpZWxkcyA9IGNlcnRbJ3N1YmplY3QnXQorICAgIGZvciBmaWVsZCBpbiBmaWVsZHM6CisgICAgICAgICMgZW5zdXJlIHN0cnVjdHVyZSB3ZSBnZXQgYmFjayBpcyB3aGF0IHdlIGV4cGVjdAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmaWVsZCwgdHVwbGUpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgY2VydF9wYWlyID0gZmllbGRbMF0KKyAgICAgICAgaWYgbGVuKGNlcnRfcGFpcikgPCAyOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgY2VydF9rZXksIGNlcnRfdmFsdWUgPSBjZXJ0X3BhaXJbMDoyXQorICAgICAgICBpZiBjZXJ0X2tleSAhPSAnY29tbW9uTmFtZSc6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0aG9zdCA9IGNlcnRfdmFsdWUKKyAgICAgICAgIyB0aGlzIGNoZWNrIHNob3VsZCBiZSBwZXJmb3JtZWQgYnkgc29tZSBzb3J0IG9mIEFjY2VzcyBNYW5hZ2VyCisgICAgICAgIGlmIGNlcnRob3N0ID09IGhvc3RuYW1lOgorICAgICAgICAgICAgIyBzdWNjZXNzLCBjZXJ0IGNvbW1vbk5hbWUgbWF0Y2hlcyBkZXNpcmVkIGhvc3RuYW1lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAgICAgICAgICdIb3N0bmFtZSB3ZSBjb25uZWN0ZWQgdG8gIiVzIiBkb2VzblwndCBtYXRjaCBjZXJ0aWZpY2F0ZSAnCisgICAgICAgICAgICAgICAgJ3Byb3ZpZGVkIGNvbW1vbk5hbWUgIiVzIicgJSAoaG9zdG5hbWUsIGNlcnRob3N0KSkKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICdDb3VsZCBub3QgdmFsaWRhdGUgU1NMIGNlcnRpZmljYXRlIGZyb20gaG9zdCAiJXMiLiAgQ2VydD0lcycKKyAgICAgICAgJSAoaG9zdG5hbWUsIGNlcnQpKQorCisKK2RlZiBfb3B0aW9uYWxfZGVwZW5kZW5jaWVzKCk6CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgaXBhZGRyZXNzICAjIG5vcWEKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdpcGFkZHJlc3MgbW9kdWxlIGlzIGF2YWlsYWJsZScpCisgICAgICAgIGlwYWRkciA9IFRydWUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGxvZ2dlci53YXJuKCdpcGFkZHJlc3MgbW9kdWxlIGlzIHVuYXZhaWxhYmxlJykKKyAgICAgICAgaXBhZGRyID0gRmFsc2UKKworICAgIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMzA1MDBGMDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBtYXRjaF9ob3N0bmFtZSwgX192ZXJzaW9uX18gYXMgdmVyCisgICAgICAgICAgICB2ZXIgPSBsaXN0KG1hcChpbnQsIHZlci5zcGxpdCgnLicpKSkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBtb2R1bGUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hfaG9zdG5hbWUKKyAgICAgICAgICAgIGlmIHZlclswXSAqIDEwICsgdmVyWzFdID49IDM1OgorICAgICAgICAgICAgICAgIHJldHVybiBpcGFkZHIsIG1hdGNoCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIG1vZHVsZSBpcyB0b28gb2xkJykKKyAgICAgICAgICAgICAgICBpcGFkZHIgPSBGYWxzZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBsb2dnZXIud2FybignYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpcyB1bmF2YWlsYWJsZScpCisgICAgICAgICAgICBpcGFkZHIgPSBGYWxzZQorICAgIHRyeToKKyAgICAgICAgZnJvbSBzc2wgaW1wb3J0IG1hdGNoX2hvc3RuYW1lCisgICAgICAgIGxvZ2dlci5kZWJ1Zygnc3NsLm1hdGNoX2hvc3RuYW1lIGlzIGF2YWlsYWJsZScpCisgICAgICAgIG1hdGNoID0gbWF0Y2hfaG9zdG5hbWUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGxvZ2dlci53YXJuKCd1c2luZyBsZWdhY3kgdmFsaWRhdGlvbiBjYWxsYmFjaycpCisgICAgICAgIG1hdGNoID0gbGVnYWN5X3ZhbGlkYXRlX2NhbGxiYWNrCisgICAgcmV0dXJuIGlwYWRkciwgbWF0Y2gKKworCitfbWF0Y2hfaGFzX2lwYWRkcmVzcywgX21hdGNoX2hvc3RuYW1lID0gX29wdGlvbmFsX2RlcGVuZGVuY2llcygpCmRpZmYgLS1naXQgYS9saWIvcHkvdGVzdC9faW1wb3J0X2xvY2FsX3RocmlmdC5weSBiL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjMxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvdGVzdC9faW1wb3J0X2xvY2FsX3RocmlmdC5weQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitTQ1JJUFRfRElSID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSkpCisKK2ZvciBsaWJwYXRoIGluIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICdsaWInLCAncHknLCAnYnVpbGQnLCAnbGliLionKSk6CisgICAgaWYgbGlicGF0aC5lbmRzd2l0aCgnLSVkLiVkJyAlIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdKSk6CisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBsaWJwYXRoKQorICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvbGliL3B5L3Rlc3QvdGVzdF9zc2xzb2NrZXQucHkgYi9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTM0NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3Rlc3QvdGVzdF9zc2xzb2NrZXQucHkKQEAgLTAsMCArMSwzNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgc3NsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCisKK2ltcG9ydCBfaW1wb3J0X2xvY2FsX3RocmlmdCAgIyBub3FhCisKK1NDUklQVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpKSkKK1NFUlZFUl9QRU0gPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnc2VydmVyLnBlbScpCitTRVJWRVJfQ0VSVCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIuY3J0JykKK1NFUlZFUl9LRVkgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnc2VydmVyLmtleScpCitDTElFTlRfQ0VSVF9OT19JUCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnQuY3J0JykKK0NMSUVOVF9LRVlfTk9fSVAgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnY2xpZW50LmtleScpCitDTElFTlRfQ0VSVCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnRfdjMuY3J0JykKK0NMSUVOVF9LRVkgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnY2xpZW50X3YzLmtleScpCitDTElFTlRfQ0EgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnQ0EucGVtJykKKworVEVTVF9DSVBIRVJTID0gJ0RFUy1DQkMzLVNIQTpFQ0RIRS1SU0EtQUVTMTI4LUdDTS1TSEEyNTYnCisKKworY2xhc3MgU2VydmVyQWNjZXB0b3IodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlciwgZXhwZWN0X2ZhaWx1cmU9RmFsc2UpOgorICAgICAgICBzdXBlcihTZXJ2ZXJBY2NlcHRvciwgc2VsZikuX19pbml0X18oKQorICAgICAgICBzZWxmLmRhZW1vbiA9IFRydWUKKyAgICAgICAgc2VsZi5fc2VydmVyID0gc2VydmVyCisgICAgICAgIHNlbGYuX2xpc3RlbmluZyA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuX3BvcnQgPSBOb25lCisgICAgICAgIHNlbGYuX3BvcnRfYm91bmQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLl9jbGllbnQgPSBOb25lCisgICAgICAgIHNlbGYuX2NsaWVudF9hY2NlcHRlZCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuX2V4cGVjdF9mYWlsdXJlID0gZXhwZWN0X2ZhaWx1cmUKKyAgICAgICAgZnJhbWUgPSBpbnNwZWN0LnN0YWNrKDMpWzJdCisgICAgICAgIHNlbGYubmFtZSA9IGZyYW1lWzNdCisgICAgICAgIGRlbCBmcmFtZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5fc2VydmVyLmxpc3RlbigpCisgICAgICAgIHNlbGYuX2xpc3RlbmluZy5zZXQoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFkZHJlc3MgPSBzZWxmLl9zZXJ2ZXIuaGFuZGxlLmdldHNvY2tuYW1lKCkKKyAgICAgICAgICAgIGlmIGxlbihhZGRyZXNzKSA+IDE6CisgICAgICAgICAgICAgICAgIyBBRl9JTkVUIGFkZHJlc3NlcyBhcmUgMi10dXBsZXMgKGhvc3QsIHBvcnQpIGFuZCBBRl9JTkVUNiBhcmUKKyAgICAgICAgICAgICAgICAjIDQtdHVwbGVzIChob3N0LCBwb3J0LCAuLi4pLCBidXQgaW4gZWFjaCBjYXNlIHBvcnQgaXMgaW4gdGhlIHNlY29uZCBzbG90LgorICAgICAgICAgICAgICAgIHNlbGYuX3BvcnQgPSBhZGRyZXNzWzFdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9wb3J0X2JvdW5kLnNldCgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fY2xpZW50ID0gc2VsZi5fc2VydmVyLmFjY2VwdCgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbignZXJyb3Igb24gc2VydmVyIHNpZGUgKCVzKTonICUgc2VsZi5uYW1lKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4cGVjdF9mYWlsdXJlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jbGllbnRfYWNjZXB0ZWQuc2V0KCkKKworICAgIGRlZiBhd2FpdF9saXN0ZW5pbmcoc2VsZik6CisgICAgICAgIHNlbGYuX2xpc3RlbmluZy53YWl0KCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwb3J0KHNlbGYpOgorICAgICAgICBzZWxmLl9wb3J0X2JvdW5kLndhaXQoKQorICAgICAgICByZXR1cm4gc2VsZi5fcG9ydAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNsaWVudChzZWxmKToKKyAgICAgICAgc2VsZi5fY2xpZW50X2FjY2VwdGVkLndhaXQoKQorICAgICAgICByZXR1cm4gc2VsZi5fY2xpZW50CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NsaWVudDoKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudC5jbG9zZSgpCisgICAgICAgIHNlbGYuX3NlcnZlci5jbG9zZSgpCisKKworIyBQeXRob24gMi42IGNvbXBhdAorY2xhc3MgQXNzZXJ0UmFpc2VzKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkKToKKyAgICAgICAgc2VsZi5fZXhwZWN0ZWQgPSBleHBlY3RlZAorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIGlmIG5vdCBleGNfdHlwZSBvciBub3QgaXNzdWJjbGFzcyhleGNfdHlwZSwgc2VsZi5fZXhwZWN0ZWQpOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdmYWlsJykKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBUU1NMU29ja2V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9zZXJ2ZXJfc29ja2V0KHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIFRTU0xTZXJ2ZXJTb2NrZXQocG9ydD0wLCAqKmt3YXJncykKKworICAgIEBjb250ZXh0bWFuYWdlcgorICAgIGRlZiBfY29ubmVjdGFibGVfY2xpZW50KHNlbGYsIHNlcnZlciwgZXhwZWN0X2ZhaWx1cmU9RmFsc2UsIHBhdGg9Tm9uZSwgKipjbGllbnRfa3dhcmdzKToKKyAgICAgICAgYWNjID0gU2VydmVyQWNjZXB0b3Ioc2VydmVyLCBleHBlY3RfZmFpbHVyZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWNjLnN0YXJ0KCkKKyAgICAgICAgICAgIGFjYy5hd2FpdF9saXN0ZW5pbmcoKQorCisgICAgICAgICAgICBob3N0LCBwb3J0ID0gKCdsb2NhbGhvc3QnLCBhY2MucG9ydCkgaWYgcGF0aCBpcyBOb25lIGVsc2UgKE5vbmUsIE5vbmUpCisgICAgICAgICAgICBjbGllbnQgPSBUU1NMU29ja2V0KGhvc3QsIHBvcnQsIHVuaXhfc29ja2V0PXBhdGgsICoqY2xpZW50X2t3YXJncykKKyAgICAgICAgICAgIHlpZWxkIGFjYywgY2xpZW50CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBhY2MuY2xvc2UoKQorCisgICAgZGVmIF9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlbGYsIHNlcnZlciwgcGF0aD1Ob25lLCAqKmNsaWVudF9hcmdzKToKKyAgICAgICAgbG9nZ2luZy5kaXNhYmxlKGxvZ2dpbmcuQ1JJVElDQUwpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggc2VsZi5fY29ubmVjdGFibGVfY2xpZW50KHNlcnZlciwgVHJ1ZSwgcGF0aD1wYXRoLCAqKmNsaWVudF9hcmdzKSBhcyAoYWNjLCBjbGllbnQpOgorICAgICAgICAgICAgICAgICMgV2UgbmVlZCB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24gZmFpbHVyZSwgYnV0IG5vdCB0b28gbG9uZy4gIDIwbXMgaXMgYSB0dW5hYmxlCisgICAgICAgICAgICAgICAgIyBjb21wcm9taXNlIGJldHdlZW4gdGVzdCBzcGVlZCBhbmQgc3RhYmlsaXR5CisgICAgICAgICAgICAgICAgY2xpZW50LnNldFRpbWVvdXQoMjApCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLl9hc3NlcnRfcmFpc2VzKFRUcmFuc3BvcnRFeGNlcHRpb24pOgorICAgICAgICAgICAgICAgICAgICBjbGllbnQub3BlbigpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFjYy5jbGllbnQgaXMgTm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvZ2dpbmcuZGlzYWJsZShsb2dnaW5nLk5PVFNFVCkKKworICAgIGRlZiBfYXNzZXJ0X3JhaXNlcyhzZWxmLCBleGMpOgorICAgICAgICBpZiBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDcwMEYwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXNzZXJ0UmFpc2VzKGV4YykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBBc3NlcnRSYWlzZXMoZXhjKQorCisgICAgZGVmIF9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlbGYsIHNlcnZlciwgcGF0aD1Ob25lLCAqKmNsaWVudF9hcmdzKToKKyAgICAgICAgd2l0aCBzZWxmLl9jb25uZWN0YWJsZV9jbGllbnQoc2VydmVyLCBwYXRoPXBhdGgsICoqY2xpZW50X2FyZ3MpIGFzIChhY2MsIGNsaWVudCk6CisgICAgICAgICAgICBjbGllbnQub3BlbigpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFjYy5jbGllbnQgaXMgbm90IE5vbmUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpCisKKyAgICAjIGRlcHJlY2F0ZWQgZmVhdHVyZQorICAgIGRlZiB0ZXN0X2RlcHJlY2F0aW9uKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgIFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPVRydWUsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDEpCisKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICAjIERlcHJlY2F0ZWQgc2lnbmF0dXJlCisgICAgICAgICAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHZhbGlkYXRlPVRydWUsIGNhX2NlcnRzPU5vbmUsIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSwgdW5peF9zb2NrZXQ9Tm9uZSwgY2lwaGVycz1Ob25lKToKKyAgICAgICAgICAgIFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIFRydWUsIFNFUlZFUl9DRVJULCBDTElFTlRfS0VZLCBDTElFTlRfQ0VSVCwgTm9uZSwgVEVTVF9DSVBIRVJTKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDcpCisKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICAjIERlcHJlY2F0ZWQgc2lnbmF0dXJlCisgICAgICAgICAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgY2VydGZpbGU9J2NlcnQucGVtJywgdW5peF9zb2NrZXQ9Tm9uZSwgY2lwaGVycz1Ob25lKToKKyAgICAgICAgICAgIFRTU0xTZXJ2ZXJTb2NrZXQoTm9uZSwgMCwgU0VSVkVSX1BFTSwgTm9uZSwgVEVTVF9DSVBIRVJTKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDMpCisKKyAgICAjIGRlcHJlY2F0ZWQgZmVhdHVyZQorICAgIGRlZiB0ZXN0X3NldF9jZXJ0X3JlcXNfYnlfdmFsaWRhdGUoc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgYzEgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCB2YWxpZGF0ZT1UcnVlLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYzEuY2VydF9yZXFzLCBzc2wuQ0VSVF9SRVFVSVJFRCkKKworICAgICAgICAgICAgYzEgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCB2YWxpZGF0ZT1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYzEuY2VydF9yZXFzLCBzc2wuQ0VSVF9OT05FKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMikKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3Rfc2V0X3ZhbGlkYXRlX2J5X2NlcnRfcmVxcyhzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjMS52YWxpZGF0ZSkKKworICAgICAgICAgICAgYzIgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMyLnZhbGlkYXRlKQorCisgICAgICAgICAgICBjMyA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIGNlcnRfcmVxcz1zc2wuQ0VSVF9PUFRJT05BTCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzMudmFsaWRhdGUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAzKQorCisgICAgZGVmIHRlc3RfdW5peF9kb21haW5fc29ja2V0KHNlbGYpOgorICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF91bml4X2RvbWFpbl9zb2NrZXQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZkLCBwYXRoID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KHVuaXhfc29ja2V0PXBhdGgsIGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgcGF0aD1wYXRoLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQorCisgICAgZGVmIHRlc3Rfc2VydmVyX2NlcnQoc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAjIHNlcnZlciBjZXJ0IG5vdCBpbiBjYV9jZXJ0cworICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1DTElFTlRfQ0VSVCkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKKworICAgIGRlZiB0ZXN0X3NldF9zZXJ2ZXJfY2VydChzZWxmKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPUNMSUVOVF9DRVJUKQorICAgICAgICB3aXRoIHNlbGYuX2Fzc2VydF9yYWlzZXMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlcnZlci5jZXJ0ZmlsZSA9ICdmb28nCisgICAgICAgIHdpdGggc2VsZi5fYXNzZXJ0X3JhaXNlcyhFeGNlcHRpb24pOgorICAgICAgICAgICAgc2VydmVyLmNlcnRmaWxlID0gTm9uZQorICAgICAgICBzZXJ2ZXIuY2VydGZpbGUgPSBTRVJWRVJfQ0VSVAorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgIGRlZiB0ZXN0X2NsaWVudF9jZXJ0KHNlbGYpOgorICAgICAgICBpZiBub3QgX21hdGNoX2hhc19pcGFkZHJlc3M6CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9jbGllbnRfY2VydCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBrZXlmaWxlPVNFUlZFUl9LRVkpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DQSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVF9OT19JUCwga2V5ZmlsZT1DTElFTlRfS0VZX05PX0lQKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0EpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9Q0xJRU5UX0NFUlQsIGtleWZpbGU9Q0xJRU5UX0tFWSkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX09QVElPTkFMLCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NBKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPUNMSUVOVF9DRVJULCBrZXlmaWxlPUNMSUVOVF9LRVkpCisKKyAgICBkZWYgdGVzdF9jaXBoZXJzKHNlbGYpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNpcGhlcnM9VEVTVF9DSVBIRVJTKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIGNpcGhlcnM9VEVTVF9DSVBIRVJTKQorCisgICAgICAgIGlmIG5vdCBUU1NMU29ja2V0Ll9oYXNfY2lwaGVyczoKKyAgICAgICAgICAgICMgdW5pdHRlc3Quc2tpcCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gMi42CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9jaXBoZXJzJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgY2lwaGVycz0nTlVMTCcpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjaXBoZXJzPVRFU1RfQ0lQSEVSUykKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBjaXBoZXJzPSdOVUxMJykKKworICAgIGRlZiB0ZXN0X3NzbDJfYW5kX3NzbDNfZGlzYWJsZWQoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1NTTHYzJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfU1NMdjMgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MykKKworICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjMpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfU1NMdjInKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9TU0x2MiBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyKQorCisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MikKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgIGRlZiB0ZXN0X25ld2VyX3RscyhzZWxmKToKKyAgICAgICAgaWYgbm90IFRTU0xTb2NrZXQuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgICMgdW5pdHRlc3Quc2tpcCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gMi42CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9uZXdlcl90bHMnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzInKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9UTFN2MV8yIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMikKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzIpCisKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMScpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1RMU3YxXzEgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8xKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMSkKKworICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8xJykgb3Igbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMicpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1RMU3YxXzEgYW5kL29yIFBST1RPQ09MX1RMU3YxXzIgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8yKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMSkKKworICAgIGRlZiB0ZXN0X3NzbF9jb250ZXh0KHNlbGYpOgorICAgICAgICBpZiBub3QgVFNTTFNvY2tldC5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgIyB1bml0dGVzdC5za2lwIGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiAyLjYKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X3NzbF9jb250ZXh0JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXJ2ZXJfY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KHNzbC5QdXJwb3NlLkNMSUVOVF9BVVRIKQorICAgICAgICBzZXJ2ZXJfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oU0VSVkVSX0NFUlQsIFNFUlZFUl9LRVkpCisgICAgICAgIHNlcnZlcl9jb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhDTElFTlRfQ0EpCisgICAgICAgIHNlcnZlcl9jb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChzc2xfY29udGV4dD1zZXJ2ZXJfY29udGV4dCkKKworICAgICAgICBjbGllbnRfY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KHNzbC5QdXJwb3NlLlNFUlZFUl9BVVRIKQorICAgICAgICBjbGllbnRfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oQ0xJRU5UX0NFUlQsIENMSUVOVF9LRVkpCisgICAgICAgIGNsaWVudF9jb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhTRVJWRVJfQ0VSVCkKKyAgICAgICAgY2xpZW50X2NvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBzc2xfY29udGV4dD1jbGllbnRfY29udGV4dCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5XQVJOKQorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU1NMU29ja2V0IGltcG9ydCBUU1NMU29ja2V0LCBUU1NMU2VydmVyU29ja2V0LCBfbWF0Y2hfaGFzX2lwYWRkcmVzcworICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCisKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weS90ZXN0L3RocmlmdF9qc29uLnB5IGIvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlN2E0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS90ZXN0L3RocmlmdF9qc29uLnB5CkBAIC0wLDAgKzEsNTEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IF9pbXBvcnRfbG9jYWxfdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorCisjCisjIEluIG9yZGVyIHRvIHJ1biB0aGUgdGVzdCB1bmRlciBXaW5kb3dzLiBXZSBuZWVkIHRvIGNyZWF0ZSBzeW1ib2xpYyBsaW5rCisjIG5hbWUgJ3RocmlmdCcgdG8gJy4uL3NyYycgZm9sZGVyIGJ5IHVzaW5nOgorIworIyBta2xpbmsgL0QgdGhyaWZ0IC4uXHNyYworIworCisKK2NsYXNzIFRlc3RKU09OU3RyaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2VzY2FwZWRfdW5pY29kZV9zdHJpbmcoc2VsZik6CisgICAgICAgIHVuaWNvZGVfanNvbiA9IGInImhlbGxvIFxcdTBlMDFcXHUwZTAyXFx1MGUwM1xcdWQ4MzVcXHVkY2FiXFx1ZGI0MFxcdWRjNzAgdW5pY29kZSInCisgICAgICAgIHVuaWNvZGVfdGV4dCA9IHUnaGVsbG8gXHUwZTAxXHUwZTAyXHUwZTAzXFUwMDAxRDRBQlxVMDAwRTAwNzAgdW5pY29kZScKKworICAgICAgICBidWYgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIodW5pY29kZV9qc29uKQorICAgICAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKS5nZXRUcmFuc3BvcnQoYnVmKQorICAgICAgICBwcm90b2NvbCA9IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KQorCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgICAgIHVuaWNvZGVfdGV4dCA9IHVuaWNvZGVfdGV4dC5lbmNvZGUoJ3V0ZjgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvY29sLnJlYWRTdHJpbmcoKSwgdW5pY29kZV90ZXh0KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcmIvQ0hBTkdFTE9HIGIvbGliL3JiL0NIQU5HRUxPRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkY2UyYS4uMDAwMDAwMAotLS0gYS9saWIvcmIvQ0hBTkdFTE9HCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdjAuMC4xLiBJbml0aWFsIHJlbGVhc2UKZGlmZiAtLWdpdCBhL2xpYi9yYi9HZW1maWxlIGIvbGliL3JiL0dlbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4NmFmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9HZW1maWxlCkBAIC0wLDAgKzEsNCBAQAorc291cmNlICJodHRwOi8vcnVieWdlbXMub3JnIgorCitnZW1zcGVjCisKZGlmZiAtLWdpdCBhL2xpYi9yYi9NYWtlZmlsZS5hbSBiL2xpYi9yYi9NYWtlZmlsZS5hbQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDljZmZmYzcuLjEzN2VkYjQKLS0tIGEvbGliL3JiL01ha2VmaWxlLmFtCisrKyBiL2xpYi9yYi9NYWtlZmlsZS5hbQpAQCAtMTcsMzEgKzE3LDM1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitERVNURElSID89IC8KKworaWYgSEFWRV9CVU5ETEVSCisKK2FsbC1sb2NhbDoKKwkkKEJVTkRMRVIpIGluc3RhbGwKKwkkKEJVTkRMRVIpIGV4ZWMgcmFrZSBidWlsZF9leHQKKworaW5zdGFsbC1leGVjLWhvb2s6CisJJChCVU5ETEVSKSBleGVjIHJha2UgaW5zdGFsbAorCitjbGVhbi1sb2NhbDoKKwkkKEJVTkRMRVIpIGluc3RhbGwKKwkkKEJVTkRMRVIpIGV4ZWMgcmFrZSBjbGVhbgorCitjaGVjay1sb2NhbDogYWxsCisJJChCVU5ETEVSKSBpbnN0YWxsCisJJChCVU5ETEVSKSBleGVjIHJha2UKKworZW5kaWYKKwogRVhUUkFfRElTVCA9IFwKLQlDSEFOR0VMT0cgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAogCVJha2VmaWxlIFwKLQlNYW5pZmVzdCBcCi0Jc2V0dXAucmIgXAorCUdlbWZpbGUgXAorCXRocmlmdC5nZW1zcGVjIFwKIAlsaWIgXAogCWV4dCBcCiAJYmVuY2htYXJrIFwKIAlzY3JpcHQgXAotCXNwZWMKLQotYWxsLWxvY2FsOgotCSQoUlVCWSkgc2V0dXAucmIgY29uZmlnCi0JJChSVUJZKSBzZXR1cC5yYiBzZXR1cAotCi1pbnN0YWxsLWV4ZWMtaG9vazoKLQkkKFJVQlkpIHNldHVwLnJiIGluc3RhbGwKLQotIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgUnVieSBpcyBub3QgY29uZmlndXJlZC4KLWNsZWFuLWxvY2FsOgotCVJVQlk9JChSVUJZKSA7IGlmIHRlc3QgLXogIiQkUlVCWSIgOyB0aGVuIFJVQlk9OiA7IGZpIDsgXAotCSQkUlVCWSBzZXR1cC5yYiBjbGVhbgotCi1jaGVjay1sb2NhbDogYWxsCi1pZiBIQVZFX1JTUEVDCi0JcmFrZSBzcGVjCi1lbmRpZgotCisJc3BlYyBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvcmIvTWFuaWZlc3QgYi9saWIvcmIvTWFuaWZlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMWYwMzEuLjAwMDAwMDAKLS0tIGEvbGliL3JiL01hbmlmZXN0CisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotQ0hBTkdFTE9HCi1NYW5pZmVzdAotUmFrZWZpbGUKLVJFQURNRQotc2V0dXAucmIKLWJlbmNobWFyay9iZW5jaG1hcmsucmIKLWJlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0Ci1iZW5jaG1hcmsvY2xpZW50LnJiCi1iZW5jaG1hcmsvc2VydmVyLnJiCi1iZW5jaG1hcmsvdGhpbl9zZXJ2ZXIucmIKLWV4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYwotZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5oCi1leHQvY29tcGFjdF9wcm90b2NvbC5jCi1leHQvY29tcGFjdF9wcm90b2NvbC5oCi1leHQvY29uc3RhbnRzLmgKLWV4dC9leHRjb25mLnJiCi1leHQvbWFjcm9zLmgKLWV4dC9tZW1vcnlfYnVmZmVyLmMKLWV4dC9tZW1vcnlfYnVmZmVyLmgKLWV4dC9wcm90b2NvbC5jCi1leHQvcHJvdG9jb2wuaAotZXh0L3N0cnVjdC5jCi1leHQvc3RydWN0LmgKLWV4dC90aHJpZnRfbmF0aXZlLmMKLWxpYi90aHJpZnQucmIKLWxpYi90aHJpZnQvY2xpZW50LnJiCi1saWIvdGhyaWZ0L2NvcmVfZXh0LnJiCi1saWIvdGhyaWZ0L2V4Y2VwdGlvbnMucmIKLWxpYi90aHJpZnQvcHJvY2Vzc29yLnJiCi1saWIvdGhyaWZ0L3N0cnVjdC5yYgotbGliL3RocmlmdC9zdHJ1Y3RfdW5pb24ucmIKLWxpYi90aHJpZnQvdW5pb24ucmIKLWxpYi90aHJpZnQvdGhyaWZ0X25hdGl2ZS5yYgotbGliL3RocmlmdC90eXBlcy5yYgotbGliL3RocmlmdC9jb3JlX2V4dC9maXhudW0ucmIKLWxpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgotbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKLWxpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCi1saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKLWxpYi90aHJpZnQvc2VyaWFsaXplci9kZXNlcmlhbGl6ZXIucmIKLWxpYi90aHJpZnQvc2VyaWFsaXplci9zZXJpYWxpemVyLnJiCi1saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvbW9uZ3JlbF9odHRwX3NlcnZlci5yYgotbGliL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmdfc2VydmVyLnJiCi1saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiCi1saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKLWxpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCi1saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKLWxpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgotbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKLXNjcmlwdC9wcm90b19iZW5jaG1hcmsucmIKLXNjcmlwdC9yZWFkX3N0cnVjdC5yYgotc2NyaXB0L3dyaXRlX3N0cnVjdC5yYgotc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKLXNwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgotc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgotc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgotc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKLXNwZWMvY2xpZW50X3NwZWMucmIKLXNwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCi1zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCi1zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKLXNwZWMvbW9uZ3JlbF9odHRwX3NlcnZlcl9zcGVjLnJiCi1zcGVjL25vbmJsb2NraW5nX3NlcnZlcl9zcGVjLnJiCi1zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCi1zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgotc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKLXNwZWMvc2VydmVyX3NwZWMucmIKLXNwZWMvc29ja2V0X3NwZWMucmIKLXNwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCi1zcGVjL3NwZWNfaGVscGVyLnJiCi1zcGVjL3N0cnVjdF9zcGVjLnJiCi1zcGVjL3VuaW9uX3NwZWMucmIKLXNwZWMvVGhyaWZ0U3BlYy50aHJpZnQKLXNwZWMvdHlwZXNfc3BlYy5yYgotc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCmRpZmYgLS1naXQgYS9saWIvcmIvUkVBRE1FIGIvbGliL3JiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4ZTM1Mi4uMDAwMDAwMAotLS0gYS9saWIvcmIvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotVGhyaWZ0IFJ1YnkgU29mdHdhcmUgTGlicmFyeQotICAgIGh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy90aHJpZnQvCi0KLT09IExJQ0VOU0U6Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi09PSBERVNDUklQVElPTjoKLQotVGhyaWZ0IGlzIGEgc3Ryb25nbHktdHlwZWQgbGFuZ3VhZ2UtYWdub3N0aWMgUlBDIHN5c3RlbS4KLVRoaXMgbGlicmFyeSBpcyB0aGUgcnVieSBpbXBsZW1lbnRhdGlvbiBmb3IgYm90aCBjbGllbnRzIGFuZCBzZXJ2ZXJzLgotCi09PSBJTlNUQUxMOgotCi0gICQgZ2VtIGluc3RhbGwgdGhyaWZ0Ci0KLT09IENBVkVBVFM6Ci0KLVRoaXMgbGlicmFyeSBwcm92aWRlcyB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIG9mIHRocmlmdC4KLUl0IGRvZXMgPGVtPm5vdDwvZW0+IHByb3ZpZGUgdGhlIGNvbXBpbGVyIGZvciB0aGUgLnRocmlmdCBmaWxlcy4gVG8gY29tcGlsZQotLnRocmlmdCBmaWxlcyBpbnRvIGxhbmd1YWdlLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucywgcGxlYXNlIGRvd25sb2FkIHRoZSBmdWxsCi10aHJpZnQgc29mdHdhcmUgcGFja2FnZS4KLQotPT0gVVNBR0U6Ci0KLVRoaXMgc2VjdGlvbiBzaG91bGQgZ2V0IHdyaXR0ZW4gYnkgc29tZW9uZSB3aXRoIHRoZSB0aW1lIGFuZCBpbmNsaW5hdGlvbi4KLUluIHRoZSBtZWFudGltZSwgbG9vayBhdCBleGlzdGluZyBjb2RlLCBzdWNoIGFzIHRoZSBiZW5jaG1hcmsgb3IgdGhlIHR1dG9yaWFsCi1pbiB0aGUgZnVsbCB0aHJpZnQgZGlzdHJpYnV0aW9uLgpkaWZmIC0tZ2l0IGEvbGliL3JiL1JFQURNRS5tZCBiL2xpYi9yYi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlOWEwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9SRUFETUUubWQKQEAgLTAsMCArMSw0MyBAQAorVGhyaWZ0IFJ1YnkgU29mdHdhcmUgTGlicmFyeQorICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCis9PSBMSUNFTlNFOgorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworPT0gREVTQ1JJUFRJT046CisKK1RocmlmdCBpcyBhIHN0cm9uZ2x5LXR5cGVkIGxhbmd1YWdlLWFnbm9zdGljIFJQQyBzeXN0ZW0uCitUaGlzIGxpYnJhcnkgaXMgdGhlIHJ1YnkgaW1wbGVtZW50YXRpb24gZm9yIGJvdGggY2xpZW50cyBhbmQgc2VydmVycy4KKworPT0gSU5TVEFMTDoKKworICAkIGdlbSBpbnN0YWxsIHRocmlmdAorCis9PSBDQVZFQVRTOgorCitUaGlzIGxpYnJhcnkgcHJvdmlkZXMgdGhlIGNsaWVudCBhbmQgc2VydmVyIGltcGxlbWVudGF0aW9ucyBvZiB0aHJpZnQuCitJdCBkb2VzIDxlbT5ub3Q8L2VtPiBwcm92aWRlIHRoZSBjb21waWxlciBmb3IgdGhlIC50aHJpZnQgZmlsZXMuIFRvIGNvbXBpbGUKKy50aHJpZnQgZmlsZXMgaW50byBsYW5ndWFnZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMsIHBsZWFzZSBkb3dubG9hZCB0aGUgZnVsbAordGhyaWZ0IHNvZnR3YXJlIHBhY2thZ2UuCisKKz09IFVTQUdFOgorCitUaGlzIHNlY3Rpb24gc2hvdWxkIGdldCB3cml0dGVuIGJ5IHNvbWVvbmUgd2l0aCB0aGUgdGltZSBhbmQgaW5jbGluYXRpb24uCitJbiB0aGUgbWVhbnRpbWUsIGxvb2sgYXQgZXhpc3RpbmcgY29kZSwgc3VjaCBhcyB0aGUgYmVuY2htYXJrIG9yIHRoZSB0dXRvcmlhbAoraW4gdGhlIGZ1bGwgdGhyaWZ0IGRpc3RyaWJ1dGlvbi4KZGlmZiAtLWdpdCBhL2xpYi9yYi9SYWtlZmlsZSBiL2xpYi9yYi9SYWtlZmlsZQppbmRleCBhMDQyZmI4Li41ZTVlNWFjIDEwMDY0NAotLS0gYS9saWIvcmIvUmFrZWZpbGUKKysrIGIvbGliL3JiL1Jha2VmaWxlCkBAIC0xOSw4NiArMTksMTAyIEBACiAKIHJlcXVpcmUgJ3J1YnlnZW1zJwogcmVxdWlyZSAncmFrZScKLXJlcXVpcmUgJ3NwZWMvcmFrZS9zcGVjdGFzaycKK3JlcXVpcmUgJ3Jha2UvY2xlYW4nCityZXF1aXJlICdyc3BlYy9jb3JlL3Jha2VfdGFzaycKIAogVEhSSUZUID0gJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnCiAKLXRhc2sgOmRlZmF1bHQgPT4gWzpzcGVjXQordGFzayA6ZGVmYXVsdCA9PiBbOmdlbV0KK3Rhc2sgOnNwZWMgPT4gWzonZ2VuLXJiJywgOmJ1aWxkX2V4dCwgOnJlYWxzcGVjXQogCi10YXNrIDpzcGVjID0+IFs6J2dlbi1yYicsIDpyZWFsc3BlY10KLQotU3BlYzo6UmFrZTo6U3BlY1Rhc2submV3KDpyZWFsc3BlYykgZG8gfHR8Ci0gIHQuc3BlY19maWxlcyA9IEZpbGVMaXN0WydzcGVjLyoqLypfc3BlYy5yYiddCi0gIHQuc3BlY19vcHRzID0gWyctLWNvbG9yJ10KK1JTcGVjOjpDb3JlOjpSYWtlVGFzay5uZXcoOnJlYWxzcGVjKSBkbyB8dHwKKyAgdC5yc3BlY19vcHRzID0gWyctLWNvbG9yJywgJy0tZm9ybWF0IGQnXQogZW5kCiAKLVNwZWM6OlJha2U6OlNwZWNUYXNrLm5ldyg6J3NwZWM6cmNvdicpIGRvIHx0fAotICB0LnNwZWNfZmlsZXMgPSBGaWxlTGlzdFsnc3BlYy8qKi8qX3NwZWMucmInXQotICB0LnNwZWNfb3B0cyA9IFsnLS1jb2xvciddCitSU3BlYzo6Q29yZTo6UmFrZVRhc2submV3KDonc3BlYzpyY292JykgZG8gfHR8CisgIHQucnNwZWNfb3B0cyA9IFsnLS1jb2xvcicsICctLWZvcm1hdCBkJ10KICAgdC5yY292ID0gdHJ1ZQogICB0LnJjb3Zfb3B0cyA9IFsnLS1leGNsdWRlJywgJ15zcGVjLC9nZW1zLyddCiBlbmQKIAotZGVzYyAnUnVuIHRoZSBjb21waWxlciB0ZXN0cyAocmVxdWlyZXMgZnVsbCB0aHJpZnQgY2hlY2tvdXQpJwotdGFzayA6dGVzdCBkbwotICAjIGVuc3VyZSB0aGlzIGlzIGEgZnVsbCB0aHJpZnQgY2hlY2tvdXQgYW5kIG5vdCBhIHRhcmJhbGwgb2YgdGhlIHJ1YnkgbGlicwotICBjbWQgPSAnaGVhZCAtMSAuLi8uLi9SRUFETUUgMj4vZGV2L251bGwgfCBncmVwIFRocmlmdCA+L2Rldi9udWxsIDI+L2Rldi9udWxsJwotICBzeXN0ZW0oY21kKSBvciBmYWlsICJyYWtlIHRlc3QgcmVxdWlyZXMgYSBmdWxsIHRocmlmdCBjaGVja291dCIKLSAgc2ggJ21ha2UnLCAnLUMnLCBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgIi8uLi8uLi90ZXN0L3JiIiwgImNoZWNrIgotZW5kCi0KIGRlc2MgJ0NvbXBpbGUgdGhlIC50aHJpZnQgZmlsZXMgZm9yIHRoZSBzcGVjcycKLXRhc2sgOidnZW4tcmInID0+IFs6J2dlbi1yYjpzcGVjJywgOidnZW4tcmI6YmVuY2htYXJrJywgOidnZW4tcmI6ZGVidWdfcHJvdG8nXQotCit0YXNrIDonZ2VuLXJiJyA9PiBbOidnZW4tcmI6c3BlYycsIDonZ2VuLXJiOm5hbWVzcGFjZWRfc3BlYycsIDonZ2VuLXJiOmZsYXRfc3BlYycsIDonZ2VuLXJiOmJlbmNobWFyaycsIDonZ2VuLXJiOmRlYnVnX3Byb3RvJ10KIG5hbWVzcGFjZSA6J2dlbi1yYicgZG8KICAgdGFzayA6J3NwZWMnIGRvCiAgICAgZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlYycKICAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYicsICctbycsIGRpciwgIiN7ZGlyfS9UaHJpZnRTcGVjLnRocmlmdCIKICAgZW5kCiAKKyAgdGFzayA6J25hbWVzcGFjZWRfc3BlYycgZG8KKyAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJworICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLS1yZWN1cnNlJywgJy1vJywgZGlyLCAiI3tkaXJ9L1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdCIKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYjpuYW1lc3BhY2VkJywgJy0tcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9CYXNlU2VydmljZS50aHJpZnQiCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdCIKKyAgZW5kCisKKyAgdGFzayA6J2ZsYXRfc3BlYycgZG8KKyAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJworICAgIG1rZGlyX3AoIiN7ZGlyfS9nZW4tcmIvZmxhdCIpCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAnLS1yZWN1cnNlJywgJy1vdXQnLCAiI3tkaXJ9L2dlbi1yYi9mbGF0IiwgIiN7ZGlyfS9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQiCisgIGVuZAorCiAgIHRhc2sgOidiZW5jaG1hcmsnIGRvCiAgICAgZGlyID0gRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvYmVuY2htYXJrJwogICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiJywgJy1vJywgZGlyLCAiI3tkaXJ9L0JlbmNobWFyay50aHJpZnQiCiAgIGVuZAogICAKICAgdGFzayA6J2RlYnVnX3Byb3RvJyBkbwotICAgIHNoICJta2RpciIsICItcCIsICJkZWJ1Z19wcm90b190ZXN0IgotICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiJywgIi1vIiwgImRlYnVnX3Byb3RvX3Rlc3QiLCAiLi4vLi4vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQiCisgICAgc2ggIm1rZGlyIiwgIi1wIiwgInRlc3QvZGVidWdfcHJvdG8iCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAiLW8iLCAidGVzdC9kZWJ1Z19wcm90byIsICIuLi8uLi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCIKICAgZW5kCiBlbmQKIAorZGVzYyAiQnVpbGQgdGhlIG5hdGl2ZSBsaWJyYXJ5IgordGFzayA6YnVpbGRfZXh0ID0+IDonZ2VuLXJiJyBkbworICAgbmV4dCBpZiBkZWZpbmVkPyhSVUJZX0VOR0lORSkgJiYgUlVCWV9FTkdJTkUgPX4gL2pydWJ5LworICAgRGlyOjpjaGRpcihGaWxlOjpkaXJuYW1lKCdleHQvZXh0Y29uZi5yYicpKSBkbworICAgICAgdW5sZXNzIHNoICJydWJ5ICN7RmlsZTo6YmFzZW5hbWUoJ2V4dC9leHRjb25mLnJiJyl9IgorICAgICAgICAkc3RkZXJyLnB1dHMgIkZhaWxlZCB0byBydW4gZXh0Y29uZiIKKyAgICAgICAgICBicmVhaworICAgICAgZW5kCisgICAgICB1bmxlc3Mgc2ggIm1ha2UiCisgICAgICAgICRzdGRlcnIucHV0cyAibWFrZSBmYWlsZWQiCisgICAgICAgIGJyZWFrCisgICAgICBlbmQKKyAgICBlbmQKK2VuZAorCitkZXNjICdSdW4gdGhlIGNvbXBpbGVyIHRlc3RzIChyZXF1aXJlcyBmdWxsIHRocmlmdCBjaGVja291dCknCit0YXNrIDp0ZXN0IGRvCisgICMgZW5zdXJlIHRoaXMgaXMgYSBmdWxsIHRocmlmdCBjaGVja291dCBhbmQgbm90IGEgdGFyYmFsbCBvZiB0aGUgcnVieSBsaWJzCisgIGNtZCA9ICdoZWFkIC0xIC4uLy4uL1JFQURNRS5tZCAyPi9kZXYvbnVsbCB8IGdyZXAgVGhyaWZ0ID4vZGV2L251bGwgMj4vZGV2L251bGwnCisgIHN5c3RlbShjbWQpIG9yIGZhaWwgInJha2UgdGVzdCByZXF1aXJlcyBhIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0IgorICBzaCAnbWFrZScsICctQycsIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiLy4uLy4uL3Rlc3QvcmIiLCAiY2hlY2siCitlbmQKKwogZGVzYyAnUnVuIGJlbmNobWFya2luZyBvZiBOb25ibG9ja2luZ1NlcnZlcicKIHRhc2sgOmJlbmNobWFyayBkbwogICBydWJ5ICdiZW5jaG1hcmsvYmVuY2htYXJrLnJiJwogZW5kCiAKLQotYmVnaW4KLSAgcmVxdWlyZSAnZWNob2UnCi0KLSAgRWNob2UubmV3KCd0aHJpZnQnKSBkbyB8cHwKLSAgICBwLmF1dGhvciA9IFsnS2V2aW4gQmFsbGFyZCcsICdLZXZpbiBDbGFyaycsICdNYXJrIFNsZWUnXQotICAgIHAuZW1haWwgPSBbJ2tldmluQHNiLm9yZycsICdrZXZpbi5jbGFya0BnbWFpbC5jb20nLCAnbWNzbGVlQGZhY2Vib29rLmNvbSddCi0gICAgcC5zdW1tYXJ5ID0gIlJ1YnkgbGlicmFyaWVzIGZvciBUaHJpZnQgKGEgbGFuZ3VhZ2UtYWdub3N0aWMgUlBDIHN5c3RlbSkiCi0gICAgcC51cmwgPSAiaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL3RocmlmdC8iCi0gICAgcC5pbmNsdWRlX3Jha2VmaWxlID0gdHJ1ZQotICAgIHAudmVyc2lvbiA9ICIwLjMuMCIKLSAgICBwLnJ1YnlnZW1zX3ZlcnNpb24gPSAiPj0gMS4yLjAiCi0gIGVuZAotCi0gIHRhc2sgOmluc3RhbGwgPT4gWzpjaGVja19zaXRlX2xpYl0KLQotICByZXF1aXJlICdyYmNvbmZpZycKLSAgdGFzayA6Y2hlY2tfc2l0ZV9saWIgZG8KLSAgICBpZiBGaWxlLmV4aXN0PyhGaWxlLmpvaW4oQ29uZmlnOjpDT05GSUdbJ3NpdGVsaWJkaXInXSwgJ3RocmlmdC5yYicpKQotICAgICAgZmFpbCAidGhyaWZ0IGlzIGFscmVhZHkgaW5zdGFsbGVkIGluIHNpdGVfcnVieSIKLSAgICBlbmQKLSAgZW5kCi1yZXNjdWUgTG9hZEVycm9yCi0gIFs6aW5zdGFsbCwgOnBhY2thZ2VdLmVhY2ggZG8gfHR8Ci0gICAgZGVzYyAiU3R1YiBmb3IgI3t0fSIKLSAgICB0YXNrIHQgZG8KLSAgICAgIGZhaWwgIlRoZSBFY2hvZSBnZW0gaXMgcmVxdWlyZWQgZm9yIHRoaXMgdGFzayIKLSAgICBlbmQKK2Rlc2MgJ0J1aWxkcyB0aGUgdGhyaWZ0IGdlbScKK3Rhc2sgOmdlbSA9PiBbOnNwZWMsIDpidWlsZF9leHRdIGRvCisgIHVubGVzcyBzaCAnZ2VtJywgJ2J1aWxkJywgJ3RocmlmdC5nZW1zcGVjJworICAgICRzdGRlcnIucHV0cyAiRmFpbGVkIHRvIGJ1aWxkIHRocmlmdCBnZW0iCisgICAgYnJlYWsKICAgZW5kCiBlbmQKKworZGVzYyAnSW5zdGFsbCB0aGUgdGhyaWZ0IGdlbScKK3Rhc2sgOmluc3RhbGwgPT4gWzpnZW1dIGRvCisgIHVubGVzcyBzaCAnZ2VtJywgJ2luc3RhbGwnLCBEaXIuZ2xvYigndGhyaWZ0LSouZ2VtJykubGFzdAorICAgICRzdGRlcnIucHV0cyAiRmFpbGVkIHRvIGluc3RhbGwgdGhyaWZ0IGdlbSIKKyAgICBicmVhaworICBlbmQKK2VuZAorCitDTEVBTi5pbmNsdWRlIFsKKyAgJy5idW5kbGUnLCAnYmVuY2htYXJrL2dlbi1yYicsICdjb3ZlcmFnZScsICdleHQvKi57byxidW5kbGUsc28sZGxsfScsICdleHQvbWttZi5sb2cnLAorICAnZXh0L01ha2VmaWxlJywgJ2V4dC9jb25mdGVzdC5kU1lNJywgJ0dlbWZpbGUubG9jaycsICdta21mLmxvZycsICdwa2cnLCAgJ3NwZWMvZ2VuLXJiJywKKyAgJ3Rlc3QnLCAndGhyaWZ0LSouZ2VtJworXQpkaWZmIC0tZ2l0IGEvbGliL3JiL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcmIvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5jIGIvbGliL3JiL2V4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYwppbmRleCA3NWFhNGM2Li42NWNiZTVmIDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5jCisrKyBiL2xpYi9yYi9leHQvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmMKQEAgLTIyLDcgKzIyLDggQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxjb25zdGFudHMuaD4KICNpbmNsdWRlIDxzdHJ1Y3QuaD4KLSNpbmNsdWRlICJtYWNyb3MuaCIKKyNpbmNsdWRlIDxtYWNyb3MuaD4KKyNpbmNsdWRlIDxieXRlcy5oPgogCiBWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX25hdGl2ZV9xbWFyayhWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRdHJ1ZTsKQEAgLTM0LDYgKzM1LDcgQEAKIHN0YXRpYyBpbnQgVkVSU0lPTl9NQVNLOwogc3RhdGljIGludCBUWVBFX01BU0s7CiBzdGF0aWMgaW50IEJBRF9WRVJTSU9OOworc3RhdGljIElEIHJidWZfaXZhcl9pZDsKIAogc3RhdGljIHZvaWQgd3JpdGVfYnl0ZV9kaXJlY3QoVkFMVUUgdHJhbnMsIGludDhfdCBiKSB7CiAgIFdSSVRFKHRyYW5zLCAoY2hhciopJmIsIDEpOwpAQCAtNzcsOCArNzksOSBAQAogCiBzdGF0aWMgdm9pZCB3cml0ZV9zdHJpbmdfZGlyZWN0KFZBTFVFIHRyYW5zLCBWQUxVRSBzdHIpIHsKICAgaWYgKFRZUEUoc3RyKSAhPSBUX1NUUklORykgewotICAgIHJiX3JhaXNlKHJiX2VTdGFuZGFyZEVycm9yLCAiVmFsdWUgc2hvdWxkIGJlIGEgc3RyaW5nIik7ICAgIAorICAgIHJiX3JhaXNlKHJiX2VTdGFuZGFyZEVycm9yLCAiVmFsdWUgc2hvdWxkIGJlIGEgc3RyaW5nIik7CiAgIH0KKyAgc3RyID0gY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cik7CiAgIHdyaXRlX2kzMl9kaXJlY3QodHJhbnMsIFJTVFJJTkdfTEVOKHN0cikpOwogICByYl9mdW5jYWxsKHRyYW5zLCB3cml0ZV9tZXRob2RfaWQsIDEsIHN0cik7CiB9CkBAIC0yMTYsMzYgKzIxOSw1NiBAQAogICByZXR1cm4gUW5pbDsKIH0KIAorVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9iaW5hcnkoVkFMVUUgc2VsZiwgVkFMVUUgYnVmKSB7CisgIENIRUNLX05JTChidWYpOworICBWQUxVRSB0cmFucyA9IEdFVF9UUkFOU1BPUlQoc2VsZik7CisgIGJ1ZiA9IGZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpOworICB3cml0ZV9pMzJfZGlyZWN0KHRyYW5zLCBSU1RSSU5HX0xFTihidWYpKTsKKyAgcmJfZnVuY2FsbCh0cmFucywgd3JpdGVfbWV0aG9kX2lkLCAxLCBidWYpOworICByZXR1cm4gUW5pbDsKK30KKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIGludGVyZmFjZSByZWFkaW5nIG1ldGhvZHMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJpbmcoVkFMVUUgc2VsZik7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfYmluYXJ5KFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2J5dGUoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfaTMyKFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2kxNihWQUxVRSBzZWxmKTsKIAogc3RhdGljIGNoYXIgcmVhZF9ieXRlX2RpcmVjdChWQUxVRSBzZWxmKSB7Ci0gIFZBTFVFIGJ1ZiA9IFJFQUQoc2VsZiwgMSk7Ci0gIHJldHVybiBSU1RSSU5HX1BUUihidWYpWzBdOworICBWQUxVRSBieXRlID0gcmJfZnVuY2FsbChHRVRfVFJBTlNQT1JUKHNlbGYpLCByZWFkX2J5dGVfbWV0aG9kX2lkLCAwKTsKKyAgcmV0dXJuIChjaGFyKShGSVgySU5UKGJ5dGUpKTsKIH0KIAogc3RhdGljIGludDE2X3QgcmVhZF9pMTZfZGlyZWN0KFZBTFVFIHNlbGYpIHsKLSAgVkFMVUUgYnVmID0gUkVBRChzZWxmLCAyKTsKLSAgcmV0dXJuIChpbnQxNl90KSgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ1ZilbMV0pKSB8ICgodWludDE2X3QpKChSU1RSSU5HX1BUUihidWYpWzBdKSA8PCA4KSkpOworICBWQUxVRSByYnVmID0gcmJfaXZhcl9nZXQoc2VsZiwgcmJ1Zl9pdmFyX2lkKTsKKyAgcmJfZnVuY2FsbChHRVRfVFJBTlNQT1JUKHNlbGYpLCByZWFkX2ludG9fYnVmZmVyX21ldGhvZF9pZCwgMiwgcmJ1ZiwgSU5UMkZJWCgyKSk7CisgIHJldHVybiAoaW50MTZfdCkoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVsxXSkpIHwgKCh1aW50MTZfdCkoKFJTVFJJTkdfUFRSKHJidWYpWzBdKSA8PCA4KSkpOwogfQogCiBzdGF0aWMgaW50MzJfdCByZWFkX2kzMl9kaXJlY3QoVkFMVUUgc2VsZikgewotICBWQUxVRSBidWYgPSBSRUFEKHNlbGYsIDQpOwotICByZXR1cm4gKCh1aW50OF90KShSU1RSSU5HX1BUUihidWYpWzNdKSkgfCAKLSAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihidWYpWzJdKSkgPDwgOCkgfCAKLSAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihidWYpWzFdKSkgPDwgMTYpIHwgCi0gICAgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnVmKVswXSkpIDw8IDI0KTsKKyAgVkFMVUUgcmJ1ZiA9IHJiX2l2YXJfZ2V0KHNlbGYsIHJidWZfaXZhcl9pZCk7CisgIHJiX2Z1bmNhbGwoR0VUX1RSQU5TUE9SVChzZWxmKSwgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQsIDIsIHJidWYsIElOVDJGSVgoNCkpOworICByZXR1cm4gKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVszXSkpIHwKKyAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVsyXSkpIDw8IDgpIHwKKyAgICAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVsxXSkpIDw8IDE2KSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMF0pKSA8PCAyNCk7CiB9CiAKIHN0YXRpYyBpbnQ2NF90IHJlYWRfaTY0X2RpcmVjdChWQUxVRSBzZWxmKSB7Ci0gIHVpbnQ2NF90IGhpID0gcmVhZF9pMzJfZGlyZWN0KHNlbGYpOwotICB1aW50MzJfdCBsbyA9IHJlYWRfaTMyX2RpcmVjdChzZWxmKTsKKyAgVkFMVUUgcmJ1ZiA9IHJiX2l2YXJfZ2V0KHNlbGYsIHJidWZfaXZhcl9pZCk7CisgIHJiX2Z1bmNhbGwoR0VUX1RSQU5TUE9SVChzZWxmKSwgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQsIDIsIHJidWYsIElOVDJGSVgoOCkpOworICB1aW50NjRfdCBoaSA9ICgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbM10pKSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMl0pKSA8PCA4KSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbMV0pKSA8PCAxNikgfAorICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzBdKSkgPDwgMjQpOworICB1aW50MzJfdCBsbyA9ICgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbN10pKSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbNl0pKSA8PCA4KSB8CisgICAgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbNV0pKSA8PCAxNikgfAorICAgICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzRdKSkgPDwgMjQpOwogICByZXR1cm4gKGhpIDw8IDMyKSB8IGxvOwogfQogCkBAIC0yNjAsMjcgKzI4MywyNyBAQAogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW4oVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQoVkFMVUUgc2VsZikgeworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2ZpZWxkX2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKLVZBTFVFIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKQEAgLTM2OCwyMSArMzkxLDI2IEBACiB9CiAKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJpbmcoVkFMVUUgc2VsZikgeworICBWQUxVRSBidWZmZXIgPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfYmluYXJ5KHNlbGYpOworICByZXR1cm4gY29udmVydF90b19zdHJpbmcoYnVmZmVyKTsKK30KKworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2JpbmFyeShWQUxVRSBzZWxmKSB7CiAgIGludCBzaXplID0gcmVhZF9pMzJfZGlyZWN0KHNlbGYpOwogICByZXR1cm4gUkVBRChzZWxmLCBzaXplKTsKIH0KIAogdm9pZCBJbml0X2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZCgpIHsKICAgVkFMVUUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9jbGFzcyA9IHJiX2NvbnN0X2dldCh0aHJpZnRfbW9kdWxlLCByYl9pbnRlcm4oIkJpbmFyeVByb3RvY29sIikpOwotICAKKwogICBWRVJTSU9OXzEgPSByYl9udW0ybGwocmJfY29uc3RfZ2V0KHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiVkVSU0lPTl8xIikpKTsKICAgVkVSU0lPTl9NQVNLID0gcmJfbnVtMmxsKHJiX2NvbnN0X2dldCh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlZFUlNJT05fTUFTSyIpKSk7CiAgIFRZUEVfTUFTSyA9IHJiX251bTJsbChyYl9jb25zdF9nZXQodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJUWVBFX01BU0siKSkpOwotICAKKwogICBWQUxVRSBicGFfY2xhc3MgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIodGhyaWZ0X21vZHVsZSwgIkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQiLCB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2NsYXNzKTsKLSAgCisKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJuYXRpdmU/IiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19uYXRpdmVfcW1hcmssIDApOwotICAKKwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX21lc3NhZ2VfYmVnaW4iLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX21lc3NhZ2VfYmVnaW4sIDMpOwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX2ZpZWxkX2JlZ2luIiwgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2ZpZWxkX2JlZ2luLCAzKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9maWVsZF9zdG9wIiwgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9maWVsZF9zdG9wLCAwKTsKQEAgLTM5Niw2ICs0MjQsNyBAQAogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX2k2NCIsICAgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2k2NCwgMSk7CiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfZG91YmxlIiwgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfZG91YmxlLCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9zdHJpbmciLCAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9zdHJpbmcsIDEpOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX2JpbmFyeSIsICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2JpbmFyeSwgMSk7CiAgIC8vIHVudXNlZCBtZXRob2RzCiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX21lc3NhZ2VfZW5kLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9zdHJ1Y3RfYmVnaW4iLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX3N0cnVjdF9iZWdpbiwgMSk7CkBAIC00MDQsOCArNDMzLDYgQEAKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9tYXBfZW5kIiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9tYXBfZW5kLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9saXN0X2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfbGlzdF9lbmQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX3NldF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX3NldF9lbmQsIDApOwotICAKLQogCiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9tZXNzYWdlX2JlZ2luIiwgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tZXNzYWdlX2JlZ2luLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2ZpZWxkX2JlZ2luIiwgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2ZpZWxkX2JlZ2luLCAwKTsKQEAgLTQxOSw1OSArNDQ2LDE1IEBACiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9pNjQiLCAgICAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9pNjQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfZG91YmxlIiwgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfZG91YmxlLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cmluZyIsICAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cmluZywgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9iaW5hcnkiLCAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9iaW5hcnksIDApOwogICAvLyB1bnVzZWQgbWV0aG9kcwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWVzc2FnZV9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfc3RydWN0X2JlZ2luIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2ZpZWxkX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9tYXBfZW5kIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9saXN0X2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3NldF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW4sIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfc3RydWN0X2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQsIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWFwX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2xpc3RfZW5kIiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3NldF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZCwgMCk7CiAKLSAgLy8gc2V0IHVwIG5hdGl2ZSBtZXRob2QgdGFibGUKLSAgbmF0aXZlX3Byb3RvX21ldGhvZF90YWJsZSAqbnBtdDsKLSAgbnBtdCA9IEFMTE9DKG5hdGl2ZV9wcm90b19tZXRob2RfdGFibGUpOwotCi0gIG5wbXQtPndyaXRlX2ZpZWxkX2JlZ2luID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9maWVsZF9iZWdpbjsKLSAgbnBtdC0+d3JpdGVfZmllbGRfc3RvcCA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfZmllbGRfc3RvcDsKLSAgbnBtdC0+d3JpdGVfbWFwX2JlZ2luID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9tYXBfYmVnaW47Ci0gIG5wbXQtPndyaXRlX2xpc3RfYmVnaW4gPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2xpc3RfYmVnaW47Ci0gIG5wbXQtPndyaXRlX3NldF9iZWdpbiA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfc2V0X2JlZ2luOwotICBucG10LT53cml0ZV9ieXRlID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9ieXRlOwotICBucG10LT53cml0ZV9ib29sID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9ib29sOwotICBucG10LT53cml0ZV9pMTYgPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2kxNjsKLSAgbnBtdC0+d3JpdGVfaTMyID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9pMzI7Ci0gIG5wbXQtPndyaXRlX2k2NCA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfaTY0OwotICBucG10LT53cml0ZV9kb3VibGUgPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX2RvdWJsZTsKLSAgbnBtdC0+d3JpdGVfc3RyaW5nID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9zdHJpbmc7Ci0gIG5wbXQtPndyaXRlX21lc3NhZ2VfZW5kID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9tZXNzYWdlX2VuZDsKLSAgbnBtdC0+d3JpdGVfc3RydWN0X2JlZ2luID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9zdHJ1Y3RfYmVnaW47Ci0gIG5wbXQtPndyaXRlX3N0cnVjdF9lbmQgPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX3N0cnVjdF9lbmQ7Ci0gIG5wbXQtPndyaXRlX2ZpZWxkX2VuZCA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfZmllbGRfZW5kOwotICBucG10LT53cml0ZV9tYXBfZW5kID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9tYXBfZW5kOwotICBucG10LT53cml0ZV9saXN0X2VuZCA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfbGlzdF9lbmQ7Ci0gIG5wbXQtPndyaXRlX3NldF9lbmQgPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX3NldF9lbmQ7Ci0KLSAgbnBtdC0+cmVhZF9tZXNzYWdlX2JlZ2luID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX21lc3NhZ2VfYmVnaW47Ci0gIG5wbXQtPnJlYWRfZmllbGRfYmVnaW4gPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfZmllbGRfYmVnaW47Ci0gIG5wbXQtPnJlYWRfbWFwX2JlZ2luID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX21hcF9iZWdpbjsKLSAgbnBtdC0+cmVhZF9saXN0X2JlZ2luID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfYmVnaW47Ci0gIG5wbXQtPnJlYWRfc2V0X2JlZ2luID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3NldF9iZWdpbjsKLSAgbnBtdC0+cmVhZF9ieXRlID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2J5dGU7Ci0gIG5wbXQtPnJlYWRfYm9vbCA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9ib29sOwotICBucG10LT5yZWFkX2kxNiA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9pMTY7Ci0gIG5wbXQtPnJlYWRfaTMyID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2kzMjsKLSAgbnBtdC0+cmVhZF9pNjQgPSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfaTY0OwotICBucG10LT5yZWFkX2RvdWJsZSA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9kb3VibGU7Ci0gIG5wbXQtPnJlYWRfc3RyaW5nID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cmluZzsKLSAgbnBtdC0+cmVhZF9tZXNzYWdlX2VuZCA9IHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tZXNzYWdlX2VuZDsKLSAgbnBtdC0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW47Ci0gIG5wbXQtPnJlYWRfc3RydWN0X2VuZCA9IHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cnVjdF9lbmQ7Ci0gIG5wbXQtPnJlYWRfZmllbGRfZW5kID0gcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfZmllbGRfZW5kOwotICBucG10LT5yZWFkX21hcF9lbmQgPSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kOwotICBucG10LT5yZWFkX2xpc3RfZW5kID0gcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbGlzdF9lbmQ7Ci0gIG5wbXQtPnJlYWRfc2V0X2VuZCA9IHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX3NldF9lbmQ7Ci0gIAotICBWQUxVRSBtZXRob2RfdGFibGVfb2JqZWN0ID0gRGF0YV9XcmFwX1N0cnVjdChyYl9jT2JqZWN0LCAwLCBmcmVlLCBucG10KTsKLSAgcmJfY29uc3Rfc2V0KGJwYV9jbGFzcywgcmJfaW50ZXJuKCJAbmF0aXZlX21ldGhvZF90YWJsZSIpLCBtZXRob2RfdGFibGVfb2JqZWN0KTsKKyAgcmJ1Zl9pdmFyX2lkID0gcmJfaW50ZXJuKCJAcmJ1ZiIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9ieXRlcy5jIGIvbGliL3JiL2V4dC9ieXRlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNmZhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvZXh0L2J5dGVzLmMKQEAgLTAsMCArMSwzNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHJ1YnkuaD4KKyNpZmRlZiBIQVZFX1JVQllfRU5DT0RJTkdfSAorI2luY2x1ZGUgPHJ1YnkvZW5jb2RpbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGNvbnN0YW50cy5oPgorCitWQUxVRSBmb3JjZV9iaW5hcnlfZW5jb2RpbmcoVkFMVUUgYnVmZmVyKSB7CisgIHJldHVybiByYl9mdW5jYWxsKHRocmlmdF9ieXRlc19tb2R1bGUsIGZvcmNlX2JpbmFyeV9lbmNvZGluZ19pZCwgMSwgYnVmZmVyKTsKK30KKworVkFMVUUgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKFZBTFVFIHN0cmluZykgeworICByZXR1cm4gcmJfZnVuY2FsbCh0aHJpZnRfYnl0ZXNfbW9kdWxlLCBjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXJfaWQsIDEsIHN0cmluZyk7Cit9CisKK1ZBTFVFIGNvbnZlcnRfdG9fc3RyaW5nKFZBTFVFIHV0ZjhfYnVmZmVyKSB7CisgIHJldHVybiByYl9mdW5jYWxsKHRocmlmdF9ieXRlc19tb2R1bGUsIGNvbnZlcnRfdG9fc3RyaW5nX2lkLCAxLCB1dGY4X2J1ZmZlcik7Cit9CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L2J5dGVzLmggYi9saWIvcmIvZXh0L2J5dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwOGQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9leHQvYnl0ZXMuaApAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8cnVieS5oPgorCisvKgorICogQSBjb2xsZWN0aW9uIG9mIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIGJ5dGVzIGFuZCBieXRlIGJ1ZmZlcnMuCisgKgorICogVGhlc2UgbWV0aG9kcyBhcmUgdGhlIG5hdGl2ZSBhbmFsb2dpZXMgdG8gc29tZSBvZiB0aGUgbWV0aG9kcyBpbgorICogVGhyaWZ0OjpCeXRlcyAodGhyaWZ0L2J5dGVzLnJiKS4KKyAqLworCitWQUxVRSBmb3JjZV9iaW5hcnlfZW5jb2RpbmcoVkFMVUUgYnVmZmVyKTsKK1ZBTFVFIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihWQUxVRSBzdHJpbmcpOworVkFMVUUgY29udmVydF90b19zdHJpbmcoVkFMVUUgdXRmOF9idWZmZXIpOwpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9jb21wYWN0X3Byb3RvY29sLmMgYi9saWIvcmIvZXh0L2NvbXBhY3RfcHJvdG9jb2wuYwppbmRleCA3NjhiMmU1Li5jMGY0NmI5IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L2NvbXBhY3RfcHJvdG9jb2wuYworKysgYi9saWIvcmIvZXh0L2NvbXBhY3RfcHJvdG9jb2wuYwpAQCAtMjIsNyArMjIsOCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGNvbnN0YW50cy5oPgogI2luY2x1ZGUgPHN0cnVjdC5oPgotI2luY2x1ZGUgIm1hY3Jvcy5oIgorI2luY2x1ZGUgPG1hY3Jvcy5oPgorI2luY2x1ZGUgPGJ5dGVzLmg+CiAKICNkZWZpbmUgTEFTVF9JRChvYmopIEZJWDJJTlQocmJfYXJ5X3BvcChyYl9pdmFyX2dldChvYmosIGxhc3RfZmllbGRfaWQpKSkKICNkZWZpbmUgU0VUX0xBU1RfSUQob2JqLCB2YWwpIHJiX2FyeV9wdXNoKHJiX2l2YXJfZ2V0KG9iaiwgbGFzdF9maWVsZF9pZCksIHZhbCkKQEAgLTM0LDEwICszNSwxMiBAQAogc3RhdGljIElEIGxhc3RfZmllbGRfaWQ7CiBzdGF0aWMgSUQgYm9vbGVhbl9maWVsZF9pZDsKIHN0YXRpYyBJRCBib29sX3ZhbHVlX2lkOworc3RhdGljIElEIHJidWZfaXZhcl9pZDsKIAogc3RhdGljIGludCBWRVJTSU9OOwogc3RhdGljIGludCBWRVJTSU9OX01BU0s7CiBzdGF0aWMgaW50IFRZUEVfTUFTSzsKK3N0YXRpYyBpbnQgVFlQRV9CSVRTOwogc3RhdGljIGludCBUWVBFX1NISUZUX0FNT1VOVDsKIHN0YXRpYyBpbnQgUFJPVE9DT0xfSUQ7CiAKQEAgLTE2NSw2ICsxNjgsNyBAQAogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9pMzIoVkFMVUUgc2VsZiwgVkFMVUUgaTMyKTsKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cmluZyhWQUxVRSBzZWxmLCBWQUxVRSBzdHIpOworVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfYmluYXJ5KFZBTFVFIHNlbGYsIFZBTFVFIGJ1Zik7CiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX21lc3NhZ2VfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CkBAIC0zMDMsOSArMzA3LDE2IEBACiB9CiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cmluZyhWQUxVRSBzZWxmLCBWQUxVRSBzdHIpIHsKKyAgc3RyID0gY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cik7CisgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2JpbmFyeShzZWxmLCBzdHIpOworICByZXR1cm4gUW5pbDsKK30KKworVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfYmluYXJ5KFZBTFVFIHNlbGYsIFZBTFVFIGJ1ZikgeworICBidWYgPSBmb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKTsKICAgVkFMVUUgdHJhbnNwb3J0ID0gR0VUX1RSQU5TUE9SVChzZWxmKTsKLSAgd3JpdGVfdmFyaW50MzIodHJhbnNwb3J0LCBSU1RSSU5HX0xFTihzdHIpKTsKLSAgV1JJVEUodHJhbnNwb3J0LCBSU1RSSU5HX1BUUihzdHIpLCBSU1RSSU5HX0xFTihzdHIpKTsKKyAgd3JpdGVfdmFyaW50MzIodHJhbnNwb3J0LCBSU1RSSU5HX0xFTihidWYpKTsKKyAgV1JJVEUodHJhbnNwb3J0LCBTdHJpbmdWYWx1ZVB0cihidWYpLCBSU1RSSU5HX0xFTihidWYpKTsKICAgcmV0dXJuIFFuaWw7CiB9CiAKQEAgLTMxNiw2ICszMjcsNyBAQAogI2RlZmluZSBpc19ib29sX3R5cGUoY3R5cGUpICgoKGN0eXBlKSAmIDB4MEYpID09IENUWVBFX0JPT0xFQU5fVFJVRSB8fCAoKGN0eXBlKSAmIDB4MEYpID09IENUWVBFX0JPT0xFQU5fRkFMU0UpCiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RyaW5nKFZBTFVFIHNlbGYpOworVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9iaW5hcnkoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2J5dGUoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2kzMihWQUxVRSBzZWxmKTsKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfaTE2KFZBTFVFIHNlbGYpOwpAQCAtMzU0LDggKzM2Niw4IEBACiB9CiAKIHN0YXRpYyBjaGFyIHJlYWRfYnl0ZV9kaXJlY3QoVkFMVUUgc2VsZikgewotICBWQUxVRSBidWYgPSBSRUFEKHNlbGYsIDEpOwotICByZXR1cm4gUlNUUklOR19QVFIoYnVmKVswXTsKKyAgVkFMVUUgYnl0ZSA9IHJiX2Z1bmNhbGwoR0VUX1RSQU5TUE9SVChzZWxmKSwgcmVhZF9ieXRlX21ldGhvZF9pZCwgMCk7CisgIHJldHVybiAoY2hhcikoRklYMklOVChieXRlKSk7CiB9CiAKIHN0YXRpYyBpbnQ2NF90IHppZ196YWdfdG9fbGwoaW50NjRfdCBuKSB7CkBAIC00MzksNyArNDUxLDcgQEAKICAgICByYl9leGNfcmFpc2UoZ2V0X3Byb3RvY29sX2V4Y2VwdGlvbihJTlQyRklYKC0xKSwgcmJfc3RyX25ldzIoYnVmKSkpOwogICB9CiAgIAotICBpbnQ4X3QgdHlwZSA9ICh2ZXJzaW9uX2FuZF90eXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIDB4MDM7CisgIGludDhfdCB0eXBlID0gKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTOwogICBpbnQzMl90IHNlcWlkID0gcmVhZF92YXJpbnQ2NChzZWxmKTsKICAgVkFMVUUgbWVzc2FnZU5hbWUgPSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cmluZyhzZWxmKTsKICAgcmV0dXJuIHJiX2FyeV9uZXczKDMsIG1lc3NhZ2VOYW1lLCBJTlQyRklYKHR5cGUpLCBJTlQyTlVNKHNlcWlkKSk7CkBAIC00NTgsNyArNDcwLDcgQEAKICAgICAKICAgICBpZiAobW9kaWZpZXIgPT0gMCkgewogICAgICAgLy8gbm90IGEgZGVsdGEuIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgotICAgICAgTEFTVF9JRChzZWxmKTsKKyAgICAgICh2b2lkKSBMQVNUX0lEKHNlbGYpOwogICAgICAgZmllbGRfaWQgPSByZWFkX2kxNihzZWxmKTsKICAgICB9IGVsc2UgewogICAgICAgLy8gaGFzIGEgZGVsdGEuIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgcmVhZCBmaWVsZCBpZC4KQEAgLTUyOCwzNyArNTQwLDQ1IEBACiAgICAgZG91YmxlIGY7CiAgICAgaW50NjRfdCBsOwogICB9IHRyYW5zZmVyOwotICBWQUxVRSBieXRlcyA9IFJFQUQoc2VsZiwgOCk7Ci0gIHVpbnQzMl90IGxvID0gKCh1aW50OF90KShSU1RSSU5HX1BUUihieXRlcylbMF0pKQotICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnl0ZXMpWzFdKSkgPDwgOCkKLSAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ5dGVzKVsyXSkpIDw8IDE2KQotICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnl0ZXMpWzNdKSkgPDwgMjQpOwotICB1aW50NjRfdCBoaSA9ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ5dGVzKVs0XSkpKQotICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnl0ZXMpWzVdKSkgPDwgOCkKLSAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKGJ5dGVzKVs2XSkpIDw8IDE2KQotICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIoYnl0ZXMpWzddKSkgPDwgMjQpOworICBWQUxVRSByYnVmID0gcmJfaXZhcl9nZXQoc2VsZiwgcmJ1Zl9pdmFyX2lkKTsKKyAgcmJfZnVuY2FsbChHRVRfVFJBTlNQT1JUKHNlbGYpLCByZWFkX2ludG9fYnVmZmVyX21ldGhvZF9pZCwgMiwgcmJ1ZiwgSU5UMkZJWCg4KSk7CisgIHVpbnQzMl90IGxvID0gKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVswXSkpCisgICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVsxXSkpIDw8IDgpCisgICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVsyXSkpIDw8IDE2KQorICAgIHwgKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbM10pKSA8PCAyNCk7CisgIHVpbnQ2NF90IGhpID0gKCgodWludDhfdCkoUlNUUklOR19QVFIocmJ1ZilbNF0pKSkKKyAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzVdKSkgPDwgOCkKKyAgICB8ICgoKHVpbnQ4X3QpKFJTVFJJTkdfUFRSKHJidWYpWzZdKSkgPDwgMTYpCisgICAgfCAoKCh1aW50OF90KShSU1RSSU5HX1BUUihyYnVmKVs3XSkpIDw8IDI0KTsKICAgdHJhbnNmZXIubCA9IChoaSA8PCAzMikgfCBsbzsKIAogICByZXR1cm4gcmJfZmxvYXRfbmV3KHRyYW5zZmVyLmYpOwogfQogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cmluZyhWQUxVRSBzZWxmKSB7CisgIFZBTFVFIGJ1ZmZlciA9IHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfYmluYXJ5KHNlbGYpOworICByZXR1cm4gY29udmVydF90b19zdHJpbmcoYnVmZmVyKTsKK30KKworVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9iaW5hcnkoVkFMVUUgc2VsZikgewogICBpbnQ2NF90IHNpemUgPSByZWFkX3ZhcmludDY0KHNlbGYpOwogICByZXR1cm4gUkVBRChzZWxmLCBzaXplKTsKIH0KIAogc3RhdGljIHZvaWQgSW5pdF9jb25zdGFudHMoKSB7CiAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzID0gcmJfY29uc3RfZ2V0KHRocmlmdF9tb2R1bGUsIHJiX2ludGVybigiQ29tcGFjdFByb3RvY29sIikpOwotICAKKwogICBWRVJTSU9OID0gcmJfbnVtMmxsKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJWRVJTSU9OIikpKTsKICAgVkVSU0lPTl9NQVNLID0gcmJfbnVtMmxsKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJWRVJTSU9OX01BU0siKSkpOwogICBUWVBFX01BU0sgPSByYl9udW0ybGwocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlRZUEVfTUFTSyIpKSk7CisgIFRZUEVfQklUUyA9IHJiX251bTJsbChyYl9jb25zdF9nZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiVFlQRV9CSVRTIikpKTsKICAgVFlQRV9TSElGVF9BTU9VTlQgPSBGSVgySU5UKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJUWVBFX1NISUZUX0FNT1VOVCIpKSk7CiAgIFBST1RPQ09MX0lEID0gRklYMklOVChyYl9jb25zdF9nZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiUFJPVE9DT0xfSUQiKSkpOwotICAKKwogICBsYXN0X2ZpZWxkX2lkID0gcmJfaW50ZXJuKCJAbGFzdF9maWVsZCIpOwogICBib29sZWFuX2ZpZWxkX2lkID0gcmJfaW50ZXJuKCJAYm9vbGVhbl9maWVsZCIpOwogICBib29sX3ZhbHVlX2lkID0gcmJfaW50ZXJuKCJAYm9vbF92YWx1ZSIpOworICByYnVmX2l2YXJfaWQgPSByYl9pbnRlcm4oIkByYnVmIik7CiB9CiAKIHN0YXRpYyB2b2lkIEluaXRfcmJfbWV0aG9kcygpIHsKQEAgLTU3Nyw2ICs1OTcsNyBAQAogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAid3JpdGVfaTY0IiwgICAgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2k2NCwgMSk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9kb3VibGUiLCAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfZG91YmxlLCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX3N0cmluZyIsICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9zdHJpbmcsIDEpOworICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAid3JpdGVfYmluYXJ5IiwgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2JpbmFyeSwgMSk7CiAKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX21lc3NhZ2VfZW5kIiwgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfbWVzc2FnZV9lbmQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAid3JpdGVfc3RydWN0X2JlZ2luIiwgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfc3RydWN0X2JlZ2luLCAxKTsKQEAgLTU5OSw2ICs2MjAsNyBAQAogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAicmVhZF9pNjQiLCAgICAgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfaTY0LCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfZG91YmxlIiwgICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2RvdWJsZSwgMCk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX3N0cmluZyIsICAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9zdHJpbmcsIDApOworICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAicmVhZF9iaW5hcnkiLCAgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfYmluYXJ5LCAwKTsKIAogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAicmVhZF9tZXNzYWdlX2VuZCIsIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfbWVzc2FnZV9lbmQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAicmVhZF9zdHJ1Y3RfYmVnaW4iLCAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW4sIDApOwpAQCAtNjA5LDU4ICs2MzEsNyBAQAogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAicmVhZF9zZXRfZW5kIiwgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9zZXRfZW5kLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgSW5pdF9ucG10KCkgewotICBuYXRpdmVfcHJvdG9fbWV0aG9kX3RhYmxlICpucG10OwotICBucG10ID0gQUxMT0MobmF0aXZlX3Byb3RvX21ldGhvZF90YWJsZSk7Ci0gIAotICBucG10LT53cml0ZV9maWVsZF9iZWdpbiAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2ZpZWxkX2JlZ2luOwotICBucG10LT53cml0ZV9maWVsZF9zdG9wICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2ZpZWxkX3N0b3A7Ci0gIG5wbXQtPndyaXRlX21hcF9iZWdpbiAgICAgPSAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfbWFwX2JlZ2luOwotICBucG10LT53cml0ZV9saXN0X2JlZ2luICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2xpc3RfYmVnaW47Ci0gIG5wbXQtPndyaXRlX3NldF9iZWdpbiAgICAgPSAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfc2V0X2JlZ2luOwotICBucG10LT53cml0ZV9ieXRlICAgICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2J5dGU7Ci0gIG5wbXQtPndyaXRlX2Jvb2wgICAgICAgICAgPSAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfYm9vbDsKLSAgbnBtdC0+d3JpdGVfaTE2ICAgICAgICAgICA9ICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9pMTY7Ci0gIG5wbXQtPndyaXRlX2kzMiAgICAgICAgICAgPSAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfaTMyOwotICBucG10LT53cml0ZV9pNjQgICAgICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2k2NDsKLSAgbnBtdC0+d3JpdGVfZG91YmxlICAgICAgICA9ICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9kb3VibGU7Ci0gIG5wbXQtPndyaXRlX3N0cmluZyAgICAgICAgPSAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfc3RyaW5nOwotICBucG10LT53cml0ZV9tZXNzYWdlX2VuZCAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX21lc3NhZ2VfZW5kOwotICBucG10LT53cml0ZV9zdHJ1Y3RfYmVnaW4gID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cnVjdF9iZWdpbjsKLSAgbnBtdC0+d3JpdGVfc3RydWN0X2VuZCAgICA9ICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9zdHJ1Y3RfZW5kOwotICBucG10LT53cml0ZV9maWVsZF9lbmQgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2ZpZWxkX2VuZDsKLSAgbnBtdC0+d3JpdGVfbWFwX2VuZCAgICAgICA9ICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9tYXBfZW5kOwotICBucG10LT53cml0ZV9saXN0X2VuZCAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2xpc3RfZW5kOwotICBucG10LT53cml0ZV9zZXRfZW5kICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3NldF9lbmQ7Ci0gIAotICBucG10LT5yZWFkX21lc3NhZ2VfYmVnaW4gID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfbWVzc2FnZV9iZWdpbjsKLSAgbnBtdC0+cmVhZF9maWVsZF9iZWdpbiAgICA9ICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2ZpZWxkX2JlZ2luOwotICBucG10LT5yZWFkX21hcF9iZWdpbiAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfbWFwX2JlZ2luOwotICBucG10LT5yZWFkX2xpc3RfYmVnaW4gICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfbGlzdF9iZWdpbjsKLSAgbnBtdC0+cmVhZF9zZXRfYmVnaW4gICAgICA9ICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3NldF9iZWdpbjsKLSAgbnBtdC0+cmVhZF9ieXRlICAgICAgICAgICA9ICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2J5dGU7Ci0gIG5wbXQtPnJlYWRfYm9vbCAgICAgICAgICAgPSAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9ib29sOwotICBucG10LT5yZWFkX2kxNiAgICAgICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfaTE2OwotICBucG10LT5yZWFkX2kzMiAgICAgICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfaTMyOwotICBucG10LT5yZWFkX2k2NCAgICAgICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfaTY0OwotICBucG10LT5yZWFkX2RvdWJsZSAgICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfZG91YmxlOwotICBucG10LT5yZWFkX3N0cmluZyAgICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RyaW5nOwotICBucG10LT5yZWFkX21lc3NhZ2VfZW5kICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfbWVzc2FnZV9lbmQ7Ci0gIG5wbXQtPnJlYWRfc3RydWN0X2JlZ2luICAgPSAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW47Ci0gIG5wbXQtPnJlYWRfc3RydWN0X2VuZCAgICAgPSAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9zdHJ1Y3RfZW5kOwotICBucG10LT5yZWFkX2ZpZWxkX2VuZCAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfZmllbGRfZW5kOwotICBucG10LT5yZWFkX21hcF9lbmQgICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfbWFwX2VuZDsKLSAgbnBtdC0+cmVhZF9saXN0X2VuZCAgICAgICA9ICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2xpc3RfZW5kOwotICBucG10LT5yZWFkX3NldF9lbmQgICAgICAgID0gIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc2V0X2VuZDsKLSAgCi0gIFZBTFVFIG1ldGhvZF90YWJsZV9vYmplY3QgPSBEYXRhX1dyYXBfU3RydWN0KHJiX2NPYmplY3QsIDAsIGZyZWUsIG5wbXQpOwotICByYl9jb25zdF9zZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiQG5hdGl2ZV9tZXRob2RfdGFibGUiKSwgbWV0aG9kX3RhYmxlX29iamVjdCk7Ci19Ci0KLQotCiB2b2lkIEluaXRfY29tcGFjdF9wcm90b2NvbCgpIHsKICAgSW5pdF9jb25zdGFudHMoKTsKICAgSW5pdF9yYl9tZXRob2RzKCk7Ci0gIEluaXRfbnBtdCgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9jb25zdGFudHMuaCBiL2xpYi9yYi9leHQvY29uc3RhbnRzLmgKaW5kZXggNTdkZjU0NC4uZTdhZWM0NCAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9jb25zdGFudHMuaAorKysgYi9saWIvcmIvZXh0L2NvbnN0YW50cy5oCkBAIC00MiwxOSArNDIsMjAgQEAKIGV4dGVybiBJRCB3cml0ZV9pNjRfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX2RvdWJsZV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfc3RyaW5nX21ldGhvZF9pZDsKK2V4dGVybiBJRCB3cml0ZV9iaW5hcnlfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX21hcF9iZWdpbl9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfbWFwX2VuZF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfbGlzdF9iZWdpbl9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfbGlzdF9lbmRfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX3NldF9iZWdpbl9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfc2V0X2VuZF9tZXRob2RfaWQ7Ci1leHRlcm4gSUQgc2l6ZV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9ib29sX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2J5dGVfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfaTE2X21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2kzMl9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9pNjRfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfc3RyaW5nX21ldGhvZF9pZDsKK2V4dGVybiBJRCByZWFkX2JpbmFyeV9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9kb3VibGVfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfbWFwX2JlZ2luX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX21hcF9lbmRfbWV0aG9kX2lkOwpAQCAtNjcsMTQgKzY4LDE1IEBACiBleHRlcm4gSUQgcmVhZF9maWVsZF9iZWdpbl9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9maWVsZF9lbmRfbWV0aG9kX2lkOwogZXh0ZXJuIElEIGtleXNfbWV0aG9kX2lkOwotZXh0ZXJuIElEIGVudHJpZXNfbWV0aG9kX2lkOyAKLWV4dGVybiBJRCBuYW1lX21ldGhvZF9pZDsgCi1leHRlcm4gSUQgc29ydF9tZXRob2RfaWQ7CitleHRlcm4gSUQgZW50cmllc19tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfZmllbGRfc3RvcF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgc2tpcF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgd3JpdGVfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfYWxsX21ldGhvZF9pZDsKLWV4dGVybiBJRCBuYXRpdmVfcW1hcmtfbWV0aG9kX2lkOworZXh0ZXJuIElEIHJlYWRfaW50b19idWZmZXJfbWV0aG9kX2lkOworZXh0ZXJuIElEIGZvcmNlX2JpbmFyeV9lbmNvZGluZ19pZDsKK2V4dGVybiBJRCBjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXJfaWQ7CitleHRlcm4gSUQgY29udmVydF90b19zdHJpbmdfaWQ7CiAKIGV4dGVybiBJRCBmaWVsZHNfY29uc3RfaWQ7CiBleHRlcm4gSUQgdHJhbnNwb3J0X2l2YXJfaWQ7CkBAIC04Nyw5ICs4OSwxMSBAQAogZXh0ZXJuIFZBTFVFIHZhbHVlX3N5bTsKIGV4dGVybiBWQUxVRSBlbGVtZW50X3N5bTsKIGV4dGVybiBWQUxVRSBjbGFzc19zeW07CitleHRlcm4gVkFMVUUgYmluYXJ5X3N5bTsKIAogZXh0ZXJuIFZBTFVFIHJiX2NTZXQ7CiBleHRlcm4gVkFMVUUgdGhyaWZ0X21vZHVsZTsKIGV4dGVybiBWQUxVRSB0aHJpZnRfdHlwZXNfbW9kdWxlOworZXh0ZXJuIFZBTFVFIHRocmlmdF9ieXRlc19tb2R1bGU7CiBleHRlcm4gVkFMVUUgY2xhc3NfdGhyaWZ0X3Byb3RvY29sOwogZXh0ZXJuIFZBTFVFIHByb3RvY29sX2V4Y2VwdGlvbl9jbGFzczsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvZXh0Y29uZi5yYiBiL2xpYi9yYi9leHQvZXh0Y29uZi5yYgppbmRleCAwNzU1OGI4Li5iMzVmNjBiIDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L2V4dGNvbmYucmIKKysrIGIvbGliL3JiL2V4dC9leHRjb25mLnJiCkBAIC0xNywxMCArMTcsMTggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjIAogCi1yZXF1aXJlICdta21mJworaWYgZGVmaW5lZD8oUlVCWV9FTkdJTkUpICYmIFJVQllfRU5HSU5FID1+IC9qcnVieS8KKyAgRmlsZS5vcGVuKCdNYWtlZmlsZScsICd3Jyl7fGZ8IGYucHV0cyAiYWxsOlxuXG5pbnN0YWxsOlxuIiB9CitlbHNlCisgIHJlcXVpcmUgJ21rbWYnCisgIHJlcXVpcmUgJ3JiY29uZmlnJwogCi0kQ0ZMQUdTID0gIi1nIC1PMiAtV2FsbCAtV2Vycm9yIgorICAkQVJDSF9GTEFHUyA9IFJiQ29uZmlnOjpDT05GSUdbJ0NGTEFHUyddLnNjYW4oIC8oLWFyY2ggKShcUyspLyApLm1hcHt8eCx5fCB4ICsgeSArICcgJyB9LmpvaW4oJycpCiAKLWhhdmVfZnVuYygic3RybGNweSIsICJzdHJpbmcuaCIpCiAKLWNyZWF0ZV9tYWtlZmlsZSAndGhyaWZ0X25hdGl2ZScKKyAgJENGTEFHUyA9ICItZnNpZ25lZC1jaGFyIC1nIC1PMiAtV2FsbCAtV2Vycm9yICIgKyAkQVJDSF9GTEFHUworCisgIGhhdmVfZnVuYygic3RybGNweSIsICJzdHJpbmcuaCIpCisKKyAgY3JlYXRlX21ha2VmaWxlICd0aHJpZnRfbmF0aXZlJworZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L21lbW9yeV9idWZmZXIuYyBiL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jCmluZGV4IDc0ZWZhMmMuLjhiNTJjNGEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jCisrKyBiL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jCkBAIC0xOSw3ICsxOSw4IEBACiAKICNpbmNsdWRlIDxydWJ5Lmg+CiAjaW5jbHVkZSA8Y29uc3RhbnRzLmg+Ci0jaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSA8Ynl0ZXMuaD4KKyNpbmNsdWRlIDxtYWNyb3MuaD4KIAogSUQgYnVmX2l2YXJfaWQ7CiBJRCBpbmRleF9pdmFyX2lkOwpAQCAtMzAsOSArMzEsMTUgQEAKIAogI2RlZmluZSBHRVRfQlVGKHNlbGYpIHJiX2l2YXJfZ2V0KHNlbGYsIGJ1Zl9pdmFyX2lkKQogCitWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZShWQUxVRSBzZWxmLCBWQUxVRSBzdHIpOworVkFMVUUgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZChWQUxVRSBzZWxmLCBWQUxVRSBsZW5ndGhfdmFsdWUpOworVkFMVUUgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9ieXRlKFZBTFVFIHNlbGYpOworVkFMVUUgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9pbnRvX2J1ZmZlcihWQUxVRSBzZWxmLCBWQUxVRSBidWZmZXJfdmFsdWUsIFZBTFVFIHNpemVfdmFsdWUpOworCiBWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZShWQUxVRSBzZWxmLCBWQUxVRSBzdHIpIHsKICAgVkFMVUUgYnVmID0gR0VUX0JVRihzZWxmKTsKLSAgcmJfc3RyX2J1Zl9jYXQoYnVmLCBSU1RSSU5HX1BUUihzdHIpLCBSU1RSSU5HX0xFTihzdHIpKTsKKyAgc3RyID0gZm9yY2VfYmluYXJ5X2VuY29kaW5nKHN0cik7CisgIHJiX3N0cl9idWZfY2F0KGJ1ZiwgU3RyaW5nVmFsdWVQdHIoc3RyKSwgUlNUUklOR19MRU4oc3RyKSk7CiAgIHJldHVybiBRbmlsOwogfQogCkBAIC01MywxOSArNjAsNzAgQEAKICAgICByYl9pdmFyX3NldChzZWxmLCBidWZfaXZhcl9pZCwgcmJfZnVuY2FsbChidWYsIHNsaWNlX21ldGhvZF9pZCwgMiwgSU5UMkZJWChpbmRleCksIElOVDJGSVgoUlNUUklOR19MRU4oYnVmKSAtIDEpKSk7CiAgICAgaW5kZXggPSAwOwogICB9CisgIHJiX2l2YXJfc2V0KHNlbGYsIGluZGV4X2l2YXJfaWQsIElOVDJGSVgoaW5kZXgpKTsKIAogICBpZiAoUlNUUklOR19MRU4oZGF0YSkgPCBsZW5ndGgpIHsKICAgICByYl9yYWlzZShyYl9lRU9GRXJyb3IsICJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBtZW1vcnkgYnVmZmVyIik7CiAgIH0KIAotICByYl9pdmFyX3NldChzZWxmLCBpbmRleF9pdmFyX2lkLCBJTlQyRklYKGluZGV4KSk7CiAgIHJldHVybiBkYXRhOwogfQogCitWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkX2J5dGUoVkFMVUUgc2VsZikgeworICBWQUxVRSBpbmRleF92YWx1ZSA9IHJiX2l2YXJfZ2V0KHNlbGYsIGluZGV4X2l2YXJfaWQpOworICBpbnQgaW5kZXggPSBGSVgySU5UKGluZGV4X3ZhbHVlKTsKKworICBWQUxVRSBidWYgPSBHRVRfQlVGKHNlbGYpOworICBpZiAoaW5kZXggPj0gUlNUUklOR19MRU4oYnVmKSkgeworICAgIHJiX3JhaXNlKHJiX2VFT0ZFcnJvciwgIk5vdCBlbm91Z2ggYnl0ZXMgcmVtYWluIGluIG1lbW9yeSBidWZmZXIiKTsKKyAgfQorICBjaGFyIGJ5dGUgPSBSU1RSSU5HX1BUUihidWYpW2luZGV4KytdOworCisgIGlmIChpbmRleCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFKSB7CisgICAgcmJfaXZhcl9zZXQoc2VsZiwgYnVmX2l2YXJfaWQsIHJiX2Z1bmNhbGwoYnVmLCBzbGljZV9tZXRob2RfaWQsIDIsIElOVDJGSVgoaW5kZXgpLCBJTlQyRklYKFJTVFJJTkdfTEVOKGJ1ZikgLSAxKSkpOworICAgIGluZGV4ID0gMDsKKyAgfQorICByYl9pdmFyX3NldChzZWxmLCBpbmRleF9pdmFyX2lkLCBJTlQyRklYKGluZGV4KSk7CisKKyAgaW50IHJlc3VsdCA9IChpbnQpIGJ5dGU7CisgIHJldHVybiBJTlQyRklYKHJlc3VsdCk7Cit9CisKK1ZBTFVFIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfaW50b19idWZmZXIoVkFMVUUgc2VsZiwgVkFMVUUgYnVmZmVyX3ZhbHVlLCBWQUxVRSBzaXplX3ZhbHVlKSB7CisgIGludCBpID0gMDsKKyAgaW50IHNpemUgPSBGSVgySU5UKHNpemVfdmFsdWUpOworICBpbnQgaW5kZXg7CisgIFZBTFVFIGJ1ZiA9IEdFVF9CVUYoc2VsZik7CisKKyAgaW5kZXggPSBGSVgySU5UKHJiX2l2YXJfZ2V0KHNlbGYsIGluZGV4X2l2YXJfaWQpKTsKKyAgd2hpbGUgKGkgPCBzaXplKSB7CisgICAgaWYgKGluZGV4ID49IFJTVFJJTkdfTEVOKGJ1ZikpIHsKKyAgICAgIHJiX3JhaXNlKHJiX2VFT0ZFcnJvciwgIk5vdCBlbm91Z2ggYnl0ZXMgcmVtYWluIGluIG1lbW9yeSBidWZmZXIiKTsKKyAgICB9CisgICAgY2hhciBieXRlID0gUlNUUklOR19QVFIoYnVmKVtpbmRleCsrXTsKKworICAgIGlmIChpID49IFJTVFJJTkdfTEVOKGJ1ZmZlcl92YWx1ZSkpIHsKKyAgICAgIHJiX3JhaXNlKHJiX2VJbmRleEVycm9yLCAiaW5kZXggJWQgb3V0IG9mIHN0cmluZyIsIGkpOworICAgIH0KKyAgICAoKGNoYXIqKVJTVFJJTkdfUFRSKGJ1ZmZlcl92YWx1ZSkpW2ldID0gYnl0ZTsKKyAgICBpKys7CisgIH0KKworICBpZiAoaW5kZXggPj0gR0FSQkFHRV9CVUZGRVJfU0laRSkgeworICAgIHJiX2l2YXJfc2V0KHNlbGYsIGJ1Zl9pdmFyX2lkLCByYl9mdW5jYWxsKGJ1Ziwgc2xpY2VfbWV0aG9kX2lkLCAyLCBJTlQyRklYKGluZGV4KSwgSU5UMkZJWChSU1RSSU5HX0xFTihidWYpIC0gMSkpKTsKKyAgICBpbmRleCA9IDA7CisgIH0KKyAgcmJfaXZhcl9zZXQoc2VsZiwgaW5kZXhfaXZhcl9pZCwgSU5UMkZJWChpbmRleCkpOworCisgIHJldHVybiBJTlQyRklYKGkpOworfQorCiB2b2lkIEluaXRfbWVtb3J5X2J1ZmZlcigpIHsKICAgVkFMVUUgdGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3MgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJNZW1vcnlCdWZmZXJUcmFuc3BvcnQiKSk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3MsICJ3cml0ZSIsIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlLCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzcywgInJlYWQiLCByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkLCAxKTsKKyAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbGFzcywgInJlYWRfYnl0ZSIsIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfYnl0ZSwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3MsICJyZWFkX2ludG9fYnVmZmVyIiwgcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9pbnRvX2J1ZmZlciwgMik7CiAgIAogICBidWZfaXZhcl9pZCA9IHJiX2ludGVybigiQGJ1ZiIpOwogICBpbmRleF9pdmFyX2lkID0gcmJfaW50ZXJuKCJAaW5kZXgiKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvcHJvdG9jb2wuYyBiL2xpYi9yYi9leHQvcHJvdG9jb2wuYwppbmRleCBjMTg3NjU0Li5lNjlkZTI5IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L3Byb3RvY29sLmMKKysrIGIvbGliL3JiL2V4dC9wcm90b2NvbC5jCkBAIC0xLDE4NSArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8cnVieS5oPgotI2luY2x1ZGUgPHByb3RvY29sLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPGNvbnN0YW50cy5oPgotI2luY2x1ZGUgPHN0cnVjdC5oPgotCi1zdGF0aWMgVkFMVUUgc2tpcChWQUxVRSBzZWxmLCBpbnQgdHR5cGUpIHsKLSAgaWYgKHR0eXBlID09IFRUWVBFX1NUT1ApIHsKLSAgICByZXR1cm4gUW5pbDsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9CT09MKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2Jvb2xfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9CWVRFKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2J5dGVfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JMTYpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfaTE2X21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfSTMyKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2kzMl9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0k2NCkgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9pNjRfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9ET1VCTEUpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfZG91YmxlX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSSU5HKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX3N0cmluZ19tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX1NUUlVDVCkgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9zdHJ1Y3RfYmVnaW5fbWV0aG9kX2lkLCAwKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgVkFMVUUgZmllbGRfaGVhZGVyID0gcmJfZnVuY2FsbChzZWxmLCByZWFkX2ZpZWxkX2JlZ2luX21ldGhvZF9pZCwgMCk7Ci0gICAgICBpZiAoTklMX1AoZmllbGRfaGVhZGVyKSB8fCBGSVgySU5UKHJiX2FyeV9lbnRyeShmaWVsZF9oZWFkZXIsIDEpKSA9PSBUVFlQRV9TVE9QICkgewotICAgICAgICBicmVhazsKLSAgICAgIH0gCi0gICAgICBza2lwKHNlbGYsIEZJWDJJTlQocmJfYXJ5X2VudHJ5KGZpZWxkX2hlYWRlciwgMSkpKTsKLSAgICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9maWVsZF9lbmRfbWV0aG9kX2lkLCAwKTsKLSAgICB9Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX3N0cnVjdF9lbmRfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9NQVApIHsKLSAgICBpbnQgaTsKLSAgICBWQUxVRSBtYXBfaGVhZGVyID0gcmJfZnVuY2FsbChzZWxmLCByZWFkX21hcF9iZWdpbl9tZXRob2RfaWQsIDApOwotICAgIGludCBrdHlwZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KG1hcF9oZWFkZXIsIDApKTsKLSAgICBpbnQgdnR5cGUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShtYXBfaGVhZGVyLCAxKSk7Ci0gICAgaW50IHNpemUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShtYXBfaGVhZGVyLCAyKSk7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgc2tpcChzZWxmLCBrdHlwZSk7Ci0gICAgICBza2lwKHNlbGYsIHZ0eXBlKTsKLSAgICB9Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX21hcF9lbmRfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9MSVNUIHx8IHR0eXBlID09IFRUWVBFX1NFVCkgewotICAgIGludCBpOwotICAgIFZBTFVFIGNvbGxlY3Rpb25faGVhZGVyID0gcmJfZnVuY2FsbChzZWxmLCB0dHlwZSA9PSBUVFlQRV9MSVNUID8gcmVhZF9saXN0X2JlZ2luX21ldGhvZF9pZCA6IHJlYWRfc2V0X2JlZ2luX21ldGhvZF9pZCwgMCk7Ci0gICAgaW50IGV0eXBlID0gRklYMklOVChyYl9hcnlfZW50cnkoY29sbGVjdGlvbl9oZWFkZXIsIDApKTsKLSAgICBpbnQgc2l6ZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KGNvbGxlY3Rpb25faGVhZGVyLCAxKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgc2tpcChzZWxmLCBldHlwZSk7Ci0gICAgfQotICAgIHJiX2Z1bmNhbGwoc2VsZiwgdHR5cGUgPT0gVFRZUEVfTElTVCA/IHJlYWRfbGlzdF9lbmRfbWV0aG9kX2lkIDogcmVhZF9zZXRfZW5kX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmJfcmFpc2UocmJfZU5vdEltcEVycm9yLCAiZG9uJ3Qga25vdyBob3cgdG8gc2tpcCB0eXBlICVkIiwgdHR5cGUpOwotICB9Ci0KLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF9wcm90b2NvbF9uYXRpdmVfcW1hcmsoVkFMVUUgc2VsZikgewotICByZXR1cm4gUWZhbHNlOwotfQotCi1WQUxVRSByYl90aHJpZnRfcHJvdG9jb2xfc2tpcChWQUxVRSBwcm90b2NvbCwgVkFMVUUgdHR5cGUpIHsKLSAgcmV0dXJuIHNraXAocHJvdG9jb2wsIEZJWDJJTlQodHR5cGUpKTsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX21lc3NhZ2VfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9zdHJ1Y3RfYmVnaW4oVkFMVUUgc2VsZiwgVkFMVUUgbmFtZSkgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX2ZpZWxkX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfbWFwX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfbGlzdF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX3NldF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3JlYWRfbWVzc2FnZV9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfYmVnaW4oVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfZmllbGRfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfbWFwX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aGlmdF9yZWFkX2xpc3RfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfc2V0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi12b2lkIEluaXRfcHJvdG9jb2woKSB7Ci0gIFZBTFVFIGNfcHJvdG9jb2wgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJCYXNlUHJvdG9jb2wiKSk7Ci0gIAotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJza2lwIiwgcmJfdGhyaWZ0X3Byb3RvY29sX3NraXAsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9tZXNzYWdlX2VuZCIsIHJiX3RocmlmdF93cml0ZV9tZXNzYWdlX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF93cml0ZV9zdHJ1Y3RfYmVnaW4sIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9zdHJ1Y3RfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9maWVsZF9lbmQiLCByYl90aHJpZnRfd3JpdGVfZmllbGRfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfbWFwX2VuZCIsIHJiX3RocmlmdF93cml0ZV9tYXBfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfbGlzdF9lbmQiLCByYl90aHJpZnRfd3JpdGVfbGlzdF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9zZXRfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX3NldF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX21lc3NhZ2VfZW5kIiwgcmJfdGhyaWZ0X3JlYWRfbWVzc2FnZV9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX3N0cnVjdF9iZWdpbiIsIHJiX3RoaWZ0X3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9zdHJ1Y3RfZW5kIiwgcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9maWVsZF9lbmQiLCByYl90aGlmdF9yZWFkX2ZpZWxkX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfbWFwX2VuZCIsIHJiX3RoaWZ0X3JlYWRfbWFwX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfbGlzdF9lbmQiLCByYl90aGlmdF9yZWFkX2xpc3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9zZXRfZW5kIiwgcmJfdGhpZnRfcmVhZF9zZXRfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAibmF0aXZlPyIsIHJiX3RocmlmdF9wcm90b2NvbF9uYXRpdmVfcW1hcmssIDApOwotICAKLSAgLy8gbmF0aXZlX3Byb3RvX21ldGhvZF90YWJsZSAqbnBtdDsKLSAgLy8gbnBtdCA9IEFMTE9DKG5hdGl2ZV9wcm90b19tZXRob2RfdGFibGUpOwotICAvLyBucG10LT53cml0ZV9tZXNzYWdlX2VuZCA9IHJiX3RocmlmdF93cml0ZV9tZXNzYWdlX2VuZDsKLSAgLy8gbnBtdC0+d3JpdGVfc3RydWN0X2JlZ2luID0gcmJfdGhyaWZ0X3dyaXRlX3N0cnVjdF9iZWdpbjsKLSAgLy8gbnBtdC0+d3JpdGVfc3RydWN0X2VuZCA9IHJiX3RocmlmdF93cml0ZV9zdHJ1Y3RfZW5kOwotICAvLyBucG10LT53cml0ZV9maWVsZF9lbmQgPSByYl90aHJpZnRfd3JpdGVfZmllbGRfZW5kOwotICAvLyBucG10LT53cml0ZV9tYXBfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX21hcF9lbmQ7Ci0gIC8vIG5wbXQtPndyaXRlX2xpc3RfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX2xpc3RfZW5kOwotICAvLyBucG10LT53cml0ZV9zZXRfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX3NldF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfbWVzc2FnZV9lbmQgPSByYl90aHJpZnRfcmVhZF9tZXNzYWdlX2VuZDsKLSAgLy8gbnBtdC0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSByYl90aGlmdF9yZWFkX3N0cnVjdF9iZWdpbjsKLSAgLy8gbnBtdC0+cmVhZF9zdHJ1Y3RfZW5kID0gcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfZW5kOwotICAvLyBucG10LT5yZWFkX2ZpZWxkX2VuZCA9IHJiX3RoaWZ0X3JlYWRfZmllbGRfZW5kOwotICAvLyBucG10LT5yZWFkX21hcF9lbmQgPSByYl90aGlmdF9yZWFkX21hcF9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfbGlzdF9lbmQgPSByYl90aGlmdF9yZWFkX2xpc3RfZW5kOwotICAvLyBucG10LT5yZWFkX3NldF9lbmQgPSByYl90aGlmdF9yZWFkX3NldF9lbmQ7Ci0gIC8vIAotICAvLyBWQUxVRSBtZXRob2RfdGFibGVfb2JqZWN0ID0gRGF0YV9XcmFwX1N0cnVjdChyYl9jT2JqZWN0LCAwLCBmcmVlLCBucG10KTsKLSAgLy8gcmJfY29uc3Rfc2V0KGNfcHJvdG9jb2wsIHJiX2ludGVybigiQG5hdGl2ZV9tZXRob2RfdGFibGUiKSwgbWV0aG9kX3RhYmxlX29iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3Byb3RvY29sLmggYi9saWIvcmIvZXh0L3Byb3RvY29sLmgKaW5kZXggNTM2OTUzMC4uZTY5ZGUyOSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9wcm90b2NvbC5oCisrKyBiL2xpYi9yYi9leHQvcHJvdG9jb2wuaApAQCAtMSwyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXZvaWQgSW5pdF9wcm90b2NvbCgpOwpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9zdHJsY3B5LmMgYi9saWIvcmIvZXh0L3N0cmxjcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzAwZmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2V4dC9zdHJsY3B5LmMKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInN0cmxjcHkuaCIKKworI2lmbmRlZiBIQVZFX1NUUkxDUFkKKyNkZWZpbmUgSEFWRV9TVFJMQ1BZCitzaXplX3QKK3N0cmxjcHkgKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgZHN0X3N6KQoreworICAgIHNpemVfdCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IGRzdF9zejsgbisrKSB7CisgICAgICBpZiAoKCpkc3QrKyA9ICpzcmMrKykgPT0gJ1wwJykKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG4gPCBkc3Rfc3opCisgICAgICByZXR1cm4gbjsKKyAgICBpZiAobiA+IDApCisgICAgICAqKGRzdCAtIDEpID0gJ1wwJzsKKyAgICByZXR1cm4gbiArIHN0cmxlbiAoc3JjKTsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3N0cmxjcHkuaCBiL2xpYi9yYi9leHQvc3RybGNweS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmUwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvZXh0L3N0cmxjcHkuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBfX2hhc19idWlsdGluCisjZGVmaW5lIF9faGFzX2J1aWx0aW4oeCkgMAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJMQ1BZCitzaXplX3Qgc3RybGNweSAoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc3Rfc3opOworI2Vsc2UKKyNpZiAhX19oYXNfYnVpbHRpbihzdHJsY3B5KQorZXh0ZXJuIHNpemVfdCBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9zdHJ1Y3QuYyBiL2xpYi9yYi9leHQvc3RydWN0LmMKaW5kZXggNzliMWUwMS4uZTNhYTg1NSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9zdHJ1Y3QuYworKysgYi9saWIvcmIvZXh0L3N0cnVjdC5jCkBAIC0xNywzNCArMTcsMTAgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdHJ1Y3QuaD4KLSNpbmNsdWRlIDxjb25zdGFudHMuaD4KKyNpbmNsdWRlICJzdHJ1Y3QuaCIKKyNpbmNsdWRlICJjb25zdGFudHMuaCIKICNpbmNsdWRlICJtYWNyb3MuaCIKLQotI2lmbmRlZiBIQVZFX1NUUkxDUFkKLQotc3RhdGljCi1zaXplX3QKLXN0cmxjcHkgKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgZHN0X3N6KQotewotICAgIHNpemVfdCBuOwotCi0gICAgZm9yIChuID0gMDsgbiA8IGRzdF9zejsgbisrKSB7Ci0gICAgICBpZiAoKCpkc3QrKyA9ICpzcmMrKykgPT0gJ1wwJykKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG4gPCBkc3Rfc3opCi0gICAgICByZXR1cm4gbjsKLSAgICBpZiAobiA+IDApCi0gICAgICAqKGRzdCAtIDEpID0gJ1wwJzsKLSAgICByZXR1cm4gbiArIHN0cmxlbiAoc3JjKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBuYXRpdmVfcHJvdG9fbWV0aG9kX3RhYmxlICptdDsKLXN0YXRpYyBuYXRpdmVfcHJvdG9fbWV0aG9kX3RhYmxlICpkZWZhdWx0X210OworI2luY2x1ZGUgInN0cmxjcHkuaCIKIAogVkFMVUUgdGhyaWZ0X3VuaW9uX2NsYXNzOwogCkBAIC01Myw2ICsyOSw3IEBACiAKIElEIHRvX3NfbWV0aG9kX2lkOwogSUQgbmFtZV90b19pZF9tZXRob2RfaWQ7CitzdGF0aWMgSUQgc29ydGVkX2ZpZWxkX2lkc19tZXRob2RfaWQ7CiAKICNkZWZpbmUgSVNfQ09OVEFJTkVSKHR0eXBlKSAoKHR0eXBlKSA9PSBUVFlQRV9NQVAgfHwgKHR0eXBlKSA9PSBUVFlQRV9MSVNUIHx8ICh0dHlwZSkgPT0gVFRZUEVfU0VUKQogI2RlZmluZSBTVFJVQ1RfRklFTERTKG9iaikgcmJfY29uc3RfZ2V0KENMQVNTX09GKG9iaiksIGZpZWxkc19jb25zdF9pZCkKQEAgLTk4LDYgKzc1LDExIEBACiAgIHJldHVybiBRbmlsOwogfQogCitWQUxVRSBkZWZhdWx0X3dyaXRlX2JpbmFyeShWQUxVRSBwcm90b2NvbCwgVkFMVUUgdmFsdWUpIHsKKyAgcmJfZnVuY2FsbChwcm90b2NvbCwgd3JpdGVfYmluYXJ5X21ldGhvZF9pZCwgMSwgdmFsdWUpOworICByZXR1cm4gUW5pbDsKK30KKwogVkFMVUUgZGVmYXVsdF93cml0ZV9saXN0X2JlZ2luKFZBTFVFIHByb3RvY29sLCBWQUxVRSBldHlwZSwgVkFMVUUgbGVuZ3RoKSB7CiAgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHdyaXRlX2xpc3RfYmVnaW5fbWV0aG9kX2lkLCAyLCBldHlwZSwgbGVuZ3RoKTsKICAgcmV0dXJuIFFuaWw7CkBAIC0yMTMsNiArMTk1LDEwIEBACiAgIHJldHVybiByYl9mdW5jYWxsKHByb3RvY29sLCByZWFkX3N0cmluZ19tZXRob2RfaWQsIDApOwogfQogCitWQUxVRSBkZWZhdWx0X3JlYWRfYmluYXJ5KFZBTFVFIHByb3RvY29sKSB7CisgIHJldHVybiByYl9mdW5jYWxsKHByb3RvY29sLCByZWFkX2JpbmFyeV9tZXRob2RfaWQsIDApOworfQorCiBWQUxVRSBkZWZhdWx0X3JlYWRfc3RydWN0X2JlZ2luKFZBTFVFIHByb3RvY29sKSB7CiAgIHJldHVybiByYl9mdW5jYWxsKHByb3RvY29sLCByZWFkX3N0cnVjdF9iZWdpbl9tZXRob2RfaWQsIDApOwogfQpAQCAtMjIxLDQ3ICsyMDcsNiBAQAogICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9zdHJ1Y3RfZW5kX21ldGhvZF9pZCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9kZWZhdWx0X3Byb3RvX2Z1bmN0aW9uX3BvaW50ZXJzKCkgewotICBkZWZhdWx0X210ID0gQUxMT0MobmF0aXZlX3Byb3RvX21ldGhvZF90YWJsZSk7Ci0KLSAgZGVmYXVsdF9tdC0+d3JpdGVfZmllbGRfYmVnaW4gPSBkZWZhdWx0X3dyaXRlX2ZpZWxkX2JlZ2luOwotICBkZWZhdWx0X210LT53cml0ZV9maWVsZF9zdG9wID0gZGVmYXVsdF93cml0ZV9maWVsZF9zdG9wOwotICBkZWZhdWx0X210LT53cml0ZV9tYXBfYmVnaW4gPSBkZWZhdWx0X3dyaXRlX21hcF9iZWdpbjsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfbWFwX2VuZCA9IGRlZmF1bHRfd3JpdGVfbWFwX2VuZDsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfbGlzdF9iZWdpbiA9IGRlZmF1bHRfd3JpdGVfbGlzdF9iZWdpbjsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfbGlzdF9lbmQgPSBkZWZhdWx0X3dyaXRlX2xpc3RfZW5kOwotICBkZWZhdWx0X210LT53cml0ZV9zZXRfYmVnaW4gPSBkZWZhdWx0X3dyaXRlX3NldF9iZWdpbjsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfc2V0X2VuZCA9IGRlZmF1bHRfd3JpdGVfc2V0X2VuZDsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfYnl0ZSA9IGRlZmF1bHRfd3JpdGVfYnl0ZTsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfYm9vbCA9IGRlZmF1bHRfd3JpdGVfYm9vbDsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfaTE2ID0gZGVmYXVsdF93cml0ZV9pMTY7Ci0gIGRlZmF1bHRfbXQtPndyaXRlX2kzMiA9IGRlZmF1bHRfd3JpdGVfaTMyOwotICBkZWZhdWx0X210LT53cml0ZV9pNjQgPSBkZWZhdWx0X3dyaXRlX2k2NDsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfZG91YmxlID0gZGVmYXVsdF93cml0ZV9kb3VibGU7Ci0gIGRlZmF1bHRfbXQtPndyaXRlX3N0cmluZyA9IGRlZmF1bHRfd3JpdGVfc3RyaW5nOwotICBkZWZhdWx0X210LT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSBkZWZhdWx0X3dyaXRlX3N0cnVjdF9iZWdpbjsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfc3RydWN0X2VuZCA9IGRlZmF1bHRfd3JpdGVfc3RydWN0X2VuZDsKLSAgZGVmYXVsdF9tdC0+d3JpdGVfZmllbGRfZW5kID0gZGVmYXVsdF93cml0ZV9maWVsZF9lbmQ7Ci0KLSAgZGVmYXVsdF9tdC0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSBkZWZhdWx0X3JlYWRfc3RydWN0X2JlZ2luOwotICBkZWZhdWx0X210LT5yZWFkX3N0cnVjdF9lbmQgPSBkZWZhdWx0X3JlYWRfc3RydWN0X2VuZDsKLSAgZGVmYXVsdF9tdC0+cmVhZF9maWVsZF9iZWdpbiA9IGRlZmF1bHRfcmVhZF9maWVsZF9iZWdpbjsKLSAgZGVmYXVsdF9tdC0+cmVhZF9maWVsZF9lbmQgPSBkZWZhdWx0X3JlYWRfZmllbGRfZW5kOwotICBkZWZhdWx0X210LT5yZWFkX21hcF9iZWdpbiA9IGRlZmF1bHRfcmVhZF9tYXBfYmVnaW47Ci0gIGRlZmF1bHRfbXQtPnJlYWRfbWFwX2VuZCA9IGRlZmF1bHRfcmVhZF9tYXBfZW5kOwotICBkZWZhdWx0X210LT5yZWFkX2xpc3RfYmVnaW4gPSBkZWZhdWx0X3JlYWRfbGlzdF9iZWdpbjsKLSAgZGVmYXVsdF9tdC0+cmVhZF9saXN0X2VuZCA9IGRlZmF1bHRfcmVhZF9saXN0X2VuZDsKLSAgZGVmYXVsdF9tdC0+cmVhZF9zZXRfYmVnaW4gPSBkZWZhdWx0X3JlYWRfc2V0X2JlZ2luOwotICBkZWZhdWx0X210LT5yZWFkX3NldF9lbmQgPSBkZWZhdWx0X3JlYWRfc2V0X2VuZDsKLSAgZGVmYXVsdF9tdC0+cmVhZF9ieXRlID0gZGVmYXVsdF9yZWFkX2J5dGU7Ci0gIGRlZmF1bHRfbXQtPnJlYWRfYm9vbCA9IGRlZmF1bHRfcmVhZF9ib29sOwotICBkZWZhdWx0X210LT5yZWFkX2kxNiA9IGRlZmF1bHRfcmVhZF9pMTY7Ci0gIGRlZmF1bHRfbXQtPnJlYWRfaTMyID0gZGVmYXVsdF9yZWFkX2kzMjsKLSAgZGVmYXVsdF9tdC0+cmVhZF9pNjQgPSBkZWZhdWx0X3JlYWRfaTY0OwotICBkZWZhdWx0X210LT5yZWFkX2RvdWJsZSA9IGRlZmF1bHRfcmVhZF9kb3VibGU7Ci0gIGRlZmF1bHRfbXQtPnJlYWRfc3RyaW5nID0gZGVmYXVsdF9yZWFkX3N0cmluZzsKLX0KLQogLy8gZW5kIGRlZmF1bHQgcHJvdG9jb2wgbWV0aG9kcwogCiBzdGF0aWMgVkFMVUUgcmJfdGhyaWZ0X3VuaW9uX3dyaXRlIChWQUxVRSBzZWxmLCBWQUxVRSBwcm90b2NvbCk7CkBAIC0yNjksMTAgKzIxNCwxMCBAQAogc3RhdGljIHZvaWQgd3JpdGVfYW55dGhpbmcoaW50IHR0eXBlLCBWQUxVRSB2YWx1ZSwgVkFMVUUgcHJvdG9jb2wsIFZBTFVFIGZpZWxkX2luZm8pOwogCiBWQUxVRSBnZXRfZmllbGRfdmFsdWUoVkFMVUUgb2JqLCBWQUxVRSBmaWVsZF9uYW1lKSB7Ci0gIGNoYXIgbmFtZV9idWZbUlNUUklOR19MRU4oZmllbGRfbmFtZSkgKyAxXTsKKyAgY2hhciBuYW1lX2J1ZltSU1RSSU5HX0xFTihmaWVsZF9uYW1lKSArIDJdOwogCiAgIG5hbWVfYnVmWzBdID0gJ0AnOwotICBzdHJsY3B5KCZuYW1lX2J1ZlsxXSwgUlNUUklOR19QVFIoZmllbGRfbmFtZSksIHNpemVvZihuYW1lX2J1ZikpOworICBzdHJsY3B5KCZuYW1lX2J1ZlsxXSwgUlNUUklOR19QVFIoZmllbGRfbmFtZSksIFJTVFJJTkdfTEVOKGZpZWxkX25hbWUpICsgMSk7CiAKICAgVkFMVUUgdmFsdWUgPSByYl9pdmFyX2dldChvYmosIHJiX2ludGVybihuYW1lX2J1ZikpOwogCkBAIC0zMDEsNyArMjQ2LDcgQEAKIAogICAgIHN6ID0gUkFSUkFZX0xFTihrZXlzKTsKIAotICAgIG10LT53cml0ZV9tYXBfYmVnaW4ocHJvdG9jb2wsIGtleXR5cGVfdmFsdWUsIHZhbHVldHlwZV92YWx1ZSwgSU5UMkZJWChzeikpOworICAgIGRlZmF1bHRfd3JpdGVfbWFwX2JlZ2luKHByb3RvY29sLCBrZXl0eXBlX3ZhbHVlLCB2YWx1ZXR5cGVfdmFsdWUsIElOVDJGSVgoc3opKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzejsgaSsrKSB7CiAgICAgICBrZXkgPSByYl9hcnlfZW50cnkoa2V5cywgaSk7CkBAIC0zMjAsNyArMjY1LDcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBtdC0+d3JpdGVfbWFwX2VuZChwcm90b2NvbCk7CisgICAgZGVmYXVsdF93cml0ZV9tYXBfZW5kKHByb3RvY29sKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9MSVNUKSB7CiAgICAgQ2hlY2tfVHlwZSh2YWx1ZSwgVF9BUlJBWSk7CiAKQEAgLTMzMCw3ICsyNzUsNyBAQAogICAgIFZBTFVFIGVsZW1lbnRfdHlwZV92YWx1ZSA9IHJiX2hhc2hfYXJlZihlbGVtZW50X3R5cGVfaW5mbywgdHlwZV9zeW0pOwogICAgIGludCBlbGVtZW50X3R5cGUgPSBGSVgySU5UKGVsZW1lbnRfdHlwZV92YWx1ZSk7CiAKLSAgICBtdC0+d3JpdGVfbGlzdF9iZWdpbihwcm90b2NvbCwgZWxlbWVudF90eXBlX3ZhbHVlLCBJTlQyRklYKHN6KSk7CisgICAgZGVmYXVsdF93cml0ZV9saXN0X2JlZ2luKHByb3RvY29sLCBlbGVtZW50X3R5cGVfdmFsdWUsIElOVDJGSVgoc3opKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgc3o7ICsraSkgewogICAgICAgVkFMVUUgdmFsID0gcmJfYXJ5X2VudHJ5KHZhbHVlLCBpKTsKICAgICAgIGlmIChJU19DT05UQUlORVIoZWxlbWVudF90eXBlKSkgewpAQCAtMzM5LDEzICsyODQsMTMgQEAKICAgICAgICAgd3JpdGVfYW55dGhpbmcoZWxlbWVudF90eXBlLCB2YWwsIHByb3RvY29sLCBlbGVtZW50X3R5cGVfaW5mbyk7CiAgICAgICB9CiAgICAgfQotICAgIG10LT53cml0ZV9saXN0X2VuZChwcm90b2NvbCk7CisgICAgZGVmYXVsdF93cml0ZV9saXN0X2VuZChwcm90b2NvbCk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU0VUKSB7CiAgICAgVkFMVUUgaXRlbXM7CiAKICAgICBpZiAoVFlQRSh2YWx1ZSkgPT0gVF9BUlJBWSkgewogICAgICAgaXRlbXMgPSB2YWx1ZTsKLSAgICB9IGVsc2UgeyAgICAgICAgCisgICAgfSBlbHNlIHsKICAgICAgIGlmIChyYl9jU2V0ID09IENMQVNTX09GKHZhbHVlKSkgewogICAgICAgICBpdGVtcyA9IHJiX2Z1bmNhbGwodmFsdWUsIGVudHJpZXNfbWV0aG9kX2lkLCAwKTsKICAgICAgIH0gZWxzZSB7CkBAIC0zNjAsNyArMzA1LDcgQEAKICAgICBWQUxVRSBlbGVtZW50X3R5cGVfdmFsdWUgPSByYl9oYXNoX2FyZWYoZWxlbWVudF90eXBlX2luZm8sIHR5cGVfc3ltKTsKICAgICBpbnQgZWxlbWVudF90eXBlID0gRklYMklOVChlbGVtZW50X3R5cGVfdmFsdWUpOwogCi0gICAgbXQtPndyaXRlX3NldF9iZWdpbihwcm90b2NvbCwgZWxlbWVudF90eXBlX3ZhbHVlLCBJTlQyRklYKHN6KSk7CisgICAgZGVmYXVsdF93cml0ZV9zZXRfYmVnaW4ocHJvdG9jb2wsIGVsZW1lbnRfdHlwZV92YWx1ZSwgSU5UMkZJWChzeikpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHN6OyBpKyspIHsKICAgICAgIFZBTFVFIHZhbCA9IHJiX2FyeV9lbnRyeShpdGVtcywgaSk7CkBAIC0zNzEsNyArMzE2LDcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBtdC0+d3JpdGVfc2V0X2VuZChwcm90b2NvbCk7CisgICAgZGVmYXVsdF93cml0ZV9zZXRfZW5kKHByb3RvY29sKTsKICAgfSBlbHNlIHsKICAgICByYl9yYWlzZShyYl9lTm90SW1wRXJyb3IsICJjYW4ndCB3cml0ZSBjb250YWluZXIgb2YgdHlwZTogJWQiLCB0dHlwZSk7CiAgIH0KQEAgLTM3OSwxOSArMzI0LDI0IEBACiAKIHN0YXRpYyB2b2lkIHdyaXRlX2FueXRoaW5nKGludCB0dHlwZSwgVkFMVUUgdmFsdWUsIFZBTFVFIHByb3RvY29sLCBWQUxVRSBmaWVsZF9pbmZvKSB7CiAgIGlmICh0dHlwZSA9PSBUVFlQRV9CT09MKSB7Ci0gICAgbXQtPndyaXRlX2Jvb2wocHJvdG9jb2wsIHZhbHVlKTsKKyAgICBkZWZhdWx0X3dyaXRlX2Jvb2wocHJvdG9jb2wsIHZhbHVlKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9CWVRFKSB7Ci0gICAgbXQtPndyaXRlX2J5dGUocHJvdG9jb2wsIHZhbHVlKTsKKyAgICBkZWZhdWx0X3dyaXRlX2J5dGUocHJvdG9jb2wsIHZhbHVlKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JMTYpIHsKLSAgICBtdC0+d3JpdGVfaTE2KHByb3RvY29sLCB2YWx1ZSk7CisgICAgZGVmYXVsdF93cml0ZV9pMTYocHJvdG9jb2wsIHZhbHVlKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JMzIpIHsKLSAgICBtdC0+d3JpdGVfaTMyKHByb3RvY29sLCB2YWx1ZSk7CisgICAgZGVmYXVsdF93cml0ZV9pMzIocHJvdG9jb2wsIHZhbHVlKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JNjQpIHsKLSAgICBtdC0+d3JpdGVfaTY0KHByb3RvY29sLCB2YWx1ZSk7CisgICAgZGVmYXVsdF93cml0ZV9pNjQocHJvdG9jb2wsIHZhbHVlKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9ET1VCTEUpIHsKLSAgICBtdC0+d3JpdGVfZG91YmxlKHByb3RvY29sLCB2YWx1ZSk7CisgICAgZGVmYXVsdF93cml0ZV9kb3VibGUocHJvdG9jb2wsIHZhbHVlKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJJTkcpIHsKLSAgICBtdC0+d3JpdGVfc3RyaW5nKHByb3RvY29sLCB2YWx1ZSk7CisgICAgVkFMVUUgaXNfYmluYXJ5ID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGJpbmFyeV9zeW0pOworICAgIGlmIChpc19iaW5hcnkgIT0gUXRydWUpIHsKKyAgICAgIGRlZmF1bHRfd3JpdGVfc3RyaW5nKHByb3RvY29sLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlZmF1bHRfd3JpdGVfYmluYXJ5KHByb3RvY29sLCB2YWx1ZSk7CisgICAgfQogICB9IGVsc2UgaWYgKElTX0NPTlRBSU5FUih0dHlwZSkpIHsKICAgICB3cml0ZV9jb250YWluZXIodHR5cGUsIGZpZWxkX2luZm8sIHZhbHVlLCBwcm90b2NvbCk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSVUNUKSB7CkBAIC00MDksMjAgKzM1OSwxNiBAQAogICAvLyBjYWxsIHZhbGlkYXRlCiAgIHJiX2Z1bmNhbGwoc2VsZiwgdmFsaWRhdGVfbWV0aG9kX2lkLCAwKTsKIAotICAvLyBjaGVja19uYXRpdmVfcHJvdG9fbWV0aG9kX3RhYmxlKHByb3RvY29sKTsKLQogICAvLyB3cml0ZSBzdHJ1Y3QgYmVnaW4KLSAgbXQtPndyaXRlX3N0cnVjdF9iZWdpbihwcm90b2NvbCwgcmJfY2xhc3NfbmFtZShDTEFTU19PRihzZWxmKSkpOworICBkZWZhdWx0X3dyaXRlX3N0cnVjdF9iZWdpbihwcm90b2NvbCwgcmJfY2xhc3NfbmFtZShDTEFTU19PRihzZWxmKSkpOwogCiAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGZpZWxkcyBoZXJlCiAgIFZBTFVFIHN0cnVjdF9maWVsZHMgPSBTVFJVQ1RfRklFTERTKHNlbGYpOwotCi0gIFZBTFVFIHN0cnVjdF9maWVsZF9pZHNfdW5vcmRlcmVkID0gcmJfZnVuY2FsbChzdHJ1Y3RfZmllbGRzLCBrZXlzX21ldGhvZF9pZCwgMCk7Ci0gIFZBTFVFIHN0cnVjdF9maWVsZF9pZHNfb3JkZXJlZCA9IHJiX2Z1bmNhbGwoc3RydWN0X2ZpZWxkX2lkc191bm9yZGVyZWQsIHNvcnRfbWV0aG9kX2lkLCAwKTsKKyAgVkFMVUUgc29ydGVkX2ZpZWxkX2lkcyA9IHJiX2Z1bmNhbGwoc2VsZiwgc29ydGVkX2ZpZWxkX2lkc19tZXRob2RfaWQsIDApOwogCiAgIGludCBpID0gMDsKLSAgZm9yIChpPTA7IGkgPCBSQVJSQVlfTEVOKHN0cnVjdF9maWVsZF9pZHNfb3JkZXJlZCk7IGkrKykgewotICAgIFZBTFVFIGZpZWxkX2lkID0gcmJfYXJ5X2VudHJ5KHN0cnVjdF9maWVsZF9pZHNfb3JkZXJlZCwgaSk7CisgIGZvciAoaT0wOyBpIDwgUkFSUkFZX0xFTihzb3J0ZWRfZmllbGRfaWRzKTsgaSsrKSB7CisgICAgVkFMVUUgZmllbGRfaWQgPSByYl9hcnlfZW50cnkoc29ydGVkX2ZpZWxkX2lkcywgaSk7CiAKICAgICBWQUxVRSBmaWVsZF9pbmZvID0gcmJfaGFzaF9hcmVmKHN0cnVjdF9maWVsZHMsIGZpZWxkX2lkKTsKIApAQCAtNDMzLDE4ICszNzksMTggQEAKICAgICBWQUxVRSBmaWVsZF92YWx1ZSA9IGdldF9maWVsZF92YWx1ZShzZWxmLCBmaWVsZF9uYW1lKTsKIAogICAgIGlmICghTklMX1AoZmllbGRfdmFsdWUpKSB7Ci0gICAgICBtdC0+d3JpdGVfZmllbGRfYmVnaW4ocHJvdG9jb2wsIGZpZWxkX25hbWUsIHR0eXBlX3ZhbHVlLCBmaWVsZF9pZCk7CisgICAgICBkZWZhdWx0X3dyaXRlX2ZpZWxkX2JlZ2luKHByb3RvY29sLCBmaWVsZF9uYW1lLCB0dHlwZV92YWx1ZSwgZmllbGRfaWQpOwogCiAgICAgICB3cml0ZV9hbnl0aGluZyh0dHlwZSwgZmllbGRfdmFsdWUsIHByb3RvY29sLCBmaWVsZF9pbmZvKTsKIAotICAgICAgbXQtPndyaXRlX2ZpZWxkX2VuZChwcm90b2NvbCk7CisgICAgICBkZWZhdWx0X3dyaXRlX2ZpZWxkX2VuZChwcm90b2NvbCk7CiAgICAgfQogICB9CiAKLSAgbXQtPndyaXRlX2ZpZWxkX3N0b3AocHJvdG9jb2wpOworICBkZWZhdWx0X3dyaXRlX2ZpZWxkX3N0b3AocHJvdG9jb2wpOwogCiAgIC8vIHdyaXRlIHN0cnVjdCBlbmQKLSAgbXQtPndyaXRlX3N0cnVjdF9lbmQocHJvdG9jb2wpOworICBkZWZhdWx0X3dyaXRlX3N0cnVjdF9lbmQocHJvdG9jb2wpOwogCiAgIHJldHVybiBRbmlsOwogfQpAQCAtNDU1LDMzICs0MDEsNTcgQEAKIAogc3RhdGljIFZBTFVFIHJiX3RocmlmdF91bmlvbl9yZWFkKFZBTFVFIHNlbGYsIFZBTFVFIHByb3RvY29sKTsKIHN0YXRpYyBWQUxVRSByYl90aHJpZnRfc3RydWN0X3JlYWQoVkFMVUUgc2VsZiwgVkFMVUUgcHJvdG9jb2wpOworc3RhdGljIHZvaWQgc2tpcF9tYXBfY29udGVudHMoVkFMVUUgcHJvdG9jb2wsIFZBTFVFIGtleV90eXBlX3ZhbHVlLCBWQUxVRSB2YWx1ZV90eXBlX3ZhbHVlLCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBza2lwX2xpc3Rfb3Jfc2V0X2NvbnRlbnRzKFZBTFVFIHByb3RvY29sLCBWQUxVRSBlbGVtZW50X3R5cGVfdmFsdWUsIGludCBzaXplKTsKIAogc3RhdGljIHZvaWQgc2V0X2ZpZWxkX3ZhbHVlKFZBTFVFIG9iaiwgVkFMVUUgZmllbGRfbmFtZSwgVkFMVUUgdmFsdWUpIHsKLSAgY2hhciBuYW1lX2J1ZltSU1RSSU5HX0xFTihmaWVsZF9uYW1lKSArIDFdOworICBjaGFyIG5hbWVfYnVmW1JTVFJJTkdfTEVOKGZpZWxkX25hbWUpICsgMl07CiAKICAgbmFtZV9idWZbMF0gPSAnQCc7Ci0gIHN0cmxjcHkoJm5hbWVfYnVmWzFdLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSwgc2l6ZW9mKG5hbWVfYnVmKSk7CisgIHN0cmxjcHkoJm5hbWVfYnVmWzFdLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSwgUlNUUklOR19MRU4oZmllbGRfbmFtZSkrMSk7CiAKICAgcmJfaXZhcl9zZXQob2JqLCByYl9pbnRlcm4obmFtZV9idWYpLCB2YWx1ZSk7CiB9CiAKKy8vIEhlbHBlciBtZXRob2QgdG8gc2tpcCB0aGUgY29udGVudHMgb2YgYSBtYXAgKGFzc3VtZXMgdGhlIG1hcCBoZWFkZXIgaGFzIGJlZW4gcmVhZCkuCitzdGF0aWMgdm9pZCBza2lwX21hcF9jb250ZW50cyhWQUxVRSBwcm90b2NvbCwgVkFMVUUga2V5X3R5cGVfdmFsdWUsIFZBTFVFIHZhbHVlX3R5cGVfdmFsdWUsIGludCBzaXplKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgcmJfZnVuY2FsbChwcm90b2NvbCwgc2tpcF9tZXRob2RfaWQsIDEsIGtleV90eXBlX3ZhbHVlKTsKKyAgICByYl9mdW5jYWxsKHByb3RvY29sLCBza2lwX21ldGhvZF9pZCwgMSwgdmFsdWVfdHlwZV92YWx1ZSk7CisgIH0KK30KKworLy8gSGVscGVyIG1ldGhvZCB0byBza2lwIHRoZSBjb250ZW50cyBvZiBhIGxpc3Qgb3Igc2V0IChhc3N1bWVzIHRoZSBsaXN0L3NldCBoZWFkZXIgaGFzIGJlZW4gcmVhZCkuCitzdGF0aWMgdm9pZCBza2lwX2xpc3Rfb3Jfc2V0X2NvbnRlbnRzKFZBTFVFIHByb3RvY29sLCBWQUxVRSBlbGVtZW50X3R5cGVfdmFsdWUsIGludCBzaXplKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgcmJfZnVuY2FsbChwcm90b2NvbCwgc2tpcF9tZXRob2RfaWQsIDEsIGVsZW1lbnRfdHlwZV92YWx1ZSk7CisgIH0KK30KKwogc3RhdGljIFZBTFVFIHJlYWRfYW55dGhpbmcoVkFMVUUgcHJvdG9jb2wsIGludCB0dHlwZSwgVkFMVUUgZmllbGRfaW5mbykgewogICBWQUxVRSByZXN1bHQgPSBRbmlsOwogCiAgIGlmICh0dHlwZSA9PSBUVFlQRV9CT09MKSB7Ci0gICAgcmVzdWx0ID0gbXQtPnJlYWRfYm9vbChwcm90b2NvbCk7CisgICAgcmVzdWx0ID0gZGVmYXVsdF9yZWFkX2Jvb2wocHJvdG9jb2wpOwogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0JZVEUpIHsKLSAgICByZXN1bHQgPSBtdC0+cmVhZF9ieXRlKHByb3RvY29sKTsKKyAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfYnl0ZShwcm90b2NvbCk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfSTE2KSB7Ci0gICAgcmVzdWx0ID0gbXQtPnJlYWRfaTE2KHByb3RvY29sKTsKKyAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfaTE2KHByb3RvY29sKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JMzIpIHsKLSAgICByZXN1bHQgPSBtdC0+cmVhZF9pMzIocHJvdG9jb2wpOworICAgIHJlc3VsdCA9IGRlZmF1bHRfcmVhZF9pMzIocHJvdG9jb2wpOwogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0k2NCkgewotICAgIHJlc3VsdCA9IG10LT5yZWFkX2k2NChwcm90b2NvbCk7CisgICAgcmVzdWx0ID0gZGVmYXVsdF9yZWFkX2k2NChwcm90b2NvbCk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSSU5HKSB7Ci0gICAgcmVzdWx0ID0gbXQtPnJlYWRfc3RyaW5nKHByb3RvY29sKTsKKyAgICBWQUxVRSBpc19iaW5hcnkgPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgYmluYXJ5X3N5bSk7CisgICAgaWYgKGlzX2JpbmFyeSAhPSBRdHJ1ZSkgeworICAgICAgcmVzdWx0ID0gZGVmYXVsdF9yZWFkX3N0cmluZyhwcm90b2NvbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IGRlZmF1bHRfcmVhZF9iaW5hcnkocHJvdG9jb2wpOworICAgIH0KICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9ET1VCTEUpIHsKLSAgICByZXN1bHQgPSBtdC0+cmVhZF9kb3VibGUocHJvdG9jb2wpOworICAgIHJlc3VsdCA9IGRlZmF1bHRfcmVhZF9kb3VibGUocHJvdG9jb2wpOwogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX1NUUlVDVCkgewogICAgIFZBTFVFIGtsYXNzID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGNsYXNzX3N5bSk7CiAgICAgcmVzdWx0ID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDAsIE5VTEwsIGtsYXNzKTsKQEAgLTQ5NCw1NSArNDY0LDkzIEBACiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfTUFQKSB7CiAgICAgaW50IGk7CiAKLSAgICBWQUxVRSBtYXBfaGVhZGVyID0gbXQtPnJlYWRfbWFwX2JlZ2luKHByb3RvY29sKTsKKyAgICBWQUxVRSBtYXBfaGVhZGVyID0gZGVmYXVsdF9yZWFkX21hcF9iZWdpbihwcm90b2NvbCk7CiAgICAgaW50IGtleV90dHlwZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KG1hcF9oZWFkZXIsIDApKTsKICAgICBpbnQgdmFsdWVfdHR5cGUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShtYXBfaGVhZGVyLCAxKSk7CiAgICAgaW50IG51bV9lbnRyaWVzID0gRklYMklOVChyYl9hcnlfZW50cnkobWFwX2hlYWRlciwgMikpOwogCisgICAgLy8gQ2hlY2sgdGhlIGRlY2xhcmVkIGtleSBhbmQgdmFsdWUgdHlwZXMgYWdhaW5zdCB0aGUgZXhwZWN0ZWQgb25lcyBhbmQgc2tpcCB0aGUgbWFwIGNvbnRlbnRzCisgICAgLy8gaWYgdGhlIHR5cGVzIGRvbid0IG1hdGNoLgogICAgIFZBTFVFIGtleV9pbmZvID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGtleV9zeW0pOwogICAgIFZBTFVFIHZhbHVlX2luZm8gPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgdmFsdWVfc3ltKTsKIAotICAgIHJlc3VsdCA9IHJiX2hhc2hfbmV3KCk7CisgICAgaWYgKCFOSUxfUChrZXlfaW5mbykgJiYgIU5JTF9QKHZhbHVlX2luZm8pKSB7CisgICAgICBpbnQgc3BlY2lmaWVkX2tleV90eXBlID0gRklYMklOVChyYl9oYXNoX2FyZWYoa2V5X2luZm8sIHR5cGVfc3ltKSk7CisgICAgICBpbnQgc3BlY2lmaWVkX3ZhbHVlX3R5cGUgPSBGSVgySU5UKHJiX2hhc2hfYXJlZih2YWx1ZV9pbmZvLCB0eXBlX3N5bSkpOworICAgICAgaWYgKG51bV9lbnRyaWVzID09IDAgfHwgKHNwZWNpZmllZF9rZXlfdHlwZSA9PSBrZXlfdHR5cGUgJiYgc3BlY2lmaWVkX3ZhbHVlX3R5cGUgPT0gdmFsdWVfdHR5cGUpKSB7CisgICAgICAgIHJlc3VsdCA9IHJiX2hhc2hfbmV3KCk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7ICsraSkgewotICAgICAgVkFMVUUga2V5LCB2YWw7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgKytpKSB7CisgICAgICAgICAgVkFMVUUga2V5LCB2YWw7CiAKLSAgICAgIGtleSA9IHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIGtleV90dHlwZSwga2V5X2luZm8pOwotICAgICAgdmFsID0gcmVhZF9hbnl0aGluZyhwcm90b2NvbCwgdmFsdWVfdHR5cGUsIHZhbHVlX2luZm8pOworICAgICAgICAgIGtleSA9IHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIGtleV90dHlwZSwga2V5X2luZm8pOworICAgICAgICAgIHZhbCA9IHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIHZhbHVlX3R0eXBlLCB2YWx1ZV9pbmZvKTsKIAotICAgICAgcmJfaGFzaF9hc2V0KHJlc3VsdCwga2V5LCB2YWwpOworICAgICAgICAgIHJiX2hhc2hfYXNldChyZXN1bHQsIGtleSwgdmFsKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2tpcF9tYXBfY29udGVudHMocHJvdG9jb2wsIElOVDJGSVgoa2V5X3R0eXBlKSwgSU5UMkZJWCh2YWx1ZV90dHlwZSksIG51bV9lbnRyaWVzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2tpcF9tYXBfY29udGVudHMocHJvdG9jb2wsIElOVDJGSVgoa2V5X3R0eXBlKSwgSU5UMkZJWCh2YWx1ZV90dHlwZSksIG51bV9lbnRyaWVzKTsKICAgICB9CiAKLSAgICBtdC0+cmVhZF9tYXBfZW5kKHByb3RvY29sKTsKKyAgICBkZWZhdWx0X3JlYWRfbWFwX2VuZChwcm90b2NvbCk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfTElTVCkgewogICAgIGludCBpOwogCi0gICAgVkFMVUUgbGlzdF9oZWFkZXIgPSBtdC0+cmVhZF9saXN0X2JlZ2luKHByb3RvY29sKTsKKyAgICBWQUxVRSBsaXN0X2hlYWRlciA9IGRlZmF1bHRfcmVhZF9saXN0X2JlZ2luKHByb3RvY29sKTsKICAgICBpbnQgZWxlbWVudF90dHlwZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KGxpc3RfaGVhZGVyLCAwKSk7CiAgICAgaW50IG51bV9lbGVtZW50cyA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KGxpc3RfaGVhZGVyLCAxKSk7Ci0gICAgcmVzdWx0ID0gcmJfYXJ5X25ldzIobnVtX2VsZW1lbnRzKTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZWxlbWVudHM7ICsraSkgewotICAgICAgcmJfYXJ5X3B1c2gocmVzdWx0LCByZWFkX2FueXRoaW5nKHByb3RvY29sLCBlbGVtZW50X3R0eXBlLCByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgZWxlbWVudF9zeW0pKSk7CisgICAgLy8gQ2hlY2sgdGhlIGRlY2xhcmVkIGVsZW1lbnQgdHlwZSBhZ2FpbnN0IHRoZSBleHBlY3RlZCBvbmUgYW5kIHNraXAgdGhlIGxpc3QgY29udGVudHMKKyAgICAvLyBpZiB0aGUgdHlwZXMgZG9uJ3QgbWF0Y2guCisgICAgVkFMVUUgZWxlbWVudF9pbmZvID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGVsZW1lbnRfc3ltKTsKKyAgICBpZiAoIU5JTF9QKGVsZW1lbnRfaW5mbykpIHsKKyAgICAgIGludCBzcGVjaWZpZWRfZWxlbWVudF90eXBlID0gRklYMklOVChyYl9oYXNoX2FyZWYoZWxlbWVudF9pbmZvLCB0eXBlX3N5bSkpOworICAgICAgaWYgKHNwZWNpZmllZF9lbGVtZW50X3R5cGUgPT0gZWxlbWVudF90dHlwZSkgeworICAgICAgICByZXN1bHQgPSByYl9hcnlfbmV3MihudW1fZWxlbWVudHMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZWxlbWVudHM7ICsraSkgeworICAgICAgICAgIHJiX2FyeV9wdXNoKHJlc3VsdCwgcmVhZF9hbnl0aGluZyhwcm90b2NvbCwgZWxlbWVudF90dHlwZSwgcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGVsZW1lbnRfc3ltKSkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBza2lwX2xpc3Rfb3Jfc2V0X2NvbnRlbnRzKHByb3RvY29sLCBJTlQyRklYKGVsZW1lbnRfdHR5cGUpLCBudW1fZWxlbWVudHMpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBza2lwX2xpc3Rfb3Jfc2V0X2NvbnRlbnRzKHByb3RvY29sLCBJTlQyRklYKGVsZW1lbnRfdHR5cGUpLCBudW1fZWxlbWVudHMpOwogICAgIH0KIAotICAgIG10LT5yZWFkX2xpc3RfZW5kKHByb3RvY29sKTsKKyAgICBkZWZhdWx0X3JlYWRfbGlzdF9lbmQocHJvdG9jb2wpOwogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX1NFVCkgewogICAgIFZBTFVFIGl0ZW1zOwogICAgIGludCBpOwogCi0gICAgVkFMVUUgc2V0X2hlYWRlciA9IG10LT5yZWFkX3NldF9iZWdpbihwcm90b2NvbCk7CisgICAgVkFMVUUgc2V0X2hlYWRlciA9IGRlZmF1bHRfcmVhZF9zZXRfYmVnaW4ocHJvdG9jb2wpOwogICAgIGludCBlbGVtZW50X3R0eXBlID0gRklYMklOVChyYl9hcnlfZW50cnkoc2V0X2hlYWRlciwgMCkpOwogICAgIGludCBudW1fZWxlbWVudHMgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShzZXRfaGVhZGVyLCAxKSk7Ci0gICAgaXRlbXMgPSByYl9hcnlfbmV3MihudW1fZWxlbWVudHMpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9lbGVtZW50czsgKytpKSB7Ci0gICAgICByYl9hcnlfcHVzaChpdGVtcywgcmVhZF9hbnl0aGluZyhwcm90b2NvbCwgZWxlbWVudF90dHlwZSwgcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGVsZW1lbnRfc3ltKSkpOworICAgIC8vIENoZWNrIHRoZSBkZWNsYXJlZCBlbGVtZW50IHR5cGUgYWdhaW5zdCB0aGUgZXhwZWN0ZWQgb25lIGFuZCBza2lwIHRoZSBzZXQgY29udGVudHMKKyAgICAvLyBpZiB0aGUgdHlwZXMgZG9uJ3QgbWF0Y2guCisgICAgVkFMVUUgZWxlbWVudF9pbmZvID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIGVsZW1lbnRfc3ltKTsKKyAgICBpZiAoIU5JTF9QKGVsZW1lbnRfaW5mbykpIHsKKyAgICAgIGludCBzcGVjaWZpZWRfZWxlbWVudF90eXBlID0gRklYMklOVChyYl9oYXNoX2FyZWYoZWxlbWVudF9pbmZvLCB0eXBlX3N5bSkpOworICAgICAgaWYgKHNwZWNpZmllZF9lbGVtZW50X3R5cGUgPT0gZWxlbWVudF90dHlwZSkgeworICAgICAgICBpdGVtcyA9IHJiX2FyeV9uZXcyKG51bV9lbGVtZW50cyk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lbGVtZW50czsgKytpKSB7CisgICAgICAgICAgcmJfYXJ5X3B1c2goaXRlbXMsIHJlYWRfYW55dGhpbmcocHJvdG9jb2wsIGVsZW1lbnRfdHR5cGUsIHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBlbGVtZW50X3N5bSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IHJiX2NsYXNzX25ld19pbnN0YW5jZSgxLCAmaXRlbXMsIHJiX2NTZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2tpcF9saXN0X29yX3NldF9jb250ZW50cyhwcm90b2NvbCwgSU5UMkZJWChlbGVtZW50X3R0eXBlKSwgbnVtX2VsZW1lbnRzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2tpcF9saXN0X29yX3NldF9jb250ZW50cyhwcm90b2NvbCwgSU5UMkZJWChlbGVtZW50X3R0eXBlKSwgbnVtX2VsZW1lbnRzKTsKICAgICB9CiAKLSAgICBtdC0+cmVhZF9zZXRfZW5kKHByb3RvY29sKTsKLQotICAgIHJlc3VsdCA9IHJiX2NsYXNzX25ld19pbnN0YW5jZSgxLCAmaXRlbXMsIHJiX2NTZXQpOworICAgIGRlZmF1bHRfcmVhZF9zZXRfZW5kKHByb3RvY29sKTsKICAgfSBlbHNlIHsKICAgICByYl9yYWlzZShyYl9lTm90SW1wRXJyb3IsICJyZWFkX2FueXRoaW5nIG5vdCBpbXBsZW1lbnRlZCBmb3IgdHlwZSAlZCEiLCB0dHlwZSk7CiAgIH0KQEAgLTU1MSwxNiArNTU5LDE0IEBACiB9CiAKIHN0YXRpYyBWQUxVRSByYl90aHJpZnRfc3RydWN0X3JlYWQoVkFMVUUgc2VsZiwgVkFMVUUgcHJvdG9jb2wpIHsKLSAgLy8gY2hlY2tfbmF0aXZlX3Byb3RvX21ldGhvZF90YWJsZShwcm90b2NvbCk7Ci0KICAgLy8gcmVhZCBzdHJ1Y3QgYmVnaW4KLSAgbXQtPnJlYWRfc3RydWN0X2JlZ2luKHByb3RvY29sKTsKKyAgZGVmYXVsdF9yZWFkX3N0cnVjdF9iZWdpbihwcm90b2NvbCk7CiAKICAgVkFMVUUgc3RydWN0X2ZpZWxkcyA9IFNUUlVDVF9GSUVMRFMoc2VsZik7CiAKICAgLy8gcmVhZCBlYWNoIGZpZWxkCiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgVkFMVUUgZmllbGRfaGVhZGVyID0gbXQtPnJlYWRfZmllbGRfYmVnaW4ocHJvdG9jb2wpOworICAgIFZBTFVFIGZpZWxkX2hlYWRlciA9IGRlZmF1bHRfcmVhZF9maWVsZF9iZWdpbihwcm90b2NvbCk7CiAgICAgVkFMVUUgZmllbGRfdHlwZV92YWx1ZSA9IHJiX2FyeV9lbnRyeShmaWVsZF9oZWFkZXIsIDEpOwogICAgIGludCBmaWVsZF90eXBlID0gRklYMklOVChmaWVsZF90eXBlX3ZhbHVlKTsKIApAQCAtNTg1LDExICs1OTEsMTEgQEAKICAgICB9CiAKICAgICAvLyByZWFkIGZpZWxkIGVuZAotICAgIG10LT5yZWFkX2ZpZWxkX2VuZChwcm90b2NvbCk7CisgICAgZGVmYXVsdF9yZWFkX2ZpZWxkX2VuZChwcm90b2NvbCk7CiAgIH0KIAogICAvLyByZWFkIHN0cnVjdCBlbmQKLSAgbXQtPnJlYWRfc3RydWN0X2VuZChwcm90b2NvbCk7CisgIGRlZmF1bHRfcmVhZF9zdHJ1Y3RfZW5kKHByb3RvY29sKTsKIAogICAvLyBjYWxsIHZhbGlkYXRlCiAgIHJiX2Z1bmNhbGwoc2VsZiwgdmFsaWRhdGVfbWV0aG9kX2lkLCAwKTsKQEAgLTYwNCwxMSArNjEwLDExIEBACiAKIHN0YXRpYyBWQUxVRSByYl90aHJpZnRfdW5pb25fcmVhZChWQUxVRSBzZWxmLCBWQUxVRSBwcm90b2NvbCkgewogICAvLyByZWFkIHN0cnVjdCBiZWdpbgotICBtdC0+cmVhZF9zdHJ1Y3RfYmVnaW4ocHJvdG9jb2wpOworICBkZWZhdWx0X3JlYWRfc3RydWN0X2JlZ2luKHByb3RvY29sKTsKIAogICBWQUxVRSBzdHJ1Y3RfZmllbGRzID0gU1RSVUNUX0ZJRUxEUyhzZWxmKTsKIAotICBWQUxVRSBmaWVsZF9oZWFkZXIgPSBtdC0+cmVhZF9maWVsZF9iZWdpbihwcm90b2NvbCk7CisgIFZBTFVFIGZpZWxkX2hlYWRlciA9IGRlZmF1bHRfcmVhZF9maWVsZF9iZWdpbihwcm90b2NvbCk7CiAgIFZBTFVFIGZpZWxkX3R5cGVfdmFsdWUgPSByYl9hcnlfZW50cnkoZmllbGRfaGVhZGVyLCAxKTsKICAgaW50IGZpZWxkX3R5cGUgPSBGSVgySU5UKGZpZWxkX3R5cGVfdmFsdWUpOwogCkBAIC02MjAsNyArNjI2LDcgQEAKICAgICBpZiAoZmllbGRfdHlwZSA9PSBzcGVjaWZpZWRfdHlwZSkgewogICAgICAgLy8gcmVhZCB0aGUgdmFsdWUKICAgICAgIFZBTFVFIG5hbWUgPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgbmFtZV9zeW0pOwotICAgICAgcmJfaXZfc2V0KHNlbGYsICJAc2V0ZmllbGQiLCBJRDJTWU0ocmJfaW50ZXJuKFJTVFJJTkdfUFRSKG5hbWUpKSkpOworICAgICAgcmJfaXZfc2V0KHNlbGYsICJAc2V0ZmllbGQiLCByYl9zdHJfaW50ZXJuKG5hbWUpKTsKICAgICAgIHJiX2l2X3NldChzZWxmLCAiQHZhbHVlIiwgcmVhZF9hbnl0aGluZyhwcm90b2NvbCwgZmllbGRfdHlwZSwgZmllbGRfaW5mbykpOwogICAgIH0gZWxzZSB7CiAgICAgICByYl9mdW5jYWxsKHByb3RvY29sLCBza2lwX21ldGhvZF9pZCwgMSwgZmllbGRfdHlwZV92YWx1ZSk7CkBAIC02MzAsOSArNjM2LDkgQEAKICAgfQogCiAgIC8vIHJlYWQgZmllbGQgZW5kCi0gIG10LT5yZWFkX2ZpZWxkX2VuZChwcm90b2NvbCk7CisgIGRlZmF1bHRfcmVhZF9maWVsZF9lbmQocHJvdG9jb2wpOwogCi0gIGZpZWxkX2hlYWRlciA9IG10LT5yZWFkX2ZpZWxkX2JlZ2luKHByb3RvY29sKTsKKyAgZmllbGRfaGVhZGVyID0gZGVmYXVsdF9yZWFkX2ZpZWxkX2JlZ2luKHByb3RvY29sKTsKICAgZmllbGRfdHlwZV92YWx1ZSA9IHJiX2FyeV9lbnRyeShmaWVsZF9oZWFkZXIsIDEpOwogICBmaWVsZF90eXBlID0gRklYMklOVChmaWVsZF90eXBlX3ZhbHVlKTsKIApAQCAtNjQwLDExICs2NDYsOCBAQAogICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJ0b28gbWFueSBmaWVsZHMgaW4gdW5pb24hIik7CiAgIH0KIAotICAvLyByZWFkIGZpZWxkIGVuZAotICBtdC0+cmVhZF9maWVsZF9lbmQocHJvdG9jb2wpOwotCiAgIC8vIHJlYWQgc3RydWN0IGVuZAotICBtdC0+cmVhZF9zdHJ1Y3RfZW5kKHByb3RvY29sKTsKKyAgZGVmYXVsdF9yZWFkX3N0cnVjdF9lbmQocHJvdG9jb2wpOwogCiAgIC8vIGNhbGwgdmFsaWRhdGUKICAgcmJfZnVuY2FsbChzZWxmLCB2YWxpZGF0ZV9tZXRob2RfaWQsIDApOwpAQCAtNjU3LDcgKzY2MCw3IEBACiAgIHJiX2Z1bmNhbGwoc2VsZiwgdmFsaWRhdGVfbWV0aG9kX2lkLCAwKTsKIAogICAvLyB3cml0ZSBzdHJ1Y3QgYmVnaW4KLSAgbXQtPndyaXRlX3N0cnVjdF9iZWdpbihwcm90b2NvbCwgcmJfY2xhc3NfbmFtZShDTEFTU19PRihzZWxmKSkpOworICBkZWZhdWx0X3dyaXRlX3N0cnVjdF9iZWdpbihwcm90b2NvbCwgcmJfY2xhc3NfbmFtZShDTEFTU19PRihzZWxmKSkpOwogCiAgIFZBTFVFIHN0cnVjdF9maWVsZHMgPSBTVFJVQ1RfRklFTERTKHNlbGYpOwogCkBAIC02NjcsMTkgKzY3MCwyMyBAQAogCiAgIFZBTFVFIGZpZWxkX2luZm8gPSByYl9oYXNoX2FyZWYoc3RydWN0X2ZpZWxkcywgZmllbGRfaWQpOwogCisgIGlmKE5JTF9QKGZpZWxkX2luZm8pKSB7CisgICAgcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciwgInNldF9maWVsZCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgdW5pb24hIik7CisgIH0KKwogICBWQUxVRSB0dHlwZV92YWx1ZSA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCB0eXBlX3N5bSk7CiAgIGludCB0dHlwZSA9IEZJWDJJTlQodHR5cGVfdmFsdWUpOwogCi0gIG10LT53cml0ZV9maWVsZF9iZWdpbihwcm90b2NvbCwgc2V0ZmllbGQsIHR0eXBlX3ZhbHVlLCBmaWVsZF9pZCk7CisgIGRlZmF1bHRfd3JpdGVfZmllbGRfYmVnaW4ocHJvdG9jb2wsIHNldGZpZWxkLCB0dHlwZV92YWx1ZSwgZmllbGRfaWQpOwogCiAgIHdyaXRlX2FueXRoaW5nKHR0eXBlLCBzZXR2YWx1ZSwgcHJvdG9jb2wsIGZpZWxkX2luZm8pOwogCi0gIG10LT53cml0ZV9maWVsZF9lbmQocHJvdG9jb2wpOworICBkZWZhdWx0X3dyaXRlX2ZpZWxkX2VuZChwcm90b2NvbCk7CiAKLSAgbXQtPndyaXRlX2ZpZWxkX3N0b3AocHJvdG9jb2wpOworICBkZWZhdWx0X3dyaXRlX2ZpZWxkX3N0b3AocHJvdG9jb2wpOwogCiAgIC8vIHdyaXRlIHN0cnVjdCBlbmQKLSAgbXQtPndyaXRlX3N0cnVjdF9lbmQocHJvdG9jb2wpOworICBkZWZhdWx0X3dyaXRlX3N0cnVjdF9lbmQocHJvdG9jb2wpOwogCiAgIHJldHVybiBRbmlsOwogfQpAQCAtNzAwLDcgKzcwNyw1IEBACiAKICAgdG9fc19tZXRob2RfaWQgPSByYl9pbnRlcm4oInRvX3MiKTsKICAgbmFtZV90b19pZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIm5hbWVfdG9faWQiKTsKLQotICBzZXRfZGVmYXVsdF9wcm90b19mdW5jdGlvbl9wb2ludGVycygpOwotICBtdCA9IGRlZmF1bHRfbXQ7CisgIHNvcnRlZF9maWVsZF9pZHNfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJzb3J0ZWRfZmllbGRfaWRzIik7CiB9CmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3N0cnVjdC5oIGIvbGliL3JiL2V4dC9zdHJ1Y3QuaAppbmRleCA0OGNjZWY4Li40NzQ4YmU1IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L3N0cnVjdC5oCisrKyBiL2xpYi9yYi9leHQvc3RydWN0LmgKQEAgLTIxLDQ4ICsyMSw1IEBACiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHJ1YnkuaD4KIAotdHlwZWRlZiBzdHJ1Y3QgbmF0aXZlX3Byb3RvX21ldGhvZF90YWJsZSB7Ci0gIFZBTFVFICgqd3JpdGVfYm9vbCkoVkFMVUUsIFZBTFVFKTsKLSAgVkFMVUUgKCp3cml0ZV9ieXRlKShWQUxVRSwgVkFMVUUpOwotICBWQUxVRSAoKndyaXRlX2kxNikoVkFMVUUsIFZBTFVFKTsKLSAgVkFMVUUgKCp3cml0ZV9pMzIpKFZBTFVFLCBWQUxVRSk7Ci0gIFZBTFVFICgqd3JpdGVfaTY0KShWQUxVRSwgVkFMVUUpOwotICBWQUxVRSAoKndyaXRlX2RvdWJsZSkoVkFMVUUsIFZBTFVFKTsKLSAgVkFMVUUgKCp3cml0ZV9zdHJpbmcpKFZBTFVFLCBWQUxVRSk7Ci0gIFZBTFVFICgqd3JpdGVfbGlzdF9iZWdpbikoVkFMVUUsIFZBTFVFLCBWQUxVRSk7Ci0gIFZBTFVFICgqd3JpdGVfbGlzdF9lbmQpKFZBTFVFKTsKLSAgVkFMVUUgKCp3cml0ZV9zZXRfYmVnaW4pKFZBTFVFLCBWQUxVRSwgVkFMVUUpOwotICBWQUxVRSAoKndyaXRlX3NldF9lbmQpKFZBTFVFKTsKLSAgVkFMVUUgKCp3cml0ZV9tYXBfYmVnaW4pKFZBTFVFLCBWQUxVRSwgVkFMVUUsIFZBTFVFKTsKLSAgVkFMVUUgKCp3cml0ZV9tYXBfZW5kKShWQUxVRSk7Ci0gIFZBTFVFICgqd3JpdGVfc3RydWN0X2JlZ2luKShWQUxVRSwgVkFMVUUpOwotICBWQUxVRSAoKndyaXRlX3N0cnVjdF9lbmQpKFZBTFVFKTsKLSAgVkFMVUUgKCp3cml0ZV9maWVsZF9iZWdpbikoVkFMVUUsIFZBTFVFLCBWQUxVRSwgVkFMVUUpOwotICBWQUxVRSAoKndyaXRlX2ZpZWxkX2VuZCkoVkFMVUUpOwotICBWQUxVRSAoKndyaXRlX2ZpZWxkX3N0b3ApKFZBTFVFKTsKLSAgVkFMVUUgKCp3cml0ZV9tZXNzYWdlX2JlZ2luKShWQUxVRSwgVkFMVUUsIFZBTFVFLCBWQUxVRSk7Ci0gIFZBTFVFICgqd3JpdGVfbWVzc2FnZV9lbmQpKFZBTFVFKTsKLQotICBWQUxVRSAoKnJlYWRfbWVzc2FnZV9iZWdpbikoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfbWVzc2FnZV9lbmQpKFZBTFVFKTsKLSAgVkFMVUUgKCpyZWFkX2ZpZWxkX2JlZ2luKShWQUxVRSk7Ci0gIFZBTFVFICgqcmVhZF9maWVsZF9lbmQpKFZBTFVFKTsKLSAgVkFMVUUgKCpyZWFkX21hcF9iZWdpbikoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfbWFwX2VuZCkoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfbGlzdF9iZWdpbikoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfbGlzdF9lbmQpKFZBTFVFKTsKLSAgVkFMVUUgKCpyZWFkX3NldF9iZWdpbikoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfc2V0X2VuZCkoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfYnl0ZSkoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfYm9vbCkoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfaTE2KShWQUxVRSk7Ci0gIFZBTFVFICgqcmVhZF9pMzIpKFZBTFVFKTsKLSAgVkFMVUUgKCpyZWFkX2k2NCkoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfZG91YmxlKShWQUxVRSk7Ci0gIFZBTFVFICgqcmVhZF9zdHJpbmcpKFZBTFVFKTsKLSAgVkFMVUUgKCpyZWFkX3N0cnVjdF9iZWdpbikoVkFMVUUpOwotICBWQUxVRSAoKnJlYWRfc3RydWN0X2VuZCkoVkFMVUUpOwotfSBuYXRpdmVfcHJvdG9fbWV0aG9kX3RhYmxlOwotCiB2b2lkIEluaXRfc3RydWN0KCk7CiB2b2lkIEluaXRfdW5pb24oKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5jIGIvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMKaW5kZXggMDliOWZlNC4uMzQzMGI3YyAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMKKysrIGIvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMKQEAgLTE4LDE1ICsxOCwxNiBAQAogICovCiAKICNpbmNsdWRlIDxydWJ5Lmg+CisjaW5jbHVkZSA8Ynl0ZXMuaD4KICNpbmNsdWRlIDxzdHJ1Y3QuaD4KICNpbmNsdWRlIDxiaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuaD4KICNpbmNsdWRlIDxjb21wYWN0X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wuaD4KICNpbmNsdWRlIDxtZW1vcnlfYnVmZmVyLmg+CiAKIC8vIGNhY2hlZCBjbGFzc2VzL21vZHVsZXMKIFZBTFVFIHJiX2NTZXQ7CiBWQUxVRSB0aHJpZnRfbW9kdWxlOworVkFMVUUgdGhyaWZ0X2J5dGVzX21vZHVsZTsKIFZBTFVFIHRocmlmdF90eXBlc19tb2R1bGU7CiAKIC8vIFRUeXBlIGNvbnN0YW50cwpAQCAtNTYsMTkgKzU3LDIwIEBACiBJRCB3cml0ZV9pNjRfbWV0aG9kX2lkOwogSUQgd3JpdGVfZG91YmxlX21ldGhvZF9pZDsKIElEIHdyaXRlX3N0cmluZ19tZXRob2RfaWQ7CitJRCB3cml0ZV9iaW5hcnlfbWV0aG9kX2lkOwogSUQgd3JpdGVfbWFwX2JlZ2luX21ldGhvZF9pZDsKIElEIHdyaXRlX21hcF9lbmRfbWV0aG9kX2lkOwogSUQgd3JpdGVfbGlzdF9iZWdpbl9tZXRob2RfaWQ7CiBJRCB3cml0ZV9saXN0X2VuZF9tZXRob2RfaWQ7CiBJRCB3cml0ZV9zZXRfYmVnaW5fbWV0aG9kX2lkOwogSUQgd3JpdGVfc2V0X2VuZF9tZXRob2RfaWQ7Ci1JRCBzaXplX21ldGhvZF9pZDsKIElEIHJlYWRfYm9vbF9tZXRob2RfaWQ7CiBJRCByZWFkX2J5dGVfbWV0aG9kX2lkOwogSUQgcmVhZF9pMTZfbWV0aG9kX2lkOwogSUQgcmVhZF9pMzJfbWV0aG9kX2lkOwogSUQgcmVhZF9pNjRfbWV0aG9kX2lkOwogSUQgcmVhZF9zdHJpbmdfbWV0aG9kX2lkOworSUQgcmVhZF9iaW5hcnlfbWV0aG9kX2lkOwogSUQgcmVhZF9kb3VibGVfbWV0aG9kX2lkOwogSUQgcmVhZF9tYXBfYmVnaW5fbWV0aG9kX2lkOwogSUQgcmVhZF9tYXBfZW5kX21ldGhvZF9pZDsKQEAgLTgxLDE0ICs4MywxNSBAQAogSUQgcmVhZF9maWVsZF9iZWdpbl9tZXRob2RfaWQ7CiBJRCByZWFkX2ZpZWxkX2VuZF9tZXRob2RfaWQ7CiBJRCBrZXlzX21ldGhvZF9pZDsKLUlEIGVudHJpZXNfbWV0aG9kX2lkOyAKLUlEIG5hbWVfbWV0aG9kX2lkOyAKLUlEIHNvcnRfbWV0aG9kX2lkOworSUQgZW50cmllc19tZXRob2RfaWQ7CiBJRCB3cml0ZV9maWVsZF9zdG9wX21ldGhvZF9pZDsKIElEIHNraXBfbWV0aG9kX2lkOwogSUQgd3JpdGVfbWV0aG9kX2lkOwogSUQgcmVhZF9hbGxfbWV0aG9kX2lkOwotSUQgbmF0aXZlX3FtYXJrX21ldGhvZF9pZDsKK0lEIHJlYWRfaW50b19idWZmZXJfbWV0aG9kX2lkOworSUQgZm9yY2VfYmluYXJ5X2VuY29kaW5nX2lkOworSUQgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyX2lkOworSUQgY29udmVydF90b19zdHJpbmdfaWQ7CiAKIC8vIGNvbnN0YW50IGlkcwogSUQgZmllbGRzX2NvbnN0X2lkOwpAQCAtMTAzLDExICsxMDYsMTMgQEAKIFZBTFVFIHZhbHVlX3N5bTsKIFZBTFVFIGVsZW1lbnRfc3ltOwogVkFMVUUgY2xhc3Nfc3ltOworVkFMVUUgYmluYXJ5X3N5bTsKIFZBTFVFIHByb3RvY29sX2V4Y2VwdGlvbl9jbGFzczsKIAogdm9pZCBJbml0X3RocmlmdF9uYXRpdmUoKSB7CiAgIC8vIGNhY2hlZCBjbGFzc2VzCiAgIHRocmlmdF9tb2R1bGUgPSByYl9jb25zdF9nZXQocmJfY09iamVjdCwgcmJfaW50ZXJuKCJUaHJpZnQiKSk7CisgIHRocmlmdF9ieXRlc19tb2R1bGUgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJCeXRlcyIpKTsKICAgdGhyaWZ0X3R5cGVzX21vZHVsZSA9IHJiX2NvbnN0X2dldCh0aHJpZnRfbW9kdWxlLCByYl9pbnRlcm4oIlR5cGVzIikpOwogICByYl9jU2V0ID0gcmJfY29uc3RfZ2V0KHJiX2NPYmplY3QsIHJiX2ludGVybigiU2V0IikpOwogICBwcm90b2NvbF9leGNlcHRpb25fY2xhc3MgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJQcm90b2NvbEV4Y2VwdGlvbiIpKTsKQEAgLTEzOCwxOSArMTQzLDIwIEBACiAgIHdyaXRlX2k2NF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2k2NCIpOwogICB3cml0ZV9kb3VibGVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9kb3VibGUiKTsKICAgd3JpdGVfc3RyaW5nX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfc3RyaW5nIik7CisgIHdyaXRlX2JpbmFyeV9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2JpbmFyeSIpOwogICB3cml0ZV9tYXBfYmVnaW5fbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9tYXBfYmVnaW4iKTsKICAgd3JpdGVfbWFwX2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX21hcF9lbmQiKTsKICAgd3JpdGVfbGlzdF9iZWdpbl9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2xpc3RfYmVnaW4iKTsKICAgd3JpdGVfbGlzdF9lbmRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9saXN0X2VuZCIpOwogICB3cml0ZV9zZXRfYmVnaW5fbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9zZXRfYmVnaW4iKTsKICAgd3JpdGVfc2V0X2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX3NldF9lbmQiKTsKLSAgc2l6ZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oInNpemUiKTsKICAgcmVhZF9ib29sX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9ib29sIik7CiAgIHJlYWRfYnl0ZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfYnl0ZSIpOwogICByZWFkX2kxNl9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfaTE2Iik7CiAgIHJlYWRfaTMyX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9pMzIiKTsKICAgcmVhZF9pNjRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2k2NCIpOwogICByZWFkX3N0cmluZ19tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfc3RyaW5nIik7CisgIHJlYWRfYmluYXJ5X21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9iaW5hcnkiKTsKICAgcmVhZF9kb3VibGVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2RvdWJsZSIpOwogICByZWFkX21hcF9iZWdpbl9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfbWFwX2JlZ2luIik7CiAgIHJlYWRfbWFwX2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfbWFwX2VuZCIpOyAgCkBAIC0xNjQsMTMgKzE3MCwxNCBAQAogICByZWFkX2ZpZWxkX2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfZmllbGRfZW5kIik7CiAgIGtleXNfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJrZXlzIik7CiAgIGVudHJpZXNfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJlbnRyaWVzIik7Ci0gIG5hbWVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJuYW1lIik7Ci0gIHNvcnRfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJzb3J0Iik7CiAgIHdyaXRlX2ZpZWxkX3N0b3BfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9maWVsZF9zdG9wIik7CiAgIHNraXBfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJza2lwIik7CiAgIHdyaXRlX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGUiKTsKICAgcmVhZF9hbGxfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2FsbCIpOwotICBuYXRpdmVfcW1hcmtfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJuYXRpdmU/Iik7CisgIHJlYWRfaW50b19idWZmZXJfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2ludG9fYnVmZmVyIik7CisgIGZvcmNlX2JpbmFyeV9lbmNvZGluZ19pZCA9IHJiX2ludGVybigiZm9yY2VfYmluYXJ5X2VuY29kaW5nIik7CisgIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcl9pZCA9IHJiX2ludGVybigiY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIik7CisgIGNvbnZlcnRfdG9fc3RyaW5nX2lkID0gcmJfaW50ZXJuKCJjb252ZXJ0X3RvX3N0cmluZyIpOwogCiAgIC8vIGNvbnN0YW50IGlkcwogICBmaWVsZHNfY29uc3RfaWQgPSByYl9pbnRlcm4oIkZJRUxEUyIpOwpAQCAtMTg1LDggKzE5Miw4IEBACiAgIHZhbHVlX3N5bSA9IElEMlNZTShyYl9pbnRlcm4oInZhbHVlIikpOwogICBlbGVtZW50X3N5bSA9IElEMlNZTShyYl9pbnRlcm4oImVsZW1lbnQiKSk7CiAgIGNsYXNzX3N5bSA9IElEMlNZTShyYl9pbnRlcm4oImNsYXNzIikpOworICBiaW5hcnlfc3ltID0gSUQyU1lNKHJiX2ludGVybigiYmluYXJ5IikpOwogCi0gIEluaXRfcHJvdG9jb2woKTsKICAgSW5pdF9zdHJ1Y3QoKTsKICAgSW5pdF9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQoKTsKICAgSW5pdF9jb21wYWN0X3Byb3RvY29sKCk7CmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0LnJiCmluZGV4IDAyZDY3YjguLjBmNTgxMjIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0LnJiCkBAIC0xLDQgKzEsNCBAQAotIyAKKyMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtNiwyNiArNiwyOCBAQAogIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAorIwogIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKKyMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KLSMgCisjCiAjIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCiAjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCiAjIGRldGFpbHMuCiAKICQ6LnVuc2hpZnQgRmlsZS5kaXJuYW1lKF9fRklMRV9fKQogCityZXF1aXJlICd0aHJpZnQvYnl0ZXMnCiByZXF1aXJlICd0aHJpZnQvY29yZV9leHQnCiByZXF1aXJlICd0aHJpZnQvZXhjZXB0aW9ucycKIHJlcXVpcmUgJ3RocmlmdC90eXBlcycKIHJlcXVpcmUgJ3RocmlmdC9wcm9jZXNzb3InCityZXF1aXJlICd0aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yJwogcmVxdWlyZSAndGhyaWZ0L2NsaWVudCcKIHJlcXVpcmUgJ3RocmlmdC9zdHJ1Y3QnCiByZXF1aXJlICd0aHJpZnQvdW5pb24nCkBAIC00MCwxMiArNDIsMTYgQEAKIHJlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wnCiByZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkJwogcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wnCityZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbCcKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbCcKIAogIyB0cmFuc3BvcnQKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc29ja2V0JworcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0JworcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0JwpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvYnl0ZXMucmIgYi9saWIvcmIvbGliL3RocmlmdC9ieXRlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ0ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvYnl0ZXMucmIKQEAgLTAsMCArMSwxMzEgQEAKKyMgZW5jb2Rpbmc6IGFzY2lpLThiaXQKKyMgCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCittb2R1bGUgVGhyaWZ0CisgICMgQSBjb2xsZWN0aW9uIG9mIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIGJ5dGVzIGFuZCBieXRlIGJ1ZmZlcnMuCisgIG1vZHVsZSBCeXRlcworICAgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JworICAgICAgIyBDcmVhdGVzIGFuZCBlbXB0eSBieXRlIGJ1ZmZlciAoU3RyaW5nIHdpdGggQklOQVJZIGVuY29kaW5nKQorICAgICAgIworICAgICAgIyBzaXplIC0gVGhlIEludGVnZXIgc2l6ZSBvZiB0aGUgYnVmZmVyIChkZWZhdWx0OiBuaWwpIHRvIGNyZWF0ZQorICAgICAgIworICAgICAgIyBSZXR1cm5zIGEgU3RyaW5nIHdpdGggQklOQVJZIGVuY29kaW5nLCBmaWxsZWQgd2l0aCBudWxsIGNoYXJhY3RlcnMgCisgICAgICAjIGlmIHNpemUgaXMgZ3JlYXRlciB0aGFuIHplcm8KKyAgICAgIGRlZiBzZWxmLmVtcHR5X2J5dGVfYnVmZmVyKHNpemUgPSBuaWwpCisgICAgICAgIGlmIChzaXplICYmIHNpemUgPiAwKQorICAgICAgICAgICJcMCIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkgKiBzaXplCisgICAgICAgIGVsc2UKKyAgICAgICAgICAnJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICAjIEZvcmNlcyB0aGUgZW5jb2Rpbmcgb2YgdGhlIGJ1ZmZlciB0byBCSU5BUlkuIElmIHRoZSBidWZmZXIKKyAgICAgICMgcGFzc2VkIGlzIGZyb3plbiwgdGhlbiBpdCB3aWxsIGJlIGR1cGxpY2F0ZWQuCisgICAgICAjCisgICAgICAjIGJ1ZmZlciAtIFRoZSBTdHJpbmcgdG8gZm9yY2UgdGhlIGVuY29kaW5nIG9mLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIHRoZSBTdHJpbmcgcGFzc2VkIHdpdGggYW4gZW5jb2Rpbmcgb2YgQklOQVJZOyByZXR1cm5lZAorICAgICAgIyBTdHJpbmcgbWF5IGJlIGEgZHVwbGljYXRlLgorICAgICAgZGVmIHNlbGYuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZmZlcikKKyAgICAgICAgYnVmZmVyID0gYnVmZmVyLmR1cCBpZiBidWZmZXIuZnJvemVuPworICAgICAgICBidWZmZXIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGVuZAorCisgICAgICAjIEdldHMgdGhlIGJ5dGUgdmFsdWUgb2YgYSBnaXZlbiBwb3NpdGlvbiBpbiBhIFN0cmluZy4KKyAgICAgICMKKyAgICAgICMgc3RyaW5nIC0gVGhlIFN0cmluZyB0byByZXRyaXZlIHRoZSBieXRlIHZhbHVlIGZyb20uCisgICAgICAjIGluZGV4ICAtIFRoZSBJbnRlZ2VyIGxvY2F0aW9uIG9mIHRoZSBieXRlIHZhbHVlIHRvIHJldHJpZXZlLgorICAgICAgIworICAgICAgIyBSZXR1cm5zIGFuIEludGVnZXIgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuCisgICAgICBkZWYgc2VsZi5nZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCkKKyAgICAgICAgc3RyaW5nLmdldGJ5dGUoaW5kZXgpCisgICAgICBlbmQKKworICAgICAgIyBTZXRzIHRoZSBieXRlIHZhbHVlIGdpdmVuIHRvIGEgZ2l2ZW4gaW5kZXggaW4gYSBTdHJpbmcuCisgICAgICAjCisgICAgICAjIHN0cmluZyAtIFRoZSBTdHJpbmcgdG8gc2V0IHRoZSBieXRlIHZhbHVlIGluLgorICAgICAgIyBpbmRleCAgLSBUaGUgSW50ZWdlciBsb2NhdGlvbiB0byBzZXQgdGhlIGJ5dGUgdmFsdWUgYXQuCisgICAgICAjIGJ5dGUgICAtIFRoZSBJbnRlZ2VyIHZhbHVlICgwIHRvIDI1NSkgdG8gc2V0IGluIHRoZSBzdHJpbmcuCisgICAgICAjCisgICAgICAjIFJldHVybnMgYW4gSW50ZWdlciB2YWx1ZSBvZiB0aGUgYnl0ZSB2YWx1ZSB0byBzZXQuCisgICAgICBkZWYgc2VsZi5zZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCwgYnl0ZSkKKyAgICAgICAgc3RyaW5nLnNldGJ5dGUoaW5kZXgsIGJ5dGUpCisgICAgICBlbmQKKworICAgICAgIyBDb252ZXJ0cyB0aGUgZ2l2ZW4gU3RyaW5nIHRvIGEgVVRGLTggYnl0ZSBidWZmZXIuCisgICAgICAjCisgICAgICAjIHN0cmluZyAtIFRoZSBTdHJpbmcgdG8gY29udmVydC4KKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhIG5ldyBTdHJpbmcgd2l0aCBCSU5BUlkgZW5jb2RpbmcsIGNvbnRhaW5pbmcgdGhlIFVURi04CisgICAgICAjIGJ5dGVzIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisgICAgICBkZWYgc2VsZi5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyaW5nKQorICAgICAgICBpZiBzdHJpbmcuZW5jb2RpbmcgIT0gRW5jb2Rpbmc6OlVURl84CisgICAgICAgICAgIyB0cmFuc2NvZGUgdG8gVVRGLTgKKyAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuZW5jb2RlKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgZW5jb2RpbmcgaXMgYWxyZWFkeSBVVEYtOCwgYnV0IGEgZHVwbGljYXRlIGlzIG5lZWRlZAorICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5kdXAKKyAgICAgICAgZW5kCisgICAgICAgIHN0cmluZy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisKKyAgICAgICMgQ29udmVydHMgdGhlIGdpdmVuIFVURi04IGJ5dGUgYnVmZmVyIGludG8gYSBTdHJpbmcKKyAgICAgICMKKyAgICAgICMgdXRmOF9idWZmZXIgLSBBIFN0cmluZywgd2l0aCBCSU5BUlkgZW5jb2RpbmcsIGNvbnRhaW5pbmcgVVRGLTggYnl0ZXMKKyAgICAgICMKKyAgICAgICMgUmV0dXJucyBhIG5ldyBTdHJpbmcgd2l0aCBVVEYtOCBlbmNvZGluZywKKyAgICAgIGRlZiBzZWxmLmNvbnZlcnRfdG9fc3RyaW5nKHV0ZjhfYnVmZmVyKQorICAgICAgICAjIGR1cGxpY2F0ZSB0aGUgYnVmZmVyLCBmb3JjZSBlbmNvZGluZyB0byBVVEYtOAorICAgICAgICB1dGY4X2J1ZmZlci5kdXAuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgZGVmIHNlbGYuZW1wdHlfYnl0ZV9idWZmZXIoc2l6ZSA9IG5pbCkKKyAgICAgICAgaWYgKHNpemUgJiYgc2l6ZSA+IDApCisgICAgICAgICAgIlwwIiAqIHNpemUKKyAgICAgICAgZWxzZQorICAgICAgICAgICcnCisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWZmZXIpCisgICAgICAgIGJ1ZmZlcgorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLmdldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4KQorICAgICAgICBzdHJpbmdbaW5kZXhdCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuc2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgsIGJ5dGUpCisgICAgICAgIHN0cmluZ1tpbmRleF0gPSBieXRlCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cmluZykKKyAgICAgICAgIyBUaGlzIGFzc3VtZXMgJEtDT0RFIGlzICdVVEY4Jy8nVScsIHdoaWNoIHdvdWxkIG1lYW4gdGhlIFN0cmluZyBpcyBhbHJlYWR5IGEgVVRGLTggYnl0ZSBidWZmZXIKKyAgICAgICAgIyBUT0RPIGNvbnNpZGVyIGhhbmRsaW5nIG90aGVyICRLQ09ERSB2YWx1ZXMgYW5kIHRyYW5zY29kaW5nIHdpdGggaWNvbnYKKyAgICAgICAgc3RyaW5nCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuY29udmVydF90b19zdHJpbmcodXRmOF9idWZmZXIpCisgICAgICAgICMgU2VlIGNvbW1lbnQgaW4gJ2NvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcicgZm9yIHJlbGV2YW50IGFzc3VtcHRpb25zLgorICAgICAgICB1dGY4X2J1ZmZlcgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9jbGllbnQucmIgYi9saWIvcmIvbGliL3RocmlmdC9jbGllbnQucmIKaW5kZXggNWIzMGYwMS4uNjRlZjA1OSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvY2xpZW50LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L2NsaWVudC5yYgpAQCAtMSw0ICsxLDQgQEAKLSMgCisjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTYsMTYgKzYsMTYgQEAKICMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKKyMKICMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCisjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCiAjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jIAorIwogCiBtb2R1bGUgVGhyaWZ0CiAgIG1vZHVsZSBDbGllbnQKQEAgLTI3LDYgKzI3LDE1IEBACiAKICAgICBkZWYgc2VuZF9tZXNzYWdlKG5hbWUsIGFyZ3NfY2xhc3MsIGFyZ3MgPSB7fSkKICAgICAgIEBvcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIE1lc3NhZ2VUeXBlczo6Q0FMTCwgQHNlcWlkKQorICAgICAgc2VuZF9tZXNzYWdlX2FyZ3MoYXJnc19jbGFzcywgYXJncykKKyAgICBlbmQKKworICAgIGRlZiBzZW5kX29uZXdheV9tZXNzYWdlKG5hbWUsIGFyZ3NfY2xhc3MsIGFyZ3MgPSB7fSkKKyAgICAgIEBvcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIE1lc3NhZ2VUeXBlczo6T05FV0FZLCBAc2VxaWQpCisgICAgICBzZW5kX21lc3NhZ2VfYXJncyhhcmdzX2NsYXNzLCBhcmdzKQorICAgIGVuZAorCisgICAgZGVmIHNlbmRfbWVzc2FnZV9hcmdzKGFyZ3NfY2xhc3MsIGFyZ3MpCiAgICAgICBkYXRhID0gYXJnc19jbGFzcy5uZXcKICAgICAgIGFyZ3MuZWFjaCBkbyB8aywgdnwKICAgICAgICAgZGF0YS5zZW5kKCIje2sudG9fc309IiwgdikKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L2V4Y2VwdGlvbnMucmIgYi9saWIvcmIvbGliL3RocmlmdC9leGNlcHRpb25zLnJiCmluZGV4IGRkYTcwODkuLjY4Y2I5ZTAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L2V4Y2VwdGlvbnMucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvZXhjZXB0aW9ucy5yYgpAQCAtMzUsNiArMzUsMTEgQEAKICAgICBXUk9OR19NRVRIT0RfTkFNRSA9IDMKICAgICBCQURfU0VRVUVOQ0VfSUQgPSA0CiAgICAgTUlTU0lOR19SRVNVTFQgPSA1CisgICAgSU5URVJOQUxfRVJST1IgPSA2CisgICAgUFJPVE9DT0xfRVJST1IgPSA3CisgICAgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4CisgICAgSU5WQUxJRF9QUk9UT0NPTCA9IDkKKyAgICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwCiAKICAgICBhdHRyX3JlYWRlciA6dHlwZQogCkBAIC03OSw0ICs4NCw0IEBACiAgICAgZW5kCiAKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3Nvci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3Nvci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzM0YzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLnJiCkBAIC0wLDAgKzEsNzYgQEAKKyMgCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvcHJvdG9jb2xfZGVjb3JhdG9yJworcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wnCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgTXVsdGlwbGV4ZWRQcm9jZXNzb3IKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgQGFjdHVhbF9wcm9jZXNzb3JzID0ge30KKyAgICBlbmQKKyAKKyAgICBkZWYgcmVnaXN0ZXJfcHJvY2Vzc29yKHNlcnZpY2VfbmFtZSwgcHJvY2Vzc29yKQorICAgICAgQGFjdHVhbF9wcm9jZXNzb3JzW3NlcnZpY2VfbmFtZV0gPSBwcm9jZXNzb3IKKyAgICBlbmQKKyAKKyAgICBkZWYgcHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICBuYW1lLCB0eXBlLCBzZXFpZCA9IGlwcm90LnJlYWRfbWVzc2FnZV9iZWdpbgorICAgICAgY2hlY2tfdHlwZSh0eXBlKQorICAgICAgY2hlY2tfc2VwYXJhdG9yKG5hbWUpCisgICAgICBzZXJ2aWNlX25hbWUsIG1ldGhvZCA9IG5hbWUuc3BsaXQoJzonKQorICAgICAgcHJvY2Vzc29yKHNlcnZpY2VfbmFtZSkucHJvY2VzcyhTdG9yZWRNZXNzYWdlUHJvdG9jb2wubmV3KGlwcm90LCBbbWV0aG9kLCB0eXBlLCBzZXFpZF0pLCBvcHJvdCkKKyAgICBlbmQKKworICAgIHByb3RlY3RlZAorCisgICAgZGVmIHByb2Nlc3NvcihzZXJ2aWNlX25hbWUpCisgICAgICBpZiBAYWN0dWFsX3Byb2Nlc3NvcnMuaGFzX2tleT8oc2VydmljZV9uYW1lKQorICAgICAgICBAYWN0dWFsX3Byb2Nlc3NvcnNbc2VydmljZV9uYW1lXQorICAgICAgZWxzZQorICAgICAgICByYWlzZSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICN7c2VydmljZV9uYW1lfS4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCAje3NlbGYuY2xhc3MubmFtZX0jcmVnaXN0ZXJfcHJvY2Vzc29yPyIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBjaGVja190eXBlKHR5cGUpCisgICAgICB1bmxlc3MgW01lc3NhZ2VUeXBlczo6Q0FMTCwgTWVzc2FnZVR5cGVzOjpPTkVXQVldLmluY2x1ZGU/KHR5cGUpCisgICAgICAgIHJhaXNlIFRocmlmdDo6RXhjZXB0aW9uLm5ldygnVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPycpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBjaGVja19zZXBhcmF0b3IobmFtZSkKKyAgICAgIGlmIG5hbWUuY291bnQoJzonKSA8IDEKKyAgICAgICAgcmFpc2UgVGhyaWZ0OjpFeGNlcHRpb24ubmV3KCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogI3tuYW1lfS4gRGlkIHlvdSBmb3JnZXQgdG8gdXNlIGEgVGhyaWZ0OjpQcm90b2NvbDo6TXVsdGlwbGV4ZWRQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA8IEJhc2VQcm90b2NvbAorCisgICAgaW5jbHVkZSBQcm90b2NvbERlY29yYXRvcgorICAgIAorICAgIGRlZiBpbml0aWFsaXplKHByb3RvY29sLCBtZXNzYWdlX2JlZ2luKQorICAgICAgc3VwZXIocHJvdG9jb2wpCisgICAgICBAbWVzc2FnZV9iZWdpbiA9IG1lc3NhZ2VfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX21lc3NhZ2VfYmVnaW4KKyAgICAgIEBtZXNzYWdlX2JlZ2luCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIKaW5kZXggNWQ5ZTBhMS4uY2UyMWUxMiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgpAQCAtMTcsMjUgKzE3LDM2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIyAKIAorcmVxdWlyZSAnbG9nZ2VyJworCiBtb2R1bGUgVGhyaWZ0CiAgIG1vZHVsZSBQcm9jZXNzb3IKLSAgICBkZWYgaW5pdGlhbGl6ZShoYW5kbGVyKQorICAgIGRlZiBpbml0aWFsaXplKGhhbmRsZXIsIGxvZ2dlcj1uaWwpCiAgICAgICBAaGFuZGxlciA9IGhhbmRsZXIKKyAgICAgIGlmIGxvZ2dlci5uaWw/CisgICAgICAgIEBsb2dnZXIgPSBMb2dnZXIubmV3KFNUREVSUikKKyAgICAgICAgQGxvZ2dlci5sZXZlbCA9IExvZ2dlcjo6V0FSTgorICAgICAgZWxzZQorICAgICAgICBAbG9nZ2VyID0gbG9nZ2VyCisgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlZiBwcm9jZXNzKGlwcm90LCBvcHJvdCkKICAgICAgIG5hbWUsIHR5cGUsIHNlcWlkICA9IGlwcm90LnJlYWRfbWVzc2FnZV9iZWdpbgogICAgICAgaWYgcmVzcG9uZF90bz8oInByb2Nlc3NfI3tuYW1lfSIpCi0gICAgICAgIHNlbmQoInByb2Nlc3NfI3tuYW1lfSIsIHNlcWlkLCBpcHJvdCwgb3Byb3QpCisgICAgICAgIGJlZ2luCisgICAgICAgICAgc2VuZCgicHJvY2Vzc18je25hbWV9Iiwgc2VxaWQsIGlwcm90LCBvcHJvdCkKKyAgICAgICAgcmVzY3VlID0+IGUKKyAgICAgICAgICB4ID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3KEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICAgICAgICBAbG9nZ2VyLmRlYnVnICJJbnRlcm5hbCBlcnJvciA6ICN7ZS5tZXNzYWdlfVxuI3tlLmJhY2t0cmFjZS5qb2luKCJcbiIpfSIKKyAgICAgICAgICB3cml0ZV9lcnJvcih4LCBvcHJvdCwgbmFtZSwgc2VxaWQpCisgICAgICAgIGVuZAogICAgICAgICB0cnVlCiAgICAgICBlbHNlCiAgICAgICAgIGlwcm90LnNraXAoVHlwZXM6OlNUUlVDVCkKICAgICAgICAgaXByb3QucmVhZF9tZXNzYWdlX2VuZAogICAgICAgICB4ID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3KEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgJ1Vua25vd24gZnVuY3Rpb24gJytuYW1lKQotICAgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIE1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCBzZXFpZCkKLSAgICAgICAgeC53cml0ZShvcHJvdCkKLSAgICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQKLSAgICAgICAgb3Byb3QudHJhbnMuZmx1c2gKKyAgICAgICAgd3JpdGVfZXJyb3IoeCwgb3Byb3QsIG5hbWUsIHNlcWlkKQogICAgICAgICBmYWxzZQogICAgICAgZW5kCiAgICAgZW5kCkBAIC01Myw1ICs2NCwxMiBAQAogICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQKICAgICAgIG9wcm90LnRyYW5zLmZsdXNoCiAgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZXJyb3IoZXJyLCBvcHJvdCwgbmFtZSwgc2VxaWQpCisgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIE1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCBzZXFpZCkKKyAgICAgIGVyci53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfZW5kCisgICAgICBvcHJvdC50cmFucy5mbHVzaAorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKaW5kZXggYjE5OTA5ZC4uNWM2OTNlOSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiCkBAIC0yOCw2ICsyOCw4IEBACiAgICAgTkVHQVRJVkVfU0laRSA9IDIKICAgICBTSVpFX0xJTUlUID0gMwogICAgIEJBRF9WRVJTSU9OID0gNAorICAgIE5PVF9JTVBMRU1FTlRFRCA9IDUKKyAgICBERVBUSF9MSU1JVCA9IDYKIAogICAgIGF0dHJfcmVhZGVyIDp0eXBlCiAKQEAgLTExNCwxMCArMTE2LDI3IEBACiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAKKyAgICAjIFdyaXRlcyBhIFRocmlmdCBTdHJpbmcuIEluIFJ1YnkgMS45KywgdGhlIFN0cmluZyBwYXNzZWQgd2lsbCBiZSB0cmFuc2NvZGVkIHRvIFVURi04LgorICAgICMKKyAgICAjIHN0ciAtIFRoZSBTdHJpbmcgdG8gd3JpdGUuCisgICAgIworICAgICMgUmFpc2VzIEVuY29kaW5nRXJyb3IgaWYgdGhlIHRyYW5zY29kaW5nIHRvIFVURi04IGZhaWxzLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KICAgICBkZWYgd3JpdGVfc3RyaW5nKHN0cikKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKIAorICAgICMgV3JpdGVzIGEgVGhyaWZ0IEJpbmFyeSAoVGhyaWZ0IFN0cmluZyB3aXRoIG5vIGVuY29kaW5nKS4gSW4gUnVieSAxLjkrLCB0aGUgU3RyaW5nIHBhc3NlZAorICAgICMgd2lsbCBmb3JjZWQgaW50byBCSU5BUlkgZW5jb2RpbmcuCisgICAgIworICAgICMgYnVmIC0gVGhlIFN0cmluZyB0byB3cml0ZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHdyaXRlX2JpbmFyeShidWYpCisgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgZW5kCisKICAgICBkZWYgcmVhZF9tZXNzYWdlX2JlZ2luCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCkBAIC0xNzgsMTggKzE5Nyw2NyBAQAogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogCisgICAgIyBSZWFkcyBhIFRocmlmdCBTdHJpbmcuIEluIFJ1YnkgMS45KywgYWxsIFN0cmluZ3Mgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGFuIEVuY29kaW5nIG9mIFVURi04LgorICAgICMKKyAgICAjIFJldHVybnMgYSBTdHJpbmcuCiAgICAgZGVmIHJlYWRfc3RyaW5nCiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAKLSAgICBkZWYgd3JpdGVfZmllbGQobmFtZSwgdHlwZSwgZmlkLCB2YWx1ZSkKLSAgICAgIHdyaXRlX2ZpZWxkX2JlZ2luKG5hbWUsIHR5cGUsIGZpZCkKLSAgICAgIHdyaXRlX3R5cGUodHlwZSwgdmFsdWUpCisgICAgIyBSZWFkcyBhIFRocmlmdCBCaW5hcnkgKFRocmlmdCBTdHJpbmcgd2l0aG91dCBlbmNvZGluZykuIEluIFJ1YnkgMS45KywgYWxsIFN0cmluZ3Mgd2lsbCBiZSByZXR1cm5lZAorICAgICMgd2l0aCBhbiBFbmNvZGluZyBvZiBCSU5BUlkuCisgICAgIworICAgICMgUmV0dXJucyBhIFN0cmluZy4KKyAgICBkZWYgcmVhZF9iaW5hcnkKKyAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBlbmQKKworICAgICMgV3JpdGVzIGEgZmllbGQgYmFzZWQgb24gdGhlIGZpZWxkIGluZm9ybWF0aW9uLCBmaWVsZCBJRCBhbmQgdmFsdWUuCisgICAgIworICAgICMgZmllbGRfaW5mbyAtIEEgSGFzaCBjb250YWluaW5nIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmaWVsZDoKKyAgICAjICAgICAgICAgICAgICA6bmFtZSAgIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICMgICAgICAgICAgICAgIDp0eXBlICAgLSBUaGUgdHlwZSBvZiB0aGUgZmllbGQsIHdoaWNoIG11c3QgYmUgYSBUaHJpZnQ6OlR5cGVzIGNvbnN0YW50LgorICAgICMgICAgICAgICAgICAgIDpiaW5hcnkgLSBBIEJvb2xlYW4gZmxhZyB0aGF0IGluZGljYXRlcyBpZiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcgaXMgYSBiaW5hcnkgc3RyaW5nIChzdHJpbmcgd2l0aG91dCBlbmNvZGluZykuCisgICAgIyBmaWQgICAgICAgIC0gVGhlIElEIG9mIHRoZSBmaWVsZC4KKyAgICAjIHZhbHVlICAgICAgLSBUaGUgZmllbGQncyB2YWx1ZSB0byB3cml0ZTsgb2JqZWN0IHR5cGUgdmFyaWVzIGJhc2VkIG9uIDp0eXBlLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgd3JpdGVfZmllbGQoKmFyZ3MpCisgICAgICBpZiBhcmdzLnNpemUgPT0gMworICAgICAgICAjIGhhbmRsZXMgdGhlIGRvY3VtZW50ZWQgbWV0aG9kIHNpZ25hdHVyZSAtIHdyaXRlX2ZpZWxkKGZpZWxkX2luZm8sIGZpZCwgdmFsdWUpCisgICAgICAgIGZpZWxkX2luZm8gPSBhcmdzWzBdCisgICAgICAgIGZpZCA9IGFyZ3NbMV0KKyAgICAgICAgdmFsdWUgPSBhcmdzWzJdCisgICAgICBlbHNpZiBhcmdzLnNpemUgPT0gNAorICAgICAgICAjIGhhbmRsZXMgdGhlIGRlcHJlY2F0ZWQgbWV0aG9kIHNpZ25hdHVyZSAtIHdyaXRlX2ZpZWxkKG5hbWUsIHR5cGUsIGZpZCwgdmFsdWUpCisgICAgICAgIGZpZWxkX2luZm8gPSB7Om5hbWUgPT4gYXJnc1swXSwgOnR5cGUgPT4gYXJnc1sxXX0KKyAgICAgICAgZmlkID0gYXJnc1syXQorICAgICAgICB2YWx1ZSA9IGFyZ3NbM10KKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMgKCN7YXJncy5zaXplfSBmb3IgMykiCisgICAgICBlbmQKKworICAgICAgd3JpdGVfZmllbGRfYmVnaW4oZmllbGRfaW5mb1s6bmFtZV0sIGZpZWxkX2luZm9bOnR5cGVdLCBmaWQpCisgICAgICB3cml0ZV90eXBlKGZpZWxkX2luZm8sIHZhbHVlKQogICAgICAgd3JpdGVfZmllbGRfZW5kCiAgICAgZW5kCiAKLSAgICBkZWYgd3JpdGVfdHlwZSh0eXBlLCB2YWx1ZSkKLSAgICAgIGNhc2UgdHlwZQorICAgICMgV3JpdGVzIGEgZmllbGQgdmFsdWUgYmFzZWQgb24gdGhlIGZpZWxkIGluZm9ybWF0aW9uLgorICAgICMKKyAgICAjIGZpZWxkX2luZm8gLSBBIEhhc2ggY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZmllbGQ6CisgICAgIyAgICAgICAgICAgICAgOnR5cGUgICAtIFRoZSBUaHJpZnQ6OlR5cGVzIGNvbnN0YW50IHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIHZhbHVlIGlzIHdyaXR0ZW4uCisgICAgIyAgICAgICAgICAgICAgOmJpbmFyeSAtIEEgQm9vbGVhbiBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIFRocmlmdDo6VHlwZXM6OlNUUklORyBpcyBhIGJpbmFyeSBzdHJpbmcgKHN0cmluZyB3aXRob3V0IGVuY29kaW5nKS4KKyAgICAjIHZhbHVlICAgICAgLSBUaGUgZmllbGQncyB2YWx1ZSB0byB3cml0ZTsgb2JqZWN0IHR5cGUgdmFyaWVzIGJhc2VkIG9uIGZpZWxkX2luZm9bOnR5cGVdLgorICAgICMKKyAgICAjIFJldHVybnMgbm90aGluZy4KKyAgICBkZWYgd3JpdGVfdHlwZShmaWVsZF9pbmZvLCB2YWx1ZSkKKyAgICAgICMgaWYgZmllbGRfaW5mbyBpcyBhIEZpeG51bSwgYXNzdW1lIGl0IGlzIGEgVGhyaWZ0OjpUeXBlcyBjb25zdGFudAorICAgICAgIyBjb252ZXJ0IGl0IGludG8gYSBmaWVsZF9pbmZvIEhhc2ggZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgICBpZiBmaWVsZF9pbmZvLmlzX2E/IEZpeG51bQorICAgICAgICBmaWVsZF9pbmZvID0gezp0eXBlID0+IGZpZWxkX2luZm99CisgICAgICBlbmQKKworICAgICAgY2FzZSBmaWVsZF9pbmZvWzp0eXBlXQogICAgICAgd2hlbiBUeXBlczo6Qk9PTAogICAgICAgICB3cml0ZV9ib29sKHZhbHVlKQogICAgICAgd2hlbiBUeXBlczo6QllURQpAQCAtMjAzLDcgKzI3MSwxMSBAQAogICAgICAgd2hlbiBUeXBlczo6STY0CiAgICAgICAgIHdyaXRlX2k2NCh2YWx1ZSkKICAgICAgIHdoZW4gVHlwZXM6OlNUUklORwotICAgICAgICB3cml0ZV9zdHJpbmcodmFsdWUpCisgICAgICAgIGlmIGZpZWxkX2luZm9bOmJpbmFyeV0KKyAgICAgICAgICB3cml0ZV9iaW5hcnkodmFsdWUpCisgICAgICAgIGVsc2UKKyAgICAgICAgICB3cml0ZV9zdHJpbmcodmFsdWUpCisgICAgICAgIGVuZAogICAgICAgd2hlbiBUeXBlczo6U1RSVUNUCiAgICAgICAgIHZhbHVlLndyaXRlKHNlbGYpCiAgICAgICBlbHNlCkBAIC0yMTEsOCArMjgzLDIxIEBACiAgICAgICBlbmQKICAgICBlbmQKIAotICAgIGRlZiByZWFkX3R5cGUodHlwZSkKLSAgICAgIGNhc2UgdHlwZQorICAgICMgUmVhZHMgYSBmaWVsZCB2YWx1ZSBiYXNlZCBvbiB0aGUgZmllbGQgaW5mb3JtYXRpb24uCisgICAgIworICAgICMgZmllbGRfaW5mbyAtIEEgSGFzaCBjb250YWluaW5nIHRoZSBwZXJ0aW5lbnQgZGF0YSB0byB3cml0ZToKKyAgICAjICAgICAgICAgICAgICA6dHlwZSAgIC0gVGhlIFRocmlmdDo6VHlwZXMgY29uc3RhbnQgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgdmFsdWUgaXMgd3JpdHRlbi4KKyAgICAjICAgICAgICAgICAgICA6YmluYXJ5IC0gQSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIFRocmlmdDo6VHlwZXM6OlNUUklORyBpcyBhIGJpbmFyeSBzdHJpbmcgKHN0cmluZyB3aXRob3V0IGVuY29kaW5nKS4KKyAgICAjCisgICAgIyBSZXR1cm5zIHRoZSB2YWx1ZSByZWFkOyBvYmplY3QgdHlwZSB2YXJpZXMgYmFzZWQgb24gZmllbGRfaW5mb1s6dHlwZV0uCisgICAgZGVmIHJlYWRfdHlwZShmaWVsZF9pbmZvKQorICAgICAgIyBpZiBmaWVsZF9pbmZvIGlzIGEgRml4bnVtLCBhc3N1bWUgaXQgaXMgYSBUaHJpZnQ6OlR5cGVzIGNvbnN0YW50CisgICAgICAjIGNvbnZlcnQgaXQgaW50byBhIGZpZWxkX2luZm8gSGFzaCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAgIGlmIGZpZWxkX2luZm8uaXNfYT8gRml4bnVtCisgICAgICAgIGZpZWxkX2luZm8gPSB7OnR5cGUgPT4gZmllbGRfaW5mb30KKyAgICAgIGVuZAorCisgICAgICBjYXNlIGZpZWxkX2luZm9bOnR5cGVdCiAgICAgICB3aGVuIFR5cGVzOjpCT09MCiAgICAgICAgIHJlYWRfYm9vbAogICAgICAgd2hlbiBUeXBlczo6QllURQpAQCAtMjI2LDcgKzMxMSwxMSBAQAogICAgICAgd2hlbiBUeXBlczo6STY0CiAgICAgICAgIHJlYWRfaTY0CiAgICAgICB3aGVuIFR5cGVzOjpTVFJJTkcKLSAgICAgICAgcmVhZF9zdHJpbmcKKyAgICAgICAgaWYgZmllbGRfaW5mb1s6YmluYXJ5XQorICAgICAgICAgIHJlYWRfYmluYXJ5CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZWFkX3N0cmluZworICAgICAgICBlbmQKICAgICAgIGVsc2UKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgZW5kCkBAIC0yODAsMTEgKzM2OSwxOSBAQAogICAgICAgICByZWFkX2xpc3RfZW5kCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgIiN7dHJhbnMudG9fc30iCisgICAgZW5kCiAgIGVuZAogCiAgIGNsYXNzIEJhc2VQcm90b2NvbEZhY3RvcnkKICAgICBkZWYgZ2V0X3Byb3RvY29sKHRyYW5zKQogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYmFzZSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYgppbmRleCAwNGQxNDlhLi5kODI3OWRiIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCkBAIC0yOSw2ICsyOSwxMCBAQAogICAgICAgc3VwZXIodHJhbnMpCiAgICAgICBAc3RyaWN0X3JlYWQgPSBzdHJpY3RfcmVhZAogICAgICAgQHN0cmljdF93cml0ZSA9IHN0cmljdF93cml0ZQorCisgICAgICAjIFByZS1hbGxvY2F0ZWQgcmVhZCBidWZmZXIgZm9yIGZpeGVkLXNpemUgcmVhZCBtZXRob2RzLiBOZWVkcyB0byBiZSBhdCBsZWFzdCA4IGJ5dGVzIGxvbmcgZm9yCisgICAgICAjIHJlYWRfaTY0KCkgYW5kIHJlYWRfZG91YmxlKCkuCisgICAgICBAcmJ1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyKDgpCiAgICAgZW5kCiAKICAgICBkZWYgd3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKQEAgLTEwMyw4ICsxMDcsMTMgQEAKICAgICBlbmQKIAogICAgIGRlZiB3cml0ZV9zdHJpbmcoc3RyKQotICAgICAgd3JpdGVfaTMyKHN0ci5sZW5ndGgpCi0gICAgICB0cmFucy53cml0ZShzdHIpCisgICAgICBidWYgPSBCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyKQorICAgICAgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9iaW5hcnkoYnVmKQorICAgICAgd3JpdGVfaTMyKGJ1Zi5ieXRlc2l6ZSkKKyAgICAgIHRyYW5zLndyaXRlKGJ1ZikKICAgICBlbmQKIAogICAgIGRlZiByZWFkX21lc3NhZ2VfYmVnaW4KQEAgLTE2NSw4ICsxNzQsNyBAQAogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfYnl0ZQotICAgICAgZGF0ID0gdHJhbnMucmVhZF9hbGwoMSkKLSAgICAgIHZhbCA9IGRhdFswXS5vcmQKKyAgICAgIHZhbCA9IHRyYW5zLnJlYWRfYnl0ZQogICAgICAgaWYgKHZhbCA+IDB4N2YpCiAgICAgICAgIHZhbCA9IDAgLSAoKHZhbCAtIDEpIF4gMHhmZikKICAgICAgIGVuZApAQCAtMTc0LDggKzE4Miw4IEBACiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9pMTYKLSAgICAgIGRhdCA9IHRyYW5zLnJlYWRfYWxsKDIpCi0gICAgICB2YWwsID0gZGF0LnVucGFjaygnbicpCisgICAgICB0cmFucy5yZWFkX2ludG9fYnVmZmVyKEByYnVmLCAyKQorICAgICAgdmFsLCA9IEByYnVmLnVucGFjaygnbicpCiAgICAgICBpZiAodmFsID4gMHg3ZmZmKQogICAgICAgICB2YWwgPSAwIC0gKCh2YWwgLSAxKSBeIDB4ZmZmZikKICAgICAgIGVuZApAQCAtMTgzLDggKzE5MSw4IEBACiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9pMzIKLSAgICAgIGRhdCA9IHRyYW5zLnJlYWRfYWxsKDQpCi0gICAgICB2YWwsID0gZGF0LnVucGFjaygnTicpCisgICAgICB0cmFucy5yZWFkX2ludG9fYnVmZmVyKEByYnVmLCA0KQorICAgICAgdmFsLCA9IEByYnVmLnVucGFjaygnTicpCiAgICAgICBpZiAodmFsID4gMHg3ZmZmZmZmZikKICAgICAgICAgdmFsID0gMCAtICgodmFsIC0gMSkgXiAweGZmZmZmZmZmKQogICAgICAgZW5kCkBAIC0xOTIsOCArMjAwLDggQEAKICAgICBlbmQKIAogICAgIGRlZiByZWFkX2k2NAotICAgICAgZGF0ID0gdHJhbnMucmVhZF9hbGwoOCkKLSAgICAgIGhpLCBsbyA9IGRhdC51bnBhY2soJ04yJykKKyAgICAgIHRyYW5zLnJlYWRfaW50b19idWZmZXIoQHJidWYsIDgpCisgICAgICBoaSwgbG8gPSBAcmJ1Zi51bnBhY2soJ04yJykKICAgICAgIGlmIChoaSA+IDB4N2ZmZmZmZmYpCiAgICAgICAgIGhpIF49IDB4ZmZmZmZmZmYKICAgICAgICAgbG8gXj0gMHhmZmZmZmZmZgpAQCAtMjA0LDIyICsyMTIsMzMgQEAKICAgICBlbmQKIAogICAgIGRlZiByZWFkX2RvdWJsZQotICAgICAgZGF0ID0gdHJhbnMucmVhZF9hbGwoOCkKLSAgICAgIHZhbCA9IGRhdC51bnBhY2soJ0cnKS5maXJzdAorICAgICAgdHJhbnMucmVhZF9pbnRvX2J1ZmZlcihAcmJ1ZiwgOCkKKyAgICAgIHZhbCA9IEByYnVmLnVucGFjaygnRycpLmZpcnN0CiAgICAgICB2YWwKICAgICBlbmQKIAogICAgIGRlZiByZWFkX3N0cmluZwotICAgICAgc3ogPSByZWFkX2kzMgotICAgICAgZGF0ID0gdHJhbnMucmVhZF9hbGwoc3opCi0gICAgICBkYXQKKyAgICAgIGJ1ZmZlciA9IHJlYWRfYmluYXJ5CisgICAgICBCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyhidWZmZXIpCiAgICAgZW5kCiAKKyAgICBkZWYgcmVhZF9iaW5hcnkKKyAgICAgIHNpemUgPSByZWFkX2kzMgorICAgICAgdHJhbnMucmVhZF9hbGwoc2l6ZSkKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJpbmFyeSgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IDwgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByZXR1cm4gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiaW5hcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIKaW5kZXggNzBlYTY1Mi4uMDliMDI2NCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgpAQCAtMzUsNSArMzUsMTMgQEAKICAgICAgICAgQmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zKQogICAgICAgZW5kCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgaWYgKGRlZmluZWQ/IEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICAgICJiaW5hcnktYWNjZWwiCisgICAgICBlbHNlCisgICAgICAgICJiaW5hcnkiCisgICAgICBlbmQKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCmluZGV4IDNiZTJhOTAuLjFmOWJkMzAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYgpAQCAtMjQsNiArMjQsNyBAQAogICAgIFZFUlNJT04gPSAxCiAgICAgVkVSU0lPTl9NQVNLID0gMHgxZgogICAgIFRZUEVfTUFTSyA9IDB4RTAKKyAgICBUWVBFX0JJVFMgPSAweDA3CiAgICAgVFlQRV9TSElGVF9BTU9VTlQgPSA1CiAKICAgICBUU1RPUCA9IFsiIiwgVHlwZXM6OlNUT1AsIDBdCkBAIC05OCw2ICs5OSw5IEBACiAKICAgICAgIEBsYXN0X2ZpZWxkID0gWzBdCiAgICAgICBAYm9vbGVhbl92YWx1ZSA9IG5pbAorCisgICAgICAjIFByZS1hbGxvY2F0ZWQgcmVhZCBidWZmZXIgZm9yIHJlYWRfZG91YmxlKCkuCisgICAgICBAcmJ1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyKDgpCiAgICAgZW5kCiAKICAgICBkZWYgd3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKQEAgLTIwNyw4ICsyMTEsMTMgQEAKICAgICBlbmQKIAogICAgIGRlZiB3cml0ZV9zdHJpbmcoc3RyKQotICAgICAgd3JpdGVfdmFyaW50MzIoc3RyLmxlbmd0aCkKLSAgICAgIEB0cmFucy53cml0ZShzdHIpCisgICAgICBidWYgPSBCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyKQorICAgICAgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9iaW5hcnkoYnVmKQorICAgICAgd3JpdGVfdmFyaW50MzIoYnVmLmJ5dGVzaXplKQorICAgICAgQHRyYW5zLndyaXRlKGJ1ZikKICAgICBlbmQKIAogICAgIGRlZiByZWFkX21lc3NhZ2VfYmVnaW4KQEAgLTIyMyw3ICsyMzIsNyBAQAogICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoIkV4cGVjdGVkIHZlcnNpb24gI3tWRVJTSU9OfSBidXQgZ290ICN7dmVyc2lvbn0iKTsKICAgICAgIGVuZAogICAgICAgCi0gICAgICB0eXBlID0gKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMworICAgICAgdHlwZSA9ICh2ZXJzaW9uX2FuZF90eXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUwogICAgICAgc2VxaWQgPSByZWFkX3ZhcmludDMyKCkKICAgICAgIG1lc3NhZ2VOYW1lID0gcmVhZF9zdHJpbmcoKQogICAgICAgW21lc3NhZ2VOYW1lLCB0eXBlLCBzZXFpZF0KQEAgLTMwMiw4ICszMTEsNyBAQAogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfYnl0ZQotICAgICAgZGF0ID0gdHJhbnMucmVhZF9hbGwoMSkKLSAgICAgIHZhbCA9IGRhdFswXQorICAgICAgdmFsID0gdHJhbnMucmVhZF9ieXRlCiAgICAgICBpZiAodmFsID4gMHg3ZikKICAgICAgICAgdmFsID0gMCAtICgodmFsIC0gMSkgXiAweGZmKQogICAgICAgZW5kCkBAIC0zMjMsMTcgKzMzMSwyNSBAQAogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfZG91YmxlCi0gICAgICBkYXQgPSB0cmFucy5yZWFkX2FsbCg4KQotICAgICAgdmFsID0gZGF0LnJldmVyc2UudW5wYWNrKCdHJykuZmlyc3QKKyAgICAgIHRyYW5zLnJlYWRfaW50b19idWZmZXIoQHJidWYsIDgpCisgICAgICB2YWwgPSBAcmJ1Zi5yZXZlcnNlLnVucGFjaygnRycpLmZpcnN0CiAgICAgICB2YWwKICAgICBlbmQKIAogICAgIGRlZiByZWFkX3N0cmluZworICAgICAgYnVmZmVyID0gcmVhZF9iaW5hcnkKKyAgICAgIEJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nKGJ1ZmZlcikKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2JpbmFyeQogICAgICAgc2l6ZSA9IHJlYWRfdmFyaW50MzIoKQogICAgICAgdHJhbnMucmVhZF9hbGwoc2l6ZSkKICAgICBlbmQKICAgICAKLSAgICAKKyAgICBkZWYgdG9fcworICAgICAgImNvbXBhY3QoI3tzdXBlci50b19zfSkiCisgICAgZW5kCisKICAgICBwcml2YXRlCiAgICAgCiAgICAgIyAKQEAgLTQxOSw1ICs0MzUsOSBAQAogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICBDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiY29tcGFjdCIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTc0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiCkBAIC0wLDAgKzEsNzg2IEBACisjIGVuY29kaW5nOiBVVEYtOAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIAorCityZXF1aXJlICdiYXNlNjQnCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgTG9va2FoZWFkUmVhZGVyCisgICAgZGVmIGluaXRpYWxpemUodHJhbnMpCisgICAgICBAdHJhbnMgPSB0cmFucworICAgICAgQGhhc0RhdGEgPSBmYWxzZQorICAgICAgQGRhdGEgPSBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkCisgICAgICBpZiBAaGFzRGF0YQorICAgICAgICBAaGFzRGF0YSA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIEBkYXRhID0gQHRyYW5zLnJlYWQoMSkKKyAgICAgIGVuZAorCisgICAgICByZXR1cm4gQGRhdGEKKyAgICBlbmQKKworICAgIGRlZiBwZWVrCisgICAgICBpZiAhQGhhc0RhdGEKKyAgICAgICAgQGRhdGEgPSBAdHJhbnMucmVhZCgxKQorICAgICAgZW5kCisgICAgICBAaGFzRGF0YSA9IHRydWUKKyAgICAgIHJldHVybiBAZGF0YQorICAgIGVuZAorICBlbmQKKworICAjCisgICMgQ2xhc3MgdG8gc2VydmUgYXMgYmFzZSBKU09OIGNvbnRleHQgYW5kIGFzIGJhc2UgY2xhc3MgZm9yIG90aGVyIGNvbnRleHQKKyAgIyBpbXBsZW1lbnRhdGlvbnMKKyAgIworICBjbGFzcyBKU09OQ29udGV4dAorICAgIEBAa0pTT05FbGVtU2VwYXJhdG9yID0gJywnCisgICAgIworICAgICMgV3JpdGUgY29udGV4dCBkYXRhIHRvIHRoZSB0cmFucy4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgorICAgICMKKyAgICBkZWYgd3JpdGUodHJhbnMpCisgICAgZW5kCisKKyAgICAjCisgICAgIyBSZWFkIGNvbnRleHQgZGF0YSBmcm9tIHRoZSB0cmFucy4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgorICAgICMKKyAgICBkZWYgcmVhZChyZWFkZXIpCisgICAgZW5kCisKKyAgICAjCisgICAgIyBSZXR1cm4gdHJ1ZSBpZiBudW1iZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBhcyBzdHJpbmdzIGluIHRoaXMgY29udGV4dC4KKyAgICAjIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIGZhbHNlLgorICAgICMKKyAgICBkZWYgZXNjYXBlTnVtCisgICAgICByZXR1cm4gZmFsc2UKKyAgICBlbmQKKyAgZW5kCisKKyAgIyBDb250ZXh0IGNsYXNzIGZvciBvYmplY3QgbWVtYmVyIGtleS12YWx1ZSBwYWlycworICBjbGFzcyBKU09OUGFpckNvbnRleHQgPCBKU09OQ29udGV4dAorICAgIEBAa0pTT05QYWlyU2VwYXJhdG9yID0gJzonCisKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgQGZpcnN0ID0gdHJ1ZQorICAgICAgQGNvbG9uID0gdHJ1ZQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlKHRyYW5zKQorICAgICAgaWYgKEBmaXJzdCkKKyAgICAgICAgQGZpcnN0ID0gZmFsc2UKKyAgICAgICAgQGNvbG9uID0gdHJ1ZQorICAgICAgZWxzZQorICAgICAgICB0cmFucy53cml0ZShAY29sb24gPyBAQGtKU09OUGFpclNlcGFyYXRvciA6IEBAa0pTT05FbGVtU2VwYXJhdG9yKQorICAgICAgICBAY29sb24gPSAhQGNvbG9uCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkKHJlYWRlcikKKyAgICAgIGlmIChAZmlyc3QpCisgICAgICAgIEBmaXJzdCA9IGZhbHNlCisgICAgICAgIEBjb2xvbiA9IHRydWUKKyAgICAgIGVsc2UKKyAgICAgICAgY2ggPSAoQGNvbG9uID8gQEBrSlNPTlBhaXJTZXBhcmF0b3IgOiBAQGtKU09ORWxlbVNlcGFyYXRvcikKKyAgICAgICAgQGNvbG9uID0gIUBjb2xvbgorICAgICAgICBKc29uUHJvdG9jb2w6OnJlYWRfc3ludGF4X2NoYXIocmVhZGVyLCBjaCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgIyBOdW1iZXJzIG11c3QgYmUgdHVybmVkIGludG8gc3RyaW5ncyBpZiB0aGV5IGFyZSB0aGUga2V5IHBhcnQgb2YgYSBwYWlyCisgICAgZGVmIGVzY2FwZU51bQorICAgICAgcmV0dXJuIEBjb2xvbgorICAgIGVuZAorICBlbmQKKworICAjIENvbnRleHQgY2xhc3MgZm9yIGxpc3RzCisgIGNsYXNzIEpTT05MaXN0Q29udGV4dCA8IEpTT05Db250ZXh0CisKKyAgICBkZWYgaW5pdGlhbGl6ZQorICAgICAgQGZpcnN0ID0gdHJ1ZQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlKHRyYW5zKQorICAgICAgaWYgKEBmaXJzdCkKKyAgICAgICAgQGZpcnN0ID0gZmFsc2UKKyAgICAgIGVsc2UKKyAgICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTkVsZW1TZXBhcmF0b3IpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkKHJlYWRlcikKKyAgICAgIGlmIChAZmlyc3QpCisgICAgICAgIEBmaXJzdCA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIEpzb25Qcm90b2NvbDo6cmVhZF9zeW50YXhfY2hhcihyZWFkZXIsIEBAa0pTT05FbGVtU2VwYXJhdG9yKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorCisgIGNsYXNzIEpzb25Qcm90b2NvbCA8IEJhc2VQcm90b2NvbAorCisgICAgQEBrSlNPTk9iamVjdFN0YXJ0ID0gJ3snCisgICAgQEBrSlNPTk9iamVjdEVuZCA9ICd9JworICAgIEBAa0pTT05BcnJheVN0YXJ0ID0gJ1snCisgICAgQEBrSlNPTkFycmF5RW5kID0gJ10nCisgICAgQEBrSlNPTk5ld2xpbmUgPSAnXG4nCisgICAgQEBrSlNPTkJhY2tzbGFzaCA9ICdcXCcKKyAgICBAQGtKU09OU3RyaW5nRGVsaW1pdGVyID0gJyInCisKKyAgICBAQGtUaHJpZnRWZXJzaW9uMSA9IDEKKworICAgIEBAa1RocmlmdE5hbiA9ICJOYU4iCisgICAgQEBrVGhyaWZ0SW5maW5pdHkgPSAiSW5maW5pdHkiCisgICAgQEBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eSA9ICItSW5maW5pdHkiCisKKyAgICBkZWYgaW5pdGlhbGl6ZSh0cmFucykKKyAgICAgIHN1cGVyKHRyYW5zKQorICAgICAgQGNvbnRleHQgPSBKU09OQ29udGV4dC5uZXcKKyAgICAgIEBjb250ZXh0cyA9IEFycmF5Lm5ldworICAgICAgQHJlYWRlciA9IExvb2thaGVhZFJlYWRlci5uZXcodHJhbnMpCisgICAgZW5kCisKKyAgICBkZWYgZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChpZCkKKyAgICAgIGNhc2UgaWQKKyAgICAgIHdoZW4gVHlwZXM6OkJPT0wKKyAgICAgICAgInRmIgorICAgICAgd2hlbiBUeXBlczo6QllURQorICAgICAgICAiaTgiCisgICAgICB3aGVuIFR5cGVzOjpJMTYKKyAgICAgICAgImkxNiIKKyAgICAgIHdoZW4gVHlwZXM6OkkzMgorICAgICAgICAiaTMyIgorICAgICAgd2hlbiBUeXBlczo6STY0CisgICAgICAgICJpNjQiCisgICAgICB3aGVuIFR5cGVzOjpET1VCTEUKKyAgICAgICAgImRibCIKKyAgICAgIHdoZW4gVHlwZXM6OlNUUklORworICAgICAgICAic3RyIgorICAgICAgd2hlbiBUeXBlczo6U1RSVUNUCisgICAgICAgICJyZWMiCisgICAgICB3aGVuIFR5cGVzOjpNQVAKKyAgICAgICAgIm1hcCIKKyAgICAgIHdoZW4gVHlwZXM6OlNFVAorICAgICAgICAic2V0IgorICAgICAgd2hlbiBUeXBlczo6TElTVAorICAgICAgICAibHN0IgorICAgICAgZWxzZQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlZiBnZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKG5hbWUpCisgICAgICBpZiAobmFtZSA9PSAidGYiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6Qk9PTAorICAgICAgZWxzaWYgKG5hbWUgPT0gImk4IikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OkJZVEUKKyAgICAgIGVsc2lmIChuYW1lID09ICJpMTYiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6STE2CisgICAgICBlbHNpZiAobmFtZSA9PSAiaTMyIikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OkkzMgorICAgICAgZWxzaWYgKG5hbWUgPT0gImk2NCIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpJNjQKKyAgICAgIGVsc2lmIChuYW1lID09ICJkYmwiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6RE9VQkxFCisgICAgICBlbHNpZiAobmFtZSA9PSAic3RyIikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OlNUUklORworICAgICAgZWxzaWYgKG5hbWUgPT0gInJlYyIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpTVFJVQ1QKKyAgICAgIGVsc2lmIChuYW1lID09ICJtYXAiKQorICAgICAgICByZXN1bHQgPSBUeXBlczo6TUFQCisgICAgICBlbHNpZiAobmFtZSA9PSAic2V0IikKKyAgICAgICAgcmVzdWx0ID0gVHlwZXM6OlNFVAorICAgICAgZWxzaWYgKG5hbWUgPT0gImxzdCIpCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpMSVNUCisgICAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFR5cGVzOjpTVE9QCisgICAgICBlbmQKKyAgICAgIGlmIChyZXN1bHQgPT0gVHlwZXM6OlNUT1ApCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGVuZAorCisgICAgIyBTdGF0aWMgaGVscGVyIGZ1bmN0aW9ucworCisgICAgIyBSZWFkIDEgY2hhcmFjdGVyIGZyb20gdGhlIHRyYW5zIGFuZCB2ZXJpZnkgdGhhdCBpdCBpcyB0aGUgZXhwZWN0ZWQgY2hhcmFjdGVyIGNoLgorICAgICMgVGhyb3cgYSBwcm90b2NvbCBleGNlcHRpb24gaWYgaXQgaXMgbm90LgorICAgIGRlZiBzZWxmLnJlYWRfc3ludGF4X2NoYXIocmVhZGVyLCBjaCkKKyAgICAgIGNoMiA9IHJlYWRlci5yZWFkCisgICAgICBpZiAoY2gyICE9IGNoKQorICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIkV4cGVjdGVkIFwnI3tjaH1cJyBnb3QgXCcje2NoMn1cJy4iKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICMgUmV0dXJuIHRydWUgaWYgdGhlIGNoYXJhY3RlciBjaCBpcyBpbiBbLSswLTkuRWVdOyBmYWxzZSBvdGhlcndpc2UKKyAgICBkZWYgaXNfanNvbl9udW1lcmljKGNoKQorICAgICAgY2FzZSBjaAorICAgICAgd2hlbiAnKycsICctJywgJy4nLCAnMCcgLi4gJzknLCAnRScsICJlIgorICAgICAgICByZXR1cm4gdHJ1ZQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHB1c2hfY29udGV4dChjb250ZXh0KQorICAgICAgQGNvbnRleHRzLnB1c2goQGNvbnRleHQpCisgICAgICBAY29udGV4dCA9IGNvbnRleHQKKyAgICBlbmQKKworICAgIGRlZiBwb3BfY29udGV4dAorICAgICAgQGNvbnRleHQgPSBAY29udGV4dHMucG9wCisgICAgZW5kCisKKyAgICAjIFdyaXRlIHRoZSBjaGFyYWN0ZXIgY2ggYXMgYSBKU09OIGVzY2FwZSBzZXF1ZW5jZSAoIlx1MDB4eCIpCisgICAgZGVmIHdyaXRlX2pzb25fZXNjYXBlX2NoYXIoY2gpCisgICAgICB0cmFucy53cml0ZSgnXFx1JykKKyAgICAgIGNoX3ZhbHVlID0gY2hbMF0KKyAgICAgIGlmIChjaF92YWx1ZS5raW5kX29mPyBTdHJpbmcpCisgICAgICAgIGNoX3ZhbHVlID0gY2guYnl0ZXMuZmlyc3QKKyAgICAgIGVuZAorICAgICAgdHJhbnMud3JpdGUoY2hfdmFsdWUudG9fcygxNikucmp1c3QoNCwnMCcpKQorICAgIGVuZAorCisgICAgIyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIHBhcnQgb2YgYSBKU09OIHN0cmluZywgZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUuCisgICAgZGVmIHdyaXRlX2pzb25fY2hhcihjaCkKKyAgICAgICMgVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGhhbmRsaW5nIGZvciB0aGUgZmlyc3QgMHgzMCBjaGFyYWN0ZXJzCisgICAgICAjIDAgOiBlc2NhcGUgdXNpbmcgIlx1MDB4eCIgbm90YXRpb24KKyAgICAgICMgMSA6IGp1c3Qgb3V0cHV0IGluZGV4CisgICAgICAjIDxvdGhlcj4gOiBlc2NhcGUgdXNpbmcgIlw8b3RoZXI+IiBub3RhdGlvbgorICAgICAga0pTT05DaGFyVGFibGUgPSBbCisgICAgICAgICAgIyAwIDEgMiAzIDQgNSA2IDcgOCA5IEEgQiBDIEQgRSBGCisgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwnYicsJ3QnLCduJywgMCwnZicsJ3InLCAwLCAwLCAjIDAKKyAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAjIDEKKyAgICAgICAgICAxLCAxLCciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIyAyCisgICAgICBdCisKKyAgICAgIGNoX3ZhbHVlID0gY2hbMF0KKyAgICAgIGlmIChjaF92YWx1ZS5raW5kX29mPyBTdHJpbmcpCisgICAgICAgIGNoX3ZhbHVlID0gY2guYnl0ZXMuZmlyc3QKKyAgICAgIGVuZAorICAgICAgaWYgKGNoX3ZhbHVlID49IDB4MzApCisgICAgICAgIGlmIChjaCA9PSBAQGtKU09OQmFja3NsYXNoKSAjIE9ubHkgc3BlY2lhbCBjaGFyYWN0ZXIgPj0gMHgzMCBpcyAnXCcKKyAgICAgICAgICB0cmFucy53cml0ZShAQGtKU09OQmFja3NsYXNoKQorICAgICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05CYWNrc2xhc2gpCisgICAgICAgIGVsc2UKKyAgICAgICAgICB0cmFucy53cml0ZShjaCkKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIG91dENoID0ga0pTT05DaGFyVGFibGVbY2hfdmFsdWVdOworICAgICAgICAjIENoZWNrIGlmIHJlZ3VsYXIgY2hhcmFjdGVyLCBiYWNrc2xhc2ggZXNjYXBlZCwgb3IgSlNPTiBlc2NhcGVkCisgICAgICAgIGlmIG91dENoLmtpbmRfb2Y/IFN0cmluZworICAgICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05CYWNrc2xhc2gpCisgICAgICAgICAgdHJhbnMud3JpdGUob3V0Q2gpCisgICAgICAgIGVsc2lmIG91dENoID09IDEKKyAgICAgICAgICB0cmFucy53cml0ZShjaCkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdyaXRlX2pzb25fZXNjYXBlX2NoYXIoY2gpCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIFdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBzdHIgYXMgYSBKU09OIHN0cmluZywgZXNjYXBpbmcgY2hhcmFjdGVycyBhcyBhcHByb3ByaWF0ZS4KKyAgICBkZWYgd3JpdGVfanNvbl9zdHJpbmcoc3RyKQorICAgICAgQGNvbnRleHQud3JpdGUodHJhbnMpCisgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgc3RyLnNwbGl0KCcnKS5lYWNoIGRvIHxjaHwKKyAgICAgICAgd3JpdGVfanNvbl9jaGFyKGNoKQorICAgICAgZW5kCisgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgIGVuZAorCisgICAgIyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgYXMgSlNPTiBzdHJpbmcsIGJhc2U2NC1lbmNvZGluZworICAgICMgdGhlIHN0cmluZydzIGNvbnRlbnRzLCBhbmQgZXNjYXBpbmcgYXMgYXBwcm9wcmlhdGUKKyAgICBkZWYgd3JpdGVfanNvbl9iYXNlNjQoc3RyKQorICAgICAgQGNvbnRleHQud3JpdGUodHJhbnMpCisgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgdHJhbnMud3JpdGUoQmFzZTY0LnN0cmljdF9lbmNvZGU2NChzdHIpKQorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICBlbmQKKworICAgICMgQ29udmVydCB0aGUgZ2l2ZW4gaW50ZWdlciB0eXBlIHRvIGEgSlNPTiBudW1iZXIsIG9yIGEgc3RyaW5nCisgICAgIyBpZiB0aGUgY29udGV4dCByZXF1aXJlcyBpdCAoZWc6IGtleSBpbiBhIG1hcCBwYWlyKS4KKyAgICBkZWYgd3JpdGVfanNvbl9pbnRlZ2VyKG51bSkKKyAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQorICAgICAgZXNjYXBlTnVtID0gQGNvbnRleHQuZXNjYXBlTnVtCisgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgZW5kCisgICAgICB0cmFucy53cml0ZShudW0udG9fcyk7CisgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIENvbnZlcnQgdGhlIGdpdmVuIGRvdWJsZSB0byBhIEpTT04gc3RyaW5nLCB3aGljaCBpcyBlaXRoZXIgdGhlIG51bWJlciwKKyAgICAjICJOYU4iIG9yICJJbmZpbml0eSIgb3IgIi1JbmZpbml0eSIuCisgICAgZGVmIHdyaXRlX2pzb25fZG91YmxlKG51bSkKKyAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQorICAgICAgIyBOb3JtYWxpemUgb3V0cHV0IG9mIHRocmlmdDo6dG9fc3RyaW5nIGZvciBOYU5zIGFuZCBJbmZpbml0aWVzCisgICAgICBzcGVjaWFsID0gZmFsc2U7CisgICAgICBpZiAobnVtLm5hbj8pCisgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICB2YWwgPSBAQGtUaHJpZnROYW47CisgICAgICBlbHNpZiAobnVtLmluZmluaXRlPykKKyAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgIHZhbCA9IEBAa1RocmlmdEluZmluaXR5OworICAgICAgICBpZiAobnVtIDwgMC4wKQorICAgICAgICAgIHZhbCA9IEBAa1RocmlmdE5lZ2F0aXZlSW5maW5pdHk7CisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICB2YWwgPSBudW0udG9fcworICAgICAgZW5kCisKKyAgICAgIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgQGNvbnRleHQuZXNjYXBlTnVtCisgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgZW5kCisgICAgICB0cmFucy53cml0ZSh2YWwpCisgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfanNvbl9vYmplY3Rfc3RhcnQKKyAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQorICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTk9iamVjdFN0YXJ0KQorICAgICAgcHVzaF9jb250ZXh0KEpTT05QYWlyQ29udGV4dC5uZXcpOworICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2pzb25fb2JqZWN0X2VuZAorICAgICAgcG9wX2NvbnRleHQKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05PYmplY3RFbmQpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfanNvbl9hcnJheV9zdGFydAorICAgICAgQGNvbnRleHQud3JpdGUodHJhbnMpCisgICAgICB0cmFucy53cml0ZShAQGtKU09OQXJyYXlTdGFydCkKKyAgICAgIHB1c2hfY29udGV4dChKU09OTGlzdENvbnRleHQubmV3KTsKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9qc29uX2FycmF5X2VuZAorICAgICAgcG9wX2NvbnRleHQKKyAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05BcnJheUVuZCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgICAgd3JpdGVfanNvbl9hcnJheV9zdGFydAorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKEBAa1RocmlmdFZlcnNpb24xKQorICAgICAgd3JpdGVfanNvbl9zdHJpbmcobmFtZSkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcih0eXBlKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKHNlcWlkKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfZW5kCisgICAgICB3cml0ZV9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3N0cnVjdF9iZWdpbihuYW1lKQorICAgICAgd3JpdGVfanNvbl9vYmplY3Rfc3RhcnQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJ1Y3RfZW5kCisgICAgICB3cml0ZV9qc29uX29iamVjdF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9maWVsZF9iZWdpbihuYW1lLCB0eXBlLCBpZCkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihpZCkKKyAgICAgIHdyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICB3cml0ZV9qc29uX3N0cmluZyhnZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKHR5cGUpKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX2VuZAorICAgICAgd3JpdGVfanNvbl9vYmplY3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfc3RvcDsgbmlsOyBlbmQKKworICAgIGRlZiB3cml0ZV9tYXBfYmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgICAgd3JpdGVfanNvbl9hcnJheV9zdGFydAorICAgICAgd3JpdGVfanNvbl9zdHJpbmcoZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChrdHlwZSkpCisgICAgICB3cml0ZV9qc29uX3N0cmluZyhnZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKHZ0eXBlKSkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihzaXplKQorICAgICAgd3JpdGVfanNvbl9vYmplY3Rfc3RhcnQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tYXBfZW5kCisgICAgICB3cml0ZV9qc29uX29iamVjdF9lbmQKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbGlzdF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIHdyaXRlX2pzb25fc3RyaW5nKGdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoZXR5cGUpKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKHNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbGlzdF9lbmQKKyAgICAgIHdyaXRlX2pzb25fYXJyYXlfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc2V0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgICAgd3JpdGVfanNvbl9hcnJheV9zdGFydAorICAgICAgd3JpdGVfanNvbl9zdHJpbmcoZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChldHlwZSkpCisgICAgICB3cml0ZV9qc29uX2ludGVnZXIoc2l6ZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zZXRfZW5kCisgICAgICB3cml0ZV9qc29uX2FycmF5X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2Jvb2woYm9vbCkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihib29sID8gMSA6IDApCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYnl0ZShieXRlKQorICAgICAgd3JpdGVfanNvbl9pbnRlZ2VyKGJ5dGUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfaTE2KGkxNikKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihpMTYpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfaTMyKGkzMikKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihpMzIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfaTY0KGk2NCkKKyAgICAgIHdyaXRlX2pzb25faW50ZWdlcihpNjQpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZG91YmxlKGR1YikKKyAgICAgIHdyaXRlX2pzb25fZG91YmxlKGR1YikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJpbmcoc3RyKQorICAgICAgd3JpdGVfanNvbl9zdHJpbmcoc3RyKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2JpbmFyeShzdHIpCisgICAgICB3cml0ZV9qc29uX2Jhc2U2NChzdHIpCisgICAgZW5kCisKKyAgICAjIworICAgICMgUmVhZGluZyBmdW5jdGlvbnMKKyAgICAjIworCisgICAgIyBSZWFkcyAxIGJ5dGUgYW5kIHZlcmlmaWVzIHRoYXQgaXQgbWF0Y2hlcyBjaC4KKyAgICBkZWYgcmVhZF9qc29uX3N5bnRheF9jaGFyKGNoKQorICAgICAgSnNvblByb3RvY29sOjpyZWFkX3N5bnRheF9jaGFyKEByZWFkZXIsIGNoKQorICAgIGVuZAorCisgICAgIyBEZWNvZGVzIHRoZSBmb3VyIGhleCBwYXJ0cyBvZiBhIEpTT04gZXNjYXBlZCBzdHJpbmcgY2hhcmFjdGVyIGFuZCByZXR1cm5zCisgICAgIyB0aGUgY2hhcmFjdGVyIHZpYSBvdXQuCisgICAgIworICAgICMgTm90ZSAtIHRoaXMgb25seSBzdXBwb3J0cyBVbmljb2RlIGNoYXJhY3RlcnMgaW4gdGhlIEJNUCAoVSswMDAwIHRvIFUrRkZGRik7CisgICAgIyBjaGFyYWN0ZXJzIGFib3ZlIHRoZSBCTVAgYXJlIGVuY29kZWQgYXMgdHdvIGVzY2FwZSBzZXF1ZW5jZXMgKHN1cnJvZ2F0ZSBwYWlycyksCisgICAgIyB3aGljaCBpcyBub3QgeWV0IGltcGxlbWVudGVkCisgICAgZGVmIHJlYWRfanNvbl9lc2NhcGVfY2hhcgorICAgICAgc3RyID0gQHJlYWRlci5yZWFkCisgICAgICBzdHIgKz0gQHJlYWRlci5yZWFkCisgICAgICBzdHIgKz0gQHJlYWRlci5yZWFkCisgICAgICBzdHIgKz0gQHJlYWRlci5yZWFkCisgICAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICAgICAgc3RyLmhleC5jaHIoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZWxzZQorICAgICAgICBzdHIuaGV4LmNocgorICAgICAgZW5kCisgICAgZW5kCisKKyAgICAjIERlY29kZXMgYSBKU09OIHN0cmluZywgaW5jbHVkaW5nIHVuZXNjYXBpbmcsIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgdmlhIHN0cgorICAgIGRlZiByZWFkX2pzb25fc3RyaW5nKHNraXBDb250ZXh0ID0gZmFsc2UpCisgICAgICAjIFRoaXMgc3RyaW5nJ3MgY2hhcmFjdGVycyBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIGVsZW1lbnRzIGluIGVzY2FwZV9jaGFyX3ZhbHMuCisgICAgICAjIEkgZG9uJ3QgaGF2ZSAnLycgb24gdGhpcyBsaXN0IGV2ZW4gdGhvdWdoIGl0IGFwcGVhcnMgb24gd3d3Lmpzb24ub3JnIC0tCisgICAgICAjIGl0IGlzIG5vdCBpbiB0aGUgUkZDIC0+IGl0IGlzLiBTZWUgUkZDIDQ2MjcKKyAgICAgIGVzY2FwZV9jaGFycyA9ICJcIlxcL2JmbnJ0IgorCisgICAgICAjIFRoZSBlbGVtZW50cyBvZiB0aGlzIGFycmF5IG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbgorICAgICAgIyBlc2NhcGVfY2hhcnMKKyAgICAgIGVzY2FwZV9jaGFyX3ZhbHMgPSBbCisgICAgICAgICJcIiIsICJcXCIsICJcLyIsICJcYiIsICJcZiIsICJcbiIsICJcciIsICJcdCIsCisgICAgICBdCisKKyAgICAgIGlmICFza2lwQ29udGV4dAorICAgICAgICBAY29udGV4dC5yZWFkKEByZWFkZXIpCisgICAgICBlbmQKKyAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgY2ggPSAiIgorICAgICAgc3RyID0gIiIKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICBjaCA9IEByZWFkZXIucmVhZAorICAgICAgICBpZiAoY2ggPT0gQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKKyAgICAgICAgICBicmVhaworICAgICAgICBlbmQKKyAgICAgICAgaWYgKGNoID09IEBAa0pTT05CYWNrc2xhc2gpCisgICAgICAgICAgY2ggPSBAcmVhZGVyLnJlYWQKKyAgICAgICAgICBpZiAoY2ggPT0gJ3UnKQorICAgICAgICAgICAgY2ggPSByZWFkX2pzb25fZXNjYXBlX2NoYXIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwb3MgPSBlc2NhcGVfY2hhcnMuaW5kZXgoY2gpOworICAgICAgICAgICAgaWYgKHBvcy5uaWw/KSAjIG5vdCBmb3VuZAorICAgICAgICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciwgZ290IFwnI3tjaH1cJy4iKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBjaCA9IGVzY2FwZV9jaGFyX3ZhbHNbcG9zXQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgc3RyICs9IGNoCisgICAgICBlbmQKKyAgICAgIHJldHVybiBzdHIKKyAgICBlbmQKKworICAgICMgUmVhZHMgYSBibG9jayBvZiBiYXNlNjQgY2hhcmFjdGVycywgZGVjb2RpbmcgaXQsIGFuZCByZXR1cm5zIHZpYSBzdHIKKyAgICBkZWYgcmVhZF9qc29uX2Jhc2U2NAorICAgICAgc3RyID0gcmVhZF9qc29uX3N0cmluZworICAgICAgbSA9IHN0ci5sZW5ndGggJSA0CisgICAgICBpZiBtICE9IDAKKyAgICAgICAgIyBBZGQgbWlzc2luZyBwYWRkaW5nCisgICAgICAgICg0IC0gbSkudGltZXMgZG8KKyAgICAgICAgICBzdHIgKz0gJz0nCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBCYXNlNjQuc3RyaWN0X2RlY29kZTY0KHN0cikKKyAgICBlbmQKKworICAgICMgUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCBzdG9wcGluZyBhdCB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgbm90CisgICAgIyBhIHZhbGlkIEpTT04gbnVtZXJpYyBjaGFyYWN0ZXIuCisgICAgZGVmIHJlYWRfanNvbl9udW1lcmljX2NoYXJzCisgICAgICBzdHIgPSAiIgorICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIGNoID0gQHJlYWRlci5wZWVrCisgICAgICAgIGlmICghaXNfanNvbl9udW1lcmljKGNoKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZW5kCisgICAgICAgIGNoID0gQHJlYWRlci5yZWFkCisgICAgICAgIHN0ciArPSBjaAorICAgICAgZW5kCisgICAgICByZXR1cm4gc3RyCisgICAgZW5kCisKKyAgICAjIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhbmQgYXNzZW1ibGVzIHRoZW0gaW50byBhIG51bWJlciwKKyAgICAjIHJldHVybmluZyB0aGVtIHZpYSBudW0KKyAgICBkZWYgcmVhZF9qc29uX2ludGVnZXIKKyAgICAgIEBjb250ZXh0LnJlYWQoQHJlYWRlcikKKyAgICAgIGlmIChAY29udGV4dC5lc2NhcGVOdW0pCisgICAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgZW5kCisgICAgICBzdHIgPSByZWFkX2pzb25fbnVtZXJpY19jaGFycworCisgICAgICBiZWdpbgorICAgICAgICBudW0gPSBJbnRlZ2VyKHN0cik7CisgICAgICByZXNjdWUKKyAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIje3N0cn1cIiIpCisgICAgICBlbmQKKworICAgICAgaWYgKEBjb250ZXh0LmVzY2FwZU51bSkKKyAgICAgICAgcmVhZF9qc29uX3N5bnRheF9jaGFyKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCisgICAgICBlbmQKKworICAgICAgcmV0dXJuIG51bQorICAgIGVuZAorCisgICAgIyBSZWFkcyBhIEpTT04gbnVtYmVyIG9yIHN0cmluZyBhbmQgaW50ZXJwcmV0cyBpdCBhcyBhIGRvdWJsZS4KKyAgICBkZWYgcmVhZF9qc29uX2RvdWJsZQorICAgICAgQGNvbnRleHQucmVhZChAcmVhZGVyKQorICAgICAgbnVtID0gMAorICAgICAgaWYgKEByZWFkZXIucGVlayA9PSBAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgICBzdHIgPSByZWFkX2pzb25fc3RyaW5nKHRydWUpCisgICAgICAgICMgQ2hlY2sgZm9yIE5hTiwgSW5maW5pdHkgYW5kIC1JbmZpbml0eQorICAgICAgICBpZiAoc3RyID09IEBAa1RocmlmdE5hbikKKyAgICAgICAgICBudW0gPSAoKzEuMC8wLjApLygrMS4wLzAuMCkKKyAgICAgICAgZWxzaWYgKHN0ciA9PSBAQGtUaHJpZnRJbmZpbml0eSkKKyAgICAgICAgICBudW0gPSArMS4wLzAuMAorICAgICAgICBlbHNpZiAoc3RyID09IEBAa1RocmlmdE5lZ2F0aXZlSW5maW5pdHkpCisgICAgICAgICAgbnVtID0gLTEuMC8wLjAKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmICghQGNvbnRleHQuZXNjYXBlTnVtKQorICAgICAgICAgICAgIyBSYWlzZSBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKQorICAgICAgICAgIGVuZAorICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICBudW0gPSBGbG9hdChzdHIpCisgICAgICAgICAgcmVzY3VlCisgICAgICAgICAgICByYWlzZSBQcm90b2NvbEV4Y2VwdGlvbi5uZXcoUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiN7c3RyfVwiIikKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIGlmIChAY29udGV4dC5lc2NhcGVOdW0pCisgICAgICAgICAgIyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQorICAgICAgICBlbmQKKyAgICAgICAgc3RyID0gcmVhZF9qc29uX251bWVyaWNfY2hhcnMKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBudW0gPSBGbG9hdChzdHIpCisgICAgICAgIHJlc2N1ZQorICAgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiI3tzdHJ9XCIiKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIG51bQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfanNvbl9vYmplY3Rfc3RhcnQKKyAgICAgIEBjb250ZXh0LnJlYWQoQHJlYWRlcikKKyAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OT2JqZWN0U3RhcnQpCisgICAgICBwdXNoX2NvbnRleHQoSlNPTlBhaXJDb250ZXh0Lm5ldykKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfanNvbl9vYmplY3RfZW5kCisgICAgICByZWFkX2pzb25fc3ludGF4X2NoYXIoQEBrSlNPTk9iamVjdEVuZCkKKyAgICAgIHBvcF9jb250ZXh0CisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIEBjb250ZXh0LnJlYWQoQHJlYWRlcikKKyAgICAgIHJlYWRfanNvbl9zeW50YXhfY2hhcihAQGtKU09OQXJyYXlTdGFydCkKKyAgICAgIHB1c2hfY29udGV4dChKU09OTGlzdENvbnRleHQubmV3KQorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9qc29uX2FycmF5X2VuZAorICAgICAgcmVhZF9qc29uX3N5bnRheF9jaGFyKEBAa0pTT05BcnJheUVuZCkKKyAgICAgIHBvcF9jb250ZXh0CisgICAgICBuaWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX21lc3NhZ2VfYmVnaW4KKyAgICAgIHJlYWRfanNvbl9hcnJheV9zdGFydAorICAgICAgdmVyc2lvbiA9IHJlYWRfanNvbl9pbnRlZ2VyCisgICAgICBpZiAodmVyc2lvbiAhPSBAQGtUaHJpZnRWZXJzaW9uMSkKKyAgICAgICAgcmFpc2UgUHJvdG9jb2xFeGNlcHRpb24ubmV3KFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgJ01lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLicpCisgICAgICBlbmQKKyAgICAgIG5hbWUgPSByZWFkX2pzb25fc3RyaW5nCisgICAgICBtZXNzYWdlX3R5cGUgPSByZWFkX2pzb25faW50ZWdlcgorICAgICAgc2VxaWQgPSByZWFkX2pzb25faW50ZWdlcgorICAgICAgW25hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxaWRdCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tZXNzYWdlX2VuZAorICAgICAgcmVhZF9qc29uX2FycmF5X2VuZAorICAgICAgbmlsCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJ1Y3RfYmVnaW4KKyAgICAgIHJlYWRfanNvbl9vYmplY3Rfc3RhcnQKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc3RydWN0X2VuZAorICAgICAgcmVhZF9qc29uX29iamVjdF9lbmQKKyAgICAgIG5pbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZmllbGRfYmVnaW4KKyAgICAgICMgQ2hlY2sgaWYgd2UgaGl0IHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICAgIGNoID0gQHJlYWRlci5wZWVrCisgICAgICBpZiAoY2ggPT0gQEBrSlNPTk9iamVjdEVuZCkKKyAgICAgICAgZmllbGRfdHlwZSA9IFR5cGVzOjpTVE9QCisgICAgICBlbHNlCisgICAgICAgIGZpZWxkX2lkID0gcmVhZF9qc29uX2ludGVnZXIKKyAgICAgICAgcmVhZF9qc29uX29iamVjdF9zdGFydAorICAgICAgICBmaWVsZF90eXBlID0gZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZShyZWFkX2pzb25fc3RyaW5nKQorICAgICAgZW5kCisgICAgICBbbmlsLCBmaWVsZF90eXBlLCBmaWVsZF9pZF0KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2ZpZWxkX2VuZAorICAgICAgcmVhZF9qc29uX29iamVjdF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX21hcF9iZWdpbgorICAgICAgcmVhZF9qc29uX2FycmF5X3N0YXJ0CisgICAgICBrZXlfdHlwZSA9IGdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUocmVhZF9qc29uX3N0cmluZykKKyAgICAgIHZhbF90eXBlID0gZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZShyZWFkX2pzb25fc3RyaW5nKQorICAgICAgc2l6ZSA9IHJlYWRfanNvbl9pbnRlZ2VyCisgICAgICByZWFkX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBba2V5X3R5cGUsIHZhbF90eXBlLCBzaXplXQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWFwX2VuZAorICAgICAgcmVhZF9qc29uX29iamVjdF9lbmQKKyAgICAgIHJlYWRfanNvbl9hcnJheV9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2xpc3RfYmVnaW4KKyAgICAgIHJlYWRfanNvbl9hcnJheV9zdGFydAorICAgICAgW2dldF90eXBlX2lkX2Zvcl90eXBlX25hbWUocmVhZF9qc29uX3N0cmluZyksIHJlYWRfanNvbl9pbnRlZ2VyXQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbGlzdF9lbmQKKyAgICAgIHJlYWRfanNvbl9hcnJheV9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3NldF9iZWdpbgorICAgICAgcmVhZF9qc29uX2FycmF5X3N0YXJ0CisgICAgICBbZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZShyZWFkX2pzb25fc3RyaW5nKSwgcmVhZF9qc29uX2ludGVnZXJdCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zZXRfZW5kCisgICAgICByZWFkX2pzb25fYXJyYXlfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9ib29sCisgICAgICBieXRlID0gcmVhZF9ieXRlCisgICAgICBieXRlICE9IDAKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2J5dGUKKyAgICAgIHJlYWRfanNvbl9pbnRlZ2VyCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pMTYKKyAgICAgIHJlYWRfanNvbl9pbnRlZ2VyCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pMzIKKyAgICAgIHJlYWRfanNvbl9pbnRlZ2VyCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pNjQKKyAgICAgIHJlYWRfanNvbl9pbnRlZ2VyCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9kb3VibGUKKyAgICAgIHJlYWRfanNvbl9kb3VibGUKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3N0cmluZworICAgICAgcmVhZF9qc29uX3N0cmluZworICAgIGVuZAorCisgICAgZGVmIHJlYWRfYmluYXJ5CisgICAgICByZWFkX2pzb25fYmFzZTY0CisgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImpzb24oI3tzdXBlci50b19zfSkiCisgICAgZW5kCisgIGVuZAorCisgIGNsYXNzIEpzb25Qcm90b2NvbEZhY3RvcnkgPCBCYXNlUHJvdG9jb2xGYWN0b3J5CisgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKKyAgICAgIHJldHVybiBUaHJpZnQ6Okpzb25Qcm90b2NvbC5uZXcodHJhbnMpCisgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImpzb24iCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL211bHRpcGxleGVkX3Byb3RvY29sLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDI4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYgpAQCAtMCwwICsxLDQ0IEBACisjIAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvcicKKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBNdWx0aXBsZXhlZFByb3RvY29sIDwgQmFzZVByb3RvY29sCisKKyAgICBpbmNsdWRlIFByb3RvY29sRGVjb3JhdG9yCisKKyAgICBkZWYgaW5pdGlhbGl6ZShwcm90b2NvbCwgc2VydmljZV9uYW1lKQorICAgICAgc3VwZXIocHJvdG9jb2wpCisgICAgICBAc2VydmljZV9uYW1lID0gc2VydmljZV9uYW1lCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICAgIGNhc2UgdHlwZQorICAgICAgd2hlbiBNZXNzYWdlVHlwZXM6OkNBTEwsIE1lc3NhZ2VUeXBlczo6T05FV0FZCisgICAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luKCIje0BzZXJ2aWNlX25hbWV9OiN7bmFtZX0iLCB0eXBlLCBzZXFpZCkKKyAgICAgIGVsc2UKKyAgICAgICAgQHByb3RvY29sLndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICBlbmQgCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJtdWx0aXBsZXhlZCgje0BzZXJ2aWNlX25hbWU9QHByb3RvY29sLnRvX3N9KSIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWUzYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvcHJvdG9jb2xfZGVjb3JhdG9yLnJiCkBAIC0wLDAgKzEsMTk0IEBACisjIAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbW9kdWxlIFRocmlmdAorICBtb2R1bGUgUHJvdG9jb2xEZWNvcmF0b3IKKworICAgIGRlZiBpbml0aWFsaXplKHByb3RvY29sKQorICAgICAgQHByb3RvY29sID0gcHJvdG9jb2wKKyAgICBlbmQKKworICAgIGRlZiB0cmFucworICAgICAgQHByb3RvY29sLnRyYW5zCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWVzc2FnZV9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3N0cnVjdF9iZWdpbihuYW1lKQorICAgICAgQHByb3RvY29sLndyaXRlX3N0cnVjdF9iZWdpbihuYW1lKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3N0cnVjdF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zdHJ1Y3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfYmVnaW4obmFtZSwgdHlwZSwgaWQpCisgICAgICBAcHJvdG9jb2wud3JpdGVfZmllbGRfYmVnaW4obmFtZSwgdHlwZSwgaWQpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfZmllbGRfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZmllbGRfc3RvcAorICAgICAgQHByb3RvY29sLndyaXRlX2ZpZWxkX3N0b3AKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9tYXBfYmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgICAgQHByb3RvY29sLndyaXRlX21hcF9iZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWFwX2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX21hcF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9saXN0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgICAgQHByb3RvY29sLndyaXRlX2xpc3RfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbGlzdF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9saXN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3NldF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zZXRfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfc2V0X2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX3NldF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9ib29sKGJvb2wpCisgICAgICBAcHJvdG9jb2wud3JpdGVfYm9vbChib29sKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2J5dGUoYnl0ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9ieXRlKGJ5dGUpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfaTE2KGkxNikKKyAgICAgIEBwcm90b2NvbC53cml0ZV9pMTYoaTE2KQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2kzMihpMzIpCisgICAgICBAcHJvdG9jb2wud3JpdGVfaTMyKGkzMikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9pNjQoaTY0KQorICAgICAgQHByb3RvY29sLndyaXRlX2k2NChpNjQpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfZG91YmxlKGR1YikKKyAgICAgIEBwcm90b2NvbC53cml0ZV9kb3VibGUoZHViKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3N0cmluZyhzdHIpCisgICAgICBAcHJvdG9jb2wud3JpdGVfc3RyaW5nKHN0cikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9iaW5hcnkoYnVmKQorICAgICAgQHByb3RvY29sLndyaXRlX2JpbmFyeShidWYpCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tZXNzYWdlX2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9tZXNzYWdlX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tZXNzYWdlX2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfbWVzc2FnZV9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3N0cnVjdF9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfc3RydWN0X2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJ1Y3RfZW5kCisgICAgICBAcHJvdG9jb2wucmVhZF9zdHJ1Y3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9maWVsZF9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfZmllbGRfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2ZpZWxkX2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfZmllbGRfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tYXBfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX21hcF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWFwX2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfbWFwX2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbGlzdF9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfbGlzdF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbGlzdF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX2xpc3RfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zZXRfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX3NldF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc2V0X2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfc2V0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfYm9vbAorICAgICAgQHByb3RvY29sLnJlYWRfYm9vbAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfYnl0ZQorICAgICAgQHByb3RvY29sLnJlYWRfYnl0ZQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTE2CisgICAgICBAcHJvdG9jb2wucmVhZF9pMTYKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2kzMgorICAgICAgQHByb3RvY29sLnJlYWRfaTMyCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pNjQKKyAgICAgIEBwcm90b2NvbC5yZWFkX2k2NAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZG91YmxlCisgICAgICBAcHJvdG9jb2wucmVhZF9kb3VibGUKKyAgICBlbmQKKworICAgIGRlZiByZWFkX3N0cmluZworICAgICAgQHByb3RvY29sLnJlYWRfc3RyaW5nCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9iaW5hcnkKKyAgICAgIEBwcm90b2NvbC5yZWFkX2JpbmFyeQorICAgIGVuZAorICBlbmQKK2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgppbmRleCAxZWUxMjEzLi5hYTRkMDljIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiCkBAIC0yNiw2ICsyNiwxMiBAQAogICAgICAgQHByb3RvY29sX2ZhY3RvcnkgPSBwcm90b2NvbF9mYWN0b3J5ID8gcHJvdG9jb2xfZmFjdG9yeSA6IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldwogICAgIGVuZAogCi0gICAgZGVmIHNlcnZlOyBuaWw7IGVuZAorICAgIGRlZiBzZXJ2ZQorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJzZXJ2ZXIoI3tAcHJvdG9jb2xfZmFjdG9yeS50b19zfSgje0B0cmFuc3BvcnRfZmFjdG9yeS50b19zfSgje0BzZXJ2ZXJfdHJhbnNwb3J0LnRvX3N9KSkpIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvbW9uZ3JlbF9odHRwX3NlcnZlci5yYgppbmRleCA4NGVhY2YwLi5kZTM1NGM4IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvbW9uZ3JlbF9odHRwX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvbW9uZ3JlbF9odHRwX3NlcnZlci5yYgpAQCAtMjAsNiArMjAsNyBAQAogcmVxdWlyZSAnbW9uZ3JlbCcKIAogIyMgU3RpY2tzIGEgc2VydmljZSBvbiBhIFVSTCwgdXNpbmcgbW9uZ3JlbCB0byBkbyB0aGUgSFRUUCB3b3JrCisjIDxiPkRFUFJFQ0FURUQ6PC9iPiBQbGVhc2UgdXNlIDx0dD5UaHJpZnQ6OlRoaW5IVFRQU2VydmVyPC90dD4gaW5zdGVhZC4KIG1vZHVsZSBUaHJpZnQKICAgY2xhc3MgTW9uZ3JlbEhUVFBTZXJ2ZXIgPCBCYXNlU2VydmVyCiAgICAgY2xhc3MgSGFuZGxlciA8IE1vbmdyZWw6Okh0dHBIYW5kbGVyCkBAIC00Myw2ICs0NCw3IEBACiAgICAgZW5kCiAKICAgICBkZWYgaW5pdGlhbGl6ZShwcm9jZXNzb3IsIG9wdHM9e30pCisgICAgICBLZXJuZWwud2FybiAiW0RFUFJFQ0FUSU9OIFdBUk5JTkddIGBUaHJpZnQ6Ok1vbmdyZWxIVFRQU2VydmVyYCBpcyBkZXByZWNhdGVkLiAgUGxlYXNlIHVzZSBgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcmAgaW5zdGVhZC4iCiAgICAgICBwb3J0ID0gb3B0c1s6cG9ydF0gfHwgODAKICAgICAgIGlwID0gb3B0c1s6aXBdIHx8ICIwLjAuMC4wIgogICAgICAgcGF0aCA9IG9wdHNbOnBhdGhdIHx8ICIiCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmdfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nX3NlcnZlci5yYgppbmRleCA5ZTFjZmU2Li43NDBmMzQxIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmdfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZ19zZXJ2ZXIucmIKQEAgLTQ0LDcgKzQ0LDEzIEBACiAgICAgICBiZWdpbgogICAgICAgICBsb29wIGRvCiAgICAgICAgICAgYnJlYWsgaWYgQHNlcnZlcl90cmFuc3BvcnQuY2xvc2VkPwotICAgICAgICAgIHJkLCA9IHNlbGVjdChbQHNlcnZlcl90cmFuc3BvcnRdLCBuaWwsIG5pbCwgMC4xKQorICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICByZCwgPSBzZWxlY3QoW0BzZXJ2ZXJfdHJhbnNwb3J0XSwgbmlsLCBuaWwsIDAuMSkKKyAgICAgICAgICByZXNjdWUgRXJybm86OkVCQURGID0+IGUKKyAgICAgICAgICAgICMgSW4gUnVieSAxLjksIGNhbGxpbmcgQHNlcnZlcl90cmFuc3BvcnQuY2xvc2UgaW4gc2h1dGRvd24gcGF0aHMgY2F1c2VzIHRoZSBzZWxlY3QoKSB0byByYWlzZSBhbgorICAgICAgICAgICAgIyBFcnJubzo6RUJBREYuIElmIHRoaXMgaGFwcGVucywgaWdub3JlIGl0IGFuZCByZXRyeSB0aGUgbG9vcC4KKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgZW5kCiAgICAgICAgICAgbmV4dCBpZiByZC5uaWw/CiAgICAgICAgICAgc29ja2V0ID0gQHNlcnZlcl90cmFuc3BvcnQuYWNjZXB0CiAgICAgICAgICAgQGxvZ2dlci5kZWJ1ZyAiQWNjZXB0ZWQgc29ja2V0OiAje3NvY2tldC5pbnNwZWN0fSIKQEAgLTE0NiwxMCArMTUyLDE0IEBACiAgICAgICAgICAgICBicmVhayBpZiByZWFkX3NpZ25hbHMgPT0gOnNodXRkb3duCiAgICAgICAgICAgZW5kCiAgICAgICAgICAgcmQuZWFjaCBkbyB8ZmR8Ci0gICAgICAgICAgICBpZiBmZC5oYW5kbGUuZW9mPworICAgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgICAgaWYgZmQuaGFuZGxlLmVvZj8KKyAgICAgICAgICAgICAgICByZW1vdmVfY29ubmVjdGlvbiBmZAorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVhZF9jb25uZWN0aW9uIGZkCisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgcmVzY3VlIEVycm5vOjpFQ09OTlJFU0VUCiAgICAgICAgICAgICAgIHJlbW92ZV9jb25uZWN0aW9uIGZkCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHJlYWRfY29ubmVjdGlvbiBmZAogICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCiAgICAgICAgIGVuZApAQCAtMjkyLDQgKzMwMiw0IEBACiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIKaW5kZXggMjFlODY1OS4uOTA1ZmU5YiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIKQEAgLTM5LDUgKzM5LDkgQEAKICAgICAgICAgQHNlcnZlcl90cmFuc3BvcnQuY2xvc2UKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAic2ltcGxlKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RoaW5faHR0cF9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhpbl9odHRwX3NlcnZlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTgxYzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RoaW5faHR0cF9zZXJ2ZXIucmIKQEAgLTAsMCArMSw5MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3JhY2snCityZXF1aXJlICd0aGluJworCisjIworIyBXcmFwcyB0aGUgVGhpbiB3ZWIgc2VydmVyIHRvIHByb3ZpZGUgYSBUaHJpZnQgc2VydmVyIG92ZXIgSFRUUC4KK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgVGhpbkhUVFBTZXJ2ZXIgPCBCYXNlU2VydmVyCisKKyAgICAjIworICAgICMgQWNjZXB0cyBhIFRocmlmdDo6UHJvY2Vzc29yCisgICAgIyBPcHRpb25zIGluY2x1ZGU6CisgICAgIyAqIDpwb3J0CisgICAgIyAqIDppcAorICAgICMgKiA6cGF0aAorICAgICMgKiA6cHJvdG9jb2xfZmFjdG9yeQorICAgIGRlZiBpbml0aWFsaXplKHByb2Nlc3Nvciwgb3B0aW9ucz17fSkKKyAgICAgIHBvcnQgPSBvcHRpb25zWzpwb3J0XSB8fCA4MAorICAgICAgaXAgPSBvcHRpb25zWzppcF0gfHwgIjAuMC4wLjAiCisgICAgICBwYXRoID0gb3B0aW9uc1s6cGF0aF0gfHwgIi8iCisgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gb3B0aW9uc1s6cHJvdG9jb2xfZmFjdG9yeV0gfHwgQmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldworICAgICAgYXBwID0gUmFja0FwcGxpY2F0aW9uLmZvcihwYXRoLCBwcm9jZXNzb3IsIHByb3RvY29sX2ZhY3RvcnkpCisgICAgICBAc2VydmVyID0gVGhpbjo6U2VydmVyLm5ldyhpcCwgcG9ydCwgYXBwKQorICAgIGVuZAorCisgICAgIyMKKyAgICAjIFN0YXJ0cyB0aGUgc2VydmVyCisgICAgZGVmIHNlcnZlCisgICAgICBAc2VydmVyLnN0YXJ0CisgICAgZW5kCisKKyAgICBjbGFzcyBSYWNrQXBwbGljYXRpb24KKworICAgICAgVEhSSUZUX0hFQURFUiA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCIKKworICAgICAgZGVmIHNlbGYuZm9yKHBhdGgsIHByb2Nlc3NvciwgcHJvdG9jb2xfZmFjdG9yeSkKKyAgICAgICAgUmFjazo6QnVpbGRlci5uZXcgZG8KKyAgICAgICAgICB1c2UgUmFjazo6Q29tbW9uTG9nZ2VyCisgICAgICAgICAgdXNlIFJhY2s6OlNob3dFeGNlcHRpb25zCisgICAgICAgICAgdXNlIFJhY2s6OkxpbnQKKyAgICAgICAgICBtYXAgcGF0aCBkbworICAgICAgICAgICAgcnVuIGxhbWJkYSB7IHxlbnZ8CisgICAgICAgICAgICAgIHJlcXVlc3QgPSBSYWNrOjpSZXF1ZXN0Lm5ldyhlbnYpCisgICAgICAgICAgICAgIGlmIFJhY2tBcHBsaWNhdGlvbi52YWxpZF90aHJpZnRfcmVxdWVzdD8ocmVxdWVzdCkKKyAgICAgICAgICAgICAgICBSYWNrQXBwbGljYXRpb24uc3VjY2Vzc2Z1bF9yZXF1ZXN0KHJlcXVlc3QsIHByb2Nlc3NvciwgcHJvdG9jb2xfZmFjdG9yeSkKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFJhY2tBcHBsaWNhdGlvbi5mYWlsZWRfcmVxdWVzdAorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuc3VjY2Vzc2Z1bF9yZXF1ZXN0KHJhY2tfcmVxdWVzdCwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICAgICAgICByZXNwb25zZSA9IFJhY2s6OlJlc3BvbnNlLm5ldyhbXSwgMjAwLCB7J0NvbnRlbnQtVHlwZScgPT4gVEhSSUZUX0hFQURFUn0pCisgICAgICAgIHRyYW5zcG9ydCA9IElPU3RyZWFtVHJhbnNwb3J0Lm5ldyByYWNrX3JlcXVlc3QuYm9keSwgcmVzcG9uc2UKKyAgICAgICAgcHJvdG9jb2wgPSBwcm90b2NvbF9mYWN0b3J5LmdldF9wcm90b2NvbCB0cmFuc3BvcnQKKyAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MgcHJvdG9jb2wsIHByb3RvY29sCisgICAgICAgIHJlc3BvbnNlCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYuZmFpbGVkX3JlcXVlc3QKKyAgICAgICAgUmFjazo6UmVzcG9uc2UubmV3KFsnTm90IEZvdW5kJ10sIDQwNCwgeydDb250ZW50LVR5cGUnID0+IFRIUklGVF9IRUFERVJ9KQorICAgICAgZW5kCisKKyAgICAgIGRlZiBzZWxmLnZhbGlkX3RocmlmdF9yZXF1ZXN0PyhyYWNrX3JlcXVlc3QpCisgICAgICAgIHJhY2tfcmVxdWVzdC5wb3N0PyAmJiByYWNrX3JlcXVlc3QuZW52WyJDT05URU5UX1RZUEUiXSA9PSBUSFJJRlRfSEVBREVSCisgICAgICBlbmQKKworICAgIGVuZAorCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYgppbmRleCA4Y2VjODA1Li5iYjc1NGFkIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKQEAgLTcxLDUgKzcxLDkgQEAKICAgICAgICAgQHNlcnZlcl90cmFuc3BvcnQuY2xvc2UKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAidGhyZWFkcG9vbCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiCmluZGV4IGEyYzkxN2MuLjg4ZWUxODMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgpAQCAtNDMsNSArNDMsOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJ0aHJlYWRlZCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdC5yYgppbmRleCA5ZWU2OTEyLi5kZjlkNjU2IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3QucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0LnJiCkBAIC0yMSw3ICsyMSw3IEBACiAKIG1vZHVsZSBUaHJpZnQKICAgbW9kdWxlIFN0cnVjdAotICAgIGRlZiBpbml0aWFsaXplKGQ9e30pCisgICAgZGVmIGluaXRpYWxpemUoZD17fSwgJmJsb2NrKQogICAgICAgIyBnZXQgYSBjb3B5IG9mIHRoZSBkZWZhdWx0IHZhbHVlcyB0byB3b3JrIG9uLCByZW1vdmluZyBkZWZhdWx0cyBpbiBmYXZvciBvZiBhcmd1bWVudHMKICAgICAgIGZpZWxkc193aXRoX2RlZmF1bHRzID0gZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMuZHVwCiAgICAgICAKQEAgLTUwLDEwICs1MCwxMiBAQAogICAgICAgICAgIGluc3RhbmNlX3ZhcmlhYmxlX3NldCgiQCN7bmFtZX0iLCAoZGVmYXVsdF92YWx1ZS5kdXAgcmVzY3VlIGRlZmF1bHRfdmFsdWUpKQogICAgICAgICBlbmQKICAgICAgIGVuZAorICAgICAgCisgICAgICB5aWVsZCBzZWxmIGlmIGJsb2NrX2dpdmVuPwogICAgIGVuZAogCiAgICAgZGVmIGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzCi0gICAgICBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcyA9IHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KCJAZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMiKQorICAgICAgZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMgPSBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzKQogICAgICAgdW5sZXNzIGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzCiAgICAgICAgIGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzID0ge30KICAgICAgICAgc3RydWN0X2ZpZWxkcy5lYWNoIGRvIHxmaWQsIGZpZWxkX2RlZnwKQEAgLTYxLDcgKzYzLDcgQEAKICAgICAgICAgICAgIGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzW2ZpZWxkX2RlZls6bmFtZV1dID0gZmllbGRfZGVmWzpkZWZhdWx0XQogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKLSAgICAgICAgc2VsZi5jbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9zZXQoIkBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcyIsIGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzKQorICAgICAgICBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QGZpZWxkc193aXRoX2RlZmF1bHRfdmFsdWVzLCBmaWVsZHNfd2l0aF9kZWZhdWx0X3ZhbHVlcykKICAgICAgIGVuZAogICAgICAgZmllbGRzX3dpdGhfZGVmYXVsdF92YWx1ZXMKICAgICBlbmQKQEAgLTEwMyw3ICsxMDUsNyBAQAogICAgICAgICAgICAgd3JpdGVfY29udGFpbmVyKG9wcm90LCB2YWx1ZSwgZmllbGRfaW5mbykKICAgICAgICAgICAgIG9wcm90LndyaXRlX2ZpZWxkX2VuZAogICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9wcm90LndyaXRlX2ZpZWxkKG5hbWUsIHR5cGUsIGZpZCwgdmFsdWUpCisgICAgICAgICAgICBvcHJvdC53cml0ZV9maWVsZChmaWVsZF9pbmZvLCBmaWQsIHZhbHVlKQogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZApAQCAtMTEyLDkgKzExNCwxMCBAQAogICAgIGVuZAogCiAgICAgZGVmID09KG90aGVyKQorICAgICAgcmV0dXJuIGZhbHNlIGlmIG90aGVyLm5pbD8KICAgICAgIGVhY2hfZmllbGQgZG8gfGZpZCwgZmllbGRfaW5mb3wKICAgICAgICAgbmFtZSA9IGZpZWxkX2luZm9bOm5hbWVdCi0gICAgICAgIHJldHVybiBmYWxzZSB1bmxlc3Mgc2VsZi5pbnN0YW5jZV92YXJpYWJsZV9nZXQoIkAje25hbWV9IikgPT0gb3RoZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KCJAI3tuYW1lfSIpCisgICAgICAgIHJldHVybiBmYWxzZSB1bmxlc3Mgb3RoZXIucmVzcG9uZF90bz8obmFtZSkgJiYgc2VsZi5zZW5kKG5hbWUpID09IG90aGVyLnNlbmQobmFtZSkKICAgICAgIGVuZAogICAgICAgdHJ1ZQogICAgIGVuZApAQCAtMTIzLDEzICsxMjYsMTUgQEAKICAgICAgIHNlbGYuY2xhc3MgPT0gb3RoZXIuY2xhc3MgJiYgc2VsZiA9PSBvdGhlcgogICAgIGVuZAogCisgICAgIyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGhhc2goKSBpcyBpbnNwaXJlZCBieSBBcGFjaGUncyBKYXZhIEhhc2hDb2RlQnVpbGRlciBjbGFzcy4KICAgICBkZWYgaGFzaAotICAgICAgZmllbGRfdmFsdWVzID0gW10KKyAgICAgIHRvdGFsID0gMTcKICAgICAgIGVhY2hfZmllbGQgZG8gfGZpZCwgZmllbGRfaW5mb3wKICAgICAgICAgbmFtZSA9IGZpZWxkX2luZm9bOm5hbWVdCi0gICAgICAgIGZpZWxkX3ZhbHVlcyA8PCBzZWxmLmluc3RhbmNlX3ZhcmlhYmxlX2dldCgiQCN7bmFtZX0iKQorICAgICAgICB2YWx1ZSA9IHNlbGYuc2VuZChuYW1lKQorICAgICAgICB0b3RhbCA9ICh0b3RhbCAqIDM3ICsgdmFsdWUuaGFzaCkgJiAweGZmZmZmZmZmCiAgICAgICBlbmQKLSAgICAgIGZpZWxkX3ZhbHVlcy5oYXNoCisgICAgICB0b3RhbAogICAgIGVuZAogCiAgICAgZGVmIGRpZmZlcmVuY2VzKG90aGVyKQpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiCmluZGV4IDliZmJlZDUuLmUyMWIzOWUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdF91bmlvbi5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3RfdW5pb24ucmIKQEAgLTIxLDE5ICsyMSwyOCBAQAogbW9kdWxlIFRocmlmdAogICBtb2R1bGUgU3RydWN0X1VuaW9uCiAgICAgZGVmIG5hbWVfdG9faWQobmFtZSkKLSAgICAgIG5hbWVzX3RvX2lkcyA9IHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KCJAbmFtZXNfdG9faWRzIikKKyAgICAgIG5hbWVzX3RvX2lkcyA9IHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAbmFtZXNfdG9faWRzKQogICAgICAgdW5sZXNzIG5hbWVzX3RvX2lkcwogICAgICAgICBuYW1lc190b19pZHMgPSB7fQogICAgICAgICBzdHJ1Y3RfZmllbGRzLmVhY2ggZG8gfGZpZCwgZmllbGRfZGVmfAogICAgICAgICAgIG5hbWVzX3RvX2lkc1tmaWVsZF9kZWZbOm5hbWVdXSA9IGZpZAogICAgICAgICBlbmQKLSAgICAgICAgc2VsZi5jbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9zZXQoIkBuYW1lc190b19pZHMiLCBuYW1lc190b19pZHMpCisgICAgICAgIHNlbGYuY2xhc3MuaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAbmFtZXNfdG9faWRzLCBuYW1lc190b19pZHMpCiAgICAgICBlbmQKICAgICAgIG5hbWVzX3RvX2lkc1tuYW1lXQogICAgIGVuZAogCisgICAgZGVmIHNvcnRlZF9maWVsZF9pZHMKKyAgICAgIHNvcnRlZF9maWVsZF9pZHMgPSBzZWxmLmNsYXNzLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QHNvcnRlZF9maWVsZF9pZHMpCisgICAgICB1bmxlc3Mgc29ydGVkX2ZpZWxkX2lkcworICAgICAgICBzb3J0ZWRfZmllbGRfaWRzID0gc3RydWN0X2ZpZWxkcy5rZXlzLnNvcnQKKyAgICAgICAgc2VsZi5jbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBzb3J0ZWRfZmllbGRfaWRzLCBzb3J0ZWRfZmllbGRfaWRzKQorICAgICAgZW5kCisgICAgICBzb3J0ZWRfZmllbGRfaWRzCisgICAgZW5kCisKICAgICBkZWYgZWFjaF9maWVsZAotICAgICAgc3RydWN0X2ZpZWxkcy5rZXlzLnNvcnQuZWFjaCBkbyB8ZmlkfAorICAgICAgc29ydGVkX2ZpZWxkX2lkcy5lYWNoIGRvIHxmaWR8CiAgICAgICAgIGRhdGEgPSBzdHJ1Y3RfZmllbGRzW2ZpZF0KICAgICAgICAgeWllbGQgZmlkLCBkYXRhCiAgICAgICBlbmQKQEAgLTQ2LDI5ICs1NSw1MyBAQAogICAgICAgICB2YWx1ZS5yZWFkKGlwcm90KQogICAgICAgd2hlbiBUeXBlczo6TUFQCiAgICAgICAgIGtleV90eXBlLCB2YWxfdHlwZSwgc2l6ZSA9IGlwcm90LnJlYWRfbWFwX2JlZ2luCi0gICAgICAgIHZhbHVlID0ge30KLSAgICAgICAgc2l6ZS50aW1lcyBkbwotICAgICAgICAgIGsgPSByZWFkX2ZpZWxkKGlwcm90LCBmaWVsZF9pbmZvKGZpZWxkWzprZXldKSkKLSAgICAgICAgICB2ID0gcmVhZF9maWVsZChpcHJvdCwgZmllbGRfaW5mbyhmaWVsZFs6dmFsdWVdKSkKLSAgICAgICAgICB2YWx1ZVtrXSA9IHYKKyAgICAgICAgIyBTa2lwIHRoZSBtYXAgY29udGVudHMgaWYgdGhlIGRlY2xhcmVkIGtleSBvciB2YWx1ZSB0eXBlcyBkb24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgb25lcy4KKyAgICAgICAgaWYgKHNpemUgIT0gMCAmJiAoa2V5X3R5cGUgIT0gZmllbGRbOmtleV1bOnR5cGVdIHx8IHZhbF90eXBlICE9IGZpZWxkWzp2YWx1ZV1bOnR5cGVdKSkKKyAgICAgICAgICBzaXplLnRpbWVzIGRvCisgICAgICAgICAgICBpcHJvdC5za2lwKGtleV90eXBlKQorICAgICAgICAgICAgaXByb3Quc2tpcCh2YWxfdHlwZSkKKyAgICAgICAgICBlbmQKKyAgICAgICAgICB2YWx1ZSA9IG5pbAorICAgICAgICBlbHNlCisgICAgICAgICAgdmFsdWUgPSB7fQorICAgICAgICAgIHNpemUudGltZXMgZG8KKyAgICAgICAgICAgIGsgPSByZWFkX2ZpZWxkKGlwcm90LCBmaWVsZF9pbmZvKGZpZWxkWzprZXldKSkKKyAgICAgICAgICAgIHYgPSByZWFkX2ZpZWxkKGlwcm90LCBmaWVsZF9pbmZvKGZpZWxkWzp2YWx1ZV0pKQorICAgICAgICAgICAgdmFsdWVba10gPSB2CisgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgICBpcHJvdC5yZWFkX21hcF9lbmQKICAgICAgIHdoZW4gVHlwZXM6OkxJU1QKICAgICAgICAgZV90eXBlLCBzaXplID0gaXByb3QucmVhZF9saXN0X2JlZ2luCi0gICAgICAgIHZhbHVlID0gQXJyYXkubmV3KHNpemUpIGRvIHxufAotICAgICAgICAgIHJlYWRfZmllbGQoaXByb3QsIGZpZWxkX2luZm8oZmllbGRbOmVsZW1lbnRdKSkKKyAgICAgICAgIyBTa2lwIHRoZSBsaXN0IGNvbnRlbnRzIGlmIHRoZSBkZWNsYXJlZCBlbGVtZW50IHR5cGUgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgb25lLgorICAgICAgICBpZiAoZV90eXBlICE9IGZpZWxkWzplbGVtZW50XVs6dHlwZV0pCisgICAgICAgICAgc2l6ZS50aW1lcyBkbworICAgICAgICAgICAgaXByb3Quc2tpcChlX3R5cGUpCisgICAgICAgICAgZW5kCisgICAgICAgICAgdmFsdWUgPSBuaWwKKyAgICAgICAgZWxzZQorICAgICAgICAgIHZhbHVlID0gQXJyYXkubmV3KHNpemUpIGRvIHxufAorICAgICAgICAgICAgcmVhZF9maWVsZChpcHJvdCwgZmllbGRfaW5mbyhmaWVsZFs6ZWxlbWVudF0pKQorICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgICAgaXByb3QucmVhZF9saXN0X2VuZAogICAgICAgd2hlbiBUeXBlczo6U0VUCiAgICAgICAgIGVfdHlwZSwgc2l6ZSA9IGlwcm90LnJlYWRfc2V0X2JlZ2luCi0gICAgICAgIHZhbHVlID0gU2V0Lm5ldwotICAgICAgICBzaXplLnRpbWVzIGRvCi0gICAgICAgICAgZWxlbWVudCA9IHJlYWRfZmllbGQoaXByb3QsIGZpZWxkX2luZm8oZmllbGRbOmVsZW1lbnRdKSkKLSAgICAgICAgICB2YWx1ZSA8PCBlbGVtZW50CisgICAgICAgICMgU2tpcCB0aGUgc2V0IGNvbnRlbnRzIGlmIHRoZSBkZWNsYXJlZCBlbGVtZW50IHR5cGUgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgb25lLgorICAgICAgICBpZiAoZV90eXBlICE9IGZpZWxkWzplbGVtZW50XVs6dHlwZV0pCisgICAgICAgICAgc2l6ZS50aW1lcyBkbworICAgICAgICAgICAgaXByb3Quc2tpcChlX3R5cGUpCisgICAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICB2YWx1ZSA9IFNldC5uZXcKKyAgICAgICAgICBzaXplLnRpbWVzIGRvCisgICAgICAgICAgICBlbGVtZW50ID0gcmVhZF9maWVsZChpcHJvdCwgZmllbGRfaW5mbyhmaWVsZFs6ZWxlbWVudF0pKQorICAgICAgICAgICAgdmFsdWUgPDwgZWxlbWVudAorICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgICAgaXByb3QucmVhZF9zZXRfZW5kCiAgICAgICBlbHNlCi0gICAgICAgIHZhbHVlID0gaXByb3QucmVhZF90eXBlKGZpZWxkWzp0eXBlXSkKKyAgICAgICAgdmFsdWUgPSBpcHJvdC5yZWFkX3R5cGUoZmllbGQpCiAgICAgICBlbmQKICAgICAgIHZhbHVlCiAgICAgZW5kCkBAIC03Nyw3ICsxMTAsNyBAQAogICAgICAgaWYgaXNfY29udGFpbmVyPyBmaWVsZFs6dHlwZV0KICAgICAgICAgd3JpdGVfY29udGFpbmVyKG9wcm90LCB2YWx1ZSwgZmllbGQpCiAgICAgICBlbHNlCi0gICAgICAgIG9wcm90LndyaXRlX3R5cGUoZmllbGRbOnR5cGVdLCB2YWx1ZSkKKyAgICAgICAgb3Byb3Qud3JpdGVfdHlwZShmaWVsZCwgdmFsdWUpCiAgICAgICBlbmQKICAgICBlbmQKIApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIKaW5kZXggNjhjNWFmMC4uMDEwNTQ2MyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCkBAIC0zNCw0ICszNCw0IEBACiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKaW5kZXggMDhhNzFkYS4uOTdlNTkzNSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgpAQCAtMzQsNiArMzQsMTggQEAKICAgICBlbmQKICAgZW5kCiAKKyAgbW9kdWxlIFRyYW5zcG9ydFV0aWxzCisgICAgIyBEZXByZWNhdGVkOiBVc2UgVGhyaWZ0OjpCeXRlcyBpbnN0ZWFkCisgICAgZGVmIHNlbGYuZ2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgpCisgICAgICBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoc3RyaW5nLCBpbmRleCkKKyAgICBlbmQKKworICAgICMgRGVwcmVjYXRlZDogVXNlIFRocmlmdDo6Qnl0ZXMgaW5zdGVhZAorICAgIGRlZiBzZWxmLnNldF9zdHJpbmdfYnl0ZShzdHJpbmcsIGluZGV4LCBieXRlKQorICAgICAgQnl0ZXMuc2V0X3N0cmluZ19ieXRlKHN0cmluZywgaW5kZXgsIGJ5dGUpCisgICAgZW5kCisgIGVuZAorCiAgIGNsYXNzIEJhc2VUcmFuc3BvcnQKICAgICBkZWYgb3Blbj87IGVuZAogICAgIApAQCAtNDEsMTMgKzUzLDM1IEBACiAKICAgICBkZWYgY2xvc2U7IGVuZAogCisgICAgIyBSZWFkcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSB0cmFuc3BvcnRzLiBJbiBSdWJ5IDEuOSssIHRoZSBTdHJpbmcgcmV0dXJuZWQgd2lsbCBoYXZlIGEgQklOQVJZIChha2EgQVNDSUk4QklUKSBlbmNvZGluZy4KKyAgICAjCisgICAgIyBzeiAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQuCisgICAgIworICAgICMgUmV0dXJucyBhIFN0cmluZyBhY3RpbmcgYXMgYSBieXRlIGJ1ZmZlci4KICAgICBkZWYgcmVhZChzeikKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKIAorICAgICMgUmV0dXJucyBhbiB1bnNpZ25lZCBieXRlIGFzIGEgRml4bnVtIGluIHRoZSByYW5nZSAoMC4uMjU1KS4KKyAgICBkZWYgcmVhZF9ieXRlCisgICAgICBidWYgPSByZWFkX2FsbCgxKQorICAgICAgcmV0dXJuIEJ5dGVzLmdldF9zdHJpbmdfYnl0ZShidWYsIDApCisgICAgZW5kCisKKyAgICAjIFJlYWRzIHNpemUgYnl0ZXMgYW5kIGNvcGllcyB0aGVtIGludG8gYnVmZmVyWzAuLnNpemVdLgorICAgIGRlZiByZWFkX2ludG9fYnVmZmVyKGJ1ZmZlciwgc2l6ZSkKKyAgICAgIHRtcCA9IHJlYWRfYWxsKHNpemUpCisgICAgICBpID0gMAorICAgICAgdG1wLmVhY2hfYnl0ZSBkbyB8Ynl0ZXwKKyAgICAgICAgQnl0ZXMuc2V0X3N0cmluZ19ieXRlKGJ1ZmZlciwgaSwgYnl0ZSkKKyAgICAgICAgaSArPSAxCisgICAgICBlbmQKKyAgICAgIGkKKyAgICBlbmQKKwogICAgIGRlZiByZWFkX2FsbChzaXplKQotICAgICAgYnVmID0gJycKLSAgICAKKyAgICAgIHJldHVybiBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlciBpZiBzaXplIDw9IDAKKyAgICAgIGJ1ZiA9IHJlYWQoc2l6ZSkKICAgICAgIHdoaWxlIChidWYubGVuZ3RoIDwgc2l6ZSkKICAgICAgICAgY2h1bmsgPSByZWFkKHNpemUgLSBidWYubGVuZ3RoKQogICAgICAgICBidWYgPDwgY2h1bmsKQEAgLTU1LDE2ICs4OSwyOSBAQAogICAgIAogICAgICAgYnVmCiAgICAgZW5kCi0gIAorCisgICAgIyBXcml0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHRoZSB0cmFuc3BvcnQuIEluIFJ1YnkgMS45KywgdGhlIGJ1ZmZlciB3aWxsIGJlIGZvcmNlZCBpbnRvIEJJTkFSWSBlbmNvZGluZy4KKyAgICAjCisgICAgIyBidWYgLSBBIFN0cmluZyBhY3RpbmcgYXMgYSBieXRlIGJ1ZmZlci4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCiAgICAgZGVmIHdyaXRlKGJ1Zik7IGVuZAogICAgIGFsaWFzX21ldGhvZCA6PDwsIDp3cml0ZQogCiAgICAgZGVmIGZsdXNoOyBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAiYmFzZSIKKyAgICBlbmQKICAgZW5kCiAgIAogICBjbGFzcyBCYXNlVHJhbnNwb3J0RmFjdG9yeQogICAgIGRlZiBnZXRfdHJhbnNwb3J0KHRyYW5zKQogICAgICAgcmV0dXJuIHRyYW5zCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIKaW5kZXggOGRlYWQ0ZS4uNGZlOWM0MSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCkBAIC0yNCw4ICsyNCw4IEBACiAgICAgCiAgICAgZGVmIGluaXRpYWxpemUodHJhbnNwb3J0KQogICAgICAgQHRyYW5zcG9ydCA9IHRyYW5zcG9ydAotICAgICAgQHdidWYgPSAnJwotICAgICAgQHJidWYgPSAnJworICAgICAgQHdidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgorICAgICAgQHJidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogICAgICAgQGluZGV4ID0gMAogICAgIGVuZAogCkBAIC00NCwzNCArNDQsNzkgQEAKIAogICAgIGRlZiByZWFkKHN6KQogICAgICAgQGluZGV4ICs9IHN6Ci0gICAgICByZXQgPSBAcmJ1Zi5zbGljZShAaW5kZXggLSBzeiwgc3opIHx8ICcnCisgICAgICByZXQgPSBAcmJ1Zi5zbGljZShAaW5kZXggLSBzeiwgc3opIHx8IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAKICAgICAgIGlmIHJldC5sZW5ndGggPT0gMAogICAgICAgICBAcmJ1ZiA9IEB0cmFuc3BvcnQucmVhZChbc3osIERFRkFVTFRfQlVGRkVSXS5tYXgpCiAgICAgICAgIEBpbmRleCA9IHN6Ci0gICAgICAgIHJldCA9IEByYnVmLnNsaWNlKDAsIHN6KSB8fCAnJworICAgICAgICByZXQgPSBAcmJ1Zi5zbGljZSgwLCBzeikgfHwgQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICAgIGVuZAogCiAgICAgICByZXQKICAgICBlbmQKIAorICAgIGRlZiByZWFkX2J5dGUKKyAgICAgICMgSWYgdGhlIHJlYWQgYnVmZmVyIGlzIGV4aGF1c3RlZCwgdHJ5IHRvIHJlYWQgdXAgdG8gREVGQVVMVF9CVUZGRVIgbW9yZSBieXRlcyBpbnRvIGl0LgorICAgICAgaWYgQGluZGV4ID49IEByYnVmLnNpemUKKyAgICAgICAgQHJidWYgPSBAdHJhbnNwb3J0LnJlYWQoREVGQVVMVF9CVUZGRVIpCisgICAgICAgIEBpbmRleCA9IDAKKyAgICAgIGVuZAorCisgICAgICAjIFRoZSByZWFkIGJ1ZmZlciBoYXMgc29tZSBkYXRhIG5vdywgcmVhZCBhIHNpbmdsZSBieXRlLiBVc2luZyBnZXRfc3RyaW5nX2J5dGUoKSBhdm9pZHMKKyAgICAgICMgYWxsb2NhdGluZyBhIHRlbXAgc3RyaW5nIG9mIHNpemUgMSB1bm5lY2Vzc2FyaWx5LgorICAgICAgQGluZGV4ICs9IDEKKyAgICAgIHJldHVybiBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQHJidWYsIEBpbmRleCAtIDEpCisgICAgZW5kCisKKyAgICAjIFJlYWRzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHRyYW5zcG9ydCBpbnRvIHRoZSBidWZmZXIgcGFzc2VkLgorICAgICMKKyAgICAjIGJ1ZmZlciAtIFRoZSBTdHJpbmcgKGJ5dGUgYnVmZmVyKSB0byB3cml0ZSBkYXRhIHRvOyB0aGlzIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIEJJTkFSWSBlbmNvZGluZy4KKyAgICAjIHNpemUgICAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYW5kIHdyaXRlIHRvIHRoZSBidWZmZXIuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgICAgZGVmIHJlYWRfaW50b19idWZmZXIoYnVmZmVyLCBzaXplKQorICAgICAgaSA9IDAKKyAgICAgIHdoaWxlIGkgPCBzaXplCisgICAgICAgICMgSWYgdGhlIHJlYWQgYnVmZmVyIGlzIGV4aGF1c3RlZCwgdHJ5IHRvIHJlYWQgdXAgdG8gREVGQVVMVF9CVUZGRVIgbW9yZSBieXRlcyBpbnRvIGl0LgorICAgICAgICBpZiBAaW5kZXggPj0gQHJidWYuc2l6ZQorICAgICAgICAgIEByYnVmID0gQHRyYW5zcG9ydC5yZWFkKERFRkFVTFRfQlVGRkVSKQorICAgICAgICAgIEBpbmRleCA9IDAKKyAgICAgICAgZW5kCisKKyAgICAgICAgIyBUaGUgcmVhZCBidWZmZXIgaGFzIHNvbWUgZGF0YSBub3csIHNvIGNvcHkgYnl0ZXMgb3ZlciB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgYnl0ZSA9IEJ5dGVzLmdldF9zdHJpbmdfYnl0ZShAcmJ1ZiwgQGluZGV4KQorICAgICAgICBCeXRlcy5zZXRfc3RyaW5nX2J5dGUoYnVmZmVyLCBpLCBieXRlKQorICAgICAgICBAaW5kZXggKz0gMQorICAgICAgICBpICs9IDEKKyAgICAgIGVuZAorICAgICAgaQorICAgIGVuZAorCiAgICAgZGVmIHdyaXRlKGJ1ZikKLSAgICAgIEB3YnVmIDw8IGJ1ZgorICAgICAgQHdidWYgPDwgQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZikKICAgICBlbmQKIAogICAgIGRlZiBmbHVzaAotICAgICAgaWYgQHdidWYgIT0gJycKKyAgICAgIHVubGVzcyBAd2J1Zi5lbXB0eT8KICAgICAgICAgQHRyYW5zcG9ydC53cml0ZShAd2J1ZikKLSAgICAgICAgQHdidWYgPSAnJworICAgICAgICBAd2J1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgICBlbmQKICAgICAgIAogICAgICAgQHRyYW5zcG9ydC5mbHVzaAogICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJidWZmZXJlZCgje0B0cmFuc3BvcnQudG9fc30pIgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgPCBCYXNlVHJhbnNwb3J0RmFjdG9yeQogICAgIGRlZiBnZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkKICAgICAgIHJldHVybiBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnNwb3J0KQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYnVmZmVyZWQiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiCmluZGV4IDU1OGFmNzQuLjk1MzE3NzggMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiCkBAIC0yMiw4ICsyMiw4IEBACiAgIGNsYXNzIEZyYW1lZFRyYW5zcG9ydCA8IEJhc2VUcmFuc3BvcnQKICAgICBkZWYgaW5pdGlhbGl6ZSh0cmFuc3BvcnQsIHJlYWQ9dHJ1ZSwgd3JpdGU9dHJ1ZSkKICAgICAgIEB0cmFuc3BvcnQgPSB0cmFuc3BvcnQKLSAgICAgIEByYnVmICAgICAgPSAnJwotICAgICAgQHdidWYgICAgICA9ICcnCisgICAgICBAcmJ1ZiAgICAgID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgIEB3YnVmICAgICAgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogICAgICAgQHJlYWQgICAgICA9IHJlYWQKICAgICAgIEB3cml0ZSAgICAgPSB3cml0ZQogICAgICAgQGluZGV4ICAgICAgPSAwCkBAIC00NCwxNyArNDQsNDMgQEAKICAgICBkZWYgcmVhZChzeikKICAgICAgIHJldHVybiBAdHJhbnNwb3J0LnJlYWQoc3opIHVubGVzcyBAcmVhZAogCi0gICAgICByZXR1cm4gJycgaWYgc3ogPD0gMAorICAgICAgcmV0dXJuIEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyIGlmIHN6IDw9IDAKIAogICAgICAgcmVhZF9mcmFtZSBpZiBAaW5kZXggPj0gQHJidWYubGVuZ3RoCiAKICAgICAgIEBpbmRleCArPSBzegotICAgICAgQHJidWYuc2xpY2UoQGluZGV4IC0gc3osIHN6KSB8fCAnJworICAgICAgQHJidWYuc2xpY2UoQGluZGV4IC0gc3osIHN6KSB8fCBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgogICAgIGVuZAogCi0gICAgZGVmIHdyaXRlKGJ1Zixzej1uaWwpCisgICAgZGVmIHJlYWRfYnl0ZQorICAgICAgcmV0dXJuIEB0cmFuc3BvcnQucmVhZF9ieXRlKCkgdW5sZXNzIEByZWFkCisKKyAgICAgIHJlYWRfZnJhbWUgaWYgQGluZGV4ID49IEByYnVmLmxlbmd0aAorCisgICAgICAjIFRoZSByZWFkIGJ1ZmZlciBoYXMgc29tZSBkYXRhIG5vdywgcmVhZCBhIHNpbmdsZSBieXRlLiBVc2luZyBnZXRfc3RyaW5nX2J5dGUoKSBhdm9pZHMKKyAgICAgICMgYWxsb2NhdGluZyBhIHRlbXAgc3RyaW5nIG9mIHNpemUgMSB1bm5lY2Vzc2FyaWx5LgorICAgICAgQGluZGV4ICs9IDEKKyAgICAgIHJldHVybiBCeXRlcy5nZXRfc3RyaW5nX2J5dGUoQHJidWYsIEBpbmRleCAtIDEpCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pbnRvX2J1ZmZlcihidWZmZXIsIHNpemUpCisgICAgICBpID0gMAorICAgICAgd2hpbGUgaSA8IHNpemUKKyAgICAgICAgcmVhZF9mcmFtZSBpZiBAaW5kZXggPj0gQHJidWYubGVuZ3RoCisKKyAgICAgICAgIyBUaGUgcmVhZCBidWZmZXIgaGFzIHNvbWUgZGF0YSBub3csIHNvIGNvcHkgYnl0ZXMgb3ZlciB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgYnl0ZSA9IEJ5dGVzLmdldF9zdHJpbmdfYnl0ZShAcmJ1ZiwgQGluZGV4KQorICAgICAgICBCeXRlcy5zZXRfc3RyaW5nX2J5dGUoYnVmZmVyLCBpLCBieXRlKQorICAgICAgICBAaW5kZXggKz0gMQorICAgICAgICBpICs9IDEKKyAgICAgIGVuZAorICAgICAgaQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlKGJ1Ziwgc3o9bmlsKQogICAgICAgcmV0dXJuIEB0cmFuc3BvcnQud3JpdGUoYnVmKSB1bmxlc3MgQHdyaXRlCiAKKyAgICAgIGJ1ZiA9IEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpCiAgICAgICBAd2J1ZiA8PCAoc3ogPyBidWZbMC4uLnN6XSA6IGJ1ZikKICAgICBlbmQKIApAQCAtNjYsMTAgKzkyLDE1IEBACiAgICAgICByZXR1cm4gQHRyYW5zcG9ydC5mbHVzaCB1bmxlc3MgQHdyaXRlCiAKICAgICAgIG91dCA9IFtAd2J1Zi5sZW5ndGhdLnBhY2soJ04nKQorICAgICAgIyBBcnJheSNwYWNrIHNob3VsZCByZXR1cm4gYSBCSU5BUlkgZW5jb2RlZCBTdHJpbmcsIHNvIGl0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgdG8gZm9yY2UgZW5jb2RpbmcKICAgICAgIG91dCA8PCBAd2J1ZgogICAgICAgQHRyYW5zcG9ydC53cml0ZShvdXQpCiAgICAgICBAdHJhbnNwb3J0LmZsdXNoCi0gICAgICBAd2J1ZiA9ICcnCisgICAgICBAd2J1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCisgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImZyYW1lZCgje0B0cmFuc3BvcnQudG9fc30pIgogICAgIGVuZAogCiAgICAgcHJpdmF0ZQpAQCAtODYsNSArMTE3LDkgQEAKICAgICBkZWYgZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpCiAgICAgICByZXR1cm4gRnJhbWVkVHJhbnNwb3J0Lm5ldyh0cmFuc3BvcnQpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJmcmFtZWQiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYgppbmRleCBlNjJhNTFjLi41YzFkZDVjIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKQEAgLTEsNSArMSw1IEBACiAjIGVuY29kaW5nOiBhc2NpaS04Yml0Ci0jIAorIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC03LDM5ICs3LDU1IEBACiAjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCisjCiAjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAorIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAKKyMKIAogcmVxdWlyZSAnbmV0L2h0dHAnCiByZXF1aXJlICduZXQvaHR0cHMnCityZXF1aXJlICdvcGVuc3NsJwogcmVxdWlyZSAndXJpJwogcmVxdWlyZSAnc3RyaW5naW8nCiAKIG1vZHVsZSBUaHJpZnQKICAgY2xhc3MgSFRUUENsaWVudFRyYW5zcG9ydCA8IEJhc2VUcmFuc3BvcnQKLSAgICBkZWYgaW5pdGlhbGl6ZSh1cmwpCisKKyAgICBkZWYgaW5pdGlhbGl6ZSh1cmwsIG9wdHMgPSB7fSkKICAgICAgIEB1cmwgPSBVUkkgdXJsCi0gICAgICBAb3V0YnVmID0gIiIKKyAgICAgIEBoZWFkZXJzID0geydDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCd9CisgICAgICBAb3V0YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKKyAgICAgIEBzc2xfdmVyaWZ5X21vZGUgPSBvcHRzLmZldGNoKDpzc2xfdmVyaWZ5X21vZGUsIE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIpCiAgICAgZW5kCiAKICAgICBkZWYgb3Blbj87IHRydWUgZW5kCiAgICAgZGVmIHJlYWQoc3opOyBAaW5idWYucmVhZCBzeiBlbmQKLSAgICBkZWYgd3JpdGUoYnVmKTsgQG91dGJ1ZiA8PCBidWYgZW5kCisgICAgZGVmIHdyaXRlKGJ1Zik7IEBvdXRidWYgPDwgQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1ZikgZW5kCisKKyAgICBkZWYgYWRkX2hlYWRlcnMoaGVhZGVycykKKyAgICAgIEBoZWFkZXJzID0gQGhlYWRlcnMubWVyZ2UoaGVhZGVycykKKyAgICBlbmQKKwogICAgIGRlZiBmbHVzaAogICAgICAgaHR0cCA9IE5ldDo6SFRUUC5uZXcgQHVybC5ob3N0LCBAdXJsLnBvcnQKLSAgICAgIGh0dHAudXNlX3NzbCA9IEB1cmwuc2NoZW1lID09ICJodHRwcyIKLSAgICAgIGhlYWRlcnMgPSB7ICdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcgfQotICAgICAgcmVzcCwgZGF0YSA9IGh0dHAucG9zdChAdXJsLnJlcXVlc3RfdXJpLCBAb3V0YnVmLCBoZWFkZXJzKQorICAgICAgaHR0cC51c2Vfc3NsID0gQHVybC5zY2hlbWUgPT0gJ2h0dHBzJworICAgICAgaHR0cC52ZXJpZnlfbW9kZSA9IEBzc2xfdmVyaWZ5X21vZGUgaWYgQHVybC5zY2hlbWUgPT0gJ2h0dHBzJworICAgICAgcmVzcCA9IGh0dHAucG9zdChAdXJsLnJlcXVlc3RfdXJpLCBAb3V0YnVmLCBAaGVhZGVycykKKyAgICAgIGRhdGEgPSByZXNwLmJvZHkKKyAgICAgIGRhdGEgPSBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoZGF0YSkKICAgICAgIEBpbmJ1ZiA9IFN0cmluZ0lPLm5ldyBkYXRhCi0gICAgICBAb3V0YnVmID0gIiIKKyAgICBlbnN1cmUKKyAgICAgIEBvdXRidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiQHtzZWxmLnVybH0iCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiCmluZGV4IGJlMzQ4YWEuLmNjZWM2OGYgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiCkBAIC0zMiw4ICszMiwxMSBAQAogCiAgICAgZGVmIG9wZW4/OyBub3QgQGlucHV0LmNsb3NlZD8gb3Igbm90IEBvdXRwdXQuY2xvc2VkPyBlbmQKICAgICBkZWYgcmVhZChzeik7IEBpbnB1dC5yZWFkKHN6KSBlbmQKLSAgICBkZWYgd3JpdGUoYnVmKTsgQG91dHB1dC53cml0ZShidWYpIGVuZAorICAgIGRlZiB3cml0ZShidWYpOyBAb3V0cHV0LndyaXRlKEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpKSBlbmQKICAgICBkZWYgY2xvc2U7IEBpbnB1dC5jbG9zZTsgQG91dHB1dC5jbG9zZSBlbmQKICAgICBkZWYgdG9faW87IEBpbnB1dCBlbmQgIyB3ZSdyZSBhc3N1bWluZyB0aGlzIGlzIHVzZWQgaW4gYSBJTy5zZWxlY3QgZm9yIHJlYWRpbmcKKyAgICBkZWYgdG9fcworICAgICAgImlvc3RyZWFtKGlucHV0PSN7QGlucHV0LnRvX3N9LG91dHB1dD0je0BvdXRwdXQudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCmluZGV4IGI0YTgwZjguLjQ2OWVhNzMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5X2J1ZmZlcl90cmFuc3BvcnQucmIKQEAgLTI4LDcgKzI4LDcgQEAKICAgICAjIHRoaXMgYmVoYXZpb3IgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgaXQKICAgICAjIGdvIGFoZWFkLCBqdXN0IG1ha2Ugc3VyZSB0aGUgc3BlY3MgcGFzcwogICAgIGRlZiBpbml0aWFsaXplKGJ1ZmZlciA9IG5pbCkKLSAgICAgIEBidWYgPSBidWZmZXIgfHwgJycKKyAgICAgIEBidWYgPSBidWZmZXIgPyBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmZmVyKSA6IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgICBAaW5kZXggPSAwCiAgICAgZW5kCiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogICAgICMgdGhpcyBtZXRob2QgZG9lcyBub3QgdXNlIHRoZSBwYXNzZWQgb2JqZWN0IGRpcmVjdGx5IGJ1dCBjb3BpZXMgaXQKICAgICBkZWYgcmVzZXRfYnVmZmVyKG5ld19idWYgPSAnJykKLSAgICAgIEBidWYucmVwbGFjZSBuZXdfYnVmCisgICAgICBAYnVmLnJlcGxhY2UgQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKG5ld19idWYpCiAgICAgICBAaW5kZXggPSAwCiAgICAgZW5kCiAKQEAgLTcwLDggKzcwLDM3IEBACiAgICAgICBkYXRhCiAgICAgZW5kCiAKKyAgICBkZWYgcmVhZF9ieXRlCisgICAgICByYWlzZSBFT0ZFcnJvci5uZXcoIk5vdCBlbm91Z2ggYnl0ZXMgcmVtYWluIGluIGJ1ZmZlciIpIGlmIEBpbmRleCA+PSBAYnVmLnNpemUKKyAgICAgIHZhbCA9IEJ5dGVzLmdldF9zdHJpbmdfYnl0ZShAYnVmLCBAaW5kZXgpCisgICAgICBAaW5kZXggKz0gMQorICAgICAgaWYgQGluZGV4ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUKKyAgICAgICAgQGJ1ZiA9IEBidWYuc2xpY2UoQGluZGV4Li4tMSkKKyAgICAgICAgQGluZGV4ID0gMAorICAgICAgZW5kCisgICAgICB2YWwKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2ludG9fYnVmZmVyKGJ1ZmZlciwgc2l6ZSkKKyAgICAgIGkgPSAwCisgICAgICB3aGlsZSBpIDwgc2l6ZQorICAgICAgICByYWlzZSBFT0ZFcnJvci5uZXcoIk5vdCBlbm91Z2ggYnl0ZXMgcmVtYWluIGluIGJ1ZmZlciIpIGlmIEBpbmRleCA+PSBAYnVmLnNpemUKKworICAgICAgICAjIFRoZSByZWFkIGJ1ZmZlciBoYXMgc29tZSBkYXRhIG5vdywgc28gY29weSBieXRlcyBvdmVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAgICBieXRlID0gQnl0ZXMuZ2V0X3N0cmluZ19ieXRlKEBidWYsIEBpbmRleCkKKyAgICAgICAgQnl0ZXMuc2V0X3N0cmluZ19ieXRlKGJ1ZmZlciwgaSwgYnl0ZSkKKyAgICAgICAgQGluZGV4ICs9IDEKKyAgICAgICAgaSArPSAxCisgICAgICBlbmQKKyAgICAgIGlmIEBpbmRleCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFCisgICAgICAgIEBidWYgPSBAYnVmLnNsaWNlKEBpbmRleC4uLTEpCisgICAgICAgIEBpbmRleCA9IDAKKyAgICAgIGVuZAorICAgICAgaQorICAgIGVuZAorCiAgICAgZGVmIHdyaXRlKHdidWYpCi0gICAgICBAYnVmIDw8IHdidWYKKyAgICAgIEBidWYgPDwgQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKHdidWYpCiAgICAgZW5kCiAKICAgICBkZWYgZmx1c2gKQEAgLTg4LDkgKzExNywxMyBAQAogICAgICAgICAgIG91dCA8PCAiPiIKICAgICAgICAgZW5kCiAgICAgICAKLSAgICAgICAgb3V0IDw8IEBidWZbaWR4XS50b19zKDE2KQorICAgICAgICBvdXQgPDwgQGJ1ZltpZHhdLm9yZC50b19zKDE2KQogICAgICAgZW5kCiAgICAgICBvdXQuam9pbigiICIpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJtZW1vcnkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IDdmZWI5YWIuLjUwMDAyMzIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCkBAIC01OSw1ICs1OSwxMCBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgInNvY2tldCgje0Bob3N0fToje0Bwb3J0fSkiCisgICAgZW5kCisKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCmluZGV4IDA2YzkzN2UuLmY1ZTZmM2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYgpAQCAtMzMsMjUgKzMzLDI4IEBACiAgICAgYXR0cl9hY2Nlc3NvciA6aGFuZGxlLCA6dGltZW91dAogCiAgICAgZGVmIG9wZW4KLSAgICAgIGJlZ2luCi0gICAgICAgIGFkZHJpbmZvID0gOjpTb2NrZXQ6OmdldGFkZHJpbmZvKEBob3N0LCBAcG9ydCkuZmlyc3QKLSAgICAgICAgQGhhbmRsZSA9IDo6U29ja2V0Lm5ldyhhZGRyaW5mb1s0XSwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLCAwKQotICAgICAgICBzb2NrYWRkciA9IDo6U29ja2V0LnNvY2thZGRyX2luKGFkZHJpbmZvWzFdLCBhZGRyaW5mb1szXSkKKyAgICAgIGZvciBhZGRyaW5mbyBpbiA6OlNvY2tldDo6Z2V0YWRkcmluZm8oQGhvc3QsIEBwb3J0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkgZG8KICAgICAgICAgYmVnaW4KLSAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgIHJlc2N1ZSBFcnJubzo6RUlOUFJPR1JFU1MKLSAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBAaGFuZGxlIF0sIG5pbCwgQHRpbWVvdXQpCi0gICAgICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb25uZWN0aW9uIHRpbWVvdXQgdG8gI3tAZGVzY30iKQotICAgICAgICAgIGVuZAorICAgICAgICAgIHNvY2tldCA9IDo6U29ja2V0Lm5ldyhhZGRyaW5mb1s0XSwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLCAwKQorICAgICAgICAgIHNvY2tldC5zZXRzb2Nrb3B0KDo6U29ja2V0OjpJUFBST1RPX1RDUCwgOjpTb2NrZXQ6OlRDUF9OT0RFTEFZLCAxKQorICAgICAgICAgIHNvY2thZGRyID0gOjpTb2NrZXQuc29ja2FkZHJfaW4oYWRkcmluZm9bMV0sIGFkZHJpbmZvWzNdKQogICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgICAgcmVzY3VlIEVycm5vOjpFSVNDT05OCisgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICByZXNjdWUgRXJybm86OkVJTlBST0dSRVNTCisgICAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBzb2NrZXQgXSwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgICAgICAgbmV4dAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUlTQ09OTgorICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCisgICAgICAgICAgcmV0dXJuIEBoYW5kbGUgPSBzb2NrZXQKKyAgICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQorICAgICAgICAgIG5leHQKICAgICAgICAgZW5kCi0gICAgICAgIEBoYW5kbGUKLSAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGUKLSAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gI3tAZGVzY306ICN7ZX0iKQogICAgICAgZW5kCisgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCiAgICAgZW5kCiAKICAgICBkZWYgb3Blbj8KQEAgLTYwLDYgKzYzLDcgQEAKIAogICAgIGRlZiB3cml0ZShzdHIpCiAgICAgICByYWlzZSBJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIgdW5sZXNzIG9wZW4/CisgICAgICBzdHIgPSBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2Rpbmcoc3RyKQogICAgICAgYmVnaW4KICAgICAgICAgaWYgQHRpbWVvdXQubmlsPyBvciBAdGltZW91dCA9PSAwCiAgICAgICAgICAgQGhhbmRsZS53cml0ZShzdHIpCkBAIC05NywxMiArMTAxLDEzIEBACiAgICAgICAgICAgZGF0YSA9IEBoYW5kbGUucmVhZHBhcnRpYWwoc3opCiAgICAgICAgIGVsc2UKICAgICAgICAgICAjIGl0J3MgcG9zc2libGUgdG8gaW50ZXJydXB0IHNlbGVjdCBmb3Igc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHRpbWVvdXQKLSAgICAgICAgICAjIHNvIHdlIG5lZWQgdG8gZW5zdXJlIHdlJ3ZlIHdhaXRlZCBsb25nIGVub3VnaAorICAgICAgICAgICMgc28gd2UgbmVlZCB0byBlbnN1cmUgd2UndmUgd2FpdGVkIGxvbmcgZW5vdWdoLCBidXQgbm90IHRvbyBsb25nCiAgICAgICAgICAgc3RhcnQgPSBUaW1lLm5vdwotICAgICAgICAgIHJkID0gbmlsICMgc2NvcGluZwotICAgICAgICAgIGxvb3AgZG8KLSAgICAgICAgICAgIHJkLCA9IElPLnNlbGVjdChbQGhhbmRsZV0sIG5pbCwgbmlsLCBAdGltZW91dCkKLSAgICAgICAgICAgIGJyZWFrIGlmIChyZCBhbmQgbm90IHJkLmVtcHR5Pykgb3IgVGltZS5ub3cgLSBzdGFydCA+PSBAdGltZW91dAorICAgICAgICAgIHRpbWVzcGVudCA9IDAKKyAgICAgICAgICByZCA9IGxvb3AgZG8KKyAgICAgICAgICAgIHJkLCA9IElPLnNlbGVjdChbQGhhbmRsZV0sIG5pbCwgbmlsLCBAdGltZW91dCAtIHRpbWVzcGVudCkKKyAgICAgICAgICAgIHRpbWVzcGVudCA9IFRpbWUubm93IC0gc3RhcnQKKyAgICAgICAgICAgIGJyZWFrIHJkIGlmIChyZCBhbmQgbm90IHJkLmVtcHR5Pykgb3IgdGltZXNwZW50ID49IEB0aW1lb3V0CiAgICAgICAgICAgZW5kCiAgICAgICAgICAgaWYgcmQubmlsPyBvciByZC5lbXB0eT8KICAgICAgICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJTb2NrZXQ6IFRpbWVkIG91dCByZWFkaW5nICN7c3p9IGJ5dGVzIGZyb20gI3tAZGVzY30iKQpAQCAtMTI5LDggKzEzNCwxMCBAQAogICAgICAgQGhhbmRsZSA9IG5pbAogICAgIGVuZAogCi0gICAgZGVmIHRvX2lvCi0gICAgICBAaGFuZGxlCisgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgInNvY2tldCgje0Bob3N0fToje0Bwb3J0fSkiCiAgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiZDVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldC5yYgpAQCAtMCwwICsxLDQxIEBACisjIGVuY29kaW5nOiBhc2NpaS04Yml0CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc29ja2V0JworCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIFNTTFNlcnZlclNvY2tldCA8IFNlcnZlclNvY2tldAorICAgIGRlZiBpbml0aWFsaXplKGhvc3Rfb3JfcG9ydCwgcG9ydCA9IG5pbCwgc3NsX2NvbnRleHQgPSBuaWwpCisgICAgICBzdXBlcihob3N0X29yX3BvcnQsIHBvcnQpCisgICAgICBAc3NsX2NvbnRleHQgPSBzc2xfY29udGV4dAorICAgIGVuZAorCisgICAgYXR0cl9hY2Nlc3NvciA6c3NsX2NvbnRleHQKKworICAgIGRlZiBsaXN0ZW4KKyAgICAgIHNvY2tldCA9IFRDUFNlcnZlci5uZXcoQGhvc3QsIEBwb3J0KQorICAgICAgQGhhbmRsZSA9IE9wZW5TU0w6OlNTTDo6U1NMU2VydmVyLm5ldyhzb2NrZXQsIEBzc2xfY29udGV4dCkKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInNzbCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiOTZhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0LnJiCkBAIC0wLDAgKzEsNTEgQEAKKyMgZW5jb2Rpbmc6IGFzY2lpLThiaXQKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIFNTTFNvY2tldCA8IFNvY2tldAorICAgIGRlZiBpbml0aWFsaXplKGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdGltZW91dD1uaWwsIHNzbF9jb250ZXh0PW5pbCkKKyAgICAgIHN1cGVyKGhvc3QsIHBvcnQsIHRpbWVvdXQpCisgICAgICBAc3NsX2NvbnRleHQgPSBzc2xfY29udGV4dAorICAgIGVuZAorCisgICAgYXR0cl9hY2Nlc3NvciA6c3NsX2NvbnRleHQKKworICAgIGRlZiBvcGVuCisgICAgICBzb2NrZXQgPSBzdXBlcgorICAgICAgQGhhbmRsZSA9IE9wZW5TU0w6OlNTTDo6U1NMU29ja2V0Lm5ldyhzb2NrZXQsIEBzc2xfY29udGV4dCkKKyAgICAgIGJlZ2luCisgICAgICAgIEBoYW5kbGUuY29ubmVjdF9ub25ibG9jaworICAgICAgICBAaGFuZGxlLnBvc3RfY29ubmVjdGlvbl9jaGVjayhAaG9zdCkKKyAgICAgICAgQGhhbmRsZQorICAgICAgcmVzY3VlIElPOjpXYWl0UmVhZGFibGUKKyAgICAgICAgSU8uc2VsZWN0KFsgQGhhbmRsZSBdLCBuaWwsIG5pbCwgQHRpbWVvdXQpCisgICAgICAgIHJldHJ5CisgICAgICByZXNjdWUgSU86OldhaXRXcml0YWJsZQorICAgICAgICBJTy5zZWxlY3QobmlsLCBbIEBoYW5kbGUgXSwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgcmV0cnkKKyAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGUKKyAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gI3tAZGVzY306ICN7ZX0iKQorICAgICAgZW5kCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzc2woI3tzdXBlci50b19zfSkiCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgppbmRleCBhMTM1ZDI1Li4wNTdkMTIyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKQEAgLTU2LDUgKzU2LDkgQEAKICAgICBlbmQKIAogICAgIGFsaWFzIHRvX2lvIGhhbmRsZQorCisgICAgZGVmIHRvX3MKKyAgICAgICJkb21haW4oI3tAcGF0aH0pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCmluZGV4IDhmNjkyZTQuLjVkZmZkNTkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKQEAgLTM2LDUgKzM2LDkgQEAKICAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IG9wZW4gVU5JWCBzb2NrZXQgYXQgI3tAcGF0aH0iKQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJkb21haW4oI3tAcGF0aH0pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdW5pb24ucmIgYi9saWIvcmIvbGliL3RocmlmdC91bmlvbi5yYgppbmRleCBhNzA1OGYyLi40OTBjNTVjIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC91bmlvbi5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC91bmlvbi5yYgpAQCAtODcsMTIgKzg3LDkgQEAKICAgICBlbmQKIAogICAgIGRlZiA9PShvdGhlcikKLSAgICAgIG90aGVyICE9IG5pbCAmJiBAc2V0ZmllbGQgPT0gb3RoZXIuZ2V0X3NldF9maWVsZCAmJiBAdmFsdWUgPT0gb3RoZXIuZ2V0X3ZhbHVlCisgICAgICBvdGhlci5lcXVhbD8oc2VsZikgfHwgb3RoZXIuaW5zdGFuY2Vfb2Y/KHNlbGYuY2xhc3MpICYmIEBzZXRmaWVsZCA9PSBvdGhlci5nZXRfc2V0X2ZpZWxkICYmIEB2YWx1ZSA9PSBvdGhlci5nZXRfdmFsdWUKICAgICBlbmQKLQotICAgIGRlZiBlcWw/KG90aGVyKQotICAgICAgc2VsZi5jbGFzcyA9PSBvdGhlci5jbGFzcyAmJiBzZWxmID09IG90aGVyCi0gICAgZW5kCisgICAgYWxpYXNfbWV0aG9kIDplcWw/LCA6PT0KIAogICAgIGRlZiBoYXNoCiAgICAgICBbc2VsZi5jbGFzcy5uYW1lLCBAc2V0ZmllbGQsIEB2YWx1ZV0uaGFzaApAQCAtMTc2LDQgKzE3Myw0IEBACiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zZXR1cC5yYiBiL2xpYi9yYi9zZXR1cC5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwYzgyNi4uMDAwMDAwMAotLS0gYS9saWIvcmIvc2V0dXAucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg1ICswLDAgQEAKLSMKLSMgc2V0dXAucmIKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2kKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuCi0jIFlvdSBjYW4gZGlzdHJpYnV0ZS9tb2RpZnkgdGhpcyBwcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZgotIyB0aGUgR05VIExHUEwsIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLgotIwotCi11bmxlc3MgRW51bWVyYWJsZS5tZXRob2RfZGVmaW5lZD8oOm1hcCkgICAjIFJ1YnkgMS40LjYKLSAgbW9kdWxlIEVudW1lcmFibGUKLSAgICBhbGlhcyBtYXAgY29sbGVjdAotICBlbmQKLWVuZAotCi11bmxlc3MgRmlsZS5yZXNwb25kX3RvPyg6cmVhZCkgICAjIFJ1YnkgMS42Ci0gIGRlZiBGaWxlLnJlYWQoZm5hbWUpCi0gICAgb3BlbihmbmFtZSkge3xmfAotICAgICAgcmV0dXJuIGYucmVhZAotICAgIH0KLSAgZW5kCi1lbmQKLQotdW5sZXNzIEVycm5vLmNvbnN0X2RlZmluZWQ/KDpFTk9URU1QVFkpICAgIyBXaW5kb3dzPwotICBtb2R1bGUgRXJybm8KLSAgICBjbGFzcyBFTk9URU1QVFkKLSAgICAgICMgV2UgZG8gbm90IHJhaXNlIHRoaXMgZXhjZXB0aW9uLCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgbmVlZGVkLgotICAgIGVuZAotICBlbmQKLWVuZAotCi1kZWYgRmlsZS5iaW5yZWFkKGZuYW1lKQotICBvcGVuKGZuYW1lLCAncmInKSB7fGZ8Ci0gICAgcmV0dXJuIGYucmVhZAotICB9Ci1lbmQKLQotIyBmb3IgY29ycnVwdGVkIFdpbmRvd3MnIHN0YXQoMikKLWRlZiBGaWxlLmRpcj8ocGF0aCkKLSAgRmlsZS5kaXJlY3Rvcnk/KChwYXRoWy0xLDFdID09ICcvJykgPyBwYXRoIDogcGF0aCArICcvJykKLWVuZAotCi0KLWNsYXNzIENvbmZpZ1RhYmxlCi0KLSAgaW5jbHVkZSBFbnVtZXJhYmxlCi0KLSAgZGVmIGluaXRpYWxpemUocmJjb25maWcpCi0gICAgQHJiY29uZmlnID0gcmJjb25maWcKLSAgICBAaXRlbXMgPSBbXQotICAgIEB0YWJsZSA9IHt9Ci0gICAgIyBvcHRpb25zCi0gICAgQGluc3RhbGxfcHJlZml4ID0gbmlsCi0gICAgQGNvbmZpZ19vcHQgPSBuaWwKLSAgICBAdmVyYm9zZSA9IHRydWUKLSAgICBAbm9faGFybSA9IGZhbHNlCi0gIGVuZAotCi0gIGF0dHJfYWNjZXNzb3IgOmluc3RhbGxfcHJlZml4Ci0gIGF0dHJfYWNjZXNzb3IgOmNvbmZpZ19vcHQKLQotICBhdHRyX3dyaXRlciA6dmVyYm9zZQotCi0gIGRlZiB2ZXJib3NlPwotICAgIEB2ZXJib3NlCi0gIGVuZAotCi0gIGF0dHJfd3JpdGVyIDpub19oYXJtCi0KLSAgZGVmIG5vX2hhcm0/Ci0gICAgQG5vX2hhcm0KLSAgZW5kCi0KLSAgZGVmIFtdKGtleSkKLSAgICBsb29rdXAoa2V5KS5yZXNvbHZlKHNlbGYpCi0gIGVuZAotCi0gIGRlZiBbXT0oa2V5LCB2YWwpCi0gICAgbG9va3VwKGtleSkuc2V0IHZhbAotICBlbmQKLQotICBkZWYgbmFtZXMKLSAgICBAaXRlbXMubWFwIHt8aXwgaS5uYW1lIH0KLSAgZW5kCi0KLSAgZGVmIGVhY2goJmJsb2NrKQotICAgIEBpdGVtcy5lYWNoKCZibG9jaykKLSAgZW5kCi0KLSAgZGVmIGtleT8obmFtZSkKLSAgICBAdGFibGUua2V5PyhuYW1lKQotICBlbmQKLQotICBkZWYgbG9va3VwKG5hbWUpCi0gICAgQHRhYmxlW25hbWVdIG9yIHNldHVwX3JiX2Vycm9yICJubyBzdWNoIGNvbmZpZyBpdGVtOiAje25hbWV9IgotICBlbmQKLQotICBkZWYgYWRkKGl0ZW0pCi0gICAgQGl0ZW1zLnB1c2ggaXRlbQotICAgIEB0YWJsZVtpdGVtLm5hbWVdID0gaXRlbQotICBlbmQKLQotICBkZWYgcmVtb3ZlKG5hbWUpCi0gICAgaXRlbSA9IGxvb2t1cChuYW1lKQotICAgIEBpdGVtcy5kZWxldGVfaWYge3xpfCBpLm5hbWUgPT0gbmFtZSB9Ci0gICAgQHRhYmxlLmRlbGV0ZV9pZiB7fG5hbWUsIGl8IGkubmFtZSA9PSBuYW1lIH0KLSAgICBpdGVtCi0gIGVuZAotCi0gIGRlZiBsb2FkX3NjcmlwdChwYXRoLCBpbnN0ID0gbmlsKQotICAgIGlmIEZpbGUuZmlsZT8ocGF0aCkKLSAgICAgIE1ldGFDb25maWdFbnZpcm9ubWVudC5uZXcoc2VsZiwgaW5zdCkuaW5zdGFuY2VfZXZhbCBGaWxlLnJlYWQocGF0aCksIHBhdGgKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHNhdmVmaWxlCi0gICAgJy5jb25maWcnCi0gIGVuZAotCi0gIGRlZiBsb2FkX3NhdmVmaWxlCi0gICAgYmVnaW4KLSAgICAgIEZpbGUuZm9yZWFjaChzYXZlZmlsZSgpKSBkbyB8bGluZXwKLSAgICAgICAgaywgdiA9ICpsaW5lLnNwbGl0KC89LywgMikKLSAgICAgICAgc2VsZltrXSA9IHYuc3RyaXAKLSAgICAgIGVuZAotICAgIHJlc2N1ZSBFcnJubzo6RU5PRU5UCi0gICAgICBzZXR1cF9yYl9lcnJvciAkIS5tZXNzYWdlICsgIlxuI3tGaWxlLmJhc2VuYW1lKCQwKX0gY29uZmlnIGZpcnN0IgotICAgIGVuZAotICBlbmQKLQotICBkZWYgc2F2ZQotICAgIEBpdGVtcy5lYWNoIHt8aXwgaS52YWx1ZSB9Ci0gICAgRmlsZS5vcGVuKHNhdmVmaWxlKCksICd3Jykge3xmfAotICAgICAgQGl0ZW1zLmVhY2ggZG8gfGl8Ci0gICAgICAgIGYucHJpbnRmICIlcz0lc1xuIiwgaS5uYW1lLCBpLnZhbHVlIGlmIGkudmFsdWU/IGFuZCBpLnZhbHVlCi0gICAgICBlbmQKLSAgICB9Ci0gIGVuZAotCi0gIGRlZiBsb2FkX3N0YW5kYXJkX2VudHJpZXMKLSAgICBzdGFuZGFyZF9lbnRyaWVzKEByYmNvbmZpZykuZWFjaCBkbyB8ZW50fAotICAgICAgYWRkIGVudAotICAgIGVuZAotICBlbmQKLQotICBkZWYgc3RhbmRhcmRfZW50cmllcyhyYmNvbmZpZykKLSAgICBjID0gcmJjb25maWcKLQotICAgIHJ1YnlwYXRoID0gRmlsZS5qb2luKGNbJ2JpbmRpciddLCBjWydydWJ5X2luc3RhbGxfbmFtZSddICsgY1snRVhFRVhUJ10pCi0KLSAgICBtYWpvciA9IGNbJ01BSk9SJ10udG9faQotICAgIG1pbm9yID0gY1snTUlOT1InXS50b19pCi0gICAgdGVlbnkgPSBjWydURUVOWSddLnRvX2kKLSAgICB2ZXJzaW9uID0gIiN7bWFqb3J9LiN7bWlub3J9IgotCi0gICAgIyBydWJ5IHZlci4gPj0gMS40LjQ/Ci0gICAgbmV3cGF0aF9wID0gKChtYWpvciA+PSAyKSBvcgotICAgICAgICAgICAgICAgICAoKG1ham9yID09IDEpIGFuZAotICAgICAgICAgICAgICAgICAgKChtaW5vciA+PSA1KSBvcgotICAgICAgICAgICAgICAgICAgICgobWlub3IgPT0gNCkgYW5kICh0ZWVueSA+PSA0KSkpKSkKLQotICAgIGlmIGNbJ3J1YnlsaWJkaXInXQotICAgICAgIyBWID4gMS42LjMKLSAgICAgIGxpYnJ1YnkgICAgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieSIKLSAgICAgIGxpYnJ1Ynl2ZXIgICAgICA9IGNbJ3J1YnlsaWJkaXInXQotICAgICAgbGlicnVieXZlcmFyY2ggID0gY1snYXJjaGRpciddCi0gICAgICBzaXRlcnVieSAgICAgICAgPSBjWydzaXRlZGlyJ10KLSAgICAgIHNpdGVydWJ5dmVyICAgICA9IGNbJ3NpdGVsaWJkaXInXQotICAgICAgc2l0ZXJ1Ynl2ZXJhcmNoID0gY1snc2l0ZWFyY2hkaXInXQotICAgIGVsc2lmIG5ld3BhdGhfcAotICAgICAgIyAxLjQuNCA8PSBWIDw9IDEuNi4zCi0gICAgICBsaWJydWJ5ICAgICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkiCi0gICAgICBsaWJydWJ5dmVyICAgICAgPSAiI3tjWydwcmVmaXgnXX0vbGliL3J1YnkvI3t2ZXJzaW9ufSIKLSAgICAgIGxpYnJ1Ynl2ZXJhcmNoICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieS8je3ZlcnNpb259LyN7Y1snYXJjaCddfSIKLSAgICAgIHNpdGVydWJ5ICAgICAgICA9IGNbJ3NpdGVkaXInXQotICAgICAgc2l0ZXJ1Ynl2ZXIgICAgID0gIiRzaXRlcnVieS8je3ZlcnNpb259IgotICAgICAgc2l0ZXJ1Ynl2ZXJhcmNoID0gIiRzaXRlcnVieXZlci8je2NbJ2FyY2gnXX0iCi0gICAgZWxzZQotICAgICAgIyBWIDwgMS40LjQKLSAgICAgIGxpYnJ1YnkgICAgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieSIKLSAgICAgIGxpYnJ1Ynl2ZXIgICAgICA9ICIje2NbJ3ByZWZpeCddfS9saWIvcnVieS8je3ZlcnNpb259IgotICAgICAgbGlicnVieXZlcmFyY2ggID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5LyN7dmVyc2lvbn0vI3tjWydhcmNoJ119IgotICAgICAgc2l0ZXJ1YnkgICAgICAgID0gIiN7Y1sncHJlZml4J119L2xpYi9ydWJ5LyN7dmVyc2lvbn0vc2l0ZV9ydWJ5IgotICAgICAgc2l0ZXJ1Ynl2ZXIgICAgID0gc2l0ZXJ1YnkKLSAgICAgIHNpdGVydWJ5dmVyYXJjaCA9ICIkc2l0ZXJ1Ynl2ZXIvI3tjWydhcmNoJ119IgotICAgIGVuZAotICAgIHBhcmFtZXRlcml6ZSA9IGxhbWJkYSB7fHBhdGh8Ci0gICAgICBwYXRoLnN1YigvXEEje1JlZ2V4cC5xdW90ZShjWydwcmVmaXgnXSl9LywgJyRwcmVmaXgnKQotICAgIH0KLQotICAgIGlmIGFyZyA9IGNbJ2NvbmZpZ3VyZV9hcmdzJ10uc3BsaXQuZGV0ZWN0IHt8YXJnfCAvLS13aXRoLW1ha2UtcHJvZz0vID1+IGFyZyB9Ci0gICAgICBtYWtlcHJvZyA9IGFyZy5zdWIoLycvLCAnJykuc3BsaXQoLz0vLCAyKVsxXQotICAgIGVsc2UKLSAgICAgIG1ha2Vwcm9nID0gJ21ha2UnCi0gICAgZW5kCi0KLSAgICBbCi0gICAgICBFeGVjSXRlbS5uZXcoJ2luc3RhbGxkaXJzJywgJ3N0ZC9zaXRlL2hvbWUnLAotICAgICAgICAgICAgICAgICAgICdzdGQ6IGluc3RhbGwgdW5kZXIgbGlicnVieTsgc2l0ZTogaW5zdGFsbCB1bmRlciBzaXRlX3J1Ynk7IGhvbWU6IGluc3RhbGwgdW5kZXIgJEhPTUUnKVwKLSAgICAgICAgICB7fHZhbCwgdGFibGV8Ci0gICAgICAgICAgICBjYXNlIHZhbAotICAgICAgICAgICAgd2hlbiAnc3RkJwotICAgICAgICAgICAgICB0YWJsZVsncmJkaXInXSA9ICckbGlicnVieXZlcicKLSAgICAgICAgICAgICAgdGFibGVbJ3NvZGlyJ10gPSAnJGxpYnJ1Ynl2ZXJhcmNoJwotICAgICAgICAgICAgd2hlbiAnc2l0ZScKLSAgICAgICAgICAgICAgdGFibGVbJ3JiZGlyJ10gPSAnJHNpdGVydWJ5dmVyJwotICAgICAgICAgICAgICB0YWJsZVsnc29kaXInXSA9ICckc2l0ZXJ1Ynl2ZXJhcmNoJwotICAgICAgICAgICAgd2hlbiAnaG9tZScKLSAgICAgICAgICAgICAgc2V0dXBfcmJfZXJyb3IgJyRIT01FIHdhcyBub3Qgc2V0JyB1bmxlc3MgRU5WWydIT01FJ10KLSAgICAgICAgICAgICAgdGFibGVbJ3ByZWZpeCddID0gRU5WWydIT01FJ10KLSAgICAgICAgICAgICAgdGFibGVbJ3JiZGlyJ10gPSAnJGxpYmRpci9ydWJ5JwotICAgICAgICAgICAgICB0YWJsZVsnc29kaXInXSA9ICckbGliZGlyL3J1YnknCi0gICAgICAgICAgICBlbmQKLSAgICAgICAgICB9LAotICAgICAgUGF0aEl0ZW0ubmV3KCdwcmVmaXgnLCAncGF0aCcsIGNbJ3ByZWZpeCddLAotICAgICAgICAgICAgICAgICAgICdwYXRoIHByZWZpeCBvZiB0YXJnZXQgZW52aXJvbm1lbnQnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnYmluZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydiaW5kaXInXSksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIGNvbW1hbmRzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2xpYmRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snbGliZGlyJ10pLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBsaWJyYXJpZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnZGF0YWRpcicsICdwYXRoJywgcGFyYW1ldGVyaXplLmNhbGwoY1snZGF0YWRpciddKSwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3Igc2hhcmVkIGRhdGEnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnbWFuZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydtYW5kaXInXSksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIG1hbiBwYWdlcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdzeXNjb25mZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydzeXNjb25mZGlyJ10pLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBzeXN0ZW0gY29uZmlndXJhdGlvbiBmaWxlcycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdsb2NhbHN0YXRlZGlyJywgJ3BhdGgnLCBwYXJhbWV0ZXJpemUuY2FsbChjWydsb2NhbHN0YXRlZGlyJ10pLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBsb2NhbCBzdGF0ZSBkYXRhJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2xpYnJ1YnknLCAncGF0aCcsIGxpYnJ1YnksCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHJ1YnkgbGlicmFyaWVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2xpYnJ1Ynl2ZXInLCAncGF0aCcsIGxpYnJ1Ynl2ZXIsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHN0YW5kYXJkIHJ1YnkgbGlicmFyaWVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ2xpYnJ1Ynl2ZXJhcmNoJywgJ3BhdGgnLCBsaWJydWJ5dmVyYXJjaCwKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3Igc3RhbmRhcmQgcnVieSBleHRlbnNpb25zJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3NpdGVydWJ5JywgJ3BhdGgnLCBzaXRlcnVieSwKLSAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgdmVyc2lvbi1pbmRlcGVuZGVudCBhdXggcnVieSBsaWJyYXJpZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnc2l0ZXJ1Ynl2ZXInLCAncGF0aCcsIHNpdGVydWJ5dmVyLAotICAgICAgICAgICAgICAgICAgICd0aGUgZGlyZWN0b3J5IGZvciBhdXggcnVieSBsaWJyYXJpZXMnKSwKLSAgICAgIFBhdGhJdGVtLm5ldygnc2l0ZXJ1Ynl2ZXJhcmNoJywgJ3BhdGgnLCBzaXRlcnVieXZlcmFyY2gsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIGF1eCBydWJ5IGJpbmFyaWVzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3JiZGlyJywgJ3BhdGgnLCAnJHNpdGVydWJ5dmVyJywKLSAgICAgICAgICAgICAgICAgICAndGhlIGRpcmVjdG9yeSBmb3IgcnVieSBzY3JpcHRzJyksCi0gICAgICBQYXRoSXRlbS5uZXcoJ3NvZGlyJywgJ3BhdGgnLCAnJHNpdGVydWJ5dmVyYXJjaCcsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBkaXJlY3RvcnkgZm9yIHJ1YnkgZXh0ZW50aW9ucycpLAotICAgICAgUGF0aEl0ZW0ubmV3KCdydWJ5cGF0aCcsICdwYXRoJywgcnVieXBhdGgsCi0gICAgICAgICAgICAgICAgICAgJ3RoZSBwYXRoIHRvIHNldCB0byAjISBsaW5lJyksCi0gICAgICBQcm9ncmFtSXRlbS5uZXcoJ3J1Ynlwcm9nJywgJ25hbWUnLCBydWJ5cGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAndGhlIHJ1YnkgcHJvZ3JhbSB1c2luZyBmb3IgaW5zdGFsbGF0aW9uJyksCi0gICAgICBQcm9ncmFtSXRlbS5uZXcoJ21ha2Vwcm9nJywgJ25hbWUnLCBtYWtlcHJvZywKLSAgICAgICAgICAgICAgICAgICAgICAndGhlIG1ha2UgcHJvZ3JhbSB0byBjb21waWxlIHJ1YnkgZXh0ZW50aW9ucycpLAotICAgICAgU2VsZWN0SXRlbS5uZXcoJ3NoZWJhbmcnLCAnYWxsL3J1YnkvbmV2ZXInLCAncnVieScsCi0gICAgICAgICAgICAgICAgICAgICAnc2hlYmFuZyBsaW5lICgjISkgZWRpdGluZyBtb2RlJyksCi0gICAgICBCb29sSXRlbS5uZXcoJ3dpdGhvdXQtZXh0JywgJ3llcy9ubycsICdubycsCi0gICAgICAgICAgICAgICAgICAgJ2RvZXMgbm90IGNvbXBpbGUvaW5zdGFsbCBydWJ5IGV4dGVudGlvbnMnKQotICAgIF0KLSAgZW5kCi0gIHByaXZhdGUgOnN0YW5kYXJkX2VudHJpZXMKLQotICBkZWYgbG9hZF9tdWx0aXBhY2thZ2VfZW50cmllcwotICAgIG11bHRpcGFja2FnZV9lbnRyaWVzKCkuZWFjaCBkbyB8ZW50fAotICAgICAgYWRkIGVudAotICAgIGVuZAotICBlbmQKLQotICBkZWYgbXVsdGlwYWNrYWdlX2VudHJpZXMKLSAgICBbCi0gICAgICBQYWNrYWdlU2VsZWN0aW9uSXRlbS5uZXcoJ3dpdGgnLCAnbmFtZSxuYW1lLi4uJywgJycsICdBTEwnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlIG5hbWVzIHRoYXQgeW91IHdhbnQgdG8gaW5zdGFsbCcpLAotICAgICAgUGFja2FnZVNlbGVjdGlvbkl0ZW0ubmV3KCd3aXRob3V0JywgJ25hbWUsbmFtZS4uLicsICcnLCAnTk9ORScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UgbmFtZXMgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gaW5zdGFsbCcpCi0gICAgXQotICBlbmQKLSAgcHJpdmF0ZSA6bXVsdGlwYWNrYWdlX2VudHJpZXMKLQotICBBTElBU0VTID0gewotICAgICdzdGQtcnVieScgICAgICAgICA9PiAnbGlicnVieXZlcicsCi0gICAgJ3N0ZHJ1YnknICAgICAgICAgID0+ICdsaWJydWJ5dmVyJywKLSAgICAncnVieWxpYmRpcicgICAgICAgPT4gJ2xpYnJ1Ynl2ZXInLAotICAgICdhcmNoZGlyJyAgICAgICAgICA9PiAnbGlicnVieXZlcmFyY2gnLAotICAgICdzaXRlLXJ1YnktY29tbW9uJyA9PiAnc2l0ZXJ1YnknLCAgICAgIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICdzaXRlLXJ1YnknICAgICAgICA9PiAnc2l0ZXJ1Ynl2ZXInLCAgIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICdiaW4tZGlyJyAgICAgICAgICA9PiAnYmluZGlyJywKLSAgICAnYmluLWRpcicgICAgICAgICAgPT4gJ2JpbmRpcicsCi0gICAgJ3JiLWRpcicgICAgICAgICAgID0+ICdyYmRpcicsCi0gICAgJ3NvLWRpcicgICAgICAgICAgID0+ICdzb2RpcicsCi0gICAgJ2RhdGEtZGlyJyAgICAgICAgID0+ICdkYXRhZGlyJywKLSAgICAncnVieS1wYXRoJyAgICAgICAgPT4gJ3J1YnlwYXRoJywKLSAgICAncnVieS1wcm9nJyAgICAgICAgPT4gJ3J1Ynlwcm9nJywKLSAgICAncnVieScgICAgICAgICAgICAgPT4gJ3J1Ynlwcm9nJywKLSAgICAnbWFrZS1wcm9nJyAgICAgICAgPT4gJ21ha2Vwcm9nJywKLSAgICAnbWFrZScgICAgICAgICAgICAgPT4gJ21ha2Vwcm9nJwotICB9Ci0KLSAgZGVmIGZpeHVwCi0gICAgQUxJQVNFUy5lYWNoIGRvIHxhbGksIG5hbWV8Ci0gICAgICBAdGFibGVbYWxpXSA9IEB0YWJsZVtuYW1lXQotICAgIGVuZAotICAgIEBpdGVtcy5mcmVlemUKLSAgICBAdGFibGUuZnJlZXplCi0gICAgQG9wdGlvbnNfcmUgPSAvXEEtLSgje0B0YWJsZS5rZXlzLmpvaW4oJ3wnKX0pKD86PSguKikpP1x6LwotICBlbmQKLQotICBkZWYgcGFyc2Vfb3B0KG9wdCkKLSAgICBtID0gQG9wdGlvbnNfcmUubWF0Y2gob3B0KSBvciBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiB1bmtub3duIG9wdGlvbiAje29wdH0iCi0gICAgbS50b19hWzEsMl0KLSAgZW5kCi0KLSAgZGVmIGRsbGV4dAotICAgIEByYmNvbmZpZ1snRExFWFQnXQotICBlbmQKLQotICBkZWYgdmFsdWVfY29uZmlnPyhuYW1lKQotICAgIGxvb2t1cChuYW1lKS52YWx1ZT8KLSAgZW5kCi0KLSAgY2xhc3MgSXRlbQotICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHRlbXBsYXRlLCBkZWZhdWx0LCBkZXNjKQotICAgICAgQG5hbWUgPSBuYW1lLmZyZWV6ZQotICAgICAgQHRlbXBsYXRlID0gdGVtcGxhdGUKLSAgICAgIEB2YWx1ZSA9IGRlZmF1bHQKLSAgICAgIEBkZWZhdWx0ID0gZGVmYXVsdAotICAgICAgQGRlc2NyaXB0aW9uID0gZGVzYwotICAgIGVuZAotCi0gICAgYXR0cl9yZWFkZXIgOm5hbWUKLSAgICBhdHRyX3JlYWRlciA6ZGVzY3JpcHRpb24KLQotICAgIGF0dHJfYWNjZXNzb3IgOmRlZmF1bHQKLSAgICBhbGlhcyBoZWxwX2RlZmF1bHQgZGVmYXVsdAotCi0gICAgZGVmIGhlbHBfb3B0Ci0gICAgICAiLS0je0BuYW1lfT0je0B0ZW1wbGF0ZX0iCi0gICAgZW5kCi0KLSAgICBkZWYgdmFsdWU/Ci0gICAgICB0cnVlCi0gICAgZW5kCi0KLSAgICBkZWYgdmFsdWUKLSAgICAgIEB2YWx1ZQotICAgIGVuZAotCi0gICAgZGVmIHJlc29sdmUodGFibGUpCi0gICAgICBAdmFsdWUuZ3N1YiglcjxcJChbXi9dKyk+KSB7IHRhYmxlWyQxXSB9Ci0gICAgZW5kCi0KLSAgICBkZWYgc2V0KHZhbCkKLSAgICAgIEB2YWx1ZSA9IGNoZWNrKHZhbCkKLSAgICBlbmQKLQotICAgIHByaXZhdGUKLQotICAgIGRlZiBjaGVjayh2YWwpCi0gICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiAtLSN7bmFtZX0gcmVxdWlyZXMgYXJndW1lbnQiIHVubGVzcyB2YWwKLSAgICAgIHZhbAotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBCb29sSXRlbSA8IEl0ZW0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdib29sJwotICAgIGVuZAotCi0gICAgZGVmIGhlbHBfb3B0Ci0gICAgICAiLS0je0BuYW1lfSIKLSAgICBlbmQKLQotICAgIHByaXZhdGUKLQotICAgIGRlZiBjaGVjayh2YWwpCi0gICAgICByZXR1cm4gJ3llcycgdW5sZXNzIHZhbAotICAgICAgY2FzZSB2YWwKLSAgICAgIHdoZW4gL1xBeShlcyk/XHovaSwgL1xBdChydWUpP1x6L2kgdGhlbiAneWVzJwotICAgICAgd2hlbiAvXEFuKG8pP1x6L2ksIC9cQWYoYWxzZSlcei9pICB0aGVuICdubycKLSAgICAgIGVsc2UKLSAgICAgICAgc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogLS0je0BuYW1lfSBhY2NlcHRzIG9ubHkgeWVzL25vIGZvciBhcmd1bWVudCIKLSAgICAgIGVuZAotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBQYXRoSXRlbSA8IEl0ZW0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdwYXRoJwotICAgIGVuZAotCi0gICAgcHJpdmF0ZQotCi0gICAgZGVmIGNoZWNrKHBhdGgpCi0gICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiAtLSN7QG5hbWV9IHJlcXVpcmVzIGFyZ3VtZW50IiAgdW5sZXNzIHBhdGgKLSAgICAgIHBhdGhbMCwxXSA9PSAnJCcgPyBwYXRoIDogRmlsZS5leHBhbmRfcGF0aChwYXRoKQotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBQcm9ncmFtSXRlbSA8IEl0ZW0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdwcm9ncmFtJwotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBTZWxlY3RJdGVtIDwgSXRlbQotICAgIGRlZiBpbml0aWFsaXplKG5hbWUsIHNlbGVjdGlvbiwgZGVmYXVsdCwgZGVzYykKLSAgICAgIHN1cGVyCi0gICAgICBAb2sgPSBzZWxlY3Rpb24uc3BsaXQoJy8nKQotICAgIGVuZAotCi0gICAgZGVmIGNvbmZpZ190eXBlCi0gICAgICAnc2VsZWN0JwotICAgIGVuZAotCi0gICAgcHJpdmF0ZQotCi0gICAgZGVmIGNoZWNrKHZhbCkKLSAgICAgIHVubGVzcyBAb2suaW5jbHVkZT8odmFsLnN0cmlwKQotICAgICAgICBzZXR1cF9yYl9lcnJvciAiY29uZmlnOiB1c2UgLS0je0BuYW1lfT0je0B0ZW1wbGF0ZX0gKCN7dmFsfSkiCi0gICAgICBlbmQKLSAgICAgIHZhbC5zdHJpcAotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBFeGVjSXRlbSA8IEl0ZW0KLSAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCBzZWxlY3Rpb24sIGRlc2MsICZibG9jaykKLSAgICAgIHN1cGVyIG5hbWUsIHNlbGVjdGlvbiwgbmlsLCBkZXNjCi0gICAgICBAb2sgPSBzZWxlY3Rpb24uc3BsaXQoJy8nKQotICAgICAgQGFjdGlvbiA9IGJsb2NrCi0gICAgZW5kCi0KLSAgICBkZWYgY29uZmlnX3R5cGUKLSAgICAgICdleGVjJwotICAgIGVuZAotCi0gICAgZGVmIHZhbHVlPwotICAgICAgZmFsc2UKLSAgICBlbmQKLQotICAgIGRlZiByZXNvbHZlKHRhYmxlKQotICAgICAgc2V0dXBfcmJfZXJyb3IgIiQje25hbWUoKX0gd3JvbmdseSB1c2VkIGFzIG9wdGlvbiB2YWx1ZSIKLSAgICBlbmQKLQotICAgIHVuZGVmIHNldAotCi0gICAgZGVmIGV2YWx1YXRlKHZhbCwgdGFibGUpCi0gICAgICB2ID0gdmFsLnN0cmlwLmRvd25jYXNlCi0gICAgICB1bmxlc3MgQG9rLmluY2x1ZGU/KHYpCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJpbnZhbGlkIG9wdGlvbiAtLSN7QG5hbWV9PSN7dmFsfSAodXNlICN7QHRlbXBsYXRlfSkiCi0gICAgICBlbmQKLSAgICAgIEBhY3Rpb24uY2FsbCB2LCB0YWJsZQotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBQYWNrYWdlU2VsZWN0aW9uSXRlbSA8IEl0ZW0KLSAgICBkZWYgaW5pdGlhbGl6ZShuYW1lLCB0ZW1wbGF0ZSwgZGVmYXVsdCwgaGVscF9kZWZhdWx0LCBkZXNjKQotICAgICAgc3VwZXIgbmFtZSwgdGVtcGxhdGUsIGRlZmF1bHQsIGRlc2MKLSAgICAgIEBoZWxwX2RlZmF1bHQgPSBoZWxwX2RlZmF1bHQKLSAgICBlbmQKLQotICAgIGF0dHJfcmVhZGVyIDpoZWxwX2RlZmF1bHQKLQotICAgIGRlZiBjb25maWdfdHlwZQotICAgICAgJ3BhY2thZ2UnCi0gICAgZW5kCi0KLSAgICBwcml2YXRlCi0KLSAgICBkZWYgY2hlY2sodmFsKQotICAgICAgdW5sZXNzIEZpbGUuZGlyPygicGFja2FnZXMvI3t2YWx9IikKLSAgICAgICAgc2V0dXBfcmJfZXJyb3IgImNvbmZpZzogbm8gc3VjaCBwYWNrYWdlOiAje3ZhbH0iCi0gICAgICBlbmQKLSAgICAgIHZhbAotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBNZXRhQ29uZmlnRW52aXJvbm1lbnQKLSAgICBkZWYgaW5pdGlhbGl6ZShjb25maWcsIGluc3RhbGxlcikKLSAgICAgIEBjb25maWcgPSBjb25maWcKLSAgICAgIEBpbnN0YWxsZXIgPSBpbnN0YWxsZXIKLSAgICBlbmQKLQotICAgIGRlZiBjb25maWdfbmFtZXMKLSAgICAgIEBjb25maWcubmFtZXMKLSAgICBlbmQKLQotICAgIGRlZiBjb25maWc/KG5hbWUpCi0gICAgICBAY29uZmlnLmtleT8obmFtZSkKLSAgICBlbmQKLQotICAgIGRlZiBib29sX2NvbmZpZz8obmFtZSkKLSAgICAgIEBjb25maWcubG9va3VwKG5hbWUpLmNvbmZpZ190eXBlID09ICdib29sJwotICAgIGVuZAotCi0gICAgZGVmIHBhdGhfY29uZmlnPyhuYW1lKQotICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuY29uZmlnX3R5cGUgPT0gJ3BhdGgnCi0gICAgZW5kCi0KLSAgICBkZWYgdmFsdWVfY29uZmlnPyhuYW1lKQotICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuY29uZmlnX3R5cGUgIT0gJ2V4ZWMnCi0gICAgZW5kCi0KLSAgICBkZWYgYWRkX2NvbmZpZyhpdGVtKQotICAgICAgQGNvbmZpZy5hZGQgaXRlbQotICAgIGVuZAotCi0gICAgZGVmIGFkZF9ib29sX2NvbmZpZyhuYW1lLCBkZWZhdWx0LCBkZXNjKQotICAgICAgQGNvbmZpZy5hZGQgQm9vbEl0ZW0ubmV3KG5hbWUsICd5ZXMvbm8nLCBkZWZhdWx0ID8gJ3llcycgOiAnbm8nLCBkZXNjKQotICAgIGVuZAotCi0gICAgZGVmIGFkZF9wYXRoX2NvbmZpZyhuYW1lLCBkZWZhdWx0LCBkZXNjKQotICAgICAgQGNvbmZpZy5hZGQgUGF0aEl0ZW0ubmV3KG5hbWUsICdwYXRoJywgZGVmYXVsdCwgZGVzYykKLSAgICBlbmQKLQotICAgIGRlZiBzZXRfY29uZmlnX2RlZmF1bHQobmFtZSwgZGVmYXVsdCkKLSAgICAgIEBjb25maWcubG9va3VwKG5hbWUpLmRlZmF1bHQgPSBkZWZhdWx0Ci0gICAgZW5kCi0KLSAgICBkZWYgcmVtb3ZlX2NvbmZpZyhuYW1lKQotICAgICAgQGNvbmZpZy5yZW1vdmUobmFtZSkKLSAgICBlbmQKLQotICAgICMgRm9yIG9ubHkgbXVsdGlwYWNrYWdlCi0gICAgZGVmIHBhY2thZ2VzCi0gICAgICByYWlzZSAnW3NldHVwLnJiIGZhdGFsXSBtdWx0aS1wYWNrYWdlIG1ldGFjb25maWcgQVBJIHBhY2thZ2VzKCkgY2FsbGVkIGZvciBzaW5nbGUtcGFja2FnZTsgY29udGFjdCBhcHBsaWNhdGlvbiBwYWNrYWdlIHZlbmRvcicgdW5sZXNzIEBpbnN0YWxsZXIKLSAgICAgIEBpbnN0YWxsZXIucGFja2FnZXMKLSAgICBlbmQKLQotICAgICMgRm9yIG9ubHkgbXVsdGlwYWNrYWdlCi0gICAgZGVmIGRlY2xhcmVfcGFja2FnZXMobGlzdCkKLSAgICAgIHJhaXNlICdbc2V0dXAucmIgZmF0YWxdIG11bHRpLXBhY2thZ2UgbWV0YWNvbmZpZyBBUEkgZGVjbGFyZV9wYWNrYWdlcygpIGNhbGxlZCBmb3Igc2luZ2xlLXBhY2thZ2U7IGNvbnRhY3QgYXBwbGljYXRpb24gcGFja2FnZSB2ZW5kb3InIHVubGVzcyBAaW5zdGFsbGVyCi0gICAgICBAaW5zdGFsbGVyLnBhY2thZ2VzID0gbGlzdAotICAgIGVuZAotICBlbmQKLQotZW5kICAgIyBjbGFzcyBDb25maWdUYWJsZQotCi0KLSMgVGhpcyBtb2R1bGUgcmVxdWlyZXM6ICN2ZXJib3NlPywgI25vX2hhcm0/Ci1tb2R1bGUgRmlsZU9wZXJhdGlvbnMKLQotICBkZWYgbWtkaXJfcChkaXJuYW1lLCBwcmVmaXggPSBuaWwpCi0gICAgZGlybmFtZSA9IHByZWZpeCArIEZpbGUuZXhwYW5kX3BhdGgoZGlybmFtZSkgaWYgcHJlZml4Ci0gICAgJHN0ZGVyci5wdXRzICJta2RpciAtcCAje2Rpcm5hbWV9IiBpZiB2ZXJib3NlPwotICAgIHJldHVybiBpZiBub19oYXJtPwotCi0gICAgIyBEb2VzIG5vdCBjaGVjayAnLycsIGl0J3MgdG9vIGFibm9ybWFsLgotICAgIGRpcnMgPSBGaWxlLmV4cGFuZF9wYXRoKGRpcm5hbWUpLnNwbGl0KCVyPCg/PS8pPikKLSAgICBpZiAvXEFbYS16XTpcei9pID1+IGRpcnNbMF0KLSAgICAgIGRpc2sgPSBkaXJzLnNoaWZ0Ci0gICAgICBkaXJzWzBdID0gZGlzayArIGRpcnNbMF0KLSAgICBlbmQKLSAgICBkaXJzLmVhY2hfaW5kZXggZG8gfGlkeHwKLSAgICAgIHBhdGggPSBkaXJzWzAuLmlkeF0uam9pbignJykKLSAgICAgIERpci5ta2RpciBwYXRoIHVubGVzcyBGaWxlLmRpcj8ocGF0aCkKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHJtX2YocGF0aCkKLSAgICAkc3RkZXJyLnB1dHMgInJtIC1mICN7cGF0aH0iIGlmIHZlcmJvc2U/Ci0gICAgcmV0dXJuIGlmIG5vX2hhcm0/Ci0gICAgZm9yY2VfcmVtb3ZlX2ZpbGUgcGF0aAotICBlbmQKLQotICBkZWYgcm1fcmYocGF0aCkKLSAgICAkc3RkZXJyLnB1dHMgInJtIC1yZiAje3BhdGh9IiBpZiB2ZXJib3NlPwotICAgIHJldHVybiBpZiBub19oYXJtPwotICAgIHJlbW92ZV90cmVlIHBhdGgKLSAgZW5kCi0KLSAgZGVmIHJlbW92ZV90cmVlKHBhdGgpCi0gICAgaWYgRmlsZS5zeW1saW5rPyhwYXRoKQotICAgICAgcmVtb3ZlX2ZpbGUgcGF0aAotICAgIGVsc2lmIEZpbGUuZGlyPyhwYXRoKQotICAgICAgcmVtb3ZlX3RyZWUwIHBhdGgKLSAgICBlbHNlCi0gICAgICBmb3JjZV9yZW1vdmVfZmlsZSBwYXRoCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiByZW1vdmVfdHJlZTAocGF0aCkKLSAgICBEaXIuZm9yZWFjaChwYXRoKSBkbyB8ZW50fAotICAgICAgbmV4dCBpZiBlbnQgPT0gJy4nCi0gICAgICBuZXh0IGlmIGVudCA9PSAnLi4nCi0gICAgICBlbnRwYXRoID0gIiN7cGF0aH0vI3tlbnR9IgotICAgICAgaWYgRmlsZS5zeW1saW5rPyhlbnRwYXRoKQotICAgICAgICByZW1vdmVfZmlsZSBlbnRwYXRoCi0gICAgICBlbHNpZiBGaWxlLmRpcj8oZW50cGF0aCkKLSAgICAgICAgcmVtb3ZlX3RyZWUwIGVudHBhdGgKLSAgICAgIGVsc2UKLSAgICAgICAgZm9yY2VfcmVtb3ZlX2ZpbGUgZW50cGF0aAotICAgICAgZW5kCi0gICAgZW5kCi0gICAgYmVnaW4KLSAgICAgIERpci5ybWRpciBwYXRoCi0gICAgcmVzY3VlIEVycm5vOjpFTk9URU1QVFkKLSAgICAgICMgZGlyZWN0b3J5IG1heSBub3QgYmUgZW1wdHkKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIG1vdmVfZmlsZShzcmMsIGRlc3QpCi0gICAgZm9yY2VfcmVtb3ZlX2ZpbGUgZGVzdAotICAgIGJlZ2luCi0gICAgICBGaWxlLnJlbmFtZSBzcmMsIGRlc3QKLSAgICByZXNjdWUKLSAgICAgIEZpbGUub3BlbihkZXN0LCAnd2InKSB7fGZ8Ci0gICAgICAgIGYud3JpdGUgRmlsZS5iaW5yZWFkKHNyYykKLSAgICAgIH0KLSAgICAgIEZpbGUuY2htb2QgRmlsZS5zdGF0KHNyYykubW9kZSwgZGVzdAotICAgICAgRmlsZS51bmxpbmsgc3JjCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBmb3JjZV9yZW1vdmVfZmlsZShwYXRoKQotICAgIGJlZ2luCi0gICAgICByZW1vdmVfZmlsZSBwYXRoCi0gICAgcmVzY3VlCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiByZW1vdmVfZmlsZShwYXRoKQotICAgIEZpbGUuY2htb2QgMDc3NywgcGF0aAotICAgIEZpbGUudW5saW5rIHBhdGgKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGwoZnJvbSwgZGVzdCwgbW9kZSwgcHJlZml4ID0gbmlsKQotICAgICRzdGRlcnIucHV0cyAiaW5zdGFsbCAje2Zyb219ICN7ZGVzdH0iIGlmIHZlcmJvc2U/Ci0gICAgcmV0dXJuIGlmIG5vX2hhcm0/Ci0KLSAgICByZWFsZGVzdCA9IHByZWZpeCA/IHByZWZpeCArIEZpbGUuZXhwYW5kX3BhdGgoZGVzdCkgOiBkZXN0Ci0gICAgcmVhbGRlc3QgPSBGaWxlLmpvaW4ocmVhbGRlc3QsIEZpbGUuYmFzZW5hbWUoZnJvbSkpIGlmIEZpbGUuZGlyPyhyZWFsZGVzdCkKLSAgICBzdHIgPSBGaWxlLmJpbnJlYWQoZnJvbSkKLSAgICBpZiBkaWZmPyhzdHIsIHJlYWxkZXN0KQotICAgICAgdmVyYm9zZV9vZmYgewotICAgICAgICBybV9mIHJlYWxkZXN0IGlmIEZpbGUuZXhpc3Q/KHJlYWxkZXN0KQotICAgICAgfQotICAgICAgRmlsZS5vcGVuKHJlYWxkZXN0LCAnd2InKSB7fGZ8Ci0gICAgICAgIGYud3JpdGUgc3RyCi0gICAgICB9Ci0gICAgICBGaWxlLmNobW9kIG1vZGUsIHJlYWxkZXN0Ci0KLSAgICAgIEZpbGUub3BlbigiI3tvYmpkaXJfcm9vdCgpfS9JbnN0YWxsZWRGaWxlcyIsICdhJykge3xmfAotICAgICAgICBpZiBwcmVmaXgKLSAgICAgICAgICBmLnB1dHMgcmVhbGRlc3Quc3ViKHByZWZpeCwgJycpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBmLnB1dHMgcmVhbGRlc3QKLSAgICAgICAgZW5kCi0gICAgICB9Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBkaWZmPyhuZXdfY29udGVudCwgcGF0aCkKLSAgICByZXR1cm4gdHJ1ZSB1bmxlc3MgRmlsZS5leGlzdD8ocGF0aCkKLSAgICBuZXdfY29udGVudCAhPSBGaWxlLmJpbnJlYWQocGF0aCkKLSAgZW5kCi0KLSAgZGVmIGNvbW1hbmQoKmFyZ3MpCi0gICAgJHN0ZGVyci5wdXRzIGFyZ3Muam9pbignICcpIGlmIHZlcmJvc2U/Ci0gICAgc3lzdGVtKCphcmdzKSBvciByYWlzZSBSdW50aW1lRXJyb3IsCi0gICAgICAgICJzeXN0ZW0oI3thcmdzLm1hcHt8YXwgYS5pbnNwZWN0IH0uam9pbignICcpfSkgZmFpbGVkIgotICBlbmQKLQotICBkZWYgcnVieSgqYXJncykKLSAgICBjb21tYW5kIGNvbmZpZygncnVieXByb2cnKSwgKmFyZ3MKLSAgZW5kCi0KLSAgZGVmIG1ha2UodGFzayA9IG5pbCkKLSAgICBjb21tYW5kKCpbY29uZmlnKCdtYWtlcHJvZycpLCB0YXNrXS5jb21wYWN0KQotICBlbmQKLQotICBkZWYgZXh0ZGlyPyhkaXIpCi0gICAgRmlsZS5leGlzdD8oIiN7ZGlyfS9NQU5JRkVTVCIpIG9yIEZpbGUuZXhpc3Q/KCIje2Rpcn0vZXh0Y29uZi5yYiIpCi0gIGVuZAotCi0gIGRlZiBmaWxlc19vZihkaXIpCi0gICAgRGlyLm9wZW4oZGlyKSB7fGR8Ci0gICAgICByZXR1cm4gZC5zZWxlY3Qge3xlbnR8IEZpbGUuZmlsZT8oIiN7ZGlyfS8je2VudH0iKSB9Ci0gICAgfQotICBlbmQKLQotICBESVJfUkVKRUNUID0gJXcoIC4gLi4gQ1ZTIFNDQ1MgUkNTIENWUy5hZG0gLnN2biApCi0KLSAgZGVmIGRpcmVjdG9yaWVzX29mKGRpcikKLSAgICBEaXIub3BlbihkaXIpIHt8ZHwKLSAgICAgIHJldHVybiBkLnNlbGVjdCB7fGVudHwgRmlsZS5kaXI/KCIje2Rpcn0vI3tlbnR9IikgfSAtIERJUl9SRUpFQ1QKLSAgICB9Ci0gIGVuZAotCi1lbmQKLQotCi0jIFRoaXMgbW9kdWxlIHJlcXVpcmVzOiAjc3JjZGlyX3Jvb3QsICNvYmpkaXJfcm9vdCwgI3JlbHBhdGgKLW1vZHVsZSBIb29rU2NyaXB0QVBJCi0KLSAgZGVmIGdldF9jb25maWcoa2V5KQotICAgIEBjb25maWdba2V5XQotICBlbmQKLQotICBhbGlhcyBjb25maWcgZ2V0X2NvbmZpZwotCi0gICMgb2Jzb2xldGU6IHVzZSBtZXRhY29uZmlnIHRvIGNoYW5nZSBjb25maWd1cmF0aW9uCi0gIGRlZiBzZXRfY29uZmlnKGtleSwgdmFsKQotICAgIEBjb25maWdba2V5XSA9IHZhbAotICBlbmQKLQotICAjCi0gICMgc3JjZGlyL29iamRpciAod29ya3Mgb25seSBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkpCi0gICMKLQotICBkZWYgY3Vycl9zcmNkaXIKLSAgICAiI3tzcmNkaXJfcm9vdCgpfS8je3JlbHBhdGgoKX0iCi0gIGVuZAotCi0gIGRlZiBjdXJyX29iamRpcgotICAgICIje29iamRpcl9yb290KCl9LyN7cmVscGF0aCgpfSIKLSAgZW5kCi0KLSAgZGVmIHNyY2ZpbGUocGF0aCkKLSAgICAiI3tjdXJyX3NyY2RpcigpfS8je3BhdGh9IgotICBlbmQKLQotICBkZWYgc3JjZXhpc3Q/KHBhdGgpCi0gICAgRmlsZS5leGlzdD8oc3JjZmlsZShwYXRoKSkKLSAgZW5kCi0KLSAgZGVmIHNyY2RpcmVjdG9yeT8ocGF0aCkKLSAgICBGaWxlLmRpcj8oc3JjZmlsZShwYXRoKSkKLSAgZW5kCi0KLSAgZGVmIHNyY2ZpbGU/KHBhdGgpCi0gICAgRmlsZS5maWxlPyhzcmNmaWxlKHBhdGgpKQotICBlbmQKLQotICBkZWYgc3JjZW50cmllcyhwYXRoID0gJy4nKQotICAgIERpci5vcGVuKCIje2N1cnJfc3JjZGlyKCl9LyN7cGF0aH0iKSB7fGR8Ci0gICAgICByZXR1cm4gZC50b19hIC0gJXcoLiAuLikKLSAgICB9Ci0gIGVuZAotCi0gIGRlZiBzcmNmaWxlcyhwYXRoID0gJy4nKQotICAgIHNyY2VudHJpZXMocGF0aCkuc2VsZWN0IHt8Zm5hbWV8Ci0gICAgICBGaWxlLmZpbGU/KEZpbGUuam9pbihjdXJyX3NyY2RpcigpLCBwYXRoLCBmbmFtZSkpCi0gICAgfQotICBlbmQKLQotICBkZWYgc3JjZGlyZWN0b3JpZXMocGF0aCA9ICcuJykKLSAgICBzcmNlbnRyaWVzKHBhdGgpLnNlbGVjdCB7fGZuYW1lfAotICAgICAgRmlsZS5kaXI/KEZpbGUuam9pbihjdXJyX3NyY2RpcigpLCBwYXRoLCBmbmFtZSkpCi0gICAgfQotICBlbmQKLQotZW5kCi0KLQotY2xhc3MgVG9wbGV2ZWxJbnN0YWxsZXIKLQotICBWZXJzaW9uICAgPSAnMy40LjEnCi0gIENvcHlyaWdodCA9ICdDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBNaW5lcm8gQW9raScKLQotICBUQVNLUyA9IFsKLSAgICBbICdhbGwnLCAgICAgICdkbyBjb25maWcsIHNldHVwLCB0aGVuIGluc3RhbGwnIF0sCi0gICAgWyAnY29uZmlnJywgICAnc2F2ZXMgeW91ciBjb25maWd1cmF0aW9ucycgXSwKLSAgICBbICdzaG93JywgICAgICdzaG93cyBjdXJyZW50IGNvbmZpZ3VyYXRpb24nIF0sCi0gICAgWyAnc2V0dXAnLCAgICAnY29tcGlsZXMgcnVieSBleHRlbnRpb25zIGFuZCBvdGhlcnMnIF0sCi0gICAgWyAnaW5zdGFsbCcsICAnaW5zdGFsbHMgZmlsZXMnIF0sCi0gICAgWyAndGVzdCcsICAgICAncnVuIGFsbCB0ZXN0cyBpbiB0ZXN0LycgXSwKLSAgICBbICdjbGVhbicsICAgICJkb2VzIGBtYWtlIGNsZWFuJyBmb3IgZWFjaCBleHRlbnRpb24iIF0sCi0gICAgWyAnZGlzdGNsZWFuJywiZG9lcyBgbWFrZSBkaXN0Y2xlYW4nIGZvciBlYWNoIGV4dGVudGlvbiIgXQotICBdCi0KLSAgZGVmIFRvcGxldmVsSW5zdGFsbGVyLmludm9rZQotICAgIGNvbmZpZyA9IENvbmZpZ1RhYmxlLm5ldyhsb2FkX3JiY29uZmlnKCkpCi0gICAgY29uZmlnLmxvYWRfc3RhbmRhcmRfZW50cmllcwotICAgIGNvbmZpZy5sb2FkX211bHRpcGFja2FnZV9lbnRyaWVzIGlmIG11bHRpcGFja2FnZT8KLSAgICBjb25maWcuZml4dXAKLSAgICBrbGFzcyA9IChtdWx0aXBhY2thZ2U/KCkgPyBUb3BsZXZlbEluc3RhbGxlck11bHRpIDogVG9wbGV2ZWxJbnN0YWxsZXIpCi0gICAga2xhc3MubmV3KEZpbGUuZGlybmFtZSgkMCksIGNvbmZpZykuaW52b2tlCi0gIGVuZAotCi0gIGRlZiBUb3BsZXZlbEluc3RhbGxlci5tdWx0aXBhY2thZ2U/Ci0gICAgRmlsZS5kaXI/KEZpbGUuZGlybmFtZSgkMCkgKyAnL3BhY2thZ2VzJykKLSAgZW5kCi0KLSAgZGVmIFRvcGxldmVsSW5zdGFsbGVyLmxvYWRfcmJjb25maWcKLSAgICBpZiBhcmcgPSBBUkdWLmRldGVjdCB7fGFyZ3wgL1xBLS1yYmNvbmZpZz0vID1+IGFyZyB9Ci0gICAgICBBUkdWLmRlbGV0ZShhcmcpCi0gICAgICBsb2FkIEZpbGUuZXhwYW5kX3BhdGgoYXJnLnNwbGl0KC89LywgMilbMV0pCi0gICAgICAkIi5wdXNoICdyYmNvbmZpZy5yYicKLSAgICBlbHNlCi0gICAgICByZXF1aXJlICdyYmNvbmZpZycKLSAgICBlbmQKLSAgICA6OkNvbmZpZzo6Q09ORklHCi0gIGVuZAotCi0gIGRlZiBpbml0aWFsaXplKGFyZGlyX3Jvb3QsIGNvbmZpZykKLSAgICBAYXJkaXIgPSBGaWxlLmV4cGFuZF9wYXRoKGFyZGlyX3Jvb3QpCi0gICAgQGNvbmZpZyA9IGNvbmZpZwotICAgICMgY2FjaGUKLSAgICBAdmFsaWRfdGFza19yZSA9IG5pbAotICBlbmQKLQotICBkZWYgY29uZmlnKGtleSkKLSAgICBAY29uZmlnW2tleV0KLSAgZW5kCi0KLSAgZGVmIGluc3BlY3QKLSAgICAiIzwje3NlbGYuY2xhc3N9ICN7X19pZF9fKCl9PiIKLSAgZW5kCi0KLSAgZGVmIGludm9rZQotICAgIHJ1bl9tZXRhY29uZmlncwotICAgIGNhc2UgdGFzayA9IHBhcnNlYXJnX2dsb2JhbCgpCi0gICAgd2hlbiBuaWwsICdhbGwnCi0gICAgICBwYXJzZWFyZ19jb25maWcKLSAgICAgIGluaXRfaW5zdGFsbGVycwotICAgICAgZXhlY19jb25maWcKLSAgICAgIGV4ZWNfc2V0dXAKLSAgICAgIGV4ZWNfaW5zdGFsbAotICAgIGVsc2UKLSAgICAgIGNhc2UgdGFzawotICAgICAgd2hlbiAnY29uZmlnJywgJ3Rlc3QnCi0gICAgICAgIDsKLSAgICAgIHdoZW4gJ2NsZWFuJywgJ2Rpc3RjbGVhbicKLSAgICAgICAgQGNvbmZpZy5sb2FkX3NhdmVmaWxlIGlmIEZpbGUuZXhpc3Q/KEBjb25maWcuc2F2ZWZpbGUpCi0gICAgICBlbHNlCi0gICAgICAgIEBjb25maWcubG9hZF9zYXZlZmlsZQotICAgICAgZW5kCi0gICAgICBfX3NlbmRfXyAicGFyc2VhcmdfI3t0YXNrfSIKLSAgICAgIGluaXRfaW5zdGFsbGVycwotICAgICAgX19zZW5kX18gImV4ZWNfI3t0YXNrfSIKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHJ1bl9tZXRhY29uZmlncwotICAgIEBjb25maWcubG9hZF9zY3JpcHQgIiN7QGFyZGlyfS9tZXRhY29uZmlnIgotICBlbmQKLQotICBkZWYgaW5pdF9pbnN0YWxsZXJzCi0gICAgQGluc3RhbGxlciA9IEluc3RhbGxlci5uZXcoQGNvbmZpZywgQGFyZGlyLCBGaWxlLmV4cGFuZF9wYXRoKCcuJykpCi0gIGVuZAotCi0gICMKLSAgIyBIb29rIFNjcmlwdCBBUEkgYmFzZXMKLSAgIwotCi0gIGRlZiBzcmNkaXJfcm9vdAotICAgIEBhcmRpcgotICBlbmQKLQotICBkZWYgb2JqZGlyX3Jvb3QKLSAgICAnLicKLSAgZW5kCi0KLSAgZGVmIHJlbHBhdGgKLSAgICAnLicKLSAgZW5kCi0KLSAgIwotICAjIE9wdGlvbiBQYXJzaW5nCi0gICMKLQotICBkZWYgcGFyc2VhcmdfZ2xvYmFsCi0gICAgd2hpbGUgYXJnID0gQVJHVi5zaGlmdAotICAgICAgY2FzZSBhcmcKLSAgICAgIHdoZW4gL1xBXHcrXHovCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJpbnZhbGlkIHRhc2s6ICN7YXJnfSIgdW5sZXNzIHZhbGlkX3Rhc2s/KGFyZykKLSAgICAgICAgcmV0dXJuIGFyZwotICAgICAgd2hlbiAnLXEnLCAnLS1xdWlldCcKLSAgICAgICAgQGNvbmZpZy52ZXJib3NlID0gZmFsc2UKLSAgICAgIHdoZW4gJy0tdmVyYm9zZScKLSAgICAgICAgQGNvbmZpZy52ZXJib3NlID0gdHJ1ZQotICAgICAgd2hlbiAnLS1oZWxwJwotICAgICAgICBwcmludF91c2FnZSAkc3Rkb3V0Ci0gICAgICAgIGV4aXQgMAotICAgICAgd2hlbiAnLS12ZXJzaW9uJwotICAgICAgICBwdXRzICIje0ZpbGUuYmFzZW5hbWUoJDApfSB2ZXJzaW9uICN7VmVyc2lvbn0iCi0gICAgICAgIGV4aXQgMAotICAgICAgd2hlbiAnLS1jb3B5cmlnaHQnCi0gICAgICAgIHB1dHMgQ29weXJpZ2h0Ci0gICAgICAgIGV4aXQgMAotICAgICAgZWxzZQotICAgICAgICBzZXR1cF9yYl9lcnJvciAidW5rbm93biBnbG9iYWwgb3B0aW9uICcje2FyZ30nIgotICAgICAgZW5kCi0gICAgZW5kCi0gICAgbmlsCi0gIGVuZAotCi0gIGRlZiB2YWxpZF90YXNrPyh0KQotICAgIHZhbGlkX3Rhc2tfcmUoKSA9fiB0Ci0gIGVuZAotCi0gIGRlZiB2YWxpZF90YXNrX3JlCi0gICAgQHZhbGlkX3Rhc2tfcmUgfHw9IC9cQSg/OiN7VEFTS1MubWFwIHt8dGFzayxkZXNjfCB0YXNrIH0uam9pbignfCcpfSlcei8KLSAgZW5kCi0KLSAgZGVmIHBhcnNlYXJnX25vX29wdGlvbnMKLSAgICB1bmxlc3MgQVJHVi5lbXB0eT8KLSAgICAgIHRhc2sgPSBjYWxsZXIoMCkuZmlyc3Quc2xpY2UoJXI8YHBhcnNlYXJnXyhcdyspJz4sIDEpCi0gICAgICBzZXR1cF9yYl9lcnJvciAiI3t0YXNrfTogdW5rbm93biBvcHRpb25zOiAje0FSR1Yuam9pbignICcpfSIKLSAgICBlbmQKLSAgZW5kCi0KLSAgYWxpYXMgcGFyc2Vhcmdfc2hvdyAgICAgICBwYXJzZWFyZ19ub19vcHRpb25zCi0gIGFsaWFzIHBhcnNlYXJnX3NldHVwICAgICAgcGFyc2Vhcmdfbm9fb3B0aW9ucwotICBhbGlhcyBwYXJzZWFyZ190ZXN0ICAgICAgIHBhcnNlYXJnX25vX29wdGlvbnMKLSAgYWxpYXMgcGFyc2VhcmdfY2xlYW4gICAgICBwYXJzZWFyZ19ub19vcHRpb25zCi0gIGFsaWFzIHBhcnNlYXJnX2Rpc3RjbGVhbiAgcGFyc2Vhcmdfbm9fb3B0aW9ucwotCi0gIGRlZiBwYXJzZWFyZ19jb25maWcKLSAgICBldmFsb3B0ID0gW10KLSAgICBzZXQgPSBbXQotICAgIEBjb25maWcuY29uZmlnX29wdCA9IFtdCi0gICAgd2hpbGUgaSA9IEFSR1Yuc2hpZnQKLSAgICAgIGlmIC9cQS0tP1x6LyA9fiBpCi0gICAgICAgIEBjb25maWcuY29uZmlnX29wdCA9IEFSR1YuZHVwCi0gICAgICAgIGJyZWFrCi0gICAgICBlbmQKLSAgICAgIG5hbWUsIHZhbHVlID0gKkBjb25maWcucGFyc2Vfb3B0KGkpCi0gICAgICBpZiBAY29uZmlnLnZhbHVlX2NvbmZpZz8obmFtZSkKLSAgICAgICAgQGNvbmZpZ1tuYW1lXSA9IHZhbHVlCi0gICAgICBlbHNlCi0gICAgICAgIGV2YWxvcHQucHVzaCBbbmFtZSwgdmFsdWVdCi0gICAgICBlbmQKLSAgICAgIHNldC5wdXNoIG5hbWUKLSAgICBlbmQKLSAgICBldmFsb3B0LmVhY2ggZG8gfG5hbWUsIHZhbHVlfAotICAgICAgQGNvbmZpZy5sb29rdXAobmFtZSkuZXZhbHVhdGUgdmFsdWUsIEBjb25maWcKLSAgICBlbmQKLSAgICAjIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQKLSAgICBzZXQuZWFjaCBkbyB8bnwKLSAgICAgIEBjb25maWdbbl0gaWYgQGNvbmZpZy52YWx1ZV9jb25maWc/KG4pCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBwYXJzZWFyZ19pbnN0YWxsCi0gICAgQGNvbmZpZy5ub19oYXJtID0gZmFsc2UKLSAgICBAY29uZmlnLmluc3RhbGxfcHJlZml4ID0gJycKLSAgICB3aGlsZSBhID0gQVJHVi5zaGlmdAotICAgICAgY2FzZSBhCi0gICAgICB3aGVuICctLW5vLWhhcm0nCi0gICAgICAgIEBjb25maWcubm9faGFybSA9IHRydWUKLSAgICAgIHdoZW4gL1xBLS1wcmVmaXg9LwotICAgICAgICBwYXRoID0gYS5zcGxpdCgvPS8sIDIpWzFdCi0gICAgICAgIHBhdGggPSBGaWxlLmV4cGFuZF9wYXRoKHBhdGgpIHVubGVzcyBwYXRoWzAsMV0gPT0gJy8nCi0gICAgICAgIEBjb25maWcuaW5zdGFsbF9wcmVmaXggPSBwYXRoCi0gICAgICBlbHNlCi0gICAgICAgIHNldHVwX3JiX2Vycm9yICJpbnN0YWxsOiB1bmtub3duIG9wdGlvbiAje2F9IgotICAgICAgZW5kCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBwcmludF91c2FnZShvdXQpCi0gICAgb3V0LnB1dHMgJ1R5cGljYWwgSW5zdGFsbGF0aW9uIFByb2NlZHVyZTonCi0gICAgb3V0LnB1dHMgIiAgJCBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gY29uZmlnIgotICAgIG91dC5wdXRzICIgICQgcnVieSAje0ZpbGUuYmFzZW5hbWUgJDB9IHNldHVwIgotICAgIG91dC5wdXRzICIgICMgcnVieSAje0ZpbGUuYmFzZW5hbWUgJDB9IGluc3RhbGwgKG1heSByZXF1aXJlIHJvb3QgcHJpdmlsZWdlKSIKLSAgICBvdXQucHV0cwotICAgIG91dC5wdXRzICdEZXRhaWxlZCBVc2FnZTonCi0gICAgb3V0LnB1dHMgIiAgcnVieSAje0ZpbGUuYmFzZW5hbWUgJDB9IDxnbG9iYWwgb3B0aW9uPiIKLSAgICBvdXQucHV0cyAiICBydWJ5ICN7RmlsZS5iYXNlbmFtZSAkMH0gWzxnbG9iYWwgb3B0aW9ucz5dIDx0YXNrPiBbPHRhc2sgb3B0aW9ucz5dIgotCi0gICAgZm10ID0gIiAgJS0yNHMgJXNcbiIKLSAgICBvdXQucHV0cwotICAgIG91dC5wdXRzICdHbG9iYWwgb3B0aW9uczonCi0gICAgb3V0LnByaW50ZiBmbXQsICctcSwtLXF1aWV0JywgICAnc3VwcHJlc3MgbWVzc2FnZSBvdXRwdXRzJwotICAgIG91dC5wcmludGYgZm10LCAnICAgLS12ZXJib3NlJywgJ291dHB1dCBtZXNzYWdlcyB2ZXJib3NlbHknCi0gICAgb3V0LnByaW50ZiBmbXQsICcgICAtLWhlbHAnLCAgICAncHJpbnQgdGhpcyBtZXNzYWdlJwotICAgIG91dC5wcmludGYgZm10LCAnICAgLS12ZXJzaW9uJywgJ3ByaW50IHZlcnNpb24gYW5kIHF1aXQnCi0gICAgb3V0LnByaW50ZiBmbXQsICcgICAtLWNvcHlyaWdodCcsICAncHJpbnQgY29weXJpZ2h0IGFuZCBxdWl0JwotICAgIG91dC5wdXRzCi0gICAgb3V0LnB1dHMgJ1Rhc2tzOicKLSAgICBUQVNLUy5lYWNoIGRvIHxuYW1lLCBkZXNjfAotICAgICAgb3V0LnByaW50ZiBmbXQsIG5hbWUsIGRlc2MKLSAgICBlbmQKLQotICAgIGZtdCA9ICIgICUtMjRzICVzIFslc11cbiIKLSAgICBvdXQucHV0cwotICAgIG91dC5wdXRzICdPcHRpb25zIGZvciBDT05GSUcgb3IgQUxMOicKLSAgICBAY29uZmlnLmVhY2ggZG8gfGl0ZW18Ci0gICAgICBvdXQucHJpbnRmIGZtdCwgaXRlbS5oZWxwX29wdCwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5oZWxwX2RlZmF1bHQKLSAgICBlbmQKLSAgICBvdXQucHJpbnRmIGZtdCwgJy0tcmJjb25maWc9cGF0aCcsICdyYmNvbmZpZy5yYiB0byBsb2FkJywicnVubmluZyBydWJ5J3MiCi0gICAgb3V0LnB1dHMKLSAgICBvdXQucHV0cyAnT3B0aW9ucyBmb3IgSU5TVEFMTDonCi0gICAgb3V0LnByaW50ZiBmbXQsICctLW5vLWhhcm0nLCAnb25seSBkaXNwbGF5IHdoYXQgdG8gZG8gaWYgZ2l2ZW4nLCAnb2ZmJwotICAgIG91dC5wcmludGYgZm10LCAnLS1wcmVmaXg9cGF0aCcsICAnaW5zdGFsbCBwYXRoIHByZWZpeCcsICcnCi0gICAgb3V0LnB1dHMKLSAgZW5kCi0KLSAgIwotICAjIFRhc2sgSGFuZGxlcnMKLSAgIwotCi0gIGRlZiBleGVjX2NvbmZpZwotICAgIEBpbnN0YWxsZXIuZXhlY19jb25maWcKLSAgICBAY29uZmlnLnNhdmUgICAjIG11c3QgYmUgZmluYWwKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfc2V0dXAKLSAgICBAaW5zdGFsbGVyLmV4ZWNfc2V0dXAKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfaW5zdGFsbAotICAgIEBpbnN0YWxsZXIuZXhlY19pbnN0YWxsCi0gIGVuZAotCi0gIGRlZiBleGVjX3Rlc3QKLSAgICBAaW5zdGFsbGVyLmV4ZWNfdGVzdAotICBlbmQKLQotICBkZWYgZXhlY19zaG93Ci0gICAgQGNvbmZpZy5lYWNoIGRvIHxpfAotICAgICAgcHJpbnRmICIlLTIwcyAlc1xuIiwgaS5uYW1lLCBpLnZhbHVlIGlmIGkudmFsdWU/Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiBleGVjX2NsZWFuCi0gICAgQGluc3RhbGxlci5leGVjX2NsZWFuCi0gIGVuZAotCi0gIGRlZiBleGVjX2Rpc3RjbGVhbgotICAgIEBpbnN0YWxsZXIuZXhlY19kaXN0Y2xlYW4KLSAgZW5kCi0KLWVuZCAgICMgY2xhc3MgVG9wbGV2ZWxJbnN0YWxsZXIKLQotCi1jbGFzcyBUb3BsZXZlbEluc3RhbGxlck11bHRpIDwgVG9wbGV2ZWxJbnN0YWxsZXIKLQotICBpbmNsdWRlIEZpbGVPcGVyYXRpb25zCi0KLSAgZGVmIGluaXRpYWxpemUoYXJkaXJfcm9vdCwgY29uZmlnKQotICAgIHN1cGVyCi0gICAgQHBhY2thZ2VzID0gZGlyZWN0b3JpZXNfb2YoIiN7QGFyZGlyfS9wYWNrYWdlcyIpCi0gICAgcmFpc2UgJ25vIHBhY2thZ2UgZXhpc3RzJyBpZiBAcGFja2FnZXMuZW1wdHk/Ci0gICAgQHJvb3RfaW5zdGFsbGVyID0gSW5zdGFsbGVyLm5ldyhAY29uZmlnLCBAYXJkaXIsIEZpbGUuZXhwYW5kX3BhdGgoJy4nKSkKLSAgZW5kCi0KLSAgZGVmIHJ1bl9tZXRhY29uZmlncwotICAgIEBjb25maWcubG9hZF9zY3JpcHQgIiN7QGFyZGlyfS9tZXRhY29uZmlnIiwgc2VsZgotICAgIEBwYWNrYWdlcy5lYWNoIGRvIHxuYW1lfAotICAgICAgQGNvbmZpZy5sb2FkX3NjcmlwdCAiI3tAYXJkaXJ9L3BhY2thZ2VzLyN7bmFtZX0vbWV0YWNvbmZpZyIKLSAgICBlbmQKLSAgZW5kCi0KLSAgYXR0cl9yZWFkZXIgOnBhY2thZ2VzCi0KLSAgZGVmIHBhY2thZ2VzPShsaXN0KQotICAgIHJhaXNlICdwYWNrYWdlIGxpc3QgaXMgZW1wdHknIGlmIGxpc3QuZW1wdHk/Ci0gICAgbGlzdC5lYWNoIGRvIHxuYW1lfAotICAgICAgcmFpc2UgImRpcmVjdG9yeSBwYWNrYWdlcy8je25hbWV9IGRvZXMgbm90IGV4aXN0IlwKLSAgICAgICAgICAgICAgdW5sZXNzIEZpbGUuZGlyPygiI3tAYXJkaXJ9L3BhY2thZ2VzLyN7bmFtZX0iKQotICAgIGVuZAotICAgIEBwYWNrYWdlcyA9IGxpc3QKLSAgZW5kCi0KLSAgZGVmIGluaXRfaW5zdGFsbGVycwotICAgIEBpbnN0YWxsZXJzID0ge30KLSAgICBAcGFja2FnZXMuZWFjaCBkbyB8cGFja3wKLSAgICAgIEBpbnN0YWxsZXJzW3BhY2tdID0gSW5zdGFsbGVyLm5ldyhAY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiN7QGFyZGlyfS9wYWNrYWdlcy8je3BhY2t9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlcy8je3BhY2t9IikKLSAgICBlbmQKLSAgICB3aXRoICAgID0gZXh0cmFjdF9zZWxlY3Rpb24oY29uZmlnKCd3aXRoJykpCi0gICAgd2l0aG91dCA9IGV4dHJhY3Rfc2VsZWN0aW9uKGNvbmZpZygnd2l0aG91dCcpKQotICAgIEBzZWxlY3RlZCA9IEBpbnN0YWxsZXJzLmtleXMuc2VsZWN0IHt8bmFtZXwKLSAgICAgICAgICAgICAgICAgICh3aXRoLmVtcHR5PyBvciB3aXRoLmluY2x1ZGU/KG5hbWUpKSBcCi0gICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCB3aXRob3V0LmluY2x1ZGU/KG5hbWUpCi0gICAgICAgICAgICAgICAgfQotICBlbmQKLQotICBkZWYgZXh0cmFjdF9zZWxlY3Rpb24obGlzdCkKLSAgICBhID0gbGlzdC5zcGxpdCgvLC8pCi0gICAgYS5lYWNoIGRvIHxuYW1lfAotICAgICAgc2V0dXBfcmJfZXJyb3IgIm5vIHN1Y2ggcGFja2FnZTogI3tuYW1lfSIgIHVubGVzcyBAaW5zdGFsbGVycy5rZXk/KG5hbWUpCi0gICAgZW5kCi0gICAgYQotICBlbmQKLQotICBkZWYgcHJpbnRfdXNhZ2UoZikKLSAgICBzdXBlcgotICAgIGYucHV0cyAnSW5sdWRlZCBwYWNrYWdlczonCi0gICAgZi5wdXRzICcgICcgKyBAcGFja2FnZXMuc29ydC5qb2luKCcgJykKLSAgICBmLnB1dHMKLSAgZW5kCi0KLSAgIwotICAjIFRhc2sgSGFuZGxlcnMKLSAgIwotCi0gIGRlZiBleGVjX2NvbmZpZwotICAgIHJ1bl9ob29rICdwcmUtY29uZmlnJwotICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY19jb25maWcgfQotICAgIHJ1bl9ob29rICdwb3N0LWNvbmZpZycKLSAgICBAY29uZmlnLnNhdmUgICAjIG11c3QgYmUgZmluYWwKLSAgZW5kCi0KLSAgZGVmIGV4ZWNfc2V0dXAKLSAgICBydW5faG9vayAncHJlLXNldHVwJwotICAgIGVhY2hfc2VsZWN0ZWRfaW5zdGFsbGVycyB7fGluc3R8IGluc3QuZXhlY19zZXR1cCB9Ci0gICAgcnVuX2hvb2sgJ3Bvc3Qtc2V0dXAnCi0gIGVuZAotCi0gIGRlZiBleGVjX2luc3RhbGwKLSAgICBydW5faG9vayAncHJlLWluc3RhbGwnCi0gICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX2luc3RhbGwgfQotICAgIHJ1bl9ob29rICdwb3N0LWluc3RhbGwnCi0gIGVuZAotCi0gIGRlZiBleGVjX3Rlc3QKLSAgICBydW5faG9vayAncHJlLXRlc3QnCi0gICAgZWFjaF9zZWxlY3RlZF9pbnN0YWxsZXJzIHt8aW5zdHwgaW5zdC5leGVjX3Rlc3QgfQotICAgIHJ1bl9ob29rICdwb3N0LXRlc3QnCi0gIGVuZAotCi0gIGRlZiBleGVjX2NsZWFuCi0gICAgcm1fZiBAY29uZmlnLnNhdmVmaWxlCi0gICAgcnVuX2hvb2sgJ3ByZS1jbGVhbicKLSAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfY2xlYW4gfQotICAgIHJ1bl9ob29rICdwb3N0LWNsZWFuJwotICBlbmQKLQotICBkZWYgZXhlY19kaXN0Y2xlYW4KLSAgICBybV9mIEBjb25maWcuc2F2ZWZpbGUKLSAgICBydW5faG9vayAncHJlLWRpc3RjbGVhbicKLSAgICBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMge3xpbnN0fCBpbnN0LmV4ZWNfZGlzdGNsZWFuIH0KLSAgICBydW5faG9vayAncG9zdC1kaXN0Y2xlYW4nCi0gIGVuZAotCi0gICMKLSAgIyBsaWIKLSAgIwotCi0gIGRlZiBlYWNoX3NlbGVjdGVkX2luc3RhbGxlcnMKLSAgICBEaXIubWtkaXIgJ3BhY2thZ2VzJyB1bmxlc3MgRmlsZS5kaXI/KCdwYWNrYWdlcycpCi0gICAgQHNlbGVjdGVkLmVhY2ggZG8gfHBhY2t8Ci0gICAgICAkc3RkZXJyLnB1dHMgIlByb2Nlc3NpbmcgdGhlIHBhY2thZ2UgYCN7cGFja30nIC4uLiIgaWYgdmVyYm9zZT8KLSAgICAgIERpci5ta2RpciAicGFja2FnZXMvI3twYWNrfSIgdW5sZXNzIEZpbGUuZGlyPygicGFja2FnZXMvI3twYWNrfSIpCi0gICAgICBEaXIuY2hkaXIgInBhY2thZ2VzLyN7cGFja30iCi0gICAgICB5aWVsZCBAaW5zdGFsbGVyc1twYWNrXQotICAgICAgRGlyLmNoZGlyICcuLi8uLicKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHJ1bl9ob29rKGlkKQotICAgIEByb290X2luc3RhbGxlci5ydW5faG9vayBpZAotICBlbmQKLQotICAjIG1vZHVsZSBGaWxlT3BlcmF0aW9ucyByZXF1aXJlcyB0aGlzCi0gIGRlZiB2ZXJib3NlPwotICAgIEBjb25maWcudmVyYm9zZT8KLSAgZW5kCi0KLSAgIyBtb2R1bGUgRmlsZU9wZXJhdGlvbnMgcmVxdWlyZXMgdGhpcwotICBkZWYgbm9faGFybT8KLSAgICBAY29uZmlnLm5vX2hhcm0/Ci0gIGVuZAotCi1lbmQgICAjIGNsYXNzIFRvcGxldmVsSW5zdGFsbGVyTXVsdGkKLQotCi1jbGFzcyBJbnN0YWxsZXIKLQotICBGSUxFVFlQRVMgPSAldyggYmluIGxpYiBleHQgZGF0YSBjb25mIG1hbiApCi0KLSAgaW5jbHVkZSBGaWxlT3BlcmF0aW9ucwotICBpbmNsdWRlIEhvb2tTY3JpcHRBUEkKLQotICBkZWYgaW5pdGlhbGl6ZShjb25maWcsIHNyY3Jvb3QsIG9ianJvb3QpCi0gICAgQGNvbmZpZyA9IGNvbmZpZwotICAgIEBzcmNkaXIgPSBGaWxlLmV4cGFuZF9wYXRoKHNyY3Jvb3QpCi0gICAgQG9iamRpciA9IEZpbGUuZXhwYW5kX3BhdGgob2Jqcm9vdCkKLSAgICBAY3VycmRpciA9ICcuJwotICBlbmQKLQotICBkZWYgaW5zcGVjdAotICAgICIjPCN7c2VsZi5jbGFzc30gI3tGaWxlLmJhc2VuYW1lKEBzcmNkaXIpfT4iCi0gIGVuZAotCi0gIGRlZiBub29wKHJlbCkKLSAgZW5kCi0KLSAgIwotICAjIEhvb2sgU2NyaXB0IEFQSSBiYXNlIG1ldGhvZHMKLSAgIwotCi0gIGRlZiBzcmNkaXJfcm9vdAotICAgIEBzcmNkaXIKLSAgZW5kCi0KLSAgZGVmIG9iamRpcl9yb290Ci0gICAgQG9iamRpcgotICBlbmQKLQotICBkZWYgcmVscGF0aAotICAgIEBjdXJyZGlyCi0gIGVuZAotCi0gICMKLSAgIyBDb25maWcgQWNjZXNzCi0gICMKLQotICAjIG1vZHVsZSBGaWxlT3BlcmF0aW9ucyByZXF1aXJlcyB0aGlzCi0gIGRlZiB2ZXJib3NlPwotICAgIEBjb25maWcudmVyYm9zZT8KLSAgZW5kCi0KLSAgIyBtb2R1bGUgRmlsZU9wZXJhdGlvbnMgcmVxdWlyZXMgdGhpcwotICBkZWYgbm9faGFybT8KLSAgICBAY29uZmlnLm5vX2hhcm0/Ci0gIGVuZAotCi0gIGRlZiB2ZXJib3NlX29mZgotICAgIGJlZ2luCi0gICAgICBzYXZlLCBAY29uZmlnLnZlcmJvc2UgPSBAY29uZmlnLnZlcmJvc2U/LCBmYWxzZQotICAgICAgeWllbGQKLSAgICBlbnN1cmUKLSAgICAgIEBjb25maWcudmVyYm9zZSA9IHNhdmUKLSAgICBlbmQKLSAgZW5kCi0KLSAgIwotICAjIFRBU0sgY29uZmlnCi0gICMKLQotICBkZWYgZXhlY19jb25maWcKLSAgICBleGVjX3Rhc2tfdHJhdmVyc2UgJ2NvbmZpZycKLSAgZW5kCi0KLSAgYWxpYXMgY29uZmlnX2Rpcl9iaW4gbm9vcAotICBhbGlhcyBjb25maWdfZGlyX2xpYiBub29wCi0KLSAgZGVmIGNvbmZpZ19kaXJfZXh0KHJlbCkKLSAgICBleHRjb25mIGlmIGV4dGRpcj8oY3Vycl9zcmNkaXIoKSkKLSAgZW5kCi0KLSAgYWxpYXMgY29uZmlnX2Rpcl9kYXRhIG5vb3AKLSAgYWxpYXMgY29uZmlnX2Rpcl9jb25mIG5vb3AKLSAgYWxpYXMgY29uZmlnX2Rpcl9tYW4gbm9vcAotCi0gIGRlZiBleHRjb25mCi0gICAgcnVieSAiI3tjdXJyX3NyY2RpcigpfS9leHRjb25mLnJiIiwgKkBjb25maWcuY29uZmlnX29wdAotICBlbmQKLQotICAjCi0gICMgVEFTSyBzZXR1cAotICAjCi0KLSAgZGVmIGV4ZWNfc2V0dXAKLSAgICBleGVjX3Rhc2tfdHJhdmVyc2UgJ3NldHVwJwotICBlbmQKLQotICBkZWYgc2V0dXBfZGlyX2JpbihyZWwpCi0gICAgZmlsZXNfb2YoY3Vycl9zcmNkaXIoKSkuZWFjaCBkbyB8Zm5hbWV8Ci0gICAgICB1cGRhdGVfc2hlYmFuZ19saW5lICIje2N1cnJfc3JjZGlyKCl9LyN7Zm5hbWV9IgotICAgIGVuZAotICBlbmQKLQotICBhbGlhcyBzZXR1cF9kaXJfbGliIG5vb3AKLQotICBkZWYgc2V0dXBfZGlyX2V4dChyZWwpCi0gICAgbWFrZSBpZiBleHRkaXI/KGN1cnJfc3JjZGlyKCkpCi0gIGVuZAotCi0gIGFsaWFzIHNldHVwX2Rpcl9kYXRhIG5vb3AKLSAgYWxpYXMgc2V0dXBfZGlyX2NvbmYgbm9vcAotICBhbGlhcyBzZXR1cF9kaXJfbWFuIG5vb3AKLQotICBkZWYgdXBkYXRlX3NoZWJhbmdfbGluZShwYXRoKQotICAgIHJldHVybiBpZiBub19oYXJtPwotICAgIHJldHVybiBpZiBjb25maWcoJ3NoZWJhbmcnKSA9PSAnbmV2ZXInCi0gICAgb2xkID0gU2hlYmFuZy5sb2FkKHBhdGgpCi0gICAgaWYgb2xkCi0gICAgICAkc3RkZXJyLnB1dHMgIndhcm5pbmc6ICN7cGF0aH06IFNoZWJhbmcgbGluZSBpbmNsdWRlcyB0b28gbWFueSBhcmdzLiAgSXQgaXMgbm90IHBvcnRhYmxlIGFuZCB5b3VyIHByb2dyYW0gbWF5IG5vdCB3b3JrLiIgaWYgb2xkLmFyZ3Muc2l6ZSA+IDEKLSAgICAgIG5ldyA9IG5ld19zaGViYW5nKG9sZCkKLSAgICAgIHJldHVybiBpZiBuZXcudG9fcyA9PSBvbGQudG9fcwotICAgIGVsc2UKLSAgICAgIHJldHVybiB1bmxlc3MgY29uZmlnKCdzaGViYW5nJykgPT0gJ2FsbCcKLSAgICAgIG5ldyA9IFNoZWJhbmcubmV3KGNvbmZpZygncnVieXBhdGgnKSkKLSAgICBlbmQKLSAgICAkc3RkZXJyLnB1dHMgInVwZGF0aW5nIHNoZWJhbmc6ICN7RmlsZS5iYXNlbmFtZShwYXRoKX0iIGlmIHZlcmJvc2U/Ci0gICAgb3Blbl9hdG9taWNfd3JpdGVyKHBhdGgpIHt8b3V0cHV0fAotICAgICAgRmlsZS5vcGVuKHBhdGgsICdyYicpIHt8ZnwKLSAgICAgICAgZi5nZXRzIGlmIG9sZCAgICMgZGlzY2FyZAotICAgICAgICBvdXRwdXQucHV0cyBuZXcudG9fcwotICAgICAgICBvdXRwdXQucHJpbnQgZi5yZWFkCi0gICAgICB9Ci0gICAgfQotICBlbmQKLQotICBkZWYgbmV3X3NoZWJhbmcob2xkKQotICAgIGlmIC9cQXJ1YnkvID1+IEZpbGUuYmFzZW5hbWUob2xkLmNtZCkKLSAgICAgIFNoZWJhbmcubmV3KGNvbmZpZygncnVieXBhdGgnKSwgb2xkLmFyZ3MpCi0gICAgZWxzaWYgRmlsZS5iYXNlbmFtZShvbGQuY21kKSA9PSAnZW52JyBhbmQgb2xkLmFyZ3MuZmlyc3QgPT0gJ3J1YnknCi0gICAgICBTaGViYW5nLm5ldyhjb25maWcoJ3J1YnlwYXRoJyksIG9sZC5hcmdzWzEuLi0xXSkKLSAgICBlbHNlCi0gICAgICByZXR1cm4gb2xkIHVubGVzcyBjb25maWcoJ3NoZWJhbmcnKSA9PSAnYWxsJwotICAgICAgU2hlYmFuZy5uZXcoY29uZmlnKCdydWJ5cGF0aCcpKQotICAgIGVuZAotICBlbmQKLQotICBkZWYgb3Blbl9hdG9taWNfd3JpdGVyKHBhdGgsICZibG9jaykKLSAgICB0bXBmaWxlID0gRmlsZS5iYXNlbmFtZShwYXRoKSArICcudG1wJwotICAgIGJlZ2luCi0gICAgICBGaWxlLm9wZW4odG1wZmlsZSwgJ3diJywgJmJsb2NrKQotICAgICAgRmlsZS5yZW5hbWUgdG1wZmlsZSwgRmlsZS5iYXNlbmFtZShwYXRoKQotICAgIGVuc3VyZQotICAgICAgRmlsZS51bmxpbmsgdG1wZmlsZSBpZiBGaWxlLmV4aXN0Pyh0bXBmaWxlKQotICAgIGVuZAotICBlbmQKLQotICBjbGFzcyBTaGViYW5nCi0gICAgZGVmIFNoZWJhbmcubG9hZChwYXRoKQotICAgICAgbGluZSA9IG5pbAotICAgICAgRmlsZS5vcGVuKHBhdGgpIHt8ZnwKLSAgICAgICAgbGluZSA9IGYuZ2V0cwotICAgICAgfQotICAgICAgcmV0dXJuIG5pbCB1bmxlc3MgL1xBIyEvID1+IGxpbmUKLSAgICAgIHBhcnNlKGxpbmUpCi0gICAgZW5kCi0KLSAgICBkZWYgU2hlYmFuZy5wYXJzZShsaW5lKQotICAgICAgY21kLCAqYXJncyA9ICpsaW5lLnN0cmlwLnN1YigvXEFcIyEvLCAnJykuc3BsaXQoJyAnKQotICAgICAgbmV3KGNtZCwgYXJncykKLSAgICBlbmQKLQotICAgIGRlZiBpbml0aWFsaXplKGNtZCwgYXJncyA9IFtdKQotICAgICAgQGNtZCA9IGNtZAotICAgICAgQGFyZ3MgPSBhcmdzCi0gICAgZW5kCi0KLSAgICBhdHRyX3JlYWRlciA6Y21kCi0gICAgYXR0cl9yZWFkZXIgOmFyZ3MKLQotICAgIGRlZiB0b19zCi0gICAgICAiIyEgI3tAY21kfSIgKyAoQGFyZ3MuZW1wdHk/ID8gJycgOiAiICN7QGFyZ3Muam9pbignICcpfSIpCi0gICAgZW5kCi0gIGVuZAotCi0gICMKLSAgIyBUQVNLIGluc3RhbGwKLSAgIwotCi0gIGRlZiBleGVjX2luc3RhbGwKLSAgICBybV9mICdJbnN0YWxsZWRGaWxlcycKLSAgICBleGVjX3Rhc2tfdHJhdmVyc2UgJ2luc3RhbGwnCi0gIGVuZAotCi0gIGRlZiBpbnN0YWxsX2Rpcl9iaW4ocmVsKQotICAgIGluc3RhbGxfZmlsZXMgdGFyZ2V0ZmlsZXMoKSwgIiN7Y29uZmlnKCdiaW5kaXInKX0vI3tyZWx9IiwgMDc1NQotICBlbmQKLQotICBkZWYgaW5zdGFsbF9kaXJfbGliKHJlbCkKLSAgICBpbnN0YWxsX2ZpbGVzIGxpYmZpbGVzKCksICIje2NvbmZpZygncmJkaXInKX0vI3tyZWx9IiwgMDY0NAotICBlbmQKLQotICBkZWYgaW5zdGFsbF9kaXJfZXh0KHJlbCkKLSAgICByZXR1cm4gdW5sZXNzIGV4dGRpcj8oY3Vycl9zcmNkaXIoKSkKLSAgICBpbnN0YWxsX2ZpbGVzIHJ1YnlleHRlbnRpb25zKCcuJyksCi0gICAgICAgICAgICAgICAgICAiI3tjb25maWcoJ3NvZGlyJyl9LyN7RmlsZS5kaXJuYW1lKHJlbCl9IiwKLSAgICAgICAgICAgICAgICAgIDA1NTUKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZGlyX2RhdGEocmVsKQotICAgIGluc3RhbGxfZmlsZXMgdGFyZ2V0ZmlsZXMoKSwgIiN7Y29uZmlnKCdkYXRhZGlyJyl9LyN7cmVsfSIsIDA2NDQKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZGlyX2NvbmYocmVsKQotICAgICMgRklYTUU6IHNob3VsZCBub3QgcmVtb3ZlIGN1cnJlbnQgY29uZmlnIGZpbGVzCi0gICAgIyAocmVuYW1lIHByZXZpb3VzIGZpbGUgdG8gLm9sZC8ub3JnKQotICAgIGluc3RhbGxfZmlsZXMgdGFyZ2V0ZmlsZXMoKSwgIiN7Y29uZmlnKCdzeXNjb25mZGlyJyl9LyN7cmVsfSIsIDA2NDQKLSAgZW5kCi0KLSAgZGVmIGluc3RhbGxfZGlyX21hbihyZWwpCi0gICAgaW5zdGFsbF9maWxlcyB0YXJnZXRmaWxlcygpLCAiI3tjb25maWcoJ21hbmRpcicpfS8je3JlbH0iLCAwNjQ0Ci0gIGVuZAotCi0gIGRlZiBpbnN0YWxsX2ZpbGVzKGxpc3QsIGRlc3QsIG1vZGUpCi0gICAgbWtkaXJfcCBkZXN0LCBAY29uZmlnLmluc3RhbGxfcHJlZml4Ci0gICAgbGlzdC5lYWNoIGRvIHxmbmFtZXwKLSAgICAgIGluc3RhbGwgZm5hbWUsIGRlc3QsIG1vZGUsIEBjb25maWcuaW5zdGFsbF9wcmVmaXgKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIGxpYmZpbGVzCi0gICAgZ2xvYl9yZWplY3QoJXcoKi55ICoub3V0cHV0KSwgdGFyZ2V0ZmlsZXMoKSkKLSAgZW5kCi0KLSAgZGVmIHJ1YnlleHRlbnRpb25zKGRpcikKLSAgICBlbnRzID0gZ2xvYl9zZWxlY3QoIiouI3tAY29uZmlnLmRsbGV4dH0iLCB0YXJnZXRmaWxlcygpKQotICAgIGlmIGVudHMuZW1wdHk/Ci0gICAgICBzZXR1cF9yYl9lcnJvciAibm8gcnVieSBleHRlbnRpb24gZXhpc3RzOiAncnVieSAjeyQwfSBzZXR1cCcgZmlyc3QiCi0gICAgZW5kCi0gICAgZW50cwotICBlbmQKLQotICBkZWYgdGFyZ2V0ZmlsZXMKLSAgICBtYXBkaXIoZXhpc3RmaWxlcygpIC0gaG9va2ZpbGVzKCkpCi0gIGVuZAotCi0gIGRlZiBtYXBkaXIoZW50cykKLSAgICBlbnRzLm1hcCB7fGVudHwKLSAgICAgIGlmIEZpbGUuZXhpc3Q/KGVudCkKLSAgICAgIHRoZW4gZW50ICAgICAgICAgICAgICAgICAgICAgICAgICMgb2JqZGlyCi0gICAgICBlbHNlICIje2N1cnJfc3JjZGlyKCl9LyN7ZW50fSIgICAjIHNyY2RpcgotICAgICAgZW5kCi0gICAgfQotICBlbmQKLQotICAjIHBpY2tlZCB1cCBtYW55IGVudHJpZXMgZnJvbSBjdnMtMS4xMS4xL3NyYy9pZ25vcmUuYwotICBKVU5LX0ZJTEVTID0gJXcoCi0gICAgY29yZSBSQ1NMT0cgdGFncyBUQUdTIC5tYWtlLnN0YXRlCi0gICAgLm5zZV9kZXBpbmZvICMqIC4jKiBjdnNsb2cuKiAsKiAuZGVsLSogKi5vbGIKLSAgICAqfiAqLm9sZCAqLmJhayAqLkJBSyAqLm9yaWcgKi5yZWogXyQqICokCi0KLSAgICAqLm9yZyAqLmluIC4qCi0gICkKLQotICBkZWYgZXhpc3RmaWxlcwotICAgIGdsb2JfcmVqZWN0KEpVTktfRklMRVMsIChmaWxlc19vZihjdXJyX3NyY2RpcigpKSB8IGZpbGVzX29mKCcuJykpKQotICBlbmQKLQotICBkZWYgaG9va2ZpbGVzCi0gICAgJXcoIHByZS0lcyBwb3N0LSVzIHByZS0lcy5yYiBwb3N0LSVzLnJiICkubWFwIHt8Zm10fAotICAgICAgJXcoIGNvbmZpZyBzZXR1cCBpbnN0YWxsIGNsZWFuICkubWFwIHt8dHwgc3ByaW50ZihmbXQsIHQpIH0KLSAgICB9LmZsYXR0ZW4KLSAgZW5kCi0KLSAgZGVmIGdsb2Jfc2VsZWN0KHBhdCwgZW50cykKLSAgICByZSA9IGdsb2JzMnJlKFtwYXRdKQotICAgIGVudHMuc2VsZWN0IHt8ZW50fCByZSA9fiBlbnQgfQotICBlbmQKLQotICBkZWYgZ2xvYl9yZWplY3QocGF0cywgZW50cykKLSAgICByZSA9IGdsb2JzMnJlKHBhdHMpCi0gICAgZW50cy5yZWplY3Qge3xlbnR8IHJlID1+IGVudCB9Ci0gIGVuZAotCi0gIEdMT0IyUkVHRVggPSB7Ci0gICAgJy4nID0+ICdcLicsCi0gICAgJyQnID0+ICdcJCcsCi0gICAgJyMnID0+ICdcIycsCi0gICAgJyonID0+ICcuKicKLSAgfQotCi0gIGRlZiBnbG9iczJyZShwYXRzKQotICAgIC9cQSg/OiN7Ci0gICAgICBwYXRzLm1hcCB7fHBhdHwgcGF0LmdzdWIoL1tcLlwkXCNcKl0vKSB7fGNofCBHTE9CMlJFR0VYW2NoXSB9IH0uam9pbignfCcpCi0gICAgfSlcei8KLSAgZW5kCi0KLSAgIwotICAjIFRBU0sgdGVzdAotICAjCi0KLSAgVEVTVERJUiA9ICd0ZXN0JwotCi0gIGRlZiBleGVjX3Rlc3QKLSAgICB1bmxlc3MgRmlsZS5kaXJlY3Rvcnk/KCd0ZXN0JykKLSAgICAgICRzdGRlcnIucHV0cyAnbm8gdGVzdCBpbiB0aGlzIHBhY2thZ2UnIGlmIHZlcmJvc2U/Ci0gICAgICByZXR1cm4KLSAgICBlbmQKLSAgICAkc3RkZXJyLnB1dHMgJ1J1bm5pbmcgdGVzdHMuLi4nIGlmIHZlcmJvc2U/Ci0gICAgYmVnaW4KLSAgICAgIHJlcXVpcmUgJ3Rlc3QvdW5pdCcKLSAgICByZXNjdWUgTG9hZEVycm9yCi0gICAgICBzZXR1cF9yYl9lcnJvciAndGVzdC91bml0IGNhbm5vdCBsb2FkZWQuICBZb3UgbmVlZCBSdWJ5IDEuOCBvciBsYXRlciB0byBpbnZva2UgdGhpcyB0YXNrLicKLSAgICBlbmQKLSAgICBydW5uZXIgPSBUZXN0OjpVbml0OjpBdXRvUnVubmVyLm5ldyh0cnVlKQotICAgIHJ1bm5lci50b19ydW4gPDwgVEVTVERJUgotICAgIHJ1bm5lci5ydW4KLSAgZW5kCi0KLSAgIwotICAjIFRBU0sgY2xlYW4KLSAgIwotCi0gIGRlZiBleGVjX2NsZWFuCi0gICAgZXhlY190YXNrX3RyYXZlcnNlICdjbGVhbicKLSAgICBybV9mIEBjb25maWcuc2F2ZWZpbGUKLSAgICBybV9mICdJbnN0YWxsZWRGaWxlcycKLSAgZW5kCi0KLSAgYWxpYXMgY2xlYW5fZGlyX2JpbiBub29wCi0gIGFsaWFzIGNsZWFuX2Rpcl9saWIgbm9vcAotICBhbGlhcyBjbGVhbl9kaXJfZGF0YSBub29wCi0gIGFsaWFzIGNsZWFuX2Rpcl9jb25mIG5vb3AKLSAgYWxpYXMgY2xlYW5fZGlyX21hbiBub29wCi0KLSAgZGVmIGNsZWFuX2Rpcl9leHQocmVsKQotICAgIHJldHVybiB1bmxlc3MgZXh0ZGlyPyhjdXJyX3NyY2RpcigpKQotICAgIG1ha2UgJ2NsZWFuJyBpZiBGaWxlLmZpbGU/KCdNYWtlZmlsZScpCi0gIGVuZAotCi0gICMKLSAgIyBUQVNLIGRpc3RjbGVhbgotICAjCi0KLSAgZGVmIGV4ZWNfZGlzdGNsZWFuCi0gICAgZXhlY190YXNrX3RyYXZlcnNlICdkaXN0Y2xlYW4nCi0gICAgcm1fZiBAY29uZmlnLnNhdmVmaWxlCi0gICAgcm1fZiAnSW5zdGFsbGVkRmlsZXMnCi0gIGVuZAotCi0gIGFsaWFzIGRpc3RjbGVhbl9kaXJfYmluIG5vb3AKLSAgYWxpYXMgZGlzdGNsZWFuX2Rpcl9saWIgbm9vcAotCi0gIGRlZiBkaXN0Y2xlYW5fZGlyX2V4dChyZWwpCi0gICAgcmV0dXJuIHVubGVzcyBleHRkaXI/KGN1cnJfc3JjZGlyKCkpCi0gICAgbWFrZSAnZGlzdGNsZWFuJyBpZiBGaWxlLmZpbGU/KCdNYWtlZmlsZScpCi0gIGVuZAotCi0gIGFsaWFzIGRpc3RjbGVhbl9kaXJfZGF0YSBub29wCi0gIGFsaWFzIGRpc3RjbGVhbl9kaXJfY29uZiBub29wCi0gIGFsaWFzIGRpc3RjbGVhbl9kaXJfbWFuIG5vb3AKLQotICAjCi0gICMgVHJhdmVyc2luZwotICAjCi0KLSAgZGVmIGV4ZWNfdGFza190cmF2ZXJzZSh0YXNrKQotICAgIHJ1bl9ob29rICJwcmUtI3t0YXNrfSIKLSAgICBGSUxFVFlQRVMuZWFjaCBkbyB8dHlwZXwKLSAgICAgIGlmIHR5cGUgPT0gJ2V4dCcgYW5kIGNvbmZpZygnd2l0aG91dC1leHQnKSA9PSAneWVzJwotICAgICAgICAkc3RkZXJyLnB1dHMgJ3NraXBwaW5nIGV4dC8qIGJ5IHVzZXIgb3B0aW9uJyBpZiB2ZXJib3NlPwotICAgICAgICBuZXh0Ci0gICAgICBlbmQKLSAgICAgIHRyYXZlcnNlIHRhc2ssIHR5cGUsICIje3Rhc2t9X2Rpcl8je3R5cGV9IgotICAgIGVuZAotICAgIHJ1bl9ob29rICJwb3N0LSN7dGFza30iCi0gIGVuZAotCi0gIGRlZiB0cmF2ZXJzZSh0YXNrLCByZWwsIG1pZCkKLSAgICBkaXZlX2ludG8ocmVsKSB7Ci0gICAgICBydW5faG9vayAicHJlLSN7dGFza30iCi0gICAgICBfX3NlbmRfXyBtaWQsIHJlbC5zdWIoJXJbXEEuKj8oPzovfFx6KV0sICcnKQotICAgICAgZGlyZWN0b3JpZXNfb2YoY3Vycl9zcmNkaXIoKSkuZWFjaCBkbyB8ZHwKLSAgICAgICAgdHJhdmVyc2UgdGFzaywgIiN7cmVsfS8je2R9IiwgbWlkCi0gICAgICBlbmQKLSAgICAgIHJ1bl9ob29rICJwb3N0LSN7dGFza30iCi0gICAgfQotICBlbmQKLQotICBkZWYgZGl2ZV9pbnRvKHJlbCkKLSAgICByZXR1cm4gdW5sZXNzIEZpbGUuZGlyPygiI3tAc3JjZGlyfS8je3JlbH0iKQotCi0gICAgZGlyID0gRmlsZS5iYXNlbmFtZShyZWwpCi0gICAgRGlyLm1rZGlyIGRpciB1bmxlc3MgRmlsZS5kaXI/KGRpcikKLSAgICBwcmV2ZGlyID0gRGlyLnB3ZAotICAgIERpci5jaGRpciBkaXIKLSAgICAkc3RkZXJyLnB1dHMgJy0tLT4gJyArIHJlbCBpZiB2ZXJib3NlPwotICAgIEBjdXJyZGlyID0gcmVsCi0gICAgeWllbGQKLSAgICBEaXIuY2hkaXIgcHJldmRpcgotICAgICRzdGRlcnIucHV0cyAnPC0tLSAnICsgcmVsIGlmIHZlcmJvc2U/Ci0gICAgQGN1cnJkaXIgPSBGaWxlLmRpcm5hbWUocmVsKQotICBlbmQKLQotICBkZWYgcnVuX2hvb2soaWQpCi0gICAgcGF0aCA9IFsgIiN7Y3Vycl9zcmNkaXIoKX0vI3tpZH0iLAotICAgICAgICAgICAgICIje2N1cnJfc3JjZGlyKCl9LyN7aWR9LnJiIiBdLmRldGVjdCB7fGNhbmR8IEZpbGUuZmlsZT8oY2FuZCkgfQotICAgIHJldHVybiB1bmxlc3MgcGF0aAotICAgIGJlZ2luCi0gICAgICBpbnN0YW5jZV9ldmFsIEZpbGUucmVhZChwYXRoKSwgcGF0aCwgMQotICAgIHJlc2N1ZQotICAgICAgcmFpc2UgaWYgJERFQlVHCi0gICAgICBzZXR1cF9yYl9lcnJvciAiaG9vayAje3BhdGh9IGZhaWxlZDpcbiIgKyAkIS5tZXNzYWdlCi0gICAgZW5kCi0gIGVuZAotCi1lbmQgICAjIGNsYXNzIEluc3RhbGxlcgotCi0KLWNsYXNzIFNldHVwRXJyb3IgPCBTdGFuZGFyZEVycm9yOyBlbmQKLQotZGVmIHNldHVwX3JiX2Vycm9yKG1zZykKLSAgcmFpc2UgU2V0dXBFcnJvciwgbXNnCi1lbmQKLQotaWYgJDAgPT0gX19GSUxFX18KLSAgYmVnaW4KLSAgICBUb3BsZXZlbEluc3RhbGxlci5pbnZva2UKLSAgcmVzY3VlIFNldHVwRXJyb3IKLSAgICByYWlzZSBpZiAkREVCVUcKLSAgICAkc3RkZXJyLnB1dHMgJCEubWVzc2FnZQotICAgICRzdGRlcnIucHV0cyAiVHJ5ICdydWJ5ICN7JDB9IC0taGVscCcgZm9yIGRldGFpbGVkIHVzYWdlLiIKLSAgICBleGl0IDEKLSAgZW5kCi1lbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL0Jhc2VTZXJ2aWNlLnRocmlmdCBiL2xpYi9yYi9zcGVjL0Jhc2VTZXJ2aWNlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzdkMzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvQmFzZVNlcnZpY2UudGhyaWZ0CkBAIC0wLDAgKzEsMjcgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCituYW1lc3BhY2UgcmIgQmFzZQorCitzdHJ1Y3QgSGVsbG8geworICAxOiBzdHJpbmcgZ3JlZXRpbmcgPSAiaGVsbG8gd29ybGQiCit9CisKK3NlcnZpY2UgQmFzZVNlcnZpY2UgeworICBIZWxsbyBncmVldGluZygxOmJvb2wgZW5nbGlzaCkKK30KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL0V4dGVuZGVkU2VydmljZS50aHJpZnQgYi9saWIvcmIvc3BlYy9FeHRlbmRlZFNlcnZpY2UudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNmI3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9FeHRlbmRlZFNlcnZpY2UudGhyaWZ0CkBAIC0wLDAgKzEsMjUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCituYW1lc3BhY2UgcmIgRXh0ZW5kZWQKKworaW5jbHVkZSAiQmFzZVNlcnZpY2UudGhyaWZ0IgorCitzZXJ2aWNlIEV4dGVuZGVkU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNlLkJhc2VTZXJ2aWNlIHsKKyAgdm9pZCBwaW5nKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL1JlZmVyZW5jZWQudGhyaWZ0IGIvbGliL3JiL3NwZWMvUmVmZXJlbmNlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmMTgzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL1JlZmVyZW5jZWQudGhyaWZ0CkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK25hbWVzcGFjZSByYiBPdGhlck5hbWVzcGFjZQorCitlbnVtIFNvbWVFbnVtIHsKKyAgT05FCisgIFRXTworfQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0IGIvbGliL3JiL3NwZWMvVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZjI4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworbmFtZXNwYWNlIHJiIE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlCisKK2luY2x1ZGUgIlJlZmVyZW5jZWQudGhyaWZ0IgorCitzdHJ1Y3QgSGVsbG8geworICAxOiBzdHJpbmcgZ3JlZXRpbmcgPSAiaGVsbG8gd29ybGQiCit9CisKK3NlcnZpY2UgTmFtZXNwYWNlZE5vbmJsb2NraW5nU2VydmljZSB7CisgIEhlbGxvIGdyZWV0aW5nKDE6Ym9vbCBlbmdsaXNoKQorICBib29sIGJsb2NrKCkKKyAgb25ld2F5IHZvaWQgdW5ibG9jaygxOmkzMiBuKQorICBvbmV3YXkgdm9pZCBzaHV0ZG93bigpCisgIHZvaWQgc2xlZXAoMTpkb3VibGUgc2Vjb25kcykKK30KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL1RocmlmdFNwZWMudGhyaWZ0IGIvbGliL3JiL3NwZWMvVGhyaWZ0U3BlYy50aHJpZnQKaW5kZXggZTRkZWNlNC4uYjQyNDgxYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvVGhyaWZ0U3BlYy50aHJpZnQKKysrIGIvbGliL3JiL3NwZWMvVGhyaWZ0U3BlYy50aHJpZnQKQEAgLTEyOSw0ICsxMjksNTUgQEAKIAogc3RydWN0IFN0cnVjdFdpdGhFbnVtTWFwIHsKICAgMTogbWFwPFNvbWVFbnVtLCBsaXN0PFNvbWVFbnVtPj4gbXlfbWFwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKworIyBOZXN0ZWQgbGlzdHMKK3N0cnVjdCBOZXN0ZWRMaXN0SW5MaXN0IHsKKyAgMTogbGlzdDxsaXN0PGJ5dGU+PiB2YWx1ZQorfQorCitzdHJ1Y3QgTmVzdGVkTGlzdEluU2V0IHsKKyAgMTogc2V0PGxpc3Q8Ynl0ZT4+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRMaXN0SW5NYXBLZXkgeworICAxOiBtYXA8bGlzdDxieXRlPiwgYnl0ZT4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZExpc3RJbk1hcFZhbHVlIHsKKyAgMTogbWFwPGJ5dGUsIGxpc3Q8Ynl0ZT4+IHZhbHVlCit9CisKKyMgTmVzdGVkIHNldHMKK3N0cnVjdCBOZXN0ZWRTZXRJbkxpc3QgeworICAxOiBsaXN0PHNldDxieXRlPj4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZFNldEluU2V0IHsKKyAgMTogc2V0PHNldDxieXRlPj4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZFNldEluTWFwS2V5IHsKKyAgMTogbWFwPHNldDxieXRlPiwgYnl0ZT4gdmFsdWUKK30KKworc3RydWN0IE5lc3RlZFNldEluTWFwVmFsdWUgeworICAxOiBtYXA8Ynl0ZSwgc2V0PGJ5dGU+PiB2YWx1ZQorfQorCisjIE5lc3RlZCBtYXBzCitzdHJ1Y3QgTmVzdGVkTWFwSW5MaXN0IHsKKyAgMTogbGlzdDxtYXA8Ynl0ZSwgYnl0ZT4+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRNYXBJblNldCB7CisgIDE6IHNldDxtYXA8Ynl0ZSwgYnl0ZT4+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRNYXBJbk1hcEtleSB7CisgIDI6IG1hcDxtYXA8Ynl0ZSwgYnl0ZT4sIGJ5dGU+IHZhbHVlCit9CisKK3N0cnVjdCBOZXN0ZWRNYXBJbk1hcFZhbHVlIHsKKyAgMjogbWFwPGJ5dGUsIG1hcDxieXRlLCBieXRlPj4gdmFsdWUKK30KZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYgppbmRleCBlZmIxNmQ4Li5lY2E5MzZiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCkBAIC0xNywxNDQgKzE3LDIxMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRCYXNlUHJvdG9jb2xTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSAnQmFzZVByb3RvY29sJyBkbwogCiAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICBAdHJhbnMgPSBtb2NrKCJNb2NrVHJhbnNwb3J0IikKLSAgICBAcHJvdCA9IEJhc2VQcm90b2NvbC5uZXcoQHRyYW5zKQorICAgIEB0cmFucyA9IGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpCisgICAgQHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoQHRyYW5zKQogICBlbmQKIAotICBkZXNjcmliZSBCYXNlUHJvdG9jb2wgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlUHJvdG9jb2wgZG8KICAgICAjIG1vc3Qgb2YgdGhlIG1ldGhvZHMgYXJlIHN0dWJzLCBzbyB3ZSBjYW4gaWdub3JlIHRoZW0KIAotICAgIGl0ICJzaG91bGQgbWFrZSB0cmFucyBhY2Nlc3NpYmxlIiBkbwotICAgICAgQHByb3QudHJhbnMuc2hvdWxkIGVxbChAdHJhbnMpCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QudG9fcykudG8gZXEoInRyYW5zIikKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgd3JpdGUgb3V0IGEgZmllbGQgbmljZWx5IiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV90eXBlKS53aXRoKCd0eXBlJywgJ3ZhbHVlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgIGl0ICJzaG91bGQgbWFrZSB0cmFucyBhY2Nlc3NpYmxlIiBkbworICAgICAgZXhwZWN0KEBwcm90LnRyYW5zKS50byBlcWwoQHRyYW5zKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHkgKGRlcHJlY2F0ZWQgd3JpdGVfZmllbGQgc2lnbmF0dXJlKScgZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV90eXBlKS53aXRoKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZSd9LCAndmFsdWUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAogICAgICAgQHByb3Qud3JpdGVfZmllbGQoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJywgJ3ZhbHVlJykKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgd3JpdGUgb3V0IHRoZSBkaWZmZXJlbnQgdHlwZXMiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAotICAgICAgc3RydWN0ID0gbW9jaygnU3RydWN0JykKLSAgICAgIHN0cnVjdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OkJPT0wsICdib29sJykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OkJZVEUsICdieXRlJykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6OkRPVUJMRSwgJ2RvdWJsZScpCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpJMTYsICdpMTYnKQotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6STMyLCAnaTMyJykKLSAgICAgIEBwcm90LndyaXRlX3R5cGUoVHlwZXM6Okk2NCwgJ2k2NCcpCi0gICAgICBAcHJvdC53cml0ZV90eXBlKFR5cGVzOjpTVFJJTkcsICdzdHJpbmcnKQotICAgICAgQHByb3Qud3JpdGVfdHlwZShUeXBlczo6U1RSVUNULCBzdHJ1Y3QpCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHknIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnLCA6YmluYXJ5ID0+IGZhbHNlfSwgJ3ZhbHVlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIEBwcm90LndyaXRlX2ZpZWxkKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZScsIDpiaW5hcnkgPT4gZmFsc2V9LCAnZmlkJywgJ3ZhbHVlJykKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IHRoZSBkaWZmZXJlbnQgdHlwZXMgKGRlcHJlY2F0ZWQgd3JpdGVfdHlwZSBzaWduYXR1cmUpJyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoJ2RvdWJsZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pNjQpLndpdGgoJ2k2NCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCisgICAgICBzdHJ1Y3QgPSBkb3VibGUoJ1N0cnVjdCcpCisgICAgICBleHBlY3Qoc3RydWN0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpCT09MLCAnYm9vbCcpCisgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkJZVEUsICdieXRlJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAnZG91YmxlJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6STE2LCAnaTE2JykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6STMyLCAnaTMyJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6STY0LCAnaTY0JykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAnc3RyaW5nJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6U1RSVUNULCBzdHJ1Y3QpCiAgICAgICAjIGFsbCBvdGhlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkCi0gICAgICBbVHlwZXM6OlNUT1AsIFR5cGVzOjpWT0lELCBUeXBlczo6TUFQLCBUeXBlczo6U0VULCBUeXBlczo6TElTVF0uZWFjaCBkbyB8dHlwZXwKLSAgICAgICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfdHlwZSh0eXBlLCB0eXBlLnRvX3MpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RPUCwgVGhyaWZ0OjpUeXBlczo6Vk9JRCwgVGhyaWZ0OjpUeXBlczo6TUFQLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIFRocmlmdDo6VHlwZXM6OkxJU1RdLmVhY2ggZG8gfHR5cGV8CisgICAgICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX3R5cGUodHlwZSwgdHlwZS50b19zKSB9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCiAgICAgICBlbmQKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgcmVhZCB0aGUgZGlmZmVyZW50IHR5cGVzIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6Qk9PTCkKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6QllURSkKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6STE2KQotICAgICAgQHByb3QucmVhZF90eXBlKFR5cGVzOjpJMzIpCi0gICAgICBAcHJvdC5yZWFkX3R5cGUoVHlwZXM6Okk2NCkKLSAgICAgIEBwcm90LnJlYWRfdHlwZShUeXBlczo6RE9VQkxFKQotICAgICAgQHByb3QucmVhZF90eXBlKFR5cGVzOjpTVFJJTkcpCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgdGhlIGRpZmZlcmVudCB0eXBlcycgZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9iaW5hcnkpLndpdGgoJ2JpbmFyeScpLm9yZGVyZWQKKyAgICAgIHN0cnVjdCA9IGRvdWJsZSgnU3RydWN0JykKKyAgICAgIGV4cGVjdChzdHJ1Y3QpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgJ2Jvb2wnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICdieXRlJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sICdkb3VibGUnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgJ2kxNicpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAnaTMyJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICdpNjQnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgJ3N0cmluZycpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDpiaW5hcnkgPT4gdHJ1ZX0sICdiaW5hcnknKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgc3RydWN0KQogICAgICAgIyBhbGwgb3RoZXIgdHlwZXMgYXJlIG5vdCBpbXBsZW1lbnRlZAotICAgICAgW1R5cGVzOjpTVE9QLCBUeXBlczo6Vk9JRCwgVHlwZXM6Ok1BUCwgVHlwZXM6OlNFVCwgVHlwZXM6OkxJU1RdLmVhY2ggZG8gfHR5cGV8Ci0gICAgICAgIGxhbWJkYSB7IEBwcm90LnJlYWRfdHlwZSh0eXBlKSB9LnNob3VsZCByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgW1RocmlmdDo6VHlwZXM6OlNUT1AsIFRocmlmdDo6VHlwZXM6OlZPSUQsIFRocmlmdDo6VHlwZXM6Ok1BUCwgVGhyaWZ0OjpUeXBlczo6U0VULCBUaHJpZnQ6OlR5cGVzOjpMSVNUXS5lYWNoIGRvIHx0eXBlfAorICAgICAgICBleHBlY3QgeyBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiB0eXBlfSwgdHlwZS50b19zKSB9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVhZCB0aGUgZGlmZmVyZW50IHR5cGVzIChkZXByZWNhdGVkIHJlYWRfdHlwZSBzaWduYXR1cmUpJyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpCWVRFKQorICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkkxNikKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpJMzIpCisgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6STY0KQorICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpCisgICAgICAjIGFsbCBvdGhlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkCisgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RPUCwgVGhyaWZ0OjpUeXBlczo6Vk9JRCwgVGhyaWZ0OjpUeXBlczo6TUFQLAorICAgICAgIFRocmlmdDo6VHlwZXM6OlNFVCwgVGhyaWZ0OjpUeXBlczo6TElTVCwgVGhyaWZ0OjpUeXBlczo6U1RSVUNUXS5lYWNoIGRvIHx0eXBlfAorICAgICAgICBleHBlY3QgeyBAcHJvdC5yZWFkX3R5cGUodHlwZSkgfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlYWQgdGhlIGRpZmZlcmVudCB0eXBlcycgZG8KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2JpbmFyeSkub3JkZXJlZAorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSkKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklORywgOmJpbmFyeSA9PiB0cnVlfSkKKyAgICAgICMgYWxsIG90aGVyIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQKKyAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVE9QLCBUaHJpZnQ6OlR5cGVzOjpWT0lELCBUaHJpZnQ6OlR5cGVzOjpNQVAsCisgICAgICAgVGhyaWZ0OjpUeXBlczo6U0VULCBUaHJpZnQ6OlR5cGVzOjpMSVNULCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1RdLmVhY2ggZG8gfHR5cGV8CisgICAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gdHlwZX0pIH0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHRoZSBiYXNpYyB0eXBlcyIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCi0gICAgICBAcHJvdC5za2lwKFR5cGVzOjpCT09MKQotICAgICAgQHByb3Quc2tpcChUeXBlczo6QllURSkKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OkkxNikKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OkkzMikKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6Okk2NCkKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OkRPVUJMRSkKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OlNUUklORykKLSAgICAgIEBwcm90LnNraXAoVHlwZXM6OlNUT1ApICMgc2hvdWxkIGRvIGFic29sdXRlbHkgbm90aGluZworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkJPT0wpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkJZVEUpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkkxNikKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6STMyKQorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpJNjQpCisgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkKKyAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKQorICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpTVE9QKSAjIHNob3VsZCBkbyBhYnNvbHV0ZWx5IG5vdGhpbmcKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBzdHJ1Y3RzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg0KS50aW1lcy5hbmRfcmV0dXJuKAotICAgICAgICBbJ2ZpZWxkIDEnLCBUeXBlczo6U1RSSU5HLCAxXSwKLSAgICAgICAgWydmaWVsZCAyJywgVHlwZXM6OkkzMiwgMl0sCi0gICAgICAgIFsnZmllbGQgMycsIFR5cGVzOjpNQVAsIDNdLAotICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg0KS50aW1lcy5hbmRfcmV0dXJuKAorICAgICAgICBbJ2ZpZWxkIDEnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAorICAgICAgICBbJ2ZpZWxkIDInLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAorICAgICAgICBbJ2ZpZWxkIDMnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDNdLAorICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1R5cGVzOjpTVFJJTkcsIFR5cGVzOjpTVFJJTkcsIDFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0pCiAgICAgICAjIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgyKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAotICAgICAgcmVhbF9za2lwLmNhbGwoVHlwZXM6OlNUUlVDVCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIG1hcHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVHlwZXM6OlNUUklORywgVHlwZXM6OlNUUlVDVCwgMV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFsic29tZV9zdHJ1Y3QiXSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW25pbCwgVHlwZXM6OlNUT1AsIG5pbF0pOwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAotICAgICAgcmVhbF9za2lwLmNhbGwoVHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFsic29tZV9zdHJ1Y3QiXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIG5pbF0pOworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCisgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpNQVApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgc2V0cyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUeXBlczo6STY0LCA5XSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZC5leGFjdGx5KDkpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQotICAgICAgcmVhbF9za2lwLmNhbGwoVHlwZXM6OlNFVCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STY0LCA5XSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQuZXhhY3RseSg5KS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9lbmQpCisgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpTRVQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbGlzdHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1R5cGVzOjpET1VCTEUsIDExXSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZC5leGFjdGx5KDExKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCi0gICAgICByZWFsX3NraXAuY2FsbChUeXBlczo6TElTVCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgMTFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZC5leGFjdGx5KDExKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQorICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6TElTVCkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQmFzZVByb3RvY29sRmFjdG9yeSBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IiIGRvCiAgICAgICAjIHJldHVybmluZyBuaWwgc2luY2UgUHJvdG9jb2wgaXMganVzdCBhbiBhYnN0cmFjdCBjbGFzcwotICAgICAgbGFtYmRhIHtCYXNlUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKX0uc2hvdWxkIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3Qge1RocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiCmluZGV4IGEyOTY1NmYuLmQyZjYwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgpAQCAtMTcsMjEyICsxNywyMzUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0QmFzZVRyYW5zcG9ydFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdCYXNlVHJhbnNwb3J0JyBkbwogCi0gIGRlc2NyaWJlIFRyYW5zcG9ydEV4Y2VwdGlvbiBkbworICBkZXNjcmliZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgbWFrZSB0eXBlIGFjY2Vzc2libGUiIGRvCi0gICAgICBleGMgPSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOLCAibXNnIikKLSAgICAgIGV4Yy50eXBlLnNob3VsZCA9PSBUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTgotICAgICAgZXhjLm1lc3NhZ2Uuc2hvdWxkID09ICJtc2ciCisgICAgICBleGMgPSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTiwgIm1zZyIpCisgICAgICBleHBlY3QoZXhjLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pCisgICAgICBleHBlY3QoZXhjLm1lc3NhZ2UpLnRvIGVxKCJtc2ciKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCYXNlVHJhbnNwb3J0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVRyYW5zcG9ydCBkbwogICAgIGl0ICJzaG91bGQgcmVhZCB0aGUgc3BlY2lmaWVkIHNpemUiIGRvCi0gICAgICB0cmFuc3BvcnQgPSBCYXNlVHJhbnNwb3J0Lm5ldwotICAgICAgdHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDQwKS5vcmRlcmVkLmFuZF9yZXR1cm4oIjEwIGxldHRlcnMiKQotICAgICAgdHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDMwKS5vcmRlcmVkLmFuZF9yZXR1cm4oImZpZnRlZW4gbGV0dGVycyIpCi0gICAgICB0cmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTUpLm9yZGVyZWQuYW5kX3JldHVybigibW9yZSBjaGFyYWN0ZXJzIikKLSAgICAgIHRyYW5zcG9ydC5yZWFkX2FsbCg0MCkuc2hvdWxkID09ICIxMCBsZXR0ZXJzZmlmdGVlbiBsZXR0ZXJzbW9yZSBjaGFyYWN0ZXJzIgorICAgICAgdHJhbnNwb3J0ID0gVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm5ldworICAgICAgZXhwZWN0KHRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCg0MCkub3JkZXJlZC5hbmRfcmV0dXJuKCIxMCBsZXR0ZXJzIikKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMzApLm9yZGVyZWQuYW5kX3JldHVybigiZmlmdGVlbiBsZXR0ZXJzIikKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTUpLm9yZGVyZWQuYW5kX3JldHVybigibW9yZSBjaGFyYWN0ZXJzIikKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQucmVhZF9hbGwoNDApKS50byBlcSgiMTAgbGV0dGVyc2ZpZnRlZW4gbGV0dGVyc21vcmUgY2hhcmFjdGVycyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN0dWIgb3V0IHRoZSByZXN0IG9mIHRoZSBtZXRob2RzIiBkbwogICAgICAgIyBjYW4ndCB0ZXN0IGZvciBzdHViYmluZXNzLCBzbyBqdXN0IG1ha2Ugc3VyZSB0aGV5J3JlIGRlZmluZWQKICAgICAgIFs6b3Blbj8sIDpvcGVuLCA6Y2xvc2UsIDpyZWFkLCA6d3JpdGUsIDpmbHVzaF0uZWFjaCBkbyB8c3ltfAotICAgICAgICBCYXNlVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pLnNob3VsZCBiZV90cnVlCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkpLnRvIGJlX3RydXRoeQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsaWFzIDw8IHRvIHdyaXRlIiBkbwotICAgICAgQmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOjw8KS5zaG91bGQgPT0gQmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOndyaXRlKQorICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOjw8KSkudG8gZXEoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6d3JpdGUpKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQmFzZVNlcnZlclRyYW5zcG9ydCBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VTZXJ2ZXJUcmFuc3BvcnQgZG8KICAgICBpdCAic2hvdWxkIHN0dWIgb3V0IGl0cyBtZXRob2RzIiBkbwogICAgICAgWzpsaXN0ZW4sIDphY2NlcHQsIDpjbG9zZV0uZWFjaCBkbyB8c3ltfAotICAgICAgICBCYXNlU2VydmVyVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pLnNob3VsZCBiZV90cnVlCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VTZXJ2ZXJUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkpLnRvIGJlX3RydXRoeQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHJldHVybiB0aGUgdHJhbnNwb3J0IGl0J3MgZ2l2ZW4iIGRvCi0gICAgICB0cmFuc3BvcnQgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgQmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnNwb3J0KS5zaG91bGQgZXFsKHRyYW5zcG9ydCkKKyAgICAgIHRyYW5zcG9ydCA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkpLnRvIGVxbCh0cmFuc3BvcnQpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQnVmZmVyZWRUcmFuc3BvcnQgZG8KLSAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGJ1dCB3cml0ZS9mbHVzaC9yZWFkIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZCAjIGZyb20gdGhlIGNsb3NlCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCi0gICAgICBidHJhbnMgPSBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCi0gICAgICBidHJhbnMub3Blbj8uc2hvdWxkID09ICIrIG9wZW4/IgotICAgICAgYnRyYW5zLm9wZW4uc2hvdWxkID09ICIrIG9wZW4iCi0gICAgICBidHJhbnMuY2xvc2Uuc2hvdWxkID09ICIrIGNsb3NlIgorICBkZXNjcmliZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0IGRvCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgdG9fcyB0aGF0IGRlc2NyaWJlcyB0aGUgZW5jYXBzdWxhdGlvbiIgZG8KKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrIikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykudG9fcykudG8gZXEoImJ1ZmZlcmVkKG1vY2spIikKICAgICBlbmQKLSAgICAKLSAgICBpdCAic2hvdWxkIGJ1ZmZlciByZWFkcyBpbiBjaHVua3Mgb2YgI3tCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVJ9IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSKS5hbmRfcmV0dXJuKCJsb3J1bSBpcHN1bSBkb2xvciBlbWV0IikKLSAgICAgIGJ0cmFucyA9IEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAibG9ydW0gIgotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJpcHN1bSAiCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImRvbG9yICIKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiZW1ldCIKKworICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgYnV0IHdyaXRlL2ZsdXNoL3JlYWQiIGRvCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQgIyBmcm9tIHRoZSBjbG9zZQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQorICAgICAgZXhwZWN0KGJ0cmFucy5vcGVuPykudG8gZXEoIisgb3Blbj8iKQorICAgICAgZXhwZWN0KGJ0cmFucy5vcGVuKS50byBlcSgiKyBvcGVuIikKKyAgICAgIGV4cGVjdChidHJhbnMuY2xvc2UpLnRvIGVxKCIrIGNsb3NlIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYnVmZmVyIHJlYWRzIGluIGNodW5rcyBvZiAje1RocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSfSIgZG8KKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpyZWFkKS53aXRoKFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSKS5hbmRfcmV0dXJuKCJsb3J1bSBpcHN1bSBkb2xvciBlbWV0IikKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgibG9ydW0gIikKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImlwc3VtICIpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJkb2xvciAiKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgiZW1ldCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJ1ZmZlciB3cml0ZXMgYW5kIHNlbmQgdGhlbSBvbiBmbHVzaCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIGJ0cmFucyA9IEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCiAgICAgICBidHJhbnMud3JpdGUoIm9uZS8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0d28vIikKICAgICAgIGJ0cmFucy53cml0ZSgidGhyZWUvIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKS5vcmRlcmVkCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikub3JkZXJlZAorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZAogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9ubHkgc2VuZCBidWZmZXJlZCBkYXRhIG9uY2UiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBidHJhbnMgPSBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQogICAgICAgYnRyYW5zLndyaXRlKCJvbmUvIikKICAgICAgIGJ0cmFucy53cml0ZSgidHdvLyIpCiAgICAgICBidHJhbnMud3JpdGUoInRocmVlLyIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikKLSAgICAgIHRyYW5zLnN0dWIhKDpmbHVzaCkKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikKKyAgICAgIGFsbG93KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGJ0cmFucy5mbHVzaAogICAgICAgIyBOb3RoaW5nIHRvIGZsdXNoIHdpdGggbm8gZGF0YQogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgZW5kCi0gICAgCisKICAgICBpdCAic2hvdWxkIGZsdXNoIG9uIGNsb3NlIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgYnRyYW5zID0gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQotICAgICAgYnRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQorICAgICAgZXhwZWN0KGJ0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICBidHJhbnMuY2xvc2UKICAgICBlbmQKLSAgICAKKwogICAgIGl0ICJzaG91bGQgbm90IHdyaXRlIHRvIHNvY2tldCBpZiB0aGVyZSdzIG5vIGRhdGEiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpCi0gICAgICBidHJhbnMgPSBCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKICAgICAgIGJ0cmFucy5mbHVzaAogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHdyYXAgdGhlIGdpdmVuIHRyYW5zcG9ydCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgYnRyYW5zID0gbW9jaygiQnVmZmVyZWRUcmFuc3BvcnQiKQotICAgICAgQnVmZmVyZWRUcmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCh0cmFucykuYW5kX3JldHVybihidHJhbnMpCi0gICAgICBCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpLnNob3VsZCA9PSBidHJhbnMKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgYnRyYW5zID0gZG91YmxlKCJCdWZmZXJlZFRyYW5zcG9ydCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKS5hbmRfcmV0dXJuKGJ0cmFucykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykpLnRvIGVxKGJ0cmFucykKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJidWZmZXJlZCIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIEZyYW1lZFRyYW5zcG9ydCBkbworICBkZXNjcmliZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSB0b19zIHRoYXQgZGVzY3JpYmVzIHRoZSBlbmNhcHN1bGF0aW9uIiBkbworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2siKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyh0cmFucykudG9fcykudG8gZXEoImZyYW1lZChtb2NrKSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCBvcGVuPy9vcGVuL2Nsb3NlIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQotICAgICAgZnRyYW5zLm9wZW4/LnNob3VsZCA9PSAiKyBvcGVuPyIKLSAgICAgIGZ0cmFucy5vcGVuLnNob3VsZCA9PSAiKyBvcGVuIgotICAgICAgZnRyYW5zLmNsb3NlLnNob3VsZCA9PSAiKyBjbG9zZSIKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQorICAgICAgZXhwZWN0KGZ0cmFucy5vcGVuPykudG8gZXEoIisgb3Blbj8iKQorICAgICAgZXhwZWN0KGZ0cmFucy5vcGVuKS50byBlcSgiKyBvcGVuIikKKyAgICAgIGV4cGVjdChmdHJhbnMuY2xvc2UpLnRvIGVxKCIrIGNsb3NlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIHJlYWQgd2hlbiByZWFkIGlzIHR1cm5lZCBvZmYiIGRvCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgZmFsc2UsIHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTcpLm9yZGVyZWQuYW5kX3JldHVybigiKyByZWFkIikKLSAgICAgIGZ0cmFucy5yZWFkKDE3KS5zaG91bGQgPT0gIisgcmVhZCIKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIGZhbHNlLCB0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHJlYWQiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDE3KSkudG8gZXEoIisgcmVhZCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCB3cml0ZS9mbHVzaCB3aGVuIHdyaXRlIGlzIHR1cm5lZCBvZmYiIGRvCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb28iKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgd3JpdGUiKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGZsdXNoIikKLSAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikuc2hvdWxkID09ICIrIHdyaXRlIgotICAgICAgZnRyYW5zLmZsdXNoLnNob3VsZCA9PSAiKyBmbHVzaCIKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvbyIpLm9yZGVyZWQuYW5kX3JldHVybigiKyB3cml0ZSIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGZsdXNoIikKKyAgICAgIGV4cGVjdChmdHJhbnMud3JpdGUoImZvbyIpKS50byBlcSgiKyB3cml0ZSIpCisgICAgICBleHBlY3QoZnRyYW5zLmZsdXNoKS50byBlcSgiKyBmbHVzaCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBhIGZ1bGwgZnJhbWUgaWYgYXNrZWQgZm9yID49IHRoZSBmcmFtZSdzIGxlbmd0aCIgZG8KICAgICAgIGZyYW1lID0gInRoaXMgaXMgYSBmcmFtZSIKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKLSAgICAgIEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKGZyYW1lLmxlbmd0aCArIDEwKS5zaG91bGQgPT0gZnJhbWUKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoZnJhbWUubGVuZ3RoICsgMTApKS50byBlcShmcmFtZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIHNsaWNlcyBvZiB0aGUgZnJhbWUgd2hlbiBhc2tlZCBmb3IgPCB0aGUgZnJhbWUncyBsZW5ndGgiIGRvCiAgICAgICBmcmFtZSA9ICJ0aGlzIGlzIGEgZnJhbWUiCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCi0gICAgICBmdHJhbnMgPSBGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAidGhpcyIKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAiIGlzICIKLSAgICAgIGZ0cmFucy5yZWFkKDE2KS5zaG91bGQgPT0gImEgZnJhbWUiCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCJ0aGlzIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoIiBpcyAiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDE2KSkudG8gZXEoImEgZnJhbWUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbm90aGluZyBpZiBhc2tlZCBmb3IgPD0gMCIgZG8KLSAgICAgIEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKC0yKS5zaG91bGQgPT0gIiIKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKC0yKSkudG8gZXEoIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHB1bGwgYSBuZXcgZnJhbWUgd2hlbiB0aGUgZmlyc3QgaXMgZXhoYXVzdGVkIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgogICAgICAgZnJhbWUyID0gInlldCBhbm90aGVyIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IiwgIlwwMDBcMDAwXDAwMFwwMjEiKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lMi5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUyKQotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCi0gICAgICBmdHJhbnMucmVhZCg4KS5zaG91bGQgPT0gIiBpcyBhIGZyIgotICAgICAgZnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJhbWUiCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInlldCAiCi0gICAgICBmdHJhbnMucmVhZCgxNikuc2hvdWxkID09ICJhbm90aGVyIGZyYW1lIgorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIsICJcMDAwXDAwMFwwMDBcMDIxIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lMi5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUyKQorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoInRoaXMiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDgpKS50byBlcSgiIGlzIGEgZnIiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDYpKS50byBlcSgiYW1lIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoInlldCAiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDE2KSkudG8gZXEoImFub3RoZXIgZnJhbWUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBidWZmZXIgd3JpdGVzIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX25vdF9yZWNlaXZlKDp3cml0ZSkKKyAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBleHBlY3QoQHRyYW5zKS5ub3RfdG8gcmVjZWl2ZSg6d3JpdGUpCiAgICAgICBmdHJhbnMud3JpdGUoImZvbyIpCiAgICAgICBmdHJhbnMud3JpdGUoImJhciIpCiAgICAgICBmdHJhbnMud3JpdGUoInRoaXMgaXMgYSBmcmFtZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIHNsaWNlcyBvZiB0aGUgYnVmZmVyIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCisgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQogICAgICAgZnRyYW5zLndyaXRlKCJmb29iYXIiLCAzKQogICAgICAgZnRyYW5zLndyaXRlKCJiYXJmb28iLCAxKQotICAgICAgQHRyYW5zLnN0dWIhKDpmbHVzaCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDRmb29iIikKKyAgICAgIGFsbG93KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwNGZvb2IiKQogICAgICAgZnRyYW5zLmZsdXNoCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGZsdXNoIGZyYW1lcyB3aXRoIGEgNC1ieXRlIGhlYWRlciIgZG8KLSAgICAgIGZ0cmFucyA9IEZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAzNW9uZS90d28vdGhyZWUvdGhpcyBpcyBhIGZyYW1lIikub3JkZXJlZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZAorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDM1b25lL3R3by90aHJlZS90aGlzIGlzIGEgZnJhbWUiKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZAogICAgICAgZnRyYW5zLndyaXRlKCJvbmUvIikKICAgICAgIGZ0cmFucy53cml0ZSgidHdvLyIpCiAgICAgICBmdHJhbnMud3JpdGUoInRocmVlLyIpCkBAIC0yMzEsMTIwICsyNTQsMTM0IEBACiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBmbHVzaCB0aGUgc2FtZSBidWZmZXJlZCBkYXRhIHR3aWNlIiBkbwotICAgICAgZnRyYW5zID0gRnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA3Zm9vL2JhciIpCi0gICAgICBAdHJhbnMuc3R1YiEoOmZsdXNoKQorICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA3Zm9vL2JhciIpCisgICAgICBhbGxvdyhAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgZnRyYW5zLndyaXRlKCJmb28iKQogICAgICAgZnRyYW5zLndyaXRlKCIvYmFyIikKICAgICAgIGZ0cmFucy5mbHVzaAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwMCIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwMCIpCiAgICAgICBmdHJhbnMuZmx1c2gKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgRnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBkbworICBkZXNjcmliZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHdyYXAgdGhlIGdpdmVuIHRyYW5zcG9ydCBpbiBhIEZyYW1lZFRyYW5zcG9ydCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIEZyYW1lZFRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKQotICAgICAgRnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpCisgICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcudG9fcykudG8gZXEoImZyYW1lZCIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCBkbworICBkZXNjcmliZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBidWZmZXIgPSBNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgICBAYnVmZmVyID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQGJ1ZmZlci50b19zKS50byBlcSgibWVtb3J5IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGEgYnVmZmVyIG9uIGlucHV0IGFuZCB1c2UgaXQgZGlyZWN0bHkiIGRvCiAgICAgICBzID0gInRoaXMgaXMgYSB0ZXN0IgotICAgICAgQGJ1ZmZlciA9IE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcocykKLSAgICAgIEBidWZmZXIucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCisgICAgICBAYnVmZmVyID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3KHMpCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKDQpKS50byBlcSgidGhpcyIpCiAgICAgICBzLnNsaWNlISgtNC4uLTEpCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiIGlzIGEgIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCIgaXMgYSAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbHdheXMgcmVtYWluIG9wZW4iIGRvCi0gICAgICBAYnVmZmVyLnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGJ1ZmZlcikudG8gYmVfb3BlbgogICAgICAgQGJ1ZmZlci5jbG9zZQotICAgICAgQGJ1ZmZlci5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBidWZmZXIpLnRvIGJlX29wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVzcG9uZCB0byBwZWVrIGFuZCBhdmFpbGFibGUiIGRvCiAgICAgICBAYnVmZmVyLndyaXRlICJzb21lIGRhdGEiCi0gICAgICBAYnVmZmVyLnBlZWsuc2hvdWxkIGJlX3RydWUKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA5CisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoOSkKICAgICAgIEBidWZmZXIucmVhZCg0KQotICAgICAgQGJ1ZmZlci5wZWVrLnNob3VsZCBiZV90cnVlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNQorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDUpCiAgICAgICBAYnVmZmVyLnJlYWQoNSkKLSAgICAgIEBidWZmZXIucGVlay5zaG91bGQgYmVfZmFsc2UKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSAwCisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgYWJsZSB0byByZXNldCB0aGUgYnVmZmVyIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAidGVzdCBkYXRhIgogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoImZvb2JhciIpCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNgotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gImZvb2JhciIKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNikKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiZm9vYmFyIikKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gMAorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSgwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjb3B5IHRoZSBnaXZlbiBzdHJpbmcgd2hlbiByZXNldHRpbmcgdGhlIGJ1ZmZlciIgZG8KICAgICAgIHMgPSAidGhpcyBpcyBhIHRlc3QiCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcihzKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDE0CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDE0KQogICAgICAgQGJ1ZmZlci5yZWFkKDEwKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDQKLSAgICAgIHMuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCIKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNCkKKyAgICAgIGV4cGVjdChzKS50byBlcSgidGhpcyBpcyBhIHRlc3QiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gZnJvbSByZWFkIHdoYXQgd2FzIGdpdmVuIGluIHdyaXRlIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAidGVzdCBkYXRhIgotICAgICAgQGJ1ZmZlci5yZWFkKDQpLnNob3VsZCA9PSAidGVzdCIKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICIgZGF0YSIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoNCkpLnRvIGVxKCJ0ZXN0IikKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiIGRhdGEiKQogICAgICAgQGJ1ZmZlci53cml0ZSAiZm9vIgogICAgICAgQGJ1ZmZlci53cml0ZSAiIGJhciIKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICJmb28gYmFyIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCJmb28gYmFyIikKICAgICBlbmQKLSAgICAKKwogICAgIGl0ICJzaG91bGQgdGhyb3cgYW4gRU9GRXJyb3Igd2hlbiB0aGVyZSBpc24ndCBlbm91Z2ggZGF0YSBpbiB0aGUgYnVmZmVyIiBkbwogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoIiIpCi0gICAgICBsYW1iZGF7QGJ1ZmZlci5yZWFkKDEpfS5zaG91bGQgcmFpc2VfZXJyb3IoRU9GRXJyb3IpCisgICAgICBleHBlY3R7QGJ1ZmZlci5yZWFkKDEpfS50byByYWlzZV9lcnJvcihFT0ZFcnJvcikKIAogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoIjEyMzQiKQotICAgICAgbGFtYmRhe0BidWZmZXIucmVhZCg1KX0uc2hvdWxkIHJhaXNlX2Vycm9yKEVPRkVycm9yKQorICAgICAgZXhwZWN0e0BidWZmZXIucmVhZCg1KX0udG8gcmFpc2VfZXJyb3IoRU9GRXJyb3IpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIElPU3RyZWFtVHJhbnNwb3J0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAaW5wdXQgPSBtb2NrKCJJbnB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQG91dHB1dCA9IG1vY2soIk91dHB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQHRyYW5zID0gSU9TdHJlYW1UcmFuc3BvcnQubmV3KEBpbnB1dCwgQG91dHB1dCkKKyAgICAgIEBpbnB1dCA9IGRvdWJsZSgiSW5wdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIEBvdXRwdXQgPSBkb3VibGUoIk91dHB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgQHRyYW5zID0gVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydC5uZXcoQGlucHV0LCBAb3V0cHV0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBpbnB1dCkudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9ja19pbnB1dCIpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9ja19vdXRwdXQiKQorICAgICAgZXhwZWN0KEB0cmFucy50b19zKS50byBlcSgiaW9zdHJlYW0oaW5wdXQ9bW9ja19pbnB1dCxvdXRwdXQ9bW9ja19vdXRwdXQpIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgb3BlbiBhcyBsb25nIGFzIGJvdGggaW5wdXQgb3Igb3V0cHV0IGFyZSBvcGVuIiBkbwotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGQgYmVfb3BlbgotICAgICAgQGlucHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKGZhbHNlKQotICAgICAgQG91dHB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGRfbm90IGJlX29wZW4KKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIGJlX29wZW4KKyAgICAgIGFsbG93KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKGZhbHNlKQorICAgICAgYWxsb3coQG91dHB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS5ub3RfdG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggcmVhZC93cml0ZSB0byBpbnB1dC9vdXRwdXQiIGRvCi0gICAgICBAaW5wdXQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTcpLmFuZF9yZXR1cm4oIisgcmVhZCIpCi0gICAgICBAb3V0cHV0LnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikuYW5kX3JldHVybigiKyB3cml0ZSIpCi0gICAgICBAdHJhbnMucmVhZCgxNykuc2hvdWxkID09ICIrIHJlYWQiCi0gICAgICBAdHJhbnMud3JpdGUoImZvb2JhciIpLnNob3VsZCA9PSAiKyB3cml0ZSIKKyAgICAgIGV4cGVjdChAaW5wdXQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTcpLmFuZF9yZXR1cm4oIisgcmVhZCIpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpLmFuZF9yZXR1cm4oIisgd3JpdGUiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKDE3KSkudG8gZXEoIisgcmVhZCIpCisgICAgICBleHBlY3QoQHRyYW5zLndyaXRlKCJmb29iYXIiKSkudG8gZXEoIisgd3JpdGUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSBib3RoIGlucHV0IGFuZCBvdXRwdXQgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBAaW5wdXQuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgQG91dHB1dC5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoQGlucHV0KS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEB0cmFucy5jbG9zZQogICAgIGVuZAogICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKaW5kZXggYjg1MThjOC4uYjJjZDA0YiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKQEAgLTE3LDMwICsxNywzMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkJworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkIikKIAogaWYgZGVmaW5lZD8gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCiAKLSAgY2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgICBpbmNsdWRlIFRocmlmdAorICBkZXNjcmliZSAnQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCcgZG8KKyAgICAjIHNpbmNlIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgc2hvdWxkIGJlIGRpcmVjdGx5IGVxdWl2YWxlbnQgdG8KKyAgICAjIEJpbmFyeVByb3RvY29sLCB3ZSBkb24ndCBuZWVkIGFueSBjdXN0b20gc3BlY3MhCisgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICdhIGJpbmFyeSBwcm90b2NvbCcKIAotICAgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBkbwotICAgICAgIyBzaW5jZSBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHNob3VsZCBiZSBkaXJlY3RseSBlcXVpdmFsZW50IHRvIAotICAgICAgIyBCaW5hcnlQcm90b2NvbCwgd2UgZG9uJ3QgbmVlZCBhbnkgY3VzdG9tIHNwZWNzIQotICAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICdhIGJpbmFyeSBwcm90b2NvbCcKLQotICAgICAgZGVmIHByb3RvY29sX2NsYXNzCi0gICAgICAgIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKLSAgICAgIGVuZAorICAgIGRlZiBwcm90b2NvbF9jbGFzcworICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCiAgICAgZW5kCiAKLSAgICBkZXNjcmliZSBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSBkbworICAgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkgZG8KICAgICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCIgZG8KLSAgICAgICAgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpLnNob3VsZCBiZV9pbnN0YW5jZV9vZihCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiaW5hcnktYWNjZWwiKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAogZWxzZQogICBwdXRzICJza2lwcGluZyBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHNwZWMgYmVjYXVzZSBpdCBpcyBub3QgZGVmaW5lZC4iCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKaW5kZXggMGFiY2NiOC4uMDY1ZjVjZSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKQEAgLTE3LDQ3ICsxNyw1OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkJworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkIikKIAotY2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSAnQmluYXJ5UHJvdG9jb2wnIGRvCiAKLSAgZGVzY3JpYmUgQmluYXJ5UHJvdG9jb2wgZG8KLSAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgJ2EgYmluYXJ5IHByb3RvY29sJworICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgJ2EgYmluYXJ5IHByb3RvY29sJwogCi0gICAgZGVmIHByb3RvY29sX2NsYXNzCi0gICAgICBCaW5hcnlQcm90b2NvbAorICBkZWYgcHJvdG9jb2xfY2xhc3MKKyAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sCisgIGVuZAorCisgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2wgZG8KKworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldworICAgICAgQHByb3QgPSBwcm90b2NvbF9jbGFzcy5uZXcoQHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGEgbWVzc2FnZSBoZWFkZXIiIGRvCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS5leGFjdGx5KDIpLnRpbWVzLmFuZF9yZXR1cm4oCi0gICAgICAgIFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFldLnBhY2soJ04nKSwKLSAgICAgICAgWzQyXS5wYWNrKCdOJykKLSAgICAgICkgICAgICAKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigndGVzdE1lc3NhZ2UnKQotICAgICAgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luLnNob3VsZCA9PSBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCA0Ml0KKyAgICAgIEB0cmFucy53cml0ZShbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZXS5wYWNrKCdOJykpCisgICAgICBAdHJhbnMud3JpdGUoWzQyXS5wYWNrKCdOJykpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCd0ZXN0TWVzc2FnZScpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luKS50byBlcShbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCA0Ml0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBoZWFkZXIgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKC0xKQotICAgICAgbGFtYmRhIHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicpIGRvIHxlfAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigtMSkKKyAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicpIGRvIHxlfAogICAgICAgICBlLnR5cGUgPT0gVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04KICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaGVhZGVyIGRvZXMgbm90IGV4aXN0IGFuZCBzdHJpY3RfcmVhZCBpcyBlbmFibGVkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnN0cmljdF9yZWFkKS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBsYW1iZGEgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nKSBkbyB8ZXwgICAgICAgIAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6c3RyaWN0X3JlYWQpLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JykgZG8gfGV8CiAgICAgICAgIGUudHlwZSA9PSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgogICAgICAgZW5kCiAgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHByb3QudG9fcykudG8gZXEoImJpbmFyeShtZW1vcnkpIikKKyAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBCaW5hcnlQcm90b2NvbCIgZG8KLSAgICAgIEJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSkuc2hvdWxkIGJlX2luc3RhbmNlX29mKEJpbmFyeVByb3RvY29sKQorICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmluYXJ5IikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYiBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYgppbmRleCAyOGRhNzYwLi41OGQ2NWYwIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCkBAIC0xLDMgKzEsNCBAQAorIyBlbmNvZGluZzogYXNjaWktOGJpdAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xNyw3ICsxOCw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKIHNoYXJlZF9leGFtcGxlc19mb3IgJ2EgYmluYXJ5IHByb3RvY29sJyBkbwogICBiZWZvcmUoOmVhY2gpIGRvCkBAIC0yNiwzNCArMjcsMzQgQEAKICAgZW5kCiAKICAgaXQgInNob3VsZCBkZWZpbmUgdGhlIHByb3BlciBWRVJTSU9OXzEsIFZFUlNJT05fTUFTSyBBTkQgVFlQRV9NQVNLIiBkbwotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl9NQVNLKS5zaG91bGQgPT0gMHhmZmZmMDAwMAotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKS5zaG91bGQgPT0gMHg4MDAxMDAwMAotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VFlQRV9NQVNLKS5zaG91bGQgPT0gMHgwMDAwMDBmZgorICAgIGV4cGVjdChwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fTUFTSykpLnRvIGVxKDB4ZmZmZjAwMDApCisgICAgZXhwZWN0KHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKSkudG8gZXEoMHg4MDAxMDAwMCkKKyAgICBleHBlY3QocHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpUWVBFX01BU0spKS50byBlcSgweDAwMDAwMGZmKQogICBlbmQKIAogICBpdCAic2hvdWxkIG1ha2Ugc3RyaWN0X3JlYWQgcmVhZGFibGUiIGRvCi0gICAgQHByb3Quc3RyaWN0X3JlYWQuc2hvdWxkIGVxbCh0cnVlKQorICAgIGV4cGVjdChAcHJvdC5zdHJpY3RfcmVhZCkudG8gZXFsKHRydWUpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBzdHJpY3Rfd3JpdGUgcmVhZGFibGUiIGRvCi0gICAgQHByb3Quc3RyaWN0X3dyaXRlLnNob3VsZCBlcWwodHJ1ZSkKKyAgICBleHBlY3QoQHByb3Quc3RyaWN0X3dyaXRlKS50byBlcWwodHJ1ZSkKICAgZW5kICAgIAogCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsICJ0ZXN0TWVzc2FnZSIuc2l6ZSwgInRlc3RNZXNzYWdlIiwgMTddLnBhY2soIk5OYTExTiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsICJ0ZXN0TWVzc2FnZSIuc2l6ZSwgInRlc3RNZXNzYWdlIiwgMTddLnBhY2soIk5OYTExTiIpKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGhvdXQgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgbm90IHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKSAjIG5vIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aCBhIHZlcnNpb24gd2hlbiB3cml0ZXMgYXJlIHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMpICMgc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDFcMDAwXDAwMVwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgIAogCkBAIC02MSw2NCArNjIsNjcgQEAKIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBmaWVsZCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfZmllbGRfYmVnaW4oJ2ZvbycsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgM10ucGFjaygiY24iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgM10ucGFjaygiY24iKSkKICAgZW5kCiAgIAogICAjIGZpZWxkIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIFNUT1AgZmllbGQiIGRvCiAgICAgQHByb3Qud3JpdGVfZmllbGRfc3RvcAotICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSAiXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKCJcMDAwIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtYXAgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX21hcF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAxN10ucGFjaygiY2NOIik7CisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAxN10ucGFjaygiY2NOIikpOwogICBlbmQKICAgIAogICAjIG1hcCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBsaXN0IGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9saXN0X2JlZ2luKFRocmlmdDo6VHlwZXM6OkkxNiwgNDIpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKSkKICAgZW5kCiAgIAogICAjIGxpc3QgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgc2V0IGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9zZXRfYmVnaW4oVGhyaWZ0OjpUeXBlczo6STE2LCA0MikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYSBib29sIiBkbwogICAgIEBwcm90LndyaXRlX2Jvb2wodHJ1ZSkKICAgICBAcHJvdC53cml0ZV9ib29sKGZhbHNlKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMVwwMDAiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMVwwMDAiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgdHJlYXQgYSBuaWwgYm9vbCBhcyBmYWxzZSIgZG8KICAgICBAcHJvdC53cml0ZV9ib29sKG5pbCkKLSAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gIlwwMDAiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcSgiXDAwMCIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGJ5dGUiIGRvCiAgICAgIyBieXRlIGlzIHNtYWxsIGVub3VnaCwgbGV0J3MgY2hlY2sgLTEyOC4uMTI3CiAgICAgKC0xMjguLjEyNykuZWFjaCBkbyB8aXwKICAgICAgIEBwcm90LndyaXRlX2J5dGUoaSkKLSAgICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSBbaV0ucGFjaygnYycpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKFtpXS5wYWNrKCdjJykpCiAgICAgZW5kCi0gICAgIyBoYW5kaW5nIGl0IG51bWJlcnMgb3V0IG9mIHNpZ25lZCByYW5nZSBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yc3BlY192ZXJpZnkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjbGlwIG51bWJlcnMgb3V0IG9mIHNpZ25lZCByYW5nZSIgZG8KICAgICAoMTI4Li4yNTUpLmVhY2ggZG8gfGl8CiAgICAgICBAcHJvdC53cml0ZV9ieXRlKGkpCi0gICAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gW2ldLnBhY2soJ2MnKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcShbaV0ucGFjaygnYycpKQogICAgIGVuZAotICAgICMgYW5kIGxhc3RseSwgYSBCaWdudW0gaXMgZ29pbmcgdG8gZXJyb3Igb3V0Ci0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfYnl0ZSgyKio2NSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKKyAgZW5kCisKKyAgaXQgImVycm9ycyBvdXQgd2l0aCBhIEJpZ251bSIgZG8KKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9ieXRlKDIqKjY1KSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGJ5dGUiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfYnl0ZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfYnl0ZShuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGFuIGkxNiIgZG8KQEAgLTEzMCwxNCArMTM0LDE0IEBACiAgICAgIyBhbmQgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAogICAgIEBwcm90LndyaXRlX2kxNigyKioxNSArIDUpCiAgICAgCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMFwzNzRcMDAwXDAwMFwwMjFcMDAwXDAwMFwzMzBcMzYwXDAwNlwyNzNcMTc3XDM3N1wyMDBcMDA1IgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAwXDM3NFwwMDBcMDAwXDAyMVwwMDBcMDAwXDMzMFwzNjBcMDA2XDI3M1wxNzdcMzc3XDIwMFwwMDUiKQogICAgIAogICAgICMgYSBCaWdudW0gc2hvdWxkIGVycm9yCiAgICAgIyBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMTYoMioqNjUpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGkxNiIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMTYobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2kxNihuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGFuIGkzMiIgZG8KQEAgLTE0NywxNCArMTUxLDE0IEBACiAgICAgICBAcHJvdC53cml0ZV9pMzIoaSkKICAgICBlbmQKICAgICAjIHRyeSBzb21ldGhpbmcgb3V0IG9mIHNpZ25lZCByYW5nZSwgaXQgc2hvdWxkIGNsaXAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAwXDAwMFwwMDAiICsgIlwzNzdcMzc2XDAzN1xyIiArICJcMzc3XDM3N1wzNjZcMDM0IiArICJcMzc3XDM3N1wzNzdcMzc1IiArICJcMDAwXDAwMFwwMDBcMDAwIiArICJcMDAwI1wzNDBcMjAzIiArICJcMDAwXDAwMDArIiArICJcMTc3XDM3N1wzNzdcMzc3IgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAwXDAwMFwwMDAiICsgIlwzNzdcMzc2XDAzN1xyIiArICJcMzc3XDM3N1wzNjZcMDM0IiArICJcMzc3XDM3N1wzNzdcMzc1IiArICJcMDAwXDAwMFwwMDBcMDAwIiArICJcMDAwI1wzNDBcMjAzIiArICJcMDAwXDAwMDArIiArICJcMTc3XDM3N1wzNzdcMzc3IikKICAgICBbMiAqKiAzMSArIDUsIDIgKiogNjUgKyA1XS5lYWNoIGRvIHxpfAotICAgICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTMyKGkpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpICAKKyAgICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2kzMihpKSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpICAKICAgICBlbmQKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgaTMyIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2kzMihuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTMyKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTY0IiBkbwpAQCAtMTY0LDcgKzE2OCw3IEBACiAgICAgICBAcHJvdC53cml0ZV9pNjQoaSkKICAgICBlbmQKICAgICAjIHRyeSBzb21ldGhpbmcgb3V0IG9mIHNpZ25lZCByYW5nZSwgaXQgc2hvdWxkIGNsaXAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gWyJcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIsCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbIlwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKICAgICAgICJcMzc3XDM3N1wzNjRcMzAzXDAzNVwyNDQrXSIsCiAgICAgICAiXDM3N1wzNzdcMzc3XDM3N1wzNzZcMjMxOlwzNDEiLAogICAgICAgIlwzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMDI2IiwKQEAgLTE3MiwxMiArMTc2LDEyIEBACiAgICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwzMTciLAogICAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwI1wzNDBcMjA0IiwKICAgICAgICJcMDAwXDAwMFwwMDBcMDAyXDM0MFwzMTF+XDM2NSIsCi0gICAgICAiXDE3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzciXS5qb2luKCIiKQotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2k2NCgyICoqIDY1ICsgNSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKKyAgICAgICJcMTc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyJdLmpvaW4oIiIpKQorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2k2NCgyICoqIDY1ICsgNSkgfS50byByYWlzZV9lcnJvcihSYW5nZUVycm9yKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBpNjQiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTY0KG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pNjQobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGRvdWJsZSIgZG8KQEAgLTE4NSw4MSArMTg5LDEyNCBAQAogICAgIHZhbHVlcyA9IFtGbG9hdDo6TUlOLC0xMjMxLjE1MzI1LCAtMTIzMTIzLjIzLCAtMjMuMjM1MTUxMjMsIDAsIDEyMzUxLjEzMjUsIDUyMy4yMywgRmxvYXQ6Ok1BWF0KICAgICB2YWx1ZXMuZWFjaCBkbyB8ZnwKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZShmKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtmXS5wYWNrKCJHIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW2ZdLnBhY2soIkciKSkKICAgICBlbmQKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgZG91YmxlIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2RvdWJsZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfZG91YmxlKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKLSAgCi0gIGl0ICJzaG91bGQgd3JpdGUgYSBzdHJpbmciIGRvCi0gICAgc3RyID0gImhlbGxvIHdvcmxkIgotICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtzdHIuc2l6ZV0ucGFjaygiTiIpICsgc3RyCisKKyAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIHN0cmluZycgZG8KKyAgICAgIHN0ciA9ICdhYmMnCisgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQorICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycycgZG8KKyAgICAgIHN0ciA9ICJhYmMgXHUyMEFDIFx1MjBBRCIuZW5jb2RlKCdVVEYtOCcpCisgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQorICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsIDB4NjEsIDB4NjIsIDB4NjMsIDB4MjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTIsIDB4ODIsIDB4QUMsIDB4MjAsIDB4RTIsIDB4ODIsIDB4QURdKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBzaG91bGQgd3JpdGUgYSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMgYW5kIHRyYW5zY29kaW5nJyBkbworICAgICAgc3RyID0gImFiYyBcdTIwQUMiLmVuY29kZSgnSVNPLTg4NTktMTUnKQorICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKKyAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDYxLCAweDYyLCAweDYzLCAweDIwLCAweEUyLCAweDgyLCAweEFDXSkKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgd3JpdGUgYSBiaW5hcnkgc3RyaW5nJyBkbworICAgICAgYnVmZmVyID0gWzAsIDEsIDIsIDNdLnBhY2soJ0MqJykKKyAgICAgIEBwcm90LndyaXRlX2JpbmFyeShidWZmZXIpCisgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pCisgICAgZW5kCisgIGVsc2UKKyAgICBpdCAnc2hvdWxkIHdyaXRlIGEgc3RyaW5nJyBkbworICAgICAgc3RyID0gJ2FiYycKKyAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCisgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdKQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIGJpbmFyeSBzdHJpbmcnIGRvCisgICAgICBidWZmZXIgPSBbMCwgMSwgMiwgM10ucGFjaygnQyonKQorICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KGJ1ZmZlcikKKyAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pCisgICAgZW5kCiAgIGVuZAotICAKKwogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgc3RyaW5nIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX3N0cmluZyhuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfc3RyaW5nKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGhvdXQgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgbm90IHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKSAjIG5vIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRoIGEgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykgIyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAgICMgbWVzc2FnZSBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBmaWVsZCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdLnBhY2soImNuIikpCi0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdKQogICBlbmQKICAgCiAgICMgZmllbGQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgc3RvcCBmaWVsZCIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUT1BdLnBhY2soImMiKSk7Ci0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KKyAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9iZWdpbikudG8gZXEoW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0pCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmVhZCBhIG1hcCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIFRocmlmdDo6VHlwZXM6Okk2NCwgNDJdLnBhY2soImNjTiIpKQotICAgIEBwcm90LnJlYWRfbWFwX2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCBUaHJpZnQ6OlR5cGVzOjpJNjQsIDQyXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgVGhyaWZ0OjpUeXBlczo6STY0LCA0Ml0pCiAgIGVuZAogICAKICAgIyBtYXAgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgbGlzdCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XS5wYWNrKCJjTiIpKQotICAgIEBwcm90LnJlYWRfbGlzdF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfbGlzdF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddKQogICBlbmQKICAgCiAgICMgbGlzdCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBzZXQgaGVhZGVyIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10ucGFjaygiY04iKSkKLSAgICBAcHJvdC5yZWFkX3NldF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10pCiAgIGVuZAogICAKICAgIyBzZXQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYm9vbCIgZG8KICAgICBAdHJhbnMud3JpdGUoIlwwMDFcMDAwIik7Ci0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSB0cnVlCi0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSBmYWxzZQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYnl0ZSIgZG8KICAgICBbLTEyOCwgLTU3LCAtMywgMCwgMTcsIDI0LCAxMjddLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2ldLnBhY2soImMiKSkKLSAgICAgIEBwcm90LnJlYWRfYnl0ZS5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYnl0ZSkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMjY3LDcgKzMxNCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjE1LCAtNTIzNywgLTM1MywgMCwgMTUyNywgMjIzNCwgMioqMTUtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygibiIpKTsKLSAgICAgIEBwcm90LnJlYWRfaTE2LnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pMTYpLnRvIGVxKGkpCiAgICAgZW5kCiAgIGVuZAogICAKQEAgLTI3NSw3ICszMjIsNyBAQAogICAgICMgdHJ5IGEgc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgWy0yKiozMSwgLTIzNTEyNSwgLTYyMzYsIDAsIDIzNTEsIDEyMzEyMywgMioqMzEtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygiTiIpKQotICAgICAgQHByb3QucmVhZF9pMzIuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kzMikudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMjgzLDcgKzMzMCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjYzLCAtMTIzNTEyMzEyLCAtNjM0NiwgMCwgMzIsIDIzNDYzMjIzMjMsIDIqKjYzLTFdLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2kgPj4gMzIsIGkgJiAweEZGRkZGRkZGXS5wYWNrKCJOTiIpKQotICAgICAgQHByb3QucmVhZF9pNjQuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2k2NCkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMjkxLDI3ICszMzgsNjMgQEAKICAgICAjIHRyeSBhIHJhbmRvbSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbRmxvYXQ6Ok1JTiwgLTIzMTIzMS4xMjM1MSwgLTMyMy4yMzM1MTMsIDAsIDEyMy4yMzUxMjM1LCAyMzUxMjM1LjEyMzUxMjM1LCBGbG9hdDo6TUFYXS5lYWNoIGRvIHxmfAogICAgICAgQHRyYW5zLndyaXRlKFtmXS5wYWNrKCJHIikpOwotICAgICAgQHByb3QucmVhZF9kb3VibGUuc2hvdWxkID09IGYKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2RvdWJsZSkudG8gZXEoZikKICAgICBlbmQKICAgZW5kCi0gIAotICBpdCAic2hvdWxkIHJlYWQgYSBzdHJpbmciIGRvCi0gICAgc3RyID0gImhlbGxvIHdvcmxkIgotICAgIEB0cmFucy53cml0ZShbc3RyLnNpemVdLnBhY2soIk4iKSArIHN0cikKLSAgICBAcHJvdC5yZWFkX3N0cmluZy5zaG91bGQgPT0gc3RyCisKKyAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCisgICAgaXQgJ3Nob3VsZCByZWFkIGEgc3RyaW5nJyBkbworICAgICAgIyBpMzIgb2YgdmFsdWUgMywgZm9sbG93ZWQgYnkgdGhyZWUgY2hhcmFjdGVycy9VVEYtOCBieXRlcyAnYScsICdiJywgJ2MnCisgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10ucGFjaygnQyonKQorICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKKyAgICAgIGEgPSBAcHJvdC5yZWFkX3N0cmluZworICAgICAgZXhwZWN0KGEpLnRvIGVxKCdhYmMnLmVuY29kZSgnVVRGLTgnKSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcgY29udGFpbmluZyB1bmljb2RlIGNoYXJhY3RlcnMgZnJvbSBVVEYtOCBlbmNvZGVkIGJ1ZmZlcicgZG8KKyAgICAgICMgaTMyIG9mIHZhbHVlIDMsIGZvbGxvd2VkIGJ5IG9uZSBjaGFyYWN0ZXIgVSsyMEFDIG1hZGUgdXAgb2YgdGhyZWUgYnl0ZXMKKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweEUyLCAweDgyLCAweEFDXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCisgICAgICBleHBlY3QoYSkudG8gZXEoIlx1MjBBQyIuZW5jb2RlKCdVVEYtOCcpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVhZCBhIGJpbmFyeSBzdHJpbmcnIGRvCisgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQorICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKKyAgICAgIGEgPSBAcHJvdC5yZWFkX2JpbmFyeQorICAgICAgZXhwZWN0KGEpLnRvIGVxKFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgZW5kCisgIGVsc2UKKyAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcnIGRvCisgICAgICAjIGkzMiBvZiB2YWx1ZSAzLCBmb2xsb3dlZCBieSB0aHJlZSBjaGFyYWN0ZXJzL1VURi04IGJ5dGVzICdhJywgJ2InLCAnYycKKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RyaW5nKS50byBlcSgnYWJjJykKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVhZCBhIGJpbmFyeSBzdHJpbmcnIGRvCisgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQorICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKKyAgICAgIGEgPSBAcHJvdC5yZWFkX2JpbmFyeQorICAgICAgZXhwZWN0KGEpLnRvIGVxKFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpKQorICAgIGVuZAogICBlbmQKIAogICBpdCAic2hvdWxkIHBlcmZvcm0gYSBjb21wbGV0ZSBycGMgd2l0aCBubyBhcmdzIG9yIHJldHVybiIgZG8KICAgICBzcnZfdGVzdCgKICAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5zZW5kX3ZvaWRNZXRob2QoKX0sCi0gICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQucmVjdl92b2lkTWV0aG9kLnNob3VsZCA9PSBuaWx9CisgICAgICBwcm9jIHt8Y2xpZW50fCBleHBlY3QoY2xpZW50LnJlY3Zfdm9pZE1ldGhvZCkudG8gZXEobmlsKX0KICAgICApCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcGVyZm9ybSBhIGNvbXBsZXRlIHJwYyB3aXRoIGEgcHJpbWl0aXZlIHJldHVybiB0eXBlIiBkbwogICAgIHNydl90ZXN0KAogICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnNlbmRfcHJpbWl0aXZlTWV0aG9kKCl9LAotICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnJlY3ZfcHJpbWl0aXZlTWV0aG9kLnNob3VsZCA9PSAxfQorICAgICAgcHJvYyB7fGNsaWVudHwgZXhwZWN0KGNsaWVudC5yZWN2X3ByaW1pdGl2ZU1ldGhvZCkudG8gZXEoMSl9CiAgICAgKQogICBlbmQKIApAQCAtMzIyLDcgKzQwNSw3IEBACiAgICAgICAgIHJlc3VsdCA9IGNsaWVudC5yZWN2X3N0cnVjdE1ldGhvZAogICAgICAgICByZXN1bHQuc2V0X2J5dGVfbWFwID0gbmlsCiAgICAgICAgIHJlc3VsdC5tYXBfYnl0ZV9tYXAgPSBuaWwKLSAgICAgICAgcmVzdWx0LnNob3VsZCA9PSBGaXh0dXJlczo6Q09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVAorICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcShGaXh0dXJlczo6Q09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCkKICAgICAgIH0KICAgICApCiAgIGVuZApAQCAtMzQzLDkgKzQyNiw5IEBACiAgICAgY2xpZW50cHJvdG8gPSBwcm90b2NvbF9jbGFzcy5uZXcoY2xpZW50c2lkZSkKICAgICBzZXJ2ZXJwcm90byA9IHByb3RvY29sX2NsYXNzLm5ldyhzZXJ2ZXJzaWRlKQogCi0gICAgcHJvY2Vzc29yID0gU3J2OjpQcm9jZXNzb3IubmV3KFNydkhhbmRsZXIubmV3KQorICAgIHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6U3J2OjpQcm9jZXNzb3IubmV3KFNydkhhbmRsZXIubmV3KQogCi0gICAgY2xpZW50ID0gU3J2OjpDbGllbnQubmV3KGNsaWVudHByb3RvLCBjbGllbnRwcm90bykKKyAgICBjbGllbnQgPSBUaHJpZnQ6OlRlc3Q6OlNydjo6Q2xpZW50Lm5ldyhjbGllbnRwcm90bywgY2xpZW50cHJvdG8pCiAKICAgICAjIGZpcnN0IGJsb2NrCiAgICAgZmlyc3RibG9jay5jYWxsKGNsaWVudCkKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIgYi9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODY1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiCkBAIC0wLDAgKzEsMTYwIEBACisjIGVuY29kaW5nOiBVVEYtOAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSBUaHJpZnQ6OkJ5dGVzIGRvCisgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JworICAgIGRlc2NyaWJlICcuZW1wdHlfYnl0ZV9idWZmZXInIGRvCisgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXInIGRvCisgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGIuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBlbmQKKworICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyIG9mIGdpdmVuIHNpemUnIGRvCisgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyIDIKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgyKQorICAgICAgICBleHBlY3QoYi5nZXRieXRlKDApKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5nZXRieXRlKDEpKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcnIGRvCisgICAgICBpdCAnc2hvdWxkIGNoYW5nZSBlbmNvZGluZycgZG8KKyAgICAgICAgZSA9ICdTVFJJTkcnLmVuY29kZSgnVVRGLTgnKQorICAgICAgICBleHBlY3QoZS5lbmNvZGluZykubm90X3RvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyBlCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmdldF9zdHJpbmdfYnl0ZScgZG8KKyAgICAgIGl0ICdzaG91bGQgZ2V0IHRoZSBieXRlIGF0IGluZGV4JyBkbworICAgICAgICBzID0gIlx4NDFceDQyIgorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMCkpLnRvIGVxKDB4NDEpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKSkudG8gZXEoMHg0MikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5zZXRfc3RyaW5nX2J5dGUnIGRvCisgICAgICBpdCAnc2hvdWxkIHNldCBieXRlIHZhbHVlIGF0IGluZGV4JyBkbworICAgICAgICBzID0gIlx4NDFceDQyIgorICAgICAgICBUaHJpZnQ6OkJ5dGVzLnNldF9zdHJpbmdfYnl0ZShzLCAwLCAweDQzKQorICAgICAgICBleHBlY3Qocy5nZXRieXRlKDApKS50byBlcSgweDQzKQorICAgICAgICBleHBlY3QocykudG8gZXEoJ0NCJykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXInIGRvCisgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgVVRGLTggU3RyaW5nIHRvIGJ5dGUgYnVmZmVyJyBkbworICAgICAgICBlID0gIlx1MjBBQyIuZW5jb2RlKCdVVEYtOCcpICMgYSBzdHJpbmcgd2l0aCBldXJvIHNpZ24gY2hhcmFjdGVyIFUrMjBBQworICAgICAgICBleHBlY3QoZS5sZW5ndGgpLnRvIGVxKDEpCisKKyAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIGUKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGV4cGVjdChhLmxlbmd0aCkudG8gZXEoMykKKyAgICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHhFMiwgMHg4MiwgMHhBQ10pCisgICAgICBlbmQKKworICAgICAgaXQgJ3Nob3VsZCBjb252ZXJ0IElTTy04ODU5LTE1IFN0cmluZyB0byBVVEYtOCBieXRlIGJ1ZmZlcicgZG8KKyAgICAgICAgIyBBc3N1bXB0aW9ucworICAgICAgICBlID0gIlx1MjBBQyIuZW5jb2RlKCdJU08tODg1OS0xNScpICMgYSBzdHJpbmcgd2l0aCBldXJvIHNpZ24gY2hhcmFjdGVyIFUrMjBBQywgdGhlbiBjb252ZXJ0ZWQgdG8gSVNPLTg4NTktMTUKKyAgICAgICAgZXhwZWN0KGUubGVuZ3RoKS50byBlcSgxKQorICAgICAgICBleHBlY3QoZS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEE0XSkgIyBldXJvIHNpZ24gaXMgYSBkaWZmZXJlbnQgY29kZSBwb2ludCBpbiBJU08tODg1OS0xNQorCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciBlCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgICBleHBlY3QoYS5sZW5ndGgpLnRvIGVxKDMpCisgICAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4RTIsIDB4ODIsIDB4QUNdKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLmNvbnZlcnRfdG9fc3RyaW5nJyBkbworICAgICAgaXQgJ3Nob3VsZCBjb252ZXJ0IFVURi04IGJ5dGUgYnVmZmVyIHRvIGEgVVRGLTggU3RyaW5nJyBkbworICAgICAgICBlID0gWzB4RTIsIDB4ODIsIDB4QUNdLnBhY2soIkMqIikKKyAgICAgICAgZXhwZWN0KGUuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nIGUKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJcdTIwQUMiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgZWxzZSAjIFJVQllfVkVSU0lPTgorICAgIGRlc2NyaWJlICcuZW1wdHlfYnl0ZV9idWZmZXInIGRvCisgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXInIGRvCisgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMCkKKyAgICAgIGVuZAorCisgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXIgb2YgZ2l2ZW4gc2l6ZScgZG8KKyAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgMgorICAgICAgICBleHBlY3QoYi5sZW5ndGgpLnRvIGVxKDIpCisgICAgICAgIGV4cGVjdChiWzBdKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYlsxXSkudG8gZXEoMCkKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcnIGRvCisgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCisgICAgICAgIGUgPSAnU1RSSU5HJworICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcgZQorICAgICAgICBleHBlY3QoYSkudG8gZXEoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGJlKGUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuZ2V0X3N0cmluZ19ieXRlJyBkbworICAgICAgaXQgJ3Nob3VsZCBnZXQgdGhlIGJ5dGUgYXQgaW5kZXgnIGRvCisgICAgICAgIHMgPSAiXHg0MVx4NDIiCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKSkudG8gZXEoMHg0MSkKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpKS50byBlcSgweDQyKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZXNjcmliZSAnLnNldF9zdHJpbmdfYnl0ZScgZG8KKyAgICAgIGl0ICdzaG91bGQgc2V0IGJ5dGUgdmFsdWUgYXQgaW5kZXgnIGRvCisgICAgICAgIHMgPSAiXHg0MVx4NDIiCisgICAgICAgIFRocmlmdDo6Qnl0ZXMuc2V0X3N0cmluZ19ieXRlKHMsIDAsIDB4NDMpCisgICAgICAgIGV4cGVjdChzWzBdKS50byBlcSgweDQzKQorICAgICAgICBleHBlY3QocykudG8gZXEoJ0NCJykKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVzY3JpYmUgJy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXInIGRvCisgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCisgICAgICAgIGUgPSAnU1RSSU5HJworICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQorICAgICAgICBleHBlY3QoYSkudG8gZXEoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGJlKGUpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGRlc2NyaWJlICcuY29udmVydF90b19zdHJpbmcnIGRvCisgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCisgICAgICAgIGUgPSAnU1RSSU5HJworICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyBlCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvY2xpZW50X3NwZWMucmIgYi9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgppbmRleCBlNzA3ZDgxLi5kNWQ0Y2VlIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgpAQCAtMTcsODQgKzE3LDgyIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdENsaWVudFNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKK2Rlc2NyaWJlICdDbGllbnQnIGRvCiAKICAgY2xhc3MgQ2xpZW50U3BlYwogICAgIGluY2x1ZGUgVGhyaWZ0OjpDbGllbnQKICAgZW5kCiAKICAgYmVmb3JlKDplYWNoKSBkbwotICAgIEBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKKyAgICBAcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKICAgICBAY2xpZW50ID0gQ2xpZW50U3BlYy5uZXcoQHByb3QpCiAgIGVuZAogCi0gIGRlc2NyaWJlIENsaWVudCBkbworICBkZXNjcmliZSBUaHJpZnQ6OkNsaWVudCBkbwogICAgIGl0ICJzaG91bGQgcmUtdXNlIGlwcm90IGZvciBvcHJvdCBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZCIgZG8KLSAgICAgIEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQGlwcm90Jykuc2hvdWxkIGVxbChAcHJvdCkKLSAgICAgIEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQG9wcm90Jykuc2hvdWxkIGVxbChAcHJvdCkKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BpcHJvdCcpKS50byBlcWwoQHByb3QpCisgICAgICBleHBlY3QoQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAb3Byb3QnKSkudG8gZXFsKEBwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZW5kIGEgdGVzdCBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgTWVzc2FnZVR5cGVzOjpDQUxMLCAwKQotICAgICAgbW9ja19hcmdzID0gbW9jaygnIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+JykKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6Zm9vPSkud2l0aCgnZm9vJykKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6YmFyPSkud2l0aCg0MikKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6dHJhbnMpIGRvCi0gICAgICAgIG1vY2soJ3RyYW5zJykudGVlIGRvIHx0cmFuc3wKLSAgICAgICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApCisgICAgICBtb2NrX2FyZ3MgPSBkb3VibGUoJyM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPicpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDpmb289KS53aXRoKCdmb28nKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6YmFyPSkud2l0aCg0MikKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dHJhbnMpIGRvCisgICAgICAgIGRvdWJsZSgndHJhbnMnKS50YXAgZG8gfHRyYW5zfAorICAgICAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBrbGFzcyA9IHN0dWIoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKKyAgICAgIGtsYXNzID0gZG91YmxlKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCiAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UnLCBrbGFzcywgOmZvbyA9PiAnZm9vJywgOmJhciA9PiA0MikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBpZCB3aGVuIHNlbmRpbmcgbWVzc2FnZXMiIGRvCi0gICAgICBwZW5kaW5nICJpdCBzZWVtcyBzZXF1ZW5jZSBpZHMgYXJlIGNvbXBsZXRlbHkgaWdub3JlZCByaWdodCBub3ciIGRvCi0gICAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsICBNZXNzYWdlVHlwZXM6OkNBTEwsIDApLm9yZGVyZWQKLSAgICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlMicsIE1lc3NhZ2VUeXBlczo6Q0FMTCwgMSkub3JkZXJlZAotICAgICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UzJywgTWVzc2FnZVR5cGVzOjpDQUxMLCAyKS5vcmRlcmVkCi0gICAgICAgIEBwcm90LnN0dWIhKDp3cml0ZV9tZXNzYWdlX2VuZCkKLSAgICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuIG1vY2soInRyYW5zIikuYXNfbnVsbF9vYmplY3QKLSAgICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlJywgbW9jaygiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UyJywgbW9jaygiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UzJywgbW9jaygiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KSAgICAgICAgCi0gICAgICBlbmQKKyAgICAgIHBlbmRpbmcgIml0IHNlZW1zIHNlcXVlbmNlIGlkcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIHJpZ2h0IG5vdyIKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCAgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApLm9yZGVyZWQKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UyJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDEpLm9yZGVyZWQKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UzJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDIpLm9yZGVyZWQKKyAgICAgIEBwcm90LnN0dWIhKDp3cml0ZV9tZXNzYWdlX2VuZCkKKyAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybiBkb3VibGUoInRyYW5zIikuYXNfbnVsbF9vYmplY3QKKyAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMicsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMycsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWNlaXZlIGEgdGVzdCBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBNZXNzYWdlVHlwZXM6OkNBTEwsIDBdCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKLSAgICAgIG1vY2tfa2xhc3MgPSBtb2NrKCIjPE1vY2tDbGFzczptb2NrPiIpCi0gICAgICBtb2NrX2tsYXNzLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQotICAgICAgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2Uoc3R1YigiTW9ja0NsYXNzIiwgOm5ldyA9PiBtb2NrX2tsYXNzKSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQorICAgICAgbW9ja19rbGFzcyA9IGRvdWJsZSgiIzxNb2NrQ2xhc3M6bW9jaz4iKQorICAgICAgZXhwZWN0KG1vY2tfa2xhc3MpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCisgICAgICBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShkb3VibGUoIk1vY2tDbGFzcyIsIDpuZXcgPT4gbW9ja19rbGFzcykpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGhhbmRsZSByZWNlaXZlZCBleGNlcHRpb25zIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgMF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQotICAgICAgQXBwbGljYXRpb25FeGNlcHRpb24uc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBkbwotICAgICAgICBTdGFuZGFyZEVycm9yLm5ldy50ZWUgZG8gfG1vY2tfZXhjfAotICAgICAgICAgIG1vY2tfZXhjLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgMF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKS50byByZWNlaXZlKDpuZXcpIGRvCisgICAgICAgIFN0YW5kYXJkRXJyb3IubmV3LnRhcCBkbyB8bW9ja19leGN8CisgICAgICAgICAgZXhwZWN0KG1vY2tfZXhjKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQorICAgICAgZXhwZWN0IHsgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UobmlsKSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSB0cmFuc3BvcnQgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNlbmRpbmcgYSBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfYmVnaW4pCi0gICAgICBAcHJvdC5zaG91bGRfbm90X3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgbW9ja19hcmdzID0gbW9jaygiIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+IikKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgdHJhbnMgPSBtb2NrKCJNb2NrVHJhbnNwb3J0IikKLSAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIGtsYXNzID0gbW9jaygiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQotICAgICAgbGFtYmRhIHsgQGNsaWVudC5zZW5kX21lc3NhZ2UoInRlc3RNZXNzYWdlIiwga2xhc3MpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCisgICAgICBhbGxvdyhAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikKKyAgICAgIGV4cGVjdChAcHJvdCkubm90X3RvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgbW9ja19hcmdzID0gZG91YmxlKCIjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4iKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgICAgdHJhbnMgPSBkb3VibGUoIk1vY2tUcmFuc3BvcnQiKQorICAgICAgYWxsb3coQHByb3QpLnRvIHJlY2VpdmUoOnRyYW5zKS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGtsYXNzID0gZG91YmxlKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCisgICAgICBleHBlY3QgeyBAY2xpZW50LnNlbmRfbWVzc2FnZSgidGVzdE1lc3NhZ2UiLCBrbGFzcykgfS50byByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCmluZGV4IDFmYTIxODIuLjUxM2RkNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIKQEAgLTEsMyArMSw0IEBACisjIGVuY29kaW5nOiBVVEYtOAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xNyw3ICsxOCw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKIGRlc2NyaWJlIFRocmlmdDo6Q29tcGFjdFByb3RvY29sIGRvCiAgIFRFU1RTID0gewpAQCAtMjUsNyArMjYsNyBAQAogICAgIDppMTYgPT4gKDAuLjE0KS5tYXAge3xzaGlmdHwgWzEgPDwgc2hpZnQsIC0oMSA8PCBzaGlmdCldfS5mbGF0dGVuLnNvcnQsCiAgICAgOmkzMiA9PiAoMC4uMzApLm1hcCB7fHNoaWZ0fCBbMSA8PCBzaGlmdCwgLSgxIDw8IHNoaWZ0KV19LmZsYXR0ZW4uc29ydCwKICAgICA6aTY0ID0+ICgwLi42MikubWFwIHt8c2hpZnR8IFsxIDw8IHNoaWZ0LCAtKDEgPDwgc2hpZnQpXX0uZmxhdHRlbi5zb3J0LAotICAgIDpzdHJpbmcgPT4gWyIiLCAiMSIsICJzaG9ydCIsICJmb3VydGVlbjEyMzQ1NiIsICJmaWZ0ZWVuMTIzNDU2NzgiLCAiMSIgKiAxMjcsICIxIiAqIDMwMDBdLAorICAgIDpzdHJpbmcgPT4gWyIiLCAiMSIsICJzaG9ydCIsICJmb3VydGVlbjEyMzQ1NiIsICJmaWZ0ZWVuMTIzNDU2NzgiLCAidW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIiwgIjEiICogMTI3LCAiMSIgKiAzMDAwXSwKICAgICA6YmluYXJ5ID0+IFsiIiwgIlwwMDEiLCAiXDAwMSIgKiA1LCAiXDAwMSIgKiAxNCwgIlwwMDEiICogMTUsICJcMDAxIiAqIDEyNywgIlwwMDEiICogMzAwMF0sCiAgICAgOmRvdWJsZSA9PiBbMC4wLCAxLjAsIC0xLjAsIDEuMSwgLTEuMSwgMTAwMDAwMDAuMSwgMS4wLzAuMCwgLTEuMC8wLjBdLAogICAgIDpib29sID0+IFt0cnVlLCBmYWxzZV0KQEAgLTQxLDcgKzQyLDcgQEAKICAgICAgICAgcHJvdG8uc2VuZCh3cml0ZXIocHJpbWl0aXZlX3R5cGUpLCB2YWx1ZSkKICAgICAgICAgIyBwdXRzICJidWY6ICN7dHJhbnMuaW5zcGVjdF9idWZmZXJ9IiBpZiBwcmltaXRpdmVfdHlwZSA9PSA6aTY0CiAgICAgICAgIHJlYWRfYmFjayA9IHByb3RvLnNlbmQocmVhZGVyKHByaW1pdGl2ZV90eXBlKSkKLSAgICAgICAgcmVhZF9iYWNrLnNob3VsZCA9PSB2YWx1ZQorICAgICAgICBleHBlY3QocmVhZF9iYWNrKS50byBlcSh2YWx1ZSkKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKQEAgLTYxLDEwICs2MiwxMCBAQAogCiAgICAgICAgIHByb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogICAgICAgICBuYW1lLCB0eXBlLCBpZCA9IHByb3RvLnJlYWRfZmllbGRfYmVnaW4KLSAgICAgICAgdHlwZS5zaG91bGQgPT0gdGhyaWZ0X3R5cGUKLSAgICAgICAgaWQuc2hvdWxkID09IDE1CisgICAgICAgIGV4cGVjdCh0eXBlKS50byBlcSh0aHJpZnRfdHlwZSkKKyAgICAgICAgZXhwZWN0KGlkKS50byBlcSgxNSkKICAgICAgICAgcmVhZF9iYWNrID0gcHJvdG8uc2VuZChyZWFkZXIocHJpbWl0aXZlX3R5cGUpKQotICAgICAgICByZWFkX2JhY2suc2hvdWxkID09IHZhbHVlCisgICAgICAgIGV4cGVjdChyZWFkX2JhY2spLnRvIGVxKHZhbHVlKQogICAgICAgICBwcm90by5yZWFkX2ZpZWxkX2VuZAogICAgICAgZW5kCiAgICAgZW5kCkBAIC03NCwxMyArNzUsMTMgQEAKICAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldwogICAgIHByb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogCi0gICAgc3RydWN0ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKKyAgICBzdHJ1Y3QgPSBUaHJpZnQ6OlRlc3Q6OkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QubmV3CiAgICAgIyBzZXRzIGFuZCBtYXBzIGRvbid0IGhhc2ggd2VsbC4uLiBub3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUuCiAgICAgc3RydWN0LndyaXRlKHByb3RvKQogCi0gICAgc3RydWN0MiA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QubmV3CisgICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6Q29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKICAgICBzdHJ1Y3QyLnJlYWQocHJvdG8pICAgIAotICAgIHN0cnVjdDIuc2hvdWxkID09IHN0cnVjdAorICAgIGV4cGVjdChzdHJ1Y3QyKS50byBlcShzdHJ1Y3QpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBtZXRob2QgY2FsbHMgY29ycmVjdGx5IiBkbwpAQCAtOTAsMTkgKzkxLDE5IEBACiAgICAgY2xpZW50X2luX3RyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgY2xpZW50X2luX3Byb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KGNsaWVudF9pbl90cmFucykKIAotICAgIHByb2Nlc3NvciA9IFNydjo6UHJvY2Vzc29yLm5ldyhKYW5reUhhbmRsZXIubmV3KQorICAgIHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6U3J2OjpQcm9jZXNzb3IubmV3KEphbmt5SGFuZGxlci5uZXcpCiAKLSAgICBjbGllbnQgPSBTcnY6OkNsaWVudC5uZXcoY2xpZW50X2luX3Byb3RvLCBjbGllbnRfb3V0X3Byb3RvKQorICAgIGNsaWVudCA9IFRocmlmdDo6VGVzdDo6U3J2OjpDbGllbnQubmV3KGNsaWVudF9pbl9wcm90bywgY2xpZW50X291dF9wcm90bykKICAgICBjbGllbnQuc2VuZF9KYW5reSgxKQogICAgICMgcHV0cyBjbGllbnRfb3V0X3RyYW5zLmluc3BlY3RfYnVmZmVyCiAgICAgcHJvY2Vzc29yLnByb2Nlc3MoY2xpZW50X291dF9wcm90bywgY2xpZW50X2luX3Byb3RvKQotICAgIGNsaWVudC5yZWN2X0phbmt5LnNob3VsZCA9PSAyCisgICAgZXhwZWN0KGNsaWVudC5yZWN2X0phbmt5KS50byBlcSgyKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZGVhbCB3aXRoIGZpZWxkcyBmb2xsb3dpbmcgZmllbGRzIHRoYXQgaGF2ZSBub24tZGVsdGEgaWRzIiBkbwotICAgIGJyY3AgPSBCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldygKKyAgICBicmNwID0gVGhyaWZ0OjpUZXN0OjpCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldygKICAgICAgIDpmaWVsZDEgPT4gImJsYWgiLCAKLSAgICAgIDpmaWVsZDIgPT4gQmlnRmllbGRJZFN0cnVjdC5uZXcoCisgICAgICA6ZmllbGQyID0+IFRocmlmdDo6VGVzdDo6QmlnRmllbGRJZFN0cnVjdC5uZXcoCiAgICAgICAgIDpmaWVsZDEgPT4gInN0cmluZzEiLCAKICAgICAgICAgOmZpZWxkMiA9PiAic3RyaW5nMiIpLCAKICAgICAgIDpmaWVsZDMgPT4gMykKQEAgLTExMCw5ICsxMTEsMjUgQEAKICAgICBieXRlcyA9IHNlci5zZXJpYWxpemUoYnJjcCkKIAogICAgIGRlc2VyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCi0gICAgYnJjcDIgPSBCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldworICAgIGJyY3AyID0gVGhyaWZ0OjpUZXN0OjpCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldwogICAgIGRlc2VyLmRlc2VyaWFsaXplKGJyY3AyLCBieXRlcykKLSAgICBicmNwMi5zaG91bGQgPT0gYnJjcAorICAgIGV4cGVjdChicmNwMikudG8gZXEoYnJjcCkKKyAgZW5kCisgIAorICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIGFuIGVtcHR5IG1hcCB0byBhbiBlbXB0eSBoYXNoIiBkbworICAgIHN0cnVjdCA9IFRocmlmdDo6VGVzdDo6U2luZ2xlTWFwVGVzdFN0cnVjdC5uZXcoOmkzMl9tYXAgPT4ge30pCisgICAgc2VyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3KQorICAgIGJ5dGVzID0gc2VyLnNlcmlhbGl6ZShzdHJ1Y3QpCisKKyAgICBkZXNlciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3KQorICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6OlNpbmdsZU1hcFRlc3RTdHJ1Y3QubmV3CisgICAgZGVzZXIuZGVzZXJpYWxpemUoc3RydWN0MiwgYnl0ZXMpCisgICAgZXhwZWN0KHN0cnVjdCkudG8gZXEoc3RydWN0MikKKyAgZW5kCisgIAorICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKS50b19zKS50byBlcSgiY29tcGFjdChtZW1vcnkpIikKICAgZW5kCiAgIAogICBjbGFzcyBKYW5reUhhbmRsZXIKQEAgLTEyMiwxMiArMTM5LDIwIEBACiAgIGVuZAogICAKICAgZGVmIHdyaXRlcihzeW0pCi0gICAgc3ltID0gc3ltID09IDpiaW5hcnkgPyA6c3RyaW5nIDogc3ltCiAgICAgIndyaXRlXyN7c3ltLnRvX3N9IgogICBlbmQKICAgCiAgIGRlZiByZWFkZXIoc3ltKQotICAgIHN5bSA9IHN5bSA9PSA6YmluYXJ5ID8gOnN0cmluZyA6IHN5bQogICAgICJyZWFkXyN7c3ltLnRvX3N9IgogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZAorCitkZXNjcmliZSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkgZG8KKyAgaXQgInNob3VsZCBjcmVhdGUgYSBDb21wYWN0UHJvdG9jb2wiIGRvCisgICAgZXhwZWN0KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiY29tcGFjdCIpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9leGNlcHRpb25fc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCmluZGV4IGZjMzIxMzcuLjM3OWFlNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCkBAIC0xNywxMjYgKzE3LDEyNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRFeGNlcHRpb25TcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSAnRXhjZXB0aW9uJyBkbwogCi0gIGRlc2NyaWJlIEV4Y2VwdGlvbiBkbworICBkZXNjcmliZSBUaHJpZnQ6OkV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIG1lc3NhZ2UiIGRvCi0gICAgICBlID0gRXhjZXB0aW9uLm5ldygidGVzdCBtZXNzYWdlIikKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKKyAgICAgIGUgPSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoInRlc3QgbWVzc2FnZSIpCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgQXBwbGljYXRpb25FeGNlcHRpb24gZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaW5oZXJpdCBmcm9tIFRocmlmdDo6RXhjZXB0aW9uIiBkbwotICAgICAgQXBwbGljYXRpb25FeGNlcHRpb24uc3VwZXJjbGFzcy5zaG91bGQgPT0gRXhjZXB0aW9uCisgICAgICBleHBlY3QoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zdXBlcmNsYXNzKS50byBlcShUaHJpZnQ6OkV4Y2VwdGlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIHR5cGUgYW5kIG1lc3NhZ2UiIGRvCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3Ci0gICAgICBlLnR5cGUuc2hvdWxkID09IEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkIGJlX25pbAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQotICAgICAgZS50eXBlLnNob3VsZCA9PSBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldworICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTikKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGJlX25pbAorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAidGVzdCBtZXNzYWdlIikKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYSBzdHJ1Y3Qgb2ZmIG9mIGEgcHJvdG9jb2wiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oCi0gICAgICAgIFsibWVzc2FnZSIsIFR5cGVzOjpTVFJJTkcsIDFdLAotICAgICAgICBbInR5cGUiLCBUeXBlczo6STMyLCAyXSwKLSAgICAgICAgW25pbCwgVHlwZXM6OlNUT1AsIDBdCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKAorICAgICAgICBbIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAorICAgICAgICBbInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAorICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQuYW5kX3JldHVybiAidGVzdCBtZXNzYWdlIgotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQuYW5kX3JldHVybiBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lECi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgyKS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQuYW5kX3JldHVybiAidGVzdCBtZXNzYWdlIgorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkLmFuZF9yZXR1cm4gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lECisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMikudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldworICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3CiAgICAgICBlLnJlYWQocHJvdCkKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gQXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRAorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgYmFkIGZpZWxkcyB3aGVuIHJlYWRpbmcgYSBzdHJ1Y3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDUpLnRpbWVzLmFuZF9yZXR1cm4oCi0gICAgICAgIFsidHlwZSIsIFR5cGVzOjpJMzIsIDJdLAotICAgICAgICBbInR5cGUiLCBUeXBlczo6U1RSSU5HLCAyXSwKLSAgICAgICAgWyJtZXNzYWdlIiwgVHlwZXM6Ok1BUCwgMV0sCi0gICAgICAgIFsibWVzc2FnZSIsIFR5cGVzOjpTVFJJTkcsIDNdLAotICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0KKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDUpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCisgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMl0sCisgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMV0sCisgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgM10sCisgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybiBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVHlwZXM6OlNUUklORykudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVHlwZXM6Ok1BUCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDQpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlZBTElEX01FU1NBR0VfVFlQRQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDQpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldwogICAgICAgZS5yZWFkKHByb3QpCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkIGJlX25pbAotICAgICAgZS50eXBlLnNob3VsZCA9PSBBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGEgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiBzdHJ1Y3QgdG8gdGhlIG9wcm90IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUeXBlczo6STMyLCAyKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAidGVzdCBtZXNzYWdlIikKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgInRlc3QgbWVzc2FnZSIpCiAgICAgICBlLndyaXRlKHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbmlsIGZpZWxkcyB3aGVuIHdyaXRpbmcgdG8gdGhlIG9wcm90IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKLSAgICAgIGUgPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcobmlsLCAidGVzdCBtZXNzYWdlIikKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhuaWwsICJ0ZXN0IG1lc3NhZ2UiKQogICAgICAgZS53cml0ZShwcm90KQogCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVHlwZXM6OkkzMiwgMikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAotICAgICAgZSA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKQorICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkKICAgICAgIGUud3JpdGUocHJvdCkKIAotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCi0gICAgICBlID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCkKKyAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhuaWwpCiAgICAgICBlLndyaXRlKHByb3QpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIFByb3RvY29sRXhjZXB0aW9uIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIGhhdmUgYW4gYWNjZXNzaWJsZSB0eXBlIiBkbwotICAgICAgcHJvdCA9IFByb3RvY29sRXhjZXB0aW9uLm5ldyhQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCwgIm1lc3NhZ2UiKQotICAgICAgcHJvdC50eXBlLnNob3VsZCA9PSBQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVAotICAgICAgcHJvdC5tZXNzYWdlLnNob3VsZCA9PSAibWVzc2FnZSIKKyAgICAgIHByb3QgPSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlULCAibWVzc2FnZSIpCisgICAgICBleHBlY3QocHJvdC50eXBlKS50byBlcShUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKQorICAgICAgZXhwZWN0KHByb3QubWVzc2FnZSkudG8gZXEoIm1lc3NhZ2UiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzA1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIKQEAgLTAsMCArMSw2MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSAnZ2VuZXJhdGlvbicgZG8KKyAgYmVmb3JlIGRvCisgICAgcmVxdWlyZSAnbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlJworICBlbmQKKworICBpdCAiZGlkIG5vdCBnZW5lcmF0ZSB0aGUgd3JvbmcgZmlsZXMiIGRvCisgICAgcHJlZml4ID0gRmlsZS5leHBhbmRfcGF0aCgiLi4vZ2VuLXJiL2ZsYXQiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvdGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS5ub3RfdG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJnZW5lcmF0ZWQgdGhlIHJpZ2h0IGZpbGVzIiBkbworICAgIHByZWZpeCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL2dlbi1yYi9mbGF0IiwgX19GSUxFX18pCisgICAgWyJuYW1lc3BhY2VkX25vbmJsb2NraW5nX3NlcnZpY2UucmIiLAorICAgICAidGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAidGhyaWZ0X25hbWVzcGFjZWRfc3BlY190eXBlcy5yYiIsCisgICAgICJyZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJyZWZlcmVuY2VkX3R5cGVzLnJiIgorICAgIF0uZWFjaCBkbyB8bmFtZXwKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLnRvIGJlX3RydXRoeQorICAgIGVuZAorICBlbmQKKworICBpdCAiaGFzIGEgc2VydmljZSBjbGFzcyBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorCisgIGl0ICJoYXMgYSBzdHJ1Y3QgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbworICAgIGV4cGVjdChkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6SGVsbG8pKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgInJlcXVpcmVkIGFuIGluY2x1ZGVkIGZpbGUiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkpLnRvIGJlX3RydXRoeQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKaW5kZXggYzVhOTUzNC4uZGY0NzJhYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCkBAIC0xNywzMyArMTcsMTIzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdEhUVFBDbGllbnRUcmFuc3BvcnRTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSAnVGhyaWZ0OjpIVFRQQ2xpZW50VHJhbnNwb3J0JyBkbwogCi0gIGRlc2NyaWJlIEhUVFBDbGllbnRUcmFuc3BvcnQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpIVFRQQ2xpZW50VHJhbnNwb3J0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQGNsaWVudCA9IEhUVFBDbGllbnRUcmFuc3BvcnQubmV3KCJodHRwOi8vbXkuZG9tYWluLmNvbS9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiKQorICAgICAgQGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoImh0dHA6Ly9teS5kb21haW4uY29tL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgQGNsaWVudC50b19zID09ICJodHRwOi8vbXkuZG9tYWluLmNvbS9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsd2F5cyBiZSBvcGVuIiBkbwotICAgICAgQGNsaWVudC5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBjbGllbnQpLnRvIGJlX29wZW4KICAgICAgIEBjbGllbnQuY2xvc2UKLSAgICAgIEBjbGllbnQuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAY2xpZW50KS50byBiZV9vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBvc3QgdmlhIEhUVFAgYW5kIHJldHVybiB0aGUgcmVzdWx0cyIgZG8KICAgICAgIEBjbGllbnQud3JpdGUgImEgdGVzdCIKICAgICAgIEBjbGllbnQud3JpdGUgIiBmcmFtZSIKLSAgICAgIE5ldDo6SFRUUC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTmV0OjpIVFRQIikudGVlIGRvIHxodHRwfAotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAiYSB0ZXN0IGZyYW1lIiwgeyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifSkuYW5kX3JldHVybihbbmlsLCAiZGF0YSJdKQorICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJhIHRlc3QgZnJhbWUiLCB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9KSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgICAgQGNsaWVudC5mbHVzaAotICAgICAgQGNsaWVudC5yZWFkKDEwKS5zaG91bGQgPT0gImRhdGEiCisgICAgICBleHBlY3QoQGNsaWVudC5yZWFkKDEwKSkudG8gZXEoImRhdGEiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzZW5kIGN1c3RvbSBoZWFkZXJzIGlmIGRlZmluZWQiIGRvCisgICAgICBAY2xpZW50LndyaXRlICJ0ZXN0IgorICAgICAgY3VzdG9tX2hlYWRlcnMgPSB7IkNvb2tpZSIgPT4gIkZvbyJ9CisgICAgICBoZWFkZXJzID0geyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifS5tZXJnZShjdXN0b21faGVhZGVycykKKworICAgICAgQGNsaWVudC5hZGRfaGVhZGVycyhjdXN0b21faGVhZGVycykKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIGhlYWRlcnMpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBAY2xpZW50LmZsdXNoCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlc2V0IHRoZSBvdXRidWYgb24gSFRUUCBmYWlsdXJlcycgZG8KKyAgICAgIEBjbGllbnQud3JpdGUgInRlc3QiCisKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pIHsgcmFpc2UgTmV0OjpSZWFkVGltZW91dCB9CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIEBjbGllbnQuZmx1c2ggIHJlc2N1ZQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAb3V0YnVmKSkudG8gZXEoVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcikKKyAgICBlbmQKKworICBlbmQKKworICBkZXNjcmliZSAnc3NsIGVuYWJsZWQnIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHNlcnZpY2VfcGF0aCA9ICIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIgorICAgICAgQHNlcnZlcl91cmkgPSAiaHR0cHM6Ly9teS5kb21haW4uY29tIgorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB1c2UgU1NMIGZvciBodHRwcyIgZG8KKyAgICAgIGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoIiN7QHNlcnZlcl91cml9I3tAc2VydmljZV9wYXRofSIpCisKKyAgICAgIGNsaWVudC53cml0ZSAidGVzdCIKKworICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgNDQzKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoQHNlcnZpY2VfcGF0aCwgInRlc3QiLAorICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIiA9PiAiYXBwbGljYXRpb24veC10aHJpZnQiKSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgY2xpZW50LmZsdXNoCisgICAgICBleHBlY3QoY2xpZW50LnJlYWQoNCkpLnRvIGVxKCJkYXRhIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc2V0IFNTTCB2ZXJpZnkgbW9kZSB3aGVuIHNwZWNpZmllZCIgZG8KKyAgICAgIGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoIiN7QHNlcnZlcl91cml9I3tAc2VydmljZV9wYXRofSIsCisgICAgICAgICAgOnNzbF92ZXJpZnlfbW9kZSA9PiBPcGVuU1NMOjpTU0w6OlZFUklGWV9OT05FKQorCisgICAgICBjbGllbnQud3JpdGUgInRlc3QiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aCh0cnVlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCisgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBjbGllbnQuZmx1c2gKKyAgICAgIGV4cGVjdChjbGllbnQucmVhZCg0KSkudG8gZXEoImRhdGEiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWFmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9qc29uX3Byb3RvY29sX3NwZWMucmIKQEAgLTAsMCArMSw1NTIgQEAKKyMgZW5jb2Rpbmc6IFVURi04CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICdKc29uUHJvdG9jb2wnIGRvCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpKc29uUHJvdG9jb2wgZG8KKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICAgIEBwcm90ID0gVGhyaWZ0OjpKc29uUHJvdG9jb2wubmV3KEB0cmFucykKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBlc2NhcGVkIGNoYXIiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCJcbiIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdcdTAwMGEnKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCIgIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ1x1MDAyMCcpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gY2hhciIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiXG4iKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnXFxuJykKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCIgIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJyAnKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIlxcIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlxcXFwiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIkAiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnQCcpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gc3RyaW5nIiBkbworICAgICAgQHByb3Qud3JpdGVfanNvbl9zdHJpbmcoInRoaXMgaXMgYSBcXCBqc29uXG5zdHJpbmciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJ0aGlzIGlzIGEgXFxcXCBqc29uXFxuc3RyaW5nXCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGJhc2U2NCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fYmFzZTY0KCJ0aGlzIGlzIGEgYmFzZTY0IHN0cmluZyIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcImRHaHBjeUJwY3lCaElHSmhjMlUyTkNCemRISnBibWM9XCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGludGVnZXIiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2ludGVnZXIoNDUpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI0NSIpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcigzMzAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMzMDAwIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDMwMDAwMDAwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMDAwMDAwMDAwIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDYwMDAwMDAwMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI2MDAwMDAwMDAwIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBkb3VibGUiIGRvCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgxMi4zKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTIuMyIpCisKKyAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKC0zLjIxKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiLTMuMjEiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgoKCsxLjAvMC4wKS8oKzEuMC8wLjApKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiTmFOXCIiKQorCisgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgoKzEuMC8wLjApKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJJbmZpbml0eVwiIikKKworICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKC0xLjAvMC4wKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiLUluZmluaXR5XCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIG9iamVjdCBzdGFydCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fb2JqZWN0X3N0YXJ0CisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ7IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBvYmplY3QgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfanNvbl9vYmplY3RfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBhcnJheSBzdGFydCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfc3RhcnQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlsiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGFycmF5IGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbWVzc2FnZSBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oIm5hbWUiLCAxMiwgMzIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbMSxcIm5hbWVcIiwxMiwzMiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIG1lc3NhZ2UgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9lbmQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBzdHJ1Y3QgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oIm5hbWUiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgieyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIHN0cnVjdCBlbmQiIGRvCisgICAgICBAcHJvdC53cml0ZV9zdHJ1Y3RfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgYmVnaW4iIGRvCisgICAgICBAcHJvdC53cml0ZV9maWVsZF9iZWdpbigibmFtZSIsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMzIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMntcInJlY1wiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfZmllbGRfZW5kCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgZmllbGQgc3RvcCIgZG8KKyAgICAgIEBwcm90LndyaXRlX2ZpZWxkX3N0b3AKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIG1hcCBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX21hcF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDMyKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsXCJsc3RcIiwzMix7IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbWFwIGVuZCIgZG8KKyAgICAgIEBwcm90LndyaXRlX21hcF9lbmQKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn1dIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbGlzdCBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX2xpc3RfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIltcInJlY1wiLDMyIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbGlzdCBlbmQiIGRvCisgICAgICBAcHJvdC53cml0ZV9saXN0X2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIHNldCBiZWdpbiIgZG8KKyAgICAgIEBwcm90LndyaXRlX3NldF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMyKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsMzIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBzZXQgZW5kIiBkbworICAgICAgQHByb3Qud3JpdGVfc2V0X2VuZAorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGJvb2wiIGRvCisgICAgICBAcHJvdC53cml0ZV9ib29sKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxIikKKworICAgICAgQHByb3Qud3JpdGVfYm9vbChmYWxzZSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBieXRlIiBkbworICAgICAgQHByb3Qud3JpdGVfYnl0ZSgxMDApCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBpMTYiIGRvCisgICAgICBAcHJvdC53cml0ZV9pMTYoMTAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEwMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBpMzIiIGRvCisgICAgICBAcHJvdC53cml0ZV9pMzIoMzAwMDAwMDAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMwMDAwMDAwMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBpNjQiIGRvCisgICAgICBAcHJvdC53cml0ZV9pNjQoNjAwMDAwMDAwMCkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjYwMDAwMDAwMDAiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBkb3VibGUiIGRvCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoMS4yMykKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEuMjMiKQorCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoLTMyLjEpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCItMzIuMSIpCisKKyAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoKCsxLjAvMC4wKS8oKzEuMC8wLjApKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiTmFOXCIiKQorCisgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKCsxLjAvMC4wKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiSW5maW5pdHlcIiIpCisKKyAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoLTEuMC8wLjApKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCItSW5maW5pdHlcIiIpCisgICAgZW5kCisKKyAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICAgIGl0ICdzaG91bGQgd3JpdGUgc3RyaW5nJyBkbworICAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCisgICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQorICAgICAgICBleHBlY3QoYSkudG8gZXEoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBlbmQKKworICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCisgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIikKKyAgICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICAgIGV4cGVjdChhKS50byBlcSgiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQURcIiIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcnIGRvCisgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKKyAgICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHdyaXRlIGJpbmFyeSIgZG8KKyAgICAgIEBwcm90LndyaXRlX2JpbmFyeSgidGhpcyBpcyBhIGJhc2U2NCBzdHJpbmciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVwiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoKDAuLi4yNTYpLnRvX2EucGFjaygnQyonKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGdldCB0eXBlIG5hbWUgZm9yIHR5cGUgaWQiIGRvCisgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RPUCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Vk9JRCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCT09MKSkudG8gZXEoInRmIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJZVEUpKS50byBlcSgiaTgiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKSkudG8gZXEoImRibCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMTYpKS50byBlcSgiaTE2IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkzMikpLnRvIGVxKCJpMzIiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STY0KSkudG8gZXEoImk2NCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpKS50byBlcSgic3RyIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkpLnRvIGVxKCJyZWMiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6TUFQKSkudG8gZXEoIm1hcCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTRVQpKS50byBlcSgic2V0IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkxJU1QpKS50byBlcSgibHN0IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgZ2V0IHR5cGUgaWQgZm9yIHR5cGUgbmFtZSIgZG8KKyAgICAgIGV4cGVjdCB7QHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgicHAiKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJ0ZiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpCT09MKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImk4IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkJZVEUpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiZGJsIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMTYiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6STE2KQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImkzMiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpJMzIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTY0IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6Okk2NCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzdHIiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInJlYyIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgibWFwIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzZXQiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U0VUKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImxzdCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpMSVNUKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gc3ludGF4IGNoYXIiIGRvCisgICAgICBAdHJhbnMud3JpdGUoJ0YnKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fc3ludGF4X2NoYXIoJ0cnKX0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKKyAgICAgIEB0cmFucy53cml0ZSgnSCcpCisgICAgICBAcHJvdC5yZWFkX2pzb25fc3ludGF4X2NoYXIoJ0gnKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gZXNjYXBlIGNoYXIiIGRvCisgICAgICBAdHJhbnMud3JpdGUoJzAwNTQnKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9lc2NhcGVfY2hhcikudG8gZXEoJ1QnKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlwiIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcXFxcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcXCIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXC9cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcLyIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcYiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGZcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcZiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXG5cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcbiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcciIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHRcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcdCIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBzdHJpbmciIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxQIikKKyAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSl9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24pCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmdcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZykudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBiYXNlNjQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYmFzZTY0KS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgaXMganNvbiBudW1lcmljIiBkbworICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiQSIpKS50byBlcShmYWxzZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIisiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi0iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi4iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjAiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjEiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjIiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjMiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjQiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjYiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjciKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjgiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjkiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIkUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoImUiKSkudG8gZXEodHJ1ZSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIG51bWVyaWMgY2hhcnMiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzRTQ1VCIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX251bWVyaWNfY2hhcnMpLnRvIGVxKCIxLjQ1M0U0NSIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBpbnRlZ2VyIiBkbworICAgICAgQHRyYW5zLndyaXRlKCIxLjQ1XCJcIiIpCisgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfanNvbl9pbnRlZ2VyfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorICAgICAgQHByb3QucmVhZF9zdHJpbmcKKworICAgICAgQHRyYW5zLndyaXRlKCIxNDUzVCIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2ludGVnZXIpLnRvIGVxKDE0NTMpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBkb3VibGUiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIjEuNDVlM2UwMVwiXCIiKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fZG91YmxlfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorICAgICAgQHByb3QucmVhZF9zdHJpbmcKKworICAgICAgQHRyYW5zLndyaXRlKCJcIjEuNDUzZTAxXCIiKQorICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fZG91YmxlfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorCisgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzZTAxXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2RvdWJsZSkudG8gZXEoMTQuNTMpCisgICAgICBAcHJvdC5yZWFkX3N0cmluZworCisgICAgICBAdHJhbnMud3JpdGUoIlwiTmFOXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUubmFuPykudG8gZXEodHJ1ZSkKKworICAgICAgQHRyYW5zLndyaXRlKCJcIkluZmluaXR5XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKCsxLjAvMC4wKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiLUluZmluaXR5XCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKC0xLjAvMC4wKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gb2JqZWN0IHN0YXJ0IiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ7IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fb2JqZWN0X3N0YXJ0KS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQganNvbiBvYmplY3QgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ9IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fb2JqZWN0X2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gYXJyYXkgc3RhcnQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlsiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9hcnJheV9zdGFydCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGpzb24gYXJyYXkgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJdIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYXJyYXlfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWRfbWVzc2FnZV9iZWdpbiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiWzIsIikKKyAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9tZXNzYWdlX2JlZ2lufS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQorCisgICAgICBAdHJhbnMud3JpdGUoIlsxLFwibmFtZVwiLDEyLDMyXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luKS50byBlcShbIm5hbWUiLCAxMiwgMzJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIG1lc3NhZ2UgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJdIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgc3RydWN0IGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJ7IikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cnVjdF9iZWdpbikudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIHN0cnVjdCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIn0iKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RydWN0X2VuZCkudG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGZpZWxkIGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCIxe1wicmVjXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfYmVnaW4pLnRvIGVxKFtuaWwsIDEyLCAxXSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBmaWVsZCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIn0iKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgbWFwIGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIixcImxzdFwiLDIseyIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tYXBfYmVnaW4pLnRvIGVxKFsxMiwgMTUsIDJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIG1hcCBlbmQiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIn1dIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9lbmQpLnRvIGVxKG5pbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBsaXN0IGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2JlZ2luKS50byBlcShbMTIsIDJdKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGxpc3QgZW5kIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJdIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2xpc3RfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgc2V0IGJlZ2luIiBkbworICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfYmVnaW4pLnRvIGVxKFsxMiwgMl0pCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgc2V0IGVuZCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiXSIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfZW5kKS50byBlcShuaWwpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgYm9vbCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCisgICAgICBAcHJvdC5yZWFkX3N0cmluZworCisgICAgICBAdHJhbnMud3JpdGUoIjFcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKHRydWUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgYnl0ZSIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiNjBcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2J5dGUpLnRvIGVxKDYwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGkxNiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMTAwMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTE2KS50byBlcSgxMDAwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGkzMiIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMzAwMDAwMDAwMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTMyKS50byBlcSgzMDAwMDAwMDAwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGk2NCIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiNjAwMDAwMDAwMFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTY0KS50byBlcSg2MDAwMDAwMDAwKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByZWFkIGRvdWJsZSIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiMTIuMjNcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2RvdWJsZSkudG8gZXEoMTIuMjMpCisgICAgZW5kCisKKyAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKKyAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcnIGRvCisgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisKKyAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCisgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRCInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgaXQgJ3Nob3VsZCByZWFkIHN0cmluZycgZG8KKyAgICAgICAgQHRyYW5zLndyaXRlKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicpCisgICAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cmluZykudG8gZXEoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBiaW5hcnkiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2JpbmFyeSkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9iaW5hcnkuYnl0ZXMudG9fYSkudG8gZXEoKDAuLi4yNTYpLnRvX2EpCisgICAgZW5kCisgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgianNvbihtZW1vcnkpIikKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5IGRvCisgICAgaXQgInNob3VsZCBjcmVhdGUgYSBKc29uUHJvdG9jb2wiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJqc29uIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL21vbmdyZWxfaHR0cF9zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL21vbmdyZWxfaHR0cF9zZXJ2ZXJfc3BlYy5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5NDQ5MS4uMDAwMDAwMAotLS0gYS9saWIvcmIvc3BlYy9tb25ncmVsX2h0dHBfc2VydmVyX3NwZWMucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCi1yZXF1aXJlICd0aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXInCi0KLWNsYXNzIFRocmlmdEhUVFBTZXJ2ZXJTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0KLSAgSGFuZGxlciA9IE1vbmdyZWxIVFRQU2VydmVyOjpIYW5kbGVyCi0KLSAgZGVzY3JpYmUgTW9uZ3JlbEhUVFBTZXJ2ZXIgZG8KLSAgICBpdCAic2hvdWxkIGhhdmUgYXBwcm9wcmlhdGUgZGVmYXVsdHMiIGRvCi0gICAgICBtb2NrX2ZhY3RvcnkgPSBtb2NrKCJCaW5hcnlQcm90b2NvbEZhY3RvcnkiKQotICAgICAgbW9ja19wcm9jID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEJpbmFyeVByb3RvY29sRmFjdG9yeS5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2tfZmFjdG9yeSkKLSAgICAgIE1vbmdyZWw6Okh0dHBTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgiMC4wLjAuMCIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk1vbmdyZWw6Okh0dHBTZXJ2ZXIiKS50ZWUgZG8gfG1vY2t8Ci0gICAgICAgICAgaGFuZGxlciA9IG1vY2soIkhhbmRsZXIiKQotICAgICAgICAgIEhhbmRsZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChtb2NrX3Byb2MsIG1vY2tfZmFjdG9yeSkuYW5kX3JldHVybihoYW5kbGVyKQotICAgICAgICAgIG1vY2suc2hvdWxkX3JlY2VpdmUoOnJlZ2lzdGVyKS53aXRoKCIvIiwgaGFuZGxlcikKLSAgICAgICAgZW5kCi0gICAgICBlbmQKLSAgICAgIE1vbmdyZWxIVFRQU2VydmVyLm5ldyhtb2NrX3Byb2MpCi0gICAgZW5kCi0KLSAgICBpdCAic2hvdWxkIHVuZGVyc3RhbmQgOmlwLCA6cG9ydCwgOnBhdGgsIGFuZCA6cHJvdG9jb2xfZmFjdG9yeSIgZG8KLSAgICAgIG1vY2tfcHJvYyA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBtb2NrX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgTW9uZ3JlbDo6SHR0cFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCIxLjIuMy40IiwgMTIzNCkuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJNb25ncmVsOjpIdHRwU2VydmVyIikudGVlIGRvIHxtb2NrfAotICAgICAgICAgIGhhbmRsZXIgPSBtb2NrKCJIYW5kbGVyIikKLSAgICAgICAgICBIYW5kbGVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobW9ja19wcm9jLCBtb2NrX2ZhY3RvcnkpLmFuZF9yZXR1cm4oaGFuZGxlcikKLSAgICAgICAgICBtb2NrLnNob3VsZF9yZWNlaXZlKDpyZWdpc3Rlcikud2l0aCgiL2ZvbyIsIGhhbmRsZXIpCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBNb25ncmVsSFRUUFNlcnZlci5uZXcobW9ja19wcm9jLCA6aXAgPT4gIjEuMi4zLjQiLCA6cG9ydCA9PiAxMjM0LCA6cGF0aCA9PiAiZm9vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm90b2NvbF9mYWN0b3J5ID0+IG1vY2tfZmFjdG9yeSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgTW9uZ3JlbDo6SHR0cFNlcnZlciIgZG8KLSAgICAgIEJpbmFyeVByb3RvY29sRmFjdG9yeS5zdHViISg6bmV3KQotICAgICAgTW9uZ3JlbDo6SHR0cFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk1vbmdyZWw6Okh0dHBTZXJ2ZXIiKS50ZWUgZG8gfG1vY2t8Ci0gICAgICAgICAgSGFuZGxlci5zdHViISg6bmV3KQotICAgICAgICAgIG1vY2suc3R1YiEoOnJlZ2lzdGVyKQotICAgICAgICAgIG1vY2suc2hvdWxkX3JlY2VpdmUoOnJ1bikuYW5kX3JldHVybiBkbwotICAgICAgICAgICAgbW9jaygiTW9uZ3JlbDo6SHR0cFNlcnZlci5ydW4iKS50ZWUgZG8gfHJ1bm5lcnwKLSAgICAgICAgICAgICAgcnVubmVyLnNob3VsZF9yZWNlaXZlKDpqb2luKQotICAgICAgICAgICAgZW5kCi0gICAgICAgICAgZW5kCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBNb25ncmVsSFRUUFNlcnZlci5uZXcobmlsKS5zZXJ2ZQotICAgIGVuZAotICBlbmQKLQotICBkZXNjcmliZSBNb25ncmVsSFRUUFNlcnZlcjo6SGFuZGxlciBkbwotICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQGZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgQGhhbmRsZXIgPSBIYW5kbGVyLm5ldyhAcHJvY2Vzc29yLCBAZmFjdG9yeSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgcmV0dXJuIDQwNCBmb3Igbm9uLVBPU1QgcmVxdWVzdHMiIGRvCi0gICAgICByZXF1ZXN0ID0gbW9jaygicmVxdWVzdCIsIDpwYXJhbXMgPT4geyJSRVFVRVNUX01FVEhPRCIgPT4gIkdFVCJ9KQotICAgICAgcmVzcG9uc2UgPSBtb2NrKCJyZXNwb25zZSIpCi0gICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6c3RhcnQpLndpdGgoNDA0KQotICAgICAgcmVzcG9uc2Uuc2hvdWxkX25vdF9yZWNlaXZlKDpzdGFydCkud2l0aCgyMDApCi0gICAgICBAaGFuZGxlci5wcm9jZXNzKHJlcXVlc3QsIHJlc3BvbnNlKQotICAgIGVuZAotCi0gICAgaXQgInNob3VsZCBzZXJ2ZSB1c2luZyBhcHBsaWNhdGlvbi94LXRocmlmdCIgZG8KLSAgICAgIHJlcXVlc3QgPSBtb2NrKCJyZXF1ZXN0IiwgOnBhcmFtcyA9PiB7IlJFUVVFU1RfTUVUSE9EIiA9PiAiUE9TVCJ9LCA6Ym9keSA9PiBuaWwpCi0gICAgICByZXNwb25zZSA9IG1vY2soInJlc3BvbnNlIikKLSAgICAgIGhlYWQgPSBtb2NrKCJoZWFkIikKLSAgICAgIGhlYWQuc2hvdWxkX3JlY2VpdmUoOltdPSkud2l0aCgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKLSAgICAgIElPU3RyZWFtVHJhbnNwb3J0LnN0dWIhKDpuZXcpCi0gICAgICBAZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKQotICAgICAgQHByb2Nlc3Nvci5zdHViISg6cHJvY2VzcykKLSAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpzdGFydCkud2l0aCgyMDApLmFuZF95aWVsZChoZWFkLCBuaWwpCi0gICAgICBAaGFuZGxlci5wcm9jZXNzKHJlcXVlc3QsIHJlc3BvbnNlKQotICAgIGVuZAotCi0gICAgaXQgInNob3VsZCB1c2UgdGhlIElPU3RyZWFtVHJhbnNwb3J0IiBkbwotICAgICAgYm9keSA9IG1vY2soImJvZHkiKQotICAgICAgcmVxdWVzdCA9IG1vY2soInJlcXVlc3QiLCA6cGFyYW1zID0+IHsiUkVRVUVTVF9NRVRIT0QiID0+ICJQT1NUIn0sIDpib2R5ID0+IGJvZHkpCi0gICAgICByZXNwb25zZSA9IG1vY2soInJlc3BvbnNlIikKLSAgICAgIGhlYWQgPSBtb2NrKCJoZWFkIikKLSAgICAgIGhlYWQuc3R1YiEoOltdPSkKLSAgICAgIG91dCA9IG1vY2soIm91dCIpCi0gICAgICBwcm90b2NvbCA9IG1vY2soInByb3RvY29sIikKLSAgICAgIHRyYW5zcG9ydCA9IG1vY2soInRyYW5zcG9ydCIpCi0gICAgICBJT1N0cmVhbVRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKGJvZHksIG91dCkuYW5kX3JldHVybih0cmFuc3BvcnQpCi0gICAgICBAZmFjdG9yeS5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS53aXRoKHRyYW5zcG9ydCkuYW5kX3JldHVybihwcm90b2NvbCkKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLndpdGgocHJvdG9jb2wsIHByb3RvY29sKQotICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOnN0YXJ0KS53aXRoKDIwMCkuYW5kX3lpZWxkKGhlYWQsIG91dCkKLSAgICAgIEBoYW5kbGVyLnByb2Nlc3MocmVxdWVzdCwgcmVzcG9uc2UpCi0gICAgZW5kCi0gIGVuZAotZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIgYi9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2ZDM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL25hbWVzcGFjZWRfc3BlYy5yYgpAQCAtMCwwICsxLDY3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICduYW1lc3BhY2VkIGdlbmVyYXRpb24nIGRvCisgIGJlZm9yZSBkbworICAgIHJlcXVpcmUgJ25hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlJworICBlbmQKKworICBpdCAiZ2VuZXJhdGVkIHRoZSByaWdodCBmaWxlcyIgZG8KKyAgICBwcmVmaXggPSBGaWxlLmV4cGFuZF9wYXRoKCIuLi9nZW4tcmIiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvdGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS50byBiZV90cnV0aHkKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgImRpZCBub3QgZ2VuZXJhdGUgdGhlIHdyb25nIGZpbGVzIiBkbworICAgIHByZWZpeCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL2dlbi1yYiIsIF9fRklMRV9fKQorICAgIFsibmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgInRocmlmdF9uYW1lc3BhY2VkX3NwZWNfY29uc3RhbnRzLnJiIiwKKyAgICAgInRocmlmdF9uYW1lc3BhY2VkX3NwZWNfdHlwZXMucmIiLAorICAgICAicmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAorICAgICAicmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS5ub3RfdG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJoYXMgYSBzZXJ2aWNlIGNsYXNzIGluIHRoZSByaWdodCBwbGFjZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgImhhcyBhIHN0cnVjdCBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykpLnRvIGJlX3RydXRoeQorICBlbmQKKworICBpdCAicmVxdWlyZWQgYW4gaW5jbHVkZWQgZmlsZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorCisgIGl0ICJleHRlbmRlZCBhIHNlcnZpY2UiIGRvCisgICAgcmVxdWlyZSAiZXh0ZW5kZWQvZXh0ZW5kZWRfc2VydmljZSIKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgppbmRleCBlYWQ1MWQ3Li42MTNkODgzIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgpAQCAtMTcsMTEgKzE3LDkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0Tm9uYmxvY2tpbmdTZXJ2ZXJTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0gIGluY2x1ZGUgU3BlY05hbWVzcGFjZQorZGVzY3JpYmUgJ05vbmJsb2NraW5nU2VydmVyJyBkbwogCiAgIGNsYXNzIEhhbmRsZXIKICAgICBkZWYgaW5pdGlhbGl6ZQpAQCAtNTUsNyArNTMsNyBAQAogICAgIGVuZAogICBlbmQKIAotICBjbGFzcyBTcGVjVHJhbnNwb3J0IDwgQmFzZVRyYW5zcG9ydAorICBjbGFzcyBTcGVjVHJhbnNwb3J0IDwgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0CiAgICAgZGVmIGluaXRpYWxpemUodHJhbnNwb3J0LCBxdWV1ZSkKICAgICAgIEB0cmFuc3BvcnQgPSB0cmFuc3BvcnQKICAgICAgIEBxdWV1ZSA9IHF1ZXVlCkBAIC04OSw3ICs4Nyw3IEBACiAgICAgZW5kCiAgIGVuZAogCi0gIGNsYXNzIFNwZWNTZXJ2ZXJTb2NrZXQgPCBTZXJ2ZXJTb2NrZXQKKyAgY2xhc3MgU3BlY1NlcnZlclNvY2tldCA8IFRocmlmdDo6U2VydmVyU29ja2V0CiAgICAgZGVmIGluaXRpYWxpemUoaG9zdCwgcG9ydCwgcXVldWUpCiAgICAgICBzdXBlcihob3N0LCBwb3J0KQogICAgICAgQHF1ZXVlID0gcXVldWUKQEAgLTEwNSwxMyArMTAzLDEzIEBACiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQHBvcnQgPSA0MzI1MQogICAgICAgaGFuZGxlciA9IEhhbmRsZXIubmV3Ci0gICAgICBwcm9jZXNzb3IgPSBOb25ibG9ja2luZ1NlcnZpY2U6OlByb2Nlc3Nvci5uZXcoaGFuZGxlcikKKyAgICAgIHByb2Nlc3NvciA9IFNwZWNOYW1lc3BhY2U6Ok5vbmJsb2NraW5nU2VydmljZTo6UHJvY2Vzc29yLm5ldyhoYW5kbGVyKQogICAgICAgcXVldWUgPSBRdWV1ZS5uZXcKICAgICAgIEB0cmFuc3BvcnQgPSBTcGVjU2VydmVyU29ja2V0Lm5ldygnbG9jYWxob3N0JywgQHBvcnQsIHF1ZXVlKQotICAgICAgdHJhbnNwb3J0X2ZhY3RvcnkgPSBGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldworICAgICAgdHJhbnNwb3J0X2ZhY3RvcnkgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3CiAgICAgICBsb2dnZXIgPSBMb2dnZXIubmV3KFNUREVSUikKICAgICAgIGxvZ2dlci5sZXZlbCA9IExvZ2dlcjo6V0FSTgotICAgICAgQHNlcnZlciA9IE5vbmJsb2NraW5nU2VydmVyLm5ldyhwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIHRyYW5zcG9ydF9mYWN0b3J5LCBuaWwsIDUsIGxvZ2dlcikKKyAgICAgIEBzZXJ2ZXIgPSBUaHJpZnQ6Ok5vbmJsb2NraW5nU2VydmVyLm5ldyhwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIHRyYW5zcG9ydF9mYWN0b3J5LCBuaWwsIDUsIGxvZ2dlcikKICAgICAgIGhhbmRsZXIuc2VydmVyID0gQHNlcnZlcgogICAgICAgQHNlcnZlcl90aHJlYWQgPSBUaHJlYWQubmV3KFRocmVhZC5jdXJyZW50KSBkbyB8bWFzdGVyX3RocmVhZHwKICAgICAgICAgYmVnaW4KQEAgLTEzNiw5ICsxMzQsOSBAQAogICAgIGVuZAogCiAgICAgZGVmIHNldHVwX2NsaWVudChxdWV1ZSA9IG5pbCkKLSAgICAgIHRyYW5zcG9ydCA9IFNwZWNUcmFuc3BvcnQubmV3KEZyYW1lZFRyYW5zcG9ydC5uZXcoU29ja2V0Lm5ldygnbG9jYWxob3N0JywgQHBvcnQpKSwgcXVldWUpCi0gICAgICBwcm90b2NvbCA9IEJpbmFyeVByb3RvY29sLm5ldyh0cmFuc3BvcnQpCi0gICAgICBjbGllbnQgPSBOb25ibG9ja2luZ1NlcnZpY2U6OkNsaWVudC5uZXcocHJvdG9jb2wpCisgICAgICB0cmFuc3BvcnQgPSBTcGVjVHJhbnNwb3J0Lm5ldyhUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCBAcG9ydCkpLCBxdWV1ZSkKKyAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnNwb3J0KQorICAgICAgY2xpZW50ID0gU3BlY05hbWVzcGFjZTo6Tm9uYmxvY2tpbmdTZXJ2aWNlOjpDbGllbnQubmV3KHByb3RvY29sKQogICAgICAgdHJhbnNwb3J0Lm9wZW4KICAgICAgIEBjbGllbnRzIDw8IFtjbGllbnQsIHRyYW5zcG9ydF0KICAgICAgIGNsaWVudApAQCAtMTc4LDggKzE3Niw4IEBACiAKICAgICBpdCAic2hvdWxkIGhhbmRsZSBiYXNpYyBtZXNzYWdlIHBhc3NpbmciIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gSGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyhmYWxzZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ0Fsb2hhIScpKQogICAgICAgQHNlcnZlci5zaHV0ZG93bgogICAgIGVuZAogCkBAIC0xOTcsNyArMTk1LDcgQEAKICAgICAgIGVuZAogICAgICAgNC50aW1lcyB7IHRyYW5zX3F1ZXVlLnBvcCB9CiAgICAgICBzZXR1cF9jbGllbnQudW5ibG9jayg0KQotICAgICAgNC50aW1lcyB7IHF1ZXVlLnBvcC5zaG91bGQgYmVfdHJ1ZSB9CisgICAgICA0LnRpbWVzIHsgZXhwZWN0KHF1ZXVlLnBvcCkudG8gYmVfdHJ1dGh5IH0KICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjE0LDE1ICsyMTIsMTUgQEAKICAgICAgIHF1ZXVlc1s0XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s1XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s2XSA8PCA6aGVsbG8KLSAgICAgIDMudGltZXMgeyByZXN1bHQucG9wLnNob3VsZCA9PSBIZWxsby5uZXcgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBIZWxsby5uZXcKKyAgICAgIDMudGltZXMgeyBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KSB9CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBxdWV1ZXNbNV0gPDwgWzp1bmJsb2NrLCA0XQotICAgICAgNC50aW1lcyB7IHJlc3VsdC5wb3Auc2hvdWxkIGJlX3RydWUgfQorICAgICAgNC50aW1lcyB7IGV4cGVjdChyZXN1bHQucG9wKS50byBiZV90cnV0aHkgfQogICAgICAgcXVldWVzWzJdIDw8IDpoZWxsbwotICAgICAgcmVzdWx0LnBvcC5zaG91bGQgPT0gSGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcoZmFsc2UpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKSkKICAgICAgIDcudGltZXMgeyBxdWV1ZXMuc2hpZnQgPDwgOmV4aXQgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBIZWxsby5uZXcKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjMxLDcgKzIyOSw3IEBACiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKICAgICAgIGNsaWVudC5ncmVldGluZyhmYWxzZSkgIyBmb3JjZSBhIG1lc3NhZ2UgcGFzcwogICAgICAgQHNlcnZlci5zaHV0ZG93bgotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigyKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY29udGludWUgcHJvY2Vzc2luZyBhY3RpdmUgbWVzc2FnZXMgd2hlbiBzaHV0dGluZyBkb3duIiBkbwpAQCAtMjQwLDggKzIzOCw4IEBACiAgICAgICBjbGllbnQgPDwgOnNsZWVwCiAgICAgICBzbGVlcCAwLjEgIyBnaXZlIHRoZSBzZXJ2ZXIgdGltZSB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSBjbGllbnQncyBtZXNzYWdlCiAgICAgICBAc2VydmVyLnNodXRkb3duCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDIpLnNob3VsZCBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCi0gICAgICByZXN1bHQucG9wLnNob3VsZCA9PSA6c2xlcHQKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCisgICAgICBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoOnNsZXB0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBraWxsIGFjdGl2ZSBtZXNzYWdlcyB3aGVuIHRoZXkgZG9uJ3QgZXhwaXJlIHdoaWxlIHNodXR0aW5nIGRvd24iIGRvCkBAIC0yNTEsMTUgKzI0OSwxNSBAQAogICAgICAgc2xlZXAgMC4xICMgc3RhcnQgcHJvY2Vzc2luZyB0aGUgY2xpZW50J3MgbWVzc2FnZQogICAgICAgQHNlcnZlci5zaHV0ZG93bigxKQogICAgICAgQGNhdGNoX2V4Y2VwdGlvbnMgPSB0cnVlCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDMpLnNob3VsZF9ub3QgYmVfbmlsCi0gICAgICByZXN1bHQuc2hvdWxkIGJlX2VtcHR5CisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigzKSkubm90X3RvIGJlX25pbAorICAgICAgZXhwZWN0KHJlc3VsdCkudG8gYmVfZW1wdHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWxsb3cgc2h1dHRpbmcgZG93biBpbiByZXNwb25zZSB0byBhIG1lc3NhZ2UiIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gSGVsbG8ubmV3CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBjbGllbnQuc2h1dGRvd24KLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikuc2hvdWxkX25vdCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS5ub3RfdG8gYmVfbmlsCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCmluZGV4IGQzNWY2NTIuLmQzMDU1M2YgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCkBAIC0xNyw2NSArMTcsNjIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0UHJvY2Vzc29yU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1Byb2Nlc3NvcicgZG8KIAogICBjbGFzcyBQcm9jZXNzb3JTcGVjCiAgICAgaW5jbHVkZSBUaHJpZnQ6OlByb2Nlc3NvcgogICBlbmQKIAotICBkZXNjcmliZSAiUHJvY2Vzc29yIiBkbworICBkZXNjcmliZSBUaHJpZnQ6OlByb2Nlc3NvciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBQcm9jZXNzb3JTcGVjLm5ldyhtb2NrKCJNb2NrSGFuZGxlciIpKQotICAgICAgQHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQorICAgICAgQHByb2Nlc3NvciA9IFByb2Nlc3NvclNwZWMubmV3KGRvdWJsZSgiTW9ja0hhbmRsZXIiKSkKKyAgICAgIEBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQogICAgIGVuZAogCiAgICAgZGVmIG1vY2tfdHJhbnMob2JqKQotICAgICAgb2JqLnNob3VsZF9yZWNlaXZlKDp0cmFucykub3JkZXJlZC5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soInRyYW5zIikudGVlIGRvIHx0cmFuc3wKLSAgICAgICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChvYmopLnRvIHJlY2VpdmUoOnRyYW5zKS5vcmRlcmVkIGRvCisgICAgICAgIGRvdWJsZSgidHJhbnMiKS50YXAgZG8gfHRyYW5zfAorICAgICAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2FsbCBwcm9jZXNzXzxtZXNzYWdlPiB3aGVuIGl0IHJlY2VpdmVzIHRoYXQgbWVzc2FnZSIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgTWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3NfdGVzdE1lc3NhZ2UpLndpdGgoMTcsIEBwcm90LCBAcHJvdCkub3JkZXJlZAotICAgICAgQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkuc2hvdWxkID09IHRydWUKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxN10KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzX3Rlc3RNZXNzYWdlKS53aXRoKDE3LCBAcHJvdCwgQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KSkudG8gZXEodHJ1ZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gQXBwbGljYXRpb25FeGNlcHRpb24gd2hlbiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBNZXNzYWdlVHlwZXM6OkNBTEwsIDRdCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUeXBlczo6U1RSVUNUKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgTWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDQpLm9yZGVyZWQKLSAgICAgIEFwcGxpY2F0aW9uRXhjZXB0aW9uLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAiVW5rbm93biBmdW5jdGlvbiB0ZXN0TWVzc2FnZSIpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jayhBcHBsaWNhdGlvbkV4Y2VwdGlvbikudGVlIGRvIHxlfAotICAgICAgICAgIGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCA0XQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgNCkub3JkZXJlZAorICAgICAgZSA9IGRvdWJsZShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKQorICAgICAgZXhwZWN0KGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBleHBlY3QoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAiVW5rbm93biBmdW5jdGlvbiB0ZXN0TWVzc2FnZSIpLmFuZF9yZXR1cm4oZSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKICAgICAgIG1vY2tfdHJhbnMoQHByb3QpCiAgICAgICBAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIGFyZ3Mgb2ZmIHRvIHRoZSBhcmdzIGNsYXNzIiBkbwotICAgICAgYXJnc19jbGFzcyA9IG1vY2soIk1vY2tBcmdzQ2xhc3MiKQotICAgICAgYXJncyA9IG1vY2soIiM8TW9ja0FyZ3NDbGFzczptb2NrPiIpLnRlZSBkbyB8YXJnc3wKLSAgICAgICAgYXJncy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgYXJnc19jbGFzcyA9IGRvdWJsZSgiTW9ja0FyZ3NDbGFzcyIpCisgICAgICBhcmdzID0gZG91YmxlKCIjPE1vY2tBcmdzQ2xhc3M6bW9jaz4iKS50YXAgZG8gfGFyZ3N8CisgICAgICAgIGV4cGVjdChhcmdzKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KS5vcmRlcmVkCiAgICAgICBlbmQKLSAgICAgIGFyZ3NfY2xhc3Muc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBhcmdzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAotICAgICAgQHByb2Nlc3Nvci5yZWFkX2FyZ3MoQHByb3QsIGFyZ3NfY2xhc3MpLnNob3VsZCBlcWwoYXJncykKKyAgICAgIGV4cGVjdChhcmdzX2NsYXNzKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gYXJncworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb2Nlc3Nvci5yZWFkX2FyZ3MoQHByb3QsIGFyZ3NfY2xhc3MpKS50byBlcWwoYXJncykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgb3V0IGEgcmVwbHkgd2hlbiBhc2tlZCIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIE1lc3NhZ2VUeXBlczo6UkVQTFksIDIzKS5vcmRlcmVkCi0gICAgICByZXN1bHQgPSBtb2NrKCJNb2NrUmVzdWx0IikKLSAgICAgIHJlc3VsdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWSwgMjMpLm9yZGVyZWQKKyAgICAgIHJlc3VsdCA9IGRvdWJsZSgiTW9ja1Jlc3VsdCIpCisgICAgICBleHBlY3QocmVzdWx0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAogICAgICAgbW9ja190cmFucyhAcHJvdCkKICAgICAgIEBwcm9jZXNzb3Iud3JpdGVfcmVzdWx0KHJlc3VsdCwgQHByb3QsICd0ZXN0TWVzc2FnZScsIDIzKQogICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiCmluZGV4IDQ0MzM5YzAuLjJhN2RjNmQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKQEAgLTE3LDUzICsxNyw1MSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRTZXJpYWxpemVyU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAotICBpbmNsdWRlIFNwZWNOYW1lc3BhY2UKK2Rlc2NyaWJlICdTZXJpYWxpemVyJyBkbwogCi0gIGRlc2NyaWJlIFNlcmlhbGl6ZXIgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpTZXJpYWxpemVyIGRvCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgc3RydWN0cyB0byBiaW5hcnkgYnkgZGVmYXVsdCIgZG8KLSAgICAgIHNlcmlhbGl6ZXIgPSBTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldykKLSAgICAgIGRhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQotICAgICAgZGF0YS5zaG91bGQgPT0gIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiCisgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldykKKyAgICAgIGRhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQorICAgICAgZXhwZWN0KGRhdGEpLnRvIGVxKCJceDBCXHgwMFx4MDFceDAwXHgwMFx4MDBceDBFJ0VsbG8gZ3V2J25vciFceDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHN0cnVjdHMgdG8gdGhlIGdpdmVuIHByb3RvY29sIiBkbwotICAgICAgcHJvdG9jb2wgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJncmVldGluZyIsIFR5cGVzOjpTVFJJTkcsIDEpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQotICAgICAgc2VyaWFsaXplciA9IFNlcmlhbGl6ZXIubmV3KHByb3RvY29sX2ZhY3RvcnkpCi0gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpKQorICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJncmVldGluZyIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBkb3VibGUoIlByb3RvY29sRmFjdG9yeSIpCisgICAgICBhbGxvdyhwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCisgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQorICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKSkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgRGVzZXJpYWxpemVyIGRvCisgIGRlc2NyaWJlIFRocmlmdDo6RGVzZXJpYWxpemVyIGRvCiAgICAgaXQgInNob3VsZCBkZXNlcmlhbGl6ZSBzdHJ1Y3RzIGZyb20gYmluYXJ5IGJ5IGRlZmF1bHQiIGRvCi0gICAgICBkZXNlcmlhbGl6ZXIgPSBEZXNlcmlhbGl6ZXIubmV3CisgICAgICBkZXNlcmlhbGl6ZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcKICAgICAgIGRhdGEgPSAiXHgwQlx4MDBceDAxXHgwMFx4MDBceDAwXHgwRSdFbGxvIGd1didub3IhXHgwMCIKLSAgICAgIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShIZWxsby5uZXcsIGRhdGEpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpCisgICAgICBleHBlY3QoZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgZGF0YSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIidFbGxvIGd1didub3IhIikpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIHN0cnVjdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG9jb2wiIGRvCi0gICAgICBwcm90b2NvbCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLmFuZF9yZXR1cm4oIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKFsiZ3JlZXRpbmciLCBUeXBlczo6U1RSSU5HLCAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwsIFR5cGVzOjpTVE9QLCAwXSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigiR29vZCBkYXkiKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQotICAgICAgZGVzZXJpYWxpemVyID0gRGVzZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQotICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKEhlbGxvLm5ldywgIiIpLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpCisgICAgICBwcm90b2NvbCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikuYW5kX3JldHVybigiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKFsiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0pCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCisgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gZG91YmxlKCJQcm90b2NvbEZhY3RvcnkiKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQorICAgICAgZGVzZXJpYWxpemVyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KHByb3RvY29sX2ZhY3RvcnkpCisgICAgICBleHBlY3QoZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgIiIpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCmluZGV4IGZjZTUwMTMuLmVjOWU1NTAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKQEAgLTE3LDY0ICsxNyw2OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvc29ja2V0X3NwZWNfc2hhcmVkIgorcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKIAotY2xhc3MgVGhyaWZ0U2VydmVyU29ja2V0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1RocmlmdDo6U2VydmVyU29ja2V0JyBkbwogCi0gIGRlc2NyaWJlIFNlcnZlclNvY2tldCBkbworICBkZXNjcmliZSBUaHJpZnQ6OlNlcnZlclNvY2tldCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBzb2NrZXQgPSBTZXJ2ZXJTb2NrZXQubmV3KDEyMzQpCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KDEyMzQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIGhhbmRsZSB3aGVuIGNhbGxpbmcgbGlzdGVuIiBkbwotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCBob3N0IGFyZ3VtZW50IiBkbwotICAgICAgQHNvY2tldCA9IFNlcnZlclNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDEyMzQpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgnbG9jYWxob3N0JywgMTIzNCkKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDEyMzQpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoJ2xvY2FsaG9zdCcsIDEyMzQpCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNlcnZlcihsb2NhbGhvc3Q6MTIzNCkiCiAgICAgICBAc29ja2V0Lmxpc3RlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBUaHJpZnQ6OlNvY2tldCB0byB3cmFwIGFjY2VwdGVkIHNvY2tldHMiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiKQotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIikKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIHNvY2sgPSBtb2NrKCJzb2NrIikKLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCi0gICAgICB0cmFucyA9IG1vY2soIlNvY2tldCIpCi0gICAgIFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCA9PSB0cmFucworICAgICAgc29jayA9IGRvdWJsZSgic29jayIpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJTb2NrZXQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gZXEodHJhbnMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSBoYW5kbGUgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHdoZW4gYWNjZXB0aW5nIGlmIHRoZXJlIGlzIG5vIGhhbmRsZSIgZG8KLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiB0cnVlIGZvciBjbG9zZWQ/IHdoZW4gYXBwcm9wcmlhdGUiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFRDUFNlcnZlci5zdHViISg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJzb2NrZXQoOjEyMzQpIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKaW5kZXggZmZlOWJmZi4uNTdmNTIzNyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKQEAgLTE2LDE0NSArMTYsMTcyIEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK2Rlc2NyaWJlICdTZXJ2ZXInIGRvCiAKLWNsYXNzIFRocmlmdFNlcnZlclNwZWMgPCBTcGVjOjpFeGFtcGxlR3JvdXAKLSAgaW5jbHVkZSBUaHJpZnQKLQotICBkZXNjcmliZSBCYXNlU2VydmVyIGRvCi0gICAgaXQgInNob3VsZCBkZWZhdWx0IHRvIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGFuZCBCaW5hcnlQcm90b2NvbEZhY3Rvcnkgd2hlbiBub3Qgc3BlY2lmaWVkIiBkbwotICAgICAgc2VydmVyID0gQmFzZVNlcnZlci5uZXcobW9jaygiUHJvY2Vzc29yIiksIG1vY2soIkJhc2VTZXJ2ZXJUcmFuc3BvcnQiKSkKLSAgICAgIHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdHJhbnNwb3J0X2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoQmFzZVRyYW5zcG9ydEZhY3RvcnkpCi0gICAgICBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHByb3RvY29sX2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoQmluYXJ5UHJvdG9jb2xGYWN0b3J5KQotICAgIGVuZAotCi0gICAgIyBzZXJ2ZSBpcyBhIG5vb3AsIHNvIGNhbid0IHRlc3QgdGhhdAotICBlbmQKLQotICBzaGFyZWRfZXhhbXBsZXNfZm9yICJzZXJ2ZXJzIiBkbworICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VTZXJ2ZXIgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEBzZXJ2ZXJUcmFucyA9IG1vY2soIlNlcnZlclRyYW5zcG9ydCIpCi0gICAgICBAdHJhbnMgPSBtb2NrKCJCYXNlVHJhbnNwb3J0IikKLSAgICAgIEBwcm90ID0gbW9jaygiQmFzZVByb3RvY29sIikKLSAgICAgIEBjbGllbnQgPSBtb2NrKCJDbGllbnQiKQotICAgICAgQHNlcnZlciA9IHNlcnZlcl90eXBlLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBkZWZhdWx0IHRvIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGFuZCBCaW5hcnlQcm90b2NvbEZhY3Rvcnkgd2hlbiBub3Qgc3BlY2lmaWVkIiBkbworICAgICAgQHNlcnZlciA9IFRocmlmdDo6QmFzZVNlcnZlci5uZXcoZG91YmxlKCJQcm9jZXNzb3IiKSwgZG91YmxlKCJCYXNlU2VydmVyVHJhbnNwb3J0IikpCisgICAgICBleHBlY3QoQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdHJhbnNwb3J0X2ZhY3RvcnknKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGV4cGVjdChAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0Bwcm90b2NvbF9mYWN0b3J5JykpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBub3Qgc2VydmUiIGRvCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlKCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIFNpbXBsZVNlcnZlciBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAic2VydmVycyIKLQotICAgIGRlZiBzZXJ2ZXJfdHlwZQotICAgICAgU2ltcGxlU2VydmVyCisgIGRlc2NyaWJlIFRocmlmdDo6U2ltcGxlU2VydmVyIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJUcmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBjbGllbnQgPSBkb3VibGUoIkNsaWVudCIpCisgICAgICBAc2VydmVyID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCiAgICAgZW5kCi0KKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlclRyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInNpbXBsZShzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW4gdGhlIG1haW4gdGhyZWFkIiBkbwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQogICAgICAgeCA9IDAKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gdGhyb3cgOnN0b3AKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKLSAgICAgIGxhbWJkYSB7IEBzZXJ2ZXIuc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpzdG9wKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8gdGhyb3dfc3ltYm9sKDpzdG9wKQogICAgIGVuZAogICBlbmQKIAotICBkZXNjcmliZSBUaHJlYWRlZFNlcnZlciBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAic2VydmVycyIKLQotICAgIGRlZiBzZXJ2ZXJfdHlwZQotICAgICAgVGhyZWFkZWRTZXJ2ZXIKKyAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRlZFNlcnZlciBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyVHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJ0aHJlYWRlZChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgdGhyZWFkcyIgZG8KLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcHJvdCwgQHRyYW5zKS5leGFjdGx5KDMpLnRpbWVzLmFuZF95aWVsZChAcHJvdCwgQHRyYW5zKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoVGhyZWFkKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHByb3QsIEB0cmFucykuZXhhY3RseSgzKS50aW1lcy5hbmRfeWllbGQoQHByb3QsIEB0cmFucykKICAgICAgIHggPSAwCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHRocm93IDpzdG9wCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnNlcnZlIH0uc2hvdWxkIHRocm93X3N5bWJvbCg6c3RvcCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZAorICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvIHRocm93X3N5bWJvbCg6c3RvcCkKICAgICBlbmQKICAgZW5kCiAKLSAgZGVzY3JpYmUgVGhyZWFkUG9vbFNlcnZlciBkbwotICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAic2VydmVycyIKLQotICAgIGRlZiBzZXJ2ZXJfdHlwZQotICAgICAgIyBwdXQgdGhpcyBzdHVmZiBoZXJlIHNvIGl0IHJ1bnMgYmVmb3JlIHRoZSBzZXJ2ZXIgaXMgY3JlYXRlZAotICAgICAgQHRocmVhZFEgPSBtb2NrKCJTaXplZFF1ZXVlIikKLSAgICAgIFNpemVkUXVldWUuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgyMCkuYW5kX3JldHVybihAdGhyZWFkUSkKLSAgICAgIEBleGNRID0gbW9jaygiUXVldWUiKQotICAgICAgUXVldWUuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihAZXhjUSkKLSAgICAgIFRocmVhZFBvb2xTZXJ2ZXIKKyAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRQb29sU2VydmVyIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJfdHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlcl90cmFucywgQHRyYW5zLCBAcHJvdCkKKyAgICAgIHNsZWVwKDAuMTUpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHNldCB1cCB0aGUgcXVldWVzIiBkbwotICAgICAgQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdGhyZWFkX3EnKS5zaG91bGQgYmUoQHRocmVhZFEpCi0gICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BleGNlcHRpb25fcScpLnNob3VsZCBiZShAZXhjUSkKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJfdHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgidGhyZWFkcG9vbChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJfdHJhbnMpKSkpIikKICAgICBlbmQKLQorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW5zaWRlIGEgdGhyZWFkIiBkbwotICAgICAgVGhyZWFkLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gZG8gfGJsb2NrfAotICAgICAgICBAc2VydmVyLnNob3VsZF9yZWNlaXZlKDpzZXJ2ZSkKLSAgICAgICAgYmxvY2suY2FsbAotICAgICAgICBAc2VydmVyLnJzcGVjX3ZlcmlmeQorICAgICAgZXhjZXB0aW9uX3EgPSBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QGV4Y2VwdGlvbl9xKQorICAgICAgZXhwZWN0X2FueV9pbnN0YW5jZV9vZihkZXNjcmliZWRfY2xhc3MpLnRvIHJlY2VpdmUoOnNlcnZlKSBkbyAKKyAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1InKSkKICAgICAgIGVuZAotICAgICAgQGV4Y1Euc2hvdWxkX3JlY2VpdmUoOnBvcCkuYW5kX3Rocm93KDpwb3BwZWQpCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnJlc2N1YWJsZV9zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnBvcHBlZCkKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0udG8ocmFpc2VfZXJyb3IoJ0VSUk9SJykpCisgICAgICBzbGVlcCgwLjE1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhdm9pZCBydW5uaW5nIHRoZSBzZXJ2ZXIgdHdpY2Ugd2hlbiByZXRyeWluZyByZXNjdWFibGVfc2VydmUiIGRvCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBkbyB8YmxvY2t8Ci0gICAgICAgIEBzZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOnNlcnZlKQotICAgICAgICBibG9jay5jYWxsCi0gICAgICAgIEBzZXJ2ZXIucnNwZWNfdmVyaWZ5CisgICAgICBleGNlcHRpb25fcSA9IEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAZXhjZXB0aW9uX3EpCisgICAgICBleHBlY3RfYW55X2luc3RhbmNlX29mKGRlc2NyaWJlZF9jbGFzcykudG8gcmVjZWl2ZSg6c2VydmUpIGRvIAorICAgICAgICBleGNlcHRpb25fcS5wdXNoKFN0YW5kYXJkRXJyb3IubmV3KCdFUlJPUjEnKSkKKyAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1IyJykpCiAgICAgICBlbmQKLSAgICAgIEBleGNRLnNob3VsZF9yZWNlaXZlKDpwb3ApLnR3aWNlLmFuZF90aHJvdyg6cG9wcGVkKQotICAgICAgbGFtYmRhIHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpwb3BwZWQpCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnJlc2N1YWJsZV9zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnBvcHBlZCkKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIucmVzY3VhYmxlX3NlcnZlIH0udG8ocmFpc2VfZXJyb3IoJ0VSUk9SMScpKQorICAgICAgZXhwZWN0IHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS50byhyYWlzZV9lcnJvcignRVJST1IyJykpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIGEgdGhyZWFkIHBvb2wiIGRvCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAotICAgICAgQHRocmVhZFEuc2hvdWxkX3JlY2VpdmUoOnB1c2gpLndpdGgoOnRva2VuKQotICAgICAgQHRocmVhZFEuc2hvdWxkX3JlY2VpdmUoOnBvcCkKLSAgICAgIFRocmVhZC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfeWllbGQKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIHRocmVhZF9xID0gZG91YmxlKCJTaXplZFF1ZXVlIikKKyAgICAgIGV4Y2VwdGlvbl9xID0gZG91YmxlKCJRdWV1ZSIpCisgICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QHRocmVhZF9xLCB0aHJlYWRfcSkKKyAgICAgIEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAZXhjZXB0aW9uX3EsIGV4Y2VwdGlvbl9xKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KHRocmVhZF9xKS50byByZWNlaXZlKDpwdXNoKS53aXRoKDp0b2tlbikKKyAgICAgIGV4cGVjdCh0aHJlYWRfcSkudG8gcmVjZWl2ZSg6cG9wKQorICAgICAgZXhwZWN0KFRocmVhZCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfeWllbGQKKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHByb3QpCiAgICAgICB4ID0gMAogICAgICAgZXJyb3IgPSBSdW50aW1lRXJyb3IubmV3KCJTdG9wcGVkIikKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gcmFpc2UgZXJyb3IKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBleGNRLnNob3VsZF9yZWNlaXZlKDpwdXNoKS53aXRoKGVycm9yKS5hbmRfdGhyb3coOnN0b3ApCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgbGFtYmRhIHsgQHNlcnZlci5zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnN0b3ApCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KGV4Y2VwdGlvbl9xKS50byByZWNlaXZlKDpwdXNoKS53aXRoKGVycm9yKS5hbmRfdGhyb3coOnN0b3ApCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8odGhyb3dfc3ltYm9sKDpzdG9wKSkKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKaW5kZXggZGQ4YjBmOS4uMjAyYzc0NSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKQEAgLTE3LDQ1ICsxNyw1MiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvc29ja2V0X3NwZWNfc2hhcmVkIgorcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKIAotY2xhc3MgVGhyaWZ0U29ja2V0U3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAorZGVzY3JpYmUgJ1NvY2tldCcgZG8KIAotICBkZXNjcmliZSBTb2NrZXQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpTb2NrZXQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAc29ja2V0ID0gU29ja2V0Lm5ldwotICAgICAgQGhhbmRsZSA9IG1vY2soIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjb25uZWN0X25vbmJsb2NrKQotICAgICAgOjpTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldworICAgICAgQGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpzZXRzb2Nrb3B0KQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQogICAgIGVuZAogCiAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNvY2tldCIgZG8KLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgbGFtYmRhIHsgQHNvY2tldC5vcGVuIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvcGVuIGEgOjpTb2NrZXQgd2l0aCBkZWZhdWx0IGFyZ3MiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2soIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwKS5hbmRfcmV0dXJuKFtbXV0pCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KGxvY2FsaG9zdDo5MDkwKSIKICAgICAgIEBzb2NrZXQub3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgaG9zdC9wb3J0IG9wdGlvbnMiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2soIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0KS5hbmRfcmV0dXJuKFtbXV0pCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6c29ja2FkZHJfaW4pCi0gICAgICBTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0KS5vcGVuCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ215LmRvbWFpbicsIDEyMzQpLm9wZW4KKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KG15LmRvbWFpbjoxMjM0KSIKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCi0gICAgICA6OlNvY2tldC5zdHViISg6bmV3KQotICAgICAgU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dC5zaG91bGQgPT0gNQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0Lm5ldygnbXlob3N0JywgODA5MCkudG9fcykudG8gZXEoInNvY2tldChteWhvc3Q6ODA5MCkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCmluZGV4IDk2YjQzM2IuLjMyYmRiNzEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgorKysgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIKQEAgLTE3LDg4ICsxNyw4OCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCiBzaGFyZWRfZXhhbXBsZXNfZm9yICJhIHNvY2tldCIgZG8KICAgaXQgInNob3VsZCBvcGVuIGEgc29ja2V0IiBkbwotICAgIEBzb2NrZXQub3Blbi5zaG91bGQgPT0gQGhhbmRsZQorICAgIGV4cGVjdChAc29ja2V0Lm9wZW4pLnRvIGVxKEBoYW5kbGUpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgYmUgb3BlbiB3aGVuZXZlciBpdCBoYXMgYSBoYW5kbGUiIGRvCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAc29ja2V0LnNob3VsZCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX29wZW4KICAgICBAc29ja2V0LmhhbmRsZSA9IG5pbAotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgICAgQHNvY2tldC5oYW5kbGUgPSBAaGFuZGxlCiAgICAgQHNvY2tldC5jbG9zZQotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgd3JpdGUgZGF0YSB0byB0aGUgaGFuZGxlIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikKICAgICBAc29ja2V0LndyaXRlKCJmb29iYXIiKQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gaXQgY2Fubm90IHJlYWQgZnJvbSB0aGUgaGFuZGxlIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTcpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICBleHBlY3QgeyBAc29ja2V0LnJlYWQoMTcpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJldHVybiB0aGUgZGF0YSByZWFkIHdoZW4gcmVhZGluZyBmcm9tIHRoZSBoYW5kbGUgd29ya3MiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCi0gICAgQHNvY2tldC5yZWFkKDE3KS5zaG91bGQgPT0gInRlc3QgZGF0YSIKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCisgICAgZXhwZWN0KEBzb2NrZXQucmVhZCgxNykpLnRvIGVxKCJ0ZXN0IGRhdGEiKQogICBlbmQKIAogICBpdCAic2hvdWxkIGRlY2xhcmUgaXRzZWxmIGFzIGNsb3NlZCB3aGVuIGl0IGhhcyBhbiBlcnJvciIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgIEBzb2NrZXQuc2hvdWxkIGJlX29wZW4KLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9vcGVuCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTApIH0uc2hvdWxkIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKKyAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxMCkgfS50byByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgc3VwcG9ydCB0aGUgdGltZW91dCBhY2Nlc3NvciBmb3IgcmVhZCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAzCiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChbQGhhbmRsZV0sIG5pbCwgbmlsLCAzKS5hbmRfcmV0dXJuKFtbQGhhbmRsZV0sIFtdLCBbXV0pCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCi0gICAgQHNvY2tldC5yZWFkKDE3KS5zaG91bGQgPT0gInRlc3QgZGF0YSIKKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChbQGhhbmRsZV0sIG5pbCwgbmlsLCAzKS5hbmRfcmV0dXJuKFtbQGhhbmRsZV0sIFtdLCBbXV0pCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQorICAgIGV4cGVjdChAc29ja2V0LnJlYWQoMTcpKS50byBlcSgidGVzdCBkYXRhIikKICAgZW5kCiAKICAgaXQgInNob3VsZCBzdXBwb3J0IHRoZSB0aW1lb3V0IGFjY2Vzc29yIGZvciB3cml0ZSIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAzCiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAzKS50d2ljZS5hbmRfcmV0dXJuKFtbXSwgW0BoYW5kbGVdLCBbXV0pCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoInRlc3QgZGF0YSIpLmFuZF9yZXR1cm4oNCkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgiIGRhdGEiKS5hbmRfcmV0dXJuKDUpCi0gICAgQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikuc2hvdWxkID09IDkKKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAzKS50d2ljZS5hbmRfcmV0dXJuKFtbXSwgW0BoYW5kbGVdLCBbXV0pCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCJ0ZXN0IGRhdGEiKS5hbmRfcmV0dXJuKDQpCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCIgZGF0YSIpLmFuZF9yZXR1cm4oNSkKKyAgICBleHBlY3QoQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikpLnRvIGVxKDkpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiByZWFkIHRpbWVzIG91dCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAwLjUKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS53aXRoKFtAaGFuZGxlXSwgbmlsLCBuaWwsIDAuNSkuYXRfbGVhc3QoMSkudGltZXMuYW5kX3JldHVybihuaWwpCi0gICAgbGFtYmRhIHsgQHNvY2tldC5yZWFkKDE3KSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUIH0KKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkub25jZSB7c2xlZXAoMC41KTsgbmlsfQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxNykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gd3JpdGUgdGltZXMgb3V0IiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDAuNQogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMC41KS5hbnlfbnVtYmVyX29mX3RpbWVzLmFuZF9yZXR1cm4obmlsKQotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQgfQorICAgIGFsbG93KElPKS50byByZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMC41KS5hbmRfcmV0dXJuKG5pbCkKKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKSB9CiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYiBiL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCmluZGV4IGViNWQyOWMuLjViZjk4ZDAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCkBAIC0xLDMgKzEsNCBAQAorIyBlbmNvZGluZzogVVRGLTgKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTgsOSArMTksNyBAQAogIwogCiByZXF1aXJlICdydWJ5Z2VtcycKLSMgcmVxdWlyZSBhdCBsZWFzdCAxLjEuNCB0byBmaXggYSBidWcgd2l0aCBkZXNjcmliaW5nIE1vZHVsZXMKLWdlbSAncnNwZWMnLCAnPj0gMS4xLjQnCi1yZXF1aXJlICdzcGVjJworcmVxdWlyZSAncnNwZWMnCiAKICQ6LnVuc2hpZnQgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICold1suLiBleHRdKQogCkBAIC0yOCwzMyArMjcsMzggQEAKICMgd2lsbCBnZXQgc2NyZXdlZCB1cAogIyAkIiA8PCAnZmFzdHRocmVhZC5idW5kbGUnCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4vbGliL3RocmlmdCcKK3JlcXVpcmUgJ3RocmlmdCcKIAotY2xhc3MgT2JqZWN0Ci0gICMgdGVlIGlzIGEgdXNlZnVsIG1ldGhvZCwgc28gbGV0J3MgbGV0IG91ciB0ZXN0cyBoYXZlIGl0Ci0gIGRlZiB0ZWUoJmJsb2NrKQotICAgIGJsb2NrLmNhbGwoc2VsZikKLSAgICBzZWxmCit1bmxlc3MgT2JqZWN0Lm1ldGhvZF9kZWZpbmVkPyA6dGFwCisgICMgaWYgT2JqZWN0I3RhcCBpc24ndCBkZWZpbmVkLCB0aGVuIGFkZCBpdDsgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gaW4gUnVieSA8IDEuOC43CisgIGNsYXNzIE9iamVjdAorICAgIGRlZiB0YXAoJmJsb2NrKQorICAgICAgYmxvY2suY2FsbChzZWxmKQorICAgICAgc2VsZgorICAgIGVuZAogICBlbmQKIGVuZAogCi1TcGVjOjpSdW5uZXIuY29uZmlndXJlIGRvIHxjb25maWd1cmF0aW9ufAorUlNwZWMuY29uZmlndXJlIGRvIHxjb25maWd1cmF0aW9ufAogICBjb25maWd1cmF0aW9uLmJlZm9yZSg6ZWFjaCkgZG8KICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHRydWUKICAgZW5kCiBlbmQKIAotJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3Wy4uIGRlYnVnX3Byb3RvX3Rlc3QgZ2VuLXJiXSkKLXJlcXVpcmUgInNydiIKLXJlcXVpcmUgImRlYnVnX3Byb3RvX3Rlc3RfY29uc3RhbnRzIgorJDoudW5zaGlmdCBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgKiV3Wy4uIHRlc3QgZGVidWdfcHJvdG8gZ2VuLXJiXSkKK3JlcXVpcmUgJ3NydicKK3JlcXVpcmUgJ2RlYnVnX3Byb3RvX3Rlc3RfY29uc3RhbnRzJwogCiAkOi51bnNoaWZ0IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAqJXdbZ2VuLXJiXSkKIHJlcXVpcmUgJ3RocmlmdF9zcGVjX3R5cGVzJwogcmVxdWlyZSAnbm9uYmxvY2tpbmdfc2VydmljZScKIAogbW9kdWxlIEZpeHR1cmVzCi0gIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QgPSBDT01QQUNUX1RFU1QuZHVwCisgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QgPSBUaHJpZnQ6OlRlc3Q6OkNPTVBBQ1RfVEVTVC5kdXAKICAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVC5hX2JpbmFyeSA9IFswLDEsMiwzLDQsNSw2LDcsOF0ucGFjaygnYyonKQogICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNULnNldF9ieXRlX21hcCA9IG5pbAogICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNULm1hcF9ieXRlX21hcCA9IG5pbAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCisKKyQ6LnVuc2hpZnQgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICold1tnZW4tcmIvZmxhdF0pCisKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NzbF9zZXJ2ZXJfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTY1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiCkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9zb2NrZXRfc3BlY19zaGFyZWQiKQorCitkZXNjcmliZSAnU1NMU2VydmVyU29ja2V0JyBkbworCisgIGRlc2NyaWJlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0IGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0Lm5ldygxMjM0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzb2NrZXQudG9fcykudG8gZXEoInNzbChzb2NrZXQoOjEyMzQpKSIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4ZDhkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL3NzbF9zb2NrZXRfc3BlYy5yYgpAQCAtMCwwICsxLDc4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKKworZGVzY3JpYmUgJ1NTTFNvY2tldCcgZG8KKworICBkZXNjcmliZSBUaHJpZnQ6OlNTTFNvY2tldCBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBjb250ZXh0ID0gT3BlblNTTDo6U1NMOjpTU0xDb250ZXh0Lm5ldworICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0Lm5ldworICAgICAgQHNpbXBsZV9zb2NrZXRfaGFuZGxlID0gZG91YmxlKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KEBzaW1wbGVfc29ja2V0X2hhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAc2ltcGxlX3NvY2tldF9oYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAc2ltcGxlX3NvY2tldF9oYW5kbGUpLnRvIHJlY2VpdmUoOnNldHNvY2tvcHQpCisKKyAgICAgIEBoYW5kbGUgPSBkb3VibGUoZG91YmxlKCJTU0xIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6cG9zdF9jb25uZWN0aW9uX2NoZWNrID0+IHRydWUpLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykKKworICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAc2ltcGxlX3NvY2tldF9oYW5kbGUpCisgICAgICBhbGxvdyhPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgZW5kCisKKyAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImEgc29ja2V0IgorCisgICAgaXQgInNob3VsZCByYWlzZSBhIFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIGl0IGNhbm5vdCBvcGVuIGEgc3NsIHNvY2tldCIgZG8KKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoImxvY2FsaG9zdCIsIDkwOTAsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCisgICAgICBleHBlY3QgeyBAc29ja2V0Lm9wZW4gfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIG9wZW4gYSA6OlNvY2tldCB3aXRoIGRlZmF1bHQgYXJncyIgZG8KKyAgICAgIGV4cGVjdChPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBzaW1wbGVfc29ja2V0X2hhbmRsZSwgbmlsKS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cG9zdF9jb25uZWN0aW9uX2NoZWNrKS53aXRoKCdsb2NhbGhvc3QnKQorICAgICAgQHNvY2tldC5vcGVuCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGFjY2VwdCBob3N0L3BvcnQgb3B0aW9ucyIgZG8KKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnNldHNvY2tvcHQgPT4gbmlsKQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIGV4cGVjdChPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKGhhbmRsZSwgbmlsKS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cG9zdF9jb25uZWN0aW9uX2NoZWNrKS53aXRoKCdteS5kb21haW4nKQorICAgICAgVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0LCA2MDAwLCBuaWwpLm9wZW4KKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0KS50byBlcSg1KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgY29udGV4dCIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUsIEBjb250ZXh0KS5zc2xfY29udGV4dCkudG8gZXEoQGNvbnRleHQpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdteWhvc3QnLCA4MDkwKS50b19zKS50byBlcSgic3NsKHNvY2tldChteWhvc3Q6ODA5MCkpIikKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3RydWN0X25lc3RlZF9jb250YWluZXJzX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MzU2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiCkBAIC0wLDAgKzEsMTkxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICdTdHJ1Y3ROZXN0ZWRDb250YWluZXJzJyBkbworCisgIGRlZiB3aXRoX3R5cGVfY2hlY2tpbmcKKyAgICBzYXZlZF90eXBlX2NoZWNraW5nLCBUaHJpZnQudHlwZV9jaGVja2luZyA9IFRocmlmdC50eXBlX2NoZWNraW5nLCB0cnVlCisgICAgYmVnaW4KKyAgICAgIHlpZWxkCisgICAgZW5zdXJlCisgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHNhdmVkX3R5cGVfY2hlY2tpbmcKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpTdHJ1Y3QgZG8KKyAgICAjIE5lc3RlZCBjb250YWluZXIgdGVzdHMsIHNlZSBUSFJJRlQtMzY5LgorICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbGlzdHMgaW5zaWRlIGxpc3RzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5MaXN0Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluTGlzdC5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLCBbMiwgMywgNF0gXQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLnB1c2ggWzMsIDQsIDVdCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBsaXN0cyBpbnNpZGUgc2V0cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluU2V0Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluU2V0Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10sIFsyLCAzLCA0XSBdLnRvX3NldAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLmFkZCBbMywgNCwgNV0KKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIGxpc3RzIGluIG1hcCBrZXlzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5NYXBLZXkubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRMaXN0SW5NYXBLZXkubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IFsxLCAyLCAzXSA9PiAxLCBbMiwgMywgNF0gPT4gMiB9CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWVbWzMsIDQsIDVdXSA9IDMKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIGxpc3RzIGluIG1hcCB2YWx1ZXMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZExpc3RJbk1hcFZhbHVlLm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkTGlzdEluTWFwVmFsdWUubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4gWzEsIDIsIDNdLCAyID0+IFsyLCAzLCA0XSB9CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWVbM10gPSBbMywgNCwgNV0KKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIHNldHMgaW5zaWRlIGxpc3RzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJbkxpc3QubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRTZXRJbkxpc3QubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXS50b19zZXQsIFsyLCAzLCA0XS50b19zZXQgXQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLnB1c2goWzMsIDQsIDVdLnRvX3NldCkKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIHNldHMgaW5zaWRlIHNldHMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluU2V0Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5TZXQubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXS50b19zZXQsIFsyLCAzLCA0XS50b19zZXQgXS50b19zZXQKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZS5hZGQoWzMsIDQsIDVdLnRvX3NldCkKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIHNldHMgaW4gbWFwIGtleXMiIGRvCisgICAgICB3aXRoX3R5cGVfY2hlY2tpbmcgZG8KKyAgICAgICAgYSwgYiA9IFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluTWFwS2V5Lm5ldywgU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5NYXBLZXkubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IFsxLCAyLCAzXS50b19zZXQgPT4gMSwgWzIsIDMsIDRdLnRvX3NldCA9PiAyIH0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZVtbMywgNCwgNV0udG9fc2V0XSA9IDMKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIHNldHMgaW4gbWFwIHZhbHVlcyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkU2V0SW5NYXBWYWx1ZS5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZFNldEluTWFwVmFsdWUubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4gWzEsIDIsIDNdLnRvX3NldCwgMiA9PiBbMiwgMywgNF0udG9fc2V0IH0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZVszXSA9IFszLCA0LCA1XS50b19zZXQKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIG1hcHMgaW5zaWRlIGxpc3RzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJbkxpc3QubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJbkxpc3QubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIHsxID0+IDIsIDMgPT4gNH0sIHsyID0+IDMsIDQgPT4gNX0gXQorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLnB1c2goeyAzID0+IDQsIDUgPT4gNiB9KQorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc3VwcG9ydCBuZXN0ZWQgbWFwcyBpbnNpZGUgc2V0cyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5TZXQubmV3LCBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJblNldC5uZXcKKyAgICAgICAgW2EsIGJdLmVhY2ggZG8gfHRocmlmdF9zdHJ1Y3R8CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgezEgPT4gMiwgMyA9PiA0fSwgezIgPT4gMywgNCA9PiA1fSBdLnRvX3NldAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKKyAgICAgICAgZW5kCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQorICAgICAgICBiLnZhbHVlLmFkZCh7IDMgPT4gNCwgNSA9PiA2IH0pCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBzdXBwb3J0IG5lc3RlZCBtYXBzIGluIG1hcCBrZXlzIiBkbworICAgICAgd2l0aF90eXBlX2NoZWNraW5nIGRvCisgICAgICAgIGEsIGIgPSBTcGVjTmFtZXNwYWNlOjpOZXN0ZWRNYXBJbk1hcEtleS5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluTWFwS2V5Lm5ldworICAgICAgICBbYSwgYl0uZWFjaCBkbyB8dGhyaWZ0X3N0cnVjdHwKKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyB7IDEgPT4gMiwgMyA9PiA0fSA9PiAxLCB7MiA9PiAzLCA0ID0+IDV9ICA9PiAyIH0KKyAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCisgICAgICAgIGVuZAorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKKyAgICAgICAgYi52YWx1ZVt7MyA9PiA0LCA1ID0+IDZ9XSA9IDMKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHN1cHBvcnQgbmVzdGVkIG1hcHMgaW4gbWFwIHZhbHVlcyIgZG8KKyAgICAgIHdpdGhfdHlwZV9jaGVja2luZyBkbworICAgICAgICBhLCBiID0gU3BlY05hbWVzcGFjZTo6TmVzdGVkTWFwSW5NYXBWYWx1ZS5uZXcsIFNwZWNOYW1lc3BhY2U6Ok5lc3RlZE1hcEluTWFwVmFsdWUubmV3CisgICAgICAgIFthLCBiXS5lYWNoIGRvIHx0aHJpZnRfc3RydWN0fAorICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4geyAxID0+IDIsIDMgPT4gNH0sIDIgPT4gezIgPT4gMywgNCA9PiA1fSB9CisgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQorICAgICAgICBlbmQKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCisgICAgICAgIGIudmFsdWVbM10gPSB7IDMgPT4gNCwgNSA9PiA2IH0KKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCmluZGV4IDU5YTQwMTguLmJiZDUwMmIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCkBAIC0xNywxOTUgKzE3LDIwMiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJwogCi1jbGFzcyBUaHJpZnRTdHJ1Y3RTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0Ci0gIGluY2x1ZGUgU3BlY05hbWVzcGFjZQorZGVzY3JpYmUgJ1N0cnVjdCcgZG8KIAotICBkZXNjcmliZSBTdHJ1Y3QgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpTdHJ1Y3QgZG8KICAgICBpdCAic2hvdWxkIGl0ZXJhdGUgb3ZlciBhbGwgZmllbGRzIHByb3Blcmx5IiBkbwogICAgICAgZmllbGRzID0ge30KLSAgICAgIEZvby5uZXcuZWFjaF9maWVsZCB7IHxmaWQsZmllbGRfaW5mb3wgZmllbGRzW2ZpZF0gPSBmaWVsZF9pbmZvIH0KLSAgICAgIGZpZWxkcy5zaG91bGQgPT0gRm9vOjpGSUVMRFMKKyAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuZWFjaF9maWVsZCB7IHxmaWQsZmllbGRfaW5mb3wgZmllbGRzW2ZpZF0gPSBmaWVsZF9pbmZvIH0KKyAgICAgIGV4cGVjdChmaWVsZHMpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkZvbzo6RklFTERTKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbml0aWFsaXplIGFsbCBmaWVsZHMgdG8gZGVmYXVsdHMiIGRvCi0gICAgICBzdHJ1Y3QgPSBGb28ubmV3Ci0gICAgICBzdHJ1Y3Quc2ltcGxlLnNob3VsZCA9PSA1MwotICAgICAgc3RydWN0LndvcmRzLnNob3VsZCA9PSAid29yZHMiCi0gICAgICBzdHJ1Y3QuaGVsbG8uc2hvdWxkID09IEhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKQotICAgICAgc3RydWN0LmludHMuc2hvdWxkID09IFsxLCAyLCAyLCAzXQotICAgICAgc3RydWN0LmNvbXBsZXguc2hvdWxkIGJlX25pbAotICAgICAgc3RydWN0LnNob3J0cy5zaG91bGQgPT0gU2V0Lm5ldyhbNSwgMTcsIDIzOV0pCisgICAgICB2YWxpZGF0ZV9kZWZhdWx0X2FyZ3VtZW50cyhTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBpbml0aWFsaXplIGFsbCBmaWVsZHMgdG8gZGVmYXVsdHMgYW5kIGFjY2VwdCBhIGJsb2NrIGFyZ3VtZW50IiBkbworICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyBkbyB8ZnwKKyAgICAgICAgdmFsaWRhdGVfZGVmYXVsdF9hcmd1bWVudHMoZikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgZGVmIHZhbGlkYXRlX2RlZmF1bHRfYXJndW1lbnRzKG9iamVjdCkKKyAgICAgIGV4cGVjdChvYmplY3Quc2ltcGxlKS50byBlcSg1MykKKyAgICAgIGV4cGVjdChvYmplY3Qud29yZHMpLnRvIGVxKCJ3b3JkcyIpCisgICAgICBleHBlY3Qob2JqZWN0LmhlbGxvKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykpCisgICAgICBleHBlY3Qob2JqZWN0LmludHMpLnRvIGVxKFsxLCAyLCAyLCAzXSkKKyAgICAgIGV4cGVjdChvYmplY3QuY29tcGxleCkudG8gYmVfbmlsCisgICAgICBleHBlY3Qob2JqZWN0LnNob3J0cykudG8gZXEoU2V0Lm5ldyhbNSwgMTcsIDIzOV0pKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3Qgc2hhcmUgZGVmYXVsdCB2YWx1ZXMgYmV0d2VlbiBpbnN0YW5jZXMiIGRvCiAgICAgICBiZWdpbgotICAgICAgICBzdHJ1Y3QgPSBGb28ubmV3CisgICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKICAgICAgICAgc3RydWN0LmludHMgPDwgMTcKLSAgICAgICAgRm9vLm5ldy5pbnRzLnNob3VsZCA9PSBbMSwyLDIsM10KKyAgICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuaW50cykudG8gZXEoWzEsMiwyLDNdKQogICAgICAgZW5zdXJlCiAgICAgICAgICMgZW5zdXJlIG5vIGxlYWthZ2UgdG8gb3RoZXIgdGVzdHMKLSAgICAgICAgRm9vOjpGSUVMRFNbNF1bOmRlZmF1bHRdID0gWzEsMiwyLDNdCisgICAgICAgIFNwZWNOYW1lc3BhY2U6OkZvbzo6RklFTERTWzRdWzpkZWZhdWx0XSA9IFsxLDIsMiwzXQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByb3Blcmx5IGluaXRpYWxpemUgYm9vbGVhbiB2YWx1ZXMiIGRvCi0gICAgICBzdHJ1Y3QgPSBCb29sU3RydWN0Lm5ldyg6eWVzbm8gPT4gZmFsc2UpCi0gICAgICBzdHJ1Y3QueWVzbm8uc2hvdWxkIGJlX2ZhbHNlCisgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpCb29sU3RydWN0Lm5ldyg6eWVzbm8gPT4gZmFsc2UpCisgICAgICBleHBlY3Qoc3RydWN0Lnllc25vKS50byBiZV9mYWxzZXkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaGF2ZSBwcm9wZXIgPT0gc2VtYW50aWNzIiBkbwotICAgICAgRm9vLm5ldy5zaG91bGRfbm90ID09IEhlbGxvLm5ldwotICAgICAgRm9vLm5ldy5zaG91bGQgPT0gRm9vLm5ldwotICAgICAgRm9vLm5ldyg6c2ltcGxlID0+IDUyKS5zaG91bGRfbm90ID09IEZvby5uZXcKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KS5ub3RfdG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkZvby5uZXcpCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6c2ltcGxlID0+IDUyKSkubm90X3RvIGVxKFNwZWNOYW1lc3BhY2U6OkZvby5uZXcpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByaW50IGVudW0gdmFsdWUgbmFtZXMgaW4gaW5zcGVjdCIgZG8KLSAgICAgIFN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTb21lRW51bTo6T05FKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bSBzb21lX2VudW06T05FICgwKT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtIHNvbWVfZW51bTpPTkUgKDApPiIpCiAKLSAgICAgIFN0cnVjdFdpdGhFbnVtTWFwLm5ldyg6bXlfbWFwID0+IHtTb21lRW51bTo6T05FID0+IFtTb21lRW51bTo6VFdPXX0pLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAgbXlfbWFwOntPTkUgKDApOiBbVFdPICgxKV19PiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcC5uZXcoOm15X21hcCA9PiB7U3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSA9PiBbU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXT119KS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwIG15X21hcDp7T05FICgwKTogW1RXTyAoMSldfT4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmV0dHkgcHJpbnQgYmluYXJ5IGZpZWxkcyIgZG8KLSAgICAgIEZvbzIubmV3KDpteV9iaW5hcnkgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6Rm9vMiBteV9iaW5hcnk6MDEwMjAzPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28yLm5ldyg6bXlfYmluYXJ5ID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OkZvbzIgbXlfYmluYXJ5OjAxMDIwMz4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvZmZlciBmaWVsZD8gbWV0aG9kcyIgZG8KLSAgICAgIEZvby5uZXcub3B0X3N0cmluZz8uc2hvdWxkIGJlX2ZhbHNlCi0gICAgICBGb28ubmV3KDpzaW1wbGUgPT4gNTIpLnNpbXBsZT8uc2hvdWxkIGJlX3RydWUKLSAgICAgIEZvby5uZXcoOm15X2Jvb2wgPT4gZmFsc2UpLm15X2Jvb2w/LnNob3VsZCBiZV90cnVlCi0gICAgICBGb28ubmV3KDpteV9ib29sID0+IHRydWUpLm15X2Jvb2w/LnNob3VsZCBiZV90cnVlCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5vcHRfc3RyaW5nPykudG8gYmVfZmFsc2V5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6c2ltcGxlID0+IDUyKS5zaW1wbGU/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpteV9ib29sID0+IGZhbHNlKS5teV9ib29sPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiB0cnVlKS5teV9ib29sPykudG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJlIGNvbXBhcmFibGUiIGRvCi0gICAgICBzMSA9IFN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTb21lRW51bTo6T05FKQotICAgICAgczIgPSBTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU29tZUVudW06OlRXTykKKyAgICAgIHMxID0gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpCisgICAgICBzMiA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPKQogCi0gICAgICAoczEgPD0+IHMyKS5zaG91bGQgPT0gLTEKLSAgICAgIChzMiA8PT4gczEpLnNob3VsZCA9PSAxCi0gICAgICAoczEgPD0+IHMxKS5zaG91bGQgPT0gMAotICAgICAgKHMxIDw9PiBTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KCkpLnNob3VsZCA9PSAtMQorICAgICAgZXhwZWN0KHMxIDw9PiBzMikudG8gZXEoLTEpCisgICAgICBleHBlY3QoczIgPD0+IHMxKS50byBlcSgxKQorICAgICAgZXhwZWN0KHMxIDw9PiBzMSkudG8gZXEoMCkKKyAgICAgIGV4cGVjdChzMSA8PT4gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldygpKS50byBlcSgtMSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBpdHNlbGYgb2ZmIHRoZSB3aXJlIiBkbwotICAgICAgc3RydWN0ID0gRm9vLm5ldwotICAgICAgcHJvdCA9IEJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCi0gICAgICAgIFsnY29tcGxleCcsIFR5cGVzOjpNQVAsIDVdLCAjIEZvbwotICAgICAgICBbJ3dvcmRzJywgVHlwZXM6OlNUUklORywgMl0sICMgRm9vCi0gICAgICAgIFsnaGVsbG8nLCBUeXBlczo6U1RSVUNULCAzXSwgIyBGb28KLSAgICAgICAgICBbJ2dyZWV0aW5nJywgVHlwZXM6OlNUUklORywgMV0sICMgSGVsbG8KLSAgICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0sICMgSGVsbG8KLSAgICAgICAgWydzaW1wbGUnLCBUeXBlczo6STMyLCAxXSwgIyBGb28KLSAgICAgICAgWydpbnRzJywgVHlwZXM6OkxJU1QsIDRdLCAjIEZvbwotICAgICAgICBbJ3Nob3J0cycsIFR5cGVzOjpTRVQsIDZdLCAjIEZvbwotICAgICAgICBbbmlsLCBUeXBlczo6U1RPUCwgMF0gIyBIZWxsbworICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldworICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAorICAgICAgICBbJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDVdLCAjIEZvbworICAgICAgICBbJ3dvcmRzJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwgIyBGb28KKyAgICAgICAgWydoZWxsbycsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgM10sICMgRm9vCisgICAgICAgICAgWydncmVldGluZycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sICMgSGVsbG8KKyAgICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSwgIyBIZWxsbworICAgICAgICBbJ3NpbXBsZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMV0sICMgRm9vCisgICAgICAgIFsnaW50cycsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDRdLCAjIEZvbworICAgICAgICBbJ3Nob3J0cycsIFRocmlmdDo6VHlwZXM6OlNFVCwgNl0sICMgRm9vCisgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdICMgSGVsbG8KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDcpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybigKLSAgICAgICAgW1R5cGVzOjpJMzIsIFR5cGVzOjpNQVAsIDJdLCAjIGNvbXBsZXgKLSAgICAgICAgICBbVHlwZXM6OlNUUklORywgVHlwZXM6OkRPVUJMRSwgMl0sICMgY29tcGxleC8xL3ZhbHVlCi0gICAgICAgICAgW1R5cGVzOjpTVFJJTkcsIFR5cGVzOjpET1VCTEUsIDFdICMgY29tcGxleC8yL3ZhbHVlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNykudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgICAgW1RocmlmdDo6VHlwZXM6OkkzMiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAyXSwgIyBjb21wbGV4CisgICAgICAgICAgW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAyXSwgIyBjb21wbGV4LzEvdmFsdWUKKyAgICAgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDFdICMgY29tcGxleC8yL3ZhbHVlCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikuYW5kX3JldHVybihbVHlwZXM6OkkzMiwgNF0pCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLmFuZF9yZXR1cm4oW1R5cGVzOjpJMTYsIDJdKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMzIsIDRdKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkxNiwgMl0pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKAogICAgICAgICAxLCAxNCwgICAgICAgICMgY29tcGxleCBrZXlzCiAgICAgICAgIDQyLCAgICAgICAgICAgIyBzaW1wbGUKICAgICAgICAgNCwgMjMsIDQsIDI5ICAjIGludHMKICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJwaSIsICJlIiwgImZlaWdlbmJhdW0iLCAiYXBwbGUgYmFuYW5hIiwgIndoYXQncyB1cD8iKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLmFuZF9yZXR1cm4oTWF0aDo6UEksIE1hdGg6OkUsIDQuNjY5MjAxNjA5KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMTYpLmFuZF9yZXR1cm4oMiwgMykKLSAgICAgIHByb3Quc2hvdWxkX25vdF9yZWNlaXZlKDpza2lwKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJwaSIsICJlIiwgImZlaWdlbmJhdW0iLCAiYXBwbGUgYmFuYW5hIiwgIndoYXQncyB1cD8iKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5hbmRfcmV0dXJuKE1hdGg6OlBJLCBNYXRoOjpFLCA0LjY2OTIwMTYwOSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikuYW5kX3JldHVybigyLCAzKQorICAgICAgZXhwZWN0KHByb3QpLm5vdF90byByZWNlaXZlKDpza2lwKQogICAgICAgc3RydWN0LnJlYWQocHJvdCkKIAotICAgICAgc3RydWN0LnNpbXBsZS5zaG91bGQgPT0gNDIKLSAgICAgIHN0cnVjdC5jb21wbGV4LnNob3VsZCA9PSB7MSA9PiB7InBpIiA9PiBNYXRoOjpQSSwgImUiID0+IE1hdGg6OkV9LCAxNCA9PiB7ImZlaWdlbmJhdW0iID0+IDQuNjY5MjAxNjA5fX0KLSAgICAgIHN0cnVjdC5oZWxsby5zaG91bGQgPT0gSGVsbG8ubmV3KDpncmVldGluZyA9PiAid2hhdCdzIHVwPyIpCi0gICAgICBzdHJ1Y3Qud29yZHMuc2hvdWxkID09ICJhcHBsZSBiYW5hbmEiCi0gICAgICBzdHJ1Y3QuaW50cy5zaG91bGQgPT0gWzQsIDIzLCA0LCAyOV0KLSAgICAgIHN0cnVjdC5zaG9ydHMuc2hvdWxkID09IFNldC5uZXcoWzMsIDJdKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaW1wbGUpLnRvIGVxKDQyKQorICAgICAgZXhwZWN0KHN0cnVjdC5jb21wbGV4KS50byBlcSh7MSA9PiB7InBpIiA9PiBNYXRoOjpQSSwgImUiID0+IE1hdGg6OkV9LCAxNCA9PiB7ImZlaWdlbmJhdW0iID0+IDQuNjY5MjAxNjA5fX0pCisgICAgICBleHBlY3Qoc3RydWN0LmhlbGxvKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJ3aGF0J3MgdXA/IikpCisgICAgICBleHBlY3Qoc3RydWN0LndvcmRzKS50byBlcSgiYXBwbGUgYmFuYW5hIikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaW50cykudG8gZXEoWzQsIDIzLCA0LCAyOV0pCisgICAgICBleHBlY3Qoc3RydWN0LnNob3J0cykudG8gZXEoU2V0Lm5ldyhbMywgMl0pKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgZmFsc2UgYm9vbGVhbiBmaWVsZHMgY29ycmVjdGx5IiBkbwotICAgICAgYiA9IEJvb2xTdHJ1Y3QubmV3KDp5ZXNubyA9PiBmYWxzZSkKLSAgICAgIHByb3QgPSBCaW5hcnlQcm90b2NvbC5uZXcoTWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2Jvb2wpLndpdGgoZmFsc2UpCisgICAgICBiID0gU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdC5uZXcoOnllc25vID0+IGZhbHNlKQorICAgICAgcHJvdCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKGZhbHNlKQogICAgICAgYi53cml0ZShwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHVuZXhwZWN0ZWQgZmllbGRzIGluIHN0cnVjdHMgYW5kIHVzZSBkZWZhdWx0IHZhbHVlcyIgZG8KLSAgICAgIHN0cnVjdCA9IEZvby5uZXcKLSAgICAgIHByb3QgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAotICAgICAgICBbJ3NpbXBsZScsIFR5cGVzOjpJMzIsIDFdLAotICAgICAgICBbJ2NvbXBsZXgnLCBUeXBlczo6U1RSVUNULCA1XSwKLSAgICAgICAgWyd0aGlueicsIFR5cGVzOjpNQVAsIDddLAotICAgICAgICBbJ2Zvb2JhcicsIFR5cGVzOjpJMzIsIDNdLAotICAgICAgICBbJ3dvcmRzJywgVHlwZXM6OlNUUklORywgMl0sCi0gICAgICAgIFtuaWwsIFR5cGVzOjpTVE9QLCAwXQorICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldworICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAorICAgICAgICBbJ3NpbXBsZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMV0sCisgICAgICAgIFsnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgNV0sCisgICAgICAgIFsndGhpbnonLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDddLAorICAgICAgICBbJ2Zvb2JhcicsIFRocmlmdDo6VHlwZXM6OkkzMiwgM10sCisgICAgICAgIFsnd29yZHMnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDJdLAorICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNSkudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oImZvb2JhciIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFR5cGVzOjpTVFJVQ1QpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFR5cGVzOjpNQVApCi0gICAgICAjIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5hbmRfcmV0dXJuKFtUeXBlczo6STMyLCBUeXBlczo6STMyLCAwXSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg1KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJmb29iYXIiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQorICAgICAgIyBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDBdKQogICAgICAgIyBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFR5cGVzOjpJMzIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIpCiAgICAgICBzdHJ1Y3QucmVhZChwcm90KQogCi0gICAgICBzdHJ1Y3Quc2ltcGxlLnNob3VsZCA9PSA0MgotICAgICAgc3RydWN0LmNvbXBsZXguc2hvdWxkIGJlX25pbAotICAgICAgc3RydWN0LndvcmRzLnNob3VsZCA9PSAiZm9vYmFyIgotICAgICAgc3RydWN0LmhlbGxvLnNob3VsZCA9PSBIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykKLSAgICAgIHN0cnVjdC5pbnRzLnNob3VsZCA9PSBbMSwgMiwgMiwgM10KLSAgICAgIHN0cnVjdC5zaG9ydHMuc2hvdWxkID09IFNldC5uZXcoWzUsIDE3LCAyMzldKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaW1wbGUpLnRvIGVxKDQyKQorICAgICAgZXhwZWN0KHN0cnVjdC5jb21wbGV4KS50byBiZV9uaWwKKyAgICAgIGV4cGVjdChzdHJ1Y3Qud29yZHMpLnRvIGVxKCJmb29iYXIiKQorICAgICAgZXhwZWN0KHN0cnVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpKQorICAgICAgZXhwZWN0KHN0cnVjdC5pbnRzKS50byBlcShbMSwgMiwgMiwgM10pCisgICAgICBleHBlY3Qoc3RydWN0LnNob3J0cykudG8gZXEoU2V0Lm5ldyhbNSwgMTcsIDIzOV0pKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBpdHNlbGYgdG8gdGhlIHdpcmUiIGRvCi0gICAgICBwcm90ID0gQmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkgI21vY2soIlByb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6Rm9vIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdpbnRzJywgVHlwZXM6OkxJU1QsIDQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgyKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29tcGxleCcsIFR5cGVzOjpNQVAsIDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnZm9vJykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgxLjIzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3Nob3J0cycsIFR5cGVzOjpTRVQsIDYpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoNSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgxNykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgyMzkpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5leGFjdGx5KDYpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2ltcGxlJywgVHlwZXM6OkkzMiwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1MykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdoZWxsbycsIFR5cGVzOjpTVFJVQ1QsIDMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZ3JlZXRpbmcnLCBUeXBlczo6U1RSSU5HLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdoZWxsbywgd29ybGQhJykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUeXBlczo6STMyLCBUeXBlczo6TUFQLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFR5cGVzOjpTVFJJTkcsIFR5cGVzOjpET1VCTEUsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbGlzdF9iZWdpbikud2l0aChUeXBlczo6STMyLCA0KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbGlzdF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zZXRfYmVnaW4pLndpdGgoVHlwZXM6OkkxNiwgMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3NldF9lbmQpCisgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpICNtb2NrKCJQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpGb28iKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ludHMnLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCA0KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgyKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA1KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnZm9vJykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoMS4yMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2hvcnRzJywgVGhyaWZ0OjpUeXBlczo6U0VULCA2KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCg1KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgxNykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMjM5KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5leGFjdGx5KDYpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3NpbXBsZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNTMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2hlbGxvJywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdncmVldGluZycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2hlbGxvLCB3b3JsZCEnKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWFwX2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9saXN0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMiwgNCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9saXN0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zZXRfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STE2LCAzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3NldF9lbmQpCiAKLSAgICAgIHN0cnVjdCA9IEZvby5uZXcKKyAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKICAgICAgIHN0cnVjdC53b3JkcyA9IG5pbAogICAgICAgc3RydWN0LmNvbXBsZXggPSB7NSA9PiB7ImZvbyIgPT4gMS4yM319CiAgICAgICBzdHJ1Y3Qud3JpdGUocHJvdCkKQEAgLTIxMyw1MSArMjIwLDUxIEBACiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBwcmVzZW50ZWQgd2l0aCBhbiB1bmtub3duIGNvbnRhaW5lciIgZG8KICAgICAgICMgeWVhaCB0aGlzIGlzIHNpbGx5LCBidXQgSSdtIGdvaW5nIGZvciBjb2RlIGNvdmVyYWdlIGhlcmUKLSAgICAgIHN0cnVjdCA9IEZvby5uZXcKLSAgICAgIGxhbWJkYSB7IHN0cnVjdC5zZW5kIDp3cml0ZV9jb250YWluZXIsIG5pbCwgbmlsLCB7OnR5cGUgPT4gImZvbyJ9IH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJOb3QgYSBjb250YWluZXIgdHlwZTogZm9vIikKKyAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKKyAgICAgIGV4cGVjdCB7IHN0cnVjdC5zZW5kIDp3cml0ZV9jb250YWluZXIsIG5pbCwgbmlsLCB7OnR5cGUgPT4gImZvbyJ9IH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIk5vdCBhIGNvbnRhaW5lciB0eXBlOiBmb28iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9wdGlvbmFsIHR5cGUtY2hlY2tpbmcgaW4gVGhyaWZ0OjpTdHJ1Y3QubmV3IiBkbwogICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSB0cnVlCiAgICAgICBiZWdpbgotICAgICAgICBsYW1iZGEgeyBIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvciwgIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZ3JlZXRpbmciKQorICAgICAgICBleHBlY3QgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBncmVldGluZy8pCiAgICAgICBlbnN1cmUKICAgICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBmYWxzZQogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgb3B0aW9uYWwgdHlwZS1jaGVja2luZyBpbiBmaWVsZCBhY2Nlc3NvcnMiIGRvCiAgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IHRydWUKICAgICAgIGJlZ2luCi0gICAgICAgIGhlbGxvID0gSGVsbG8ubmV3Ci0gICAgICAgIGxhbWJkYSB7IGhlbGxvLmdyZWV0aW5nID0gMyB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IsICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGdyZWV0aW5nIikKKyAgICAgICAgaGVsbG8gPSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKKyAgICAgICAgZXhwZWN0IHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBncmVldGluZy8pCiAgICAgICBlbnN1cmUKICAgICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBmYWxzZQogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBoZWxsby5ncmVldGluZyA9IDMgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IGhlbGxvLmdyZWV0aW5nID0gMyB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB1bmtub3duIHR5cGVzIGFyZSBnaXZlbiB0byBUaHJpZnQ6OlN0cnVjdC5uZXciIGRvCi0gICAgICBsYW1iZGEgeyBIZWxsby5uZXcoOmZpc2ggPT4gJ3NhbG1vbicpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKEV4Y2VwdGlvbiwgIlVua25vd24ga2V5IGdpdmVuIHRvIFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldzogZmlzaCIpCisgICAgICBleHBlY3QgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmZpc2ggPT4gJ3NhbG1vbicpIH0udG8gcmFpc2VfZXJyb3IoRXhjZXB0aW9uLCAiVW5rbm93biBrZXkgZ2l2ZW4gdG8gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3OiBmaXNoIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBgcmFpc2UgWGNlcHRpb24sICdtZXNzYWdlJ2AgZm9yIEV4Y2VwdGlvbiBzdHJ1Y3RzIiBkbwogICAgICAgYmVnaW4KLSAgICAgICAgcmFpc2UgWGNlcHRpb24sICJzb21ldGhpbmcgaGFwcGVuZWQiCisgICAgICAgIHJhaXNlIFNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uLCAic29tZXRoaW5nIGhhcHBlbmVkIgogICAgICAgcmVzY3VlIFRocmlmdDo6RXhjZXB0aW9uID0+IGUKLSAgICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAic29tZXRoaW5nIGhhcHBlbmVkIgotICAgICAgICBlLmNvZGUuc2hvdWxkID09IDEKKyAgICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChlLmNvZGUpLnRvIGVxKDEpCiAgICAgICAgICMgZW5zdXJlIGl0IGdldHMgc2VyaWFsaXplZCBwcm9wZXJseSwgdGhpcyBpcyB0aGUgcmVhbGx5IGltcG9ydGFudCBwYXJ0Ci0gICAgICAgIHByb3QgPSBCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zIikpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFR5cGVzOjpTVFJJTkcsIDEpIywgInNvbWV0aGluZyBoYXBwZW5lZCIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUeXBlczo6STMyLCAyKSMsIDEpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCisgICAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFucyIpKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpIywgInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikjLCAxKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQogCiAgICAgICAgIGUud3JpdGUocHJvdCkKICAgICAgIGVuZApAQCAtMjY1LDE5ICsyNzIsMTkgQEAKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCB0aGUgcmVndWxhciBpbml0aWFsaXplciBmb3IgZXhjZXB0aW9uIHN0cnVjdHMiIGRvCiAgICAgICBiZWdpbgotICAgICAgICByYWlzZSBYY2VwdGlvbiwgOm1lc3NhZ2UgPT4gInNvbWV0aGluZyBoYXBwZW5lZCIsIDpjb2RlID0+IDUKKyAgICAgICAgcmFpc2UgU3BlY05hbWVzcGFjZTo6WGNlcHRpb24sIDptZXNzYWdlID0+ICJzb21ldGhpbmcgaGFwcGVuZWQiLCA6Y29kZSA9PiA1CiAgICAgICByZXNjdWUgVGhyaWZ0OjpFeGNlcHRpb24gPT4gZQotICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJzb21ldGhpbmcgaGFwcGVuZWQiCi0gICAgICAgIGUuY29kZS5zaG91bGQgPT0gNQotICAgICAgICBwcm90ID0gQmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFucyIpKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUeXBlczo6U1RSSU5HLCAxKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVHlwZXM6OkkzMiwgMikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKKyAgICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChlLmNvZGUpLnRvIGVxKDUpCisgICAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFucyIpKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKIAogICAgICAgICBlLndyaXRlKHByb3QpCiAgICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUzOTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiCkBAIC0wLDAgKzEsMTQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlICdyYWNrL3Rlc3QnCityZXF1aXJlICd0aHJpZnQvc2VydmVyL3RoaW5faHR0cF9zZXJ2ZXInCisKK2Rlc2NyaWJlIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIgZG8KKworICBsZXQoOnByb2Nlc3NvcikgeyBkb3VibGUoJ3Byb2Nlc3NvcicpIH0KKworICBkZXNjcmliZSAiI2luaXRpYWxpemUiIGRvCisKKyAgICBjb250ZXh0ICJ3aGVuIHVzaW5nIHRoZSBkZWZhdWx0cyIgZG8KKworICAgICAgaXQgImJpbmRzIHRvIHBvcnQgODAsIHdpdGggaG9zdCAwLjAuMC4wLCBhIHBhdGggb2YgJy8nIiBkbworICAgICAgICBleHBlY3QoVGhpbjo6U2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoJzAuMC4wLjAnLCA4MCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCisgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKKyAgICAgIGVuZAorCisgICAgICBpdCAnY3JlYXRlcyBhIFRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb25Db250ZXh0JyBkbworICAgICAgICBleHBlY3QoVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uKS50byByZWNlaXZlKDpmb3IpLndpdGgoIi8iLCBwcm9jZXNzb3IsIGFuX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkuYW5kX3JldHVybihhbnl0aGluZykKKyAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJ1c2VzIHRoZSBCaW5hcnlQcm90b2NvbEZhY3RvcnkiIGRvCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCisgICAgICBlbmQKKworICAgIGVuZAorCisgICAgY29udGV4dCAid2hlbiB1c2luZyB0aGUgb3B0aW9ucyIgZG8KKworICAgICAgaXQgJ2FjY2VwdHMgOmlwLCA6cG9ydCwgOnBhdGgnIGRvCisgICAgICAgIGlwID0gIjE5Mi4xNjguMC4xIgorICAgICAgICBwb3J0ID0gMzAwMAorICAgICAgICBwYXRoID0gIi90aGluIgorICAgICAgICBleHBlY3QoVGhpbjo6U2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoaXAsIHBvcnQsIGFuX2luc3RhbmNlX29mKFJhY2s6OkJ1aWxkZXIpKQorICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aXAgPT4gaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6cG9ydCA9PiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOnBhdGggPT4gcGF0aCkKKyAgICAgIGVuZAorCisgICAgICBpdCAnY3JlYXRlcyBhIFRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb25Db250ZXh0IHdpdGggYSBkaWZmZXJlbnQgcHJvdG9jb2wgZmFjdG9yeScgZG8KKyAgICAgICAgZXhwZWN0KFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbikudG8gcmVjZWl2ZSg6Zm9yKS53aXRoKCIvIiwgcHJvY2Vzc29yLCBhbl9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkpKS5hbmRfcmV0dXJuKGFueXRoaW5nKQorICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6cHJvdG9jb2xfZmFjdG9yeSA9PiBUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3KQorICAgICAgZW5kCisKKyAgICBlbmQKKworICBlbmQKKworICBkZXNjcmliZSAiI3NlcnZlIiBkbworCisgICAgaXQgJ3N0YXJ0cyB0aGUgVGhpbiBzZXJ2ZXInIGRvCisgICAgICB1bmRlcmx5aW5nX3RoaW5fc2VydmVyID0gZG91YmxlKCd0aGluIHNlcnZlcicsIDpzdGFydCA9PiB0cnVlKQorICAgICAgYWxsb3coVGhpbjo6U2VydmVyKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odW5kZXJseWluZ190aGluX3NlcnZlcikKKworICAgICAgdGhpbl90aHJpZnRfc2VydmVyID0gVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQorCisgICAgICBleHBlY3QodW5kZXJseWluZ190aGluX3NlcnZlcikudG8gcmVjZWl2ZSg6c3RhcnQpCisgICAgICB0aGluX3RocmlmdF9zZXJ2ZXIuc2VydmUKKyAgICBlbmQKKyAgZW5kCisKK2VuZAorCitkZXNjcmliZSBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24gZG8KKyAgaW5jbHVkZSBSYWNrOjpUZXN0OjpNZXRob2RzCisKKyAgbGV0KDpwcm9jZXNzb3IpIHsgZG91YmxlKCdwcm9jZXNzb3InKSB9CisgIGxldCg6cHJvdG9jb2xfZmFjdG9yeSkgeyBkb3VibGUoJ3Byb3RvY29sIGZhY3RvcnknKSB9CisKKyAgZGVmIGFwcAorICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbi5mb3IoIi8iLCBwcm9jZXNzb3IsIHByb3RvY29sX2ZhY3RvcnkpCisgIGVuZAorCisgIGNvbnRleHQgIjQwNCByZXNwb25zZSIgZG8KKworICAgIGl0ICdyZWNlaXZlcyBhIG5vbi1QT1NUJyBkbworICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorICAgICAgZ2V0ICIvIgorICAgICAgZXhwZWN0KGxhc3RfcmVzcG9uc2Uuc3RhdHVzKS50byBiZSA0MDQKKyAgICBlbmQKKworICAgIGl0ICdyZWNlaXZlcyBhIGhlYWRlciBvdGhlciB0aGFuIGFwcGxpY2F0aW9uL3gtdGhyaWZ0JyBkbworICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24vanNvbiIpCisgICAgICBwb3N0ICIvIgorICAgICAgZXhwZWN0KGxhc3RfcmVzcG9uc2Uuc3RhdHVzKS50byBiZSA0MDQKKyAgICBlbmQKKworICBlbmQKKworICBjb250ZXh0ICIyMDAgcmVzcG9uc2UiIGRvCisKKyAgICBiZWZvcmUgZG8KKyAgICAgIGFsbG93KHByb3RvY29sX2ZhY3RvcnkpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkKKyAgICAgIGFsbG93KHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykKKyAgICBlbmQKKworICAgIGl0ICdjcmVhdGVzIGFuIElPU3RyZWFtVHJhbnNwb3J0JyBkbworICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGUnLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChhbl9pbnN0YW5jZV9vZihSYWNrOjpMaW50OjpJbnB1dFdyYXBwZXIpLCBhbl9pbnN0YW5jZV9vZihSYWNrOjpSZXNwb25zZSkpCisgICAgICBwb3N0ICIvIgorICAgIGVuZAorCisgICAgaXQgJ2ZldGNoZXMgdGhlIHJpZ2h0IHByb3RvY29sIGJhc2VkIG9uIHRoZSBUcmFuc3BvcnQnIGRvCisgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICBleHBlY3QocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS53aXRoKGFuX2luc3RhbmNlX29mKFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQpKQorICAgICAgcG9zdCAiLyIKKyAgICBlbmQKKworICAgIGl0ICdzdGF0dXMgY29kZSAyMDAnIGRvCisgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICBwb3N0ICIvIgorICAgICAgZXhwZWN0KGxhc3RfcmVzcG9uc2Uub2s/KS50byBiZV90cnV0aHkKKyAgICBlbmQKKworICBlbmQKKworZW5kCisKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIgYi9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiCmluZGV4IDc5OTllOTIuLmQ1OTVhYjUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYgpAQCAtMTcsMTAgKzE3LDkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCityZXF1aXJlICdzcGVjX2hlbHBlcicKIAotY2xhc3MgVGhyaWZ0VHlwZXNTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSBUaHJpZnQ6OlR5cGVzIGRvCiAKICAgYmVmb3JlKDplYWNoKSBkbwogICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gdHJ1ZQpAQCAtMzAsODcgKzI5LDkwIEBACiAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBmYWxzZQogICBlbmQKIAotICBkZXNjcmliZSAiVHlwZSBjaGVja2luZyIgZG8KKyAgY29udGV4dCAndHlwZSBjaGVja2luZycgZG8KICAgICBpdCAic2hvdWxkIHJldHVybiB0aGUgcHJvcGVyIG5hbWUgZm9yIGVhY2ggdHlwZSIgZG8KLSAgICAgIFRocmlmdC50eXBlX25hbWUoVHlwZXM6OkkxNikuc2hvdWxkID09ICJUeXBlczo6STE2IgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZShUeXBlczo6Vk9JRCkuc2hvdWxkID09ICJUeXBlczo6Vk9JRCIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoVHlwZXM6OkxJU1QpLnNob3VsZCA9PSAiVHlwZXM6OkxJU1QiCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKDQyKS5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpJMTYpKS50byBlcSgiVHlwZXM6OkkxNiIpCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpWT0lEKSkudG8gZXEoIlR5cGVzOjpWT0lEIikKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OkxJU1QpKS50byBlcSgiVHlwZXM6OkxJU1QiKQorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoNDIpKS50byBiZV9uaWwKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2hlY2sgdHlwZXMgcHJvcGVybHkiIGRvCi0gICAgICAjIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgVHlwZXM6OlNUT1ApIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OlNUT1B9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OlZPSUR9LCAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh0cnVlLCAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpCT09MfSwgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6QllURX0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkkxNn0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6STY0fSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkkzMn0sICAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OkRPVUJMRX0sIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgiMyIsICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQorICAgICAgIyBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1ApIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVE9QfSwgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUodHJ1ZSwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSwgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJNjR9LCAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMy4xNCwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMy4xNCwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoIjMiLCAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgICAgaGVsbG8gPSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKGhlbGxvLCAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKCJmb28iLCAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OlNUUlVDVH0sIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IDF9LCAgICB7OnR5cGUgPT4gVHlwZXM6Ok1BUH0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpNQVB9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgezp0eXBlID0+IFR5cGVzOjpMSVNUfSwgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gMX0sICAgIHs6dHlwZSA9PiBUeXBlczo6TElTVH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwyXSksIHs6dHlwZSA9PiBUeXBlczo6U0VUfSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxLDJdLCAgICAgICAgICB7OnR5cGUgPT4gVHlwZXM6OlNFVH0sICAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IHRydWV9LCB7OnR5cGUgPT4gVHlwZXM6OlNFVH0sICAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKGhlbGxvLCAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNULCA6Y2xhc3MgPT4gU3BlY05hbWVzcGFjZTo6SGVsbG99LCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoImZvbyIsICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1R9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQLCA6a2V5ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCA6dmFsdWUgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR319CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIn0sICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxXSwgICAgICAgICAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IDF9LCAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLDJdKSwgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwyXSwgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiB0cnVlfSwgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGVycm9yIG91dCBpZiBuaWwgaXMgcGFzc2VkIGFuZCBza2lwX3R5cGVzIGlzIGZhbHNlIiBkbwotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OkJPT0x9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6QllURX0sICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpJMTZ9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OkkzMn0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6STY0fSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpET1VCTEV9LCA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OlNUUklOR30sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6U1RSVUNUfSwgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFR5cGVzOjpMSVNUfSwgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVHlwZXM6OlNFVH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUeXBlczo6TUFQfSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNUfSwgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVH0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQfSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNoZWNrIGVsZW1lbnQgdHlwZXMgb24gY29udGFpbmVycyIgZG8KLSAgICAgIGZpZWxkID0gezp0eXBlID0+IFR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVHlwZXM6OkkzMn19Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgMl0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIG5pbCwgMl0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUeXBlczo6TUFQLCA6a2V5ID0+IHs6dHlwZSA9PiBUeXBlczo6STMyfSwgOnZhbHVlID0+IHs6dHlwZSA9PiBUeXBlczo6U1RSSU5HfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgbmlsID0+ICJuaWwifSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHsxID0+IG5pbCwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUeXBlczo6U0VULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVHlwZXM6OkkzMn19Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgbmlsLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyLjMsIDJdKSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKLSAgICAgIAotICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdCwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIDJdLCBmaWVsZCwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxLCBuaWwsIDJdLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUCwgOmtleSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgOnZhbHVlID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCBuaWwgPT4gIm5pbCJ9LCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHsxID0+IG5pbCwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIDJdKSwgZmllbGQsIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCBuaWwsIDJdKSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyLjMsIDJdKSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdCwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIGdpdmUgdGhlIFR5cGVFcnJvciBhIHJlYWRhYmxlIG1lc3NhZ2UiIGRvCi0gICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBmb28iCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCB7OnR5cGUgPT4gVHlwZXM6OlNUUklOR30sIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFR5cGVFcnJvciwgbXNnKQotICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZm9vLmVsZW1lbnQiCi0gICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFR5cGVzOjpTVFJJTkd9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzNdLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yLCBtc2cpCisgICAgaXQgInNob3VsZCBnaXZlIHRoZSBUaHJpZnQ6OlR5cGVFcnJvciBhIHJlYWRhYmxlIG1lc3NhZ2UiIGRvCisgICAgICBtc2cgPSAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZm9vLworICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKKyAgICAgIG1zZyA9IC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBmb28uZWxlbWVudC8KKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzNdLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQogICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpJMzIsIHJlY2VpdmVkIE5pbENsYXNzIGZvciBmaWVsZCBmb28uZWxlbWVudC5rZXkiCi0gICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUeXBlczo6TElTVCwKLSAgICAgICAgICAgICAgIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUeXBlczo6TUFQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDprZXkgPT4gezp0eXBlID0+IFR5cGVzOjpJMzJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVHlwZXM6OkkzMn19fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3tuaWwgPT4gM31dLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yLCBtc2cpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULAorICAgICAgICAgICAgICAgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6a2V5ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbe25pbCA9PiAzfV0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCiAgICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OkkzMiwgcmVjZWl2ZWQgTmlsQ2xhc3MgZm9yIGZpZWxkIGZvby5lbGVtZW50LnZhbHVlIgotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3sxID0+IG5pbH1dLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVHlwZUVycm9yLCBtc2cpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbezEgPT4gbmlsfV0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYgppbmRleCA3MDJlOTIwLi4wY2U2MzA2IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIKQEAgLTE3LDE1NiArMTcsMTc4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWNfaGVscGVyJworcmVxdWlyZSAnc3BlY19oZWxwZXInCiAKLWNsYXNzIFRocmlmdFVuaW9uU3BlYyA8IFNwZWM6OkV4YW1wbGVHcm91cAotICBpbmNsdWRlIFRocmlmdAotICBpbmNsdWRlIFNwZWNOYW1lc3BhY2UKK2Rlc2NyaWJlICdVbmlvbicgZG8KIAotICBkZXNjcmliZSBVbmlvbiBkbworICBkZXNjcmliZSBUaHJpZnQ6OlVuaW9uIGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHZhbHVlIGluIHVuc2V0IHVuaW9uIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IG5pbAotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSBuaWwKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEobmlsKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXQgYSBmaWVsZCBhbmQgYmUgYWNjZXNzaWJsZSB0aHJvdWdoIGdldF92YWx1ZSBhbmQgdGhlIG5hbWVkIGZpZWxkIGFjY2Vzc29yIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CiAgICAgICB1bmlvbi5pbnRlZ2VyMzIgPSAyNQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAyNQotICAgICAgdW5pb24uaW50ZWdlcjMyLnNob3VsZCA9PSAyNQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgyNSkKKyAgICAgIGV4cGVjdCh1bmlvbi5pbnRlZ2VyMzIpLnRvIGVxKDI1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3b3JrIGNvcnJlY3RseSB3aGVuIGluc3RhbnRpYXRlZCB3aXRoIHN0YXRpYyBmaWVsZCBjb25zdHJ1Y3RvcnMiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLmludGVnZXIzMig1KQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uaW50ZWdlcjMyLnNob3VsZCA9PSA1CisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLmludGVnZXIzMig1KQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uaW50ZWdlcjMyKS50byBlcSg1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBmb3Igd3Jvbmcgc2V0IGZpZWxkIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CiAgICAgICB1bmlvbi5pbnRlZ2VyMzIgPSAyNQotICAgICAgbGFtYmRhIHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKICAgICBlbmQKLSAgICAgCisKKyAgICBpdCAic2hvdWxkIHJhaXNlIGZvciB3cm9uZyBzZXQgZmllbGQgd2hlbiBoYXNoIGluaXRpYWxpemVkIGFuZCB0eXBlIGNoZWNraW5nIGlzIG9mZiIgZG8KKyAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KHtpbmNvcnJlY3RfZmllbGQ6IDppbmNvcnJlY3R9KQorICAgICAgZXhhbXBsZSA9IGxhbWJkYSB7IFRocmlmdDo6U2VyaWFsaXplci5uZXcuc2VyaWFsaXplKHVuaW9uKSB9CisgICAgICBleHBlY3QoZXhhbXBsZSkudG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic2V0X2ZpZWxkIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB1bmlvbiEiKQorICAgIGVuZAorCiAgICAgaXQgInNob3VsZCBub3QgYmUgZXF1YWwgdG8gbmlsIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gbmlsCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldworICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEobmlsKQogICAgIGVuZAotICAgICAKKworICAgIGl0ICJzaG91bGQgbm90IGJlIGVxdWFsIHdpdGggYW4gZW1wdHkgU3RyaW5nIiBkbworICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKCcnKQorICAgIGVuZAorCiAgICAgaXQgInNob3VsZCBub3QgZXF1YXRlIHR3byBkaWZmZXJlbnQgdW5pb25zLCBpMzIgdnMuIHN0cmluZyIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOnNvbWVfY2hhcmFjdGVycywgImJsYWghIikKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gb3RoZXJfdW5pb24KKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfY2hhcmFjdGVycywgImJsYWghIikKKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG90aGVyX3VuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcm9wZXJseSByZXNldCBzZXRmaWVsZCBhbmQgc2V0dmFsdWUiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCiAgICAgICB1bmlvbi5zb21lX2NoYXJhY3RlcnMgPSAiYmxhaCEiCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6c29tZV9jaGFyYWN0ZXJzCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09ICJibGFoISIKLSAgICAgIGxhbWJkYSB7IHVuaW9uLmludGVnZXIzMiB9LnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJpbnRlZ2VyMzIgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOnNvbWVfY2hhcmFjdGVycykKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKCJibGFoISIpCisgICAgICBleHBlY3QgeyB1bmlvbi5pbnRlZ2VyMzIgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJpbnRlZ2VyMzIgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBlcXVhdGUgdHdvIGRpZmZlcmVudCB1bmlvbnMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICBvdGhlcl91bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCA0MDApCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDQwMCkKKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG90aGVyX3VuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgZXF1YXRlIHR3byBkaWZmZXJlbnQgdW5pb25zIHdpdGggZGlmZmVyZW50IGZpZWxkcyIgZG8KLSAgICAgIHVuaW9uID0gTXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgb3RoZXJfdW5pb24gPSBNeV91bmlvbi5uZXcoOm90aGVyX2kzMiwgMjUpCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpvdGhlcl9pMzIsIDI1KQorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEob3RoZXJfdW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGluc3BlY3QgcHJvcGVybHkiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIHVuaW9uLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gaW50ZWdlcjMyOiAyNT4iCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIGV4cGVjdCh1bmlvbi5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIGludGVnZXIzMjogMjU+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGFsbG93IHNldHRpbmcgd2l0aCBpbnN0YW5jZV92YXJpYWJsZV9zZXQiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNykKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI3KQogICAgICAgdW5pb24uaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAc29tZV9jaGFyYWN0ZXJzLCAiaGFsbG8hIikKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjcKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKDI3KQorICAgICAgZXhwZWN0IHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0udG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQogICAgIGVuZAogCi0gICAgaXQgInNob3VsZCBzZXJpYWxpemUgY29ycmVjdGx5IiBkbworICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHRvIGJpbmFyeSBjb3JyZWN0bHkiIGRvCiAgICAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldwogICAgICAgcHJvdG8gPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyh0cmFucykKIAotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIHVuaW9uLndyaXRlKHByb3RvKQogCi0gICAgICBvdGhlcl91bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQogICAgICAgb3RoZXJfdW5pb24ucmVhZChwcm90bykKLSAgICAgIG90aGVyX3VuaW9uLnNob3VsZCA9PSB1bmlvbgorICAgICAgZXhwZWN0KG90aGVyX3VuaW9uKS50byBlcSh1bmlvbikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHRvIGpzb24gY29ycmVjdGx5IiBkbworICAgICAgdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICAgIHByb3RvID0gVGhyaWZ0OjpKc29uUHJvdG9jb2wubmV3KHRyYW5zKQorCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIHVuaW9uLndyaXRlKHByb3RvKQorCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKKyAgICAgIG90aGVyX3VuaW9uLnJlYWQocHJvdG8pCisgICAgICBleHBlY3Qob3RoZXJfdW5pb24pLnRvIGVxKHVuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSB3aGVuIHZhbGlkYXRpbmcgdW5zZXQgdW5pb24iIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldwotICAgICAgbGFtYmRhIHsgdW5pb24udmFsaWRhdGUgfS5zaG91bGQgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIlVuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4iKQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnZhbGlkYXRlIH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIlVuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4iKQogCi0gICAgICBvdGhlcl91bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAxKQotICAgICAgbGFtYmRhIHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKKyAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDEpCisgICAgICBleHBlY3QgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB2YWxpZGF0ZSBhbiBlbnVtIGZpZWxkIHByb3Blcmx5IiBkbwotICAgICAgdW5pb24gPSBUZXN0VW5pb24ubmV3KDplbnVtX2ZpZWxkLCAzKQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmVudW1fZmllbGQKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnZhbGlkYXRlIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFByb3RvY29sRXhjZXB0aW9uLCAiSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCBlbnVtX2ZpZWxkISIpCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmVudW1fZmllbGQsIDMpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmVudW1fZmllbGQpCisgICAgICBleHBlY3QgeyB1bmlvbi52YWxpZGF0ZSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICJJbnZhbGlkIHZhbHVlIG9mIGZpZWxkIGVudW1fZmllbGQhIikKIAotICAgICAgb3RoZXJfdW5pb24gPSBUZXN0VW5pb24ubmV3KDplbnVtX2ZpZWxkLCAxKQotICAgICAgbGFtYmRhIHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFByb3RvY29sRXhjZXB0aW9uLCAiSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCBlbnVtX2ZpZWxkISIpCisgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmVudW1fZmllbGQsIDEpCisgICAgICBleHBlY3QgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcm9wZXJseSBzZXJpYWxpemUgYW5kIG1hdGNoIHN0cnVjdHMgd2l0aCBhIHVuaW9uIiBkbwotICAgICAgdW5pb24gPSBNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjYpCi0gICAgICBzd3UgPSBTdHJ1Y3Rfd2l0aF91bmlvbi5uZXcoOmZ1bl91bmlvbiA9PiB1bmlvbikKKyAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI2KQorICAgICAgc3d1ID0gU3BlY05hbWVzcGFjZTo6U3RydWN0X3dpdGhfdW5pb24ubmV3KDpmdW5fdW5pb24gPT4gdW5pb24pCiAKICAgICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgICBwcm90byA9IFRocmlmdDo6Q29tcGFjdFByb3RvY29sLm5ldyh0cmFucykKIAogICAgICAgc3d1LndyaXRlKHByb3RvKQogCi0gICAgICBvdGhlcl91bmlvbiA9IE15X3VuaW9uLm5ldyg6c29tZV9jaGFyYWN0ZXJzLCAiaGVsbG8gdGhlcmUiKQotICAgICAgc3d1MiA9IFN0cnVjdF93aXRoX3VuaW9uLm5ldyg6ZnVuX3VuaW9uID0+IG90aGVyX3VuaW9uKQorICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfY2hhcmFjdGVycywgImhlbGxvIHRoZXJlIikKKyAgICAgIHN3dTIgPSBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3Rfd2l0aF91bmlvbi5uZXcoOmZ1bl91bmlvbiA9PiBvdGhlcl91bmlvbikKIAotICAgICAgc3d1Mi5zaG91bGRfbm90ID09IHN3dQorICAgICAgZXhwZWN0KHN3dTIpLm5vdF90byBlcShzd3UpCiAKICAgICAgIHN3dTIucmVhZChwcm90bykKLSAgICAgIHN3dTIuc2hvdWxkID09IHN3dQorICAgICAgZXhwZWN0KHN3dTIpLnRvIGVxKHN3dSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBvbGQgc3R5bGUgY29uc3RydWN0b3IiIGRvCi0gICAgICB1bmlvbiA9IE15X3VuaW9uLm5ldyg6aW50ZWdlcjMyID0+IDI2KQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAyNgorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiA9PiAyNikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjYpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvciB3aGVuIGluc3BlY3RlZCBhbmQgdW5zZXQiIGRvCi0gICAgICBsYW1iZGF7VGVzdFVuaW9uLm5ldygpLmluc3BlY3R9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdHtTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KCkuaW5zcGVjdH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByaW50IGVudW0gdmFsdWUgbmFtZSB3aGVuIGluc3BlY3RlZCIgZG8KLSAgICAgIE15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNvbWVFbnVtOjpPTkUpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gc29tZV9lbnVtOiBPTkUgKDApPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIHNvbWVfZW51bTogT05FICgwKT4iKQogCi0gICAgICBNeV91bmlvbi5uZXcoOm15X21hcCA9PiB7U29tZUVudW06Ok9ORSA9PiBbU29tZUVudW06OlRXT119KS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIG15X21hcDoge09ORSAoMCk6IFtUV08gKDEpXX0+IiAKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOm15X21hcCA9PiB7U3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSA9PiBbU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXT119KS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIG15X21hcDoge09ORSAoMCk6IFtUV08gKDEpXX0+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb2ZmZXIgZmllbGQ/IG1ldGhvZHMiIGRvCi0gICAgICBNeV91bmlvbi5uZXcuc29tZV9lbnVtPy5zaG91bGQgYmVfZmFsc2UKLSAgICAgIE15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNvbWVFbnVtOjpPTkUpLnNvbWVfZW51bT8uc2hvdWxkIGJlX3RydWUKLSAgICAgIE15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiBmYWxzZSkuaW1fdHJ1ZT8uc2hvdWxkIGJlX3RydWUKLSAgICAgIE15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiB0cnVlKS5pbV90cnVlPy5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldy5zb21lX2VudW0/KS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5zb21lX2VudW0/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gZmFsc2UpLmltX3RydWU/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gdHJ1ZSkuaW1fdHJ1ZT8pLnRvIGJlX3RydXRoeQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmV0dHkgcHJpbnQgYmluYXJ5IGZpZWxkcyIgZG8KLSAgICAgIFRlc3RVbmlvbi5uZXcoOmJpbmFyeV9maWVsZCA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24gYmluYXJ5X2ZpZWxkOiAwMTAyMDM+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmJpbmFyeV9maWVsZCA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24gYmluYXJ5X2ZpZWxkOiAwMTAyMDM+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgY29tcGFyYWJsZSIgZG8KQEAgLTE3NywxNSArMTk5LDE1IEBACiAgICAgICAgIFsxLCAgIDEsICAxLCAgMF1dCiAKICAgICAgIG9ianMgPSBbCi0gICAgICAgIFRlc3RVbmlvbi5uZXcoOnN0cmluZ19maWVsZCwgImJsYWgiKSwgCi0gICAgICAgIFRlc3RVbmlvbi5uZXcoOnN0cmluZ19maWVsZCwgImJsYWhibGFoIiksCi0gICAgICAgIFRlc3RVbmlvbi5uZXcoOmkzMl9maWVsZCwgMSksCi0gICAgICAgIFRlc3RVbmlvbi5uZXcoKV0KKyAgICAgICAgU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6c3RyaW5nX2ZpZWxkLCAiYmxhaCIpLAorICAgICAgICBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDpzdHJpbmdfZmllbGQsICJibGFoYmxhaCIpLAorICAgICAgICBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDppMzJfZmllbGQsIDEpLAorICAgICAgICBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KCldCiAKICAgICAgIGZvciB5IGluIDAuLjMKICAgICAgICAgZm9yIHggaW4gMC4uMwogICAgICAgICAgICMgcHV0cyAiI3tvYmpzW3ldLmluc3BlY3R9IDw9PiAje29ianNbeF0uaW5zcGVjdH0gc2hvdWxkID09ICN7cmVsYXRpb25zaGlwc1t5XVt4XX0iCi0gICAgICAgICAgKG9ianNbeV0gPD0+IG9ianNbeF0pLnNob3VsZCA9PSByZWxhdGlvbnNoaXBzW3ldW3hdCisgICAgICAgICAgZXhwZWN0KG9ianNbeV0gPD0+IG9ianNbeF0pLnRvIGVxKHJlbGF0aW9uc2hpcHNbeV1beF0pCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgppbmRleCBkZjIzOWQ3Li44NjIzZTk1IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIKQEAgLTE3LDkyICsxNywxMDAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvc3BlY19oZWxwZXInCi1yZXF1aXJlIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAiL3NvY2tldF9zcGVjX3NoYXJlZCIKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L3NvY2tldF9zcGVjX3NoYXJlZCIpCiAKLWNsYXNzIFRocmlmdFVOSVhTb2NrZXRTcGVjIDwgU3BlYzo6RXhhbXBsZUdyb3VwCi0gIGluY2x1ZGUgVGhyaWZ0CitkZXNjcmliZSAnVU5JWFNvY2tldCcgZG8KIAotICBkZXNjcmliZSBVTklYU29ja2V0IGRvCisgIGRlc2NyaWJlIFRocmlmdDo6VU5JWFNvY2tldCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICAgIEBwYXRoID0gJy90bXAvdGhyaWZ0X3NwZWNfc29ja2V0JwotICAgICAgQHNvY2tldCA9IFVOSVhTb2NrZXQubmV3KEBwYXRoKQotICAgICAgQGhhbmRsZSA9IG1vY2soIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICA6OlVOSVhTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgQHNvY2tldCA9IFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgpCisgICAgICBAaGFuZGxlID0gZG91YmxlKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKICAgICBlbmQKIAogICAgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAiYSBzb2NrZXQiCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGEgVHJhbnNwb3J0RXhjZXB0aW9uIHdoZW4gaXQgY2Fubm90IG9wZW4gYSBzb2NrZXQiIGRvCi0gICAgICA6OlVOSVhTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgICBsYW1iZGEgeyBAc29ja2V0Lm9wZW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOIH0KKyAgICAgIGV4cGVjdCg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgICBleHBlY3QgeyBAc29ja2V0Lm9wZW4gfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCB0aW1lb3V0IiBkbwotICAgICAgOjpVTklYU29ja2V0LnN0dWIhKDpuZXcpCi0gICAgICBVTklYU29ja2V0Lm5ldyhAcGF0aCwgNSkudGltZW91dC5zaG91bGQgPT0gNQorICAgICAgYWxsb3coOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCwgNSkudGltZW91dCkudG8gZXEoNSkKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBhbGxvdyg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoKS50b19zKS50byBlcSgiZG9tYWluKCN7QHBhdGh9KSIpCiAgICAgZW5kCiAgIGVuZAogCi0gIGRlc2NyaWJlIFVOSVhTZXJ2ZXJTb2NrZXQgZG8KKyAgZGVzY3JpYmUgVGhyaWZ0OjpVTklYU2VydmVyU29ja2V0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQHBhdGggPSAnL3RtcC90aHJpZnRfc3BlY19zb2NrZXQnCi0gICAgICBAc29ja2V0ID0gVU5JWFNlcnZlclNvY2tldC5uZXcoQHBhdGgpCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpVTklYU2VydmVyU29ja2V0Lm5ldyhAcGF0aCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgaGFuZGxlIHdoZW4gY2FsbGluZyBsaXN0ZW4iIGRvCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKQogICAgICAgQHNvY2tldC5saXN0ZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgVGhyaWZ0OjpVTklYU29ja2V0IHRvIHdyYXAgYWNjZXB0ZWQgc29ja2V0cyIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiKQotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBzb2NrID0gbW9jaygic29jayIpCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQotICAgICAgdHJhbnMgPSBtb2NrKCJVTklYU29ja2V0IikKLSAgICAgIFVOSVhTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgPT0gdHJhbnMKKyAgICAgIHNvY2sgPSBkb3VibGUoInNvY2siKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCisgICAgICB0cmFucyA9IGRvdWJsZSgiVU5JWFNvY2tldCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gZXEodHJhbnMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSBoYW5kbGUgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgRmlsZS5zdHViISg6ZGVsZXRlKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhGaWxlKS50byByZWNlaXZlKDpkZWxldGUpCiAgICAgICBAc29ja2V0LmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGRlbGV0ZSB0aGUgc29ja2V0IHdoZW4gY2xvc2VkIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKLSAgICAgIEZpbGUuc2hvdWxkX3JlY2VpdmUoOmRlbGV0ZSkud2l0aChAcGF0aCkKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoRmlsZSkudG8gcmVjZWl2ZSg6ZGVsZXRlKS53aXRoKEBwYXRoKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHdoZW4gYWNjZXB0aW5nIGlmIHRoZXJlIGlzIG5vIGhhbmRsZSIgZG8KLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiB0cnVlIGZvciBjbG9zZWQ/IHdoZW4gYXBwcm9wcmlhdGUiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBVTklYU2VydmVyLnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQotICAgICAgRmlsZS5zdHViISg6ZGVsZXRlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgYWxsb3coRmlsZSkudG8gcmVjZWl2ZSg6ZGVsZXRlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2UpCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNvY2tldC50b19zKS50byBlcSgiZG9tYWluKCN7QHBhdGh9KSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvdGhyaWZ0LmdlbXNwZWMgYi9saWIvcmIvdGhyaWZ0LmdlbXNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzMTk0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYwpAQCAtMCwwICsxLDQwIEBACisjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCiskOi5wdXNoIEZpbGUuZXhwYW5kX3BhdGgoIi4uL2xpYiIsIF9fRklMRV9fKQorCitHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAorICBzLm5hbWUgICAgICAgID0gJ3RocmlmdCcKKyAgcy52ZXJzaW9uICAgICA9ICcxLjAuMCcKKyAgcy5hdXRob3JzICAgICA9IFsnQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJ10KKyAgcy5lbWFpbCAgICAgICA9IFsnZGV2QHRocmlmdC5hcGFjaGUub3JnJ10KKyAgcy5ob21lcGFnZSAgICA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnCisgIHMuc3VtbWFyeSAgICAgPSAlcXtSdWJ5IGJpbmRpbmdzIGZvciBBcGFjaGUgVGhyaWZ0fQorICBzLmRlc2NyaXB0aW9uID0gJXF7UnVieSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbX0KKyAgcy5saWNlbnNlICAgICA9ICdBcGFjaGUtMi4wJworICBzLmV4dGVuc2lvbnMgID0gWydleHQvZXh0Y29uZi5yYiddCisKKyAgcy5oYXNfcmRvYyAgICAgID0gdHJ1ZQorICBzLnJkb2Nfb3B0aW9ucyAgPSAld1stLWxpbmUtbnVtYmVycyAtLWlubGluZS1zb3VyY2UgLS10aXRsZSBUaHJpZnQgLS1tYWluIFJFQURNRV0KKworICBzLnJ1Ynlmb3JnZV9wcm9qZWN0ID0gJ3RocmlmdCcKKworICBkaXIgPSBGaWxlLmV4cGFuZF9wYXRoKEZpbGUuZGlybmFtZShfX0ZJTEVfXykpCisKKyAgcy5maWxlcyA9IERpci5nbG9iKCJ7bGliLHNwZWN9LyoqLyoiKQorICBzLnRlc3RfZmlsZXMgPSBEaXIuZ2xvYigie3Rlc3Qsc3BlYyxiZW5jaG1hcmt9LyoqLyoiKQorICBzLmV4ZWN1dGFibGVzID0gIERpci5nbG9iKCJ7YmlufS8qKi8qIikKKworICBzLmV4dHJhX3Jkb2NfZmlsZXMgID0gJXdbUkVBRE1FLm1kXSArIERpci5nbG9iKCJ7ZXh0LGxpYn0vKiovKi57YyxoLHJifSIpCisKKyAgcy5yZXF1aXJlX3BhdGhzID0gJXdbbGliIGV4dF0KKworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdidW5kbGVyJywgICAgICAgICAgICAnfj4gMS4xMScKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncHJ5JywgICAgICAgICAgICAgICAgJ34+IDAuMTEuMycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncHJ5LWJ5ZWJ1ZycsICAgICAgICAgJ34+IDMuNicKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncHJ5LXN0YWNrX2V4cGxvcmVyJywgJ34+IDAuNC45LjInCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JhY2snLCAgICAgICAgICAgICAgICd+PiAyLjAnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JhY2stdGVzdCcsICAgICAgICAgICd+PiAwLjguMycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFrZScsICAgICAgICAgICAgICAgJ34+IDEyLjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JzcGVjJywgICAgICAgICAgICAgICd+PiAzLjcnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3RoaW4nLCAgICAgICAgICAgICAgICd+PiAxLjcnCitlbmQKKwpkaWZmIC0tZ2l0IGEvbGliL3JzL0NhcmdvLnRvbWwgYi9saWIvcnMvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDMyMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxOSBAQAorW3BhY2thZ2VdCituYW1lID0gInRocmlmdCIKK2Rlc2NyaXB0aW9uID0gIlJ1c3QgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iCit2ZXJzaW9uID0gIjEuMC4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK2hvbWVwYWdlID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKK2RvY3VtZW50YXRpb24gPSAiaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZyIKK3JlYWRtZSA9ICJSRUFETUUubWQiCitleGNsdWRlID0gWyJNYWtlZmlsZSoiLCAidGVzdC8qKiIsICIqLmltbCJdCitrZXl3b3JkcyA9IFsidGhyaWZ0Il0KKworW2RlcGVuZGVuY2llc10KK2J5dGVvcmRlciA9ICJ+MS4yLjEiCitpbnRlZ2VyLWVuY29kaW5nID0gIn4xLjAuNCIKK2xvZyA9ICJ+MC4zLjgiCit0aHJlYWRwb29sID0gIn4xLjcuMSIKK3RyeV9mcm9tID0gIn4wLjIuMiIKKwpkaWZmIC0tZ2l0IGEvbGliL3JzL01ha2VmaWxlLmFtIGIvbGliL3JzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzQxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworaW5zdGFsbDoKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICdUaGUgUnVzdCBjbGllbnQgbGlicmFyeSBzaG91bGQgYmUgaW5zdGFsbGVkIHZpYSBhIENhcmdvLnRvbWwgZGVwZW5kZW5jeSAtIHBsZWFzZSBzZWUgL2xpYi9ycy9SRUFETUUubWQnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKworY2hlY2stbG9jYWw6CisJJChDQVJHTykgdGVzdAorCithbGwtbG9jYWw6CisJJChDQVJHTykgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCitFWFRSQV9ESVNUID0gXAorCXNyYyBcCisJQ2FyZ28udG9tbCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvcnMvUkVBRE1FLm1kIGIvbGliL3JzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM3YTEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL1JFQURNRS5tZApAQCAtMCwwICsxLDExMSBAQAorIyBSdXN0IFRocmlmdCBsaWJyYXJ5CisKKyMjIE92ZXJ2aWV3CisKK1RoaXMgY3JhdGUgaW1wbGVtZW50cyB0aGUgY29tcG9uZW50cyByZXF1aXJlZCB0byBidWlsZCBhIHdvcmtpbmcgVGhyaWZ0IHNlcnZlcgorYW5kIGNsaWVudC4gSXQgaXMgZGl2aWRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoKKworIDEuIGVycm9ycworIDIuIHByb3RvY29sCisgMy4gdHJhbnNwb3J0CisgNC4gc2VydmVyCisgNS4gYXV0b2dlbgorCitUaGUgbW9kdWxlcyBhcmUgbGF5ZXJlZCBhcyBzaG93bi4gVGhlIGBnZW5lcmF0ZWRgIGxheWVyIGlzIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZQorVGhyaWZ0IGNvbXBpbGVyJ3MgUnVzdCBwbHVnaW4uIEl0IHVzZXMgdGhlIGNvbXBvbmVudHMgZGVmaW5lZCBpbiB0aGlzIGNyYXRlIHRvCitzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHR5cGVzIGFuZCBpbXBsZW1lbnQgUlBDLiBVc2VycyBpbnRlcmFjdCB3aXRoIHRoZXNlCit0eXBlcyBhbmQgc2VydmljZXMgYnkgd3JpdGluZyB0aGVpciBvd24gY29kZSBvbiB0b3AuCisKKyBgYGB0ZXh0CisgKy0tLS0tLS0tLS0tKworIHwgIGFwcCBkZXYgIHwKKyArLS0tLS0tLS0tLS0rCisgfCBnZW5lcmF0ZWQgfCA8LT4gZXJyb3JzL3Jlc3VsdHMKKyArLS0tLS0tLS0tLS0rCisgfCAgcHJvdG9jb2wgfAorICstLS0tLS0tLS0tLSsKKyB8IHRyYW5zcG9ydCB8CisgKy0tLS0tLS0tLS0tKworIGBgYAorCisjIyBVc2luZyB0aGlzIGNyYXRlCisKK0FkZCBgdGhyaWZ0ID0gIngueS56ImAgdG8geW91ciBgQ2FyZ28udG9tbGAsIHdoZXJlIGB4LnkuemAgaXMgdGhlIHZlcnNpb24gb2YgdGhlCitUaHJpZnQgY29tcGlsZXIgeW91J3JlIHVzaW5nLgorCisjIyBBUEkgRG9jdW1lbnRhdGlvbgorCitGdWxsIFtSdXN0ZG9jXShodHRwczovL2RvY3MucnMvdGhyaWZ0LykKKworIyMgQ29tcGF0aWJpbGl0eQorCitUaGUgUnVzdCBsaWJyYXJ5IGFuZCBhdXRvLWdlbmVyYXRlZCBjb2RlIHRhcmdldHMgUnVzdCB2ZXJzaW9ucyAxLjI4Ky4KK0l0IGRvZXMgbm90IGN1cnJlbnRseSB1c2UgYW55IFJ1c3QgMjAxOCBmZWF0dXJlcy4KKworIyMjIEJyZWFraW5nIENoYW5nZXMKKworQnJlYWtpbmcgY2hhbmdlcyBhcmUgbWluaW1pemVkLiBXaGVuIHRoZXkgYXJlIG1hZGUgdGhleSB3aWxsIGJlIG91dGxpbmVkIGJlbG93IHdpdGggdHJhbnNpdGlvbiBndWlkZWxpbmVzLgorCisjIyMjIyBUaHJpZnQgMC4xMi4wCisKKyogKipbVEhSSUZULTQ1MjldKiogLSBSdXN0IGVudW0gdmFyaWFudHMgYXJlIG5vdyBjYW1lbC1jYXNlZCBpbnN0ZWFkIG9mIHVwcGVyY2FzZWQgdG8gY29uZm9ybSB0byBSdXN0IG5hbWluZyBjb252ZW50aW9ucworCisgICAgUHJldmlvdXNseSwgZW51bSB2YXJpYW50cyB3ZXJlIHVwcGVyY2FzZWQgaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGNvZGUuCisgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdGhyaWZ0IGVudW06CisKKyAgICBgYGB0aHJpZnQKKyAgICAvLyBUSFJJRlQKKyAgICBlbnVtIE9wZXJhdGlvbiB7CisgICAgICBBREQsCisgICAgICBTVUJUUkFDVCwKKyAgICAgIE1VTFRJUExZLAorICAgICAgRElWSURFLAorICAgIH0KKyAgICBgYGAKKyAgICAKKyAgICB1c2VkIHRvIGdlbmVyYXRlOgorICAgIAorICAgIGBgYHJ1c3QKKyAgICAvLyBPTEQgQVVUTy1HRU5FUkFURUQgUlVTVAorICAgIHB1YiBlbnVtIE9wZXJhdGlvbiB7CisgICAgICAgQURELAorICAgICAgIFNVQlRSQUNULAorICAgICAgIE1VTFRJUExZLAorICAgICAgIERJVklERSwKKyAgICAgfQorICAgIGBgYAorICAgIEl0ICpub3cqIGdlbmVyYXRlczoKKyAgICBgYGBydXN0CisgICAgLy8gTkVXIEFVVE8tR0VORVJBVEVEIFJVU1QKKyAgICBwdWIgZW51bSBPcGVyYXRpb24geworICAgICAgIEFkZCwKKyAgICAgICBTdWJ0cmFjdCwKKyAgICAgICBNdWx0aXBseSwKKyAgICAgICBEaXZpZGUsCisgICAgIH0KKyAgICBgYGAKKyAgICAKKyAgICBZb3Ugd2lsbCBoYXZlIHRvIGNoYW5nZSBhbGwgZW51bSB2YXJpYW50cyBpbiB5b3VyIGNvZGUgdG8gdXNlIGNhbWVsLWNhc2VkIG5hbWVzLgorICAgIFRoaXMgc2hvdWxkIGJlIGEgc2VhcmNoIGFuZCByZXBsYWNlLgorCisjIyBDb250cmlidXRpbmcKKworQnVnIHJlcG9ydHMgYW5kIFBScyBhcmUgYWx3YXlzIHdlbGNvbWUhIFBsZWFzZSBzZWUgdGhlCitbVGhyaWZ0IHdlYnNpdGVdKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvKSBmb3IgbW9yZSBkZXRhaWxzLgorCitUaHJpZnQgUnVzdCBzdXBwb3J0IHJlcXVpcmVzIGNvZGUgaW4gc2V2ZXJhbCBkaXJlY3RvcmllczoKKworKiBgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2NgOiBiaW5kaW5nIGNvZGUgZ2VuZXJhdG9yCisqIGBsaWIvcnNgOiBydW50aW1lIGxpYnJhcnkKKyogYGxpYi9ycy90ZXN0YDogc3VwcGxlbWVudGFsIHRlc3RzCisqIGB0dXRvcmlhbC9yc2A6IHR1dG9yaWFsIGNsaWVudCBhbmQgc2VydmVyCisqIGB0ZXN0L3JzYDogY3Jvc3MtbGFuZ3VhZ2UgdGVzdCBjbGllbnQgYW5kIHNlcnZlcgorCitBbGwgbGlicmFyeSBjb2RlLCB0ZXN0IGNvZGUgYW5kIGF1dG8tZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMgYW5kIHBhc3NlcyBjbGlwcHkKK3dpdGhvdXQgd2FybmluZ3MuIEFsbCBuZXcgY29kZSBtdXN0IGRvIHRoZSBzYW1lISBXaGVuIG1ha2luZyBjaGFuZ2VzIGVuc3VyZSB0aGF0OgorCisqIGBydXN0Y2AgZG9lcyBkb2VzIG91dHB1dCBhbnkgd2FybmluZ3MKKyogYGNsaXBweWAgd2l0aCBkZWZhdWx0IHNldHRpbmdzIGRvZXMgbm90IG91dHB1dCBhbnkgd2FybmluZ3MgKGluY2x1ZGVzIGF1dG8tZ2VuZXJhdGVkIGNvZGUpCisqIGBjYXJnbyB0ZXN0YCBpcyBzdWNjZXNzZnVsCisqIGBtYWtlIHByZWNyb3NzYCBhbmQgYG1ha2UgY2hlY2tgIGFyZSBzdWNjZXNzZnVsCisqIGB0dXRvcmlhbC9iaW4vdHV0b3JpYWxfY2xpZW50YCBhbmQgYHR1dG9yaWFsL2Jpbi90dXRvcmlhbF9zZXJ2ZXJgIGNvbW11bmljYXRlCmRpZmYgLS1naXQgYS9saWIvcnMvUkVMRUFTSU5HLm1kIGIvbGliL3JzL1JFTEVBU0lORy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzNkN2EwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL1JFTEVBU0lORy5tZApAQCAtMCwwICsxLDU3IEBACisjIFB1Ymxpc2hpbmcgdGhlIHRocmlmdCBjcmF0ZQorCitQdWJsaXNoaW5nIHRoZSBSdXN0IHRocmlmdCBjcmF0ZSBpcyBzdHJhaWdodGZvcndhcmQsIGFuZCBpbnZvbHZlcyB0d28gbWFqb3Igc3RlcHM6CisKKzEuIFNldHRpbmcgdXAgeW91ciBbY3JhdGVzLmlvXShodHRwczovL3d3dy5jcmF0ZXMuaW8pIGFjY291bnQgXyhvbmUtdGltZSlfCisKKzIuIFBhY2thZ2luZy9wdWJsaXNoaW5nIHRoZSBSdXN0IHRocmlmdCBjcmF0ZSBpdHNlbGYKKworIyMgU2V0IHVwIHlvdXIgY3JhdGVzLmlvIGFjY291bnQgKG9uZS10aW1lKQorCisxLiBHbyB0byBbY3JhdGVzLmlvXShodHRwczovL3d3dy5jcmF0ZXMuaW8pIGFuZCBjbGljayB0aGUgYExvZyBJbmAgYnV0dG9uIGF0IHRoZSB0b3AgcmlnaHQuCisKKyAgIExvZyBpbiAqKmFzIHRoZSBHaXRodWIgdXNlciB3aXRoIHdyaXRlIHBlcm1pc3Npb25zIHRvIHRoZSB0aHJpZnQgcmVwbyEqKgorCisyLiBDbGljayB5b3VyIHVzZXIgaWNvbiBidXR0b24gYXQgdGhlIHRvcCByaWdodCBhbmQgc2VsZWN0IGBBY2NvdW50IFNldHRpbmdzYC4KKworMy4gQ2xpY2sgYE5ldyBUb2tlbmAgbmV4dCB0byBgQVBJIEFjY2Vzc2AuCisKKyAgIFRoaXMgZ2VuZXJhdGVzIGEgbmV3IEFQSSBrZXkgdGhhdCBjYXJnbyB1c2VzIHRvIHB1Ymxpc2ggcGFja2FnZXMgdG8gY3JhdGVzLmlvLgorICAgU3RvcmUgdGhpcyBBUEkga2V5IHNvbWV3aGVyZSBzYWZlLiBJZiB5b3Ugd2lsbCBvbmx5IHVzZSB0aGlzIEdpdGh1YiBhY2NvdW50IHRvCisgICBwdWJsaXNoIGNyYXRlcyB0byBjcmF0ZXMuaW8geW91IGNhbiBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBzYXZlIHRoZQorICAgZ2VuZXJhdGVkIGtleSB0byBgfi8uY2FyZ28vY3JlZGVudGlhbHNgLgorCisjIyBQYWNrYWdlIGFuZCBQdWJsaXNoCisKK1lvdSBjYW4gdXNlIHRoZSBhdXRvbWF0ZWQgc2NyaXB0IG9yIHJ1biB0aGUgcmVsZWFzZSBzdGVwcyBtYW51YWxseS4KKworKipJbXBvcnRhbnQqKjogYGNhcmdvYCBleHBlY3RzIHRoYXQgdmVyc2lvbiBudW1iZXJzIGZvbGxvdyB0aGUgc2VtYW50aWMgdmVyc2lvbmluZyBmb3JtYXQuCitUaGlzIG1lYW5zIHRoYXQgYFRIUklGVF9SRUxFQVNFX1ZFUlNJT05gIG11c3QgaGF2ZSBhIG1ham9yLCBtaW5vciBhbmQgcGF0Y2ggbnVtYmVyLCBpLmUuLCBtdXN0CitiZSBpbiB0aGUgZm9ybSBgIy4jIy4jI2AuCisKKyMjIyMgQXV0b21hdGVkCisKK1J1biBgLi9yZWxlYXNlLnNoIFtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OXWAuCisKK19SZXF1aXJlcyB5b3UgdG8gaGF2ZSBzdG9yZWQgeW91ciBjcmVkZW50aWFscyBpbiBgfi8uY2FyZ28vY3JlZGVudGlhbHNgLl8KKworIyMjIyBNYW51YWwKKworMS4gRWRpdCBgQ2FyZ28udG9tbGAgYW5kIHVwZGF0ZSB0aGUgYHZlcnNpb24gPSAxLjBgIGtleSB0byBgdmVyc2lvbiA9IFtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OXWAKKworMi4gYGdpdCBhZGQgQ2FyZ28udG9tbGAKKworMy4gYGdpdCBjb21taXQgLW0gIlVwZGF0ZSB0aHJpZnQgY3JhdGUgdmVyc2lvbiB0byBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl0iIC1tICJDbGllbnQ6IHJzImAKKworNC4gYGNhcmdvIGxvZ2luYAorCisgICAgXyhub3QgcmVxdWlyZWQgaWYgeW91IGhhdmUgc3RvcmVkIHlvdXIgY3JlZGVudGlhbHMgaW4gYH4vLmNhcmdvL2NyZWRlbnRpYWxzYClfCisKKzUuIGBjYXJnbyBjbGVhbmAKKworNi4gYGNhcmdvIHBhY2thZ2VgCisKKyAgIFRoaXMgc3RlcCBmYWlscyBpZiB0aGVyZSBhcmUgYW55IHVuY29tbWl0dGVkIG9yIGlnbm9yZWQgZmlsZXMuIERvICoqbm90KiogdXNlIHRoZSBgLS1hbGxvdy1kaXJ0eWAKKyAgIGZsYWchIEluc3RlYWQsIGFkZCB0aGUgaGlnaGxpZ2h0ZWQgZmlsZXMgYXMgZW50cmllcyBpbiB0aGUgYENhcmdvLnRvbWxgIGBleGNsdWRlYCBrZXkuCisKKzcuIGBjYXJnbyBwdWJsaXNoYApkaWZmIC0tZ2l0IGEvbGliL3JzL3JlbGVhc2Uuc2ggYi9saWIvcnMvcmVsZWFzZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNGU1YjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3JlbGVhc2Uuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvYmluL2Jhc2gKKworc2V0IC1vIGVycmV4aXQKK3NldCAtbyBwaXBlZmFpbAorc2V0IC1vIG5vdW5zZXQKKworaWYgISBbWyAkIyAtZXEgMSAmJiAkMSA9fiBeWzAtOV0oXC5bMC05XVswLTldKil7Mn0kIF1dOyB0aGVuCisgICAgKD4mMiBlY2hvICJVc2FnZTogLi9wdWJsaXNoLWNyYXRlLnNoIFtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OXSAiKQorICAgICg+JjIgZWNobyAiICAgICAgIFRIUklGVF9SRUxFQVNFX1ZFUlNJT04gaXMgaW4gc2VtYW50aWMgdmVyc2lvbmluZyBmb3JtYXQsIGkuZS4gIy4jIy4jIyIpCisgICAgZXhpdCAxCitmaQorCitUSFJJRlRfUkVMRUFTRV9WRVJTSU9OPSR7MTotfQorCitlY2hvICJVcGRhdGluZyBDYXJnby50b21sIHRvICR7VEhSSUZUX1JFTEVBU0VfVkVSU0lPTn0iCitzZWQgLWkub2xkIC1lICJzL152ZXJzaW9uID0gLiokL3ZlcnNpb24gPSBcIiR7VEhSSUZUX1JFTEVBU0VfVkVSU0lPTn1cIi9nIiBDYXJnby50b21sCitybSBDYXJnby50b21sLm9sZAorCitlY2hvICJDb21taXR0aW5nIHVwZGF0ZWQgQ2FyZ28udG9tbCIKK2dpdCBhZGQgQ2FyZ28udG9tbAorZ2l0IGNvbW1pdCAtbSAiVXBkYXRlIHRocmlmdCBjcmF0ZSB2ZXJzaW9uIHRvICR7VEhSSUZUX1JFTEVBU0VfVkVSU0lPTn0iIC1tICJDbGllbnQ6IHJzIgorCitlY2hvICJQYWNrYWdpbmcgYW5kIHJlbGVhc2luZyBydXN0IHRocmlmdCBjcmF0ZSB3aXRoIHZlcnNpb24gJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfSIKK2NhcmdvIGNsZWFuCitjYXJnbyBwYWNrYWdlCitjYXJnbyBwdWJsaXNoCmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL2F1dG9nZW4ucnMgYi9saWIvcnMvc3JjL2F1dG9nZW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkNDA4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvYXV0b2dlbi5ycwpAQCAtMCwwICsxLDQ1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUaHJpZnQgY29tcGlsZXIgYXV0by1nZW5lcmF0ZWQgc3VwcG9ydC4KKy8vIQorLy8hCisvLyEgVHlwZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFRocmlmdCBjb21waWxlcidzIFJ1c3QgcGx1Z2luCisvLyEgdG8gaW1wbGVtZW50IHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkuIFVzZXJzIHNob3VsZCBuZXZlciBoYXZlIHRvIHVzZSBjb2RlCisvLyEgaW4gdGhpcyBtb2R1bGUgZGlyZWN0bHkuCisKK3VzZSBwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworCisvLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGZ1bmN0aW9uYWxpdHkgYW4gYXV0by1nZW5lcmF0ZWQgY2xpZW50IHNob3VsZCBwcm92aWRlCisvLy8gdG8gY29tbXVuaWNhdGUgd2l0aCBhIFRocmlmdCBzZXJ2ZXIuCitwdWIgdHJhaXQgVFRocmlmdENsaWVudCB7CisgICAgLy8vIFJldHVybnMgdGhlIGlucHV0IHByb3RvY29sIHVzZWQgdG8gcmVhZCBzZXJpYWxpemVkIFRocmlmdCBtZXNzYWdlcworICAgIC8vLyBmcm9tIHRoZSBUaHJpZnQgc2VydmVyLgorICAgIGZuIGlfcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRJbnB1dFByb3RvY29sOworICAgIC8vLyBSZXR1cm5zIHRoZSBvdXRwdXQgcHJvdG9jb2wgdXNlZCB0byB3cml0ZSBzZXJpYWxpemVkIFRocmlmdCBtZXNzYWdlcworICAgIC8vLyB0byB0aGUgVGhyaWZ0IHNlcnZlci4KKyAgICBmbiBvX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUT3V0cHV0UHJvdG9jb2w7CisgICAgLy8vIFJldHVybnMgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbGFzdCBtZXNzYWdlIHdyaXR0ZW4gdG8gdGhlIFRocmlmdAorICAgIC8vLyBzZXJ2ZXIuIFJldHVybnMgYDBgIGlmIG5vIG1lc3NhZ2VzIGhhdmUgYmVlbiB3cml0dGVuLiBTZXF1ZW5jZQorICAgIC8vLyBudW1iZXJzIHNob3VsZCAqbmV2ZXIqIGJlIG5lZ2F0aXZlLCBhbmQgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBgaTMyYAorICAgIC8vLyBzaW1wbHkgYmVjYXVzZSB0aGUgVGhyaWZ0IHByb3RvY29sIGVuY29kZXMgc2VxdWVuY2UgbnVtYmVycyBhcyBgaTMyYCBvbgorICAgIC8vLyB0aGUgd2lyZS4KKyAgICBmbiBzZXF1ZW5jZV9udW1iZXIoJnNlbGYpIC0+IGkzMjsgLy8gRklYTUU6IGNvbnNpZGVyIHJldHVybmluZyBhIHUzMgorICAgIC8vLyBJbmNyZW1lbnRzIHRoZSBzZXF1ZW5jZSBudW1iZXIsIGluZGljYXRpbmcgdGhhdCBhIG1lc3NhZ2Ugd2l0aCB0aGF0CisgICAgLy8vIG51bWJlciBoYXMgYmVlbiBzZW50IHRvIHRoZSBUaHJpZnQgc2VydmVyLgorICAgIGZuIGluY3JlbWVudF9zZXF1ZW5jZV9udW1iZXIoJm11dCBzZWxmKSAtPiBpMzI7Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL2Vycm9ycy5ycyBiL2xpYi9ycy9zcmMvZXJyb3JzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTI1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL2Vycm9ycy5ycwpAQCAtMCwwICsxLDY3MCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb252ZXJ0Ojp7RnJvbSwgSW50b307Cit1c2Ugc3RkOjplcnJvcjo6RXJyb3IgYXMgU3RkRXJyb3I7Cit1c2Ugc3RkOjpmbXQ6OntEZWJ1ZywgRGlzcGxheSwgRm9ybWF0dGVyfTsKK3VzZSBzdGQ6OntlcnJvciwgZm10LCBpbywgc3RyaW5nfTsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHByb3RvY29sOjp7VEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbCwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsKKworLy8gRklYTUU6IHNob3VsZCBhbGwgbXkgZXJyb3Igc3RydWN0cyBpbXBsIGVycm9yOjpFcnJvciBhcyB3ZWxsPworLy8gRklYTUU6IHNob3VsZCBhbGwgZmllbGRzIGluIFRyYW5zcG9ydEVycm9yLCBQcm90b2NvbEVycm9yIGFuZCBBcHBsaWNhdGlvbkVycm9yIGJlIG9wdGlvbmFsPworCisvLy8gRXJyb3IgdHlwZSByZXR1cm5lZCBieSBhbGwgcnVudGltZSBsaWJyYXJ5IGZ1bmN0aW9ucy4KKy8vLworLy8vIGB0aHJpZnQ6OkVycm9yYCBpcyB1c2VkIHRocm91Z2hvdXQgdGhpcyBjcmF0ZSBhcyB3ZWxsIGFzIGluIGF1dG8tZ2VuZXJhdGVkCisvLy8gUnVzdCBjb2RlLiBJdCBjb25zaXN0cyBvZiBmb3VyIHZhcmlhbnRzIGRlZmluZWQgYnkgY29udmVudGlvbiBhY3Jvc3MgVGhyaWZ0CisvLy8gaW1wbGVtZW50YXRpb25zOgorLy8vCisvLy8gMS4gYFRyYW5zcG9ydGA6IGVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBvcGVyYXRpbmcgb24gSS9PIGNoYW5uZWxzCisvLy8gMi4gYFByb3RvY29sYDogZXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyBydW50aW1lLWxpYnJhcnkgcHJvY2Vzc2luZworLy8vIDMuIGBBcHBsaWNhdGlvbmA6IGVycm9ycyBlbmNvdW50ZXJlZCB3aXRoaW4gYXV0by1nZW5lcmF0ZWQgY29kZQorLy8vIDQuIGBVc2VyYDogSURMLWRlZmluZWQgZXhjZXB0aW9uIHN0cnVjdHMKKy8vLworLy8vIFRoZSBgQXBwbGljYXRpb25gIHZhcmlhbnQgYWxzbyBmdW5jdGlvbnMgYXMgYSBjYXRjaC1hbGw6IGFsbCBoYW5kbGVyIGVycm9ycworLy8vIGFyZSBhdXRvbWF0aWNhbGx5IHR1cm5lZCBpbnRvIGFwcGxpY2F0aW9uIGVycm9ycy4KKy8vLworLy8vIEFsbCBlcnJvciB2YXJpYW50cyBleGNlcHQgYEVycm9yOjpVc2VyYCB0YWtlIGFuIGVwb255bW91cyBzdHJ1Y3Qgd2l0aCB0d28KKy8vLyByZXF1aXJlZCBmaWVsZHM6CisvLy8KKy8vLyAxLiBga2luZGA6IHZhcmlhbnQtc3BlY2lmaWMgZW51bSBpZGVudGlmeWluZyB0aGUgZXJyb3Igc3ViLXR5cGUKKy8vLyAyLiBgbWVzc2FnZWA6IGh1bWFuLXJlYWRhYmxlIGVycm9yIGluZm8gc3RyaW5nCisvLy8KKy8vLyBga2luZGAgaXMgZGVmaW5lZCBieSBjb252ZW50aW9uIHdoaWxlIGBtZXNzYWdlYCBpcyBmcmVlZm9ybS4gSWYgbm9uZSBvZiB0aGUKKy8vLyBlbnVtZXJhdGVkIGtpbmRzIGFyZSBzdWl0YWJsZSB1c2UgYFVua25vd25gLgorLy8vCisvLy8gVG8gc2ltcGxpZnkgZXJyb3IgY3JlYXRpb24gY29udmVuaWVuY2UgY29uc3RydWN0b3JzIGFyZSBkZWZpbmVkIGZvciBhbGwKKy8vLyB2YXJpYW50cywgYW5kIGNvbnZlcnNpb25zIGZyb20gdGhlaXIgc3RydWN0cyAoYHRocmlmdDo6VHJhbnNwb3J0RXJyb3JgLAorLy8vIGB0aHJpZnQ6OlByb3RvY29sRXJyb3JgIGFuZCBgdGhyaWZ0OjpBcHBsaWNhdGlvbkVycm9yYCBpbnRvIGB0aHJpZnQ6OkVycm9yYC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhIGBUcmFuc3BvcnRFcnJvcmAuCisvLy8KKy8vLyBgYGAKKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OntUcmFuc3BvcnRFcnJvciwgVHJhbnNwb3J0RXJyb3JLaW5kfTsKKy8vLworLy8vIC8vIGV4cGxpY2l0CisvLy8gbGV0IGVycjA6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OlRyYW5zcG9ydCgKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3IgeworLy8vICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IikKKy8vLyAgICAgfQorLy8vICAgKQorLy8vICk7CisvLy8KKy8vLyAvLyB1c2UgY29udmVyc2lvbgorLy8vIGxldCBlcnIxOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpmcm9tKAorLy8vICAgICBUcmFuc3BvcnRFcnJvciB7CisvLy8gICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiKQorLy8vICAgICB9CisvLy8gICApCisvLy8gKTsKKy8vLworLy8vIC8vIHVzZSBzdHJ1Y3QgY29uc3RydWN0b3IKKy8vLyBsZXQgZXJyMjogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6VHJhbnNwb3J0KAorLy8vICAgICBUcmFuc3BvcnRFcnJvcjo6bmV3KAorLy8vICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICAgImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIKKy8vLyAgICAgKQorLy8vICAgKQorLy8vICk7CisvLy8KKy8vLworLy8vIC8vIHVzZSBlcnJvciB2YXJpYW50IGNvbnN0cnVjdG9yCisvLy8gbGV0IGVycjM6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6bmV3X3RyYW5zcG9ydF9lcnJvcigKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIKKy8vLyAgICkKKy8vLyApOworLy8vIGBgYAorLy8vCisvLy8gQ3JlYXRlIGFuIGVycm9yIGZyb20gYSBzdHJpbmcuCisvLy8KKy8vLyBgYGAKKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OntBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisvLy8KKy8vLyAvLyB3ZSBqdXN0IHVzZSBgRnJvbTo6ZnJvbWAgdG8gY29udmVydCBhIGBTdHJpbmdgIGludG8gYSBgdGhyaWZ0OjpFcnJvcmAKKy8vLyBsZXQgZXJyMDogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6ZnJvbSgiVGhpcyBpcyBhbiBlcnJvciIpCisvLy8gKTsKKy8vLworLy8vIC8vIGVycjAgaXMgZXF1aXZhbGVudCB0by4uLgorLy8vIGxldCBlcnIxOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbigKKy8vLyAgICAgQXBwbGljYXRpb25FcnJvciB7CisvLy8gICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisvLy8gICAgICAgbWVzc2FnZTogZm9ybWF0ISgiVGhpcyBpcyBhbiBlcnJvciIpCisvLy8gICAgIH0KKy8vLyAgICkKKy8vLyApOworLy8vIGBgYAorLy8vCisvLy8gUmV0dXJuIGFuIElETC1kZWZpbmVkIGV4Y2VwdGlvbi4KKy8vLworLy8vIGBgYHRleHQKKy8vLyAvLyBUaHJpZnQgSURMIGV4Y2VwdGlvbiBkZWZpbml0aW9uLgorLy8vIGV4Y2VwdGlvbiBYY2VwdGlvbiB7CisvLy8gICAxOiBpMzIgZXJyb3JDb2RlLAorLy8vICAgMjogc3RyaW5nIG1lc3NhZ2UKKy8vLyB9CisvLy8gYGBgCisvLy8KKy8vLyBgYGAKKy8vLyB1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOworLy8vIHVzZSBzdGQ6OmVycm9yOjpFcnJvcjsKKy8vLyB1c2Ugc3RkOjpmbXQ7CisvLy8gdXNlIHN0ZDo6Zm10Ojp7RGlzcGxheSwgRm9ybWF0dGVyfTsKKy8vLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKKy8vLyAjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCisvLy8gcHViIHN0cnVjdCBYY2VwdGlvbiB7CisvLy8gICBwdWIgZXJyb3JfY29kZTogT3B0aW9uPGkzMj4sCisvLy8gICBwdWIgbWVzc2FnZTogT3B0aW9uPFN0cmluZz4sCisvLy8gfQorLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vIGltcGwgRXJyb3IgZm9yIFhjZXB0aW9uIHsKKy8vLyAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKy8vLyAgICAgInJlbW90ZSBzZXJ2aWNlIHRocmV3IFhjZXB0aW9uIgorLy8vICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKKy8vLyBpbXBsIEZyb208WGNlcHRpb24+IGZvciB0aHJpZnQ6OkVycm9yIHsKKy8vLyAgIGZuIGZyb20oZTogWGNlcHRpb24pIC0+IFNlbGYgeworLy8vICAgICB0aHJpZnQ6OkVycm9yOjpVc2VyKEJveDo6bmV3KGUpKQorLy8vICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKKy8vLyBpbXBsIERpc3BsYXkgZm9yIFhjZXB0aW9uIHsKKy8vLyAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKy8vLyAgICAgc2VsZi5kZXNjcmlwdGlvbigpLmZtdChmKQorLy8vICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGluIHVzZXIgY29kZS4uLgorLy8vIGxldCBlcnI6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OmZyb20oWGNlcHRpb24geyBlcnJvcl9jb2RlOiBTb21lKDEpLCBtZXNzYWdlOiBOb25lIH0pCisvLy8gKTsKKy8vLyBgYGAKK3B1YiBlbnVtIEVycm9yIHsKKyAgICAvLy8gRXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIG9wZXJhdGluZyBvbiBJL08gY2hhbm5lbHMuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGluY2x1ZGUgKmNvbm5lY3Rpb24gY2xvc2VkKiBhbmQgKmJpbmQgZmFpbHVyZSouCisgICAgVHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yKSwKKyAgICAvLy8gRXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyBydW50aW1lLWxpYnJhcnkgcHJvY2Vzc2luZy4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgaW5jbHVkZSAqbWVzc2FnZSB0b28gbGFyZ2UqIGFuZCAqdW5zdXBwb3J0ZWQgcHJvdG9jb2wgdmVyc2lvbiouCisgICAgUHJvdG9jb2woUHJvdG9jb2xFcnJvciksCisgICAgLy8vIEVycm9ycyBlbmNvdW50ZXJlZCB3aXRoaW4gYXV0by1nZW5lcmF0ZWQgY29kZSwgb3Igd2hlbiBpbmNvbWluZworICAgIC8vLyBvciBvdXRnb2luZyBtZXNzYWdlcyB2aW9sYXRlIHRoZSBUaHJpZnQgc3BlYy4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgaW5jbHVkZSAqb3V0LW9mLW9yZGVyIG1lc3NhZ2VzKiBhbmQgKm1pc3NpbmcgcmVxdWlyZWQgc3RydWN0CisgICAgLy8vIGZpZWxkcyouCisgICAgLy8vCisgICAgLy8vIFRoaXMgdmFyaWFudCBhbHNvIGZ1bmN0aW9ucyBhcyBhIGNhdGNoLWFsbDogZXJyb3JzIGZyb20gaGFuZGxlcgorICAgIC8vLyBmdW5jdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgcmV0dXJuZWQgYXMgYW4gYEFwcGxpY2F0aW9uRXJyb3JgLgorICAgIEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IpLAorICAgIC8vLyBJREwtZGVmaW5lZCBleGNlcHRpb24gc3RydWN0cy4KKyAgICBVc2VyKEJveDxlcnJvcjo6RXJyb3IgKyBTeW5jICsgU2VuZD4pLAorfQorCitpbXBsIEVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGFuIGBBcHBsaWNhdGlvbkVycm9yYCBmcm9tIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLgorICAgIC8vLworICAgIC8vLyBBcHBsaWNhdGlvbiBjb2RlICoqc2hvdWxkIG5ldmVyKiogY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KKyAgICBwdWIgZm4gcmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKAorICAgICAgICBpOiAmbXV0IFRJbnB1dFByb3RvY29sLAorICAgICkgLT4gOjpSZXN1bHQ8QXBwbGljYXRpb25FcnJvcj4geworICAgICAgICBsZXQgbXV0IG1lc3NhZ2UgPSAiZ2VuZXJhbCByZW1vdGUgZXJyb3IiLnRvX293bmVkKCk7CisgICAgICAgIGxldCBtdXQga2luZCA9IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duOworCisgICAgICAgIGkucmVhZF9zdHJ1Y3RfYmVnaW4oKT87CisKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBsZXQgZmllbGRfaWRlbnQgPSBpLnJlYWRfZmllbGRfYmVnaW4oKT87CisKKyAgICAgICAgICAgIGlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgaWQgPSBmaWVsZF9pZGVudAorICAgICAgICAgICAgICAgIC5pZAorICAgICAgICAgICAgICAgIC5leHBlY3QoInNlbmRlciBzaG91bGQgYWx3YXlzIHNwZWNpZnkgaWQgZm9yIG5vbi1TVE9QIGZpZWxkIik7CisKKyAgICAgICAgICAgIG1hdGNoIGlkIHsKKyAgICAgICAgICAgICAgICAxID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW90ZV9tZXNzYWdlID0gaS5yZWFkX3N0cmluZygpPzsKKyAgICAgICAgICAgICAgICAgICAgaS5yZWFkX2ZpZWxkX2VuZCgpPzsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHJlbW90ZV9tZXNzYWdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAyID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW90ZV90eXBlX2FzX2ludCA9IGkucmVhZF9pMzIoKT87CisgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdGVfa2luZDogQXBwbGljYXRpb25FcnJvcktpbmQgPSBUcnlGcm9tOjp0cnlfZnJvbShyZW1vdGVfdHlwZV9hc19pbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAudW53cmFwX29yKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duKTsKKyAgICAgICAgICAgICAgICAgICAgaS5yZWFkX2ZpZWxkX2VuZCgpPzsKKyAgICAgICAgICAgICAgICAgICAga2luZCA9IHJlbW90ZV9raW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaS5za2lwKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpLnJlYWRfc3RydWN0X2VuZCgpPzsKKworICAgICAgICBPayhBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLAorICAgICAgICB9KQorICAgIH0KKworICAgIC8vLyBDb252ZXJ0IGFuIGBBcHBsaWNhdGlvbkVycm9yYCBpbnRvIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uIGFuZCB3cml0ZQorICAgIC8vLyBpdCB0byB0aGUgcmVtb3RlLgorICAgIC8vLworICAgIC8vLyBBcHBsaWNhdGlvbiBjb2RlICoqc2hvdWxkIG5ldmVyKiogY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KKyAgICBwdWIgZm4gd3JpdGVfYXBwbGljYXRpb25fZXJyb3JfdG9fb3V0X3Byb3RvY29sKAorICAgICAgICBlOiAmQXBwbGljYXRpb25FcnJvciwKKyAgICAgICAgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wsCisgICAgKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBvLndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIudG9fb3duZWQoKSwKKyAgICAgICAgfSk/OworCisgICAgICAgIGxldCBtZXNzYWdlX2ZpZWxkID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJtZXNzYWdlIiwgVFR5cGU6OlN0cmluZywgMSk7CisgICAgICAgIGxldCB0eXBlX2ZpZWxkID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJ0eXBlIiwgVFR5cGU6OkkzMiwgMik7CisKKyAgICAgICAgby53cml0ZV9maWVsZF9iZWdpbigmbWVzc2FnZV9maWVsZCk/OworICAgICAgICBvLndyaXRlX3N0cmluZygmZS5tZXNzYWdlKT87CisgICAgICAgIG8ud3JpdGVfZmllbGRfZW5kKCk/OworCisgICAgICAgIG8ud3JpdGVfZmllbGRfYmVnaW4oJnR5cGVfZmllbGQpPzsKKyAgICAgICAgby53cml0ZV9pMzIoZS5raW5kIGFzIGkzMik/OworICAgICAgICBvLndyaXRlX2ZpZWxkX2VuZCgpPzsKKworICAgICAgICBvLndyaXRlX2ZpZWxkX3N0b3AoKT87CisgICAgICAgIG8ud3JpdGVfc3RydWN0X2VuZCgpPzsKKworICAgICAgICBvLmZsdXNoKCkKKyAgICB9Cit9CisKK2ltcGwgZXJyb3I6OkVycm9yIGZvciBFcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KHJlZiBlKSA9PiBUcmFuc3BvcnRFcnJvcjo6ZGVzY3JpcHRpb24oZSksCisgICAgICAgICAgICBFcnJvcjo6UHJvdG9jb2wocmVmIGUpID0+IFByb3RvY29sRXJyb3I6OmRlc2NyaXB0aW9uKGUpLAorICAgICAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKHJlZiBlKSA9PiBBcHBsaWNhdGlvbkVycm9yOjpkZXNjcmlwdGlvbihlKSwKKyAgICAgICAgICAgIEVycm9yOjpVc2VyKHJlZiBlKSA9PiBlLmRlc2NyaXB0aW9uKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGVidWcgZm9yIEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQocmVmIGUpID0+IERlYnVnOjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6UHJvdG9jb2wocmVmIGUpID0+IERlYnVnOjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpID0+IERlYnVnOjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6VXNlcihyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6UHJvdG9jb2wocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlVzZXIocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPFN0cmluZz4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKHM6IFN0cmluZykgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogcywKKyAgICAgICAgfSkKKyAgICB9Cit9CisKK2ltcGw8J2E+IEZyb208JidhIHN0cj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKHM6ICYnYSBzdHIpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IFN0cmluZzo6ZnJvbShzKSwKKyAgICAgICAgfSkKKyAgICB9Cit9CisKK2ltcGwgRnJvbTxUcmFuc3BvcnRFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGU6IFRyYW5zcG9ydEVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChlKQorICAgIH0KK30KKworaW1wbCBGcm9tPFByb3RvY29sRXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlOiBQcm90b2NvbEVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OlByb3RvY29sKGUpCisgICAgfQorfQorCitpbXBsIEZyb208QXBwbGljYXRpb25FcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGU6IEFwcGxpY2F0aW9uRXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24oZSkKKyAgICB9Cit9CisKKy8vLyBDcmVhdGUgYSBuZXcgYEVycm9yYCBpbnN0YW5jZSBvZiB0eXBlIGBUcmFuc3BvcnRgIHRoYXQgd3JhcHMgYQorLy8vIGBUcmFuc3BvcnRFcnJvcmAuCitwdWIgZm4gbmV3X3RyYW5zcG9ydF9lcnJvcjxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gRXJyb3IgeworICAgIEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3I6Om5ldyhraW5kLCBtZXNzYWdlKSkKK30KKworLy8vIEluZm9ybWF0aW9uIGFib3V0IEkvTyBlcnJvcnMuCisjW2Rlcml2ZShEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRyYW5zcG9ydEVycm9yIHsKKyAgICAvLy8gSS9PIGVycm9yIHZhcmlhbnQuCisgICAgLy8vCisgICAgLy8vIElmIGEgc3BlY2lmaWMgYFRyYW5zcG9ydEVycm9yS2luZGAgZG9lcyBub3QgYXBwbHkgdXNlCisgICAgLy8vIGBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd25gLgorICAgIHB1YiBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQsCisgICAgLy8vIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgICAgcHViIG1lc3NhZ2U6IFN0cmluZywKK30KKworaW1wbCBUcmFuc3BvcnRFcnJvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgVHJhbnNwb3J0RXJyb3JgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PihraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gSS9PIGVycm9yIGNhdGVnb3JpZXMuCisvLy8KKy8vLyBUaGlzIGxpc3QgbWF5IGdyb3csIGFuZCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gbWF0Y2ggYWdhaW5zdCBpdC4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBFcSwgRGVidWcsIFBhcnRpYWxFcSldCitwdWIgZW51bSBUcmFuc3BvcnRFcnJvcktpbmQgeworICAgIC8vLyBDYXRjaC1hbGwgSS9PIGVycm9yLgorICAgIFVua25vd24gPSAwLAorICAgIC8vLyBBbiBJL08gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgd2hlbiB0aGUgdHJhbnNwb3J0IGNoYW5uZWwgd2FzIG5vdCBvcGVuLgorICAgIE5vdE9wZW4gPSAxLAorICAgIC8vLyBUaGUgdHJhbnNwb3J0IGNoYW5uZWwgY2Fubm90IGJlIG9wZW5lZCBiZWNhdXNlIGl0IHdhcyBvcGVuZWQgcHJldmlvdXNseS4KKyAgICBBbHJlYWR5T3BlbiA9IDIsCisgICAgLy8vIEFuIEkvTyBvcGVyYXRpb24gdGltZWQgb3V0LgorICAgIFRpbWVkT3V0ID0gMywKKyAgICAvLy8gQSByZWFkIGNvdWxkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIG5vIGJ5dGVzIHdlcmUgYXZhaWxhYmxlLgorICAgIEVuZE9mRmlsZSA9IDQsCisgICAgLy8vIEFuIGludmFsaWQgKGJ1ZmZlci9tZXNzYWdlKSBzaXplIHdhcyByZXF1ZXN0ZWQgb3IgcmVjZWl2ZWQuCisgICAgTmVnYXRpdmVTaXplID0gNSwKKyAgICAvLy8gVG9vIGxhcmdlIGEgYnVmZmVyIG9yIG1lc3NhZ2Ugc2l6ZSB3YXMgcmVxdWVzdGVkIG9yIHJlY2VpdmVkLgorICAgIFNpemVMaW1pdCA9IDYsCit9CisKK2ltcGwgVHJhbnNwb3J0RXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggc2VsZi5raW5kIHsKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biA9PiAidHJhbnNwb3J0IGVycm9yIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6Tm90T3BlbiA9PiAibm90IG9wZW4iLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiA9PiAiYWxyZWFkeSBvcGVuIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQgPT4gInRpbWVkIG91dCIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OkVuZE9mRmlsZSA9PiAiZW5kIG9mIGZpbGUiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUgPT4gIm5lZ2F0aXZlIHNpemUgbWVzc2FnZSIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlNpemVMaW1pdCA9PiAibWVzc2FnZSB0b28gbG9uZyIsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgVHJhbnNwb3J0RXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGUhKGYsICJ7fSIsIHNlbGYuZGVzY3JpcHRpb24oKSkKKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTxpMzI+IGZvciBUcmFuc3BvcnRFcnJvcktpbmQgeworICAgIHR5cGUgRXJyID0gRXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oZnJvbTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7CisgICAgICAgIG1hdGNoIGZyb20geworICAgICAgICAgICAgMCA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24pLAorICAgICAgICAgICAgMSA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6Ok5vdE9wZW4pLAorICAgICAgICAgICAgMiA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuKSwKKyAgICAgICAgICAgIDMgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCksCisgICAgICAgICAgICA0ID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6RW5kT2ZGaWxlKSwKKyAgICAgICAgICAgIDUgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUpLAorICAgICAgICAgICAgNiA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OlNpemVMaW1pdCksCisgICAgICAgICAgICBfID0+IEVycihFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gVHJhbnNwb3J0RXJyb3JLaW5kIiwgZnJvbSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxpbzo6RXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlcnI6IGlvOjpFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIG1hdGNoIGVyci5raW5kKCkgeworICAgICAgICAgICAgaW86OkVycm9yS2luZDo6Q29ubmVjdGlvblJlc2V0CisgICAgICAgICAgICB8IGlvOjpFcnJvcktpbmQ6OkNvbm5lY3Rpb25SZWZ1c2VkCisgICAgICAgICAgICB8IGlvOjpFcnJvcktpbmQ6Ok5vdENvbm5lY3RlZCA9PiBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6Ok5vdE9wZW4sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgaW86OkVycm9yS2luZDo6QWxyZWFkeUV4aXN0cyA9PiBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OlRpbWVkT3V0ID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgaW86OkVycm9yS2luZDo6VW5leHBlY3RlZEVvZiA9PiBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OkVuZE9mRmlsZSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLCAvLyBGSVhNRTogdXNlIGlvIGVycm9yJ3MgZGVidWcgc3RyaW5nCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPHN0cmluZzo6RnJvbVV0ZjhFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGVycjogc3RyaW5nOjpGcm9tVXRmOEVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwgLy8gRklYTUU6IHVzZSBmbXQ6OkVycm9yJ3MgZGVidWcgc3RyaW5nCisgICAgICAgIH0pCisgICAgfQorfQorCisvLy8gQ3JlYXRlIGEgbmV3IGBFcnJvcmAgaW5zdGFuY2Ugb2YgdHlwZSBgUHJvdG9jb2xgIHRoYXQgd3JhcHMgYQorLy8vIGBQcm90b2NvbEVycm9yYC4KK3B1YiBmbiBuZXdfcHJvdG9jb2xfZXJyb3I8UzogSW50bzxTdHJpbmc+PihraW5kOiBQcm90b2NvbEVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gRXJyb3IgeworICAgIEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yOjpuZXcoa2luZCwgbWVzc2FnZSkpCit9CisKKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMgdGhhdCBvY2N1ciBpbiB0aGUgcnVudGltZSBsaWJyYXJ5LgorI1tkZXJpdmUoRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBQcm90b2NvbEVycm9yIHsKKyAgICAvLy8gUHJvdG9jb2wgZXJyb3IgdmFyaWFudC4KKyAgICAvLy8KKyAgICAvLy8gSWYgYSBzcGVjaWZpYyBgUHJvdG9jb2xFcnJvcktpbmRgIGRvZXMgbm90IGFwcGx5IHVzZQorICAgIC8vLyBgUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd25gLgorICAgIHB1YiBraW5kOiBQcm90b2NvbEVycm9yS2luZCwKKyAgICAvLy8gSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgICBwdWIgbWVzc2FnZTogU3RyaW5nLAorfQorCitpbXBsIFByb3RvY29sRXJyb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYFByb3RvY29sRXJyb3JgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PihraW5kOiBQcm90b2NvbEVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gUHJvdG9jb2xFcnJvciB7CisgICAgICAgIFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gUnVudGltZSBsaWJyYXJ5IGVycm9yIGNhdGVnb3JpZXMuCisvLy8KKy8vLyBUaGlzIGxpc3QgbWF5IGdyb3csIGFuZCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gbWF0Y2ggYWdhaW5zdCBpdC4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBFcSwgRGVidWcsIFBhcnRpYWxFcSldCitwdWIgZW51bSBQcm90b2NvbEVycm9yS2luZCB7CisgICAgLy8vIENhdGNoLWFsbCBydW50aW1lLWxpYnJhcnkgZXJyb3IuCisgICAgVW5rbm93biA9IDAsCisgICAgLy8vIEFuIGludmFsaWQgYXJndW1lbnQgd2FzIHN1cHBsaWVkIHRvIGEgbGlicmFyeSBmdW5jdGlvbiwgb3IgaW52YWxpZCBkYXRhCisgICAgLy8vIHdhcyByZWNlaXZlZCBmcm9tIGEgVGhyaWZ0IGVuZHBvaW50LgorICAgIEludmFsaWREYXRhID0gMSwKKyAgICAvLy8gQW4gaW52YWxpZCBzaXplIHdhcyByZWNlaXZlZCBpbiBhbiBlbmNvZGVkIGZpZWxkLgorICAgIE5lZ2F0aXZlU2l6ZSA9IDIsCisgICAgLy8vIFRocmlmdCBtZXNzYWdlIG9yIGZpZWxkIHdhcyB0b28gbG9uZy4KKyAgICBTaXplTGltaXQgPSAzLAorICAgIC8vLyBVbnN1cHBvcnRlZCBvciB1bmtub3duIFRocmlmdCBwcm90b2NvbCB2ZXJzaW9uLgorICAgIEJhZFZlcnNpb24gPSA0LAorICAgIC8vLyBVbnN1cHBvcnRlZCBUaHJpZnQgcHJvdG9jb2wsIHNlcnZlciBvciBmaWVsZCB0eXBlLgorICAgIE5vdEltcGxlbWVudGVkID0gNSwKKyAgICAvLy8gUmVhY2hlZCB0aGUgbWF4aW11bSBuZXN0ZWQgZGVwdGggdG8gd2hpY2ggYW4gZW5jb2RlZCBUaHJpZnQgZmllbGQgY291bGQKKyAgICAvLy8gYmUgc2tpcHBlZC4KKyAgICBEZXB0aExpbWl0ID0gNiwKK30KKworaW1wbCBQcm90b2NvbEVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoIHNlbGYua2luZCB7CisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biA9PiAicHJvdG9jb2wgZXJyb3IiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhID0+ICJiYWQgZGF0YSIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6TmVnYXRpdmVTaXplID0+ICJuZWdhdGl2ZSBtZXNzYWdlIHNpemUiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OlNpemVMaW1pdCA9PiAibWVzc2FnZSB0b28gbG9uZyIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiA9PiAiaW52YWxpZCB0aHJpZnQgdmVyc2lvbiIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6Tm90SW1wbGVtZW50ZWQgPT4gIm5vdCBpbXBsZW1lbnRlZCIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6RGVwdGhMaW1pdCA9PiAibWF4aW11bSBza2lwIGRlcHRoIHJlYWNoZWQiLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIFByb3RvY29sRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGUhKGYsICJ7fSIsIHNlbGYuZGVzY3JpcHRpb24oKSkKKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTxpMzI+IGZvciBQcm90b2NvbEVycm9yS2luZCB7CisgICAgdHlwZSBFcnIgPSBFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShmcm9tOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsKKyAgICAgICAgbWF0Y2ggZnJvbSB7CisgICAgICAgICAgICAwID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duKSwKKyAgICAgICAgICAgIDEgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhKSwKKyAgICAgICAgICAgIDIgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSksCisgICAgICAgICAgICAzID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpTaXplTGltaXQpLAorICAgICAgICAgICAgNCA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiksCisgICAgICAgICAgICA1ID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpOb3RJbXBsZW1lbnRlZCksCisgICAgICAgICAgICA2ID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpEZXB0aExpbWl0KSwKKyAgICAgICAgICAgIF8gPT4gRXJyKEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBQcm90b2NvbEVycm9yS2luZCIsIGZyb20pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gQ3JlYXRlIGEgbmV3IGBFcnJvcmAgaW5zdGFuY2Ugb2YgdHlwZSBgQXBwbGljYXRpb25gIHRoYXQgd3JhcHMgYW4KKy8vLyBgQXBwbGljYXRpb25FcnJvcmAuCitwdWIgZm4gbmV3X2FwcGxpY2F0aW9uX2Vycm9yPFM6IEludG88U3RyaW5nPj4oa2luZDogQXBwbGljYXRpb25FcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEVycm9yIHsKKyAgICBFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvcjo6bmV3KGtpbmQsIG1lc3NhZ2UpKQorfQorCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgZXJyb3JzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgb3IgaW4gdXNlci1pbXBsZW1lbnRlZAorLy8vIHNlcnZpY2UgaGFuZGxlcnMuCisjW2Rlcml2ZShEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IEFwcGxpY2F0aW9uRXJyb3IgeworICAgIC8vLyBBcHBsaWNhdGlvbiBlcnJvciB2YXJpYW50LgorICAgIC8vLworICAgIC8vLyBJZiBhIHNwZWNpZmljIGBBcHBsaWNhdGlvbkVycm9yS2luZGAgZG9lcyBub3QgYXBwbHkgdXNlCisgICAgLy8vIGBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bmAuCisgICAgcHViIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kLAorICAgIC8vLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgIHB1YiBtZXNzYWdlOiBTdHJpbmcsCit9CisKK2ltcGwgQXBwbGljYXRpb25FcnJvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25FcnJvcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBBdXRvLWdlbmVyYXRlZCBvciB1c2VyLWltcGxlbWVudGVkIGNvZGUgZXJyb3IgY2F0ZWdvcmllcy4KKy8vLworLy8vIFRoaXMgbGlzdCBtYXkgZ3JvdywgYW5kIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBtYXRjaCBhZ2FpbnN0IGl0LgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBlbnVtIEFwcGxpY2F0aW9uRXJyb3JLaW5kIHsKKyAgICAvLy8gQ2F0Y2gtYWxsIGFwcGxpY2F0aW9uIGVycm9yLgorICAgIFVua25vd24gPSAwLAorICAgIC8vLyBNYWRlIHNlcnZpY2UgY2FsbCB0byBhbiB1bmtub3duIHNlcnZpY2UgbWV0aG9kLgorICAgIFVua25vd25NZXRob2QgPSAxLAorICAgIC8vLyBSZWNlaXZlZCBhbiB1bmtub3duIFRocmlmdCBtZXNzYWdlIHR5cGUuIFRoYXQgaXMsIG5vdCBvbmUgb2YgdGhlCisgICAgLy8vIGB0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGVgIHZhcmlhbnRzLgorICAgIEludmFsaWRNZXNzYWdlVHlwZSA9IDIsCisgICAgLy8vIE1ldGhvZCBuYW1lIGluIGEgc2VydmljZSByZXBseSBkb2VzIG5vdCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUKKyAgICAvLy8gcmVjZWl2aW5nIHNlcnZpY2UgbWV0aG9kLgorICAgIFdyb25nTWV0aG9kTmFtZSA9IDMsCisgICAgLy8vIFJlY2VpdmVkIGFuIG91dC1vZi1vcmRlciBUaHJpZnQgbWVzc2FnZS4KKyAgICBCYWRTZXF1ZW5jZUlkID0gNCwKKyAgICAvLy8gU2VydmljZSByZXBseSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgICBNaXNzaW5nUmVzdWx0ID0gNSwKKyAgICAvLy8gQXV0by1nZW5lcmF0ZWQgY29kZSBmYWlsZWQgdW5leHBlY3RlZGx5LgorICAgIEludGVybmFsRXJyb3IgPSA2LAorICAgIC8vLyBUaHJpZnQgcHJvdG9jb2wgZXJyb3IuIFdoZW4gcG9zc2libGUgdXNlIGBFcnJvcjo6UHJvdG9jb2xFcnJvcmAgd2l0aCBhCisgICAgLy8vIHNwZWNpZmljIGBQcm90b2NvbEVycm9yS2luZGAgaW5zdGVhZC4KKyAgICBQcm90b2NvbEVycm9yID0gNywKKyAgICAvLy8gKlVua25vd24qLiBJbmNsdWRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgVGhyaWZ0IGltcGxlbWVudGF0aW9ucy4KKyAgICBJbnZhbGlkVHJhbnNmb3JtID0gOCwgLy8gPz8KKyAgICAvLy8gVGhyaWZ0IGVuZHBvaW50IHJlcXVlc3RlZCwgb3IgaXMgdXNpbmcsIGFuIHVuc3VwcG9ydGVkIGVuY29kaW5nLgorICAgIEludmFsaWRQcm90b2NvbCA9IDksIC8vID8/CisgICAgLy8vIFRocmlmdCBlbmRwb2ludCByZXF1ZXN0ZWQsIG9yIGlzIHVzaW5nLCBhbiB1bnN1cHBvcnRlZCBhdXRvLWdlbmVyYXRlZCBjbGllbnQgdHlwZS4KKyAgICBVbnN1cHBvcnRlZENsaWVudFR5cGUgPSAxMCwgLy8gPz8KK30KKworaW1wbCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoIHNlbGYua2luZCB7CisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biA9PiAic2VydmljZSBlcnJvciIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bk1ldGhvZCA9PiAidW5rbm93biBzZXJ2aWNlIG1ldGhvZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZE1lc3NhZ2VUeXBlID0+ICJ3cm9uZyBtZXNzYWdlIHR5cGUgcmVjZWl2ZWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6Oldyb25nTWV0aG9kTmFtZSA9PiAidW5rbm93biBtZXRob2QgcmVwbHkgcmVjZWl2ZWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkJhZFNlcXVlbmNlSWQgPT4gIm91dCBvZiBvcmRlciBzZXF1ZW5jZSBpZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6TWlzc2luZ1Jlc3VsdCA9PiAibWlzc2luZyBtZXRob2QgcmVzdWx0IiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnRlcm5hbEVycm9yID0+ICJyZW1vdGUgc2VydmljZSB0aHJldyBleGNlcHRpb24iLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlByb3RvY29sRXJyb3IgPT4gInByb3RvY29sIGVycm9yIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkVHJhbnNmb3JtID0+ICJpbnZhbGlkIHRyYW5zZm9ybSIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFByb3RvY29sID0+ICJpbnZhbGlkIHByb3RvY29sIHJlcXVlc3RlZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5zdXBwb3J0ZWRDbGllbnRUeXBlID0+ICJ1bnN1cHBvcnRlZCBwcm90b2NvbCBjbGllbnQiLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIEFwcGxpY2F0aW9uRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGUhKGYsICJ7fSIsIHNlbGYuZGVzY3JpcHRpb24oKSkKKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTxpMzI+IGZvciBBcHBsaWNhdGlvbkVycm9yS2luZCB7CisgICAgdHlwZSBFcnIgPSBFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShmcm9tOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsKKyAgICAgICAgbWF0Y2ggZnJvbSB7CisgICAgICAgICAgICAwID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duKSwKKyAgICAgICAgICAgIDEgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25NZXRob2QpLAorICAgICAgICAgICAgMiA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZE1lc3NhZ2VUeXBlKSwKKyAgICAgICAgICAgIDMgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6Oldyb25nTWV0aG9kTmFtZSksCisgICAgICAgICAgICA0ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpCYWRTZXF1ZW5jZUlkKSwKKyAgICAgICAgICAgIDUgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6Ok1pc3NpbmdSZXN1bHQpLAorICAgICAgICAgICAgNiA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6SW50ZXJuYWxFcnJvciksCisgICAgICAgICAgICA3ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpQcm90b2NvbEVycm9yKSwKKyAgICAgICAgICAgIDggPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRUcmFuc2Zvcm0pLAorICAgICAgICAgICAgOSA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFByb3RvY29sKSwKKyAgICAgICAgICAgIDEwID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbnN1cHBvcnRlZENsaWVudFR5cGUpLAorICAgICAgICAgICAgXyA9PiBFcnIoRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIEFwcGxpY2F0aW9uRXJyb3JLaW5kIiwgZnJvbSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL2xpYi5ycyBiL2xpYi9ycy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNWM3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDg3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBSdXN0IHJ1bnRpbWUgbGlicmFyeSBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbS4KKy8vIQorLy8hIFRoaXMgY3JhdGUgaW1wbGVtZW50cyB0aGUgY29tcG9uZW50cyByZXF1aXJlZCB0byBidWlsZCBhIHdvcmtpbmcKKy8vISBUaHJpZnQgc2VydmVyIGFuZCBjbGllbnQuIEl0IGlzIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CisvLyEKKy8vISAxLiBlcnJvcnMKKy8vISAyLiBwcm90b2NvbAorLy8hIDMuIHRyYW5zcG9ydAorLy8hIDQuIHNlcnZlcgorLy8hIDUuIGF1dG9nZW4KKy8vIQorLy8hIFRoZSBtb2R1bGVzIGFyZSBsYXllcmVkIGFzIHNob3duIGluIHRoZSBkaWFncmFtIGJlbG93LiBUaGUgYGF1dG9nZW4nZGAKKy8vISBsYXllciBpcyBnZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcidzIFJ1c3QgcGx1Z2luLiBJdCB1c2VzIHRoZQorLy8hIHR5cGVzIGFuZCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGNyYXRlIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUKKy8vISBtZXNzYWdlcyBhbmQgaW1wbGVtZW50IFJQQy4gVXNlcnMgaW50ZXJhY3Qgd2l0aCB0aGVzZSB0eXBlcyBhbmQgc2VydmljZXMKKy8vISBieSB3cml0aW5nIHRoZWlyIG93biBjb2RlIHRoYXQgdXNlcyB0aGUgYXV0by1nZW5lcmF0ZWQgY2xpZW50cyBhbmQKKy8vISBzZXJ2ZXJzLgorLy8hCisvLyEgYGBgdGV4dAorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8IHVzZXIgYXBwICB8CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgYXV0b2dlbidkIHwgKHVzZXMgZXJyb3JzLCBhdXRvZ2VuKQorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8ICBwcm90b2NvbCB8CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgdHJhbnNwb3J0IHwKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgYGBgCisKKyMhW2NyYXRlX3R5cGUgPSAibGliIl0KKyMhW2RvYyh0ZXN0KGF0dHIoYWxsb3codW51c2VkX3ZhcmlhYmxlcyksIGRlbnkod2FybmluZ3MpKSkpXQorCitleHRlcm4gY3JhdGUgYnl0ZW9yZGVyOworZXh0ZXJuIGNyYXRlIGludGVnZXJfZW5jb2Rpbmc7CitleHRlcm4gY3JhdGUgdGhyZWFkcG9vbDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgbG9nOworCisvLyBOT1RFOiB0aGlzIG1hY3JvIGhhcyB0byBiZSBkZWZpbmVkIGJlZm9yZSBhbnkgbW9kdWxlcy4gU2VlOgorLy8gaHR0cHM6Ly9kYW5pZWxrZWVwLmdpdGh1Yi5pby9xdWljay1pbnRyby10by1tYWNyb3MuaHRtbCNzb21lLW1vcmUtZ290Y2hhcworCisvLy8gQXNzZXJ0IHRoYXQgYW4gZXhwcmVzc2lvbiByZXR1cm5pbmcgYSBgUmVzdWx0YCBpcyBhIHN1Y2Nlc3MuIElmIGl0IGlzLAorLy8vIHJldHVybiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZXN1bHQsIGkuZS4gYGV4cHIudW53cmFwKClgLgorI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X3N1Y2Nlc3MgeworICAgICgkZTogZXhwcikgPT4ge3sKKyAgICAgICAgbGV0IHJlcyA9ICRlOworICAgICAgICBhc3NlcnQhKHJlcy5pc19vaygpKTsKKyAgICAgICAgcmVzLnVud3JhcCgpCisgICAgfX07Cit9CisKK3B1YiBtb2QgcHJvdG9jb2w7CitwdWIgbW9kIHNlcnZlcjsKK3B1YiBtb2QgdHJhbnNwb3J0OworCittb2QgZXJyb3JzOworcHViIHVzZSBlcnJvcnM6Oio7CisKK21vZCBhdXRvZ2VuOworcHViIHVzZSBhdXRvZ2VuOjoqOworCisvLy8gUmVzdWx0IHR5cGUgcmV0dXJuZWQgYnkgYWxsIHJ1bnRpbWUgbGlicmFyeSBmdW5jdGlvbnMuCisvLy8KKy8vLyBBcyBpcyBjb252ZW50aW9uIHRoaXMgaXMgYSB0eXBlZGVmIG9mIGBzdGQ6OnJlc3VsdDo6UmVzdWx0YAorLy8vIHdpdGggYEVgIGRlZmluZWQgYXMgdGhlIGB0aHJpZnQ6OkVycm9yYCB0eXBlLgorcHViIHR5cGUgUmVzdWx0PFQ+ID0gc3RkOjpyZXN1bHQ6OlJlc3VsdDxULCBzZWxmOjpFcnJvcj47CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL2JpbmFyeS5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvYmluYXJ5LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YWZmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL2JpbmFyeS5ycwpAQCAtMCwwICsxLDk1NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2UgYnl0ZW9yZGVyOjp7QmlnRW5kaWFuLCBCeXRlT3JkZXIsIFJlYWRCeXRlc0V4dCwgV3JpdGVCeXRlc0V4dH07Cit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLAorICAgIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLAorfTsKK3VzZSBzdXBlcjo6e1RPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sRmFjdG9yeSwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07Cit1c2UgdHJhbnNwb3J0Ojp7VFJlYWRUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydH07Cit1c2Uge1Byb3RvY29sRXJyb3IsIFByb3RvY29sRXJyb3JLaW5kfTsKKworY29uc3QgQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMTogdTMyID0gMHg4MDAxMDAwMDsKKworLy8vIFJlYWQgbWVzc2FnZXMgZW5jb2RlZCBpbiB0aGUgVGhyaWZ0IHNpbXBsZSBiaW5hcnkgZW5jb2RpbmcuCisvLy8KKy8vLyBUaGVyZSBhcmUgdHdvIGF2YWlsYWJsZSBtb2RlczogYHN0cmljdGAgYW5kIGBub24tc3RyaWN0YCwgd2hlcmUgdGhlCisvLy8gYG5vbi1zdHJpY3RgIHZlcnNpb24gZG9lcyBub3QgY2hlY2sgZm9yIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHRoZQorLy8vIHJlY2VpdmVkIG1lc3NhZ2UgaGVhZGVyLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEJpbmFyeUlucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBsZXQgcmVjdmRfYm9vbCA9IHByb3RvY29sLnJlYWRfYm9vbCgpLnVud3JhcCgpOworLy8vIGxldCByZWN2ZF9zdHJpbmcgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICBzdHJpY3Q6IGJvb2wsCisgICAgcHViIHRyYW5zcG9ydDogVCwgLy8gRklYTUU6IHNob3VsZG4ndCBiZSBwdWJsaWMKK30KKworaW1wbDwnYSwgVD4gVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQmluYXJ5SW5wdXRQcm90b2NvbGAgdGhhdCByZWFkcyBieXRlcyBmcm9tIGB0cmFuc3BvcnRgLgorICAgIC8vLworICAgIC8vLyBTZXQgYHN0cmljdGAgdG8gYHRydWVgIGlmIGFsbCBpbmNvbWluZyBtZXNzYWdlcyBjb250YWluIHRoZSBwcm90b2NvbAorICAgIC8vLyB2ZXJzaW9uIG51bWJlciBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBULCBzdHJpY3Q6IGJvb2wpIC0+IFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2wgeworICAgICAgICAgICAgc3RyaWN0OiBzdHJpY3QsCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxUPiBUSW5wdXRQcm90b2NvbCBmb3IgVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KGNvbGxhcHNpYmxlX2lmKSldCisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBtdXQgZmlyc3RfYnl0ZXMgPSB2ZWMhWzA7IDRdOworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2V4YWN0KCZtdXQgZmlyc3RfYnl0ZXNbLi5dKT87CisKKyAgICAgICAgLy8gdGhlIHRocmlmdCB2ZXJzaW9uIGhlYWRlciBpcyBpbnRlbnRpb25hbGx5IG5lZ2F0aXZlCisgICAgICAgIC8vIHNvIHRoZSBmaXJzdCBjaGVjayB3ZSdsbCBkbyBpcyBzZWUgaWYgdGhlIHNpZ24gYml0IGlzIHNldAorICAgICAgICAvLyBhbmQgaWYgc28gLSBhc3N1bWUgaXQncyB0aGUgcHJvdG9jb2wtdmVyc2lvbiBoZWFkZXIKKyAgICAgICAgaWYgZmlyc3RfYnl0ZXNbMF0gPj0gOCB7CisgICAgICAgICAgICAvLyBhcHBhcmVudGx5IHdlIGdvdCBhIHByb3RvY29sLXZlcnNpb24gaGVhZGVyIC0gY2hlY2sKKyAgICAgICAgICAgIC8vIGl0LCBhbmQgaWYgaXQgbWF0Y2hlcywgcmVhZCB0aGUgcmVzdCBvZiB0aGUgZmllbGRzCisgICAgICAgICAgICBpZiBmaXJzdF9ieXRlc1swLi4yXSAhPSBbMHg4MCwgMHgwMV0geworICAgICAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoInJlY2VpdmVkIGJhZCB2ZXJzaW9uOiB7Oj99IiwgJmZpcnN0X2J5dGVzWzAuLjJdKSwKKyAgICAgICAgICAgICAgICB9KSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlID0gVHJ5RnJvbTo6dHJ5X2Zyb20oZmlyc3RfYnl0ZXNbM10pPzsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHNlbGYucmVhZF9zdHJpbmcoKT87CisgICAgICAgICAgICAgICAgbGV0IHNlcXVlbmNlX251bWJlciA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgICAgICAgICAgT2soVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcobmFtZSwgbWVzc2FnZV90eXBlLCBzZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gYXBwYXJlbnRseSB3ZSBkaWRuJ3QgZ2V0IGEgcHJvdG9jb2wtdmVyc2lvbiBoZWFkZXIsCisgICAgICAgICAgICAvLyB3aGljaCBoYXBwZW5zIGlmIHRoZSBzZW5kZXIgaXMgbm90IHVzaW5nIHRoZSBzdHJpY3QgcHJvdG9jb2wKKyAgICAgICAgICAgIGlmIHNlbGYuc3RyaWN0IHsKKyAgICAgICAgICAgICAgICAvLyB3ZSdyZSBpbiBzdHJpY3QgbW9kZSBob3dldmVyLCBhbmQgdGhhdCBhbHdheXMKKyAgICAgICAgICAgICAgICAvLyByZXF1aXJlcyB0aGUgcHJvdG9jb2wtdmVyc2lvbiBoZWFkZXIgdG8gYmUgd3JpdHRlbiBmaXJzdAorICAgICAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoInJlY2VpdmVkIGJhZCB2ZXJzaW9uOiB7Oj99IiwgJmZpcnN0X2J5dGVzWzAuLjJdKSwKKyAgICAgICAgICAgICAgICB9KSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG5vbi1zdHJpY3QgdmVyc2lvbiB0aGUgZmlyc3QgbWVzc2FnZSBmaWVsZAorICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBtZXNzYWdlIG5hbWUuIHN0cmluZ3MgKGJ5dGUgYXJyYXlzKSBhcmUgbGVuZ3RoLXByZWZpeGVkLAorICAgICAgICAgICAgICAgIC8vIHNvIHdlJ3ZlIGp1c3QgcmVhZCB0aGUgbGVuZ3RoIGluIHRoZSBmaXJzdCA0IGJ5dGVzCisgICAgICAgICAgICAgICAgbGV0IG5hbWVfc2l6ZSA9IEJpZ0VuZGlhbjo6cmVhZF9pMzIoJmZpcnN0X2J5dGVzKSBhcyB1c2l6ZTsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IG5hbWVfYnVmOiBWZWM8dTg+ID0gdmVjIVswOyBuYW1lX3NpemVdOworICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZXhhY3QoJm11dCBuYW1lX2J1Zik/OworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gU3RyaW5nOjpmcm9tX3V0ZjgobmFtZV9idWYpPzsKKworICAgICAgICAgICAgICAgIC8vIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oVHJ5RnJvbTo6dHJ5X2Zyb20pPzsKKyAgICAgICAgICAgICAgICBsZXQgc2VxdWVuY2VfbnVtYmVyID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgICAgICAgICBPayhUTWVzc2FnZUlkZW50aWZpZXI6Om5ldyhuYW1lLCBtZXNzYWdlX3R5cGUsIHNlcXVlbmNlX251bWJlcikpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PiB7CisgICAgICAgIE9rKE5vbmUpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGZpZWxkX3R5cGVfYnl0ZSA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgZmllbGRfdHlwZSA9IGZpZWxkX3R5cGVfZnJvbV91OChmaWVsZF90eXBlX2J5dGUpPzsKKyAgICAgICAgbGV0IGlkID0gbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6U3RvcCA9PiBPaygwKSwKKyAgICAgICAgICAgIF8gPT4gc2VsZi5yZWFkX2kxNigpLAorICAgICAgICB9PzsKKyAgICAgICAgT2soVEZpZWxkSWRlbnRpZmllcjo6bmV3Ojo8T3B0aW9uPFN0cmluZz4sIFN0cmluZywgaTE2PigKKyAgICAgICAgICAgIE5vbmUsIGZpZWxkX3R5cGUsIGlkLAorICAgICAgICApKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgbGV0IG51bV9ieXRlcyA9IHNlbGYudHJhbnNwb3J0LnJlYWRfaTMyOjo8QmlnRW5kaWFuPigpPyBhcyB1c2l6ZTsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgbnVtX2J5dGVzXTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQorICAgICAgICAgICAgLm1hcCh8X3wgYnVmKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPiB7CisgICAgICAgIGxldCBiID0gc2VsZi5yZWFkX2k4KCk/OworICAgICAgICBtYXRjaCBiIHsKKyAgICAgICAgICAgIDAgPT4gT2soZmFsc2UpLAorICAgICAgICAgICAgXyA9PiBPayh0cnVlKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2k4KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTE2Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2kzMjo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pNjQ6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZjY0Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBsZXQgYnl0ZXMgPSBzZWxmLnJlYWRfYnl0ZXMoKT87CisgICAgICAgIFN0cmluZzo6ZnJvbV91dGY4KGJ5dGVzKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBlbGVtZW50X3R5cGU6IFRUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihmaWVsZF90eXBlX2Zyb21fdTgpPzsKKyAgICAgICAgbGV0IHNpemUgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICBPayhUTGlzdElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIHNpemUpKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBlbGVtZW50X3R5cGU6IFRUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihmaWVsZF90eXBlX2Zyb21fdTgpPzsKKyAgICAgICAgbGV0IHNpemUgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICBPayhUU2V0SWRlbnRpZmllcjo6bmV3KGVsZW1lbnRfdHlwZSwgc2l6ZSkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj4geworICAgICAgICBsZXQga2V5X3R5cGU6IFRUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihmaWVsZF90eXBlX2Zyb21fdTgpPzsKKyAgICAgICAgbGV0IHZhbHVlX3R5cGU6IFRUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihmaWVsZF90eXBlX2Zyb21fdTgpPzsKKyAgICAgICAgbGV0IHNpemUgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICBPayhUTWFwSWRlbnRpZmllcjo6bmV3KGtleV90eXBlLCB2YWx1ZV90eXBlLCBzaXplKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdTgoKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQmluYXJ5SW5wdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVElucHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCwgdHJ1ZSkpCisgICAgfQorfQorCisvLy8gV3JpdGUgbWVzc2FnZXMgdXNpbmcgdGhlIFRocmlmdCBzaW1wbGUgYmluYXJ5IGVuY29kaW5nLgorLy8vCisvLy8gVGhlcmUgYXJlIHR3byBhdmFpbGFibGUgbW9kZXM6IGBzdHJpY3RgIGFuZCBgbm9uLXN0cmljdGAsIHdoZXJlIHRoZQorLy8vIGBzdHJpY3RgIHZlcnNpb24gd3JpdGVzIHRoZSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgb3V0Z29pbmcgbWVzc2FnZQorLy8vIGhlYWRlciBhbmQgdGhlIGBub24tc3RyaWN0YCB2ZXJzaW9uIGRvZXMgbm90LgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEJpbmFyeU91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gcHJvdG9jb2wud3JpdGVfYm9vbCh0cnVlKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9zdHJpbmcoInRlc3Rfc3RyaW5nIikudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgc3RyaWN0OiBib29sLAorICAgIHB1YiB0cmFuc3BvcnQ6IFQsIC8vIEZJWE1FOiBkbyBub3QgbWFrZSBwdWJsaWM7IG9ubHkgcHVibGljIGZvciB0ZXN0aW5nIQorfQorCitpbXBsPFQ+IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQmluYXJ5T3V0cHV0UHJvdG9jb2xgIHRoYXQgd3JpdGVzIGJ5dGVzIHRvIGB0cmFuc3BvcnRgLgorICAgIC8vLworICAgIC8vLyBTZXQgYHN0cmljdGAgdG8gYHRydWVgIGlmIGFsbCBvdXRnb2luZyBtZXNzYWdlcyBzaG91bGQgY29udGFpbiB0aGUKKyAgICAvLy8gcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgaW4gdGhlIHByb3RvY29sIGhlYWRlci4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCwgc3RyaWN0OiBib29sKSAtPiBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2wgeworICAgICAgICAgICAgc3RyaWN0OiBzdHJpY3QsCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxUPiBUT3V0cHV0UHJvdG9jb2wgZm9yIFRCaW5hcnlPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIHNlbGYuc3RyaWN0IHsKKyAgICAgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IHU4ID0gaWRlbnRpZmllci5tZXNzYWdlX3R5cGUuaW50bygpOworICAgICAgICAgICAgbGV0IGhlYWRlciA9IEJJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEgfCAobWVzc2FnZV90eXBlIGFzIHUzMik7CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV91MzI6OjxCaWdFbmRpYW4+KGhlYWRlcik/OworICAgICAgICAgICAgc2VsZi53cml0ZV9zdHJpbmcoJmlkZW50aWZpZXIubmFtZSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zZXF1ZW5jZV9udW1iZXIpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX3N0cmluZygmaWRlbnRpZmllci5uYW1lKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoaWRlbnRpZmllci5tZXNzYWdlX3R5cGUuaW50bygpKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNlcXVlbmNlX251bWJlcikKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgXzogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgaWRlbnRpZmllci5pZC5pc19ub25lKCkgJiYgaWRlbnRpZmllci5maWVsZF90eXBlICE9IFRUeXBlOjpTdG9wIHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCB3cml0ZSBpZGVudGlmaWVyIHs6P30gd2l0aG91dCBzZXF1ZW5jZSBudW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAmaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChpZGVudGlmaWVyLmZpZWxkX3R5cGUpKT87CisgICAgICAgIGlmIGxldCBTb21lKGlkKSA9IGlkZW50aWZpZXIuaWQgeworICAgICAgICAgICAgc2VsZi53cml0ZV9pMTYoaWQpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChUVHlwZTo6U3RvcCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoYi5sZW4oKSBhcyBpMzIpPzsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfYWxsKGIpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgYiB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2k4KDEpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2k4KDApCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pOChpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pMTY6OjxCaWdFbmRpYW4+KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2kzMjo6PEJpZ0VuZGlhbj4oaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTY0Ojo8QmlnRW5kaWFuPihpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9mNjQ6OjxCaWdFbmRpYW4+KGQpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGVzKHMuYXNfYnl0ZXMoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoaWRlbnRpZmllci5lbGVtZW50X3R5cGUpKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoaWRlbnRpZmllci5lbGVtZW50X3R5cGUpKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQga2V5X3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAua2V5X3R5cGUKKyAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIGtleSB0eXBlIik7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGtleV90eXBlKSk/OworICAgICAgICBsZXQgdmFsX3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAudmFsdWVfdHlwZQorICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4gdmFsdWUgdHlwZSIpOworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OCh2YWxfdHlwZSkpPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV91OChiKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQmluYXJ5T3V0cHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVE91dHB1dFByb3RvY29sRmFjdG9yeSBmb3IgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0LCB0cnVlKSkKKyAgICB9Cit9CisKK2ZuIGZpZWxkX3R5cGVfdG9fdTgoZmllbGRfdHlwZTogVFR5cGUpIC0+IHU4IHsKKyAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgVFR5cGU6OlN0b3AgPT4gMHgwMCwKKyAgICAgICAgVFR5cGU6OlZvaWQgPT4gMHgwMSwKKyAgICAgICAgVFR5cGU6OkJvb2wgPT4gMHgwMiwKKyAgICAgICAgVFR5cGU6OkkwOCA9PiAweDAzLCAvLyBlcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gMHgwNCwKKyAgICAgICAgVFR5cGU6OkkxNiA9PiAweDA2LAorICAgICAgICBUVHlwZTo6STMyID0+IDB4MDgsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gMHgwQSwKKyAgICAgICAgVFR5cGU6OlN0cmluZyB8IFRUeXBlOjpVdGY3ID0+IDB4MEIsCisgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4gMHgwQywKKyAgICAgICAgVFR5cGU6Ok1hcCA9PiAweDBELAorICAgICAgICBUVHlwZTo6U2V0ID0+IDB4MEUsCisgICAgICAgIFRUeXBlOjpMaXN0ID0+IDB4MEYsCisgICAgICAgIFRUeXBlOjpVdGY4ID0+IDB4MTAsCisgICAgICAgIFRUeXBlOjpVdGYxNiA9PiAweDExLAorICAgIH0KK30KKworZm4gZmllbGRfdHlwZV9mcm9tX3U4KGI6IHU4KSAtPiA6OlJlc3VsdDxUVHlwZT4geworICAgIG1hdGNoIGIgeworICAgICAgICAweDAwID0+IE9rKFRUeXBlOjpTdG9wKSwKKyAgICAgICAgMHgwMSA9PiBPayhUVHlwZTo6Vm9pZCksCisgICAgICAgIDB4MDIgPT4gT2soVFR5cGU6OkJvb2wpLAorICAgICAgICAweDAzID0+IE9rKFRUeXBlOjpJMDgpLCAvLyBFcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIDB4MDQgPT4gT2soVFR5cGU6OkRvdWJsZSksCisgICAgICAgIDB4MDYgPT4gT2soVFR5cGU6OkkxNiksCisgICAgICAgIDB4MDggPT4gT2soVFR5cGU6OkkzMiksCisgICAgICAgIDB4MEEgPT4gT2soVFR5cGU6Okk2NCksCisgICAgICAgIDB4MEIgPT4gT2soVFR5cGU6OlN0cmluZyksIC8vIHRlY2huaWNhbGx5LCBhbHNvIGEgVVRGNywgYnV0IHdlJ2xsIHRyZWF0IGl0IGFzIHN0cmluZworICAgICAgICAweDBDID0+IE9rKFRUeXBlOjpTdHJ1Y3QpLAorICAgICAgICAweDBEID0+IE9rKFRUeXBlOjpNYXApLAorICAgICAgICAweDBFID0+IE9rKFRUeXBlOjpTZXQpLAorICAgICAgICAweDBGID0+IE9rKFRUeXBlOjpMaXN0KSwKKyAgICAgICAgMHgxMCA9PiBPayhUVHlwZTo6VXRmOCksCisgICAgICAgIDB4MTEgPT4gT2soVFR5cGU6OlV0ZjE2KSwKKyAgICAgICAgdW5rbiA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBUVHlwZSIsIHVua24pLAorICAgICAgICB9KSksCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2UgcHJvdG9jb2w6OnsKKyAgICAgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwKKyAgICAgICAgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGUsCisgICAgfTsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7UmVhZEhhbGYsIFRCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RyaWN0X21lc3NhZ2VfY2FsbF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTZdID0gWworICAgICAgICAgICAgMHg4MCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbm9uX3N0cmljdF9tZXNzYWdlX2NhbGxfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoZmFsc2UpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxM10gPSBbCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJpY3RfbWVzc2FnZV9yZXBseV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6UmVwbHksIDEwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxNl0gPSBbCisgICAgICAgICAgICAweDgwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAyLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDBBLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ub25fc3RyaWN0X21lc3NhZ2VfcmVwbHlfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoZmFsc2UpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpSZXBseSwgMTApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDEzXSA9IFsKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMiwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MEEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RyaWN0X21lc3NhZ2VfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJnNlbnRfaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbm9uX3N0cmljdF9tZXNzYWdlX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKGZhbHNlKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmc2VudF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9tZXNzYWdlX2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3RfYmVnaW4oKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSgKKyAgICAgICAgICAgIHxvfCBvLndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3RfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfc3RydWN0X2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9maWVsZF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoInNvbWVfZmllbGQiLCBUVHlwZTo6U3RyaW5nLCAyMikpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDNdID0gWzB4MEIsIDB4MDAsIDB4MTZdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9maWVsZF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgc2VudF9maWVsZF9pZGVudCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMjApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmc2VudF9maWVsZF9pZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2lkZW50ID0gVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6Okk2NCwKKyAgICAgICAgICAgIGlkOiBTb21lKDIwKSwKKyAgICAgICAgfTsgLy8gbm8gbmFtZQorICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmZXhwZWN0ZWRfaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0b3BfZmllbGQoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAwXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfZmllbGRfc3RvcCgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2lkZW50ID0gVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICBpZDogU29tZSgwKSwKKyAgICAgICAgfTsgLy8gd2UgZ2V0IGlkIDAKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmZXhwZWN0ZWRfaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2ZpZWxkX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX2ZpZWxkX2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfbGlzdF9iZWdpbigmVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkJvb2wsIDUpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA1XSA9IFsweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA1XTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TGlzdCwgOTAwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9saXN0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9saXN0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX2xpc3RfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX3NldF9iZWdpbigmVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STE2LCA3KSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNV0gPSBbMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwN107CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJNjQsIDIwMDApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnRfcmVzdWx0ID0gaV9wcm90LnJlYWRfc2V0X2JlZ2luKCk7CisgICAgICAgIGFzc2VydCEocmVjZWl2ZWRfaWRlbnRfcmVzdWx0LmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudF9yZXN1bHQudW53cmFwKCksICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc2V0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX3NldF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJNjQsIFRUeXBlOjpTdHJ1Y3QsIDMyKSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNl0gPSBbMHgwQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMF07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpNYXAsIFRUeXBlOjpTZXQsIDEwMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21hcF9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9tYXBfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2Jvb2xfdHJ1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2Jvb2xfZmFsc2UoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDBdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9ib29sX3RydWUoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgc2V0X3JlYWRhYmxlX2J5dGVzIShpX3Byb3QsICZbMHgwMV0pOworCisgICAgICAgIGxldCByZWFkX2Jvb2wgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2Jvb2wsIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfYm9vbF9mYWxzZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBzZXRfcmVhZGFibGVfYnl0ZXMhKGlfcHJvdCwgJlsweDAwXSk7CisKKyAgICAgICAgbGV0IHJlYWRfYm9vbCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYm9vbCwgZmFsc2UpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FsbG93X2FueV9ub25femVyb192YWx1ZV90b19iZV9pbnRlcnByZXRlZF9hc19ib29sX3RydWUoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgc2V0X3JlYWRhYmxlX2J5dGVzIShpX3Byb3QsICZbMHhBQ10pOworCisgICAgICAgIGxldCByZWFkX2Jvb2wgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2Jvb2wsIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2J5dGVzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBieXRlczogW3U4OyAxMF0gPSBbMHgwQSwgMHhDQywgMHhEMSwgMHg4NCwgMHg5OSwgMHgxMiwgMHhBQiwgMHhCQiwgMHg0NSwgMHhERl07CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYnl0ZXMoJmJ5dGVzKS5pc19vaygpKTsKKworICAgICAgICBsZXQgYnVmID0gb19wcm90LnRyYW5zcG9ydC53cml0ZV9ieXRlcygpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMC4uNF0sIFsweDAwLCAweDAwLCAweDAwLCAweDBBXSk7IC8vIGxlbmd0aAorICAgICAgICBhc3NlcnRfZXEhKCZidWZbNC4uXSwgYnl0ZXMpOyAvLyBhY3R1YWwgYnl0ZXMKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2J5dGVzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBieXRlczogW3U4OyAyNV0gPSBbCisgICAgICAgICAgICAweDIwLAorICAgICAgICAgICAgMHhGRCwKKyAgICAgICAgICAgIDB4MTgsCisgICAgICAgICAgICAweDg0LAorICAgICAgICAgICAgMHg5OSwKKyAgICAgICAgICAgIDB4MTIsCisgICAgICAgICAgICAweEFCLAorICAgICAgICAgICAgMHhCQiwKKyAgICAgICAgICAgIDB4NDUsCisgICAgICAgICAgICAweERGLAorICAgICAgICAgICAgMHgzNCwKKyAgICAgICAgICAgIDB4REMsCisgICAgICAgICAgICAweDk4LAorICAgICAgICAgICAgMHhBNCwKKyAgICAgICAgICAgIDB4NkQsCisgICAgICAgICAgICAweEYzLAorICAgICAgICAgICAgMHg5OSwKKyAgICAgICAgICAgIDB4QjQsCisgICAgICAgICAgICAweEI3LAorICAgICAgICAgICAgMHhENCwKKyAgICAgICAgICAgIDB4OUMsCisgICAgICAgICAgICAweEE1LAorICAgICAgICAgICAgMHhCMywKKyAgICAgICAgICAgIDB4QzksCisgICAgICAgICAgICAweDg4LAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2J5dGVzKCZieXRlcykuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2J5dGVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2J5dGVzKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9ieXRlcywgJmJ5dGVzKTsKKyAgICB9CisKKyAgICBmbiB0ZXN0X29iamVjdHMoCisgICAgICAgIHN0cmljdDogYm9vbCwKKyAgICApIC0+ICgKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2w8UmVhZEhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNDAsIDQwKTsKKworICAgICAgICBsZXQgKHJfbWVtLCB3X21lbSkgPSBtZW0uc3BsaXQoKS51bndyYXAoKTsKKworICAgICAgICBsZXQgaV9wcm90ID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhyX21lbSwgc3RyaWN0KTsKKyAgICAgICAgbGV0IG9fcHJvdCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHdfbWVtLCBzdHJpY3QpOworCisgICAgICAgIChpX3Byb3QsIG9fcHJvdCkKKyAgICB9CisKKyAgICBmbiBhc3NlcnRfbm9fd3JpdGU8Rj4obXV0IHdyaXRlX2ZuOiBGLCBzdHJpY3Q6IGJvb2wpCisgICAgd2hlcmUKKyAgICAgICAgRjogRm5NdXQoJm11dCBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4pIC0+IDo6UmVzdWx0PCgpPiwKKyAgICB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoc3RyaWN0KTsKKyAgICAgICAgYXNzZXJ0ISh3cml0ZV9mbigmbXV0IG9fcHJvdCkuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEob19wcm90LnRyYW5zcG9ydC53cml0ZV9ieXRlcygpLmxlbigpLCAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL2NvbXBhY3QucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL2NvbXBhY3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1ZWRhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvY29tcGFjdC5ycwpAQCAtMCwwICsxLDIzODYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIGJ5dGVvcmRlcjo6e0JpZ0VuZGlhbiwgUmVhZEJ5dGVzRXh0LCBXcml0ZUJ5dGVzRXh0fTsKK3VzZSBpbnRlZ2VyX2VuY29kaW5nOjp7VmFySW50UmVhZGVyLCBWYXJJbnRXcml0ZXJ9OwordXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKK3VzZSBzdGQ6OmlvOwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLAorICAgIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLAorfTsKK3VzZSBzdXBlcjo6e1RPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sRmFjdG9yeSwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07Cit1c2UgdHJhbnNwb3J0Ojp7VFJlYWRUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydH07CisKK2NvbnN0IENPTVBBQ1RfUFJPVE9DT0xfSUQ6IHU4ID0gMHg4MjsKK2NvbnN0IENPTVBBQ1RfVkVSU0lPTjogdTggPSAweDAxOworY29uc3QgQ09NUEFDVF9WRVJTSU9OX01BU0s6IHU4ID0gMHgxRjsKKworLy8vIFJlYWQgbWVzc2FnZXMgZW5jb2RlZCBpbiB0aGUgVGhyaWZ0IGNvbXBhY3QgcHJvdG9jb2wuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQ29tcGFjdElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsKTsKKy8vLworLy8vIGxldCByZWN2ZF9ib29sID0gcHJvdG9jb2wucmVhZF9ib29sKCkudW53cmFwKCk7CisvLy8gbGV0IHJlY3ZkX3N0cmluZyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAvLyBJZGVudGlmaWVyIG9mIHRoZSBsYXN0IGZpZWxkIGRlc2VyaWFsaXplZCBmb3IgYSBzdHJ1Y3QuCisgICAgbGFzdF9yZWFkX2ZpZWxkX2lkOiBpMTYsCisgICAgLy8gU3RhY2sgb2YgdGhlIGxhc3QgcmVhZCBmaWVsZCBpZHMgKGEgbmV3IGVudHJ5IGlzIGFkZGVkIGVhY2ggdGltZSBhIG5lc3RlZCBzdHJ1Y3QgaXMgcmVhZCkuCisgICAgcmVhZF9maWVsZF9pZF9zdGFjazogVmVjPGkxNj4sCisgICAgLy8gQm9vbGVhbiB2YWx1ZSBmb3IgYSBmaWVsZC4KKyAgICAvLyBTYXZlZCBiZWNhdXNlIGJvb2xlYW4gZmllbGRzIGFuZCB0aGVpciB2YWx1ZSBhcmUgZW5jb2RlZCBpbiBhIHNpbmdsZSBieXRlLAorICAgIC8vIGFuZCByZWFkaW5nIHRoZSBmaWVsZCBvbmx5IG9jY3VycyBhZnRlciB0aGUgZmllbGQgaWQgaXMgcmVhZC4KKyAgICBwZW5kaW5nX3JlYWRfYm9vbF92YWx1ZTogT3B0aW9uPGJvb2w+LAorICAgIC8vIFVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIGJ5dGUtbGV2ZWwgb3BlcmF0aW9ucy4KKyAgICB0cmFuc3BvcnQ6IFQsCit9CisKK2ltcGw8VD4gVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RJbnB1dFByb3RvY29sYCB0aGF0IHJlYWRzIGJ5dGVzIGZyb20gYHRyYW5zcG9ydGAuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQpIC0+IFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbCB7CisgICAgICAgICAgICBsYXN0X3JlYWRfZmllbGRfaWQ6IDAsCisgICAgICAgICAgICByZWFkX2ZpZWxkX2lkX3N0YWNrOiBWZWM6Om5ldygpLAorICAgICAgICAgICAgcGVuZGluZ19yZWFkX2Jvb2xfdmFsdWU6IE5vbmUsCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoVFR5cGUsIGkzMik+IHsKKyAgICAgICAgbGV0IGhlYWRlciA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgZWxlbWVudF90eXBlID0gY29sbGVjdGlvbl91OF90b190eXBlKGhlYWRlciAmIDB4MEYpPzsKKworICAgICAgICBsZXQgZWxlbWVudF9jb3VudDsKKyAgICAgICAgbGV0IHBvc3NpYmxlX2VsZW1lbnRfY291bnQgPSAoaGVhZGVyICYgMHhGMCkgPj4gNDsKKyAgICAgICAgaWYgcG9zc2libGVfZWxlbWVudF9jb3VudCAhPSAxNSB7CisgICAgICAgICAgICAvLyBoaWdoIGJpdHMgc2V0IGhpZ2ggaWYgY291bnQgYW5kIHR5cGUgZW5jb2RlZCBzZXBhcmF0ZWx5CisgICAgICAgICAgICBlbGVtZW50X2NvdW50ID0gcG9zc2libGVfZWxlbWVudF9jb3VudCBhcyBpMzI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbGVtZW50X2NvdW50ID0gc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6Ojx1MzI+KCk/IGFzIGkzMjsKKyAgICAgICAgfQorCisgICAgICAgIE9rKChlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgIH0KK30KKworaW1wbDxUPiBUSW5wdXRQcm90b2NvbCBmb3IgVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICBsZXQgY29tcGFjdF9pZCA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBpZiBjb21wYWN0X2lkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQgeworICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJpbnZhbGlkIGNvbXBhY3QgcHJvdG9jb2wgaGVhZGVyIHs6P30iLCBjb21wYWN0X2lkKSwKKyAgICAgICAgICAgIH0pKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB0eXBlX2FuZF9ieXRlID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCByZWNlaXZlZF92ZXJzaW9uID0gdHlwZV9hbmRfYnl0ZSAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLOworICAgICAgICBpZiByZWNlaXZlZF92ZXJzaW9uICE9IENPTVBBQ1RfVkVSU0lPTiB7CisgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcHJvY2VzcyBjb21wYWN0IHByb3RvY29sIHZlcnNpb24gezo/fSIsCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkX3ZlcnNpb24KKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgfT87CisKKyAgICAgICAgLy8gTk9URTogdW5zaWduZWQgcmlnaHQgc2hpZnQgd2lsbCBwYWQgd2l0aCAwcworICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUgPSBUTWVzc2FnZVR5cGU6OnRyeV9mcm9tKHR5cGVfYW5kX2J5dGUgPj4gNSk/OworICAgICAgICBsZXQgc2VxdWVuY2VfbnVtYmVyID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgbGV0IHNlcnZpY2VfY2FsbF9uYW1lID0gc2VsZi5yZWFkX3N0cmluZygpPzsKKworICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IDA7CisKKyAgICAgICAgT2soVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICBzZXJ2aWNlX2NhbGxfbmFtZSwKKyAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgIHNlcXVlbmNlX251bWJlciwKKyAgICAgICAgKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PiB7CisgICAgICAgIHNlbGYucmVhZF9maWVsZF9pZF9zdGFjay5wdXNoKHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkKTsKKyAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSAwOworICAgICAgICBPayhOb25lKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gc2VsZgorICAgICAgICAgICAgLnJlYWRfZmllbGRfaWRfc3RhY2sKKyAgICAgICAgICAgIC5wb3AoKQorICAgICAgICAgICAgLmV4cGVjdCgic2hvdWxkIGhhdmUgcHJldmlvdXMgZmllbGQgaWRzIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgIC8vIHdlIGNhbiByZWFkIGF0IGxlYXN0IG9uZSBieXRlLCB3aGljaCBpczoKKyAgICAgICAgLy8gLSB0aGUgdHlwZQorICAgICAgICAvLyAtIHRoZSBmaWVsZCBkZWx0YSBhbmQgdGhlIHR5cGUKKyAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IGZpZWxkX2RlbHRhID0gKGZpZWxkX3R5cGUgJiAweEYwKSA+PiA0OworICAgICAgICBsZXQgZmllbGRfdHlwZSA9IG1hdGNoIGZpZWxkX3R5cGUgJiAweDBGIHsKKyAgICAgICAgICAgIDB4MDEgPT4geworICAgICAgICAgICAgICAgIHNlbGYucGVuZGluZ19yZWFkX2Jvb2xfdmFsdWUgPSBTb21lKHRydWUpOworICAgICAgICAgICAgICAgIE9rKFRUeXBlOjpCb29sKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgMHgwMiA9PiB7CisgICAgICAgICAgICAgICAgc2VsZi5wZW5kaW5nX3JlYWRfYm9vbF92YWx1ZSA9IFNvbWUoZmFsc2UpOworICAgICAgICAgICAgICAgIE9rKFRUeXBlOjpCb29sKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHR1OCA9PiB1OF90b190eXBlKHR0dTgpLAorICAgICAgICB9PzsKKworICAgICAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpTdG9wID0+IE9rKAorICAgICAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXI6Om5ldzo6PE9wdGlvbjxTdHJpbmc+LCBTdHJpbmcsIE9wdGlvbjxpMTY+PigKKyAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICBpZiBmaWVsZF9kZWx0YSAhPSAwIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgKz0gZmllbGRfZGVsdGEgYXMgaTE2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gc2VsZi5yZWFkX2kxNigpPzsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgT2soVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIGlkOiBTb21lKHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPiB7CisgICAgICAgIG1hdGNoIHNlbGYucGVuZGluZ19yZWFkX2Jvb2xfdmFsdWUudGFrZSgpIHsKKyAgICAgICAgICAgIFNvbWUoYikgPT4gT2soYiksCisgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgYiA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICAgICAgICAgIG1hdGNoIGIgeworICAgICAgICAgICAgICAgICAgICAweDAxID0+IE9rKHRydWUpLAorICAgICAgICAgICAgICAgICAgICAweDAyID0+IE9rKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgdW5rbiA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gaW50byBib29sIiwgdW5rbiksCisgICAgICAgICAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBsZXQgbGVuID0gc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6Ojx1MzI+KCk/OworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyBsZW4gYXMgdXNpemVdOworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLnJlYWRfZXhhY3QoJm11dCBidWYpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgYnVmKQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICBzZWxmLnJlYWRfYnl0ZSgpLm1hcCh8aXwgaSBhcyBpOCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PGkxNj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6OjxpMzI+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8aTY0PigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2Y2NDo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgbGV0IGJ5dGVzID0gc2VsZi5yZWFkX2J5dGVzKCk/OworICAgICAgICBTdHJpbmc6OmZyb21fdXRmOChieXRlcykubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgKGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkgPSBzZWxmLnJlYWRfbGlzdF9zZXRfYmVnaW4oKT87CisgICAgICAgIE9rKFRMaXN0SWRlbnRpZmllcjo6bmV3KGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IChlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpID0gc2VsZi5yZWFkX2xpc3Rfc2V0X2JlZ2luKCk/OworICAgICAgICBPayhUU2V0SWRlbnRpZmllcjo6bmV3KGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj4geworICAgICAgICBsZXQgZWxlbWVudF9jb3VudCA9IHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8dTMyPigpPyBhcyBpMzI7CisgICAgICAgIGlmIGVsZW1lbnRfY291bnQgPT0gMCB7CisgICAgICAgICAgICBPayhUTWFwSWRlbnRpZmllcjo6bmV3KE5vbmUsIE5vbmUsIDApKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGV0IHR5cGVfaGVhZGVyID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgICAgICBsZXQga2V5X3R5cGUgPSBjb2xsZWN0aW9uX3U4X3RvX3R5cGUoKHR5cGVfaGVhZGVyICYgMHhGMCkgPj4gNCk/OworICAgICAgICAgICAgbGV0IHZhbF90eXBlID0gY29sbGVjdGlvbl91OF90b190eXBlKHR5cGVfaGVhZGVyICYgMHgwRik/OworICAgICAgICAgICAgT2soVE1hcElkZW50aWZpZXI6Om5ldyhrZXlfdHlwZSwgdmFsX3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICBsZXQgbXV0IGJ1ZiA9IFswdTg7IDFdOworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLnJlYWRfZXhhY3QoJm11dCBidWYpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgYnVmWzBdKQorICAgIH0KK30KKworaW1wbDxUPiBpbzo6U2VlayBmb3IgVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IGlvOjpTZWVrICsgVFJlYWRUcmFuc3BvcnQsCit7CisgICAgZm4gc2VlaygmbXV0IHNlbGYsIHBvczogaW86OlNlZWtGcm9tKSAtPiBpbzo6UmVzdWx0PHU2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5zZWVrKHBvcykKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRDb21wYWN0SW5wdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUSW5wdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQpKQorICAgIH0KK30KKworLy8vIFdyaXRlIG1lc3NhZ2VzIHVzaW5nIHRoZSBUaHJpZnQgY29tcGFjdCBwcm90b2NvbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRDb21wYWN0T3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsKTsKKy8vLworLy8vIHByb3RvY29sLndyaXRlX2Jvb2wodHJ1ZSkudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfc3RyaW5nKCJ0ZXN0X3N0cmluZyIpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICAvLyBJZGVudGlmaWVyIG9mIHRoZSBsYXN0IGZpZWxkIHNlcmlhbGl6ZWQgZm9yIGEgc3RydWN0LgorICAgIGxhc3Rfd3JpdGVfZmllbGRfaWQ6IGkxNiwKKyAgICAvLyBTdGFjayBvZiB0aGUgbGFzdCB3cml0dGVuIGZpZWxkIGlkcyAobmV3IGVudHJ5IGFkZGVkIGVhY2ggdGltZSBhIG5lc3RlZCBzdHJ1Y3QgaXMgd3JpdHRlbikuCisgICAgd3JpdGVfZmllbGRfaWRfc3RhY2s6IFZlYzxpMTY+LAorICAgIC8vIEZpZWxkIGlkZW50aWZpZXIgb2YgdGhlIGJvb2xlYW4gZmllbGQgdG8gYmUgd3JpdHRlbi4KKyAgICAvLyBTYXZlZCBiZWNhdXNlIGJvb2xlYW4gZmllbGRzIGFuZCB0aGVpciB2YWx1ZSBhcmUgZW5jb2RlZCBpbiBhIHNpbmdsZSBieXRlCisgICAgcGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXI6IE9wdGlvbjxURmllbGRJZGVudGlmaWVyPiwKKyAgICAvLyBVbmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciBieXRlLWxldmVsIG9wZXJhdGlvbnMuCisgICAgdHJhbnNwb3J0OiBULAorfQorCitpbXBsPFQ+IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RPdXRwdXRQcm90b2NvbGAgdGhhdCB3cml0ZXMgYnl0ZXMgdG8gYHRyYW5zcG9ydGAuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQpIC0+IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIGxhc3Rfd3JpdGVfZmllbGRfaWQ6IDAsCisgICAgICAgICAgICB3cml0ZV9maWVsZF9pZF9zdGFjazogVmVjOjpuZXcoKSwKKyAgICAgICAgICAgIHBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyOiBOb25lLAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRTogZmllbGRfdHlwZSBhcyB1bmNvbnN0cmFpbmVkIHU4IGlzIGJhZAorICAgIGZuIHdyaXRlX2ZpZWxkX2hlYWRlcigmbXV0IHNlbGYsIGZpZWxkX3R5cGU6IHU4LCBmaWVsZF9pZDogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgZmllbGRfZGVsdGEgPSBmaWVsZF9pZCAtIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZDsKKyAgICAgICAgaWYgZmllbGRfZGVsdGEgPiAwICYmIGZpZWxkX2RlbHRhIDwgMTUgeworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKCgoZmllbGRfZGVsdGEgYXMgdTgpIDw8IDQpIHwgZmllbGRfdHlwZSk/OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGUpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTE2KGZpZWxkX2lkKT87CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkID0gZmllbGRfaWQ7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3Rfc2V0X2JlZ2luKCZtdXQgc2VsZiwgZWxlbWVudF90eXBlOiBUVHlwZSwgZWxlbWVudF9jb3VudDogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgZWxlbV9pZGVudGlmaWVyID0gY29sbGVjdGlvbl90eXBlX3RvX3U4KGVsZW1lbnRfdHlwZSk7CisgICAgICAgIGlmIGVsZW1lbnRfY291bnQgPD0gMTQgeworICAgICAgICAgICAgbGV0IGhlYWRlciA9IChlbGVtZW50X2NvdW50IGFzIHU4KSA8PCA0IHwgZWxlbV9pZGVudGlmaWVyOworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKGhlYWRlcikKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCBoZWFkZXIgPSAweEYwIHwgZWxlbV9pZGVudGlmaWVyOworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKGhlYWRlcik/OworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAud3JpdGVfdmFyaW50KGVsZW1lbnRfY291bnQgYXMgdTMyKQorICAgICAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBhc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCZzZWxmKSB7CisgICAgICAgIGlmIGxldCBTb21lKHJlZiBmKSA9IHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIgeworICAgICAgICAgICAgcGFuaWMhKCJwZW5kaW5nIGJvb2wgZmllbGQgezo/fSBub3Qgd3JpdHRlbiIsIGYpCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8VD4gVE91dHB1dFByb3RvY29sIGZvciBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKENPTVBBQ1RfUFJPVE9DT0xfSUQpPzsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKCh1ODo6ZnJvbShpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZSkgPDwgNSkgfCBDT01QQUNUX1ZFUlNJT04pPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zZXF1ZW5jZV9udW1iZXIpPzsKKyAgICAgICAgc2VsZi53cml0ZV9zdHJpbmcoJmlkZW50aWZpZXIubmFtZSk/OworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBfOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfZmllbGRfaWRfc3RhY2sucHVzaChzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQpOworICAgICAgICBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQgPSAwOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCA9IHNlbGYKKyAgICAgICAgICAgIC53cml0ZV9maWVsZF9pZF9zdGFjaworICAgICAgICAgICAgLnBvcCgpCisgICAgICAgICAgICAuZXhwZWN0KCJzaG91bGQgaGF2ZSBwcmV2aW91cyBmaWVsZCBpZHMiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbWF0Y2ggaWRlbnRpZmllci5maWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpCb29sID0+IHsKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyLmlzX3NvbWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHBhbmljISgKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgbm90IGhhdmUgYSBwZW5kaW5nIGJvb2wgd2hpbGUgd3JpdGluZyBhbm90aGVyIGJvb2wgd2l0aCBpZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgIHs6P30iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIgPSBTb21lKGlkZW50aWZpZXIuY2xvbmUoKSk7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfdHlwZSA9IHR5cGVfdG9fdTgoaWRlbnRpZmllci5maWVsZF90eXBlKTsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfaWQgPSBpZGVudGlmaWVyLmlkLmV4cGVjdCgibm9uLXN0b3AgZmllbGQgc2hvdWxkIGhhdmUgZmllbGQgaWQiKTsKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2ZpZWxkX2hlYWRlcihmaWVsZF90eXBlLCBmaWVsZF9pZCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZSh0eXBlX3RvX3U4KFRUeXBlOjpTdG9wKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbWF0Y2ggc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllci50YWtlKCkgeworICAgICAgICAgICAgU29tZShwZW5kaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX2lkID0gcGVuZGluZy5pZC5leHBlY3QoImJvb2wgZmllbGQgc2hvdWxkIGhhdmUgYSBmaWVsZCBpZCIpOworICAgICAgICAgICAgICAgIGxldCBmaWVsZF90eXBlX2FzX3U4ID0gaWYgYiB7IDB4MDEgfSBlbHNlIHsgMHgwMiB9OworICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfZmllbGRfaGVhZGVyKGZpZWxkX3R5cGVfYXNfdTgsIGZpZWxkX2lkKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgaWYgYiB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgweDAxKQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgweDAyKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3ZhcmludChiLmxlbigpIGFzIHUzMik/OworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9hbGwoYikubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShpIGFzIHU4KQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC53cml0ZV92YXJpbnQoaSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAud3JpdGVfdmFyaW50KGkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLndyaXRlX3ZhcmludChpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfZjY0Ojo8QmlnRW5kaWFuPihkKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlcyhzLmFzX2J5dGVzKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfbGlzdF9zZXRfYmVnaW4oaWRlbnRpZmllci5lbGVtZW50X3R5cGUsIGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9saXN0X3NldF9iZWdpbihpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSwgaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGlkZW50aWZpZXIuc2l6ZSA9PSAwIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgwKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdmFyaW50KGlkZW50aWZpZXIuc2l6ZSBhcyB1MzIpPzsKKworICAgICAgICAgICAgbGV0IGtleV90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgICAgIC5rZXlfdHlwZQorICAgICAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIGtleSB0eXBlIik7CisgICAgICAgICAgICBsZXQga2V5X3R5cGVfYnl0ZSA9IGNvbGxlY3Rpb25fdHlwZV90b191OChrZXlfdHlwZSkgPDwgNDsKKworICAgICAgICAgICAgbGV0IHZhbF90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgICAgIC52YWx1ZV90eXBlCisgICAgICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4gdmFsdWUgdHlwZSIpOworICAgICAgICAgICAgbGV0IHZhbF90eXBlX2J5dGUgPSBjb2xsZWN0aW9uX3R5cGVfdG9fdTgodmFsX3R5cGUpOworCisgICAgICAgICAgICBsZXQgbWFwX3R5cGVfaGVhZGVyID0ga2V5X3R5cGVfYnl0ZSB8IHZhbF90eXBlX2J5dGU7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUobWFwX3R5cGVfaGVhZGVyKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKCZbYl0pLm1hcF9lcnIoRnJvbTo6ZnJvbSkubWFwKHxffCAoKSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRDb21wYWN0T3V0cHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCkpCisgICAgfQorfQorCitmbiBjb2xsZWN0aW9uX3R5cGVfdG9fdTgoZmllbGRfdHlwZTogVFR5cGUpIC0+IHU4IHsKKyAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgVFR5cGU6OkJvb2wgPT4gMHgwMSwKKyAgICAgICAgZiA9PiB0eXBlX3RvX3U4KGYpLAorICAgIH0KK30KKworZm4gdHlwZV90b191OChmaWVsZF90eXBlOiBUVHlwZSkgLT4gdTggeworICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICBUVHlwZTo6U3RvcCA9PiAweDAwLAorICAgICAgICBUVHlwZTo6STA4ID0+IDB4MDMsIC8vIGVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgVFR5cGU6OkkxNiA9PiAweDA0LAorICAgICAgICBUVHlwZTo6STMyID0+IDB4MDUsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gMHgwNiwKKyAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiAweDA3LAorICAgICAgICBUVHlwZTo6U3RyaW5nID0+IDB4MDgsCisgICAgICAgIFRUeXBlOjpMaXN0ID0+IDB4MDksCisgICAgICAgIFRUeXBlOjpTZXQgPT4gMHgwQSwKKyAgICAgICAgVFR5cGU6Ok1hcCA9PiAweDBCLAorICAgICAgICBUVHlwZTo6U3RydWN0ID0+IDB4MEMsCisgICAgICAgIF8gPT4gcGFuaWMhKGZvcm1hdCEoCisgICAgICAgICAgICAic2hvdWxkIG5vdCBoYXZlIGF0dGVtcHRlZCB0byBjb252ZXJ0IHt9IHRvIHU4IiwKKyAgICAgICAgICAgIGZpZWxkX3R5cGUKKyAgICAgICAgKSksCisgICAgfQorfQorCitmbiBjb2xsZWN0aW9uX3U4X3RvX3R5cGUoYjogdTgpIC0+IDo6UmVzdWx0PFRUeXBlPiB7CisgICAgbWF0Y2ggYiB7CisgICAgICAgIDB4MDEgPT4gT2soVFR5cGU6OkJvb2wpLAorICAgICAgICBvID0+IHU4X3RvX3R5cGUobyksCisgICAgfQorfQorCitmbiB1OF90b190eXBlKGI6IHU4KSAtPiA6OlJlc3VsdDxUVHlwZT4geworICAgIG1hdGNoIGIgeworICAgICAgICAweDAwID0+IE9rKFRUeXBlOjpTdG9wKSwKKyAgICAgICAgMHgwMyA9PiBPayhUVHlwZTo6STA4KSwgLy8gZXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICAweDA0ID0+IE9rKFRUeXBlOjpJMTYpLAorICAgICAgICAweDA1ID0+IE9rKFRUeXBlOjpJMzIpLAorICAgICAgICAweDA2ID0+IE9rKFRUeXBlOjpJNjQpLAorICAgICAgICAweDA3ID0+IE9rKFRUeXBlOjpEb3VibGUpLAorICAgICAgICAweDA4ID0+IE9rKFRUeXBlOjpTdHJpbmcpLAorICAgICAgICAweDA5ID0+IE9rKFRUeXBlOjpMaXN0KSwKKyAgICAgICAgMHgwQSA9PiBPayhUVHlwZTo6U2V0KSwKKyAgICAgICAgMHgwQiA9PiBPayhUVHlwZTo6TWFwKSwKKyAgICAgICAgMHgwQyA9PiBPayhUVHlwZTo6U3RydWN0KSwKKyAgICAgICAgdW5rbiA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gaW50byBUVHlwZSIsIHVua24pLAorICAgICAgICB9KSksCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2UgcHJvdG9jb2w6OnsKKyAgICAgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwKKyAgICAgICAgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGUsCisgICAgfTsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7UmVhZEhhbGYsIFRCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9iZWdpbl8wKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgICJmb28iLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsLAorICAgICAgICAgICAgNDMxCisgICAgICAgICkpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgOF0gPSBbCisgICAgICAgICAgICAweDgyLCAvKiBwcm90b2NvbCBJRCAqLworICAgICAgICAgICAgMHgyMSwgLyogbWVzc2FnZSB0eXBlIHwgcHJvdG9jb2wgdmVyc2lvbiAqLworICAgICAgICAgICAgMHhERSwKKyAgICAgICAgICAgIDB4MDYsIC8qIHppZy16YWcgdmFyaW50IHNlcXVlbmNlIG51bWJlciAqLworICAgICAgICAgICAgMHgwMywgLyogbWVzc2FnZS1uYW1lIGxlbmd0aCAqLworICAgICAgICAgICAgMHg2NiwKKyAgICAgICAgICAgIDB4NkYsCisgICAgICAgICAgICAweDZGIC8qICJmb28iICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2JlZ2luXzEoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgImJhciIsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OlJlcGx5LAorICAgICAgICAgICAgOTkxODI4CisgICAgICAgICkpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgOV0gPSBbCisgICAgICAgICAgICAweDgyLCAvKiBwcm90b2NvbCBJRCAqLworICAgICAgICAgICAgMHg0MSwgLyogbWVzc2FnZSB0eXBlIHwgcHJvdG9jb2wgdmVyc2lvbiAqLworICAgICAgICAgICAgMHhBOCwKKyAgICAgICAgICAgIDB4ODksCisgICAgICAgICAgICAweDc5LCAvKiB6aWctemFnIHZhcmludCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICAgIDB4MDMsIC8qIG1lc3NhZ2UtbmFtZSBsZW5ndGggKi8KKyAgICAgICAgICAgIDB4NjIsCisgICAgICAgICAgICAweDYxLAorICAgICAgICAgICAgMHg3MiAvKiAiYmFyIiAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tZXNzYWdlX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInNlcnZpY2VfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTI4Mzk0OCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWVzc2FnZV9lbmQoKSk7CisgICAgfQorCisgICAgLy8gTk9URTogc3RydWN0cyBhbmQgZmllbGRzIGFyZSB0ZXN0ZWQgdG9nZXRoZXIKKyAgICAvLworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X3dpdGhfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCB0aW55IGZpZWxkIGlkcworICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIHNtYWxsIHRoZSBmaWVsZCBpZHMgd2lsbCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIChhbmQgaXQncyB6ZXJvKSBpdCBnZXRzIHRoZSBmdWxsIHZhcmludCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STE2LCA0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okxpc3QsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA1XSA9IFsKKyAgICAgICAgICAgIDB4MDMsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpcnN0IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDQ0LCAvKiBmaWVsZCBkZWx0YSAoNCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDU5LCAvKiBmaWVsZCBkZWx0YSAoNSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCB0aW55IGZpZWxkIGlkcworICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIHNtYWxsIHRoZSBmaWVsZCBpZHMgd2lsbCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIChhbmQgaXQncyB6ZXJvKSBpdCBnZXRzIHRoZSBmdWxsIHZhcmludCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkxNiwgNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okxpc3QsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X3dpdGhfbm9uX3plcm9faW5pdGlhbF9maWVsZF9hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCB0aW55IGZpZWxkIGlkcworICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIHNtYWxsIHRoZSBmaWVsZCBpZHMgd2lsbCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgNikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDRdID0gWworICAgICAgICAgICAgMHgxNSwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgxQSwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg0OCwgLyogZmllbGQgZGVsdGEgKDQpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cnVjdF93aXRoX25vbl96ZXJvX2luaXRpYWxfZmllbGRfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDYpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X3dpdGhfbG9uZ19maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIChhbmQgaXQncyB6ZXJvKSBpdCBnZXRzIHRoZSBmdWxsIHZhcmludCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxNikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDk5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgOF0gPSBbCisgICAgICAgICAgICAweDA1LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaXJzdCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwNiwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyMCwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MEEsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4QzYsCisgICAgICAgICAgICAweDAxLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cnVjdF93aXRoX2xvbmdfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDE2KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCA5OSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9taXhfb2ZfbG9uZ19hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAxMDAwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBvbmx5IDMgdXAgZnJvbSB0aGUgcHJldmlvdXMgaXQgaXMgcmVjb3JkZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIwMDQpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxMF0gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDg1LCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDBBLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweEQwLAorICAgICAgICAgICAgMHgwRiwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MEEsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4QTIsCisgICAgICAgICAgICAweDFGLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgzQSwgLyogZmllbGQgZGVsdGEgKDMpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cnVjdF93aXRoX21peF9vZl9sb25nX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJnN0cnVjdF9pZGVudCkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDEwMDApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIwMDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgb25seSAzIHVwIGZyb20gdGhlIHByZXZpb3VzIGl0IGlzIHJlY29yZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzUgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIwMDQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF81KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF81CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMCgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBkZWx0YQorCisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDg1LCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDczLCAvKiBmaWVsZCBkZWx0YSAoNykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA3LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDMwLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMCwgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5lZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmluZyAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9uZXN0ZWRfc3RydWN0c18wKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGRlbHRhCisKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluaW5nIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluZWQgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzcgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzcsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18xKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNykpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4ODUsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDcsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MzAsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDMzLCAvKiBmaWVsZCBkZWx0YSAoMykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzEoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorCisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzIoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBkZWx0YSB3cml0ZQorCisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgNykpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDEwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwOCwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyQSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4NzcsIC8qIGZpZWxkIGRlbHRhKDcpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgzMywgLyogZmllbGQgZGVsdGEgKDMpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5lZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmluZyAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9uZXN0ZWRfc3RydWN0c18yKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDEwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluaW5nIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluZWQgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzcgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzcsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18zKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorCisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNykpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA4XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDgsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MkEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDA3LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDJBLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHg2MywgLyogZmllbGQgZGVsdGEgKDYpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5lZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmluZyAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9uZXN0ZWRfc3RydWN0c18zKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorCisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluaW5nIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluZWQgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzcgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzcsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ib29sX2ZpZWxkKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE2IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAyNikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDQ1KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxMSwgLyogZmllbGQgZGVsdGEgKDEpIHwgdHJ1ZSAqLworICAgICAgICAgICAgMHg4MiwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmFsc2UgKi8KKyAgICAgICAgICAgIDB4MDEsIC8qIHRydWUgKi8KKyAgICAgICAgICAgIDB4MzQsIC8qIGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAyLCAvKiBmYWxzZSAqLworICAgICAgICAgICAgMHg1QSwgLyogZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogc3RvcCBmaWVsZCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9ib29sX2ZpZWxkKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpKTsKKworICAgICAgICAvLyB3cml0ZSB0d28gZmllbGRzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNiBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMjYpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDQ1KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfMSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzIsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfMywgdHJ1ZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzQsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF81ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF81LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX2ZpZWxkX2VuZF93aXRob3V0X3dyaXRpbmdfYm9vbF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgb19wcm90LndyaXRlX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfc3RvcF9maWVsZF93aXRob3V0X3dyaXRpbmdfYm9vbF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgb19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX3N0cnVjdF9lbmRfd2l0aG91dF93cml0aW5nX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9zdHJ1Y3RfZW5kX3dpdGhvdXRfYW55X2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2ZpZWxkX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX2ZpZWxkX2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zbWFsbF9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STY0LCA0KSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDQ2IC8qIHNpemUgfCBlbGVtX3R5cGUgKi9dOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3NtYWxsX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STA4LCAxMCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xhcmdlX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgcmVzID0gb19wcm90LndyaXRlX2xpc3RfYmVnaW4oJlRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpMaXN0LCA5OTk5KSk7CisgICAgICAgIGFzc2VydCEocmVzLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAzXSA9IFsKKyAgICAgICAgICAgIDB4RjksIC8qIDB4RjAgfCBlbGVtX3R5cGUgKi8KKyAgICAgICAgICAgIDB4OEYsIDB4NEUsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbGFyZ2Vfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpTZXQsIDQ3MzgxKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9saXN0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGlzdF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9saXN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zbWFsbF9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6U3RydWN0LCAyKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDJDIC8qIHNpemUgfCBlbGVtX3R5cGUgKi9dOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3NtYWxsX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkkxNiwgNyk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zZXRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9sYXJnZV9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6RG91YmxlLCAyMzg5MSkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNF0gPSBbCisgICAgICAgICAgICAweEY3LCAvKiAweEYwIHwgZWxlbV90eXBlICovCisgICAgICAgICAgICAweEQzLCAweEJBLCAweDAxLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2xhcmdlX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6Ok1hcCwgMzkyODQyOSk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zZXRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zZXRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfc2V0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV96ZXJvX3NpemVkX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpTdHJpbmcsIFRUeXBlOjpJMzIsIDApKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDBdOyAvLyBzaW5jZSBzaXplIGlzIHplcm8gd2UgZG9uJ3Qgd3JpdGUgYW55dGhpbmcKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF96ZXJvX3NpemVkX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpEb3VibGUsIFRUeXBlOjpJMzIsIDApKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICAmcmVzLAorICAgICAgICAgICAgJlRNYXBJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBrZXlfdHlwZTogTm9uZSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBOb25lLAorICAgICAgICAgICAgICAgIHNpemU6IDAsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICBUVHlwZTo6RG91YmxlLAorICAgICAgICAgICAgVFR5cGU6OlN0cmluZywKKyAgICAgICAgICAgIDIzOAorICAgICAgICApKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDNdID0gWworICAgICAgICAgICAgMHhFRSwgMHgwMSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgICAgIDB4NzgsIC8qIGtleSB0eXBlIHwgdmFsIHR5cGUgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpNYXAsIFRUeXBlOjpMaXN0LCAxOTI4MzQ5KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9tYXBfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF93aXRoX2Jvb2xfa2V5X2FuZF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpCb29sLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2VuZCgpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNF0gPSBbCisgICAgICAgICAgICAweDAxLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICAgICAgMHgxMSwgLyoga2V5IHR5cGUgfCB2YWwgdHlwZSAqLworICAgICAgICAgICAgMHgwMSwgLyoga2V5OiB0cnVlICovCisgICAgICAgICAgICAweDAyLCAvKiB2YWw6IGZhbHNlICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWFwX3dpdGhfYm9vbF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBtYXBfaWRlbnQgPSBUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpCb29sLCBUVHlwZTo6Qm9vbCwgMik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZtYXBfaWRlbnQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gbWFwIGhlYWRlcgorICAgICAgICBsZXQgcmN2ZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJjdmRfaWRlbnQsICZtYXBfaWRlbnQpOworICAgICAgICAvLyBrZXkgMQorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIHRydWUpOworICAgICAgICAvLyB2YWwgMQorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIGZhbHNlKTsKKyAgICAgICAgLy8ga2V5IDIKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCBmYWxzZSk7CisgICAgICAgIC8vIHZhbCAyCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgdHJ1ZSk7CisgICAgICAgIC8vIG1hcCBlbmQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tYXBfZW5kKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydCEoaV9wcm90LnJlYWRfbWFwX2VuZCgpLmlzX29rKCkpOyAvLyB3aWxsIGJsb3cgdXAgaWYgd2UgdHJ5IHRvIHJlYWQgZnJvbSBlbXB0eSBidWZmZXIKKyAgICB9CisKKyAgICBmbiB0ZXN0X29iamVjdHMoKSAtPiAoCisgICAgICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbDxSZWFkSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoODAsIDgwKTsKKworICAgICAgICBsZXQgKHJfbWVtLCB3X21lbSkgPSBtZW0uc3BsaXQoKS51bndyYXAoKTsKKworICAgICAgICBsZXQgaV9wcm90ID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcocl9tZW0pOworICAgICAgICBsZXQgb19wcm90ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHdfbWVtKTsKKworICAgICAgICAoaV9wcm90LCBvX3Byb3QpCisgICAgfQorCisgICAgZm4gYXNzZXJ0X25vX3dyaXRlPEY+KG11dCB3cml0ZV9mbjogRikKKyAgICB3aGVyZQorICAgICAgICBGOiBGbk11dCgmbXV0IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4pIC0+IDo6UmVzdWx0PCgpPiwKKyAgICB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0ISh3cml0ZV9mbigmbXV0IG9fcHJvdCkuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEob19wcm90LnRyYW5zcG9ydC53cml0ZV9ieXRlcygpLmxlbigpLCAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL21vZC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvbW9kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzAyODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL21vZC5ycwpAQCAtMCwwICsxLDk2OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVHlwZXMgdXNlZCB0byBzZW5kIGFuZCByZWNlaXZlIHByaW1pdGl2ZXMgYmV0d2VlbiBhIFRocmlmdCBjbGllbnQgYW5kIHNlcnZlci4KKy8vIQorLy8hICMgRXhhbXBsZXMKKy8vIQorLy8hIENyZWF0ZSBhbmQgdXNlIGEgYFRJbnB1dFByb3RvY29sYC4KKy8vIQorLy8hIGBgYG5vX3J1bgorLy8hIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sfTsKKy8vISB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBJL08gY2hhbm5lbAorLy8hIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vISBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIHByb3RvY29sIHRvIGRlY29kZSBieXRlcyBpbnRvIHR5cGVzCisvLyEgbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLyEKKy8vISAvLyByZWFkIHR5cGVzIGZyb20gdGhlIHdpcmUKKy8vISBsZXQgZmllbGRfaWRlbnRpZmllciA9IHByb3RvY29sLnJlYWRfZmllbGRfYmVnaW4oKS51bndyYXAoKTsKKy8vISBsZXQgZmllbGRfY29udGVudHMgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8hIGxldCBmaWVsZF9lbmQgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8hIGBgYAorLy8hCisvLyEgQ3JlYXRlIGFuZCB1c2UgYSBgVE91dHB1dFByb3RvY29sYC4KKy8vIQorLy8hIGBgYG5vX3J1bgorLy8hIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBURmllbGRJZGVudGlmaWVyLCBUT3V0cHV0UHJvdG9jb2wsIFRUeXBlfTsKKy8vISB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBJL08gY2hhbm5lbAorLy8hIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vISBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIHByb3RvY29sIHRvIGVuY29kZSB0eXBlcyBpbnRvIGJ5dGVzCisvLyEgbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8hCisvLyEgLy8gd3JpdGUgdHlwZXMKKy8vISBwcm90b2NvbC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJzdHJpbmdfdGhpbmciLCBUVHlwZTo6U3RyaW5nLCAxKSkudW53cmFwKCk7CisvLyEgcHJvdG9jb2wud3JpdGVfc3RyaW5nKCJmb28iKS51bndyYXAoKTsKKy8vISBwcm90b2NvbC53cml0ZV9maWVsZF9lbmQoKS51bndyYXAoKTsKKy8vISBgYGAKKwordXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKK3VzZSBzdGQ6OmZtdDsKK3VzZSBzdGQ6OmZtdDo6e0Rpc3BsYXksIEZvcm1hdHRlcn07Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKK3VzZSB7UHJvdG9jb2xFcnJvciwgUHJvdG9jb2xFcnJvcktpbmR9OworCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyB7CisgICAgKCRvX3Byb3Q6aWRlbnQsICRleHBlY3RlZF9ieXRlczppZGVudCkgPT4ge3sKKyAgICAgICAgYXNzZXJ0X2VxISgkb19wcm90LnRyYW5zcG9ydC53cml0ZV9ieXRlcygpLCAmJGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9fTsKK30KKworLy8gRklYTUU6IHNob3VsZCB0YWtlIGJvdGggcmVhZCBhbmQgd3JpdGUKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIHsKKyAgICAoJG9fcHJvdDppZGVudCkgPT4ge3sKKyAgICAgICAgJG9fcHJvdC50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICB9fTsKK30KKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgc2V0X3JlYWRhYmxlX2J5dGVzIHsKKyAgICAoJGlfcHJvdDppZGVudCwgJGJ5dGVzOmV4cHIpID0+IHsKKyAgICAgICAgJGlfcHJvdC50cmFuc3BvcnQuc2V0X3JlYWRhYmxlX2J5dGVzKCRieXRlcyk7CisgICAgfTsKK30KKworbW9kIGJpbmFyeTsKK21vZCBjb21wYWN0OworbW9kIG11bHRpcGxleGVkOworbW9kIHN0b3JlZDsKKworcHViIHVzZSBzZWxmOjpiaW5hcnk6OnsKKyAgICBUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsCisgICAgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6OmNvbXBhY3Q6OnsKKyAgICBUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnksIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wsCisgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjptdWx0aXBsZXhlZDo6VE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w7CitwdWIgdXNlIHNlbGY6OnN0b3JlZDo6VFN0b3JlZElucHV0UHJvdG9jb2w7CisKKy8vIERlZmF1bHQgbWF4aW11bSBkZXB0aCB0byB3aGljaCBgVElucHV0UHJvdG9jb2w6OnNraXBgIHdpbGwgc2tpcCBhIFRocmlmdAorLy8gZmllbGQuIEEgZGVmYXVsdCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBUaHJpZnQgc3RydWN0cyBvciBjb2xsZWN0aW9ucyBtYXkKKy8vIGNvbnRhaW4gbmVzdGVkIHN0cnVjdHMgYW5kIGNvbGxlY3Rpb25zLCB3aGljaCBjb3VsZCByZXN1bHQgaW4gaW5kZWZpbml0ZQorLy8gcmVjdXJzaW9uLgorY29uc3QgTUFYSU1VTV9TS0lQX0RFUFRIOiBpOCA9IDY0OworCisvLy8gQ29udmVydHMgYSBzdHJlYW0gb2YgYnl0ZXMgaW50byBUaHJpZnQgaWRlbnRpZmllcnMsIHByaW1pdGl2ZXMsCisvLy8gY29udGFpbmVycywgb3Igc3RydWN0cy4KKy8vLworLy8vIFRoaXMgdHJhaXQgZG9lcyBub3QgZGVhbCB3aXRoIGhpZ2hlci1sZXZlbCBUaHJpZnQgY29uY2VwdHMgbGlrZSBzdHJ1Y3RzIG9yCisvLy8gZXhjZXB0aW9ucyAtIG9ubHkgd2l0aCBwcmltaXRpdmVzIGFuZCBtZXNzYWdlIG9yIGNvbnRhaW5lciBib3VuZGFyaWVzLiBPbmNlCisvLy8gYnl0ZXMgYXJlIHJlYWQgdGhleSBhcmUgZGVzZXJpYWxpemVkIGFuZCBhbiBpZGVudGlmaWVyIChmb3IgZXhhbXBsZQorLy8vIGBUTWVzc2FnZUlkZW50aWZpZXJgKSBvciBhIHByaW1pdGl2ZSBpcyByZXR1cm5lZC4KKy8vLworLy8vIEFsbCBtZXRob2RzIHJldHVybiBhIGB0aHJpZnQ6OlJlc3VsdGAuIElmIGFuIGBFcnJgIGlzIHJldHVybmVkIHRoZSBwcm90b2NvbAorLy8vIGluc3RhbmNlIGFuZCBpdHMgdW5kZXJseWluZyB0cmFuc3BvcnQgc2hvdWxkIGJlIHRlcm1pbmF0ZWQuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUSW5wdXRQcm90b2NvbGAKKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gbGV0IGZpZWxkX2lkZW50aWZpZXIgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2JlZ2luKCkudW53cmFwKCk7CisvLy8gbGV0IGZpZWxkX2NvbnRlbnRzID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vLyBsZXQgZmllbGRfZW5kID0gcHJvdG9jb2wucmVhZF9maWVsZF9lbmQoKS51bndyYXAoKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUSW5wdXRQcm90b2NvbCB7CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBtZXNzYWdlLgorICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIFRocmlmdCBtZXNzYWdlLgorICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBzdHJ1Y3QgZmllbGQuCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBUaHJpZnQgc3RydWN0IGZpZWxkLgorICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIGEgYm9vbC4KKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPjsKKyAgICAvLy8gUmVhZCBhIGZpeGVkLWxlbmd0aCBieXRlIGFycmF5LgorICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PjsKKyAgICAvLy8gUmVhZCBhIHdvcmQuCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PjsKKyAgICAvLy8gUmVhZCBhIDE2LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj47CisgICAgLy8vIFJlYWQgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+OworICAgIC8vLyBSZWFkIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PjsKKyAgICAvLy8gUmVhZCBhIDY0LWJpdCBmbG9hdC4KKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND47CisgICAgLy8vIFJlYWQgYSBmaXhlZC1sZW5ndGggc3RyaW5nIChub3QgbnVsbCB0ZXJtaW5hdGVkKS4KKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgbGlzdC4KKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIHNldC4KKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIG1hcC4KKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgbWFwLgorICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gU2tpcCBhIGZpZWxkIHdpdGggdHlwZSBgZmllbGRfdHlwZWAgcmVjdXJzaXZlbHkgdW50aWwgdGhlIGRlZmF1bHQKKyAgICAvLy8gbWF4aW11bSBza2lwIGRlcHRoIGlzIHJlYWNoZWQuCisgICAgZm4gc2tpcCgmbXV0IHNlbGYsIGZpZWxkX3R5cGU6IFRUeXBlKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChmaWVsZF90eXBlLCBNQVhJTVVNX1NLSVBfREVQVEgpCisgICAgfQorICAgIC8vLyBTa2lwIGEgZmllbGQgd2l0aCB0eXBlIGBmaWVsZF90eXBlYCByZWN1cnNpdmVseSB1cCB0byBgZGVwdGhgIGxldmVscy4KKyAgICBmbiBza2lwX3RpbGxfZGVwdGgoJm11dCBzZWxmLCBmaWVsZF90eXBlOiBUVHlwZSwgZGVwdGg6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBkZXB0aCA9PSAwIHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkRlcHRoTGltaXQsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IHBhcnNlIHBhc3Qgezo/fSIsIGZpZWxkX3R5cGUpLAorICAgICAgICAgICAgfSkpOworICAgICAgICB9CisKKyAgICAgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6Qm9vbCA9PiBzZWxmLnJlYWRfYm9vbCgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkkwOCA9PiBzZWxmLnJlYWRfaTgoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMTYgPT4gc2VsZi5yZWFkX2kxNigpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkkzMiA9PiBzZWxmLnJlYWRfaTMyKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STY0ID0+IHNlbGYucmVhZF9pNjQoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gc2VsZi5yZWFkX2RvdWJsZSgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OlN0cmluZyA9PiBzZWxmLnJlYWRfc3RyaW5nKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6U3RydWN0ID0+IHsKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfc3RydWN0X2JlZ2luKCk/OworICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGRfaWRlbnQgPSBzZWxmLnJlYWRfZmllbGRfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgICAgIGlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoZmllbGRfaWRlbnQuZmllbGRfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9zdHJ1Y3RfZW5kKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRUeXBlOjpMaXN0ID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbGlzdF9pZGVudCA9IHNlbGYucmVhZF9saXN0X2JlZ2luKCk/OworICAgICAgICAgICAgICAgIGZvciBfIGluIDAuLmxpc3RfaWRlbnQuc2l6ZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGxpc3RfaWRlbnQuZWxlbWVudF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX2xpc3RfZW5kKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRUeXBlOjpTZXQgPT4geworICAgICAgICAgICAgICAgIGxldCBzZXRfaWRlbnQgPSBzZWxmLnJlYWRfc2V0X2JlZ2luKCk/OworICAgICAgICAgICAgICAgIGZvciBfIGluIDAuLnNldF9pZGVudC5zaXplIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoc2V0X2lkZW50LmVsZW1lbnRfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9zZXRfZW5kKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRUeXBlOjpNYXAgPT4geworICAgICAgICAgICAgICAgIGxldCBtYXBfaWRlbnQgPSBzZWxmLnJlYWRfbWFwX2JlZ2luKCk/OworICAgICAgICAgICAgICAgIGZvciBfIGluIDAuLm1hcF9pZGVudC5zaXplIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGtleV90eXBlID0gbWFwX2lkZW50CisgICAgICAgICAgICAgICAgICAgICAgICAua2V5X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leHBlY3QoIm5vbi16ZXJvIHNpemVkIG1hcCBzaG91bGQgY29udGFpbiBrZXkgdHlwZSIpOworICAgICAgICAgICAgICAgICAgICBsZXQgdmFsX3R5cGUgPSBtYXBfaWRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhwZWN0KCJub24temVybyBzaXplZCBtYXAgc2hvdWxkIGNvbnRhaW4gdmFsdWUgdHlwZSIpOworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChrZXlfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKHZhbF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX21hcF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdSA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IHNraXAgZmllbGQgdHlwZSB7Oj99IiwgJnUpLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXRpbGl0eSAoRE8gTk9UIFVTRSBJTiBHRU5FUkFURUQgQ09ERSEhISEpCisgICAgLy8KKworICAgIC8vLyBSZWFkIGFuIHVuc2lnbmVkIGJ5dGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCAqKm5ldmVyKiogYmUgdXNlZCBpbiBnZW5lcmF0ZWQgY29kZS4KKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD47Cit9CisKKy8vLyBDb252ZXJ0cyBUaHJpZnQgaWRlbnRpZmllcnMsIHByaW1pdGl2ZXMsIGNvbnRhaW5lcnMgb3Igc3RydWN0cyBpbnRvIGEKKy8vLyBzdHJlYW0gb2YgYnl0ZXMuCisvLy8KKy8vLyBUaGlzIHRyYWl0IGRvZXMgbm90IGRlYWwgd2l0aCBoaWdoZXItbGV2ZWwgVGhyaWZ0IGNvbmNlcHRzIGxpa2Ugc3RydWN0cyBvcgorLy8vIGV4Y2VwdGlvbnMgLSBvbmx5IHdpdGggcHJpbWl0aXZlcyBhbmQgbWVzc2FnZSBvciBjb250YWluZXIgYm91bmRhcmllcy4KKy8vLyBXcml0ZSBtZXRob2RzIHRha2UgYW4gaWRlbnRpZmllciAoZm9yIGV4YW1wbGUsIGBUTWVzc2FnZUlkZW50aWZpZXJgKSBvciBhCisvLy8gcHJpbWl0aXZlLiBBbnkgb3IgYWxsIG9mIHRoZSBmaWVsZHMgaW4gYW4gaWRlbnRpZmllciBtYXkgYmUgb21pdHRlZCB3aGVuCisvLy8gd3JpdGluZyB0byB0aGUgdHJhbnNwb3J0LiBXcml0ZSBtZXRob2RzIG1heSBldmVuIGJlIG5vb3BzLiBBbGwgb2YgdGhpcyBpcworLy8vIHRyYW5zcGFyZW50IHRvIHRoZSBjYWxsZXI7IGFzIGxvbmcgYXMgYSBtYXRjaGluZyBgVElucHV0UHJvdG9jb2xgCisvLy8gaW1wbGVtZW50YXRpb24gaXMgdXNlZCwgcmVjZWl2ZWQgbWVzc2FnZXMgd2lsbCBiZSBkZWNvZGVkIGNvcnJlY3RseS4KKy8vLworLy8vIEFsbCBtZXRob2RzIHJldHVybiBhIGB0aHJpZnQ6OlJlc3VsdGAuIElmIGFuIGBFcnJgIGlzIHJldHVybmVkIHRoZSBwcm90b2NvbAorLy8vIGluc3RhbmNlIGFuZCBpdHMgdW5kZXJseWluZyB0cmFuc3BvcnQgc2hvdWxkIGJlIHRlcm1pbmF0ZWQuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUT3V0cHV0UHJvdG9jb2xgCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVEZpZWxkSWRlbnRpZmllciwgVE91dHB1dFByb3RvY29sLCBUVHlwZX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBwcm90b2NvbC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJzdHJpbmdfdGhpbmciLCBUVHlwZTo6U3RyaW5nLCAxKSkudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfc3RyaW5nKCJmb28iKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9maWVsZF9lbmQoKS51bndyYXAoKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUT3V0cHV0UHJvdG9jb2wgeworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIFRocmlmdCBtZXNzYWdlLgorICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBmaWVsZC4KKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBUaHJpZnQgZmllbGQuCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIFNUT1AgZmllbGQgaW5kaWNhdGluZyB0aGF0IGFsbCB0aGUgZmllbGRzIGluIGEgc3RydWN0IGhhdmUgYmVlbgorICAgIC8vLyB3cml0dGVuLgorICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgYm9vbC4KKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIGZpeGVkLWxlbmd0aCBieXRlIGFycmF5LgorICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYW4gOC1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDE2LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDY0LWJpdCBmbG9hdC4KKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBmaXhlZC1sZW5ndGggc3RyaW5nLgorICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBzZXQuCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIG1hcC4KKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIG1hcC4KKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBGbHVzaCBidWZmZXJlZCBieXRlcyB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisKKyAgICAvLyB1dGlsaXR5IChETyBOT1QgVVNFIElOIEdFTkVSQVRFRCBDT0RFISEhISkKKyAgICAvLworCisgICAgLy8vIFdyaXRlIGFuIHVuc2lnbmVkIGJ5dGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCAqKm5ldmVyKiogYmUgdXNlZCBpbiBnZW5lcmF0ZWQgY29kZS4KKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPjsgLy8gRklYTUU6IFJFTU9WRQorfQorCitpbXBsPFA+IFRJbnB1dFByb3RvY29sIGZvciBCb3g8UD4KK3doZXJlCisgICAgUDogVElucHV0UHJvdG9jb2wgKyA/U2l6ZWQsCit7CisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWVzc2FnZV9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICAoKipzZWxmKS5yZWFkX3N0cnVjdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zdHJ1Y3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2ZpZWxkX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfYm9vbCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9ieXRlcygpCisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTgoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTE2KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2kzMigpCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pNjQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfZG91YmxlKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICAoKipzZWxmKS5yZWFkX3N0cmluZygpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbGlzdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zZXRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX21hcF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tYXBfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICAoKipzZWxmKS5yZWFkX2J5dGUoKQorICAgIH0KK30KKworaW1wbDxQPiBUT3V0cHV0UHJvdG9jb2wgZm9yIEJveDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wgKyA/U2l6ZWQsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX21lc3NhZ2VfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3N0cnVjdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zdHJ1Y3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9maWVsZF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2ZpZWxkX3N0b3AoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9ib29sKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfYnl0ZXMoYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pOChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTE2KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pMzIoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2k2NChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZG91YmxlKGQpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc3RyaW5nKHMpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2xpc3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3NldF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX21hcF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tYXBfZW5kKCkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLmZsdXNoKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2J5dGUoYikKKyAgICB9Cit9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IHNlcnZlcnMgdG8gY3JlYXRlIGBUSW5wdXRQcm90b2NvbGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhIGBUSW5wdXRQcm90b2NvbEZhY3RvcnlgIGFuZCB1c2UgaXQgdG8gY3JlYXRlIGEgYFRJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSW5wdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IGZhY3RvcnkgPSBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworLy8vIGxldCBwcm90b2NvbCA9IGZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KGNoYW5uZWwpKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUSW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vIENyZWF0ZSBhIGBUSW5wdXRQcm90b2NvbGAgdGhhdCByZWFkcyBieXRlcyBmcm9tIGB0cmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD47Cit9CisKK2ltcGw8VD4gVElucHV0UHJvdG9jb2xGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUodHJhbnNwb3J0KQorICAgIH0KK30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgc2VydmVycyB0byBjcmVhdGUgYFRPdXRwdXRQcm90b2NvbGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhIGBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5YCBhbmQgdXNlIGl0IHRvIGNyZWF0ZSBhIGBUT3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBmYWN0b3J5ID0gVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCk7CisvLy8gbGV0IHByb3RvY29sID0gZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcoY2hhbm5lbCkpOworLy8vIGBgYAorcHViIHRyYWl0IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVE91dHB1dFByb3RvY29sYCB0aGF0IHdyaXRlcyBieXRlcyB0byBgdHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD47Cit9CisKK2ltcGw8VD4gVE91dHB1dFByb3RvY29sRmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKHRyYW5zcG9ydCkKKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbWVzc2FnZSBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAvLy8gU2VydmljZSBjYWxsIHRoZSBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICBwdWIgbmFtZTogU3RyaW5nLAorICAgIC8vLyBNZXNzYWdlIHR5cGUuCisgICAgcHViIG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlLAorICAgIC8vLyBPcmRlcmVkIHNlcXVlbmNlIG51bWJlciBpZGVudGlmeWluZyB0aGUgbWVzc2FnZS4KKyAgICBwdWIgc2VxdWVuY2VfbnVtYmVyOiBpMzIsCit9CisKK2ltcGwgVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRNZXNzYWdlSWRlbnRpZmllcmAgZm9yIGEgVGhyaWZ0IHNlcnZpY2UtY2FsbCBuYW1lZCBgbmFtZWAKKyAgICAvLy8gd2l0aCBtZXNzYWdlIHR5cGUgYG1lc3NhZ2VfdHlwZWAgYW5kIHNlcXVlbmNlIG51bWJlciBgc2VxdWVuY2VfbnVtYmVyYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oCisgICAgICAgIG5hbWU6IFMsCisgICAgICAgIG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlLAorICAgICAgICBzZXF1ZW5jZV9udW1iZXI6IGkzMiwKKyAgICApIC0+IFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgICAgIFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiBuYW1lLmludG8oKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfdHlwZTogbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgc2VxdWVuY2VfbnVtYmVyOiBzZXF1ZW5jZV9udW1iZXIsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgc3RydWN0IGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUU3RydWN0SWRlbnRpZmllciB7CisgICAgLy8vIE5hbWUgb2YgdGhlIGVuY29kZWQgVGhyaWZ0IHN0cnVjdC4KKyAgICBwdWIgbmFtZTogU3RyaW5nLAorfQorCitpbXBsIFRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRTdHJ1Y3RJZGVudGlmaWVyYCBmb3IgYSBzdHJ1Y3QgbmFtZWQgYG5hbWVgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PihuYW1lOiBTKSAtPiBUU3RydWN0SWRlbnRpZmllciB7CisgICAgICAgIFRTdHJ1Y3RJZGVudGlmaWVyIHsgbmFtZTogbmFtZS5pbnRvKCkgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBmaWVsZCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVEZpZWxkSWRlbnRpZmllciB7CisgICAgLy8vIE5hbWUgb2YgdGhlIFRocmlmdCBmaWVsZC4KKyAgICAvLy8KKyAgICAvLy8gYE5vbmVgIGlmIGl0J3Mgbm90IHNlbnQgb3ZlciB0aGUgd2lyZS4KKyAgICBwdWIgbmFtZTogT3B0aW9uPFN0cmluZz4sCisgICAgLy8vIEZpZWxkIHR5cGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWF5IGJlIGEgcHJpbWl0aXZlLCBjb250YWluZXIsIG9yIGEgc3RydWN0LgorICAgIHB1YiBmaWVsZF90eXBlOiBUVHlwZSwKKyAgICAvLy8gVGhyaWZ0IGZpZWxkIGlkLgorICAgIC8vLworICAgIC8vLyBgTm9uZWAgb25seSBpZiBgZmllbGRfdHlwZWAgaXMgYFRUeXBlOjpTdG9wYC4KKyAgICBwdWIgaWQ6IE9wdGlvbjxpMTY+LAorfQorCitpbXBsIFRGaWVsZElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVEZpZWxkSWRlbnRpZmllcmAgZm9yIGEgZmllbGQgbmFtZWQgYG5hbWVgIHdpdGggdHlwZQorICAgIC8vLyBgZmllbGRfdHlwZWAgYW5kIGZpZWxkIGlkIGBpZGAuCisgICAgLy8vCisgICAgLy8vIGBpZGAgc2hvdWxkIGJlIGBOb25lYCBpZiBgZmllbGRfdHlwZWAgaXMgYFRUeXBlOjpTdG9wYC4KKyAgICBwdWIgZm4gbmV3PE4sIFMsIEk+KG5hbWU6IE4sIGZpZWxkX3R5cGU6IFRUeXBlLCBpZDogSSkgLT4gVEZpZWxkSWRlbnRpZmllcgorICAgIHdoZXJlCisgICAgICAgIE46IEludG88T3B0aW9uPFM+PiwKKyAgICAgICAgUzogSW50bzxTdHJpbmc+LAorICAgICAgICBJOiBJbnRvPE9wdGlvbjxpMTY+PiwKKyAgICB7CisgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogbmFtZS5pbnRvKCkubWFwKHxufCBuLmludG8oKSksCisgICAgICAgICAgICBmaWVsZF90eXBlOiBmaWVsZF90eXBlLAorICAgICAgICAgICAgaWQ6IGlkLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBsaXN0IGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUTGlzdElkZW50aWZpZXIgeworICAgIC8vLyBUeXBlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICBwdWIgZWxlbWVudF90eXBlOiBUVHlwZSwKKyAgICAvLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgIHB1YiBzaXplOiBpMzIsCit9CisKK2ltcGwgVExpc3RJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRMaXN0SWRlbnRpZmllcmAgZm9yIGEgbGlzdCB3aXRoIGBzaXplYCBlbGVtZW50cyBvZiB0eXBlCisgICAgLy8vIGBlbGVtZW50X3R5cGVgLgorICAgIHB1YiBmbiBuZXcoZWxlbWVudF90eXBlOiBUVHlwZSwgc2l6ZTogaTMyKSAtPiBUTGlzdElkZW50aWZpZXIgeworICAgICAgICBUTGlzdElkZW50aWZpZXIgeworICAgICAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICBzaXplOiBzaXplLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IHNldCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVFNldElkZW50aWZpZXIgeworICAgIC8vLyBUeXBlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc2V0LgorICAgIHB1YiBlbGVtZW50X3R5cGU6IFRUeXBlLAorICAgIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNldC4KKyAgICBwdWIgc2l6ZTogaTMyLAorfQorCitpbXBsIFRTZXRJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRTZXRJZGVudGlmaWVyYCBmb3IgYSBzZXQgd2l0aCBgc2l6ZWAgZWxlbWVudHMgb2YgdHlwZQorICAgIC8vLyBgZWxlbWVudF90eXBlYC4KKyAgICBwdWIgZm4gbmV3KGVsZW1lbnRfdHlwZTogVFR5cGUsIHNpemU6IGkzMikgLT4gVFNldElkZW50aWZpZXIgeworICAgICAgICBUU2V0SWRlbnRpZmllciB7CisgICAgICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgIHNpemU6IHNpemUsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbWFwIGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUTWFwSWRlbnRpZmllciB7CisgICAgLy8vIE1hcCBrZXkgdHlwZS4KKyAgICBwdWIga2V5X3R5cGU6IE9wdGlvbjxUVHlwZT4sCisgICAgLy8vIE1hcCB2YWx1ZSB0eXBlLgorICAgIHB1YiB2YWx1ZV90eXBlOiBPcHRpb248VFR5cGU+LAorICAgIC8vLyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbWFwLgorICAgIHB1YiBzaXplOiBpMzIsCit9CisKK2ltcGwgVE1hcElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVE1hcElkZW50aWZpZXJgIGZvciBhIG1hcCB3aXRoIGBzaXplYCBlbnRyaWVzIG9mIHR5cGUKKyAgICAvLy8gYGtleV90eXBlIC0+IHZhbHVlX3R5cGVgLgorICAgIHB1YiBmbiBuZXc8SywgVj4oa2V5X3R5cGU6IEssIHZhbHVlX3R5cGU6IFYsIHNpemU6IGkzMikgLT4gVE1hcElkZW50aWZpZXIKKyAgICB3aGVyZQorICAgICAgICBLOiBJbnRvPE9wdGlvbjxUVHlwZT4+LAorICAgICAgICBWOiBJbnRvPE9wdGlvbjxUVHlwZT4+LAorICAgIHsKKyAgICAgICAgVE1hcElkZW50aWZpZXIgeworICAgICAgICAgICAga2V5X3R5cGU6IGtleV90eXBlLmludG8oKSwKKyAgICAgICAgICAgIHZhbHVlX3R5cGU6IHZhbHVlX3R5cGUuaW50bygpLAorICAgICAgICAgICAgc2l6ZTogc2l6ZSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBtZXNzYWdlIHR5cGVzLgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFRNZXNzYWdlVHlwZSB7CisgICAgLy8vIFNlcnZpY2UtY2FsbCByZXF1ZXN0LgorICAgIENhbGwsCisgICAgLy8vIFNlcnZpY2UtY2FsbCByZXNwb25zZS4KKyAgICBSZXBseSwKKyAgICAvLy8gVW5leHBlY3RlZCBlcnJvciBpbiB0aGUgcmVtb3RlIHNlcnZpY2UuCisgICAgRXhjZXB0aW9uLAorICAgIC8vLyBPbmUtd2F5IHNlcnZpY2UtY2FsbCByZXF1ZXN0IChubyByZXNwb25zZSBpcyBleHBlY3RlZCkuCisgICAgT25lV2F5LAorfQorCitpbXBsIERpc3BsYXkgZm9yIFRNZXNzYWdlVHlwZSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwgPT4gd3JpdGUhKGYsICJDYWxsIiksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OlJlcGx5ID0+IHdyaXRlIShmLCAiUmVwbHkiKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uID0+IHdyaXRlIShmLCAiRXhjZXB0aW9uIiksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6Ok9uZVdheSA9PiB3cml0ZSEoZiwgIk9uZVdheSIpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208VE1lc3NhZ2VUeXBlPiBmb3IgdTggeworICAgIGZuIGZyb20obWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUpIC0+IFNlbGYgeworICAgICAgICBtYXRjaCBtZXNzYWdlX3R5cGUgeworICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsID0+IDB4MDEsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OlJlcGx5ID0+IDB4MDIsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiA9PiAweDAzLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpPbmVXYXkgPT4gMHgwNCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPHU4PiBmb3IgVE1lc3NhZ2VUeXBlIHsKKyAgICB0eXBlIEVyciA9IDo6RXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oYjogdTgpIC0+IDo6UmVzdWx0PFNlbGY+IHsKKyAgICAgICAgbWF0Y2ggYiB7CisgICAgICAgICAgICAweDAxID0+IE9rKFRNZXNzYWdlVHlwZTo6Q2FsbCksCisgICAgICAgICAgICAweDAyID0+IE9rKFRNZXNzYWdlVHlwZTo6UmVwbHkpLAorICAgICAgICAgICAgMHgwMyA9PiBPayhUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiksCisgICAgICAgICAgICAweDA0ID0+IE9rKFRNZXNzYWdlVHlwZTo6T25lV2F5KSwKKyAgICAgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBUTWVzc2FnZVR5cGUiLCB1bmtuKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBzdHJ1Y3QtZmllbGQgdHlwZXMuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gVFR5cGUgeworICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzZXJpYWxpemVkIGZpZWxkcyBpbiB0aGlzIFRocmlmdCBzdHJ1Y3QuCisgICAgU3RvcCwKKyAgICAvLy8gVm9pZCAoYCgpYCkgZmllbGQuCisgICAgVm9pZCwKKyAgICAvLy8gQm9vbGVhbi4KKyAgICBCb29sLAorICAgIC8vLyBTaWduZWQgOC1iaXQgaW50LgorICAgIEkwOCwKKyAgICAvLy8gRG91YmxlLXByZWNpc2lvbiBudW1iZXIuCisgICAgRG91YmxlLAorICAgIC8vLyBTaWduZWQgMTYtYml0IGludC4KKyAgICBJMTYsCisgICAgLy8vIFNpZ25lZCAzMi1iaXQgaW50LgorICAgIEkzMiwKKyAgICAvLy8gU2lnbmVkIDY0LWJpdCBpbnQuCisgICAgSTY0LAorICAgIC8vLyBVVEYtOCBzdHJpbmcuCisgICAgU3RyaW5nLAorICAgIC8vLyBVVEYtNyBzdHJpbmcuICpVbnN1cHBvcnRlZCouCisgICAgVXRmNywKKyAgICAvLy8gVGhyaWZ0IHN0cnVjdC4KKyAgICBTdHJ1Y3QsCisgICAgLy8vIE1hcC4KKyAgICBNYXAsCisgICAgLy8vIFNldC4KKyAgICBTZXQsCisgICAgLy8vIExpc3QuCisgICAgTGlzdCwKKyAgICAvLy8gVVRGLTggc3RyaW5nLgorICAgIFV0ZjgsCisgICAgLy8vIFVURi0xNiBzdHJpbmcuICpVbnN1cHBvcnRlZCouCisgICAgVXRmMTYsCit9CisKK2ltcGwgRGlzcGxheSBmb3IgVFR5cGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgVFR5cGU6OlN0b3AgPT4gd3JpdGUhKGYsICJTVE9QIiksCisgICAgICAgICAgICBUVHlwZTo6Vm9pZCA9PiB3cml0ZSEoZiwgInZvaWQiKSwKKyAgICAgICAgICAgIFRUeXBlOjpCb29sID0+IHdyaXRlIShmLCAiYm9vbCIpLAorICAgICAgICAgICAgVFR5cGU6OkkwOCA9PiB3cml0ZSEoZiwgImkwOCIpLAorICAgICAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiB3cml0ZSEoZiwgImRvdWJsZSIpLAorICAgICAgICAgICAgVFR5cGU6OkkxNiA9PiB3cml0ZSEoZiwgImkxNiIpLAorICAgICAgICAgICAgVFR5cGU6OkkzMiA9PiB3cml0ZSEoZiwgImkzMiIpLAorICAgICAgICAgICAgVFR5cGU6Okk2NCA9PiB3cml0ZSEoZiwgImk2NCIpLAorICAgICAgICAgICAgVFR5cGU6OlN0cmluZyA9PiB3cml0ZSEoZiwgInN0cmluZyIpLAorICAgICAgICAgICAgVFR5cGU6OlV0ZjcgPT4gd3JpdGUhKGYsICJVVEY3IiksCisgICAgICAgICAgICBUVHlwZTo6U3RydWN0ID0+IHdyaXRlIShmLCAic3RydWN0IiksCisgICAgICAgICAgICBUVHlwZTo6TWFwID0+IHdyaXRlIShmLCAibWFwIiksCisgICAgICAgICAgICBUVHlwZTo6U2V0ID0+IHdyaXRlIShmLCAic2V0IiksCisgICAgICAgICAgICBUVHlwZTo6TGlzdCA9PiB3cml0ZSEoZiwgImxpc3QiKSwKKyAgICAgICAgICAgIFRUeXBlOjpVdGY4ID0+IHdyaXRlIShmLCAiVVRGOCIpLAorICAgICAgICAgICAgVFR5cGU6OlV0ZjE2ID0+IHdyaXRlIShmLCAiVVRGMTYiKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIENvbXBhcmUgdGhlIGV4cGVjdGVkIG1lc3NhZ2Ugc2VxdWVuY2UgbnVtYmVyIGBleHBlY3RlZGAgd2l0aCB0aGUgcmVjZWl2ZWQKKy8vLyBtZXNzYWdlIHNlcXVlbmNlIG51bWJlciBgYWN0dWFsYC4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGBhY3R1YWwgPT0gZXhwZWN0ZWRgLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X2V4cGVjdGVkX3NlcXVlbmNlX251bWJlcihleHBlY3RlZDogaTMyLCBhY3R1YWw6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBleHBlY3RlZCA9PSBhY3R1YWwgeworICAgICAgICBPaygoKSkKKyAgICB9IGVsc2UgeworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oOjpBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6QXBwbGljYXRpb25FcnJvcktpbmQ6OkJhZFNlcXVlbmNlSWQsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJleHBlY3RlZCB7fSBnb3Qge30iLCBleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgfSkpCisgICAgfQorfQorCisvLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgc2VydmljZS1jYWxsIG5hbWUgYGV4cGVjdGVkYCB3aXRoIHRoZSByZWNlaXZlZAorLy8vIHNlcnZpY2UtY2FsbCBuYW1lIGBhY3R1YWxgLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgYGFjdHVhbCA9PSBleHBlY3RlZGAsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfZXhwZWN0ZWRfc2VydmljZV9jYWxsKGV4cGVjdGVkOiAmc3RyLCBhY3R1YWw6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgZXhwZWN0ZWQgPT0gYWN0dWFsIHsKKyAgICAgICAgT2soKCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKDo6QXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpXcm9uZ01ldGhvZE5hbWUsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJleHBlY3RlZCB7fSBnb3Qge30iLCBleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgfSkpCisgICAgfQorfQorCisvLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIGBleHBlY3RlZGAgd2l0aCB0aGUgcmVjZWl2ZWQgbWVzc2FnZSB0eXBlCisvLy8gYGFjdHVhbGAuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBgYWN0dWFsID09IGV4cGVjdGVkYCwgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9leHBlY3RlZF9tZXNzYWdlX3R5cGUoZXhwZWN0ZWQ6IFRNZXNzYWdlVHlwZSwgYWN0dWFsOiBUTWVzc2FnZVR5cGUpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgZXhwZWN0ZWQgPT0gYWN0dWFsIHsKKyAgICAgICAgT2soKCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKDo6QXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJleHBlY3RlZCB7fSBnb3Qge30iLCBleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgfSkpCisgICAgfQorfQorCisvLy8gQ2hlY2sgaWYgYSByZXF1aXJlZCBUaHJpZnQgc3RydWN0IGZpZWxkIGV4aXN0cy4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGl0IGRvZXMsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfcmVxdWlyZWRfZmllbGRfZXhpc3RzPFQ+KGZpZWxkX25hbWU6ICZzdHIsIGZpZWxkOiAmT3B0aW9uPFQ+KSAtPiA6OlJlc3VsdDwoKT4geworICAgIG1hdGNoICpmaWVsZCB7CisgICAgICAgIFNvbWUoXykgPT4gT2soKCkpLAorICAgICAgICBOb25lID0+IEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoIm1pc3NpbmcgcmVxdWlyZWQgZmllbGQge30iLCBmaWVsZF9uYW1lKSwKKyAgICAgICAgfSkpLAorICAgIH0KK30KKworLy8vIEV4dHJhY3QgdGhlIGZpZWxkIGlkIGZyb20gYSBUaHJpZnQgZmllbGQgaWRlbnRpZmllci4KKy8vLworLy8vIGBmaWVsZF9pZGVudGAgbXVzdCAqbm90KiBoYXZlIGBURmllbGRJZGVudGlmaWVyLmZpZWxkX3R5cGVgIG9mIHR5cGUgYFRUeXBlOjpTdG9wYC4KKy8vLworLy8vIFJldHVybiBgVEZpZWxkSWRlbnRpZmllci5pZGAgaWYgYW4gaWQgZXhpc3RzLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gZmllbGRfaWQoZmllbGRfaWRlbnQ6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICBmaWVsZF9pZGVudC5pZC5va19vcl9lbHNlKHx8IHsKKyAgICAgICAgOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJtaXNzaW5nIGZpZWxkIGluIGluIHs6P30iLCBmaWVsZF9pZGVudCksCisgICAgICAgIH0pCisgICAgfSkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHN0ZDo6aW86OkN1cnNvcjsKKworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7VFJlYWRUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydH07CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX2lucHV0X3Byb3RvY29sX2Zyb21fY29uY3JldGVfaW5wdXRfcHJvdG9jb2woKSB7CisgICAgICAgIGxldCByOiBCb3g8VFJlYWRUcmFuc3BvcnQ+ID0gQm94OjpuZXcoQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKSk7CisgICAgICAgIGxldCBtdXQgdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHIpOworICAgICAgICB0YWtlc19pbnB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9pbnB1dF9wcm90b2NvbF9mcm9tX2JveGVkX2lucHV0KCkgeworICAgICAgICBsZXQgcjogQm94PFRSZWFkVHJhbnNwb3J0PiA9IEJveDo6bmV3KEN1cnNvcjo6bmV3KFswLCAxLCAyXSkpOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUSW5wdXRQcm90b2NvbD4gPSBCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhyKSk7CisgICAgICAgIHRha2VzX2lucHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX291dHB1dF9wcm90b2NvbF9mcm9tX2NvbmNyZXRlX291dHB1dF9wcm90b2NvbCgpIHsKKyAgICAgICAgbGV0IHc6IEJveDxUV3JpdGVUcmFuc3BvcnQ+ID0gQm94OjpuZXcodmVjIVswdTg7IDEwXSk7CisgICAgICAgIGxldCBtdXQgdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh3KTsKKyAgICAgICAgdGFrZXNfb3V0cHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX291dHB1dF9wcm90b2NvbF9mcm9tX2JveGVkX291dHB1dCgpIHsKKyAgICAgICAgbGV0IHc6IEJveDxUV3JpdGVUcmFuc3BvcnQ+ID0gQm94OjpuZXcodmVjIVswdTg7IDEwXSk7CisgICAgICAgIGxldCBtdXQgdDogQm94PFRPdXRwdXRQcm90b2NvbD4gPSBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcodykpOworICAgICAgICB0YWtlc19vdXRwdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgIGZuIHRha2VzX2lucHV0X3Byb3RvY29sPFI+KHQ6ICZtdXQgUikKKyAgICB3aGVyZQorICAgICAgICBSOiBUSW5wdXRQcm90b2NvbCwKKyAgICB7CisgICAgICAgIHQucmVhZF9ieXRlKCkudW53cmFwKCk7CisgICAgfQorCisgICAgZm4gdGFrZXNfb3V0cHV0X3Byb3RvY29sPFc+KHQ6ICZtdXQgVykKKyAgICB3aGVyZQorICAgICAgICBXOiBUT3V0cHV0UHJvdG9jb2wsCisgICAgeworICAgICAgICB0LmZsdXNoKCkudW53cmFwKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9tdWx0aXBsZXhlZC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvbXVsdGlwbGV4ZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlZTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvbXVsdGlwbGV4ZWQucnMKQEAgLTAsMCArMSwyMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsCisgICAgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsCit9OworCisvLy8gYFRPdXRwdXRQcm90b2NvbGAgdGhhdCBwcmVmaXhlcyB0aGUgc2VydmljZSBuYW1lIHRvIGFsbCBvdXRnb2luZyBUaHJpZnQKKy8vLyBtZXNzYWdlcy4KKy8vLworLy8vIEEgYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYCBzaG91bGQgYmUgdXNlZCB3aGVuIG11bHRpcGxlIFRocmlmdCBzZXJ2aWNlcworLy8vIHNlbmQgbWVzc2FnZXMgb3ZlciBhIHNpbmdsZSBJL08gY2hhbm5lbC4gQnkgcHJlZml4aW5nIHNlcnZpY2UgaWRlbnRpZmllcnMKKy8vLyB0byBvdXRnb2luZyBtZXNzYWdlcyByZWNlaXZlcnMgYXJlIGFibGUgdG8gZGVtdXggdGhlbSBhbmQgcm91dGUgdGhlbSB0byB0aGUKKy8vLyBhcHByb3ByaWF0ZSBzZXJ2aWNlIHByb2Nlc3Nvci4gUnVzdCByZWNlaXZlcnMgbXVzdCB1c2UgYSBgVE11bHRpcGxleGVkUHJvY2Vzc29yYAorLy8vIHRvIHByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZXMsIHdoaWxlIG90aGVyIGxhbmd1YWdlcyBtdXN0IHVzZSB0aGVpcgorLy8vIGNvcnJlc3BvbmRpbmcgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9ucy4KKy8vLworLy8vIEZvciBleGFtcGxlLCBnaXZlbiBhIHNlcnZpY2UgYFRlc3RTZXJ2aWNlYCBhbmQgYSBzZXJ2aWNlIGNhbGwgYHRlc3RfY2FsbGAsCisvLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiB3b3VsZCBpZGVudGlmeSBtZXNzYWdlcyBhcyBvcmlnaW5hdGluZyBmcm9tCisvLy8gYFRlc3RTZXJ2aWNlOnRlc3RfY2FsbGAuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w6Om5ldygic2VydmljZV9uYW1lIiwgcHJvdG9jb2wpOworLy8vCisvLy8gbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInN2Y19jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKy8vLyBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCwKK3sKKyAgICBzZXJ2aWNlX25hbWU6IFN0cmluZywKKyAgICBpbm5lcjogUCwKK30KKworaW1wbDxQPiBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAgdGhhdCBpZGVudGlmaWVzIG91dGdvaW5nIG1lc3NhZ2VzCisgICAgLy8vIGFzIG9yaWdpbmF0aW5nIGZyb20gYSBzZXJ2aWNlIG5hbWVkIGBzZXJ2aWNlX25hbWVgIGFuZCBzZW5kcyB0aGVtIG92ZXIKKyAgICAvLy8gdGhlIGB3cmFwcGVkYCBgVE91dHB1dFByb3RvY29sYC4gT3V0Z29pbmcgbWVzc2FnZXMgYXJlIGVuY29kZWQgYW5kIHNlbnQKKyAgICAvLy8gYnkgYHdyYXBwZWRgLCBub3QgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICBwdWIgZm4gbmV3KHNlcnZpY2VfbmFtZTogJnN0ciwgd3JhcHBlZDogUCkgLT4gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4geworICAgICAgICBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbCB7CisgICAgICAgICAgICBzZXJ2aWNlX25hbWU6IHNlcnZpY2VfbmFtZS50b19vd25lZCgpLAorICAgICAgICAgICAgaW5uZXI6IHdyYXBwZWQsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEZJWE1FOiBhdm9pZCBwYXNzdGhyb3VnaCBtZXRob2RzCitpbXBsPFA+IFRPdXRwdXRQcm90b2NvbCBmb3IgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sLAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBtYXRjaCBpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZSB7CisgICAgICAgICAgICAvLyBGSVhNRTogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIG92ZXJyaWRlIGlkZW50aWZpZXIgaGVyZT8KKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCB8IFRNZXNzYWdlVHlwZTo6T25lV2F5ID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgaWRlbnRpZmllciA9IFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZvcm1hdCEoInt9Ont9Iiwgc2VsZi5zZXJ2aWNlX25hbWUsIGlkZW50aWZpZXIubmFtZSksCisgICAgICAgICAgICAgICAgICAgIC4uKmlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnRpZmllcikKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gc2VsZi5pbm5lci53cml0ZV9tZXNzYWdlX2JlZ2luKGlkZW50aWZpZXIpLAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc3RydWN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9maWVsZF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9maWVsZF9zdG9wKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2J5dGVzKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfYm9vbChiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTgoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTE2KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2kzMihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pNjQoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZG91YmxlKGQpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zdHJpbmcocykKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9saXN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc2V0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX21hcF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX21hcF9lbmQoKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5mbHVzaCgpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfYnl0ZShiKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7VEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2JlZ2luX3dpdGhfcHJlZml4ZWRfc2VydmljZV9uYW1lKCkgeworICAgICAgICBsZXQgbXV0IG9fcHJvdCA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJiYXIiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDE5XSA9IFsKKyAgICAgICAgICAgIDB4ODAsCisgICAgICAgICAgICAweDAxLCAvKiBwcm90b2NvbCBpZGVudGlmaWVyICovCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMSwgLyogbWVzc2FnZSB0eXBlICovCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA3LAorICAgICAgICAgICAgMHg2NiwKKyAgICAgICAgICAgIDB4NkYsCisgICAgICAgICAgICAweDZGLCAvKiAiZm9vIiAqLworICAgICAgICAgICAgMHgzQSwgLyogIjoiICovCisgICAgICAgICAgICAweDYyLAorICAgICAgICAgICAgMHg2MSwKKyAgICAgICAgICAgIDB4NzIsIC8qICJiYXIiICovCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAyIC8qIHNlcXVlbmNlIG51bWJlciAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXEhKG9fcHJvdC5pbm5lci50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSwgZXhwZWN0ZWQpOworICAgIH0KKworICAgIGZuIHRlc3Rfb2JqZWN0cygpIC0+IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+Pj4KKyAgICB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNDAsIDQwKTsKKyAgICAgICAgbGV0IChfLCB3X2NoYW4pID0gYy5zcGxpdCgpLnVud3JhcCgpOworICAgICAgICBsZXQgcHJvdCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHdfY2hhbiwgdHJ1ZSk7CisgICAgICAgIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoImZvbyIsIHByb3QpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9zdG9yZWQucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL3N0b3JlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU1OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9zdG9yZWQucnMKQEAgLTAsMCArMSwxOTYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29udmVydDo6SW50bzsKKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwKKyAgICBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsCit9OwordXNlIFByb3RvY29sRXJyb3JLaW5kOworCisvLy8gYFRJbnB1dFByb3RvY29sYCByZXF1aXJlZCB0byB1c2UgYSBgVE11bHRpcGxleGVkUHJvY2Vzc29yYC4KKy8vLworLy8vIEEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAgcmVhZHMgaW5jb21pbmcgbWVzc2FnZSBpZGVudGlmaWVycyB0byBkZXRlcm1pbmUgdG8KKy8vLyB3aGljaCBgVFByb2Nlc3NvcmAgcmVxdWVzdHMgc2hvdWxkIGJlIGZvcndhcmRlZC4gSG93ZXZlciwgb25jZSByZWFkLCB0aG9zZQorLy8vIG1lc3NhZ2UgaWRlbnRpZmllciBieXRlcyBhcmUgbm8gbG9uZ2VyIG9uIHRoZSB3aXJlLiBTaW5jZSBkb3duc3RyZWFtCisvLy8gcHJvY2Vzc29ycyBleHBlY3QgdG8gcmVhZCBtZXNzYWdlIGlkZW50aWZpZXJzIGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sCisvLy8gd2UgbmVlZCBzb21lIHdheSBvZiBzdXBwbHlpbmcgYSBgVE1lc3NhZ2VJZGVudGlmaWVyYCB3aXRoIHRoZSBzZXJ2aWNlLW5hbWUKKy8vLyBzdHJpcHBlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgdGhlIHJlY2VpdmVkIGBUTWVzc2FnZUlkZW50aWZpZXJgCisvLy8gKHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSkgYW5kIHBhc3NlcyBpdCB0byB0aGUgd3JhcHBlZCBgVElucHV0UHJvdG9jb2xgCisvLy8gd2hlbiBgVElucHV0UHJvdG9jb2w6OnJlYWRfbWVzc2FnZV9iZWdpbiguLi4pYCBpcyBjYWxsZWQuIEl0IGRlbGVnYXRlcyBhbGwKKy8vLyBvdGhlciBjYWxscyBkaXJlY3RseSB0byB0aGUgd3JhcHBlZCBgVElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gVGhpcyB0eXBlICoqc2hvdWxkIG5vdCoqIGJlIHVzZWQgYnkgYXBwbGljYXRpb24gY29kZS4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRTdG9yZWRJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUU3RvcmVkSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6c2VydmVyOjpUUHJvY2Vzc29yOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RJb0NoYW5uZWwsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIC8vIHNhbXBsZSBwcm9jZXNzb3IKKy8vLyBzdHJ1Y3QgQWN0dWFsUHJvY2Vzc29yOworLy8vIGltcGwgVFByb2Nlc3NvciBmb3IgQWN0dWFsUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gcHJvY2VzcygKKy8vLyAgICAgICAgICZzZWxmLAorLy8vICAgICAgICAgXzogJm11dCBUSW5wdXRQcm90b2NvbCwKKy8vLyAgICAgICAgIF86ICZtdXQgVE91dHB1dFByb3RvY29sCisvLy8gICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCkKKy8vLyAgICAgfQorLy8vIH0KKy8vLyBsZXQgcHJvY2Vzc29yID0gQWN0dWFsUHJvY2Vzc29yIHt9OworLy8vCisvLy8gLy8gY29uc3RydWN0IHRoZSBzaGFyZWQgdHJhbnNwb3J0CisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gY2hhbm5lbC5zcGxpdCgpLnVud3JhcCgpOworLy8vCisvLy8gLy8gY29uc3RydWN0IHRoZSBhY3R1YWwgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMKKy8vLyBsZXQgbXV0IGlfcHJvdCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoaV9jaGFuLCB0cnVlKTsKKy8vLyBsZXQgbXV0IG9fcHJvdCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KG9fY2hhbiwgdHJ1ZSk7CisvLy8KKy8vLyAvLyBtZXNzYWdlIGlkZW50aWZpZXIgcmVjZWl2ZWQgZnJvbSByZW1vdGUgYW5kIG1vZGlmaWVkIHRvIHJlbW92ZSB0aGUgc2VydmljZSBuYW1lCisvLy8gbGV0IG5ld19tc2dfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic2VydmljZV9jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKy8vLworLy8vIC8vIGNvbnN0cnVjdCB0aGUgcHJveHkgaW5wdXQgcHJvdG9jb2wKKy8vLyBsZXQgbXV0IHByb3h5X2lfcHJvdCA9IFRTdG9yZWRJbnB1dFByb3RvY29sOjpuZXcoJm11dCBpX3Byb3QsIG5ld19tc2dfaWRlbnQpOworLy8vIGxldCByZXMgPSBwcm9jZXNzb3IucHJvY2VzcygmbXV0IHByb3h5X2lfcHJvdCwgJm11dCBvX3Byb3QpOworLy8vIGBgYAorLy8gRklYTUU6IGltcGxlbWVudCBEZWJ1ZworcHViIHN0cnVjdCBUU3RvcmVkSW5wdXRQcm90b2NvbDwnYT4geworICAgIGlubmVyOiAmJ2EgbXV0IFRJbnB1dFByb3RvY29sLAorICAgIG1lc3NhZ2VfaWRlbnQ6IE9wdGlvbjxUTWVzc2FnZUlkZW50aWZpZXI+LAorfQorCitpbXBsPCdhPiBUU3RvcmVkSW5wdXRQcm90b2NvbDwnYT4geworICAgIC8vLyBDcmVhdGUgYSBgVFN0b3JlZElucHV0UHJvdG9jb2xgIHRoYXQgZGVsZWdhdGVzIGFsbCBjYWxscyBvdGhlciB0aGFuCisgICAgLy8vIGBUSW5wdXRQcm90b2NvbDo6cmVhZF9tZXNzYWdlX2JlZ2luKC4uLilgIHRvIGEgYHdyYXBwZWRgCisgICAgLy8vIGBUSW5wdXRQcm90b2NvbGAuIGBtZXNzYWdlX2lkZW50YCBpcyB0aGUgbW9kaWZpZWQgbWVzc2FnZSBpZGVudGlmaWVyIC0KKyAgICAvLy8gd2l0aCBzZXJ2aWNlIG5hbWUgc3RyaXBwZWQgLSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvCisgICAgLy8vIGB3cmFwcGVkLnJlYWRfbWVzc2FnZV9iZWdpbiguLi4pYC4KKyAgICBwdWIgZm4gbmV3KAorICAgICAgICB3cmFwcGVkOiAmbXV0IFRJbnB1dFByb3RvY29sLAorICAgICAgICBtZXNzYWdlX2lkZW50OiBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgKSAtPiBUU3RvcmVkSW5wdXRQcm90b2NvbCB7CisgICAgICAgIFRTdG9yZWRJbnB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIGlubmVyOiB3cmFwcGVkLAorICAgICAgICAgICAgbWVzc2FnZV9pZGVudDogbWVzc2FnZV9pZGVudC5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8J2E+IFRJbnB1dFByb3RvY29sIGZvciBUU3RvcmVkSW5wdXRQcm90b2NvbDwnYT4geworICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICBzZWxmLm1lc3NhZ2VfaWRlbnQudGFrZSgpLm9rX29yX2Vsc2UofHwgeworICAgICAgICAgICAgOjplcnJvcnM6Om5ld19wcm90b2NvbF9lcnJvcigKKyAgICAgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAibWVzc2FnZSBpZGVudGlmaWVyIGFscmVhZHkgcmVhZCIsCisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zdHJ1Y3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zdHJ1Y3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfZmllbGRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2J5dGVzKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9ib29sKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2k4KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfaTE2KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfaTMyKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfaTY0KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfZG91YmxlKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc3RyaW5nKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2xpc3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3NldF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX21hcF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX21hcF9lbmQoKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2J5dGUoKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvc2VydmVyL21vZC5ycyBiL2xpYi9ycy9zcmMvc2VydmVyL21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGIzODFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbW9kLnJzCkBAIC0wLDAgKzEsMTI0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUeXBlcyB1c2VkIHRvIGltcGxlbWVudCBhIFRocmlmdCBzZXJ2ZXIuCisKK3VzZSBwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKK3VzZSB7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworCittb2QgbXVsdGlwbGV4ZWQ7Cittb2QgdGhyZWFkZWQ7CisKK3B1YiB1c2Ugc2VsZjo6bXVsdGlwbGV4ZWQ6OlRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKK3B1YiB1c2Ugc2VsZjo6dGhyZWFkZWQ6OlRTZXJ2ZXI7CisKKy8vLyBIYW5kbGVzIGluY29taW5nIFRocmlmdCBtZXNzYWdlcyBhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHRoZSB1c2VyLWRlZmluZWQKKy8vLyBoYW5kbGVyIGZ1bmN0aW9ucy4KKy8vLworLy8vIEFuIGltcGxlbWVudGF0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGZvciBlYWNoIFRocmlmdCBzZXJ2aWNlLiBXaGVuIHVzZWQgYnkgYQorLy8vIHNlcnZlciAoZm9yIGV4YW1wbGUsIGEgYFRTaW1wbGVTZXJ2ZXJgKSwgaXQgd2lsbCBkZW11eCBpbmNvbWluZyBzZXJ2aWNlCisvLy8gY2FsbHMgYW5kIGludm9rZSB0aGUgY29ycmVzcG9uZGluZyB1c2VyLWRlZmluZWQgaGFuZGxlciBmdW5jdGlvbi4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgc3RhcnQgYSBzZXJ2ZXIgdXNpbmcgdGhlIGF1dG8tZ2VuZXJhdGVkIGBUUHJvY2Vzc29yYCBmb3IKKy8vLyBhIFRocmlmdCBzZXJ2aWNlIGBTaW1wbGVTZXJ2aWNlYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRQcm9jZXNzb3I7CisvLy8KKy8vLyAvLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkCisvLy8gLy8KKy8vLworLy8vIC8vIHByb2Nlc3NvciBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBuZXc8SDogU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyPihwcm9jZXNzb3I6IEgpIC0+IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBgVFByb2Nlc3NvcmAgaW1wbGVtZW50YXRpb24gZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIGltcGwgVFByb2Nlc3NvciBmb3IgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBwcm9jZXNzKCZzZWxmLCBpOiAmbXV0IFRJbnB1dFByb3RvY29sLCBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBzZXJ2aWNlIGZ1bmN0aW9ucyBmb3IgU2ltcGxlU2VydmljZQorLy8vIHRyYWl0IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+OworLy8vIH0KKy8vLworLy8vIC8vCisvLy8gLy8gdXNlci1jb2RlIGZvbGxvd3MKKy8vLyAvLworLy8vCisvLy8gLy8gZGVmaW5lIGEgaGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIGBzZXJ2aWNlX2NhbGxgIGlzIHJlY2VpdmVkCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbDsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciBmb3IgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IKKy8vLyBsZXQgcHJvY2Vzc29yID0gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwge30pOworLy8vCisvLy8gLy8gYXQgdGhpcyBwb2ludCB5b3UgY2FuIHBhc3MgdGhlIHByb2Nlc3NvciB0byB0aGUgc2VydmVyCisvLy8gLy8gbGV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldyguLi4sIHByb2Nlc3Nvcik7CisvLy8gYGBgCitwdWIgdHJhaXQgVFByb2Nlc3NvciB7CisgICAgLy8vIFByb2Nlc3MgYSBUaHJpZnQgc2VydmljZSBjYWxsLgorICAgIC8vLworICAgIC8vLyBSZWFkcyBhcmd1bWVudHMgZnJvbSBgaWAsIGV4ZWN1dGVzIHRoZSB1c2VyJ3MgaGFuZGxlciBjb2RlLCBhbmQgd3JpdGVzCisgICAgLy8vIHRoZSByZXNwb25zZSB0byBgb2AuCisgICAgLy8vCisgICAgLy8vIFJldHVybnMgYCgpYCBpZiB0aGUgaGFuZGxlciB3YXMgZXhlY3V0ZWQ7IGBFcnJgIG90aGVyd2lzZS4KKyAgICBmbiBwcm9jZXNzKCZzZWxmLCBpOiAmbXV0IFRJbnB1dFByb3RvY29sLCBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gOjpSZXN1bHQ8KCk+OworfQorCisvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdXNlZCBpbiBnZW5lcmF0ZWQgYFRQcm9jZXNzb3JgIGltcGxlbWVudGF0aW9ucyB0bworLy8vIHJldHVybiBhbiBgQXBwbGljYXRpb25FcnJvcmAgaWYgdGhyaWZ0IG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsZWQuCitwdWIgZm4gaGFuZGxlX3Byb2Nlc3NfcmVzdWx0KAorICAgIG1zZ19pZGVudDogJlRNZXNzYWdlSWRlbnRpZmllciwKKyAgICByZXM6IDo6UmVzdWx0PCgpPiwKKyAgICBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sLAorKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGxldCBFcnIoZSkgPSByZXMgeworICAgICAgICBsZXQgZSA9IG1hdGNoIGUgeworICAgICAgICAgICAgOjpFcnJvcjo6QXBwbGljYXRpb24oYSkgPT4gYSwKKyAgICAgICAgICAgIF8gPT4gQXBwbGljYXRpb25FcnJvcjo6bmV3KEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLCBmb3JtYXQhKCJ7Oj99IiwgZSkpLAorICAgICAgICB9OworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgbXNnX2lkZW50Lm5hbWUuY2xvbmUoKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uLAorICAgICAgICAgICAgbXNnX2lkZW50LnNlcXVlbmNlX251bWJlciwKKyAgICAgICAgKTsKKworICAgICAgICBvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpPzsKKyAgICAgICAgOjpFcnJvcjo6d3JpdGVfYXBwbGljYXRpb25fZXJyb3JfdG9fb3V0X3Byb3RvY29sKCZlLCBvX3Byb3QpPzsKKyAgICAgICAgb19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OworICAgICAgICBvX3Byb3QuZmx1c2goKQorICAgIH0gZWxzZSB7CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvc2VydmVyL211bHRpcGxleGVkLnJzIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbXVsdGlwbGV4ZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzMzc5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvc2VydmVyL211bHRpcGxleGVkLnJzCkBAIC0wLDAgKzEsMzUxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwordXNlIHN0ZDo6Y29udmVydDo6SW50bzsKK3VzZSBzdGQ6OmZtdDsKK3VzZSBzdGQ6OmZtdDo6e0RlYnVnLCBGb3JtYXR0ZXJ9OwordXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OworCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUT3V0cHV0UHJvdG9jb2wsIFRTdG9yZWRJbnB1dFByb3RvY29sfTsKKwordXNlIHN1cGVyOjp7aGFuZGxlX3Byb2Nlc3NfcmVzdWx0LCBUUHJvY2Vzc29yfTsKKworY29uc3QgTUlTU0lOR19TRVBBUkFUT1JfQU5EX05PX0RFRkFVTFQ6ICYnc3RhdGljIHN0ciA9CisgICAgIm1pc3Npbmcgc2VydmljZSBzZXBhcmF0b3IgYW5kIG5vIGRlZmF1bHQgcHJvY2Vzc29yIHNldCI7Cit0eXBlIFRocmVhZFNhZmVQcm9jZXNzb3IgPSBCb3g8VFByb2Nlc3NvciArIFNlbmQgKyBTeW5jPjsKKworLy8vIEEgYFRQcm9jZXNzb3JgIHRoYXQgY2FuIGRlbXV4IHNlcnZpY2UgY2FsbHMgdG8gbXVsdGlwbGUgdW5kZXJseWluZworLy8vIFRocmlmdCBzZXJ2aWNlcy4KKy8vLworLy8vIFVzZXJzIHJlZ2lzdGVyIHNlcnZpY2Utc3BlY2lmaWMgYFRQcm9jZXNzb3JgIGluc3RhbmNlcyB3aXRoIGEKKy8vLyBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCwgYW5kIHRoZW4gcmVnaXN0ZXIgdGhhdCBwcm9jZXNzb3Igd2l0aCBhIHNlcnZlcgorLy8vIGltcGxlbWVudGF0aW9uLiBGb2xsb3dpbmcgdGhhdCwgYWxsIGluY29taW5nIHNlcnZpY2UgY2FsbHMgYXJlIGF1dG9tYXRpY2FsbHkKKy8vLyByb3V0ZWQgdG8gdGhlIHNlcnZpY2Utc3BlY2lmaWMgYFRQcm9jZXNzb3JgLgorLy8vCisvLy8gQSBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCBjYW4gb25seSBoYW5kbGUgbWVzc2FnZXMgc2VudCBieSBhCisvLy8gYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgIHN0b3JlZDogTXV0ZXg8U3RvcmVkUHJvY2Vzc29ycz4sCit9CisKKyNbZGVyaXZlKERlZmF1bHQpXQorc3RydWN0IFN0b3JlZFByb2Nlc3NvcnMgeworICAgIHByb2Nlc3NvcnM6IEhhc2hNYXA8U3RyaW5nLCBBcmM8VGhyZWFkU2FmZVByb2Nlc3Nvcj4+LAorICAgIGRlZmF1bHRfcHJvY2Vzc29yOiBPcHRpb248QXJjPFRocmVhZFNhZmVQcm9jZXNzb3I+PiwKK30KKworaW1wbCBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAgd2l0aCBubyByZWdpc3RlcmVkIHNlcnZpY2Utc3BlY2lmaWMKKyAgICAvLy8gcHJvY2Vzc29ycy4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICAgICAgICAgIHN0b3JlZDogTXV0ZXg6Om5ldyhTdG9yZWRQcm9jZXNzb3JzIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzb3JzOiBIYXNoTWFwOjpuZXcoKSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0X3Byb2Nlc3NvcjogTm9uZSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFJlZ2lzdGVyIGEgc2VydmljZS1zcGVjaWZpYyBgcHJvY2Vzc29yYCBmb3IgdGhlIHNlcnZpY2UgbmFtZWQKKyAgICAvLy8gYHNlcnZpY2VfbmFtZWAuIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYWxzbyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoCisgICAgLy8vIG5vbi1tdWx0aXBsZXhlZCBjbGllbnRzLiBTZXQgYGFzX2RlZmF1bHRgIHRvIGB0cnVlYCB0byBhbGxvdworICAgIC8vLyBub24tbmFtZXNwYWNlZCByZXF1ZXN0cyB0byBiZSBkaXNwYXRjaGVkIHRvIGEgZGVmYXVsdCBwcm9jZXNzb3IuCisgICAgLy8vCisgICAgLy8vIFJldHVybnMgc3VjY2VzcyBpZiBhIG5ldyBlbnRyeSB3YXMgaW5zZXJ0ZWQuIFJldHVybnMgYW4gZXJyb3IgaWY6CisgICAgLy8vICogQSBwcm9jZXNzb3IgZXhpc3RzIGZvciBgc2VydmljZV9uYW1lYAorICAgIC8vLyAqIFlvdSBhdHRlbXB0IHRvIHJlZ2lzdGVyIGEgcHJvY2Vzc29yIGFzIGRlZmF1bHQsIGFuZCBhbiBleGlzdGluZyBkZWZhdWx0IGV4aXN0cworICAgICNbY2ZnX2F0dHIoZmVhdHVyZSA9ICJjYXJnby1jbGlwcHkiLCBhbGxvdyhtYXBfZW50cnkpKV0KKyAgICBwdWIgZm4gcmVnaXN0ZXI8UzogSW50bzxTdHJpbmc+PigKKyAgICAgICAgJm11dCBzZWxmLAorICAgICAgICBzZXJ2aWNlX25hbWU6IFMsCisgICAgICAgIHByb2Nlc3NvcjogQm94PFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYz4sCisgICAgICAgIGFzX2RlZmF1bHQ6IGJvb2wsCisgICAgKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgbXV0IHN0b3JlZCA9IHNlbGYuc3RvcmVkLmxvY2soKS51bndyYXAoKTsKKworICAgICAgICBsZXQgbmFtZSA9IHNlcnZpY2VfbmFtZS5pbnRvKCk7CisgICAgICAgIGlmICFzdG9yZWQucHJvY2Vzc29ycy5jb250YWluc19rZXkoJm5hbWUpIHsKKyAgICAgICAgICAgIGxldCBwcm9jZXNzb3IgPSBBcmM6Om5ldyhwcm9jZXNzb3IpOworCisgICAgICAgICAgICBpZiBhc19kZWZhdWx0IHsKKyAgICAgICAgICAgICAgICBpZiBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IuaXNfbm9uZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMuaW5zZXJ0KG5hbWUsIHByb2Nlc3Nvci5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yID0gU29tZShwcm9jZXNzb3IuY2xvbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEVycigiY2Fubm90IHJlc2V0IGRlZmF1bHQgcHJvY2Vzc29yIi5pbnRvKCkpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG9yZWQucHJvY2Vzc29ycy5pbnNlcnQobmFtZSwgcHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVycihmb3JtYXQhKCJjYW5ub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIHByb2Nlc3NvciBmb3Igc2VydmljZSB7fSIsIG5hbWUpLmludG8oKSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHByb2Nlc3NfbWVzc2FnZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIG1zZ19pZGVudDogJlRNZXNzYWdlSWRlbnRpZmllciwKKyAgICAgICAgaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLAorICAgICAgICBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sLAorICAgICkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IChzdmNfbmFtZSwgc3ZjX2NhbGwpID0gc3BsaXRfaWRlbnRfbmFtZSgmbXNnX2lkZW50Lm5hbWUpOworICAgICAgICBkZWJ1ZyEoInJvdXRpbmcgc3ZjX25hbWUgezo/fSBzdmNfY2FsbCB7fSIsICZzdmNfbmFtZSwgJnN2Y19jYWxsKTsKKworICAgICAgICBsZXQgcHJvY2Vzc29yOiBPcHRpb248QXJjPFRocmVhZFNhZmVQcm9jZXNzb3I+PiA9IHsKKyAgICAgICAgICAgIGxldCBzdG9yZWQgPSBzZWxmLnN0b3JlZC5sb2NrKCkudW53cmFwKCk7CisgICAgICAgICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHN2Y19uYW1lIHsKKyAgICAgICAgICAgICAgICBzdG9yZWQucHJvY2Vzc29ycy5nZXQobmFtZSkuY2xvbmVkKCkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yLmNsb25lKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtYXRjaCBwcm9jZXNzb3IgeworICAgICAgICAgICAgU29tZShhcmMpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbmV3X21zZ19pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgICAgICAgICBzdmNfY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgbXNnX2lkZW50Lm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbXNnX2lkZW50LnNlcXVlbmNlX251bWJlciwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGxldCBtdXQgcHJveHlfaV9wcm90ID0gVFN0b3JlZElucHV0UHJvdG9jb2w6Om5ldyhpX3Byb3QsIG5ld19tc2dfaWRlbnQpOworICAgICAgICAgICAgICAgICgqYXJjKS5wcm9jZXNzKCZtdXQgcHJveHlfaV9wcm90LCBvX3Byb3QpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb25lID0+IEVycihtaXNzaW5nX3Byb2Nlc3Nvcl9tZXNzYWdlKHN2Y19uYW1lKS5pbnRvKCkpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRQcm9jZXNzb3IgZm9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgZm4gcHJvY2Vzcygmc2VsZiwgaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgbXNnX2lkZW50ID0gaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpPzsKKworICAgICAgICBkZWJ1ZyEoInByb2Nlc3MgaW5jb21pbmcgbXNnIGlkOns6P30iLCAmbXNnX2lkZW50KTsKKyAgICAgICAgbGV0IHJlcyA9IHNlbGYucHJvY2Vzc19tZXNzYWdlKCZtc2dfaWRlbnQsIGlfcHJvdCwgb19wcm90KTsKKworICAgICAgICBoYW5kbGVfcHJvY2Vzc19yZXN1bHQoJm1zZ19pZGVudCwgcmVzLCBvX3Byb3QpCisgICAgfQorfQorCitpbXBsIERlYnVnIGZvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbGV0IHN0b3JlZCA9IHNlbGYuc3RvcmVkLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgd3JpdGUhKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJUTXVsdGlwbGV4ZWRQcm9jZXNzIHt7IHJlZ2lzdGVyZWRfY291bnQ6IHs6P30gZGVmYXVsdDogezo/fSB9fSIsCisgICAgICAgICAgICBzdG9yZWQucHJvY2Vzc29ycy5rZXlzKCkubGVuKCksCisgICAgICAgICAgICBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IuaXNfc29tZSgpCisgICAgICAgICkKKyAgICB9Cit9CisKK2ZuIHNwbGl0X2lkZW50X25hbWUoaWRlbnRfbmFtZTogJnN0cikgLT4gKE9wdGlvbjwmc3RyPiwgJnN0cikgeworICAgIGlkZW50X25hbWUKKyAgICAgICAgLmZpbmQoJzonKQorICAgICAgICAubWFwKHxwb3N8IHsKKyAgICAgICAgICAgIGxldCAoc3ZjX25hbWUsIHN2Y19jYWxsKSA9IGlkZW50X25hbWUuc3BsaXRfYXQocG9zKTsKKyAgICAgICAgICAgIGxldCAoXywgc3ZjX2NhbGwpID0gc3ZjX2NhbGwuc3BsaXRfYXQoMSk7IC8vIHJlbW92ZSBjb2xvbiBmcm9tIHNlcnZpY2UgY2FsbCBuYW1lCisgICAgICAgICAgICAoU29tZShzdmNfbmFtZSksIHN2Y19jYWxsKQorICAgICAgICB9KQorICAgICAgICAub3JfZWxzZSh8fCBTb21lKChOb25lLCBpZGVudF9uYW1lKSkpCisgICAgICAgIC51bndyYXAoKQorfQorCitmbiBtaXNzaW5nX3Byb2Nlc3Nvcl9tZXNzYWdlKHN2Y19uYW1lOiBPcHRpb248JnN0cj4pIC0+IFN0cmluZyB7CisgICAgbWF0Y2ggc3ZjX25hbWUgeworICAgICAgICBTb21lKG5hbWUpID0+IGZvcm1hdCEoIm5vIHByb2Nlc3NvciBmb3VuZCBmb3Igc2VydmljZSB7fSIsIG5hbWUpLAorICAgICAgICBOb25lID0+IE1JU1NJTkdfU0VQQVJBVE9SX0FORF9OT19ERUZBVUxULnRvX293bmVkKCksCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN0ZDo6Y29udmVydDo6SW50bzsKKyAgICB1c2Ugc3RkOjpzeW5jOjphdG9taWM6OntBdG9taWNCb29sLCBPcmRlcmluZ307CisgICAgdXNlIHN0ZDo6c3luYzo6QXJjOworCisgICAgdXNlIHByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGV9OworICAgIHVzZSB0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisgICAgdXNlIHtBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3NwbGl0X25hbWVfaW50b19wcm9wZXJfc2VwYXJhdG9yX2FuZF9zZXJ2aWNlX2NhbGwoKSB7CisgICAgICAgIGxldCBpZGVudF9uYW1lID0gImZvbzpiYXJfY2FsbCI7CisgICAgICAgIGxldCAoc2VydiwgY2FsbCkgPSBzcGxpdF9pZGVudF9uYW1lKCZpZGVudF9uYW1lKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZXJ2LCBTb21lKCJmb28iKSk7CisgICAgICAgIGFzc2VydF9lcSEoY2FsbCwgImJhcl9jYWxsIik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9yZXR1cm5fZnVsbF9pZGVudF9pZl9ub19zZXBhcmF0b3JfZXhpc3RzKCkgeworICAgICAgICBsZXQgaWRlbnRfbmFtZSA9ICJiYXJfY2FsbCI7CisgICAgICAgIGxldCAoc2VydiwgY2FsbCkgPSBzcGxpdF9pZGVudF9uYW1lKCZpZGVudF9uYW1lKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZXJ2LCBOb25lKTsKKyAgICAgICAgYXNzZXJ0X2VxIShjYWxsLCAiYmFyX2NhbGwiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3dyaXRlX2Vycm9yX2lmX25vX3NlcGFyYXRvcl9mb3VuZF9hbmRfbm9fZGVmYXVsdF9wcm9jZXNzb3JfZXhpc3RzKCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiZm9vIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgbGV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOyAvLyBhdCB0aGlzIHBvaW50IGFuIGVycm9yIHNob3VsZCBiZSB3cml0dGVuIG91dAorCisgICAgICAgIGkudHJhbnNwb3J0LnNldF9yZWFkYWJsZV9ieXRlcygmby50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSk7CisgICAgICAgIGxldCByY3ZkX2lkZW50ID0gaS5yZWFkX21lc3NhZ2VfYmVnaW4oKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uLCAxMCk7CisgICAgICAgIGFzc2VydF9lcSEocmN2ZF9pZGVudCwgZXhwZWN0ZWRfaWRlbnQpOworICAgICAgICBsZXQgcmN2ZF9lcnIgPSA6OkVycm9yOjpyZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woJm11dCBpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2VyciA9IEFwcGxpY2F0aW9uRXJyb3I6Om5ldygKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgTUlTU0lOR19TRVBBUkFUT1JfQU5EX05PX0RFRkFVTFQsCisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9lcSEocmN2ZF9lcnIsIGV4cGVjdGVkX2Vycik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF93cml0ZV9lcnJvcl9pZl9zZXBhcmF0b3JfZXhpc3RzX2FuZF9ub19wcm9jZXNzb3JfZm91bmQoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJtaXNzaW5nOmNhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBsZXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7IC8vIGF0IHRoaXMgcG9pbnQgYW4gZXJyb3Igc2hvdWxkIGJlIHdyaXR0ZW4gb3V0CisKKyAgICAgICAgaS50cmFuc3BvcnQuc2V0X3JlYWRhYmxlX2J5dGVzKCZvLnRyYW5zcG9ydC53cml0ZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IHJjdmRfaWRlbnQgPSBpLnJlYWRfbWVzc2FnZV9iZWdpbigpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygibWlzc2luZzpjYWxsIiwgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sIDEwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2lkZW50LCBleHBlY3RlZF9pZGVudCk7CisgICAgICAgIGxldCByY3ZkX2VyciA9IDo6RXJyb3I6OnJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbCgmbXV0IGkpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZXJyID0gQXBwbGljYXRpb25FcnJvcjo6bmV3KAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtaXNzaW5nX3Byb2Nlc3Nvcl9tZXNzYWdlKFNvbWUoIm1pc3NpbmciKSksCisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9lcSEocmN2ZF9lcnIsIGV4cGVjdGVkX2Vycik7CisgICAgfQorCisgICAgI1tkZXJpdmUoRGVmYXVsdCldCisgICAgc3RydWN0IFNlcnZpY2UgeworICAgICAgICBwdWIgaW52b2tlZDogQXJjPEF0b21pY0Jvb2w+LAorICAgIH0KKworICAgIGltcGwgVFByb2Nlc3NvciBmb3IgU2VydmljZSB7CisgICAgICAgIGZuIHByb2Nlc3MoJnNlbGYsIF86ICZtdXQgVElucHV0UHJvdG9jb2wsIF86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAgICAgbGV0IHJlcyA9IHNlbGYKKyAgICAgICAgICAgICAgICAuaW52b2tlZAorICAgICAgICAgICAgICAgIC5jb21wYXJlX2FuZF9zd2FwKGZhbHNlLCB0cnVlLCBPcmRlcmluZzo6UmVsYXhlZCk7CisgICAgICAgICAgICBpZiByZXMgeworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBFcnIoImZhaWxlZCBzd2FwIi5pbnRvKCkpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3JvdXRlX2NhbGxfdG9fY29ycmVjdF9wcm9jZXNzb3IoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICAvLyBidWlsZCB0aGUgc2VydmljZXMKKyAgICAgICAgbGV0IHN2Y18xID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8xID0gc3ZjXzEuaW52b2tlZC5jbG9uZSgpOworICAgICAgICBsZXQgc3ZjXzIgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzIgPSBzdmNfMi5pbnZva2VkLmNsb25lKCk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlbQorICAgICAgICBsZXQgbXV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzEiLCBCb3g6Om5ldyhzdmNfMSksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8yIiwgQm94OjpuZXcoc3ZjXzIpLCBmYWxzZSkudW53cmFwKCk7CisKKyAgICAgICAgLy8gbWFrZSB0aGUgc2VydmljZSBjYWxsCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInNlcnZpY2VfMTpjYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsKKworICAgICAgICAvLyBzZXJ2aWNlIDEgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkLCBub3Qgc2VydmljZSAyCisgICAgICAgIGFzc2VydF9lcSEoYXRtXzEubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIHRydWUpOworICAgICAgICBhc3NlcnRfZXEhKGF0bV8yLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCBmYWxzZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9yb3V0ZV9jYWxsX3RvX2NvcnJlY3RfcHJvY2Vzc29yX2lmX25vX3NlcGFyYXRvcl9leGlzdHNfYW5kX2RlZmF1bHRfcHJvY2Vzc29yX3NldCgpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIC8vIGJ1aWxkIHRoZSBzZXJ2aWNlcworICAgICAgICBsZXQgc3ZjXzEgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzEgPSBzdmNfMS5pbnZva2VkLmNsb25lKCk7CisgICAgICAgIGxldCBzdmNfMiA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMiA9IHN2Y18yLmludm9rZWQuY2xvbmUoKTsKKworICAgICAgICAvLyByZWdpc3RlciB0aGVtCisgICAgICAgIGxldCBtdXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMSIsIEJveDo6bmV3KHN2Y18xKSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzIiLCBCb3g6Om5ldyhzdmNfMiksIHRydWUpLnVud3JhcCgpOyAvLyBzZWNvbmQgcHJvY2Vzc29yIGlzIGRlZmF1bHQKKworICAgICAgICAvLyBtYWtlIHRoZSBzZXJ2aWNlIGNhbGwgKGl0J3MgYW4gb2xkIGNsaWVudCwgc28gd2UgaGF2ZSB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSkKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygib2xkX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOworCisgICAgICAgIC8vIHNlcnZpY2UgMiBzaG91bGQgaGF2ZSBiZWVuIGludm9rZWQsIG5vdCBzZXJ2aWNlIDEKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMS5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgZmFsc2UpOworICAgICAgICBhc3NlcnRfZXEhKGF0bV8yLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCB0cnVlKTsKKyAgICB9CisKKyAgICBmbiBidWlsZF9vYmplY3RzKCkgLT4gKAorICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbDxSZWFkSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTI4LCAxMjgpOworICAgICAgICBsZXQgKHJfYywgd19jKSA9IGMuc3BsaXQoKS51bndyYXAoKTsKKyAgICAgICAgKAorICAgICAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhyX2MsIHRydWUpLAorICAgICAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcod19jLCB0cnVlKSwKKyAgICAgICAgKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvc2VydmVyL3RocmVhZGVkLnJzIGIvbGliL3JzL3NyYy9zZXJ2ZXIvdGhyZWFkZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzOWE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvc2VydmVyL3RocmVhZGVkLnJzCkBAIC0wLDAgKzEsMjM0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6Om5ldDo6e1RjcExpc3RlbmVyLCBUY3BTdHJlYW19OwordXNlIHN0ZDo6c3luYzo6QXJjOwordXNlIHRocmVhZHBvb2w6OlRocmVhZFBvb2w7CisKK3VzZSBwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07Cit1c2UgdHJhbnNwb3J0Ojp7VElvQ2hhbm5lbCwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUVGNwQ2hhbm5lbCwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07Cit1c2Uge0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKwordXNlIHN1cGVyOjpUUHJvY2Vzc29yOworCisvLy8gRml4ZWQtc2l6ZSB0aHJlYWQtcG9vbCBibG9ja2luZyBUaHJpZnQgc2VydmVyLgorLy8vCisvLy8gQSBgVFNlcnZlcmAgbGlzdGVucyBvbiBhIGdpdmVuIGFkZHJlc3MgYW5kIHN1Ym1pdHMgYWNjZXB0ZWQgY29ubmVjdGlvbnMKKy8vLyB0byBhbiAqKnVuYm91bmRlZCoqIHF1ZXVlLiBDb25uZWN0aW9ucyBmcm9tIHRoaXMgcXVldWUgYXJlIHNlcnZpY2VkIGJ5CisvLy8gdGhlIGZpcnN0IGF2YWlsYWJsZSB3b3JrZXIgdGhyZWFkIGZyb20gYSAqKmZpeGVkLXNpemUqKiB0aHJlYWQgcG9vbC4gRWFjaAorLy8vIGFjY2VwdGVkIGNvbm5lY3Rpb24gaXMgaGFuZGxlZCBieSB0aGF0IHdvcmtlciB0aHJlYWQsIGFuZCBjb21tdW5pY2F0aW9uCisvLy8gb3ZlciB0aGlzIHRocmVhZCBvY2N1cnMgc2VxdWVudGlhbGx5IGFuZCBzeW5jaHJvbm91c2x5IChpLmUuIGNhbGxzIGJsb2NrKS4KKy8vLyBBY2NlcHRlZCBjb25uZWN0aW9ucyBoYXZlIGFuIGlucHV0IGhhbGYgYW5kIGFuIG91dHB1dCBoYWxmLCBlYWNoIG9mIHdoaWNoCisvLy8gdXNlcyBhIGBUVHJhbnNwb3J0YCBhbmQgYFRJbnB1dFByb3RvY29sYC9gVE91dHB1dFByb3RvY29sYCB0byB0cmFuc2xhdGUKKy8vLyBtZXNzYWdlcyB0byBhbmQgZnJvbSBieWVzLiBBbnkgY29tYmluYXRpb24gb2YgYFRJbnB1dFByb3RvY29sYCwgYFRPdXRwdXRQcm90b2NvbGAKKy8vLyBhbmQgYFRUcmFuc3BvcnRgIG1heSBiZSB1c2VkLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRpbmcgYW5kIHJ1bm5pbmcgYSBgVFNlcnZlcmAgdXNpbmcgVGhyaWZ0LWNvbXBpbGVyLWdlbmVyYXRlZAorLy8vIHNlcnZpY2UgY29kZS4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0OjpzZXJ2ZXI6OntUUHJvY2Vzc29yLCBUU2VydmVyfTsKKy8vLworLy8vIC8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQKKy8vLyAvLworLy8vCisvLy8gLy8gcHJvY2Vzc29yIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIG5ldzxIOiBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXI+KHByb2Nlc3NvcjogSCkgLT4gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGBUUHJvY2Vzc29yYCBpbXBsZW1lbnRhdGlvbiBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gaW1wbCBUUHJvY2Vzc29yIGZvciBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIHByb2Nlc3MoJnNlbGYsIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsIG86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIHNlcnZpY2UgZnVuY3Rpb25zIGZvciBTaW1wbGVTZXJ2aWNlCisvLy8gdHJhaXQgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT47CisvLy8gfQorLy8vCisvLy8gLy8KKy8vLyAvLyB1c2VyLWNvZGUgZm9sbG93cworLy8vIC8vCisvLy8KKy8vLyAvLyBkZWZpbmUgYSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gYHNlcnZpY2VfY2FsbGAgaXMgcmVjZWl2ZWQKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIGZvciBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvcgorLy8vIGxldCBwcm9jZXNzb3IgPSBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7fSk7CisvLy8KKy8vLyAvLyBpbnN0YW50aWF0ZSB0aGUgc2VydmVyCisvLy8gbGV0IGlfdHJfZmFjdDogQm94PFRSZWFkVHJhbnNwb3J0RmFjdG9yeT4gPSBCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpOworLy8vIGxldCBpX3ByX2ZhY3Q6IEJveDxUSW5wdXRQcm90b2NvbEZhY3Rvcnk+ID0gQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSk7CisvLy8gbGV0IG9fdHJfZmFjdDogQm94PFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSk7CisvLy8gbGV0IG9fcHJfZmFjdDogQm94PFRPdXRwdXRQcm90b2NvbEZhY3Rvcnk+ID0gQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpOworLy8vCisvLy8gbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisvLy8gICAgIGlfdHJfZmFjdCwKKy8vLyAgICAgaV9wcl9mYWN0LAorLy8vICAgICBvX3RyX2ZhY3QsCisvLy8gICAgIG9fcHJfZmFjdCwKKy8vLyAgICAgcHJvY2Vzc29yLAorLy8vICAgICAxMAorLy8vICk7CisvLy8KKy8vLyAvLyBzdGFydCBsaXN0ZW5pbmcgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zCisvLy8gbWF0Y2ggc2VydmVyLmxpc3RlbigiMTI3LjAuMC4xOjgwODAiKSB7CisvLy8gICBPayhfKSAgPT4gcHJpbnRsbiEoImxpc3RlbiBjb21wbGV0ZWQiKSwKKy8vLyAgIEVycihlKSA9PiBwcmludGxuISgibGlzdGVuIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKSwKKy8vLyB9CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRTZXJ2ZXI8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+Cit3aGVyZQorICAgIFBSQzogVFByb2Nlc3NvciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICByX3RyYW5zX2ZhY3Rvcnk6IFJURiwKKyAgICBpX3Byb3RvX2ZhY3Rvcnk6IElQRiwKKyAgICB3X3RyYW5zX2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvX2ZhY3Rvcnk6IE9QRiwKKyAgICBwcm9jZXNzb3I6IEFyYzxQUkM+LAorICAgIHdvcmtlcl9wb29sOiBUaHJlYWRQb29sLAorfQorCitpbXBsPFBSQywgUlRGLCBJUEYsIFdURiwgT1BGPiBUU2VydmVyPFBSQywgUlRGLCBJUEYsIFdURiwgT1BGPgord2hlcmUKKyAgICBQUkM6IFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUU2VydmVyYC4KKyAgICAvLy8KKyAgICAvLy8gRWFjaCBhY2NlcHRlZCBjb25uZWN0aW9uIGhhcyBhbiBpbnB1dCBhbmQgb3V0cHV0IGhhbGYsIGVhY2ggb2Ygd2hpY2gKKyAgICAvLy8gcmVxdWlyZXMgYSBgVFRyYW5zcG9ydGAgYW5kIGBUUHJvdG9jb2xgLiBgVFNlcnZlcmAgdXNlcworICAgIC8vLyBgcmVhZF90cmFuc3BvcnRfZmFjdG9yeWAgYW5kIGBpbnB1dF9wcm90b2NvbF9mYWN0b3J5YCB0byBjcmVhdGUKKyAgICAvLy8gaW1wbGVtZW50YXRpb25zIGZvciB0aGUgaW5wdXQsIGFuZCBgd3JpdGVfdHJhbnNwb3J0X2ZhY3RvcnlgIGFuZAorICAgIC8vLyBgb3V0cHV0X3Byb3RvY29sX2ZhY3RvcnlgIHRvIGNyZWF0ZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBvdXRwdXQuCisgICAgcHViIGZuIG5ldygKKyAgICAgICAgcmVhZF90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgICAgICBpbnB1dF9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgICAgIHdyaXRlX3RyYW5zcG9ydF9mYWN0b3J5OiBXVEYsCisgICAgICAgIG91dHB1dF9wcm90b2NvbF9mYWN0b3J5OiBPUEYsCisgICAgICAgIHByb2Nlc3NvcjogUFJDLAorICAgICAgICBudW1fd29ya2VyczogdXNpemUsCisgICAgKSAtPiBUU2VydmVyPFBSQywgUlRGLCBJUEYsIFdURiwgT1BGPiB7CisgICAgICAgIFRTZXJ2ZXIgeworICAgICAgICAgICAgcl90cmFuc19mYWN0b3J5OiByZWFkX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgaV9wcm90b19mYWN0b3J5OiBpbnB1dF9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgd190cmFuc19mYWN0b3J5OiB3cml0ZV90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIG9fcHJvdG9fZmFjdG9yeTogb3V0cHV0X3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICBwcm9jZXNzb3I6IEFyYzo6bmV3KHByb2Nlc3NvciksCisgICAgICAgICAgICB3b3JrZXJfcG9vbDogVGhyZWFkUG9vbDo6d2l0aF9uYW1lKCJUaHJpZnQgc2VydmljZSBwcm9jZXNzb3IiLnRvX293bmVkKCksIG51bV93b3JrZXJzKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBMaXN0ZW4gZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIG9uIGBsaXN0ZW5fYWRkcmVzc2AuCisgICAgLy8vCisgICAgLy8vIGBsaXN0ZW5fYWRkcmVzc2Agc2hvdWxkIGJlIGluIHRoZSBmb3JtIGBob3N0OnBvcnRgLAorICAgIC8vLyBmb3IgZXhhbXBsZTogYDEyNy4wLjAuMTo4MDgwYC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJuIGAoKWAgaWYgc3VjY2Vzc2Z1bC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJuIGBFcnJgIHdoZW4gdGhlIHNlcnZlciBjYW5ub3QgYmluZCB0byBgbGlzdGVuX2FkZHJlc3NgIG9yIHRoZXJlCisgICAgLy8vIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgcHViIGZuIGxpc3RlbigmbXV0IHNlbGYsIGxpc3Rlbl9hZGRyZXNzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgbGlzdGVuZXIgPSBUY3BMaXN0ZW5lcjo6YmluZChsaXN0ZW5fYWRkcmVzcyk/OworICAgICAgICBmb3Igc3RyZWFtIGluIGxpc3RlbmVyLmluY29taW5nKCkgeworICAgICAgICAgICAgbWF0Y2ggc3RyZWFtIHsKKyAgICAgICAgICAgICAgICBPayhzKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCAoaV9wcm90LCBvX3Byb3QpID0gc2VsZi5uZXdfcHJvdG9jb2xzX2Zvcl9jb25uZWN0aW9uKHMpPzsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHByb2Nlc3NvciA9IHNlbGYucHJvY2Vzc29yLmNsb25lKCk7CisgICAgICAgICAgICAgICAgICAgIHNlbGYud29ya2VyX3Bvb2wKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKG1vdmUgfHwgaGFuZGxlX2luY29taW5nX2Nvbm5lY3Rpb24ocHJvY2Vzc29yLCBpX3Byb3QsIG9fcHJvdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgICAgICAgICB3YXJuISgiZmFpbGVkIHRvIGFjY2VwdCByZW1vdGUgY29ubmVjdGlvbiB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6ICJhYm9ydGVkIGxpc3RlbiBsb29wIi5pbnRvKCksCisgICAgICAgIH0pKQorICAgIH0KKworICAgIGZuIG5ld19wcm90b2NvbHNfZm9yX2Nvbm5lY3Rpb24oCisgICAgICAgICZtdXQgc2VsZiwKKyAgICAgICAgc3RyZWFtOiBUY3BTdHJlYW0sCisgICAgKSAtPiA6OlJlc3VsdDwoQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD4sIEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPik+IHsKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBzaGFyZWQgdGNwIHN0cmVhbQorICAgICAgICBsZXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjp3aXRoX3N0cmVhbShzdHJlYW0pOworCisgICAgICAgIC8vIHNwbGl0IGl0IGludG8gdHdvIC0gb25lIHRvIGJlIG93bmVkIGJ5IHRoZQorICAgICAgICAvLyBpbnB1dCB0cmFuL3Byb3RvIGFuZCB0aGUgb3RoZXIgYnkgdGhlIG91dHB1dAorICAgICAgICBsZXQgKHJfY2hhbiwgd19jaGFuKSA9IGNoYW5uZWwuc3BsaXQoKT87CisKKyAgICAgICAgLy8gaW5wdXQgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydAorICAgICAgICBsZXQgcl90cmFuID0gc2VsZi5yX3RyYW5zX2ZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KHJfY2hhbikpOworICAgICAgICBsZXQgaV9wcm90ID0gc2VsZi5pX3Byb3RvX2ZhY3RvcnkuY3JlYXRlKHJfdHJhbik7CisKKyAgICAgICAgLy8gb3V0cHV0IHByb3RvY29sIGFuZCB0cmFuc3BvcnQKKyAgICAgICAgbGV0IHdfdHJhbiA9IHNlbGYud190cmFuc19mYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyh3X2NoYW4pKTsKKyAgICAgICAgbGV0IG9fcHJvdCA9IHNlbGYub19wcm90b19mYWN0b3J5LmNyZWF0ZSh3X3RyYW4pOworCisgICAgICAgIE9rKChpX3Byb3QsIG9fcHJvdCkpCisgICAgfQorfQorCitmbiBoYW5kbGVfaW5jb21pbmdfY29ubmVjdGlvbjxQUkM+KAorICAgIHByb2Nlc3NvcjogQXJjPFBSQz4sCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIHdoZXJlCisgICAgUFJDOiBUUHJvY2Vzc29yLAoreworICAgIGxldCBtdXQgaV9wcm90ID0gaV9wcm90OworICAgIGxldCBtdXQgb19wcm90ID0gb19wcm90OworICAgIGxvb3AgeworICAgICAgICBsZXQgciA9IHByb2Nlc3Nvci5wcm9jZXNzKCZtdXQgKmlfcHJvdCwgJm11dCAqb19wcm90KTsKKyAgICAgICAgaWYgbGV0IEVycihlKSA9IHIgeworICAgICAgICAgICAgd2FybiEoInByb2Nlc3NvciBjb21wbGV0ZWQgd2l0aCBlcnJvcjogezo/fSIsIGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9idWZmZXJlZC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2J1ZmZlcmVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2ZlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9idWZmZXJlZC5ycwpAQCAtMCwwICsxLDQ4MyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjbXA7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCit1c2Ugc3VwZXI6OntUUmVhZFRyYW5zcG9ydCwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgcmVhZCBidWZmZXIgaW4gYnl0ZXMuCitjb25zdCBSRUFEX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSB3cml0ZSBidWZmZXIgaW4gYnl0ZXMuLgorY29uc3QgV1JJVEVfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIFRyYW5zcG9ydCB0aGF0IHJlYWRzIG1lc3NhZ2VzIHZpYSBhbiBpbnRlcm5hbCBidWZmZXIuCisvLy8KKy8vLyBBIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0YCBtYWludGFpbnMgYSBmaXhlZC1zaXplIGludGVybmFsIHJlYWQgYnVmZmVyLgorLy8vIE9uIGEgY2FsbCB0byBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6cmVhZCguLi4pYCBvbmUgZnVsbCBtZXNzYWdlIC0gYm90aAorLy8vIGZpeGVkLWxlbmd0aCBoZWFkZXIgYW5kIGJ5dGVzIC0gaXMgcmVhZCBmcm9tIHRoZSB3cmFwcGVkIGNoYW5uZWwgYW5kIGJ1ZmZlcmVkLgorLy8vIFN1YnNlcXVlbnQgcmVhZCBjYWxscyBhcmUgc2VydmljZWQgZnJvbSB0aGUgaW50ZXJuYWwgYnVmZmVyIHVudGlsIGl0IGlzCisvLy8gZXhoYXVzdGVkLCBhdCB3aGljaCBwb2ludCB0aGUgbmV4dCBmdWxsIG1lc3NhZ2UgaXMgcmVhZCBmcm9tIHRoZSB3cmFwcGVkCisvLy8gY2hhbm5lbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OlJlYWQ7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQucmVhZCgmbXV0IHZlYyFbMHU4OyAxXSkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBidWY6IEJveDxbdThdPiwKKyAgICBwb3M6IHVzaXplLAorICAgIGNhcDogdXNpemUsCisgICAgY2hhbjogQywKK30KKworaW1wbDxDPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggZGVmYXVsdC1zaXplZCBpbnRlcm5hbCByZWFkIGFuZAorICAgIC8vLyB3cml0ZSBidWZmZXJzIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KFJFQURfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgcmVhZCBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgcmVhZF9jYXBhY2l0eWAgYW5kIGFuIGludGVybmFsIHdyaXRlIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGB3cml0ZV9jYXBhY2l0eWAgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHJlYWRfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IHZlYyFbMDsgcmVhZF9jYXBhY2l0eV0uaW50b19ib3hlZF9zbGljZSgpLAorICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgY2FwOiAwLAorICAgICAgICAgICAgY2hhbjogY2hhbm5lbCwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGdldF9ieXRlcygmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8Jlt1OF0+IHsKKyAgICAgICAgaWYgc2VsZi5jYXAgLSBzZWxmLnBvcyA9PSAwIHsKKyAgICAgICAgICAgIHNlbGYucG9zID0gMDsKKyAgICAgICAgICAgIHNlbGYuY2FwID0gc2VsZi5jaGFuLnJlYWQoJm11dCBzZWxmLmJ1Zik/OworICAgICAgICB9CisKKyAgICAgICAgT2soJnNlbGYuYnVmW3NlbGYucG9zLi5zZWxmLmNhcF0pCisgICAgfQorCisgICAgZm4gY29uc3VtZSgmbXV0IHNlbGYsIGNvbnN1bWVkOiB1c2l6ZSkgeworICAgICAgICAvLyBUT0RPOiB3YXMgYSBidWcgaGVyZSArPSA8LS0gdGVzdCBzb21laG93CisgICAgICAgIHNlbGYucG9zID0gY21wOjptaW4oc2VsZi5jYXAsIHNlbGYucG9zICsgY29uc3VtZWQpOworICAgIH0KK30KKworaW1wbDxDPiBSZWFkIGZvciBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGJ1ZjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGxldCBtdXQgYnl0ZXNfcmVhZCA9IDA7CisKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBsZXQgbnJlYWQgPSB7CisgICAgICAgICAgICAgICAgbGV0IGF2YWlsX2J5dGVzID0gc2VsZi5nZXRfYnl0ZXMoKT87CisgICAgICAgICAgICAgICAgbGV0IGF2YWlsX3NwYWNlID0gYnVmLmxlbigpIC0gYnl0ZXNfcmVhZDsKKyAgICAgICAgICAgICAgICBsZXQgbnJlYWQgPSBjbXA6Om1pbihhdmFpbF9zcGFjZSwgYXZhaWxfYnl0ZXMubGVuKCkpOworICAgICAgICAgICAgICAgIGJ1ZltieXRlc19yZWFkLi4oYnl0ZXNfcmVhZCArIG5yZWFkKV0uY29weV9mcm9tX3NsaWNlKCZhdmFpbF9ieXRlc1suLm5yZWFkXSk7CisgICAgICAgICAgICAgICAgbnJlYWQKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNlbGYuY29uc3VtZShucmVhZCk7CisgICAgICAgICAgICBieXRlc19yZWFkICs9IG5yZWFkOworCisgICAgICAgICAgICBpZiBieXRlc19yZWFkID09IGJ1Zi5sZW4oKSB8fCBucmVhZCA9PSAwIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE9rKGJ5dGVzX3JlYWQpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5IGZvciBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworLy8vIFRyYW5zcG9ydCB0aGF0IHdyaXRlcyBtZXNzYWdlcyB2aWEgYW4gaW50ZXJuYWwgYnVmZmVyLgorLy8vCisvLy8gQSBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLgorLy8vIEFsbCB3cml0ZXMgYXJlIG1hZGUgdG8gdGhpcyBidWZmZXIgYW5kIGFyZSBzZW50IHRvIHRoZSB3cmFwcGVkIGNoYW5uZWwgb25seQorLy8vIHdoZW4gYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpmbHVzaCgpYCBpcyBjYWxsZWQuIE9uIGEgZmx1c2ggYSBmaXhlZC1sZW5ndGgKKy8vLyBoZWFkZXIgd2l0aCBhIGNvdW50IG9mIHRoZSBidWZmZXJlZCBieXRlcyBpcyB3cml0dGVuLCBmb2xsb3dlZCBieSB0aGUgYnl0ZXMKKy8vLyB0aGVtc2VsdmVzLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OldyaXRlOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RCdWZmZXJlZFdyaXRlVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQud3JpdGUoJlsweDAwXSkudW53cmFwKCk7CisvLy8gdC5mbHVzaCgpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBidWY6IFZlYzx1OD4sCisgICAgY2FwOiB1c2l6ZSwKKyAgICBjaGFubmVsOiBDLAorfQorCitpbXBsPEM+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGRlZmF1bHQtc2l6ZWQgaW50ZXJuYWwgcmVhZCBhbmQKKyAgICAvLy8gd3JpdGUgYnVmZmVycyB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KFdSSVRFX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHJlYWQgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHJlYWRfY2FwYWNpdHlgIGFuZCBhbiBpbnRlcm5hbCB3cml0ZSBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgd3JpdGVfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgYXNzZXJ0ISgKKyAgICAgICAgICAgIHdyaXRlX2NhcGFjaXR5ID4gMCwKKyAgICAgICAgICAgICJ3cml0ZSBidWZmZXIgc2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIKKyAgICAgICAgKTsKKworICAgICAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IFZlYzo6d2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eSksCisgICAgICAgICAgICBjYXA6IHdyaXRlX2NhcGFjaXR5LAorICAgICAgICAgICAgY2hhbm5lbDogY2hhbm5lbCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZSBmb3IgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGlmICFidWYuaXNfZW1wdHkoKSB7CisgICAgICAgICAgICBsZXQgbXV0IGF2YWlsX2J5dGVzOworCisgICAgICAgICAgICBsb29wIHsKKyAgICAgICAgICAgICAgICBhdmFpbF9ieXRlcyA9IGNtcDo6bWluKGJ1Zi5sZW4oKSwgc2VsZi5jYXAgLSBzZWxmLmJ1Zi5sZW4oKSk7CisKKyAgICAgICAgICAgICAgICBpZiBhdmFpbF9ieXRlcyA9PSAwIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpPzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBhdmFpbF9ieXRlcyA9IGF2YWlsX2J5dGVzOworCisgICAgICAgICAgICBzZWxmLmJ1Zi5leHRlbmRfZnJvbV9zbGljZSgmYnVmWy4uYXZhaWxfYnl0ZXNdKTsKKyAgICAgICAgICAgIGFzc2VydCEoc2VsZi5idWYubGVuKCkgPD0gc2VsZi5jYXAsICJjb3B5IG92ZXJmbG93ZWQgYnVmZmVyIik7CisKKyAgICAgICAgICAgIE9rKGF2YWlsX2J5dGVzKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soMCkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmNoYW5uZWwud3JpdGVfYWxsKCZzZWxmLmJ1Zik/OworICAgICAgICBzZWxmLmNoYW5uZWwuZmx1c2goKT87CisgICAgICAgIHNlbGYuYnVmLmNsZWFyKCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSB0cmFuc3BvcnQ6OlRCdWZmZXJDaGFubmVsOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfcmVhZF9idWZmZXJfaXNfZW1wdHkoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IG11dCBiID0gdmVjIVswOyAxMF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGIpOworCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX2NhbGxlcl9yZWFkc19pbnRvX3plcm9fY2FwYWNpdHlfYnVmZmVyKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEwLCBtZW0pOworCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IFtdKTsKKworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9ub3RoaW5nX21vcmVfY2FuX2JlX3JlYWQoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0LCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg0LCBtZW0pOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gcmVhZCBidWZmZXIgaXMgZXhhY3RseSB0aGUgc2FtZSBzaXplIGFzIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyA0XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzAsIDEsIDIsIDNdKTsKKworICAgICAgICAvLyB0cnkgcmVhZCBhZ2FpbgorICAgICAgICBsZXQgYnVmX2FnYWluID0gdmVjIVswdTg7IDRdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHRoaXMgdGltZSwgMCBieXRlcyBhbmQgd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBidWZmZXIKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1Zl9hZ2FpbiwgJlswLCAwLCAwLCAwXSkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9maWxsX3VzZXJfYnVmZmVyX3dpdGhfb25seV9hc19tYW55X2J5dGVzX2FzX2F2YWlsYWJsZSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDQsIG1lbSk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWzAsIDEsIDIsIDNdKTsKKworICAgICAgICAvLyByZWFkIGJ1ZmZlciBpcyBtdWNoIGxhcmdlciB0aGFuIHRoZSBieXRlcyBhdmFpbGFibGUKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgOF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsuLjRdLCAmWzAsIDEsIDIsIDNdKTsKKworICAgICAgICAvLyB0cnkgcmVhZCBhZ2FpbgorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWZbNC4uXSk7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lLCAwIGJ5dGVzIGFuZCB3ZSBoYXZlbid0IGNoYW5nZWQgdGhlIGJ1ZmZlcgorICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzAsIDEsIDIsIDMsIDAsIDAsIDAsIDBdKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfc3VjY2Vzc2Z1bGx5KCkgeworICAgICAgICAvLyB0aGlzIHRlc3QgaW52b2x2ZXMgYSBmZXcgbG9vcHMgd2l0aGluIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgLy8gaXRzZWxmIHdoZXJlIGl0IGhhcyB0byBkcmFpbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaW4gb3JkZXIKKyAgICAgICAgLy8gdG8gc2VydmljZSBhIHJlYWQKKworICAgICAgICAvLyB3ZSBoYXZlIGEgbXVjaCBzbWFsbGVyIGJ1ZmZlciB0aGFuIHRoZQorICAgICAgICAvLyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBoYXMgYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgbWVtKTsKKworICAgICAgICAvLyBmaWxsIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCdzIGJ5dGUgYnVmZmVyCisgICAgICAgIGxldCBtdXQgcmVhZGFibGVfYnl0ZXMgPSBbMHU4OyAxMF07CisgICAgICAgIGZvciBpIGluIDAuLjEwIHsKKyAgICAgICAgICAgIHJlYWRhYmxlX2J5dGVzW2ldID0gaSBhcyB1ODsKKyAgICAgICAgfQorCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzKTsKKworICAgICAgICAvLyB3ZSBhc2sgdG8gcmVhZCBpbnRvIGEgYnVmZmVyIHRoYXQncyBtdWNoIGxhcmdlcgorICAgICAgICAvLyB0aGFuIHRoZSBvbmUgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydCBoYXM7IGFzIGEgcmVzdWx0CisgICAgICAgIC8vIGl0J3MgZ29pbmcgdG8gaGF2ZSB0byBrZWVwIGFza2luZyB0aGUgdW5kZXJseWluZworICAgICAgICAvLyB0cmFuc3BvcnQgZm9yIG1vcmUgYnl0ZXMKKyAgICAgICAgbGV0IG11dCBidWYgPSBbMHU4OyA4XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB3ZSBzaG91bGQgaGF2ZSByZWFkIDggYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgOCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlswLCAxLCAyLCAzLCA0LCA1LCA2LCA3XSk7CisKKyAgICAgICAgLy8gbGV0J3MgY2xlYXIgb3V0IHRoZSBidWZmZXIgYW5kIHRyeSByZWFkIGFnYWluCisgICAgICAgIGZvciBpIGluIDAuLjggeworICAgICAgICAgICAgYnVmW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHRoaXMgdGltZSB3ZSB3ZXJlIG9ubHkgYWJsZSB0byByZWFkIDIgYnl0ZXMKKyAgICAgICAgLy8gKGFsbCB0aGF0J3MgcmVtYWluaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0KQorICAgICAgICAvLyBsZXQncyBhbHNvIGNoZWNrIHRoYXQgdGhlIHJlbWFpbmluZyBieXRlcyBhcmUgdW50b3VjaGVkCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMC4uMl0sICZbOCwgOV0pOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMi4uXSwgJlswLCAwLCAwLCAwLCAwLCAwXSk7CisKKyAgICAgICAgLy8gdHJ5IHJlYWQgYWdhaW4gKHdlIHNob3VsZCBnZXQgMCkKKyAgICAgICAgLy8gYW5kIGFsbCB0aGUgZXhpc3RpbmcgYnl0ZXMgd2VyZSB1bnRvdWNoZWQKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlswLi4yXSwgJls4LCA5XSk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsyLi5dLCAmWzAsIDAsIDAsIDAsIDAsIDBdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5fZXJyb3Jfd2hlbl9ub3RoaW5nX2Nhbl9iZV93cml0dGVuX3RvX3VuZGVybHlpbmdfY2hhbm5lbCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxLCBtZW0pOworCisgICAgICAgIGxldCBiID0gdmVjIVswOyAxMF07CisgICAgICAgIGxldCByID0gdC53cml0ZSgmYik7CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAxIGJ5dGUKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCAxKTsKKworICAgICAgICAvLyBsZXQncyB0cnkgYWdhaW4uLi4KKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiWzEuLl0pOworCisgICAgICAgIC8vIHRoaXMgdGltZSB3ZSdsbCBlcnJvciBvdXQgYmVjYXVzZSB0aGUgYXV0by1mbHVzaCBmYWlsZWQKKyAgICAgICAgYXNzZXJ0IShyLmlzX2VycigpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9jYWxsZXJfY2FsbHNfd3JpdGVfd2l0aF9lbXB0eV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEwLCBtZW0pOworCisgICAgICAgIGxldCByID0gdC53cml0ZSgmW10pOworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMF0gPSBbXTsKKworICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hdXRvX2ZsdXNoX2lmX3dyaXRlX2J1ZmZlcl9mdWxsKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgOCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDQsIG1lbSk7CisKKyAgICAgICAgbGV0IGIwID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdOworICAgICAgICBsZXQgYjEgPSBbMHgwNCwgMHgwNSwgMHgwNiwgMHgwN107CisKKyAgICAgICAgLy8gd3JpdGUgdGhlIGZpcnN0IDQgYnl0ZXM7IHdlJ3ZlIG5vdyBmaWxsZWQgdGhlIHRyYW5zcG9ydCdzIHdyaXRlIGJ1ZmZlcgorICAgICAgICBsZXQgciA9IHQud3JpdGUoJmIwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCA0KTsKKworICAgICAgICAvLyB0cnkgd3JpdGUgdGhlIG5leHQgNCBieXRlczsgdGhpcyBjYXVzZXMgdGhlIHRyYW5zcG9ydCB0byBhdXRvLWZsdXNoIHRoZSBmaXJzdCA0IGJ5dGVzCisgICAgICAgIGxldCByID0gdC53cml0ZSgmYjEpOworICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDQpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgaW4gd3JpdGluZyB0aGUgc2Vjb25kIDQgYnl0ZXMgd2UgYXV0by1mbHVzaGVkIHRoZSBmaXJzdCA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDQpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIwKTsKKyAgICAgICAgdC5jaGFubmVsLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIC8vIG5vdyBmbHVzaCB0aGUgdHJhbnNwb3J0IHRvIHB1c2ggdGhlIHNlY29uZCA0IGJ5dGVzIHRvIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSB3cm90ZSBvdXQgdGhlIHNlY29uZCA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYjEpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3RvX2lubmVyX3RyYW5zcG9ydF9vbl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcobWVtKTsKKworICAgICAgICBsZXQgYjogW3U4OyA1XSA9IFswLCAxLCAyLCAzLCA0XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDApOworCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3VjY2Vzc2Z1bGx5X2FmdGVyX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgNSk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDUsIG1lbSk7CisKKyAgICAgICAgLy8gd3JpdGUgYW5kIGZsdXNoCisgICAgICAgIGxldCBiOiBbdTg7IDVdID0gWzAsIDEsIDIsIDMsIDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZsdXNoZWQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiKTsKKworICAgICAgICAvLyByZXNldCBvdXIgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgICAgdC5jaGFubmVsLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIC8vIHdyaXRlIGFuZCBmbHVzaCBhZ2FpbgorICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZsdXNoZWQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9mcmFtZWQucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9mcmFtZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwOTMwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2ZyYW1lZC5ycwpAQCAtMCwwICsxLDQ1OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2UgYnl0ZW9yZGVyOjp7QmlnRW5kaWFuLCBSZWFkQnl0ZXNFeHQsIFdyaXRlQnl0ZXNFeHR9OwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKwordXNlIHN1cGVyOjp7VFJlYWRUcmFuc3BvcnQsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHJlYWQgYnVmZmVyIGluIGJ5dGVzLgorY29uc3QgUkVBRF9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgd3JpdGUgYnVmZmVyIGluIGJ5dGVzLgorY29uc3QgV1JJVEVfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIFRyYW5zcG9ydCB0aGF0IHJlYWRzIGZyYW1lZCBtZXNzYWdlcy4KKy8vLworLy8vIEEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YCBtYWludGFpbnMgYSBmaXhlZC1zaXplIGludGVybmFsIHJlYWQgYnVmZmVyLgorLy8vIE9uIGEgY2FsbCB0byBgVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OnJlYWQoLi4uKWAgb25lIGZ1bGwgbWVzc2FnZSAtIGJvdGgKKy8vLyBmaXhlZC1sZW5ndGggaGVhZGVyIGFuZCBieXRlcyAtIGlzIHJlYWQgZnJvbSB0aGUgd3JhcHBlZCBjaGFubmVsIGFuZAorLy8vIGJ1ZmZlcmVkLiBTdWJzZXF1ZW50IHJlYWQgY2FsbHMgYXJlIHNlcnZpY2VkIGZyb20gdGhlIGludGVybmFsIGJ1ZmZlcgorLy8vIHVudGlsIGl0IGlzIGV4aGF1c3RlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIG5leHQgZnVsbCBtZXNzYWdlIGlzIHJlYWQKKy8vLyBmcm9tIHRoZSB3cmFwcGVkIGNoYW5uZWwuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6UmVhZDsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkUmVhZFRyYW5zcG9ydCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LnJlYWQoJm11dCB2ZWMhWzB1ODsgMV0pLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGJ1ZjogVmVjPHU4PiwKKyAgICBwb3M6IHVzaXplLAorICAgIGNhcDogdXNpemUsCisgICAgY2hhbjogQywKK30KKworaW1wbDxDPiBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgIHdpdGggYSBkZWZhdWx0LXNpemVkCisgICAgLy8vIGludGVybmFsIHJlYWQgYnVmZmVyIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoUkVBRF9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgcmVhZCBidWZmZXIKKyAgICAvLy8gb2Ygc2l6ZSBgcmVhZF9jYXBhY2l0eWAgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHJlYWRfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogdmVjIVswOyByZWFkX2NhcGFjaXR5XSwgLy8gRklYTUU6IGRvIEkgYWN0dWFsbHkgaGF2ZSB0byBkbyB0aGlzPworICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgY2FwOiAwLAorICAgICAgICAgICAgY2hhbjogY2hhbm5lbCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxDPiBSZWFkIGZvciBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBiOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgaWYgc2VsZi5jYXAgLSBzZWxmLnBvcyA9PSAwIHsKKyAgICAgICAgICAgIGxldCBtZXNzYWdlX3NpemUgPSBzZWxmLmNoYW4ucmVhZF9pMzI6OjxCaWdFbmRpYW4+KCk/IGFzIHVzaXplOworCisgICAgICAgICAgICBsZXQgYnVmX2NhcGFjaXR5ID0gY21wOjptYXgobWVzc2FnZV9zaXplLCBSRUFEX0NBUEFDSVRZKTsKKyAgICAgICAgICAgIHNlbGYuYnVmLnJlc2l6ZShidWZfY2FwYWNpdHksIDApOworCisgICAgICAgICAgICBzZWxmLmNoYW4ucmVhZF9leGFjdCgmbXV0IHNlbGYuYnVmWy4ubWVzc2FnZV9zaXplXSk/OworICAgICAgICAgICAgc2VsZi5jYXAgPSBtZXNzYWdlX3NpemUgYXMgdXNpemU7CisgICAgICAgICAgICBzZWxmLnBvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbnJlYWQgPSBjbXA6Om1pbihiLmxlbigpLCBzZWxmLmNhcCAtIHNlbGYucG9zKTsKKyAgICAgICAgYlsuLm5yZWFkXS5jbG9uZV9mcm9tX3NsaWNlKCZzZWxmLmJ1ZltzZWxmLnBvcy4uc2VsZi5wb3MgKyBucmVhZF0pOworICAgICAgICBzZWxmLnBvcyArPSBucmVhZDsKKworICAgICAgICBPayhucmVhZCkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKy8vLyBUcmFuc3BvcnQgdGhhdCB3cml0ZXMgZnJhbWVkIG1lc3NhZ2VzLgorLy8vCisvLy8gQSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YCBtYWludGFpbnMgYSBmaXhlZC1zaXplIGludGVybmFsIHdyaXRlIGJ1ZmZlci4gQWxsCisvLy8gd3JpdGVzIGFyZSBtYWRlIHRvIHRoaXMgYnVmZmVyIGFuZCBhcmUgc2VudCB0byB0aGUgd3JhcHBlZCBjaGFubmVsIG9ubHkKKy8vLyB3aGVuIGBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OmZsdXNoKClgIGlzIGNhbGxlZC4gT24gYSBmbHVzaCBhIGZpeGVkLWxlbmd0aAorLy8vIGhlYWRlciB3aXRoIGEgY291bnQgb2YgdGhlIGJ1ZmZlcmVkIGJ5dGVzIGlzIHdyaXR0ZW4sIGZvbGxvd2VkIGJ5IHRoZSBieXRlcworLy8vIHRoZW1zZWx2ZXMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OldyaXRlOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RGcmFtZWRXcml0ZVRyYW5zcG9ydCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC53cml0ZSgmWzB4MDBdKS51bndyYXAoKTsKKy8vLyB0LmZsdXNoKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBidWY6IFZlYzx1OD4sCisgICAgY2hhbm5lbDogQywKK30KKworaW1wbDxDPiBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgIHdpdGggZGVmYXVsdC1zaXplZCBpbnRlcm5hbAorICAgIC8vLyB3cml0ZSBidWZmZXIgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KFdSSVRFX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHdyaXRlIGJ1ZmZlcgorICAgIC8vLyBvZiBzaXplIGB3cml0ZV9jYXBhY2l0eWAgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogVmVjOjp3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5KSwKKyAgICAgICAgICAgIGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGUgZm9yIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGxldCBjdXJyZW50X2NhcGFjaXR5ID0gc2VsZi5idWYuY2FwYWNpdHkoKTsKKyAgICAgICAgbGV0IGF2YWlsYWJsZV9zcGFjZSA9IGN1cnJlbnRfY2FwYWNpdHkgLSBzZWxmLmJ1Zi5sZW4oKTsKKyAgICAgICAgaWYgYi5sZW4oKSA+IGF2YWlsYWJsZV9zcGFjZSB7CisgICAgICAgICAgICBsZXQgYWRkaXRpb25hbF9zcGFjZSA9IGNtcDo6bWF4KGIubGVuKCkgLSBhdmFpbGFibGVfc3BhY2UsIGN1cnJlbnRfY2FwYWNpdHkpOworICAgICAgICAgICAgc2VsZi5idWYucmVzZXJ2ZShhZGRpdGlvbmFsX3NwYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGYuYnVmLmV4dGVuZF9mcm9tX3NsaWNlKGIpOworICAgICAgICBPayhiLmxlbigpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgbWVzc2FnZV9zaXplID0gc2VsZi5idWYubGVuKCk7CisKKyAgICAgICAgaWYgbGV0IDAgPSBtZXNzYWdlX3NpemUgeworICAgICAgICAgICAgcmV0dXJuIE9rKCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYuY2hhbm5lbC53cml0ZV9pMzI6OjxCaWdFbmRpYW4+KG1lc3NhZ2Vfc2l6ZSBhcyBpMzIpPzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdpbGwgc3BpbiBpZiB0aGUgdW5kZXJseWluZyBjaGFubmVsIGNhbid0IGJlIHdyaXR0ZW4gdG8KKyAgICAgICAgbGV0IG11dCBieXRlX2luZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgYnl0ZV9pbmRleCA8IG1lc3NhZ2Vfc2l6ZSB7CisgICAgICAgICAgICBsZXQgbndyaXRlID0gc2VsZi5jaGFubmVsLndyaXRlKCZzZWxmLmJ1ZltieXRlX2luZGV4Li5tZXNzYWdlX3NpemVdKT87CisgICAgICAgICAgICBieXRlX2luZGV4ID0gY21wOjptaW4oYnl0ZV9pbmRleCArIG53cml0ZSwgbWVzc2FnZV9zaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBidWZfY2FwYWNpdHkgPSBjbXA6Om1pbihzZWxmLmJ1Zi5jYXBhY2l0eSgpLCBXUklURV9DQVBBQ0lUWSk7CisgICAgICAgIHNlbGYuYnVmLnJlc2l6ZShidWZfY2FwYWNpdHksIDApOworICAgICAgICBzZWxmLmJ1Zi5jbGVhcigpOworCisgICAgICAgIHNlbGYuY2hhbm5lbC5mbHVzaCgpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgZm9yIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIHRyYW5zcG9ydDo6bWVtOjpUQnVmZmVyQ2hhbm5lbDsKKworICAgIC8vIEZJWE1FOiB0ZXN0IGEgZm9yY2VkIHJlc2VydmUKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfbWVzc2FnZV9zbWFsbGVyX3RoYW5faW5pdGlhbF9idWZmZXJfc2l6ZSgpIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg4LCBjKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdKTsKKworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMDsgOF07CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWy4uNF0sICZbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfbWVzc2FnZV9ncmVhdGVyX3RoYW5faW5pdGlhbF9idWZmZXJfc2l6ZSgpIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBjKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdKTsKKworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMDsgOF07CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWy4uNF0sICZbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfbXVsdGlwbGVfbWVzc2FnZXNfaW5fc2VxdWVuY2VfY29ycmVjdGx5KCkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIGMpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIDFzdCBtZXNzYWdlCisgICAgICAgIC8vCisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gMm5kIG1lc3NhZ2UKKyAgICAgICAgLy8KKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDQsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdKTsKKworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMDsgOF07CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDEgYnl0ZQorICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2Vfc21hbGxlcl90aGFuX2J1ZmZlcl9zaXplKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyMCwgbWVtKTsKKworICAgICAgICBsZXQgYiA9IHZlYyFbMDsgMTBdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMTAgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgMTApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX2NhbGxlcl9jYWxsc193cml0ZV93aXRoX2VtcHR5X2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEwLCBtZW0pOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAwXSA9IFtdOworCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmW10pLnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfdG9faW5uZXJfdHJhbnNwb3J0X29uX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcobWVtKTsKKworICAgICAgICBsZXQgYjogW3U4OyA1XSA9IFsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDApOworCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZF9ieXRlcyA9IFsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZF9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9ncmVhdGVyX3RoYW5fYnVmZmVyX3NpemVfMDAoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBETyAqKk5PVCoqIENIQU5HRSBUSEUgV1JJVEVfQ0FQQUNJVFkgT1IgVEhFIE5VTUJFUiBPRiBCWVRFUyBUTyBCRSBXUklUVEVOIQorICAgICAgICAvLyB0aGVzZSBsZW5ndGhzIHdlcmUgY2hvc2VuIHRvIGJlIGp1c3QgbG9uZyBlbm91Z2gKKyAgICAgICAgLy8gdGhhdCBkb3VibGluZyB0aGUgY2FwYWNpdHkgaXMgYSAqKndvcnNlKiogY2hvaWNlIHRoYW4KKyAgICAgICAgLy8gc2ltcGx5IHJlc2l6aW5nIHRoZSBidWZmZXIgdG8gYi5sZW4oKQorCisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxLCBtZW0pOworICAgICAgICBsZXQgYiA9IFsweDAwLCAweDAxLCAweDAyXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDMgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDApOworCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZF9ieXRlcyA9IFsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZF9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9ncmVhdGVyX3RoYW5fYnVmZmVyX3NpemVfMDEoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBETyAqKk5PVCoqIENIQU5HRSBUSEUgV1JJVEVfQ0FQQUNJVFkgT1IgVEhFIE5VTUJFUiBPRiBCWVRFUyBUTyBCRSBXUklUVEVOIQorICAgICAgICAvLyB0aGVzZSBsZW5ndGhzIHdlcmUgY2hvc2VuIHRvIGJlIGp1c3QgbG9uZyBlbm91Z2gKKyAgICAgICAgLy8gdGhhdCBkb3VibGluZyB0aGUgY2FwYWNpdHkgaXMgYSAqKmJldHRlcioqIGNob2ljZSB0aGFuCisgICAgICAgIC8vIHNpbXBseSByZXNpemluZyB0aGUgYnVmZmVyIHRvIGIubGVuKCkKKworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgbWVtKTsKKyAgICAgICAgbGV0IGIgPSBbMHgwMCwgMHgwMSwgMHgwMl07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAzIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfYnl0ZXMgPSBbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAzLCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWRfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl9lcnJvcl9pZl9ub3RoaW5nX2Nhbl9iZV93cml0dGVuX3RvX2lubmVyX3RyYW5zcG9ydF9vbl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMSwgbWVtKTsKKworICAgICAgICBsZXQgYiA9IHZlYyFbMDsgMTBdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMTAgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgMTApOworCisgICAgICAgIC8vIGxldCdzIGZsdXNoCisgICAgICAgIGxldCByID0gdC5mbHVzaCgpOworCisgICAgICAgIC8vIHRoaXMgdGltZSB3ZSdsbCBlcnJvciBvdXQgYmVjYXVzZSB0aGUgZmx1c2ggY2FuJ3Qgd3JpdGUgdG8gdGhlIHVuZGVybHlpbmcgY2hhbm5lbAorICAgICAgICBhc3NlcnQhKHIuaXNfZXJyKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N1Y2Nlc3NmdWxseV9hZnRlcl9mbHVzaCgpIHsKKyAgICAgICAgLy8gSU1QT1JUQU5UOiB3cml0ZSBjYXBhY2l0eSAqTVVTVCogYmUgZ3JlYXRlcgorICAgICAgICAvLyB0aGFuIG1lc3NhZ2Ugc2l6ZXMgdXNlZCBpbiB0aGlzIHRlc3QgKyA0LWJ5dGUgZnJhbWUgaGVhZGVyCisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg1LCBtZW0pOworCisgICAgICAgIC8vIHdyaXRlIGFuZCBmbHVzaAorICAgICAgICBsZXQgZmlyc3RfbWVzc2FnZTogW3U4OyA1XSA9IFsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZmaXJzdF9tZXNzYWdlKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBtdXQgZXhwZWN0ZWQgPSBWZWM6Om5ldygpOworICAgICAgICBleHBlY3RlZC53cml0ZV9hbGwoJlsweDAwLCAweDAwLCAweDAwLCAweDA1XSkudW53cmFwKCk7IC8vIG1lc3NhZ2Ugc2l6ZQorICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmZmlyc3RfbWVzc2FnZSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZsdXNoZWQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKSwgZXhwZWN0ZWQpOworCisgICAgICAgIC8vIHJlc2V0IG91ciB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgICB0LmNoYW5uZWwuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgbGV0IHNlY29uZF9tZXNzYWdlOiBbdTg7IDNdID0gWzB4MDUsIDB4MDYsIDB4MDddOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJnNlY29uZF9tZXNzYWdlKS51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGV4cGVjdGVkLmNsZWFyKCk7CisgICAgICAgIGV4cGVjdGVkLndyaXRlX2FsbCgmWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDNdKS51bndyYXAoKTsgLy8gbWVzc2FnZSBzaXplCisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZzZWNvbmRfbWVzc2FnZSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZsdXNoZWQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKSwgZXhwZWN0ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21lbS5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21lbS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmM0YjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbWVtLnJzCkBAIC0wLDAgKzEsMzg1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNtcDsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OworCit1c2Ugc3VwZXI6OntSZWFkSGFsZiwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworLy8vIEluLW1lbW9yeSByZWFkIGFuZCB3cml0ZSBjaGFubmVsIHdpdGggZml4ZWQtc2l6ZSByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgorLy8vCisvLy8gT24gYSBgd3JpdGVgIGJ5dGVzIGFyZSB3cml0dGVuIHRvIHRoZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuIFdyaXRlcyBhcmUgbm8KKy8vLyBsb25nZXIgYWNjZXB0ZWQgb25jZSB0aGlzIGJ1ZmZlciBpcyBmdWxsLiBDYWxsZXJzIG11c3QgYGVtcHR5X3dyaXRlX2J1ZmZlcigpYAorLy8vIGJlZm9yZSBzdWJzZXF1ZW50IHdyaXRlcyBhcmUgYWNjZXB0ZWQuCisvLy8KKy8vLyBZb3UgY2FuIHNldCByZWFkYWJsZSBieXRlcyBpbiB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIgYnkgZmlsbGluZyBpdCB3aXRoCisvLy8gYHNldF9yZWFkYWJsZV9ieXRlcyguLi4pYC4gQ2FsbGVycyBjYW4gdGhlbiByZWFkIHVudGlsIHRoZSBidWZmZXIgaXMKKy8vLyBkZXBsZXRlZC4gTm8gZnVydGhlciByZWFkcyBhcmUgYWNjZXB0ZWQgdW50aWwgdGhlIGludGVybmFsIHJlYWQgYnVmZmVyIGlzCisvLy8gcmVwbGVuaXNoZWQgYWdhaW4uCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCdWZmZXJDaGFubmVsIHsKKyAgICByZWFkOiBBcmM8TXV0ZXg8UmVhZERhdGE+PiwKKyAgICB3cml0ZTogQXJjPE11dGV4PFdyaXRlRGF0YT4+LAorfQorCisjW2Rlcml2ZShEZWJ1ZyldCitzdHJ1Y3QgUmVhZERhdGEgeworICAgIGJ1ZjogQm94PFt1OF0+LAorICAgIHBvczogdXNpemUsCisgICAgaWR4OiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorfQorCisjW2Rlcml2ZShEZWJ1ZyldCitzdHJ1Y3QgV3JpdGVEYXRhIHsKKyAgICBidWY6IEJveDxbdThdPiwKKyAgICBwb3M6IHVzaXplLAorICAgIGNhcDogdXNpemUsCit9CisKK2ltcGwgVEJ1ZmZlckNoYW5uZWwgeworICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBgVEJ1ZmZlckNoYW5uZWxgIHdpdGggdGhlIGdpdmVuCisgICAgLy8vIHJlYWQgYnVmZmVyIGNhcGFjaXR5IGFuZCB3cml0ZSBidWZmZXIgY2FwYWNpdHkuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkocmVhZF9jYXBhY2l0eTogdXNpemUsIHdyaXRlX2NhcGFjaXR5OiB1c2l6ZSkgLT4gVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgICAgICByZWFkOiBBcmM6Om5ldyhNdXRleDo6bmV3KFJlYWREYXRhIHsKKyAgICAgICAgICAgICAgICBidWY6IHZlYyFbMDsgcmVhZF9jYXBhY2l0eV0uaW50b19ib3hlZF9zbGljZSgpLAorICAgICAgICAgICAgICAgIGlkeDogMCwKKyAgICAgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICAgICAgY2FwOiByZWFkX2NhcGFjaXR5LAorICAgICAgICAgICAgfSkpLAorICAgICAgICAgICAgd3JpdGU6IEFyYzo6bmV3KE11dGV4OjpuZXcoV3JpdGVEYXRhIHsKKyAgICAgICAgICAgICAgICBidWY6IHZlYyFbMDsgd3JpdGVfY2FwYWNpdHldLmludG9fYm94ZWRfc2xpY2UoKSwKKyAgICAgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICAgICAgY2FwOiB3cml0ZV9jYXBhY2l0eSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBieXRlcyBoZWxkIGJ5IHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKyAgICAvLy8gUmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IgaWYgbm8gcmVhZGFibGUgYnl0ZXMgYXJlIHByZXNlbnQuCisgICAgcHViIGZuIHJlYWRfYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgcmRhdGEgPSBzZWxmLnJlYWQuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyByZGF0YS5pZHhdOworICAgICAgICBidWYuY29weV9mcm9tX3NsaWNlKCZyZGF0YS5idWZbLi5yZGF0YS5pZHhdKTsKKyAgICAgICAgYnVmCisgICAgfQorCisgICAgLy8gRklYTUU6IGRvIEkgcmVhbGx5IG5lZWQgdGhpcyBBUEkgY2FsbD8KKyAgICAvLyBGSVhNRTogc2hvdWxkIHRoaXMgc2ltcGx5IHJlc2V0IHRvIHRoZSBsYXN0IHNldCBvZiByZWFkYWJsZSBieXRlcz8KKyAgICAvLy8gUmVzZXQgdGhlIG51bWJlciBvZiByZWFkYWJsZSBieXRlcyB0byB6ZXJvLgorICAgIC8vLworICAgIC8vLyBTdWJzZXF1ZW50IGNhbGxzIHRvIGByZWFkYCB3aWxsIHJldHVybiBub3RoaW5nLgorICAgIHB1YiBmbiBlbXB0eV9yZWFkX2J1ZmZlcigmbXV0IHNlbGYpIHsKKyAgICAgICAgbGV0IG11dCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIHJkYXRhLnBvcyA9IDA7CisgICAgICAgIHJkYXRhLmlkeCA9IDA7CisgICAgfQorCisgICAgLy8vIENvcHkgYnl0ZXMgZnJvbSB0aGUgc291cmNlIGJ1ZmZlciBgYnVmYCBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlciwKKyAgICAvLy8gb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJ5dGVzLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLAorICAgIC8vLyB3aGljaCBpcyBgbWluKGJ1Zi5sZW4oKSwgaW50ZXJuYWxfcmVhZF9idWYubGVuKCkpYC4KKyAgICBwdWIgZm4gc2V0X3JlYWRhYmxlX2J5dGVzKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gdXNpemUgeworICAgICAgICBzZWxmLmVtcHR5X3JlYWRfYnVmZmVyKCk7CisgICAgICAgIGxldCBtdXQgcmRhdGEgPSBzZWxmLnJlYWQuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbWF4X2J5dGVzID0gY21wOjptaW4ocmRhdGEuY2FwLCBidWYubGVuKCkpOworICAgICAgICByZGF0YS5idWZbLi5tYXhfYnl0ZXNdLmNsb25lX2Zyb21fc2xpY2UoJmJ1ZlsuLm1heF9ieXRlc10pOworICAgICAgICByZGF0YS5pZHggPSBtYXhfYnl0ZXM7CisgICAgICAgIG1heF9ieXRlcworICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBieXRlcyBoZWxkIGJ5IHRoZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuCisgICAgLy8vIFJldHVybnMgYW4gZW1wdHkgdmVjdG9yIGlmIG5vIGJ5dGVzIHdlcmUgd3JpdHRlbi4KKyAgICBwdWIgZm4gd3JpdGVfYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgd2RhdGEucG9zXTsKKyAgICAgICAgYnVmLmNvcHlfZnJvbV9zbGljZSgmd2RhdGEuYnVmWy4ud2RhdGEucG9zXSk7CisgICAgICAgIGJ1ZgorICAgIH0KKworICAgIC8vLyBSZXNldHMgdGhlIGludGVybmFsIHdyaXRlIGJ1ZmZlciwgbWFraW5nIGl0IHNlZW0gbGlrZSBubyBieXRlcyB3ZXJlCisgICAgLy8vIHdyaXR0ZW4uIENhbGxpbmcgYHdyaXRlX2J1ZmZlcmAgYWZ0ZXIgdGhpcyByZXR1cm5zIGFuIGVtcHR5IHZlY3Rvci4KKyAgICBwdWIgZm4gZW1wdHlfd3JpdGVfYnVmZmVyKCZtdXQgc2VsZikgeworICAgICAgICBsZXQgbXV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIHdkYXRhLnBvcyA9IDA7CisgICAgfQorCisgICAgLy8vIE92ZXJ3cml0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWFkIGJ1ZmZlciB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAvLy8gd3JpdGUgYnVmZmVyLiBUaGUgd3JpdGUgYnVmZmVyIGlzIGVtcHRpZWQgYWZ0ZXIgdGhpcyBvcGVyYXRpb24uCisgICAgcHViIGZuIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCZtdXQgc2VsZikgeworICAgICAgICAvLyBGSVhNRTogcmVkbyB0aGlzIGVudGlyZSBtZXRob2QKKyAgICAgICAgbGV0IGJ1ZiA9IHsKKyAgICAgICAgICAgIGxldCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGIgPSAmd2RhdGEuYnVmWy4ud2RhdGEucG9zXTsKKyAgICAgICAgICAgIGxldCBtdXQgYl9yZXQgPSB2ZWMhWzA7IGIubGVuKCldOworICAgICAgICAgICAgYl9yZXQuY29weV9mcm9tX3NsaWNlKGIpOworICAgICAgICAgICAgYl9yZXQKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgYnl0ZXNfY29waWVkID0gc2VsZi5zZXRfcmVhZGFibGVfYnl0ZXMoJmJ1Zik7CisgICAgICAgIGFzc2VydF9lcSEoYnl0ZXNfY29waWVkLCBidWYubGVuKCkpOworCisgICAgICAgIHNlbGYuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisgICAgfQorfQorCitpbXBsIFRJb0NoYW5uZWwgZm9yIFRCdWZmZXJDaGFubmVsIHsKKyAgICBmbiBzcGxpdChzZWxmKSAtPiA6OlJlc3VsdDwoUmVhZEhhbGY8U2VsZj4sIFdyaXRlSGFsZjxTZWxmPik+CisgICAgd2hlcmUKKyAgICAgICAgU2VsZjogU2l6ZWQsCisgICAgeworICAgICAgICBPaygoCisgICAgICAgICAgICBSZWFkSGFsZiB7CisgICAgICAgICAgICAgICAgaGFuZGxlOiBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHJlYWQ6IHNlbGYucmVhZC5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICB3cml0ZTogc2VsZi53cml0ZS5jbG9uZSgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgV3JpdGVIYWxmIHsKKyAgICAgICAgICAgICAgICBoYW5kbGU6IFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZDogc2VsZi5yZWFkLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgIHdyaXRlOiBzZWxmLndyaXRlLmNsb25lKCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICkpCisgICAgfQorfQorCitpbXBsIGlvOjpSZWFkIGZvciBUQnVmZmVyQ2hhbm5lbCB7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGJ1ZjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGxldCBtdXQgcmRhdGEgPSBzZWxmLnJlYWQuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbnJlYWQgPSBjbXA6Om1pbihidWYubGVuKCksIHJkYXRhLmlkeCAtIHJkYXRhLnBvcyk7CisgICAgICAgIGJ1ZlsuLm5yZWFkXS5jbG9uZV9mcm9tX3NsaWNlKCZyZGF0YS5idWZbcmRhdGEucG9zLi5yZGF0YS5wb3MgKyBucmVhZF0pOworICAgICAgICByZGF0YS5wb3MgKz0gbnJlYWQ7CisgICAgICAgIE9rKG5yZWFkKQorICAgIH0KK30KKworaW1wbCBpbzo6V3JpdGUgZm9yIFRCdWZmZXJDaGFubmVsIHsKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IG11dCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbndyaXRlID0gY21wOjptaW4oYnVmLmxlbigpLCB3ZGF0YS5jYXAgLSB3ZGF0YS5wb3MpOworICAgICAgICBsZXQgKHN0YXJ0LCBlbmQpID0gKHdkYXRhLnBvcywgd2RhdGEucG9zICsgbndyaXRlKTsKKyAgICAgICAgd2RhdGEuYnVmW3N0YXJ0Li5lbmRdLmNsb25lX2Zyb21fc2xpY2UoJmJ1ZlsuLm53cml0ZV0pOworICAgICAgICB3ZGF0YS5wb3MgKz0gbndyaXRlOworICAgICAgICBPayhud3JpdGUpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKSAvLyBub3RoaW5nIHRvIGRvIG9uIGZsdXNoCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKKyAgICB1c2Ugc3VwZXI6OlRCdWZmZXJDaGFubmVsOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfZW1wdHlfd3JpdGVfYnVmZmVyKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGU6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOworCisgICAgICAgIHQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLmxlbigpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hY2NlcHRfd3JpdGVzX2FmdGVyX2J1ZmZlcl9lbXB0aWVkKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAyKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGU6IFt1ODsgMl0gPSBbMHgwMSwgMHgwMl07CisKKyAgICAgICAgLy8gZmlyc3Qgd3JpdGUgKGFsbCBieXRlcyB3cml0dGVuKQorICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsKKworICAgICAgICAvLyB0cnkgd3JpdGUgYWdhaW4gKG5vdGhpbmcgc2hvdWxkIGJlIHdyaXR0ZW4pCisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOyAvLyBzdGlsbCB0aGUgc2FtZSBhcyBiZWZvcmUKKworICAgICAgICAvLyBub3cgcmVzZXQgdGhlIGJ1ZmZlcgorICAgICAgICB0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisKKyAgICAgICAgLy8gbm93IHRyeSB3cml0ZSBhZ2FpbiAtIHRoZSB3cml0ZSBzaG91bGQgc3VjY2VlZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hY2NlcHRfbXVsdGlwbGVfd3JpdGVzX3VudGlsX2J1ZmZlcl9pc19mdWxsKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisKKyAgICAgICAgLy8gZmlyc3Qgd3JpdGUgKGFsbCBieXRlcyB3cml0dGVuKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMDogW3U4OyAyXSA9IFsweDAxLCAweDQxXTsKKyAgICAgICAgbGV0IHdyaXRlXzBfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMCk7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfMF9yZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlXzApOworCisgICAgICAgIC8vIHNlY29uZCB3cml0ZSAoYWxsIGJ5dGVzIHdyaXR0ZW4sIHN0YXJ0aW5nIGF0IGluZGV4IDIpCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8xOiBbdTg7IDddID0gWzB4MjQsIDB4NDEsIDB4MzIsIDB4MzMsIDB4MTEsIDB4OTgsIDB4QUZdOworICAgICAgICBsZXQgd3JpdGVfMV9yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8xKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8xX3Jlc3VsdC51bndyYXAoKSwgNyk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKVsyLi5dLCAmYnl0ZXNfdG9fd3JpdGVfMSk7CisKKyAgICAgICAgLy8gdGhpcmQgd3JpdGUgKG9ubHkgMSBieXRlIHdyaXR0ZW4gLSB0aGF0J3MgYWxsIHdlIGhhdmUgc3BhY2UgZm9yKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMjogW3U4OyAzXSA9IFsweEJGLCAweERBLCAweDk4XTsKKyAgICAgICAgbGV0IHdyaXRlXzJfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMik7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfMl9yZXN1bHQudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKClbOS4uXSwgJmJ5dGVzX3RvX3dyaXRlXzJbMC4uMV0pOyAvLyBob3cgZG9lcyB0aGlzIHN5bnRheCB3b3JrPyEKKworICAgICAgICAvLyBmb3VydGggd3JpdGUgKG5vIHdyaXRlcyBhcmUgYWNjZXB0ZWQpCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8zOiBbdTg7IDNdID0gWzB4QkYsIDB4QUEsIDB4RkRdOworICAgICAgICBsZXQgd3JpdGVfM19yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8zKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8zX3Jlc3VsdC51bndyYXAoKSwgMCk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZ1bGwgd3JpdGUgYnVmZmVyCisgICAgICAgIGxldCBtdXQgZXhwZWN0ZWQ6IFZlYzx1OD4gPSBWZWM6OndpdGhfY2FwYWNpdHkoMTApOworICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmYnl0ZXNfdG9fd3JpdGVfMCk7CisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZieXRlc190b193cml0ZV8xKTsKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ5dGVzX3RvX3dyaXRlXzJbMC4uMV0pOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGVfYnl0ZXMoKSwgJmV4cGVjdGVkWy4uXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfZW1wdHlfcmVhZF9idWZmZXIoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEsIDApOworCisgICAgICAgIGxldCBieXRlc190b19yZWFkOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJmJ5dGVzX3RvX3JlYWQpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMSk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZieXRlc190b19yZWFkKTsKKworICAgICAgICB0LmVtcHR5X3JlYWRfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FsbG93X3JlYWRhYmxlX2J5dGVzX3RvX2JlX3NldF9hZnRlcl9yZWFkX2J1ZmZlcl9lbXB0aWVkKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxLCAwKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fcmVhZF8wOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJmJ5dGVzX3RvX3JlYWRfMCk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJmJ5dGVzX3RvX3JlYWRfMCk7CisKKyAgICAgICAgdC5lbXB0eV9yZWFkX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLmxlbigpLCAwKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fcmVhZF8xOiBbdTg7IDFdID0gWzB4MDJdOworICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJmJ5dGVzX3RvX3JlYWRfMSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJmJ5dGVzX3RvX3JlYWRfMSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWNjZXB0X211bHRpcGxlX3JlYWRzX3VudGlsX2FsbF9ieXRlc19yZWFkKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMCk7CisKKyAgICAgICAgbGV0IHJlYWRhYmxlX2J5dGVzOiBbdTg7IDEwXSA9IFsweEZGLCAweEVFLCAweERELCAweENDLCAweEJCLCAweDAwLCAweDFBLCAweDJCLCAweDNDLCAweDREXTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlJ3JlIGFibGUgdG8gc2V0IHRoZSBieXRlcyB0byBiZSByZWFkCisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXMpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMTApOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZGFibGVfYnl0ZXMpOworCisgICAgICAgIC8vIGZpcnN0IHJlYWQKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8wID0gdmVjIVswOyA1XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMCk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYnVmXzAuYXNfc2xpY2UoKSwgJihyZWFkYWJsZV9ieXRlc1swLi41XSkpOworCisgICAgICAgIC8vIHNlY29uZCByZWFkCisgICAgICAgIGxldCBtdXQgcmVhZF9idWZfMSA9IHZlYyFbMDsgNF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzEpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2J1Zl8xLmFzX3NsaWNlKCksICYocmVhZGFibGVfYnl0ZXNbNS4uOV0pKTsKKworICAgICAgICAvLyB0aGlyZCByZWFkIChvbmx5IDEgYnl0ZSByZW1haW5zIHRvIGJlIHJlYWQpCisgICAgICAgIGxldCBtdXQgcmVhZF9idWZfMiA9IHZlYyFbMDsgM107CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzIpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAxKTsKKyAgICAgICAgcmVhZF9idWZfMi50cnVuY2F0ZSgxKTsgLy8gRklYTUU6IGRvZXMgdGhlIGNhbGxlciBoYXZlIHRvIGRvIHRoaXM/CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9idWZfMi5hc19zbGljZSgpLCAmKHJlYWRhYmxlX2J5dGVzWzkuLl0pKTsKKworICAgICAgICAvLyBmb3VydGggcmVhZCAobm90aGluZyBzaG91bGQgYmUgcmVhZGFibGUpCisgICAgICAgIGxldCBtdXQgcmVhZF9idWZfMyA9IHZlYyFbMDsgMTBdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8zKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIHJlYWRfYnVmXzMudHJ1bmNhdGUoMCk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBhbGwgdGhlIGJ5dGVzIHdlIHJlY2VpdmVkIG1hdGNoIHRoZSBvcmlnaW5hbCAoYWdhaW4hKQorICAgICAgICBsZXQgbXV0IGJ5dGVzX3JlYWQgPSBWZWM6OndpdGhfY2FwYWNpdHkoMTApOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8wKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMSk7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzIpOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8zKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnl0ZXNfcmVhZCwgJnJlYWRhYmxlX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hbGxvd19yZWFkc190b19zdWNjZWVkX2FmdGVyX3JlYWRfYnVmZmVyX3JlcGxlbmlzaGVkKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgzLCAwKTsKKworICAgICAgICBsZXQgcmVhZGFibGVfYnl0ZXNfMDogW3U4OyAzXSA9IFsweDAyLCAweEFCLCAweDMzXTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlJ3JlIGFibGUgdG8gc2V0IHRoZSBieXRlcyB0byBiZSByZWFkCisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXNfMCk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRhYmxlX2J5dGVzXzApOworCisgICAgICAgIGxldCBtdXQgcmVhZF9idWYgPSB2ZWMhWzA7IDRdOworCisgICAgICAgIC8vIGRyYWluIHRoZSByZWFkIGJ1ZmZlcgorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZF9idWZbMC4uM10pOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgYSBzdWJzZXF1ZW50IHJlYWQgZmFpbHMKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKworICAgICAgICAvLyB3ZSBkb24ndCBtb2RpZnkgdGhlIHJlYWQgYnVmZmVyIG9uIGZhaWx1cmUKKyAgICAgICAgbGV0IG11dCBleHBlY3RlZF9ieXRlcyA9IFZlYzo6d2l0aF9jYXBhY2l0eSg0KTsKKyAgICAgICAgZXhwZWN0ZWRfYnl0ZXMuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRhYmxlX2J5dGVzXzApOworICAgICAgICBleHBlY3RlZF9ieXRlcy5wdXNoKDB4MDApOworICAgICAgICBhc3NlcnRfZXEhKCZyZWFkX2J1ZiwgJmV4cGVjdGVkX2J5dGVzKTsKKworICAgICAgICAvLyByZXBsZW5pc2ggdGhlIHJlYWQgYnVmZmVyIGFnYWluCisgICAgICAgIGxldCByZWFkYWJsZV9ieXRlc18xOiBbdTg7IDJdID0gWzB4OTEsIDB4QUFdOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UncmUgYWJsZSB0byBzZXQgdGhlIGJ5dGVzIHRvIGJlIHJlYWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlc18xKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDIpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZGFibGVfYnl0ZXNfMSk7CisKKyAgICAgICAgLy8gcmVhZCBhZ2FpbgorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZF9idWZbMC4uMl0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21vZC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjIzMzUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbW9kLnJzCkBAIC0wLDAgKzEsMjkxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUeXBlcyB1c2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgYnl0ZXMgb3ZlciBhbiBJL08gY2hhbm5lbC4KKy8vIQorLy8hIFRoZSBjb3JlIHR5cGVzIGFyZSB0aGUgYFRSZWFkVHJhbnNwb3J0YCwgYFRXcml0ZVRyYW5zcG9ydGAgYW5kIHRoZQorLy8hIGBUSW9DaGFubmVsYCB0cmFpdHMsIHRocm91Z2ggd2hpY2ggYFRJbnB1dFByb3RvY29sYCBvcgorLy8hIGBUT3V0cHV0UHJvdG9jb2xgIGNhbiByZWNlaXZlIGFuZCBzZW5kIHByaW1pdGl2ZXMgb3ZlciB0aGUgd2lyZS4gV2hpbGUKKy8vISBgVElucHV0UHJvdG9jb2xgIGFuZCBgVE91dHB1dFByb3RvY29sYCBpbnN0YW5jZXMgZGVhbCB3aXRoIGxhbmd1YWdlIHByaW1pdGl2ZXMKKy8vISB0aGUgdHlwZXMgaW4gdGhpcyBtb2R1bGUgdW5kZXJzdGFuZCBvbmx5IGJ5dGVzLgorCit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OwordXNlIHN0ZDo6b3BzOjp7RGVyZWYsIERlcmVmTXV0fTsKKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyB7CisgICAgKCR0cmFuc3BvcnQ6aWRlbnQsICRudW1fd3JpdHRlbl9ieXRlczpleHByKSA9PiB7eworICAgICAgICBhc3NlcnRfZXEhKCR0cmFuc3BvcnQuY2hhbm5lbC53cml0ZV9ieXRlcygpLmxlbigpLCAkbnVtX3dyaXR0ZW5fYnl0ZXMpOworICAgIH19OworfQorCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMgeworICAgICgkdHJhbnNwb3J0OmlkZW50LCAkZXhwZWN0ZWRfYnl0ZXM6aWRlbnQpID0+IHt7CisgICAgICAgIGFzc2VydF9lcSEoJHRyYW5zcG9ydC5jaGFubmVsLndyaXRlX2J5dGVzKCksICYkZXhwZWN0ZWRfYnl0ZXMpOworICAgIH19OworfQorCittb2QgYnVmZmVyZWQ7Cittb2QgZnJhbWVkOworbW9kIG1lbTsKK21vZCBzb2NrZXQ7CisKK3B1YiB1c2Ugc2VsZjo6YnVmZmVyZWQ6OnsKKyAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0LCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQsCisgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6ZnJhbWVkOjp7CisgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0LAorICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjptZW06OlRCdWZmZXJDaGFubmVsOworcHViIHVzZSBzZWxmOjpzb2NrZXQ6OlRUY3BDaGFubmVsOworCisvLy8gSWRlbnRpZmllcyBhIHRyYW5zcG9ydCB1c2VkIGJ5IGEgYFRJbnB1dFByb3RvY29sYCB0byByZWNlaXZlIGJ5dGVzLgorcHViIHRyYWl0IFRSZWFkVHJhbnNwb3J0OiBSZWFkIHt9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IGEgc2VydmVyIHRvIGNyZWF0ZSBgVFJlYWRUcmFuc3BvcnRgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCitwdWIgdHJhaXQgVFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRUcmFuc3BvcnRgIHRoYXQgd3JhcHMgYSBjaGFubmVsIG92ZXIgd2hpY2ggYnl0ZXMgYXJlIHRvIGJlIHJlYWQuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPjsKK30KKworLy8vIElkZW50aWZpZXMgYSB0cmFuc3BvcnQgdXNlZCBieSBgVE91dHB1dFByb3RvY29sYCB0byBzZW5kIGJ5dGVzLgorcHViIHRyYWl0IFRXcml0ZVRyYW5zcG9ydDogV3JpdGUge30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gY3JlYXRlIGBUV3JpdGVUcmFuc3BvcnRgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCitwdWIgdHJhaXQgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUVHJhbnNwb3J0YCB0aGF0IHdyYXBzIGEgY2hhbm5lbCBvdmVyIHdoaWNoIGJ5dGVzIGFyZSB0byBiZSBzZW50LgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPjsKK30KKworaW1wbDxUPiBUUmVhZFRyYW5zcG9ydCBmb3IgVCB3aGVyZSBUOiBSZWFkIHt9CisKK2ltcGw8VD4gVFdyaXRlVHJhbnNwb3J0IGZvciBUIHdoZXJlIFQ6IFdyaXRlIHt9CisKKy8vIEZJWE1FOiBpbXBsZW1lbnQgdGhlIERlYnVnIHRyYWl0IGZvciBib3hlZCB0cmFuc3BvcnRzCisKK2ltcGw8VD4gVFJlYWRUcmFuc3BvcnRGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUoY2hhbm5lbCkKKyAgICB9Cit9CisKK2ltcGw8VD4gVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKGNoYW5uZWwpCisgICAgfQorfQorCisvLy8gSWRlbnRpZmllcyBhIHNwbGl0dGFibGUgYmlkaXJlY3Rpb25hbCBJL08gY2hhbm5lbCB1c2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgYnl0ZXMuCitwdWIgdHJhaXQgVElvQ2hhbm5lbDogUmVhZCArIFdyaXRlIHsKKyAgICAvLy8gU3BsaXQgdGhlIGNoYW5uZWwgaW50byBhIHJlYWRhYmxlIGhhbGYgYW5kIGEgd3JpdGFibGUgaGFsZiwgd2hlcmUgdGhlCisgICAgLy8vIHJlYWRhYmxlIGhhbGYgaW1wbGVtZW50cyBgaW86OlJlYWRgIGFuZCB0aGUgd3JpdGFibGUgaGFsZiBpbXBsZW1lbnRzCisgICAgLy8vIGBpbzo6V3JpdGVgLiBSZXR1cm5zIGBOb25lYCBpZiB0aGUgY2hhbm5lbCB3YXMgbm90IGluaXRpYWxpemVkLCBvciBpZiBpdAorICAgIC8vLyBjYW5ub3QgYmUgc3BsaXQgc2FmZWx5LgorICAgIC8vLworICAgIC8vLyBSZXR1cm5lZCBoYWx2ZXMgbWF5IHNoYXJlIHRoZSB1bmRlcmx5aW5nIE9TIGNoYW5uZWwgb3IgYnVmZmVyIHJlc291cmNlcy4KKyAgICAvLy8gSW1wbGVtZW50YXRpb25zICoqc2hvdWxkIGVuc3VyZSoqIHRoYXQgdGhlc2UgdHdvIGhhbHZlcyBjYW4gYmUgc2FmZWx5CisgICAgLy8vIHVzZWQgaW5kZXBlbmRlbnRseSBieSBjb25jdXJyZW50IHRocmVhZHMuCisgICAgZm4gc3BsaXQoc2VsZikgLT4gOjpSZXN1bHQ8KDo6dHJhbnNwb3J0OjpSZWFkSGFsZjxTZWxmPiwgOjp0cmFuc3BvcnQ6OldyaXRlSGFsZjxTZWxmPik+CisgICAgd2hlcmUKKyAgICAgICAgU2VsZjogU2l6ZWQ7Cit9CisKKy8vLyBUaGUgcmVhZGFibGUgaGFsZiBvZiBhbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBgVElvQ2hhbm5lbDo6c3BsaXRgLgorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGhhbmRsZTogQywKK30KKworLy8vIFRoZSB3cml0YWJsZSBoYWxmIG9mIGFuIG9iamVjdCByZXR1cm5lZCBmcm9tIGBUSW9DaGFubmVsOjpzcGxpdGAuCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBoYW5kbGU6IEMsCit9CisKK2ltcGw8Qz4gUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFJlYWRIYWxmYCBhc3NvY2lhdGVkIHdpdGggcmVhZGFibGUgYGhhbmRsZWAKKyAgICBwdWIgZm4gbmV3KGhhbmRsZTogQykgLT4gUmVhZEhhbGY8Qz4geworICAgICAgICBSZWFkSGFsZiB7IGhhbmRsZSB9CisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFdyaXRlSGFsZmAgYXNzb2NpYXRlZCB3aXRoIHdyaXRhYmxlIGBoYW5kbGVgCisgICAgcHViIGZuIG5ldyhoYW5kbGU6IEMpIC0+IFdyaXRlSGFsZjxDPiB7CisgICAgICAgIFdyaXRlSGFsZiB7IGhhbmRsZSB9CisgICAgfQorfQorCitpbXBsPEM+IFJlYWQgZm9yIFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGJ1ZjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaGFuZGxlLnJlYWQoYnVmKQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZSBmb3IgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmhhbmRsZS53cml0ZShidWYpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaGFuZGxlLmZsdXNoKCkKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWYgZm9yIFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgdHlwZSBUYXJnZXQgPSBDOworCisgICAgZm4gZGVyZWYoJnNlbGYpIC0+ICZTZWxmOjpUYXJnZXQgeworICAgICAgICAmc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWZNdXQgZm9yIFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgZm4gZGVyZWZfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBDIHsKKyAgICAgICAgJm11dCBzZWxmLmhhbmRsZQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZiBmb3IgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIHR5cGUgVGFyZ2V0ID0gQzsKKworICAgIGZuIGRlcmVmKCZzZWxmKSAtPiAmU2VsZjo6VGFyZ2V0IHsKKyAgICAgICAgJnNlbGYuaGFuZGxlCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmTXV0IGZvciBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gZGVyZWZfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBDIHsKKyAgICAgICAgJm11dCBzZWxmLmhhbmRsZQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHN0ZDo6aW86OkN1cnNvcjsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfcmVhZF9jaGFubmVsX2Zyb21fY29uY3JldGVfcmVhZF90eXBlKCkgeworICAgICAgICBsZXQgciA9IEN1cnNvcjo6bmV3KFswLCAxLCAyXSk7CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfcmVhZF9jaGFubmVsX2Zyb21fYm94ZWRfcmVhZCgpIHsKKyAgICAgICAgbGV0IHI6IEJveDxSZWFkPiA9IEJveDo6bmV3KEN1cnNvcjo6bmV3KFswLCAxLCAyXSkpOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3dyaXRlX2NoYW5uZWxfZnJvbV9jb25jcmV0ZV93cml0ZV90eXBlKCkgeworICAgICAgICBsZXQgdyA9IHZlYyFbMHU4OyAxMF07CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3dyaXRlX2NoYW5uZWxfZnJvbV9ib3hlZF93cml0ZSgpIHsKKyAgICAgICAgbGV0IHc6IEJveDxXcml0ZT4gPSBCb3g6Om5ldyh2ZWMhWzB1ODsgMTBdKTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfcmVhZF90cmFuc3BvcnRfZnJvbV9jb25jcmV0ZV9yZWFkX3RyYW5zcG9ydCgpIHsKKyAgICAgICAgbGV0IHIgPSBDdXJzb3I6Om5ldyhbMCwgMSwgMl0pOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocik7CisgICAgICAgIHRha2VzX3JlYWRfdHJhbnNwb3J0KCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfdHJhbnNwb3J0X2Zyb21fYm94ZWRfcmVhZCgpIHsKKyAgICAgICAgbGV0IHIgPSBDdXJzb3I6Om5ldyhbMCwgMSwgMl0pOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUUmVhZFRyYW5zcG9ydD4gPSBCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocikpOworICAgICAgICB0YWtlc19yZWFkX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV90cmFuc3BvcnRfZnJvbV9jb25jcmV0ZV93cml0ZV90cmFuc3BvcnQoKSB7CisgICAgICAgIGxldCB3ID0gdmVjIVswdTg7IDEwXTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KTsKKyAgICAgICAgdGFrZXNfd3JpdGVfdHJhbnNwb3J0KCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3dyaXRlX3RyYW5zcG9ydF9mcm9tX2JveGVkX3dyaXRlKCkgeworICAgICAgICBsZXQgdyA9IHZlYyFbMHU4OyAxMF07CisgICAgICAgIGxldCBtdXQgdDogQm94PFRXcml0ZVRyYW5zcG9ydD4gPSBCb3g6Om5ldyhUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpKTsKKyAgICAgICAgdGFrZXNfd3JpdGVfdHJhbnNwb3J0KCZtdXQgdCkKKyAgICB9CisKKyAgICBmbiB0YWtlc19yZWFkX3RyYW5zcG9ydDxSPih0OiAmbXV0IFIpCisgICAgd2hlcmUKKyAgICAgICAgUjogVFJlYWRUcmFuc3BvcnQsCisgICAgeworICAgICAgICB0LmJ5dGVzKCk7CisgICAgfQorCisgICAgZm4gdGFrZXNfd3JpdGVfdHJhbnNwb3J0PFc+KHQ6ICZtdXQgVykKKyAgICB3aGVyZQorICAgICAgICBXOiBUV3JpdGVUcmFuc3BvcnQsCisgICAgeworICAgICAgICB0LmZsdXNoKCkudW53cmFwKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvc29ja2V0LnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvc29ja2V0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZWY2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9zb2NrZXQucnMKQEAgLTAsMCArMSwxNjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntFcnJvcktpbmQsIFJlYWQsIFdyaXRlfTsKK3VzZSBzdGQ6Om5ldDo6e1NodXRkb3duLCBUY3BTdHJlYW19OworCit1c2Ugc3VwZXI6OntSZWFkSGFsZiwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKK3VzZSB7bmV3X3RyYW5zcG9ydF9lcnJvciwgVHJhbnNwb3J0RXJyb3JLaW5kfTsKKworLy8vIEJpZGlyZWN0aW9uYWwgVENQL0lQIGNoYW5uZWwuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVFRjcENoYW5uZWxgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyA0XTsKKy8vLyBjLnJlYWQoJm11dCBidWYpLnVud3JhcCgpOworLy8vIGMud3JpdGUoJnZlYyFbMCwgMSwgMl0pLnVud3JhcCgpOworLy8vIGBgYAorLy8vCisvLy8gQ3JlYXRlIGEgYFRUY3BDaGFubmVsYCBieSB3cmFwcGluZyBhbiBleGlzdGluZyBgVGNwU3RyZWFtYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworLy8vIHVzZSBzdGQ6Om5ldDo6VGNwU3RyZWFtOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgc3RyZWFtID0gVGNwU3RyZWFtOjpjb25uZWN0KCIxMjcuMC4wLjE6OTE4OSIpLnVud3JhcCgpOworLy8vCisvLy8gLy8gbm8gbmVlZCB0byBjYWxsIGMub3BlbigpIHNpbmNlIHdlJ3ZlIGFscmVhZHkgY29ubmVjdGVkIGFib3ZlCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6OndpdGhfc3RyZWFtKHN0cmVhbSk7CisvLy8KKy8vLyBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyA0XTsKKy8vLyBjLnJlYWQoJm11dCBidWYpLnVud3JhcCgpOworLy8vIGMud3JpdGUoJnZlYyFbMCwgMSwgMl0pLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcsIERlZmF1bHQpXQorcHViIHN0cnVjdCBUVGNwQ2hhbm5lbCB7CisgICAgc3RyZWFtOiBPcHRpb248VGNwU3RyZWFtPiwKK30KKworaW1wbCBUVGNwQ2hhbm5lbCB7CisgICAgLy8vIENyZWF0ZSBhbiB1bmluaXRpYWxpemVkIGBUVGNwQ2hhbm5lbGAuCisgICAgLy8vCisgICAgLy8vIFRoZSByZXR1cm5lZCBpbnN0YW5jZSBtdXN0IGJlIG9wZW5lZCB1c2luZyBgVFRjcENoYW5uZWw6Om9wZW4oLi4uKWAKKyAgICAvLy8gYmVmb3JlIGl0IGNhbiBiZSB1c2VkLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUVGNwQ2hhbm5lbCB7CisgICAgICAgIFRUY3BDaGFubmVsIHsgc3RyZWFtOiBOb25lIH0KKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRUY3BDaGFubmVsYCB0aGF0IHdyYXBzIGFuIGV4aXN0aW5nIGBUY3BTdHJlYW1gLgorICAgIC8vLworICAgIC8vLyBUaGUgcGFzc2VkLWluIHN0cmVhbSBpcyBhc3N1bWVkIHRvIGhhdmUgYmVlbiBvcGVuZWQgYmVmb3JlIGJlaW5nIHdyYXBwZWQKKyAgICAvLy8gYnkgdGhlIGNyZWF0ZWQgYFRUY3BDaGFubmVsYCBpbnN0YW5jZS4KKyAgICBwdWIgZm4gd2l0aF9zdHJlYW0oc3RyZWFtOiBUY3BTdHJlYW0pIC0+IFRUY3BDaGFubmVsIHsKKyAgICAgICAgVFRjcENoYW5uZWwgeworICAgICAgICAgICAgc3RyZWFtOiBTb21lKHN0cmVhbSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gQ29ubmVjdCB0byBgcmVtb3RlX2FkZHJlc3NgLCB3aGljaCBzaG91bGQgaGF2ZSB0aGUgZm9ybSBgaG9zdDpwb3J0YC4KKyAgICBwdWIgZm4gb3BlbigmbXV0IHNlbGYsIHJlbW90ZV9hZGRyZXNzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBzZWxmLnN0cmVhbS5pc19zb21lKCkgeworICAgICAgICAgICAgRXJyKG5ld190cmFuc3BvcnRfZXJyb3IoCisgICAgICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgICAgICAidGNwIGNvbm5lY3Rpb24gcHJldmlvdXNseSBvcGVuZWQiLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hdGNoIFRjcFN0cmVhbTo6Y29ubmVjdCgmcmVtb3RlX2FkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBPayhzKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gU29tZShzKTsKKyAgICAgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVycihlKSA9PiBFcnIoRnJvbTo6ZnJvbShlKSksCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gU2h1dCBkb3duIHRoaXMgY2hhbm5lbC4KKyAgICAvLy8KKyAgICAvLy8gQm90aCBzZW5kIGFuZCByZWNlaXZlIGhhbHZlcyBhcmUgY2xvc2VkLCBhbmQgdGhpcyBpbnN0YW5jZSBjYW4gbm8KKyAgICAvLy8gbG9uZ2VyIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhbm90aGVyIGVuZHBvaW50LgorICAgIHB1YiBmbiBjbG9zZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLnNodXRkb3duKFNodXRkb3duOjpCb3RoKSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gaWZfc2V0PEYsIFQ+KCZtdXQgc2VsZiwgbXV0IHN0cmVhbV9vcGVyYXRpb246IEYpIC0+IGlvOjpSZXN1bHQ8VD4KKyAgICB3aGVyZQorICAgICAgICBGOiBGbk11dCgmbXV0IFRjcFN0cmVhbSkgLT4gaW86OlJlc3VsdDxUPiwKKyAgICB7CisgICAgICAgIGlmIGxldCBTb21lKHJlZiBtdXQgcykgPSBzZWxmLnN0cmVhbSB7CisgICAgICAgICAgICBzdHJlYW1fb3BlcmF0aW9uKHMpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFcnIoaW86OkVycm9yOjpuZXcoCisgICAgICAgICAgICAgICAgRXJyb3JLaW5kOjpOb3RDb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgInRjcCBlbmRwb2ludCBub3QgY29ubmVjdGVkIiwKKyAgICAgICAgICAgICkpCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVElvQ2hhbm5lbCBmb3IgVFRjcENoYW5uZWwgeworICAgIGZuIHNwbGl0KHNlbGYpIC0+IDo6UmVzdWx0PChSZWFkSGFsZjxTZWxmPiwgV3JpdGVIYWxmPFNlbGY+KT4KKyAgICB3aGVyZQorICAgICAgICBTZWxmOiBTaXplZCwKKyAgICB7CisgICAgICAgIGxldCBtdXQgcyA9IHNlbGY7CisKKyAgICAgICAgcy5zdHJlYW0KKyAgICAgICAgICAgIC5hc19tdXQoKQorICAgICAgICAgICAgLmFuZF90aGVuKHxzfCBzLnRyeV9jbG9uZSgpLm9rKCkpCisgICAgICAgICAgICAubWFwKHxjbG9uZWR8IHsKKyAgICAgICAgICAgICAgICBsZXQgcmVhZF9oYWxmID0gUmVhZEhhbGY6Om5ldyhUVGNwQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbTogcy5zdHJlYW0udGFrZSgpLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGxldCB3cml0ZV9oYWxmID0gV3JpdGVIYWxmOjpuZXcoVFRjcENoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW06IFNvbWUoY2xvbmVkKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAocmVhZF9oYWxmLCB3cml0ZV9oYWxmKQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5va19vcl9lbHNlKHx8IHsKKyAgICAgICAgICAgICAgICBuZXdfdHJhbnNwb3J0X2Vycm9yKAorICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY2xvbmUgdW5kZXJseWluZyB0Y3Agc3RyZWFtIiwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgIH0KK30KKworaW1wbCBSZWFkIGZvciBUVGNwQ2hhbm5lbCB7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGI6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy5yZWFkKGIpKQorICAgIH0KK30KKworaW1wbCBXcml0ZSBmb3IgVFRjcENoYW5uZWwgeworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMud3JpdGUoYikpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLmZsdXNoKCkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvQ2FyZ28udG9tbCBiL2xpYi9ycy90ZXN0L0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkZWMxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNSBAQAorW3BhY2thZ2VdCituYW1lID0gImtpdGNoZW4tc2luayIKK3ZlcnNpb24gPSAiMC4xLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQorcHVibGlzaCA9IGZhbHNlCisKK1tkZXBlbmRlbmNpZXNdCitjbGFwID0gIjwyLjI4LjAiCitvcmRlcmVkLWZsb2F0ID0gIjAuMy4wIgordHJ5X2Zyb20gPSAiMC4yLjAiCisKK1tkZXBlbmRlbmNpZXMudGhyaWZ0XQorcGF0aCA9ICIuLi8iCisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3JzL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkZDc1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitzdHViczogdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQgdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQgdGhyaWZ0cy9NaWRsYXllci50aHJpZnQgdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQgJCh0b3BfYnVpbGRkaXIpL3Rlc3QvUmVjdXJzaXZlLnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvQmFzZV9PbmUudGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL0Jhc2VfVHdvLnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9NaWRsYXllci50aHJpZnQKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvVWx0aW1hdGUudGhyaWZ0CisJJChUSFJJRlQpIC1vdXQgc3JjIC0tZ2VuIHJzICQodG9wX2J1aWxkZGlyKS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKKworY2hlY2s6IHN0dWJzCisJJChDQVJHTykgYnVpbGQKKwkkKENBUkdPKSB0ZXN0CisJWyAtZCBiaW4gXSB8fCBta2RpciBiaW4KKwljcCB0YXJnZXQvZGVidWcva2l0Y2hlbl9zaW5rX3NlcnZlciBiaW4va2l0Y2hlbl9zaW5rX3NlcnZlcgorCWNwIHRhcmdldC9kZWJ1Zy9raXRjaGVuX3NpbmtfY2xpZW50IGJpbi9raXRjaGVuX3NpbmtfY2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKwktJChSTSkgc3JjL2Jhc2Vfb25lLnJzCisJLSQoUk0pIHNyYy9iYXNlX3R3by5ycworCS0kKFJNKSBzcmMvbWlkbGF5ZXIucnMKKwktJChSTSkgc3JjL3VsdGltYXRlLnJzCisJLSQoUk0pIC1yIGJpbgorCitFWFRSQV9ESVNUID0gXAorCUNhcmdvLnRvbWwgXAorCXRocmlmdHMvQmFzZV9PbmUudGhyaWZ0IFwKKwl0aHJpZnRzL0Jhc2VfVHdvLnRocmlmdCBcCisJdGhyaWZ0cy9NaWRsYXllci50aHJpZnQgXAorCXRocmlmdHMvVWx0aW1hdGUudGhyaWZ0IFwKKwlzcmMvbGliLnJzIFwKKwlzcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMgXAorCXNyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycworCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5NWM4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycwpAQCAtMCwwICsxLDIzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworCitleHRlcm4gY3JhdGUga2l0Y2hlbl9zaW5rOworZXh0ZXJuIGNyYXRlIHRocmlmdDsKKwordXNlIHN0ZDo6Y29udmVydDo6SW50bzsKKwordXNlIGtpdGNoZW5fc2luazo6YmFzZV90d286OntUTmFwa2luU2VydmljZVN5bmNDbGllbnQsIFRSYW1lblNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSBraXRjaGVuX3Npbms6Om1pZGxheWVyOjp7TWVhbFNlcnZpY2VTeW5jQ2xpZW50LCBUTWVhbFNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSBraXRjaGVuX3Npbms6OnJlY3Vyc2l2ZTsKK3VzZSBraXRjaGVuX3Npbms6OnJlY3Vyc2l2ZTo6e0NvUmVjLCBDb1JlYzIsIFJlY0xpc3QsIFJlY1RyZWUsIFRUZXN0U2VydmljZVN5bmNDbGllbnR9OwordXNlIGtpdGNoZW5fc2luazo6dWx0aW1hdGU6OntGdWxsTWVhbFNlcnZpY2VTeW5jQ2xpZW50LCBURnVsbE1lYWxTZXJ2aWNlU3luY0NsaWVudH07Cit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6eworICAgIFRCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRDb21wYWN0SW5wdXRQcm90b2NvbCwgVENvbXBhY3RPdXRwdXRQcm90b2NvbCwKKyAgICBUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sLAorfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6eworICAgIFJlYWRIYWxmLCBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUSW9DaGFubmVsLCBUVGNwQ2hhbm5lbCwgV3JpdGVIYWxmLAorfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgia2l0Y2hlbiBzaW5rIGNsaWVudCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgia2l0Y2hlbiBzaW5rIGNsaWVudCBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG1hdGNoZXMgPSBjbGFwX2FwcCEocnVzdF9raXRjaGVuX3NpbmtfY2xpZW50ID0+CisgICAgICAgICh2ZXJzaW9uOiAiMC4xLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiVGhyaWZ0IFJ1c3Qga2l0Y2hlbiBzaW5rIGNsaWVudCIpCisgICAgICAgIChAYXJnIGhvc3Q6IC0taG9zdCArdGFrZXNfdmFsdWUgIkhvc3Qgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsb2NhdGVkIikKKyAgICAgICAgKEBhcmcgcG9ydDogLS1wb3J0ICt0YWtlc192YWx1ZSAiUG9ydCBvbiB3aGljaCB0aGUgVGhyaWZ0IHRlc3Qgc2VydmVyIGlzIGxpc3RlbmluZyIpCisgICAgICAgIChAYXJnIHByb3RvY29sOiAtLXByb3RvY29sICt0YWtlc192YWx1ZSAiVGhyaWZ0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJjb21wYWN0XCIpIikKKyAgICAgICAgKEBhcmcgc2VydmljZTogLS1zZXJ2aWNlICt0YWtlc192YWx1ZSAiU2VydmljZSB0eXBlIHRvIGNvbnRhY3QgKFwicGFydFwiLCBcImZ1bGxcIiwgXCJyZWN1cnNpdmVcIikiKQorICAgICkKKyAgICAgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IGhvc3QgPSBtYXRjaGVzLnZhbHVlX29mKCJob3N0IikudW53cmFwX29yKCIxMjcuMC4wLjEiKTsKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImNvbXBhY3QiKTsKKyAgICBsZXQgc2VydmljZSA9IG1hdGNoZXMudmFsdWVfb2YoInNlcnZpY2UiKS51bndyYXBfb3IoInBhcnQiKTsKKworICAgIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gdGNwX2NoYW5uZWwoaG9zdCwgcG9ydCk/OworICAgIGxldCAoaV90cmFuLCBvX3RyYW4pID0gKAorICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbiksCisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbiksCisgICAgKTsKKworICAgIGxldCAoaV9wcm90LCBvX3Byb3QpOiAoQm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4pID0gbWF0Y2ggcHJvdG9jb2wgeworICAgICAgICAiYmluYXJ5IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbiwgdHJ1ZSkpLAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob190cmFuLCB0cnVlKSksCisgICAgICAgICksCisgICAgICAgICJjb21wYWN0IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4pKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pKSwKKyAgICAgICAgKSwKKyAgICAgICAgdW5tYXRjaGVkID0+IHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgcHJvdG9jb2wge30iLCB1bm1hdGNoZWQpLmludG8oKSksCisgICAgfTsKKworICAgIHJ1bl9jbGllbnQoc2VydmljZSwgaV9wcm90LCBvX3Byb3QpCit9CisKK2ZuIHJ1bl9jbGllbnQoCisgICAgc2VydmljZTogJnN0ciwKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBtYXRjaCBzZXJ2aWNlIHsKKyAgICAgICAgImZ1bGwiID0+IGV4ZWNfZnVsbF9tZWFsX2NsaWVudChpX3Byb3QsIG9fcHJvdCksCisgICAgICAgICJwYXJ0IiA9PiBleGVjX21lYWxfY2xpZW50KGlfcHJvdCwgb19wcm90KSwKKyAgICAgICAgInJlY3Vyc2l2ZSIgPT4gZXhlY19yZWN1cnNpdmVfY2xpZW50KGlfcHJvdCwgb19wcm90KSwKKyAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6ZnJvbShmb3JtYXQhKAorICAgICAgICAgICAgInVua25vd24gc2VydmljZSB0eXBlIHt9IiwKKyAgICAgICAgICAgIHNlcnZpY2UKKyAgICAgICAgKSkpLAorICAgIH0KK30KKworZm4gdGNwX2NoYW5uZWwoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCispIC0+IHRocmlmdDo6UmVzdWx0PChSZWFkSGFsZjxUVGNwQ2hhbm5lbD4sIFdyaXRlSGFsZjxUVGNwQ2hhbm5lbD4pPiB7CisgICAgbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworICAgIGMub3BlbigmZm9ybWF0ISgie306e30iLCBob3N0LCBwb3J0KSk/OworICAgIGMuc3BsaXQoKQorfQorCitmbiBleGVjX21lYWxfY2xpZW50KAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtdXQgY2xpZW50ID0gTWVhbFNlcnZpY2VTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgLy8gY2xpZW50LmZ1bGxfbWVhbCgpOyAvLyA8LS0gSU1QT1JUQU5UOiBpZiB5b3UgdW5jb21tZW50IHRoaXMsIGNvbXBpbGF0aW9uICpzaG91bGQqIGZhaWwKKyAgICAvLyB0aGlzIGlzIGJlY2F1c2UgdGhlIE1lYWxTZXJ2aWNlIHN0cnVjdCBkb2VzIG5vdCBjb250YWluIHRoZSBhcHByb3ByaWF0ZSBzZXJ2aWNlIG1hcmtlcgorCisgICAgLy8gb25seSB0aGUgZm9sbG93aW5nIHRocmVlIGNhbGxzIHdvcmsKKyAgICBleGVjdXRlX2NhbGwoInBhcnQiLCAicmFtZW4iLCB8fCBjbGllbnQucmFtZW4oNTApKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJwYXJ0IiwgIm1lYWwiLCB8fCBjbGllbnQubWVhbCgpKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJwYXJ0IiwgIm5hcGtpbiIsIHx8IGNsaWVudC5uYXBraW4oKSkubWFwKHxffCAoKSk/OworCisgICAgT2soKCkpCit9CisKK2ZuIGV4ZWNfZnVsbF9tZWFsX2NsaWVudCgKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbXV0IGNsaWVudCA9IEZ1bGxNZWFsU2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCk7CisKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAicmFtZW4iLCB8fCBjbGllbnQucmFtZW4oMTAwKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJtZWFsIiwgfHwgY2xpZW50Lm1lYWwoKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJuYXBraW4iLCB8fCBjbGllbnQubmFwa2luKCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAiZnVsbCBtZWFsIiwgfHwgY2xpZW50LmZ1bGxfbWVhbCgpKS5tYXAofF98ICgpKT87CisKKyAgICBPaygoKSkKK30KKworZm4gZXhlY19yZWN1cnNpdmVfY2xpZW50KAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtdXQgY2xpZW50ID0gcmVjdXJzaXZlOjpUZXN0U2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCk7CisKKyAgICBsZXQgdHJlZSA9IFJlY1RyZWUgeworICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhW0JveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVsKKyAgICAgICAgICAgICAgICBCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoMyksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBOb25lLAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDQpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgXSksCisgICAgICAgICAgICBpdGVtOiBTb21lKDIpLAorICAgICAgICB9KV0pLAorICAgICAgICBpdGVtOiBTb21lKDEpLAorICAgIH07CisKKyAgICBsZXQgZXhwZWN0ZWRfdHJlZSA9IFJlY1RyZWUgeworICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhW0JveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVsKKyAgICAgICAgICAgICAgICBCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFNvbWUoVmVjOjpuZXcoKSksIC8vIHJlbW90ZSByZXR1cm5zIGFuIGVtcHR5IGxpc3QKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSgzKSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICBCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFNvbWUoVmVjOjpuZXcoKSksIC8vIHJlbW90ZSByZXR1cm5zIGFuIGVtcHR5IGxpc3QKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSg0KSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgaXRlbTogU29tZSgyKSwKKyAgICAgICAgfSldKSwKKyAgICAgICAgaXRlbTogU29tZSgxKSwKKyAgICB9OworCisgICAgbGV0IHJldHVybmVkX3RyZWUgPSBleGVjdXRlX2NhbGwoInJlY3Vyc2l2ZSIsICJlY2hvX3RyZWUiLCB8fCBjbGllbnQuZWNob190cmVlKHRyZWUuY2xvbmUoKSkpPzsKKyAgICBpZiByZXR1cm5lZF90cmVlICE9IGV4cGVjdGVkX3RyZWUgeworICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoCisgICAgICAgICAgICAibWlzbWF0Y2hlZCByZWN1cnNpdmUgdHJlZSB7Oj99IHs6P30iLAorICAgICAgICAgICAgZXhwZWN0ZWRfdHJlZSwgcmV0dXJuZWRfdHJlZQorICAgICAgICApCisgICAgICAgIC5pbnRvKCkpOworICAgIH0KKworICAgIGxldCBsaXN0ID0gUmVjTGlzdCB7CisgICAgICAgIG5leHRpdGVtOiBTb21lKEJveDo6bmV3KFJlY0xpc3QgeworICAgICAgICAgICAgbmV4dGl0ZW06IFNvbWUoQm94OjpuZXcoUmVjTGlzdCB7CisgICAgICAgICAgICAgICAgbmV4dGl0ZW06IE5vbmUsCisgICAgICAgICAgICAgICAgaXRlbTogU29tZSgzKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgIGl0ZW06IFNvbWUoMiksCisgICAgICAgIH0pKSwKKyAgICAgICAgaXRlbTogU29tZSgxKSwKKyAgICB9OworICAgIGxldCByZXR1cm5lZF9saXN0ID0gZXhlY3V0ZV9jYWxsKCJyZWN1cnNpdmUiLCAiZWNob19saXN0IiwgfHwgY2xpZW50LmVjaG9fbGlzdChsaXN0LmNsb25lKCkpKT87CisgICAgaWYgcmV0dXJuZWRfbGlzdCAhPSBsaXN0IHsKKyAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJtaXNtYXRjaGVkIHJlY3Vyc2l2ZSBsaXN0IHs6P30gezo/fSIsIGxpc3QsIHJldHVybmVkX2xpc3QpLmludG8oKSk7CisgICAgfQorCisgICAgbGV0IGNvX3JlYyA9IENvUmVjIHsKKyAgICAgICAgb3RoZXI6IFNvbWUoQm94OjpuZXcoQ29SZWMyIHsKKyAgICAgICAgICAgIG90aGVyOiBTb21lKENvUmVjIHsKKyAgICAgICAgICAgICAgICBvdGhlcjogU29tZShCb3g6Om5ldyhDb1JlYzIgeyBvdGhlcjogTm9uZSB9KSksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgfSkpLAorICAgIH07CisgICAgbGV0IHJldHVybmVkX2NvX3JlYyA9IGV4ZWN1dGVfY2FsbCgicmVjdXJzaXZlIiwgImVjaG9fY29fcmVjIiwgfHwgeworICAgICAgICBjbGllbnQuZWNob19jb19yZWMoY29fcmVjLmNsb25lKCkpCisgICAgfSk/OworICAgIGlmIHJldHVybmVkX2NvX3JlYyAhPSBjb19yZWMgeworICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoIm1pc21hdGNoZWQgY29fcmVjIHs6P30gezo/fSIsIGNvX3JlYywgcmV0dXJuZWRfY29fcmVjKS5pbnRvKCkpOworICAgIH0KKworICAgIE9rKCgpKQorfQorCitmbiBleGVjdXRlX2NhbGw8RiwgUj4oc2VydmljZV90eXBlOiAmc3RyLCBjYWxsX25hbWU6ICZzdHIsIG11dCBmOiBGKSAtPiB0aHJpZnQ6OlJlc3VsdDxSPgord2hlcmUKKyAgICBGOiBGbk11dCgpIC0+IHRocmlmdDo6UmVzdWx0PFI+LAoreworICAgIGxldCByZXMgPSBmKCk7CisKKyAgICBtYXRjaCByZXMgeworICAgICAgICBPayhfKSA9PiBwcmludGxuISgie306IGNvbXBsZXRlZCB7fSBjYWxsIiwgc2VydmljZV90eXBlLCBjYWxsX25hbWUpLAorICAgICAgICBFcnIocmVmIGUpID0+IHByaW50bG4hKAorICAgICAgICAgICAgInt9OiBmYWlsZWQge30gY2FsbCB3aXRoIGVycm9yIHs6P30iLAorICAgICAgICAgICAgc2VydmljZV90eXBlLCBjYWxsX25hbWUsIGUKKyAgICAgICAgKSwKKyAgICB9CisKKyAgICByZXMKK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzgwMWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzCkBAIC0wLDAgKzEsMzEzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CitleHRlcm4gY3JhdGUga2l0Y2hlbl9zaW5rOworZXh0ZXJuIGNyYXRlIHRocmlmdDsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OnsKKyAgICBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeSwKK307Cit1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXI7Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OnsKKyAgICBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorfTsKKwordXNlIGtpdGNoZW5fc2luazo6YmFzZV9vbmU6Ok5vb2RsZTsKK3VzZSBraXRjaGVuX3Npbms6OmJhc2VfdHdvOjp7CisgICAgQnJvdGhUeXBlLCBOYXBraW4sIE5hcGtpblNlcnZpY2VTeW5jSGFuZGxlciwgUmFtZW4sIFJhbWVuU2VydmljZVN5bmNIYW5kbGVyLAorfTsKK3VzZSBraXRjaGVuX3Npbms6Om1pZGxheWVyOjp7CisgICAgRGVzc2VydCwgTWVhbCwgTWVhbFNlcnZpY2VTeW5jSGFuZGxlciwgTWVhbFNlcnZpY2VTeW5jUHJvY2Vzc29yLCBQaWUsCit9OwordXNlIGtpdGNoZW5fc2luazo6cmVjdXJzaXZlOwordXNlIGtpdGNoZW5fc2luazo6dWx0aW1hdGU6OkZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNIYW5kbGVyOwordXNlIGtpdGNoZW5fc2luazo6dWx0aW1hdGU6OnsKKyAgICBEcmluaywgRnVsbE1lYWwsIEZ1bGxNZWFsQW5kRHJpbmtzLCBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jUHJvY2Vzc29yLAorICAgIEZ1bGxNZWFsU2VydmljZVN5bmNIYW5kbGVyLAorfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgia2l0Y2hlbiBzaW5rIHNlcnZlciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgia2l0Y2hlbiBzaW5rIHNlcnZlciBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG1hdGNoZXMgPSBjbGFwX2FwcCEocnVzdF9raXRjaGVuX3Npbmtfc2VydmVyID0+CisgICAgICAgICh2ZXJzaW9uOiAiMC4xLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiVGhyaWZ0IFJ1c3Qga2l0Y2hlbiBzaW5rIHRlc3Qgc2VydmVyIikKKyAgICAgICAgKEBhcmcgcG9ydDogLS1wb3J0ICt0YWtlc192YWx1ZSAicG9ydCBvbiB3aGljaCB0aGUgdGVzdCBzZXJ2ZXIgbGlzdGVucyIpCisgICAgICAgIChAYXJnIHByb3RvY29sOiAtLXByb3RvY29sICt0YWtlc192YWx1ZSAiVGhyaWZ0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJjb21wYWN0XCIpIikKKyAgICAgICAgKEBhcmcgc2VydmljZTogLS1zZXJ2aWNlICt0YWtlc192YWx1ZSAiU2VydmljZSB0eXBlIHRvIGNvbnRhY3QgKFwicGFydFwiLCBcImZ1bGxcIiwgXCJyZWN1cnNpdmVcIikiKQorICAgICkKKyAgICAgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJjb21wYWN0Iik7CisgICAgbGV0IHNlcnZpY2UgPSBtYXRjaGVzLnZhbHVlX29mKCJzZXJ2aWNlIikudW53cmFwX29yKCJwYXJ0Iik7CisgICAgbGV0IGxpc3Rlbl9hZGRyZXNzID0gZm9ybWF0ISgiMTI3LjAuMC4xOnt9IiwgcG9ydCk7CisKKyAgICBwcmludGxuISgiYmluZGluZyB0byB7fSIsIGxpc3Rlbl9hZGRyZXNzKTsKKworICAgIGxldCByX3RyYW5zcG9ydF9mYWN0b3J5ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKTsKKyAgICBsZXQgd190cmFuc3BvcnRfZmFjdG9yeSA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworCisgICAgbGV0IChpX3Byb3RvY29sX2ZhY3RvcnksIG9fcHJvdG9jb2xfZmFjdG9yeSk6ICgKKyAgICAgICAgQm94PFRJbnB1dFByb3RvY29sRmFjdG9yeT4sCisgICAgICAgIEJveDxUT3V0cHV0UHJvdG9jb2xGYWN0b3J5PiwKKyAgICApID0gbWF0Y2ggJipwcm90b2NvbCB7CisgICAgICAgICJiaW5hcnkiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICApLAorICAgICAgICAiY29tcGFjdCIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgKSwKKyAgICAgICAgdW5rbm93biA9PiB7CisgICAgICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHRyYW5zcG9ydCB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBGSVhNRTogc2hvdWxkIHByb2Nlc3NvciBiZSBib3hlZCBhcyB3ZWxsPworICAgIC8vCisgICAgLy8gW3NpZ2hdIEkgaGF0ZSBSdXN0IGdlbmVyaWNzIGltcGxlbWVudGF0aW9uCisgICAgLy8KKyAgICAvLyBJIHdvdWxkIGhhdmUgcHJlZmVycmVkIHRvIGJ1aWxkIGEgc2VydmVyIGhlcmUsIHJldHVybiBpdCwgYW5kIHRoZW4gZG8KKyAgICAvLyB0aGUgY29tbW9uIGxpc3Rlbi1hbmQtaGFuZGxlIHN0dWZmLCBidXQgc2luY2UgdGhlIHNlcnZlciBkb2Vzbid0IGhhdmUgYQorICAgIC8vIGNvbW1vbiB0eXBlIChiZWNhdXNlIGVhY2ggbWF0Y2ggYXJtIGluc3RhbnRpYXRlcyBhIHNlcnZlciB3aXRoIGEKKyAgICAvLyBkaWZmZXJlbnQgcHJvY2Vzc29yKSB0aGlzIGlzbid0IHBvc3NpYmxlLgorICAgIC8vCisgICAgLy8gU2luY2Ugd2hhdCBJJ20gZG9pbmcgaXMgdW5jb21tb24gSSdtIGp1c3QgZ29pbmcgdG8gZHVwbGljYXRlIHRoZSBjb2RlCisgICAgbWF0Y2ggJipzZXJ2aWNlIHsKKyAgICAgICAgInBhcnQiID0+IHJ1bl9tZWFsX3NlcnZlcigKKyAgICAgICAgICAgICZsaXN0ZW5fYWRkcmVzcywKKyAgICAgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICApLAorICAgICAgICAiZnVsbCIgPT4gcnVuX2Z1bGxfbWVhbF9zZXJ2ZXIoCisgICAgICAgICAgICAmbGlzdGVuX2FkZHJlc3MsCisgICAgICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgKSwKKyAgICAgICAgInJlY3Vyc2l2ZSIgPT4gcnVuX3JlY3Vyc2l2ZV9zZXJ2ZXIoCisgICAgICAgICAgICAmbGlzdGVuX2FkZHJlc3MsCisgICAgICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgKSwKKyAgICAgICAgdW5rbm93biA9PiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgc2VydmljZSB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKSwKKyAgICB9Cit9CisKK2ZuIHJ1bl9tZWFsX3NlcnZlcjxSVEYsIElQRiwgV1RGLCBPUEY+KAorICAgIGxpc3Rlbl9hZGRyZXNzOiAmc3RyLAorICAgIHJfdHJhbnNwb3J0X2ZhY3Rvcnk6IFJURiwKKyAgICBpX3Byb3RvY29sX2ZhY3Rvcnk6IElQRiwKKyAgICB3X3RyYW5zcG9ydF9mYWN0b3J5OiBXVEYsCisgICAgb19wcm90b2NvbF9mYWN0b3J5OiBPUEYsCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPgord2hlcmUKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICBsZXQgcHJvY2Vzc29yID0gTWVhbFNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoUGFydEhhbmRsZXIge30pOworICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAxLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKGxpc3Rlbl9hZGRyZXNzKQorfQorCitmbiBydW5fZnVsbF9tZWFsX3NlcnZlcjxSVEYsIElQRiwgV1RGLCBPUEY+KAorICAgIGxpc3Rlbl9hZGRyZXNzOiAmc3RyLAorICAgIHJfdHJhbnNwb3J0X2ZhY3Rvcnk6IFJURiwKKyAgICBpX3Byb3RvY29sX2ZhY3Rvcnk6IElQRiwKKyAgICB3X3RyYW5zcG9ydF9mYWN0b3J5OiBXVEYsCisgICAgb19wcm90b2NvbF9mYWN0b3J5OiBPUEYsCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPgord2hlcmUKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICBsZXQgcHJvY2Vzc29yID0gRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KEZ1bGxIYW5kbGVyIHt9KTsKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMSwKKyAgICApOworCisgICAgc2VydmVyLmxpc3RlbihsaXN0ZW5fYWRkcmVzcykKK30KKworc3RydWN0IFBhcnRIYW5kbGVyOworCitpbXBsIE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFBhcnRIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbWVhbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TWVhbD4geworICAgICAgICBwcmludGxuISgicGFydDogaGFuZGxpbmcgbWVhbCBjYWxsIik7CisgICAgICAgIE9rKG1lYWwoKSkKKyAgICB9Cit9CisKK2ltcGwgUmFtZW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFBhcnRIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfcmFtZW4oJnNlbGYsIF86IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8UmFtZW4+IHsKKyAgICAgICAgcHJpbnRsbiEoInBhcnQ6IGhhbmRsaW5nIHJhbWVuIGNhbGwiKTsKKyAgICAgICAgT2socmFtZW4oKSkKKyAgICB9Cit9CisKK2ltcGwgTmFwa2luU2VydmljZVN5bmNIYW5kbGVyIGZvciBQYXJ0SGFuZGxlciB7CisgICAgZm4gaGFuZGxlX25hcGtpbigmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TmFwa2luPiB7CisgICAgICAgIHByaW50bG4hKCJwYXJ0OiBoYW5kbGluZyBuYXBraW4gY2FsbCIpOworICAgICAgICBPayhuYXBraW4oKSkKKyAgICB9Cit9CisKKy8vIGZ1bGwgc2VydmljZQorLy8KKworc3RydWN0IEZ1bGxIYW5kbGVyOworCitpbXBsIEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX2Z1bGxfbWVhbF9hbmRfZHJpbmtzKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxGdWxsTWVhbEFuZERyaW5rcz4geworICAgICAgICBwcmludGxuISgiZnVsbF9tZWFsX2FuZF9kcmlua3M6IGhhbmRsaW5nIGZ1bGwgbWVhbCBhbmQgZHJpbmtzIGNhbGwiKTsKKyAgICAgICAgT2soRnVsbE1lYWxBbmREcmlua3M6Om5ldyhmdWxsX21lYWwoKSwgRHJpbms6OkNhbmFkaWFuV2hpc2t5KSkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfYmVzdF9waWUoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PFBpZT4geworICAgICAgICBwcmludGxuISgiZnVsbF9tZWFsX2FuZF9kcmlua3M6IGhhbmRsaW5nIHBpZSBjYWxsIik7CisgICAgICAgIE9rKFBpZTo6TWlzc2lzc2lwcGlNdWQpIC8vIEkgcHJlZmVyIFBpZTo6UHVtcGtpbiwgYnV0IEkgaGF2ZSB0byBjaGVjayB0aGF0IGNhc2luZyB3b3JrcworICAgIH0KK30KKworaW1wbCBGdWxsTWVhbFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9mdWxsX21lYWwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PEZ1bGxNZWFsPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyBmdWxsIG1lYWwgY2FsbCIpOworICAgICAgICBPayhmdWxsX21lYWwoKSkKKyAgICB9Cit9CisKK2ltcGwgTWVhbFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9tZWFsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxNZWFsPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyBtZWFsIGNhbGwiKTsKKyAgICAgICAgT2sobWVhbCgpKQorICAgIH0KK30KKworaW1wbCBSYW1lblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9yYW1lbigmc2VsZiwgXzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxSYW1lbj4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgcmFtZW4gY2FsbCIpOworICAgICAgICBPayhyYW1lbigpKQorICAgIH0KK30KKworaW1wbCBOYXBraW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbmFwa2luKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxOYXBraW4+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIG5hcGtpbiBjYWxsIik7CisgICAgICAgIE9rKG5hcGtpbigpKQorICAgIH0KK30KKworZm4gZnVsbF9tZWFsKCkgLT4gRnVsbE1lYWwgeworICAgIEZ1bGxNZWFsOjpuZXcobWVhbCgpLCBEZXNzZXJ0OjpQb3J0KCJHcmFoYW0ncyBUYXdueSIudG9fb3duZWQoKSkpCit9CisKK2ZuIG1lYWwoKSAtPiBNZWFsIHsKKyAgICBNZWFsOjpuZXcobm9vZGxlKCksIHJhbWVuKCkpCit9CisKK2ZuIG5vb2RsZSgpIC0+IE5vb2RsZSB7CisgICAgTm9vZGxlOjpuZXcoInNwZWx0Ii50b19vd25lZCgpLCAxMDApCit9CisKK2ZuIHJhbWVuKCkgLT4gUmFtZW4geworICAgIFJhbWVuOjpuZXcoIk1yIFJhbWVuIi50b19vd25lZCgpLCA3MiwgQnJvdGhUeXBlOjpNaXNvKQorfQorCitmbiBuYXBraW4oKSAtPiBOYXBraW4geworICAgIE5hcGtpbiB7fQorfQorCitmbiBydW5fcmVjdXJzaXZlX3NlcnZlcjxSVEYsIElQRiwgV1RGLCBPUEY+KAorICAgIGxpc3Rlbl9hZGRyZXNzOiAmc3RyLAorICAgIHJfdHJhbnNwb3J0X2ZhY3Rvcnk6IFJURiwKKyAgICBpX3Byb3RvY29sX2ZhY3Rvcnk6IElQRiwKKyAgICB3X3RyYW5zcG9ydF9mYWN0b3J5OiBXVEYsCisgICAgb19wcm90b2NvbF9mYWN0b3J5OiBPUEYsCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPgord2hlcmUKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICBsZXQgcHJvY2Vzc29yID0gcmVjdXJzaXZlOjpUZXN0U2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhSZWN1cnNpdmVUZXN0U2VydmVySGFuZGxlciB7fSk7CisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4obGlzdGVuX2FkZHJlc3MpCit9CisKK3N0cnVjdCBSZWN1cnNpdmVUZXN0U2VydmVySGFuZGxlcjsKK2ltcGwgcmVjdXJzaXZlOjpUZXN0U2VydmljZVN5bmNIYW5kbGVyIGZvciBSZWN1cnNpdmVUZXN0U2VydmVySGFuZGxlciB7CisgICAgZm4gaGFuZGxlX2VjaG9fdHJlZSgmc2VsZiwgdHJlZTogcmVjdXJzaXZlOjpSZWNUcmVlKSAtPiB0aHJpZnQ6OlJlc3VsdDxyZWN1cnNpdmU6OlJlY1RyZWU+IHsKKyAgICAgICAgcHJpbnRsbiEoIns6P30iLCB0cmVlKTsKKyAgICAgICAgT2sodHJlZSkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfZWNob19saXN0KCZzZWxmLCBsc3Q6IHJlY3Vyc2l2ZTo6UmVjTGlzdCkgLT4gdGhyaWZ0OjpSZXN1bHQ8cmVjdXJzaXZlOjpSZWNMaXN0PiB7CisgICAgICAgIHByaW50bG4hKCJ7Oj99IiwgbHN0KTsKKyAgICAgICAgT2sobHN0KQorICAgIH0KKworICAgIGZuIGhhbmRsZV9lY2hvX2NvX3JlYygmc2VsZiwgaXRlbTogcmVjdXJzaXZlOjpDb1JlYykgLT4gdGhyaWZ0OjpSZXN1bHQ8cmVjdXJzaXZlOjpDb1JlYz4geworICAgICAgICBwcmludGxuISgiezo/fSIsIGl0ZW0pOworICAgICAgICBPayhpdGVtKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3NyYy9saWIucnMgYi9saWIvcnMvdGVzdC9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTE3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9zcmMvbGliLnJzCkBAIC0wLDAgKzEsNTcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCitwdWIgbW9kIGJhc2Vfb25lOworcHViIG1vZCBiYXNlX3R3bzsKK3B1YiBtb2QgbWlkbGF5ZXI7CitwdWIgbW9kIHVsdGltYXRlOworcHViIG1vZCByZWN1cnNpdmU7CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBzdGQ6OmRlZmF1bHQ6OkRlZmF1bHQ7CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9iZV9hYmxlX3RvX3VzZV9jb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbDo6bmV3KFNvbWUoYmFzZV9vbmU6Ok5vb2RsZTo6ZGVmYXVsdCgpKSwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfY29uc3RydWN0b3Jfd2l0aF9ub19maWVsZHMoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWw6Om5ldyhOb25lLCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9iZV9hYmxlX3RvX3VzZV9jb25zdHJ1Y3Rvcl93aXRob3V0X29wdGlvbl93cmFwKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsOjpuZXcoYmFzZV9vbmU6Ok5vb2RsZTo6ZGVmYXVsdCgpLCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9iZV9hYmxlX3RvX3VzZV9kZWZhdWx0cygpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbCB7CisgICAgICAgICAgICBub29kbGU6IFNvbWUoYmFzZV9vbmU6Ok5vb2RsZTo6ZGVmYXVsdCgpKSwKKyAgICAgICAgICAgIC4uRGVmYXVsdDo6ZGVmYXVsdCgpCisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfT25lLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWZhNmMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordHlwZWRlZiBpNjQgVGVtcGVyYXR1cmUKKwordHlwZWRlZiBpOCBTaXplCisKK3R5cGVkZWYgc3RyaW5nIExvY2F0aW9uCisKK2NvbnN0IGkzMiBCb2lsaW5nUG9pbnQgPSAxMDAKKworY29uc3QgbGlzdDxUZW1wZXJhdHVyZT4gVGVtcGVyYXR1cmVzID0gWzEwLCAxMSwgMjIsIDMzXQorCisvLyBJTVBPUlRBTlQ6IHRlbXBzIHNob3VsZCBlbmQgd2l0aCAiLjAiIGJlY2F1c2UgdGhpcyB0ZXN0cworLy8gdGhhdCB3ZSBkb24ndCBoYXZlIGEgcHJvYmxlbSB3aXRoIGNvbnN0IGZsb2F0IGxpc3QgZ2VuZXJhdGlvbgorY29uc3QgbGlzdDxkb3VibGU+IENvbW1vblRlbXBlcmF0dXJlcyA9IFszMDAuMCwgNDUwLjBdCisKK2NvbnN0IGRvdWJsZSBNZWFsc1BlckRheSA9IDIuNTsKKworY29uc3Qgc3RyaW5nIERlZmF1bHRSZWNpcGVOYW1lID0gIlNvdXAtcmlzZSBvZiB0aGUgRGF5IgorY29uc3QgYmluYXJ5IERlZmF1bHRSZWNpcGVCaW5hcnkgPSAiU291cC1yaXNlIG9mIHRoZSAwMTAxMDEwMSIKKworc3RydWN0IE5vb2RsZSB7CisgIDE6IHN0cmluZyBmbG91clR5cGUKKyAgMjogVGVtcGVyYXR1cmUgY29va1RlbXAKK30KKworc3RydWN0IFNwYWdoZXR0aSB7CisgIDE6IG9wdGlvbmFsIGxpc3Q8Tm9vZGxlPiBub29kbGVzCit9CisKK2NvbnN0IE5vb2RsZSBTcGVsdE5vb2RsZSA9IHsgImZsb3VyVHlwZSI6ICJzcGVsdCIsICJjb29rVGVtcCI6IDExMCB9CisKK3N0cnVjdCBNZWFzdXJpbmdTcG9vbiB7CisgIDE6IFNpemUgc2l6ZQorfQorCitzdHJ1Y3QgTWVhc3VyaW5nQ3VwIHsKKyAgMTogZG91YmxlIG1pbGxpcworfQorCit1bmlvbiBNZWFzdXJpbmdBaWRzIHsKKyAgMTogTWVhc3VyaW5nU3Bvb24gc3Bvb24KKyAgMjogTWVhc3VyaW5nQ3VwIGN1cAorfQorCitzdHJ1Y3QgQ29va2luZ1RlbXBlcmF0dXJlcyB7CisgIDE6IHNldDxkb3VibGU+IGNvbW1vblRlbXBlcmF0dXJlcworICAyOiBsaXN0PGRvdWJsZT4gdXNlZFRlbXBlcmF0dXJlcworICAzOiBtYXA8ZG91YmxlLCBkb3VibGU+IGZhaHJlbmhlaXRUb0NlbnRpZ3JhZGVDb252ZXJzaW9ucworfQorCitzdHJ1Y3QgUmVjaXBlIHsKKyAgMTogc3RyaW5nIHJlY2lwZU5hbWUKKyAgMjogc3RyaW5nIGN1aXNpbmUKKyAgMzogaTggcGFnZQorfQorCit1bmlvbiBDb29raW5nVG9vbHMgeworICAxOiBzZXQ8TWVhc3VyaW5nU3Bvb24+IG1lYXN1cmluZ1Nwb29ucworICAyOiBtYXA8U2l6ZSwgTG9jYXRpb24+IG1lYXN1cmluZ0N1cHMsCisgIDM6IGxpc3Q8UmVjaXBlPiByZWNpcGVzCit9CisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9Ud28udGhyaWZ0IGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhNmFjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9Ud28udGhyaWZ0CkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK2NvbnN0IGkzMiBXYXRlcldlaWdodCA9IDIwMAorCitlbnVtIGJyb3RoVHlwZSB7CisgIE1pc28sCisgIHNob3V5dSwKK30KKworc3RydWN0IFJhbWVuIHsKKyAgMTogb3B0aW9uYWwgc3RyaW5nIHJhbWVuVHlwZQorICAyOiByZXF1aXJlZCBpMzIgbm9vZGxlQ291bnQKKyAgMzogYnJvdGhUeXBlIGJyb3RoCit9CisKK3N0cnVjdCBOYXBraW4geworICAvLyBlbXB0eQorfQorCitzZXJ2aWNlIE5hcGtpblNlcnZpY2UgeworICBOYXBraW4gbmFwa2luKCkKK30KKworc2VydmljZSBSYW1lblNlcnZpY2UgZXh0ZW5kcyBOYXBraW5TZXJ2aWNlIHsKKyAgUmFtZW4gcmFtZW4oMTogaTMyIHJlcXVlc3RlZE5vb2RsZUNvdW50KQorfQorCisvKiBjb25zdCBzdHJ1Y3QgQ29va2VkUmFtZW4gPSB7ICJiYXIiOiAxMCB9ICovCisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3RocmlmdHMvTWlkbGF5ZXIudGhyaWZ0IGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9NaWRsYXllci50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmZjQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3RocmlmdHMvTWlkbGF5ZXIudGhyaWZ0CkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK2luY2x1ZGUgIkJhc2VfT25lLnRocmlmdCIKK2luY2x1ZGUgIkJhc2VfVHdvLnRocmlmdCIKKworY29uc3QgaTMyIFdhdGVyQm9pbGluZ1BvaW50ID0gQmFzZV9PbmUuQm9pbGluZ1BvaW50CisKK2NvbnN0IG1hcDxzdHJpbmcsIEJhc2VfT25lLlRlbXBlcmF0dXJlPiBUZW1wZXJhdHVyZU5hbWVzID0geyAiZnJlZXppbmciOiAwLCAiYm9pbGluZyI6IDEwMCB9CisKK2NvbnN0IG1hcDxzZXQ8aTMyPiwgbWFwPGxpc3Q8c3RyaW5nPiwgc3RyaW5nPj4gTXlDb25zdE5lc3RlZE1hcCA9IHsKKyAgWzAsIDEsIDIsIDNdOiB7IFsiZm9vIl06ICJiYXIiIH0sCisgIFsyMF06IHsgWyJudXQiLCAidG9uIl0gOiAiYmFyIiB9LAorICBbMzAsIDQwXTogeyBbImJvdW5jeSIsICJ0aW5rbHkiXTogImNhc3RsZSIgfQorfQorCitjb25zdCBsaXN0PGxpc3Q8aTMyPj4gTXlDb25zdE5lc3RlZExpc3QgPSBbCisgIFswLCAxLCAyXSwKKyAgWzMsIDQsIDVdLAorICBbNiwgNywgOF0KK10KKworY29uc3Qgc2V0PHNldDxpMzI+PiBNeUNvbnN0TmVzdGVkU2V0ID0gWworICBbMCwgMSwgMl0sCisgIFszLCA0LCA1XSwKKyAgWzYsIDcsIDhdCitdCisKK2VudW0gUGllIHsKKyAgUFVNUEtJTiwKKyAgYXBwbGUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIFNUUkFXQkVSUllfUkhVQkFSQiwKKyAgS2V5X0xpbWUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIGNvY29udXRfQ3JlYW0sIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIG1pc3Npc3NpcHBpX211ZCwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKK30KKworc3RydWN0IE1lYWwgeworICAxOiBCYXNlX09uZS5Ob29kbGUgbm9vZGxlCisgIDI6IEJhc2VfVHdvLlJhbWVuIHJhbWVuCit9CisKK3VuaW9uIERlc3NlcnQgIHsKKyAgMTogc3RyaW5nIHBvcnQKKyAgMjogc3RyaW5nIGljZVdpbmUKK30KKworc2VydmljZSBNZWFsU2VydmljZSBleHRlbmRzIEJhc2VfVHdvLlJhbWVuU2VydmljZSB7CisgIE1lYWwgbWVhbCgpCit9CisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3RocmlmdHMvVWx0aW1hdGUudGhyaWZ0IGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmYTEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3RocmlmdHMvVWx0aW1hdGUudGhyaWZ0CkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK2luY2x1ZGUgIk1pZGxheWVyLnRocmlmdCIKKworZW51bSBEcmluayB7CisgIFdBVEVSLAorICBXSElTS0VZLAorICBXSU5FLAorICBzY290Y2gsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIExBVEVfSEFSVkVTVF9XSU5FLAorICBJbmRpYV9QYWxlX0FsZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgYXBwbGVfY2lkZXIsIC8vIGludGVudGlhbGx5IHBvb3JseSBjYXNlZAorICBiZWxnaWFuX0FsZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgQ2FuYWRpYW5fd2hpc2t5LCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorfQorCitjb25zdCBtYXA8aTgsIE1pZGxheWVyLlBpZT4gUmFua2VkUGllcyA9IHsKKyAgMTogTWlkbGF5ZXIuUGllLlBVTVBLSU4sCisgIDI6IE1pZGxheWVyLlBpZS5TVFJBV0JFUlJZX1JIVUJBUkIsCisgIDM6IE1pZGxheWVyLlBpZS5hcHBsZSwKKyAgNDogTWlkbGF5ZXIuUGllLm1pc3Npc3NpcHBpX211ZCwKKyAgNTogTWlkbGF5ZXIuUGllLmNvY29udXRfQ3JlYW0sCisgIDY6IE1pZGxheWVyLlBpZS5LZXlfTGltZSwKK30KKworc3RydWN0IEZ1bGxNZWFsIHsKKyAgMTogcmVxdWlyZWQgTWlkbGF5ZXIuTWVhbCBtZWFsCisgIDI6IHJlcXVpcmVkIE1pZGxheWVyLkRlc3NlcnQgZGVzc2VydAorfQorCitzdHJ1Y3QgRnVsbE1lYWxBbmREcmlua3MgeworICAxOiByZXF1aXJlZCBGdWxsTWVhbCBmdWxsTWVhbAorICAyOiBvcHRpb25hbCBEcmluayBkcmluaworfQorCitzZXJ2aWNlIEZ1bGxNZWFsU2VydmljZSBleHRlbmRzIE1pZGxheWVyLk1lYWxTZXJ2aWNlIHsKKyAgRnVsbE1lYWwgZnVsbE1lYWwoKQorfQorCitzZXJ2aWNlIEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZSBleHRlbmRzIEZ1bGxNZWFsU2VydmljZSB7CisgIEZ1bGxNZWFsQW5kRHJpbmtzIGZ1bGxNZWFsQW5kRHJpbmtzKCkKKworICBNaWRsYXllci5QaWUgYmVzdFBpZSgpCit9CisKZGlmZiAtLWdpdCBhL2xpYi9zdC9SRUFETUUgYi9saWIvc3QvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvc3QvUkVBRE1FCnJlbmFtZSB0byBsaWIvc3QvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvc3QvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9zdC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3QvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9zdC9wYWNrYWdlLnhtbCBiL2xpYi9zdC9wYWNrYWdlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODM5MzZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N0L3BhY2thZ2UueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzwhLS0gQXBhY2hlIFRocmlmdCBTbWFsbHRhbGsgbGlicmFyeSB2ZXJzaW9uIDEuMC4wIC0tPgorPHBhY2thZ2U+CisgIDxuYW1lPmxpYnRocmlmdC1zdDwvbmFtZT4KKyAgPGZpbGU+dGhyaWZ0LnN0PC9maWxlPgorICA8ZmlsZWluPnRocmlmdC5zdDwvZmlsZWluPgorPC9wYWNrYWdlPgorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvTWFrZWZpbGUuYW0gYi9saWIvc3dpZnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4OGIwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4KKworYWxsLWxvY2FsOgorCXN3aWZ0IGJ1aWxkIC0tY29uZmlndXJhdGlvbiByZWxlYXNlCisKK2luc3RhbGwtZXhlYy1ob29rOgorCXN3aWZ0IGluc3RhbGwKKworY2xlYW4tbG9jYWw6CisJc3dpZnQgcGFja2FnZSBjbGVhbgorCXJtIC1yZiAuYnVpbGQKKworcHJlY3Jvc3M6CisJc3dpZnQKKworY2hlY2stbG9jYWw6CisJc3dpZnQgdGVzdAorCitFWFRSQV9ESVNUID0gXAorCVBhY2thZ2Uuc3dpZnQgXAorCVNvdXJjZXMgXAorCVRlc3RzIFwKKwlSRUFETUUubWQKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBcCisJTWFrZWZpbGUgXAorCU1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvUGFja2FnZS5zd2lmdCBiL2xpYi9zd2lmdC9QYWNrYWdlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzNmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvUGFja2FnZS5zd2lmdApAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBQYWNrYWdlRGVzY3JpcHRpb24KKworbGV0IHBhY2thZ2UgPSBQYWNrYWdlKAorCW5hbWU6ICJUaHJpZnQiCispCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvUkVBRE1FLm1kIGIvbGliL3N3aWZ0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjEwOTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1JFQURNRS5tZApAQCAtMCwwICsxLDIxNSBAQAorVGhyaWZ0IFN3aWZ0IExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGljZW5zZQorLS0tLS0tLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKworIyMgQnVpbGQKKyAgICBzd2lmdCBidWlsZAorCisjIyBUZXN0CisgICAgc3dpZnQgdGVzdAorCisjIyBJbnN0YWxsIExpYnJhcnkKKyMjIyMjIENvY29hcG9kcworQWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBwb2RmaWxlCitgYGBydWJ5CisgICAgcG9kICdUaHJpZnQtc3dpZnQzJywgOmdpdCA9PiAnZ2l0QGdpdGh1Yi5jb206YXBhY2hlL3RocmlmdC5naXQnLCA6YnJhbmNoID0+ICdtYXN0ZXInCitgYGAKKworIyMjIyMgU1BNCitVbmZvcnR1bmF0ZWx5IGR1ZSB0byBzb21lIGxpbWl0YXRpb25zIGluIFNQTSwgdGhlIFBhY2thZ2UgbWFuaWZlc3QgYW5kIFNvdXJjZXMgZGlyZWN0b3J5IG11c3QgYmUgYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuCitUbyBnZXQgYXJvdW5kIHRoYXQgZm9yIHRoZSB0aW1lIGJlaW5nLCB5b3UgY2FuIHVzZSB0aGlzIG1pcnJvcmVkIHJlcG8uCitBZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIFBhY2thZ2Uuc3dpZnQKK2BgYHN3aWZ0CitkZXBlbmRlbmNpZXM6IFsKKyAgICAuUGFja2FnZSh1cmw6ICJodHRwczovL2dpdGh1Yi5jb20vYXBvY29saXBzZS9UaHJpZnQtU3dpZnQuZ2l0IiwgbWFqb3JWZXJzaW9uOiAxKQorXQorYGBgCisKKyMjIFRocmlmdCBDb21waWxlcgorCitZb3UgY2FuIGNvbXBpbGUgSURMIHNvdXJjZXMgZm9yIFN3aWZ0IDMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgICB0aHJpZnQgLS1nZW4gc3dpZnQgdGhyaWZ0X2ZpbGUKKworIyMgQ2xpZW50IEV4YW1wbGUKK2BgYHN3aWZ0CitsZXQgdHJhbnNwb3J0ID0gVFNvY2tldFRyYW5zcG9ydChob3N0bmFtZTogImxvY2FsaG9zdCIsIHBvcnQ6IDkwOTApIQorCisvLyAgdmFyIHByb3RvID0gVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQ6IHRyYW5zcG9ydCkKK2xldCBwcm90byA9IFRCaW5hcnlQcm90b2NvbChvbjogdHJhbnNwb3J0KQorLy8gIHZhciBjbGllbnQgPSBIZXJtZXNDbGllbnQoaW5vdXRQcm90b2NvbDogcHJvdG8pCitsZXQgY2xpZW50ID0gVGhyaWZ0VGVzdENsaWVudChpbm91dFByb3RvY29sOiBwcm90bykKK2RvIHsKKyAgICB0cnkgY2xpZW50LnRlc3RWb2lkKCkKK30gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICBwcmludCgiXChlcnJvcikiKQorfQorYGBgCisKKyMjIExpYnJhcnkgTm90ZXMKKy0gRWxpbWluYXRlZCBQcm90b2NvbCBGYWN0b3JpZXMsIFRoZXkgd2VyZSBvbmx5IHVzZWQgaW4gYXN5bmMgY2xpZW50cyBhbmQgc2VydmVyIGltcGxlbWVudGF0aW9ucywgd2hlcmUgR2VuZXJpY3MgcHJvdmlkZSBhIGJldHRlciBhbHRlcm5hdGl2ZS4KKy0gU3dpZnR5IEVycm9ycywgQWxsIGBURXJyb3JgIHR5cGVzIGhhdmUgYSBuZXN0ZWQgYEVycm9yQ29kZWAgRW51bSBhcyB3ZWxsIGFzIHNvbWUgZXh0cmEgZmxhdm9yIHdoZXJlIG5lZWRlZC4KKy0gVmFsdWUgdHlwZWQgZXZlcnl0aGluZy4gIGBUVHJhbnNwb3J0YCBvcGVyYXRlcyBvbiB2YWx1ZSB0eXBlZCBgRGF0YWAgcmF0aGVyIHRoYW4gcmVmZXJlbmNlIHR5cGVkIGBOU0RhdGFgIG9yIGBVbnNhZmVCdWZmZXJQb2ludGVyYHMKKy0gU3dpZnQgMyBOYW1lZCBwcm90b2NvbHMuICBTd2lmdCAzIG5hbWluZyBjb252ZW50aW9ucyBzdWdnZXN0IHRoZSBlbGltaW5hdGlvbiBvZiByZWR1bmRhbnQgd29yZHMgdGhhdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSB2YXJpYWJsZS9mdW5jdGlvbiBzaWduYXR1cmVzLiAgVGhpcyByZW5hbWluZyBpcyBhcHBsaWVkIHRocm91Z2hvdXQgdGhlIFN3aWZ0IDMgbGlicmFyeSBjb252ZXJ0aW5nIG1vc3QgbmFtaW5nIGNvbnZlbnRpb25zIHVzZWQgaW4gdGhlIFN3aWZ0Mi9Db2NvYSBsaWJyYXJ5IHRvIFN3aWZ0IDMtZXNxdWUgbmFtaW5nIGNvbnZlbnRpb25zLiBlZy4KK2BgYHN3aWZ0CitmdW5jIHJlYWRTdHJpbmcoKSB0aHJvd3MgLT4gU3RyaW5nCitmdW5jIHdyaXRlU3RyaW5nKF8gdmFsOiBTdHJpbmcpIHRocm93cworYGBgCitoYXZlIGJlZW4gcmVuYW1lZCB0byBlbGltaW5hdGUgcmVkdW5kYW50IHdvcmRzOgorYGBgc3dpZnQKK2Z1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcKK2Z1bmMgd3JpdGUoXyB2YWw6IFN0cmluZykgdGhyb3dzCitgYGAKKworLSBFbGltaW5hdGVkIGBUSFRUUFRyYW5zcG9ydGAgdGhhdCB1c2VzIGBOU1VSTENvbm5lY3Rpb25gIGR1ZSB0byBpdCBiZWluZyBkZXByZWNhdGVkIGFuZCBub3QgYXZhaWxhYmxlIGF0IGFsbCBpbiBTd2lmdCAzIGZvciBMaW51eC4gIGBUSFRUUFNlc3Npb25UcmFuc3BvcnRgIGZyb20gdGhlIFN3aWZ0Mi9Db2NvYSBsaWJyYXJ5IHRoYXQgdXNlcyBgTlNVUkxTZXNzaW9uYCBoYXMgYmVlbiByZW5hbWVkIHRvIGBUSFRUUFRyYW5zcG9ydGAgZm9yIHRoaXMgbGlicmFyeSBhbmQgbGV2ZXJhZ2VzIGBVUkxTZXNzaW9uYCwgcHJvdmlkaW5nIGJvdGggc3luY2hyb25vdXMgKHdpdGggc2VtYXBob3JlcykgYW5kIGFzeW5jaHJvbm91cyBiZWhhdmlvci4KKy0gUHJvYmFibHkgc29tZSBNb3JlIHRoaW5ncyBJJ3ZlIG1pc3NlZCBoZXJlLgorCisjIyBHZW5lcmF0b3IgTm90ZXMKKyMjIyMgR2VuZXJhdG9yIEZsYWdzCit8IEZsYWcgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgfAorfCAtLS0tLS0tLS0tLS0tIHw6LS0tLS0tLS0tLS0tLTp8Cit8IGFzeW5jX2NsaWVudHMgfCBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgYmxvY2sgc3ludGF4LiBBc3luY2hyb25vdXMgY2xhc3NlcyBhcmUgYXBwZW5kZWQgd2l0aCBgX0FzeW5jYCB8Cit8IG5vX3N0cmljdCogICAgfCBHZW5lcmF0ZXMgbm9uLXN0cmljdCBzdHJ1Y3RzICAgICAgfAorfCBkZWJ1Z19kZXNjcmlwdGlvbnMgfCBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbiAgICAgIHwKK3wgbG9nX3VuZXhwZWN0ZWQgfCBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuIHwKK3wgc2FmZV9lbnVtcyAgICAgfCBHZW5lcmF0ZSBlbnVtIHR5cGVzIHdpdGggYW4gdW5rbm93biBjYXNlIHRvIGhhbmRsZSB1bnNwZWNpZmllZCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yICB8CisKKworCisqTW9zdCB0aHJpZnQgbGlicmFyaWVzIGFsbG93IGVtcHR5IGluaXRpYWxpemF0aW9uIG9mIFN0cnVjdHMsIGluaXRpYWxpemluZyBgcmVxdWlyZWRgIGZpZWxkcyB3aXRoIG5pbC9udWxsL05vbmUgKFB5dGhvbiBhbmQgTm9kZSBnZW5lcmF0b3JzKS4gIFN3aWZ0IG9uIHRoZSBvdGhlciBoYW5kIHJlcXVpcmVzIGluaXRpYWxpemVycyB0byBpbml0aWFsaXplIGFsbCBub24tT3B0aW9uYWwgZmllbGRzLCBhbmQgdGh1cyB0aGUgU3dpZnQgMyBnZW5lcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyAodW5saWtlIHRoZSBTd2lmdCAyL0NvY29hIGdlbmVyYXRvcikuICBJbiBvdGhlciBsYW5ndWFnZXMsIHRoaXMgYWxsb3dzIHRoZSBzZW5kaW5nIG9mIE5VTEwgdmFsdWVzIGluIGZpZWxkcyB0aGF0IGFyZSBtYXJrZWQgYHJlcXVpcmVkYCwgYW5kIHRodXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpbiBTd2lmdCBjbGllbnRzIGF0dGVtcHRpbmcgdG8gdmFsaWRhdGUgZmllbGRzLiAgVGhlIGBub19zdHJpY3RgIG9wdGlvbiBoZXJlIHdpbGwgaWdub3JlIHRoZSB2YWxpZGF0aW9uIGNoZWNrLCBhcyB3ZWxsIGFzIGJlaGF2ZSBzaW1pbGFyIHRvIHRoZSBTd2lmdDIvQ29jb2EgZ2VuZXJhdG9yIGFuZCBpbml0aWFsaXplIHJlcXVpcmVkIGZpZWxkcyB3aXRoIGVtcHR5IGluaXRpYWxpemVycyAod2hlcmUgcG9zc2libGUpLgorCisKKyMjIFdoYXRzIGltcGxlbWVudGVkCisjIyMjIExpYnJhcnkKKyMjIyMjIFRyYW5zcG9ydHMKKy0gW3hdIFRTb2NrZXRUcmFuc3BvcnQgLSBDRlNvY2tldCBhbmQgUG9zaXhTb2NrZXQgdmFyaWFudHMgYXZhaWxhYmxlLiBDRlNvY2tldCB2YXJpYW50IG9ubHkgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgRGFyd2luIHBsYXRmb3JtcworLSBbeF0gVEhUVFBUcmFuc3BvcnQgLSBDdXJyZW50bHkgb25seSBhdmFpbGFibGUgZm9yIERhcndpbiBwbGF0Zm9ybXMsIFN3aWZ0IEZvdW5kYXRpb24gVVJMU2Vzc2lvbiBpbXBsZW1lbnRhdGlvbiBuZWVkcyBjb21wbGV0aW9uIG9uIGxpbnV4LgorLSBbeF0gVFNvY2tldFNlcnZlciAtIFVzZXMgQ0ZTb2NrZXRzIG9ubHkgZm9yIGJpbmRpbmcsIHNob3VsZCBiZSB3b3JraW5nIG9uIGxpbnV4CistIFt4XSBURnJhbWVkVHJhbnNwb3J0CistIFt4XSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0CistIFt4XSBURmlsZVRyYW5zcG9ydCAtIEEgZmV3IHZhcmlhbnRzIHVzaW5nIEZpbGUgaGFuZGxlcyBhbmQgZmlsZSBkZXNjcmlwdG9ycy4KKy0gW3hdIFRTdHJlYW1UcmFuc3BvcnQgLSBGdWxseSBmdW5jdGlvbmFsIGluIERhcndpbiwgRm91bmRhdGlvbiBiYWNraW5nIG5vdCB5ZXQgY29tcGxldGVkIGluIExpbnV4IChUaGlzIGxpbWl0cyBUQ0ZTb2NrZXRUcmFuc3BvcnQgdG8gRGFyd2luKQorLSBbIF0gSFRUUFNlcnZlciAtIEN1cnJlbnRseSB0aGVyZSBpcyBubyBsaWdodHdlaWdodCAgSFRUUFNlcnZlciBpbXBsZW1lbnRhdGlvbiB0aGUgU3dpZnQgU3RhbmRhcmQgTGlicmFyeSwgc28gb3RoZXIgM3JkIHBhcnR5IGFsdGVybmF0aXZlcyBhcmUgcmVxdWlyZWQgYW5kIG91dCBvZiBzY29wZSBmb3IgdGhlIFRocmlmdCBsaWJyYXJ5LiAgRXhhbXBsZXMgdXNpbmcgUGVyZmVjdCB3aWxsIGJlIHByb3ZpZGVkLgorLSBbIF0gT3RoZXIgKGd6LCBldGMpCisKKyMjIyMjIFByb3RvY29scworLSBbeF0gVEJpbmFyeVByb3RvY29sCistIFt4XSBUQ29tcGFjdFByb3RvY29sCistIFsgXSBUSlNPTlByb3RvY29sIC0gVGhpcyB3aWxsIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQKKworIyMjIyMgR2VuZXJhdG9yCistIFt4XSBDb2RlIENvbXBsZXRlIEdlbmVyYXRvcgorLSBbeF0gQXN5bmMgY2xpZW50cworLSBbeF0gRG9jdW1lbnRhdGlvbiBHZW5lcmF0aW9uIC0gR2VuZXJhdG9yIHdpbGwgdHJhbnNwbGFudCBJREwgZG9jcyB0byBTd2lmdCBjb2RlIGZvciBlYXN5IGxvb2t1cCBpbiBYY29kZQorLSBbIF0gRGVmYXVsdCBWYWx1ZXMgLSBUT0RPCistIFsgXSBub19zdHJpY3QgbW9kZSAtIFRPRE8KKy0gWyBdIE5hbWVzcGFjaW5nIC0gU3RpbGwgaGF2ZW4ndCBuYWlsZWQgZG93biBhIGdvb2QgcGFyYWRpZ20gZm9yIG5hbWVzcGFjaW5nLiAgSXQgd2lsbCBsaWtlbHkgaW52b2x2ZSBjcmVhdGluZyBzdWJkaXJlY3RvcmllcyBmb3IgZGlmZmVyZW50IG5hbWVzcGFjZXMgYW5kIGV4cGVjdGluZyB0aGUgZGV2ZWxvcGVyIHRvIGltcG9ydCBlYWNoIHN1YmRpcmVjdG9yeSBhcyBzZXBhcmF0ZSBtb2R1bGVzLiAgSXQgY291bGQgZXh0ZW5kIHRvIGNyZWF0aW5nIFNQTSBQYWNrYWdlIG1hbmlmZXN0cyB3aXRoIHN1Yi1tb2R1bGVzIHdpdGhpbiB0aGUgZ2VuZXJhdGVkIG1vZHVsZQorCisKKworIyMgRXhhbXBsZSBIVFRQIFNlcnZlciB3aXRoIFBlcmZlY3QKK2BgYHN3aWZ0CitpbXBvcnQgUGVyZmVjdExpYgoraW1wb3J0IFBlcmZlY3RIVFRQCitpbXBvcnQgUGVyZmVjdEhUVFBTZXJ2ZXIKK2ltcG9ydCBEaXNwYXRjaAorCitsZXQgbG9nUXVldWUgPSBEaXNwYXRjaFF1ZXVlKGxhYmVsOiAibG9nIiwgcW9zOiAuYmFja2dyb3VuZCwgYXR0cmlidXRlczogLmNvbmN1cnJlbnQpCitsZXQgcFF1ZXVlID0gRGlzcGF0Y2hRdWV1ZShsYWJlbDogImxvZyIsIHFvczogLnVzZXJJbml0aWF0ZWQsIGF0dHJpYnV0ZXM6IC5jb25jdXJyZW50KQorCisKK2NsYXNzIFRQZXJmZWN0U2VydmVyPEluUHJvdG9jb2w6IFRQcm90b2NvbCwgT3V0UHJvdG9jb2w6IFRQcm90b2NvbD4geworCisgcHJpdmF0ZSB2YXIgc2VydmVyID0gSFRUUFNlcnZlcigpCisgcHJpdmF0ZSB2YXIgcHJvY2Vzc29yOiBUUHJvY2Vzc29yCisKKyBpbml0KGFkZHJlc3M6IFN0cmluZz8gPSBuaWwsCisgICAgICBwYXRoOiBTdHJpbmc/ID0gbmlsLAorICAgICAgcG9ydDogSW50LAorICAgICAgcHJvY2Vzc29yOiBUUHJvY2Vzc29yLAorICAgICAgaW5Qcm90b2NvbDogSW5Qcm90b2NvbC5UeXBlLAorICAgICAgb3V0UHJvdG9jb2w6IE91dFByb3RvY29sLlR5cGUpIHRocm93cyB7CisKKyAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCisKKyAgIGlmIGxldCBhZGRyZXNzID0gYWRkcmVzcyB7CisgICAgIHNlcnZlci5zZXJ2ZXJBZGRyZXNzID0gYWRkcmVzcworICAgfQorICAgc2VydmVyLnNlcnZlclBvcnQgPSBVSW50MTYocG9ydCkKKworICAgdmFyIHJvdXRlcyA9IFJvdXRlcygpCisgICB2YXIgdXJpID0gIi8iCisgICBpZiBsZXQgcGF0aCA9IHBhdGggeworICAgICB1cmkgKz0gcGF0aAorICAgfQorICAgcm91dGVzLmFkZChtZXRob2Q6IC5wb3N0LCB1cmk6IHVyaSkgeyByZXF1ZXN0LCByZXNwb25zZSBpbgorICAgICBwUXVldWUuYXN5bmMgeworICAgICAgIHJlc3BvbnNlLnNldEhlYWRlciguY29udGVudFR5cGUsIHZhbHVlOiAiYXBwbGljYXRpb24veC10aHJpZnQiKQorCisgICAgICAgbGV0IGl0cmFucyA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoKQorICAgICAgIGlmIGxldCBieXRlcyA9IHJlcXVlc3QucG9zdEJvZHlCeXRlcyB7CisgICAgICAgICBsZXQgZGF0YSA9IERhdGEoYnl0ZXM6IGJ5dGVzKQorICAgICAgICAgaXRyYW5zLnJlc2V0KHJlYWRCdWZmZXI6IGRhdGEpCisgICAgICAgfQorCisgICAgICAgbGV0IG90cmFucyA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoZmx1c2hIYW5kbGVyOiB7IHRyYW5zLCBidWZmIGluCisgICAgICAgICBsZXQgYXJyYXkgPSBidWZmLndpdGhVbnNhZmVCeXRlcyB7CisgICAgICAgICAgIEFycmF5PFVJbnQ4PihVbnNhZmVCdWZmZXJQb2ludGVyKHN0YXJ0OiAkMCwgY291bnQ6IGJ1ZmYuY291bnQpKQorICAgICAgICAgfQorICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gLm9rCisgICAgICAgICByZXNwb25zZS5zZXRCb2R5KGJ5dGVzOiBhcnJheSkKKyAgICAgICAgIHJlc3BvbnNlLmNvbXBsZXRlZCgpCisgICAgICAgfSkKKworICAgICAgIGxldCBpbnByb3RvID0gSW5Qcm90b2NvbChvbjogaXRyYW5zKQorICAgICAgIGxldCBvdXRwcm90byA9IE91dFByb3RvY29sKG9uOiBvdHJhbnMpCisKKyAgICAgICBkbyB7CisgICAgICAgICB0cnkgcHJvY2Vzc29yLnByb2Nlc3Mob246IGlucHJvdG8sIG91dFByb3RvY29sOiBvdXRwcm90bykKKyAgICAgICAgIHRyeSBvdHJhbnMuZmx1c2goKQorICAgICAgIH0gY2F0Y2ggeworICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gLmJhZFJlcXVlc3QKKyAgICAgICAgIHJlc3BvbnNlLmNvbXBsZXRlZCgpCisgICAgICAgfQorICAgICB9CisgICB9CisgICBzZXJ2ZXIuYWRkUm91dGVzKHJvdXRlcykKKyB9CisKKyBmdW5jIHNlcnZlKCkgdGhyb3dzIHsKKyAgIHRyeSBzZXJ2ZXIuc3RhcnQoKQorIH0KK30KK2BgYAorCisjIyMjIEV4YW1wbGUgVXNhZ2UKK2BgYHN3aWZ0CitjbGFzcyBTZXJ2aWNlSGFuZGxlciA6IFNlcnZpY2UgeworICAgIC4uLgorfQorbGV0IHNlcnZlciA9IHRyeT8gVFBlcmZlY3RTZXJ2ZXIocG9ydDogOTA5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yOiBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2U6IFNlcnZpY2VIYW5kbGVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3RvY29sOiBUQmluYXJ5UHJvdG9jb2wuc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvdG9jb2w6IFRCaW5hcnlQcm90b2NvbC5zZWxmKQorCit0cnk/IHNlcnZlcj8uc2VydmUoKQorYGBgCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9MaW51eEhlbHBlci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL0xpbnV4SGVscGVyLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDkyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9MaW51eEhlbHBlci5zd2lmdApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCisjaWYgb3MoTGludXgpCisvLy8gRXh0ZW5zaW9ucyBmb3IgTGludXggZm9yIGluY29tcGxldGUgRm91bmRhdGlvbiBBUEkncy4KKy8vLyBzd2lmdC1jb3JlbGlicy1mb3VuZGF0aW9uIGlzIG5vdCB5ZXQgMToxIHdpdGggT1NYL2lPUyBGb3VuZGF0aW9uCisKK2V4dGVuc2lvbiBDRlNvY2tldEVycm9yIHsKKyAgcHVibGljIHN0YXRpYyBsZXQgc3VjY2VzcyA9IGtDRlNvY2tldFN1Y2Nlc3MKK30KKyAgCitleHRlbnNpb24gVUludCB7CisgIHB1YmxpYyBzdGF0aWMgZnVuYyAmKGxoczogVUludCwgcmhzOiBJbnQpIC0+IFVJbnQgeworICAgIGxldCBjYXN0ID0gdW5zYWZlQml0Q2FzdChyaHMsIHRvOiBVSW50LnNlbGYpCisgICAgcmV0dXJuIGxocyAmIGNhc3QKKyAgfQorfQorCisjZWxzZQorZXh0ZW5zaW9uIENGU3RyZWFtUHJvcGVydHlLZXkgeworICBzdGF0aWMgbGV0IHNob3VsZENsb3NlTmF0aXZlU29ja2V0ICA9IENGU3RyZWFtUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCkKKyAgLy8gRXhpc3RzIGFzIFN0cmVhbS5Qcm9wZXJ0eUtleS5zb2NrZXRTZWN1cml0eWxldmVsS2V5IGJ1dCBkb2Vzbid0IHdvcmsgd2l0aCBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eQorICBzdGF0aWMgbGV0IHNvY2tldFNlY3VyaXR5TGV2ZWwgICAgICA9IENGU3RyZWFtUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTb2NrZXRTZWN1cml0eUxldmVsKQorICBzdGF0aWMgbGV0IFNTTFNldHRpbmdzICAgICAgICAgICAgICA9IENGU3RyZWFtUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncykKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEFwcGxpY2F0aW9uRXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQXBwbGljYXRpb25FcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzM5Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEFwcGxpY2F0aW9uRXJyb3Iuc3dpZnQKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcHVibGljIHN0cnVjdCBUQXBwbGljYXRpb25FcnJvciA6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIENvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIHVua25vd25NZXRob2QobWV0aG9kTmFtZTogU3RyaW5nPykKKyAgICBjYXNlIGludmFsaWRNZXNzYWdlVHlwZQorICAgIGNhc2Ugd3JvbmdNZXRob2ROYW1lKG1ldGhvZE5hbWU6IFN0cmluZz8pCisgICAgY2FzZSBiYWRTZXF1ZW5jZUlkCisgICAgY2FzZSBtaXNzaW5nUmVzdWx0KG1ldGhvZE5hbWU6IFN0cmluZz8pCisgICAgY2FzZSBpbnRlcm5hbEVycm9yCisgICAgY2FzZSBwcm90b2NvbEVycm9yCisgICAgY2FzZSBpbnZhbGlkVHJhbnNmb3JtCisgICAgY2FzZSBpbnZhbGlkUHJvdG9jb2wKKyAgICBjYXNlIHVuc3VwcG9ydGVkQ2xpZW50VHlwZQorICAgIAorICAgIAorICAgIC8vLyBJbml0aWFsaXplIGEgVEFwcGxpY2F0aW9uRXJyb3Igd2l0aCBhIFRocmlmdCBlcnJvciBjb2RlCisgICAgLy8vIE5vcm1hbGx5IHRoaXMgd291bGQgYmUgYWNoaWV2ZWQgd2l0aCBSYXdSZXByZXNlbnRhYmxlIGhvd2V2ZXIKKyAgICAvLy8gYnkgZG9pbmcgdGhpcyB3ZSBjYW4gYWxsb3cgZm9yIGFzc29jaWF0ZWQgcHJvcGVydGllcyBvbiBlbnVtIGNhc2VzIGZvcgorICAgIC8vLyBjYXNlIHNwZWNpZmljIGNvbnRleHQgZGF0YSBpbiBhIFN3aWZ0eSwgdHlwZS1zYWZlIG1hbm5lci4KKyAgICAvLy8KKyAgICAvLy8gLSBwYXJhbWV0ZXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnRlZ2VyIFRBcHBsaWNhdGlvbkVycm9yKGV4Y2VwdGlvbikgZXJyb3IgY29kZS4gIAorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gMCAoLnVua25vd24pCisgICAgcHVibGljIGluaXQodGhyaWZ0RXJyb3JDb2RlOiBJbnQpIHsKKyAgICAgIHN3aXRjaCB0aHJpZnRFcnJvckNvZGUgeworICAgICAgY2FzZSAxOiAgc2VsZiA9IC51bmtub3duTWV0aG9kKG1ldGhvZE5hbWU6IG5pbCkKKyAgICAgIGNhc2UgMjogIHNlbGYgPSAuaW52YWxpZE1lc3NhZ2VUeXBlCisgICAgICBjYXNlIDM6ICBzZWxmID0gLndyb25nTWV0aG9kTmFtZShtZXRob2ROYW1lOiBuaWwpCisgICAgICBjYXNlIDQ6ICBzZWxmID0gLmJhZFNlcXVlbmNlSWQKKyAgICAgIGNhc2UgNTogIHNlbGYgPSAubWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBuaWwpCisgICAgICBjYXNlIDY6ICBzZWxmID0gLmludGVybmFsRXJyb3IKKyAgICAgIGNhc2UgNzogIHNlbGYgPSAucHJvdG9jb2xFcnJvcgorICAgICAgY2FzZSA4OiAgc2VsZiA9IC5pbnZhbGlkUHJvdG9jb2wKKyAgICAgIGNhc2UgOTogIHNlbGYgPSAuaW52YWxpZFRyYW5zZm9ybQorICAgICAgY2FzZSAxMDogc2VsZiA9IC51bnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAgIGRlZmF1bHQ6IHNlbGYgPSAudW5rbm93bgorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC51bmtub3duTWV0aG9kOiAgICAgICAgICByZXR1cm4gMQorICAgICAgY2FzZSAuaW52YWxpZE1lc3NhZ2VUeXBlOiAgICAgcmV0dXJuIDIKKyAgICAgIGNhc2UgLndyb25nTWV0aG9kTmFtZTogICAgICAgIHJldHVybiAzCisgICAgICBjYXNlIC5iYWRTZXF1ZW5jZUlkOiAgICAgICAgICByZXR1cm4gNAorICAgICAgY2FzZSAubWlzc2luZ1Jlc3VsdDogICAgICAgICAgcmV0dXJuIDUKKyAgICAgIGNhc2UgLmludGVybmFsRXJyb3I6ICAgICAgICAgIHJldHVybiA2CisgICAgICBjYXNlIC5wcm90b2NvbEVycm9yOiAgICAgICAgICByZXR1cm4gNworICAgICAgY2FzZSAuaW52YWxpZFByb3RvY29sOiAgICAgICAgcmV0dXJuIDgKKyAgICAgIGNhc2UgLmludmFsaWRUcmFuc2Zvcm06ICAgICAgIHJldHVybiA5CisgICAgICBjYXNlIC51bnN1cHBvcnRlZENsaWVudFR5cGU6ICByZXR1cm4gMTAKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIC8vLyBPdXRwdXQgImZvciAjbWV0aG9kTmFtZSIgaWYgbWV0aG9kIGlzIG5vdCBuaWwgZWxzZSBlbXB0eQorICAgICAgbGV0IG1ldGhvZFVud3JhcDogKFN0cmluZz8pIC0+IFN0cmluZyA9ICB7IG1ldGhvZCBpbgorICAgICAgICByZXR1cm4gIlwobWV0aG9kID09IG5pbCA/ICIiIDogIiBmb3IgXChtZXRob2QgPz8gIiIpIikiCisgICAgICB9CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gVEFwcGxpY2F0aW9uRXJyb3IiCisgICAgICBjYXNlIC51bmtub3duTWV0aG9kKGxldCBtZXRob2QpOiAgICByZXR1cm4gIlVua25vd24gTWV0aG9kXChtZXRob2RVbndyYXAobWV0aG9kKSkiCisgICAgICBjYXNlIC5pbnZhbGlkTWVzc2FnZVR5cGU6ICAgICAgICAgICByZXR1cm4gIkludmFsaWQgTWVzc2FnZSBUeXBlIgorICAgICAgY2FzZSAud3JvbmdNZXRob2ROYW1lKGxldCBtZXRob2QpOiAgcmV0dXJuICJXcm9uZyBNZXRob2QgTmFtZVwobWV0aG9kVW53cmFwKG1ldGhvZCkpIgorICAgICAgY2FzZSAuYmFkU2VxdWVuY2VJZDogICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgU2VxdWVuY2UgSUQiCisgICAgICBjYXNlIC5taXNzaW5nUmVzdWx0KGxldCBtZXRob2QpOiAgICByZXR1cm4gIk1pc3NpbmcgUmVzdWx0XChtZXRob2RVbndyYXAobWV0aG9kKSkiCisgICAgICBjYXNlIC5pbnRlcm5hbEVycm9yOiAgICAgICAgICAgICAgICByZXR1cm4gIkludGVybmFsIEVycm9yIgorICAgICAgY2FzZSAucHJvdG9jb2xFcnJvcjogICAgICAgICAgICAgICAgcmV0dXJuICJQcm90b2NvbCBFcnJvciIKKyAgICAgIGNhc2UgLmludmFsaWRQcm90b2NvbDogICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBQcm90b2NvbCIKKyAgICAgIGNhc2UgLmludmFsaWRUcmFuc2Zvcm06ICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBUcmFuc2Zvcm0iCisgICAgICBjYXNlIC51bnN1cHBvcnRlZENsaWVudFR5cGU6ICAgICAgICByZXR1cm4gIlVuc3VwcG9ydGVkIENsaWVudCBUeXBlIgorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbml0KCkgeyB9CisgIAorICBwdWJsaWMgaW5pdCh0aHJpZnRFcnJvckNvZGUgY29kZTogSW50LCBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsKSB7CisgICAgc2VsZi5lcnJvciA9IENvZGUodGhyaWZ0RXJyb3JDb2RlOiBjb2RlKQorICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgfQorICAKKyAgcHVibGljIHZhciBlcnJvcjogQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogQ29kZSB7IHJldHVybiAudW5rbm93biB9Cit9CisKK2V4dGVuc2lvbiBUQXBwbGljYXRpb25FcnJvciA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RydWN0IH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRBcHBsaWNhdGlvbkVycm9yIHsKKyAgICB2YXIgZXJyb3JDb2RlOiBJbnQgPSAwCisgICAgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgICBfID0gdHJ5IHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgZmllbGRzOiB3aGlsZSB0cnVlIHsKKyAgICAgIGxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgICAKKyAgICAgIHN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSB7CisgICAgICBjYXNlIChfLCAuc3RvcCk6CisgICAgICAgIGJyZWFrIGZpZWxkcworICAgICAgY2FzZSAoMSwgLnN0cmluZyk6CisgICAgICAgIG1lc3NhZ2UgPSB0cnkgcHJvdG8ucmVhZCgpCisgICAgICBjYXNlICgyLCAuaTMyKToKKyAgICAgICAgZXJyb3JDb2RlID0gSW50KHRyeSBwcm90by5yZWFkKCkgYXMgSW50MzIpCisgICAgICAKKyAgICAgIGNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6CisgICAgICAgIHRyeSBwcm90by5za2lwKHR5cGU6IHVua25vd25UeXBlKQorICAgICAgfQorICAgICAgCisgICAgICB0cnkgcHJvdG8ucmVhZEZpZWxkRW5kKCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRTdHJ1Y3RFbmQoKQorICAgIHJldHVybiBUQXBwbGljYXRpb25FcnJvcih0aHJpZnRFcnJvckNvZGU6IGVycm9yQ29kZSwgbWVzc2FnZTogbWVzc2FnZSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0QmVnaW4obmFtZTogIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisgICAgCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRCZWdpbihuYW1lOiAibWVzc2FnZSIsIHR5cGU6IC5zdHJpbmcsIGZpZWxkSUQ6IDEpCisgICAgdHJ5IHByb3RvLndyaXRlKG1lc3NhZ2UgPz8gIiIpCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIAorICAgIHRyeSBwcm90by53cml0ZUZpZWxkQmVnaW4obmFtZTogInR5cGUiLCB0eXBlOiAuaTMyLCBmaWVsZElEOiAyKQorICAgIGxldCB2YWwgPSBJbnQzMihlcnJvci50aHJpZnRFcnJvckNvZGUpCisgICAgdHJ5IHByb3RvLndyaXRlKHZhbCkKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICB0cnkgcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZTogSW50IHsKKyAgICByZXR1cm4gZXJyb3IudGhyaWZ0RXJyb3JDb2RlICYrIChtZXNzYWdlPy5oYXNoVmFsdWUgPz8gMCkKKyAgfQorfQorCitwdWJsaWMgZnVuYyA9PShsaHM6IFRBcHBsaWNhdGlvbkVycm9yLCByaHM6IFRBcHBsaWNhdGlvbkVycm9yKSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5lcnJvci50aHJpZnRFcnJvckNvZGUgPT0gcmhzLmVycm9yLnRocmlmdEVycm9yQ29kZSAmJiBsaHMubWVzc2FnZSA9PSByaHMubWVzc2FnZQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeS5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnkuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlNTY0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnkuc3dpZnQKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitleHRlbnNpb24gRGF0YSA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RyaW5nIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IERhdGEgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpIGFzIERhdGEKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeVByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeVByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzI0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5UHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIHN0cnVjdCBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uIHsKKyAgc3RhdGljIGxldCB2ZXJzaW9uMSAgICA9IEludDMyKGJpdFBhdHRlcm46IDB4ODAwMTAwMDApCisgIHN0YXRpYyBsZXQgdmVyc2lvbk1hc2sgPSBJbnQzMihiaXRQYXR0ZXJuOiAweGZmZmYwMDAwKQorfQorCitwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sOiBUUHJvdG9jb2wgeworICBwdWJsaWMgdmFyIG1lc3NhZ2VTaXplTGltaXQ6IFVJbnQzMiAgPSAwCisgIAorICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydAorICAKKyAgLy8gY2xhc3MgbGV2ZWwgcHJvcGVydGllcyBmb3Igc2V0dGluZyBnbG9iYWwgY29uZmlnICh1c2VmdWwgZm9yIHNlcnZlciBpbiBsaWV1IG9mIEZhY3RvcnkgZGVzaWduKQorICBwdWJsaWMgc3RhdGljIHZhciBzdHJpY3RSZWFkOiBCb29sID0gZmFsc2UKKyAgcHVibGljIHN0YXRpYyB2YXIgc3RyaWN0V3JpdGU6IEJvb2wgPSB0cnVlCisKKyAgcHJpdmF0ZSB2YXIgc3RyaWN0UmVhZDogQm9vbAorICBwcml2YXRlIHZhciBzdHJpY3RXcml0ZTogQm9vbAorICAKKyAgdmFyIGN1cnJlbnRNZXNzYWdlTmFtZTogU3RyaW5nPworICB2YXIgY3VycmVudEZpZWxkTmFtZTogU3RyaW5nPworICAKKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KHRyYW5zcG9ydDogVFRyYW5zcG9ydCwgc3RyaWN0UmVhZDogQm9vbCwgc3RyaWN0V3JpdGU6IEJvb2wpIHsKKyAgICBzZWxmLmluaXQob246IHRyYW5zcG9ydCkKKyAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCisgICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgIH0KKyAgCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgc2VsZi5zdHJpY3RXcml0ZSA9IFRCaW5hcnlQcm90b2NvbC5zdHJpY3RXcml0ZQorICAgIHNlbGYuc3RyaWN0UmVhZCA9IFRCaW5hcnlQcm90b2NvbC5zdHJpY3RSZWFkCisgIH0KKyAgCisgIGZ1bmMgcmVhZFN0cmluZ0JvZHkoXyBzaXplOiBJbnQpIHRocm93cyAtPiBTdHJpbmcgeworICAgIAorICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIikpIHsKKyAgICAgIGRhdGEgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiBzaXplKQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gU3RyaW5nKGRhdGE6IGRhdGEsIGVuY29kaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkgPz8gIiIKKyAgfQorICAKKyAgLy8vIE1hcms6IC0gVFByb3RvY29sCisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgc2l6ZTogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgdmFyIG1lc3NhZ2VOYW1lID0gIiIKKyAgICB2YXIgdHlwZSA9IFRNZXNzYWdlVHlwZS5leGNlcHRpb24KKyAgICAKKyAgICBpZiBzaXplIDwgMCB7CisgICAgICBsZXQgdmVyc2lvbiA9IHNpemUgJiBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb25NYXNrCisgICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbjEgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmJhZFZlcnNpb24oZXhwZWN0ZWQ6ICJcKFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbjEpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdDogIlwodmVyc2lvbikiKSkKKyAgICAgIH0KKyAgICAgIHR5cGUgPSBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IEludDMyKHNpemUpICYgMHgwMEZGKSA/PyB0eXBlCisgICAgICBtZXNzYWdlTmFtZSA9IHRyeSByZWFkKCkKKyAgICB9IGVsc2UgeworICAgICAgaWYgc3RyaWN0UmVhZCB7CisgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAiTWlzc2luZyBtZXNzYWdlIHZlcnNpb24sIG9sZCBjbGllbnQ/IE1lc3NhZ2UgTmFtZTogXChjdXJyZW50TWVzc2FnZU5hbWUgPz8gIiIpIgorICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UpCisgICAgICB9CisgICAgICBpZiBtZXNzYWdlU2l6ZUxpbWl0ID4gMCAmJiBzaXplID4gSW50MzIobWVzc2FnZVNpemVMaW1pdCkgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLnNpemVMaW1pdChsaW1pdDogSW50KG1lc3NhZ2VTaXplTGltaXQpLCBnb3Q6IEludChzaXplKSkpCisgICAgICB9CisgICAgICAKKyAgICAgIG1lc3NhZ2VOYW1lID0gdHJ5IHJlYWRTdHJpbmdCb2R5KEludChzaXplKSkKKyAgICAgIHR5cGUgPSBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpKSA/PyB0eXBlCisgICAgfQorICAgIAorICAgIGxldCBzZXFJRDogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgcmV0dXJuIChtZXNzYWdlTmFtZSwgdHlwZSwgc2VxSUQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuICIiCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUVHlwZSwgSW50MzIpIHsKKyAgICAKKyAgICBsZXQgZmllbGRUeXBlID0gVFR5cGUocmF3VmFsdWU6IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpKSA/PyBUVHlwZS5zdG9wCisgICAgdmFyIGZpZWxkSUQ6IEludDMyID0gMAorICAgIAorICAgIGlmIGZpZWxkVHlwZSAhPSAuc3RvcCB7CisgICAgICBmaWVsZElEID0gSW50MzIodHJ5IHJlYWQoKSBhcyBJbnQxNikKKyAgICB9CisgICAgCisgICAgcmV0dXJuICgiIiwgZmllbGRUeXBlLCBmaWVsZElEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICB2YXIgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQga2V5VHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIGtleVR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIAorICAgIHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IHZhbHVlVHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIHZhbHVlVHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQgZWxlbWVudFR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciBlbGVtZW50VHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgCisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAoZWxlbWVudFR5cGUsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQgZWxlbWVudFR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciBlbGVtZW50VHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAoZWxlbWVudFR5cGUsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcgeworICAgIGxldCBkYXRhOiBEYXRhID0gdHJ5IHJlYWQoKQorICAgIGd1YXJkIGxldCBzdHIgPSBTdHJpbmcuaW5pdChkYXRhOiBkYXRhLCBlbmNvZGluZzogLnV0ZjgpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwgbWVzc2FnZTogIkNvdWxkbid0IGVuY29kZSBVVEYtOCBmcm9tIGRhdGEgcmVhZCIpCisgICAgfQorICAgIHJldHVybiBzdHIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gKHRyeSByZWFkKCkgYXMgVUludDgpID09IDEKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDEpCisgICAgfQorICAgIHJldHVybiBidWZmWzBdCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiAyKQorICAgIH0KKyAgICB2YXIgcmV0ID0gSW50MTYoYnVmZlswXSAmIDB4ZmYpIDw8IDgKKyAgICByZXQgfD0gICAgSW50MTYoYnVmZlsxXSAmIDB4ZmYpCisgICAgcmV0dXJuIHJldAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogNCkKKyAgICB9CisgICAgdmFyIHJldCA9IEludDMyKGJ1ZmZbMF0gJiAweGZmKSA8PCAyNAorICAgIHJldCB8PSAgICBJbnQzMihidWZmWzFdICYgMHhmZikgPDwgMTYKKyAgICByZXQgfD0gICAgSW50MzIoYnVmZlsyXSAmIDB4ZmYpIDw8IDgKKyAgICByZXQgfD0gICAgSW50MzIoYnVmZlszXSAmIDB4ZmYpCisgICAgCisgICAgcmV0dXJuIHJldAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogOCkKKyAgICB9CisgICAgdmFyIHJldCA9IEludDY0KGJ1ZmZbMF0gJiAweGZmKSA8PCA1NgorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzFdICYgMHhmZikgPDwgNDgKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZlsyXSAmIDB4ZmYpIDw8IDQwCisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbM10gJiAweGZmKSA8PCAzMgorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzRdICYgMHhmZikgPDwgMjQKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls1XSAmIDB4ZmYpIDw8IDE2CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbNl0gJiAweGZmKSA8PCA4CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbN10gJiAweGZmKQorICAgIAorICAgIHJldHVybiByZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUgeworICAgIGxldCB2YWwgPSB0cnkgcmVhZCgpIGFzIEludDY0CisgICAgcmV0dXJuIERvdWJsZShiaXRQYXR0ZXJuOiBVSW50NjQoYml0UGF0dGVybjogdmFsKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgc2l6ZSA9IEludCh0cnkgcmVhZCgpIGFzIEludDMyKQorICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGRhdGEgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiBzaXplKQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gZGF0YQorICB9CisgIAorICAvLyBXcml0ZSBtZXRob2RzCisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgaWYgc3RyaWN0V3JpdGUgeworICAgICAgbGV0IHZlcnNpb24gPSBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb24xIHwgSW50MzIobWVzc2FnZVR5cGUucmF3VmFsdWUpCisgICAgICB0cnkgd3JpdGUodmVyc2lvbikKKyAgICAgIHRyeSB3cml0ZShuYW1lKQorICAgICAgdHJ5IHdyaXRlKHNlcXVlbmNlSUQpCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZShuYW1lKQorICAgICAgdHJ5IHdyaXRlKFVJbnQ4KG1lc3NhZ2VUeXBlLnJhd1ZhbHVlKSkKKyAgICAgIHRyeSB3cml0ZShzZXF1ZW5jZUlEKQorICAgIH0KKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGZpZWxkVHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKEludDE2KGZpZWxkSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KFRUeXBlLnN0b3AucmF3VmFsdWUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGtleVR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShVSW50OCh2YWx1ZVR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoZWxlbWVudFR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGVsZW1lbnRUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZSh2YWx1ZS5kYXRhKHVzaW5nOiAudXRmOCkhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBCb29sKSB0aHJvd3MgeworICAgIGxldCBieXRlVmFsOiBVSW50OCA9IHZhbHVlID8gMSA6IDAKKyAgICB0cnkgd3JpdGUoYnl0ZVZhbCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cyB7CisgICAgbGV0IGJ1ZmYgPSBEYXRhKGJ5dGVzOiBbdmFsdWVdKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlKSldKSkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cyB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAyNCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMTYpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlKSldKSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cyB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA1NikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gNDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDQwKSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAzMikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMjQpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDE2KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSkpXSkpCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IERvdWJsZSkgdGhyb3dzIHsKKyAgICAvLyBOb3RhYmx5IHVuc2FmZSwgc2luY2UgRG91YmxlIGFuZCBJbnQ2NCBhcmUgdGhlIHNhbWUgc2l6ZSwgdGhpcyBzaG91bGQgd29yayBmaW5lCisgICAgdHJ5IHNlbGYud3JpdGUoSW50NjQoYml0UGF0dGVybjogdmFsdWUuYml0UGF0dGVybikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoSW50MzIoZGF0YS5jb3VudCkpCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogZGF0YSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RDbGllbnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQ2xpZW50LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzI4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQ2xpZW50LnN3aWZ0CkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitvcGVuIGNsYXNzIFRDbGllbnQgeworICBwdWJsaWMgbGV0IGluUHJvdG9jb2w6IFRQcm90b2NvbAorICBwdWJsaWMgbGV0IG91dFByb3RvY29sOiBUUHJvdG9jb2wKKworICByZXF1aXJlZCBwdWJsaWMgaW5pdChpbm91dFByb3RvY29sOiBUUHJvdG9jb2wpIHsKKyAgICBzZWxmLmluUHJvdG9jb2wgPSBpbm91dFByb3RvY29sCisgICAgc2VsZi5vdXRQcm90b2NvbCA9IGlub3V0UHJvdG9jb2wKKyAgfQorCisgIHJlcXVpcmVkIHB1YmxpYyBpbml0KGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgeworICAgIHNlbGYuaW5Qcm90b2NvbCA9IGluUHJvdG9jb2wKKyAgICBzZWxmLm91dFByb3RvY29sID0gb3V0UHJvdG9jb2wKKyAgfQorfQorCisKK29wZW4gY2xhc3MgVEFzeW5jQ2xpZW50PFByb3RvY29sOiBUUHJvdG9jb2wsIEZhY3Rvcnk6IFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+IHsKKyAgcHVibGljIHZhciBmYWN0b3J5OiBGYWN0b3J5CisgIHB1YmxpYyBpbml0KHdpdGggcHJvdG9jb2w6IFByb3RvY29sLlR5cGUsIGZhY3Rvcnk6IEZhY3RvcnkpIHsKKyAgICBzZWxmLmZhY3RvcnkgPSBmYWN0b3J5CisgIH0KK30KKworCitwdWJsaWMgZW51bSBUQXN5bmNSZXN1bHQ8VD4geworICBjYXNlIHN1Y2Nlc3MoVCkKKyAgY2FzZSBlcnJvcihTd2lmdC5FcnJvcikKKyAgCisgIHB1YmxpYyBmdW5jIHZhbHVlKCkgdGhyb3dzIC0+IFQgeworICAgIHN3aXRjaCBzZWxmIHsKKyAgICBjYXNlIC5zdWNjZXNzKGxldCB0KTogcmV0dXJuIHQKKyAgICBjYXNlIC5lcnJvcihsZXQgZSk6IHRocm93IGUKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RDb21wYWN0UHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQ29tcGFjdFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzczYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQ29tcGFjdFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsNTc1IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKK3B1YmxpYyBlbnVtIFRDVHlwZTogVUludDggeworICBjYXNlIHN0b3AgICAgICAgICAgPSAweDAwCisgIGNhc2UgYm9vbGVhbl9UUlVFICA9IDB4MDEKKyAgY2FzZSBib29sZWFuX0ZBTFNFID0gMHgwMgorICBjYXNlIGk4ICAgICAgICAgICAgPSAweDAzCisgIGNhc2UgaTE2ICAgICAgICAgICA9IDB4MDQKKyAgY2FzZSBpMzIgICAgICAgICAgID0gMHgwNQorICBjYXNlIGk2NCAgICAgICAgICAgPSAweDA2CisgIGNhc2UgZG91YmxlICAgICAgICA9IDB4MDcKKyAgY2FzZSBiaW5hcnkgICAgICAgID0gMHgwOAorICBjYXNlIGxpc3QgICAgICAgICAgPSAweDA5CisgIGNhc2Ugc2V0ICAgICAgICAgICA9IDB4MEEKKyAgY2FzZSBtYXAgICAgICAgICAgID0gMHgwQgorICBjYXNlIGBzdHJ1Y3RgICAgICAgPSAweDBDCisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0eXBlTWFzazogVUludDggPSAweEUwIC8vIDExMTAgMDAwMAorICBwdWJsaWMgc3RhdGljIGxldCB0eXBlQml0czogVUludDggPSAweDA3IC8vIDAwMDAgMDExMQorICBwdWJsaWMgc3RhdGljIGxldCB0eXBlU2hpZnRBbW91bnQgPSA1CisgCit9CisKKworcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2w6IFRQcm90b2NvbCB7CisgIHB1YmxpYyBzdGF0aWMgbGV0IHByb3RvY29sSUQ6IFVJbnQ4ICA9IDB4ODIKKyAgcHVibGljIHN0YXRpYyBsZXQgdmVyc2lvbjogVUludDggICAgID0gMQorICBwdWJsaWMgc3RhdGljIGxldCB2ZXJzaW9uTWFzazogVUludDggPSAweDFGIC8vIDAwMDEgMTExMQorICAKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQKKyAgCisgIHZhciBsYXN0RmllbGQ6IFtVSW50OF0gPSBbXQorICB2YXIgbGFzdEZpZWxkSWQ6IFVJbnQ4ID0gMAorICAKKyAgdmFyIGJvb2xGaWVsZE5hbWU6IFN0cmluZz8KKyAgdmFyIGJvb2xGaWVsZFR5cGU6IFRUeXBlPworICB2YXIgYm9vbEZpZWxkSWQ6IEludDMyPworICB2YXIgYm9vbGVhblZhbHVlOiBCb29sPworICAKKyAgdmFyIGN1cnJlbnRNZXNzYWdlTmFtZTogU3RyaW5nPworCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgIH0KKworICAKKyAgLy8vIE1hcms6IC0gVENvbXBhY3RQcm90b2NvbCBoZWxwZXJzCisgIAorICBmdW5jIHdyaXRlYnl0ZURpcmVjdChfIGJ5dGU6IFVJbnQ4KSB0aHJvd3MgeworICAgIGxldCBieXRlID0gRGF0YShieXRlczogW2J5dGVdKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ5dGUpCisgICAgfQorICB9CisgIAorICBmdW5jIHdyaXRlVmFyaW50MzIoXyB2YWw6IFVJbnQzMikgdGhyb3dzIHsKKyAgICB2YXIgdmFsID0gdmFsCisgICAgdmFyIGkzMmJ1ZiA9IFtVSW50OF0ocmVwZWF0aW5nOiAwLCBjb3VudDogNSkKKyAgICB2YXIgaWR4ID0gMAorICAgIHdoaWxlIHRydWUgeworICAgICAgaWYgKHZhbCAmIH4weDdGKSA9PSAwIHsKKyAgICAgICAgaTMyYnVmW2lkeF0gPSBVSW50OCh2YWwpCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIGJyZWFrCisgICAgICB9IGVsc2UgeworICAgICAgICBpMzJidWZbaWR4XSA9IFVJbnQ4KCh2YWwgJiAweDdGKSB8IDB4ODApCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIHZhbCA+Pj0gNworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBEYXRhKGJ5dGVzOiBpMzJidWZbMC4uPGlkeF0pKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB3cml0ZVZhcmludDY0KF8gdmFsOiBVSW50NjQpIHRocm93cyB7CisgICAgdmFyIHZhbCA9IHZhbAorICAgIHZhciB2YXJpbnQ2NG91dCA9IFtVSW50OF0ocmVwZWF0aW5nOiAwLCBjb3VudDogMTApCisgICAgdmFyIGlkeCA9IDAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGlmICh2YWwgJiB+MHg3RikgPT0gMHsKKyAgICAgICAgdmFyaW50NjRvdXRbaWR4XSA9IFVJbnQ4KHZhbCkKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgYnJlYWsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhcmludDY0b3V0W2lkeF0gPSBVSW50OCh2YWwgJiAweDdGKSB8IDB4ODAKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgdmFsID4+PSA3CisgICAgICB9CisgICAgfQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IERhdGEoYnl0ZXM6IHZhcmludDY0b3V0WzAuLjxpZHhdKSkKKyAgICB9CisgIAorICB9CisgIAorICBmdW5jIHdyaXRlQ29sbGVjdGlvbkJlZ2luKF8gZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICBsZXQgY3R5cGUgPSBjb21wYWN0VHlwZShlbGVtZW50VHlwZSkucmF3VmFsdWUKKyAgICBpZiBzaXplIDw9IDE0IHsKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoVUludDgoc2l6ZSA8PCA0KSB8IGN0eXBlKQorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KDB4RjAgfCBjdHlwZSkKKyAgICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihzaXplKSkKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgcmVhZEJpbmFyeShfIHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciByZXN1bHQgPSBEYXRhKCkKKyAgICBpZiBzaXplICE9IDAgeworICAgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgICAgcmVzdWx0ID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogc2l6ZSkKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBmdW5jIHJlYWRWYXJpbnQzMigpIHRocm93cyAtPiBVSW50MzIgeworICAgIHZhciByZXN1bHQ6IFVJbnQzMiA9IDAKKyAgICB2YXIgc2hpZnQ6IFVJbnQzMiA9IDAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGxldCBieXRlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICAgIAorICAgICAgcmVzdWx0IHw9IFVJbnQzMihieXRlICYgMHg3RikgPDwgc2hpZnQKKyAgICAgIGlmIChieXRlICYgMHg4MCkgPT0gMCB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgICAKKyAgICAgIHNoaWZ0ICs9IDcKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBmdW5jIHJlYWRWYXJpbnQ2NCgpIHRocm93cyAtPiBVSW50NjQgeworICAgIHZhciByZXN1bHQ6IFVJbnQ2NCA9IDAKKyAgICB2YXIgc2hpZnQ6IFVJbnQ2NCA9IDAKKyAgICAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGxldCBieXRlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICAgIAorICAgICAgcmVzdWx0IHw9IFVJbnQ2NChieXRlICYgMHg3RikgPDwgc2hpZnQKKyAgICAgIGlmIChieXRlICYgMHg4MCkgPT0gMCB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgICAKKyAgICAgIHNoaWZ0ICs9IDcKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorCisgIGZ1bmMgdHR5cGUoXyBjb21wYWN0VHlwZVZhbDogVUludDgpIHRocm93cyAtPiBUVHlwZSB7CisgICAgZ3VhcmQgbGV0IGNvbXBhY3RUeXBlID0gVENUeXBlKHJhd1ZhbHVlOiBjb21wYWN0VHlwZVZhbCkgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biBUQ1R5cGUgdmFsdWU6IFwoY29tcGFjdFR5cGVWYWwpIikKKyAgICB9CisgICAgCisgICAgc3dpdGNoIGNvbXBhY3RUeXBlIHsKKyAgICBjYXNlIC5zdG9wOiByZXR1cm4gLnN0b3A7CisgICAgY2FzZSAuYm9vbGVhbl9GQUxTRSwgLmJvb2xlYW5fVFJVRTogcmV0dXJuIC5ib29sOworICAgIGNhc2UgLmk4OiByZXR1cm4gLmk4OworICAgIGNhc2UgLmkxNjogcmV0dXJuIC5pMTY7CisgICAgY2FzZSAuaTMyOiByZXR1cm4gLmkzMjsKKyAgICBjYXNlIC5pNjQ6IHJldHVybiAuaTY0OworICAgIGNhc2UgLmRvdWJsZTogcmV0dXJuIC5kb3VibGU7CisgICAgY2FzZSAuYmluYXJ5OiByZXR1cm4gLnN0cmluZzsKKyAgICBjYXNlIC5saXN0OiByZXR1cm4gLmxpc3Q7CisgICAgY2FzZSAuc2V0OiByZXR1cm4gLnNldDsKKyAgICBjYXNlIC5tYXA6IHJldHVybiAubWFwOworICAgIGNhc2UgLnN0cnVjdDogcmV0dXJuIC5zdHJ1Y3Q7CisgICAgfQorICB9CisgIAorICBmdW5jIGNvbXBhY3RUeXBlKF8gdHR5cGU6IFRUeXBlKSAtPiBUQ1R5cGUgeworICAgIHN3aXRjaCB0dHlwZSB7CisgICAgY2FzZSAuc3RvcDogICByZXR1cm4gLnN0b3AKKyAgICBjYXNlIC52b2lkOiAgIHJldHVybiAuaTgKKyAgICBjYXNlIC5ib29sOiAgIHJldHVybiAuYm9vbGVhbl9GQUxTRQorICAgIGNhc2UgLmk4OiAgIHJldHVybiAuaTgKKyAgICBjYXNlIC5kb3VibGU6IHJldHVybiAuZG91YmxlCisgICAgY2FzZSAuaTE2OiAgICByZXR1cm4gLmkxNgorICAgIGNhc2UgLmkzMjogICAgcmV0dXJuIC5pMzIKKyAgICBjYXNlIC5pNjQ6ICAgIHJldHVybiAuaTY0CisgICAgY2FzZSAuc3RyaW5nOiByZXR1cm4gLmJpbmFyeQorICAgIGNhc2UgLnN0cnVjdDogcmV0dXJuIC5zdHJ1Y3QKKyAgICBjYXNlIC5tYXA6ICAgIHJldHVybiAubWFwCisgICAgY2FzZSAuc2V0OiAgICByZXR1cm4gLnNldAorICAgIGNhc2UgLmxpc3Q6ICAgcmV0dXJuIC5saXN0CisgICAgY2FzZSAudXRmODogICByZXR1cm4gLmJpbmFyeQorICAgIGNhc2UgLnV0ZjE2OiAgcmV0dXJuIC5iaW5hcnkKKyAgICB9CisgIH0KKyAgCisgIC8vLyBaaWdaYWcgZW5jb2RpbmcgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQgaW50ZWdlcnMgc28gdGhhdAorICAvLy8gbnVtYmVycyB3aXRoIGEgc21hbGwgYWJzb2x1dGUgdmFsdWUgKGZvciBpbnN0YW5jZSwgLTEpIGhhdmUKKyAgLy8vIGEgc21hbGwgdmFyaW50IGVuY29kZWQgdmFsdWUgdG9vLiBJdCBkb2VzIHRoaXMgaW4gYSB3YXkgdGhhdAorICAvLy8gInppZy16YWdzIiBiYWNrIGFuZCBmb3J0aCB0aHJvdWdoIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaW50ZWdlcnMsCisgIC8vLyBzbyB0aGF0IC0xIGlzIGVuY29kZWQgYXMgMSwgMSBpcyBlbmNvZGVkIGFzIDIsIC0yIGlzIGVuY29kZWQgYXMgMywgYW5kIHNvCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgbjogbnVtYmVyIHRvIHppZ3phZworICAvLy8KKyAgLy8vIC0gcmV0dXJuczogemlnemFnZWQgVUludDMyCisgIGZ1bmMgaTMyVG9aaWdaYWcoXyBuIDogSW50MzIpIC0+IFVJbnQzMiB7CisgICAgcmV0dXJuIFVJbnQzMihiaXRQYXR0ZXJuOiBJbnQzMihuIDw8IDEpIF4gSW50MzIobiA+PiAzMSkpCisgIH0KKworICBmdW5jIGk2NFRvWmlnWmFnKF8gbiA6IEludDY0KSAtPiBVSW50NjQgeworICAgIHJldHVybiBVSW50NjQoYml0UGF0dGVybjogSW50NjQobiA8PCAxKSBeIEludDY0KG4gPj4gNjMpKQorICB9CisKKyAgZnVuYyB6aWdaYWdUb2kzMihfIG46IFVJbnQzMikgLT4gSW50MzIgeworICAgIHJldHVybiBJbnQzMihuID4+IDEpIF4gKC1JbnQzMihuICYgMSkpCisgIH0KKyAgCisgIGZ1bmMgemlnWmFnVG9pNjQoXyBuOiBVSW50NjQpIC0+IEludDY0IHsKKyAgICByZXR1cm4gSW50NjQobiA+PiAxKSBeICgtSW50NjQobiAmIDEpKQorICB9CisgIAorICAKKyAgCisgIC8vLyBNYXJrOiAtIFRQcm90b2NvbCAgCisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgcHJvdG9jb2xJZDogVUludDggPSB0cnkgcmVhZCgpCisgICAgCisgICAgaWYgcHJvdG9jb2xJZCAhPSBUQ29tcGFjdFByb3RvY29sLnByb3RvY29sSUQgeworICAgICAgbGV0IGV4cGVjdGVkID0gU3RyaW5nKGZvcm1hdDoiJTJYIiwgVENvbXBhY3RQcm90b2NvbC5wcm90b2NvbElEKQorICAgICAgbGV0IGdvdCAgICAgID0gU3RyaW5nKGZvcm1hdDoiJTJYIiwgcHJvdG9jb2xJZCkKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJXcm9uZyBQcm90b2NvbCBJRCBcKGdvdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLm1pc21hdGNoZWRQcm90b2NvbChleHBlY3RlZDogZXhwZWN0ZWQsIGdvdDogZ290KSkKKworICAgIH0KKworICAgIGxldCB2ZXJzaW9uQW5kVHlwZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgbGV0IHZlcnNpb246IFVJbnQ4ID0gdmVyc2lvbkFuZFR5cGUgJiBUQ29tcGFjdFByb3RvY29sLnZlcnNpb25NYXNrCisgICAgaWYgdmVyc2lvbiAhPSBUQ29tcGFjdFByb3RvY29sLnZlcnNpb24geworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5iYWRWZXJzaW9uKGV4cGVjdGVkOiAiXChUQ29tcGFjdFByb3RvY29sLnZlcnNpb24pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Q6IlwodmVyc2lvbikiKSkKKworICAgIH0KKyAgICAKKyAgICBsZXQgdHlwZSA9ICh2ZXJzaW9uQW5kVHlwZSA+PiBVSW50OChUQ1R5cGUudHlwZVNoaWZ0QW1vdW50KSkgJiBUQ1R5cGUudHlwZUJpdHMKKyAgICBndWFyZCBsZXQgbXR5cGUgPSBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IEludDMyKHR5cGUpKSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIFRNZXNzYWdlVHlwZSB2YWx1ZTogXCh0eXBlKSIpCisgICAgfQorICAgIGxldCBzZXF1ZW5jZUlkID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgbGV0IG5hbWU6IFN0cmluZyA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKG5hbWUsIG10eXBlLCBJbnQzMihzZXF1ZW5jZUlkKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICBsYXN0RmllbGQuYXBwZW5kKGxhc3RGaWVsZElkKQorICAgIGxhc3RGaWVsZElkID0gMAorICAgIHJldHVybiAiIgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICBsYXN0RmllbGRJZCA9IGxhc3RGaWVsZC5sYXN0ID8/IDAKKyAgICBsYXN0RmllbGQucmVtb3ZlTGFzdCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikgeworICAgIGxldCBieXRlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICBndWFyZCBsZXQgdHlwZSA9IFRDVHlwZShyYXdWYWx1ZTogYnl0ZSAmIDB4MEYpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gVENUeXBlIFwoYnl0ZSAmIDB4MEYpIikKKyAgICB9CisgICAgCisgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyCisgICAgaWYgdHlwZSA9PSAuc3RvcCB7CisgICAgICByZXR1cm4gKCIiLCAuc3RvcCwgMCkKKyAgICB9CisgICAgCisgICAgdmFyIGZpZWxkSWQ6IEludDE2ID0gMAorICAgIAorICAgIC8vIG1hc2sgb2ZmIHRoZSA0TVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YQorICAgIGxldCBtb2RpZmllciA9IChieXRlICYgMHhGMCkgPj4gNAorICAgIGlmIG1vZGlmaWVyID09IDAgeworICAgICAgLy8gbm90IGEgZGVsdGEuICBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZAorICAgICAgZmllbGRJZCA9IHRyeSByZWFkKCkKKyAgICB9IGVsc2UgeworICAgICAgLy8gaGFzIGEgZGVsdGEuICBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisgICAgICBmaWVsZElkID0gSW50MTYobGFzdEZpZWxkSWQgKyBtb2RpZmllcikKKyAgICB9CisgICAgCisgICAgbGV0IGZpZWxkVHlwZSA9IHRyeSB0dHlwZSh0eXBlLnJhd1ZhbHVlKQorICAgIAorICAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisgICAgaWYgdHlwZSA9PSAuYm9vbGVhbl9UUlVFIHx8IHR5cGUgPT0gLmJvb2xlYW5fRkFMU0UgeworICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgIGJvb2xlYW5WYWx1ZSA9IHR5cGUgPT0gLmJvb2xlYW5fVFJVRQorICAgIH0KKyAgICAKKyAgICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZworICAgIGxhc3RGaWVsZElkID0gVUludDgoZmllbGRJZCkKKyAgICByZXR1cm4gKCIiLCBmaWVsZFR5cGUsIEludDMyKGZpZWxkSWQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgbGV0IGxlbmd0aCA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIAorICAgIHZhciByZXN1bHQ6IFN0cmluZworICAgIAorICAgIGlmIGxlbmd0aCAhPSAwIHsKKyAgICAgIGxldCBkYXRhID0gdHJ5IHJlYWRCaW5hcnkoSW50KGxlbmd0aCkpCisgICAgICByZXN1bHQgPSBTdHJpbmcoZGF0YTogZGF0YSwgZW5jb2Rpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KSA/PyAiIgorICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSAiIgorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgaWYgbGV0IHZhbCA9IGJvb2xlYW5WYWx1ZSB7CisgICAgICBzZWxmLmJvb2xlYW5WYWx1ZSA9IG5pbAorICAgICAgcmV0dXJuIHZhbAorICAgIH0gZWxzZSB7CisgICAgICBsZXQgcmVzdWx0ID0gdHJ5IHJlYWQoKSBhcyBVSW50OAorICAgICAgcmV0dXJuIFRDVHlwZShyYXdWYWx1ZTogcmVzdWx0KSA9PSAuYm9vbGVhbl9UUlVFCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4IHsKKyAgICB2YXIgYnVmZjogVUludDggPSAwCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiAxKVswXQorICAgIH0KKyAgICByZXR1cm4gYnVmZgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICBsZXQgdiA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIHJldHVybiBJbnQxNih6aWdaYWdUb2kzMih2KSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMiB7CisgICAgbGV0IHYgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICByZXR1cm4gemlnWmFnVG9pMzIodikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgbGV0IHYgPSB0cnkgcmVhZFZhcmludDY0KCkKKyAgICByZXR1cm4gemlnWmFnVG9pNjQodikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiA4KQorICAgIH0KKyAgICAKKyAgICBsZXQgaTY0OiBVSW50NjQgPSBidWZmLndpdGhVbnNhZmVCeXRlcyB7IChwdHI6IFVuc2FmZVBvaW50ZXI8VUludDg+KSAtPiBVSW50NjQgaW4KKyAgICAgIHJldHVybiBVbnNhZmVQb2ludGVyPFVJbnQ2ND4oT3BhcXVlUG9pbnRlcihwdHIpKS5wb2ludGVlCisgICAgfQorICAgIGxldCBiaXRzID0gQ0ZTd2FwSW50NjRMaXR0bGVUb0hvc3QoaTY0KQorICAgIHJldHVybiBEb3VibGUoYml0UGF0dGVybjogYml0cykKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgbGVuZ3RoID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgcmV0dXJuIHRyeSByZWFkQmluYXJ5KEludChsZW5ndGgpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICB2YXIga2V5QW5kVmFsdWVUeXBlOiBVSW50OCA9IDgKKyAgICBsZXQgc2l6ZSA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIGlmIHNpemUgIT0gMCB7CisgICAgICBrZXlBbmRWYWx1ZVR5cGUgPSB0cnkgcmVhZCgpCisgICAgfQorICAgIAorICAgIGxldCBrZXlUeXBlID0gdHJ5IHR0eXBlKGtleUFuZFZhbHVlVHlwZSA+PiA0KQorICAgIGxldCB2YWx1ZVR5cGUgPSB0cnkgdHR5cGUoa2V5QW5kVmFsdWVUeXBlICYgMHhGKQorICAgIAorICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSByZWFkTGlzdEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIGxldCBzaXplQW5kVHlwZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgdmFyIHNpemU6IFVJbnQzMiA9IFVJbnQzMihzaXplQW5kVHlwZSA+PiA0KSAmIDB4MGYKKyAgICBpZiBzaXplID09IDE1IHsKKyAgICAgIHNpemUgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICB9CisgICAgbGV0IGVsZW1lbnRUeXBlID0gdHJ5IHR0eXBlKHNpemVBbmRUeXBlICYgMHgwRikKKyAgICAKKyAgICByZXR1cm4gKGVsZW1lbnRUeXBlLCBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChUQ29tcGFjdFByb3RvY29sLnByb3RvY29sSUQpCisgICAgbGV0IG5leHRCeXRlOiBVSW50OCA9IChUQ29tcGFjdFByb3RvY29sLnZlcnNpb24gJiBUQ29tcGFjdFByb3RvY29sLnZlcnNpb25NYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChVSW50OCgoVUludDMyKG1lc3NhZ2VUeXBlLnJhd1ZhbHVlKSA8PCBVSW50MzIoVENUeXBlLnR5cGVTaGlmdEFtb3VudCkpKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRDVHlwZS50eXBlTWFzaykKKyAgICB0cnkgd3JpdGVieXRlRGlyZWN0KG5leHRCeXRlKQorICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihzZXF1ZW5jZUlEKSkKKyAgICB0cnkgd3JpdGUobmFtZSkKKyAgICAKKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIGxhc3RGaWVsZC5hcHBlbmQobGFzdEZpZWxkSWQpCisgICAgbGFzdEZpZWxkSWQgPSAwCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICBsYXN0RmllbGRJZCA9IGxhc3RGaWVsZC5sYXN0ID8/IDAKKyAgICBsYXN0RmllbGQucmVtb3ZlTGFzdCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGZpZWxkVHlwZTogVFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiBJbnQzMikgdGhyb3dzIHsKKyAgICBpZiBmaWVsZFR5cGUgPT0gLmJvb2wgeworICAgICAgYm9vbEZpZWxkTmFtZSA9IG5hbWUKKyAgICAgIGJvb2xGaWVsZFR5cGUgPSBmaWVsZFR5cGUKKyAgICAgIGJvb2xGaWVsZElkID0gZmllbGRJRAorICAgICAgcmV0dXJuCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lOiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiBmaWVsZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTogMHhGRikKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiBJbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IFVJbnQ4KSB0aHJvd3MgeworICAgIAorICAgIGxldCB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gY29tcGFjdFR5cGUoZmllbGRUeXBlKS5yYXdWYWx1ZSA6IHR5cGVPdmVycmlkZQorICAgIAorICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgIGxldCBkaWZmID0gVUludDgoZmllbGRJRCkgLSBsYXN0RmllbGRJZAorICAgIGlmIChVSW50OChmaWVsZElEKSA+IGxhc3RGaWVsZElkKSAmJiAoZGlmZiA8PSAxNSkgeworICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCgoVUludDgoZmllbGRJRCkgLSBsYXN0RmllbGRJZCkgPDwgNCB8IHR5cGVUb1dyaXRlKQorICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpCisgICAgICB0cnkgd3JpdGUoSW50MTYoZmllbGRJRCkpCisgICAgfQorICAgIAorICAgIGxhc3RGaWVsZElkID0gVUludDgoZmllbGRJRCkKKyAgICAgIAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChUQ1R5cGUuc3RvcC5yYXdWYWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIGlmIHNpemUgPT0gMCB7CisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KDApCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihzaXplKSkKKyAgICAgIAorICAgICAgbGV0IGNvbXBhY3RlZFR5cGVzID0gY29tcGFjdFR5cGUoa2V5VHlwZSkucmF3VmFsdWUgPDwgNCB8IGNvbXBhY3RUeXBlKHZhbHVlVHlwZSkucmF3VmFsdWUKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoY29tcGFjdGVkVHlwZXMpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUodmFsdWUuZGF0YSh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzIHsKKyAgICBpZiBsZXQgYm9vbEZpZWxkSWQgPSBib29sRmllbGRJZCwgbGV0IGJvb2xGaWVsZFR5cGUgPSBib29sRmllbGRUeXBlLAorICAgICAgIGxldCBib29sRmllbGROYW1lID0gYm9vbEZpZWxkTmFtZSB7CisgICAgICAKKyAgICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgICAgbGV0IGNvbXBhY3RUeXBlOiBUQ1R5cGUgPSB2YWx1ZSA/IC5ib29sZWFuX1RSVUUgOiAuYm9vbGVhbl9GQUxTRQorICAgICAgdHJ5IHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWU6IGJvb2xGaWVsZE5hbWUsIHR5cGU6IGJvb2xGaWVsZFR5cGUsIGZpZWxkSUQ6IGJvb2xGaWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTogY29tcGFjdFR5cGUucmF3VmFsdWUpCisgICAgICBzZWxmLmJvb2xGaWVsZElkID0gbmlsCisgICAgICBzZWxmLmJvb2xGaWVsZFR5cGUgPSBuaWwKKyAgICAgIHNlbGYuYm9vbEZpZWxkTmFtZSA9IG5pbAorICAgIH0gZWxzZSB7CisgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QodmFsdWUgPyBUQ1R5cGUuYm9vbGVhbl9UUlVFLnJhd1ZhbHVlIDogVENUeXBlLmJvb2xlYW5fRkFMU0UucmF3VmFsdWUpCisgICAgfQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCh2YWx1ZSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDE2KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDMyKGkzMlRvWmlnWmFnKEludDMyKHZhbHVlKSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDMyKGkzMlRvWmlnWmFnKHZhbHVlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50NjQoaTY0VG9aaWdaYWcodmFsdWUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cyB7CisgICAgdmFyIGJpdHMgPSBDRlN3YXBJbnQ2NEhvc3RUb0xpdHRsZSh2YWx1ZS5iaXRQYXR0ZXJuKQorICAgIGxldCBkYXRhID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZiaXRzKSB7CisgICAgICByZXR1cm4gRGF0YShieXRlczogVW5zYWZlUG9pbnRlcjxVSW50OD4oT3BhcXVlUG9pbnRlcigkMCkpLCBjb3VudDogTWVtb3J5TGF5b3V0PFVJbnQ2ND4uc2l6ZSkKKyAgICB9CisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogZGF0YSkKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoZGF0YS5jb3VudCkpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogZGF0YSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RFbnVtLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVudW0uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkZmRiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFbnVtLnN3aWZ0CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwdWJsaWMgcHJvdG9jb2wgVEVudW0gOiBUU2VyaWFsaXphYmxlLCBIYXNoYWJsZSB7CisgIHZhciByYXdWYWx1ZTogSW50MzIgeyBnZXQgfQorfQorCitleHRlbnNpb24gVEVudW0geworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTMyIH0KKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7IHJldHVybiByYXdWYWx1ZS5oYXNoVmFsdWUgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHJhd1ZhbHVlKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllZGJhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFcnJvci5zd2lmdApAQCAtMCwwICsxLDc3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKy8vLyBURXJyb3JDb2RlCisvLy8KKy8vLyBQcm90b2NvbCBmb3IgVEVycm9yIGNvbmZvcm1lcnMnIGVudW0ncyB0byBjb25mb3JtIHRvLgorLy8vIEdlbmVyaWMgSW50IFRocmlmdCBlcnJvciBjb2RlIHRvIGFsbG93IGVycm9yIGNhc2VzIHRvIGhhdmUKKy8vLyBhc3NvY2lhdGVkIHZhbHVlcy4KK3B1YmxpYyBwcm90b2NvbCBURXJyb3JDb2RlIDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUgeworICB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeyBnZXQgfQorfQorCisvLy8gVEVycm9yCisvLy8KKy8vLyBCYXNlIHByb3RvY29sIGZvciBhbGwgVGhyaWZ0IEVycm9yKEV4Y2VwdGlvbikgdHlwZXMgdG8gY29uZm9ybSB0bworcHVibGljIHByb3RvY29sIFRFcnJvciA6IEVycm9yLCBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSB7CisKKyAgLy8vIEVudW0gZm9yIGVycm9yIGNhc2VzLiAgQ2FuIGJlIHR5cGVhbGlhc2VkIHRvIGFueSBjb25mb3JtaW5nIGVudW0KKyAgLy8vIG9yIGRlZmluZWQgbmVzdGVkLgorICBhc3NvY2lhdGVkdHlwZSBDb2RlOiBURXJyb3JDb2RlCisgIAorICAvLy8gRXJyb3IgQ2FzZSwgdmFsdWUgZnJvbSBpbnRlcm5hbCBlbnVtCisgIHZhciBlcnJvcjogQ29kZSB7IGdldCBzZXQgfQorICAKKyAgLy8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgbWVzc2FnZQorICB2YXIgbWVzc2FnZTogU3RyaW5nPyB7IGdldCBzZXQgfQorICAKKyAgLy8vIERlZmF1bHQgZXJyb3IgY2FzZSBmb3IgdGhlIGVycm9yIHR5cGUsIHVzZWQgZm9yIGdlbmVyaWMgaW5pdCgpCisgIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IENvZGUgeyBnZXQgfQorICAKKyAgaW5pdCgpCit9CisKK2V4dGVuc2lvbiBURXJyb3IgeworICAvLy8gSHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgZXJyb3IuIERlZmF1bHQgcHJvdmlkZWQgZm9yIHlvdSBpbiB0aGUKKyAgLy8vIGZvcm1hdCBcKFNlbGYuc2VsZik6IFwoZXJyb3IuZXJyb3JEZXNjcmlwdGlvbikgXG4gbWVzc2FnZQorICAvLy8gZWc6CisgIC8vLworICAvLy8gICAgIFRBcHBsaWNhdGlvbkVycm9yICgxKTogSW52YWxpZCBNZXNzYWdlIFR5cGUKKyAgLy8vICAgICBBbiB1bmtub3duIEVycm9yIGhhcyBvY2N1cmVkLgorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgIHZhciBvdXQgPSAiXChTZWxmLnNlbGYpIChcKGVycm9yLnRocmlmdEVycm9yQ29kZSkpOiAiICsgZXJyb3IuZGVzY3JpcHRpb24gKyAiXG4iCisgICAgaWYgbGV0IG1lc3NhZ2UgPSBtZXNzYWdlIHsKKyAgICAgIG91dCArPSAiTWVzc2FnZTogXChtZXNzYWdlKSIKKyAgICB9CisgICAgcmV0dXJuIG91dAorICB9CisKKyAgLy8vIFNpbXBsZSBkZWZhdWx0IEluaXRpYWxpemVyIGZvciBURXJyb3IncworICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIGVycm9yOiAgIEVycm9yQ29kZSB2YWx1ZS4gIERlZmF1bHQ6IGRlZmF1bHRDYXNlCisgIC8vLyAtIHBhcmFtZXRlciBtZXNzYWdlOiBDdXN0b20gbWVzc2FnZSB3aXRoIGVycm9yLiAgT3B0aW9uYWwKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IDwjcmV0dXJuIHZhbHVlIGRlc2NyaXB0aW9uIz4KKyAgcHVibGljIGluaXQoZXJyb3I6IENvZGUsIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwpIHsKKyAgICBzZWxmLmluaXQoKQorICAgIHNlbGYuZXJyb3IgPSBlcnJvcgorICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVIYW5kbGVUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZUhhbmRsZVRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE1ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVIYW5kbGVUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw1NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIGNsYXNzIFRGaWxlSGFuZGxlVHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgdmFyIGlucHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZQorICB2YXIgb3V0cHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZQorICAKKyAgcHVibGljIGluaXQoaW5wdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlLCBvdXRwdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlKSB7CisgICAgc2VsZi5pbnB1dEZpbGVIYW5kbGUgPSBpbnB1dEZpbGVIYW5kbGUKKyAgICBzZWxmLm91dHB1dEZpbGVIYW5kbGUgPSBvdXRwdXRGaWxlSGFuZGxlCisgIH0KKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGZpbGVIYW5kbGU6IEZpbGVIYW5kbGUpIHsKKyAgICBzZWxmLmluaXQoaW5wdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlLCBvdXRwdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgd2hpbGUgZGF0YS5jb3VudCA8IHNpemUgeworICAgICAgbGV0IHJlYWQgPSBpbnB1dEZpbGVIYW5kbGUucmVhZERhdGEob2ZMZW5ndGg6IHNpemUgLSBkYXRhLmNvdW50KQorICAgICAgZGF0YS5hcHBlbmQocmVhZCkKKyAgICAgIGlmIHJlYWQuY291bnQgPT0gMCB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBkYXRhCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgb3V0cHV0RmlsZUhhbmRsZS53cml0ZShkYXRhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URmlsZVRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjI1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZVRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworI2lmIG9zKE9TWCkgfHwgb3MoaU9TKSB8fCBvcyh3YXRjaE9TKSB8fCBvcyh0dk9TKQorICBpbXBvcnQgRGFyd2luCisjZWxzZWlmIG9zKExpbnV4KSB8fCBvcyhGcmVlQlNEKSB8fCBvcyhQUzQpIHx8IG9zKEFuZHJvaWQpCisgIGltcG9ydCBHbGliYworI2VuZGlmCisKKy8vLyBURmlsZVRyYW5zcG9ydAorLy8vIEZvdW5kYXRpb24tbGVzcyBTd2lmdCBGaWxlIHRyYW5zcG9ydC4KKy8vLyBVc2VzIEMgZm9wZW4vZnJlYWQvZndyaXRlLAorLy8vIHByb3ZpZGVkIGJ5IEdsaWJjIGluIGxpbnV4IGFuZCBEYXJ3aW4gb24gT1NYL2lPUworcHVibGljIGNsYXNzIFRGaWxlVHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgdmFyIGZpbGVIYW5kbGU6IFVuc2FmZU11dGFibGVQb2ludGVyPEZJTEU+PyA9IG5pbAorICAKKyAgcHVibGljIGluaXQgKGZpbGVIYW5kbGU6IFVuc2FmZU11dGFibGVQb2ludGVyPEZJTEU+KSB7CisgICAgc2VsZi5maWxlSGFuZGxlID0gZmlsZUhhbmRsZQorICB9CisKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQoZmlsZW5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB2YXIgZmlsZUhhbmRsZTogVW5zYWZlTXV0YWJsZVBvaW50ZXI8RklMRT4/CisgICAgZmlsZW5hbWUud2l0aENTdHJpbmcoeyBjRmlsZW5hbWUgaW4KKyAgICAgICJydyIud2l0aENTdHJpbmcoeyBjTW9kZSBpbgorICAgICAgICBmaWxlSGFuZGxlID0gZm9wZW4oY0ZpbGVuYW1lLCBjTW9kZSkKKyAgICAgIH0pCisgICAgfSkKKyAgICBpZiBsZXQgZmlsZUhhbmRsZSA9IGZpbGVIYW5kbGUgeworICAgICAgc2VsZi5pbml0KGZpbGVIYW5kbGU6IGZpbGVIYW5kbGUpCisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4pCisgICAgfQorICB9CisgIAorICBkZWluaXQgeworICAgIGZjbG9zZShzZWxmLmZpbGVIYW5kbGUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IHJlYWQgPSB0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUpCisgICAgCisgICAgaWYgcmVhZC5jb3VudCAhPSBzaXplIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICB9CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICAvLyBzZXQgdXAgcmVhZCBidWZmZXIsIHBvc2l0aW9uIDAKKyAgICB2YXIgcmVhZCA9IERhdGEoY2FwYWNpdHk6IHNpemUpCisgICAgdmFyIHBvc2l0aW9uID0gMAorICAgIAorICAgIC8vIHJlYWQgY2hhcmFjdGVyIGJ1ZmZlcgorICAgIHZhciBuZXh0Q2hhcjogVUludDggPSAwCisgICAgCisgICAgLy8gY29udGludWUgdW50aWwgd2UndmUgcmVhZCBzaXplIGJ5dGVzCisgICAgd2hpbGUgcmVhZC5jb3VudCA8IHNpemUgeworICAgICAgaWYgZnJlYWQoJm5leHRDaGFyLCAxLCAxLCBzZWxmLmZpbGVIYW5kbGUpID09IDEgeworICAgICAgICByZWFkW3Bvc2l0aW9uXSA9IG5leHRDaGFyCisKKyAgICAgICAgLy8gSW5jcmVtZW50IG91dHB1dCBieXRlIHBvaW50ZXIKKyAgICAgICAgcG9zaXRpb24gKz0gMQorICAgICAgICAKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICBsZXQgYnl0ZXNXcml0dGVuID0gZGF0YS53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgZndyaXRlKCQwLCAxLCBkYXRhLmNvdW50LCBzZWxmLmZpbGVIYW5kbGUpCisgICAgfQorICAgIGlmIGJ5dGVzV3JpdHRlbiAhPSBkYXRhLmNvdW50IHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RGcmFtZWRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URnJhbWVkVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzg1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URnJhbWVkVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTIzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgIHB1YmxpYyBzdGF0aWMgbGV0IGhlYWRlclNpemUgICAgPSA0CisgIHB1YmxpYyBzdGF0aWMgbGV0IGluaXRGcmFtZVNpemUgPSAxMDI0CisgIHByaXZhdGUgc3RhdGljIGxldCBkZWZhdWx0TWF4TGVuZ3RoID0gMTYzODQwMDAKKworICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydAorICBwcml2YXRlIHZhciB3cml0ZUJ1ZmZlciA9IERhdGEoKQorCisgIHByaXZhdGUgdmFyIG1heFNpemUgICAgID0gVEZyYW1lZFRyYW5zcG9ydC5kZWZhdWx0TWF4TGVuZ3RoCisgIHByaXZhdGUgdmFyIHJlbWFpbmluZ0J5dGVzID0gMAorCisKKyAgcHVibGljIGluaXQodHJhbnNwb3J0OiBUVHJhbnNwb3J0LCBtYXhTaXplOiBJbnQpIHsKKyAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgIHNlbGYubWF4U2l6ZSA9IG1heFNpemUKKyAgfQorCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYuaW5pdCh0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgbWF4U2l6ZTogVEZyYW1lZFRyYW5zcG9ydC5kZWZhdWx0TWF4TGVuZ3RoKQorICB9CisKKyAgZnVuYyByZWFkSGVhZGVyKCkgdGhyb3dzIHsKKyAgICBsZXQgcmVhZCA9IHRyeSB0cmFuc3BvcnQucmVhZEFsbChzaXplOiBURnJhbWVkVHJhbnNwb3J0LmhlYWRlclNpemUpCisgICAgcmVtYWluaW5nQnl0ZXMgPSBJbnQoZGVjb2RlRnJhbWVTaXplKGRhdGE6IHJlYWQpKQorICB9CisKKyAgLy8vIE1hcms6IC0gVFRyYW5zcG9ydAorCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgd2hpbGUgKHJlbWFpbmluZ0J5dGVzIDw9IDApIHsKKyAgICAgICAgdHJ5IHJlYWRIZWFkZXIoKQorICAgIH0KKworICAgIGxldCB0b1JlYWQgPSBtaW4oc2l6ZSwgcmVtYWluaW5nQnl0ZXMpCisKKyAgICBpZiB0b1JlYWQgPCAwIHsKKyAgICAgICAgdHJ5IGNsb3NlKCkKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubmVnYXRpdmVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoXCh0b1JlYWQpKSEiKQorICAgIH0KKworICAgIGlmIHRvUmVhZCA+IG1heFNpemUgeworICAgICAgICB0cnkgY2xvc2UoKQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5zaXplTGltaXQobGltaXQ6IG1heFNpemUsIGdvdDogdG9SZWFkKSkKKyAgICB9CisKKyAgICByZXR1cm4gdHJ5IHRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHRvUmVhZCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICAvLyBjb3B5IGJ1ZmZlciBhbmQgcmVzZXQKKyAgICBsZXQgYnVmZiA9IHdyaXRlQnVmZmVyCisgICAgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKworICAgIGlmIGJ1ZmYuY291bnQgLSBURnJhbWVkVHJhbnNwb3J0LmhlYWRlclNpemUgPCAwIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgfQorCisgICAgbGV0IGZyYW1lU2l6ZSA9IGVuY29kZUZyYW1lU2l6ZShzaXplOiBVSW50MzIoYnVmZi5jb3VudCkpCisKKyAgICB0cnkgdHJhbnNwb3J0LndyaXRlKGRhdGE6IGZyYW1lU2l6ZSkKKyAgICB0cnkgdHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgdHJ5IHRyYW5zcG9ydC5mbHVzaCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHdyaXRlQnVmZmVyLmFwcGVuZChkYXRhKQorICB9CisKKworCisgIHByaXZhdGUgZnVuYyBlbmNvZGVGcmFtZVNpemUoc2l6ZTogVUludDMyKSAtPiBEYXRhIHsKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUgPj4gMjQpKV0pKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUgPj4gMTYpKV0pKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUgPj4gOCkpXSkpCisgICAgZGF0YS5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAoc2l6ZSkpXSkpCisKKyAgICByZXR1cm4gZGF0YQorICB9CisKKyAgcHJpdmF0ZSBmdW5jIGRlY29kZUZyYW1lU2l6ZShkYXRhOiBEYXRhKSAtPiBVSW50MzIgeworICAgIHZhciBzaXplOiBVSW50MzIKKyAgICBzaXplICA9IChVSW50MzIoZGF0YVswXSAmIDB4ZmYpIDw8IDI0KQorICAgIHNpemUgfD0gKFVJbnQzMihkYXRhWzFdICYgMHhmZikgPDwgMTYpCisgICAgc2l6ZSB8PSAoVUludDMyKGRhdGFbMl0gJiAweGZmKSA8PCAgOCkKKyAgICBzaXplIHw9IChVSW50MzIoZGF0YVszXSAmIDB4ZmYpKQorICAgIHJldHVybiBzaXplCisgIH0KKworICBwdWJsaWMgZnVuYyBjbG9zZSgpIHRocm93cyB7CisgICAgdHJ5IHRyYW5zcG9ydC5jbG9zZSgpCisgIH0KKworICBwdWJsaWMgZnVuYyBvcGVuKCkgdGhyb3dzIHsKKyAgICB0cnkgdHJhbnNwb3J0Lm9wZW4oKQorICB9CisKKyAgcHVibGljIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiB0cnkgdHJhbnNwb3J0LmlzT3BlbigpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzBhZjhlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTg0IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IERpc3BhdGNoCisKKworcHVibGljIGNsYXNzIFRIVFRQU2Vzc2lvblRyYW5zcG9ydDogVEFzeW5jVHJhbnNwb3J0IHsKKyAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWJsaWMgdmFyIHJlc3BvbnNlVmFsaWRhdGU6ICgoSFRUUFVSTFJlc3BvbnNlPywgRGF0YT8pIHRocm93cyAtPiBWb2lkKT8KKyAgICAKKyAgICB2YXIgc2Vzc2lvbjogVVJMU2Vzc2lvbgorICAgIHZhciB1cmw6IFVSTAorICAgIAorICAgIHB1YmxpYyBjbGFzcyBmdW5jIHNldHVwRGVmYXVsdHNGb3JTZXNzaW9uQ29uZmlndXJhdGlvbihfIGNvbmZpZzogVVJMU2Vzc2lvbkNvbmZpZ3VyYXRpb24sIHdpdGhQcm90b2NvbE5hbWUgcHJvdG9jb2xOYW1lOiBTdHJpbmc/KSB7CisgICAgICB2YXIgdGhyaWZ0Q29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiCisgICAgICAKKyAgICAgIGlmIGxldCBwcm90b2NvbE5hbWUgPSBwcm90b2NvbE5hbWUgeworICAgICAgICB0aHJpZnRDb250ZW50VHlwZSArPSAiOyBwPVwocHJvdG9jb2xOYW1lKSIKKyAgICAgIH0KKyAgICAgIAorICAgICAgY29uZmlnLnJlcXVlc3RDYWNoZVBvbGljeSA9IC5yZWxvYWRJZ25vcmluZ0xvY2FsQ2FjaGVEYXRhCisgICAgICBjb25maWcudXJsQ2FjaGUgPSBuaWwKKyAgICAgIAorICAgICAgY29uZmlnLmh0dHBTaG91bGRVc2VQaXBlbGluaW5nICA9IHRydWUKKyAgICAgIGNvbmZpZy5odHRwU2hvdWxkU2V0Q29va2llcyAgICAgPSB0cnVlCisgICAgICBjb25maWcuaHR0cEFkZGl0aW9uYWxIZWFkZXJzICAgID0gWyJDb250ZW50LVR5cGUiOiB0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2VwdCI6IHRocmlmdENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlci1BZ2VudCI6ICJUaHJpZnQvU3dpZnQgKFNlc3Npb24pIl0KKyAgICAgIAorICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbml0KHNlc3Npb246IFVSTFNlc3Npb24sIHVybDogVVJMKSB7CisgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCisgICAgICBzZWxmLnVybCA9IHVybAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZnVuYyBuZXdUcmFuc3BvcnQoKSAtPiBUSFRUUFNlc3Npb25UcmFuc3BvcnQgeworICAgICAgcmV0dXJuIFRIVFRQU2Vzc2lvblRyYW5zcG9ydChmYWN0b3J5OiBzZWxmKQorICAgIH0KKyAgICAKKyAgICBmdW5jIHZhbGlkYXRlUmVzcG9uc2UoXyByZXNwb25zZTogSFRUUFVSTFJlc3BvbnNlPywgZGF0YTogRGF0YT8pIHRocm93cyB7CisgICAgICB0cnkgcmVzcG9uc2VWYWxpZGF0ZT8ocmVzcG9uc2UsIGRhdGEpCisgICAgfQorICAgIAorICAgIGZ1bmMgdGFza1dpdGhSZXF1ZXN0KF8gcmVxdWVzdDogVVJMUmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXI6IEBlc2NhcGluZyAoRGF0YT8sIFVSTFJlc3BvbnNlPywgRXJyb3I/KSAtPiAoKSkgdGhyb3dzIC0+IFVSTFNlc3Npb25UYXNrIHsKKyAgICAgIAorICAgICAgbGV0IG5ld1Rhc2s6IFVSTFNlc3Npb25UYXNrPyA9IHNlc3Npb24uZGF0YVRhc2sod2l0aDogcmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXI6IGNvbXBsZXRpb25IYW5kbGVyKQorICAgICAgaWYgbGV0IG5ld1Rhc2sgPSBuZXdUYXNrIHsKKyAgICAgICAgcmV0dXJuIG5ld1Rhc2sKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6ICJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24gZGF0YSB0YXNrIikKKyAgICAgIH0KKyAgICB9ICAgIAorICB9CisgIAorICB2YXIgZmFjdG9yeTogRmFjdG9yeQorICB2YXIgcmVxdWVzdERhdGEgPSBEYXRhKCkKKyAgdmFyIHJlc3BvbnNlRGF0YSA9IERhdGEoKQorICB2YXIgcmVzcG9uc2VEYXRhT2Zmc2V0OiBJbnQgPSAwCisgIAorICBpbml0KGZhY3Rvcnk6IEZhY3RvcnkpIHsKKyAgICBzZWxmLmZhY3RvcnkgPSBmYWN0b3J5CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IHJlYWQgPSB0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUpCisgICAgaWYgcmVhZC5jb3VudCAhPSBzaXplIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICB9CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgYXZhaWwgPSByZXNwb25zZURhdGEuY291bnQgLSByZXNwb25zZURhdGFPZmZzZXQKKyAgICBsZXQgKHN0YXJ0LCBzdG9wKSA9IChyZXNwb25zZURhdGFPZmZzZXQsIHJlc3BvbnNlRGF0YU9mZnNldCArIG1pbihzaXplLCBhdmFpbCkpCisgICAgbGV0IHJlYWQgPSByZXNwb25zZURhdGEuc3ViZGF0YShpbjogc3RhcnQuLjxzdG9wKQorICAgIHJlc3BvbnNlRGF0YU9mZnNldCArPSByZWFkLmNvdW50CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICByZXF1ZXN0RGF0YS5hcHBlbmQoZGF0YSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goXyBjb21wbGV0ZWQ6IEBlc2NhcGluZyAoVEFzeW5jVHJhbnNwb3J0LCBFcnJvcj8pIC0+IFZvaWQpIHsKKyAgICB2YXIgZXJyb3I6IEVycm9yPworICAgIHZhciB0YXNrOiBVUkxTZXNzaW9uVGFzaz8KKyAgICAKKyAgICB2YXIgcmVxdWVzdCA9IFVSTFJlcXVlc3QodXJsOiBmYWN0b3J5LnVybCkKKyAgICByZXF1ZXN0Lmh0dHBNZXRob2QgPSAiUE9TVCIKKyAgICByZXF1ZXN0Lmh0dHBCb2R5ID0gIHJlcXVlc3REYXRhCisKKyAgICByZXF1ZXN0RGF0YSA9IERhdGEoKQorCisgICAgZG8geworICAgICAgdGFzayA9IHRyeSBmYWN0b3J5LnRhc2tXaXRoUmVxdWVzdChyZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcjogeyAoZGF0YSwgcmVzcG9uc2UsIHRhc2tFcnJvcikgaW4KKworICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgbmV0d29yaworICAgICAgICBpZiB0YXNrRXJyb3IgIT0gbmlsIHsKKyAgICAgICAgICAgIGVycm9yID0gVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudGltZWRPdXQpCisgICAgICAgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHJlc3BvbnNlIHR5cGUKKyAgICAgICAgaWYgdGFza0Vycm9yID09IG5pbCAmJiAhKHJlc3BvbnNlIGlzIEhUVFBVUkxSZXNwb25zZSkgeworICAgICAgICAgICAgZXJyb3IgPSBUSFRUUFRyYW5zcG9ydEVycm9yKGVycm9yOiAuaW52YWxpZFJlc3BvbnNlKQorICAgICAgICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlCisgICAgICAgIGlmIGxldCBodHRwUmVzcG9uc2UgPSByZXNwb25zZSBhcz8gSFRUUFVSTFJlc3BvbnNlIHsKKyAgICAgICAgICBpZiB0YXNrRXJyb3IgPT0gbmlsICYmIGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlICE9IDIwMCB7CisgICAgICAgICAgICBpZiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSA0MDEgeworICAgICAgICAgICAgICBlcnJvciA9IFRIVFRQVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5hdXRoZW50aWNhdGlvbikKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVycm9yID0gVEhUVFBUcmFuc3BvcnRFcnJvcihlcnJvcjogLmludmFsaWRTdGF0dXMoc3RhdHVzQ29kZTogaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpKQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvLyBBbGxvdyBmYWN0b3J5IHRvIGNoZWNrCisgICAgICAgICAgaWYgZXJyb3IgIT0gbmlsIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgdHJ5IHNlbGYuZmFjdG9yeS52YWxpZGF0ZVJlc3BvbnNlKGh0dHBSZXNwb25zZSwgZGF0YTogZGF0YSkKKyAgICAgICAgICAgIH0gY2F0Y2ggbGV0IHZhbGlkYXRlRXJyb3IgeworICAgICAgICAgICAgICBlcnJvciA9IHZhbGlkYXRlRXJyb3IKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgc2VsZi5yZXNwb25zZURhdGFPZmZzZXQgPSAwCisgICAgICAgICAgaWYgZXJyb3IgIT0gbmlsIHsKKyAgICAgICAgICAgIHNlbGYucmVzcG9uc2VEYXRhID0gRGF0YSgpCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYucmVzcG9uc2VEYXRhID0gZGF0YSA/PyBEYXRhKCkKKyAgICAgICAgICB9CisgICAgICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgICAgICB9CisgICAgICB9KQorICAgICAgCisgICAgfSBjYXRjaCBsZXQgdGFza0Vycm9yIHsKKyAgICAgIGVycm9yID0gdGFza0Vycm9yCisgICAgfQorICAgIAorICAgIGlmIGxldCBlcnJvciA9IGVycm9yLCB0YXNrID09IG5pbCB7CisgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgfQorICAgIHRhc2s/LnJlc3VtZSgpCisgIH0KKworICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgbGV0IGNvbXBsZXRlZCA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQorICAgIHZhciBpbnRlcm5hbEVycm9yOiBFcnJvcj8KKyAgICAKKyAgICBmbHVzaCgpIHsgXywgZXJyb3IgaW4KKyAgICAgIGludGVybmFsRXJyb3IgPSBlcnJvcgorICAgICAgY29tcGxldGVkLnNpZ25hbCgpCisgICAgfQorICAgIAorICAgIF8gPSBjb21wbGV0ZWQud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKKyAgICAKKyAgICBpZiBsZXQgZXJyb3IgPSBpbnRlcm5hbEVycm9yIHsKKyAgICAgIHRocm93IGVycm9yCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTGlzdC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RMaXN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzlkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTGlzdC5zd2lmdApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgc3RydWN0IFRMaXN0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IFJhbmRvbUFjY2Vzc0NvbGxlY3Rpb24sIE11dGFibGVDb2xsZWN0aW9uLCBFeHByZXNzaWJsZUJ5QXJyYXlMaXRlcmFsLCBUU2VyaWFsaXphYmxlLCBIYXNoYWJsZSB7CisgIHB1YmxpYyB0eXBlYWxpYXMgU3RvcmFnZSA9IEFycmF5PEVsZW1lbnQ+CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworCisgIGludGVybmFsIHZhciBzdG9yYWdlID0gU3RvcmFnZSgpCisgIHB1YmxpYyBpbml0KCkgeyB9CisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoZWxlbWVudHMpCisgIH0KKyAgcHVibGljIGluaXQ8U291cmNlIDogU2VxdWVuY2U+KF8gc2VxdWVuY2U6IFNvdXJjZSkgd2hlcmUgU291cmNlLkl0ZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudCB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2Uoc2VxdWVuY2UpCisgIH0KKworICAvLy8gTWFyazogSGFzaGFibGUKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyBlbGVtZW50Lmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBNYXJrOiBUU2VyaWFsaXphYmxlCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAubGlzdCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVExpc3QgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRMaXN0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGVsZW1lbnRUeXBlKSkKKyAgICB9CisgICAgdmFyIGxpc3QgPSBUTGlzdCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGVsZW1lbnQgPSB0cnkgRWxlbWVudC5yZWFkKGZyb206IHByb3RvKQorICAgICAgbGlzdC5zdG9yYWdlLmFwcGVuZChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZExpc3RFbmQoKQorICAgIHJldHVybiBsaXN0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciBlbGVtZW50IGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZShlbGVtZW50LCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZUxpc3RFbmQoKQorICB9CisKKyAgLy8vIE1hcms6IE11dGFibGVDb2xsZWN0aW9uCisgIAorICBwdWJsaWMgdHlwZWFsaWFzIFN1YlNlcXVlbmNlID0gU3RvcmFnZS5TdWJTZXF1ZW5jZQorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICAKKyAgcHVibGljIHN1YnNjcmlwdChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtwb3NpdGlvbl0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChyYW5nZTogUmFuZ2U8SW5kZXg+KSAtPiBTdWJTZXF1ZW5jZSB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3JhbmdlXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtyYW5nZV0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4OiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleAorICB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5lbmRJbmRleAorICB9CisgIAorICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYWZ0ZXIgaTogaW5vdXQgSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZvcm1JbmRleChiZWZvcmUgaTogaW5vdXQgSW50KSB7CisgICAgc3RvcmFnZS5mb3JtSW5kZXgoYmVmb3JlOiAmaSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoYWZ0ZXIgaTogSW5kZXgpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChhZnRlcjogaSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGluZGV4KGJlZm9yZSBpOiBJbnQpIC0+IEludCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYmVmb3JlOiBpKQorICB9CisKK30KKworZXh0ZW5zaW9uIFRMaXN0IDogUmFuZ2VSZXBsYWNlYWJsZUNvbGxlY3Rpb24geworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZXBsYWNlU3VicmFuZ2U8QzogQ29sbGVjdGlvbj4oXyBzdWJyYW5nZTogUmFuZ2U8SW5kZXg+LCB3aXRoIG5ld0VsZW1lbnRzOiBDKQorICAgIHdoZXJlIEMuSXRlcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50IHsKKyAgICBzdG9yYWdlLnJlcGxhY2VTdWJyYW5nZShzdWJyYW5nZSwgd2l0aDogbmV3RWxlbWVudHMpCisgIH0KK30KKworZXh0ZW5zaW9uIFRMaXN0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVExpc3Q8RWxlbWVudD4sIHJoczogVExpc3Q8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UuZWxlbWVudHNFcXVhbChyaHMuc3RvcmFnZSkgeyAkMCA9PSAkMSB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTWFwLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1hcC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTgwMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1hcC5zd2lmdApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgc3RydWN0IFRNYXA8S2V5IDogVFNlcmlhbGl6YWJsZSAmIEhhc2hhYmxlLCBWYWx1ZSA6IFRTZXJpYWxpemFibGU+OiBDb2xsZWN0aW9uLCBFeHByZXNzaWJsZUJ5RGljdGlvbmFyeUxpdGVyYWwsIEhhc2hhYmxlLCBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHR5cGVhbGlhcyBTdG9yYWdlID0gRGljdGlvbmFyeTxLZXksIFZhbHVlPgorICBwdWJsaWMgdHlwZWFsaWFzIEVsZW1lbnQgPSBTdG9yYWdlLkVsZW1lbnQKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleERpc3RhbmNlID0gU3RvcmFnZS5JbmRleERpc3RhbmNlCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworICBwdWJsaWMgdHlwZWFsaWFzIFN1YlNlcXVlbmNlID0gU3RvcmFnZS5TdWJTZXF1ZW5jZQorICBpbnRlcm5hbCB2YXIgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICAKKyAgLy8vIE1hcms6IEJlIExpa2UgRGljdGlvbmFyeQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXhGb3JLZXkoXyBrZXk6IEtleSkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlVmFsdWUoXyB2YWx1ZTogVmFsdWUsIGZvcktleSBrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gdXBkYXRlVmFsdWUodmFsdWUsIGZvcktleToga2V5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KF8gaW5kZXg6IERpY3Rpb25hcnlJbmRleDxLZXksIFZhbHVlPikgLT4gKEtleSwgVmFsdWUpIHsKKyAgICByZXR1cm4gcmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlVmFsdWVGb3JLZXkoXyBrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVWYWx1ZShmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIGluaXQobWluaW11bUNhcGFjaXR5OiBJbnQpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShtaW5pbXVtQ2FwYWNpdHk6IG1pbmltdW1DYXBhY2l0eSkKKyAgfQorICAKKyAgLy8vIGluaXQgZnJvbSBEaWN0aW9uYXJ5PEssVj4KKyAgcHVibGljIGluaXQoXyBkaWN0OiBbS2V5OiBWYWx1ZV0pIHsKKyAgICBzdG9yYWdlID0gZGljdAorICB9CisKKyAgLy8vIHJlYWQgb25seSBhY2Nlc3MgdG8gc3RvcmFnZSBpZiBuZWVkZWQgYXMgRGljdGlvbmFyeTxLLFY+CisgIHB1YmxpYyB2YXIgZGljdGlvbmFyeTogW0tleTogVmFsdWVdIHsKKyAgICByZXR1cm4gc3RvcmFnZQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0IChrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2Vba2V5XQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtrZXldID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIC8vLyBNYXJrOiBDb2xsZWN0aW9uCisgIAorICBwdWJsaWMgdmFyIGluZGljZXM6IEluZGljZXMgeworICAgIHJldHVybiBzdG9yYWdlLmluZGljZXMKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZGlzdGFuY2UoZnJvbSBzdGFydDogSW5kZXgsIHRvIGVuZDogSW5kZXgpIC0+IEluZGV4RGlzdGFuY2UgeworICAgIHJldHVybiBzdG9yYWdlLmRpc3RhbmNlKGZyb206IHN0YXJ0LCB0bzogZW5kKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlKSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UsIGxpbWl0ZWRCeSBsaW1pdDogSW5kZXgpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4sIGxpbWl0ZWRCeTogbGltaXQpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQocG9zaXRpb246IEluZGV4KSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgfQorICAKKyAgLy8vIE1hcms6IEluZGV4YWJsZUJhc2UKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5lbmRJbmRleCB9CisgIHB1YmxpYyBmdW5jIGluZGV4KGFmdGVyIGk6IEluZGV4KSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYWZ0ZXI6IGkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZvcm1JbmRleChhZnRlciBpOiBpbm91dCBJbmRleCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGFmdGVyOiAmaSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChib3VuZHM6IFJhbmdlPEluZGV4PikgLT4gU3ViU2VxdWVuY2UgeworICAgIHJldHVybiBzdG9yYWdlW2JvdW5kc10KKyAgfQorICAKKyAgLy8vIE1hcms6IERpY3Rpb25hcnlMaXRlcmFsQ29udmVydGlibGUKKyAgCisgIHB1YmxpYyBpbml0KGRpY3Rpb25hcnlMaXRlcmFsIGVsZW1lbnRzOiAoS2V5LCBWYWx1ZSkuLi4pIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBlbGVtZW50cyB7CisgICAgICBzdG9yYWdlW2tleV0gPSB2YWx1ZQorICAgIH0KKyAgfQorCisgIC8vLyBNYXJrOiBIYXNoYWJsZQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisga2V5Lmhhc2hWYWx1ZQorICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrIHZhbHVlLmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBNYXJrOiBUU2VyaWFsaXphYmxlCisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLm1hcCB9CisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRNYXAgeworCisgICAgbGV0IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRNYXBCZWdpbigpCisgICAgaWYgc2l6ZSA+IDAgeworICAgICAgaWYga2V5VHlwZSAhPSBLZXkudGhyaWZ0VHlwZSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJVbmV4cGVjdGVkIFRNYXAgS2V5IFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZToga2V5VHlwZSkpCisgICAgICB9CisgICAgICBpZiB2YWx1ZVR5cGUgIT0gVmFsdWUudGhyaWZ0VHlwZSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJVbmV4cGVjdGVkIFRNYXAgVmFsdWUgVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC51bmV4cGVjdGVkVHlwZSh0eXBlOiB2YWx1ZVR5cGUpKQorICAgICAgfQorICAgIH0KKworICAgIHZhciBtYXAgPSBUTWFwKCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQga2V5ID0gdHJ5IEtleS5yZWFkKGZyb206IHByb3RvKQorICAgICAgbGV0IHZhbHVlID0gdHJ5IFZhbHVlLnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBtYXAuc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRNYXBFbmQoKQorICAgIHJldHVybiBtYXAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBCZWdpbihrZXlUeXBlOiBLZXkudGhyaWZ0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IFZhbHVlLnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc2VsZi5zdG9yYWdlIHsKKyAgICAgIHRyeSBLZXkud3JpdGUoa2V5LCB0bzogcHJvdG8pCisgICAgICB0cnkgVmFsdWUud3JpdGUodmFsdWUsIHRvOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTWFwRW5kKCkKKyAgfQorfQorCisvLy8gTWFyazogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUKKworZXh0ZW5zaW9uIFRNYXAgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworLy8vIE1hcms6IEVxdWF0YWJsZQorCitwdWJsaWMgZnVuYyA9PTxLZXksIFZhbHVlPihsaHM6IFRNYXA8S2V5LFZhbHVlPiwgcmhzOiBUTWFwPEtleSwgVmFsdWU+KSAtPiBCb29sIHsKKyAgaWYgbGhzLmNvdW50ICE9IHJocy5jb3VudCB7CisgICAgcmV0dXJuIGZhbHNlCisgIH0KKyAgcmV0dXJuIGxocy5zdG9yYWdlLmVsZW1lbnRzRXF1YWwocmhzLnN0b3JhZ2UpIHsgJDAua2V5ID09ICQxLmtleSAmJiAkMC52YWx1ZSA9PSAkMS52YWx1ZSB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTWVtb3J5QnVmZmVyVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU4YjZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIHB1YmxpYyBwcml2YXRlKHNldCkgdmFyIHJlYWRCdWZmZXIgPSBEYXRhKCkKKyAgcHVibGljIHByaXZhdGUoc2V0KSB2YXIgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKyAgCisgIHB1YmxpYyBwcml2YXRlKHNldCkgdmFyIHBvc2l0aW9uID0gMAorCisgIHB1YmxpYyB2YXIgYnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcjogSW50IHsKKyAgICByZXR1cm4gcmVhZEJ1ZmZlci5jb3VudCAtIHBvc2l0aW9uCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGNvbnN1bWVCdWZmZXIoc2l6ZTogSW50KSB7CisgICAgcG9zaXRpb24gKz0gc2l6ZQorICB9CisgIHB1YmxpYyBmdW5jIGNsZWFyKCkgeworICAgIHJlYWRCdWZmZXIgPSBEYXRhKCkKKyAgICB3cml0ZUJ1ZmZlciA9IERhdGEoKQorICB9CisgIAorICAKKyAgcHJpdmF0ZSB2YXIgZmx1c2hIYW5kbGVyOiAoKFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQsIERhdGEpIC0+ICgpKT8KKyAgCisgIHB1YmxpYyBpbml0KGZsdXNoSGFuZGxlcjogKChUTWVtb3J5QnVmZmVyVHJhbnNwb3J0LCBEYXRhKSAtPiAoKSk/ID0gbmlsKSB7CisgICAgc2VsZi5mbHVzaEhhbmRsZXIgPSBmbHVzaEhhbmRsZXIKKyAgfQorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQocmVhZEJ1ZmZlcjogRGF0YSwgZmx1c2hIYW5kbGVyOiAoKFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQsIERhdGEpIC0+ICgpKT8gPSBuaWwpIHsKKyAgICBzZWxmLmluaXQoKQorICAgIHNlbGYucmVhZEJ1ZmZlciA9IHJlYWRCdWZmZXIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVzZXQocmVhZEJ1ZmZlcjogRGF0YSA9IERhdGEoKSwgd3JpdGVCdWZmZXI6IERhdGEgPSBEYXRhKCkpIHsKKyAgICBzZWxmLnJlYWRCdWZmZXIgPSByZWFkQnVmZmVyCisgICAgc2VsZi53cml0ZUJ1ZmZlciA9IHdyaXRlQnVmZmVyCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IGFtb3VudFRvUmVhZCA9IG1pbihieXRlc1JlbWFpbmluZ0luQnVmZmVyLCBzaXplKQorICAgIGlmIGFtb3VudFRvUmVhZCA+IDAgeworICAgICAgbGV0IHJldCA9IHJlYWRCdWZmZXIuc3ViZGF0YShpbjogUmFuZ2UodW5jaGVja2VkQm91bmRzOiAobG93ZXI6IHBvc2l0aW9uLCB1cHBlcjogcG9zaXRpb24gKyBhbW91bnRUb1JlYWQpKSkKKyAgICAgIHBvc2l0aW9uICs9IHJldC5jb3VudAorICAgICAgcmV0dXJuIHJldAorICAgIH0KKyAgICByZXR1cm4gRGF0YSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgd3JpdGVCdWZmZXIuYXBwZW5kKGRhdGEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICBmbHVzaEhhbmRsZXI/KHNlbGYsIHdyaXRlQnVmZmVyKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNdWx0aXBsZXhlZFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYThkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDQ3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2w8UHJvdG9jb2w6IFRQcm90b2NvbD46IFRXcmFwcGVkUHJvdG9jb2w8UHJvdG9jb2w+IHsKKyAgcHVibGljIGxldCBzZXBhcmF0b3IgPSAiOiIKKworICBwdWJsaWMgdmFyIHNlcnZpY2VOYW1lID0gIiIKKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCwgc2VydmljZU5hbWU6IFN0cmluZykgeworICAgIHNlbGYuaW5pdChvbjogdHJhbnNwb3J0KQorICAgIHNlbGYuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZSAgICAKKyAgfQorCisgIG92ZXJyaWRlIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzIHsKKyAgICBzd2l0Y2ggbWVzc2FnZVR5cGUgeworICAgIGNhc2UgLmNhbGwsIC5vbmV3YXk6CisgICAgICB2YXIgc2VydmljZUZ1bmN0aW9uID0gc2VydmljZU5hbWUKKyAgICAgIHNlcnZpY2VGdW5jdGlvbiArPSBzZXJ2aWNlTmFtZSA9PSAiIiA/ICIiIDogc2VwYXJhdG9yCisgICAgICBzZXJ2aWNlRnVuY3Rpb24gKz0gbmFtZQorICAgICAgcmV0dXJuIHRyeSBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBzZXJ2aWNlRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ5IHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFByb2Nlc3Nvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm9jZXNzb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmMjIyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm9jZXNzb3Iuc3dpZnQKQEAgLTAsMCArMSwyOSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwdWJsaWMgdHlwZWFsaWFzIFRQcm9jZXNzb3JNZXNzYWdlSGFuZGxlcjxUPiA9IChJbnQsIFRQcm90b2NvbCwgVFByb3RvY29sLCBUKSAtPiBWb2lkCisKK3B1YmxpYyBwcm90b2NvbCBUUHJvY2Vzc29yIHsKKyAgYXNzb2NpYXRlZHR5cGUgU2VydmljZQorICB2YXIgc2VydmljZTogU2VydmljZSB7IGdldCBzZXQgfQorICBmdW5jIHByb2Nlc3Mob24gaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MKKyAgaW5pdChzZXJ2aWNlOiBTZXJ2aWNlKQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlNGEyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKy8vCisKK3B1YmxpYyBlbnVtIFRNZXNzYWdlVHlwZTogSW50MzIgeworICBjYXNlIGNhbGwgPSAxCisgIGNhc2UgcmVwbHkgPSAyCisgIGNhc2UgZXhjZXB0aW9uID0gMworICBjYXNlIG9uZXdheSA9IDQKK30KKworcHVibGljIGVudW0gVFR5cGU6IEludDMyIHsKKyAgY2FzZSBzdG9wICAgICA9IDAKKyAgY2FzZSB2b2lkICAgICA9IDEKKyAgY2FzZSBib29sICAgICA9IDIKKyAgY2FzZSBpOCAgICAgICA9IDMKKyAgY2FzZSBkb3VibGUgICA9IDQKKyAgY2FzZSBpMTYgICAgICA9IDYKKyAgY2FzZSBpMzIgICAgICA9IDgKKyAgY2FzZSBpNjQgICAgICA9IDEwCisgIGNhc2Ugc3RyaW5nICAgPSAxMQorICBjYXNlIGBzdHJ1Y3RgID0gMTIKKyAgY2FzZSBtYXAgICAgICA9IDEzCisgIGNhc2Ugc2V0ICAgICAgPSAxNAorICBjYXNlIGxpc3QgICAgID0gMTUKKyAgY2FzZSB1dGY4ICAgICA9IDE2CisgIGNhc2UgdXRmMTYgICAgPSAxNworfQorCitwdWJsaWMgcHJvdG9jb2wgVFByb3RvY29sIHsKKyAgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydCB7IGdldCBzZXQgfQorICBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkKKyAgLy8gUmVhZGluZyBNZXRob2RzCisgIAorICBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cworICBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcKKyAgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cworICBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkTWFwRW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZFNldEVuZCgpIHRocm93cworICBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cworICAKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZworICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbAorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gVUludDgKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2CisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMgorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50NjQKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZQorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YQorICAKKyAgLy8gV3JpdGluZyBtZXRob2RzCisgIAorICBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBTdHJpbmcpIHRocm93cworICBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLCBmaWVsZElEOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cworCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU3RyaW5nKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBCb29sKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBVSW50OCkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBEYXRhKSB0aHJvd3MKK30KKworcHVibGljIGV4dGVuc2lvbiBUUHJvdG9jb2wgeworICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkVmFsdWUoXyB2YWx1ZTogVFNlcmlhbGl6YWJsZSwgbmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgaWQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW4obmFtZTogbmFtZSwgdHlwZTogdHlwZSwgZmllbGRJRDogaWQpCisgICAgdHJ5IHZhbHVlLndyaXRlKHRvOiBzZWxmKQorICAgIHRyeSB3cml0ZUZpZWxkRW5kKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHZhbGlkYXRlVmFsdWUoXyB2YWx1ZTogQW55PywgbmFtZWQgbmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIGlmIHZhbHVlID09IG5pbCB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6ICJNaXNzaW5nIHJlcXVpcmVkIHZhbHVlIGZvciBmaWVsZDogXChuYW1lKSIpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkUmVzdWx0TWVzc2FnZUJlZ2luKCkgdGhyb3dzIHsKKyAgICBsZXQgKF8sIHR5cGUsIF8pID0gdHJ5IHJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICBpZiB0eXBlID09IC5leGNlcHRpb24geworICAgICAgbGV0IHggPSB0cnkgcmVhZEV4Y2VwdGlvbigpCisgICAgICB0aHJvdyB4CisgICAgfQorICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRXhjZXB0aW9uKCkgdGhyb3dzIC0+IFRBcHBsaWNhdGlvbkVycm9yIHsKKyAgICByZXR1cm4gdHJ5IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoZnJvbTogc2VsZikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWUgbmFtZTogU3RyaW5nLCBzZXF1ZW5jZUlEOiBJbnQzMiwgZXg6IFRBcHBsaWNhdGlvbkVycm9yKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiAuZXhjZXB0aW9uLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIHRyeSBleC53cml0ZSh0bzogc2VsZikKKyAgICB0cnkgd3JpdGVNZXNzYWdlRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc2tpcCh0eXBlOiBUVHlwZSkgdGhyb3dzIHsKKyAgICBzd2l0Y2ggdHlwZSB7CisgICAgY2FzZSAuYm9vbDogICBfID0gdHJ5IHJlYWQoKSBhcyBCb29sCisgICAgY2FzZSAuaTg6ICAgXyA9IHRyeSByZWFkKCkgYXMgVUludDgKKyAgICBjYXNlIC5pMTY6ICAgIF8gPSB0cnkgcmVhZCgpIGFzIEludDE2CisgICAgY2FzZSAuaTMyOiAgICBfID0gdHJ5IHJlYWQoKSBhcyBJbnQzMgorICAgIGNhc2UgLmk2NDogICAgXyA9IHRyeSByZWFkKCkgYXMgSW50NjQKKyAgICBjYXNlIC5kb3VibGU6IF8gPSB0cnkgcmVhZCgpIGFzIERvdWJsZQorICAgIGNhc2UgLnN0cmluZzogXyA9IHRyeSByZWFkKCkgYXMgU3RyaW5nCisgICAgICAKKyAgICBjYXNlIC5zdHJ1Y3Q6CisgICAgICBfID0gdHJ5IHJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICB3aGlsZSB0cnVlIHsKKyAgICAgICAgbGV0IChfLCBmaWVsZFR5cGUsIF8pID0gdHJ5IHJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgaWYgZmllbGRUeXBlID09IC5zdG9wIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGZpZWxkVHlwZSkKKyAgICAgICAgdHJ5IHJlYWRGaWVsZEVuZCgpCisgICAgICB9CisgICAgICB0cnkgcmVhZFN0cnVjdEVuZCgpCisgICAgICAKKyAgICAgIAorICAgIGNhc2UgLm1hcDoKKyAgICAgIGxldCAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKSA9IHRyeSByZWFkTWFwQmVnaW4oKQorICAgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgICB0cnkgc2tpcCh0eXBlOiBrZXlUeXBlKQorICAgICAgICB0cnkgc2tpcCh0eXBlOiB2YWx1ZVR5cGUpCisgICAgICB9CisgICAgICB0cnkgcmVhZE1hcEVuZCgpCisgICAgICAKKyAgICAgIAorICAgIGNhc2UgLnNldDoKKyAgICAgIGxldCAoZWxlbVR5cGUsIHNpemUpID0gdHJ5IHJlYWRTZXRCZWdpbigpCisgICAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGVsZW1UeXBlKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRTZXRFbmQoKQorICAgICAgCisgICAgY2FzZSAubGlzdDoKKyAgICAgIGxldCAoZWxlbVR5cGUsIHNpemUpID0gdHJ5IHJlYWRMaXN0QmVnaW4oKQorICAgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgICB0cnkgc2tpcCh0eXBlOiBlbGVtVHlwZSkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkTGlzdEVuZCgpCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybgorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2xFcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQxNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBzdHJ1Y3QgVFByb3RvY29sRXJyb3IgOiBURXJyb3IgeworICBwdWJsaWMgaW5pdCgpIHsgfQorCisgIHB1YmxpYyBlbnVtIENvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIGludmFsaWREYXRhCisgICAgY2FzZSBuZWdhdGl2ZVNpemUKKyAgICBjYXNlIHNpemVMaW1pdChsaW1pdDogSW50LCBnb3Q6IEludCkKKyAgICBjYXNlIGJhZFZlcnNpb24oZXhwZWN0ZWQ6IFN0cmluZywgZ290OiBTdHJpbmcpCisgICAgY2FzZSBub3RJbXBsZW1lbnRlZAorICAgIGNhc2UgZGVwdGhMaW1pdAorCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgcmV0dXJuIDAKKyAgICAgIGNhc2UgLmludmFsaWREYXRhOiAgICByZXR1cm4gMQorICAgICAgY2FzZSAubmVnYXRpdmVTaXplOiAgIHJldHVybiAyCisgICAgICBjYXNlIC5zaXplTGltaXQ6ICAgICAgcmV0dXJuIDMKKyAgICAgIGNhc2UgLmJhZFZlcnNpb246ICAgICByZXR1cm4gNAorICAgICAgY2FzZSAubm90SW1wbGVtZW50ZWQ6IHJldHVybiA1CisgICAgICBjYXNlIC5kZXB0aExpbWl0OiAgICAgcmV0dXJuIDYKKyAgICAgIH0KKworICAgIH0KKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgIHJldHVybiAiVW5rbm93biBUUHJvdG9jb2xFcnJvciIKKyAgICAgIGNhc2UgLmludmFsaWREYXRhOiAgICByZXR1cm4gIkludmFsaWQgRGF0YSIKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogICByZXR1cm4gIk5lZ2F0aXZlIFNpemUiCisgICAgICBjYXNlIC5zaXplTGltaXQobGV0IGxpbWl0LCBsZXQgZ290KToKKyAgICAgICAgcmV0dXJuICJNZXNzYWdlIGV4Y2VlZHMgc2l6ZSBsaW1pdCBvZiBcKGxpbWl0KSAocmVjZWl2ZWQ6IFwoZ290KSIKKyAgICAgIGNhc2UgLmJhZFZlcnNpb24obGV0IGV4cGVjdGVkLCBsZXQgZ290KToKKyAgICAgICAgcmV0dXJuICJCYWQgVmVyc2lvbi4gKEV4cGVjdGVkOiBcKGV4cGVjdGVkKSwgR290OiBcKGdvdCkiCisgICAgICBjYXNlIC5ub3RJbXBsZW1lbnRlZDogcmV0dXJuICJOb3QgSW1wbGVtZW50ZWQiCisgICAgICBjYXNlIC5kZXB0aExpbWl0OiAgICAgcmV0dXJuICJEZXB0aCBMaW1pdCIKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgZW51bSBFeHRlbmRlZEVycm9yQ29kZSA6IFRFcnJvckNvZGUgeworICAgIGNhc2UgdW5rbm93bgorICAgIGNhc2UgbWlzc2luZ1JlcXVpcmVkRmllbGQoZmllbGROYW1lOiBTdHJpbmcpCisgICAgY2FzZSB1bmV4cGVjdGVkVHlwZSh0eXBlOiBUVHlwZSkKKyAgICBjYXNlIG1pc21hdGNoZWRQcm90b2NvbChleHBlY3RlZDogU3RyaW5nLCBnb3Q6IFN0cmluZykKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICByZXR1cm4gMTAwMAorICAgICAgY2FzZSAubWlzc2luZ1JlcXVpcmVkRmllbGQ6IHJldHVybiAxMDAxCisgICAgICBjYXNlIC51bmV4cGVjdGVkVHlwZTogICAgICAgcmV0dXJuIDEwMDIKKyAgICAgIGNhc2UgLm1pc21hdGNoZWRQcm90b2NvbDogICByZXR1cm4gMTAwMworICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gVFByb3RvY29sRXh0ZW5kZWRFcnJvciIKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXF1aXJlZEZpZWxkKGxldCBmaWVsZE5hbWUpOiAgICAgICAgcmV0dXJuICJNaXNzaW5nIFJlcXVpcmVkIEZpZWxkOiBcKGZpZWxkTmFtZSkiCisgICAgICBjYXNlIC51bmV4cGVjdGVkVHlwZShsZXQgdHlwZSk6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5leHBlY3RlZCBUeXBlIFwodHlwZS5zZWxmKSIKKyAgICAgIGNhc2UgLm1pc21hdGNoZWRQcm90b2NvbChsZXQgZXhwZWN0ZWQsIGxldCBnb3QpOiAgcmV0dXJuICJNaXNtYXRjaGVkIFByb3RvY29sLiAgKEV4cGVjdGVkOiBcKGV4cGVjdGVkKSwgZ290IFwoZ290KSkiCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZhciBleHRlbmRlZEVycm9yOiBFeHRlbmRlZEVycm9yQ29kZT8gPSBuaWwKKworICBwdWJsaWMgaW5pdChlcnJvcjogQ29kZSA9IC51bmtub3duLAorICAgICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsLAorICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiBFeHRlbmRlZEVycm9yQ29kZT8gPSBuaWwpIHsKKyAgICBzZWxmLmVycm9yID0gZXJyb3IKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgc2VsZi5leHRlbmRlZEVycm9yID0gZXh0ZW5kZWRFcnJvcgorICB9CisKKyAgLy8vIE1hcms6IFRFcnJvcgorICBwdWJsaWMgdmFyIGVycm9yOiBDb2RlID0gLnVua25vd24KKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBDb2RlIHsgcmV0dXJuIC51bmtub3duIH0KKworICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgIHZhciBvdXQgPSAiXChUUHJvdG9jb2xFcnJvci5zZWxmKTogIChcKGVycm9yLnRocmlmdEVycm9yQ29kZSkgXChlcnJvci5kZXNjcmlwdGlvbilcbiIKKyAgICBpZiBsZXQgZXh0ZW5kZWRFcnJvciA9IGV4dGVuZGVkRXJyb3IgeworICAgICAgb3V0ICs9ICJUUHJvdG9jb2xFeHRlbmRlZEVycm9yIChcKGV4dGVuZGVkRXJyb3IudGhyaWZ0RXJyb3JDb2RlKSk6IFwoZXh0ZW5kZWRFcnJvci5kZXNjcmlwdGlvbikiCisgICAgfQorICAgIGlmIGxldCBtZXNzYWdlID0gbWVzc2FnZSB7CisgICAgICBvdXQgKz0gIk1lc3NhZ2U6IFwobWVzc2FnZSkiCisgICAgfQorICAgIHJldHVybiBvdXQKKyAgfQorfQorCisKKy8vLyBXcmFwcGVyIGZvciBUcmFuc3BvcnQgZXJyb3JzIGluIFByb3RvY29scy4gIEluc3BpcmVkIGJ5IFRocmlmdC1Db2NvYSBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IKKy8vLyBtYWNyby4gIE1vZGlmaWVkIHRvIGJlIG1vcmUgU3dpZnQteS4gIENhdGNoZXMgYW55IFRFcnJvciB0aHJvd24gd2l0aGluIHRoZSBibG9jayBhbmQKKy8vLyByZXRocm93cyBhIGdpdmVuIFRQcm90b2NvbEVycm9yLCB0aGUgb3JpZ2luYWwgZXJyb3IncyBkZXNjcmlwdGlvbiBpcyBhcHBlbmRlZCB0byB0aGUgbmV3CisvLy8gVFByb3RvY29sRXJyb3IncyBtZXNzYWdlLiAgc291cmNlRmlsZSwgc291cmNlTGluZSwgc291cmNlTWV0aG9kIGFyZSBhdXRvLXBvcHVsYXRlZCBhbmQgc2hvdWxkCisvLy8gYmUgaWdub3JlZCB3aGVuIGNhbGxpbmcuCisvLy8KKy8vLyAtIHBhcmFtZXRlciBlcnJvcjogICAgICAgIFRQcm90b2NvbEVycm9yIHRvIHRocm93IGlmIHRoZSBibG9jayB0aHJvd3MKKy8vLyAtIHBhcmFtZXRlciBzb3VyY2VGaWxlOiAgIHRocm93aW5nIGZpbGUsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBzb3VyY2VMaW5lOiAgIHRocm93aW5nIGxpbmUsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBzb3VyY2VNZXRob2Q6IHRocm93aW5nIG1ldGhvZCwgYXV0b3BvcHVsYXRlZAorLy8vIC0gcGFyYW1ldGVyIGJsb2NrOiAgICAgICAgdGhyb3dpbmcgYmxvY2sKKy8vLworLy8vIC0gdGhyb3dzOiBUUHJvdG9jb2xFcnJvciAgRGVmYXVsdCBpcyBUUHJvdG9jb2xFcnJvci5FcnJvckNvZGUudW5rbm93bi4gIFVuZGVybHlpbmcKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yJ3MgZGVzY3JpcHRpb24gYXBwZW5kZWQgdG8gVFByb3RvY29sRXJyb3IubWVzc2FnZQorZnVuYyBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IgPSBUUHJvdG9jb2xFcnJvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlOiBTdHJpbmcgPSAjZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTGluZTogSW50ID0gI2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU1ldGhvZDogU3RyaW5nID0gI2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jazogKCkgdGhyb3dzIC0+ICgpKSB0aHJvd3MgeworICAvLyBOZWVkIG11dGFibGUgY29weQorICB2YXIgZXJyb3IgPSBlcnJvcgorICBkbyB7CisgICAgdHJ5IGJsb2NrKCkKKyAgfSBjYXRjaCBsZXQgZXJyIGFzIFRFcnJvciB7CisgICAgdmFyIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlID8/ICIiCisgICAgbWVzc2FnZSArPSAiXG5GaWxlOiBcKHNvdXJjZUZpbGUpXG4iCisgICAgbWVzc2FnZSArPSAiTGluZTogXChzb3VyY2VMaW5lKVxuIgorICAgIG1lc3NhZ2UgKz0gIk1ldGhvZDogXChzb3VyY2VNZXRob2QpIgorICAgIG1lc3NhZ2UgKz0gIlxuT3JpZ2luYWwgRXJyb3I6XG4iICsgZXJyLmRlc2NyaXB0aW9uCisgICAgZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2UKKyAgICB0aHJvdyBlcnJvcgorICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiNTkwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorcHVibGljIGNsYXNzIFRTU0xTb2NrZXRUcmFuc3BvcnQgeworICBpbml0KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IFVJbnQxNikgeworICAgIC8vIEZJWE1FIQorICAgIGFzc2VydChmYWxzZSwgIlNlY3VyaXR5IG5vdCBhdmFpbGFibGUgaW4gTGludXgsIFRTU0xTb2NrZXRUcmFuc3BvcnQgVW5hdmlsYWJsZSBmb3Igbm93IikKKyAgfQorfQorI2Vsc2UKK2xldCBpc0xpdHRsZUVuZGlhbiA9IEludChPU0hvc3RCeXRlT3JkZXIoKSkgPT0gT1NMaXR0bGVFbmRpYW4KK2xldCBodG9ucyAgPSBpc0xpdHRsZUVuZGlhbiA/IF9PU1N3YXBJbnQxNiA6IHsgJDAgfQorbGV0IGh0b25sICA9IGlzTGl0dGxlRW5kaWFuID8gX09TU3dhcEludDMyIDogeyAkMCB9CisKK3B1YmxpYyBjbGFzcyBUU1NMU29ja2V0VHJhbnNwb3J0OiBUU3RyZWFtVHJhbnNwb3J0IHsKKyAgdmFyIHNzbEhvc3RuYW1lOiBTdHJpbmcKKyAgdmFyIHNkOiBJbnQzMiA9IDAKKyAgCisgIHB1YmxpYyBpbml0KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IFVJbnQxNikgdGhyb3dzIHsKKyAgICBzc2xIb3N0bmFtZSA9IGhvc3RuYW1lCisgICAgdmFyIHJlYWRTdHJlYW06IFVubWFuYWdlZDxDRlJlYWRTdHJlYW0+PworICAgIHZhciB3cml0ZVN0cmVhbTogVW5tYW5hZ2VkPENGV3JpdGVTdHJlYW0+PworICAgIAorICAgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KKyAgICB2YXIgcGluOiBzb2NrYWRkcl9pbiA9IHNvY2thZGRyX2luKCkKKyAgICB2YXIgaHA6IFVuc2FmZU11dGFibGVQb2ludGVyPGhvc3RlbnQ+PyA9IG5pbAorICAgIGZvciBpIGluIDAuLjwxMCB7CisgICAgICAKKyAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZS5jU3RyaW5nKHVzaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkhKQorICAgICAgaWYgaHAgPT0gbmlsIHsKKyAgICAgICAgcHJpbnQoImZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lIFwoaG9zdG5hbWUpIikKKyAgICAgICAgaGVycm9yKCJyZXNvbHYiKQorICAgICAgICBpZiBpID09IDkgeworICAgICAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgICAgICB0aHJvdyBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ob3N0YW5hbWVSZXNvbHV0aW9uKGhvc3RuYW1lOiBob3N0bmFtZSkpCisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkLnNsZWVwKGZvclRpbWVJbnRlcnZhbDogMC4yKQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICB9CisgICAgcGluLnNpbl9mYW1pbHkgID0gVUludDgoQUZfSU5FVCkKKyAgICBwaW4uc2luX2FkZHIgICAgPSBpbl9hZGRyKHNfYWRkcjogVUludDMyKChocD8ucG9pbnRlZS5oX2FkZHJfbGlzdC5wb2ludGVlPy5wb2ludGVlKSEpKSAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZ2V0IHRoaXM/Pz8KKyAgICBwaW4uc2luX3BvcnQgICAgPSBodG9ucyhwb3J0KQorICAgIAorICAgIC8qIGNyZWF0ZSB0aGUgc29ja2V0ICovCisgICAgc2QgPSBzb2NrZXQoSW50MzIoQUZfSU5FVCksIEludDMyKFNPQ0tfU1RSRUFNKSwgSW50MzIoSVBQUk9UT19UQ1ApKQorICAgIGlmIHNkID09IC0xIHsKKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgIHRocm93IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnNvY2tldENyZWF0ZShwb3J0OiBJbnQocG9ydCkpKQorICAgIH0KKyAgICAKKyAgICAvKiBvcGVuIGEgY29ubmVjdGlvbiAqLworICAgIC8vIG5lZWQgYSBub24tc2VsZiByZWYgdG8gc2QsIG90aGVyd2lzZSB0aGUgaiBjb21wbGFpbnMKKyAgICBsZXQgc2RfbG9jYWwgPSBzZAorICAgIGxldCBjb25uZWN0UmVzdWx0ID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZwaW4pIHsKKyAgICAgIGNvbm5lY3Qoc2RfbG9jYWwsIFVuc2FmZVBvaW50ZXI8c29ja2FkZHI+KE9wYXF1ZVBvaW50ZXIoJDApKSwgc29ja2xlbl90KE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSkpCisgICAgfQorICAgIGlmIGNvbm5lY3RSZXN1bHQgPT0gLTEgeworICAgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG5pbCkgLy8gaGF2ZSB0byBpbml0IGJlZm9yZSB0aHJvd2luZworICAgICAgdGhyb3cgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yKGVycm9yOiAuY29ubmVjdCkKKyAgICB9CisgICAgCisgICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBzZCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSkKKyAgICAKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLCAuc29ja2V0TmF0aXZlSGFuZGxlLCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksIC5zb2NrZXROYXRpdmVIYW5kbGUsIGtDRkJvb2xlYW5UcnVlKQorICAgIAorICAgIHZhciBpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/ID0gbmlsCisgICAgdmFyIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtPyA9IG5pbAorICAgIGlmIHJlYWRTdHJlYW0gIT0gbmlsICYmIHdyaXRlU3RyZWFtICE9IG5pbCB7CisgICAgICAKKyAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ja2V0U2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWxUTFN2MSkKKyAgICAgIAorICAgICAgbGV0IHNldHRpbmdzOiBbU3RyaW5nOiBCb29sXSA9IFtrQ0ZTdHJlYW1TU0xWYWxpZGF0ZXNDZXJ0aWZpY2F0ZUNoYWluIGFzIFN0cmluZzogdHJ1ZV0KKyAgICAgIAorICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIGFzIENGVHlwZVJlZiEpCisgICAgICAKKyAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIGFzIENGVHlwZVJlZiEpCisgICAgICAKKyAgICAgIGlucHV0U3RyZWFtID0gcmVhZFN0cmVhbSEudGFrZVJldGFpbmVkVmFsdWUoKQorICAgICAgaW5wdXRTdHJlYW0/LnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIGlucHV0U3RyZWFtPy5vcGVuKCkKKyAgICAgIAorICAgICAgb3V0cHV0U3RyZWFtID0gd3JpdGVTdHJlYW0hLnRha2VSZXRhaW5lZFZhbHVlKCkKKyAgICAgIG91dHB1dFN0cmVhbT8uc2NoZWR1bGUoaW46IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgb3V0cHV0U3RyZWFtPy5vcGVuKCkKKyAgICAgIAorICAgICAgcmVhZFN0cmVhbT8ucmVsZWFzZSgpCisgICAgICB3cml0ZVN0cmVhbT8ucmVsZWFzZSgpCisgICAgfQorICAgIAorICAgIAorICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICBzZWxmLmlucHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgICBzZWxmLm91dHB1dD8uZGVsZWdhdGUgPSBzZWxmCisgIH0KKyAgCisgIGZ1bmMgcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUoXyBteVRydXN0OiBTZWNUcnVzdCwgbGFzdFRydXN0UmVzdWx0OiBTZWNUcnVzdFJlc3VsdFR5cGUpIC0+IEJvb2wgeworICAgIGxldCB0cnVzdFRpbWUgPSBTZWNUcnVzdEdldFZlcmlmeVRpbWUobXlUcnVzdCkKKyAgICBsZXQgY3VycmVudFRpbWUgPSBDRkFic29sdXRlVGltZUdldEN1cnJlbnQoKQorICAgIAorICAgIGxldCB0aW1lSW5jcmVtZW50ID0gMzE1MzYwMDAgLy8gZnJvbSBUU1NMU29ja2V0VHJhbnNwb3J0Lm0KKyAgICBsZXQgbmV3VGltZSA9IGN1cnJlbnRUaW1lIC0gRG91YmxlKHRpbWVJbmNyZW1lbnQpCisgICAgCisgICAgaWYgdHJ1c3RUaW1lIC0gbmV3VGltZSAhPSAwIHsKKyAgICAgIGxldCBuZXdEYXRlID0gQ0ZEYXRlQ3JlYXRlKG5pbCwgbmV3VGltZSkKKyAgICAgIFNlY1RydXN0U2V0VmVyaWZ5RGF0ZShteVRydXN0LCBuZXdEYXRlISkKKyAgICAgIAorICAgICAgdmFyIHRyID0gbGFzdFRydXN0UmVzdWx0CisgICAgICBsZXQgc3VjY2VzcyA9IHdpdGhVbnNhZmVNdXRhYmxlUG9pbnRlcih0bzogJnRyKSB7IHRyUHRyIC0+IEJvb2wgaW4KKyAgICAgICAgaWYgU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCB0clB0cikgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgIH0KKyAgICAgIGlmICFzdWNjZXNzIHsgcmV0dXJuIGZhbHNlIH0KKyAgICB9CisgICAgaWYgbGFzdFRydXN0UmVzdWx0ID09IC5wcm9jZWVkIHx8IGxhc3RUcnVzdFJlc3VsdCA9PSAudW5zcGVjaWZpZWQgeworICAgICAgICByZXR1cm4gZmFsc2UKKyAgICB9CisKKyAgICBwcmludCgiVFNTTFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIHJlY292ZXIgY2VydGlmaWNhdGUgdHJ1c3QgZmFpbHVyZSIpCisgICAgcmV0dXJuIHRydWUKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaXNPcGVuKCkgLT4gQm9vbCB7CisgICAgcmV0dXJuIHNkID4gMAorICB9Cit9CisKK2V4dGVuc2lvbiBUU1NMU29ja2V0VHJhbnNwb3J0OiBTdHJlYW1EZWxlZ2F0ZSB7CisgIHB1YmxpYyBmdW5jIHN0cmVhbShfIGFTdHJlYW06IFN0cmVhbSwgaGFuZGxlIGV2ZW50Q29kZTogU3RyZWFtLkV2ZW50KSB7CisgICAgCisgICAgc3dpdGNoIGV2ZW50Q29kZSB7CisgICAgY2FzZSBTdHJlYW0uRXZlbnQoKTogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5oYXNCeXRlc0F2YWlsYWJsZTogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5vcGVuQ29tcGxldGVkOiBicmVhaworICAgIGNhc2UgU3RyZWFtLkV2ZW50Lmhhc1NwYWNlQXZhaWxhYmxlOgorICAgICAgdmFyIHByb2NlZWQgPSBmYWxzZQorICAgICAgdmFyIHRydXN0UmVzdWx0OiBTZWNUcnVzdFJlc3VsdFR5cGUgPSAuaW52YWxpZAorCisgICAgICB2YXIgbmV3UG9saWNpZXM6IENGTXV0YWJsZUFycmF5PworICAgICAgCisgICAgICByZXBlYXQgeworICAgICAgICBsZXQgdHJ1c3Q6IFNlY1RydXN0ID0gYVN0cmVhbS5wcm9wZXJ0eShmb3JLZXk6IC5TU0xQZWVyVHJ1c3QpIGFzISBTZWNUcnVzdAorICAgICAgICAKKyAgICAgICAgLy8gQWRkIG5ldyBwb2xpY3kgdG8gY3VycmVudCBsaXN0IG9mIHBvbGljaWVzCisgICAgICAgIGxldCBwb2xpY3kgPSBTZWNQb2xpY3lDcmVhdGVTU0woZmFsc2UsIHNzbEhvc3RuYW1lIGFzIENGU3RyaW5nPykKKyAgICAgICAgdmFyIHBwb2xpY3kgPSBwb2xpY3kgLy8gbXV0YWJsZSBmb3IgcG9pbnRlcgorICAgICAgICBsZXQgcG9saWNpZXM6IFVuc2FmZU11dGFibGVQb2ludGVyPENGQXJyYXk/Pj8gPSBuaWwKKyAgICAgICAgaWYgU2VjVHJ1c3RDb3B5UG9saWNpZXModHJ1c3QsIHBvbGljaWVzISkgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZwcG9saWN5KSB7IHB0ciBpbgorICAgICAgICAgIG5ld1BvbGljaWVzID0gQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KG5pbCwgMCwgcG9saWNpZXM/LnBvaW50ZWUpCisgICAgICAgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKG5ld1BvbGljaWVzLCBwdHIpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHVwZGF0ZSB0cnVzdCBwb2xpY2llcworICAgICAgICBpZiBTZWNUcnVzdFNldFBvbGljaWVzKHRydXN0LCBuZXdQb2xpY2llcyEpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEV2YWx1YXRlIHRoZSB0cnVzdCBjaGFpbgorICAgICAgICBsZXQgc3VjY2VzcyA9IHdpdGhVbnNhZmVNdXRhYmxlUG9pbnRlcih0bzogJnRydXN0UmVzdWx0KSB7IHRydXN0UHRyIC0+IEJvb2wgaW4KKyAgICAgICAgICBpZiBTZWNUcnVzdEV2YWx1YXRlKHRydXN0LCB0cnVzdFB0cikgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgIXN1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBzd2l0Y2ggdHJ1c3RSZXN1bHQgeworICAgICAgICBjYXNlIC5wcm9jZWVkOiAgICAgIHByb2NlZWQgPSB0cnVlCisgICAgICAgIGNhc2UgLnVuc3BlY2lmaWVkOiAgcHJvY2VlZCA9IHRydWUKKyAgICAgICAgY2FzZSAucmVjb3ZlcmFibGVUcnVzdEZhaWx1cmU6CisgICAgICAgICAgcHJvY2VlZCA9IHNlbGYucmVjb3ZlckZyb21UcnVzdEZhaWx1cmUodHJ1c3QsIGxhc3RUcnVzdFJlc3VsdDogdHJ1c3RSZXN1bHQpCisgICAgICAgICAgCisgICAgICAgIGNhc2UgLmRlbnk6ICAgICAgICAgYnJlYWsKKyAgICAgICAgY2FzZSAuZmF0YWxUcnVzdEZhaWx1cmU6IGJyZWFrCisgICAgICAgIGNhc2UgLm90aGVyRXJyb3I6ICAgYnJlYWsKKyAgICAgICAgY2FzZSAuaW52YWxpZDogICAgICBicmVhaworICAgICAgICBkZWZhdWx0OiBicmVhaworICAgICAgICB9CisgICAgICB9IHdoaWxlIGZhbHNlCisgIAorICAgICAgaWYgIXByb2NlZWQgeworICAgICAgICBwcmludCgiVFNTTFNvY2tldFRyYW5zcG9ydDogQ2Fubm90IHRydXN0IGNlcnRpZmljYXRlLiAgUmVzdWx0OiBcKHRydXN0UmVzdWx0KSIpCisgICAgICAgIGFTdHJlYW0uY2xvc2UoKQorICAgICAgfQorICAgICAgCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuZXJyb3JPY2N1cnJlZDogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5lbmRFbmNvdW50ZXJlZDogYnJlYWsKKyAgICBkZWZhdWx0OiBicmVhaworICAgIH0KKyAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhMTYyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5zd2lmdApAQCAtMCwwICsxLDQ4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwdWJsaWMgc3RydWN0IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcjogVEVycm9yIHsKKyAgcHVibGljIGVudW0gRXJyb3JDb2RlOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIGhvc3RhbmFtZVJlc29sdXRpb24oaG9zdG5hbWU6IFN0cmluZykKKyAgICBjYXNlIHNvY2tldENyZWF0ZShwb3J0OiBJbnQpCisgICAgY2FzZSBjb25uZWN0CisgIAorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAuaG9zdGFuYW1lUmVzb2x1dGlvbjogIHJldHVybiAtMTAwMDAKKyAgICAgIGNhc2UgLnNvY2tldENyZWF0ZTogICAgICAgICByZXR1cm4gLTEwMDAxCisgICAgICBjYXNlIC5jb25uZWN0OiAgICAgICAgICAgICAgcmV0dXJuIC0xMDAwMgorICAgICAgfQorICAgIH0KKyAgCisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLmhvc3RhbmFtZVJlc29sdXRpb24obGV0IGhvc3RuYW1lKTogIHJldHVybiAiRmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWU6IFwoaG9zdG5hbWUpIgorICAgICAgY2FzZSAuc29ja2V0Q3JlYXRlKGxldCBwb3J0KTogICAgICAgICAgICAgcmV0dXJuICJDb3VsZCBub3QgY3JlYXRlIHNvY2tldCBvbiBwb3J0OiBcKHBvcnQpIgorICAgICAgY2FzZSAuY29ubmVjdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25uZWN0IGVycm9yIgorICAgICAgfQorICAgIH0KKyAgCisgIH0KKyAgcHVibGljIHZhciBlcnJvcjogRXJyb3JDb2RlID0gLmNvbm5lY3QKKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/CisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLmNvbm5lY3QgfQorICAKKyAgcHVibGljIGluaXQoKSB7IH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXJpYWxpemFibGUuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTA5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0CkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHByb3RvY29sIFRTZXJpYWxpemFibGUgeworICB2YXIgaGFzaFZhbHVlOiBJbnQgeyBnZXQgfQorCisgIC8vLyBUVHlwZSBmb3IgaW5zdGFuY2UKKyAgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IGdldCB9CisKKyAgLy8vIFJlYWQgVFNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmcm9tIFByb3RvY29sCisgIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU2VsZgorCisgIC8vLyBXcml0ZSBUU2VyaWFsaXphYmxlIGluc3RhbmNlIHRvIFByb3RvY29sCisgIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzCisKK30KKworZXh0ZW5zaW9uIFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU2VsZiwgdG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgdmFsdWUud3JpdGUodG86IHByb3RvKQorICB9CisKKyAgLy8vIGNvbnZlbmllbmNlIGZvciBtZW1iZXIgYWNjZXNzCisgIHB1YmxpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gU2VsZi50aHJpZnRUeXBlIH0KK30KKworcHVibGljIGZ1bmMgPT08VD4obGhzOiBULCByaHM6IFQpIC0+IEJvb2wgd2hlcmUgVCA6IFRTZXJpYWxpemFibGUgeworICByZXR1cm4gbGhzLmhhc2hWYWx1ZSA9PSByaHMuaGFzaFZhbHVlCit9CisKKy8vLyBEZWZhdWx0IHJlYWQvd3JpdGUgZm9yIHByaW1pdGF2ZSBUaHJpZnQgdHlwZXM6CisvLy8gQm9vbCwgSW50OCAoYnl0ZSksIEludDE2LCBJbnQzMiwgSW50NjQsIERvdWJsZSwgU3RyaW5nCisKK2V4dGVuc2lvbiBCb29sIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5ib29sIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gSW50OCA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTggfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDggeworICAgIHJldHVybiBJbnQ4KHRyeSBwcm90by5yZWFkKCkgYXMgVUludDgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShVSW50OChzZWxmKSkKKyAgfQorfQorCitleHRlbnNpb24gSW50MTYgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkxNiB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKK2V4dGVuc2lvbiBJbnQzMiA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTMyIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQzMiB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworCitleHRlbnNpb24gSW50NjQgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmk2NCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKK2V4dGVuc2lvbiBEb3VibGUgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmRvdWJsZSB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gU3RyaW5nIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJpbmcgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlY2QxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0CkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBzdHJ1Y3QgVFNldDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZSAmIEhhc2hhYmxlPiA6IFNldEFsZ2VicmEsIEhhc2hhYmxlLCBDb2xsZWN0aW9uLCBFeHByZXNzaWJsZUJ5QXJyYXlMaXRlcmFsLCBUU2VyaWFsaXphYmxlIHsKKyAgLy8vIFR5cGVhbGlhcyBmb3IgU3RvcmFnZSB0eXBlCisgIHB1YmxpYyB0eXBlYWxpYXMgU3RvcmFnZSA9IFNldDxFbGVtZW50PgorICAKKyAgCisgIC8vLyBJbnRlcm5hbCBTdG9yYWdlIHVzZWQgZm9yIFRTZXQgKFNldFw8RWxlbWVudFw+KQorICBpbnRlcm5hbCB2YXIgc3RvcmFnZSA6IFN0b3JhZ2UKKyAgCisgIAorICAvLy8gTWFyazogQ29sbGVjdGlvbgorICAKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRpY2VzID0gU3RvcmFnZS5JbmRpY2VzCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXhEaXN0YW5jZSA9IFN0b3JhZ2UuSW5kZXhEaXN0YW5jZQorICBwdWJsaWMgdHlwZWFsaWFzIFN1YlNlcXVlbmNlID0gU3RvcmFnZS5TdWJTZXF1ZW5jZQorICAKKyAgCisgIHB1YmxpYyB2YXIgaW5kaWNlczogSW5kaWNlcyB7IHJldHVybiBzdG9yYWdlLmluZGljZXMgfQorICAKKyAgLy8gTXVzdCBpbXBsZW1lbnQgaXNFbXB0eSBldmVuIHRob3VnaCBib3RoIFNldEFsZ2VicmEgYW5kIENvbGxlY3Rpb24gcHJvdmlkZSBpdCBkdWUgdG8gdGhlaXIgY29uZmxjaXRpbmcgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMKKyAgcHVibGljIHZhciBpc0VtcHR5OiBCb29sIHsgcmV0dXJuIHN0b3JhZ2UuaXNFbXB0eSB9CisgIAorICBwdWJsaWMgZnVuYyBkaXN0YW5jZShmcm9tIHN0YXJ0OiBJbmRleCwgdG8gZW5kOiBJbmRleCkgLT4gSW5kZXhEaXN0YW5jZSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGlzdGFuY2UoZnJvbTogc3RhcnQsIHRvOiBlbmQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoXyBpOiBJbmRleCwgb2Zmc2V0QnkgbjogSW5kZXhEaXN0YW5jZSwgbGltaXRlZEJ5IGxpbWl0OiBJbmRleCkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbiwgbGltaXRlZEJ5OiBsaW1pdCkKKyAgfQorICAKKyAgI2lmIHN3aWZ0KD49My4yKQorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgICNlbHNlCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBTdG9yYWdlLkluZGV4KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgIH0KKyAgI2VuZGlmCisgIAorICAvLy8gTWFyazogU2V0QWxnZWJyYQorICBpbnRlcm5hbCBpbml0KHN0b3JhZ2U6IFNldDxFbGVtZW50PikgeworICAgIHNlbGYuc3RvcmFnZSA9IHN0b3JhZ2UKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgY29udGFpbnMoXyBtZW1iZXI6IEVsZW1lbnQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmNvbnRhaW5zKG1lbWJlcikKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW5zZXJ0KF8gbmV3TWVtYmVyOiBFbGVtZW50KSAtPiAoaW5zZXJ0ZWQ6IEJvb2wsIG1lbWJlckFmdGVySW5zZXJ0OiBFbGVtZW50KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5zZXJ0KG5ld01lbWJlcikKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlKF8gbWVtYmVyOiBFbGVtZW50KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlKG1lbWJlcikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdW5pb24oXyBvdGhlcjogVFNldDxFbGVtZW50PikgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZTogc3RvcmFnZS51bmlvbihvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybUludGVyc2VjdGlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybUludGVyc2VjdGlvbihvdGhlci5zdG9yYWdlKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBmb3JtU3ltbWV0cmljRGlmZmVyZW5jZShfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybVN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybVVuaW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIHsKKyAgICByZXR1cm4gc3RvcmFnZS5mb3JtVW5pb24ob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW50ZXJzZWN0aW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2UuaW50ZXJzZWN0aW9uKG90aGVyLnN0b3JhZ2UpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzeW1tZXRyaWNEaWZmZXJlbmNlKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2Uuc3ltbWV0cmljRGlmZmVyZW5jZShvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlKHdpdGggbmV3TWVtYmVyOiBFbGVtZW50KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UudXBkYXRlKHdpdGg6IG5ld01lbWJlcikKKyAgfQorICAKKyAgLy8vIE1hcms6IEluZGV4YWJsZUJhc2UKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5lbmRJbmRleCB9CisgIHB1YmxpYyBmdW5jIGluZGV4KGFmdGVyIGk6IEluZGV4KSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYWZ0ZXI6IGkpCisgIH0KKworICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYWZ0ZXIgaTogaW5vdXQgU3RvcmFnZS5JbmRleCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGFmdGVyOiAmaSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChib3VuZHM6IFJhbmdlPEluZGV4PikgLT4gU3ViU2VxdWVuY2UgeworICAgIHJldHVybiBzdG9yYWdlW2JvdW5kc10KKyAgfQorCisgIAorICAvLy8gTWFyazogSGFzaGFibGUKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyBlbGVtZW50Lmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBNYXJrOiBUU2VyaWFsaXphYmxlCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuc2V0IH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIGluaXQoYXJyYXlMaXRlcmFsIGVsZW1lbnRzOiBFbGVtZW50Li4uKSB7CisgICAgc2VsZi5zdG9yYWdlID0gU3RvcmFnZShlbGVtZW50cykKKyAgfQorICAKKyAgcHVibGljIGluaXQ8U291cmNlIDogU2VxdWVuY2U+KF8gc2VxdWVuY2U6IFNvdXJjZSkgd2hlcmUgU291cmNlLkl0ZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudCB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2Uoc2VxdWVuY2UpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRTZXQgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRTZXRCZWdpbigpCisgICAgaWYgZWxlbWVudFR5cGUgIT0gRWxlbWVudC50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZTogZWxlbWVudFR5cGUpKQorICAgIH0KKyAgICB2YXIgc2V0ID0gVFNldCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGVsZW1lbnQgPSB0cnkgRWxlbWVudC5yZWFkKGZyb206IHByb3RvKQorICAgICAgc2V0LnN0b3JhZ2UuaW5zZXJ0KGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU2V0RW5kKCkKKyAgICByZXR1cm4gc2V0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IEVsZW1lbnQudGhyaWZ0VHlwZSwgc2l6ZTogSW50MzIoc2VsZi5jb3VudCkpCisgICAgZm9yIGVsZW1lbnQgaW4gc2VsZi5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlKGVsZW1lbnQsIHRvOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlU2V0RW5kKCkKKyAgfQorfQorCitleHRlbnNpb24gVFNldDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRTZXQ8RWxlbWVudD4sIHJoczogVFNldDxFbGVtZW50PikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFNlcnZlci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyNGU2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZiBvcyhPU1gpIHx8IG9zKGlPUykgfHwgb3Mod2F0Y2hPUykgfHwgb3ModHZPUykKKyAgaW1wb3J0IERhcndpbgorI2Vsc2VpZiBvcyhMaW51eCkgfHwgb3MoRnJlZUJTRCkgfHwgb3MoUFM0KSB8fCBvcyhBbmRyb2lkKQorICBpbXBvcnQgR2xpYmMKKyAgaW1wb3J0IERpc3BhdGNoCisjZW5kaWYKKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCitwdWJsaWMgbGV0IFRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQgPSAiVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCIKK3B1YmxpYyBsZXQgVFNvY2tldFNlcnZlclByb2Nlc3NvcktleSA9ICJUU29ja2V0U2VydmVyUHJvY2Vzc29yIgorcHVibGljIGxldCBUU29ja2V0U2VydmVyVHJhbnNwb3J0S2V5ID0gIlRTb2NrZXRTZXJ2ZXJUcmFuc3BvcnQiCisKK2NsYXNzIFRTb2NrZXRTZXJ2ZXI8SW5Qcm90b2NvbDogVFByb3RvY29sLCBPdXRQcm90b2NvbDogVFByb3RvY29sLCBQcm9jZXNzb3I6IFRQcm9jZXNzb3IsIFNlcnZpY2U+IHdoZXJlIFByb2Nlc3Nvci5TZXJ2aWNlID09IFNlcnZpY2UgeworICB2YXIgc29ja2V0RmlsZUhhbmRsZTogRmlsZUhhbmRsZQorICB2YXIgcHJvY2Vzc2luZ1F1ZXVlID0gIERpc3BhdGNoUXVldWUobGFiZWw6ICJUU29ja2V0U2VydmVyLnByb2Nlc3NpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW9zOiAuYmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IC5jb25jdXJyZW50KQorICB2YXIgc2VydmljZUhhbmRsZXI6IFNlcnZpY2UKKworICBwdWJsaWMgaW5pdChwb3J0OiBJbnQsCisgICAgICAgICAgICAgIHNlcnZpY2U6IFNlcnZpY2UsCisgICAgICAgICAgICAgIGluUHJvdG9jb2w6IEluUHJvdG9jb2wuVHlwZSwKKyAgICAgICAgICAgICAgb3V0UHJvdG9jb2w6IE91dFByb3RvY29sLlR5cGUsCisgICAgICAgICAgICAgIHByb2Nlc3NvcjogUHJvY2Vzc29yLlR5cGUpIHRocm93cyB7CisgICAgLy8gc2V0IHNlcnZpY2UgaGFuZGxlcgorICAgIHNlbGYuc2VydmljZUhhbmRsZXIgPSBzZXJ2aWNlCisKKyAgICAvLyBjcmVhdGUgYSBzb2NrZXQKKyAgICB2YXIgZmQ6IEludDMyID0gLTEKKyAgICAjaWYgb3MoTGludXgpCisgICAgICBsZXQgc29jayA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0lORVQsIEludDMyKFNPQ0tfU1RSRUFNLnJhd1ZhbHVlKSwgSW50MzIoSVBQUk9UT19UQ1ApLCAwLCBuaWwsIG5pbCkKKyAgICAjZWxzZQorICAgICAgbGV0IHNvY2sgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIDAsIG5pbCwgbmlsKQorICAgICNlbmRpZgorICAgIGlmIHNvY2sgIT0gbmlsIHsKKyAgICAgIENGU29ja2V0U2V0U29ja2V0RmxhZ3Moc29jaywgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrKSAmIH5rQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZSkKKworICAgICAgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrKQorICAgICAgdmFyIHllcyA9IDEKKyAgICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnllcywgVUludDMyKE1lbW9yeUxheW91dDxJbnQ+LnNpemUpKQorCisgICAgICAjaWYgb3MoTGludXgpCisgICAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChwb3J0LmJpZ0VuZGlhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGluX2FkZHIoc19hZGRyOiBpbl9hZGRyX3QoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl96ZXJvOiAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCisgICAgICAjZWxzZQorICAgICAgICB2YXIgYWRkciA9IHNvY2thZGRyX2luKHNpbl9sZW46IFVJbnQ4KE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChwb3J0LmJpZ0VuZGlhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGluX2FkZHIoc19hZGRyOiBpbl9hZGRyX3QoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl96ZXJvOiAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCisgICAgICAjZW5kaWYKKworICAgICAgbGV0IHB0ciA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmYWRkcikgeworICAgICAgICByZXR1cm4gVW5zYWZlUG9pbnRlcjxVSW50OD4oT3BhcXVlUG9pbnRlcigkMCkpCisgICAgICB9CisKKyAgICAgIGxldCBhZGRyZXNzID0gRGF0YShieXRlczogcHRyLCBjb3VudDogTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKQorCisgICAgICBsZXQgY2ZhZGRyID0gYWRkcmVzcy53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICBDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkoa0NGQWxsb2NhdG9yRGVmYXVsdCwgJDAsIGFkZHJlc3MuY291bnQsIG5pbCkKKyAgICAgIH0KKyAgICAgIGlmIENGU29ja2V0U2V0QWRkcmVzcyhzb2NrLCBjZmFkZHIpICE9IENGU29ja2V0RXJyb3Iuc3VjY2VzcyB7IC8va0NGU29ja2V0U3VjY2VzcyB7CisgICAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrKQorICAgICAgICBwcmludCgiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4sIG1lc3NhZ2U6ICJDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIikKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICBwcmludCgiVFNvY2tldFNlcnZlcjogTm8gc2VydmVyIHNvY2tldCIpCisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQiKQorICAgIH0KKworICAgIC8vIHdyYXAgaXQgaW4gYSBmaWxlIGhhbmRsZSBzbyB3ZSBjYW4gZ2V0IG1lc3NhZ2VzIGZyb20gaXQKKyAgICBzb2NrZXRGaWxlSGFuZGxlID0gRmlsZUhhbmRsZShmaWxlRGVzY3JpcHRvcjogZmQsIGNsb3NlT25EZWFsbG9jOiB0cnVlKQorCisgICAgLy8gdGhyb3cgYXdheSBvdXIgc29ja2V0CisgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2spCisKKyAgICAvLyByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyBvZiBhY2NlcHRlZCBpbmNvbWluZyBjb25uZWN0aW9ucworICAgIF8gPSBOb3RpZmljYXRpb25DZW50ZXIuZGVmYXVsdC5hZGRPYnNlcnZlcihmb3JOYW1lOiAuTlNGaWxlSGFuZGxlQ29ubmVjdGlvbkFjY2VwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IG5pbCwgcXVldWU6IG5pbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dlYWsgc2VsZl0gbm90aWZpY2F0aW9uIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZCBsZXQgc3Ryb25nU2VsZiA9IHNlbGYgZWxzZSB7IHJldHVybiB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmdTZWxmLmNvbm5lY3Rpb25BY2NlcHRlZChzdHJvbmdTZWxmLnNvY2tldEZpbGVIYW5kbGUpCisKKyAgICB9CisKKyAgICAvLyB0ZWxsIHNvY2tldCB0byBsaXN0ZW4KKyAgICBzb2NrZXRGaWxlSGFuZGxlLmFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnkoKQorCisgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IExpc3RlbmluZyBvbiBUQ1AgcG9ydCBcKHBvcnQpIikKKyAgfQorCisgIGRlaW5pdCB7CisgICAgTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHQucmVtb3ZlT2JzZXJ2ZXIoc2VsZikKKyAgfQorCisgIGZ1bmMgY29ubmVjdGlvbkFjY2VwdGVkKF8gc29ja2V0OiBGaWxlSGFuZGxlKSB7CisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIGNsaWVudCBjb25uZWN0ZWQsIGhhbmRsZSB0aGUgcmVxdWVzdCBvbiBxdWV1ZQorICAgIHByb2Nlc3NpbmdRdWV1ZS5hc3luYyB7CisgICAgICBzZWxmLmhhbmRsZUNsaWVudENvbm5lY3Rpb24oc29ja2V0KQorICAgIH0KKyAgfQorCisgIGZ1bmMgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbihfIGNsaWVudFNvY2tldDogRmlsZUhhbmRsZSkgeworCisgICAgbGV0IHRyYW5zcG9ydCA9IFRGaWxlSGFuZGxlVHJhbnNwb3J0KGZpbGVIYW5kbGU6IGNsaWVudFNvY2tldCkKKyAgICBsZXQgcHJvY2Vzc29yID0gUHJvY2Vzc29yKHNlcnZpY2U6IHNlcnZpY2VIYW5kbGVyKQorCisgICAgbGV0IGluUHJvdG9jb2wgPSBJblByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgICAgbGV0IG91dFByb3RvY29sID0gT3V0UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKworICAgIGRvIHsKKyAgICAgIHRyeSBwcm9jZXNzb3IucHJvY2VzcyhvbjogaW5Qcm90b2NvbCwgb3V0UHJvdG9jb2w6IG91dFByb3RvY29sKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIHByaW50KCJFcnJvciBwcm9jZXNzaWduIHJlcXVlc3Q6IFwoZXJyb3IpIikKKyAgICB9CisgICAgRGlzcGF0Y2hRdWV1ZS5tYWluLmFzeW5jIHsKKyAgICAgIE5vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0CisgICAgICAgIC5wb3N0KG5hbWU6IE5vdGlmaWNhdGlvbi5OYW1lKHJhd1ZhbHVlOiBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkKSwKKyAgICAgICAgICAgICAgb2JqZWN0OiBzZWxmLAorICAgICAgICAgICAgICB1c2VySW5mbzogW1RTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXk6IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUU29ja2V0U2VydmVyVHJhbnNwb3J0S2V5OiB0cmFuc3BvcnRdKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNmUzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwyMTAgQEAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZiBvcyhPU1gpIHx8IG9zKGlPUykgfHwgb3Mod2F0Y2hPUykgfHwgb3ModHZPUykKKyAgaW1wb3J0IERhcndpbgorI2Vsc2VpZiBvcyhMaW51eCkgfHwgb3MoRnJlZUJTRCkgfHwgb3MoUFM0KSB8fCBvcyhBbmRyb2lkKQorICBpbXBvcnQgR2xpYmMKKyAgaW1wb3J0IERpc3BhdGNoCisjZW5kaWYKKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCitwcml2YXRlIHN0cnVjdCBTeXMgeworICAjaWYgb3MoTGludXgpCisgIHN0YXRpYyBsZXQgcmVhZCA9IEdsaWJjLnJlYWQKKyAgc3RhdGljIGxldCB3cml0ZSA9IEdsaWJjLndyaXRlCisgIHN0YXRpYyBsZXQgY2xvc2UgPSBHbGliYy5jbG9zZQorICAjZWxzZQorICBzdGF0aWMgbGV0IHJlYWQgPSBEYXJ3aW4ucmVhZAorICBzdGF0aWMgbGV0IHdyaXRlID0gRGFyd2luLndyaXRlCisgIHN0YXRpYyBsZXQgY2xvc2UgPSBEYXJ3aW4uY2xvc2UKKyAgI2VuZGlmCit9CisKK2V4dGVuc2lvbiBpbl9hZGRyIHsKKyAgcHVibGljIGluaXQ/KGhvc3RlbnQ6IGhvc3RlbnQ/KSB7CisgICAgZ3VhcmQgbGV0IGhvc3QgPSBob3N0ZW50LCBob3N0LmhfYWRkcl9saXN0ICE9IG5pbCwgaG9zdC5oX2FkZHJfbGlzdC5wb2ludGVlICE9IG5pbCBlbHNlIHsKKyAgICAgIHJldHVybiBuaWwKKyAgICB9CisgICAgc2VsZi5pbml0KCkKKyAgICBtZW1jcHkoJnNlbGYsIGhvc3QuaF9hZGRyX2xpc3QucG9pbnRlZSEsIEludChob3N0LmhfbGVuZ3RoKSkKKyAgICAKKyAgfQorfQorCisKKyNpZiBvcyhMaW51eCkKKyAgLy8vIFRDRlNvY2tldFRyYW5zcG9ydCBjdXJyZW50bHkgdW5hdmFpbGFibGUKKyAgLy8vIHJlbW92ZSBjb21tZW50cyBhbmQgYnVpbGQgdG8gc2VlIHdoeS9maXgKKyAgLy8vIGN1cnJlbnRseSBDRltSZWFkfFdyaXRlXVN0cmVhbSdzIGNhbid0IGNhc3QgdG8gW0lucHV0fE91dHB1dF1TdHJlYW1zIHdoaWNoIGJyZWFrcyB0aGlnbnMKKyNlbHNlCitleHRlbnNpb24gU3RyZWFtLlByb3BlcnR5S2V5IHsKKyAgc3RhdGljIGxldCBTU0xQZWVyVHJ1c3QgPSBTdHJlYW0uUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTU0xQZWVyVHJ1c3QgYXMgU3RyaW5nKQorfQorCisvLy8gVENGU29ja2V0VHJhbnNwb3J0LCB1c2VzIENGU29ja2V0cyBhbmQgKE5TKVN0cmVhbSdzCitwdWJsaWMgY2xhc3MgVENGU29ja2V0VHJhbnNwb3J0OiBUU3RyZWFtVHJhbnNwb3J0IHsKKyAgICBwdWJsaWMgaW5pdD8oaG9zdG5hbWU6IFN0cmluZywgcG9ydDogSW50LCBzZWN1cmU6IEJvb2wgPSBmYWxzZSkgeworICAgIAorICAgIHZhciBpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0KKyAgICB2YXIgb3V0cHV0U3RyZWFtOiBPdXRwdXRTdHJlYW0KKyAgICAKKyAgICB2YXIgcmVhZFN0cmVhbTogIFVubWFuYWdlZDxDRlJlYWRTdHJlYW0+PworICAgIHZhciB3cml0ZVN0cmVhbTogIFVubWFuYWdlZDxDRldyaXRlU3RyZWFtPj8KKyAgICBDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0VG9Ib3N0KGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSBhcyBDRlN0cmluZyEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIocG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZVN0cmVhbSkKKyAgICAKKyAgICBpZiBsZXQgcmVhZFN0cmVhbSA9IHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICBsZXQgd3JpdGVTdHJlYW0gPSB3cml0ZVN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSB7CisgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgIAorICAgICAgICBpZiBzZWN1cmUgeworICAgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwgLnNvY2tldFNlY3VyaXR5TGV2ZWwsIFN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWwubmVnb3RpYXRlZFNTTC5yYXdWYWx1ZSBhcyBDRlN0cmluZykKKyAgICAgICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwgLnNvY2tldFNlY3VyaXR5TGV2ZWwsIFN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWwubmVnb3RpYXRlZFNTTC5yYXdWYWx1ZSBhcyBDRlN0cmluZykKKyAgICAgICAgfQorCisgICAgICBpbnB1dFN0cmVhbSA9IHJlYWRTdHJlYW0gYXMgSW5wdXRTdHJlYW0KKyAgICAgIGlucHV0U3RyZWFtLnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIGlucHV0U3RyZWFtLm9wZW4oKQorICAgICAgCisgICAgICBvdXRwdXRTdHJlYW0gPSB3cml0ZVN0cmVhbSBhcyBPdXRwdXRTdHJlYW0KKyAgICAgIG91dHB1dFN0cmVhbS5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBvdXRwdXRTdHJlYW0ub3BlbigpCisgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgCisgICAgICBpZiByZWFkU3RyZWFtICE9IG5pbCB7CisgICAgICAgIHJlYWRTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgfQorICAgICAgaWYgd3JpdGVTdHJlYW0gIT0gbmlsIHsKKyAgICAgICAgd3JpdGVTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgfQorICAgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG5pbCkKKyAgICAgIHJldHVybiBuaWwKKyAgICB9CisgICAgCisgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0sIG91dHB1dFN0cmVhbTogb3V0cHV0U3RyZWFtKQorICAgIAorICAgIHNlbGYuaW5wdXQ/LmRlbGVnYXRlID0gc2VsZgorICAgIHNlbGYub3V0cHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgfQorfQorCitleHRlbnNpb24gVENGU29ja2V0VHJhbnNwb3J0OiBTdHJlYW1EZWxlZ2F0ZSB7IH0KKyNlbmRpZgorCisKKy8vLyBUU29ja2V0VHJhbnNwb3J0LCBwb3NpeCBzb2NrZXRzLiAgU3VwcG9ydHMgSVB2NCBvbmx5IGZvciBub3cKK3B1YmxpYyBjbGFzcyBUU29ja2V0VHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIHB1YmxpYyB2YXIgc29ja2V0RGVzY3JpcHRvcjogSW50MzIKKyAgCisgIAorICAKKyAgLy8vIEluaXRpYWxpemUgZnJvbSBhbiBhbHJlYWR5IHNldCB1cCBzb2NrZXREZXNjcmlwdG9yLgorICAvLy8gRXhwZWN0cyBzb2NrZXQgdGhhdHMgYWxyZWFkeSBib3VuZC9jb25uZWN0ZWQgKGkuZS4gZnJvbSBsaXN0ZW5pbmcpCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgc29ja2V0RGVzY3JpcHRvcjogcG9zaXggc29ja2V0IGRlc2NyaXB0b3IgKEludDMyKQorICBwdWJsaWMgaW5pdChzb2NrZXREZXNjcmlwdG9yOiBJbnQzMikgeworICAgIHNlbGYuc29ja2V0RGVzY3JpcHRvciA9IHNvY2tldERlc2NyaXB0b3IKKyAgfQorICAKKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IEludCkgdGhyb3dzIHsKKyAgICBndWFyZCBsZXQgaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lLmNTdHJpbmcodXNpbmc6IC51dGY4KSEpPy5wb2ludGVlLAorICAgICAgbGV0IGhvc3RBZGRyID0gaW5fYWRkcihob3N0ZW50OiBocCkgZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6ICJJbnZhbGlkIGFkZHJlc3M6IFwoaG9zdG5hbWUpIikKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgI2lmIG9zKExpbnV4KQorICAgICAgbGV0IHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgSW50MzIoU09DS19TVFJFQU0ucmF3VmFsdWUpLCAwKQorICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fZmFtaWx5OiBzYV9mYW1pbHlfdChBRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChodG9ucyhVSW50MTYocG9ydCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGhvc3RBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICNlbHNlCisgICAgICBsZXQgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkKKyAgICAgIAorICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fbGVuOiBVSW50OChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fZmFtaWx5OiBzYV9mYW1pbHlfdChBRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChodG9ucyhVSW50MTYocG9ydCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGluX2FkZHIoc19hZGRyOiBpbl9hZGRyX3QoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgCisgICAgI2VuZGlmCisgICAgCisgICAgbGV0IGFkZHJQdHIgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJmFkZHIpeyBVbnNhZmVQb2ludGVyPHNvY2thZGRyPihPcGFxdWVQb2ludGVyKCQwKSkgfQorICAgIAorICAgIGxldCBjb25uZWN0ZWQgPSBjb25uZWN0KHNvY2ssIGFkZHJQdHIsIFVJbnQzMihNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpKQorICAgIGlmIGNvbm5lY3RlZCAhPSAwIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4sIG1lc3NhZ2U6ICJFcnJvciBiaW5kaW5nIHRvIGhvc3Q6IFwoaG9zdG5hbWUpIFwocG9ydCkiKQorICAgIH0KKyAgICAKKyAgICBzZWxmLmluaXQoc29ja2V0RGVzY3JpcHRvcjogc29jaykKKyAgfQorICAKKyAgZGVpbml0IHsKKyAgICBjbG9zZSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIG91dCA9IERhdGEoKQorICAgIHdoaWxlIG91dC5jb3VudCA8IHNpemUgeworICAgICAgb3V0LmFwcGVuZCh0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUpKQorICAgIH0KKyAgICByZXR1cm4gb3V0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIGJ1ZmYgPSBBcnJheTxVSW50OD4uaW5pdChyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplKQorICAgIGxldCByZWFkQnl0ZXMgPSBTeXMucmVhZChzb2NrZXREZXNjcmlwdG9yLCAmYnVmZiwgc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gRGF0YShieXRlczogYnVmZlswLi48cmVhZEJ5dGVzXSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgeworICAgIHZhciBieXRlc1RvV3JpdGUgPSBkYXRhLmNvdW50CisgICAgdmFyIHdyaXRlQnVmZmVyID0gZGF0YQorICAgIHdoaWxlIGJ5dGVzVG9Xcml0ZSA+IDAgeworICAgICAgbGV0IHdyaXR0ZW4gPSB3cml0ZUJ1ZmZlci53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICBTeXMud3JpdGUoc29ja2V0RGVzY3JpcHRvciwgJDAsIHdyaXRlQnVmZmVyLmNvdW50KQorICAgICAgfQorICAgICAgd3JpdGVCdWZmZXIgPSB3cml0ZUJ1ZmZlci5zdWJkYXRhKGluOiB3cml0dGVuIC4uPCB3cml0ZUJ1ZmZlci5jb3VudCkKKyAgICAgIGJ5dGVzVG9Xcml0ZSAtPSB3cml0dGVuCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgLy8gbm90aGluZyB0byBkbworICB9CisgIAorICBwdWJsaWMgZnVuYyBjbG9zZSgpIHsKKyAgICBzaHV0ZG93bihzb2NrZXREZXNjcmlwdG9yLCBJbnQzMihTSFVUX1JEV1IpKQorICAgIF8gPSBTeXMuY2xvc2Uoc29ja2V0RGVzY3JpcHRvcikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cmVhbVRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiYzFiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCisjaWYgb3MoTGludXgpCisgIC8vLyBDdXJyZW50bHkgdW5hdmFpbGFibGUgaW4gTGludXgKKyAgLy8vIFJlbW92ZSBjb21tZW50cyBhbmQgYnVpbGQgdG8gZml4CisgIC8vLyBDdXJyZW50bHkga0NvbnN0YW50cyBmb3IgQ0ZTb2NrZXRzIGRvbid0IGV4aXN0IGluIGxpbnV4IGFuZCBub3QgYWxsIGhhdmUgYmVlbiBtb3ZlZAorICAvLy8gdG8gcHJvcGVydHkgc3RydWN0cyB5ZXQKKyNlbHNlCisgIC8vIE11c3QgaW5oZXJpdCBOU09iamVjdCBmb3IgTlNTdHJlYW1EZWxlZ2F0ZSBjb25mb3JtYW5jZQorICBwdWJsaWMgY2xhc3MgVFN0cmVhbVRyYW5zcG9ydCA6IE5TT2JqZWN0LCBUVHJhbnNwb3J0IHsKKyAgICBwdWJsaWMgdmFyIGlucHV0OiBJbnB1dFN0cmVhbT8gPSBuaWwKKyAgICBwdWJsaWMgdmFyIG91dHB1dDogT3V0cHV0U3RyZWFtPyA9IG5pbAorICAgIAorICAgIHB1YmxpYyBpbml0KGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbT8sIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtPykgeworICAgICAgaW5wdXQgICA9IGlucHV0U3RyZWFtCisgICAgICBvdXRwdXQgID0gb3V0cHV0U3RyZWFtCisgICAgfQorICAgIAorICAgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbT8pIHsKKyAgICAgIHNlbGYuaW5pdChpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0sIG91dHB1dFN0cmVhbTogbmlsKQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8pIHsKKyAgICAgIHNlbGYuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICB9CisgICAgCisgICAgZGVpbml0IHsKKyAgICAgIGNsb3NlKCkKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICAgIGd1YXJkIGxldCBpbnB1dCA9IGlucHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgcmVhZCA9IERhdGEoKQorICAgICAgd2hpbGUgcmVhZC5jb3VudCA8IHNpemUgeworICAgICAgICB2YXIgYnVmZmVyID0gQXJyYXk8VUludDg+KHJlcGVhdGluZzogMCwgY291bnQ6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICAKKyAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IGJ1ZmZlci53aXRoVW5zYWZlTXV0YWJsZUJ1ZmZlclBvaW50ZXIgeyBidWZmZXJQdHIgaW4KKyAgICAgICAgICByZXR1cm4gaW5wdXQucmVhZChidWZmZXJQdHIuYmFzZUFkZHJlc3MhLCBtYXhMZW5ndGg6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiBieXRlc1JlYWQgPD0gMCB7CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbikKKyAgICAgICAgfQorICAgICAgICByZWFkLmFwcGVuZChEYXRhKGJ5dGVzOiBidWZmZXIpKQorICAgICAgfQorICAgICAgcmV0dXJuIHJlYWQKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICAgIGd1YXJkIGxldCBpbnB1dCA9IGlucHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgcmVhZCA9IERhdGEoKQorICAgICAgd2hpbGUgcmVhZC5jb3VudCA8IHNpemUgeworICAgICAgICB2YXIgYnVmZmVyID0gQXJyYXk8VUludDg+KHJlcGVhdGluZzogMCwgY291bnQ6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICBsZXQgYnl0ZXNSZWFkID0gYnVmZmVyLndpdGhVbnNhZmVNdXRhYmxlQnVmZmVyUG9pbnRlciB7CisgICAgICAgICAgaW5wdXQucmVhZCgkMC5iYXNlQWRkcmVzcyEsIG1heExlbmd0aDogc2l6ZSAtIHJlYWQuY291bnQpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIGJ5dGVzUmVhZCA8PSAwIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZWFkLmFwcGVuZChEYXRhKGJ5dGVzOiBidWZmZXIpKQorICAgICAgfQorICAgICAgcmV0dXJuIHJlYWQKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICAgIGd1YXJkIGxldCBvdXRwdXQgPSBvdXRwdXQgZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgICB9CisgICAgICAKKyAgICAgIHZhciBieXRlc1dyaXR0ZW4gPSAwCisgICAgICB3aGlsZSBieXRlc1dyaXR0ZW4gPCBkYXRhLmNvdW50IHsKKyAgICAgICAgYnl0ZXNXcml0dGVuID0gZGF0YS53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICAgIHJldHVybiBvdXRwdXQud3JpdGUoJDAsIG1heExlbmd0aDogZGF0YS5jb3VudCkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgYnl0ZXNXcml0dGVuID09IC0xIHsKKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuKQorICAgICAgICB9IGVsc2UgaWYgYnl0ZXNXcml0dGVuID09IDAgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgICByZXR1cm4KKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgY2xvc2UoKSB7CisgICAgICAKKyAgICAgIGlmIGlucHV0ICE9IG5pbCB7CisgICAgICAgIC8vIENsb3NlIGFuZCByZXNldCBpbnB1dHN0cmVhbQorICAgICAgICBpZiBsZXQgY2Y6IENGUmVhZFN0cmVhbSA9IGlucHV0IHsKKyAgICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShjZiwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW5wdXQ/LmRlbGVnYXRlID0gbmlsCisgICAgICAgIGlucHV0Py5jbG9zZSgpCisgICAgICAgIGlucHV0Py5yZW1vdmUoZnJvbTogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICAgIGlucHV0ID0gbmlsCisgICAgICB9CisgICAgICAKKyAgICAgIGlmIG91dHB1dCAhPSBuaWwgeworICAgICAgICAvLyBDbG9zZSBhbmQgcmVzZXQgb3V0cHV0IHN0cmVhbQorICAgICAgICBpZiBsZXQgY2Y6IENGV3JpdGVTdHJlYW0gPSBvdXRwdXQgeworICAgICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eShjZiwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQ/LmRlbGVnYXRlID0gbmlsCisgICAgICAgIG91dHB1dD8uY2xvc2UoKQorICAgICAgICBvdXRwdXQ/LnJlbW92ZShmcm9tOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgICAgb3V0cHV0ID0gbmlsCisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJ1Y3Quc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzJhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0CkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLy8vIFByb3RvY29sIGZvciBHZW5lcmF0ZWQgU3RydWN0cyB0byBjb25mb3JtIHRvCisvLy8gRGljdGlvbmFyeSBtYXBzIGZpZWxkIG5hbWVzIHRvIGludGVybmFsIElEcyBhbmQgdXNlcyBSZWZsZWN0aW9uCisvLy8gdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBmaWVsZHMuICAKKy8vLyBgd3JpdGVGaWVsZFZhbHVlKF86bmFtZTp0eXBlOmlkOilgIGNhbGxzIGBUU2VyaWFsaXphYmxlLndyaXRlKHRvOilgIGludGVybmFsbHkKKy8vLyBnaXZpbmcgYSBuaWNlIHJlY3Vyc2l2ZSBiZWhhdmlvciBmb3IgbmVzdGVkIFRTdHJ1Y3RzLCBUTGlzdHMsIFRNYXBzLCBhbmQgVFNldHMKK3B1YmxpYyBwcm90b2NvbCBUU3RydWN0IDogVFNlcmlhbGl6YWJsZSB7CisgIHN0YXRpYyB2YXIgZmllbGRJZHM6IFtTdHJpbmc6IEludDMyXSB7IGdldCB9CisgIHN0YXRpYyB2YXIgc3RydWN0TmFtZTogU3RyaW5nIHsgZ2V0IH0KK30KKworcHVibGljIGV4dGVuc2lvbiBUU3RydWN0IHsKKyAgcHVibGljIHN0YXRpYyB2YXIgZmllbGRJZHM6IFtTdHJpbmc6IChpZDogSW50MzIsIHR5cGU6IFRUeXBlKV0geyByZXR1cm4gWzpdIH0KKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cnVjdCB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIC8vIFdyaXRlIHN0cnVjdCBuYW1lIGZpcnN0CisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0QmVnaW4obmFtZTogU2VsZi5zdHJ1Y3ROYW1lKQorICAgIAorICAgIHRyeSBzZWxmLmZvckVhY2ggeyBuYW1lLCB2YWx1ZSwgaWQgaW4KKyAgICAgIC8vIFdyaXRlIHRvIHByb3RvY29sCisgICAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZFZhbHVlKHZhbHVlLCBuYW1lOiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB2YWx1ZS50aHJpZnRUeXBlLCBpZDogaWQpCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkU3RvcCgpCisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIHNlbGYuZm9yRWFjaCB7IF8sIHZhbHVlLCBfIGluCisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgKHZhbHVlLmhhc2hWYWx1ZSkKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gUHJvdmlkZXMgYSBibG9jayBmb3IgaGFuZGxpbmcgZWFjaCAoYXZhaWxhYmxlKSB0aHJpZnQgcHJvcGVydHkgdXNpbmcgcmVmbGVjdGlvbgorICAvLy8gQ2F2ZWF0OiBTa2lwcyBvdmVyIG9wdGlvbmFsIHZhbHVlcworICAKKyAgCisgIC8vLyBQcm92aWRlcyBhIGJsb2NrIGZvciBoYW5kbGluZyBlYWNoIChhdmFpbGFibGUpIHRocmlmdCBwcm9wZXJ0eSB1c2luZyByZWZsZWN0aW9uCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgYmxvY2s6IGJsb2NrIGZvciBoYW5kbGluZyBwcm9wZXJ0eQorICAvLy8KKyAgLy8vIC0gdGhyb3dzOiByZXRocm93cyBhbnkgRXJyb3IgdGhyb3duIGluIGJsb2NrCisgIHByaXZhdGUgZnVuYyBmb3JFYWNoKF8gYmxvY2s6IChfIG5hbWU6IFN0cmluZywgXyB2YWx1ZTogVFNlcmlhbGl6YWJsZSwgXyBpZDogSW50MzIpIHRocm93cyAtPiBWb2lkKSByZXRocm93cyB7CisgICAgLy8gTWlycm9yIHRoZSBvYmplY3QsIGdldHRpbmcgKG5hbWU6IFN0cmluZz8sIHZhbHVlOiBBbnkpIGZvciBldmVyeSBwcm9wZXJ0eQorICAgIGxldCBtaXJyb3IgPSBNaXJyb3IocmVmbGVjdGluZzogc2VsZikKKyAgICAKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGNoaWxkcmVuLCBpZ25vcmUgZW1wdHkgcHJvcGVydHkgbmFtZXMKKyAgICBmb3IgKHByb3BOYW1lLCBwcm9wVmFsdWUpIGluIG1pcnJvci5jaGlsZHJlbiB7CisgICAgICBndWFyZCBsZXQgcHJvcE5hbWUgPSBwcm9wTmFtZSBlbHNlIHsgY29udGludWUgfQorCisgICAgICBpZiBsZXQgdHZhbCA9IHVud3JhcChhbnk6IHByb3BWYWx1ZSkgYXM/IFRTZXJpYWxpemFibGUsIGxldCBpZCA9IFNlbGYuZmllbGRJZHNbcHJvcE5hbWVdIHsKKyAgICAgICAgdHJ5IGJsb2NrKHByb3BOYW1lLCB0dmFsLCBpZCkKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIAorICAvLy8gQW55IGNhbiBteXN0ZXJpb3VzbHkgYmUgYW4gT3B0aW9uYWw8QW55PiBhdCB0aGUgc2FtZSB0aW1lLAorICAvLy8gdGhpcyBjaGVja3MgYW5kIGFsd2F5cyByZXR1cm5zIE9wdGlvbmFsPEFueT4gd2l0aG91dCBkb3VibGUgd3JhcHBpbmcKKyAgLy8vIHdlIHRoZW4gdHJ5IHRvIGJpbmQgdmFsdWUgYXMgVFNlcmlhbGl6YWJsZSB0byBpZ25vcmUgYW55IGV4dGVuc2lvbiBwcm9wZXJ0aWVzCisgIC8vLyBhbmQgdGhlIGxpa2UgYW5kIHZlcmlmeSB0aGUgcHJvcGVydHkgZXhpc3RzIGFuZCBncmFiIHRoZSBUaHJpZnQKKyAgLy8vIHByb3BlcnR5IElEIGF0IHRoZSBzYW1lIHRpbWUKKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBhbnk6IEFueSBpbnN0YW5jZSB0byBhdHRlbXB0IHRvIHVud3JhcAorICAvLy8KKyAgLy8vIC0gcmV0dXJuczogVW53cmFwcGVkIEFueSBhcyBPcHRpb25hbDxBbnk+CisgIHByaXZhdGUgZnVuYyB1bndyYXAoYW55OiBBbnkpIC0+IEFueT8geworICAgIGxldCBtaSA9IE1pcnJvcihyZWZsZWN0aW5nOiBhbnkpCisgICAgCisgICAgaWYgbWkuZGlzcGxheVN0eWxlICE9IC5vcHRpb25hbCB7IHJldHVybiBhbnkgfQorICAgIGlmIG1pLmNoaWxkcmVuLmNvdW50ID09IDAgeyByZXR1cm4gbmlsIH0KKyAgICAKKyAgICBsZXQgKF8sIHNvbWUpID0gbWkuY2hpbGRyZW4uZmlyc3QhCisgICAgcmV0dXJuIHNvbWUKKyAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiYmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDY0IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgcHJvdG9jb2wgVFRyYW5zcG9ydCB7CisgIAorICAvLyBSZXF1aXJlZAorICBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YQorICBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cworICBmdW5jIGZsdXNoKCkgdGhyb3dzCisKKyAgLy8gT3B0aW9uYWwgKGRlZmF1bHQgcHJvdmlkZWQpCisgIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhCisgIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wKKyAgZnVuYyBvcGVuKCkgdGhyb3dzCisgIGZ1bmMgY2xvc2UoKSB0aHJvd3MKK30KKworcHVibGljIGV4dGVuc2lvbiBUVHJhbnNwb3J0IHsKKyAgZnVuYyBpc09wZW4oKSB0aHJvd3MgLT4gQm9vbCB7IHJldHVybiB0cnVlIH0KKyAgZnVuYyBvcGVuKCkgdGhyb3dzIHsgfQorICBmdW5jIGNsb3NlKCkgdGhyb3dzIHsgfQorICAKKyAgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdmFyIGhhdmUgPSAwCisgICAgd2hpbGUgaGF2ZSA8IHNpemUgeworICAgICAgbGV0IGNodW5rID0gdHJ5IHNlbGYucmVhZChzaXplOiBzaXplIC0gaGF2ZSkKKyAgICAgIGhhdmUgKz0gY2h1bmsuY291bnQKKyAgICAgIGJ1ZmYuYXBwZW5kKGNodW5rKQorICAgICAgaWYgY2h1bmsuY291bnQgPT0gMCB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1ZmYKKyAgfQorfQorCitwdWJsaWMgcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIC8vIEZhY3RvcnkKKyAgZnVuYyBmbHVzaChfIGNvbXBsZXRpb246IEBlc2NhcGluZyAoVEFzeW5jVHJhbnNwb3J0LCBFcnJvcj8pIC0+KCkpCit9CisKK3B1YmxpYyBwcm90b2NvbCBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IHsKKyAgYXNzb2NpYXRlZHR5cGUgVHJhbnNwb3J0IDogVEFzeW5jVHJhbnNwb3J0CisgIGZ1bmMgbmV3VHJhbnNwb3J0KCkgLT4gVHJhbnNwb3J0Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkMDA1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnRFcnJvci5zd2lmdApAQCAtMCwwICsxLDg2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwdWJsaWMgc3RydWN0IFRUcmFuc3BvcnRFcnJvcjogVEVycm9yIHsKKyAgcHVibGljIGVudW0gRXJyb3JDb2RlOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIG5vdE9wZW4KKyAgICBjYXNlIGFscmVhZHlPcGVuCisgICAgY2FzZSB0aW1lZE91dAorICAgIGNhc2UgZW5kT2ZGaWxlCisgICAgY2FzZSBuZWdhdGl2ZVNpemUKKyAgICBjYXNlIHNpemVMaW1pdChsaW1pdDogSW50LCBnb3Q6IEludCkKKyAgICAKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgcmV0dXJuIDAKKyAgICAgIGNhc2UgLm5vdE9wZW46ICAgICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLmFscmVhZHlPcGVuOiAgcmV0dXJuIDIKKyAgICAgIGNhc2UgLnRpbWVkT3V0OiAgICAgcmV0dXJuIDMKKyAgICAgIGNhc2UgLmVuZE9mRmlsZTogICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogcmV0dXJuIDUKKyAgICAgIGNhc2UgLnNpemVMaW1pdDogICAgcmV0dXJuIDYKKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgcmV0dXJuICJVbmtub3duIFRUcmFuc3BvcnRFcnJvciIKKyAgICAgIGNhc2UgLm5vdE9wZW46ICAgICAgcmV0dXJuICJOb3QgT3BlbiIKKyAgICAgIGNhc2UgLmFscmVhZHlPcGVuOiAgcmV0dXJuICJBbHJlYWR5IE9wZW4iCisgICAgICBjYXNlIC50aW1lZE91dDogICAgIHJldHVybiAiVGltZWQgT3V0IgorICAgICAgY2FzZSAuZW5kT2ZGaWxlOiAgICByZXR1cm4gIkVuZCBPZiBGaWxlIgorICAgICAgY2FzZSAubmVnYXRpdmVTaXplOiByZXR1cm4gIk5lZ2F0aXZlIFNpemUiCisgICAgICBjYXNlIC5zaXplTGltaXQobGV0IGxpbWl0LCBsZXQgZ290KToKKyAgICAgICAgcmV0dXJuICJNZXNzYWdlIGV4Y2VlZHMgc2l6ZSBsaW1pdCBvZiBcKGxpbWl0KSAocmVjZWl2ZWQ6IFwoZ290KSIKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHVibGljIHZhciBlcnJvcjogRXJyb3JDb2RlID0gLnVua25vd24KKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLnVua25vd24gfQorICAKKyAgcHVibGljIGluaXQoKSB7IH0KKworfQorCisvLy8gVEhUVFBUcmFuc3BvcnRFcnJvcgorLy8vCisvLy8gRXJyb3IncyB0aHJvd24gb24gSFRUUCBUcmFuc3BvcnQKK3B1YmxpYyBzdHJ1Y3QgVEhUVFBUcmFuc3BvcnRFcnJvcjogVEVycm9yIHsKKyAgcHVibGljIGVudW0gRXJyb3JDb2RlOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIGludmFsaWRSZXNwb25zZQorICAgIGNhc2UgaW52YWxpZFN0YXR1cyhzdGF0dXNDb2RlOiBJbnQpCisgICAgY2FzZSBhdXRoZW50aWNhdGlvbgorICAgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC5pbnZhbGlkUmVzcG9uc2U6ICAgICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBIVFRQIFJlc3BvbnNlIgorICAgICAgY2FzZSAuaW52YWxpZFN0YXR1cyhsZXQgc3RhdHVzQ29kZSk6ICByZXR1cm4gIkludmFsaWQgSFRUUCBTdGF0dXMgQ29kZSAoXChzdGF0dXNDb2RlKSkiCisgICAgICBjYXNlIC5hdXRoZW50aWNhdGlvbjogICAgICAgICAgICAgICAgIHJldHVybiAiQXV0aGVudGljYXRpb24gRXJyb3IiCisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeyByZXR1cm4gMCB9CisgIH0KKyAgcHVibGljIHZhciBlcnJvcjogRXJyb3JDb2RlID0gLmludmFsaWRSZXNwb25zZQorICBwdWJsaWMgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgcHVibGljIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IEVycm9yQ29kZSB7IHJldHVybiAuaW52YWxpZFJlc3BvbnNlIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RXcmFwcGVkUHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODU3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsMjA4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbiAvLyBGb3IgKE5TKURhdGEKKworCisvLy8gR2VuZXJpYyBwcm90b2NvbCwgaW1wbGVtZW50ZXMgVFByb3RvY29sIGFuZCB3cmFwcyBhIGNvbmNyZXRlIHByb3RvY29sLgorLy8vIFVzZWZ1bCBmb3IgZ2VuZXJpY2FsbHkgc3ViY2xhc3NpbmcgcHJvdG9jb2xzIHRvIG92ZXJyaWRlIHNwZWNpZmljIG1ldGhvZHMgCisvLy8gKGkuZS4gVE11bHRpcGxleGVkUHJvdG9jb2wpCitvcGVuIGNsYXNzIFRXcmFwcGVkUHJvdG9jb2w8UHJvdG9jb2w6IFRQcm90b2NvbD4gOiBUUHJvdG9jb2wgeworICB2YXIgY29uY3JldGVQcm90b2NvbDogUHJvdG9jb2wKKyAgCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wudHJhbnNwb3J0CisgICAgfQorICAgIHNldCB7CisgICAgICBjb25jcmV0ZVByb3RvY29sLnRyYW5zcG9ydCA9IG5ld1ZhbHVlCisgICAgfQorICB9CisKKyAgcHVibGljIHJlcXVpcmVkIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0KSB7CisgICAgc2VsZi5jb25jcmV0ZVByb3RvY29sID0gUHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgfQorICAKKyAgLy8gUmVhZCBtZXRob2RzCisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1hcEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1hcEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTGlzdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMiB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICAvLyBXcml0ZSBtZXRob2RzCisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IG1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RydWN0QmVnaW4obmFtZTogbmFtZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLCBmaWVsZElEOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkQmVnaW4obmFtZTogbmFtZSwgdHlwZTogZmllbGRUeXBlLCBmaWVsZElEOiBmaWVsZElEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNYXBCZWdpbihrZXlUeXBlOiBrZXlUeXBlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTZXRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RFbmQoKQorICB9CisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUoZGF0YSkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDE3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UaHJpZnQuc3dpZnQKQEAgLTAsMCArMSwzIEBACitjbGFzcyBUaHJpZnQgeworCWxldCB2ZXJzaW9uID0gIjEuMS4wIgorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL0xpbnV4TWFpbi5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4ZmVjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQKQEAgLTAsMCArMSw4IEBACitpbXBvcnQgWENUZXN0CitAdGVzdGFibGUgaW1wb3J0IFRocmlmdFRlc3RzCisKK1hDVE1haW4oWworICAgICB0ZXN0Q2FzZShUaHJpZnRUZXN0cy5hbGxUZXN0cyksCisgICAgIHRlc3RDYXNlKFRCaW5hcnlQcm90b2NvbFRlc3RzLmFsbFRlc3RzKSwKKyAgICAgdGVzdENhc2UoVENvbXBhY3RQcm90b2NvbFRlc3RzLmFsbFRlc3RzKSwKK10pCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhNTU3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdApAQCAtMCwwICsxLDE2OCBAQAorLy8KKy8vICBUQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdAorLy8gIFRocmlmdAorLy8KKy8vICBDcmVhdGVkIGJ5IENocmlzdG9waGVyIFNpbXBzb24gb24gOC8xOC8xNi4KKy8vCisvLworCitpbXBvcnQgWENUZXN0CitpbXBvcnQgRm91bmRhdGlvbgorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnQKKworCisvLy8gVGVzdGluZyBCaW5hcnkgcHJvdG9jb2wgcmVhZC93cml0ZSBhZ2FpbnN0IGl0c2VsZgorLy8vIFVzZXMgc2VwYXJhdGUgcmVhZC93cml0ZSB0cmFuc3BvcnQvcHJvdG9jb2xzIAorY2xhc3MgVEJpbmFyeVByb3RvY29sVGVzdHM6IFhDVGVzdENhc2UgeworICB2YXIgdHJhbnNwb3J0OiBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0ID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydChmbHVzaEhhbmRsZXI6IHsKKyAgICAkMC5yZXNldChyZWFkQnVmZmVyOiAkMSkKKyAgfSkKKyAgCisgIHZhciBwcm90bzogVEJpbmFyeVByb3RvY29sIQorICAKKyAgb3ZlcnJpZGUgZnVuYyBzZXRVcCgpIHsKKyAgICBzdXBlci5zZXRVcCgpCisgICAgcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBvdmVycmlkZSBmdW5jIHRlYXJEb3duKCkgeworICAgIHN1cGVyLnRlYXJEb3duKCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ4V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogVUludDggPSAyNTAKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBVSW50OCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBVSW50OCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDE2V3JpdGVSZWFkKCkgeworCisgICAgbGV0IHdyaXRlVmFsOiBJbnQxNiA9IDEyMzEyCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisgICAgbGV0IHJlYWRWYWw6IEludDE2ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDE2LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MzJXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQzMiA9IDIwMjkyMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQzMiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQzMiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDY0V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50NjQgPSAyMzQyMzQ5ODEzNzQxMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQ2NCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQ2NCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERvdWJsZVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERvdWJsZSA9IDMuMTQxNTkyNgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERvdWJsZSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMC4wCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERvdWJsZSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEJvb2xXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBCb29sID0gdHJ1ZQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEJvb2wgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IGZhbHNlCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEJvb2wsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJpbmdXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBTdHJpbmcgPSAiSGVsbG8gV29ybGQiCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogU3RyaW5nIQorICAgIGRvIHsKKyAgICAgIHJlYWRWYWwgPSB0cnkgcHJvdG8ucmVhZCgpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkVycm9yIHJlYWRpbmcgXChlcnJvcikiKQorICAgICAgcmV0dXJuCisgICAgfQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBTdHJpbmcsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REYXRhV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRGF0YSA9ICJEYXRhIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRGF0YSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gIkdvb2RieWUgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRGF0YSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cnVjdFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgbXNnID0gIlRlc3QgUHJvdG9jb2wgRXJyb3IiCisgICAgbGV0IHdyaXRlVmFsID0gVEFwcGxpY2F0aW9uRXJyb3IoZXJyb3I6IC5wcm90b2NvbEVycm9yLCBtZXNzYWdlOiBtc2cpCisgICAgZG8geworICAgICAgdHJ5IHdyaXRlVmFsLndyaXRlKHRvOiBwcm90bykKKyAgICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byB3cml0ZSBcKGVycm9yKSIpCisgICAgfQorICAgIAorICAgIGRvIHsKKyAgICAgIGxldCByZWFkVmFsID0gdHJ5IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgd3JpdGVWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCAiRXJyb3IgY2FzZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLmVycm9yKSBnb3QgXCh3cml0ZVZhbC5lcnJvcikiKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5tZXNzYWdlLCB3cml0ZVZhbC5tZXNzYWdlLCAiRXJyb3IgbWVzc2FnZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLm1lc3NhZ2UpIGdvdCBcKHdyaXRlVmFsLm1lc3NhZ2UpIikKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gcmVhZCBcKGVycm9yKSIpCisgICAgfQorICB9CisgIGZ1bmMgdGVzdFVuc2FmZUJpdGNhc3RVcGRhdGUoKSB7CisgICAgbGV0IHZhbHVlOiBEb3VibGUgPSAzLjE0MTU5CisgICAgbGV0IHZhbDogSW50NjQgPSAzMTQxNTkyNgorICAgIGxldCB1dmFsOiBVSW50NjQgPSAzMTQxNTkyNgorICAgIAorICAgIGxldCBpNjQgPSBJbnQ2NChiaXRQYXR0ZXJuOiB2YWx1ZS5iaXRQYXR0ZXJuKQorICAgIGxldCB1YmMgPSB1bnNhZmVCaXRDYXN0KHZhbHVlLCB0bzogSW50NjQuc2VsZikKKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbChpNjQsIHViYywgIkJpdGNhc3QgRG91YmxlLT4gaTY0IFZhbHVlcyBkb24ndCBtYXRjaCIpCisgICAgCisgICAgbGV0IGRibCA9IERvdWJsZShiaXRQYXR0ZXJuOiBVSW50NjQodmFsKSkKKyAgICBsZXQgdWJkYiA9IHVuc2FmZUJpdENhc3QodmFsLCB0bzogRG91YmxlLnNlbGYpCisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwoZGJsLCB1YmRiLCAiQml0Y2FzdCBpNjQgLT4gRG91YmxlIFZhbHVlcyBkb24ndCBtYXRjaCIpCisgICAgCisgICAgbGV0IGRiMiA9IERvdWJsZShiaXRQYXR0ZXJuOiB1dmFsKQorICAgIGxldCB1c2JjMiA9IHVuc2FmZUJpdENhc3QodXZhbCwgdG86IERvdWJsZS5zZWxmKQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKGRiMiwgdXNiYzIsICJCaXRjYXN0IHU2NCAtPiBEb3VibGUgVmFsdWVzIGRvbid0IG1hdGNoIikKKworICAgIAorICB9CisgIAorICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUQmluYXJ5UHJvdG9jb2xUZXN0cykgLT4gKCkgdGhyb3dzIC0+IFZvaWQpXSB7CisgICAgcmV0dXJuIFsKKyAgICAgICgidGVzdEludDhXcml0ZVJlYWQiLCB0ZXN0SW50OFdyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQxNldyaXRlUmVhZCIsIHRlc3RJbnQxNldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQzMldyaXRlUmVhZCIsIHRlc3RJbnQzMldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQ2NFdyaXRlUmVhZCIsIHRlc3RJbnQ2NFdyaXRlUmVhZCksCisgICAgICAoInRlc3REb3VibGVXcml0ZVJlYWQiLCB0ZXN0RG91YmxlV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEJvb2xXcml0ZVJlYWQiLCB0ZXN0Qm9vbFdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJpbmdXcml0ZVJlYWQiLCB0ZXN0U3RyaW5nV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERhdGFXcml0ZVJlYWQiLCB0ZXN0RGF0YVdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJ1Y3RXcml0ZVJlYWQiLCB0ZXN0U3RydWN0V3JpdGVSZWFkKQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyYzI2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQKQEAgLTAsMCArMSwyMTAgQEAKKy8vCisvLyAgVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0CisvLyAgVGhyaWZ0CisvLworLy8gIENyZWF0ZWQgYnkgQ2hyaXN0b3BoZXIgU2ltcHNvbiBvbiA4LzE5LzE2LgorLy8KKy8vCisKK2ltcG9ydCBYQ1Rlc3QKK2ltcG9ydCBGb3VuZGF0aW9uCitAdGVzdGFibGUgaW1wb3J0IFRocmlmdAorCisKKy8vLyBUZXN0aW5nIEJpbmFyeSBwcm90b2NvbCByZWFkL3dyaXRlIGFnYWluc3QgaXRzZWxmCisvLy8gVXNlcyBzZXBhcmF0ZSByZWFkL3dyaXRlIHRyYW5zcG9ydC9wcm90b2NvbHMKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xUZXN0czogWENUZXN0Q2FzZSB7CisgIHZhciB0cmFuc3BvcnQ6IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KGZsdXNoSGFuZGxlcjogeworICAgICQwLnJlc2V0KHJlYWRCdWZmZXI6ICQxKQorICB9KQorICB2YXIgcHJvdG86IFRDb21wYWN0UHJvdG9jb2whCisgIAorICBvdmVycmlkZSBmdW5jIHNldFVwKCkgeworICAgIHN1cGVyLnNldFVwKCkKKyAgICBwcm90byA9IFRDb21wYWN0UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBvdmVycmlkZSBmdW5jIHRlYXJEb3duKCkgeworICAgIHN1cGVyLnRlYXJEb3duKCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ4V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogVUludDggPSAyNTAKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKyAgICBsZXQgcmVhZFZhbDogVUludDggPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggVUludDgsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQxNldyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDE2ID0gMTIzMTIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQxNiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQxNiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDMyV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50MzIgPSAyMDI5MjM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50MzIgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MzIsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ2NFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDY0ID0gMjM0MjM0OTgxMzc0MTM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50NjQgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50NjQsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REb3VibGVXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEb3VibGUgPSAzLjE0MTU5MjYKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEb3VibGUgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAuMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEb3VibGUsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RCb29sV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogQm9vbCA9IHRydWUKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBCb29sID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyBmYWxzZQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBCb29sLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RyaW5nV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogU3RyaW5nID0gIkhlbGxvIFdvcmxkIgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IFN0cmluZyEKKyAgICBkbyB7CisgICAgICByZWFkVmFsID0gdHJ5IHByb3RvLnJlYWQoKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJFcnJvciByZWFkaW5nIFwoZXJyb3IpIikKKyAgICAgIHJldHVybgorICAgIH0KKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggU3RyaW5nLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RGF0YVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERhdGEgPSAiRGF0YSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERhdGEgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/ICJHb29kYnllIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERhdGEsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJ1Y3RXcml0ZVJlYWQoKSB7CisgICAgbGV0IG1zZyA9ICJUZXN0IFByb3RvY29sIEVycm9yIgorICAgIGxldCB3cml0ZVZhbCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAucHJvdG9jb2xFcnJvciwgbWVzc2FnZTogbXNnKQorICAgIGRvIHsKKyAgICAgIHRyeSB3cml0ZVZhbC53cml0ZSh0bzogcHJvdG8pCisgICAgICB0cnkgdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byB3cml0ZSBcKGVycm9yKSIpCisgICAgfQorICAgIAorICAgIGRvIHsKKyAgICAgIGxldCByZWFkVmFsID0gdHJ5IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgd3JpdGVWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCAiRXJyb3IgY2FzZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLmVycm9yKSBnb3QgXCh3cml0ZVZhbC5lcnJvcikiKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5tZXNzYWdlLCB3cml0ZVZhbC5tZXNzYWdlLCAiRXJyb3IgbWVzc2FnZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLm1lc3NhZ2UpIGdvdCBcKHdyaXRlVmFsLm1lc3NhZ2UpIikKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gcmVhZCBcKGVycm9yKSIpCisgICAgfQorICB9CisgIAorICBmdW5jIHRlc3RJbnQzMlppZ1phZygpIHsKKyAgICBsZXQgemVybzogSW50MzIgPSAwCisgICAgbGV0IG9uZTogSW50MzIgPSAxCisgICAgbGV0IG5PbmU6IEludDMyID0gLTEKKyAgICBsZXQgdHdvOiBJbnQzMiA9IDIKKyAgICBsZXQgblR3bzogSW50MzIgPSAtMgorICAgIGxldCBtYXggPSBJbnQzMi5tYXgKKyAgICBsZXQgbWluID0gSW50MzIubWluCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyh6ZXJvKSwgVUludDMyKDApLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoemVybykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDApLCB6ZXJvLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoemVybykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcobk9uZSksIFVJbnQzMigxKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5PbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigxKSwgbk9uZSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5PbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG9uZSksIFVJbnQzMigyKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDIpLCBvbmUsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChvbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG5Ud28pLCBVSW50MzIoMyksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMyksIG5Ud28sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyh0d28pLCBVSW50MzIoNCksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXCh0d28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMig0KSwgdHdvLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwodHdvKSIpCisKKyAgICBsZXQgdU1heE1pbnVzT25lOiBVSW50MzIgPSBVSW50MzIubWF4IC0gMQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG1heCksIHVNYXhNaW51c09uZSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1heCkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKHVNYXhNaW51c09uZSksIG1heCwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1heCkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcobWluKSwgVUludDMyLm1heCwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1pbikiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKFVJbnQzMi5tYXgpLCBtaW4sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgfQorCisgIGZ1bmMgdGVzdEludDY0WmlnWmFnKCkgeworICAgIGxldCB6ZXJvOiBJbnQ2NCA9IDAKKyAgICBsZXQgb25lOiBJbnQ2NCA9IDEKKyAgICBsZXQgbk9uZTogSW50NjQgPSAtMQorICAgIGxldCB0d286IEludDY0ID0gMgorICAgIGxldCBuVHdvOiBJbnQ2NCA9IC0yCisgICAgbGV0IG1heCA9IEludDY0Lm1heAorICAgIGxldCBtaW4gPSBJbnQ2NC5taW4KKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKHplcm8pLCBVSW50NjQoMCksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMCksIHplcm8sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhuT25lKSwgVUludDY0KDEpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobk9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDEpLCBuT25lLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobk9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcob25lKSwgVUludDY0KDIpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwob25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMiksIG9uZSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcoblR3byksIFVJbnQ2NCgzKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5Ud28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgzKSwgblR3bywgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5Ud28pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKHR3byksIFVJbnQ2NCg0KSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKHR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDQpLCB0d28sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh0d28pIikKKworICAgIGxldCB1TWF4TWludXNPbmU6IFVJbnQ2NCA9IFVJbnQ2NC5tYXggLSAxCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcobWF4KSwgdU1heE1pbnVzT25lLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWF4KSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQodU1heE1pbnVzT25lKSwgbWF4LCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWF4KSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhtaW4pLCBVSW50NjQubWF4LCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWluKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoVUludDY0Lm1heCksIG1pbiwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1pbikiKQorICB9CisgIAorICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUQ29tcGFjdFByb3RvY29sVGVzdHMpIC0+ICgpIHRocm93cyAtPiBWb2lkKV0geworICAgIHJldHVybiBbCisgICAgICAoInRlc3RJbnQ4V3JpdGVSZWFkIiwgdGVzdEludDhXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MTZXcml0ZVJlYWQiLCB0ZXN0SW50MTZXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MzJXcml0ZVJlYWQiLCB0ZXN0SW50MzJXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50NjRXcml0ZVJlYWQiLCB0ZXN0SW50NjRXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RG91YmxlV3JpdGVSZWFkIiwgdGVzdERvdWJsZVdyaXRlUmVhZCksCisgICAgICAoInRlc3RCb29sV3JpdGVSZWFkIiwgdGVzdEJvb2xXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RyaW5nV3JpdGVSZWFkIiwgdGVzdFN0cmluZ1dyaXRlUmVhZCksCisgICAgICAoInRlc3REYXRhV3JpdGVSZWFkIiwgdGVzdERhdGFXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RydWN0V3JpdGVSZWFkIiwgdGVzdFN0cnVjdFdyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQzMlppZ1phZyIsIHRlc3RJbnQzMlppZ1phZyksCisgICAgICAoInRlc3RJbnQ2NFppZ1phZyIsIHRlc3RJbnQ2NFppZ1phZykKKyAgICBdCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UaHJpZnRUZXN0cy5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UaHJpZnRUZXN0cy5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE2MTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RocmlmdFRlc3RzLnN3aWZ0CkBAIC0wLDAgKzEsMTggQEAKK2ltcG9ydCBYQ1Rlc3QKK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0CisKK2NsYXNzIFRocmlmdFRlc3RzOiBYQ1Rlc3RDYXNlIHsKKyAgZnVuYyB0ZXN0VmVyc2lvbigpIHsKKyAgICBYQ1RBc3NlcnRFcXVhbChUaHJpZnQoKS52ZXJzaW9uLCAiMS4xLjAiKQorICB9CisKKyAgZnVuYyB0ZXN0X2luX2FkZHJfZXh0ZW5zaW9uKCkgeworCisgIH0KKworICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUaHJpZnRUZXN0cykgLT4gKCkgdGhyb3dzIC0+IFZvaWQpXSB7CisgICAgcmV0dXJuIFsKKyAgICAgICgidGVzdFZlcnNpb24iLCB0ZXN0VmVyc2lvbiksCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvdHMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi90cy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdHMvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi90cy90aHJpZnQuZC50cyBiL2xpYi90cy90aHJpZnQuZC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmE0NmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3RzL3RocmlmdC5kLnRzCkBAIC0wLDAgKzEsNjk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2RlY2xhcmUgbW9kdWxlIFRocmlmdCB7CisgIC8qKgorICAgKiBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5IHZlcnNpb24uCisgICAqLworICB2YXIgVmVyc2lvbjogc3RyaW5nOworCisgIC8qKgorICAgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgU1RPUCAgIC0gRW5kIG9mIGEgc2V0IG9mIGZpZWxkcy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBWT0lEICAgLSBObyB2YWx1ZSAob25seSBsZWdhbCBmb3IgcmV0dXJuIHR5cGVzKS4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBCT09MICAgLSBUcnVlL0ZhbHNlIGludGVnZXIuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQllURSAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTA4ICAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuICAgICAKKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBET1VCTEUgLSA2NCBiaXQgSUVFRSA4NTQgZmxvYXRpbmcgcG9pbnQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTE2ICAgIC0gU2lnbmVkIDE2IGJpdCBpbnRlZ2VyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEkzMiAgICAtIFNpZ25lZCAzMiBiaXQgaW50ZWdlci4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJNjQgICAgLSBTaWduZWQgNjQgYml0IGludGVnZXIuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgU1RSSU5HIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGNyAgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjcgZW5jb2RlZCBjaGFyYWN0ZXJzLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNUUlVDVCAtIEEgbXVsdGlmaWVsZCB0eXBlLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIE1BUCAgICAtIEEgY29sbGVjdGlvbiB0eXBlIChtYXAvYXNzb2NpYXRpdmUtYXJyYXkvZGljdGlvbmFyeSkuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgU0VUICAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKHVub3JkZXJlZCBhbmQgd2l0aG91dCByZXBlYXRlZCB2YWx1ZXMpLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIExJU1QgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQpLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjggICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEY4IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBVVEYxNiAgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgVVRGMTYgZW5jb2RlZCBjaGFyYWN0ZXJzLgorICAgKi8KKyAgaW50ZXJmYWNlIFR5cGUgeworICAgICdTVE9QJzogbnVtYmVyOworICAgICdWT0lEJzogbnVtYmVyOworICAgICdCT09MJzogbnVtYmVyOworICAgICdCWVRFJzogbnVtYmVyOworICAgICdJMDgnOiBudW1iZXI7CisgICAgJ0RPVUJMRSc6IG51bWJlcjsKKyAgICAnSTE2JzogbnVtYmVyOworICAgICdJMzInOiBudW1iZXI7CisgICAgJ0k2NCc6IG51bWJlcjsKKyAgICAnU1RSSU5HJzogbnVtYmVyOworICAgICdVVEY3JzogbnVtYmVyOworICAgICdTVFJVQ1QnOiBudW1iZXI7CisgICAgJ01BUCc6IG51bWJlcjsKKyAgICAnU0VUJzogbnVtYmVyOworICAgICdMSVNUJzogbnVtYmVyOworICAgICdVVEY4JzogbnVtYmVyOworICAgICdVVEYxNic6IG51bWJlcjsKKyAgfQorICB2YXIgVHlwZTogVHlwZTsKKworICAvKioKKyAgICogVGhyaWZ0IFJQQyBtZXNzYWdlIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ0FMTCAgICAgIC0gUlBDIGNhbGwgc2VudCBmcm9tIGNsaWVudCB0byBzZXJ2ZXIuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgUkVQTFkgICAgIC0gUlBDIGNhbGwgbm9ybWFsIHJlc3BvbnNlIGZyb20gc2VydmVyIHRvIGNsaWVudC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBFWENFUFRJT04gLSBSUEMgY2FsbCBleGNlcHRpb24gcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50LgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIE9ORVdBWSAgICAtIE9uZXdheSBSUEMgY2FsbCBmcm9tIGNsaWVudCB0byBzZXJ2ZXIgd2l0aCBubyByZXNwb25zZS4KKyAgICovCisgIGludGVyZmFjZSBNZXNzYWdlVHlwZSB7CisgICAgJ0NBTEwnOiBudW1iZXI7CisgICAgJ1JFUExZJzogbnVtYmVyOworICAgICdFWENFUFRJT04nOiBudW1iZXI7CisgICAgJ09ORVdBWSc6IG51bWJlcjsKKyAgfQorICB2YXIgTWVzc2FnZVR5cGU6IE1lc3NhZ2VUeXBlOworCisgIC8qKgorICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHJldHVybmluZyB0aGUgY291bnQgb2YgYW4gb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuCisgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBPYmplY3QgdG8gdGVzdC4KKyAgICogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzCisgICAqLworICBmdW5jdGlvbiBvYmplY3RMZW5ndGgob2JqOiBPYmplY3QpOiBudW1iZXI7CisKKyAgLyoqCisgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHByb3RvdHlwZSBpbmhlcml0YW5jZS4KKyAgICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3IgLSBDb250c3RydWN0b3IgZnVuY3Rpb24gdG8gc2V0IGFzIGRlcml2ZWQuCisgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ29uc3RydWN0b3IgLSBDb250c3RydWN0b3IgZnVuY3Rpb24gdG8gc2V0IGFzIGJhc2UuCisgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBUeXBlIG5hbWUgdG8gc2V0IGFzIG5hbWUgcHJvcGVydHkgaW4gZGVyaXZlZCBwcm90b3R5cGUuCisgICAqLworICBmdW5jdGlvbiBpbmhlcml0cyhjb25zdHJ1Y3RvcjogRnVuY3Rpb24sIHN1cGVyQ29uc3RydWN0b3I6IEZ1bmN0aW9uLCBuYW1lPzogc3RyaW5nKTogdm9pZDsKKworICAvKioKKyAgICogVEV4Y2VwdGlvbiBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBleGNlcHRpb25zIHR5cGVzLgorICAgKi8KKyAgY2xhc3MgVEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEVycm9yIHsKKyAgICBuYW1lOiBzdHJpbmc7CisgICAgbWVzc2FnZTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgVEV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBURXhjZXB0aW9uIG1lc3NhZ2UgKGRpc3RpbmN0IGZyb20gdGhlIEVycm9yIG1lc3NhZ2UpLgorICAgICAqLworICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHNldCBvbiB0aGUgZXhjZXB0aW9uLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGV4Y2VwdGlvbiBtZXNzYWdlCisgICAgICovCisgICAgZ2V0TWVzc2FnZSgpOiBzdHJpbmc7CisgIH0KKworICAvKioKKyAgICogVGhyaWZ0IEFwcGxpY2F0aW9uIEV4Y2VwdGlvbiB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVOS05PV04gICAgICAgICAgICAgICAgIC0gVW5rbm93bi91bmRlZmluZWQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5LTk9XTl9NRVRIT0QgICAgICAgICAgLSBDbGllbnQgYXR0ZW1wdGVkIHRvIGNhbGwgYSBtZXRob2QgdW5rbm93biB0byB0aGUgc2VydmVyLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfTUVTU0FHRV9UWVBFICAgIC0gQ2xpZW50IHBhc3NlZCBhbiB1bmtub3duL3Vuc3VwcG9ydGVkIE1lc3NhZ2VUeXBlLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIFdST05HX01FVEhPRF9OQU1FICAgICAgIC0gVW51c2VkLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJBRF9TRVFVRU5DRV9JRCAgICAgICAgIC0gVW51c2VkIGluIFRocmlmdCBSUEMsIHVzZWQgdG8gZmxhZyBwcm9wcmlldGFyeSBzZXF1ZW5jZSBudW1iZXIgZXJyb3JzLgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIE1JU1NJTkdfUkVTVUxUICAgICAgICAgIC0gUmFpc2VkIGJ5IGEgc2VydmVyIHByb2Nlc3NvciBpZiBhIGhhbmRsZXIgZmFpbHMgdG8gc3VwcGx5IHRoZSByZXF1aXJlZCByZXR1cm4gcmVzdWx0LgorICAgKiBAcHJvcGVydHkge251bWJlcn0gIElOVEVSTkFMX0VSUk9SICAgICAgICAgIC0gU29tZXRoaW5nIGJhZCBoYXBwZW5lZC4KKyAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBQUk9UT0NPTF9FUlJPUiAgICAgICAgICAtIFRoZSBwcm90b2NvbCBsYXllciBmYWlsZWQgdG8gc2VyaWFsaXplIG9yIGRlc2VyaWFsaXplIGRhdGEuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSU5WQUxJRF9UUkFOU0ZPUk0gICAgICAgLSBVbnVzZWQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSU5WQUxJRF9QUk9UT0NPTCAgICAgICAgLSBUaGUgcHJvdG9jb2wgKG9yIHZlcnNpb24pIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgLSBVbnVzZWQuCisgICAqLworICBpbnRlcmZhY2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB7CisgICAgJ1VOS05PV04nOiBudW1iZXI7CisgICAgJ1VOS05PV05fTUVUSE9EJzogbnVtYmVyOworICAgICdJTlZBTElEX01FU1NBR0VfVFlQRSc6IG51bWJlcjsKKyAgICAnV1JPTkdfTUVUSE9EX05BTUUnOiBudW1iZXI7CisgICAgJ0JBRF9TRVFVRU5DRV9JRCc6IG51bWJlcjsKKyAgICAnTUlTU0lOR19SRVNVTFQnOiBudW1iZXI7CisgICAgJ0lOVEVSTkFMX0VSUk9SJzogbnVtYmVyOworICAgICdQUk9UT0NPTF9FUlJPUic6IG51bWJlcjsKKyAgICAnSU5WQUxJRF9UUkFOU0ZPUk0nOiBudW1iZXI7CisgICAgJ0lOVkFMSURfUFJPVE9DT0wnOiBudW1iZXI7CisgICAgJ1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFJzogbnVtYmVyOworICB9CisgIHZhciBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlOiBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlOworCisgIC8qKgorICAgKiBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyB1c2VkIHRvIHByb3BhZ2F0ZSBleGNlcHRpb25zIGZyb20gYW4gUlBDIHNlcnZlciBiYWNrIHRvIGEgY2FsbGluZyBjbGllbnQuCisgICAqLworICBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKKyAgICBtZXNzYWdlOiBzdHJpbmc7CisgICAgY29kZTogbnVtYmVyOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBtZXNzYWdlIChkaXN0aW5jdCBmcm9tIHRoZSBFcnJvciBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlfSBbY29kZV0gLSBUaGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSBjb2RlLgorICAgICAqLworICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgY29kZT86IG51bWJlcik7CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGZyb20gdGhlIHN1cHBsaWVkIHByb3RvY29sLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFRoZSBpbnB1dCBwcm90b2NvbCB0byByZWFkIGZyb20uCisgICAgICovCisgICAgcmVhZChpbnB1dDogT2JqZWN0KTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHRvIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gb3V0cHV0IC0gVGhlIG91dHB1dCBwcm90b2NvbCB0byB3cml0ZSB0by4KKyAgICAgKi8KKyAgICB3cml0ZShvdXRwdXQ6IE9iamVjdCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhcHBsaWNhdGlvbiBleGNlcHRpb24gY29kZSBzZXQgb24gdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJucyB7VGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGV9IGV4Y2VwdGlvbiBjb2RlCisgICAgICovCisgICAgZ2V0Q29kZSgpOiBudW1iZXI7CisgIH0KKworICAvKioKKyAgICogVGhlIEFwYWNoZSBUaHJpZnQgVHJhbnNwb3J0IGxheWVyIHBlcmZvcm1zIGJ5dGUgbGV2ZWwgSS9PIGJldHdlZW4gUlBDCisgICAqIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRyYW5zcG9ydCBvYmplY3QgdHlwZSB1c2VzIEh0dHBbc10vWEhSIGFuZCBpcworICAgKiB0aGUgc29sZSBicm93c2VyIGJhc2VkIFRocmlmdCB0cmFuc3BvcnQuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IHRoZSBodHRwW3NdIAorICAgKiB0cmFuc3BvcnQgKHNlZTogbm9kZS5qcyBleGFtcGxlIHNlcnZlcikuCisgICAqLworICBjbGFzcyBUWEhSVHJhbnNwb3J0IHsKKyAgICB1cmw6IHN0cmluZzsKKyAgICB3cG9zOiBudW1iZXI7CisgICAgcnBvczogbnVtYmVyOworICAgIHVzZUNPUlM6IGFueTsKKyAgICBzZW5kX2J1Zjogc3RyaW5nOworICAgIHJlY3ZfYnVmOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB1cmwgdGhlbiB5b3UgbXVzdCBoYW5kbGUgWEhSIG9wZXJhdGlvbnMgb24KKyAgICAgKiB5b3VyIG93bi4gVGhpcyB0eXBlIGNhbiBhbHNvIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBUcmFuc3BvcnQgYWxpYXMKKyAgICAgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCisgICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbnMuCisgICAgICovCisgICAgY29uc3RydWN0b3IodXJsPzogc3RyaW5nLCBvcHRpb25zPzogT2JqZWN0KTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJyb3dzZXIgc3BlY2lmaWMgWG1sSHR0cFJlcXVlc3QgT2JqZWN0LgorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IHRoZSBicm93c2VyIFhIUiBpbnRlcmZhY2Ugb2JqZWN0CisgICAgICovCisgICAgZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKTogT2JqZWN0OworCisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIGN1cnJlbnQgWFJIIHJlcXVlc3QgaWYgdGhlIHRyYW5zcG9ydCB3YXMgY3JlYXRlZCB3aXRoIGEgVVJMIGFuZAorICAgICAqIHRoZSBhc3luYyBwYXJhbWV0ZXIgaWYgZmFsc2UuIElmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBjcmVhdGVkIHdpdGggYSBVUkwKKyAgICAgKiBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgb3IgdGhlIFVSTCBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBjdXJyZW50IAorICAgICAqIHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBhc3luYyAtIElmIHRydWUgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBPcHRpb25hbCBhc3luYyBjb21wbGV0aW9uIGNhbGxiYWNrLgorICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR8c3RyaW5nfSBOb3RoaW5nIG9yIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyLgorICAgICAqLworICAgIGZsdXNoKGFzeW5jOiBhbnksIGNhbGxiYWNrPzogRnVuY3Rpb24pOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgalF1ZXJ5IFhIUiBvYmplY3QgdG8gYmUgdXNlZCBmb3IgYSBUaHJpZnQgc2VydmVyIGNhbGwuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGNsaWVudCAtIFRoZSBUaHJpZnQgU2VydmljZSBjbGllbnQgb2JqZWN0IGdlbmVyYXRlZCBieSB0aGUgSURMIGNvbXBpbGVyLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwb3N0RGF0YSAtIFRoZSBtZXNzYWdlIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBhcmdzIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVjdl9tZXRob2QgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgQ2xpZW50IHJlY2VpdmUgbWV0aG9kIGZvciB0aGUgY2FsbC4KKyAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBBIG5ldyBqUXVlcnkgWEhSIG9iamVjdC4KKyAgICAgKi8KKyAgICBqcVJlcXVlc3QoY2xpZW50OiBPYmplY3QsIHBvc3REYXRhOiBhbnksIGFyZ3M6IEZ1bmN0aW9uLCByZWN2X21ldGhvZDogRnVuY3Rpb24pOiBPYmplY3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBidWZmZXIgdG8gdXNlIHdoZW4gcmVjZWl2aW5nIHNlcnZlciByZXNwb25zZXMuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqLworICAgIHNldFJlY3ZCdWZmZXIoYnVmOiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiwgaW4gYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0CisgICAgICogdGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBbHdheXMgVHJ1ZS4KKyAgICAgKi8KKyAgICBpc09wZW4oKTogYm9vbGVhbjsKKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiwgaW4gYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0CisgICAgICogdGhpcyBmdW5jdGlvbiBpcyBhIG5vcC4KKyAgICAgKi8KKyAgICBvcGVuKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCBpbiBicm93c2VyIGJhc2VkIEphdmFTY3JpcHQKKyAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIGEgbm9wLgorICAgICAqLworICAgIGNsb3NlKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVzcG9uc2UKKyAgICAgKiBidWZmZXIuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbiAtIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZXR1cm4uCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZChsZW46IG51bWJlcik6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudGlyZSByZXNwb25zZSBidWZmZXIuCisgICAgICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcmVhZEFsbCgpOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZW5kIGJ1ZmZlciB0byBidWYuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKi8KKyAgICB3cml0ZShidWY6IHN0cmluZyk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgICAgICovCisgICAgZ2V0U2VuZEJ1ZmZlcigpOiBzdHJpbmc7CisgIH0KKworICAvKioKKyAgICogT2xkIGFsaWFzIG9mIHRoZSBUWEhSVHJhbnNwb3J0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICovCisgIGNsYXNzIFRyYW5zcG9ydCBleHRlbmRzIFRYSFJUcmFuc3BvcnQgeyB9CisKKyAgLyoqCisgICAqIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTyAKKyAgICogYmV0d2VlbiBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVFdlYlNvY2tldFRyYW5zcG9ydCBvYmplY3QgCisgICAqIHVzZXMgdGhlIFdlYlNvY2tldCBwcm90b2NvbC4gVGFyZ2V0IHNlcnZlcnMgbXVzdCBpbXBsZW1lbnQgV2ViU29ja2V0LgorICAgKi8KKyAgY2xhc3MgVFdlYlNvY2tldFRyYW5zcG9ydCB7CisgICAgdXJsOiBzdHJpbmc7ICAgICAgICAgICAvL1doZXJlIHRvIGNvbm5lY3QKKyAgICBzb2NrZXQ6IGFueTsgICAgICAgICAgIC8vVGhlIHdlYiBzb2NrZXQKKyAgICBjYWxsYmFja3M6IEZ1bmN0aW9uW107IC8vUGVuZGluZyBjYWxsYmFja3MKKyAgICBzZW5kX3BlbmRpbmc6IGFueVtdOyAgIC8vQnVmZmVycy9DYWxsYmFjayBwYWlycyB3YWl0aW5nIHRvIGJlIHNlbnQKKyAgICBzZW5kX2J1Zjogc3RyaW5nOyAgICAgIC8vT3V0Ym91bmQgZGF0YSwgaW1tdXRhYmxlIHVudGlsIHNlbnQKKyAgICByZWN2X2J1Zjogc3RyaW5nOyAgICAgIC8vSW5ib3VuZCBkYXRhCisgICAgcmJfd3BvczogbnVtYmVyOyAgICAgICAvL05ldHdvcmsgd3JpdGUgcG9zaXRpb24gaW4gcmVjZWl2ZSBidWZmZXIKKyAgICByYl9ycG9zOiBudW1iZXI7ICAgICAgIC8vQ2xpZW50IHJlYWQgcG9zaXRpb24gaW4gcmVjZWl2ZSBidWZmZXIKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZyB9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIGNvbnN0cnVjdG9yKHVybDogc3RyaW5nKTsKKworICAgIF9fcmVzZXQodXJsOiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIGN1cnJlbnQgV1MgcmVxdWVzdCBhbmQgcmVnaXN0ZXJzIGNhbGxiYWNrLiBUaGUgYXN5bmMgCisgICAgICogcGFyYW1ldGVyIGlzIGlnbm9yZWQgKFdTIGZsdXNoIGlzIGFsd2F5cyBhc3luYykgYW5kIHRoZSBjYWxsYmFjayAKKyAgICAgKiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHtvYmplY3R9IGFzeW5jIC0gSWdub3JlZC4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjbGllbnQgY29tcGxldGlvbiBjYWxsYmFjay4KKyAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyAodW5kZWZpbmVkKSAKKyAgICAgKi8KKyAgICBmbHVzaChhc3luYzogYW55LCBjYWxsYmFjazogRnVuY3Rpb24pOiBzdHJpbmc7CisKKyAgICBfX29uT3BlbigpOiB2b2lkOworCisgICAgX19vbkNsb3NlKCk6IHZvaWQ7CisKKyAgICBfX29uTWVzc2FnZSgpOiB2b2lkOworCisgICAgX19vbkVycm9yKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBidWZmZXIgdG8gdXNlIHdoZW4gcmVjZWl2aW5nIHNlcnZlciByZXNwb25zZXMuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqLworICAgIHNldFJlY3ZCdWZmZXIoYnVmOiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbgorICAgICAqIEByZXR1cm5zIHtib29sZWFufSAKKyAgICAgKi8KKyAgICBpc09wZW4oKTogYm9vbGVhbjsKKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICAgICAqLworICAgIG9wZW4oKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBjbG9zZSgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgICAgICogYnVmZmVyLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0dXJuLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWQobGVuOiBudW1iZXIpOiBzdHJpbmc7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbnRpcmUgcmVzcG9uc2UgYnVmZmVyLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWRBbGwoKTogc3RyaW5nOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VuZCBidWZmZXIgdG8gYnVmLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCisgICAgICovCisgICAgd3JpdGUoYnVmOiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICAgICAqLworICAgIGdldFNlbmRCdWZmZXIoKTogc3RyaW5nOworICB9CisKKyAgLyoqCisgICAqIEFwYWNoZSBUaHJpZnQgUHJvdG9jb2xzIHBlcmZvcm0gc2VyaWFsaXphdGlvbiB3aGljaCBlbmFibGVzIGNyb3NzIAorICAgKiBsYW5ndWFnZSBSUEMuIFRoZSBQcm90b2NvbCB0eXBlIGlzIHRoZSBKYXZhU2NyaXB0IGJyb3dzZXIgaW1wbGVtZW50YXRpb24gCisgICAqIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IFRKU09OUHJvdG9jb2wuCisgICAqLworICBjbGFzcyBUSlNPTlByb3RvY29sIHsKKyAgICB0cmFuc3BvcnQ6IE9iamVjdDsKKworICAgIC8qKgorICAgICAqIFRocmlmdCBJREwgdHlwZSBJZCB0byBzdHJpbmcgbWFwcGluZy4KKyAgICAgKiBUaGUgbWFwcGluZyB0YWJsZSBsb29rcyBhcyBmb2xsb3dzOgorICAgICAqIFRocmlmdC5UeXBlLkJPT0wgICAtPiAidGYiOiBUcnVlL0ZhbHNlIGludGVnZXIuCisgICAgICogVGhyaWZ0LlR5cGUuQllURSAgIC0+ICJpOCI6IFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorICAgICAqIFRocmlmdC5UeXBlLkkxNiAgICAtPiAiaTE2IjogU2lnbmVkIDE2IGJpdCBpbnRlZ2VyLgorICAgICAqIFRocmlmdC5UeXBlLkkzMiAgICAtPiAiaTMyIjogU2lnbmVkIDMyIGJpdCBpbnRlZ2VyLgorICAgICAqIFRocmlmdC5UeXBlLkk2NCAgICAtPiAiaTY0IjogU2lnbmVkIDY0IGJpdCBpbnRlZ2VyLgorICAgICAqIFRocmlmdC5UeXBlLkRPVUJMRSAtPiAiZGJsIjogNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICAgICAqIFRocmlmdC5UeXBlLlNUUlVDVCAtPiAicmVjIjogQSBtdWx0aWZpZWxkIHR5cGUuCisgICAgICogVGhyaWZ0LlR5cGUuU1RSSU5HIC0+ICJzdHIiOiBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgY2hhcmFjdGVycy4KKyAgICAgKiBUaHJpZnQuVHlwZS5NQVAgICAgLT4gIm1hcCI6IEEgY29sbGVjdGlvbiB0eXBlIChtYXAvYXNzb2NpYXRpdmUtYXJyYXkvZGljdGlvbmFyeSkuCisgICAgICogVGhyaWZ0LlR5cGUuTElTVCAgIC0+ICJsc3QiOiBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAgICAgKiBUaHJpZnQuVHlwZS5TRVQgICAgLT4gInNldCI6IEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQgYW5kIHdpdGhvdXQgcmVwZWF0ZWQgdmFsdWVzKS4KKyAgICAgKi8KKyAgICBUeXBlOiB7IFtrOiBudW1iZXJdOiBzdHJpbmcgfTsKKworICAgIC8qKgorICAgICAqIFRocmlmdCBJREwgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICAgKiBUaGUgbWFwcGluZyB0YWJsZSBsb29rcyBhcyBmb2xsb3dzOgorICAgICAqICJ0ZiIgIC0+IFRocmlmdC5UeXBlLkJPT0wgIAorICAgICAqICJpOCIgIC0+IFRocmlmdC5UeXBlLkJZVEUgIAorICAgICAqICJpMTYiIC0+IFRocmlmdC5UeXBlLkkxNiAgIAorICAgICAqICJpMzIiIC0+IFRocmlmdC5UeXBlLkkzMiAgIAorICAgICAqICJpNjQiIC0+IFRocmlmdC5UeXBlLkk2NCAgIAorICAgICAqICJkYmwiIC0+IFRocmlmdC5UeXBlLkRPVUJMRQorICAgICAqICJyZWMiIC0+IFRocmlmdC5UeXBlLlNUUlVDVAorICAgICAqICJzdHIiIC0+IFRocmlmdC5UeXBlLlNUUklORworICAgICAqICJtYXAiIC0+IFRocmlmdC5UeXBlLk1BUCAgIAorICAgICAqICJsc3QiIC0+IFRocmlmdC5UeXBlLkxJU1QgIAorICAgICAqICJzZXQiIC0+IFRocmlmdC5UeXBlLlNFVCAgIAorICAgICAqLworICAgIFJUeXBlOiB7IFtrOiBzdHJpbmddOiBudW1iZXIgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBUSlNPTlByb3RvY29sIHZlcnNpb24gbnVtYmVyLgorICAgICAqLworICAgIFZlcnNpb246IG51bWJlcjsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IEpTT04gcHJvdG9jb2wgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaGUgdHJhbnNwb3J0IHRvIHNlcmlhbGl6ZSB0by9mcm9tLgorICAgICAqLworICAgIGNvbnN0cnVjdG9yKHRyYW5zcG9ydDogT2JqZWN0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAqIEByZXR1cm5zIHtUaHJpZnQuVHJhbnNwb3J0fSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgICovCisgICAgZ2V0VHJhbnNwb3J0KCk6IE9iamVjdDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBSUEMgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzZXJ2aWNlIG1ldGhvZCB0byBjYWxsLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtZXNzYWdlVHlwZSAtIFRoZSB0eXBlIG9mIG1ldGhvZCBjYWxsLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBjYWxsIChhbHdheXMgMCBpbiBBcGFjaGUgVGhyaWZ0KS4KKyAgICAgKi8KKyAgICB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBzdHJpbmcsIG1lc3NhZ2VUeXBlOiBudW1iZXIsIHNlcWlkOiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICAgICAqLworICAgIHdyaXRlTWVzc2FnZUVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdC4KKyAgICAgKi8KKyAgICB3cml0ZVN0cnVjdEJlZ2luKG5hbWU/OiBzdHJpbmcpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LgorICAgICAqLworICAgIHdyaXRlU3RydWN0RW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QgZmllbGQuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQuCisgICAgICogQHBhcmFtIHtUaHJpZnQuUHJvdG9jb2wuVHlwZX0gZmllbGRUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkSWQgLSBUaGUgZmllbGQncyB1bmlxdWUgaWRlbnRpZmllci4KKyAgICAgKi8KKyAgICB3cml0ZUZpZWxkQmVnaW4obmFtZTogc3RyaW5nLCBmaWVsZFR5cGU6IG51bWJlciwgZmllbGRJZDogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLgorICAgICAqLworICAgIHdyaXRlRmllbGRFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIGZpZWxkcyBmb3IgYSBzdHJ1Y3QuCisgICAgICovCisgICAgd3JpdGVGaWVsZFN0b3AoKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGtleVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBrZXkuCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gdmFsVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZV0gLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAgKGlnbm9yZWQpLgorICAgICAqLworICAgIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogbnVtYmVyLCB2YWxUeXBlOiBudW1iZXIsIHNpemU/OiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWFwLgorICAgICAqLworICAgIHdyaXRlTWFwRW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0IGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gZWxlbVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgd3JpdGVMaXN0QmVnaW4oZWxlbVR5cGU6IG51bWJlciwgc2l6ZTogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgICovCisgICAgd3JpdGVMaXN0RW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBlbGVtVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZVNldEJlZ2luKGVsZW1UeXBlOiBudW1iZXIsIHNpemU6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuCisgICAgICovCisgICAgd3JpdGVTZXRFbmQoKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgYm9vbGVhbiAqLworICAgIHdyaXRlQm9vbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlQnl0ZShpODogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCisgICAgd3JpdGVJMTYoaTE2OiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUkzMihpMzI6IG51bWJlcik6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTY0KGk2NDogbnVtYmVyKTogdm9pZDsKKworICAgIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCisgICAgd3JpdGVEb3VibGUoZGJsOiBudW1iZXIpOiB2b2lkOworCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KKyAgICB3cml0ZVN0cmluZyhzdHI6IHN0cmluZyk6IHZvaWQ7CisKKyAgICAvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworICAgIHdyaXRlQmluYXJ5KHN0cjogc3RyaW5nKTogdm9pZDsKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkTWVzc2FnZUJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtzdHJpbmd9IGZuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kLgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgY2FsbC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gcnNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWVzc2FnZSAoMCBpbiBUaHJpZnQgUlBDKS4KKyAgICAgKi8KKyAgICAvKiogCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtZXNzYWdlLiAKKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZE1lc3NhZ2VCZWdpbigpOiB7IGZuYW1lOiBzdHJpbmc7IG10eXBlOiBudW1iZXI7IHJzZXFpZDogbnVtYmVyIH07CisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtZXNzYWdlLiAqLworICAgIHJlYWRNZXNzYWdlRW5kKCk6IHZvaWQ7CisKKyAgICAvKiogCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuIAorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0IChpZ25vcmVkKS4KKyAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGFuIGVtcHR5IHN0cmluZyBmbmFtZSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICByZWFkU3RydWN0QmVnaW4obmFtZT86IHN0cmluZyk6IHsgZm5hbWU6IHN0cmluZyB9OworCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LiAqLworICAgIHJlYWRTdHJ1Y3RFbmQoKTogdm9pZDsKKworICAgIC8qKgorICAgICAgIEBjbGFzcworICAgICAgIEBuYW1lIEFub25SZWFkRmllbGRCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7c3RyaW5nfSBmbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCAoYWx3YXlzICcnKS4KKyAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBmdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBmaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZpZWxkLgorICAgICAqLworICAgIC8qKiAKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkLiAKKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRGaWVsZEJlZ2luUmV0dXJufQorICAgICAqLworICAgIHJlYWRGaWVsZEJlZ2luKCk6IHsgZm5hbWU6IHN0cmluZzsgZnR5cGU6IG51bWJlcjsgZmlkOiBudW1iZXIgfTsKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLiAqLworICAgIHJlYWRGaWVsZEVuZCgpOiB2b2lkOworCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRNYXBCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGt0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IHZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAuCisgICAgICovCisgICAgLyoqIAorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLiAKKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRNYXBCZWdpblJldHVybn0KKyAgICAgKi8KKyAgICByZWFkTWFwQmVnaW4oKTogeyBrdHlwZTogbnVtYmVyOyB2dHlwZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfTsKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4gKi8KKyAgICByZWFkTWFwRW5kKCk6IHZvaWQ7CisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZENvbEJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZXR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50LgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICAvKiogCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LiAKKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRDb2xCZWdpblJldHVybn0KKyAgICAgKi8KKyAgICByZWFkTGlzdEJlZ2luKCk6IHsgZXR5cGU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH07CisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBsaXN0LiAqLworICAgIHJlYWRMaXN0RW5kKCk6IHZvaWQ7CisKKyAgICAvKiogCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuIAorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMgKGlnbm9yZWQpLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAoaWdub3JlZCkuCisgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZFNldEJlZ2luKGVsZW1UeXBlPzogbnVtYmVyLCBzaXplPzogbnVtYmVyKTogeyBldHlwZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfTsKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHNldC4gKi8KKyAgICByZWFkU2V0RW5kKCk6IHZvaWQ7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byAKKyAgICAgKiAgRmFsc2UgdW5sZXNzIHRoZSBuZXh0IG51bWJlciBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyIAorICAgICAqICBpcyAxLCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyBUcnVlLiAqLworICAgIHJlYWRCb29sKCk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWRCeXRlKCk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWRJMTYoKTogT2JqZWN0OworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIuICovCisgICAgcmVhZEkzMihmPzogYW55KTogT2JqZWN0OworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIuICovCisgICAgcmVhZEk2NCgpOiBPYmplY3Q7CisKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlci4gKi8KKyAgICByZWFkRG91YmxlKCk6IE9iamVjdDsKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyLiAqLworICAgIHJlYWRTdHJpbmcoKTogT2JqZWN0OworCisgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIuICovCisgICAgcmVhZEJpbmFyeSgpOiBPYmplY3Q7CisKKyAgICAvKiogCisgICAgICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhIChub3QgaW1wbGVtZW50ZWQpLgorICAgICAqLworICAgIHNraXAodHlwZTogbnVtYmVyKTogdm9pZDsKKyAgfQorCisgIC8qKgorICAgKiBPbGQgYWxpYXMgb2YgdGhlIFRYSFJUcmFuc3BvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICAgKi8KKyAgY2xhc3MgUHJvdG9jb2wgZXh0ZW5kcyBUSlNPTlByb3RvY29sIHsgfQorCisgIGNsYXNzIE11bHRpcGxleFByb3RvY29sIGV4dGVuZHMgVEpTT05Qcm90b2NvbCB7CisgICAgc2VydmljZU5hbWU6IHN0cmluZzsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIGEgTXV0aWxwbGV4UHJvdG9jb2wgSW1wbGVtZW50YXRpb24gYXMgYSBXcmFwcGVyIGZvciBUaHJpZnQuUHJvdG9jb2wuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IHNydk5hbWUKKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UcmFuc3BvcnR9IHRyYW5zCisgICAgICogQHBhcmFtIHthbnl9IFtzdHJpY3RSZWFkXQorICAgICAqIEBwYXJhbSB7YW55fSBbc3RyaWN0V3JpdGVdCisgICAgICovCisgICAgY29uc3RydWN0b3Ioc3J2TmFtZTogc3RyaW5nLCB0cmFuczogT2JqZWN0LCBzdHJpY3RSZWFkPzogYW55LCBzdHJpY3RXcml0ZT86IGFueSk7CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB3cml0ZU1lc3NhZ2VCZWdpbiBtZXRob2Qgb2YgcHJvdG90eXBlCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuCisgICAgICogQHBhcmFtIHtUaHJpZnQuTWVzc2FnZVR5cGV9IG1lc3NhZ2VUeXBlIC0gVGhlIHR5cGUgb2YgbWV0aG9kIGNhbGwuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGNhbGwgKGFsd2F5cyAwIGluIEFwYWNoZSBUaHJpZnQpLgorICAgICAqLworICAgIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IHN0cmluZywgdHlwZTogbnVtYmVyLCBzZXFpZDogbnVtYmVyKTogdm9pZDsKKyAgfQorCisgIGNsYXNzIE11bHRpcGxleGVyIHsKKyAgICBzZXFpZDogbnVtYmVyOworCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbXVsdGlwbGV4ZWQgY2xpZW50IGZvciBhIHNwZWNpZmljIHNlcnZpY2UuCisgICAgICogQHBhcmFtIHtTdHJpbmd9IHNlcnZpY2VOYW1lIC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5TZXJ2aWNlQ2xpZW50fSBTQ2wgLSBUaGUgU2VydmljZSBDbGllbnQgQ2xhc3MuCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaHJpZnQuVHJhbnNwb3J0IGluc3RhbmNlIHdoaWNoIHByb3ZpZGVzIHJlbW90ZSBob3N0OnBvcnQuCisgICAgICovCisgICAgY3JlYXRlQ2xpZW50KHNlcnZpY2VOYW1lOiBzdHJpbmcsIFNDbDogYW55LCB0cmFuc3BvcnQ6IE9iamVjdCk6IGFueTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3htbC9NYWtlZmlsZS5hbSBiL2xpYi94bWwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhZDZiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94bWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPQorCitpZiBXSVRIX0pBVkEKKyMgU2NoZW1hIHZhbGlkYXRpb24gdGVzdCBkZXBlbmRzIG9uIGphdmEKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworRVhUUkFfRElTVCA9IFwKKyAgdGhyaWZ0LWlkbC54c2QgXAorICB0ZXN0CmRpZmYgLS1naXQgYS9saWIveG1sL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIveG1sL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4N2E1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94bWwvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworY2hlY2s6CisJJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCisJJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCmRpZmYgLS1naXQgYS9saWIveG1sL3Rlc3QvYnVpbGQueG1sIGIvbGliL3htbC90ZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGU5NWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3htbC90ZXN0L2J1aWxkLnhtbApAQCAtMCwwICsxLDExMiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9IlhNTCBTY2hlbWEgVGVzdCIgZGVmYXVsdD0idGVzdCIgYmFzZWRpcj0iLiI+CisKKyAgPGRlc2NyaXB0aW9uPlhNTCBTY2hlbWEgVmFsaWRhdGlvbiBUZXN0PC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0ieG1sLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW4ueG1sLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vZ2VuLXhtbCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImlkbC54bWwuc2NoZW1hIiBsb2NhdGlvbj0iJHt4bWwuZGlyfS90aHJpZnQtaWRsLnhzZCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmRpciIgbG9jYXRpb249Ii4uLy4uLy4uLyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC50ZXN0LmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vdGVzdCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vY29tcGlsZXIvY3BwL3RocmlmdCIgLz4KKworICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZXIuY2hlY2siPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMSI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGZpbGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIFRocmlmdCBjb21waWxlciBpcyBtaXNzaW5nICEKKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iY29tcGlsZXIuY2hlY2ssIG1rZGlycyI+CisgICAgPHRzdGFtcCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1rZGlycyI+CisgICAgPG1rZGlyIGRpcj0iJHtnZW4ueG1sLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vVGhyaWZ0VGVzdC50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9JbmNsdWRlLnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1JlY3Vyc2l2ZS50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9NYW55T3B0aW9uYWxzLnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0NvbnN0YW50c0RlbW8udGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vVHlwZWRlZlRlc3QudGhyaWZ0IiAvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0Fubm90YXRpb25UZXN0LnRocmlmdCIgLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9Eb2NUZXN0LnRocmlmdCIgLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9FbnVtVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vTWFueVR5cGVkZWZzLnRocmlmdCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0icnVuIHNjaGVtYSB2YWxpZGF0aW9uIgorICAgICAgICAgIGRlcGVuZHM9InZhbGlkYXRlLWdlbmVyYXRlZC14bWwiLz4KKyAgICAKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZS1nZW5lcmF0ZWQteG1sIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSI+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9UaHJpZnRUZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vSW5jbHVkZS54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L1JlY3Vyc2l2ZS54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L01hbnlPcHRpb25hbHMueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9PcHRpb25hbFJlcXVpcmVkVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0NvbnN0YW50c0RlbW8ueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9UeXBlZGVmVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0Fubm90YXRpb25UZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vRG9jVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0VudW1UZXN0LnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vTWFueVR5cGVkZWZzLnhtbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke2dlbi54bWwuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPG1hY3JvZGVmIG5hbWU9ImdlbmVyYXRlLXhtbCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgIDxhcmcgbGluZT0iLWdlbiB4bWw6bWVyZ2UiLz4KKyAgICAgICAgPGFyZyBsaW5lPSItb3V0ICR7Z2VuLnhtbC5kaXJ9Ii8+CisgICAgICAgIDxhcmcgbGluZT0iQHtmaWxlfSIvPgorICAgICAgPC9leGVjPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8bWFjcm9kZWYgbmFtZT0idmFsaWRhdGUteG1sIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIC8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZWNobyBtZXNzYWdlPSJ2YWxpZGF0aW5nIGdlbmVyYXRlZCBYTUw6IEB7ZmlsZX0iIC8+CisgICAgICA8c2NoZW1hdmFsaWRhdGUgZmlsZT0iQHtmaWxlfSI+CisgICAgICAgIDxzY2hlbWEgbmFtZXNwYWNlPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL2lkbCIgCisgICAgICAgICAgICAgICAgZmlsZT0iJHtpZGwueG1sLnNjaGVtYX0iIC8+CisgICAgICA8L3NjaGVtYXZhbGlkYXRlPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL3htbC90aHJpZnQtaWRsLnhzZCBiL2xpYi94bWwvdGhyaWZ0LWlkbC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkZDY5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94bWwvdGhyaWZ0LWlkbC54c2QKQEAgLTAsMCArMSwyODMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcveG1sL2lkbCIgCisgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiIAorICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisKKyAgPGVsZW1lbnQgbmFtZT0iaWRsIiB0eXBlPSJ0bnM6SURMIiAvPgorICA8ZWxlbWVudCBuYW1lPSJkb2N1bWVudCIgdHlwZT0idG5zOkRvY3VtZW50IiAvPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJJREwiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IHJlZj0idG5zOmRvY3VtZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iRG9jdW1lbnQiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImluY2x1ZGUiIHR5cGU9InRuczpJbmNsdWRlIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InRuczpOYW1lc3BhY2UiIC8+CisgICAgICA8L2Nob2ljZT4KKyAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImV4Y2VwdGlvbiIgdHlwZT0idG5zOkV4Y2VwdGlvbiIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0idHlwZWRlZiIgdHlwZT0idG5zOlR5cGVkZWYiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InNlcnZpY2UiIHR5cGU9InRuczpTZXJ2aWNlIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdHJ1Y3QiIHR5cGU9InRuczpTdHJ1Y3QiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImNvbnN0IiB0eXBlPSJ0bnM6Q29uc3QiIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InVuaW9uIiB0eXBlPSJ0bnM6VW5pb24iIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9ImVudW0iIHR5cGU9InRuczpFbnVtIiAvPgorICAgICAgPC9jaG9pY2U+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkluY2x1ZGUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJOYW1lc3BhY2UiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Z3JvdXAgbmFtZT0iQWJzdHJhY3RTdHJ1Y3QiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJ0bnM6RmllbGQiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9ncm91cD4KKworICA8YXR0cmlidXRlR3JvdXAgbmFtZT0iU3RydWN0QXR0cmlidXRlcyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9hdHRyaWJ1dGVHcm91cD4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iRXhjZXB0aW9uIj4KKyAgICA8Z3JvdXAgcmVmPSJ0bnM6QWJzdHJhY3RTdHJ1Y3QiIC8+CisgICAgPGF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOlN0cnVjdEF0dHJpYnV0ZXMiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlNlcnZpY2UiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9Im1ldGhvZCIgdHlwZT0idG5zOk1ldGhvZCIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtbW9kdWxlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtaWQiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4gCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJyZXR1cm5zIiB0eXBlPSJ0bnM6VGhyaWZ0VHlwZSIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0idG5zOkZpZWxkIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJ0aHJvd3MiIHR5cGU9InRuczpGaWVsZCIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25ld2F5IiB0eXBlPSJib29sZWFuIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlR5cGVkZWYiPgorICAgIDxjb21wbGV4Q29udGVudD4KKyAgICAgIDxleHRlbnNpb24gYmFzZT0idG5zOlRocmlmdFR5cGUiPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgICAgPC9leHRlbnNpb24+CisgICAgPC9jb21wbGV4Q29udGVudD4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iU3RydWN0Ij4KKyAgICA8Z3JvdXAgcmVmPSJ0bnM6QWJzdHJhY3RTdHJ1Y3QiIC8+CisgICAgPGF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOlN0cnVjdEF0dHJpYnV0ZXMiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlVuaW9uIj4KKyAgICA8Z3JvdXAgcmVmPSJ0bnM6QWJzdHJhY3RTdHJ1Y3QiIC8+CisgICAgPGF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOlN0cnVjdEF0dHJpYnV0ZXMiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkVudW0iPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9Im1lbWJlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50IiAvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhwbGljaXQiIHR5cGU9ImJvb2xlYW4iIC8+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgLz4KKyAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgIDwvZWxlbWVudD4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iRmllbGQiPgorICAgIDxjb21wbGV4Q29udGVudD4KKyAgICAgIDxleHRlbnNpb24gYmFzZT0idG5zOlRocmlmdFR5cGUiPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGVmYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgorICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICAgICAgPC9lbGVtZW50PgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpZWxkLWlkIiB0eXBlPSJsb25nIiAvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0idG5zOlJlcXVpcmVkbmVzcyIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvY29tcGxleENvbnRlbnQ+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPHNpbXBsZVR5cGUgbmFtZT0iUmVxdWlyZWRuZXNzIj4KKyAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0icmVxdWlyZWQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Im9wdGlvbmFsIiAvPgorICAgIDwvcmVzdHJpY3Rpb24+CisgIDwvc2ltcGxlVHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iQW5ub3RhdGlvbiI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXkiIHR5cGU9InN0cmluZyIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0Ij4KKyAgICA8Y29tcGxleENvbnRlbnQ+CisgICAgICA8ZXh0ZW5zaW9uIGJhc2U9InRuczpUaHJpZnRUeXBlIj4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvY29tcGxleENvbnRlbnQ+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0TGlzdCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZW50cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICA8L2VsZW1lbnQ+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RNYXAiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImVudHJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImtleSI+CisgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwvZWxlbWVudD4KKyAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlIj4KKyAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC9lbGVtZW50PgorICAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICA8L2VsZW1lbnQ+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Z3JvdXAgbmFtZT0iQ29uc3RWYWx1ZSI+CisgICAgPGNob2ljZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9InN0cmluZyIgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZG91YmxlIiB0eXBlPSJkb3VibGUiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJsaXN0IiB0eXBlPSJ0bnM6Q29uc3RMaXN0IiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibWFwIiB0eXBlPSJ0bnM6Q29uc3RNYXAiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9ImxvbmciIC8+CisgICAgPC9jaG9pY2U+CisgIDwvZ3JvdXA+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlRocmlmdFR5cGUiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJlbGVtVHlwZSIgdHlwZT0idG5zOlRocmlmdFR5cGUiIC8+CisgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJrZXlUeXBlIiB0eXBlPSJ0bnM6VGhyaWZ0VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWVUeXBlIiB0eXBlPSJ0bnM6VGhyaWZ0VHlwZSIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+CisgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICA8L2Nob2ljZT4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0idG5zOlR5cGVJZGVudGlmaWVyIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZS1tb2R1bGUiIHR5cGU9InN0cmluZyIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUtaWQiIHR5cGU9InN0cmluZyIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8c2ltcGxlVHlwZSBuYW1lPSJUeXBlSWRlbnRpZmllciI+CisgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InZvaWQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJvb2wiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJ5dGUiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imk4IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpMTYiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImkzMiIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaTY0IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJkb3VibGUiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJpbmFyeSIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpZCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibWFwIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJzZXQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imxpc3QiIC8+CisgICAgPC9yZXN0cmljdGlvbj4KKyAgPC9zaW1wbGVUeXBlPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BhY2thZ2UtbG9jay5qc29uIGIvcGFja2FnZS1sb2NrLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2NWFhNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2UtbG9jay5qc29uCkBAIC0wLDAgKzEsMjE4MyBAQAoreworICAibmFtZSI6ICJ0aHJpZnQiLAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJsb2NrZmlsZVZlcnNpb24iOiAxLAorICAicmVxdWlyZXMiOiB0cnVlLAorICAiZGVwZW5kZW5jaWVzIjogeworICAgICJAYmFiZWwvY29kZS1mcmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvY29kZS1mcmFtZS8tL2NvZGUtZnJhbWUtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9mQzJ1ZW1ha25Ycjg3YmRMVWtXb2c3bll1bGlNOUlqNUhVY2Fqc1ZjTUNwUXJjTG10eFJiVkZUSXFtY1NrU2VZUkJGQlJ4czJGaVVxRkpETGRpZWJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJAYmFiZWwvaGlnaGxpZ2h0IjogIl43LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJAYmFiZWwvaGlnaGxpZ2h0IjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9oaWdobGlnaHQvLS9oaWdobGlnaHQtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVGTUM0WmVGQzQ4VHB2ajdDOFVnTHZ0a2FVdW92UVgrNXhOV3JzSW9NRzhvMnorWEZLakthTjlpVm1TODRkUHdWTjAwVzR3UG1xdllvWkYzRUdBc2Z3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMi4wLjAiLAorICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiLAorICAgICAgICAianMtdG9rZW5zIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJAdHlwZXMvbm9kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEwLjEyLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9ub2RlLy0vbm9kZS0xMC4xMi42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rWldCNUVjMWlraTk5eFFGekJsaXZsS3hTWlErZnVVS0JvdHQ4U3RCT25MTjRkV2JSSGxnZGcxWGtucFc2ZzB0d2VuaU41RGNPcUE2NENKeU9VUFNBdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiQHR5cGVzL3EiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL3EvLS9xLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lcXo4Yy8wa3dOaS9PRUhRZnZJdUpWTFRzdDNpbjBlN3VUS2V1WStXTC96ZktuMHhWdWpPVHA0MmJTL3ZVVW9raEs1UDJCcHBMZDlKWE1PTUhjZ2JqQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWJicmV2IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FiYnJldi8tL2FiYnJldi0xLjAuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWtiUjVKWWluYzR3bDgxM1c5amRTb3ZoM1lUVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhY29ybiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi8tL2Fjb3JuLTYuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HWG1LSXZick4zVFY3YVZxQXpWRmFNVzhGOHd6Vlg3dm9FQlJPM2JEQTY0K0VYMzdZU2F5Z2dSSlA1WGlnNkhZSEJrV0twRmc5VzVnZzZvcmtsdWJoZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWNvcm4tanN4IjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fjb3JuLWpzeC8tL2Fjb3JuLWpzeC01LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWGtCNTBmbjBNVVJEeXd3OStVWUwzYzF5TGJPQnowWkZ2cmRZbEdCOGwrSWplMW9TQzc1cUFxcnpTUGpZUWJkblFVemhsVUdOS3Vlc3J5QXYwZ3haT2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFqdiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuNS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hanYvLS9hanYtNi41LjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTRXeWp0OCt0NllzenFhWG5MRGZNbUcvOEFsTzVaYmNzeTNBVEhuY0N6alcvTm9QekFJZDhBSzY3NDlZYmptZHQra1VZMWdQNjBmQ3U0Nm9EeFB2L21nPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmYXN0LWRlZXAtZXF1YWwiOiAiXjIuMC4xIiwKKyAgICAgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6ICJeMC40LjEiLAorICAgICAgICAidXJpLWpzIjogIl40LjIuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJhbWRlZmluZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbWRlZmluZS8tL2FtZGVmaW5lLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU2xLQ3JCWkhLZWsyR2J6OU90RlIrQmZPa2ZVPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLWVzY2FwZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1lc2NhcGVzLy0vYW5zaS1lc2NhcGVzLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VZ0FiOEg5RDQxQVFudS9QYldsQ29mUVZjblY0R3MyYkJKaTllWlB4ZlUvaGdnbEZoM1NNRE1FTlJJcWRyN0g2WEZuWGRva25jdEZCeVZzQ09vdFRWdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdRTVh3eUlHVDNsR2JBS1dhOTIyQmFzMzJaZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTMuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WVDBaSTZrWlJkVGg4WXlKdzNTTWJZbS91K05xZnNBeEVwV08wUGY5c3E4L2U5NFd4eE9wUEt4OUZSMUZseUN0T1ZETk9RKzhudGxxRnhpUmMrcjVxQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItY29udmVydCI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYXByb2JhIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fwcm9iYS8tL2Fwcm9iYS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWTlKNlpqWHRvWWg4Um5YVkNNT1UvdHREbWsxYUJqdW5xOXZPMHRhNXg4NVdEUWlRZlVGOXNJUEJJVGRiaWlJVmNCbzAzSGkzak14aWdCdHNkZGxYUnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFyZS13ZS10aGVyZS15ZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJlLXdlLXRoZXJlLXlldC8tL2FyZS13ZS10aGVyZS15ZXQtMS4xLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTVoWWRBa1psY0c4dE9MdWpWRFRnQ1QrdVBYMFZucEFIMjhnV3NMZnpwWFltN3dQNm1wNVEvZ1l5UjdZUTBjS1ZKY1hKbmwzajJrcEJhbjEzUHRRZjZ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWxlZ2F0ZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4wLjYiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJncGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZ3BhcnNlLy0vYXJncGFyc2UtMS4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vNVJveTZ0Tkc0U0wvRk9rQ0FONlJ6amlha1pTMjVSTFlGcmNNdHRKcWJkZDhCV3JuQStmR3o1N2lONVBiMDZwdkJHdmw1Z1EwQjQ4ZEpsc2xYdm9UZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3ByaW50Zi1qcyI6ICJ+MS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJyYXktdW5pb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktdW5pb24vLS9hcnJheS11bmlvbi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1qUkJEazlPUGFJOTZqZGI1YjV3OGtkNDdEaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS11bmlxIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJhcnJheS11bmlxIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXVuaXEvLS9hcnJheS11bmlxLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcjJySWQ2SmN4L2RPQllpVWRUaFkzOXNrL2JZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJpZnkvLS9hcnJpZnktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pWVVJMmlJbTg0RGZrRWNvUldoSndWQWFTdzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTEuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN0dwaHJsWklEQXc4c2tISlZoamlDSkw1WnlvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jLWxpbWl0ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMtbGltaXRlci8tL2FzeW5jLWxpbWl0ZXItMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwL3VGbm9vT2lPK0wyMTFlWk9vU3l6cE9JVE1YeDFyQklUYXVZeWtHM0JSWVB1OGgwVWN4c1BOQjA0UlI1dm80VHl6MytheTE3dFI2SlZmOXF6WVdnPT0iCisgICAgfSwKKyAgICAiYmFieWxvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wLWJldGEuMTkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhYnlsb24vLS9iYWJ5bG9uLTcuMC4wLWJldGEuMTkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZnMEM5cy9SRVg2L1dJWE4zN1VLcHY1WmhSaTZBNHBqSGxwa0UzNCs4L2E2YzJXMVE2OTJuM2htYytTWkc1bEtSbmFFeExVYnh0SjFTVlQrS2FDUS9BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJiYWxhbmNlZC1tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWxhbmNlZC1tYXRjaC8tL2JhbGFuY2VkLW1hdGNoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWJUUm1hc3I3a25lRms2Z0s0bk9SaTF4dDJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJpbmRpbmdzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JpbmRpbmdzLy0vYmluZGluZ3MtMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLURwTGg1RXpNUjJrenZYMUtJbFZDMFZrQzNpWnRIS1RnZHRaMGEzcGdsQlpkYVFGanQ1UzlnOXhkMWxFK1l2WHlmZDZtdENlUm5yVWZPTFlpVE1sTlN3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJibCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2JsLy0vYmwtMS4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWU4dFFZblpvZG1lYllEV0dIN0tNUnZ0ektYYUpIeDNCYmlscmdaQ2Z2eUxVWWRLcEsxdDVQU1BtcGtueS9TZ2lUU0NuamZMVzd2NXJsT05YVkZrUUVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMy41IiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJibHVlYmlyZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ibHVlYmlyZC8tL2JsdWViaXJkLTMuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1kaEhUV01JN2tNeDV3aE1RbnRsN1ZyOUM2QnZWMTBsRlhEQWFzbnFuck1ZaFhWQ3p6azZJTzlGbzJMNzVqWEhUMDdXck9uZ0wxV0RYT3AreVlTOTFZZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnJhY2UtZXhwYW5zaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icmFjZS1leHBhbnNpb24vLS9icmFjZS1leHBhbnNpb24tMS4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pQ3VQSERGZ3JIWDdIMnZFSS81eHB6MDd6U0hCMDBUcHVncWhtWXRWbU1PNjUxOG1DdVJNb09ZRmxkRUJsMGcxODd1Zm96ZGFIZ1dLY1lGYjYxcUdpQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFsYW5jZWQtbWF0Y2giOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbmNhdC1tYXAiOiAiMC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyLWFsbG9jIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1hbGxvYy8tL2J1ZmZlci1hbGxvYy0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQ0ZzSFFnanRXMVVDaGRYZ2J5Skd0bm0rTy91TFFlWmR0YkRvOG1mVWdZWENIU00xd2dyVnhYbTZiU3lyVXVFckViKzRzWVZHQ3pBU0JSb3Q3enlyb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJ1ZmZlci1hbGxvYy11bnNhZmUiOiAiXjEuMS4wIiwKKyAgICAgICAgImJ1ZmZlci1maWxsIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJidWZmZXItYWxsb2MtdW5zYWZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1hbGxvYy11bnNhZmUvLS9idWZmZXItYWxsb2MtdW5zYWZlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1URU0yaU1JRVFkSjJ5alBKb1NJc2xkbmxlVmFBazFvVzNEQlZVeWt5T0xzRXNGbUVjOWtuK1NGRlB6K2dsNTRLUU54bERuQXdDWG9zT1M5T2t4MnhBZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLWVxdWFscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1lcXVhbHMvLS9idWZmZXItZXF1YWxzLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQTFPMVQ5Qi8yVlpCY0djYTV2WnJuUEVOSi9VPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1ZmZlci1maWxsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1maWxsLy0vYnVmZmVyLWZpbGwtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rUGVMZG5pWWlPODU4Z1hOWTM5bzV3SVNLeXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FsbGVyLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FsbGVyLXBhdGgvLS9jYWxsZXItcGF0aC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxBaGU5aldCN05QYXFTUkVxUDZVNkNWM2RSOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYWxsc2l0ZXMiOiAiXjAuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImNhbGxzaXRlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWxsc2l0ZXMvLS9jYWxsc2l0ZXMtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1yNnVXSmlrUXAvTThHYVYzV0NYR256VGpVTW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2F0aGFyc2lzIjogeworICAgICAgInZlcnNpb24iOiAiMC44LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhdGhhcnNpcy8tL2NhdGhhcnNpcy0wLjguOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1NeUpES1pTM1M3dzV3czNrbE1RLzU2US9Jcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiAifjAuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNoYWxrIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMi40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9iTjZoMXYyZlRKU21VWG9TM25NUTkyTGJESzliZTRUVis2RytvbVFsR0pGZGNVWDVoZUtpMUxaMVluUk1JZ3dUTEVqM0UyNGJUNnRZbmk1MHJsQ2ZRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMy4yLjEiLAorICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC41IiwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl41LjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFyZGV0IjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYXJkZXQvLS9jaGFyZGV0LTAuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tVDhpRGNyaDAzcURHUlJtb0EyaG1CSm54cGxsTVIrMC8wcWx6anFaRVM2TmRpV0RjWmtDTkFrNHJQRlo5UTg1cjI3dW5raU5OZzhaT2l3WlhCSHdjQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2hvd25yIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nob3duci8tL2Nob3duci0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItajM4RXZPNStMSFg4NGpsbzZoNFV6bU93aTBVZ1c2MVdSeVB0Sno0cWFhZEs1ZVkzQlRTNVRZL1MxU3RjM1VrMmxJTTZUUGV2QWxVTGlFSndpZTg2MGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNpcmN1bGFyLWpzb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2lyY3VsYXItanNvbi8tL2NpcmN1bGFyLWpzb24tMC4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVaSzNOQngyTWNhK2I1THNHN2JZMTgzcEhXdDVZMXh0czRQM1B6N0VOVHdHVm5KT1VXYlJiM29janZYN2h4OXRxL3lUQWRjbFhtOXNaMzhnTnVlbTRBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjbGktY3Vyc29yIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS1jdXJzb3IvLS9jbGktY3Vyc29yLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtczEyc04yUjUrc3crbEhSOVFkRFE5U09QL0xVPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlc3RvcmUtY3Vyc29yIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjbGktd2lkdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpLXdpZHRoLy0vY2xpLXdpZHRoLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtL3hudDZLbWw1WGt5UVVld3dSOFB2THErMWprPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvZGUtcG9pbnQtYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29kZS1wb2ludC1hdC8tL2NvZGUtcG9pbnQtYXQtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EUWNMVFFRNlcrb3pvdkdrRGk3YlBacE16M2M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29sb3ItY29udmVydCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1jb252ZXJ0Ly0vY29sb3ItY29udmVydC0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWZBVXRkK3ZGZEF0RlFjQzhDQ3lZdDFmWVd4U3FBaUsyY1NENnpEQjhOM2Nwc0VCQXZSeHA5ek9HZzZHL1NISEpZQVQ4OC9hei9JdURHQUxzTlZiR2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLW5hbWUiOiAiMS4xLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiY29sb3ItbmFtZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvci1uYW1lLy0vY29sb3ItbmFtZS0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXA5QlZpOWljUXZlVjNVSXlqM1FJTWNwVHZDVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb21tYW5kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjE5LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbW1hbmRlci8tL2NvbW1hbmRlci0yLjE5LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZ0dkFPTytENk9FTnZSQWg1MjREaDlqY2ZLVFlEUUFxdnFlemJDVzgyeGo1WDBwU3JjcHh0dlJLSExHMHlCWTZTRDdQU0RySmFqKzBBaU9jS1ZkMVhnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25jYXQtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbmNhdC1tYXAvLS9jb25jYXQtbWFwLTAuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMktscjEzL1dqZmQ1T25NRGFqdWcxVUJkUjNzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbm5lY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjYuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29ubmVjdC8tL2Nvbm5lY3QtMy42LjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DZS8yeFZyM0kyNFRjVFduSlhTRmkyZUc5U1E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiMi42LjkiLAorICAgICAgICAiZmluYWxoYW5kbGVyIjogIjEuMS4wIiwKKyAgICAgICAgInBhcnNldXJsIjogIn4xLjMuMiIsCisgICAgICAgICJ1dGlscy1tZXJnZSI6ICIxLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb25zb2xlLWNvbnRyb2wtc3RyaW5ncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25zb2xlLWNvbnRyb2wtc3RyaW5ncy8tL2NvbnNvbGUtY29udHJvbC1zdHJpbmdzLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUFh6MFJrMjJSRzZtUkw5TE9WQi9tRkVBam80PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvcmUtdXRpbC1pcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb3JlLXV0aWwtaXMvLS9jb3JlLXV0aWwtaXMtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjFVSWdxaXZGcTFlcXR4UU1sQWRVVUR3YWM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY3Jvc3Mtc3Bhd24iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3Jvc3Mtc3Bhd24vLS9jcm9zcy1zcGF3bi02LjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVRWTHJCU3Q3ZmpiRHlnejgwNXBNbnN0SXMyVlRCTmtSbTBxeFpkK003QTVYRGR4VlJXTzVNeEdCWFpoalk0Y3FMWUxkdHJHcVJmOG1CUG16d1NwV1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm5pY2UtdHJ5IjogIl4xLjAuNCIsCisgICAgICAgICJwYXRoLWtleSI6ICJeMi4wLjEiLAorICAgICAgICAic2VtdmVyIjogIl41LjUuMCIsCisgICAgICAgICJzaGViYW5nLWNvbW1hbmQiOiAiXjEuMi4wIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjIuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWJ1ZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTIuNi45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1iQzdFbHJkSmFKblBiQVArMUVvdFl2cVpzYjNlY2w1d2k2QmZpNkJKVFVjTm93cDZjdnNwZzBqWHpuUlRLRGptL0U3QWRnRkJWZUFQVk1OY0tHc0hNQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibXMiOiAiMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVjb21wcmVzcy1yZXNwb25zZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWNvbXByZXNzLXJlc3BvbnNlLy0vZGVjb21wcmVzcy1yZXNwb25zZS0zLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdLVGRNamRJT0V2NkpJQ0RZaXJ0N0pncTMvTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1pYy1yZXNwb25zZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVlcC1lcXVhbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWVwLWVxdWFsLy0vZGVlcC1lcXVhbC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlkSmdLU3RtRGdoTy8wemJ5ZkNLMHlSMFNMVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWVwLWV4dGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWVwLWV4dGVuZC8tL2RlZXAtZXh0ZW5kLTAuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1MT0h4SU9hUFlkSGxKUnRDUWZESVZadGZ3L3VmTTgrclZqNjQ5UklIemNtL3ZHd1FSWEZ0Nk9QcUlGV3NtMlhFTXJOSUV0V1I2NHNZMUxFS0QydkFPQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVlcC1pcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWVwLWlzLy0vZGVlcC1pcy0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMyblcrMTI4RSs3UFVrK1JzSEQrN2NOWHp6UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWZpbmUtcHJvcGVydGllcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydGllcy8tL2RlZmluZS1wcm9wZXJ0aWVzLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zTXFmWUtqMmxMemRNU2Y4WklaRS9WK1p1eStCZ0Q2ZjE2NGU4SzJ3N2RnbnBLQXJCRGVyR1lwTTQ2SVlZY2pua2RQTk1qUGs5QTZWRkI4KzNTS2xYUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib2JqZWN0LWtleXMiOiAiXjEuMC4xMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWZpbmVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZWQvLS9kZWZpbmVkLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteVkyYnp2ZFdkQmlPRVFscEZSR1o0NXNmcHBNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWwvLS9kZWwtMi4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13U3lZSFFaNFJzaEx5dmhpei9rdzJRZi8wYWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYmJ5IjogIl41LjAuMCIsCisgICAgICAgICJpcy1wYXRoLWN3ZCI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtcGF0aC1pbi1jd2QiOiAiXjEuMC4wIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIsCisgICAgICAgICJyaW1yYWYiOiAiXjIuMi44IgorICAgICAgfQorICAgIH0sCisgICAgImRlbGVnYXRlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWxlZ2F0ZXMvLS9kZWxlZ2F0ZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oTWJoV2JnWkJQM0tXYUR2Uk0ySERURWxENW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGV0ZWN0LWxpYmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGV0ZWN0LWxpYmMvLS9kZXRlY3QtbGliYy0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLStoTjhTOWFZN2ZWYzFjMENyRldma2FURXVwcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb2N0cmluZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb2N0cmluZS8tL2RvY3RyaW5lLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zNW1Ta3U0WlhLMHZmQ3VIRURBd3Q1NWRnMmpOYWpIWjFvZHZGKzhTU3I4MkVzWlk0UW1YZnVXc284b0VkOHpSaFZPYlNOMThhTTBDalNkb0JYN3pJdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiZWUtZmlyc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZWUtZmlyc3QvLS9lZS1maXJzdC0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdReGhGV3NLNHZUd0pWY3lvVml5WnJ4V3NoMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlbmNvZGV1cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW5jb2RldXJsLy0vZW5jb2RldXJsLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtclQvMHlHN0MwQ2t5TDFvQ3c2bW1Cc2xiUDFrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVuZC1vZi1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZW5kLW9mLXN0cmVhbS8tL2VuZC1vZi1zdHJlYW0tMS40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFNa3JaTnZXVEtDYWlnYm4rVzE1ZWxxMkJCL0wyMm5xclNZNURLbG8zWDYrdmNsSm04QmI1ZGpYSkJtRVg2ZlMzK3pDaC9GNFZCSzVaMkt4SnQ0czJRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlcy1hYnN0cmFjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXMtYWJzdHJhY3QvLS9lcy1hYnN0cmFjdC0xLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUM4RngvMGpGbVY1SVBvTU9GUEE5UDlHNU50cVcrNGNPUGl0M01JdXZSMnQ3QWcySzE1RUpUcHhuSEFZVHpMK2FZUUpJRVNZZVhabURCZk9CRTFIY3BBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlcy10by1wcmltaXRpdmUiOiAiXjEuMS4xIiwKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAiXjEuMS4xIiwKKyAgICAgICAgImhhcyI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtY2FsbGFibGUiOiAiXjEuMS4zIiwKKyAgICAgICAgImlzLXJlZ2V4IjogIl4xLjAuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlcy10by1wcmltaXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXMtdG8tcHJpbWl0aXZlLy0vZXMtdG8tcHJpbWl0aXZlLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xWnJ5Qk9KalYvL0xheExUVjZVQy8vV2V3bmVCM0xjWE9MOU5QKytvektWWHNJSUlwbS8yYzEzVURpRDlKcDJlVGhzZWN3OW0zalBxRHdUeW9iY2RiZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtY2FsbGFibGUiOiAiXjEuMS40IiwKKyAgICAgICAgImlzLWRhdGUtb2JqZWN0IjogIl4xLjAuMSIsCisgICAgICAgICJpcy1zeW1ib2wiOiAiXjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImVzY2FwZS1odG1sIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY2FwZS1odG1sLy0vZXNjYXBlLWh0bWwtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BbGpxNU5QUXdKZE40Y0ZwR0k3d0JSMGRHWWc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjYXBlLXN0cmluZy1yZWdleHAvLS9lc2NhcGUtc3RyaW5nLXJlZ2V4cC0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUcySEFWaUdRcU4vMnJqdXl6d0lBeWhNTGh0UT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc2NvZGVnZW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjb2RlZ2VuLy0vZXNjb2RlZ2VuLTEuOC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2x0VHIwYVRFUXZyc0laNm8wTU4wN2NLRUJnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzcHJpbWEiOiAiXjIuNy4xIiwKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjEuOS4xIiwKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIiwKKyAgICAgICAgIm9wdGlvbmF0b3IiOiAiXjAuOC4xIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAifjAuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJlc3ByaW1hIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuNy4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtMi43LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImVzdHJhdmVyc2UiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3RyYXZlcnNlLy0vZXN0cmF2ZXJzZS0xLjkuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1yMmZ5M0pJbGdrRlpVSkpna2FRQVhTbkp1MFE9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50IjogeworICAgICAgInZlcnNpb24iOiAiNS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC8tL2VzbGludC01LjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItellDZUZRYWhzeGZmR2w4N1UyYUo3RFB5SDhDYldneEJDMjEzWTgrVENhbmhVVGYyZ0V2ZnEzRUtwSG1FY296VEx5UG1HZTlMWmRNQXdDL0NwSkJNNUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIkBiYWJlbC9jb2RlLWZyYW1lIjogIl43LjAuMCIsCisgICAgICAgICJhanYiOiAiXjYuNS4zIiwKKyAgICAgICAgImNoYWxrIjogIl4yLjEuMCIsCisgICAgICAgICJjcm9zcy1zcGF3biI6ICJeNi4wLjUiLAorICAgICAgICAiZGVidWciOiAiXjQuMC4xIiwKKyAgICAgICAgImRvY3RyaW5lIjogIl4yLjEuMCIsCisgICAgICAgICJlc2xpbnQtc2NvcGUiOiAiXjQuMC4wIiwKKyAgICAgICAgImVzbGludC11dGlscyI6ICJeMS4zLjEiLAorICAgICAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6ICJeMS4wLjAiLAorICAgICAgICAiZXNwcmVlIjogIl40LjAuMCIsCisgICAgICAgICJlc3F1ZXJ5IjogIl4xLjAuMSIsCisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIsCisgICAgICAgICJmaWxlLWVudHJ5LWNhY2hlIjogIl4yLjAuMCIsCisgICAgICAgICJmdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlIjogIl4xLjAuMSIsCisgICAgICAgICJnbG9iIjogIl43LjEuMiIsCisgICAgICAgICJnbG9iYWxzIjogIl4xMS43LjAiLAorICAgICAgICAiaWdub3JlIjogIl40LjAuNiIsCisgICAgICAgICJpbXVybXVyaGFzaCI6ICJeMC4xLjQiLAorICAgICAgICAiaW5xdWlyZXIiOiAiXjYuMS4wIiwKKyAgICAgICAgImlzLXJlc29sdmFibGUiOiAiXjEuMS4wIiwKKyAgICAgICAgImpzLXlhbWwiOiAiXjMuMTIuMCIsCisgICAgICAgICJqc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5IjogIl4xLjAuMSIsCisgICAgICAgICJsZXZuIjogIl4wLjMuMCIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuNSIsCisgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiLAorICAgICAgICAibmF0dXJhbC1jb21wYXJlIjogIl4xLjQuMCIsCisgICAgICAgICJvcHRpb25hdG9yIjogIl4wLjguMiIsCisgICAgICAgICJwYXRoLWlzLWluc2lkZSI6ICJeMS4wLjIiLAorICAgICAgICAicGx1cmFsaXplIjogIl43LjAuMCIsCisgICAgICAgICJwcm9ncmVzcyI6ICJeMi4wLjAiLAorICAgICAgICAicmVnZXhwcCI6ICJeMi4wLjEiLAorICAgICAgICAicmVxdWlyZS11bmNhY2hlZCI6ICJeMS4wLjMiLAorICAgICAgICAic2VtdmVyIjogIl41LjUuMSIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIl4yLjAuMSIsCisgICAgICAgICJ0YWJsZSI6ICJeNS4wLjIiLAorICAgICAgICAidGV4dC10YWJsZSI6ICJeMC4yLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjQuMS4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy00LjEuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWhlTlBKVUpJcUMreEI2YXlMQU1IYUlybU45SEthN2FRTzhNR3FLcHZDQSt1SllWY3ZSNmw1a2dkcmhSdXdQRkhVN1A1L0ExdzBCakJ5UEh3cGZUREtnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC1jb25maWctcHJldHRpZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LWNvbmZpZy1wcmV0dGllci8tL2VzbGludC1jb25maWctcHJldHRpZXItMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFZR2ZtenVjNHE0SjZYSWhscDh2UktkSS9mSTB0UWZRUHkxZE1FM1VPTHByRSt2NHNzSC8zVzlMTTJRN2g1cUJjeTVtMGVoQ3JCRFUyWUY4cTZPWTh3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjYuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC1wbHVnaW4tcHJldHRpZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXBsdWdpbi1wcmV0dGllci8tL2VzbGludC1wbHVnaW4tcHJldHRpZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTRnMTFvcHpocXEvOCtBTW1vNVZjMkduN3o5YWxaNEpxcmJaK0Q0aThLbFN5eGVRaFpIbG1Jclk4VTlBa2Y1MTRNb0Vob2dQYTg3SmdrcTg3YVoyT2h3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwcmV0dGllci1saW50ZXItaGVscGVycyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LXNjb3BlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1zY29wZS8tL2VzbGludC1zY29wZS00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMUc2VVREaTdKYzFFTEZ3blI1OEhWNGZLOU9RSzRTNk45ODVmMTY2eHFYeHBqVTZwbHhGSVNKYTJCYTlLQ1F1RmE4UkNuai9sU0ZKYkhvN1VGREJuVUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzcmVjdXJzZSI6ICJeNC4xLjAiLAorICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNC4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LXV0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC11dGlscy8tL2VzbGludC11dGlscy0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWjdZam5JbGRYKzJYTWNqcjdaa2dFc09qL2JSRU9OVjYwcVllQi9iak1BcXFxWjR6eEt5V1grQk9Va2RtUm1BOXJpaUlQVnZvNXg4Nm01ZWx2aU9rMFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzbGludC12aXNpdG9yLWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXZpc2l0b3Ita2V5cy8tL2VzbGludC12aXNpdG9yLWtleXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXF6bS9YeElieG0vRkh5SDM0MVpyYm5NVXBlKzVCb2N0ZTl4a21GTXpQTWpSYVpNY1h3dytNcEJwdEZ2dFUrNzlMMzYybnFpTGhla0N4Q3hEUGFVTUJRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc3ByZWUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmVlLy0vZXNwcmVlLTQuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1JNUJ5Y1pXNkZDVkl1YjkzVGVWWTFzN3ZqaFA5Q1k2Y1hDem5JUmZpaWc3blJ2aUtaWWRSbmovc0hFV0M2QTdXRTlSRFdPRnE5KzdPc1dTWXo4cXYydz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWNvcm4iOiAiXjYuMC4yIiwKKyAgICAgICAgImFjb3JuLWpzeCI6ICJeNS4wLjAiLAorICAgICAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNwcmltYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZUd1RkZ3N1VwZGErZzRwK1FIdm5XMFJ5VFgvU1ZlSkJETS9nQ3RNQVJPMGNMdVQySGNFS25UUHZoalY2YUdlcXJDQi9zYk5vcDBLc3ptMGpzYVdVNEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzcXVlcnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNxdWVyeS8tL2VzcXVlcnktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVNtaXlaNXpJV0g5Vk0rU1JVUmVMUzVROGE3R3h0UmR4RUJWWnBtOThySk03U2IrQTlEVkNuZFhma2VGVWQzYnlkZXJnK0ViRGtmbmV2ZkN3eW5XYU5BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3RyYXZlcnNlIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc3JlY3Vyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNyZWN1cnNlLy0vZXNyZWN1cnNlLTQuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02NFJCQisrZklPQVhQdzNQOWN5ODlxZk1sdlpFWFprcXFKa2pxcVhJdnpQNWV6UlpqVytsUFdqdzM1VVgvM0VoVVBGWWJnNUVSNEpZZ0R3NDAwNy9EUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXN0cmF2ZXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3RyYXZlcnNlLy0vZXN0cmF2ZXJzZS00LjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURlNC83VEg4MUdsaGpPYzBJSm44R3ZvTDJ4TT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc3V0aWxzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzdXRpbHMvLS9lc3V0aWxzLTIuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ3I5UEhLcGJ5eDk2bllyTWJlcFBxcUJMckpzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4cGFuZC10ZW1wbGF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHBhbmQtdGVtcGxhdGUvLS9leHBhbmQtdGVtcGxhdGUtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNlYnFMdFY4S09aZncwVUk4VEVGV3h0Y3p4eEMxanZ5VXZ4Nkg0ZnlwMUsxRk43QTRRK3VnZ1ZVbE9zSTFLOEFHVTByd09HcVA4bkNhcGRydzhDWVFnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleHRlcm5hbC1lZGl0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZXJuYWwtZWRpdG9yLy0vZXh0ZXJuYWwtZWRpdG9yLTMuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ibjcxSDkrcVdvT1FLeVpEbzI1bU9NVnBTbVhST0FzVEpWVlZZenJydG9sM2Q0eStBc0tqZjRJd2wyUStJdVQwa0ZTUTFxbzE2NlV1SXdxWXE3bUduQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhcmRldCI6ICJeMC43LjAiLAorICAgICAgICAiaWNvbnYtbGl0ZSI6ICJeMC40LjI0IiwKKyAgICAgICAgInRtcCI6ICJeMC4wLjMzIgorICAgICAgfQorICAgIH0sCisgICAgImZhc3QtZGVlcC1lcXVhbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWRlZXAtZXF1YWwvLS9mYXN0LWRlZXAtZXF1YWwtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ld1VoamQrV1o3OS9Od3YzL2JMTEZmM1Fxa2s9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1kaWZmIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtZGlmZi8tL2Zhc3QtZGlmZi0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteEp1b1Q1K0w5OVhsWjh0d2VkYVJmNkF4MlRnUVZ4dmdaT1lvUEtxWnVmbUppYjB0TDJ0ZWdQQk9aYjFwVk5nSWhscURsQTBlTzBjM3dCdlFjbXp4NHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5Ly0vZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnktMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xUlFzREs3bXNSaWZoOU9uWVJFR1Q0Ykl1L0k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1sZXZlbnNodGVpbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWxldmVuc2h0ZWluLy0vZmFzdC1sZXZlbnNodGVpbi0yLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBZcGNab2c2RnFNTXFHUStoUjhadXFkNWVSYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmaWd1cmVzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpZ3VyZXMvLS9maWd1cmVzLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT3JHaTBxWXNpL3RER2d5VXkzbDZMODRueVdJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaWxlLWVudHJ5LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbGUtZW50cnktY2FjaGUvLS9maWxlLWVudHJ5LWNhY2hlLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzVLWkRENW9SNFBZT0xqSVNrWFlvRWhGZzJFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZsYXQtY2FjaGUiOiAiXjEuMi4xIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZpbmFsaGFuZGxlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5hbGhhbmRsZXIvLS9maW5hbGhhbmRsZXItMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16Z3RvVmJSWVUrZVJzdnpHZ0FSdGlDVTkxL1U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVidWciOiAiMi42LjkiLAorICAgICAgICAiZW5jb2RldXJsIjogIn4xLjAuMSIsCisgICAgICAgICJlc2NhcGUtaHRtbCI6ICJ+MS4wLjMiLAorICAgICAgICAib24tZmluaXNoZWQiOiAifjIuMy4wIiwKKyAgICAgICAgInBhcnNldXJsIjogIn4xLjMuMiIsCisgICAgICAgICJzdGF0dXNlcyI6ICJ+MS4zLjEiLAorICAgICAgICAidW5waXBlIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmbGF0LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZsYXQtY2FjaGUvLS9mbGF0LWNhY2hlLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMHdNTE1yT0JWUFRqdCtuSENmU1E5KytYeElFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNpcmN1bGFyLWpzb24iOiAiXjAuMy4xIiwKKyAgICAgICAgImRlbCI6ICJeMi4wLjIiLAorICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS4yIiwKKyAgICAgICAgIndyaXRlIjogIl4wLjIuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmb3ItZWFjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3ItZWFjaC8tL2Zvci1lYWNoLTAuMy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qcVlmTHA3bW85dkl5UWY4eWtXMnY3QSsyTjRRamVDZUk1K0R6OVhyYWlPMWlnbjgxd2ppSDdGYjl2U09XdlFmTnRtU2E0SDJSb1FUcnJYaXZkVVptdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtY2FsbGFibGUiOiAiXjEuMS4zIgorICAgICAgfQorICAgIH0sCisgICAgImZzLWNvbnN0YW50cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mcy1jb25zdGFudHMvLS9mcy1jb25zdGFudHMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXk2T0F3b1NJZjdGeWpNSXY5NHUrYjVyZGhlWkVqelI2M0dUeVpKbTVxaDRCaSsyWWd3TENjSS9mUEZaa0w1UFNpeE90NlpOS20rdytIZnAvQmNpd293PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmcy5yZWFscGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mcy5yZWFscGF0aC8tL2ZzLnJlYWxwYXRoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRlFTdEpTTVZqS3BBMjBvbmg4c0JRUm1VNms4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZ1bmN0aW9uLWJpbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnVuY3Rpb24tYmluZC8tL2Z1bmN0aW9uLWJpbmQtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlJb3ZBek1YNDlzRjhZbDU4ZlNDV0o1c3ZTTHVhaWJQeFhRSkZMbUJPYlR1Q3IwTWYxS2lQb3BHTTlOaUZqaVlCQ2JmYWEyRmg2YnJlUTZBTlZUSTBBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Z1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUvLS9mdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtR3dxenZWVTdLZzFqbWRLY0RqNmdzbElIZ3ljPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdhdWdlIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dhdWdlLy0vZ2F1Z2UtMi43LjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1MQU5BWEhVNHc1MStzM3N4Y0NMakpmc0JpL2M9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXByb2JhIjogIl4xLjAuMyIsCisgICAgICAgICJjb25zb2xlLWNvbnRyb2wtc3RyaW5ncyI6ICJeMS4wLjAiLAorICAgICAgICAiaGFzLXVuaWNvZGUiOiAiXjIuMC4wIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMS4wIiwKKyAgICAgICAgInNpZ25hbC1leGl0IjogIl4zLjAuMCIsCisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjEuMC4xIiwKKyAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4xIiwKKyAgICAgICAgIndpZGUtYWxpZ24iOiAiXjEuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzdNNnRlNDJEWWJnNWlqd1Jvcm43eWZXVk44PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQvLS9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03NTR4T0c4REduOE5aRHI0TDk1UXhGZnZBTXM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibnVtYmVyLWlzLW5hbiI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaW5nLXdpZHRoIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nLXdpZHRoLy0vc3RyaW5nLXdpZHRoLTEuMC4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUVZdmZXNHpjVWFLbjV3MGhIZ2Zpc0xteEI5TT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJjb2RlLXBvaW50LWF0IjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpcC1hbnNpIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1hbnNpLy0vc3RyaXAtYW5zaS0zLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1hamhmdUlVOWxTMWY4RjBPaXErVUo0M0dQYzg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1yZWdleCI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ2V0LXN0ZGluIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldC1zdGRpbi8tL2dldC1zdGRpbi02LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanA0dEhhd3lWNytma2tTS3l2anVMWnN3YmxVdHorU1FLelNXbkJiaWkxNkJ1WmtzSmxVMXd1QllYWTc1citkdWgvbGxGMXVyNm9Od2krMlp6aktaN2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdpdGh1Yi1mcm9tLXBhY2thZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2l0aHViLWZyb20tcGFja2FnZS8tL2dpdGh1Yi1mcm9tLXBhY2thZ2UtMC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sL3RkbHIvZWlYTXhQeURvS0k3NW9XZjZaTTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2JhbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxMS44LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2JhbHMvLS9nbG9iYWxzLTExLjguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItaW82TGt5UFZ1ekNIQlNRVjlmbU93eFprVWs2bklhR214aGVMRGdtdUZ2ODlqMGZtMmFxRGJJWEtBR2Z6Q01IcXozSExGMlpmOFdTRzZWcU1oMnFGbUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdsb2JieSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYnkvLS9nbG9iYnktNS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02OWhHWjhvTnV6TUxtYno4YU9yQ3ZGUTNEZzA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pb24iOiAiXjEuMC4xIiwKKyAgICAgICAgImFycmlmeSI6ICJeMS4wLjAiLAorICAgICAgICAiZ2xvYiI6ICJeNy4wLjMiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4wLjEiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdyYWNlZnVsLWZzIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncmFjZWZ1bC1mcy8tL2dyYWNlZnVsLWZzLTQuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURvdmY1TkhkdUlWTlpPQk9wOEFPS2dKdVZsZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJoYW5kbGViYXJzIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYW5kbGViYXJzLy0vaGFuZGxlYmFycy00LjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJobVRla1ArRlpMK1hOaHdTMVdmK2JUVFpwZExvdWd3dDVwY2dBMXR1ejZKY3gwZnBILzd6MHFkNzFSS25aSEJDeElSQkhmQk9uaW80Z1ZpUGVtTnpBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJeMi41LjAiLAorICAgICAgICAib3B0aW1pc3QiOiAiXjAuNi4xIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAiXjAuNi4xIiwKKyAgICAgICAgInVnbGlmeS1qcyI6ICJeMy4xLjQiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFzeW5jIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuNi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0yLjYuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWZORWlMMitBWnQ2QWxBdy8yOUNyMFVEZTRzUkFIQ3BFSGg1NFdNeitCYjdRZk5jRnc0aDNsb29meUpwTGVRczRZeDd5dXF1LzJkTGdNNWhLT3M2SGxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuMTAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuNi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWpnYXB1bVdsYk1oa0JnelQ3WWtjNVlYVVQ0NkYwaUt1OFNHWHEwYmN3UDVkei9oMFBsajZlbkpxanoxWmJxMmw1V2FxWW5yVmJ3V09XTXlGM0Y0N2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImhhcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMvLS9oYXMtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWYyZHZPMFZVNk9lajdSa1dKR3JlaGpiek1BakZwNS9WS1BwNXRUcFdJVjRKSEhaSzEvQnhiRlJ0Zi9zaUEyU1dUZTA5Y2FEbVZ0WVl6V0VJYkJTNHp3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIl4xLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtZmxhZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtZmxhZy8tL2hhcy1mbGFnLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGRSVTNDR1pyaUpXbWZOR2Zsb0g4N2xWdXYwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhcy1zeW1ib2xzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1zeW1ib2xzLy0vaGFzLXN5bWJvbHMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11aHFQR3ZLZy9EbGxEMXlGQTJkd1FTSUdPMFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXVuaWNvZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXVuaWNvZGUvLS9oYXMtdW5pY29kZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTRPYithaWpQVVJPSVZlQ0cwV2tlZHgzaXFMaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpY29udi1saXRlIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjI0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pY29udi1saXRlLy0vaWNvbnYtbGl0ZS0wLjQuMjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXYzTVhuWkFjdm55d2tUVUVab21JQWN0bGU3UlhYZWVkT1IzMXd3bDdWbHlvWE80UWk5YXJ2U2VuTlFXbmUxVGNSd2hDTDFId0xJMjFiRXFkcGo4L3JBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlci1idWZmZXIiOiAiPj0gMi4xLjIgPCAzIgorICAgICAgfQorICAgIH0sCisgICAgImlnbm9yZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pZ25vcmUvLS9pZ25vcmUtNC4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWN5RkRLcnFjL1lkY1dGbmlKaHpJNDIrQXpTK2dOd21Vek9TRmNSQ1FZd3lTdUJCQnkvS2p1eFdMWi9GSEVINk1vcTFOaXpNT0JXeVRjdjhPNE9aSU1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbXVybXVyaGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbXVybXVyaGFzaC8tL2ltdXJtdXJoYXNoLTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEta2hpNXNya29vaml4UGNUN2EyMVhieU1VVStvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluZmxpZ2h0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZmxpZ2h0Ly0vaW5mbGlnaHQtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TYjFqTWRmUUxRd0p2SkVLRUhXNmdXVzFiZms9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5oZXJpdHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5oZXJpdHMvLS9pbmhlcml0cy0yLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVl6d3NnK1BhUXFVQzlTUm1BaVNBOUNDQ1lkND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbmkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5pLy0vaW5pLTEuMy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SWlk1aHVJS0NNUldEVXFabEVpNzJmL2xtWEtNdnVzemNNQmR1bGlRM25uV2J4OVgvWkJRTzdEaWpNRVlTOUVoSEJiMnFhY1JVTXRDN3N2THdlMGxjdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5xdWlyZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5xdWlyZXIvLS9pbnF1aXJlci02LjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUUlFUUc0WXlRMlVZWkdEQzRzck1aN0JqSE9tTmsxbFIySlFqNVVrbkJhcGtsbTZXSEErVlZIN04rc1VkWDNBN05lQ2ZHRjhvNFgxUzNBbzduQWNJZWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktZXNjYXBlcyI6ICJeMy4wLjAiLAorICAgICAgICAiY2hhbGsiOiAiXjIuMC4wIiwKKyAgICAgICAgImNsaS1jdXJzb3IiOiAiXjIuMS4wIiwKKyAgICAgICAgImNsaS13aWR0aCI6ICJeMi4wLjAiLAorICAgICAgICAiZXh0ZXJuYWwtZWRpdG9yIjogIl4zLjAuMCIsCisgICAgICAgICJmaWd1cmVzIjogIl4yLjAuMCIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuMTAiLAorICAgICAgICAibXV0ZS1zdHJlYW0iOiAiMC4wLjciLAorICAgICAgICAicnVuLWFzeW5jIjogIl4yLjIuMCIsCisgICAgICAgICJyeGpzIjogIl42LjEuMCIsCisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjIuMS4wIiwKKyAgICAgICAgInN0cmlwLWFuc2kiOiAiXjQuMC4wIiwKKyAgICAgICAgInRocm91Z2giOiAiXjIuMy42IgorICAgICAgfQorICAgIH0sCisgICAgImlzLWNhbGxhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWNhbGxhYmxlLy0vaXMtY2FsbGFibGUtMS4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXI1cDlzeEpqWW5BckxqT2JwakE0eHU1RUtJM0N1S0hrSlhNaFQ3a3dicFV5SUZEMW41UE1Bc29QdldudnRaaU56N0xqa1lEUlpoZDdGbEkwZU1pakVBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1kYXRlLW9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRlLW9iamVjdC8tL2lzLWRhdGUtb2JqZWN0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbXFJT3RxN3J2L2QvdlRQblRLQWJNMWdkT2hZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50Ly0vaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vN01LWEU4WmtZTVdlcXE1Tys3NjQ5MzdaVTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtcGF0aC1jd2QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGF0aC1jd2QvLS9pcy1wYXRoLWN3ZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTBpWHNJeE11aWUzVGo5cDJkSExtTG1YeEVHMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1wYXRoLWluLWN3ZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wYXRoLWluLWN3ZC8tL2lzLXBhdGgtaW4tY3dkLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GalYxUlRXNDhFN0NXTTdlRS9KMk5KdkFFRVZla3RlY0RCVkJFNUhoM25NMUpkMGt2aEh0WDY4UHIzeHNEZjg1N3h0M1k0QWt3VlVMSzFWa3U2MmFhUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtcGF0aC1pbnNpZGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXBhdGgtaW5zaWRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXBhdGgtaW5zaWRlLy0vaXMtcGF0aC1pbnNpZGUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qdlczM2xCRGVqL2NwclRvWmU5NnBWeTBnRFk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGF0aC1pcy1pbnNpZGUiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcHJvbWlzZS8tL2lzLXByb21pc2UtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lYUtwN09md2x1Z1BOdEt5ODd3V3dmOUw4L289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVnZXgvLS9pcy1yZWdleC0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZSZEltMVJ3a2JDVERnbFdWTTdTWHVsK2xKRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXJlc29sdmFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVzb2x2YWJsZS8tL2lzLXJlc29sdmFibGUtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFnRFlYRlNSNVd2RWZ1UzVkTWo2b1RNRWJyclNhTTBDckZrMllpcS9nWG5CdkQ5cE1hMmpHWHh5aEdMZnZoWnB1TVplMThDSnBGeEF0M0NSczQyTk1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1zeW1ib2wiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtc3ltYm9sLy0vaXMtc3ltYm9sLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1IUzhiWjlveDYweUNKTEg5c25CcEl3djlwWVVBa2N1TGhTQTFvZXJvMVVCNXk5YWlRcFJBOHkyZXg5NDVBT3RDWkwxbEpEZUlrM0c1THRoc3dJNDZMdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzLXN5bWJvbHMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11NU5kU0Znc3VoYU1Cb05KVjZWS1BnY1NUeEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNleGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNleGUvLS9pc2V4ZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZQdnpkTnhWYi9pVWVoRGNzRmN0WXo4cytoQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc3RhbmJ1bCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc3RhbmJ1bC8tL2lzdGFuYnVsLTAuNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmNmWFBVeE5xRTFQT3NNUXVSajdDNEF6Y3pzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxLjAueCIsCisgICAgICAgICJhc3luYyI6ICIxLngiLAorICAgICAgICAiZXNjb2RlZ2VuIjogIjEuOC54IiwKKyAgICAgICAgImVzcHJpbWEiOiAiMi43LngiLAorICAgICAgICAiZ2xvYiI6ICJeNS4wLjE1IiwKKyAgICAgICAgImhhbmRsZWJhcnMiOiAiXjQuMC4xIiwKKyAgICAgICAgImpzLXlhbWwiOiAiMy54IiwKKyAgICAgICAgIm1rZGlycCI6ICIwLjUueCIsCisgICAgICAgICJub3B0IjogIjMueCIsCisgICAgICAgICJvbmNlIjogIjEueCIsCisgICAgICAgICJyZXNvbHZlIjogIjEuMS54IiwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4zLjEuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4xLjEiLAorICAgICAgICAid29yZHdyYXAiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJlc3ByaW1hIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuNy4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtMi43LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImdsb2IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNS4wLjE1IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNS4wLjE1LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUc4azJ1ZUF2U21BL3pDSXV6M1l6MHd1TGs3RT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAgICAgIm1pbmltYXRjaCI6ICIyIHx8IDMiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJoYXMtZmxhZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtblo1NU1XWE9BWG9BOEFRWXhEK1VLbnNkRWZvPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0zLjIuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aYXdGQkxPVlFYSFlwa2xHc3E0OHU0cGZWUFk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaGFzLWZsYWciOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImpzLXRva2VucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy10b2tlbnMvLS9qcy10b2tlbnMtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJkSlVmbGNFM2NVektpTXFRZ3NDdTA2RlB1OVVkSUpPMGJlWWJQaEhONGs2YXBnSnRpZmNvQ3RUOWJjeE9wWUJ0cEQya0NNNlNiemc0Q2F1c1cvUEtRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqcy15YW1sIjogeworICAgICAgInZlcnNpb24iOiAiMy4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy15YW1sLy0vanMteWFtbC0zLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVBJdDJjbndtUGZMNGhLTndxZWl1ejRiS2ZuekhUQnY2SHlWZ2phaEE2bVBMd1BEempEV3JwbEpCTWpIVUZ4a3UvTjNGbG1yYnlQY2xhZCtJKzRtSjNBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmdwYXJzZSI6ICJeMS4wLjciLAorICAgICAgICAiZXNwcmltYSI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAianMyeG1scGFyc2VyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzMnhtbHBhcnNlci8tL2pzMnhtbHBhcnNlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVA3WU9xZ2ljVkVENU1aOVJkZ3pOQitKSmx6TT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ4bWxjcmVhdGUiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzZG9jLy0vanNkb2MtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZQeEI2NVRBVTRXTzBXenlyLzQvWWhsR292WGwwRVZZZnBLYnBTcm9TajBxQnhUNC94b2QvbDQwT3BrbTM4ZFJIUmRRZ2RlWTgzNk0wdVZuSlFHN2tnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYWJ5bG9uIjogIjcuMC4wLWJldGEuMTkiLAorICAgICAgICAiYmx1ZWJpcmQiOiAifjMuNS4wIiwKKyAgICAgICAgImNhdGhhcnNpcyI6ICJ+MC44LjkiLAorICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAifjEuMC41IiwKKyAgICAgICAgImpzMnhtbHBhcnNlciI6ICJ+My4wLjAiLAorICAgICAgICAia2xhdyI6ICJ+Mi4wLjAiLAorICAgICAgICAibWFya2VkIjogIn4wLjMuNiIsCisgICAgICAgICJta2RpcnAiOiAifjAuNS4xIiwKKyAgICAgICAgInJlcXVpenpsZSI6ICJ+MC4yLjEiLAorICAgICAgICAic3RyaXAtanNvbi1jb21tZW50cyI6ICJ+Mi4wLjEiLAorICAgICAgICAidGFmZnlkYiI6ICIyLjYuMiIsCisgICAgICAgICJ1bmRlcnNjb3JlIjogIn4xLjguMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS10cmF2ZXJzZS8tL2pzb24tc2NoZW1hLXRyYXZlcnNlLTAuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi14YmJDSDVkQ1lVNVQ4TGNFaGh1aDdISjg4SFh1VzNxc0kzWTB6T1pGS2ZaRUhjcFdpSFUvSnh6azYyOUJyc2FiL21NaUhRdGk5d01QKzg0NVJQZTNWZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5Ly0vanNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5iZTFsSmF0UHp6Kzh3cDFGQzB0a3dyWEpsRT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJrbGF3IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tsYXcvLS9rbGF3LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NFbzROeGM1QkFnRVZFWlR1dWN2NFdHVVBZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJsZXZuIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xldm4vLS9sZXZuLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT3dtU1R0K2ZDRHdFa1AzVXdMeEVJZUJIWk80PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInByZWx1ZGUtbHMiOiAifjEuMS4yIiwKKyAgICAgICAgInR5cGUtY2hlY2siOiAifjAuMy4yIgorICAgICAgfQorICAgIH0sCisgICAgImxvZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMTcuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvZGFzaC8tL2xvZGFzaC00LjE3LjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jUUtoOGlnbzVRVWhaN2xnMzhEWVdBeE12alNBS0cwQTh3R1NWaW1QMDdTSVVFSzJVTythclNSS2JSWld0ZWxNdE41VjBIa3doNXJ5T3RvL1NzaFlJZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWFya2VkIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21hcmtlZC8tL21hcmtlZC0wLjMuMTkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVhMmVHV09xTnhQY1h2OGR5RVJkU3IvNkZtenZXd3pqTXhwZkdCL3NiTWNjWG9jdCt4WStZdWtQRCtRVFVad3l2SzdCWndjcjRtMjFXQk9XNDFwQWtnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1pYy1mbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1pYy1mbi8tL21pbWljLWZuLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qZjg0dXh6d2l1aUlWS2lPTHBmWWs3TjQ2VFN5OHViVG9ubW5lWTl2cnBITkFucDBRQnQyQnhXVjlkTzMvaitCb1ZBYithNUc2WURQVzNNNUhPZE1XUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltaWMtcmVzcG9uc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltaWMtcmVzcG9uc2UvLS9taW1pYy1yZXNwb25zZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItajVFY3Rua0g3YW1mVi9xNUhnbW9hbDFnMlFIRkpScmFPdG14MEpwSXFreGhCaEkvbEpTbDFuTXBRNDVoVmFyd05FVE9vV0VpbW5kWjRRSzBSSHh1eFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbmltYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlKSFZRRWh5cVBMVVRndDlCODNQWHU2VzNyeDRNdnZIdlNVdlRvb2dwd29HRE9VUSt5RHJSMEhSb3QreU9DZENPN3U0aFgzcFdmdDZrV0JCY3FoMFVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicmFjZS1leHBhbnNpb24iOiAiXjEuMS43IgorICAgICAgfQorICAgIH0sCisgICAgIm1pbmltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0wLjAuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhYL0t2OE01ZlNZbHVDS0NZdWhxcDZBUnNGMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJta2RpcnAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ta2RpcnAvLS9ta2RpcnAtMC41LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NQVYwT09yR3ozK01SMmZ6aGtqV2FYMTF5UU09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAiMC4wLjgiCisgICAgICB9CisgICAgfSwKKyAgICAibXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZnaXVyZndBdm13cEFkOWZtR0Y0amVEVmw4Zz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtdXRlLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tdXRlLXN0cmVhbS8tL211dGUtc3RyZWFtLTAuMC43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUhYT2s3d2h1UHEwUGh2RTJuNkJGZTBlZTZzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uYW4vLS9uYW4tMi4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1iQWRKdjdmQkxoV0MrL0JsczBPemErbXZUYU5RdFArMVJ5aGhodkQ5NXBnVUp6NlhNNUl6Z214T2tJdEo5dGtvQ2lwbHZBblhJMXRObW1VRC9lU2N5QT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibmF0dXJhbC1jb21wYXJlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25hdHVyYWwtY29tcGFyZS8tL25hdHVyYWwtY29tcGFyZS0xLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNyNi83dGRVSHl3bnJQc3B2YnZSWEkxYnBQYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuaWNlLXRyeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uaWNlLXRyeS8tL25pY2UtdHJ5LTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xbmg0NWRlZWI1b2xOWTdlWDgyQmtQTzdTU3hSNVNTWUppUFRyVGRGVVZZd0FsOENLTUE1TjlQalRZa0hpUmppc1ZjeGNRMUhYZExoeDJxeHhKekxOUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibm9kZS1hYmkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9kZS1hYmkvLS9ub2RlLWFiaS0yLjQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYWEvVUM2TnIzK3RxaEhHUnNBdXcvZWR6Ny9xOW5uZXRCcktXeGo2cnBUdG0rMFg5VDFxVTdsSUVITVMzeU45SndBYlJpS1ViUlJGeTFQTHoveTNhYUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNlbXZlciI6ICJeNS40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAibm9kZS1pbnQ2NCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub2RlLWludDY0Ly0vbm9kZS1pbnQ2NC0wLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWg2a0dYTnMxWFRHQzJQbE00UkdJdUNYR2lqcz0iCisgICAgfSwKKyAgICAibm9vcC1sb2dnZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9vcC1sb2dnZXIvLS9ub29wLWxvZ2dlci0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxLS3hZenhQRXhkVk1BZllsbS9RNkVHMnBNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJub3B0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGtaZHZ3aXJ6VTJ6V1RGL2VheG9wa2F5ai9rPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgIm5wbWxvZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ucG1sb2cvLS9ucG1sb2ctNC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJ1VXFhenVLbFRhU0kvZEM4QXppY1VjazcrSXJFYU9uTi9lMGpkM1h0dDFLY0dwd3gzMHY1MG1MN29QeXIvaDliTDNFNGFaY2NWd3B3UCs1VzlWamtnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmUtd2UtdGhlcmUteWV0IjogIn4xLjEuMiIsCisgICAgICAgICJjb25zb2xlLWNvbnRyb2wtc3RyaW5ncyI6ICJ+MS4xLjAiLAorICAgICAgICAiZ2F1Z2UiOiAifjIuNy4zIiwKKyAgICAgICAgInNldC1ibG9ja2luZyI6ICJ+Mi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibnVtYmVyLWlzLW5hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9udW1iZXItaXMtbmFuLy0vbnVtYmVyLWlzLW5hbi0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNYdGdLMU5DS2xJc0d2dUhrREdETnBRYUFSMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtYXNzaWduIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1hc3NpZ24vLS9vYmplY3QtYXNzaWduLTQuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVFtdHg1WlloOC9BWEx2VVFzckl2N3MyQ0dNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1pbnNwZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1pbnNwZWN0Ly0vb2JqZWN0LWluc3BlY3QtMS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdKemZCWjZEZ0RBbW51YU0zMTA0alI0czFNeXhyM1kzemZJeU40ejNVZHFONjlvU1JhY05LOFVobm9iRGRDKzdKMkFIQ2pHd3hRdWJOSmZFNzBTWFhRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3Qta2V5cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWtleXMvLS9vYmplY3Qta2V5cy0xLjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUZUTXlGVW0yd0JjR0huSDJlWG16N3RDNkl3bHFRWjZtVlorNmRtNnZaNElRSUhqczZGZE5zUUJ1S0dQdVVVVVk2TmZKdzJQc2hDMDhUbjZMekxET2FnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvbi1maW5pc2hlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbi1maW5pc2hlZC8tL29uLWZpbmlzaGVkLTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVBFelpJR3dnODExTTNtU29XbHhxaTJRYVVjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVlLWZpcnN0IjogIjEuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgIm9uY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb25jZS8tL29uY2UtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XRHNhcDNXV0hVc1JPc0Y5bkZDNjc1M1hhOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAib25ldGltZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbmV0aW1lLy0vb25ldGltZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJuUW9Jdy9XZEVPeWVVc2l1NlVvdG9aNVl0UT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1pYy1mbiI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib3B0aW1pc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3B0aW1pc3QvLS9vcHRpbWlzdC0wLjYuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJqNm5Sb2I2SWFHYUVSd3licERyRmFBWlpvWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6ICJ+MC4wLjEiLAorICAgICAgICAid29yZHdyYXAiOiAifjAuMC4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ3b3Jkd3JhcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjAuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMC4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzlYYWJOWEF2QUFJMDNJMHU2OGI3V01Ga1FjPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm9wdGlvbmF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3B0aW9uYXRvci8tL29wdGlvbmF0b3ItMC44LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Oa3hlUUowL1RXTUIxc0Mwd0Z1NlVCZ0s2MlE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVlcC1pcyI6ICJ+MC4xLjMiLAorICAgICAgICAiZmFzdC1sZXZlbnNodGVpbiI6ICJ+Mi4wLjQiLAorICAgICAgICAibGV2biI6ICJ+MC4zLjAiLAorICAgICAgICAicHJlbHVkZS1scyI6ICJ+MS4xLjIiLAorICAgICAgICAidHlwZS1jaGVjayI6ICJ+MC4zLjIiLAorICAgICAgICAid29yZHdyYXAiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9zLWhvbWVkaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtaG9tZWRpci8tL29zLWhvbWVkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vN3hKaUROdURvTTk0TUZveCs4VklTR3FmN009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib3MtdG1wZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLXRtcGRpci8tL29zLXRtcGRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXUrWjBCc2VhcUZ4Yy9zZG0vbGMwVlYzNkVuUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXJzZXVybCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZXVybC8tL3BhcnNldXJsLTEuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtL0NpZFR0aVpNUmxHREJWaVV5WXMzSTNtVy9NPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtaXMtYWJzb2x1dGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1pcy1hYnNvbHV0ZS8tL3BhdGgtaXMtYWJzb2x1dGUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GMHVTYUhOVk5QKzhlczVyOVRwYW5odGNYMTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1pcy1pbnNpZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1pcy1pbnNpZGUvLS9wYXRoLWlzLWluc2lkZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5sUVgzdDVFUXcwY0VhOWhBbitzOEhTOS9GTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWtleSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWtleS8tL3BhdGgta2V5LTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUVJ5dHRYVEZvVURUcExHUkRVRFlETW4wQzBBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtcGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1wYXJzZS8tL3BhdGgtcGFyc2UtMS4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdTbU9UMkViSHJJTkJmOVNSN0NERUx3bEo4QUVOazNRbjdPaWtLNG5GWUF1M090ZTIrSllOVnZrcEFFUW0zL1RMTkVKRkQveFpKanp5eGczS0JXT3p3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlmeS8tL3BpZnktMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UlFhYXNCRHFFbnFXSVNZNTl5b3NWTXc2UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpbmtpZS8tL3BpbmtpZS0yLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNsVnJnTStnMUlxWFRvRG5ja2pvRHRUMytIQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaW5raWUtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUtcHJvbWlzZS8tL3BpbmtpZS1wcm9taXNlLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVRYVzM2ZWpXTUJwckpzWGgzWW9naWhGRC9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBpbmtpZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGx1cmFsaXplIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BsdXJhbGl6ZS8tL3BsdXJhbGl6ZS03LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQVJoQk9kelMzZTQxRmJrVy9YV3JURXR1a3FxTG9LNStaLzRVZURhTHVTVyszOUpQZUZnczRnQ0dxc3JKSFZaWDBmVXJ4Ly80T0YwSzFDVUd3bElGb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZWJ1aWxkLWluc3RhbGwiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJlYnVpbGQtaW5zdGFsbC8tL3ByZWJ1aWxkLWluc3RhbGwtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTd0YXl4ZVlib0pYMFJiVnpkbkt5R2wydmhRUldyNnFmQ2xFWERoT2tYanVhT0tDdzJxOGFpdUZoT05SWVZzRy9jemlhN0tocHlrSWxJMlMyVmFQdW5BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZXRlY3QtbGliYyI6ICJeMS4wLjMiLAorICAgICAgICAiZXhwYW5kLXRlbXBsYXRlIjogIl4xLjAuMiIsCisgICAgICAgICJnaXRodWItZnJvbS1wYWNrYWdlIjogIjAuMC4wIiwKKyAgICAgICAgIm1pbmltaXN0IjogIl4xLjIuMCIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIiwKKyAgICAgICAgIm5vZGUtYWJpIjogIl4yLjIuMCIsCisgICAgICAgICJub29wLWxvZ2dlciI6ICJeMC4xLjEiLAorICAgICAgICAibnBtbG9nIjogIl40LjAuMSIsCisgICAgICAgICJvcy1ob21lZGlyIjogIl4xLjAuMSIsCisgICAgICAgICJwdW1wIjogIl4yLjAuMSIsCisgICAgICAgICJyYyI6ICJeMS4xLjYiLAorICAgICAgICAic2ltcGxlLWdldCI6ICJeMi43LjAiLAorICAgICAgICAidGFyLWZzIjogIl4xLjEzLjAiLAorICAgICAgICAidHVubmVsLWFnZW50IjogIl4wLjYuMCIsCisgICAgICAgICJ3aGljaC1wbS1ydW5zIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInByZWx1ZGUtbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJlbHVkZS1scy8tL3ByZWx1ZGUtbHMtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JWk1xVko5ZVV2L1pxQ2YxY09CTDVpcVgybFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJldHRpZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE0LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0aWVyLy0vcHJldHRpZXItMS4xNC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xWkRWbkNybnBzUkpKcTVuU3NpSENFM0JZTUVEMk90c0krY216SXpGMVFJZnFtNUFMZjh0RUpjTzI3elYxZ0tOS1JQZGhqTzBkTlducnpzc0RRMXRGZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJldHRpZXItbGludGVyLWhlbHBlcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJldHRpZXItbGludGVyLWhlbHBlcnMvLS9wcmV0dGllci1saW50ZXItaGVscGVycy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2JLMmNQOW5yYVNTVUY5TjJYd1V3cWZ6bEFGbE1OWVlsK1NoRS9WK0g4YTl1Tmwvb1VxQjF3MkVMNTRKaDBPbHlSU2Q4UmZXWUozY29WUzRUUk9QMnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZhc3QtZGlmZiI6ICJeMS4xLjIiCisgICAgICB9CisgICAgfSwKKyAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvLS9wcm9jZXNzLW5leHRpY2stYXJncy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTXRFQzFUcU4wRVU1bmVwaGFKNHJBdFRoSHRDODZkTk45cUN1RWh0c2h2cFZCa0FXNVpPN0JBU045UkVuRjllb1hHY1J1YitwRnVLRXBPSEUrSGJFTXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2dyZXNzLy0vcHJvZ3Jlc3MtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FK2E2dnpxYXpjK0s2THhKclg1VVB5S0Z2R25MNUNZbXEyakZHTklCV0hwYzRReUU0OS9ZT3VtY3JwUUZKcGZlam12UnRiSnpnTzF6UG1NQ3FsYkJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwdW1wIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bXAvLS9wdW1wLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ydVBNTlJrTjNNSFAxY1dKYzlPV3IrVC94RFAwamhYWUNMZkpjQnVYNTRoaGZJQm5hUW1BVU1mRGNHNERNNVVNV0J5QmJKWTY5UVNwaG0zanRES0lrQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZW5kLW9mLXN0cmVhbSI6ICJeMS4xLjAiLAorICAgICAgICAib25jZSI6ICJeMS4zLjEiCisgICAgICB9CisgICAgfSwKKyAgICAicHVueWNvZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVueWNvZGUvLS9wdW55Y29kZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWFJzUmpkZitqNW1sK3kvNkdLSFBaYnJGLzhwMllnYTBKUHRkcVRJWTJYZTVvaEpQRDlzYURKSkxQdnA5K05TQnByVnZldmRYWnlibmoyY3Y4T0VkMEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInEiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcS8tL3EtMS41LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1makwzVzBFNEVwSFFSaEh4dnhRUW1zQUdVZGM9IgorICAgIH0sCisgICAgInJjIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JjLy0vcmMtMS4yLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXkzYkdncUtqM1FCZHhMYkxrb21sb2hrdnNBOGdkQWlVUWxTQkpuQmhmbitCUHhnNGJjNjJkOFRjQlcxNXdhdkRmZ2V4Q2djY2NraGNadnl3eVFZUE93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWVwLWV4dGVuZCI6ICJeMC42LjAiLAorICAgICAgICAiaW5pIjogIn4xLjMuMCIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4yLjAiLAorICAgICAgICAic3RyaXAtanNvbi1jb21tZW50cyI6ICJ+Mi4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZWFkYWJsZS1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4zLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRRdEtBOVdJQWhCRjMrVkxBc2V5TXFaZUJqVzBBSEpveE90WXFTVVpOSnhhdUVybUxiVm0yRlcxeStKL1lBOWRVckFDMzlJVGVqbFpXaFZJd2F3a0t3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6ICJ+Mi4wLjAiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4xIiwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4xLjEuMSIsCisgICAgICAgICJ1dGlsLWRlcHJlY2F0ZSI6ICJ+MS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAicmVnZXhwcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWdleHBwLy0vcmVnZXhwcC0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbHYwTTYrVGtEVm5pQTNhRDFFZzBEVnBmVS9ib29TdTdFZXYzVERPL21aS0hCZlZqZ0NHVFY0dDRidXBwRVNFWUR0a0FyWUZPeFRKV3Y2UzVDK2lhTnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcXVpcmUtdW5jYWNoZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWlyZS11bmNhY2hlZC8tL3JlcXVpcmUtdW5jYWNoZWQtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UZzFXMXNsbUw5TWVRd0VjUzVXcVNaVlVJZE09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FsbGVyLXBhdGgiOiAiXjAuMS4wIiwKKyAgICAgICAgInJlc29sdmUtZnJvbSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVxdWl6emxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVpenpsZS8tL3JlcXVpenpsZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWFVUERVd3hObW41RzhjM2RVY0ZZL0djTTI5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIn4xLjYuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuNi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWl6aXhES3plOWpNM3VMSk9UL2h0UmE2bEthZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUvLS9yZXNvbHZlLTEuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSURFVTJDclN4ZTJlamdRUnM1TW9kZWlKNlhzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc29sdmUtZnJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLWZyb20vLS9yZXNvbHZlLWZyb20tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Kc3YrazEwYTd1cTdLYncvNWE2d0hwUFVRaVk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVzdG9yZS1jdXJzb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzdG9yZS1jdXJzb3IvLS9yZXN0b3JlLWN1cnNvci0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW4zN2loL2d2MHliVS9SWXBJOVloS2U3ZzM2OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmV0aW1lIjogIl4yLjAuMCIsCisgICAgICAgICJzaWduYWwtZXhpdCI6ICJeMy4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAicmVzdW1lciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXN1bWVyLy0vcmVzdW1lci0wLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThlajBZZVFHUzZPZWdxODgzQ3FNaVQwSFoxaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0aHJvdWdoIjogIn4yLjMuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyaW1yYWYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmltcmFmLy0vcmltcmFmLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1scmVld0xLL0JsZ2hteHRmSDM2WVlWZzFpOElBY2U0VEk3b2FvNzVJMWcyNDUrNkJjdHFUVlFpQlAzWVVKOUM2RFFPWEpta1lSOVg5ZkNMdENPSmM1dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYiI6ICJeNy4wLjUiCisgICAgICB9CisgICAgfSwKKyAgICAicnVuLWFzeW5jIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3J1bi1hc3luYy8tL3J1bi1hc3luYy0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUEzR3JTdUM5MXlEVUZtMTkvYVpQOTZSRnBzQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1wcm9taXNlIjogIl4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyeGpzIjogeworICAgICAgInZlcnNpb24iOiAiNi4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3J4anMvLS9yeGpzLTYuMy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KVFdtb1k5dFdDczd6dklrL0N2UmpoakdhT2QrT1ZCTTk4N214Rm8rT1c2NmNHcGRLalpjcG1jNzRFUzFzQi8vN0tsL1BBZTgrd0Vha3VoRzRwY2dPdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidHNsaWIiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgInNhZmUtYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NhZmUtYnVmZmVyLy0vc2FmZS1idWZmZXItNS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdkMlVaQkpEa1hsWTdHYkp4ZnNFOC9udktrVUVVMUczOGMxc2lONlFQNmE5UFQ5TW1IQjhHbnBzY1NtTUpTb0Y4TE9JcnQ4dWQvd1B0b2p5czRHNitnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzYWZlci1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZXItYnVmZmVyLy0vc2FmZXItYnVmZmVyLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZWm8zSzgyU0Q3Uml5aTBFMUVRUG9qTHo3a3BlcG5TUUk5SXlQYkhIZzFYWFhldmI1ZEpJN3RweU4yQUR4R2NRYkhHN3ZjeVJIazBjYndxY1FyaVV0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2VtdmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NlbXZlci8tL3NlbXZlci01LjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlM5UjZSMzVOWWdRbisrZmtEV2FPbXFHb2o0RWs5Z0dzK0RQeE5VWkt1d0UxODN4akpyb0t2eW8xSXpWRmVYdlVydm1BTHk2RldENXhyZEpUMjVnTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNldC1ibG9ja2luZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtYmxvY2tpbmcvLS9zZXQtYmxvY2tpbmctMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CRitYZ3RBUnJwcG9BOTNUZ3JKRGtyUFlrUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2hlYmFuZy1jb21tYW5kIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWJhbmctY29tbWFuZC8tL3NoZWJhbmctY29tbWFuZC0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJLckdXMmxiQXptSmFNT2ZOai91WGVyOThlbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzaGViYW5nLXJlZ2V4IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzaGViYW5nLXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWJhbmctcmVnZXgvLS9zaGViYW5nLXJlZ2V4LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMmtMMGwwREF0QzJ5eXBjb1Z4eXhrTW1PL3FNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpZ25hbC1leGl0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpZ25hbC1leGl0Ly0vc2lnbmFsLWV4aXQtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjNBanhLSDZoRjRZbzVCWGlVVEszTmtiRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2ltcGxlLWNvbmNhdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaW1wbGUtY29uY2F0Ly0vc2ltcGxlLWNvbmNhdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWMwVEx1TGJpYjdKOVpyTDhodm4yMVpsMUljWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaW1wbGUtZ2V0IjogeworICAgICAgInZlcnNpb24iOiAiMi44LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpbXBsZS1nZXQvLS9zaW1wbGUtZ2V0LTIuOC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1sU1NIUlN3M21RTlVHUEFZUnFvN3h5OWRoS214RlhJakxqcDRLSHBmOTlHRUgyVkg3QzNBTStRZng2ZHU2amhmVWk2Vm03WG5iRVZFZjdXYjZOOGpSdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVjb21wcmVzcy1yZXNwb25zZSI6ICJeMy4zLjAiLAorICAgICAgICAib25jZSI6ICJeMS4zLjEiLAorICAgICAgICAic2ltcGxlLWNvbmNhdCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2xpY2UtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbGljZS1hbnNpLy0vc2xpY2UtYW5zaS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUE9xeEJLNkxiM3E2czA0N0QvWHNEVk5QbkY5RGw4SlNhcWU5aDlsVVJsME9kTnF5L3VqRHJPaUlIdHNxWE1HYldXVElvbVJ6QU1hVHlhd0FVLy9SZWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzb3VyY2UtbWFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMnJjL3ZQd3JxQm0wM2dPOWIyNnFTQlpMUDUwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbWRlZmluZSI6ICI+PTAuMC40IgorICAgICAgfQorICAgIH0sCisgICAgInNwcmludGYtanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3ByaW50Zi1qcy8tL3NwcmludGYtanMtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CT2FTYjJZb2xUVlBQZEFWSURZenVGY3BmaXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RhdHVzZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhdHVzZXMvLS9zdGF0dXNlcy0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSt2VWJucmRLcnZPenJQU3RYMkdyOGt5M3VUND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzdHJpbmctd2lkdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nLXdpZHRoLy0vc3RyaW5nLXdpZHRoLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uT3FINTlkZUNxOVNSSGx4cTFBdzg1Sm50NHc2S3ZMS3FXVmlrNm9BOVprbFhMTklPbHFnNEYyeXJUMU1WYVRqQXF2VndkZmVaN3c3YUN2SkQ3dWdrdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiAiXjIuMC4wIiwKKyAgICAgICAgInN0cmlwLWFuc2kiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmluZy5wcm90b3R5cGUudHJpbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmcucHJvdG90eXBlLnRyaW0vLS9zdHJpbmcucHJvdG90eXBlLnRyaW0tMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0wRTNpeUo0VGYwMTlJRzhJYTE3Uyt1YStqT289IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnRpZXMiOiAiXjEuMS4yIiwKKyAgICAgICAgImVzLWFic3RyYWN0IjogIl4xLjUuMCIsCisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpbmdfZGVjb2RlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uL1NobnZEaTZGSGJiVmZ2aXJvK1dvamlGenYrczhNUE1IQmN6VmVQZlVwREpMd29MVDBodDFsNFl3QkNiaThwSkF2ZUVFZG5rSHlQeVRQL216UmZ3Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAifjUuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtYW5zaS8tL3N0cmlwLWFuc2ktNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xRWVRSXVzYXcyaW9jVGliWTFKaXhRWHVObzg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1yZWdleCI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtanNvbi1jb21tZW50cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1qc29uLWNvbW1lbnRzLy0vc3RyaXAtanNvbi1jb21tZW50cy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBGTVpRdWtJd21sOERzTkVoWXdvYkh5Z3Bnbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTUuNS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RalZqd2RYSXQ0MDhNSWlBcUNYNG9VS3NnVTJFcUFHenMyUHBrbTRhUVliam0rWkVXRWNXNFNmRk5UcjR1TU5abWEwZXk0ZjVsZ0xya0IwYVgwUU1vdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzLWZsYWciOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInRhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiNS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhYmxlLy0vdGFibGUtNS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWU1NDJpbjIyWkxoRC9mT0l1WHMvOHlEWjlXNjFsdEY4ZGFNODhya1JOdGdUSWN0K3ZJMmZUbkF5dS9EYjJUQ2ZFY0k4aTdtalp6Nm1lTHEwblc3VFlnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhanYiOiAiXjYuNS4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4xNy4xMCIsCisgICAgICAgICJzbGljZS1hbnNpIjogIjEuMC4wIiwKKyAgICAgICAgInN0cmluZy13aWR0aCI6ICJeMi4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAidGFmZnlkYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWZmeWRiLy0vdGFmZnlkYi0yLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZMeTJTMW9VRzJvdS9DeGRMR2UwNFZDeW9tZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0YXBlIjogeworICAgICAgInZlcnNpb24iOiAiNC45LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhcGUvLS90YXBlLTQuOS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02ZktJWGtuTHBvZS9KcDRyekhLRlBwSlVIREhEcW44anVzOTlJZlBuSElqeXo3OEhZbGVmVEdEM2I1RWtiUXp1TGZhRXZtZlBLM0lvbExncTJ4VDNrdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVlcC1lcXVhbCI6ICJ+MS4wLjEiLAorICAgICAgICAiZGVmaW5lZCI6ICJ+MS4wLjAiLAorICAgICAgICAiZm9yLWVhY2giOiAifjAuMy4zIiwKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAifjEuMS4xIiwKKyAgICAgICAgImdsb2IiOiAifjcuMS4yIiwKKyAgICAgICAgImhhcyI6ICJ+MS4wLjMiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgIm1pbmltaXN0IjogIn4xLjIuMCIsCisgICAgICAgICJvYmplY3QtaW5zcGVjdCI6ICJ+MS42LjAiLAorICAgICAgICAicmVzb2x2ZSI6ICJ+MS43LjEiLAorICAgICAgICAicmVzdW1lciI6ICJ+MC4wLjAiLAorICAgICAgICAic3RyaW5nLnByb3RvdHlwZS50cmltIjogIn4xLjEuMiIsCisgICAgICAgICJ0aHJvdWdoIjogIn4yLjMuOCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInJlc29sdmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS43LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLy0vcmVzb2x2ZS0xLjcuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWM3cndMb2ZwOGcxVStoMUtOeUhML2ppY3JLZzFFazRxK0xyMzNBTDY1dVpUaW5VWkhlMzBENUhseU41VjlOVzBKWDFENWRYUTRqcVc1bDdTeS9rR2Z3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJwYXRoLXBhcnNlIjogIl4xLjAuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0YXItZnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjE2LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rhci1mcy8tL3Rhci1mcy0xLjE2LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU52Q2VYcFl4N09zbU9oOHpJT1AvZWJHNTV6Wm14TEUwZXRmV1JiV29rK3EyUW84eC92T1IvSUpUMXRhQURYUGUranNpdTlheERiM1g0QitpSWdObEt3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaG93bnIiOiAiXjEuMC4xIiwKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiLAorICAgICAgICAicHVtcCI6ICJeMS4wLjAiLAorICAgICAgICAidGFyLXN0cmVhbSI6ICJeMS4xLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInB1bXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW1wLy0vcHVtcC0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLThrMEp1cFdtZTU1Kzl0Q1ZFK0ZTNVVMVDNLNkFiZ3FyR2E1OGxUVDQ5UnB5Znd3Y0dlZEhxYUM1TGxRTmRFQXVtbi93RnN1NmFQd2t1UE1pb3k4a3F3PT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJlbmQtb2Ytc3RyZWFtIjogIl4xLjEuMCIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjEiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidGFyLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXItc3RyZWFtLy0vdGFyLXN0cmVhbS0xLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcnpTMGhlaU5mOFhuNy9tcGRTVlZTTUFXQW95OWJmYjFXT1RZQzc4WjBVUUtlS2EvQ1dTOEZPcTBsS0dOYThEV0tBbjlneGpDdk1MWWM1UEdYWWxLMkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJsIjogIl4xLjAuMCIsCisgICAgICAgICJidWZmZXItYWxsb2MiOiAiXjEuMi4wIiwKKyAgICAgICAgImVuZC1vZi1zdHJlYW0iOiAiXjEuMC4wIiwKKyAgICAgICAgImZzLWNvbnN0YW50cyI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjMuMCIsCisgICAgICAgICJ0by1idWZmZXIiOiAiXjEuMS4xIiwKKyAgICAgICAgInh0ZW5kIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0ZXh0LXRhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RleHQtdGFibGUvLS90ZXh0LXRhYmxlLTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZjE3b0k2NkFVZ2ZBQ3ZMZlNvVHNQOCtsY0xRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRocm91Z2giOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90aHJvdWdoLy0vdGhyb3VnaC0yLjMuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURkVEovNnE4TlhsZ3NiY2tFVjErRG9haTRmVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0bXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMzMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RtcC8tL3RtcC0wLjAuMzMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpSQ0psb2pLblozYWRkdFRPamRJcW9SdVBFS0J2TlhjR1lxek82eldaWDhLZktFcG5HWTVqZmdnSlEzRWpLdXU4RDRiSlJyMHkrY1lKRm1ZYkltWEd3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvcy10bXBkaXIiOiAifjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgInRvLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1idWZmZXIvLS90by1idWZmZXItMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWx4OUI1aXY3bXN1RllFM2R5dFQrS0U1dGFwK3JOWXcrSzRqVmtiOVIvYXNBYitwYkJTTTE3anR1bkhwbGhCZTZSUkpkWngzUG4ySnBoMjRPMzJtT1ZnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0c2xpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90c2xpYi8tL3RzbGliLTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00a3JGOHNjcGVqaGFPZ3F6QkVjR003eURJRWZpMC84Kzh6RFJaaE5aWjJram1ISjRodjN6Q2JRV3hvSkd6MWl3NVUwSmwwbm1hMTN4ekhYY25jTWF2UT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHVubmVsLWFnZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R1bm5lbC1hZ2VudC8tL3R1bm5lbC1hZ2VudC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUo2WGVvR3Myc0VvS21XWjNTeWtJYVBEOFFQMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHlwZS1jaGVjayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90eXBlLWNoZWNrLy0vdHlwZS1jaGVjay0wLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdJVEt0UkxQSFRWZVA3ZUU4d2dFc3JVZzIzST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwcmVsdWRlLWxzIjogIn4xLjEuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0eXBlc2NyaXB0IjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R5cGVzY3JpcHQvLS90eXBlc2NyaXB0LTMuMS42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10RE1ZZlZ0dnBiOTZtc1MxbERYOU1FZEhyVzR5T3VaNEtkYzRIaW05b1U3OTZYbGRQWUYvdDIrdUtvWDBCQmEwaFhYd0RscVlRYlhZNVJ6anpjNWhCQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidWdsaWZ5LWpzIjogeworICAgICAgInZlcnNpb24iOiAiMy40LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VnbGlmeS1qcy8tL3VnbGlmeS1qcy0zLjQuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItOENKc2JLT3RFYm5Kc1R5djZMRTZtNlpLbmlxTWlGV21tOXNSYm9wYmtHczNnTVBQZmQzRmg4aUlBNFlrdjVNZ2FUYnFIcjRCYW9HTEpMWk5oc3JXMVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb21tYW5kZXIiOiAifjIuMTcuMSIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjYuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiY29tbWFuZGVyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMTcuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbW1hbmRlci8tL2NvbW1hbmRlci0yLjE3LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi13UE1VdDZGbkgyeXpHOTVTQTZtempRT0VLVVUzYUxhREVtenMxdGkrMUU5aCtDc3JaZ2hSbHFFTS9FSjRLc2NzUVZHOHVOTjR1VnJlVWVUOCtkcmxnZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJzb3VyY2UtbWFwIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC42LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VamdhcHVtV2xiTWhrQmd6VDdZa2M1WVhVVDQ2RjBpS3U4U0dYcTBiY3dQNWR6L2gwUGxqNmVuSnFqejFaYnEybDVXYXFZbnJWYndXT1dNeUYzRjQ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgInZlcnNpb24iOiAiMS44LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuOC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVHorMU94QnVZSmY4K2N0QkNmS2w2YjM2VUNJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuZGVyc2NvcmUtY29udHJpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLWNvbnRyaWIvLS91bmRlcnNjb3JlLWNvbnRyaWItMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1abHRtd2tlRCtQb3JHTW40eTdEaXg5U01Kc2M9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6ICIxLjYuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuNi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWl6aXhES3plOWpNM3VMSk9UL2h0UmE2bEthZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bnBpcGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5waXBlLy0vdW5waXBlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc3I5TzZGRktybUZsdElGNEtkSWJMdlNaQk93PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVyaS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91cmktanMvLS91cmktanMtNC4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUtZOUZybWlycWw5MVgyUWdqcnkwV2Q0WStZVGRyZFpoZVM4VEZ3dmtiTFdmL0c1S05KRENoNnBLTDVPWmN0RVc0KzBCYWE1aWRLMlpRdUVMUndQem5RPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwdW55Y29kZSI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidXRmLTgtdmFsaWRhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRmLTgtdmFsaWRhdGUvLS91dGYtOC12YWxpZGF0ZS00LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQ1M2M1NzcDZ6eW5CUTRJeFZ6Z2pQNUFiZG82THVKODdIRkljZ0lpVlVlWTk2K01USGtxS3RyVWhwaGJ3UTZqWDhhU0dadjh6WDZsMURDUHBmY0FueEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJpbmRpbmdzIjogIn4xLjMuMCIsCisgICAgICAgICJuYW4iOiAifjIuMTAuMCIsCisgICAgICAgICJwcmVidWlsZC1pbnN0YWxsIjogIn40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1dGlsLWRlcHJlY2F0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlsLWRlcHJlY2F0ZS8tL3V0aWwtZGVwcmVjYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUlExTnlmcHczbk1uWXZ2UzFLS0pnVUdhRE04PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInV0aWxzLW1lcmdlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0aWxzLW1lcmdlLy0vdXRpbHMtbWVyZ2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uNVZ4RDFDaVo1UjdMTXdTUjBIQkFvUW41eE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid2hpY2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2hpY2gvLS93aGljaC0xLjMuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSHhKZFlXcTFNVElRYkozbncwY3Fzc0hvVE5VMjY3S2xyRHVHWjFXWWx4RFN0VXRLVWhPYUptaDExMi9UWm1IeHhVZnVKcVBYU09tN3REeWFzME9TSVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzZXhlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3aGljaC1wbS1ydW5zIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLXBtLXJ1bnMvLS93aGljaC1wbS1ydW5zLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWndzNis4VlM0TFZkOXJkNERLZEdGZkk2MGNzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndpZGUtYWxpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2lkZS1hbGlnbi8tL3dpZGUtYWxpZ24tMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFHa09RYzhYTDZCdDVQd25zRXhLQlB1TUtCeG5HeFdXVzNmVTU1WHQ0ZmVIb3pNVWhkVU1hQkNrMjkwcXBtL3dHNXUvUlNLendkQUM0aTUxWWlnaWhBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjEuMC4yIHx8IDIiCisgICAgICB9CisgICAgfSwKKyAgICAid29yZHdyYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd29yZHdyYXAvLS93b3Jkd3JhcC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUoxaElFSWtVVnFRWEhJMENKa1FhM3BETHl1cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cmFwcHkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3JhcHB5Ly0vd3JhcHB5LTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdFNROWp6N0Jxalh4TmtZRnZBMFFOdU1LdHA4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndyaXRlIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyaXRlLy0vd3JpdGUtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1YOEE0S09Ka3pxUCtrVVZVZHZlanhXYkxCMWM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cy8tL3dzLTUuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYUhGRDZQRnY2VWdvSVZkYTZxWmxscHRRc01sREVKa1RRY3lienpYRFlNMVhPOVk4ZW02OTFGR01QbU00NldHeUxVNHo5S01nUU4rcXJ1eC9uaGxIQT09IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jLWxpbWl0ZXIiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInhtbGNyZWF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94bWxjcmVhdGUvLS94bWxjcmVhdGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rbXYzWXFZS1FUK3ozWTlMQThXeWFTT05NSTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAieHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveHRlbmQvLS94dGVuZC00LjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBjYlZNcjVsYmlQYmdnNzdsRG9mQkptTlk2OD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2UuanNvbiBiL3BhY2thZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU1M2VlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS5qc29uCkBAIC0wLDAgKzEsNjYgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgImRlc2NyaXB0aW9uIjogIm5vZGUuanMgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iLAorICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyIsCisgICJyZXBvc2l0b3J5IjogeworICAgICJ0eXBlIjogImdpdCIsCisgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgIH0sCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImF1dGhvciI6IHsKKyAgICAibmFtZSI6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiLAorICAgICJlbWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICJ1cmwiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICB9LAorICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgImxpY2Vuc2VzIjogWworICAgIHsKKyAgICAgICJ0eXBlIjogIkFwYWNoZS0yLjAiLAorICAgICAgInVybCI6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCisgICAgfQorICBdLAorICAiYnVncyI6IHsKKyAgICAibWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAorICAgICJ1cmwiOiAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiCisgIH0sCisgICJmaWxlcyI6IFsKKyAgICAibGliL25vZGVqcy9saWIvdGhyaWZ0IiwKKyAgICAibGliL25vZGVqcy9SRUFETUUubWQiCisgIF0sCisgICJkaXJlY3RvcmllcyI6IHsKKyAgICAibGliIjogIi4vbGliL25vZGVqcy9saWIvdGhyaWZ0IgorICB9LAorICAibWFpbiI6ICIuL2xpYi9ub2RlanMvbGliL3RocmlmdCIsCisgICJlbmdpbmVzIjogeworICAgICJub2RlIjogIj49IDQuMS4wIgorICB9LAorICAiZGVwZW5kZW5jaWVzIjogeworICAgICJub2RlLWludDY0IjogIl4wLjQuMCIsCisgICAgInEiOiAiXjEuNS4wIiwKKyAgICAid3MiOiAiXjUuMC4wIgorICB9LAorICAiZGV2RGVwZW5kZW5jaWVzIjogeworICAgICJidWZmZXItZXF1YWxzIjogIl4xLjAuNCIsCisgICAgImNvbW1hbmRlciI6ICJeMi4xNC4xIiwKKyAgICAiY29ubmVjdCI6ICJeMy42LjYiLAorICAgICJlc2xpbnQiOiAiXjUuNy4wIiwKKyAgICAiZXNsaW50LWNvbmZpZy1wcmV0dGllciI6ICJeMy4xLjAiLAorICAgICJlc2xpbnQtcGx1Z2luLXByZXR0aWVyIjogIl4zLjAuMCIsCisgICAgImlzdGFuYnVsIjogIl4wLjQuNSIsCisgICAgImpzZG9jIjogIl4zLjUuNSIsCisgICAgInByZXR0aWVyIjogIl4xLjE0LjMiLAorICAgICJ0YXBlIjogIl40LjkuMCIsCisgICAgInV0Zi04LXZhbGlkYXRlIjogIl40LjAuMCIsCisgICAgInR5cGVzY3JpcHQiOiAiXjMuMS42IiwKKyAgICAiQHR5cGVzL25vZGUiOiAiXjEwLjEyLjYiLAorICAgICJAdHlwZXMvcSI6ICJeMS41LjEiCisgIH0sCisgICJzY3JpcHRzIjogeworICAgICJjb3ZlciI6ICJsaWIvbm9kZWpzL3Rlc3QvdGVzdEFsbC5zaCBDT1ZFUiIsCisgICAgInRlc3QiOiAibGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2giLAorICAgICJ0ZXN0LXRzIjogImxpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoIiwKKyAgICAicHJldHRpZXIiOiAicHJldHRpZXIgLS13cml0ZSAnKiovKi5qcyciLAorICAgICJsaW50IjogImVzbGludCBsaWIvbm9kZWpzLy4gLS1leHQgLmpzIiwKKyAgICAibGludC10ZXN0cyI6ICJlc2xpbnQgbGliL25vZGVqcy90ZXN0Ly4gLS1leHQgLmpzIgorICB9Cit9CmRpZmYgLS1naXQgYS9waHBjcy54bWwuZGlzdCBiL3BocGNzLnhtbC5kaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDM4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9waHBjcy54bWwuZGlzdApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxydWxlc2V0IG5hbWU9IkFwYWNoZV9UaHJpZnQiPgorICAgIDxkZXNjcmlwdGlvbj5UaGUgY29kaW5nIHN0YW5kYXJkIGZvciB0aHJpZnQuPC9kZXNjcmlwdGlvbj4KKworICAgIDxmaWxlPmxpYi9waHAvbGliPC9maWxlPgorICAgIDxmaWxlPmxpYi9waHAvdGVzdDwvZmlsZT4KKyAgICA8ZXhjbHVkZS1wYXR0ZXJuPmxpYi9waHAvdGVzdC9wYWNrYWdlcy8qPC9leGNsdWRlLXBhdHRlcm4+CisKKyAgICA8YXJnIG5hbWU9ImJhc2VwYXRoIiB2YWx1ZT0iLiIvPgorICAgIDxhcmcgbmFtZT0iY29sb3JzIiAvPgorICAgIDxhcmcgbmFtZT0icGFyYWxsZWwiIHZhbHVlPSI0IiAvPgorCisgICAgPHJ1bGUgcmVmPSJQU1IyIj4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iUFNSMi5NZXRob2RzLk1ldGhvZERlY2xhcmF0aW9uLlVuZGVyc2NvcmUiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iUFNSMi5DbGFzc2VzLlByb3BlcnR5RGVjbGFyYXRpb24uVW5kZXJzY29yZSIvPgorICAgIDwvcnVsZT4KKworICAgIDxydWxlIHJlZj0iUFNSMS5GaWxlcy5TaWRlRWZmZWN0cyI+CisgICAgICAgIDxleGNsdWRlLXBhdHRlcm4+bGliL3BocC90ZXN0Lyo8L2V4Y2x1ZGUtcGF0dGVybj4KKyAgICA8L3J1bGU+CisgICAgPHJ1bGUgcmVmPSJHZW5lcmljLkZpbGVzLkxpbmVMZW5ndGgiPgorICAgICAgICA8ZXhjbHVkZS1wYXR0ZXJuPmxpYi9waHAvdGVzdC8qPC9leGNsdWRlLXBhdHRlcm4+CisgICAgPC9ydWxlPgorCis8L3J1bGVzZXQ+CmRpZmYgLS1naXQgYS9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQgYi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2OTY1YgotLS0gL2Rldi9udWxsCisrKyBiL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZApAQCAtMCwwICsxLDE5IEBACitTb21lIGhlbHBmdWwgdGlwcyBmb3IgYSBzdWNjZXNzZnVsIEFwYWNoZSBUaHJpZnQgUFI6CisKKyogRGlkIHlvdSB0ZXN0IHlvdXIgY2hhbmdlcyBsb2NhbGx5IG9yIHVzaW5nIENJIGluIHlvdXIgZm9yaz8KKyogSXMgdGhlIEFwYWNoZSBKaXJhIFRIUklGVCB0aWNrZXQgaWRlbnRpZmllciBpbiB0aGUgUFIgdGl0bGU/CisqIElzIHRoZSBBcGFjaGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIgaW4gdGhlIGNvbW1pdCBtZXNzYWdlPworKiBEaWQgeW91IHNxdWFzaCB5b3VyIGNoYW5nZXMgdG8gYSBzaW5nbGUgY29tbWl0PworKiBBcmUgdGhlc2UgY2hhbmdlcyBiYWNrd2FyZHMgY29tcGF0aWJsZT8gKHBsZWFzZSBzYXkgc28gaW4gUFIgZGVzY3JpcHRpb24pCisqIERvIHlvdSBuZWVkIHRvIHVwZGF0ZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgUkVBRE1FPworCitFeGFtcGxlIGlkZWFsIHB1bGwgcmVxdWVzdCB0aXRsZToKKworICAgICAgICBUSFJJRlQtOTk5OTogYW4gZXhhbXBsZSBwdWxsIHJlcXVlc3QgdGl0bGUKKworRXhhbXBsZSBpZGVhbCBjb21taXQgbWVzc2FnZToKKworICAgICAgICBUSFJJRlQtOTk5OTogW3N1bW1hcnkgb2YgZml4LCBvbmUgbGluZSBpZiBwb3NzaWJsZV0KKyAgICAgICAgQ2xpZW50OiBbbGFuZ3VhZ2UocykgYWZmZWN0ZWQsIGNvbW1hIHNlcGFyYXRlZCwgdXNlIGxpYi8gZGlyZWN0b3J5IG5hbWVzIHBsZWFzZV0KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29tbWl0dGluZywgc2VlIENPTlRSSUJVVElORy5tZApkaWZmIC0tZ2l0IGEvcmF0X2V4Y2x1ZGUgYi9yYXRfZXhjbHVkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjY2VkNS4uMDAwMDAwMAotLS0gYS9yYXRfZXhjbHVkZQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS5naXRpZ25vcmUKLUNIQU5HRVMKLUNPTlRSSUJVVE9SUwotYXV0b3NjYW4ubG9nCi1jb25maWcuZ3Vlc3MKLWNvbmZpZy5sb2cKLWNvbmZpZy5zdGF0dXMKLWNvbmZpZy5zdWIKLWNvbmZpZ3VyZQotY29uZmlndXJlLnNjYW4KLWRlcGNvbXAKLWluc3RhbGwtc2gKLWxpYnRvb2wKLWx0bWFpbi5zaAotbWlzc2luZwotc3RhbXAtaDEKLXlsd3JhcAotKi5tNAotYXV0b200dGUuY2FjaGUKLXRocmlmdHkuaAotdmVyc2lvbi5oCi12ZXJzaW9uLmguaW4KLW1kNS5jCi1tZDUuaAotZG9jCi1saWIvZXJsL3Zzbi5tawotL2xpYi9lcmwvYnVpbGQvKiovKgotbGliL2VybC9zcmMvTWFrZWZpbGUKLXRocmlmdC5hcHB1cC5zcmMKLU9DYW1sTWFrZWZpbGUKLVJFQURNRS1PQ2FtbE1ha2VmaWxlCi1UT0RPCi1NYW5pZmVzdAotc2V0dXAucmIKZGlmZiAtLWdpdCBhL3NvbmFyLXByb2plY3QucHJvcGVydGllcyBiL3NvbmFyLXByb2plY3QucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDVlY2MyCi0tLSAvZGV2L251bGwKKysrIGIvc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQwIEBACivvu78jIEFwYWNoZSBUaHJpZnQgwqkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAorCisjIEZpbGU6IHNvbmFyLXByb2plY3QucHJvcGVydGllcworIyBBcGFjaGUgVGhyaWZ0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgU29uYXIgaHR0cHM6Ly9hbmFseXNpcy5hcGFjaGUub3JnLworIyBTb25hciBpcyBhbiBvcGVuIHBsYXRmb3JtIHRvIG1hbmFnZSBjb2RlIHF1YWxpdHkgaHR0cDovL3d3dy5zb25hcnNvdXJjZS5vcmcvCisKKworIyByZXF1aXJlZCBtZXRhZGF0YQorc29uYXIucHJvamVjdEtleT1vcmcuYXBhY2hlLnRocmlmdAorc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdAorc29uYXIucHJvamVjdERlc2NyaXB0aW9uPQorVGhlIEFwYWNoZSBUaHJpZnQgc29mdHdhcmUgZnJhbWV3b3JrLCBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKK2RldmVsb3BtZW50LCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkCitzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBhbGwgbWFqb3IgbGFuZ3VhZ2VzLgorCisjIEFwYWNoZSBUaHJpZnQgVmVyc2lvbgorc29uYXIucHJvamVjdFZlcnNpb249MS4wLjAKKyMgdXNlIHRoaXMgdG8gc2V0IGFub3RoZXIgdmVyc2lvbiBzdHJpbmcKKyMgJCBzb25hci1ydW5uZXIgLUQgc29uYXIucHJvamVjdFZlcnNpb249YGdpdCByZXYtcGFyc2UgSEVBRGAKKyMgc2V0IHByb2plY3REYXRlIGluIGNvbWJpbmF0aW9uIHdpdGggcHJvamVjdFZlcnNpb24gZm9yIGltcG9ydHMgb2Ygb2xkIHJlbGVhc2VzCisjc29uYXIucHJvamVjdERhdGU9eXl5eS1NTS1kZAorCisjIFRPRE8gYWRkIHdlYnNpdGUgKHNvbmFyLnByb2plY3RVcmwgZG9lcyBub3Qgd29yaykKKyNzb25hci5YWFhYPWh0dHAvL3RocmlmdC5hcGFjaGUub3JnCisKKyMgU29tZSBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBpbmhlcml0ZWQgYnkgdGhlIG1vZHVsZXMKK3NvbmFyLnNvdXJjZXM9c3JjCitzb25hci5sYW5ndWFnZT1qYXZhLGpzLGMrKyxweSxjCitzb25hci5zb3VyY2VFbmNvZGluZz1VVEYtOAorCisjIHNjbQorc29uYXIuc2NtLnVybD1zY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdAorCisjIGNwcGNoZWNrIC1xIC0tZXJyb3ItZXhpdGNvZGU9MCAtLXhtbCAuIDI+IGNwcGNoZWNrLXJlc3VsdC54bWwKK3NvbmFyLmN4eC5jcHBjaGVjay5yZXBvcnRQYXRoPWNwcGNoZWNrLXJlc3VsdC54bWwKKworIyBMaXN0IG9mIHRoZSBtb2R1bGUgaWRlbnRpZmllcnMKK3NvbmFyLm1vZHVsZXM9bW9kdWxlMSxtb2R1bGUzLG1vZHVsZTQsbW9kdWxlNSxtb2R1bGU2LG1vZHVsZTcsbW9kdWxlOCxtb2R1bGU5LG1vZHVsZTEwLG1vZHVsZTExLG1vZHVsZTEyLG1vZHVsZTE0CisKKworCisjIHdlIG5lZWQgc29uYXItcnVubmVyIDIuMSBmb3IgdGhpcywgc2VlIGh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvU09OQVJQTFVHSU5TLTI0MjEKKyNzb25hci5tb2R1bGVzPW1vZHVsZTIKKworIyBkZWxwaCBwbHVnaW4gaXMgYnJva2VuCisjc29uYXIubW9kdWxlcz1tb2R1bGUxMworCisjIHBocHVuaXQgcGx1Z2luIGlzIGJyb2tlbgorI3NvbmFyLm1vZHVsZXM9bW9kdWxlMTUKKworbW9kdWxlMS5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YSBMaWJyYXJ5Cittb2R1bGUxLnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9qYXZhCittb2R1bGUxLnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxLnNvbmFyLnRlc3RzPXRlc3QKK21vZHVsZTEuc29uYXIuYmluYXJpZXM9YnVpbGQvbGlicy9saWJ0aHJpZnQtMS4wLjAuamFyCittb2R1bGUxLnNvbmFyLmxpYnJhcmllcz1idWlsZC9kZXBzLyouamFyCittb2R1bGUxLnNvbmFyLmxhbmd1YWdlPWphdmEKKworbW9kdWxlMi5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YSBUdXRvcmlhbAorbW9kdWxlMi5zb25hci5wcm9qZWN0QmFzZURpcj0uCittb2R1bGUyLnNvbmFyLnNvdXJjZXM9dHV0b3JpYWwvamF2YS9zcmMsIHR1dG9yaWFsL2phdmEvZ2VuLWphdmEKK21vZHVsZTIuc29uYXIuYmluYXJpZXM9dHV0b3JpYWwvamF2YS90dXRvcmlhbC5qYXIKK21vZHVsZTIuc29uYXIubGlicmFyaWVzPWxpYi9qYXZhL2J1aWxkL2RlcHMvKi5qYXIsbGliL2phdmEvYnVpbGQvbGlicy9saWJ0aHJpZnQtMS4wLjAuamFyCittb2R1bGUyLnNvbmFyLmxhbmd1YWdlPWphdmEKKworbW9kdWxlMy5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YVNjcmlwdCBMaWJyYXJ5Cittb2R1bGUzLnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9qcworbW9kdWxlMy5zb25hci5zb3VyY2VzPS4KK21vZHVsZTMuc29uYXIuZXhjbHVzaW9ucz10ZXN0LyoqLyoKK21vZHVsZTMuc29uYXIubGFuZ3VhZ2U9anMKKworbW9kdWxlNC5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YVNjcmlwdCBUdXRvcmlhbAorbW9kdWxlNC5zb25hci5wcm9qZWN0QmFzZURpcj10dXRvcmlhbC9qcworbW9kdWxlNC5zb25hci5zb3VyY2VzPS4KK21vZHVsZTQuc29uYXIubGFuZ3VhZ2U9d2ViCisKK21vZHVsZTUuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEMrKyBMaWJyYXJ5Cittb2R1bGU1LnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9jcHAKK21vZHVsZTUuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTUuc29uYXIudGVzdHM9dGVzdAorbW9kdWxlNS5zb25hci5sYW5ndWFnZT1jKysKKworbW9kdWxlNi5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gQysrIFR1dG9yaWFsCittb2R1bGU2LnNvbmFyLnByb2plY3RCYXNlRGlyPXR1dG9yaWFsL2NwcAorbW9kdWxlNi5zb25hci5zb3VyY2VzPS4KK21vZHVsZTYuc29uYXIuZXhjbHVzaW9ucz1nZW4tY3BwLyoqLyoKK21vZHVsZTYuc29uYXIubGFuZ3VhZ2U9YysrCisKK21vZHVsZTcuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEMrKyBDcm9zcyBMYW5ndWFnZSBUZXN0Cittb2R1bGU3LnNvbmFyLnByb2plY3RCYXNlRGlyPXRlc3QvY3BwCittb2R1bGU3LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGU3LnNvbmFyLmxhbmd1YWdlPWMrKworCittb2R1bGU4LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBDb21waWxlcgorbW9kdWxlOC5zb25hci5wcm9qZWN0QmFzZURpcj1jb21waWxlci9jcHAKK21vZHVsZTguc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTguc29uYXIubGFuZ3VhZ2U9YysrCisKK21vZHVsZTkuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIFB5dGhvbiBMaWJyYXJ5Cittb2R1bGU5LnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9weQorbW9kdWxlOS5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlOS5zb25hci5sYW5ndWFnZT1weQorCittb2R1bGUxMC5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gUHl0aG9uIFR1dG9yaWFsCittb2R1bGUxMC5zb25hci5wcm9qZWN0QmFzZURpcj10dXRvcmlhbC9weQorbW9kdWxlMTAuc29uYXIuc291cmNlcz0uCittb2R1bGUxMC5zb25hci5leGNsdXNpb25zPWdlbi1weS8qKi8qCittb2R1bGUxMC5zb25hci5sYW5ndWFnZT1weQorCittb2R1bGUxMS5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gUHl0aG9uIENyb3NzIExhbmd1YWdlIFRlc3QKK21vZHVsZTExLnNvbmFyLnByb2plY3RCYXNlRGlyPXRlc3QvcHkKK21vZHVsZTExLnNvbmFyLnNvdXJjZXM9LgorbW9kdWxlMTEuc29uYXIuZXhjbHVzaW9ucz1nZW4tKi8qKi8qCittb2R1bGUxMS5zb25hci5sYW5ndWFnZT1weQorCittb2R1bGUxMi5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gY19nbGliIExpYnJhcnkKK21vZHVsZTEyLnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9jX2dsaWIKK21vZHVsZTEyLnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxMi5zb25hci5sYW5ndWFnZT1jCisKK21vZHVsZTEzLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBEZWxwaGkgTGlicmFyeQorbW9kdWxlMTMuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL2RlbHBoaQorbW9kdWxlMTMuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTEzLnNvbmFyLnRlc3RzPXRlc3QKK21vZHVsZTEzLnNvbmFyLmxhbmd1YWdlPWRlbHBoCisKK21vZHVsZTE0LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBGbGV4IChhczMpIExpYnJhcnkKK21vZHVsZTE0LnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9hczMKK21vZHVsZTE0LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxNC5zb25hci5sYW5ndWFnZT1mbGV4CisKK21vZHVsZTE1LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBQSFAgTGlicmFyeQorbW9kdWxlMTUuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL3BocAorbW9kdWxlMTUuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTE1LnNvbmFyLmxhbmd1YWdlPXBocAorCisjIFRPRE8gYWRkIHNvbWUgbW9yZSBsYW5ndWFnZXMgaGVyZQorCmRpZmYgLS1naXQgYS90ZXN0L0FsbFByb3RvY29sVGVzdHMuY3BwIGIvdGVzdC9BbGxQcm90b2NvbFRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyOWNjYy4uMDAwMDAwMAotLS0gYS90ZXN0L0FsbFByb3RvY29sVGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlICJBbGxQcm90b2NvbFRlc3RzLnRjYyIKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotCi1jaGFyIGVycm9yTWVzc2FnZVtFUlJfTEVOXTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIHRyeSB7Ci0gICAgdGVzdFByb3RvY29sPFRCaW5hcnlQcm90b2NvbD4oIlRCaW5hcnlQcm90b2NvbCIpOwotICAgIHRlc3RQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sPigiVENvbXBhY3RQcm90b2NvbCIpOwotICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICBwcmludGYoIiVzXG4iLCBlLndoYXQoKSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjIGIvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhMzExNS4uMDAwMDAwMAotLS0gYS90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RFU1RfR0VORVJJQ1BST1RPQ09MVEVTVF9UQ0NfCi0jZGVmaW5lIF9USFJJRlRfVEVTVF9HRU5FUklDUFJPVE9DT0xURVNUX1RDQ18gMQotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8VGhyaWZ0Lmg+Ci0KLSNpbmNsdWRlICJHZW5lcmljSGVscGVycy5oIgotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLQotI2RlZmluZSBFUlJfTEVOIDUxMgotZXh0ZXJuIGNoYXIgZXJyb3JNZXNzYWdlW0VSUl9MRU5dOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVFByb3RvLCB0eXBlbmFtZSBWYWw+Ci12b2lkIHRlc3ROYWtlZChWYWwgdmFsKSB7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRQcm90byh0cmFuc3BvcnQpKTsKLQotICBHZW5lcmljSU86OndyaXRlKHByb3RvY29sLCB2YWwpOwotICBWYWwgb3V0OwotICBHZW5lcmljSU86OnJlYWQocHJvdG9jb2wsIG91dCk7Ci0gIGlmIChvdXQgIT0gdmFsKSB7Ci0gICAgc25wcmludGYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiSW52YWxpZCBuYWtlZCB0ZXN0ICh0eXBlOiAlcykiLCBDbGFzc05hbWVzOjpnZXROYW1lPFZhbD4oKSk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwotICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUUHJvdG8sIFRUeXBlIHR5cGUsIHR5cGVuYW1lIFZhbD4KLXZvaWQgdGVzdEZpZWxkKGNvbnN0IFZhbCB2YWwpIHsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVFByb3RvKHRyYW5zcG9ydCkpOwotCi0gIHByb3RvY29sLT53cml0ZVN0cnVjdEJlZ2luKCJ0ZXN0X3N0cnVjdCIpOwotICBwcm90b2NvbC0+d3JpdGVGaWVsZEJlZ2luKCJ0ZXN0X2ZpZWxkIiwgdHlwZSwgKGludDE2X3QpMTUpOwotCi0gIEdlbmVyaWNJTzo6d3JpdGUocHJvdG9jb2wsIHZhbCk7Ci0KLSAgcHJvdG9jb2wtPndyaXRlRmllbGRFbmQoKTsKLSAgcHJvdG9jb2wtPndyaXRlU3RydWN0RW5kKCk7Ci0KLSAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgVFR5cGUgZmllbGRUeXBlOwotICBpbnQxNl90IGZpZWxkSWQ7Ci0KLSAgcHJvdG9jb2wtPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKLSAgcHJvdG9jb2wtPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7Ci0KLSAgaWYgKGZpZWxkSWQgIT0gMTUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIElEICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOwotICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKLSAgfQotICBpZiAoZmllbGRUeXBlICE9IHR5cGUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIEZpZWxkIFR5cGUgKHR5cGU6ICVzKSIsIHR5cGVpZCh2YWwpLm5hbWUoKSk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwotICB9Ci0KLSAgVmFsIG91dDsKLSAgR2VuZXJpY0lPOjpyZWFkKHByb3RvY29sLCBvdXQpOwotCi0gIGlmIChvdXQgIT0gdmFsKSB7Ci0gICAgc25wcmludGYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiSW52YWxpZCB2YWx1ZSByZWFkICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOwotICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKLSAgfQotCi0gIHByb3RvY29sLT5yZWFkRmllbGRFbmQoKTsKLSAgcHJvdG9jb2wtPnJlYWRTdHJ1Y3RFbmQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRQcm90bz4KLXZvaWQgdGVzdE1lc3NhZ2UoKSB7Ci0gIHN0cnVjdCBUTWVzc2FnZSB7Ci0gICAgY29uc3QgY2hhciogbmFtZTsKLSAgICBUTWVzc2FnZVR5cGUgdHlwZTsKLSAgICBpbnQzMl90IHNlcWlkOwotICB9IG1lc3NhZ2VzWzRdID0gewotICAgIHsic2hvcnQgbWVzc2FnZSBuYW1lIiwgVF9DQUxMLCAwfSwKLSAgICB7IjEiLCBUX1JFUExZLCAxMjM0NX0sCi0gICAgeyJsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIiwgVF9FWENFUFRJT04sIDEgPDwgMTZ9LAotICAgIHsiSmFua3kiLCBUX0NBTEwsIDB9Ci0gIH07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRQcm90byh0cmFuc3BvcnQpKTsKLQotICAgIHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlc1tpXS5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpXS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpXS5zZXFpZCk7Ci0gICAgcHJvdG9jb2wtPndyaXRlTWVzc2FnZUVuZCgpOwotCi0gICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICBUTWVzc2FnZVR5cGUgdHlwZTsKLSAgICBpbnQzMl90IHNlcWlkOwotCi0gICAgcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpOwotICAgIGlmIChuYW1lICE9IG1lc3NhZ2VzW2ldLm5hbWUgfHwKLSAgICAgICAgdHlwZSAhPSBtZXNzYWdlc1tpXS50eXBlIHx8Ci0gICAgICAgIHNlcWlkICE9IG1lc3NhZ2VzW2ldLnNlcWlkKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJyZWFkTWVzc2FnZUJlZ2luIGZhaWxlZC4iKTsKLSAgICB9Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRQcm90bz4KLXZvaWQgdGVzdFByb3RvY29sKGNvbnN0IGNoYXIqIHByb3RvbmFtZSkgewotICB0cnkgewotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDhfdD4oKGludDhfdCkxMjMpOwotCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKLSAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfQllURSwgaW50OF90PigoaW50OF90KWkpOwotICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9CWVRFLCBpbnQ4X3Q+KChpbnQ4X3QpLWkpOwotICAgIH0KLQotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KTApOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KTEpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KTE1MDAwKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCkweDdmZmYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0xKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCktMTUwMDApOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0weDdmZmYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKSk7Ci0KLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMCk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTEpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCk3KTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMTUwKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMTUwMDApOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCkweDdmZmYpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTE2LCBpbnQxNl90PigoaW50MTZfdCktMSk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KS03KTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpLTE1MCk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KS0xNTAwMCk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KS0weDdmZmYpOwotCi0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oMCk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oMSk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oMTUwMDApOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KDB4ZmZmZik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTEpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KC0xNTAwMCk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTB4ZmZmZik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCkpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpKTsKLQotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigwKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMSk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDcpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigxNTApOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigxNTAwMCk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KDMxMzM3KTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMHhmZmZmKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMHhmZmZmZmYpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMSk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KC03KTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTE1MCk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KC0xNTAwMCk7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMzIsIGludDMyX3Q+KC0weGZmZmYpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMHhmZmZmZmYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKSk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCkgKyAxMCk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkgLSAxNik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKCkpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpKTsKLQotCi0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMCk7Ci0gICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgNjI7IGkrKykgewotICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigtKDFMIDw8IGkpKTsKLSAgICB9Ci0KLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2MjsgaSsrKSB7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oLSgxTCA8PCBpKSk7Ci0gICAgfQotCi0gICAgdGVzdE5ha2VkPFRQcm90bywgZG91YmxlPigxMjMuNDU2KTsKLQotICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiIik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJzaG9ydCIpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiYm9yZGVybGluZXRpbnkiKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oImEgYml0IGxvbmdlciB0aGFuIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSIpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiXHgxXHgyXHgzXHg0XHg1XHg2XHg3XHg4XHg5XHhBIik7IC8va2luZGEgYmluYXJ5IHRlc3QKLQotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfU1RSSU5HLCBzdGQ6OnN0cmluZz4oIiIpOwotICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfU1RSSU5HLCBzdGQ6OnN0cmluZz4oInNob3J0Iik7Ci0gICAgdGVzdEZpZWxkPFRQcm90bywgVF9TVFJJTkcsIHN0ZDo6c3RyaW5nPigiYm9yZGVybGluZXRpbnkiKTsKLSAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCJhIGJpdCBsb25nZXIgdGhhbiB0aGUgc21hbGxlc3QgcG9zc2libGUiKTsKLQotICAgIHRlc3RNZXNzYWdlPFRQcm90bz4oKTsKLQotICAgIHByaW50ZigiJXMgPT4gT0tcbiIsIHByb3RvbmFtZSk7Ci0gIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgIHNucHJpbnRmKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIiVzID0+IFRlc3QgRkFJTEVEOiAlcyIsIHByb3RvbmFtZSwgZS53aGF0KCkpOwotICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKLSAgfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0IGIvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKaW5kZXggMWEzNDMyMC4uN2UyNGUxYyAxMDA2NDQKLS0tIGEvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKKysrIGIvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQKQEAgLTI4LDcgKzI4LDQ1IEBACiAgIGNwcC50eXBlID0gIkRlbnNlRm9vIiwKICAgcHl0aG9uLnR5cGUgPSAiRGVuc2VGb28iLAogICBqYXZhLmZpbmFsID0gIiIsCisgIGFubm90YXRpb24ud2l0aG91dC52YWx1ZSwKICkKIAotdHlwZWRlZiBzdHJpbmcgKCB1bmljb2RlLmVuY29kaW5nID0gIlVURi0xNiIgKSBub25fbGF0aW5fc3RyaW5nCitleGNlcHRpb24gZm9vX2Vycm9yIHsKKyAgMTogaTMyIGVycm9yX2NvZGUgKCBmb289ImJhciIgKQorICAyOiBzdHJpbmcgZXJyb3JfbXNnCit9IChmb28gPSAiYmFyIikKKwordHlwZWRlZiBzdHJpbmcgKCB1bmljb2RlLmVuY29kaW5nID0gIlVURi0xNiIgKSBub25fbGF0aW5fc3RyaW5nIChmb289ImJhciIpCiB0eXBlZGVmIGxpc3Q8IGRvdWJsZSAoIGNwcC5maXhlZF9wb2ludCA9ICIxNiIgKSA+IHRpbnlfZmxvYXRfbGlzdAorCitlbnVtIHdlZWtkYXlzIHsKKyAgU1VOREFZICggd2Vla2VuZCA9ICJ5ZXMiICksCisgIE1PTkRBWSwKKyAgVFVFU0RBWSwKKyAgV0VETkVTREFZLAorICBUSFVSU0RBWSwKKyAgRlJJREFZLAorICBTQVRVUkRBWSAoIHdlZWtlbmQgPSAieWVzIiApCit9IChmb28uYmFyPSJiYXoiKQorCisvKiBOb3RlIHRoYXQgYW5ub3RhdGlvbnMgb24gc2VudW0gdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkLiAqLworc2VudW0gc2Vhc29ucyB7CisgICJTcHJpbmciLAorICAiU3VtbWVyIiwKKyAgIkZhbGwiLAorICAiV2ludGVyIgorfSAoIGZvbyA9ICJiYXIiICkKKworc3RydWN0IG9zdHJfZGVmYXVsdCB7CisgIDE6IGkzMiBiYXI7Cit9CisKK3N0cnVjdCBvc3RyX2N1c3RvbSB7CisgIDE6IGkzMiBiYXI7Cit9IChjcHAuY3VzdG9tb3N0cmVhbSkKKworCitzZXJ2aWNlIGZvb19zZXJ2aWNlIHsKKyAgdm9pZCBmb28oKSAoIGZvbyA9ICJiYXIiICkKK30gKGEuYj0iYyIpCisKZGlmZiAtLWdpdCBhL3Rlc3QvQmVuY2htYXJrLmNwcCBiL3Rlc3QvQmVuY2htYXJrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxNWZjYS4uMDAwMDAwMAotLS0gYS90ZXN0L0JlbmNobWFyay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgotI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSAiLi4vbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaCIKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi1jbGFzcyBUaW1lciB7Ci1wdWJsaWM6Ci0gIHRpbWV2YWwgdlN0YXJ0OwotCi0gIFRpbWVyKCkgewotICAgIGdldHRpbWVvZmRheSgmdlN0YXJ0LCAwKTsKLSAgfQotICB2b2lkIHN0YXJ0KCkgewotICAgIGdldHRpbWVvZmRheSgmdlN0YXJ0LCAwKTsKLSAgfQotCi0gIGRvdWJsZSBmcmFtZSgpIHsKLSAgICB0aW1ldmFsIHZFbmQ7Ci0gICAgZ2V0dGltZW9mZGF5KCZ2RW5kLCAwKTsKLSAgICBkb3VibGUgZHN0YXJ0ID0gdlN0YXJ0LnR2X3NlYyArICgoZG91YmxlKXZTdGFydC50dl91c2VjIC8gMTAwMDAwMC4wKTsKLSAgICBkb3VibGUgZGVuZCA9IHZFbmQudHZfc2VjICsgKChkb3VibGUpdkVuZC50dl91c2VjIC8gMTAwMDAwMC4wKTsKLSAgICByZXR1cm4gZGVuZCAtIGRzdGFydDsKLSAgfQotCi19OwotCi1pbnQgbWFpbigpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSAgdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDo6ZGVidWc7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7Ci0KLSAgT25lT2ZFYWNoIG9vZTsKLSAgb29lLmltX3RydWUgICA9IHRydWU7Ci0gIG9vZS5pbV9mYWxzZSAgPSBmYWxzZTsKLSAgb29lLmFfYml0ZSAgICA9IDB4ZDY7Ci0gIG9vZS5pbnRlZ2VyMTYgPSAyNzAwMDsKLSAgb29lLmludGVnZXIzMiA9IDE8PDI0OwotICBvb2UuaW50ZWdlcjY0ID0gKHVpbnQ2NF90KTYwMDAgKiAxMDAwICogMTAwMDsKLSAgb29lLmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOwotICBvb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICJKU09OIFRISVMhIFwiXDEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLSAgb29lLmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKLQotICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLQotICBpbnQgbnVtID0gMTAwMDAwMDsKLQotICB7Ci0gICAgVGltZXIgdGltZXI7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSArKykgewotICAgICAgYnVmLT5yZXNldEJ1ZmZlcigpOwotICAgICAgVEJpbmFyeVByb3RvY29sIHByb3QoYnVmKTsKLSAgICAgIG9vZS53cml0ZSgmcHJvdCk7Ci0gICAgfQotICAgIGNvdXQgPDwgIldyaXRlOiAiIDw8IG51bSAvICgxMDAwICogdGltZXIuZnJhbWUoKSkgPDwgIiBrSHoiIDw8IGVuZGw7Ci0gIH0KLQotICB1aW50OF90KiBkYXRhOwotICB1aW50MzJfdCBkYXRhc2l6ZTsKLQotICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKLQotICB7Ci0KLSAgICBUaW1lciB0aW1lcjsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpICsrKSB7Ci0gICAgICBPbmVPZkVhY2ggb29lMjsKLSAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwotICAgICAgLy9idWYyLT5yZXNldEJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSk7Ci0gICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdChidWYyKTsKLSAgICAgIG9vZTIucmVhZCgmcHJvdCk7Ci0KLSAgICAgIC8vY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcob29lMikgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgICBjb3V0IDw8ICIgUmVhZDogIiA8PCBudW0gLyAoMTAwMCAqIHRpbWVyLmZyYW1lKCkpIDw8ICIga0h6IiA8PCBlbmRsOwotICB9Ci0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQgYi90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CmluZGV4IGJmNDE0ZWMuLmE1NDUzNGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKysrIGIvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdApAQCAtMTgsNiArMTgsNyBAQAogICovCiAKIG5hbWVzcGFjZSBjcHAgeW96b25lCituYW1lc3BhY2UgZXJsIGNvbnN0c18KIAogc3RydWN0IHRoaW5nIHsKICAgMTogaTMyIGhlbGxvLApAQCAtMjksMjMgKzMwLDI3IEBACiAgIFRXTyA9IDIKIH0KIAotc3RydWN0IHRoaW5nMiB7Ci0gIC8qKiBzdGFuZGFyZCBkb2NzdHJpbmcgKi8KLSAgMTogZW51bWNvbnN0YW50cyB2YWwgPSBUV08KLX0KKy8vIHN0cnVjdCB0aGluZzIgeworLy8gICAvKiogc3RhbmRhcmQgZG9jc3RyaW5nICovCisvLyAgIDE6IGVudW1jb25zdGFudHMgdmFsID0gVFdPCisvLyB9CiAKIHR5cGVkZWYgaTMyIG15SW50VHlwZQogY29uc3QgbXlJbnRUeXBlIG15SW50ID0gMwogCi1jb25zdCBtYXA8ZW51bWNvbnN0YW50cyxzdHJpbmc+IEdFTl9FTlVNX05BTUVTID0ge09ORSA6ICJIT1dEWSIsIFRXTzogUEFSVE5FUn0KKy8vY29uc3QgbWFwPGVudW1jb25zdGFudHMsc3RyaW5nPiBHRU5fRU5VTV9OQU1FUyA9IHtPTkUgOiAiSE9XRFkiLCBUV086ICJQQVJUTkVSIn0KIAogY29uc3QgaTMyIGhleF9jb25zdCA9IDB4MDAwMUYKK2NvbnN0IGkzMiBuZWdhdGl2ZV9oZXhfY29uc3RhbnQgPSAtMHgwMDAxRgogCiBjb25zdCBpMzIgR0VOX01FID0gLTM1MjM1NTMKIGNvbnN0IGRvdWJsZSBHRW5fRFVCID0gMzI1LjUzMgogY29uc3QgZG91YmxlIEdFbl9EVSA9IDA4NS4yMzU1CiBjb25zdCBzdHJpbmcgR0VOX1NUUklORyA9ICJhc2xka2phc2ZkIgogCitjb25zdCBkb3VibGUgZTEwID0gMWUxMCAgIC8vIGZhaWxzIHdpdGggMC45LjMgYW5kIGVhcmxpZXIKK2NvbnN0IGRvdWJsZSBlMTEgPSAtMWUxMCAgCisKIGNvbnN0IG1hcDxpMzIsaTMyPiBHRU5fTUFQID0geyAzNTUzMiA6IDIzMywgNDM1MjMgOiA4NTMgfQogY29uc3QgbGlzdDxpMzI+IEdFTl9MSVNUID0gWyAyMzUyMzUsIDIzNTk4MzUyLCAzMjUzNTIzIF0KIApkaWZmIC0tZ2l0IGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAgYi90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyMWQ4Zi4uMDAwMDAwMAotLS0gYS90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCi0jaW5jbHVkZSAiLi4vbGliL2NwcC9zcmMvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaCIKLQotaW50IG1haW4oKSB7Ci0gIHVzaW5nIHN0ZDo6Y291dDsKLSAgdXNpbmcgc3RkOjplbmRsOwotICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKLQotCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweGQ2OwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiRGVidWcgVEhJUyEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLQotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhvb2UpIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIE5lc3RpbmcgbjsKLSAgbi5teV9vb2UgPSBvb2U7Ci0gIG4ubXlfb29lLmludGVnZXIxNiA9IDE2OwotICBuLm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKLSAgbi5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7Ci0gIG4ubXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkrMSkvMjsKLSAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLSAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0gIG4ubXlfYm9uay50eXBlICAgID0gMzEzMzc7Ci0gIG4ubXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOwotCi0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG4pIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIEhvbHlNb2xleSBobTsKLQotICBobS5iaWcucHVzaF9iYWNrKG9vZSk7Ci0gIGhtLmJpZy5wdXNoX2JhY2sobi5teV9vb2UpOwotICBobS5iaWdbMF0uYV9iaXRlID0gMHgyMjsKLSAgaG0uYmlnWzFdLmFfYml0ZSA9IDB4MzM7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0YWdlMTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgb25lIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIHR3byIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotICBzdGFnZTEuY2xlYXIoKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygidGhlbiBhIG9uZSwgdHdvIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soInRocmVlISIpOwotICBzdGFnZTEucHVzaF9iYWNrKCJGT1VSISEiKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLSAgc3RhZ2UxLmNsZWFyKCk7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0KLSAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOwotICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKLSAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIuY2xlYXIoKTsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAzOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAicXVvdGgiOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwotICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7Ci0KLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcoaG0pIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgYi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAppbmRleCBkYmNlOTNlLi5iNmE3NjU5IDEwMDY0NAotLS0gYS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorKysgYi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdApAQCAtMTcsOCArMTcsMTAgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK25hbWVzcGFjZSBjX2dsaWIgVFRlc3QKIG5hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QuZGVidWcKIG5hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CituYW1lc3BhY2UgcmIgdGhyaWZ0LnRlc3QKIAogc3RydWN0IERvdWJsZXMgewogIDE6IGRvdWJsZSBuYW4sCkBAIC0yNiw3ICsyOCw3IEBACiAgMzogZG91YmxlIG5lZ2luZiwKICA0OiBkb3VibGUgcmVwZWF0aW5nLAogIDU6IGRvdWJsZSBiaWcsCi0gNjogZG91YmxlIHNtYWxsLAorIDY6IGRvdWJsZSB0aW55LAogIDc6IGRvdWJsZSB6ZXJvLAogIDg6IGRvdWJsZSBuZWd6ZXJvLAogfQpAQCAtMzQsOCArMzYsOCBAQAogc3RydWN0IE9uZU9mRWFjaCB7CiAgIDE6IGJvb2wgaW1fdHJ1ZSwKICAgMjogYm9vbCBpbV9mYWxzZSwKLSAgMzogYnl0ZSBhX2JpdGUgPSAyMDAsCi0gIDQ6IGkxNiBpbnRlZ2VyMTYgPSAzMzAwMCwKKyAgMzogaTggYV9iaXRlID0gMHg3ZiwKKyAgNDogaTE2IGludGVnZXIxNiA9IDB4N2ZmZiwKICAgNTogaTMyIGludGVnZXIzMiwKICAgNjogaTY0IGludGVnZXI2NCA9IDEwMDAwMDAwMDAwLAogICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKQEAgLTQzLDcgKzQ1LDcgQEAKICAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKICAgMTA6IGJvb2wgd2hhdF93aG8sCiAgIDExOiBiaW5hcnkgYmFzZTY0LAotICAxMjogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCisgIDEyOiBsaXN0PGk4PiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCiAgIDEzOiBsaXN0PGkxNj4gaTE2X2xpc3QgPSBbMSwyLDNdLAogICAxNDogbGlzdDxpNjQ+IGk2NF9saXN0ID0gWzEsMiwzXQogfQpAQCAtNjAsNyArNjIsNyBAQAogCiBzdHJ1Y3QgSG9seU1vbGV5IHsKICAgMTogbGlzdDxPbmVPZkVhY2g+IGJpZywKLSAgMjogc2V0PGxpc3Q8c3RyaW5nPj4gY29udGFpbiwKKyAgMjogc2V0PGxpc3Q8c3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gY29udGFpbiwKICAgMzogbWFwPHN0cmluZyxsaXN0PEJvbms+PiBib25rcywKIH0KIApAQCAtNzAsMTEgKzcyLDE1IEBACiB9CiAKIHN0cnVjdCBFbXB0eSB7Ci19Cit9ICgKKyAgcHl0aG9uLmltbXV0YWJsZSA9ICIiLAorKQogCiBzdHJ1Y3QgV3JhcHBlciB7CiAgIDE6IEVtcHR5IGZvbwotfQorfSAoCisgIHB5dGhvbi5pbW11dGFibGUgPSAiIiwKKykKIAogc3RydWN0IFJhbmRvbVN0dWZmIHsKICAgMTogaTMyIGEsCkBAIC05OSw3ICsxMDUsNyBAQAogCiBzdHJ1Y3QgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCB7CiAgIC8vIHByaW1pdGl2ZSBmaWVsZHMKLSAgMTogYnl0ZSAgIGFfYnl0ZTsKKyAgMTogaTggICAgIGFfYnl0ZTsKICAgMjogaTE2ICAgIGFfaTE2OwogICAzOiBpMzIgICAgYV9pMzI7CiAgIDQ6IGk2NCAgICBhX2k2NDsKQEAgLTEwOSw5ICsxMTUsOSBAQAogICA4OiBib29sICAgdHJ1ZV9maWVsZDsKICAgOTogYm9vbCAgIGZhbHNlX2ZpZWxkOwogICAxMDogRW1wdHkgZW1wdHlfc3RydWN0X2ZpZWxkOwotICAKKwogICAvLyBwcmltaXRpdmVzIGluIGxpc3RzCi0gIDExOiBsaXN0PGJ5dGU+ICAgIGJ5dGVfbGlzdDsKKyAgMTE6IGxpc3Q8aTg+ICAgICAgYnl0ZV9saXN0OwogICAxMjogbGlzdDxpMTY+ICAgICBpMTZfbGlzdDsKICAgMTM6IGxpc3Q8aTMyPiAgICAgaTMyX2xpc3Q7CiAgIDE0OiBsaXN0PGk2ND4gICAgIGk2NF9saXN0OwpAQCAtMTIwLDkgKzEyNiw5IEBACiAgIDE3OiBsaXN0PGJpbmFyeT4gIGJpbmFyeV9saXN0OwogICAxODogbGlzdDxib29sPiAgICBib29sZWFuX2xpc3Q7CiAgIDE5OiBsaXN0PEVtcHR5PiAgIHN0cnVjdF9saXN0OwotICAKKwogICAvLyBwcmltaXRpdmVzIGluIHNldHMKLSAgMjA6IHNldDxieXRlPiAgICAgYnl0ZV9zZXQ7CisgIDIwOiBzZXQ8aTg+ICAgICAgIGJ5dGVfc2V0OwogICAyMTogc2V0PGkxNj4gICAgICBpMTZfc2V0OwogICAyMjogc2V0PGkzMj4gICAgICBpMzJfc2V0OwogICAyMzogc2V0PGk2ND4gICAgICBpNjRfc2V0OwpAQCAtMTMxLDM1ICsxMzcsMzkgQEAKICAgMjY6IHNldDxiaW5hcnk+ICAgYmluYXJ5X3NldDsKICAgMjc6IHNldDxib29sPiAgICAgYm9vbGVhbl9zZXQ7CiAgIDI4OiBzZXQ8RW1wdHk+ICAgIHN0cnVjdF9zZXQ7Ci0gIAorCiAgIC8vIG1hcHMKICAgLy8gcHJpbWl0aXZlcyBhcyBrZXlzCi0gIDI5OiBtYXA8Ynl0ZSwgYnl0ZT4gICAgICAgICAgICAgYnl0ZV9ieXRlX21hcDsKLSAgMzA6IG1hcDxpMTYsIGJ5dGU+ICAgICAgICAgICAgICBpMTZfYnl0ZV9tYXA7Ci0gIDMxOiBtYXA8aTMyLCBieXRlPiAgICAgICAgICAgICAgaTMyX2J5dGVfbWFwOwotICAzMjogbWFwPGk2NCwgYnl0ZT4gICAgICAgICAgICAgIGk2NF9ieXRlX21hcDsKLSAgMzM6IG1hcDxkb3VibGUsIGJ5dGU+ICAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA7Ci0gIDM0OiBtYXA8c3RyaW5nLCBieXRlPiAgICAgICAgICAgc3RyaW5nX2J5dGVfbWFwOwotICAzNTogbWFwPGJpbmFyeSwgYnl0ZT4gICAgICAgICAgIGJpbmFyeV9ieXRlX21hcDsKLSAgMzY6IG1hcDxib29sLCBieXRlPiAgICAgICAgICAgICBib29sZWFuX2J5dGVfbWFwOworICAyOTogbWFwPGk4LCBpOD4gICAgICAgICAgICAgICBieXRlX2J5dGVfbWFwOworICAzMDogbWFwPGkxNiwgaTg+ICAgICAgICAgICAgICBpMTZfYnl0ZV9tYXA7CisgIDMxOiBtYXA8aTMyLCBpOD4gICAgICAgICAgICAgIGkzMl9ieXRlX21hcDsKKyAgMzI6IG1hcDxpNjQsIGk4PiAgICAgICAgICAgICAgaTY0X2J5dGVfbWFwOworICAzMzogbWFwPGRvdWJsZSwgaTg+ICAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA7CisgIDM0OiBtYXA8c3RyaW5nLCBpOD4gICAgICAgICAgIHN0cmluZ19ieXRlX21hcDsKKyAgMzU6IG1hcDxiaW5hcnksIGk4PiAgICAgICAgICAgYmluYXJ5X2J5dGVfbWFwOworICAzNjogbWFwPGJvb2wsIGk4PiAgICAgICAgICAgICBib29sZWFuX2J5dGVfbWFwOwogICAvLyBwcmltaXRpdmVzIGFzIHZhbHVlcwotICAzNzogbWFwPGJ5dGUsIGkxNj4gICAgICAgICAgICAgIGJ5dGVfaTE2X21hcDsKLSAgMzg6IG1hcDxieXRlLCBpMzI+ICAgICAgICAgICAgICBieXRlX2kzMl9tYXA7Ci0gIDM5OiBtYXA8Ynl0ZSwgaTY0PiAgICAgICAgICAgICAgYnl0ZV9pNjRfbWFwOwotICA0MDogbWFwPGJ5dGUsIGRvdWJsZT4gICAgICAgICAgIGJ5dGVfZG91YmxlX21hcDsKLSAgNDE6IG1hcDxieXRlLCBzdHJpbmc+ICAgICAgICAgICBieXRlX3N0cmluZ19tYXA7Ci0gIDQyOiBtYXA8Ynl0ZSwgYmluYXJ5PiAgICAgICAgICAgYnl0ZV9iaW5hcnlfbWFwOwotICA0MzogbWFwPGJ5dGUsIGJvb2w+ICAgICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA7CisgIDM3OiBtYXA8aTgsIGkxNj4gICAgICAgICAgICAgIGJ5dGVfaTE2X21hcDsKKyAgMzg6IG1hcDxpOCwgaTMyPiAgICAgICAgICAgICAgYnl0ZV9pMzJfbWFwOworICAzOTogbWFwPGk4LCBpNjQ+ICAgICAgICAgICAgICBieXRlX2k2NF9tYXA7CisgIDQwOiBtYXA8aTgsIGRvdWJsZT4gICAgICAgICAgIGJ5dGVfZG91YmxlX21hcDsKKyAgNDE6IG1hcDxpOCwgc3RyaW5nPiAgICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwOworICA0MjogbWFwPGk4LCBiaW5hcnk+ICAgICAgICAgICBieXRlX2JpbmFyeV9tYXA7CisgIDQzOiBtYXA8aTgsIGJvb2w+ICAgICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA7CiAgIC8vIGNvbGxlY3Rpb25zIGFzIGtleXMKLSAgNDQ6IG1hcDxsaXN0PGJ5dGU+LCBieXRlPiAgICAgICBsaXN0X2J5dGVfbWFwOwotICA0NTogbWFwPHNldDxieXRlPiwgYnl0ZT4gICAgICAgIHNldF9ieXRlX21hcDsKLSAgNDY6IG1hcDxtYXA8Ynl0ZSxieXRlPiwgYnl0ZT4gICBtYXBfYnl0ZV9tYXA7CisgIDQ0OiBtYXA8bGlzdDxpOD4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIGk4PiAgICAgICBsaXN0X2J5dGVfbWFwOworICA0NTogbWFwPHNldDxpOD4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIGk4PiAgICAgICAgc2V0X2J5dGVfbWFwOworICA0NjogbWFwPG1hcDxpOCxpOD4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIGk4PiAgICAgbWFwX2J5dGVfbWFwOwogICAvLyBjb2xsZWN0aW9ucyBhcyB2YWx1ZXMKLSAgNDc6IG1hcDxieXRlLCBtYXA8Ynl0ZSxieXRlPj4gICBieXRlX21hcF9tYXA7Ci0gIDQ4OiBtYXA8Ynl0ZSwgc2V0PGJ5dGU+PiAgICAgICAgYnl0ZV9zZXRfbWFwOwotICA0OTogbWFwPGJ5dGUsIGxpc3Q8Ynl0ZT4+ICAgICAgIGJ5dGVfbGlzdF9tYXA7CisgIDQ3OiBtYXA8aTgsIG1hcDxpOCxpOD4+ICAgICBieXRlX21hcF9tYXA7CisgIDQ4OiBtYXA8aTgsIHNldDxpOD4+ICAgICAgICBieXRlX3NldF9tYXA7CisgIDQ5OiBtYXA8aTgsIGxpc3Q8aTg+PiAgICAgICBieXRlX2xpc3RfbWFwOwogfQogCisvLyBUbyBiZSB1c2VkIHRvIHRlc3QgdGhlIHNlcmlhbGl6YXRpb24gb2YgYW4gZW1wdHkgbWFwCitzdHJ1Y3QgU2luZ2xlTWFwVGVzdFN0cnVjdCB7CisgIDE6IHJlcXVpcmVkIG1hcDxpMzIsIGkzMj4gICAgICAgaTMyX21hcDsKK30KIAogY29uc3QgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCBDT01QQUNUX1RFU1QgPSB7CiAgICdhX2J5dGUnICAgICAgICAgICAgIDogMTI3LApAQCAtMjI4LDE0ICsyMzgsMTggQEAKIAogc2VydmljZSBTcnYgewogICBpMzIgSmFua3koMTogaTMyIGFyZyk7Ci0gIAorCiAgIC8vIHJldHVybiB0eXBlIG9ubHkgbWV0aG9kcwotICAKKwogICB2b2lkIHZvaWRNZXRob2QoKTsKICAgaTMyIHByaW1pdGl2ZU1ldGhvZCgpOwogICBDb21wYWN0UHJvdG9UZXN0U3RydWN0IHN0cnVjdE1ldGhvZCgpOwotICAKKwogICB2b2lkIG1ldGhvZFdpdGhEZWZhdWx0QXJncygxOiBpMzIgc29tZXRoaW5nID0gTVlDT05TVCk7CisKKyAgb25ld2F5IHZvaWQgb25ld2F5TWV0aG9kKCk7CisKKyAgYm9vbCBkZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZCgxOiBib29sIHNob3VsZFRocm93KSB0aHJvd3MgKDE6IEV4Y2VwdGlvbldpdGhBTWFwIHh3YW1hcCk7CiB9CiAKIHNlcnZpY2UgSW5oZXJpdGVkIGV4dGVuZHMgU3J2IHsKQEAgLTI0NywxMCArMjYxLDEwIEBACiAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHRoaXMgdGhpbmcgaXMgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlCiAvLyBzbyB0aGF0IFpsaWJUZXN0IGhhcyBtb3JlIGhpZ2hseSBjb21wcmVzc2libGUgZGF0YSB0byBwbGF5IHdpdGguCiBzdHJ1Y3QgQmxvd1VwIHsKLSAgMTogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjE7Ci0gIDI6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGIyOwotICAzOiBtYXA8bGlzdDxpMzI+LHNldDxtYXA8aTMyLHN0cmluZz4+PiBiMzsKLSAgNDogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjQ7CisgIDE6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjE7CisgIDI6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjI7CisgIDM6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjM7CisgIDQ6IG1hcDxsaXN0PGkzMj4ocHl0aG9uLmltbXV0YWJsZSA9ICIiKSxzZXQ8bWFwPGkzMixzdHJpbmc+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4gYjQ7CiB9CiAKIApAQCAtMjcwLDEzICsyODQsMTQgQEAKICAgVFdPID0gMgogfQogCi1jb25zdCBTb21lRW51bSBNWV9TT01FX0VOVU0gPSBPTkUKKy8qKiBUaGlzIGlzIGEgZG9jc3RyaW5nIG9uIGEgY29uc3RhbnQhICovCitjb25zdCBTb21lRW51bSBNWV9TT01FX0VOVU0gPSBTb21lRW51bS5PTkUKIAogY29uc3QgU29tZUVudW0gTVlfU09NRV9FTlVNXzEgPSAxCiAvKmNvbnN0IFNvbWVFbnVtIE1ZX1NPTUVfRU5VTV8yID0gNyovCiAKIGNvbnN0IG1hcDxTb21lRW51bSxTb21lRW51bT4gTVlfRU5VTV9NQVAgPSB7Ci0gIE9ORSA6IFRXTworICBTb21lRW51bS5PTkUgOiBTb21lRW51bS5UV08KIH0KIAogc3RydWN0IFN0cnVjdFdpdGhTb21lRW51bSB7CkBAIC0yODQsNyArMjk5LDcgQEAKIH0KIAogY29uc3QgbWFwPFNvbWVFbnVtLFN0cnVjdFdpdGhTb21lRW51bT4gRVhUUkFfQ1JBWllfTUFQID0gewotICBPTkUgOiB7ImJsYWgiIDogVFdPfQorICBTb21lRW51bS5PTkUgOiB7ImJsYWgiIDogU29tZUVudW0uVFdPfQogfQogCiB1bmlvbiBUZXN0VW5pb24gewpAQCAtMjk3LDYgKzMxMiw4IEBACiAgIDQ6IGxpc3Q8UmFuZG9tU3R1ZmY+IHN0cnVjdF9saXN0OwogICA1OiBpMzIgb3RoZXJfaTMyX2ZpZWxkOwogICA2OiBTb21lRW51bSBlbnVtX2ZpZWxkOworICA3OiBzZXQ8aTMyPiBpMzJfc2V0OworICA4OiBtYXA8aTMyLCBpMzI+IGkzMl9tYXA7CiB9CiAKIHVuaW9uIFRlc3RVbmlvbk1pbnVzU3RyaW5nRmllbGQgewpAQCAtMzA1LDYgKzMyMiw4IEBACiAgIDQ6IGxpc3Q8UmFuZG9tU3R1ZmY+IHN0cnVjdF9saXN0OwogICA1OiBpMzIgb3RoZXJfaTMyX2ZpZWxkOwogICA2OiBTb21lRW51bSBlbnVtX2ZpZWxkOworICA3OiBzZXQ8aTMyPiBpMzJfc2V0OworICA4OiBtYXA8aTMyLCBpMzI+IGkzMl9tYXA7CiB9CiAKIHVuaW9uIENvbXBhcmFibGVVbmlvbiB7CkBAIC0zMzcsNCArMzU2LDIzIEBACiAgIDE6IHN0cmluZyBmaWVsZDE7CiAgIDI6IEJpZ0ZpZWxkSWRTdHJ1Y3QgZmllbGQyOwogICAzOiBpMzIgZmllbGQzOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKworc3RydWN0IFR1cGxlUHJvdG9jb2xUZXN0U3RydWN0IHsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMTsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMjsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMzsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkNDsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkNTsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkNjsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkNzsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkODsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkOTsKKyAgb3B0aW9uYWwgaTMyIGZpZWxkMTA7CisgIG9wdGlvbmFsIGkzMiBmaWVsZDExOworICBvcHRpb25hbCBpMzIgZmllbGQxMjsKK30KKworc3RydWN0IExpc3REb3VibGVQZXJmIHsKKyAgMTogbGlzdDxkb3VibGU+IGZpZWxkOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwIGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjhjNTQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gRXh0cmEgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBEZWJ1Z1Byb3RvVGVzdF90eXBlcyB0byB3b3JrCi0KLSNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCi0KLQotbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0ZXN0IHsgbmFtZXNwYWNlIGRlYnVnIHsKLQotYm9vbCBFbXB0eTo6b3BlcmF0b3I8KEVtcHR5IGNvbnN0JiBvdGhlcikgY29uc3QgewotICAvLyBJdCBpcyBlbXB0eSwgc28gYWxsIGFyZSBlcXVhbC4KLSAgcmV0dXJuIGZhbHNlOwotfQotCi19fX0KZGlmZiAtLWdpdCBhL3Rlc3QvRGVuc2VMaW5raW5nVGVzdC50aHJpZnQgYi90ZXN0L0RlbnNlTGlua2luZ1Rlc3QudGhyaWZ0CmluZGV4IGNmNjE0OTYuLjNhNWI5NTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvRGVuc2VMaW5raW5nVGVzdC50aHJpZnQKKysrIGIvdGVzdC9EZW5zZUxpbmtpbmdUZXN0LnRocmlmdApAQCAtMzQsNiArMzQsNyBAQAogKi8KIAogbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAorbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKIAogc3RydWN0IE9uZU9mRWFjaFpaIHsKICAgMTogYm9vbCBpbV90cnVlLApAQCAtOTAsMyArOTEsOCBAQAogc2VydmljZSBTcnYgewogICBpMzIgSmFua3koMTogaTMyIGFyZykKIH0KKworc2VydmljZSBVbmRlcnNjb3JlU3J2IHsKKyAgaTY0IHNvbWVfcnBjX2NhbGwoMTogc3RyaW5nIG1lc3NhZ2UpCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvRGVuc2VQcm90b1Rlc3QuY3BwIGIvdGVzdC9EZW5zZVByb3RvVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Zjc4NjUuLjAwMDAwMDAKLS0tIGEvdGVzdC9EZW5zZVByb3RvVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBjcHA6ZGVuc2UgRGVidWdQcm90b1Rlc3QudGhyaWZ0Ci0uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNwcDpkZW5zZSBPcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKLWcrKyAtV2FsbCAtZyAtSS4uL2xpYi9jcHAvc3JjIC1JL3Vzci9sb2NhbC9pbmNsdWRlL2Jvb3N0LTFfMzNfMSBcCi0gIGdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuY3BwIFwKLSAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgXAotICBEZW5zZVByb3RvVGVzdC5jcHAgLi4vbGliL2NwcC8ubGlicy9saWJ0aHJpZnQuYSAtbyBEZW5zZVByb3RvVGVzdAotLi9EZW5zZVByb3RvVGVzdAotKi8KLQotLy8gSSBkbyB0aGlzIHRvIHJlYWNoIGludG8gdGhlIGd1dHMgb2YgVERlbnNlUHJvdG9jb2wuICBTb3JyeS4KLSNkZWZpbmUgcHJpdmF0ZSBwdWJsaWMKLSNkZWZpbmUgaW5saW5lCi0KLSN1bmRlZiBOREVCVUcKLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKLSNpbmNsdWRlICJnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgiCi0jaW5jbHVkZSA8cHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLQotCi0vLyBDYW4ndCB1c2UgbWVtY21wIGhlcmUuICBHQ0MgaXMgdG9vIHNtYXJ0LgotYm9vbCBteV9tZW1lcShjb25zdCBjaGFyKiBzdHIxLCBjb25zdCBjaGFyKiBzdHIyLCBpbnQgbGVuKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBpZiAoc3RyMVtpXSAhPSBzdHIyW2ldKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLWludCBtYWluKCkgewotICB1c2luZyBzdGQ6OnN0cmluZzsKLSAgdXNpbmcgc3RkOjpjb3V0OwotICB1c2luZyBzdGQ6OmVuZGw7Ci0gIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0KLQotICBPbmVPZkVhY2ggb29lOwotICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKLSAgb29lLmltX2ZhbHNlICA9IGZhbHNlOwotICBvb2UuYV9iaXRlICAgID0gMHhkNjsKLSAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7Ci0gIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwotICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0KLSAgLy9jb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhvb2UpIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIE5lc3RpbmcgbjsKLSAgbi5teV9vb2UgPSBvb2U7Ci0gIG4ubXlfb29lLmludGVnZXIxNiA9IDE2OwotICBuLm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKLSAgbi5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7Ci0gIG4ubXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUpKzEpLzI7Ci0gIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci0gIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotICBuLm15X2JvbmsudHlwZSAgICA9IDMxMzM3OwotICBuLm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKLQotICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG4pIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIEhvbHlNb2xleSBobTsKLQotICBobS5iaWcucHVzaF9iYWNrKG9vZSk7Ci0gIGhtLmJpZy5wdXNoX2JhY2sobi5teV9vb2UpOwotICBobS5iaWdbMF0uYV9iaXRlID0gMHgyMjsKLSAgaG0uYmlnWzFdLmFfYml0ZSA9IDB4MzM7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0YWdlMTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgb25lIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIHR3byIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotICBzdGFnZTEuY2xlYXIoKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygidGhlbiBhIG9uZSwgdHdvIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soInRocmVlISIpOwotICBzdGFnZTEucHVzaF9iYWNrKCJGT1VSISEiKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLSAgc3RhZ2UxLmNsZWFyKCk7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0KLSAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOwotICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKLSAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIuY2xlYXIoKTsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAzOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAicXVvdGgiOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwotICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7Ci0KLSAgLy9jb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhobSkgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBzaGFyZWRfcHRyPFREZW5zZVByb3RvY29sPiBwcm90byhuZXcgVERlbnNlUHJvdG9jb2woYnVmZmVyKSk7Ci0gIHByb3RvLT5zZXRUeXBlU3BlYyhIb2x5TW9sZXk6OmxvY2FsX3JlZmxlY3Rpb24pOwotCi0gIGhtLndyaXRlKHByb3RvLmdldCgpKTsKLSAgSG9seU1vbGV5IGhtMjsKLSAgaG0yLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChobSA9PSBobTIpOwotCi0KLSAgLy8gTGV0J3MgdGVzdCBvdXQgdGhlIHZhcmlhYmxlLWxlbmd0aCBpbnRzLCBzaGFsbCB3ZT8KLSAgdWludDY0X3QgdmxxOwotICAjZGVmaW5lIGNoZWNrb3V0KGksIGMpIHsgXAotICAgIGJ1ZmZlci0+cmVzZXRCdWZmZXIoKTsgXAotICAgIHByb3RvLT52bHFXcml0ZShpKTsgXAotICAgIHByb3RvLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsgXAotICAgIGFzc2VydChteV9tZW1lcShidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCkuZGF0YSgpLCBjLCBzaXplb2YoYyktMSkpOyBcCi0gICAgcHJvdG8tPnZscVJlYWQodmxxKTsgXAotICAgIGFzc2VydCh2bHEgPT0gaSk7IFwKLSAgfQotCi0gIGNoZWNrb3V0KDB4MDAwMDAwMDAsICJceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwNDAsICJceDQwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwN0YsICJceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwODAsICJceDgxXHgwMCIpOwotICBjaGVja291dCgweDAwMDAyMDAwLCAiXHhDMFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwM0ZGRiwgIlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDQwMDAsICJceDgxXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDEwMDAwMCwgIlx4QzBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMUZGRkZGLCAiXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAyMDAwMDAsICJceDgxXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDgwMDAwMDAsICJceEMwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MEZGRkZGRkYsICJceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MTAwMDAwMDAsICJceDgxXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDIwMDAwMDAwLCAiXHg4Mlx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgxRkZGRkZGRiwgIlx4ODFceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4RkZGRkZGRkYsICJceDhGXHhGRlx4RkZceEZGXHg3RiIpOwotCi0gIGNoZWNrb3V0KDB4MDAwMDAwMDEwMDAwMDAwMHVsbCwgIlx4OTBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDIwMDAwMDAwMHVsbCwgIlx4QTBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDMwMDAwMDAwMHVsbCwgIlx4QjBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDcwMDAwMDAwMHVsbCwgIlx4RjBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDdGMDAwMDAwMHVsbCwgIlx4RkZceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDdGRkZGRkZGRnVsbCwgIlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDgwMDAwMDAwMHVsbCwgIlx4ODFceDgwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDFGRkZGRkZGRkZGRkZGRkZ1bGwsICJceDlGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHg3RkZGRkZGRkZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4RkZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4ODFceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLQotICAvLyBUZXN0IG91dCB0aGUgc2xvdyBwYXRoIHdpdGggYSBUQnVmZmVyZWRUcmFuc3BvcnQuCi0gIHNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmX3RyYW5zKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoYnVmZmVyLCAzKSk7Ci0gIHByb3RvLnJlc2V0KG5ldyBURGVuc2VQcm90b2NvbChidWZmX3RyYW5zKSk7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDEwMDAwMDAwMHVsbCwgIlx4OTBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDIwMDAwMDAwMHVsbCwgIlx4QTBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDMwMDAwMDAwMHVsbCwgIlx4QjBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDcwMDAwMDAwMHVsbCwgIlx4RjBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDdGMDAwMDAwMHVsbCwgIlx4RkZceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDdGRkZGRkZGRnVsbCwgIlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDgwMDAwMDAwMHVsbCwgIlx4ODFceDgwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDFGRkZGRkZGRkZGRkZGRkZ1bGwsICJceDlGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHg3RkZGRkZGRkZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4RkZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4ODFceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLQotICAvLyBUZXN0IG9wdGlvbmFsIHN0dWZmLgotICBwcm90by5yZXNldChuZXcgVERlbnNlUHJvdG9jb2woYnVmZmVyKSk7Ci0gIHByb3RvLT5zZXRUeXBlU3BlYyhNYW55T3B0Ojpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgTWFueU9wdCBtbzEsIG1vMiwgbW8zLCBtbzQsIG1vNSwgbW82OwotICBtbzEub3B0MSA9IDkyMzc1OTM0NzsKLSAgbW8xLm9wdDIgPSAzOTI3NDkyNzQ7Ci0gIG1vMS5vcHQzID0gMzk1NzM5NDAyOwotICBtbzEuZGVmNCA9IDI5NDczMDkyODsKLSAgbW8xLm9wdDUgPSAzOTQzMDkyMTg7Ci0gIG1vMS5vcHQ2ID0gODMyMTk0NzIzOwotICBtbzEuX19pc3NldC5vcHQxID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0MiA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDMgPSB0cnVlOwotICBtbzEuX19pc3NldC5kZWY0ID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDYgPSB0cnVlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vMi5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW8yLl9faXNzZXQub3B0MSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDIgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzIuX19pc3NldC5vcHQzID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQuZGVmNCA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDUgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzIuX19pc3NldC5vcHQ2ID09IHRydWUpOwotCi0gIGFzc2VydChtbzEgPT0gbW8yKTsKLQotICBtbzEuX19pc3NldC5vcHQxID0gZmFsc2U7Ci0gIG1vMS5fX2lzc2V0Lm9wdDMgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vMy5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW8zLl9faXNzZXQub3B0MSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQyID09IHRydWUpOwotICBhc3NlcnQobW8zLl9faXNzZXQub3B0MyA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW8zLl9faXNzZXQub3B0NSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQ2ID09IHRydWUpOwotCi0gIGFzc2VydChtbzEgPT0gbW8zKTsKLQotICBtbzEuX19pc3NldC5vcHQxID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0MyA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDUgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQyID0gZmFsc2U7Ci0gIG1vMS5fX2lzc2V0Lm9wdDYgPSBmYWxzZTsKLQotICBtbzEud3JpdGUocHJvdG8uZ2V0KCkpOwotICBtbzQucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDEgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzQuX19pc3NldC5vcHQyID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDMgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzQuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW80Ll9faXNzZXQub3B0NSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDYgPT0gZmFsc2UpOwotCi0gIGFzc2VydChtbzEgPT0gbW80KTsKLQotICBtbzEuX19pc3NldC5vcHQxID0gZmFsc2U7Ci0gIG1vMS5fX2lzc2V0Lm9wdDUgPSBmYWxzZTsKLQotICBtbzEud3JpdGUocHJvdG8uZ2V0KCkpOwotICBtbzUucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KG1vNS5fX2lzc2V0Lm9wdDEgPT0gZmFsc2UpOwotICBhc3NlcnQobW81Ll9faXNzZXQub3B0MiA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5vcHQzID09IHRydWUpOwotICBhc3NlcnQobW81Ll9faXNzZXQuZGVmNCA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNS5fX2lzc2V0Lm9wdDUgPT0gZmFsc2UpOwotICBhc3NlcnQobW81Ll9faXNzZXQub3B0NiA9PSBmYWxzZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzUpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDMgPSBmYWxzZTsKLQotICBtbzEud3JpdGUocHJvdG8uZ2V0KCkpOwotICBtbzYucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDEgPT0gZmFsc2UpOwotICBhc3NlcnQobW82Ll9faXNzZXQub3B0MiA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzYuX19pc3NldC5vcHQzID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzYuX19pc3NldC5vcHQ1ID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDYgPT0gZmFsc2UpOwotCi0gIGFzc2VydChtbzEgPT0gbW82KTsKLQotCi0gIC8vIFRlc3QgZmluZ2VycHJpbnQgY2hlY2tpbmcgc3R1ZmYuCi0KLSAgewotICAgIC8vIERlZmF1bHQgYW5kIHJlcXVpcmVkIGhhdmUgdGhlIHNhbWUgZmluZ2VycHJpbnQuCi0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kzIHQzOwotICAgIGFzc2VydChzdHJpbmcoVHJpY2t5MTo6YXNjaWlfZmluZ2VycHJpbnQpID09IFRyaWNreTM6OmFzY2lpX2ZpbmdlcnByaW50KTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5MTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDEuaW1fZGVmYXVsdCA9IDIyNzsKLSAgICB0MS53cml0ZShwcm90by5nZXQoKSk7Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTM6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHQzLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgIGFzc2VydCh0My5pbV9yZXF1aXJlZCA9PSAyMjcpOwotICB9Ci0KLSAgewotICAgIC8vIE9wdGlvbmFsIGNoYW5nZXMgdGhpbmdzLgotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MiB0MjsKLSAgICBhc3NlcnQoc3RyaW5nKFRyaWNreTE6OmFzY2lpX2ZpbmdlcnByaW50KSAhPSBUcmlja3kyOjphc2NpaV9maW5nZXJwcmludCk7Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTE6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHQxLmltX2RlZmF1bHQgPSAyMjc7Ci0gICAgdDEud3JpdGUocHJvdG8uZ2V0KCkpOwotICAgIHRyeSB7Ci0gICAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5Mjo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgICB0Mi5yZWFkKHByb3RvLmdldCgpKTsKLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uJiBleCkgewotICAgICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOwotICAgIH0KLSAgfQotCi0gIHsKLSAgICAvLyBIb2x5IGNvdy4gIFdlIGNhbiB1c2UgdGhlIFRyaWNreTEgdHlwZXNwZWMgd2l0aCB0aGUgVHJpY2t5MiBzdHJ1Y3R1cmUuCi0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kxOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0MS5pbV9kZWZhdWx0ID0gMjI3OwotICAgIHQxLndyaXRlKHByb3RvLmdldCgpKTsKLSAgICB0Mi5yZWFkKHByb3RvLmdldCgpKTsKLSAgICBhc3NlcnQodDIuX19pc3NldC5pbV9vcHRpb25hbCA9PSB0cnVlKTsKLSAgICBhc3NlcnQodDIuaW1fb3B0aW9uYWwgPT0gMjI3KTsKLSAgfQotCi0gIHsKLSAgICAvLyBBbmQgdG90YWxseSBvZmYgdGhlIHdhbGwuCi0gICAgVHJpY2t5MSB0MTsKLSAgICBPbmVPZkVhY2ggb29lMjsKLSAgICBhc3NlcnQoc3RyaW5nKFRyaWNreTE6OmFzY2lpX2ZpbmdlcnByaW50KSAhPSBPbmVPZkVhY2g6OmFzY2lpX2ZpbmdlcnByaW50KTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5MTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDEuaW1fZGVmYXVsdCA9IDIyNzsKLSAgICB0MS53cml0ZShwcm90by5nZXQoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIHByb3RvLT5zZXRUeXBlU3BlYyhPbmVPZkVhY2g6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgICAgb29lMi5yZWFkKHByb3RvLmdldCgpKTsKLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uJiBleCkgewotICAgICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOwotICAgIH0KLSAgfQotCi0gIC8vIE9rYXksIHRoaXMgaXMgcmVhbGx5IG9mZiB0aGUgd2FsbC4KLSAgLy8gSnVzdCBkb24ndCBjcmFzaC4KLSAgY291dCA8PCAiU3RhcnRpbmcgZnV6eiB0ZXN0LiAgVGhpcyB0YWtlcyBhIHdoaWxlLiAgKDIwIGRvdHMuKSIgPDwgZW5kbDsKLSAgc3RkOjpzcmFuZCgxMjM0NSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7Ci0gICAgaWYgKGkgJSAxMDAgPT0gMCkgewotICAgICAgY291dCA8PCAiLiI7Ci0gICAgICBjb3V0LmZsdXNoKCk7Ci0gICAgfQotICAgIGJ1ZmZlci0+cmVzZXRCdWZmZXIoKTsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIGZpbmdlcnByaW50IHByZWZpeCBpcyByaWdodC4KLSAgICBidWZmZXItPndyaXRlKE5lc3Rpbmc6OmJpbmFyeV9maW5nZXJwcmludCwgNCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDI0KjEwMjQ7IGorKykgewotICAgICAgdWludDhfdCByID0gc3RkOjpyYW5kKCk7Ci0gICAgICBidWZmZXItPndyaXRlKCZyLCAxKTsKLSAgICB9Ci0gICAgTmVzdGluZyBuOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhPbmVPZkVhY2g6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHRyeSB7Ci0gICAgICBuLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiYgZXgpIHsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewotICAgIH0KLSAgfQotICBjb3V0IDw8IGVuZGw7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L0RvY1Rlc3QudGhyaWZ0IGIvdGVzdC9Eb2NUZXN0LnRocmlmdAppbmRleCBjYjM1NWFlLi5kNzAyYjJjIDEwMDY0NAotLS0gYS90ZXN0L0RvY1Rlc3QudGhyaWZ0CisrKyBiL3Rlc3QvRG9jVGVzdC50aHJpZnQKQEAgLTU4LDcgKzU4LDcgQEAKICAgMTogIHN0cmluZyBzdHJpbmdfdGhpbmcKIAogICAvKiogZG9jdCB0ZXh0IGdvZXMgYmVmb3JlIGEgY29tbWEgKi8KLSAgNDogIGJ5dGUgICBieXRlX3RoaW5nLAorICA0OiAgaTggICAgIGJ5dGVfdGhpbmcsCiAKICAgOTogIGkzMiAgICBpMzJfdGhpbmcsCiAgIDExOiBpNjQgICAgaTY0X3RoaW5nCkBAIC03NCw3ICs3NCw3IEBACiAKIHN0cnVjdCBYdHJ1Y3QyCiB7Ci0gIDE6IGJ5dGUgICBieXRlX3RoaW5nLAorICAxOiBpOCAgICAgYnl0ZV90aGluZywKICAgMjogWHRydWN0IHN0cnVjdF90aGluZywKICAgMzogaTMyICAgIGkzMl90aGluZwogfQpAQCAtMTE3LDcgKzExNyw3IEBACiAgIC8qKiBBbmQgdGhpcyBpcyBob3cgeW91IHdvdWxkIGRvY3VtZW50IGZ1bmN0aW9ucyBpbiBhIHNlcnZpY2UgKi8KICAgdm9pZCAgICAgICAgIHRlc3RWb2lkKCksCiAgIHN0cmluZyAgICAgICB0ZXN0U3RyaW5nKDE6IHN0cmluZyB0aGluZyksCi0gIGJ5dGUgICAgICAgICB0ZXN0Qnl0ZSgxOiBieXRlIHRoaW5nKSwKKyAgaTggICAgICAgICAgIHRlc3RCeXRlKDE6IGJ5dGUgdGhpbmcpLAogICBpMzIgICAgICAgICAgdGVzdEkzMigxOiBpMzIgdGhpbmcpLAogCiAgIC8qKiBMaWtlIHRoaXMgb25lICovCkBAIC0xNTUsNyArMTU1LDcgQEAKIHR5cGVkZWYgaTMyIFRyaXZpYWxNdWx0aUxpbmUKIAogLyoqCi0gKiBUaGlzIGlzIHRoZSBjYW5ub25pY2FsIGV4YW1wbGUKKyAqIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBleGFtcGxlCiAgKiBvZiBhIG11bHRpbGluZSBkb2NzdHJpbmcuCiAgKi8KIHR5cGVkZWYgaTMyIFN0YW5kYXJkTXVsdGlMaW5lCkBAIC0yNDQsNCArMjQ0LDQ0IEBACiAqLwogdHlwZWRlZiBpMzIgVG90YWxseURlZ2VuZXJhdGUKIAorLyoqbm8gcm9vbSBmb3IgbmV3bGluZSBoZXJlKi8KKworLyogKiAvICovCit0eXBlZGVmIGkzMiBUZXN0Rm9yMzUwMWEKKworLyoqCisgKiAvCisgKi8KK3R5cGVkZWYgaTMyIFRlc3RGb3IzNTAxYgorCisKKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqLworc3RydWN0IFRlc3RGb3IzNzA5XzAwIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wMSB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKioqLworc3RydWN0IFRlc3RGb3IzNzA5XzAyIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wMyB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqLworc3RydWN0IFRlc3RGb3IzNzA5XzA0IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKioqLworc3RydWN0IFRlc3RGb3IzNzA5XzA1IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDYgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDcgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKioqLworc3RydWN0IFRlc3RGb3IzNzA5XzA4IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKworc3RydWN0IFRlc3RGb3IzNzA5IHsKKyAgLyoqIFRoaXMgaXMgYSBjb21tZW50ICovCisgIDE6IHJlcXVpcmVkIHN0cmluZyBpZCwKKyAgLyoqIFRoaXMgaXMgYWxzbyBhIGNvbW1lbnQgKiovCisgIDI6IHJlcXVpcmVkIHN0cmluZyB0eXBlSWQsCisgIC8qKiBZZXQgYW5vdGhlciBjb21tZW50ISAqLworICAzOiByZXF1aXJlZCBpMzIgZW5kVGltZXN0YW1wCit9CisKKwogLyogVEhFIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBiL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMTJhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKQEAgLTAsMCArMSwxNyBAQAorbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKK25hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QKKworLy8gbW9yZSB0ZXN0cyBvbiBkb3VibGUgY29uc3RhbnRzIChwcmVjaXNpb24gYW5kIHR5cGUgY2hlY2tzKQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCA9IDEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QgPSAtMTAwCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUID0gMy4xNDE1OTI2NTM1OQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gMTAwMDAwMC4xCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAtMTAwMDAwMC4xCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUID0gMS43ZSszMDgKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QgPSAtMS43ZSszMDgKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MworCitjb25zdCBsaXN0PGRvdWJsZT4gRE9VQkxFX0xJU1RfVEVTVCA9IFsxLC0xMDAsMTAwLDkyMjMzNzIwMzY4NTQ3NzU4MDcsLTkyMjMzNzIwMzY4NTQ3NzU4MDcsMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwtMS43ZSszMDgsOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M10KZGlmZiAtLWdpdCBhL3Rlc3QvRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCBiL3Rlc3QvRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjY0MDhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMKKworZW51bSBHcmVla0dvZEdvZGRlc3MgeworICAgIEFSRVMsCisgICAgQVBIUk9ESVRFLAorICAgIFpFVVMsCisgICAgUE9TRUlET04sCisgICAgSEVSQSwKK30KKwordHlwZWRlZiBHcmVla0dvZEdvZGRlc3MgR3JlZWtHb2RHb2RkZXNzVHlwZQordHlwZWRlZiBpMzIgUG93ZXIKKworc3RydWN0IEdvZEJlYW4geworICAgIDE6IG9wdGlvbmFsIG1hcDxHcmVla0dvZEdvZGRlc3NUeXBlLCBQb3dlcj4gcG93ZXIsCisgICAgMjogb3B0aW9uYWwgc2V0PEdyZWVrR29kR29kZGVzc1R5cGU+IGdvZGRlc3MsCisgICAgMzogb3B0aW9uYWwgbWFwPHN0cmluZywgR3JlZWtHb2RHb2RkZXNzPiBieUFsaWFzLAorICAgIDQ6IG9wdGlvbmFsIHNldDxzdHJpbmc+IGltYWdlcywKK30KKworY29uc3QgbWFwPEdyZWVrR29kR29kZGVzc1R5cGUsIHN0cmluZz4gQVRUUklCVVRFUyA9Cit7CisgICAgR3JlZWtHb2RHb2RkZXNzLlpFVVM6ICJsaWdodG5pbmcgYm9sdCIsCisgICAgR3JlZWtHb2RHb2RkZXNzLlBPU0VJRE9OOiAidHJpZGVudCIsCit9CisKK2NvbnN0IHNldDxHcmVla0dvZEdvZGRlc3NUeXBlPiBCRUFVVFkgPSBbIEdyZWVrR29kR29kZGVzcy5BUEhST0RJVEUsIEdyZWVrR29kR29kZGVzcy5IRVJBIF0KZGlmZiAtLWdpdCBhL3Rlc3QvRW51bVRlc3QudGhyaWZ0IGIvdGVzdC9FbnVtVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2MWYzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRW51bVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UgY19nbGliIFRUZXN0CisKK2VudW0gTXlFbnVtMSB7CisgIE1FMV8wID0gMCwKKyAgTUUxXzEgPSAxLAorICBNRTFfMiwKKyAgTUUxXzMsCisgIE1FMV81ID0gNSwKKyAgTUUxXzYsCit9CisKK2VudW0gTXlFbnVtMiB7CisgIE1FMl8wLAorICBNRTJfMSwKKyAgTUUyXzIsCit9CisKK2VudW0gTXlFbnVtMl9hZ2FpbiB7CisgIC8vIGVudW0gdmFsdWUgaWRlbnRpZmllcnMgbWF5IGFwcGVhciBhZ2FpbiBpbiBhbm90aGVyIGVudW0gdHlwZQorICBNRTBfMSwKKyAgTUUxXzEsCisgIE1FMl8xLAorICBNRTNfMSwKK30KKworZW51bSBNeUVudW0zIHsKKyAgTUUzXzAsCisgIE1FM18xLAorICBNRTNfTjIgPSAtMiwKKyAgTUUzX04xLAorICBNRTNfRDAsCisgIE1FM19EMSwKKyAgTUUzXzkgPSA5LAorICBNRTNfMTAsCit9CisKK2VudW0gTXlFbnVtNCB7CisgIE1FNF9BID0gMHg3ZmZmZmZmZAorICBNRTRfQgorICBNRTRfQworICAvLyBhdHRlbXB0aW5nIHRvIGRlZmluZSBhbm90aGVyIGVudW0gdmFsdWUgaGVyZSBmYWlscworICAvLyB3aXRoIGFuIG92ZXJmbG93IGVycm9yLCBhcyB3ZSBvdmVyZmxvdyB2YWx1ZXMgdGhhdCBjYW4gYmUKKyAgLy8gcmVwcmVzZW50ZWQgd2l0aCBhbiBpMzIuCit9CisKK2VudW0gTXlFbnVtNSB7CisgIGUxICAgICAgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCisgIGUyID0gNDIgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCit9CisKK2VudW0gTXlFbnVtV2l0aEN1c3RvbU9zdHJlYW0geworICBjdXN0b20xID0gMSwKKyAgQ3VzdG9NMgorfSAoY3BwLmN1c3RvbW9zdHJlYW0pCisKK3N0cnVjdCBNeVN0cnVjdCB7CisgIDE6IE15RW51bTIgbWUyXzIgPSBNeUVudW0xLk1FMl8yCisgIDI6IE15RW51bTMgbWUzX24yID0gTXlFbnVtMy5NRTNfTjIKKyAgMzogTXlFbnVtMyBtZTNfZDEgPSBNeUVudW0zLk1FM19EMQorfQorCitzdHJ1Y3QgRW51bVRlc3RTdHJ1Y3QgeworICAxOiBNeUVudW0zIGFfZW51bTsKKyAgMjogbGlzdDxNeUVudW0zPiBlbnVtX2xpc3Q7CisgIDM6IHNldDxNeUVudW0zPiBlbnVtX3NldDsKKyAgNDogbWFwPE15RW51bTMsIE15RW51bTM+IGVudW1fZW51bV9tYXA7CisgIC8vIGNvbGxlY3Rpb25zIGFzIGtleXMKKyAgNDQ6IG1hcDxsaXN0PE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBsaXN0X2VudW1fbWFwOworICA0NTogbWFwPHNldDxNeUVudW0zPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgTXlFbnVtMz4gc2V0X2VudW1fbWFwOworICA0NjogbWFwPG1hcDxNeUVudW0zLE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBtYXBfZW51bV9tYXA7CisgIC8vIGNvbGxlY3Rpb25zIGFzIHZhbHVlcworICA0NzogbWFwPE15RW51bTMsIG1hcDxNeUVudW0zLCBNeUVudW0zPj4gZW51bV9tYXBfbWFwOworICA0ODogbWFwPE15RW51bTMsIHNldDxNeUVudW0zPj4gZW51bV9zZXRfbWFwOworICA0OTogbWFwPE15RW51bTMsIGxpc3Q8TXlFbnVtMz4+IGVudW1fbGlzdF9tYXA7Cit9CisKK2NvbnN0IEVudW1UZXN0U3RydWN0IEVOVU1fVEVTVCA9IHsKKyAgJ2FfZW51bSc6IE15RW51bTMuTUUzX0QxLAorICAnZW51bV9saXN0JzogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM18wLCBNeUVudW0zLk1FM19OMl0sCisgICdlbnVtX3NldCc6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfTjFdLAorICAnZW51bV9lbnVtX21hcCc6IHtNeUVudW0zLk1FM19EMTogTXlFbnVtMy5NRTNfMCwgTXlFbnVtMy5NRTNfMDogTXlFbnVtMy5NRTNfRDF9LAorICAnbGlzdF9lbnVtX21hcCc6IHtbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfRDFdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfMF06IE15RW51bTMuTUUzX0QxfSwKKyAgJ3NldF9lbnVtX21hcCc6IHtbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM18wLCBbTXlFbnVtMy5NRTNfRDFdOiBNeUVudW0zLk1FM18wfSwKKyAgJ21hcF9lbnVtX21hcCc6IHt7TXlFbnVtMy5NRTNfTjE6IE15RW51bTMuTUUzXzEwfTogTXlFbnVtMy5NRTNfMX0sCisgICdlbnVtX21hcF9tYXAnOiB7TXlFbnVtMy5NRTNfTjE6IHtNeUVudW0zLk1FM19EMTogTXlFbnVtMy5NRTNfRDF9fSwKKyAgJ2VudW1fc2V0X21hcCc6IHtNeUVudW0zLk1FM19OMjogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM19OMV0sIE15RW51bTMuTUUzXzEwOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzX04xXX0sCisgICdlbnVtX2xpc3RfbWFwJzoge015RW51bTMuTUUzX0QxOiBbTXlFbnVtMy5NRTNfMTBdLCBNeUVudW0zLk1FM18wOiBbTXlFbnVtMy5NRTNfOSwgTXlFbnVtMy5NRTNfMTBdfSwKK30KKworc2VydmljZSBFbnVtVGVzdFNlcnZpY2UgeworICBNeUVudW0zIHRlc3RFbnVtKDE6IE15RW51bTMgZW51bTEpLAorICBsaXN0PE15RW51bTM+IHRlc3RFbnVtTGlzdCgxOiBsaXN0PE15RW51bTM+IGVudW0xKSwKKyAgc2V0PE15RW51bTM+IHRlc3RFbnVtU2V0KDE6IHNldDxNeUVudW0zPiBlbnVtMSksCisgIG1hcDxNeUVudW0zLCBNeUVudW0zPiB0ZXN0RW51bU1hcCgxOiBtYXA8TXlFbnVtMywgTXlFbnVtMz4gZW51bTEpLAorICBFbnVtVGVzdFN0cnVjdCB0ZXN0RW51bVN0cnVjdCgxOiBFbnVtVGVzdFN0cnVjdCBlbnVtMSksCit9CmRpZmYgLS1naXQgYS90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5IGIvdGVzdC9GYXN0YmluYXJ5VGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Y2ZWZhZS4uMDAwMDAwMAotLS0gYS90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotciIiIgotdGhyaWZ0IC0tZ2VuIHB5IERlYnVnUHJvdG9UZXN0LnRocmlmdAotLi9GYXN0YmluYXJ5VGVzdC5weQotIiIiCi0KLSMgVE9ETyhkcmVpc3MpOiBUZXN0IGVycm9yIGNhc2VzLiAgQ2hlY2sgZm9yIG1lbW9yeSBsZWFrcy4KLQotaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuL2dlbi1weScpCi0KLWltcG9ydCBtYXRoCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBTcnYKLWZyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLQotaW1wb3J0IHRpbWVpdAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi1mcm9tIGNvcHkgaW1wb3J0IGRlZXBjb3B5Ci1mcm9tIHBwcmludCBpbXBvcnQgcHByaW50Ci0KLWNsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgcGFzcwotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBUcnVlCi0KLW9vZTEgPSBPbmVPZkVhY2goKQotb29lMS5pbV90cnVlICAgPSBUcnVlOwotb29lMS5pbV9mYWxzZSAgPSBGYWxzZTsKLW9vZTEuYV9iaXRlICAgID0gMHhkNjsKLW9vZTEuaW50ZWdlcjE2ID0gMjcwMDA7Ci1vb2UxLmludGVnZXIzMiA9IDE8PDI0Owotb29lMS5pbnRlZ2VyNjQgPSA2MDAwICogMTAwMCAqIDEwMDA7Ci1vb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpOwotb29lMS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLW9vZTEuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKLQotb29lMiA9IE9uZU9mRWFjaCgpOwotb29lMi5pbnRlZ2VyMTYgPSAxNjsKLW9vZTIuaW50ZWdlcjMyID0gMzI7Ci1vb2UyLmludGVnZXI2NCA9IDY0Owotb29lMi5kb3VibGVfcHJlY2lzaW9uID0gKG1hdGguc3FydCg1KSsxKS8yOwotb29lMi5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotb29lMi56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmUiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmEiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4YzdceDgzXHhlMlx4ODBceGJjIjsKLQotaG0gPSBIb2x5TW9sZXkoeyJiaWciOltdLCAiY29udGFpbiI6c2V0KCksICJib25rcyI6e319KQotaG0uYmlnLmFwcGVuZChvb2UxKQotaG0uYmlnLmFwcGVuZChvb2UyKQotaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci1obS5iaWdbMV0uYV9iaXRlID0gMHgyMjsKLQotaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCi1obS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKLWhtLmNvbnRhaW4uYWRkKCgpKQotCi1obS5ib25rc1sibm90aGluZyJdID0gW107Ci1obS5ib25rc1sic29tZXRoaW5nIl0gPSBbCi0gIEJvbmsoeyJ0eXBlIjoxLCAibWVzc2FnZSI6IldhaXQuIn0pLAotICBCb25rKHsidHlwZSI6MiwgIm1lc3NhZ2UiOiJXaGF0PyJ9KSwKLV0KLWhtLmJvbmtzWyJwb2UiXSA9IFsKLSAgQm9uayh7InR5cGUiOjMsICJtZXNzYWdlIjoicXVvdGgifSksCi0gIEJvbmsoeyJ0eXBlIjo0LCAibWVzc2FnZSI6InRoZSByYXZlbiJ9KSwKLSAgQm9uayh7InR5cGUiOjUsICJtZXNzYWdlIjoibmV2ZXJtb3JlIn0pLAotXQotCi1ycyA9IFJhbmRvbVN0dWZmKCkKLXJzLmEgPSAxCi1ycy5iID0gMgotcnMuYyA9IDMKLXJzLm15aW50bGlzdCA9IHJhbmdlKDIwKQotcnMubWFwcyA9IHsxOldyYXBwZXIoeyJmb28iOkVtcHR5KCl9KSwyOldyYXBwZXIoeyJmb28iOkVtcHR5KCl9KX0KLXJzLmJpZ2ludCA9IDEyNDUyMzQ1MjQzNUwKLXJzLnRyaXBsZSA9IDMuMTQKLQotIyBtYWtlIHN1cmUgdGhpcyBzcGxpdHMgdHdvIGJ1ZmZlcnMgaW4gYSBidWZmZXJlZCBwcm90b2NvbAotcnNodWdlID0gUmFuZG9tU3R1ZmYoKQotcnNodWdlLm15aW50bGlzdD1yYW5nZSgxMDAwMCkKLQotbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoeyJhcmciOjV9KQotCi1kZWYgY2hlY2tXcml0ZShvKToKLSAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICBwcm90X2Zhc3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNfZmFzdCkKLSAgcHJvdF9zbG93ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc19zbG93KQotCi0gIG8ud3JpdGUocHJvdF9mYXN0KQotICBvLndyaXRlKHByb3Rfc2xvdykKLSAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQotICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCi0gIGlmIE9SSUcgIT0gTUlORToKLSAgICBwcmludCAibWluZTogJXNcbm9yaWc6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKQotCi1kZWYgY2hlY2tSZWFkKG8pOgotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKLSAgby53cml0ZShwcm90KQotCi0gIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKLQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAotICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAotICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0KLWRlZiBkb1Rlc3QoKToKLSAgY2hlY2tXcml0ZShobSkKLSAgbm9fc2V0ID0gZGVlcGNvcHkoaG0pCi0gIG5vX3NldC5jb250YWluID0gc2V0KCkKLSAgY2hlY2tSZWFkKG5vX3NldCkKLSAgY2hlY2tXcml0ZShycykKLSAgY2hlY2tSZWFkKHJzKQotICBjaGVja1dyaXRlKHJzaHVnZSkKLSAgY2hlY2tSZWFkKHJzaHVnZSkKLSAgY2hlY2tXcml0ZShteV96ZXJvKQotICBjaGVja1JlYWQobXlfemVybykKLSAgY2hlY2tSZWFkKEJhY2t3YXJkcyh7ImZpcnN0X3RhZzIiOjQsICJzZWNvbmRfdGFnMSI6Mn0pKQotCi0gICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgotICBvID0gQmFja3dhcmRzKHsiZmlyc3RfdGFnMiI6NCwgInNlY29uZF90YWcxIjoyfSkKLSAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICBwcm90X2Zhc3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQodHJhbnNfZmFzdCkKLSAgcHJvdF9zbG93ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc19zbG93KQotCi0gIG8ud3JpdGUocHJvdF9mYXN0KQotICBvLndyaXRlKHByb3Rfc2xvdykKLSAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQotICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCi0gIGlmIE9SSUcgPT0gTUlORToKLSAgICBwcmludCAiVGhhdCBzaG91bGRuJ3QgaGFwcGVuLiIKLQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkpCi0gIG8ud3JpdGUocHJvdCkKLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2woCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigKLSAgICAgICAgICAgICBwcm90LnRyYW5zLmdldHZhbHVlKCkpKQotICBjID0gby5fX2NsYXNzX18oKQotICBjLnJlYWQocHJvdCkKLSAgaWYgYyAhPSBvOgotICAgIHByaW50ICJjb3B5OiAiCi0gICAgcHByaW50KGV2YWwocmVwcihjKSkpCi0gICAgcHJpbnQgIm9yaWc6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKG8pKSkKLQotCi0KLWRlZiBkb0JlbmNobWFyaygpOgotCi0gIGl0ZXJzID0gMjUwMDAKLQotICBzZXR1cCA9ICIiIgotZnJvbSBfX21haW5fXyBpbXBvcnQgaG0sIHJzLCBURGV2TnVsbFRyYW5zcG9ydAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotdHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCi1wcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCVzKHRyYW5zKQotIiIiCi0KLSAgc2V0dXBfZmFzdCA9IHNldHVwICUgIkFjY2VsZXJhdGVkIgotICBzZXR1cF9zbG93ID0gc2V0dXAgJSAiIgotCi0gIHByaW50ICJTdGFydGluZyBCZW5jaG1hcmtzIgotCi0gIHByaW50ICJIb2x5TW9sZXkgU3RhbmRhcmQgPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfc2xvdykudGltZWl0KG51bWJlcj1pdGVycykKLSAgcHJpbnQgIkhvbHlNb2xleSBBY2NlbGVyLiA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKQotCi0gIHByaW50ICJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0gIHByaW50ICJGYXN0U3RydWN0IEFjY2VsZXIuID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX2Zhc3QpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0KLQotCi1kb1Rlc3QoKQotZG9CZW5jaG1hcmsoKQotCmRpZmYgLS1naXQgYS90ZXN0L0Z1bGxDYW1lbFRlc3QudGhyaWZ0IGIvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU0ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0LmZ1bGxjYW1lbAorCitzdHJ1Y3QgT25lT2ZFYWNoWlogeworICAxOiBib29sIGltX3RydWUsCisgIDI6IGJvb2wgaW1fZmFsc2UsCisgIDM6IGJ5dGUgYV9iaXRlLAorICA0OiBpMTYgaW50ZWdlcjE2LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0LAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCit9CisKK3NlcnZpY2UgVW5kZXJzY29yZVNydiB7CisgIGk2NCBzb21lX3JwY19jYWxsKDE6IHN0cmluZyBtZXNzYWdlKQorfQorCmRpZmYgLS1naXQgYS90ZXN0L0dlbmVyaWNIZWxwZXJzLmggYi90ZXN0L0dlbmVyaWNIZWxwZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NjFkOGIuLjAwMDAwMDAKLS0tIGEvdGVzdC9HZW5lcmljSGVscGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RFU1RfR0VORVJJQ0hFTFBFUlNfSF8KLSNkZWZpbmUgX1RIUklGVF9URVNUX0dFTkVSSUNIRUxQRVJTX0hfIDEKLQotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgPFRocmlmdC5oPgotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0KLS8qIENsYXNzTmFtZSBIZWxwZXIgZm9yIGNsZWFuZXIgZXhjZXB0aW9ucyAqLwotY2xhc3MgQ2xhc3NOYW1lcyB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7IHJldHVybiAiVW5rbm93biB0eXBlIjsgfQotfTsKLQotdGVtcGxhdGUgPD4gY29uc3QgY2hhciogQ2xhc3NOYW1lczo6Z2V0TmFtZTxpbnQ4X3Q+KCkgeyByZXR1cm4gImJ5dGUiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDE2X3Q+KCkgeyByZXR1cm4gInNob3J0IjsgfQotdGVtcGxhdGUgPD4gY29uc3QgY2hhciogQ2xhc3NOYW1lczo6Z2V0TmFtZTxpbnQzMl90PigpIHsgcmV0dXJuICJpbnQiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDY0X3Q+KCkgeyByZXR1cm4gImxvbmciOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGRvdWJsZT4oKSB7IHJldHVybiAiZG91YmxlIjsgfQotdGVtcGxhdGUgPD4gY29uc3QgY2hhciogQ2xhc3NOYW1lczo6Z2V0TmFtZTxzdGQ6OnN0cmluZz4oKSB7IHJldHVybiAic3RyaW5nIjsgfQotCi0vKiBHZW5lcmljIFByb3RvY29sIEkvTyBmdW5jdGlvbiBmb3IgdGVzdHMgKi8KLWNsYXNzIEdlbmVyaWNJTyB7Ci0gcHVibGljOgotCi0gIC8qIFdyaXRlIGZ1bmN0aW9ucyAqLwotCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDhfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT53cml0ZUJ5dGUodmFsKTsKLSAgfQotCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDE2X3QmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+d3JpdGVJMTYodmFsKTsKLSAgfQotCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDMyX3QmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+d3JpdGVJMzIodmFsKTsKLSAgfQotCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGRvdWJsZSYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT53cml0ZURvdWJsZSh2YWwpOwotICB9Ci0KLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50NjRfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT53cml0ZUk2NCh2YWwpOwotICB9Ci0KLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+d3JpdGVTdHJpbmcodmFsKTsKLSAgfQotCi0gIC8qIFJlYWQgZnVuY3Rpb25zICovCi0KLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQ4X3QmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZEJ5dGUodmFsKTsKLSAgfQotCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50MTZfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT5yZWFkSTE2KHZhbCk7Ci0gIH0KLQotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZEkzMih2YWwpOwotICB9Ci0KLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQ2NF90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRJNjQodmFsKTsKLSAgfQotCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgZG91YmxlJiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWREb3VibGUodmFsKTsKLSAgfQotCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgc3RkOjpzdHJpbmcmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZFN0cmluZyh2YWwpOwotICB9Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9JbmNsdWRlLnRocmlmdCBiL3Rlc3QvSW5jbHVkZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyMzE5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSW5jbHVkZS50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbmNsdWRlICJUaHJpZnRUZXN0LnRocmlmdCIKKworc3RydWN0IEluY2x1ZGVUZXN0IHsKKyAgMTogcmVxdWlyZWQgVGhyaWZ0VGVzdC5Cb29scyBib29scworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAgYi90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDc5NjM4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgotI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKLQotaW50IG1haW4oKSB7Ci0gIHVzaW5nIHN0ZDo6Y291dDsKLSAgdXNpbmcgc3RkOjplbmRsOwotICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKLSAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOwotCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweGQ2OwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiSlNPTiBUSElTISBcIlwxIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0gIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7Ci0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcob29lKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBOZXN0aW5nIG47Ci0gIG4ubXlfb29lID0gb29lOwotICBuLm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKLSAgbi5teV9vb2UuaW50ZWdlcjMyID0gMzI7Ci0gIG4ubXlfb29lLmludGVnZXI2NCA9IDY0OwotICBuLm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApKzEpLzI7Ci0gIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci0gIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotICBuLm15X2JvbmsudHlwZSAgICA9IDMxMzM3OwotICBuLm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKLQotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKG4pIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIEhvbHlNb2xleSBobTsKLQotICBobS5iaWcucHVzaF9iYWNrKG9vZSk7Ci0gIGhtLmJpZy5wdXNoX2JhY2sobi5teV9vb2UpOwotICBobS5iaWdbMF0uYV9iaXRlID0gMHgyMjsKLSAgaG0uYmlnWzFdLmFfYml0ZSA9IDB4MzM7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0YWdlMTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgb25lIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIHR3byIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotICBzdGFnZTEuY2xlYXIoKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygidGhlbiBhIG9uZSwgdHdvIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soInRocmVlISIpOwotICBzdGFnZTEucHVzaF9iYWNrKCJGT1VSISEiKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLSAgc3RhZ2UxLmNsZWFyKCk7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0KLSAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOwotICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKLSAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIuY2xlYXIoKTsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAzOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAicXVvdGgiOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwotICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7Ci0KLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhobSkgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7Ci0KLQotICBjb3V0IDw8ICJUZXN0aW5nIG9vZSIgPDwgZW5kbDsKLQotICBvb2Uud3JpdGUocHJvdG8uZ2V0KCkpOwotICBPbmVPZkVhY2ggb29lMjsKLSAgb29lMi5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQob29lID09IG9vZTIpOwotCi0KLSAgY291dCA8PCAiVGVzdGluZyBobSIgPDwgZW5kbDsKLQotICBobS53cml0ZShwcm90by5nZXQoKSk7Ci0gIEhvbHlNb2xleSBobTI7Ci0gIGhtMi5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQoaG0gPT0gaG0yKTsKLQotICBobTIuYmlnWzBdLmFfYml0ZSA9IDB4RkY7Ci0KLSAgYXNzZXJ0KGhtICE9IGhtMik7Ci0KLSAgRG91YmxlcyBkdWI7Ci0gIGR1Yi5uYW4gPSBIVUdFX1ZBTC9IVUdFX1ZBTDsKLSAgZHViLmluZiA9IEhVR0VfVkFMOwotICBkdWIubmVnaW5mID0gLUhVR0VfVkFMOwotICBkdWIucmVwZWF0aW5nID0gMTAuMC8zLjA7Ci0gIGR1Yi5iaWcgPSAxRSszMDU7Ci0gIGR1Yi5zbWFsbCA9IDFFLTMwNTsKLSAgZHViLnplcm8gPSAwLjA7Ci0gIGR1Yi5uZWd6ZXJvID0gLTAuMDsKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhkdWIpIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb3V0IDw8ICJUZXN0aW5nIGJhc2UiIDw8IGVuZGw7Ci0KLSAgQmFzZTY0IGJhc2U7Ci0gIGJhc2UuYSA9IDEyMzsKLSAgYmFzZS5iMSA9ICIxIjsKLSAgYmFzZS5iMiA9ICIxMiI7Ci0gIGJhc2UuYjMgPSAiMTIzIjsKLSAgYmFzZS5iNCA9ICIxMjM0IjsKLSAgYmFzZS5iNSA9ICIxMjM0NSI7Ci0gIGJhc2UuYjYgPSAiMTIzNDU2IjsKLQotICBiYXNlLndyaXRlKHByb3RvLmdldCgpKTsKLSAgQmFzZTY0IGJhc2UyOwotICBiYXNlMi5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQoYmFzZSA9PSBiYXNlMik7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L0phdmFEZWVwQ29weVRlc3QudGhyaWZ0IGIvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzk3NGFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdApAQCAtMCwwICsxLDE5IEBACitpbmNsdWRlICJKYXZhVHlwZXMudGhyaWZ0IgorCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitzdHJ1Y3QgRGVlcENvcHlGb28geworICAxOiBvcHRpb25hbCBsaXN0PERlZXBDb3B5QmFyPiBsLAorICAyOiBvcHRpb25hbCBzZXQ8RGVlcENvcHlCYXI+IHMsCisgIDM6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIERlZXBDb3B5QmFyPiBtLAorICA0OiBvcHRpb25hbCBsaXN0PEphdmFUeXBlcy5PYmplY3Q+IGxpLAorICA1OiBvcHRpb25hbCBzZXQ8SmF2YVR5cGVzLk9iamVjdD4gc2ksCisgIDY6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIEphdmFUeXBlcy5PYmplY3Q+IG1pLAorICA3OiBvcHRpb25hbCBEZWVwQ29weUJhciBiYXIsCit9CisKK3N0cnVjdCBEZWVwQ29weUJhciB7CisgIDE6IG9wdGlvbmFsIHN0cmluZyBhLAorICAyOiBvcHRpb25hbCBpMzIgYiwKKyAgMzogb3B0aW9uYWwgYm9vbCBjLAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9KYXZhVHlwZXMudGhyaWZ0IGIvdGVzdC9KYXZhVHlwZXMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzMzYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0phdmFUeXBlcy50aHJpZnQKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IEludGVnZXIgeworICAxOiBpMzIgdmFsCit9CisKK3N0cnVjdCBTdHJpbmcgeworICAxOiBzdHJpbmcgdmFsCit9CisKK3N0cnVjdCBCb29sZWFuIHsKKyAgMTogYm9vbCB2YWwKK30KKworc3RydWN0IERvdWJsZSB7CisgIDE6IGRvdWJsZSB2YWwKK30KKworc3RydWN0IExvbmcgeworICAxOiBpNjQgdmFsCit9CisKK3N0cnVjdCBCeXRlIHsKKyAgMTogYnl0ZSB2YWwKK30KKworc3RydWN0IEZsb2F0IHsKKyAgMTogZG91YmxlIHZhbAorfQorCitzdHJ1Y3QgTGlzdCB7CisgIDE6IGxpc3Q8c3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBBcnJheUxpc3QgeworICAxOiBsaXN0PHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgU29ydGVkTWFwIHsKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBUcmVlTWFwIHsKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBIYXNoTWFwIHsKKyAgMTogbWFwPHN0cmluZywgU3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBNYXAgeworICAxOiBtYXA8ZG91YmxlLCBEb3VibGU+IHZhbHMKK30KKworc3RydWN0IE9iamVjdCB7CisgIDE6IEludGVnZXIgaW50ZWdlciwKKyAgMjogU3RyaW5nIHN0ciwKKyAgMzogQm9vbGVhbiBib29sZWFuX2ZpZWxkLAorICA0OiBEb3VibGUgZGJsLAorICA1OiBCeXRlIGJpdGUsCisgIDY6IG1hcDxpMzIsIEludGVnZXI+IGludG1hcCwKKyAgNzogTWFwIHNvbWVtYXAsCit9CisKK2V4Y2VwdGlvbiBFeGNlcHRpb24geworICAxOiBzdHJpbmcgbXNnCit9CisKK3NlcnZpY2UgQXN5bmNOb25ibG9ja2luZ1NlcnZpY2UgeworICBPYmplY3QgbXltZXRob2QoCisgICAgMTogSW50ZWdlciBpbnRlZ2VyLAorICAgIDI6IFN0cmluZyBzdHIsCisgICAgMzogQm9vbGVhbiBib29sZWFuX2ZpZWxkLAorICAgIDQ6IERvdWJsZSBkYmwsCisgICAgNTogQnl0ZSBiaXRlLAorICAgIDY6IG1hcDxpMzIsIEludGVnZXI+IGludG1hcCwKKyAgICA3OiBNYXAgc29tZW1hcCwKKyAgKSB0aHJvd3MgKDE6RXhjZXB0aW9uIGV4KTsKK30KKworc3RydWN0IFNhZmVCeXRlcyB7CisgIDE6IGJpbmFyeSBieXRlczsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0IGIvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTEyNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQKQEAgLTAsMCArMSwxOCBAQAorc3RydWN0IFNpbXBsZSB7CisgIDE6IHN0cmluZyB2YWx1ZQorfQorCitzdHJ1Y3QgQ29tcGxleCB7CisgIDE6IFNpbXBsZSBzdHJ1Y3RfZmllbGQKKyAgMjogbGlzdDxTaW1wbGU+IHN0cnVjdF9saXN0X2ZpZWxkCisgIDM6IHNldDxTaW1wbGU+IHN0cnVjdF9zZXRfZmllbGQKKyAgNDogbWFwPHN0cmluZyxTaW1wbGU+IHN0cnVjdF9tYXBfZmllbGQKKyAgNTogbGlzdDxzZXQ8bWFwPHN0cmluZyxsaXN0PFNpbXBsZT4+Pj4gc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkCisgIDY6IG1hcDxzdHJpbmcsIGxpc3Q8bWFwPHN0cmluZyxTaW1wbGU+PiA+IHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIKKyAgNzogbGlzdDxsaXN0PHN0cmluZz4+IGxpc3Rfb2ZfbGlzdF9maWVsZAorICA4OiBsaXN0PGxpc3Q8bGlzdDxzdHJpbmc+Pj4gbGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGQKK30KKworc3RydWN0IENvbXBsZXhMaXN0IHsKKyAgMTogbGlzdDxDb21wbGV4PiBzdHJ1Y3RfbGlzdF9maWVsZDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTWFrZWZpbGUuYW0gYi90ZXN0L01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNWZkNGYwZC4uNjhmMTk4NgotLS0gYS90ZXN0L01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE3LDE2NSArMTcsMTU0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0KK1NVQkRJUlMgPSBmZWF0dXJlcworUFJFQ1JPU1NfVEFSR0VUID0KKworaWYgV0lUSF9DX0dMSUIKK1NVQkRJUlMgKz0gY19nbGliCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY19nbGliCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY2wKK2VuZGlmCisKK2lmIFdJVEhfTU9OTworU1VCRElSUyArPSBjc2hhcnAKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jc2hhcnAKK2VuZGlmCisKK2lmIFdJVEhfQ1BQCitTVUJESVJTICs9IGNwcAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNwcAorZW5kaWYKKworaWYgV0lUSF9QRVJMCitTVUJESVJTICs9IHBlcmwKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1wZXJsCitlbmRpZgorCitpZiBXSVRIX1BIUAorU1VCRElSUyArPSBwaHAKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1waHAKK2VuZGlmCisKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZGFydAorZW5kaWYKIAogaWYgV0lUSF9QWVRIT04KIFNVQkRJUlMgKz0gcHkKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1weQorU1VCRElSUyArPSBweS50b3JuYWRvCitpZiBXSVRIX1RXSVNURURfVEVTVAorU1VCRElSUyArPSBweS50d2lzdGVkCitlbmRpZgogZW5kaWYKIAogaWYgV0lUSF9SVUJZCiBTVUJESVJTICs9IHJiCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcmIKIGVuZGlmCiAKLW5vaW5zdF9MVExJQlJBUklFUyA9IGxpYnRlc3RnZW5jcHAubGEKLW5vZGlzdF9saWJ0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCi0JZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgXAotCWdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuY3BwIFwKLQlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBcCi0JZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCi0JZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIFwKLQlnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmggXAotCWdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIFwKLQlUaHJpZnRUZXN0X2V4dHJhcy5jcHAgXAotCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKK2lmIFdJVEhfSEFTS0VMTAorU1VCRElSUyArPSBocworZW5kaWYKIAotVGhyaWZ0VGVzdF9leHRyYXMubzogZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKLURlYnVnUHJvdG9UZXN0X2V4dHJhcy5vOiBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgKK2lmIFdJVEhfSEFYRQorU1VCRElSUyArPSBoYXhlCitlbmRpZgogCi1saWJ0ZXN0Z2VuY3BwX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQoraWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCiAKLW5vaW5zdF9QUk9HUkFNUyA9IEJlbmNobWFyaworaWYgV0lUSF9HTworU1VCRElSUyArPSBnbworUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWdvCitlbmRpZgogCi1CZW5jaG1hcmtfU09VUkNFUyA9IFwKLQlCZW5jaG1hcmsuY3BwCitpZiBXSVRIX0VSTEFORworU1VCRElSUyArPSBlcmwKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1lcmwKK2VuZGlmCiAKLUJlbmNobWFya19MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKK2lmIFdJVEhfTFVBCitTVUJESVJTICs9IGx1YQorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWx1YQorZW5kaWYKIAotY2hlY2tfUFJPR1JBTVMgPSBcCi0JVEZEVHJhbnNwb3J0VGVzdCBcCi0JVFBpcGVkVHJhbnNwb3J0VGVzdCBcCi0JRGVidWdQcm90b1Rlc3QgXAotCUpTT05Qcm90b1Rlc3QgXAotCU9wdGlvbmFsUmVxdWlyZWRUZXN0IFwKLQlBbGxQcm90b2NvbHNUZXN0IFwKLQlVbml0VGVzdHMKLQotVEVTVFMgPSBcCi0JJChjaGVja19QUk9HUkFNUykKLQotVW5pdFRlc3RzX1NPVVJDRVMgPSBcCi0JVW5pdFRlc3RNYWluLmNwcCBcCi0JVE1lbW9yeUJ1ZmZlclRlc3QuY3BwIFwKLQlUQnVmZmVyQmFzZVRlc3QuY3BwCi0KLVVuaXRUZXN0c19MREFERCA9IGxpYnRlc3RnZW5jcHAubGEgLWxib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrCitpZiBXSVRIX1JTCitTVUJESVJTICs9IHJzCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcnMKK2VuZGlmCiAKICMKLSMgVEZEVHJhbnNwb3J0VGVzdAorIyBnZW5lcmF0ZSBodG1sIGZvciBUaHJpZnRUZXN0LnRocmlmdAogIwotVEZEVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAotCVRGRFRyYW5zcG9ydFRlc3QuY3BwCi0KLVRGRFRyYW5zcG9ydFRlc3RfTERBREQgPSBcCi0JJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCi0KLQotIwotIyBUUGlwZWRUcmFuc3BvcnRUZXN0Ci0jCi1UUGlwZWRUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCi0JVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKLQotVFBpcGVkVHJhbnNwb3J0VGVzdF9MREFERCA9IFwKLQkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKLQotIwotIyBBbGxQcm90b2NvbHNUZXN0Ci0jCi1BbGxQcm90b2NvbHNUZXN0X1NPVVJDRVMgPSBcCi0JQWxsUHJvdG9jb2xUZXN0cy5jcHAgXAotCUFsbFByb3RvY29sVGVzdHMudGNjIFwKLQlHZW5lcmljSGVscGVycy5oCi0KLUFsbFByb3RvY29sc1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCi0KLSMKLSMgRGVidWdQcm90b1Rlc3QKLSMKLURlYnVnUHJvdG9UZXN0X1NPVVJDRVMgPSBcCi0JRGVidWdQcm90b1Rlc3QuY3BwCi0KLURlYnVnUHJvdG9UZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQotCi0KLSMKLSMgSlNPTlByb3RvVGVzdAotIwotSlNPTlByb3RvVGVzdF9TT1VSQ0VTID0gXAotCUpTT05Qcm90b1Rlc3QuY3BwCi0KLUpTT05Qcm90b1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhCi0KLSMKLSMgT3B0aW9uYWxSZXF1aXJlZFRlc3QKLSMKLU9wdGlvbmFsUmVxdWlyZWRUZXN0X1NPVVJDRVMgPSBcCi0JT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCi0KLU9wdGlvbmFsUmVxdWlyZWRUZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQotCi0KLSMKLSMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKLSMKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaDogRGVidWdQcm90b1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAotCi1nZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmg6IE9wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBjcHA6ZGVuc2UgJDwKLQotZ2VuLWNwcC9TZXJ2aWNlLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwOiBTdHJlc3NUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBjcHA6ZGVuc2UgJDwKLQotZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmg6IFRocmlmdFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAotCi1JTkNMVURFUyA9IFwKLQktSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMKLQotQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKQorY2hlY2stbG9jYWw6CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHRtbCAtciAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWNwcAorCXJtIC1yZiAkKHRvcF9zcmNkaXIpL3Rlc3QvZ2VuLWh0bWwKIAogRVhUUkFfRElTVCA9IFwKKwlhdWRpdCBcCisJY3Jvc3NydW5uZXIgXAorCWtleXMgXAorCWNfZ2xpYiBcCisJY2wgXAogCWNwcCBcCi0JdGhyZWFkcyBcCi0JY3NoYXJwIFwKLQlweSBcCi0JcmIgXAotCXBlcmwgXAotCXBocCBcCisJZGFydCBcCiAJZXJsIFwKIAlocyBcCisJbHVhIFwKIAlvY2FtbCBcCisJcGVybCBcCisJcGhwIFwKKwlweSBcCisJcHkudHdpc3RlZCBcCisJcHkudG9ybmFkbyBcCisJcmIgXAorCXJzIFwKKwl0aHJlYWRzIFwKIAlBbm5vdGF0aW9uVGVzdC50aHJpZnQgXAogCUJyb2tlbkNvbnN0YW50cy50aHJpZnQgXAogCUNvbnN0YW50c0RlbW8udGhyaWZ0IFwKIAlEZWJ1Z1Byb3RvVGVzdC50aHJpZnQgXAorCURvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IFwKIAlEZW5zZUxpbmtpbmdUZXN0LnRocmlmdCBcCiAJRG9jVGVzdC50aHJpZnQgXAorCUVudW1UZXN0LnRocmlmdCBcCisJRnVsbENhbWVsVGVzdC50aHJpZnQgXAorCUluY2x1ZGUudGhyaWZ0IFwKIAlKYXZhQmVhbnNUZXN0LnRocmlmdCBcCisJSmF2YURlZXBDb3B5VGVzdC50aHJpZnQgXAorCUphdmFUeXBlcy50aHJpZnQgXAorCUpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQgXAorCU1hbnlPcHRpb25hbHMudGhyaWZ0IFwKIAlNYW55VHlwZWRlZnMudGhyaWZ0IFwKKwlOYW1lQ29uZmxpY3RUZXN0LnRocmlmdCBcCiAJT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0IFwKKwlSZWN1cnNpdmUudGhyaWZ0IFwKKwlSZXVzZU9iamVjdHMudGhyaWZ0IFwKKwlFbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IFwKIAlTbWFsbFRlc3QudGhyaWZ0IFwKIAlTdHJlc3NUZXN0LnRocmlmdCBcCiAJVGhyaWZ0VGVzdC50aHJpZnQgXAotCVpsaWJUZXN0LmNwcCBcCi0JRGVuc2VQcm90b1Rlc3QuY3BwIFwKLQlGYXN0YmluYXJ5VGVzdC5weSBcCi0JVGhyaWZ0VGVzdF9leHRyYXMuY3BwIFwKLQlEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCisJVHlwZWRlZlRlc3QudGhyaWZ0IFwKKwlVbnNhZmVUeXBlcy50aHJpZnQgXAorCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAorCXRlc3QucHkgXAorCXRlc3RzLmpzb24gXAorCXJlYnVpbGRfa25vd25fZmFpbHVyZXMuc2ggXAorCXJlc3VsdC5qcyBcCisJaW5kZXguaHRtbCBcCisJUkVBRE1FLm1kIFwKKwl2YWxncmluZC5zdXBwcmVzcwogCitwcmVjcm9zcy0lOgorCSQoTUFLRSkgLUMgJCogcHJlY3Jvc3MKK3ByZWNyb3NzOiAkKFBSRUNST1NTX1RBUkdFVCkKZGlmZiAtLWdpdCBhL3Rlc3QvTWFueU9wdGlvbmFscy50aHJpZnQgYi90ZXN0L01hbnlPcHRpb25hbHMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjFkNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01hbnlPcHRpb25hbHMudGhyaWZ0CkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoZSBqYXZhIGNvZGVnZW5lcmF0b3IgaGFzIGEgZmV3IGRpZmZlcmVudCBjb2RlcGF0aHMgZGVwZW5kaW5nCisvLyBvbiBob3cgbWFueSBvcHRpb25hbHMgdGhlIHN0cnVjdCBoYXM7IHRoaXMgYXR0ZW1wdHMgdG8gZXhlcmNpc2UKKy8vIHRoZW0uCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK3N0cnVjdCBPcHQ0IHsKKyAgMTogaTMyIGRlZjE7CisgIDI6IGkzMiBkZWYyOworICAzOiBpMzIgZGVmMzsKKyAgNDogaTMyIGRlZjQ7Cit9CisKK3N0cnVjdCBPcHQxMyB7CisgIDE6IGkzMiBkZWYxOworICAyOiBpMzIgZGVmMjsKKyAgMzogaTMyIGRlZjM7CisgIDQ6IGkzMiBkZWY0OworICA1OiBpMzIgZGVmNTsKKyAgNjogaTMyIGRlZjY7CisgIDc6IGkzMiBkZWY3OworICA4OiBpMzIgZGVmODsKKyAgOTogaTMyIGRlZjk7CisgIDEwOiBpMzIgZGVmMTA7CisgIDExOiBpMzIgZGVmMTE7CisgIDEyOiBpMzIgZGVmMTI7CisgIDEzOiBpMzIgZGVmMTM7Cit9CisKK3N0cnVjdCBPcHQzMCB7CisgIDE6IGkzMiBkZWYxOworICAyOiBpMzIgZGVmMjsKKyAgMzogaTMyIGRlZjM7CisgIDQ6IGkzMiBkZWY0OworICA1OiBpMzIgZGVmNTsKKyAgNjogaTMyIGRlZjY7CisgIDc6IGkzMiBkZWY3OworICA4OiBpMzIgZGVmODsKKyAgOTogaTMyIGRlZjk7CisgIDEwOiBpMzIgZGVmMTA7CisgIDExOiBpMzIgZGVmMTE7CisgIDEyOiBpMzIgZGVmMTI7CisgIDEzOiBpMzIgZGVmMTM7CisgIDE0OiBpMzIgZGVmMTQ7CisgIDE1OiBpMzIgZGVmMTU7CisgIDE2OiBpMzIgZGVmMTY7CisgIDE3OiBpMzIgZGVmMTc7CisgIDE4OiBpMzIgZGVmMTg7CisgIDE5OiBpMzIgZGVmMTk7CisgIDIwOiBpMzIgZGVmMjA7CisgIDIxOiBpMzIgZGVmMjE7CisgIDIyOiBpMzIgZGVmMjI7CisgIDIzOiBpMzIgZGVmMjM7CisgIDI0OiBpMzIgZGVmMjQ7CisgIDI1OiBpMzIgZGVmMjU7CisgIDI2OiBpMzIgZGVmMjY7CisgIDI3OiBpMzIgZGVmMjc7CisgIDI4OiBpMzIgZGVmMjg7CisgIDI5OiBpMzIgZGVmMjk7CisgIDMwOiBpMzIgZGVmMzA7Cit9CisKK3N0cnVjdCBPcHQ2NCB7CisgIDE6IGkzMiBkZWYxOworICAyOiBpMzIgZGVmMjsKKyAgMzogaTMyIGRlZjM7CisgIDQ6IGkzMiBkZWY0OworICA1OiBpMzIgZGVmNTsKKyAgNjogaTMyIGRlZjY7CisgIDc6IGkzMiBkZWY3OworICA4OiBpMzIgZGVmODsKKyAgOTogaTMyIGRlZjk7CisgIDEwOiBpMzIgZGVmMTA7CisgIDExOiBpMzIgZGVmMTE7CisgIDEyOiBpMzIgZGVmMTI7CisgIDEzOiBpMzIgZGVmMTM7CisgIDE0OiBpMzIgZGVmMTQ7CisgIDE1OiBpMzIgZGVmMTU7CisgIDE2OiBpMzIgZGVmMTY7CisgIDE3OiBpMzIgZGVmMTc7CisgIDE4OiBpMzIgZGVmMTg7CisgIDE5OiBpMzIgZGVmMTk7CisgIDIwOiBpMzIgZGVmMjA7CisgIDIxOiBpMzIgZGVmMjE7CisgIDIyOiBpMzIgZGVmMjI7CisgIDIzOiBpMzIgZGVmMjM7CisgIDI0OiBpMzIgZGVmMjQ7CisgIDI1OiBpMzIgZGVmMjU7CisgIDI2OiBpMzIgZGVmMjY7CisgIDI3OiBpMzIgZGVmMjc7CisgIDI4OiBpMzIgZGVmMjg7CisgIDI5OiBpMzIgZGVmMjk7CisgIDMwOiBpMzIgZGVmMzA7CisgIDMxOiBpMzIgZGVmMzE7CisgIDMyOiBpMzIgZGVmMzI7CisgIDMzOiBpMzIgZGVmMzM7CisgIDM0OiBpMzIgZGVmMzQ7CisgIDM1OiBpMzIgZGVmMzU7CisgIDM2OiBpMzIgZGVmMzY7CisgIDM3OiBpMzIgZGVmMzc7CisgIDM4OiBpMzIgZGVmMzg7CisgIDM5OiBpMzIgZGVmMzk7CisgIDQwOiBpMzIgZGVmNDA7CisgIDQxOiBpMzIgZGVmNDE7CisgIDQyOiBpMzIgZGVmNDI7CisgIDQzOiBpMzIgZGVmNDM7CisgIDQ0OiBpMzIgZGVmNDQ7CisgIDQ1OiBpMzIgZGVmNDU7CisgIDQ2OiBpMzIgZGVmNDY7CisgIDQ3OiBpMzIgZGVmNDc7CisgIDQ4OiBpMzIgZGVmNDg7CisgIDQ5OiBpMzIgZGVmNDk7CisgIDUwOiBpMzIgZGVmNTA7CisgIDUxOiBpMzIgZGVmNTE7CisgIDUyOiBpMzIgZGVmNTI7CisgIDUzOiBpMzIgZGVmNTM7CisgIDU0OiBpMzIgZGVmNTQ7CisgIDU1OiBpMzIgZGVmNTU7CisgIDU2OiBpMzIgZGVmNTY7CisgIDU3OiBpMzIgZGVmNTc7CisgIDU4OiBpMzIgZGVmNTg7CisgIDU5OiBpMzIgZGVmNTk7CisgIDYwOiBpMzIgZGVmNjA7CisgIDYxOiBpMzIgZGVmNjE7CisgIDYyOiBpMzIgZGVmNjI7CisgIDYzOiBpMzIgZGVmNjM7CisgIDY0OiBpMzIgZGVmNjQ7Cit9CisKK3N0cnVjdCBPcHQ4MCB7CisgIDE6IGkzMiBkZWYxOworICAyOiBpMzIgZGVmMjsKKyAgMzogaTMyIGRlZjM7CisgIDQ6IGkzMiBkZWY0OworICA1OiBpMzIgZGVmNTsKKyAgNjogaTMyIGRlZjY7CisgIDc6IGkzMiBkZWY3OworICA4OiBpMzIgZGVmODsKKyAgOTogaTMyIGRlZjk7CisgIDEwOiBpMzIgZGVmMTA7CisgIDExOiBpMzIgZGVmMTE7CisgIDEyOiBpMzIgZGVmMTI7CisgIDEzOiBpMzIgZGVmMTM7CisgIDE0OiBpMzIgZGVmMTQ7CisgIDE1OiBpMzIgZGVmMTU7CisgIDE2OiBpMzIgZGVmMTY7CisgIDE3OiBpMzIgZGVmMTc7CisgIDE4OiBpMzIgZGVmMTg7CisgIDE5OiBpMzIgZGVmMTk7CisgIDIwOiBpMzIgZGVmMjA7CisgIDIxOiBpMzIgZGVmMjE7CisgIDIyOiBpMzIgZGVmMjI7CisgIDIzOiBpMzIgZGVmMjM7CisgIDI0OiBpMzIgZGVmMjQ7CisgIDI1OiBpMzIgZGVmMjU7CisgIDI2OiBpMzIgZGVmMjY7CisgIDI3OiBpMzIgZGVmMjc7CisgIDI4OiBpMzIgZGVmMjg7CisgIDI5OiBpMzIgZGVmMjk7CisgIDMwOiBpMzIgZGVmMzA7CisgIDMxOiBpMzIgZGVmMzE7CisgIDMyOiBpMzIgZGVmMzI7CisgIDMzOiBpMzIgZGVmMzM7CisgIDM0OiBpMzIgZGVmMzQ7CisgIDM1OiBpMzIgZGVmMzU7CisgIDM2OiBpMzIgZGVmMzY7CisgIDM3OiBpMzIgZGVmMzc7CisgIDM4OiBpMzIgZGVmMzg7CisgIDM5OiBpMzIgZGVmMzk7CisgIDQwOiBpMzIgZGVmNDA7CisgIDQxOiBpMzIgZGVmNDE7CisgIDQyOiBpMzIgZGVmNDI7CisgIDQzOiBpMzIgZGVmNDM7CisgIDQ0OiBpMzIgZGVmNDQ7CisgIDQ1OiBpMzIgZGVmNDU7CisgIDQ2OiBpMzIgZGVmNDY7CisgIDQ3OiBpMzIgZGVmNDc7CisgIDQ4OiBpMzIgZGVmNDg7CisgIDQ5OiBpMzIgZGVmNDk7CisgIDUwOiBpMzIgZGVmNTA7CisgIDUxOiBpMzIgZGVmNTE7CisgIDUyOiBpMzIgZGVmNTI7CisgIDUzOiBpMzIgZGVmNTM7CisgIDU0OiBpMzIgZGVmNTQ7CisgIDU1OiBpMzIgZGVmNTU7CisgIDU2OiBpMzIgZGVmNTY7CisgIDU3OiBpMzIgZGVmNTc7CisgIDU4OiBpMzIgZGVmNTg7CisgIDU5OiBpMzIgZGVmNTk7CisgIDYwOiBpMzIgZGVmNjA7CisgIDYxOiBpMzIgZGVmNjE7CisgIDYyOiBpMzIgZGVmNjI7CisgIDYzOiBpMzIgZGVmNjM7CisgIDY0OiBpMzIgZGVmNjQ7CisgIDY1OiBpMzIgZGVmNjU7CisgIDY2OiBpMzIgZGVmNjY7CisgIDY3OiBpMzIgZGVmNjc7CisgIDY4OiBpMzIgZGVmNjg7CisgIDY5OiBpMzIgZGVmNjk7CisgIDcwOiBpMzIgZGVmNzA7CisgIDcxOiBpMzIgZGVmNzE7CisgIDcyOiBpMzIgZGVmNzI7CisgIDczOiBpMzIgZGVmNzM7CisgIDc0OiBpMzIgZGVmNzQ7CisgIDc1OiBpMzIgZGVmNzU7CisgIDc2OiBpMzIgZGVmNzY7CisgIDc3OiBpMzIgZGVmNzc7CisgIDc4OiBpMzIgZGVmNzg7CisgIDc5OiBpMzIgZGVmNzk7CisgIDgwOiBpMzIgZGVmODA7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQgYi90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZWZiNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTEwIEBACisvLyBOYW1pbmcgdGVzdGNhc2VzLCBzZXBjaWZpY2FsbHkgZm9yIHRoZXNlIHRpY2tldHMgKGJ1dCBub3QgbGltaXRlZCB0byB0aGVtKQorLy8gVEhSSUZULTI1MDggVW5jb21waWxlYWJsZSBDIyBjb2RlIGR1ZSB0byBsYW5ndWFnZSBrZXl3b3JkcyBpbiBJREwKKy8vIFRIUklGVC0yNTU3IGVycm9yIENTMDU0MiBtZW1iZXIgbmFtZXMgY2Fubm90IGJlIHRoZSBzYW1lIGFzIHRoZWlyIGVuY2xvc2luZyB0eXBlCisKKworc3RydWN0IHVzaW5nIHsKKyAgICAxOiBkb3VibGUgc2luZ2xlCisgICAgMjogZG91YmxlIGludGVnZXIKK30KKworc3RydWN0IGRlbGVnYXRlIHsKKyAgICAxOiBzdHJpbmcgcGFydGlhbAorICAgIDI6IGRlbGVnYXRlIGRlbGVnYXRlCit9CisKK3N0cnVjdCBnZXQgeworICAgIDE6IGJvb2wgc2J5dGUKK30KKworc3RydWN0IHBhcnRpYWwgeworICAgIDE6IHVzaW5nIHVzaW5nCisgICAgMjogYm9vbCByZWFkCisgICAgMzogYm9vbCB3cml0ZQorfQorCitlbnVtIE1heWJlIHsKKyAgSlVTVCA9IDEsCisgIFRSVUUgPSAyLAorICBGQUxTRSA9IDMKK30KKworZW51bSBFaXRoZXIgeworICBMRUZUID0gMSwKKyAgUklHSFQgPSAyCit9CisKK3N0cnVjdCBmb2xkciB7CisgIDE6IHN0cmluZyBpZAorfQorCitzdHJ1Y3Qgb2YgeworICAxOiBzdHJpbmcgbGV0CisgIDI6IHN0cmluZyB3aGVyZQorfQorCitzdHJ1Y3Qgb2ZPZiB7CisgIDE6IG9mIE9mCit9CisKKworc3RydWN0IENsYXNzQW5kUHJvcCB7CisgIDE6IGJvb2wgQ2xhc3NBbmRQcm9wCisgIDI6IGJvb2wgQ2xhc3NBbmRQcm9wXworICAzOiBib29sIENsYXNzQW5kUHJvcF9fCisgIDQ6IGJvb2wgQ2xhc3NBbmRQcm9wZXIKK30KKworc3RydWN0IHNlY29uZF9jaGFuY2UgeworICAxOiBib29sIFNFQ09ORF9DSEFOQ0UKKyAgMjogYm9vbCBTRUNPTkRfQ0hBTkNFXworICAzOiBib29sIFNFQ09ORF9DSEFOQ0VfXworICA0OiBib29sIFNFQ09ORF9DSEFOQ0VTCit9CisKK3N0cnVjdCBOT1dfRUFUX1RISVMgeworICAxOiBib29sIG5vd19lYXRfdGhpcworICAyOiBib29sIG5vd19lYXRfdGhpc18KKyAgMzogYm9vbCBub3dfZWF0X3RoaXNfXworICA0OiBib29sIG5vd19lYXRfdGhpc19hbmRfdGhpcworfQorCitzdHJ1Y3QgVGhlRWRnZUNhc2UgeworICAxOiBib29sIHRoZUVkZ2VDYXNlCisgIDI6IGJvb2wgdGhlRWRnZUNhc2VfCisgIDM6IGJvb2wgdGhlRWRnZUNhc2VfXworICA0OiBib29sIFRoZUVkZ2VDYXNlCisgIDU6IGJvb2wgVGhlRWRnZUNhc2VfCisgIDY6IGJvb2wgVGhlRWRnZUNhc2VfXworfQorCitzdHJ1Y3QgVHJpY2t5XyB7CisgIDE6IGJvb2wgdHJpY2t5CisgIDI6IGJvb2wgVHJpY2t5Cit9CisKK3N0cnVjdCBOZXN0ZWQgeworICAxOiBDbGFzc0FuZFByb3AgQ2xhc3NBbmRQcm9wCisgIDI6IHNlY29uZF9jaGFuY2Ugc2Vjb25kX2NoYW5jZQorICAzOiBOT1dfRUFUX1RISVMgTk9XX0VBVF9USElTCisgIDQ6IFRoZUVkZ2VDYXNlIFRoZUVkZ2VDYXNlCisgIDU6IFRyaWNreV8gVHJpY2t5XworICA2OiBOZXN0ZWQgTmVzdGVkCit9CisKK2V4Y2VwdGlvbiBQcm9ibGVtXyB7CisgIDE6IGJvb2wgcHJvYmxlbQorICAyOiBib29sIFByb2JsZW0KK30KKworCitzZXJ2aWNlIGV4dGVybiB7CisgICAgZGVsZWdhdGUgZXZlbnQoMTogcGFydGlhbCBnZXQpCisgICAgdm9pZCBGb28oMTogTmVzdGVkIEZvb19hcmdzKSB0aHJvd3MgKDE6IFByb2JsZW1fIEZvb19yZXN1bHQpCit9CisKK3NlcnZpY2UgcXVhbGlmaWVkIHsKKyAgICBNYXliZSBtYXliZSgxOiBNYXliZSBmb2xkcikKKyAgICBFaXRoZXIgZWl0aGVyKDE6IGZvbGRyIG9mKQorfQorLy8gZW9mCmRpZmYgLS1naXQgYS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcCBiL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDcyNjAzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxwcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgImdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCIKLQotdXNpbmcgc3RkOjpjb3V0OwotdXNpbmcgc3RkOjplbmRsOwotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0KLQotLyoKLXRlbXBsYXRlPHR5cGVuYW1lIFN0cnVjdD4KLXZvaWQgdHJ5d3JpdGUoY29uc3QgU3RydWN0JiBzLCBib29sIHNob3VsZF93b3JrKSB7Ci0gIGJvb2wgd29ya2VkOwotICB0cnkgewotICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwotICAgIHMud3JpdGUoJnByb3RvY29sKTsKLSAgICB3b3JrZWQgPSB0cnVlOwotICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJiBleCkgewotICAgIHdvcmtlZCA9IGZhbHNlOwotICB9Ci0gIGFzc2VydCh3b3JrZWQgPT0gc2hvdWxkX3dvcmspOwotfQotKi8KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cnVjdDEsIHR5cGVuYW1lIFN0cnVjdDI+Ci12b2lkIHdyaXRlX3RvX3JlYWQoY29uc3QgU3RydWN0MSAmIHcsIFN0cnVjdDIgJiByKSB7Ci0gIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwotICB3LndyaXRlKCZwcm90b2NvbCk7Ci0gIHIucmVhZCgmcHJvdG9jb2wpOwotfQotCi0KLWludCBtYWluKCkgewotCi0gIGNvdXQgPDwgIlRoaXMgb2xkIHNjaG9vbCBzdHJ1Y3Qgc2hvdWxkIGhhdmUgdGhyZWUgZmllbGRzLiIgPDwgZW5kbDsKLSAgewotICAgIE9sZFNjaG9vbCBvOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcobykgPDwgZW5kbDsKLSAgfQotICBjb3V0IDw8IGVuZGw7Ci0KLSAgY291dCA8PCAiU2V0dGluZyBhIHZhbHVlIGJlZm9yZSBzZXR0aW5nIGlzc2V0LiIgPDwgZW5kbDsKLSAgewotICAgIFNpbXBsZSBzOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgICBzLmltX29wdGlvbmFsID0gMTA7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICAgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICB9Ci0gIGNvdXQgPDwgZW5kbDsKLQotICBjb3V0IDw8ICJTZXR0aW5nIGlzc2V0IGJlZm9yZSBzZXR0aW5nIGEgdmFsdWUuIiA8PCBlbmRsOwotICB7Ci0gICAgU2ltcGxlIHM7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICAgIHMuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICAgIHMuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gIH0KLSAgY291dCA8PCBlbmRsOwotCi0gIC8vIFdyaXRlLXRvLXJlYWQgd2l0aCBvcHRpb25hbCBmaWVsZHMuCi0gIHsKLSAgICBTaW1wbGUgczEsIHMyLCBzMzsKLSAgICBzMS5pbV9vcHRpb25hbCA9IDEwOwotICAgIGFzc2VydCghczEuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgLy9hc3NlcnQoIXMxLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KLSAgICBhc3NlcnQoIXMxLl9faXNzZXQuaW1fb3B0aW9uYWwpOwotCi0gICAgd3JpdGVfdG9fcmVhZChzMSwgczIpOwotCi0gICAgYXNzZXJ0KCBzMi5fX2lzc2V0LmltX2RlZmF1bHQpOwotICAvL2Fzc2VydCggczIuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgotICAgIGFzc2VydCghczIuX19pc3NldC5pbV9vcHRpb25hbCk7Ci0gICAgYXNzZXJ0KHMzLmltX29wdGlvbmFsID09IDApOwotCi0gICAgczEuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgd3JpdGVfdG9fcmVhZChzMSwgczMpOwotCi0gICAgYXNzZXJ0KCBzMy5fX2lzc2V0LmltX2RlZmF1bHQpOwotICAvL2Fzc2VydCggczMuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgotICAgIGFzc2VydCggczMuX19pc3NldC5pbV9vcHRpb25hbCk7Ci0gICAgYXNzZXJ0KHMzLmltX29wdGlvbmFsID09IDEwKTsKLSAgfQotCi0gIC8vIFdyaXRpbmcgYmV0d2VlbiBvcHRpb25hbCBhbmQgZGVmYXVsdC4KLSAgewotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MiB0MjsKLQotICAgIHQyLmltX29wdGlvbmFsID0gMTA7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MiwgdDEpOwotICAgIHdyaXRlX3RvX3JlYWQodDEsIHQyKTsKLSAgICBhc3NlcnQoIXQxLl9faXNzZXQuaW1fZGVmYXVsdCk7Ci0gICAgYXNzZXJ0KCB0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKLSAgICBhc3NlcnQodDEuaW1fZGVmYXVsdCA9PSB0Mi5pbV9vcHRpb25hbCk7Ci0gICAgYXNzZXJ0KHQxLmltX2RlZmF1bHQgPT0gMCk7Ci0gIH0KLQotICAvLyBXcml0aW5nIGJldHdlZW4gZGVmYXVsdCBhbmQgcmVxdWlyZWQuCi0gIHsKLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTMgdDM7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MSwgdDMpOwotICAgIHdyaXRlX3RvX3JlYWQodDMsIHQxKTsKLSAgICBhc3NlcnQodDEuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgfQotCi0gIC8vIFdyaXRpbmcgYmV0d2VlbiBvcHRpb25hbCBhbmQgcmVxdWlyZWQuCi0gIHsKLSAgICBUcmlja3kyIHQyOwotICAgIFRyaWNreTMgdDM7Ci0gICAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MiwgdDMpOwotICAgIHdyaXRlX3RvX3JlYWQodDMsIHQyKTsKLSAgfQotCi0gIC8vIE11LWh1LWhhLWhhLWhhIQotICB7Ci0gICAgVHJpY2t5MiB0MjsKLSAgICBUcmlja3kzIHQzOwotICAgIHRyeSB7Ci0gICAgICB3cml0ZV90b19yZWFkKHQyLCB0Myk7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgICBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uJiBleCkge30KLQotICAgIHdyaXRlX3RvX3JlYWQodDMsIHQyKTsKLSAgICBhc3NlcnQodDIuX19pc3NldC5pbV9vcHRpb25hbCk7Ci0gIH0KLQotICBjb3V0IDw8ICJDb21wbGV4IHN0cnVjdCwgc2ltcGxlIHRlc3QuIiA8PCBlbmRsOwotICB7Ci0gICAgQ29tcGxleCBjOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcoYykgPDwgZW5kbDsKLSAgfQotCi0KLSAgewotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MiB0MjsKLSAgICAvLyBDb21waWxlIGVycm9yLgotICAgIC8vKHZvaWQpKHQxID09IHQyKTsKLSAgfQotCi0gIHsKLSAgICBPbGRTY2hvb2wgbzEsIG8yLCBvMzsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLmltX2ludCA9IG8yLmltX2ludCA9IDEwOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuX19pc3NldC5pbV9pbnQgPSB0cnVlOwotICAgIG8yLl9faXNzZXQuaW1faW50ID0gZmFsc2U7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5pbV9pbnQgPSAyMDsKLSAgICBvMS5fX2lzc2V0LmltX2ludCA9IGZhbHNlOwotICAgIGFzc2VydChvMSAhPSBvMik7Ci0gICAgbzEuaW1faW50ID0gMTA7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5pbV9zdHIgPSBvMi5pbV9zdHIgPSAiZm9vIjsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLl9faXNzZXQuaW1fc3RyID0gbzIuX19pc3NldC5pbV9zdHIgPSB0cnVlOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbWFwPGludDMyX3Qsc3RyaW5nPiBteW1hcDsKLSAgICBteW1hcFsxXSA9ICJiYXIiOwotICAgIG15bWFwWzJdID0gImJheiI7Ci0gICAgbzEuaW1fYmlnLnB1c2hfYmFjayhtYXA8aW50MzJfdCxzdHJpbmc+KCkpOwotICAgIGFzc2VydChvMSAhPSBvMik7Ci0gICAgbzIuaW1fYmlnLnB1c2hfYmFjayhtYXA8aW50MzJfdCxzdHJpbmc+KCkpOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzIuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgYXNzZXJ0KG8xICE9IG8yKTsKLSAgICBvMS5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotCi0gICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7Ci0gICAgbzEud3JpdGUoJnByb3RvY29sKTsKLQotICAgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIG15bWFwWzNdID0gInF1eCI7Ci0gICAgbzIuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgYXNzZXJ0KG8xICE9IG8yKTsKLSAgICBvMS5pbV9iaWcuYmFjaygpWzNdID0gInF1eCI7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLQotICAgIG8zLnJlYWQoJnByb3RvY29sKTsKLSAgICBvMy5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBhc3NlcnQobzEgPT0gbzMpOwotCi0gICAgLy9jb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKG8zKSA8PCBlbmRsOwotICB9Ci0KLSAgewotICAgIFRyaWNreTIgdDEsIHQyOwotICAgIGFzc2VydCh0MS5fX2lzc2V0LmltX29wdGlvbmFsID09IGZhbHNlKTsKLSAgICBhc3NlcnQodDIuX19pc3NldC5pbV9vcHRpb25hbCA9PSBmYWxzZSk7Ci0gICAgYXNzZXJ0KHQxID09IHQyKTsKLSAgICB0MS5pbV9vcHRpb25hbCA9IDU7Ci0gICAgYXNzZXJ0KHQxID09IHQyKTsKLSAgICB0Mi5pbV9vcHRpb25hbCA9IDU7Ci0gICAgYXNzZXJ0KHQxID09IHQyKTsKLSAgICB0MS5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICBhc3NlcnQodDEgIT0gdDIpOwotICAgIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIGFzc2VydCh0MSA9PSB0Mik7Ci0gICAgdDEuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICBhc3NlcnQodDEgIT0gdDIpOwotICAgIHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPSBmYWxzZTsKLSAgICBhc3NlcnQodDEgIT0gdDIpOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCBiL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CmluZGV4IDY3ZTZmNTguLmE2MDg4OTggMTAwNjQ0Ci0tLSBhL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CkBAIC0yMSw2ICsyMSw3IEBACiAgKiBkZXRhaWxzLgogICovCiAKK25hbWVzcGFjZSBjX2dsaWIgVFRlc3QKIG5hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QKIG5hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CiAKQEAgLTQ4LDYgKzQ5LDExIEBACiAgIDE6IHJlcXVpcmVkIGkxNiBpbV9yZXF1aXJlZDsKIH0KIAorc3RydWN0IE9wdGlvbmFsRGVmYXVsdCB7CisgIDE6IG9wdGlvbmFsIGkxNiBvcHRfaW50ID0gMTIzNDsKKyAgMjogb3B0aW9uYWwgc3RyaW5nIG9wdF9zdHIgPSAiZGVmYXVsdCI7Cit9CisKIHN0cnVjdCBDb21wbGV4IHsKICAgMTogICAgICAgICAgaTE2IGNwX2RlZmF1bHQ7CiAgIDI6IHJlcXVpcmVkIGkxNiBjcF9yZXF1aXJlZDsKQEAgLTc0LDMgKzgwLDkgQEAKICAgNTogcmVxdWlyZWQgYmluYXJ5IHJlcV9iaW47CiAgIDY6IG9wdGlvbmFsIGJpbmFyeSBvcHRfYmluOwogfQorCitzdHJ1Y3QgQmluYXJpZXMgeworICA0OiBiaW5hcnkgYmluOworICA1OiByZXF1aXJlZCBiaW5hcnkgcmVxX2JpbjsKKyAgNjogb3B0aW9uYWwgYmluYXJ5IG9wdF9iaW47Cit9CmRpZmYgLS1naXQgYS90ZXN0L1JFQURNRS5tZCBiL3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA2ODJmNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDE4NSBAQAorIyBBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZQorCitUaGlzIGlzIHRoZSBjcm9zcyBldmVyeXRoaW5nIGludGVncmF0aW9uIHRlc3Qgc3VpdGUgZm9yIEFwYWNoZSBUaHJpZnQuCisKKyMjIFJ1bgorCisjIyMgQS4gVXNpbmcgTWFrZQorCitUaGUgdGVzdCBjYW4gYmUgZXhlY3V0ZWQgYnk6CisKKyAgICBtYWtlIGNyb3NzCisKK1RoaXMgc3RhcnRzIHRoZSBbdGVzdC5weV0odGVzdC5weSkgc2NyaXB0IHdoaWNoIGRvZXMgdGhlIHJlYWwgY3Jvc3MgdGVzdCB3aXRoCitkaWZmZXJlbnQgdHJhbnNwb3J0cywgcHJvdG9jb2xzIGFuZCBsYW5ndWFnZXMuCisKK05vdGUgdGhhdCB0aGlzIHNraXBzIGFueSBsYW5ndWFnZSB0aGF0IGlzIG5vdCBidWlsdCBsb2NhbGx5LiBJdCBhbHNvIHNraXBzCit0ZXN0cyB0aGF0IGFyZSBrbm93biB0byBiZSBmYWlsaW5nLiBJZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciB3aGljaCB0ZXN0cwordG8gcnVuLCByZWFkIGZvbGxvd2luZyBzZWN0aW9uLgorCisjIyMgQi4gVXNpbmcgdGVzdCBzY3JpcHQgZGlyZWN0bHkKKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnZva2UgW3Rlc3QucHldKHRlc3QucHkpIGRpcmVjdGx5LiBZb3UgbmVlZCB0byBydW5gbWFrZQorcHJlY3Jvc3NgIG9uY2UgYmVmb3JlIGV4ZWN1dGluZyBpdCBmb3IgdGhlIGZpcnN0IHRpbWUuCisKK0ZvciBleGFtcGxlLCBpZiB5b3UgY2hhbmdlZCBzb21ldGhpbmcgaW4gYG5vZGVqc2AgbGlicmFyeSBhbmQgbmVlZCB0byB2ZXJpZnkKK3RoZSBwYXRjaCwgeW91IGNhbiBza2lwIGV2ZXJ5dGhpbmcgZXhjZXB0IGBub2RlanNgIGl0c2VsZiBhbmQgc29tZSByZWZlcmVuY2UKK2ltcGxlbWVudGF0aW9uIChjdXJyZW50bHkgYGNwcGAgYW5kIGBqYXZhYCBhcmUgcmVjb21tZW5kZWQpIGxpa2UgdGhpczoKKworICAgIC4vY29uZmlndXJlIC0td2l0aG91dC1jX2dsaWIgLXdpdGhvdXQtY3NoYXJwIC0td2l0aG91dC1lcmxhbmcgLS13aXRob3V0LWx1YSAuLi4KKyAgICBtYWtlIHByZWNyb3NzIC1qOAorICAgIHRlc3QvdGVzdC5weSAtLXNlcnZlciBjcHAsamF2YSAtLWNsaWVudCBub2RlanMKKyAgICB0ZXN0L3Rlc3QucHkgLS1zZXJ2ZXIgbm9kZWpzIC0tY2xpZW50IGNwcCxqYXZhCisKK0Fub3RoZXIgdXNlZnVsIGZsYWcgaXMgLS1yZWdleC4gRm9yIGV4YW1wbGUsIHRvIHJ1biBhbGwgdGVzdHMgdGhhdCBpbnZvbHZlCitKYXZhIFRCaW5hcnlQcm90b2NvbDoKKworICAgIHRlc3QvdGVzdC5weSAtLXJlZ2V4ICJqYXZhLipiaW5hcnkiCisKKyMjIFRlc3QgY2FzZSBkZWZpbml0aW9uIGZpbGUKKworVGhlIGNyb3NzIHRlc3QgY2FzZXMgYXJlIGRlZmluZWQgaW4gW3Rlc3RzLmpzb25dKHRlc3RzLmpzb24pLgorVGhlIHJvb3QgZWxlbWVudCBpcyBjb2xsZWN0aW9uIG9mIHRlc3QgdGFyZ2V0IGRlZmluaXRpb25zLgorRWFjaCB0ZXN0IHRhcmdldCBkZWZpbml0aW9uIGxvb2tzIGxpa2UgdGhpczoKKworICAgIHsKKyAgICAgICJuYW1lIjogInNvbWVsaWIiLAorCisgICAgICAiY2xpZW50IjogeworICAgICAgICAiY29tbWFuZCI6IFsic29tZWxpYl9jbGllbnRfZXhlY3V0YWJsZSJdLAorICAgICAgICAid29ya2RpciI6ICJzb21lbGliL2JpbiIsCisgICAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgICB9LAorICAgICAgInNlcnZlciI6IHsKKyAgICAgICAgImNvbW1hbmQiOiBbInNvbWVsaWJfc2VydmVyX2V4ZWN1dGFibGUiXSwKKyAgICAgICAgIndvcmtkaXIiOiAic29tZWxpYi9iaW4iLAorICAgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgICAgICJzb2NrZXRzIjogWyJpcCIsICJpcC1zc2wiXSwKKyAgICAgIH0KKyAgICB9CisKK0VpdGhlciBjbGllbnQgb3Igc2VydmVyIGRlZmluaXRpb24gb3IgYm90aCBzaG91bGQgYmUgcHJlc2VudC4KKworUGFyYW1ldGVycyB0aGF0IGFyZSBjb21tb24gdG8gYm90aCBgY2xpZW50YCBhbmQgYHNlcnZlcmAgY2FuIGJlIHB1dCB0byB0YXJnZXQKK2RlZmluaXRpb24gcm9vdDoKKworICAgIHsKKyAgICAgICJuYW1lIjogInNvbWVsaWIiLAorCisgICAgICAid29ya2RpciI6ICJzb21lbGliL2JpbiIsCisgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICAgInNvY2tldHMiOiBbImlwIl0sCisKKyAgICAgICJjbGllbnQiOiB7ICJjb21tYW5kIjogWyJzb21lbGliX2NsaWVudF9leGVjdXRhYmxlIl0gfSwKKyAgICAgICJzZXJ2ZXIiOiB7CisgICAgICAgICJjb21tYW5kIjogWyJzb21lbGliX3NlcnZlcl9leGVjdXRhYmxlIl0sCisgICAgICAgICJzb2NrZXRzIjogWyJpcC1zc2wiXQorICAgICAgfQorICAgIH0KKworRm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBrZXlzIGFuZCB0aGVpciBlZmZlY3QsIHNlZSBzb3VyY2UgY29kZQorY29tbWVudCBhdCB0aGUgb3B0IG9mIFtjcm9zc3J1bm5lci9jb2xsZWN0LnB5XShjcm9zc3J1bm5lci9jb2xsZWN0LnB5KS4KKworCisjIyBMaXN0IG9mIGtub3duIGZhaWx1cmVzCisKK1NpbmNlIG1hbnkgY3Jvc3MgdGVzdHMgY3VycmVudGx5IGZhaWwgKG1haW5seSBkdWUgdG8gcGFydGlhbCBpbmNvbXBhdGliaWxpdHkKK2Fyb3VuZCBleGNlcHRpb24gaGFuZGxpbmcpLCB0aGUgdGVzdCBzY3JpcHQgc3BlY2lmaWNhbGx5IHJlcG9ydCBmb3IgIm5vdCBrbm93bgorYmVmb3JlIiBmYWlsdXJlcy4KKworRm9yIHRoaXMgcHVycG9zZSwgdGVzdCBjYXNlcyBrbm93biB0byAob2NjYXNpb25hbGx5KSBmYWlsIGFyZSBsaXN0ZWQgaW4KK2Brbm93bl9mYWlsdXJlc188cGxhdGZvcm0+Lmpzb25gIHdoZXJlIGA8cGxhdGZvcm0+YCBtYXRjaGVzIHdpdGggcHl0aG9uCitgcGxhdGZvcm0uc3lzdGVtKClgIHN0cmluZy4KKworQ3VycmVudGx5LCBvbmx5IExpbnV4IHZlcnNpb24gaXMgaW5jbHVkZWQuCisKK0ZZSSwgdGhlIGZpbGUgaXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieQorCisgICAgdGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW92ZXJ3cml0ZQorCithZnRlciBhIGZ1bGwgdGVzdCBydW4sIHRoZW4gcmVwZWF0ZWRseQorCisgICAgdGVzdC90ZXN0LnB5IC0tc2tpcC1rbm93bi1mYWlsdXJlcworICAgIHRlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1tZXJnZQorCit0byB1cGRhdGUgdGhlIGtub3duIGZhaWx1cmVzLCBydW4KKworICAgIG1ha2UgZmFpbAorCisjIyBUZXN0IGV4ZWN1dGFibGUgc3BlY2lmaWNhdGlvbgorCisjIyMgQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMKKworVW5pdCB0ZXN0cyBmb3IgbGFuZ3VhZ2VzIGFyZSB1c3VhbGx5IGxvY2F0ZWQgdW5kZXIgbGliLzxsYW5nPi90ZXN0LworY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMgYWNjb3JkaW5nIHRvIFtUaHJpZnRUZXN0LnRocmlmdF0oVGhyaWZ0VGVzdC50aHJpZnQpIHNoYWxsIGJlCitwcm92aWRlZCBmb3IgZXZlcnkgbGFuZ3VhZ2UgaW5jbHVkaW5nIGV4ZWN1dGFibGVzIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kCitsaW5lIGludGVyZmFjZToKKworKipTZXJ2ZXIgY29tbWFuZCBsaW5lIGludGVyZmFjZToqKgorCisgICAgJCAuL2NwcC9UZXN0U2VydmVyIC1oCisgICAgQWxsb3dlZCBvcHRpb25zOgorICAgICAgLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlCisgICAgICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gbGlzdGVuCisgICAgICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpCisgICAgICAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKKyAgICAgIC0tc2VydmVyLXR5cGUgYXJnICg9c2ltcGxlKSB0eXBlIG9mIHNlcnZlciwgInNpbXBsZSIsICJ0aHJlYWQtcG9vbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZGVkIiwgb3IgIm5vbmJsb2NraW5nIgorICAgICAgLS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgYW5vbnBpcGUKKyAgICAgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wKKyAgICAgIC0tcHJvY2Vzc29yLWV2ZW50cyAgICAgICAgICBwcm9jZXNzb3ItZXZlbnRzCisgICAgICAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUKKworKipDbGllbnQgY29tbWFuZCBsaW5lIGludGVyZmFjZToqKgorCisgICAgJCAuL2NwcC9UZXN0Q2xpZW50IC1oCisgICAgQWxsb3dlZCBvcHRpb25zOgorICAgICAgLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlCisgICAgICAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0CisgICAgICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gY29ubmVjdAorICAgICAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0CisgICAgICAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKKyAgICAgIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKQorICAgICAgLS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwCisgICAgICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbgorICAgICAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCisgICAgICAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzCisgICAgICAtdCBbIC0tdGhyZWFkcyBdIGFyZyAoPTEpICAgTnVtYmVyIG9mIFRlc3QgdGhyZWFkcworCitJZiB5b3UgaGF2ZSBleGVjdXRlZCB0aGUgKiptYWtlIGNoZWNrKiogb3IgKiptYWtlIGNyb3NzKiogdGhlbiB5b3Ugd2lsbCBiZSBhYmxlIHRvIGJyb3dzZQorW2dlbi1odG1sL1RocmlmdFRlc3QuaHRtbF0oZ2VuLWh0bWwvVGhyaWZ0VGVzdC5odG1sKSB3aXRoIHRoZSB0ZXN0IGRvY3VtZW50YXRpb24uCisKKyMjIyBSZXR1cm4gY29kZQorCitUaGUgcmV0dXJuIGNvZGUgKGV4aXQgY29kZSkgc2hhbGwgYmUgMCBvbiBzdWNjZXNzLCBvciBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAxIC0gMjU1IG9uIGVycm9ycy4KK0luIG9yZGVyIHRvIHNpZ25hbCBmYWlsZWQgdGVzdHMsIHRoZSByZXR1cm4gY29kZSBzaGFsbCBiZSBjb21wb3NlZCBmcm9tIHRoZXNlIGJpdHMgdG8gaW5kaWNhdGUKK2ZhaWxpbmcgdGVzdHM6CisKKyAgICAgICNkZWZpbmUgVEVTVF9CQVNFVFlQRVMgICAgIDEgIC8vIDAwMDAgMDAwMQorICAgICAgI2RlZmluZSBURVNUX1NUUlVDVFMgICAgICAgMiAgLy8gMDAwMCAwMDEwCisgICAgICAjZGVmaW5lIFRFU1RfQ09OVEFJTkVSUyAgICA0ICAvLyAwMDAwIDAxMDAKKyAgICAgICNkZWZpbmUgVEVTVF9FWENFUFRJT05TICAgIDggIC8vIDAwMDAgMTAwMAorICAgICAgI2RlZmluZSBURVNUX1VOS05PV04gICAgICA2NCAgLy8gMDEwMCAwMDAwIChGYWlsZWQgdG8gcHJlcGFyZSBlbnZpcm9uZW10IGV0Yy4pCisgICAgICAjZGVmaW5lIFRFU1RfVElNRU9VVCAgICAgMTI4ICAvLyAxMDAwIDAwMDAKKyAgICAgICNkZWZpbmUgVEVTVF9OT1RVU0VEICAgICAgNDggIC8vIDAwMTEgMDAwMCAocmVzZXJ2ZWQgYml0cykKKworVGVzdHMgdGhhdCBoYXZlIG5vdCBiZWVuIGV4ZWN1dGVkIGF0IGFsbCBjb3VudCBhcyBlcnJvcnMuCisKKyoqRXhhbXBsZToqKgorCitEdXJpbmcgdGVzdHMsIHRoZSB0ZXN0IGNsaWVudCBub3RpY2VzIHRoYXQgc29tZSBvZiB0aGUgU3RydWN0IHRlc3RzIGZhaWwuCitGdXJ0aGVybW9yZSwgZHVlIHRvIHNvbWUgb3RoZXIgcHJvYmxlbSBub25lIG9mIHRoZSBFeGNlcHRpb24gdGVzdHMgaXMgZXhlY3V0ZWQuCitUaGVyZWZvcmUsIHRoZSB0ZXN0IGNsaWVudCByZXR1cm5zIHRoZSBjb2RlIGAxMCA9IDIgfCA4YCwgaW5kaWNhdGluZyB0aGUgZmFpbHVyZQorb2YgYm90aCB0ZXN0IDIgKFRFU1RfU1RSVUNUUykgYW5kIHRlc3QgOCAoVEVTVF9FWENFUFRJT05TKS4KKworCisjIyBTU0wKK1Rlc3QgS2V5cyBhbmQgQ2VydGlmaWNhdGVzIGFyZSBwcm92aWRlZCBpbiBtdWx0aXBsZSBmb3JtYXRzIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2RpcmVjdG9yeSBbdGVzdC9rZXlzXShrZXlzKQpkaWZmIC0tZ2l0IGEvdGVzdC9SZWN1cnNpdmUudGhyaWZ0IGIvdGVzdC9SZWN1cnNpdmUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODI1ODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzdHJ1Y3QgUmVjVHJlZSB7CisgIDE6IGxpc3Q8UmVjVHJlZT4gY2hpbGRyZW4KKyAgMjogaTE2IGl0ZW0KK30KKworc3RydWN0IFJlY0xpc3QgeworICAxOiBSZWNMaXN0ICYgbmV4dGl0ZW0KKyAgMzogaTE2IGl0ZW0KK30KKworc3RydWN0IENvUmVjIHsKKyAgMTogIENvUmVjMiAmIG90aGVyCit9CisKK3N0cnVjdCBDb1JlYzIgeworICAxOiBDb1JlYyBvdGhlcgorfQorCitzdHJ1Y3QgVmVjdG9yVGVzdCB7CisgIDE6IGxpc3Q8UmVjTGlzdD4gbGlzdGVyOworfQorCitzZXJ2aWNlIFRlc3RTZXJ2aWNlCit7CisgIFJlY1RyZWUgZWNob1RyZWUoMTpSZWNUcmVlIHRyZWUpCisgIFJlY0xpc3QgZWNob0xpc3QoMTpSZWNMaXN0IGxzdCkKKyAgQ29SZWMgZWNob0NvUmVjKDE6Q29SZWMgaXRlbSkKK30KZGlmZiAtLWdpdCBhL3Rlc3QvUmV1c2VPYmplY3RzLnRocmlmdCBiL3Rlc3QvUmV1c2VPYmplY3RzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQ2YzZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9SZXVzZU9iamVjdHMudGhyaWZ0CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhlIGphdmEgY29kZWdlbmVyYXRvciBoYXMgb3B0aW9uIHRvIHJldXNlIG9iamVjdHMgZm9yIGRlc2VyaWFsaXphdGlvbgorCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitpbmNsdWRlICJUaHJpZnRUZXN0LnRocmlmdCIKKworc3RydWN0IFJldXNlIHsKKyAgMTogaTMyIHZhbDE7CisgIDI6IHNldDxzdHJpbmc+IHZhbDI7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQgYi90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CmluZGV4IDg3YzZlNDcuLjQzMTgxMWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKysrIGIvdGVzdC9TdHJlc3NUZXN0LnRocmlmdApAQCAtMTgsMTYgKzE4LDE4IEBACiAgKi8KIAogbmFtZXNwYWNlIGNwcCB0ZXN0LnN0cmVzcworbmFtZXNwYWNlIGQgdGhyaWZ0LnRlc3Quc3RyZXNzCituYW1lc3BhY2UgZ28gc3RyZXNzCiAKIHNlcnZpY2UgU2VydmljZSB7CiAKICAgdm9pZCBlY2hvVm9pZCgpLAotICBieXRlIGVjaG9CeXRlKDE6IGJ5dGUgYXJnKSwKKyAgaTggZWNob0J5dGUoMTogaTggYXJnKSwKICAgaTMyIGVjaG9JMzIoMTogaTMyIGFyZyksCiAgIGk2NCBlY2hvSTY0KDE6IGk2NCBhcmcpLAogICBzdHJpbmcgZWNob1N0cmluZygxOiBzdHJpbmcgYXJnKSwKLSAgbGlzdDxieXRlPiAgZWNob0xpc3QoMTogbGlzdDxieXRlPiBhcmcpLAotICBzZXQ8Ynl0ZT4gIGVjaG9TZXQoMTogc2V0PGJ5dGU+IGFyZyksCi0gIG1hcDxieXRlLCBieXRlPiAgZWNob01hcCgxOiBtYXA8Ynl0ZSwgYnl0ZT4gYXJnKSwKKyAgbGlzdDxpOD4gIGVjaG9MaXN0KDE6IGxpc3Q8aTg+IGFyZyksCisgIHNldDxpOD4gIGVjaG9TZXQoMTogc2V0PGk4PiBhcmcpLAorICBtYXA8aTgsIGk4PiAgZWNob01hcCgxOiBtYXA8aTgsIGk4PiBhcmcpLAogfQogCmRpZmYgLS1naXQgYS90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAgYi90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjQ3NDcuLjAwMDAwMDAKLS0tIGEvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oPgotCi11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydDsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojp0ZXN0OjpUU2hvcnRSZWFkVHJhbnNwb3J0OwotCi0vLyBTaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBabGliVHJhbnNwb3J0LiAgVE9ETzogcmVmYWN0b3IuCi11bnNpZ25lZCBpbnQgZGlzdFtdWzUwMDBdID0gewotIHsgMTw8MTUgfSwKLQotIHsKLSAgNSwxMyw5LDEsOCw5LDExLDEzLDE4LDQ4LDI0LDEzLDIxLDEzLDUsMTEsMzUsMiw0LDIwLDE3LDcyLDI3LDE0LDE1LDQsNywyNiwKLSAgMTIsMSwxNCw5LDIsMTYsMjksNDEsNywyNCw0LDI3LDE0LDQsMSw0LDI1LDMsNiwzNCwxMCw4LDUwLDIsMTQsMTMsNTUsMjksMywKLSAgNDMsNTMsNDksMTQsNCwxMCwzMiwyNyw0OCwxLDMsMSwxMSw1LDE3LDE2LDUxLDE3LDMwLDE1LDExLDksMiwyLDExLDUyLDEyLDIsCi0gIDEzLDk0LDEsMTksMSwzOCwyLDgsNDMsOCwzMyw3LDMwLDgsMTcsMjIsMiwxNSwxNCwxMiwzNCwyLDEyLDYsMzcsMjksNzQsMywKLSAgMTY1LDE2LDExLDE3LDUsMTQsMywxMCw3LDM3LDExLDI0LDcsMSwzLDEyLDM3LDgsOSwzNCwxNywxMiw4LDIxLDEzLDM3LDEsNCwKLSAgMzAsMTQsNzgsNCwxNSwyLDQwLDM3LDE3LDEyLDM2LDgyLDE0LDQsMSw0LDcsMTcsMTEsMTYsODgsNzcsMiwzLDE1LDMsMzQsMTEsCi0gIDUsNzksMjIsMzQsOCw0LDQsNDAsMjIsMjQsMjgsOSwxMywzLDM0LDI3LDksMTYsMzksMTYsMzksMTMsMiw0LDMsNDEsMjYsMTAsNCwKLSAgMzMsNCw3LDEyLDUsNiwzLDEwLDMwLDgsMjEsMTYsNTgsMTksOSwwLDQ3LDcsMTMsMTEsMTksMTUsNyw1Myw1NywyLDEzLDI4LDIyLAotICAzLDE2LDksMjUsMzMsMTIsNDAsNywxMiw2NCw3LDE0LDI0LDQ0LDksMiwxNCwxMSwyLDU4LDEsMjYsMzAsMTEsOSw1LDI0LDcsOSwKLSAgOTQsMiwxMCwyMSw1LDUsNCw1LDYsMTc5LDksMTgsMiw3LDEzLDMxLDQxLDE3LDQsMzYsMywyMSw2LDI2LDgsMTUsMTgsNDQsMjcsCi0gIDExLDksMjUsNywwLDE0LDIsMTIsMjAsMjMsMTMsMiwxNjMsOSw1LDE1LDY1LDIsMTQsNiw4LDk4LDExLDE1LDE0LDM0LDIsMywxMCwKLSAgMjIsOSw5Miw3LDEwLDMyLDY3LDEzLDMsNCwzNSw4LDIsMSw1LDAsMjYsMzgxLDcsMjcsOCwyLDE2LDkzLDQsMTksNSw4LDI1LDksCi0gIDMxLDE0LDQsMjEsNSwzLDksMjIsNTYsNCwxOCwzLDExLDE4LDYsNCwzLDQwLDEyLDE2LDExMCw4LDM1LDE0LDEsMTgsNDAsOSwxMiwKLSAgMTQsMywxMSw3LDU3LDEzLDE4LDExNiw1MywxOSwyMiw3LDE2LDExLDUsOCwyMSwxNiwxLDc1LDIxLDIwLDEsMjgsMiw2LDEsNywKLSAgMTksMzgsNSw2LDksOSw0LDEsNyw1NSwzNiw2Miw1LDQsNCwyNCwxNSwxLDEyLDM1LDQ4LDIwLDUsMTcsMSw1LDI2LDE1LDQsNTQsCi0gIDEzLDUsNSwxNSw1LDE5LDMyLDI5LDMxLDcsNiw0MCw3LDgwLDExLDE4LDgsMTI4LDQ4LDYsMTIsODQsMTMsNCw3LDIsMTMsOSwxNiwKLSAgMTcsMywyNTQsMSw0LDE4MSw4LDQ0LDcsNiwyNCwyNyw5LDIzLDE0LDM0LDE2LDIyLDI1LDEwLDMsMyw0LDQsMTIsMiwxMiw2LDcsCi0gIDEzLDU4LDEzLDYsMTEsMTksNTMsMTEsNjYsMTgsMTksMTAsNCwxMywyLDUsNDksNTgsMSw2Nyw3LDIxLDY0LDE0LDExLDE0LDgsMywKLSAgMjYsMzMsOTEsMzEsMjAsNyw5LDQyLDM5LDQsMyw1NSwxMSwxMCwwLDcsNCw3NSw4LDEyLDAsMjcsMyw4LDksMCwxMiwxMiwyMywKLSAgMjgsMjMsMjAsNCwxMywzMCwyLDIyLDIwLDE5LDMwLDYsMjIsMiw2LDQsMjQsNywxOSw1NSw4Niw1LDMzLDIsMTYxLDYsNywxLDYyLAotICAxMywzLDcyLDEyLDEyLDksNywxMiwxMCw1LDEwLDI5LDEsNSwyMiwxMywxMyw1LDIsMTIsMyw3LDE0LDE4LDIsMyw0NiwyMSwxNywKLSAgMTUsMTksMywyNyw1LDE2LDQ1LDMxLDEwLDgsMTcsMTgsMTgsMyw3LDI0LDYsNTUsOSwzLDYsMTIsMTAsMTIsOCw5MSw5LDQsNCw0LAotICAyNywyOSwxNiw1LDcsMjIsNDMsMjgsMTEsMTQsOCwxMSwyOCwxMDksNTUsNzEsNDAsMyw4LDIyLDI2LDE1LDQ0LDMsMjUsMjksNSwKLSAgMywzMiwxNywxMiwzLDI5LDI3LDI1LDE1LDExLDgsNDAsMzksMzgsMTcsMyw5LDExLDIsMzIsMTEsNiwyMCw0OCw3NSwyNywzLDcsCi0gIDU0LDEyLDk1LDEyLDcsMjQsMjMsMiwxMyw4LDE1LDE2LDUsMTIsNCwxNyw3LDE5LDg4LDIsNiwxMywxMTUsNDUsMTIsMjEsMiw4NiwKLSAgNzQsOSw3LDUsMTYsMzIsMTYsMiwyMSwxOCw2LDM0LDUsMTgsMjYwLDcsMTIsMTYsNDQsMTksOTIsMzEsNyw4LDIsOSwwLDAsMTUsCi0gIDgsMzgsNCw4LDIwLDE4LDIsODMsMywzLDQsOSw1LDMsMTAsMyw1LDI5LDE1LDcsMTEsOCw0OCwxNywyMywyLDE3LDQsMTEsMjIsCi0gIDIxLDY0LDgsOCw0LDE5LDk1LDAsMTcsMjgsOSwxMSwyMCw3MSw1LDExLDE4LDEyLDEzLDQ1LDQ5LDQsMSwzMywzMiwyMywxMyw1LAotICA1MiwyLDIsMTYsMyw0LDcsMTIsMiwxLDEyLDYsMjQsMSwyMiwxNTUsMjEsMyw0NSw0LDEyLDQ0LDI2LDUsNDAsMzYsOSw5LDgsMjAsCi0gIDM1LDMxLDMsMiwzMiw1MCwxMCw4LDM3LDIsNzUsMzUsMjIsMTUsMTkyLDgsMTEsMjMsMSw0LDI5LDYsOCw4LDUsMTIsMTgsMzIsNCwKLSAgNywxMiwyLDAsMCw5LDUsNDgsMTEsMzUsMywxLDEyMyw2LDI5LDgsMTEsOCwyMyw1MSwxNiw2LDYzLDEyLDIsNSw0LDE0LDIsMTUsCi0gIDcsMTQsMywyLDcsMTcsMzIsOCw4LDEwLDEsMjMsNjIsMiw0OSw2LDQ5LDQ3LDIzLDMsMjAsNywxMSwzOSwxMCwyNCw2LDE1LDUsNSwKLSAgMTEsOCwxNiwzNiw4LDEzLDIwLDMsMTAsNDQsNyw1Miw3LDEwLDM2LDYsMTUsMTAsNSwxMSw0LDE0LDE5LDE3LDEwLDEyLDMsNiwKLSAgMjMsNCwxMyw5NCw3MCw3LDM2LDcsMzgsNywyOCw4LDQsMTUsMywxOSw0LDMzLDM5LDIxLDEwOSw0LDgwLDYsNDAsNCw0MzIsNCw0LAotICA3LDgsMywzMSw4LDI4LDM3LDM0LDEwLDIsMjEsNSwyMiwwLDcsMzYsMTQsMTIsNiwyNCwxLDIxLDUsOSwyLDI5LDIwLDU0LDExMywKLSAgMTMsMzEsMzksMjcsNiwwLDI3LDQsNSwyLDQzLDcsOCw1Nyw4LDYyLDcsOSwxMiwyMiw5MCwzMCw2LDE5LDcsMTAsMjAsNiw1LDU4LAotICAzMiwzMCw0MSw0LDEwLDI1LDEzLDMsOCw3LDEwLDIsOSw2LDE1MSw0NCwxNiwxMiwxNiwyMCw4LDMsMTgsMTEsMTcsNCwxMCw0NSwKLSAgMTUsOCw1NiwzOCw1MiwyNSw0MCwxNCw0LDE3LDE1LDgsMiwxOSw3LDgsMjYsMzAsMiwzLDE4MCw4LDI2LDE3LDM4LDM1LDUsMTYsCi0gIDI4LDUsMTUsNTYsMTMsMTQsMTgsOSwxNSw4MywyNywzLDksNCwxMSw4LDI3LDI3LDQ0LDEwLDEyLDgsMyw0OCwxNCw3LDksNCw0LAotICA4LDQsNSw5LDEyMiw4LDE0LDEyLDE5LDE3LDIxLDQsMjksNjMsMjEsMTcsMTAsMTIsMTgsNDcsMTAsMTAsNTMsNCwxOCwxNiw0LDgsCi0gIDExOCw5LDUsMTIsOSwxMSw5LDMsMTIsMzIsMywyMywyLDE1LDMsMywzMCwzLDE3LDIzNSwxNSwyMiw5LDI5OSwxNCwxNywxLDUsCi0gIDE2LDgsMyw3LDMsMTMsMiw3LDYsNCw4LDY2LDIsMTMsNiwxNSwxNiw0NywzLDM2LDUsNywxMCwyNCwxLDksOSw4LDEzLDE2LDI2LAotICAxMiw3LDI0LDIxLDE4LDQ5LDIzLDM5LDEwLDQxLDQsMTMsNCwyNywxMSwxMiwxMiwxOSw0LDE0Nyw4LDEwLDksNDAsMjEsMiw4MywKLSAgMTAsNSw2LDExLDI1LDksNTAsNTcsNDAsMTIsMTIsMjEsMSwzLDI0LDIzLDksMyw5LDEzLDIsMywxMiw1Nyw4LDExLDEzLDE1LDI2LAotICAxNSwxMCw0NywzNiw0LDI1LDEsNSw4LDUsNCwwLDEyLDQ5LDUsMTksNCw2LDE2LDE0LDYsMTAsNjksMTAsMzMsMjksNyw4LDYxLAotICAxMiw0LDAsMyw3LDYsMywxNiwyOSwyNywzOCw0LDIxLDAsMjQsMywyLDEsMTksMTYsMjIsMiw4LDEzOCwxMSw3LDcsMywxMiwyMiwKLSAgMywxNiw1LDcsMyw1Myw5LDEwLDMyLDE0LDUsNywzLDYsMjIsOSw1OSwyNiw4LDcsNTgsNSwxNiwxMSw1NSw3LDQsMTEsMTQ2LDkxLAotICA4LDEzLDE4LDE0LDYsOCw4LDMxLDI2LDIyLDYsMTEsMzAsMTEsMzAsMTUsMTgsMzEsMyw0OCwxNyw3LDYsNCw5LDIsMjUsMywzNSwKLSAgMTMsMTMsNyw4LDQsMzEsMTAsOCwxMCw0LDMsNDUsMTAsMjMsMiw3LDI1OSwxNywyMSwxMywxNCwzLDI2LDMsOCwyNyw0LDE4LDksCi0gIDY2LDcsMTIsNSw4LDE3LDQsMjMsNTUsNDEsNTEsMiwzMiwyNiw2Niw0LDIxLDE0LDEyLDY1LDE2LDIyLDE3LDUsMTQsMiwyOSwyNCwKLSAgNywzLDM2LDIsNDMsNTMsODYsNSwyOCw0LDU4LDEzLDQ5LDEyMSw2LDIsNzMsMiwxLDQ3LDQsMiwyNywxMCwzNSwyOCwyNywxMCwKLSAgMTcsMTAsNTYsNywxMCwxNCwyOCwyMCwyNCw0MCw3LDQsNywzLDEwLDExLDMyLDYsNiwzLDE1LDExLDU0LDU3MywyLDMsNiwyLDMsCi0gIDE0LDY0LDQsMTYsMTIsMTYsNDIsMTAsMjYsNCw2LDExLDY5LDE4LDI3LDIsMiwxNywyMiw5LDEzLDIyLDExLDYsMSwxNSw0OSwzLAotICAxNCwxCi0gfSwKLQotIHsKLSAgMTEsMTEsMTEsMTUsNDcsMSwzLDEsMjMsNSw4LDE4LDMsMjMsMTUsMjEsMSw3LDE5LDEwLDI2LDEsMTcsMTEsMzEsMjEsNDEsMTgsCi0gIDM0LDQsOSw1OCwxOSwzLDMsMzYsNSwxOCwxMywzLDE0LDQsOSwxMCw0LDE5LDU2LDE1LDMsNSwzLDExLDI3LDksNCwxMCwxMyw0LAotICAxMSw2LDksMiwxOCwzLDEwLDE5LDExLDQsNTMsNCwyLDIsMyw0LDU4LDE2LDMsMCw1LDMwLDIsMTEsOTMsMTAsMiwxNCwxMCw2LDIsCi0gIDExNSwyLDI1LDE2LDIyLDM4LDEwMSw0LDE4LDEzLDIsMTQ1LDUxLDQ1LDE1LDE0LDE1LDEzLDIwLDcsMjQsNSwxMywxNCwzMCw0MCwKLSAgMTAsNCwxMDcsMTIsMjQsMTQsMzksMTIsNiwxMywyMCw3LDcsMTEsNSwxOCwxOCw0NSwyMiw2LDM5LDMsMiwxLDUxLDksMTEsNCwKLSAgMTMsOSwzOCw0NCw4LDExLDksMTUsMTksOSwyMywxNywxNywxNywxMyw5LDksMSwxMCw0LDE4LDYsMiw5LDUsMjcsMzIsNzIsOCwKLSAgMzcsOSw0LDEwLDMwLDE3LDIwLDE1LDE3LDY2LDEwLDQsNzMsMzUsMzcsNiw0LDE2LDExNyw0NSwxMyw0LDc1LDUsMjQsNjUsMTAsCi0gIDQsOSw0LDEzLDQ2LDUsMjYsMjksMTAsNCw0LDUyLDMsMTMsMTgsNjMsNiwxNCw5LDI0LDI3Nyw5LDg4LDIsNDgsMjcsMTIzLDE0LAotICA2MSw3LDUsMTAsOCw3LDkwLDMsMTAsMywzLDQ4LDE3LDEzLDEwLDE4LDMzLDIsMTksMzYsNiwyMSwxLDE2LDEyLDUsNiwyLDE2LAotICAxNSwyOSw4OCwyOCwyLDE1LDYsMTEsNCw2LDExLDMsMyw0LDE4LDksNTMsNSw0LDMsMzMsOCw5LDgsNiw3LDM2LDksNjIsMTQsMiwKLSAgMSwxMCwxLDE2LDcsMzIsNywyMywyMCwxMSwxMCwyMywyLDEsMCw5LDE2LDQwLDIsODEsNSwyMiw4LDUsNCwzNyw1MSwzNywxMCwKLSAgMTksNTcsMTEsMiw5MiwzMSw2LDM5LDEwLDEzLDE2LDgsMjAsNiw5LDMsMTAsMTgsMjUsMjMsMTIsMzAsNiwyLDI2LDcsNjQsMTgsCi0gIDYsMzAsMTIsMTMsMjcsNywxMCw1LDMsMzMsMjQsOTksNCwyMyw0LDEsMjcsNywyNyw0OSw4LDIwLDE2LDMsNCwxMyw5LDIyLDY3LAotICAyOCwzLDEwLDE2LDMsMiwxMCw0LDgsMSw4LDE5LDMsODUsNiwyMSwxLDksMTYsMiwzMCwxMCwzMywxMiw0LDksMywxLDYwLDM4LDYsCi0gIDI0LDMyLDMsMTQsMyw0MCw4LDM0LDExNSw1LDksMjcsNSw5NiwzLDQwLDYsMTUsNSw4LDIyLDExMiw1LDUsMjUsMTcsNTgsMiw3LAotICAzNiwyMSw1MiwxLDMsOTUsMTIsMjEsNCwxMSw4LDU5LDI0LDUsMjEsNCw5LDE1LDgsNywyMSwzLDI2LDUsMTEsNiw3LDE3LDY1LAotICAxNCwxMSwxMCwyLDE3LDUsMTIsMjIsNCw0LDIsMjEsOCwxMTIsMywzNCw2MywzNSwyLDI1LDEsMiwxNSw2NSwyMywwLDMsNSwxNSwKLSAgMjYsMjcsOSw1LDQ4LDExLDE1LDQsOSw1LDMzLDIwLDE1LDEsMTgsMTksMTEsMjQsNDAsMTAsMjEsNzQsNiw2LDMyLDMwLDQwLDUsCi0gIDQsNyw0NCwxMCwyNSw0NiwxNiwxMiw1LDQwLDcsMTgsNSwxOCw5LDEyLDgsNCwyNSw1LDYsMzYsNCw0Myw4LDksMTIsMzUsMTcsNCwKLSAgOCw5LDExLDI3LDUsMTAsMTcsNDAsOCwxMiw0LDE4LDksMTgsMTIsMjAsMjUsMzksNDIsMSwyNCwxMywyMiwxNSw3LDExMiwzNSwzLAotICA3LDE3LDMzLDIsNSw1LDE5LDgsNCwxMiwyNCwxNCwxMywyLDEsMTMsNiw1LDE5LDExLDcsNTcsMCwxOSw2LDExNyw0OCwxNCw4LAotICAxMCw1MSwxNywxMiwxNCwyLDUsOCw5LDE1LDQsNDgsNTMsMTMsMjIsNCwyNSwxMiwxMSwxOSw0NSw1LDIsNiw1NCwyMiw5LDE1LDksCi0gIDEzLDIsNywxMSwyOSw4MiwxNiw0Niw0LDI2LDE0LDI2LDQwLDIyLDQsMjYsNiwxOCwxMyw0LDQsMjAsMywzLDcsMTIsMTcsOCw5LAotICAyMyw2LDIwLDcsMjUsMjMsMTksNSwxNSw2LDIzLDE1LDExLDE5LDExLDMsMTcsNTksOCwxOCw0MSw0LDU0LDIzLDQ0LDc1LDEzLAotICAyMCw2LDExLDIsMywxLDEzLDEwLDMsNywxMiwzLDQsNyw4LDMwLDYsNiw3LDMsMzIsOSw1LDI4LDYsMTE0LDQyLDEzLDM2LDI3LAotICA1OSw2LDkzLDEzLDc0LDgsNjksMTQwLDMsMSwxNyw0OCwxMDUsNiwxMSw1LDE1LDEsMTAsMTAsMTQsOCw1MywwLDgsMjQsNjAsMiwKLSAgNiwzNSwyLDEyLDMyLDQ3LDE2LDE3LDc1LDIsNSw0LDM3LDI4LDEwLDUsOSw1Nyw0LDU5LDUsMTIsMTMsNyw5MCw1LDExLDUsMjQsCi0gIDIyLDEzLDMwLDEsMiwxMCw5LDYsMTksMywxOCw0NywyLDUsNyw5LDM1LDE1LDMsNiwxLDIxLDE0LDE0LDE4LDE0LDksMTIsOCw3MywKLSAgNiwxOSwzLDMyLDksMTQsMTcsMTcsNSw1NSwyMyw2LDE2LDI4LDMsMTEsNDgsNCw2LDYsNiwxMiwxNiwzMCwxMCwzMCwyNyw1MSwKLSAgMTgsMjksMiwzLDE1LDEsNzYsMCwxNiwzMyw0LDI3LDMsNjIsNCwxMCwyLDQsOCwxNSw5LDQxLDI2LDIyLDIsNCwyMCw0LDQ5LDAsCi0gIDgsMSw1NywxMywxMiwzOSwzLDYzLDEwLDE5LDM0LDM1LDIsNyw4LDI5LDcyLDQsMTAsMCw3Nyw4LDYsNyw5LDE1LDIxLDksNCwxLAotICAyMCwyMywxLDksMTgsOSwxNSwzNiw0LDcsNiwxNSw1LDcsNyw0MCwyLDksMjIsMiwzLDIwLDQsMTIsMzQsMTMsNiwxOCwxNSwxLAotICAzOCwyMCwxMiw3LDE2LDMsMTksODUsMTIsMTYsMTgsMTYsMiwxNywxLDEzLDgsNiwxMiwxNSw5NywxNywxMiw5LDMsMjEsMTUsMTIsCi0gIDIzLDQ0LDgxLDI2LDMwLDIsNSwxNyw2LDYsMCwyMiw0MiwxOSw2LDE5LDQxLDE0LDM2LDcsMyw1Niw3LDksMywyLDYsOSw2OSwzLAotICAxNSw0LDMwLDI4LDI5LDcsOSwxNSwxNywxNyw2LDEsNiwxNTMsOSwzMyw1LDEyLDE0LDE2LDI4LDMsOCw3LDE0LDEyLDQsNiwzNiwKLSAgOSwyNCwxMywxMyw0LDIsOSwxNSwxOSw5LDUzLDcsMTMsNCwxNTAsMTcsOSwyLDYsMTIsNywzLDUsNTgsMTksNTgsMjgsOCwxNCwzLAotICAyMCwzLDAsMzIsNTYsNyw1LDQsMjcsMSw2OCw0LDI5LDEzLDUsNTgsMiw5LDY1LDQxLDI3LDE2LDE1LDEyLDE0LDIsMTAsOSwyNCwKLSAgMywyLDksMiwyLDMsMTQsMzIsMTAsMjIsMywxMywxMSw0LDYsMzksMTcsMCwxMCw1LDUsMTAsMzUsMTYsMTksMTQsMSw4LDYzLDE5LAotICAxNCw4LDU2LDEwLDIsMTIsNiwxMiw2LDcsMTYsMiw5LDksMTIsMjAsNzMsMjUsMTMsMjEsMTcsMjQsNSwzMiw4LDEyLDI1LDgsMTQsCi0gIDE2LDUsMjMsMyw3LDYsMywxMSwyNCw2LDMwLDQsMjEsMTMsMjgsNCw2LDI5LDE1LDUsMTcsNiwyNiw4LDE1LDgsMyw3LDcsNTAsCi0gIDExLDMwLDYsMiwyOCw1NiwxNiwyNCwyNSwyMywyNCw4OSwzMSwzMSwxMiw3LDIyLDQsMTAsMTcsMywzLDgsMTEsMTMsNSwzLDI3LAotICAxLDEyLDEsMTQsOCwxMCwyOSwyLDUsMiwyLDIwLDEwLDAsMzEsMTAsMjEsMSw0OCwzLDUsNDMsNCw1LDE4LDEzLDUsMTgsMjUsMzQsCi0gIDE4LDMsNSwyMiwxNiwzLDQsMjAsMyw5LDMsMjUsNiw2LDQ0LDIxLDMsMTIsNyw1LDQyLDMsMiwxNCw0LDM2LDUsMyw0NSw1MSwxNSwKLSAgOSwxMSwyOCw5LDcsNiw2LDEyLDI2LDUsMTQsMTAsMTEsNDIsNTUsMTMsMjEsNCwyOCw2LDcsMjMsMjcsMTEsMSw0MSwzNiwwLDMyLAotICAxNSwyNiwyLDMsMjMsMzIsMTEsMiwxNSw3LDI5LDI2LDE0NCwzMywyMCwxMiw3LDIxLDEwLDcsMTEsNjUsNDYsMTAsMTMsMjAsMzIsCi0gIDQsNCw1LDE5LDIsMTksMTUsNDksNDEsMSw3NSwxMCwxMSwyNSwxLDIsNDUsMTEsOCwyNywxOCwxMCw2MCwyOCwyOSwxMiwzMCwxOSwKLSAgMTYsNCwyNCwxMSwxOSwyNywxNyw0OSwxOCw3LDQwLDEzLDE5LDIyLDgsNTUsMTIsMTEsMyw2LDUsMTEsOCwxMCwyMiw1LDksOSwKLSAgMjUsNywxNyw3LDY0LDEsMjQsMiwxMiwxNyw0NCw0LDEyLDI3LDIxLDExLDEwLDcsNDcsNSw5LDEzLDEyLDM4LDI3LDIxLDcsMjksCi0gIDcsMSwxNywzLDMsNSw0OCw2MiwxMCwzLDExLDE3LDE1LDE1LDYsMyw4LDEwLDgsMTgsMTksMTMsMyw5LDcsNiw0NCw5LDEwLDQsCi0gIDQzLDgsNiw2LDE0LDIwLDM4LDI0LDIsNCw1LDUsNyw1LDksMzksOCw0NCw0MCw5LDE5LDcsMywxNSwyNSwyLDM3LDE4LDE1LDksNSwKLSAgOCwzMiwxMCw1LDE4LDQsNyw0NiwyMCwxNywyMyw0LDExLDE2LDE4LDMxLDExLDMsMTEsMSwxNCwxLDI1LDQsMjcsMTMsMTMsMzksCi0gIDE0LDYsNiwzNSw2LDE2LDEzLDExLDEyMiwyMSwxNSwyMCwyNCwxMCw1LDE1MiwxNSwzOSw1LDIwLDE2LDksMTQsNyw1Myw2LDMsOCwKLSAgMTksNjMsMzIsNiwyLDMsMjAsMSwxOSw1LDEzLDQyLDE1LDQsNiw2OCwzMSw0NiwxMSwzOCwxMCwyNCw1LDUsOCw5LDEyLDMsMzUsCi0gIDQ2LDI2LDE2LDIsOCw0LDc0LDE2LDQ0LDQsNSwxLDE2LDQsMTQsMjMsMTYsNjksMTUsNDIsMzEsMTQsNyw3LDYsOTcsMTQsNDAsMSwKLSAgOCw3LDM0LDksMzksMTksMTMsMTUsMTAsMjEsMTgsMTAsNSwxNSwzOCw3LDUsMTIsNywyMCwxNSw0LDExLDYsMTQsNSwxNyw3LDM5LAotICAzNSwzNiwxOCwyMCwyNiwyMiw0LDIsMzYsMjEsNjQsMCw1LDksMTAsNiw0LDEsNywzLDEsMywzLDQsMTAsMjAsOTAsMiwyMiw0OCwKLSAgMTYsMjMsMiwzMyw0MCwxLDIxLDIxLDE3LDIwLDgsOCwxMiw0LDgzLDE0LDQ4LDQsMjEsMyw5LDI3LDUsMTEsNDAsMTUsOSwzLDE2LAotICAxNyw5LDExLDQsMjQsMzEsMTcsMyw0LDIsMTEsMSw4LDQsOCw2LDQxLDE3LDQsMTMsMyw3LDE3LDgsMjcsNSwxMyw2LDEwLDcsMTMsCi0gIDEyLDE4LDEzLDYwLDE4LDMsOCwxLDEyLDEyNSwyLDcsMTYsMiwxMSwyLDQsNywyNiw1LDksMTQsMTQsMTYsOCwxNCw3LDE0LDYsOSwKLSAgMTMsOSw2LDQsMjYsMzUsNDksMzYsNTUsMyw5LDYsNDAsMjYsMjMsMzEsMTksNDEsMiwxMCwzMSw2LDU0LDUsNjksMTYsNyw4LDE2LAotICAxLDUsNyw0LDIyLDcsNyw1LDQsNDgsMTEsMTMsMyw5OCw0LDExLDE5LDQsMiwxNCw3LDM0LDcsMTAsMywyLDEyLDcsNiwyLDUsMTE4Ci0gfSwKLX07Ci0KLXVpbnQ4X3QgZGF0YVsxPDwxNV07Ci1zdHJpbmcgZGF0YV9zdHI7Ci12b2lkIGluaXRfZGF0YSgpIHsKLSAgc3RhdGljIGJvb2wgaW5pdHRlZCA9IGZhbHNlOwotICBpZiAoaW5pdHRlZCkgcmV0dXJuOwotICBpbml0dGVkID0gdHJ1ZTsKLQotICAvLyBSZXBlYXRhYmlsaXR5LiAgS2luZCBvZi4KLSAgc3RkOjpzcmFuZCg0Mik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKGRhdGEpL3NpemVvZihkYXRhWzBdKSk7ICsraSkgewotICAgIGRhdGFbaV0gPSAodWludDhfdClyYW5kKCk7Ci0gIH0KLQotICBkYXRhX3N0ci5hc3NpZ24oKGNoYXIqKWRhdGEsIHNpemVvZihkYXRhKSk7Ci19Ci0KLQotQk9PU1RfQVVUT19URVNUX1NVSVRFKCBUQnVmZmVyQmFzZVRlc3QgKTsKLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfTWVtb3J5QnVmZmVyX1dyaXRlX0dldEJ1ZmZlciApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgZm9yIChpbnQgZDEgPSAwOyBkMSA8IDM7IGQxKyspIHsKLSAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgaW50IGluZGV4ID0gMDsKLQotICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7Ci0gICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOwotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0KLSAgICBzdHJpbmcgb3V0cHV0ID0gYnVmZmVyLmdldEJ1ZmZlckFzU3RyaW5nKCk7Ci0gICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YV9zdHIsIG91dHB1dCk7Ci0gIH0KLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfTWVtb3J5QnVmZmVyX1dyaXRlX1JlYWQgKSB7Ci0gIGluaXRfZGF0YSgpOwotCi0gIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8IDM7IGQyKyspIHsKLSAgICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKLSAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOwotICAgICAgaW50IG9mZnNldDsKLSAgICAgIGludCBpbmRleDsKLQotICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgIGluZGV4ID0gMDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLQotICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgIGluZGV4ID0gMDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICB1bnNpZ25lZCBpbnQgZ290ID0gYnVmZmVyLnJlYWQoJmRhdGFfb3V0W29mZnNldF0sIGRpc3RbZDJdW2luZGV4XSk7Ci0gICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdvdCwgZGlzdFtkMl1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDJdW2luZGV4XTsKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLQotICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9SZWFkU3RyaW5nICkgewotICBpbml0X2RhdGEoKTsKLQotICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewotICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7Ci0gICAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7Ci0gICAgICBzdHJpbmcgb3V0cHV0OwotICAgICAgaW50IG9mZnNldDsKLSAgICAgIGludCBpbmRleDsKLQotICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgIGluZGV4ID0gMDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLQotICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgIGluZGV4ID0gMDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICB1bnNpZ25lZCBpbnQgZ290ID0gYnVmZmVyLnJlYWRBcHBlbmRUb1N0cmluZyhvdXRwdXQsIGRpc3RbZDJdW2luZGV4XSk7Ci0gICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdvdCwgZGlzdFtkMl1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDJdW2luZGV4XTsKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLQotICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwob3V0cHV0LCBkYXRhX3N0cik7Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9SZWFkX011bHRpMSApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgLy8gRG8gc2hvcnRlciB3cml0ZXMgYW5kIHJlYWRzIHNvIHdlIGRvbid0IGFsaWduIHRvIHBvd2VyLW9mLXR3byBib3VuZGFyaWVzLgotCi0gIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8IDM7IGQyKyspIHsKLSAgICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKLSAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOwotICAgICAgaW50IG9mZnNldDsKLSAgICAgIGludCBpbmRleDsKLQotICAgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCA2OyBpdGVyKyspIHsKLSAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgaW5kZXggPSAwOwotICAgICAgICB3aGlsZSAob2Zmc2V0IDwgKDE8PDE1KS00MikgewotICAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICAgIG9mZnNldCArPSBkaXN0W2QxXVtpbmRleF07Ci0gICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKLSAgICAgICAgICBidWZmZXIucmVhZCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMl1baW5kZXhdKTsKLSAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMl1baW5kZXhdOwotICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCAoMTw8MTUpLTQyKSk7Ci0KLSAgICAgICAgLy8gUHVsbCBvdXQgdGhlIGV4dHJhIGRhdGEuCi0gICAgICAgIGJ1ZmZlci5yZWFkKGRhdGFfb3V0LCA0Mik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X01lbW9yeUJ1ZmZlcl9Xcml0ZV9SZWFkX011bHRpMiApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgLy8gRG8gc2hvcnRlciB3cml0ZXMgYW5kIHJlYWRzIHNvIHdlIGRvbid0IGFsaWduIHRvIHBvd2VyLW9mLXR3byBib3VuZGFyaWVzLgotICAvLyBQdWxsIHRoZSBidWZmZXIgb3V0IG9mIHRoZSBsb29wIHNvIGl0cyBzdGF0ZSBnZXRzIHdvcmtlZCBoYXJkZXIuCi0gIFRNZW1vcnlCdWZmZXIgYnVmZmVyKDE2KTsKLQotICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewotICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7Ci0gICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDE1XTsKLSAgICAgIGludCBvZmZzZXQ7Ci0gICAgICBpbnQgaW5kZXg7Ci0KLSAgICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgNjsgaXRlcisrKSB7Ci0gICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgd2hpbGUgKG9mZnNldCA8ICgxPDwxNSktNDIpIHsKLSAgICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOwotICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPCAoMTw8MTUpLTQyKSB7Ci0gICAgICAgICAgYnVmZmVyLnJlYWQoJmRhdGFfb3V0W29mZnNldF0sIGRpc3RbZDJdW2luZGV4XSk7Ci0gICAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDJdW2luZGV4XTsKLSAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgKDE8PDE1KS00MikpOwotCi0gICAgICAgIC8vIFB1bGwgb3V0IHRoZSBleHRyYSBkYXRhLgotICAgICAgICBidWZmZXIucmVhZChkYXRhX291dCwgNDIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9NZW1vcnlCdWZmZXJfV3JpdGVfUmVhZF9JbmNvbXBsZXRlICkgewotICBpbml0X2RhdGEoKTsKLQotICAvLyBEbyBzaG9ydGVyIHdyaXRlcyBhbmQgcmVhZHMgc28gd2UgZG9uJ3QgYWxpZ24gdG8gcG93ZXItb2YtdHdvIGJvdW5kYXJpZXMuCi0gIC8vIFB1bGwgdGhlIGJ1ZmZlciBvdXQgb2YgdGhlIGxvb3Agc28gaXRzIHN0YXRlIGdldHMgd29ya2VkIGhhcmRlci4KLQotICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewotICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAzOyBkMisrKSB7Ci0gICAgICBUTWVtb3J5QnVmZmVyIGJ1ZmZlcigxNik7Ci0gICAgICB1aW50OF90IGRhdGFfb3V0WzE8PDEzXTsKLQotICAgICAgaW50IHdyaXRlX29mZnNldCA9IDA7Ci0gICAgICBpbnQgd3JpdGVfaW5kZXggPSAwOwotICAgICAgdW5zaWduZWQgaW50IHRvX3dyaXRlID0gKDE8PDE0KS00MjsKLSAgICAgIHdoaWxlICh0b193cml0ZSA+IDApIHsKLSAgICAgICAgaW50IHdyaXRlX2FtdCA9IHN0ZDo6bWluKGRpc3RbZDFdW3dyaXRlX2luZGV4XSwgdG9fd3JpdGUpOwotICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbd3JpdGVfb2Zmc2V0XSwgd3JpdGVfYW10KTsKLSAgICAgICAgd3JpdGVfb2Zmc2V0ICs9IHdyaXRlX2FtdDsKLSAgICAgICAgd3JpdGVfaW5kZXgrKzsKLSAgICAgICAgdG9fd3JpdGUgLT0gd3JpdGVfYW10OwotICAgICAgfQotCi0gICAgICBpbnQgcmVhZF9vZmZzZXQgPSAwOwotICAgICAgaW50IHJlYWRfaW5kZXggPSAwOwotICAgICAgdW5zaWduZWQgaW50IHRvX3JlYWQgPSAoMTw8MTMpLTQyOwotICAgICAgd2hpbGUgKHRvX3JlYWQgPiAwKSB7Ci0gICAgICAgIGludCByZWFkX2FtdCA9IHN0ZDo6bWluKGRpc3RbZDJdW3JlYWRfaW5kZXhdLCB0b19yZWFkKTsKLSAgICAgICAgaW50IGdvdCA9IGJ1ZmZlci5yZWFkKCZkYXRhX291dFtyZWFkX29mZnNldF0sIHJlYWRfYW10KTsKLSAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ290LCByZWFkX2FtdCk7Ci0gICAgICAgIHJlYWRfb2Zmc2V0ICs9IHJlYWRfYW10OwotICAgICAgICByZWFkX2luZGV4Kys7Ci0gICAgICAgIHRvX3JlYWQgLT0gcmVhZF9hbXQ7Ci0gICAgICB9Ci0KLSAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsICgxPDwxMyktNDIpKTsKLQotICAgICAgaW50IHNlY29uZF9vZmZzZXQgPSB3cml0ZV9vZmZzZXQ7Ci0gICAgICBpbnQgc2Vjb25kX2luZGV4ID0gd3JpdGVfaW5kZXgtMTsKLSAgICAgIHVuc2lnbmVkIGludCB0b19zZWNvbmQgPSAoMTw8MTQpKzQyOwotICAgICAgd2hpbGUgKHRvX3NlY29uZCA+IDApIHsKLSAgICAgICAgaW50IHNlY29uZF9hbXQgPSBzdGQ6Om1pbihkaXN0W2QxXVtzZWNvbmRfaW5kZXhdLCB0b19zZWNvbmQpOwotICAgICAgICAvL3ByaW50ZigiJWRcbiIsIHNlY29uZF9hbXQpOwotICAgICAgICBidWZmZXIud3JpdGUoJmRhdGFbc2Vjb25kX29mZnNldF0sIHNlY29uZF9hbXQpOwotICAgICAgICBzZWNvbmRfb2Zmc2V0ICs9IHNlY29uZF9hbXQ7Ci0gICAgICAgIHNlY29uZF9pbmRleCsrOwotICAgICAgICB0b19zZWNvbmQgLT0gc2Vjb25kX2FtdDsKLSAgICAgIH0KLQotICAgICAgc3RyaW5nIG91dHB1dCA9IGJ1ZmZlci5nZXRCdWZmZXJBc1N0cmluZygpOwotICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YV9zdHIuc3Vic3RyKCgxPDwxMyktNDIpLCBvdXRwdXQpOwotICAgIH0KLSAgfQotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9CdWZmZXJlZFRyYW5zcG9ydF9Xcml0ZSApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgaW50IHNpemVzW10gPSB7Ci0gICAgMTIsIDE1LCAxNiwgMTcsIDIwLAotICAgIDUwMSwgNTEyLCA1MjMsCi0gICAgMjAwMCwgMjA0OCwgMjA5NiwKLSAgICAxPDwxNCwgMTw8MTcsCi0gIH07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pOyBpKyspIHsKLSAgICBpbnQgc2l6ZSA9IHNpemVzW2ldOwotICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOwotICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7Ci0KLSAgICAgIGludCBvZmZzZXQgPSAwOwotICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCAxPDwxNSkgewotICAgICAgICB0cmFucy53cml0ZSgmZGF0YVtvZmZzZXRdLCBkaXN0W2QxXVtpbmRleF0pOwotICAgICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotICAgICAgdHJhbnMuZmx1c2goKTsKLQotICAgICAgc3RyaW5nIG91dHB1dCA9IGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKTsKLSAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGRhdGFfc3RyLCBvdXRwdXQpOwotICAgIH0KLSAgfQotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9CdWZmZXJlZFRyYW5zcG9ydF9SZWFkX0Z1bGwgKSB7Ci0gIGluaXRfZGF0YSgpOwotCi0gIGludCBzaXplc1tdID0gewotICAgIDEyLCAxNSwgMTYsIDE3LCAyMCwKLSAgICA1MDEsIDUxMiwgNTIzLAotICAgIDIwMDAsIDIwNDgsIDIwOTYsCi0gICAgMTw8MTQsIDE8PDE3LAotICB9OwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKTsgaSsrKSB7Ci0gICAgaW50IHNpemUgPSBzaXplc1tpXTsKLSAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewotICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgc2l6ZW9mKGRhdGEpKSk7Ci0gICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKLSAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOwotCi0gICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKLSAgICAgICAgLy8gTm90ZTogdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCAicmVhZCIgYmVjYXVzZSBUQnVmZmVyZWRUcmFuc3BvcnQKLSAgICAgICAgLy8gZG9lc24ndCB0cnkgbG9vcCBvdmVyIHJlYWRzLCBzbyB3ZSBnZXQgc2hvcnQgcmVhZHMuICBXZSBkb24ndAotICAgICAgICAvLyBjaGVjayB0aGUgcmV0dXJuIHZhbHVlLCBzbyB0aGF0IG1lc3NlcyB1cyB1cC4KLSAgICAgICAgdHJhbnMucmVhZEFsbCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLQotICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0J1ZmZlcmVkVHJhbnNwb3J0X1JlYWRfU2hvcnQgKSB7Ci0gIGluaXRfZGF0YSgpOwotCi0gIGludCBzaXplc1tdID0gewotICAgIDEyLCAxNSwgMTYsIDE3LCAyMCwKLSAgICA1MDEsIDUxMiwgNTIzLAotICAgIDIwMDAsIDIwNDgsIDIwOTYsCi0gICAgMTw8MTQsIDE8PDE3LAotICB9OwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKTsgaSsrKSB7Ci0gICAgaW50IHNpemUgPSBzaXplc1tpXTsKLSAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewotICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgc2l6ZW9mKGRhdGEpKSk7Ci0gICAgICBzaGFyZWRfcHRyPFRTaG9ydFJlYWRUcmFuc3BvcnQ+IHRzaG9ydChuZXcgVFNob3J0UmVhZFRyYW5zcG9ydChidWZmZXIsIDAuMTI1KSk7Ci0gICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKLSAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOwotCi0gICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKLSAgICAgICAgLy8gTm90ZTogdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCAicmVhZCIgYmVjYXVzZSBUQnVmZmVyZWRUcmFuc3BvcnQKLSAgICAgICAgLy8gZG9lc24ndCB0cnkgbG9vcCBvdmVyIHJlYWRzLCBzbyB3ZSBnZXQgc2hvcnQgcmVhZHMuICBXZSBkb24ndAotICAgICAgICAvLyBjaGVjayB0aGUgcmV0dXJuIHZhbHVlLCBzbyB0aGF0IG1lc3NlcyB1cyB1cC4KLSAgICAgICAgdHJhbnMucmVhZEFsbCgmZGF0YV9vdXRbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLQotICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0ZyYW1lZFRyYW5zcG9ydF9Xcml0ZSApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgaW50IHNpemVzW10gPSB7Ci0gICAgMTIsIDE1LCAxNiwgMTcsIDIwLAotICAgIDUwMSwgNTEyLCA1MjMsCi0gICAgMjAwMCwgMjA0OCwgMjA5NiwKLSAgICAxPDwxNCwgMTw8MTcsCi0gIH07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pOyBpKyspIHsKLSAgICBpbnQgc2l6ZSA9IHNpemVzW2ldOwotICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOwotICAgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFucyhidWZmZXIsIHNpemUpOwotCi0gICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKLSAgICAgICAgdHJhbnMud3JpdGUoJmRhdGFbb2Zmc2V0XSwgZGlzdFtkMV1baW5kZXhdKTsKLSAgICAgICAgb2Zmc2V0ICs9IGRpc3RbZDFdW2luZGV4XTsKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLSAgICAgIHRyYW5zLmZsdXNoKCk7Ci0KLSAgICAgIGludDMyX3QgZnJhbWVfc2l6ZSA9IC0xOwotICAgICAgYnVmZmVyLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZmcmFtZV9zaXplKSwgc2l6ZW9mKGZyYW1lX3NpemUpKTsKLSAgICAgIGZyYW1lX3NpemUgPSAoaW50MzJfdCludG9obCgodWludDMyX3QpZnJhbWVfc2l6ZSk7Ci0gICAgICBCT09TVF9DSEVDS19FUVVBTChmcmFtZV9zaXplLCAxPDwxNSk7Ci0gICAgICBCT09TVF9DSEVDS19FUVVBTChkYXRhX3N0ci5zaXplKCksICh1bnNpZ25lZCBpbnQpZnJhbWVfc2l6ZSk7Ci0gICAgICBzdHJpbmcgb3V0cHV0ID0gYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpOwotICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YV9zdHIsIG91dHB1dCk7Ci0gICAgfQotICB9Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X0ZyYW1lZFRyYW5zcG9ydF9SZWFkICkgewotICBpbml0X2RhdGEoKTsKLQotICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewotICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOwotICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyKTsKLSAgICBpbnQzMl90IGxlbmd0aCA9IHNpemVvZihkYXRhKTsKLSAgICBsZW5ndGggPSAoaW50MzJfdClodG9ubCgodWludDMyX3QpbGVuZ3RoKTsKLSAgICBidWZmZXItPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZsZW5ndGgpLCBzaXplb2YobGVuZ3RoKSk7Ci0gICAgYnVmZmVyLT53cml0ZShkYXRhLCBzaXplb2YoZGF0YSkpOwotCi0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAob2Zmc2V0IDwgMTw8MTUpIHsKLSAgICAgIC8vIFRoaXMgc2hvdWxkIHdvcmsgd2l0aCByZWFkIGJlY2F1c2Ugd2UgaGF2ZSBvbmUgaHVnZSBmcmFtZS4KLSAgICAgIHRyYW5zLnJlYWQoJmRhdGFfb3V0W29mZnNldF0sIGRpc3RbZDFdW2luZGV4XSk7Ci0gICAgICBvZmZzZXQgKz0gZGlzdFtkMV1baW5kZXhdOwotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0KLSAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsIGRhdGFfb3V0LCBzaXplb2YoZGF0YSkpKTsKLSAgfQotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9GcmFtZWRUcmFuc3BvcnRfV3JpdGVfUmVhZCApIHsKLSAgaW5pdF9kYXRhKCk7Ci0KLSAgaW50IHNpemVzW10gPSB7Ci0gICAgMTIsIDE1LCAxNiwgMTcsIDIwLAotICAgIDUwMSwgNTEyLCA1MjMsCi0gICAgMjAwMCwgMjA0OCwgMjA5NiwKLSAgICAxPDwxNCwgMTw8MTcsCi0gIH07Ci0KLSAgaW50IHByb2JzW10gPSB7IDEsIDIsIDQsIDgsIDE2LCAzMiwgfTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZiAoc2l6ZXMpIC8gc2l6ZW9mIChzaXplc1swXSk7IGkrKykgewotICAgIGludCBzaXplID0gc2l6ZXNbaV07Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplb2YgKHByb2JzKSAvIHNpemVvZiAocHJvYnNbMF0pOyBqKyspIHsKLSAgICAgIGludCBwcm9iID0gcHJvYnNbal07Ci0gICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewotICAgICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOwotICAgICAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOwotICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGZsdXNoX3NpemVzOwotCi0gICAgICAgIGludCB3cml0ZV9vZmZzZXQgPSAwOwotICAgICAgICBpbnQgd3JpdGVfaW5kZXggPSAwOwotICAgICAgICBpbnQgZmx1c2hfc2l6ZSA9IDA7Ci0gICAgICAgIHdoaWxlICh3cml0ZV9vZmZzZXQgPCAxPDwxNSkgewotICAgICAgICAgIHRyYW5zLndyaXRlKCZkYXRhW3dyaXRlX29mZnNldF0sIGRpc3RbZDFdW3dyaXRlX2luZGV4XSk7Ci0gICAgICAgICAgd3JpdGVfb2Zmc2V0ICs9IGRpc3RbZDFdW3dyaXRlX2luZGV4XTsKLSAgICAgICAgICBmbHVzaF9zaXplICs9IGRpc3RbZDFdW3dyaXRlX2luZGV4XTsKLSAgICAgICAgICB3cml0ZV9pbmRleCsrOwotICAgICAgICAgIGlmIChmbHVzaF9zaXplID4gMCAmJiByYW5kKCklcHJvYiA9PSAwKSB7Ci0gICAgICAgICAgICBmbHVzaF9zaXplcy5wdXNoX2JhY2soZmx1c2hfc2l6ZSk7Ci0gICAgICAgICAgICBmbHVzaF9zaXplID0gMDsKLSAgICAgICAgICAgIHRyYW5zLmZsdXNoKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmbHVzaF9zaXplICE9IDApIHsKLSAgICAgICAgICBmbHVzaF9zaXplcy5wdXNoX2JhY2soZmx1c2hfc2l6ZSk7Ci0gICAgICAgICAgZmx1c2hfc2l6ZSA9IDA7Ci0gICAgICAgICAgdHJhbnMuZmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCByZWFkX29mZnNldCA9IDA7Ci0gICAgICAgIGludCByZWFkX2luZGV4ID0gMDsKLQotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGZsdXNoX3NpemVzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgaW50IGZzaXplID0gZmx1c2hfc2l6ZXNba107Ci0gICAgICAgICAgLy8gV2UgYXJlIGV4cGxvaXRpbmcgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIFRGcmFtZWRUcmFuc3BvcnQuCi0gICAgICAgICAgLy8gVGhlIHJlYWQgYnVmZmVyIHN0YXJ0cyBlbXB0eSBhbmQgaXQgd2lsbCBuZXZlciBkbyBtb3JlIHRoYW4gb25lCi0gICAgICAgICAgLy8gcmVhZEZyYW1lIHBlciByZWFkLCBzbyB3ZSBzaG91bGQgYWx3YXlzIGdldCBleGFjdGx5IG9uZSBmcmFtZS4KLSAgICAgICAgICBpbnQgZ290ID0gdHJhbnMucmVhZCgmZGF0YV9vdXRbcmVhZF9vZmZzZXRdLCAxPDwxNSk7Ci0gICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ290LCBmc2l6ZSk7Ci0gICAgICAgICAgcmVhZF9vZmZzZXQgKz0gZ290OwotICAgICAgICAgIHJlYWRfaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKCh1bnNpZ25lZCBpbnQpcmVhZF9vZmZzZXQsIHNpemVvZihkYXRhKSk7Ci0gICAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsIHNpemVvZihkYXRhKSkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9GcmFtZWRUcmFuc3BvcnRfRW1wdHlfRmx1c2ggKSB7Ci0gIGluaXRfZGF0YSgpOwotCi0gIHN0cmluZyBvdXRwdXQxKCJceDAwXHgwMFx4MDBceDAxIiJhIiwgNSk7Ci0gIHN0cmluZyBvdXRwdXQyKCJceDAwXHgwMFx4MDBceDAxIiJhXHgwMFx4MDBceDAwXHgwMiIiYmMiLCAxMSk7Ci0KLSAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyKTsKLQotICBCT09TVF9DSEVDS19FUVVBTChidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCksICIiKTsKLSAgdHJhbnMuZmx1c2goKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCAiIik7Ci0gIHRyYW5zLmZsdXNoKCk7Ci0gIHRyYW5zLmZsdXNoKCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKSwgIiIpOwotICB0cmFucy53cml0ZSgoY29uc3QgdWludDhfdCopImEiLCAxKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCAiIik7Ci0gIHRyYW5zLmZsdXNoKCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKSwgb3V0cHV0MSk7Ci0gIHRyYW5zLmZsdXNoKCk7Ci0gIHRyYW5zLmZsdXNoKCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKSwgb3V0cHV0MSk7Ci0gIHRyYW5zLndyaXRlKChjb25zdCB1aW50OF90KikiYmMiLCAyKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQxKTsKLSAgdHJhbnMuZmx1c2goKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQyKTsKLSAgdHJhbnMuZmx1c2goKTsKLSAgdHJhbnMuZmx1c2goKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpLCBvdXRwdXQyKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpOwpkaWZmIC0tZ2l0IGEvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcCBiL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzUzOGUuLjAwMDAwMDAKLS0tIGEvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPFRocmlmdC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURkRUcmFuc3BvcnQ7Ci0KLWNsYXNzIER1bW15RXhjZXB0aW9uIDogc3RkOjpleGNlcHRpb24gewotfTsKLQotaW50IG1haW4oKSB7Ci0gIHsKLSAgICBURkRUcmFuc3BvcnQgdCgyNTYsIFRGRFRyYW5zcG9ydDo6Tk9fQ0xPU0VfT05fREVTVFJPWSk7Ci0gIH0KLQotICB0cnkgewotICAgIHsKLSAgICAgIFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKTsKLSAgICB9Ci0gICAgc3RkOjphYm9ydCgpOwotICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKSB7Ci0gIH0KLQotICB0cnkgewotICAgIHsKLSAgICAgIFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKTsKLSAgICAgIHRocm93IER1bW15RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHN0ZDo6YWJvcnQoKTsKLSAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKLSAgICBhYm9ydCgpOwotICB9IGNhdGNoIChEdW1teUV4Y2VwdGlvbiYpIHsKLSAgfQotCi0gIHJldHVybiAwOwotCi19CmRpZmYgLS1naXQgYS90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcCBiL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGMxOWY4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlICJnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCIKLQotQk9PU1RfQVVUT19URVNUX1NVSVRFKCBUTWVtb3J5QnVmZmVyVGVzdCApOwotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9yb3VuZHRyaXAgKSB7Ci0gICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKLSAgICB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLQotICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gc3RyQnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyKSk7Ci0KLSAgICB0aHJpZnQ6OnRlc3Q6Olh0cnVjdCBhOwotICAgIGEuaTMyX3RoaW5nID0gMTA7Ci0gICAgYS5pNjRfdGhpbmcgPSAzMDsKLSAgICBhLnN0cmluZ190aGluZyA9ImhvbGxhIGJhY2sgYSI7Ci0KLSAgICBhLndyaXRlKGJpbmFyeVByb3Rjb2wuZ2V0KCkpOwotICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQgPSBzdHJCdWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCk7Ci0KLSAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHN0ckJ1ZmZlcjIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wyKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyMikpOwotCi0gICAgc3RyQnVmZmVyMi0+cmVzZXRCdWZmZXIoKHVpbnQ4X3QqKXNlcmlhbGl6ZWQuZGF0YSgpLCBzZXJpYWxpemVkLmxlbmd0aCgpKTsKLSAgICB0aHJpZnQ6OnRlc3Q6Olh0cnVjdCBhMjsKLSAgICBhMi5yZWFkKGJpbmFyeVByb3Rjb2wyLmdldCgpKTsKLQotICAgIGFzc2VydChhID09IGEyKTsKLSAgfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9jb3B5ICkKLSAgewotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci0gICAgdXNpbmcgc3RkOjpzdHJpbmc7Ci0gICAgdXNpbmcgc3RkOjpjb3V0OwotICAgIHVzaW5nIHN0ZDo6ZW5kbDsKLQotICAgIHN0cmluZyogc3RyMSA9IG5ldyBzdHJpbmcoImFiY2QxMjM0Iik7Ci0gICAgY29uc3QgY2hhciogZGF0YTEgPSBzdHIxLT5kYXRhKCk7Ci0gICAgVE1lbW9yeUJ1ZmZlciBidWYoKHVpbnQ4X3QqKXN0cjEtPmRhdGEoKSwgc3RyMS0+bGVuZ3RoKCksIFRNZW1vcnlCdWZmZXI6OkNPUFkpOwotICAgIGRlbGV0ZSBzdHIxOwotICAgIHN0cmluZyogc3RyMiA9IG5ldyBzdHJpbmcoInBsc3JldXNlIik7Ci0gICAgYm9vbCBvYmpfcmV1c2UgPSAoc3RyMSA9PSBzdHIyKTsKLSAgICBib29sIGRhdF9yZXVzZSA9IChkYXRhMSA9PSBzdHIyLT5kYXRhKCkpOwotICAgIGNvdXQgPDwgIk9iamVjdCByZXVzZTogIiA8PCBvYmpfcmV1c2UgPDwgIiAgIERhdGEgcmV1c2U6ICIgPDwgZGF0X3JldXNlCi0gICAgICA8PCAoKG9ial9yZXVzZSAmJiBkYXRfcmV1c2UpID8gIiAgIFlBWSEiIDogIiIpIDw8IGVuZGw7Ci0gICAgZGVsZXRlIHN0cjI7Ci0KLSAgICBzdHJpbmcgc3RyMyA9ICJ3eHl6Iiwgc3RyNCA9ICI2Nzg5IjsKLSAgICBidWYucmVhZEFwcGVuZFRvU3RyaW5nKHN0cjMsIDQpOwotICAgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyNCwgSU5UX01BWCk7Ci0KLSAgICBhc3NlcnQoc3RyMyA9PSAid3h5emFiY2QiKTsKLSAgICBhc3NlcnQoc3RyNCA9PSAiNjc4OTEyMzQiKTsKLSAgfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9leGNlcHRpb25zICkKLSAgewotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Ci0gICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgICB1c2luZyBzdGQ6OnN0cmluZzsKLQotICAgIGNoYXIgZGF0YVtdID0gImZvb1wwYmFyIjsKLQotICAgIFRNZW1vcnlCdWZmZXIgYnVmMSgodWludDhfdCopZGF0YSwgNywgVE1lbW9yeUJ1ZmZlcjo6T0JTRVJWRSk7Ci0gICAgc3RyaW5nIHN0ciA9IGJ1ZjEuZ2V0QnVmZmVyQXNTdHJpbmcoKTsKLSAgICBhc3NlcnQoc3RyLmxlbmd0aCgpID09IDcpOwotICAgIGJ1ZjEucmVzZXRCdWZmZXIoKTsKLSAgICB0cnkgewotICAgICAgYnVmMS53cml0ZSgoY29uc3QgdWludDhfdCopImZvbyIsIDMpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkge30KLQotICAgIFRNZW1vcnlCdWZmZXIgYnVmMigodWludDhfdCopZGF0YSwgNywgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1ZjIud3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSJiYXIiLCAzKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpOwpkaWZmIC0tZ2l0IGEvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcCBiL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDhmZDIuLjAwMDAwMDAKLS0tIGEvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPFRocmlmdC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwotCi1pbnQgbWFpbigpIHsKLSAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiB1bmRlcmx5aW5nKG5ldyBUTWVtb3J5QnVmZmVyKTsKLSAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKLSAgc2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnQ+IHRyYW5zKG5ldyBUUGlwZWRUcmFuc3BvcnQodW5kZXJseWluZywgcGlwZSkpOwotCi0gIHVpbnQ4X3QgYnVmZmVyWzRdOwotCi0gIHVuZGVybHlpbmctPndyaXRlKCh1aW50OF90KikiYWJjZCIsIDQpOwotICB0cmFucy0+cmVhZEFsbChidWZmZXIsIDIpOwotICBhc3NlcnQoIHN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiYWIiICk7Ci0gIHRyYW5zLT5yZWFkRW5kKCk7Ci0gIGFzc2VydCggcGlwZS0+Z2V0QnVmZmVyQXNTdHJpbmcoKSA9PSAiYWIiICk7Ci0gIHBpcGUtPnJlc2V0QnVmZmVyKCk7Ci0gIHVuZGVybHlpbmctPndyaXRlKCh1aW50OF90KikiZWYiLCAyKTsKLSAgdHJhbnMtPnJlYWRBbGwoYnVmZmVyLCAyKTsKLSAgYXNzZXJ0KCBzdHJpbmcoKGNoYXIqKWJ1ZmZlciwgMikgPT0gImNkIiApOwotICB0cmFucy0+cmVhZEFsbChidWZmZXIsIDIpOwotICBhc3NlcnQoIHN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiZWYiICk7Ci0gIHRyYW5zLT5yZWFkRW5kKCk7Ci0gIGFzc2VydCggcGlwZS0+Z2V0QnVmZmVyQXNTdHJpbmcoKSA9PSAiY2RlZiIgKTsKLQotICByZXR1cm4gMDsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBiL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKaW5kZXggOTE5YjY4Zi4uMzQ5OWFiNSAxMDA2NDQKLS0tIGEvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKysgYi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CkBAIC0yMSwxMiArMjEsMzAgQEAKICAqIGRldGFpbHMuCiAgKi8KIAorbmFtZXNwYWNlIGNfZ2xpYiBUVGVzdAogbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKIG5hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QKIG5hbWVzcGFjZSByYiBUaHJpZnQuVGVzdAogbmFtZXNwYWNlIHBlcmwgVGhyaWZ0VGVzdAogbmFtZXNwYWNlIGNzaGFycCBUaHJpZnQuVGVzdAogbmFtZXNwYWNlIGpzIFRocmlmdFRlc3QKK25hbWVzcGFjZSBzdCBUaHJpZnRUZXN0CituYW1lc3BhY2UgcHkgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHB5LnR3aXN0ZWQgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGdvIHRocmlmdHRlc3QKK25hbWVzcGFjZSBwaHAgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGRlbHBoaSBUaHJpZnQuVGVzdAorbmFtZXNwYWNlIGNvY29hIFRocmlmdFRlc3QKK25hbWVzcGFjZSBsdWEgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIHhzZCB0ZXN0ICh1cmkgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL25zL1RocmlmdFRlc3QnKQorbmFtZXNwYWNlIG5ldGNvcmUgVGhyaWZ0VGVzdAorCisvLyBQcmVzZW5jZSBvZiBuYW1lc3BhY2VzIGFuZCBzdWItbmFtZXNwYWNlcyBmb3Igd2hpY2ggdGhlcmUgaXMKKy8vIG5vIGdlbmVyYXRvciBzaG91bGQgY29tcGlsZSB3aXRoIHdhcm5pbmdzIG9ubHkKK25hbWVzcGFjZSBub2V4aXN0IFRocmlmdFRlc3QKK25hbWVzcGFjZSBjcHAubm9leGlzdCBUaHJpZnRUZXN0CisKK25hbWVzcGFjZSAqIHRocmlmdC50ZXN0CiAKIC8qKgogICogRG9jc3RyaW5nIQpAQCAtNDEsNiArNTksMTAgQEAKICAgRUlHSFQgPSA4CiB9CiAKK2NvbnN0IE51bWJlcnogbXlOdW1iZXJ6ID0gTnVtYmVyei5PTkU7CisvLyB0aGUgZm9sbG93aW5nIGlzIGV4cGVjdGVkIHRvIGZhaWw6CisvLyBjb25zdCBOdW1iZXJ6IHVyTnVtYmVyeiA9IE9ORTsKKwogdHlwZWRlZiBpNjQgVXNlcklkCiAKIHN0cnVjdCBCb25rCkBAIC00OSw2ICs3MSw4IEBACiAgIDI6IGkzMiB0eXBlCiB9CiAKK3R5cGVkZWYgbWFwPHN0cmluZyxCb25rPiBNYXBUeXBlCisKIHN0cnVjdCBCb29scyB7CiAgIDE6IGJvb2wgaW1fdHJ1ZSwKICAgMjogYm9vbCBpbV9mYWxzZSwKQEAgLTU3LDE0ICs4MSwxNCBAQAogc3RydWN0IFh0cnVjdAogewogICAxOiAgc3RyaW5nIHN0cmluZ190aGluZywKLSAgNDogIGJ5dGUgICBieXRlX3RoaW5nLAorICA0OiAgaTggICAgIGJ5dGVfdGhpbmcsCiAgIDk6ICBpMzIgICAgaTMyX3RoaW5nLAogICAxMTogaTY0ICAgIGk2NF90aGluZwogfQogCiBzdHJ1Y3QgWHRydWN0MgogewotICAxOiBieXRlICAgYnl0ZV90aGluZywKKyAgMTogaTggICAgIGJ5dGVfdGhpbmcsICAvLyB1c2VkIHRvIGJlIGJ5dGUsIGhlbmNlIHRoZSBuYW1lCiAgIDI6IFh0cnVjdCBzdHJ1Y3RfdGhpbmcsCiAgIDM6IGkzMiAgICBpMzJfdGhpbmcKIH0KQEAgLTgyLDEyICsxMDYsMjIgQEAKIHsKICAgMTogbWFwPE51bWJlcnosIFVzZXJJZD4gdXNlck1hcCwKICAgMjogbGlzdDxYdHJ1Y3Q+IHh0cnVjdHMKLX0KK30gKHB5dGhvbi5pbW11dGFibGU9ICIiKQogCiBzdHJ1Y3QgQ3JhenlOZXN0aW5nIHsKICAgMTogc3RyaW5nIHN0cmluZ19maWVsZCwKICAgMjogb3B0aW9uYWwgc2V0PEluc2FuaXR5PiBzZXRfZmllbGQsCi0gIDM6IHJlcXVpcmVkIGxpc3Q8IG1hcDxzZXQ8aTMyPixtYXA8aTMyLHNldDxsaXN0PG1hcDxJbnNhbml0eSxzdHJpbmc+Pj4+Pj4gbGlzdF9maWVsZAorICAvLyBEbyBub3QgaW5zZXJ0IGxpbmUgYnJlYWsgYXMgdGVzdC9nby9NYWtlZmlsZS5hbSBpcyByZW1vdmluZyB0aGlzIGxpbmUgd2l0aCBwYXR0ZXJuIG1hdGNoCisgIDM6IHJlcXVpcmVkIGxpc3Q8bWFwPHNldDxpMzI+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBtYXA8aTMyLHNldDxsaXN0PG1hcDxJbnNhbml0eSxzdHJpbmc+KHB5dGhvbi5pbW11dGFibGUgPSAiIik+IChweXRob24uaW1tdXRhYmxlID0gIiIpPj4+PiBsaXN0X2ZpZWxkLAorICA0OiBiaW5hcnkgYmluYXJ5X2ZpZWxkCit9CisKK3VuaW9uIFNvbWVVbmlvbiB7CisgIDE6IG1hcDxOdW1iZXJ6LCBVc2VySWQ+IG1hcF90aGluZywKKyAgMjogc3RyaW5nIHN0cmluZ190aGluZywKKyAgMzogaTMyIGkzMl90aGluZywKKyAgNDogWHRydWN0MyB4dHJ1Y3RfdGhpbmcsCisgIDU6IEluc2FuaXR5IGluc2FuaXR5X3RoaW5nCiB9CiAKIGV4Y2VwdGlvbiBYY2VwdGlvbiB7CkBAIC0xMDgsNDMgKzE0MiwxOTEgQEAKIAogc2VydmljZSBUaHJpZnRUZXN0CiB7CisgIC8qKgorICAgKiBQcmludHMgInRlc3RWb2lkKCkiIGFuZCByZXR1cm5zIG5vdGhpbmcuCisgICAqLwogICB2b2lkICAgICAgICAgdGVzdFZvaWQoKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0U3RyaW5nKCIlcyIpJyB3aXRoIHRoaW5nIGFzICclcycKKyAgICogQHBhcmFtIHN0cmluZyB0aGluZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQKKyAgICogQHJldHVybiBzdHJpbmcgLSByZXR1cm5zIHRoZSBzdHJpbmcgJ3RoaW5nJworICAgKi8KICAgc3RyaW5nICAgICAgIHRlc3RTdHJpbmcoMTogc3RyaW5nIHRoaW5nKSwKLSAgYnl0ZSAgICAgICAgIHRlc3RCeXRlKDE6IGJ5dGUgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RCb29sKCIlcyIpJyB3aGVyZSAnJXMnIHdpdGggdGhpbmcgYXMgJ3RydWUnIG9yICdmYWxzZScKKyAgICogQHBhcmFtIGJvb2wgIHRoaW5nIC0gdGhlIGJvb2wgZGF0YSB0byBwcmludAorICAgKiBAcmV0dXJuIGJvb2wgIC0gcmV0dXJucyB0aGUgYm9vbCAndGhpbmcnCisgICAqLworICBib29sICAgICAgICAgdGVzdEJvb2woMTogYm9vbCB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdEJ5dGUoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgKiBUaGUgdHlwZXMgaTggYW5kIGJ5dGUgYXJlIHN5bm9ueW1zLCB1c2Ugb2YgaTggaXMgZW5jb3VyYWdlZCwgYnl0ZSBzdGlsbCBleGlzdHMgZm9yIHRoZSBzYWtlIG9mIGNvbXBhdGliaWxpdHkuCisgICAqIEBwYXJhbSBieXRlIHRoaW5nIC0gdGhlIGk4L2J5dGUgdG8gcHJpbnQKKyAgICogQHJldHVybiBpOCAtIHJldHVybnMgdGhlIGk4L2J5dGUgJ3RoaW5nJworICAgKi8KKyAgaTggICAgICAgICAgIHRlc3RCeXRlKDE6IGk4IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0STMyKCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKyAgICogQHBhcmFtIGkzMiB0aGluZyAtIHRoZSBpMzIgdG8gcHJpbnQKKyAgICogQHJldHVybiBpMzIgLSByZXR1cm5zIHRoZSBpMzIgJ3RoaW5nJworICAgKi8KICAgaTMyICAgICAgICAgIHRlc3RJMzIoMTogaTMyIHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0STY0KCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKyAgICogQHBhcmFtIGk2NCB0aGluZyAtIHRoZSBpNjQgdG8gcHJpbnQKKyAgICogQHJldHVybiBpNjQgLSByZXR1cm5zIHRoZSBpNjQgJ3RoaW5nJworICAgKi8KICAgaTY0ICAgICAgICAgIHRlc3RJNjQoMTogaTY0IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0RG91YmxlKCIlZiIpJyB3aXRoIHRoaW5nIGFzICclZicKKyAgICogQHBhcmFtIGRvdWJsZSB0aGluZyAtIHRoZSBkb3VibGUgdG8gcHJpbnQKKyAgICogQHJldHVybiBkb3VibGUgLSByZXR1cm5zIHRoZSBkb3VibGUgJ3RoaW5nJworICAgKi8KICAgZG91YmxlICAgICAgIHRlc3REb3VibGUoMTogZG91YmxlIHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0QmluYXJ5KCIlcyIpJyB3aGVyZSAnJXMnIGlzIGEgaGV4LWZvcm1hdHRlZCBzdHJpbmcgb2YgdGhpbmcncyBkYXRhCisgICAqIEBwYXJhbSBiaW5hcnkgIHRoaW5nIC0gdGhlIGJpbmFyeSBkYXRhIHRvIHByaW50CisgICAqIEByZXR1cm4gYmluYXJ5ICAtIHJldHVybnMgdGhlIGJpbmFyeSAndGhpbmcnCisgICAqLworICBiaW5hcnkgICAgICAgdGVzdEJpbmFyeSgxOiBiaW5hcnkgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RTdHJ1Y3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcworICAgKiBAcGFyYW0gWHRydWN0IHRoaW5nIC0gdGhlIFh0cnVjdCB0byBwcmludAorICAgKiBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgdGhlIFh0cnVjdCAndGhpbmcnCisgICAqLwogICBYdHJ1Y3QgICAgICAgdGVzdFN0cnVjdCgxOiBYdHJ1Y3QgdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3ROZXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mIHRoZSBuZXN0ZWQgc3RydWN0CisgICAqIEBwYXJhbSBYdHJ1Y3QyIHRoaW5nIC0gdGhlIFh0cnVjdDIgdG8gcHJpbnQKKyAgICogQHJldHVybiBYdHJ1Y3QyIC0gcmV0dXJucyB0aGUgWHRydWN0MiAndGhpbmcnCisgICAqLwogICBYdHJ1Y3QyICAgICAgdGVzdE5lc3QoMTogWHRydWN0MiB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdE1hcCgieyVzIiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqIEBwYXJhbSBtYXA8aTMyLGkzMj4gdGhpbmcgLSB0aGUgbWFwPGkzMixpMzI+IHRvIHByaW50CisgICAqIEByZXR1cm4gbWFwPGkzMixpMzI+IC0gcmV0dXJucyB0aGUgbWFwPGkzMixpMzI+ICd0aGluZycKKyAgICovCiAgIG1hcDxpMzIsaTMyPiB0ZXN0TWFwKDE6IG1hcDxpMzIsaTMyPiB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFN0cmluZ01hcCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgJ2tleSA9PiB2YWx1ZScgcGFpcnMKKyAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgKiBAcGFyYW0gbWFwPHN0cmluZyxzdHJpbmc+IHRoaW5nIC0gdGhlIG1hcDxzdHJpbmcsc3RyaW5nPiB0byBwcmludAorICAgKiBAcmV0dXJuIG1hcDxzdHJpbmcsc3RyaW5nPiAtIHJldHVybnMgdGhlIG1hcDxzdHJpbmcsc3RyaW5nPiAndGhpbmcnCisgICAqLworICBtYXA8c3RyaW5nLHN0cmluZz4gdGVzdFN0cmluZ01hcCgxOiBtYXA8c3RyaW5nLHN0cmluZz4gdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RTZXQoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcworICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqIEBwYXJhbSBzZXQ8aTMyPiB0aGluZyAtIHRoZSBzZXQ8aTMyPiB0byBwcmludAorICAgKiBAcmV0dXJuIHNldDxpMzI+IC0gcmV0dXJucyB0aGUgc2V0PGkzMj4gJ3RoaW5nJworICAgKi8KICAgc2V0PGkzMj4gICAgIHRlc3RTZXQoMTogc2V0PGkzMj4gdGhpbmcpLAorCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RMaXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKKyAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgKiBAcGFyYW0gbGlzdDxpMzI+IHRoaW5nIC0gdGhlIGxpc3Q8aTMyPiB0byBwcmludAorICAgKiBAcmV0dXJuIGxpc3Q8aTMyPiAtIHJldHVybnMgdGhlIGxpc3Q8aTMyPiAndGhpbmcnCisgICAqLwogICBsaXN0PGkzMj4gICAgdGVzdExpc3QoMTogbGlzdDxpMzI+IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0RW51bSgiJWQiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gaXQncyBudW1lcmljIHZhbHVlCisgICAqIEBwYXJhbSBOdW1iZXJ6IHRoaW5nIC0gdGhlIE51bWJlcnogdG8gcHJpbnQKKyAgICogQHJldHVybiBOdW1iZXJ6IC0gcmV0dXJucyB0aGUgTnVtYmVyeiAndGhpbmcnCisgICAqLwogICBOdW1iZXJ6ICAgICAgdGVzdEVudW0oMTogTnVtYmVyeiB0aGluZyksCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFR5cGVkZWYoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgKiBAcGFyYW0gVXNlcklkIHRoaW5nIC0gdGhlIFVzZXJJZCB0byBwcmludAorICAgKiBAcmV0dXJuIFVzZXJJZCAtIHJldHVybnMgdGhlIFVzZXJJZCAndGhpbmcnCisgICAqLwogICBVc2VySWQgICAgICAgdGVzdFR5cGVkZWYoMTogVXNlcklkIHRoaW5nKSwKIAorICAvKioKKyAgICogUHJpbnRzICd0ZXN0TWFwTWFwKCIlZCIpJyB3aXRoIGhlbGxvIGFzICclZCcKKyAgICogQHBhcmFtIGkzMiBoZWxsbyAtIHRoZSBpMzIgdG8gcHJpbnQKKyAgICogQHJldHVybiBtYXA8aTMyLG1hcDxpMzIsaTMyPj4gLSByZXR1cm5zIGEgZGljdGlvbmFyeSB3aXRoIHRoZXNlIHZhbHVlczoKKyAgICogICB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LCA0ID0+IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzLCA0ID0+IDQsIH0sIH0KKyAgICovCiAgIG1hcDxpMzIsbWFwPGkzMixpMzI+PiB0ZXN0TWFwTWFwKDE6IGkzMiBoZWxsbyksCiAKLSAgLyogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/ICovCisgIC8qKgorICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICoKKyAgICogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICB9LAorICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAqICAgfQorICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICovCiAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KDE6IEluc2FuaXR5IGFyZ3VtZW50KSwKIAotICAvKiBNdWx0aXBsZSBwYXJhbWV0ZXJzICovCi0gIFh0cnVjdCB0ZXN0TXVsdGkoMTogYnl0ZSBhcmcwLCAyOiBpMzIgYXJnMSwgMzogaTY0IGFyZzIsIDQ6IG1hcDxpMTYsIHN0cmluZz4gYXJnMywgNTogTnVtYmVyeiBhcmc0LCA2OiBVc2VySWQgYXJnNSksCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RNdWx0aSgpJworICAgKiBAcGFyYW0gaTggYXJnMCAtCisgICAqIEBwYXJhbSBpMzIgYXJnMSAtCisgICAqIEBwYXJhbSBpNjQgYXJnMiAtCisgICAqIEBwYXJhbSBtYXA8aTE2LCBzdHJpbmc+IGFyZzMgLQorICAgKiBAcGFyYW0gTnVtYmVyeiBhcmc0IC0KKyAgICogQHBhcmFtIFVzZXJJZCBhcmc1IC0KKyAgICogQHJldHVybiBYdHJ1Y3QgLSByZXR1cm5zIGFuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9ICJIZWxsbzIsIGJ5dGVfdGhpbmcgPSBhcmcwLCBpMzJfdGhpbmcgPSBhcmcxCisgICAqICAgIGFuZCBpNjRfdGhpbmcgPSBhcmcyCisgICAqLworICBYdHJ1Y3QgdGVzdE11bHRpKDE6IGk4IGFyZzAsIDI6IGkzMiBhcmcxLCAzOiBpNjQgYXJnMiwgNDogbWFwPGkxNiwgc3RyaW5nPiBhcmczLCA1OiBOdW1iZXJ6IGFyZzQsIDY6IFVzZXJJZCBhcmc1KSwKIAotICAvKiBFeGNlcHRpb24gc3BlY2lmaWVyICovCi0KKyAgLyoqCisgICAqIFByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgd2l0aCBhcmcgYXMgJyVzJworICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworICAgKiBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSBhcmcKKyAgICogZWxzZW4gaWYgYXJnID09ICJURXhjZXB0aW9uIiB0aHJvdyBURXhjZXB0aW9uCisgICAqIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAqLwogICB2b2lkIHRlc3RFeGNlcHRpb24oMTogc3RyaW5nIGFyZykgdGhyb3dzKDE6IFhjZXB0aW9uIGVycjEpLAogCi0gIC8qIE11bHRpcGxlIGV4Y2VwdGlvbnMgc3BlY2lmaWVyICovCi0KKyAgLyoqCisgICAqIFByaW50ICd0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKScgd2l0aCBhcmcwIGFzICclcycgYW5kIGFyZzEgYXMgJyVzJworICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworICAgKiBpZiBhcmcwID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAqIGVsc2VuIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIgdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICogQHJldHVybiBYdHJ1Y3QgLSBhbiBYdHJ1Y3Qgd2l0aCBzdHJpbmdfdGhpbmcgPSBhcmcxCisgICAqLwogICBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKDE6IHN0cmluZyBhcmcwLCAyOiBzdHJpbmcgYXJnMSkgdGhyb3dzKDE6IFhjZXB0aW9uIGVycjEsIDI6IFhjZXB0aW9uMiBlcnIyKQogCi0gIC8qIFRlc3Qgb25ld2F5IHZvaWQgKi8KKyAgLyoqCisgICAqIFByaW50ICd0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi4nIHdpdGggc2Vjb25kc1RvU2xlZXAgYXMgJyVkJworICAgKiBzbGVlcCAnc2Vjb25kc1RvU2xlZXAnCisgICAqIFByaW50ICd0ZXN0T25ld2F5KCVkKTogZG9uZSBzbGVlcGluZyEnIHdpdGggc2Vjb25kc1RvU2xlZXAgYXMgJyVkJworICAgKiBAcGFyYW0gaTMyIHNlY29uZHNUb1NsZWVwIC0gdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHNsZWVwCisgICAqLwogICBvbmV3YXkgdm9pZCB0ZXN0T25ld2F5KDE6aTMyIHNlY29uZHNUb1NsZWVwKQogfQogCiBzZXJ2aWNlIFNlY29uZFNlcnZpY2UKIHsKLSAgdm9pZCBibGFoQmxhaCgpCisgIC8qKgorICAgKiBQcmludHMgJ3Rlc3RTdHJpbmcoIiVzIiknIHdpdGggdGhpbmcgYXMgJyVzJworICAgKiBAcGFyYW0gc3RyaW5nIHRoaW5nIC0gdGhlIHN0cmluZyB0byBwcmludAorICAgKiBAcmV0dXJuIHN0cmluZyAtIHJldHVybnMgdGhlIHN0cmluZyAndGhpbmcnCisgICAqLworICBzdHJpbmcgc2Vjb25kdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpCiB9CiAKIHN0cnVjdCBWZXJzaW9uaW5nVGVzdFYxIHsKQEAgLTE1Nyw3ICszMzksNyBAQAogICAgICAgIDE6IGkzMiBiZWdpbl9pbl9ib3RoLAogCiAgICAgICAgMjogaTMyIG5ld2ludCwKLSAgICAgICAzOiBieXRlIG5ld2J5dGUsCisgICAgICAgMzogaTggbmV3Ynl0ZSwKICAgICAgICA0OiBpMTYgbmV3c2hvcnQsCiAgICAgICAgNTogaTY0IG5ld2xvbmcsCiAgICAgICAgNjogZG91YmxlIG5ld2RvdWJsZQpAQCAtMTc4LDMgKzM2MCw1MiBAQAogICAgICAgIDE6IGxpc3Q8c3RyaW5nPiBzdHJpbmdzOwogICAgICAgIDI6IHN0cmluZyBoZWxsbzsKIH0KKworc3RydWN0IEd1ZXNzUHJvdG9jb2xTdHJ1Y3QgeworICA3OiBtYXA8c3RyaW5nLHN0cmluZz4gbWFwX2ZpZWxkLAorfQorCitzdHJ1Y3QgTGFyZ2VEZWx0YXMgeworICAxOiBCb29scyBiMSwKKyAgMTA6IEJvb2xzIGIxMCwKKyAgMTAwOiBCb29scyBiMTAwLAorICA1MDA6IGJvb2wgY2hlY2tfdHJ1ZSwKKyAgMTAwMDogQm9vbHMgYjEwMDAsCisgIDE1MDA6IGJvb2wgY2hlY2tfZmFsc2UsCisgIDIwMDA6IFZlcnNpb25pbmdUZXN0VjIgdmVydHdvMjAwMCwKKyAgMjUwMDogc2V0PHN0cmluZz4gYV9zZXQyNTAwLAorICAzMDAwOiBWZXJzaW9uaW5nVGVzdFYyIHZlcnR3bzMwMDAsCisgIDQwMDA6IGxpc3Q8aTMyPiBiaWdfbnVtYmVycworfQorCitzdHJ1Y3QgTmVzdGVkTGlzdHNJMzJ4MiB7CisgIDE6IGxpc3Q8bGlzdDxpMzI+PiBpbnRlZ2VybGlzdAorfQorc3RydWN0IE5lc3RlZExpc3RzSTMyeDMgeworICAxOiBsaXN0PGxpc3Q8bGlzdDxpMzI+Pj4gaW50ZWdlcmxpc3QKK30KK3N0cnVjdCBOZXN0ZWRNaXhlZHgyIHsKKyAgMTogbGlzdDxzZXQ8aTMyPj4gaW50X3NldF9saXN0CisgIDI6IG1hcDxpMzIsc2V0PHN0cmluZz4+IG1hcF9pbnRfc3Ryc2V0CisgIDM6IGxpc3Q8bWFwPGkzMixzZXQ8c3RyaW5nPj4+IG1hcF9pbnRfc3Ryc2V0X2xpc3QKK30KK3N0cnVjdCBMaXN0Qm9ua3MgeworICAxOiBsaXN0PEJvbms+IGJvbmsKK30KK3N0cnVjdCBOZXN0ZWRMaXN0c0JvbmsgeworICAxOiBsaXN0PGxpc3Q8bGlzdDxCb25rPj4+IGJvbmsKK30KKworc3RydWN0IEJvb2xUZXN0IHsKKyAgMTogb3B0aW9uYWwgYm9vbCBiID0gdHJ1ZTsKKyAgMjogb3B0aW9uYWwgc3RyaW5nIHMgPSAidHJ1ZSI7Cit9CisKK3N0cnVjdCBTdHJ1Y3RBIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIHM7Cit9CisKK3N0cnVjdCBTdHJ1Y3RCIHsKKyAgMTogb3B0aW9uYWwgU3RydWN0QSBhYTsKKyAgMjogcmVxdWlyZWQgU3RydWN0QSBhYjsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvVGhyaWZ0VGVzdF9leHRyYXMuY3BwIGIvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OGYyNzYuLjAwMDAwMDAKLS0tIGEvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEV4dHJhIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgVGhyaWZ0VGVzdF90eXBlcyB0byB3b3JrCi0KLSNpbmNsdWRlIDxwcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgotI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgotCi0KLW5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdGVzdCB7Ci0KLWJvb2wgSW5zYW5pdHk6Om9wZXJhdG9yPCh0aHJpZnQ6OnRlc3Q6Okluc2FuaXR5IGNvbnN0JiBvdGhlcikgY29uc3QgewotICB1c2luZyBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmc7Ci0gIHJldHVybiBUaHJpZnREZWJ1Z1N0cmluZygqdGhpcykgPCBUaHJpZnREZWJ1Z1N0cmluZyhvdGhlcik7Ci19Ci0KLX19CmRpZmYgLS1naXQgYS90ZXN0L1R5cGVkZWZUZXN0LnRocmlmdCBiL3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Mzc0NzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1R5cGVkZWZUZXN0LnRocmlmdApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UgY3BwIHRocmlmdC50ZXN0CisKK3R5cGVkZWYgaTMyIE15SW50MzIKK3R5cGVkZWYgc3RyaW5nIE15U3RyaW5nOworCitzdHJ1Y3QgVHlwZWRlZlRlc3RTdHJ1Y3QgeworICAxOiBNeUludDMyIGZpZWxkX015SW50MzI7CisgIDI6IE15U3RyaW5nIGZpZWxkX015U3RyaW5nOworICAzOiBpMzIgZmllbGRfSW50MzI7CisgIDQ6IHN0cmluZyBmaWVsZF9TdHJpbmc7Cit9CisKK3R5cGVkZWYgVHlwZWRlZlRlc3RTdHJ1Y3QgTXlTdHJ1Y3QsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9Vbml0VGVzdE1haW4uY3BwIGIvdGVzdC9Vbml0VGVzdE1haW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGUxZWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvVW5pdFRlc3RNYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSB0aHJpZnQKLSNkZWZpbmUgQk9PU1RfVEVTVF9EWU5fTElOSwotI2RlZmluZSBCT09TVF9BVVRPX1RFU1RfTUFJTgotI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgpkaWZmIC0tZ2l0IGEvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQgYi90ZXN0L1Vuc2FmZVR5cGVzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhjOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitzdHJ1Y3QgVW5zYWZlQnl0ZXMgeworICAxOiBiaW5hcnkgYnl0ZXM7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1psaWJUZXN0LmNwcCBiL3Rlc3QvWmxpYlRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQzZWNjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvWmxpYlRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLXRocmlmdCAtLWdlbiBjcHAgRGVidWdQcm90b1Rlc3QudGhyaWZ0Ci1nKysgLVdhbGwgLWcgLUkuLi9saWIvY3BwL3NyYyAtSS91c3IvbG9jYWwvaW5jbHVkZS9ib29zdC0xXzMzXzEgXAotICBabGliVGVzdC5jcHAgXAotICAuLi9saWIvY3BwLy5saWJzL2xpYnRocmlmdHouYSAuLi9saWIvY3BwLy5saWJzL2xpYnRocmlmdC5hIFwKLSAgLWx6IC1vIFpsaWJUZXN0Ci0uL1psaWJUZXN0Ci0qLwotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+Ci0KLQotLy8gRGlzdHJpYnV0aW9ucyBvZiByZWFkcyBhbmQgd3JpdGVzIG1lYW50IHRvIGFwcHJveGltYXRlIGEgcmVhbCBsb2FkLAotLy8gbWl4aW5nIHVwIHNtYWxsIGFuZCBsYXJnZSB3aGlsZSBhbHNvIGhpdHRpbmcgdmFyaW91cyBib3VuZGFyeSBjb25kaXRpb25zLgotLy8gR2VuZXJhdGVkIGJ5IFB5dGhvbjogaW50KHJhbmRvbS5sb2dub3JtdmFyaWF0ZSgyLjUsIDEpKQotdW5zaWduZWQgaW50IGRpc3RbXVs1MDAwXSA9IHsKLSB7IDE8PDE1IH0sCi0KLSB7Ci0gIDUsMTMsOSwxLDgsOSwxMSwxMywxOCw0OCwyNCwxMywyMSwxMyw1LDExLDM1LDIsNCwyMCwxNyw3MiwyNywxNCwxNSw0LDcsMjYsCi0gIDEyLDEsMTQsOSwyLDE2LDI5LDQxLDcsMjQsNCwyNywxNCw0LDEsNCwyNSwzLDYsMzQsMTAsOCw1MCwyLDE0LDEzLDU1LDI5LDMsCi0gIDQzLDUzLDQ5LDE0LDQsMTAsMzIsMjcsNDgsMSwzLDEsMTEsNSwxNywxNiw1MSwxNywzMCwxNSwxMSw5LDIsMiwxMSw1MiwxMiwyLAotICAxMyw5NCwxLDE5LDEsMzgsMiw4LDQzLDgsMzMsNywzMCw4LDE3LDIyLDIsMTUsMTQsMTIsMzQsMiwxMiw2LDM3LDI5LDc0LDMsCi0gIDE2NSwxNiwxMSwxNyw1LDE0LDMsMTAsNywzNywxMSwyNCw3LDEsMywxMiwzNyw4LDksMzQsMTcsMTIsOCwyMSwxMywzNywxLDQsCi0gIDMwLDE0LDc4LDQsMTUsMiw0MCwzNywxNywxMiwzNiw4MiwxNCw0LDEsNCw3LDE3LDExLDE2LDg4LDc3LDIsMywxNSwzLDM0LDExLAotICA1LDc5LDIyLDM0LDgsNCw0LDQwLDIyLDI0LDI4LDksMTMsMywzNCwyNyw5LDE2LDM5LDE2LDM5LDEzLDIsNCwzLDQxLDI2LDEwLDQsCi0gIDMzLDQsNywxMiw1LDYsMywxMCwzMCw4LDIxLDE2LDU4LDE5LDksMCw0Nyw3LDEzLDExLDE5LDE1LDcsNTMsNTcsMiwxMywyOCwyMiwKLSAgMywxNiw5LDI1LDMzLDEyLDQwLDcsMTIsNjQsNywxNCwyNCw0NCw5LDIsMTQsMTEsMiw1OCwxLDI2LDMwLDExLDksNSwyNCw3LDksCi0gIDk0LDIsMTAsMjEsNSw1LDQsNSw2LDE3OSw5LDE4LDIsNywxMywzMSw0MSwxNyw0LDM2LDMsMjEsNiwyNiw4LDE1LDE4LDQ0LDI3LAotICAxMSw5LDI1LDcsMCwxNCwyLDEyLDIwLDIzLDEzLDIsMTYzLDksNSwxNSw2NSwyLDE0LDYsOCw5OCwxMSwxNSwxNCwzNCwyLDMsMTAsCi0gIDIyLDksOTIsNywxMCwzMiw2NywxMywzLDQsMzUsOCwyLDEsNSwwLDI2LDM4MSw3LDI3LDgsMiwxNiw5Myw0LDE5LDUsOCwyNSw5LAotICAzMSwxNCw0LDIxLDUsMyw5LDIyLDU2LDQsMTgsMywxMSwxOCw2LDQsMyw0MCwxMiwxNiwxMTAsOCwzNSwxNCwxLDE4LDQwLDksMTIsCi0gIDE0LDMsMTEsNyw1NywxMywxOCwxMTYsNTMsMTksMjIsNywxNiwxMSw1LDgsMjEsMTYsMSw3NSwyMSwyMCwxLDI4LDIsNiwxLDcsCi0gIDE5LDM4LDUsNiw5LDksNCwxLDcsNTUsMzYsNjIsNSw0LDQsMjQsMTUsMSwxMiwzNSw0OCwyMCw1LDE3LDEsNSwyNiwxNSw0LDU0LAotICAxMyw1LDUsMTUsNSwxOSwzMiwyOSwzMSw3LDYsNDAsNyw4MCwxMSwxOCw4LDEyOCw0OCw2LDEyLDg0LDEzLDQsNywyLDEzLDksMTYsCi0gIDE3LDMsMjU0LDEsNCwxODEsOCw0NCw3LDYsMjQsMjcsOSwyMywxNCwzNCwxNiwyMiwyNSwxMCwzLDMsNCw0LDEyLDIsMTIsNiw3LAotICAxMyw1OCwxMyw2LDExLDE5LDUzLDExLDY2LDE4LDE5LDEwLDQsMTMsMiw1LDQ5LDU4LDEsNjcsNywyMSw2NCwxNCwxMSwxNCw4LDMsCi0gIDI2LDMzLDkxLDMxLDIwLDcsOSw0MiwzOSw0LDMsNTUsMTEsMTAsMCw3LDQsNzUsOCwxMiwwLDI3LDMsOCw5LDAsMTIsMTIsMjMsCi0gIDI4LDIzLDIwLDQsMTMsMzAsMiwyMiwyMCwxOSwzMCw2LDIyLDIsNiw0LDI0LDcsMTksNTUsODYsNSwzMywyLDE2MSw2LDcsMSw2MiwKLSAgMTMsMyw3MiwxMiwxMiw5LDcsMTIsMTAsNSwxMCwyOSwxLDUsMjIsMTMsMTMsNSwyLDEyLDMsNywxNCwxOCwyLDMsNDYsMjEsMTcsCi0gIDE1LDE5LDMsMjcsNSwxNiw0NSwzMSwxMCw4LDE3LDE4LDE4LDMsNywyNCw2LDU1LDksMyw2LDEyLDEwLDEyLDgsOTEsOSw0LDQsNCwKLSAgMjcsMjksMTYsNSw3LDIyLDQzLDI4LDExLDE0LDgsMTEsMjgsMTA5LDU1LDcxLDQwLDMsOCwyMiwyNiwxNSw0NCwzLDI1LDI5LDUsCi0gIDMsMzIsMTcsMTIsMywyOSwyNywyNSwxNSwxMSw4LDQwLDM5LDM4LDE3LDMsOSwxMSwyLDMyLDExLDYsMjAsNDgsNzUsMjcsMyw3LAotICA1NCwxMiw5NSwxMiw3LDI0LDIzLDIsMTMsOCwxNSwxNiw1LDEyLDQsMTcsNywxOSw4OCwyLDYsMTMsMTE1LDQ1LDEyLDIxLDIsODYsCi0gIDc0LDksNyw1LDE2LDMyLDE2LDIsMjEsMTgsNiwzNCw1LDE4LDI2MCw3LDEyLDE2LDQ0LDE5LDkyLDMxLDcsOCwyLDksMCwwLDE1LAotICA4LDM4LDQsOCwyMCwxOCwyLDgzLDMsMyw0LDksNSwzLDEwLDMsNSwyOSwxNSw3LDExLDgsNDgsMTcsMjMsMiwxNyw0LDExLDIyLAotICAyMSw2NCw4LDgsNCwxOSw5NSwwLDE3LDI4LDksMTEsMjAsNzEsNSwxMSwxOCwxMiwxMyw0NSw0OSw0LDEsMzMsMzIsMjMsMTMsNSwKLSAgNTIsMiwyLDE2LDMsNCw3LDEyLDIsMSwxMiw2LDI0LDEsMjIsMTU1LDIxLDMsNDUsNCwxMiw0NCwyNiw1LDQwLDM2LDksOSw4LDIwLAotICAzNSwzMSwzLDIsMzIsNTAsMTAsOCwzNywyLDc1LDM1LDIyLDE1LDE5Miw4LDExLDIzLDEsNCwyOSw2LDgsOCw1LDEyLDE4LDMyLDQsCi0gIDcsMTIsMiwwLDAsOSw1LDQ4LDExLDM1LDMsMSwxMjMsNiwyOSw4LDExLDgsMjMsNTEsMTYsNiw2MywxMiwyLDUsNCwxNCwyLDE1LAotICA3LDE0LDMsMiw3LDE3LDMyLDgsOCwxMCwxLDIzLDYyLDIsNDksNiw0OSw0NywyMywzLDIwLDcsMTEsMzksMTAsMjQsNiwxNSw1LDUsCi0gIDExLDgsMTYsMzYsOCwxMywyMCwzLDEwLDQ0LDcsNTIsNywxMCwzNiw2LDE1LDEwLDUsMTEsNCwxNCwxOSwxNywxMCwxMiwzLDYsCi0gIDIzLDQsMTMsOTQsNzAsNywzNiw3LDM4LDcsMjgsOCw0LDE1LDMsMTksNCwzMywzOSwyMSwxMDksNCw4MCw2LDQwLDQsNDMyLDQsNCwKLSAgNyw4LDMsMzEsOCwyOCwzNywzNCwxMCwyLDIxLDUsMjIsMCw3LDM2LDE0LDEyLDYsMjQsMSwyMSw1LDksMiwyOSwyMCw1NCwxMTMsCi0gIDEzLDMxLDM5LDI3LDYsMCwyNyw0LDUsMiw0Myw3LDgsNTcsOCw2Miw3LDksMTIsMjIsOTAsMzAsNiwxOSw3LDEwLDIwLDYsNSw1OCwKLSAgMzIsMzAsNDEsNCwxMCwyNSwxMywzLDgsNywxMCwyLDksNiwxNTEsNDQsMTYsMTIsMTYsMjAsOCwzLDE4LDExLDE3LDQsMTAsNDUsCi0gIDE1LDgsNTYsMzgsNTIsMjUsNDAsMTQsNCwxNywxNSw4LDIsMTksNyw4LDI2LDMwLDIsMywxODAsOCwyNiwxNywzOCwzNSw1LDE2LAotICAyOCw1LDE1LDU2LDEzLDE0LDE4LDksMTUsODMsMjcsMyw5LDQsMTEsOCwyNywyNyw0NCwxMCwxMiw4LDMsNDgsMTQsNyw5LDQsNCwKLSAgOCw0LDUsOSwxMjIsOCwxNCwxMiwxOSwxNywyMSw0LDI5LDYzLDIxLDE3LDEwLDEyLDE4LDQ3LDEwLDEwLDUzLDQsMTgsMTYsNCw4LAotICAxMTgsOSw1LDEyLDksMTEsOSwzLDEyLDMyLDMsMjMsMiwxNSwzLDMsMzAsMywxNywyMzUsMTUsMjIsOSwyOTksMTQsMTcsMSw1LAotICAxNiw4LDMsNywzLDEzLDIsNyw2LDQsOCw2NiwyLDEzLDYsMTUsMTYsNDcsMywzNiw1LDcsMTAsMjQsMSw5LDksOCwxMywxNiwyNiwKLSAgMTIsNywyNCwyMSwxOCw0OSwyMywzOSwxMCw0MSw0LDEzLDQsMjcsMTEsMTIsMTIsMTksNCwxNDcsOCwxMCw5LDQwLDIxLDIsODMsCi0gIDEwLDUsNiwxMSwyNSw5LDUwLDU3LDQwLDEyLDEyLDIxLDEsMywyNCwyMyw5LDMsOSwxMywyLDMsMTIsNTcsOCwxMSwxMywxNSwyNiwKLSAgMTUsMTAsNDcsMzYsNCwyNSwxLDUsOCw1LDQsMCwxMiw0OSw1LDE5LDQsNiwxNiwxNCw2LDEwLDY5LDEwLDMzLDI5LDcsOCw2MSwKLSAgMTIsNCwwLDMsNyw2LDMsMTYsMjksMjcsMzgsNCwyMSwwLDI0LDMsMiwxLDE5LDE2LDIyLDIsOCwxMzgsMTEsNyw3LDMsMTIsMjIsCi0gIDMsMTYsNSw3LDMsNTMsOSwxMCwzMiwxNCw1LDcsMyw2LDIyLDksNTksMjYsOCw3LDU4LDUsMTYsMTEsNTUsNyw0LDExLDE0Niw5MSwKLSAgOCwxMywxOCwxNCw2LDgsOCwzMSwyNiwyMiw2LDExLDMwLDExLDMwLDE1LDE4LDMxLDMsNDgsMTcsNyw2LDQsOSwyLDI1LDMsMzUsCi0gIDEzLDEzLDcsOCw0LDMxLDEwLDgsMTAsNCwzLDQ1LDEwLDIzLDIsNywyNTksMTcsMjEsMTMsMTQsMywyNiwzLDgsMjcsNCwxOCw5LAotICA2Niw3LDEyLDUsOCwxNyw0LDIzLDU1LDQxLDUxLDIsMzIsMjYsNjYsNCwyMSwxNCwxMiw2NSwxNiwyMiwxNyw1LDE0LDIsMjksMjQsCi0gIDcsMywzNiwyLDQzLDUzLDg2LDUsMjgsNCw1OCwxMyw0OSwxMjEsNiwyLDczLDIsMSw0Nyw0LDIsMjcsMTAsMzUsMjgsMjcsMTAsCi0gIDE3LDEwLDU2LDcsMTAsMTQsMjgsMjAsMjQsNDAsNyw0LDcsMywxMCwxMSwzMiw2LDYsMywxNSwxMSw1NCw1NzMsMiwzLDYsMiwzLAotICAxNCw2NCw0LDE2LDEyLDE2LDQyLDEwLDI2LDQsNiwxMSw2OSwxOCwyNywyLDIsMTcsMjIsOSwxMywyMiwxMSw2LDEsMTUsNDksMywKLSAgMTQsMQotIH0sCi0KLSB7Ci0gIDExLDExLDExLDE1LDQ3LDEsMywxLDIzLDUsOCwxOCwzLDIzLDE1LDIxLDEsNywxOSwxMCwyNiwxLDE3LDExLDMxLDIxLDQxLDE4LAotICAzNCw0LDksNTgsMTksMywzLDM2LDUsMTgsMTMsMywxNCw0LDksMTAsNCwxOSw1NiwxNSwzLDUsMywxMSwyNyw5LDQsMTAsMTMsNCwKLSAgMTEsNiw5LDIsMTgsMywxMCwxOSwxMSw0LDUzLDQsMiwyLDMsNCw1OCwxNiwzLDAsNSwzMCwyLDExLDkzLDEwLDIsMTQsMTAsNiwyLAotICAxMTUsMiwyNSwxNiwyMiwzOCwxMDEsNCwxOCwxMywyLDE0NSw1MSw0NSwxNSwxNCwxNSwxMywyMCw3LDI0LDUsMTMsMTQsMzAsNDAsCi0gIDEwLDQsMTA3LDEyLDI0LDE0LDM5LDEyLDYsMTMsMjAsNyw3LDExLDUsMTgsMTgsNDUsMjIsNiwzOSwzLDIsMSw1MSw5LDExLDQsCi0gIDEzLDksMzgsNDQsOCwxMSw5LDE1LDE5LDksMjMsMTcsMTcsMTcsMTMsOSw5LDEsMTAsNCwxOCw2LDIsOSw1LDI3LDMyLDcyLDgsCi0gIDM3LDksNCwxMCwzMCwxNywyMCwxNSwxNyw2NiwxMCw0LDczLDM1LDM3LDYsNCwxNiwxMTcsNDUsMTMsNCw3NSw1LDI0LDY1LDEwLAotICA0LDksNCwxMyw0Niw1LDI2LDI5LDEwLDQsNCw1MiwzLDEzLDE4LDYzLDYsMTQsOSwyNCwyNzcsOSw4OCwyLDQ4LDI3LDEyMywxNCwKLSAgNjEsNyw1LDEwLDgsNyw5MCwzLDEwLDMsMyw0OCwxNywxMywxMCwxOCwzMywyLDE5LDM2LDYsMjEsMSwxNiwxMiw1LDYsMiwxNiwKLSAgMTUsMjksODgsMjgsMiwxNSw2LDExLDQsNiwxMSwzLDMsNCwxOCw5LDUzLDUsNCwzLDMzLDgsOSw4LDYsNywzNiw5LDYyLDE0LDIsCi0gIDEsMTAsMSwxNiw3LDMyLDcsMjMsMjAsMTEsMTAsMjMsMiwxLDAsOSwxNiw0MCwyLDgxLDUsMjIsOCw1LDQsMzcsNTEsMzcsMTAsCi0gIDE5LDU3LDExLDIsOTIsMzEsNiwzOSwxMCwxMywxNiw4LDIwLDYsOSwzLDEwLDE4LDI1LDIzLDEyLDMwLDYsMiwyNiw3LDY0LDE4LAotICA2LDMwLDEyLDEzLDI3LDcsMTAsNSwzLDMzLDI0LDk5LDQsMjMsNCwxLDI3LDcsMjcsNDksOCwyMCwxNiwzLDQsMTMsOSwyMiw2NywKLSAgMjgsMywxMCwxNiwzLDIsMTAsNCw4LDEsOCwxOSwzLDg1LDYsMjEsMSw5LDE2LDIsMzAsMTAsMzMsMTIsNCw5LDMsMSw2MCwzOCw2LAotICAyNCwzMiwzLDE0LDMsNDAsOCwzNCwxMTUsNSw5LDI3LDUsOTYsMyw0MCw2LDE1LDUsOCwyMiwxMTIsNSw1LDI1LDE3LDU4LDIsNywKLSAgMzYsMjEsNTIsMSwzLDk1LDEyLDIxLDQsMTEsOCw1OSwyNCw1LDIxLDQsOSwxNSw4LDcsMjEsMywyNiw1LDExLDYsNywxNyw2NSwKLSAgMTQsMTEsMTAsMiwxNyw1LDEyLDIyLDQsNCwyLDIxLDgsMTEyLDMsMzQsNjMsMzUsMiwyNSwxLDIsMTUsNjUsMjMsMCwzLDUsMTUsCi0gIDI2LDI3LDksNSw0OCwxMSwxNSw0LDksNSwzMywyMCwxNSwxLDE4LDE5LDExLDI0LDQwLDEwLDIxLDc0LDYsNiwzMiwzMCw0MCw1LAotICA0LDcsNDQsMTAsMjUsNDYsMTYsMTIsNSw0MCw3LDE4LDUsMTgsOSwxMiw4LDQsMjUsNSw2LDM2LDQsNDMsOCw5LDEyLDM1LDE3LDQsCi0gIDgsOSwxMSwyNyw1LDEwLDE3LDQwLDgsMTIsNCwxOCw5LDE4LDEyLDIwLDI1LDM5LDQyLDEsMjQsMTMsMjIsMTUsNywxMTIsMzUsMywKLSAgNywxNywzMywyLDUsNSwxOSw4LDQsMTIsMjQsMTQsMTMsMiwxLDEzLDYsNSwxOSwxMSw3LDU3LDAsMTksNiwxMTcsNDgsMTQsOCwKLSAgMTAsNTEsMTcsMTIsMTQsMiw1LDgsOSwxNSw0LDQ4LDUzLDEzLDIyLDQsMjUsMTIsMTEsMTksNDUsNSwyLDYsNTQsMjIsOSwxNSw5LAotICAxMywyLDcsMTEsMjksODIsMTYsNDYsNCwyNiwxNCwyNiw0MCwyMiw0LDI2LDYsMTgsMTMsNCw0LDIwLDMsMyw3LDEyLDE3LDgsOSwKLSAgMjMsNiwyMCw3LDI1LDIzLDE5LDUsMTUsNiwyMywxNSwxMSwxOSwxMSwzLDE3LDU5LDgsMTgsNDEsNCw1NCwyMyw0NCw3NSwxMywKLSAgMjAsNiwxMSwyLDMsMSwxMywxMCwzLDcsMTIsMyw0LDcsOCwzMCw2LDYsNywzLDMyLDksNSwyOCw2LDExNCw0MiwxMywzNiwyNywKLSAgNTksNiw5MywxMyw3NCw4LDY5LDE0MCwzLDEsMTcsNDgsMTA1LDYsMTEsNSwxNSwxLDEwLDEwLDE0LDgsNTMsMCw4LDI0LDYwLDIsCi0gIDYsMzUsMiwxMiwzMiw0NywxNiwxNyw3NSwyLDUsNCwzNywyOCwxMCw1LDksNTcsNCw1OSw1LDEyLDEzLDcsOTAsNSwxMSw1LDI0LAotICAyMiwxMywzMCwxLDIsMTAsOSw2LDE5LDMsMTgsNDcsMiw1LDcsOSwzNSwxNSwzLDYsMSwyMSwxNCwxNCwxOCwxNCw5LDEyLDgsNzMsCi0gIDYsMTksMywzMiw5LDE0LDE3LDE3LDUsNTUsMjMsNiwxNiwyOCwzLDExLDQ4LDQsNiw2LDYsMTIsMTYsMzAsMTAsMzAsMjcsNTEsCi0gIDE4LDI5LDIsMywxNSwxLDc2LDAsMTYsMzMsNCwyNywzLDYyLDQsMTAsMiw0LDgsMTUsOSw0MSwyNiwyMiwyLDQsMjAsNCw0OSwwLAotICA4LDEsNTcsMTMsMTIsMzksMyw2MywxMCwxOSwzNCwzNSwyLDcsOCwyOSw3Miw0LDEwLDAsNzcsOCw2LDcsOSwxNSwyMSw5LDQsMSwKLSAgMjAsMjMsMSw5LDE4LDksMTUsMzYsNCw3LDYsMTUsNSw3LDcsNDAsMiw5LDIyLDIsMywyMCw0LDEyLDM0LDEzLDYsMTgsMTUsMSwKLSAgMzgsMjAsMTIsNywxNiwzLDE5LDg1LDEyLDE2LDE4LDE2LDIsMTcsMSwxMyw4LDYsMTIsMTUsOTcsMTcsMTIsOSwzLDIxLDE1LDEyLAotICAyMyw0NCw4MSwyNiwzMCwyLDUsMTcsNiw2LDAsMjIsNDIsMTksNiwxOSw0MSwxNCwzNiw3LDMsNTYsNyw5LDMsMiw2LDksNjksMywKLSAgMTUsNCwzMCwyOCwyOSw3LDksMTUsMTcsMTcsNiwxLDYsMTUzLDksMzMsNSwxMiwxNCwxNiwyOCwzLDgsNywxNCwxMiw0LDYsMzYsCi0gIDksMjQsMTMsMTMsNCwyLDksMTUsMTksOSw1Myw3LDEzLDQsMTUwLDE3LDksMiw2LDEyLDcsMyw1LDU4LDE5LDU4LDI4LDgsMTQsMywKLSAgMjAsMywwLDMyLDU2LDcsNSw0LDI3LDEsNjgsNCwyOSwxMyw1LDU4LDIsOSw2NSw0MSwyNywxNiwxNSwxMiwxNCwyLDEwLDksMjQsCi0gIDMsMiw5LDIsMiwzLDE0LDMyLDEwLDIyLDMsMTMsMTEsNCw2LDM5LDE3LDAsMTAsNSw1LDEwLDM1LDE2LDE5LDE0LDEsOCw2MywxOSwKLSAgMTQsOCw1NiwxMCwyLDEyLDYsMTIsNiw3LDE2LDIsOSw5LDEyLDIwLDczLDI1LDEzLDIxLDE3LDI0LDUsMzIsOCwxMiwyNSw4LDE0LAotICAxNiw1LDIzLDMsNyw2LDMsMTEsMjQsNiwzMCw0LDIxLDEzLDI4LDQsNiwyOSwxNSw1LDE3LDYsMjYsOCwxNSw4LDMsNyw3LDUwLAotICAxMSwzMCw2LDIsMjgsNTYsMTYsMjQsMjUsMjMsMjQsODksMzEsMzEsMTIsNywyMiw0LDEwLDE3LDMsMyw4LDExLDEzLDUsMywyNywKLSAgMSwxMiwxLDE0LDgsMTAsMjksMiw1LDIsMiwyMCwxMCwwLDMxLDEwLDIxLDEsNDgsMyw1LDQzLDQsNSwxOCwxMyw1LDE4LDI1LDM0LAotICAxOCwzLDUsMjIsMTYsMyw0LDIwLDMsOSwzLDI1LDYsNiw0NCwyMSwzLDEyLDcsNSw0MiwzLDIsMTQsNCwzNiw1LDMsNDUsNTEsMTUsCi0gIDksMTEsMjgsOSw3LDYsNiwxMiwyNiw1LDE0LDEwLDExLDQyLDU1LDEzLDIxLDQsMjgsNiw3LDIzLDI3LDExLDEsNDEsMzYsMCwzMiwKLSAgMTUsMjYsMiwzLDIzLDMyLDExLDIsMTUsNywyOSwyNiwxNDQsMzMsMjAsMTIsNywyMSwxMCw3LDExLDY1LDQ2LDEwLDEzLDIwLDMyLAotICA0LDQsNSwxOSwyLDE5LDE1LDQ5LDQxLDEsNzUsMTAsMTEsMjUsMSwyLDQ1LDExLDgsMjcsMTgsMTAsNjAsMjgsMjksMTIsMzAsMTksCi0gIDE2LDQsMjQsMTEsMTksMjcsMTcsNDksMTgsNyw0MCwxMywxOSwyMiw4LDU1LDEyLDExLDMsNiw1LDExLDgsMTAsMjIsNSw5LDksCi0gIDI1LDcsMTcsNyw2NCwxLDI0LDIsMTIsMTcsNDQsNCwxMiwyNywyMSwxMSwxMCw3LDQ3LDUsOSwxMywxMiwzOCwyNywyMSw3LDI5LAotICA3LDEsMTcsMywzLDUsNDgsNjIsMTAsMywxMSwxNywxNSwxNSw2LDMsOCwxMCw4LDE4LDE5LDEzLDMsOSw3LDYsNDQsOSwxMCw0LAotICA0Myw4LDYsNiwxNCwyMCwzOCwyNCwyLDQsNSw1LDcsNSw5LDM5LDgsNDQsNDAsOSwxOSw3LDMsMTUsMjUsMiwzNywxOCwxNSw5LDUsCi0gIDgsMzIsMTAsNSwxOCw0LDcsNDYsMjAsMTcsMjMsNCwxMSwxNiwxOCwzMSwxMSwzLDExLDEsMTQsMSwyNSw0LDI3LDEzLDEzLDM5LAotICAxNCw2LDYsMzUsNiwxNiwxMywxMSwxMjIsMjEsMTUsMjAsMjQsMTAsNSwxNTIsMTUsMzksNSwyMCwxNiw5LDE0LDcsNTMsNiwzLDgsCi0gIDE5LDYzLDMyLDYsMiwzLDIwLDEsMTksNSwxMyw0MiwxNSw0LDYsNjgsMzEsNDYsMTEsMzgsMTAsMjQsNSw1LDgsOSwxMiwzLDM1LAotICA0NiwyNiwxNiwyLDgsNCw3NCwxNiw0NCw0LDUsMSwxNiw0LDE0LDIzLDE2LDY5LDE1LDQyLDMxLDE0LDcsNyw2LDk3LDE0LDQwLDEsCi0gIDgsNywzNCw5LDM5LDE5LDEzLDE1LDEwLDIxLDE4LDEwLDUsMTUsMzgsNyw1LDEyLDcsMjAsMTUsNCwxMSw2LDE0LDUsMTcsNywzOSwKLSAgMzUsMzYsMTgsMjAsMjYsMjIsNCwyLDM2LDIxLDY0LDAsNSw5LDEwLDYsNCwxLDcsMywxLDMsMyw0LDEwLDIwLDkwLDIsMjIsNDgsCi0gIDE2LDIzLDIsMzMsNDAsMSwyMSwyMSwxNywyMCw4LDgsMTIsNCw4MywxNCw0OCw0LDIxLDMsOSwyNyw1LDExLDQwLDE1LDksMywxNiwKLSAgMTcsOSwxMSw0LDI0LDMxLDE3LDMsNCwyLDExLDEsOCw0LDgsNiw0MSwxNyw0LDEzLDMsNywxNyw4LDI3LDUsMTMsNiwxMCw3LDEzLAotICAxMiwxOCwxMyw2MCwxOCwzLDgsMSwxMiwxMjUsMiw3LDE2LDIsMTEsMiw0LDcsMjYsNSw5LDE0LDE0LDE2LDgsMTQsNywxNCw2LDksCi0gIDEzLDksNiw0LDI2LDM1LDQ5LDM2LDU1LDMsOSw2LDQwLDI2LDIzLDMxLDE5LDQxLDIsMTAsMzEsNiw1NCw1LDY5LDE2LDcsOCwxNiwKLSAgMSw1LDcsNCwyMiw3LDcsNSw0LDQ4LDExLDEzLDMsOTgsNCwxMSwxOSw0LDIsMTQsNywzNCw3LDEwLDMsMiwxMiw3LDYsMiw1LDExOAotIH0sCi19OwotCi0KLWludCBtYWluKCkgewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotCi0gIGNoYXIgKmZpbGVfbmFtZXNbXSA9IHsKLSAgICAvLyBIaWdobHkgY29tcHJlc3NpYmxlLgotICAgICIuL2dlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIiwKLSAgICAvLyBVbmNvbXByZXNzaWJsZS4KLSAgICAiL2Rldi91cmFuZG9tIiwKLSAgICAvLyBOdWxsLXRlcm1pbmF0ZWQuCi0gICAgTlVMTCwKLSAgfTsKLQotCi0gIGZvciAoY2hhcioqIGZuYW1lcCA9ICZmaWxlX25hbWVzWzBdOyAqZm5hbWVwICE9IE5VTEw7IGZuYW1lcCsrKSB7Ci0gICAgaWZzdHJlYW0gZmlsZSgqZm5hbWVwKTsKLSAgICBjaGFyIGJ1ZlszMioxMDI0XTsKLSAgICBmaWxlLnJlYWQoYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgdmVjdG9yPHVpbnQ4X3Q+IGNvbnRlbnQoYnVmLCBidWYrZmlsZS5nY291bnQoKSk7Ci0gICAgdmVjdG9yPHVpbnQ4X3Q+IG1pcnJvcjsKLSAgICBmaWxlLmNsb3NlKCk7Ci0KLSAgICBhc3NlcnQoY29udGVudC5zaXplKCkgPT0gMzIqMTAyNCk7Ci0KLSAgICAvLyBMZXQncyBqdXN0IHN0YXJ0IHdpdGggdGhlIGJpZyBkb2chCi0gICAgewotICAgICAgbWlycm9yLmNsZWFyKCk7Ci0gICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgICAgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZiwgZmFsc2UpKTsKLSAgICAgIHpsaWJfdHJhbnMtPndyaXRlKCZjb250ZW50WzBdLCBjb250ZW50LnNpemUoKSk7Ci0gICAgICB6bGliX3RyYW5zLT5mbHVzaCgpOwotICAgICAgbWlycm9yLnJlc2l6ZShjb250ZW50LnNpemUoKSk7Ci0gICAgICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkKCZtaXJyb3JbMF0sIG1pcnJvci5zaXplKCkpOwotICAgICAgYXNzZXJ0KGdvdCA9PSBjb250ZW50LnNpemUoKSk7Ci0gICAgICBhc3NlcnQobWlycm9yID09IGNvbnRlbnQpOwotICAgICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIG9uZSBpcyB0cmlja3kuICBJIHNlcGFyYXRlIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHN0cmVhbSBvdXQKLSAgICAvLyBpbnRvIGEgc2VwYXJhdGUgY3JidWZfLiAgVGhlIGxhc3QgYnl0ZSBpcyBwYXJ0IG9mIHRoZSBjaGVja3N1bSwKLSAgICAvLyBzbyB0aGUgZW50aXJlIHJlYWQgZ29lcyBmaW5lLCBidXQgd2hlbiBJIGdvIHRvIHZlcmlmeSB0aGUgY2hlY2tzdW0KLSAgICAvLyBpdCBpc24ndCB0aGVyZS4gIFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBjb21wbGFpbmVkIHRoYXQKLSAgICAvLyB0aGUgc3RyZWFtIHdhcyBub3QgY29tcGxldGUuICBJJ20gYWJvdXQgdG8gZ28gZml4IHRoYXQuCi0gICAgLy8gSXQgd29ya2VkLiAgQXdlc29tZS4KLSAgICB7Ci0gICAgICBtaXJyb3IuY2xlYXIoKTsKLSAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgICAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmLCBmYWxzZSkpOwotICAgICAgemxpYl90cmFucy0+d3JpdGUoJmNvbnRlbnRbMF0sIGNvbnRlbnQuc2l6ZSgpKTsKLSAgICAgIHpsaWJfdHJhbnMtPmZsdXNoKCk7Ci0gICAgICBzdHJpbmcgdG1wX2J1ZjsKLSAgICAgIG1lbWJ1Zi0+YXBwZW5kQnVmZmVyVG9TdHJpbmcodG1wX2J1Zik7Ci0gICAgICB6bGliX3RyYW5zLnJlc2V0KG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYsIGZhbHNlLAotICAgICAgICAgICAgVFpsaWJUcmFuc3BvcnQ6OkRFRkFVTFRfVVJCVUZfU0laRSwKLSAgICAgICAgICAgIHRtcF9idWYubGVuZ3RoKCktMSkpOwotICAgICAgbWlycm9yLnJlc2l6ZShjb250ZW50LnNpemUoKSk7Ci0gICAgICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkKCZtaXJyb3JbMF0sIG1pcnJvci5zaXplKCkpOwotICAgICAgYXNzZXJ0KGdvdCA9PSBjb250ZW50LnNpemUoKSk7Ci0gICAgICBhc3NlcnQobWlycm9yID09IGNvbnRlbnQpOwotICAgICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgd2Ugc3RpbGwgZ2V0IHRoYXQgIm5vdCBjb21wbGV0ZSIgZXJyb3IgaWYKLSAgICAvLyBpdCByZWFsbHkgaXNuJ3QgY29tcGxldGUuCi0gICAgewotICAgICAgbWlycm9yLmNsZWFyKCk7Ci0gICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgICAgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZiwgZmFsc2UpKTsKLSAgICAgIHpsaWJfdHJhbnMtPndyaXRlKCZjb250ZW50WzBdLCBjb250ZW50LnNpemUoKSk7Ci0gICAgICB6bGliX3RyYW5zLT5mbHVzaCgpOwotICAgICAgc3RyaW5nIHRtcF9idWY7Ci0gICAgICBtZW1idWYtPmFwcGVuZEJ1ZmZlclRvU3RyaW5nKHRtcF9idWYpOwotICAgICAgdG1wX2J1Zi5lcmFzZSh0bXBfYnVmLmxlbmd0aCgpIC0gMSk7Ci0gICAgICBtZW1idWYtPnJlc2V0RnJvbVN0cmluZyh0bXBfYnVmKTsKLSAgICAgIG1pcnJvci5yZXNpemUoY29udGVudC5zaXplKCkpOwotICAgICAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZCgmbWlycm9yWzBdLCBtaXJyb3Iuc2l6ZSgpKTsKLSAgICAgIGFzc2VydChnb3QgPT0gY29udGVudC5zaXplKCkpOwotICAgICAgYXNzZXJ0KG1pcnJvciA9PSBjb250ZW50KTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7Ci0gICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewotICAgICAgICBhc3NlcnQoZXguZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUcnkgaXQgd2l0aCBhIG1peCBvZiByZWFkL3dyaXRlIHNpemVzLgotICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7Ci0gICAgICBmb3IgKGludCBkMiA9IDA7IGQyIDwgMzsgZDIrKykgewotICAgICAgICBtaXJyb3IuY2xlYXIoKTsKLSAgICAgICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gICAgICAgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZiwgZmFsc2UpKTsKLSAgICAgICAgaW50IGlkeDsKLSAgICAgICAgdW5zaWduZWQgaW50IHRvdDsKLQotICAgICAgICBpZHggPSAwOwotICAgICAgICB0b3QgPSAwOwotICAgICAgICB3aGlsZSAodG90IDwgY29udGVudC5zaXplKCkpIHsKLSAgICAgICAgICB6bGliX3RyYW5zLT53cml0ZSgmY29udGVudFt0b3RdLCBkaXN0W2QxXVtpZHhdKTsKLSAgICAgICAgICB0b3QgKz0gZGlzdFtkMV1baWR4XTsKLSAgICAgICAgICBpZHgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHpsaWJfdHJhbnMtPmZsdXNoKCk7Ci0gICAgICAgIG1pcnJvci5yZXNpemUoY29udGVudC5zaXplKCkpOwotCi0gICAgICAgIGlkeCA9IDA7Ci0gICAgICAgIHRvdCA9IDA7Ci0gICAgICAgIHdoaWxlICh0b3QgPCBtaXJyb3Iuc2l6ZSgpKSB7Ci0gICAgICAgICAgdWludDMyX3QgZ290ID0gemxpYl90cmFucy0+cmVhZCgmbWlycm9yW3RvdF0sIGRpc3RbZDJdW2lkeF0pOwotICAgICAgICAgIGFzc2VydChnb3QgPT0gZGlzdFtkMl1baWR4XSk7Ci0gICAgICAgICAgdG90ICs9IGRpc3RbZDJdW2lkeF07Ci0gICAgICAgICAgaWR4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnQobWlycm9yID09IGNvbnRlbnQpOwotICAgICAgICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFZlcmlmeSBjaGVja3N1bSBjaGVja2luZy4KLSAgICB7Ci0gICAgICBtaXJyb3IuY2xlYXIoKTsKLSAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgICAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmLCBmYWxzZSkpOwotICAgICAgemxpYl90cmFucy0+d3JpdGUoJmNvbnRlbnRbMF0sIGNvbnRlbnQuc2l6ZSgpKTsKLSAgICAgIHpsaWJfdHJhbnMtPmZsdXNoKCk7Ci0gICAgICBzdHJpbmcgdG1wX2J1ZjsKLSAgICAgIG1lbWJ1Zi0+YXBwZW5kQnVmZmVyVG9TdHJpbmcodG1wX2J1Zik7Ci0gICAgICB0bXBfYnVmWzU3XSsrOwotICAgICAgbWVtYnVmLT5yZXNldEZyb21TdHJpbmcodG1wX2J1Zik7Ci0gICAgICBtaXJyb3IucmVzaXplKGNvbnRlbnQuc2l6ZSgpKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHpsaWJfdHJhbnMtPnJlYWQoJm1pcnJvclswXSwgbWlycm9yLnNpemUoKSk7Ci0gICAgICAgIHpsaWJfdHJhbnMtPnZlcmlmeUNoZWNrc3VtKCk7Ci0gICAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICB9IGNhdGNoIChUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKLSAgICAgICAgYXNzZXJ0KGV4LmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L1JFQURNRS5tZCBiL3Rlc3QvYXVkaXQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMmY4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L1JFQURNRS5tZApAQCAtMCwwICsxLDQwIEBACitUeXBpY2FsIHVzYWdlCis9PT09PT09PT09PT09CitgYGAKK3RocmlmdC5leGUgLS1hdWRpdCA8b2xkRmlsZT4gPG5ld0ZpbGU+CitgYGAKK0V4YW1wbGUgcnVuCis9PT09PT09PT09PQorYGBgCis+IHRocmlmdC5leGUgLS1hdWRpdCB0ZXN0LnRocmlmdCBicmVhazEudGhyaWZ0CitbVGhyaWZ0IEF1ZGl0IEZhaWx1cmU6YnJlYWsxLnRocmlmdF0gTmV3IFRocmlmdCBGaWxlIGhhcyBtaXNzaW5nIGZ1bmN0aW9uIGJhc2VfZnVuY3Rpb24zCitbVGhyaWZ0IEF1ZGl0IFdhcm5pbmc6YnJlYWsxLnRocmlmdF0gQ29uc3RhbnQgY29uc3QzIGhhcyBkaWZmZXJlbnQgdmFsdWUKK2BgYAorCitQcm9ibGVtcyB0aGF0IHRoZSBhdWRpdCB0b29sIGNhbiBjYXRjaAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0Vycm9ycworKiBSZW1vdmluZyBhbiBlbnVtIHZhbHVlCisqIENoYW5naW5nIHRoZSB0eXBlIG9mIGEgc3RydWN0IGZpZWxkCisqIENoYW5naW5nIHRoZSByZXF1aXJlZC1uZXNzIG9mIGEgc3RydWN0IGZpZWxkCisqIFJlbW92aW5nIGEgc3RydWN0IGZpZWxkCisqIEFkZGluZyBhIHJlcXVpcmVkIHN0cnVjdCBmaWVsZAorKiBBZGRpbmcgYSBzdHJ1Y3QgZmllbGQgJ2luIHRoZSBtaWRkbGUnLiAgVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhbiBvbGQgSUQgaGFzIGJlZW4gcmVjeWNsZWQKKyogU3RydWN0IHJlbW92ZWQKKyogT25ld2F5LW5lc3MgY2hhbmdlCisqIFJldHVybiB0eXBlIGNoYW5nZQorKiBNaXNzaW5nIGZ1bmN0aW9uCisqIE1pc3Npbmcgc2VydmljZQorKiBDaGFuZ2UgaW4gc2VydmljZSBpbmhlcml0YW5jZQorCitXYXJuaW5ncworKiBSZW1vdmluZyBhIGxhbmd1YWdlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgorKiBDaGFuZ2luZyBhIG5hbWVzcGFjZQorKiBDaGFuZ2luZyBhbiBlbnVtIHZhbHVlJ3MgbmFtZQorKiBSZW1vdmluZyBhbiBlbnVtIGNsYXNzCisqIERlZmF1bHQgdmFsdWUgY2hhbmdlZAorKiBTdHJ1Y3QgZmllbGQgbmFtZSBjaGFuZ2UKKyogUmVtb3ZlZCBjb25zdGFudAorKiBUeXBlIG9mIGNvbnN0YW50IGNoYW5nZWQKKyogVmFsdWUgb2YgY29uc3RhbnQgY2hhbmdlZAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzdmNjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazEudGhyaWZ0CkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vVGhyaWZ0IE1ldGhvZCByZW1vdmVkIGZyb20gc2VydmljZSBiYXNlLgorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9jb25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjM9IFsyMywgMzJdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxMC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTAudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjkwYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTAudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsxMCAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MiBpZCA9MQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMTEudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazExLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGUwYTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazExLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMTEgLSBTdHJ1Y3QgZmllbGQgcmVtb3ZlZCBmcm9tIHN0cnVjdDMgaWQgPTcKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsxMi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMTIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTIyZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMTIudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGRlcml2ZWQxX2Z1bmN0aW9uMSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gZW51bTEgdG8gZW51bTIKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0yIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazEzLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxMy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5NzVjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxMy50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZGVyaXZlZDFfZnVuY3Rpb242IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBzdHJ1Y3QxIHRvIHN0cnVjdDIKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MiBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazE0LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxNC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjZDUwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxNC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gZGVyaXZlZDFfZnVuY3Rpb242IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBzdHJpbmcgdG8gZG91YmxlIAorCituYW1lc3BhY2UgY3BwIHRlc3QKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazE1LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxNS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmNjllNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxNS50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gYnJlYWsxNSAtIGRlcml2ZWQyX2Z1bmN0aW9uMSByZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gbGlzdDxpMzI+IHRvIGxpc3Q8aTE2PgorbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMTY+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazE2LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxNi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjZmY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxNi50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gYnJlYWsgMTYgLSBkZXJpdmVkMl9mdW5jdGlvbjUgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiB0byBtYXA8dGVzdF9lbnVtMywgdGVzdF9lbnVtMj4KKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0zLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazE3LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxNy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzYjE0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxNy50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazE3IC0gZGVyaXZlZDJfZnVuY3Rpb242IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBtYXA8c3RydWN0MSxzdHJ1Y3QyPiB0byBtYXA8c3RydWN0MSwgc3RydWN0Mz4KKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QzPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazE4LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxOC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3OGI2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxOC50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazE4LSBvbmV3YXkgcmVtb3ZlZCBmcm9tIGJhc2Vfb25ld2F5CisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazE5LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWsxOS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwYjIyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsxOS50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazE5IC0gb25ld2F5IGFkZGVkIHRvIGJhc2VfZnVuY3Rpb24xCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIG9uZXdheSB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0ZmUyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWsyLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1N0cnVjdCBmaWVsZCBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTMyIHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjAudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazIwLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWU1ZjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazIwLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBicmVhayAyMCAtIGZpcnN0IGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0xCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjEudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazIxLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RhNDAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazIxLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjEtIGxhc3QgZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTIKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjIudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazIyLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA4MzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazIyLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjIgLSBpbi1iZXR3ZWVuIGVudW0gdmFsdWUgcmVtb3ZlZCBmcm9tIGVudW0xCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjMudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazIzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk1YTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazIzLnRocmlmdApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjMgLSByZXF1aXJlZCBzdHJ1Y3QgZmllbGQgYWRkZWQgdG8gc3RydWN0NAorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMiwKKyAgICAzOiByZXF1aXJlZCBpNjQgc3RydWN0NF9tZW1iZXIzCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyNC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNGQ1YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjQudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyNCAtIHJlbW92ZWQgaW5oZXJpdGFuY2UgZnJvbSBkZXJpdmVkMS4KKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjUudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI1LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWZlOTdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI1LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL0NoYW5nZWQgaW5oZXJpdGFuY2Ugb2YgZGVyaXZlZDIKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGRlcml2ZWQxIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyNi50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjYudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzZkOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjYudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyNiAtIEZpZWxkIHR5cGUgY2hhbmdlZCBpbiBiYXNlX2Z1bmN0aW9uMSBhcmd1bWVudCBpZD0zCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogZG91YmxlIGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyNy50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTY3MDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjcudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGJyZWFrMjcgLSBhcmd1bWVudCBjaGFuZ2VkIGJhc2VfZnVuY3Rpb24yIGxpc3Q8ZW51bTE+IHRvIGxpc3Q8ZW51bTM+IGlkID04CituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTM+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMjgudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazI4LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjRlNTU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazI4LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMjgtIGRlcml2ZWQxX2Z1bmN0aW9uNSBhcmd1ZW1lbnQgdHlwZSBjaGFuZ2VkIG1hcDxpNjQsIGRvdWJsZT4gdG8gbGlzdDxpNjQ+CituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWsyOS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMjkudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjMwODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMjkudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWsyOSAtIGJhc2VfZnVuY3Rpb24yIGFyZ3VlbW50IHR5cGUgY2hhbmdlZCBsaXN0PHN0cmluZz4gdG8gc3RyaW5nCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWszLnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWQ5OTcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazMudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWszIC0gU3RydWN0IGZpZWxkIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGVudW0xIHRvIGVudW0yKQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0yIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzJdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB0ZXN0X3N0cnVjdDEgZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWszMC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMzAudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOGRkNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMzAudGhyaWZ0CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGJyZWFrMzAtIGRlcml2ZWQxX2Z1bmN0aW9uNiBhcmd1bWVudCBjaGFuZ2VkIHN0cnVjdDEgdG8gbWFwPHN0cnVjdDEsc3RydWN0MT4KK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZSB7CisgICAgCisgICAgdGVzdF9lbnVtMSBkZXJpdmVkMV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGk2NCBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogZG91YmxlIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgaTY0IGRlcml2ZWQxX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnNSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGRvdWJsZSBkZXJpdmVkMV9mdW5jdGlvbjMoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjNfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjNfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHN0cmluZyBkZXJpdmVkMV9mdW5jdGlvbjQoCisgICAgICAgIDE6IHN0cmluZyBmdW5jdGlvbjRfYXJnMSwKKyAgICAgICAgMjogYm9vbCBmdW5jdGlvbjRfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworCisgICAgYm9vbCBkZXJpdmVkMV9mdW5jdGlvbjUoCisgICAgICAgIDE6IG1hcDxpNjQsIGRvdWJsZT4gZnVuY3Rpb241X2FyZzEsCisgICAgICAgIDI6IG1hcDxzdHJpbmcsIGJvb2w+IGZ1bmN0aW9uNV9hcmcyLAorICAgICAgICAzOiBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZnVuY3Rpb241X2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLHRlc3Rfc3RydWN0MT4gZGVyaXZlZDFfZnVuY3Rpb242KAorICAgICAgICAxOiBkb3VibGUgZnVuY3Rpb242X2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCit9CisKK3NlcnZpY2UgZGVyaXZlZDIgZXh0ZW5kcyBiYXNlIHsKKworICAgIGxpc3Q8aTMyPiBkZXJpdmVkMl9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkzMiBmdW5jdGlvbjFfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKKyAgICBsaXN0PHRlc3RfZW51bTE+IGRlcml2ZWQyX2Z1bmN0aW9uMigKKyAgICAgICAgMTppNjQgZnVuY3Rpb24yX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBsaXN0PHRlc3Rfc3RydWN0MT4gZGVyaXZlZDJfZnVuY3Rpb24zKAorICAgICAgICAxOmRvdWJsZSBmdW5jdGlvbjNfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPGRvdWJsZSwgc3RyaW5nPiBkZXJpdmVkMl9mdW5jdGlvbjQoCisgICAgICAgIDE6c3RyaW5nIGZ1bmN0aW9uNF9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9lbnVtMSwgdGVzdF9lbnVtMj4gZGVyaXZlZDJfZnVuY3Rpb241KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb241X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X3N0cnVjdDEsIHRlc3Rfc3RydWN0Mj4gZGVyaXZlZDJfZnVuY3Rpb242KAorICAgICAgICAxOmJvb2wgZnVuY3Rpb242X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKyAgICAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYXVkaXQvYnJlYWszMS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrMzEudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTM4MDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrMzEudGhyaWZ0CkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vYnJlYWszMSAtIEV4Y2VwdGlvbiByZW1vdmVkIHRvIGJhc2VfZnVuY3Rpb24yCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXN0IgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMzIudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazMyLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNmOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazMyLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMzItIEV4Y2VwdGlvbjEgZmllbGQgdHlwZSBjaGFuZ2VkIGZvciBpZCA9MQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTY0IGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrMzMudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazMzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmRiYjgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC9icmVhazMzLnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrMzMgLSBkZXJpdmVkMV9mdW5jdGlvbjEgZXhjZXB0aW9uIHR5cGUgY2hhbmdlZC4KKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjEgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazM0LnRocmlmdCBiL3Rlc3QvYXVkaXQvYnJlYWszNC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5M2U2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWszNC50aHJpZnQKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazM0IC0gRmllbGQgYWRkZWQgdG8gc3RydWN0IHdpdGggRmllbGQgSUQgYmVpbmcgaW4gYmV0d2VlbiB0d28gZXhpc3RpbmcgZmllbGQgSURzCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjUsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSA9ICJBdWRpdCB0ZXN0IiwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgc3RydWN0MV9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IHN0cnVjdDJfbWVtYmVyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzID0gWzIzLCAzMiBdLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQsCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MiwgMzo0fSwKKyAgICAyOiBtYXA8aTY0LCBkb3VibGU+IHN0cnVjdDNfbWVtYmVyMiA9IHsxMDoxLjEsIDIwOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNjogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IHN0cnVjdDNfbWVtYmVyNiwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazQudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjhlYzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrNC50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9GaWVsZCB0eXBlIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGJvb2wgdG8gc3RyaW5nKQorbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9WzIzLCAzMl0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazUudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YzIyZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrNS50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gbWVtYmVyIGZpZWxkIHR5cGUgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoYm9vbCB0byBsaXN0PGJvb2w+KQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxkb3VibGU+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazYudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazYudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2EzMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrNi50aHJpZnQKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MiAobGlzdDxkb3VibGU+IHRvIGxpc3Q8aTE2PikKKworbmFtZXNwYWNlIGNwcCB0ZXN0CisKKy8vQ29uc3RhbnRzCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjM7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6IndvcmxkIiwgInRocmlmdCI6ImF1ZGl0In07CisKKworLy9FeGNlcHRpb24KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjEgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMiB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CisKKy8vRW51bXMKKworZW51bSB0ZXN0X2VudW0xIHsKKyAgICBlbnVtMV92YWx1ZTAgPSAwLAorICAgIGVudW0xX3ZhbHVlMSA9IDEsCisgICAgZW51bTFfdmFsdWUyID0gMiwKKyAgICBlbnVtMV92YWx1ZTUgPSA1LAorICAgIGVudW0xX3ZhbHVlNyA9IDcsCisgICAgZW51bTFfdmFsdWU4ID0gOAorfQorCitlbnVtIHRlc3RfZW51bTIgeworICAgIGVudW0yX3ZhbHVlMCA9IDAsCisgICAgZW51bTJfdmFsdWUxID0gMSwKKyAgICBlbnVtMl92YWx1ZTIgPSAyLAorICAgIGVudW0yX3ZhbHVlMyA9IDMKK30KKworZW51bSB0ZXN0X2VudW0zIHsKKyAgICBlbnVtM192YWx1ZTEgPSAwLAorICAgIGVudW0zX3ZhbHVlMiA9IDEKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MSB7CisgICAgMTogaTE2IHN0cnVjdDFfbWVtYmVyMSwKKyAgICAyOiBpMzIgc3RydWN0MV9tZW1iZXIyLAorICAgIDM6IGk2NCBzdHJ1Y3QxX21lbWJlcjMsCisgICAgNDogZG91YmxlIHN0cnVjdDFfbWVtYmVyNCA9IDIuNSwKKyAgICA1OiBzdHJpbmcgc3RydWN0MV9tZW1iZXI1ID0gIkF1ZGl0IHRlc3QiLAorICAgIDY6IGJvb2wgc3RydWN0MV9tZW1iZXI2LAorICAgIDc6IGJ5dGUgc3RydWN0MV9tZW1iZXI3LAorICAgIDg6IGJpbmFyeSBzdHJ1Y3QxX21lbWJlcjgsCisgICAgOTogdGVzdF9lbnVtMSBzdHJ1Y3QxX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MiB7CisgICAgMTogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyMSwKKyAgICAyOiBsaXN0PGkzMj4gc3RydWN0Ml9tZW1iZXIyLAorICAgIDM6IGxpc3Q8aTY0PiBzdHJ1Y3QyX21lbWJlcjMgPSBbMjMsIDMyIF0sCisgICAgNDogbGlzdDxpMTY+IHN0cnVjdDJfbWVtYmVyNCwKKyAgICA1OiBsaXN0PHN0cmluZz4gc3RydWN0Ml9tZW1iZXI1LAorICAgIDY6IGxpc3Q8Ym9vbD4gc3RydWN0Ml9tZW1iZXI2LAorICAgIDc6IGxpc3Q8Ynl0ZT4gc3RydWN0Ml9tZW1iZXI3LAorICAgIDg6IGxpc3Q8YmluYXJ5PiBzdHJ1Y3QyX21lbWJlcjgsCisgICAgOTogbGlzdDx0ZXN0X2VudW0xPiBzdHJ1Y3QyX21lbWJlcjkKK30KKworc3RydWN0IHRlc3Rfc3RydWN0MyB7CisgICAgMTogbWFwPGkxNiwgaTMyPiBzdHJ1Y3QzX21lbWJlcjEgPSB7MToyLCAzOjR9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezEwOjEuMSwgMjA6Mi4xfSwKKyAgICAzOiBtYXA8c3RyaW5nLCBib29sPiBzdHJ1Y3QzX21lbWJlcjMsCisgICAgNDogbWFwPGJ5dGUsIHRlc3RfZW51bTE+IHN0cnVjdDNfbWVtYmVyNCwKKyAgICA1OiBtYXA8dGVzdF9lbnVtMiwgdGVzdF9lbnVtMyA+IHN0cnVjdDNfbWVtYmVyNSwKKyAgICA3OiBtYXA8ZG91YmxlLCBzdHJpbmc+IHN0cnVjdDNfbWVtYmVyNworfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q0IHsKKyAgICAxOiBpMzIgc3RydWN0NF9tZW1iZXIxLAorICAgIDI6IG9wdGlvbmFsIGkzMiBzdHJ1Y3Q0X21lbWJlcjIKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NXsKKyAgICAxOiBkb3VibGUgc3RydWN0NV9tZW1iZXIxLAorICAgIDI6IHN0cmluZyBzdHJ1Y3Q1X21lbWJlcjIgPSAiVGhyaWZ0IEF1ZGl0IFRlc3QiCit9CitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q2IHsKKyAgICAxOiBpMzIgc3RydWN0Nl9tZW1iZXIxLAorICAgIDI6IHJlcXVpcmVkIGkzMiBzdHJ1Y3Q2X21lbWJlcjIKK30KKworc2VydmljZSBiYXNlIHsKKyAgICBvbmV3YXkgdm9pZCBiYXNlX29uZXdheSgKKyAgICAgICAgMTogaTMyIGFyZzEpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTE2IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBpMzIgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IGk2NCBmdW5jdGlvbjFfYXJnMywKKyAgICAgICAgNDogZG91YmxlIGZ1bmN0aW9uMV9hcmc0LAorICAgICAgICA1OiBzdHJpbmcgZnVuY3Rpb24xX2FyZzUsCisgICAgICAgIDY6IGJvb2wgZnVuY3Rpb24xX2FyZzYsCisgICAgICAgIDc6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzcsCisgICAgICAgIDg6IHRlc3Rfc3RydWN0MSBmdW5jdGlvbjFfYXJnOCksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGkxNj4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8aTMyPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxpNjQ+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGRvdWJsZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8c3RyaW5nPiBmdW5jdGlvbjJfYXJnNSwKKyAgICAgICAgNjogbGlzdDxib29sPiBmdW5jdGlvbjJfYXJnNiwKKyAgICAgICAgNzogbGlzdDxieXRlPiBmdW5jdGlvbjJfYXJnNywKKyAgICAgICAgODogbGlzdDx0ZXN0X2VudW0xPiBmdW5jdGlvbjJfYXJnOCwKKyAgICAgICAgOTogbGlzdDx0ZXN0X3N0cnVjdDE+IGZ1bmN0aW9uMl9hcmc5KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMygpLAorCit9CisKK3NlcnZpY2UgZGVyaXZlZDEgZXh0ZW5kcyBiYXNlIHsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9hdWRpdC9icmVhazcudGhyaWZ0IGIvdGVzdC9hdWRpdC9icmVhazcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMWMyZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L2JyZWFrNy50aHJpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9icmVhazcgLSByZXF1aXJlZG5lc3MgcmVtb3ZlZCBpbiBzdHJ1Y3Q2CisKK25hbWVzcGFjZSBjcHAgdGVzdAorLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrOC50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrOC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjYWMwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs4LnRocmlmdApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrOCAtIHJlcXVpcmVkbmVzcyBhZGRlZGQgaW4gc3RydWN0NQorCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L2JyZWFrOS50aHJpZnQgYi90ZXN0L2F1ZGl0L2JyZWFrOS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiMzE5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYXVkaXQvYnJlYWs5LnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL2JyZWFrOSAtIFN0cnVjdCBmaWVsZCByZW1vdmVkIGZyb20gc3RydWN0MQorCisKK25hbWVzcGFjZSBjcHAgdGVzdAorLy9Db25zdGFudHMKKworY29uc3QgaTMyIGNvbnN0MSA9IDEyMzsKK2NvbnN0IGRvdWJsZSBjb25zdDIgPSAyMy4zOworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IGNvbnN0MyA9IHsiaGVsbG8iOiJ3b3JsZCIsICJ0aHJpZnQiOiJhdWRpdCJ9OworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L3Rlc3QudGhyaWZ0IGIvdGVzdC9hdWRpdC90ZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTgzNGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC90ZXN0LnRocmlmdApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgY3BwIHRlc3QKKworLy9Db25zdGFudHMKK2NvbnN0IGkzMiBjb25zdDEgPSAxMjM7Citjb25zdCBkb3VibGUgY29uc3QyID0gMjMuMzsKK2NvbnN0IG1hcDxzdHJpbmcsc3RyaW5nPiBjb25zdDMgPSB7ImhlbGxvIjoid29ybGQiLCAidGhyaWZ0IjoiYXVkaXQifTsKKworCisvL0V4Y2VwdGlvbgorZXhjZXB0aW9uIHRlc3RfZXhjZXB0aW9uMSB7CisgICAgMTogaTMyIGNvZGU7CisgICAgMjogc3RyaW5nIGpzb247Cit9CitleGNlcHRpb24gdGVzdF9leGNlcHRpb24yIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KKworLy9FbnVtcworCitlbnVtIHRlc3RfZW51bTEgeworICAgIGVudW0xX3ZhbHVlMCA9IDAsCisgICAgZW51bTFfdmFsdWUxID0gMSwKKyAgICBlbnVtMV92YWx1ZTIgPSAyLAorICAgIGVudW0xX3ZhbHVlNSA9IDUsCisgICAgZW51bTFfdmFsdWU3ID0gNywKKyAgICBlbnVtMV92YWx1ZTggPSA4Cit9CisKK2VudW0gdGVzdF9lbnVtMiB7CisgICAgZW51bTJfdmFsdWUwID0gMCwKKyAgICBlbnVtMl92YWx1ZTEgPSAxLAorICAgIGVudW0yX3ZhbHVlMiA9IDIsCisgICAgZW51bTJfdmFsdWUzID0gMworfQorCitlbnVtIHRlc3RfZW51bTMgeworICAgIGVudW0zX3ZhbHVlMSA9IDAsCisgICAgZW51bTNfdmFsdWUyID0gMQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QxIHsKKyAgICAxOiBpMTYgc3RydWN0MV9tZW1iZXIxLAorICAgIDI6IGkzMiBzdHJ1Y3QxX21lbWJlcjIsCisgICAgMzogaTY0IHN0cnVjdDFfbWVtYmVyMywKKyAgICA0OiBkb3VibGUgc3RydWN0MV9tZW1iZXI0ID0gMi41LAorICAgIDU6IHN0cmluZyBzdHJ1Y3QxX21lbWJlcjUgPSAiQXVkaXQgdGVzdCIsCisgICAgNjogYm9vbCBzdHJ1Y3QxX21lbWJlcjYsCisgICAgNzogYnl0ZSBzdHJ1Y3QxX21lbWJlcjcsCisgICAgODogYmluYXJ5IHN0cnVjdDFfbWVtYmVyOCwKKyAgICA5OiB0ZXN0X2VudW0xIHN0cnVjdDFfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QyIHsKKyAgICAxOiBsaXN0PGkxNj4gc3RydWN0Ml9tZW1iZXIxLAorICAgIDI6IGxpc3Q8aTMyPiBzdHJ1Y3QyX21lbWJlcjIsCisgICAgMzogbGlzdDxpNjQ+IHN0cnVjdDJfbWVtYmVyMyA9IFsyMywgMzIgXSwKKyAgICA0OiBsaXN0PGRvdWJsZT4gc3RydWN0Ml9tZW1iZXI0LAorICAgIDU6IGxpc3Q8c3RyaW5nPiBzdHJ1Y3QyX21lbWJlcjUsCisgICAgNjogbGlzdDxib29sPiBzdHJ1Y3QyX21lbWJlcjYsCisgICAgNzogbGlzdDxieXRlPiBzdHJ1Y3QyX21lbWJlcjcsCisgICAgODogbGlzdDxiaW5hcnk+IHN0cnVjdDJfbWVtYmVyOCwKKyAgICA5OiBsaXN0PHRlc3RfZW51bTE+IHN0cnVjdDJfbWVtYmVyOQorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3QzIHsKKyAgICAxOiBtYXA8aTE2LCBpMzI+IHN0cnVjdDNfbWVtYmVyMSA9IHsxOjIsIDM6NH0sCisgICAgMjogbWFwPGk2NCwgZG91YmxlPiBzdHJ1Y3QzX21lbWJlcjIgPSB7MTA6MS4xLCAyMDoyLjF9LAorICAgIDM6IG1hcDxzdHJpbmcsIGJvb2w+IHN0cnVjdDNfbWVtYmVyMywKKyAgICA0OiBtYXA8Ynl0ZSwgdGVzdF9lbnVtMT4gc3RydWN0M19tZW1iZXI0LAorICAgIDU6IG1hcDx0ZXN0X2VudW0yLCB0ZXN0X2VudW0zID4gc3RydWN0M19tZW1iZXI1LAorICAgIDc6IG1hcDxkb3VibGUsIHN0cmluZz4gc3RydWN0M19tZW1iZXI3Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDQgeworICAgIDE6IGkzMiBzdHJ1Y3Q0X21lbWJlcjEsCisgICAgMjogb3B0aW9uYWwgaTMyIHN0cnVjdDRfbWVtYmVyMgorfQorCitzdHJ1Y3QgdGVzdF9zdHJ1Y3Q1eworICAgIDE6IGRvdWJsZSBzdHJ1Y3Q1X21lbWJlcjEsCisgICAgMjogc3RyaW5nIHN0cnVjdDVfbWVtYmVyMiA9ICJUaHJpZnQgQXVkaXQgVGVzdCIKK30KK3N0cnVjdCB0ZXN0X3N0cnVjdDYgeworICAgIDE6IGkzMiBzdHJ1Y3Q2X21lbWJlcjEsCisgICAgMjogcmVxdWlyZWQgaTMyIHN0cnVjdDZfbWVtYmVyMgorfQorCitzZXJ2aWNlIGJhc2UgeworICAgIG9uZXdheSB2b2lkIGJhc2Vfb25ld2F5KAorICAgICAgICAxOiBpMzIgYXJnMSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMTYgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGkzMiBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogaTY0IGZ1bmN0aW9uMV9hcmczLAorICAgICAgICA0OiBkb3VibGUgZnVuY3Rpb24xX2FyZzQsCisgICAgICAgIDU6IHN0cmluZyBmdW5jdGlvbjFfYXJnNSwKKyAgICAgICAgNjogYm9vbCBmdW5jdGlvbjFfYXJnNiwKKyAgICAgICAgNzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnNywKKyAgICAgICAgODogdGVzdF9zdHJ1Y3QxIGZ1bmN0aW9uMV9hcmc4KSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTE2PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxpMzI+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnNCwKKyAgICAgICAgNTogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmc1LAorICAgICAgICA2OiBsaXN0PGJvb2w+IGZ1bmN0aW9uMl9hcmc2LAorICAgICAgICA3OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc3LAorICAgICAgICA4OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc4LAorICAgICAgICA5OiBsaXN0PHRlc3Rfc3RydWN0MT4gZnVuY3Rpb24yX2FyZzkpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICB2b2lkIGJhc2VfZnVuY3Rpb24zKCksCisKK30KKworc2VydmljZSBkZXJpdmVkMSBleHRlbmRzIGJhc2UgeworICAgIAorICAgIHRlc3RfZW51bTEgZGVyaXZlZDFfZnVuY3Rpb24xKAorICAgICAgICAxOiBpNjQgZnVuY3Rpb24xX2FyZzEsCisgICAgICAgIDI6IGRvdWJsZSBmdW5jdGlvbjFfYXJnMiwKKyAgICAgICAgMzogdGVzdF9lbnVtMSBmdW5jdGlvbjFfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGk2NCBkZXJpdmVkMV9mdW5jdGlvbjIoCisgICAgICAgIDE6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMSwKKyAgICAgICAgMjogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmcyLAorICAgICAgICAzOiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzMsCisgICAgICAgIDQ6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzQsCisgICAgICAgIDU6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzUpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBkb3VibGUgZGVyaXZlZDFfZnVuY3Rpb24zKAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb24zX2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb24zX2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBzdHJpbmcgZGVyaXZlZDFfZnVuY3Rpb240KAorICAgICAgICAxOiBzdHJpbmcgZnVuY3Rpb240X2FyZzEsCisgICAgICAgIDI6IGJvb2wgZnVuY3Rpb240X2FyZzIpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKworICAgIGJvb2wgZGVyaXZlZDFfZnVuY3Rpb241KAorICAgICAgICAxOiBtYXA8aTY0LCBkb3VibGU+IGZ1bmN0aW9uNV9hcmcxLAorICAgICAgICAyOiBtYXA8c3RyaW5nLCBib29sPiBmdW5jdGlvbjVfYXJnMiwKKyAgICAgICAgMzogbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGZ1bmN0aW9uNV9hcmczKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgdGVzdF9zdHJ1Y3QxIGRlcml2ZWQxX2Z1bmN0aW9uNigKKyAgICAgICAgMTogZG91YmxlIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorfQorCitzZXJ2aWNlIGRlcml2ZWQyIGV4dGVuZHMgYmFzZSB7CisKKyAgICBsaXN0PGkzMj4gZGVyaXZlZDJfZnVuY3Rpb24xKAorICAgICAgICAxOiBpMzIgZnVuY3Rpb24xX2FyZzEpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCisgICAgbGlzdDx0ZXN0X2VudW0xPiBkZXJpdmVkMl9mdW5jdGlvbjIoCisgICAgICAgIDE6aTY0IGZ1bmN0aW9uMl9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbGlzdDx0ZXN0X3N0cnVjdDE+IGRlcml2ZWQyX2Z1bmN0aW9uMygKKyAgICAgICAgMTpkb3VibGUgZnVuY3Rpb24zX2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDxkb3VibGUsIHN0cmluZz4gZGVyaXZlZDJfZnVuY3Rpb240KAorICAgICAgICAxOnN0cmluZyBmdW5jdGlvbjRfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3RfZW51bTEsIHRlc3RfZW51bTI+IGRlcml2ZWQyX2Z1bmN0aW9uNSgKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNV9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8dGVzdF9zdHJ1Y3QxLCB0ZXN0X3N0cnVjdDI+IGRlcml2ZWQyX2Z1bmN0aW9uNigKKyAgICAgICAgMTpib29sIGZ1bmN0aW9uNl9hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisgICAgCit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L3RocmlmdF9hdWRpdF90ZXN0LnBsIGIvdGVzdC9hdWRpdC90aHJpZnRfYXVkaXRfdGVzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWVkNGRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC90aHJpZnRfYXVkaXRfdGVzdC5wbApAQCAtMCwwICsxLDI2MSBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyNicmVhazEgLSBUaHJpZnQgbWV0aG9kIHJlbW92ZWQgZnJvbSBzZXJ2aWNlIGJhc2UKKyNicmVhazIgLSBTdHJ1Y3QgZmllbGQgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoaTE2IHRvIGkzMikKKyNicmVhazMgLSBTdHJ1Y3QgZmllbGQgY2hhbmdlZCBpbiB0ZXN0X3N0cnVjdDEoZW51bTEgdG8gZW51bTIpCisjYnJlYWs0IC0gRmllbGQgdHlwZSBjaGFuZ2VkIGluIHRlc3Rfc3RydWN0MShib29sIHRvIHN0cmluZykKKyNicmVhazUtIG1lbWJlciBmaWVsZCB0eXBlIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QxKGJvb2wgdG8gbGlzdDxib29sPikKKyNicmVhazYtICBGaWVsZCB0eXBlIGNoYW5nZWQgaW4gdGVzdF9zdHJ1Y3QyIChsaXN0PGRvdWJsZT4gdG8gbGlzdDxpMTY+KQorI2JyZWFrNyAtIHJlcXVpcmVkbmVzcyByZW1vdmVkIGluIHN0cnVjdDYKKyNicmVhazggLSByZXF1aXJlZG5lc3MgYWRkZWRkIGluIHN0cnVjdDUKKyNicmVhazkgLSBTdHJ1Y3QgZmllbGQgcmVtb3ZlZCBmcm9tIHN0cnVjdDEKKyNicmVhazEwIC0gU3RydWN0IGZpZWxkIHJlbW92ZWQgZnJvbSBzdHJ1Y3QyIGlkID0gMQorI2JyZWFrMTEgLSBTdHJ1Y3QgZmllbGQgcmVtb3ZlZCBmcm9tIHN0cnVjdDMgbGFzdCBpZAorI2JyZWFrMTIgLSAgZGVyaXZlZDFfZnVuY3Rpb24xIHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBlbnVtMSB0byBlbnVtMgorI2JyZWFrMTMgLSBkZXJpdmVkMV9mdW5jdGlvbjYgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIHN0cnVjdDEgdG8gc3RydWN0MgorI2JyZWFrMTQgLSAgZGVyaXZlZDFfZnVuY3Rpb240IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBzdHJpbmcgdG8gZG91YmxlIAorI2JyZWFrMTUgLSBkZXJpdmVkMl9mdW5jdGlvbjEgcmV0dXJuIHR5cGUgY2hhbmdlZCBmcm9tIGxpc3Q8aTMyPiB0byBsaXN0PGkxNj4KKyNicmVhazE2IC0gZGVyaXZlZDJfZnVuY3Rpb241IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBtYXA8dGVzdF9lbnVtMSx0ZXN0X2VudW0yPiB0byBtYXA8dGVzdF9lbnVtMywgdGVzdF9lbnVtMj4KKyNicmVhazE3IC0gZGVyaXZlZDJfZnVuY3Rpb242IHJldHVybiB0eXBlIGNoYW5nZWQgZnJvbSBtYXA8c3RydWN0MSxzdHJ1Y3QyPiB0byBtYXA8c3RydWN0MSwgc3RydWN0Mz4KKyNicmVhazE4LSBvbmV3YXkgcmVtb3ZlZCBmcm9tIGJhc2Vfb25ld2F5CisjYnJlYWsxOSAtIG9uZXdheSBhZGRlZCB0byBiYXNlX2Z1bmN0aW9uMQorI2JyZWFrMjAgLSBmaXJzdCBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMQorI2JyZWFrMjEtIGxhc3QgZW51bSB2YWx1ZSByZW1vdmVkIGZyb20gZW51bTIKKyNicmVhazIyIC0gaW4tYmV0d2VlbiBlbnVtIHZhbHVlIHJlbW92ZWQgZnJvbSBlbnVtMQorI2JyZWFrMjMgLSByZXF1aXJlZCBzdHJ1Y3QgZmllbGQgYWRkZWQgdG8gc3RydWN0NAorI2JyZWFrMjQgLSByZW1vdmVkIGluaGVyaXRhbmNlIG9mIGRlcml2ZWQxLgorI2JyZWFrMjUgLSBjaGFuZ2VkIGluaGVyaXRhbmNlIG9mIGRlcml2ZWQyLgorI2JyZWFrMjYgLSBGaWVsZCB0eXBlIGNoYW5nZWQgaW4gYmFzZV9mdW5jdGlvbjEgYXJndW1lbnQgaWQ9MworI2JyZWFrMjcgLSBhcmd1bWVudCBjaGFuZ2VkIGJhc2VfZnVuY3Rpb24yIGxpc3Q8ZW51bTE+IHRvIGxpc3Q8ZW51bTM+IGlkID04CisjYnJlYWsyOC0gZGVyaXZlZDFfZnVuY3Rpb241IGFyZ3VlbWVudCB0eXBlIGNoYW5nZWQgbWFwPGk2NCwgZG91YmxlPiB0byBsaXN0PGk2ND4KKyNicmVhazI5IC0gYmFzZV9mdW5jdGlvbjIgYXJndWVtbnQgdHlwZSBjaGFuZ2VkIGxpc3Q8c3RyaW5nPiB0byBzdHJpbmcKKyNicmVhazMwLSBkZXJpdmVkMV9mdW5jdGlvbjYgYXJndW1lbnQgY2hhbmdlZCBzdHJ1Y3QxIHRvIG1hcDxzdHJ1Y3QxLHN0cnVjdDE+CisjYnJlYWszMSAtIEV4Y2VwdGlvbiByZW1vdmVkIHRvIGJhc2VfZnVuY3Rpb24yCisjYnJlYWszMi0gRXhjZXB0aW9uMSBmaWVsZCB0eXBlIGNoYW5nZWQgZm9yIGlkID0xCisjYnJlYWszMyAtIGRlcml2ZWQxX2Z1bmN0aW9uMSBleGNlcHRpb24gdHlwZSBjaGFuZ2VkLgorI2JyZWFrMzQgLSBGaWVsZCBhZGRlZCB0byBzdHJ1Y3Qgd2l0aCBGaWVsZCBJRCBiZWluZyBpbiBiZXR3ZWVuIHR3byBleGlzdGluZyBmaWVsZCBJRHMKKworI3dhcm5pbmcudGhyaWZ0CisjQ2hhbmdpbmcgZGVmYXVsdHMKKyNJZD0xIHN0cnVjdDUKKyNpZD0yIHN0cnVjdDUgCisjaWQ9NCBzdHJ1Y3QyKGxpc3Q8ZG91YmxlPikKKyNpZD0zIHN0cnVjdDIobGlzdDxpNjQ+ICBkZWZhdWx0IHZhbHVlcyByZW1vdmVkKQorI2lkIDQgc3RydWN0MSBjaGFuZ2UgaW4gZG91YmxlIHZhbHVlCisjaWQgNSBzdHJ1Y3QxIChkZWZhdWx0IHN0cmluZyB2YWx1ZSByZW1vdmVkKQorI2lkPTEgc3RydWN0MyAoY2hhbmdlIGluIG1hcCB2YWx1ZXMpCisjaWQyIHN0cnVjdDMgKGNoYW5nZSBpbiBtYXAga2V5cykKKworI2NoYW5nZSBpbiBpbmhlcml0YW5jZSBmb3IgZGVyaXZlZDEgYW5kIGRlcml2ZWQyCisKKyNjaGFuZ2UgaW4gc3RydWN0IGZpZWxkIG5hbWVzCisjaWQ5IHN0cnVjdDEKKyNpZDIgc3RydWN0MgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEdldG9wdDo6U3RkOworCisjIGdsb2JhbHMKK215ICRnQXJndW1lbnRzID0gIiI7ICAgICAgICAgICAgICAgICMgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gQXVkaXRUb29sCitteSAkZ0F1ZGl0VG9vbFBhdGggPSAiIjsKK215ICRnUHJldmlvdXNUaHJpZnRQYXRoOyAgICAgICAgICAgICMgcHJldmlvdXMgdGhyaWZ0IHBhdGgKK215ICRnQ3VycmVudFRocmlmdFBhdGg7ICAgICAgICAgICAgICMgY3VycmVudCB0aHJpZnQgcGF0aAorbXkgJGdUaHJpZnRGaWxlRm9sZGVyOworbXkgJGdCcmVha2luZ0ZpbGVzQ291bnQgPTM0OyAKKworbXkgJGdWZXJib3NlID0gMDsKKyNmdW5jdGlvbnMKK3N1YiBhdWRpdEJyZWFraW5nQ2hhbmdlczsKK3N1YiBhdWRpdE5vbkJyZWFraW5nQ2hhbmdlczsKKworbWFpbigpOworCitzdWIgbWFpbgoreworICAgIHBhcnNlT3B0aW9ucygpOworICAgIGF1ZGl0QnJlYWtpbmdDaGFuZ2VzKCk7CisgICAgYXVkaXROb25CcmVha2luZ0NoYW5nZXMoKTsKK30KKworc3ViIHBhcnNlT3B0aW9ucworeworICAgIG15ICVvcHRpb25zID0gKCk7CisgICAgaWYgKCBnZXRvcHRzICgndmY6bzp0OicsXCVvcHRpb25zKSApCisgICAgeworICAgICAgICAjIGN1cnJlbnQgKG5ldykgdGhyaWZ0IGZvbGRlcgorICAgICAgICBpZiAoJG9wdGlvbnN7J2YnfSkKKyAgICAgICAgeworICAgICAgICAgICAgJGdUaHJpZnRGaWxlRm9sZGVyID0gJG9wdGlvbnN7J2YnfTsKKyAgICAgICAgICAgICRnUHJldmlvdXNUaHJpZnRQYXRoID0gJGdUaHJpZnRGaWxlRm9sZGVyLiIvdGVzdC50aHJpZnQiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGllICJNaXNzaW5nIEZvbGRlciBjb250YWluaW5nIHRocmlmdCBmaWxlc1xuIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCRvcHRpb25zeyd0J30pCisgICAgICAgIHsKKyAgICAgICAgICAgICRnQXVkaXRUb29sUGF0aCA9ICRvcHRpb25zeyd0J307CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaWUgIkF1ZGl0IFRvb2wgUGF0aCByZXF1aXJlZCBcbiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJG9wdGlvbnN7J3YnfSkKKyAgICAgICAgeworICAgICAgICAgICAgJGdWZXJib3NlID0gMTsKKyAgICAgICAgfQorCisgICAgfQorfQorCitzdWIgYXVkaXRCcmVha2luZ0NoYW5nZXMKK3sKKyAgICBteSAkYnJlYWtpbmdGaWxlQmFzZU5hbWUgPSAkZ1RocmlmdEZpbGVGb2xkZXIuIi9icmVhayI7CisgICAgbXkgJG5ld1RocmlmdEZpbGU7CisgICAgZm9yKG15ICRpPTE7ICRpIDw9ICRnQnJlYWtpbmdGaWxlc0NvdW50OyAkaSsrKQorICAgIHsKKyAgICAgICAgJG5ld1RocmlmdEZpbGUgPSAkYnJlYWtpbmdGaWxlQmFzZU5hbWUuIiRpLnRocmlmdCI7CisgICAgICAgIG15ICRhcmd1bWVudHMgPSAgJGdQcmV2aW91c1RocmlmdFBhdGguIiAiLiRuZXdUaHJpZnRGaWxlOworICAgICAgICBteSAoJGV4aXRDb2RlLCAkb3V0cHV0KSA9IGNhbGxUaHJpZnRBdWRpdFRvb2woJGFyZ3VtZW50cyk7CisgICAgICAgIHByaW50ICRvdXRwdXQgaWYgJGdWZXJib3NlIGVxIDE7CisKKyAgICAgICAgaWYoJGV4aXRDb2RlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgdGhyaWZ0X2F1ZGl0IHJldHVybnMgMSB3aGVuIGl0IGlzIG5vdCBhYmxlIHRvIGZpbmQgZmlsZXMgb3Igb3RoZXIgbm9uLWF1ZGl0IGZhaWx1cmVzCisgICAgICAgICAgICBwcmludCAiZXhpdGluZyB3aXRoIGV4aXQgY29kZSA9MSBpID0gIi4kaS4iXG4iOworICAgICAgICAgICAgcHJpbnQgJG91dHB1dDsKKyAgICAgICAgICAgIGV4aXQgJGV4aXRDb2RlOworICAgICAgICB9CisgICAgICAgIGlmKCRleGl0Q29kZSAhPSAyKQorICAgICAgICB7CisgICAgICAgICAgICAjIHRocmlmdC1hdWRpdCByZXR1cm4gMiBmb3IgYXVkaXQgZmFpbHVyZXMuIFNvIGZvciBCcmVha2luZyBjaGFuZ2VzIHdlIHNob3VsZCBnZXQgMiBhcyByZXR1cm4gdmFsdWUuCisgICAgICAgICAgICBwcmludCAkb3V0cHV0OworICAgICAgICAgICAgZGllICJcblRFU1QgRkFJTFVSRTogQnJlYWtpbmcgQ2hhbmdlIG5vdCBkZXRlY3RlZCBmb3IgdGhyaWZ0IGZpbGUgJG5ld1RocmlmdEZpbGUsIGNvZGU9JGV4aXRDb2RlIFxuIjsKKyAgICAgICAgfQorICAgICAgICBpZihpbmRleCgkb3V0cHV0LGdldE1lc3NhZ2VTdWJTdHJpbmcoImJyZWFrJGkiKSkgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICNBdWRpdCB0b29sIGRldGVjdGVkIGZhaWx1cmUsIGJ1dCBub3QgdGhlIGV4cGVjdGVkIG9uZS4gVGhlIGNoYW5nZSBpbiBicmVha2luZyB0aHJpZnQgZmlsZSBkb2VzIG5vdCBtYXRjaCBnZXRNZXNzYWdlU3ViU3RyaW5nKCkKKyAgICAgICAgICAgIHByaW50ICRvdXRwdXQ7CisgICAgICAgICAgICBkaWUgIlxuVGVzdCBGQUlMVVJFOiBBdWRpdCB0b29sIGRldGVjdGVkIGZhaWx1cmUsIGJ1dCBub3QgdGhlIGV4cGVjdGVkIG9uZSFcbiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAjVGhyaWZ0IGF1ZGl0IHRvb2wgaGFzIGRldGVjdGVkIGF1ZGl0IGZhaWx1cmUgYW5kIGhhcyByZXR1cm5lZCBleGl0ZWQgdG8gc3RhdHVzIGNvZGUgMgorICAgICAgICAgICAgcHJpbnQgIlRlc3QgUGFzczogQXVkaXQgRmFpbHVyZSBkZXRlY3RlZCBmb3IgdGhyaWZ0IGZpbGUgYnJlYWskaS50aHJpZnQgXG4iOworICAgICAgICB9CisgICAgfQorCit9CisKK3N1YiBhdWRpdE5vbkJyZWFraW5nQ2hhbmdlcworeworICAgIG15ICRicmVha2luZ0ZpbGVCYXNlTmFtZSA9ICRnVGhyaWZ0RmlsZUZvbGRlci4iL3dhcm5pbmciOworICAgIG15ICRuZXdUaHJpZnRGaWxlOworICAgICRuZXdUaHJpZnRGaWxlID0gJGJyZWFraW5nRmlsZUJhc2VOYW1lLiIudGhyaWZ0IjsKKyAgICBteSAkYXJndW1lbnRzID0gICRnUHJldmlvdXNUaHJpZnRQYXRoLiIgIi4kbmV3VGhyaWZ0RmlsZTsKKyAgICBteSAoJGV4aXRDb2RlLCAkb3V0cHV0KSA9IGNhbGxUaHJpZnRBdWRpdFRvb2woJGFyZ3VtZW50cyk7CisgICAgcHJpbnQgJG91dHB1dCBpZiAkZ1ZlcmJvc2UgZXEgMTsKKworICAgIGlmKCRleGl0Q29kZSA9PSAxKQorICAgIHsKKyAgICAgICAgIyB0aHJpZnRfYXVkaXQgcmV0dXJucyAxIHdoZW4gaXQgaXMgbm90IGFibGUgdG8gZmluZCBmaWxlcyBvciBvdGhlciBub24tYXVkaXQgZmFpbHVyZXMKKyAgICAgICAgcHJpbnQgImV4aXRpbmcgd2l0aCBleGl0IGNvZGUgPSAxICBmb3IgZmlsZSB3YXJuaW5nLnRocmlmdFxuIjsKKyAgICAgICAgZXhpdCAkZXhpdENvZGU7CisgICAgfQorICAgIGVsc2lmKCRleGl0Q29kZSAhPSAwKQorICAgIHsKKyAgICAgICAgIyB0aHJpZnQtYXVkaXQgcmV0dXJuIDAgaWYgdGhlcmUgYXJlIG5vIGF1ZGl0IGZhaWx1cmVzLgorICAgICAgICBkaWUgIlxuVEVTVCBGQUlMVVJFOiBOb24gQnJlYWtpbmcgY2hhbmdlcyByZXR1cm5lZCBmYWlsdXJlIGZvciB0aHJpZnQgZmlsZSAkbmV3VGhyaWZ0RmlsZSBcbiI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICNUaHJpZnQgYXVkaXQgdG9vbCBoYXMgZXhpdGVkIHdpdGggc3RhdHVzIDAuIAorICAgICAgICBwcmludCAiVGVzdCBQYXNzOiBBdWRpdCB0b29sIGV4aXRzIHdpdGggc3VjY2VzcyBmb3Igd2FybmluZ3MgXG4iOworICAgIH0KKworCit9CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY2FsbCB0aHJpZnRBdWRpdFRvb2wgc2NyaXB0CitzdWIgY2FsbFRocmlmdEF1ZGl0VG9vbCAoICQgKQoreworICAgIG15ICRhcmdzID0gc2hpZnQ7CisKKyAgICBteSAkY29tbWFuZCA9ICIkZ0F1ZGl0VG9vbFBhdGggLS1hdWRpdCAkYXJncyI7CisgICAgbXkgJG91dHB1dCA9IGAkY29tbWFuZCAyPiYxYDsKKyAgICBteSAkZXhpdENvZGUgPSAkPyA+PiA4OworCisgICAgcmV0dXJuICgkZXhpdENvZGUsJG91dHB1dCk7Cit9CisKK3N1YiBnZXRNZXNzYWdlU3ViU3RyaW5nKCAkICkKK3sKKyAgICBteSAkZmlsZU5hbWUgPSBzaGlmdDsKKyAgICBteSAlbG9va3VwVGFibGUgPSAoCisgICAgICAgICJicmVhazEiICA9PiAiYmFzZV9mdW5jdGlvbjMiLAorICAgICAgICAiYnJlYWsyIiAgPT4gInRlc3Rfc3RydWN0MSIsCisgICAgICAgICJicmVhazMiICA9PiAidGVzdF9zdHJ1Y3QxIiwKKyAgICAgICAgImJyZWFrNCIgID0+ICJ0ZXN0X3N0cnVjdDEiLAorICAgICAgICAiYnJlYWs1IiAgPT4gInRlc3Rfc3RydWN0MSIsCisgICAgICAgICJicmVhazYiICA9PiAidGVzdF9zdHJ1Y3QyIiwKKyAgICAgICAgImJyZWFrNyIgID0+ICJ0ZXN0X3N0cnVjdDYiLAorICAgICAgICAiYnJlYWs4IiAgPT4gInRlc3Rfc3RydWN0NSIsCisgICAgICAgICJicmVhazkiICA9PiAidGVzdF9zdHJ1Y3QxIiwKKyAgICAgICAgImJyZWFrMTAiID0+ICJ0ZXN0X3N0cnVjdDIiLAorICAgICAgICAiYnJlYWsxMSIgPT4gInRlc3Rfc3RydWN0MyIsCisgICAgICAgICJicmVhazEyIiA9PiAiZGVyaXZlZDFfZnVuY3Rpb24xIiwKKyAgICAgICAgImJyZWFrMTMiID0+ICJkZXJpdmVkMV9mdW5jdGlvbjYiLAorICAgICAgICAiYnJlYWsxNCIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uNCIsCisgICAgICAgICJicmVhazE1IiA9PiAiZGVyaXZlZDJfZnVuY3Rpb24xIiwKKyAgICAgICAgImJyZWFrMTYiID0+ICJkZXJpdmVkMl9mdW5jdGlvbjUiLAorICAgICAgICAiYnJlYWsxNyIgPT4gImRlcml2ZWQyX2Z1bmN0aW9uNiIsCisgICAgICAgICJicmVhazE4IiA9PiAiYmFzZV9vbmV3YXkiLAorICAgICAgICAiYnJlYWsxOSIgPT4gImJhc2VfZnVuY3Rpb24xIiwKKyAgICAgICAgImJyZWFrMjAiID0+ICJ0ZXN0X2VudW0xIiwKKyAgICAgICAgImJyZWFrMjEiID0+ICJ0ZXN0X2VudW0yIiwKKyAgICAgICAgImJyZWFrMjIiID0+ICJ0ZXN0X2VudW0xIiwKKyAgICAgICAgImJyZWFrMjMiID0+ICJ0ZXN0X3N0cnVjdDQiLAorICAgICAgICAiYnJlYWsyNCIgPT4gImRlcml2ZWQxIiwKKyAgICAgICAgImJyZWFrMjUiID0+ICJkZXJpdmVkMiIsCisgICAgICAgICJicmVhazI2IiA9PiAiYmFzZV9mdW5jdGlvbjEiLAorICAgICAgICAiYnJlYWsyNyIgPT4gImJhc2VfZnVuY3Rpb24yX2FyZ3MiLAorICAgICAgICAiYnJlYWsyOCIgPT4gImRlcml2ZWQxX2Z1bmN0aW9uNV9hcmdzIiwKKyAgICAgICAgImJyZWFrMjkiID0+ICJiYXNlX2Z1bmN0aW9uMl9hcmdzIiwKKyAgICAgICAgImJyZWFrMzAiID0+ICJkZXJpdmVkMV9mdW5jdGlvbjYiLAorICAgICAgICAiYnJlYWszMSIgPT4gImJhc2VfZnVuY3Rpb24yX2V4Y2VwdGlvbiIsCisgICAgICAgICJicmVhazMyIiA9PiAidGVzdF9leGNlcHRpb24xIiwKKyAgICAgICAgImJyZWFrMzMiID0+ICJkZXJpdmVkMV9mdW5jdGlvbjFfZXhjZXB0aW9uIiwKKyAgICAgICAgImJyZWFrMzQiID0+ICJ0ZXN0X3N0cnVjdDMiLAorICAgICk7CisgICAgaWYgKG5vdCBleGlzdHMgJGxvb2t1cFRhYmxleyAkZmlsZU5hbWUgfSkKKyAgICB7CisgICAgICAgIHByaW50ICJpbiB0aGUgbnVsbCBjYXNlXG4iOworICAgICAgICByZXR1cm4gIk5VTEwiOworICAgIH0KKyAgICAKKyAgICBteSAkcmV0dmFsID0gJGxvb2t1cFRhYmxleyAkZmlsZU5hbWUgfTsKKyAgICBwcmludCAiJGZpbGVOYW1lID0+ICRyZXR2YWxcbiI7CisgICAgcmV0dXJuICRsb29rdXBUYWJsZXsgJGZpbGVOYW1lIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L3dhcm5pbmcudGhyaWZ0IGIvdGVzdC9hdWRpdC93YXJuaW5nLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzkyZDVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hdWRpdC93YXJuaW5nLnRocmlmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK25hbWVzcGFjZSBjcHAgdGVzdAorCisvL0NvbnN0YW50cworCitjb25zdCBpMzIgY29uc3QxID0gMTIzOworY29uc3QgZG91YmxlIGNvbnN0MiA9IDIzLjI7Citjb25zdCBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3QzID0geyJoZWxsbyI6ImNsYXNzIiwgInRocmlmdCI6ImF1ZGl0In07CisKKy8vRXhjZXB0aW9uCitleGNlcHRpb24gdGVzdF9leGNlcHRpb24xIHsKKyAgICAxOiBpMzIgY29kZTsKKyAgICAyOiBzdHJpbmcganNvbjsKK30KK2V4Y2VwdGlvbiB0ZXN0X2V4Y2VwdGlvbjIgeworICAgIDE6IGkzMiBjb2RlOworICAgIDI6IHN0cmluZyBqc29uOworfQorCisvL0VudW1zCisKK2VudW0gdGVzdF9lbnVtMSB7CisgICAgZW51bTFfdmFsdWUwID0gMCwKKyAgICBlbnVtMV92YWx1ZTEgPSAxLAorICAgIGVudW0xX3ZhbHVlMiA9IDIsCisgICAgZW51bTFfdmFsdWU1ID0gNSwKKyAgICBlbnVtMV92YWx1ZTcgPSA3LAorICAgIGVudW0xX3ZhbHVlOCA9IDgKK30KKworZW51bSB0ZXN0X2VudW0yIHsKKyAgICBlbnVtMl92YWx1ZTAgPSAwLAorICAgIGVudW0yX3ZhbHVlMSA9IDEsCisgICAgZW51bTJfdmFsdWUyID0gMiwKKyAgICBlbnVtMl92YWx1ZTMgPSAzCit9CisKK2VudW0gdGVzdF9lbnVtMyB7CisgICAgZW51bTNfdmFsdWUxID0gMCwKKyAgICBlbnVtM192YWx1ZTIgPSAxCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDEgeworICAgIDE6IGkxNiBzdHJ1Y3QxX21lbWJlcjEsCisgICAgMjogaTMyIHN0cnVjdDFfbWVtYmVyMiwKKyAgICAzOiBpNjQgc3RydWN0MV9tZW1iZXIzLAorICAgIDQ6IGRvdWJsZSBzdHJ1Y3QxX21lbWJlcjQgPSAyLjQsCisgICAgNTogc3RyaW5nIHN0cnVjdDFfbWVtYmVyNSwKKyAgICA2OiBib29sIHN0cnVjdDFfbWVtYmVyNiwKKyAgICA3OiBieXRlIHN0cnVjdDFfbWVtYmVyNywKKyAgICA4OiBiaW5hcnkgc3RydWN0MV9tZW1iZXI4LAorICAgIDk6IHRlc3RfZW51bTEgY2hhbmdlZDE5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDIgeworICAgIDE6IGxpc3Q8aTE2PiBzdHJ1Y3QyX21lbWJlcjEsCisgICAgMjogbGlzdDxpMzI+IGNoYW5nZWQyMiwKKyAgICAzOiBsaXN0PGk2ND4gc3RydWN0Ml9tZW1iZXIzLAorICAgIDQ6IGxpc3Q8ZG91YmxlPiBzdHJ1Y3QyX21lbWJlcjQgPVsxLjAsIDIuMV0sCisgICAgNTogbGlzdDxzdHJpbmc+IHN0cnVjdDJfbWVtYmVyNSwKKyAgICA2OiBsaXN0PGJvb2w+IHN0cnVjdDJfbWVtYmVyNiwKKyAgICA3OiBsaXN0PGJ5dGU+IHN0cnVjdDJfbWVtYmVyNywKKyAgICA4OiBsaXN0PGJpbmFyeT4gc3RydWN0Ml9tZW1iZXI4LAorICAgIDk6IGxpc3Q8dGVzdF9lbnVtMT4gc3RydWN0Ml9tZW1iZXI5Cit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDMgeworICAgIDE6IG1hcDxpMTYsIGkzMj4gc3RydWN0M19tZW1iZXIxID0gezE6MTAsIDI6MjB9LAorICAgIDI6IG1hcDxpNjQsIGRvdWJsZT4gc3RydWN0M19tZW1iZXIyID0gezE6MS4xLCAyOjIuMX0sCisgICAgMzogbWFwPHN0cmluZywgYm9vbD4gc3RydWN0M19tZW1iZXIzLAorICAgIDQ6IG1hcDxieXRlLCB0ZXN0X2VudW0xPiBzdHJ1Y3QzX21lbWJlcjQsCisgICAgNTogbWFwPHRlc3RfZW51bTIsIHRlc3RfZW51bTMgPiBzdHJ1Y3QzX21lbWJlcjUsCisgICAgNzogbWFwPGRvdWJsZSwgc3RyaW5nPiBzdHJ1Y3QzX21lbWJlcjcKK30KKworc3RydWN0IHRlc3Rfc3RydWN0NCB7CisgICAgMTogaTMyIHN0cnVjdDRfbWVtYmVyMSwKKyAgICAyOiBvcHRpb25hbCBpMzIgc3RydWN0NF9tZW1iZXIyCit9CisKK3N0cnVjdCB0ZXN0X3N0cnVjdDV7CisgICAgMTogZG91YmxlIHN0cnVjdDVfbWVtYmVyMSA9IDEuMSwKKyAgICAyOiBzdHJpbmcgc3RydWN0NV9tZW1iZXIyID0gIlRocmlmdCBBdWRpdCBUZXNzIgorfQorc3RydWN0IHRlc3Rfc3RydWN0NiB7CisgICAgMTogaTMyIHN0cnVjdDZfbWVtYmVyMSwKKyAgICAyOiByZXF1aXJlZCBpMzIgc3RydWN0Nl9tZW1iZXIyCit9CisKK3NlcnZpY2UgYmFzZSB7CisgICAgb25ld2F5IHZvaWQgYmFzZV9vbmV3YXkoCisgICAgICAgIDE6IGkzMiBhcmcxKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjEoCisgICAgICAgIDE6IGkxNiBmdW5jdGlvbjFfYXJnMSwKKyAgICAgICAgMjogaTMyIGZ1bmN0aW9uMV9hcmcyLAorICAgICAgICAzOiBpNjQgZnVuY3Rpb24xX2FyZzMsCisgICAgICAgIDQ6IGRvdWJsZSBmdW5jdGlvbjFfYXJnNCwKKyAgICAgICAgNTogc3RyaW5nIGZ1bmN0aW9uMV9hcmc1LAorICAgICAgICA2OiBib29sIGZ1bmN0aW9uMV9hcmc2LAorICAgICAgICA3OiB0ZXN0X2VudW0xIGZ1bmN0aW9uMV9hcmc3LAorICAgICAgICA4OiB0ZXN0X3N0cnVjdDEgZnVuY3Rpb24xX2FyZzgpLAorCisgICAgdm9pZCBiYXNlX2Z1bmN0aW9uMigKKyAgICAgICAgMTogbGlzdDxpMTY+IGZ1bmN0aW9uMl9hcmcxLAorICAgICAgICAyOiBsaXN0PGkzMj4gZnVuY3Rpb24yX2FyZzIsCisgICAgICAgIDM6IGxpc3Q8aTY0PiBmdW5jdGlvbjJfYXJnMywKKyAgICAgICAgNDogbGlzdDxkb3VibGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHN0cmluZz4gZnVuY3Rpb24yX2FyZzUsCisgICAgICAgIDY6IGxpc3Q8Ym9vbD4gZnVuY3Rpb24yX2FyZzYsCisgICAgICAgIDc6IGxpc3Q8Ynl0ZT4gZnVuY3Rpb24yX2FyZzcsCisgICAgICAgIDg6IGxpc3Q8dGVzdF9lbnVtMT4gZnVuY3Rpb24yX2FyZzgsCisgICAgICAgIDk6IGxpc3Q8dGVzdF9zdHJ1Y3QxPiBmdW5jdGlvbjJfYXJnOSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHZvaWQgYmFzZV9mdW5jdGlvbjMoKSwKKworfQorCitzZXJ2aWNlIGRlcml2ZWQxIGV4dGVuZHMgYmFzZXsKKyAgICAKKyAgICB0ZXN0X2VudW0xIGRlcml2ZWQxX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTY0IGZ1bmN0aW9uMV9hcmcxLAorICAgICAgICAyOiBkb3VibGUgZnVuY3Rpb24xX2FyZzIsCisgICAgICAgIDM6IHRlc3RfZW51bTEgZnVuY3Rpb24xX2FyZzMpIHRocm93cyAoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBpNjQgZGVyaXZlZDFfZnVuY3Rpb24yKAorICAgICAgICAxOiBsaXN0PGk2ND4gZnVuY3Rpb24yX2FyZzEsCisgICAgICAgIDI6IGxpc3Q8ZG91YmxlPiBmdW5jdGlvbjJfYXJnMiwKKyAgICAgICAgMzogbGlzdDxzdHJpbmc+IGZ1bmN0aW9uMl9hcmczLAorICAgICAgICA0OiBsaXN0PGJ5dGU+IGZ1bmN0aW9uMl9hcmc0LAorICAgICAgICA1OiBsaXN0PHRlc3RfZW51bTE+IGZ1bmN0aW9uMl9hcmc1KSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgZG91YmxlIGRlcml2ZWQxX2Z1bmN0aW9uMygKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uM19hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uM19hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgc3RyaW5nIGRlcml2ZWQxX2Z1bmN0aW9uNCgKKyAgICAgICAgMTogc3RyaW5nIGZ1bmN0aW9uNF9hcmcxLAorICAgICAgICAyOiBib29sIGZ1bmN0aW9uNF9hcmcyKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisKKyAgICBib29sIGRlcml2ZWQxX2Z1bmN0aW9uNSgKKyAgICAgICAgMTogbWFwPGk2NCwgZG91YmxlPiBmdW5jdGlvbjVfYXJnMSwKKyAgICAgICAgMjogbWFwPHN0cmluZywgYm9vbD4gZnVuY3Rpb241X2FyZzIsCisgICAgICAgIDM6IG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBmdW5jdGlvbjVfYXJnMykgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIHRlc3Rfc3RydWN0MSBkZXJpdmVkMV9mdW5jdGlvbjYoCisgICAgICAgIDE6IGRvdWJsZSBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKK30KKworc2VydmljZSBkZXJpdmVkMiBleHRlbmRzIGJhc2UgeworCisgICAgbGlzdDxpMzI+IGRlcml2ZWQyX2Z1bmN0aW9uMSgKKyAgICAgICAgMTogaTMyIGZ1bmN0aW9uMV9hcmcxKSB0aHJvd3MgKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorICAgIGxpc3Q8dGVzdF9lbnVtMT4gZGVyaXZlZDJfZnVuY3Rpb24yKAorICAgICAgICAxOmk2NCBmdW5jdGlvbjJfYXJnMikgdGhyb3dzICgxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIGxpc3Q8dGVzdF9zdHJ1Y3QxPiBkZXJpdmVkMl9mdW5jdGlvbjMoCisgICAgICAgIDE6ZG91YmxlIGZ1bmN0aW9uM19hcmcxKSB0aHJvd3MoMTp0ZXN0X2V4Y2VwdGlvbjIgZSksCisKKyAgICBtYXA8ZG91YmxlLCBzdHJpbmc+IGRlcml2ZWQyX2Z1bmN0aW9uNCgKKyAgICAgICAgMTpzdHJpbmcgZnVuY3Rpb240X2FyZzEpIHRocm93cygxOnRlc3RfZXhjZXB0aW9uMiBlKSwKKworICAgIG1hcDx0ZXN0X2VudW0xLCB0ZXN0X2VudW0yPiBkZXJpdmVkMl9mdW5jdGlvbjUoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjVfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorCisgICAgbWFwPHRlc3Rfc3RydWN0MSwgdGVzdF9zdHJ1Y3QyPiBkZXJpdmVkMl9mdW5jdGlvbjYoCisgICAgICAgIDE6Ym9vbCBmdW5jdGlvbjZfYXJnMSkgdGhyb3dzKDE6dGVzdF9leGNlcHRpb24yIGUpLAorICAgIAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvTWFrZWZpbGUuYW0gYi90ZXN0L2NfZ2xpYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YTAzZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jX2dsaWIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYnRlc3RjZ2xpYi5sYQorbm9kaXN0X2xpYnRlc3RjZ2xpYl9sYV9TT1VSQ0VTID0gXAorCWdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgXAorCWdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggXAorCWdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMgXAorCWdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggXAorCWdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMgXAorCWdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKKworbGlidGVzdGNnbGliX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKKworcHJlY3Jvc3M6IGxpYnRlc3RjZ2xpYi5sYSB0ZXN0X2NsaWVudCB0ZXN0X3NlcnZlcgorCitjaGVja19QUk9HUkFNUyA9IFwKKwl0ZXN0X2NsaWVudCBcCisJdGVzdF9zZXJ2ZXIKKwordGVzdF9jbGllbnRfU09VUkNFUyA9IFwKKwlzcmMvdGVzdF9jbGllbnQuYworCit0ZXN0X2NsaWVudF9MREFERCA9IFwKKwlsaWJ0ZXN0Y2dsaWIubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKKwordGVzdF9zZXJ2ZXJfU09VUkNFUyA9IFwKKwlzcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jIFwKKwlzcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oIFwKKwlzcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYyBcCisJc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmggXAorCXNyYy90ZXN0X3NlcnZlci5jCisKK3Rlc3Rfc2VydmVyX0xEQUREID0gXAorCWxpYnRlc3RjZ2xpYi5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYi5sYQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCitnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAtciAkPAorCitBTV9DRkxBR1MgPSAtZyAtV2FsbCAtV2V4dHJhICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpCitBTV9DWFhGTEFHUyA9ICQoQU1fQ0ZMQUdTKQorQU1fQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvbGliL2NfZ2xpYi9zcmMgLUlnZW4tY19nbGliCitBTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSBAR0NPVl9MREZMQUdTQAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBnZW4tY19nbGliLyoKKworRVhUUkFfRElTVCA9IFwKKwlzcmMvdGVzdF9jbGllbnQuYyBcCisJc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYyBcCisJc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaCBcCisJc3JjL3Rlc3Rfc2VydmVyLmMKZGlmZiAtLWdpdCBhL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jIGIvdGVzdC9jX2dsaWIvc3JjL3Rlc3RfY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyNGFiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCkBAIC0wLDAgKzEsMTgwNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIgorI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgiCisKKy8qIEhhbmRsZSBTSUdQSVBFIHNpZ25hbHMgKGluZGljYXRpbmcgdGhlIHNlcnZlciBoYXMgY2xvc2VkIHRoZQorICAgY29ubmVjdGlvbiBwcmVtYXR1cmVseSkgYnkgb3V0cHV0dGluZyBhbiBlcnJvciBtZXNzYWdlIGJlZm9yZQorICAgZXhpdGluZy4gKi8KK3N0YXRpYyB2b2lkCitzaWdwaXBlX2hhbmRsZXIgKGludCBzaWduYWxfbnVtYmVyKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2lnbmFsX251bWJlcik7CisKKyAgLyogRmx1c2ggc3RhbmRhcmQgb3V0cHV0IHRvIG1ha2Ugc3VyZSB0aGUgdGVzdCByZXN1bHRzIHNvIGZhciBhcmUKKyAgICAgbG9nZ2VkICovCisgIGZmbHVzaCAoc3Rkb3V0KTsKKworICBmcHV0cyAoIkJyb2tlbiBwaXBlIChzZXJ2ZXIgY2xvc2VkIGNvbm5lY3Rpb24gcHJlbWF0dXJlbHkpXG4iLCBzdGRlcnIpOworICBmZmx1c2ggKHN0ZGVycik7CisKKyAgLyogUmUtcmFpc2UgdGhlIHNpZ25hbCwgdGhpcyB0aW1lIGludm9raW5nIHRoZSBkZWZhdWx0IHNpZ25hbAorICAgICBoYW5kbGVyLCB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0gKi8KKyAgcmFpc2UgKFNJR1BJUEUpOworfQorCisvKiBDb21wYXJlIHR3byBnaW50MzIgdmFsdWVzLiBVc2VkIGZvciBzb3J0aW5nIGFuZCBmaW5kaW5nIGludGVnZXIKKyAgIHZhbHVlcyB3aXRoaW4gYSBHTGlzdC4gKi8KK3N0YXRpYyBnaW50CitnaW50MzJfY29tcGFyZSAoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGdpbnQzMiBpbnQzMl9hID0gKihnaW50MzIgKilhOworICBnaW50MzIgaW50MzJfYiA9ICooZ2ludDMyICopYjsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgaWYgKGludDMyX2EgPCBpbnQzMl9iKQorICAgIHJlc3VsdCA9IC0xOworICBlbHNlIGlmIChpbnQzMl9hID4gaW50MzJfYikKKyAgICByZXN1bHQgPSAxOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogSXQgZ2V0cyBhIG11bHRpcGxleGVkIHByb3RvY29sIHdoaWNoIHVzZXMgYSBjb25jcmV0ZSBwcm90b2NvbCB1bmRlcm5lYXRoCisgKiBAcGFyYW0gIHByb3RvY29sX25hbWUgIHRoZSBmdWxseSBxdWFsaWZpZWQgcHJvdG9jb2wgcGF0aCAoZS5nLiAiYmluYXJ5Om11bHRpIikKKyAqIEBwYXJhbSAgdHJhbnNwb3J0ICAgICAgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgKiBAcGFyYW0gIHNlcnZpY2VfbmFtZSAgIHRoZSBzaW5nbGUgc3VwcG9ydGVkIHNlcnZpY2UgbmFtZQorICogQHRvZG8gICAgICAgICAgICAgICAgICBuZWVkIHRvIGFsbG93IG11bHRpcGxlIHNlcnZpY2VzIHRvIGZ1bGx5IHRlc3QgbXVsdGlwbGV4ZWQKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgYSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3cmFwcGluZyB0aGUgY29ycmVjdCB1bmRlcmx5aW5nIHByb3RvY29sCisgKi8KK1RocmlmdFByb3RvY29sICoKK2dldF9tdWx0aXBsZXhlZF9wcm90b2NvbChnY2hhciAqcHJvdG9jb2xfbmFtZSwgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdjaGFyICpzZXJ2aWNlX25hbWUpCit7CisgIFRocmlmdFByb3RvY29sICogbXVsdGlwbGV4ZWRfcHJvdG9jb2wgPSBOVUxMOworCisgIGlmICggc3RybmNtcChwcm90b2NvbF9uYW1lLCAiYmluYXJ5OiIsIDcpID09IDApIHsKKyAgICBtdWx0aXBsZXhlZF9wcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIGlmICggc3RybmNtcChwcm90b2NvbF9uYW1lLCAiY29tcGFjdDoiLCA4KSA9PSAwKSB7CisgICAgbXVsdGlwbGV4ZWRfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIE5VTEwpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBtdWx0aXBsZXggcHJvdG9jb2wgbmFtZTogJXNcbiIsIHByb3RvY29sX25hbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsCisgICAgICAgICAgInRyYW5zcG9ydCIsICAgICAgdHJhbnNwb3J0LAorICAgICAgICAgICJwcm90b2NvbCIsICAgICAgIG11bHRpcGxleGVkX3Byb3RvY29sLAorICAgICAgICAgICJzZXJ2aWNlLW5hbWUiLCAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICBOVUxMKTsKK30KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0YXRpYyBnY2hhciAqICBob3N0ID0gTlVMTDsKKyAgc3RhdGljIGdpbnQgICAgIHBvcnQgPSA5MDkwOworICBzdGF0aWMgZ2Jvb2xlYW4gc3NsICA9IEZBTFNFOworICBzdGF0aWMgZ2NoYXIgKiAgdHJhbnNwb3J0X29wdGlvbiA9IE5VTEw7CisgIHN0YXRpYyBnY2hhciAqICBwcm90b2NvbF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2ludCAgICAgbnVtX3Rlc3RzID0gMTsKKworICBzdGF0aWMKKyAgICBHT3B0aW9uRW50cnkgb3B0aW9uX2VudHJpZXNbXSA9eworICAgIHsgImhvc3QiLCAgICAgICAgICAgICdoJywgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmaG9zdCwKKyAgICAgICJIb3N0IHRvIGNvbm5lY3QgKD1sb2NhbGhvc3QpIiwgTlVMTCB9LAorICAgIHsgInBvcnQiLCAgICAgICAgICAgICdwJywgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmcG9ydCwKKyAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0ICg9OTA5MCkiLCBOVUxMIH0sCisgICAgeyAic3NsIiwgICAgICAgICAgICAgJ3MnLCAwLCBHX09QVElPTl9BUkdfTk9ORSwgICAgICZzc2wsCisgICAgICAiRW5hYmxlIFNTTCIsIE5VTEwgfSwKKyAgICB7ICJ0cmFuc3BvcnQiLCAgICAgICAndCcsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJnRyYW5zcG9ydF9vcHRpb24sCisgICAgICAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkICg9YnVmZmVyZWQpIiwgTlVMTCB9LAorICAgIHsgInByb3RvY29sIiwgICAgICAgICdyJywgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAorICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIG11bHRpLCBtdWx0aWMgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgIHsgInRlc3Rsb29wcyIsICAgICAgICduJywgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmbnVtX3Rlc3RzLAorICAgICAgIk51bWJlciBvZiB0ZXN0cyAoPTEpIiwgTlVMTCB9LAorICAgIHsgTlVMTCB9CisgIH07CisKKyAgc3RydWN0IHNpZ2FjdGlvbiBzaWdwaXBlX2FjdGlvbjsKKworICBHVHlwZSAgc29ja2V0X3R5cGUgICAgPSBUSFJJRlRfVFlQRV9TT0NLRVQ7CisgIGdjaGFyICpzb2NrZXRfbmFtZSAgICA9ICJpcCI7CisgIEdUeXBlICB0cmFuc3BvcnRfdHlwZSA9IFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVDsKKyAgZ2NoYXIgKnRyYW5zcG9ydF9uYW1lID0gImJ1ZmZlcmVkIjsKKyAgR1R5cGUgIHByb3RvY29sX3R5cGUgID0gVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MOworICBnY2hhciAqcHJvdG9jb2xfbmFtZSAgPSAiYmluYXJ5IjsKKworICBUaHJpZnRTb2NrZXQgICAgKnNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICAqcHJvdG9jb2wyID0gTlVMTDsgICAgICAgICAgICAvLyBmb3IgbXVsdGlwbGV4ZWQgdGVzdHMKKworICBUVGVzdFRocmlmdFRlc3RJZiAqdGVzdF9jbGllbnQgPSBOVUxMOworICBUVGVzdFNlY29uZFNlcnZpY2VJZiAqc2Vjb25kX3NlcnZpY2UgPSBOVUxMOyAgLy8gZm9yIG11bHRpcGxleGVkIHRlc3RzCisKKyAgc3RydWN0IHRpbWV2YWwgdGltZV9zdGFydCwgdGltZV9zdG9wLCB0aW1lX2VsYXBzZWQ7CisgIGd1aW50NjQgdGltZV9lbGFwc2VkX3VzZWMsIHRpbWVfdG90YWxfdXNlYyA9IDA7CisgIGd1aW50NjQgdGltZV9taW5fdXNlYyA9IEdfTUFYVUlOVDY0LCB0aW1lX21heF91c2VjID0gMCwgdGltZV9hdmdfdXNlYzsKKworICBHT3B0aW9uQ29udGV4dCAqb3B0aW9uX2NvbnRleHQ7CisgIGdib29sZWFuIG9wdGlvbnNfdmFsaWQgPSBUUlVFOworICBpbnQgdGVzdF9udW0gPSAwOworICBpbnQgZmFpbF9jb3VudCA9IDA7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICAvKiBDb25maWd1cmUgYW5kIHBhcnNlIG91ciBjb21tYW5kLWxpbmUgb3B0aW9ucyAqLworICBvcHRpb25fY29udGV4dCA9IGdfb3B0aW9uX2NvbnRleHRfbmV3IChOVUxMKTsKKyAgZ19vcHRpb25fY29udGV4dF9hZGRfbWFpbl9lbnRyaWVzIChvcHRpb25fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgaWYgKCFnX29wdGlvbl9jb250ZXh0X3BhcnNlIChvcHRpb25fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICByZXR1cm4gMjU1OworICB9CisgIGdfb3B0aW9uX2NvbnRleHRfZnJlZSAob3B0aW9uX2NvbnRleHQpOworCisgIC8qIFNldCByZW1haW5pbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIHVuc3BlY2lmaWVkIG9wdGlvbnMgKi8KKyAgaWYgKGhvc3QgPT0gTlVMTCkKKyAgICBob3N0ID0gZ19zdHJkdXAgKCJsb2NhbGhvc3QiKTsKKworICAvKiBWYWxpZGF0ZSB0aGUgcGFyc2VkIG9wdGlvbnMgKi8KKyAgaWYgKHByb3RvY29sX29wdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImNvbXBhY3QiLCA4KSA9PSAwKSB7CisgICAgICBwcm90b2NvbF90eXBlID0gVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTDsKKyAgICAgIHByb3RvY29sX25hbWUgPSAiY29tcGFjdCI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgIm11bHRpIiwgNikgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MOworICAgICAgcHJvdG9jb2xfbmFtZSA9ICJiaW5hcnk6bXVsdGkiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aWMiLCA3KSA9PSAwKSB7CisgICAgICBwcm90b2NvbF90eXBlID0gVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0w7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3Q6bXVsdGljIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAiYmluYXJ5IiwgNykgPT0gMCkgeworICAgICAgcHJpbnRmKCJXZSBhcmUgZ29pbmcgd2l0aCBkZWZhdWx0IHByb3RvY29sXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmtub3duIHByb3RvY29sIHR5cGUgJXNcbiIsIHByb3RvY29sX29wdGlvbik7CisgICAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgaWYgKHRyYW5zcG9ydF9vcHRpb24gIT0gTlVMTCkgeworICAgIGlmIChzdHJuY21wICh0cmFuc3BvcnRfb3B0aW9uLCAiZnJhbWVkIiwgNykgPT0gMCkgeworICAgICAgdHJhbnNwb3J0X3R5cGUgPSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUOworICAgICAgdHJhbnNwb3J0X25hbWUgPSAiZnJhbWVkIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAodHJhbnNwb3J0X29wdGlvbiwgImJ1ZmZlcmVkIiwgOSkgIT0gMCkgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAlc1xuIiwgdHJhbnNwb3J0X29wdGlvbik7CisgICAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgaWYgKHNzbCkgeworICAgIHNvY2tldF90eXBlID0gVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVDsKKyAgICBzb2NrZXRfbmFtZSA9ICJpcC1zc2wiOworICAgIHByaW50ZigiVHlwZSBuYW1lICVzXG4iLCBnX3R5cGVfbmFtZSAoc29ja2V0X3R5cGUpKTsKKyAgfQorCisgIGlmICghb3B0aW9uc192YWxpZCkKKyAgICByZXR1cm4gMjU0OworCisgIHByaW50ZiAoIkNvbm5lY3RpbmcgKCVzLyVzKSB0bzogJXMvJXM6JWRcbiIsCisgICAgICAgICAgdHJhbnNwb3J0X25hbWUsCisgICAgICAgICAgcHJvdG9jb2xfbmFtZSwKKyAgICAgICAgICBzb2NrZXRfbmFtZSwKKyAgICAgICAgICBob3N0LAorICAgICAgICAgIHBvcnQpOworCisgIC8qIEluc3RhbGwgb3VyIFNJR1BJUEUgaGFuZGxlciwgd2hpY2ggb3V0cHV0cyBhbiBlcnJvciBtZXNzYWdlIHRvCisgICAgIHN0YW5kYXJkIGVycm9yIGJlZm9yZSBleGl0aW5nIHNvIHRlc3RlcnMgY2FuIGtub3cgd2hhdAorICAgICBoYXBwZW5lZCAqLworICBtZW1zZXQgKCZzaWdwaXBlX2FjdGlvbiwgMCwgc2l6ZW9mIChzaWdwaXBlX2FjdGlvbikpOworICBzaWdwaXBlX2FjdGlvbi5zYV9oYW5kbGVyID0gc2lncGlwZV9oYW5kbGVyOworICBzaWdwaXBlX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKKyAgc2lnYWN0aW9uIChTSUdQSVBFLCAmc2lncGlwZV9hY3Rpb24sIE5VTEwpOworCisgIGlmIChzc2wpIHsKKyAgICB0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2woKTsKKyAgfQorCisgIC8qIEVzdGFibGlzaCBhbGwgb3VyIGNvbm5lY3Rpb24gb2JqZWN0cyAqLworICBzb2NrZXQgPSBnX29iamVjdF9uZXcgKHNvY2tldF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAgICAgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoc3NsICYmICF0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2ZpbGUoVEhSSUZUX1NTTF9TT0NLRVQoc29ja2V0KSwgIi4uL2tleXMvQ0EucGVtIikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsb2FkIHZhbGlkYXRpb24gY2VydGlmaWNhdGUgLi4va2V5cy9DQS5wZW0gLSBkaWQgeW91IHJ1biBpbiB0aGUgdGVzdC9jX2dsaWIgZGlyZWN0b3J5P1xuIik7CisgICAgZ19jbGVhcl9vYmplY3QgKCZzb2NrZXQpOworICAgIHJldHVybiAyNTM7CisgIH0KKworICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKHRyYW5zcG9ydF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYocHJvdG9jb2xfdHlwZT09VEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wpIHsKKyAgICAvLyBUT0RPOiBBIG11bHRpcGxleGVkIHRlc3Qgc2hvdWxkIGFsc28gdGVzdCAiU2Vjb25kIiAoc2VlIEphdmEgVGVzdFNlcnZlcikKKyAgICAvLyBUaGUgY29udGV4dCBjb21lcyBmcm9tIHRoZSBuYW1lIG9mIHRoZSB0aHJpZnQgZmlsZS4gSWYgbXVsdGlwbGUgdGhyaWZ0CisgICAgLy8gc2NoZW1hcyBhcmUgdXNlZCB3ZSBoYXZlIHRvIHJlZG8gdGhlIHdheSB0aGlzIGlzIGRvbmUuCisgICAgcHJvdG9jb2wgPSBnZXRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wocHJvdG9jb2xfbmFtZSwgdHJhbnNwb3J0LCAiVGhyaWZ0VGVzdCIpOworICAgIGlmIChOVUxMID09IHByb3RvY29sKSB7CisgICAgICBnX2NsZWFyX29iamVjdCAoJnRyYW5zcG9ydCk7CisgICAgICBnX2NsZWFyX29iamVjdCAoJnNvY2tldCk7CisgICAgICByZXR1cm4gMjUyOworICAgIH0KKworICAgIC8vIE1ha2UgYSBzZWNvbmQgcHJvdG9jb2wgYW5kIGNsaWVudCBydW5uaW5nIG9uIHRoZSBzYW1lIG11bHRpcGxleGVkIHRyYW5zcG9ydAorICAgIHByb3RvY29sMiA9IGdldF9tdWx0aXBsZXhlZF9wcm90b2NvbChwcm90b2NvbF9uYW1lLCB0cmFuc3BvcnQsICJTZWNvbmRTZXJ2aWNlIik7CisgICAgc2Vjb25kX3NlcnZpY2UgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1NFQ09ORF9TRVJWSUNFX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgIHByb3RvY29sMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgfWVsc2V7CisgICAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKHByb3RvY29sX3R5cGUsCisgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgIE5VTEwpOworICB9CisKKyAgdGVzdF9jbGllbnQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RIUklGVF9URVNUX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIEV4ZWN1dGUgdGhlIGFjdHVhbCB0ZXN0cyAqLworICBmb3IgKHRlc3RfbnVtID0gMDsgdGVzdF9udW0gPCBudW1fdGVzdHM7ICsrdGVzdF9udW0pIHsKKyAgICBpZiAodGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpIHsKKyAgICAgIGdjaGFyICAgKnN0cmluZyAgPSBOVUxMOworICAgICAgZ2Jvb2xlYW4gYm9vbGVhbiA9IDA7CisgICAgICBnaW50OCAgICBieXRlICAgID0gMDsKKyAgICAgIGdpbnQzMiAgIGludDMyICAgPSAwOworICAgICAgZ2ludDY0ICAgaW50NjQgICA9IDA7CisgICAgICBnZG91YmxlICBkdWIgICAgID0gMDsKKworICAgICAgZ2ludCBieXRlX3RoaW5nLCBpMzJfdGhpbmcsIGlubmVyX2J5dGVfdGhpbmcsIGlubmVyX2kzMl90aGluZzsKKyAgICAgIGdpbnQ2NCBpNjRfdGhpbmcsIGlubmVyX2k2NF90aGluZzsKKworICAgICAgVFRlc3RYdHJ1Y3QgICp4dHJ1Y3Rfb3V0LCAgKnh0cnVjdF9vdXQyLCAqeHRydWN0X2luLCAgKmlubmVyX3h0cnVjdF9pbjsKKyAgICAgIFRUZXN0WHRydWN0MiAqeHRydWN0Ml9vdXQsICp4dHJ1Y3QyX2luOworCisgICAgICBHSGFzaFRhYmxlICptYXBfb3V0LCAqbWFwX2luLCAqaW5uZXJfbWFwX2luOworICAgICAgR0hhc2hUYWJsZSAqc2V0X291dCwgKnNldF9pbjsKKyAgICAgIGdwb2ludGVyIGtleSwgdmFsdWU7CisgICAgICBnaW50MzIgKmkzMl9rZXlfcHRyLCAqaTMyX3ZhbHVlX3B0cjsKKyAgICAgIEdIYXNoVGFibGVJdGVyIGhhc2hfdGFibGVfaXRlciwgaW5uZXJfaGFzaF90YWJsZV9pdGVyOworICAgICAgR0xpc3QgKmtleXNfb3V0LCAqa2V5c19pbiwgKmtleXNfZWxlbTsKKworICAgICAgR0FycmF5ICpsaXN0X291dCwgKmxpc3RfaW47CisKKyAgICAgIFRUZXN0TnVtYmVyeiBudW1iZXJ6OworICAgICAgVFRlc3ROdW1iZXJ6IG51bWJlcnoyOworCisgICAgICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHIsICp1c2VyX2lkX3B0cjI7CisKKyAgICAgIFRUZXN0SW5zYW5pdHkgKmluc2FuaXR5X291dCwgKmluc2FuaXR5X2luOworICAgICAgR0hhc2hUYWJsZSAqdXNlcl9tYXA7CisgICAgICBHSGFzaFRhYmxlSXRlciB1c2VyX21hcF9pdGVyOworICAgICAgR1B0ckFycmF5ICp4dHJ1Y3RzOworCisgICAgICBUVGVzdFhjZXB0aW9uICAqeGNlcHRpb24gID0gTlVMTDsKKyAgICAgIFRUZXN0WGNlcHRpb24yICp4Y2VwdGlvbjIgPSBOVUxMOworCisgICAgICBnYm9vbGVhbiBvbmV3YXlfcmVzdWx0OworICAgICAgc3RydWN0IHRpbWV2YWwgb25ld2F5X3N0YXJ0LCBvbmV3YXlfZW5kLCBvbmV3YXlfZWxhcHNlZDsKKyAgICAgIGdpbnQgb25ld2F5X2VsYXBzZWRfdXNlYzsKKworICAgICAgZ2Jvb2xlYW4gZmlyc3Q7CisgICAgICBnaW50MzIgaSwgajsKKworICAgICAgcHJpbnRmICgiVGVzdCAjJWQsIGNvbm5lY3QgJXM6JWRcbiIsIHRlc3RfbnVtICsgMSwgaG9zdCwgcG9ydCk7CisgICAgICBnZXR0aW1lb2ZkYXkgKCZ0aW1lX3N0YXJ0LCBOVUxMKTsKKworICAgICAgLyogVGhlc2UgdGVzdCByb3V0aW5lcyBoYXZlIGJlZW4gcG9ydGVkIGZyb20gdGhlIEMrKyB0ZXN0CisgICAgICAgICBjbGllbnQsIGNhcmUgYmVpbmcgdGFrZW4gdG8gZW5zdXJlIHRoZWlyIG91dHB1dCByZW1haW5zIGFzCisgICAgICAgICBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgb3JpZ2luYWwgdG8gZmFjaWxpdGF0ZSBkaWZmcy4KKworICAgICAgICAgRm9yIHNpbXBsaWNpdHkgY29tbWVudHMgaGF2ZSBiZWVuIG9taXR0ZWQsIGJ1dCBldmVyeSByb3V0aW5lCisgICAgICAgICBoYXMgdGhlIHNhbWUgYmFzaWMgc3RydWN0dXJlOgorCisgICAgICAgICAtIENyZWF0ZSBhbmQgcG9wdWxhdGUgZGF0YSBzdHJ1Y3R1cmVzIGFzIG5lY2Vzc2FyeS4KKworICAgICAgICAgLSBGb3JtYXQgYW5kIG91dHB1dCAodG8gdGhlIGNvbnNvbGUpIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICAgICAgIG91dGdvaW5nIGRhdGEuCisKKyAgICAgICAgIC0gSXNzdWUgdGhlIHJlbW90ZSBtZXRob2QgY2FsbCB0byB0aGUgc2VydmVyLgorCisgICAgICAgICAtIEZvcm1hdCBhbmQgb3V0cHV0IGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJldHVybmVkIGRhdGEuCisKKyAgICAgICAgIC0gVmVyaWZ5IHRoZSByZXR1cm5lZCBkYXRhIG1hdGNoZXMgd2hhdCB3YXMgZXhwZWN0ZWQuCisKKyAgICAgICAgIC0gRGVhbGxvY2F0ZSBhbnkgY3JlYXRlZCBkYXRhIHN0cnVjdHVyZXMuCisKKyAgICAgICAgIE5vdGUgdGhlIHJlY29nbml6ZWQgdmFsdWVzIGFuZCBleHBlY3RlZCBiZWhhdmlvdXIgb2YgZWFjaAorICAgICAgICAgcmVtb3RlIG1ldGhvZCBhcmUgZGVzY3JpYmVkIGluIFRocmlmdFRlc3QudGhyaWZ0LCB3aGljaAorICAgICAgICAgeW91J2xsIGZpbmQgaW4gdGhlIHRvcC1sZXZlbCAidGVzdCIgZm9sZGVyLiAqLworCisgICAgICAvKioKKyAgICAgICAqIFZPSUQgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0Vm9pZCgpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3Rfdm9pZCAodGVzdF9jbGllbnQsICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gdm9pZFxuIik7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYoZXJyb3IhPU5VTEwpeworICAgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBTVFJJTkcgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X3N0cmluZyAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSBcIiVzXCJcbiIsIHN0cmluZyk7CisgICAgICAgIGlmIChzdHJuY21wIChzdHJpbmcsICJUZXN0IiwgNSkgIT0gMCkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgZ19mcmVlIChzdHJpbmcpOworICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIE11bHRpcGxleGVkIFRlc3QgLSBkbyB0aGlzIHJpZ2h0IGluIHRoZSBtaWRkbGUgb2YgdGhlIG5vcm1hbCBUZXN0IENsaWVudCBydW4KKyAgICAgICAqLworICAgICAgaWYgKHNlY29uZF9zZXJ2aWNlKSB7CisgICAgICAgIHByaW50ZiAoInRlc3RTZWNvbmRTZXJ2aWNlTXVsdGlwbGV4U2Vjb25kVGVzdFN0cmluZyhcIjJuZFwiKSIpOworICAgICAgICBpZiAodF90ZXN0X3NlY29uZF9zZXJ2aWNlX2lmX3NlY29uZHRlc3Rfc3RyaW5nIChzZWNvbmRfc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjJuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgICBwcmludGYgKCIgPSBcIiVzXCJcbiIsIHN0cmluZyk7CisgICAgICAgICAgaWYgKHN0cmNtcCAoc3RyaW5nLCAidGVzdFN0cmluZyhcIjJuZFwiKSIpICE9IDApIHsKKyAgICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEJPT0wgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZSh0cnVlKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2Jvb2wgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib29sZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlc1xuIiwgYm9vbGVhbiA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICBpZiAoYm9vbGVhbiAhPSAxKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoInRlc3RCeXRlKGZhbHNlKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2Jvb2wgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib29sZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlc1xuIiwgYm9vbGVhbiA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICBpZiAoYm9vbGVhbiAhPSAwKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBCWVRFIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEJ5dGUoMSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ieXRlICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJWRcbiIsIGJ5dGUpOworICAgICAgICBpZiAoYnl0ZSAhPSAxKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoInRlc3RCeXRlKC0xKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2J5dGUgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJWRcbiIsIGJ5dGUpOworICAgICAgICBpZiAoYnl0ZSAhPSAtMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogSTMyIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEkzMigtMSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9pMzIgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVkXG4iLCBpbnQzMik7CisgICAgICAgIGlmIChpbnQzMiAhPSAtMSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogSTY0IFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfaTY0ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50NjQpLTM0MzU5NzM4MzY4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlIiBQUklkNjQgIlxuIiwgaW50NjQpOworICAgICAgICBpZiAoaW50NjQgIT0gKGdpbnQ2NCktMzQzNTk3MzgzNjgpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIERPVUJMRSBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZigidGVzdERvdWJsZSgtNS4yMDk4NTIzKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2RvdWJsZSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUuMjA5ODUyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0gJWZcbiIsIGR1Yik7CisgICAgICAgIGlmICgoZHViIC0gKC01LjIwOTg1MjMpKSA+IDAuMDAxKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBCSU5BUlkgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0QmluYXJ5KGVtcHR5KSIpOworICAgICAgR0J5dGVBcnJheSAqZW1wdHlBcnJheSA9IGdfYnl0ZV9hcnJheV9uZXcoKTsKKyAgICAgIEdCeXRlQXJyYXkgKnJlc3VsdCA9IE5VTEw7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYmluYXJ5ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBHQnl0ZXMgKnJlc3BvbnNlID0gZ19ieXRlX2FycmF5X2ZyZWVfdG9fYnl0ZXMocmVzdWx0KTsgIC8vIGZyZWVzIHJlc3VsdAorICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICBnc2l6ZSBzaXogPSBnX2J5dGVzX2dldF9zaXplKHJlc3BvbnNlKTsKKyAgICAgICAgaWYgKHNpeiA9PSAwKSB7CisgICAgICAgICAgcHJpbnRmKCIgPSBlbXB0eVxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmKCIgPSBub3QgZW1wdHkgKCVsZCBieXRlcylcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICB9CisgICAgICAgIGdfYnl0ZXNfdW5yZWYocmVzcG9uc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBnX2J5dGVfYXJyYXlfdW5yZWYoZW1wdHlBcnJheSk7CisgICAgICBlbXB0eUFycmF5ID0gTlVMTDsKKworICAgICAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKSB3aXRoIGRhdGEKKyAgICAgIHByaW50ZiAoInRlc3RCaW5hcnkoWy0xMjguLjEyN10pID0geyIpOworICAgICAgY29uc3Qgc2lnbmVkIGNoYXIgYmluX2RhdGFbMjU2XQorICAgICAgICA9IHstMTI4LCAtMTI3LCAtMTI2LCAtMTI1LCAtMTI0LCAtMTIzLCAtMTIyLCAtMTIxLCAtMTIwLCAtMTE5LCAtMTE4LCAtMTE3LCAtMTE2LCAtMTE1LCAtMTE0LAorICAgICAgICAgICAtMTEzLCAtMTEyLCAtMTExLCAtMTEwLCAtMTA5LCAtMTA4LCAtMTA3LCAtMTA2LCAtMTA1LCAtMTA0LCAtMTAzLCAtMTAyLCAtMTAxLCAtMTAwLCAtOTksCisgICAgICAgICAgIC05OCwgIC05NywgIC05NiwgIC05NSwgIC05NCwgIC05MywgIC05MiwgIC05MSwgIC05MCwgIC04OSwgIC04OCwgIC04NywgIC04NiwgIC04NSwgIC04NCwKKyAgICAgICAgICAgLTgzLCAgLTgyLCAgLTgxLCAgLTgwLCAgLTc5LCAgLTc4LCAgLTc3LCAgLTc2LCAgLTc1LCAgLTc0LCAgLTczLCAgLTcyLCAgLTcxLCAgLTcwLCAgLTY5LAorICAgICAgICAgICAtNjgsICAtNjcsICAtNjYsICAtNjUsICAtNjQsICAtNjMsICAtNjIsICAtNjEsICAtNjAsICAtNTksICAtNTgsICAtNTcsICAtNTYsICAtNTUsICAtNTQsCisgICAgICAgICAgIC01MywgIC01MiwgIC01MSwgIC01MCwgIC00OSwgIC00OCwgIC00NywgIC00NiwgIC00NSwgIC00NCwgIC00MywgIC00MiwgIC00MSwgIC00MCwgIC0zOSwKKyAgICAgICAgICAgLTM4LCAgLTM3LCAgLTM2LCAgLTM1LCAgLTM0LCAgLTMzLCAgLTMyLCAgLTMxLCAgLTMwLCAgLTI5LCAgLTI4LCAgLTI3LCAgLTI2LCAgLTI1LCAgLTI0LAorICAgICAgICAgICAtMjMsICAtMjIsICAtMjEsICAtMjAsICAtMTksICAtMTgsICAtMTcsICAtMTYsICAtMTUsICAtMTQsICAtMTMsICAtMTIsICAtMTEsICAtMTAsICAtOSwKKyAgICAgICAgICAgLTgsICAgLTcsICAgLTYsICAgLTUsICAgLTQsICAgLTMsICAgLTIsICAgLTEsICAgMCwgICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNSwgICAgNiwKKyAgICAgICAgICAgNywgICAgOCwgICAgOSwgICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjEsCisgICAgICAgICAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LAorICAgICAgICAgICAzNywgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICA0MywgICA0NCwgICA0NSwgICA0NiwgICA0NywgICA0OCwgICA0OSwgICA1MCwgICA1MSwKKyAgICAgICAgICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgNjQsICAgNjUsICAgNjYsCisgICAgICAgICAgIDY3LCAgIDY4LCAgIDY5LCAgIDcwLCAgIDcxLCAgIDcyLCAgIDczLCAgIDc0LCAgIDc1LCAgIDc2LCAgIDc3LCAgIDc4LCAgIDc5LCAgIDgwLCAgIDgxLAorICAgICAgICAgICA4MiwgICA4MywgICA4NCwgICA4NSwgICA4NiwgICA4NywgICA4OCwgICA4OSwgICA5MCwgICA5MSwgICA5MiwgICA5MywgICA5NCwgICA5NSwgICA5NiwKKyAgICAgICAgICAgOTcsICAgOTgsICAgOTksICAgMTAwLCAgMTAxLCAgMTAyLCAgMTAzLCAgMTA0LCAgMTA1LCAgMTA2LCAgMTA3LCAgMTA4LCAgMTA5LCAgMTEwLCAgMTExLAorICAgICAgICAgICAxMTIsICAxMTMsICAxMTQsICAxMTUsICAxMTYsICAxMTcsICAxMTgsICAxMTksICAxMjAsICAxMjEsICAxMjIsICAxMjMsICAxMjQsICAxMjUsICAxMjYsCisgICAgICAgICAgIDEyN307CisgICAgICBHQnl0ZUFycmF5ICpmdWxsQXJyYXkgPSBnX2J5dGVfYXJyYXlfbmV3KCk7CisgICAgICBnX2J5dGVfYXJyYXlfYXBwZW5kKGZ1bGxBcnJheSwgKGd1aW50OCAqKSgmYmluX2RhdGFbMF0pLCAyNTYpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2JpbmFyeSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBHQnl0ZXMgKnJlc3BvbnNlID0gZ19ieXRlX2FycmF5X2ZyZWVfdG9fYnl0ZXMocmVzdWx0KTsgIC8vIGZyZWVzIHJlc3VsdAorICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICBnc2l6ZSBzaXogPSBnX2J5dGVzX2dldF9zaXplKHJlc3BvbnNlKTsKKyAgICAgICAgZ2NvbnN0cG9pbnRlciBwdHIgPSBnX2J5dGVzX2dldF9kYXRhKHJlc3BvbnNlLCAmc2l6KTsKKyAgICAgICAgaWYgKHNpeiA9PSAyNTYpIHsKKyAgICAgICAgICBnYm9vbGVhbiBmaXJzdCA9IDE7CisgICAgICAgICAgZ2Jvb2xlYW4gZmFpbGVkID0gMDsKKyAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkKKyAgICAgICAgICAgICAgcHJpbnRmKCIsIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGZpcnN0ID0gMDsKKyAgICAgICAgICAgIGludCB2YWwgPSAoKHNpZ25lZCBjaGFyICopcHRyKVtpXTsKKyAgICAgICAgICAgIHByaW50ZigiJWQiLCB2YWwpOworICAgICAgICAgICAgaWYgKCFmYWlsZWQgJiYgdmFsICE9IGkgLSAxMjgpIHsKKyAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmKCJ9ICIpOworICAgICAgICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgICAgIHByaW50ZigiRkFJTCAoYmFkIGNvbnRlbnQpIHNpemUgJWxkIE9LXG4iLCAobG9uZylzaXopOworICAgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIk9LIHNpemUgJWxkIE9LXG4iLCAobG9uZylzaXopOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGYoIiA9IGJhZCBzaXplICVsZFxuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZ19ieXRlc191bnJlZihyZXNwb25zZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGdfYnl0ZV9hcnJheV91bnJlZihmdWxsQXJyYXkpOworICAgICAgZnVsbEFycmF5ID0gTlVMTDsKKworICAgICAgLyoqCisgICAgICAgKiBTVFJVQ1QgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICAgIHh0cnVjdF9vdXQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAiWmVybyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICAgICAtMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAgIC01TEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIHh0cnVjdF9pbiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X3N0cnVjdCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRydWN0X291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAmaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgIHByaW50ZiAoIiA9IHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9XG4iLAorICAgICAgICAgICAgICAgIHN0cmluZywKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgIGkzMl90aGluZywKKyAgICAgICAgICAgICAgICBpNjRfdGhpbmcpOworICAgICAgICBpZiAoKHN0cmluZyA9PSBOVUxMIHx8IHN0cm5jbXAgKHN0cmluZywgIlplcm8iLCA1KSAhPSAwKSB8fAorICAgICAgICAgICAgYnl0ZV90aGluZyAhPSAxIHx8CisgICAgICAgICAgICBpMzJfdGhpbmcgIT0gLTMgfHwKKyAgICAgICAgICAgIGk2NF90aGluZyAhPSAoZ2ludDY0KS01KQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBpZiAoc3RyaW5nKSB7CisgICAgICAgICAgZ19mcmVlIChzdHJpbmcpOworICAgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIC8vIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3Rfb3V0KTsgdXNlZCBiZWxvdworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9pbik7CisKKyAgICAgIC8qKgorICAgICAgICogTkVTVEVEIFNUUlVDVCBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0pLCA1fSIpOworICAgICAgeHRydWN0Ml9vdXQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cnVjdF90aGluZyIsIHh0cnVjdF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICAgICAgICAgIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICB4dHJ1Y3QyX2luID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QyLCBOVUxMKTsKKworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X25lc3QgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4dHJ1Y3QyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0cnVjdDJfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4dHJ1Y3QyX2luLAorICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgJnh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgZ19vYmplY3RfZ2V0ICh4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZpbm5lcl9ieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaW5uZXJfaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAmaW5uZXJfaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgIHByaW50ZiAoIiA9IHslZCwge1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICVkfVxuIiwKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgIHN0cmluZywKKyAgICAgICAgICAgICAgICBpbm5lcl9ieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgIGlubmVyX2kzMl90aGluZywKKyAgICAgICAgICAgICAgICBpbm5lcl9pNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nKTsKKyAgICAgICAgaWYgKGJ5dGVfdGhpbmcgIT0gMSB8fAorICAgICAgICAgICAgKHN0cmluZyA9PSBOVUxMIHx8IHN0cm5jbXAgKHN0cmluZywgIlplcm8iLCA1KSAhPSAwKSB8fAorICAgICAgICAgICAgaW5uZXJfYnl0ZV90aGluZyAhPSAxIHx8CisgICAgICAgICAgICBpbm5lcl9pMzJfdGhpbmcgIT0gLTMgfHwKKyAgICAgICAgICAgIGlubmVyX2k2NF90aGluZyAhPSAoZ2ludDY0KS01IHx8CisgICAgICAgICAgICBpMzJfdGhpbmcgIT0gNSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgaWYgKHN0cmluZykgeworICAgICAgICAgIGdfZnJlZShzdHJpbmcpOworICAgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0Ml9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0Ml9vdXQpOworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9vdXQpOworCisgICAgICAvKioKKyAgICAgICAqIE1BUCBURVNUCisgICAgICAgKi8KKyAgICAgIG1hcF9vdXQgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgICAgIGkzMl9rZXlfcHRyICAgPSBnX21hbGxvYyAoc2l6ZW9mICppMzJfa2V5X3B0cik7CisgICAgICAgIGkzMl92YWx1ZV9wdHIgPSBnX21hbGxvYyAoc2l6ZW9mICppMzJfdmFsdWVfcHRyKTsKKworICAgICAgICAqaTMyX2tleV9wdHIgICA9IGk7CisgICAgICAgICppMzJfdmFsdWVfcHRyID0gaSAtIDEwOworCisgICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKG1hcF9vdXQsIGkzMl9rZXlfcHRyLCBpMzJfdmFsdWVfcHRyKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoInRlc3RNYXAoeyIpOworICAgICAgZmlyc3QgPSBUUlVFOworICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX291dCk7CisgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgIHByaW50ZiAoIiVkID0+ICVkIiwgKihnaW50MzIgKilrZXksICooZ2ludDMyICopdmFsdWUpOworICAgICAgfQorICAgICAgcHJpbnRmICgifSkiKTsKKworICAgICAgbWFwX2luID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUpOworCisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfbWFwICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmhhc2hfdGFibGVfaXRlciwgbWFwX2luKTsKKyAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICAgIHByaW50ZiAoIiVkID0+ICVkIiwgKihnaW50MzIgKilrZXksICooZ2ludDMyICopdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHByaW50ZiAoIn1cbiIpOworCisgICAgICAgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAobWFwX2luKSAhPSBnX2hhc2hfdGFibGVfc2l6ZSAobWFwX291dCkpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfb3V0KTsKKyAgICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgICAgZ3BvaW50ZXIgaW5fdmFsdWUgPSBnX2hhc2hfdGFibGVfbG9va3VwIChtYXBfaW4sIGtleSk7CisgICAgICAgICAgICBpZiAoaW5fdmFsdWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICooZ2ludDMyICopaW5fdmFsdWUgIT0gKihnaW50MzIgKil2YWx1ZSkgeworICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKG1hcF9pbik7CisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKG1hcF9vdXQpOworCisgICAgICAvKioKKyAgICAgICAqIFNUUklORyBNQVAgVEVTVAorICAgICAgICovCisgICAgICBtYXBfb3V0ID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX3N0cl9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19zdHJfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChtYXBfb3V0LCAiYSIsICAgICIyIik7CisgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChtYXBfb3V0LCAiYiIsICAgICJibGFoIik7CisgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChtYXBfb3V0LCAic29tZSIsICJ0aGluZyIpOworICAgICAgcHJpbnRmICgidGVzdFN0cmluZ01hcCh7Iik7CisgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfb3V0KTsKKyAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgcHJpbnRmICgiXCIlc1wiID0+IFwiJXNcIiIsIChnY2hhciAqKWtleSwgKGdjaGFyICopdmFsdWUpOworICAgICAgfQorICAgICAgcHJpbnRmICgiKX0iKTsKKworICAgICAgbWFwX2luID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX3N0cl9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3N0cl9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUpOworCisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3Rfc3RyaW5nX21hcCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0geyIpOworICAgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9pbik7CisgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgICBwcmludGYgKCJcIiVzXCIgPT4gXCIlc1wiIiwgKGdjaGFyICopa2V5LCAoZ2NoYXIgKil2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmICgifVxuIik7CisKKyAgICAgICAgaWYgKGdfaGFzaF90YWJsZV9zaXplIChtYXBfaW4pICE9IGdfaGFzaF90YWJsZV9zaXplIChtYXBfb3V0KSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIG1hcF9vdXQpOworICAgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgICBncG9pbnRlciBpbl92YWx1ZSA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1hcF9pbiwga2V5KTsKKyAgICAgICAgICAgIGlmIChpbl92YWx1ZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgc3RyY21wICgoZ2NoYXIgKilpbl92YWx1ZSwgKGdjaGFyICopdmFsdWUpICE9IDApIHsKKyAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChtYXBfaW4pOworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChtYXBfb3V0KTsKKworICAgICAgLyoqCisgICAgICAgKiBTRVQgVEVTVAorICAgICAgICovCisgICAgICBzZXRfb3V0ID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLCBnX2ludF9lcXVhbCwgZ19mcmVlLCBOVUxMKTsKKyAgICAgIGZvciAoaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGkzMl9rZXlfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqaTMyX2tleV9wdHIpOworICAgICAgICAqaTMyX2tleV9wdHIgPSBpOworCisgICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHNldF9vdXQsIGkzMl9rZXlfcHRyLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoInRlc3RTZXQoeyIpOworICAgICAgZmlyc3QgPSBUUlVFOworICAgICAga2V5c19vdXQgPSBnX2hhc2hfdGFibGVfZ2V0X2tleXMgKHNldF9vdXQpOworICAgICAga2V5c19lbGVtID0ga2V5c19vdXQ7CisgICAgICB3aGlsZSAoa2V5c19lbGVtICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYgKCIsICIpOworCisgICAgICAgIHByaW50ZiAoIiVkIiwgKihnaW50MzIgKilrZXlzX2VsZW0tPmRhdGEpOworCisgICAgICAgIGtleXNfZWxlbSA9IGtleXNfZWxlbS0+bmV4dDsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIn0pIik7CisKKyAgICAgIHNldF9pbiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwgZ19pbnRfZXF1YWwsIGdfZnJlZSwgTlVMTCk7CisKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9zZXQgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0geyIpOworICAgICAgICBmaXJzdCA9IFRSVUU7CisgICAgICAgIGtleXNfaW4gPSBnX2hhc2hfdGFibGVfZ2V0X2tleXMgKHNldF9pbik7CisgICAgICAgIGtleXNfZWxlbSA9IGtleXNfaW47CisgICAgICAgIHdoaWxlIChrZXlzX2VsZW0gIT0gTlVMTCkgeworICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgICAgICAgIHByaW50ZiAoIiVkIiwgKihnaW50MzIgKilrZXlzX2VsZW0tPmRhdGEpOworCisgICAgICAgICAga2V5c19lbGVtID0ga2V5c19lbGVtLT5uZXh0OworICAgICAgICB9CisgICAgICAgIHByaW50ZiAoIn1cbiIpOworCisgICAgICAgIGlmIChnX2xpc3RfbGVuZ3RoIChrZXlzX2luKSAhPSBnX2xpc3RfbGVuZ3RoIChrZXlzX291dCkpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBrZXlzX2VsZW0gPSBrZXlzX291dDsKKyAgICAgICAgICB3aGlsZSAoa2V5c19lbGVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChnX2xpc3RfZmluZF9jdXN0b20gKGtleXNfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzX2VsZW0tPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzJfY29tcGFyZSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrZXlzX2VsZW0gPSBrZXlzX2VsZW0tPm5leHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ19saXN0X2ZyZWUgKGtleXNfaW4pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKHNldF9pbik7CisgICAgICBnX2xpc3RfZnJlZSAoa2V5c19vdXQpOworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmIChzZXRfb3V0KTsKKworICAgICAgLyoqCisgICAgICAgKiBMSVNUIFRFU1QKKyAgICAgICAqLworICAgICAgbGlzdF9vdXQgPSBnX2FycmF5X25ldyAoRkFMU0UsIFRSVUUsIHNpemVvZiAoZ2ludDMyKSk7CisgICAgICBmb3IgKGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgICBnX2FycmF5X2FwcGVuZF92YWwgKGxpc3Rfb3V0LCBpKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoInRlc3RMaXN0KHsiKTsKKyAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoZ2ludDMyKWxpc3Rfb3V0LT5sZW47ICsraSkgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgcHJpbnRmICgiJWQiLCBnX2FycmF5X2luZGV4IChsaXN0X291dCwgZ2ludDMyLCBpKSk7CisgICAgICB9CisgICAgICBwcmludGYgKCJ9KSIpOworCisgICAgICBsaXN0X2luID0gZ19hcnJheV9uZXcgKEZBTFNFLCBUUlVFLCBzaXplb2YgKGdpbnQzMikpOworCisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfbGlzdCAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpc3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gVFJVRTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChnaW50MzIpbGlzdF9pbi0+bGVuOyArK2kpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICBmaXJzdCA9IEZBTFNFOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICAgICAgICBwcmludGYgKCIlZCIsIGdfYXJyYXlfaW5kZXggKGxpc3RfaW4sIGdpbnQzMiwgaSkpOworICAgICAgICB9CisgICAgICAgIHByaW50ZiAoIn1cbiIpOworCisgICAgICAgIGlmIChsaXN0X2luLT5sZW4gIT0gbGlzdF9vdXQtPmxlbiB8fAorICAgICAgICAgICAgbWVtY21wIChsaXN0X2luLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICBsaXN0X291dC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbGlzdF9pbi0+bGVuICogc2l6ZW9mIChnaW50MzIpKSAhPSAwKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgZ19hcnJheV91bnJlZiAobGlzdF9pbik7CisgICAgICBnX2FycmF5X3VucmVmIChsaXN0X291dCk7CisKKyAgICAgIC8qKgorICAgICAgICogRU5VTSBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZigidGVzdEVudW0oT05FKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2VudW0gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJ6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9OVU1CRVJaX09ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0gJWRcbiIsIG51bWJlcnopOworICAgICAgICBpZiAobnVtYmVyeiAhPSBUX1RFU1RfTlVNQkVSWl9PTkUpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBwcmludGYoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9lbnVtICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfTlVNQkVSWl9UV08sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYoIiA9ICVkXG4iLCBudW1iZXJ6KTsKKyAgICAgICAgaWYgKG51bWJlcnogIT0gVF9URVNUX05VTUJFUlpfVFdPKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgcHJpbnRmKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9lbnVtICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfTlVNQkVSWl9USFJFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZigiID0gJWRcbiIsIG51bWJlcnopOworICAgICAgICBpZiAobnVtYmVyeiAhPSBUX1RFU1RfTlVNQkVSWl9USFJFRSkKKyAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIHByaW50ZigidGVzdEVudW0oRklWRSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9lbnVtICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfTlVNQkVSWl9GSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmKCIgPSAlZFxuIiwgbnVtYmVyeik7CisgICAgICAgIGlmIChudW1iZXJ6ICE9IFRfVEVTVF9OVU1CRVJaX0ZJVkUpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBwcmludGYoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2VudW0gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJ6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9OVU1CRVJaX0VJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmKCIgPSAlZFxuIiwgbnVtYmVyeik7CisgICAgICAgIGlmIChudW1iZXJ6ICE9IFRfVEVTVF9OVU1CRVJaX0VJR0hUKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBUWVBFREVGIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X3R5cGVkZWYgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOTg1ODIzNTA4MjUyM0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmKCIgPSAlIiBQUklkNjQgIlxuIiwgdXNlcl9pZCk7CisgICAgICAgIGlmICh1c2VyX2lkICE9IDMwOTg1ODIzNTA4MjUyM0xMKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBORVNURUQgTUFQIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdE1hcE1hcCgxKSIpOworICAgICAgbWFwX2luID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2ludF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpZ19oYXNoX3RhYmxlX3VucmVmKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9tYXBfbWFwICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfaW4pOworCisgICAgICAgIHByaW50ZiAoIiA9IHsiKTsKKyAgICAgICAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgIHByaW50ZiAoIiVkID0+IHsiLCAqKGdpbnQzMiAqKWtleSk7CisKKyAgICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaW5uZXJfaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHSGFzaFRhYmxlICopdmFsdWUpOworICAgICAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaW5uZXJfaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgICBwcmludGYgKCIlZCA9PiAlZCwgIiwgKihnaW50MzIgKilrZXksICooZ2ludDMyICopdmFsdWUpOworICAgICAgICAgIH0KKworICAgICAgICAgIHByaW50ZiAoIn0sICIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZiAoIn1cbiIpOworCisgICAgICAgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAobWFwX2luKSAhPSAyKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZ2ludDMyIGlubmVyX2tleXNbXSA9IHsxLCAyLCAzLCA0fTsKKyAgICAgICAgICBnaW50MzIgaTMyX2tleTsKKworICAgICAgICAgIGkzMl9rZXkgPSAtNDsKKyAgICAgICAgICBpbm5lcl9tYXBfaW4gPSBnX2hhc2hfdGFibGVfbG9va3VwIChtYXBfaW4sICZpMzJfa2V5KTsKKyAgICAgICAgICBpZiAoaW5uZXJfbWFwX2luID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3NpemUgKGlubmVyX21hcF9pbikgIT0gNCkKKyAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGtleXNfaW4gPSBnX2hhc2hfdGFibGVfZ2V0X2tleXMgKGlubmVyX21hcF9pbik7CisgICAgICAgICAgICBrZXlzX2luID0gZ19saXN0X3NvcnQgKGtleXNfaW4sIGdpbnQzMl9jb21wYXJlKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICBrZXlzX2VsZW0gPSBnX2xpc3RfbnRoIChrZXlzX2luLCAzIC0gaSk7CisKKyAgICAgICAgICAgICAgaWYgKCooZ2ludDMyICopa2V5c19lbGVtLT5kYXRhICE9ICgtMSAqIGlubmVyX2tleXNbaV0pIHx8CisgICAgICAgICAgICAgICAgICAqKGdpbnQzMiAqKWdfaGFzaF90YWJsZV9sb29rdXAgKGlubmVyX21hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c19lbGVtLT5kYXRhKSAhPQorICAgICAgICAgICAgICAgICAgKC0xICogaW5uZXJfa2V5c1tpXSkpIHsKKyAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ19saXN0X2ZyZWUgKGtleXNfaW4pOworICAgICAgICAgIH0KKworICAgICAgICAgIGkzMl9rZXkgPSA0OworICAgICAgICAgIGlubmVyX21hcF9pbiA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1hcF9pbiwgJmkzMl9rZXkpOworICAgICAgICAgIGlmIChpbm5lcl9tYXBfaW4gPT0gTlVMTCB8fAorICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfc2l6ZSAoaW5uZXJfbWFwX2luKSAhPSA0KQorICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAga2V5c19pbiA9IGdfaGFzaF90YWJsZV9nZXRfa2V5cyAoaW5uZXJfbWFwX2luKTsKKyAgICAgICAgICAgIGtleXNfaW4gPSBnX2xpc3Rfc29ydCAoa2V5c19pbiwgZ2ludDMyX2NvbXBhcmUpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgIGtleXNfZWxlbSA9IGdfbGlzdF9udGggKGtleXNfaW4sIGkpOworCisgICAgICAgICAgICAgIGlmICgqKGdpbnQzMiAqKWtleXNfZWxlbS0+ZGF0YSAhPSBpbm5lcl9rZXlzW2ldIHx8CisgICAgICAgICAgICAgICAgICAqKGdpbnQzMiAqKWdfaGFzaF90YWJsZV9sb29rdXAgKGlubmVyX21hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c19lbGVtLT5kYXRhKSAhPQorICAgICAgICAgICAgICAgICAgaW5uZXJfa2V5c1tpXSkgeworICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnX2xpc3RfZnJlZSAoa2V5c19pbik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisKKyAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX2luKTsKKworICAgICAgLyoqCisgICAgICAgKiBJTlNBTklUWSBURVNUCisgICAgICAgKi8KKyAgICAgIGluc2FuaXR5X291dCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIE5VTEwpOworICAgICAgZ19vYmplY3RfZ2V0IChpbnNhbml0eV9vdXQsCisgICAgICAgICAgICAgICAgICAgICJ1c2VyTWFwIiwgJnVzZXJfbWFwLAorICAgICAgICAgICAgICAgICAgICAieHRydWN0cyIsICZ4dHJ1Y3RzLAorICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgbnVtYmVyeiA9IFRfVEVTVF9OVU1CRVJaX0ZJVkU7CisgICAgICBudW1iZXJ6MiA9IFRfVEVTVF9OVU1CRVJaX0VJR0hUOworICAgICAgdXNlcl9pZF9wdHIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICAgICAqdXNlcl9pZF9wdHIgPSA1OworICAgICAgdXNlcl9pZF9wdHIyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOworICAgICAgKnVzZXJfaWRfcHRyMiA9IDg7CisgICAgICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnosIHVzZXJfaWRfcHRyKTsKKyAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyejIsIHVzZXJfaWRfcHRyMik7CisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKworICAgICAgeHRydWN0X291dCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJIZWxsbzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAyTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIHh0cnVjdF9vdXQyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIHh0cnVjdF9vdXQyKTsKKyAgICAgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0X291dCk7CisgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisKKyAgICAgIG1hcF9pbiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnQ2NF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludDY0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRGVzdHJveU5vdGlmeSlnX2hhc2hfdGFibGVfdW5yZWYpOworCisgICAgICBwcmludGYoInRlc3RJbnNhbml0eSgpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfaW5zYW5pdHkgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNhbml0eV9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgcHJpbnRmICgiID0geyIpOworICAgICAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCBtYXBfaW4pOworICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgcHJpbnRmICgiJSIgUFJJZDY0ICIgPT4geyIsICooVFRlc3RVc2VySWQgKilrZXkpOworCisgICAgICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0hhc2hUYWJsZSAqKXZhbHVlKTsKKyAgICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmlubmVyX2hhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgICAgICAgICAgcHJpbnRmICgiJWQgPT4geyIsIChUVGVzdE51bWJlcnopa2V5KTsKKworICAgICAgICAgICAgZ19vYmplY3RfZ2V0ICgoVFRlc3RJbnNhbml0eSAqKXZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgIHByaW50ZiAoInsiKTsKKyAgICAgICAgICAgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZ1c2VyX21hcF9pdGVyLCB1c2VyX21hcCk7CisgICAgICAgICAgICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJnVzZXJfbWFwX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICAgICAgICAgIHByaW50ZiAoIiVkID0+ICUiIFBSSWQ2NCAiLCAiLAorICAgICAgICAgICAgICAgICAgICAgIChUVGVzdE51bWJlcnopa2V5LAorICAgICAgICAgICAgICAgICAgICAgICooVFRlc3RVc2VySWQgKil2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYgKCJ9LCAiKTsKKyAgICAgICAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOworCisgICAgICAgICAgICBwcmludGYoInsiKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoZ2ludDMyKXh0cnVjdHMtPmxlbjsgKytpKSB7CisgICAgICAgICAgICAgIHh0cnVjdF9pbiA9IGdfcHRyX2FycmF5X2luZGV4ICh4dHJ1Y3RzLCBpKTsKKyAgICAgICAgICAgICAgZ19vYmplY3RfZ2V0ICh4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgICZieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAmaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAmaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICAgIHByaW50ZiAoIntcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAiLAorICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmICgifSIpOworICAgICAgICAgICAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOworCisgICAgICAgICAgICBwcmludGYgKCJ9LCAiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIn1cbiIpOworCisgICAgICAgIGlmIChnX2hhc2hfdGFibGVfc2l6ZSAobWFwX2luKSAhPSAyKQorICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgVFRlc3ROdW1iZXJ6IG51bWJlcnpfa2V5X3ZhbHVlc1tdID0geworICAgICAgICAgICAgVF9URVNUX05VTUJFUlpfVFdPLCBUX1RFU1RfTlVNQkVSWl9USFJFRQorICAgICAgICAgIH07CisgICAgICAgICAgZ2ludCB1c2VyX21hcF92YWx1ZXNbXSA9IHsgNSwgOCB9OworICAgICAgICAgIFRUZXN0VXNlcklkIHVzZXJfaWRfa2V5OworCisgICAgICAgICAgdXNlcl9pZF9rZXkgPSAxOworICAgICAgICAgIGlubmVyX21hcF9pbiA9IGdfaGFzaF90YWJsZV9sb29rdXAgKG1hcF9pbiwgJnVzZXJfaWRfa2V5KTsKKyAgICAgICAgICBpZiAoaW5uZXJfbWFwX2luID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgZ19oYXNoX3RhYmxlX3NpemUgKGlubmVyX21hcF9pbikgIT0gMikKKyAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFRUZXN0TnVtYmVyeiBudW1iZXJ6X2tleTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICAgICAgICBudW1iZXJ6X2tleSA9IG51bWJlcnpfa2V5X3ZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgaW5zYW5pdHlfaW4gPQorICAgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV9sb29rdXAgKGlubmVyX21hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2NvbnN0cG9pbnRlciludW1iZXJ6X2tleSk7CisgICAgICAgICAgICAgIGlmIChpbnNhbml0eV9pbiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZ19vYmplY3RfZ2V0IChpbnNhbml0eV9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VyTWFwIiwgJnVzZXJfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICAgICAgaWYgKHVzZXJfbWFwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICBpZiAoZ19oYXNoX3RhYmxlX3NpemUgKHVzZXJfbWFwKSAhPSAyKQorICAgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnpfa2V5ID0gKFRUZXN0TnVtYmVyeil1c2VyX21hcF92YWx1ZXNbal07CisKKyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfbG9va3VwICh1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnY29uc3Rwb2ludGVyKW51bWJlcnpfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAqKFRUZXN0VXNlcklkICopdmFsdWUgIT0gKFRUZXN0VXNlcklkKXVzZXJfbWFwX3ZhbHVlc1tqXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoeHRydWN0cyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMtPmxlbiAhPSAyKQorICAgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeHRydWN0X2luID0gZ19wdHJfYXJyYXlfaW5kZXggKHh0cnVjdHMsIDApOworICAgICAgICAgICAgICAgICAgICBnX29iamVjdF9nZXQgKHh0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgICZpNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY21wIChzdHJpbmcsICJHb29kYnllNCIsIDkpICE9IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nICE9IDQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyAhPSA0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgIT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKworICAgICAgICAgICAgICAgICAgICB4dHJ1Y3RfaW4gPSBnX3B0cl9hcnJheV9pbmRleCAoeHRydWN0cywgMSk7CisgICAgICAgICAgICAgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAgKHN0cmluZywgIkhlbGxvMiIsIDcpICE9IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nICE9IDIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyAhPSAyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgIT0gMikKKyAgICAgICAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIHVzZXJfaWRfa2V5ID0gMjsKKyAgICAgICAgICBpbm5lcl9tYXBfaW4gPSBnX2hhc2hfdGFibGVfbG9va3VwIChtYXBfaW4sICZ1c2VyX2lkX2tleSk7CisgICAgICAgICAgaWYgKGlubmVyX21hcF9pbiA9PSBOVUxMIHx8CisgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV9zaXplIChpbm5lcl9tYXBfaW4pICE9IDEpCisgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnNhbml0eV9pbiA9CisgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV9sb29rdXAgKGlubmVyX21hcF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdjb25zdHBvaW50ZXIpVF9URVNUX05VTUJFUlpfU0lYKTsKKyAgICAgICAgICAgIGlmIChpbnNhbml0eV9pbiA9PSBOVUxMKQorICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgZ19vYmplY3RfZ2V0IChpbnNhbml0eV9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAieHRydWN0cyIsICZ4dHJ1Y3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICAgIGlmICh1c2VyX21hcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGdfaGFzaF90YWJsZV9zaXplICh1c2VyX21hcCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICAgICAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzLT5sZW4gIT0gMCkKKyAgICAgICAgICAgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICAgICAgICAgIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKG1hcF9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCAoJmluc2FuaXR5X291dCk7CisKKyAgICAgIC8qIHRlc3QgZXhjZXB0aW9uICovCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSA9PiIpOworICAgICAgaWYgKCF0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9leGNlcHRpb24gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgJiYKKyAgICAgICAgICB4Y2VwdGlvbiAhPSBOVUxMKSB7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgImVycm9yQ29kZSIsICZpbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsICAgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgcHJpbnRmICgiICB7JXUsIFwiJXNcIn1cbiIsIGludDMyLCBzdHJpbmcpOworICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIgIHZvaWRcbkZBSUxVUkVcbiIpOworICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikgPT4iKTsKKyAgICAgIGlmICghdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZXhjZXB0aW9uICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgJiYKKyAgICAgICAgICB4Y2VwdGlvbiA9PSBOVUxMICYmCisgICAgICAgICAgZXJyb3IgIT0gTlVMTCkgeworICAgICAgICBwcmludGYgKCIgIENhdWdodCBURXhjZXB0aW9uXG4iKTsKKworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiAgdm9pZFxuRkFJTFVSRVxuIik7CisgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKworICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgeworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJzdWNjZXNzXCIpID0+Iik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfZXhjZXB0aW9uICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWNjZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpCisgICAgICAgIHByaW50ZiAoIiAgdm9pZFxuIik7CisgICAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiICB2b2lkXG5GQUlMVVJFXG4iKTsKKyAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOworCisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICAgICAgLyogdGVzdCBtdWx0aSBleGNlcHRpb24gKi8KKyAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgXCJ0ZXN0IDFcIikgPT4iKTsKKyAgICAgIHh0cnVjdF9pbiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKKyAgICAgIGlmICghdF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfbXVsdGlfZXhjZXB0aW9uICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSAmJgorICAgICAgICAgIHhjZXB0aW9uICE9IE5VTEwgJiYKKyAgICAgICAgICB4Y2VwdGlvbjIgPT0gTlVMTCkgeworICAgICAgICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAmaW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAgICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIHByaW50ZiAoIiAgeyV1LCBcIiVzXCJ9XG4iLCBpbnQzMiwgc3RyaW5nKTsKKyAgICAgICAgZ19mcmVlIChzdHJpbmcpOworCisgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7CisgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKKworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKKyAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uMik7CisKKyAgICAgICAgaWYgKGVycm9yICE9IE5VTEwpIHsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3RfaW4pOworCisgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIpOworICAgICAgeHRydWN0X2luID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOworICAgICAgaWYgKCF0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9tdWx0aV9leGNlcHRpb24gKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSAmJgorICAgICAgICAgIHhjZXB0aW9uID09IE5VTEwgJiYKKyAgICAgICAgICB4Y2VwdGlvbjIgIT0gTlVMTCkgeworICAgICAgICBnX29iamVjdF9nZXQgKHhjZXB0aW9uMiwKKyAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgICAgJmludDMyLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCAmaW5uZXJfeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBnX29iamVjdF9nZXQgKGlubmVyX3h0cnVjdF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgcHJpbnRmICgiICB7JXUsIHtcIiVzXCJ9fVxuIiwgaW50MzIsIHN0cmluZyk7CisgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJmlubmVyX3h0cnVjdF9pbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKKworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKKyAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uMik7CisKKyAgICAgICAgaWYgKGVycm9yICE9IE5VTEwpIHsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeHRydWN0X2luKTsKKworICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CisgICAgICB4dHJ1Y3RfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfbXVsdGlfZXhjZXB0aW9uICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4dHJ1Y3RfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4Y2VwdGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpICYmCisgICAgICAgICAgeGNlcHRpb24gPT0gTlVMTCAmJgorICAgICAgICAgIHhjZXB0aW9uMiA9PSBOVUxMKSB7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBwcmludGYgKCIgIHt7XCIlc1wifX1cbiIsIHN0cmluZyk7CisgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwcmludGYgKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CisgICAgICAgIGZhaWxfY291bnQrKzsKKworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOworCisgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBnX2NsZWFyX29iamVjdCAoJnh0cnVjdF9pbik7CisKKyAgICAgIC8qIHRlc3Qgb25ld2F5IHZvaWQgKi8KKyAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdE9uZXdheSgxKSA9PiIpOworICAgICAgZ2V0dGltZW9mZGF5ICgmb25ld2F5X3N0YXJ0LCBOVUxMKTsKKyAgICAgIG9uZXdheV9yZXN1bHQgPSB0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9vbmV3YXkgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7CisgICAgICBnZXR0aW1lb2ZkYXkgKCZvbmV3YXlfZW5kLCBOVUxMKTsKKyAgICAgIHRpbWVyc3ViICgmb25ld2F5X2VuZCwgJm9uZXdheV9zdGFydCwgJm9uZXdheV9lbGFwc2VkKTsKKyAgICAgIG9uZXdheV9lbGFwc2VkX3VzZWMgPQorICAgICAgICBvbmV3YXlfZWxhcHNlZC50dl9zZWMgKiAxMDAwICogMTAwMCArIG9uZXdheV9lbGFwc2VkLnR2X3VzZWM7CisKKyAgICAgIGlmIChvbmV3YXlfcmVzdWx0KSB7CisgICAgICAgIGlmIChvbmV3YXlfZWxhcHNlZF91c2VjID4gMjAwICogMTAwMCkgeworICAgICAgICAgIHByaW50ZiAoIiAgRkFJTFVSRSAtIHRvb2sgJS4yZiBtc1xuIiwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpb25ld2F5X2VsYXBzZWRfdXNlYyAvIDEwMDAuMCk7CisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYgKCIgIHN1Y2Nlc3MgLSB0b29rICUuMmYgbXNcbiIsCisgICAgICAgICAgICAgICAgICAoZG91YmxlKW9uZXdheV9lbGFwc2VkX3VzZWMgLyAxMDAwLjApOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIHJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieQorICAgICAgICogb25lIiAtLSBpZiB0aGUgc2VydmVyIHRyZWF0ZWQgb25ld2F5IHZvaWQgbGlrZSBub3JtYWwgdm9pZCwgdGhpcyBuZXh0CisgICAgICAgKiB0ZXN0IHdpbGwgZmFpbCBzaW5jZSBpdCB3aWxsIGdldCB0aGUgdm9pZCBjb25maXJtYXRpb24gcmF0aGVyIHRoYW4KKyAgICAgICAqIHRoZSBjb3JyZWN0IHJlc3VsdC4gSW4gdGhpcyBjaXJjdW1zdGFuY2UsIHRoZSBjbGllbnQgd2lsbCByZWNlaXZlIHRoZQorICAgICAgICogZXJyb3I6CisgICAgICAgKgorICAgICAgICogICBhcHBsaWNhdGlvbiBlcnJvcjogV3JvbmcgbWV0aG9kIG5hbWUKKyAgICAgICAqLworICAgICAgLyoqCisgICAgICAgKiBJMzIgVEVTVAorICAgICAgICovCisgICAgICBwcmludGYgKCJyZS10ZXN0IHRlc3RJMzIoLTEpIik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfaTMyICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgeworICAgICAgICBwcmludGYgKCIgPSAlZFxuIiwgaW50MzIpOworICAgICAgICBpZiAoaW50MzIgIT0gLTEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorCisgICAgICBnZXR0aW1lb2ZkYXkgKCZ0aW1lX3N0b3AsIE5VTEwpOworICAgICAgdGltZXJzdWIgKCZ0aW1lX3N0b3AsICZ0aW1lX3N0YXJ0LCAmdGltZV9lbGFwc2VkKTsKKyAgICAgIHRpbWVfZWxhcHNlZF91c2VjID0KKyAgICAgICAgdGltZV9lbGFwc2VkLnR2X3NlYyAqIDEwMDAgKiAxMDAwICsgdGltZV9lbGFwc2VkLnR2X3VzZWM7CisKKyAgICAgIHByaW50ZigiVG90YWwgdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfZWxhcHNlZF91c2VjKTsKKworICAgICAgdGltZV90b3RhbF91c2VjICs9IHRpbWVfZWxhcHNlZF91c2VjOworICAgICAgaWYgKHRpbWVfZWxhcHNlZF91c2VjIDwgdGltZV9taW5fdXNlYykKKyAgICAgICAgdGltZV9taW5fdXNlYyA9IHRpbWVfZWxhcHNlZF91c2VjOworICAgICAgaWYgKHRpbWVfZWxhcHNlZF91c2VjID4gdGltZV9tYXhfdXNlYykKKyAgICAgICAgdGltZV9tYXhfdXNlYyA9IHRpbWVfZWxhcHNlZF91c2VjOworCisgICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsICZlcnJvcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcHJpbnRmICgiQ29ubmVjdCBmYWlsZWQ6ICVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisKKyAgLyogQWxsIGRvbmUtLS1vdXRwdXQgc3RhdGlzdGljcyAqLworICBwdXRzICgiXG5BbGwgdGVzdHMgZG9uZS4iKTsKKyAgcHJpbnRmKCJOdW1iZXIgb2YgZmFpbHVyZXM6ICVkXG4iLCBmYWlsX2NvdW50KTsKKworICB0aW1lX2F2Z191c2VjID0gdGltZV90b3RhbF91c2VjIC8gbnVtX3Rlc3RzOworCisgIHByaW50ZiAoIk1pbiB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgdGltZV9taW5fdXNlYyk7CisgIHByaW50ZiAoIk1heCB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgdGltZV9tYXhfdXNlYyk7CisgIHByaW50ZiAoIkF2ZyB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgdGltZV9hdmdfdXNlYyk7CisKKyAgZ19jbGVhcl9vYmplY3QoJnNlY29uZF9zZXJ2aWNlKTsKKyAgZ19jbGVhcl9vYmplY3QoJnByb3RvY29sMik7CisgIGdfY2xlYXJfb2JqZWN0KCZ0ZXN0X2NsaWVudCk7CisgIGdfY2xlYXJfb2JqZWN0KCZwcm90b2NvbCk7CisgIGdfY2xlYXJfb2JqZWN0KCZ0cmFuc3BvcnQpOworICBnX2NsZWFyX29iamVjdCgmc29ja2V0KTsKKworICBpZiAoc3NsKSB7CisgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCgpOworICB9CisKKyAgcmV0dXJuIGZhaWxfY291bnQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzE2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKworI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgiCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCIKKworI2luY2x1ZGUgInRocmlmdF90ZXN0X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJ0aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oIgorCisvKiBPdXIgc2VydmVyIG9iamVjdCwgZGVjbGFyZWQgZ2xvYmFsbHkgc28gaXQgaXMgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIFNJR0lOVAorICAgc2lnbmFsIGhhbmRsZXIgKi8KK1RocmlmdFNlcnZlciAqc2VydmVyID0gTlVMTDsKKworLyogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlcnZlciB3YXMgaW50ZXJydXB0ZWQgd2l0aCBTSUdJTlQKKyAgIChpLmUuIEN0cmwtQykgc28gd2UgY2FuIHRlbGwgd2hldGhlciBpdHMgdGVybWluYXRpb24gd2FzIGFibm9ybWFsICovCitnYm9vbGVhbiBzaWdpbnRfcmVjZWl2ZWQgPSBGQUxTRTsKKworLyogSGFuZGxlIFNJR0lOVCAoIkN0cmwtQyIpIHNpZ25hbHMgYnkgZ3JhY2VmdWxseSBzdG9wcGluZyB0aGUgc2VydmVyICovCitzdGF0aWMgdm9pZAorc2lnaW50X2hhbmRsZXIgKGludCBzaWduYWxfbnVtYmVyKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2lnbmFsX251bWJlcik7CisKKyAgLyogVGFrZSBub3RlIHdlIHdlcmUgY2FsbGVkICovCisgIHNpZ2ludF9yZWNlaXZlZCA9IFRSVUU7CisKKyAgLyogU2h1dCBkb3duIHRoZSBzZXJ2ZXIgZ3JhY2VmdWxseSAqLworICBpZiAoc2VydmVyICE9IE5VTEwpCisgICAgdGhyaWZ0X3NlcnZlcl9zdG9wIChzZXJ2ZXIpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgc3RhdGljIGdpbnQgICBwb3J0ID0gOTA5MDsKKyAgc3RhdGljIGdjaGFyICpzZXJ2ZXJfdHlwZV9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2NoYXIgKnRyYW5zcG9ydF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2NoYXIgKnByb3RvY29sX29wdGlvbiA9IE5VTEw7CisgIHN0YXRpYyBnaW50ICAgc3RyaW5nX2xpbWl0ID0gMDsKKyAgc3RhdGljIGdpbnQgICBjb250YWluZXJfbGltaXQgPSAwOworCisgIHN0YXRpYworICAgIEdPcHRpb25FbnRyeSBvcHRpb25fZW50cmllc1tdID0geworICAgIHsgInBvcnQiLCAgICAgICAgICAgIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJnBvcnQsCisgICAgICAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCAoPTkwOTApIiwgTlVMTCB9LAorICAgIHsgInNlcnZlci10eXBlIiwgICAgIDAsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJnNlcnZlcl90eXBlX29wdGlvbiwKKyAgICAgICJUeXBlIG9mIHNlcnZlcjogc2ltcGxlICg9c2ltcGxlKSIsIE5VTEwgfSwKKyAgICB7ICJ0cmFuc3BvcnQiLCAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZ0cmFuc3BvcnRfb3B0aW9uLAorICAgICAgIlRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCAoPWJ1ZmZlcmVkKSIsIE5VTEwgfSwKKyAgICB7ICJwcm90b2NvbCIsICAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZwcm90b2NvbF9vcHRpb24sCisgICAgICAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCAoPWJpbmFyeSkiLCBOVUxMIH0sCisgICAgeyAic3RyaW5nLWxpbWl0IiwgICAgMCwgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmc3RyaW5nX2xpbWl0LAorICAgICAgIk1heCBzdHJpbmcgbGVuZ3RoICg9bm9uZSkiLCBOVUxMIH0sCisgICAgeyAiY29udGFpbmVyLWxpbWl0IiwgMCwgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmY29udGFpbmVyX2xpbWl0LAorICAgICAgIk1heCBjb250YWluZXIgbGVuZ3RoICg9bm9uZSkiLCBOVUxMIH0sCisgICAgeyBOVUxMIH0KKyAgfTsKKworICBnY2hhciAqc2VydmVyX25hbWUgICAgICAgICAgICA9ICJzaW1wbGUiOworICBnY2hhciAqdHJhbnNwb3J0X25hbWUgICAgICAgICA9ICJidWZmZXJlZCI7CisgIEdUeXBlICB0cmFuc3BvcnRfZmFjdG9yeV90eXBlID0gVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlk7CisgIGdjaGFyICpwcm90b2NvbF9uYW1lICAgICAgICAgID0gImJpbmFyeSI7CisgIEdUeXBlICBwcm90b2NvbF9mYWN0b3J5X3R5cGUgID0gVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlk7CisKKyAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciAqaGFuZGxlcjsKKyAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciAqaGFuZGxlcl9zZWNvbmRfc2VydmljZSA9IE5VTEw7CisgIFRocmlmdFByb2Nlc3NvciAgICAgICAgKnByb2Nlc3NvcjsKKyAgVGhyaWZ0UHJvY2Vzc29yICAgICAgICAqcHJvY2Vzc29yX3Rlc3QgPSBOVUxMOworICBUaHJpZnRQcm9jZXNzb3IgICAgICAgICpwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UgPSBOVUxMOworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgICpzZXJ2ZXJfdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICp0cmFuc3BvcnRfZmFjdG9yeTsKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICAqcHJvdG9jb2xfZmFjdG9yeTsKKworICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2ludF9hY3Rpb247CisKKyAgR09wdGlvbkNvbnRleHQgKm9wdGlvbl9jb250ZXh0OworICBnYm9vbGVhbiAgICAgICAgb3B0aW9uc192YWxpZCA9IFRSVUU7CisKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIC8qIENvbmZpZ3VyZSBhbmQgcGFyc2Ugb3VyIGNvbW1hbmQtbGluZSBvcHRpb25zICovCisgIG9wdGlvbl9jb250ZXh0ID0gZ19vcHRpb25fY29udGV4dF9uZXcgKE5VTEwpOworICBnX29wdGlvbl9jb250ZXh0X2FkZF9tYWluX2VudHJpZXMgKG9wdGlvbl9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBpZiAoZ19vcHRpb25fY29udGV4dF9wYXJzZSAob3B0aW9uX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSA9PSBGQUxTRSkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgcmV0dXJuIDI1NTsKKyAgfQorICBnX29wdGlvbl9jb250ZXh0X2ZyZWUgKG9wdGlvbl9jb250ZXh0KTsKKworICAvKiBWYWxpZGF0ZSB0aGUgcGFyc2VkIG9wdGlvbnMgKi8KKyAgaWYgKHNlcnZlcl90eXBlX29wdGlvbiAhPSBOVUxMICYmCisgICAgICBzdHJuY21wIChzZXJ2ZXJfdHlwZV9vcHRpb24sICJzaW1wbGUiLCA3KSAhPSAwKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBzZXJ2ZXIgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKKyAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CisgIH0KKworICBpZiAocHJvdG9jb2xfb3B0aW9uICE9IE5VTEwpIHsKKyAgICBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAiY29tcGFjdCIsIDgpID09IDApIHsKKyAgICAgIHByb3RvY29sX2ZhY3RvcnlfdHlwZSA9IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWTsKKyAgICAgIHByb3RvY29sX25hbWUgPSAiY29tcGFjdCI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgIm11bHRpIiwgNikgPT0gMCkgeworCXByb3RvY29sX25hbWUgPSAiYmluYXJ5Om11bHRpIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGljIiwgNykgPT0gMCkgeworCXByb3RvY29sX2ZhY3RvcnlfdHlwZSA9IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWTsKKwlwcm90b2NvbF9uYW1lID0gImNvbXBhY3Q6bXVsdGljIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAiYmluYXJ5IiwgNykgIT0gMCkgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwcm90b2NvbCB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOworICAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGlmICh0cmFuc3BvcnRfb3B0aW9uICE9IE5VTEwpIHsKKyAgICBpZiAoc3RybmNtcCAodHJhbnNwb3J0X29wdGlvbiwgImZyYW1lZCIsIDcpID09IDApIHsKKyAgICAgIHRyYW5zcG9ydF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlk7CisgICAgICB0cmFuc3BvcnRfbmFtZSA9ICJmcmFtZWQiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wICh0cmFuc3BvcnRfb3B0aW9uLCAiYnVmZmVyZWQiLCA5KSAhPSAwKSB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmtub3duIHRyYW5zcG9ydCB0eXBlICVzXG4iLCB0cmFuc3BvcnRfb3B0aW9uKTsKKyAgICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBpZiAoIW9wdGlvbnNfdmFsaWQpCisgICAgcmV0dXJuIDI1NDsKKworICAvKiBFc3RhYmxpc2ggYWxsIG91ciBjb25uZWN0aW9uIG9iamVjdHMgKi8KKyAgaGFuZGxlciAgICAgICAgICAgPSBnX29iamVjdF9uZXcgKFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisKKworICBpZihzdHJzdHIocHJvdG9jb2xfbmFtZSwgIjptdWx0aSIpKXsKKyAgICAgIC8qIFdoZW4gYSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgaXMgaW52b2x2ZWQgdGhlIGhhbmRsZXIgaXMgbm90CisgICAgICAgICByZWdpc3RlcmVkIGFzIHVzdWFsLiBXZSBjcmVhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlIHJlYWwKKyAgICAgICAgIHByb2Nlc3NvciBpcyByZWdpc3RlcmVkLiBNdWx0aXBsZSBwcm9jZXNzb3JzIGNhbiBiZSByZWdpc3RlcmVkCisgICAgICAgICBhdCBvbmNlLiBUaGlzIGlzIHdoeSB3ZSBkb24ndCBoYXZlIGEgY29uc3RydWN0b3IgcHJvcGVydHkgKi8KKyAgICAgIHByb2Nlc3NvciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SLAorCQkJCQkgTlVMTCk7CisKKyAgICAgIGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UgPSBnX29iamVjdF9uZXcgKFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiwKKyAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBwcm9jZXNzb3JfdGVzdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfUFJPQ0VTU09SLAorCQkJCSAgICAiaGFuZGxlciIsIGhhbmRsZXIsCisJCQkJICAgIE5VTEwpOworICAgICAgcHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlID0gICBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1NFQ09ORF9TRVJWSUNFX1BST0NFU1NPUiwKKwkJCQkgICAgImhhbmRsZXIiLCBoYW5kbGVyX3NlY29uZF9zZXJ2aWNlLAorCQkJCSAgICBOVUxMKTsKKworICAgICAgLyogV2UgcmVnaXN0ZXIgYSB0ZXN0IHByb2Nlc3NvciB3aXRoIE11bHRpcGxleGVkIG5hbWUgVGhyaWZ0VGVzdCAqLworICAgICAgaWYoIXRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKHByb2Nlc3NvciwKKwkJCQkJCSAgICAgICJUaHJpZnRUZXN0IiwgcHJvY2Vzc29yX3Rlc3QsCisJCQkJCQkgICAgICAmZXJyb3IpKXsKKwkgICAgZ19tZXNzYWdlICgidGhyaWZ0X3NlcnZlcl9zZXJ2ZTogJXMiLAorCSAgICAgICAgICAgICAgIGVycm9yICE9IE5VTEwgPyBlcnJvci0+bWVzc2FnZSA6ICIobnVsbCkiKTsKKwkgICAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgICAgIH0KKyAgICAgIC8qIFdlIHJlZ2lzdGVyIGEgc2Vjb25kIHRlc3QgcHJvY2Vzc29yIHdpdGggTXVsdGlwbGV4ZWQgbmFtZSBTZWNvbmRTZXJ2aWNlCisgICAgICAgKiB3ZSBhcmUgcmVzcG9uc2libGUgb2YgZnJlZWluZyB0aGUgcHJvY2Vzc29yIHdoZW4gaXQncyBub3QgdXNlZCBhbnltb3JlICovCisgICAgICBpZighdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IocHJvY2Vzc29yLAorCQkJCQkJICAgICAgIlNlY29uZFNlcnZpY2UiLCBwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UsCisJCQkJCQkgICAgICAmZXJyb3IpKXsKKwkgICAgZ19tZXNzYWdlICgidGhyaWZ0X3NlcnZlcl9zZXJ2ZTogJXMiLAorCSAgICAgICAgICAgICAgIGVycm9yICE9IE5VTEwgPyBlcnJvci0+bWVzc2FnZSA6ICIobnVsbCkiKTsKKwkgICAgZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKyAgICAgIH0KKworICB9ZWxzZXsKKyAgICAgIHByb2Nlc3NvciA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfUFJPQ0VTU09SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGVyIiwgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQorICBzZXJ2ZXJfdHJhbnNwb3J0ICA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB0cmFuc3BvcnRfZmFjdG9yeSA9IGdfb2JqZWN0X25ldyAodHJhbnNwb3J0X2ZhY3RvcnlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGlmIChzdHJzdHIgKHByb3RvY29sX25hbWUsICJjb21wYWN0IikgIT0gTlVMTCkgeworICAgIHByb3RvY29sX2ZhY3RvcnkgID0gZ19vYmplY3RfbmV3IChwcm90b2NvbF9mYWN0b3J5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfbGltaXQiLCBzdHJpbmdfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWluZXJfbGltaXQiLCBjb250YWluZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB9IGVsc2UgeworICAgIHByb3RvY29sX2ZhY3RvcnkgID0gZ19vYmplY3RfbmV3IChwcm90b2NvbF9mYWN0b3J5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB9CisKKyAgc2VydmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzb3IiLCAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl90cmFuc3BvcnQiLCAgICAgICAgIHNlcnZlcl90cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCB0cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSIsICAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBJbnN0YWxsIG91ciBTSUdJTlQgaGFuZGxlciwgd2hpY2ggaGFuZGxlcyBDdHJsLUMgYmVpbmcgcHJlc3NlZCBieSBzdG9wcGluZworICAgICB0aGUgc2VydmVyIGdyYWNlZnVsbHkgKi8KKyAgbWVtc2V0ICgmc2lnaW50X2FjdGlvbiwgMCwgc2l6ZW9mIChzaWdpbnRfYWN0aW9uKSk7CisgIHNpZ2ludF9hY3Rpb24uc2FfaGFuZGxlciA9IHNpZ2ludF9oYW5kbGVyOworICBzaWdpbnRfYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOworICBzaWdhY3Rpb24gKFNJR0lOVCwgJnNpZ2ludF9hY3Rpb24sIE5VTEwpOworCisgIHByaW50ZiAoIlN0YXJ0aW5nIFwiJXNcIiBzZXJ2ZXIgKCVzLyVzKSBsaXN0ZW4gb246ICVkXG4iLAorICAgICAgICAgIHNlcnZlcl9uYW1lLAorICAgICAgICAgIHRyYW5zcG9ydF9uYW1lLAorICAgICAgICAgIHByb3RvY29sX25hbWUsCisgICAgICAgICAgcG9ydCk7CisgIGZmbHVzaCAoc3Rkb3V0KTsKKworICAvKiBTZXJ2ZSBjbGllbnRzIHVudGlsIFNJR0lOVCBpcyByZWNlaXZlZCAoQ3RybC1DIGlzIHByZXNzZWQpICovCisgIHRocmlmdF9zZXJ2ZXJfc2VydmUgKHNlcnZlciwgJmVycm9yKTsKKworICAvKiBJZiB0aGUgc2VydmVyIHN0b3BwZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBiZWluZyBpbnRlcnJ1cHRlZCBieSB0aGUKKyAgICAgdXNlciwgcmVwb3J0IHRoZSBlcnJvciAqLworICBpZiAoIXNpZ2ludF9yZWNlaXZlZCkgeworICAgIGdfbWVzc2FnZSAoInRocmlmdF9zZXJ2ZXJfc2VydmU6ICVzIiwKKyAgICAgICAgICAgICAgIGVycm9yICE9IE5VTEwgPyBlcnJvci0+bWVzc2FnZSA6ICIobnVsbCkiKTsKKyAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICB9CisKKyAgcHV0cyAoImRvbmUuIik7CisKKyAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcik7CisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbF9mYWN0b3J5KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydF9mYWN0b3J5KTsKKyAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOworICBnX29iamVjdF91bnJlZiAocHJvY2Vzc29yKTsKKyAgZ19vYmplY3RfdW5yZWYgKGhhbmRsZXIpOworICBpZihoYW5kbGVyX3NlY29uZF9zZXJ2aWNlKXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChoYW5kbGVyX3NlY29uZF9zZXJ2aWNlKTsKKyAgfQorICBpZihwcm9jZXNzb3JfdGVzdCl7CisgICAgICBnX29iamVjdF91bnJlZiAocHJvY2Vzc29yX3Rlc3QpOworICB9CisgIGlmKHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSl7CisgICAgICBnX29iamVjdF91bnJlZiAocHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlKTsKKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmMgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmFjN2JjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oIgorCisvKiBBIGhhbmRsZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBUVGVzdFNlY29uZFNlcnZpY2VJZiBpbnRlcmZhY2UgKi8KKworR19ERUZJTkVfVFlQRSAoU2Vjb25kU2VydmljZUhhbmRsZXIsCisgICAgICAgICAgICAgICBzZWNvbmRfc2VydmljZV9oYW5kbGVyLAorCSAgICAgICBUX1RFU1RfVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSKTsKKworCitnYm9vbGVhbgorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9zZWNvbmR0ZXN0X3N0cmluZyAoVFRlc3RTZWNvbmRTZXJ2aWNlSWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICAgICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICBnY2hhciBidWZmZXJbMjU2XTsKKworICBwcmludGYgKCJ0ZXN0U2Vjb25kU2VydmljZU11bHRpcGxleFNlY29uZFRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcpOworICBzbnByaW50ZihidWZmZXIsIDI1NSwgInRlc3RTdHJpbmcoXCIlc1wiKSIsIHRoaW5nKTsKKyAgKl9yZXR1cm4gPSBnX3N0cmR1cCAoYnVmZmVyKTsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3NlY29uZF9zZXJ2aWNlX2hhbmRsZXJfaW5pdCAoU2Vjb25kU2VydmljZUhhbmRsZXIgKnNlbGYpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK3NlY29uZF9zZXJ2aWNlX2hhbmRsZXJfY2xhc3NfaW5pdCAoU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcyAqa2xhc3MpCit7CisgIFRUZXN0U2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcyAqYmFzZV9jbGFzcyA9CisgICAgICBUX1RFU1RfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9DTEFTUyAoa2xhc3MpOworCisKKyAgYmFzZV9jbGFzcy0+c2Vjb25kdGVzdF9zdHJpbmcgPQorICAgICAgc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9zZWNvbmR0ZXN0X3N0cmluZzsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmggYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmUwNDhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0gKKyNkZWZpbmUgX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCIKKworR19CRUdJTl9ERUNMUworCisvKiBBIGhhbmRsZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBUVGVzdFNlY29uZFNlcnZpY2VJZiBpbnRlcmZhY2UgKi8KKworI2RlZmluZSBUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIgKHNlY29uZF9zZXJ2aWNlX2hhbmRsZXJfZ2V0X3R5cGUgKCkpCisKKyNkZWZpbmUgU0VDT05EX1NFUlZJQ0VfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlSGFuZGxlcikpCisjZGVmaW5lIElTX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIpKQorI2RlZmluZSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MpKQorI2RlZmluZSBJU19TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIpKQorI2RlZmluZSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSX0dFVF9DTEFTUyhvYmopICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlciBTZWNvbmRTZXJ2aWNlSGFuZGxlcjsKK3R5cGVkZWYgc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIFNlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3M7CisKK3N0cnVjdCBfU2Vjb25kU2VydmljZUhhbmRsZXIgeworICBUVGVzdFNlY29uZFNlcnZpY2VIYW5kbGVyIHBhcmVudDsKK307CisKK3N0cnVjdCBfU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcyB7CisgIFRUZXN0U2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcyBwYXJlbnQ7CisKK307CisKKy8qIFVzZWQgYnkgU0VDT05EX1NFUlZJQ0VfSEFORExFUl9HRVRfVFlQRSAqLworR1R5cGUgc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9nZXRfdHlwZSAodm9pZCk7CisKK2dib29sZWFuIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXJfYmxhaF9ibGFoIChUVGVzdFNlY29uZFNlcnZpY2VJZiAqaWZhY2UsIEdFcnJvciAqKmVycm9yKTsKK2dib29sZWFuIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXJfc2Vjb25kdGVzdF9zdHJpbmcgICAgICAgICAgKFRUZXN0U2Vjb25kU2VydmljZUlmICppZmFjZSwgZ2NoYXIgKiogX3JldHVybiwgY29uc3QgZ2NoYXIgKiB0aGluZywgR0Vycm9yICoqZXJyb3IpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfSCAqLwpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4YmNiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMKQEAgLTAsMCArMSw4MzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3Rlc3RfaGFuZGxlci5oIgorCisvKiBBIGhhbmRsZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBUVGVzdFRocmlmdFRlc3RJZiBpbnRlcmZhY2UgKi8KKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0VGVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICB0aHJpZnRfdGVzdF9oYW5kbGVyLAorICAgICAgICAgICAgICAgVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfSEFORExFUik7CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfdm9pZCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RWb2lkKClcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cmluZyAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICAgICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcpOworICAqX3JldHVybiA9IGdfc3RyZHVwICh0aGluZyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYm9vbCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbiAgICAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RCb29sKCVzKVxuIiwgdGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgKl9yZXR1cm4gPSB0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9ieXRlIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ4ICAgICAgICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdEJ5dGUoJWQpXG4iLCAoZ2ludCl0aGluZyk7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaTMyIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICAgICAgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdEkzMiglZClcbiIsIHRoaW5nKTsKKyAgKl9yZXR1cm4gPSB0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pNjQgKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQgICAgICAgICAgICAgKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50NjQgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0STY0KCUiIFBSSWQ2NCAiKVxuIiwgdGhpbmcpOworICAqX3JldHVybiA9IHRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2RvdWJsZSAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgICAgICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3REb3VibGUoJWYpXG4iLCB0aGluZyk7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuIAordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2JpbmFyeSAoVFRlc3RUaHJpZnRUZXN0SWYgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0J5dGVBcnJheSAqKiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0J5dGVBcnJheSAqIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdEJpbmFyeSgpXG4iKTsgIC8vIFRPRE86IGhleCBvdXRwdXQKKyAgZ19ieXRlX2FycmF5X3JlZigoR0J5dGVBcnJheSAqKXRoaW5nKTsKKyAgKl9yZXR1cm4gPSAoR0J5dGVBcnJheSAqKXRoaW5nOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cnVjdCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0WHRydWN0ICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBnY2hhciAqc3RyaW5nX3RoaW5nID0gTlVMTDsKKyAgZ2ludCAgIGJ5dGVfdGhpbmc7CisgIGdpbnQgICBpMzJfdGhpbmc7CisgIGdpbnQ2NCBpNjRfdGhpbmc7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX29iamVjdF9nZXQgKChUVGVzdFh0cnVjdCAqKXRoaW5nLAorICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmk2NF90aGluZywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBwcmludGYgKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9KVxuIiwKKyAgICAgICAgICBzdHJpbmdfdGhpbmcsCisgICAgICAgICAgKGdpbnQpYnl0ZV90aGluZywKKyAgICAgICAgICBpMzJfdGhpbmcsCisgICAgICAgICAgaTY0X3RoaW5nKTsKKworICBnX29iamVjdF9zZXQgKCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCBzdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIGJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIGkzMl90aGluZywKKyAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGlmIChzdHJpbmdfdGhpbmcgIT0gTlVMTCkKKyAgICBnX2ZyZWUgKHN0cmluZ190aGluZyk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbmVzdCAoVFRlc3RUaHJpZnRUZXN0SWYgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QyICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFh0cnVjdDIgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgZ2NoYXIgKmlubmVyX3N0cmluZ190aGluZyA9IE5VTEw7CisgIGdpbnQgICBieXRlX3RoaW5nLCBpbm5lcl9ieXRlX3RoaW5nOworICBnaW50ICAgaTMyX3RoaW5nLCBpbm5lcl9pMzJfdGhpbmc7CisgIGdpbnQ2NCBpbm5lcl9pNjRfdGhpbmc7CisgIFRUZXN0WHRydWN0ICpzdHJ1Y3RfdGhpbmc7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX29iamVjdF9nZXQgKChUVGVzdFh0cnVjdDIgKil0aGluZywKKyAgICAgICAgICAgICAgICAiYnl0ZV90aGluZyIsICAgJmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgInN0cnVjdF90aGluZyIsICZzdHJ1Y3RfdGhpbmcsCisgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgICZpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoc3RydWN0X3RoaW5nLAorICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmaW5uZXJfc3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmaW5uZXJfYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmlubmVyX2kzMl90aGluZywKKyAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmlubmVyX2k2NF90aGluZywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBwcmludGYgKCJ0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAlZH0pXG4iLAorICAgICAgICAgIGJ5dGVfdGhpbmcsCisgICAgICAgICAgaW5uZXJfc3RyaW5nX3RoaW5nLAorICAgICAgICAgIGlubmVyX2J5dGVfdGhpbmcsCisgICAgICAgICAgaW5uZXJfaTMyX3RoaW5nLAorICAgICAgICAgIGlubmVyX2k2NF90aGluZywKKyAgICAgICAgICBpMzJfdGhpbmcpOworCisgIGdfb2JqZWN0X3NldCAoKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIGJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgInN0cnVjdF90aGluZyIsIHN0cnVjdF90aGluZywKKyAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGlmIChpbm5lcl9zdHJpbmdfdGhpbmcgIT0gTlVMTCkKKyAgICBnX2ZyZWUgKGlubmVyX3N0cmluZ190aGluZyk7CisgIGdfb2JqZWN0X3VucmVmIChzdHJ1Y3RfdGhpbmcpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X21hcCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBHSGFzaFRhYmxlSXRlciBoYXNoX3RhYmxlX2l0ZXI7CisgIGdwb2ludGVyIGtleTsKKyAgZ3BvaW50ZXIgdmFsdWU7CisgIGdib29sZWFuIGZpcnN0ID0gVFJVRTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RNYXAoeyIpOworICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCAoR0hhc2hUYWJsZSAqKXRoaW5nKTsKKyAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgIGdpbnQzMiAqbmV3X2tleTsKKyAgICBnaW50MzIgKm5ld192YWx1ZTsKKworICAgIGlmIChmaXJzdCkKKyAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgIHByaW50ZiAoIiVkID0+ICVkIiwgKihnaW50MzIgKilrZXksICooZ2ludDMyICopdmFsdWUpOworCisgICAgbmV3X2tleSA9IGdfbWFsbG9jIChzaXplb2YgKm5ld19rZXkpOworICAgICpuZXdfa2V5ID0gKihnaW50MzIgKilrZXk7CisgICAgbmV3X3ZhbHVlID0gZ19tYWxsb2MgKHNpemVvZiAqbmV3X3ZhbHVlKTsKKyAgICAqbmV3X3ZhbHVlID0gKihnaW50MzIgKil2YWx1ZTsKKyAgICBnX2hhc2hfdGFibGVfaW5zZXJ0ICgqX3JldHVybiwgbmV3X2tleSwgbmV3X3ZhbHVlKTsKKyAgfQorICBwcmludGYgKCJ9KVxuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RyaW5nX21hcCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBHSGFzaFRhYmxlSXRlciBoYXNoX3RhYmxlX2l0ZXI7CisgIGdwb2ludGVyIGtleTsKKyAgZ3BvaW50ZXIgdmFsdWU7CisgIGdib29sZWFuIGZpcnN0ID0gVFJVRTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RTdHJpbmdNYXAoeyIpOworICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCAoR0hhc2hUYWJsZSAqKXRoaW5nKTsKKyAgd2hpbGUgKGdfaGFzaF90YWJsZV9pdGVyX25leHQgKCZoYXNoX3RhYmxlX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkgeworICAgIGdjaGFyICpuZXdfa2V5OworICAgIGdjaGFyICpuZXdfdmFsdWU7CisKKyAgICBpZiAoZmlyc3QpCisgICAgICBmaXJzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgIHByaW50ZiAoIiwgIik7CisKKyAgICBwcmludGYgKCIlcyA9PiAlcyIsIChnY2hhciAqKWtleSwgKGdjaGFyICopdmFsdWUpOworCisgICAgbmV3X2tleSA9IGdfc3RyZHVwICgoZ2NoYXIgKilrZXkpOworICAgIG5ld192YWx1ZSA9IGdfc3RyZHVwICgoZ2NoYXIgKil2YWx1ZSk7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoKl9yZXR1cm4sIG5ld19rZXksIG5ld192YWx1ZSk7CisgIH0KKyAgcHJpbnRmICgifSlcbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3NldCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBHSGFzaFRhYmxlSXRlciBoYXNoX3RhYmxlX2l0ZXI7CisgIGdwb2ludGVyIGtleTsKKyAgZ2Jvb2xlYW4gZmlyc3QgPSBUUlVFOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdFNldCh7Iik7CisgIGdfaGFzaF90YWJsZV9pdGVyX2luaXQgKCZoYXNoX3RhYmxlX2l0ZXIsIChHSGFzaFRhYmxlICopdGhpbmcpOworICB3aGlsZSAoZ19oYXNoX3RhYmxlX2l0ZXJfbmV4dCAoJmhhc2hfdGFibGVfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgeworICAgIGdpbnQzMiAqbmV3X2tleTsKKworICAgIGlmIChmaXJzdCkKKyAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgIHByaW50ZiAoIiVkIiwgKihnaW50MzIgKilrZXkpOworCisgICAgbmV3X2tleSA9IGdfbWFsbG9jIChzaXplb2YgKm5ld19rZXkpOworICAgICpuZXdfa2V5ID0gKihnaW50MzIgKilrZXk7CisgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoKl9yZXR1cm4sIG5ld19rZXksIE5VTEwpOworICB9CisgIHByaW50ZiAoIn0pXG4iKTsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9saXN0IChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBcnJheSAgICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQXJyYXkgICAgICAgKnRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIGd1aW50IGk7CisgIGdib29sZWFuIGZpcnN0ID0gVFJVRTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RMaXN0KHsiKTsKKyAgZm9yIChpID0gMDsgaSA8IHRoaW5nLT5sZW47IGkgKz0gMSkgeworICAgIGdpbnQzMiB2YWx1ZTsKKyAgICBnaW50MzIgKm5ld192YWx1ZTsKKworICAgIGlmIChmaXJzdCkKKyAgICAgIGZpcnN0ID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgcHJpbnRmICgiLCAiKTsKKworICAgIHZhbHVlID0gZ19hcnJheV9pbmRleCAodGhpbmcsIGdpbnQzMiwgaSk7CisgICAgcHJpbnRmICgiJWQiLCB2YWx1ZSk7CisKKyAgICBuZXdfdmFsdWUgPSBnX21hbGxvYyAoc2l6ZW9mICpuZXdfdmFsdWUpOworICAgICpuZXdfdmFsdWUgPSB2YWx1ZTsKKyAgICBnX2FycmF5X2FwcGVuZF92YWwgKCpfcmV0dXJuLCAqbmV3X3ZhbHVlKTsKKyAgfQorICBwcmludGYgKCJ9KVxuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZW51bSAoVFRlc3RUaHJpZnRUZXN0SWYgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3ROdW1iZXJ6ICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdE51bWJlcnogICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJ0ZXN0RW51bSglZClcbiIsIHRoaW5nKTsKKyAgKl9yZXR1cm4gPSB0aGluZzsKKworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF90eXBlZGVmIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0VXNlcklkICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFVzZXJJZCAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdFR5cGVkZWYoJSIgUFJJZDY0ICIpXG4iLCB0aGluZyk7CisgICpfcmV0dXJuID0gdGhpbmc7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbWFwX21hcCAoVFRlc3RUaHJpZnRUZXN0SWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICBoZWxsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBHSGFzaFRhYmxlICpwb3NpdGl2ZTsKKyAgR0hhc2hUYWJsZSAqbmVnYXRpdmU7CisgIGdpbnQzMiAqa2V5OworICBnaW50MzIgKnZhbHVlOworICBndWludCBpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdE1hcE1hcCglZClcbiIsIGhlbGxvKTsKKworICBwb3NpdGl2ZSA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfaW50X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlKTsKKyAgbmVnYXRpdmUgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZnJlZSk7CisKKyAgZm9yIChpID0gMTsgaSA8IDU7IGkgKz0gMSkgeworICAgIGtleSA9IGdfbWFsbG9jIChzaXplb2YgKmtleSk7CisgICAgdmFsdWUgPSBnX21hbGxvYyAoc2l6ZW9mICp2YWx1ZSk7CisgICAgKmtleSA9IGk7CisgICAgKnZhbHVlID0gaTsKKyAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChwb3NpdGl2ZSwga2V5LCB2YWx1ZSk7CisKKyAgICBrZXkgPSBnX21hbGxvYyAoc2l6ZW9mICprZXkpOworICAgIHZhbHVlID0gZ19tYWxsb2MgKHNpemVvZiAqdmFsdWUpOworICAgICprZXkgPSAtaTsKKyAgICAqdmFsdWUgPSAtaTsKKyAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChuZWdhdGl2ZSwga2V5LCB2YWx1ZSk7CisgIH0KKworICBrZXkgPSBnX21hbGxvYyAoc2l6ZW9mICprZXkpOworICAqa2V5ID0gNDsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoKl9yZXR1cm4sIGtleSwgcG9zaXRpdmUpOworCisgIGtleSA9IGdfbWFsbG9jIChzaXplb2YgKmtleSk7CisgICprZXkgPSAtNDsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoKl9yZXR1cm4sIGtleSwgbmVnYXRpdmUpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2luc2FuaXR5IChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdEluc2FuaXR5ICAqYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcikKK3sKKyAgVFRlc3RYdHJ1Y3QgKnh0cnVjdF9pbjsKKworICBnY2hhciAqc3RyaW5nX3RoaW5nID0gTlVMTDsKKyAgZ2ludCAgIGJ5dGVfdGhpbmc7CisgIGdpbnQgICBpMzJfdGhpbmc7CisgIGdpbnQ2NCBpNjRfdGhpbmc7CisKKyAgR1B0ckFycmF5ICp4dHJ1Y3RzOworCisgIFRUZXN0SW5zYW5pdHkgKmxvb25leTsKKworICBHSGFzaFRhYmxlICp1c2VyX21hcDsKKyAgR0hhc2hUYWJsZSAqZmlyc3RfbWFwOworICBHSGFzaFRhYmxlICpzZWNvbmRfbWFwOworCisgIEdIYXNoVGFibGVJdGVyIGhhc2hfdGFibGVfaXRlcjsKKyAgR0hhc2hUYWJsZUl0ZXIgaW5uZXJfaGFzaF90YWJsZV9pdGVyOworICBHSGFzaFRhYmxlSXRlciB1c2VyX21hcF9pdGVyOworCisgIGdwb2ludGVyIGtleTsKKyAgZ3BvaW50ZXIgdmFsdWU7CisKKyAgVFRlc3RVc2VySWQgKnVzZXJfaWQ7CisKKyAgZ3VpbnQgaTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHByaW50ZiAoInRlc3RJbnNhbml0eSgpXG4iKTsKKworICBmaXJzdF9tYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfZGlyZWN0X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19kaXJlY3RfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX29iamVjdF91bnJlZik7CisgIHNlY29uZF9tYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfZGlyZWN0X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfZGlyZWN0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX29iamVjdF91bnJlZik7CisKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoZmlyc3RfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX1RXTyksCisgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcilhcmd1bWVudCk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGZpcnN0X21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0lOVF9UT19QT0lOVEVSIChUX1RFU1RfTlVNQkVSWl9USFJFRSksCisgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcilhcmd1bWVudCk7CisKKyAgLyogSW5jcmVtZW50IGFyZ3VtZW50J3MgcmVmIGNvdW50IGJ5IHR3byBiZWNhdXNlIGZpcnN0X21hcCBub3cgaG9sZHMKKyAgICAgdHdvIHJlZmVyZW5jZXMgdG8gaXQgYW5kIHRoZSBjYWxsZXIgaXMgbm90IGF3YXJlIHdlIGhhdmUgbWFkZSBhbnkKKyAgICAgYWRkaXRpb25hbCByZWZlcmVuY2VzIHRvIGFyZ3VtZW50LiAgKFRoYXQgaXMsIGNhbGxlciBvd25zIGFyZ3VtZW50CisgICAgIGFuZCB3aWxsIHVucmVmIGl0IGV4cGxpY2l0bHkgaW4gYWRkaXRpb24gdG8gdW5yZWYtaW5nICpfcmV0dXJuLikKKworICAgICBXZSBkbyB0aGlzIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBjb3B5IG9mIGFyZ3VtZW50IGluIG9yZGVyIHRvIG1pbWljCisgICAgIHRoZSBDKysgaW1wbGVtZW50YXRpb24gKGFuZCBzaW5jZSwgZnJhbmtseSwgdGhlIHdvcmxkIG5lZWRzIGxlc3MKKyAgICAgYXJndW1lbnQsIG5vdCBtb3JlKS4gKi8KKyAgZ19vYmplY3RfcmVmICgoZ3BvaW50ZXIpYXJndW1lbnQpOworICBnX29iamVjdF9yZWYgKChncG9pbnRlcilhcmd1bWVudCk7CisKKyAgbG9vbmV5ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTlNBTklUWSwgTlVMTCk7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHNlY29uZF9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIEdJTlRfVE9fUE9JTlRFUiAoVF9URVNUX05VTUJFUlpfU0lYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbG9vbmV5KTsKKworICB1c2VyX2lkID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZCk7CisgICp1c2VyX2lkID0gMTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoKl9yZXR1cm4sIHVzZXJfaWQsIGZpcnN0X21hcCk7CisKKyAgdXNlcl9pZCA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWQpOworICAqdXNlcl9pZCA9IDI7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKCpfcmV0dXJuLCB1c2VyX2lkLCBzZWNvbmRfbWFwKTsKKworICBwcmludGYgKCJyZXR1cm4iKTsKKyAgcHJpbnRmICgiID0geyIpOworICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaGFzaF90YWJsZV9pdGVyLCAqX3JldHVybik7CisgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICBwcmludGYgKCIlIiBQUklkNjQgIiA9PiB7IiwgKihUVGVzdFVzZXJJZCAqKWtleSk7CisKKyAgICBnX2hhc2hfdGFibGVfaXRlcl9pbml0ICgmaW5uZXJfaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHSGFzaFRhYmxlICopdmFsdWUpOworICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmaW5uZXJfaGFzaF90YWJsZV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKSB7CisgICAgICBwcmludGYgKCIlZCA9PiB7IiwgKFRUZXN0TnVtYmVyeilrZXkpOworCisgICAgICBnX29iamVjdF9nZXQgKChUVGVzdEluc2FuaXR5ICopdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICJ1c2VyTWFwIiwgJnVzZXJfbWFwLAorICAgICAgICAgICAgICAgICAgICAieHRydWN0cyIsICZ4dHJ1Y3RzLAorICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgcHJpbnRmICgieyIpOworICAgICAgZ19oYXNoX3RhYmxlX2l0ZXJfaW5pdCAoJnVzZXJfbWFwX2l0ZXIsIHVzZXJfbWFwKTsKKyAgICAgIHdoaWxlIChnX2hhc2hfdGFibGVfaXRlcl9uZXh0ICgmdXNlcl9tYXBfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpIHsKKyAgICAgICAgcHJpbnRmICgiJWQgPT4gJSIgUFJJZDY0ICIsICIsCisgICAgICAgICAgICAgICAgKFRUZXN0TnVtYmVyeilrZXksCisgICAgICAgICAgICAgICAgKihUVGVzdFVzZXJJZCAqKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIn0sICIpOworICAgICAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisKKyAgICAgIHByaW50ZiAoInsiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB4dHJ1Y3RzLT5sZW47ICsraSkgeworICAgICAgICB4dHJ1Y3RfaW4gPSBnX3B0cl9hcnJheV9pbmRleCAoeHRydWN0cywgaSk7CisgICAgICAgIGdfb2JqZWN0X2dldCAoeHRydWN0X2luLAorICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciLCAmc3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAmYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgJmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgJmk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICBwcmludGYgKCJ7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgIiwKKyAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZiAoIn0iKTsKKyAgICAgIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKKworICAgICAgcHJpbnRmICgifSwgIik7CisgICAgfQorICAgIHByaW50ZiAoIn0sICIpOworICB9CisgIHByaW50ZiAoIn1cbiIpOworCisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X211bHRpIChUVGVzdFRocmlmdFRlc3RJZiAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggICAgICAgICAgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDY0ICAgICAgICAgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAqYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3ROdW1iZXJ6ICAgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RVc2VySWQgICAgYXJnNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIFRIUklGVF9VTlVTRURfVkFSIChhcmczKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGFyZzQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoYXJnNSk7CisKKyAgcHJpbnRmICgidGVzdE11bHRpKClcbiIpOworCisgIGdfb2JqZWN0X3NldCAoKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsIGdfc3RyZHVwICgiSGVsbG8yIiksCisgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIGFyZzAsCisgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIGFyZzEsCisgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIGFyZzIsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZXhjZXB0aW9uIChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uICAgICAqKmVycjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworCisgIFRUZXN0WHRydWN0ICp4dHJ1Y3Q7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBwcmludGYgKCJ0ZXN0RXhjZXB0aW9uKCVzKVxuIiwgYXJnKTsKKworICAvKiBVbmxpa2UgYXJndW1lbnQgb2JqZWN0cywgZXhjZXB0aW9uIG9iamVjdHMgYXJlIG5vdCBwcmUtY3JlYXRlZCAqLworICBnX2Fzc2VydCAoKmVycjEgPT0gTlVMTCk7CisKKyAgaWYgKHN0cm5jbXAgKGFyZywgIlhjZXB0aW9uIiwgOSkgPT0gMCkgeworICAgIC8qICJUaHJvdyIgYSBjdXN0b20gZXhjZXB0aW9uOiBTZXQgdGhlIGNvcnJlc3BvbmRpbmcgZXhjZXB0aW9uCisgICAgICAgYXJndW1lbnQsIHNldCAqZXJyb3IgdG8gTlVMTCBhbmQgcmV0dXJuIEZBTFNFICovCisgICAgKmVycjEgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hDRVBUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAgIGdfc3RyZHVwIChhcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAqZXJyb3IgPSBOVUxMOworICAgIHJlc3VsdCA9IEZBTFNFOworICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKGFyZywgIlRFeGNlcHRpb24iLCAxMSkgPT0gMCkgeworICAgIC8qICJUaHJvdyIgYSBnZW5lcmljIFRFeGNlcHRpb24gKFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uKTogU2V0CisgICAgICAgYWxsIGV4Y2VwdGlvbiBhcmd1bWVudHMgdG8gTlVMTCwgc2V0ICplcnJvciBhbmQgcmV0dXJuIEZBTFNFICovCisgICAgKmVycjEgPSBOVUxMOworICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9lcnJvcl9xdWFyayAoKSwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOLAorICAgICAgICAgICAgICAgICAiRGVmYXVsdCBURXhjZXB0aW9uLiIpOworICAgIHJlc3VsdCA9IEZBTFNFOworICB9CisgIGVsc2UgeworICAgICplcnIxID0gTlVMTDsKKyAgICAqZXJyb3IgPSBOVUxMOworCisgICAgLyogVGhpcyBjb2RlIGlzIGR1cGxpY2F0ZWQgZnJvbSB0aGUgQysrIHRlc3Qgc3VpdGUsIHRob3VnaCBpdAorICAgICAgIGFwcGVhcnMgdG8gc2VydmUgbm8gcHVycG9zZSAqLworICAgIHh0cnVjdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsIGdfc3RyZHVwIChhcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdCk7CisKKyAgICByZXN1bHQgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tdWx0aV9leGNlcHRpb24gKFRUZXN0VGhyaWZ0VGVzdElmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKmFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgKmFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uICAgICAqKmVycjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uMiAgICAqKmVycjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIFRUZXN0WHRydWN0ICpzdHJ1Y3RfdGhpbmc7CisgIGdib29sZWFuIHJlc3VsdDsKKworICBwcmludGYgKCJ0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKVxuIiwgYXJnMCwgYXJnMSk7CisKKyAgZ19hc3NlcnQgKCplcnIxID09IE5VTEwpOworICBnX2Fzc2VydCAoKmVycjIgPT0gTlVMTCk7CisKKyAgaWYgKHN0cm5jbXAgKGFyZzAsICJYY2VwdGlvbiIsIDgpID09IDAgJiYgc3RybGVuKGFyZzApID09IDgpIHsKKyAgICAqZXJyMSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsICAgZ19zdHJkdXAgKCJUaGlzIGlzIGFuIFhjZXB0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHJlc3VsdCA9IEZBTFNFOworICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKGFyZzAsICJYY2VwdGlvbjIiLCA5KSA9PSAwKSB7CisgICAgKmVycjIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hDRVBUSU9OMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yQ29kZSIsIDIwMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgZ19vYmplY3RfZ2V0ICgqZXJyMiwKKyAgICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCAmc3RydWN0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0IChzdHJ1Y3RfdGhpbmcsCisgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgZ19zdHJkdXAgKCJUaGlzIGlzIGFuIFhjZXB0aW9uMiIpLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgZ19vYmplY3Rfc2V0ICgqZXJyMiwKKyAgICAgICAgICAgICAgICAgICJzdHJ1Y3RfdGhpbmciLCBzdHJ1Y3RfdGhpbmcsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoc3RydWN0X3RoaW5nKTsKKworICAgIHJlc3VsdCA9IEZBTFNFOworICB9CisgIGVsc2UgeworICAgIGdfb2JqZWN0X3NldCAoKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgZ19zdHJkdXAgKGFyZzEpLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgcmVzdWx0ID0gVFJVRTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfb25ld2F5IChUVGVzdFRocmlmdFRlc3RJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICBzZWNvbmRzVG9TbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgcHJpbnRmICgidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzZWNvbmRzVG9TbGVlcCk7CisgIHNsZWVwIChzZWNvbmRzVG9TbGVlcCk7CisgIHByaW50ZiAoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2Vjb25kc1RvU2xlZXApOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Rlc3RfaGFuZGxlcl9pbml0IChUaHJpZnRUZXN0SGFuZGxlciAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Rlc3RfaGFuZGxlcl9jbGFzc19pbml0IChUaHJpZnRUZXN0SGFuZGxlckNsYXNzICprbGFzcykKK3sKKyAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlckNsYXNzICpiYXNlX2NsYXNzID0KKyAgICBUX1RFU1RfVEhSSUZUX1RFU1RfSEFORExFUl9DTEFTUyAoa2xhc3MpOworCisgIGJhc2VfY2xhc3MtPnRlc3Rfdm9pZCA9CisgICAga2xhc3MtPnRlc3Rfdm9pZCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3ZvaWQ7CisgIGJhc2VfY2xhc3MtPnRlc3Rfc3RyaW5nID0KKyAgICBrbGFzcy0+dGVzdF9zdHJpbmcgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJpbmc7CisgIGJhc2VfY2xhc3MtPnRlc3RfYm9vbCA9CisgICAga2xhc3MtPnRlc3RfYm9vbCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2Jvb2w7CisgIGJhc2VfY2xhc3MtPnRlc3RfYnl0ZSA9CisgICAga2xhc3MtPnRlc3RfYnl0ZSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2J5dGU7CisgIGJhc2VfY2xhc3MtPnRlc3RfaTMyID0KKyAgICBrbGFzcy0+dGVzdF9pMzIgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pMzI7CisgIGJhc2VfY2xhc3MtPnRlc3RfaTY0ID0KKyAgICBrbGFzcy0+dGVzdF9pNjQgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pNjQ7CisgIGJhc2VfY2xhc3MtPnRlc3RfZG91YmxlID0KKyAgICBrbGFzcy0+dGVzdF9kb3VibGUgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9kb3VibGU7CisgIGJhc2VfY2xhc3MtPnRlc3RfYmluYXJ5ID0KKyAgICBrbGFzcy0+dGVzdF9iaW5hcnkgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9iaW5hcnk7CisgIGJhc2VfY2xhc3MtPnRlc3Rfc3RydWN0ID0KKyAgICBrbGFzcy0+dGVzdF9zdHJ1Y3QgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zdHJ1Y3Q7CisgIGJhc2VfY2xhc3MtPnRlc3RfbmVzdCA9CisgICAga2xhc3MtPnRlc3RfbmVzdCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X25lc3Q7CisgIGJhc2VfY2xhc3MtPnRlc3RfbWFwID0KKyAgICBrbGFzcy0+dGVzdF9tYXAgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tYXA7CisgIGJhc2VfY2xhc3MtPnRlc3Rfc3RyaW5nX21hcCA9CisgICAga2xhc3MtPnRlc3Rfc3RyaW5nX21hcCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cmluZ19tYXA7CisgIGJhc2VfY2xhc3MtPnRlc3Rfc2V0ID0KKyAgICBrbGFzcy0+dGVzdF9zZXQgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9zZXQ7CisgIGJhc2VfY2xhc3MtPnRlc3RfbGlzdCA9CisgICAga2xhc3MtPnRlc3RfbGlzdCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2xpc3Q7CisgIGJhc2VfY2xhc3MtPnRlc3RfZW51bSA9CisgICAga2xhc3MtPnRlc3RfZW51bSA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2VudW07CisgIGJhc2VfY2xhc3MtPnRlc3RfdHlwZWRlZiA9CisgICAga2xhc3MtPnRlc3RfdHlwZWRlZiA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3R5cGVkZWY7CisgIGJhc2VfY2xhc3MtPnRlc3RfbWFwX21hcCA9CisgICAga2xhc3MtPnRlc3RfbWFwX21hcCA9CisgICAgdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X21hcF9tYXA7CisgIGJhc2VfY2xhc3MtPnRlc3RfaW5zYW5pdHkgPQorICAgIGtsYXNzLT50ZXN0X2luc2FuaXR5ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaW5zYW5pdHk7CisgIGJhc2VfY2xhc3MtPnRlc3RfbXVsdGkgPQorICAgIGtsYXNzLT50ZXN0X211bHRpID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbXVsdGk7CisgIGJhc2VfY2xhc3MtPnRlc3RfZXhjZXB0aW9uID0KKyAgICBrbGFzcy0+dGVzdF9leGNlcHRpb24gPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9leGNlcHRpb247CisgIGJhc2VfY2xhc3MtPnRlc3RfbXVsdGlfZXhjZXB0aW9uID0KKyAgICBrbGFzcy0+dGVzdF9tdWx0aV9leGNlcHRpb24gPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9tdWx0aV9leGNlcHRpb247CisgIGJhc2VfY2xhc3MtPnRlc3Rfb25ld2F5ID0KKyAgICBrbGFzcy0+dGVzdF9vbmV3YXkgPQorICAgIHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9vbmV3YXk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjRjYjE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaApAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEVTVF9IQU5ETEVSX0gKKyNkZWZpbmUgX1RIUklGVF9URVNUX0hBTkRMRVJfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCIKKworR19CRUdJTl9ERUNMUworCisvKiBBIGhhbmRsZXIgdGhhdCBpbXBsZW1lbnRzIHRoZSBUVGVzdFRocmlmdFRlc3RJZiBpbnRlcmZhY2UgKi8KKworI2RlZmluZSBUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIgKHRocmlmdF90ZXN0X2hhbmRsZXJfZ2V0X3R5cGUgKCkpCisKKyNkZWZpbmUgVEhSSUZUX1RFU1RfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0SGFuZGxlcikpCisjZGVmaW5lIElTX1RIUklGVF9URVNUX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIpKQorI2RlZmluZSBUSFJJRlRfVEVTVF9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3RIYW5kbGVyQ2xhc3MpKQorI2RlZmluZSBJU19USFJJRlRfVEVTVF9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RIUklGVF9URVNUX0hBTkRMRVIpKQorI2RlZmluZSBUSFJJRlRfVEVTVF9IQU5ETEVSX0dFVF9DTEFTUyhvYmopICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdEhhbmRsZXJDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUZXN0SGFuZGxlciBUaHJpZnRUZXN0SGFuZGxlcjsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUZXN0SGFuZGxlckNsYXNzIFRocmlmdFRlc3RIYW5kbGVyQ2xhc3M7CisKK3N0cnVjdCBfVGhyaWZ0VGVzdEhhbmRsZXIgeworICBUVGVzdFRocmlmdFRlc3RIYW5kbGVyIHBhcmVudDsKK307CisKK3N0cnVjdCBfVGhyaWZ0VGVzdEhhbmRsZXJDbGFzcyB7CisgIFRUZXN0VGhyaWZ0VGVzdEhhbmRsZXJDbGFzcyBwYXJlbnQ7CisKKyAgZ2Jvb2xlYW4gKCp0ZXN0X3ZvaWQpICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9zdHJpbmcpICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAgICAgICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9ib29sKSAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm9vbGVhbipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2J5dGUpICAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQ4Kl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCAgICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfaTMyKSAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfaTY0KSAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0Kl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50NjQgICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnRlc3RfZG91YmxlKSAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSAgICAgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2JpbmFyeSkgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCeXRlQXJyYXkgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdCeXRlQXJyYXkgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9zdHJ1Y3QpICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0WHRydWN0ICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9uZXN0KSAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdDIgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0WHRydWN0MiAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9tYXApICAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9zdHJpbmdfbWFwKSAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9zZXQpICAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9saXN0KSAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQXJyYXkgICAgICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdBcnJheSAgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9lbnVtKSAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdE51bWJlcnoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0TnVtYmVyeiAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF90eXBlZGVmKSAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFVzZXJJZCpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RVc2VySWQgICAgIHRoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X21hcF9tYXApICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIGhlbGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2luc2FuaXR5KSAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdIYXNoVGFibGUgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3RJbnNhbml0eSAgKmFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X211bHRpKSAgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WHRydWN0ICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggICAgICAgICAgIGFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ2NCAgICAgICAgICBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0hhc2hUYWJsZSAgICAgKmFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdE51bWJlcnogICAgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0VXNlcklkICAgICBhcmc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2V4Y2VwdGlvbikgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uICAgICAgICoqZXJyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CisgIGdib29sZWFuICgqdGVzdF9tdWx0aV9leGNlcHRpb24pIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICphcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICAgKmFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uICAgICAgICoqZXJyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUZXN0WGNlcHRpb24yICAgICAgKiplcnIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X29uZXdheSkgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICBzZWNvbmRzVG9TbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7Cit9OworCisvKiBVc2VkIGJ5IFRIUklGVF9URVNUX0hBTkRMRVJfR0VUX1RZUEUgKi8KK0dUeXBlIHRocmlmdF90ZXN0X2hhbmRsZXJfZ2V0X3R5cGUgKHZvaWQpOworCitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfdm9pZCAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cmluZyAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2J5dGUgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDgqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4ICAgICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9pMzIgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaTY0ICAgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50NjQqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ2NCAgICAgICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZG91YmxlICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlICAgICAgICAgdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cnVjdCAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFh0cnVjdCAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X25lc3QgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QyICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFh0cnVjdDIgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X21hcCAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3N0cmluZ19tYXAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3NldCAgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hhc2hUYWJsZSAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHSGFzaFRhYmxlICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2xpc3QgICAgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FycmF5ICAgICAgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHQXJyYXkgICAgICAgICAqdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X3R5cGVkZWYgICAgICAgICAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RVc2VySWQqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0VXNlcklkICAgICB0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbWFwX21hcCAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICAgICBoZWxsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaW5zYW5pdHkgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSGFzaFRhYmxlICAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0SW5zYW5pdHkgICphcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfbXVsdGkgICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQ4ICAgICAgICAgICBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAgICAgIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50NjQgICAgICAgICAgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdIYXNoVGFibGUgICAgICphcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFRlc3ROdW1iZXJ6ICAgIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdFVzZXJJZCAgICAgYXJnNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZXhjZXB0aW9uICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgICAqKmVycjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworZ2Jvb2xlYW4gdGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X211bHRpX2V4Y2VwdGlvbiAoVFRlc3RUaHJpZnRUZXN0SWYgICAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYdHJ1Y3QgICAgICAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAgICAgICAgICAqYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICAgICAgICAgICphcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RYY2VwdGlvbiAgICAgICAqKmVycjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFhjZXB0aW9uMiAgICAgICoqZXJyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CitnYm9vbGVhbiB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfb25ld2F5ICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgICAgICAgICAgc2Vjb25kc1RvU2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICAgICoqZXJyb3IpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9URVNUX0hBTkRMRVJfSCAqLwpkaWZmIC0tZ2l0IGEvdGVzdC9jbC9NYWtlZmlsZS5hbSBiL3Rlc3QvY2wvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVlNzJiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjbCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCitUZXN0U2VydmVyOiBtYWtlLXRlc3Qtc2VydmVyLmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdGVzdC1zZXJ2ZXIubGlzcAorCitUZXN0Q2xpZW50OiBtYWtlLXRlc3QtY2xpZW50Lmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdGVzdC1jbGllbnQubGlzcAorCitwcmVjcm9zczogc3R1YnMgVGVzdFNlcnZlciBUZXN0Q2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1jbAorCSQoUk0pIFRlc3RTZXJ2ZXIKKwkkKFJNKSBUZXN0Q2xpZW50CisKK0VYVFJBX0RJU1QgPSBcCisJaW1wbGVtZW50YXRpb24ubGlzcCBcCisJbWFrZS10ZXN0LWNsaWVudC5saXNwIFwKKwltYWtlLXRlc3Qtc2VydmVyLmxpc3AgXAorCXRlc3RzLmxpc3AKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvaW1wbGVtZW50YXRpb24ubGlzcCBiL3Rlc3QvY2wvaW1wbGVtZW50YXRpb24ubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2FmN2JlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9pbXBsZW1lbnRhdGlvbi5saXNwCkBAIC0wLDAgKzEsMTM2IEBACisoaW4tcGFja2FnZSAjOnRocmlmdC50ZXN0LWltcGxlbWVudGF0aW9uKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXZvaWQgKCkKKyAgKGZvcm1hdCB0ICJ0ZXN0Vm9pZCgpfiUiKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc3RyaW5nICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U3RyaW5nKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJvb2wgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RCb29sKH5hKX4lIiAoaWYgdGhpbmcgInRydWUiICJmYWxzZSIpKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtYnl0ZSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEJ5dGUofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtaTMyICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0STMyKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWk2NCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEk2NCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1kb3VibGUgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3REb3VibGUofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtYmluYXJ5ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0QmluYXJ5KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cnVjdCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFN0cnVjdCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1uZXN0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0TmVzdCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tYXAgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RNYXAofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc3RyaW5nLW1hcCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFN0cmluZ01hcCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zZXQgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTZXQofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbGlzdCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdExpc3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtZW51bSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEVudW0ofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtdHlwZWRlZiAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFR5cGVkZWYofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbWFwLW1hcCAoaGVsbG8pCisgIChmb3JtYXQgdCAidGVzdE1hcE1hcCh+YSl+JSIgaGVsbG8pCisgICcoKC00IC4gKCgtNCAuIC00KSAoLTMgLiAtMykgKC0yIC4gLTIpICgtMSAuIC0xKSkpICg0IC4gKCgxIC4gMSkgKDIgLiAyKSAoMyAuIDMpICg0IC4gNCkpKSkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWluc2FuaXR5IChhcmd1bWVudCkKKyAgKGxldCAoKHJlc3VsdCBgKCgxIC4gKCgyIC4gLGFyZ3VtZW50KSAoMyAuICxhcmd1bWVudCkpKQorICAgICAgICAgICAgICAgICAgKDIgLiAoKDYgLiAsKHRocmlmdC50ZXN0OjptYWtlLWluc2FuaXR5IDp1c2VyLW1hcCBuaWwgOnh0cnVjdHMgbmlsKSkpKSkpKQorICAgIChmb3JtYXQgdCAifmF+JSIgcmVzdWx0KQorICAgIHJlc3VsdCkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW11bHRpIChhcmcwIGFyZzEgYXJnMiBhcmczIGFyZzQgYXJnNSkKKyAgKGRlY2xhcmUgKGlnbm9yYWJsZSBhcmczIGFyZzQgYXJnNSkpCisgIChmb3JtYXQgdCAidGVzdE11bHRpKCl+JSIpCisgICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nICJIZWxsbzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyBhcmcwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIGFyZzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgYXJnMikpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWV4Y2VwdGlvbiAoYXJnKQorICAoZm9ybWF0IHQgInRlc3RFeGNlcHRpb24ofmEpfiUiIGFyZykKKyAgKGNvbmQKKyAgICAoKHN0cmluZz0gYXJnICJYY2VwdGlvbiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXJyb3ItY29kZSAxMDAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1lc3NhZ2UgYXJnKSkKKyAgICAoKHN0cmluZz0gYXJnICJURXhjZXB0aW9uIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1lc3NhZ2UgIlN0dWZmISIpKSkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW11bHRpLWV4Y2VwdGlvbiAoYXJnMCBhcmcxKQorICAoZm9ybWF0IHQgInRlc3RNdWx0aUV4Y2VwdGlvbih+YSwgfmEpfiUiIGFyZzAgYXJnMSkKKyAgKGNvbmQKKyAgICAoKHN0cmluZz0gYXJnMCAiWGNlcHRpb24iKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMTAwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlICJUaGlzIGlzIGFuIFhjZXB0aW9uIikpCisgICAgKChzdHJpbmc9IGFyZzAgIlhjZXB0aW9uMiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMjAwMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHJ1Y3QtdGhpbmcgKHRocmlmdC50ZXN0Om1ha2UteHRydWN0IDpzdHJpbmctdGhpbmcgIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIDApKSkpCisgICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nIGFyZzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyAwKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtb25ld2F5IChzZWNvbmRzKQorICAoZm9ybWF0IHQgInRlc3RPbmV3YXkofmEpOiBTbGVlcGluZy4uLn4lIiBzZWNvbmRzKQorICAoc2xlZXAgc2Vjb25kcykKKyAgKGZvcm1hdCB0ICJ0ZXN0T25ld2F5KH5hKTogZG9uZSBzbGVlcGluZyF+JSIgc2Vjb25kcykpCisKKzs7OyBSZW1vdmVkIGZyb20gdGhlIElETCBkZWZpbml0aW9uLgorIysob3IpCisoZGVmdW4gdGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2UtaW1wbGVtZW50YXRpb246YmxhaC1ibGFoICgpCisgIChmb3JtYXQgdCAiYmxhaEJsYWgoKX4lIikpCisKKyhkZWZ1biB0aHJpZnQudGVzdC5zZWNvbmQtc2VydmljZS1pbXBsZW1lbnRhdGlvbjpzZWNvbmR0ZXN0LXN0cmluZyAodGhpbmcpCisgIChmb3JtYXQgdCAic2Vjb25kdGVzdFN0cmluZyh+YSl+JSIgdGhpbmcpCisgIChjb25jYXRlbmF0ZSAnc3RyaW5nICJ0ZXN0U3RyaW5nKFwiIiB0aGluZyAiXCIpIikpCisKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvbWFrZS10ZXN0LWNsaWVudC5saXNwIGIvdGVzdC9jbC9tYWtlLXRlc3QtY2xpZW50Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5NjY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvbWFrZS10ZXN0LWNsaWVudC5saXNwCkBAIC0wLDAgKzEsOTMgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjKyhvcikgKHdoZW4gKG5vdCAoYm91bmRwICdzYi1pbXBsOjpkZWZhdWx0LWV4dGVybmFsLWZvcm1hdCkKKyAgICAgICAgICAgICAgICAgKHNldGYgc2ItaW1wbDo6ZGVmYXVsdC1leHRlcm5hbC1mb3JtYXQgOlVURi04KSkpCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgIi4uLy4uL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtc3lzdGVtIDpmaWFzY28pCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvVGhyaWZ0VGVzdC90aHJpZnQtZ2VuLVRocmlmdFRlc3QuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC1nZW4tdGhyaWZ0dGVzdCkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhkZWZwYWNrYWdlICM6dGhyaWZ0LWNyb3NzCisgICg6dXNlICM6Y29tbW9uLWxpc3AgIzpmaWFzY28pCisgICg6ZXhwb3J0ICM6Y3Jvc3MtdGVzdCkpCisKKyhpbi1wYWNrYWdlICM6dGhyaWZ0LWNyb3NzKQorCisoZGVmcGFyYW1ldGVyICpwcm90KiBuaWwpCisKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgInRlc3RzLmxpc3AiICpsb2FkLXRydWVuYW1lKikgOmV4dGVybmFsLWZvcm1hdCA6VVRGLTgpCisKKyhjbG9uOmRlZnN5bm9wc2lzICgpCisgICh0ZXh0IDpjb250ZW50cyAiVGhlIENvbW1vbiBMaXNwIGNsaWVudCBmb3IgVGhyaWZ0J3MgY3Jvc3MtbGFuZ3VhZ2UgdGVzdCBzdWl0ZS4iKQorICAoZ3JvdXAgKDpoZWFkZXIgIkFsbG93ZWQgb3B0aW9uczoiKQorICAgIChmbGFnIDpzaG9ydC1uYW1lICJoIiA6bG9uZy1uYW1lICJoZWxwIgorICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0LiIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJob3N0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJUaGUgaG9zdCB0byBjb25uZWN0IHRvLiIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJsb2NhbGhvc3QiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInBvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIk51bWJlciBvZiB0aGUgcG9ydCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIG9uLiIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICI5MDkwIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIKKyAgICAgICAgICAgIDphcmd1bWVudC10eXBlIDpvcHRpb25hbCkKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInRyYW5zcG9ydCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVHJhbnNwb3J0OiB0cmFuc3BvcnQgdG8gdXNlIChcImJ1ZmZlcmVkXCIsIFwiZnJhbWVkXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJ1ZmZlcmVkIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwcm90b2NvbCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJvdG9jb2w6IHByb3RvY29sIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJtdWx0aVwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJiaW5hcnkiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikpKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIG91ciBzdGFuZGFsb25lIGFwcGxpY2F0aW9uLiIKKyAgKGNsb246bWFrZS1jb250ZXh0KQorICAod2hlbiAoY2xvbjpnZXRvcHQgOnNob3J0LW5hbWUgImgiKQorICAgIChjbG9uOmhlbHApCisgICAgKGNsb246ZXhpdCkpCisgIChsZXQgKChwb3J0ICI5MDkwIikKKyAgICAgICAgKGhvc3QgImxvY2FsaG9zdCIpCisgICAgICAgIChmcmFtZWQgbmlsKQorICAgICAgICAobXVsdGlwbGV4ZWQgbmlsKSkKKyAgICAoY2xvbjpkby1jbWRsaW5lLW9wdGlvbnMgKG9wdGlvbiBuYW1lIHZhbHVlIHNvdXJjZSkKKyAgICAgIChwcmludCAobGlzdCBvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgImhvc3QiKQorICAgICAgICAgIChzZXRmIGhvc3QgdmFsdWUpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInBvcnQiKQorICAgICAgICAgIChzZXRmIHBvcnQgdmFsdWUpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInRyYW5zcG9ydCIpCisgICAgICAgICAgKGNvbmQgKChzdHJpbmc9IHZhbHVlICJidWZmZXJlZCIpIChzZXRmIGZyYW1lZCBuaWwpKQorICAgICAgICAgICAgICAgICgoc3RyaW5nPSB2YWx1ZSAiZnJhbWVkIikgKHNldGYgZnJhbWVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgdHJhbnNwb3J0LiIpKSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAicHJvdG9jb2wiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYmluYXJ5IikgKHNldGYgbXVsdGlwbGV4ZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgIm11bHRpIikgKHNldGYgbXVsdGlwbGV4ZWQgdCkpCisgICAgICAgICAgICAgICAgKHQgKGVycm9yICJVbnN1cHBvcnRlZCBwcm90b2NvbC4iKSkpKSkKKyAgICAodGVycHJpKQorICAgIChzZXRmICpwcm90KiAodGhyaWZ0LmltcGxlbWVudGF0aW9uOjpjbGllbnQgKHB1cmk6cGFyc2UtdXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdGVuYXRlICdzdHJpbmcgInRocmlmdDovLyIgaG9zdCAiOiIgcG9ydCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZnJhbWVkIGZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm11bHRpcGxleGVkIG11bHRpcGxleGVkKSkKKyAgICAobGV0ICgocmVzdWx0IChjcm9zcy10ZXN0IDptdWx0aXBsZXhlZCBtdWx0aXBsZXhlZCkpKQorICAgICAgKHRocmlmdC5pbXBsZW1lbnRhdGlvbjo6Y2xvc2UgKnByb3QqKQorICAgICAgKGNsb246ZXhpdCByZXN1bHQpKSkpCisKKyhjbG9uOmR1bXAgIlRlc3RDbGllbnQiIG1haW4pCmRpZmYgLS1naXQgYS90ZXN0L2NsL21ha2UtdGVzdC1zZXJ2ZXIubGlzcCBiL3Rlc3QvY2wvbWFrZS10ZXN0LXNlcnZlci5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2M4NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL21ha2UtdGVzdC1zZXJ2ZXIubGlzcApAQCAtMCwwICsxLDgwIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiLi4vLi4vbGliL2NsL2xvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL1RocmlmdFRlc3QvdGhyaWZ0LWdlbi1UaHJpZnRUZXN0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtZ2VuLXRocmlmdHRlc3QpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJpbXBsZW1lbnRhdGlvbi5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGNsb246ZGVmc3lub3BzaXMgKCkKKyAgKHRleHQgOmNvbnRlbnRzICJUaGUgQ29tbW9uIExpc3Agc2VydmVyIGZvciBUaHJpZnQncyBjcm9zcy1sYW5ndWFnZSB0ZXN0IHN1aXRlLiIpCisgIChncm91cCAoOmhlYWRlciAiQWxsb3dlZCBvcHRpb25zOiIpCisgICAgKGZsYWcgOnNob3J0LW5hbWUgImgiIDpsb25nLW5hbWUgImhlbHAiCisgICAgICAgICAgOmRlc2NyaXB0aW9uICJQcmludCB0aGlzIGhlbHAgYW5kIGV4aXQuIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInBvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIk51bWJlciBvZiB0aGUgcG9ydCB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIG9uLiIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICI5MDkwIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIKKyAgICAgICAgICAgIDphcmd1bWVudC10eXBlIDpvcHRpb25hbCkKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInNlcnZlci10eXBlIgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJUaGUgdHlwZSBvZiBzZXJ2ZXIsIGN1cnJlbnRseSBvbmx5IFwic2ltcGxlXCIgaXMgYXZhaWxhYmxlLiIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJzaW1wbGUiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInRyYW5zcG9ydCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVHJhbnNwb3J0OiB0cmFuc3BvcnQgdG8gdXNlIChcImJ1ZmZlcmVkXCIgb3IgXCJmcmFtZWRcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYnVmZmVyZWQiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInByb3RvY29sIgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJQcm90b2NvbDogcHJvdG9jb2wgdG8gdXNlIChcImJpbmFyeVwiIG9yIFwibXVsdGlcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYmluYXJ5IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpKSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciBvdXIgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbi4iCisgIChjbG9uOm1ha2UtY29udGV4dCkKKyAgKHdoZW4gKGNsb246Z2V0b3B0IDpzaG9ydC1uYW1lICJoIikKKyAgICAoY2xvbjpoZWxwKQorICAgIChjbG9uOmV4aXQpKQorICAobGV0ICgocG9ydCAiOTA5MCIpCisgICAgICAgIChmcmFtZWQgbmlsKQorICAgICAgICAobXVsdGlwbGV4ZWQgbmlsKSkKKyAgICAoY2xvbjpkby1jbWRsaW5lLW9wdGlvbnMgKG9wdGlvbiBuYW1lIHZhbHVlIHNvdXJjZSkKKyAgICAgIChwcmludCAobGlzdCBvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInBvcnQiKQorICAgICAgICAgIChzZXRmIHBvcnQgdmFsdWUpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInRyYW5zcG9ydCIpCisgICAgICAgICAgKGNvbmQgKChzdHJpbmc9IHZhbHVlICJidWZmZXJlZCIpIChzZXRmIGZyYW1lZCBuaWwpKQorICAgICAgICAgICAgICAgICgoc3RyaW5nPSB2YWx1ZSAiZnJhbWVkIikgKHNldGYgZnJhbWVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgdHJhbnNwb3J0LiIpKSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAicHJvdG9jb2wiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYmluYXJ5IikgKHNldGYgbXVsdGlwbGV4ZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgIm11bHRpIikgKHNldGYgbXVsdGlwbGV4ZWQgdCkpCisgICAgICAgICAgICAgICAgKHQgKGVycm9yICJVbnN1cHBvcnRlZCBwcm90b2NvbC4iKSkpKSkKKyAgICAodGVycHJpKQorICAgIChsZXQgKChzZXJ2aWNlcyAoaWYgbXVsdGlwbGV4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0IHRocmlmdC50ZXN0OnRocmlmdC10ZXN0IHRocmlmdC50ZXN0OnNlY29uZC1zZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LnRlc3Q6dGhyaWZ0LXRlc3QpKSkKKyAgICAgICh0aHJpZnQ6c2VydmUgKHB1cmk6cGFyc2UtdXJpIChjb25jYXRlbmF0ZSAnc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmlmdDovLzEyNy4wLjAuMToiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCkpCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzCisgICAgICAgICAgICAgICAgICAgIDpmcmFtZWQgZnJhbWVkCisgICAgICAgICAgICAgICAgICAgIDptdWx0aXBsZXhlZCBtdWx0aXBsZXhlZCkpKQorICAoY2xvbjpleGl0KSkKKworKGNsb246ZHVtcCAiVGVzdFNlcnZlciIgbWFpbikKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvdGVzdHMubGlzcCBiL3Rlc3QvY2wvdGVzdHMubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTAzNWZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC90ZXN0cy5saXNwCkBAIC0wLDAgKzEsMjQwIEBACisoaW4tcGFja2FnZSAjOnRocmlmdC1jcm9zcykKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Ozs7IFRoZSB0ZXN0cyBoZXJlIG9ubHkgbWFrZSBzZW5zZSBpbiB0aGUgY29udGV4dCBvZiBhIFRlc3RTZXJ2ZXIKKzs7OzsgcnVubmluZyBhbmQgdGhlIGR5bmFtaWMgdmFyaWFibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKzs7OzsgYmVpbmcgc2V0IHdpdGggYSBjbGllbnQgY29ubmVjdGlvbiB0byB0aGUgVGVzdFNlcnZlci4gTm9ybWFsbHksCis7Ozs7IHRoaXMgaXMgaGFuZGxlZCBpbiBtYWtlLXRlc3QtY2xpZW50Lmxpc3AuCisKKworOzs7IFN0YW5kYXJkIFRocmlmdCBjcm9zcy10ZXN0IGVycm9yIGNvZGVzCisoZGVmcGFyYW1ldGVyICp0ZXN0X2Jhc2V0eXBlcyogMSkKKyhkZWZwYXJhbWV0ZXIgKnRlc3Rfc3RydWN0cyogMikKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfY29udGFpbmVycyogNCkKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfZXhjZXB0aW9ucyogOCkKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfdW5rbm93biogNjQpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3RpbWVvdXQqIDEyOCkKKworKGRlZnVuIGNyb3NzLXRlc3QgKCZrZXkgKG11bHRpcGxleGVkIG5pbCkpCisgICJUaGUgbWFpbiBjcm9zcy10ZXN0IHJ1bm5lci4iCisgIChsZXQgKChyZXN1bHQgbmlsKSkKKyAgICAoaGFuZGxlci1jYXNlCisgICAgICAgIChwcm9nbgorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpiYXNlLXR5cGVzKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfYmFzZXR5cGVzKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpzdHJ1Y3RzKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3Rfc3RydWN0cyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6Y29udGFpbmVycykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X2NvbnRhaW5lcnMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOmV4Y2VwdGlvbnMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9leGNlcHRpb25zKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDptaXNjKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfdW5rbm93biogcmVzdWx0KSkKKworICAgICAgICAgIDs7IEl0IGRvZXNuJ3Qgc2VlbSBsaWtlIGFueW9uZSBhY3R1YWxseSB1c2VzCisgICAgICAgICAgOzsgdGhlIHNlY29uZCB0ZXN0IHNlcnZpY2Ugd2hlbiB0ZXN0aW5nIG11bHRpcGxleGluZywKKyAgICAgICAgICA7OyBzbyB0aGlzIHdvdWxkIGZhaWwgYWdhaW5zdCBzZXJ2ZXJzIGluIG90aGVyCisgICAgICAgICAgOzsgbGFuZ3VhZ2VzLiBGb3Igbm93LCBhbnl3YXkuCisgICAgICAgICAgIysob3IpCisgICAgICAgICAgKHdoZW4gbXVsdGlwbGV4ZWQKKyAgICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDptdWx0aXBsZXgpCisgICAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpKSkKKyAgICAgIChlcnJvciAoZSkgKHB1c2huZXcgKnRlc3RfdW5rbm93biogcmVzdWx0KSkpCisgICAgKGFwcGx5ICMnKyByZXN1bHQpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6YmFzZS10eXBlcykKKworKGluLXBhY2thZ2UgIzpiYXNlLXR5cGVzKQorCisoZGVmY29uc3RhbnQgKmxhbmctc3RyaW5nKiAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniIpCisKKyhkZWZwYXJhbWV0ZXIgKnRyaWNrLXN0cmluZyogKGZvcm1hdCBuaWwgInF1b3RlOiBcIiBiYWNrc2xhc2g6IFxcIG5ld2xpbmU6IH4lIGJhY2tzcGFjZTogfkMgfgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiOiB+VCBqdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IiAjXGJhY2tzcGFjZSkpCisKKyhkZWZjb25zdGFudCAqYmluYXJ5LXNlcXVlbmNlKiAjKDEyOCAxMjkgMTMwIDEzMSAxMzIgMTMzIDEzNCAxMzUgMTM2IDEzNyAxMzggMTM5IDE0MCAxNDEgMTQyIDE0MyAxNDQgMTQ1IDE0NiAxNDcgMTQ4IDE0OSAxNTAgMTUxIDE1MiAxNTMgMTU0IDE1NSAxNTYgMTU3IDE1OCAxNTkgMTYwIDE2MSAxNjIgMTYzIDE2NCAxNjUgMTY2IDE2NyAxNjggMTY5IDE3MCAxNzEgMTcyIDE3MyAxNzQgMTc1IDE3NiAxNzcgMTc4IDE3OSAxODAgMTgxIDE4MiAxODMgMTg0IDE4NSAxODYgMTg3IDE4OCAxODkgMTkwIDE5MSAxOTIgMTkzIDE5NCAxOTUgMTk2IDE5NyAxOTggMTk5IDIwMCAyMDEgMjAyIDIwMyAyMDQgMjA1IDIwNiAyMDcgMjA4IDIwOSAyMTAgMjExIDIxMiAyMTMgMjE0IDIxNSAyMTYgMjE3IDIxOCAyMTkgMjIwIDIyMSAyMjIgMjIzIDIyNCAyMjUgMjI2IDIyNyAyMjggMjI5IDIzMCAyMzEgMjMyIDIzMyAyMzQgMjM1IDIzNiAyMzcgMjM4IDIzOSAyNDAgMjQxIDI0MiAyNDMgMjQ0IDI0NSAyNDYgMjQ3IDI0OCAyNDkgMjUwIDI1MSAyNTIgMjUzIDI1NCAyNTUgMCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NyA0OCA0OSA1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NyA1OCA1OSA2MCA2MSA2MiA2MyA2NCA2NSA2NiA2NyA2OCA2OSA3MCA3MSA3MiA3MyA3NCA3NSA3NiA3NyA3OCA3OSA4MCA4MSA4MiA4MyA4NCA4NSA4NiA4NyA4OCA4OSA5MCA5MSA5MiA5MyA5NCA5NSA5NiA5NyA5OCA5OSAxMDAgMTAxIDEwMiAxMDMgMTA0IDEwNSAxMDYgMTA3IDEwOCAxMDkgMTEwIDExMSAxMTIgMTEzIDExNCAxMTUgMTE2IDExNyAxMTggMTE5IDEyMCAxMjEgMTIyIDEyMyAxMjQgMTI1IDEyNiAxMjcpKQorCisoZGVmdGVzdCB2b2lkLXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXZvaWQgdGhyaWZ0LWNyb3NzOjoqcHJvdCopKSkpCisKKyhkZWZ0ZXN0IGJvb2xlYW4tdGVzdCAoKQorICAoaXMgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYm9vbCB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0KSkKKyAgKGlzIChub3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYm9vbCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkpCisKKyhkZWZ0ZXN0IGludGVnZXItdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAxMjcpIDEyNykpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ieXRlIHRocmlmdC1jcm9zczo6KnByb3QqIC0xMjgpIC0xMjgpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiA0MikgNDIpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWkzMiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWkzMiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAyMTQ3NDgzNjQ3KSAyMTQ3NDgzNjQ3KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWkzMiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtMjE0NzQ4MzY0OCkgLTIxNDc0ODM2NDgpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTY0IHRocmlmdC1jcm9zczo6KnByb3QqIDApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTY0IHRocmlmdC1jcm9zczo6KnByb3QqIDkyMjMzNzIwMzY4NTQ3NzU4MDcpIDkyMjMzNzIwMzY4NTQ3NzU4MDcpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTY0IHRocmlmdC1jcm9zczo6KnByb3QqIC05MjIzMzcyMDM2ODU0Nzc1ODA4KSAtOTIyMzM3MjAzNjg1NDc3NTgwOCkpKQorCisoZGVmdGVzdCBkb3VibGUtdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIDAuMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIuMCkgNDIpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIC01NTUuMCkgLTU1NSkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTUyLjM2NzgpIC01Mi4zNjc4KSkpCisKKyhkZWZ0ZXN0IHN0cmluZy10ZXN0ICgpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIiIpICIiKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiKGRlZnVuIGJvdHNidWlsZGJvdHMgKCkgKGJvdHNidWlsc2JvdHMpKSIpCisgICAgICAgICAgICAgICAiKGRlZnVuIGJvdHNidWlsZGJvdHMgKCkgKGJvdHNidWlsc2JvdHMpKSIpKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICpsYW5nLXN0cmluZyopICpsYW5nLXN0cmluZyopKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICp0cmljay1zdHJpbmcqKSAqdHJpY2stc3RyaW5nKikpKQorCisoZGVmdGVzdCBiaW5hcnktdGVzdCAoKQorICAoaXMgKGVxdWFscCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1iaW5hcnkgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIygpKSAjKCkpKQorICAoaXMgKGVxdWFscCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1iaW5hcnkgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKmJpbmFyeS1zZXF1ZW5jZSopICpiaW5hcnktc2VxdWVuY2UqKSkpCisKKyhkZWZ0ZXN0IGVudW0tdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6LmZpdmUpIHRocmlmdC50ZXN0Om51bWJlcnouZml2ZSkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1lbnVtIHRocmlmdC1jcm9zczo6KnByb3QqIHRocmlmdC50ZXN0Om51bWJlcnouZWlnaHQpIHRocmlmdC50ZXN0Om51bWJlcnouZWlnaHQpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6Lm9uZSkgdGhyaWZ0LnRlc3Q6bnVtYmVyei5vbmUpKSkKKworKGRlZnRlc3QgdHlwZWRlZi10ZXN0ICgpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC10eXBlZGVmIHRocmlmdC1jcm9zczo6KnByb3QqIDMwOTg1ODIzNTA4MjUyMykgMzA5ODU4MjM1MDgyNTIzKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOnN0cnVjdHMpCisKKyhpbi1wYWNrYWdlICM6c3RydWN0cykKKworKGRlZnBhcmFtZXRlciAqdGVzdC1zdHJ1Y3QqICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nICJIZWxsIGlzIGVtcHR5LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgLTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyA0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIDQyNDI0MjQyKSkKKworKGRlZnBhcmFtZXRlciAqdGVzdC1uZXN0KiAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QyIDpieXRlLXRoaW5nIDQyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnN0cnVjdC10aGluZyAqdGVzdC1zdHJ1Y3QqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyAtNDIpKQorCisoZGVmdGVzdCBzdHJ1Y3QtdGVzdCAoKQorICAobGV0ICgocmVjLXN0cnVjdCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJ1Y3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKnRlc3Qtc3RydWN0KikpKQorICAgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nIHJlYy1zdHJ1Y3QpKSkpKQorCisoZGVmdGVzdCBuZXN0LXRlc3QgKCkKKyAgKGxldCogKChyZWMtbmVzdCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1uZXN0IHRocmlmdC1jcm9zczo6KnByb3QqICp0ZXN0LW5lc3QqKSkKKyAgICAgICAgIChyZWMtc3RydWN0ICh0aHJpZnQudGVzdDp4dHJ1Y3QyLXN0cnVjdC10aGluZyByZWMtbmVzdCkpKQorICAgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdDItYnl0ZS10aGluZyAqdGVzdC1uZXN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdDItYnl0ZS10aGluZyByZWMtbmVzdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1pMzItdGhpbmcgKnRlc3QtbmVzdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWkzMi10aGluZyByZWMtbmVzdCkpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOmNvbnRhaW5lcnMpCisKKyhpbi1wYWNrYWdlICM6Y29udGFpbmVycykKKworKGRlZnRlc3QgbGlzdC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1saXN0IHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKQorICAoaXMgKGVxdWFsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWxpc3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogJyg0MiAtNDIgMCA1KSkgJyg0MiAtNDIgMCA1KSkpKQorCisoZGVmdGVzdCBzZXQtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc2V0IHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKQorICAoaXMgKGVxdWFsIChzb3J0ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXNldCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAobGlzdCA0MiAtNDIgMCA1KSkgIyc8KQorICAgICAgICAgICAgICcoLTQyIDAgNSA0MikpKSkKKworKGRlZnVuIG1hcD0gKG1hcDEgbWFwMiAma2V5IChjYXItcHJlZGljYXRlICMnZXF1YWwpIChjZHItcHJlZGljYXRlICMnZXF1YWwpKQorICAiQ29tcGFyZSB0d28gYXNzb2MgbWFwcyBhY2NvcmRpbmcgdG8gdGhlIHByZWRpY2F0ZXMgZ2l2ZW4uIgorICAobm90IChzZXQtZXhjbHVzaXZlLW9yIG1hcDEgbWFwMiA6dGVzdCAobGFtYmRhIChlbDEgZWwyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKGZ1bmNhbGwgY2FyLXByZWRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBlbDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGVsMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY2FsbCBjZHItcHJlZGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIGVsMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZHIgZWwyKSkpKSkpKQorCisoZGVmdGVzdCBtYXAtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbWFwIHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKQorICAoaXMgKG1hcD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbWFwIHRocmlmdC1jcm9zczo6KnByb3QqICcoKDAgLiAxKSAoNDIgLiAtNDIpICg1IC4gNSkpKQorICAgICAgICAgICAgJygoMCAuIDEpICg0MiAuIC00MikgKDUgLiA1KSkpKQorICAoaXMgKG1hcD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbWFwLW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiA0MikKKyAgICAgICAgICAgICcoKC00IC4gKCgtNCAuIC00KSAoLTMgLiAtMykgKC0yIC4gLTIpICgtMSAuIC0xKSkpCisgICAgICAgICAgICAgICg0IC4gKCgxIC4gMSkgKDIgLiAyKSAoMyAuIDMpICg0IC4gNCkpKSkKKyAgICAgICAgICAgIDpjZHItcHJlZGljYXRlICMnbWFwPSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpleGNlcHRpb25zKQorCisoaW4tcGFja2FnZSAjOmV4Y2VwdGlvbnMpCisKKyhkZWZ1biB0ZXN0LXhjZXB0aW9uIChleHBlY3RlZC1jb2RlIGV4cGVjdGVkLW1lc3NhZ2UgZnVuY3Rpb24gJnJlc3QgYXJncykKKyAgIkEgaGVscGVyIGZ1bmN0aW9uIHRvIHRlc3Qgd2hldGhlciB4Y2VwdGlvbiBpcyBzaWduYWxsZWQsIGFuZCB3aGV0aGVyIGl0cyBmaWVsZHMgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFsdWVzLiIKKyAgKGhhbmRsZXItY2FzZSAocHJvZ24gKGFwcGx5IGZ1bmN0aW9uIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgIG5pbCkKKyAgICAodGhyaWZ0LnRlc3Q6eGNlcHRpb24gKGV4KSAoYW5kICg9ICh0aHJpZnQudGVzdDo6eGNlcHRpb24tZXJyb3ItY29kZSBleCkgZXhwZWN0ZWQtY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmc9ICh0aHJpZnQudGVzdDo6eGNlcHRpb24tbWVzc2FnZSBleCkgZXhwZWN0ZWQtbWVzc2FnZSkpKSkpCisKKyhkZWZ1biB0ZXN0LXhjZXB0aW9uMiAoZXhwZWN0ZWQtY29kZSBleHBlY3RlZC1tZXNzYWdlIGZ1bmN0aW9uICZyZXN0IGFyZ3MpCisgICJBIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgeGNlcHRpb24yIGlzIHNpZ25hbGxlZCwgYW5kIHdoZXRoZXIgaXRzIGZpZWxkcyBoYXZlIHRoZSBleHBlY3RlZCB2YWx1ZXMuIgorICAoaGFuZGxlci1jYXNlIChwcm9nbiAoYXBwbHkgZnVuY3Rpb24gYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgbmlsKQorICAgICh0aHJpZnQudGVzdDp4Y2VwdGlvbjIgKGV4KSAoYW5kICg9ICh0aHJpZnQudGVzdDo6eGNlcHRpb24yLWVycm9yLWNvZGUgZXgpIGV4cGVjdGVkLWNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZz0gKHRocmlmdC50ZXN0Ojp4dHJ1Y3Qtc3RyaW5nLXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdDo6eGNlcHRpb24yLXN0cnVjdC10aGluZyBleCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtbWVzc2FnZSkpKSkpCisKKyhkZWZ0ZXN0IGV4Y2VwdGlvbi10ZXN0ICgpCisgIChpcyAodGVzdC14Y2VwdGlvbiAxMDAxICJYY2VwdGlvbiIgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiWGNlcHRpb24iKSkKKyAgKHNpZ25hbHMgdGhyaWZ0OmFwcGxpY2F0aW9uLWVycm9yICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiVEV4Y2VwdGlvbiIpKQorICAoZmluaXNoZXMgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZXhjZXB0aW9uIHRocmlmdC1jcm9zczo6KnByb3QqICJzdWNjZXNzIikpKQorCisoZGVmdGVzdCBtdWx0aS1leGNlcHRpb24tdGVzdCAoKQorICAoaXMgKHRlc3QteGNlcHRpb24gMTAwMQorICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAjJ3RocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbXVsdGktZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICB0aHJpZnQtY3Jvc3M6Oipwcm90KgorICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgIm1lYW5pbmdsZXNzIikpCisgIChpcyAodGVzdC14Y2VwdGlvbjIgMjAwMgorICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAjJ3RocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbXVsdGktZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24yIgorICAgICAgICAgICAgICAgICAgICAgICJtZWFuaW5nbGVzcyB0b28hIikpCisgIChpcyAoc3RyaW5nPSAiZm9vYmFyIiAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb29iYXIiKSkpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6bWlzYykKKworKGluLXBhY2thZ2UgIzptaXNjKQorCisoZGVmdGVzdCBvbmV3YXktdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtb25ld2F5IHRocmlmdC1jcm9zczo6KnByb3QqIDEpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOm11bHRpcGxleCkKKworKGluLXBhY2thZ2UgIzptdWx0aXBsZXgpCisKKyhkZWZ0ZXN0IG11bHRpcGxleC10ZXN0ICgpCisgIDs7IFJlbW92ZWQgZnJvbSB0aGUgSURMIGRlZmluaXRpb24uCisgIDs7IChmaW5pc2hlcyAodGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2U6YmxhaC1ibGFoIHRocmlmdC1jcm9zczo6KnByb3QqKSkKKyAgKGlzIChzdHJpbmc9ICJhc2QiICh0aHJpZnQudGVzdC5zZWNvbmQtc2VydmljZTpzZWNvbmR0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiYXNkIikpKSkKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0IGIvdGVzdC9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTVkMjk5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIENvbnRhaW5zIHRoZSB0aHJpZnQgc3BlY2lmaWMgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZCitpbmNsdWRlKFRocmlmdE1hY3JvcykKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisKK2ZpbmRfcGFja2FnZShPcGVuU1NMIFJFUVVJUkVEKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7T1BFTlNTTF9JTkNMVURFX0RJUn0iKQorCitmaW5kX3BhY2thZ2UoTGliZXZlbnQgUkVRVUlSRUQpICAjIExpYmV2ZW50IGNvbWVzIHdpdGggQ01ha2Ugc3VwcG9ydCBmcm9tIHVwc3RyZWFtCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCisKK2ZpbmRfcGFja2FnZShaTElCIFJFUVVJUkVEKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtaTElCX0lOQ0xVREVfRElSU30pCisKKyNNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2NwcC9zcmMiKQorCitzZXQoY3Jvc3N0ZXN0Z2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgIHNyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKKykKK2FkZF9saWJyYXJ5KGNyb3NzdGVzdGdlbmNwcCBTVEFUSUMgJHtjcm9zc3Rlc3RnZW5jcHBfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoY3Jvc3N0ZXN0Z2VuY3BwIHRocmlmdCkKKworc2V0KGNyb3Nzc3RyZXNzZ2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL1NlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwCispCithZGRfbGlicmFyeShjcm9zc3N0cmVzc2dlbmNwcCBTVEFUSUMgJHtjcm9zc3N0cmVzc2dlbmNwcF9TT1VSQ0VTfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShjcm9zc3N0cmVzc2dlbmNwcCB0aHJpZnQpCisKK2FkZF9leGVjdXRhYmxlKFRlc3RTZXJ2ZXIgc3JjL1Rlc3RTZXJ2ZXIuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRlc3RTZXJ2ZXIgY3Jvc3N0ZXN0Z2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdFNlcnZlciB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdFNlcnZlciB0aHJpZnRuYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0U2VydmVyIHRocmlmdHopCisKK2FkZF9leGVjdXRhYmxlKFRlc3RDbGllbnQgc3JjL1Rlc3RDbGllbnQuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRlc3RDbGllbnQgY3Jvc3N0ZXN0Z2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdENsaWVudCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdENsaWVudCB0aHJpZnRuYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0Q2xpZW50IHRocmlmdHopCisKK2FkZF9leGVjdXRhYmxlKFN0cmVzc1Rlc3Qgc3JjL1N0cmVzc1Rlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFN0cmVzc1Rlc3QgY3Jvc3NzdHJlc3NnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0IHRocmlmdG5iKQorYWRkX3Rlc3QoTkFNRSBTdHJlc3NUZXN0IENPTU1BTkQgU3RyZXNzVGVzdCkKKworYWRkX2V4ZWN1dGFibGUoU3RyZXNzVGVzdE5vbkJsb2NraW5nIHNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFN0cmVzc1Rlc3ROb25CbG9ja2luZyBjcm9zc3N0cmVzc2dlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3ROb25CbG9ja2luZyB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdE5vbkJsb2NraW5nIHRocmlmdG5iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3ROb25CbG9ja2luZyB0aHJpZnR6KQorYWRkX3Rlc3QoTkFNRSBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgQ09NTUFORCBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcpCisKKyMKKyMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKKyMKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvU2Vjb25kU2VydmljZS5oIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0LmggZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1NlcnZpY2UuY3BwCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CispCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9NYWtlZmlsZS5hbSBiL3Rlc3QvY3BwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4YmU4MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NwcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvU2VydmljZS5jcHAKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidGVzdGdlbmNwcC5sYSBsaWJzdHJlc3N0ZXN0Z2VuY3BwLmxhCitub2Rpc3RfbGlidGVzdGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgXAorCWdlbi1jcHAvU2Vjb25kU2VydmljZS5oIFwKKwlnZW4tY3BwL1NlY29uZFNlcnZpY2UudGNjIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLnRjYyBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0LmggXAorCWdlbi1jcHAvVGhyaWZ0VGVzdC50Y2MgXAorCXNyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKKworbGlidGVzdGdlbmNwcF9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworbm9kaXN0X2xpYnN0cmVzc3Rlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9TZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9TZXJ2aWNlLmgKKworbGlic3RyZXNzdGVzdGdlbmNwcF9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworcHJlY3Jvc3M6IFRlc3RTZXJ2ZXIgVGVzdENsaWVudAorCitjaGVja19QUk9HUkFNUyA9IFwKKwlUZXN0U2VydmVyIFwKKwlUZXN0Q2xpZW50IFwKKwlTdHJlc3NUZXN0IFwKKwlTdHJlc3NUZXN0Tm9uQmxvY2tpbmcKKworIyB3ZSBjdXJyZW50bHkgZG8gbm90IHJ1biB0aGUgdGVzdHN1aXRlLCBzdG9wIGMrKyBzZXJ2ZXIgaXNzdWUKKyMgVEVTVFMgPSBcCisjCSQoY2hlY2tfUFJPR1JBTVMpCisKK1Rlc3RTZXJ2ZXJfU09VUkNFUyA9IFwKKwlzcmMvVGVzdFNlcnZlci5jcHAKKworVGVzdFNlcnZlcl9MREFERCA9IFwKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdHoubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKwktbGV2ZW50IC1sYm9vc3RfcHJvZ3JhbV9vcHRpb25zIC1sYm9vc3Rfc3lzdGVtIC1sYm9vc3RfZmlsZXN5c3RlbSAkKFpMSUJfTElCUykKKworVGVzdENsaWVudF9TT1VSQ0VTID0gXAorCXNyYy9UZXN0Q2xpZW50LmNwcAorCitUZXN0Q2xpZW50X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorCS1sZXZlbnQgLWxib29zdF9wcm9ncmFtX29wdGlvbnMgLWxib29zdF9zeXN0ZW0gLWxib29zdF9maWxlc3lzdGVtICQoWkxJQl9MSUJTKQorCitTdHJlc3NUZXN0X1NPVVJDRVMgPSBcCisJc3JjL1N0cmVzc1Rlc3QuY3BwCisKK1N0cmVzc1Rlc3RfTERBREQgPSBcCisJbGlic3RyZXNzdGVzdGdlbmNwcC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhCisKK1N0cmVzc1Rlc3ROb25CbG9ja2luZ19TT1VSQ0VTID0gXAorCXNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCisKK1N0cmVzc1Rlc3ROb25CbG9ja2luZ19MREFERCA9IFwKKwlsaWJzdHJlc3N0ZXN0Z2VuY3BwLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCisJLWxldmVudAorIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmggZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLnRjYzogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAtciAkPAorCitnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2VydmljZS5jcHA6ICQodG9wX3NyY2RpcikvdGVzdC9TdHJlc3NUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JZ2VuLWNwcAorQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUworQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykgJChMSUJFVkVOVF9MREZMQUdTKSAkKFpMSUJfTElCUykKKworY2xlYW4tbG9jYWw6CisJJChSTSkgZ2VuLWNwcC8qCisKK3N0eWxlLWxvY2FsOgorCSQoQ1BQU1RZTEVfQ01EKQorCitFWFRSQV9ESVNUID0gXAorCXNyYy9UZXN0Q2xpZW50LmNwcCBcCisJc3JjL1Rlc3RTZXJ2ZXIuY3BwIFwKKwlzcmMvU3RyZXNzVGVzdC5jcHAgXAorCXNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9TdHJlc3MtdGVzdC5tayBiL3Rlc3QvY3BwL1N0cmVzcy10ZXN0Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTc1M2IzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3BwL1N0cmVzcy10ZXN0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWlmbmRlZiB0aHJpZnRfaG9tZQotdGhyaWZ0X2hvbWU9Li4vLi4KLWVuZGlmICN0aHJpZnRfaG9tZQotCi10YXJnZXQ6IGFsbAotCi1pZm5kZWYgYm9vc3RfaG9tZQotI2Jvb3N0X2hvbWU9Li4vLi4vLi4vLi4vLi4vdGhpcmRwYXJ0eS9ib29zdF8xXzMzXzEKLWJvb3N0X2hvbWU9L3Vzci9sb2NhbC9pbmNsdWRlL2Jvb3N0LTFfMzNfMQotZW5kaWYgI2Jvb3N0X2hvbWUKLXRhcmdldDogYWxsCi0KLWluY2x1ZGVfcGF0aHMgPSAkKHRocmlmdF9ob21lKS9saWIvY3BwL3NyYyBcCi0gICAgICAgICAgICAgICAgJCh0aHJpZnRfaG9tZSkvbGliL2NwcCBcCi0gICAgICAgICAgICAgICAgJCh0aHJpZnRfaG9tZSkvIFwKLSAgICAgICAgICAgICAgICAkKGJvb3N0X2hvbWUpCi0KLWluY2x1ZGVfZmxhZ3MgPSAkKHBhdHN1YnN0ICUsLUklLCAkKGluY2x1ZGVfcGF0aHMpKQotCi0jIFRvb2xzCi1pZm5kZWYgVEhSSUZUCi1USFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0Ci1lbmRpZiAjIFRIUklGVAotCi1DQyAgICAgPSBnKysKLUxEICAgICA9IGcrKwotCi0jIENvbXBpbGVyIGZsYWdzCi1EQ0ZMICA9IC1XYWxsIC1PMyAtZyAtSS4vZ2VuLWNwcCAkKGluY2x1ZGVfZmxhZ3MpIC1MJCh0aHJpZnRfaG9tZSkvbGliL2NwcC8ubGlicyAtbHRocmlmdCAtbHRocmlmdG5iIC1sZXZlbnQKLUNGTCAgID0gLVdhbGwgLU8zIC1JLi9nZW4tY3BwICQoaW5jbHVkZV9mbGFncykgLUwkKHRocmlmdF9ob21lKS9saWIvY3BwLy5saWJzIC1sdGhyaWZ0IC1sdGhyaWZ0bmIgLWxldmVudAotCi1hbGw6IHN0cmVzcy10ZXN0IHN0cmVzcy10ZXN0LW5iCi0KLWRlYnVnOiBzdHJlc3MtdGVzdC1kZWJ1ZyBzdHJlc3MtdGVzdC1kZWJ1Zy1uYgotCi1zdHViczogLi4vU3RyZXNzVGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gY3BwIC0tZ2VuIHBocCAuLi9TdHJlc3NUZXN0LnRocmlmdAotCi1zdHJlc3MtdGVzdC1kZWJ1Zy1uYjogc3R1YnMKLQlnKysgLW8gc3RyZXNzLXRlc3QtbmIgJChEQ0ZMKSBzcmMvbmItbWFpbi5jcHAgLi9nZW4tY3BwL1NlcnZpY2UuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKLQotc3RyZXNzLXRlc3QtbmI6IHN0dWJzCi0JZysrIC1vIHN0cmVzcy10ZXN0LW5iICQoQ0ZMKSBzcmMvbmItbWFpbi5jcHAgLi9nZW4tY3BwL1NlcnZpY2UuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKLQotc3RyZXNzLXRlc3QtZGVidWc6IHN0dWJzCi0JZysrIC1vIHN0cmVzcy10ZXN0ICQoRENGTCkgc3JjL21haW4uY3BwIC4vZ2VuLWNwcC9TZXJ2aWNlLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwCi0KLXN0cmVzcy10ZXN0OiBzdHVicwotCWcrKyAtbyBzdHJlc3MtdGVzdCAkKENGTCkgc3JjL21haW4uY3BwIC4vZ2VuLWNwcC9TZXJ2aWNlLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwCi0KLWNsZWFuOgotCXJtIC1mciBzdHJlc3MtdGVzdCBzdHJlc3MtdGVzdC1uYiBnZW4tY3BwCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9UaHJpZnQtdGVzdC5tayBiL3Rlc3QvY3BwL1RocmlmdC10ZXN0Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjNlMzhiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3BwL1RocmlmdC10ZXN0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgTWFrZWZpbGUgZm9yIFRocmlmdCB0ZXN0IHByb2plY3QuCi0jIERlZmF1bHQgdGFyZ2V0IGlzIGV2ZXJ5dGhpbmcKLQotaWZuZGVmIHRocmlmdF9ob21lCi10aHJpZnRfaG9tZT0uLi8uLgotZW5kaWYgI3RocmlmdF9ob21lCi0KLXRhcmdldDogYWxsCi0KLWlmbmRlZiBib29zdF9ob21lCi0jYm9vc3RfaG9tZT0uLi8uLi8uLi8uLi8uLi90aGlyZHBhcnR5L2Jvb3N0XzFfMzNfMQotYm9vc3RfaG9tZT0vdXNyL2xvY2FsL2luY2x1ZGUvYm9vc3QtMV8zM18xCi1lbmRpZiAjYm9vc3RfaG9tZQotdGFyZ2V0OiBhbGwKLQotaW5jbHVkZV9wYXRocyA9ICQodGhyaWZ0X2hvbWUpL2xpYi9jcHAvc3JjIFwKLQkJJChib29zdF9ob21lKQotCi1pbmNsdWRlX2ZsYWdzID0gJChwYXRzdWJzdCAlLC1JJSwgJChpbmNsdWRlX3BhdGhzKSkKLQotIyBUb29scwotaWZuZGVmIFRIUklGVAotVEhSSUZUID0gLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdAotZW5kaWYgIyBUSFJJRlQKLQotQ0MgICAgID0gZysrCi1MRCAgICAgPSBnKysKLQotIyBDb21waWxlciBmbGFncwotRENGTCAgPSAtV2FsbCAtTzMgLWcgLUkuIC1JLi9nZW4tY3BwICQoaW5jbHVkZV9mbGFncykgLUwkKHRocmlmdF9ob21lKS9saWIvY3BwLy5saWJzIC1sdGhyaWZ0IC1sdGhyaWZ0bmIgLWxldmVudAotTEZMICAgPSAgLUwkKHRocmlmdF9ob21lKS9saWIvY3BwLy5saWJzIC1sdGhyaWZ0IC1sdGhyaWZ0bmIgLWxldmVudAotQ0NGTCAgPSAtV2FsbCAtTzMgLUkuIC1JLi9nZW4tY3BwICQoaW5jbHVkZV9mbGFncykKLUNGTCAgID0gJChDQ0ZMKSAkKExGTCkKLQotYWxsOiBzZXJ2ZXIgY2xpZW50Ci0KLWRlYnVnOiBzZXJ2ZXItZGVidWcgY2xpZW50LWRlYnVnCi0KLXN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBjcHAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQotc2VydmVyLWRlYnVnOiBzdHVicwotCWcrKyAtbyBUZXN0U2VydmVyICQoRENGTCkgc3JjL1Rlc3RTZXJ2ZXIuY3BwIC4vZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCAuL2dlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgLi4vVGhyaWZ0VGVzdF9leHRyYXMuY3BwCi0KLWNsaWVudC1kZWJ1Zzogc3R1YnMKLQlnKysgLW8gVGVzdENsaWVudCAkKERDRkwpIHNyYy9UZXN0Q2xpZW50LmNwcCAuL2dlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgLi9nZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIC4uL1RocmlmdFRlc3RfZXh0cmFzLmNwcAotCi1zZXJ2ZXI6IHN0dWJzCi0JZysrIC1vIFRlc3RTZXJ2ZXIgJChDRkwpIHNyYy9UZXN0U2VydmVyLmNwcCAuL2dlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgLi9nZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIC4uL1RocmlmdFRlc3RfZXh0cmFzLmNwcAotCi1jbGllbnQ6IHN0dWJzCi0JZysrIC1vIFRlc3RDbGllbnQgJChDRkwpIHNyYy9UZXN0Q2xpZW50LmNwcCAuL2dlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgLi9nZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIC4uL1RocmlmdFRlc3RfZXh0cmFzLmNwcAotCi1zbWFsbDoKLQkkKFRIUklGVCkgLS1nZW4gY3BwIC4uL1NtYWxsVGVzdC50aHJpZnQKLQlnKysgLWMgJChDQ0ZMKSAuL2dlbi1jcHAvU21hbGxTZXJ2aWNlLmNwcCAuL2dlbi1jcHAvU21hbGxUZXN0X3R5cGVzLmNwcAotCi1jbGVhbjoKLQlybSAtZnIgKi5vIFRlc3RTZXJ2ZXIgVGVzdENsaWVudCBnZW4tY3BwCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlIGIvdGVzdC9jcHAvcmVhbGxvYy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YmJiMy4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBwcm9iYWJseSBzaG91bGQgbm90IGdvIGludG8gIm1ha2UgY2hlY2siLCBiZWNhdXNlIGl0IGlzIGFuIGV4cGVyaW1lbnQsCi0jIG5vdCBhIHRlc3QuICBTcGVjaWZpY2FsbHksIGl0IGlzIG1lYW50IHRvIGRldGVybWluZSBob3cgbGlrZWx5IHJlYWxsb2MgaXMKLSMgdG8gYXZvaWQgYSBjb3B5LiAgVGhpcyBpcyBwb29ybHkgZG9jdW1lbnRlZC4KLQotcnVuOiByZWFsbG9jX3Rlc3QKLQlmb3IgaXQgaW4gMSA0IDY0IDsgZG8gXAotCQlmb3IgbmIgaW4gMSA4IDY0IDUxMiA7IGRvIFwKLQkJCWZvciBtaW5zIGluIDY0IDUxMiA7IGRvIFwKLQkJCQlmb3IgbWF4cyBpbiAyMDQ4IDI2MjE0NCA7IGRvIFwKLQkJCQkJZm9yIGRiIGluIDggNjQgOyBkbyBcCi0JCQkJCQkuL3JlYWxsb2NfdGVzdCAkJG5iICQkbWlucyAkJG1heHMgJCRkYiAkJGl0IFwKLQkJCQkJOyBkb25lIFwKLQkJCQk7IGRvbmUgXAotCQkJOyBkb25lIFwKLQkJOyBkb25lIFwKLQk7IGRvbmUgXAotCT4gcmF3X3N0YXRzCi0KLUNGTEFHUyA9IC1XYWxsIC1nIC1zdGQ9Yzk5Ci1MRExJQlMgPSAtbGRsCi1yZWFsbG9jX3Rlc3Q6IHJlYWxsb2NfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jIGIvdGVzdC9jcHAvcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3NjNhZC4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBfR05VX1NPVVJDRQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLWludCBjb3BpZXM7Ci1pbnQgbm9uX2NvcGllczsKLQotdm9pZCAqcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gIHN0YXRpYyB2b2lkICooKnJlYWxfcmVhbGxvYykodm9pZCosIHNpemVfdCkgPSBOVUxMOwotICBpZiAocmVhbF9yZWFsbG9jID09IE5VTEwpIHsKLSAgICByZWFsX3JlYWxsb2MgPSAodm9pZCogKCopICh2b2lkKiwgc2l6ZV90KSkgZGxzeW0oUlRMRF9ORVhULCAicmVhbGxvYyIpOwotICB9Ci0KLSAgdm9pZCAqcmV0X3B0ciA9ICgqcmVhbF9yZWFsbG9jKShwdHIsIHNpemUpOwotCi0gIGlmIChyZXRfcHRyID09IHB0cikgewotICAgIG5vbl9jb3BpZXMrKzsKLSAgfSBlbHNlIHsKLSAgICBjb3BpZXMrKzsKLSAgfQotCi0gIHJldHVybiByZXRfcHRyOwotfQotCi0KLXN0cnVjdCBUTWVtb3J5QnVmZmVyIHsKLSAgdm9pZCogcHRyOwotICBpbnQgc2l6ZTsKLX07Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgaW50IG51bV9idWZmZXJzOwotICBpbnQgaW5pdF9zaXplOwotICBpbnQgbWF4X3NpemU7Ci0gIGludCBkb3VibGluZ3M7Ci0gIGludCBpdGVyYXRpb25zOwotCi0gIGlmIChhcmdjIDwgNiB8fAotICAgICAgYXJnYyA+IDcgfHwKLSAgICAgIChudW1fYnVmZmVycyA9IGF0b2koYXJndlsxXSkpID09IDAgfHwKLSAgICAgIChpbml0X3NpemUgPSBhdG9pKGFyZ3ZbMl0pKSA9PSAwIHx8Ci0gICAgICAobWF4X3NpemUgPSBhdG9pKGFyZ3ZbM10pKSA9PSAwIHx8Ci0gICAgICBpbml0X3NpemUgPiBtYXhfc2l6ZSB8fAotICAgICAgKGl0ZXJhdGlvbnMgPSBhdG9pKGFyZ3ZbNF0pKSA9PSAwIHx8Ci0gICAgICAoZG91YmxpbmdzID0gYXRvaShhcmd2WzVdKSkgPT0gMCB8fAotICAgICAgKGFyZ2MgPT0gNyAmJiBhdG9pKGFyZ3ZbNl0pID09IDApKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogcmVhbGxvY190ZXN0IDxudW1fYnVmZmVycz4gPGluaXRfc2l6ZT4gPG1heF9zaXplPiA8ZG91YmxpbmdzPiA8aXRlcmF0aW9ucz4gW3NlZWRdXG4iKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLQotICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgYXJnYyA7IGkrKyApIHsKLSAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOwotICB9Ci0gIHByaW50ZigiXG4iKTsKLQotICBpZiAoYXJnYyA9PSA3KSB7Ci0gICAgc3JhbmQoYXRvaShhcmd2WzZdKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gIH0KLQotICBzdHJ1Y3QgVE1lbW9yeUJ1ZmZlciogYnVmZmVycyA9IGNhbGxvYyhudW1fYnVmZmVycywgc2l6ZW9mKCpidWZmZXJzKSk7Ci0gIGlmIChidWZmZXJzID09IE5VTEwpIGFib3J0KCk7Ci0KLSAgZm9yICggaW50IGkgPSAwIDsgaSA8IG51bV9idWZmZXJzIDsgaSsrICkgewotICAgIGJ1ZmZlcnNbaV0uc2l6ZSA9IG1heF9zaXplOwotICB9Ci0KLSAgd2hpbGUgKGl0ZXJhdGlvbnMgLS0+IDApIHsKLSAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZG91YmxpbmdzICogbnVtX2J1ZmZlcnMgOyBpKysgKSB7Ci0gICAgICBzdHJ1Y3QgVE1lbW9yeUJ1ZmZlciogYnVmID0gJmJ1ZmZlcnNbcmFuZCgpICUgbnVtX2J1ZmZlcnNdOwotICAgICAgYnVmLT5zaXplICo9IDI7Ci0gICAgICBpZiAoYnVmLT5zaXplIDw9IG1heF9zaXplKSB7Ci0gICAgICAgIGJ1Zi0+cHRyID0gcmVhbGxvYyhidWYtPnB0ciwgYnVmLT5zaXplKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyZWUoYnVmLT5wdHIpOwotICAgICAgICBidWYtPnNpemUgPSBpbml0X3NpemU7Ci0gICAgICAgIGJ1Zi0+cHRyID0gbWFsbG9jKGJ1Zi0+c2l6ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoYnVmLT5wdHIgPT0gTlVMTCkgYWJvcnQoKTsKLSAgICB9Ci0gIH0KLQotICBwcmludGYoIk5vbi1jb3BpZWQgJWQvJWQgKCUuMmYlJSlcbiIsIG5vbl9jb3BpZXMsIGNvcGllcyArIG5vbl9jb3BpZXMsIDEwMC4wICogbm9uX2NvcGllcyAvIChjb3BpZXMgKyBub25fY29waWVzKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NWY4OWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAKQEAgLTAsMCArMSw2MDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RMb2dnaW5nLmg+CisKKyNpbmNsdWRlICJTZXJ2aWNlLmgiCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPG1hcD4KKyNpZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKwordXNpbmcgbmFtZXNwYWNlIHRlc3Q6OnN0cmVzczsKKworc3RydWN0IGVxc3RyIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgeyByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsgfQorfTsKKworc3RydWN0IGx0c3RyIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgeyByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOyB9Cit9OworCisvLyB0eXBlZGVmIGhhc2hfbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGhhc2g8Y29uc3QgY2hhcio+LCBlcXN0cj4gY291bnRfbWFwOwordHlwZWRlZiBtYXA8Y29uc3QgY2hhciosIGludCwgbHRzdHI+IGNvdW50X21hcDsKKworY2xhc3MgU2VydmVyIDogcHVibGljIFNlcnZpY2VJZiB7CitwdWJsaWM6CisgIFNlcnZlcigpIHt9CisKKyAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKKyAgICBHdWFyZCBtKGxvY2tfKTsKKyAgICBpbnQgY3QgPSBjb3VudHNfW21ldGhvZF07CisgICAgY291bnRzX1ttZXRob2RdID0gKytjdDsKKyAgfQorCisgIHZvaWQgZWNob1ZvaWQoKSB7CisgICAgY291bnQoImVjaG9Wb2lkIik7CisgICAgcmV0dXJuOworICB9CisKKyAgY291bnRfbWFwIGdldENvdW50KCkgeworICAgIEd1YXJkIG0obG9ja18pOworICAgIHJldHVybiBjb3VudHNfOworICB9CisKKyAgaW50OF90IGVjaG9CeXRlKGNvbnN0IGludDhfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBpbnQzMl90IGVjaG9JMzIoY29uc3QgaW50MzJfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBpbnQ2NF90IGVjaG9JNjQoY29uc3QgaW50NjRfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICB2b2lkIGVjaG9TdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgYXJnKSB7CisgICAgaWYgKGFyZyAhPSAiaGVsbG8iKSB7CisgICAgICBUX0VSUk9SX0FCT1JUKCJXUk9ORyBTVFJJTkcgKCVzKSEhISEiLCBhcmcuY19zdHIoKSk7CisgICAgfQorICAgIG91dCA9IGFyZzsKKyAgfQorICB2b2lkIGVjaG9MaXN0KHZlY3RvcjxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHZlY3RvcjxpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob1NldChzZXQ8aW50OF90PiYgb3V0LCBjb25zdCBzZXQ8aW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9NYXAobWFwPGludDhfdCwgaW50OF90PiYgb3V0LCBjb25zdCBtYXA8aW50OF90LCBpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisKK3ByaXZhdGU6CisgIGNvdW50X21hcCBjb3VudHNfOworICBNdXRleCBsb2NrXzsKK307CisKK2VudW0gVHJhbnNwb3J0T3BlbkNsb3NlQmVoYXZpb3IgeworICBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCwKKyAgRG9udE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkCit9OworY2xhc3MgQ2xpZW50VGhyZWFkIDogcHVibGljIFJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgQ2xpZW50VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUlmPiBjbGllbnQsCisgICAgICAgICAgICAgICBNb25pdG9yJiBtb25pdG9yLAorICAgICAgICAgICAgICAgc2l6ZV90JiB3b3JrZXJDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVfdCBsb29wQ291bnQsCisgICAgICAgICAgICAgICBUVHlwZSBsb29wVHlwZSwKKyAgICAgICAgICAgICAgIFRyYW5zcG9ydE9wZW5DbG9zZUJlaGF2aW9yIGJlaGF2aW9yKQorICAgIDogX3RyYW5zcG9ydCh0cmFuc3BvcnQpLAorICAgICAgX2NsaWVudChjbGllbnQpLAorICAgICAgX21vbml0b3IobW9uaXRvciksCisgICAgICBfd29ya2VyQ291bnQod29ya2VyQ291bnQpLAorICAgICAgX2xvb3BDb3VudChsb29wQ291bnQpLAorICAgICAgX2xvb3BUeXBlKGxvb3BUeXBlKSwKKyAgICAgIF9iZWhhdmlvcihiZWhhdmlvcikge30KKworICB2b2lkIHJ1bigpIHsKKworICAgIC8vIFdhaXQgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBzdGFydAorCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworICAgICAgd2hpbGUgKF93b3JrZXJDb3VudCA9PSAwKSB7CisgICAgICAgIF9tb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBfc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBpZihfYmVoYXZpb3IgPT0gT3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpIHsKKyAgICAgIF90cmFuc3BvcnQtPm9wZW4oKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKF9sb29wVHlwZSkgeworICAgIGNhc2UgVF9WT0lEOgorICAgICAgbG9vcEVjaG9Wb2lkKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfQllURToKKyAgICAgIGxvb3BFY2hvQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIGxvb3BFY2hvSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfSTY0OgorICAgICAgbG9vcEVjaG9JNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9TVFJJTkc6CisgICAgICBsb29wRWNob1N0cmluZygpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGNlcnIgPDwgIlVuZXhwZWN0ZWQgbG9vcCB0eXBlIiA8PCBfbG9vcFR5cGUgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgIGlmKF9iZWhhdmlvciA9PSBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkgeworICAgICAgX3RyYW5zcG9ydC0+Y2xvc2UoKTsKKyAgICB9CisKKyAgICBfZG9uZSA9IHRydWU7CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAgIF93b3JrZXJDb3VudC0tOworCisgICAgICBpZiAoX3dvcmtlckNvdW50ID09IDApIHsKKworICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvVm9pZCgpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgX2NsaWVudC0+ZWNob1ZvaWQoKTsKKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvQnl0ZSgpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgaW50OF90IGFyZyA9IDE7CisgICAgICBpbnQ4X3QgcmVzdWx0OworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0J5dGUoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKKyAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvSTMyKCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBpbnQzMl90IGFyZyA9IDE7CisgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKKyAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvSTY0KCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBpbnQ2NF90IGFyZyA9IDE7CisgICAgICBpbnQ2NF90IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9JNjQoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKKyAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKKyAgICB9CisgIH0KKworICB2b2lkIGxvb3BFY2hvU3RyaW5nKCkgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CisgICAgICBzdHJpbmcgYXJnID0gImhlbGxvIjsKKyAgICAgIHN0cmluZyByZXN1bHQ7CisgICAgICBfY2xpZW50LT5lY2hvU3RyaW5nKHJlc3VsdCwgYXJnKTsKKyAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gX3RyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VJZj4gX2NsaWVudDsKKyAgTW9uaXRvciYgX21vbml0b3I7CisgIHNpemVfdCYgX3dvcmtlckNvdW50OworICBzaXplX3QgX2xvb3BDb3VudDsKKyAgVFR5cGUgX2xvb3BUeXBlOworICBpbnQ2NF90IF9zdGFydFRpbWU7CisgIGludDY0X3QgX2VuZFRpbWU7CisgIGJvb2wgX2RvbmU7CisgIE1vbml0b3IgX3NsZWVwOworICBUcmFuc3BvcnRPcGVuQ2xvc2VCZWhhdmlvciBfYmVoYXZpb3I7Cit9OworCitjbGFzcyBUU3RhcnRPYnNlcnZlciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgVFN0YXJ0T2JzZXJ2ZXIoKSA6IGF3YWtlXyhmYWxzZSkge30KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMobV8pOworICAgIGF3YWtlXyA9IHRydWU7CisgICAgbV8ubm90aWZ5QWxsKCk7CisgIH0KKyAgdm9pZCB3YWl0Rm9yU2VydmljZSgpIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKG1fKTsKKyAgICB3aGlsZSAoIWF3YWtlXykKKyAgICAgIG1fLndhaXRGb3JldmVyKCk7CisgIH0KKworcHJpdmF0ZToKKyAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIG1fOworICBib29sIGF3YWtlXzsKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgorCisgIGludCBwb3J0ID0gOTA5MTsKKyAgc3RyaW5nIGNsaWVudFR5cGUgPSAicmVndWxhciI7CisgIHN0cmluZyBzZXJ2ZXJUeXBlID0gInRocmVhZC1wb29sIjsKKyAgc3RyaW5nIHByb3RvY29sVHlwZSA9ICJiaW5hcnkiOworICBzaXplX3Qgd29ya2VyQ291bnQgPSA0OworICBzaXplX3QgY2xpZW50Q291bnQgPSAyMDsKKyAgc2l6ZV90IGxvb3BDb3VudCA9IDUwMDAwOworICBUVHlwZSBsb29wVHlwZSA9IFRfVk9JRDsKKyAgc3RyaW5nIGNhbGxOYW1lID0gImVjaG9Wb2lkIjsKKyAgYm9vbCBydW5TZXJ2ZXIgPSB0cnVlOworICBib29sIGxvZ1JlcXVlc3RzID0gZmFsc2U7CisgIHN0cmluZyByZXF1ZXN0TG9nUGF0aCA9ICIuL3JlcXVlc3Rsb2cudGxvZyI7CisgIGJvb2wgcmVwbGF5UmVxdWVzdHMgPSBmYWxzZTsKKworICBvc3RyaW5nc3RyZWFtIHVzYWdlOworCisgIHVzYWdlIDw8IGFyZ3ZbMF0gPDwgIiBbLS1wb3J0PTxwb3J0IG51bWJlcj5dIFstLXNlcnZlcl0gWy0tc2VydmVyLXR5cGU9PHNlcnZlci10eXBlPl0gIgorICAgICAgICAgICAgICAgICAgICAgICJbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gIgorICAgICAgICAgICAgICAgICAgICAgICJbLS1jbGllbnRzPTxjbGllbnQtY291bnQ+XSBbLS1sb29wPTxsb29wLWNvdW50Pl0gIgorICAgICAgICAgICAgICAgICAgICAgICJbLS1jbGllbnQtdHlwZT08Y2xpZW50LXR5cGU+XSIgPDwgZW5kbAorICAgICAgICA8PCAiXHRjbGllbnRzICAgICAgICBOdW1iZXIgb2YgY2xpZW50IHRocmVhZHMgdG8gY3JlYXRlIC0gMCBpbXBsaWVzIG5vIGNsaWVudHMsIGkuZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgb25seS4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRDb3VudCA8PCBlbmRsCisgICAgICAgIDw8ICJcdGhlbHAgICAgICAgICAgIFByaW50cyB0aGlzIGhlbHAgdGV4dC4iIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0Y2FsbCAgICAgICAgICAgU2VydmljZSBtZXRob2QgdG8gY2FsbC4gIERlZmF1bHQgaXMgIiA8PCBjYWxsTmFtZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdGxvb3AgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcy4gIERlZmF1bHQgaXMgIiA8PCBsb29wQ291bnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRwb3J0ICAgICAgICAgICBUaGUgcG9ydCB0aGUgc2VydmVyIGFuZCBjbGllbnRzIHNob3VsZCBiaW5kIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlciA8PCBlbmRsCisgICAgICAgIDw8ICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbAorICAgICAgICA8PCAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0Y2xpZW50LXR5cGUgICAgVHlwZSBvZiBjbGllbnQsIFwicmVndWxhclwiIG9yIFwiY29uY3VycmVudFwiLiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudFR5cGUgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gYXJnczsKKworICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgeworCisgICAgc3RyaW5nIGFyZyhhcmd2W2l4XSk7CisKKyAgICBpZiAoYXJnLmNvbXBhcmUoMCwgMiwgIi0tIikgPT0gMCkgeworCisgICAgICBzaXplX3QgZW5kID0gYXJnLmZpbmRfZmlyc3Rfb2YoIj0iLCAyKTsKKworICAgICAgc3RyaW5nIGtleSA9IHN0cmluZyhhcmcsIDIsIGVuZCAtIDIpOworCisgICAgICBpZiAoZW5kICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBhcmdzW2tleV0gPSBzdHJpbmcoYXJnLCBlbmQgKyAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFyZ3Nba2V5XSA9ICJ0cnVlIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5leGNlcHRlZCBjb21tYW5kIGxpbmUgdG9rZW46ICIgKyBhcmcpOworICAgIH0KKyAgfQorCisgIHRyeSB7CisKKyAgICBpZiAoIWFyZ3NbImNsaWVudHMiXS5lbXB0eSgpKSB7CisgICAgICBjbGllbnRDb3VudCA9IGF0b2koYXJnc1siY2xpZW50cyJdLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICghYXJnc1siaGVscCJdLmVtcHR5KCkpIHsKKyAgICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbImxvb3AiXS5lbXB0eSgpKSB7CisgICAgICBsb29wQ291bnQgPSBhdG9pKGFyZ3NbImxvb3AiXS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbImNhbGwiXS5lbXB0eSgpKSB7CisgICAgICBjYWxsTmFtZSA9IGFyZ3NbImNhbGwiXTsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbInBvcnQiXS5lbXB0eSgpKSB7CisgICAgICBwb3J0ID0gYXRvaShhcmdzWyJwb3J0Il0uY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJzZXJ2ZXIiXS5lbXB0eSgpKSB7CisgICAgICBydW5TZXJ2ZXIgPSBhcmdzWyJzZXJ2ZXIiXSA9PSAidHJ1ZSI7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJsb2ctcmVxdWVzdCJdLmVtcHR5KCkpIHsKKyAgICAgIGxvZ1JlcXVlc3RzID0gYXJnc1sibG9nLXJlcXVlc3QiXSA9PSAidHJ1ZSI7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJyZXBsYXktcmVxdWVzdCJdLmVtcHR5KCkpIHsKKyAgICAgIHJlcGxheVJlcXVlc3RzID0gYXJnc1sicmVwbGF5LXJlcXVlc3QiXSA9PSAidHJ1ZSI7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJzZXJ2ZXItdHlwZSJdLmVtcHR5KCkpIHsKKyAgICAgIHNlcnZlclR5cGUgPSBhcmdzWyJzZXJ2ZXItdHlwZSJdOworCisgICAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgeworCisgICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgeworCisgICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZGVkIikgeworCisgICAgICB9IGVsc2UgeworCisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmVyIHR5cGUgIiArIHNlcnZlclR5cGUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWFyZ3NbImNsaWVudC10eXBlIl0uZW1wdHkoKSkgeworICAgICAgY2xpZW50VHlwZSA9IGFyZ3NbImNsaWVudC10eXBlIl07CisKKyAgICAgIGlmIChjbGllbnRUeXBlID09ICJyZWd1bGFyIikgeworCisgICAgICB9IGVsc2UgaWYgKGNsaWVudFR5cGUgPT0gImNvbmN1cnJlbnQiKSB7CisKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBjbGllbnQgdHlwZSAiICsgY2xpZW50VHlwZSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghYXJnc1sid29ya2VycyJdLmVtcHR5KCkpIHsKKyAgICAgIHdvcmtlckNvdW50ID0gYXRvaShhcmdzWyJ3b3JrZXJzIl0uY19zdHIoKSk7CisgICAgfQorCisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgY2VyciA8PCBlLndoYXQoKSA8PCBlbmRsOworICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisKKyAgLy8gRGlzcGF0Y2hlcgorICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworCisgIGlmIChyZXBsYXlSZXF1ZXN0cykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKworICAgIC8vIFRyYW5zcG9ydHMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CisgICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7CisgICAgZmlsZVRyYW5zcG9ydC0+c2Vla1RvRW5kKCk7CisKKyAgICAvLyBQcm90b2NvbCBGYWN0b3J5CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKworICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBmaWxlVHJhbnNwb3J0KTsKKworICAgIGZpbGVQcm9jZXNzb3IucHJvY2VzcygwLCB0cnVlKTsKKyAgICBleGl0KDApOworICB9CisKKyAgaWYgKHJ1blNlcnZlcikgeworCisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKworICAgIC8vIFRyYW5zcG9ydAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworCisgICAgLy8gVHJhbnNwb3J0IEZhY3RvcnkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7CisKKyAgICAvLyBQcm90b2NvbCBGYWN0b3J5CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKworICAgIGlmIChsb2dSZXF1ZXN0cykgeworICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbG9nIGZpbGUKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKKyAgICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOworICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7CisKKyAgICAgIHRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPiBzZXJ2ZXI7CisKKyAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgeworCisgICAgICBzZXJ2ZXIucmVzZXQoCisgICAgICAgICAgbmV3IFRTaW1wbGVTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKworICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkZWQiKSB7CisKKyAgICAgIHNlcnZlci5yZXNldCgKKyAgICAgICAgICBuZXcgVFRocmVhZGVkU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CisKKyAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgeworCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgorICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CisKKyAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisgICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworICAgICAgc2VydmVyLnJlc2V0KG5ldyBUVGhyZWFkUG9vbFNlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcikpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU3RhcnRPYnNlcnZlcj4gb2JzZXJ2ZXIobmV3IFRTdGFydE9ic2VydmVyKTsKKyAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihvYnNlcnZlcik7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNlcnZlcik7CisKKyAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8IGVuZGw7CisKKyAgICBzZXJ2ZXJUaHJlYWQtPnN0YXJ0KCk7CisgICAgb2JzZXJ2ZXItPndhaXRGb3JTZXJ2aWNlKCk7CisKKyAgICAvLyBJZiB3ZSBhcmVuJ3QgcnVubmluZyBjbGllbnRzLCBqdXN0IHdhaXQgZm9yZXZlciBmb3IgZXh0ZXJuYWwgY2xpZW50cworICAgIGlmIChjbGllbnRDb3VudCA9PSAwKSB7CisgICAgICBzZXJ2ZXJUaHJlYWQtPmpvaW4oKTsKKyAgICB9CisgIH0KKworICBpZiAoY2xpZW50Q291bnQgPiAwKSB7IC8vRklYTUU6IHN0YXJ0IGhlcmUgZm9yIGNsaWVudCB0eXBlPworCisgICAgTW9uaXRvciBtb25pdG9yOworCisgICAgc2l6ZV90IHRocmVhZENvdW50ID0gMDsKKworICAgIHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CisKKyAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgeworICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7CisgICAgICBsb29wVHlwZSA9IFRfQllURTsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeworICAgICAgbG9vcFR5cGUgPSBUX0kzMjsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTY0IikgeworICAgICAgbG9vcFR5cGUgPSBUX0k2NDsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeworICAgICAgbG9vcFR5cGUgPSBUX1NUUklORzsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2aWNlIGNhbGwgIiArIGNhbGxOYW1lKTsKKyAgICB9CisKKyAgICBpZihjbGllbnRUeXBlID09ICJyZWd1bGFyIikgeworICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNsaWVudENvdW50OyBpeCsrKSB7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZmZlcmVkU29ja2V0KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CisKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkpKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmKGNsaWVudFR5cGUgPT0gImNvbmN1cnJlbnQiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChidWZmZXJlZFNvY2tldCkpOworICAgICAgLy9zdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDb25jdXJyZW50Q2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ29uY3VycmVudENsaWVudChwcm90b2NvbCkpOworICAgICAgc29ja2V0LT5vcGVuKCk7CisgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBEb250T3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpKSkpOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgICAgICAgdGhyZWFkICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CisgICAgICAgICB0aHJlYWQrKykgeworICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOworICAgIH0KKworICAgIGludDY0X3QgdGltZTAwOworICAgIGludDY0X3QgdGltZTAxOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CisgICAgICB0aHJlYWRDb3VudCA9IGNsaWVudENvdW50OworCisgICAgICBjZXJyIDw8ICJMYXVuY2ggIiA8PCBjbGllbnRDb3VudCA8PCAiICIgPDwgY2xpZW50VHlwZSA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOworCisgICAgICB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgICBtb25pdG9yLm5vdGlmeUFsbCgpOworCisgICAgICB3aGlsZSAodGhyZWFkQ291bnQgPiAwKSB7CisgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgfQorCisgICAgICB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIH0KKworICAgIGludDY0X3QgZmlyc3RUaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOworICAgIGludDY0X3QgbGFzdFRpbWUgPSAwOworCisgICAgZG91YmxlIGF2ZXJhZ2VUaW1lID0gMDsKKyAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CisgICAgaW50NjRfdCBtYXhUaW1lID0gMDsKKworICAgIGZvciAoc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgICAgICAgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKKyAgICAgICAgIGl4KyspIHsKKworICAgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50CisgICAgICAgICAgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOworCisgICAgICBpbnQ2NF90IGRlbHRhID0gY2xpZW50LT5fZW5kVGltZSAtIGNsaWVudC0+X3N0YXJ0VGltZTsKKworICAgICAgYXNzZXJ0KGRlbHRhID4gMCk7CisKKyAgICAgIGlmIChjbGllbnQtPl9zdGFydFRpbWUgPCBmaXJzdFRpbWUpIHsKKyAgICAgICAgZmlyc3RUaW1lID0gY2xpZW50LT5fc3RhcnRUaW1lOworICAgICAgfQorCisgICAgICBpZiAoY2xpZW50LT5fZW5kVGltZSA+IGxhc3RUaW1lKSB7CisgICAgICAgIGxhc3RUaW1lID0gY2xpZW50LT5fZW5kVGltZTsKKyAgICAgIH0KKworICAgICAgaWYgKGRlbHRhIDwgbWluVGltZSkgeworICAgICAgICBtaW5UaW1lID0gZGVsdGE7CisgICAgICB9CisKKyAgICAgIGlmIChkZWx0YSA+IG1heFRpbWUpIHsKKyAgICAgICAgbWF4VGltZSA9IGRlbHRhOworICAgICAgfQorCisgICAgICBhdmVyYWdlVGltZSArPSBkZWx0YTsKKyAgICB9CisKKyAgICBhdmVyYWdlVGltZSAvPSBjbGllbnRDb3VudDsKKworICAgIGNvdXQgPDwgIndvcmtlcnMgOiIgPDwgd29ya2VyQ291bnQgPDwgIiwgY2xpZW50IDogIiA8PCBjbGllbnRDb3VudCA8PCAiLCBsb29wcyA6ICIgPDwgbG9vcENvdW50CisgICAgICAgICA8PCAiLCByYXRlIDogIiA8PCAoY2xpZW50Q291bnQgKiBsb29wQ291bnQgKiAxMDAwKSAvICgoZG91YmxlKSh0aW1lMDEgLSB0aW1lMDApKSA8PCBlbmRsOworCisgICAgY291bnRfbWFwIGNvdW50ID0gc2VydmljZUhhbmRsZXItPmdldENvdW50KCk7CisgICAgY291bnRfbWFwOjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGNvdW50LmJlZ2luKCk7IGl0ZXIgIT0gY291bnQuZW5kKCk7ICsraXRlcikgeworICAgICAgcHJpbnRmKCIlcyA9PiAlZFxuIiwgaXRlci0+Zmlyc3QsIGl0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGNlcnIgPDwgImRvbmUuIiA8PCBlbmRsOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkM2VkNzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcApAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RMb2dnaW5nLmg+CisKKyNpbmNsdWRlICJTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCit1c2luZyBuYW1lc3BhY2UgdGVzdDo6c3RyZXNzOworCitzdHJ1Y3QgZXFzdHIgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOyB9Cit9OworCitzdHJ1Y3QgbHRzdHIgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA8IDA7IH0KK307CisKKy8vIHR5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIGludCwgaGFzaDxjb25zdCBjaGFyKj4sIGVxc3RyPiBjb3VudF9tYXA7Cit0eXBlZGVmIG1hcDxjb25zdCBjaGFyKiwgaW50LCBsdHN0cj4gY291bnRfbWFwOworCitjbGFzcyBTZXJ2ZXIgOiBwdWJsaWMgU2VydmljZUlmIHsKK3B1YmxpYzoKKyAgU2VydmVyKCkge30KKworICB2b2lkIGNvdW50KGNvbnN0IGNoYXIqIG1ldGhvZCkgeworICAgIEd1YXJkIG0obG9ja18pOworICAgIGludCBjdCA9IGNvdW50c19bbWV0aG9kXTsKKyAgICBjb3VudHNfW21ldGhvZF0gPSArK2N0OworICB9CisKKyAgdm9pZCBlY2hvVm9pZCgpIHsKKyAgICBjb3VudCgiZWNob1ZvaWQiKTsKKyAgICAvLyBTbGVlcCB0byBzaW11bGF0ZSB3b3JrCisgICAgVEhSSUZUX1NMRUVQX1VTRUMoMSk7CisgICAgcmV0dXJuOworICB9CisKKyAgY291bnRfbWFwIGdldENvdW50KCkgeworICAgIEd1YXJkIG0obG9ja18pOworICAgIHJldHVybiBjb3VudHNfOworICB9CisKKyAgaW50OF90IGVjaG9CeXRlKGNvbnN0IGludDhfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBpbnQzMl90IGVjaG9JMzIoY29uc3QgaW50MzJfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICBpbnQ2NF90IGVjaG9JNjQoY29uc3QgaW50NjRfdCBhcmcpIHsgcmV0dXJuIGFyZzsgfQorICB2b2lkIGVjaG9TdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgYXJnKSB7CisgICAgaWYgKGFyZyAhPSAiaGVsbG8iKSB7CisgICAgICBUX0VSUk9SX0FCT1JUKCJXUk9ORyBTVFJJTkcgKCVzKSEhISEiLCBhcmcuY19zdHIoKSk7CisgICAgfQorICAgIG91dCA9IGFyZzsKKyAgfQorICB2b2lkIGVjaG9MaXN0KHZlY3RvcjxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHZlY3RvcjxpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob1NldChzZXQ8aW50OF90PiYgb3V0LCBjb25zdCBzZXQ8aW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9NYXAobWFwPGludDhfdCwgaW50OF90PiYgb3V0LCBjb25zdCBtYXA8aW50OF90LCBpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisKK3ByaXZhdGU6CisgIGNvdW50X21hcCBjb3VudHNfOworICBNdXRleCBsb2NrXzsKK307CisKK2NsYXNzIENsaWVudFRocmVhZCA6IHB1YmxpYyBSdW5uYWJsZSB7CitwdWJsaWM6CisgIENsaWVudFRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgICAgICAgIE1vbml0b3ImIG1vbml0b3IsCisgICAgICAgICAgICAgICBzaXplX3QmIHdvcmtlckNvdW50LAorICAgICAgICAgICAgICAgc2l6ZV90IGxvb3BDb3VudCwKKyAgICAgICAgICAgICAgIFRUeXBlIGxvb3BUeXBlKQorICAgIDogX3RyYW5zcG9ydCh0cmFuc3BvcnQpLAorICAgICAgX2NsaWVudChjbGllbnQpLAorICAgICAgX21vbml0b3IobW9uaXRvciksCisgICAgICBfd29ya2VyQ291bnQod29ya2VyQ291bnQpLAorICAgICAgX2xvb3BDb3VudChsb29wQ291bnQpLAorICAgICAgX2xvb3BUeXBlKGxvb3BUeXBlKSB7fQorCisgIHZvaWQgcnVuKCkgeworCisgICAgLy8gV2FpdCBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIHN0YXJ0CisKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICB3aGlsZSAoX3dvcmtlckNvdW50ID09IDApIHsKKyAgICAgICAgX21vbml0b3Iud2FpdCgpOworICAgICAgfQorICAgIH0KKworICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworCisgICAgX3RyYW5zcG9ydC0+b3BlbigpOworCisgICAgc3dpdGNoIChfbG9vcFR5cGUpIHsKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIGxvb3BFY2hvVm9pZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0JZVEU6CisgICAgICBsb29wRWNob0J5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9JMzI6CisgICAgICBsb29wRWNob0kzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0k2NDoKKyAgICAgIGxvb3BFY2hvSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgbG9vcEVjaG9TdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjZXJyIDw8ICJVbmV4cGVjdGVkIGxvb3AgdHlwZSIgPDwgX2xvb3BUeXBlIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgICBfdHJhbnNwb3J0LT5jbG9zZSgpOworCisgICAgX2RvbmUgPSB0cnVlOworCisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgICBfd29ya2VyQ291bnQtLTsKKworICAgICAgaWYgKF93b3JrZXJDb3VudCA9PSAwKSB7CisKKyAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob1ZvaWQoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIF9jbGllbnQtPmVjaG9Wb2lkKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob0J5dGUoKSB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKKyAgICAgIGludDhfdCBhcmcgPSAxOworICAgICAgaW50OF90IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9CeXRlKGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CisgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob0kzMigpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgaW50MzJfdCBhcmcgPSAxOworICAgICAgaW50MzJfdCByZXN1bHQ7CisgICAgICByZXN1bHQgPSBfY2xpZW50LT5lY2hvSTMyKGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CisgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob0k2NCgpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgaW50NjRfdCBhcmcgPSAxOworICAgICAgaW50NjRfdCByZXN1bHQ7CisgICAgICByZXN1bHQgPSBfY2xpZW50LT5lY2hvSTY0KGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CisgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CisgICAgfQorICB9CisKKyAgdm9pZCBsb29wRWNob1N0cmluZygpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgeworICAgICAgc3RyaW5nIGFyZyA9ICJoZWxsbyI7CisgICAgICBzdHJpbmcgcmVzdWx0OworICAgICAgX2NsaWVudC0+ZWNob1N0cmluZyhyZXN1bHQsIGFyZyk7CisgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CisgICAgfQorICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBfY2xpZW50OworICBNb25pdG9yJiBfbW9uaXRvcjsKKyAgc2l6ZV90JiBfd29ya2VyQ291bnQ7CisgIHNpemVfdCBfbG9vcENvdW50OworICBUVHlwZSBfbG9vcFR5cGU7CisgIGludDY0X3QgX3N0YXJ0VGltZTsKKyAgaW50NjRfdCBfZW5kVGltZTsKKyAgYm9vbCBfZG9uZTsKKyAgTW9uaXRvciBfc2xlZXA7Cit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyNpZiBfV0lOMzIKKyAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKKworICBpbnQgcG9ydCA9IDkwOTE7CisgIHN0cmluZyBzZXJ2ZXJUeXBlID0gInNpbXBsZSI7CisgIHN0cmluZyBwcm90b2NvbFR5cGUgPSAiYmluYXJ5IjsKKyAgdWludDMyX3Qgd29ya2VyQ291bnQgPSA0OworICB1aW50MzJfdCBjbGllbnRDb3VudCA9IDIwOworICB1aW50MzJfdCBsb29wQ291bnQgPSAxMDAwOworICBUVHlwZSBsb29wVHlwZSA9IFRfVk9JRDsKKyAgc3RyaW5nIGNhbGxOYW1lID0gImVjaG9Wb2lkIjsKKyAgYm9vbCBydW5TZXJ2ZXIgPSB0cnVlOworICBib29sIGxvZ1JlcXVlc3RzID0gZmFsc2U7CisgIHN0cmluZyByZXF1ZXN0TG9nUGF0aCA9ICIuL3JlcXVlc3Rsb2cudGxvZyI7CisgIGJvb2wgcmVwbGF5UmVxdWVzdHMgPSBmYWxzZTsKKworICBvc3RyaW5nc3RyZWFtIHVzYWdlOworCisgIHVzYWdlIDw8IGFyZ3ZbMF0gPDwgIiBbLS1wb3J0PTxwb3J0IG51bWJlcj5dIFstLXNlcnZlcl0gWy0tc2VydmVyLXR5cGU9PHNlcnZlci10eXBlPl0gIgorICAgICAgICAgICAgICAgICAgICAgICJbLS1wcm90b2NvbC10eXBlPTxwcm90b2NvbC10eXBlPl0gWy0td29ya2Vycz08d29ya2VyLWNvdW50Pl0gIgorICAgICAgICAgICAgICAgICAgICAgICJbLS1jbGllbnRzPTxjbGllbnQtY291bnQ+XSBbLS1sb29wPTxsb29wLWNvdW50Pl0iIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuICIKKyAgICAgICAgICAgInNlcnZlciBvbmx5LiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudENvdW50IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0aGVscCAgICAgICAgICAgUHJpbnRzIHRoaXMgaGVscCB0ZXh0LiIgPDwgZW5kbAorICAgICAgICA8PCAiXHRjYWxsICAgICAgICAgICBTZXJ2aWNlIG1ldGhvZCB0byBjYWxsLiAgRGVmYXVsdCBpcyAiIDw8IGNhbGxOYW1lIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiCisgICAgICAgIDw8IGxvb3BDb3VudCA8PCBlbmRsIDw8ICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlcgorICAgICAgICA8PCBlbmRsIDw8ICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIgorICAgICAgICA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiCisgICAgICAgIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzCisgICAgICAgIDw8IGVuZGwgPDwgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIKKyAgICAgICAgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbCA8PCAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50CisgICAgICAgIDw8IGVuZGw7CisKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBhcmdzOworCisgIGZvciAoaW50IGl4ID0gMTsgaXggPCBhcmdjOyBpeCsrKSB7CisKKyAgICBzdHJpbmcgYXJnKGFyZ3ZbaXhdKTsKKworICAgIGlmIChhcmcuY29tcGFyZSgwLCAyLCAiLS0iKSA9PSAwKSB7CisKKyAgICAgIHNpemVfdCBlbmQgPSBhcmcuZmluZF9maXJzdF9vZigiPSIsIDIpOworCisgICAgICBzdHJpbmcga2V5ID0gc3RyaW5nKGFyZywgMiwgZW5kIC0gMik7CisKKyAgICAgIGlmIChlbmQgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGFyZ3Nba2V5XSA9IHN0cmluZyhhcmcsIGVuZCArIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJnc1trZXldID0gInRydWUiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIiArIGFyZyk7CisgICAgfQorICB9CisKKyAgdHJ5IHsKKworICAgIGlmICghYXJnc1siY2xpZW50cyJdLmVtcHR5KCkpIHsKKyAgICAgIGNsaWVudENvdW50ID0gYXRvaShhcmdzWyJjbGllbnRzIl0uY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJoZWxwIl0uZW1wdHkoKSkgeworICAgICAgY2VyciA8PCB1c2FnZS5zdHIoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghYXJnc1sibG9vcCJdLmVtcHR5KCkpIHsKKyAgICAgIGxvb3BDb3VudCA9IGF0b2koYXJnc1sibG9vcCJdLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICghYXJnc1siY2FsbCJdLmVtcHR5KCkpIHsKKyAgICAgIGNhbGxOYW1lID0gYXJnc1siY2FsbCJdOworICAgIH0KKworICAgIGlmICghYXJnc1sicG9ydCJdLmVtcHR5KCkpIHsKKyAgICAgIHBvcnQgPSBhdG9pKGFyZ3NbInBvcnQiXS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbInNlcnZlciJdLmVtcHR5KCkpIHsKKyAgICAgIHJ1blNlcnZlciA9IGFyZ3NbInNlcnZlciJdID09ICJ0cnVlIjsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbImxvZy1yZXF1ZXN0Il0uZW1wdHkoKSkgeworICAgICAgbG9nUmVxdWVzdHMgPSBhcmdzWyJsb2ctcmVxdWVzdCJdID09ICJ0cnVlIjsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbInJlcGxheS1yZXF1ZXN0Il0uZW1wdHkoKSkgeworICAgICAgcmVwbGF5UmVxdWVzdHMgPSBhcmdzWyJyZXBsYXktcmVxdWVzdCJdID09ICJ0cnVlIjsKKyAgICB9CisKKyAgICBpZiAoIWFyZ3NbInNlcnZlci10eXBlIl0uZW1wdHkoKSkgeworICAgICAgc2VydmVyVHlwZSA9IGFyZ3NbInNlcnZlci10eXBlIl07CisgICAgfQorCisgICAgaWYgKCFhcmdzWyJ3b3JrZXJzIl0uZW1wdHkoKSkgeworICAgICAgd29ya2VyQ291bnQgPSBhdG9pKGFyZ3NbIndvcmtlcnMiXS5jX3N0cigpKTsKKyAgICB9CisKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7CisgICAgY2VyciA8PCB1c2FnZS5zdHIoKTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKworICAvLyBEaXNwYXRjaGVyCisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisKKyAgaWYgKHJlcGxheVJlcXVlc3RzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOworCisgICAgLy8gVHJhbnNwb3J0cworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKKyAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKKyAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKKyAgICBmaWxlVHJhbnNwb3J0LT5zZWVrVG9FbmQoKTsKKworICAgIC8vIFByb3RvY29sIEZhY3RvcnkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworCisgICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIGZpbGVUcmFuc3BvcnQpOworCisgICAgZmlsZVByb2Nlc3Nvci5wcm9jZXNzKDAsIHRydWUpOworICAgIGV4aXQoMCk7CisgIH0KKworICBpZiAocnVuU2VydmVyKSB7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOworCisgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisKKyAgICAvLyBUcmFuc3BvcnQgRmFjdG9yeQorICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKKworICAgIGlmIChsb2dSZXF1ZXN0cykgeworICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbG9nIGZpbGUKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKKyAgICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOworICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7CisKKyAgICAgIHRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQyOworICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gbmJTb2NrZXQxOworICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gbmJTb2NrZXQyOworCisgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKKworICAgICAgbmJTb2NrZXQxLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDEpKSk7CisgICAgICBuYlNvY2tldDIucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQgKyAxKSk7CisgICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQyKSkpOworCisgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKKworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgICAgICA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOworCisgICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKKyAgICAgIG5iU29ja2V0MS5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQxLCB0aHJlYWRNYW5hZ2VyKSkpOworICAgICAgbmJTb2NrZXQyLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0ICsgMSkpOworICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MiwgdGhyZWFkTWFuYWdlcikpKTsKKyAgICB9CisKKyAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8ICIgYW5kICIgPDwgKHBvcnQgKyAxKSA8PCBlbmRsOworICAgIHNlcnZlclRocmVhZC0+c3RhcnQoKTsKKyAgICBzZXJ2ZXJUaHJlYWQyLT5zdGFydCgpOworCisgICAgLy8gSWYgd2UgYXJlbid0IHJ1bm5pbmcgY2xpZW50cywganVzdCB3YWl0IGZvcmV2ZXIgZm9yIGV4dGVybmFsIGNsaWVudHMKKworICAgIGlmIChjbGllbnRDb3VudCA9PSAwKSB7CisgICAgICBzZXJ2ZXJUaHJlYWQtPmpvaW4oKTsKKyAgICAgIHNlcnZlclRocmVhZDItPmpvaW4oKTsKKyAgICB9CisgIH0KKyAgVEhSSUZUX1NMRUVQX1NFQygxKTsKKworICBpZiAoY2xpZW50Q291bnQgPiAwKSB7CisKKyAgICBNb25pdG9yIG1vbml0b3I7CisKKyAgICBzaXplX3QgdGhyZWFkQ291bnQgPSAwOworCisgICAgc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKKworICAgIGlmIChjYWxsTmFtZSA9PSAiZWNob1ZvaWQiKSB7CisgICAgICBsb29wVHlwZSA9IFRfVk9JRDsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvQnl0ZSIpIHsKKyAgICAgIGxvb3BUeXBlID0gVF9CWVRFOworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JMzIiKSB7CisgICAgICBsb29wVHlwZSA9IFRfSTMyOworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JNjQiKSB7CisgICAgICBsb29wVHlwZSA9IFRfSTY0OworICAgIH0gZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9TdHJpbmciKSB7CisgICAgICBsb29wVHlwZSA9IFRfU1RSSU5HOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZpY2UgY2FsbCAiICsgY2FsbE5hbWUpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaXggPSAwOyBpeCA8IGNsaWVudENvdW50OyBpeCsrKSB7CisKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQgKyAoaXggJSAyKSkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woZnJhbWVkU29ja2V0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOworCisgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCisgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlKSkpKTsKKyAgICB9CisKKyAgICBmb3IgKHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgIHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOworICAgICAgICAgdGhyZWFkKyspIHsKKyAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWUwMDsKKyAgICBpbnQ2NF90IHRpbWUwMTsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOworICAgICAgdGhyZWFkQ291bnQgPSBjbGllbnRDb3VudDsKKworICAgICAgY2VyciA8PCAiTGF1bmNoICIgPDwgY2xpZW50Q291bnQgPDwgIiBjbGllbnQgdGhyZWFkcyIgPDwgZW5kbDsKKworICAgICAgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKworICAgICAgbW9uaXRvci5ub3RpZnlBbGwoKTsKKworICAgICAgd2hpbGUgKHRocmVhZENvdW50ID4gMCkgeworICAgICAgICBtb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKworICAgICAgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGZpcnN0VGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKKyAgICBpbnQ2NF90IGxhc3RUaW1lID0gMDsKKworICAgIGRvdWJsZSBhdmVyYWdlVGltZSA9IDA7CisgICAgaW50NjRfdCBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOworICAgIGludDY0X3QgbWF4VGltZSA9IDA7CisKKyAgICBmb3IgKHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgIGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CisgICAgICAgICBpeCsrKSB7CisKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudAorICAgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKKworICAgICAgaW50NjRfdCBkZWx0YSA9IGNsaWVudC0+X2VuZFRpbWUgLSBjbGllbnQtPl9zdGFydFRpbWU7CisKKyAgICAgIGFzc2VydChkZWx0YSA+IDApOworCisgICAgICBpZiAoY2xpZW50LT5fc3RhcnRUaW1lIDwgZmlyc3RUaW1lKSB7CisgICAgICAgIGZpcnN0VGltZSA9IGNsaWVudC0+X3N0YXJ0VGltZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNsaWVudC0+X2VuZFRpbWUgPiBsYXN0VGltZSkgeworICAgICAgICBsYXN0VGltZSA9IGNsaWVudC0+X2VuZFRpbWU7CisgICAgICB9CisKKyAgICAgIGlmIChkZWx0YSA8IG1pblRpbWUpIHsKKyAgICAgICAgbWluVGltZSA9IGRlbHRhOworICAgICAgfQorCisgICAgICBpZiAoZGVsdGEgPiBtYXhUaW1lKSB7CisgICAgICAgIG1heFRpbWUgPSBkZWx0YTsKKyAgICAgIH0KKworICAgICAgYXZlcmFnZVRpbWUgKz0gZGVsdGE7CisgICAgfQorCisgICAgYXZlcmFnZVRpbWUgLz0gY2xpZW50Q291bnQ7CisKKyAgICBjb3V0IDw8ICJ3b3JrZXJzIDoiIDw8IHdvcmtlckNvdW50IDw8ICIsIGNsaWVudCA6ICIgPDwgY2xpZW50Q291bnQgPDwgIiwgbG9vcHMgOiAiIDw8IGxvb3BDb3VudAorICAgICAgICAgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKKworICAgIGNvdW50X21hcCBjb3VudCA9IHNlcnZpY2VIYW5kbGVyLT5nZXRDb3VudCgpOworICAgIGNvdW50X21hcDo6aXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBjb3VudC5iZWdpbigpOyBpdGVyICE9IGNvdW50LmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHByaW50ZigiJXMgPT4gJWRcbiIsIGl0ZXItPmZpcnN0LCBpdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBjZXJyIDw8ICJkb25lLiIgPDwgZW5kbDsKKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwIGIvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwCmluZGV4IDVkZGZhMDYuLjg5ZjNmZDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcAorKysgYi90ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAKQEAgLTEsNCArMSw0IEBACi0vKgor77u/LyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMTcsNzcgKzE3LDMzNSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGlvcz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPiAvLyA8ZXZlbnQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZG9tL3JhbmRvbV9kZXZpY2UuaHBwPgorI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIlNlY29uZFNlcnZpY2UuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0LmgiCiAKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi11c2luZyBuYW1lc3BhY2UgYm9vc3Q7CiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7CiAKLS8vZXh0ZXJuIHVpbnQzMl90IGdfc29ja2V0X3N5c2NhbGxzOwotCiAvLyBDdXJyZW50IHRpbWUsIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gKLXVpbnQ2NF90IG5vdygpCi17Ci0gIGxvbmcgbG9uZyByZXQ7Cit1aW50NjRfdCBub3coKSB7CisgIGludDY0X3QgcmV0OwogICBzdHJ1Y3QgdGltZXZhbCB0djsKIAotICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIE5VTEwpOwogICByZXQgPSB0di50dl9zZWM7Ci0gIHJldCA9IHJldCoxMDAwKjEwMDAgKyB0di50dl91c2VjOworICByZXQgPSByZXQgKiAxMDAwICogMTAwMCArIHR2LnR2X3VzZWM7CiAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIHRlc3RTdHJpbmdfY2xpZW50UmV0dXJuKGV2ZW50X2Jhc2UqIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVzdE5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50KSB7CisgIHRyeSB7CisgICAgc3RyaW5nIHM7CisgICAgY2xpZW50LT5yZWN2X3Rlc3RTdHJpbmcocyk7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgIG9zIDw8ICJ0ZXN0IiA8PCB0ZXN0TnI7CisgICAgY29uc3QgYm9vbCBvayA9IChzID09IG9zLnN0cigpKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nOiAiIDw8IHMgPDwgIiAiIDw8ICgob2spID8gIm9rIiA6ICJmYWlsZWQiKSA8PCBlbmRsOworICB9IGNhdGNoIChURXhjZXB0aW9uJiBleG4pIHsKKyAgICBjb3V0IDw8ICJFcnJvcjogIiA8PCBleG4ud2hhdCgpIDw8IGVuZGw7CisgIH0KKworICBpZiAodGVzdE5yID09IDkpCisgICAgZXZlbnRfYmFzZV9sb29wYnJlYWsoYmFzZSk7IC8vIGVuZCB0ZXN0Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RWb2lkX2NsaWVudFJldHVybihldmVudF9iYXNlKiBiYXNlLCBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQpIHsKKyAgdHJ5IHsKKyAgICBjbGllbnQtPnJlY3ZfdGVzdFZvaWQoKTsKKyAgICBjb3V0IDw8ICJ0ZXN0Vm9pZCIgPDwgZW5kbDsKKworICAgIGZvciAoaW50IHRlc3ROciA9IDA7IHRlc3ROciA8IDEwOyArK3Rlc3ROcikgeworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgb3MgPDwgInRlc3QiIDw8IHRlc3ROcjsKKyAgICAgIGNsaWVudC0+dGVzdFN0cmluZyhzdGQ6OmJpbmQodGVzdFN0cmluZ19jbGllbnRSZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RyKCkpOworICAgIH0KKyAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZXhuKSB7CisgICAgY291dCA8PCAiRXJyb3I6ICIgPDwgZXhuLndoYXQoKSA8PCBlbmRsOworICB9Cit9CisKKy8vIFdvcmthcm91bmQgZm9yIGFic2Vuc2Ugb2YgQysrMTEgImF1dG8iIGtleXdvcmQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgcHJpbnRfZXEoVCBleHBlY3RlZCwgVCBhY3R1YWwpIHsKKyAgY291dCA8PCAiKCIgPDwgYWN0dWFsIDw8ICIpIiA8PCBlbmRsOworICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7CisgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgYnV0IGdvdDogIiA8PCBhY3R1YWwgPDwgZW5kbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgQkFTRVRZUEVfSURFTlRJVFlfVEVTVChmdW5jLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY291dCA8PCAjZnVuYyAiKCIgPDwgdmFsdWUgPDwgIikgPSAiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXByaW50X2VxKHZhbHVlLCB0ZXN0Q2xpZW50LmZ1bmModmFsdWUpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aHJvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBjYXRjaCAoZXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitpbnQgYmluYXJ5X3Rlc3QoVGhyaWZ0VGVzdENsaWVudCYgdGVzdENsaWVudCwgc3RyaW5nOjpzaXplX3R5cGUgc2l6KTsKKworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfQkFTRVRZUEVTID0gMTsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX1NUUlVDVFMgPSAyOworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfQ09OVEFJTkVSUyA9IDQ7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9FWENFUFRJT05TID0gODsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX1VOS05PV04gPSA2NDsKKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGNvdXQucHJlY2lzaW9uKDE5KTsKKworICBzdHJpbmcgdGVzdERpciAgPSBib29zdDo6ZmlsZXN5c3RlbTo6c3lzdGVtX2NvbXBsZXRlKGFyZ3ZbMF0pLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnN0cmluZygpOworICBzdHJpbmcgY2FQYXRoICAgPSB0ZXN0RGlyICsgIi9rZXlzL0NBLnBlbSI7CisgIHN0cmluZyBjZXJ0UGF0aCA9IHRlc3REaXIgKyAiL2tleXMvY2xpZW50LmNydCI7CisgIHN0cmluZyBrZXlQYXRoICA9IHRlc3REaXIgKyAiL2tleXMvY2xpZW50LmtleSI7CisKKyNpZiBfV0lOMzIKKyAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYKICAgc3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKICAgaW50IHBvcnQgPSA5MDkwOwogICBpbnQgbnVtVGVzdHMgPSAxOwotICBib29sIGZyYW1lZCA9IGZhbHNlOworICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHpsaWIgPSBmYWxzZTsKKyAgc3RyaW5nIHRyYW5zcG9ydF90eXBlID0gImJ1ZmZlcmVkIjsKKyAgc3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKKyAgc3RyaW5nIGRvbWFpbl9zb2NrZXQgPSAiIjsKKyAgYm9vbCBhYnN0cmFjdF9uYW1lc3BhY2UgPSBmYWxzZTsKKyAgYm9vbCBub2luc2FuZSA9IGZhbHNlOwogCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7Ci0gICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWgiKSA9PSAwKSB7Ci0gICAgICBjaGFyKiBwY2ggPSBzdHJ0b2soYXJndlsrK2ldLCAiOiIpOwotICAgICAgaWYgKHBjaCAhPSBOVUxMKSB7Ci0gICAgICAgIGhvc3QgPSBzdHJpbmcocGNoKTsKKyAgaW50IHJldHVybl9jb2RlID0gMDsKKworICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpvcHRpb25zX2Rlc2NyaXB0aW9uIGRlc2MoIkFsbG93ZWQgb3B0aW9ucyIpOworICBkZXNjLmFkZF9vcHRpb25zKCkKKyAgICAgICgiaGVscCxoIiwgInByb2R1Y2UgaGVscCBtZXNzYWdlIikKKyAgICAgICgiaG9zdCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmaG9zdCktPmRlZmF1bHRfdmFsdWUoaG9zdCksCisgICAgICAgICAgIkhvc3QgdG8gY29ubmVjdCIpCisgICAgICAoInBvcnQiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLAorICAgICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKKyAgICAgICgiZG9tYWluLXNvY2tldCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksCisgICAgICAgICAgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCisgICAgICAoImFic3RyYWN0LW5hbWVzcGFjZSIsCisgICAgICAgICAgIkxvb2sgZm9yIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UiCisgICAgICAgICAgIiAobm8gY29ubmVjdGlvbiB3aXRoIGZpbGVzeXN0ZW0gcGF0aG5hbWVzKSIpCisgICAgICAoInRyYW5zcG9ydCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwKKyAgICAgICAgICAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAsIHpsaWIiKQorICAgICAgKCJwcm90b2NvbCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksCisgICAgICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGhlYWRlciwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGloLCBtdWx0aWoiKQorICAgICAgKCJzc2wiLAorICAgICAgICAgICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCisgICAgICAoInpsaWIiLAorICAgICAgICAgICJXcmFwIFRyYW5zcG9ydCB3aXRoIFpsaWIiKQorICAgICAgKCJ0ZXN0bG9vcHMsbiIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmbnVtVGVzdHMpLT5kZWZhdWx0X3ZhbHVlKG51bVRlc3RzKSwKKyAgICAgICAgICAiTnVtYmVyIG9mIFRlc3RzIikKKyAgICAgICgibm9pbnNhbmUiLAorICAgICAgICAgICJEbyBub3QgcnVuIGluc2FuaXR5IHRlc3QiKTsKKworICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YXJpYWJsZXNfbWFwIHZtOworICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpzdG9yZShib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6bm90aWZ5KHZtKTsKKworICBpZiAodm0uY291bnQoImhlbHAiKSkgeworICAgIGNvdXQgPDwgZGVzYyA8PCBlbmRsOworICAgIHJldHVybiBFUlJfVU5LTk9XTjsKKyAgfQorCisgIHRyeSB7CisgICAgaWYgKCFwcm90b2NvbF90eXBlLmVtcHR5KCkpIHsKKyAgICAgIGlmIChwcm90b2NvbF90eXBlID09ICJiaW5hcnkiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGkiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgfQotICAgICAgcGNoID0gc3RydG9rKE5VTEwsICI6Iik7Ci0gICAgICBpZiAocGNoICE9IE5VTEwpIHsKLSAgICAgICAgcG9ydCA9IGF0b2kocGNoKTsKKyAgICB9CisKKyAgICBpZiAoIXRyYW5zcG9ydF90eXBlLmVtcHR5KCkpIHsKKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiYnVmZmVyZWQiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZXZodHRwIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiemxpYiIpIHsKKyAgICAgICAgLy8gY3Jvc3N0ZXN0IHdpbGwgcGFzcyB6bGliIGFzIGEgdHJhbnNwb3J0IGFuZCBhcyBhIGZsYWcgcmlnaHQgbm93Li4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gdHJhbnNwb3J0IHR5cGUgIiArIHRyYW5zcG9ydF90eXBlKTsKICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLW4iKSA9PSAwKSB7Ci0gICAgICBudW1UZXN0cyA9IGF0b2koYXJndlsrK2ldKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLWYiKSA9PSAwKSB7Ci0gICAgICBmcmFtZWQgPSB0cnVlOworICAgIH0KKworICB9IGNhdGNoIChleGNlcHRpb24mIGUpIHsKKyAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7CisgICAgY291dCA8PCBkZXNjIDw8IGVuZGw7CisgICAgcmV0dXJuIEVSUl9VTktOT1dOOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJzc2wiKSkgeworICAgIHNzbCA9IHRydWU7CisgIH0KKworICBpZiAodm0uY291bnQoInpsaWIiKSkgeworICAgIHpsaWIgPSB0cnVlOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJhYnN0cmFjdC1uYW1lc3BhY2UiKSkgeworICAgIGFic3RyYWN0X25hbWVzcGFjZSA9IHRydWU7CisgIH0KKworICBpZiAodm0uY291bnQoIm5vaW5zYW5lIikpIHsKKyAgICBub2luc2FuZSA9IHRydWU7CisgIH0KKworICAvLyBUSFJJRlQtNDE2NDogVGhlIGZhY3RvcnkgTVVTVCBvdXRsaXZlIGFueSBzb2NrZXRzIGl0IGNyZWF0ZXMgZm9yIGNvcnJlY3QgYmVoYXZpb3IhCisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2w7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sMjsgIC8vIFNlY29uZFNlcnZpY2UgZm9yIG11bHRpcGxleGVkCisKKyAgaWYgKHNzbCkgeworICAgIGNvdXQgPDwgIkNsaWVudCBDZXJ0aWZpY2F0ZSBGaWxlOiAiIDw8IGNlcnRQYXRoIDw8IGVuZGw7CisgICAgY291dCA8PCAiQ2xpZW50IEtleSAgICAgICAgIEZpbGU6ICIgPDwga2V5UGF0aCA8PCBlbmRsOworICAgIGNvdXQgPDwgIkNBICAgICAgICAgICAgICAgICBGaWxlOiAiIDw8IGNhUGF0aCA8PCBlbmRsOworCisgICAgZmFjdG9yeSA9IHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICAgIGZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOworICAgIGZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNhUGF0aC5jX3N0cigpKTsKKyAgICBmYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydFBhdGguY19zdHIoKSk7CisgICAgZmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoa2V5UGF0aC5jX3N0cigpKTsKKyAgICBmYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CisgICAgc29ja2V0ID0gZmFjdG9yeS0+Y3JlYXRlU29ja2V0KGhvc3QsIHBvcnQpOworICB9IGVsc2UgeworICAgIGlmIChkb21haW5fc29ja2V0ICE9ICIiKSB7CisgICAgICBpZiAoYWJzdHJhY3RfbmFtZXNwYWNlKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGFic3RyYWN0X3NvY2tldCgiXDAiLCAxKTsKKyAgICAgICAgYWJzdHJhY3Rfc29ja2V0ICs9IGRvbWFpbl9zb2NrZXQ7CisgICAgICAgIHNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChhYnN0cmFjdF9zb2NrZXQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChkb21haW5fc29ja2V0KSk7CisgICAgICB9CisgICAgICBwb3J0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgc29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpKTsKICAgICB9CiAgIH0KIAotCi0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OwotCi0gIHNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpKTsKLQotICBpZiAoZnJhbWVkKSB7Ci0gICAgc2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiBmcmFtZWRTb2NrZXQobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAgdHJhbnNwb3J0ID0gZnJhbWVkU29ja2V0OworICBpZiAodHJhbnNwb3J0X3R5cGUuY29tcGFyZSgiaHR0cCIpID09IDApIHsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwQ2xpZW50Pihzb2NrZXQsIGhvc3QsICIvc2VydmljZSIpOworICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImZyYW1lZCIpID09IDApIHsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCk7CiAgIH0gZWxzZSB7Ci0gICAgc2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAgdHJhbnNwb3J0ID0gYnVmZmVyZWRTb2NrZXQ7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnQ+KHNvY2tldCk7CiAgIH0KIAotICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgaWYgKHpsaWIpIHsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRabGliVHJhbnNwb3J0Pih0cmFuc3BvcnQpOworICB9CisKKyAgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsKKyAgICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEpTT05Qcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRDb21wYWN0UHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWgiKSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRIZWFkZXJQcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfSBlbHNlIHsKKyAgICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sPih0cmFuc3BvcnQpOworICB9CisKKyAgaWYgKGJvb3N0OjpzdGFydHNfd2l0aChwcm90b2NvbF90eXBlLCAibXVsdGkiKSkgeworICBwcm90b2NvbDIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRNdWx0aXBsZXhlZFByb3RvY29sPihwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKTsKKyAgLy8gd2UgZG9uJ3QgbmVlZCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIHByb3RvY29sIGFueSBtb3JlLCBzby4uLgorICBwcm90b2NvbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VE11bHRpcGxleGVkUHJvdG9jb2w+KHByb3RvY29sLCAiVGhyaWZ0VGVzdCIpOworICB9CisKKyAgLy8gQ29ubmVjdGlvbiBpbmZvCisgIGNvdXQgPDwgIkNvbm5lY3RpbmcgKCIgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUgPDwgIikgdG86ICI7CisgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICBjb3V0IDw8ICdAJzsKKyAgfQorICBjb3V0IDw8IGRvbWFpbl9zb2NrZXQ7CisgIGlmIChwb3J0ICE9IDApIHsKKyAgICBjb3V0IDw8IGhvc3QgPDwgIjoiIDw8IHBvcnQ7CisgIH0KKyAgY291dCA8PCBlbmRsOworCisgIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJldmh0dHAiKSA9PSAwKSB7CisgICAgZXZlbnRfYmFzZSogYmFzZSA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgICAgY291dCA8PCAiTGliZXZlbnQgVmVyc2lvbjogIiA8PCBldmVudF9nZXRfdmVyc2lvbigpIDw8IGVuZGw7CisgICAgY291dCA8PCAiTGliZXZlbnQgTWV0aG9kOiAiIDw8IGV2ZW50X2Jhc2VfZ2V0X21ldGhvZChiYXNlKSA8PCBlbmRsOworI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID49IDB4MDIwMDAwMDAKKyAgICBjb3V0IDw8ICJMaWJldmVudCBGZWF0dXJlczogMHgiIDw8IGhleCA8PCBldmVudF9iYXNlX2dldF9mZWF0dXJlcyhiYXNlKSA8PCBlbmRsOworI2VuZGlmCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwoCisgICAgICAgIG5ldyBURXZodHRwQ2xpZW50Q2hhbm5lbChob3N0LmNfc3RyKCksICIvIiwgaG9zdC5jX3N0cigpLCBwb3J0LCBiYXNlKSk7CisgICAgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50ID0gbmV3IFRocmlmdFRlc3RDb2JDbGllbnQoY2hhbm5lbCwgcHJvdG9jb2xGYWN0b3J5LmdldCgpKTsKKyAgICBjbGllbnQtPnRlc3RWb2lkKHN0ZDo6YmluZCh0ZXN0Vm9pZF9jbGllbnRSZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworCisgICAgZXZlbnRfYmFzZV9sb29wKGJhc2UsIDApOworICAgIHJldHVybiAwOworICB9CisKICAgVGhyaWZ0VGVzdENsaWVudCB0ZXN0Q2xpZW50KHByb3RvY29sKTsKIAogICB1aW50NjRfdCB0aW1lX21pbiA9IDA7CkBAIC05OSwxNSArMzU3LDE1IEBACiAKICAgICB0cnkgewogICAgICAgdHJhbnNwb3J0LT5vcGVuKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBwcmludGYoIkNvbm5lY3QgZmFpbGVkOiAlc1xuIiwgdHR4LndoYXQoKSk7Ci0gICAgICBjb250aW51ZTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiQ29ubmVjdCBmYWlsZWQ6ICIgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm4gRVJSX1VOS05PV047CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ09OTkVDVCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJUZXN0ICMlZCwgY29ubmVjdCAlczolZFxuIiwgdGVzdCsxLCBob3N0LmNfc3RyKCksIHBvcnQpOworICAgIHByaW50ZigiVGVzdCAjJWQsIGNvbm5lY3QgJXM6JWRcbiIsIHRlc3QgKyAxLCBob3N0LmNfc3RyKCksIHBvcnQpOwogCiAgICAgdWludDY0X3Qgc3RhcnQgPSBub3coKTsKIApAQCAtMTE1LDUzICszNzMsMjI1IEBACiAgICAgICogVk9JRCBURVNUCiAgICAgICovCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdFZvaWQoKSIpOworICAgICAgY291dCA8PCAidGVzdFZvaWQoKSIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RWb2lkKCk7Ci0gICAgICBwcmludGYoIiA9IHZvaWRcbiIpOwotICAgIH0gY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0YXgpIHsKLSAgICAgIHByaW50ZigiJXNcbiIsIHRheC53aGF0KCkpOworICAgICAgY291dCA8PCAiID0gdm9pZCIgPDwgZW5kbDsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgLy8gU3RvcCBoZXJlIGlmIHRyYW5zcG9ydCBnb3QgYnJva2VuCisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU1RSSU5HIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgY291dCA8PCAidGVzdFN0cmluZyhcIlRlc3RcIikiIDw8IGZsdXNoOwogICAgIHN0cmluZyBzOwogICAgIHRlc3RDbGllbnQudGVzdFN0cmluZyhzLCAiVGVzdCIpOwotICAgIHByaW50ZigiID0gXCIlc1wiXG4iLCBzLmNfc3RyKCkpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcyA8PCBlbmRsOworICAgIGlmIChzICE9ICJUZXN0IikgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgIH0KKworICAgIC8vCisgICAgLy8gTXVsdGlwbGV4ZWQgcHJvdG9jb2wgLSBjYWxsIGFub3RoZXIgc2VydmljZSBtZXRob2QKKyAgICAvLyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBUaHJpZnRUZXN0CisgICAgLy8KKyAgICBpZiAoYm9vc3Q6OnN0YXJ0c193aXRoKHByb3RvY29sX3R5cGUsICJtdWx0aSIpKSB7CisgICAgU2Vjb25kU2VydmljZUNsaWVudCBzc2MocHJvdG9jb2wyKTsKKyAgICAvLyB0cmFuc3BvcnQgaXMgYWxyZWFkeSBvcGVuLi4uCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBjb3V0IDw8ICJzZWNvbmRTZXJ2aWNlLnNlY29uZFRlc3RTdHJpbmcoXCJmb29cIikgPT4gIiA8PCBmbHVzaDsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgICAgc3NjLnNlY29uZHRlc3RTdHJpbmcocmVzdWx0LCAiZm9vIik7CisgICAgICBjb3V0IDw8ICJ7IiA8PCByZXN1bHQgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICAgICAgY291dCA8PCAiICAqKiogRkFJTEVEICoqKiAiIDw8IGUud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICB9CisgICAgfQorCisgICAgdHJ5IHsKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ1NjYgKQorI2VuZGlmCisgICAgICBzdHJpbmcgc3RyKAorICAgICAgICAgICJ9e0FmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiCisgICAgICAgICAgIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiCisgICAgICAgICAgItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIgorICAgICAgICAgICLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIKKyAgICAgICAgICAiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiCisgICAgICAgICAgIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIgorICAgICAgICAgICJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIKKyAgICAgICAgICAiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiCisgICAgICAgICAgIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIKKyAgICAgICAgICAiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIgorICAgICAgICAgICJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIKKyAgICAgICAgICAi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiCisgICAgICAgICAgIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIgorICAgICAgICAgICJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiCisgICAgICAgICAgIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiCisgICAgICAgICAgIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIKKyAgICAgICAgICAiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiCisgICAgICAgICAgIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiCisgICAgICAgICAgIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiCisgICAgICAgICAgItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIgorICAgICAgICAgICJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIKKyAgICAgICAgICAiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiCisgICAgICAgICAgIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIKKyAgICAgICAgICAiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIgorICAgICAgICAgICJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iKTsKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorI2VuZGlmCisgICAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nKCIgPDwgc3RyIDw8ICIpID0gIiA8PCBmbHVzaDsKKyAgICAgIHRlc3RDbGllbnQudGVzdFN0cmluZyhzLCBzdHIpOworICAgICAgY291dCA8PCBzIDw8IGVuZGw7CisgICAgICBpZiAocyAhPSBzdHIpIHsKKyAgICAgICAgY291dC5pbWJ1ZShsb2NhbGUoImVuX1VTLlVURjgiKSk7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8ICJFeHBlY3RlZCBzdHJpbmc6ICIgPDwgc3RyIDw8ICIgYnV0IGdvdDogIiA8PCBzIDw8IGVuZGwgPDwgIkNMRUFSIjsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgcmV0dXJuIHJldHVybl9jb2RlOworICAgIH0KKyAgICB0cnkgeworICAgICAgc3RyaW5nIHN0cigKKyAgICAgICAgICAicXVvdGU6IFwiIGJhY2tzbGFzaDoiCisgICAgICAgICAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFwvICIKKyAgICAgICAgICAiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiCisgICAgICAgICAgIiBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcXC9cYlxuXHJcdCIKKyAgICAgICAgICAiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiCisgICAgICAgICAgIiBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSBcIl1dIFxcXCIgfX19eyBbW1sgIik7CisgICAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nKCIgPDwgc3RyIDw8ICIpID0gIiA8PCBmbHVzaDsKKyAgICAgIHRlc3RDbGllbnQudGVzdFN0cmluZyhzLCBzdHIpOworICAgICAgY291dCA8PCBzIDw8IGVuZGw7CisgICAgICBpZiAocyAhPSBzdHIpIHsKKyAgICAgICAgY291dC5pbWJ1ZShsb2NhbGUoImVuX1VTLlVURjgiKSk7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkV4cGVjdGVkIHN0cmluZzogIiA8PCBzdHIgPDwgIiBidXQgZ290OiAiIDw8IHMgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJDTEVBUiI7CisgICAgICAgIDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgcmV0dXJuIHJldHVybl9jb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJPT0wgVEVTVAorICAgICAqLworICAgIGNvdXQgPDwgYm9vbGFscGhhOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJvb2wsIHRydWUpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJvb2wsIGZhbHNlKTsKIAogICAgIC8qKgogICAgICAqIEJZVEUgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEJ5dGUoMSkiKTsKLSAgICB1aW50OF90IHU4ID0gdGVzdENsaWVudC50ZXN0Qnl0ZSgxKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCAoaW50KXU4KTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KTApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpLTEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpNDIpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpLTQyKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KTEyNyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCktMTI4KTsKIAogICAgIC8qKgogICAgICAqIEkzMiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0STMyKC0xKSIpOwotICAgIGludDMyX3QgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCBpMzIpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAtMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAxOTAwMDAwMTMpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgLTE5MDAwMDAxMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSk7CiAKICAgICAvKioKICAgICAgKiBJNjQgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0gICAgaW50NjRfdCBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TEwpOwotICAgIHByaW50ZigiID0gJSJQUklkNjQiXG4iLCBpNjQpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCk3MDAwMDAwMDAwMDAwMDAwMTIzTEwpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLTcwMDAwMDAwMDAwMDAwMDAxMjNMTCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdClwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyTEwpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdClwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyTEwpLCAzMikgKyAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyTEwpLCAzMikgLSAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KSgpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKSgpKTsKIAogICAgIC8qKgogICAgICAqIERPVUJMRSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0RG91YmxlKC01LjIwOTg1MjMpIik7Ci0gICAgZG91YmxlIGR1YiA9IHRlc3RDbGllbnQudGVzdERvdWJsZSgtNS4yMDk4NTIzKTsKLSAgICBwcmludGYoIiA9ICVsZlxuIiwgZHViKTsKKyAgICAvLyBDb21wYXJpbmcgZG91YmxlIHZhbHVlcyB3aXRoIHBsYWluIGVxdWFsaXR5IGJlY2F1c2UgVGhyaWZ0IGhhbmRsZXMgZnVsbCBwcmVjaXNpb24gb2YgZG91YmxlCisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAwLjApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLTEuMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtNS4yMDk4NTIzKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikgKyAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCA1MykgLSAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpIC0gMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDUzKSArIDEpOworCisgICAgdHJ5IHsKKyAgICAgIGRvdWJsZSBleHBlY3RlZCA9IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgMzA3KTsKKyAgICAgIGNvdXQgPDwgInRlc3REb3VibGUoIiA8PCBleHBlY3RlZCA8PCAiKSA9ICIgPDwgZmx1c2g7CisgICAgICBkb3VibGUgYWN0dWFsID0gdGVzdENsaWVudC50ZXN0RG91YmxlKGV4cGVjdGVkKTsKKyAgICAgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIGlmIChleHBlY3RlZCAtIGFjdHVhbCA+IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgMjkyKSkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgZG91YmxlIGV4cGVjdGVkID0gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAtMjkyKTsKKyAgICAgIGNvdXQgPDwgInRlc3REb3VibGUoIiA8PCBleHBlY3RlZCA8PCAiKSA9ICIgPDwgZmx1c2g7CisgICAgICBkb3VibGUgYWN0dWFsID0gdGVzdENsaWVudC50ZXN0RG91YmxlKGV4cGVjdGVkKTsKKyAgICAgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIGlmIChleHBlY3RlZCAtIGFjdHVhbCA+IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgLTMwNykpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBidXQgZ290OiAiIDw8IGFjdHVhbCA8PCBlbmRsOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQklOQVJZIFRFU1QKKyAgICAgKi8KKyAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgMTMxMDczICYmICFyZXR1cm5fY29kZTsgKSB7CisgICAgICByZXR1cm5fY29kZSB8PSBiaW5hcnlfdGVzdCh0ZXN0Q2xpZW50LCBpKTsKKyAgICAgIGlmIChpID4gMCkgeyBpICo9IDI7IH0gZWxzZSB7ICsraTsgfQorICAgIH0KKwogCiAgICAgLyoqCiAgICAgICogU1RSVUNUIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOworICAgIGNvdXQgPDwgInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIgPDwgZmx1c2g7CiAgICAgWHRydWN0IG91dDsKICAgICBvdXQuc3RyaW5nX3RoaW5nID0gIlplcm8iOwogICAgIG91dC5ieXRlX3RoaW5nID0gMTsKQEAgLTE2OSwxNiArNTk5LDIwIEBACiAgICAgb3V0Lmk2NF90aGluZyA9IC01OwogICAgIFh0cnVjdCBpbjsKICAgICB0ZXN0Q2xpZW50LnRlc3RTdHJ1Y3QoaW4sIG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7XCIlc1wiLCAlZCwgJWQsICUiUFJJZDY0In1cbiIsCisgICAgcHJpbnRmKCIgPSB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifVxuIiwKICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nLmNfc3RyKCksCiAgICAgICAgICAgIChpbnQpaW4uYnl0ZV90aGluZywKICAgICAgICAgICAgaW4uaTMyX3RoaW5nLAogICAgICAgICAgICBpbi5pNjRfdGhpbmcpOworICAgIGlmIChpbiAhPSBvdXQpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogTkVTVEVEIFNUUlVDVCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9KSwgNX0iKTsKKyAgICBjb3V0IDw8ICJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9KSwgNX0iIDw8IGZsdXNoOwogICAgIFh0cnVjdDIgb3V0MjsKICAgICBvdXQyLmJ5dGVfdGhpbmcgPSAxOwogICAgIG91dDIuc3RydWN0X3RoaW5nID0gb3V0OwpAQCAtMTg2LDQ2ICs2MjAsODUgQEAKICAgICBYdHJ1Y3QyIGluMjsKICAgICB0ZXN0Q2xpZW50LnRlc3ROZXN0KGluMiwgb3V0Mik7CiAgICAgaW4gPSBpbjIuc3RydWN0X3RoaW5nOwotICAgIHByaW50ZigiID0geyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiUFJJZDY0In0sICVkfVxuIiwKKyAgICBwcmludGYoIiA9IHslZCwge1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICVkfVxuIiwKICAgICAgICAgICAgaW4yLmJ5dGVfdGhpbmcsCiAgICAgICAgICAgIGluLnN0cmluZ190aGluZy5jX3N0cigpLAogICAgICAgICAgICAoaW50KWluLmJ5dGVfdGhpbmcsCiAgICAgICAgICAgIGluLmkzMl90aGluZywKICAgICAgICAgICAgaW4uaTY0X3RoaW5nLAogICAgICAgICAgICBpbjIuaTMyX3RoaW5nKTsKKyAgICBpZiAoaW4yICE9IG91dDIpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogTUFQIFRFU1QKICAgICAgKi8KLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBtYXBvdXQ7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IG1hcG91dDsKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyArK2kpIHsKLSAgICAgIG1hcG91dC5pbnNlcnQobWFrZV9wYWlyKGksIGktMTApKTsKKyAgICAgIG1hcG91dC5pbnNlcnQobWFrZV9wYWlyKGksIGkgLSAxMCkpOwogICAgIH0KLSAgICBwcmludGYoInRlc3RNYXAoeyIpOworICAgIGNvdXQgPDwgInRlc3RNYXAoeyIgPDwgZmx1c2g7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSBtYXBvdXQuYmVnaW4oKTsgbV9pdGVyICE9IG1hcG91dC5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQgPT4gJWQiLCBtX2l0ZXItPmZpcnN0LCBtX2l0ZXItPnNlY29uZCk7CisgICAgICBjb3V0IDw8IG1faXRlci0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1faXRlci0+c2Vjb25kOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7Ci0gICAgbWFwPGludDMyX3QsaW50MzJfdD4gbWFwaW47CisgICAgY291dCA8PCAifSkiOworICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBtYXBpbjsKICAgICB0ZXN0Q2xpZW50LnRlc3RNYXAobWFwaW4sIG1hcG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobV9pdGVyID0gbWFwaW4uYmVnaW4oKTsgbV9pdGVyICE9IG1hcGluLmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCA9PiAlZCIsIG1faXRlci0+Zmlyc3QsIG1faXRlci0+c2Vjb25kKTsKKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAobWFwaW4gIT0gbWFwb3V0KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNUUklORyBNQVAgVEVTVAorICAgICAqLworICAgIGNvdXQgPDwgInRlc3RTdHJpbmdNYXAoe2EgPT4gMiwgYiA9PiBibGFoLCBzb21lID0+IHRoaW5nfSkgPSB7IiA8PCBmbHVzaDsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHNtYXBpbjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHNtYXBvdXQ7CisgICAgc21hcGluWyJhIl0gPSAiMiI7CisgICAgc21hcGluWyJiIl0gPSAiYmxhaCI7CisgICAgc21hcGluWyJzb21lIl0gPSAidGhpbmciOworICAgIHRyeSB7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RTdHJpbmdNYXAoc21hcG91dCwgc21hcGluKTsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzbWFwb3V0LmJlZ2luKCk7IGl0ICE9IHNtYXBvdXQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgIGNvdXQgPDwgIiwiOworICAgICAgICBlbHNlCisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgY291dCA8PCBpdC0+Zmlyc3QgPDwgIiA9PiAiIDw8IGl0LT5zZWNvbmQ7CisgICAgICB9CisgICAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgICAgaWYgKHNtYXBpbiAhPSBzbWFwb3V0KSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBTRVQgVEVTVApAQCAtMjM0LDIyMiArNzA3LDM2NyBAQAogICAgIGZvciAoaW50MzJfdCBpID0gLTI7IGkgPCAzOyArK2kpIHsKICAgICAgIHNldG91dC5pbnNlcnQoaSk7CiAgICAgfQotICAgIHByaW50ZigidGVzdFNldCh7Iik7CisgICAgY291dCA8PCAidGVzdFNldCh7IiA8PCBmbHVzaDsKICAgICBzZXQ8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKICAgICBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChzX2l0ZXIgPSBzZXRvdXQuYmVnaW4oKTsgc19pdGVyICE9IHNldG91dC5lbmQoKTsgKytzX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQiLCAqc19pdGVyKTsKKyAgICAgIGNvdXQgPDwgKnNfaXRlcjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9KSIpOworICAgIGNvdXQgPDwgIn0pIjsKICAgICBzZXQ8aW50MzJfdD4gc2V0aW47CiAgICAgdGVzdENsaWVudC50ZXN0U2V0KHNldGluLCBzZXRvdXQpOwotICAgIHByaW50ZigiID0geyIpOworICAgIGNvdXQgPDwgIiA9IHsiOwogICAgIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKHNfaXRlciA9IHNldGluLmJlZ2luKCk7IHNfaXRlciAhPSBzZXRpbi5lbmQoKTsgKytzX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQiLCAqc19pdGVyKTsKKyAgICAgIGNvdXQgPDwgKnNfaXRlcjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChzZXRpbiAhPSBzZXRvdXQpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogTElTVCBURVNUCiAgICAgICovCi0gICAgdmVjdG9yPGludDMyX3Q+IGxpc3RvdXQ7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAtMjsgaSA8IDM7ICsraSkgewotICAgICAgbGlzdG91dC5wdXNoX2JhY2soaSk7Ci0gICAgfQotICAgIHByaW50ZigidGVzdExpc3QoeyIpOwotICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOwotICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGxfaXRlciA9IGxpc3RvdXQuYmVnaW4oKTsgbF9pdGVyICE9IGxpc3RvdXQuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0TGlzdChlbXB0eSkiIDw8IGZsdXNoOworICAgIHRyeSB7CisgICAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdG91dDsKKyAgICAgIHRlc3RDbGllbnQudGVzdExpc3QobGlzdG91dCwgdmVjdG9yPGludDMyX3Q+KCkpOworICAgICAgaWYgKCFsaXN0b3V0LmVtcHR5KCkpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIGNvdXQgPDwgImludmFsaWQgbGVuZ3RoOiAiIDw8IGxpc3RvdXQuc2l6ZSgpIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7Ci0gICAgdmVjdG9yPGludDMyX3Q+IGxpc3RpbjsKLSAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RpbiwgbGlzdG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobF9pdGVyID0gbGlzdGluLmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0aW4uZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICB0cnkgeworICAgICAgdmVjdG9yPGludDMyX3Q+IGxpc3RvdXQ7CisgICAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGxpc3RvdXQucHVzaF9iYWNrKGkpOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOworICAgICAgY291dCA8PCAidGVzdExpc3QoeyIgPDwgZmx1c2g7CisgICAgICB2ZWN0b3I8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGxfaXRlcjsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAobF9pdGVyID0gbGlzdG91dC5iZWdpbigpOyBsX2l0ZXIgIT0gbGlzdG91dC5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb3V0IDw8ICIsIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICpsX2l0ZXI7CisgICAgICB9CisgICAgICBjb3V0IDw8ICJ9KSI7CisgICAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdGluOworICAgICAgdGVzdENsaWVudC50ZXN0TGlzdChsaXN0aW4sIGxpc3RvdXQpOworICAgICAgY291dCA8PCAiID0geyI7CisgICAgICBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGxfaXRlciA9IGxpc3Rpbi5iZWdpbigpOyBsX2l0ZXIgIT0gbGlzdGluLmVuZCgpOyArK2xfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvdXQgPDwgIiwiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgKmxfaXRlcjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpZiAobGlzdGluICE9IGxpc3RvdXQpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOwogICAgIH0KLSAgICBwcmludGYoIn1cbiIpOwogCiAgICAgLyoqCiAgICAgICogRU5VTSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShPTkUpIik7Ci0gICAgTnVtYmVyeiByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE9ORSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShPTkUpIiA8PCBmbHVzaDsKKyAgICBOdW1iZXJ6Ojp0eXBlIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6T05FKTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOworICAgIGlmIChyZXQgIT0gTnVtYmVyejo6T05FKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oVFdPKSIpOwotICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oVFdPKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKFRXTykiIDw8IGZsdXNoOworICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6VFdPKTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOworICAgIGlmIChyZXQgIT0gTnVtYmVyejo6VFdPKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oVEhSRUUpIik7Ci0gICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShUSFJFRSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShUSFJFRSkiIDw8IGZsdXNoOworICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6VEhSRUUpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CisgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpUSFJFRSkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKLSAgICBwcmludGYoInRlc3RFbnVtKEZJVkUpIik7Ci0gICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShGSVZFKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKEZJVkUpIiA8PCBmbHVzaDsKKyAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6OkZJVkUpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CisgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpGSVZFKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oRUlHSFQpIik7Ci0gICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShFSUdIVCk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShFSUdIVCkiIDw8IGZsdXNoOworICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6RUlHSFQpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CisgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpFSUdIVCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBUWVBFREVGIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIiA8PCBmbHVzaDsKICAgICBVc2VySWQgdWlkID0gdGVzdENsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjNMTCk7Ci0gICAgcHJpbnRmKCIgPSAlIlBSSWQ2NCJcbiIsIHVpZCk7CisgICAgY291dCA8PCAiID0gIiA8PCB1aWQgPDwgZW5kbDsKKyAgICBpZiAodWlkICE9IDMwOTg1ODIzNTA4MjUyM0xMKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIE5FU1RFRCBNQVAgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdE1hcE1hcCgxKSIpOworICAgIGNvdXQgPDwgInRlc3RNYXBNYXAoMSkiIDw8IGZsdXNoOwogICAgIG1hcDxpbnQzMl90LCBtYXA8aW50MzJfdCwgaW50MzJfdD4gPiBtbTsKICAgICB0ZXN0Q2xpZW50LnRlc3RNYXBNYXAobW0sIDEpOwotICAgIHByaW50ZigiID0geyIpOworICAgIGNvdXQgPDwgIiA9IHsiOwogICAgIG1hcDxpbnQzMl90LCBtYXA8aW50MzJfdCwgaW50MzJfdD4gPjo6Y29uc3RfaXRlcmF0b3IgbWk7CiAgICAgZm9yIChtaSA9IG1tLmJlZ2luKCk7IG1pICE9IG1tLmVuZCgpOyArK21pKSB7CiAgICAgICBwcmludGYoIiVkID0+IHsiLCBtaS0+Zmlyc3QpOwogICAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtaTI7CiAgICAgICBmb3IgKG1pMiA9IG1pLT5zZWNvbmQuYmVnaW4oKTsgbWkyICE9IG1pLT5zZWNvbmQuZW5kKCk7ICsrbWkyKSB7Ci0gICAgICAgIHByaW50ZigiJWQgPT4gJWQsICIsIG1pMi0+Zmlyc3QsIG1pMi0+c2Vjb25kKTsKKyAgICAgICAgY291dCA8PCBtaTItPmZpcnN0IDw8ICIgPT4gIiA8PCBtaTItPnNlY29uZDsKICAgICAgIH0KLSAgICAgIHByaW50ZigifSwgIik7CisgICAgICBjb3V0IDw8ICJ9LCAiOwogICAgIH0KLSAgICBwcmludGYoIn1cbiIpOworICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKG1tLnNpemUoKSAhPSAyIHx8CisgICAgICAgIG1tWy00XVstNF0gIT0gLTQgfHwKKyAgICAgICAgbW1bLTRdWy0zXSAhPSAtMyB8fAorICAgICAgICBtbVstNF1bLTJdICE9IC0yIHx8CisgICAgICAgIG1tWy00XVstMV0gIT0gLTEgfHwKKyAgICAgICAgbW1bNF1bNF0gIT0gNCB8fAorICAgICAgICBtbVs0XVszXSAhPSAzIHx8CisgICAgICAgIG1tWzRdWzJdICE9IDIgfHwKKyAgICAgICAgbW1bNF1bMV0gIT0gMSkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBJTlNBTklUWSBURVNUCiAgICAgICovCi0gICAgSW5zYW5pdHkgaW5zYW5lOwotICAgIGluc2FuZS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoRklWRSwgNTAwMCkpOwotICAgIFh0cnVjdCB0cnVjazsKLSAgICB0cnVjay5zdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOwotICAgIHRydWNrLmJ5dGVfdGhpbmcgPSA4OwotICAgIHRydWNrLmkzMl90aGluZyA9IDg7Ci0gICAgdHJ1Y2suaTY0X3RoaW5nID0gODsKLSAgICBpbnNhbmUueHRydWN0cy5wdXNoX2JhY2sodHJ1Y2spOwotICAgIHByaW50ZigidGVzdEluc2FuaXR5KCkiKTsKLSAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4gPiB3aG9hOwotICAgIHRlc3RDbGllbnQudGVzdEluc2FuaXR5KHdob2EsIGluc2FuZSk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7Ci0gICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKLSAgICBmb3IgKGlfaXRlciA9IHdob2EuYmVnaW4oKTsgaV9pdGVyICE9IHdob2EuZW5kKCk7ICsraV9pdGVyKSB7Ci0gICAgICBwcmludGYoIiUiUFJJZDY0IiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7Ci0gICAgICBtYXA8TnVtYmVyeixJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7Ci0gICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOwotICAgICAgICAgICBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOwotICAgICAgICAgICArK2kyX2l0ZXIpIHsKLSAgICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgaTJfaXRlci0+Zmlyc3QpOwotICAgICAgICBtYXA8TnVtYmVyeiwgVXNlcklkPiB1c2VyTWFwID0gaTJfaXRlci0+c2Vjb25kLnVzZXJNYXA7Ci0gICAgICAgIG1hcDxOdW1iZXJ6LCBVc2VySWQ+Ojpjb25zdF9pdGVyYXRvciB1bTsKLSAgICAgICAgcHJpbnRmKCJ7Iik7Ci0gICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKLSAgICAgICAgICBwcmludGYoIiVkID0+ICUiUFJJZDY0IiwgIiwgdW0tPmZpcnN0LCB1bS0+c2Vjb25kKTsKLSAgICAgICAgfQotICAgICAgICBwcmludGYoIn0sICIpOworICAgIGlmICghbm9pbnNhbmUpIHsKKyAgICAgIEluc2FuaXR5IGluc2FuZTsKKyAgICAgIGluc2FuZS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RklWRSwgNSkpOworICAgICAgaW5zYW5lLnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpFSUdIVCwgOCkpOworICAgICAgWHRydWN0IHRydWNrOworICAgICAgdHJ1Y2suc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKKyAgICAgIHRydWNrLmJ5dGVfdGhpbmcgPSA0OworICAgICAgdHJ1Y2suaTMyX3RoaW5nID0gNDsKKyAgICAgIHRydWNrLmk2NF90aGluZyA9IDQ7CisgICAgICBYdHJ1Y3QgdHJ1Y2syOworICAgICAgdHJ1Y2syLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgdHJ1Y2syLmJ5dGVfdGhpbmcgPSAyOworICAgICAgdHJ1Y2syLmkzMl90aGluZyA9IDI7CisgICAgICB0cnVjazIuaTY0X3RoaW5nID0gMjsKKyAgICAgIGluc2FuZS54dHJ1Y3RzLnB1c2hfYmFjayh0cnVjayk7CisgICAgICBpbnNhbmUueHRydWN0cy5wdXNoX2JhY2sodHJ1Y2syKTsKKyAgICAgIGNvdXQgPDwgInRlc3RJbnNhbml0eSgpIiA8PCBmbHVzaDsKKyAgICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiB3aG9hOworICAgICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkod2hvYSwgaW5zYW5lKTsKKyAgICAgIGNvdXQgPDwgIiA9IHsiOworICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgICAgICBmb3IgKGlfaXRlciA9IHdob2EuYmVnaW4oKTsgaV9pdGVyICE9IHdob2EuZW5kKCk7ICsraV9pdGVyKSB7CisgICAgICAgIHByaW50ZigiJSIgUFJJZDY0ICIgPT4geyIsIGlfaXRlci0+Zmlyc3QpOworICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpMl9pdGVyOworICAgICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOyBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOyArK2kyX2l0ZXIpIHsKKyAgICAgICAgICBwcmludGYoIiVkID0+IHsiLCBpMl9pdGVyLT5maXJzdCk7CisgICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD4gdXNlck1hcCA9IGkyX2l0ZXItPnNlY29uZC51c2VyTWFwOworICAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+Ojpjb25zdF9pdGVyYXRvciB1bTsKKyAgICAgICAgICBjb3V0IDw8ICJ7IjsKKyAgICAgICAgICBmb3IgKHVtID0gdXNlck1hcC5iZWdpbigpOyB1bSAhPSB1c2VyTWFwLmVuZCgpOyArK3VtKSB7CisgICAgICAgICAgICBjb3V0IDw8IHVtLT5maXJzdCA8PCAiID0+ICIgPDwgdW0tPnNlY29uZDsKKyAgICAgICAgICB9CisgICAgICAgICAgY291dCA8PCAifSwgIjsKIAotICAgICAgICB2ZWN0b3I8WHRydWN0PiB4dHJ1Y3RzID0gaTJfaXRlci0+c2Vjb25kLnh0cnVjdHM7Ci0gICAgICAgIHZlY3RvcjxYdHJ1Y3Q+Ojpjb25zdF9pdGVyYXRvciB4OwotICAgICAgICBwcmludGYoInsiKTsKLSAgICAgICAgZm9yICh4ID0geHRydWN0cy5iZWdpbigpOyB4ICE9IHh0cnVjdHMuZW5kKCk7ICsreCkgewotICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlIlBSSWQ2NCJ9LCAiLAotICAgICAgICAgICAgICAgICB4LT5zdHJpbmdfdGhpbmcuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgKGludCl4LT5ieXRlX3RoaW5nLAotICAgICAgICAgICAgICAgICB4LT5pMzJfdGhpbmcsCi0gICAgICAgICAgICAgICAgIHgtPmk2NF90aGluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJ9Iik7CisgICAgICAgICAgdmVjdG9yPFh0cnVjdD4geHRydWN0cyA9IGkyX2l0ZXItPnNlY29uZC54dHJ1Y3RzOworICAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+Ojpjb25zdF9pdGVyYXRvciB4OworICAgICAgICAgIGNvdXQgPDwgInsiOworICAgICAgICAgIGZvciAoeCA9IHh0cnVjdHMuYmVnaW4oKTsgeCAhPSB4dHJ1Y3RzLmVuZCgpOyArK3gpIHsKKyAgICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICIsCisgICAgICAgICAgICAgICAgICAgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgKGludCl4LT5ieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgIHgtPmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICB4LT5pNjRfdGhpbmcpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb3V0IDw8ICJ9IjsKIAotICAgICAgICBwcmludGYoIn0sICIpOworICAgICAgICAgIGNvdXQgPDwgIn0sICI7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCAifSwgIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigifSwgIik7CisgICAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaXQxID0gd2hvYS5maW5kKFVzZXJJZCgxKSk7CisgICAgICBpZiAod2hvYS5zaXplKCkgIT0gMikgeworICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKGl0MSA9PSB3aG9hLmVuZCgpKSB7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpdDEyID0gaXQxLT5zZWNvbmQuZmluZChOdW1iZXJ6OjpUV08pOworICAgICAgICBpZiAoaXQxMiA9PSBpdDEtPnNlY29uZC5lbmQoKSB8fCBpdDEyLT5zZWNvbmQgIT0gaW5zYW5lKSB7CisgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpdDEzID0gaXQxLT5zZWNvbmQuZmluZChOdW1iZXJ6OjpUSFJFRSk7CisgICAgICAgIGlmIChpdDEzID09IGl0MS0+c2Vjb25kLmVuZCgpIHx8IGl0MTMtPnNlY29uZCAhPSBpbnNhbmUpIHsKKyAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGl0MiA9IHdob2EuZmluZChVc2VySWQoMikpOworICAgICAgaWYgKGl0MiA9PSB3aG9hLmVuZCgpKSB7CisgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpdDI2ID0gaXQyLT5zZWNvbmQuZmluZChOdW1iZXJ6OjpTSVgpOworICAgICAgICBpZiAoaXQyNiA9PSBpdDItPnNlY29uZC5lbmQoKSB8fCBpdDI2LT5zZWNvbmQgIT0gSW5zYW5pdHkoKSkgeworICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgfQogICAgIH0KLSAgICBwcmludGYoIn1cbiIpOworCisgICAgLyoqCisgICAgICogTVVMVEkgVEVTVAorICAgICAqLworICAgIGNvdXQgPDwgInRlc3RNdWx0aSgpIiA8PCBlbmRsOworICAgIHRyeSB7CisgICAgICBtYXA8aW50MTZfdCwgc3RyaW5nPiBtdWxfbWFwOworICAgICAgWHRydWN0IG11bF9yZXN1bHQ7CisgICAgICBtdWxfbWFwWzFdID0gImJsYWgiOworICAgICAgbXVsX21hcFsyXSA9ICJ0aGluZyI7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aShtdWxfcmVzdWx0LCA0MiwgNDI0MiwgNDI0MjQyLCBtdWxfbWFwLCBOdW1iZXJ6OjpFSUdIVCwgVXNlcklkKDI0KSk7CisgICAgICBYdHJ1Y3QgeHhzOworICAgICAgeHhzLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgeHhzLmJ5dGVfdGhpbmcgPSA0MjsKKyAgICAgIHh4cy5pMzJfdGhpbmcgPSA0MjQyOworICAgICAgeHhzLmk2NF90aGluZyA9IDQyNDI0MjsKKyAgICAgIGlmIChtdWxfcmVzdWx0ICE9IHh4cykgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCiAgICAgLyogdGVzdCBleGNlcHRpb24gKi8KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSA9PiIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7Ci0gICAgICBwcmludGYoIiAgdm9pZFxuRkFJTFVSRVxuIik7CisgICAgICBjb3V0IDw8ICIgIHZvaWRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAKLSAgICB9IGNhdGNoKFhjZXB0aW9uJiBlKSB7CisgICAgfSBjYXRjaCAoWGNlcHRpb24mIGUpIHsKICAgICAgIHByaW50ZigiICB7JXUsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UuY19zdHIoKSk7CiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIgPDwgZmx1c2g7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKKyAgICAgIGNvdXQgPDwgIiAgdm9pZFxuKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKworICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24mKSB7CisgICAgICBjb3V0IDw8ICIgIENhdWdodCBURXhjZXB0aW9uIiA8PCBlbmRsOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJzdWNjZXNzXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigic3VjY2VzcyIpOwotICAgICAgcHJpbnRmKCIgIHZvaWRcbiIpOwotICAgIH0gY2F0Y2goLi4uKSB7Ci0gICAgICBwcmludGYoIiAgZXhjZXB0aW9uXG5GQUlMVVJFXG4iKTsKKyAgICAgIGNvdXQgPDwgIiAgdm9pZCIgPDwgZW5kbDsKKyAgICB9IGNhdGNoIChleGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICB9CiAKICAgICAvKiB0ZXN0IG11bHRpIGV4Y2VwdGlvbiAqLwogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIgPDwgZmx1c2g7CiAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24ocmVzdWx0LCAiWGNlcHRpb24iLCAidGVzdCAxIik7Ci0gICAgICBwcmludGYoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKLSAgICB9IGNhdGNoKFhjZXB0aW9uJiBlKSB7CisgICAgICBjb3V0IDw8ICIgIHJlc3VsdFxuKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKKyAgICB9IGNhdGNoIChYY2VwdGlvbiYgZSkgewogICAgICAgcHJpbnRmKCIgIHsldSwgXCIlc1wifVxuIiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZS5jX3N0cigpKTsKICAgICB9CiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgXCJ0ZXN0IDJcIikgPT4iIDw8IGZsdXNoOwogICAgICAgWHRydWN0IHJlc3VsdDsKICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKHJlc3VsdCwgIlhjZXB0aW9uMiIsICJ0ZXN0IDIiKTsKLSAgICAgIHByaW50ZigiICByZXN1bHRcbkZBSUxVUkVcbiIpOworICAgICAgY291dCA8PCAiICByZXN1bHRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAKLSAgICB9IGNhdGNoKFhjZXB0aW9uMiYgZSkgeworICAgIH0gY2F0Y2ggKFhjZXB0aW9uMiYgZSkgewogICAgICAgcHJpbnRmKCIgIHsldSwge1wiJXNcIn19XG4iLCBlLmVycm9yQ29kZSwgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIFh0cnVjdCByZXN1bHQ7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihyZXN1bHQsICJzdWNjZXNzIiwgInRlc3QgMyIpOwogICAgICAgcHJpbnRmKCIgIHt7XCIlc1wifX1cbiIsIHJlc3VsdC5zdHJpbmdfdGhpbmcuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCguLi4pIHsKLSAgICAgIHByaW50ZigiICBleGNlcHRpb25cbkZBSUxVUkVcbiIpOworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgIH0KIAogICAgIC8qIHRlc3Qgb25ld2F5IHZvaWQgKi8KICAgICB7Ci0gICAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0T25ld2F5KDMpID0+Iik7Ci0gICAgICAgIHVpbnQ2NF90IHN0YXJ0T25ld2F5ID0gbm93KCk7Ci0gICAgICAgIHRlc3RDbGllbnQudGVzdE9uZXdheSgzKTsKLSAgICAgICAgdWludDY0X3QgZWxhcHNlZCA9IG5vdygpIC0gc3RhcnRPbmV3YXk7Ci0gICAgICAgIGlmIChlbGFwc2VkID4gMjAwICogMTAwMCkgeyAvLyAwLjIgc2Vjb25kcwotICAgICAgICAgICAgcHJpbnRmKCIgIEZBSUxVUkUgLSB0b29rICUuMmYgbXNcbiIsIChkb3VibGUpZWxhcHNlZC8xMDAwLjApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRmKCIgIHN1Y2Nlc3MgLSB0b29rICUuMmYgbXNcbiIsIChkb3VibGUpZWxhcHNlZC8xMDAwLjApOwotICAgICAgICB9CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSkgPT4iIDw8IGZsdXNoOworICAgICAgdWludDY0X3Qgc3RhcnRPbmV3YXkgPSBub3coKTsKKyAgICAgIHRlc3RDbGllbnQudGVzdE9uZXdheSgxKTsKKyAgICAgIHVpbnQ2NF90IGVsYXBzZWQgPSBub3coKSAtIHN0YXJ0T25ld2F5OworICAgICAgaWYgKGVsYXBzZWQgPiAyMDAgKiAxMDAwKSB7IC8vIDAuMiBzZWNvbmRzCisgICAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKiogLSB0b29rICUuMmYgbXNcbiIsIChkb3VibGUpZWxhcHNlZCAvIDEwMDAuMCk7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIgIHN1Y2Nlc3MgLSB0b29rICUuMmYgbXNcbiIsIChkb3VibGUpZWxhcHNlZCAvIDEwMDAuMCk7CisgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC00NjMsMTUgKzEwODEsMTggQEAKICAgICAvKioKICAgICAgKiBJMzIgVEVTVAogICAgICAqLwotICAgIHByaW50ZigicmUtdGVzdCB0ZXN0STMyKC0xKSIpOwotICAgIGkzMiA9IHRlc3RDbGllbnQudGVzdEkzMigtMSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgaTMyKTsKKyAgICBjb3V0IDw8ICJyZS10ZXN0IHRlc3RJMzIoLTEpIiA8PCBmbHVzaDsKKyAgICBpbnQgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IGkzMiA8PCBlbmRsOworICAgIGlmIChpMzIgIT0gLTEpCisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwogCisgICAgY291dCA8PCBlbmRsIDw8ICJBbGwgdGVzdHMgZG9uZS4iIDw8IGVuZGwgPDwgZmx1c2g7CiAKICAgICB1aW50NjRfdCBzdG9wID0gbm93KCk7Ci0gICAgdWludDY0X3QgdG90ID0gc3RvcC1zdGFydDsKKyAgICB1aW50NjRfdCB0b3QgPSBzdG9wIC0gc3RhcnQ7CiAKLSAgICBwcmludGYoIlRvdGFsIHRpbWU6ICUiUFJJdTY0IiB1c1xuIiwgc3RvcC1zdGFydCk7CisgICAgY291dCA8PCAiVG90YWwgdGltZTogIiA8PCBzdG9wIC0gc3RhcnQgPDwgIiB1cyIgPDwgZW5kbDsKIAogICAgIHRpbWVfdG90ICs9IHRvdDsKICAgICBpZiAodGltZV9taW4gPT0gMCB8fCB0b3QgPCB0aW1lX21pbikgewpAQCAtNDgxLDE3ICsxMTAyLDc5IEBACiAgICAgICB0aW1lX21heCA9IHRvdDsKICAgICB9CiAKKyAgICBjb3V0IDw8IGZsdXNoOwogICAgIHRyYW5zcG9ydC0+Y2xvc2UoKTsKICAgfQogCi0gIC8vICBwcmludGYoIlxuU29ja2V0IHN5c2NhbGxzOiAldSIsIGdfc29ja2V0X3N5c2NhbGxzKTsKLSAgcHJpbnRmKCJcbkFsbCB0ZXN0cyBkb25lLlxuIik7CiAKICAgdWludDY0X3QgdGltZV9hdmcgPSB0aW1lX3RvdCAvIG51bVRlc3RzOwogCi0gIHByaW50ZigiTWluIHRpbWU6ICUiUFJJdTY0IiB1c1xuIiwgdGltZV9taW4pOwotICBwcmludGYoIk1heCB0aW1lOiAlIlBSSXU2NCIgdXNcbiIsIHRpbWVfbWF4KTsKLSAgcHJpbnRmKCJBdmcgdGltZTogJSJQUkl1NjQiIHVzXG4iLCB0aW1lX2F2Zyk7CisgIGNvdXQgPDwgIk1pbiB0aW1lOiAiIDw8IHRpbWVfbWluIDw8ICIgdXMiIDw8IGVuZGw7CisgIGNvdXQgPDwgIk1heCB0aW1lOiAiIDw8IHRpbWVfbWF4IDw8ICIgdXMiIDw8IGVuZGw7CisgIGNvdXQgPDwgIkF2ZyB0aW1lOiAiIDw8IHRpbWVfYXZnIDw8ICIgdXMiIDw8IGVuZGw7CiAKLSAgcmV0dXJuIDA7CisgIHJldHVybiByZXR1cm5fY29kZTsKK30KKwordm9pZCBiaW5hcnlfZmlsbChzdGQ6OnN0cmluZyYgc3RyLCBzdHJpbmc6OnNpemVfdHlwZSBzaXopCit7CisgICAgc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIGJpbl9kYXRhWzI1Nl0KKyAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKKyAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAorICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCisgICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKKyAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAorICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCisgICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKKyAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCisgICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCisgICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAorICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKKyAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCisgICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAorICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKKyAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCisgICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKKyAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAorICAgICAgICAgICAxMjd9OworCisgICAgc3RyLnJlc2l6ZShzaXopOworICAgIGNoYXIgKnB0ciA9ICZzdHJbMF07CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKKyAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgc2l6OyArK2kpCisgICAgeworICAgICAgICBpZiAocG9zID09IDI1NSkgeyBwb3MgPSAwOyB9IGVsc2UgeyArK3BvczsgfQorICAgICAgICAqcHRyKysgPSBiaW5fZGF0YVtwb3NdOworICAgIH0KK30KKworaW50IGJpbmFyeV90ZXN0KFRocmlmdFRlc3RDbGllbnQmIHRlc3RDbGllbnQsIHN0cmluZzo6c2l6ZV90eXBlIHNpeikKK3sKKyAgICBzdHJpbmcgYmluX3JlcXVlc3Q7CisgICAgc3RyaW5nIGJpbl9yZXN1bHQ7CisKKyAgICBjb3V0IDw8ICJ0ZXN0QmluYXJ5KHNpeiA9ICIgPDwgc2l6IDw8ICIpIiA8PCBlbmRsOworICAgIGJpbmFyeV9maWxsKGJpbl9yZXF1ZXN0LCBzaXopOworICAgIHRyeSB7CisgICAgICAgIHRlc3RDbGllbnQudGVzdEJpbmFyeShiaW5fcmVzdWx0LCBiaW5fcmVxdWVzdCk7CisKKyAgICAgICAgaWYgKGJpbl9yZXF1ZXN0LnNpemUoKSAhPSBiaW5fcmVzdWx0LnNpemUoKSkgeworICAgICAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRDogcmVxdWVzdCBzaXplICIgPDwgYmluX3JlcXVlc3Quc2l6ZSgpIDw8ICI7IHJlc3VsdCBzaXplICIgPDwgYmluX3Jlc3VsdC5zaXplKCkgPDwgZW5kbDsKKyAgICAgICAgICAgIHJldHVybiBFUlJfQkFTRVRZUEVTOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IHNpejsgKytpKSB7CisgICAgICAgICAgICBpZiAoYmluX3JlcXVlc3QuYXQoaSkgIT0gYmluX3Jlc3VsdC5hdChpKSkgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQ6IGF0IHBvc2l0aW9uICIgPDwgaSA8PCAiIHJlcXVlc3RbaV0gaXMgaCIgPDwgaGV4IDw8IGJpbl9yZXF1ZXN0LmF0KGkpIDw8ICIgcmVzdWx0W2ldIGlzIGgiIDw8IGhleCA8PCBiaW5fcmVzdWx0LmF0KGkpIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgICByZXR1cm4gRVJSX0JBU0VUWVBFUzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcCBiL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcAppbmRleCA4MzQ1NGRjLi42MjIyMDE3IDEwMDY0NAotLS0gYS90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAKKysrIGIvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwCkBAIC0xNywyOCArMTcsNTkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgIlNlY29uZFNlcnZpY2UuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0LmgiCiAKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKworI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CkBAIC00NiwxOSArNzcsMzMgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKIAorLy8gdG8gaGFuZGxlIGEgY29udHJvbGxlZCBzaHV0ZG93biwgc2lnbmFsIGhhbmRsaW5nIGlzIG1hbmRhdG9yeQorI2lmZGVmIEhBVkVfU0lHTkFMX0gKK2FwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBnTW9uaXRvcjsKK3ZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ251bSkKK3sKKyAgaWYgKHNpZ251bSA9PSBTSUdJTlQpIHsKKyAgICBnTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgfQorfQorI2VuZGlmCisKIGNsYXNzIFRlc3RIYW5kbGVyIDogcHVibGljIFRocmlmdFRlc3RJZiB7Ci0gcHVibGljOgorcHVibGljOgogICBUZXN0SGFuZGxlcigpIHt9CiAKLSAgdm9pZCB0ZXN0Vm9pZCgpIHsKLSAgICBwcmludGYoInRlc3RWb2lkKClcbiIpOwotICB9CisgIHZvaWQgdGVzdFZvaWQoKSB7IHByaW50ZigidGVzdFZvaWQoKVxuIik7IH0KIAotICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmdGhpbmcpIHsKKyAgdm9pZCB0ZXN0U3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcmIHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nLmNfc3RyKCkpOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKKyAgYm9vbCB0ZXN0Qm9vbChjb25zdCBib29sIHRoaW5nKSB7CisgICAgcHJpbnRmKCJ0ZXN0Qm9vbCglcylcbiIsIHRoaW5nID8gInRydWUiIDogImZhbHNlIik7CisgICAgcmV0dXJuIHRoaW5nOworICB9CisKICAgaW50OF90IHRlc3RCeXRlKGNvbnN0IGludDhfdCB0aGluZykgewogICAgIHByaW50ZigidGVzdEJ5dGUoJWQpXG4iLCAoaW50KXRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CkBAIC03MCwyNyArMTE1LDQ0IEBACiAgIH0KIAogICBpbnQ2NF90IHRlc3RJNjQoY29uc3QgaW50NjRfdCB0aGluZykgewotICAgIHByaW50ZigidGVzdEk2NCglIlBSSWQ2NCIpXG4iLCB0aGluZyk7CisgICAgcHJpbnRmKCJ0ZXN0STY0KCUiIFBSSWQ2NCAiKVxuIiwgdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCiAgIGRvdWJsZSB0ZXN0RG91YmxlKGNvbnN0IGRvdWJsZSB0aGluZykgewotICAgIHByaW50ZigidGVzdERvdWJsZSglbGYpXG4iLCB0aGluZyk7CisgICAgcHJpbnRmKCJ0ZXN0RG91YmxlKCVmKVxuIiwgdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCi0gIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QmIG91dCwgY29uc3QgWHRydWN0ICZ0aGluZykgewotICAgIHByaW50ZigidGVzdFN0cnVjdCh7XCIlc1wiLCAlZCwgJWQsICUiUFJJZDY0In0pXG4iLCB0aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSwgKGludCl0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsIHRoaW5nLmk2NF90aGluZyk7CisgIHZvaWQgdGVzdEJpbmFyeShzdGQ6OnN0cmluZyYgX3JldHVybiwgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGhleHN0cjsKKyAgICBoZXhzdHIgPDwgc3RkOjpoZXggPDwgdGhpbmc7CisgICAgcHJpbnRmKCJ0ZXN0QmluYXJ5KCVsdTogJXMpXG4iLCBzYWZlX251bWVyaWNfY2FzdDx1bnNpZ25lZCBsb25nPih0aGluZy5zaXplKCkpLCBoZXhzdHIuc3RyKCkuY19zdHIoKSk7CisgICAgX3JldHVybiA9IHRoaW5nOworICB9CisKKyAgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCYgb3V0LCBjb25zdCBYdHJ1Y3QmIHRoaW5nKSB7CisgICAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9KVxuIiwKKyAgICAgICAgICAgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksCisgICAgICAgICAgIChpbnQpdGhpbmcuYnl0ZV90aGluZywKKyAgICAgICAgICAgdGhpbmcuaTMyX3RoaW5nLAorICAgICAgICAgICB0aGluZy5pNjRfdGhpbmcpOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKICAgdm9pZCB0ZXN0TmVzdChYdHJ1Y3QyJiBvdXQsIGNvbnN0IFh0cnVjdDImIG5lc3QpIHsKLSAgICBjb25zdCBYdHJ1Y3QgJnRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7Ci0gICAgcHJpbnRmKCJ0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSwgJWR9KVxuIiwgKGludCluZXN0LmJ5dGVfdGhpbmcsIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nLCBuZXN0LmkzMl90aGluZyk7CisgICAgY29uc3QgWHRydWN0JiB0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOworICAgIHByaW50ZigidGVzdE5lc3QoeyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgJWR9KVxuIiwKKyAgICAgICAgICAgKGludCluZXN0LmJ5dGVfdGhpbmcsCisgICAgICAgICAgIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLAorICAgICAgICAgICAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsCisgICAgICAgICAgIHRoaW5nLmkzMl90aGluZywKKyAgICAgICAgICAgdGhpbmcuaTY0X3RoaW5nLAorICAgICAgICAgICBuZXN0LmkzMl90aGluZyk7CiAgICAgb3V0ID0gbmVzdDsKICAgfQogCi0gIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4gJm91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+ICZ0aGluZykgeworICB2b2lkIHRlc3RNYXAobWFwPGludDMyX3QsIGludDMyX3Q+JiBvdXQsIGNvbnN0IG1hcDxpbnQzMl90LCBpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RNYXAoeyIpOwogICAgIG1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTA2LDcgKzE2OCwyNCBAQAogICAgIG91dCA9IHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0U2V0KHNldDxpbnQzMl90PiAmb3V0LCBjb25zdCBzZXQ8aW50MzJfdD4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdFN0cmluZ01hcChtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHRoaW5nKSB7CisgICAgcHJpbnRmKCJ0ZXN0TWFwKHsiKTsKKyAgICBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobV9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbV9pdGVyICE9IHRoaW5nLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiwgIik7CisgICAgICB9CisgICAgICBwcmludGYoIiVzID0+ICVzIiwgKG1faXRlci0+Zmlyc3QpLmNfc3RyKCksIChtX2l0ZXItPnNlY29uZCkuY19zdHIoKSk7CisgICAgfQorICAgIHByaW50ZigifSlcbiIpOworICAgIG91dCA9IHRoaW5nOworICB9CisKKyAgdm9pZCB0ZXN0U2V0KHNldDxpbnQzMl90PiYgb3V0LCBjb25zdCBzZXQ8aW50MzJfdD4mIHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0U2V0KHsiKTsKICAgICBzZXQ8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKQEAgLTEyMiw3ICsyMDEsNyBAQAogICAgIG91dCA9IHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0TGlzdCh2ZWN0b3I8aW50MzJfdD4gJm91dCwgY29uc3QgdmVjdG9yPGludDMyX3Q+ICZ0aGluZykgeworICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiYgb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4mIHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0TGlzdCh7Iik7CiAgICAgdmVjdG9yPGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBsX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CkBAIC0xMzgsODAgKzIxNyw1OCBAQAogICAgIG91dCA9IHRoaW5nOwogICB9CiAKLSAgTnVtYmVyeiB0ZXN0RW51bShjb25zdCBOdW1iZXJ6IHRoaW5nKSB7CisgIE51bWJlcno6OnR5cGUgdGVzdEVudW0oY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgewogICAgIHByaW50ZigidGVzdEVudW0oJWQpXG4iLCB0aGluZyk7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKICAgVXNlcklkIHRlc3RUeXBlZGVmKGNvbnN0IFVzZXJJZCB0aGluZykgewotICAgIHByaW50ZigidGVzdFR5cGVkZWYoJSJQUklkNjQiKVxuIiwgdGhpbmcpOworICAgIHByaW50ZigidGVzdFR5cGVkZWYoJSIgUFJJZDY0ICIpXG4iLCB0aGluZyk7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0TWFwTWFwKG1hcDxpbnQzMl90LCBtYXA8aW50MzJfdCxpbnQzMl90PiA+ICZtYXBtYXAsIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKKyAgdm9pZCB0ZXN0TWFwTWFwKG1hcDxpbnQzMl90LCBtYXA8aW50MzJfdCwgaW50MzJfdD4gPiYgbWFwbWFwLCBjb25zdCBpbnQzMl90IGhlbGxvKSB7CiAgICAgcHJpbnRmKCJ0ZXN0TWFwTWFwKCVkKVxuIiwgaGVsbG8pOwogCi0gICAgbWFwPGludDMyX3QsaW50MzJfdD4gcG9zOwotICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IG5lZzsKKyAgICBtYXA8aW50MzJfdCwgaW50MzJfdD4gcG9zOworICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBuZWc7CiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKLSAgICAgIHBvcy5pbnNlcnQobWFrZV9wYWlyKGksaSkpOwotICAgICAgbmVnLmluc2VydChtYWtlX3BhaXIoLWksLWkpKTsKKyAgICAgIHBvcy5pbnNlcnQobWFrZV9wYWlyKGksIGkpKTsKKyAgICAgIG5lZy5pbnNlcnQobWFrZV9wYWlyKC1pLCAtaSkpOwogICAgIH0KIAogICAgIG1hcG1hcC5pbnNlcnQobWFrZV9wYWlyKDQsIHBvcykpOwogICAgIG1hcG1hcC5pbnNlcnQobWFrZV9wYWlyKC00LCBuZWcpKTsKLQogICB9CiAKLSAgdm9pZCB0ZXN0SW5zYW5pdHkobWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+ID4gJmluc2FuZSwgY29uc3QgSW5zYW5pdHkgJmFyZ3VtZW50KSB7CisgIHZvaWQgdGVzdEluc2FuaXR5KG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiYgaW5zYW5lLCBjb25zdCBJbnNhbml0eSYgYXJndW1lbnQpIHsKICAgICBwcmludGYoInRlc3RJbnNhbml0eSgpXG4iKTsKIAotICAgIFh0cnVjdCBoZWxsbzsKLSAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKLSAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgIGhlbGxvLmk2NF90aGluZyA9IDI7Ci0KLSAgICBYdHJ1Y3QgZ29vZGJ5ZTsKLSAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7Ci0gICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKLSAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7Ci0gICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OwotCi0gICAgSW5zYW5pdHkgY3Jhenk7Ci0gICAgY3JhenkudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKEVJR0hULCA4KSk7Ci0gICAgY3JhenkueHRydWN0cy5wdXNoX2JhY2soZ29vZGJ5ZSk7Ci0KICAgICBJbnNhbml0eSBsb29uZXk7Ci0gICAgY3JhenkudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKEZJVkUsIDUpKTsKLSAgICBjcmF6eS54dHJ1Y3RzLnB1c2hfYmFjayhoZWxsbyk7CisgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiBmaXJzdF9tYXA7CisgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiBzZWNvbmRfbWFwOwogCi0gICAgbWFwPE51bWJlcnosIEluc2FuaXR5PiBmaXJzdF9tYXA7Ci0gICAgbWFwPE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwOworICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRXTywgYXJndW1lbnQpKTsKKyAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUSFJFRSwgYXJndW1lbnQpKTsKIAotICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKFRXTywgY3JhenkpKTsKLSAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihUSFJFRSwgY3JhenkpKTsKLQotICAgIHNlY29uZF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihTSVgsIGxvb25leSkpOworICAgIHNlY29uZF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpTSVgsIGxvb25leSkpOwogCiAgICAgaW5zYW5lLmluc2VydChtYWtlX3BhaXIoMSwgZmlyc3RfbWFwKSk7CiAgICAgaW5zYW5lLmluc2VydChtYWtlX3BhaXIoMiwgc2Vjb25kX21hcCkpOwogCiAgICAgcHJpbnRmKCJyZXR1cm4iKTsKICAgICBwcmludGYoIiA9IHsiKTsKLSAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOwogICAgIGZvciAoaV9pdGVyID0gaW5zYW5lLmJlZ2luKCk7IGlfaXRlciAhPSBpbnNhbmUuZW5kKCk7ICsraV9pdGVyKSB7Ci0gICAgICBwcmludGYoIiUiUFJJZDY0IiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7Ci0gICAgICBtYXA8TnVtYmVyeixJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7Ci0gICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOwotICAgICAgICAgICBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOwotICAgICAgICAgICArK2kyX2l0ZXIpIHsKKyAgICAgIHByaW50ZigiJSIgUFJJZDY0ICIgPT4geyIsIGlfaXRlci0+Zmlyc3QpOworICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKKyAgICAgIGZvciAoaTJfaXRlciA9IGlfaXRlci0+c2Vjb25kLmJlZ2luKCk7IGkyX2l0ZXIgIT0gaV9pdGVyLT5zZWNvbmQuZW5kKCk7ICsraTJfaXRlcikgewogICAgICAgICBwcmludGYoIiVkID0+IHsiLCBpMl9pdGVyLT5maXJzdCk7Ci0gICAgICAgIG1hcDxOdW1iZXJ6LCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKLSAgICAgICAgbWFwPE51bWJlcnosIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOworICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPiB1c2VyTWFwID0gaTJfaXRlci0+c2Vjb25kLnVzZXJNYXA7CisgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+Ojpjb25zdF9pdGVyYXRvciB1bTsKICAgICAgICAgcHJpbnRmKCJ7Iik7CiAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKLSAgICAgICAgICBwcmludGYoIiVkID0+ICUiUFJJZDY0IiwgIiwgdW0tPmZpcnN0LCB1bS0+c2Vjb25kKTsKKyAgICAgICAgICBwcmludGYoIiVkID0+ICUiIFBSSWQ2NCAiLCAiLCB1bS0+Zmlyc3QsIHVtLT5zZWNvbmQpOwogICAgICAgICB9CiAgICAgICAgIHByaW50ZigifSwgIik7CiAKQEAgLTIxOSw3ICsyNzYsMTEgQEAKICAgICAgICAgdmVjdG9yPFh0cnVjdD46OmNvbnN0X2l0ZXJhdG9yIHg7CiAgICAgICAgIHByaW50ZigieyIpOwogICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7Ci0gICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICUiUFJJZDY0In0sICIsIHgtPnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXgtPmJ5dGVfdGhpbmcsIHgtPmkzMl90aGluZywgeC0+aTY0X3RoaW5nKTsKKyAgICAgICAgICBwcmludGYoIntcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAiLAorICAgICAgICAgICAgICAgICB4LT5zdHJpbmdfdGhpbmcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgKGludCl4LT5ieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICB4LT5pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgIHgtPmk2NF90aGluZyk7CiAgICAgICAgIH0KICAgICAgICAgcHJpbnRmKCJ9Iik7CiAKQEAgLTIyOCwxMSArMjg5LDE5IEBACiAgICAgICBwcmludGYoIn0sICIpOwogICAgIH0KICAgICBwcmludGYoIn1cbiIpOwotCi0KICAgfQogCi0gIHZvaWQgdGVzdE11bHRpKFh0cnVjdCAmaGVsbG8sIGNvbnN0IGludDhfdCBhcmcwLCBjb25zdCBpbnQzMl90IGFyZzEsIGNvbnN0IGludDY0X3QgYXJnMiwgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+ICAmYXJnMywgY29uc3QgTnVtYmVyeiBhcmc0LCBjb25zdCBVc2VySWQgYXJnNSkgeworICB2b2lkIHRlc3RNdWx0aShYdHJ1Y3QmIGhlbGxvLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgYXJnMCwKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBhcmcxLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGFyZzIsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDE2X3QsIHN0ZDo6c3RyaW5nPiYgYXJnMywKKyAgICAgICAgICAgICAgICAgY29uc3QgTnVtYmVyejo6dHlwZSBhcmc0LAorICAgICAgICAgICAgICAgICBjb25zdCBVc2VySWQgYXJnNSkgeworICAgICh2b2lkKWFyZzM7CisgICAgKHZvaWQpYXJnNDsKKyAgICAodm9pZClhcmc1OworCiAgICAgcHJpbnRmKCJ0ZXN0TXVsdGkoKVxuIik7CiAKICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKQEAgLTI0MSwxNiArMzEwLDE0IEBACiAgICAgaGVsbG8uaTY0X3RoaW5nID0gKGludDY0X3QpYXJnMjsKICAgfQogCi0gIHZvaWQgdGVzdEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyAmYXJnKQotICAgIHRocm93KFhjZXB0aW9uLCBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbikKLSAgeworICB2b2lkIHRlc3RFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykgewogICAgIHByaW50ZigidGVzdEV4Y2VwdGlvbiglcylcbiIsIGFyZy5jX3N0cigpKTsKICAgICBpZiAoYXJnLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKICAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKICAgICAgIGUubWVzc2FnZSA9IGFyZzsKICAgICAgIHRocm93IGU7Ci0gICAgfSBlbHNlIGlmIChhcmcuY29tcGFyZSgiQXBwbGljYXRpb25FeGNlcHRpb24iKSA9PSAwKSB7CisgICAgfSBlbHNlIGlmIChhcmcuY29tcGFyZSgiVEV4Y2VwdGlvbiIpID09IDApIHsKICAgICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIGU7CiAgICAgICB0aHJvdyBlOwogICAgIH0gZWxzZSB7CkBAIC0yNjAsNyArMzI3LDkgQEAKICAgICB9CiAgIH0KIAotICB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihYdHJ1Y3QgJnJlc3VsdCwgY29uc3Qgc3RkOjpzdHJpbmcgJmFyZzAsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcxKSB0aHJvdyhYY2VwdGlvbiwgWGNlcHRpb24yKSB7CisgIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFh0cnVjdCYgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzEpIHsKIAogICAgIHByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsIGFyZzAuY19zdHIoKSwgYXJnMS5jX3N0cigpKTsKIApAQCAtMjgwLDE0NSArMzQ5LDQ5NyBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIHsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLlxuIiwgc2xlZXBGb3IpOwotICAgIHNsZWVwKHNsZWVwRm9yKTsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2xlZXBGb3IpOworICB2b2lkIHRlc3RPbmV3YXkoY29uc3QgaW50MzJfdCBhTnVtKSB7CisgICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogY2FsbCByZWNlaXZlZFxuIiwgYU51bSk7CiAgIH0KIH07CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworY2xhc3MgU2Vjb25kSGFuZGxlciA6IHB1YmxpYyBTZWNvbmRTZXJ2aWNlSWYKK3sKKyAgcHVibGljOgorICAgIHZvaWQgc2Vjb25kdGVzdFN0cmluZyhzdGQ6OnN0cmluZyYgcmVzdWx0LCBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpCisgICAgeyByZXN1bHQgPSAidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIikiOyB9Cit9OwogCi0gIGludCBwb3J0ID0gOTA5MDsKLSAgc3RyaW5nIHNlcnZlclR5cGUgPSAic2ltcGxlIjsKLSAgc3RyaW5nIHByb3RvY29sVHlwZSA9ICJiaW5hcnkiOwotICBzaXplX3Qgd29ya2VyQ291bnQgPSA0OworY2xhc3MgVGVzdFByb2Nlc3NvckV2ZW50SGFuZGxlciA6IHB1YmxpYyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKKyAgdmlydHVhbCB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuX25hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKKyAgICAodm9pZClzZXJ2ZXJDb250ZXh0OworICAgIHJldHVybiBuZXcgc3RkOjpzdHJpbmcoZm5fbmFtZSk7CisgIH0KKyAgdmlydHVhbCB2b2lkIGZyZWVDb250ZXh0KHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeworICAgICh2b2lkKWZuX25hbWU7CisgICAgZGVsZXRlIHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nKj4oY3R4KTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsgY29tbXVuaWNhdGUoInByZVJlYWQiLCBjdHgsIGZuX25hbWUpOyB9CisgIHZpcnR1YWwgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgKHZvaWQpYnl0ZXM7CisgICAgY29tbXVuaWNhdGUoInBvc3RSZWFkIiwgY3R4LCBmbl9uYW1lKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7IGNvbW11bmljYXRlKCJwcmVXcml0ZSIsIGN0eCwgZm5fbmFtZSk7IH0KKyAgdmlydHVhbCB2b2lkIHBvc3RXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgKHZvaWQpYnl0ZXM7CisgICAgY29tbXVuaWNhdGUoInBvc3RXcml0ZSIsIGN0eCwgZm5fbmFtZSk7CisgIH0KKyAgdmlydHVhbCB2b2lkIGFzeW5jQ29tcGxldGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgY29tbXVuaWNhdGUoImFzeW5jQ29tcGxldGUiLCBjdHgsIGZuX25hbWUpOworICB9CisgIHZpcnR1YWwgdm9pZCBoYW5kbGVyRXJyb3Iodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7CisgICAgY29tbXVuaWNhdGUoImhhbmRsZXJFcnJvciIsIGN0eCwgZm5fbmFtZSk7CisgIH0KIAotICBvc3RyaW5nc3RyZWFtIHVzYWdlOworICB2b2lkIGNvbW11bmljYXRlKGNvbnN0IGNoYXIqIGV2ZW50LCB2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKKyAgICBzdGQ6OmNvdXQgPDwgZXZlbnQgPDwgIjogIiA8PCAqc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcqPihjdHgpIDw8ICIgPSAiIDw8IGZuX25hbWUgPDwgc3RkOjplbmRsOworICB9Cit9OwogCi0gIHVzYWdlIDw8Ci0gICAgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyLXR5cGU9PHNlcnZlci10eXBlPl0gWy0tcHJvdG9jb2wtdHlwZT08cHJvdG9jb2wtdHlwZT5dIFstLXdvcmtlcnM9PHdvcmtlci1jb3VudD5dIiA8PCBlbmRsIDw8CitjbGFzcyBUZXN0SGFuZGxlckFzeW5jIDogcHVibGljIFRocmlmdFRlc3RDb2JTdklmIHsKK3B1YmxpYzoKKyAgVGVzdEhhbmRsZXJBc3luYyhzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+JiBoYW5kbGVyKSA6IF9kZWxlZ2F0ZShoYW5kbGVyKSB7fQorICB2aXJ0dWFsIH5UZXN0SGFuZGxlckFzeW5jKCkge30KIAotICAgICJcdFx0c2VydmVyLXR5cGVcdFx0dHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIiwgXCJ0aHJlYWRlZFwiLCBvciBcIm5vbmJsb2NraW5nXCIuICBEZWZhdWx0IGlzICIgPDwgc2VydmVyVHlwZSA8PCBlbmRsIDw8CisgIHZpcnR1YWwgdm9pZCB0ZXN0Vm9pZChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iKSB7CisgICAgX2RlbGVnYXRlLT50ZXN0Vm9pZCgpOworICAgIGNvYigpOworICB9CiAKLSAgICAiXHRcdHByb3RvY29sLXR5cGVcdFx0dHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsIDw8CisgIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nKHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdFN0cmluZyhyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQogCi0gICAgIlx0XHR3b3JrZXJzXHRcdE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50IDw8IGVuZGw7CisgIHZpcnR1YWwgdm9pZCB0ZXN0Qm9vbChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgYm9vbCB0aGluZykgeworICAgIGJvb2wgcmVzID0gX2RlbGVnYXRlLT50ZXN0Qm9vbCh0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KIAotICBtYXA8c3RyaW5nLCBzdHJpbmc+ICBhcmdzOworICB2aXJ0dWFsIHZvaWQgdGVzdEJ5dGUoc3RkOjpmdW5jdGlvbjx2b2lkKGludDhfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50OF90IHRoaW5nKSB7CisgICAgaW50OF90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEJ5dGUodGhpbmcpOworICAgIGNvYihyZXMpOworICB9CiAKLSAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKLSAgICBzdHJpbmcgYXJnKGFyZ3ZbaXhdKTsKLSAgICBpZiAoYXJnLmNvbXBhcmUoMCwyLCAiLS0iKSA9PSAwKSB7Ci0gICAgICBzaXplX3QgZW5kID0gYXJnLmZpbmRfZmlyc3Rfb2YoIj0iLCAyKTsKLSAgICAgIGlmIChlbmQgIT0gc3RyaW5nOjpucG9zKSB7Ci0JYXJnc1tzdHJpbmcoYXJnLCAyLCBlbmQgLSAyKV0gPSBzdHJpbmcoYXJnLCBlbmQgKyAxKTsKLSAgICAgIH0gZWxzZSB7Ci0JYXJnc1tzdHJpbmcoYXJnLCAyKV0gPSAidHJ1ZSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVuZXhjZXB0ZWQgY29tbWFuZCBsaW5lIHRva2VuOiAiK2FyZyk7CisgIHZpcnR1YWwgdm9pZCB0ZXN0STMyKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQzMl90IHRoaW5nKSB7CisgICAgaW50MzJfdCByZXMgPSBfZGVsZWdhdGUtPnRlc3RJMzIodGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RJNjQoc3RkOjpmdW5jdGlvbjx2b2lkKGludDY0X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDY0X3QgdGhpbmcpIHsKKyAgICBpbnQ2NF90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEk2NCh0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdERvdWJsZShzdGQ6OmZ1bmN0aW9uPHZvaWQoZG91YmxlIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBkb3VibGUgdGhpbmcpIHsKKyAgICBkb3VibGUgcmVzID0gX2RlbGVnYXRlLT50ZXN0RG91YmxlKHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0QmluYXJ5KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdEJpbmFyeShyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0U3RydWN0KHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFh0cnVjdCYgdGhpbmcpIHsKKyAgICBYdHJ1Y3QgcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdFN0cnVjdChyZXMsIHRoaW5nKTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0TmVzdChzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0MiBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0MiYgdGhpbmcpIHsKKyAgICBYdHJ1Y3QyIHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3ROZXN0KHJlcywgdGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RNYXAoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiYgdGhpbmcpIHsKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0TWFwKHJlcywgdGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RTdHJpbmdNYXAoCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHRoaW5nKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0U3RyaW5nTWFwKHJlcywgdGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RTZXQoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2V0PGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxpbnQzMl90PiYgdGhpbmcpIHsKKyAgICBzdGQ6OnNldDxpbnQzMl90PiByZXM7CisgICAgX2RlbGVnYXRlLT50ZXN0U2V0KHJlcywgdGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RMaXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnZlY3RvcjxpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB0aGluZykgeworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RMaXN0KHJlcywgdGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RFbnVtKHN0ZDo6ZnVuY3Rpb248dm9pZChOdW1iZXJ6Ojp0eXBlIGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgeworICAgIE51bWJlcno6OnR5cGUgcmVzID0gX2RlbGVnYXRlLT50ZXN0RW51bSh0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdFR5cGVkZWYoc3RkOjpmdW5jdGlvbjx2b2lkKFVzZXJJZCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgVXNlcklkIHRoaW5nKSB7CisgICAgVXNlcklkIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdFR5cGVkZWYodGhpbmcpOworICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RNYXBNYXAoCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gPiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiA+IHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RNYXBNYXAocmVzLCBoZWxsbyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdEluc2FuaXR5KAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBjb25zdCBJbnNhbml0eSYgYXJndW1lbnQpIHsKKyAgICBzdGQ6Om1hcDxVc2VySWQsIHN0ZDo6bWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RJbnNhbml0eShyZXMsIGFyZ3VtZW50KTsKKyAgICBjb2IocmVzKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0TXVsdGkoc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDE2X3QsIHN0ZDo6c3RyaW5nPiYgYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOdW1iZXJ6Ojp0eXBlIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVXNlcklkIGFyZzUpIHsKKyAgICBYdHJ1Y3QgcmVzOworICAgIF9kZWxlZ2F0ZS0+dGVzdE11bHRpKHJlcywgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdEV4Y2VwdGlvbigKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnKSB7CisgICAgdHJ5IHsKKyAgICAgIF9kZWxlZ2F0ZS0+dGVzdEV4Y2VwdGlvbihhcmcpOworICAgIH0gY2F0Y2ggKGNvbnN0IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uJiBlKSB7CisgICAgICBleG5fY29iKGFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbjo6ZGVsYXlFeGNlcHRpb24oZSkpOworICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBjb2IoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzAsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMSkgeworICAgIFh0cnVjdCByZXM7CisgICAgdHJ5IHsKKyAgICAgIF9kZWxlZ2F0ZS0+dGVzdE11bHRpRXhjZXB0aW9uKHJlcywgYXJnMCwgYXJnMSk7CisgICAgfSBjYXRjaCAoY29uc3QgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24mIGUpIHsKKyAgICAgIGV4bl9jb2IoYXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uOjpkZWxheUV4Y2VwdGlvbihlKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNvYihyZXMpOworICB9CisKKyAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3QgaW50MzJfdCBzZWNvbmRzVG9TbGVlcCkgeworICAgIF9kZWxlZ2F0ZS0+dGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CisgICAgY29iKCk7CisgIH0KKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IF9kZWxlZ2F0ZTsKK307CisKK25hbWVzcGFjZSBwbyA9IGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworCisgIHN0cmluZyB0ZXN0RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnN5c3RlbV9jb21wbGV0ZShhcmd2WzBdKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5zdHJpbmcoKTsKKyAgc3RyaW5nIGNlcnRQYXRoID0gdGVzdERpciArICIva2V5cy9zZXJ2ZXIuY3J0IjsKKyAgc3RyaW5nIGtleVBhdGggPSB0ZXN0RGlyICsgIi9rZXlzL3NlcnZlci5rZXkiOworCisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCisgIGludCBwb3J0ID0gOTA5MDsKKyAgYm9vbCBzc2wgPSBmYWxzZTsKKyAgYm9vbCB6bGliID0gZmFsc2U7CisgIHN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CisgIHN0cmluZyBwcm90b2NvbF90eXBlID0gImJpbmFyeSI7CisgIHN0cmluZyBzZXJ2ZXJfdHlwZSA9ICJzaW1wbGUiOworICBzdHJpbmcgZG9tYWluX3NvY2tldCA9ICIiOworICBib29sIGFic3RyYWN0X25hbWVzcGFjZSA9IGZhbHNlOworICBzaXplX3Qgd29ya2VycyA9IDQ7CisgIGludCBzdHJpbmdfbGltaXQgPSAwOworICBpbnQgY29udGFpbmVyX2xpbWl0ID0gMDsKKworICBwbzo6b3B0aW9uc19kZXNjcmlwdGlvbiBkZXNjKCJBbGxvd2VkIG9wdGlvbnMiKTsKKyAgZGVzYy5hZGRfb3B0aW9ucygpCisgICAgKCJoZWxwLGgiLCAicHJvZHVjZSBoZWxwIG1lc3NhZ2UiKQorICAgICgicG9ydCIsIHBvOjp2YWx1ZTxpbnQ+KCZwb3J0KS0+ZGVmYXVsdF92YWx1ZShwb3J0KSwgIlBvcnQgbnVtYmVyIHRvIGxpc3RlbiIpCisgICAgKCJkb21haW4tc29ja2V0IiwgcG86OnZhbHVlPHN0cmluZz4oJmRvbWFpbl9zb2NrZXQpIC0+ZGVmYXVsdF92YWx1ZShkb21haW5fc29ja2V0KSwgIlVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSIpCisgICAgKCJhYnN0cmFjdC1uYW1lc3BhY2UiLCAiQ3JlYXRlIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UgKG5vIGNvbm5lY3Rpb24gd2l0aCBmaWxlc3lzdGVtIHBhdGhuYW1lcykiKQorICAgICgic2VydmVyLXR5cGUiLCBwbzo6dmFsdWU8c3RyaW5nPigmc2VydmVyX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHNlcnZlcl90eXBlKSwgInR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIsIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiIikKKyAgICAoInRyYW5zcG9ydCIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZ0cmFuc3BvcnRfdHlwZSktPmRlZmF1bHRfdmFsdWUodHJhbnNwb3J0X3R5cGUpLCAidHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKKyAgICAoInByb3RvY29sIiwgcG86OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLCAicHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWgsIG11bHRpaiIpCisgICAgKCJzc2wiLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQorICAgICgiemxpYiIsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKKyAgICAoInByb2Nlc3Nvci1ldmVudHMiLCAicHJvY2Vzc29yLWV2ZW50cyIpCisgICAgKCJ3b3JrZXJzLG4iLCBwbzo6dmFsdWU8c2l6ZV90Pigmd29ya2VycyktPmRlZmF1bHRfdmFsdWUod29ya2VycyksICJOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlIikKKyAgICAoInN0cmluZy1saW1pdCIsIHBvOjp2YWx1ZTxpbnQ+KCZzdHJpbmdfbGltaXQpKQorICAgICgiY29udGFpbmVyLWxpbWl0IiwgcG86OnZhbHVlPGludD4oJmNvbnRhaW5lcl9saW1pdCkpOworCisgIHBvOjp2YXJpYWJsZXNfbWFwIHZtOworICBwbzo6c3RvcmUocG86OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBkZXNjKSwgdm0pOworICBwbzo6bm90aWZ5KHZtKTsKKworICBpZiAodm0uY291bnQoImhlbHAiKSkgeworICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOworICAgIHJldHVybiAxOwogICB9CiAKICAgdHJ5IHsKLQotICAgIGlmICghYXJnc1sicG9ydCJdLmVtcHR5KCkpIHsKLSAgICAgIHBvcnQgPSBhdG9pKGFyZ3NbInBvcnQiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInNlcnZlci10eXBlIl0uZW1wdHkoKSkgewotICAgICAgc2VydmVyVHlwZSA9IGFyZ3NbInNlcnZlci10eXBlIl07Ci0gICAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewotICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKLSAgICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkZWQiKSB7Ci0gICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gIm5vbmJsb2NraW5nIikgeworICAgIGlmICghc2VydmVyX3R5cGUuZW1wdHkoKSkgeworICAgICAgaWYgKHNlcnZlcl90eXBlID09ICJzaW1wbGUiKSB7CisgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKKyAgICAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gInRocmVhZGVkIikgeworICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAibm9uYmxvY2tpbmciKSB7CiAgICAgICB9IGVsc2UgewotCXRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmVyIHR5cGUgIitzZXJ2ZXJUeXBlKTsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2ZXIgdHlwZSAiICsgc2VydmVyX3R5cGUpOwogICAgICAgfQogICAgIH0KIAotICAgIGlmICghYXJnc1sicHJvdG9jb2wtdHlwZSJdLmVtcHR5KCkpIHsKLSAgICAgIHByb3RvY29sVHlwZSA9IGFyZ3NbInByb3RvY29sLXR5cGUiXTsKLSAgICAgIGlmIChwcm90b2NvbFR5cGUgPT0gImJpbmFyeSIpIHsKLSAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xUeXBlID09ICJhc2NpaSIpIHsKLQl0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJBU0NJSSBwcm90b2NvbCBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICB9IGVsc2UgaWYgKHByb3RvY29sVHlwZSA9PSAieG1sIikgewotCXRocm93IGludmFsaWRfYXJndW1lbnQoIlhNTCBwcm90b2NvbCBub3Qgc3VwcG9ydGVkIik7CisgICAgaWYgKCFwcm90b2NvbF90eXBlLmVtcHR5KCkpIHsKKyAgICAgIGlmIChwcm90b2NvbF90eXBlID09ICJiaW5hcnkiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGkiKSB7ICAvLyBtdWx0aXBsZXhlZCBiaW5hcnkKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeyAvLyBtdWx0aXBsZXhlZCBjb21wYWN0CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsgLy8gbXVsdGlwbGV4ZWQgaGVhZGVyCisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsgLy8gbXVsdGlwbGV4ZWQganNvbgogICAgICAgfSBlbHNlIHsKLQl0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIitwcm90b2NvbFR5cGUpOworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgfQogICAgIH0KIAotICAgIGlmICghYXJnc1sid29ya2VycyJdLmVtcHR5KCkpIHsKLSAgICAgIHdvcmtlckNvdW50ID0gYXRvaShhcmdzWyJ3b3JrZXJzIl0uY19zdHIoKSk7CisgICAgaWYgKCF0cmFuc3BvcnRfdHlwZS5lbXB0eSgpKSB7CisgICAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImJ1ZmZlcmVkIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiaHR0cCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gInpsaWIiKSB7CisgICAgICAgIC8vIGNyb3NzdGVzdGVyIHdpbGwgcGFzcyB6bGliIGFzIGEgZmxhZyBhbmQgYSB0cmFuc3BvcnQgcmlnaHQgbm93Li4uCisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHRyYW5zcG9ydCB0eXBlICIgKyB0cmFuc3BvcnRfdHlwZSk7CisgICAgICB9CiAgICAgfQotICB9IGNhdGNoIChleGNlcHRpb24mIGUpIHsKKworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgewogICAgIGNlcnIgPDwgZS53aGF0KCkgPDwgZW5kbDsKLSAgICBjZXJyIDw8IHVzYWdlOworICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJzc2wiKSkgeworICAgIHNzbCA9IHRydWU7CisgIH0KKworICBpZiAodm0uY291bnQoInpsaWIiKSkgeworICAgIHpsaWIgPSB0cnVlOworICB9CisKKyNpZiBkZWZpbmVkKEhBVkVfU0lHTkFMX0gpICYmIGRlZmluZWQoU0lHUElQRSkKKyAgaWYgKHNzbCkgeworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLy8gZm9yIE9wZW5TU0wsIG90aGVyd2lzZSB3ZSBlbmQgYWJydXB0bHkKKyAgfQorI2VuZGlmCisKKyAgaWYgKHZtLmNvdW50KCJhYnN0cmFjdC1uYW1lc3BhY2UiKSkgeworICAgIGFic3RyYWN0X25hbWVzcGFjZSA9IHRydWU7CiAgIH0KIAogICAvLyBEaXNwYXRjaGVyCi0gIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwotCi0gIHNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKLQotICBzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKLQotICAvLyBUcmFuc3BvcnQKLSAgc2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOwotCi0gIC8vIEZhY3RvcnkKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKLQotICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewotCi0gICAgLy8gU2VydmVyCi0gICAgVFNpbXBsZVNlcnZlciBzaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3NvciwKLQkJCSAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkpOwotCi0gICAgcHJpbnRmKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgJWQuLi5cbiIsIHBvcnQpOwotICAgIHNpbXBsZVNlcnZlci5zZXJ2ZSgpOwotCi0gIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7Ci0KLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPQotICAgICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7Ci0KLSAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9Ci0gICAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4obmV3IFBvc2l4VGhyZWFkRmFjdG9yeSgpKTsKLQotICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0KLSAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotCi0gICAgVFRocmVhZFBvb2xTZXJ2ZXIgdGhyZWFkUG9vbFNlcnZlcih0ZXN0UHJvY2Vzc29yLAotCQkJCSAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSAgICAgICB0aHJlYWRNYW5hZ2VyKTsKLQotICAgIHByaW50ZigiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKLSAgICB0aHJlYWRQb29sU2VydmVyLnNlcnZlKCk7Ci0KLSAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWRlZCIpIHsKLQotICAgIFRUaHJlYWRlZFNlcnZlciB0aHJlYWRlZFNlcnZlcih0ZXN0UHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KLSAgICBwcmludGYoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAlZC4uLlxuIiwgcG9ydCk7Ci0gICAgdGhyZWFkZWRTZXJ2ZXIuc2VydmUoKTsKLQotICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gIm5vbmJsb2NraW5nIikgewotICAgIFROb25ibG9ja2luZ1NlcnZlciBub25ibG9ja2luZ1NlcnZlcih0ZXN0UHJvY2Vzc29yLCBwb3J0KTsKLSAgICBwcmludGYoIlN0YXJ0aW5nIHRoZSBub25ibG9ja2luZyBzZXJ2ZXIgb24gcG9ydCAlZC4uLlxuIiwgcG9ydCk7Ci0gICAgbm9uYmxvY2tpbmdTZXJ2ZXIuc2VydmUoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeTsKKyAgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4ganNvblByb3RvY29sRmFjdG9yeShuZXcgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSk7CisgICAgcHJvdG9jb2xGYWN0b3J5ID0ganNvblByb3RvY29sRmFjdG9yeTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7CisgICAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiAqY29tcGFjdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+KCk7CisgICAgY29tcGFjdFByb3RvY29sRmFjdG9yeS0+c2V0Q29udGFpbmVyU2l6ZUxpbWl0KGNvbnRhaW5lcl9saW1pdCk7CisgICAgY29tcGFjdFByb3RvY29sRmFjdG9yeS0+c2V0U3RyaW5nU2l6ZUxpbWl0KHN0cmluZ19saW1pdCk7CisgICAgcHJvdG9jb2xGYWN0b3J5LnJlc2V0KGNvbXBhY3RQcm90b2NvbEZhY3RvcnkpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBoZWFkZXJQcm90b2NvbEZhY3RvcnkobmV3IFRIZWFkZXJQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgcHJvdG9jb2xGYWN0b3J5ID0gaGVhZGVyUHJvdG9jb2xGYWN0b3J5OworICB9IGVsc2UgeworICAgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiogYmluYXJ5UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpOworICAgIGJpbmFyeVByb3RvY29sRmFjdG9yeS0+c2V0Q29udGFpbmVyU2l6ZUxpbWl0KGNvbnRhaW5lcl9saW1pdCk7CisgICAgYmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5zZXRTdHJpbmdTaXplTGltaXQoc3RyaW5nX2xpbWl0KTsKKyAgICBwcm90b2NvbEZhY3RvcnkucmVzZXQoYmluYXJ5UHJvdG9jb2xGYWN0b3J5KTsKICAgfQogCi0gIHByaW50ZigiZG9uZS5cbiIpOworICAvLyBQcm9jZXNzb3JzCisgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gdGVzdEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvcihuZXcgVGhyaWZ0VGVzdFByb2Nlc3Nvcih0ZXN0SGFuZGxlcikpOworCisgIGlmICh2bS5jb3VudCgicHJvY2Vzc29yLWV2ZW50cyIpKSB7CisgICAgdGVzdFByb2Nlc3Nvci0+c2V0RXZlbnRIYW5kbGVyKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4obmV3IFRlc3RQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSkpOworICB9CisKKyAgLy8gVHJhbnNwb3J0CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gc3NsU29ja2V0RmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldDsKKworICBpZiAoc3NsKSB7CisgICAgc3NsU29ja2V0RmFjdG9yeSA9IHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICAgIHNzbFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0UGF0aC5jX3N0cigpKTsKKyAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShrZXlQYXRoLmNfc3RyKCkpOworICAgIHNzbFNvY2tldEZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOworICAgIGlmIChzZXJ2ZXJfdHlwZSAhPSAibm9uYmxvY2tpbmciKSB7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZG9tYWluX3NvY2tldCAhPSAiIikgeworICAgICAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBhYnN0cmFjdF9zb2NrZXQoIlwwIiwgMSk7CisgICAgICAgIGFic3RyYWN0X3NvY2tldCArPSBkb21haW5fc29ja2V0OworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoYWJzdHJhY3Rfc29ja2V0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB1bmxpbmsoZG9tYWluX3NvY2tldC5jX3N0cigpKTsKKyAgICAgICAgc2VydmVyU29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KGRvbWFpbl9zb2NrZXQpKTsKKyAgICAgIH0KKyAgICAgIHBvcnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIH0KKyAgfQorCisgIC8vIEZhY3RvcnkKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5OworCisgIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiaHR0cCIgJiYgc2VydmVyX3R5cGUgIT0gIm5vbmJsb2NraW5nIikgeworICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeT4oKTsKKyAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgeworICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5PigpOworICB9IGVsc2UgeworICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCk7CisgIH0KKworICBpZiAoemxpYikgeworICAgIC8vIGhtbS4uIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHdheSB0byBtYWtlIGl0IHdyYXAgdGhlIG90aGVycy4uLgorICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRabGliVHJhbnNwb3J0RmFjdG9yeT4oKTsKKyAgfQorCisgIC8vIFNlcnZlciBJbmZvCisgIGNvdXQgPDwgIlN0YXJ0aW5nIFwiIiA8PCBzZXJ2ZXJfdHlwZSA8PCAiXCIgc2VydmVyICgiIDw8IHRyYW5zcG9ydF90eXBlIDw8ICIvIiA8PCBwcm90b2NvbF90eXBlCisgICAgICAgPDwgIikgbGlzdGVuIG9uOiAiOworICBpZiAoYWJzdHJhY3RfbmFtZXNwYWNlKSB7CisgICAgY291dCA8PCAnQCc7CisgIH0KKyAgY291dCA8PCBkb21haW5fc29ja2V0OworICBpZiAocG9ydCAhPSAwKSB7CisgICAgY291dCA8PCBwb3J0OworICB9CisgIGNvdXQgPDwgZW5kbDsKKworICAvLyBNdWx0aXBsZXhlZCBQcm9jZXNzb3IgaWYgbmVlZGVkCisgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2Vjb25kSGFuZGxlcj4gc2Vjb25kSGFuZGxlcihuZXcgU2Vjb25kSGFuZGxlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2Vjb25kU2VydmljZVByb2Nlc3Nvcj4gc2Vjb25kUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yKHNlY29uZEhhbmRsZXIpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm9jZXNzb3I+IG11bHRpcGxleGVkUHJvY2Vzc29yKG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKSk7CisgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3ItPnJlZ2lzdGVyRGVmYXVsdCh0ZXN0UHJvY2Vzc29yKTsgLy8gbm9uLW11bHRpIGNsaWVudHMgZ28gdG8gdGhlIGRlZmF1bHQgcHJvY2Vzc29yIChtdWx0aTpiaW5hcnksIG11bHRpYzpjb21wYWN0LCAuLi4pCisgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCJUaHJpZnRUZXN0IiwgdGVzdFByb2Nlc3Nvcik7CisgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKTsKKyAgICB0ZXN0UHJvY2Vzc29yID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUHJvY2Vzc29yPihtdWx0aXBsZXhlZFByb2Nlc3Nvcik7CisgIH0KKworICAvLyBTZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXI+IHNlcnZlcjsKKworICBpZiAoc2VydmVyX3R5cGUgPT0gInNpbXBsZSIpIHsKKyAgICBzZXJ2ZXIucmVzZXQobmV3IFRTaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKyAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJzKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisKKyAgICBzZXJ2ZXIucmVzZXQobmV3IFRUaHJlYWRQb29sU2VydmVyKHRlc3RQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcikpOworICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWRlZCIpIHsKKyAgICBzZXJ2ZXIucmVzZXQoCisgICAgICAgIG5ldyBUVGhyZWFkZWRTZXJ2ZXIodGVzdFByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKyAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAibm9uYmxvY2tpbmciKSB7CisgICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgeworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyQXN5bmM+IHRlc3RIYW5kbGVyQXN5bmMobmV3IFRlc3RIYW5kbGVyQXN5bmModGVzdEhhbmRsZXIpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3JBc3luYygKKyAgICAgICAgICBuZXcgVGhyaWZ0VGVzdEFzeW5jUHJvY2Vzc29yKHRlc3RIYW5kbGVyQXN5bmMpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHRlc3RCdWZmZXJQcm9jZXNzb3IoCisgICAgICAgICAgbmV3IFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHRlc3RQcm9jZXNzb3JBc3luYywgcHJvdG9jb2xGYWN0b3J5KSk7CisKKyAgICAgIC8vIG5vdCBsb2FkaW5nIG5vbmJsb2NraW5nU2VydmVyIGludG8gInNlcnZlciIgYmVjYXVzZQorICAgICAgLy8gVEV2aHR0cFNlcnZlciBkb2Vzbid0IGluaGVyaXQgZnJvbSBUU2VydmVyLCBhbmQgZG9lc24ndAorICAgICAgLy8gcHJvdmlkZSBhIHN0b3AgbWV0aG9kLgorICAgICAgVEV2aHR0cFNlcnZlciBub25ibG9ja2luZ1NlcnZlcih0ZXN0QnVmZmVyUHJvY2Vzc29yLCBwb3J0KTsKKyAgICAgIG5vbmJsb2NraW5nU2VydmVyLnNlcnZlKCk7CisgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgeworICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiBuYlNvY2tldDsKKyAgICAgIG5iU29ja2V0LnJlc2V0KAorICAgICAgICAgIHNzbCA/IG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChwb3J0LCBzc2xTb2NrZXRGYWN0b3J5KQorICAgICAgICAgICAgICA6IG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBzZXJ2ZXIucmVzZXQobmV3IFROb25ibG9ja2luZ1NlcnZlcih0ZXN0UHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNlcnIgPDwgInNlcnZlci10eXBlIG5vbmJsb2NraW5nIHJlcXVpcmVzIHRyYW5zcG9ydCBvZiBodHRwIG9yIGZyYW1lZCIgPDwgZW5kbDsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICB9CisKKyAgaWYgKHNlcnZlci5nZXQoKSAhPSBOVUxMKSB7CisgICAgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKKyAgICAgIC8vIFRlbGwgdGhlIHNlcnZlciB0byB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgZm9yIGlucHV0IC8gb3V0cHV0CisgICAgICAvLyBpZiB1c2luZyBoZWFkZXIKKyAgICAgIHNlcnZlci0+c2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PigpKTsKKyAgICB9CisgICAgCisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgZmFjdG9yeTsKKyAgICBmYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZT4gc2VydmVyVGhyZWFkUnVubmVyKHNlcnZlcik7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWQKKyAgICAgICAgPSBmYWN0b3J5Lm5ld1RocmVhZChzZXJ2ZXJUaHJlYWRSdW5uZXIpOworCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorICAgIHNpZ25hbChTSUdJTlQsIHNpZ25hbF9oYW5kbGVyKTsKKyNlbmRpZgorCisgICAgdGhyZWFkLT5zdGFydCgpOworICAgIGdNb25pdG9yLndhaXRGb3JldmVyKCk7ICAgICAgICAgLy8gd2FpdCBmb3IgYSBzaHV0ZG93biBzaWduYWwKKyAgICAKKyNpZmRlZiBIQVZFX1NJR05BTF9ICisgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisjZW5kaWYKKworICAgIHNlcnZlci0+c3RvcCgpOworICAgIHRocmVhZC0+am9pbigpOworICAgIHNlcnZlci5yZXNldCgpOworICB9CisKKyAgY291dCA8PCAiZG9uZS4iIDw8IGVuZGw7CiAgIHJldHVybiAwOwogfQorCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvVGhyaWZ0VGVzdF9leHRyYXMuY3BwIGIvdGVzdC9jcHAvc3JjL1RocmlmdFRlc3RfZXh0cmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjU2MDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcHAvc3JjL1RocmlmdFRlc3RfZXh0cmFzLmNwcApAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEV4dHJhIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgVGhyaWZ0VGVzdF90eXBlcyB0byB3b3JrCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlICJnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCIKKworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CisKK2Jvb2wgSW5zYW5pdHk6Om9wZXJhdG9yPCh0aHJpZnQ6OnRlc3Q6Okluc2FuaXR5IGNvbnN0JiBvdGhlcikgY29uc3QgeworICB1c2luZyBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmc7CisgIHJldHVybiBUaHJpZnREZWJ1Z1N0cmluZygqdGhpcykgPCBUaHJpZnREZWJ1Z1N0cmluZyhvdGhlcik7Cit9Cit9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvbWFpbi5jcHAgYi90ZXN0L2NwcC9zcmMvbWFpbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZWU5NTAuLjAwMDAwMDAKLS0tIGEvdGVzdC9jcHAvc3JjL21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVXRpbC5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L011dGV4Lmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8c2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxUTG9nZ2luZy5oPgotCi0jaW5jbHVkZSAiU2VydmljZS5oIgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGV4dC9oYXNoX21hcD4KLXVzaW5nIF9fZ251X2N4eDo6aGFzaF9tYXA7Ci11c2luZyBfX2dudV9jeHg6Omhhc2g7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYm9vc3Q7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLQotdXNpbmcgbmFtZXNwYWNlIHRlc3Q6OnN0cmVzczsKLQotc3RydWN0IGVxc3RyIHsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgewotICAgIHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOwotICB9Ci19OwotCi1zdHJ1Y3QgbHRzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpIDwgMDsKLSAgfQotfTsKLQotCi0vLyB0eXBlZGVmIGhhc2hfbWFwPGNvbnN0IGNoYXIqLCBpbnQsIGhhc2g8Y29uc3QgY2hhcio+LCBlcXN0cj4gY291bnRfbWFwOwotdHlwZWRlZiBtYXA8Y29uc3QgY2hhciosIGludCwgbHRzdHI+IGNvdW50X21hcDsKLQotY2xhc3MgU2VydmVyIDogcHVibGljIFNlcnZpY2VJZiB7Ci0gcHVibGljOgotICBTZXJ2ZXIoKSB7fQotCi0gIHZvaWQgY291bnQoY29uc3QgY2hhciogbWV0aG9kKSB7Ci0gICAgR3VhcmQgbShsb2NrXyk7Ci0gICAgaW50IGN0ID0gY291bnRzX1ttZXRob2RdOwotICAgIGNvdW50c19bbWV0aG9kXSA9ICsrY3Q7Ci0gIH0KLQotICB2b2lkIGVjaG9Wb2lkKCkgewotICAgIGNvdW50KCJlY2hvVm9pZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNvdW50X21hcCBnZXRDb3VudCgpIHsKLSAgICBHdWFyZCBtKGxvY2tfKTsKLSAgICByZXR1cm4gY291bnRzXzsKLSAgfQotCi0gIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIGludDMyX3QgZWNob0kzMihjb25zdCBpbnQzMl90IGFyZykge3JldHVybiBhcmc7fQotICBpbnQ2NF90IGVjaG9JNjQoY29uc3QgaW50NjRfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcgJmFyZykgewotICAgIGlmIChhcmcgIT0gImhlbGxvIikgewotICAgICAgVF9FUlJPUl9BQk9SVCgiV1JPTkcgU1RSSU5HISEhISIpOwotICAgIH0KLSAgICBvdXQgPSBhcmc7Ci0gIH0KLSAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4gJm91dCwgY29uc3Qgc2V0PGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4gJm91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotCi1wcml2YXRlOgotICBjb3VudF9tYXAgY291bnRzXzsKLSAgTXV0ZXggbG9ja187Ci0KLX07Ci0KLWNsYXNzIENsaWVudFRocmVhZDogcHVibGljIFJ1bm5hYmxlIHsKLXB1YmxpYzoKLQotICBDbGllbnRUaHJlYWQoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PnRyYW5zcG9ydCwgc2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBjbGllbnQsIE1vbml0b3ImIG1vbml0b3IsIHNpemVfdCYgd29ya2VyQ291bnQsIHNpemVfdCBsb29wQ291bnQsIFRUeXBlIGxvb3BUeXBlKSA6Ci0gICAgX3RyYW5zcG9ydCh0cmFuc3BvcnQpLAotICAgIF9jbGllbnQoY2xpZW50KSwKLSAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICBfd29ya2VyQ291bnQod29ya2VyQ291bnQpLAotICAgIF9sb29wQ291bnQobG9vcENvdW50KSwKLSAgICBfbG9vcFR5cGUobG9vcFR5cGUpCi0gIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0KLSAgICAvLyBXYWl0IGZvciBhbGwgd29ya2VyIHRocmVhZHMgdG8gc3RhcnQKLQotICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0gICAgICB3aGlsZShfd29ya2VyQ291bnQgPT0gMCkgewotICAgICAgICBfbW9uaXRvci53YWl0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBfdHJhbnNwb3J0LT5vcGVuKCk7Ci0KLSAgICBzd2l0Y2goX2xvb3BUeXBlKSB7Ci0gICAgY2FzZSBUX1ZPSUQ6IGxvb3BFY2hvVm9pZCgpOyBicmVhazsKLSAgICBjYXNlIFRfQllURTogbG9vcEVjaG9CeXRlKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JMzI6IGxvb3BFY2hvSTMyKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JNjQ6IGxvb3BFY2hvSTY0KCk7IGJyZWFrOwotICAgIGNhc2UgVF9TVFJJTkc6IGxvb3BFY2hvU3RyaW5nKCk7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGNlcnIgPDwgIlVuZXhwZWN0ZWQgbG9vcCB0eXBlIiA8PCBfbG9vcFR5cGUgPDwgZW5kbDsgYnJlYWs7Ci0gICAgfQotCi0gICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgX3RyYW5zcG9ydC0+Y2xvc2UoKTsKLQotICAgIF9kb25lID0gdHJ1ZTsKLQotICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgIF93b3JrZXJDb3VudC0tOwotCi0gICAgICBpZiAoX3dvcmtlckNvdW50ID09IDApIHsKLQotICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvVm9pZCgpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgX2NsaWVudC0+ZWNob1ZvaWQoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvQnl0ZSgpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgaW50OF90IGFyZyA9IDE7Ci0gICAgICBpbnQ4X3QgcmVzdWx0OwotICAgICAgcmVzdWx0ID1fY2xpZW50LT5lY2hvQnl0ZShhcmcpOwotICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9JMzIoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIGludDMyX3QgYXJnID0gMTsKLSAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgcmVzdWx0ID1fY2xpZW50LT5lY2hvSTMyKGFyZyk7Ci0gICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob0k2NCgpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgaW50NjRfdCBhcmcgPSAxOwotICAgICAgaW50NjRfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9JNjQoYXJnKTsKLSAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvU3RyaW5nKCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBzdHJpbmcgYXJnID0gImhlbGxvIjsKLSAgICAgIHN0cmluZyByZXN1bHQ7Ci0gICAgICBfY2xpZW50LT5lY2hvU3RyaW5nKHJlc3VsdCwgYXJnKTsKLSAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKLSAgICB9Ci0gIH0KLQotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gX2NsaWVudDsKLSAgTW9uaXRvciYgX21vbml0b3I7Ci0gIHNpemVfdCYgX3dvcmtlckNvdW50OwotICBzaXplX3QgX2xvb3BDb3VudDsKLSAgVFR5cGUgX2xvb3BUeXBlOwotICBsb25nIGxvbmcgX3N0YXJ0VGltZTsKLSAgbG9uZyBsb25nIF9lbmRUaW1lOwotICBib29sIF9kb25lOwotICBNb25pdG9yIF9zbGVlcDsKLX07Ci0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0KLSAgaW50IHBvcnQgPSA5MDkxOwotICBzdHJpbmcgc2VydmVyVHlwZSA9ICJ0aHJlYWQtcG9vbCI7Ci0gIHN0cmluZyBwcm90b2NvbFR5cGUgPSAiYmluYXJ5IjsKLSAgc2l6ZV90IHdvcmtlckNvdW50ID0gNDsKLSAgc2l6ZV90IGNsaWVudENvdW50ID0gMjA7Ci0gIHNpemVfdCBsb29wQ291bnQgPSA1MDAwMDsKLSAgVFR5cGUgbG9vcFR5cGUgID0gVF9WT0lEOwotICBzdHJpbmcgY2FsbE5hbWUgPSAiZWNob1ZvaWQiOwotICBib29sIHJ1blNlcnZlciA9IHRydWU7Ci0gIGJvb2wgbG9nUmVxdWVzdHMgPSBmYWxzZTsKLSAgc3RyaW5nIHJlcXVlc3RMb2dQYXRoID0gIi4vcmVxdWVzdGxvZy50bG9nIjsKLSAgYm9vbCByZXBsYXlSZXF1ZXN0cyA9IGZhbHNlOwotCi0gIG9zdHJpbmdzdHJlYW0gdXNhZ2U7Ci0KLSAgdXNhZ2UgPDwKLSAgICBhcmd2WzBdIDw8ICIgWy0tcG9ydD08cG9ydCBudW1iZXI+XSBbLS1zZXJ2ZXJdIFstLXNlcnZlci10eXBlPTxzZXJ2ZXItdHlwZT5dIFstLXByb3RvY29sLXR5cGU9PHByb3RvY29sLXR5cGU+XSBbLS13b3JrZXJzPTx3b3JrZXItY291bnQ+XSBbLS1jbGllbnRzPTxjbGllbnQtY291bnQ+XSBbLS1sb29wPTxsb29wLWNvdW50Pl0iIDw8IGVuZGwgPDwKLSAgICAiXHRjbGllbnRzICAgICAgICBOdW1iZXIgb2YgY2xpZW50IHRocmVhZHMgdG8gY3JlYXRlIC0gMCBpbXBsaWVzIG5vIGNsaWVudHMsIGkuZS4gc2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbCA8PAotICAgICJcdGhlbHAgICAgICAgICAgIFByaW50cyB0aGlzIGhlbHAgdGV4dC4iIDw8IGVuZGwgPDwKLSAgICAiXHRjYWxsICAgICAgICAgICBTZXJ2aWNlIG1ldGhvZCB0byBjYWxsLiAgRGVmYXVsdCBpcyAiIDw8IGNhbGxOYW1lIDw8IGVuZGwgPDwKLSAgICAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIgPDwgbG9vcENvdW50IDw8IGVuZGwgPDwKLSAgICAiXHRwb3J0ICAgICAgICAgICBUaGUgcG9ydCB0aGUgc2VydmVyIGFuZCBjbGllbnRzIHNob3VsZCBiaW5kIHRvIGZvciB0aHJpZnQgbmV0d29yayBjb25uZWN0aW9ucy4gIERlZmF1bHQgaXMgIiA8PCBwb3J0IDw8IGVuZGwgPDwKLSAgICAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlciA8PCBlbmRsIDw8Ci0gICAgIlx0c2VydmVyLXR5cGUgICAgVHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIgb3IgXCJ0aHJlYWQtcG9vbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHNlcnZlclR5cGUgPDwgZW5kbCA8PAotICAgICJcdHByb3RvY29sLXR5cGUgIFR5cGUgb2YgcHJvdG9jb2wsIFwiYmluYXJ5XCIsIFwiYXNjaWlcIiwgb3IgXCJ4bWxcIi4gIERlZmF1bHQgaXMgIiA8PCBwcm90b2NvbFR5cGUgPDwgZW5kbCA8PAotICAgICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzIDw8IGVuZGwgPDwKLSAgICAiXHRyZXBsYXktcmVxdWVzdCBSZXBsYXkgcmVxdWVzdHMgZnJvbSBsb2cgZmlsZSAoLi9yZXF1ZXN0bG9nLnRsb2cpIERlZmF1bHQgaXMgIiA8PCByZXBsYXlSZXF1ZXN0cyA8PCBlbmRsIDw8Ci0gICAgIlx0d29ya2VycyAgICAgICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiAgT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUuICBEZWZhdWx0IGlzICIgPDwgd29ya2VyQ291bnQgPDwgZW5kbDsKLQotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gIGFyZ3M7Ci0KLSAgZm9yIChpbnQgaXggPSAxOyBpeCA8IGFyZ2M7IGl4KyspIHsKLQotICAgIHN0cmluZyBhcmcoYXJndltpeF0pOwotCi0gICAgaWYgKGFyZy5jb21wYXJlKDAsMiwgIi0tIikgPT0gMCkgewotCi0gICAgICBzaXplX3QgZW5kID0gYXJnLmZpbmRfZmlyc3Rfb2YoIj0iLCAyKTsKLQotICAgICAgc3RyaW5nIGtleSA9IHN0cmluZyhhcmcsIDIsIGVuZCAtIDIpOwotCi0gICAgICBpZiAoZW5kICE9IHN0cmluZzo6bnBvcykgewotICAgICAgICBhcmdzW2tleV0gPSBzdHJpbmcoYXJnLCBlbmQgKyAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFyZ3Nba2V5XSA9ICJ0cnVlIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5leGNlcHRlZCBjb21tYW5kIGxpbmUgdG9rZW46ICIrYXJnKTsKLSAgICB9Ci0gIH0KLQotICB0cnkgewotCi0gICAgaWYgKCFhcmdzWyJjbGllbnRzIl0uZW1wdHkoKSkgewotICAgICAgY2xpZW50Q291bnQgPSBhdG9pKGFyZ3NbImNsaWVudHMiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbImhlbHAiXS5lbXB0eSgpKSB7Ci0gICAgICBjZXJyIDw8IHVzYWdlLnN0cigpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJsb29wIl0uZW1wdHkoKSkgewotICAgICAgbG9vcENvdW50ID0gYXRvaShhcmdzWyJsb29wIl0uY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJjYWxsIl0uZW1wdHkoKSkgewotICAgICAgY2FsbE5hbWUgPSBhcmdzWyJjYWxsIl07Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJwb3J0Il0uZW1wdHkoKSkgewotICAgICAgcG9ydCA9IGF0b2koYXJnc1sicG9ydCJdLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICghYXJnc1sic2VydmVyIl0uZW1wdHkoKSkgewotICAgICAgcnVuU2VydmVyID0gYXJnc1sic2VydmVyIl0gPT0gInRydWUiOwotICAgIH0KLQotICAgIGlmICghYXJnc1sibG9nLXJlcXVlc3QiXS5lbXB0eSgpKSB7Ci0gICAgICBsb2dSZXF1ZXN0cyA9IGFyZ3NbImxvZy1yZXF1ZXN0Il0gPT0gInRydWUiOwotICAgIH0KLQotICAgIGlmICghYXJnc1sicmVwbGF5LXJlcXVlc3QiXS5lbXB0eSgpKSB7Ci0gICAgICByZXBsYXlSZXF1ZXN0cyA9IGFyZ3NbInJlcGxheS1yZXF1ZXN0Il0gPT0gInRydWUiOwotICAgIH0KLQotICAgIGlmICghYXJnc1sic2VydmVyLXR5cGUiXS5lbXB0eSgpKSB7Ci0gICAgICBzZXJ2ZXJUeXBlID0gYXJnc1sic2VydmVyLXR5cGUiXTsKLQotICAgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKLQotICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKLQotICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWRlZCIpIHsKLQotICAgICAgfSBlbHNlIHsKLQotICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZlciB0eXBlICIrc2VydmVyVHlwZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJ3b3JrZXJzIl0uZW1wdHkoKSkgewotICAgICAgd29ya2VyQ291bnQgPSBhdG9pKGFyZ3NbIndvcmtlcnMiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgfSBjYXRjaChleGNlcHRpb24mIGUpIHsKLSAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgY2VyciA8PCB1c2FnZTsKLSAgfQotCi0gIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkoKSk7Ci0KLSAgLy8gRGlzcGF0Y2hlcgotICBzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLQotICBpZiAocmVwbGF5UmVxdWVzdHMpIHsKLSAgICBzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLSAgICBzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKLQotICAgIC8vIFRyYW5zcG9ydHMKLSAgICBzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwotICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwotICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwotICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOwotCi0gICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwotCi0gICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVRyYW5zcG9ydCk7Ci0KLSAgICBmaWxlUHJvY2Vzc29yLnByb2Nlc3MoMCwgdHJ1ZSk7Ci0gICAgZXhpdCgwKTsKLSAgfQotCi0KLSAgaWYgKHJ1blNlcnZlcikgewotCi0gICAgc2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7Ci0KLSAgICAvLyBUcmFuc3BvcnQKLSAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7Ci0KLSAgICAvLyBUcmFuc3BvcnQgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7Ci0KLSAgICAvLyBQcm90b2NvbCBGYWN0b3J5Ci0gICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7Ci0KLSAgICBpZiAobG9nUmVxdWVzdHMpIHsKLSAgICAgIC8vIGluaXRpYWxpemUgdGhlIGxvZyBmaWxlCi0gICAgICBzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwotICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7Ci0gICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKLQotICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9Ci0gICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKLSAgICB9Ci0KLSAgICBzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkOwotCi0gICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKLQotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFRTaW1wbGVTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKSk7Ci0KLSAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZGVkIikgewotCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVFRocmVhZGVkU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkpOwotCi0gICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKLQotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7Ci0KLSAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0gICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFRUaHJlYWRQb29sU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0aHJlYWRNYW5hZ2VyKSkpOwotICAgIH0KLQotICAgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiIDw8IHBvcnQgPDwgZW5kbDsKLQotICAgIHNlcnZlclRocmVhZC0+c3RhcnQoKTsKLQotICAgIC8vIElmIHdlIGFyZW4ndCBydW5uaW5nIGNsaWVudHMsIGp1c3Qgd2FpdCBmb3JldmVyIGZvciBleHRlcm5hbCBjbGllbnRzCi0KLSAgICBpZiAoY2xpZW50Q291bnQgPT0gMCkgewotICAgICAgc2VydmVyVGhyZWFkLT5qb2luKCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGNsaWVudENvdW50ID4gMCkgewotCi0gICAgTW9uaXRvciBtb25pdG9yOwotCi0gICAgc2l6ZV90IHRocmVhZENvdW50ID0gMDsKLQotICAgIHNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOwotCi0gICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsgbG9vcFR5cGUgPSBUX1ZPSUQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvQnl0ZSIpIHsgbG9vcFR5cGUgPSBUX0JZVEU7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeyBsb29wVHlwZSA9IFRfSTMyO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0k2NCIpIHsgbG9vcFR5cGUgPSBUX0k2NDt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9TdHJpbmciKSB7IGxvb3BUeXBlID0gVF9TVFJJTkc7fQotICAgIGVsc2Uge3Rocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmljZSBjYWxsICIrY2FsbE5hbWUpO30KLQotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgewotCi0gICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMDEiLCBwb3J0KSk7Ci0gICAgICBzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQsIDIwNDgpKTsKLSAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZmZlcmVkU29ja2V0KSk7Ci0gICAgICBzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKLQotICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPihuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUpKSkpOwotICAgIH0KLQotICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsgdGhyZWFkICE9IGNsaWVudFRocmVhZHMuZW5kKCk7IHRocmVhZCsrKSB7Ci0gICAgICAoKnRocmVhZCktPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgbG9uZyBsb25nIHRpbWUwMDsKLSAgICBsb25nIGxvbmcgdGltZTAxOwotCi0gICAge1N5bmNocm9uaXplZCBzKG1vbml0b3IpOwotICAgICAgdGhyZWFkQ291bnQgPSBjbGllbnRDb3VudDsKLQotICAgICAgY2VyciA8PCAiTGF1bmNoICI8PCBjbGllbnRDb3VudCA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOwotCi0gICAgICB0aW1lMDAgPSAgVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgICAgbW9uaXRvci5ub3RpZnlBbGwoKTsKLQotICAgICAgd2hpbGUodGhyZWFkQ291bnQgPiAwKSB7Ci0gICAgICAgIG1vbml0b3Iud2FpdCgpOwotICAgICAgfQotCi0gICAgICB0aW1lMDEgPSAgVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICB9Ci0KLSAgICBsb25nIGxvbmcgZmlyc3RUaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwotICAgIGxvbmcgbG9uZyBsYXN0VGltZSA9IDA7Ci0KLSAgICBkb3VibGUgYXZlcmFnZVRpbWUgPSAwOwotICAgIGxvbmcgbG9uZyBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwotICAgIGxvbmcgbG9uZyBtYXhUaW1lID0gMDsKLQotICAgIGZvciAoc2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgaXgrKykgewotCi0gICAgICBzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50ID0gZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7Ci0KLSAgICAgIGxvbmcgbG9uZyBkZWx0YSA9IGNsaWVudC0+X2VuZFRpbWUgLSBjbGllbnQtPl9zdGFydFRpbWU7Ci0KLSAgICAgIGFzc2VydChkZWx0YSA+IDApOwotCi0gICAgICBpZiAoY2xpZW50LT5fc3RhcnRUaW1lIDwgZmlyc3RUaW1lKSB7Ci0gICAgICAgIGZpcnN0VGltZSA9IGNsaWVudC0+X3N0YXJ0VGltZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNsaWVudC0+X2VuZFRpbWUgPiBsYXN0VGltZSkgewotICAgICAgICBsYXN0VGltZSA9IGNsaWVudC0+X2VuZFRpbWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWx0YSA8IG1pblRpbWUpIHsKLSAgICAgICAgbWluVGltZSA9IGRlbHRhOwotICAgICAgfQotCi0gICAgICBpZiAoZGVsdGEgPiBtYXhUaW1lKSB7Ci0gICAgICAgIG1heFRpbWUgPSBkZWx0YTsKLSAgICAgIH0KLQotICAgICAgYXZlcmFnZVRpbWUrPSBkZWx0YTsKLSAgICB9Ci0KLSAgICBhdmVyYWdlVGltZSAvPSBjbGllbnRDb3VudDsKLQotCi0gICAgY291dCA8PCAgIndvcmtlcnMgOiIgPDwgd29ya2VyQ291bnQgPDwgIiwgY2xpZW50IDogIiA8PCBjbGllbnRDb3VudCA8PCAiLCBsb29wcyA6ICIgPDwgbG9vcENvdW50IDw8ICIsIHJhdGUgOiAiIDw8IChjbGllbnRDb3VudCAqIGxvb3BDb3VudCAqIDEwMDApIC8gKChkb3VibGUpKHRpbWUwMSAtIHRpbWUwMCkpIDw8IGVuZGw7Ci0KLSAgICBjb3VudF9tYXAgY291bnQgPSBzZXJ2aWNlSGFuZGxlci0+Z2V0Q291bnQoKTsKLSAgICBjb3VudF9tYXA6Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gY291bnQuYmVnaW4oKTsgaXRlciAhPSBjb3VudC5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICBwcmludGYoIiVzID0+ICVkXG4iLCBpdGVyLT5maXJzdCwgaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgY2VyciA8PCAiZG9uZS4iIDw8IGVuZGw7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9uYi1tYWluLmNwcCBiL3Rlc3QvY3BwL3NyYy9uYi1tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3NGE4MS4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9zcmMvbmItbWFpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9VdGlsLmg+Ci0jaW5jbHVkZSA8Y29uY3VycmVuY3kvTXV0ZXguaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxUTG9nZ2luZy5oPgotCi0jaW5jbHVkZSAiU2VydmljZS5oIgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotdXNpbmcgX19nbnVfY3h4OjpoYXNoX21hcDsKLXVzaW5nIF9fZ251X2N4eDo6aGFzaDsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotCi11c2luZyBuYW1lc3BhY2UgdGVzdDo6c3RyZXNzOwotCi1zdHJ1Y3QgZXFzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7Ci0gIH0KLX07Ci0KLXN0cnVjdCBsdHN0ciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOwotICB9Ci19OwotCi0KLS8vIHR5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIGludCwgaGFzaDxjb25zdCBjaGFyKj4sIGVxc3RyPiBjb3VudF9tYXA7Ci10eXBlZGVmIG1hcDxjb25zdCBjaGFyKiwgaW50LCBsdHN0cj4gY291bnRfbWFwOwotCi1jbGFzcyBTZXJ2ZXIgOiBwdWJsaWMgU2VydmljZUlmIHsKLSBwdWJsaWM6Ci0gIFNlcnZlcigpIHt9Ci0KLSAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKLSAgICBHdWFyZCBtKGxvY2tfKTsKLSAgICBpbnQgY3QgPSBjb3VudHNfW21ldGhvZF07Ci0gICAgY291bnRzX1ttZXRob2RdID0gKytjdDsKLSAgfQotCi0gIHZvaWQgZWNob1ZvaWQoKSB7Ci0gICAgY291bnQoImVjaG9Wb2lkIik7Ci0gICAgLy8gU2xlZXAgdG8gc2ltdWxhdGUgd29yawotICAgIHVzbGVlcCg1MDAwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjb3VudF9tYXAgZ2V0Q291bnQoKSB7Ci0gICAgR3VhcmQgbShsb2NrXyk7Ci0gICAgcmV0dXJuIGNvdW50c187Ci0gIH0KLQotICBpbnQ4X3QgZWNob0J5dGUoY29uc3QgaW50OF90IGFyZykge3JldHVybiBhcmc7fQotICBpbnQzMl90IGVjaG9JMzIoY29uc3QgaW50MzJfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIHZvaWQgZWNob1N0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZhcmcpIHsKLSAgICBpZiAoYXJnICE9ICJoZWxsbyIpIHsKLSAgICAgIFRfRVJST1JfQUJPUlQoIldST05HIFNUUklORyEhISEiKTsKLSAgICB9Ci0gICAgb3V0ID0gYXJnOwotICB9Ci0gIHZvaWQgZWNob0xpc3QodmVjdG9yPGludDhfdD4gJm91dCwgY29uc3QgdmVjdG9yPGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvU2V0KHNldDxpbnQ4X3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0gIHZvaWQgZWNob01hcChtYXA8aW50OF90LCBpbnQ4X3Q+ICZvdXQsIGNvbnN0IG1hcDxpbnQ4X3QsIGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLQotcHJpdmF0ZToKLSAgY291bnRfbWFwIGNvdW50c187Ci0gIE11dGV4IGxvY2tfOwotCi19OwotCi1jbGFzcyBDbGllbnRUaHJlYWQ6IHB1YmxpYyBSdW5uYWJsZSB7Ci1wdWJsaWM6Ci0KLSAgQ2xpZW50VGhyZWFkKHNoYXJlZF9wdHI8VFRyYW5zcG9ydD50cmFuc3BvcnQsIHNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gY2xpZW50LCBNb25pdG9yJiBtb25pdG9yLCBzaXplX3QmIHdvcmtlckNvdW50LCBzaXplX3QgbG9vcENvdW50LCBUVHlwZSBsb29wVHlwZSkgOgotICAgIF90cmFuc3BvcnQodHJhbnNwb3J0KSwKLSAgICBfY2xpZW50KGNsaWVudCksCi0gICAgX21vbml0b3IobW9uaXRvciksCi0gICAgX3dvcmtlckNvdW50KHdvcmtlckNvdW50KSwKLSAgICBfbG9vcENvdW50KGxvb3BDb3VudCksCi0gICAgX2xvb3BUeXBlKGxvb3BUeXBlKQotICB7fQotCi0gIHZvaWQgcnVuKCkgewotCi0gICAgLy8gV2FpdCBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIHN0YXJ0Ci0KLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICB3aGlsZShfd29ya2VyQ291bnQgPT0gMCkgewotICAgICAgICAgIF9tb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgX3RyYW5zcG9ydC0+b3BlbigpOwotCi0gICAgc3dpdGNoKF9sb29wVHlwZSkgewotICAgIGNhc2UgVF9WT0lEOiBsb29wRWNob1ZvaWQoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0JZVEU6IGxvb3BFY2hvQnl0ZSgpOyBicmVhazsKLSAgICBjYXNlIFRfSTMyOiBsb29wRWNob0kzMigpOyBicmVhazsKLSAgICBjYXNlIFRfSTY0OiBsb29wRWNob0k2NCgpOyBicmVhazsKLSAgICBjYXNlIFRfU1RSSU5HOiBsb29wRWNob1N0cmluZygpOyBicmVhazsKLSAgICBkZWZhdWx0OiBjZXJyIDw8ICJVbmV4cGVjdGVkIGxvb3AgdHlwZSIgPDwgX2xvb3BUeXBlIDw8IGVuZGw7IGJyZWFrOwotICAgIH0KLQotICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgIF90cmFuc3BvcnQtPmNsb3NlKCk7Ci0KLSAgICBfZG9uZSA9IHRydWU7Ci0KLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOwotCi0gICAgICBfd29ya2VyQ291bnQtLTsKLQotICAgICAgaWYgKF93b3JrZXJDb3VudCA9PSAwKSB7Ci0KLSAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob1ZvaWQoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIF9jbGllbnQtPmVjaG9Wb2lkKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob0J5dGUoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIGludDhfdCBhcmcgPSAxOwotICAgICAgaW50OF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0J5dGUoYXJnKTsKLSAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIGxvb3BFY2hvSTMyKCkgewotICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7Ci0gICAgICBpbnQzMl90IGFyZyA9IDE7Ci0gICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0kzMihhcmcpOwotICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgbG9vcEVjaG9JNjQoKSB7Ci0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKLSAgICAgIGludDY0X3QgYXJnID0gMTsKLSAgICAgIGludDY0X3QgcmVzdWx0OwotICAgICAgcmVzdWx0ID1fY2xpZW50LT5lY2hvSTY0KGFyZyk7Ci0gICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBsb29wRWNob1N0cmluZygpIHsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewotICAgICAgc3RyaW5nIGFyZyA9ICJoZWxsbyI7Ci0gICAgICBzdHJpbmcgcmVzdWx0OwotICAgICAgX2NsaWVudC0+ZWNob1N0cmluZyhyZXN1bHQsIGFyZyk7Ci0gICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IF9jbGllbnQ7Ci0gIE1vbml0b3ImIF9tb25pdG9yOwotICBzaXplX3QmIF93b3JrZXJDb3VudDsKLSAgc2l6ZV90IF9sb29wQ291bnQ7Ci0gIFRUeXBlIF9sb29wVHlwZTsKLSAgbG9uZyBsb25nIF9zdGFydFRpbWU7Ci0gIGxvbmcgbG9uZyBfZW5kVGltZTsKLSAgYm9vbCBfZG9uZTsKLSAgTW9uaXRvciBfc2xlZXA7Ci19OwotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotCi0gIGludCBwb3J0ID0gOTA5MTsKLSAgc3RyaW5nIHNlcnZlclR5cGUgPSAic2ltcGxlIjsKLSAgc3RyaW5nIHByb3RvY29sVHlwZSA9ICJiaW5hcnkiOwotICBzaXplX3Qgd29ya2VyQ291bnQgPSA0OwotICBzaXplX3QgY2xpZW50Q291bnQgPSAyMDsKLSAgc2l6ZV90IGxvb3BDb3VudCA9IDUwMDAwOwotICBUVHlwZSBsb29wVHlwZSAgPSBUX1ZPSUQ7Ci0gIHN0cmluZyBjYWxsTmFtZSA9ICJlY2hvVm9pZCI7Ci0gIGJvb2wgcnVuU2VydmVyID0gdHJ1ZTsKLSAgYm9vbCBsb2dSZXF1ZXN0cyA9IGZhbHNlOwotICBzdHJpbmcgcmVxdWVzdExvZ1BhdGggPSAiLi9yZXF1ZXN0bG9nLnRsb2ciOwotICBib29sIHJlcGxheVJlcXVlc3RzID0gZmFsc2U7Ci0KLSAgb3N0cmluZ3N0cmVhbSB1c2FnZTsKLQotICB1c2FnZSA8PAotICAgIGFyZ3ZbMF0gPDwgIiBbLS1wb3J0PTxwb3J0IG51bWJlcj5dIFstLXNlcnZlcl0gWy0tc2VydmVyLXR5cGU9PHNlcnZlci10eXBlPl0gWy0tcHJvdG9jb2wtdHlwZT08cHJvdG9jb2wtdHlwZT5dIFstLXdvcmtlcnM9PHdvcmtlci1jb3VudD5dIFstLWNsaWVudHM9PGNsaWVudC1jb3VudD5dIFstLWxvb3A9PGxvb3AtY291bnQ+XSIgPDwgZW5kbCA8PAotICAgICJcdGNsaWVudHMgICAgICAgIE51bWJlciBvZiBjbGllbnQgdGhyZWFkcyB0byBjcmVhdGUgLSAwIGltcGxpZXMgbm8gY2xpZW50cywgaS5lLiBzZXJ2ZXIgb25seS4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRDb3VudCA8PCBlbmRsIDw8Ci0gICAgIlx0aGVscCAgICAgICAgICAgUHJpbnRzIHRoaXMgaGVscCB0ZXh0LiIgPDwgZW5kbCA8PAotICAgICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbCA8PAotICAgICJcdGxvb3AgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcy4gIERlZmF1bHQgaXMgIiA8PCBsb29wQ291bnQgPDwgZW5kbCA8PAotICAgICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbCA8PAotICAgICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyIDw8IGVuZGwgPDwKLSAgICAiXHRzZXJ2ZXItdHlwZSAgICBUeXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiBvciBcInRocmVhZC1wb29sXCIuICBEZWZhdWx0IGlzICIgPDwgc2VydmVyVHlwZSA8PCBlbmRsIDw8Ci0gICAgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsIDw8Ci0gICAgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMgPDwgZW5kbCA8PAotICAgICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwgPDwKLSAgICAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZS4gIERlZmF1bHQgaXMgIiA8PCB3b3JrZXJDb3VudCA8PCBlbmRsOwotCi0KLSAgbWFwPHN0cmluZywgc3RyaW5nPiAgYXJnczsKLQotICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgewotCi0gICAgc3RyaW5nIGFyZyhhcmd2W2l4XSk7Ci0KLSAgICBpZiAoYXJnLmNvbXBhcmUoMCwyLCAiLS0iKSA9PSAwKSB7Ci0KLSAgICAgIHNpemVfdCBlbmQgPSBhcmcuZmluZF9maXJzdF9vZigiPSIsIDIpOwotCi0gICAgICBzdHJpbmcga2V5ID0gc3RyaW5nKGFyZywgMiwgZW5kIC0gMik7Ci0KLSAgICAgIGlmIChlbmQgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGFyZ3Nba2V5XSA9IHN0cmluZyhhcmcsIGVuZCArIDEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXJnc1trZXldID0gInRydWUiOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIithcmcpOwotICAgIH0KLSAgfQotCi0gIHRyeSB7Ci0KLSAgICBpZiAoIWFyZ3NbImNsaWVudHMiXS5lbXB0eSgpKSB7Ci0gICAgICBjbGllbnRDb3VudCA9IGF0b2koYXJnc1siY2xpZW50cyJdLmNfc3RyKCkpOwotICAgIH0KLQotICAgIGlmICghYXJnc1siaGVscCJdLmVtcHR5KCkpIHsKLSAgICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbImxvb3AiXS5lbXB0eSgpKSB7Ci0gICAgICBsb29wQ291bnQgPSBhdG9pKGFyZ3NbImxvb3AiXS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbImNhbGwiXS5lbXB0eSgpKSB7Ci0gICAgICBjYWxsTmFtZSA9IGFyZ3NbImNhbGwiXTsKLSAgICB9Ci0KLSAgICBpZiAoIWFyZ3NbInBvcnQiXS5lbXB0eSgpKSB7Ci0gICAgICBwb3J0ID0gYXRvaShhcmdzWyJwb3J0Il0uY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJzZXJ2ZXIiXS5lbXB0eSgpKSB7Ci0gICAgICBydW5TZXJ2ZXIgPSBhcmdzWyJzZXJ2ZXIiXSA9PSAidHJ1ZSI7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJsb2ctcmVxdWVzdCJdLmVtcHR5KCkpIHsKLSAgICAgIGxvZ1JlcXVlc3RzID0gYXJnc1sibG9nLXJlcXVlc3QiXSA9PSAidHJ1ZSI7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJyZXBsYXktcmVxdWVzdCJdLmVtcHR5KCkpIHsKLSAgICAgIHJlcGxheVJlcXVlc3RzID0gYXJnc1sicmVwbGF5LXJlcXVlc3QiXSA9PSAidHJ1ZSI7Ci0gICAgfQotCi0gICAgaWYgKCFhcmdzWyJzZXJ2ZXItdHlwZSJdLmVtcHR5KCkpIHsKLSAgICAgIHNlcnZlclR5cGUgPSBhcmdzWyJzZXJ2ZXItdHlwZSJdOwotICAgIH0KLQotICAgIGlmICghYXJnc1sid29ya2VycyJdLmVtcHR5KCkpIHsKLSAgICAgIHdvcmtlckNvdW50ID0gYXRvaShhcmdzWyJ3b3JrZXJzIl0uY19zdHIoKSk7Ci0gICAgfQotCi0gIH0gY2F0Y2goZXhjZXB0aW9uJiBlKSB7Ci0gICAgY2VyciA8PCBlLndoYXQoKSA8PCBlbmRsOwotICAgIGNlcnIgPDwgdXNhZ2U7Ci0gIH0KLQotICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotCi0gIC8vIERpc3BhdGNoZXIKLSAgc2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7Ci0KLSAgaWYgKHJlcGxheVJlcXVlc3RzKSB7Ci0gICAgc2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7Ci0KLSAgICAvLyBUcmFuc3BvcnRzCi0gICAgc2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKLSAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKLSAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKLSAgICBmaWxlVHJhbnNwb3J0LT5zZWVrVG9FbmQoKTsKLQotICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLQotICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUcmFuc3BvcnQpOwotCi0gICAgZmlsZVByb2Nlc3Nvci5wcm9jZXNzKDAsIHRydWUpOwotICAgIGV4aXQoMCk7Ci0gIH0KLQotCi0gIGlmIChydW5TZXJ2ZXIpIHsKLQotICAgIHNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwotCi0gICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwotCi0gICAgLy8gVHJhbnNwb3J0IEZhY3RvcnkKLSAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiAgICAgIHRyYW5zcG9ydEZhY3Rvcnk7Ci0KLSAgICBpZiAobG9nUmVxdWVzdHMpIHsKLSAgICAgIC8vIGluaXRpYWxpemUgdGhlIGxvZyBmaWxlCi0gICAgICBzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwotICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7Ci0gICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKLQotICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9Ci0gICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKLSAgICB9Ci0KLSAgICBzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkOwotICAgIHNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQyOwotCi0gICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKLQotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQpKSk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQrMSkpKTsKLQotICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7Ci0KLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwotCi0gICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwotICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKLSAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0LCB0aHJlYWRNYW5hZ2VyKSkpOwotICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0KzEsIHRocmVhZE1hbmFnZXIpKSk7Ci0gICAgfQotCi0gICAgY2VyciA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgPDwgcG9ydCA8PCAiIGFuZCAiIDw8IChwb3J0ICsgMSkgPDwgZW5kbDsKLSAgICBzZXJ2ZXJUaHJlYWQtPnN0YXJ0KCk7Ci0gICAgc2VydmVyVGhyZWFkMi0+c3RhcnQoKTsKLQotICAgIC8vIElmIHdlIGFyZW4ndCBydW5uaW5nIGNsaWVudHMsIGp1c3Qgd2FpdCBmb3JldmVyIGZvciBleHRlcm5hbCBjbGllbnRzCi0KLSAgICBpZiAoY2xpZW50Q291bnQgPT0gMCkgewotICAgICAgc2VydmVyVGhyZWFkLT5qb2luKCk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyLT5qb2luKCk7Ci0gICAgfQotICB9Ci0gIHNsZWVwKDEpOwotCi0gIGlmIChjbGllbnRDb3VudCA+IDApIHsKLQotICAgIE1vbml0b3IgbW9uaXRvcjsKLQotICAgIHNpemVfdCB0aHJlYWRDb3VudCA9IDA7Ci0KLSAgICBzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKLQotICAgIGlmIChjYWxsTmFtZSA9PSAiZWNob1ZvaWQiKSB7IGxvb3BUeXBlID0gVF9WT0lEO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7IGxvb3BUeXBlID0gVF9CWVRFO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0kzMiIpIHsgbG9vcFR5cGUgPSBUX0kzMjt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JNjQiKSB7IGxvb3BUeXBlID0gVF9JNjQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeyBsb29wVHlwZSA9IFRfU1RSSU5HO30KLSAgICBlbHNlIHt0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZpY2UgY2FsbCAiK2NhbGxOYW1lKTt9Ci0KLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKLQotICAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQgKyAoaXggJSAyKSkpOwotICAgICAgc2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiBmcmFtZWRTb2NrZXQobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChmcmFtZWRTb2NrZXQpKTsKLSAgICAgIHNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOwotCi0gICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KG5ldyBDbGllbnRUaHJlYWQoc29ja2V0LCBzZXJ2aWNlQ2xpZW50LCBtb25pdG9yLCB0aHJlYWRDb3VudCwgbG9vcENvdW50LCBsb29wVHlwZSkpKSk7Ci0gICAgfQotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgdGhyZWFkKyspIHsKLSAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKLSAgICB9Ci0KLSAgICBsb25nIGxvbmcgdGltZTAwOwotICAgIGxvbmcgbG9uZyB0aW1lMDE7Ci0KLSAgICB7U3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0gICAgICB0aHJlYWRDb3VudCA9IGNsaWVudENvdW50OwotCi0gICAgICBjZXJyIDw8ICJMYXVuY2ggIjw8IGNsaWVudENvdW50IDw8ICIgY2xpZW50IHRocmVhZHMiIDw8IGVuZGw7Ci0KLSAgICAgIHRpbWUwMCA9ICBVdGlsOjpjdXJyZW50VGltZSgpOwotCi0gICAgICBtb25pdG9yLm5vdGlmeUFsbCgpOwotCi0gICAgICB3aGlsZSh0aHJlYWRDb3VudCA+IDApIHsKLSAgICAgICAgbW9uaXRvci53YWl0KCk7Ci0gICAgICB9Ci0KLSAgICAgIHRpbWUwMSA9ICBVdGlsOjpjdXJyZW50VGltZSgpOwotICAgIH0KLQotICAgIGxvbmcgbG9uZyBmaXJzdFRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7Ci0gICAgbG9uZyBsb25nIGxhc3RUaW1lID0gMDsKLQotICAgIGRvdWJsZSBhdmVyYWdlVGltZSA9IDA7Ci0gICAgbG9uZyBsb25nIG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7Ci0gICAgbG9uZyBsb25nIG1heFRpbWUgPSAwOwotCi0gICAgZm9yIChzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOyBpeCsrKSB7Ci0KLSAgICAgIHNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKLQotICAgICAgbG9uZyBsb25nIGRlbHRhID0gY2xpZW50LT5fZW5kVGltZSAtIGNsaWVudC0+X3N0YXJ0VGltZTsKLQotICAgICAgYXNzZXJ0KGRlbHRhID4gMCk7Ci0KLSAgICAgIGlmIChjbGllbnQtPl9zdGFydFRpbWUgPCBmaXJzdFRpbWUpIHsKLSAgICAgICAgZmlyc3RUaW1lID0gY2xpZW50LT5fc3RhcnRUaW1lOwotICAgICAgfQotCi0gICAgICBpZiAoY2xpZW50LT5fZW5kVGltZSA+IGxhc3RUaW1lKSB7Ci0gICAgICAgIGxhc3RUaW1lID0gY2xpZW50LT5fZW5kVGltZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlbHRhIDwgbWluVGltZSkgewotICAgICAgICBtaW5UaW1lID0gZGVsdGE7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWx0YSA+IG1heFRpbWUpIHsKLSAgICAgICAgbWF4VGltZSA9IGRlbHRhOwotICAgICAgfQotCi0gICAgICBhdmVyYWdlVGltZSs9IGRlbHRhOwotICAgIH0KLQotICAgIGF2ZXJhZ2VUaW1lIC89IGNsaWVudENvdW50OwotCi0KLSAgICBjb3V0IDw8ICAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKLQotICAgIGNvdW50X21hcCBjb3VudCA9IHNlcnZpY2VIYW5kbGVyLT5nZXRDb3VudCgpOwotICAgIGNvdW50X21hcDo6aXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBjb3VudC5iZWdpbigpOyBpdGVyICE9IGNvdW50LmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJXMgPT4gJWRcbiIsIGl0ZXItPmZpcnN0LCBpdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgICBjZXJyIDw8ICJkb25lLiIgPDwgZW5kbDsKLSAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9fX2luaXRfXy5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYjgzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKQEAgLTAsMCArMSwyMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLnRlc3QgaW1wb3J0IHRlc3RfbmFtZSAgIyBub3FhCitmcm9tIC5jb2xsZWN0IGltcG9ydCBjb2xsZWN0X2Nyb3NzX3Rlc3RzLCBjb2xsZWN0X2ZlYXR1cmVfdGVzdHMgICMgbm9xYQorZnJvbSAucnVuIGltcG9ydCBUZXN0RGlzcGF0Y2hlciAgIyBub3FhCitmcm9tIC5yZXBvcnQgaW1wb3J0IGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzLCBsb2FkX2tub3duX2ZhaWx1cmVzICAjIG5vcWEKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQ4OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9jb2xsZWN0LnB5CkBAIC0wLDAgKzEsMTY0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmUKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBwcm9kdWN0CisKK2Zyb20gLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QKK2Zyb20gLnRlc3QgaW1wb3J0IFRlc3RFbnRyeQorCisjIFRob3NlIGtleXMgYXJlIHBhc3NlZCB0byBleGVjdXRpb24gYXMgaXMuCisjIE5vdGUgdGhhdCB0aGVyZSBhcmUga2V5cyBvdGhlciB0aGFuIHRoZXNlLCBuYW1lbHk6CisjIGRlbGF5OiBBZnRlciBzZXJ2ZXIgaXMgc3RhcnRlZCwgY2xpZW50IHN0YXJ0IGlzIGRlbGF5ZWQgZm9yIHRoZSB2YWx1ZQorIyAoc2Vjb25kcykuCisjIHRpbWVvdXQ6IFRlc3QgdGltZW91dCBhZnRlciBjbGllbnQgaXMgc3RhcnRlZCAoc2Vjb25kcykuCisjIHBsYXRmb3JtczogU3VwcG9ydGVkIHBsYXRmb3Jtcy4gU2hvdWxkIG1hdGNoIHBsYXRmb3JtLnN5c3RlbSgpIHZhbHVlLgorIyBwcm90b2NvbHM6IGxpc3Qgb2Ygc3VwcG9ydGVkIHByb3RvY29scworIyB0cmFuc3BvcnRzOiBsaXN0IG9mIHN1cHBvcnRlZCB0cmFuc3BvcnRzCisjIHNvY2tldHM6IGxpc3Qgb2Ygc3VwcG9ydGVkIHNvY2tldHMKKyMKKyMgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnRzIGVudHJpZXMgY2FuIGJlIGNvbG9uIHNlcGFyYXRlZCAic3BlYzppbXBsIiBwYWlyCisjIChlLmcuIGJpbmFyeTphY2NlbCkgd2hlcmUgdGVzdCBpcyBydW4gZm9yIGFueSBtYXRjaGluZyAic3BlYyIgd2hpbGUgYWN0dWFsCisjIGFyZ3VtZW50IHBhc3NlZCB0byB0ZXN0IGV4ZWN1dGFibGUgaXMgImltcGwiLgorIyBPdGhlcndpc2UgInNwZWMiIGlzIGVxdWl2YWxlbnQgdG8gInNwZWM6c3BlYyIgcGFpci4KKyMgKGUuZy4gImJpbmFyeSIgaXMgZXF1aXZhbGVudCB0byAiYmluYXJ5OmJpbmFyeSIgaW4gdGVzdHMuanNvbikKKyMKK1ZBTElEX0pTT05fS0VZUyA9IFsKKyAgICAnbmFtZScsICAjIG5hbWUgb2YgdGhlIGxpYnJhcnksIHR5cGljYWxseSBhIGxhbmd1YWdlIG5hbWUKKyAgICAnd29ya2RpcicsICAjIHdvcmsgZGlyZWN0b3J5IHdoZXJlIGNvbW1hbmQgaXMgZXhlY3V0ZWQKKyAgICAnY29tbWFuZCcsICAjIHRlc3QgY29tbWFuZAorICAgICdleHRyYV9hcmdzJywgICMgYXJncyBhcHBlbmRlZCB0byBjb21tYW5kIGFmdGVyIG90aGVyIGFyZ3MgYXJlIGFwcGVuZGVkCisgICAgJ3JlbW90ZV9hcmdzJywgICMgYXJncyBhZGRlZCB0byB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcHJvZ3JhbQorICAgICdqb2luX2FyZ3MnLCAgIyB3aGV0aGVyIGFyZ3Mgc2hvdWxkIGJlIHBhc3NlZCBhcyBzaW5nbGUgY29uY2F0ZW5hdGVkIHN0cmluZworICAgICdlbnYnLCAgIyBhZGRpdGlvbmFsIGVudmlyb25tZW50YWwgdmFyaWFibGUKK10KKworREVGQVVMVF9NQVhfREVMQVkgPSA1CitERUZBVUxUX1NJR05BTCA9IDEKK0RFRkFVTFRfVElNRU9VVCA9IDUKKworCitkZWYgX2NvbGxlY3RfdGVzdGxpYnMoY29uZmlnLCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaD1bTm9uZV0pOgorICAgICIiIkNvbGxlY3RzIHNlcnZlci9jbGllbnQgY29uZmlndXJhdGlvbnMgZnJvbSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb25zIiIiCisgICAgZGVmIGV4cGFuZF9saWJzKGNvbmZpZyk6CisgICAgICAgIGZvciBsaWIgaW4gY29uZmlnOgorICAgICAgICAgICAgc3YgPSBsaWIucG9wKCdzZXJ2ZXInLCBOb25lKQorICAgICAgICAgICAgY2wgPSBsaWIucG9wKCdjbGllbnQnLCBOb25lKQorICAgICAgICAgICAgeWllbGQgbGliLCBzdiwgY2wKKworICAgIGRlZiB5aWVsZF90ZXN0bGlicyhiYXNlX2NvbmZpZ3MsIGNvbmZpZ3MsIG1hdGNoKToKKyAgICAgICAgZm9yIGJhc2UsIGNvbmYgaW4gemlwKGJhc2VfY29uZmlncywgY29uZmlncyk6CisgICAgICAgICAgICBpZiBjb25mOgorICAgICAgICAgICAgICAgIGlmIG5vdCBtYXRjaCBvciBiYXNlWyduYW1lJ10gaW4gbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtcyA9IGNvbmYuZ2V0KCdwbGF0Zm9ybXMnKSBvciBiYXNlLmdldCgncGxhdGZvcm1zJykKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHBsYXRmb3JtcyBvciBwbGF0Zm9ybS5zeXN0ZW0oKSBpbiBwbGF0Zm9ybXM6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBtZXJnZV9kaWN0KGJhc2UsIGNvbmYpCisKKyAgICBsaWJzLCBzdnMsIGNscyA9IHppcCgqZXhwYW5kX2xpYnMoY29uZmlnKSkKKyAgICBzZXJ2ZXJzID0gbGlzdCh5aWVsZF90ZXN0bGlicyhsaWJzLCBzdnMsIHNlcnZlcl9tYXRjaCkpCisgICAgY2xpZW50cyA9IGxpc3QoeWllbGRfdGVzdGxpYnMobGlicywgY2xzLCBjbGllbnRfbWF0Y2gpKQorICAgIHJldHVybiBzZXJ2ZXJzLCBjbGllbnRzCisKKworZGVmIGNvbGxlY3RfZmVhdHVyZXMoY29uZmlnLCBtYXRjaCk6CisgICAgcmVzID0gbGlzdChtYXAocmUuY29tcGlsZSwgbWF0Y2gpKQorICAgIHJldHVybiBsaXN0KGZpbHRlcihsYW1iZGEgYzogYW55KG1hcChsYW1iZGEgcjogci5zZWFyY2goY1snbmFtZSddKSwgcmVzKSksIGNvbmZpZykpCisKKworZGVmIF9kb19jb2xsZWN0X3Rlc3RzKHNlcnZlcnMsIGNsaWVudHMpOgorICAgIGRlZiBpbnRlcnNlY3Rpb24oa2V5LCBvMSwgbzIpOgorICAgICAgICAiIiJpbnRlcnNlY3Rpb24gb2YgdHdvIGNvbGxlY3Rpb25zLgorICAgICAgICBjb2xsZWN0aW9ucyBhcmUgcmVwbGFjZWQgd2l0aCBzZXRzIHRoZSBmaXJzdCB0aW1lIiIiCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8sIGtleSk6CisgICAgICAgICAgICB2ID0gb1trZXldCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBzZXQpOgorICAgICAgICAgICAgICAgIHYgPSBzZXQodikKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gY2FjaGVkX3NldChvMSwga2V5KSAmIGNhY2hlZF9zZXQobzIsIGtleSkKKworICAgIGRlZiBpbnRlcnNlY3Rfd2l0aF9zcGVjKGtleSwgbzEsIG8yKToKKyAgICAgICAgIyBzdG9yZSBhcyBzZXQgb2YgKHNwZWMsIGltcGwpIHR1cGxlCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8pOgorICAgICAgICAgICAgZGVmIHRvX3NwZWNfaW1wbF90dXBsZXModmFsdWVzKToKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIHNwZWMsIF8sIGltcGwgPSB2LnBhcnRpdGlvbignOicpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNwZWMsIGltcGwgb3Igc3BlYworICAgICAgICAgICAgdiA9IG9ba2V5XQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKKyAgICAgICAgICAgICAgICB2ID0gc2V0KHRvX3NwZWNfaW1wbF90dXBsZXMoc2V0KHYpKSkKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICBmb3Igc3BlYzEsIGltcGwxIGluIGNhY2hlZF9zZXQobzEpOgorICAgICAgICAgICAgZm9yIHNwZWMyLCBpbXBsMiBpbiBjYWNoZWRfc2V0KG8yKToKKyAgICAgICAgICAgICAgICBpZiBzcGVjMSA9PSBzcGVjMjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGltcGwxIGlmIGltcGwxID09IGltcGwyIGVsc2UgJyVzLSVzJyAlIChpbXBsMSwgaW1wbDIpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUsIGltcGwxLCBpbXBsMgorCisgICAgZGVmIG1heWJlX21heChrZXksIG8xLCBvMiwgZGVmYXVsdCk6CisgICAgICAgICIiIm1heGltdW0gb2YgdHdvIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZhdWx0IHZhbHVlIiIiCisgICAgICAgIHYxID0gbzEuZ2V0KGtleSkKKyAgICAgICAgdjIgPSBvMi5nZXQoa2V5KQorICAgICAgICByZXR1cm4gbWF4KHYxLCB2MikgaWYgdjEgYW5kIHYyIGVsc2UgdjEgb3IgdjIgb3IgZGVmYXVsdAorCisgICAgZGVmIGZpbHRlcl93aXRoX3ZhbGlka2V5cyhvKToKKyAgICAgICAgcmV0ID0ge30KKyAgICAgICAgZm9yIGtleSBpbiBWQUxJRF9KU09OX0tFWVM6CisgICAgICAgICAgICBpZiBrZXkgaW4gbzoKKyAgICAgICAgICAgICAgICByZXRba2V5XSA9IG9ba2V5XQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgbWVyZ2VfbWV0YWRhdGEobywgKipyZXQpOgorICAgICAgICBmb3Iga2V5IGluIFZBTElEX0pTT05fS0VZUzoKKyAgICAgICAgICAgIGlmIGtleSBpbiBvOgorICAgICAgICAgICAgICAgIHJldFtrZXldID0gb1trZXldCisgICAgICAgIHJldHVybiByZXQKKworICAgIGZvciBzdiwgY2wgaW4gcHJvZHVjdChzZXJ2ZXJzLCBjbGllbnRzKToKKyAgICAgICAgZm9yIHByb3RvLCBwcm90bzEsIHByb3RvMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCdwcm90b2NvbHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgZm9yIHRyYW5zLCB0cmFuczEsIHRyYW5zMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCd0cmFuc3BvcnRzJywgc3YsIGNsKToKKyAgICAgICAgICAgICAgICBmb3Igc29jayBpbiBpbnRlcnNlY3Rpb24oJ3NvY2tldHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB7CisgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyJzogbWVyZ2VfbWV0YWRhdGEoc3YsICoqeydwcm90b2NvbCc6IHByb3RvMSwgJ3RyYW5zcG9ydCc6IHRyYW5zMX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWVudCc6IG1lcmdlX21ldGFkYXRhKGNsLCAqKnsncHJvdG9jb2wnOiBwcm90bzIsICd0cmFuc3BvcnQnOiB0cmFuczJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdkZWxheSc6IG1heWJlX21heCgnZGVsYXknLCBzdiwgY2wsIERFRkFVTFRfTUFYX0RFTEFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdG9wX3NpZ25hbCc6IG1heWJlX21heCgnc3RvcF9zaWduYWwnLCBzdiwgY2wsIERFRkFVTFRfU0lHTkFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lb3V0JzogbWF5YmVfbWF4KCd0aW1lb3V0Jywgc3YsIGNsLCBERUZBVUxUX1RJTUVPVVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvY29sJzogcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNwb3J0JzogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAnc29ja2V0Jzogc29jaworICAgICAgICAgICAgICAgICAgICB9CisKKworZGVmIF9maWx0ZXJfZW50cmllcyh0ZXN0cywgcmVnZXgpOgorICAgIGlmIHJlZ2V4OgorICAgICAgICByZXR1cm4gZmlsdGVyKGxhbWJkYSB0OiByZS5zZWFyY2gocmVnZXgsIFRlc3RFbnRyeS5nZXRfbmFtZSgqKnQpKSwgdGVzdHMpCisgICAgcmV0dXJuIHRlc3RzCisKKworZGVmIGNvbGxlY3RfY3Jvc3NfdGVzdHModGVzdHNfZGljdCwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KToKKyAgICBzdiwgY2wgPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKKyAgICByZXR1cm4gbGlzdChfZmlsdGVyX2VudHJpZXMoX2RvX2NvbGxlY3RfdGVzdHMoc3YsIGNsKSwgcmVnZXgpKQorCisKK2RlZiBjb2xsZWN0X2ZlYXR1cmVfdGVzdHModGVzdHNfZGljdCwgZmVhdHVyZXNfZGljdCwgc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCByZWdleCk6CisgICAgc3YsIF8gPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gpCisgICAgZnQgPSBjb2xsZWN0X2ZlYXR1cmVzKGZlYXR1cmVzX2RpY3QsIGZlYXR1cmVfbWF0Y2gpCisgICAgcmV0dXJuIGxpc3QoX2ZpbHRlcl9lbnRyaWVzKF9kb19jb2xsZWN0X3Rlc3RzKHN2LCBmdCksIHJlZ2V4KSkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYTkxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5CkBAIC0wLDAgKzEsMjQgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgX0VOQ09ERSA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorCisgICAgZGVmIHBhdGhfam9pbigqYXJncyk6CisgICAgICAgIGJpbl9hcmdzID0gbWFwKGxhbWJkYSBhOiBhLmRlY29kZShfRU5DT0RFKSwgYXJncykKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqYmluX2FyZ3MpLmVuY29kZShfRU5DT0RFKQorCisgICAgZGVmIHN0cl9qb2luKHMsIGwpOgorICAgICAgICBiaW5fYXJncyA9IG1hcChsYW1iZGEgYTogYS5kZWNvZGUoX0VOQ09ERSksIGwpCisgICAgICAgIGIgPSBzLmRlY29kZShfRU5DT0RFKQorICAgICAgICByZXR1cm4gYi5qb2luKGJpbl9hcmdzKS5lbmNvZGUoX0VOQ09ERSkKKworICAgIGxvZ2ZpbGVfb3BlbiA9IG9wZW4KKworZWxzZToKKworICAgIHBhdGhfam9pbiA9IG9zLnBhdGguam9pbgorICAgIHN0cl9qb2luID0gc3RyLmpvaW4KKworICAgIGRlZiBsb2dmaWxlX29wZW4oKmFyZ3MpOgorICAgICAgICByZXR1cm4gb3BlbigqYXJncywgZXJyb3JzPSdyZXBsYWNlJykKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9yZXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhZjE2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5CkBAIC0wLDAgKzEsNDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQganNvbgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNrCisKK2Zyb20gLmNvbXBhdCBpbXBvcnQgbG9nZmlsZV9vcGVuLCBwYXRoX2pvaW4sIHN0cl9qb2luCitmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKKworTE9HX0RJUiA9ICdsb2cnCitSRVNVTFRfSFRNTCA9ICdpbmRleC5odG1sJworUkVTVUxUX0pTT04gPSAncmVzdWx0cy5qc29uJworRkFJTF9KU09OID0gJ2tub3duX2ZhaWx1cmVzXyVzLmpzb24nCisKKworZGVmIGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIsIG92ZXJ3cml0ZSwgc2F2ZSwgb3V0KToKKyAgICBkZWYgY29sbGVjdF9mYWlsdXJlcyhyZXN1bHRzKToKKyAgICAgICAgc3VjY2Vzc19pbmRleCA9IDUKKyAgICAgICAgZm9yIHIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIGlmIG5vdCByW3N1Y2Nlc3NfaW5kZXhdOgorICAgICAgICAgICAgICAgIHlpZWxkIFRlc3RFbnRyeS5nZXRfbmFtZSgqcikKKyAgICB0cnk6CisgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGhfam9pbih0ZXN0ZGlyLCBSRVNVTFRfSlNPTiksICdyJykgYXMgZnA6CisgICAgICAgICAgICByZXN1bHRzID0ganNvbi5sb2FkKGZwKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdVbmFibGUgdG8gbG9hZCBsYXN0IHJlc3VsdC4gRGlkIHlvdSBydW4gdGVzdHMgP1xuJykKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZmFpbHMgPSBjb2xsZWN0X2ZhaWx1cmVzKHJlc3VsdHNbJ3Jlc3VsdHMnXSkKKyAgICBpZiBub3Qgb3ZlcndyaXRlOgorICAgICAgICBrbm93biA9IGxvYWRfa25vd25fZmFpbHVyZXModGVzdGRpcikKKyAgICAgICAga25vd24uZXh0ZW5kKGZhaWxzKQorICAgICAgICBmYWlscyA9IGtub3duCisgICAgZmFpbHNfanNvbiA9IGpzb24uZHVtcHMoc29ydGVkKHNldChmYWlscykpLCBpbmRlbnQ9Miwgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSkKKyAgICBpZiBzYXZlOgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3Blbihvcy5wYXRoLmpvaW4odGVzdGRpciwgRkFJTF9KU09OICUgcGxhdGZvcm0uc3lzdGVtKCkpLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGZhaWxzX2pzb24pCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1N1Y2Nlc3NmdWxseSB1cGRhdGVkIGtub3duIGZhaWx1cmVzLlxuJykKKyAgICBpZiBvdXQ6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoZmFpbHNfanNvbikKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQorICAgIHJldHVybiBUcnVlCisKKworZGVmIGxvYWRfa25vd25fZmFpbHVyZXModGVzdGRpcik6CisgICAgdHJ5OgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoX2pvaW4odGVzdGRpciwgRkFJTF9KU09OICUgcGxhdGZvcm0uc3lzdGVtKCkpLCAncicpIGFzIGZwOgorICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmcCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuIFtdCisKKworY2xhc3MgVGVzdFJlcG9ydGVyKG9iamVjdCk6CisgICAgIyBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCBsaWJyYXJ5IGRvZXNuJ3QgaGFuZGxlIHRpbWV6b25lIHdlbGwKKyAgICAjIERBVEVUSU1FX0ZPUk1BVCA9ICclYSAlYiAlZCAlSDolTTolUyAlWiAlWScKKyAgICBEQVRFVElNRV9GT1JNQVQgPSAnJWEgJWIgJWQgJUg6JU06JVMgJVknCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZXN0X2xvZ2ZpbGUoY2xzLCB0ZXN0X25hbWUsIHByb2dfa2luZCwgZGlyPU5vbmUpOgorICAgICAgICByZWxwYXRoID0gcGF0aF9qb2luKCdsb2cnLCAnJXNfJXMubG9nJyAlICh0ZXN0X25hbWUsIHByb2dfa2luZCkpCisgICAgICAgIHJldHVybiByZWxwYXRoIGlmIG5vdCBkaXIgZWxzZSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhfam9pbihkaXIsIHJlbHBhdGgpKQorCisgICAgZGVmIF9zdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5fc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2VsYXBzZWQoc2VsZik6CisgICAgICAgIHJldHVybiB0aW1lLnRpbWUoKSAtIHNlbGYuX3N0YXJ0X3RpbWUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZm9ybWF0X2RhdGUoY2xzKToKKyAgICAgICAgcmV0dXJuICclcycgJSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZShjbHMuREFURVRJTUVfRk9STUFUKQorCisgICAgZGVmIF9wcmludF9kYXRlKHNlbGYpOgorICAgICAgICBwcmludChzZWxmLl9mb3JtYXRfZGF0ZSgpLCBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIF9wcmludF9iYXIoc2VsZiwgb3V0PU5vbmUpOgorICAgICAgICBwcmludCgKKyAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09JywKKyAgICAgICAgICAgIGZpbGU9KG91dCBvciBzZWxmLm91dCkpCisKKyAgICBkZWYgX3ByaW50X2V4ZWNfdGltZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ1Rlc3QgZXhlY3V0aW9uIHRvb2sgezouMWZ9IHNlY29uZHMuJy5mb3JtYXQoc2VsZi5fZWxhcHNlZCksIGZpbGU9c2VsZi5vdXQpCisKKworY2xhc3MgRXhlY1JlcG9ydGVyKFRlc3RSZXBvcnRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHRlc3QsIHByb2cpOgorICAgICAgICBzdXBlcihFeGVjUmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fdGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5fcHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi5sb2dwYXRoID0gc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCBwcm9nLmtpbmQsIHRlc3RkaXIpCisgICAgICAgIHNlbGYub3V0ID0gTm9uZQorCisgICAgZGVmIGJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLl9zdGFydCgpCisgICAgICAgIHNlbGYuX29wZW4oKQorICAgICAgICBpZiBzZWxmLm91dCBhbmQgbm90IHNlbGYub3V0LmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2hlYWRlcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorCisgICAgZGVmIGVuZChzZWxmLCByZXR1cm5jb2RlKToKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRfZm9vdGVyKHJldHVybmNvZGUpCisgICAgICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYub3V0ID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBraWxsZWQoc2VsZik6CisgICAgICAgIHByaW50KGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdTZXJ2ZXIgcHJvY2VzcyBpcyBzdWNjZXNzZnVsbHkga2lsbGVkLicsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuZW5kKE5vbmUpCisKKyAgICBkZWYgZGllZChzZWxmKToKKyAgICAgICAgcHJpbnQoZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJyoqKiBTZXJ2ZXIgcHJvY2VzcyBoYXMgZGllZCB1bmV4cGVjdGVkbHkgKioqJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5lbmQoTm9uZSkKKworICAgIF9pbml0X2ZhaWx1cmVfZXhwcnMgPSB7CisgICAgICAgICdzZXJ2ZXInOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCisgICAgICAgICAgICAnW0FhXWRkcmVzcyBhbHJlYWR5IGluIHVzZScsCisgICAgICAgICAgICAnQ291bGQgbm90IGJpbmQnLAorICAgICAgICAgICAgJ0VBRERSSU5VU0UnLAorICAgICAgICBdKSksCisgICAgICAgICdjbGllbnQnOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCisgICAgICAgICAgICAnW0NjXW9ubmVjdGlvbiByZWZ1c2VkJywKKyAgICAgICAgICAgICdDb3VsZCBub3QgY29ubmVjdCB0bycsCisgICAgICAgICAgICAnQ291bGQgbm90IG9wZW4gVU5JWCAnLCAgICAgICAjIGRvbWFpbiBzb2NrZXQgKHJiKQorICAgICAgICAgICAgJ0VDT05OUkVGVVNFRCcsCisgICAgICAgICAgICAnZWNvbm5yZWZ1c2VkJywgICAgICAgICAgICAgICAjIGVybAorICAgICAgICAgICAgJ0NPTk5FQ1RJT04tUkVGVVNFRC1FUlJPUicsICAgIyBjbAorICAgICAgICAgICAgJ2Nvbm5lY3QgRU5PRU5UJywgICAgICAgICAgICAgIyBub2RlanMgZG9tYWluIHNvY2tldAorICAgICAgICAgICAgJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknLCAgIyBkb21haW4gc29ja2V0CisgICAgICAgICAgICAnU29ja2V0cy5UY3BDbGllbnQuQ29ubmVjdCcsICAjIGNzaGFycAorICAgICAgICBdKSksCisgICAgfQorCisgICAgZGVmIG1heWJlX2ZhbHNlX3Bvc2l0aXZlKHNlbGYpOgorICAgICAgICAiIiJTZWFyY2hlcyB0aHJvdWdoIGxvZyBmaWxlIGZvciBzb2NrZXQgYmluZCBlcnJvci4KKyAgICAgICAgUmV0dXJucyBUcnVlIGlmIHN1c3BpY2lvdXMgZXhwcmVzc2lvbiBpcyBmb3VuZCwgb3RoZXJ3aXNlIEZhbHNlIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYub3V0IGFuZCBub3Qgc2VsZi5vdXQuY2xvc2VkOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKKyAgICAgICAgICAgIGV4cHJzID0gc2VsZi5faW5pdF9mYWlsdXJlX2V4cHJzW3NlbGYuX3Byb2cua2luZF0KKworICAgICAgICAgICAgZGVmIG1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgIGZvciBleHByIGluIGV4cHJzOgorICAgICAgICAgICAgICAgICAgICBpZiBleHByLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCJtYXliZSBmYWxzZSBwb3NpdGl2ZTogJXMiICUgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHNlbGYubG9ncGF0aCwgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBpZiBhbnkobWFwKG1hdGNoLCBmcCkpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLl9sb2cud2FybignWyVzXTogRXJyb3Igd2hpbGUgZGV0ZWN0aW5nIGZhbHNlIHBvc2l0aXZlOiAlcycgJSAoc2VsZi5fdGVzdC5uYW1lLCBzdHIoZXgpKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKHRyYWNlYmFjay5wcmludF9leGMoKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX29wZW4oc2VsZik6CisgICAgICAgIHNlbGYub3V0ID0gbG9nZmlsZV9vcGVuKHNlbGYubG9ncGF0aCwgJ3crJykKKworICAgIGRlZiBfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYub3V0LmNsb3NlKCkKKworICAgIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9wcmludF9kYXRlKCkKKyAgICAgICAgcHJpbnQoJ0V4ZWN1dGluZzogJXMnICUgc3RyX2pvaW4oJyAnLCBzZWxmLl9wcm9nLmNvbW1hbmQpLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnRGlyZWN0b3J5OiAlcycgJSBzZWxmLl9wcm9nLndvcmtkaXIsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdjb25maWc6ZGVsYXk6ICVzJyAlIHNlbGYuX3Rlc3QuZGVsYXksIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdjb25maWc6dGltZW91dDogJXMnICUgc2VsZi5fdGVzdC50aW1lb3V0LCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBzZWxmLm91dC5mbHVzaCgpCisKKyAgICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmLCByZXR1cm5jb2RlPU5vbmUpOgorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBpZiByZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ1JldHVybiBjb2RlOiAlZCAobmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGtpbGwgYnkgc2lnbmFsKScgJSByZXR1cm5jb2RlLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ1Byb2Nlc3MgaXMga2lsbGVkLicsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2V4ZWNfdGltZSgpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorCisKK2NsYXNzIFN1bW1hcnlSZXBvcnRlcihUZXN0UmVwb3J0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlZGlyLCB0ZXN0ZGlyX3JlbGF0aXZlLCBjb25jdXJyZW50PVRydWUpOgorICAgICAgICBzdXBlcihTdW1tYXJ5UmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fYmFzZWRpciA9IGJhc2VkaXIKKyAgICAgICAgc2VsZi5fdGVzdGRpcl9yZWwgPSB0ZXN0ZGlyX3JlbGF0aXZlCisgICAgICAgIHNlbGYubG9nZGlyID0gcGF0aF9qb2luKHNlbGYudGVzdGRpciwgTE9HX0RJUikKKyAgICAgICAgc2VsZi5vdXRfcGF0aCA9IHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIFJFU1VMVF9KU09OKQorICAgICAgICBzZWxmLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50CisgICAgICAgIHNlbGYub3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtLnN5c3RlbSgpCisgICAgICAgIHNlbGYuX3JldmlzaW9uID0gc2VsZi5fZ2V0X3JldmlzaW9uKCkKKyAgICAgICAgc2VsZi5fdGVzdHMgPSBbXQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5sb2dkaXIpOgorICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5sb2dkaXIpCisgICAgICAgIHNlbGYuX2tub3duX2ZhaWx1cmVzID0gbG9hZF9rbm93bl9mYWlsdXJlcyhzZWxmLnRlc3RkaXIpCisgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyA9IFtdCisgICAgICAgIHNlbGYuX2ZsYWt5X3N1Y2Nlc3MgPSBbXQorICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUgPSBbXQorICAgICAgICBzZWxmLl9leHBlY3RlZF9mYWlsdXJlID0gW10KKyAgICAgICAgc2VsZi5fcHJpbnRfaGVhZGVyKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0ZXN0ZGlyKHNlbGYpOgorICAgICAgICByZXR1cm4gcGF0aF9qb2luKHNlbGYuX2Jhc2VkaXIsIHNlbGYuX3Rlc3RkaXJfcmVsKQorCisgICAgZGVmIF9yZXN1bHRfc3RyaW5nKHNlbGYsIHRlc3QpOgorICAgICAgICBpZiB0ZXN0LnN1Y2Nlc3M6CisgICAgICAgICAgICBpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICdzdWNjZXNzJworICAgICAgICAgICAgZWxpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSgxIHJldHJ5KScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSglZCByZXRyaWVzKScgJSB0ZXN0LnJldHJ5X2NvdW50CisgICAgICAgIGVsaWYgdGVzdC5leHBpcmVkOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKHRpbWVvdXQpJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKCVkKScgJSB0ZXN0LnJldHVybmNvZGUKKworICAgIGRlZiBfZ2V0X3JldmlzaW9uKHNlbGYpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1zaG9ydCcsICdIRUFEJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnRlc3RkaXIsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIG91dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICByZXR1cm4gb3V0LnN0cmlwKCkKKworICAgIGRlZiBfZm9ybWF0X3Rlc3Qoc2VsZiwgdGVzdCwgd2l0aF9yZXN1bHQ9VHJ1ZSk6CisgICAgICAgIG5hbWUgPSAnJXMtJXMnICUgKHRlc3Quc2VydmVyLm5hbWUsIHRlc3QuY2xpZW50Lm5hbWUpCisgICAgICAgIHRyYW5zID0gJyVzLSVzJyAlICh0ZXN0LnRyYW5zcG9ydCwgdGVzdC5zb2NrZXQpCisgICAgICAgIGlmIG5vdCB3aXRoX3Jlc3VsdDoKKyAgICAgICAgICAgIHJldHVybiAnezoyNHN9ezoxOHN9ezoyNXN9Jy5mb3JtYXQobmFtZVs6MjNdLCB0ZXN0LnByb3RvY29sWzoxN10sIHRyYW5zWzoyNF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ3s6MjRzfXs6MThzfXs6MjVzfXs6c31cbicuZm9ybWF0KG5hbWVbOjIzXSwgdGVzdC5wcm90b2NvbFs6MTddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1s6MjRdLCBzZWxmLl9yZXN1bHRfc3RyaW5nKHRlc3QpKQorCisgICAgZGVmIF9wcmludF90ZXN0X2hlYWRlcihzZWxmKToKKyAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAnezoyNHN9ezoxOHN9ezoyNXN9ezpzfScuZm9ybWF0KCdzZXJ2ZXItY2xpZW50OicsICdwcm90b2NvbDonLCAndHJhbnNwb3J0OicsICdyZXN1bHQ6JyksCisgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIF9wcmludF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3N0YXJ0KCkKKyAgICAgICAgcHJpbnQoJ0FwYWNoZSBUaHJpZnQgLSBJbnRlZ3JhdGlvbiBUZXN0IFN1aXRlJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKworICAgIGRlZiBfcHJpbnRfdW5leHBlY3RlZF9mYWlsdXJlKHNlbGYpOgorICAgICAgICBpZiBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSA+IDA6CisgICAgICAgICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKKyAgICAgICAgICAgICAgICAnKioqIEZvbGxvd2luZyAlZCBmYWlsdXJlcyB3ZXJlIHVuZXhwZWN0ZWQgKioqOlxuJyAlIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpLAorICAgICAgICAgICAgICAgICdJZiBpdCBpcyBpbnRyb2R1Y2VkIGJ5IHlvdSwgcGxlYXNlIGZpeCBpdCBiZWZvcmUgc3VibWl0dGluZyB0aGUgY29kZS5cbicsCisgICAgICAgICAgICAgICAgIyAnSWYgbm90LCBwbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUXG4nLAorICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZToKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ05vIHVuZXhwZWN0ZWQgZmFpbHVyZXMuJywgZmlsZT1zZWxmLm91dCkKKworICAgIGRlZiBfcHJpbnRfZmxha3lfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX2ZsYWt5X3N1Y2Nlc3MpID4gMDoKKyAgICAgICAgICAgIHByaW50KAorICAgICAgICAgICAgICAgICdGb2xsb3dpbmcgJWQgdGVzdHMgd2VyZSBleHBlY3RlZCB0byBjbGVhbmx5IHN1Y2NlZWQgYnV0IG5lZWRlZCByZXRyeTonICUgbGVuKHNlbGYuX2ZsYWt5X3N1Y2Nlc3MpLAorICAgICAgICAgICAgICAgIGZpbGU9c2VsZi5vdXQpCisgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLl9mbGFreV9zdWNjZXNzOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHNlbGYuX3Rlc3RzW2ldKSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisKKyAgICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcykgPiAwOgorICAgICAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAgICAgJ0ZvbGxvd2luZyAlZCB0ZXN0cyB3ZXJlIGtub3duIHRvIGZhaWwgYnV0IHN1Y2NlZWRlZCAobWF5YmUgZmxha3kpOicgJSBsZW4oc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzKSwKKyAgICAgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHNlbGYuX3Rlc3RzW2ldKSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisKKyAgICBkZWYgX2h0dHBfc2VydmVyX2NvbW1hbmQoc2VsZiwgcG9ydCk6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgorICAgICAgICAgICAgcmV0dXJuICdweXRob24gLW0gU2ltcGxlSFRUUFNlcnZlciAlZCcgJSBwb3J0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ3B5dGhvbiAtbSBodHRwLnNlcnZlciAlZCcgJSBwb3J0CisKKyAgICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmKToKKyAgICAgICAgZmFpbF9jb3VudCA9IGxlbihzZWxmLl9leHBlY3RlZF9mYWlsdXJlKSArIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfc3VjY2VzcygpCisgICAgICAgIHNlbGYuX3ByaW50X2ZsYWt5X3N1Y2Nlc3MoKQorICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX2ZhaWx1cmUoKQorICAgICAgICBzZWxmLl93cml0ZV9odG1sX2RhdGEoKQorICAgICAgICBzZWxmLl9hc3NlbWJsZV9sb2coJ3VuZXhwZWN0ZWQgZmFpbHVyZXMnLCBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCisgICAgICAgIHNlbGYuX2Fzc2VtYmxlX2xvZygna25vd24gZmFpbHVyZXMnLCBzZWxmLl9leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKKyAgICAgICAgICAgICdZb3UgY2FuIGJyb3dzZSByZXN1bHRzIGF0OlxuJywKKyAgICAgICAgICAgICdcdGZpbGU6Ly8lcy8lc1xuJyAlIChzZWxmLnRlc3RkaXIsIFJFU1VMVF9IVE1MKSwKKyAgICAgICAgICAgICcjIElmIHlvdSB1c2UgQ2hyb21lLCBydW46XG4nLAorICAgICAgICAgICAgJyMgXHRjZCAlc1xuI1x0JXNcbicgJSAoc2VsZi5fYmFzZWRpciwgc2VsZi5faHR0cF9zZXJ2ZXJfY29tbWFuZCg4MDAxKSksCisgICAgICAgICAgICAnIyB0aGVuIGJyb3dzZTpcbicsCisgICAgICAgICAgICAnIyBcdGh0dHA6Ly9sb2NhbGhvc3Q6JWQvJXMvXG4nICUgKDgwMDEsIHNlbGYuX3Rlc3RkaXJfcmVsKSwKKyAgICAgICAgICAgICdGdWxsIGxvZyBmb3IgZWFjaCB0ZXN0IGlzIGhlcmU6XG4nLAorICAgICAgICAgICAgJ1x0dGVzdC9sb2cvc2VydmVyX2NsaWVudF9wcm90b2NvbF90cmFuc3BvcnRfY2xpZW50LmxvZ1xuJywKKyAgICAgICAgICAgICdcdHRlc3QvbG9nL3NlcnZlcl9jbGllbnRfcHJvdG9jb2xfdHJhbnNwb3J0X3NlcnZlci5sb2dcbicsCisgICAgICAgICAgICAnJWQgZmFpbGVkIG9mICVkIHRlc3RzIGluIHRvdGFsLlxuJyAlIChmYWlsX2NvdW50LCBsZW4oc2VsZi5fdGVzdHMpKSwKKyAgICAgICAgXSkKKyAgICAgICAgc2VsZi5fcHJpbnRfZXhlY190aW1lKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisKKyAgICBkZWYgX3JlbmRlcl9yZXN1bHQoc2VsZiwgdGVzdCk6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICB0ZXN0LnNlcnZlci5uYW1lLAorICAgICAgICAgICAgdGVzdC5jbGllbnQubmFtZSwKKyAgICAgICAgICAgIHRlc3QucHJvdG9jb2wsCisgICAgICAgICAgICB0ZXN0LnRyYW5zcG9ydCwKKyAgICAgICAgICAgIHRlc3Quc29ja2V0LAorICAgICAgICAgICAgdGVzdC5zdWNjZXNzLAorICAgICAgICAgICAgdGVzdC5hc19leHBlY3RlZCwKKyAgICAgICAgICAgIHRlc3QucmV0dXJuY29kZSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnc2VydmVyJzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LnNlcnZlci5raW5kKSwKKyAgICAgICAgICAgICAgICAnY2xpZW50Jzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LmNsaWVudC5raW5kKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIF0KKworICAgIGRlZiBfd3JpdGVfaHRtbF9kYXRhKHNlbGYpOgorICAgICAgICAiIiJXcml0ZXMgSlNPTiBkYXRhIHRvIGJlIHJlYWQgYnkgcmVzdWx0IGh0bWwiIiIKKyAgICAgICAgcmVzdWx0cyA9IFtzZWxmLl9yZW5kZXJfcmVzdWx0KHIpIGZvciByIGluIHNlbGYuX3Rlc3RzXQorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihzZWxmLm91dF9wYXRoLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGpzb24uZHVtcHMoeworICAgICAgICAgICAgICAgICdkYXRlJzogc2VsZi5fZm9ybWF0X2RhdGUoKSwKKyAgICAgICAgICAgICAgICAncmV2aXNpb24nOiBzdHIoc2VsZi5fcmV2aXNpb24pLAorICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6IHNlbGYuX3BsYXRmb3JtLAorICAgICAgICAgICAgICAgICdkdXJhdGlvbic6ICd7Oi4xZn0nLmZvcm1hdChzZWxmLl9lbGFwc2VkKSwKKyAgICAgICAgICAgICAgICAncmVzdWx0cyc6IHJlc3VsdHMsCisgICAgICAgICAgICB9LCBpbmRlbnQ9MikpCisKKyAgICBkZWYgX2Fzc2VtYmxlX2xvZyhzZWxmLCB0aXRsZSwgaW5kZXhlcyk6CisgICAgICAgIGlmIGxlbihpbmRleGVzKSA+IDA6CisgICAgICAgICAgICBkZWYgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCBwcm9nX2tpbmQpOgorICAgICAgICAgICAgICAgIHByaW50KCcqKioqKioqKioqKioqKioqKioqKioqKioqKiogJXMgbWVzc2FnZSAqKioqKioqKioqKioqKioqKioqKioqKioqKionICUgcHJvZ19raW5kLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGU9ZnApCisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgcHJvZ19raW5kLCBzZWxmLnRlc3RkaXIpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGgsICdyJykgYXMgcHJvZ19mcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KHByb2dfZnAucmVhZCgpLCBmaWxlPWZwKQorICAgICAgICAgICAgZmlsZW5hbWUgPSB0aXRsZS5yZXBsYWNlKCcgJywgJ18nKSArICcubG9nJworICAgICAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ob3MucGF0aC5qb2luKHNlbGYubG9nZGlyLCBmaWxlbmFtZSksICd3KycpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZvciB0ZXN0IGluIG1hcChzZWxmLl90ZXN0cy5fX2dldGl0ZW1fXywgaW5kZXhlcyk6CisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKCdURVNUOiBbJXNdXG4nICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHRlc3Quc2VydmVyLmtpbmQpCisgICAgICAgICAgICAgICAgICAgIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgdGVzdC5jbGllbnQua2luZCkKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuJykKKyAgICAgICAgICAgIHByaW50KCclcyBhcmUgbG9nZ2VkIHRvICVzLyVzLyVzJyAlICh0aXRsZS5jYXBpdGFsaXplKCksIHNlbGYuX3Rlc3RkaXJfcmVsLCBMT0dfRElSLCBmaWxlbmFtZSkpCisKKyAgICBkZWYgZW5kKHNlbGYpOgorICAgICAgICBzZWxmLl9wcmludF9mb290ZXIoKQorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkgPT0gMAorCisgICAgZGVmIGFkZF90ZXN0KHNlbGYsIHRlc3RfZGljdCk6CisgICAgICAgIHRlc3QgPSBUZXN0RW50cnkoc2VsZi50ZXN0ZGlyLCAqKnRlc3RfZGljdCkKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdCh0ZXN0LCBGYWxzZSkpCisgICAgICAgICAgICAgICAgc2VsZi5vdXQuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5fdGVzdHMuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3Rlc3RzKSAtIDEKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgYWRkX3Jlc3VsdChzZWxmLCBpbmRleCwgcmV0dXJuY29kZSwgZXhwaXJlZCwgcmV0cnlfY291bnQpOgorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmYWlsZWQgPSByZXR1cm5jb2RlIGlzIE5vbmUgb3IgcmV0dXJuY29kZSAhPSAwCisgICAgICAgICAgICBmbGFreSA9IG5vdCBmYWlsZWQgYW5kIHJldHJ5X2NvdW50ICE9IDAKKyAgICAgICAgICAgIHRlc3QgPSBzZWxmLl90ZXN0c1tpbmRleF0KKyAgICAgICAgICAgIGtub3duID0gdGVzdC5uYW1lIGluIHNlbGYuX2tub3duX2ZhaWx1cmVzCisgICAgICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICAgICAgaWYga25vd246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnJXMgZmFpbGVkIGFzIGV4cGVjdGVkJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZS5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgZmFpbHVyZTogJXMnICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUuYXBwZW5kKGluZGV4KQorICAgICAgICAgICAgZWxpZiBmbGFreSBhbmQgbm90IGtub3duOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIGZsYWt5IHN1Y2Nlc3M6ICVzJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9mbGFreV9zdWNjZXNzLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIGVsaWYgbm90IGZsYWt5IGFuZCBrbm93bjoKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygndW5leHBlY3RlZCBzdWNjZXNzOiAlcycgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIHRlc3Quc3VjY2VzcyA9IG5vdCBmYWlsZWQKKyAgICAgICAgICAgIHRlc3QucmV0dXJuY29kZSA9IHJldHVybmNvZGUKKyAgICAgICAgICAgIHRlc3QucmV0cnlfY291bnQgPSByZXRyeV9jb3VudAorICAgICAgICAgICAgdGVzdC5leHBpcmVkID0gZXhwaXJlZAorICAgICAgICAgICAgdGVzdC5hc19leHBlY3RlZCA9IGtub3duID09IGZhaWxlZAorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9yZXN1bHRfc3RyaW5nKHRlc3QpICsgJ1xuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3QodGVzdCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3J1bi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjhmYjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKQEAgLTAsMCArMSw0MjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2VycworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCitmcm9tIC5jb21wYXQgaW1wb3J0IHN0cl9qb2luCitmcm9tIC5yZXBvcnQgaW1wb3J0IEV4ZWNSZXBvcnRlciwgU3VtbWFyeVJlcG9ydGVyCitmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKK2Zyb20gLnV0aWwgaW1wb3J0IGRvbWFpbl9zb2NrZXRfcGF0aAorCitSRVNVTFRfRVJST1IgPSA2NAorUkVTVUxUX1RJTUVPVVQgPSAxMjgKK1NJR05PTkUgPSAwCitTSUdLSUxMID0gMTUKKworIyBnbG9iYWxzCitwb3J0cyA9IE5vbmUKK3N0b3AgPSBOb25lCisKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIGN3ZCwgZW52LCBzdG9wX3NpZ25hbCwgaXNfc2VydmVyLCByZXBvcnQpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuY21kID0gY21kCisgICAgICAgIHNlbGYuY3dkID0gY3dkCisgICAgICAgIHNlbGYuZW52ID0gZW52CisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmlzX3NlcnZlciA9IGlzX3NlcnZlcgorICAgICAgICBzZWxmLnJlcG9ydCA9IHJlcG9ydAorICAgICAgICBzZWxmLmV4cGlyZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmtpbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucHJvYyA9IE5vbmUKKworICAgIGRlZiBfcG9wZW5fYXJncyhzZWxmKToKKyAgICAgICAgYXJncyA9IHsKKyAgICAgICAgICAgICdjd2QnOiBzZWxmLmN3ZCwKKyAgICAgICAgICAgICdlbnYnOiBzZWxmLmVudiwKKyAgICAgICAgICAgICdzdGRvdXQnOiBzZWxmLnJlcG9ydC5vdXQsCisgICAgICAgICAgICAnc3RkZXJyJzogc3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgIH0KKyAgICAgICAgIyBtYWtlIHN1cmUgY2hpbGQgcHJvY2Vzc2VzIGRvZXNuJ3QgcmVtYWluIGFmdGVyIGtpbGxpbmcKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgREVUQUNIRURfUFJPQ0VTUyA9IDB4MDAwMDAwMDgKKyAgICAgICAgICAgIGFyZ3MudXBkYXRlKGNyZWF0aW9uZmxhZ3M9REVUQUNIRURfUFJPQ0VTUyB8IHN1YnByb2Nlc3MuQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJncy51cGRhdGUocHJlZXhlY19mbj1vcy5zZXRzaWQpCisgICAgICAgIHJldHVybiBhcmdzCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIGpvaW5lZCA9IHN0cl9qb2luKCcgJywgc2VsZi5jbWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnQ09NTUFORDogJXMnLCBqb2luZWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnV09SS0RJUjogJXMnLCBzZWxmLmN3ZCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdMT0dGSUxFOiAlcycsIHNlbGYucmVwb3J0LmxvZ3BhdGgpCisgICAgICAgIHNlbGYucmVwb3J0LmJlZ2luKCkKKyAgICAgICAgc2VsZi5wcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNtZCwgKipzZWxmLl9wb3Blbl9hcmdzKCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnICAgIFBJRDogJWQnLCBzZWxmLnByb2MucGlkKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyAgIFBHSUQ6ICVkJywgb3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Njb3BlZCgpCisKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBfc2NvcGVkKHNlbGYpOgorICAgICAgICB5aWVsZCBzZWxmCisgICAgICAgIGlmIHNlbGYuaXNfc2VydmVyOgorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGlzIHN1cHBvc2VkIHRvIHJ1biB1bnRpbCB3ZSBzdG9wIGl0CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZGllZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RvcF9zaWduYWwgIT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaWd3YWl0KHNlbGYuc3RvcF9zaWduYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZW5kKHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWd3YWl0KFNJR0tJTEwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRoZSBjbGllbnQgaXMgc3VwcG9zZWQgdG8gZXhpdCBub3JtYWxseQorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2lnd2FpdChTSUdLSUxMKQorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gZXhpdGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKworICAgICMgU2VuZCBhIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBhbmQgdGhlbiB3YWl0IGZvciBpdCB0byBlbmQKKyAgICAjIElmIHRoZSBzaWduYWwgcmVxdWVzdGVkIGlzIFNJR05PTkUsIG5vIHNpZ25hbCBpcyBzZW50LCBhbmQKKyAgICAjIGluc3RlYWQgd2UganVzdCB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmQ7IGZ1cnRoZXIgaWYgaXQKKyAgICAjIGRvZXMgbm90IGVuZCBub3JtYWxseSB3aXRoIFNJR05PTkUsIHdlIG1hcmsgaXQgYXMgZXhwaXJlZC4KKyAgICAjIElmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGVuZCBhbmQgdGhlIHNpZ25hbCBpcyBub3QgU0lHS0lMTCwKKyAgICAjIGl0IHJlLXJ1bnMgd2l0aCBTSUdLSUxMIHNvIHRoYXQgYSByZWFsIHByb2Nlc3Mga2lsbCBvY2N1cnMKKyAgICAjIHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvY2VzcyBlbmRlZCwgRmFsc2UgaWYgaXQgbWF5IG5vdCBoYXZlCisgICAgZGVmIHNpZ3dhaXQoc2VsZiwgc2lnPVNJR0tJTEwsIHRpbWVvdXQ9Mik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNpZyAhPSBTSUdOT05FOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gc2VuZCBzaWduYWwgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2lnKSkKKyAgICAgICAgICAgICAgICBpZiBzaWcgPT0gU0lHS0lMTDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5raWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSwgc2lnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jLnNlbmRfc2lnbmFsKHNpZykKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnW3swfV0gRmFpbGVkIHRvIGtpbGwgcHJvY2VzcycuZm9ybWF0KHNlbGYucHJvYy5waWQpLCBleGNfaW5mbz1zeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gd2FpdCBiZWdpbiwgdGltZW91dCB7MX0gc2VjKHMpJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgdGltZW91dCkpCisgICAgICAgICAgICBzZWxmLnByb2MuY29tbXVuaWNhdGUodGltZW91dD10aW1lb3V0KQorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSBwcm9jZXNzIGVuZGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdbezB9XSB0aW1lb3V0IHdhaXRpbmcgZm9yIHByb2Nlc3MgdG8gZW5kJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCkpCisgICAgICAgICAgICBpZiBzaWcgPT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGlyZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgaWYgc2lnID09IFNJR0tJTEwgZWxzZSBzZWxmLnNpZ3dhaXQoU0lHS0lMTCwgMSkKKworICAgICMgY2FsbGVkIG9uIHRoZSBjbGllbnQgcHJvY2VzcyB0byB3YWl0IGZvciBpdCB0byBlbmQgbmF0dXJhbGx5CisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dCk6CisgICAgICAgIHNlbGYuc2lnd2FpdChTSUdOT05FLCB0aW1lb3V0KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHJldHVybmNvZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnByb2MucmV0dXJuY29kZSBpZiBzZWxmLnByb2MgZWxzZSBOb25lCisKKworZGVmIGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHByb2csIGlzX3NlcnZlcik6CisgICAgcmVwb3J0ID0gRXhlY1JlcG9ydGVyKGxvZ2RpciwgdGVzdCwgcHJvZykKKyAgICBwcm9nLmJ1aWxkX2NvbW1hbmQocG9ydCkKKyAgICByZXR1cm4gRXhlY3V0aW9uQ29udGV4dChwcm9nLmNvbW1hbmQsIHByb2cud29ya2RpciwgcHJvZy5lbnYsIHByb2cuc3RvcF9zaWduYWwsIGlzX3NlcnZlciwgcmVwb3J0KQorCisKK2RlZiBydW5fdGVzdCh0ZXN0ZGlyLCBsb2dkaXIsIHRlc3RfZGljdCwgbWF4X3JldHJ5LCBhc3luY19tb2RlPVRydWUpOgorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKworICAgIGRlZiBlbnN1cmVfc29ja2V0X29wZW4oc3YsIHBvcnQsIHRlc3QpOgorICAgICAgICBzbGVwdCA9IDAuMQorICAgICAgICB0aW1lLnNsZWVwKHNsZXB0KQorICAgICAgICBzbGVlcF9zdGVwID0gMC4xCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBzbGVwdCA+IHRlc3QuZGVsYXk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1t7MH1dIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBidXQgc2VydmVyIGlzIG5vdCBvcGVuJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIHRlc3Quc29ja2V0ID09ICdkb21haW4nOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkb21haW5fc29ja2V0X3BhdGgocG9ydCkpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIGRvbWFpbih1bml4KSBzb2NrZXQgbm90IGF2YWlsYWJsZSB5ZXQuIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBzbyBmYXInLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3N0ZXApCisgICAgICAgICAgICAgICAgICAgIHNsZXB0ICs9IHNsZWVwX3N0ZXAKKyAgICAgICAgICAgIGVsaWYgdGVzdC5zb2NrZXQgPT0gJ2Fic3RyYWN0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBzb2NrZXRzIGV2ZXJ5IGl0ZXJhdGlvbiBiZWNhdXNlIHJlZnVzZWQgc29ja2V0cyBjYW5ub3QgYmUKKyAgICAgICAgICAgICAgICAjIHJldXNlZCBvbiBzb21lIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgc29jazQgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgICAgICBzb2NrNiA9IHNvY2tldC5zb2NrZXQoZmFtaWx5PXNvY2tldC5BRl9JTkVUNikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNvY2s0LmNvbm5lY3RfZXgoKCcxMjcuMC4wLjEnLCBwb3J0KSkgPT0gMCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc29jazYuY29ubmVjdF9leCgoJzo6MScsIHBvcnQpKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgaWYgc3YucHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignW3swfV0gc2VydmVyIHByb2Nlc3MgaXMgZXhpdGVkJy5mb3JtYXQoc3YucHJvYy5waWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gc29ja2V0IG5vdCBhdmFpbGFibGUgeWV0LiBzbGVwdCBmb3IgezF9IHNlY29uZHMgc28gZmFyJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF9zdGVwKQorICAgICAgICAgICAgICAgICAgICBzbGVwdCArPSBzbGVlcF9zdGVwCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc29jazQuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBzb2NrNi5jbG9zZSgpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIHNlcnZlciByZWFkeSAtIHdhaXRlZCBmb3IgezF9IHNlY29uZHMnLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHRyeToKKyAgICAgICAgbWF4X2JpbmRfcmV0cnkgPSAzCisgICAgICAgIHJldHJ5X2NvdW50ID0gMAorICAgICAgICBiaW5kX3JldHJ5X2NvdW50ID0gMAorICAgICAgICB0ZXN0ID0gVGVzdEVudHJ5KHRlc3RkaXIsICoqdGVzdF9kaWN0KQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc3RvcC5pc19zZXQoKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGJlY2F1c2Ugc2h1dHRpbmcgZG93bicpCisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgTm9uZSkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnQnKQorICAgICAgICAgICAgd2l0aCBQb3J0QWxsb2NhdG9yLmFsbG9jX3BvcnRfc2NvcGVkKHBvcnRzLCB0ZXN0LnNvY2tldCkgYXMgcG9ydDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0IHdpdGggcG9ydCAlZCcgJSBwb3J0KQorICAgICAgICAgICAgICAgIHN2ID0gZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgdGVzdC5zZXJ2ZXIsIFRydWUpCisgICAgICAgICAgICAgICAgY2wgPSBleGVjX2NvbnRleHQocG9ydCwgbG9nZGlyLCB0ZXN0LCB0ZXN0LmNsaWVudCwgRmFsc2UpCisKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHNlcnZlcicpCisgICAgICAgICAgICAgICAgd2l0aCBzdi5zdGFydCgpOgorICAgICAgICAgICAgICAgICAgICBwb3J0X29rID0gZW5zdXJlX3NvY2tldF9vcGVuKHN2LCBwb3J0LCB0ZXN0KQorICAgICAgICAgICAgICAgICAgICBpZiBwb3J0X29rOgorICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9yZXRyeV9jb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb25uZWN0X3JldHJ5ID0gMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfd2FpdCA9IDAuMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3YucHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdub3Qgc3RhcnRpbmcgY2xpZW50IGJlY2F1c2Ugc2VydmVyIHByb2Nlc3MgaXMgYWJzZW50JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIGNsaWVudCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wuc3RhcnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBjbGllbnQgKHVwIHRvICVkIHNlY3MpJyAlIHRlc3QudGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC53YWl0KHRlc3QudGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2wucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgb3IgY29ubmVjdF9yZXRyeV9jb3VudCA+PSBtYXhfY29ubmVjdF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29ubmVjdF9yZXRyeV9jb3VudCA+IDAgYW5kIGNvbm5lY3RfcmV0cnlfY291bnQgPCBtYXhfY29ubmVjdF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbJXNdOiBDb25uZWN0ZWQgYWZ0ZXIgJWQgcmV0cnkgKCUuMmYgc2VjIGVhY2gpJyAlICh0ZXN0LnNlcnZlci5uYW1lLCBjb25uZWN0X3JldHJ5X2NvdW50LCBjb25uZWN0X3JldHJ5X3dhaXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIDUwbXMgdG8gc2VlIGlmIHNlcnZlciBkb2VzIG5vdCBkaWUgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2VydmVyIG1heSBub3QgYmUgcmVhZHksIHdhaXRpbmcgJS4yZiBzZWNvbmQuLi4nICUgY29ubmVjdF9yZXRyeV93YWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoY29ubmVjdF9yZXRyeV93YWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfY291bnQgKz0gMQorCisgICAgICAgICAgICBpZiBzdi5yZXBvcnQubWF5YmVfZmFsc2VfcG9zaXRpdmUoKSBhbmQgYmluZF9yZXRyeV9jb3VudCA8IG1heF9iaW5kX3JldHJ5OgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbJXNdOiBEZXRlY3RlZCBzb2NrZXQgYmluZCBmYWlsdXJlLCByZXRyeWluZy4uLicsIHRlc3Quc2VydmVyLm5hbWUpCisgICAgICAgICAgICAgICAgYmluZF9yZXRyeV9jb3VudCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJFU1VMVF9USU1FT1VUIGlmIGNsLmV4cGlyZWQgZWxzZSBjbC5yZXR1cm5jb2RlIGlmIChjbC5wcm9jIGFuZCBjbC5wcm9jLnBvbGwoKSkgaXMgbm90IE5vbmUgZWxzZSBSRVNVTFRfRVJST1IKKworICAgICAgICAgICAgICAgICMgRm9yIHNlcnZlcnMgdGhhdCBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duIGJ5IHNpZ25hbAorICAgICAgICAgICAgICAgICMgaWYgdGhleSBhcmUga2lsbGVkLCBvciByZXR1cm4gYW4gZXJyb3IgY29kZSwgdGhhdCBpcyBhCisgICAgICAgICAgICAgICAgIyBwcm9ibGVtLiAgRm9yIHNlcnZlcnMgdGhhdCBhcmUgbm90IHNpZ25hbC1hd2FyZSwgd2Ugc2ltcGx5CisgICAgICAgICAgICAgICAgIyBraWxsIHRoZW0gb2ZmOyBpZiB3ZSBkaWRuJ3Qga2lsbCB0aGVtIG9mZiwgc29tZXRoaW5nIGVsc2UKKyAgICAgICAgICAgICAgICAjIGhhcHBlbmVkIChjcmFzaGVkPykKKyAgICAgICAgICAgICAgICBpZiB0ZXN0LnNlcnZlci5zdG9wX3NpZ25hbCAhPSAwOgorICAgICAgICAgICAgICAgICAgICBpZiBzdi5raWxsZWQgb3Igc3YucmV0dXJuY29kZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gUkVTVUxUX0VSUk9SCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHN2LmtpbGxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBSRVNVTFRfRVJST1IKKworICAgICAgICAgICAgICAgIGlmIHJlc3VsdCA9PSAwIG9yIHJldHJ5X2NvdW50ID49IG1heF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgcmVzdWx0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbJXMtJXNdOiB0ZXN0IGZhaWxlZCwgcmV0cnlpbmcuLi4nLCB0ZXN0LnNlcnZlci5uYW1lLCB0ZXN0LmNsaWVudC5uYW1lKQorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCArPSAxCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgaWYgbm90IGFzeW5jX21vZGU6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBsb2dnZXIud2FybignRXJyb3IgZXhlY3V0aW5nIFslc10nLCB0ZXN0Lm5hbWUsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIFJFU1VMVF9FUlJPUikKKyAgICBleGNlcHQ6CisgICAgICAgIGxvZ2dlci5pbmZvKCdJbnRlcnJ1cHRlZCBleGVjdXRpb24nLCBleGNfaW5mbz1UcnVlKQorICAgICAgICBpZiBub3QgYXN5bmNfbW9kZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHN0b3Auc2V0KCkKKyAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgUkVTVUxUX0VSUk9SKQorCisKK2NsYXNzIFBvcnRBbGxvY2F0b3Iob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKyAgICAgICAgc2VsZi5fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9kb21fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9sYXN0X2FsbG9jID0gMAorCisgICAgZGVmIF9nZXRfdGNwX3BvcnQoc2VsZik6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgc29jay5iaW5kKCgnJywgMCkpCisgICAgICAgIHBvcnQgPSBzb2NrLmdldHNvY2tuYW1lKClbMV0KKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2sgPSBwb3J0IG5vdCBpbiBzZWxmLl9wb3J0cworICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydHMuYWRkKHBvcnQpCisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9hbGxvYyA9IHRpbWUudGltZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIHJldHVybiBwb3J0IGlmIG9rIGVsc2Ugc2VsZi5fZ2V0X3RjcF9wb3J0KCkKKworICAgIGRlZiBfZ2V0X2RvbWFpbl9wb3J0KHNlbGYpOgorICAgICAgICBwb3J0ID0gcmFuZG9tLnJhbmRpbnQoMTAyNCwgNjU1MzYpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9rID0gcG9ydCBub3QgaW4gc2VsZi5fZG9tX3BvcnRzCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb21fcG9ydHMuYWRkKHBvcnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgICAgICByZXR1cm4gcG9ydCBpZiBvayBlbHNlIHNlbGYuX2dldF9kb21haW5fcG9ydCgpCisKKyAgICBkZWYgYWxsb2NfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSk6CisgICAgICAgIGlmIHNvY2tldF90eXBlIGluICgnZG9tYWluJywgJ2Fic3RyYWN0Jyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2RvbWFpbl9wb3J0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfdGNwX3BvcnQoKQorCisgICAgIyBzdGF0aWMgbWV0aG9kIGZvciBpbnRlci1wcm9jZXNzIGludm9rYXRpb24KKyAgICBAc3RhdGljbWV0aG9kCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgYWxsb2NfcG9ydF9zY29wZWQoYWxsb2NhdG9yLCBzb2NrZXRfdHlwZSk6CisgICAgICAgIHBvcnQgPSBhbGxvY2F0b3IuYWxsb2NfcG9ydChzb2NrZXRfdHlwZSkKKyAgICAgICAgeWllbGQgcG9ydAorICAgICAgICBhbGxvY2F0b3IuZnJlZV9wb3J0KHNvY2tldF90eXBlLCBwb3J0KQorCisgICAgZGVmIGZyZWVfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSwgcG9ydCk6CisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZnJlZV9wb3J0JykKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc29ja2V0X3R5cGUgPT0gJ2RvbWFpbic6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICAgICAgICAgIHBhdGggPSBkb21haW5fc29ja2V0X3BhdGgocG9ydCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgICAgICAgICBlbGlmIHNvY2tldF90eXBlID09ICdhYnN0cmFjdCc6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3J0cy5yZW1vdmUocG9ydCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnRXJyb3Igd2hpbGUgZnJlZWluZyBwb3J0JywgZXhjX2luZm89c3lzLmV4Y19pbmZvKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisKK2NsYXNzIE5vbkFzeW5jUmVzdWx0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorCisgICAgZGVmIGdldChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKworICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkeShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzdWNjZXNzZnVsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUgPT0gMAorCisKK2NsYXNzIFRlc3REaXNwYXRjaGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIGJhc2VkaXIsIGxvZ2Rpcl9yZWwsIGNvbmN1cnJlbmN5KToKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLnRlc3RkaXIgPSB0ZXN0ZGlyCisgICAgICAgIHNlbGYuX3JlcG9ydCA9IFN1bW1hcnlSZXBvcnRlcihiYXNlZGlyLCBsb2dkaXJfcmVsLCBjb25jdXJyZW5jeSA+IDEpCisgICAgICAgIHNlbGYubG9nZGlyID0gc2VsZi5fcmVwb3J0LnRlc3RkaXIKKyAgICAgICAgIyBzZWVtcyBuZWVkZWQgZm9yIHB5dGhvbiAyLnggdG8gaGFuZGxlIGtleWJvYXJkIGludGVycnVwdAorICAgICAgICBzZWxmLl9zdG9wID0gbXVsdGlwcm9jZXNzaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fYXN5bmMgPSBjb25jdXJyZW5jeSA+IDEKKyAgICAgICAgaWYgbm90IHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbCA9IE5vbmUKKyAgICAgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgICAgICBnbG9iYWwgcG9ydHMKKyAgICAgICAgICAgIHN0b3AgPSBzZWxmLl9zdG9wCisgICAgICAgICAgICBwb3J0cyA9IFBvcnRBbGxvY2F0b3IoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbSA9IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5CYXNlTWFuYWdlcigpCisgICAgICAgICAgICBzZWxmLl9tLnJlZ2lzdGVyKCdwb3J0cycsIFBvcnRBbGxvY2F0b3IpCisgICAgICAgICAgICBzZWxmLl9tLnN0YXJ0KCkKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbChjb25jdXJyZW5jeSwgc2VsZi5fcG9vbF9pbml0LCAoc2VsZi5fbS5hZGRyZXNzLCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygKKyAgICAgICAgICAgICdUZXN0RGlzcGF0Y2hlciBzdGFydGVkIHdpdGggJWQgY29uY3VycmVudCBqb2JzJyAlIGNvbmN1cnJlbmN5KQorCisgICAgZGVmIF9wb29sX2luaXQoc2VsZiwgYWRkcmVzcyk6CisgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgIGdsb2JhbCBtCisgICAgICAgIGdsb2JhbCBwb3J0cworICAgICAgICBzdG9wID0gc2VsZi5fc3RvcAorICAgICAgICBtID0gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLkJhc2VNYW5hZ2VyKGFkZHJlc3MpCisgICAgICAgIG0uY29ubmVjdCgpCisgICAgICAgIHBvcnRzID0gbS5wb3J0cygpCisKKyAgICBkZWYgX2Rpc3BhdGNoX3N5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgciA9IHJ1bl90ZXN0KHNlbGYudGVzdGRpciwgc2VsZi5sb2dkaXIsIHRlc3QsIG1heF9yZXRyeSwgYXN5bmNfbW9kZT1GYWxzZSkKKyAgICAgICAgY29udChyKQorICAgICAgICByZXR1cm4gTm9uQXN5bmNSZXN1bHQocikKKworICAgIGRlZiBfZGlzcGF0Y2hfYXN5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdfZGlzcGF0Y2hfYXN5bmMnKQorICAgICAgICByZXR1cm4gc2VsZi5fcG9vbC5hcHBseV9hc3luYyhmdW5jPXJ1bl90ZXN0LCBhcmdzPShzZWxmLnRlc3RkaXIsIHNlbGYubG9nZGlyLCB0ZXN0LCBtYXhfcmV0cnkpLCBjYWxsYmFjaz1jb250KQorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIHRlc3QsIG1heF9yZXRyeSk6CisgICAgICAgIGluZGV4ID0gc2VsZi5fcmVwb3J0LmFkZF90ZXN0KHRlc3QpCisKKyAgICAgICAgZGVmIGNvbnQocmVzdWx0KToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zdG9wLmlzX3NldCgpOgorICAgICAgICAgICAgICAgIGlmIHJlc3VsdCBhbmQgbGVuKHJlc3VsdCkgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQsIHJldHVybmNvZGUgPSByZXN1bHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuY29kZSA9IFJFU1VMVF9FUlJPUgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZnJlZWluZyBwb3J0JykKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2FkZGluZyByZXN1bHQnKQorICAgICAgICAgICAgICAgIHNlbGYuX3JlcG9ydC5hZGRfcmVzdWx0KGluZGV4LCByZXR1cm5jb2RlLCByZXR1cm5jb2RlID09IFJFU1VMVF9USU1FT1VULCByZXRyeV9jb3VudCkKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZpbmlzaCBjb250aW51YXRpb24nKQorICAgICAgICBmbiA9IHNlbGYuX2Rpc3BhdGNoX2FzeW5jIGlmIHNlbGYuX2FzeW5jIGVsc2Ugc2VsZi5fZGlzcGF0Y2hfc3luYworICAgICAgICByZXR1cm4gZm4odGVzdCwgY29udCwgbWF4X3JldHJ5KQorCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCisgICAgICAgIHJldHVybiBzZWxmLl9yZXBvcnQuZW5kKCkKKworICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHNlbGYuX3N0b3Auc2V0KCkKKyAgICAgICAgaWYgc2VsZi5fYXN5bmM6CisgICAgICAgICAgICBzZWxmLl9wb29sLnRlcm1pbmF0ZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZyBiL3Rlc3QvY3Jvc3NydW5uZXIvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTkxMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci90ZXN0LnB5CkBAIC0wLDAgKzEsMTQ5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSAuY29tcGF0IGltcG9ydCBwYXRoX2pvaW4KK2Zyb20gLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QsIGRvbWFpbl9zb2NrZXRfcGF0aAorCisKK2NsYXNzIFRlc3RQcm9ncmFtKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtpbmQsIG5hbWUsIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCwgd29ya2Rpciwgc3RvcF9zaWduYWwsIGNvbW1hbmQsIGVudj1Ob25lLAorICAgICAgICAgICAgICAgICBleHRyYV9hcmdzPVtdLCBleHRyYV9hcmdzMj1bXSwgam9pbl9hcmdzPUZhbHNlLCAqKmt3YXJncyk6CisKKyAgICAgICAgc2VsZi5raW5kID0ga2luZAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldAorICAgICAgICBzZWxmLndvcmtkaXIgPSB3b3JrZGlyCisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCisgICAgICAgIHNlbGYuX2Jhc2VfY29tbWFuZCA9IHNlbGYuX2ZpeF9jbWRfcGF0aChjb21tYW5kKQorICAgICAgICBpZiBlbnY6CisgICAgICAgICAgICBzZWxmLmVudiA9IGNvcHkuY29weShvcy5lbnZpcm9uKQorICAgICAgICAgICAgc2VsZi5lbnYudXBkYXRlKGVudikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW52ID0gb3MuZW52aXJvbgorICAgICAgICBzZWxmLl9leHRyYV9hcmdzID0gZXh0cmFfYXJncworICAgICAgICBzZWxmLl9leHRyYV9hcmdzMiA9IGV4dHJhX2FyZ3MyCisgICAgICAgIHNlbGYuX2pvaW5fYXJncyA9IGpvaW5fYXJncworCisgICAgZGVmIF9maXhfY21kX3BhdGgoc2VsZiwgY21kKToKKyAgICAgICAgIyBpZiB0aGUgYXJnIGlzIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG1ha2UgaXQgcGF0aAorICAgICAgICBkZWYgYWJzX2lmX2V4aXN0cyhhcmcpOgorICAgICAgICAgICAgcCA9IHBhdGhfam9pbihzZWxmLndvcmtkaXIsIGFyZykKKyAgICAgICAgICAgIHJldHVybiBwIGlmIG9zLnBhdGguZXhpc3RzKHApIGVsc2UgYXJnCisKKyAgICAgICAgaWYgY21kWzBdID09ICdweXRob24nOgorICAgICAgICAgICAgY21kWzBdID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZFswXSA9IGFic19pZl9leGlzdHMoY21kWzBdKQorICAgICAgICByZXR1cm4gY21kCisKKyAgICBkZWYgX3NvY2tldF9hcmdzKHNlbGYsIHNvY2tldCwgcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnaXAtc3NsJzogWyctLXNzbCddLAorICAgICAgICAgICAgJ2RvbWFpbic6IFsnLS1kb21haW4tc29ja2V0PSVzJyAlIGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KV0sCisgICAgICAgICAgICAnYWJzdHJhY3QnOiBbJy0tYWJzdHJhY3QtbmFtZXNwYWNlJywgJy0tZG9tYWluLXNvY2tldD0lcycgJSBkb21haW5fc29ja2V0X3BhdGgocG9ydCldLAorICAgICAgICB9LmdldChzb2NrZXQsIE5vbmUpCisKKyAgICBkZWYgX3RyYW5zcG9ydF9hcmdzKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnemxpYic6IFsnLS16bGliJ10sCisgICAgICAgIH0uZ2V0KHRyYW5zcG9ydCwgTm9uZSkKKworICAgIGRlZiBidWlsZF9jb21tYW5kKHNlbGYsIHBvcnQpOgorICAgICAgICBjbWQgPSBjb3B5LmNvcHkoc2VsZi5fYmFzZV9jb21tYW5kKQorICAgICAgICBhcmdzID0gY29weS5jb3B5KHNlbGYuX2V4dHJhX2FyZ3MyKQorICAgICAgICBhcmdzLmFwcGVuZCgnLS1wcm90b2NvbD0nICsgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PScgKyBzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgdHJhbnNwb3J0X2FyZ3MgPSBzZWxmLl90cmFuc3BvcnRfYXJncyhzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgaWYgdHJhbnNwb3J0X2FyZ3M6CisgICAgICAgICAgICBhcmdzICs9IHRyYW5zcG9ydF9hcmdzCisgICAgICAgIHNvY2tldF9hcmdzID0gc2VsZi5fc29ja2V0X2FyZ3Moc2VsZi5zb2NrZXQsIHBvcnQpCisgICAgICAgIGlmIHNvY2tldF9hcmdzOgorICAgICAgICAgICAgYXJncyArPSBzb2NrZXRfYXJncworICAgICAgICBhcmdzLmFwcGVuZCgnLS1wb3J0PSVkJyAlIHBvcnQpCisgICAgICAgIGlmIHNlbGYuX2pvaW5fYXJnczoKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoJyVzJyAlICIgIi5qb2luKGFyZ3MpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kLmV4dGVuZChhcmdzKQorICAgICAgICBpZiBzZWxmLl9leHRyYV9hcmdzOgorICAgICAgICAgICAgY21kLmV4dGVuZChzZWxmLl9leHRyYV9hcmdzKQorICAgICAgICBzZWxmLmNvbW1hbmQgPSBjbWQKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tbWFuZAorCisKK2NsYXNzIFRlc3RFbnRyeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0ZGlyLCBzZXJ2ZXIsIGNsaWVudCwgZGVsYXksIHRpbWVvdXQsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi50ZXN0ZGlyID0gdGVzdGRpcgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuX2NvbmZpZyA9IGt3YXJncworICAgICAgICBzZWxmLnByb3RvY29sID0ga3dhcmdzWydwcm90b2NvbCddCisgICAgICAgIHNlbGYudHJhbnNwb3J0ID0ga3dhcmdzWyd0cmFuc3BvcnQnXQorICAgICAgICBzZWxmLnNvY2tldCA9IGt3YXJnc1snc29ja2V0J10KKyAgICAgICAgc3J2X2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgc2VydmVyKSkKKyAgICAgICAgY2xpX2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgY2xpZW50KSkKKyAgICAgICAgY2xpX2RpY3RbJ2V4dHJhX2FyZ3MyJ10gPSBzcnZfZGljdC5wb3AoJ3JlbW90ZV9hcmdzJywgW10pCisgICAgICAgIHNydl9kaWN0WydleHRyYV9hcmdzMiddID0gY2xpX2RpY3QucG9wKCdyZW1vdGVfYXJncycsIFtdKQorICAgICAgICBzZWxmLnNlcnZlciA9IFRlc3RQcm9ncmFtKCdzZXJ2ZXInLCAqKnNydl9kaWN0KQorICAgICAgICBzZWxmLmNsaWVudCA9IFRlc3RQcm9ncmFtKCdjbGllbnQnLCAqKmNsaV9kaWN0KQorICAgICAgICBzZWxmLmRlbGF5ID0gZGVsYXkKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLl9uYW1lID0gTm9uZQorICAgICAgICAjIHJlc3VsdHMKKyAgICAgICAgc2VsZi5zdWNjZXNzID0gTm9uZQorICAgICAgICBzZWxmLmFzX2V4cGVjdGVkID0gTm9uZQorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucmV0cnlfY291bnQgPSAwCisKKyAgICBkZWYgX2ZpeF93b3JrZGlyKHNlbGYsIGNvbmZpZyk6CisgICAgICAgIGtleSA9ICd3b3JrZGlyJworICAgICAgICBwYXRoID0gY29uZmlnLmdldChrZXksIE5vbmUpCisgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHNlbGYudGVzdGRpcgorICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKHBhdGgpOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIHBhdGgpKQorICAgICAgICBjb25maWcudXBkYXRlKHtrZXk6IHBhdGh9KQorICAgICAgICByZXR1cm4gY29uZmlnCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZ2V0X25hbWUoY2xzLCBzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gJyVzLSVzXyVzXyVzLSVzJyAlIChzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9uYW1lOgorICAgICAgICAgICAgc2VsZi5fbmFtZSA9IHNlbGYuZ2V0X25hbWUoCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIubmFtZSwgc2VsZi5jbGllbnQubmFtZSwgc2VsZi5wcm90b2NvbCwgc2VsZi50cmFuc3BvcnQsIHNlbGYuc29ja2V0KQorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHRyYW5zcG9ydF9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzLSVzJyAlIChzZWxmLnRyYW5zcG9ydCwgc2VsZi5zb2NrZXQpCisKKworZGVmIHRlc3RfbmFtZShzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCAqKmt3YXJncyk6CisgICAgcmV0dXJuIFRlc3RFbnRyeS5nZXRfbmFtZShzZXJ2ZXJbJ25hbWUnXSwgY2xpZW50WyduYW1lJ10sIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjE0ZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY29weQorCisKK2RlZiBkb21haW5fc29ja2V0X3BhdGgocG9ydCk6CisgICAgcmV0dXJuICcvdG1wL1RocmlmdFRlc3QudGhyaWZ0LiVkJyAlIHBvcnQKKworCitkZWYgbWVyZ2VfZGljdChiYXNlLCB1cGRhdGUpOgorICAgICIiIlVwZGF0ZSBkaWN0IGNvbmNhdGVuYXRpbmcgbGlzdCB2YWx1ZXMiIiIKKyAgICByZXMgPSBjb3B5LmRlZXBjb3B5KGJhc2UpCisgICAgZm9yIGssIHYgaW4gbGlzdCh1cGRhdGUuaXRlbXMoKSk6CisgICAgICAgIGlmIGsgaW4gbGlzdChyZXMua2V5cygpKSBhbmQgaXNpbnN0YW5jZSh2LCBsaXN0KToKKyAgICAgICAgICAgIHJlc1trXS5leHRlbmQodikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc1trXSA9IHYKKyAgICByZXR1cm4gcmVzCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9DU2hhcnBDbGllbnQuY3MgYi90ZXN0L2NzaGFycC9DU2hhcnBDbGllbnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWQ1YzkuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvQ1NoYXJwQ2xpZW50LmNzCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgVGhyaWZ0OwotdXNpbmcgVGhyaWZ0LlByb3RvY29sOwotdXNpbmcgVGhyaWZ0LlNlcnZlcjsKLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Ci0KLQotbmFtZXNwYWNlIENTaGFycFR1dG9yaWFsCi17Ci0gICAgcHVibGljIGNsYXNzIENTaGFycENsaWVudAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKLSAgICAgICAgICAgICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgQ2FsY3VsYXRvci5DbGllbnQgY2xpZW50ID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKTsKLQotICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7Ci0KLSAgICAgICAgICAgICAgICBjbGllbnQucGluZygpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwaW5nKCkiKTsKLQotICAgICAgICAgICAgICAgIGludCBzdW0gPSBjbGllbnQuYWRkKDEsIDEpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxKzE9ezB9Iiwgc3VtKTsKLQotICAgICAgICAgICAgICAgIFdvcmsgd29yayA9IG5ldyBXb3JrKCk7Ci0KLSAgICAgICAgICAgICAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERTsKLSAgICAgICAgICAgICAgICB3b3JrLm51bTEgPSAxOwotICAgICAgICAgICAgICAgIHdvcmsubnVtMiA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby53aHkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7Ci0gICAgICAgICAgICAgICAgd29yay5udW0xID0gMTU7Ci0gICAgICAgICAgICAgICAgd29yay5udW0yID0gMTA7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxNS0xMD17MH0iLCBkaWZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby53aHkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFNoYXJlZFN0cnVjdCBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDaGVjayBsb2c6IHswfSIsIGxvZy52YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24geCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSh4LlN0YWNrVHJhY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9DU2hhcnBTZXJ2ZXIuY3MgYi90ZXN0L2NzaGFycC9DU2hhcnBTZXJ2ZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWI4ZmQuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvQ1NoYXJwU2VydmVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgVGhyaWZ0LlNlcnZlcjsKLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Ci0KLW5hbWVzcGFjZSBDU2hhcnBUdXRvcmlhbAotewotICAgIHB1YmxpYyBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IENhbGN1bGF0b3IuSWZhY2UKLSAgICB7Ci0gICAgICAgIERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+IGxvZzsKLQotICAgICAgICBwdWJsaWMgQ2FsY3VsYXRvckhhbmRsZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHBpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicGluZygpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGFkZChpbnQgbjEsIGludCBuMikKLSAgICAgICAgewotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImFkZCh7MH0sezF9KSIsIG4xLCBuMik7Ci0gICAgICAgICAgICByZXR1cm4gbjEgKyBuMjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiY2FsY3VsYXRlKHswfSwgW3sxfSx7Mn0sezN9XSkiLCBsb2dpZCwgd29yay5vcCwgd29yay5udW0xLCB3b3JrLm51bTIpOwotICAgICAgICAgICAgaW50IHZhbCA9IDA7Ci0gICAgICAgICAgICBzd2l0Y2ggKHdvcmsub3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKLSAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLndoYXQgPSAoaW50KXdvcmsub3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpby53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLndoYXQgPSAoaW50KXdvcmsub3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpby53aHkgPSAiVW5rbm93biBvcGVyYXRpb24iOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU2hhcmVkU3RydWN0IGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOwotICAgICAgICAgICAgZW50cnkua2V5ID0gbG9naWQ7Ci0gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbC5Ub1N0cmluZygpOwotICAgICAgICAgICAgbG9nW2xvZ2lkXSA9IGVudHJ5OwotCi0gICAgICAgICAgICByZXR1cm4gdmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoaW50IGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImdldFN0cnVjdCh7MH0pIiwga2V5KTsKLSAgICAgICAgICAgIHJldHVybiBsb2dba2V5XTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHppcCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ6aXAoKSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIENTaGFycFNlcnZlcgotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWxjdWxhdG9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgQ2FsY3VsYXRvci5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7Ci0gICAgICAgICAgICAgICAgVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBVc2UgdGhpcyBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgotICAgICAgICAgICAgICAgIC8vIHNlcnZlciA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7Ci0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOwotICAgICAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHguU3RhY2tUcmFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL01ha2VmaWxlLmFtIGIvdGVzdC9jc2hhcnAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxNjZlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOTUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitHRU5FUkFURUQgPSBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9Cb25rLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0Jvb2xzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0Jvb2xUZXN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0NyYXp5TmVzdGluZy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9FbXB0eVN0cnVjdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9HdWVzc1Byb3RvY29sU3RydWN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0luc2FuaXR5LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xhcmdlRGVsdGFzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xpc3RCb25rcy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MaXN0VHlwZVZlcnNpb25pbmdWMS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MaXN0VHlwZVZlcnNpb25pbmdWMi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRMaXN0c0JvbmsuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTGlzdHNJMzJ4Mi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRMaXN0c0kzMngzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZE1peGVkeDIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTnVtYmVyei5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9PbmVGaWVsZC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9TZWNvbmRTZXJ2aWNlLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1N0cnVjdEEuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvU3RydWN0Qi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9UaHJpZnRUZXN0LkNvbnN0YW50cy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9UaHJpZnRUZXN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1ZlcnNpb25pbmdUZXN0VjEuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVmVyc2lvbmluZ1Rlc3RWMi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YY2VwdGlvbi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YY2VwdGlvbjIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWHRydWN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1h0cnVjdDIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWHRydWN0My5jcworCitCVUlMVF9TT1VSQ0VTID0gJChHRU5FUkFURUQpCisKK2lmIE1PTk9fTUNTCitDU0MgPSBtY3MKK2Vsc2UKK0NTQyA9IGdtY3MKK2VuZGlmCisKK2lmIE5FVF8yXzAKK0NTQ19ERUZJTkVTID0gLWQ6TkVUXzJfMAorZW5kaWYKKworTElCRElSID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9jc2hhcnAKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworJChHRU5FUkFURUQpOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAtbyAuICQ8CisKK3ByZWNyb3NzOiBUZXN0Q2xpZW50U2VydmVyLmV4ZQorCitUaHJpZnRJbXBsLmRsbDogJChHRU5FUkFURUQpICQoTElCRElSKS9UaHJpZnQuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC10OmxpYnJhcnkgLW91dDokQCAtcmVmZXJlbmNlOiQoTElCRElSKS9UaHJpZnQuZGxsICQoR0VORVJBVEVEKQorCitTUkNTID0gVGVzdENsaWVudC5jcyBUZXN0U2VydmVyLmNzIFByb2dyYW0uY3MKKworVGVzdENsaWVudFNlcnZlci5leGU6ICQoU1JDUykgVGhyaWZ0SW1wbC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtcmVmZXJlbmNlOiQoTElCRElSKS9UaHJpZnQuZGxsIC1yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgJChTUkNTKQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZ2VuLWNzaGFycCAqLmV4ZSAqLmRsbAorCitURVNUUE9SVCA9IDk1MDAKK2NoZWNrLWxvY2FsOiBUZXN0Q2xpZW50U2VydmVyLmV4ZQorCU1PTk9fUEFUSD0kKExJQkRJUikgdGltZW91dCAxMCBtb25vIFRlc3RDbGllbnRTZXJ2ZXIuZXhlIHNlcnZlciAtLXBvcnQ9JChURVNUUE9SVCkgJgorCXNsZWVwIDEKKwlNT05PX1BBVEg9JChMSUJESVIpIG1vbm8gVGVzdENsaWVudFNlcnZlci5leGUgY2xpZW50IC0tcG9ydD0kKFRFU1RQT1JUKQorCitFWFRSQV9ESVNUID0gXAorCVByb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIFwKKwlUaHJpZnRUZXN0LmNzcHJvaiBcCisJVGhyaWZ0VGVzdC5zbG4gXAorCVByb2dyYW0uY3MgXAorCVRlc3RTZXJ2ZXIuY3MgXAorCVRlc3RDbGllbnQuY3MKZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Byb2dyYW0uY3MgYi90ZXN0L2NzaGFycC9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzAwZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCisvLworLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgorLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCisKK25hbWVzcGFjZSBUZXN0Cit7CisgICAgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtdXN0IHByb3ZpZGUgJ3NlcnZlcicgb3IgJ2NsaWVudCcgYXJnIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyaW5nW10gc3ViQXJncyA9IG5ldyBzdHJpbmdbYXJncy5MZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1YkFyZ3NbaS0xXSA9IGFyZ3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXJnc1swXSA9PSAiY2xpZW50IikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENsaWVudC5FeGVjdXRlKHN1YkFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1swXSA9PSAic2VydmVyIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFNlcnZlci5FeGVjdXRlKHN1YkFyZ3MpID8gMCA6IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgJ3NlcnZlcicgb3IgJ2NsaWVudCciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTEwMWExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdFRlc3QiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCJmNDFiMTkzYi1mMWFiLTQ4ZWUtODg0My1mODhlNDMwODRlMjYiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcyBiL3Rlc3QvY3NoYXJwL1Rlc3RDbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5YzA2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Rlc3RDbGllbnQuY3MKQEAgLTAsMCArMSw4NzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlRlc3Q7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247CisKK25hbWVzcGFjZSBUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFRlc3RDbGllbnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0UGFyYW1zCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtSXRlcmF0aW9ucyA9IDE7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHVybDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgcGlwZTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGJ1ZmZlcmVkOworICAgICAgICAgICAgcHVibGljIGJvb2wgZnJhbWVkOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwcm90b2NvbDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGVuY3J5cHRlZCA9IGZhbHNlOworICAgICAgICAgICAgcHVibGljIGJvb2wgbXVsdGlwbGV4ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIF9pc0ZpcnN0VHJhbnNwb3J0ID0gdHJ1ZTsKKworCisgICAgICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBDcmVhdGVUcmFuc3BvcnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGVuZHBvaW50IHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQocGlwZSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY3J5cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2VydFBhdGggPSAiLi4va2V5cy9jbGllbnQucDEyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9IG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRQYXRoLCAidGhyaWZ0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRMU1NvY2tldChob3N0LCBwb3J0LCAwLCBjZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG8sIGMsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBTc2xQcm90b2NvbHMuVGxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChfaXNGaXJzdFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9lbnN1cmUgcHJvcGVyIG9wZW4vY2xvc2Ugb2YgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5PcGVuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgX2lzRmlyc3RUcmFuc3BvcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEh0dHBDbGllbnQobmV3IFVyaSh1cmwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgQ3JlYXRlUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJjb21wYWN0IikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG9jb2wgPT0gImpzb24iKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JCYXNlVHlwZXMgPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclN0cnVjdHMgPSAyOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckNvbnRhaW5lcnMgPSA0OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckV4Y2VwdGlvbnMgPSA4OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclByb3RvY29sID0gMTY7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yVW5rbm93biA9IDY0OworCisgICAgICAgIHByaXZhdGUgY2xhc3MgQ2xpZW50VGVzdAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRlc3RQYXJhbXMgcGFyYW07CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTZWNvbmRTZXJ2aWNlLkNsaWVudCBzZWNvbmQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG51bUl0ZXJhdGlvbnM7CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgZG9uZTsKKworICAgICAgICAgICAgcHVibGljIGludCBSZXR1cm5Db2RlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAgICAgcHVibGljIENsaWVudFRlc3QoVGVzdFBhcmFtcyBwYXJhbWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcmFtID0gcGFyYW1pbjsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBwYXJhbS5DcmVhdGVUcmFuc3BvcnQoKTsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwYXJhbS5DcmVhdGVQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5tdWx0aXBsZXhlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudChuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpOworICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBwYXJhbS5udW1JdGVyYXRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhlY3V0ZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zcG9ydC5Jc09wZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyBleC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXhlY3V0ZUNsaWVudFRlc3QoY2xpZW50LCBzZWNvbmQsIHBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgY2xvc2luZyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBFeGVjdXRlKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRlc3RQYXJhbXMgcGFyYW0gPSBuZXcgVGVzdFBhcmFtcygpOworICAgICAgICAgICAgICAgIGludCBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi11IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS51cmwgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItbiIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ubnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXBpcGUiKSAgLy8gLXBpcGUgPG5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucGlwZSA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgbmFtZWQgcGlwZXMgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLkNvbnRhaW5zKCItLWhvc3Q9IikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uaG9zdCA9IGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLkNvbnRhaW5zKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucG9ydCA9IGludC5QYXJzZShhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSsxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYnVmZmVyZWQgc29ja2V0cyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWYiIHx8IGFyZ3NbaV0gPT0gIi0tZnJhbWVkIiAgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9ZnJhbWVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5mcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBmcmFtZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItdCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9bXVsdGljIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5wcm90b2NvbCA9ICJjb21wYWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgY29tcGFjdCBwcm90b2NvbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9bXVsdGlqIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5wcm90b2NvbCA9ICJqc29uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgSlNPTiBwcm90b2NvbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmVuY3J5cHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1wcm90b2NvbD1tdWx0aSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLm11bHRpcGxleGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSAgcGFyc2luZyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgdGVzdHMgPSBFbnVtZXJhYmxlLlJhbmdlKDAsIG51bVRocmVhZHMpLlNlbGVjdChfID0+IG5ldyBDbGllbnRUZXN0KHBhcmFtKSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIC8vaXNzdWUgdGVzdHMgb24gc2VwYXJhdGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseQorICAgICAgICAgICAgICAgIHZhciB0aHJlYWRzID0gdGVzdHMuU2VsZWN0KHRlc3QgPT4gbmV3IFRocmVhZCh0ZXN0LkV4ZWN1dGUpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgRGF0ZVRpbWUgc3RhcnQgPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgdC5TdGFydCgpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHRocmVhZHMpCisgICAgICAgICAgICAgICAgICAgIHQuSm9pbigpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUb3RhbCB0aW1lOiAiICsgKERhdGVUaW1lLk5vdyAtIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdHMuU2VsZWN0KHQgPT4gdC5SZXR1cm5Db2RlKS5BZ2dyZWdhdGUoKHIxLCByMikgPT4gcjEgfCByMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIG91dGVyRXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVuZXhwZWN0ZWQgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShvdXRlckV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgb3V0ZXJFeC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQnl0ZXNUb0hleChieXRlW10gZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub1N0cmluZyhkYXRhKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFByZXBhcmVUZXN0RGF0YShib29sIHJhbmRvbURpc3QsIGJvb2wgaHVnZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaHVnZSA9IHRydWUgdGVzdHMgZm9yIFRIUklGVC00MzcyCisgICAgICAgICAgICBieXRlW10gcmV0dmFsID0gbmV3IGJ5dGVbaHVnZSA/IDB4MTIzNDUgOiAweDEwMF07CisgICAgICAgICAgICBpbnQgaW5pdExlbiA9IHJldHZhbC5MZW5ndGg7CisKKyAgICAgICAgICAgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoIXJhbmRvbURpc3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRMZW47ICsraSkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByYW5kb20gZGlzdHJpYnV0aW9uCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRMZW47ICsraSkgeworICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgcm5kID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBpbml0TGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSggdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dFBvcyA9IHJuZC5OZXh0KCkgJSBpbml0TGVuOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsW25leHRQb3NdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbFtuZXh0UG9zXSA9IChieXRlKWk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBFeGVjdXRlQ2xpZW50VGVzdChUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQsIFNlY29uZFNlcnZpY2UuQ2xpZW50IHNlY29uZCwgVGVzdFBhcmFtcyBwYXJhbSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSAwOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgICBjbGllbnQudGVzdFZvaWQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB2b2lkIik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgICAgICAgICBzdHJpbmcgcyA9IGNsaWVudC50ZXN0U3RyaW5nKCJUZXN0Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gXCIiICsgcyArICJcIiIpOworICAgICAgICAgICAgaWYgKCJUZXN0IiAhPSBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJhbS5tdWx0aXBsZXhlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgic2Vjb25kVGVzdFN0cmluZyhcIlRlc3QyXCIpIik7CisgICAgICAgICAgICAgICAgcyA9IHNlY29uZC5zZWNvbmR0ZXN0U3RyaW5nKCJUZXN0MiIpOworICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gXCIiICsgcyArICJcIiIpOworICAgICAgICAgICAgICBpZiAoInRlc3RTdHJpbmcoXCJUZXN0MlwiKSIgIT0gcykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yUHJvdG9jb2w7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2wodHJ1ZSkiKTsKKyAgICAgICAgICAgIGJvb2wgdCA9IGNsaWVudC50ZXN0Qm9vbCgoYm9vbCl0cnVlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdCk7CisgICAgICAgICAgICBpZiAoIXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKGZhbHNlKSIpOworICAgICAgICAgICAgYm9vbCBmID0gY2xpZW50LnRlc3RCb29sKChib29sKWZhbHNlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZik7CisgICAgICAgICAgICBpZiAoZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qnl0ZSgxKSIpOworICAgICAgICAgICAgc2J5dGUgaTggPSBjbGllbnQudGVzdEJ5dGUoKHNieXRlKTEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7CisgICAgICAgICAgICBpZiAoMSAhPSBpOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STMyKC0xKSIpOworICAgICAgICAgICAgaW50IGkzMiA9IGNsaWVudC50ZXN0STMyKC0xKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTMyKTsKKyAgICAgICAgICAgIGlmICgtMSAhPSBpMzIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CisgICAgICAgICAgICBsb25nIGk2NCA9IGNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk2NCk7CisgICAgICAgICAgICBpZiAoLTM0MzU5NzM4MzY4ICE9IGk2NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RG91YmxlKDUuMzI1MDk4MjM1KSIpOworICAgICAgICAgICAgZG91YmxlIGR1YiA9IGNsaWVudC50ZXN0RG91YmxlKDUuMzI1MDk4MjM1KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZHViKTsKKyAgICAgICAgICAgIGlmICg1LjMyNTA5ODIzNSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KSIpOworICAgICAgICAgICAgZHViID0gY2xpZW50LnRlc3REb3VibGUoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZHViKTsKKyAgICAgICAgICAgIGlmICgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkgIT0gZHViKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTMyID0gMDsgaTMyIDwgMjsgKytpMzIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGh1Z2UgPSAoaTMyID4gMCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJpbk91dCA9IFByZXBhcmVUZXN0RGF0YShmYWxzZSxodWdlKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0QmluYXJ5KCIgKyBCeXRlc1RvSGV4KGJpbk91dCkgKyAiKSIpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJpbkluID0gY2xpZW50LnRlc3RCaW5hcnkoYmluT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBCeXRlc1RvSGV4KGJpbkluKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaW5Jbi5MZW5ndGggIT0gYmluT3V0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG9mcyA9IDA7IG9mcyA8IE1hdGguTWluKGJpbkluLkxlbmd0aCwgYmluT3V0Lkxlbmd0aCk7ICsrb2ZzKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluW29mc10gIT0gYmluT3V0W29mc10pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGJpbmFyeSBlcXVhbHM/IG9ubHkgd2l0aCBoYXNoY29kZSBvcHRpb24gZW5hYmxlZCAuLi4KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IENyYXp5TmVzdGluZyIpOworICAgICAgICAgICAgaWYoIHR5cGVvZihDcmF6eU5lc3RpbmcpLkdldE1ldGhvZCgiRXF1YWxzIikuRGVjbGFyaW5nVHlwZSA9PSB0eXBlb2YoQ3JhenlOZXN0aW5nKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDcmF6eU5lc3Rpbmcgb25lID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgICAgIENyYXp5TmVzdGluZyB0d28gPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICAgICAgb25lLlN0cmluZ19maWVsZCA9ICJjcmF6eSI7CisgICAgICAgICAgICAgICAgdHdvLlN0cmluZ19maWVsZCA9ICJjcmF6eSI7CisgICAgICAgICAgICAgICAgb25lLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgICAgICB0d28uQmluYXJ5X2ZpZWxkID0gbmV3IGJ5dGVbMTBdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgICAgIGlmICghb25lLkVxdWFscyh0d28pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JDb250YWluZXJzOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDcmF6eU5lc3RpbmcuRXF1YWxzIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgICAgICAgICBYdHJ1Y3QgbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIG8uU3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICAgICAgby5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvLkkzMl90aGluZyA9IC0zOworICAgICAgICAgICAgby5JNjRfdGhpbmcgPSAtNTsKKyAgICAgICAgICAgIFh0cnVjdCBpID0gY2xpZW50LnRlc3RTdHJ1Y3Qobyk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7CisgICAgICAgICAgICBYdHJ1Y3QyIG8yID0gbmV3IFh0cnVjdDIoKTsKKyAgICAgICAgICAgIG8yLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKKyAgICAgICAgICAgIG8yLlN0cnVjdF90aGluZyA9IG87CisgICAgICAgICAgICBvMi5JMzJfdGhpbmcgPSA1OworICAgICAgICAgICAgWHRydWN0MiBpMiA9IGNsaWVudC50ZXN0TmVzdChvMik7CisgICAgICAgICAgICBpID0gaTIuU3RydWN0X3RoaW5nOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHsiICsgaTIuQnl0ZV90aGluZyArICIsIHtcIiIgKyBpLlN0cmluZ190aGluZyArICJcIiwgIiArIGkuQnl0ZV90aGluZyArICIsICIgKyBpLkkzMl90aGluZyArICIsICIgKyBpLkk2NF90aGluZyArICJ9LCAiICsgaTIuSTMyX3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbWFwb3V0ID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXBvdXRbal0gPSBqIC0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwKHsiKTsKKyAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtYXBvdXQuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcG91dFtrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7CisKKyAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG1hcGluID0gY2xpZW50LnRlc3RNYXAobWFwb3V0KTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtYXBpbi5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwaW5ba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBMaXN0PGludD4gbGlzdG91dCA9IG5ldyBMaXN0PGludD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAtMjsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RMaXN0KHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIGxpc3RvdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7CisKKyAgICAgICAgICAgIExpc3Q8aW50PiBsaXN0aW4gPSBjbGllbnQudGVzdExpc3QobGlzdG91dCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIGxpc3RpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy9zZXQKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIFRIYXNoU2V0PGludD4gc2V0b3V0ID0gbmV3IFRIYXNoU2V0PGludD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAtMjsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXRvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFNldCh7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRvdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7CisKKyAgICAgICAgICAgIFRIYXNoU2V0PGludD4gc2V0aW4gPSBjbGllbnQudGVzdFNldChzZXRvdXQpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICAgICAgICBOdW1iZXJ6IHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6Lk9ORSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5PTkUgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUV08pIik7CisgICAgICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouVFdPICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVEhSRUUpIik7CisgICAgICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5USFJFRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEZJVkUpIik7CisgICAgICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LkZJVkUgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LkVJR0hUICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworICAgICAgICAgICAgbG9uZyB1aWQgPSBjbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHVpZCk7CisgICAgICAgICAgICBpZiAoMzA5ODU4MjM1MDgyNTIzTCAhPSB1aWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXBNYXAoMSkiKTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbW0gPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gbW0uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG0yID0gbW1ba2V5XTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgazIgaW4gbTIuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+ICIgKyBtMltrMl0gKyAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBJbnNhbml0eSBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICAgICAgICAgIGluc2FuZS5Vc2VyTWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgbG9uZz4oKTsKKyAgICAgICAgICAgIGluc2FuZS5Vc2VyTWFwW051bWJlcnouRklWRV0gPSA1MDAwTDsKKyAgICAgICAgICAgIFh0cnVjdCB0cnVjayA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIHRydWNrLlN0cmluZ190aGluZyA9ICJUcnVjayI7CisgICAgICAgICAgICB0cnVjay5CeXRlX3RoaW5nID0gKHNieXRlKTg7CisgICAgICAgICAgICB0cnVjay5JMzJfdGhpbmcgPSA4OworICAgICAgICAgICAgdHJ1Y2suSTY0X3RoaW5nID0gODsKKyAgICAgICAgICAgIGluc2FuZS5YdHJ1Y3RzID0gbmV3IExpc3Q8WHRydWN0PigpOworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMuQWRkKHRydWNrKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJbnNhbml0eSgpIik7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB3aG9hID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAobG9uZyBrZXkgaW4gd2hvYS5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHZhbCA9IHdob2Fba2V5XTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoTnVtYmVyeiBrMiBpbiB2YWwuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEluc2FuaXR5IHYyID0gdmFsW2syXTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgbG9uZz4gdXNlck1hcCA9IHYyLlVzZXJNYXA7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgieyIpOworICAgICAgICAgICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChOdW1iZXJ6IGszIGluIHVzZXJNYXAuS2V5cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGszICsgIiA9PiAiICsgdXNlck1hcFtrM10gKyAiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIm51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKworICAgICAgICAgICAgICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLlh0cnVjdHM7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgieyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChYdHJ1Y3QgeCBpbiB4dHJ1Y3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIntcIiIgKyB4LlN0cmluZ190aGluZyArICJcIiwgIiArIHguQnl0ZV90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICJ9LCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIm51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgc2J5dGUgYXJnMCA9IDE7CisgICAgICAgICAgICBpbnQgYXJnMSA9IDI7CisgICAgICAgICAgICBsb25nIGFyZzIgPSBsb25nLk1heFZhbHVlOworICAgICAgICAgICAgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBtdWx0aURpY3QgPSBuZXcgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPigpOworICAgICAgICAgICAgbXVsdGlEaWN0WzFdID0gIm9uZSI7CisgICAgICAgICAgICBOdW1iZXJ6IGFyZzQgPSBOdW1iZXJ6LkZJVkU7CisgICAgICAgICAgICBsb25nIGFyZzUgPSA1MDAwMDAwOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBNdWx0aSgiICsgYXJnMCArICIsIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIiwiICsgbXVsdGlEaWN0ICsgIiwiICsgYXJnNCArICIsIiArIGFyZzUgKyAiKSIpOworICAgICAgICAgICAgWHRydWN0IG11bHRpUmVzcG9uc2UgPSBjbGllbnQudGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSBYdHJ1Y3QoYnl0ZV90aGluZzoiICsgbXVsdGlSZXNwb25zZS5CeXRlX3RoaW5nICsgIixTdHJpbmdfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuU3RyaW5nX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICArICIsaTMyX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkkzMl90aGluZyArICIsaTY0X3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkk2NF90aGluZyArICIpXG4iKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJva1wiKSIpOworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJvayIpOworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24iLCAiaWdub3JlIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uMiIsICJpZ25vcmUiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbjIgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAyMDAyIHx8IGV4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcIk9LXCIpIik7CisgICAgICAgICAgICAgICAgaWYgKCJPSyIgIT0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigic3VjY2VzcyIsICJPSyIpLlN0cmluZ190aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0b3B3YXRjaCBzdyA9IG5ldyBTdG9wd2F0Y2goKTsKKyAgICAgICAgICAgIHN3LlN0YXJ0KCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBPbmV3YXkoMSkiKTsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0T25ld2F5KDEpOworICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgaWYgKHN3LkVsYXBzZWRNaWxsaXNlY29uZHMgPiAxMDAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3QgQ2FsbHRpbWUoKSIpOworICAgICAgICAgICAgdmFyIHRpbWVzID0gNTA7CisgICAgICAgICAgICBzdy5SZXNldCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdGltZXM7ICsraykKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdFZvaWQoKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7MH0gbXMgYSB0ZXN0Vm9pZCgpIGNhbGwiLCBzdy5FbGFwc2VkTWlsbGlzZWNvbmRzIC8gdGltZXMpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzIGIvdGVzdC9jc2hhcnAvVGVzdFNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjY0NWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGVzdFNlcnZlci5jcwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKKy8vCisvLyBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6CisvLyBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0LwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Cit1c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247CisKK25hbWVzcGFjZSBUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IF9jbGllbnRJRCA9IC0xOworICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBUZXN0TG9nRGVsZWdhdGUoc3RyaW5nIG1zZywgcGFyYW1zIG9iamVjdFtdIHZhbHVlcyk7CisKKyAgICAgICAgcHVibGljIGNsYXNzIFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNhbGxDb3VudCA9IDA7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcmVTZXJ2ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUNvbnRleHQoVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisKKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyIDogVGhyaWZ0VGVzdC5JZmFjZSwgVGhyaWZ0LlRDb250cm9sbGluZ0hhbmRsZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRTZXJ2ZXIgc2VydmVyIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHByaXZhdGUgaW50IGhhbmRsZXJJRDsKKyAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciByZXVzYWJsZVN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgcHJpdmF0ZSBUZXN0TG9nRGVsZWdhdGUgdGVzdExvZ0RlbGVnYXRlOworCisgICAgICAgICAgICBwdWJsaWMgVGVzdEhhbmRsZXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbmRsZXJJRCA9IEludGVybG9ja2VkLkluY3JlbWVudChyZWYgX2NsaWVudElEKTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUgKz0gdGVzdENvbnNvbGVMb2dnZXI7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgiTmV3IFRlc3RIYW5kbGVyIGluc3RhbmNlIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdENvbnNvbGVMb2dnZXIoc3RyaW5nIG1zZywgcGFyYW1zIG9iamVjdFtdIHZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJoYW5kbGVyezA6RDN9OiIsaGFuZGxlcklEKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KG1zZywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kTGluZSgpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIHJldXNhYmxlU3RyaW5nQnVpbGRlci5Ub1N0cmluZygpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdGVzdFN0cmluZyhzdHJpbmcgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdFN0cmluZyh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgdGVzdEJvb2woYm9vbCB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0Qm9vbCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHNieXRlIHRlc3RCeXRlKHNieXRlIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RCeXRlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IHRlc3RJMzIoaW50IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJMzIoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHRlc3RJNjQobG9uZyB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0STY0KHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgZG91YmxlIHRlc3REb3VibGUoZG91YmxlIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3REb3VibGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gdGVzdEJpbmFyeShieXRlW10gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGhleCA9IEJpdENvbnZlcnRlci5Ub1N0cmluZyh0aGluZykuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEJpbmFyeSh7MDpYfSkiLCBoZXgpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0U3RydWN0KFh0cnVjdCB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0U3RydWN0KHt7XCJ7MH1cIiwgezF9LCB7Mn0sIHszfX19KSIsIHRoaW5nLlN0cmluZ190aGluZywgdGhpbmcuQnl0ZV90aGluZywgdGhpbmcuSTMyX3RoaW5nLCB0aGluZy5JNjRfdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFh0cnVjdDIgdGVzdE5lc3QoWHRydWN0MiBuZXN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFh0cnVjdCB0aGluZyA9IG5lc3QuU3RydWN0X3RoaW5nOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3ROZXN0KHt7ezB9LCB7e1wiezF9XCIsIHsyfSwgezN9LCB7NH0sIHs1fX19fX0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuQnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLlN0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5JMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5JNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LkkzMl90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5lc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PGludCwgaW50PiB0ZXN0TWFwKERpY3Rpb25hcnk8aW50LCBpbnQ+IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoInRlc3RNYXAoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIHRoaW5nLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQoInswfSA9PiB7MX0iLCBrZXksIHRoaW5nW2tleV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKHJldXNhYmxlU3RyaW5nQnVpbGRlci5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiB0ZXN0U3RyaW5nTWFwKERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoInRlc3RTdHJpbmdNYXAoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcga2V5IGluIHRoaW5nLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQoInswfSA9PiB7MX0iLCBrZXksIHRoaW5nW2tleV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKHJldXNhYmxlU3RyaW5nQnVpbGRlci5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUSGFzaFNldDxpbnQ+IHRlc3RTZXQoVEhhc2hTZXQ8aW50PiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0U2V0KHt7Iik7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQoInswfSIsIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKHJldXNhYmxlU3RyaW5nQnVpbGRlci5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PGludD4gdGVzdExpc3QoTGlzdDxpbnQ+IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoInRlc3RMaXN0KHt7Iik7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQoInswfSIsIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKHJldXNhYmxlU3RyaW5nQnVpbGRlci5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBOdW1iZXJ6IHRlc3RFbnVtKE51bWJlcnogdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEVudW0oezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdFR5cGVkZWYoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IHRlc3RNYXBNYXAoaW50IGhlbGxvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RNYXBNYXAoezB9KSIsIGhlbGxvKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1hcG1hcCA9CisgICAgICAgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PigpOworCisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gcG9zID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbmVnID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb3NbaV0gPSBpOworICAgICAgICAgICAgICAgICAgICBuZWdbLWldID0gLWk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWFwbWFwWzRdID0gcG9zOworICAgICAgICAgICAgICAgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwbWFwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbnNhbml0eQorICAgICAgICAgICAgLy8gcmV0dXJuczoKKyAgICAgICAgICAgIC8vIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAvLyAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgICAgICAgICAgLy8gICAgICAgIH0sCisgICAgICAgICAgICAvLyAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgICAgICAgICAgLy8gfQorICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IHRlc3RJbnNhbml0eShJbnNhbml0eSBhcmd1bWVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0SW5zYW5pdHkoKSIpOworCisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gZmlyc3RfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gc2Vjb25kX21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOyA7CisKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CisKKyAgICAgICAgICAgICAgICBzZWNvbmRfbWFwW051bWJlcnouU0lYXSA9IG5ldyBJbnNhbml0eSgpOworCisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gaW5zYW5lID0KKyAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PigpOworICAgICAgICAgICAgICAgIGluc2FuZVsobG9uZykxXSA9IGZpcnN0X21hcDsKKyAgICAgICAgICAgICAgICBpbnNhbmVbKGxvbmcpMl0gPSBzZWNvbmRfbWFwOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGluc2FuZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGkoc2J5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TXVsdGkoKSIpOworCisgICAgICAgICAgICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOyA7CisgICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IGFyZzA7CisgICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gYXJnMTsKKyAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSBhcmcyOworICAgICAgICAgICAgICAgIHJldHVybiBoZWxsbzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBQcmludCAndGVzdEV4Y2VwdGlvbiglcyknIHdpdGggYXJnIGFzICclcycKKyAgICAgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAgICAgICAgICAgKiBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSBhcmcKKyAgICAgICAgICAgICAqIGVsc2VuIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgorICAgICAgICAgICAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihzdHJpbmcgYXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RFeGNlcHRpb24oezB9KSIsIGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB4LkVycm9yQ29kZSA9IDEwMDE7CisgICAgICAgICAgICAgICAgICAgIHguTWVzc2FnZSA9IGFyZzsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFyZyA9PSAiVEV4Y2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aUV4Y2VwdGlvbihzdHJpbmcgYXJnMCwgc3RyaW5nIGFyZzEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE11bHRpRXhjZXB0aW9uKHswfSwgezF9KSIsIGFyZzAsYXJnMSk7CisgICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOworICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbjIgeCA9IG5ldyBYY2VwdGlvbjIoKTsKKyAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAyMDAyOworICAgICAgICAgICAgICAgICAgICB4LlN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgICAgICAgICAgeC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgICAgIHJlc3VsdC5TdHJpbmdfdGhpbmcgPSBhcmcxOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuU3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgYXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RPbmV3YXkoezB9KSwgc2xlZXBpbmcuLi4iLCBhcmcpOworICAgICAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLlNsZWVwKGFyZyAqIDEwMDApOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RPbmV3YXkgZmluaXNoZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IC8vIGNsYXNzIFRlc3RIYW5kbGVyCisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFNlcnZlclR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVFNpbXBsZVNlcnZlciwKKyAgICAgICAgICAgIFRUaHJlYWRlZFNlcnZlciwKKyAgICAgICAgICAgIFRUaHJlYWRQb29sU2VydmVyLAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFByb2Nlc3NvckZhY3RvcnlUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnksCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlLCB1c2VGcmFtZWQgPSBmYWxzZSwgdXNlRW5jcnlwdGlvbiA9IGZhbHNlLCBjb21wYWN0ID0gZmFsc2UsIGpzb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJUeXBlLlRTaW1wbGVTZXJ2ZXI7CisgICAgICAgICAgICAgICAgUHJvY2Vzc29yRmFjdG9yeVR5cGUgcHJvY2Vzc29yRmFjdG9yeVR5cGUgPSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICAgICAgc3RyaW5nIHBpcGUgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSBuYW1lCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1wb3J0PSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWYiIHx8IGFyZ3NbaV0gPT0gIi0tZnJhbWVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1mcmFtZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VGcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tY29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1jb21wYWN0IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBqc29uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZGVkIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZGVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHlwZSA9IFNlcnZlclR5cGUuVFRocmVhZGVkU2VydmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tdGhyZWFkcG9vbCIgfHwgYXJnc1tpXSA9PSAiLS1zZXJ2ZXItdHlwZT10aHJlYWRwb29sIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHlwZSA9IFNlcnZlclR5cGUuVFRocmVhZFBvb2xTZXJ2ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1wcm90b3R5cGUiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvY2Vzc29yPXByb3RvdHlwZSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnlUeXBlID0gUHJvY2Vzc29yRmFjdG9yeVR5cGUuVFByb3RvdHlwZVByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VFbmNyeXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRyYW5zcG9ydAorICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnM7CisgICAgICAgICAgICAgICAgaWYgKHBpcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQocGlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VFbmNyeXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2VydFBhdGggPSAiLi4va2V5cy9zZXJ2ZXIucDEyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUTFNTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgdXNlQnVmZmVyZWRTb2NrZXRzLCBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0UGF0aCwgInRocmlmdCIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90bzsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGFjdCkKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoanNvbikKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEpTT05Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc29yRmFjdG9yeVR5cGUgPT0gUHJvY2Vzc29yRmFjdG9yeVR5cGUuVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5ID0gbmV3IFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5PFRocmlmdFRlc3QuUHJvY2Vzc29yLCBUZXN0SGFuZGxlcj4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IodGVzdEhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5ID0gbmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zRmFjdG9yeTsKKyAgICAgICAgICAgICAgICBpZiAodXNlRnJhbWVkKQorICAgICAgICAgICAgICAgICAgICB0cmFuc0ZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0cmFuc0ZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIFRTZXJ2ZXIgc2VydmVyRW5naW5lOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VydmVyVHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2VydmVyVHlwZS5UVGhyZWFkUG9vbFNlcnZlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCB0cmFucywgdHJhbnNGYWN0b3J5LCBwcm90byk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlRUaHJlYWRlZFNlcnZlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkZWRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgcHJvdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCB0cmFucywgdHJhbnNGYWN0b3J5LCBwcm90byk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL1NlcnZlciBldmVudCBoYW5kbGVyCisgICAgICAgICAgICAgICAgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgc2VydmVyRXZlbnRzID0gbmV3IFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLnNldEV2ZW50SGFuZGxlcihzZXJ2ZXJFdmVudHMpOworCisgICAgICAgICAgICAgICAgLy8gUnVuIGl0CisgICAgICAgICAgICAgICAgc3RyaW5nIHdoZXJlID0gKHBpcGUgIT0gbnVsbCA/ICJvbiBwaXBlICIgKyBwaXBlIDogIm9uIHBvcnQgIiArIHBvcnQpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgIiArIHNlcnZlclR5cGUuVG9TdHJpbmcoKSArICIgIiArIHdoZXJlICsKKyAgICAgICAgICAgICAgICAgICAgKHByb2Nlc3NvckZhY3RvcnlUeXBlID09IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5ID8gIiB3aXRoIHByb2Nlc3NvciBwcm90b3R5cGUgZmFjdG9yeSAiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKHVzZUJ1ZmZlcmVkU29ja2V0cyA/ICIgd2l0aCBidWZmZXJlZCBzb2NrZXQiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKHVzZUZyYW1lZCA/ICIgd2l0aCBmcmFtZWQgdHJhbnNwb3J0IiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICh1c2VFbmNyeXB0aW9uID8gIiB3aXRoIGVuY3J5cHRpb24iIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKGNvbXBhY3QgPyAiIHdpdGggY29tcGFjdCBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAoanNvbiA/ICIgd2l0aCBqc29uIHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICIuLi4iKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2VydmUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGUoeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QuY3Nwcm9qIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2MjllYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsMTQxIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ308L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0VGVzdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdFRlc3Q8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgorICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iVGhyaWZ0SW1wbCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICAgIDxIaW50UGF0aD4uXFRocmlmdEltcGwuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RTZXJ2ZXIuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4yLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMi4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cbGliXGNzaGFycFxUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgorZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCitTRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlxUaHJpZnRUZXN0LnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlxjb21waWxlclxjcHBcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwIC1vICUyNVNIT1JUX0RJUiUyNSAlMjVUSFJJRlRfU0hPUlQlMjUKKyQoTVNCdWlsZFRvb2xzUGF0aClcQ3NjLmV4ZSAvdDpsaWJyYXJ5IC9vdXQ6IiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIgL3JlY3Vyc2U6IiQoUHJvamVjdERpcilnZW4tY3NoYXJwIlwqIC9yZWZlcmVuY2U6IiQoUHJvamVjdERpcikuLlwuLlxsaWJcY3NoYXJwXGJpblxEZWJ1Z1xUaHJpZnQuZGxsIjwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5zbG4gYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY1YTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5zbG4KQEAgLTAsMCArMSwxNyBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTAKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0VGVzdCIsICJUaHJpZnRUZXN0LmNzcHJvaiIsICJ7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Byb2dyYW0uY3MgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Byb2dyYW0uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjNjYTQuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKLS8vCi0vLyBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6Ci0vLyBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0LwotCi11c2luZyBTeXN0ZW07Ci11c2luZyBUaHJpZnQuVHJhbnNwb3J0OwotdXNpbmcgVGhyaWZ0LlByb3RvY29sOwotdXNpbmcgVGhyaWZ0LlRlc3Q7IC8vZ2VuZXJhdGVkIGNvZGUKLQotbmFtZXNwYWNlIFRlc3QKLXsKLQljbGFzcyBQcm9ncmFtCi0JewotCQlzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCi0JCXsKLQkJCWlmIChhcmdzLkxlbmd0aCA9PSAwKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJtdXN0IHByb3ZpZGUgJ3NlcnZlcicgb3IgJ2NsaWVudCcgYXJnIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlzdHJpbmdbXSBzdWJBcmdzID0gbmV3IHN0cmluZ1thcmdzLkxlbmd0aCAtIDFdOwotCQkJZm9yKGludCBpID0gMTsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJc3ViQXJnc1tpLTFdID0gYXJnc1tpXTsKLQkJCX0KLQkJCWlmIChhcmdzWzBdID09ICJjbGllbnQiKQotCQkJewotCQkJCVRlc3RDbGllbnQuRXhlY3V0ZShzdWJBcmdzKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGFyZ3NbMF0gPT0gInNlcnZlciIpCi0JCQl7Ci0JCQkJVGVzdFNlcnZlci5FeGVjdXRlKHN1YkFyZ3MpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJmaXJzdCBhcmd1bWVudCBtdXN0IGJlICdzZXJ2ZXInIG9yICdjbGllbnQnIik7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0Y2E4ZC4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Ci11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7Ci0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKLS8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCi0vLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCi1bYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdFRlc3QiKV0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0VGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIDIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KLQotLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCi0vLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCi0vLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCi1bYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQotCi0vLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KLVthc3NlbWJseTogR3VpZCgiZjQxYjE5M2ItZjFhYi00OGVlLTg4NDMtZjg4ZTQzMDg0ZTI2IildCi0KLS8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6Ci0vLwotLy8gICAgICBNYWpvciBWZXJzaW9uCi0vLyAgICAgIE1pbm9yIFZlcnNpb24KLS8vICAgICAgQnVpbGQgTnVtYmVyCi0vLyAgICAgIFJldmlzaW9uCi0vLwotLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKLS8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6Ci0vLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGVzdENsaWVudC5jcyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGVzdENsaWVudC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyNzhiNy4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Ci11c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Ci11c2luZyBUaHJpZnQuUHJvdG9jb2w7Ci11c2luZyBUaHJpZnQuVHJhbnNwb3J0OwotdXNpbmcgVGhyaWZ0LlRlc3Q7Ci0KLW5hbWVzcGFjZSBUZXN0Ci17Ci0JcHVibGljIGNsYXNzIFRlc3RDbGllbnQKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGludCBudW1JdGVyYXRpb25zID0gMTsKLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlzdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwotCQkJCWludCBwb3J0ID0gOTA5MDsKLQkJCQlzdHJpbmcgdXJsID0gbnVsbDsKLQkJCQlpbnQgbnVtVGhyZWFkcyA9IDE7Ci0JCQkJYm9vbCBidWZmZXJlZCA9IGZhbHNlOwotCi0JCQkJdHJ5Ci0JCQkJewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCi0JCQkJCXsKLQkJCQkJCWlmIChhcmdzW2ldID09ICItaCIpCi0JCQkJCQl7Ci0JCQkJCQkJc3RyaW5nW10gaG9zdHBvcnQgPSBhcmdzWysraV0uU3BsaXQoJzonKTsKLQkJCQkJCQlob3N0ID0gaG9zdHBvcnRbMF07Ci0JCQkJCQkJaWYgKGhvc3Rwb3J0Lkxlbmd0aCA+IDEpCi0JCQkJCQkJewotCQkJCQkJCQlwb3J0ID0gQ29udmVydC5Ub0ludDMyKGhvc3Rwb3J0WzFdKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChhcmdzW2ldID09ICItdSIpCi0JCQkJCQl7Ci0JCQkJCQkJdXJsID0gYXJnc1srK2ldOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYXJnc1tpXSA9PSAiLW4iKQotCQkJCQkJewotCQkJCQkJCW51bUl0ZXJhdGlvbnMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItYnVmZmVyZWQiKQotCQkJCQkJewotCQkJCQkJCWJ1ZmZlcmVkID0gdHJ1ZTsKLQkJCQkJCQlDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYnVmZmVyZWQgc29ja2V0cyIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQotCQkJCQkJewotCQkJCQkJCW51bVRocmVhZHMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlTGluZShlLlN0YWNrVHJhY2UpOwotCQkJCX0KLQotCi0KLQkJCQkvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKLQkJCQlUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtudW1UaHJlYWRzXTsKLQkJCQlEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKLQkJCQlmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRocmVhZHM7IHRlc3QrKykKLQkJCQl7Ci0JCQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFRocmVhZCkpOwotCQkJCQl0aHJlYWRzW3Rlc3RdID0gdDsKLQkJCQkJVFNvY2tldCBzb2NrZXQgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKLQkJCQkJaWYgKGJ1ZmZlcmVkKQotCQkJCQl7Ci0JCQkJCQlUQnVmZmVyZWRUcmFuc3BvcnQgYnVmZmVyID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpOwotCQkJCQkJdC5TdGFydChidWZmZXIpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJdC5TdGFydChzb2NrZXQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgdGVzdCA9IDA7IHRlc3QgPCBudW1UaHJlYWRzOyB0ZXN0KyspCi0JCQkJewotCQkJCQl0aHJlYWRzW3Rlc3RdLkpvaW4oKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKG91dGVyRXguTWVzc2FnZSArICIgU1Q6ICIgKyBvdXRlckV4LlN0YWNrVHJhY2UpOwotCQkJfQotCi0JCQlDb25zb2xlLldyaXRlTGluZSgpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQkJfQotCi0JCXB1YmxpYyBzdGF0aWMgdm9pZCBDbGllbnRUaHJlYWQob2JqZWN0IG9iaikKLQkJewotCQkJVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSAoVFRyYW5zcG9ydClvYmo7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykKLQkJCXsKLQkJCQlDbGllbnRUZXN0KHRyYW5zcG9ydCk7Ci0JCQl9Ci0JCQl0cmFuc3BvcnQuQ2xvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyBzdGF0aWMgdm9pZCBDbGllbnRUZXN0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KQotCQl7Ci0JCQlUQmluYXJ5UHJvdG9jb2wgYmluYXJ5UHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7Ci0KLQkJCVRocmlmdFRlc3QuQ2xpZW50IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChiaW5hcnlQcm90b2NvbCk7Ci0JCQl0cnkKLQkJCXsKLQkJCQlpZiAoIXRyYW5zcG9ydC5Jc09wZW4pCi0JCQkJewotCQkJCQl0cmFuc3BvcnQuT3BlbigpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyB0dHguTWVzc2FnZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlsb25nIHN0YXJ0ID0gRGF0ZVRpbWUuTm93LlRvRmlsZVRpbWUoKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdFZvaWQoKSIpOwotCQkJY2xpZW50LnRlc3RWb2lkKCk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gdm9pZCIpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwotCQkJc3RyaW5nIHMgPSBjbGllbnQudGVzdFN0cmluZygiVGVzdCIpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEJ5dGUoMSkiKTsKLQkJCWJ5dGUgaTggPSBjbGllbnQudGVzdEJ5dGUoKGJ5dGUpMSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk4KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEkzMigtMSkiKTsKLQkJCWludCBpMzIgPSBjbGllbnQudGVzdEkzMigtMSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGkzMik7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOwotCQkJbG9uZyBpNjQgPSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpNjQpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0RG91YmxlKDUuMzI1MDk4MjM1KSIpOwotCQkJZG91YmxlIGR1YiA9IGNsaWVudC50ZXN0RG91YmxlKDUuMzI1MDk4MjM1KTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgZHViKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7Ci0JCQlYdHJ1Y3QgbyA9IG5ldyBYdHJ1Y3QoKTsKLQkJCW8uU3RyaW5nX3RoaW5nID0gIlplcm8iOwotCQkJby5CeXRlX3RoaW5nID0gKGJ5dGUpMTsKLQkJCW8uSTMyX3RoaW5nID0gLTM7Ci0JCQlvLkk2NF90aGluZyA9IC01OwotCQkJWHRydWN0IGkgPSBjbGllbnQudGVzdFN0cnVjdChvKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSIpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSkiKTsKLQkJCVh0cnVjdDIgbzIgPSBuZXcgWHRydWN0MigpOwotCQkJbzIuQnl0ZV90aGluZyA9IChieXRlKTE7Ci0JCQlvMi5TdHJ1Y3RfdGhpbmcgPSBvOwotCQkJbzIuSTMyX3RoaW5nID0gNTsKLQkJCVh0cnVjdDIgaTIgPSBjbGllbnQudGVzdE5lc3QobzIpOwotCQkJaSA9IGkyLlN0cnVjdF90aGluZzsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7Ci0KLQkJCURpY3Rpb25hcnk8aW50LCBpbnQ+IG1hcG91dCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspCi0JCQl7Ci0JCQkJbWFwb3V0W2pdID0gaiAtIDEwOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdE1hcCh7Iik7Ci0JCQlib29sIGZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBrZXkgaW4gbWFwb3V0LktleXMpCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQ29uc29sZS5Xcml0ZSgiLCAiKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlKCJ9KSIpOwotCi0JCQlEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBpbiA9IGNsaWVudC50ZXN0TWFwKG1hcG91dCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBrZXkgaW4gbWFwaW4uS2V5cykKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKCIsICIpOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcGluW2tleV0pOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCQkJTGlzdDxpbnQ+IGxpc3RvdXQgPSBuZXcgTGlzdDxpbnQ+KCk7Ci0JCQlmb3IgKGludCBqID0gLTI7IGogPCAzOyBqKyspCi0JCQl7Ci0JCQkJbGlzdG91dC5BZGQoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0TGlzdCh7Iik7Ci0JCQlmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQgaiBpbiBsaXN0b3V0KQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlKCJ9KSIpOwotCi0JCQlMaXN0PGludD4gbGlzdGluID0gY2xpZW50LnRlc3RMaXN0KGxpc3RvdXQpOwotCi0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQgaiBpbiBsaXN0aW4pCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQ29uc29sZS5Xcml0ZSgiLCAiKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZShqKTsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLQkJCS8vc2V0Ci0JCQlUSGFzaFNldDxpbnQ+IHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7Ci0JCQlmb3IgKGludCBqID0gLTI7IGogPCAzOyBqKyspCi0JCQl7Ci0JCQkJc2V0b3V0LkFkZChqKTsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlKCJ9KSIpOwotCi0JCQlUSGFzaFNldDxpbnQ+IHNldGluID0gY2xpZW50LnRlc3RTZXQoc2V0b3V0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgiID0geyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gc2V0aW4pCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQ29uc29sZS5Xcml0ZSgiLCAiKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZShqKTsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oT05FKSIpOwotCQkJTnVtYmVyeiByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5PTkUpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUV08pIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKLQkJCXJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKLQkJCXJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShFSUdIVCkiKTsKLQkJCXJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOwotCQkJbG9uZyB1aWQgPSBjbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTCk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHVpZCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RNYXBNYXAoMSkiKTsKLQkJCURpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbW0gPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKLQkJCUNvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLQkJCWZvcmVhY2ggKGludCBrZXkgaW4gbW0uS2V5cykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOwotCQkJCURpY3Rpb25hcnk8aW50LCBpbnQ+IG0yID0gbW1ba2V5XTsKLQkJCQlmb3JlYWNoIChpbnQgazIgaW4gbTIuS2V5cykKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoazIgKyAiID0+ICIgKyBtMltrMl0gKyAiLCAiKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZSgifSwgIik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0JCQlJbnNhbml0eSBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKLQkJCWluc2FuZS5Vc2VyTWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgbG9uZz4oKTsKLQkJCWluc2FuZS5Vc2VyTWFwW051bWJlcnouRklWRV0gPSA1MDAwTDsKLQkJCVh0cnVjdCB0cnVjayA9IG5ldyBYdHJ1Y3QoKTsKLQkJCXRydWNrLlN0cmluZ190aGluZyA9ICJUcnVjayI7Ci0JCQl0cnVjay5CeXRlX3RoaW5nID0gKGJ5dGUpODsKLQkJCXRydWNrLkkzMl90aGluZyA9IDg7Ci0JCQl0cnVjay5JNjRfdGhpbmcgPSA4OwotCQkJaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7Ci0JCQlpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOwotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKLQkJCURpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IHdob2EgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7Ci0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmb3JlYWNoIChsb25nIGtleSBpbiB3aG9hLktleXMpCi0JCQl7Ci0JCQkJRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gdmFsID0gd2hvYVtrZXldOwotCQkJCUNvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7Ci0KLQkJCQlmb3JlYWNoIChOdW1iZXJ6IGsyIGluIHZhbC5LZXlzKQotCQkJCXsKLQkJCQkJSW5zYW5pdHkgdjIgPSB2YWxbazJdOwotCi0JCQkJCUNvbnNvbGUuV3JpdGUoazIgKyAiID0+IHsiKTsKLQkJCQkJRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPiB1c2VyTWFwID0gdjIuVXNlck1hcDsKLQotCQkJCQlDb25zb2xlLldyaXRlKCJ7Iik7Ci0JCQkJCWlmICh1c2VyTWFwICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCWZvcmVhY2ggKE51bWJlcnogazMgaW4gdXNlck1hcC5LZXlzKQotCQkJCQkJewotCQkJCQkJCUNvbnNvbGUuV3JpdGUoazMgKyAiID0+ICIgKyB1c2VyTWFwW2szXSArICIsICIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQ29uc29sZS5Xcml0ZSgibnVsbCIpOwotCQkJCQl9Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIn0sICIpOwotCi0JCQkJCUxpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIuWHRydWN0czsKLQotCQkJCQlDb25zb2xlLldyaXRlKCJ7Iik7Ci0JCQkJCWlmICh4dHJ1Y3RzICE9IG51bGwpCi0JCQkJCXsKLQkJCQkJCWZvcmVhY2ggKFh0cnVjdCB4IGluIHh0cnVjdHMpCi0JCQkJCQl7Ci0JCQkJCQkJQ29uc29sZS5Xcml0ZSgie1wiIiArIHguU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5CeXRlX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIn0sICIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQ29uc29sZS5Xcml0ZSgibnVsbCIpOwotCQkJCQl9Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIn0iKTsKLQotCQkJCQlDb25zb2xlLldyaXRlKCJ9LCAiKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZSgifSwgIik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0KLQkJCWJ5dGUgYXJnMCA9IDE7Ci0JCQlpbnQgYXJnMSA9IDI7Ci0JCQlsb25nIGFyZzIgPSBsb25nLk1heFZhbHVlOwotCQkJRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBtdWx0aURpY3QgPSBuZXcgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPigpOwotCQkJbXVsdGlEaWN0WzFdID0gIm9uZSI7Ci0JCQlOdW1iZXJ6IGFyZzQgPSBOdW1iZXJ6LkZJVkU7Ci0JCQlsb25nIGFyZzUgPSA1MDAwMDAwOwotCQkJQ29uc29sZS5Xcml0ZSgiVGVzdCBNdWx0aSgiICsgYXJnMCArICIsIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIiwiICsgbXVsdGlEaWN0ICsgIiwiICsgYXJnNCArICIsIiArIGFyZzUgKyAiKSIpOwotCQkJWHRydWN0IG11bHRpUmVzcG9uc2UgPSBjbGllbnQudGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSk7Ci0JCQlDb25zb2xlLldyaXRlKCIgPSBYdHJ1Y3QoYnl0ZV90aGluZzoiICsgbXVsdGlSZXNwb25zZS5CeXRlX3RoaW5nICsgIixTdHJpbmdfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuU3RyaW5nX3RoaW5nCi0JCQkJCQkrICIsaTMyX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkkzMl90aGluZyArICIsaTY0X3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkk2NF90aGluZyArICIpXG4iKTsKLQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgT25ld2F5KDEpIik7Ci0JCQljbGllbnQudGVzdE9uZXdheSgxKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGVzdFNlcnZlci5jcyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGVzdFNlcnZlci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3MDY0MC4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RTZXJ2ZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKLS8vCi0vLyBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6Ci0vLyBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0LwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Ci11c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLXVzaW5nIFRocmlmdC5Qcm90b2NvbDsKLXVzaW5nIFRocmlmdC5TZXJ2ZXI7Ci0KLW5hbWVzcGFjZSBUZXN0Ci17Ci0JcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKLQl7Ci0JCXB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlciA6IFRocmlmdFRlc3QuSWZhY2UKLQkJewotCQkJcHVibGljIFRTZXJ2ZXIgc2VydmVyOwotCi0JCQlwdWJsaWMgVGVzdEhhbmRsZXIoKSB7IH0KLQotCQkJcHVibGljIHZvaWQgdGVzdFZvaWQoKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0Vm9pZCgpIik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBzdHJpbmcgdGVzdFN0cmluZyhzdHJpbmcgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RzdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgYnl0ZSB0ZXN0Qnl0ZShieXRlIHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0Qnl0ZSgiICsgdGhpbmcgKyAiKSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEkzMigiICsgdGhpbmcgKyAiKSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0STY0KCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgZG91YmxlIHRlc3REb3VibGUoZG91YmxlIHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RG91YmxlKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgWHRydWN0IHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0U3RydWN0KHsiICsKLQkJCQkJCQkJICJcIiIgKyB0aGluZy5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKwotCQkJCQkJCQkgdGhpbmcuQnl0ZV90aGluZyArICIsICIgKwotCQkJCQkJCQkgdGhpbmcuSTMyX3RoaW5nICsgIiwgIiArCi0JCQkJCQkJCSB0aGluZy5JNjRfdGhpbmcgKyAifSkiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QyIHRlc3ROZXN0KFh0cnVjdDIgbmVzdCkKLQkJCXsKLQkJCQlYdHJ1Y3QgdGhpbmcgPSBuZXN0LlN0cnVjdF90aGluZzsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE5lc3QoeyIgKwotCQkJCQkJCQkgbmVzdC5CeXRlX3RoaW5nICsgIiwgeyIgKwotCQkJCQkJCQkgIlwiIiArIHRoaW5nLlN0cmluZ190aGluZyArICJcIiwgIiArCi0JCQkJCQkJCSB0aGluZy5CeXRlX3RoaW5nICsgIiwgIiArCi0JCQkJCQkJCSB0aGluZy5JMzJfdGhpbmcgKyAiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkk2NF90aGluZyArICJ9LCAiICsKLQkJCQkJCQkJIG5lc3QuSTMyX3RoaW5nICsgIn0pIik7Ci0JCQkJcmV0dXJuIG5lc3Q7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBEaWN0aW9uYXJ5PGludCwgaW50PiB0ZXN0TWFwKERpY3Rpb25hcnk8aW50LCBpbnQ+IHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TWFwKHsiKTsKLQkJCQlib29sIGZpcnN0ID0gdHJ1ZTsKLQkJCQlmb3JlYWNoIChpbnQga2V5IGluIHRoaW5nLktleXMpCi0JCQkJewotCQkJCQlpZiAoZmlyc3QpCi0JCQkJCXsKLQkJCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlDb25zb2xlLldyaXRlTGluZSgiLCAiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlTGluZShrZXkgKyAiID0+ICIgKyB0aGluZ1trZXldKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0pIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgVEhhc2hTZXQ8aW50PiB0ZXN0U2V0KFRIYXNoU2V0PGludD4gdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RTZXQoeyIpOwotCQkJCWJvb2wgZmlyc3QgPSB0cnVlOwotCQkJCWZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQotCQkJCXsKLQkJCQkJaWYgKGZpcnN0KQotCQkJCQl7Ci0JCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0JCQkJCX0KLQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoZWxlbSk7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIExpc3Q8aW50PiB0ZXN0TGlzdChMaXN0PGludD4gdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RMaXN0KHsiKTsKLQkJCQlib29sIGZpcnN0ID0gdHJ1ZTsKLQkJCQlmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKLQkJCQl7Ci0JCQkJCWlmIChmaXJzdCkKLQkJCQkJewotCQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIsICIpOwotCQkJCQl9Ci0JCQkJCUNvbnNvbGUuV3JpdGVMaW5lKGVsZW0pOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlTGluZSgifSkiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOdW1iZXJ6IHRlc3RFbnVtKE51bWJlcnogdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFbnVtKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgbG9uZyB0ZXN0VHlwZWRlZihsb25nIHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0VHlwZWRlZigiICsgdGhpbmcgKyAiKSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gdGVzdE1hcE1hcChpbnQgaGVsbG8pCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNYXBNYXAoIiArIGhlbGxvICsgIikiKTsKLQkJCQlEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1hcG1hcCA9Ci0JCQkJICBuZXcgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PigpOwotCi0JCQkJRGljdGlvbmFyeTxpbnQsIGludD4gcG9zID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7Ci0JCQkJRGljdGlvbmFyeTxpbnQsIGludD4gbmVnID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspCi0JCQkJewotCQkJCQlwb3NbaV0gPSBpOwotCQkJCQluZWdbLWldID0gLWk7Ci0JCQkJfQotCi0JCQkJbWFwbWFwWzRdID0gcG9zOwotCQkJCW1hcG1hcFstNF0gPSBuZWc7Ci0KLQkJCQlyZXR1cm4gbWFwbWFwOwotCQkJfQotCi0JCQlwdWJsaWMgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50KQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0SW5zYW5pdHkoKSIpOwotCi0JCQkJWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOwotCQkJCWhlbGxvLlN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotCQkJCWhlbGxvLkJ5dGVfdGhpbmcgPSAyOwotCQkJCWhlbGxvLkkzMl90aGluZyA9IDI7Ci0JCQkJaGVsbG8uSTY0X3RoaW5nID0gMjsKLQotCQkJCVh0cnVjdCBnb29kYnllID0gbmV3IFh0cnVjdCgpOwotCQkJCWdvb2RieWUuU3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKLQkJCQlnb29kYnllLkJ5dGVfdGhpbmcgPSAoYnl0ZSk0OwotCQkJCWdvb2RieWUuSTMyX3RoaW5nID0gNDsKLQkJCQlnb29kYnllLkk2NF90aGluZyA9IChsb25nKTQ7Ci0KLQkJCQlJbnNhbml0eSBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotCQkJCWNyYXp5LlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOwotCQkJCWNyYXp5LlVzZXJNYXBbTnVtYmVyei5FSUdIVF0gPSAobG9uZyk4OwotCQkJCWNyYXp5Llh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7Ci0JCQkJY3JhenkuWHRydWN0cy5BZGQoZ29vZGJ5ZSk7Ci0KLQkJCQlJbnNhbml0eSBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKLQkJCQljcmF6eS5Vc2VyTWFwW051bWJlcnouRklWRV0gPSAobG9uZyk1OwotCQkJCWNyYXp5Llh0cnVjdHMuQWRkKGhlbGxvKTsKLQotCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOwotCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOwotCi0JCQkJZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGNyYXp5OwotCQkJCWZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OwotCi0JCQkJc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBsb29uZXk7Ci0KLQkJCQlEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiBpbnNhbmUgPQotCQkJCSAgbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+KCk7Ci0JCQkJaW5zYW5lWyhsb25nKTFdID0gZmlyc3RfbWFwOwotCQkJCWluc2FuZVsobG9uZykyXSA9IHNlY29uZF9tYXA7Ci0KLQkJCQlyZXR1cm4gaW5zYW5lOwotCQkJfQotCi0JCQlwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aSgpIik7Ci0KLQkJCQlYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7IDsKLQkJCQloZWxsby5TdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKLQkJCQloZWxsby5CeXRlX3RoaW5nID0gYXJnMDsKLQkJCQloZWxsby5JMzJfdGhpbmcgPSBhcmcxOwotCQkJCWhlbGxvLkk2NF90aGluZyA9IGFyZzI7Ci0JCQkJcmV0dXJuIGhlbGxvOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKHN0cmluZyBhcmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oIiArIGFyZyArICIpIik7Ci0JCQkJaWYgKGFyZyA9PSAiWGNlcHRpb24iKQotCQkJCXsKLQkJCQkJWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOwotCQkJCQl4LkVycm9yQ29kZSA9IDEwMDE7Ci0JCQkJCXguTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKLQkJCQkJdGhyb3cgeDsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlwdWJsaWMgWHRydWN0IHRlc3RNdWx0aUV4Y2VwdGlvbihzdHJpbmcgYXJnMCwgc3RyaW5nIGFyZzEpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbigiICsgYXJnMCArICIsICIgKyBhcmcxICsgIikiKTsKLQkJCQlpZiAoYXJnMCA9PSAiWGNlcHRpb24iKQotCQkJCXsKLQkJCQkJWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOwotCQkJCQl4LkVycm9yQ29kZSA9IDEwMDE7Ci0JCQkJCXguTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKLQkJCQkJdGhyb3cgeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikKLQkJCQl7Ci0JCQkJCVhjZXB0aW9uMiB4ID0gbmV3IFhjZXB0aW9uMigpOwotCQkJCQl4LkVycm9yQ29kZSA9IDIwMDI7Ci0JCQkJCXguU3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCgpOwotCQkJCQl4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwotCQkJCQl0aHJvdyB4OwotCQkJCX0KLQotCQkJCVh0cnVjdCByZXN1bHQgPSBuZXcgWHRydWN0KCk7Ci0JCQkJcmVzdWx0LlN0cmluZ190aGluZyA9IGFyZzE7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdGVzdFN0b3AoKQotCQkJewotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXNlcnZlci5TdG9wKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0ZXN0T25ld2F5KGludCBhcmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RPbmV3YXkoIiArIGFyZyArICIpLCBzbGVlcGluZy4uLiIpOwotCQkJCVN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkLlNsZWVwKGFyZyAqIDEwMDApOwotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0T25ld2F5IGZpbmlzaGVkIik7Ci0JCQl9Ci0KLQkJfSAvLyBjbGFzcyBUZXN0SGFuZGxlcgotCi0JCXB1YmxpYyBzdGF0aWMgdm9pZCBFeGVjdXRlKHN0cmluZ1tdIGFyZ3MpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCWJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7Ci0JCQkJaW50IHBvcnQgPSA5MDkwOwotCQkJCWlmIChhcmdzLkxlbmd0aCA+IDApCi0JCQkJewotCQkJCQlwb3J0ID0gaW50LlBhcnNlKGFyZ3NbMF0pOwotCi0JCQkJCWlmIChhcmdzLkxlbmd0aCA+IDEpCi0JCQkJCXsKLQkJCQkJCWJvb2wuVHJ5UGFyc2UoYXJnc1sxXSwgb3V0IHVzZUJ1ZmZlcmVkU29ja2V0cyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBQcm9jZXNzb3IKLQkJCQlUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOwotCQkJCVRocmlmdFRlc3QuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IodGVzdEhhbmRsZXIpOwotCi0JCQkJLy8gVHJhbnNwb3J0Ci0JCQkJVFNlcnZlclNvY2tldCB0U2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgdXNlQnVmZmVyZWRTb2NrZXRzKTsKLQotCQkJCVRTZXJ2ZXIgc2VydmVyRW5naW5lOwotCi0JCQkJLy8gU2ltcGxlIFNlcnZlcgotCQkJCXNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRTZXJ2ZXJTb2NrZXQpOwotCi0JCQkJLy8gVGhyZWFkUG9vbCBTZXJ2ZXIKLQkJCQkvLyBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLQkJCQkvLyBUaHJlYWRlZCBTZXJ2ZXIKLQkJCQkvLyBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRTZXJ2ZXJTb2NrZXQpOwotCi0JCQkJdGVzdEhhbmRsZXIuc2VydmVyID0gc2VydmVyRW5naW5lOwotCi0JCQkJLy8gUnVuIGl0Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiICsgcG9ydCArICh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArICIuLi4iKTsKLQkJCQlzZXJ2ZXJFbmdpbmUuU2VydmUoKTsKLQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KQotCQkJewotCQkJCUNvbnNvbGUuRXJyb3IuV3JpdGUoeCk7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5jc3Byb2ogYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTU1ODNhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPFByb3BlcnR5R3JvdXA+Ci0gICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+Ci0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgotICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgotICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KLSAgICA8UHJvamVjdEd1aWQ+ezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ308L1Byb2plY3RHdWlkPgotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0VGVzdDwvUm9vdE5hbWVzcGFjZT4KLSAgICA8QXNzZW1ibHlOYW1lPlRocmlmdFRlc3Q8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KLSAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KLSAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KLSAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KLSAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgotICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KLSAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgotICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KLSAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgotICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KLSAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+Ci0gICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KLSAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KLSAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iVGhyaWZ0SW1wbCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KLSAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KLSAgICAgIDxIaW50UGF0aD4uXFRocmlmdEltcGwuZGxsPC9IaW50UGF0aD4KLSAgICA8L1JlZmVyZW5jZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Q2xpZW50LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RTZXJ2ZXIuY3MiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiI+Ci0gICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KLSAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KLSAgICA8L1Byb2plY3RSZWZlcmVuY2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgotICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KLSAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgotICA8L1RhcmdldD4KLSAgLS0+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKLWRlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgotU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQotU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cVGhyaWZ0VGVzdC50aHJpZnQKLWZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQotZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQotIiQoUHJvamVjdERpcilcLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1Ci0kKE1TQnVpbGRUb29sc1BhdGgpXENzYy5leGUgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcYmluXERlYnVnXFRocmlmdC5kbGwiPC9QcmVCdWlsZEV2ZW50PgotICA8L1Byb3BlcnR5R3JvdXA+Ci08L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9tYWtldGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU4MGRlOC4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNzaGFycCAtbyAuIC4uLy4uL1RocmlmdFRlc3QudGhyaWZ0Ci1nbWNzIC90OmxpYnJhcnkgL291dDouL1RocmlmdEltcGwuZGxsIC9yZWN1cnNlOi4vZ2VuLWNzaGFycC8qIC9yZWZlcmVuY2U6Li4vLi4vLi4vbGliL2NzaGFycC9UaHJpZnQuZGxsCmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvTWFrZWZpbGUuYW0gYi90ZXN0L2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1MGVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QvbGliL3RocmlmdF90ZXN0LmRhcnQ6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGRhcnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHViLWdldC1nZW46IGdlbi1kYXJ0L3RocmlmdF90ZXN0L2xpYi90aHJpZnRfdGVzdC5kYXJ0CisJY2QgZ2VuLWRhcnQvdGhyaWZ0X3Rlc3Q7ICR7REFSVFBVQn0gZ2V0CisKK3B1Yi1nZXQ6IHB1Yi1nZXQtZ2VuCisJY2QgdGVzdF9jbGllbnQ7ICR7REFSVFBVQn0gZ2V0CisKK3N0dWJzOiBnZW4tZGFydC90aHJpZnRfdGVzdC9saWIvdGhyaWZ0X3Rlc3QuZGFydCBwdWItZ2V0CisKK3ByZWNyb3NzOiBzdHVicworCitjaGVjazogc3R1YnMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWRhcnQgdGVzdF9jbGllbnQvLnB1YgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK2NsaWVudDogc3R1YnMKKwkke0RBUlR9IHRlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQKZGlmZiAtLWdpdCBhL3Rlc3QvZGFydC90ZXN0X2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorYW5hbHl6ZXI6CisgIHN0cm9uZy1tb2RlOiB0cnVlCmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvYmluL21haW4uZGFydCBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Njg0NGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvYmluL21haW4uZGFydApAQCAtMCwwICsxLDMzNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CitpbXBvcnQgJ2RhcnQ6aW8nOworCitpbXBvcnQgJ3BhY2thZ2U6YXJncy9hcmdzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmNvbGxlY3Rpb24vY29sbGVjdGlvbi5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgYXMgaHR0cDsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfY29uc29sZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnRfdGVzdC90aHJpZnRfdGVzdC5kYXJ0JzsKKworY29uc3QgVEVTVF9CQVNFVFlQRVMgPSAxOyAvLyAwMDAwIDAwMDEKK2NvbnN0IFRFU1RfU1RSVUNUUyA9IDI7IC8vIDAwMDAgMDAxMAorY29uc3QgVEVTVF9DT05UQUlORVJTID0gNDsgLy8gMDAwMCAwMTAwCitjb25zdCBURVNUX0VYQ0VQVElPTlMgPSA4OyAvLyAwMDAwIDEwMDAKK2NvbnN0IFRFU1RfVU5LTk9XTiA9IDY0OyAvLyAwMTAwIDAwMDAgKEZhaWxlZCB0byBwcmVwYXJlIGVudmlyb25lbXQgZXRjLikKK2NvbnN0IFRFU1RfVElNRU9VVCA9IDEyODsgLy8gMTAwMCAwMDAwCitjb25zdCBURVNUX05PVFVTRUQgPSA0ODsgLy8gMDAxMSAwMDAwIChyZXNlcnZlZCBiaXRzKQorCit0eXBlZGVmIEZ1dHVyZSBGdXR1cmVGdW5jdGlvbigpOworCitjbGFzcyBUVGVzdCB7CisgIGZpbmFsIGludCBlcnJvckNvZGU7CisgIGZpbmFsIFN0cmluZyBuYW1lOworICBmaW5hbCBGdXR1cmVGdW5jdGlvbiBmdW5jOworCisgIFRUZXN0KHRoaXMuZXJyb3JDb2RlLCB0aGlzLm5hbWUsIHRoaXMuZnVuYyk7Cit9CisKK2NsYXNzIFRUZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7CisgIGZpbmFsIGFjdHVhbDsKKyAgZmluYWwgZXhwZWN0ZWQ7CisKKyAgVFRlc3RFcnJvcih0aGlzLmFjdHVhbCwgdGhpcy5leHBlY3RlZCk7CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyRhY3R1YWwgIT0gJGV4cGVjdGVkJzsKK30KKworTGlzdDxUVGVzdD4gX3Rlc3RzOworVGhyaWZ0VGVzdENsaWVudCBjbGllbnQ7Citib29sIHZlcmJvc2U7CisKKy8vLyBBZGFwdGVkIGZyb20gVGVzdENsaWVudC5waHAKK21haW4oTGlzdDxTdHJpbmc+IGFyZ3MpIGFzeW5jIHsKKyAgQXJnUmVzdWx0cyByZXN1bHRzID0gX3BhcnNlQXJncyhhcmdzKTsKKworICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CisgICAgZXhpdChURVNUX1VOS05PV04pOworICB9CisKKyAgdmVyYm9zZSA9IHJlc3VsdHNbJ3ZlcmJvc2UnXSA9PSB0cnVlOworCisgIGF3YWl0IF9pbml0VGVzdENsaWVudCgKKyAgICAgIGhvc3Q6IHJlc3VsdHNbJ2hvc3QnXSwKKyAgICAgIHBvcnQ6IGludC5wYXJzZShyZXN1bHRzWydwb3J0J10pLAorICAgICAgdHJhbnNwb3J0VHlwZTogcmVzdWx0c1sndHJhbnNwb3J0J10sCisgICAgICBwcm90b2NvbFR5cGU6IHJlc3VsdHNbJ3Byb3RvY29sJ10pLmNhdGNoRXJyb3IoKGUpIHsKKyAgICBzdGRvdXQud3JpdGVsbignRXJyb3I6Jyk7CisgICAgc3Rkb3V0LndyaXRlbG4oJyRlJyk7CisgICAgaWYgKGUgaXMgRXJyb3IpIHsKKyAgICAgIHN0ZG91dC53cml0ZWxuKCcke2Uuc3RhY2tUcmFjZX0nKTsKKyAgICB9CisgICAgZXhpdChURVNUX1VOS05PV04pOworICB9KTsKKworICAvLyBydW4gdGVzdHMKKyAgX3Rlc3RzID0gX2NyZWF0ZVRlc3RzKCk7CisKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgZm9yIChUVGVzdCB0ZXN0IGluIF90ZXN0cykgeworICAgIGlmICh2ZXJib3NlKSBzdGRvdXQud3JpdGUoJyR7dGVzdC5uYW1lfS4uLiAnKTsKKyAgICB0cnkgeworICAgICAgYXdhaXQgdGVzdC5mdW5jKCk7CisgICAgICBpZiAodmVyYm9zZSkgc3Rkb3V0LndyaXRlbG4oJ3N1Y2Nlc3MhJyk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgaWYgKHZlcmJvc2UpIHN0ZG91dC53cml0ZWxuKCckZScpOworICAgICAgcmVzdWx0ID0gcmVzdWx0IHwgdGVzdC5lcnJvckNvZGU7CisgICAgfQorICB9CisKKyAgZXhpdChyZXN1bHQpOworfQorCitBcmdSZXN1bHRzIF9wYXJzZUFyZ3MoTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbignaG9zdCcsIGRlZmF1bHRzVG86ICdsb2NhbGhvc3QnLCBoZWxwOiAnVGhlIHNlcnZlciBob3N0Jyk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3BvcnQnLCBkZWZhdWx0c1RvOiAnOTA5MCcsIGhlbHA6ICdUaGUgcG9ydCB0byBjb25uZWN0IHRvJyk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3RyYW5zcG9ydCcsCisgICAgICBkZWZhdWx0c1RvOiAnYnVmZmVyZWQnLAorICAgICAgYWxsb3dlZDogWydidWZmZXJlZCcsICdmcmFtZWQnLCAnaHR0cCddLAorICAgICAgaGVscDogJ1RoZSB0cmFuc3BvcnQgbmFtZScsCisgICAgICBhbGxvd2VkSGVscDogeworICAgICAgICAnYnVmZmVyZWQnOiAnVEJ1ZmZlcmVkVHJhbnNwb3J0JywKKyAgICAgICAgJ2ZyYW1lZCc6ICdURnJhbWVkVHJhbnNwb3J0JworICAgICAgfSk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3Byb3RvY29sJywKKyAgICAgIGRlZmF1bHRzVG86ICdiaW5hcnknLAorICAgICAgYWxsb3dlZDogWydiaW5hcnknLCAnY29tcGFjdCcsICdqc29uJ10sCisgICAgICBoZWxwOiAnVGhlIHByb3RvY29sIG5hbWUnLAorICAgICAgYWxsb3dlZEhlbHA6IHsKKyAgICAgICAgJ2JpbmFyeSc6ICdUQmluYXJ5UHJvdG9jb2wnLAorICAgICAgICAnY29tcGFjdCc6ICdUQ29tcGFjdFByb3RvY29sJywKKyAgICAgICAgJ2pzb24nOiAnVEpzb25Qcm90b2NvbCcKKyAgICAgIH0pOworICBwYXJzZXIuYWRkRmxhZygndmVyYm9zZScsIGRlZmF1bHRzVG86IGZhbHNlKTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHN0ZG91dC53cml0ZWxuKCckZVxuJyk7CisgIH0KKworICBpZiAocmVzdWx0cyA9PSBudWxsKSBzdGRvdXQud3JpdGUocGFyc2VyLnVzYWdlKTsKKworICByZXR1cm4gcmVzdWx0czsKK30KKworVFByb3RvY29sRmFjdG9yeSBnZXRQcm90b2NvbEZhY3RvcnkoU3RyaW5nIHByb3RvY29sVHlwZSkgeworICBpZiAocHJvdG9jb2xUeXBlID09ICdiaW5hcnknKSB7CisgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xUeXBlID09ICdjb21wYWN0JykgeworICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbFR5cGUgPT0gJ2pzb24nKSB7CisgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sRmFjdG9yeSgpOworICB9CisKKyAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IudmFsdWUocHJvdG9jb2xUeXBlKTsKK30KKworRnV0dXJlIF9pbml0VGVzdENsaWVudCgKKyAgICB7U3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgdHJhbnNwb3J0VHlwZSwgU3RyaW5nIHByb3RvY29sVHlwZX0pIGFzeW5jIHsKKyAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgIHZhciBwcm90b2NvbEZhY3RvcnkgPSBnZXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xUeXBlKTsKKworICBpZiAodHJhbnNwb3J0VHlwZSA9PSAnaHR0cCcpIHsKKyAgICB2YXIgaHR0cENsaWVudCA9IG5ldyBodHRwLklPQ2xpZW50KCk7CisgICAgdmFyIHVyaSA9IFVyaS5wYXJzZSgnaHR0cDovLyRob3N0OiRwb3J0Jyk7CisgICAgdmFyIGNvbmZpZyA9IG5ldyBUSHR0cENvbmZpZyh1cmksIHt9KTsKKyAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQoaHR0cENsaWVudCwgY29uZmlnKTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgc29ja2V0ID0gYXdhaXQgU29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQobmV3IFRUY3BTb2NrZXQoc29ja2V0KSk7CisgICAgaWYgKHRyYW5zcG9ydFR5cGUgPT0gJ2ZyYW1lZCcpIHsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgfQorICB9CisKKyAgdmFyIHByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworfQorCitMaXN0PFRUZXN0PiBfY3JlYXRlVGVzdHMoKSB7CisgIExpc3Q8VFRlc3Q+IHRlc3RzID0gW107CisKKyAgdmFyIHh0cnVjdCA9IG5ldyBYdHJ1Y3QoKQorICAgIC4uc3RyaW5nX3RoaW5nID0gJ1plcm8nCisgICAgLi5ieXRlX3RoaW5nID0gMQorICAgIC4uaTMyX3RoaW5nID0gLTMKKyAgICAuLmk2NF90aGluZyA9IC01OworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0Vm9pZCcsICgpIGFzeW5jIHsKKyAgICBhd2FpdCBjbGllbnQudGVzdFZvaWQoKTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0U3RyaW5nJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9ICdUZXN0JzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTdHJpbmcoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RCb29sJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IHRydWU7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbChpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEJ5dGUnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gNjQ7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0Qnl0ZShpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEkzMicsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAyMTQ3NDgzNjQ3OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEkzMihpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEk2NCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEk2NChpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdERvdWJsZScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAzLjE0MTU5MjY7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0RG91YmxlKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0QmluYXJ5JywgKCkgYXN5bmMgeworICAgIHZhciB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKyAgICB2YXIgaW5wdXQgPSB1dGY4Q29kZWMuZW5jb2RlKCdmb28nKTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RCaW5hcnkoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IExpc3RFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdFN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3QoeHRydWN0KTsKKyAgICBpZiAoJyRyZXN1bHQnICE9ICckeHRydWN0JykgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCB4dHJ1Y3QpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TmVzdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgWHRydWN0MigpCisgICAgICAuLmJ5dGVfdGhpbmcgPSAxCisgICAgICAuLnN0cnVjdF90aGluZyA9IHh0cnVjdAorICAgICAgLi5pMzJfdGhpbmcgPSAtMzsKKworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE5lc3QoaW5wdXQpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyRpbnB1dCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TWFwJywgKCkgYXN5bmMgeworICAgIE1hcDxpbnQsIGludD4gaW5wdXQgPSB7MTogLTEwLCAyOiAtOSwgMzogLTgsIDQ6IC03LCA1OiAtNn07CisKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RNYXAoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IE1hcEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0U2V0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBTZXQ8aW50Pi5mcm9tKFstMiwgLTEsIDAsIDEsIDJdKTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RTZXQoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IFNldEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TGlzdCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBbLTIsIC0xLCAwLCAxLCAyXTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RMaXN0KGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBMaXN0RXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RFbnVtJywgKCkgYXN5bmMgeworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6Lk9ORSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouVFdPKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5USFJFRSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RUeXBlZGVmJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDMwOTg1ODIzNTA4MjUyMzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE1hcE1hcCcsICgpIGFzeW5jIHsKKyAgICBNYXA8aW50LCBNYXA8aW50LCBpbnQ+PiByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcCgxKTsKKyAgICBpZiAocmVzdWx0LmlzRW1wdHkgfHwgcmVzdWx0W3Jlc3VsdC5rZXlzLmZpcnN0XS5pc0VtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsICdNYXA8aW50LCBNYXA8aW50LCBpbnQ+PicpOworICAgIH0KKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdEluc2FuaXR5JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBJbnNhbml0eSgpOworICAgIGlucHV0LnVzZXJNYXAgPSB7TnVtYmVyei5GSVZFOiA1MDAwfTsKKyAgICBpbnB1dC54dHJ1Y3RzID0gW3h0cnVjdF07CisKKyAgICBNYXA8aW50LCBNYXA8aW50LCBJbnNhbml0eT4+IHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5wdXQpOworICAgIGlmIChyZXN1bHQuaXNFbXB0eSB8fCByZXN1bHRbcmVzdWx0LmtleXMuZmlyc3RdLmlzRW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgJ01hcDxpbnQsIE1hcDxpbnQsIEluc2FuaXR5Pj4nKTsKKyAgICB9CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RNdWx0aScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgWHRydWN0KCkKKyAgICAgIC4uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMicKKyAgICAgIC4uYnl0ZV90aGluZyA9IDEyMworICAgICAgLi5pMzJfdGhpbmcgPSA0NTYKKyAgICAgIC4uaTY0X3RoaW5nID0gNzg5OworCisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TXVsdGkoaW5wdXQuYnl0ZV90aGluZywgaW5wdXQuaTMyX3RoaW5nLAorICAgICAgICBpbnB1dC5pNjRfdGhpbmcsIHsxOiAnb25lJ30sIE51bWJlcnouRUlHSFQsIDU2NzgpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyRpbnB1dCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0VYQ0VQVElPTlMsICd0ZXN0RXhjZXB0aW9uJywgKCkgYXN5bmMgeworICAgIHRyeSB7CisgICAgICBhd2FpdCBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKKyAgICB9IG9uIFhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IobnVsbCwgJ1hjZXB0aW9uJyk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfRVhDRVBUSU9OUywgJ3Rlc3RNdWx0aUV4Y2VwdGlvbicsICgpIGFzeW5jIHsKKyAgICB0cnkgeworICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24yJywgJ2ZvbycpOworICAgIH0gb24gWGNlcHRpb24yIGNhdGNoIChfKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IobnVsbCwgJ1hjZXB0aW9uMicpOworICB9KSk7CisKKyAgcmV0dXJuIHRlc3RzOworfQorCitGdXR1cmUgX3Rlc3RFbnVtKGludCBpbnB1dCkgYXN5bmMgeworICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtKGlucHV0KTsKKyAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTY0MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDM2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHRocmlmdF90ZXN0X2NsaWVudAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBBIGNsaWVudCBpbnRlZ3JhdGlvbiB0ZXN0IGZvciB0aGUgRGFydCBUaHJpZnQgbGlicmFyeQorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBhcmdzOiBeMC4xMy4wCisgIGh0dHA6IF4wLjExLjAKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHRocmlmdF90ZXN0OgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3RocmlmdF90ZXN0CisKK2Rldl9kZXBlbmRlbmNpZXM6CisgIHRlc3Q6ICJeMC4xMi4wIgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvTWFrZWZpbGUgYi90ZXN0L2VybC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyNjAzNy4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1HRU5ESVI9Z2VuCi1HRU5fSU5DTFVERURJUj0kKEdFTkRJUikvaW5jbHVkZQotR0VOX1NSQ0RJUj0kKEdFTkRJUikvc3JjCi1HRU5fVEFSR0VURElSPSQoR0VORElSKS9lYmluCi0KLUlOQ0xVREVESVI9aW5jbHVkZQotVEFSR0VURElSPWViaW4KLVNSQ0RJUj1zcmMKLQotQUxMX0lOQ0xVREVESVI9JChHRU5fSU5DTFVERURJUikgJChJTkNMVURFRElSKSAuLi8uLi9saWIvZXJsL2luY2x1ZGUKLUlOQ0xVREVGTEFHUz0kKHBhdHN1YnN0ICUsLUklLCAke0FMTF9JTkNMVURFRElSfSkKLQotTU9EVUxFUyA9IHN0cmVzc19zZXJ2ZXIgdGVzdF9zZXJ2ZXIgdGVzdF9kaXNrbG9nIHRlc3RfbWVtYnVmZmVyIHRlc3RfdGV0aGVyCi0KLUlOQ0xVREVTID0gCi1UQVJHRVRTID0gJChwYXRzdWJzdCAlLCR7VEFSR0VURElSfS8lLmJlYW0sJHtNT0RVTEVTfSkKLUhFQURFUlMgPSAkKHBhdHN1YnN0ICUsJHtJTkNMVURFRElSfS8lLmhybCwke0lOQ0xVREVTfSkKLQotYWxsOiAke0dFTl9UQVJHRVRESVJ9LyAke1RBUkdFVFN9Ci0KLVRFU1RfUlBDRklMRSA9IC4uL1RocmlmdFRlc3QudGhyaWZ0Ci1TVFJFU1NfUlBDRklMRSA9IC4uL1N0cmVzc1Rlc3QudGhyaWZ0Ci1USFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLSR7R0VORElSfS86ICR7UlBDRklMRX0KLQlybSAtcmYgJHtHRU5ESVJ9Ci0JJHtUSFJJRlR9IC0tZ2VuIGVybCAke1RFU1RfUlBDRklMRX0KLQkke1RIUklGVH0gLS1nZW4gZXJsICR7U1RSRVNTX1JQQ0ZJTEV9Ci0JbWtkaXIgLXAgJHtHRU5fSU5DTFVERURJUn0KLQlta2RpciAtcCAke0dFTl9TUkNESVJ9Ci0JbWtkaXIgLXAgJHtHRU5fVEFSR0VURElSfQotCW12IC10ICR7R0VOX0lOQ0xVREVESVJ9IGdlbi1lcmwvKi5ocmwKLQltdiAtdCAke0dFTl9TUkNESVJ9IGdlbi1lcmwvKi5lcmwKLQlybSAtcmYgZ2VuLWVybAotCi0ke0dFTl9UQVJHRVRESVJ9LzogJHtHRU5ESVJ9LwotCXJtIC1yZiAke0dFTl9UQVJHRVRESVJ9Ci0JbWtkaXIgLXAgJHtHRU5fVEFSR0VURElSfQotCWVybGMgJHtJTkNMVURFRkxBR1N9IC1vICR7R0VOX1RBUkdFVERJUn0gJHtHRU5fU1JDRElSfS8qLmVybAotCi0kKFRBUkdFVFMpOiAke1RBUkdFVERJUn0vJS5iZWFtOiAke1NSQ0RJUn0vJS5lcmwgJHtHRU5fSU5DTFVERURJUn0vICR7SEVBREVSU30KLQlta2RpciAtcCAke1RBUkdFVERJUn0KLQllcmxjICR7SU5DTFVERUZMQUdTfSAtbyAke1RBUkdFVERJUn0gJDwKLQotY2xlYW46Ci0Jcm0gLWYgJHtUQVJHRVRESVJ9LyouYmVhbQotCXJtIC1yZiAke0dFTkRJUn0KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL01ha2VmaWxlLmFtIGIvdGVzdC9lcmwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyNWU4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlRfRklMRVMgPSAkKHdpbGRjYXJkIC4uLyoudGhyaWZ0KQorCitpZiBFUkxBTkdfT1RQMTYKK0VSTF9GTEFHID0gZXJsOm90cDE2CitlbHNlCitFUkxfRkxBRyA9IGVybAorZW5kaWYKKyMgbWFrZSBzdXJlIFRocmlmdFRlc3QudGhyaWZ0IGlzIGdlbmVyYXRlZCBsYXN0IHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3RoZXIgKi50aHJpZnQgZmlsZXMKKy5nZW5lcmF0ZWQ6ICQoVEhSSUZUX0ZJTEVTKQorCWZvciBmIGluICQoVEhSSUZUX0ZJTEVTKSA7IGRvIFwKKwkgICQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHKSAtbyBzcmMgJCRmIDsgXAorCWRvbmUgOyBcCisJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHNyYyAuLi9UaHJpZnRUZXN0LnRocmlmdAorCXRvdWNoIC5nZW5lcmF0ZWQKKworcHJlY3Jvc3M6IC5nZW5lcmF0ZWQKKwkkKFJFQkFSKSBjb21waWxlCisKK2NsZWFuOgorCXJtIC1mIC5nZW5lcmF0ZWQKKwlybSAtcmYgc3JjL2dlbi1lcmwKKwkkKFJFQkFSKSBjbGVhbgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvcmViYXIuY29uZmlnIGIvdGVzdC9lcmwvcmViYXIuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTA3ODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9yZWJhci5jb25maWcKQEAgLTAsMCArMSw2IEBACit7c3ViX2RpcnMsIFsiLi4vLi4vbGliL2VybCJdfS4KKwore2VybF9vcHRzLCBbCisgIGRlYnVnX2luZm8sCisgIHtpLCAiLi4vLi4vbGliL2VybC9pbmNsdWRlIn0KK119LgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3Rlc3RfY2xpZW50LmVybCBiL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhZDU5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwKQEAgLTAsMCArMSwxNzQgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfY2xpZW50KS4KKworLWV4cG9ydChbc3RhcnQvMCwgc3RhcnQvMV0pLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfdGVzdF90eXBlcy5ocmwiKS4KKworLXJlY29yZChvcHRpb25zLCB7cG9ydCA9IDkwOTAsCisgICAgICAgICAgICAgICAgICBjbGllbnRfb3B0cyA9IFtdfSkuCisKK3BhcnNlX2FyZ3MoQXJncykgLT4gcGFyc2VfYXJncyhBcmdzLCAjb3B0aW9uc3t9KS4KK3BhcnNlX2FyZ3MoW10sIE9wdHMpIC0+CisgIE9wdHM7CitwYXJzZV9hcmdzKFtIZWFkIHwgUmVzdF0sIE9wdHMpIC0+CisgICAgTmV3T3B0cyA9CisgICAgICAgIGNhc2UgSGVhZCBvZgorICAgICAgICAgICAgIi0tcG9ydD0iICsrIFBvcnQgLT4KKyAgICAgICAgICAgICAgICBjYXNlIHN0cmluZzp0b19pbnRlZ2VyKFBvcnQpIG9mCisgICAgICAgICAgICAgICAgICB7SW50UG9ydCxffSB3aGVuIGlzX2ludGVnZXIoSW50UG9ydCkgLT4KKyAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBJbnRQb3J0fTsKKyAgICAgICAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tdHJhbnNwb3J0PSIgKysgVHJhbnMgLT4KKyAgICAgICAgICAgICAgICAlIFRPRE86IEVuYWJsZSBCdWZmZXJlZCBhbmQgSFRUUCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zIG9mCisgICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7Y2xpZW50X29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuY2xpZW50X29wdHNdfTsKKyAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS1zc2wiIC0+CisgICAgICAgICAgICAgICAgc3NsOnN0YXJ0KCksCisgICAgICAgICAgICAgICAgU3NsT3B0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgIHtzc2xvcHRpb25zLCBbCisgICAgICAgICAgICAgICAgICAgICAgICB7Y2FjZXJ0ZmlsZSwgIi4uL2tleXMvQ0EucGVtIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7Y2VydGZpbGUsICIuLi9rZXlzL2NsaWVudC5wZW0ifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtrZXlmaWxlLCAiLi4va2V5cy9jbGllbnQua2V5In0KKyAgICAgICAgICAgICAgICAgICAgXX0sCisgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze2NsaWVudF9vcHRzID0gW3tzc2x0cmFuc3BvcnQsIHRydWV9IHwgW1NzbE9wdGlvbnMgfCBPcHRzI29wdGlvbnMuY2xpZW50X29wdHNdXX07CisgICAgICAgICAgICAiLS1wcm90b2NvbD0iICsrIFByb3RvIC0+CisgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze2NsaWVudF9vcHRzID0gW3twcm90b2NvbCwgbGlzdF90b19hdG9tKFByb3RvKX1dfTsKKyAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKKyAgICAgICAgZW5kLAorICAgIHBhcnNlX2FyZ3MoUmVzdCwgTmV3T3B0cykuCisKK3N0YXJ0KCkgLT4gc3RhcnQoaW5pdDpnZXRfcGxhaW5fYXJndW1lbnRzKCkpLgorc3RhcnQoQXJncykgLT4KKyAgI29wdGlvbnN7cG9ydCA9IFBvcnQsIGNsaWVudF9vcHRzID0gQ2xpZW50T3B0c30gPSBwYXJzZV9hcmdzKEFyZ3MpLAorICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygKKyAgICAiMTI3LjAuMC4xIiwgUG9ydCwgdGhyaWZ0X3Rlc3RfdGhyaWZ0LCBDbGllbnRPcHRzKSwKKworICBEZW1vWHRydWN0ID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3QneworICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nID0gPDwiWmVybyI+PiwKKyAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSAxLAorICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gOTEyODM2MSwKKyAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDd9LAorCisgIERlbW9OZXN0ID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3QyJ3sKKyAgICBieXRlX3RoaW5nID0gNywKKyAgICBzdHJ1Y3RfdGhpbmcgPSBEZW1vWHRydWN0LAorICAgICUgTm90ZSB0aGF0IHdlIGRvbid0IHNldCBpMzJfdGhpbmcsIGl0IHdpbGwgY29tZSBiYWNrIGFzIHVuZGVmaW5lZAorICAgICUgZnJvbSB0aGUgUHl0aG9uIHNlcnZlciwgYnV0IDAgZnJvbSB0aGUgQysrIHNlcnZlciwgc2luY2UgaXQgaXMgbm90CisgICAgJSBvcHRpb25hbAorICAgIGkzMl90aGluZyA9IDJ9LAorCisgICUgSXMgaXQgc2FmZSB0byBtYXRjaCB0aGVzZSB0aGluZ3M/CisgIERlbW9EaWN0ID0gZGljdDpmcm9tX2xpc3QoWyB7S2V5LCBLZXktMTB9IHx8IEtleSA8LSBsaXN0czpzZXEoMCwxMCkgXSksCisgIERlbW9TZXQgPSBzZXRzOmZyb21fbGlzdChbIEtleSB8fCBLZXkgPC0gbGlzdHM6c2VxKC0zLDMpIF0pLAorCisgIERlbW9JbnNhbmUgPSAjJ3RocmlmdC50ZXN0Lkluc2FuaXR5J3sKKyAgICB1c2VyTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9GSVZFLCA1MDAwfV0pLAorICAgIHh0cnVjdHMgPSBbIyd0aHJpZnQudGVzdC5YdHJ1Y3QneyBzdHJpbmdfdGhpbmcgPSA8PCJUcnVjayI+PiwgYnl0ZV90aGluZyA9IDgsIGkzMl90aGluZyA9IDgsIGk2NF90aGluZyA9IDh9XX0sCisKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0Vm9pZCIpLAorICB7Q2xpZW50MDEsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwLCB0ZXN0Vm9pZCwgW10pLAorCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFN0cmluZyIpLAorICB7Q2xpZW50MDIsIHtvaywgPDwiVGVzdCI+Pn19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDEsIHRlc3RTdHJpbmcsIFsiVGVzdCJdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0U3RyaW5nIiksCisgIHtDbGllbnQwMywge29rLCA8PCJUZXN0Ij4+fX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwMiwgdGVzdFN0cmluZywgWzw8IlRlc3QiPj5dKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0Qnl0ZSIpLAorICB7Q2xpZW50MDQsIHtvaywgNjN9fSAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDMsIHRlc3RCeXRlLCBbNjNdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0STMyIiksCisgIHtDbGllbnQwNSwge29rLCAtMX19ICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNCwgdGVzdEkzMiwgWy0xXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEkzMiIpLAorICB7Q2xpZW50MDYsIHtvaywgMH19ICAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDUsIHRlc3RJMzIsIFswXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEk2NCIpLAorICB7Q2xpZW50MDcsIHtvaywgLTM0MzU5NzM4MzY4fX0gICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDYsIHRlc3RJNjQsIFstMzQzNTk3MzgzNjhdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0RG91YmxlIiksCisgIHtDbGllbnQwOCwge29rLCAtNS4yMDk4NTIzfX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNywgdGVzdERvdWJsZSwgWy01LjIwOTg1MjNdKSwKKyAgJSUgVE9ETzogYWRkIHRlc3RCaW5hcnkoKSBjYWxsCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFN0cnVjdCIpLAorICB7Q2xpZW50MDksIHtvaywgRGVtb1h0cnVjdH19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDgsIHRlc3RTdHJ1Y3QsIFtEZW1vWHRydWN0XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdE5lc3QiKSwKKyAge0NsaWVudDEwLCB7b2ssIERlbW9OZXN0fX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA5LCB0ZXN0TmVzdCwgW0RlbW9OZXN0XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdE1hcCIpLAorICB7Q2xpZW50MTEsIHtvaywgRGVtb0RpY3R9fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTAsIHRlc3RNYXAsIFtEZW1vRGljdF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTZXQiKSwKKyAge0NsaWVudDEyLCB7b2ssIERlbW9TZXR9fSAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDExLCB0ZXN0U2V0LCBbRGVtb1NldF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RMaXN0IiksCisgIHtDbGllbnQxMywge29rLCBbLTEsMiwzXX19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMiwgdGVzdExpc3QsIFtbLTEsMiwzXV0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RFbnVtIiksCisgIHtDbGllbnQxNCwge29rLCAxfX0gICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMywgdGVzdEVudW0sIFs/VEhSSUZUX1RFU1RfTlVNQkVSWl9PTkVdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0VHlwZWRlZiIpLAorICB7Q2xpZW50MTUsIHtvaywgMzA5ODU4MjM1MDgyNTIzfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTQsIHRlc3RUeXBlZGVmLCBbMzA5ODU4MjM1MDgyNTIzXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEluc2FuaXR5IiksCisgIHtDbGllbnQxNiwge29rLCBJbnNhbmVSZXN1bHR9fSAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNSwgdGVzdEluc2FuaXR5LCBbRGVtb0luc2FuZV0pLAorICBpbzpmb3JtYXQoIn5wfm4iLCBbSW5zYW5lUmVzdWx0XSksCisKKyAge0NsaWVudDE3LCB7b2ssICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJNZXNzYWdlIj4+fX19ID0KKyAgICB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTYsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJTYWZlIiwgIk1lc3NhZ2UiXSksCisKKyAgQ2xpZW50MTggPQorICAgIHRyeQorICAgICAge0NsaWVudFMxLCBSZXN1bHQxfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNywgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlhjZXB0aW9uIiwgIk1lc3NhZ2UiXSksCisgICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDFdKSwKKyAgICAgIENsaWVudFMxCisgICAgY2F0Y2gKKyAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgRXhuUzEgPSAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3t9fX0gLT4KKyAgICAgICAgIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59ID0gRXhuUzEsCisgICAgICAgIENsaWVudFMyOworICAgICAgdGhyb3c6e0NsaWVudFMyLCB7ZXhjZXB0aW9uLCBfRXhuUzEgPSAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7fX19IC0+CisgICAgICAgIGlvOmZvcm1hdCgiV3JvbmcgZXhjZXB0aW9uIHR5cGUhfm4iLCBbXSksCisgICAgICAgIENsaWVudFMyCisgICAgZW5kLAorCisgIENsaWVudDE5ID0KKyAgICB0cnkKKyAgICAgIHtDbGllbnRTMywgUmVzdWx0Mn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTgsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJYY2VwdGlvbjIiLCAiTWVzc2FnZSJdKSwKKyAgICAgIGlvOmZvcm1hdCgiVW5leHBlY3RlZCByZXR1cm4hIH5wfm4iLCBbUmVzdWx0Ml0pLAorICAgICAgQ2xpZW50UzMKKyAgICBjYXRjaAorICAgICAgdGhyb3c6e0NsaWVudFM0LCB7ZXhjZXB0aW9uLCBfRXhuUzIgPSAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3t9fX0gLT4KKyAgICAgICAgaW86Zm9ybWF0KCJXcm9uZyBleGNlcHRpb24gdHlwZSF+biIsIFtdKSwKKyAgICAgICAgQ2xpZW50UzQ7CisgICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIEV4blMyID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne319fSAtPgorICAgICAgICAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7CisgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19ID0gRXhuUzIsCisgICAgICAgIENsaWVudFM0CisgICAgZW5kLAorCisgICUlIFN0YXJ0ZWQgPSBlcmxhbmc6bW9ub3RvbmljX3RpbWUobWlsbGlfc2Vjb25kcyksCisgIHtfLCBTdGFydFNlYywgU3RhcnRVU2VjfSA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0T25ld2F5IiksCisgIHtDbGllbnQyMCwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE5LCB0ZXN0T25ld2F5LCBbMV0pLAorICB7XywgRW5kU2VjLCBFbmRVU2VjfSA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgRWxhcHNlZCA9IChFbmRTZWMgLSBTdGFydFNlYykgKiAxMDAwICsgKEVuZFVTZWMgLSBTdGFydFVTZWMpIC8gMTAwMCwKKyAgaWYKKyAgICBFbGFwc2VkID4gMTAwMCAtPiBleGl0KDEpOworICAgIHRydWUgLT4gdHJ1ZQorICBlbmQsCisKKyAgdGhyaWZ0X2NsaWVudDpjbG9zZShDbGllbnQyMCkuCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF9kaXNrbG9nLmVybCBiL3Rlc3QvZXJsL3NyYy90ZXN0X2Rpc2tsb2cuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjBiZTcyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy90ZXN0X2Rpc2tsb2cuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9kaXNrbG9nKS4KLQotLWNvbXBpbGUoZXhwb3J0X2FsbCkuCi0KLXQoKSAtPgotICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPQotICAgICAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeSgKLSAgICAgICAgICB0ZXN0X2Rpc2tsb2csCi0gICAgICAgICAgW3tmaWxlLCAiL3RtcC90ZXN0X2xvZyJ9LAotICAgICAgICAgICB7c2l6ZSwgezEwMjQqMTAyNCwgMTB9fV0pLAotICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LCBbXSksCi0gICAge29rLCBDbGllbnR9ID0gdGhyaWZ0X2NsaWVudDpzdGFydF9saW5rKFByb3RvY29sRmFjdG9yeSwgdGhyaWZ0VGVzdF90aHJpZnQpLAotCi0gICAgaW86Zm9ybWF0KCJDbGllbnQgc3RhcnRlZH5uIiksCi0KLSAgICAlIFdlIGhhdmUgdG8gbWFrZSBvbmV3YXkgY2FsbHMgaW50byB0aGlzIGNsaWVudCBvbmx5IHNpbmNlIG90aGVyd2lzZSBpdCB3aWxsIHRyeQotICAgICUgdG8gcmVhZCBmcm9tIHRoZSBkaXNrbG9nIGFuZCBnbyBib29tLgotICAgIHtvaywgb2t9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudCwgdGVzdE9uZXdheSwgWzE2I2RlYWRiZWVmXSksCi0gICAgaW86Zm9ybWF0KCJDYWxsIHdyaXR0ZW5+biIpLAotCi0gICAgJSBVc2UgdGhlIHNlbmRfY2FsbCBtZXRob2QgdG8gd3JpdGUgYSBub24tb25ld2F5IGNhbGwgaW50byB0aGUgbG9nCi0gICAgb2sgPSB0aHJpZnRfY2xpZW50OnNlbmRfY2FsbChDbGllbnQsIHRlc3RTdHJpbmcsIFs8PCJoZWxsbyB3b3JsZCI+Pl0pLAotICAgIGlvOmZvcm1hdCgiTm9uLW9uZXdheSBjYWxsIHNlbnR+biIpLAotCi0gICAgb2sgPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudCksCi0gICAgaW86Zm9ybWF0KCJDbGllbnQgY2xvc2Vkfm4iKSwKLQotICAgIG9rLgotCi0KLQotdF9iYXNlNjQoKSAtPgotICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPQotICAgICAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeSgKLSAgICAgICAgICB0ZXN0X2Rpc2tsb2csCi0gICAgICAgICAgW3tmaWxlLCAiL3RtcC90ZXN0X2I2NF9sb2cifSwKLSAgICAgICAgICAge3NpemUsIHsxMDI0KjEwMjQsIDEwfX1dKSwKLSAgICB7b2ssIEI2NEZhY3Rvcnl9ID0KLSAgICAgICAgdGhyaWZ0X2Jhc2U2NF90cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnkpLAotICAgIHtvaywgQnVmRmFjdG9yeX0gPQotICAgICAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShCNjRGYWN0b3J5KSwKLSAgICB7b2ssIFByb3RvY29sRmFjdG9yeX0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmRmFjdG9yeSwgW10pLAotICAgIHtvaywgQ2xpZW50fSA9IHRocmlmdF9jbGllbnQ6c3RhcnRfbGluayhQcm90b2NvbEZhY3RvcnksIHRocmlmdFRlc3RfdGhyaWZ0KSwKLQotICAgIGlvOmZvcm1hdCgiQ2xpZW50IHN0YXJ0ZWR+biIpLAotCi0gICAgJSBXZSBoYXZlIHRvIG1ha2Ugb25ld2F5IGNhbGxzIGludG8gdGhpcyBjbGllbnQgb25seSBzaW5jZSBvdGhlcndpc2UgaXQgd2lsbCB0cnkKLSAgICAlIHRvIHJlYWQgZnJvbSB0aGUgZGlza2xvZyBhbmQgZ28gYm9vbS4KLSAgICB7b2ssIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQsIHRlc3RPbmV3YXksIFsxNiNkZWFkYmVlZl0pLAotICAgIGlvOmZvcm1hdCgiQ2FsbCB3cml0dGVufm4iKSwKLQotICAgICUgVXNlIHRoZSBzZW5kX2NhbGwgbWV0aG9kIHRvIHdyaXRlIGEgbm9uLW9uZXdheSBjYWxsIGludG8gdGhlIGxvZwotICAgIG9rID0gdGhyaWZ0X2NsaWVudDpzZW5kX2NhbGwoQ2xpZW50LCB0ZXN0U3RyaW5nLCBbPDwiaGVsbG8gd29ybGQiPj5dKSwKLSAgICBpbzpmb3JtYXQoIk5vbi1vbmV3YXkgY2FsbCBzZW50fm4iKSwKLQotICAgIG9rID0gdGhyaWZ0X2NsaWVudDpjbG9zZShDbGllbnQpLAotICAgIGlvOmZvcm1hdCgiQ2xpZW50IGNsb3NlZH5uIiksCi0KLSAgICBvay4KLSAgICAKZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90ZXN0X21lbWJ1ZmZlci5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF9tZW1idWZmZXIuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmQyM2EwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy90ZXN0X21lbWJ1ZmZlci5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X21lbWJ1ZmZlcikuCi0tZXhwb3J0KFt0LzBdKS4KLQotLWluY2x1ZGUoInRocmlmdFRlc3RfdHlwZXMuaHJsIikuCi0KLXRlc3RfZGF0YSgpIC0+Ci0gICAgI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSA8PCJmb29iYXIiPj4sCi0JICAgIGJ5dGVfdGhpbmcgPSAxMjMsCi0JICAgIGkzMl90aGluZyA9IDEyMzQ1NjcsCi0JICAgIGk2NF90aGluZyA9IDEyMzQ1Njc4OTAwfS4KLQotdDEoKSAtPgotICAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICAgIHtvaywgUHJvdG9jb2x9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgICBUZXN0RGF0YSA9IHRlc3RfZGF0YSgpLAotICAgIG9rID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sLAotCQkJICAgICAgIHt7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ3h0cnVjdCcpKX0sCi0JCQkJVGVzdERhdGF9KSwKLSAgICB7b2ssIFJlc3VsdH0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90b2NvbCwKLQkJCQkJe3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QnKSl9LAotCQkJCQkneHRydWN0JyksCi0KLSAgICBSZXN1bHQgPSBUZXN0RGF0YS4KLQotCi10MigpIC0+Ci0gICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gICAge29rLCBQcm90b2NvbH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAotICAgIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0gICAgb2sgPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG9jb2wsCi0JCQkgICAgICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygneHRydWN0JykpfSwKLQkJCQlUZXN0RGF0YX0pLAotICAgIHtvaywgUmVzdWx0fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sLAotCQkJCQl7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdFRlc3RfdHlwZXM6c3RydWN0X2luZm8oJ3h0cnVjdDMnKSl9LAotCQkJCQkneHRydWN0MycpLAotCi0gICAgUmVzdWx0ID0gI3h0cnVjdDN7c3RyaW5nX3RoaW5nID0gVGVzdERhdGEjeHRydWN0LnN0cmluZ190aGluZywKLSAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdW5kZWZpbmVkLAotICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IFRlc3REYXRhI3h0cnVjdC5pMzJfdGhpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gVGVzdERhdGEjeHRydWN0Lmk2NF90aGluZ30uCi0KLQotdDMoKSAtPgotICAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICAgIHtvaywgUHJvdG9jb2x9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgICBUZXN0RGF0YSA9ICNib29sc3tpbV90cnVlID0gdHJ1ZSwgaW1fZmFsc2UgPSBmYWxzZX0sCi0gICAgb2sgPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG9jb2wsCi0JCQkgICAgICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnYm9vbHMnKSl9LAotCQkJCVRlc3REYXRhfSksCi0gICAge29rLCBSZXN1bHR9ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wsCi0JCQkJCXtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnYm9vbHMnKSl9LAotCQkJCQknYm9vbHMnKSwKLQotICAgIHRydWUgPSBUZXN0RGF0YSNib29scy5pbV90cnVlICA9Oj0gUmVzdWx0I2Jvb2xzLmltX3RydWUsCi0gICAgdHJ1ZSA9IFRlc3REYXRhI2Jvb2xzLmltX2ZhbHNlID06PSBSZXN1bHQjYm9vbHMuaW1fZmFsc2UuCi0KLQotdCgpIC0+Ci0gICAgdDEoKSwKLSAgICB0MigpLAotICAgIHQzKCkuCi0KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90ZXN0X3NlcnZlci5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF9zZXJ2ZXIuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDQzOWNjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy90ZXN0X3NlcnZlci5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9zZXJ2ZXIpLgotCi0tZXhwb3J0KFtzdGFydF9saW5rLzEsIGhhbmRsZV9mdW5jdGlvbi8yXSkuCi0KLS1pbmNsdWRlKCJ0aHJpZnRUZXN0X3R5cGVzLmhybCIpLgotCi1zdGFydF9saW5rKFBvcnQpIC0+Ci0gICAgdGhyaWZ0X3NlcnZlcjpzdGFydF9saW5rKFBvcnQsIHRocmlmdFRlc3RfdGhyaWZ0LCA/TU9EVUxFKS4KLQotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFZvaWQsIHt9KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFZvaWR+biIpLAotICAgIG9rOwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFN0cmluZywge1N9KSB3aGVuIGlzX2JpbmFyeShTKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFN0cmluZzogfnB+biIsIFtTXSksCi0gICAge3JlcGx5LCBTfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RCeXRlLCB7STh9KSB3aGVuIGlzX2ludGVnZXIoSTgpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0Qnl0ZTogfnB+biIsIFtJOF0pLAotICAgIHtyZXBseSwgSTh9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEkzMiwge0kzMn0pIHdoZW4gaXNfaW50ZWdlcihJMzIpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0STMyOiB+cH5uIiwgW0kzMl0pLAotICAgIHtyZXBseSwgSTMyfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RJNjQsIHtJNjR9KSB3aGVuIGlzX2ludGVnZXIoSTY0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEk2NDogfnB+biIsIFtJNjRdKSwKLSAgICB7cmVwbHksIEk2NH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0RG91YmxlLCB7RG91YmxlfSkgd2hlbiBpc19mbG9hdChEb3VibGUpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RG91YmxlOiB+cH5uIiwgW0RvdWJsZV0pLAotICAgIHtyZXBseSwgRG91YmxlfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RTdHJ1Y3QsCi0gICAgICAgICAgICAgICAge1N0cnVjdCA9ICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEJ5dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBJMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBJNjR9fSkKLXdoZW4gaXNfYmluYXJ5KFN0cmluZyksCi0gICAgIGlzX2ludGVnZXIoQnl0ZSksCi0gICAgIGlzX2ludGVnZXIoSTMyKSwKLSAgICAgaXNfaW50ZWdlcihJNjQpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0U3RydWN0OiB+cH5uIiwgW1N0cnVjdF0pLAotICAgIHtyZXBseSwgU3RydWN0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3ROZXN0LAotICAgICAgICAgICAgICAgIHtOZXN0fSkgd2hlbiBpc19yZWNvcmQoTmVzdCwgeHRydWN0MiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlY29yZChOZXN0I3h0cnVjdDIuc3RydWN0X3RoaW5nLCB4dHJ1Y3QpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TmVzdDogfnB+biIsIFtOZXN0XSksCi0gICAge3JlcGx5LCBOZXN0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXAsIHtNYXB9KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE1hcDogfnB+biIsIFtkaWN0OnRvX2xpc3QoTWFwKV0pLAotICAgIHtyZXBseSwgTWFwfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RTZXQsIHtTZXR9KSAtPgotICAgIHRydWUgPSBzZXRzOmlzX3NldChTZXQpLAotICAgIGlvOmZvcm1hdCgidGVzdFNldDogfnB+biIsIFtzZXRzOnRvX2xpc3QoU2V0KV0pLAotICAgIHtyZXBseSwgU2V0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RMaXN0LCB7TGlzdH0pIHdoZW4gaXNfbGlzdChMaXN0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdExpc3Q6IH5wfm4iLCBbTGlzdF0pLAotICAgIHtyZXBseSwgTGlzdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0RW51bSwge0VudW19KSB3aGVuIGlzX2ludGVnZXIoRW51bSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RFbnVtOiB+cH5uIiwgW0VudW1dKSwKLSAgICB7cmVwbHksIEVudW19OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFR5cGVkZWYsIHtVc2VySUR9KSB3aGVuIGlzX2ludGVnZXIoVXNlcklEKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFR5cGVkZWY6IH5wfm4iLCBbVXNlcklEXSksCi0gICAge3JlcGx5LCBVc2VySUR9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE1hcE1hcCwge0hlbGxvfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNYXBNYXA6IH5wfm4iLCBbSGVsbG9dKSwKLQotICAgIFBvc0xpc3QgPSBbe0ksIEl9ICAgfHwgSSA8LSBsaXN0czpzZXEoMSwgNSldLAotICAgIE5lZ0xpc3QgPSBbey1JLCAtSX0gfHwgSSA8LSBsaXN0czpzZXEoMSwgNSldLAotCi0gICAgTWFwTWFwID0gZGljdDpmcm9tX2xpc3QoW3s0LCAgZGljdDpmcm9tX2xpc3QoUG9zTGlzdCl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTQsIGRpY3Q6ZnJvbV9saXN0KE5lZ0xpc3QpfV0pLAotICAgIHtyZXBseSwgTWFwTWFwfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RJbnNhbml0eSwge0luc2FuaXR5fSkgd2hlbiBpc19yZWNvcmQoSW5zYW5pdHksIGluc2FuaXR5KSAtPgotICAgIEhlbGxvID0gI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSA8PCJIZWxsbzIiPj4sCi0gICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSAyLAotICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSAyLAotICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSAyfSwKLQotICAgIEdvb2RieWUgPSAjeHRydWN0e3N0cmluZ190aGluZyA9IDw8Ikdvb2RieWU0Ij4+LAotICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSA0LAotICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gNH0sCi0gICAgQ3JhenkgPSAjaW5zYW5pdHl7Ci0gICAgICB1c2VyTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/dGhyaWZ0VGVzdF9FSUdIVCwgOH1dKSwKLSAgICAgIHh0cnVjdHMgPSBbR29vZGJ5ZV0KLSAgICAgIH0sCi0KLSAgICBMb29uZXkgPSAjaW5zYW5pdHl7Ci0gICAgICB1c2VyTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/dGhyaWZ0VGVzdF9GSVZFLCA1fV0pLAotICAgICAgeHRydWN0cyA9IFtIZWxsb10KLSAgICAgIH0sCi0KLSAgICBGaXJzdE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfVFdPLCBDcmF6eX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgez90aHJpZnRUZXN0X1RIUkVFLCBDcmF6eX1dKSwKLQotICAgIFNlY29uZE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfU0lYLCBMb29uZXl9XSksCi0gICAgCi0gICAgSW5zYW5lID0gZGljdDpmcm9tX2xpc3QoW3sxLCBGaXJzdE1hcH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCBTZWNvbmRNYXB9XSksCi0gICAgCi0gICAgaW86Zm9ybWF0KCJSZXR1cm4gPSB+cH5uIiwgW0luc2FuZV0pLAotICAgIAotICAgIHtyZXBseSwgSW5zYW5lfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNdWx0aSwgQXJncyA9IHtBcmcwLCBBcmcxLCBBcmcyLCBfQXJnMywgQXJnNCwgQXJnNX0pCi0gIHdoZW4gaXNfaW50ZWdlcihBcmcwKSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzEpLAotICAgICAgIGlzX2ludGVnZXIoQXJnMiksCi0gICAgICAgaXNfaW50ZWdlcihBcmc0KSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzUpIC0+Ci0KLSAgICBpbzpmb3JtYXQoInRlc3RNdWx0aSh+cCl+biIsIFtBcmdzXSksCi0gICAge3JlcGx5LCAjeHRydWN0e3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKLSAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEFyZzAsCi0gICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IEFyZzEsCi0gICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IEFyZzJ9fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RFeGNlcHRpb24sIHtTdHJpbmd9KSB3aGVuIGlzX2JpbmFyeShTdHJpbmcpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RXhjZXB0aW9uKH5wKX5uIiwgW1N0cmluZ10pLAotICAgIGNhc2UgU3RyaW5nIG9mCi0gICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjeGNlcHRpb257ZXJyb3JDb2RlID0gMTAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbiI+Pn0pOwotICAgICAgICBfIC0+Ci0gICAgICAgICAgICBvawotICAgIGVuZDsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNdWx0aUV4Y2VwdGlvbiwge0FyZzAsIEFyZzF9KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE11bHRpRXhjZXB0aW9uKH5wLCB+cCl+biIsIFtBcmcwLCBBcmcxXSksCi0gICAgY2FzZSBBcmcwIG9mCi0gICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjeGNlcHRpb257ZXJyb3JDb2RlID0gMTAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59KTsKLSAgICAgICAgPDwiWGNlcHRpb24yIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjeGNlcHRpb24ye2Vycm9yQ29kZSA9IDIwMDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19KTsKLSAgICAgICAgXyAtPgotICAgICAgICAgICAge3JlcGx5LCAjeHRydWN0e3N0cmluZ190aGluZyA9IEFyZzF9fQotICAgIGVuZDsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RPbmV3YXksIHtTZWNvbmRzfSkgLT4KLSAgICB0aW1lcjpzbGVlcCgxMDAwICogU2Vjb25kcyksCi0gICAgb2suCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF90ZXRoZXIuZXJsIGIvdGVzdC9lcmwvc3JjL3Rlc3RfdGV0aGVyLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxMWE5YS4uMDAwMDAwMAotLS0gYS90ZXN0L2VybC9zcmMvdGVzdF90ZXRoZXIuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotJSUgVGVzdHMgdGhlIGJlaGF2aW9yIG9mIGNsaWVudHMgaW4gdGhlIGZhY2Ugb2YgdHJhbnNwb3J0IGVycm9ycy4KLSUlIE1ha2VzIHN1cmUgc3RhcnQsIHN0YXJ0X2xpbmtlZCwgYW5kIHN0YXJ0X3RldGhlcmVkIHdvcmsgYXMgZXhwZWN0ZWQuCi0KLS1tb2R1bGUodGVzdF90ZXRoZXIpLgotCi0tY29tcGlsZShleHBvcnRfYWxsKS4KLQotCi10KCkgLT4KLSAgICBpbzpmb3JtYXQoIkJlZ2lubmluZyB0cmFuc3BvcnQgZXJyb3IgdGVzdC5+biIpLAotICAgIFBpZDEgPSBlcmxhbmc6c3Bhd24oP01PRFVMRSwgdF9zdWIsIFsyXSksCi0gICAgd2FpdF9mb3IoUGlkMSksCi0gICAgaW86Zm9ybWF0KCJCZWdpbm5pbmcgcHJvdG9jb2wgZXJyb3IgdGVzdC5+biIpLAotICAgIFBpZDIgPSBlcmxhbmc6c3Bhd24oP01PRFVMRSwgdF9zdWIsIFsyMl0pLAotICAgIHdhaXRfZm9yKFBpZDIpLAotICAgIG9rLgotCi10X3N1YihQb3J0KSAtPgotICAgIGlvOmZvcm1hdCgiU3RhcnRpbmcufm4iLCBbXSksCi0gICAgcmVnaXN0ZXIodGVzdGVyLCBzZWxmKCkpLAotCi0gICAgUGlkMSA9IGVybGFuZzpzcGF3big/TU9EVUxFLCB0ZXN0X3N0YXJ0LCBbUG9ydF0pLAotICAgIHJlY2VpdmUgYWZ0ZXIgMjAwIC0+IG9rIGVuZCwgICUgV2FpdCBmb3IgY29tcGxldGlvbi4KLSAgICBjYXNlIGlzX3VwKFBpZDEpIG9mCi0gICAgICAgIHRydWUgLT4KLSAgICAgICAgICAgIGlvOmZvcm1hdCgiUEFTUy4gIFVubGlua2VkIG93bmVyIHN0aWxsIGFsaXZlLn5uIik7Ci0gICAgICAgIGZhbHNlIC0+Ci0gICAgICAgICAgICBpbzpmb3JtYXQoIkZBSUwuICBVbmxpbmtlZCBvd25lciBpcyBkZWFkLn5uIikKLSAgICBlbmQsCi0KLSAgICBQaWQyID0gZXJsYW5nOnNwYXduKD9NT0RVTEUsIHRlc3RfbGlua2VkLCBbUG9ydF0pLAotICAgIHJlY2VpdmUgYWZ0ZXIgMjAwIC0+IG9rIGVuZCwgICUgV2FpdCBmb3IgY29tcGxldGlvbi4KLSAgICBjYXNlIGlzX3VwKFBpZDIpIG9mCi0gICAgICAgIHRydWUgLT4KLSAgICAgICAgICAgIGlvOmZvcm1hdCgiRkFJTC4gIExpbmtlZCBvd25lciBzdGlsbCBhbGl2ZS5+biIpOwotICAgICAgICBmYWxzZSAtPgotICAgICAgICAgICAgaW86Zm9ybWF0KCJQQVNTLiAgTGlua2VkIG93bmVyIGlzIGRlYWQufm4iKQotICAgIGVuZCwKLQotICAgIFBpZDMgPSBlcmxhbmc6c3Bhd24oP01PRFVMRSwgdGVzdF90ZXRoZXJlZCwgW1BvcnRdKSwKLSAgICByZWNlaXZlIGFmdGVyIDIwMCAtPiBvayBlbmQsICAlIFdhaXQgZm9yIGNvbXBsZXRpb24uCi0gICAgY2FzZSBpc191cChQaWQzKSBvZgotICAgICAgICB0cnVlIC0+Ci0gICAgICAgICAgICBpbzpmb3JtYXQoIlBBU1MuICBUZXRoZXJlZCBvd25lciBzdGlsbCBhbGl2ZS5+biIpOwotICAgICAgICBmYWxzZSAtPgotICAgICAgICAgICAgaW86Zm9ybWF0KCJGQUlMLiAgVGV0aGVyZWQgb3duZXIgaXMgZGVhZC5+biIpCi0gICAgZW5kLAotCi0gICAgY2hlY2tfZXh0cmFzKDMpLgotCi1pc191cChQaWQpIC0+Ci0gICAgTW9uaXRvclJlZiA9IGVybGFuZzptb25pdG9yKHByb2Nlc3MsIFBpZCksCi0gICAgcmVjZWl2ZQotICAgICAgICB7J0RPV04nLCBNb25pdG9yUmVmLCBwcm9jZXNzLCBQaWQsIF9JbmZvfSAtPgotICAgICAgICAgICAgZmFsc2UKLSAgICBhZnRlcgotICAgICAgICA1MCAtPgotICAgICAgICAgICAgZXJsYW5nOmRlbW9uaXRvcihNb25pdG9yUmVmKSwKLSAgICAgICAgICAgIHRydWUKLSAgICBlbmQuCi0KLXdhaXRfZm9yKFBpZCkgLT4KLSAgICBNb25pdG9yUmVmID0gZXJsYW5nOm1vbml0b3IocHJvY2VzcywgUGlkKSwKLSAgICByZWNlaXZlCi0gICAgICAgIHsnRE9XTicsIE1vbml0b3JSZWYsIHByb2Nlc3MsIFBpZCwgX0luZm99IC0+Ci0gICAgICAgICAgICBvawotICAgIGVuZC4KLQotY2hlY2tfZXh0cmFzKDApIC0+IG9rOwotY2hlY2tfZXh0cmFzKE4pIC0+Ci0gICAgcmVjZWl2ZQotICAgICAgICB7Y2xpZW50LCBUeXBlLCBQaWR9IC0+Ci0gICAgICAgICAgICBjYXNlIHtUeXBlLCBpc191cChQaWQpfSBvZgotICAgICAgICAgICAgICAgIHt1bmxpbmtlZCwgdHJ1ZX0gLT4KLSAgICAgICAgICAgICAgICAgICAgaW86Zm9ybWF0KCJQQVNTLiAgVW5saW5rZWQgY2xpZW50IHN0aWxsIGFsaXZlLn5uIik7Ci0gICAgICAgICAgICAgICAge3VubGlua2VkLCBmYWxzZX0gLT4KLSAgICAgICAgICAgICAgICAgICAgaW86Zm9ybWF0KCJGQUlMLiAgVW5saW5rZWQgY2xpZW50IGRlYWQufm4iKTsKLSAgICAgICAgICAgICAgICB7bGlua2VkLCB0cnVlfSAtPgotICAgICAgICAgICAgICAgICAgICBpbzpmb3JtYXQoIkZBSUwuICBMaW5rZWQgY2xpZW50IHN0aWxsIGFsaXZlLn5uIik7Ci0gICAgICAgICAgICAgICAge2xpbmtlZCwgZmFsc2V9IC0+Ci0gICAgICAgICAgICAgICAgICAgIGlvOmZvcm1hdCgiUEFTUy4gIExpbmtlZCBjbGllbnQgZGVhZC5+biIpOwotICAgICAgICAgICAgICAgIHt0ZXRoZXJlZCwgdHJ1ZX0gLT4KLSAgICAgICAgICAgICAgICAgICAgaW86Zm9ybWF0KCJGQUlMLiAgVGV0aGVyZWQgY2xpZW50IHN0aWxsIGFsaXZlLn5uIik7Ci0gICAgICAgICAgICAgICAge3RldGhlcmVkLCBmYWxzZX0gLT4KLSAgICAgICAgICAgICAgICAgICAgaW86Zm9ybWF0KCJQQVNTLiAgVGV0aGVyZWQgY2xpZW50IGRlYWQufm4iKQotICAgICAgICAgICAgZW5kLAotICAgICAgICAgICAgY2hlY2tfZXh0cmFzKE4tMSkKLSAgICBhZnRlcgotICAgICAgICA1MDAgLT4KLSAgICAgICAgICAgIGlvOmZvcm1hdCgiRkFJTC4gIEV4cGVjdGVkIH5wIG1vcmUgY2xpZW50cy5+biIsIFtOXSkKLSAgICBlbmQuCi0KLW1ha2VfdGhyaWZ0X2NsaWVudChPcHRzKSAtPgotICAgICB0aHJpZnRfY2xpZW50OnN0YXJ0KGZ1bigpLT5vayBlbmQsIHRocmlmdFRlc3RfdGhyaWZ0LCBPcHRzKS4KLQotbWFrZV9wcm90b2NvbF9mYWN0b3J5KFBvcnQpIC0+Ci0gICAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9Ci0gICAgICAgIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeSgKLSAgICAgICAgICAiMTI3LjAuMC4xIiwgUG9ydCwgW10pLAotICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9Ci0gICAgICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoCi0gICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgW10pLAotICAgIFByb3RvY29sRmFjdG9yeS4KLQotCi10ZXN0X3N0YXJ0KFBvcnQpIC0+Ci0gICAge29rLCBDbGllbnQxfSA9IG1ha2VfdGhyaWZ0X2NsaWVudChbe2Nvbm5lY3QsIGZhbHNlfV0pLAotICAgIHRlc3RlciAhIHtjbGllbnQsIHVubGlua2VkLCBDbGllbnQxfSwKLSAgICB7b2ssIENsaWVudDJ9ID0gbWFrZV90aHJpZnRfY2xpZW50KFt7Y29ubmVjdCwgZmFsc2V9XSksCi0gICAgaW86Zm9ybWF0KCJQQVNTLiAgVW5saW5rZWQgY2xpZW50cyBjcmVhdGVkLn5uIiksCi0gICAgdHJ5Ci0gICAgICAgIGdlbl9zZXJ2ZXI6Y2FsbChDbGllbnQyLCB7Y29ubmVjdCwgbWFrZV9wcm90b2NvbF9mYWN0b3J5KFBvcnQpfSksCi0gICAgICAgIHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCB0ZXN0Vm9pZCwgW10pLAotICAgICAgICBpbzpmb3JtYXQoIkZBSUwuICBVbmxpbmtlZCBjbGllbnQgY29ubmVjdGVkIGFuZCBjYWxsZWQufm4iLCBbXSkKLSAgICBjYXRjaAotICAgICAgICBLaW5kOkluZm8gLT4KLSAgICAgICAgICAgIGlvOmZvcm1hdCgiUEFTUy4gIENhdWdodCB1bmxpbmtlZCBlcnJvci4gIH5wOn5wfm4iLCBbS2luZCwgSW5mb10pCi0gICAgZW5kLAotICAgIHJlY2VpdmUgYWZ0ZXIgMTAwIC0+Ci0gICAgICAgICAgICAgICAgICAgIGlvOmZvcm1hdCgiUEFTUy4gIFN0aWxsIGFsaXZlIGFmdGVyIHVubGlua2VkIGRlYXRoLn5uIiksCi0gICAgICAgICAgICAgICAgICAgICUlIEhhbmcgYXJvdW5kIGEgbGl0dGxlIGxvbmdlciBzbyBvdXIgcGFyZW50IGNhbiB2ZXJpZnkuCi0gICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgYWZ0ZXIgMjAwIC0+IG9rIGVuZAotICAgIGVuZCwKLSAgICAlJSBFeGl0IGFibm9ybWFsbHkgdG8gbm90IGtpbGwgb3VyIHVubGlua2VkIGV4dHJhIGNsaWVudC4KLSAgICBleGl0KGRpZSkuCi0KLXRlc3RfbGlua2VkKFBvcnQpIC0+Ci0gICAge29rLCBDbGllbnQxfSA9IG1ha2VfdGhyaWZ0X2NsaWVudChbe2Nvbm5lY3QsIGZhbHNlfSwge21vbml0b3IsIGxpbmt9XSksCi0gICAgdGVzdGVyICEge2NsaWVudCwgbGlua2VkLCBDbGllbnQxfSwKLSAgICB7b2ssIENsaWVudDJ9ID0gbWFrZV90aHJpZnRfY2xpZW50KFt7Y29ubmVjdCwgZmFsc2V9LCB7bW9uaXRvciwgbGlua31dKSwKLSAgICBpbzpmb3JtYXQoIlBBU1MuICBMaW5rZWQgY2xpZW50cyBjcmVhdGVkLn5uIiksCi0gICAgdHJ5Ci0gICAgICAgIGdlbl9zZXJ2ZXI6Y2FsbChDbGllbnQyLCB7Y29ubmVjdCwgbWFrZV9wcm90b2NvbF9mYWN0b3J5KFBvcnQpfSksCi0gICAgICAgIHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCB0ZXN0Vm9pZCwgW10pLAotICAgICAgICBpbzpmb3JtYXQoIkZBSUwuICBMaW5rZWQgY2xpZW50IGNvbm5lY3RlZCBhbmQgY2FsbGVkLn5uIiwgW10pCi0gICAgY2F0Y2gKLSAgICAgICAgS2luZDpJbmZvIC0+Ci0gICAgICAgICAgICBpbzpmb3JtYXQoIkZBSUwuICBDYXVnaHQgbGlua2VkIGVycm9yLiAgfnA6fnB+biIsIFtLaW5kLCBJbmZvXSkKLSAgICBlbmQsCi0gICAgcmVjZWl2ZSBhZnRlciAxMDAgLT4KLSAgICAgICAgICAgICAgICAgICAgaW86Zm9ybWF0KCJGQUlMLiAgU3RpbGwgYWxpdmUgYWZ0ZXIgbGlua2VkIGRlYXRoLn5uIiksCi0gICAgICAgICAgICAgICAgICAgICUgSGFuZyBhcm91bmQgYSBsaXR0bGUgbG9uZ2VyIHNvIG91ciBwYXJlbnQgY2FuIHZlcmlmeS4KLSAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSBhZnRlciAyMDAgLT4gb2sgZW5kCi0gICAgZW5kLAotICAgICUlIEV4aXQgYWJub3JtYWxseSB0byBraWxsIG91ciBsaW5rZWQgZXh0cmEgY2xpZW50LgotICAgICUlIEJ1dCB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuCi0gICAgZXhpdChkaWUpLgotCi10ZXN0X3RldGhlcmVkKFBvcnQpIC0+Ci0gICAge29rLCBDbGllbnQxfSA9IG1ha2VfdGhyaWZ0X2NsaWVudChbe2Nvbm5lY3QsIGZhbHNlfSwge21vbml0b3IsIHRldGhlcn1dKSwKLSAgICB0ZXN0ZXIgISB7Y2xpZW50LCB0ZXRoZXJlZCwgQ2xpZW50MX0sCi0gICAge29rLCBDbGllbnQyfSA9IG1ha2VfdGhyaWZ0X2NsaWVudChbe2Nvbm5lY3QsIGZhbHNlfSwge21vbml0b3IsIHRldGhlcn1dKSwKLSAgICBpbzpmb3JtYXQoIlBBU1MuICBUZXRoZXJlZCBjbGllbnRzIGNyZWF0ZWQufm4iKSwKLSAgICB0cnkKLSAgICAgICAgZ2VuX3NlcnZlcjpjYWxsKENsaWVudDIsIHtjb25uZWN0LCBtYWtlX3Byb3RvY29sX2ZhY3RvcnkoUG9ydCl9KSwKLSAgICAgICAgdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDIsIHRlc3RWb2lkLCBbXSksCi0gICAgICAgIGlvOmZvcm1hdCgiRkFJTC4gIFRldGhlcmVkIGNsaWVudCBjb25uZWN0ZWQgYW5kIGNhbGxlZC5+biIsIFtdKQotICAgIGNhdGNoCi0gICAgICAgIEtpbmQ6SW5mbyAtPgotICAgICAgICAgICAgaW86Zm9ybWF0KCJQQVNTLiAgQ2F1Z2h0IHRldGhlcmVkIGVycm9yLiAgfnA6fnB+biIsIFtLaW5kLCBJbmZvXSkKLSAgICBlbmQsCi0gICAgcmVjZWl2ZSBhZnRlciAxMDAgLT4KLSAgICAgICAgICAgICAgICAgICAgaW86Zm9ybWF0KCJQQVNTLiAgU3RpbGwgYWxpdmUgYWZ0ZXIgdGV0aGVyZWQgZGVhdGgufm4iKSwKLSAgICAgICAgICAgICAgICAgICAgJSBIYW5nIGFyb3VuZCBhIGxpdHRsZSBsb25nZXIgc28gb3VyIHBhcmVudCBjYW4gdmVyaWZ5LgotICAgICAgICAgICAgICAgICAgICByZWNlaXZlIGFmdGVyIDIwMCAtPiBvayBlbmQKLSAgICBlbmQsCi0gICAgJSUgRXhpdCBhYm5vcm1hbGx5IHRvIGtpbGwgb3VyIHRldGhlcmVkIGV4dHJhIGNsaWVudC4KLSAgICBleGl0KGRpZSkuCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybCBiL3Rlc3QvZXJsL3NyYy90ZXN0X3RocmlmdF9zZXJ2ZXIuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDhkZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybApAQCAtMCwwICsxLDIzMyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfc2VydmVyKS4KKworLWV4cG9ydChbc3RhcnQvMCwgc3RhcnQvMSwgc3RhcnRfbGluay8yLCBoYW5kbGVfZnVuY3Rpb24vMl0pLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X3R5cGVzLmhybCIpLgorCistcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKKyAgICAgICAgICAgICAgICAgIHNlcnZlcl9vcHRzID0gW119KS4KKworcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgorcGFyc2VfYXJncyhbXSwgT3B0cykgLT4KKyAgT3B0czsKK3BhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KKyAgICBOZXdPcHRzID0KKyAgICAgICAgY2FzZSBIZWFkIG9mCisgICAgICAgICAgICAiLS1wb3J0PSIgKysgUG9ydCAtPgorICAgICAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRvX2ludGVnZXIoUG9ydCkgb2YKKyAgICAgICAgICAgICAgICAgIHtJbnRQb3J0LF99IHdoZW4gaXNfaW50ZWdlcihJbnRQb3J0KSAtPgorICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IEludFBvcnR9OworICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS10cmFuc3BvcnQ9IiArKyBUcmFucyAtPgorICAgICAgICAgICAgICAgIGNhc2UgVHJhbnMgb2YKKyAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c119OworICAgICAgICAgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cworICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICItLXNzbCIgLT4KKyAgICAgICAgICAgICAgICBzc2w6c3RhcnQoKSwKKyAgICAgICAgICAgICAgICBTc2xPcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAge3NzbG9wdGlvbnMsIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VydGZpbGUsICIuLi9rZXlzL3NlcnZlci5wZW0ifQorICAgICAgICAgICAgICAgICAgICAgICAgLHtrZXlmaWxlLCAgIi4uL2tleXMvc2VydmVyLmtleSJ9CisgICAgICAgICAgICAgICAgICAgIF19LAorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7c3NsdHJhbnNwb3J0LCB0cnVlfSB8IFtTc2xPcHRpb25zIHwgT3B0cyNvcHRpb25zLnNlcnZlcl9vcHRzXV19OworICAgICAgICAgICAgIi0tcHJvdG9jb2w9IiArKyBQcm90byAtPgorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7cHJvdG9jb2wsIGxpc3RfdG9fYXRvbShQcm90byl9IHwgT3B0cyNvcHRpb25zLnNlcnZlcl9vcHRzXX07CisgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgIGVuZCwKKyAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgorCitzdGFydCgpIC0+IHN0YXJ0KGluaXQ6Z2V0X3BsYWluX2FyZ3VtZW50cygpKS4KK3N0YXJ0KEFyZ3MpIC0+CisgICAgI29wdGlvbnN7cG9ydCA9IFBvcnQsIHNlcnZlcl9vcHRzID0gU2VydmVyT3B0c30gPSBwYXJzZV9hcmdzKEFyZ3MpLAorICAgIHNwYXduKGZ1bigpIC0+IHN0YXJ0X2xpbmsoUG9ydCwgU2VydmVyT3B0cyksIHJlY2VpdmUgYWZ0ZXIgaW5maW5pdHkgLT4gb2sgZW5kIGVuZCkuCisKK3N0YXJ0X2xpbmsoUG9ydCwgU2VydmVyT3B0cykgLT4KKyAgICB0aHJpZnRfc29ja2V0X3NlcnZlcjpzdGFydChbe2hhbmRsZXIsID9NT0RVTEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2VydmljZSwgdGhyaWZ0X3Rlc3RfdGhyaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BvcnQsIFBvcnR9XSArKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlck9wdHMpLgorCisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0Vm9pZCwge30pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0Vm9pZH5uIiksCisgICAgb2s7CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U3RyaW5nLCB7U30pIHdoZW4gaXNfYmluYXJ5KFMpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0U3RyaW5nOiB+cH5uIiwgW1NdKSwKKyAgICB7cmVwbHksIFN9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEJvb2wsIHtCfSkgd2hlbiBpc19ib29sZWFuKEIpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0Qm9vbDogfnB+biIsIFtCXSksCisgICAge3JlcGx5LCBCfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RCeXRlLCB7STh9KSB3aGVuIGlzX2ludGVnZXIoSTgpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0Qnl0ZTogfnB+biIsIFtJOF0pLAorICAgIHtyZXBseSwgSTh9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEkzMiwge0kzMn0pIHdoZW4gaXNfaW50ZWdlcihJMzIpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0STMyOiB+cH5uIiwgW0kzMl0pLAorICAgIHtyZXBseSwgSTMyfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RJNjQsIHtJNjR9KSB3aGVuIGlzX2ludGVnZXIoSTY0KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEk2NDogfnB+biIsIFtJNjRdKSwKKyAgICB7cmVwbHksIEk2NH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0RG91YmxlLCB7RG91YmxlfSkgd2hlbiBpc19mbG9hdChEb3VibGUpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0RG91YmxlOiB+cH5uIiwgW0RvdWJsZV0pLAorICAgIHtyZXBseSwgRG91YmxlfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RCaW5hcnksIHtTfSkgd2hlbiBpc19iaW5hcnkoUykgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RCaW5hcnk6IH5wfm4iLCBbU10pLAorICAgIHtyZXBseSwgU307CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U3RydWN0LAorICAgICAgICAgICAgICAgIHtTdHJ1Y3QgPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBJMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBJNjR9fSkKK3doZW4gaXNfYmluYXJ5KFN0cmluZyksCisgICAgIGlzX2ludGVnZXIoQnl0ZSksCisgICAgIGlzX2ludGVnZXIoSTMyKSwKKyAgICAgaXNfaW50ZWdlcihJNjQpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0U3RydWN0OiB+cH5uIiwgW1N0cnVjdF0pLAorICAgIHtyZXBseSwgU3RydWN0fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3ROZXN0LAorICAgICAgICAgICAgICAgIHtOZXN0fSkgd2hlbiBpc19yZWNvcmQoTmVzdCwgJ3RocmlmdC50ZXN0Llh0cnVjdDInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVjb3JkKE5lc3QjJ3RocmlmdC50ZXN0Llh0cnVjdDInLnN0cnVjdF90aGluZywgJ3RocmlmdC50ZXN0Llh0cnVjdCcpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0TmVzdDogfnB+biIsIFtOZXN0XSksCisgICAge3JlcGx5LCBOZXN0fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXAsIHtNYXB9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE1hcDogfnB+biIsIFtkaWN0OnRvX2xpc3QoTWFwKV0pLAorICAgIHtyZXBseSwgTWFwfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RTdHJpbmdNYXAsIHtNYXB9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFN0cmluZ01hcDogfnB+biIsIFtkaWN0OnRvX2xpc3QoTWFwKV0pLAorICAgIHtyZXBseSwgTWFwfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RTZXQsIHtTZXR9KSAtPgorICAgIHRydWUgPSBzZXRzOmlzX3NldChTZXQpLAorICAgIGlvOmZvcm1hdCgidGVzdFNldDogfnB+biIsIFtzZXRzOnRvX2xpc3QoU2V0KV0pLAorICAgIHtyZXBseSwgU2V0fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RMaXN0LCB7TGlzdH0pIHdoZW4gaXNfbGlzdChMaXN0KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdExpc3Q6IH5wfm4iLCBbTGlzdF0pLAorICAgIHtyZXBseSwgTGlzdH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0RW51bSwge0VudW19KSB3aGVuIGlzX2ludGVnZXIoRW51bSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RFbnVtOiB+cH5uIiwgW0VudW1dKSwKKyAgICB7cmVwbHksIEVudW19OworCitoYW5kbGVfZnVuY3Rpb24odGVzdFR5cGVkZWYsIHtVc2VySUR9KSB3aGVuIGlzX2ludGVnZXIoVXNlcklEKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFR5cGVkZWY6IH5wfm4iLCBbVXNlcklEXSksCisgICAge3JlcGx5LCBVc2VySUR9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdE1hcE1hcCwge0hlbGxvfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RNYXBNYXA6IH5wfm4iLCBbSGVsbG9dKSwKKworICAgIFBvc0xpc3QgPSBbe0ksIEl9ICAgfHwgSSA8LSBsaXN0czpzZXEoMSwgNCldLAorICAgIE5lZ0xpc3QgPSBbey1JLCAtSX0gfHwgSSA8LSBsaXN0czpzZXEoMSwgNCldLAorCisgICAgTWFwTWFwID0gZGljdDpmcm9tX2xpc3QoW3s0LCAgZGljdDpmcm9tX2xpc3QoUG9zTGlzdCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTQsIGRpY3Q6ZnJvbV9saXN0KE5lZ0xpc3QpfV0pLAorICAgIHtyZXBseSwgTWFwTWFwfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RJbnNhbml0eSwge0luc2FuaXR5fSkgd2hlbiBpc19yZWNvcmQoSW5zYW5pdHksICd0aHJpZnQudGVzdC5JbnNhbml0eScpIC0+CisgICAgSGVsbG8gPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiSGVsbG8yIj4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gMn0sCisKKyAgICBHb29kYnllID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8Ikdvb2RieWU0Ij4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSA0fSwKKyAgICBDcmF6eSA9ICMndGhyaWZ0LnRlc3QuSW5zYW5pdHkneworICAgICAgICAgICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P1RIUklGVF9URVNUX05VTUJFUlpfRUlHSFQsIDh9XSksCisgICAgICAgICAgICAgICB4dHJ1Y3RzID0gW0dvb2RieWVdCisgICAgICAgICAgICAgIH0sCisKKyAgICBMb29uZXkgPSAjJ3RocmlmdC50ZXN0Lkluc2FuaXR5J3t9LAorCisgICAgRmlyc3RNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX1RXTywgSW5zYW5pdHl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs/VEhSSUZUX1RFU1RfTlVNQkVSWl9USFJFRSwgSW5zYW5pdHl9XSksCisKKyAgICBTZWNvbmRNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX1NJWCwgTG9vbmV5fV0pLAorCisgICAgSW5zYW5lID0gZGljdDpmcm9tX2xpc3QoW3sxLCBGaXJzdE1hcH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCBTZWNvbmRNYXB9XSksCisKKyAgICBpbzpmb3JtYXQoIlJldHVybiA9IH5wfm4iLCBbSW5zYW5lXSksCisKKyAgICB7cmVwbHksIEluc2FuZX07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGksIEFyZ3MgPSB7QXJnMCwgQXJnMSwgQXJnMiwgX0FyZzMsIEFyZzQsIEFyZzV9KQorICB3aGVuIGlzX2ludGVnZXIoQXJnMCksCisgICAgICAgaXNfaW50ZWdlcihBcmcxKSwKKyAgICAgICBpc19pbnRlZ2VyKEFyZzIpLAorICAgICAgIGlzX2ludGVnZXIoQXJnNCksCisgICAgICAgaXNfaW50ZWdlcihBcmc1KSAtPgorCisgICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGkofnApfm4iLCBbQXJnc10pLAorICAgIHtyZXBseSwgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gQXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBBcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IEFyZzJ9fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RFeGNlcHRpb24sIHtTdHJpbmd9KSB3aGVuIGlzX2JpbmFyeShTdHJpbmcpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0RXhjZXB0aW9uKH5wKX5uIiwgW1N0cmluZ10pLAorICAgIGNhc2UgU3RyaW5nIG9mCisgICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+CisgICAgICAgICAgICB0aHJvdygjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3tlcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBTdHJpbmd9KTsKKyAgICAgICAgPDwiVEV4Y2VwdGlvbiI+PiAtPgorICAgICAgICAgICAgdGhyb3coez9UQXBwbGljYXRpb25FeGNlcHRpb25fU3RydWN0dXJlfSk7CisgICAgICAgIF8gLT4KKyAgICAgICAgICAgIG9rCisgICAgZW5kOworCitoYW5kbGVfZnVuY3Rpb24odGVzdE11bHRpRXhjZXB0aW9uLCB7QXJnMCwgQXJnMX0pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGlFeGNlcHRpb24ofnAsIH5wKX5uIiwgW0FyZzAsIEFyZzFdKSwKKyAgICBjYXNlIEFyZzAgb2YKKyAgICAgICAgPDwiWGNlcHRpb24iPj4gLT4KKyAgICAgICAgICAgIHRocm93KCMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZSA9IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSk7CisgICAgICAgIDw8IlhjZXB0aW9uMiI+PiAtPgorICAgICAgICAgICAgdGhyb3coIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne2Vycm9yQ29kZSA9IDIwMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24yIj4+fX0pOworICAgICAgICBfIC0+CisgICAgICAgICAgICB7cmVwbHksICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSBBcmcxfX0KKyAgICBlbmQ7CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0T25ld2F5LCB7U2Vjb25kc30pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0T25ld2F5OiB+cH5uIiwgW1NlY29uZHNdKSwKKyAgICB0aW1lcjpzbGVlcCgxMDAwICogU2Vjb25kcyksCisgICAgb2suCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYyBiL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdC5hcHAuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZWY5OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYwpAQCAtMCwwICsxLDU0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKyUlJSAtKi0gbW9kZTplcmxhbmcgLSotCit7YXBwbGljYXRpb24sIHRocmlmdF90ZXN0LCBbCisgICUgQSBxdWljayBkZXNjcmlwdGlvbiBvZiB0aGUgYXBwbGljYXRpb24uCisgIHtkZXNjcmlwdGlvbiwgIlRocmlmdCBjcm9zcyBsYW5ndWFnZSB0ZXN0In0sCisKKyAgJSBUaGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRvbgorICB7dnNuLCAiMS4wLjAifSwKKworICAlIEFsbCBtb2R1bGVzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICB7bW9kdWxlcywgWworICAgIHRlc3RfY2xpZW50LAorICAgIHRlc3RfdGhyaWZ0X3NlcnZlcgorICBdfSwKKworICAlIEFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBuYW1lcyB0aGUgYXBwbGljYXRpb24gdXNlcy4gVGhpcyBjYW4gYmUgaWdub3JlZC4KKyAge3JlZ2lzdGVyZWQsIFtdfSwKKworICAlIEFwcGxpY2F0aW9ucyB0aGF0IGFyZSB0byBiZSBzdGFydGVkIHByaW9yIHRvIHRoaXMgb25lLiBUaGlzIGNhbiBiZSBpZ25vcmVkCisgICUgbGVhdmUgaXQgYWxvbmUgdW5sZXNzIHlvdSB1bmRlcnN0YW5kIGl0IHdlbGwgYW5kIGxldCB0aGUgLnJlbCBmaWxlcyBpbgorICAlIHlvdXIgcmVsZWFzZSBoYW5kbGUgdGhpcy4KKyAge2FwcGxpY2F0aW9ucywgW2tlcm5lbCwgc3RkbGliXX0sCisKKyAgJSBPVFAgYXBwbGljYXRpb24gbG9hZGVyIHdpbGwgbG9hZCwgYnV0IG5vdCBzdGFydCwgaW5jbHVkZWQgYXBwcy4gQWdhaW4KKyAgJSB0aGlzIGNhbiBiZSBpZ25vcmVkIGFzIHdlbGwuICBUbyBsb2FkIGJ1dCBub3Qgc3RhcnQgYW4gYXBwbGljYXRpb24gaXQKKyAgJSBpcyBlYXNpZXIgdG8gaW5jbHVkZSBpdCBpbiB0aGUgLnJlbCBmaWxlIGZvbGxvd2VkIGJ5IHRoZSBhdG9tICdub25lJworICB7aW5jbHVkZWRfYXBwbGljYXRpb25zLCBbXX0sCisKKyAgJSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgc2ltaWxhciB0byB0aG9zZSBpbiB0aGUgY29uZmlnIGZpbGUgc3BlY2lmaWVkCisgICUgb24gdGhlIGNvbW1hbmQgbGluZS4gY2FuIGJlIGZldGNoZWQgd2l0aCBnYXM6Z2V0X2VudgorICB7ZW52LCBbCisgICAgJSBJZiBhbiBlcnJvci9jcmFzaCBvY2N1cnMgZHVyaW5nIHByb2Nlc3Npbmcgb2YgYSBmdW5jdGlvbiwKKyAgICAlIHNob3VsZCB0aGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHNlcmlhbGl6ZWQgYmFjayB0byB0aGUgY2xpZW50CisgICAgJSBpbmNsdWRlIHRoZSBlcmxhbmcgYmFja3RyYWNlPworICAgIHtleGNlcHRpb25zX2luY2x1ZGVfdHJhY2VzLCB0cnVlfQorICBdfQorXX0uCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL01ha2VmaWxlLmFtIGIvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzdkNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMwIEBACisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0VYVFJBX0RJU1QgPSBcCisJbG9jYWxfdGhyaWZ0IFwKKwlpbmRleC5odG1sIFwKKwljb250YWluZXJfbGltaXQucHkgXAorCWluZGV4Lmh0bWwgXAorCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAorCU1ha2VmaWxlLmFtIFwKKyAgICAgICAgbm9zc2x2My5zaCBcCisJc3RyaW5nX2xpbWl0LnB5IFwKKwl0ZXN0cy5qc29uIFwKKwl0aGVhZGVyX2JpbmFyeS5weSBcCisJc2V0dXAuY2ZnIFwKKyAgICAgICAgdGxzLnNoIFwKKwl1dGlsLnB5CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weSBiL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Zjg0ODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weQpAQCAtMCwwICsxLDcyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzLCBpbml0X3Byb3RvY29sCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorCisKKyMgVE9ETzogZ2VuZXJhdGUgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorZGVmIHRlc3RfbGlzdChwcm90bywgdmFsdWUpOgorICAgIG1ldGhvZF9uYW1lID0gJ3Rlc3RMaXN0JworICAgIHR0eXBlID0gVFR5cGUuTElTVAorICAgIGV0eXBlID0gVFR5cGUuSTMyCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kX25hbWUsIFRNZXNzYWdlVHlwZS5DQUxMLCAzKQorICAgIHByb3RvLndyaXRlU3RydWN0QmVnaW4obWV0aG9kX25hbWUgKyAnX2FyZ3MnKQorICAgIHByb3RvLndyaXRlRmllbGRCZWdpbigndGhpbmcnLCB0dHlwZSwgMSkKKyAgICBwcm90by53cml0ZUxpc3RCZWdpbihldHlwZSwgbGVuKHZhbHVlKSkKKyAgICBmb3IgZSBpbiB2YWx1ZToKKyAgICAgICAgcHJvdG8ud3JpdGVJMzIoZSkKKyAgICBwcm90by53cml0ZUxpc3RFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBmaWQgPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZpZCA9PSAwCisgICAgYXNzZXJ0IGZ0eXBlID09IHR0eXBlCisgICAgZXR5cGUyLCBsZW4yID0gcHJvdG8ucmVhZExpc3RCZWdpbigpCisgICAgYXNzZXJ0IGV0eXBlID09IGV0eXBlMgorICAgIGFzc2VydCBsZW4yID09IGxlbih2YWx1ZSkKKyAgICBmb3IgaSBpbiByYW5nZShsZW4yKToKKyAgICAgICAgdiA9IHByb3RvLnJlYWRJMzIoKQorICAgICAgICBhc3NlcnQgdiA9PSB2YWx1ZVtpXQorICAgIHByb3RvLnJlYWRMaXN0RW5kKCkKKyAgICBwcm90by5yZWFkRmllbGRFbmQoKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgYWRkX2NvbW1vbl9hcmdzKHApCisgICAgcC5hZGRfYXJndW1lbnQoJy0tbGltaXQnLCB0eXBlPWludCkKKyAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKKyAgICBwcm90byA9IGluaXRfcHJvdG9jb2woYXJncykKKyAgICAjIFRPRE86IHRlc3Qgc2V0IGFuZCBtYXAKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCAtIDEpKSkKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCAtIDEpKSkKKyAgICBwcmludCgnW09LXTogbGltaXQgLSAxJykKKyAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCkpKQorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0KSkpCisgICAgcHJpbnQoJ1tPS106IGp1c3QgbGltaXQnKQorICAgIHRyeToKKyAgICAgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQgKyAxKSkpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcHJpbnQoJ1tPS106IGxpbWl0ICsgMScpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoJ1tFUlJPUl06IGxpbWl0ICsgMScpCisgICAgICAgIGFzc2VydCBGYWxzZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9pbmRleC5odG1sIGIvdGVzdC9mZWF0dXJlcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTAwMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8IURPQ1RZUEUgSFRNTD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cis8dGl0bGU+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvY3NzL2pxdWVyeS5kYXRhVGFibGVzLmNzcyI+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMi4xLjMubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9qcy9qcXVlcnkuZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzdWx0LmpzIj4KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8aDI+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU6IFJlc3VsdHM8L2gyPgorPHRhYmxlIGlkPSJ0ZXN0X3Jlc3VsdHMiIGNsYXNzPSJkaXNwbGF5Ij4KKyAgICA8dGhlYWQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TZXJ2ZXI8L3RoPgorICAgICAgICAgICAgPHRoPkNsaWVudDwvdGg+CisgICAgICAgICAgICA8dGg+UHJvdG9jb2w8L3RoPgorICAgICAgICAgICAgPHRoPlRyYW5zcG9ydDwvdGg+CisgICAgICAgICAgICA8dGg+UmVzdWx0IChsb2cpPC90aD4KKyAgICAgICAgICAgIDx0aD5FeHBlY3RlZDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKzwvdGFibGU+Cis8aDI+VGVzdCBJbmZvcm1hdGlvbjwvaDI+Cis8cHJlIGlkPSJ0ZXN0X2luZm8iPjwvcHJlPgorCis8YSBocmVmPSJsb2ciPmJyb3dzZSByYXcgbG9nIGZpbGVzPC9hPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gYi90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3Njk2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMva25vd25fZmFpbHVyZXNfTGludXguanNvbgpAQCAtMCwwICsxLDUwIEBACitbCisgICAgImNfZ2xpYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNfZ2xpYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY2wtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfY29tcGFjdF9tdWx0aWgtaGVhZGVyX2J1ZmZlcmVkLWlwIiwKKyAgICAiY3BwLXRoZWFkZXJfdW5mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl91bmZyYW1lZF9jb21wYWN0X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZ28tbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImhzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInBlcmwtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJwZXJsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9hY2NlbC1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfYWNjZWwtYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJuZXRjb3JlLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5ldGNvcmUtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIgorXQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9sb2NhbF90aHJpZnQvX19pbml0X18ucHkgYi90ZXN0L2ZlYXR1cmVzL2xvY2FsX3RocmlmdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVjZWJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9sb2NhbF90aHJpZnQvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworX1NDUklQVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitfUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfU0NSSVBUX0RJUikpKQorX0xJQkRJUiA9IG9zLnBhdGguam9pbihfUk9PVF9ESVIsICdsaWInLCAncHknLCAnYnVpbGQnLCAnbGliLionKQorCitmb3IgbGlicGF0aCBpbiBnbG9iLmdsb2IoX0xJQkRJUik6CisgICAgaWYgbGlicGF0aC5lbmRzd2l0aCgnLSVkLiVkJyAlIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdKSk6CisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBsaWJwYXRoKQorICAgICAgICB0aHJpZnQgPSBfX2ltcG9ydF9fKCd0aHJpZnQnKQorICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9ub3NzbHYzLnNoIGIvdGVzdC9mZWF0dXJlcy9ub3NzbHYzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4Y2NhMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2gKQEAgLTAsMCArMSw1OSBAQAorIyEvYmluL2Jhc2gKKworIworIyBDaGVja3MgdG8gbWFrZSBzdXJlIFNTTHYzIGlzIG5vdCBhbGxvd2VkIGJ5IGEgc2VydmVyLgorIworCitUSFJJRlRIT1NUPWxvY2FsaG9zdAorVEhSSUZUUE9SVD05MDkwCisKK3doaWxlIFtbICQjIC1nZSAxIF1dOyBkbworICBhcmc9IiQxIgorICBhcmdJTj0oJHthcmcvLz0vIH0pCisKKyAgY2FzZSAke2FyZ0lOWzBdfSBpbgorICAgIC1ofC0taG9zdCkKKyAgICBUSFJJRlRIT1NUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAtcHwtLXBvcnQpCisgICAgVEhSSUZUUE9SVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgKikKKyAgICAgICAgICAjIHVua25vd24gb3B0aW9uIGlnbm9yZWQKKyAgICA7OworICBlc2FjCisKKyAgc2hpZnQgICAjIHBhc3QgYXJndW1lbnQgb3IgdmFsdWUKK2RvbmUKKworZnVuY3Rpb24gbm9zc2x2MworeworICBsb2NhbCBuZWdvCisgIGxvY2FsIG5lZ29kZW5pZWQKKyAgbG9jYWwgb3BlbnNzbHYKKworICBvcGVuc3Nsdj0kKG9wZW5zc2wgdmVyc2lvbiB8IGN1dCAtZCcgJyAtZjIpCisgIGlmIFtbICRvcGVuc3NsdiA+ICIxLjAiIF1dOyB0aGVuCisgICAgZWNobyAiW3Bhc3NdIE9wZW5TU0wgMS4xIG9yIGxhdGVyIC0gbm8gbmVlZCB0byBjaGVjayBzc2wzIgorICAgIHJldHVybiAwCisgIGZpCisKKyAgIyBlY2hvICJvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICRUSFJJRlRIT1NUOiRUSFJJRlRQT1JUIC1DQWZpbGUgLi4va2V5cy9DQS5wZW0gLXNzbDMgMj4mMSA8IC9kZXYvbnVsbCIKKyAgbmVnbz0kKG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtc3NsMyAyPiYxIDwgL2Rldi9udWxsKQorICBuZWdvZGVuaWVkPSQ/CisKKyAgaWYgW1sgJG5lZ29kZW5pZWQgLW5lIDAgXV07IHRoZW4KKyAgICBlY2hvICJbcGFzc10gU1NMdjMgbmVnb3RpYXRpb24gZGlzYWJsZWQiCisgICAgZWNobyAkbmVnbworICAgIHJldHVybiAwCisgIGZpCisKKyAgZWNobyAiW2ZhaWxdIFNTTHYzIG5lZ290aWF0aW9uIGVuYWJsZWQhICBzdGRvdXQ6IgorICBlY2hvICRuZWdvCisgIHJldHVybiAxCit9CisKK25vc3NsdjMKK2V4aXQgJD8KZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvc2V0dXAuY2ZnIGIvdGVzdC9mZWF0dXJlcy9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMWY5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2ZsYWtlOF0KK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkgYi90ZXN0L2ZlYXR1cmVzL3N0cmluZ19saW1pdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk5MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkKQEAgLTAsMCArMSw2MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHN5cworCitmcm9tIHV0aWwgaW1wb3J0IGFkZF9jb21tb25fYXJncywgaW5pdF9wcm90b2NvbAorZnJvbSBsb2NhbF90aHJpZnQgaW1wb3J0IHRocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRNZXNzYWdlVHlwZSwgVFR5cGUKKworCisjIFRPRE86IGdlbmVyYXRlIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKK2RlZiB0ZXN0X3N0cmluZyhwcm90bywgdmFsdWUpOgorICAgIG1ldGhvZF9uYW1lID0gJ3Rlc3RTdHJpbmcnCisgICAgdHR5cGUgPSBUVHlwZS5TVFJJTkcKKyAgICBwcm90by53cml0ZU1lc3NhZ2VCZWdpbihtZXRob2RfbmFtZSwgVE1lc3NhZ2VUeXBlLkNBTEwsIDMpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbihtZXRob2RfbmFtZSArICdfYXJncycpCisgICAgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKCd0aGluZycsIHR0eXBlLCAxKQorICAgIHByb3RvLndyaXRlU3RyaW5nKHZhbHVlKQorICAgIHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBmaWQgPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZpZCA9PSAwCisgICAgYXNzZXJ0IGZ0eXBlID09IHR0eXBlCisgICAgcmVzdWx0ID0gcHJvdG8ucmVhZFN0cmluZygpCisgICAgcHJvdG8ucmVhZEZpZWxkRW5kKCkKKyAgICBfLCBmdHlwZSwgXyA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZnR5cGUgPT0gVFR5cGUuU1RPUAorICAgIHByb3RvLnJlYWRTdHJ1Y3RFbmQoKQorICAgIHByb3RvLnJlYWRNZXNzYWdlRW5kKCkKKyAgICBhc3NlcnQgdmFsdWUgPT0gcmVzdWx0CisKKworZGVmIG1haW4oYXJndik6CisgICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBhZGRfY29tbW9uX2FyZ3MocCkKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1saW1pdCcsIHR5cGU9aW50KQorICAgIGFyZ3MgPSBwLnBhcnNlX2FyZ3MoKQorICAgIHByb3RvID0gaW5pdF9wcm90b2NvbChhcmdzKQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCAtIDEpKQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCAtIDEpKQorICAgIHByaW50KCdbT0tdOiBsaW1pdCAtIDEnKQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiBhcmdzLmxpbWl0KQorICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiBhcmdzLmxpbWl0KQorICAgIHByaW50KCdbT0tdOiBqdXN0IGxpbWl0JykKKyAgICB0cnk6CisgICAgICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCArIDEpKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHByaW50KCdbT0tdOiBsaW1pdCArIDEnKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCdbRVJST1JdOiBsaW1pdCArIDEnKQorICAgICAgICBhc3NlcnQgRmFsc2UKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy90ZXN0cy5qc29uIGIvdGVzdC9mZWF0dXJlcy90ZXN0cy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTA3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24KQEAgLTAsMCArMSwxMTQgQEAKK1sKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgdW5mcmFtZWQgYmluYXJ5IHdpcmUgZm9ybWF0IiwKKyAgICAibmFtZSI6ICJ0aGVhZGVyX3VuZnJhbWVkX2JpbmFyeSIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1iaW5hcnkiLAorICAgICAgIi0tb3ZlcnJpZGUtdHJhbnNwb3J0PWJ1ZmZlcmVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAiZGVzY3JpcHRpb24iOiAiVEhlYWRlciBkZXRlY3RzIGZyYW1lZCBiaW5hcnkgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfZnJhbWVkX2JpbmFyeSIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1iaW5hcnkiLAorICAgICAgIi0tb3ZlcnJpZGUtdHJhbnNwb3J0PWZyYW1lZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImhlYWRlciJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyB1bmZyYW1lZCBjb21wYWN0IHdpcmUgZm9ybWF0IiwKKyAgICAibmFtZSI6ICJ0aGVhZGVyX3VuZnJhbWVkX2NvbXBhY3QiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAidGhlYWRlcl9iaW5hcnkucHkiLAorICAgICAgIi0tb3ZlcnJpZGUtcHJvdG9jb2w9Y29tcGFjdCIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9YnVmZmVyZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgZnJhbWVkIGNvbXBhY3Qgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfZnJhbWVkX2NvbXBhY3QiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAidGhlYWRlcl9iaW5hcnkucHkiLAorICAgICAgIi0tb3ZlcnJpZGUtcHJvdG9jb2w9Y29tcGFjdCIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9ZnJhbWVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJsaW1pdF9zdHJpbmdfbGVuZ3RoIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInN0cmluZ19saW1pdC5weSIsCisgICAgICAiLS1saW1pdD01MCIKKyAgICBdLAorICAgICJyZW1vdGVfYXJncyI6IFsKKyAgICAgICItLXN0cmluZy1saW1pdD01MCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibGltaXRfY29udGFpbmVyX2xlbmd0aCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJjb250YWluZXJfbGltaXQucHkiLAorICAgICAgIi0tbGltaXQ9NTAiCisgICAgXSwKKyAgICAicmVtb3RlX2FyZ3MiOiBbCisgICAgICAiLS1jb250YWluZXItbGltaXQ9NTAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiCisgICAgXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIm5vc3NsdjMiLAorICAgICJjb21tZW50IjogImNoZWNrIHRvIG1ha2Ugc3VyZSBTU0x2MyBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJub3NzbHYzLnNoIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwLXNzbCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAidGxzIiwKKyAgICAiY29tbWVudCI6ICJjaGVjayB0byBtYWtlIHN1cmUgVExTdjEuMCBvciBsYXRlciBpcyBzdXBwb3J0ZWQiLAorICAgICJjb21tYW5kIjogWworICAgICAgInRscy5zaCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcC1zc2wiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfQorXQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy90aGVhZGVyX2JpbmFyeS5weSBiL3Rlc3QvZmVhdHVyZXMvdGhlYWRlcl9iaW5hcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxMzk5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdGhlYWRlcl9iaW5hcnkucHkKQEAgLTAsMCArMSw3MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN5cworCitmcm9tIHV0aWwgaW1wb3J0IGFkZF9jb21tb25fYXJncworZnJvbSBsb2NhbF90aHJpZnQgaW1wb3J0IHRocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRNZXNzYWdlVHlwZSwgVFR5cGUKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVEJ1ZmZlcmVkVHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorCisKK2RlZiB0ZXN0X3ZvaWQocHJvdG8pOgorICAgIHByb3RvLndyaXRlTWVzc2FnZUJlZ2luKCd0ZXN0Vm9pZCcsIFRNZXNzYWdlVHlwZS5DQUxMLCAzKQorICAgIHByb3RvLndyaXRlU3RydWN0QmVnaW4oJ3Rlc3RWb2lkX2FyZ3MnKQorICAgIHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgICAgcHJvdG8ud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBwcm90by50cmFucy5mbHVzaCgpCisKKyAgICBfLCBtdHlwZSwgXyA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGFzc2VydCBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorCisKKyMgVEhlYWRlciBzdGFjayBzaG91bGQgYWNjZXB0IGJpbmFyeSBwcm90b2NvbCB3aXRoIG9wdGlvbmFsbHkgZnJhbWVkIHRyYW5zcG9ydAorZGVmIG1haW4oYXJndik6CisgICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBhZGRfY29tbW9uX2FyZ3MocCkKKyAgICAjIFNpbmNlIFRIZWFkZXJUcmFuc3BvcnQgYWN0cyBhcyBmcmFtZWQgdHJhbnNwb3J0IHdoZW4gZGV0ZWN0ZWQgZnJhbWUsIHdlCisgICAgIyBjYW5ub3QgdXNlIC0tdHJhbnNwb3J0PWZyYW1lZCBhcyBpdCB3b3VsZCByZXN1bHQgaW4gMiBsYXllcmVkIGZyYW1lcy4KKyAgICBwLmFkZF9hcmd1bWVudCgnLS1vdmVycmlkZS10cmFuc3BvcnQnKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLW92ZXJyaWRlLXByb3RvY29sJykKKyAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKKyAgICBhc3NlcnQgYXJncy5wcm90b2NvbCA9PSAnaGVhZGVyJworICAgIGFzc2VydCBhcmdzLnRyYW5zcG9ydCA9PSAnYnVmZmVyZWQnCisgICAgYXNzZXJ0IG5vdCBhcmdzLnNzbAorCisgICAgc29jayA9IFRTb2NrZXQoYXJncy5ob3N0LCBhcmdzLnBvcnQsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX0lORVQpCisgICAgaWYgbm90IGFyZ3Mub3ZlcnJpZGVfdHJhbnNwb3J0IG9yIGFyZ3Mub3ZlcnJpZGVfdHJhbnNwb3J0ID09ICdidWZmZXJlZCc6CisgICAgICAgIHRyYW5zID0gVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2spCisgICAgZWxpZiBhcmdzLm92ZXJyaWRlX3RyYW5zcG9ydCA9PSAnZnJhbWVkJzoKKyAgICAgICAgcHJpbnQoJ1RGUkFNRUQnKQorICAgICAgICB0cmFucyA9IFRGcmFtZWRUcmFuc3BvcnQoc29jaykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIHRyYW5zcG9ydCcpCisgICAgdHJhbnMub3BlbigpCisKKyAgICBpZiBub3QgYXJncy5vdmVycmlkZV9wcm90b2NvbCBvciBhcmdzLm92ZXJyaWRlX3Byb3RvY29sID09ICdiaW5hcnknOgorICAgICAgICBwcm90byA9IFRCaW5hcnlQcm90b2NvbCh0cmFucykKKyAgICBlbGlmIGFyZ3Mub3ZlcnJpZGVfcHJvdG9jb2wgPT0gJ2NvbXBhY3QnOgorICAgICAgICBwcm90byA9IFRDb21wYWN0UHJvdG9jb2wodHJhbnMpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaW52YWxpZCB0cmFuc3BvcnQnKQorCisgICAgdGVzdF92b2lkKHByb3RvKQorICAgIHRlc3Rfdm9pZChwcm90bykKKworICAgIHRyYW5zLmNsb3NlKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvdGxzLnNoIGIvdGVzdC9mZWF0dXJlcy90bHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGFkYTZhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdGxzLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9iYXNoCisKKyMKKyMgQ2hlY2tzIHRvIG1ha2Ugc3VyZSBUTFN2MS4wIG9yIGxhdGVyIGlzIGFsbG93ZWQgYnkgYSBzZXJ2ZXIuCisjCisKK1RIUklGVEhPU1Q9bG9jYWxob3N0CitUSFJJRlRQT1JUPTkwOTAKKword2hpbGUgW1sgJCMgLWdlIDEgXV07IGRvCisgIGFyZz0iJDEiCisgIGFyZ0lOPSgke2FyZy8vPS8gfSkKKworICBjYXNlICR7YXJnSU5bMF19IGluCisgICAgLWh8LS1ob3N0KQorICAgIFRIUklGVEhPU1Q9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgIC1wfC0tcG9ydCkKKyAgICBUSFJJRlRQT1JUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAqKQorICAgICAgICAgICMgdW5rbm93biBvcHRpb24gaWdub3JlZAorICAgIDs7CisgIGVzYWMKKworICBzaGlmdCAgICMgcGFzdCBhcmd1bWVudCBvciB2YWx1ZQorZG9uZQorCitkZWNsYXJlIC1BIEVYUEVDVF9ORUdPVElBVEUKK0VYUEVDVF9ORUdPVElBVEVbdGxzMV09MQorRVhQRUNUX05FR09USUFURVt0bHMxXzFdPTEKK0VYUEVDVF9ORUdPVElBVEVbdGxzMV8yXT0xCisKK2ZhaWx1cmVzPTAKKworZnVuY3Rpb24gdGxzCit7CisgIGZvciBQUk9UTyBpbiAiJHshRVhQRUNUX05FR09USUFURVtAXX0iOyBkbworCisgICAgbG9jYWwgbmVnbworICAgIGxvY2FsIG5lZ29kZW5pZWQKKyAgICBsb2NhbCByZXMKKworICAgIGVjaG8gIm9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtJFBST1RPIDI+JjEgPCAvZGV2L251bGwiCisgICAgbmVnbz0kKG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtJFBST1RPIDI+JjEgPCAvZGV2L251bGwpCisgICAgbmVnb2RlbmllZD0kPworICAgIGVjaG8gInJlc3VsdCBvZiBjb21tYW5kOiAkbmVnb2RlbmllZCIKKworICAgIHJlcz0iZW5hYmxlZCI7IGlmIFtbICR7RVhQRUNUX05FR09USUFURVskUFJPVE9dfSAtZXEgMCBdXTsgdGhlbiByZXM9ImRpc2FibGVkIjsgZmkKKworICAgIGlmIFtbICRuZWdvZGVuaWVkIC1uZSAke0VYUEVDVF9ORUdPVElBVEVbJFBST1RPXX0gXV07IHRoZW4KKyAgICAgIGVjaG8gIiRQUk9UTyBuZWdvdGlhdGlvbiBhbGxvd2VkIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIlt3YXJuXSAkUFJPVE8gbmVnb3RpYXRpb24gZGlkIG5vdCB3b3JrIgorICAgICAgZWNobyAkbmVnbworICAgICAgKChmYWlsdXJlcysrKSkKKyAgICBmaQorICBkb25lCit9CisKK3RscworCitpZiBbWyAkZmFpbHVyZXMgLWVxIDMgXV07IHRoZW4KKyAgZWNobyAiW2ZhaWxdIEF0IGxlYXN0IG9uZSBvZiBUTFN2MS4wLCBUTFN2MS4xLCBvciBUTFN2MS4yIG5lZWRzIHRvIHdvcmssIGJ1dCBkb2VzIG5vdCIKKyAgZXhpdCAkZmFpbHVyZXMKK2ZpCisKK2VjaG8gIltwYXNzXSBBdCBsZWFzdCBvbmUgb2YgVExTdjEuMCwgVExTdjEuMSwgb3IgVExTdjEuMiB3b3JrZWQiCitleGl0IDAKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvdXRpbC5weSBiL3Rlc3QvZmVhdHVyZXMvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJiYmJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy91dGlsLnB5CkBAIC0wLDAgKzEsNDAgQEAKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHNvY2tldAorCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0IGltcG9ydCBUU29ja2V0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVEJ1ZmZlcmVkVHJhbnNwb3J0LCBURnJhbWVkVHJhbnNwb3J0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVEh0dHBDbGllbnQgaW1wb3J0IFRIdHRwQ2xpZW50Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorCisKK2RlZiBhZGRfY29tbW9uX2FyZ3MocCk6CisgICAgcC5hZGRfYXJndW1lbnQoJy0taG9zdCcsIGRlZmF1bHQ9J2xvY2FsaG9zdCcpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tcG9ydCcsIHR5cGU9aW50LCBkZWZhdWx0PTkwOTApCisgICAgcC5hZGRfYXJndW1lbnQoJy0tcHJvdG9jb2wnLCBkZWZhdWx0PSdiaW5hcnknKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLXRyYW5zcG9ydCcsIGRlZmF1bHQ9J2J1ZmZlcmVkJykKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1zc2wnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorCisKK2RlZiBwYXJzZV9jb21tb25fYXJncyhhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgIHJldHVybiBwLnBhcnNlX2FyZ3MoYXJndikKKworCitkZWYgaW5pdF9wcm90b2NvbChhcmdzKToKKyAgICBzb2NrID0gVFNvY2tldChhcmdzLmhvc3QsIGFyZ3MucG9ydCwgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfSU5FVCkKKyAgICBzb2NrLnNldFRpbWVvdXQoNTAwKQorICAgIHRyYW5zID0geworICAgICAgICAnYnVmZmVyZWQnOiBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgICAgICdmcmFtZWQnOiBURnJhbWVkVHJhbnNwb3J0LAorICAgICAgICAnaHR0cCc6IFRIdHRwQ2xpZW50LAorICAgIH1bYXJncy50cmFuc3BvcnRdKHNvY2spCisgICAgdHJhbnMub3BlbigpCisgICAgcmV0dXJuIHsKKyAgICAgICAgJ2JpbmFyeSc6IFRCaW5hcnlQcm90b2NvbCwKKyAgICAgICAgJ2NvbXBhY3QnOiBUQ29tcGFjdFByb3RvY29sLAorICAgICAgICAnanNvbic6IFRKU09OUHJvdG9jb2wsCisgICAgfVthcmdzLnByb3RvY29sXSh0cmFucykKZGlmZiAtLWdpdCBhL3Rlc3QvZ28vTWFrZWZpbGUuYW0gYi90ZXN0L2dvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTgzMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitCVUlMVF9TT1VSQ0VTID0gZ29wYXRoCisKK1RIUklGVENNRCA9ICQoVEhSSUZUKSAtb3V0IHNyYy9nZW4gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQkKENPTVBJTEVSX0VYVFJBRkxBRykKK1RIUklGVFRFU1QgPSAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworcHJlY3Jvc3M6IGJpbi90ZXN0Y2xpZW50IGJpbi90ZXN0c2VydmVyCisKK1RocmlmdFRlc3QudGhyaWZ0OiAkKFRIUklGVFRFU1QpCisJZ3JlcCAtdiBsaXN0LiptYXAuKmxpc3QuKm1hcCAkKFRIUklGVFRFU1QpID4gVGhyaWZ0VGVzdC50aHJpZnQKKworLlBIT05ZOiBnb3BhdGgKKworIyBUaHJpZnQgZm9yIEdPIGhhcyBwcm9ibGVtcyB3aXRoIGNvbXBsZXggbWFwIGtleXM6IFRIUklGVC0yMDYzCitnb3BhdGg6ICQoVEhSSUZUKSBUaHJpZnRUZXN0LnRocmlmdAorCW1rZGlyIC1wIHNyYy9nZW4KKwkkKFRIUklGVENNRCkgVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVENNRCkgLi4vU3RyZXNzVGVzdC50aHJpZnQKKwlHT1BBVEg9YHB3ZGAgJChHTykgZ2V0IGdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIHx8IHRydWUKKwlzZWQgLWkgJ3MvXCJjb250ZXh0XCIvXCJnb2xhbmcub3JnXC94XC9uZXRcL2NvbnRleHRcIi9nJyBzcmMvZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2svY29udHJvbGxlci5nbyB8fCB0cnVlCisJR09QQVRIPWBwd2RgICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jaworCWxuIC1uZnMgLi4vLi4vLi4vbGliL2dvL3RocmlmdCBzcmMvdGhyaWZ0CisJdG91Y2ggZ29wYXRoCisKK2Jpbi90ZXN0Y2xpZW50OiBnb3BhdGgKKwlHT1BBVEg9YHB3ZGAgJChHTykgaW5zdGFsbCBiaW4vdGVzdGNsaWVudAorCitiaW4vdGVzdHNlcnZlcjogZ29wYXRoCisJR09QQVRIPWBwd2RgICQoR08pIGluc3RhbGwgYmluL3Rlc3RzZXJ2ZXIKKworYmluL3N0cmVzczogZ29wYXRoCisJR09QQVRIPWBwd2RgICQoR08pIGluc3RhbGwgYmluL3N0cmVzcworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBzcmMvZ2VuIHNyYy9naXRodWIuY29tL2dvbGFuZyBzcmMvdGhyaWZ0IGJpbiBwa2cgZ29wYXRoIFRocmlmdFRlc3QudGhyaWZ0CisKK2NoZWNrX1BST0dSQU1TOiBiaW4vdGVzdGNsaWVudCBiaW4vdGVzdHNlcnZlciBiaW4vc3RyZXNzCisKK2NoZWNrOiBnb3BhdGggZ2VubW9jaworCUdPUEFUSD1gcHdkYCAkKEdPKSB0ZXN0IC12IGNvbW1vbi8uLi4KKworZ2VubW9jazogZ29wYXRoCisJR09QQVRIPWBwd2RgICQoR08pIGluc3RhbGwgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9tb2NrZ2VuCisJR09QQVRIPWBwd2RgIGJpbi9tb2NrZ2VuIC1kZXN0aW5hdGlvbj1zcmMvY29tbW9uL21vY2tfaGFuZGxlci5nbyAtcGFja2FnZT1jb21tb24gZ2VuL3RocmlmdHRlc3QgVGhyaWZ0VGVzdAorCitFWFRSQV9ESVNUID0gXAorCXNyYy9iaW4gXAorCXNyYy9jb21tb24KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi9zdHJlc3MvbWFpbi5nbyBiL3Rlc3QvZ28vc3JjL2Jpbi9zdHJlc3MvbWFpbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmUwZjIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgbWFpbgorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJmbGFnIgorCSJmbXQiCisJImdlbi9zdHJlc3MiCisJImxvZyIKKwlfICJuZXQvaHR0cC9wcHJvZiIKKwkib3MiCisJInJ1bnRpbWUiCisJInJ1bnRpbWUvcHByb2YiCisJInN5bmMiCisJInN5bmMvYXRvbWljIgorCSJ0aHJpZnQiCisJInRpbWUiCispCisKK3ZhciBjcHVwcm9maWxlID0gZmxhZy5TdHJpbmcoImNwdXByb2ZpbGUiLCAiIiwgIndyaXRlIGNwdSBwcm9maWxlIHRvIHRoaXMgZmlsZSIpCit2YXIgbWVtcHJvZmlsZSA9IGZsYWcuU3RyaW5nKCJtZW1wcm9maWxlIiwgIiIsICJ3cml0ZSBtZW1vcnkgcHJvZmlsZSB0byB0aGlzIGZpbGUiKQorCit2YXIgKAorCWhvc3QgICAgICA9IGZsYWcuU3RyaW5nKCJob3N0IiwgImxvY2FsaG9zdCIsICJIb3N0IHRvIGNvbm5lY3QiKQorCXBvcnQgICAgICA9IGZsYWcuSW50NjQoInBvcnQiLCA5MDkxLCAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCIpCisJbG9vcCAgICAgID0gZmxhZy5JbnQoImxvb3BzIiwgNTAwMDAsICJUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMiKQorCXJ1bnNlcnZlciA9IGZsYWcuSW50KCJzZXJ2ZXIiLCAxLCAiUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2VzcyIpCisJY2xpZW50cyAgID0gZmxhZy5JbnQoImNsaWVudHMiLCAyMCwgIk51bWJlciBvZiBjbGllbnQgdGhyZWFkcyB0byBjcmVhdGUgLSAwIGltcGxpZXMgbm8gY2xpZW50cywgaS5lLiBzZXJ2ZXIgb25seSIpCisJY2FsbE5hbWUgID0gZmxhZy5TdHJpbmcoImNhbGwiLCAiZWNob1ZvaWQiLCAiU2VydmljZSBtZXRob2QgdG8gY2FsbCwgb25lIG9mIGVjaG9Wb2lkLCBlY2hvQnl0ZSwgZWNob0kzMiwgZWNob0k2NCwgZWNob1N0cmluZywgZWNoaUxpc3QsIGVjaG9TZXQsIGVjaG9NYXAiKQorCWNvbXBhY3QgICA9IGZsYWcuQm9vbCgiY29tcGFjdCIsIGZhbHNlLCAiVXNlIGNvbXBhY3QgcHJvdG9jb2wgaW5zdGVhZCBvZiBiaW5hcnkuIikKKwlmcmFtZWQgICAgPSBmbGFnLkJvb2woImZyYW1lZCIsIGZhbHNlLCAiVXNlIGZyYW1lZCB0cmFuc3BvcnQgaW5zdGVhZCBvZiBidWZmZXJlZC4iKQorKQordmFyIGhvc3RQb3J0IHN0cmluZworCit0eXBlIGNhbGxUIGludDY0CisKK2NvbnN0ICgKKwllY2hvVm9pZCBjYWxsVCA9IGlvdGEKKwllY2hvQnl0ZQorCWVjaG9JMzIKKwllY2hvSTY0CisJZWNob1N0cmluZworCWVjaGlMaXN0CisJZWNob1NldAorCWVjaG9NYXAKKykKKwordmFyIGNhbGxUTWFwID0gbWFwW3N0cmluZ11jYWxsVHsKKwkiZWNob1ZvaWQiOiAgIGVjaG9Wb2lkLAorCSJlY2hvQnl0ZSI6ICAgZWNob0J5dGUsCisJImVjaG9JMzIiOiAgICBlY2hvSTMyLAorCSJlY2hvSTY0IjogICAgZWNob0k2NCwKKwkiZWNob1N0cmluZyI6IGVjaG9TdHJpbmcsCisJImVjaGlMaXN0IjogICBlY2hpTGlzdCwKKwkiZWNob1NldCI6ICAgIGVjaG9TZXQsCisJImVjaG9NYXAiOiAgICBlY2hvTWFwLAorfQordmFyIGNhbGxUeXBlIGNhbGxUCisKK3ZhciByZWFkeSwgZG9uZSBzeW5jLldhaXRHcm91cAorCit2YXIgY2xpY291bnRlciBpbnQ2NCA9IDAKK3ZhciBjb3VudGVyIGludDY0ID0gMAorCitmdW5jIG1haW4oKSB7CisJZmxhZy5QYXJzZSgpCisJaWYgKm1lbXByb2ZpbGUgIT0gIiIgeworCQlydW50aW1lLk1lbVByb2ZpbGVSYXRlID0gMTAwCisJfQorCXZhciBvayBib29sCisJaWYgY2FsbFR5cGUsIG9rID0gY2FsbFRNYXBbKmNhbGxOYW1lXTsgIW9rIHsKKwkJbG9nLkZhdGFsKCJVbmtub3duIHNlcnZpY2UgY2FsbCIsICpjYWxsTmFtZSkKKwl9CisJaWYgKmNwdXByb2ZpbGUgIT0gIiIgeworCQlmLCBlcnIgOj0gb3MuQ3JlYXRlKCpjcHVwcm9maWxlKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCWxvZy5GYXRhbChlcnIpCisJCX0KKwkJcHByb2YuU3RhcnRDUFVQcm9maWxlKGYpCisJCWRlZmVyIHBwcm9mLlN0b3BDUFVQcm9maWxlKCkKKwl9CisJaG9zdFBvcnQgPSBmbXQuU3ByaW50ZigiJXM6JWQiLCAqaG9zdCwgKnBvcnQpCisJdmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeQorCXZhciB0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeQorCisJaWYgKmNvbXBhY3QgeworCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCX0gZWxzZSB7CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJfQorCisJaWYgKmZyYW1lZCB7CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJfSBlbHNlIHsKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KDgxOTIpCisJfQorCisJaWYgKnJ1bnNlcnZlciA+IDAgeworCQlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldChob3N0UG9ydCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlsb2cuRmF0YWxmKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQ6ICVzIiwgZXJyKQorCQl9CisKKwkJcHJvY2Vzc29yIDo9IHN0cmVzcy5OZXdTZXJ2aWNlUHJvY2Vzc29yKCZoYW5kbGVye30pCisJCXNlcnZlciA6PSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKwkJaWYgKmNsaWVudHMgPT0gMCB7CisJCQlzZXJ2ZXIuU2VydmUoKQorCQl9IGVsc2UgeworCQkJZ28gc2VydmVyLlNlcnZlKCkKKwkJfQorCX0KKwkvL3N0YXJ0IGNsaWVudHMKKwlpZiAqY2xpZW50cyAhPSAwIHsKKwkJcmVhZHkuQWRkKCpjbGllbnRzICsgMSkKKwkJZG9uZS5BZGQoKmNsaWVudHMpCisJCWZvciBpIDo9IDA7IGkgPCAqY2xpZW50czsgaSsrIHsKKwkJCWdvIGNsaWVudChwcm90b2NvbEZhY3RvcnkpCisJCX0KKwkJcmVhZHkuRG9uZSgpCisJCXJlYWR5LldhaXQoKQorCQkvL3J1biEKKwkJc3RhcnRUaW1lIDo9IHRpbWUuTm93KCkKKwkJLy93YWl0IGZvciBjb21wbGV0aW9uCisJCWRvbmUuV2FpdCgpCisJCWVuZFRpbWUgOj0gdGltZS5Ob3coKQorCQlkdXJhdGlvbiA6PSBlbmRUaW1lLlN1YihzdGFydFRpbWUpCisJCWxvZy5QcmludGYoIiVkIGNhbGxzIGluICV2ICglZiBjYWxscyBwZXIgc2Vjb25kKVxuIiwgY2xpY291bnRlciwgZHVyYXRpb24sIGZsb2F0NjQoY2xpY291bnRlcikvZHVyYXRpb24uU2Vjb25kcygpKQorCX0KKwlpZiAqbWVtcHJvZmlsZSAhPSAiIiB7CisJCWYsIGVyciA6PSBvcy5DcmVhdGUoKm1lbXByb2ZpbGUpCisJCWlmIGVyciAhPSBuaWwgeworCQkJbG9nLkZhdGFsKGVycikKKwkJfQorCQlwcHJvZi5Xcml0ZUhlYXBQcm9maWxlKGYpCisJCWYuQ2xvc2UoKQorCQlyZXR1cm4KKwl9Cit9CisKK2Z1bmMgY2xpZW50KHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSkgeworCXRyYW5zLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTb2NrZXQoaG9zdFBvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGYoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldDogJXMiLCBlcnIpCisJfQorCWJ0cmFucyA6PSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCAyMDQ4KQorCWNsaWVudCA6PSBzdHJlc3MuTmV3U2VydmljZUNsaWVudEZhY3RvcnkoYnRyYW5zLCBwcm90b2NvbEZhY3RvcnkpCisJZXJyID0gdHJhbnMuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGYoIlVuYWJsZSB0byBvcGVuIGNvbm5lY3Rpb246ICVzIiwgZXJyKQorCX0KKwlyZWFkeS5Eb25lKCkKKwlyZWFkeS5XYWl0KCkKKwlzd2l0Y2ggY2FsbFR5cGUgeworCWNhc2UgZWNob1ZvaWQ6CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvVm9pZCgpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaG9CeXRlOgorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob0J5dGUoNDIpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaG9JMzI6CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvSTMyKDQyNDIpCisJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCisJCX0KKwljYXNlIGVjaG9JNjQ6CisJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKKwkJCWNsaWVudC5FY2hvSTY0KDQyNDI0MikKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCWNhc2UgZWNob1N0cmluZzoKKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9TdHJpbmcoIlRlc3RTdHJpbmciKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJY2FzZSBlY2hpTGlzdDoKKwkJbCA6PSBbXWludDh7LTEwLCAtOSwgLTgsIC03LCAtNiwgLTUsIC00LCAtMywgLTIsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fQorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob0xpc3QobCkKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCWNhc2UgZWNob1NldDoKKwkJcyA6PSBtYXBbaW50OF1zdHJ1Y3R7fXstMTA6IHt9LCAtOToge30sIC04OiB7fSwgLTc6IHt9LCAtNjoge30sIC01OiB7fSwgLTQ6IHt9LCAtMzoge30sIC0yOiB7fSwgLTE6IHt9LCAwOiB7fSwgMToge30sIDI6IHt9LCAzOiB7fSwgNDoge30sIDU6IHt9LCA2OiB7fSwgNzoge30sIDg6IHt9fQorCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CisJCQljbGllbnQuRWNob1NldChzKQorCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQorCQl9CisJY2FzZSBlY2hvTWFwOgorCQltIDo9IG1hcFtpbnQ4XWludDh7LTEwOiAxMCwgLTk6IDksIC04OiA4LCAtNzogNywgLTY6IDYsIC01OiA1LCAtNDogNCwgLTM6IDMsIC0yOiAyLCAtMTogMSwgMDogMCwgMTogMSwgMjogMiwgMzogMywgNDogNCwgNTogNSwgNjogNiwgNzogNywgODogOH0KKwkJZm9yIGkgOj0gMDsgaSA8ICpsb29wOyBpKysgeworCQkJY2xpZW50LkVjaG9NYXAobSkKKwkJCWF0b21pYy5BZGRJbnQ2NCgmY2xpY291bnRlciwgMSkKKwkJfQorCX0KKworCWRvbmUuRG9uZSgpCit9CisKK3R5cGUgaGFuZGxlciBzdHJ1Y3R7fQorCitmdW5jIChoICpoYW5kbGVyKSBFY2hvVm9pZChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9CeXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CitmdW5jIChoICpoYW5kbGVyKSBFY2hvSTMyKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gYXJnLCBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9JNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBhcmcsIG5pbAorfQorZnVuYyAoaCAqaGFuZGxlcikgRWNob1N0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKKwlyZXR1cm4gYXJnLCBuaWwKK30KK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9MaXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBbXWludDgpIChyIFtdaW50OCwgZXJyIGVycm9yKSB7CisJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQorCXJldHVybiBhcmcsIG5pbAorfQorZnVuYyAoaCAqaGFuZGxlcikgRWNob1NldChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgbWFwW2ludDhdc3RydWN0e30pIChyIG1hcFtpbnQ4XXN0cnVjdHt9LCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CitmdW5jIChoICpoYW5kbGVyKSBFY2hvTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBtYXBbaW50OF1pbnQ4KSAociBtYXBbaW50OF1pbnQ4LCBlcnIgZXJyb3IpIHsKKwlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCisJcmV0dXJuIGFyZywgbmlsCit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9iaW4vdGVzdGNsaWVudC9tYWluLmdvIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RjbGllbnQvbWFpbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzU3ZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RjbGllbnQvbWFpbi5nbwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG1haW4KKworaW1wb3J0ICgKKwkiY29tbW9uIgorCSJjb250ZXh0IgorCSJmbGFnIgorCSJnZW4vdGhyaWZ0dGVzdCIKKwl0ICJsb2ciCisJInJlZmxlY3QiCisJInRocmlmdCIKKykKKwordmFyIGhvc3QgPSBmbGFnLlN0cmluZygiaG9zdCIsICJsb2NhbGhvc3QiLCAiSG9zdCB0byBjb25uZWN0IikKK3ZhciBwb3J0ID0gZmxhZy5JbnQ2NCgicG9ydCIsIDkwOTAsICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKK3ZhciBkb21haW5fc29ja2V0ID0gZmxhZy5TdHJpbmcoImRvbWFpbi1zb2NrZXQiLCAiIiwgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC90aHJpZnR0ZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCit2YXIgdHJhbnNwb3J0ID0gZmxhZy5TdHJpbmcoInRyYW5zcG9ydCIsICJidWZmZXJlZCIsICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIHpsaWIiKQordmFyIHByb3RvY29sID0gZmxhZy5TdHJpbmcoInByb3RvY29sIiwgImJpbmFyeSIsICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uIikKK3ZhciBzc2wgPSBmbGFnLkJvb2woInNzbCIsIGZhbHNlLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQordmFyIHpsaWIgPSBmbGFnLkJvb2woInpsaWIiLCBmYWxzZSwgIldyYXBwZWQgVHJhbnNwb3J0IHVzaW5nIFpsaWIiKQordmFyIHRlc3Rsb29wcyA9IGZsYWcuSW50KCJ0ZXN0bG9vcHMiLCAxLCAiTnVtYmVyIG9mIFRlc3RzIikKKworZnVuYyBtYWluKCkgeworCWZsYWcuUGFyc2UoKQorCWNsaWVudCwgXywgZXJyIDo9IGNvbW1vbi5TdGFydENsaWVudCgqaG9zdCwgKnBvcnQsICpkb21haW5fc29ja2V0LCAqdHJhbnNwb3J0LCAqcHJvdG9jb2wsICpzc2wpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAiLCBlcnIpCisJfQorCWZvciBpIDo9IDA7IGkgPCAqdGVzdGxvb3BzOyBpKysgeworCQljYWxsRXZlcnl0aGluZyhjbGllbnQpCisJfQorfQorCit2YXIgcm1hcG1hcCA9IG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzJ7CisJLTQ6IG1hcFtpbnQzMl1pbnQzMnstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorCTQ6ICBtYXBbaW50MzJdaW50MzJ7NDogNCwgMzogMywgMjogMiwgMTogMX0sCit9CisKK3ZhciB4eHMgPSAmdGhyaWZ0dGVzdC5YdHJ1Y3R7CisJU3RyaW5nVGhpbmc6ICJIZWxsbzIiLAorCUJ5dGVUaGluZzogICA0MiwKKwlJMzJUaGluZzogICAgNDI0MiwKKwlJNjRUaGluZzogICAgNDI0MjQyLAorfQorCit2YXIgeGNlcHQgPSAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJYY2VwdGlvbiJ9Cit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCisKK2Z1bmMgY2FsbEV2ZXJ5dGhpbmcoY2xpZW50ICp0aHJpZnR0ZXN0LlRocmlmdFRlc3RDbGllbnQpIHsKKwl2YXIgZXJyIGVycm9yCisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCisJfQorCisJdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGhpbmciKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiB0aGluZyAhPSAidGhpbmciIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZygpIHJlc3VsdCwgZXhwZWN0ZWQgJ3RoaW5nJyBnb3QgJyVzJyAiLCB0aGluZykKKwl9CisKKwlibCwgZXJyIDo9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCB0cnVlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIWJsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJvb2woKSByZXN1bHQgZXhwZWN0ZWQgdHJ1ZSwgZ290ICVmICIsIGJsKQorCX0KKwlibCwgZXJyID0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIGZhbHNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgYmwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICVmICIsIGJsKQorCX0KKworCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCeXRlKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiBiICE9IDQyIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJ5dGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIsIGdvdCAlZCAiLCBiKQorCX0KKworCWkzMiwgZXJyIDo9IGNsaWVudC5UZXN0STMyKGRlZmF1bHRDdHgsIDQyNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJMzIoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmIGkzMiAhPSA0MjQyIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQorCX0KKworCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIDQyNDI0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEk2NCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgaTY0ICE9IDQyNDI0MiB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQorCX0KKworCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCA0Mi40MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdERvdWJsZSgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgZCAhPSA0Mi40MiB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3REb3VibGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIuNDIsIGdvdCAlZiAiLCBkKQorCX0KKworCWJpbm91dCA6PSBtYWtlKFtdYnl0ZSwgMjU2KQorCWZvciBpIDo9IDA7IGkgPCAyNTY7IGkrKyB7CisJCWJpbm91dFtpXSA9IGJ5dGUoaSkKKwl9CisJYmluLCBlcnIgOj0gY2xpZW50LlRlc3RCaW5hcnkoZGVmYXVsdEN0eCwgYmlub3V0KQorCWZvciBpIDo9IDA7IGkgPCAyNTY7IGkrKyB7CisJCWlmIGJpbm91dFtpXSAhPSBiaW5baV0geworCQkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJpbmFyeSgpIHJlc3VsdCBleHBlY3RlZCAlZCwgZ290ICVkICIsIGJpbm91dFtpXSwgYmluW2ldKQorCQl9CisJfQorCisJeHMgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCXhzLlN0cmluZ1RoaW5nID0gInRoaW5nIgorCXhzLkJ5dGVUaGluZyA9IDQyCisJeHMuSTMyVGhpbmcgPSA0MjQyCisJeHMuSTY0VGhpbmcgPSA0MjQyNDIKKwl4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHhzKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RydWN0KCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAqeHMgIT0gKnhzcmV0IHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cnVjdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHMsIHhzcmV0KQorCX0KKworCXgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCisJeDIuU3RydWN0VGhpbmcgPSB4cworCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIHgyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TmVzdCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHgyLCB4MnJldCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TmVzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeDIsIHgycmV0KQorCX0KKworCW0gOj0gbWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfQorCW1yZXQsIGVyciA6PSBjbGllbnQuVGVzdE1hcChkZWZhdWx0Q3R4LCBtKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TWFwKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobSwgbXJldCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBtLCBtcmV0KQorCX0KKworCXNtIDo9IG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifQorCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoZGVmYXVsdEN0eCwgc20pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmdNYXAoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChzbSwgc21yZXQpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZ01hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgc20sIHNtcmV0KQorCX0KKworCXMgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgcykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICIsIGVycikKKwl9CisJLy8gU2V0cyBjYW4gYmUgaW4gYW55IG9yZGVyLCBidXQgR28gc2xpY2VzIGFyZSBvcmRlcmVkLCBzbyByZWZsZWN0LkRlZXBFcXVhbCB3b24ndCB3b3JrLgorCXN0ZW1wIDo9IG1hcFtpbnQzMl1zdHJ1Y3R7fXt9CisJZm9yIF8sIHZhbCA6PSByYW5nZSBzIHsKKwkJc3RlbXBbdmFsXSA9IHN0cnVjdHt9e30KKwl9CisJZm9yIF8sIHZhbCA6PSByYW5nZSBzcmV0IHsKKwkJaWYgXywgb2sgOj0gc3RlbXBbdmFsXTsgIW9rIHsKKwkJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RTZXQoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHMsIHNyZXQpCisJCX0KKwl9CisKKwlsIDo9IFtdaW50MzJ7MSwgMiwgNDJ9CisJbHJldCwgZXJyIDo9IGNsaWVudC5UZXN0TGlzdChkZWZhdWx0Q3R4LCBsKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TGlzdCgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGwsIGxyZXQpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdExpc3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIGwsIGxyZXQpCisJfQorCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgZXJldCAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCisJfQorCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogIiwgZXJyKQorCX0KKwlpZiB0cmV0ICE9IHRocmlmdHRlc3QuVXNlcklkKDQyKSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RUeXBlZGVmKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIHRyZXQpCisJfQorCisJbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgNDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBNYXAoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChtYXBtYXAsIHJtYXBtYXApIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE1hcE1hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgcm1hcG1hcCwgbWFwbWFwKQorCX0KKworCWNyYXp5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQorCWNyYXp5LlVzZXJNYXAgPSBtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklkeworCQl0aHJpZnR0ZXN0Lk51bWJlcnpfRklWRTogIDUsCisJCXRocmlmdHRlc3QuTnVtYmVyel9FSUdIVDogOCwKKwl9CisJdHJ1Y2sxIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwl0cnVjazEuU3RyaW5nVGhpbmcgPSAiR29vZGJ5ZTQiCisJdHJ1Y2sxLkJ5dGVUaGluZyA9IDQKKwl0cnVjazEuSTMyVGhpbmcgPSA0CisJdHJ1Y2sxLkk2NFRoaW5nID0gNAorCXRydWNrMiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJdHJ1Y2syLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKKwl0cnVjazIuQnl0ZVRoaW5nID0gMgorCXRydWNrMi5JMzJUaGluZyA9IDIKKwl0cnVjazIuSTY0VGhpbmcgPSAyCisJY3JhenkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0eworCQl0cnVjazEsCisJCXRydWNrMiwKKwl9CisJaW5zYW5pdHksIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGRlZmF1bHRDdHgsIGNyYXp5KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0SW5zYW5pdHkoKSBjYWxsOiAiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChjcmF6eSwgaW5zYW5pdHlbMV1bMl0pIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEluc2FuaXR5KCkgZmlyc3QgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLAorCQkJY3JhenksCisJCQlpbnNhbml0eVsxXVsyXSkKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGNyYXp5LCBpbnNhbml0eVsxXVszXSkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0SW5zYW5pdHkoKSBzZWNvbmQgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLAorCQkJY3JhenksCisJCQlpbnNhbml0eVsxXVszXSkKKwl9CisJaWYgbGVuKGluc2FuaXR5WzJdWzZdLlVzZXJNYXApID4gMCB8fCBsZW4oaW5zYW5pdHlbMl1bNl0uWHRydWN0cykgPiAwIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEluc2FuaXR5KCkgbm9uLWVtcHR5IHJlc3VsdCBnb3QgJSN2ICIsCisJCQlpbnNhbml0eVsyXVs2XSkKKwl9CisKKwl4eHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdE11bHRpKGRlZmF1bHRDdHgsIDQyLCA0MjQyLCA0MjQyNDIsIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNdWx0aSgpIGNhbGw6ICIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHh4cywgeHhzcmV0KSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHhzLCB4eHNyZXQpCisJfQorCisJZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIikKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdEV4Y2VwdGlvbigpIGNhbGwiKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoZXJyLCB4Y2VwdCkgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4Y2VwdCwgZXJyKQorCX0KKworCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJURXhjZXB0aW9uIikKKwlfLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgZXJyID09IG5pbCB8fCAhb2sgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkIEFwcGxpY2F0aW9uRXJyb3IsIGdvdCAlI3YgIiwgZXJyKQorCX0KKworCWlnbiwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIiwgImlnbm9yZW1lIikKKwlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgeworCQl0LkZhdGFsZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVyciwgJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9KSB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCisJfQorCisJaWduLCBlcnIgPSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKQorCWlmIGlnbiAhPSBuaWwgfHwgZXJyID09IG5pbCB7CisJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RNdWx0aUV4Y2VwdGlvbigpIGNhbGwiKQorCX0KKwlleHBlY3RpbmcgOj0gJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19CisKKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoZXJyLCBleHBlY3RpbmcpIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpRXhjZXB0aW9uKCkgJSN2ICIsIGVycikKKwl9CisKKwllcnIgPSBjbGllbnQuVGVzdE9uZXdheShkZWZhdWx0Q3R4LCAyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0T25ld2F5KCkgY2FsbDogIiwgZXJyKQorCX0KKworCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbyBiL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyZDk2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28KQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG1haW4KKworaW1wb3J0ICgKKwkiY29tbW9uIgorCSJmbGFnIgorCSJmbXQiCisJImxvZyIKKwkibmV0L2h0dHAiCisJInRocmlmdCIKKykKKwordmFyIGhvc3QgPSBmbGFnLlN0cmluZygiaG9zdCIsICJsb2NhbGhvc3QiLCAiSG9zdCB0byBjb25uZWN0IikKK3ZhciBwb3J0ID0gZmxhZy5JbnQ2NCgicG9ydCIsIDkwOTAsICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKK3ZhciBkb21haW5fc29ja2V0ID0gZmxhZy5TdHJpbmcoImRvbWFpbi1zb2NrZXQiLCAiIiwgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCit2YXIgdHJhbnNwb3J0ID0gZmxhZy5TdHJpbmcoInRyYW5zcG9ydCIsICJidWZmZXJlZCIsICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIHpsaWIiKQordmFyIHByb3RvY29sID0gZmxhZy5TdHJpbmcoInByb3RvY29sIiwgImJpbmFyeSIsICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uIikKK3ZhciBzc2wgPSBmbGFnLkJvb2woInNzbCIsIGZhbHNlLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQordmFyIHpsaWIgPSBmbGFnLkJvb2woInpsaWIiLCBmYWxzZSwgIldyYXBwZWQgVHJhbnNwb3J0IHVzaW5nIFpsaWIiKQordmFyIGNlcnRQYXRoID0gZmxhZy5TdHJpbmcoImNlcnRQYXRoIiwgImtleXMiLCAiRGlyZWN0b3J5IHRoYXQgY29udGFpbnMgU1NMIGNlcnRpZmljYXRlcyIpCisKK2Z1bmMgbWFpbigpIHsKKwlmbGFnLlBhcnNlKCkKKworCXByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIGVyciA6PSBjb21tb24uR2V0U2VydmVyUGFyYW1zKCpob3N0LCAqcG9ydCwgKmRvbWFpbl9zb2NrZXQsICp0cmFuc3BvcnQsICpwcm90b2NvbCwgKnNzbCwgKmNlcnRQYXRoLCBjb21tb24uUHJpbnRpbmdIYW5kbGVyKQorCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGYoIlVuYWJsZSB0byBwcm9jZXNzIHNlcnZlciBwYXJhbXM6ICIsIGVycikKKwl9CisKKwlpZiAqdHJhbnNwb3J0ID09ICJodHRwIiB7CisJCWh0dHAuSGFuZGxlRnVuYygiLyIsIHRocmlmdC5OZXdUaHJpZnRIYW5kbGVyRnVuYyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkKKworCQlpZiAqc3NsIHsKKwkJCWVyciA6PSBodHRwLkxpc3RlbkFuZFNlcnZlVExTKGZtdC5TcHJpbnRmKCI6JWQiLCAqcG9ydCksCisJCQkJKmNlcnRQYXRoKyIvc2VydmVyLnBlbSIsICpjZXJ0UGF0aCsiL3NlcnZlci5rZXkiLCBuaWwpCisKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCWZtdC5QcmludGxuKGVycikKKwkJCQlyZXR1cm4KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWh0dHAuTGlzdGVuQW5kU2VydmUoZm10LlNwcmludGYoIjolZCIsICpwb3J0KSwgbmlsKQorCQl9CisJfSBlbHNlIHsKKwkJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCQlpZiBlcnIgPSBzZXJ2ZXIuTGlzdGVuKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwkJZ28gc2VydmVyLkFjY2VwdExvb3AoKQorCQlzZXJ2ZXIuU2VydmUoKQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNmNlNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tbW9uCisKK2ltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCisJImNyeXB0by90bHMiCisJImZsYWciCisJImZtdCIKKwkiZ2VuL3RocmlmdHRlc3QiCisJIm5ldC9odHRwIgorCSJ0aHJpZnQiCispCisKK3ZhciBkZWJ1Z0NsaWVudFByb3RvY29sIGJvb2wKKworZnVuYyBpbml0KCkgeworCWZsYWcuQm9vbFZhcigmZGVidWdDbGllbnRQcm90b2NvbCwgImRlYnVnX2NsaWVudF9wcm90b2NvbCIsIGZhbHNlLCAidHVybiBjbGllbnQgcHJvdG9jb2wgdHJhY2Ugb24iKQorfQorCitmdW5jIFN0YXJ0Q2xpZW50KAorCWhvc3Qgc3RyaW5nLAorCXBvcnQgaW50NjQsCisJZG9tYWluX3NvY2tldCBzdHJpbmcsCisJdHJhbnNwb3J0IHN0cmluZywKKwlwcm90b2NvbCBzdHJpbmcsCisJc3NsIGJvb2wpIChjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQsIGVyciBlcnJvcikgeworCisJaG9zdFBvcnQgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXZhciBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkKKwlzd2l0Y2ggcHJvdG9jb2wgeworCWNhc2UgImNvbXBhY3QiOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCWNhc2UgInNpbXBsZWpzb24iOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKQorCWNhc2UgImpzb24iOgorCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKQorCWNhc2UgImJpbmFyeSI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJZGVmYXVsdDoKKwkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCAlcyIsIHByb3RvY29sKQorCX0KKwlpZiBkZWJ1Z0NsaWVudFByb3RvY29sIHsKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1REZWJ1Z1Byb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnksICJjbGllbnQ6IikKKwl9CisJaWYgc3NsIHsKKwkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUU1NMU29ja2V0KGhvc3RQb3J0LCAmdGxzLkNvbmZpZ3tJbnNlY3VyZVNraXBWZXJpZnk6IHRydWV9KQorCX0gZWxzZSB7CisJCWlmIGRvbWFpbl9zb2NrZXQgIT0gIiIgeworCQkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUU29ja2V0KGRvbWFpbl9zb2NrZXQpCisJCX0gZWxzZSB7CisJCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQoaG9zdFBvcnQpCisJCX0KKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZXJyCisJfQorCXN3aXRjaCB0cmFuc3BvcnQgeworCWNhc2UgImh0dHAiOgorCQlpZiBzc2wgeworCQkJdHIgOj0gJmh0dHAuVHJhbnNwb3J0eworCQkJCVRMU0NsaWVudENvbmZpZzogJnRscy5Db25maWd7SW5zZWN1cmVTa2lwVmVyaWZ5OiB0cnVlfSwKKwkJCX0KKwkJCWNsaWVudCA6PSAmaHR0cC5DbGllbnR7VHJhbnNwb3J0OiB0cn0KKwkJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnMoZm10LlNwcmludGYoImh0dHBzOi8vJXMvIiwgaG9zdFBvcnQpLCB0aHJpZnQuVEh0dHBDbGllbnRPcHRpb25ze0NsaWVudDogY2xpZW50fSkKKwkJCWZtdC5QcmludGxuKGhvc3RQb3J0KQorCQl9IGVsc2UgeworCQkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cFBvc3RDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy8iLCBob3N0UG9ydCkpCisJCX0KKwljYXNlICJmcmFtZWQiOgorCQl0cmFucyA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQorCWNhc2UgImJ1ZmZlcmVkIjoKKwkJdHJhbnMgPSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCA4MTkyKQorCWNhc2UgInpsaWIiOgorCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RabGliVHJhbnNwb3J0KHRyYW5zLCB6bGliLkJlc3RDb21wcmVzc2lvbikKKwljYXNlICIiOgorCQl0cmFucyA9IHRyYW5zCisJZGVmYXVsdDoKKwkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHRyYW5zcG9ydCBzcGVjaWZpZWQgJXMiLCB0cmFuc3BvcnQpCisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBuaWwsIGVycgorCX0KKwlpZiBlcnIgPSB0cmFucy5PcGVuKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBuaWwsIGVycgorCX0KKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJb3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5M2M0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnRzZXJ2ZXJfdGVzdC5nbwpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbW1vbgorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImdlbi90aHJpZnR0ZXN0IgorCSJyZWZsZWN0IgorCSJzeW5jIgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCispCisKK3R5cGUgdGVzdF91bml0IHN0cnVjdCB7CisJaG9zdCAgICAgICAgICBzdHJpbmcKKwlwb3J0ICAgICAgICAgIGludDY0CisJZG9tYWluX3NvY2tldCBzdHJpbmcKKwl0cmFuc3BvcnQgICAgIHN0cmluZworCXByb3RvY29sICAgICAgc3RyaW5nCisJc3NsICAgICAgICAgICBib29sCit9CisKK3ZhciB1bml0cyA9IFtddGVzdF91bml0eworCXsiMTI3LjAuMC4xIiwgOTA5NSwgIiIsICIiLCAiYmluYXJ5IiwgZmFsc2V9LAorCXsiMTI3LjAuMC4xIiwgOTA5MSwgIiIsICIiLCAiY29tcGFjdCIsIGZhbHNlfSwKKwl7IjEyNy4wLjAuMSIsIDkwOTIsICIiLCAiIiwgImJpbmFyeSIsIHRydWV9LAorCXsiMTI3LjAuMC4xIiwgOTA5MywgIiIsICIiLCAiY29tcGFjdCIsIHRydWV9LAorfQorCitmdW5jIFRlc3RBbGxDb25uZWN0aW9uKHQgKnRlc3RpbmcuVCkgeworCWNlcnRQYXRoID0gIi4uLy4uLy4uL2tleXMiCisJd2cgOj0gJnN5bmMuV2FpdEdyb3Vwe30KKwl3Zy5BZGQobGVuKHVuaXRzKSkKKwlmb3IgXywgdW5pdCA6PSByYW5nZSB1bml0cyB7CisJCWdvIGZ1bmModSB0ZXN0X3VuaXQpIHsKKwkJCWRlZmVyIHdnLkRvbmUoKQorCQkJZG9Vbml0KHQsICZ1KQorCQl9KHVuaXQpCisJfQorCXdnLldhaXQoKQorfQorCitmdW5jIGRvVW5pdCh0ICp0ZXN0aW5nLlQsIHVuaXQgKnRlc3RfdW5pdCkgeworCWN0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBjdHJsLkZpbmlzaCgpCisJaGFuZGxlciA6PSBOZXdNb2NrVGhyaWZ0VGVzdChjdHJsKQorCisJcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgZXJyIDo9IEdldFNlcnZlclBhcmFtcyh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wsICIuLi8uLi8uLi9rZXlzIiwgaGFuZGxlcikKKworCXNlcnZlciA6PSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKwlpZiBlcnIgPSBzZXJ2ZXIuTGlzdGVuKCk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5hYmxlIHRvIHN0YXJ0IHNlcnZlcjogJXYiLCBlcnIpCisJCXJldHVybgorCX0KKwlnbyBzZXJ2ZXIuQWNjZXB0TG9vcCgpCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWNsaWVudCwgdHJhbnMsIGVyciA6PSBTdGFydENsaWVudCh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAldiIsIGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zLkNsb3NlKCkKKwljYWxsRXZlcnl0aGluZ1dpdGhNb2NrKHQsIGNsaWVudCwgaGFuZGxlcikKK30KKwordmFyIHJtYXBtYXAgPSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyeworCS00OiBtYXBbaW50MzJdaW50MzJ7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKKwk0OiAgbWFwW2ludDMyXWludDMyezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorfQorCit2YXIgeHhzID0gJnRocmlmdHRlc3QuWHRydWN0eworCVN0cmluZ1RoaW5nOiAiSGVsbG8yIiwKKwlCeXRlVGhpbmc6ICAgNDIsCisJSTMyVGhpbmc6ICAgIDQyNDIsCisJSTY0VGhpbmc6ICAgIDQyNDI0MiwKK30KKwordmFyIHhjZXB0ID0gJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAic29tZSJ9Cit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCisKK2Z1bmMgY2FsbEV2ZXJ5dGhpbmdXaXRoTW9jayh0ICp0ZXN0aW5nLlQsIGNsaWVudCAqdGhyaWZ0dGVzdC5UaHJpZnRUZXN0Q2xpZW50LCBoYW5kbGVyICpNb2NrVGhyaWZ0VGVzdCkgeworCWdvbW9jay5Jbk9yZGVyKAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RWb2lkKGdvbW9jay5BbnkoKSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZyhnb21vY2suQW55KCksICJ0aGluZyIpLlJldHVybigidGhpbmciLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCb29sKGdvbW9jay5BbnkoKSwgdHJ1ZSkuUmV0dXJuKHRydWUsIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJvb2woZ29tb2NrLkFueSgpLCBmYWxzZSkuUmV0dXJuKGZhbHNlLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCeXRlKGdvbW9jay5BbnkoKSwgaW50OCg0MikpLlJldHVybihpbnQ4KDQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STMyKGdvbW9jay5BbnkoKSwgaW50MzIoNDI0MikpLlJldHVybihpbnQzMig0MjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STY0KGdvbW9jay5BbnkoKSwgaW50NjQoNDI0MjQyKSkuUmV0dXJuKGludDY0KDQyNDI0MiksIG5pbCksCisJCS8vIFRPRE86IGFkZCBUZXN0QmluYXJ5KCkKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RG91YmxlKGdvbW9jay5BbnkoKSwgZmxvYXQ2NCg0Mi40MikpLlJldHVybihmbG9hdDY0KDQyLjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RydWN0KGdvbW9jay5BbnkoKSwgJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn0pLlJldHVybigmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TmVzdChnb21vY2suQW55KCksICZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwKGdvbW9jay5BbnkoKSwgbWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfSkuUmV0dXJuKG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZ01hcChnb21vY2suQW55KCksIG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSkuUmV0dXJuKG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U2V0KGdvbW9jay5BbnkoKSwgW11pbnQzMnsxLCAyLCA0Mn0pLlJldHVybihbXWludDMyezEsIDIsIDQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TGlzdChnb21vY2suQW55KCksIFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEVudW0oZ29tb2NrLkFueSgpLCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKS5SZXR1cm4odGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTywgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0VHlwZWRlZihnb21vY2suQW55KCksIHRocmlmdHRlc3QuVXNlcklkKDQyKSkuUmV0dXJuKHRocmlmdHRlc3QuVXNlcklkKDQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwTWFwKGdvbW9jay5BbnkoKSwgaW50MzIoNDIpKS5SZXR1cm4ocm1hcG1hcCwgbmlsKSwKKwkJLy8gVE9ETzogbm90IHRlc3RpbmcgaW5zYW5pdHkKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGkoZ29tb2NrLkFueSgpLCBpbnQ4KDQyKSwgaW50MzIoNDI0MiksIGludDY0KDQyNDI0MiksIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpLlJldHVybih4eHMsIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEV4Y2VwdGlvbihnb21vY2suQW55KCksICJzb21lIikuUmV0dXJuKHhjZXB0KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgIlRFeGNlcHRpb24iKS5SZXR1cm4oZXJyb3JzLk5ldygiSnVzdCByYW5kb20gZXhjZXB0aW9uIikpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbihnb21vY2suQW55KCksICJYY2VwdGlvbiIsICJpZ25vcmVtZSIpLlJldHVybihuaWwsICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlRoaXMgaXMgYW4gWGNlcHRpb24ifSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE11bHRpRXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgIlhjZXB0aW9uMiIsICJpZ25vcmVtZSIpLlJldHVybihuaWwsICZ0aHJpZnR0ZXN0LlhjZXB0aW9uMntFcnJvckNvZGU6IDIwMDIsIFN0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiJ9fSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE9uZXdheShnb21vY2suQW55KCksIGludDMyKDIpKS5SZXR1cm4obmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZChnb21vY2suQW55KCkpLAorCSkKKwl2YXIgZXJyIGVycm9yCisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAlcyIsIGVycikKKwl9CisKKwl0aGluZywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0aGluZyIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmcoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgdGhpbmcgIT0gInRoaW5nIiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJpbmcoKSByZXN1bHQsIGV4cGVjdGVkICd0aGluZycgZ290ICclcycgIiwgdGhpbmcpCisJfQorCisJYmwsIGVyciA6PSBjbGllbnQuVGVzdEJvb2woZGVmYXVsdEN0eCwgdHJ1ZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgIWJsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEJvb2woKSByZXN1bHQgZXhwZWN0ZWQgdHJ1ZSwgZ290ICV2ICIsIGJsKQorCX0KKwlibCwgZXJyID0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIGZhbHNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiBibCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIGZhbHNlLCBnb3QgJXYgIiwgYmwpCisJfQorCisJYiwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCA0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgYiAhPSA0MiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RCeXRlKCkgcmVzdWx0IGV4cGVjdGVkIDQyLCBnb3QgJWQgIiwgYikKKwl9CisKKwlpMzIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCA0MjQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIGkzMiAhPSA0MjQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQorCX0KKworCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIDQyNDI0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEk2NCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiBpNjQgIT0gNDI0MjQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEk2NCgpIHJlc3VsdCBleHBlY3RlZCA0MjQyNDIsIGdvdCAlZCAiLCBpNjQpCisJfQorCisJZCwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKGRlZmF1bHRDdHgsIDQyLjQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RG91YmxlKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIGQgIT0gNDIuNDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0RG91YmxlKCkgcmVzdWx0IGV4cGVjdGVkIDQyLjQyLCBnb3QgJWYgIiwgZCkKKwl9CisKKwkvLyBUT0RPOiBhZGQgVGVzdEJpbmFyeSgpIGNhbGwKKworCXhzIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwl4cy5TdHJpbmdUaGluZyA9ICJ0aGluZyIKKwl4cy5CeXRlVGhpbmcgPSA0MgorCXhzLkkzMlRoaW5nID0gNDI0MgorCXhzLkk2NFRoaW5nID0gNDI0MjQyCisJeHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB4cykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cnVjdCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAqeHMgIT0gKnhzcmV0IHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cnVjdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHMsIHhzcmV0KQorCX0KKworCXgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCisJeDIuU3RydWN0VGhpbmcgPSB4cworCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIHgyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TmVzdCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoeDIsIHgycmV0KSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3ROZXN0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4MiwgeDJyZXQpCisJfQorCisJbSA6PSBtYXBbaW50MzJdaW50MzJ7MTogMiwgMzogNCwgNTogNDJ9CisJbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0TWFwKGRlZmF1bHRDdHgsIG0pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXAoKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKG0sIG1yZXQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE1hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbSwgbXJldCkKKwl9CisKKwlzbSA6PSBtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0KKwlzbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKGRlZmF1bHRDdHgsIHNtKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nTWFwKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChzbSwgc21yZXQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZ01hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgc20sIHNtcmV0KQorCX0KKworCXMgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgcykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwkvLyBTZXRzIGNhbiBiZSBpbiBhbnkgb3JkZXIsIGJ1dCBHbyBzbGljZXMgYXJlIG9yZGVyZWQsIHNvIHJlZmxlY3QuRGVlcEVxdWFsIHdvbid0IHdvcmsuCisJc3RlbXAgOj0gbWFwW2ludDMyXXN0cnVjdHt9e30KKwlmb3IgXywgdmFsIDo9IHJhbmdlIHMgeworCQlzdGVtcFt2YWxdID0gc3RydWN0e317fQorCX0KKwlmb3IgXywgdmFsIDo9IHJhbmdlIHNyZXQgeworCQlpZiBfLCBvayA6PSBzdGVtcFt2YWxdOyAhb2sgeworCQkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFNldCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgcywgc3JldCkKKwkJfQorCX0KKworCWwgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChsLCBscmV0KSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RMaXN0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCX0KKworCWVyZXQsIGVyciA6PSBjbGllbnQuVGVzdEVudW0oZGVmYXVsdEN0eCwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEVudW0oKSBjYWxsOiAlcyIsIGVycikKKwl9CisJaWYgZXJldCAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCisJfQorCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogJXMiLCBlcnIpCisJfQorCWlmIHRyZXQgIT0gdGhyaWZ0dGVzdC5Vc2VySWQoNDIpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFR5cGVkZWYoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuVXNlcklkKDQyKSwgdHJldCkKKwl9CisKKwltYXBtYXAsIGVyciA6PSBjbGllbnQuVGVzdE1hcE1hcChkZWZhdWx0Q3R4LCA0MikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcG1hcCgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobWFwbWFwLCBybWFwbWFwKSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNYXBtYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHJtYXBtYXAsIG1hcG1hcCkKKwl9CisKKwl4eHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdE11bHRpKGRlZmF1bHRDdHgsIDQyLCA0MjQyLCA0MjQyNDIsIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNdWx0aSgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKwlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoeHhzLCB4eHNyZXQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4eHMsIHh4c3JldCkKKwl9CisKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAic29tZSIpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3JmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RFeGNlcHRpb24oKSBjYWxsIikKKwl9CisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVyciwgeGNlcHQpIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeGNlcHQsIGVycikKKwl9CisKKwkvLyBUT0RPOiBjb25uZWN0aW9uIGlzIGJlaW5nIGNsb3NlZCBvbiB0aGlzCisJZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlRFeGNlcHRpb24iKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yKCJleHBlY3RlZCBleGNlcHRpb24gZ290IG5pbCIpCisJfSBlbHNlIGlmIHRleCwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsgIW9rIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCBBcHBsaWNhdGlvbkVycm9yLCBnb3QgJVQgIiwgZXJyKQorCX0gZWxzZSBpZiB0ZXguVHlwZUlkKCkgIT0gdGhyaWZ0LklOVEVSTkFMX0VSUk9SIHsKKwkJdC5FcnJvcmYoImV4cGVjdGVkIGludGVybmFsX2Vycm9yIGdvdCAldiIsIHRleC5UeXBlSWQoKSkKKwl9CisKKwlpZ24sIGVyciA6PSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIsICJpZ25vcmVtZSIpCisJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKKwkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCisJfQorCWlmICFyZWZsZWN0LkRlZXBFcXVhbChlcnIsICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlRoaXMgaXMgYW4gWGNlcHRpb24ifSkgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQorCX0KKworCWlnbiwgZXJyID0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikKKwlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKKwl9CisJZXhwZWN0aW5nIDo9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9uMntFcnJvckNvZGU6IDIwMDIsIFN0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiJ9fQorCisJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGVyciwgZXhwZWN0aW5nKSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCisJfQorCisJZXJyID0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICVzIiwgZXJyKQorCX0KKworCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAlcyIsIGVycikKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL2NvbnRleHRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjRkYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL2NvbnRleHRfdGVzdC5nbwpAQCAtMCwwICsxLDk4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tbW9uCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKwkibmV0IgorCSJuZXQvaHR0cCIKKwkibmV0L3VybCIKKwkib3MiCisJInN5c2NhbGwiCisJInRlc3RpbmciCisJInRocmlmdCIKKwkidGltZSIKKykKKwordHlwZSBzbG93SHR0cEhhbmRsZXIgc3RydWN0e30KKworZnVuYyAoc2xvd0h0dHBIYW5kbGVyKSBTZXJ2ZUhUVFAodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKwl0aW1lLlNsZWVwKDEgKiB0aW1lLlNlY29uZCkKK30KKworZnVuYyBUZXN0SHR0cENvbnRleHRUaW1lb3V0KHQgKnRlc3RpbmcuVCkgeworCWNlcnRQYXRoID0gIi4uLy4uLy4uL2tleXMiCisKKwl1bml0IDo9IHRlc3RfdW5pdHsiMTI3LjAuMC4xIiwgOTA5NiwgIiIsICJodHRwIiwgImJpbmFyeSIsIGZhbHNlfQorCisJc2VydmVyIDo9ICZodHRwLlNlcnZlcntBZGRyOiB1bml0Lmhvc3QgKyBmbXQuU3ByaW50ZigiOiVkIiwgdW5pdC5wb3J0KSwgSGFuZGxlcjogc2xvd0h0dHBIYW5kbGVye319CisJZ28gc2VydmVyLkxpc3RlbkFuZFNlcnZlKCkKKworCWNsaWVudCwgdHJhbnMsIGVyciA6PSBTdGFydENsaWVudCh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAldiIsIGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zLkNsb3NlKCkKKworCXVud3JhcEVyciA6PSBmdW5jKGVyciBlcnJvcikgZXJyb3IgeworCQlmb3IgeworCQkJc3dpdGNoIGVyci4odHlwZSkgeworCQkJY2FzZSB0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKwkJCQllcnIgPSBlcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKS5FcnIoKQorCQkJY2FzZSAqdXJsLkVycm9yOgorCQkJCWVyciA9IGVyci4oKnVybC5FcnJvcikuRXJyCisJCQljYXNlICpuZXQuT3BFcnJvcjoKKwkJCQllcnIgPSBlcnIuKCpuZXQuT3BFcnJvcikuRXJyCisJCQljYXNlICpvcy5TeXNjYWxsRXJyb3I6CisJCQkJZXJyID0gZXJyLigqb3MuU3lzY2FsbEVycm9yKS5FcnIKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQl9CisJfQorCisJc2VydmVyU3RhcnR1cERlYWRsaW5lIDo9IHRpbWUuTm93KCkuQWRkKDUgKiB0aW1lLlNlY29uZCkKKwlmb3IgeworCQljdHgsIF8gOj0gY29udGV4dC5XaXRoVGltZW91dChjb250ZXh0LkJhY2tncm91bmQoKSwgNTAqdGltZS5NaWxsaXNlY29uZCkKKwkJZXJyID0gY2xpZW50LlRlc3RWb2lkKGN0eCkKKwkJZXJyID0gdW53cmFwRXJyKGVycikKKwkJaWYgZXJyICE9IHN5c2NhbGwuRUNPTk5SRUZVU0VEIHx8IHRpbWUuTm93KCkuQWZ0ZXIoc2VydmVyU3RhcnR1cERlYWRsaW5lKSB7CisJCQlicmVhaworCQl9CisJCXRpbWUuU2xlZXAodGltZS5NaWxsaXNlY29uZCkKKwl9CisKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5FcnJvcmYoIlJlcXVlc3QgY29tcGxldGVkIChzaG91bGQgaGF2ZSB0aW1lZCBvdXQpIikKKwkJcmV0dXJuCisJfQorCisJLy8gV2UndmUgZ290IHRvIHN3aXRjaCBvbiBgZXJyLkVycm9yKClgIGhlcmUgc2luY2UgZ28xLjcgZG9lc24ndCBwcm9wZXJseSByZXR1cm4KKwkvLyBgY29udGV4dC5EZWFkbGluZUV4Y2VlZGVkYCBlcnJvciBhbmQgYGh0dHAuZXJyUmVxdWVzdENhbmNlbGVkYCBpcyBub3QgZXhwb3J0ZWQuCisJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9nb2xhbmcvZ28vaXNzdWVzLzE3NzExCisJc3dpdGNoIGVyci5FcnJvcigpIHsKKwljYXNlIGNvbnRleHQuRGVhZGxpbmVFeGNlZWRlZC5FcnJvcigpLCAibmV0L2h0dHA6IHJlcXVlc3QgY2FuY2VsZWQiOgorCQkvLyBFeHBlY3RlZCBlcnJvcgorCWRlZmF1bHQ6CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yOiAlcyIsIGVycikKKwl9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjJkMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbwpAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbW1vbgorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9oZXgiCisJImVycm9ycyIKKwkiZm10IgorCS4gImdlbi90aHJpZnR0ZXN0IgorCSJ0aW1lIgorKQorCit2YXIgUHJpbnRpbmdIYW5kbGVyID0gJnByaW50aW5nSGFuZGxlcnt9CisKK3R5cGUgcHJpbnRpbmdIYW5kbGVyIHN0cnVjdHt9CisKKy8vIFByaW50cyAidGVzdFZvaWQoKSIgYW5kIHJldHVybnMgbm90aGluZy4KK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCWZtdC5QcmludGxuKCJ0ZXN0Vm9pZCgpIikKKwlyZXR1cm4gbmlsCit9CisKKy8vIFByaW50cyAndGVzdFN0cmluZygiJXMiKScgd2l0aCB0aGluZyBhcyAnJXMnCisvLyBAcGFyYW0gc3RyaW5nIHRoaW5nIC0gdGhlIHN0cmluZyB0byBwcmludAorLy8gQHJldHVybiBzdHJpbmcgLSByZXR1cm5zIHRoZSBzdHJpbmcgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEJvb2woIiV0IiknIHdpdGggdGhpbmcgYXMgJ3RydWUnIG9yICdmYWxzZScKKy8vIEBwYXJhbSBib29sIHRoaW5nIC0gdGhlIGJvb2wgdG8gcHJpbnQKKy8vIEByZXR1cm4gYm9vbCAtIHJldHVybnMgdGhlIGJvb2wgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Qm9vbChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBib29sKSAociBib29sLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0Qm9vbCgldClcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEJ5dGUoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworLy8gQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgYnl0ZSB0byBwcmludAorLy8gQHJldHVybiBieXRlIC0gcmV0dXJucyB0aGUgYnl0ZSAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCeXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RCeXRlKCVkKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0STMyKCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKy8vIEBwYXJhbSBpMzIgdGhpbmcgLSB0aGUgaTMyIHRvIHByaW50CisvLyBAcmV0dXJuIGkzMiAtIHJldHVybnMgdGhlIGkzMiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0STMyKCVkKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0STY0KCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKy8vIEBwYXJhbSBpNjQgdGhpbmcgLSB0aGUgaTY0IHRvIHByaW50CisvLyBAcmV0dXJuIGk2NCAtIHJldHVybnMgdGhlIGk2NCAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0STY0KCVkKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0RG91YmxlKCIlZiIpJyB3aXRoIHRoaW5nIGFzICclZicKKy8vIEBwYXJhbSBkb3VibGUgdGhpbmcgLSB0aGUgZG91YmxlIHRvIHByaW50CisvLyBAcmV0dXJuIGRvdWJsZSAtIHJldHVybnMgdGhlIGRvdWJsZSAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3REb3VibGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdERvdWJsZSglZilcbiIsIHRoaW5nKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEJpbmFyeSgiJXMiKScgd2hlcmUgJyVzJyBpcyBhIGhleC1mb3JtYXR0ZWQgc3RyaW5nIG9mIHRoaW5nJ3MgZGF0YQorLy8gQHBhcmFtIFtdYnl0ZSB0aGluZyAtIHRoZSBiaW5hcnkgdG8gcHJpbnQKKy8vIEByZXR1cm4gW11ieXRlIC0gcmV0dXJucyB0aGUgYmluYXJ5ICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEJpbmFyeShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdEJpbmFyeSglcylcbiIsIGhleC5FbmNvZGVUb1N0cmluZyh0aGluZykpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0U3RydWN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMKKy8vIEBwYXJhbSBYdHJ1Y3QgdGhpbmcgLSB0aGUgWHRydWN0IHRvIHByaW50CisvLyBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgdGhlIFh0cnVjdCAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJ1Y3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgKlh0cnVjdCkgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdFN0cnVjdCh7XCIlc1wiLCAlZCwgJWQsICVkfSlcbiIsIHRoaW5nLlN0cmluZ1RoaW5nLCB0aGluZy5CeXRlVGhpbmcsIHRoaW5nLkkzMlRoaW5nLCB0aGluZy5JNjRUaGluZykKKwlyZXR1cm4gdGhpbmcsIGVycgorfQorCisvLyBQcmludHMgJ3Rlc3ROZXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mIHRoZSBuZXN0ZWQgc3RydWN0CisvLyBAcGFyYW0gWHRydWN0MiB0aGluZyAtIHRoZSBYdHJ1Y3QyIHRvIHByaW50CisvLyBAcmV0dXJuIFh0cnVjdDIgLSByZXR1cm5zIHRoZSBYdHJ1Y3QyICd0aGluZycKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gVGhpbmcKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE5lc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgbmVzdCAqWHRydWN0MikgKHIgKlh0cnVjdDIsIGVyciBlcnJvcikgeworCXRoaW5nIDo9IG5lc3QuU3RydWN0VGhpbmcKKwlmbXQuUHJpbnRmKCJ0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJWR9LCAlZH0pXG4iLCBuZXN0LkJ5dGVUaGluZywgdGhpbmcuU3RyaW5nVGhpbmcsIHRoaW5nLkJ5dGVUaGluZywgdGhpbmcuSTMyVGhpbmcsIHRoaW5nLkk2NFRoaW5nLCBuZXN0LkkzMlRoaW5nKQorCXJldHVybiBuZXN0LCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0TWFwKCJ7JXMiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCisvLyAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisvLyBAcGFyYW0gbWFwPGkzMixpMzI+IHRoaW5nIC0gdGhlIG1hcDxpMzIsaTMyPiB0byBwcmludAorLy8gQHJldHVybiBtYXA8aTMyLGkzMj4gLSByZXR1cm5zIHRoZSBtYXA8aTMyLGkzMj4gJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0TWFwKHsiKQorCWZpcnN0IDo9IHRydWUKKwlmb3IgaywgdiA6PSByYW5nZSB0aGluZyB7CisJCWlmIGZpcnN0IHsKKwkJCWZpcnN0ID0gZmFsc2UKKwkJfSBlbHNlIHsKKwkJCWZtdC5QcmludGYoIiwgIikKKwkJfQorCQlmbXQuUHJpbnRmKCIlZCA9PiAlZCIsIGssIHYpCisJfQorCWZtdC5QcmludGYoIn0pXG4iKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdFN0cmluZ01hcCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgJ2tleSA9PiB2YWx1ZScgcGFpcnMKKy8vICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKy8vIEBwYXJhbSBtYXA8c3RyaW5nLHN0cmluZz4gdGhpbmcgLSB0aGUgbWFwPHN0cmluZyxzdHJpbmc+IHRvIHByaW50CisvLyBAcmV0dXJuIG1hcDxzdHJpbmcsc3RyaW5nPiAtIHJldHVybnMgdGhlIG1hcDxzdHJpbmcsc3RyaW5nPiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJpbmdNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0U3RyaW5nTWFwKHsiKQorCWZpcnN0IDo9IHRydWUKKwlmb3IgaywgdiA6PSByYW5nZSB0aGluZyB7CisJCWlmIGZpcnN0IHsKKwkJCWZpcnN0ID0gZmFsc2UKKwkJfSBlbHNlIHsKKwkJCWZtdC5QcmludGYoIiwgIikKKwkJfQorCQlmbXQuUHJpbnRmKCIlcyA9PiAlcyIsIGssIHYpCisJfQorCWZtdC5QcmludGYoIn0pXG4iKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdFNldCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCisvLyAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisvLyBAcGFyYW0gc2V0PGkzMj4gdGhpbmcgLSB0aGUgc2V0PGkzMj4gdG8gcHJpbnQKKy8vIEByZXR1cm4gc2V0PGkzMj4gLSByZXR1cm5zIHRoZSBzZXQ8aTMyPiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTZXQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdFNldCh7IikKKwlmaXJzdCA6PSB0cnVlCisJZm9yIGssIF8gOj0gcmFuZ2UgdGhpbmcgeworCQlpZiBmaXJzdCB7CisJCQlmaXJzdCA9IGZhbHNlCisJCX0gZWxzZSB7CisJCQlmbXQuUHJpbnRmKCIsICIpCisJCX0KKwkJZm10LlByaW50ZigiJWQiLCBrKQorCX0KKwlmbXQuUHJpbnRmKCJ9KVxuIikKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RMaXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKKy8vICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKy8vIEBwYXJhbSBsaXN0PGkzMj4gdGhpbmcgLSB0aGUgbGlzdDxpMzI+IHRvIHByaW50CisvLyBAcmV0dXJuIGxpc3Q8aTMyPiAtIHJldHVybnMgdGhlIGxpc3Q8aTMyPiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RMaXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RMaXN0KHsiKQorCWZvciBpLCB2IDo9IHJhbmdlIHRoaW5nIHsKKwkJaWYgaSAhPSAwIHsKKwkJCWZtdC5QcmludGYoIiwgIikKKwkJfQorCQlmbXQuUHJpbnRmKCIlZCIsIHYpCisJfQorCWZtdC5QcmludGYoIn0pXG4iKQorCXJldHVybiB0aGluZywgbmlsCit9CisKKy8vIFByaW50cyAndGVzdEVudW0oIiVkIiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGl0J3MgbnVtZXJpYyB2YWx1ZQorLy8gQHBhcmFtIE51bWJlcnogdGhpbmcgLSB0aGUgTnVtYmVyeiB0byBwcmludAorLy8gQHJldHVybiBOdW1iZXJ6IC0gcmV0dXJucyB0aGUgTnVtYmVyeiAndGhpbmcnCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAtIFRoaW5nCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFbnVtKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIE51bWJlcnopIChyIE51bWJlcnosIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RFbnVtKCVkKVxuIiwgdGhpbmcpCisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworLy8gUHJpbnRzICd0ZXN0VHlwZWRlZigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisvLyBAcGFyYW0gVXNlcklkIHRoaW5nIC0gdGhlIFVzZXJJZCB0byBwcmludAorLy8gQHJldHVybiBVc2VySWQgLSByZXR1cm5zIHRoZSBVc2VySWQgJ3RoaW5nJworLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBUaGluZworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0VHlwZWRlZihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBVc2VySWQpIChyIFVzZXJJZCwgZXJyIGVycm9yKSB7CisJZm10LlByaW50ZigidGVzdFR5cGVkZWYoJWQpXG4iLCB0aGluZykKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCisvLyBQcmludHMgJ3Rlc3RNYXBNYXAoIiVkIiknIHdpdGggaGVsbG8gYXMgJyVkJworLy8gQHBhcmFtIGkzMiBoZWxsbyAtIHRoZSBpMzIgdG8gcHJpbnQKKy8vIEByZXR1cm4gbWFwPGkzMixtYXA8aTMyLGkzMj4+IC0gcmV0dXJucyBhIGRpY3Rpb25hcnkgd2l0aCB0aGVzZSB2YWx1ZXM6CisvLyAgIHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMiA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBIZWxsbworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TWFwTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIGhlbGxvIGludDMyKSAociBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnRmKCJ0ZXN0TWFwTWFwKCVkKVxuIiwgaGVsbG8pCisKKwlyID0gbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMnsKKwkJLTQ6IG1hcFtpbnQzMl1pbnQzMnstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorCQk0OiAgbWFwW2ludDMyXWludDMyezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorCX0KKwlyZXR1cm4KK30KKworLy8gU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisvLworLy8gQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisvLyAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisvLyAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisvLyAgICAgICAgICB9LAorLy8gICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorLy8gICB9CisvLyBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gQXJndW1lbnQKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEluc2FuaXR5KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZ3VtZW50ICpJbnNhbml0eSkgKHIgbWFwW1VzZXJJZF1tYXBbTnVtYmVyel0qSW5zYW5pdHksIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RJbnNhbml0eSgpXG4iKQorCXIgPSBtYWtlKG1hcFtVc2VySWRdbWFwW051bWJlcnpdKkluc2FuaXR5KQorCXJbMV0gPSBtYXBbTnVtYmVyel0qSW5zYW5pdHl7CisJCTI6IGFyZ3VtZW50LAorCQkzOiBhcmd1bWVudCwKKwl9CisJclsyXSA9IG1hcFtOdW1iZXJ6XSpJbnNhbml0eXsKKwkJNjogTmV3SW5zYW5pdHkoKSwKKwl9CisJcmV0dXJuCit9CisKKy8vIFByaW50cyAndGVzdE11bHRpKCknCisvLyBAcGFyYW0gYnl0ZSBhcmcwIC0KKy8vIEBwYXJhbSBpMzIgYXJnMSAtCisvLyBAcGFyYW0gaTY0IGFyZzIgLQorLy8gQHBhcmFtIG1hcDxpMTYsIHN0cmluZz4gYXJnMyAtCisvLyBAcGFyYW0gTnVtYmVyeiBhcmc0IC0KKy8vIEBwYXJhbSBVc2VySWQgYXJnNSAtCisvLyBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgYW4gWHRydWN0IHdpdGggU3RyaW5nVGhpbmcgPSAiSGVsbG8yLCBCeXRlVGhpbmcgPSBhcmcwLCBJMzJUaGluZyA9IGFyZzEKKy8vICAgIGFuZCBJNjRUaGluZyA9IGFyZzIKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gQXJnMAorLy8gIC0gQXJnMQorLy8gIC0gQXJnMgorLy8gIC0gQXJnMworLy8gIC0gQXJnNAorLy8gIC0gQXJnNQorZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TXVsdGkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgTnVtYmVyeiwgYXJnNSBVc2VySWQpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RNdWx0aSgpXG4iKQorCXIgPSBOZXdYdHJ1Y3QoKQorCisJci5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJci5CeXRlVGhpbmcgPSBhcmcwCisJci5JMzJUaGluZyA9IGFyZzEKKwlyLkk2NFRoaW5nID0gYXJnMgorCXJldHVybgorfQorCisvLyBQcmludCAndGVzdEV4Y2VwdGlvbiglcyknIHdpdGggYXJnIGFzICclcycKKy8vIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisvLyBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSBhcmcKKy8vIGVsc2VuIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgorLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gQXJnCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIHN0cmluZykgKGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcpCisJc3dpdGNoIGFyZyB7CisJY2FzZSAiWGNlcHRpb24iOgorCQllIDo9IE5ld1hjZXB0aW9uKCkKKwkJZS5FcnJvckNvZGUgPSAxMDAxCisJCWUuTWVzc2FnZSA9IGFyZworCQlyZXR1cm4gZQorCWNhc2UgIlRFeGNlcHRpb24iOgorCQlyZXR1cm4gZXJyb3JzLk5ldygiSnVzdCBURXhjZXB0aW9uIikKKwl9CisJcmV0dXJuCit9CisKKy8vIFByaW50ICd0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKScgd2l0aCBhcmcwIGFzICclcycgYW5kIGFyZzEgYXMgJyVzJworLy8gQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKy8vIGlmIGFyZzAgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKy8vIGVsc2VuIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIgdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKy8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisvLyBAcmV0dXJuIFh0cnVjdCAtIGFuIFh0cnVjdCB3aXRoIFN0cmluZ1RoaW5nID0gYXJnMQorLy8KKy8vIFBhcmFtZXRlcnM6CisvLyAgLSBBcmcwCisvLyAgLSBBcmcxCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLCBhcmcxKQorCXN3aXRjaCBhcmcwIHsKKworCWNhc2UgIlhjZXB0aW9uIjoKKwkJZSA6PSBOZXdYY2VwdGlvbigpCisJCWUuRXJyb3JDb2RlID0gMTAwMQorCQllLk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKwkJcmV0dXJuIG5pbCwgZQorCWNhc2UgIlhjZXB0aW9uMiI6CisJCWUgOj0gTmV3WGNlcHRpb24yKCkKKwkJZS5FcnJvckNvZGUgPSAyMDAyCisJCWUuU3RydWN0VGhpbmcgPSBOZXdYdHJ1Y3QoKQorCQllLlN0cnVjdFRoaW5nLlN0cmluZ1RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorCQlyZXR1cm4gbmlsLCBlCisJZGVmYXVsdDoKKwkJciA9IE5ld1h0cnVjdCgpCisJCXIuU3RyaW5nVGhpbmcgPSBhcmcxCisJCXJldHVybgorCX0KK30KKworLy8gUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLicgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisvLyBzbGVlcCAnc2Vjb25kc1RvU2xlZXAnCisvLyBQcmludCAndGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchJyB3aXRoIHNlY29uZHNUb1NsZWVwIGFzICclZCcKKy8vIEBwYXJhbSBpMzIgc2Vjb25kc1RvU2xlZXAgLSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gc2xlZXAKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gIC0gU2Vjb25kc1RvU2xlZXAKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE9uZXdheShjdHggY29udGV4dC5Db250ZXh0LCBzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLlxuIiwgc2Vjb25kc1RvU2xlZXApCisJdGltZS5TbGVlcCh0aW1lLlNlY29uZCAqIHRpbWUuRHVyYXRpb24oc2Vjb25kc1RvU2xlZXApKQorCWZtdC5QcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2Vjb25kc1RvU2xlZXApCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vc2VydmVyLmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL3NlcnZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWM0NDAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL3NlcnZlci5nbwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbW1vbgorCitpbXBvcnQgKAorCSJjb21wcmVzcy96bGliIgorCSJjcnlwdG8vdGxzIgorCSJmbGFnIgorCSJmbXQiCisJImdlbi90aHJpZnR0ZXN0IgorCSJ0aHJpZnQiCispCisKK3ZhciAoCisJZGVidWdTZXJ2ZXJQcm90b2NvbCBib29sCisJY2VydFBhdGggICAgICAgICAgICBzdHJpbmcKKykKKworZnVuYyBpbml0KCkgeworCWZsYWcuQm9vbFZhcigmZGVidWdTZXJ2ZXJQcm90b2NvbCwgImRlYnVnX3NlcnZlcl9wcm90b2NvbCIsIGZhbHNlLCAidHVybiBzZXJ2ZXIgcHJvdG9jb2wgdHJhY2Ugb24iKQorfQorCitmdW5jIEdldFNlcnZlclBhcmFtcygKKwlob3N0IHN0cmluZywKKwlwb3J0IGludDY0LAorCWRvbWFpbl9zb2NrZXQgc3RyaW5nLAorCXRyYW5zcG9ydCBzdHJpbmcsCisJcHJvdG9jb2wgc3RyaW5nLAorCXNzbCBib29sLAorCWNlcnRQYXRoIHN0cmluZywKKwloYW5kbGVyIHRocmlmdHRlc3QuVGhyaWZ0VGVzdCkgKHRocmlmdC5UUHJvY2Vzc29yLCB0aHJpZnQuVFNlcnZlclRyYW5zcG9ydCwgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5LCB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSwgZXJyb3IpIHsKKworCXZhciBlcnIgZXJyb3IKKwlob3N0UG9ydCA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQorCisJdmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeQorCXN3aXRjaCBwcm90b2NvbCB7CisJY2FzZSAiY29tcGFjdCI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAic2ltcGxlanNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAianNvbiI6CisJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpCisJY2FzZSAiYmluYXJ5IjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwlkZWZhdWx0OgorCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCAlcyIsIHByb3RvY29sKQorCX0KKwlpZiBkZWJ1Z1NlcnZlclByb3RvY29sIHsKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1REZWJ1Z1Byb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnksICJzZXJ2ZXI6IikKKwl9CisKKwl2YXIgc2VydmVyVHJhbnNwb3J0IHRocmlmdC5UU2VydmVyVHJhbnNwb3J0CisJaWYgc3NsIHsKKwkJY2ZnIDo9IG5ldyh0bHMuQ29uZmlnKQorCQlpZiBjZXJ0LCBlcnIgOj0gdGxzLkxvYWRYNTA5S2V5UGFpcihjZXJ0UGF0aCsiL3NlcnZlci5jcnQiLCBjZXJ0UGF0aCsiL3NlcnZlci5rZXkiKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBlcnIKKwkJfSBlbHNlIHsKKwkJCWNmZy5DZXJ0aWZpY2F0ZXMgPSBhcHBlbmQoY2ZnLkNlcnRpZmljYXRlcywgY2VydCkKKwkJfQorCQlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU1NMU2VydmVyU29ja2V0KGhvc3RQb3J0LCBjZmcpCisJfSBlbHNlIHsKKwkJaWYgZG9tYWluX3NvY2tldCAhPSAiIiB7CisJCQlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0KGRvbWFpbl9zb2NrZXQpCisJCX0gZWxzZSB7CisJCQlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0KGhvc3RQb3J0KQorCQl9CisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBlcnIKKwl9CisKKwl2YXIgdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnkKKworCXN3aXRjaCB0cmFuc3BvcnQgeworCWNhc2UgImh0dHAiOgorCQkvLyB0aGVyZSBpcyBubyBzdWNoIGZhY3RvcnksIGFuZCB3ZSBkb24ndCBuZWVkIGFueQorCQl0cmFuc3BvcnRGYWN0b3J5ID0gbmlsCisJY2FzZSAiZnJhbWVkIjoKKwkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0RmFjdG9yeSkKKwljYXNlICJidWZmZXJlZCI6CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4MTkyKQorCWNhc2UgInpsaWIiOgorCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RabGliVHJhbnNwb3J0RmFjdG9yeSh6bGliLkJlc3RDb21wcmVzc2lvbikKKwljYXNlICIiOgorCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwlkZWZhdWx0OgorCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHRyYW5zcG9ydCBzcGVjaWZpZWQgJXMiLCB0cmFuc3BvcnQpCisJfQorCXByb2Nlc3NvciA6PSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RQcm9jZXNzb3IoaGFuZGxlcikKKworCXJldHVybiBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBuaWwKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk0NjNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL3NpbXBsZV9oYW5kbGVyLmdvCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tbW9uCisKK2ltcG9ydCAoCisJImVycm9ycyIKKwkuICJnZW4vdGhyaWZ0dGVzdCIKKwkidGltZSIKKykKKwordmFyIFNpbXBsZUhhbmRsZXIgPSAmc2ltcGxlSGFuZGxlcnt9CisKK3R5cGUgc2ltcGxlSGFuZGxlciBzdHJ1Y3R7fQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0Vm9pZCgpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTdHJpbmcodGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RCb29sKHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0Qnl0ZSh0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0STMyKHRoaW5nIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEk2NCh0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3REb3VibGUodGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdEJpbmFyeSh0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdFN0cnVjdCh0aGluZyAqWHRydWN0KSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gciwgZXJyCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3ROZXN0KG5lc3QgKlh0cnVjdDIpIChyICpYdHJ1Y3QyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gbmVzdCwgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RNYXAodGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTdHJpbmdNYXAodGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0U2V0KHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RMaXN0KHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RFbnVtKHRoaW5nIE51bWJlcnopIChyIE51bWJlcnosIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RUeXBlZGVmKHRoaW5nIFVzZXJJZCkgKHIgVXNlcklkLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0TWFwTWFwKGhlbGxvIGludDMyKSAociBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKKworCXIgPSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyeworCQktNDogbWFwW2ludDMyXWludDMyey00OiAtNCwgLTM6IC0zLCAtMjogLTIsIC0xOiAtMX0sCisJCTQ6ICBtYXBbaW50MzJdaW50MzJ7NDogNCwgMzogMywgMjogMiwgMTogMX0sCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0SW5zYW5pdHkoYXJndW1lbnQgKkluc2FuaXR5KSAociBtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSwgZXJyIGVycm9yKSB7CisJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygiTm8gSW5zYW5pdHkiKQorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0TXVsdGkoYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgTnVtYmVyeiwgYXJnNSBVc2VySWQpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworCXIgPSBOZXdYdHJ1Y3QoKQorCisJci5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJci5CeXRlVGhpbmcgPSBhcmcwCisJci5JMzJUaGluZyA9IGFyZzEKKwlyLkk2NFRoaW5nID0gYXJnMgorCXJldHVybgorfQorCitmdW5jIChwICpzaW1wbGVIYW5kbGVyKSBUZXN0RXhjZXB0aW9uKGFyZyBzdHJpbmcpIChlcnIgZXJyb3IpIHsKKwlzd2l0Y2ggYXJnIHsKKwljYXNlICJYY2VwdGlvbiI6CisJCWUgOj0gTmV3WGNlcHRpb24oKQorCQllLkVycm9yQ29kZSA9IDEwMDEKKwkJZS5NZXNzYWdlID0gYXJnCisJCXJldHVybiBlCisJY2FzZSAiVEV4Y2VwdGlvbiI6CisJCXJldHVybiBlcnJvcnMuTmV3KCJKdXN0IFRFeGNlcHRpb24iKQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CisJc3dpdGNoIGFyZzAgeworCisJY2FzZSAiWGNlcHRpb24iOgorCQllIDo9IE5ld1hjZXB0aW9uKCkKKwkJZS5FcnJvckNvZGUgPSAxMDAxCisJCWUuTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorCQlyZXR1cm4gbmlsLCBlCisJY2FzZSAiWGNlcHRpb24yIjoKKwkJZSA6PSBOZXdYY2VwdGlvbjIoKQorCQllLkVycm9yQ29kZSA9IDIwMDIKKwkJZS5TdHJ1Y3RUaGluZy5TdHJpbmdUaGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKwkJcmV0dXJuIG5pbCwgZQorCWRlZmF1bHQ6CisJCXIgPSBOZXdYdHJ1Y3QoKQorCQlyLlN0cmluZ1RoaW5nID0gYXJnMQorCQlyZXR1cm4KKwl9Cit9CisKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKKwl0aW1lLlNsZWVwKHRpbWUuU2Vjb25kICogdGltZS5EdXJhdGlvbihzZWNvbmRzVG9TbGVlcCkpCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvTWFrZWZpbGUuYW0gYi90ZXN0L2hheGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwNDgzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEwNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVENNRCA9ICQoVEhSSUZUKSAtLWdlbiBoYXhlIC1yCitUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKK0JJTl9DUFAgPSBiaW4vTWFpbi1kZWJ1ZworQklOX1BIUCA9IGJpbi9waHAvTWFpbi1kZWJ1Zy5waHAKK0JJTl9QSFBfV0VCID0gYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwCisKK2dlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHg6ICQoVEhSSUZUVEVTVCkKKwkkKFRIUklGVENNRCkgJChUSFJJRlRURVNUKQorCithbGwtbG9jYWw6ICQoQklOX0NQUCkgJChCSU5fUEhQKSAkKEJJTl9QSFBfV0VCKQorCiskKEJJTl9DUFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4CisJJChIQVhFKSAtLWN3ZCAuICBjcHAuaHhtbAorCiskKEJJTl9QSFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9UaHJpZnRUZXN0Lmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCiskKEJJTl9QSFBfV0VCKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLXdlYi1zZXJ2ZXIuaHhtbAorCisKKworI1RPRE86IG90aGVyIGhheGUgdGFyZ2V0cworIyAgICAkKEhBWEUpICAtLWN3ZCAuICBjc2hhcnAKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgZmxhc2gKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YQorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhc2NyaXB0CisjICAgICQoSEFYRSkgIC0tY3dkIC4gIG5la28KKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgcHl0aG9uICAjIG5lZWRzIEhheGUgMy4yLjAKKworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4taGF4ZSBiaW4KKworLk5PVFBBUkFMTEVMOgorCitjaGVjazogY2hlY2tfY3BwIFwKKwljaGVja19waHAgXAorCWNoZWNrX3BocF93ZWIgCisKK2NoZWNrX2NwcDogJChCSU5fQ1BQKSAKKwl0aW1lb3V0IDIwICQoQklOX0NQUCkgc2VydmVyICYKKwlzbGVlcCAxCisJJChCSU5fQ1BQKSBjbGllbnQKKwlzbGVlcCAxMAorCitjaGVja19waHA6ICQoQklOX1BIUCkgCisJdGltZW91dCAyMCBwaHAgLWYgJChCSU5fUEhQKSBzZXJ2ZXIgJgorCXNsZWVwIDEKKwlwaHAgLWYgJChCSU5fUEhQKSBjbGllbnQKKwlzbGVlcCAxMAorCitjaGVja19waHBfd2ViOiAkKEJJTl9QSFBfV0VCKSAkKEJJTl9DUFApCisJdGltZW91dCAyMCBwaHAgLVMgMTI3LjAuMC4xOjkwOTAgcm91dGVyLnBocCAmCisJc2xlZXAgMQorCSQoQklOX0NQUCkgY2xpZW50IC0tdHJhbnNwb3J0IGh0dHAKKwlzbGVlcCAxMAorCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjIFwKKwljcHAuaHhtbCBcCisJY3NoYXJwLmh4bWwgXAorCWZsYXNoLmh4bWwgXAorCWphdmEuaHhtbCBcCisJamF2YXNjcmlwdC5oeG1sIFwKKwluZWtvLmh4bWwgXAorCXBocC5oeG1sIFwKKwlweXRob24uaHhtbCBcCisJcm91dGVyLnBocCBcCisJcHJvamVjdC5oaWRlIFwKKwlwaHAtd2ViLXNlcnZlci5oeG1sIFwKKwlUZXN0Q2xpZW50U2VydmVyLmh4cHJvaiBcCisJbWFrZV9hbGwuYmF0IFwKKwltYWtlX2FsbC5zaApkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL1Rlc3RDbGllbnRTZXJ2ZXIuaHhwcm9qIGIvdGVzdC9oYXhlL1Rlc3RDbGllbnRTZXJ2ZXIuaHhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTZkODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvVGVzdENsaWVudFNlcnZlci5oeHByb2oKQEAgLTAsMCArMSw2NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxwcm9qZWN0IHZlcnNpb249IjIiPgorICA8IS0tIE91dHB1dCBTV0Ygb3B0aW9ucyAtLT4KKyAgPG91dHB1dD4KKyAgICA8bW92aWUgb3V0cHV0VHlwZT0iQXBwbGljYXRpb24iIC8+CisgICAgPG1vdmllIGlucHV0PSIiIC8+CisgICAgPG1vdmllIHBhdGg9ImJpbi9UZXN0Q2xpZW50U2VydmVyIiAvPgorICAgIDxtb3ZpZSBmcHM9IjMwIiAvPgorICAgIDxtb3ZpZSB3aWR0aD0iODAwIiAvPgorICAgIDxtb3ZpZSBoZWlnaHQ9IjYwMCIgLz4KKyAgICA8bW92aWUgdmVyc2lvbj0iMSIgLz4KKyAgICA8bW92aWUgbWlub3JWZXJzaW9uPSIwIiAvPgorICAgIDxtb3ZpZSBwbGF0Zm9ybT0iQysrIiAvPgorICAgIDxtb3ZpZSBiYWNrZ3JvdW5kPSIjRkZGRkZGIiAvPgorICA8L291dHB1dD4KKyAgPCEtLSBPdGhlciBjbGFzc2VzIHRvIGJlIGNvbXBpbGVkIGludG8geW91ciBTV0YgLS0+CisgIDxjbGFzc3BhdGhzPgorICAgIDxjbGFzcyBwYXRoPSJzcmMiIC8+CisgICAgPGNsYXNzIHBhdGg9Imdlbi1oYXhlIiAvPgorICAgIDxjbGFzcyBwYXRoPSIuLi8uLi9saWIvaGF4ZS9zcmMiIC8+CisgIDwvY2xhc3NwYXRocz4KKyAgPCEtLSBCdWlsZCBvcHRpb25zIC0tPgorICA8YnVpbGQ+CisgICAgPG9wdGlvbiBkaXJlY3RpdmVzPSIiIC8+CisgICAgPG9wdGlvbiBmbGFzaFN0cmljdD0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBub0lubGluZU9uRGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbWFpbkNsYXNzPSJNYWluIiAvPgorICAgIDxvcHRpb24gZW5hYmxlZGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gYWRkaXRpb25hbD0iIiAvPgorICA8L2J1aWxkPgorICA8IS0tIGhheGVsaWIgbGlicmFyaWVzIC0tPgorICA8aGF4ZWxpYj4KKyAgICA8IS0tIGV4YW1wbGU6IDxsaWJyYXJ5IG5hbWU9Ii4uLiIgLz4gLS0+CisgIDwvaGF4ZWxpYj4KKyAgPCEtLSBDbGFzcyBmaWxlcyB0byBjb21waWxlIChvdGhlciByZWZlcmVuY2VkIGNsYXNzZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkKSAtLT4KKyAgPGNvbXBpbGVUYXJnZXRzPgorICAgIDwhLS0gZXhhbXBsZTogPGNvbXBpbGUgcGF0aD0iLi4uIiAvPiAtLT4KKyAgPC9jb21waWxlVGFyZ2V0cz4KKyAgPCEtLSBQYXRocyB0byBleGNsdWRlIGZyb20gdGhlIFByb2plY3QgRXhwbG9yZXIgdHJlZSAtLT4KKyAgPGhpZGRlblBhdGhzPgorICAgIDxoaWRkZW4gcGF0aD0ib2JqIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3BwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJjc2hhcnAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImZsYXNoLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhc2NyaXB0Lmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5iYXQiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5zaCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Ik1ha2VmaWxlLmFtIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibmVrby5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icGhwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJwcm9qZWN0LmhpZGUiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJweXRob24uaHhtbCIgLz4KKyAgPC9oaWRkZW5QYXRocz4KKyAgPCEtLSBFeGVjdXRlZCBiZWZvcmUgYnVpbGQgLS0+CisgIDxwcmVCdWlsZENvbW1hbmQ+dGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vVGhyaWZ0VGVzdC50aHJpZnQ8L3ByZUJ1aWxkQ29tbWFuZD4KKyAgPCEtLSBFeGVjdXRlZCBhZnRlciBidWlsZCAtLT4KKyAgPHBvc3RCdWlsZENvbW1hbmQgYWx3YXlzUnVuPSJGYWxzZSIgLz4KKyAgPCEtLSBPdGhlciBwcm9qZWN0IG9wdGlvbnMgLS0+CisgIDxvcHRpb25zPgorICAgIDxvcHRpb24gc2hvd0hpZGRlblBhdGhzPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZT0iVW5rbm93biIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZUNvbW1hbmQ9IiIgLz4KKyAgPC9vcHRpb25zPgorICA8IS0tIFBsdWdpbiBzdG9yYWdlIC0tPgorICA8c3RvcmFnZSAvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9jcHAuaHhtbCBiL3Rlc3QvaGF4ZS9jcHAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRiNTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL2NwcC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDUFAgdGFyZ2V0CistY3BwIGJpbgorCisjVG8gcHJvZHVjZSA2NCBiaXQgYmluYXJpZXMgdGhlIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgSFhDUFBfTTY0IGNvbXBpbGUgdmFyaWFibGU6CisjLUQgSFhDUFBfTTY0CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvY3NoYXJwLmh4bWwgYi90ZXN0L2hheGUvY3NoYXJwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1YzAxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9jc2hhcnAuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1NIQVJQIHRhcmdldAorLWNzIGJpbi9UdXRvcmlhbC5leGUKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9mbGFzaC5oeG1sIGIvdGVzdC9oYXhlL2ZsYXNoLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmMDU2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9mbGFzaC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNGbGFzaCB0YXJnZXQKKy1zd2YgYmluL1R1dG9yaWFsLnN3ZgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworIyB3ZSBuZWVkIHNvbWUgZ29vZGllcyBmcm9tIHN5cy5uZXQKKyMgLS1tYWNybyBhbGxvd1BhY2thZ2UoInN5cyIpCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9qYXZhLmh4bWwgYi90ZXN0L2hheGUvamF2YS5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTU1NjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvamF2YS5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYyAKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YSB0YXJnZXQKKy1qYXZhIGJpbi9UdXRvcmlhbC5qYXIKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwgYi90ZXN0L2hheGUvamF2YXNjcmlwdC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjM4NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvamF2YXNjcmlwdC5oeG1sCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhU2NyaXB0IHRhcmdldAorLWpzIGJpbi9UdXRvcmlhbC5qcworCisjWW91IGNhbiB1c2UgLUQgc291cmNlLW1hcC1jb250ZW50IChyZXF1aXJlcyBIYXhlIDMuMSspIHRvIGhhdmUgdGhlIC5oeCAKKyNmaWxlcyBkaXJlY3RseSBlbWJlZGRlZCBpbnRvIHRoZSBtYXAgZmlsZSwgdGhpcyB3YXkgeW91IG9ubHkgaGF2ZSB0byAKKyN1cGxvYWQgaXQsIGFuZCBpdCB3aWxsIGJlIGFsd2F5cyBpbiBzeW5jIHdpdGggdGhlIGNvbXBpbGVkIC5qcyBldmVuIGlmIAorI3lvdSBtb2RpZnkgeW91ciAuaHggZmlsZXMuCistRCBzb3VyY2UtbWFwLWNvbnRlbnQKKworI0dlbmVyYXRlIHNvdXJjZSBtYXAgYW5kIGFkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9tYWtlX2FsbC5iYXQgYi90ZXN0L2hheGUvbWFrZV9hbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZWJhODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvbWFrZV9hbGwuYmF0CkBAIC0wLDAgKzEsNjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAoraWYgIiVIT01FRFJJVkUlIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIT01FUEFUSCUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhBWEVQQVRIJSI9PSIiIGdvdG8gTk9USU5TVEFMTEVECisKK3NldCBwYXRoPSVIQVhFUEFUSCU7JUhBWEVQQVRIJVwuLlxuZWtvOyVwYXRoJQorCityZW0gIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgIC4uXFRocmlmdFRlc3QudGhyaWZ0CitpZiBlcnJvcmxldmVsIDEgZ290byBTVE9QCisKK3JlbSAjIGludm9rZSBIYXhlIGNvbXBpbGVyIGZvciBhbGwgdGFyZ2V0cworZm9yICUlYSBpbiAoKi5oeG1sKSBkbyAoCisJcmVtICogZmlsdGVyIFB5dGhvbiwgYXMgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBIYXhlIDMuMS4zIChidXQgd2lsbCBiZSBpbiAzLjEuNCkKKwlpZiBub3QgIiUlYSI9PSJweXRob24uaHhtbCIgKAorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWVjaG8gQnVpbGRpbmcgJSVhIC4uLgorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWhheGUgIC0tY3dkIC4gICUlYQorCSkKKykKKworCitlY2hvLgorZWNobyBkb25lLgorcGF1c2UKK2dvdG8gZW9mCisKKzpOT1RJTlNUQUxMRUQKK2VjaG8gRkFUQUw6IEVpdGhlciBIYXhlIGlzIG5vdCBpbnN0YWxsZWQsIG9yIHRoZSBIQVhFUEFUSCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorcGF1c2UKK2dvdG8gZW9mCisKKzpNSVNTSU5HVkFSUworZWNobyBGQVRBTDogVW5hYmxlIHRvIGxvY2F0ZSBob21lIGZvbGRlci4KK2VjaG8uCitlY2hvIEJvdGggSE9NRURSSVZFIGFuZCBIT01FUEFUSCBuZWVkIHRvIGJlIHNldCB0byBwb2ludCB0byB5b3VyIEhvbWUgZm9sZGVyLgorZWNobyBUaGUgY3VycmVudCB2YWx1ZXMgYXJlOgorZWNobyBIT01FRFJJVkU9JUhPTUVEUklWRSUKK2VjaG8gSE9NRVBBVEg9JUhPTUVQQVRIJQorcGF1c2UKK2dvdG8gZW9mCisKKzpTVE9QCitwYXVzZQorZ290byBlb2YKKworOmVvZgpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL21ha2VfYWxsLnNoIGIvdGVzdC9oYXhlL21ha2VfYWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViMmM5YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvbWFrZV9hbGwuc2gKQEAgLTAsMCArMSw0MSBAQAorIyEvYmluL3NoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgorLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtciAtZ2VuIGhheGUgIC4uL1RocmlmdFRlc3QudGhyaWZ0CisKKyMgb3V0cHV0IGZvbGRlcgoraWYgWyAhIC1kIGJpbiBdOyB0aGVuCisgIG1rZGlyICBiaW4KK2ZpCisKKyMgaW52b2tlIEhheGUgY29tcGlsZXIKK2ZvciB0YXJnZXQgaW4gKi5oeG1sOyBkbyAKKyAgZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBlY2hvIEJ1aWxkaW5nICR7dGFyZ2V0fSAuLi4KKyAgZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpZiBbICEgLWQgYmluLyR7dGFyZ2V0fSBdOyB0aGVuCisgICAgbWtkaXIgIGJpbi8ke3RhcmdldH0KKyAgZmkKKyAgaGF4ZSAgLS1jd2QgLiAgJHt0YXJnZXR9IAorZG9uZQorCisKKyNlb2YKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9uZWtvLmh4bWwgYi90ZXN0L2hheGUvbmVrby5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjFmNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvbmVrby5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNuZWtvIHRhcmdldAorLW5la28gYmluL1R1dG9yaWFsLm4KKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sIGIvdGVzdC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YTg1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAtd2ViLXNlcnZlci8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCisKKyNkZWZpbmVzCistRCBwaHB3ZWJzZXJ2ZXIKKworCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcGhwLmh4bWwgYi90ZXN0L2hheGUvcGhwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1MTg5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9waHAuaHhtbApAQCAtMCwwICsxLDQwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUEhQIHRhcmdldAorLXBocCBiaW4vcGhwLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcHJvamVjdC5oaWRlIGIvdGVzdC9oYXhlL3Byb2plY3QuaGlkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWMwOWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3Byb2plY3QuaGlkZQpAQCAtMCwwICsxLDc2IEBACit7CisgICAgICJ0eXBlIiA6IDAKKyAgICAsInRhcmdldCIgOiA0CisgICAgLCJuYW1lIiA6ICJBcGFjaGUgVGhyaWZ0IGNyb3NzLXBsYXRmb3JtIHRlc3QgY2xpZW50L3NlcnZlciIKKyAgICAsIm1haW4iIDogbnVsbAorICAgICwicHJvamVjdFBhY2thZ2UiIDogIiIKKyAgICAsImNvbXBhbnkiIDogIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIgorICAgICwibGljZW5zZSIgOiAiQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgorICAgICwidXJsIiA6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCisgICAgLCJ0YXJnZXREYXRhIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiZmxhc2guaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAxCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9UdXRvcmlhbC5zd2YiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YXNjcmlwdC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluXFxpbmRleC5odG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogIm5la28uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogIm5la28gYmluL1R1dG9yaWFsLm4iCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAicGhwLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3BwLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW4vTWFpbi1kZWJ1Zy5leGUgIGNsaWVudCAtLXByb3RvY29sIGpzb24iCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiamF2YS5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImNzaGFycC5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogInB5dGhvbi5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAicHl0aG9uIGJpbi9UdXRvcmlhbC5weSIKKyAgICAgICAgfQorICAgIF0KKyAgICAsImZpbGVzIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxUZXN0Q2xpZW50Lmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMTg4CisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxUZXN0U2VydmVyLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogODgKKyAgICAgICAgfQorICAgIF0KKyAgICAsImFjdGl2ZUZpbGUiIDogInNyY1xcVGVzdENsaWVudC5oeCIKKyAgICAsIm9wZW5GTFRhcmdldCIgOiBudWxsCisgICAgLCJvcGVuRkxCdWlsZE1vZGUiIDogIkRlYnVnIgorICAgICwicnVuQWN0aW9uVHlwZSIgOiBudWxsCisgICAgLCJydW5BY3Rpb25UZXh0IiA6IG51bGwKKyAgICAsImJ1aWxkQWN0aW9uQ29tbWFuZCIgOiBudWxsCisgICAgLCJoaWRkZW5JdGVtcyIgOiBbCisKKyAgICBdCisgICAgLCJzaG93SGlkZGVuSXRlbXMiIDogZmFsc2UKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcHl0aG9uLmh4bWwgYi90ZXN0L2hheGUvcHl0aG9uLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjMTlmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9weXRob24uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUHl0aG9uIHRhcmdldAorLXB5dGhvbiBiaW4vVHV0b3JpYWwucHkKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9yb3V0ZXIucGhwIGIvdGVzdC9oYXhlL3JvdXRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0MTM1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9yb3V0ZXIucGhwCkBAIC0wLDAgKzEsMzEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKKworCisvL3JvdXRlciBmaWxlIHRvIHJ1biB0ZXN0aW5nIHdlYiBzZXJ2ZXIKKworLy9zZXRfdGltZV9saW1pdCgxKTsKKworcmVxdWlyZV9vbmNlICBkaXJuYW1lKF9fRklMRV9fKSAuICcvYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwJzsKKworCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeCBiL3Rlc3QvaGF4ZS9zcmMvQXJndW1lbnRzLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTA3NDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeApAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworaW1wb3J0IGhheGUuaW8uUGF0aDsKKwordXNpbmcgU3RyaW5nVG9vbHM7CisKKworZW51bSBQcm90b2NvbFR5cGUgeworICAgIGJpbmFyeTsKKyAgICBqc29uOworICAgIGNvbXBhY3Q7Cit9CisKK2VudW0gRW5kcG9pbnRUcmFuc3BvcnQgeworICAgIHNvY2tldDsKKyAgICBodHRwOworfQorCitlbnVtIFNlcnZlclR5cGUgeworICAgIHNpbXBsZTsKKyAgICAvKgorICAgIHRocmVhZHBvb2w7CisgICAgdGhyZWFkZWQ7CisgICAgbm9uYmxvY2tpbmc7CisgICAgKi8KK30KKworCitjbGFzcyBBcmd1bWVudHMKK3sKKyAgICBwdWJsaWMgdmFyIHByaW50SGVscE9ubHkoZGVmYXVsdCxudWxsKSA6IEJvb2wgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2YXIgc2VydmVyKGRlZmF1bHQsbnVsbCkgOiBCb29sID0gZmFsc2U7CisgICAgcHVibGljIHZhciBzZXJ2ZXJ0eXBlKGRlZmF1bHQsbnVsbCkgOiBTZXJ2ZXJUeXBlID0gc2ltcGxlOworCisgICAgcHVibGljIHZhciBob3N0KGRlZmF1bHQsbnVsbCkgOiBTdHJpbmcgPSAibG9jYWxob3N0IjsKKyAgICBwdWJsaWMgdmFyIHBvcnQoZGVmYXVsdCxudWxsKSA6IEludCA9IDkwOTA7CisKKyAgICBwdWJsaWMgdmFyIHByb3RvY29sKGRlZmF1bHQsbnVsbCkgOiBQcm90b2NvbFR5cGUgPSBiaW5hcnk7CisgICAgcHVibGljIHZhciB0cmFuc3BvcnQoZGVmYXVsdCxudWxsKSA6IEVuZHBvaW50VHJhbnNwb3J0ID0gc29ja2V0OworICAgIHB1YmxpYyB2YXIgZnJhbWVkKGRlZmF1bHQsbnVsbCkgOiBCb29sID0gZmFsc2U7CisgICAgcHVibGljIHZhciBidWZmZXJlZChkZWZhdWx0LG51bGwpIDogQm9vbCA9IGZhbHNlOworCisgICAgcHVibGljIHZhciBudW1JdGVyYXRpb25zKGRlZmF1bHQsbnVsbCkgOiBJbnQgPSAxOworICAgIHB1YmxpYyB2YXIgbnVtVGhyZWFkcyhkZWZhdWx0LG51bGwpIDogSW50ID0gMTsKKyAgICBwdWJsaWMgdmFyIHNraXBTcGVlZFRlc3QoZGVmYXVsdCxudWxsKSA6IEJvb2wgPSBmYWxzZTsKKworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICAgICAgI2lmIHN5cworICAgICAgICAgICNpZiAhcGhwd2Vic2VydmVyCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgUGFyc2VBcmdzKCk7CisgICAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgICAgdHJhY2UoR2V0SGVscCgpKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgfQorICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAvL2ZvcmNpbmcgc2VydmVyCisgICAgICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gaHR0cDsKKyAgICAgICAgICAjZW5kCisgICAgICAgICNlbHNlCisgICAgICAgIHRyYWNlKCJXTjogUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBwcm9ncmFtIGFyZ3VtZW50cywgdXNpbmcgZGVmYXVsdHMuIik7CisgICAgICAgICNlbmQKKyAgICB9CisKKyAgICAjaWYgc3lzCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBHZXRIZWxwKCkgOiBTdHJpbmcgeworICAgICAgICB2YXIgc1Byb2cgPSBQYXRoLndpdGhvdXREaXJlY3RvcnkoIFN5cy5leGVjdXRhYmxlUGF0aCgpKTsKKyAgICAgICAgcmV0dXJuICJcbiIKKyAgICAgICAgICAgICtzUHJvZysiICBbY2xpZW50fHNlcnZlcl0gIFtvcHRpb25zXVxuIgorICAgICAgICAgICAgKyJcbiIKKyAgICAgICAgICAgICsiTW9kdXM6IEVpdGhlciBjbGllbnQgb3Igc2VydmVyLCB0aGUgZGVmYXVsdCBpcyBjbGllbnQuXG4iCisgICAgICAgICAgICArIlxuIgorICAgICAgICAgICAgKyJDb21tb24gb3B0aW9uczpcbiIKKyAgICAgICAgICAgICsiICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2VcbiIKKyAgICAgICAgICAgICsiICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gbGlzdGVuIC8gY29ubmVjdCB0b1xuIgorICAgICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgICAgICsiICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpXG4iCisgICAgICAgICAgICArIiAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpXG4iCisgICAgICAgICAgICAqLworICAgICAgICAgICAgKyIgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uXG4iCisgICAgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldAorICAgICAgICAgICAgKyIgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTFxuIgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICsiXG4iCisgICAgICAgICAgICArIlNlcnZlciBvbmx5IG9wdGlvbnM6XG4iCisgICAgICAgICAgICArIiAgLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgYW5vbnBpcGVcbiIKKyAgICAgICAgICAgIC8qIG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgICAgICArIiAgLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHNcbiIKKyAgICAgICAgICAgICsiICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIiwgXG4iCisgICAgICAgICAgICArIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiXG4iCisgICAgICAgICAgICArIiAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IgXG4iCisgICAgICAgICAgICArIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlXG4iCisgICAgICAgICAgICAqLworICAgICAgICAgICAgKyJcbiIKKyAgICAgICAgICAgICsiQ2xpZW50IG9ubHkgb3B0aW9uczpcbiIKKyAgICAgICAgICAgICsiICAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0XG4iCisgICAgICAgICAgICArIiAgLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwXG4iCisgICAgICAgICAgICAvKiBub3Qgc3VwcG9ydGVkIHlldAorICAgICAgICAgICAgKyIgIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKVxuIgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICsiICAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzXG4iCisgICAgICAgICAgICArIiAgLXQgWyAtLXRocmVhZHMgXSBhcmcgKD0xKSAgIE51bWJlciBvZiBUZXN0IHRocmVhZHNcbiIKKyAgICAgICAgICAgICsiICAtLXNraXAtc3BlZWQtdGVzdCAgICAgICAgICAgU2tpcCB0aGUgc3BlZWQgdGVzdFxuIgorICAgICAgICAgICAgKyJcbiIKKyAgICAgICAgICAgICsiQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuXG4iCisgICAgICAgICAgICA7CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFBhcnNlQXJncygpIDogVm9pZCB7CisKKyAgICAgICAgdmFyIGFyZ3MgPSBTeXMuYXJncygpLmNvcHkoKTsKKyAgICAgICAgaWYoIChhcmdzID09IG51bGwpIHx8IChhcmdzLmxlbmd0aCA8PSAwKSkgeworICAgICAgICAgICAgc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgIGlmICggYXJnID09ICJjbGllbnQiKSB7CisgICAgICAgICAgICBzZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIG51bVRocmVhZHMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBhcmcgPT0gInNlcnZlciIpIHsKKyAgICAgICAgICAgIHNlcnZlciA9IHRydWU7CisgICAgICAgICAgICBudW1UaHJlYWRzID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKGFyZyA9PSAiLWgiKSB8fCAoYXJnID09ICItLWhlbHAiKSkgeworICAgICAgICAgICAgLy8gLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlCisgICAgICAgICAgICBTeXMucHJpbnRsbiggR2V0SGVscCgpKTsKKyAgICAgICAgICAgIHByaW50SGVscE9ubHkgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhyb3cgIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgJ3NlcnZlcicgb3IgJ2NsaWVudCciOworICAgICAgICB9CisKKworICAgICAgICB3aGlsZSggYXJncy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisKKyAgICAgICAgICAgIGlmICggKGFyZyA9PSAiLWgiKSB8fCAoYXJnID09ICItLWhlbHAiKSkgeworICAgICAgICAgICAgICAgIC8vIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgICAgICAgICAgIFN5cy5wcmludGxuKCBHZXRIZWxwKCkpOworICAgICAgICAgICAgICAgIHByaW50SGVscE9ubHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1wb3J0IikgeworICAgICAgICAgICAgICAgIC8vIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW4KKyAgICAgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgdmFyIHRtcCA9IFN0ZC5wYXJzZUludChhcmcpOworICAgICAgICAgICAgICAgIGlmKCB0bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwb3J0ID0gdG1wOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93ICJJbnZhbGlkIHBvcnQgbnVtYmVyICIrYXJnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1kb21haW4tc29ja2V0IikgeworICAgICAgICAgICAgICAgIC8vICAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KQorICAgICAgICAgICAgICAgIHRocm93ICJkb21haW4gc29ja2V0cyBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tbmFtZWQtcGlwZSIpIHsKKyAgICAgICAgICAgICAgICAvLyAgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQorICAgICAgICAgICAgICAgIHRocm93ICJuYW1lZCBwaXBlcyBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tcHJvdG9jb2wiKSB7CisgICAgICAgICAgICAgICAgLy8gLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KKyAgICAgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICAgICAgaWYoIGFyZyA9PSAiYmluYXJ5IikgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IGJpbmFyeTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiY29tcGFjdCIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBjb21wYWN0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJqc29uIikgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9IGpzb247CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSW52YWxpZEFyZyhhcmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1zc2wiKSB7CisgICAgICAgICAgICAgICAgLy8gLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCisgICAgICAgICAgICAgICAgdGhyb3cgIlNTTCBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL1NlcnZlciBvbmx5IG9wdGlvbnM6CisgICAgICAgICAgICAgICAgaWYoIHNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBQYXJzZVNlcnZlckFyZ3VtZW50KCBhcmcsIGFyZ3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFBhcnNlQ2xpZW50QXJndW1lbnQoIGFyZywgYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFBhcnNlU2VydmVyQXJndW1lbnQoIGFyZyA6IFN0cmluZywgYXJncyA6IEFycmF5PFN0cmluZz4pIDogVm9pZCB7CisgICAgICAgIGlmIChhcmcgPT0gIi0tdHJhbnNwb3J0IikgeworICAgICAgICAgICAgLy8gIC0tdHJhbnNwb3J0IGFyZyAoPXNvY2tldHMpICBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGFub25waXBlCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICBpZiggYXJnID09ICJidWZmZXJlZCIpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiZnJhbWVkIikgeworICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiaHR0cCIpIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBodHRwOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gImFub25waXBlIikgeworICAgICAgICAgICAgICAgIHRocm93ICJBbm9uIHBpcGVzIHRyYW5zcG9ydCBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEludmFsaWRBcmcoYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tcHJvY2Vzc29yLWV2ZW50cyIpIHsKKyAgICAgICAgICAgIHRocm93ICJQcm9jZXNzb3IgZXZlbnRzIG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmcgPT0gIi0tc2VydmVyLXR5cGUiKSB7CisgICAgICAgICAgICAvLyAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLAorICAgICAgICAgICAgLy8gb25lIG9mICJzaW1wbGUiLCAidGhyZWFkLXBvb2wiLCAidGhyZWFkZWQiLCAibm9uYmxvY2tpbmciCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICBpZiggYXJnID09ICJzaW1wbGUiKSB7CisgICAgICAgICAgICAgICAgc2VydmVydHlwZSA9IHNpbXBsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJ0aHJlYWQtcG9vbCIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBhcmcrIiBzZXJ2ZXIgbm90IHN1cHBvcnRlZCB5ZXQiOworICAgICAgICAgICAgfSBlbHNlIGlmKCBhcmcgPT0gInRocmVhZGVkIikgeworICAgICAgICAgICAgICAgIHRocm93IGFyZysiIHNlcnZlciBub3Qgc3VwcG9ydGVkIHlldCI7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAibm9uYmxvY2tpbmciKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgYXJnKyIgc2VydmVyIG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSW52YWxpZEFyZyhhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChhcmcgPT0gIi1uIikgfHwgKGFyZyA9PSAiLS13b3JrZXJzIikpIHsKKyAgICAgICAgICAgIC8vICAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvcgorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZQorICAgICAgICAgICAgYXJnID0gYXJncy5zaGlmdCgpOworICAgICAgICAgICAgdmFyIHRtcCA9IFN0ZC5wYXJzZUludChhcmcpOworICAgICAgICAgICAgaWYoIHRtcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IHRtcDsKKyAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBudW1iZXIgIithcmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBJbnZhbGlkQXJnKGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gUGFyc2VDbGllbnRBcmd1bWVudCggYXJnIDogU3RyaW5nLCBhcmdzIDogQXJyYXk8U3RyaW5nPikgOiBWb2lkIHsKKyAgICAgICAgaWYgKGFyZyA9PSAiLS1ob3N0IikgeworICAgICAgICAgICAgLy8gIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QKKyAgICAgICAgICAgIGhvc3QgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLXRyYW5zcG9ydCIpIHsKKyAgICAgICAgICAgIC8vICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAKKyAgICAgICAgICAgIGFyZyA9IGFyZ3Muc2hpZnQoKTsKKyAgICAgICAgICAgIGlmKCBhcmcgPT0gImJ1ZmZlcmVkIikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJmcmFtZWQiKSB7CisgICAgICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiggYXJnID09ICJodHRwIikgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IGh0dHA7CisgICAgICAgICAgICB9IGVsc2UgaWYoIGFyZyA9PSAiZXZodHRwIikgeworICAgICAgICAgICAgICAgIHRocm93ICJldmh0dHAgdHJhbnNwb3J0IG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSW52YWxpZEFyZyhhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAiLS1hbm9uLXBpcGVzIikgeworICAgICAgICAgICAgLy8gIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKQorICAgICAgICAgICAgdGhyb3cgIkFub24gcGlwZXMgdHJhbnNwb3J0IG5vdCBzdXBwb3J0ZWQgeWV0IjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoYXJnID09ICItbiIpIHx8IChhcmcgPT0gIi0tdGVzdGxvb3BzIikpIHsKKyAgICAgICAgICAgIC8vICAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICB2YXIgdG1wID0gU3RkLnBhcnNlSW50KGFyZyk7CisgICAgICAgICAgICBpZiggdG1wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gdG1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBudW1iZXIgIithcmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGFyZyA9PSAiLXQiKSB8fCAoYXJnID09ICItLXRocmVhZHMiKSkgeworICAgICAgICAgICAgLy8gIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzCisgICAgICAgICAgICBhcmcgPSBhcmdzLnNoaWZ0KCk7CisgICAgICAgICAgICB2YXIgdG1wID0gU3RkLnBhcnNlSW50KGFyZyk7CisgICAgICAgICAgICBpZiggdG1wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gdG1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBudW1iZXIgIithcmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXJnID09ICItLXNraXAtc3BlZWQtdGVzdCIpIHsKKyAgICAgICAgICAgIC8vICAtLXNraXAtc3BlZWQtdGVzdCAgICAgICAgICAgICAgU2tpcCB0aGUgc3BlZWQgdGVzdAorICAgICAgICAgICAgc2tpcFNwZWVkVGVzdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBJbnZhbGlkQXJnKGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICNlbmQKKworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBJbnZhbGlkQXJnKCBhcmcgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIHRocm93ICdJbnZhbGlkIGFyZ3VtZW50ICRhcmcnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvTWFpbi5oeCBiL3Rlc3QvaGF4ZS9zcmMvTWFpbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI4MjhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3NyYy9NYWluLmh4CkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKK2NsYXNzIE1haW4KK3sKKyAgICBzdGF0aWMgZnVuY3Rpb24gbWFpbigpIHsKKyAgICAgICAgI2lmIHBocHdlYnNlcnZlcgorICAgICAgICBpbml0UGhwV2ViU2VydmVyKCk7CisgICAgICAgIC8vY2hlY2sgbWV0aG9kCisgICAgICAgIGlmKHBocC5XZWIuZ2V0TWV0aG9kKCkgIT0gJ1BPU1QnKSB7CisgICAgICAgICAgU3lzLnByaW50bG4oJ2h0dHAgZW5kcG9pbnQgZm9yIHRocmlmdCB0ZXN0IHNlcnZlcicpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAjZW5kCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IEFyZ3VtZW50cygpOworCisgICAgICAgICAgICBpZiggYXJncy5wcmludEhlbHBPbmx5KQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKGFyZ3Muc2VydmVyKQorICAgICAgICAgICAgICAgIFRlc3RTZXJ2ZXIuRXhlY3V0ZShhcmdzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBUZXN0Q2xpZW50LkV4ZWN1dGUoYXJncyk7CisKKyAgICAgICAgICAgIHRyYWNlKCJDb21wbGV0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGUgOiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHRyYWNlKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgI2lmIHBocHdlYnNlcnZlcgorICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRQaHBXZWJTZXJ2ZXIoKQorICAgIHsKKyAgICAgICAgLy9yZW1hcCB0cmFjZSB0byBlcnJvciBsb2cKKyAgICAgICAgaGF4ZS5Mb2cudHJhY2UgPSBmdW5jdGlvbih2OkR5bmFtaWMsID9pbmZvczpoYXhlLlBvc0luZm9zKQorICAgICAgICB7CisgICAgICAgICAgLy8gaGFuZGxlIHRyYWNlCisgICAgICAgICAgdmFyIG5ld1ZhbHVlIDogRHluYW1pYzsKKyAgICAgICAgICBpZiAoaW5mb3MgIT0gbnVsbCAmJiBpbmZvcy5jdXN0b21QYXJhbXMhPW51bGwpIHsKKyAgICAgICAgICAgIHZhciBleHRyYTpTdHJpbmcgPSAiIjsKKyAgICAgICAgICAgIGZvciggdiBpbiBpbmZvcy5jdXN0b21QYXJhbXMgKQorICAgICAgICAgICAgICBleHRyYSArPSAiLCIgKyB2OworICAgICAgICAgICAgbmV3VmFsdWUgPSB2ICsgZXh0cmE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbmV3VmFsdWUgPSB2OworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgbXNnID0gaW5mb3MgIT0gbnVsbCA/IGluZm9zLmZpbGVOYW1lICsgJzonICsgaW5mb3MubGluZU51bWJlciArICc6ICcgOiAnJzsKKyAgICAgICAgICBTeXMuc3RkZXJyKCkud3JpdGVTdHJpbmcoJyR7bXNnfSR7bmV3VmFsdWV9XG4nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kCisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvVGVzdENsaWVudC5oeCBiL3Rlc3QvaGF4ZS9zcmMvVGVzdENsaWVudC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMzMTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9oYXhlL3NyYy9UZXN0Q2xpZW50Lmh4CkBAIC0wLDAgKzEsOTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBoYXhlLkludDMyOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLlRpbWVyOworaW1wb3J0IGhheGUuZHMuSW50TWFwOworaW1wb3J0IGhheGUuZHMuU3RyaW5nTWFwOworaW1wb3J0IGhheGUuZHMuT2JqZWN0TWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCisjaWYgY3BwCitpbXBvcnQgY3BwLnZtLlRocmVhZDsKKyNlbHNlCisvLyBubyB0aHJlYWQgc3VwcG9ydCAoeWV0KQorI2VuZAorCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKKwordXNpbmcgU3RyaW5nVG9vbHM7CisKK2NsYXNzIFRlc3RSZXN1bHRzIHsKKyAgICBwcml2YXRlIHZhciBzdWNjZXNzQ250IDogSW50ID0gMDsKKyAgICBwcml2YXRlIHZhciBlcnJvckNudCA6IEludCA9IDA7CisgICAgcHJpdmF0ZSB2YXIgZmFpbGVkVGVzdHMgOiBTdHJpbmcgPSAiIjsKKyAgICBwcml2YXRlIHZhciBwcmludF9kaXJlY3QgOiBCb29sID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFWElUQ09ERV9TVUNDRVNTICAgICAgICAgICAgPSAweDAwOyAgLy8gbm8gZXJyb3JzIGJpdHMgc2V0CisgICAgLy8KKyAgICBwdWJsaWMgc3RhdGljIHZhciBFWElUQ09ERV9GQUlMQklUX0JBU0VUWVBFUyAgPSAweDAxOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVYSVRDT0RFX0ZBSUxCSVRfU1RSVUNUUyAgICA9IDB4MDI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRVhJVENPREVfRkFJTEJJVF9DT05UQUlORVJTID0gMHgwNDsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBFWElUQ09ERV9GQUlMQklUX0VYQ0VQVElPTlMgPSAweDA4OworICAgIC8vCisgICAgcHVibGljIHN0YXRpYyB2YXIgRVhJVENPREVfQUxMX0ZBSUxCSVRTICAgICAgID0gMHgwRjsKKyAgICAvLworICAgIHByaXZhdGUgdmFyIHRlc3RzRXhlY3V0ZWQgOiBJbnQgPSAwOworICAgIHByaXZhdGUgdmFyIHRlc3RzRmFpbGVkIDogSW50ID0gMDsKKyAgICBwcml2YXRlIHZhciBjdXJyZW50VGVzdCA6IEludCA9IDA7CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoZGlyZWN0IDogQm9vbCkgeworICAgICAgICBwcmludF9kaXJlY3QgPSBkaXJlY3Q7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFN0YXJ0VGVzdEdyb3VwKCBncm91cEJpdCA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgY3VycmVudFRlc3QgPSBncm91cEJpdDsKKyAgICAgICAgdGVzdHNFeGVjdXRlZCB8PSBncm91cEJpdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRXhwZWN0KCBleHByIDogQm9vbCwgbXNnIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICBpZiAoIGV4cHIpIHsKKyAgICAgICAgICAgICsrc3VjY2Vzc0NudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsrZXJyb3JDbnQ7CisgICAgICAgICAgICB0ZXN0c0ZhaWxlZCB8PSBjdXJyZW50VGVzdDsKKyAgICAgICAgICAgIGZhaWxlZFRlc3RzICs9ICJcbiAgIiArIG1zZzsKKyAgICAgICAgICAgIGlmKCBwcmludF9kaXJlY3QpIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgnRkFJTDogJG1zZycpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIENhbGN1bGF0ZUV4aXRDb2RlKCkgOiBJbnQgeworICAgICAgICB2YXIgbm90RXhlY3V0ZWQgOiBJbnQgPSBFWElUQ09ERV9BTExfRkFJTEJJVFMgJiAofnRlc3RzRXhlY3V0ZWQpOworICAgICAgICByZXR1cm4gdGVzdHNGYWlsZWQgfCBub3RFeGVjdXRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gUHJpbnRTdW1tYXJ5KCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIHRvdGFsID0gc3VjY2Vzc0NudCArIGVycm9yQ250OworICAgICAgICB2YXIgc3AgPSBNYXRoLnJvdW5kKCgxMDAwICogc3VjY2Vzc0NudCkgLyB0b3RhbCkgLyAxMDsKKyAgICAgICAgdmFyIGVwID0gTWF0aC5yb3VuZCgoMTAwMCAqIGVycm9yQ250KSAvIHRvdGFsKSAvIDEwOworCisgICAgICAgIHRyYWNlKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTsKKyAgICAgICAgdHJhY2UoJ1Rlc3RzIGV4ZWN1dGVkICAgICR0b3RhbCcpOworICAgICAgICB0cmFjZSgnVGVzdHMgc3VjY2VlZGVkICAgJHN1Y2Nlc3NDbnQgKCRzcCUpJyk7CisgICAgICAgIHRyYWNlKCdUZXN0cyBmYWlsZWQgICAgICAkZXJyb3JDbnQgKCRlcCUpJyk7CisgICAgICAgIGlmICggZXJyb3JDbnQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnPT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7CisgICAgICAgICAgICB0cmFjZSgnRkFJTEVEIFRFU1RTOiAkZmFpbGVkVGVzdHMnKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgnPT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7CisgICAgfQorfQorCisKK2NsYXNzIFRlc3RDbGllbnQgeworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBFeGVjdXRlKGFyZ3MgOiBBcmd1bWVudHMpIDogIFZvaWQKKyAgICB7CisgICAgICAgIHZhciBleGl0Q29kZSA9IDB4RkY7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGlmZnQgPSBUaW1lci5zdGFtcCgpOworCisgICAgICAgICAgICBpZiAoIGFyZ3MubnVtVGhyZWFkcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAjaWYgY3BwCisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBNdWx0aVRocmVhZENsaWVudChhcmdzKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHRyYWNlKCdUaHJlYWRzIG5vdCBzdXBwb3J0ZWQvaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0uJyk7CisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBTaW5nbGVUaHJlYWRDbGllbnQoYXJncyk7CisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleGl0Q29kZSA9IFNpbmdsZVRocmVhZENsaWVudChhcmdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGlmZnQgPSBNYXRoLnJvdW5kKCAxMDAwICogKFRpbWVyLnN0YW1wKCkgLSBkaWZmdCkpIC8gMTAwMDsKKyAgICAgICAgICAgIHRyYWNlKCd0b3RhbCB0ZXN0IHRpbWU6ICRkaWZmdCBzZWNvbmRzJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbjogJGUnKTsKKyAgICAgICAgICAgIGV4aXRDb2RlID0gMHhGRjsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdFeGNlcHRpb246ICRlJyk7CisgICAgICAgICAgICBleGl0Q29kZSA9IDB4RkY7CisgICAgICAgIH0KKworICAgICAgICAjaWYgc3lzCisgICAgICAgIFN5cy5leGl0KCBleGl0Q29kZSk7CisgICAgICAgICNlbmQKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gU2luZ2xlVGhyZWFkQ2xpZW50KGFyZ3MgOiBBcmd1bWVudHMpIDogIEludAorICAgIHsKKyAgICAgICAgdmFyIHJzbHQgPSBuZXcgVGVzdFJlc3VsdHModHJ1ZSk7CisgICAgICAgIFJ1bkNsaWVudChhcmdzLHJzbHQpOworICAgICAgICByc2x0LlByaW50U3VtbWFyeSgpOworICAgICAgICByZXR1cm4gcnNsdC5DYWxjdWxhdGVFeGl0Q29kZSgpOworICAgIH0KKworCisgICAgI2lmIGNwcAorICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gTXVsdGlUaHJlYWRDbGllbnQoYXJncyA6IEFyZ3VtZW50cykgOiAgSW50CisgICAgeworICAgICAgICB2YXIgdGhyZWFkcyA9IG5ldyBMaXN0PFRocmVhZD4oKTsKKyAgICAgICAgZm9yKCB0ZXN0IGluIDAgLi4uIGFyZ3MubnVtVGhyZWFkcykgeworICAgICAgICAgICAgdGhyZWFkcy5hZGQoIFN0YXJ0VGhyZWFkKCBhcmdzKSk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGV4aXRDb2RlIDogSW50ID0gMDsKKyAgICAgICAgZm9yKCB0aHJlYWQgaW4gdGhyZWFkcykgeworICAgICAgICAgICAgZXhpdENvZGUgfD0gVGhyZWFkLnJlYWRNZXNzYWdlKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBleGl0Q29kZTsKKyAgICB9CisgICAgI2VuZAorCisgICAgI2lmIGNwcAorICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFN0YXJ0VGhyZWFkKGFyZ3MgOiBBcmd1bWVudHMpIDogVGhyZWFkIHsKKyAgICAgICAgdmFyIHRocmVhZCA9IFRocmVhZC5jcmVhdGUoCisgICAgICAgICAgICBmdW5jdGlvbigpIDogVm9pZCB7CisgICAgICAgICAgICAgICAgdmFyIHJzbHQgPSBuZXcgVGVzdFJlc3VsdHMoZmFsc2UpOworICAgICAgICAgICAgICAgIHZhciBtYWluIDogVGhyZWFkID0gVGhyZWFkLnJlYWRNZXNzYWdlKHRydWUpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUnVuQ2xpZW50KGFyZ3MscnNsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJyRlJyk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNlKCckZScpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICckZScpOworICAgICAgICAgICAgICAgICAgICB0cmFjZSgnJGUnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFpbi5zZW5kTWVzc2FnZSggcnNsdC5DYWxjdWxhdGVFeGl0Q29kZSgpKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRocmVhZC5zZW5kTWVzc2FnZShUaHJlYWQuY3VycmVudCgpKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9CisgICAgI2VuZAorCisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJ1bkNsaWVudChhcmdzIDogQXJndW1lbnRzLCByc2x0IDogVGVzdFJlc3VsdHMpCisgICAgeworICAgICAgICB2YXIgdHJhbnNwb3J0IDogVFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgIHN3aXRjaCAoYXJncy50cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2Ugc29ja2V0OgorICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KGFyZ3MuaG9zdCwgYXJncy5wb3J0KTsKKyAgICAgICAgICAgIGNhc2UgaHR0cDoKKyAgICAgICAgICAgICAgICB2YXIgdXJpID0gJ2h0dHA6Ly8ke2FyZ3MuaG9zdH06JHthcmdzLnBvcnR9JzsKKyAgICAgICAgICAgICAgICB0cmFjZSgnLSBodHRwIGNsaWVudCA6ICR7dXJpfScpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudCh1cmkpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRyYW5zcG9ydCI7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcHRpb25hbDogbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgaWYgKCBhcmdzLmZyYW1lZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGFyZ3MuYnVmZmVyZWQpIHsKKyAgICAgICAgICAgIHRyYWNlKCItIGJ1ZmZlcmVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvdG9jb2wKKyAgICAgICAgdmFyIHByb3RvY29sIDogVFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgc3dpdGNoKCBhcmdzLnByb3RvY29sKQorICAgICAgICB7CisgICAgICAgIGNhc2UgYmluYXJ5OgorICAgICAgICAgICAgdHJhY2UoIi0gYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgY2FzZSBqc29uOgorICAgICAgICAgICAgdHJhY2UoIi0ganNvbiBwcm90b2NvbCIpOworICAgICAgICAgICAgcHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICBjYXNlIGNvbXBhY3Q6CisgICAgICAgICAgICB0cmFjZSgiLSBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICBwcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzb21lIHF1aWNrIGFuZCBiYXNpYyB1bml0IHRlc3RzCisgICAgICAgIEhheGVCYXNpY3NUZXN0KCBhcmdzLCByc2x0KTsKKyAgICAgICAgTW9kdWxlVW5pdFRlc3RzKCBhcmdzLCByc2x0KTsKKworICAgICAgICAvLyBub3cgcnVuIHRoZSB0ZXN0IGNvZGUKKyAgICAgICAgdHJhY2UoJy0gJHthcmdzLm51bUl0ZXJhdGlvbnN9IGl0ZXJhdGlvbnMnKTsKKyAgICAgICAgZm9yKCBpIGluIDAgLi4uIGFyZ3MubnVtSXRlcmF0aW9ucykgeworICAgICAgICAgICAgQ2xpZW50VGVzdCggdHJhbnNwb3J0LCBwcm90b2NvbCwgYXJncywgcnNsdCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gSGF4ZUJhc2ljc1Rlc3QoIGFyZ3MgOiBBcmd1bWVudHMsIHJzbHQgOiBUZXN0UmVzdWx0cykgOiBWb2lkCisgICAgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHRlc3QgYSBmZXcgYmFzaWMgdGhpbmdzIHVzZWQgaW4gdGhlIENsaWVudFRlc3QKKyAgICAgICAgLy8gQW55dGhpbmcgZWxzZSBiZXlvbmQgdGhpcyBzY29wZSBzaG91bGQgZ28gaW50byAvbGliL2hheGUvIGluc3RlYWQKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMpOworCisgICAgICAgIHZhciBtYXAzMiA9IG5ldyBJbnRNYXA8SW50MzI+KCk7CisgICAgICAgIHZhciBtYXA2NCA9IG5ldyBJbnQ2NE1hcDxJbnQzMj4oKTsKKworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIua2V5cygpLmhhc05leHQoKSA9PSBtYXA2NC5rZXlzKCkuaGFzTmV4dCgpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzEiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggNDcxMSkgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDQ3LDExKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMiIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIucmVtb3ZlKCA0NzExKSA9PSBtYXA2NC5yZW1vdmUoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMzIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQ3MTEpID09IG1hcDY0LmdldCggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzQiKTsKKworICAgICAgICBtYXAzMi5zZXQoIDQyLCA4MTUpOworICAgICAgICBtYXA2NC5zZXQoIEludDY0Lm1ha2UoMCw0MiksIDgxNSk7CisgICAgICAgIG1hcDMyLnNldCggLTUxNywgMjMpOworICAgICAgICBtYXA2NC5zZXQoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSksIDIzKTsKKyAgICAgICAgbWFwMzIuc2V0KCAwLCAtMTIzKTsKKyAgICAgICAgbWFwNjQuc2V0KCBJbnQ2NC5tYWtlKDAsMCksIC0xMjMpOworCisgICAgICAgIC8vdHJhY2UoJ21hcDMyID0gJG1hcDMyJyk7CisgICAgICAgIC8vdHJhY2UoJ21hcDY0ID0gJG1hcDY0Jyk7CisKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmtleXMoKS5oYXNOZXh0KCkgPT0gbWFwNjQua2V5cygpLmhhc05leHQoKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxMCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCA0NzExKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxMSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCAtNTE3KSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzEyIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQyKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoMCw0MikpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzEzIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDApID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSgwLDApKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxNCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0NzExKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxNSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCAtNTE3KSA9PSBtYXA2NC5nZXQoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzE2Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQyKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoMCw0MikpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgI0ludDY0Lm1ha2UoLTUsMTcpIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDApID09IG1hcDY0LmdldCggSW50NjQubWFrZSgwLDApKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxOCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIucmVtb3ZlKCA0NzExKSA9PSBtYXA2NC5yZW1vdmUoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICMxOSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIucmVtb3ZlKCAtNTE3KSA9PSBtYXA2NC5yZW1vdmUoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzIwIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQ3MTEpID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzIxIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIC01MTcpID09IG1hcDY0LmV4aXN0cyggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjIiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggNDIpID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSgwLDQyKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjMiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmV4aXN0cyggMCkgPT0gbWFwNjQuZXhpc3RzKCBJbnQ2NC5tYWtlKDAsMCkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzI0Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIDQ3MTEpID09IG1hcDY0LmdldCggSW50NjQubWFrZSg0NywxMSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzI1Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5nZXQoIC01MTcpID09IG1hcDY0LmdldCggSW50NjQubmVnKEludDY0Lm1ha2UoMCw1MTcpKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjYiKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggNDIpID09IG1hcDY0LmdldCggSW50NjQubWFrZSgwLDQyKSksICJJbnQ2NE1hcDxJbnQzMj4gVGVzdCAjMjciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmdldCggMCkgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDAsMCkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzI4Iik7CisKKyAgICAgICAgbWFwMzIuc2V0KCA0MiwgMSk7CisgICAgICAgIG1hcDY0LnNldCggSW50NjQubWFrZSgwLDQyKSwgMSk7CisgICAgICAgIG1hcDMyLnNldCggLTUxNywgLTIpOworICAgICAgICBtYXA2NC5zZXQoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSksIC0yKTsKKyAgICAgICAgbWFwMzIuc2V0KCAwLCAzKTsKKyAgICAgICAgbWFwNjQuc2V0KCBJbnQ2NC5tYWtlKDAsMCksIDMpOworCisgICAgICAgIHZhciBjMzIgPSAwOworICAgICAgICB2YXIga3N1bTMyID0gMDsKKyAgICAgICAgZm9yIChrZXkgaW4gbWFwMzIua2V5cygpKSB7CisgICAgICAgICAgICArK2MzMjsKKyAgICAgICAgICAgIGtzdW0zMiArPSBrZXk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGM2NCA9IDA7CisgICAgICAgIHZhciBrc3VtNjQgPSBJbnQ2NC5tYWtlKDAsMCk7CisgICAgICAgIGZvciAoa2V5IGluIG1hcDY0LmtleXMoKSkgeworICAgICAgICAgICAgKytjNjQ7CisgICAgICAgICAgICBrc3VtNjQgPSBJbnQ2NC5hZGQoIGtzdW02NCwga2V5KTsKKyAgICAgICAgfQorICAgICAgICByc2x0LkV4cGVjdCggYzMyID09IGM2NCwgIkludDY0TWFwPEludDMyPiBUZXN0ICMzMCIpOworICAgICAgICByc2x0LkV4cGVjdCggJyRrc3VtNjQnID09ICcka3N1bTMyJywgJyRrc3VtNjQgPT0gJGtzdW0zMiAgIFRlc3QgIzMxJyk7CisKKyAgICAgICAgLy9jb21wYXJlIHdpdGhvdXQgc3BhY2VzIGJlY2F1c2UgZGlmZmVyIGluIHBocCBhbmQgY3BwCisgICAgICAgIHZhciBzMzIgPSBtYXAzMi50b1N0cmluZygpLnJlcGxhY2UoJyAnLCAnJyk7CisgICAgICAgIHZhciBzNjQgPSBtYXA2NC50b1N0cmluZygpLnJlcGxhY2UoJyAnLCAnJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBzMzIgPT0gczY0LCAiSW50NjRNYXA8SW50MzI+LnRvU3RyaW5nKCk6ICIgKyAnICgiJHMzMiIgPT0gIiRzNjQiKSBUZXN0ICMzMicpOworCisgICAgICAgIG1hcDMyLnJlbW92ZSggNDIpOworICAgICAgICBtYXA2NC5yZW1vdmUoIEludDY0Lm1ha2UoMCw0MikpOworICAgICAgICBtYXAzMi5yZW1vdmUoIC01MTcpOworICAgICAgICBtYXA2NC5yZW1vdmUoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpOworICAgICAgICBtYXAzMi5yZW1vdmUoIDApOworICAgICAgICBtYXA2NC5yZW1vdmUoIEludDY0Lm1ha2UoMCwwKSk7CisKKyAgICAgICAgcnNsdC5FeHBlY3QoIG1hcDMyLmtleXMoKS5oYXNOZXh0KCkgPT0gbWFwNjQua2V5cygpLmhhc05leHQoKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5MCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCA0NzExKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5MSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZXhpc3RzKCAtNTE3KSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsNTE3KSkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzkyIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDQyKSA9PSBtYXA2NC5leGlzdHMoIEludDY0Lm1ha2UoMCw0MikpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzkzIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBtYXAzMi5leGlzdHMoIDApID09IG1hcDY0LmV4aXN0cyggSW50NjQubWFrZSgwLDApKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5NCIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0NzExKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoNDcsMTEpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5NSIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCAtNTE3KSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoLTUsMTcpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5NiIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCA0MikgPT0gbWFwNjQuZ2V0KCBJbnQ2NC5tYWtlKDAsNDIpKSwgIkludDY0TWFwPEludDMyPiBUZXN0ICM5NyIpOworICAgICAgICByc2x0LkV4cGVjdCggbWFwMzIuZ2V0KCAwKSA9PSBtYXA2NC5nZXQoIEludDY0Lm1ha2UoMCwgMCkpLCAiSW50NjRNYXA8SW50MzI+IFRlc3QgIzk4Iik7CisgICAgfQorCisKKyAgICAvLyBjb3JlIG1vZHVsZSB1bml0IHRlc3RzCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNb2R1bGVVbml0VGVzdHMoIGFyZ3MgOiBBcmd1bWVudHMsIHJzbHQgOiBUZXN0UmVzdWx0cykgOiBWb2lkIHsKKyAgICAgICAgI2lmIGRlYnVnCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJpdENvbnZlcnRlci5Vbml0VGVzdCgpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHRydWUsICdCaXRDb252ZXJ0ZXIuVW5pdFRlc3QgIFRlc3QgIzEwMCcpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogRHluYW1pYykgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAnQml0Q29udmVydGVyLlVuaXRUZXN0OiAkZSAgVGVzdCAjMTAwJyk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgWmlnWmFnLlVuaXRUZXN0KCk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ1ppZ1phZy5Vbml0VGVzdCAgVGVzdCAjMTAxJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBEeW5hbWljKSB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICdaaWdaYWcuVW5pdFRlc3Q6ICRlICBUZXN0ICMxMDEnKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmQKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQnl0ZXNUb0hleChkYXRhIDogQnl0ZXMpIDogU3RyaW5nIHsKKyAgICAgICAgdmFyIGhleCA9ICIiOworICAgICAgICBmb3IgKCBpIGluIDAgLi4uIGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBoZXggKz0gU3RyaW5nVG9vbHMuaGV4KCBkYXRhLmdldChpKSwgMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhleDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFByZXBhcmVUZXN0RGF0YShyYW5kb21EaXN0IDogQm9vbCkgOiBCeXRlcyAgICB7CisgICAgICAgIHZhciByZXR2YWwgPSBCeXRlcy5hbGxvYygweDEwMCk7CisgICAgICAgIHZhciBpbml0TGVuIDogSW50ID0gKHJldHZhbC5sZW5ndGggPiAweDEwMCA/IDB4MTAwIDogcmV0dmFsLmxlbmd0aCk7CisKKyAgICAgICAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKCFyYW5kb21EaXN0KSB7CisgICAgICAgICAgICBmb3IgKGkgaW4gMCAuLi4gaW5pdExlbikgeworICAgICAgICAgICAgICAgIHJldHZhbC5zZXQoaSwgaSAlIDB4MTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKworICAgICAgICAvLyByYW5kb20gZGlzdHJpYnV0aW9uCisgICAgICAgIGZvciAoaSBpbiAwIC4uLiBpbml0TGVuKSB7CisgICAgICAgICAgICByZXR2YWwuc2V0KGksIDApOworICAgICAgICB9CisgICAgICAgIGZvciAoaSBpbiAxIC4uLiBpbml0TGVuKSB7CisgICAgICAgICAgICB3aGlsZSggdHJ1ZSkgeworICAgICAgICAgICAgICAgIHZhciBuZXh0UG9zID0gU3RkLnJhbmRvbShpbml0TGVuKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsLmdldChuZXh0UG9zKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbC5zZXQoIG5leHRQb3MsIGkgJSAweDEwMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDbGllbnRUZXN0KCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBwcm90b2NvbCA6IFRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgOiBBcmd1bWVudHMsIHJzbHQgOiBUZXN0UmVzdWx0cykgOiBWb2lkCisgICAgeworICAgICAgICB2YXIgY2xpZW50ID0gbmV3IFRocmlmdFRlc3RJbXBsKHByb3RvY29sLHByb3RvY29sKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdHJhbnNwb3J0LmlzT3BlbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd1bmFibGUgdG8gb3BlbiB0cmFuc3BvcnQ6ICRlJyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd1bmFibGUgdG8gb3BlbiB0cmFuc3BvcnQ6ICRlJyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpOworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfRVhDRVBUSU9OUyk7CisKKyAgICAgICAgLy8gaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gYXJnCisgICAgICAgIHRyYWNlKCd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpJyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikgc2hvdWxkIHRocm93Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBYY2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGUubWVzc2FnZSA9PSAiWGNlcHRpb24iLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgZS5tZXNzYWdlID09ICJYY2VwdGlvbiInKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBlLmVycm9yQ29kZSA9PSAxMDAxLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgZS5lcnJvckNvZGUgPT0gMTAwMScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgJHtlfSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikgIC0gICRlJyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAgICAgdHJhY2UoJ3Rlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKScpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKSBzaG91bGQgdGhyb3cnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCB0cnVlLCAndGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpICAtICAkZSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKSAgLSAgJGUnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlb3BlbiB0aGUgdHJhbnNwb3J0LCBqdXN0IGluIGNhc2UgdGhlIHNlcnZlciBjbG9zZWQgaGlzIGVuZAorICAgICAgICBpZiAodHJhbnNwb3J0LmlzT3BlbigpKQorICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisKKyAgICAgICAgLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICAgICAgdHJhY2UoJ3Rlc3RFeGNlcHRpb24oImJsYSIpJyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiYmxhIik7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpIHNob3VsZCBub3QgdGhyb3cnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpICAtICAke2V9IDogJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiYmxhIikgIC0gICRlJyk7CisgICAgICAgIH0KKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX0JBU0VUWVBFUyk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3RWb2lkKCknKTsKKyAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgICAgIHRyYWNlKCcgPSB2b2lkJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KHRydWUsInRlc3RWb2lkKCkiKTsgIC8vIGJ1bXAgY291bnRlcgorCisgICAgICAgIHRyYWNlKCd0ZXN0Qm9vbCgke3RydWV9KScpOworICAgICAgICB2YXIgYiA9IGNsaWVudC50ZXN0Qm9vbCh0cnVlKTsKKyAgICAgICAgdHJhY2UoJyA9ICRiJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KGIsICckYiA9PSAiJHt0cnVlfSInKTsKKyAgICAgICAgdHJhY2UoJ3Rlc3RCb29sKCR7ZmFsc2V9KScpOworICAgICAgICBiID0gY2xpZW50LnRlc3RCb29sKGZhbHNlKTsKKyAgICAgICAgdHJhY2UoJyA9ICRiJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAhIGIsICckYiA9PSAiJHtmYWxzZX0iJyk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3RTdHJpbmcoIlRlc3QiKScpOworICAgICAgICB2YXIgcyA9IGNsaWVudC50ZXN0U3RyaW5nKCJUZXN0Iik7CisgICAgICAgIHRyYWNlKCcgPSAiJHMiJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KHMgPT0gIlRlc3QiLCAnJHMgPT0gIlRlc3QiJyk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3RCeXRlKDEpJyk7CisgICAgICAgIHZhciBpOCA9IGNsaWVudC50ZXN0Qnl0ZSgxKTsKKyAgICAgICAgdHJhY2UoJyA9ICRpOCcpOworICAgICAgICByc2x0LkV4cGVjdChpOCA9PSAxLCAnJGk4ID09IDEnKTsKKworICAgICAgICB0cmFjZSgndGVzdEkzMigtMSknKTsKKyAgICAgICAgdmFyIGkzMiA9IGNsaWVudC50ZXN0STMyKC0xKTsKKyAgICAgICAgdHJhY2UoJyA9ICRpMzInKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoaTMyID09IC0xLCAnJGkzMiA9PSAtMScpOworCisgICAgICAgIHRyYWNlKCd0ZXN0STY0KC0zNDM1OTczODM2OCknKTsKKyAgICAgICAgdmFyIGk2NCA9IGNsaWVudC50ZXN0STY0KCBJbnQ2NC5tYWtlKCAweEZGRkZGRkY4LCAweDAwMDAwMDAwKSk7IC8vIC0zNDM1OTczODM2OAorICAgICAgICB0cmFjZSgnID0gJGk2NCcpOworICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggaTY0LCBJbnQ2NC5tYWtlKCAweEZGRkZGRkY4LCAweDAwMDAwMDAwKSkgPT0gMCwKKyAgICAgICAgICAgICAgICAgICAgIEludDY0LnRvU3RyKGk2NCkgKyIgPT0gIitJbnQ2NC50b1N0cihJbnQ2NC5tYWtlKCAweEZGRkZGRkY4LCAweDAwMDAwMDAwKSkpOworCisgICAgICAgIC8vIGVkZ2UgY2FzZTogdGhlIGxhcmdlc3QgbmVnYXRpdmUgSW50NjQgaGFzIG5vIHBvc2l0aXZlIEludDY0IGVxdWl2YWxlbnQKKyAgICAgICAgdHJhY2UoJ3Rlc3RJNjQoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpJyk7CisgICAgICAgIGk2NCA9IGNsaWVudC50ZXN0STY0KCBJbnQ2NC5tYWtlKCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKSk7IC8vIC05MjIzMzcyMDM2ODU0Nzc1ODA4CisgICAgICAgIHRyYWNlKCcgPSAkaTY0Jyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBpNjQsIEludDY0Lm1ha2UoIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgSW50NjQudG9TdHIoaTY0KSArIiA9PSAiK0ludDY0LnRvU3RyKEludDY0Lm1ha2UoIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApKSk7CisKKyAgICAgICAgdHJhY2UoJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpJyk7CisgICAgICAgIHZhciBkdWIgPSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7CisgICAgICAgIHRyYWNlKCcgPSAkZHViJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KGR1YiA9PSA1LjMyNTA5ODIzNSwgJyRkdWIgPT0gNS4zMjUwOTgyMzUnKTsKKworICAgICAgICB2YXIgYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKHRydWUpOworICAgICAgICB0cmFjZSgndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKScpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGJpbkluID0gY2xpZW50LnRlc3RCaW5hcnkoYmluT3V0KTsKKyAgICAgICAgICAgIHRyYWNlKCd0ZXN0QmluYXJ5KCkgPSAnK0J5dGVzVG9IZXgoYmluSW4pKTsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBiaW5Jbi5sZW5ndGggPT0gYmluT3V0Lmxlbmd0aCwgJyR7YmluSW4ubGVuZ3RofSA9PSAke2Jpbk91dC5sZW5ndGh9Jyk7CisgICAgICAgICAgICB2YXIgbGVuID0gKChiaW5Jbi5sZW5ndGggPCBiaW5PdXQubGVuZ3RoKSAgPyAgYmluSW4ubGVuZ3RoICA6IGJpbk91dC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChvZnMgaW4gMCAuLi4gbGVuKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpbkluLmdldChvZnMpICE9IGJpbk91dC5nZXQob2ZzKSkgeworICAgICAgICAgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0QmluYXJ5KCcrQnl0ZXNUb0hleChiaW5PdXQpKycpOiBjb250ZW50IG1pc21hdGNoIGF0IG9mZnNldCAkb2ZzJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKTogJytlLmVycm9yTXNnKTsgIC8vIG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIKKyAgICAgICAgfQorCisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9TVFJVQ1RTKTsKKworICAgICAgICB0cmFjZSgndGVzdFN0cnVjdCh7Ilplcm8iLCAxLCAtMywgLTV9KScpOworICAgICAgICB2YXIgbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgby5zdHJpbmdfdGhpbmcgPSAiWmVybyI7CisgICAgICAgIG8uYnl0ZV90aGluZyA9IDE7CisgICAgICAgIG8uaTMyX3RoaW5nID0gLTM7CisgICAgICAgIG8uaTY0X3RoaW5nID0gSW50NjQubWFrZSgwLC01KTsKKyAgICAgICAgdmFyIGkgPSBjbGllbnQudGVzdFN0cnVjdChvKTsKKyAgICAgICAgdHJhY2UoJyA9IHsiJyArIGkuc3RyaW5nX3RoaW5nICsgJyIsICcgKyBpLmJ5dGVfdGhpbmcgKycsICcKKyAgICAgICAgICAgICAgICAgICAgICArIGkuaTMyX3RoaW5nICsnLCAnKyBJbnQ2NC50b1N0cihpLmk2NF90aGluZykgKyAnfScpOworICAgICAgICByc2x0LkV4cGVjdCggaS5zdHJpbmdfdGhpbmcgPT0gby5zdHJpbmdfdGhpbmcsICJpLnN0cmluZ190aGluZyA9PSBvLnN0cmluZ190aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggaS5ieXRlX3RoaW5nID09IG8uYnl0ZV90aGluZywgImkuYnl0ZV90aGluZyA9PSBvLmJ5dGVfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuaTMyX3RoaW5nID09IG8uaTMyX3RoaW5nLCAiaS5pNjRfdGhpbmcgPT0gby5pNjRfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuaTMyX3RoaW5nID09IG8uaTMyX3RoaW5nLCAiaS5pNjRfdGhpbmcgPT0gby5pNjRfdGhpbmciKTsKKworICAgICAgICB0cmFjZSgndGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pJyk7CisgICAgICAgIHZhciBvMiA9IG5ldyBYdHJ1Y3QyKCk7CisgICAgICAgIG8yLmJ5dGVfdGhpbmcgPSAxOworICAgICAgICBvMi5zdHJ1Y3RfdGhpbmcgPSBvOworICAgICAgICBvMi5pMzJfdGhpbmcgPSA1OworICAgICAgICB2YXIgaTIgPSBjbGllbnQudGVzdE5lc3QobzIpOworICAgICAgICBpID0gaTIuc3RydWN0X3RoaW5nOworICAgICAgICB0cmFjZSgiID0geyIgKyBpMi5ieXRlX3RoaW5nICsgIiwge1wiIiArIGkuc3RyaW5nX3RoaW5nICsgIlwiLCAiCisgICAgICAgICAgICAgICsgaS5ieXRlX3RoaW5nICsgIiwgIiArIGkuaTMyX3RoaW5nICsgIiwgIiArIEludDY0LnRvU3RyKGkuaTY0X3RoaW5nKSArICJ9LCAiCisgICAgICAgICAgICAgICsgaTIuaTMyX3RoaW5nICsgIn0iKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkyLmJ5dGVfdGhpbmcgPT0gbzIuYnl0ZV90aGluZywgImkyLmJ5dGVfdGhpbmcgPT0gbzIuYnl0ZV90aGluZyIpOworICAgICAgICByc2x0LkV4cGVjdCggaTIuaTMyX3RoaW5nID09IG8yLmkzMl90aGluZywgImkyLmkzMl90aGluZyA9PSBvMi5pMzJfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuc3RyaW5nX3RoaW5nID09IG8uc3RyaW5nX3RoaW5nLCAiaS5zdHJpbmdfdGhpbmcgPT0gby5zdHJpbmdfdGhpbmciKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIGkuYnl0ZV90aGluZyA9PSBvLmJ5dGVfdGhpbmcsICJpLmJ5dGVfdGhpbmcgPT0gby5ieXRlX3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBpLmkzMl90aGluZyA9PSBvLmkzMl90aGluZywgImkuaTMyX3RoaW5nID09IG8uaTMyX3RoaW5nIik7CisgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBpLmk2NF90aGluZywgby5pNjRfdGhpbmcpID09IDAsICJpLmk2NF90aGluZyA9PSBvLmk2NF90aGluZyIpOworCisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9DT05UQUlORVJTKTsKKworICAgICAgICB2YXIgbWFwb3V0ID0gbmV3IEludE1hcDwgaGF4ZS5JbnQzMj4oKTsKKyAgICAgICAgZm9yICggaiBpbiAwIC4uLiA1KQorICAgICAgICB7CisgICAgICAgICAgICBtYXBvdXQuc2V0KGosIGogLSAxMCk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoInRlc3RNYXAoeyIpOworICAgICAgICB2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBrZXkgaW4gbWFwb3V0LmtleXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZShrZXkgKyAiID0+ICIgKyBtYXBvdXQuZ2V0KGtleSkpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9KSIpOworCisgICAgICAgIHZhciBtYXBpbiA9IGNsaWVudC50ZXN0TWFwKG1hcG91dCk7CisKKyAgICAgICAgdHJhY2UoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IoIGtleSBpbiBtYXBpbi5rZXlzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiAiICsgbWFwaW4uZ2V0KGtleSkpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIG1hcGluLmdldChrZXkpID09IG1hcG91dC5nZXQoa2V5KSwgJyBtYXBpbi5nZXQoJGtleSkgPT0gbWFwb3V0LmdldCgka2V5KScpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9Iik7CisgICAgICAgIGZvcigga2V5IGluIG1hcG91dC5rZXlzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KG1hcGluLmV4aXN0cyhrZXkpLCAnbWFwaW4uZXhpc3RzKCRrZXkpJyk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgbGlzdG91dCA9IG5ldyBMaXN0PEludD4oKTsKKyAgICAgICAgZm9yIChqIGluIC0yIC4uLiAzKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0b3V0LmFkZChqKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgidGVzdExpc3QoeyIpOworICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciggaiBpbiBsaXN0b3V0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKGopOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9KSIpOworCisgICAgICAgIHZhciBsaXN0aW4gPSBjbGllbnQudGVzdExpc3QobGlzdG91dCk7CisKKyAgICAgICAgdHJhY2UoIiA9IHsiKTsKKyAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IoIGogaW4gbGlzdGluKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKGopOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9Iik7CisKKyAgICAgICAgcnNsdC5FeHBlY3QobGlzdGluLmxlbmd0aCA9PSBsaXN0b3V0Lmxlbmd0aCwgImxpc3Rpbi5sZW5ndGggPT0gbGlzdG91dC5sZW5ndGgiKTsKKyAgICAgICAgdmFyIGxpdGVyb3V0ID0gbGlzdG91dC5pdGVyYXRvcigpOworICAgICAgICB2YXIgbGl0ZXJpbiA9IGxpc3Rpbi5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSggbGl0ZXJpbi5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KGxpdGVyaW4ubmV4dCgpID09IGxpdGVyb3V0Lm5leHQoKSwgImxpdGVyaW5baV0gPT0gbGl0ZXJvdXRbaV0iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vc2V0CisgICAgICAgIHZhciBzZXRvdXQgPSBuZXcgSW50U2V0KCk7CisgICAgICAgIGZvciAoaiBpbiAtMiAuLi4gMykKKyAgICAgICAgeworICAgICAgICAgICAgc2V0b3V0LmFkZChqKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgidGVzdFNldCh7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBqIGluIHNldG91dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZShqKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZSgifSkiKTsKKworICAgICAgICB2YXIgc2V0aW4gPSBjbGllbnQudGVzdFNldChzZXRvdXQpOworCisgICAgICAgIHRyYWNlKCIgPSB7Iik7CisgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBqIGluIHNldGluKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZSgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNlKGopOworICAgICAgICAgICAgcnNsdC5FeHBlY3Qoc2V0b3V0LmNvbnRhaW5zKGopLCAnc2V0b3V0LmNvbnRhaW5zKCRqKScpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9Iik7CisgICAgICAgIHJzbHQuRXhwZWN0KHNldGluLnNpemUgPT0gc2V0b3V0LnNpemUsICJzZXRpbi5sZW5ndGggPT0gc2V0b3V0Lmxlbmd0aCIpOworCisKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICAgIHZhciByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5PTkUpOworICAgICAgICB0cmFjZSgiID0gIiArIHJldCk7CisgICAgICAgIHJzbHQuRXhwZWN0KHJldCA9PSBOdW1iZXJ6Lk9ORSwgJyRyZXQgPT0gTnVtYmVyei5PTkUnKTsKKworICAgICAgICB0cmFjZSgidGVzdEVudW0oVFdPKSIpOworICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOworICAgICAgICB0cmFjZSgiID0gIiArIHJldCk7CisgICAgICAgIHJzbHQuRXhwZWN0KHJldCA9PSBOdW1iZXJ6LlRXTywgJyRyZXQgPT0gTnVtYmVyei5UV08nKTsKKworICAgICAgICB0cmFjZSgidGVzdEVudW0oVEhSRUUpIik7CisgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICAgICAgdHJhY2UoIiA9ICIgKyByZXQpOworICAgICAgICByc2x0LkV4cGVjdChyZXQgPT0gTnVtYmVyei5USFJFRSwgJyRyZXQgPT0gTnVtYmVyei5USFJFRScpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKKyAgICAgICAgdHJhY2UoIiA9ICIgKyByZXQpOworICAgICAgICByc2x0LkV4cGVjdChyZXQgPT0gTnVtYmVyei5GSVZFLCAnJHJldCA9PSBOdW1iZXJ6LkZJVkUnKTsKKworICAgICAgICB0cmFjZSgidGVzdEVudW0oRUlHSFQpIik7CisgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKKyAgICAgICAgdHJhY2UoIiA9ICIgKyByZXQpOworICAgICAgICByc2x0LkV4cGVjdChyZXQgPT0gTnVtYmVyei5FSUdIVCwgJyRyZXQgPT0gTnVtYmVyei5FSUdIVCcpOworCisgICAgICAgIHRyYWNlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgIHZhciB1aWQgPSBjbGllbnQudGVzdFR5cGVkZWYoIEludDY0Lm1ha2UoIDB4MTE5RDAsIDB4N0UwODY3MUIpKTsgIC8vIDMwOTg1ODIzNTA4MjUyMworICAgICAgICB0cmFjZSgiID0gIiArIHVpZCk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCB1aWQsIEludDY0Lm1ha2UoIDB4MTE5RDAsIDB4N0UwODY3MUIpKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgSW50NjQudG9TdHIodWlkKSsiID09ICIrSW50NjQudG9TdHIoSW50NjQubWFrZSggMHgxMTlEMCwgMHg3RTA4NjcxQikpKTsKKworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIFRlc3RSZXN1bHRzLkVYSVRDT0RFX0ZBSUxCSVRfQ09OVEFJTkVSUyk7CisKKyAgICAgICAgdHJhY2UoInRlc3RNYXBNYXAoMSkiKTsKKyAgICAgICAgdmFyIG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgICAgIHRyYWNlKCIgPSB7Iik7CisgICAgICAgIGZvcigga2V5IGluIG1tLmtleXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiB7Iik7CisgICAgICAgICAgICB2YXIgbTIgPSBtbS5nZXQoa2V5KTsKKyAgICAgICAgICAgIGZvciggazIgaW4gbTIua2V5cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKGsyICsgIiA9PiAiICsgbTIuZ2V0KGsyKSArICIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2UoIn0sICIpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCJ9Iik7CisKKyAgICAgICAgdmFyIHBvcyA9IG1tLmdldCg0KTsKKyAgICAgICAgdmFyIG5lZyA9IG1tLmdldCgtNCk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAocG9zICE9IG51bGwpICYmIChuZWcgIT0gbnVsbCksICIocG9zICE9IG51bGwpICYmIChuZWcgIT0gbnVsbCkiKTsKKyAgICAgICAgZm9yIChpIGluIDEgLi4uIDUpIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBwb3MuZ2V0KGkpID09IGksICdwb3MuZ2V0KCRpKSA9PSAkaScpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIG5lZy5nZXQoLWkpID09IC1pLCAnbmVnLmdldCgtJGkpID09IC0kaScpOworICAgICAgICB9CisgICAgICAgIHJzbHQuRXhwZWN0KCAhIHBvcy5leGlzdHMoMCksICchcG9zLmV4aXN0cygwKScpOworICAgICAgICByc2x0LkV4cGVjdCggISBuZWcuZXhpc3RzKC0wKSwgJyFuZWcuZXhpc3RzKC0wKScpOworICAgICAgICByc2x0LkV4cGVjdCggISBwb3MuZXhpc3RzKDQyKSwgJyFwb3MuZXhpc3RzKDQyKScpOworICAgICAgICByc2x0LkV4cGVjdCggISBuZWcuZXhpc3RzKC00MiksICchbmVnLmV4aXN0cygtNDIpJyk7CisKKworICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCBUZXN0UmVzdWx0cy5FWElUQ09ERV9GQUlMQklUX1NUUlVDVFMpOworCisgICAgICAgIHZhciBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICAgICAgaW5zYW5lLnVzZXJNYXAgPSBuZXcgSW50TWFwPCBJbnQ2ND4oKTsKKyAgICAgICAgaW5zYW5lLnVzZXJNYXAuc2V0KCBOdW1iZXJ6LkZJVkUsIEludDY0Lm1ha2UoMCw1MDAwKSk7CisgICAgICAgIHZhciB0cnVjayA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgdHJ1Y2suc3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgdHJ1Y2suYnl0ZV90aGluZyA9IDg7CisgICAgICAgIHRydWNrLmkzMl90aGluZyA9IDg7CisgICAgICAgIHRydWNrLmk2NF90aGluZyA9IEludDY0Lm1ha2UoMCw4KTsKKyAgICAgICAgaW5zYW5lLnh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgIGluc2FuZS54dHJ1Y3RzLmFkZCh0cnVjayk7CisgICAgICAgIHRyYWNlKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgICB2YXIgd2hvYSA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKKyAgICAgICAgdHJhY2UoIiA9IHsiKTsKKyAgICAgICAgZm9yKCBrZXkgaW4gd2hvYS5rZXlzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB2YWwgPSB3aG9hLmdldChrZXkpOworICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgIGZvciggazIgaW4gdmFsLmtleXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdjIgPSB2YWwuZ2V0KGsyKTsKKworICAgICAgICAgICAgICAgIHRyYWNlKGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgdmFyIHVzZXJNYXAgPSB2Mi51c2VyTWFwOworCisgICAgICAgICAgICAgICAgdHJhY2UoInsiKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrMyBpbiB1c2VyTWFwLmtleXMoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UoazMgKyAiID0+ICIgKyB1c2VyTWFwLmdldChrMykgKyAiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFjZSgibnVsbCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICB2YXIgeHRydWN0cyA9IHYyLnh0cnVjdHM7CisKKyAgICAgICAgICAgICAgICB0cmFjZSgieyIpOworICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UoIntcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB4LmJ5dGVfdGhpbmcgKyAiLCAiICsgeC5pMzJfdGhpbmcgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHguaTMyX3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNlKCJudWxsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNlKCJ9Iik7CisKKyAgICAgICAgICAgICAgICB0cmFjZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZSgifSwgIik7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoIn0iKTsKKworCisJCS8qKgorCQkqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworCQkqCisJCSogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisJCSogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorCQkqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKwkJKiAgICAgICAgICB9LAorCQkqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKwkJKiAgIH0KKwkJKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKwkJKi8KKwkJCisgICAgICAgIHZhciBmaXJzdF9tYXAgPSB3aG9hLmdldChJbnQ2NC5tYWtlKDAsMSkpOworICAgICAgICB2YXIgc2Vjb25kX21hcCA9IHdob2EuZ2V0KEludDY0Lm1ha2UoMCwyKSk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAoZmlyc3RfbWFwICE9IG51bGwpICYmIChzZWNvbmRfbWFwICE9IG51bGwpLCAiKGZpcnN0X21hcCAhPSBudWxsKSAmJiAoc2Vjb25kX21hcCAhPSBudWxsKSIpOworICAgICAgICBpZiAoKGZpcnN0X21hcCAhPSBudWxsKSAmJiAoc2Vjb25kX21hcCAhPSBudWxsKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNyYXp5MiA9IGZpcnN0X21hcC5nZXQoTnVtYmVyei5UV08pOworICAgICAgICAgICAgdmFyIGNyYXp5MyA9IGZpcnN0X21hcC5nZXQoTnVtYmVyei5USFJFRSk7CisgICAgICAgICAgICB2YXIgbG9vbmV5ID0gc2Vjb25kX21hcC5nZXQoTnVtYmVyei5TSVgpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIChjcmF6eTIgIT0gbnVsbCkgJiYgKGNyYXp5MyAhPSBudWxsKSAmJiAobG9vbmV5ICE9IG51bGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgIihjcmF6eTIgIT0gbnVsbCkgJiYgKGNyYXp5MyAhPSBudWxsKSAmJiAobG9vbmV5ICE9IG51bGwpIik7CisKKyAgICAgICAgICAgIHZhciBjcnoyaXRlciA9IGNyYXp5Mi54dHJ1Y3RzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB2YXIgY3J6M2l0ZXIgPSBjcmF6eTMueHRydWN0cy5pdGVyYXRvcigpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGNyejJpdGVyLmhhc05leHQoKSAmJiBjcnozaXRlci5oYXNOZXh0KCksICJjcnoyaXRlci5oYXNOZXh0KCkgJiYgY3J6M2l0ZXIuaGFzTmV4dCgpIik7CisgICAgICAgICAgICB2YXIgZ29vZGJ5ZTIgPSBjcnoyaXRlci5uZXh0KCk7CisgICAgICAgICAgICB2YXIgZ29vZGJ5ZTMgPSBjcnozaXRlci5uZXh0KCk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggISAoY3J6Mml0ZXIuaGFzTmV4dCgpIHx8IGNyejNpdGVyLmhhc05leHQoKSksICIhIChjcnoyaXRlci5oYXNOZXh0KCkgfHwgY3J6M2l0ZXIuaGFzTmV4dCgpKSIpOworCisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkyLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSksIGluc2FuZS51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpKSA9PSAwLCAiY3JhenkyLnVzZXJNYXBbNV0gPT0gaW5zYW5lLnVzZXJNYXBbNV0iKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTIuc3RyaW5nX3RoaW5nLCAidHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUyLnN0cmluZ190aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUyLmJ5dGVfdGhpbmcsICJ0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMi5ieXRlX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMi5pMzJfdGhpbmcsICJ0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUyLmkzMl90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHRydWNrLmk2NF90aGluZywgZ29vZGJ5ZTIuaTY0X3RoaW5nKSA9PSAwLCAidHJ1Y2suaTY0X3RoaW5nICA9PSBnb29kYnllMi5pNjRfdGhpbmciKTsKKworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGNyYXp5My51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpLCBpbnNhbmUudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSkgPT0gMCwgImNyYXp5My51c2VyTWFwWzVdID09IGluc2FuZS51c2VyTWFwWzVdIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUzLnN0cmluZ190aGluZywgInRydWNrLnN0cmluZ190aGluZyA9PSBnb29kYnllMy5zdHJpbmdfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMy5ieXRlX3RoaW5nLCAidHJ1Y2suYnl0ZV90aGluZyAgPT0gZ29vZGJ5ZTMuYnl0ZV90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmkzMl90aGluZyAgPT0gZ29vZGJ5ZTMuaTMyX3RoaW5nLCAidHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMy5pMzJfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCB0cnVjay5pNjRfdGhpbmcsIGdvb2RieWUzLmk2NF90aGluZykgPT0gMCwgInRydWNrLmk2NF90aGluZyAgPT0gZ29vZGJ5ZTMuaTY0X3RoaW5nIik7CisJCQkKKwkJCXJzbHQuRXhwZWN0KCAhIGxvb25leS5pc1NldCgxKSwgIiEgbG9vbmV5LmlzU2V0KDEpIik7CisJCQlyc2x0LkV4cGVjdCggISBsb29uZXkuaXNTZXQoMiksICIhIGxvb25leS5pc1NldCgyKSIpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGFyZzAgPSAxOworICAgICAgICB2YXIgYXJnMSA9IDI7CisgICAgICAgIHZhciBhcmcyID0gSW50NjQubWFrZSggMHg3RkZGRkZGRiwweEZGRkZGRkZGKTsKKyAgICAgICAgdmFyIG11bHRpRGljdCA9IG5ldyBJbnRNYXA8IFN0cmluZz4oKTsKKyAgICAgICAgbXVsdGlEaWN0LnNldCgxLCAib25lIik7CisgICAgICAgIHZhciBhcmc0ID0gTnVtYmVyei5GSVZFOworICAgICAgICB2YXIgYXJnNSA9IEludDY0Lm1ha2UoMCw1MDAwMDAwKTsKKyAgICAgICAgdHJhY2UoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgdmFyIG11bHRpUmVzcG9uc2UgPSBjbGllbnQudGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSk7CisgICAgICAgIHRyYWNlKCIgPSBYdHJ1Y3QoYnl0ZV90aGluZzoiICsgbXVsdGlSZXNwb25zZS5ieXRlX3RoaW5nICsgIixzdHJpbmdfdGhpbmc6IiArIG11bHRpUmVzcG9uc2Uuc3RyaW5nX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuaTMyX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICsgIixpNjRfdGhpbmc6IiArIEludDY0LnRvU3RyKG11bHRpUmVzcG9uc2UuaTY0X3RoaW5nKSArICIpIik7CisKKyAgICAgICAgcnNsdC5FeHBlY3QoIG11bHRpUmVzcG9uc2Uuc3RyaW5nX3RoaW5nID09ICJIZWxsbzIiLCAnbXVsdGlSZXNwb25zZS5TdHJpbmdfdGhpbmcgPT0gIkhlbGxvMiInKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG11bHRpUmVzcG9uc2UuYnl0ZV90aGluZyA9PSBhcmcwLCAnbXVsdGlSZXNwb25zZS5CeXRlX3RoaW5nID09IGFyZzAnKTsKKyAgICAgICAgcnNsdC5FeHBlY3QoIG11bHRpUmVzcG9uc2UuaTMyX3RoaW5nID09IGFyZzEsICdtdWx0aVJlc3BvbnNlLkkzMl90aGluZyA9PSBhcmcxJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBtdWx0aVJlc3BvbnNlLmk2NF90aGluZywgYXJnMikgPT0gMCwgJ211bHRpUmVzcG9uc2UuSTY0X3RoaW5nID09IGFyZzInKTsKKworCisgICAgICAgIHJzbHQuU3RhcnRUZXN0R3JvdXAoIDApOworCisgICAgICAgIHRyYWNlKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICBjbGllbnQudGVzdE9uZXdheSgxKTsKKworICAgICAgICBpZiggISBhcmdzLnNraXBTcGVlZFRlc3QpIHsKKyAgICAgICAgICAgIHRyYWNlKCJUZXN0IENhbGx0aW1lKCkiKTsKKyAgICAgICAgICAgIHZhciBkaWZmdCA9IFRpbWVyLnN0YW1wKCk7CisgICAgICAgICAgICBmb3IgKCBrIGluIDAgLi4uIDEwMDApIHsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpZmZ0ID0gTWF0aC5yb3VuZCggMTAwMCAqIChUaW1lci5zdGFtcCgpIC0gZGlmZnQpKSAvIDEwMDA7CisgICAgICAgICAgICB0cmFjZSgnJGRpZmZ0IG1zIHBlciB0ZXN0Vm9pZCgpIGNhbGwnKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvVGVzdE1hY3JvLmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0TWFjcm8uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMDc2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdE1hY3JvLmh4CkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSA7CisKK2ltcG9ydCBoYXhlLm1hY3JvLkNvbnRleHQ7CitpbXBvcnQgaGF4ZS5tYWNyby5FeHByOworCisvKioqKgorICogSWYgeW91IGNhbGwgdGhlIFRocmlmdCBjb21waWxlciB0aGlzIHdheSAoZS5nLiBieSBjaGFuZ2luZyB0aGUgcHJlYnVpbGQgY29tbWFuZCkKKyAqCisgKiAgICAgdGhyaWZ0IC1yIC1nZW4gaGF4ZTpidWlsZG1hY3JvPVRlc3RNYWNyby5oYW5kbGUoKSAgIC4uL1RocmlmdFRlc3QudGhyaWZ0CisgKgorICogdGhlIFRlc3RNYWNyby5oYW5kbGUoKSBmdW5jdGlvbiBpbXBsZW1lbnRlZCBiZWxvdyBpcyBjYWxsZWQgZm9yIGVhY2ggZ2VuZXJhdGVkIGNsYXNzCisgKiBhbmQgaW50ZXJmYWNlLiBVc2UgInRocmlmdCAtLWhlbHAiIHRvIGdldCBtb3JlIGluZm8gYWJvdXQgb3RoZXIgYXZhaWxhYmxlIG9wdGlvbnMuCisgKi8KK2NsYXNzIFRlc3RNYWNybworeworICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhbmRsZSggKSA6IEFycmF5PCBGaWVsZD4geworICAgIHRyYWNlKCdUZXN0TWFjcm8gY2FsbGVkIGZvciAnICsgQ29udGV4dC5nZXRMb2NhbFR5cGUoKSk7CisgICAgcmV0dXJuIENvbnRleHQuZ2V0QnVpbGRGaWVsZHMoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXIuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUwYzhmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlci5oeApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKKworY2xhc3MgVGVzdFNlcnZlcgoreworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRXhlY3V0ZShhcmdzIDogQXJndW1lbnRzKSA6ICBWb2lkCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVHJhbnNwb3J0CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICBzd2l0Y2goIGFyZ3MudHJhbnNwb3J0KSB7CisgICAgICAgICAgICBjYXNlIHNvY2tldDoKKyAgICAgICAgICAgICAgICB0cmFjZSgiLSBzb2NrZXQgcG9ydCAiK2FyZ3MucG9ydCk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoIGFyZ3MucG9ydCk7CisgICAgICAgICAgICBjYXNlIGh0dHA6CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gaHR0cCIpOworICAgICAgICAgICAgICAgICNpZiAhcGhwd2Vic2VydmVyCisgICAgICAgICAgICAgICAgICB0aHJvdyAiSFRUUCBzZXJ2ZXIgbm90IGltcGxlbWVudGVkIHlldCI7CisgICAgICAgICAgICAgICAgIC8vdHJhbnNwb3J0ID0gbmV3IFRIdHRwU2VydmVyKCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9ICAgIG5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVFN0cmVhbVRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9pbnB1dCIsIFJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBvcHRpb25hbDogbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgICAgIHZhciB0cmFuc2ZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGw7CisgICAgICAgICAgICBpZiAoIGFyZ3MuZnJhbWVkKSB7CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgIHRyYW5zZmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBhcmdzLmJ1ZmZlcmVkKSB7CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gYnVmZmVyZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgdHJhbnNmYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcHJvdG9jb2wKKyAgICAgICAgICAgIHZhciBwcm90ZmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgc3dpdGNoKCBhcmdzLnByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBiaW5hcnk6CisgICAgICAgICAgICAgICAgdHJhY2UoIi0gYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgcHJvdGZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgICAgICAgICAgY2FzZSBqc29uOgorICAgICAgICAgICAgICAgIHRyYWNlKCItIGpzb24gcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICBwcm90ZmFjdG9yeSA9IG5ldyBUSlNPTlByb3RvY29sRmFjdG9yeSgpOworICAgICAgICAgICAgY2FzZSBjb21wYWN0OgorICAgICAgICAgICAgICAgIHRyYWNlKCItIGNvbXBhY3QgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICBwcm90ZmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIFByb2Nlc3NvcgorICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBuZXcgVGVzdFNlcnZlckhhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdFByb2Nlc3NvcihoYW5kbGVyKTsKKworICAgICAgICAgICAgLy8gU2ltcGxlIFNlcnZlcgorICAgICAgICAgICAgdmFyIHNlcnZlciA6IFRTZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgc3dpdGNoKCBhcmdzLnNlcnZlcnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHNpbXBsZToKKyAgICAgICAgICAgICAgICB2YXIgc2ltcGxlU2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgICAgICAgICAgICAgc2ltcGxlU2VydmVyLnJ1bk9uY2UgPSB0cnVlOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBzaW1wbGVTZXJ2ZXI7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCBzZXJ2ZXIgdHlwZSI7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIC8vIFNlcnZlciBldmVudCBoYW5kbGVyCisgICAgICAgICAgICBpZiggYXJncy5zZXJ2ZXJFdmVudHMpIHsKKyAgICAgICAgICAgICAgICB2YXIgZXZlbnRzID0gbmV3IFRlc3RTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuc2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisgICAgICAgICAgICAgICAgaGFuZGxlci5zZXJ2ZXIgPSBzZXJ2ZXJFbmdpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOworICAgICAgICAgICAgdHJhY2UoImRvbmUuIik7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoeCA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCckeCAke3guZXJyb3JJRH0gJHt4LmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICh4IDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJyR4Jyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJFdmVudEhhbmRsZXIuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJFdmVudEhhbmRsZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NTY3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckV2ZW50SGFuZGxlci5oeApAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKK2ltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKKworCitjbGFzcyBUZXN0U2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgoreworICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKyAgICBwdWJsaWMgdm9pZCBwcmVTZXJ2ZSgpCisgICAgeworICAgICAgICBjYWxsQ291bnQrKzsKKyAgICB9CisgICAgcHVibGljIE9iamVjdCBjcmVhdGVDb250ZXh0KFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgIHsKKyAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKKyAgICB7CisgICAgICAgIGNhbGxDb3VudCsrOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlRyYW5zcG9ydC5UVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICB7CisgICAgICAgIGNhbGxDb3VudCsrOworICAgIH0KK30KKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckhhbmRsZXIuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTI1OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4CkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7CisKK2ltcG9ydCBoYXhlLkludDMyOworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmRzLkludE1hcDsKK2ltcG9ydCBoYXhlLmRzLlN0cmluZ01hcDsKK2ltcG9ydCBoYXhlLmRzLk9iamVjdE1hcDsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2NsYXNzIFRlc3RTZXJ2ZXJIYW5kbGVyIGltcGxlbWVudHMgVGhyaWZ0VGVzdCB7CisKKyAgICBwdWJsaWMgdmFyIHNlcnZlcjpUU2VydmVyOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAidGVzdFZvaWQoKSIgYW5kIHJldHVybnMgbm90aGluZy4KKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZCgpOlZvaWQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0Vm9pZCgpIik7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RCb29sKCIlcyIpJyB3aGVyZSAnJXMnIHdpdGggdGhpbmcgYXMgJ3RydWUnIG9yICdmYWxzZScKKyAgICAqIEBwYXJhbSBib29sICB0aGluZyAtIHRoZSBib29sIGRhdGEgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gYm9vbCAgLSByZXR1cm5zIHRoZSBib29sICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qm9vbCh0aGluZyA6IEJvb2wpIDogQm9vbAorICAgIHsKKyAgICAgICAgdHJhY2UoJ3Rlc3RCb29sKCR0aGluZyknKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0U3RyaW5nKCIlcyIpJyB3aXRoIHRoaW5nIGFzICclcycKKyAgICAqIEBwYXJhbSBzdHJpbmcgdGhpbmcgLSB0aGUgc3RyaW5nIHRvIHByaW50CisgICAgKiBAcmV0dXJuIHN0cmluZyAtIHJldHVybnMgdGhlIHN0cmluZyAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZyh0aGluZzpTdHJpbmcpOlN0cmluZworICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RzdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdEJ5dGUoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgICogQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgYnl0ZSB0byBwcmludAorICAgICogQHJldHVybiBieXRlIC0gcmV0dXJucyB0aGUgYnl0ZSAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGUodGhpbmc6aGF4ZS5JbnQzMik6aGF4ZS5JbnQzMgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RCeXRlKCIgKyB0aGluZyArICIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdEkzMigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCisgICAgKiBAcGFyYW0gaTMyIHRoaW5nIC0gdGhlIGkzMiB0byBwcmludAorICAgICogQHJldHVybiBpMzIgLSByZXR1cm5zIHRoZSBpMzIgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzIodGhpbmc6aGF4ZS5JbnQzMik6aGF4ZS5JbnQzMgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RJMzIoIiArIHRoaW5nICsgIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0STY0KCIlZCIpJyB3aXRoIHRoaW5nIGFzICclZCcKKyAgICAqIEBwYXJhbSBpNjQgdGhpbmcgLSB0aGUgaTY0IHRvIHByaW50CisgICAgKiBAcmV0dXJuIGk2NCAtIHJldHVybnMgdGhlIGk2NCAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NCh0aGluZzpoYXhlLkludDY0KTpoYXhlLkludDY0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdEk2NCgiICsgdGhpbmcgKyAiKSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3REb3VibGUoIiVmIiknIHdpdGggdGhpbmcgYXMgJyVmJworICAgICogQHBhcmFtIGRvdWJsZSB0aGluZyAtIHRoZSBkb3VibGUgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gZG91YmxlIC0gcmV0dXJucyB0aGUgZG91YmxlICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlKHRoaW5nOkZsb2F0KTpGbG9hdAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3REb3VibGUoIiArIHRoaW5nICsgIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyAndGVzdEJpbmFyeSgiJXMiKScgd2hlcmUgJyVzJyBpcyBhIGhleC1mb3JtYXR0ZWQgc3RyaW5nIG9mIHRoaW5nJ3MgZGF0YQorICAgICAqIEBwYXJhbSBiaW5hcnkgIHRoaW5nIC0gdGhlIGJpbmFyeSBkYXRhIHRvIHByaW50CisgICAgICogQHJldHVybiBiaW5hcnkgIC0gcmV0dXJucyB0aGUgYmluYXJ5ICd0aGluZycKKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGluZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0QmluYXJ5KHRoaW5nIDogaGF4ZS5pby5CeXRlcykgOiBoYXhlLmlvLkJ5dGVzCisgICAgeworICAgICAgICB2YXIgaGV4ID0gIiI7CisgICAgICAgIGZvciAoIGkgaW4gMCAuLi4gdGhpbmcubGVuZ3RoKSB7CisgICAgICAgICAgICBoZXggKz0gU3RyaW5nVG9vbHMuaGV4KCB0aGluZy5nZXQoaSksIDIpOworICAgICAgICB9CisgICAgICAgIHRyYWNlKCd0ZXN0QmluYXJ5KCRoZXgpJyk7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdFN0cnVjdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQKKyAgICAqICBpbnRvIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMKKyAgICAqIEBwYXJhbSBYdHJ1Y3QgdGhpbmcgLSB0aGUgWHRydWN0IHRvIHByaW50CisgICAgKiBAcmV0dXJuIFh0cnVjdCAtIHJldHVybnMgdGhlIFh0cnVjdCAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdCh0aGluZzpYdHJ1Y3QpOlh0cnVjdAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RTdHJ1Y3QoeyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdGhpbmcuc3RyaW5nX3RoaW5nICsgIlwiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuYnl0ZV90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5pMzJfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW50NjQudG9TdHIodGhpbmcuaTY0X3RoaW5nKSArICJ9KSIpOworICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3ROZXN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZAorICAgICogIGludG8gYSBzdHJpbmcgb2YgdGhlIG5lc3RlZCBzdHJ1Y3QKKyAgICAqIEBwYXJhbSBYdHJ1Y3QyIHRoaW5nIC0gdGhlIFh0cnVjdDIgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gWHRydWN0MiAtIHJldHVybnMgdGhlIFh0cnVjdDIgJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0KG5lc3Q6WHRydWN0Mik6WHRydWN0MgorICAgIHsKKyAgICAgICAgdmFyIHRoaW5nOlh0cnVjdCA9IG5lc3Quc3RydWN0X3RoaW5nOworICAgICAgICB0cmFjZSgidGVzdE5lc3QoeyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LmJ5dGVfdGhpbmcgKyAiLCB7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB0aGluZy5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5ieXRlX3RoaW5nICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLmkzMl90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQ2NC50b1N0cih0aGluZy5pNjRfdGhpbmcpICsgIn0sICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LmkzMl90aGluZyArICJ9KSIpOworICAgICAgICByZXR1cm4gbmVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdE1hcCgieyVzIiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZAorICAgICogIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCisgICAgKiAgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAgKiBAcGFyYW0gbWFwPGkzMixpMzI+IHRoaW5nIC0gdGhlIG1hcDxpMzIsaTMyPiB0byBwcmludAorICAgICogQHJldHVybiBtYXA8aTMyLGkzMj4gLSByZXR1cm5zIHRoZSBtYXA8aTMyLGkzMj4gJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXAodGhpbmc6SW50TWFwPGhheGUuSW50MzI+KTpJbnRNYXA8aGF4ZS5JbnQzMj4KKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0TWFwKHsiKTsKKyAgICAgICAgdmFyIGZpcnN0OkJvb2wgPSB0cnVlOworICAgICAgICBmb3IgKGtleSBpbiB0aGluZy5rZXlzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRyYWNlKGtleSArICIgPT4gIiArIHRoaW5nLmdldChrZXkpKTsKKyAgICAgICAgfTsKKyAgICAgICAgdHJhY2UoIn0pIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdFN0cmluZ01hcCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQKKyAgICAqICBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycworICAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgICogQHBhcmFtIG1hcDxzdHJpbmcsc3RyaW5nPiB0aGluZyAtIHRoZSBtYXA8c3RyaW5nLHN0cmluZz4gdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gbWFwPHN0cmluZyxzdHJpbmc+IC0gcmV0dXJucyB0aGUgbWFwPHN0cmluZyxzdHJpbmc+ICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwKHRoaW5nOlN0cmluZ01hcDxTdHJpbmc+KTpTdHJpbmdNYXA8U3RyaW5nPgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RTdHJpbmdNYXAoeyIpOworICAgICAgICB2YXIgZmlyc3Q6Qm9vbCA9IHRydWU7CisgICAgICAgIGZvciAoa2V5IGluIHRoaW5nLmtleXMoKSkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2UoIiwgIik7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHJhY2Uoa2V5ICsgIiA9PiAiICsgdGhpbmcuZ2V0KGtleSkpOworICAgICAgICB9OworICAgICAgICB0cmFjZSgifSkiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0U2V0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZAorICAgICogIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcworICAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcworICAgICogQHBhcmFtIHNldDxpMzI+IHRoaW5nIC0gdGhlIHNldDxpMzI+IHRvIHByaW50CisgICAgKiBAcmV0dXJuIHNldDxpMzI+IC0gcmV0dXJucyB0aGUgc2V0PGkzMj4gJ3RoaW5nJworICAgICoKKyAgICAqIEBwYXJhbSB0aGluZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXQodGhpbmc6SW50U2V0KTpJbnRTZXQKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgdmFyIGZpcnN0OkJvb2wgPSB0cnVlOworICAgICAgICBmb3IgKGVsZW0gaW4gdGhpbmcpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRyYWNlKGVsZW0pOworICAgICAgICB9OworICAgICAgICB0cmFjZSgifSkiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0TGlzdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQKKyAgICAqICBpbnRvIGEgc3RyaW5nIG9mICB2YWx1ZXMKKyAgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICAqIEBwYXJhbSBsaXN0PGkzMj4gdGhpbmcgLSB0aGUgbGlzdDxpMzI+IHRvIHByaW50CisgICAgKiBAcmV0dXJuIGxpc3Q8aTMyPiAtIHJldHVybnMgdGhlIGxpc3Q8aTMyPiAndGhpbmcnCisgICAgKgorICAgICogQHBhcmFtIHRoaW5nCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3QodGhpbmc6TGlzdDxoYXhlLkludDMyPik6TGlzdDxoYXhlLkludDMyPgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RMaXN0KHsiKTsKKyAgICAgICAgdmFyIGZpcnN0OkJvb2wgPSB0cnVlOworICAgICAgICBmb3IgKGVsZW0gaW4gdGhpbmcpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNlKCIsICIpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRyYWNlKGVsZW0pOworICAgICAgICB9OworICAgICAgICB0cmFjZSgifSkiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0RW51bSgiJWQiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gaXQncyBudW1lcmljIHZhbHVlCisgICAgKiBAcGFyYW0gTnVtYmVyeiB0aGluZyAtIHRoZSBOdW1iZXJ6IHRvIHByaW50CisgICAgKiBAcmV0dXJuIE51bWJlcnogLSByZXR1cm5zIHRoZSBOdW1iZXJ6ICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bSh0aGluZzpJbnQpOkludAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RFbnVtKCIgKyB0aGluZyArICIpIik7CisgICAgICAgIHJldHVybiB0aGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50cyAndGVzdFR5cGVkZWYoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJworICAgICogQHBhcmFtIFVzZXJJZCB0aGluZyAtIHRoZSBVc2VySWQgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gVXNlcklkIC0gcmV0dXJucyB0aGUgVXNlcklkICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZih0aGluZzpoYXhlLkludDY0KTpoYXhlLkludDY0CisgICAgeworICAgICAgICB0cmFjZSgidGVzdFR5cGVkZWYoIiArIHRoaW5nICsgIikiKTsKKyAgICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0TWFwTWFwKCIlZCIpJyB3aXRoIGhlbGxvIGFzICclZCcKKyAgICAqIEBwYXJhbSBpMzIgaGVsbG8gLSB0aGUgaTMyIHRvIHByaW50CisgICAgKiBAcmV0dXJuIG1hcDxpMzIsbWFwPGkzMixpMzI+PiAtIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgdmFsdWVzOgorICAgICogICB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LAorICAgICogICAgIDQgPT4gezEgPT4gMSwgMiA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgICoKKyAgICAqIEBwYXJhbSBoZWxsbworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBNYXAoaGVsbG86aGF4ZS5JbnQzMik6SW50TWFwPEludE1hcDxoYXhlLkludDMyPj4KKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0TWFwTWFwKCIgKyBoZWxsbyArICIpIik7CisgICAgICAgIHZhciBtYXBtYXAgPSBuZXcgSW50TWFwPEludE1hcDxJbnQ+PigpOworICAgICAgICB2YXIgcG9zID0gbmV3IEludE1hcDxJbnQ+KCk7CisgICAgICAgIHZhciBuZWcgPSBuZXcgSW50TWFwPEludD4oKTsKKyAgICAgICAgZm9yIChpIGluIDEgLi4uIDUpIHsKKyAgICAgICAgICAgIHBvcy5zZXQoaSwgaSk7CisgICAgICAgICAgICBuZWcuc2V0KC1pLCAtaSk7CisgICAgICAgIH07CisgICAgICAgIG1hcG1hcC5zZXQoNCwgcG9zKTsKKyAgICAgICAgbWFwbWFwLnNldCgtNCwgbmVnKTsKKyAgICAgICAgcmV0dXJuIG1hcG1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgICoKKyAgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgICogICAgICAgICAgfSwKKyAgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAqICAgfQorICAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAgKgorICAgICogQHBhcmFtIGFyZ3VtZW50CisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5KGFyZ3VtZW50IDogSW5zYW5pdHkpIDogSW50NjRNYXA8IEludE1hcDwgSW5zYW5pdHk+PgorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgdmFyIGZpcnN0X21hcCA9IG5ldyBJbnRNYXA8IEluc2FuaXR5PigpOworICAgICAgICBmaXJzdF9tYXAuc2V0KE51bWJlcnouVFdPLCBhcmd1bWVudCk7CisgICAgICAgIGZpcnN0X21hcC5zZXQoTnVtYmVyei5USFJFRSwgYXJndW1lbnQpOworCisgICAgICAgIHZhciBzZWNvbmRfbWFwID0gbmV3IEludE1hcDwgSW5zYW5pdHk+KCk7CisgICAgICAgIHZhciBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICAgICAgc2Vjb25kX21hcC5zZXQoTnVtYmVyei5TSVgsIGxvb25leSk7CisKKyAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBJbnQ2NE1hcDwgSW50TWFwPCBJbnNhbml0eT4+KCk7CisgICAgICAgIGluc2FuZS5zZXQoIEludDY0Lm1ha2UoMCwxKSwgZmlyc3RfbWFwKTsKKyAgICAgICAgaW5zYW5lLnNldCggSW50NjQubWFrZSgwLDIpLCBzZWNvbmRfbWFwKTsKKworICAgICAgICByZXR1cm4gaW5zYW5lOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnRzICd0ZXN0TXVsdGkoKScKKyAgICAqIEBwYXJhbSBieXRlIGFyZzAgLQorICAgICogQHBhcmFtIGkzMiBhcmcxIC0KKyAgICAqIEBwYXJhbSBpNjQgYXJnMiAtCisgICAgKiBAcGFyYW0gbWFwPGkxNiwgc3RyaW5nPiBhcmczIC0KKyAgICAqIEBwYXJhbSBOdW1iZXJ6IGFyZzQgLQorICAgICogQHBhcmFtIFVzZXJJZCBhcmc1IC0KKyAgICAqIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyBhbiBYdHJ1Y3QKKyAgICAqICAgIHdpdGggc3RyaW5nX3RoaW5nID0gIkhlbGxvMiwgYnl0ZV90aGluZyA9IGFyZzAsIGkzMl90aGluZyA9IGFyZzEKKyAgICAqICAgIGFuZCBpNjRfdGhpbmcgPSBhcmcyCisgICAgKgorICAgICogQHBhcmFtIGFyZzAKKyAgICAqIEBwYXJhbSBhcmcxCisgICAgKiBAcGFyYW0gYXJnMgorICAgICogQHBhcmFtIGFyZzMKKyAgICAqIEBwYXJhbSBhcmc0CisgICAgKiBAcGFyYW0gYXJnNQorICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNdWx0aShhcmcwOmhheGUuSW50MzIsIGFyZzE6aGF4ZS5JbnQzMiwgYXJnMjpoYXhlLkludDY0LAorICAgICAgICBhcmczOkludE1hcDxTdHJpbmc+LCBhcmc0OkludCwgYXJnNTpoYXhlLkludDY0KTpYdHJ1Y3QKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0TXVsdGkoKSIpOworICAgICAgICB2YXIgaGVsbG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICAgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgICAgICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKKyAgICAgICAgcmV0dXJuIGhlbGxvOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisgICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworICAgICogaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gYXJnCisgICAgKiBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAqIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAgKgorICAgICogQHBhcmFtIGFyZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFeGNlcHRpb24oYXJnOlN0cmluZyk6Vm9pZAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RFeGNlcHRpb24oIiArIGFyZyArICIpIik7CisgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH07CisgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOworICAgICAgICB9OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludCAndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknIHdpdGggYXJnMCBhcyAnJXMnIGFuZCBhcmcxIGFzICclcycKKyAgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAgKiBpZiBhcmcwID09ICJYY2VwdGlvbiIKKyAgICAqIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICogZWxzZSBpZiBhcmcwID09ICJYY2VwdGlvbjIiCisgICAgKiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICAqIEByZXR1cm4gWHRydWN0IC0gYW4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gYXJnMQorICAgICoKKyAgICAqIEBwYXJhbSBhcmcwCisgICAgKiBAcGFyYW0gYXJnMQorICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwOlN0cmluZywgYXJnMTpTdHJpbmcpOlh0cnVjdAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RNdWx0aUV4Y2VwdGlvbigiICsgYXJnMCArICIsICIgKyBhcmcxICsgIikiKTsKKyAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24yKCk7CisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDIwMDI7CisgICAgICAgICAgICB4LnN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIHguc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9OworICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50ICd0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi4nIHdpdGggc2Vjb25kc1RvU2xlZXAgYXMgJyVkJworICAgICogc2xlZXAgJ3NlY29uZHNUb1NsZWVwJworICAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIScgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAgKiBAcGFyYW0gaTMyIHNlY29uZHNUb1NsZWVwIC0gdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHNsZWVwCisgICAgKgorICAgICogQHBhcmFtIHNlY29uZHNUb1NsZWVwCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcDpoYXhlLkludDMyKTpWb2lkCisgICAgeworICAgICAgICB0cmFjZSgidGVzdE9uZXdheSgiICsgc2Vjb25kc1RvU2xlZXAgKyAiKSwgc2xlZXBpbmcuLi4iKTsKKyAgICAgICAgU3lzLnNsZWVwKHNlY29uZHNUb1NsZWVwKTsKKyAgICAgICAgdHJhY2UoInRlc3RPbmV3YXkgZmluaXNoZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0b3AoKTpWb2lkCisgICAgeworICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlcnZlci5TdG9wKCk7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvaHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjYTNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQoaHNfdGVzdF9nZW4KKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0NvbnN0YW50c0RlbW9fQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Db25zdGFudHNEZW1vX1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9EZWJ1Z1Byb3RvVGVzdF9Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0RlYnVnUHJvdG9UZXN0X1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9FbXB0eVNlcnZpY2VfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9FbXB0eVNlcnZpY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0VtcHR5U2VydmljZV9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5jbHVkZV9Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luY2x1ZGVfVHlwZXMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luaGVyaXRlZF9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luaGVyaXRlZC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5oZXJpdGVkX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9SZXZlcnNlT3JkZXJTZXJ2aWNlX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvUmV2ZXJzZU9yZGVyU2VydmljZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvUmV2ZXJzZU9yZGVyU2VydmljZV9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2Vjb25kU2VydmljZV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlY29uZFNlcnZpY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlY29uZFNlcnZpY2VfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlcnZpY2VGb3JFeGNlcHRpb25XaXRoQU1hcF9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlcnZpY2VGb3JFeGNlcHRpb25XaXRoQU1hcC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2VydmljZUZvckV4Y2VwdGlvbldpdGhBTWFwX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TcnZfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TcnYuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1Nydl9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Zb3d6YV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1lvd3phLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Zb3d6YV9JZmFjZS5ocworKQorCitzZXQoaHNfY3Jvc3N0ZXN0X2FwcHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vVGVzdFNlcnZlcgorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9UZXN0Q2xpZW50CispCitzZXQoaHNfY3Jvc3N0ZXN0X2FyZ3MKKyAgICAtaWdlbi1ocworICAgIC1vZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgIC1oaWRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKykKKworaWYgKENNQUtFX0JVSUxEX1RZUEUgU1RSRVFVQUwgIkRlYnVnIikKKyAgc2V0KGhzX29wdGltaXplIC1PMCkKK2Vsc2UoKQorICBzZXQoaHNfb3B0aW1pemUgLU8xKQorZW5kaWYoKQorCithZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICR7aHNfY3Jvc3N0ZXN0X2FwcHN9CisgICAgQ09NTUFORCAke0dIQ30gJHtoc19vcHRpbWl6ZX0gJHtoc19jcm9zc3Rlc3RfYXJnc30gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1Rlc3RTZXJ2ZXIuaHMgLW8gVGVzdFNlcnZlcgorICAgIENPTU1BTkQgJHtHSEN9ICR7aHNfb3B0aW1pemV9ICR7aHNfY3Jvc3N0ZXN0X2FyZ3N9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9UZXN0Q2xpZW50LmhzIC1vIFRlc3RDbGllbnQKKyAgICBERVBFTkRTICR7aHNfdGVzdF9nZW59IGhhc2tlbGxfbGlicmFyeSBUZXN0U2VydmVyLmhzIFRlc3RDbGllbnQuaHMKKykKK2FkZF9jdXN0b21fdGFyZ2V0KGhhc2tlbGxfY3Jvc3N0ZXN0IEFMTAorICAgIENPTU1FTlQgIkJ1aWxkaW5nIEhhc2tlbGwgY3Jvc3MgdGVzdCBleGVjdXRhYmxlcyIKKyAgICBERVBFTkRTICR7aHNfY3Jvc3N0ZXN0X2FwcHN9CispCisKK3NldChoc190ZXN0X3NvdXJjZXMKKyAgICBDb25zdGFudHNEZW1vX01haW4uaHMKKyAgICBEZWJ1Z1Byb3RvVGVzdF9NYWluLmhzCisgICAgSW5jbHVkZV9NYWluLmhzCisgICAgVGhyaWZ0VGVzdF9NYWluLmhzCispCitzZXQoaHNfdGVzdF9hcmdzCisgICAgLVdhbGwKKyAgICAtWFNjb3BlZFR5cGVWYXJpYWJsZXMKKyAgICAtaSR7UFJPSkVDVF9TT1VSQ0VfRElSfS9saWIvaHMvc3JjCisgICAgLWkke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzCispCithZGRfY3VzdG9tX3RhcmdldChoYXNrZWxsX3Rlc3RzIEFMTCBERVBFTkRTICR7aHNfdGVzdF9nZW59KQorZm9yZWFjaChTUkMgJHtoc190ZXN0X3NvdXJjZXN9KQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoQkFTRSAke1NSQ30gTkFNRV9XRSkKKyAgICBhZGRfdGVzdChOQU1FIEhhc2tlbGxUZXN0cy0ke0JBU0V9CisgICAgICAgIENPTU1BTkQgJHtSVU5fSEFTS0VMTH0gJHtoc190ZXN0X2FyZ3N9ICR7U1JDfQorICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCitlbmRmb3JlYWNoKCkKKworc2V0KGhzX3Rlc3RfZ2VuX3NvdXJjZXMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvSW5jbHVkZS50aHJpZnQKKykKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtoc190ZXN0X2dlbn0KKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvSW5jbHVkZS50aHJpZnQKKyAgICBERVBFTkRTICR7aHNfdGVzdF9nZW5fc291cmNlc30KKykKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvQ2xpZW50LmhzIGIvdGVzdC9ocy9DbGllbnQuaHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTRkOTAuLjAwMDAwMDAKLS0tIGEvdGVzdC9ocy9DbGllbnQuaHMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0tLQotLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLS0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0tLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLS0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLS0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLS0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLS0KLS0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0tLQotLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLS0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLS0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLS0tIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0KLQotbW9kdWxlIENsaWVudCB3aGVyZQotCi1pbXBvcnQgVGhyaWZ0VGVzdF9DbGllbnQKLWltcG9ydCBUaHJpZnRUZXN0X1R5cGVzCi1pbXBvcnQgcXVhbGlmaWVkIERhdGEuTWFwIGFzIE1hcAotaW1wb3J0IHF1YWxpZmllZCBEYXRhLlNldCBhcyBTZXQKLWltcG9ydCBDb250cm9sLk1vbmFkCi1pbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gYXMgQ0UKLQotaW1wb3J0IE5ldHdvcmsKLQotaW1wb3J0IFRocmlmdAotaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlCi1pbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQotCi0KLXNlcnZlckFkZHJlc3MgPSAoIjEyNy4wLjAuMSIsIFBvcnROdW1iZXIgOTA5MCkKLQotbWFpbiA9IGRvIHRvIDwtIGhPcGVuIHNlcnZlckFkZHJlc3MKLSAgICAgICAgICBsZXQgcCA9ICBCaW5hcnlQcm90b2NvbCB0bwotICAgICAgICAgIGxldCBwcyA9IChwLHApCi0gICAgICAgICAgcHJpbnQgPTw8IHRlc3RTdHJpbmcgcHMgImJ5YSIKLSAgICAgICAgICBwcmludCA9PDwgdGVzdEJ5dGUgcHMgOAotICAgICAgICAgIHByaW50ID08PCB0ZXN0Qnl0ZSBwcyAoLTgpCi0gICAgICAgICAgcHJpbnQgPTw8IHRlc3RJMzIgcHMgMzIKLSAgICAgICAgICBwcmludCA9PDwgdGVzdEkzMiBwcyAoLTMyKQotICAgICAgICAgIHByaW50ID08PCB0ZXN0STY0IHBzIDY0Ci0gICAgICAgICAgcHJpbnQgPTw8IHRlc3RJNjQgcHMgKC02NCkKLSAgICAgICAgICBwcmludCA9PDwgdGVzdERvdWJsZSBwcyAzLjE0Ci0gICAgICAgICAgcHJpbnQgPTw8IHRlc3REb3VibGUgcHMgKC0zLjE0KQotICAgICAgICAgIHByaW50ID08PCB0ZXN0TWFwIHBzIChNYXAuZnJvbUxpc3QgWygxLDEpLCgyLDIpLCgzLDMpXSkKLSAgICAgICAgICBwcmludCA9PDwgdGVzdExpc3QgcHMgWzEsMiwzLDQsNV0KLSAgICAgICAgICBwcmludCA9PDwgdGVzdFNldCBwcyAoU2V0LmZyb21MaXN0IFsxLDIsMyw0LDVdKQotICAgICAgICAgIHByaW50ID08PCB0ZXN0U3RydWN0IHBzIChYdHJ1Y3QgKEp1c3QgImhpIikgKEp1c3QgNCkgKEp1c3QgNSkgTm90aGluZykKLSAgICAgICAgICBDRS5jYXRjaCAodGVzdEV4Y2VwdGlvbiBwcyAiZSIgPj4gcHJpbnQgImJhZCIpIChcZSAtPiBwcmludCAoZSA6OiBYY2VwdGlvbikpCi0gICAgICAgICAgQ0UuY2F0Y2ggKHRlc3RNdWx0aUV4Y2VwdGlvbiBwcyAiZSIgImUyIiA+PiBwcmludCAib2siKSAoXGUgLT4gcHJpbnQgKGUgOjogWGNlcHRpb24pKQotICAgICAgICAgIENFLmNhdGNoIChDRS5jYXRjaCAodGVzdE11bHRpRXhjZXB0aW9uIHBzICJlIiAiZTIiPj4gcHJpbnQgImJhZCIpIChcZSAtPiBwcmludCAoZSA6OiBYY2VwdGlvbjIpKSkgKFwoZSA6OiBTb21lRXhjZXB0aW9uKSAtPiBwcmludCAib2siKQotICAgICAgICAgIHRDbG9zZSB0bwotCmRpZmYgLS1naXQgYS90ZXN0L2hzL0NvbnN0YW50c0RlbW9fTWFpbi5ocyBiL3Rlc3QvaHMvQ29uc3RhbnRzRGVtb19NYWluLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZGU0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL0NvbnN0YW50c0RlbW9fTWFpbi5ocwpAQCAtMCwwICsxLDY4IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIE1haW4gd2hlcmUKKworCitpbXBvcnQgcXVhbGlmaWVkIENvbnRyb2wuRXhjZXB0aW9uCitpbXBvcnQgcXVhbGlmaWVkIE5ldHdvcmsKKworaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuU2VydmVyCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUKKworaW1wb3J0IHF1YWxpZmllZCBUaHJpZnRUZXN0VXRpbHMKKworaW1wb3J0IHF1YWxpZmllZCBZb3d6YQoraW1wb3J0IHF1YWxpZmllZCBZb3d6YV9DbGllbnQgYXMgQ2xpZW50CitpbXBvcnQgcXVhbGlmaWVkIFlvd3phX0lmYWNlIGFzIElmYWNlCisKKworZGF0YSBZb3d6YUhhbmRsZXIgPSBZb3d6YUhhbmRsZXIKK2luc3RhbmNlIElmYWNlLllvd3phX0lmYWNlIFlvd3phSGFuZGxlciB3aGVyZQorICAgIGJsaW5naXR5IF8gPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICJTRVJWRVI6IEdvdCBibGluZ2l0eSIKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBibGFuZ2l0eSBfID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAiU0VSVkVSOiBHb3QgYmxhbmdpdHkiCisgICAgICAgIHJldHVybiAkIDMxCisKKworY2xpZW50IDo6IChTdHJpbmcsIE5ldHdvcmsuUG9ydElEKSAtPiBJTyAoKQorY2xpZW50IGFkZHIgPSBkbworICAgIHRvIDwtIGhPcGVuIGFkZHIKKyAgICBsZXQgcHMgPSAoQmluYXJ5UHJvdG9jb2wgdG8sIEJpbmFyeVByb3RvY29sIHRvKQorCisgICAgQ2xpZW50LmJsaW5naXR5IHBzCisKKyAgICBydiA8LSBDbGllbnQuYmxhbmdpdHkgcHMKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyBydgorCisgICAgdENsb3NlIHRvCisKK3NlcnZlciA6OiBOZXR3b3JrLlBvcnROdW1iZXIgLT4gSU8gKCkKK3NlcnZlciBwb3J0ID0gZG8gCisgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAiUmVhZHkuLi4iCisgICAgKHJ1bkJhc2ljU2VydmVyIFlvd3phSGFuZGxlciBZb3d6YS5wcm9jZXNzIHBvcnQpCisgICAgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYAorICAgIChcKFRyYW5zcG9ydEV4biBzIF8pIC0+IGVycm9yICQgIkZBSUxVUkU6ICIgKysgc2hvdyBzKQorCittYWluIDo6IElPICgpCittYWluID0gVGhyaWZ0VGVzdFV0aWxzLnJ1blRlc3Qgc2VydmVyIGNsaWVudApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzIGIvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjg5NjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL0RlYnVnUHJvdG9UZXN0X01haW4uaHMKQEAgLTAsMCArMSwxNjggQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CisKK21vZHVsZSBNYWluIHdoZXJlCisKKworaW1wb3J0IHF1YWxpZmllZCBDb250cm9sLkV4Y2VwdGlvbgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBEQkwKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3IKK2ltcG9ydCBxdWFsaWZpZWQgTmV0d29yaworCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQoraW1wb3J0IFRocmlmdC5TZXJ2ZXIKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQorCitpbXBvcnQgcXVhbGlmaWVkIFRocmlmdFRlc3RVdGlscworCitpbXBvcnQgcXVhbGlmaWVkIERlYnVnUHJvdG9UZXN0X1R5cGVzIGFzIFR5cGVzCitpbXBvcnQgcXVhbGlmaWVkIEluaGVyaXRlZAoraW1wb3J0IHF1YWxpZmllZCBJbmhlcml0ZWRfQ2xpZW50IGFzIElDbGllbnQKK2ltcG9ydCBxdWFsaWZpZWQgSW5oZXJpdGVkX0lmYWNlIGFzIElJZmFjZQoraW1wb3J0IHF1YWxpZmllZCBTcnZfQ2xpZW50IGFzIFNDbGllbnQKK2ltcG9ydCBxdWFsaWZpZWQgU3J2X0lmYWNlIGFzIFNJZmFjZQorCistLSB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRoaXMgaW1wb3J0LCBidXQgZm9yY2UgaXQgdG8gY2hlY2sgdGhlIGNvZGUgZ2VuZXJhdG9yIGV4cG9ydHMgcHJvcGVyIEhhc2tlbGwgc3ludGF4CitpbXBvcnQgcXVhbGlmaWVkIFNydigpCisKKworZGF0YSBJbmhlcml0ZWRIYW5kbGVyID0gSW5oZXJpdGVkSGFuZGxlcgoraW5zdGFuY2UgU0lmYWNlLlNydl9JZmFjZSBJbmhlcml0ZWRIYW5kbGVyIHdoZXJlCisgICAgamFua3kgXyBhcmcgPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgIkdvdCBqYW5reSBtZXRob2QgY2FsbDogIiArKyBzaG93IGFyZworICAgICAgICByZXR1cm4gJCAzMQorCisgICAgdm9pZE1ldGhvZCBfID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAiR290IHZvaWRNZXRob2QgbWV0aG9kIGNhbGwiCisgICAgICAgIHJldHVybiAoKQorCisgICAgcHJpbWl0aXZlTWV0aG9kIF8gPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICJHb3QgcHJpbWl0aXZlTWV0aG9kIGNhbGwiCisgICAgICAgIHJldHVybiAkIDQyCisKKyAgICBzdHJ1Y3RNZXRob2QgXyA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgIkdvdCBzdHJ1Y3RNZXRob2QgY2FsbCIKKyAgICAgICAgcmV0dXJuICQgVHlwZXMuQ29tcGFjdFByb3RvVGVzdFN0cnVjdCB7CisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfYnl0ZSA9IDB4MDEsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfaTE2ID0gMHgwMiwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9pMzIgPSAweDAzLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2k2NCA9IDB4MDQsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfZG91YmxlID0gMC4xLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX3N0cmluZyA9ICJhYmNkZWYiLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2JpbmFyeSA9IERCTC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfdHJ1ZV9maWVsZCA9IFRydWUsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2ZhbHNlX2ZpZWxkID0gRmFsc2UsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2VtcHR5X3N0cnVjdF9maWVsZCA9IFR5cGVzLkVtcHR5LAorICAgICAgICAgICAgCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2kzMl9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pNjRfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cmluZ19saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9iaW5hcnlfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJ1Y3RfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKworICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cnVjdF9zZXQgPSBTZXQuZW1wdHksCisKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMzJfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2k2NF9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJpbmdfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2JpbmFyeV9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKworICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2kxNl9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfaTMyX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9pNjRfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2RvdWJsZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfc3RyaW5nX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9iaW5hcnlfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2Jvb2xlYW5fbWFwID0gTWFwLmVtcHR5LAorCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2xpc3RfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X3NldF9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfbWFwX2J5dGVfbWFwID0gTWFwLmVtcHR5LAorCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfbWFwX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zZXRfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3RfbWFwID0gTWFwLmVtcHR5IH0KKworICAgIG1ldGhvZFdpdGhEZWZhdWx0QXJncyBfIGFyZyA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCAiR290IG1ldGhvZFdpdGhEZWZhdWx0QXJnczogIiArKyBzaG93IGFyZworICAgICAgICByZXR1cm4gKCkKKworICAgIG9uZXdheU1ldGhvZCBfID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAiR290IG9uZXdheU1ldGhvZCIKKworaW5zdGFuY2UgSUlmYWNlLkluaGVyaXRlZF9JZmFjZSBJbmhlcml0ZWRIYW5kbGVyIHdoZXJlCisgICAgaWRlbnRpdHkgXyBhcmcgPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgIkdvdCBpZGVudGl0eSBtZXRob2Q6ICIgKysgc2hvdyBhcmcKKyAgICAgICAgcmV0dXJuIGFyZworCitjbGllbnQgOjogKFN0cmluZywgTmV0d29yay5Qb3J0SUQpIC0+IElPICgpCitjbGllbnQgYWRkciA9IGRvCisgICAgdG8gPC0gaE9wZW4gYWRkcgorICAgIGxldCBwID0gIEJpbmFyeVByb3RvY29sIHRvCisgICAgbGV0IHBzID0gKHAscCkKKworICAgIHYxIDwtIFNDbGllbnQuamFua3kgcHMgNDIKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MQorCisgICAgU0NsaWVudC52b2lkTWV0aG9kIHBzCisKKyAgICB2MiA8LSBTQ2xpZW50LnByaW1pdGl2ZU1ldGhvZCBwcworICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYyCisKKyAgICB2MyA8LSBTQ2xpZW50LnN0cnVjdE1ldGhvZCBwcworICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYzCisKKyAgICBTQ2xpZW50Lm1ldGhvZFdpdGhEZWZhdWx0QXJncyBwcyA0MgorCisgICAgU0NsaWVudC5vbmV3YXlNZXRob2QgcHMKKworICAgIHY0IDwtIElDbGllbnQuaWRlbnRpdHkgcHMgNDIKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2NAorCisgICAgcmV0dXJuICgpCisKK3NlcnZlciA6OiBOZXR3b3JrLlBvcnROdW1iZXIgLT4gSU8gKCkKK3NlcnZlciBwb3J0ID0gZG8gCisgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAiUmVhZHkuLi4iCisgICAgKHJ1bkJhc2ljU2VydmVyIEluaGVyaXRlZEhhbmRsZXIgSW5oZXJpdGVkLnByb2Nlc3MgcG9ydCkKKyAgICBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgCisgICAgKFwoVHJhbnNwb3J0RXhuIHMgXykgLT4gZXJyb3IgJCAiRkFJTFVSRTogIiArKyBzaG93IHMpCisKK21haW4gOjogSU8gKCkKK21haW4gPSBUaHJpZnRUZXN0VXRpbHMucnVuVGVzdCBzZXJ2ZXIgY2xpZW50CmRpZmYgLS1naXQgYS90ZXN0L2hzL0luY2x1ZGVfTWFpbi5ocyBiL3Rlc3QvaHMvSW5jbHVkZV9NYWluLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTc3YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL0luY2x1ZGVfTWFpbi5ocwpAQCAtMCwwICsxLDcgQEAKK21vZHVsZSBNYWluIHdoZXJlCisKK2ltcG9ydCBJbmNsdWRlX1R5cGVzCitpbXBvcnQgVGhyaWZ0VGVzdF9UeXBlcworCittYWluIDo6IElPICgpCittYWluID0gcHV0U3RyTG4gKCJJbmNsdWRlcyB3b3JrOiAiICsrIChzaG93IChJbmNsdWRlVGVzdCAkIEJvb2xzIFRydWUgRmFsc2UpKSkKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvTWFrZWZpbGUuYW0gYi90ZXN0L2hzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDg5MDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHViczogJChUSFJJRlQpIC4uL0NvbnN0YW50c0RlbW8udGhyaWZ0IC4uL0RlYnVnUHJvdG9UZXN0LnRocmlmdCAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9JbmNsdWRlLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBocyAuLi9Db25zdGFudHNEZW1vLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBocyAuLi9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gaHMgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gaHMgLi4vSW5jbHVkZS50aHJpZnQKKworY2hlY2s6IHN0dWJzCisJc2ggcnVuLXRlc3Quc2ggQ29uc3RhbnRzRGVtbworCXNoIHJ1bi10ZXN0LnNoIERlYnVnUHJvdG9UZXN0CisJc2ggcnVuLXRlc3Quc2ggVGhyaWZ0VGVzdAorCXNoIHJ1bi10ZXN0LnNoIEluY2x1ZGUKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWhzCisJJChSTSkgKi5oaQorCSQoUk0pICoubworCithbGwtbG9jYWw6IHN0dWJzCisJZ2hjIC1pZ2VuLWhzIFRlc3RTZXJ2ZXIuaHMKKwlnaGMgLWlnZW4taHMgVGVzdENsaWVudC5ocworCitwcmVjcm9zczogYWxsLWxvY2FsCmRpZmYgLS1naXQgYS90ZXN0L2hzL1NlcnZlci5ocyBiL3Rlc3QvaHMvU2VydmVyLmhzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2E5ZDlmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHMvU2VydmVyLmhzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLS0KLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLS0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0tLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0tLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0tLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0tLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS0tCi0tLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLS0KLS0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLS0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0tLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLS0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0tLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0tLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tCi0KLW1vZHVsZSBTZXJ2ZXIgd2hlcmUKLQotaW1wb3J0IFRocmlmdFRlc3QKLWltcG9ydCBUaHJpZnRUZXN0X0lmYWNlCi1pbXBvcnQgRGF0YS5NYXAgYXMgTWFwCi1pbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KLWltcG9ydCBUaHJpZnRUZXN0X1R5cGVzCi0KLWltcG9ydCBUaHJpZnQKLWltcG9ydCBUaHJpZnQuU2VydmVyCi0KLQotZGF0YSBUZXN0SGFuZGxlciA9IFRlc3RIYW5kbGVyCi1pbnN0YW5jZSBUaHJpZnRUZXN0X0lmYWNlIFRlc3RIYW5kbGVyIHdoZXJlCi0gICAgdGVzdFZvaWQgYSA9IHJldHVybiAoKQotICAgIHRlc3RTdHJpbmcgYSAoSnVzdCBzKSA9IGRvIHByaW50IHM7IHJldHVybiBzCi0gICAgdGVzdEJ5dGUgYSAoSnVzdCB4KSA9IGRvIHByaW50IHg7IHJldHVybiB4Ci0gICAgdGVzdEkzMiBhIChKdXN0IHgpID0gZG8gcHJpbnQgeDsgcmV0dXJuIHgKLSAgICB0ZXN0STY0IGEgKEp1c3QgeCkgPSBkbyBwcmludCB4OyByZXR1cm4geAotICAgIHRlc3REb3VibGUgYSAoSnVzdCB4KSA9IGRvIHByaW50IHg7IHJldHVybiB4Ci0gICAgdGVzdFN0cnVjdCBhIChKdXN0IHgpID0gZG8gcHJpbnQgeDsgcmV0dXJuIHgKLSAgICB0ZXN0TmVzdCBhIChKdXN0IHgpID0gZG8gcHJpbnQgeDsgcmV0dXJuIHgKLSAgICB0ZXN0TWFwIGEgKEp1c3QgeCkgPSBkbyBwcmludCB4OyByZXR1cm4geAotICAgIHRlc3RTZXQgYSAoSnVzdCB4KSA9IGRvIHByaW50IHg7IHJldHVybiB4Ci0gICAgdGVzdExpc3QgYSAoSnVzdCB4KSA9IGRvIHByaW50IHg7IHJldHVybiB4Ci0gICAgdGVzdEVudW0gYSAoSnVzdCB4KSA9IGRvIHByaW50IHg7IHJldHVybiB4Ci0gICAgdGVzdFR5cGVkZWYgYSAoSnVzdCB4KSA9IGRvIHByaW50IHg7IHJldHVybiB4Ci0gICAgdGVzdE1hcE1hcCBhIChKdXN0IHgpID0gcmV0dXJuIChNYXAuZnJvbUxpc3QgWygxLE1hcC5mcm9tTGlzdCBbKDIsMildKV0pCi0gICAgdGVzdEluc2FuaXR5IGEgKEp1c3QgeCkgPSByZXR1cm4gKE1hcC5mcm9tTGlzdCBbKDEsTWFwLmZyb21MaXN0IFsoT05FLHgpXSldKQotICAgIHRlc3RNdWx0aSBhIGExIGEyIGEzIGE0IGE1IGE2ID0gcmV0dXJuIChYdHJ1Y3QgTm90aGluZyBOb3RoaW5nIE5vdGhpbmcgTm90aGluZykKLSAgICB0ZXN0RXhjZXB0aW9uIGEgYyA9IHRocm93IChYY2VwdGlvbiAoSnVzdCAxKSAoSnVzdCAiYnlhIikpCi0gICAgdGVzdE11bHRpRXhjZXB0aW9uIGEgYzEgYzIgPSB0aHJvdyAoWGNlcHRpb24gKEp1c3QgMSkgKEp1c3QgInh5eiIpKQotICAgIHRlc3RPbmV3YXkgYSAoSnVzdCBpKSA9IGRvIHByaW50IGkKLQotCi1tYWluID0gZG8gKHJ1bkJhc2ljU2VydmVyIFRlc3RIYW5kbGVyIHByb2Nlc3MgOTA5MCkKLSAgICAgICAgICBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgCi0gICAgICAgICAgKFwoVHJhbnNwb3J0RXhuIHMgdCkgLT4gcHJpbnQgcykKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvVGVzdENsaWVudC5ocyBiL3Rlc3QvaHMvVGVzdENsaWVudC5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2ZiNTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9UZXN0Q2xpZW50LmhzCkBAIC0wLDAgKzEsMzA2IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzLCBSZWNvcmRXaWxkQ2FyZHMsIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19Cittb2R1bGUgTWFpbiB3aGVyZQorCitpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5GdW5jdG9yCitpbXBvcnQgRGF0YS5MaXN0LlNwbGl0CitpbXBvcnQgRGF0YS5TdHJpbmcKK2ltcG9ydCBOZXR3b3JrCitpbXBvcnQgTmV0d29yay5VUkkKK2ltcG9ydCBTeXN0ZW0uRW52aXJvbm1lbnQKK2ltcG9ydCBTeXN0ZW0uRXhpdAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3IKK2ltcG9ydCBxdWFsaWZpZWQgU3lzdGVtLklPIGFzIElPCisKK2ltcG9ydCBUaHJpZnRUZXN0X0lmYWNlCitpbXBvcnQgVGhyaWZ0VGVzdF9UeXBlcworaW1wb3J0IHF1YWxpZmllZCBUaHJpZnRUZXN0X0NsaWVudCBhcyBDbGllbnQKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkZyYW1lZAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5KU09OCisKK2RhdGEgT3B0aW9ucyA9IE9wdGlvbnMKKyAgeyBob3N0ICAgICAgICAgOjogU3RyaW5nCisgICwgcG9ydCAgICAgICAgIDo6IEludAorICAsIGRvbWFpblNvY2tldCA6OiBTdHJpbmcKKyAgLCB0cmFuc3BvcnQgICAgOjogU3RyaW5nCisgICwgcHJvdG9jb2wgICAgIDo6IFByb3RvY29sVHlwZQorICAtLSBUT0RPOiBIYXNrZWxsIGxpYiBkb2VzIG5vdCBoYXZlIFNTTCBzdXBwb3J0CisgICwgc3NsICAgICAgICAgIDo6IEJvb2wKKyAgLCB0ZXN0TG9vcHMgICAgOjogSW50CisgIH0KKyAgZGVyaXZpbmcgKFNob3csIEVxKQorCitkYXRhIFRyYW5zcG9ydFR5cGUgPSBCdWZmZXJlZCBJTy5IYW5kbGUKKyAgICAgICAgICAgICAgICAgICB8IEZyYW1lZCAoRnJhbWVkVHJhbnNwb3J0IElPLkhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICB8IEh0dHAgSHR0cENsaWVudAorICAgICAgICAgICAgICAgICAgIHwgTm9UcmFuc3BvcnQgU3RyaW5nCisKK2dldFRyYW5zcG9ydCA6OiBTdHJpbmcgLT4gU3RyaW5nIC0+IEludCAtPiAoSU8gVHJhbnNwb3J0VHlwZSkKK2dldFRyYW5zcG9ydCAiYnVmZmVyZWQiIGhvc3QgcG9ydCA9IGRvCisgIGggPC0gaE9wZW4gKGhvc3QsIFBvcnROdW1iZXIgJCBmcm9tSW50ZWdyYWwgcG9ydCkKKyAgSU8uaFNldEJ1ZmZlcmluZyBoICQgSU8uQmxvY2tCdWZmZXJpbmcgTm90aGluZworICByZXR1cm4gJCBCdWZmZXJlZCBoCitnZXRUcmFuc3BvcnQgImZyYW1lZCIgaG9zdCBwb3J0ID0gZG8KKyAgaCA8LSBoT3BlbiAoaG9zdCwgUG9ydE51bWJlciAkIGZyb21JbnRlZ3JhbCBwb3J0KQorICB0IDwtIG9wZW5GcmFtZWRUcmFuc3BvcnQgaAorICByZXR1cm4gJCBGcmFtZWQgdAorZ2V0VHJhbnNwb3J0ICJodHRwIiBob3N0IHBvcnQgPSBsZXQgdXJpU3RyID0gImh0dHA6Ly8iICsrIGhvc3QgKysgIjoiICsrIHNob3cgcG9ydCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHBhcnNlVVJJIHVyaVN0ciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGhpbmcgLT4gZG8gcmV0dXJuIChOb1RyYW5zcG9ydCAkICJGYWlsZWQgdG8gcGFyc2UgVVJJOiAiICsrIHVyaVN0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKdXN0KHVyaSkgLT4gZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPC0gb3Blbkh0dHBDbGllbnQgdXJpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCBIdHRwIHQKK2dldFRyYW5zcG9ydCB0IGhvc3QgcG9ydCA9IGRvIHJldHVybiAoTm9UcmFuc3BvcnQgJCAiVW5zdXBwb3J0ZWQgdHJhbnNwb3J0OiAiICsrIHQpCisKK2RhdGEgUHJvdG9jb2xUeXBlID0gQmluYXJ5CisgICAgICAgICAgICAgICAgICB8IENvbXBhY3QKKyAgICAgICAgICAgICAgICAgIHwgSlNPTgorICAgICAgICAgICAgICAgICAgfCBIZWFkZXIKKyAgICAgICAgICAgICAgICAgIGRlcml2aW5nIChTaG93LCBFcSkKKworZ2V0UHJvdG9jb2wgOjogU3RyaW5nIC0+IFByb3RvY29sVHlwZQorZ2V0UHJvdG9jb2wgImJpbmFyeSIgID0gQmluYXJ5CitnZXRQcm90b2NvbCAiY29tcGFjdCIgPSBDb21wYWN0CitnZXRQcm90b2NvbCAianNvbiIgICAgPSBKU09OCitnZXRQcm90b2NvbCAiaGVhZGVyIiA9IEhlYWRlcgorZ2V0UHJvdG9jb2wgcCA9IGVycm9yICQgIlVuc3VwcG9ydGVkIFByb3RvY29sOiAiICsrIHAKKworZGVmYXVsdE9wdGlvbnMgOjogT3B0aW9ucworZGVmYXVsdE9wdGlvbnMgPSBPcHRpb25zCisgIHsgcG9ydCAgICAgICAgID0gOTA5MAorICAsIGRvbWFpblNvY2tldCA9ICIiCisgICwgaG9zdCAgICAgICAgID0gImxvY2FsaG9zdCIKKyAgLCB0cmFuc3BvcnQgICAgPSAiYnVmZmVyZWQiCisgICwgcHJvdG9jb2wgICAgID0gQmluYXJ5CisgICwgc3NsICAgICAgICAgID0gRmFsc2UKKyAgLCB0ZXN0TG9vcHMgICAgPSAxCisgIH0KKworcnVuQ2xpZW50IDo6IFByb3RvY29sIHAgPT4gcCAtPiBJTyAoKQorcnVuQ2xpZW50IHAgPSBkbworICBsZXQgcHJvdCA9IChwLHApCisgIHB1dFN0ckxuICJTdGFydGluZyBUZXN0cyIKKworICAtLSBWT0lEIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RWb2lkIgorICBDbGllbnQudGVzdFZvaWQgcHJvdAorCisgIC0tIFN0cmluZyBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0U3RyaW5nIgorICBzIDwtIENsaWVudC50ZXN0U3RyaW5nIHByb3QgIlRlc3QiCisgIHdoZW4gKHMgLz0gIlRlc3QiKSBleGl0RmFpbHVyZQorCisgIC0tIEJvb2wgVGVzdAorICBwdXRTdHJMbiAidGVzdEJvb2wiCisgIGJvb2wgPC0gQ2xpZW50LnRlc3RCb29sIHByb3QgVHJ1ZQorICB3aGVuIChub3QgYm9vbCkgZXhpdEZhaWx1cmUKKyAgcHV0U3RyTG4gInRlc3RCb29sIgorICBib29sIDwtIENsaWVudC50ZXN0Qm9vbCBwcm90IEZhbHNlCisgIHdoZW4gKGJvb2wpIGV4aXRGYWlsdXJlCisKKyAgLS0gQnl0ZSBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0Qnl0ZSIKKyAgYnl0ZSA8LSBDbGllbnQudGVzdEJ5dGUgcHJvdCAxCisgIHdoZW4gKGJ5dGUgLz0gMSkgZXhpdEZhaWx1cmUKKworICAtLSBJMzIgVGVzdAorICBwdXRTdHJMbiAidGVzdEkzMiIKKyAgaTMyIDwtIENsaWVudC50ZXN0STMyIHByb3QgKC0xKQorICB3aGVuIChpMzIgLz0gLTEpIGV4aXRGYWlsdXJlCisKKyAgLS0gSTY0IFRlc3QKKyAgcHV0U3RyTG4gInRlc3RJNjQiCisgIGk2NCA8LSBDbGllbnQudGVzdEk2NCBwcm90ICgtMzQzNTk3MzgzNjgpCisgIHdoZW4gKGk2NCAvPSAtMzQzNTk3MzgzNjgpIGV4aXRGYWlsdXJlCisKKyAgLS0gRG91YmxlIFRlc3QKKyAgcHV0U3RyTG4gInRlc3REb3VibGUiCisgIGR1YiA8LSBDbGllbnQudGVzdERvdWJsZSBwcm90ICgtNS4yMDk4NTIzKQorICB3aGVuIChhYnMgKGR1YiArIDUuMjA5ODUyMykgPiAwLjAwMSkgZXhpdEZhaWx1cmUKKworICAtLSBCaW5hcnkgVGVzdAorICBwdXRTdHJMbiAidGVzdEJpbmFyeSIKKyAgYmluIDwtIENsaWVudC50ZXN0QmluYXJ5IHByb3QgKExCUy5wYWNrIC4gcmV2ZXJzZSAkIFstMTI4Li4xMjddKQorICB3aGVuICgocmV2ZXJzZSBbLTEyOC4uMTI3XSkgLz0gTEJTLnVucGFjayBiaW4pIGV4aXRGYWlsdXJlCisgIAorICAtLSBTdHJ1Y3QgVGVzdAorICBsZXQgc3RydWN0SW4gPSBYdHJ1Y3R7IHh0cnVjdF9zdHJpbmdfdGhpbmcgPSAiWmVybyIKKyAgICAgICAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfYnl0ZV90aGluZyAgID0gMQorICAgICAgICAgICAgICAgICAgICAgICAsIHh0cnVjdF9pMzJfdGhpbmcgICAgPSAtMworICAgICAgICAgICAgICAgICAgICAgICAsIHh0cnVjdF9pNjRfdGhpbmcgICAgPSAtNQorICAgICAgICAgICAgICAgICAgICAgICB9CisgIHB1dFN0ckxuICJ0ZXN0U3RydWN0IgorICBzdHJ1Y3RPdXQgPC0gQ2xpZW50LnRlc3RTdHJ1Y3QgcHJvdCBzdHJ1Y3RJbgorICB3aGVuIChzdHJ1Y3RJbiAvPSBzdHJ1Y3RPdXQpIGV4aXRGYWlsdXJlCisKKyAgLS0gTmVzdGVkIFN0cnVjdCBUZXN0CisgIGxldCBuZXN0SW4gPSBYdHJ1Y3QyeyB4dHJ1Y3QyX2J5dGVfdGhpbmcgICA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAsIHh0cnVjdDJfc3RydWN0X3RoaW5nID0gc3RydWN0SW4KKyAgICAgICAgICAgICAgICAgICAgICAsIHh0cnVjdDJfaTMyX3RoaW5nICAgID0gNQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgcHV0U3RyTG4gInRlc3ROZXN0IgorICBuZXN0T3V0IDwtIENsaWVudC50ZXN0TmVzdCBwcm90IG5lc3RJbgorICB3aGVuIChuZXN0SW4gLz0gbmVzdE91dCkgZXhpdEZhaWx1cmUKKworICAtLSBNYXAgVGVzdAorICBsZXQgbWFwSW4gPSBNYXAuZnJvbUxpc3QgJCBtYXAgKFxpIC0+IChpLCBpLTEwKSkgWzEuLjVdCisgIHB1dFN0ckxuICJ0ZXN0TWFwIgorICBtYXBPdXQgPC0gQ2xpZW50LnRlc3RNYXAgcHJvdCBtYXBJbgorICB3aGVuIChtYXBJbiAvPSBtYXBPdXQpIGV4aXRGYWlsdXJlCisKKyAgLS0gU2V0IFRlc3QKKyAgbGV0IHNldEluID0gU2V0LmZyb21MaXN0IFstMi4uM10KKyAgcHV0U3RyTG4gInRlc3RTZXQiCisgIHNldE91dCA8LSBDbGllbnQudGVzdFNldCBwcm90IHNldEluCisgIHdoZW4gKHNldEluIC89IHNldE91dCkgZXhpdEZhaWx1cmUKKworICAtLSBMaXN0IFRlc3QKKyAgbGV0IGxpc3RJbiA9IFZlY3Rvci5mcm9tTGlzdCBbLTIuLjNdCisgIHB1dFN0ckxuICJ0ZXN0TGlzdCIKKyAgbGlzdE91dCA8LSBDbGllbnQudGVzdExpc3QgcHJvdCBsaXN0SW4KKyAgd2hlbiAobGlzdEluIC89IGxpc3RPdXQpIGV4aXRGYWlsdXJlCisKKyAgLS0gRW51bSBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0RW51bSIKKyAgbnVtejEgPC0gQ2xpZW50LnRlc3RFbnVtIHByb3QgT05FCisgIHdoZW4gKG51bXoxIC89IE9ORSkgZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdEVudW0iCisgIG51bXoyIDwtIENsaWVudC50ZXN0RW51bSBwcm90IFRXTworICB3aGVuIChudW16MiAvPSBUV08pIGV4aXRGYWlsdXJlCisKKyAgcHV0U3RyTG4gInRlc3RFbnVtIgorICBudW16NSA8LSBDbGllbnQudGVzdEVudW0gcHJvdCBGSVZFCisgIHdoZW4gKG51bXo1IC89IEZJVkUpIGV4aXRGYWlsdXJlCisKKyAgLS0gVHlwZWRlZiBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0VHlwZWRlZiIKKyAgdWlkIDwtIENsaWVudC50ZXN0VHlwZWRlZiBwcm90IDMwOTg1ODIzNTA4MjUyMworICB3aGVuICh1aWQgLz0gMzA5ODU4MjM1MDgyNTIzKSBleGl0RmFpbHVyZQorCisgIC0tIE5lc3RlZCBNYXAgVGVzdAorICBwdXRTdHJMbiAidGVzdE1hcE1hcCIKKyAgXyA8LSBDbGllbnQudGVzdE1hcE1hcCBwcm90IDEKKworICAtLSBFeGNlcHRpb24gVGVzdAorICBwdXRTdHJMbiAidGVzdEV4Y2VwdGlvbiIKKyAgZXhuMSA8LSB0cnkgJCBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcm90ICJYY2VwdGlvbiIKKyAgY2FzZSBleG4xIG9mCisgICAgTGVmdCAoWGNlcHRpb24gXyBfKSAtPiByZXR1cm4gKCkKKyAgICBfIC0+IHB1dFN0ckxuIChzaG93IGV4bjEpID4+IGV4aXRGYWlsdXJlCisKKyAgcHV0U3RyTG4gInRlc3RFeGNlcHRpb24iCisgIGV4bjIgPC0gdHJ5ICQgQ2xpZW50LnRlc3RFeGNlcHRpb24gcHJvdCAiVEV4Y2VwdGlvbiIKKyAgY2FzZSBleG4yIG9mCisgICAgTGVmdCAoXyA6OiBTb21lRXhjZXB0aW9uKSAtPiByZXR1cm4gKCkKKyAgICBSaWdodCBfIC0+IGV4aXRGYWlsdXJlCisKKyAgcHV0U3RyTG4gInRlc3RFeGNlcHRpb24iCisgIGV4bjMgPC0gdHJ5ICQgQ2xpZW50LnRlc3RFeGNlcHRpb24gcHJvdCAic3VjY2VzcyIKKyAgY2FzZSBleG4zIG9mCisgICAgTGVmdCAoXyA6OiBTb21lRXhjZXB0aW9uKSAtPiBleGl0RmFpbHVyZQorICAgIFJpZ2h0IF8gLT4gcmV0dXJuICgpCisKKyAgLS0gTXVsdGkgRXhjZXB0aW9uIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RNdWx0aUV4Y2VwdGlvbiIKKyAgbXVsdGkxIDwtIHRyeSAkIENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24gcHJvdCAiWGNlcHRpb24iICJ0ZXN0IDEiCisgIGNhc2UgbXVsdGkxIG9mCisgICAgTGVmdCAoWGNlcHRpb24gXyBfKSAtPiByZXR1cm4gKCkKKyAgICBfIC0+IGV4aXRGYWlsdXJlCisKKyAgcHV0U3RyTG4gInRlc3RNdWx0aUV4Y2VwdGlvbiIKKyAgbXVsdGkyIDwtIHRyeSAkIENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24gcHJvdCAiWGNlcHRpb24yIiAidGVzdCAyIgorICBjYXNlIG11bHRpMiBvZgorICAgIExlZnQgKFhjZXB0aW9uMiBfIF8pIC0+IHJldHVybiAoKQorICAgIF8gLT4gZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdE11bHRpRXhjZXB0aW9uIgorICBtdWx0aTMgPC0gdHJ5ICQgQ2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiBwcm90ICJzdWNjZXNzIiAidGVzdCAzIgorICBjYXNlIG11bHRpMyBvZgorICAgIExlZnQgKF8gOjogU29tZUV4Y2VwdGlvbikgLT4gZXhpdEZhaWx1cmUKKyAgICBSaWdodCBfIC0+IHJldHVybiAoKQorCisKK21haW4gOjogSU8gKCkKK21haW4gPSBkbworICBvcHRpb25zIDwtIGZsaXAgcGFyc2VGbGFncyBkZWZhdWx0T3B0aW9ucyA8JD4gZ2V0QXJncworICBjYXNlIG9wdGlvbnMgb2YKKyAgICBOb3RoaW5nIC0+IHNob3dIZWxwCisgICAgSnVzdCBPcHRpb25zey4ufSAtPiBkbworICAgICAgdHJhbnMgPC0gTWFpbi5nZXRUcmFuc3BvcnQgdHJhbnNwb3J0IGhvc3QgcG9ydAorICAgICAgY2FzZSB0cmFucyBvZgorICAgICAgICBCdWZmZXJlZCB0IC0+IHJ1blRlc3QgdGVzdExvb3BzIHByb3RvY29sIHQKKyAgICAgICAgRnJhbWVkIHQgICAtPiBydW5UZXN0IHRlc3RMb29wcyBwcm90b2NvbCB0CisgICAgICAgIEh0dHAgdCAgICAgLT4gcnVuVGVzdCB0ZXN0TG9vcHMgcHJvdG9jb2wgdAorICAgICAgICBOb1RyYW5zcG9ydCBlcnIgLT4gcHV0U3RyTG4gZXJyCisgIHdoZXJlCisgICAgbWFrZUNsaWVudCBwIHQgPSBjYXNlIHAgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5ICAtPiBydW5DbGllbnQgJCBCaW5hcnlQcm90b2NvbCB0CisgICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3QgLT4gcnVuQ2xpZW50ICQgQ29tcGFjdFByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAgSlNPTiAgICAtPiBydW5DbGllbnQgJCBKU09OUHJvdG9jb2wgdAorICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgIC0+IGNyZWF0ZUhlYWRlclByb3RvY29sIHQgdCA+Pj0gcnVuQ2xpZW50CisgICAgcnVuVGVzdCBsb29wcyBwIHQgPSBkbworICAgICAgbGV0IGNsaWVudCA9IG1ha2VDbGllbnQgcCB0CisgICAgICByZXBsaWNhdGVNXyBsb29wcyBjbGllbnQKKyAgICAgIHB1dFN0ckxuICJDT01QTEVURUQgU1VDQ0VTU0ZVTExZIgorCitwYXJzZUZsYWdzIDo6IFtTdHJpbmddIC0+IE9wdGlvbnMgLT4gTWF5YmUgT3B0aW9ucworcGFyc2VGbGFncyAoZmxhZyA6IGZsYWdzKSBvcHRzID0gZG8KKyAgbGV0IHBpZWNlcyA9IHNwbGl0T24gIj0iIGZsYWcKKyAgY2FzZSBwaWVjZXMgb2YKKyAgICAiLS1wb3J0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBwb3J0ID0gcmVhZCBhcmcgfQorICAgICItLWRvbWFpbi1zb2NrZXQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IGRvbWFpblNvY2tldCA9IHJlYWQgYXJnIH0KKyAgICAiLS1ob3N0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBob3N0ID0gYXJnIH0KKyAgICAiLS10cmFuc3BvcnQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHRyYW5zcG9ydCA9IGFyZyB9CisgICAgIi0tcHJvdG9jb2wiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHByb3RvY29sID0gZ2V0UHJvdG9jb2wgYXJnIH0KKyAgICAiLW4iIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHRlc3RMb29wcyA9IHJlYWQgYXJnIH0KKyAgICAiLS1oIiA6IF8gLT4gTm90aGluZworICAgICItLWhlbHAiIDogXyAtPiBOb3RoaW5nCisgICAgIi0tc3NsIiA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBzc2wgPSBUcnVlIH0KKyAgICAiLS1wcm9jZXNzb3ItZXZlbnRzIiA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzCisgICAgXyAtPiBOb3RoaW5nCitwYXJzZUZsYWdzIFtdIG9wdHMgPSBKdXN0IG9wdHMKKworc2hvd0hlbHAgOjogSU8gKCkKK3Nob3dIZWxwID0gcHV0U3RyTG4KKyAgIkFsbG93ZWQgb3B0aW9uczpcblwKKyAgXCAgLWggWyAtLWhlbHAgXSAgICAgICAgICAgICAgIHByb2R1Y2UgaGVscCBtZXNzYWdlXG5cCisgIFwgIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3RcblwKKyAgXCAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3RcblwKKyAgXCAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksXG5cCisgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnRcblwKKyAgXCAgLS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cFxuXAorICBcICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvblxuXAorICBcICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0xcblwKKyAgXCAgLW4gWyAtLXRlc3Rsb29wcyBdIGFyZyAoPTEpIE51bWJlciBvZiBUZXN0cyIKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvVGVzdFNlcnZlci5ocyBiL3Rlc3QvaHMvVGVzdFNlcnZlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzczMWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9UZXN0U2VydmVyLmhzCkBAIC0wLDAgKzEsMzEyIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzLFJlY29yZFdpbGRDYXJkcyAjLX0KK21vZHVsZSBNYWluIHdoZXJlCisKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbgoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKK2ltcG9ydCBEYXRhLkhhc2hNYXAuU3RyaWN0IChIYXNoTWFwKQoraW1wb3J0IERhdGEuTGlzdAoraW1wb3J0IERhdGEuTGlzdC5TcGxpdAoraW1wb3J0IERhdGEuU3RyaW5nCitpbXBvcnQgTmV0d29yaworaW1wb3J0IFN5c3RlbS5FbnZpcm9ubWVudAoraW1wb3J0IFN5c3RlbS5FeGl0CitpbXBvcnQgU3lzdGVtLklPCitpbXBvcnQgQ29udHJvbC5Db25jdXJyZW50ICh0aHJlYWREZWxheSkKK2ltcG9ydCBxdWFsaWZpZWQgU3lzdGVtLklPIGFzIElPCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgVGV4dAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3IKKworaW1wb3J0IFRocmlmdFRlc3QKK2ltcG9ydCBUaHJpZnRUZXN0X0lmYWNlCitpbXBvcnQgVGhyaWZ0VGVzdF9UeXBlcworCitpbXBvcnQgVGhyaWZ0CitpbXBvcnQgVGhyaWZ0LlNlcnZlcgoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuRnJhbWVkCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KKworZGF0YSBPcHRpb25zID0gT3B0aW9ucworICB7IHBvcnQgICAgICAgICA6OiBJbnQKKyAgLCBkb21haW5Tb2NrZXQgOjogU3RyaW5nCisgICwgc2VydmVyVHlwZSAgIDo6IFNlcnZlclR5cGUKKyAgLCB0cmFuc3BvcnQgICAgOjogU3RyaW5nCisgICwgcHJvdG9jb2wgICAgIDo6IFByb3RvY29sVHlwZQorICAsIHNzbCAgICAgICAgICA6OiBCb29sCisgICwgd29ya2VycyAgICAgIDo6IEludAorICB9CisKK2RhdGEgU2VydmVyVHlwZSA9IFNpbXBsZQorICAgICAgICAgICAgICAgIHwgVGhyZWFkUG9vbAorICAgICAgICAgICAgICAgIHwgVGhyZWFkZWQKKyAgICAgICAgICAgICAgICB8IE5vbkJsb2NraW5nCisgICAgICAgICAgICAgICAgZGVyaXZpbmcgKFNob3csIEVxKQorCitpbnN0YW5jZSBJc1N0cmluZyBTZXJ2ZXJUeXBlIHdoZXJlCisgIGZyb21TdHJpbmcgInNpbXBsZSIgICAgICA9IFNpbXBsZQorICBmcm9tU3RyaW5nICJ0aHJlYWQtcG9vbCIgPSBUaHJlYWRQb29sCisgIGZyb21TdHJpbmcgInRocmVhZGVkIiAgICA9IFRocmVhZGVkCisgIGZyb21TdHJpbmcgIm5vbmJsb2NraW5nIiA9IE5vbkJsb2NraW5nCisgIGZyb21TdHJpbmcgXyA9IGVycm9yICJub3QgYSB2YWxpZCBzZXJ2ZXIgdHlwZSIKKworZGF0YSBUcmFuc3BvcnRUeXBlID0gQnVmZmVyZWQgKFNvY2tldCAtPiAoSU8gSU8uSGFuZGxlKSkKKyAgICAgICAgICAgICAgICAgICB8IEZyYW1lZCAoU29ja2V0IC0+IChJTyAoRnJhbWVkVHJhbnNwb3J0IElPLkhhbmRsZSkpKQorICAgICAgICAgICAgICAgICAgIHwgTm9UcmFuc3BvcnQgU3RyaW5nCisKK2dldFRyYW5zcG9ydCA6OiBTdHJpbmcgLT4gVHJhbnNwb3J0VHlwZQorZ2V0VHJhbnNwb3J0ICJidWZmZXJlZCIgPSBCdWZmZXJlZCAkIFxzIC0+IGRvCisgIChoLCBfLCBfKSA8LSAoYWNjZXB0IHMpCisgIElPLmhTZXRCdWZmZXJpbmcgaCAkIElPLkJsb2NrQnVmZmVyaW5nIE5vdGhpbmcKKyAgcmV0dXJuIGgKK2dldFRyYW5zcG9ydCAiZnJhbWVkIiA9IEZyYW1lZCAkIFxzIC0+IGRvCisgIChoLCBfLCBfKSA8LSAoYWNjZXB0IHMpCisgIG9wZW5GcmFtZWRUcmFuc3BvcnQgaAorZ2V0VHJhbnNwb3J0IHQgPSBOb1RyYW5zcG9ydCAkICJVbnN1cHBvcnRlZCB0cmFuc3BvcnQ6ICIgKysgdAorCitkYXRhIFByb3RvY29sVHlwZSA9IEJpbmFyeQorICAgICAgICAgICAgICAgICAgfCBDb21wYWN0CisgICAgICAgICAgICAgICAgICB8IEpTT04KKyAgICAgICAgICAgICAgICAgIHwgSGVhZGVyCisKK2dldFByb3RvY29sIDo6IFN0cmluZyAtPiBQcm90b2NvbFR5cGUKK2dldFByb3RvY29sICJiaW5hcnkiICA9IEJpbmFyeQorZ2V0UHJvdG9jb2wgImNvbXBhY3QiID0gQ29tcGFjdAorZ2V0UHJvdG9jb2wgImpzb24iICAgID0gSlNPTgorZ2V0UHJvdG9jb2wgImhlYWRlciIgID0gSGVhZGVyCitnZXRQcm90b2NvbCBwID0gZXJyb3IgJCJVbnN1cHBvcnRlZCBQcm90b2NvbDogIiArKyBwCisKK2RlZmF1bHRPcHRpb25zIDo6IE9wdGlvbnMKK2RlZmF1bHRPcHRpb25zID0gT3B0aW9ucworICB7IHBvcnQgICAgICAgICA9IDkwOTAKKyAgLCBkb21haW5Tb2NrZXQgPSAiIgorICAsIHNlcnZlclR5cGUgICA9IFRocmVhZGVkCisgICwgdHJhbnNwb3J0ICAgID0gImJ1ZmZlcmVkIgorICAsIHByb3RvY29sICAgICA9IEJpbmFyeQorICAtLSBUT0RPOiBIYXNrZWxsIGxpYiBkb2VzIG5vdCBoYXZlIFNTTCBzdXBwb3J0CisgICwgc3NsICAgICAgICAgID0gRmFsc2UKKyAgLCB3b3JrZXJzICAgICAgPSA0CisgIH0KKworc3RyaW5naWZ5TWFwIDo6IChTaG93IGEsIFNob3cgYikgPT4gTWFwLkhhc2hNYXAgYSBiIC0+IFN0cmluZworc3RyaW5naWZ5TWFwID0gRGF0YS5MaXN0LmludGVyY2FsYXRlICIsICIgLiBEYXRhLkxpc3QubWFwIGpvaW5LViAuIE1hcC50b0xpc3QKKyAgd2hlcmUgam9pbktWIChrLCB2KSA9IHNob3cgayArKyAiID0+ICIgKysgc2hvdyB2CisKK3N0cmluZ2lmeVNldCA6OiBTaG93IGEgPT4gU2V0Lkhhc2hTZXQgYSAtPiBTdHJpbmcKK3N0cmluZ2lmeVNldCA9IERhdGEuTGlzdC5pbnRlcmNhbGF0ZSAiLCAiIC4gRGF0YS5MaXN0Lm1hcCBzaG93IC4gU2V0LnRvTGlzdAorCitzdHJpbmdpZnlMaXN0IDo6IFNob3cgYSA9PiBWZWN0b3IuVmVjdG9yIGEgLT4gU3RyaW5nCitzdHJpbmdpZnlMaXN0ID0gRGF0YS5MaXN0LmludGVyY2FsYXRlICIsICIgLiBEYXRhLkxpc3QubWFwIHNob3cgLiBWZWN0b3IudG9MaXN0CisKK2RhdGEgVGVzdEhhbmRsZXIgPSBUZXN0SGFuZGxlcgoraW5zdGFuY2UgVGhyaWZ0VGVzdF9JZmFjZSBUZXN0SGFuZGxlciB3aGVyZQorICB0ZXN0Vm9pZCBfID0gU3lzdGVtLklPLnB1dFN0ckxuICJ0ZXN0Vm9pZCgpIgorCisgIHRlc3RTdHJpbmcgXyBzID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdFN0cmluZygiICsrIHNob3cgcyArKyAiKSIKKyAgICByZXR1cm4gcworCisgIHRlc3RCb29sIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RCb29sKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdEJ5dGUgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEJ5dGUoIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0STMyIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RJMzIoIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0STY0IF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RJNjQoIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0RG91YmxlIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3REb3VibGUoIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0QmluYXJ5IF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RCaW5hcnkoIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0U3RydWN0IF8gc3RydWN0QFh0cnVjdHsuLn0gPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0U3RydWN0KHsiICsrIHNob3cgeHRydWN0X3N0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICsrICIsICIgKysgc2hvdyB4dHJ1Y3RfYnl0ZV90aGluZworICAgICAgICAgICAgICAgICAgICAgICsrICIsICIgKysgc2hvdyB4dHJ1Y3RfaTMyX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgKysgIiwgIiArKyBzaG93IHh0cnVjdF9pNjRfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICArKyAifSkiCisgICAgcmV0dXJuIHN0cnVjdAorCisgIHRlc3ROZXN0IF8gbmVzdEBYdHJ1Y3Qyey4ufSA9IGRvCisgICAgbGV0IFh0cnVjdHsuLn0gPSB4dHJ1Y3QyX3N0cnVjdF90aGluZworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TmVzdCh7IiArKyBzaG93IHh0cnVjdDJfYnl0ZV90aGluZworICAgICAgICAgICAgICAgICAgICsrICJ7LCAiICsrIHNob3cgeHRydWN0X3N0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICsrICAiLCAiICsrIHNob3cgeHRydWN0X2J5dGVfdGhpbmcKKyAgICAgICAgICAgICAgICAgICArKyAgIiwgIiArKyBzaG93IHh0cnVjdF9pMzJfdGhpbmcKKyAgICAgICAgICAgICAgICAgICArKyAgIiwgIiArKyBzaG93IHh0cnVjdF9pNjRfdGhpbmcKKyAgICAgICAgICAgICAgICAgICArKyAifSwgIiArKyBzaG93IHh0cnVjdDJfaTMyX3RoaW5nCisgICAgcmV0dXJuIG5lc3QKKworICB0ZXN0TWFwIF8gbSA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RNYXAoeyIgKysgc3RyaW5naWZ5TWFwIG0gKysgIn0pIgorICAgIHJldHVybiBtCisKKyAgdGVzdFN0cmluZ01hcCBfIG0gPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0U3RyaW5nTWFwKCIgKysgc3RyaW5naWZ5TWFwIG0gKysgIn0pIgorICAgIHJldHVybiBtCisKKyAgdGVzdFNldCBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0U2V0KHsiICsrIHN0cmluZ2lmeVNldCB4ICsrICJ9KSIKKyAgICByZXR1cm4geAorCisgIHRlc3RMaXN0IF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RMaXN0KCIgKysgc3RyaW5naWZ5TGlzdCB4ICsrICJ9KSIKKyAgICByZXR1cm4geAorCisgIHRlc3RFbnVtIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RFbnVtKCIgKysgc2hvdyB4ICsrICIpIgorICAgIHJldHVybiB4CisKKyAgdGVzdFR5cGVkZWYgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdFR5cGVkZWYoIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0TWFwTWFwIF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RNYXBNYXAoIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuICQgTWFwLmZyb21MaXN0IFsgKC00LCBNYXAuZnJvbUxpc3QgWyAoLTQsIC00KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKC0zLCAtMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICgtMiwgLTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoLTEsIC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICwgKDQsICBNYXAuZnJvbUxpc3QgWyAoMSwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICgyLCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKDMsIDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoNCwgNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgdGVzdEluc2FuaXR5IF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICJ0ZXN0SW5zYW5pdHkoKSIKKyAgICByZXR1cm4gJCBNYXAuZnJvbUxpc3QgWyAoMSwgTWFwLmZyb21MaXN0IFsgKFRXTyAgLCB4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoVEhSRUUsIHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAsICgyLCBNYXAuZnJvbUxpc3QgWyAoU0lYLCBkZWZhdWx0X0luc2FuaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXQorCisgIHRlc3RNdWx0aSBfIGJ5dGUgaTMyIGk2NCBfIF8gXyA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICJ0ZXN0TXVsdGkoKSIKKyAgICByZXR1cm4gWHRydWN0eyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nID0gVGV4dC5wYWNrICJIZWxsbzIiCisgICAgICAgICAgICAgICAgICwgeHRydWN0X2J5dGVfdGhpbmcgICA9IGJ5dGUKKyAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfaTMyX3RoaW5nICAgID0gaTMyCisgICAgICAgICAgICAgICAgICwgeHRydWN0X2k2NF90aGluZyAgICA9IGk2NAorICAgICAgICAgICAgICAgICB9CisKKyAgdGVzdEV4Y2VwdGlvbiBfIHMgPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0RXhjZXB0aW9uKCIgKysgc2hvdyBzICsrICIpIgorICAgIGNhc2UgcyBvZgorICAgICAgIlhjZXB0aW9uIiAgIC0+IHRocm93ICQgWGNlcHRpb24gMTAwMSBzCisgICAgICAiVEV4Y2VwdGlvbiIgLT4gdGhyb3cgVGhyaWZ0RXhjZXB0aW9uCisgICAgICBfIC0+IHJldHVybiAoKQorCisgIHRlc3RNdWx0aUV4Y2VwdGlvbiBfIHMxIHMyID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE11bHRpRXhjZXB0aW9uKCIgKysgc2hvdyBzMSArKyAiLCAiICsrIHNob3cgczIgKysgICIpIgorICAgIGNhc2UgczEgb2YKKyAgICAgICJYY2VwdGlvbiIgICAtPiB0aHJvdyAkIFhjZXB0aW9uIDEwMDEgIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgICAiWGNlcHRpb24yIiAgLT4gdGhyb3cgJCBYY2VwdGlvbjIgMjAwMiAkIFh0cnVjdCAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiIDAgMCAwCisgICAgICAiVEV4Y2VwdGlvbiIgLT4gdGhyb3cgVGhyaWZ0RXhjZXB0aW9uCisgICAgICBfIC0+IHJldHVybiBkZWZhdWx0X1h0cnVjdHsgeHRydWN0X3N0cmluZ190aGluZyA9IHMyIH0KKworICB0ZXN0T25ld2F5IF8gaSA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RPbmV3YXkoIiArKyBzaG93IGkgKysgIik6IFNsZWVwaW5nLi4uIgorICAgIHRocmVhZERlbGF5ICQgKGZyb21JbnRlZ3JhbCBpKSAqIDEwMDAwMDAKKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE9uZXdheSgiICsrIHNob3cgaSArKyAiKTogZG9uZSBzbGVlcGluZyEiCisKK21haW4gOjogSU8gKCkKK21haW4gPSBkbworICBvcHRpb25zIDwtIGZsaXAgcGFyc2VGbGFncyBkZWZhdWx0T3B0aW9ucyA8JD4gZ2V0QXJncworICBjYXNlIG9wdGlvbnMgb2YKKyAgICBOb3RoaW5nIC0+IHNob3dIZWxwCisgICAgSnVzdCBPcHRpb25zey4ufSAtPiBkbworICAgICAgY2FzZSBNYWluLmdldFRyYW5zcG9ydCB0cmFuc3BvcnQgb2YKKyAgICAgICAgQnVmZmVyZWQgZiAtPiBydW5TZXJ2ZXIgcHJvdG9jb2wgZiBwb3J0CisgICAgICAgIEZyYW1lZCAgIGYgLT4gcnVuU2VydmVyIHByb3RvY29sIGYgcG9ydAorICAgICAgICBOb1RyYW5zcG9ydCBlcnIgLT4gcHV0U3RyTG4gZXJyCisgICAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAiU3RhcnRpbmcgXCIiICsrIHNob3cgc2VydmVyVHlwZSArKyAiXCIgc2VydmVyICgiICsrCisgICAgICAgIHNob3cgdHJhbnNwb3J0ICsrICIpIGxpc3RlbiBvbjogIiArKyBkb21haW5Tb2NrZXQgKysgc2hvdyBwb3J0CisgICAgICB3aGVyZQorICAgICAgICBhY2NlcHRvciBwIGYgc29ja2V0ID0gZG8KKyAgICAgICAgICB0IDwtIGYgc29ja2V0CisgICAgICAgICAgcmV0dXJuIChwIHQsIHAgdCkKKworICAgICAgICBoZWFkZXJBY2NlcHRvciBmIHNvY2tldCA9IGRvCisgICAgICAgICAgdCA8LSBmIHNvY2tldAorICAgICAgICAgIHAgPC0gY3JlYXRlSGVhZGVyUHJvdG9jb2wxIHQKKyAgICAgICAgICByZXR1cm4gKHAsIHApCisKKyAgICAgICAgZG9SdW5TZXJ2ZXIgcCBmID0gZG8KKyAgICAgICAgICBydW5UaHJlYWRlZFNlcnZlciAoYWNjZXB0b3IgcCBmKSBUZXN0SGFuZGxlciBUaHJpZnRUZXN0LnByb2Nlc3MgLiBQb3J0TnVtYmVyIC4gZnJvbUludGVncmFsCisKKyAgICAgICAgcnVuU2VydmVyIHAgZiBwb3J0ID0gY2FzZSBwIG9mCisgICAgICAgICAgQmluYXJ5ICAtPiBkb1J1blNlcnZlciBCaW5hcnlQcm90b2NvbCBmIHBvcnQKKyAgICAgICAgICBDb21wYWN0IC0+IGRvUnVuU2VydmVyIENvbXBhY3RQcm90b2NvbCBmIHBvcnQKKyAgICAgICAgICBKU09OICAgIC0+IGRvUnVuU2VydmVyIEpTT05Qcm90b2NvbCBmIHBvcnQKKyAgICAgICAgICBIZWFkZXIgIC0+IHJ1blRocmVhZGVkU2VydmVyIChoZWFkZXJBY2NlcHRvciBmKSBUZXN0SGFuZGxlciBUaHJpZnRUZXN0LnByb2Nlc3MgKFBvcnROdW1iZXIgJCBmcm9tSW50ZWdyYWwgcG9ydCkKKworcGFyc2VGbGFncyA6OiBbU3RyaW5nXSAtPiBPcHRpb25zIC0+IE1heWJlIE9wdGlvbnMKK3BhcnNlRmxhZ3MgKGZsYWcgOiBmbGFncykgb3B0cyA9IGRvCisgIGxldCBwaWVjZXMgPSBzcGxpdE9uICI9IiBmbGFnCisgIGNhc2UgcGllY2VzIG9mCisgICAgIi0tcG9ydCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgcG9ydCA9IHJlYWQgYXJnIH0KKyAgICAiLS1kb21haW4tc29ja2V0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBkb21haW5Tb2NrZXQgPSByZWFkIGFyZyB9CisgICAgIi0tc2VydmVyLXR5cGUiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHNlcnZlclR5cGUgPSBmcm9tU3RyaW5nIGFyZyB9CisgICAgIi0tdHJhbnNwb3J0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyB0cmFuc3BvcnQgPSBhcmcgfQorICAgICItLXByb3RvY29sIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBwcm90b2NvbCA9IGdldFByb3RvY29sIGFyZyB9CisgICAgIi0td29ya2VycyIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgd29ya2VycyA9IHJlYWQgYXJnIH0KKyAgICAiLW4iIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHdvcmtlcnMgPSByZWFkIGFyZyB9CisgICAgIi0taCIgOiBfIC0+IE5vdGhpbmcKKyAgICAiLS1oZWxwIiA6IF8gLT4gTm90aGluZworICAgICItLXNzbCIgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgc3NsID0gVHJ1ZSB9CisgICAgIi0tcHJvY2Vzc29yLWV2ZW50cyIgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0cworICAgIF8gLT4gTm90aGluZworcGFyc2VGbGFncyBbXSBvcHRzID0gSnVzdCBvcHRzCisKK3Nob3dIZWxwIDo6IElPICgpCitzaG93SGVscCA9IFN5c3RlbS5JTy5wdXRTdHJMbgorICAiQWxsb3dlZCBvcHRpb25zOlxuXAorICBcICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2VcblwKKyAgXCAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGxpc3RlblxuXAorICBcICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpXG5cCisgIFwgIC0tc2VydmVyLXR5cGUgYXJnICg9c2ltcGxlKSB0eXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiwgXCJ0aHJlYWQtcG9vbFwiLFxuXAorICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aHJlYWRlZFwiLCBvciBcIm5vbmJsb2NraW5nXCJcblwKKyAgXCAgLS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZFxuXAorICBcICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgcHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvblxuXAorICBcICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0xcblwKKyAgXCAgLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHNcblwKKyAgXCAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3JcblwKKyAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlIgpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UaHJpZnRUZXN0VXRpbHMuaHMgYi90ZXN0L2hzL1RocmlmdFRlc3RVdGlscy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzE5YjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ocy9UaHJpZnRUZXN0VXRpbHMuaHMKQEAgLTAsMCArMSw2NSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnRUZXN0VXRpbHMgKENsaWVudEZ1bmMsIFNlcnZlckZ1bmMsIGNsaWVudExvZywgc2VydmVyTG9nLCB0ZXN0TG9nLCBydW5UZXN0KSB3aGVyZQorCisKK2ltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5Db25jdXJyZW50CitpbXBvcnQgcXVhbGlmaWVkIE5ldHdvcmsKK2ltcG9ydCBxdWFsaWZpZWQgU3lzdGVtLklPCisKKworc2VydmVyUG9ydCA6OiBOZXR3b3JrLlBvcnROdW1iZXIKK3NlcnZlclBvcnQgPSA5MDkwCisKK3NlcnZlckFkZHJlc3MgOjogKFN0cmluZywgTmV0d29yay5Qb3J0SUQpCitzZXJ2ZXJBZGRyZXNzID0gKCJsb2NhbGhvc3QiLCBOZXR3b3JrLlBvcnROdW1iZXIgc2VydmVyUG9ydCkKKworCit0ZXN0TG9nIDo6IFN0cmluZyAtPiBJTyAoKQordGVzdExvZyBzdHIgPSBkbworICAgIFN5c3RlbS5JTy5oUHV0U3RyIFN5c3RlbS5JTy5zdGRvdXQgJCBzdHIgKysgIlxuIgorICAgIFN5c3RlbS5JTy5oRmx1c2ggU3lzdGVtLklPLnN0ZG91dAorCisKK2NsaWVudExvZyA6OiBTdHJpbmcgLT4gSU8gKCkKK2NsaWVudExvZyBzdHIgPSB0ZXN0TG9nICQgIkNMSUVOVDogIiArKyBzdHIKKworc2VydmVyTG9nIDo6IFN0cmluZyAtPiBJTyAoKQorc2VydmVyTG9nIHN0ciA9IHRlc3RMb2cgJCAiU0VSVkVSOiAiICsrIHN0cgorCisKK3R5cGUgU2VydmVyRnVuYyA9IE5ldHdvcmsuUG9ydE51bWJlciAtPiBJTyAoKQordHlwZSBDbGllbnRGdW5jID0gKFN0cmluZywgTmV0d29yay5Qb3J0SUQpIC0+IElPICgpCisKK3J1blRlc3QgOjogU2VydmVyRnVuYyAtPiBDbGllbnRGdW5jIC0+IElPICgpCitydW5UZXN0IHNlcnZlciBjbGllbnQgPSBkbworICAgIF8gPC0gQ29udHJvbC5Db25jdXJyZW50LmZvcmtJTyAoc2VydmVyIHNlcnZlclBvcnQpCisKKyAgICAtLSBGYWlybHkgaG9ycmlibGU7IHRoaXMgZG9lcyBub3QgMTAwJSBndWFyYW50ZWVzIHRoYXQgdGhlIG90aGVyIHRocmVhZAorICAgIC0tIGhhcyBhY3R1YWxseSBvcGVuZWQgdGhlIHNvY2tldCB3ZSBuZWVkLi4uIGJ1dCBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbworICAgIC0tIHdpdGhvdXQgdGhpcywgdGhlIGNsaWVudCByYWNlcyB0aGUgc2VydmVyIHRvIHRoZSBzb2NrZXQsIGFuZCB3aW5zIGV2ZXJ5CisgICAgLS0gdGltZQorICAgIENvbnRyb2wuQ29uY3VycmVudC55aWVsZAorICAgIENvbnRyb2wuQ29uY3VycmVudC50aHJlYWREZWxheSAkIDUwMCAqIDEwMDAgLS0gdW5pdCBpcyBpbiBfbWljcm9fc2Vjb25kcworICAgIENvbnRyb2wuQ29uY3VycmVudC55aWVsZAorCisgICAgY2xpZW50IHNlcnZlckFkZHJlc3MKKworICAgIHRlc3RMb2cgIlNVQ0NFU1MiCmRpZmYgLS1naXQgYS90ZXN0L2hzL1RocmlmdFRlc3RfTWFpbi5ocyBiL3Rlc3QvaHMvVGhyaWZ0VGVzdF9NYWluLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDAyM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL1RocmlmdFRlc3RfTWFpbi5ocwpAQCAtMCwwICsxLDIxNCBAQAorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19CistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorCittb2R1bGUgTWFpbiB3aGVyZQorCisKK2ltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5FeGNlcHRpb24KK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3IKKworaW1wb3J0IHF1YWxpZmllZCBOZXR3b3JrCisKK2ltcG9ydCBUaHJpZnQKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlNlcnZlcgoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlCisKK2ltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0VGVzdFV0aWxzCisKK2ltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0VGVzdAoraW1wb3J0IHF1YWxpZmllZCBUaHJpZnRUZXN0X0NsaWVudCBhcyBDbGllbnQKK2ltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0VGVzdF9JZmFjZSBhcyBJZmFjZQoraW1wb3J0IHF1YWxpZmllZCBUaHJpZnRUZXN0X1R5cGVzIGFzIFR5cGVzCisKKworZGF0YSBUZXN0SGFuZGxlciA9IFRlc3RIYW5kbGVyCitpbnN0YW5jZSBJZmFjZS5UaHJpZnRUZXN0X0lmYWNlIFRlc3RIYW5kbGVyIHdoZXJlCisgICAgdGVzdFZvaWQgXyA9IHJldHVybiAoKQorCisgICAgdGVzdFN0cmluZyBfIHMgPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyBzCisgICAgICAgIHJldHVybiBzCisKKyAgICB0ZXN0Qnl0ZSBfIHggPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CisgICAgICAgIHJldHVybiB4CisKKyAgICB0ZXN0STMyIF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3RJNjQgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdERvdWJsZSBfIHggPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CisgICAgICAgIHJldHVybiB4CisKKyAgICB0ZXN0QmluYXJ5IF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3RTdHJ1Y3QgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdE5lc3QgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdE1hcCBfIHggPSBkbworICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CisgICAgICAgIHJldHVybiB4CisKKyAgICB0ZXN0U3RyaW5nTWFwIF8geCA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKKyAgICAgICAgcmV0dXJuIHgKKworICAgIHRlc3RTZXQgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdExpc3QgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdEVudW0gXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdFR5cGVkZWYgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAorCisgICAgdGVzdE1hcE1hcCBfIF8gPSBkbworICAgICAgICByZXR1cm4gKE1hcC5mcm9tTGlzdCBbKDEsIE1hcC5mcm9tTGlzdCBbKDIsIDIpXSldKQorCisgICAgdGVzdEluc2FuaXR5IF8geCA9IGRvCisgICAgICAgIHJldHVybiAoTWFwLmZyb21MaXN0IFsoMSwgTWFwLmZyb21MaXN0IFsoVHlwZXMuT05FLCB4KV0pXSkKKworICAgIHRlc3RNdWx0aSBfIF8gXyBfIF8gXyBfID0gZG8KKyAgICAgICAgcmV0dXJuIChUeXBlcy5YdHJ1Y3QgIiIgMCAwIDApCisKKyAgICB0ZXN0RXhjZXB0aW9uIF8gXyA9IGRvCisgICAgICAgIENvbnRyb2wuRXhjZXB0aW9uLnRocm93IChUeXBlcy5YY2VwdGlvbiAxICJieWEiKQorCisgICAgdGVzdE11bHRpRXhjZXB0aW9uIF8gXyBfID0gZG8KKyAgICAgICAgQ29udHJvbC5FeGNlcHRpb24udGhyb3cgKFR5cGVzLlhjZXB0aW9uIDEgInh5eiIpCisKKyAgICB0ZXN0T25ld2F5IF8gaSA9IGRvCisgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IGkKKworCitjbGllbnQgOjogKFN0cmluZywgTmV0d29yay5Qb3J0SUQpIC0+IElPICgpCitjbGllbnQgYWRkciA9IGRvCisgICAgdG8gPC0gaE9wZW4gYWRkcgorICAgIGxldCBwcyA9IChCaW5hcnlQcm90b2NvbCB0bywgQmluYXJ5UHJvdG9jb2wgdG8pCisKKyAgICB2MSA8LSBDbGllbnQudGVzdFN0cmluZyBwcyAiYnlhIgorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYxCisKKyAgICB2MiA8LSBDbGllbnQudGVzdEJ5dGUgcHMgOAorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYyCisKKyAgICB2MyA8LSBDbGllbnQudGVzdEJ5dGUgcHMgKC04KQorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYzCisKKyAgICB2NCA8LSBDbGllbnQudGVzdEkzMiBwcyAzMgorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHY0CisKKyAgICB2NSA8LSBDbGllbnQudGVzdEkzMiBwcyAoLTMyKQorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHY1CisKKyAgICB2NiA8LSBDbGllbnQudGVzdEk2NCBwcyA2NAorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHY2CisKKyAgICB2NyA8LSBDbGllbnQudGVzdEk2NCBwcyAoLTY0KQorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHY3CisKKyAgICB2OCA8LSBDbGllbnQudGVzdERvdWJsZSBwcyAzLjE0CisgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjgKKworICAgIHY5IDwtIENsaWVudC50ZXN0RG91YmxlIHBzICgtMy4xNCkKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2OQorCisgICAgLS0gVE9ETzogQ2xpZW50LnRlc3RCaW5hcnkgLi4uCisJCisgICAgdjEwIDwtIENsaWVudC50ZXN0TWFwIHBzIChNYXAuZnJvbUxpc3QgWygxLDEpLCgyLDIpLCgzLDMpXSkKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTAKKworICAgIHYxMSA8LSBDbGllbnQudGVzdFN0cmluZ01hcCBwcyAoTWFwLmZyb21MaXN0IFsoImEiLCIxMjMiKSwoImEgYiIsIndpdGggc3BhY2VzICIpLCgic2FtZSIsInNhbWUiKSwoIjAiLCJudW1lcmljIGtleSIpXSkKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTEKKworICAgIHYxMiA8LSBDbGllbnQudGVzdExpc3QgcHMgKFZlY3Rvci5mcm9tTGlzdCBbMSwyLDMsNCw1XSkKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTIKKworICAgIHYxMyA8LSBDbGllbnQudGVzdFNldCBwcyAoU2V0LmZyb21MaXN0IFsxLDIsMyw0LDVdKQorICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYxMworCisgICAgdjE0IDwtIENsaWVudC50ZXN0U3RydWN0IHBzIChUeXBlcy5YdHJ1Y3QgImhpIiA0IDUgMCkKKyAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyB2MTQKKworICAgICh0ZXN0RXhjZXB0aW9uIHBzICJiYWQiKSBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIHRlc3RFeGNlcHRpb25IYW5kbGVyCisKKyAgICAodGVzdE11bHRpRXhjZXB0aW9uIHBzICJvayIpIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgdGVzdE11bHRpRXhjZXB0aW9uSGFuZGxlcjEKKyAgICAodGVzdE11bHRpRXhjZXB0aW9uIHBzICJiYWQiKSBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIHRlc3RNdWx0aUV4Y2VwdGlvbkhhbmRsZXIyIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgdGVzdE11bHRpRXhjZXB0aW9uSGFuZGxlcjMKKworICAgIC0tICggIChDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uIHBzICJlIiAiZTIiPj4gVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAiYmFkIikgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCAKKworICAgIHRDbG9zZSB0bworICB3aGVyZSB0ZXN0RXhjZXB0aW9uIHBzIG1zZyA9IGRvCisgICAgICAgICAgICBfIDwtIENsaWVudC50ZXN0RXhjZXB0aW9uIHBzICJlIgorICAgICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyBtc2cKKyAgICAgICAgICAgIHJldHVybiAoKQorCisgICAgICAgIHRlc3RFeGNlcHRpb25IYW5kbGVyIChlIDo6IFR5cGVzLlhjZXB0aW9uKSA9IGRvCisgICAgICAgICAgICBUaHJpZnRUZXN0VXRpbHMuY2xpZW50TG9nICQgc2hvdyBlCisKKyAgICAgICAgdGVzdE11bHRpRXhjZXB0aW9uIHBzIG1zZyA9IGRvCisgICAgICAgICAgICBfIDwtIENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24gcHMgImUiICJlMiIKKyAgICAgICAgICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgbXNnCisgICAgICAgICAgICByZXR1cm4gKCkKKworICAgICAgICB0ZXN0TXVsdGlFeGNlcHRpb25IYW5kbGVyMSAoZSA6OiBUeXBlcy5YY2VwdGlvbikgPSBkbworICAgICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgZQorCisgICAgICAgIHRlc3RNdWx0aUV4Y2VwdGlvbkhhbmRsZXIyIChlIDo6IFR5cGVzLlhjZXB0aW9uMikgPSBkbworICAgICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgZQorCisgICAgICAgIHRlc3RNdWx0aUV4Y2VwdGlvbkhhbmRsZXIzIChfIDo6IENvbnRyb2wuRXhjZXB0aW9uLlNvbWVFeGNlcHRpb24pID0gZG8KKyAgICAgICAgICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgIm9rIgorCisKK3NlcnZlciA6OiBOZXR3b3JrLlBvcnROdW1iZXIgLT4gSU8gKCkKK3NlcnZlciBwb3J0ID0gZG8KKyAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICJSZWFkeS4uLiIKKyAgICAocnVuQmFzaWNTZXJ2ZXIgVGVzdEhhbmRsZXIgVGhyaWZ0VGVzdC5wcm9jZXNzIHBvcnQpCisgICAgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYAorICAgIChcKFRyYW5zcG9ydEV4biBzIF8pIC0+IGVycm9yICQgIkZBSUxVUkU6ICIgKysgcykKKworCittYWluIDo6IElPICgpCittYWluID0gVGhyaWZ0VGVzdFV0aWxzLnJ1blRlc3Qgc2VydmVyIGNsaWVudApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9ydW4tdGVzdC5zaCBiL3Rlc3QvaHMvcnVuLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWNhZmMxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHMvcnVuLXRlc3Quc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZiBbICJ4IiA9ICJ4JDEiIF07IHRoZW4KKyAgcHJpbnRmICJydW4tdGVzdC5zaCBuZWVkcyBhbiBhcmd1bWVudCwgdGhlIG5hbWUgb2YgdGhlIHRlc3QgdG8gcnVuLiBUcnkgJ1RocmlmdFRlc3QnIG9yICdQcm90b0RlYnVnVGVzdCdcbiIKKyAgZXhpdCAyCitmaQorCisjIENoZWNrIHNvbWUgYmFzaWNzCitpZiBbIC16ICRCQVNFIF07IHRoZW4KKyAgICBCQVNFPS4uLy4uCitmaQorCisjIEZpZ3VyZSBvdXQgd2hhdCBmaWxlIHRvIHJ1biBoYXMgYSBzZXJ2ZXIKK2lmIFsgLXogJFRFU1RfU09VUkNFX0ZJTEUgXTsgdGhlbgorICAgIFRFU1RfU09VUkNFX0ZJTEU9JEJBU0UvdGVzdC9ocy8kMV9NYWluLmhzCitmaQorCitpZiBbICEgLWUgJFRFU1RfU09VUkNFX0ZJTEUgXTsgdGhlbgorICAgIHByaW50ZiAiTWlzc2luZyBzZXJ2ZXIgY29kZSBmaWxlICRURVNUX1NPVVJDRV9GSUxFIFxuIgorICAgIGV4aXQgMworZmkKKworcHJpbnRmICJSdW5uaW5nIHRlc3QuLi4gXG4iCitydW5oYXNrZWxsIC1XYWxsIC1YU2NvcGVkVHlwZVZhcmlhYmxlcyAtaSRCQVNFL2xpYi9ocy9zcmMgLWlnZW4taHMgJFRFU1RfU09VUkNFX0ZJTEUKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvcnVuY2xpZW50LnNoIGIvdGVzdC9ocy9ydW5jbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5M2JiYjEuLjAwMDAwMDAKLS0tIGEvdGVzdC9ocy9ydW5jbGllbnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIS9iaW4vc2gKLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWlmIFsgLXogJEJBU0UgXTsgdGhlbgotICAgIEJBU0U9Li4vLi4KLWZpCi0KLWdoY2kgLWZnbGFzZ293LWV4dHMgLWkkQkFTRS9saWIvaHMvc3JjIC1pJEJBU0UvdGVzdC9ocy9nZW4taHMgQ2xpZW50LmhzCmRpZmYgLS1naXQgYS90ZXN0L2hzL3J1bnNlcnZlci5zaCBiL3Rlc3QvaHMvcnVuc2VydmVyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMzMDFiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHMvcnVuc2VydmVyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1pZiBbIC16ICRCQVNFIF07IHRoZW4KLSAgICBCQVNFPS4uLy4uCi1maQotCi1wcmludGYgIlN0YXJ0aW5nIHNlcnZlci4uLiAiCi1naGMgLWZnbGFzZ293LWV4dHMgLWkkQkFTRS9saWIvaHMvc3JjIC1pJEJBU0UvdGVzdC9ocy9nZW4taHMgU2VydmVyLmhzIC1lICJwdXRTdHJMbiBcInJlYWR5LlwiID4+IFNlcnZlci5tYWluIgpkaWZmIC0tZ2l0IGEvdGVzdC9pbmRleC5odG1sIGIvdGVzdC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTFhOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2luZGV4Lmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8IURPQ1RZUEUgSFRNTD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cis8dGl0bGU+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvY3NzL2pxdWVyeS5kYXRhVGFibGVzLmNzcyI+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMi4xLjMubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9qcy9qcXVlcnkuZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzdWx0LmpzIj4KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8aDI+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU6IFJlc3VsdHM8L2gyPgorPHRhYmxlIGlkPSJ0ZXN0X3Jlc3VsdHMiIGNsYXNzPSJkaXNwbGF5Ij4KKyAgICA8dGhlYWQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TZXJ2ZXI8L3RoPgorICAgICAgICAgICAgPHRoPkNsaWVudDwvdGg+CisgICAgICAgICAgICA8dGg+UHJvdG9jb2w8L3RoPgorICAgICAgICAgICAgPHRoPlRyYW5zcG9ydDwvdGg+CisgICAgICAgICAgICA8dGg+UmVzdWx0IChsb2cpPC90aD4KKyAgICAgICAgICAgIDx0aD5FeHBlY3RlZDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKzwvdGFibGU+Cis8aDI+VGVzdCBJbmZvcm1hdGlvbjwvaDI+Cis8cHJlIGlkPSJ0ZXN0X2luZm8iPjwvcHJlPgorCis8YSBocmVmPSJsb2ciPmJyb3dzZSByYXcgbG9nPC9hPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0L2tleXMvQ0EucGVtIGIvdGVzdC9rZXlzL0NBLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzQ3YjlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL0NBLnBlbQpAQCAtMCwwICsxLDgyIEBACitDZXJ0aWZpY2F0ZToKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDE2NTgyMDgwMDg4OTU0MzgxMjEyICgweGU2MWY2MWZjM2IzNDIzOWMpCisgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1VUywgU1Q9TWFyeWxhbmQsIEw9Rm9yZXN0IEhpbGwsIE89VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBPVT1BcGFjaGUgVGhyaWZ0LCBDTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogQXByICA3IDE4OjU4OjAwIDIwMTQgR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBKdW4gMjQgMTg6NTg6MDAgMjAyMiBHTVQKKyAgICAgICAgU3ViamVjdDogQz1VUywgU1Q9TWFyeWxhbmQsIEw9Rm9yZXN0IEhpbGwsIE89VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBPVT1BcGFjaGUgVGhyaWZ0LCBDTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICAgICAgUHVibGljLUtleTogKDIwNDggYml0KQorICAgICAgICAgICAgICAgIE1vZHVsdXM6CisgICAgICAgICAgICAgICAgICAgIDAwOmFhOjEzOmQ0OmM0OmY3OjAxOjE3OmE3OjkyOmQxOmI0OmI0OjE1OjBkOgorICAgICAgICAgICAgICAgICAgICAyMTo5MDoxOTo1ZTpmYzpmYjpiNjo2ZDozZjpmMjozZjo2NTphMjo3YTo0MzoKKyAgICAgICAgICAgICAgICAgICAgYTY6NDY6OTU6ZmM6NDM6MTY6ZjY6NjM6MTQ6NWU6Zjc6YjE6ZTM6NjE6MDI6CisgICAgICAgICAgICAgICAgICAgIGY5OjRhOjk1Ojg5OmJmOjhkOmY5OjQ4OjFkOjgyOmU3OjM0OmUwOmIyOjQ4OgorICAgICAgICAgICAgICAgICAgICBkZjowODpkOTo3YzozYToyZjpkMzoxYjowYjplODplZjpjMjo0MTowYTo3ZDoKKyAgICAgICAgICAgICAgICAgICAgMGE6Mzg6Nzg6M2E6MzE6NjY6NzM6OTk6OGM6ZDE6Nzk6Mjc6NWY6ZTU6NjY6CisgICAgICAgICAgICAgICAgICAgIGQwOjVlOjNhOjhjOjBjOjkyOjE4OjczOjA0OmMxOmY1OjQ1OmRiOjM3OmU3OgorICAgICAgICAgICAgICAgICAgICA1ZjpjNzo4YzphMzo2MDplOTo5MjphMDpkODoyOTo1ZDo3Nzo0ODpmYjoxZDoKKyAgICAgICAgICAgICAgICAgICAgYjA6ZWQ6MTI6MmM6NGU6MmU6MDI6ZGI6M2Q6MWE6NDE6NzE6YTY6MmI6MmU6CisgICAgICAgICAgICAgICAgICAgIGIzOjRjOjZhOmM3OmY3OjFkOmE5OjdlOmM3OmNmOmRiOmYyOmU3OmI2OmYzOgorICAgICAgICAgICAgICAgICAgICAxZjo3NzoxZDoyNDowMToxYTo2Njo2NjozMDo4NTozMDowMjoyOTpjNDpiYjoKKyAgICAgICAgICAgICAgICAgICAgZjc6Y2Q6M2Y6ODk6NGI6MWE6NWY6ZjQ6OTE6OTY6ZmI6ZTk6Mzk6ZjI6NDY6CisgICAgICAgICAgICAgICAgICAgIDk2OjEyOjNkOjhhOjIzOmI1OjJlOjgyOjllOjQxOmZlOjQwOmI2OjI3OmIxOgorICAgICAgICAgICAgICAgICAgICAxNDo0NDo1Yzo5NjozMDowZjo1NTplNDpiYjphZDo4Yjo4YTo5OToxNzpjMDoKKyAgICAgICAgICAgICAgICAgICAgMjk6MTE6NGU6NzY6Nzk6OWQ6NGI6MDM6MzE6N2U6ODU6M2M6YTg6MjM6NDA6CisgICAgICAgICAgICAgICAgICAgIDU0OjAyOjU4OjM1OmM2OmZjOmRkOjNkOmViOmUzOmQxOjUxOjAwOjAyOjg2OgorICAgICAgICAgICAgICAgICAgICAxYTpkNzpiMDo5ZjphMDoxNzo3Mzo2YTo1YTpkMDplNjpiNjpiODo1NTo0MDoKKyAgICAgICAgICAgICAgICAgICAgNWU6MjcKKyAgICAgICAgICAgICAgICBFeHBvbmVudDogNjU1MzcgKDB4MTAwMDEpCisgICAgICAgIFg1MDl2MyBleHRlbnNpb25zOgorICAgICAgICAgICAgWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIDI4OkYyOkZEOjMwOkNEOjAzOkYxOkRDOjQxOjFFOkM0OjkzOkM2Ojk3OjEzOkNBOkQ0OkZBOjYwOjJBCisgICAgICAgICAgICBYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOiAKKyAgICAgICAgICAgICAgICBrZXlpZDoyODpGMjpGRDozMDpDRDowMzpGMTpEQzo0MToxRTpDNDo5MzpDNjo5NzoxMzpDQTpENDpGQTo2MDoyQQorCisgICAgICAgICAgICBYNTA5djMgQmFzaWMgQ29uc3RyYWludHM6IAorICAgICAgICAgICAgICAgIENBOlRSVUUKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgIDQ2OjE1OjE4Ojg5OmIyOjU3OjE3OmQxOmEyOjY0OmMxOjlhOjczOjRmOjA0Ojk0Ojc2OjA3OgorICAgICAgICAgMWY6Mjk6YmE6NmY6MzQ6NDY6YzI6MzY6ZDU6Njg6ODU6ZjQ6MTU6NGM6OGU6MWE6ZmU6ODM6CisgICAgICAgICA3OTo1MzplYzphYTowZDo5Mjo2MDpkZTpmMzo5YTozYTplODo4MDo2NjphYzo4Nzo3MDo4OToKKyAgICAgICAgIDU5OmYyOmFjOjllOmIwOjI4OjExOjM3OjdkOjc4OjRlOjVlOjNmOjI1OjBmOmJlOjA5OjZmOgorICAgICAgICAgMjY6MmE6M2Q6NjY6Nzk6Mzg6Mjg6ZTU6ODE6NzE6NzE6OTY6MjY6NGY6ZGI6ZWM6MjM6NzA6CisgICAgICAgICBiZTozNzozOTpmYzplMDozMjowZDo4MDo4Zjo2NjpjNzphYzphNDpiNDo4Yjo3Nzo0MDplMjoKKyAgICAgICAgIDk5OjQ0OjNhOjczOmM4OmY5OjE0OmNmOjFiOjMyOjI3OmMyOjc4OmRiOmIwOmRhOjhhOjYwOgorICAgICAgICAgZWI6OGQ6MzQ6N2U6N2Q6M2M6MDM6ZDQ6Mzg6NzQ6Zjc6MTc6OWU6MzI6NzQ6OWE6ZTc6Mzc6CisgICAgICAgICA5NTpkNDo3MTowMzpjODo5NDplYTowOTo3YjphZDoyZDplYjo3MDo0MzpmMjozMjo3ZTo2MzoKKyAgICAgICAgIDAxOjg0OjhjOjdlOjllOmYwOjc5OjdmOmFlOmU5OmNmOmY5OmJlOjBlOmZlOjk1OmQyOmJkOgorICAgICAgICAgYzg6YTc6ODE6YzI6NzE6ZDk6YzM6NTA6MzE6ODk6NmQ6ZmE6YWQ6YTI6YWI6MDA6MDE6MzQ6CisgICAgICAgICAxMDo1ODplZjo5Njo1YTplYjozMDowNzphOTo4ZTo4NDozNjplZjozZDozYzo2MTo0Njo5NjoKKyAgICAgICAgIDZhOmU4OjA5OjIwOjVhOmFiOmY4OjRiOmViOmI3OjMzOjYxOjhlOmFmOjlhOjdkOjE2OmIwOgorICAgICAgICAgNjA6NmE6ZjA6MzA6ZTU6YjI6OGU6ZTc6ODA6YjQ6YTE6MDI6YTk6Mzc6ZmU6NWY6YjU6YWU6CisgICAgICAgICA2NTplOTo2YjozNAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTnpDQ0F4K2dBd0lCQWdJSkFPWWZZZnc3TkNPY01BMEdDU3FHU0liM0RRRUJCUVVBTUlHeE1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY01DMFp2Y21WemRDQklhV3hzCitNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEZqQVVCZ05WCitCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXpkREVrTUNJR0NTcUdTSWIzCitEUUVKQVJZVlpHVjJRSFJvY21sbWRDNWhjR0ZqYUdVdWIzSm5NQjRYRFRFME1EUXdOekU0TlRnd01Gb1hEVEl5CitNRFl5TkRFNE5UZ3dNRm93Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhOWVhKNWJHRnVaREVVCitNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSb1pTQkJjR0ZqYUdVZ1UyOW1kSGRoCitjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSb2NtbG1kREVTTUJBR0ExVUVBd3dKCitiRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeWFXWjBMbUZ3WVdOb1pTNXZjbWN3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcUU5VEU5d0VYcDVMUnRMUVZEU0dRCitHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeVNOOEkyWHc2CitMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSGpLTmc2WktnCisyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQkdtWm1NSVV3CitBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYa3U2MkxpcGtYCit3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbXRyaFZRRjRuCitBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBZkJnTlZIU01FCitHREFXZ0JRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0SUJBUUJHRlJpSnNsY1gwYUprd1pwelR3U1VkZ2NmS2Jwdk5FYkNOdFZvaGZRVlRJNGEvb041CitVK3lxRFpKZzN2T2FPdWlBWnF5SGNJbFo4cXllc0NnUk4zMTRUbDQvSlErK0NXOG1LajFtZVRnbzVZRnhjWlltCitUOXZzSTNDK056bjg0RElOZ0k5bXg2eWt0SXQzUU9LWlJEcHp5UGtVenhzeUo4SjQyN0RhaW1EcmpUUitmVHdECisxRGgwOXhlZU1uU2E1emVWMUhFRHlKVHFDWHV0TGV0d1EvSXlmbU1CaEl4K252QjVmNjdwei9tK0R2NlYwcjNJCitwNEhDY2RuRFVER0piZnF0b3FzQUFUUVFXTytXV3Vzd0I2bU9oRGJ2UFR4aFJwWnE2QWtnV3F2NFMrdTNNMkdPCityNXA5RnJCZ2F2QXc1YktPNTRDMG9RS3BOLzVmdGE1bDZXczAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9SRUFETUUubWQgYi90ZXN0L2tleXMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAxMDgzNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTAyIEBACisjIFRlc3QgS2V5cyBhbmQgQ2VydGlmaWNhdGVzCitUaGlzIGZvbGRlciBpcyBkZWRpY2F0ZWQgdG8gdGVzdCBrZXlzIGFuZCBjZXJ0aWZpY2F0ZXMgcHJvdmlkZWQgaW4gbXVsdGlwbGUgZm9ybWF0cy4KK1ByaW1hcnkgdXNlIGFyZSB1bml0IHRlc3Qgc3VpdGVzIGFuZCBjcm9zcyBsYW5ndWFnZSB0ZXN0cy4KKworICAgIHRlc3Qva2V5cworCisqKlRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBtdXN0IG5ldmVyIGJlIHVzZWQgb24gcHJvZHVjdGlvbiBzeXN0ZW1zLioqCisKKyMjIFNTTCBLZXlzIGFuZCBDZXJ0aWZpY2F0ZXMKKworCisjIyBjcmVhdGUgY2VydGlmaWNhdGVzCisKK3dlIHVzZSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgZm9yIHRlc3Qga2V5IGFuZCBjZXJ0aWZpY2F0ZSBjcmVhdGlvbgorCisgICAgQz1VUywKKyAgICBTVD1NYXJ5bGFuZCwKKyAgICBMPUZvcmVzdCBIaWxsLAorICAgIE89VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgIE9VPUFwYWNoZSBUaHJpZnQsCisgICAgQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKKworIyMjIGNyZWF0ZSBzZWxmLXNpZ25lZCBzZXJ2ZXIga2V5IGFuZCBjZXJ0aWZpY2F0ZQorCisgICAgb3BlbnNzbCByZXEgLW5ldyAteDUwOSAtbm9kZXMgIC1kYXlzIDMwMDAgLW91dCBzZXJ2ZXIuY3J0IC1rZXlvdXQgc2VydmVyLmtleQorICAgIG9wZW5zc2wgeDUwOSAtaW4gc2VydmVyLmNydCAtdGV4dCA+IENBLnBlbQorICAgIGNhdCBzZXJ2ZXIuY3J0IHNlcnZlci5rZXkgPiBzZXJ2ZXIucGVtCisKK0V4cG9ydCBwYXNzd29yZCBpcyAidGhyaWZ0IiB3aXRob3V0IHRoZSBxdW90ZXMKKworICAgIG9wZW5zc2wgcGtjczEyIC1leHBvcnQgLWNsY2VydHMgLWluIHNlcnZlci5jcnQgLWlua2V5IHNlcnZlci5rZXkgLW91dCBzZXJ2ZXIucDEyCisKKyMjIyBjcmVhdGUgY2xpZW50IGtleSBhbmQgY2VydGlmaWNhdGUKKworICAgIG9wZW5zc2wgZ2VucnNhIC1vdXQgY2xpZW50LmtleQorCitjcmVhdGUgYSBzaWduaW5nIHJlcXVlc3Q6CisKKyAgICBvcGVuc3NsIHJlcSAtbmV3IC1rZXkgY2xpZW50LmtleSAtb3V0IGNsaWVudC5jc3IKKworc2lnbiB0aGUgY2xpZW50IGNlcnRpZmljYXRlIHdpdGggdGhlIHNlcnZlci5rZXkKKworICAgIG9wZW5zc2wgeDUwOSAtcmVxIC1kYXlzIDMwMDAgLWluIGNsaWVudC5jc3IgLUNBIENBLnBlbSAtQ0FrZXkgc2VydmVyLmtleSAtc2V0X3NlcmlhbCAwMSAtb3V0IGNsaWVudC5jcnQKKworZXhwb3J0IGNlcnRpZmljYXRlIGluIFBLQ1MxMiBmb3JtYXQgKEV4cG9ydCBwYXNzd29yZCBpcyAidGhyaWZ0IiB3aXRob3V0IHRoZSBxdW90ZXMpCisKKyAgICBvcGVuc3NsIHBrY3MxMiAtZXhwb3J0IC1jbGNlcnRzIC1pbiBjbGllbnQuY3J0IC1pbmtleSBjbGllbnQua2V5IC1vdXQgY2xpZW50LnAxMgorCitleHBvcnQgY2VydGlmaWNhdGUgaW4gUEVNIGZvcm1hdCBmb3IgT3BlblNTTCB1c2FnZQorCisgICAgb3BlbnNzbCBwa2NzMTIgLWluIGNsaWVudC5wMTIgLW91dCBjbGllbnQucGVtIC1jbGNlcnRzCisKKyMjIyBjcmVhdGUgY2xpZW50IGtleSBhbmQgY2VydGlmaWNhdGUgd2l0aCBhbHRuYW1lcworCitjb3B5IG9wZW5zc2wuY25mIGZyb20geW91ciBzeXN0ZW0gZS5nLiAvZXRjL3NzbC9vcGVuc3NsLmNuZiBhbmQgYXBwZW5kIGZvbGxvd2luZyB0byB0aGUgZW5kIG9mIFsgdjNfcmVxIF0KKworICAgIHN1YmplY3RBbHROYW1lPUBhbHRlcm5hdGVfbmFtZXMKKworICAgIFsgYWx0ZXJuYXRlX25hbWVzIF0KKyAgICBJUC4xPTEyNy4wLjAuMQorICAgIElQLjI9OjoxCisgICAgSVAuMz06OmZmZmY6MTI3LjAuMC4xCisKK2NyZWF0ZSBhIHNpZ25pbmcgcmVxdWVzdDoKKworICAgIG9wZW5zc2wgcmVxIC1uZXcgLWtleSBjbGllbnRfdjMua2V5IC1vdXQgY2xpZW50X3YzLmNzciAtY29uZmlnIG9wZW5zc2wuY25mIFwKKyAgICAgICAgLXN1YmogIi9DPVVTL1NUPU1hcnlsYW5kL0w9Rm9yZXN0IEhpbGwvTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vT1U9QXBhY2hlIFRocmlmdC9DTj1sb2NhbGhvc3QiIC1leHRlbnNpb25zIHYzX3JlcQorCitzaWduIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgd2l0aCB0aGUgc2VydmVyLmtleQorCisgICAgb3BlbnNzbCB4NTA5IC1yZXEgLWRheXMgMzAwMCAtaW4gY2xpZW50X3YzLmNzciAtQ0EgQ0EucGVtIC1DQWtleSBzZXJ2ZXIua2V5IC1zZXRfc2VyaWFsIDAxIC1vdXQgY2xpZW50X3YzLmNydCAtZXh0ZW5zaW9ucyB2M19yZXEgLWV4dGZpbGUgb3BlbnNzbC5jbmYKKworIyMgSmF2YSBrZXkgYW5kIGNlcnRpZmljYXRlIGltcG9ydAorSmF2YSBUZXN0IEVudmlyb25tZW50IHVzZXMga2V5IGFuZCB0cnVzdCBzdG9yZSBwYXNzd29yZCAidGhyaWZ0IiB3aXRob3V0IHRoZSBxdW90ZXMKKworbGlzdCBrZXlzdG9yZSBlbnRyaWVzCisKKyAgICBrZXl0b29sIC1saXN0IC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZQorCitsaXN0IHRydXN0c3RvcmUgZW50cmllcworCisgICAga2V5dG9vbCAtbGlzdCAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQorCisKK2RlbGV0ZSBhbiBlbnRyeQorCisgICAga2V5dG9vbCAtZGVsZXRlIC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIC1hbGlhcyBzc2x0ZXN0CisKKworaW1wb3J0IGNlcnRpZmljYXRlIGludG8gdHJ1c3RzdG9yZQorCisgICAga2V5dG9vbCAtaW1wb3J0Y2VydCAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZSAtYWxpYXMgbG9jYWxob3N0IC0tZmlsZSBzZXJ2ZXIuY3J0CisKK2ltcG9ydCBrZXkgaW50byBrZXlzdG9yZQorCisgICAga2V5dG9vbCAtaW1wb3J0a2V5c3RvcmUgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlIC1zcmNzdG9yZXR5cGUgcGtjczEyIC1zcmNrZXlzdG9yZSBzZXJ2ZXIucDEyCisKKyMgVGVzdCBTU0wgc2VydmVyIGFuZCBjbGllbnRzCisKKyAgICBvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0IGxvY2FsaG9zdDo5MDkwCisgICAgb3BlbnNzbCBzX3NlcnZlciAtYWNjZXB0IDkwOTAgLXd3dworCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LmNydCBiL3Rlc3Qva2V5cy9jbGllbnQuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTlhZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50LmNydApAQCAtMCwwICsxLDIzIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUQyRENDQXNBQ0FRRXdEUVlKS29aSWh2Y05BUUVMQlFBd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WUQKK1ZRUUlEQWhOWVhKNWJHRnVaREVVTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm8KK1pTQkJjR0ZqYUdVZ1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm8KK2NtbG1kREVTTUJBR0ExVUVBd3dKYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHkKK2FXWjBMbUZ3WVdOb1pTNXZjbWN3SGhjTk1UVXhNakl6TURjd056VXdXaGNOTWpRd016RXdNRGN3TnpVd1dqQ0IKK3NURUxNQWtHQTFVRUJoTUNWVk14RVRBUEJnTlZCQWdNQ0UxaGNubHNZVzVrTVJRd0VnWURWUVFIREF0R2IzSmwKK2MzUWdTR2xzYkRFbk1DVUdBMVVFQ2d3ZVZHaGxJRUZ3WVdOb1pTQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXUKK01SWXdGQVlEVlFRTERBMUJjR0ZqYUdVZ1ZHaHlhV1owTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNReEpEQWkKK0Jna3Foa2lHOXcwQkNRRVdGV1JsZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpDQ0FTSXdEUVlKS29aSWh2Y04KK0FRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMbC9iSmhnMTdQdTF0Nzg1Skl1d2xoN2UyRTUxZW9XRnZ1eE1XZkgKK2RzVUFWcURhT3o5OU81c3Y4cGdXS1hya1BCdHRFOThUK014L1B3ejVKSHM0UWNyZTNBNWFkbTZjZGFiMEFLdWcKK2VWRzFQdkhyV3pWNGFoZWc0S1VmVlNpTXo4QkcySzNRMVZHdlprZ01SYS9RNDA5RktqVTZaNEQ5dkJHNFBhczMKK1BONUZ4bkFMNlA3MHlXQ0VyMlZ1L3RXSmxDTitxclJEZlNhRTJocW1UMWlyeGFvUGE2MUd2dVJWc0dRM1Rlb0UKK21HZkVOdHZGcUM2cVFXdVNDYkc1YUk0N1J2NjZwcW9XV3hxa3Jjb2xOYzcrdmh4NnJXK3dkRk8zSWxxSVQ4SUcKK3NkUVZwK1k0aXIvZEdwMmVqenFHWkNyZW1QSjF1RUtqTE1wSXVrZGcyNXltSEMwQ0F3RUFBVEFOQmdrcWhraUcKKzl3MEJBUXNGQUFPQ0FRRUFCY1Jkd2M5bWRZOXpPdlRpeHRUaEhyY2lWdnF3cDZSYWlRcU1FVm9tb3pZaWxaRFIKK0o5ME0zSDZLbmxBREpiQ3YwRlh1anNhQXBCNTNhd3E1STdzT2JBWVdGaERKWjlMS2x3MGxERjdLY2hMWGlBbGsKK1hWeXZMMm5KanVKY3hQQ0ZQV2t0d3J3NWJUZ3VSQ0J6RzEySHppa24reHM2dVB1cjdWUVlNMzNqYlhFZGE1UFMKK1VFcXZBVldhT05KQ1g4TURZT3NjVm9KRjBFU3lJK2ZOOTJpcEZhWFI3Zkdham9kL3JjMEFmZU4yR1ZNWkVUdmUKKzIxcGtVeUR3d0NHQTQ0dXZOVUNkMWUzMk54RTNhaDlVQXBDUm41c0dKNjRSNnVycEZUWFQzSUFMRjNrYU9PN1UKK1ZzTWhGclVpWjcrQnc1bkllaUswUU9GNkVpcGorYkp2ckxacFNnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQua2V5IGIvdGVzdC9rZXlzL2NsaWVudC5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkY2ZkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQua2V5CkBAIC0wLDAgKzEsMjcgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUVvd0lCQUFLQ0FRRUF1WDlzbUdEWHMrN1czdnpra2k3Q1dIdDdZVG5WNmhZVys3RXhaOGQyeFFCV29ObzcKK1AzMDdteS95bUJZcGV1UThHMjBUM3hQNHpIOC9EUGtrZXpoQnl0N2NEbHAyYnB4MXB2UUFxNkI1VWJVKzhldGIKK05YaHFGNkRncFI5VktJelB3RWJZcmREVlVhOW1TQXhGcjlEalQwVXFOVHBuZ1AyOEViZzlxemM4M2tYR2NBdm8KKy92VEpZSVN2Wlc3KzFZbVVJMzZxdEVOOUpvVGFHcVpQV0t2RnFnOXJyVWErNUZXd1pEZE42Z1NZWjhRMjI4V28KK0xxcEJhNUlKc2Jsb2pqdEcvcnFtcWhaYkdxU3R5aVUxenY2K0hIcXRiN0IwVTdjaVdvaFB3Z2F4MUJXbjVqaUsKK3Y5MGFuWjZQT29aa0t0Nlk4blc0UXFNc3lraTZSMkRibktZY0xRSURBUUFCQW9JQkFGb3RiQ21YeXNVYWN6THMKK1ZtSUtnVWhxbjB4Z3hYR0xVNWtBUnpoZ2E0alI1VXRGVEZCTkhWRVFPaXRkZXNUWGQ3RU5rZjk4d2hNSU9TcWgKK1krN1RKb2p0VnFWVHJRZVE0RkZOaFpYcDZaQ2pQL3B6cEYrV0xsMVdSRitCbi9DYW85U2huR3pEZlRDOHlFaDIKK1R0cHQvbE5uR0dIUUJzbGFrTGM4amg1U09ERUZmYnVnWDhTZFRDd1pZc2VzS05yWG0xcFMvNUlFdW5QcWFSaTAKK0lJMEVjbnFIRXNncVNvK0NsanBXN3VOeFNyeUEydlNBVmRsUGVqNis5RlpqZElITFA1QUVLWXZrN2U5RDJDTVYKKzErZ3JOZS9Ra1FwcFNoaXpQaXJiYjkzdEhtODZ2NWJrREZDTTl5V3JoY01janZJTE1YRVR4SXBwTUdQbWFjUnUKK2pxdFljQUVDZ1lFQThWRHp5bFR6NGtTMytEM24zaFRnYjQxWFZZYTdmZVVzaDk5R1dSTzF3WElGcEhqQ0lSakEKKzlyL0JYVzkrUngzcHVWUGhTOGh3TFE0QkxkQTdsRnBWMUM4YWcwZTMrdm42elZpcm56MWp0SSt1SE12U3R6aE8KK2Q2aTBuZit3NEhZWG83bU42bzlaZEhFZkM4U0ZOYnltaENvVktoMkRJTER3YjRFWDlSWE5weTBDZ1lFQXhNajQKKyt2cmtsSi9pbEgrUnkxenN0NHpRWUl3bW0zUVdqYXJEcnlwR3VjSGdkNGpnNXY5QS9DSklLVWk4eDBNanJjdU4KK3dWYjdSOFhKeVl6RlFSWElVWFI2R25MZWVTbmZweHp0NFlsaWZDdlh4bk9pOHc0ZnY3S2VHQlY1bnAxRWdwbzgKK25XTnlaRnhkdlFEdUNvcHIzU1VvUzlKSThKUHdWZ0E3VCs3RGFRRUNnWUFHb2F2aGJvNDVOSnc5cFMzZkM0SFQKK2J2WHNjc1JxUkVjQ0FOL0ZDT2FneDBwaVo3TW1CN0VkMXMwd2pTVFNQWDh6eVp0U1l0SzZXajBzRGlIbEJNcUIKK0J6NWFSemxHRzJLS0RCckRTSU9aN2F6aU83T3h0MGxvdm1rZ1FtdVE3NDNjd1BlbWI0UU0wQ01EUnNaR1lNWE8KK3NmMWM1K3kzbEVVM096djJUMEFValFLQmdCbG56T1V5TVFLVEpjQ0FPOFZpaU5rbG45MW5HckRsS3VnOVRLZzMKK3NBdlpZTzV0eUlOcUh1eXVURnl3SEZjcGJ0aklOOVBuTStmUFBENytJcFZGaDZna2ZvTWRvMlZISjYyK2lXT2QKK3hnNDc1czZqTFQxdDdHRm1ZUXpBOFFPdVVDTUFZS1Q5S3M2VU1qSHRoYzNza3dKcEFxdlBTVVZ1QkJCR1ZXSDcKK2RGVUJBb0dCQUw2N0FSTHVqaUFFVk5IdDVyYWppeEI2bmNsNy9SK1oydWF3STFKZm1kbkNab25BS1ZaWUh1WFUKKy80ajIrbzRRaEpJUEx0V0lvYXhBa01pZ1F0QWtlc3Fpcm4zS2svYzdrWlJJb041NDlIVEp1d1pxWXFOcDdDQi8KK2tWaTVSMzM1K005ejQ5aTZxQTBSWnNKR1NvU0JrN1B1Zkc0Um1MaW1jUmJHd3JZOTNzUEQKKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LnAxMiBiL3Rlc3Qva2V5cy9jbGllbnQucDEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMjY2OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50LnAxMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LnBlbSBiL3Rlc3Qva2V5cy9jbGllbnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWY2MjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50LnBlbQpAQCAtMCwwICsxLDYwIEBACitCYWcgQXR0cmlidXRlcworICAgIGxvY2FsS2V5SUQ6IDM5IEVDIDNEIDVCIDI4IDE3IERBIEREIDA5IDdBIDYyIDY4IEQ1IDQ0IDFGIEM3IEUyIEY4IEUwIENEIAorc3ViamVjdD0vQz1VUy9TVD1NYXJ5bGFuZC9MPUZvcmVzdCBIaWxsL089VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL09VPUFwYWNoZSBUaHJpZnQvQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKK2lzc3Vlcj0vQz1VUy9TVD1NYXJ5bGFuZC9MPUZvcmVzdCBIaWxsL089VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL09VPUFwYWNoZSBUaHJpZnQvQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDJEQ0NBc0FDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRAorVlFRSURBaE5ZWEo1YkdGdVpERVVNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSbworWlNCQmNHRmphR1VnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSbworY21sbWRERVNNQkFHQTFVRUF3d0piRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeQorYVdaMExtRndZV05vWlM1dmNtY3dIaGNOTVRVeE1qSXpNRGN3TnpVd1doY05NalF3TXpFd01EY3dOelV3V2pDQgorc1RFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ01DRTFoY25sc1lXNWtNUlF3RWdZRFZRUUhEQXRHYjNKbAorYzNRZ1NHbHNiREVuTUNVR0ExVUVDZ3dlVkdobElFRndZV05vWlNCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dQorTVJZd0ZBWURWUVFMREExQmNHRmphR1VnVkdoeWFXWjBNUkl3RUFZRFZRUUREQWxzYjJOaGJHaHZjM1F4SkRBaQorQmdrcWhraUc5dzBCQ1FFV0ZXUmxka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekNDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxsL2JKaGcxN1B1MXQ3ODVKSXV3bGg3ZTJFNTFlb1dGdnV4TVdmSAorZHNVQVZxRGFPejk5TzVzdjhwZ1dLWHJrUEJ0dEU5OFQrTXgvUHd6NUpIczRRY3JlM0E1YWRtNmNkYWIwQUt1ZworZVZHMVB2SHJXelY0YWhlZzRLVWZWU2lNejhCRzJLM1ExVkd2WmtnTVJhL1E0MDlGS2pVNlo0RDl2Qkc0UGFzMworUE41RnhuQUw2UDcweVdDRXIyVnUvdFdKbENOK3FyUkRmU2FFMmhxbVQxaXJ4YW9QYTYxR3Z1UlZzR1EzVGVvRQorbUdmRU50dkZxQzZxUVd1U0NiRzVhSTQ3UnY2NnBxb1dXeHFrcmNvbE5jNyt2aHg2clcrd2RGTzNJbHFJVDhJRworc2RRVnArWTRpci9kR3AyZWp6cUdaQ3JlbVBKMXVFS2pMTXBJdWtkZzI1eW1IQzBDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRc0ZBQU9DQVFFQUJjUmR3YzltZFk5ek92VGl4dFRoSHJjaVZ2cXdwNlJhaVFxTUVWb21vellpbFpEUgorSjkwTTNINktubEFESmJDdjBGWHVqc2FBcEI1M2F3cTVJN3NPYkFZV0ZoREpaOUxLbHcwbERGN0tjaExYaUFsaworWFZ5dkwybkpqdUpjeFBDRlBXa3R3cnc1YlRndVJDQnpHMTJIemlrbit4czZ1UHVyN1ZRWU0zM2piWEVkYTVQUworVUVxdkFWV2FPTkpDWDhNRFlPc2NWb0pGMEVTeUkrZk45MmlwRmFYUjdmR2Fqb2QvcmMwQWZlTjJHVk1aRVR2ZQorMjFwa1V5RHd3Q0dBNDR1dk5VQ2QxZTMyTnhFM2FoOVVBcENSbjVzR0o2NFI2dXJwRlRYVDNJQUxGM2thT083VQorVnNNaEZyVWlaNytCdzVuSWVpSzBRT0Y2RWlwaitiSnZyTFpwU2c9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorQmFnIEF0dHJpYnV0ZXMKKyAgICBsb2NhbEtleUlEOiAzOSBFQyAzRCA1QiAyOCAxNyBEQSBERCAwOSA3QSA2MiA2OCBENSA0NCAxRiBDNyBFMiBGOCBFMCBDRCAKK0tleSBBdHRyaWJ1dGVzOiA8Tm8gQXR0cmlidXRlcz4KKy0tLS0tQkVHSU4gRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KK01JSUZEakJBQmdrcWhraUc5dzBCQlEwd016QWJCZ2txaGtpRzl3MEJCUXd3RGdRSVJLb2w0MmJBUzNBQ0FnZ0EKK01CUUdDQ3FHU0liM0RRTUhCQWpPdWxjeUhNYVdzUVNDQk1nYmVYUThwSVlURU5LbTA4VVBlcXhrQ1Iybkx4U08KK2d0Um1CeERZanFZdjM1eTRLOEtoeWJCdlNCbElQZ0U1akVXeFVDY2MxUXZ5NXlkVVEvWDlwbWtVOGRubUFtREMKK28wendkM2x0MmVOUHkrNFdsaXFGRFZtSHJMZllRRk9vSXJIanV6QzBsSTRDMmlQT2p4aGZhMXpGdW1lZGd3R1MKK0d4MTBYNXVFVkg1TjY0Zlc2QjNCdnpRTTBybjJxcjBPTnVTUm10ZVJ0SThOc3puZmtnZUo5YTRDSUFGN0U1WjIKK0pUR0kxMmVkTnp6VUoxSmhYNDdaVzRtaVF3Q1U1TGN5MDFVWnFURnVVcG1LN0ZVUWVndEx5M2U1ZURLcStiSWcKK1pZcTZIeDdsdThoalQ1a1daR0t5NzFhWW1IS0VqSTBmNzI3Y0FicURURzV1WkJIQmp3Sy8zcC96blFWUVh4QmIKKzErRTlDaUtlRmRYajJFbHB0c25EeW9UdnJTd0ovSnF1MXdrWEJjSDVFbWJnN2FKTW9kMUlPczZPUUIxclBEdmQKK0ZGYTg0emJxUk5XSFN4eHhZWnhjQjhZWmluTDYvZFFKbmlzS3U5TE1RZDNCQkdzR1dxSDhaejV0RXZYalM1S3YKKzNnOUpSYTdRRGtTRjAwNXg2VStxLzY3OEcyTUcrVytOV3FqZTNOWng5UHNoL1B0bStoK3E5bjJHU3ZuaWJpSzUKK21FajlGSXdHcXVHcGJaVVRLNWFYSGNLTjY1N2RLaUlDc0VKZU5hcjFpWnpuUm16ck1iWkorRHhxSm5UdytHQXYKKzdZYjYzL0NOQXRxU3hpeU5IR1o2Tk0yWkE5dkFLWTFIWG4wUlZDMHkxKzlGbU5wU1J3djN1Lyt5ZFNDbkpvblIKK0dFS2p6T3FNOURuN3F4ZCtoNFVubkE3aFhXeElUYWdlQjZHNkttZmlYUnhoaVd5cXRPSUNkQ25lQ3dwcThVWjQKK2UwZm0wNU5SVzZNMm1xR1FIc01OU3ZUV2Rkd3o1Yjh3Z3c0ZVZzYit4UXl0eFZkajlscEJ1QjlLeWpRanhVZ1UKKzNvWng0S3lXTG9FV2prenRQQWlLM3V2NUdmb3ROSU1kem5SZk9OMSt4bTFNNXN3dG4zeTNSdTFmNlNUWkM3U3AKK3F2Ykc3alBtcEI1Z0xFVXJpK2NodythS1VZYkowYjgyME9kNEZMUVlud0xXcjQ2VmVsWW1WNDR4dVIwNndncVAKKzFIY2hNU3NIdFMrWmxJaVFRVTlqaGR5VHJsODZFUUhIMzNkaCtTdWE4QWhmZXdQUnkyVkZwM1prMzRBVXNXY1gKK0VmSVlHZW1ocVVEM2RyRzBTTVZiRkZOT2FGR3A5ZTB0UW91WU9DNi9xRkJ2L1NOZ1F6M21BRWtjaUpZYlV1VVoKK1Y0WVFQdnRkdlNySVNWMGU3YmpGZ2RTRWpHN1A3RjZDRnJXVHJqVWxIWnVXajYvckozKy8xUEhlSlZpeWhzckoKK1pZRmUxNFcvNDhQRHhCUmw0SUVBbXhjTjFFYjJFejllQ3F2MEhXNzdIdmlHNnpJZ25rUHJoV0hqRkdVcHhLazQKK2pMZnVCMlRmcTlGN296djRMMlFBbitGL3lLdDFSbTJIaDVKNjFlVUp0QVQ2MHBhamcrZ0p0am1wdTVQcjRIRG4KK2I2cDN4bVl3YUw1TGV0MXpDQWJiTWZkbERLMTRZamRPZE0vQkVLcFhiOXk0RUl1Ylg1QU1ZNGxqWGVHOWd4K1QKK0IxVHVRVmRKMFA1d0lLL0QxMFRRekFXREthbTBrdjNSWGlkbHpSeHBaM3NuUm5OL0wzRVZkNThSbnRqMU9jMHkKK0ZpSWlTS1JzekRiUHpLRHhRRTJzTmdRY2RPMjRKTkxTYS9zWll0cTJnUmdzcGwvWXFJRG80WllxaTl4OEY1T1MKK3JkUFU1RC9IOExXUjR2cEpMTDhEWXJIaDVxRkczQlgyT0pJaFBSUys0OHBEWXRyUmpwN1MvMVpVNjRPSkF5dGsKKzk5aERxU3JuMWoyYTZ5RkU4TDJQdHorNFVDRjJPUVhFYzlScXFlYjhRRVV1TVNrTkg0b1ErQTJGNnV6THBaaTAKK1hINjRSMm5pTkM1Nkx4VjJpKzNUNUtSRUZMYWh5azhlcExabHY4WWR4WVI0U2I3Si81eWlvb0szZzlobVlWS08KK3pMYz0KKy0tLS0tRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50X3YzLmNydCBiL3Rlc3Qva2V5cy9jbGllbnRfdjMuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0N2YxNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvY2xpZW50X3YzLmNydApAQCAtMCwwICsxLDI0IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVDRENDQXZDZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCc1RFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0VUQVBCZ05WQkFnTUNFMWhjbmxzWVc1a01SUXdFZ1lEVlFRSERBdEdiM0psYzNRZ1NHbHNiREVuTUNVR0ExVUUKK0Nnd2VWR2hsSUVGd1lXTm9aU0JUYjJaMGQyRnlaU0JHYjNWdVpHRjBhVzl1TVJZd0ZBWURWUVFMREExQmNHRmoKK2FHVWdWR2h5YVdaME1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXhKREFpQmdrcWhraUc5dzBCQ1FFV0ZXUmwKK2RrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6QWVGdzB4TmpBeU1qSXhNVFU0TkRGYUZ3MHlOREExTVRBeE1UVTQKK05ERmFNSUdMTVFzd0NRWURWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY00KK0MwWnZjbVZ6ZENCSWFXeHNNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWsKK1lYUnBiMjR4RmpBVUJnTlZCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXoKK2REQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxaMHdpUW5YZzVRTVpaV3VnZC8KK08zd29hdHlIdWN6SnVGU21ZaVJHV0xyM1B1Z0IreHR2ankwclRjRTJNTngvYmRzVnhyYXBDS0ErdE1GT1JiRWwKK3NGNmprMEgrQjdCekdvSXdIcjZOOEdQMVZPb0EyZXNyaHNORXoyMmFKSTAwVmFGVEZFOEcvcWdGY2loeWFWV0gKK1pzTGEzTWFrT3pGVW1PQmFWMnRMQmpDamF6bnFYdzNlbzNYd1VJMEJrZ1M5Yjl2cVhqU2NtZldYRHc1KzFpczQKK2JDZ3VtRzJ6ajlFcEx5cGM5cUNHTktGQk8yWUlnMFhzSUlKOFJwcmxpYW5qTDZQNE1mQzZHUE95VzROYlphTGQKK0VTdi9idW1wVnl1Vi9DL3hxa1BhaHZPd0J1UEUxbG94WlpQeDZRdjM2OHFuN1NWTlZaT0x5WDcyMnNwb29BNUcKKzZjc0NBd0VBQWFOUE1FMHdDUVlEVlIwVEJBSXdBREFMQmdOVkhROEVCQU1DQmVBd013WURWUjBSQkN3d0tvY0UKK2Z3QUFBWWNRQUFBQUFBQUFBQUFBQUFBQUFBQUFBWWNRQUFBQUFBQUFBQUFBQVAvL2Z3QUFBVEFOQmdrcWhraUcKKzl3MEJBUXNGQUFPQ0FRRUFCVUVtZVFrRy9QUzkzNWpNSERyZy81em00WDJ4cm5GdG1Ud2IwamR4ZmF1NnovN2gKK0FieEQ1aW95WTdGVVROQ3pJNlN5TW85dkpKdFlDVEN1RUdyODRKalQyUjcyMzJ6NjBrNGMxei9hdjAxVzNPcnYKK0V4SGZBWjhsbGhrZnUwMjA5VDVUYUlZQ0I3aERGajVLRGJ0YThjNmZFY3d0bWxIUVdqM00zMWxTTnNyNFp0V1cKK3dPYmhLM3NxVHNPbHVIYmhLTndsTkVhdDQ4bGJPUVVDMTlJMVdpM2RBUzZuOGxyMGxFaGZHS3ZxeHUwVmlBU1MKK04xbkxmZGtSRUdwMzliWXBLZzBuNkVGdzViWXlWNHFFM2NuSWVkRkpwN05JT00vNnhuZEpNaC9jNWw2TjJ1eVoKK3VwQXJSUXB3LzNqK0hrTDF4OWJzKzkwMFFLMEdJNkF4Z2pib3BBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnRfdjMua2V5IGIvdGVzdC9rZXlzL2NsaWVudF92My5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4OWY3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnRfdjMua2V5CkBAIC0wLDAgKzEsMjcgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUVwQUlCQUFLQ0FRRUF0blRDSkNkZURsQXhsbGE2QjM4N2ZDaHEzSWU1ek1tNFZLWmlKRVpZdXZjKzZBSDcKK0cyK1BMU3ROd1RZdzNIOXQyeFhHdHFrSW9ENjB3VTVGc1NXd1hxT1RRZjRIc0hNYWdqQWV2bzN3WS9WVTZnRFoKKzZ5dUd3MFRQYlpva2pUUlZvVk1VVHdiK3FBVnlLSEpwVllkbXd0cmN4cVE3TVZTWTRGcFhhMHNHTUtOck9lcGYKK0RkNmpkZkJRalFHU0JMMXYyK3BlTkp5WjlaY1BEbjdXS3poc0tDNlliYk9QMFNrdktsejJvSVkwb1VFN1pnaUQKK1Jld2dnbnhHbXVXSnFlTXZvL2d4OExvWTg3SmJnMXRsb3QwUksvOXU2YWxYSzVYOEwvR3FROXFHODdBRzQ4VFcKK1dqRmxrL0hwQy9mcnlxZnRKVTFWazR2SmZ2YmF5bWlnRGticHl3SURBUUFCQW9JQkFRQ0pweVVoYWFJSVluQkcKKzREK1JrR2dzajhHdmg2YWgzajUzZnQva1JqNkRNQzRCbEIwQzRmTy9QRUI1V0kwY2pmY3Zwd280bk9hcEh5WDQKK0FUbUxJTWdqWG4ybStDU005d28wMW1FYm1yS1dkMjBNN245NmNXaEd3ZzlNdlZKK1JkR2sySzBsd2owMlBvV1cKK0JsdDU3NkdUdU5OLytqKytRL2ppcXNYeGFMVE8wL1dqKzRiMmdRaDNuOEkwdTZia29sRExvRVJLSWRyTEdISCsKK0ZVM3NrOGJwVWhIbWVpVVRmd3djaStqdWh0T1k5ZTMwQUVzdDZ4YWtDSGJxMWxSUnlFWVB0V0w3b0xkczZ5djAKK1VBS1A3d1M5WWw2ZGNla1hTRjFSWnBCK2ZvdlRXK3FQWW44YUV1a3NhTXowd0s5NkZDT2pWTkdZeE1wK1hudmwKK3NLeDYzVVpCQW9HQkFPQ2JDYkp0TzBIc2dJYXV2Q3ZHWjUwYVoxdkR2UVJlQ3dyaTRpb3V0RWc0SkNBWEhFc1gKKytheHoySjVqM1VFUWhHS3IwRVg5Qkc2WWJ4R1cwTW1qZjNReGVSQiswV0xwTU1ZMlNGdDkzb0MyUjFBWDlsMEkKK2g1ME82dFl2NVNYbTk2cEt4d1J6MDFkODRtQ0pnd24vRytjWi9FSmo0cmZac05iUXN0NkpRRnZ6QW9HQkFNLzEKK2dMVlF0NWwrSUsrNnM2OEVuQURJNjZpN2NLZTZzajNyRlJUYWhaSnhMMnZZMjhKOUVCMm1GL1hFZ0FSU05KUVYKK1gvSDl6RHJ3S205TVg4Ny9lQ0gybkViYys1cVNHcERQUW00ODJDOURxc01pdHhDS0Q4YmJsZTFCbHBqRmI4aHIKK1IwUTN2NXE4dTV1b21MQmRzNWVVQmVSS010dTl0T01BOUtSU0RHakpBb0dBRjQ0SzJVeDlUMitYRndqU01TRVEKK2tyaEhLS2VCZGlqS3JheVhuV2JpZjBSci9YV1BBUTBWb1JGUklXTkZ1K0lZa0NTR3BpQmZ5NTF1NElCWml4djcKK2JOc1hZRFI4and2M2tvSDAycXQ3bnpIK2pwYkV2b0w3ZmV3bmtxalpOajFmc2RzL3ZlYkx2andablpndVJ1a2IKK0t3UmRvVFRLZlE5MmJVRGIwVnpCaENNQ2dZQjdIKzNPYkRYb0NRY3RSQ3N5aWxZYkdOcCtFa3hHNG9DNXJEL1YKK0V2UldtZkRydDMrVmpScEhrNWxJQjhtTHhXZ2Y3Ty9iaE5xd1lwV2RRK2pOMCsrNm5CbzIwb3VkSHJmZjJQYUoKKzhqaEU4NWxjNDJiandmcEpVS1ZaemFWdVdpY3UwR1ZuZkdKVEtUOGlrQlduQmpOWW9XbERtcksxNjRIM2pROUwKK1l0QzZFUUtCZ1FDYWJGWFhIeDVjSUoyWE9tNEsvblRPRzdDbHZEODB4YXBxeUdyb1FkOUUvY0pVSEhQcC93UTQKK2MxZE1PNUVWaU03SlJzS2Z4a2w5dk01bzlJTTdzd2xZaDRFTUZTTEpOanpnT1k5WFZrdlFoMHVHYmlKT0JPNGYKK2luVXVXbjFZV1VqL0hGdHJUKzBObytjWXZaVmNNS3JGQXkzSy9Bd3BUYmZLQ2s2cm91bGxOQT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL3NlcnZlci5jcnQgYi90ZXN0L2tleXMvc2VydmVyLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVlZjNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL3NlcnZlci5jcnQKQEAgLTAsMCArMSwyNSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTnpDQ0F4K2dBd0lCQWdJSkFPWWZZZnc3TkNPY01BMEdDU3FHU0liM0RRRUJCUVVBTUlHeE1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNBd0lUV0Z5ZVd4aGJtUXhGREFTQmdOVkJBY01DMFp2Y21WemRDQklhV3hzCitNU2N3SlFZRFZRUUtEQjVVYUdVZ1FYQmhZMmhsSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEZqQVVCZ05WCitCQXNNRFVGd1lXTm9aU0JVYUhKcFpuUXhFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXpkREVrTUNJR0NTcUdTSWIzCitEUUVKQVJZVlpHVjJRSFJvY21sbWRDNWhjR0ZqYUdVdWIzSm5NQjRYRFRFME1EUXdOekU0TlRnd01Gb1hEVEl5CitNRFl5TkRFNE5UZ3dNRm93Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRFZRUUlEQWhOWVhKNWJHRnVaREVVCitNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSb1pTQkJjR0ZqYUdVZ1UyOW1kSGRoCitjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSb2NtbG1kREVTTUJBR0ExVUVBd3dKCitiRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeWFXWjBMbUZ3WVdOb1pTNXZjbWN3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcUU5VEU5d0VYcDVMUnRMUVZEU0dRCitHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeVNOOEkyWHc2CitMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSGpLTmc2WktnCisyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQkdtWm1NSVV3CitBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYa3U2MkxpcGtYCit3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbXRyaFZRRjRuCitBZ01CQUFHalVEQk9NQjBHQTFVZERnUVdCQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBZkJnTlZIU01FCitHREFXZ0JRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzCitEUUVCQlFVQUE0SUJBUUJHRlJpSnNsY1gwYUprd1pwelR3U1VkZ2NmS2Jwdk5FYkNOdFZvaGZRVlRJNGEvb041CitVK3lxRFpKZzN2T2FPdWlBWnF5SGNJbFo4cXllc0NnUk4zMTRUbDQvSlErK0NXOG1LajFtZVRnbzVZRnhjWlltCitUOXZzSTNDK056bjg0RElOZ0k5bXg2eWt0SXQzUU9LWlJEcHp5UGtVenhzeUo4SjQyN0RhaW1EcmpUUitmVHdECisxRGgwOXhlZU1uU2E1emVWMUhFRHlKVHFDWHV0TGV0d1EvSXlmbU1CaEl4K252QjVmNjdwei9tK0R2NlYwcjNJCitwNEhDY2RuRFVER0piZnF0b3FzQUFUUVFXTytXV3Vzd0I2bU9oRGJ2UFR4aFJwWnE2QWtnV3F2NFMrdTNNMkdPCityNXA5RnJCZ2F2QXc1YktPNTRDMG9RS3BOLzVmdGE1bDZXczAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5IGIvdGVzdC9rZXlzL3NlcnZlci5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzY2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5CkBAIC0wLDAgKzEsMjggQEAKKy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQorTUlJRXZBSUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS1l3Z2dTaUFnRUFBb0lCQVFDcUU5VEU5d0VYcDVMUgordExRVkRTR1FHVjc4KzdadFAvSS9aYUo2UTZaR2xmeERGdlpqRkY3M3NlTmhBdmxLbFltL2pmbElIWUxuTk9DeQorU044STJYdzZMOU1iQytqdndrRUtmUW80ZURveFpuT1pqTkY1SjEvbFp0QmVPb3dNa2hoekJNSDFSZHMzNTEvSAoraktOZzZaS2cyQ2xkZDBqN0hiRHRFaXhPTGdMYlBScEJjYVlyTHJOTWFzZjNIYWwreDgvYjh1ZTI4eDkzSFNRQgorR21abU1JVXdBaW5FdS9mTlA0bExHbC8wa1piNzZUbnlScFlTUFlvanRTNkNua0grUUxZbnNSUkVYSll3RDFYawordTYyTGlwa1h3Q2tSVG5aNW5Vc0RNWDZGUEtnalFGUUNXRFhHL04wOTYrUFJVUUFDaGhyWHNKK2dGM05xV3REbQordHJoVlFGNG5BZ01CQUFFQ2dnRUFXL3k1MllZVzZ5cFJPR2JaOTREUXBGVjBrTE83cVQ4cTBLc3h3NXNQTmFJdAorZkVQUkl5bURhOGlreUhXSlM1T3htdzg0d281am5KVjI2amFMbXdlMkx1cHE3WGYxbHFlajhmNUxKdHV2N2NRUgoreGZ6cDF2TTY1S0pGRkpIcDZXcWpHcUo2SFNTWk9wVkRzblFZY1hRalFDZHB5QW1hU1dkM3ArRnFZU1oxbVFtRAorYkZOSTdqcXBjeldTWmhUZG90UTdwN0huOVRWQ2VoZmxQM3lHSUIzYlErd0NjQ0I4NWRPQnoyMDFMK1lnYUljaworU3o0M0E0TnZXYVFJUkxSRHc3czlHVzRqWTVUMEp2MjgyV0llQWxWcFZ4TEl3dTQ4cjRSNHlHVEl4OVlkb3d2cQorNTcrWTVpUFBqQVh4dTBWOXQwMG9TM2JZeERhS2gyRFVmYy81em93cThRS0JnUURZTlZQWG1hRzBhSUg0dmpROQorN2ZSZHcvVURrWWNRYm42Q25nbFFPdTc3L1M4b2dRenBLQ1ZKZ0pna1pOcU9WdFFNRVB6ZWtHRWNMVGJqZTFnVQorOEJreTJrK1BMOVV3YkZ5MGVtbk9WaDRycXJOWEhzUnZKY2VoTlQvUFJiNWhqRjNNVU1GVi8waUQ0YituYUZhRQoranJTV2laMlpYajJxZndBSzUyR0ZidE91QlFLQmdRREpZUXVHaVkwcjIyRTR3YUptQ1NLY3pvQlQzY3dsVnpXagorVjJsamdBOVJITE5UVmt2Tk5ZUUxHdTJxbmdGcnR3cGVhU25zTURlclZHNHdLQVFXeUNuWXp4VnJsbkM0dURySgorSFh1RkVsdEJXaTlGZmJnZnNuZDM3NDlBVDBvQlAxTlQydE1sZWd1eWY1REZnakNSM1ZSSkxkclZhYVo4cm93LworTHFLY0ZNcW5Pd0tCZ0IrT0lPOTlsN0U1ODRZM1ZHNlpkU25lT0x0Tm1SWFgycFQ3dGNaRTQ2NVpkSEdIN0RkMworU1lIaHg5Sy8rWG4reURIK3BMbGkveGxhckFFbGRtU1A2azJXdVRmZnRsQzc4QWZUT2ZBSWQ1ek43Q0RSOTc5MQorRng2N0k5WC9pdHEzM3RTOEVJdVpsNTdQNnVYbS80R1hSbG9XT2E4eHB2UmtWc0JBcHVZUGw4dDFBb0dBVFFEUworeTJzbGxET2JCWHpsZ0diVjJXZ05JZ1NaMzExdG9UdjNqSmlYUXNqYXVXOHlKUkhsbitsNEg5bXphV0Rna2lGYworYW5nMWtVb0RxRjVrMGVGUVB4dFFjWWRoS3dFbldXZndwMzNSYnpmeEEzMkRQbnVidXp6YlpoZnJrSGFLZ25JVworY3lvcjl1RllsbTJsN09EWkxmSmV6MlJLeVRwbFhuT1NzbVF3NmFrQ2dZQXozZGo5SHNreWorSFZKK2h0MU9jRQorYzdhaS9FU2tTQTdWYWpwMHRqSnAwRUtqVy96cThEdlVTWE90Y2RuSmdrS3ljRmx1THdibW5hTjR0eEJkczFDMQorUXI4UnQyc1VDQ0JOWmUxTDZESGUzWEJkYmtKZTlzZ1pWTlRqdFVTUXJ6eThVaHZzQ3FHNFlXZUN1MDdTemNiYworcmRQVVY5L3VRa2R4OFZyU2h4bEQ4QT09CistLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvc2VydmVyLnAxMiBiL3Rlc3Qva2V5cy9zZXJ2ZXIucDEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTA4YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvc2VydmVyLnAxMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvc2VydmVyLnBlbSBiL3Rlc3Qva2V5cy9zZXJ2ZXIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWE5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvc2VydmVyLnBlbQpAQCAtMCwwICsxLDUzIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCitNSUlFdkFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLWXdnZ1NpQWdFQUFvSUJBUUNxRTlURTl3RVhwNUxSCit0TFFWRFNHUUdWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5CitTTjhJMlh3Nkw5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9ICitqS05nNlpLZzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCCitHbVptTUlVd0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrCit1NjJMaXBrWHdDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtCit0cmhWUUY0bkFnTUJBQUVDZ2dFQVcveTUyWVlXNnlwUk9HYlo5NERRcEZWMGtMTzdxVDhxMEtzeHc1c1BOYUl0CitmRVBSSXltRGE4aWt5SFdKUzVPeG13ODR3bzVqbkpWMjZqYUxtd2UyTHVwcTdYZjFscWVqOGY1TEp0dXY3Y1FSCit4ZnpwMXZNNjVLSkZGSkhwNldxakdxSjZIU1NaT3BWRHNuUVljWFFqUUNkcHlBbWFTV2QzcCtGcVlTWjFtUW1ECitiRk5JN2pxcGN6V1NaaFRkb3RRN3A3SG45VFZDZWhmbFAzeUdJQjNiUSt3Q2NDQjg1ZE9CejIwMUwrWWdhSWNrCitTejQzQTROdldhUUlSTFJEdzdzOUdXNGpZNVQwSnYyODJXSWVBbFZwVnhMSXd1NDhyNFI0eUdUSXg5WWRvd3ZxCis1NytZNWlQUGpBWHh1MFY5dDAwb1MzYll4RGFLaDJEVWZjLzV6b3dxOFFLQmdRRFlOVlBYbWFHMGFJSDR2alE5Cis3ZlJkdy9VRGtZY1FibjZDbmdsUU91NzcvUzhvZ1F6cEtDVkpnSmdrWk5xT1Z0UU1FUHpla0dFY0xUYmplMWdVCis4Qmt5MmsrUEw5VXdiRnkwZW1uT1ZoNHJxck5YSHNSdkpjZWhOVC9QUmI1aGpGM01VTUZWLzBpRDRiK25hRmFFCitqclNXaVoyWlhqMnFmd0FLNTJHRmJ0T3VCUUtCZ1FESllRdUdpWTByMjJFNHdhSm1DU0tjem9CVDNjd2xWeldqCitWMmxqZ0E5UkhMTlRWa3ZOTllRTEd1MnFuZ0ZydHdwZWFTbnNNRGVyVkc0d0tBUVd5Q25ZenhWcmxuQzR1RHJKCitIWHVGRWx0QldpOUZmYmdmc25kMzc0OUFUMG9CUDFOVDJ0TWxlZ3V5ZjVERmdqQ1IzVlJKTGRyVmFhWjhyb3cvCitMcUtjRk1xbk93S0JnQitPSU85OWw3RTU4NFkzVkc2WmRTbmVPTHRObVJYWDJwVDd0Y1pFNDY1WmRIR0g3RGQzCitTWUhoeDlLLytYbit5REgrcExsaS94bGFyQUVsZG1TUDZrMld1VGZmdGxDNzhBZlRPZkFJZDV6TjdDRFI5NzkxCitGeDY3STlYL2l0cTMzdFM4RUl1Wmw1N1A2dVhtLzRHWFJsb1dPYTh4cHZSa1ZzQkFwdVlQbDh0MUFvR0FUUURTCit5MnNsbERPYkJYemxnR2JWMldnTklnU1ozMTF0b1R2M2pKaVhRc2phdVc4eUpSSGxuK2w0SDltemFXRGdraUZjCithbmcxa1VvRHFGNWswZUZRUHh0UWNZZGhLd0VuV1dmd3AzM1JiemZ4QTMyRFBudWJ1enpiWmhmcmtIYUtnbklXCitjeW9yOXVGWWxtMmw3T0RaTGZKZXoyUkt5VHBsWG5PU3NtUXc2YWtDZ1lBejNkajlIc2t5aitIVkoraHQxT2NFCitjN2FpL0VTa1NBN1ZhanAwdGpKcDBFS2pXL3pxOER2VVNYT3RjZG5KZ2tLeWNGbHVMd2JtbmFONHR4QmRzMUMxCitRcjhSdDJzVUNDQk5aZTFMNkRIZTNYQmRia0plOXNnWlZOVGp0VVNRcnp5OFVodnNDcUc0WVdlQ3UwN1N6Y2JjCityZFBVVjkvdVFrZHg4VnJTaHhsRDhBPT0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva25vd25fZmFpbHVyZXNfTGludXguanNvbiBiL3Rlc3Qva25vd25fZmFpbHVyZXNfTGludXguanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWIyYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCkBAIC0wLDAgKzEsNDk0IEBACitbCisgICJjX2dsaWItcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY19nbGliLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjX2dsaWItcnNfbXVsdGljX2J1ZmZlcmVkLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aWNfZnJhbWVkLWlwIiwKKyAgImNsLWNfZ2xpYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtY19nbGliX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGktYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpX2ZyYW1lZC1pcCIsCisgICJjbC1nb19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtZ29fYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJjbC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yc19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtcnNfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yc19tdWx0aS1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtcnNfbXVsdGktYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAiY3BwLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJjcHAtZGFydF9tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZGFydF9tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLWdvX2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1nb19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtZ29fY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fanNvbl9odHRwLWlwIiwKKyAgImNwcC1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZ29fbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtZ29fbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX2pzb25faHR0cC1pcCIsCisgICJjcHAtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19qc29uX2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGktYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aWMtY29tcGFjdF9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX211bHRpai1qc29uX2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHkzX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLW11bHRpYV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1tdWx0aWFjX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtbXVsdGlhY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1tdWx0aWFfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpaC1oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNwcC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAiY3BwLXJzX211bHRpY19idWZmZXJlZC1pcCIsCisgICJjcHAtcnNfbXVsdGljX2ZyYW1lZC1pcCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY2xfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtY2xfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLWNwcF9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWNwcF9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtY3BwX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLWNwcF9qc29uX2h0dHAtaXAiLAorICAiZC1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLWRfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWRfanNvbl9odHRwLWlwIiwKKyAgImQtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZGFydF9qc29uX2h0dHAtaXAiLAorICAiZC1nb19iaW5hcnlfaHR0cC1pcCIsCisgICJkLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLWdvX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWdvX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1nb19qc29uX2h0dHAtaXAiLAorICAiZC1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2pzb25faHR0cC1pcCIsCisgICJkLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLWpzX2pzb25faHR0cC1pcCIsCisgICJkLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2h0dHAtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19qc29uX2h0dHAtaXAiLAorICAiZC1ub2RlanNfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLW5vZGV0c19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLXB5M19iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJkLXB5M19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJkLXB5M19jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLXB5M19jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfanNvbl9idWZmZXJlZC1pcCIsCisgICJkLXB5M19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2ZyYW1lZC1pcCIsCisgICJkLXB5M19qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfanNvbl9odHRwLWlwIiwKKyAgImQtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiZC1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiZC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weV9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLXB5X2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1weV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLXB5X2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLXB5X2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1weV9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9qc29uX2ZyYW1lZC1pcCIsCisgICJkLXB5X2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2pzb25faHR0cC1pcCIsCisgICJkLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAiZXJsLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLW5vZGV0c19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiZXJsLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImdvLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZ28tY3BwX2pzb25faHR0cC1pcCIsCisgICJnby1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1kX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1kX2pzb25faHR0cC1pcCIsCisgICJnby1kX2pzb25faHR0cC1pcC1zc2wiLAorICAiZ28tZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJnby1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJnby1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1qYXZhX2pzb25faHR0cC1pcCIsCisgICJnby1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAiZ28tcHkzX2JpbmFyeS1hY2NlbF96bGliLWlwLXNzbCIsCisgICJnby1weTNfY29tcGFjdC1hY2NlbGNfemxpYi1pcC1zc2wiLAorICAiZ28tcHlfYmluYXJ5LWFjY2VsX3psaWItaXAtc3NsIiwKKyAgImdvLXB5X2NvbXBhY3QtYWNjZWxjX3psaWItaXAtc3NsIiwKKyAgImhzLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiaHMtY3NoYXJwX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiaHMtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiaHMtY3NoYXJwX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgIm5vZGVqcy1jcHBfYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgIm5vZGVqcy1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWNwcF9jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgIm5vZGVqcy1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtZGFydF9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWdvX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtZ29fY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZ29fanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1oc19iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtaHNfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1oc19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qYXZhX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qc19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWx1YV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtbHVhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtbHVhX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJub2RlanMtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtcHlfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInBlcmwtcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAicGVybC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwLXNzbCIsCisgICJweS1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAicHktY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9oZWFkZXJfaHR0cC1pcCIsCisgICJweS1jcHBfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9qc29uX2h0dHAtaXAiLAorICAicHktY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAicHktZF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1kX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1kX2pzb25faHR0cC1pcCIsCisgICJweS1kX2pzb25faHR0cC1pcC1zc2wiLAorICAicHktZGFydF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kYXJ0X2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJweS1oc19hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1oc19hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWhzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1oc19oZWFkZXJfaHR0cC1pcCIsCisgICJweS1oc19qc29uX2h0dHAtaXAiLAorICAicHktamF2YV9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2pzb25faHR0cC1pcCIsCisgICJweS1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAicHktbHVhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWx1YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWx1YV9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1sdWFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWx1YV9qc29uX2h0dHAtaXAiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAtc3NsIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAtc3NsIiwKKyAgInB5My1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfaGVhZGVyX2h0dHAtaXAiLAorICAicHkzLWNwcF9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9qc29uX2h0dHAtaXAiLAorICAicHkzLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtZF9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtZF9qc29uX2h0dHAtaXAiLAorICAicHkzLWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJweTMtZGFydF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtZGFydF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZGFydF9qc29uX2h0dHAtaXAiLAorICAicHkzLWhzX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1oc19hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1oc19iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtaHNfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1oc19oZWFkZXJfaHR0cC1pcCIsCisgICJweTMtaHNfanNvbl9odHRwLWlwIiwKKyAgInB5My1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9qc29uX2h0dHAtaXAiLAorICAicHkzLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJweTMtbHVhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1sdWFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1sdWFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1sdWFfanNvbl9odHRwLWlwIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWRvbWFpbiIsCisgICJyYi1jcHBfanNvbl9idWZmZXJlZC1pcCIsCisgICJyYi1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAicmItY3BwX2pzb25fZnJhbWVkLWRvbWFpbiIsCisgICJyYi1jcHBfanNvbl9mcmFtZWQtaXAiLAorICAicmItY3BwX2pzb25fZnJhbWVkLWlwLXNzbCIKK10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2x1YS9NYWtlZmlsZS5hbSBiL3Rlc3QvbHVhL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOGM1YWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2x1YS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworIyBSZW1vdmUgIk1hcFR5cGUgPSIgbGluZSB0byBpZ25vcmUgc29tZSBtYXAgYnVnIGZvciBub3cKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gbHVhICQ8CisJJChTRUQpIC1pLmJhayAncy9NYXBUeXBlID0vL2cnIGdlbi1sdWEvVGhyaWZ0VGVzdF90dHlwZXMubHVhCisJJChSTSkgZ2VuLWx1YS9UaHJpZnRUZXN0X3R0eXBlcy5sdWEuYmFrCisKK3ByZWNyb3NzOiBzdHVicworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tbHVhCmRpZmYgLS1naXQgYS90ZXN0L2x1YS90ZXN0X2Jhc2ljX2NsaWVudC5sdWEgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX2NsaWVudC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkOGQwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YQpAQCAtMCwwICsxLDE3OSBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCisKKworcmVxdWlyZSgnVFNvY2tldCcpCityZXF1aXJlKCdUQnVmZmVyZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEZyYW1lZFRyYW5zcG9ydCcpCityZXF1aXJlKCdUSHR0cFRyYW5zcG9ydCcpCityZXF1aXJlKCdUQ29tcGFjdFByb3RvY29sJykKK3JlcXVpcmUoJ1RKc29uUHJvdG9jb2wnKQorcmVxdWlyZSgnVEJpbmFyeVByb3RvY29sJykKK3JlcXVpcmUoJ1RocmlmdFRlc3RfVGhyaWZ0VGVzdCcpCityZXF1aXJlKCdsaWJsdWFsb25nbnVtYmVyJykKKworbG9jYWwgY2xpZW50CisKK2Z1bmN0aW9uIHRlYXJkb3duKCkKKyAgaWYgY2xpZW50IHRoZW4KKyAgICAtLSBjbG9zZSB0aGUgY29ubmVjdGlvbgorICAgIGNsaWVudDpjbG9zZSgpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIHBhcnNlQXJncyhyYXdBcmdzKQorICBsb2NhbCBvcHQgPSB7CisgICAgcHJvdG9jb2w9J2JpbmFyeScsCisgICAgdHJhbnNwb3J0PSdidWZmZXJlZCcsCisgICAgcG9ydD0nOTA5MCcsCisgIH0KKyAgZm9yIGksIHN0ciBpbiBwYWlycyhyYXdBcmdzKSBkbworICAgIGlmIGkgPiAwIHRoZW4KKyAgICAgIGssIHYgPSBzdHJpbmcubWF0Y2goc3RyLCAnLS0oJXcrKT0oJXcrKScpCisgICAgICBhc3NlcnQob3B0W2tdIH49IG5pbCwgJ1Vua25vd24gYXJndW1lbnQnKQorICAgICAgb3B0W2tdID0gdgorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIG9wdAorZW5kCisKK2Z1bmN0aW9uIGFzc2VydEVxdWFsKHZhbDEsIHZhbDIsIG1zZykKKyAgYXNzZXJ0KHZhbDEgPT0gdmFsMiwgbXNnKQorZW5kCisKK2Z1bmN0aW9uIHRlc3RCYXNpY0NsaWVudChyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKKyAgbG9jYWwgc29ja2V0ID0gVFNvY2tldDpuZXd7CisgICAgcG9ydCA9IHRvbnVtYmVyKG9wdC5wb3J0KQorICB9CisgIGFzc2VydChzb2NrZXQsICdGYWlsZWQgdG8gY3JlYXRlIGNsaWVudCBzb2NrZXQnKQorICBzb2NrZXQ6c2V0VGltZW91dCg1MDAwKQorCisgIGxvY2FsIHRyYW5zcG9ydHMgPSB7CisgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydCwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnQsCisgIH0KKyAgYXNzZXJ0KHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF0gfj0gbmlsKQorICBsb2NhbCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdOm5ld3sKKyAgICB0cmFucyA9IHNvY2tldCwKKyAgICBpc1NlcnZlciA9IGZhbHNlCisgIH0KKworICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sLAorICAgIGNvbXBhY3QgPSBUQ29tcGFjdFByb3RvY29sLAorICAgIGpzb24gPSBUSlNPTlByb3RvY29sLAorICB9CisgIGFzc2VydChwcm90b2NvbHNbb3B0LnByb3RvY29sXSB+PSBuaWwpCisgIGxvY2FsIHByb3RvY29sID0gcHJvdG9jb2xzW29wdC5wcm90b2NvbF06bmV3eworICAgIHRyYW5zID0gdHJhbnNwb3J0CisgIH0KKyAgYXNzZXJ0KHByb3RvY29sLCAnRmFpbGVkIHRvIGNyZWF0ZSBiaW5hcnkgcHJvdG9jb2wnKQorCisgIGNsaWVudCA9IFRocmlmdFRlc3RDbGllbnQ6bmV3eworICAgIHByb3RvY29sID0gcHJvdG9jb2wKKyAgfQorICBhc3NlcnQoY2xpZW50LCAnRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQnKQorCisgIC0tIE9wZW4gdGhlIHRyYW5zcG9ydAorICBsb2NhbCBzdGF0dXMsIF8gPSBwY2FsbCh0cmFuc3BvcnQub3BlbiwgdHJhbnNwb3J0KQorICBhc3NlcnQoc3RhdHVzLCAnRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmVyJykKKworICAtLSBTdHJpbmcKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RTdHJpbmcoJ2xhbGEnKSwgICdsYWxhJywgICdGYWlsZWQgdGVzdFN0cmluZycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0U3RyaW5nKCd3YWhvbycpLCAnd2Fob28nLCAnRmFpbGVkIHRlc3RTdHJpbmcnKQorCisgIC0tIEJvb2wKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCb29sKHRydWUpLCB0cnVlLCAnRmFpbGVkIHRlc3RCb29sIHRydWUnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJvb2woZmFsc2UpLCBmYWxzZSwgJ0ZhaWxlZCB0ZXN0Qm9vbCBmYWxzZScpCisKKyAgLS0gQnl0ZQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHgwMSksIDEsICAgICdGYWlsZWQgdGVzdEJ5dGUgMScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweDQwKSwgNjQsICAgJ0ZhaWxlZCB0ZXN0Qnl0ZSAyJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4N2YpLCAxMjcsICAnRmFpbGVkIHRlc3RCeXRlIDMnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHg4MCksIC0xMjgsICdGYWlsZWQgdGVzdEJ5dGUgNCcpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweGJmKSwgLTY1LCAgJ0ZhaWxlZCB0ZXN0Qnl0ZSA1JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4ZmYpLCAtMSwgICAnRmFpbGVkIHRlc3RCeXRlIDYnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMTI4KSwgLTEyOCwgICdGYWlsZWQgdGVzdEJ5dGUgNycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgyNTUpLCAtMSwgICAgJ0ZhaWxlZCB0ZXN0Qnl0ZSA4JykKKworICAtLSBJMzIKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHgwMDAwMDAwMSksIDEsICAgICAgICAgICAnRmFpbGVkIHRlc3RJMzIgMScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4NDAwMDAwMDApLCAxMDczNzQxODI0LCAgJ0ZhaWxlZCB0ZXN0STMyIDInKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweDdmZmZmZmZmKSwgMjE0NzQ4MzY0NywgICdGYWlsZWQgdGVzdEkzMiAzJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHg4MDAwMDAwMCksIC0yMTQ3NDgzNjQ4LCAnRmFpbGVkIHRlc3RJMzIgNCcpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4YmZmZmZmZmYpLCAtMTA3Mzc0MTgyNSwgJ0ZhaWxlZCB0ZXN0STMyIDUnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweGZmZmZmZmZmKSwgLTEsICAgICAgICAgICdGYWlsZWQgdGVzdEkzMiA2JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMjE0NzQ4MzY0OCksIC0yMTQ3NDgzNjQ4LCAnRmFpbGVkIHRlc3RJMzIgNycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDQyOTQ5NjcyOTUpLCAtMSwgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STMyIDgnKQorCisgIC0tIEk2NCAobHVhIG9ubHkgc3VwcG9ydHMgMTYgZGVjaW1hbCBwcmVjaXNpb24gc28gbGFyZ2VyIG51bWJlcnMgYXJlCisgIC0tIGluaXRpYWxpemVkIGJ5IHRoZWlyIHN0cmluZyB2YWx1ZSkKKyAgbG9jYWwgbG9uZyA9IGxpYmx1YWxvbmdudW1iZXIubmV3CisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoMHgwMDAwMDAwMDAwMDAwMDAxKSksCisgICAgICAgICAgICAgICAgICAgbG9uZygxKSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgMScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoMHg0MDAwMDAwMDAwMDAwMDAwKSksCisgICAgICAgICAgICAgICAgICAgbG9uZyg0NjExNjg2MDE4NDI3Mzg3OTA0KSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgMicpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoJzB4N2ZmZmZmZmZmZmZmZmZmZicpKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKCc5MjIzMzcyMDM2ODU0Nzc1ODA3JyksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDMnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEk2NChsb25nKDB4ODAwMDAwMDAwMDAwMDAwMCkpLAorICAgICAgICAgICAgICAgICAgIGxvbmcoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpLAorICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdGVzdEk2NCA0JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygnMHhiZmZmZmZmZmZmZmZmZmZmJykpLAorICAgICAgICAgICAgICAgICAgIGxvbmcoJy00NjExNjg2MDE4NDI3Mzg3OTA1JyksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDUnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEk2NChsb25nKCcweGZmZmZmZmZmZmZmZmZmZmYnKSksCisgICAgICAgICAgICAgICAgICAgbG9uZygtMSksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDYnKQorCisgIC0tIERvdWJsZQorICBhc3NlcnRFcXVhbCgKKyAgICAgIGNsaWVudDp0ZXN0RG91YmxlKDEuMjM0NTY3ODkpLCAxLjIzNDU2Nzg5LCAnRmFpbGVkIHRlc3REb3VibGUgMScpCisgIGFzc2VydEVxdWFsKAorICAgICAgY2xpZW50OnRlc3REb3VibGUoMC4xMjM0NTY3ODkpLCAwLjEyMzQ1Njc4OSwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDInKQorICBhc3NlcnRFcXVhbCgKKyAgICAgIGNsaWVudDp0ZXN0RG91YmxlKDAuMTIzNDU2Nzg5KSwgMC4xMjM0NTY3ODksICdGYWlsZWQgdGVzdERvdWJsZSAzJykKKworICAtLSBUT0RPIHRlc3RCaW5hcnkoKSAuLi4KKwkgIAorICAtLSBBY2N1cmFjeSBvZiAxNiBkZWNpbWFsIGRpZ2l0cyAocm91bmRzKQorICBsb2NhbCBhLCBiID0gMS4xMjM0NTY3ODkwNjY2NjY2MywgMS4xMjM0NTY3ODkwNjY2NjY2MQorICBhc3NlcnRFcXVhbChhLCBiKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdERvdWJsZShhKSwgYiwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDUnKQorCisgIC0tIFN0cnVjdAorICBsb2NhbCBvID0gWHRydWN0Om5ld3sKKyAgICBzdHJpbmdfdGhpbmcgPSAnWmVybycsCisgICAgYnl0ZV90aGluZyA9IDEsCisgICAgaTMyX3RoaW5nID0gLTMsCisgICAgaTY0X3RoaW5nID0gbG9uZygtNSkKKyAgfQorICBsb2NhbCByID0gY2xpZW50OnRlc3RTdHJ1Y3QobykKKyAgYXNzZXJ0RXF1YWwoby5zdHJpbmdfdGhpbmcsIHIuc3RyaW5nX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMScpCisgIGFzc2VydEVxdWFsKG8uYnl0ZV90aGluZywgci5ieXRlX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMicpCisgIGFzc2VydEVxdWFsKG8uaTMyX3RoaW5nLCByLmkzMl90aGluZywgJ0ZhaWxlZCB0ZXN0U3RydWN0IDMnKQorICBhc3NlcnRFcXVhbChvLmk2NF90aGluZywgci5pNjRfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCA0JykKKworICAtLSBUT0RPIGFkZCBsaXN0IG1hcCBzZXQgZXhjZXB0aW9uIGV0YyBldGMKK2VuZAorCit0ZXN0QmFzaWNDbGllbnQoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDJkNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX3NlcnZlci5sdWEKQEAgLTAsMCArMSwxNDIgQEAKKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZXF1aXJlKCdUaHJpZnRUZXN0X1RocmlmdFRlc3QnKQorcmVxdWlyZSgnVFNvY2tldCcpCityZXF1aXJlKCdUQnVmZmVyZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEZyYW1lZFRyYW5zcG9ydCcpCityZXF1aXJlKCdUSHR0cFRyYW5zcG9ydCcpCityZXF1aXJlKCdUQ29tcGFjdFByb3RvY29sJykKK3JlcXVpcmUoJ1RKc29uUHJvdG9jb2wnKQorcmVxdWlyZSgnVEJpbmFyeVByb3RvY29sJykKK3JlcXVpcmUoJ1RTZXJ2ZXInKQorcmVxdWlyZSgnbGlibHVhbG9uZ251bWJlcicpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBIYW5kbGVyCitUZXN0SGFuZGxlciA9IFRocmlmdFRlc3RJZmFjZTpuZXd7fQorCistLSBTdG9wcyB0aGUgc2VydmVyCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0Vm9pZCgpCitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdFN0cmluZyhzdHIpCisgIHJldHVybiBzdHIKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0Qm9vbChib29sKQorICByZXR1cm4gYm9vbAorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RCeXRlKGJ5dGUpCisgIHJldHVybiBieXRlCitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEkzMihpMzIpCisgIHJldHVybiBpMzIKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0STY0KGk2NCkKKyAgcmV0dXJuIGk2NAorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3REb3VibGUoZCkKKyAgcmV0dXJuIGQKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0QmluYXJ5KGJ5KQorICByZXR1cm4gYnkKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0U3RydWN0KHRoaW5nKQorICByZXR1cm4gdGhpbmcKK2VuZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gVGVzdAorbG9jYWwgc2VydmVyCisKK2Z1bmN0aW9uIHRlYXJkb3duKCkKKyAgaWYgc2VydmVyIHRoZW4KKyAgICBzZXJ2ZXI6Y2xvc2UoKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBwYXJzZUFyZ3MocmF3QXJncykKKyAgbG9jYWwgb3B0ID0geworICAgIHByb3RvY29sPSdiaW5hcnknLAorICAgIHRyYW5zcG9ydD0nYnVmZmVyZWQnLAorICAgIHBvcnQ9JzkwOTAnLAorICB9CisgIGZvciBpLCBzdHIgaW4gcGFpcnMocmF3QXJncykgZG8KKyAgICBpZiBpID4gMCB0aGVuCisgICAgICBrLCB2ID0gc3RyaW5nLm1hdGNoKHN0ciwgJy0tKCV3Kyk9KCV3KyknKQorICAgICAgYXNzZXJ0KG9wdFtrXSB+PSBuaWwsICdVbmtub3duIGFyZ3VtZW50JykKKyAgICAgIG9wdFtrXSA9IHYKKyAgICBlbmQKKyAgZW5kCisgIHJldHVybiBvcHQKK2VuZAorCitmdW5jdGlvbiB0ZXN0QmFzaWNTZXJ2ZXIocmF3QXJncykKKyAgbG9jYWwgb3B0ID0gcGFyc2VBcmdzKHJhd0FyZ3MpCisgIC0tIEhhbmRsZXIgJiBQcm9jZXNzb3IKKyAgbG9jYWwgaGFuZGxlciA9IFRlc3RIYW5kbGVyOm5ld3t9CisgIGFzc2VydChoYW5kbGVyLCAnRmFpbGVkIHRvIGNyZWF0ZSBoYW5kbGVyJykKKyAgbG9jYWwgcHJvY2Vzc29yID0gVGhyaWZ0VGVzdFByb2Nlc3NvcjpuZXd7CisgICAgaGFuZGxlciA9IGhhbmRsZXIKKyAgfQorICBhc3NlcnQocHJvY2Vzc29yLCAnRmFpbGVkIHRvIGNyZWF0ZSBwcm9jZXNzb3InKQorCisgIC0tIFNlcnZlciBTb2NrZXQKKyAgbG9jYWwgc29ja2V0ID0gVFNlcnZlclNvY2tldDpuZXd7CisgICAgcG9ydCA9IG9wdC5wb3J0CisgIH0KKyAgYXNzZXJ0KHNvY2tldCwgJ0ZhaWxlZCB0byBjcmVhdGUgc2VydmVyIHNvY2tldCcpCisKKyAgLS0gVHJhbnNwb3J0ICYgRmFjdG9yeQorICBsb2NhbCB0cmFuc3BvcnRzID0geworICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnRGYWN0b3J5LAorICB9CisgIGFzc2VydCh0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdLCAnRmFpbGVkIHRvIGNyZWF0ZSBmcmFtZWQgdHJhbnNwb3J0IGZhY3RvcnknKQorICBsb2NhbCB0cmFuc19mYWN0b3J5ID0gdHJhbnNwb3J0c1tvcHQudHJhbnNwb3J0XTpuZXd7fQorICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeSwKKyAgICBjb21wYWN0ID0gVENvbXBhY3RQcm90b2NvbEZhY3RvcnksCisgICAganNvbiA9IFRKU09OUHJvdG9jb2xGYWN0b3J5LAorICB9CisgIGxvY2FsIHByb3RfZmFjdG9yeSA9IHByb3RvY29sc1tvcHQucHJvdG9jb2xdOm5ld3t9CisgIGFzc2VydChwcm90X2ZhY3RvcnksICdGYWlsZWQgdG8gY3JlYXRlIGJpbmFyeSBwcm90b2NvbCBmYWN0b3J5JykKKworICAtLSBTaW1wbGUgU2VydmVyCisgIHNlcnZlciA9IFRTaW1wbGVTZXJ2ZXI6bmV3eworICAgIHByb2Nlc3NvciA9IHByb2Nlc3NvciwKKyAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBzb2NrZXQsCisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHRyYW5zX2ZhY3RvcnksCisgICAgcHJvdG9jb2xGYWN0b3J5ID0gcHJvdF9mYWN0b3J5CisgIH0KKyAgYXNzZXJ0KHNlcnZlciwgJ0ZhaWxlZCB0byBjcmVhdGUgc2VydmVyJykKKworICAtLSBTZXJ2ZQorICBzZXJ2ZXI6c2VydmUoKQorICBzZXJ2ZXIgPSBuaWwKK2VuZAorCit0ZXN0QmFzaWNTZXJ2ZXIoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZhZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkNsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+Q2xpZW50PC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJnF1b3Q7JChQYXRoVG9UaHJpZnQpJnF1b3Q7IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjEzOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBDbGllbnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgImNsaWVudCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIENsaWVudCAgY2xpZW50ICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBDbGllbnQgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBUZXN0Q2xpZW50LlByaW50T3B0aW9uc0hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTcxNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiQjBDMTNEQTAtMzExNy00ODQ0LThBRTgtQjE3NzVFNDYyMjNEIildCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmUxOThjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9UZXN0Q2xpZW50LmNzCkBAIC0wLDAgKzEsOTQzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0VGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIGNsYXNzIFRlc3RQYXJhbXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgaG9zdCA9IElQQWRkcmVzcy5Bbnk7CisgICAgICAgICAgICBwdWJsaWMgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgcHVibGljIGludCBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIGJvb2wgYnVmZmVyZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBmcmFtZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3RvY29sOworICAgICAgICAgICAgcHVibGljIGJvb2wgZW5jcnlwdGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoIExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi11IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1waXBlPSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlcmUgZm9yIGlwYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IG5ldyBJUEFkZHJlc3MoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHNvY2tldHMiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tYmluYXJ5IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWJpbmFyeSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImJpbmFyeSI7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJjb21wYWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJqc29uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENsaWVudENlcnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnRDZXJ0TmFtZSA9ICJjbGllbnQucDEyIjsKKyAgICAgICAgICAgICAgICB2YXIgcG9zc2libGVQYXRocyA9IG5ldyBMaXN0PHN0cmluZz4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHN0cmluZyBleGlzdGluZ1BhdGggPSBudWxsOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoID0gUGF0aC5HZXRGdWxsUGF0aChwb3NzaWJsZVBhdGggKyBjbGllbnRDZXJ0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCQiQ2Fubm90IGZpbmQgZmlsZToge2NsaWVudENlcnROYW1lfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZhciBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoZXhpc3RpbmdQYXRoLCAidGhyaWZ0Iik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2VydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFRDbGllbnRUcmFuc3BvcnQgQ3JlYXRlVHJhbnNwb3J0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0cmFucyA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldENsaWVudENlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZXJ0ID09IG51bGwgfHwgIWNlcnQuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChob3N0LCBwb3J0LCAwLCBjZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmRlciwgY2VydGlmaWNhdGUsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMgfCBTc2xQcm90b2NvbHMuVGxzMTEgfCBTc2xQcm90b2NvbHMuVGxzMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBVcmkodXJsKSwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgQ3JlYXRlUHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJjb21wYWN0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSAianNvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckJhc2VUeXBlcyA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yU3RydWN0cyA9IDI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQ29udGFpbmVycyA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yRXhjZXB0aW9ucyA9IDg7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yVW5rbm93biA9IDY0OworCisgICAgICAgIHByaXZhdGUgY2xhc3MgQ2xpZW50VGVzdAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBudW1JdGVyYXRpb25zOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGRvbmU7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUmV0dXJuQ29kZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGllbnRUZXN0KFRlc3RQYXJhbXMgcGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gcGFyYW0uQ3JlYXRlVHJhbnNwb3J0KCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHBhcmFtLkNyZWF0ZVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBwYXJhbS5udW1JdGVyYXRpb25zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lOworCisgICAgICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhlY3V0ZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zcG9ydC5Jc09wZW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW5Bc3luYyh0b2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyBleC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhjbGllbnQpLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgY2xvc2luZyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBQcmludE9wdGlvbnNIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNsaWVudCBvcHRpb25zOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLXUgPFVSTD4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC10IDwjIG9mIHRocmVhZHMgdG8gcnVuPiAgICAgICAgZGVmYXVsdCA9IDEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC1uIDwjIG9mIGl0ZXJhdGlvbnM+ICAgICAgICAgICAgcGVyIHRocmVhZCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1waXBlPTxwaXBlIG5hbWU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLWhvc3Q9PElQIGFkZHJlc3M+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBvcnQ9PHBvcnQgbnVtYmVyPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS10cmFuc3BvcnQ9PHRyYW5zcG9ydCBuYW1lPiAgICBvbmUgb2YgYnVmZmVyZWQsZnJhbWVkICAoZGVmYXVsdHMgdG8gbm9uZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvdG9jb2w9PHByb3RvY29sIG5hbWU+ICAgICAgb25lIG9mIGNvbXBhY3QsanNvbiAgKGRlZmF1bHRzIHRvIGJpbmFyeSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tc3NsIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZShMaXN0PHN0cmluZz4gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFRlc3RQYXJhbXMoKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uUGFyc2UoYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgcGFyYW0ubnVtVGhyZWFkcykuU2VsZWN0KF8gPT4gbmV3IENsaWVudFRlc3QocGFyYW0pKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKKyAgICAgICAgICAgICAgICB2YXIgdGhyZWFkcyA9IHRlc3RzLlNlbGVjdCh0ZXN0ID0+IG5ldyBUYXNrKHRlc3QuRXhlY3V0ZSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUYXNrLldhaXRBbGwodGhyZWFkcyk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLlNlbGVjdCh0ID0+IHQuUmV0dXJuQ29kZSkuQWdncmVnYXRlKChyMSwgcjIpID0+IHIxIHwgcjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVbmV4cGVjdGVkIGVycm9yIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEJ5dGVzVG9IZXgoYnl0ZVtdIGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoZGF0YSkuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0dmFsID0gbmV3IGJ5dGVbMHgxMDBdOworICAgICAgICAgICAgdmFyIGluaXRMZW4gPSBNYXRoLk1pbigweDEwMCwgcmV0dmFsLkxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoIXJhbmRvbURpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByYW5kb20gZGlzdHJpYnV0aW9uCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRMZW47ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaW5pdExlbjsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRQb3MgPSBybmQuTmV4dCgpICUgaW5pdExlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbFtuZXh0UG9zXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWxbbmV4dFBvc10gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrPGludD4gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLk5vbmU7CisgICAgICAgICAgICB2YXIgcmV0dXJuQ29kZSA9IDA7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB2b2lkIik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgICAgICAgICB2YXIgcyA9IGF3YWl0IGNsaWVudC50ZXN0U3RyaW5nQXN5bmMoIlRlc3QiLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gXCIiICsgcyArICJcIiIpOworICAgICAgICAgICAgaWYgKCJUZXN0IiAhPSBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7CisgICAgICAgICAgICB2YXIgdCA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbEFzeW5jKChib29sKXRydWUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdCk7CisgICAgICAgICAgICBpZiAoIXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKGZhbHNlKSIpOworICAgICAgICAgICAgdmFyIGYgPSBhd2FpdCBjbGllbnQudGVzdEJvb2xBc3luYygoYm9vbClmYWxzZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKKyAgICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgICAgICAgICB2YXIgaTggPSBhd2FpdCBjbGllbnQudGVzdEJ5dGVBc3luYygoc2J5dGUpMSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7CisgICAgICAgICAgICBpZiAoMSAhPSBpOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STMyKC0xKSIpOworICAgICAgICAgICAgdmFyIGkzMiA9IGF3YWl0IGNsaWVudC50ZXN0STMyQXN5bmMoLTEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTMyKTsKKyAgICAgICAgICAgIGlmICgtMSAhPSBpMzIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CisgICAgICAgICAgICB2YXIgaTY0ID0gYXdhaXQgY2xpZW50LnRlc3RJNjRBc3luYygtMzQzNTk3MzgzNjgsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKKyAgICAgICAgICAgIGlmICgtMzQzNTk3MzgzNjggIT0gaTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7CisgICAgICAgICAgICB2YXIgZHViID0gYXdhaXQgY2xpZW50LnRlc3REb3VibGVBc3luYyg1LjMyNTA5ODIzNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKDUuMzI1MDk4MjM1ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpIik7CisgICAgICAgICAgICBkdWIgPSBhd2FpdCBjbGllbnQudGVzdERvdWJsZUFzeW5jKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJpbk91dCA9IFByZXBhcmVUZXN0RGF0YSh0cnVlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCaW5hcnkoIiArIEJ5dGVzVG9IZXgoYmluT3V0KSArICIpIik7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYmluSW4gPSBhd2FpdCBjbGllbnQudGVzdEJpbmFyeUFzeW5jKGJpbk91dCwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgICAgIGlmIChiaW5Jbi5MZW5ndGggIT0gYmluT3V0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHZhciBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluW29mc10gIT0gYmluT3V0W29mc10pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBiaW5hcnkgZXF1YWxzPyBvbmx5IHdpdGggaGFzaGNvZGUgb3B0aW9uIGVuYWJsZWQgLi4uCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBDcmF6eU5lc3RpbmciKTsKKyAgICAgICAgICAgIHZhciBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICB2YXIgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgb25lLlN0cmluZ19maWVsZCA9ICJjcmF6eSI7CisgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVtdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YoQ3JhenlOZXN0aW5nKS5HZXRNZXRob2QoIkVxdWFscyIpPy5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghb25lLkVxdWFscyh0d28pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JDb250YWluZXJzOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDcmF6eU5lc3RpbmcuRXF1YWxzIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgICAgICAgICB2YXIgbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIG8uU3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICAgICAgby5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvLkkzMl90aGluZyA9IC0zOworICAgICAgICAgICAgby5JNjRfdGhpbmcgPSAtNTsKKyAgICAgICAgICAgIHZhciBpID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3RBc3luYyhvLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7CisgICAgICAgICAgICB2YXIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICB2YXIgaTIgPSBhd2FpdCBjbGllbnQudGVzdE5lc3RBc3luYyhvMiwgdG9rZW4pOworICAgICAgICAgICAgaSA9IGkyLlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIHZhciBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbWFwb3V0LktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgbWFwaW4gPSBhd2FpdCBjbGllbnQudGVzdE1hcEFzeW5jKG1hcG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgdmFyIGxpc3RpbiA9IGF3YWl0IGNsaWVudC50ZXN0TGlzdEFzeW5jKGxpc3RvdXQsIHRva2VuKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgc2V0aW4gPSBhd2FpdCBjbGllbnQudGVzdFNldEFzeW5jKHNldG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5PTkUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVFdPLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVEhSRUUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouRklWRSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5FSUdIVCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICB2YXIgdWlkID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmQXN5bmMoMzA5ODU4MjM1MDgyNTIzTCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOworICAgICAgICAgICAgaWYgKDMwOTg1ODIzNTA4MjUyM0wgIT0gdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgICAgICB2YXIgbW0gPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcEFzeW5jKDEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbW0uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworICAgICAgICAgICAgICAgIHZhciBtMiA9IG1tW2tleV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIG0yLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgdmFyIHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIHZhciB3aG9hID0gYXdhaXQgY2xpZW50LnRlc3RJbnNhbml0eUFzeW5jKGluc2FuZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHdob2Fba2V5XTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHYyID0gdmFsW2syXTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgICAgIHZhciB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrMyBpbiB1c2VyTWFwLktleXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOworICAgICAgICAgICAgdmFyIGFyZzEgPSAyOworICAgICAgICAgICAgdmFyIGFyZzIgPSBsb25nLk1heFZhbHVlOworICAgICAgICAgICAgdmFyIG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKworICAgICAgICAgICAgdmFyIHRtcE11bHRpRGljdCA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYWlyIGluIG11bHRpRGljdCkKKyAgICAgICAgICAgICAgICB0bXBNdWx0aURpY3QuQWRkKHBhaXIuS2V5ICsiID0+ICIrIHBhaXIuVmFsdWUpOworCisgICAgICAgICAgICB2YXIgYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLHsiICsgc3RyaW5nLkpvaW4oIiwiLCB0bXBNdWx0aURpY3QpICsgIn0sIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgICAgIHZhciBtdWx0aVJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICArICIsaTMyX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkkzMl90aGluZyArICIsaTY0X3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkk2NF90aGluZyArICIpXG4iKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIlhjZXB0aW9uIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygiVEV4Y2VwdGlvbiIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJva1wiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIm9rIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJYY2VwdGlvbiIsICJpZ25vcmUiLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygiWGNlcHRpb24yIiwgImlnbm9yZSIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbjIgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAyMDAyIHx8IGV4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcIk9LXCIpIik7CisgICAgICAgICAgICAgICAgaWYgKCJPSyIgIT0gKGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygic3VjY2VzcyIsICJPSyIsIHRva2VuKSkuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RPbmV3YXlBc3luYygxLCB0b2tlbik7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7MH0gbXMgYSB0ZXN0Vm9pZCgpIGNhbGwiLCBzdy5FbGFwc2VkTWlsbGlzZWNvbmRzIC8gdGltZXMpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0gYi90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2ZmZiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK3ByZWNyb3NzOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgQ2xpZW50L2JpbgorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBDbGllbnQvb2JqCisJJChSTSkgLXIgU2VydmVyL29iagorCSQoUk0pIC1yIFRocmlmdFRlc3QvVGhyaWZ0VGVzdAorCitFWFRSQV9ESVNUID0gXAorCUNsaWVudCBcCisJUkVBRE1FLm1kIFwKKwlTZXJ2ZXIgXAorCVRocmlmdFRlc3Quc2xuIFwKKwlidWlsZC5jbWQgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvUkVBRE1FLm1kIGIvdGVzdC9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDcyOGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1JFQURNRS5tZApAQCAtMCwwICsxLDIwIEBACisjIEFwYWNoZSBUaHJpZnQgbmV0LWNvcmUtbGliIHRlc3RzCisKK1Rlc3RzIGZvciBUaHJpZnQgY2xpZW50IGxpYnJhcnkgcG9ydGVkIHRvIE1pY3Jvc29mdCAuTmV0IENvcmUgCisKKyMgQ29udGVudAorLSBUaHJpZnRUZXN0IC0gdGVzdHMgZm9yIFRocmlmdCBsaWJyYXJ5IAorCisjIFJldXNlZCBjb21wb25lbnRzIAorLSBORVQgQ29yZSBTdGFuZGFyZCAxLjYgKFNESyAyLjAuMCkKKworIyBIb3cgdG8gYnVpbGQgb24gV2luZG93cworLSBHZXQgVGhyaWZ0IElETCBjb21waWxlciBleGVjdXRhYmxlLCBhZGQgdG8gc29tZSBmb2xkZXIgYW5kIGFkZCBwYXRoIHRvIHRoaXMgZm9sZGVyIGludG8gUEFUSCB2YXJpYWJsZQorLSBPcGVuIFRocmlmdFRlc3Quc2xuIGluIFZpc3VhbCBTdHVkaW8gYW5kIGJ1aWxkCitvciAKKy0gQnVpbGQgd2l0aCBzY3JpcHRzCisKKyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgQ29yZSAyLjAuMCBTREsgaW5zdGFsbGVkIG9yIHVzZSB0aGUgVWJ1bnR1IFhlbmlhbCBkb2NrZXIgaW1hZ2UKKy0gRm9sbG93IGNvbW1vbiBidWlsZCBwcmFjdGljZSBmb3IgVGhyaWZ0OiBib290c3RyYXAsIGNvbmZpZ3VyZSwgYW5kIG1ha2UgcHJlY3Jvc3MKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL1NlcnZlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQ3ZTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBTZXJ2ZXIKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgInNlcnZlciI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFNlcnZlciAgc2VydmVyICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBTZXJ2ZXIgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBUZXN0U2VydmVyLlByaW50T3B0aW9uc0hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU0OTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJTZXJ2ZXIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiQjBDMTNEQTAtMzExNy00ODQ0LThBRTgtQjE3NzVFNDYyMjNEIildCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjliNGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+U2VydmVyPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJnF1b3Q7JChQYXRoVG9UaHJpZnQpJnF1b3Q7IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkMzMzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvVGVzdFNlcnZlci5jcwpAQCAtMCwwICsxLDU5NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUaHJpZnRUZXN0Cit7CisgICAgaW50ZXJuYWwgY2xhc3MgU2VydmVyUGFyYW0KKyAgICB7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlRnJhbWVkID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlRW5jcnlwdGlvbiA9IGZhbHNlOworICAgICAgICBpbnRlcm5hbCBib29sIGNvbXBhY3QgPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCBqc29uID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIHBpcGUgPSBudWxsOworCisgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcGlwZT0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VGcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWJpbmFyeSIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1iaW5hcnkiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBuZWVkZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGFjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZGVkIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZGVkIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRwb29sIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZHBvb2wiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXByb3RvdHlwZSIgfHwgYXJnc1tpXSA9PSAiLS1wcm9jZXNzb3I9cHJvdG90eXBlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IF9jbGllbnRJRCA9IC0xOworICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBUZXN0TG9nRGVsZWdhdGUoc3RyaW5nIG1zZywgcGFyYW1zIG9iamVjdFtdIHZhbHVlcyk7CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15U2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNhbGxDb3VudCA9IDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIFByZVNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8b2JqZWN0PiBDcmVhdGVDb250ZXh0QXN5bmMoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0PG9iamVjdD4obnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIERlbGV0ZUNvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayBQcm9jZXNzQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlckFzeW5jIDogVGhyaWZ0VGVzdC5JQXN5bmMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRCYXNlU2VydmVyIHNlcnZlciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwcml2YXRlIGludCBoYW5kbGVySUQ7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgcHJpdmF0ZSBUZXN0TG9nRGVsZWdhdGUgbG9nZ2VyOworCisgICAgICAgICAgICBwdWJsaWMgVGVzdEhhbmRsZXJBc3luYygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlcklEID0gSW50ZXJsb2NrZWQuSW5jcmVtZW50KHJlZiBfY2xpZW50SUQpOworICAgICAgICAgICAgICAgIGxvZ2dlciArPSB0ZXN0Q29uc29sZUxvZ2dlcjsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJOZXcgVGVzdEhhbmRsZXIgaW5zdGFuY2UgY3JlYXRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZUxvZ2dlcihzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJoYW5kbGVyezA6RDN9OiIsIGhhbmRsZXJJRCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KG1zZywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgdGVzdFZvaWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8c3RyaW5nPiB0ZXN0U3RyaW5nQXN5bmMoc3RyaW5nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0U3RyaW5nKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGJvb2w+IHRlc3RCb29sQXN5bmMoYm9vbCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEJvb2woezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8c2J5dGU+IHRlc3RCeXRlQXN5bmMoc2J5dGUgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RCeXRlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGludD4gdGVzdEkzMkFzeW5jKGludCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEkzMih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxsb25nPiB0ZXN0STY0QXN5bmMobG9uZyB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEk2NCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxkb3VibGU+IHRlc3REb3VibGVBc3luYyhkb3VibGUgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3REb3VibGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8Ynl0ZVtdPiB0ZXN0QmluYXJ5QXN5bmMoYnl0ZVtdIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaGV4ID0gQml0Q29udmVydGVyLlRvU3RyaW5nKHRoaW5nKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0QmluYXJ5KHswOlh9KSIsIGhleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdFN0cnVjdEFzeW5jKFh0cnVjdCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFN0cnVjdCh7e1wiezB9XCIsIHsxfSwgezJ9LCB7M319fSkiLCB0aGluZy5TdHJpbmdfdGhpbmcsIHRoaW5nLkJ5dGVfdGhpbmcsIHRoaW5nLkkzMl90aGluZywgdGhpbmcuSTY0X3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0Mj4gdGVzdE5lc3RBc3luYyhYdHJ1Y3QyIG5lc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0aGluZyA9IG5lc3QuU3RydWN0X3RoaW5nOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3ROZXN0KHt7ezB9LCB7e1wiezF9XCIsIHsyfSwgezN9LCB7NH0sIHs1fX19fX0pIiwKKyAgICAgICAgICAgICAgICAgICAgbmVzdC5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5TdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICBuZXN0LkkzMl90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxpbnQsIGludD4+IHRlc3RNYXBBc3luYyhEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RNYXAoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSA9PiB7MX0iLCBrZXksIHRoaW5nW2tleV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+PiB0ZXN0U3RyaW5nTWFwQXN5bmMoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0U3RyaW5nTWFwKHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIHRoaW5nLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxUSGFzaFNldDxpbnQ+PiB0ZXN0U2V0QXN5bmMoVEhhc2hTZXQ8aW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RTZXQoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8TGlzdDxpbnQ+PiB0ZXN0TGlzdEFzeW5jKExpc3Q8aW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RMaXN0KHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSIsIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPE51bWJlcno+IHRlc3RFbnVtQXN5bmMoTnVtYmVyeiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEVudW0oezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8bG9uZz4gdGVzdFR5cGVkZWZBc3luYyhsb25nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0VHlwZWRlZih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+PiB0ZXN0TWFwTWFwQXN5bmMoaW50IGhlbGxvLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TWFwTWFwKHswfSkiLCBoZWxsbyk7CisgICAgICAgICAgICAgICAgdmFyIG1hcG1hcCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7CisKKyAgICAgICAgICAgICAgICB2YXIgcG9zID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICAgICAgdmFyIG5lZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zW2ldID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbmVnWy1pXSA9IC1pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICAgICAgICAgICAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChtYXBtYXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+Pj4gdGVzdEluc2FuaXR5QXN5bmMoSW5zYW5pdHkgYXJndW1lbnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgICAgICAgICAvKiogZnJvbSBUaHJpZnRUZXN0LnRocmlmdDoKKyAgICAgICAgICAgICAgICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgICAgICAgICAgICAgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICogICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgICAgICAgICAgICAgICogICB9CisgICAgICAgICAgICAgICAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7CisgICAgICAgICAgICAgICAgdmFyIHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOworCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBuZXcgSW5zYW5pdHkoKTsKKworICAgICAgICAgICAgICAgIHZhciBpbnNhbmUgPSBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFsxXSA9IGZpcnN0X21hcCwKKyAgICAgICAgICAgICAgICAgICAgWzJdID0gc2Vjb25kX21hcAorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KGluc2FuZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdE11bHRpQXN5bmMoc2J5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TXVsdGkoKSIpOworCisgICAgICAgICAgICAgICAgdmFyIGhlbGxvID0gbmV3IFh0cnVjdCgpOyA7CisgICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IGFyZzA7CisgICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gYXJnMTsKKyAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSBhcmcyOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQoaGVsbG8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayB0ZXN0RXhjZXB0aW9uQXN5bmMoc3RyaW5nIGFyZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEV4Y2VwdGlvbih7MH0pIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9IGFyZworICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJURXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TXVsdGlFeGNlcHRpb24oezB9LCB7MX0pIiwgYXJnMCwgYXJnMSk7CisgICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbjIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0gMjAwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QgeyBTdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFh0cnVjdCB7IFN0cmluZ190aGluZyA9IGFyZzEgfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIHRlc3RPbmV3YXlBc3luYyhpbnQgc2Vjb25kc1RvU2xlZXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RPbmV3YXkoezB9KSwgc2xlZXBpbmcuLi4iLCBzZWNvbmRzVG9TbGVlcCk7CisgICAgICAgICAgICAgICAgVGFzay5EZWxheShzZWNvbmRzVG9TbGVlcCAqIDEwMDAsIGNhbmNlbGxhdGlvblRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIFByaW50T3B0aW9uc0hlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2VydmVyIG9wdGlvbnM6Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBpcGU9PHBpcGUgbmFtZT4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcG9ydD08cG9ydCBudW1iZXI+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXRyYW5zcG9ydD08dHJhbnNwb3J0IG5hbWU+ICAgIG9uZSBvZiBidWZmZXJlZCxmcmFtZWQgIChkZWZhdWx0cyB0byBub25lKSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wcm90b2NvbD08cHJvdG9jb2wgbmFtZT4gICAgICBvbmUgb2YgY29tcGFjdCxqc29uICAoZGVmYXVsdHMgdG8gYmluYXJ5KSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1zZXJ2ZXItdHlwZT08dHlwZT4gICAgICAgICAgICBvbmUgb2YgdGhyZWFkZWQsdGhyZWFkcG9vbCAgKGRlZmF1bHRzIHRvIHNpbXBsZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvY2Vzc29yPTxwcm90b3R5cGU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXNzbCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0U2VydmVyQ2VydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJDZXJ0TmFtZSA9ICJzZXJ2ZXIucDEyIjsKKyAgICAgICAgICAgIHZhciBwb3NzaWJsZVBhdGhzID0gbmV3IExpc3Q8c3RyaW5nPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgIi4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAiLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzdHJpbmcgZXhpc3RpbmdQYXRoID0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IFBhdGguR2V0RnVsbFBhdGgocG9zc2libGVQYXRoICsgc2VydmVyQ2VydE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigkIkNhbm5vdCBmaW5kIGZpbGU6IHtzZXJ2ZXJDZXJ0TmFtZX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihleGlzdGluZ1BhdGgsICJ0aHJpZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGNlcnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBFeGVjdXRlKExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG9nZ2VyRmFjdG9yeSA9IG5ldyBMb2dnZXJGYWN0b3J5KCk7Ly8uQWRkQ29uc29sZSgpLkFkZERlYnVnKCk7CisgICAgICAgICAgICB2YXIgbG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5DcmVhdGVMb2dnZXIoIlRlc3QiKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFNlcnZlclBhcmFtKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLlBhcnNlKGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSAgcGFyc2luZyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBUcmFuc3BvcnQKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHRyYW5zOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5waXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHBhcmFtLnBpcGUpOworICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLnVzZUZyYW1lZCkKKy8vICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KHBhcmFtLnBvcnQpOworLy8gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS51c2VFbmNyeXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldFNlcnZlckNlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnQgPT0gbnVsbCB8fCAhY2VydC5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydChwYXJhbS5wb3J0LCBwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMsIHBhcmFtLnVzZUZyYW1lZCwgY2VydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmRlciwgY2VydGlmaWNhdGUsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMgfCBTc2xQcm90b2NvbHMuVGxzMTEgfCBTc2xQcm90b2NvbHMuVGxzMTIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChwYXJhbS5wb3J0LCAwLCBwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMsIHBhcmFtLnVzZUZyYW1lZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBwcm90bzsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0uY29tcGFjdCkKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0uanNvbikKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgSVRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisKKyAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgICAgICAgICAgICB2YXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXJBc3luYygpOworICAgICAgICAgICAgICAgIHZhciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuQXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXIpOworICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkodGVzdFByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsgCisKKyAgICAgICAgICAgICAgICBUQmFzZVNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBuZXcgQXN5bmNCYXNlU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHRyYW5zRmFjdG9yeSwgcHJvdG8sIHByb3RvLCBsb2dnZXIpOworCisgICAgICAgICAgICAgICAgLy9TZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgICAgICAgICAgICAgIHZhciBzZXJ2ZXJFdmVudHMgPSBuZXcgTXlTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisKKyAgICAgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgICAgICB2YXIgd2hlcmUgPSAoISBzdHJpbmcuSXNOdWxsT3JFbXB0eShwYXJhbS5waXBlKSkgPyAib24gcGlwZSAiICsgcGFyYW0ucGlwZSA6ICJvbiBwb3J0ICIgKyBwYXJhbS5wb3J0OworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgQXN5bmNCYXNlU2VydmVyICIgKyB3aGVyZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIHByb2Nlc3NvciBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSBwcm90b3R5cGUgZmFjdG9yeSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0udXNlQnVmZmVyZWRTb2NrZXRzID8gIiB3aXRoIGJ1ZmZlcmVkIHNvY2tldCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VFbmNyeXB0aW9uID8gIiB3aXRoIGVuY3J5cHRpb24iIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0uY29tcGFjdCA/ICIgd2l0aCBjb21wYWN0IHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLmpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi4iKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGUoeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4gYi90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9UaHJpZnRUZXN0LnNsbgpAQCAtMCwwICsxLDY0IEBACivvu79NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjczMC4xMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAiezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0gezUyQ0U5QTEyLUY2Q0ItNEYwQy1CQjQyLTAxMDU2MTJGNUZGNH0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjUgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCisKKzplb2YKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5zaCBiL3Rlc3QvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTdlMzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCitzZXQgLWUKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCmRpZmYgLS1naXQgYS90ZXN0L29jYW1sL3NlcnZlci9UZXN0U2VydmVyLm1sIGIvdGVzdC9vY2FtbC9zZXJ2ZXIvVGVzdFNlcnZlci5tbAppbmRleCAzZjVjOWVlLi5lZmUwZjRiIDEwMDY0NAotLS0gYS90ZXN0L29jYW1sL3NlcnZlci9UZXN0U2VydmVyLm1sCisrKyBiL3Rlc3Qvb2NhbWwvc2VydmVyL1Rlc3RTZXJ2ZXIubWwKQEAgLTM2LDYgKzM2LDcgQEAKICAgbWV0aG9kIHRlc3RJMzIgeCA9IHAgInRlc3RJMzIoJWQpXG4iIChzb2QgeCk7IChzb2QgeCkKICAgbWV0aG9kIHRlc3RJNjQgeCA9IHAgInRlc3RJNjQoJXMpXG4iIChJbnQ2NC50b19zdHJpbmcgKHNvZCB4KSk7IChzb2QgeCkKICAgbWV0aG9kIHRlc3REb3VibGUgeCA9IHAgInRlc3REb3VibGUoJWYpXG4iIChzb2QgeCk7IChzb2QgeCkKKyAgbWV0aG9kIHRlc3RCaW5hcnkgeCA9IHAgInRlc3RCaW5hcnkoJXMpXG4iIChzb2QgeCk7IChzb2QgeCkKICAgbWV0aG9kIHRlc3RTdHJ1Y3QgeCA9IHAgInRlc3RTdHJ1Y3QoLS0tKVxuIjsgKHNvZCB4KQogICBtZXRob2QgdGVzdE5lc3QgeCA9IHAgInRlc3ROZXN0KC0tLSlcbiI7IChzb2QgeCkKICAgbWV0aG9kIHRlc3RNYXAgeCA9IHAgInRlc3RNYXAoLS0tKVxuIjsgKHNvZCB4KQpkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL01ha2VmaWxlIGIvdGVzdC9wZXJsL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQ4MWQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvcGVybC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIERlZmF1bHQgdGFyZ2V0IGlzIGV2ZXJ5dGhpbmcKLXRhcmdldDogYWxsCi0KLSMgVG9vbHMKLVRIUklGVCA9IC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotYWxsOiAuLi9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBwZXJsIC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0KLWNsZWFuOgotCSQoUk0pIC1yIGdlbi1wZXJsCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvTWFrZWZpbGUuYW0gYi90ZXN0L3BlcmwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1YjlhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGVybC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHBlcmwgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHJlY3Jvc3M6IHN0dWJzCisKK2NoZWNrOiBzdHVicworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tcGVybAorCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvVGVzdENsaWVudC5wbCBiL3Rlc3QvcGVybC9UZXN0Q2xpZW50LnBsCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYWY4MGQ0Ni4uOTZlM2JlYwotLS0gYS90ZXN0L3BlcmwvVGVzdENsaWVudC5wbAorKysgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbApAQCAtMTksMTAgKzE5LDExIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiB1c2UgRGF0YTo6RHVtcGVyOwordXNlIEdldG9wdDo6TG9uZyBxdyhHZXRPcHRpb25zKTsKIHVzZSBUaW1lOjpIaVJlcyBxdyhnZXR0aW1lb2ZkYXkpOwogCiB1c2UgbGliICcuLi8uLi9saWIvcGVybC9saWInOwpAQCAtMzAsMTA0ICszMSwyMjcgQEAKIAogdXNlIFRocmlmdDsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwotdXNlIFRocmlmdDo6U29ja2V0OwogdXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwordXNlIFRocmlmdDo6U1NMU29ja2V0OwordXNlIFRocmlmdDo6U29ja2V0OwordXNlIFRocmlmdDo6VW5peFNvY2tldDsKIAordXNlIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2U7CiB1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKIHVzZSBUaHJpZnRUZXN0OjpUeXBlczsKIAogJHwrKzsKIAotbXkgJGhvc3QgPSAnbG9jYWxob3N0JzsKLW15ICRwb3J0ID0gOTA5MDsKK3N1YiB1c2FnZSB7CisgICAgcHJpbnQgPDwiRU9GIjsKK1VzYWdlOiAkMCBbT1BUSU9OU10KIAorT3B0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0KQorICAtLWNhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQSB0byB2YWxpZGF0ZSBzZXJ2ZXIgd2l0aC4KKyAgLS1jZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgdG8gdXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4KKyAgLS1jaXBoZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0YWJsZSBjaXBoZXIgbGlzdC4KKyAgLS1kb21haW4tc29ja2V0IDxmaWxlPiAgICAgICAgICAgICAgICAgICAgICAgVXNlIGEgdW5peCBkb21haW4gc29ja2V0LgorICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IHVzYWdlLgorICAtLWtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBrZXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLXBvcnQgPHBvcnRudW0+ICAgICAgICAgICAgICAgIDkwOTAgICAgICAgICBQb3J0IHRvIHVzZS4KKyAgLS1wcm90b2NvbCB7YmluYXJ5fSAgICAgICAgICAgICBiaW5hcnkgICAgICAgUHJvdG9jb2wgdG8gdXNlLgorICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcmVzZW50LCB1c2UgU1NMLgorICAtLXRyYW5zcG9ydCB7YnVmZmVyZWR8ZnJhbWVkfSAgIGJ1ZmZlcmVkICAgICBUcmFuc3BvcnQgdG8gdXNlLgogCi1teSAkc29ja2V0ID0gbmV3IFRocmlmdDo6U29ja2V0KCRob3N0LCAkcG9ydCk7CitFT0YKK30KIAotbXkgJGJ1ZmZlcmVkU29ja2V0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwgMTAyNCwgMTAyNCk7Ci1teSAkdHJhbnNwb3J0ID0gJGJ1ZmZlcmVkU29ja2V0OwotbXkgJHByb3RvY29sID0gbmV3IFRocmlmdDo6QmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci1teSAkdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0Q2xpZW50KCRwcm90b2NvbCk7CitteSAlb3B0cyA9ICgKKyAgICAncG9ydCcgPT4gOTA5MCwKKyAgICAncHJvdG9jb2wnID0+ICdiaW5hcnknLAorICAgICd0cmFuc3BvcnQnID0+ICdidWZmZXJlZCcKKyk7CiAKLWV2YWx7Ci0kdHJhbnNwb3J0LT5vcGVuKCk7Ci19OyBpZigkQCl7CitHZXRPcHRpb25zKFwlb3B0cywgcXcgKAorICAgIGNhPXMKKyAgICBjZXJ0PXMKKyAgICBjaXBoZXJzPXMKKyAgICBrZXk9cworICAgIGRvbWFpbi1zb2NrZXQ9cworICAgIGhlbHAKKyAgICBob3N0PXMKKyAgICBwb3J0PWkKKyAgICBwcm90b2NvbD1zCisgICAgc3NsCisgICAgdHJhbnNwb3J0PXMKKykpIHx8IGV4aXQgMTsKKworaWYgKCRvcHRze2hlbHB9KSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDA7Cit9CisKK215ICRzb2NrZXQgPSB1bmRlZjsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgJHNvY2tldCA9IFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCRvcHRzeydkb21haW4tc29ja2V0J30pOworfQorZWxzaWYgKCRvcHRze3NzbH0pIHsKKyAgJHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0LT5uZXcoXCVvcHRzKTsKK30KK2Vsc2UgeworICAkc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQtPm5ldygkb3B0c3tob3N0fSwgJG9wdHN7cG9ydH0pOworfQorCitteSAkdHJhbnNwb3J0OworaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2J1ZmZlcmVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0LT5uZXcoJHNvY2tldCwgMTAyNCwgMTAyNCk7Cit9CitlbHNpZiAoJG9wdHN7dHJhbnNwb3J0fSBlcSAnZnJhbWVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKK215ICRwcm90b2NvbDsKK215ICRwcm90b2NvbDI7CitpZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknIHx8ICRvcHRze3Byb3RvY29sfSBlcSAnbXVsdGknKSB7CisgICAgJHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCR0cmFuc3BvcnQpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKK215ICRzZWNvbmRTZXJ2aWNlID0gdW5kZWY7CitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgICRwcm90b2NvbDIgICAgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoJHByb3RvY29sLCAnU2Vjb25kU2VydmljZScpOworICAkcHJvdG9jb2wgICAgICA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbC0+bmV3KCRwcm90b2NvbCwgJ1RocmlmdFRlc3QnKTsKKyAgJHNlY29uZFNlcnZpY2UgPSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlQ2xpZW50LT5uZXcoJHByb3RvY29sMik7Cit9CisKK215ICR0ZXN0Q2xpZW50ID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdENsaWVudC0+bmV3KCRwcm90b2NvbCk7CisKK2V2YWwgeworICAkdHJhbnNwb3J0LT5vcGVuKCk7Cit9OworaWYoJEApewogICAgIGRpZShEdW1wZXIoJEApKTsKIH0KKwordXNlIGNvbnN0YW50IEVSUl9CQVNFVFlQRVMgPT4gMTsKK3VzZSBjb25zdGFudCBFUlJfU1RSVUNUUyA9PiAyOwordXNlIGNvbnN0YW50IEVSUl9DT05UQUlORVJTID0+IDQ7Cit1c2UgY29uc3RhbnQgRVJSX0VYQ0VQVElPTlMgPT4gODsKK3VzZSBjb25zdGFudCBFUlJfUFJPVE9DT0wgPT4gMTY7Cit1c2UgY29uc3RhbnQgRVJSX1VOS05PV04gPT4gNjQ7CisKIG15ICRzdGFydCA9IGdldHRpbWVvZmRheSgpOwogCiAjCiAjIFZPSUQgVEVTVAogIwotcHJpbnQoInRlc3RWb2lkKCkiKTsKK3ByaW50KCd0ZXN0Vm9pZCgpJyk7CiAkdGVzdENsaWVudC0+dGVzdFZvaWQoKTsKIHByaW50KCIgPSB2b2lkXG4iKTsKIAogIwogIyBTVFJJTkcgVEVTVAogIwotcHJpbnQoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7Ci1teSAkcyA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nKCJUZXN0Iik7Ci1wcmludCgiID0gXCIkc1wiXG4iKTsKK3ByaW50KCd0ZXN0U3RyaW5nKCJUZXN0IiknKTsKK215ICRzID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmcoJ1Rlc3QnKTsKK3ByaW50KHFxfCA9ICIkcyJcbnwpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJHMgbmUgJ1Rlc3QnKTsKKworIworIyBNVUxUSVBMRVhFRCBURVNUCisjCitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgICAgcHJpbnQoJ3NlY29uZHRlc3RTdHJpbmcoIlRlc3QyIiknKTsKKyAgICAkcyA9ICRzZWNvbmRTZXJ2aWNlLT5zZWNvbmR0ZXN0U3RyaW5nKCdUZXN0MicpOworICAgIHByaW50KHFxfCA9ICIkcyJcbnwpOworICAgIGV4aXQoRVJSX1BST1RPQ09MKSBpZiAoJHMgbmUgJ3Rlc3RTdHJpbmcoIlRlc3QyIiknKTsKK30KKworIworIyBCT09MIFRFU1QKKyMKK3ByaW50KCd0ZXN0Qm9vbCgxKScpOworbXkgJHQgPSAkdGVzdENsaWVudC0+dGVzdEJvb2woMSk7CitwcmludCgiID0gJHRcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJHQgbmUgMSk7CitwcmludCgndGVzdEJvb2woMCknKTsKK215ICRmID0gJHRlc3RDbGllbnQtPnRlc3RCb29sKDApOworcHJpbnQoIiA9ICRmXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRmIG5lIHF8fCk7CisKIAogIwogIyBCWVRFIFRFU1QKICMKLXByaW50KCJ0ZXN0Qnl0ZSgxKSIpOworcHJpbnQoJ3Rlc3RCeXRlKDEpJyk7CiBteSAkdTggPSAkdGVzdENsaWVudC0+dGVzdEJ5dGUoMSk7CiBwcmludCgiID0gJHU4XG4iKTsKIAogIwogIyBJMzIgVEVTVAogIwotcHJpbnQoInRlc3RJMzIoLTEpIik7CitwcmludCgndGVzdEkzMigtMSknKTsKIG15ICRpMzIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigtMSk7CiBwcmludCgiID0gJGkzMlxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkaTMyIG5lIC0xKTsKIAogIwotI0k2NCBURVNUCisjIEk2NCBURVNUCiAjCi1wcmludCgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CitwcmludCgndGVzdEk2NCgtMzQzNTk3MzgzNjgpJyk7CiBteSAkaTY0ID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKIHByaW50KCIgPSAkaTY0XG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRpNjQgbmUgLTM0MzU5NzM4MzY4KTsKIAogIwogIyBET1VCTEUgVEVTVAogIwotcHJpbnQoInRlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpIik7CitwcmludCgndGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCknKTsKIG15ICRkdWIgPSAkdGVzdENsaWVudC0+dGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCk7CiBwcmludCgiID0gJGR1YlxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkZHViIG5lIC04NTIuMjM0MjM0MjM0KTsKKworIworIyBCSU5BUlkgVEVTVCAgIC0tLSAgVE9ETworIworCiAKICMKICMgU1RSVUNUIFRFU1QKICMKLXByaW50KCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKLW15ICRvdXQgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kb3V0LT5zdHJpbmdfdGhpbmcoIlplcm8iKTsKK3ByaW50KCd0ZXN0U3RydWN0KHsiWmVybyIsIDEsIC0zLCAtNX0pJyk7CitteSAkb3V0ID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyRvdXQtPnN0cmluZ190aGluZygnWmVybycpOwogJG91dC0+Ynl0ZV90aGluZygxKTsKICRvdXQtPmkzMl90aGluZygtMyk7CiAkb3V0LT5pNjRfdGhpbmcoLTUpOwogbXkgJGluID0gJHRlc3RDbGllbnQtPnRlc3RTdHJ1Y3QoJG91dCk7Ci1wcmludCgiID0ge1wiIi4kaW4tPnN0cmluZ190aGluZy4iXCIsICIuCi0gICAgICAgICRpbi0+Ynl0ZV90aGluZy4iLCAiLgotICAgICAgICAkaW4tPmkzMl90aGluZy4iLCAiLgorcHJpbnQoJyA9IHsiJy4kaW4tPnN0cmluZ190aGluZy4nIiwgJy4KKyAgICAgICAgJGluLT5ieXRlX3RoaW5nLicsICcuCisgICAgICAgICRpbi0+aTMyX3RoaW5nLicsICcuCiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9XG4iKTsKIAogIwogIyBORVNURUQgU1RSVUNUIFRFU1QKICMKLXByaW50KCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSIpOwotbXkgJG91dDIgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0MigpOworcHJpbnQoJ3Rlc3ROZXN0KHsxLCB7Ilplcm8iLCAxLCAtMywgLTV9LCA1fScpOworbXkgJG91dDIgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QyLT5uZXcoKTsKICRvdXQyLT5ieXRlX3RoaW5nKDEpOwogJG91dDItPnN0cnVjdF90aGluZygkb3V0KTsKICRvdXQyLT5pMzJfdGhpbmcoNSk7CiBteSAkaW4yID0gJHRlc3RDbGllbnQtPnRlc3ROZXN0KCRvdXQyKTsKICRpbiA9ICRpbjItPnN0cnVjdF90aGluZzsKLXByaW50KCIgPSB7Ii4kaW4yLT5ieXRlX3RoaW5nLiIsIHtcIiIuCi0gICAgICAkaW4tPnN0cmluZ190aGluZy4iXCIsICIuCi0gICAgICAkaW4tPmJ5dGVfdGhpbmcuIiwgIi4KLSAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCi0gICAgICAkaW4tPmk2NF90aGluZy4ifSwgIi4KK3ByaW50KCcgPSB7Jy4kaW4yLT5ieXRlX3RoaW5nLicsIHsiJy4KKyAgICAgICRpbi0+c3RyaW5nX3RoaW5nLiciLCAnLgorICAgICAgJGluLT5ieXRlX3RoaW5nLicsICcuCisgICAgICAkaW4tPmkzMl90aGluZy4nLCAnLgorICAgICAgJGluLT5pNjRfdGhpbmcuJ30sICcuCiAgICAgICAkaW4yLT5pMzJfdGhpbmcuIn1cbiIpOwogCiAjCkBAIC0xMzcsMjggKzI2MSwzMCBAQAogZm9yIChteSAkaSA9IDA7ICRpIDwgNTsgKyskaSkgewogICAkbWFwb3V0LT57JGl9ID0gJGktMTA7CiB9Ci1wcmludCgidGVzdE1hcCh7Iik7CitwcmludCgndGVzdE1hcCh7Jyk7CiBteSAkZmlyc3QgPSAxOwogd2hpbGUoIG15KCRrZXksJHZhbCkgPSBlYWNoICUkbWFwb3V0KSB7CiAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICAkZmlyc3QgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50KCIsICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnQoJywgJyk7CiAgICAgfQogICAgIHByaW50KCIka2V5ID0+ICR2YWwiKTsKIH0KLXByaW50KCJ9KSIpOworcHJpbnQoJ30pJyk7CiAKIAogbXkgJG1hcGluID0gJHRlc3RDbGllbnQtPnRlc3RNYXAoJG1hcG91dCk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIAogJGZpcnN0ID0gMTsKIHdoaWxlKCBteSgka2V5LCR2YWwpID0gZWFjaCAlJG1hcGluKXsKICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICRmaXJzdCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnQoIiwgIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCgnLCAnKTsKICAgICB9CiAgICAgcHJpbnQoIiRrZXkgPT4gJHZhbCIpOwogfQpAQCAtMTcyLDExICsyOTgsMTEgQEAKICAgICBwdXNoKEAkc2V0b3V0LCAkaSk7CiB9CiAKLXByaW50KCJ0ZXN0U2V0KHsiLmpvaW4oIiwiLEAkc2V0b3V0KS4ifSkiKTsKK3ByaW50KCd0ZXN0U2V0KHsnLmpvaW4oJywnLEAkc2V0b3V0KS4nfSknKTsKIAogbXkgJHNldGluID0gJHRlc3RDbGllbnQtPnRlc3RTZXQoJHNldG91dCk7CiAKLXByaW50KCIgPSB7Ii5qb2luKCIsIixAJHNldG91dCkuIn1cbiIpOworcHJpbnQoJyA9IHsnLmpvaW4oJywnLEAkc2V0b3V0KS4ifVxuIik7CiAKICMKICMgTElTVCBURVNUCkBAIC0xODYsMTA1ICszMTIsMTExIEBACiAgICAgcHVzaChAJGxpc3RvdXQsICRpKTsKIH0KIAotcHJpbnQoInRlc3RMaXN0KHsiLmpvaW4oIiwiLEAkbGlzdG91dCkuIn0pIik7CitwcmludCgndGVzdExpc3Qoeycuam9pbignLCcsQCRsaXN0b3V0KS4nfSknKTsKIAogbXkgJGxpc3RpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0TGlzdCgkbGlzdG91dCk7CiAKLXByaW50KCIgPSB7Ii5qb2luKCIsIixAJGxpc3RpbikuIn1cbiIpOworcHJpbnQoJyA9IHsnLmpvaW4oJywnLEAkbGlzdGluKS4ifVxuIik7CiAKICMKICMgRU5VTSBURVNUCiAjCi1wcmludCgidGVzdEVudW0oT05FKSIpOworcHJpbnQoJ3Rlc3RFbnVtKE9ORSknKTsKIG15ICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6T05FKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKFRXTykiKTsKK3ByaW50KCd0ZXN0RW51bShUV08pJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShUSFJFRSkiKTsKK3ByaW50KCd0ZXN0RW51bShUSFJFRSknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6VEhSRUUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oRklWRSkiKTsKK3ByaW50KCd0ZXN0RW51bShGSVZFKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpGSVZFKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKEVJR0hUKSIpOworcHJpbnQoJ3Rlc3RFbnVtKEVJR0hUKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpFSUdIVCk7CiBwcmludCgiID0gJHJldFxuIik7CiAKICMKICMgVFlQRURFRiBURVNUCiAjCi1wcmludCgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworcHJpbnQoJ3Rlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyknKTsKIG15ICR1aWQgPSAkdGVzdENsaWVudC0+dGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKTsKIHByaW50KCIgPSAkdWlkXG4iKTsKIAogIwogIyBORVNURUQgTUFQIFRFU1QKICMKLXByaW50KCJ0ZXN0TWFwTWFwKDEpIik7CitwcmludCgndGVzdE1hcE1hcCgxKScpOwogbXkgJG1tID0gJHRlc3RDbGllbnQtPnRlc3RNYXBNYXAoMSk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIHdoaWxlKCBteSAoJGtleSwkdmFsKSA9IGVhY2ggJSRtbSkgewogICAgIHByaW50KCIka2V5ID0+IHsiKTsKICAgICB3aGlsZSggbXkoJGsyLCR2MikgPSBlYWNoICUkdmFsKSB7CiAgICAgICAgIHByaW50KCIkazIgPT4gJHYyLCAiKTsKICAgICB9Ci0gICAgcHJpbnQoIn0sICIpOworICAgIHByaW50KCd9LCAnKTsKIH0KIHByaW50KCJ9XG4iKTsKIAogIwogIyBJTlNBTklUWSBURVNUCiAjCi1teSAkaW5zYW5lID0gbmV3IFRocmlmdFRlc3Q6Okluc2FuaXR5KCk7CitteSAkaW5zYW5lID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldygpOwogJGluc2FuZS0+e3VzZXJNYXB9LT57VGhyaWZ0VGVzdDo6TnVtYmVyejo6RklWRX0gPSA1MDAwOwotbXkgJHRydWNrID0gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdCgpOwotJHRydWNrLT5zdHJpbmdfdGhpbmcoIlRydWNrIik7Ci0kdHJ1Y2stPmJ5dGVfdGhpbmcoOCk7Ci0kdHJ1Y2stPmkzMl90aGluZyg4KTsKLSR0cnVjay0+aTY0X3RoaW5nKDgpOworbXkgJHRydWNrID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyR0cnVjay0+c3RyaW5nX3RoaW5nKCdIZWxsbzInKTsKKyR0cnVjay0+Ynl0ZV90aGluZygyKTsKKyR0cnVjay0+aTMyX3RoaW5nKDIpOworJHRydWNrLT5pNjRfdGhpbmcoMik7CitteSAkdHJ1Y2syID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyR0cnVjazItPnN0cmluZ190aGluZygnR29vZGJ5ZTQnKTsKKyR0cnVjazItPmJ5dGVfdGhpbmcoNCk7CiskdHJ1Y2syLT5pMzJfdGhpbmcoNCk7CiskdHJ1Y2syLT5pNjRfdGhpbmcoNCk7CiBwdXNoKEB7JGluc2FuZS0+e3h0cnVjdHN9fSwgJHRydWNrKTsKK3B1c2goQHskaW5zYW5lLT57eHRydWN0c319LCAkdHJ1Y2syKTsKIAotcHJpbnQoInRlc3RJbnNhbml0eSgpIik7CitwcmludCgndGVzdEluc2FuaXR5KCknKTsKIG15ICR3aG9hID0gJHRlc3RDbGllbnQtPnRlc3RJbnNhbml0eSgkaW5zYW5lKTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogd2hpbGUoIG15ICgka2V5LCR2YWwpID0gZWFjaCAlJHdob2EpIHsKICAgICBwcmludCgiJGtleSA9PiB7Iik7CiAgICAgd2hpbGUoIG15KCRrMiwkdjIpID0gZWFjaCAlJHZhbCkgewogICAgICAgICBwcmludCgiJGsyID0+IHsiKTsKICAgICAgICAgbXkgJHVzZXJNYXAgPSAkdjItPnt1c2VyTWFwfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkdXNlck1hcCkgZXEgIkhBU0giKSB7CisgICAgICAgIHByaW50KCd7Jyk7CisgICAgICAgIGlmIChyZWYoJHVzZXJNYXApIGVxICdIQVNIJykgewogICAgICAgICAgICAgd2hpbGUoIG15KCRrMywkdjMpID0gZWFjaCAlJHVzZXJNYXApIHsKICAgICAgICAgICAgICAgICBwcmludCgiJGszID0+ICR2MywgIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAKICAgICAgICAgbXkgJHh0cnVjdHMgPSAkdjItPnt4dHJ1Y3RzfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkeHRydWN0cykgZXEgIkFSUkFZIikgeworICAgICAgICBwcmludCgneycpOworICAgICAgICBpZiAocmVmKCR4dHJ1Y3RzKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICBmb3JlYWNoIG15ICR4IChAJHh0cnVjdHMpIHsKLSAgICAgICAgICAgICAgICBwcmludCgie1wiIi4keC0+e3N0cmluZ190aGluZ30uIlwiLCAiLgotICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uIiwgIi4keC0+e2kzMl90aGluZ30uIiwgIi4keC0+e2k2NF90aGluZ30uIn0sICIpOworICAgICAgICAgICAgICAgIHByaW50KCd7IicuJHgtPntzdHJpbmdfdGhpbmd9LiciLCAnLgorICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uJywgJy4keC0+e2kzMl90aGluZ30uJywgJy4keC0+e2k2NF90aGluZ30uJ30sICcpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHByaW50KCJ9Iik7CisgICAgICAgIHByaW50KCd9Jyk7CiAKLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAgICAgfQotICAgIHByaW50KCJ9LCAiKTsKKyAgICBwcmludCgnfSwgJyk7CiB9CiBwcmludCgifVxuIik7CiAKICMKICMgRVhDRVBUSU9OIFRFU1QKICMKLXByaW50KCJ0ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpIik7CitwcmludChxfHRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyl8KTsKIGV2YWwgewogICAgICR0ZXN0Q2xpZW50LT50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOwogICAgIHByaW50KCIgIHZvaWRcbkZBSUxVUkVcbiIpOwpAQCAtMjk3LDcgKzQyOSw3IEBACiAjIE5vcm1hbCB0ZXN0cyBkb25lLgogIwogbXkgJHN0b3AgPSBnZXR0aW1lb2ZkYXkoKTsKLW15ICRlbHAgID0gc3ByaW50ZigiJWQiLDEwMDAqKCRzdG9wIC0gJHN0YXJ0KSwgMCk7CitteSAkZWxwICA9IHNwcmludGYoJyVkJywxMDAwKigkc3RvcCAtICRzdGFydCksIDApOwogcHJpbnQoIlRvdGFsIHRpbWU6ICRlbHAgbXNcbiIpOwogCiAjCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbCBiL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjlhMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbApAQCAtMCwwICsxLDQxMSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgRGF0YTo6RHVtcGVyOwordXNlIEdldG9wdDo6TG9uZyBxdyhHZXRPcHRpb25zKTsKK3VzZSBUaW1lOjpIaVJlcyBxdyhnZXR0aW1lb2ZkYXkpOworCiskU0lHe0lOVH0gPSBcJnNpZ2ludF9oYW5kbGVyOworCit1c2UgbGliICcuLi8uLi9saWIvcGVybC9saWInOwordXNlIGxpYiAnZ2VuLXBlcmwnOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OwordXNlIFRocmlmdDo6U2VydmVyU29ja2V0OwordXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6VW5peFNlcnZlclNvY2tldDsKKwordXNlIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2U7Cit1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKK3VzZSBUaHJpZnRUZXN0OjpUeXBlczsKKworJHwrKzsKKworc3ViIHVzYWdlIHsKKyAgICBwcmludCA8PCJFT0YiOworVXNhZ2U6ICQwIFtPUFRJT05TXQorCitPcHRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQpCisgIC0tY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlIChvcHRpb25hbCkuCisgIC0tY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLWNpcGhlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRhYmxlIGNpcGhlciBsaXN0LgorICAtLWRvbWFpbi1zb2NrZXQgPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSB1bml4IGRvbWFpbiBzb2NrZXQuCisgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgdXNhZ2UuCisgIC0ta2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhdGUga2V5IGZpbGUgZm9yIGNlcnRpZmljYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbCBhbmQgcHJpdmF0ZSBrZXkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGluIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLgorICAtLXBvcnQgPHBvcnRudW0+ICAgICAgICAgICAgICAgIDkwOTAgICAgICAgICBQb3J0IHRvIHVzZS4KKyAgLS1wcm90b2NvbCB7YmluYXJ5fSAgICAgICAgICAgICBiaW5hcnkgICAgICAgUHJvdG9jb2wgdG8gdXNlLgorICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcmVzZW50LCB1c2UgU1NML1RMUy4KKyAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KKworRU9GCit9CisKK215ICVvcHRzID0gKAorICAgICdwb3J0JyA9PiA5MDkwLAorICAgICdwcm90b2NvbCcgPT4gJ2JpbmFyeScsCisgICAgJ3RyYW5zcG9ydCcgPT4gJ2J1ZmZlcmVkJworKTsKKworR2V0T3B0aW9ucyhcJW9wdHMsIHF3ICgKKyAgICBjYT1zCisgICAgY2VydD1zCisgICAgY2lwaGVycz1zCisgICAgZG9tYWluLXNvY2tldD1zCisgICAgaGVscAorICAgIGhvc3Q9cworICAgIGtleT1zCisgICAgcG9ydD1pCisgICAgcHJvdG9jb2w9cworICAgIHNzbAorICAgIHRyYW5zcG9ydD1zCispKSB8fCBleGl0IDE7CisKK2lmICgkb3B0c3toZWxwfSkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAwOworfQorCitpZiAoJG9wdHN7c3NsfSBhbmQgbm90IGRlZmluZWQgJG9wdHN7Y2VydH0pIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworbXkgJGhhbmRsZXIgICAgPSBUaHJpZnRUZXN0SGFuZGxlci0+bmV3KCk7CitteSAkaGFuZGxlcjIgICA9IFNlY29uZFNlcnZpY2VIYW5kbGVyLT5uZXcoKTsKK215ICRwcm9jZXNzb3IgID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdFByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyKTsKK215ICRwcm9jZXNzb3IyID0gVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZVByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyMik7CisKK215ICRzZXJ2ZXJzb2NrZXQ7CitpZiAoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSkgeworICAgIHVubGluaygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSk7Cit9CitlbHNpZiAoJG9wdHN7c3NsfSkgeworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC0+bmV3KFwlb3B0cyk7Cit9CitlbHNlIHsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQtPm5ldyhcJW9wdHMpOworfQorbXkgJHRyYW5zcG9ydDsKK2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdidWZmZXJlZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpOworfQorZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2UgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorbXkgJHByb3RvY29sOworaWYgKCRvcHRze3Byb3RvY29sfSBlcSAnYmluYXJ5JyB8fCAkb3B0c3twcm90b2NvbH0gZXEgJ211bHRpJykgeworICAgICRwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2UgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgIG15ICRuZXdQcm9jZXNzb3IgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yLT5uZXcoJHByb3RvY29sKTsKKyAgJG5ld1Byb2Nlc3Nvci0+ZGVmYXVsdFByb2Nlc3NvcigkcHJvY2Vzc29yKTsKKyAgJG5ld1Byb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoJ1RocmlmdFRlc3QnLCAkcHJvY2Vzc29yKTsKKyAgJG5ld1Byb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoJ1NlY29uZFNlcnZpY2UnLCAkcHJvY2Vzc29yMik7CisgICRwcm9jZXNzb3IgPSAkbmV3UHJvY2Vzc29yOworfQorCitteSAkc3NsdGFnID0gJyc7CitpZiAoJG9wdHN7c3NsfSkgeworICAgICRzc2x0YWcgPSAnKFNTTCknOworfQorbXkgJGxpc3RlbmluZ19vbiA9ICIkb3B0c3twb3J0fSAkc3NsdGFnIjsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgJGxpc3RlbmluZ19vbiA9ICRvcHRzeydkb21haW4tc29ja2V0J307Cit9CitteSAkc2VydmVyID0gVGhyaWZ0OjpTaW1wbGVTZXJ2ZXItPm5ldygkcHJvY2Vzc29yLCAkc2VydmVyc29ja2V0LCAkdHJhbnNwb3J0LCAkcHJvdG9jb2wpOworcHJpbnQgcXF8U3RhcnRpbmcgInNpbXBsZSIgc2VydmVyICgkb3B0c3t0cmFuc3BvcnR9LyRvcHRze3Byb3RvY29sfSkgbGlzdGVuIG9uOiAkbGlzdGVuaW5nX29uXG58OworJHNlcnZlci0+c2VydmUoKTsKK3ByaW50ICJkb25lLlxuIjsKKworc3ViIHNpZ2ludF9oYW5kbGVyIHsKKyAgcHJpbnQgInJlY2VpdmVkIFNJR0lOVCwgc3RvcHBpbmcuLi5cbiI7CisgICRzZXJ2ZXItPnN0b3AoKTsKK30KKworIyMjCisjIyMgVGVzdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyMjIworCitwYWNrYWdlIFRocmlmdFRlc3RIYW5kbGVyOworCit1c2UgYmFzZSBxdyggVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdElmICk7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiB0ZXN0Vm9pZCB7CisgIHByaW50KCJ0ZXN0Vm9pZCgpXG4iKTsKK30KKworc3ViIHRlc3RTdHJpbmcgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RTdHJpbmcoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0Qm9vbCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBteSAkc3RyID0gJHRoaW5nID8gJ3RydWUnIDogJ2ZhbHNlJzsKKyAgcHJpbnQoInRlc3RCb29sKCRzdHIpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RCeXRlIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0Qnl0ZSgkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RJMzIgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RJMzIoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0STY0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0STY0KCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdERvdWJsZSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdERvdWJsZSgkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RCaW5hcnkgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHRoaW5nID0gc2hpZnQ7CisgICAgbXkgQGJ5dGVzID0gc3BsaXQgLy8sICR0aGluZzsKKyAgICBwcmludCAndGVzdEJpbmFyeSgnOworICAgIHByaW50ZiggJyUwMmx4Jywgb3JkICRfICkgZm9yZWFjaCAoQGJ5dGVzKTsKKyAgICBwcmludCAiKVxuIjsKKyAgICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdFN0cnVjdCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludGYocXF8dGVzdFN0cnVjdCh7IiVzIiwgJWQsICVkLCAlbGxkfSlcbnwsCisgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntpMzJfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntpNjRfdGhpbmd9KTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3ROZXN0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJG5lc3QgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gJG5lc3QtPntzdHJ1Y3RfdGhpbmd9OworICBwcmludGYocXF8dGVzdE5lc3QoeyVkLCB7IiVzIiwgJWQsICVkLCAlbGxkfSwgJWR9KVxufCwKKyAgICAgICAgICAgJG5lc3QtPntieXRlX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57c3RyaW5nX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57Ynl0ZV90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2kzMl90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2k2NF90aGluZ30sCisgICAgICAgICAgICRuZXN0LT57aTMyX3RoaW5nfSk7CisgIHJldHVybiAkbmVzdDsKK30KKworc3ViIHRlc3RNYXAgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnRmICJ0ZXN0TWFwKHslc30pXG4iLAorICAgIGpvaW4oICcsICcsCisgICAgICAgICAgbWFwIHsgJF8gLiAnID0+ICcgLiAkdGhpbmctPnskX30gfQorICAgICAgICAgIHNvcnQga2V5cyAlJHRoaW5nCisgICAgKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RTdHJpbmdNYXAgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnRmICJ0ZXN0U3RyaW5nTWFwKHslc30pXG4iLAorICAgIGpvaW4oICcsICcsCisgICAgICAgICAgbWFwIHsgJF8gLiAnID0+ICcgLiAkdGhpbmctPnskX30gfQorICAgICAgICAgIHNvcnQga2V5cyAlJHRoaW5nCisgICAgKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RTZXQgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgbXkgQHJlc3VsdCA9IHNvcnQga2V5cyAlJHRoaW5nOworICBwcmludGYgInRlc3RTZXQoeyVzfSlcbiIsIGpvaW4oJywgJywgQHJlc3VsdCApOworICByZXR1cm4gXEByZXN1bHQ7Cit9CisKK3N1YiB0ZXN0TGlzdCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCAidGVzdExpc3QoeyVzfSlcbiIsIGpvaW4oJywgJywgQCR0aGluZyk7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0RW51bSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCAidGVzdEVudW0oJHRoaW5nKVxuIjsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RUeXBlZGVmIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0VHlwZWRlZigkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RNYXBNYXAgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkaGVsbG8gPSBzaGlmdDsKKworICBwcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCAkaGVsbG8pOworICBteSAkcmVzdWx0ID0geyA0ID0+IHsgMSA9PiAxLCAyID0+IDIsIDMgPT4gMywgNCA9PiA0IH0sIC00ID0+IHsgLTEgPT4gLTEsIC0yID0+IC0yLCAtMyA9PiAtMywgLTQgPT4gLTQgfSB9OworICByZXR1cm4gJHJlc3VsdDsKK30KKworc3ViIHRlc3RJbnNhbml0eSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRhcmd1bWVudCA9IHNoaWZ0OworICBwcmludCgidGVzdEluc2FuaXR5KClcbiIpOworCisgIG15ICRoZWxsbyA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ0hlbGxvMicsIGJ5dGVfdGhpbmcgPT4gMiwgaTMyX3RoaW5nID0+IDIsIGk2NF90aGluZyA9PiAyfSk7CisgIG15IEBoZWxsb3M7CisgIHB1c2goQGhlbGxvcywgJGhlbGxvKTsKKyAgbXkgJGdvb2RieWUgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICdHb29kYnllNCcsIGJ5dGVfdGhpbmcgPT4gNCwgaTMyX3RoaW5nID0+IDQsIGk2NF90aGluZyA9PiA0fSk7CisgIG15IEBnb29kYnllczsKKyAgcHVzaChAZ29vZGJ5ZXMsICRnb29kYnllKTsKKyAgbXkgJGNyYXp5ID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldyh7dXNlck1hcCA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUID0+IDggfSwgeHRydWN0cyA9PiBcQGdvb2RieWVzfSk7CisgIG15ICRsb29ueSA9IFRocmlmdFRlc3Q6Okluc2FuaXR5LT5uZXcoKTsKKyAgbXkgJHJlc3VsdCA9IHsgMSA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyA9PiAkYXJndW1lbnQsIFRocmlmdFRlc3Q6Ok51bWJlcno6OlRIUkVFID0+ICRhcmd1bWVudCB9LAorICAgICAgICAgICAgICAgICAyID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6U0lYID0+ICRsb29ueSB9IH07CisgIHJldHVybiAkcmVzdWx0OworfQorCitzdWIgdGVzdE11bHRpIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGFyZzAgPSBzaGlmdDsKKyAgbXkgJGFyZzEgPSBzaGlmdDsKKyAgbXkgJGFyZzIgPSBzaGlmdDsKKyAgbXkgJGFyZzMgPSBzaGlmdDsKKyAgbXkgJGFyZzQgPSBzaGlmdDsKKyAgbXkgJGFyZzUgPSBzaGlmdDsKKworICBwcmludCgidGVzdE11bHRpKClcbiIpOworICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAkYXJnMCwgaTMyX3RoaW5nID0+ICRhcmcxLCBpNjRfdGhpbmcgPT4gJGFyZzJ9KTsKK30KKworc3ViIHRlc3RFeGNlcHRpb24geworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkYXJnID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0RXhjZXB0aW9uKCRhcmcpXG4iKTsKKyAgaWYgKCRhcmcgZXEgJ1hjZXB0aW9uJykgeworICAgICAgZGllIFRocmlmdFRlc3Q6OlhjZXB0aW9uLT5uZXcoe2Vycm9yQ29kZSA9PiAxMDAxLCBtZXNzYWdlID0+ICRhcmd9KTsKKyAgfQorICBlbHNpZiAoJGFyZyBlcSAnVEV4Y2VwdGlvbicpIHsKKyAgICAgIGRpZSAnYXN0cmluZyc7ICMgYWxsIHVuaGFuZGxlZCBleGNlcHRpb25zIGJlY29tZSBURXhjZXB0aW9ucworICB9CisgIGVsc2UgeworICAgICAgcmV0dXJuIFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJGFyZ30pOworICB9Cit9CisKK3N1YiB0ZXN0TXVsdGlFeGNlcHRpb24geworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkYXJnMCA9IHNoaWZ0OworICBteSAkYXJnMSA9IHNoaWZ0OworCisgIHByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsICRhcmcwLCAkYXJnMSk7CisgIGlmICgkYXJnMCBlcSAnWGNlcHRpb24nKSB7CisgICAgZGllIFRocmlmdFRlc3Q6OlhjZXB0aW9uLT5uZXcoe2Vycm9yQ29kZSA9PiAxMDAxLCBtZXNzYWdlID0+ICdUaGlzIGlzIGFuIFhjZXB0aW9uJ30pOworICB9CisgIGVsc2lmICgkYXJnMCBlcSAnWGNlcHRpb24yJykgeworICAgIG15ICRzdHJ1Y3RfdGhpbmcgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICdUaGlzIGlzIGFuIFhjZXB0aW9uMid9KTsKKyAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24yLT5uZXcoe2Vycm9yQ29kZSA9PiAyMDAyLCBzdHJ1Y3RfdGhpbmcgPT4gJHN0cnVjdF90aGluZ30pOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICRhcmcxfSk7CisgIH0KK30KKworc3ViIHRlc3RPbmV3YXkgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkbnVtID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0T25ld2F5KCRudW0pOiByZWNlaXZlZFxuIik7Cit9CisKKyMjIworIyMjIFRlc3Qgc2VydmVyIGltcGxlbWVudGF0aW9uCisjIyMKKworcGFja2FnZSBTZWNvbmRTZXJ2aWNlSGFuZGxlcjsKKwordXNlIGJhc2UgcXcoIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2VJZiApOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSB7fTsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgc2Vjb25kdGVzdFN0cmluZyB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdFN0cmluZygkdGhpbmcpXG4iKTsKKyAgcmV0dXJuIHFxfHRlc3RTdHJpbmcoIiR0aGluZyIpfDsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Rlc3QvcGhwL01ha2VmaWxlIGIvdGVzdC9waHAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMzVjNmUuLjAwMDAwMDAKLS0tIGEvdGVzdC9waHAvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBEZWZhdWx0IHRhcmdldCBpcyBldmVyeXRoaW5nCi10YXJnZXQ6IGFsbAotCi0jIFRvb2xzCi1USFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWFsbDogbm9ybWFsIGlubGluZQotCi1ub3JtYWw6IHN0dWJzCi0KLWlubGluZTogc3R1YnMtaW5saW5lCi0KLXN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBwaHAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQotc3R1YnMtaW5saW5lOiAuLi9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBwaHA6aW5saW5lZCAuLi9UaHJpZnRUZXN0LnRocmlmdAotCi1jbGVhbjoKLQkkKFJNKSAtciBnZW4tcGhwIGdlbi1waHBpCmRpZmYgLS1naXQgYS90ZXN0L3BocC9NYWtlZmlsZS5hbSBiL3Rlc3QvcGhwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyZjdmYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHBocCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBwaHA6aW5saW5lZCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoTUtESVJfUCkgZ2VuLXBocC1jbGFzc21hcAorCSQoVEhSSUZUKSAtb3V0IGdlbi1waHAtY2xhc3NtYXAgLS1nZW4gcGhwIC4uL1RocmlmdFRlc3QudGhyaWZ0CisKK3BocF9leHRfZGlyOgorCW1rZGlyIC1wIHBocF9leHRfZGlyCisJbG4gLXMgLi4vLi4vLi4vbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9tb2R1bGVzL3RocmlmdF9wcm90b2NvbC5zbyBwaHBfZXh0X2Rpci8KKwlsbiAtcyAiJCQocGhwLWNvbmZpZyAtLWV4dGVuc2lvbi1kaXIpL3NvY2tldHMuc28iIHBocF9leHRfZGlyLworCitwcmVjcm9zczogc3R1YnMgcGhwX2V4dF9kaXIKKworY2hlY2s6IHN0dWJzIHBocF9leHRfZGlyCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1waHAgZ2VuLXBocGkgZ2VuLXBocC1jbGFzc21hcCBwaHBfZXh0X2RpcgorCitjbGllbnQ6IHN0dWJzIHBocF9leHRfZGlyCisJcGhwIFRlc3RDbGllbnQucGhwCmRpZmYgLS1naXQgYS90ZXN0L3BocC9UZXN0Q2xhc3NtYXAucGhwIGIvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQxNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocApAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKzw/cGhwCiskR0VOX0RJUiA9ICdnZW4tcGhwLWNsYXNzbWFwJzsKK2luY2x1ZGVfb25jZSgnVGVzdENsaWVudC5waHAnKTsKKz8+CmRpZmYgLS1naXQgYS90ZXN0L3BocC9UZXN0Q2xpZW50LnBocCBiL3Rlc3QvcGhwL1Rlc3RDbGllbnQucGhwCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggOGVjYTE3NS4uYWNkOTAxZAotLS0gYS90ZXN0L3BocC9UZXN0Q2xpZW50LnBocAorKysgYi90ZXN0L3BocC9UZXN0Q2xpZW50LnBocApAQCAtMSwzICsxLDI4IEBACis8P3BocAorCituYW1lc3BhY2UgdGVzdFxwaHA7CisKKy8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCiskbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworaWYgKCFpc3NldCgkR0VOX0RJUikpIHsKKyAgJEdFTl9ESVIgPSAnZ2VuLXBocCc7Cit9CitpZiAoIWlzc2V0KCRNT0RFKSkgeworICAkTU9ERSA9ICdub3JtYWwnOworfQorCisKK2lmICgkR0VOX0RJUiA9PSAnZ2VuLXBocCcpIHsKKyAgJGxvYWRlci0+YWRkUHNyNCgnJywgJEdFTl9ESVIpOworfSBlbHNlIHsKKyAgJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOworICAkbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCAkR0VOX0RJUik7CisgICRsb2FkZXItPnJlZ2lzdGVyKCk7Cit9CisKIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMTcsNDEgKzQyLDQwIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi08P3BocAotCi1pZiAoIWlzc2V0KCRHRU5fRElSKSkgewotICAkR0VOX0RJUiA9ICdnZW4tcGhwJzsKLX0KLWlmICghaXNzZXQoJE1PREUpKSB7Ci0gICRNT0RFID0gJ25vcm1hbCc7Ci19Ci0KLS8qKiBTZXQgdGhlIFRocmlmdCByb290ICovCi0kR0xPQkFMU1snVEhSSUZUX1JPT1QnXSA9ICcuLi8uLi9saWIvcGhwL3NyYyc7Ci0KIC8qKiBJbmNsdWRlIHRoZSBUaHJpZnQgYmFzZSAqLwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvVGhyaWZ0LnBocCc7Ci0KLS8qKiBJbmNsdWRlIHRoZSBiaW5hcnkgcHJvdG9jb2wgKi8KLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAnOworLyoqIEluY2x1ZGUgdGhlIHByb3RvY29scyAqLwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkOwordXNlIFRocmlmdFxQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwogCiAvKiogSW5jbHVkZSB0aGUgc29ja2V0IGxheWVyICovCi1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFNvY2tldFBvb2wucGhwJzsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRTb2NrZXQ7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0UG9vbDsKIAogLyoqIEluY2x1ZGUgdGhlIHNvY2tldCBsYXllciAqLwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAnOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydDsKIAotZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScuIlxuIjsKLWVjaG8gJyBTQUZFIFRPIElHTk9SRSBUSEVTRSBJTiBURVNUJy4iXG4iOwotZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScuIlxuIjsKK2Z1bmN0aW9uIG1ha2VQcm90b2NvbCgkdHJhbnNwb3J0LCAkUFJPVE8pCit7CisgIGlmICgkUFJPVE8gPT0gJ2JpbmFyeScpIHsKKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmICgkUFJPVE8gPT0gJ2NvbXBhY3QnKSB7CisgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCR0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKCRQUk9UTyA9PSAnanNvbicpIHsKKyAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woJHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoJFBST1RPID09ICdhY2NlbCcpIHsKKyAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7CisgICAgICBlY2hvICJBY2NlbGVyYXRpb24gZXh0ZW5zaW9uIGlzIG5vdCBsb2FkZWRcbiI7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOworICB9CiAKLS8qKiBJbmNsdWRlIHRoZSBnZW5lcmF0ZWQgY29kZSAqLwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy9UaHJpZnRUZXN0L1RocmlmdFRlc3RfdHlwZXMucGhwJzsKLQotZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScuIlxuIjsKLWVjaG8gJyBFTkQgT0YgU0FGRSBFUlJPUlMgU0VDVElPTicuIlxuIjsKLWVjaG8gJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLiJcblxuIjsKKyAgZWNobyAiLS1wcm90b2NvbCBtdXN0IGJlIG9uZSBvZiB7YmluYXJ5fGNvbXBhY3R8anNvbnxhY2NlbH1cbiI7CisgIGV4aXQoMSk7Cit9CiAKICRob3N0ID0gJ2xvY2FsaG9zdCc7CiAkcG9ydCA9IDkwOTA7CkBAIC02NCw2ICs4OCwxNiBAQAogICAkaG9zdCA9ICRhcmd2WzFdOwogfQogCitmb3JlYWNoICgkYXJndiBhcyAkYXJnKSB7CisgIGlmIChzdWJzdHIoJGFyZywgMCwgNykgPT0gJy0tcG9ydD0nKSB7CisgICAgJHBvcnQgPSBzdWJzdHIoJGFyZywgNyk7CisgIH0gZWxzZSBpZiAoc3Vic3RyKCRhcmcsIDAsIDEyKSA9PSAnLS10cmFuc3BvcnQ9JykgeworICAgICRNT0RFID0gc3Vic3RyKCRhcmcsIDEyKTsKKyAgfSBlbHNlIGlmIChzdWJzdHIoJGFyZywgMCwgMTEpID09ICctLXByb3RvY29sPScpIHsKKyAgICAkUFJPVE8gPSBzdWJzdHIoJGFyZywgMTEpOworICB9Cit9CisKICRob3N0cyA9IGFycmF5KCdsb2NhbGhvc3QnKTsKIAogJHNvY2tldCA9IG5ldyBUU29ja2V0KCRob3N0LCAkcG9ydCk7CkBAIC03MiwxOCArMTA2LDI5IEBACiAKIGlmICgkTU9ERSA9PSAnaW5saW5lJykgewogICAkdHJhbnNwb3J0ID0gJHNvY2tldDsKLSAgJHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENsaWVudCgkdHJhbnNwb3J0KTsKKyAgJHRlc3RDbGllbnQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdENsaWVudCgkdHJhbnNwb3J0KTsKK30gZWxzZSBpZiAoJE1PREUgPT0gJ2ZyYW1lZCcpIHsKKyAgJGZyYW1lZFNvY2tldCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KCRzb2NrZXQpOworICAkdHJhbnNwb3J0ID0gJGZyYW1lZFNvY2tldDsKKyAgJHByb3RvY29sID0gbWFrZVByb3RvY29sKCR0cmFuc3BvcnQsICRQUk9UTyk7CisgICR0ZXN0Q2xpZW50ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKIH0gZWxzZSB7CiAgICRidWZmZXJlZFNvY2tldCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwgMTAyNCwgMTAyNCk7CiAgICR0cmFuc3BvcnQgPSAkYnVmZmVyZWRTb2NrZXQ7Ci0gICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci0gICR0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKKyAgJHByb3RvY29sID0gbWFrZVByb3RvY29sKCR0cmFuc3BvcnQsICRQUk9UTyk7CisgICR0ZXN0Q2xpZW50ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKIH0KIAogJHRyYW5zcG9ydC0+b3BlbigpOwogCiAkc3RhcnQgPSBtaWNyb3RpbWUodHJ1ZSk7CiAKK2RlZmluZSgnRVJSX0JBU0VUWVBFUycsIDEpOworZGVmaW5lKCdFUlJfU1RSVUNUUycsIDIpOworZGVmaW5lKCdFUlJfQ09OVEFJTkVSUycsIDQpOworZGVmaW5lKCdFUlJfRVhDRVBUSU9OUycsIDgpOworZGVmaW5lKCdFUlJfVU5LTk9XTicsIDY0KTsKKyRleGl0Y29kZSA9IDA7CiAvKioKICAqIFZPSUQgVEVTVAogICovCkBAIC05MSw0NiArMTM2LDYzIEBACiAkdGVzdENsaWVudC0+dGVzdFZvaWQoKTsKIHByaW50X3IoIiA9IHZvaWRcbiIpOwogCitmdW5jdGlvbiByb3VuZHRyaXAoJHRlc3RDbGllbnQsICRtZXRob2QsICR2YWx1ZSkgeworICBnbG9iYWwgJGV4aXRjb2RlOworICBwcmludF9yKCIkbWV0aG9kKCR2YWx1ZSkiKTsKKyAgJHJldCA9ICR0ZXN0Q2xpZW50LT4kbWV0aG9kKCR2YWx1ZSk7CisgIHByaW50X3IoIiA9IFwiJHJldFwiXG4iKTsKKyAgaWYgKCR2YWx1ZSAhPT0gJHJldCkgeworICAgIHByaW50X3IoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgfQorfQorCiAvKioKICAqIFNUUklORyBURVNUCiAgKi8KLXByaW50X3IoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7Ci0kcyA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nKCJUZXN0Iik7Ci1wcmludF9yKCIgPSBcIiRzXCJcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdFN0cmluZycsICJUZXN0Iik7CisKKy8qKgorICogQk9PTCBURVNUCisgKi8KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCb29sJywgdHJ1ZSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qm9vbCcsIGZhbHNlKTsKIAogLyoqCiAgKiBCWVRFIFRFU1QKICAqLwotcHJpbnRfcigidGVzdEJ5dGUoMSkiKTsKLSR1OCA9ICR0ZXN0Q2xpZW50LT50ZXN0Qnl0ZSgxKTsKLXByaW50X3IoIiA9ICR1OFxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIDEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAtMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIDEyNyk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIC0xMjgpOwogCiAvKioKICAqIEkzMiBURVNUCiAgKi8KLXByaW50X3IoInRlc3RJMzIoLTEpIik7Ci0kaTMyID0gJHRlc3RDbGllbnQtPnRlc3RJMzIoLTEpOwotcHJpbnRfcigiID0gJGkzMlxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STMyJywgLTEpOwogCiAvKioKICAqIEk2NCBURVNUCiAgKi8KLXByaW50X3IoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOwotJGk2NCA9ICR0ZXN0Q2xpZW50LT50ZXN0STY0KC0zNDM1OTczODM2OCk7Ci1wcmludF9yKCIgPSAkaTY0XG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAwKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAxKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAtMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgLTM0MzU5NzM4MzY4KTsKIAogLyoqCiAgKiBET1VCTEUgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KSIpOwotJGR1YiA9ICR0ZXN0Q2xpZW50LT50ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KTsKLXByaW50X3IoIiA9ICRkdWJcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdERvdWJsZScsIC04NTIuMjM0MjM0MjM0KTsKKworLyoqCisgKiBCSU5BUlkgVEVTVCAgLS0gIFRPRE8KKyAqLwogCiAvKioKICAqIFNUUlVDVCBURVNUCiAgKi8KIHByaW50X3IoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotJG91dCA9IG5ldyBYdHJ1Y3QoKTsKKyRvdXQgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCk7CiAkb3V0LT5zdHJpbmdfdGhpbmcgPSAiWmVybyI7CiAkb3V0LT5ieXRlX3RoaW5nID0gMTsKICRvdXQtPmkzMl90aGluZyA9IC0zOwpAQCAtMTQxLDExICsyMDMsMTYgQEAKICAgICAgICAgJGluLT5pMzJfdGhpbmcuIiwgIi4KICAgICAgICAgJGluLT5pNjRfdGhpbmcuIn1cbiIpOwogCitpZiAoJGluICE9ICRvdXQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KKwogLyoqCiAgKiBORVNURUQgU1RSVUNUIFRFU1QKICAqLwogcHJpbnRfcigidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9Iik7Ci0kb3V0MiA9IG5ldyBYdHJ1Y3QyKCk7Ciskb3V0MiA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QyKCk7CiAkb3V0Mi0+Ynl0ZV90aGluZyA9IDE7CiAkb3V0Mi0+c3RydWN0X3RoaW5nID0gJG91dDsKICRvdXQyLT5pMzJfdGhpbmcgPSA1OwpAQCAtMTU4LDYgKzIyNSwxMSBAQAogICAgICAgICAkaW4tPmk2NF90aGluZy4ifSwgIi4KICAgICAgICAgJGluMi0+aTMyX3RoaW5nLiJ9XG4iKTsKIAoraWYgKCRpbjIgIT0gJG91dDIpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KKwogLyoqCiAgKiBNQVAgVEVTVAogICovCkBAIC0xOTAsMzYgKzI2Miw2OSBAQAogfQogcHJpbnRfcigifVxuIik7CiAKK2lmICgkbWFwaW4gIT0gJG1hcG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorCiskbWFwb3V0ID0gYXJyYXkoKTsKK2ZvciAoJGkgPSAwOyAkaSA8IDEwOyAkaSsrKSB7CisgICAgJG1hcG91dFsia2V5JGkiXSA9ICJ2YWwkaSI7Cit9CitwcmludF9yKCd0ZXN0U3RyaW5nTWFwKHsnKTsKKyRmaXJzdCA9IHRydWU7Citmb3JlYWNoICgkbWFwb3V0IGFzICRrZXkgPT4gJHZhbCkgeworICBpZiAoJGZpcnN0KSB7CisgICAgJGZpcnN0ID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcHJpbnRfcigiLCAiKTsKKyAgfQorICBwcmludF9yKCJcIiRrZXlcIiA9PiBcIiR2YWxcIiIpOworfQorcHJpbnRfcigifSkiKTsKKyRtYXBpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nTWFwKCRtYXBvdXQpOworcHJpbnRfcigiID0geyIpOworJGZpcnN0ID0gdHJ1ZTsKK2ZvcmVhY2ggKCRtYXBpbiBhcyAka2V5ID0+ICR2YWwpIHsKKyAgaWYgKCRmaXJzdCkgeworICAgICRmaXJzdCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHByaW50X3IoIiwgIik7CisgIH0KKyAgcHJpbnRfcigiXCIka2V5XCIgPT4gXCIkdmFsXCIiKTsKK30KK3ByaW50X3IoIn1cbiIpOwora3NvcnQoJG1hcGluKTsKK2lmICgkbWFwaW4gIT0gJG1hcG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorCiAvKioKICAqIFNFVCBURVNUCiAgKi8KICRzZXRvdXQgPSBhcnJheSgpOzsKIGZvciAoJGkgPSAtMjsgJGkgPCAzOyArKyRpKSB7Ci0gICRzZXRvdXQgW109ICRpOworICAkc2V0b3V0WyRpXT0gdHJ1ZTsKIH0KIHByaW50X3IoInRlc3RTZXQoeyIpOwotJGZpcnN0ID0gdHJ1ZTsKLWZvcmVhY2ggKCRzZXRvdXQgYXMgJHZhbCkgewotICBpZiAoJGZpcnN0KSB7Ci0gICAgJGZpcnN0ID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRfcigiLCAiKTsKLSAgfQotICBwcmludF9yKCR2YWwpOwotfQorZWNobyBpbXBsb2RlKCcsJywgYXJyYXlfa2V5cygkc2V0b3V0KSk7CiBwcmludF9yKCJ9KSIpOwogJHNldGluID0gJHRlc3RDbGllbnQtPnRlc3RTZXQoJHNldG91dCk7CiBwcmludF9yKCIgPSB7Iik7Ci0kZmlyc3QgPSB0cnVlOwotZm9yZWFjaCAoJHNldGluIGFzICR2YWwpIHsKLSAgaWYgKCRmaXJzdCkgewotICAgICRmaXJzdCA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHByaW50X3IoIiwgIik7Ci0gIH0KLSAgcHJpbnRfcigkdmFsKTsKLX0KK2VjaG8gaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRzZXRpbikpOwogcHJpbnRfcigifVxuIik7CisvLyBPcmRlciBvZiBrZXlzIGluIHNldCBkb2VzIG5vdCBtYXR0ZXIKK2tzb3J0KCRzZXRpbik7CitpZiAoJHNldG91dCAhPT0gJHNldGluKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGNvcnJ1cHRlZCBhcnJheQoraWYgKCRzZXRpblsyXSAhPT0gJHNldG91dFsyXSB8fCBpc19pbnQoJHNldGluWzJdKSkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIExJU1QgVEVTVApAQCAtMjUxLDI5ICszNTYsNTMgQEAKICAgcHJpbnRfcigkdmFsKTsKIH0KIHByaW50X3IoIn1cbiIpOworaWYgKCRsaXN0aW4gIT09ICRsaXN0b3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CiAKIC8qKgogICogRU5VTSBURVNUCiAgKi8KIHByaW50X3IoInRlc3RFbnVtKE9ORSkiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oTnVtYmVyejo6T05FKTsKKyRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKFRXTykiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oTnVtYmVyejo6VFdPKTsKKyRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6VFdPKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6VFdPKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKFRIUkVFKSIpOwotJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShOdW1iZXJ6OjpUSFJFRSk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OlRIUkVFKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6VEhSRUUpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oRklWRSkiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oTnVtYmVyejo6RklWRSk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OkZJVkUpOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpGSVZFKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKEVJR0hUKSIpOwotJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShOdW1iZXJ6OjpFSUdIVCk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OkVJR0hUKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6RUlHSFQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogLyoqCiAgKiBUWVBFREVGIFRFU1QKQEAgLTI4MSw2ICs0MTAsMTAgQEAKIHByaW50X3IoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKICR1aWQgPSAkdGVzdENsaWVudC0+dGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKTsKIHByaW50X3IoIiA9ICR1aWRcbiIpOworaWYgKCR1aWQgIT09IDMwOTg1ODIzNTA4MjUyMykgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQogCiAvKioKICAqIE5FU1RFRCBNQVAgVEVTVApAQCAtMjk2LDEzICs0MjksMjEgQEAKICAgcHJpbnRfcigifSwgIik7CiB9CiBwcmludF9yKCJ9XG4iKTsKKyRleHBlY3RlZF9tbSA9IFsKKyAgLTQgPT4gWy00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xXSwKKyAgNCA9PiBbNCA9PiA0LCAzID0+IDMsIDIgPT4gMiwgMSA9PiAxXSwKK107CitpZiAoJG1tICE9ICRleHBlY3RlZF9tbSkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIElOU0FOSVRZIFRFU1QKICAqLwotJGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwotJGluc2FuZS0+dXNlck1hcFtOdW1iZXJ6OjpGSVZFXSA9IDUwMDA7Ci0kdHJ1Y2sgPSBuZXcgWHRydWN0KCk7CiskaW5zYW5lID0gbmV3IFxUaHJpZnRUZXN0XEluc2FuaXR5KCk7CiskaW5zYW5lLT51c2VyTWFwW1xUaHJpZnRUZXN0XE51bWJlcno6OkZJVkVdID0gNTAwMDsKKyR0cnVjayA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoKTsKICR0cnVjay0+c3RyaW5nX3RoaW5nID0gIlRydWNrIjsKICR0cnVjay0+Ynl0ZV90aGluZyA9IDg7CiAkdHJ1Y2stPmkzMl90aGluZyA9IDg7CkBAIC0zMTcsNyArNDU4LDcgQEAKICAgICBwcmludF9yKCIkazIgPT4geyIpOwogICAgICR1c2VyTWFwID0gJHYyLT51c2VyTWFwOwogICAgIHByaW50X3IoInsiKTsKLSAgICBpZiAoaXNfYXJyYXkoJHVzZXJtYXApKSB7CisgICAgaWYgKGlzX2FycmF5KCR1c2VyTWFwKSkgewogICAgICAgZm9yZWFjaCAoJHVzZXJNYXAgYXMgJGszID0+ICR2MykgewogICAgICAgICBwcmludF9yKCIkazMgPT4gJHYzLCAiKTsKICAgICAgIH0KQEAgLTM0NywxMCArNDg4LDI5IEBACiB0cnkgewogICAkdGVzdENsaWVudC0+dGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKICAgcHJpbnRfcigiICB2b2lkXG5GQUlMVVJFXG4iKTsKLX0gY2F0Y2ggKFhjZXB0aW9uICR4KSB7CisgICRleGl0Y29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKK30gY2F0Y2ggKFxUaHJpZnRUZXN0XFhjZXB0aW9uICR4KSB7CiAgIHByaW50X3IoJyBjYXVnaHQgeGNlcHRpb24gJy4keC0+ZXJyb3JDb2RlLic6ICcuJHgtPm1lc3NhZ2UuIlxuIik7CiB9CiAKKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgVEhSSUZULTQyNjMKK3ByaW50X3IoInRlc3RCaW5hcnlTZXJpYWxpemVyX0Rlc2VyaWFsaXplKCdmb28nKSIpOwordHJ5IHsKKyAgXFRocmlmdFxTZXJpYWxpemVyXFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShiYXNlNjRfZGVjb2RlKCdmb28nKSwgXFRocmlmdFRlc3RcWHRydWN0Mjo6Y2xhc3MpOworICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9IGNhdGNoIChcVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uICRoYXBweV9leGNlcHRpb24pIHsKKyAgLy8gV2UgZXhwZWN0ZWQgdGhpcyBkdWUgdG8gYmluYXJ5IGRhdGEgb2YgYmFzZTY0X2RlY29kZSgnZm9vJykgaXMgbGVzcyB0aGVuIDQKKyAgLy8gYnl0ZXMgYW5kIGl0IHRyaWVzIHRvIGZpbmQgdGhyaWZ0IHZlcnNpb24gbnVtYmVyIGluIHRoZSB0cmFuc3BvcnQgYnkKKyAgLy8gcmVhZGluZyBpMzIoKSBhdCB0aGUgYmVnaW5uaW5nLiAgQ2FzdGluZyB0byBzdHJpbmcgdmFsaWRhdGVzIHRoYXQKKyAgLy8gZXhjZXB0aW9uIGlzIHN0aWxsIGFjY2Vzc2libGUgaW4gbWVtb3J5IGFuZCBub3QgY29ycnVwdGVkLiAgV2l0aG91dCBwYXRjaCwKKyAgLy8gUEhQIHdpbGwgZXJyb3IgbG9nIHRoYXQgdGhlIGV4Y2VwdGlvbiBkb2Vzbid0IGhhdmUgYW55IHRvc3RyaW5nIG1ldGhvZCwKKyAgLy8gd2hpY2ggaXMgYSBsaWUgZHVlIHRvIGNvcnJ1cHRlZCBtZW1vcnkuCisgIGZvcigkaT05OTsgJGkgPiAwOyAkaS0tKSB7CisgICAgKHN0cmluZykkaGFwcHlfZXhjZXB0aW9uOworICB9CisgIHByaW50X3IoIiAgU1VDQ0VTU1xuIik7Cit9CiAKIC8qKgogICogTm9ybWFsIHRlc3RzIGRvbmUuCkBAIC0zNjQsMzUgKzUyNCwzNCBAQAogICogRXh0cmFuZW91cyAiSSBkb24ndCB0cnVzdCBQSFAgdG8gcGFjay91bnBhY2sgaW50ZWdlciIgdGVzdHMKICAqLwogCitpZiAoJHByb3RvY29sIGluc3RhbmNlb2YgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpIHsKKyAgICAvLyBSZWdyZXNzaW9uIGNoZWNrOiBjaGVjayB0aGF0IG1ldGhvZCBuYW1lIGlzIG5vdCBkb3VibGUtZnJlZWQKKyAgICAvLyBNZXRob2QgbmFtZSBzaG91bGQgbm90IGJlIGFuIGludGVybmVkIHN0cmluZy4KKyAgICAkbWV0aG9kX25hbWUgPSAiVm9pZCI7CisgICAgJG1ldGhvZF9uYW1lID0gInRlc3QkbWV0aG9kX25hbWUiOworCisgICAgJHNlcWlkID0gMDsKKyAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKKyAgICB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCRwcm90b2NvbCwgJG1ldGhvZF9uYW1lLCBcVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOjpDQUxMLCAkYXJncywgJHNlcWlkLCAkcHJvdG9jb2wtPmlzU3RyaWN0V3JpdGUoKSk7CisgICAgJHRlc3RDbGllbnQtPnJlY3ZfdGVzdFZvaWQoKTsKKworfQorCiAvLyBNYXggSTMyCiAkbnVtID0gcG93KDIsIDMwKSArIChwb3coMiwgMzApIC0gMSk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STMyJywgJG51bSk7CiAKIC8vIE1pbiBJMzIKICRudW0gPSAwIC0gcG93KDIsIDMxKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJMzIoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJMzInLCAkbnVtKTsKIAogLy8gTWF4IEk2NAogJG51bSA9IHBvdygyLCA2MikgKyAocG93KDIsIDYyKSAtIDEpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsICRudW0pOwogCiAvLyBNaW4gSTY0Ci0kbnVtID0gMCAtIHBvdygyLCA2Myk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STY0KCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19CiskbnVtID0gMCAtIHBvdygyLCA2MikgLSBwb3coMiwgNjIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsICRudW0pOwogCiAkdHJhbnNwb3J0LT5jbG9zZSgpOwotcmV0dXJuOwotCi0/PgorZXhpdCgkZXhpdGNvZGUpOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvdGVzdF9waHAuaW5pIGIvdGVzdC9waHAvdGVzdF9waHAuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC90ZXN0X3BocC5pbmkKQEAgLTAsMCArMSwyIEBACitleHRlbnNpb249dGhyaWZ0X3Byb3RvY29sLnNvCitleHRlbnNpb249c29ja2V0cy5zbwpkaWZmIC0tZ2l0IGEvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtIGIvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTY4MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCit0aHJpZnRfZ2VuOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcHk6dG9ybmFkbyAuLi9TbWFsbFRlc3QudGhyaWZ0CisKK2NoZWNrOiB0aHJpZnRfZ2VuCisJLi90ZXN0X3N1aXRlLnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1weS50b3JuYWRvCmRpZmYgLS1naXQgYS90ZXN0L3B5LnRvcm5hZG8vc2V0dXAuY2ZnIGIvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU4N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZwpAQCAtMCwwICsxLDMgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5IGIvdGVzdC9weS50b3JuYWRvL3Rlc3Rfc3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQ3ZmRlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5CkBAIC0wLDAgKzEsMjM2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCitiYXNlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorc3lzLnBhdGguaW5zZXJ0KDAsIGJhc2VwYXRoICsgJy9nZW4tcHkudG9ybmFkbycpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKG9zLnBhdGguam9pbihiYXNlcGF0aCwgJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJykpWzBdKQorCit0cnk6CisgICAgX19pbXBvcnRfXygndG9ybmFkbycpCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcHJpbnQoIm1vZHVsZSBgdG9ybmFkb2Agbm90IGZvdW5kLCBza2lwcGluZyB0ZXN0IikKKyAgICBzeXMuZXhpdCgwKQorCitmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbgorZnJvbSB0b3JuYWRvLnRlc3RpbmcgaW1wb3J0IEFzeW5jVGVzdENhc2UsIGdldF91bnVzZWRfcG9ydCwgZ2VuX3Rlc3QKKworZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCitmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKKworCitjbGFzcyBUZXN0SGFuZGxlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2luc3RhbmNlKToKKyAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlID0gdGVzdF9pbnN0YW5jZQorCisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzKToKKyAgICAgICAgaWYgcyA9PSAndW5leHBlY3RlZF9lcnJvcic6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24ocykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBiKToKKyAgICAgICAgcmV0dXJuIGIKKworICAgIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6CisgICAgICAgIHJldHVybiBpMTYKKworICAgIGRlZiB0ZXN0STMyKHNlbGYsIGkzMik6CisgICAgICAgIHJldHVybiBpMzIKKworICAgIGRlZiB0ZXN0STY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBpNjQKKworICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHJldHVybiBkdWIKKworICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgcyk6CisgICAgICAgIGlmIHMgPT0gJ1hjZXB0aW9uJzoKKyAgICAgICAgICAgIHggPSBYY2VwdGlvbigpCisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDEKKyAgICAgICAgICAgIHgubWVzc2FnZSA9IHMKKyAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgZWxpZiBzID09ICd0aHJvd191bmRlY2xhcmVkJzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Rlc3RpbmcgdW5kZWNsYXJlZCBleGNlcHRpb24nKQorCisgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKworICAgICAgICBkZWYgZmlyZV9vbmV3YXkoKToKKyAgICAgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBzZWxmLnRlc3RfaW5zdGFuY2Uuc3RvcCgoc3RhcnQsIGVuZCwgc2Vjb25kcykpCisKKyAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlLmlvX2xvb3AuYWRkX3RpbWVvdXQoCisgICAgICAgICAgICBkYXRldGltZS50aW1lZGVsdGEoc2Vjb25kcz1zZWNvbmRzKSwKKyAgICAgICAgICAgIGZpcmVfb25ld2F5KQorICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3Rlc3RpbmcgZXhjZXB0aW9uIGluIG9uZXdheSBtZXRob2QnKQorCisgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgeWllbGQgZ2VuLm1vbWVudAorICAgICAgICByYWlzZSBnZW4uUmV0dXJuKHRoaW5nKQorCisgICAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFbnVtKHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworCitjbGFzcyBUaHJpZnRUZXN0Q2FzZShBc3luY1Rlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRocmlmdFRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisKKyAgICAgICAgc2VsZi5wb3J0ID0gZ2V0X3VudXNlZF9wb3J0KCkKKworICAgICAgICAjIHNlcnZlcgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBUZXN0SGFuZGxlcihzZWxmKQorICAgICAgICBzZWxmLnByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKHNlbGYuaGFuZGxlcikKKyAgICAgICAgc2VsZi5wZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKworICAgICAgICBzZWxmLnNlcnZlciA9IFRUb3JuYWRvLlRUb3JuYWRvU2VydmVyKHNlbGYucHJvY2Vzc29yLCBzZWxmLnBmYWN0b3J5LCBpb19sb29wPXNlbGYuaW9fbG9vcCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuYmluZChzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KDEpCisKKyAgICAgICAgIyBjbGllbnQKKyAgICAgICAgdHJhbnNwb3J0ID0gVFRvcm5hZG8uVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoJ2xvY2FsaG9zdCcsIHNlbGYucG9ydCwgaW9fbG9vcD1zZWxmLmlvX2xvb3ApCisgICAgICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgICAgICBzZWxmLmlvX2xvb3AucnVuX3N5bmModHJhbnNwb3J0Lm9wZW4pCisgICAgICAgIHNlbGYuY2xpZW50ID0gVGhyaWZ0VGVzdC5DbGllbnQodHJhbnNwb3J0LCBwZmFjdG9yeSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3ZvaWQoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0Vm9pZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgTm9uZSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgJ1B5dGhvbicpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9ieXRlKHNlbGYpOgorICAgICAgICB2ID0geWllbGQgc2VsZi5jbGllbnQudGVzdEJ5dGUoNjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgNjMpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9pMzIoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQorCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgMCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2k2NChzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0zNDM1OTczODM2OCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2RvdWJsZShzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC01LjIzNTA5ODIzNSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeC5pMzJfdGhpbmcgPSAtMworICAgICAgICB4Lmk2NF90aGluZyA9IC01CisgICAgICAgIHkgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LnN0cmluZ190aGluZywgIlplcm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYnl0ZV90aGluZywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmkzMl90aGluZywgLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pNjRfdGhpbmcsIC01KQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3Rfb25ld2F5KHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdEhhbmRsZXIudGVzdE1hcCBpcyBhIGNvcm91dGluZSwgdGhpcyB0ZXN0IGNoZWNrcyBpZiBnZW4uUmV0dXJuKCkgZnJvbSBhIGNvcm91dGluZSB3b3Jrcy4KKyAgICAgICAgIiIiCisgICAgICAgIGV4cGVjdGVkID0gezE6IDF9CisgICAgICAgIHJlcyA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RNYXAoZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBleHBlY3RlZCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgubWVzc2FnZSwgJ1hjZXB0aW9uJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rocm93X3VuZGVjbGFyZWQnKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKworICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRocmlmdFRlc3RDYXNlKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0LlRlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSdzdWl0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MSkpCmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0gYi90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExOTA4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVFJJQUwgPz0gdHJpYWwKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL1NtYWxsVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcHk6dHdpc3RlZCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBweTp0d2lzdGVkIC4uL1NtYWxsVGVzdC50aHJpZnQKKworY2hlY2s6IHN0dWJzCisJJChUUklBTCkgLi90ZXN0X3N1aXRlLnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1weS50d2lzdGVkCmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnIGIvdGVzdC9weS50d2lzdGVkL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU4N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS50d2lzdGVkL3NldHVwLmNmZwpAQCAtMCwwICsxLDMgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5IGIvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDJlYjdmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5CkBAIC0wLDAgKzEsMTk4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK2Jhc2VwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKGJhc2VwYXRoLCAnZ2VuLXB5LnR3aXN0ZWQnKSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGJhc2VwYXRoLCAnLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJykpWzBdKQorCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorCitmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworZnJvbSB0d2lzdGVkLnRyaWFsIGltcG9ydCB1bml0dGVzdAorZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciwgcmVhY3RvcgorZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBDbGllbnRDcmVhdG9yCisKK2Zyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IGltcGxlbWVudGVyCisKKworQGltcGxlbWVudGVyKFRocmlmdFRlc3QuSWZhY2UpCitjbGFzcyBUZXN0SGFuZGxlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYub25ld2F5c1F1ZXVlID0gZGVmZXIuRGVmZXJyZWRRdWV1ZSgpCisKKyAgICBkZWYgdGVzdFZvaWQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYsIHMpOgorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIHRlc3RCeXRlKHNlbGYsIGIpOgorICAgICAgICByZXR1cm4gYgorCisgICAgZGVmIHRlc3RJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcmV0dXJuIGkxNgorCisgICAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgcmV0dXJuIGkzMgorCisgICAgZGVmIHRlc3RJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgcmV0dXJuIGk2NAorCisgICAgZGVmIHRlc3REb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcmV0dXJuIGR1YgorCisgICAgZGVmIHRlc3RCaW5hcnkoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmLCBzKToKKyAgICAgICAgaWYgcyA9PSAnWGNlcHRpb24nOgorICAgICAgICAgICAgeCA9IFhjZXB0aW9uKCkKKyAgICAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMQorICAgICAgICAgICAgeC5tZXNzYWdlID0gcworICAgICAgICAgICAgcmFpc2UgeAorICAgICAgICBlbGlmIHMgPT0gInRocm93X3VuZGVjbGFyZWQiOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZm9vIikKKworICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYsIHNlY29uZHMpOgorICAgICAgICBkZWYgZmlyZU9uZXdheSh0KToKKyAgICAgICAgICAgIHNlbGYub25ld2F5c1F1ZXVlLnB1dCgodCwgdGltZS50aW1lKCksIHNlY29uZHMpKQorICAgICAgICByZWFjdG9yLmNhbGxMYXRlcihzZWNvbmRzLCBmaXJlT25ld2F5LCB0aW1lLnRpbWUoKSkKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCcnKQorCisgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdE1hcChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFbnVtKHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworCitjbGFzcyBUaHJpZnRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBUZXN0SGFuZGxlcigpCisgICAgICAgIHNlbGYucHJvY2Vzc29yID0gVGhyaWZ0VGVzdC5Qcm9jZXNzb3Ioc2VsZi5oYW5kbGVyKQorICAgICAgICBzZWxmLnBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorCisgICAgICAgIHNlbGYuc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoCisgICAgICAgICAgICAwLCBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KHNlbGYucHJvY2Vzc29yLCBzZWxmLnBmYWN0b3J5KSwgaW50ZXJmYWNlPSIxMjcuMC4wLjEiKQorCisgICAgICAgIHNlbGYucG9ydE5vID0gc2VsZi5zZXJ2ZXIuZ2V0SG9zdCgpLnBvcnQKKworICAgICAgICBzZWxmLnR4Y2xpZW50ID0geWllbGQgQ2xpZW50Q3JlYXRvcihyZWFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHdpc3RlZC5UaHJpZnRDbGllbnRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdC5DbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGZhY3RvcnkpLmNvbm5lY3RUQ1AoIjEyNy4wLjAuMSIsIHNlbGYucG9ydE5vKQorICAgICAgICBzZWxmLmNsaWVudCA9IHNlbGYudHhjbGllbnQuY2xpZW50CisKKyAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB5aWVsZCBzZWxmLnNlcnZlci5zdG9wTGlzdGVuaW5nKCkKKyAgICAgICAgc2VsZi50eGNsaWVudC50cmFuc3BvcnQubG9zZUNvbm5lY3Rpb24oKQorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcworICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHlpZWxkIHNlbGYuY2xpZW50LnRlc3RWb2lkKCkpLCBOb25lKQorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcworICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJykpLCAnUHl0aG9uJykKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgdGVzdEJ5dGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MykpLCA2MykKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgdGVzdEkzMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHlpZWxkIHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKDApKSwgMCkKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgdGVzdEk2NChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHlpZWxkIHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KSksIC0zNDM1OTczODM2OCkKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgdGVzdERvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHlpZWxkIHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KSksIC01LjIzNTA5ODIzNSkKKworICAgICMgVE9ETzogZGVmIHRlc3RCaW5hcnkoc2VsZikgLi4uCisKKyAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCisgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZik6CisgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAxCisgICAgICAgIHguaTMyX3RoaW5nID0gLTMKKyAgICAgICAgeC5pNjRfdGhpbmcgPSAtNQorICAgICAgICB5ID0geWllbGQgc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHkuc3RyaW5nX3RoaW5nLCAiWmVybyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHkuYnl0ZV90aGluZywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeS5pMzJfdGhpbmcsIC0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh5Lmk2NF90aGluZywgLTUpCisKKyAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5lcnJvckNvZGUsIDEwMDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcworICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgorICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpCisgICAgICAgIHN0YXJ0LCBlbmQsIHNlY29uZHMgPSB5aWVsZCBzZWxmLmhhbmRsZXIub25ld2F5c1F1ZXVlLmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHNlY29uZHMsIChlbmQgLSBzdGFydCksIHBsYWNlcz0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigtMSkpLCAtMSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvQ01ha2VMaXN0cy50eHQgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzIyMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithZGRfdGVzdChOQU1FIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9CisgICAgICAgICAgICAtRFRIUklGVENPTVBJTEVSPSQ8VEFSR0VUX0ZJTEU6dGhyaWZ0LWNvbXBpbGVyPgorICAgICAgICAgICAgLURNWV9QUk9KRUNUX0RJUj0ke1BST0pFQ1RfU09VUkNFX0RJUn0KKyAgICAgICAgICAgIC1ETVlfQ1VSUkVOVF9TT1VSQ0VfRElSPSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgLURNWV9DVVJSRU5UX0JJTkFSWV9ESVI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgLVAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2dlbmVyYXRlLmNtYWtlCispCisKK2FkZF90ZXN0KE5BTUUgcHl0aG9uX3Rlc3QKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9SdW5DbGllbnRTZXJ2ZXIucHkgLS1nZW4tYmFzZT0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CispCisKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvRmFzdGJpbmFyeVRlc3QucHkgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YzBiYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5CkBAIC0wLDAgKzEsMjU2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3IiIiIKK1BZVEhPTlBBVEg9Li9nZW4tcHk6Li4vLi4vbGliL3B5L2J1aWxkL2xpYi4uLiAuL0Zhc3RiaW5hcnlUZXN0LnB5CisiIiIKKworIyBUT0RPKGRyZWlzcyk6IFRlc3QgZXJyb3IgY2FzZXMuICBDaGVjayBmb3IgbWVtb3J5IGxlYWtzLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBtYXRoCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1laXQKKworZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkCisKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IFNydgorZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IEJhY2t3YXJkcywgQm9uaywgRW1wdHksIEhvbHlNb2xleSwgT25lT2ZFYWNoLCBSYW5kb21TdHVmZiwgV3JhcHBlcgorCisKK2NsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitvb2UxID0gT25lT2ZFYWNoKCkKK29vZTEuaW1fdHJ1ZSA9IFRydWUKK29vZTEuaW1fZmFsc2UgPSBGYWxzZQorb29lMS5hX2JpdGUgPSAweGQ2Citvb2UxLmludGVnZXIxNiA9IDI3MDAwCitvb2UxLmludGVnZXIzMiA9IDEgPDwgMjQKK29vZTEuaW50ZWdlcjY0ID0gNjAwMCAqIDEwMDAgKiAxMDAwCitvb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpCitvb2UxLnNvbWVfY2hhcmFjdGVycyA9ICJEZWJ1ZyBUSElTISIKK29vZTEuem9tZ191bmljb2RlID0gdSJceGQ3XG5cYVx0IgorCitvb2UyID0gT25lT2ZFYWNoKCkKK29vZTIuaW50ZWdlcjE2ID0gMTYKK29vZTIuaW50ZWdlcjMyID0gMzIKK29vZTIuaW50ZWdlcjY0ID0gNjQKK29vZTIuZG91YmxlX3ByZWNpc2lvbiA9IChtYXRoLnNxcnQoNSkgKyAxKSAvIDIKK29vZTIuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiCitvb2UyLnpvbWdfdW5pY29kZSA9IHUiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjN1x4ODNceGUyXHg4MFx4YmMiCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgb29lMS56b21nX3VuaWNvZGUgPSBvb2UxLnpvbWdfdW5pY29kZS5lbmNvZGUoJ3V0ZjgnKQorICAgIG9vZTIuem9tZ191bmljb2RlID0gb29lMi56b21nX3VuaWNvZGUuZW5jb2RlKCd1dGY4JykKKworaG0gPSBIb2x5TW9sZXkoKip7ImJpZyI6IFtdLCAiY29udGFpbiI6IHNldCgpLCAiYm9ua3MiOiB7fX0pCitobS5iaWcuYXBwZW5kKG9vZTEpCitobS5iaWcuYXBwZW5kKG9vZTIpCitobS5iaWdbMF0uYV9iaXRlID0gMHgyMgoraG0uYmlnWzFdLmFfYml0ZSA9IDB4MjIKKworaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCitobS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIuZW5jb2RlKCd1dGY4JyksKSkKK2Vsc2U6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIsKSkKK2htLmNvbnRhaW4uYWRkKCgpKQorCitobS5ib25rc1sibm90aGluZyJdID0gW10KK2htLmJvbmtzWyJzb21ldGhpbmciXSA9IFsKKyAgICBCb25rKCoqeyJ0eXBlIjogMSwgIm1lc3NhZ2UiOiAiV2FpdC4ifSksCisgICAgQm9uaygqKnsidHlwZSI6IDIsICJtZXNzYWdlIjogIldoYXQ/In0pLAorXQoraG0uYm9ua3NbInBvZSJdID0gWworICAgIEJvbmsoKip7InR5cGUiOiAzLCAibWVzc2FnZSI6ICJxdW90aCJ9KSwKKyAgICBCb25rKCoqeyJ0eXBlIjogNCwgIm1lc3NhZ2UiOiAidGhlIHJhdmVuIn0pLAorICAgIEJvbmsoKip7InR5cGUiOiA1LCAibWVzc2FnZSI6ICJuZXZlcm1vcmUifSksCitdCisKK3JzID0gUmFuZG9tU3R1ZmYoKQorcnMuYSA9IDEKK3JzLmIgPSAyCitycy5jID0gMworcnMubXlpbnRsaXN0ID0gbGlzdChyYW5nZSgyMCkpCitycy5tYXBzID0gezE6IFdyYXBwZXIoKip7ImZvbyI6IEVtcHR5KCl9KSwgMjogV3JhcHBlcigqKnsiZm9vIjogRW1wdHkoKX0pfQorcnMuYmlnaW50ID0gMTI0NTIzNDUyNDM1Citycy50cmlwbGUgPSAzLjE0CisKKyMgbWFrZSBzdXJlIHRoaXMgc3BsaXRzIHR3byBidWZmZXJzIGluIGEgYnVmZmVyZWQgcHJvdG9jb2wKK3JzaHVnZSA9IFJhbmRvbVN0dWZmKCkKK3JzaHVnZS5teWludGxpc3QgPSBsaXN0KHJhbmdlKDEwMDAwKSkKKworbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoKip7InN1Y2Nlc3MiOiA1fSkKKworCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhc3QsIHNsb3cpOgorICAgICAgICBzZWxmLl9mYXN0ID0gZmFzdAorICAgICAgICBzZWxmLl9zbG93ID0gc2xvdworCisgICAgZGVmIF9jaGVja193cml0ZShzZWxmLCBvKToKKyAgICAgICAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90X2Zhc3QgPSBzZWxmLl9mYXN0KHRyYW5zX2Zhc3QsIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBwcm90X3Nsb3cgPSBzZWxmLl9zbG93KHRyYW5zX3Nsb3cpCisKKyAgICAgICAgby53cml0ZShwcm90X2Zhc3QpCisgICAgICAgIG8ud3JpdGUocHJvdF9zbG93KQorICAgICAgICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCisgICAgICAgIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKKyAgICAgICAgaWYgT1JJRyAhPSBNSU5FOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAlc1xuZXhwZWN0ZWQ6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignd3JpdGUgdmFsdWUgbWlzbWF0Y2gnKQorCisgICAgZGVmIF9jaGVja19yZWFkKHNlbGYsIG8pOgorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdyhUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKKyAgICAgICAgby53cml0ZShwcm90KQorCisgICAgICAgIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIGMgPSBvLl9fY2xhc3NfXygpCisgICAgICAgIGMucmVhZChwcm90KQorICAgICAgICBpZiBjICE9IG86CisgICAgICAgICAgICBwcmludCgiYWN0dWFsICA6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJleHBlY3RlZDogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKG8pKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdyZWFkIHZhbHVlIG1pc21hdGNoJykKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSksIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgiZXhwZWN0ZWQ6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihvKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigncmVhZCB2YWx1ZSBtaXNtYXRjaCcpCisKKyAgICBkZWYgZG9fdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoSG9seU1vbGV5KCkpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoSG9seU1vbGV5KCkpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoaG0pCisgICAgICAgIG5vX3NldCA9IGRlZXBjb3B5KGhtKQorICAgICAgICBub19zZXQuY29udGFpbiA9IHNldCgpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQobm9fc2V0KQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKGhtKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKHJzKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzaHVnZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChyc2h1Z2UpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUobXlfemVybykKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChteV96ZXJvKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pKQorCisgICAgICAgICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgorICAgICAgICBvID0gQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pCisgICAgICAgIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdF9mYXN0ID0gc2VsZi5fZmFzdCh0cmFuc19mYXN0LCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgcHJvdF9zbG93ID0gc2VsZi5fc2xvdyh0cmFuc19zbG93KQorCisgICAgICAgIG8ud3JpdGUocHJvdF9mYXN0KQorICAgICAgICBvLndyaXRlKHByb3Rfc2xvdykKKyAgICAgICAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQorICAgICAgICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCisgICAgICAgIGFzc2VydCBpZChPUklHKSAhPSBpZChNSU5FKQorCisgICAgICAgIHByb3QgPSBzZWxmLl9mYXN0KFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgby53cml0ZShwcm90KQorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdygKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihwcm90LnRyYW5zLmdldHZhbHVlKCkpKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImNvcHk6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJvcmlnOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIobykpCisKKworZGVmIGRvX3Rlc3QoZmFzdCwgc2xvdyk6CisgICAgVGVzdChmYXN0LCBzbG93KS5kb190ZXN0KCkKKworCitkZWYgZG9fYmVuY2htYXJrKHByb3RvY29sLCBpdGVycz01MDAwLCBza2lwX3Nsb3c9RmFsc2UpOgorICAgIHNldHVwID0gIiIiCitmcm9tIF9fbWFpbl9fIGltcG9ydCBobSwgcnMsIFREZXZOdWxsVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC57MH0gaW1wb3J0IHswfXsxfQordHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCitwcm90ID0gezB9ezF9KHRyYW5zezJ9KQorIiIiCisKKyAgICBzZXR1cF9mYXN0ID0gc2V0dXAuZm9ybWF0KHByb3RvY29sLCAnQWNjZWxlcmF0ZWQnLCAnLCBmYWxsYmFjaz1GYWxzZScpCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgc2V0dXBfc2xvdyA9IHNldHVwLmZvcm1hdChwcm90b2NvbCwgJycsICcnKQorCisgICAgcHJpbnQoIlN0YXJ0aW5nIEJlbmNobWFya3MiKQorCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgcHJpbnQoIkhvbHlNb2xleSBTdGFuZGFyZCA9ICVmIiAlCisgICAgICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIHByaW50KCJIb2x5TW9sZXkgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHByaW50KCJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUKKyAgICAgICAgICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpKQorCisgICAgcHJpbnQoIkZhc3RTdHJ1Y3QgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHByaW50KCdUZXN0aW5nIFRCaW5hcnlBY2NlbGVyYXRlZCcpCisgICAgZG9fdGVzdChUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwgVEJpbmFyeVByb3RvY29sKQorICAgIGRvX2JlbmNobWFyaygnVEJpbmFyeVByb3RvY29sJykKKyAgICBwcmludCgnVGVzdGluZyBUQ29tcGFjdEFjY2VsZXJhdGVkJykKKyAgICBkb190ZXN0KFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgVENvbXBhY3RQcm90b2NvbCkKKyAgICBkb19iZW5jaG1hcmsoJ1RDb21wYWN0UHJvdG9jb2wnKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9NYWtlZmlsZS5hbSBiL3Rlc3QvcHkvTWFrZWZpbGUuYW0KaW5kZXggNjNiN2E4OS4uODI5NjIwMCAxMDA2NDQKLS0tIGEvdGVzdC9weS9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3B5L01ha2VmaWxlLmFtCkBAIC0xNiwzMyArMTYsODIgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKK0FVVE9NQUtFX09QVElPTlMgPSBzZXJpYWwtdGVzdHMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLXB5X3VuaXRfdGVzdHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgU2VyaWFsaXphdGlvblRlc3QucHkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVGVzdEVvZi5weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVGVzdFN5bnRheC5weSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUnVuQ2xpZW50U2VydmVyLnB5CitweV91bml0X3Rlc3RzID0gUnVuQ2xpZW50U2VydmVyLnB5CiAKIHRocmlmdF9nZW4gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZ2VuLXB5L1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKLSAgICAgICAgZ2VuLXB5L0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5CisgICAgICAgIGdlbi1weS9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5L1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZGVmYXVsdC9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktc2xvdHMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL1RocmlmdFRlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9SZWN1cnNpdmUvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pYy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCisgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weQorCisKK3ByZWNyb3NzOiAkKHRocmlmdF9nZW4pCitCVUlMVF9TT1VSQ0VTID0gJCh0aHJpZnRfZ2VuKQogCiBoZWxwZXJfc2NyaXB0cz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRlc3RDbGllbnQucHkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFRlc3RTZXJ2ZXIucHkKIAogY2hlY2tfU0NSSVBUUz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAkKHRocmlmdF9nZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAkKHRocmlmdF9nZW4pIFwKICAgICAgICAgJChweV91bml0X3Rlc3RzKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgJChoZWxwZXJfc2NyaXB0cykKIAogVEVTVFM9ICQocHlfdW5pdF90ZXN0cykKIAogCi1nZW4tcHkvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gcHkgJDwKK2dlbi1weS8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gcHkgICQ8CisKK2dlbi1weS1kZWZhdWx0LyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LWRlZmF1bHQgfHwgJChNS0RJUl9QKSBnZW4tcHktZGVmYXVsdAorCSQoVEhSSUZUKSAtLWdlbiBweSAtb3V0IGdlbi1weS1kZWZhdWx0ICQ8CisKK2dlbi1weS1zbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1zbG90cyB8fCAkKE1LRElSX1ApIGdlbi1weS1zbG90cworCSQoVEhSSUZUKSAtLWdlbiBweTpzbG90cyAtb3V0IGdlbi1weS1zbG90cyAkPAorCitnZW4tcHktb2xkc3R5bGUvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktb2xkc3R5bGUgfHwgJChNS0RJUl9QKSBnZW4tcHktb2xkc3R5bGUKKwkkKFRIUklGVCkgLS1nZW4gcHk6b2xkX3N0eWxlIC1vdXQgZ2VuLXB5LW9sZHN0eWxlICQ8CisKK2dlbi1weS1ub191dGY4c3RyaW5ncy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1ub191dGY4c3RyaW5ncyB8fCAkKE1LRElSX1ApIGdlbi1weS1ub191dGY4c3RyaW5ncworCSQoVEhSSUZUKSAtLWdlbiBweTpub191dGY4c3RyaW5ncyAtb3V0IGdlbi1weS1ub191dGY4c3RyaW5ncyAkPAorCitnZW4tcHktZHluYW1pYy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1keW5hbWljIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWMKKwkkKFRIUklGVCkgLS1nZW4gcHk6ZHluYW1pYyAtb3V0IGdlbi1weS1keW5hbWljICQ8CisKK2dlbi1weS1keW5hbWljc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktZHluYW1pY3Nsb3RzIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWNzbG90cworCSQoVEhSSUZUKSAtLWdlbiBweTpkeW5hbWljLHNsb3RzIC1vdXQgZ2VuLXB5LWR5bmFtaWNzbG90cyAkPAogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtciBnZW4tcHkKKwkkKFJNKSAtciBnZW4tcHkgZ2VuLXB5LXNsb3RzIGdlbi1weS1kZWZhdWx0IGdlbi1weS1vbGRzdHlsZSBnZW4tcHktbm9fdXRmOHN0cmluZ3MgZ2VuLXB5LWR5bmFtaWMgZ2VuLXB5LWR5bmFtaWNzbG90cwpkaWZmIC0tZ2l0IGEvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQppbmRleCAyYmQ2MDk0Li41NmE0MDhlIDEwMDc1NQotLS0gYS90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQorKysgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQpAQCAtMTksNDIgKzE5LDMwNSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHRpbWUKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBjb3B5CiBpbXBvcnQgb3MKIGltcG9ydCBzaWduYWwKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCisKK2Zyb20gdXRpbCBpbXBvcnQgbG9jYWxfbGlicGF0aAorCitTQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisKK1NDUklQVFMgPSBbCisgICAgJ0Zhc3RiaW5hcnlUZXN0LnB5JywKKyAgICAnVGVzdEZyb3plbi5weScsCisgICAgJ1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weScsCisgICAgJ1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5JywKKyAgICAnU2VyaWFsaXphdGlvblRlc3QucHknLAorICAgICdUZXN0RW9mLnB5JywKKyAgICAnVGVzdFN5bnRheC5weScsCisgICAgJ1Rlc3RTb2NrZXQucHknLAorXQorRlJBTUVEID0gWyJUTm9uYmxvY2tpbmdTZXJ2ZXIiXQorU0tJUF9aTElCID0gWydUTm9uYmxvY2tpbmdTZXJ2ZXInLCAnVEh0dHBTZXJ2ZXInXQorU0tJUF9TU0wgPSBbJ1RIdHRwU2VydmVyJ10KK0VYVFJBX0RFTEFZID0gZGljdChUUHJvY2Vzc1Bvb2xTZXJ2ZXI9NS41KQorCitQUk9UT1MgPSBbCisgICAgJ2FjY2VsJywKKyAgICAnYWNjZWxjJywKKyAgICAnYmluYXJ5JywKKyAgICAnY29tcGFjdCcsCisgICAgJ2pzb24nLAorICAgICdoZWFkZXInLAorXQorCisKK2RlZiBkZWZhdWx0X3NlcnZlcnMoKToKKyAgICBzZXJ2ZXJzID0gWworICAgICAgICAnVFNpbXBsZVNlcnZlcicsCisgICAgICAgICdUVGhyZWFkZWRTZXJ2ZXInLAorICAgICAgICAnVFRocmVhZFBvb2xTZXJ2ZXInLAorICAgICAgICAnVE5vbmJsb2NraW5nU2VydmVyJywKKyAgICAgICAgJ1RIdHRwU2VydmVyJywKKyAgICBdCisgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnOgorICAgICAgICBzZXJ2ZXJzLmFwcGVuZCgnVFByb2Nlc3NQb29sU2VydmVyJykKKyAgICAgICAgc2VydmVycy5hcHBlbmQoJ1RGb3JraW5nU2VydmVyJykKKyAgICByZXR1cm4gc2VydmVycworCiAKIGRlZiByZWxmaWxlKGZuYW1lKToKLSAgICByZXR1cm4gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIGZuYW1lKQorICAgIHJldHVybiBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgZm5hbWUpCiAKLUZSQU1FRCA9IFsiVE5vbmJsb2NraW5nU2VydmVyIl0KIAotZGVmIHJ1blRlc3Qoc2VydmVyX2NsYXNzKToKLSAgICBwcmludCAiVGVzdGluZyAiLCBzZXJ2ZXJfY2xhc3MKLSAgICBzZXJ2ZXJwcm9jID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoIlRlc3RTZXJ2ZXIucHkiKSwgc2VydmVyX2NsYXNzXSkKLSAgICB0aW1lLnNsZWVwKDAuMjUpCitkZWYgc2V0dXBfcHlwYXRoKGxpYmRpciwgZ2VuZGlyKToKKyAgICBkaXJzID0gW2xpYmRpciwgZ2VuZGlyXQorICAgIGVudiA9IGNvcHkuZGVlcGNvcHkob3MuZW52aXJvbikKKyAgICBweXBhdGggPSBlbnYuZ2V0KCdQWVRIT05QQVRIJywgTm9uZSkKKyAgICBpZiBweXBhdGg6CisgICAgICAgIGRpcnMuYXBwZW5kKHB5cGF0aCkKKyAgICBlbnZbJ1BZVEhPTlBBVEgnXSA9IG9zLnBhdGhzZXAuam9pbihkaXJzKQorICAgIGlmIGdlbmRpci5lbmRzd2l0aCgnZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzJyk6CisgICAgICAgIGVudlsnVEhSSUZUX1RFU1RfUFlfTk9fVVRGOFNUUklOR1MnXSA9ICcxJworICAgIHJldHVybiBlbnYKKworCitkZWYgcnVuU2NyaXB0VGVzdChsaWJkaXIsIGdlbmJhc2UsIGdlbnB5ZGlyLCBzY3JpcHQpOgorICAgIGVudiA9IHNldHVwX3B5cGF0aChsaWJkaXIsIG9zLnBhdGguam9pbihnZW5iYXNlLCBnZW5weWRpcikpCisgICAgc2NyaXB0X2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoc2NyaXB0KV0KKyAgICBwcmludCgnXG5UZXN0aW5nIHNjcmlwdDogJXNcbi0tLS0nICUgKCcgJy5qb2luKHNjcmlwdF9hcmdzKSkpCisgICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKHNjcmlwdF9hcmdzLCBlbnY9ZW52KQorICAgIGlmIHJldCAhPSAwOgorICAgICAgICBwcmludCgnKioqIEZBSUxFRCAqKionLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCdMSUJESVI6ICVzJyAlIGxpYmRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnUFlfR0VOOiAlcycgJSBnZW5weWRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnU0NSSVBUOiAlcycgJSBzY3JpcHQsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJTY3JpcHQgc3VicHJvY2VzcyBmYWlsZWQsIHJldGNvZGU9JWQsIGFyZ3M6ICVzIiAlIChyZXQsICcgJy5qb2luKHNjcmlwdF9hcmdzKSkpCisKKworZGVmIHJ1blNlcnZpY2VUZXN0KGxpYmRpciwgZ2VuYmFzZSwgZ2VucHlkaXIsIHNlcnZlcl9jbGFzcywgcHJvdG8sIHBvcnQsIHVzZV96bGliLCB1c2Vfc3NsLCB2ZXJib3NlKToKKyAgICBlbnYgPSBzZXR1cF9weXBhdGgobGliZGlyLCBvcy5wYXRoLmpvaW4oZ2VuYmFzZSwgZ2VucHlkaXIpKQorICAgICMgQnVpbGQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIHNlcnZlcl9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0U2VydmVyLnB5JyldCisgICAgY2xpX2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoJ1Rlc3RDbGllbnQucHknKV0KKyAgICBmb3Igd2hpY2ggaW4gKHNlcnZlcl9hcmdzLCBjbGlfYXJncyk6CisgICAgICAgIHdoaWNoLmFwcGVuZCgnLS1wcm90b2NvbD0lcycgJSBwcm90bykgICMgYWNjZWwsIGJpbmFyeSwgY29tcGFjdCBvciBqc29uCisgICAgICAgIHdoaWNoLmFwcGVuZCgnLS1wb3J0PSVkJyAlIHBvcnQpICAjIGRlZmF1bHQgdG8gOTA5MAorICAgICAgICBpZiB1c2VfemxpYjoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLS16bGliJykKKyAgICAgICAgaWYgdXNlX3NzbDoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLS1zc2wnKQorICAgICAgICBpZiB2ZXJib3NlID09IDA6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy1xJykKKyAgICAgICAgaWYgdmVyYm9zZSA9PSAyOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctdicpCisgICAgIyBzZXJ2ZXItc3BlY2lmaWMgb3B0aW9uIHRvIHNlbGVjdCBzZXJ2ZXIgY2xhc3MKKyAgICBzZXJ2ZXJfYXJncy5hcHBlbmQoc2VydmVyX2NsYXNzKQorICAgICMgY2xpZW50LXNwZWNpZmljIGNtZGxpbmUgb3B0aW9ucworICAgIGlmIHNlcnZlcl9jbGFzcyBpbiBGUkFNRUQ6CisgICAgICAgIGNsaV9hcmdzLmFwcGVuZCgnLS10cmFuc3BvcnQ9ZnJhbWVkJykKKyAgICBlbHNlOgorICAgICAgICBjbGlfYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PWJ1ZmZlcmVkJykKKyAgICBpZiBzZXJ2ZXJfY2xhc3MgPT0gJ1RIdHRwU2VydmVyJzoKKyAgICAgICAgY2xpX2FyZ3MuYXBwZW5kKCctLWh0dHA9LycpCisgICAgaWYgdmVyYm9zZSA+IDA6CisgICAgICAgIHByaW50KCdUZXN0aW5nIHNlcnZlciAlczogJXMnICUgKHNlcnZlcl9jbGFzcywgJyAnLmpvaW4oc2VydmVyX2FyZ3MpKSkKKyAgICBzZXJ2ZXJwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZXJ2ZXJfYXJncywgZW52PWVudikKKworICAgIGRlZiBlbnN1cmVTZXJ2ZXJBbGl2ZSgpOgorICAgICAgICBpZiBzZXJ2ZXJwcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50KCgnRkFJTDogU2VydmVyIHByb2Nlc3MgKCVzKSBmYWlsZWQgd2l0aCByZXRjb2RlICVkJykKKyAgICAgICAgICAgICAgICAgICUgKCcgJy5qb2luKHNlcnZlcl9hcmdzKSwgc2VydmVycHJvYy5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignU2VydmVyIHN1YnByb2Nlc3MgJXMgZGllZCwgYXJnczogJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VydmVyX2NsYXNzLCAnICcuam9pbihzZXJ2ZXJfYXJncykpKQorCisgICAgIyBXYWl0IGZvciB0aGUgc2VydmVyIHRvIHN0YXJ0IGFjY2VwdGluZyBjb25uZWN0aW9ucyBvbiB0aGUgZ2l2ZW4gcG9ydC4KKyAgICBzbGVlcF90aW1lID0gMC4xICAjIFNlY29uZHMKKyAgICBtYXhfYXR0ZW1wdHMgPSAxMDAKKyAgICBhdHRlbXB0ID0gMAorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHNvY2s0ID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNvY2s2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVDYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNvY2s0LmNvbm5lY3RfZXgoKCcxMjcuMC4wLjEnLCBwb3J0KSkgPT0gMCBcCisgICAgICAgICAgICAgICAgICAgIG9yIHNvY2s2LmNvbm5lY3RfZXgoKCc6OjEnLCBwb3J0KSkgPT0gMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgYXR0ZW1wdCArPSAxCisgICAgICAgICAgICBpZiBhdHRlbXB0ID49IG1heF9hdHRlbXB0czoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRlc3RTZXJ2ZXIgbm90IHJlYWR5IG9uIHBvcnQgJWQgYWZ0ZXIgJS4yZiBzZWNvbmRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChwb3J0LCBzbGVlcF90aW1lICogYXR0ZW1wdCkpCisgICAgICAgICAgICBlbnN1cmVTZXJ2ZXJBbGl2ZSgpCisgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3RpbWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrNC5jbG9zZSgpCisgICAgICAgICAgICBzb2NrNi5jbG9zZSgpCisKICAgICB0cnk6Ci0gICAgICAgIGFyZ3YgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoIlRlc3RDbGllbnQucHkiKV0KLSAgICAgICAgaWYgc2VydmVyX2NsYXNzIGluIEZSQU1FRDoKLSAgICAgICAgICAgIGFyZ3YuYXBwZW5kKCctLWZyYW1lZCcpCi0gICAgICAgIGlmIHNlcnZlcl9jbGFzcyA9PSAnVEh0dHBTZXJ2ZXInOgotICAgICAgICAgICAgYXJndi5hcHBlbmQoJy0taHR0cD0vJykKLSAgICAgICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKGFyZ3YpCisgICAgICAgIGlmIHZlcmJvc2UgPiAwOgorICAgICAgICAgICAgcHJpbnQoJ1Rlc3RpbmcgY2xpZW50OiAlcycgJSAoJyAnLmpvaW4oY2xpX2FyZ3MpKSkKKyAgICAgICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKGNsaV9hcmdzLCBlbnY9ZW52KQogICAgICAgICBpZiByZXQgIT0gMDoKLSAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic3VicHJvY2VzcyBmYWlsZWQiKQorICAgICAgICAgICAgcHJpbnQoJyoqKiBGQUlMRUQgKioqJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgcHJpbnQoJ0xJQkRJUjogJXMnICUgbGliZGlyLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBwcmludCgnUFlfR0VOOiAlcycgJSBnZW5weWRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDbGllbnQgc3VicHJvY2VzcyBmYWlsZWQsIHJldGNvZGU9JWQsIGFyZ3M6ICVzIiAlIChyZXQsICcgJy5qb2luKGNsaV9hcmdzKSkpCiAgICAgZmluYWxseToKLSAgICAgICAgIyBmaXhtZTogc2hvdWxkIGNoZWNrIHRoYXQgc2VydmVyIGRpZG4ndCBkaWUKLSAgICAgICAgb3Mua2lsbChzZXJ2ZXJwcm9jLnBpZCwgc2lnbmFsLlNJR0tJTEwpCisgICAgICAgICMgY2hlY2sgdGhhdCBzZXJ2ZXIgZGlkbid0IGRpZQorICAgICAgICBlbnN1cmVTZXJ2ZXJBbGl2ZSgpCisgICAgICAgIGV4dHJhX3NsZWVwID0gRVhUUkFfREVMQVkuZ2V0KHNlcnZlcl9jbGFzcywgMCkKKyAgICAgICAgaWYgZXh0cmFfc2xlZXAgPiAwIGFuZCB2ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdHaXZpbmcgJXMgKHByb3RvPSVzLHpsaWI9JXMsc3NsPSVzKSBhbiBleHRyYSAlZCBzZWNvbmRzIGZvciBjaGlsZCcKKyAgICAgICAgICAgICAgICAgICdwcm9jZXNzZXMgdG8gdGVybWluYXRlIHZpYSBhbGFybScKKyAgICAgICAgICAgICAgICAgICUgKHNlcnZlcl9jbGFzcywgcHJvdG8sIHVzZV96bGliLCB1c2Vfc3NsLCBleHRyYV9zbGVlcCkpCisgICAgICAgICAgICB0aW1lLnNsZWVwKGV4dHJhX3NsZWVwKQorICAgICAgICBzaWcgPSBzaWduYWwuU0lHS0lMTCBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cycgZWxzZSBzaWduYWwuU0lHQUJSVAorICAgICAgICBvcy5raWxsKHNlcnZlcnByb2MucGlkLCBzaWcpCisgICAgICAgIHNlcnZlcnByb2Mud2FpdCgpCiAKLSAgICAjIHdhaXQgZm9yIHNodXRkb3duCi0gICAgdGltZS5zbGVlcCgxKQogCi1tYXAocnVuVGVzdCwgWwotICAiVFNpbXBsZVNlcnZlciIsCi0gICJUVGhyZWFkZWRTZXJ2ZXIiLAotICAiVFRocmVhZFBvb2xTZXJ2ZXIiLAotICAiVEZvcmtpbmdTZXJ2ZXIiLAotICAiVE5vbmJsb2NraW5nU2VydmVyIiwKLSAgIlRIdHRwU2VydmVyIiwKLSAgXSkKK2NsYXNzIFRlc3RDYXNlcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZW5iYXNlLCBsaWJkaXIsIHBvcnQsIGdlbmRpcnMsIHNlcnZlcnMsIHZlcmJvc2UpOgorICAgICAgICBzZWxmLmdlbmJhc2UgPSBnZW5iYXNlCisgICAgICAgIHNlbGYubGliZGlyID0gbGliZGlyCisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLmdlbmRpcnMgPSBnZW5kaXJzCisgICAgICAgIHNlbGYuc2VydmVycyA9IHNlcnZlcnMKKworICAgIGRlZiBkZWZhdWx0X2NvbmYoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnZ2VuZGlyJzogc2VsZi5nZW5kaXJzWzBdLAorICAgICAgICAgICAgJ3NlcnZlcic6IHNlbGYuc2VydmVyc1swXSwKKyAgICAgICAgICAgICdwcm90byc6IFBST1RPU1swXSwKKyAgICAgICAgICAgICd6bGliJzogRmFsc2UsCisgICAgICAgICAgICAnc3NsJzogRmFsc2UsCisgICAgICAgIH0KKworICAgIGRlZiBydW4oc2VsZiwgY29uZiwgdGVzdF9jb3VudCk6CisgICAgICAgIHdpdGhfemxpYiA9IGNvbmZbJ3psaWInXQorICAgICAgICB3aXRoX3NzbCA9IGNvbmZbJ3NzbCddCisgICAgICAgIHRyeV9zZXJ2ZXIgPSBjb25mWydzZXJ2ZXInXQorICAgICAgICB0cnlfcHJvdG8gPSBjb25mWydwcm90byddCisgICAgICAgIGdlbnB5ZGlyID0gY29uZlsnZ2VuZGlyJ10KKyAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIHRoZSBabGliIHRyYW5zcG9ydAorICAgICAgICBpZiB3aXRoX3psaWIgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9aTElCOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCBTU0wKKyAgICAgICAgaWYgd2l0aF9zc2wgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9TU0w6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdcblRlc3QgcnVuICMlZDogIChpbmNsdWRlcyAlcykgU2VydmVyPSVzLCAgUHJvdG89JXMsICB6bGliPSVzLCAgU1NMPSVzJworICAgICAgICAgICAgICAgICAgJSAodGVzdF9jb3VudCwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCkpCisgICAgICAgIHJ1blNlcnZpY2VUZXN0KHNlbGYubGliZGlyLCBzZWxmLmdlbmJhc2UsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHNlbGYucG9ydCwgd2l0aF96bGliLCB3aXRoX3NzbCwgc2VsZi52ZXJib3NlKQorICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgcHJpbnQoJ09LOiBGaW5pc2hlZCAoaW5jbHVkZXMgJXMpICAlcyAvICVzIHByb3RvIC8gemxpYj0lcyAvIFNTTD0lcy4gICAlZCBjb21iaW5hdGlvbnMgdGVzdGVkLicKKyAgICAgICAgICAgICAgICAgICUgKGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wsIHRlc3RfY291bnQpKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHRlc3RfZmVhdHVyZShzZWxmLCBuYW1lLCB2YWx1ZXMpOgorICAgICAgICB0ZXN0X2NvdW50ID0gMAorICAgICAgICBjb25mID0gc2VsZi5kZWZhdWx0X2NvbmYoKQorICAgICAgICBmb3IgdHJ5X3NlcnZlciBpbiB2YWx1ZXM6CisgICAgICAgICAgICBjb25mW25hbWVdID0gdHJ5X3NlcnZlcgorICAgICAgICAgICAgaWYgc2VsZi5ydW4oY29uZiwgdGVzdF9jb3VudCk6CisgICAgICAgICAgICAgICAgdGVzdF9jb3VudCArPSAxCisgICAgICAgIHJldHVybiB0ZXN0X2NvdW50CisKKyAgICBkZWYgcnVuX2FsbF90ZXN0cyhzZWxmKToKKyAgICAgICAgdGVzdF9jb3VudCA9IDAKKyAgICAgICAgZm9yIHRyeV9zZXJ2ZXIgaW4gc2VsZi5zZXJ2ZXJzOgorICAgICAgICAgICAgZm9yIGdlbnB5ZGlyIGluIHNlbGYuZ2VuZGlyczoKKyAgICAgICAgICAgICAgICBmb3IgdHJ5X3Byb3RvIGluIFBST1RPUzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIHdpdGhfemxpYiBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIHRoZSBabGliIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2l0aF96bGliIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfWkxJQjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHdpdGhfc3NsIGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIFNTTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdpdGhfc3NsIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfU1NMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnQgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdcblRlc3QgcnVuICMlZDogIChpbmNsdWRlcyAlcykgU2VydmVyPSVzLCAgUHJvdG89JXMsICB6bGliPSVzLCAgU1NMPSVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh0ZXN0X2NvdW50LCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TZXJ2aWNlVGVzdChzZWxmLmxpYmRpciwgc2VsZi5nZW5iYXNlLCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCBzZWxmLnBvcnQsIHdpdGhfemxpYiwgd2l0aF9zc2wpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ09LOiBGaW5pc2hlZCAoaW5jbHVkZXMgJXMpICAlcyAvICVzIHByb3RvIC8gemxpYj0lcyAvIFNTTD0lcy4gICAlZCBjb21iaW5hdGlvbnMgdGVzdGVkLicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCwgdGVzdF9jb3VudCkpCisgICAgICAgIHJldHVybiB0ZXN0X2NvdW50CisKKworZGVmIG1haW4oKToKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWFsbCcsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9J2FsbCcpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXJzJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXJzJywKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSdkZWZhdWx0LHNsb3RzLG9sZHN0eWxlLG5vX3V0ZjhzdHJpbmdzLGR5bmFtaWMsZHluYW1pY3Nsb3RzJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXJlY3RvcnkgZXh0ZW5zaW9ucyBmb3IgZ2VuZXJhdGVkIGNvZGUsIHVzZWQgYXMgc3VmZml4ZXMgZm9yIFwiZ2VuLXB5LSpcIiBhZGRlZCBzeXMucGF0aCBmb3IgaW5kaXZpZHVhbCB0ZXN0cycpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLCBkZWZhdWx0PTkwOTAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icG9ydCBudW1iZXIgZm9yIHNlcnZlciB0byBsaXN0ZW4gb24iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1MJywgJy0tbGliZGlyJywgZGVzdD0ibGliZGlyIiwgZGVmYXVsdD1sb2NhbF9saWJwYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZGlyZWN0b3J5IHBhdGggdGhhdCBjb250YWlucyBUaHJpZnQgUHl0aG9uIGxpYnJhcnkiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWdlbi1iYXNlJywgZGVzdD0iZ2VuX2Jhc2UiLCBkZWZhdWx0PVNDUklQVF9ESVIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZGlyZWN0b3J5IHBhdGggdGhhdCBjb250YWlucyBUaHJpZnQgUHl0aG9uIGxpYnJhcnkiKQorICAgIHBhcnNlci5zZXRfZGVmYXVsdHModmVyYm9zZT0xKQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBnZW5lcmF0ZWRfZGlycyA9IFtdCisgICAgZm9yIGdwX2RpciBpbiBvcHRpb25zLmdlbnB5ZGlycy5zcGxpdCgnLCcpOgorICAgICAgICBnZW5lcmF0ZWRfZGlycy5hcHBlbmQoJ2dlbi1weS0lcycgJSAoZ3BfZGlyKSkKKworICAgICMgY29tbWFuZGxpbmUgcGVybWl0cyBhIHNpbmdsZSBjbGFzcyBuYW1lIHRvIGJlIHNwZWNpZmllZCB0byBvdmVycmlkZSBTRVJWRVJTPVsuLi5dCisgICAgc2VydmVycyA9IGRlZmF1bHRfc2VydmVycygpCisgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgIGlmIGFyZ3NbMF0gaW4gc2VydmVyczoKKyAgICAgICAgICAgIHNlcnZlcnMgPSBhcmdzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgnVW5hdmFpbGFibGUgc2VydmVyIHR5cGUgIiVzIiwgcGxlYXNlIGNob29zZSBvbmUgb2Y6ICVzJyAlIChhcmdzWzBdLCBzZXJ2ZXJzKSkKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICB0ZXN0cyA9IFRlc3RDYXNlcyhvcHRpb25zLmdlbl9iYXNlLCBvcHRpb25zLmxpYmRpciwgb3B0aW9ucy5wb3J0LCBnZW5lcmF0ZWRfZGlycywgc2VydmVycywgb3B0aW9ucy52ZXJib3NlKQorCisgICAgIyBydW4gdGVzdHMgd2l0aG91dCBhIGNsaWVudC9zZXJ2ZXIgZmlyc3QKKyAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCisgICAgcHJpbnQoJyBFeGVjdXRpbmcgaW5kaXZpZHVhbCB0ZXN0IHNjcmlwdHMgd2l0aCB2YXJpb3VzIGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yaWVzJykKKyAgICBwcmludCgnIERpcmVjdG9yaWVzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihnZW5lcmF0ZWRfZGlycykpCisgICAgcHJpbnQoJyBTY3JpcHRzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihTQ1JJUFRTKSkKKyAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCisgICAgZm9yIGdlbnB5ZGlyIGluIGdlbmVyYXRlZF9kaXJzOgorICAgICAgICBmb3Igc2NyaXB0IGluIFNDUklQVFM6CisgICAgICAgICAgICBydW5TY3JpcHRUZXN0KG9wdGlvbnMubGliZGlyLCBvcHRpb25zLmdlbl9iYXNlLCBnZW5weWRpciwgc2NyaXB0KQorCisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorICAgIHByaW50KCcgRXhlY3V0aW5nIENsaWVudC9TZXJ2ZXIgdGVzdHMgd2l0aCB2YXJpb3VzIGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yaWVzJykKKyAgICBwcmludCgnIFNlcnZlcnMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKHNlcnZlcnMpKQorICAgIHByaW50KCcgRGlyZWN0b3JpZXMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKGdlbmVyYXRlZF9kaXJzKSkKKyAgICBwcmludCgnIFByb3RvY29scyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oUFJPVE9TKSkKKyAgICBwcmludCgnIE9wdGlvbnMgdG8gYmUgdGVzdGVkOiBaTElCKHllcy9ubyksIFNTTCh5ZXMvbm8pJykKKyAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCisKKyAgICBpZiBvcHRpb25zLmFsbDoKKyAgICAgICAgdGVzdHMucnVuX2FsbF90ZXN0cygpCisgICAgZWxzZToKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdnZW5kaXInLCBnZW5lcmF0ZWRfZGlycykKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdzZXJ2ZXInLCBzZXJ2ZXJzKQorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ3Byb3RvJywgUFJPVE9TKQorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ3psaWInLCBbRmFsc2UsIFRydWVdKQorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ3NzbCcsIFtGYWxzZSwgVHJ1ZV0pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5IGIvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weQppbmRleCBlMzcwOThiLi5lZjc5ODM1IDEwMDc1NQotLS0gYS90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5CisrKyBiL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkKQEAgLTE5LDEzNCArMTksNDM5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQorZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKAorICAgIEJvbmssCisgICAgQm9vbHMsCisgICAgTGFyZ2VEZWx0YXMsCisgICAgTGlzdEJvbmtzLAorICAgIE5lc3RlZExpc3RzQm9uaywKKyAgICBOZXN0ZWRMaXN0c0kzMngyLAorICAgIE5lc3RlZExpc3RzSTMyeDMsCisgICAgTmVzdGVkTWl4ZWR4MiwKKyAgICBOdW1iZXJ6LAorICAgIFZlcnNpb25pbmdUZXN0VjEsCisgICAgVmVyc2lvbmluZ1Rlc3RWMiwKKyAgICBYdHJ1Y3QsCisgICAgWHRydWN0MiwKKykKIAotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBSZWNUcmVlCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IFJlY0xpc3QKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgQ29SZWMKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgQ29SZWMyCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IFZlY3RvclRlc3QKK2Zyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCBDb21wYWN0UHJvdG9UZXN0U3RydWN0LCBFbXB0eQogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wsIFRDb21wYWN0UHJvdG9jb2wsIFRKU09OUHJvdG9jb2wKIGZyb20gdGhyaWZ0LlRTZXJpYWxpemF0aW9uIGltcG9ydCBzZXJpYWxpemUsIGRlc2VyaWFsaXplCitpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0aW1lCisKIAogY2xhc3MgQWJzdHJhY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICBzZWxmLnYxb2JqID0gVmVyc2lvbmluZ1Rlc3RWMSgKLSAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAotICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCi0gICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCi0gICAgICAgICAgKQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi52MW9iaiA9IFZlcnNpb25pbmdUZXN0VjEoCisgICAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAorICAgICAgICAgICAgb2xkX3N0cmluZz0nYWFhJywKKyAgICAgICAgICAgIGVuZF9pbl9ib3RoPTU0MzIxLAorICAgICAgICApCiAKLSAgICAgIHNlbGYudjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAotICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCi0gICAgICAgICAgbmV3aW50PTEsCi0gICAgICAgICAgbmV3Ynl0ZT0yLAotICAgICAgICAgIG5ld3Nob3J0PTMsCi0gICAgICAgICAgbmV3bG9uZz00LAotICAgICAgICAgIG5ld2RvdWJsZT01LjAsCi0gICAgICAgICAgbmV3c3RydWN0PUJvbmsobWVzc2FnZT0iSGVsbG8hIiwgdHlwZT0xMjMpLAotICAgICAgICAgIG5ld2xpc3Q9WzcsOCw5XSwKLSAgICAgICAgICBuZXdzZXQ9WzQyLDEsOF0sCi0gICAgICAgICAgbmV3bWFwPXsxOjIsMjozfSwKLSAgICAgICAgICBuZXdzdHJpbmc9IkhvbGEhIiwKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKLSAgICAgICAgICApCisgICAgICAgIHNlbGYudjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG5ld2ludD0xLAorICAgICAgICAgICAgbmV3Ynl0ZT0yLAorICAgICAgICAgICAgbmV3c2hvcnQ9MywKKyAgICAgICAgICAgIG5ld2xvbmc9NCwKKyAgICAgICAgICAgIG5ld2RvdWJsZT01LjAsCisgICAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCisgICAgICAgICAgICBuZXdsaXN0PVs3LCA4LCA5XSwKKyAgICAgICAgICAgIG5ld3NldD1zZXQoWzQyLCAxLCA4XSksCisgICAgICAgICAgICBuZXdtYXA9ezE6IDIsIDI6IDN9LAorICAgICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKKyAgICAgICAgKQogCi0gIGRlZiBfc2VyaWFsaXplKHNlbGYsIG9iaik6Ci0gICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQotICAgICAgb2JqLndyaXRlKHByb3QpCi0gICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmJvb2xzID0gQm9vbHMoaW1fdHJ1ZT1UcnVlLCBpbV9mYWxzZT1GYWxzZSkKKyAgICAgICAgc2VsZi5ib29sc19mbGlwcGVkID0gQm9vbHMoaW1fdHJ1ZT1GYWxzZSwgaW1fZmFsc2U9VHJ1ZSkKIAotICBkZWYgX2Rlc2VyaWFsaXplKHNlbGYsIG9ianR5cGUsIGRhdGEpOgotICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCi0gICAgICByZXQgPSBvYmp0eXBlKCkKLSAgICAgIHJldC5yZWFkKHByb3QpCi0gICAgICByZXR1cm4gcmV0CisgICAgICAgIHNlbGYubGFyZ2VfZGVsdGFzID0gTGFyZ2VEZWx0YXMoCisgICAgICAgICAgICBiMT1zZWxmLmJvb2xzLAorICAgICAgICAgICAgYjEwPXNlbGYuYm9vbHNfZmxpcHBlZCwKKyAgICAgICAgICAgIGIxMDA9c2VsZi5ib29scywKKyAgICAgICAgICAgIGNoZWNrX3RydWU9VHJ1ZSwKKyAgICAgICAgICAgIGIxMDAwPXNlbGYuYm9vbHNfZmxpcHBlZCwKKyAgICAgICAgICAgIGNoZWNrX2ZhbHNlPUZhbHNlLAorICAgICAgICAgICAgdmVydHdvMjAwMD1WZXJzaW9uaW5nVGVzdFYyKG5ld3N0cnVjdD1Cb25rKG1lc3NhZ2U9J1dvcmxkIScsIHR5cGU9MzE0KSksCisgICAgICAgICAgICBhX3NldDI1MDA9c2V0KFsnbGF6eScsICdicm93bicsICdjb3cnXSksCisgICAgICAgICAgICB2ZXJ0d28zMDAwPVZlcnNpb25pbmdUZXN0VjIobmV3c2V0PXNldChbMiwgMywgNSwgNywgMTFdKSksCisgICAgICAgICAgICBiaWdfbnVtYmVycz1bMiAqKiA4LCAyICoqIDE2LCAyICoqIDMxIC0gMSwgLSgyICoqIDMxIC0gMSldCisgICAgICAgICkKIAotICBkZWYgdGVzdEZvcndhcmRzKHNlbGYpOgotICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmJlZ2luX2luX2JvdGgsIHNlbGYudjFvYmouYmVnaW5faW5fYm90aCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52MW9iai5lbmRfaW5fYm90aCkKKyAgICAgICAgc2VsZi5jb21wYWN0X3N0cnVjdCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoCisgICAgICAgICAgICBhX2J5dGU9MTI3LAorICAgICAgICAgICAgYV9pMTY9MzIwMDAsCisgICAgICAgICAgICBhX2kzMj0xMDAwMDAwMDAwLAorICAgICAgICAgICAgYV9pNjQ9MHhmZmZmZmZmZmZmLAorICAgICAgICAgICAgYV9kb3VibGU9NS42Nzg5LAorICAgICAgICAgICAgYV9zdHJpbmc9Im15IHN0cmluZyIsCisgICAgICAgICAgICB0cnVlX2ZpZWxkPVRydWUsCisgICAgICAgICAgICBmYWxzZV9maWVsZD1GYWxzZSwKKyAgICAgICAgICAgIGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpLAorICAgICAgICAgICAgYnl0ZV9saXN0PVstMTI3LCAtMSwgMCwgMSwgMTI3XSwKKyAgICAgICAgICAgIGkxNl9saXN0PVstMSwgMCwgMSwgMHg3ZmZmXSwKKyAgICAgICAgICAgIGkzMl9saXN0PVstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHg3ZmZmZmZmZl0sCisgICAgICAgICAgICBpNjRfbGlzdD1bLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0sCisgICAgICAgICAgICBkb3VibGVfbGlzdD1bMC4xLCAwLjIsIDAuM10sCisgICAgICAgICAgICBzdHJpbmdfbGlzdD1bImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCJdLAorICAgICAgICAgICAgYm9vbGVhbl9saXN0PVtUcnVlLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKKyAgICAgICAgICAgIHN0cnVjdF9saXN0PVtFbXB0eSgpLCBFbXB0eSgpXSwKKyAgICAgICAgICAgIGJ5dGVfc2V0PXNldChbLTEyNywgLTEsIDAsIDEsIDEyN10pLAorICAgICAgICAgICAgaTE2X3NldD1zZXQoWy0xLCAwLCAxLCAweDdmZmZdKSwKKyAgICAgICAgICAgIGkzMl9zZXQ9c2V0KFsxLCAyLCAzXSksCisgICAgICAgICAgICBpNjRfc2V0PXNldChbLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0pLAorICAgICAgICAgICAgZG91YmxlX3NldD1zZXQoWzAuMSwgMC4yLCAwLjNdKSwKKyAgICAgICAgICAgIHN0cmluZ19zZXQ9c2V0KFsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0pLAorICAgICAgICAgICAgYm9vbGVhbl9zZXQ9c2V0KFtUcnVlLCBGYWxzZV0pLAorICAgICAgICAgICAgIyBzdHJ1Y3Rfc2V0PXNldChbRW1wdHkoKV0pLCAjIHVuaGFzaGFibGUgaW5zdGFuY2UKKyAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA9ezE6IDJ9LAorICAgICAgICAgICAgaTE2X2J5dGVfbWFwPXsxOiAxLCAtMTogMSwgMHg3ZmZmOiAxfSwKKyAgICAgICAgICAgIGkzMl9ieXRlX21hcD17MTogMSwgLTE6IDEsIDB4N2ZmZmZmZmY6IDF9LAorICAgICAgICAgICAgaTY0X2J5dGVfbWFwPXswOiAxLCAxOiAxLCAtMTogMSwgMHg3ZmZmZmZmZmZmZmZmZmZmOiAxfSwKKyAgICAgICAgICAgIGRvdWJsZV9ieXRlX21hcD17LTEuMTogMSwgMS4xOiAxfSwKKyAgICAgICAgICAgIHN0cmluZ19ieXRlX21hcD17ImZpcnN0IjogMSwgInNlY29uZCI6IDIsICJ0aGlyZCI6IDMsICIiOiAwfSwKKyAgICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA9e1RydWU6IDEsIEZhbHNlOiAwfSwKKyAgICAgICAgICAgIGJ5dGVfaTE2X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZn0sCisgICAgICAgICAgICBieXRlX2kzMl9tYXA9ezE6IDEsIDI6IC0xLCAzOiAweDdmZmZmZmZmfSwKKyAgICAgICAgICAgIGJ5dGVfaTY0X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZmZmZmZmZmZmZmZmZn0sCisgICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA9ezE6IDAuMSwgMjogLTAuMSwgMzogMTAwMDAwMC4xfSwKKyAgICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcD17MTogIiIsIDI6ICJibGFoIiwgMzogImxvb29vb29vb29vb29vb25nIHN0cmluZyJ9LAorICAgICAgICAgICAgYnl0ZV9ib29sZWFuX21hcD17MTogVHJ1ZSwgMjogRmFsc2V9LAorICAgICAgICAgICAgIyBsaXN0X2J5dGVfbWFwICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBzZXRfYnl0ZV9tYXA9e3NldChbMSwgMiwgM10pIDogMSwgc2V0KFswLCAxXSkgOiAyLCBzZXQoW10pIDogMH0sICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBtYXBfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCisgICAgICAgICAgICBieXRlX21hcF9tYXA9ezA6IHt9LCAxOiB7MTogMX0sIDI6IHsxOiAxLCAyOiAyfX0sCisgICAgICAgICAgICBieXRlX3NldF9tYXA9ezA6IHNldChbXSksIDE6IHNldChbMV0pLCAyOiBzZXQoWzEsIDJdKX0sCisgICAgICAgICAgICBieXRlX2xpc3RfbWFwPXswOiBbXSwgMTogWzFdLCAyOiBbMSwgMl19LAorICAgICAgICApCiAKLSAgZGVmIHRlc3RCYWNrd2FyZHMoc2VsZik6Ci0gICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52Mm9iai5iZWdpbl9pbl9ib3RoKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmVuZF9pbl9ib3RoLCBzZWxmLnYyb2JqLmVuZF9pbl9ib3RoKQorICAgICAgICBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MiA9IE5lc3RlZExpc3RzSTMyeDIoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgWzEsIDEsIDJdLAorICAgICAgICAgICAgICAgIFsyLCA3LCA5XSwKKyAgICAgICAgICAgICAgICBbMywgNSwgOF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2kzMngzID0gTmVzdGVkTGlzdHNJMzJ4MygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsyLCA3LCA5XSwKKyAgICAgICAgICAgICAgICAgICAgWzMsIDUsIDhdCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsxLCAxLCAyXSwKKyAgICAgICAgICAgICAgICAgICAgWzEsIDQsIDldCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5uZXN0ZWRfbWl4ZWR4MiA9IE5lc3RlZE1peGVkeDIoaW50X3NldF9saXN0PVsKKyAgICAgICAgICAgIHNldChbMSwgMiwgM10pLAorICAgICAgICAgICAgc2V0KFsxLCA0LCA5XSksCisgICAgICAgICAgICBzZXQoWzEsIDIsIDMsIDUsIDgsIDEzLCAyMV0pLAorICAgICAgICAgICAgc2V0KFstMSwgMCwgMV0pCisgICAgICAgIF0sCisgICAgICAgICAgICAjIG5vdGUsIHRoZSBzZXRzIGJlbG93IGFyZSBzZXRzIG9mIGNoYXJzLCBzaW5jZSB0aGUgc3RyaW5ncyBhcmUgaXRlcmF0ZWQKKyAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0PXsxMDogc2V0KCdhYmMnKSwgMjA6IHNldCgnZGVmJyksIDMwOiBzZXQoJ0dISScpfSwKKyAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9WworICAgICAgICAgICAgICAgIHsxMDogc2V0KCdhYmMnKSwgMjA6IHNldCgnZGVmJyksIDMwOiBzZXQoJ0dISScpfSwKKyAgICAgICAgICAgICAgICB7MTAwOiBzZXQoJ2xtbicpLCAyMDA6IHNldCgnb3BxJyksIDMwMDogc2V0KCdSU1QnKX0sCisgICAgICAgICAgICAgICAgezEwMDA6IHNldCgndXZ3JyksIDIwMDA6IHNldCgnd3h5JyksIDMwMDA6IHNldCgnWFlaJyl9XQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uayA9IE5lc3RlZExpc3RzQm9uaygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQSBmaXJzdCcsIHR5cGU9MSksCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgc2Vjb25kJywgdHlwZT0xKQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEIgZmlyc3QnLCB0eXBlPTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIHNlY29uZCcsIHR5cGU9MikKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYubGlzdF9ib25rcyA9IExpc3RCb25rcygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEnLCB0eXBlPTEpLAorICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQicsIHR5cGU9MiksCisgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBDJywgdHlwZT0wKQorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIG9iai53cml0ZShwcm90KQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQorCisgICAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKKyAgICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCisgICAgICAgIHJldCA9IG9ianR5cGUoKQorICAgICAgICByZXQucmVhZChwcm90KQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgdGVzdEZvcndhcmRzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYxb2JqLmJlZ2luX2luX2JvdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52MW9iai5lbmRfaW5fYm90aCkKKworICAgIGRlZiB0ZXN0QmFja3dhcmRzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYyb2JqLmJlZ2luX2luX2JvdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52Mm9iai5lbmRfaW5fYm90aCkKKworICAgIGRlZiB0ZXN0U2VyaWFsaXplVjEoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjEsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYxb2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLnYxb2JqKQorCisgICAgZGVmIHRlc3RTZXJpYWxpemVWMihzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjJvYmopCisKKyAgICBkZWYgdGVzdEJvb2xzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhzZWxmLmJvb2xzLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYuYm9vbHMsIHNlbGYudjFvYmopCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKEJvb2xzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5ib29scykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29scykKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzX2ZsaXBwZWQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuYm9vbHNfZmxpcHBlZCkKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLmJvb2xzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RMYXJnZURlbHRhcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxhcmdlIGZpZWxkIGRlbHRhcyAobWVhbmluZ2Z1bCBpbiBDb21wYWN0UHJvdG8gb25seSkKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTGFyZ2VEZWx0YXMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmxhcmdlX2RlbHRhcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5sYXJnZV9kZWx0YXMpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5sYXJnZV9kZWx0YXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzSTMyeDIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDMoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzSTMyeDMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19pMzJ4MykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZE1peGVkeDIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZE1peGVkeDIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9taXhlZHgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9taXhlZHgyKQorICAgICAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX21peGVkeDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzQm9uayhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNCb25rLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19ib25rKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RMaXN0Qm9ua3Moc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExpc3RCb25rcywgc2VsZi5fc2VyaWFsaXplKHNlbGYubGlzdF9ib25rcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5saXN0X2JvbmtzKQorICAgICAgICByZXAgPSByZXByKHNlbGYubGlzdF9ib25rcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0Q29tcGFjdFN0cnVjdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxhcmdlIGZpZWxkIGRlbHRhcyAobWVhbmluZ2Z1bCBpbiBDb21wYWN0UHJvdG8gb25seSkKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgc2VsZi5fc2VyaWFsaXplKHNlbGYuY29tcGFjdF9zdHJ1Y3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuY29tcGFjdF9zdHJ1Y3QpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5jb21wYWN0X3N0cnVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0SW50ZWdlckxpbWl0cyhzZWxmKToKKyAgICAgICAgaWYgKHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3lzLnZlcnNpb25faW5mb1sxXSA8PSA2KToKKyAgICAgICAgICAgIHByaW50KCdTa2lwcGluZyB0ZXN0SW50ZWdlckxpbWl0cyBmb3IgUHl0aG9uIDIuNicpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYmFkX3ZhbHVlcyA9IFtDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0xMjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0tMTI5KSwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTE2PTMyNzY4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kxNj0tMzI3NjkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMzI9MjE0NzQ4MzY0OCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMzI9LTIxNDc0ODM2NDkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9OTIyMzM3MjAzNjg1NDc3NTgwOCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9LTkyMjMzNzIwMzY4NTQ3NzU4MDkpCisgICAgICAgICAgICAgICAgICAgICAgXQorCisgICAgICAgIGZvciB2YWx1ZSBpbiBiYWRfdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBzZWxmLl9zZXJpYWxpemUsIHZhbHVlKQorCisgICAgZGVmIHRlc3RSZWNUcmVlKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgcmVjdXJzaXZlIHRyZWUgbm9kZSBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBmb3IgaWR4IGluIHJhbmdlKDEsIDUpOgorICAgICAgICAgICAgbm9kZSA9IFJlY1RyZWUoaXRlbT1pZHgsIGNoaWxkcmVuPU5vbmUpCisgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmQobm9kZSkKKworICAgICAgICBwYXJlbnQgPSBSZWNUcmVlKGl0ZW09MCwgY2hpbGRyZW49Y2hpbGRyZW4pCisgICAgICAgIHNlcmRlX3BhcmVudCA9IHNlbGYuX2Rlc2VyaWFsaXplKFJlY1RyZWUsIHNlbGYuX3NlcmlhbGl6ZShwYXJlbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBzZXJkZV9wYXJlbnQuaXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNCwgbGVuKHNlcmRlX3BhcmVudC5jaGlsZHJlbikpCisgICAgICAgIGZvciBjaGlsZCBpbiBzZXJkZV9wYXJlbnQuY2hpbGRyZW46CisgICAgICAgICAgICAjIENhbm5vdCB1c2UgYXNzZXJ0SXNJbnN0YW5jZSBpbiBweXRob24gMi42PworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoY2hpbGQsIFJlY1RyZWUpKQorCisgICAgZGVmIF9idWlsZExpbmtlZExpc3Qoc2VsZik6CisgICAgICAgIGhlYWQgPSBjdXIgPSBSZWNMaXN0KGl0ZW09MCkKKyAgICAgICAgZm9yIGlkeCBpbiByYW5nZSgxLCA1KToKKyAgICAgICAgICAgIG5vZGUgPSBSZWNMaXN0KGl0ZW09aWR4KQorICAgICAgICAgICAgY3VyLm5leHRpdGVtID0gbm9kZQorICAgICAgICAgICAgY3VyID0gbm9kZQorICAgICAgICByZXR1cm4gaGVhZAorCisgICAgZGVmIF9jb2xsYXBzZUxpbmtlZExpc3Qoc2VsZiwgaGVhZCk6CisgICAgICAgIG91dF9saXN0ID0gW10KKyAgICAgICAgY3VyID0gaGVhZAorICAgICAgICB3aGlsZSBjdXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvdXRfbGlzdC5hcHBlbmQoY3VyLml0ZW0pCisgICAgICAgICAgICBjdXIgPSBjdXIubmV4dGl0ZW0KKyAgICAgICAgcmV0dXJuIG91dF9saXN0CisKKyAgICBkZWYgdGVzdFJlY0xpc3Qoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSByZWN1cnNpdmUgbGlua2VkIGxpc3QgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIHJlY19saXN0ID0gc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCkKKyAgICAgICAgc2VyZGVfbGlzdCA9IHNlbGYuX2Rlc2VyaWFsaXplKFJlY0xpc3QsIHNlbGYuX3NlcmlhbGl6ZShyZWNfbGlzdCkpCisgICAgICAgIG91dF9saXN0ID0gc2VsZi5fY29sbGFwc2VMaW5rZWRMaXN0KHNlcmRlX2xpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFswLCAxLCAyLCAzLCA0XSwgb3V0X2xpc3QpCisKKyAgICBkZWYgdGVzdENvUmVjKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgY28tcmVjdXJzaXZlIHN0cnVjdHVyZXMgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIGl0ZW0xID0gQ29SZWMoKQorICAgICAgICBpdGVtMiA9IENvUmVjMigpCisKKyAgICAgICAgaXRlbTEub3RoZXIgPSBpdGVtMgorICAgICAgICBpdGVtMi5vdGhlciA9IGl0ZW0xCisKKyAgICAgICAgIyBOT1RFIFtlY29ubmVyNzI0LDIwMTctMDYtMjFdOiBUaGVzZSBvYmplY3RzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIHNlcmlhbGl6YXRpb24KKyAgICAgICAgIyByZXN1bHRzIGluIGFuIGluZmluaXRlIGxvb3AuIGZidGhyaWZ0IGFsc28gc3VmZmVycyBmcm9tIHRoaXMKKyAgICAgICAgIyBwcm9ibGVtLgorCisgICAgZGVmIHRlc3RSZWNWZWN0b3Ioc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBhIGxpc3Qgb2YgcmVjdXJzaXZlIG5vZGVzIGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICBteWxpc3QgPSBbc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCksIHNlbGYuX2J1aWxkTGlua2VkTGlzdCgpXQorICAgICAgICBteXZlYyA9IFZlY3RvclRlc3QobGlzdGVyPW15bGlzdCkKKworICAgICAgICBzZXJkZV92ZWMgPSBzZWxmLl9kZXNlcmlhbGl6ZShWZWN0b3JUZXN0LCBzZWxmLl9zZXJpYWxpemUobXl2ZWMpKQorICAgICAgICBnb2xkZW5fbGlzdCA9IFswLCAxLCAyLCAzLCA0XQorICAgICAgICBmb3IgY3VyX2xpc3QgaW4gc2VyZGVfdmVjLmxpc3RlcjoKKyAgICAgICAgICAgIG91dF9saXN0ID0gc2VsZi5fY29sbGFwc2VMaW5rZWRMaXN0KGN1cl9saXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fbGlzdCwgb3V0X2xpc3QpCiAKIAogY2xhc3MgTm9ybWFsQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisKIAogY2xhc3MgQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkKKworCitjbGFzcyBDb21wYWN0UHJvdG9jb2xUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorCisKK2NsYXNzIEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QoQWJzdHJhY3RUZXN0KToKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKQorCisKK2NsYXNzIEpTT05Qcm90b2NvbFRlc3QoQWJzdHJhY3RUZXN0KToKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpCiAKIAogY2xhc3MgQWNjZWxlcmF0ZWRGcmFtZWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgZGVmIHRlc3RTcGxpdChzZWxmKToKLSAgICAiIiJUZXN0IEZyYW1lZFRyYW5zcG9ydCBhbmQgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAorICAgIGRlZiB0ZXN0U3BsaXQoc2VsZik6CisgICAgICAgICIiIlRlc3QgRnJhbWVkVHJhbnNwb3J0IGFuZCBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkCiAKLSAgICBUZXN0cyB0aGF0IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBURnJhbWVkVHJhbnNwb3J0Ci0gICAgcGxheSBuaWNlbHkgdG9nZXRoZXIgd2hlbiBhIHJlYWQgc3BhbnMgYSBmcmFtZSIiIgorICAgICAgICBUZXN0cyB0aGF0IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBURnJhbWVkVHJhbnNwb3J0CisgICAgICAgIHBsYXkgbmljZWx5IHRvZ2V0aGVyIHdoZW4gYSByZWFkIHNwYW5zIGEgZnJhbWUiIiIKIAotICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkKLSAgICBiaWdzdHJpbmcgPSAiIi5qb2luKGNocihieXRlKSBmb3IgYnl0ZSBpbiByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCisgICAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkKKyAgICAgICAgYmlnc3RyaW5nID0gIiIuam9pbihjaHIoYnl0ZSkgZm9yIGJ5dGUgaW4gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpICsgMSkpCiAKLSAgICBkYXRhYnVmID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgICBwcm90ID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChkYXRhYnVmKQotICAgIHByb3Qud3JpdGVJMzIoNDIpCi0gICAgcHJvdC53cml0ZVN0cmluZyhiaWdzdHJpbmcpCi0gICAgcHJvdC53cml0ZUkxNigyNCkKLSAgICBkYXRhID0gZGF0YWJ1Zi5nZXR2YWx1ZSgpCi0gICAgY3V0cG9pbnQgPSBsZW4oZGF0YSkvMgotICAgIHBhcnRzID0gWyBkYXRhWzpjdXRwb2ludF0sIGRhdGFbY3V0cG9pbnQ6XSBdCisgICAgICAgIGRhdGFidWYgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90ID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChkYXRhYnVmKQorICAgICAgICBwcm90LndyaXRlSTMyKDQyKQorICAgICAgICBwcm90LndyaXRlU3RyaW5nKGJpZ3N0cmluZykKKyAgICAgICAgcHJvdC53cml0ZUkxNigyNCkKKyAgICAgICAgZGF0YSA9IGRhdGFidWYuZ2V0dmFsdWUoKQorICAgICAgICBjdXRwb2ludCA9IGxlbihkYXRhKSAvLyAyCisgICAgICAgIHBhcnRzID0gW2RhdGFbOmN1dHBvaW50XSwgZGF0YVtjdXRwb2ludDpdXQogCi0gICAgZnJhbWVkX2J1ZmZlciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgZnJhbWVkX3dyaXRlciA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChmcmFtZWRfYnVmZmVyKQotICAgIGZvciBwYXJ0IGluIHBhcnRzOgotICAgICAgZnJhbWVkX3dyaXRlci53cml0ZShwYXJ0KQotICAgICAgZnJhbWVkX3dyaXRlci5mbHVzaCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGZyYW1lZF9idWZmZXIuZ2V0dmFsdWUoKSksIGxlbihkYXRhKSArIDgpCisgICAgICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBmcmFtZWRfd3JpdGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCisgICAgICAgIGZvciBwYXJ0IGluIHBhcnRzOgorICAgICAgICAgICAgZnJhbWVkX3dyaXRlci53cml0ZShwYXJ0KQorICAgICAgICAgICAgZnJhbWVkX3dyaXRlci5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihmcmFtZWRfYnVmZmVyLmdldHZhbHVlKCkpLCBsZW4oZGF0YSkgKyA4KQogCi0gICAgIyBSZWNyZWF0ZSBmcmFtZWRfYnVmZmVyIHNvIHdlIGNhbiByZWFkIGZyb20gaXQuCi0gICAgZnJhbWVkX2J1ZmZlciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZWRfYnVmZmVyLmdldHZhbHVlKCkpCi0gICAgZnJhbWVkX3JlYWRlciA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChmcmFtZWRfYnVmZmVyKQotICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGZyYW1lZF9yZWFkZXIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90LnJlYWRJMzIoKSwgNDIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90LnJlYWRTdHJpbmcoKSwgYmlnc3RyaW5nKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTE2KCksIDI0KQorICAgICAgICAjIFJlY3JlYXRlIGZyYW1lZF9idWZmZXIgc28gd2UgY2FuIHJlYWQgZnJvbSBpdC4KKyAgICAgICAgZnJhbWVkX2J1ZmZlciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZWRfYnVmZmVyLmdldHZhbHVlKCkpCisgICAgICAgIGZyYW1lZF9yZWFkZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKKyAgICAgICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZnJhbWVkX3JlYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90LnJlYWRJMzIoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkU3RyaW5nKCksIGJpZ3N0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90LnJlYWRJMTYoKSwgMjQpCisKIAogY2xhc3MgU2VyaWFsaXplcnNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICBkZWYgdGVzdFNlcmlhbGl6ZVRoZW5EZXNlcmlhbGl6ZShzZWxmKToKLSAgICBvYmogPSBYdHJ1Y3QyKGkzMl90aGluZz0xLAotICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nPVh0cnVjdChzdHJpbmdfdGhpbmc9ImZvbyIpKQorICAgIGRlZiB0ZXN0U2VyaWFsaXplVGhlbkRlc2VyaWFsaXplKHNlbGYpOgorICAgICAgICBvYmogPSBYdHJ1Y3QyKGkzMl90aGluZz0xLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZz1YdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJmb28iKSkKIAotICAgIHMxID0gc2VyaWFsaXplKG9iaikKLSAgICBmb3IgaSBpbiByYW5nZSgxMCk6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFscyhzMSwgc2VyaWFsaXplKG9iaikpCi0gICAgICBvYmpjb3B5ID0gWHRydWN0MigpCi0gICAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKKyAgICAgICAgczEgPSBzZXJpYWxpemUob2JqKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzMSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBvYmpjb3B5ID0gWHRydWN0MigpCisgICAgICAgICAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKIAotICAgIG9iaiA9IFh0cnVjdChzdHJpbmdfdGhpbmc9ImJhciIpCi0gICAgb2JqY29weSA9IFh0cnVjdCgpCi0gICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQorICAgICAgICBvYmogPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJiYXIiKQorICAgICAgICBvYmpjb3B5ID0gWHRydWN0KCkKKyAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKKworICAgICAgICAjIHRlc3QgYm9vbGVhbnMKKyAgICAgICAgb2JqID0gQm9vbHMoaW1fdHJ1ZT1UcnVlLCBpbV9mYWxzZT1GYWxzZSkKKyAgICAgICAgb2JqY29weSA9IEJvb2xzKCkKKyAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKKworICAgICAgICAjIHRlc3QgZW51bXMKKyAgICAgICAgZm9yIG51bSwgbmFtZSBpbiBOdW1iZXJ6Ll9WQUxVRVNfVE9fTkFNRVMuaXRlbXMoKToKKyAgICAgICAgICAgIG9iaiA9IEJvbmsobWVzc2FnZT0nZW51bSBOdW1iZXJ6IHZhbHVlICVkIGlzIHN0cmluZyAlcycgJSAobnVtLCBuYW1lKSwgdHlwZT1udW0pCisgICAgICAgICAgICBvYmpjb3B5ID0gQm9uaygpCisgICAgICAgICAgICBkZXNlcmlhbGl6ZShvYmpjb3B5LCBzZXJpYWxpemUob2JqKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKIAogCiBkZWYgc3VpdGUoKToKLSAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCiAKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE5vcm1hbEJpbmFyeVRlc3QpKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkRnJhbWVkVGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShTZXJpYWxpemVyc1Rlc3QpKQotICByZXR1cm4gc3VpdGUKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0UHJvdG9jb2xUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlByb3RvY29sVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkRnJhbWVkVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFNlcmlhbGl6ZXJzVGVzdCkpCisgICAgcmV0dXJuIHN1aXRlCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5weSBiL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5ODc2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkKQEAgLTAsMCArMSwxMDggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgQm9uaywgVmVyc2lvbmluZ1Rlc3RWMSwgVmVyc2lvbmluZ1Rlc3RWMgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorCitpbXBvcnQganNvbgoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgU2ltcGxlSlNPTlByb3RvY29sVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKQorCisgICAgZGVmIF9hc3NlcnREaWN0RXF1YWwoc2VsZiwgYSwgYiwgbXNnPU5vbmUpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdhc3NlcnREaWN0RXF1YWwnKToKKyAgICAgICAgICAgICMgYXNzZXJ0RGljdEVxdWFsIG9ubHkgaW4gUHl0aG9uIDIuNy4gRGVwZW5kcyBvbiB5b3VyIG1hY2hpbmUuCisgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RFcXVhbChhLCBiLCBtc2cpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFN1YnN0aXR1dGUgaW1wbGVtZW50YXRpb24gbm90IGFzIGdvb2QgYXMgdW5pdHRlc3QgbGlicmFyeSdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihhKSwgbGVuKGIpLCBtc2cpCisgICAgICAgIGZvciBrLCB2IGluIGEuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBiLCBtc2cpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhiLmdldChrKSwgdiwgbXNnKQorCisgICAgZGVmIF9zZXJpYWxpemUoc2VsZiwgb2JqKToKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICBvYmoud3JpdGUocHJvdCkKKyAgICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKKworICAgIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6CisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGEpKQorICAgICAgICByZXQgPSBvYmp0eXBlKCkKKyAgICAgICAgcmV0LnJlYWQocHJvdCkKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIHRlc3RXcml0ZU9ubHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Rlc2VyaWFsaXplLCBWZXJzaW9uaW5nVGVzdFYxLCBiJ3t9JykKKworICAgIGRlZiB0ZXN0U2ltcGxlTWVzc2FnZShzZWxmKToKKyAgICAgICAgdjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djFvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9zdHJpbmc9djFvYmoub2xkX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbl9ib3RoPXYxb2JqLmVuZF9pbl9ib3RoKQorICAgICAgICBhY3R1YWwgPSBqc29uLmxvYWRzKHNlbGYuX3NlcmlhbGl6ZSh2MW9iaikuZGVjb2RlKCdhc2NpaScpKQorCisgICAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQorCisgICAgZGVmIHRlc3RDb21wbGljYXRlZChzZWxmKToKKyAgICAgICAgdjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG5ld2ludD0xLAorICAgICAgICAgICAgbmV3Ynl0ZT0yLAorICAgICAgICAgICAgbmV3c2hvcnQ9MywKKyAgICAgICAgICAgIG5ld2xvbmc9NCwKKyAgICAgICAgICAgIG5ld2RvdWJsZT01LjAsCisgICAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCisgICAgICAgICAgICBuZXdsaXN0PVs3LCA4LCA5XSwKKyAgICAgICAgICAgIG5ld3NldD1zZXQoWzQyLCAxLCA4XSksCisgICAgICAgICAgICBuZXdtYXA9ezE6IDIsIDI6IDN9LAorICAgICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djJvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ludD12Mm9iai5uZXdpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdieXRlPXYyb2JqLm5ld2J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzaG9ydD12Mm9iai5uZXdzaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xvbmc9djJvYmoubmV3bG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RvdWJsZT12Mm9iai5uZXdkb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJ1Y3Q9ZGljdChtZXNzYWdlPXYyb2JqLm5ld3N0cnVjdC5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT12Mm9iai5uZXdzdHJ1Y3QudHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaXN0PXYyb2JqLm5ld2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzZXQ9bGlzdCh2Mm9iai5uZXdzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bWFwPXYyb2JqLm5ld21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3N0cmluZz12Mm9iai5uZXdzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5fYm90aD12Mm9iai5lbmRfaW5fYm90aCkKKworICAgICAgICAjIE5lZWQgdG8gbG9hZC9kdW1wIGJlY2F1c2UgbWFwIGtleXMgZ2V0IGVzY2FwZWQuCisgICAgICAgIGV4cGVjdGVkID0ganNvbi5sb2Fkcyhqc29uLmR1bXBzKGV4cGVjdGVkKSkKKyAgICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjJvYmopLmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0RGljdEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdENsaWVudC5weSBiL3Rlc3QvcHkvVGVzdENsaWVudC5weQppbmRleCAwYTM4YjAzLi5kZGNjZThkIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RDbGllbnQucHkKKysrIGIvdGVzdC9weS9UZXN0Q2xpZW50LnB5CkBAIC0xLDUgKzEsNSBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KKyMgLSotIGNvZGluZzogdXRmLTggLSotCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE5LDE0MiArMTksNDI4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgJy4vZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1pbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAKK2Zyb20gdXRpbCBpbXBvcnQgbG9jYWxfbGlicGF0aAogCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLnNldF9kZWZhdWx0cyhmcmFtZWQ9RmFsc2UsIGh0dHBfcGF0aD1Ob25lLCB2ZXJib3NlPTEsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCkKLXBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwKLSAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciBhdCBwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCItLWhvc3QiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJob3N0IiwKLSAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1mcmFtZWQiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJmcmFtZWQiLAotICAgIGhlbHA9InVzZSBmcmFtZWQgdHJhbnNwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCItLWh0dHAiLCBkZXN0PSJodHRwX3BhdGgiLAotICAgIGhlbHA9IlVzZSB0aGUgSFRUUCB0cmFuc3BvcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgiKQotcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCAKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKLSAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCi1wYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCAKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKLSAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCitTQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKIGNsYXNzIEFic3RyYWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBpZiBvcHRpb25zLmh0dHBfcGF0aDoKLSAgICAgIHNlbGYudHJhbnNwb3J0ID0gVEh0dHBDbGllbnQuVEh0dHBDbGllbnQoCi0gICAgICAgICAgb3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQsIG9wdGlvbnMuaHR0cF9wYXRoKQotICAgIGVsc2U6Ci0gICAgICBzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQpCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBvcHRpb25zLnRyYW5zID09ICdodHRwJzoKKyAgICAgICAgICAgIHVyaSA9ICd7MH06Ly97MX06ezJ9ezN9Jy5mb3JtYXQoKCdodHRwcycgaWYgb3B0aW9ucy5zc2wgZWxzZSAnaHR0cCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbnMuaHR0cF9wYXRoIGlmIG9wdGlvbnMuaHR0cF9wYXRoIGVsc2UgJy8nKSkKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICAgICAgICAgIF9fY2FmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAiQ0EucGVtIikKKyAgICAgICAgICAgICAgICBfX2NlcnRmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAiY2xpZW50LmNydCIpCisgICAgICAgICAgICAgICAgX19rZXlmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAiY2xpZW50LmtleSIpCisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudCh1cmksIGNhZmlsZT1fX2NhZmlsZSwgY2VydF9maWxlPV9fY2VydGZpbGUsIGtleV9maWxlPV9fa2V5ZmlsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudCh1cmkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgICAgICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTU0xTb2NrZXQKKyAgICAgICAgICAgICAgICBzb2NrZXQgPSBUU1NMU29ja2V0LlRTU0xTb2NrZXQob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQsIHZhbGlkYXRlPUZhbHNlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQpCisgICAgICAgICAgICAjIGZyYW1lIG9yIGJ1ZmZlciBkZXBlbmRpbmcgdXBvbiBhcmdzCisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICAgICAgICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2ZyYW1lZCc6CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQorICAgICAgICAgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICdidWZmZXJlZCc6CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpCisgICAgICAgICAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJyc6CisgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS10cmFuc3BvcnQgb3B0aW9uOiAlcycgJSBvcHRpb25zLnRyYW5zKQorICAgICAgICAgICAgaWYgb3B0aW9ucy56bGliOgorICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQoc2VsZi50cmFuc3BvcnQsIDkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQorICAgICAgICBwcm90b2NvbCA9IHNlbGYuZ2V0X3Byb3RvY29sKHNlbGYudHJhbnNwb3J0KQorICAgICAgICBzZWxmLmNsaWVudCA9IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKQorICAgICAgICAjIGZvciBtdWx0aXBsZXhlZCBzZXJ2aWNlczoKKyAgICAgICAgcHJvdG9jb2wyID0gc2VsZi5nZXRfcHJvdG9jb2wyKHNlbGYudHJhbnNwb3J0KQorICAgICAgICBzZWxmLmNsaWVudDIgPSBTZWNvbmRTZXJ2aWNlLkNsaWVudChwcm90b2NvbDIpIGlmIHByb3RvY29sMiBpcyBub3QgTm9uZSBlbHNlIE5vbmUKIAotICAgICAgIyBmcmFtZSBvciBidWZmZXIgZGVwZW5kaW5nIHVwb24gYXJncwotICAgICAgaWYgb3B0aW9ucy5mcmFtZWQ6Ci0gICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KQorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuY2xvc2UoKQogCi0gICAgc2VsZi50cmFuc3BvcnQub3BlbigpCisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFZvaWQnKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0Vm9pZCgpCiAKLSAgICBwcm90b2NvbCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChzZWxmLnRyYW5zcG9ydCkKLSAgICBzZWxmLmNsaWVudCA9IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKQorICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFN0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyAqIDIwKSwgJ1B5dGhvbicgKiAyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpCisgICAgICAgIHMxID0gdSdcYlx0XG4vXFxcXFxye30644OR44Kk44K944OzIicKKyAgICAgICAgczIgPSB1IiIiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksCisgICAgICAgIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLAorICAgICAgICDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sCisgICAgICAgIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwKKyAgICAgICAgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLAorICAgICAgICBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsCisgICAgICAgIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwKKyAgICAgICAgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLAorICAgICAgICBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLAorICAgICAgICBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLAorICAgICAgICBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsCisgICAgICAgIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwKKyAgICAgICAgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLAorICAgICAgICBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYQorICAgICAgICBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EKKyAgICAgICAgTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqCisgICAgICAgIE5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwKKyAgICAgICAgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsCisgICAgICAgIE5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLAorICAgICAgICDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlCisgICAgICAgIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywKKyAgICAgICAgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLAorICAgICAgICBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLAorICAgICAgICBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLAorICAgICAgICBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iIiIKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyIGFuZCBvcy5lbnZpcm9uLmdldCgnVEhSSUZUX1RFU1RfUFlfTk9fVVRGOFNUUklOR1MnKToKKyAgICAgICAgICAgIHMxID0gczEuZW5jb2RlKCd1dGY4JykKKyAgICAgICAgICAgIHMyID0gczIuZW5jb2RlKCd1dGY4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKHMxKSwgczEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZyhzMiksIHMyKQogCi0gIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAjIENsb3NlIQotICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKKyAgICBkZWYgdGVzdE11bHRpcGxleGVkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsaWVudDIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgndGVzdE11bHRpcGxleGVkJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQyLnNlY29uZHRlc3RTdHJpbmcoJ2Zvb2JhcicpLCAndGVzdFN0cmluZygiZm9vYmFyIiknKQogCi0gIGRlZiB0ZXN0Vm9pZChzZWxmKToKLSAgICBzZWxmLmNsaWVudC50ZXN0Vm9pZCgpCisgICAgZGVmIHRlc3RCb29sKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJvb2wnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKFRydWUpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKEZhbHNlKSwgRmFsc2UpCiAKLSAgZGVmIHRlc3RTdHJpbmcoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKCdQeXRob24nKSwgJ1B5dGhvbicpCisgICAgZGVmIHRlc3RCeXRlKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJ5dGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKDYzKSwgNjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoLTEyNyksIC0xMjcpCiAKLSAgZGVmIHRlc3RCeXRlKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoNjMpLCA2MykKKyAgICBkZWYgdGVzdEkzMihzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RJMzInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STMyKDApLCAwKQogCi0gIGRlZiB0ZXN0STMyKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigtMSksIC0xKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigwKSwgMCkKKyAgICBkZWYgdGVzdEk2NChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RJNjQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJNjQoMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpLCAtMzQzNTk3MzgzNjgpCiAKLSAgZGVmIHRlc3RJNjQoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCksIC0zNDM1OTczODM2OCkKKyAgICBkZWYgdGVzdERvdWJsZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3REb3VibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KSwgLTUuMjM1MDk4MjM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdERvdWJsZSgtMSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KSwgLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KQogCi0gIGRlZiB0ZXN0RG91YmxlKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdERvdWJsZSgtNS4yMzUwOTgyMzUpLCAtNS4yMzUwOTgyMzUpCisgICAgZGVmIHRlc3RCaW5hcnkoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0QmluYXJ5JykKKyAgICAgICAgdmFsID0gYnl0ZWFycmF5KFtpIGZvciBpIGluIHJhbmdlKDAsIDI1NildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVhcnJheShzZWxmLmNsaWVudC50ZXN0QmluYXJ5KGJ5dGVzKHZhbCkpKSwgdmFsKQogCi0gIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgotICAgIHggPSBYdHJ1Y3QoKQotICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCi0gICAgeC5ieXRlX3RoaW5nID0gMQotICAgIHguaTMyX3RoaW5nID0gLTMKLSAgICB4Lmk2NF90aGluZyA9IC01Ci0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RTdHJ1Y3QoeCkKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTdHJ1Y3QnKQorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMQorICAgICAgICB4LmkzMl90aGluZyA9IC0zCisgICAgICAgIHguaTY0X3RoaW5nID0gLTUKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RTdHJ1Y3QoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LnN0cmluZ190aGluZywgIlplcm8iKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5ieXRlX3RoaW5nLCAxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pMzJfdGhpbmcsIC0zKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pNjRfdGhpbmcsIC01KQorICAgIGRlZiB0ZXN0TmVzdChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3ROZXN0JykKKyAgICAgICAgaW5uZXIgPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJaZXJvIiwgYnl0ZV90aGluZz0xLCBpMzJfdGhpbmc9LTMsIGk2NF90aGluZz0tNSkKKyAgICAgICAgeCA9IFh0cnVjdDIoc3RydWN0X3RoaW5nPWlubmVyLCBieXRlX3RoaW5nPTAsIGkzMl90aGluZz0wKQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE5lc3QoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYpOgotICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQotICAgIHRyeToKLSAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKLSAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCi0gICAgZXhjZXB0IFhjZXB0aW9uLCB4OgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmVycm9yQ29kZSwgMTAwMSkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5tZXNzYWdlLCAnWGNlcHRpb24nKQorICAgIGRlZiB0ZXN0TWFwKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE1hcCcpCisgICAgICAgIHggPSB7MDogMSwgMTogMiwgMjogMywgMzogNCwgLTE6IC0yfQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE1hcCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgICB0cnk6Ci0gICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCJ0aHJvd191bmRlY2xhcmVkIikKLSAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbjogIyB0eXBlIGlzIHVuZGVmaW5lZAotICAgICAgcGFzcworICAgIGRlZiB0ZXN0U2V0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFNldCcpCisgICAgICAgIHggPSBzZXQoWzgsIDEsIDQyXSkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RTZXQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgotICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKLSAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDAuNSkKLSAgICBlbmQgPSB0aW1lLnRpbWUoKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbmQgLSBzdGFydCA8IDAuMiwKLSAgICAgICAgICAgICAgICAgICAgIm9uZXdheSBzbGVlcCB0b29rICVmIHNlYyIgJSAoZW5kIC0gc3RhcnQpKQotICAKLSAgZGVmIHRlc3RPbmV3YXlUaGVuTm9ybWFsKHNlbGYpOgotICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMC41KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyksICdQeXRob24nKQorICAgIGRlZiB0ZXN0TGlzdChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RMaXN0JykKKyAgICAgICAgeCA9IFsxLCA0LCA5LCAtNDJdCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TGlzdCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLWNsYXNzIE5vcm1hbEJpbmFyeVRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKyAgICBkZWYgdGVzdEVudW0oc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RW51bScpCisgICAgICAgIHggPSBOdW1iZXJ6LkZJVkUKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RFbnVtKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotY2xhc3MgQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0VHlwZWRlZicpCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmICAjIDcgYnl0ZXMgb2YgMHhmZgorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFR5cGVkZWYoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorCisgICAgZGVmIHRlc3RNYXBNYXAoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TWFwTWFwJykKKyAgICAgICAgeCA9IHsKKyAgICAgICAgICAgIC00OiB7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKKyAgICAgICAgICAgIDQ6IHs0OiA0LCAzOiAzLCAyOiAyLCAxOiAxfSwKKyAgICAgICAgfQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE1hcE1hcCg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorCisgICAgZGVmIHRlc3RNdWx0aShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aScpCisgICAgICAgIHhwZWN0ZWQgPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSdIZWxsbzInLCBieXRlX3RoaW5nPTc0LCBpMzJfdGhpbmc9MHhmZjAwZmYsIGk2NF90aGluZz0weGZmZmZmZmZmZDBkMCkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aSh4cGVjdGVkLmJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBlY3RlZC5pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBlY3RlZC5pNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6ICdhYmMnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6LkZJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMGYwZjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeHBlY3RlZCkKKworICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEV4Y2VwdGlvbicpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5lcnJvckNvZGUsIDEwMDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubWVzc2FnZSwgJ1hjZXB0aW9uJykKKyAgICAgICAgICAgICMgVE9ETyBlbnN1cmUgc2FtZSBiZWhhdmlvciBmb3IgcmVwciB3aXRoaW4gZ2VuZXJhdGVkIHB5dGhvbiB2YXJpYW50cworICAgICAgICAgICAgIyBlbnN1cmUgZXhjZXB0aW9uJ3MgcmVwciBtZXRob2Qgd29ya3MKKyAgICAgICAgICAgICMgeF9yZXByID0gcmVwcih4KQorICAgICAgICAgICAgIyBzZWxmLmFzc2VydEVxdWFsKHhfcmVwciwgJ1hjZXB0aW9uKGVycm9yQ29kZT0xMDAxLCBtZXNzYWdlPVwnWGNlcHRpb25cJyknKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKyAgICAgICAgZXhjZXB0IFRFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFNob3VsZCBub3QgdGhyb3cKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignc3VjY2VzcycpCisKKyAgICBkZWYgdGVzdE11bHRpRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE11bHRpRXhjZXB0aW9uJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCdYY2VwdGlvbicsICdpZ25vcmUnKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgubWVzc2FnZSwgJ1RoaXMgaXMgYW4gWGNlcHRpb24nKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24yJywgJ2lnbm9yZScpCisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbjIgYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMjAwMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ1RoaXMgaXMgYW4gWGNlcHRpb24yJykKKworICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCdzdWNjZXNzJywgJ2Zvb2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5zdHJpbmdfdGhpbmcsICdmb29iYXInKQorCisgICAgZGVmIHRlc3RPbmV3YXkoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0T25ld2F5JykKKyAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpICAjIHR5cGUgaXMgaW50LCBub3QgZmxvYXQKKyAgICAgICAgZW5kID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVuZCAtIHN0YXJ0IDwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICJvbmV3YXkgc2xlZXAgdG9vayAlZiBzZWMiICUgKGVuZCAtIHN0YXJ0KSkKKworICAgIGRlZiB0ZXN0T25ld2F5VGhlbk5vcm1hbChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RPbmV3YXlUaGVuTm9ybWFsJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyksICdQeXRob24nKQorCisKK2NsYXNzIE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitjbGFzcyBCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBBY2NlbGVyYXRlZENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEpTT05UZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkSlNPTlRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBIZWFkZXJUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIGZhY3RvcnkgPSBUSGVhZGVyUHJvdG9jb2wuVEhlYWRlclByb3RvY29sRmFjdG9yeSgpCisgICAgICAgIHJldHVybiBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCkKKwogCiBkZWYgc3VpdGUoKToKLSAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgaWYgb3B0aW9ucy5wcm90byA9PSAnYmluYXJ5JzogICMgbG9vayBmb3IgLS1wcm90byBvbiBjbWRsaW5lCisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2FjY2VsJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbGMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdjb21wYWN0JzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKENvbXBhY3RUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2hlYWRlcic6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShIZWFkZXJUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2pzb24nOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGknOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpYSc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWFjJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWonOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRKU09OVGVzdCkpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gcHJvdG9jb2wgZ2l2ZW4gd2l0aCAtLXByb3RvY29sOiAlcycgJSBvcHRpb25zLnByb3RvKQorICAgIHJldHVybiBzdWl0ZQogCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShOb3JtYWxCaW5hcnlUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCi0gIHJldHVybiBzdWl0ZQogCiBjbGFzcyBPd25BcmdzVGVzdFByb2dyYW0odW5pdHRlc3QuVGVzdFByb2dyYW0pOgogICAgIGRlZiBwYXJzZUFyZ3Moc2VsZiwgYXJndik6CiAgICAgICAgIGlmIGFyZ3M6CiAgICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IGFyZ3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gKHNlbGYuZGVmYXVsdFRlc3QsKQorICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSAoW3NlbGYuZGVmYXVsdFRlc3RdKQogICAgICAgICBzZWxmLmNyZWF0ZVRlc3RzKCkKIAorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBPd25BcmdzVGVzdFByb2dyYW0oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1saWJweWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2xpYnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IGluIHN5cy5wYXRoIGZvciBsb2NhdGluZyBsaWJyYXJ5IGNvZGUnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgaW4gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGdlbmVyYXRlZCBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIgYXQgcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0taG9zdCIsIHR5cGU9InN0cmluZyIsIGRlc3Q9Imhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXNzbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InNzbCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIFNTTCBmb3IgZW5jcnlwdGVkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0taHR0cCIsIGRlc3Q9Imh0dHBfcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iVXNlIHRoZSBIVFRQIHRyYW5zcG9ydCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1wcm90b2NvbCcsIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGFjY2VsYywgYmluYXJ5LCBjb21wYWN0LCBoZWFkZXIsIGpzb24sIG11bHRpLCBtdWx0aWEsIG11bHRpYWMsIG11bHRpYywgbXVsdGlqIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKKyAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKGZyYW1lZD1GYWxzZSwgaHR0cF9wYXRoPU5vbmUsIHZlcmJvc2U9MSwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCBwcm90bz0nYmluYXJ5JykKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgaWYgb3B0aW9ucy5nZW5weWRpcjoKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCBvcHRpb25zLmdlbnB5ZGlyKSkKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgbG9jYWxfbGlicGF0aCgpKQorCisgICAgaWYgb3B0aW9ucy5odHRwX3BhdGg6CisgICAgICAgIG9wdGlvbnMudHJhbnMgPSAnaHR0cCcKKworICAgIGZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgU2Vjb25kU2VydmljZQorICAgIGZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAorICAgIGZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFh0cnVjdCwgWHRydWN0MiwgTnVtYmVyeiwgWGNlcHRpb24sIFhjZXB0aW9uMgorICAgIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEh0dHBDbGllbnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRabGliVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRIZWFkZXJQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRNdWx0aXBsZXhlZFByb3RvY29sCisKKyAgICBPd25BcmdzVGVzdFByb2dyYW0oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MSkpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RFb2YucHkgYi90ZXN0L3B5L1Rlc3RFb2YucHkKaW5kZXggN2Q2NDI4OS4uMGI0YTgyOSAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0RW9mLnB5CisrKyBiL3Rlc3QvcHkvVGVzdEVvZi5weQpAQCAtMTksMTAzICsxOSwxMTQgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHknKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCi0KLWZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgorZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWHRydWN0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHRpbWUKKwogCiBjbGFzcyBUZXN0RW9mKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zKQorICAgIGRlZiBtYWtlX2RhdGEoc2VsZiwgcGZhY3Rvcnk9Tm9uZSk6CisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgaWYgcGZhY3Rvcnk6CisgICAgICAgICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFucykKIAotICAgIHggPSBYdHJ1Y3QoKQotICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCi0gICAgeC5ieXRlX3RoaW5nID0gMAorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMAogCi0gICAgeC53cml0ZShwcm90KQorICAgICAgICB4LndyaXRlKHByb3QpCiAKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJPbmUiCi0gICAgeC5ieXRlX3RoaW5nID0gMQorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiT25lIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAxCiAKLSAgICB4LndyaXRlKHByb3QpCisgICAgICAgIHgud3JpdGUocHJvdCkKIAotICAgIHNlbGYuZGF0YSA9IHRyYW5zLmdldHZhbHVlKCkKKyAgICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKIAotICBkZWYgdGVzdFRyYW5zcG9ydFJlYWRBbGwoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IHJlYWRBbGwgb24gYW55IHR5cGUgb2YgdHJhbnNwb3J0IHRocm93cyBhbiBFT0ZFcnJvciIiIgotICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYuZGF0YSkKLSAgICB0cmFucy5yZWFkQWxsKDEpCisgICAgZGVmIHRlc3RUcmFuc3BvcnRSZWFkQWxsKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgcmVhZEFsbCBvbiBhbnkgdHlwZSBvZiB0cmFuc3BvcnQgdGhyb3dzIGFuIEVPRkVycm9yIiIiCisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYubWFrZV9kYXRhKCkpCisgICAgICAgIHRyYW5zLnJlYWRBbGwoMSkKIAotICAgIHRyeToKLSAgICAgIHRyYW5zLnJlYWRBbGwoMTAwMDApCi0gICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyYW5zLnJlYWRBbGwoMTAwMDApCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgogCi0gICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQorICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCiAKLSAgZGVmIGVvZlRlc3RIZWxwZXIoc2VsZiwgcGZhY3RvcnkpOgotICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYuZGF0YSkKLSAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgZGVmIGVvZlRlc3RIZWxwZXIoc2VsZiwgcGZhY3RvcnkpOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLm1ha2VfZGF0YShwZmFjdG9yeSkpCisgICAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKIAotICAgIHggPSBYdHJ1Y3QoKQotICAgIHgucmVhZChwcm90KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJaZXJvIikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMCkKLQotICAgIHggPSBYdHJ1Y3QoKQotICAgIHgucmVhZChwcm90KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJPbmUiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAxKQotCi0gICAgdHJ5OgotICAgICAgeCA9IFh0cnVjdCgpCi0gICAgICB4LnJlYWQocHJvdCkKLSAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICByZXR1cm4KLQotICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKLQotICBkZWYgZW9mVGVzdEhlbHBlclN0cmVzcyhzZWxmLCBwZmFjdG9yeSk6Ci0gICAgIiIiVGVlc3QgdGhlIGFiaWxpdHkgb2YgVEJpbmFyeVByb3RvY29sIHRvIGRlYWwgd2l0aCB0aGUgcmVtb3ZhbCBvZiBldmVyeSBieXRlIGluIHRoZSBmaWxlIiIiCi0gICAgIyBUT0RPOiB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoaXMgY292ZXJzIG1vcmUgb2YgdGhlIGNvZGUgcGF0aHMKLQotICAgIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oc2VsZi5kYXRhKSArIDEpOgotICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5kYXRhWzA6aV0pCi0gICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCi0gICAgICB0cnk6CiAgICAgICAgIHggPSBYdHJ1Y3QoKQogICAgICAgICB4LnJlYWQocHJvdCkKLSAgICAgICAgeC5yZWFkKHByb3QpCi0gICAgICAgIHgucmVhZChwcm90KQotICAgICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgICBjb250aW51ZQotICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gRU9GRXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiWmVybyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAwKQogCi0gIGRlZiB0ZXN0QmluYXJ5UHJvdG9jb2xFb2Yoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgotICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQotICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJPbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMSkKIAotICBkZWYgdGVzdEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRFb2Yoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSkKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCisKKyAgICBkZWYgZW9mVGVzdEhlbHBlclN0cmVzcyhzZWxmLCBwZmFjdG9yeSk6CisgICAgICAgICIiIlRlc3QgdGhlIGFiaWxpdHkgb2YgVEJpbmFyeVByb3RvY29sIHRvIGRlYWwgd2l0aCB0aGUgcmVtb3ZhbCBvZiBldmVyeSBieXRlIGluIHRoZSBmaWxlIiIiCisgICAgICAgICMgVE9ETzogd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGlzIGNvdmVycyBtb3JlIG9mIHRoZSBjb2RlIHBhdGhzCisKKyAgICAgICAgZGF0YSA9IHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YSkgKyAxKToKKyAgICAgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGFbMDppXSkKKyAgICAgICAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gRU9GRXJyb3IiKQorCisgICAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisKKyAgICBkZWYgdGVzdEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRCaW5hcnlFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKworICAgIGRlZiB0ZXN0Q29tcGFjdFByb3RvY29sRW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVENvbXBhY3RQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorCisgICAgZGVmIHRlc3RDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZENvbXBhY3RFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorCiAKIGRlZiBzdWl0ZSgpOgotICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi0gIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEVvZikpCi0gIHJldHVybiBzdWl0ZQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEVvZikpCisgICAgcmV0dXJuIHN1aXRlCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0RnJvemVuLnB5IGIvdGVzdC9weS9UZXN0RnJvemVuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkMjU5NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkKQEAgLTAsMCArMSwxMjMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIEVtcHR5LCBXcmFwcGVyCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRGcm96ZW5EaWN0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wsIFRDb21wYWN0UHJvdG9jb2wKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdEZyb3plbkJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfcm91bmR0cmlwKHNlbGYsIHNyYywgZHN0KToKKyAgICAgICAgb3RyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgb3B0b3JvID0gc2VsZi5wcm90b2NvbChvdHJhbnMpCisgICAgICAgIHNyYy53cml0ZShvcHRvcm8pCisgICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihvdHJhbnMuZ2V0dmFsdWUoKSkKKyAgICAgICAgaXByb3RvID0gc2VsZi5wcm90b2NvbChpdHJhbnMpCisgICAgICAgIHJldHVybiBkc3QucmVhZChpcHJvdG8pIG9yIGRzdAorCisgICAgZGVmIHRlc3RfZGljdF9pc19oYXNoYWJsZV9vbmx5X2FmdGVyX2Zyb3plbihzZWxmKToKKyAgICAgICAgZDAgPSB7fQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoZDAsIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSkKKyAgICAgICAgZDEgPSBURnJvemVuRGljdChkMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZDEsIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSkKKworICAgIGRlZiB0ZXN0X3N0cnVjdF93aXRoX2NvbGxlY3Rpb25fZmllbGRzKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9zZXQoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgc2V0IGZpZWxkIGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Qoc2V0X2J5dGVfbWFwPXsKKyAgICAgICAgICAgIGZyb3plbnNldChbNDIsIDEwMCwgLTEwMF0pOiA5OSwKKyAgICAgICAgICAgIGZyb3plbnNldChbMF0pOiAxMDAsCisgICAgICAgICAgICBmcm96ZW5zZXQoW10pOiAwLAorICAgICAgICB9KQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuc2V0X2J5dGVfbWFwW2Zyb3plbnNldChbNDIsIDEwMCwgLTEwMF0pXSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuc2V0X2J5dGVfbWFwW2Zyb3plbnNldChbMF0pXSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLnNldF9ieXRlX21hcFtmcm96ZW5zZXQoW10pXSwgMCkKKworICAgIGRlZiB0ZXN0X21hcChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBtYXAgZmllbGQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChtYXBfYnl0ZV9tYXA9eworICAgICAgICAgICAgVEZyb3plbkRpY3QoezQyOiA0MiwgMTAwOiAtMTAwfSk6IDk5LAorICAgICAgICAgICAgVEZyb3plbkRpY3QoezA6IDB9KTogMTAwLAorICAgICAgICAgICAgVEZyb3plbkRpY3Qoe30pOiAwLAorICAgICAgICB9KQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubWFwX2J5dGVfbWFwW1RGcm96ZW5EaWN0KHs0MjogNDIsIDEwMDogLTEwMH0pXSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubWFwX2J5dGVfbWFwW1RGcm96ZW5EaWN0KHswOiAwfSldLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubWFwX2J5dGVfbWFwW1RGcm96ZW5EaWN0KHt9KV0sIDApCisKKyAgICBkZWYgdGVzdF9saXN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIGxpc3QgZmllbGQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChsaXN0X2J5dGVfbWFwPXsKKyAgICAgICAgICAgICg0MiwgMTAwLCAtMTAwKTogOTksCisgICAgICAgICAgICAoMCwpOiAxMDAsCisgICAgICAgICAgICAoKTogMCwKKyAgICAgICAgfSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmxpc3RfYnl0ZV9tYXBbKDQyLCAxMDAsIC0xMDApXSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubGlzdF9ieXRlX21hcFsoMCwpXSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmxpc3RfYnl0ZV9tYXBbKCldLCAwKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3RydWN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIGVtcHR5IHN0cnVjdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpKQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuZW1wdHlfc3RydWN0X2ZpZWxkLCBFbXB0eSgpKQorCisgICAgZGVmIHRlc3Rfc3RydWN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIHN0cnVjdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBXcmFwcGVyKGZvbz1FbXB0eSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZm9vLCBFbXB0eSgpKQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBXcmFwcGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmZvbywgRW1wdHkoKSkKKworCitjbGFzcyBUZXN0RnJvemVuKFRlc3RGcm96ZW5CYXNlKToKKyAgICBkZWYgcHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFucykKKworCitjbGFzcyBUZXN0RnJvemVuQWNjZWxlcmF0ZWRCaW5hcnkoVGVzdEZyb3plbkJhc2UpOgorICAgIGRlZiBwcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFucykKKworCitjbGFzcyBUZXN0RnJvemVuQWNjZWxlcmF0ZWRDb21wYWN0KFRlc3RGcm96ZW5CYXNlKToKKyAgICBkZWYgcHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFucykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RGcm96ZW4pKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RnJvemVuQWNjZWxlcmF0ZWRCaW5hcnkpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RnJvemVuQWNjZWxlcmF0ZWRDb21wYWN0KSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weSBiL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTAzZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weQpAQCAtMCwwICsxLDE3NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIERvdWJsZUNvbnN0YW50c1Rlc3QgaW1wb3J0IGNvbnN0YW50cworCisjCisjIEluIG9yZGVyIHRvIHJ1biB0aGUgdGVzdCB1bmRlciBXaW5kb3dzLiBXZSBuZWVkIHRvIGNyZWF0ZSBzeW1ib2xpYyBsaW5rCisjIG5hbWUgJ3RocmlmdCcgdG8gJy4uL3NyYycgZm9sZGVyIGJ5IHVzaW5nOgorIworIyBta2xpbmsgL0QgdGhyaWZ0IC4uXHNyYworIworCisKK2NsYXNzIFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCA9IFwKKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBkb3VibGUgY29uc3RhbnQgZ2VuZXJhdGVkIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNUID1cCisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgbGlzdCBpdGVtIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyA9ICJ0aGUgcmVuZGVyZWQgdmFyaWFibGUgd2l0aCBuYW1lICVzIGlzIG5vdCBvZiBkb3VibGUgdHlwZSIKKworICAgICMgdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIGRlZiB0ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMoc2VsZik6CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3LjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMQorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwOAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDgKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKworICAgICMgdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIGRlZiB0ZXN0X3JlbmRlcmVkX2RvdWJsZV9saXN0KHNlbGYpOgorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfTElTVCA9IFsxLjAsIC0xMDAuMCwgMTAwLjAsIDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwgMy4xNDE1OTI2NTM1OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMC4xLCAtMTAwMDAwMC4xLCAxLjdlKzMwOCwgLTEuN2UrMzA4LCA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTIyMzM3MjAzNjg1NDc3NTgxNi40M10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QpLCBsZW4oRVhQRUNURURfRE9VQkxFX0xJU1QpKQorICAgICAgICBmb3IgaSwgZXhwZWN0ZWRWYWx1ZSBpbiBlbnVtZXJhdGUoRVhQRUNURURfRE9VQkxFX0xJU1QpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVFtpXSwgZXhwZWN0ZWRWYWx1ZSwgcGxhY2VzPTcpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFNlcnZlci5weSBiL3Rlc3QvcHkvVGVzdFNlcnZlci5weQppbmRleCAzZDM3OWVhLi5hYmEwZDQyIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkKKysrIGIvdGVzdC9weS9UZXN0U2VydmVyLnB5CkBAIC0xOCw5OCArMTgsMzI1IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAKLWltcG9ydCBzeXMsIGdsb2IsIHRpbWUKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHknKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKIAotZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIFRIdHRwU2VydmVyCitTQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAKLWNsYXNzIFRlc3RIYW5kbGVyOgogCi0gIGRlZiB0ZXN0Vm9pZChzZWxmKToKLSAgICBwcmludCAndGVzdFZvaWQoKScKK2NsYXNzIFRlc3RIYW5kbGVyKG9iamVjdCk6CisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0Vm9pZCgpJykKIAotICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzdHIpOgotICAgIHByaW50ICd0ZXN0U3RyaW5nKCVzKScgJSBzdHIKLSAgICByZXR1cm4gc3RyCisgICAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgc3RyKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFN0cmluZyglcyknICUgc3RyKQorICAgICAgICByZXR1cm4gc3RyCiAKLSAgZGVmIHRlc3RCeXRlKHNlbGYsIGJ5dGUpOgotICAgIHByaW50ICd0ZXN0Qnl0ZSglZCknICUgYnl0ZQotICAgIHJldHVybiBieXRlCisgICAgZGVmIHRlc3RCb29sKHNlbGYsIGJvb2xlYW4pOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0Qm9vbCglcyknICUgc3RyKGJvb2xlYW4pLmxvd2VyKCkpCisgICAgICAgIHJldHVybiBib29sZWFuCiAKLSAgZGVmIHRlc3RJMTYoc2VsZiwgaTE2KToKLSAgICBwcmludCAndGVzdEkxNiglZCknICUgaTE2Ci0gICAgcmV0dXJuIGkxNgorICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEJ5dGUoJWQpJyAlIGJ5dGUpCisgICAgICAgIHJldHVybiBieXRlCiAKLSAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKLSAgICBwcmludCAndGVzdEkzMiglZCknICUgaTMyCi0gICAgcmV0dXJuIGkzMgorICAgIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJMTYoJWQpJyAlIGkxNikKKyAgICAgICAgcmV0dXJuIGkxNgogCi0gIGRlZiB0ZXN0STY0KHNlbGYsIGk2NCk6Ci0gICAgcHJpbnQgJ3Rlc3RJNjQoJWQpJyAlIGk2NAotICAgIHJldHVybiBpNjQKKyAgICBkZWYgdGVzdEkzMihzZWxmLCBpMzIpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0STMyKCVkKScgJSBpMzIpCisgICAgICAgIHJldHVybiBpMzIKIAotICBkZWYgdGVzdERvdWJsZShzZWxmLCBkdWIpOgotICAgIHByaW50ICd0ZXN0RG91YmxlKCVmKScgJSBkdWIKLSAgICByZXR1cm4gZHViCisgICAgZGVmIHRlc3RJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEk2NCglZCknICUgaTY0KQorICAgICAgICByZXR1cm4gaTY0CiAKLSAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZiwgdGhpbmcpOgotICAgIHByaW50ICd0ZXN0U3RydWN0KHslcywgJWQsICVkLCAlZH0pJyAlICh0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKQotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3REb3VibGUoJWYpJyAlIGR1YikKKyAgICAgICAgcmV0dXJuIGR1YgogCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIHN0cik6Ci0gICAgcHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyAlIHN0cgotICAgIGlmIHN0ciA9PSAnWGNlcHRpb24nOgotICAgICAgeCA9IFhjZXB0aW9uKCkKLSAgICAgIHguZXJyb3JDb2RlID0gMTAwMQotICAgICAgeC5tZXNzYWdlID0gc3RyCi0gICAgICByYWlzZSB4Ci0gICAgZWxpZiBzdHIgPT0gInRocm93X3VuZGVjbGFyZWQiOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZm9vIikKKyAgICBkZWYgdGVzdEJpbmFyeShzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RCaW5hcnkoKScpICAjIFRPRE86IGhleCBvdXRwdXQKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6Ci0gICAgcHJpbnQgJ3Rlc3RPbmV3YXkoJWQpID0+IHNsZWVwaW5nLi4uJyAlIHNlY29uZHMKLSAgICB0aW1lLnNsZWVwKHNlY29uZHMpCi0gICAgcHJpbnQgJ2RvbmUgc2xlZXBpbmcnCisgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U3RydWN0KHslcywgJXMsICVzLCAlc30pJyAlICh0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKSkKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmLCBhcmcpOgorICAgICAgICAjIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEV4Y2VwdGlvbiglcyknICUgYXJnKQorICAgICAgICBpZiBhcmcgPT0gJ1hjZXB0aW9uJzoKKyAgICAgICAgICAgIHJhaXNlIFhjZXB0aW9uKGVycm9yQ29kZT0xMDAxLCBtZXNzYWdlPWFyZykKKyAgICAgICAgZWxpZiBhcmcgPT0gJ1RFeGNlcHRpb24nOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbihtZXNzYWdlPSdUaGlzIGlzIGEgVEV4Y2VwdGlvbicpCiAKLSAgZGVmIHRlc3RNYXAoc2VsZiwgdGhpbmcpOgotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0TXVsdGlFeGNlcHRpb24oc2VsZiwgYXJnMCwgYXJnMSk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyAlIChhcmcwLCBhcmcxKSkKKyAgICAgICAgaWYgYXJnMCA9PSAnWGNlcHRpb24nOgorICAgICAgICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9J1RoaXMgaXMgYW4gWGNlcHRpb24nKQorICAgICAgICBlbGlmIGFyZzAgPT0gJ1hjZXB0aW9uMic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbjIoCisgICAgICAgICAgICAgICAgZXJyb3JDb2RlPTIwMDIsCisgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nPVh0cnVjdChzdHJpbmdfdGhpbmc9J1RoaXMgaXMgYW4gWGNlcHRpb24yJykpCisgICAgICAgIHJldHVybiBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPWFyZzEpCiAKLSAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYsIHNlY29uZHMpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0T25ld2F5KCVkKSA9PiBzbGVlcGluZy4uLicgJSBzZWNvbmRzKQorICAgICAgICB0aW1lLnNsZWVwKHNlY29uZHMgLyAzKSAgIyBiZSBxdWljaworICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdkb25lIHNsZWVwaW5nJykKIAotICBkZWYgdGVzdExpc3Qoc2VsZiwgdGhpbmcpOgotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0TmVzdChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3ROZXN0KCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RFbnVtKHNlbGYsIHRoaW5nKToKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdE1hcChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNYXAoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0U3RyaW5nTWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFN0cmluZ01hcCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi1wZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKLWhhbmRsZXIgPSBUZXN0SGFuZGxlcigpCi1wcm9jZXNzb3IgPSBUaHJpZnRUZXN0LlByb2Nlc3NvcihoYW5kbGVyKQorICAgIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFNldCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi1pZiBzeXMuYXJndlsxXSA9PSAiVEh0dHBTZXJ2ZXIiOgotICBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgOTA5MCksIHBmYWN0b3J5KQotZWxzZToKLSAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KDkwOTApCi0gIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBkZWYgdGVzdExpc3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TGlzdCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGlmIHN5cy5hcmd2WzFdID09ICJUTm9uYmxvY2tpbmdTZXJ2ZXIiOgotICAgIHNlcnZlciA9IFROb25ibG9ja2luZ1NlcnZlci5UTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQpCi0gIGVsc2U6Ci0gICAgU2VydmVyQ2xhc3MgPSBnZXRhdHRyKFRTZXJ2ZXIsIHN5cy5hcmd2WzFdKQotICAgIHNlcnZlciA9IFNlcnZlckNsYXNzKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgZGVmIHRlc3RFbnVtKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEVudW0oJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotc2VydmVyLnNlcnZlKCkKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0VHlwZWRlZiglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RNYXBNYXAoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TWFwTWFwKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIC00OiB7CisgICAgICAgICAgICAgICAgLTQ6IC00LAorICAgICAgICAgICAgICAgIC0zOiAtMywKKyAgICAgICAgICAgICAgICAtMjogLTIsCisgICAgICAgICAgICAgICAgLTE6IC0xLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIDQ6IHsKKyAgICAgICAgICAgICAgICA0OiA0LAorICAgICAgICAgICAgICAgIDM6IDMsCisgICAgICAgICAgICAgICAgMjogMiwKKyAgICAgICAgICAgICAgICAxOiAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfQorCisgICAgZGVmIHRlc3RJbnNhbml0eShzZWxmLCBhcmd1bWVudCk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJbnNhbml0eSglcyknICUgYXJndW1lbnQpCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAxOiB7CisgICAgICAgICAgICAgICAgMjogYXJndW1lbnQsCisgICAgICAgICAgICAgICAgMzogYXJndW1lbnQsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgMjogezY6IEluc2FuaXR5KCl9LAorICAgICAgICB9CisKKyAgICBkZWYgdGVzdE11bHRpKHNlbGYsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TXVsdGkoJXMpJyAlIFthcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1XSkKKyAgICAgICAgcmV0dXJuIFh0cnVjdChzdHJpbmdfdGhpbmc9J0hlbGxvMicsCisgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZz1hcmcwLCBpMzJfdGhpbmc9YXJnMSwgaTY0X3RoaW5nPWFyZzIpCisKKworZGVmIG1haW4ob3B0aW9ucyk6CisgICAgIyBzZXQgdXAgdGhlIHByb3RvY29sIGZhY3RvcnkgZm9ybSB0aGUgLS1wcm90b2NvbCBvcHRpb24KKyAgICBwcm90X2ZhY3RvcmllcyA9IHsKKyAgICAgICAgJ2FjY2VsJzogVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpLAorICAgICAgICAnYWNjZWxjJzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCksCisgICAgICAgICdiaW5hcnknOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAnY29tcGFjdCc6IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKyAgICAgICAgJ2hlYWRlcic6IFRIZWFkZXJQcm90b2NvbC5USGVhZGVyUHJvdG9jb2xGYWN0b3J5KGFsbG93ZWRfY2xpZW50X3R5cGVzPVsKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUywKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQ09NUEFDVCwKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCwKKyAgICAgICAgXSksCisgICAgICAgICdqc29uJzogVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLAorICAgIH0KKyAgICBwZmFjdG9yeSA9IHByb3RfZmFjdG9yaWVzLmdldChvcHRpb25zLnByb3RvLCBOb25lKQorICAgIGlmIHBmYWN0b3J5IGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tcHJvdG9jb2wgb3B0aW9uOiAlcycgJSBvcHRpb25zLnByb3RvKQorICAgIHRyeToKKyAgICAgICAgcGZhY3Rvcnkuc3RyaW5nX2xlbmd0aF9saW1pdCA9IG9wdGlvbnMuc3RyaW5nX2xpbWl0CisgICAgICAgIHBmYWN0b3J5LmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBvcHRpb25zLmNvbnRhaW5lcl9saW1pdAorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICMgSWdub3JlIGVycm9ycyBmb3IgdGhvc2UgcHJvdG9jb2xzIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBsZW5ndGggbGltaXQKKyAgICAgICAgcGFzcworCisgICAgIyBnZXQgdGhlIHNlcnZlciB0eXBlIChUU2ltcGxlU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIGV0Yy4uLikKKyAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignT25seSBvbmUgc2VydmVyIHR5cGUgbWF5IGJlIHNwZWNpZmllZCwgbm90IG11bHRpcGxlIHR5cGVzLicpCisgICAgc2VydmVyX3R5cGUgPSBhcmdzWzBdCisgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnaHR0cCc6CisgICAgICAgIHNlcnZlcl90eXBlID0gJ1RIdHRwU2VydmVyJworCisgICAgIyBTZXQgdXAgdGhlIGhhbmRsZXIgYW5kIHByb2Nlc3NvciBvYmplY3RzCisgICAgaGFuZGxlciA9IFRlc3RIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBUaHJpZnRUZXN0LlByb2Nlc3NvcihoYW5kbGVyKQorCisgICAgZ2xvYmFsIHNlcnZlcgorCisgICAgIyBIYW5kbGUgVEh0dHBTZXJ2ZXIgYXMgYSBzcGVjaWFsIGNhc2UKKyAgICBpZiBzZXJ2ZXJfdHlwZSA9PSAnVEh0dHBTZXJ2ZXInOgorICAgICAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgICAgIF9fY2VydGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJzZXJ2ZXIuY3J0IikKKyAgICAgICAgICAgIF9fa2V5ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgInNlcnZlci5rZXkiKQorICAgICAgICAgICAgc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoJycsIG9wdGlvbnMucG9ydCksIHBmYWN0b3J5LCBjZXJ0X2ZpbGU9X19jZXJ0ZmlsZSwga2V5X2ZpbGU9X19rZXlmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoJycsIG9wdGlvbnMucG9ydCksIHBmYWN0b3J5KQorICAgICAgICBzZXJ2ZXIuc2VydmUoKQorICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgIyBzZXQgdXAgc2VydmVyIHRyYW5zcG9ydCBhbmQgdHJhbnNwb3J0IGZhY3RvcnkKKworICAgIGFic19rZXlfcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICdrZXlzJywgJ3NlcnZlci5wZW0nKQorCisgICAgaG9zdCA9IE5vbmUKKyAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU1NMU29ja2V0CisgICAgICAgIHRyYW5zcG9ydCA9IFRTU0xTb2NrZXQuVFNTTFNlcnZlclNvY2tldChob3N0LCBvcHRpb25zLnBvcnQsIGNlcnRmaWxlPWFic19rZXlfcGF0aCkKKyAgICBlbHNlOgorICAgICAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0KQorICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBpZiBvcHRpb25zLnRyYW5zID09ICdidWZmZXJlZCc6CisgICAgICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJ2ZyYW1lZCc6CisgICAgICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICcnOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biAtLXRyYW5zcG9ydCBvcHRpb246ICVzJyAlIG9wdGlvbnMudHJhbnMpCisgICAgZWxzZToKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgICMgaWYgLS16bGliLCB0aGVuIHdyYXAgc2VydmVyIHRyYW5zcG9ydCwgYW5kIHVzZSBhIGRpZmZlcmVudCB0cmFuc3BvcnQgZmFjdG9yeQorICAgIGlmIG9wdGlvbnMuemxpYjoKKyAgICAgICAgdHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQodHJhbnNwb3J0KSAgIyB3cmFwICB3aXRoIHpsaWIKKyAgICAgICAgdGZhY3RvcnkgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydEZhY3RvcnkoKQorCisgICAgIyBkbyBzZXJ2ZXItc3BlY2lmaWMgc2V0dXAgaGVyZToKKyAgICBpZiBzZXJ2ZXJfdHlwZSA9PSAiVE5vbmJsb2NraW5nU2VydmVyIjoKKyAgICAgICAgc2VydmVyID0gVE5vbmJsb2NraW5nU2VydmVyLlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgaW5wdXRQcm90b2NvbEZhY3Rvcnk9cGZhY3RvcnkpCisgICAgZWxpZiBzZXJ2ZXJfdHlwZSA9PSAiVFByb2Nlc3NQb29sU2VydmVyIjoKKyAgICAgICAgaW1wb3J0IHNpZ25hbAorICAgICAgICBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRQcm9jZXNzUG9vbFNlcnZlcgorICAgICAgICBzZXJ2ZXIgPSBUUHJvY2Vzc1Bvb2xTZXJ2ZXIuVFByb2Nlc3NQb29sU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgICAgIHNlcnZlci5zZXROdW1Xb3JrZXJzKDUpCisKKyAgICAgICAgZGVmIHNldF9hbGFybSgpOgorICAgICAgICAgICAgZGVmIGNsZWFuX3NodXRkb3duKHNpZ251bSwgZnJhbWUpOgorICAgICAgICAgICAgICAgIGZvciB3b3JrZXIgaW4gc2VydmVyLndvcmtlcnM6CisgICAgICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ1Rlcm1pbmF0aW5nIHdvcmtlcjogJXMnICUgd29ya2VyKQorICAgICAgICAgICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCkKKyAgICAgICAgICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ1JlcXVlc3Rpbmcgc2VydmVyIHRvIHN0b3AoKScpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgY2xlYW5fc2h1dGRvd24pCisgICAgICAgICAgICBzaWduYWwuYWxhcm0oNCkKKyAgICAgICAgc2V0X2FsYXJtKCkKKyAgICBlbHNlOgorICAgICAgICAjIGxvb2sgdXAgc2VydmVyIGNsYXNzIGR5bmFtaWNhbGx5IHRvIGluc3RhbnRpYXRlIHNlcnZlcgorICAgICAgICBTZXJ2ZXJDbGFzcyA9IGdldGF0dHIoVFNlcnZlciwgc2VydmVyX3R5cGUpCisgICAgICAgIHNlcnZlciA9IFNlcnZlckNsYXNzKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgIyBlbnRlciBzZXJ2ZXIgbWFpbiBsb29wCisgICAgc2VydmVyLnNlcnZlKCkKKworCitkZWYgZXhpdF9ncmFjZWZ1bGx5KHNpZ251bSwgZnJhbWUpOgorICAgIHByaW50KCJTSUdJTlQgcmVjZWl2ZWRcbiIpCisgICAgc2VydmVyLnNodXRkb3duKCkgICAjIGRvZXNuJ3Qgd29yayBwcm9wZXJseSwgeWV0CisgICAgc3lzLmV4aXQoMCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgZXhpdF9ncmFjZWZ1bGx5KQorCisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1saWJweWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2xpYnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IHRvIHN5cy5wYXRoIGZvciBsb2NhdGluZyBsaWJyYXJ5IGNvZGUnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9J2dlbi1weScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSB0byBzeXMucGF0aCBmb3IgbG9jYXRpbmcgZ2VuZXJhdGVkIGNvZGUnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0temxpYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InpsaWIiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSB6bGliIHdyYXBwZXIgZm9yIGNvbXByZXNzZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tcHJvdG9jb2wnLCBkZXN0PSJwcm90byIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icHJvdG9jb2wgdG8gdXNlLCBvbmUgb2Y6IGFjY2VsLCBhY2NlbGMsIGJpbmFyeSwgY29tcGFjdCwganNvbiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tdHJhbnNwb3J0JywgZGVzdD0idHJhbnMiLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InRyYW5zcG9ydCB0byB1c2UsIG9uZSBvZjogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tY29udGFpbmVyLWxpbWl0JywgZGVzdD0nY29udGFpbmVyX2xpbWl0JywgdHlwZT0naW50JywgZGVmYXVsdD1Ob25lKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXN0cmluZy1saW1pdCcsIGRlc3Q9J3N0cmluZ19saW1pdCcsIHR5cGU9J2ludCcsIGRlZmF1bHQ9Tm9uZSkKKyAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHBvcnQ9OTA5MCwgdmVyYm9zZT0xLCBwcm90bz0nYmluYXJ5JywgdHJhbnNwb3J0PSdidWZmZXJlZCcpCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgICMgUHJpbnQgVFNlcnZlciBsb2cgdG8gc3Rkb3V0IHNvIHRoYXQgdGhlIHRlc3QtcnVubmVyIGNhbiByZWRpcmVjdCBpdCB0byBsb2cgZmlsZXMKKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPW9wdGlvbnMudmVyYm9zZSkKKworICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgb3B0aW9ucy5nZW5weWRpcikpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxvY2FsX2xpYnBhdGgoKSkKKworICAgIGZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAorICAgIGZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFh0cnVjdCwgWGNlcHRpb24sIFhjZXB0aW9uMiwgSW5zYW5pdHkKKyAgICBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIZWFkZXJUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRabGliVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRIZWFkZXJQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCisgICAgZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIFRIdHRwU2VydmVyCisKKyAgICBzeXMuZXhpdChtYWluKG9wdGlvbnMpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0U29ja2V0LnB5IGIvdGVzdC9weS9UZXN0U29ja2V0LnB5CmluZGV4IDJmNzM1M2YuLjYxOWViMTAgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdFNvY2tldC5weQorKysgYi90ZXN0L3B5L1Rlc3RTb2NrZXQucHkKQEAgLTE5LDI0ICsxOSwxNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotc3lzLnBhdGguaW5zZXJ0KDAsICcuL2dlbi1weScpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQotZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdGltZQogaW1wb3J0IHNvY2tldAogaW1wb3J0IHJhbmRvbQotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCisKIAogY2xhc3MgVGltZW91dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgZm9yIGkgaW4geHJhbmdlKDUwKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNTApOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICMgZmluZCBhIHBvcnQgd2UgY2FuIHVzZQogICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuX3NvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCkBAIC00NCw3ICszNiw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5saXN0ZW5fc29jay5iaW5kKCgnbG9jYWxob3N0Jywgc2VsZi5wb3J0KSkKICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbl9zb2NrLmxpc3Rlbig1KQogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgIGlmIGkgPT0gNDk6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAKQEAgLTUzLDEyICs0NSwxMiBAQAogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGxlYWt5ID0gW10KLSAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKICAgICAgICAgICAgICAgICBzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIHNlbGYucG9ydCkKICAgICAgICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCgxMCkKICAgICAgICAgICAgICAgICBzb2NrZXQub3BlbigpCiAgICAgICAgICAgICAgICAgbGVha3kuYXBwZW5kKHNvY2tldCkKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRpbWUudGltZSgpIC0gc3RhcnR0aW1lIDwgNS4wKQogCiAgICAgZGVmIHRlc3RXcml0ZVRpbWVvdXQoc2VsZik6CkBAIC03MCwxNSArNjIsMTcgQEAKICAgICAgICAgICAgIHNvY2tldC5vcGVuKCkKICAgICAgICAgICAgIGxzb2NrID0gc2VsZi5saXN0ZW5fc29jay5hY2NlcHQoKQogICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICBzb2NrZXQud3JpdGUoImhpIiAqIDEwMCkKKyAgICAgICAgICAgICAgICBsc29jay53cml0ZSgiaGkiICogMTAwKQogCi0gICAgICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0aW1lLnRpbWUoKSAtIHN0YXJ0dGltZSA8IDUuMCkKIAotc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCiAKLXN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUaW1lb3V0VGVzdCkpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKIAotdGVzdFJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKQotdGVzdFJ1bm5lci5ydW4oc3VpdGUpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRpbWVvdXRUZXN0KSkKKworICAgIHRlc3RSdW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikKKyAgICB0ZXN0UnVubmVyLnJ1bihzdWl0ZSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFN5bnRheC5weSBiL3Rlc3QvcHkvVGVzdFN5bnRheC5weQppbmRleCBkZjY3ZDQ4Li5kYmU3OTc1IDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RTeW50YXgucHkKKysrIGIvdGVzdC9weS9UZXN0U3ludGF4LnB5CkBAIC0xOSwxMCArMTksNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotc3lzLnBhdGguaW5zZXJ0KDAsICcuL2dlbi1weScpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQogIyBKdXN0IGltcG9ydCB0aGVzZSBnZW5lcmF0ZWQgZmlsZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHN5bnRhY3RpY2FsbHkgdmFsaWQKLWZyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEVtcHR5U2VydmljZQotZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgSW5oZXJpdGVkCitmcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBFbXB0eVNlcnZpY2UgICMgbm9xYQorZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgSW5oZXJpdGVkICAjIG5vcWEKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3J1bnRlc3Quc2ggYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS9ydW50ZXN0LnNoCmluZGV4IDJlNWE0ZjEuLjZkNzM0NjIgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3J1bnRlc3Quc2gKKysrIGIvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvcnVudGVzdC5zaApAQCAtMjIsNiArMjIsNyBAQAogcm0gLXJmIGdlbi1weQogLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBweSB0ZXN0MS50aHJpZnQgfHwgZXhpdCAxCiAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHB5IHRlc3QyLnRocmlmdCB8fCBleGl0IDEKKy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcHkgdGVzdDMudGhyaWZ0ICYmIGV4aXQgMSAgIyBGYWlsIHNpbmNlIHRlc3QzLnRocmlmdCBoYXMgcHl0aG9uIGtleXdvcmRzCiBQWVRIT05QQVRIPS4vZ2VuLXB5IHB5dGhvbiAtYyAnaW1wb3J0IGZvby5iYXIuYmF6JyB8fCBleGl0IDEKIFBZVEhPTlBBVEg9Li9nZW4tcHkgcHl0aG9uIC1jICdpbXBvcnQgdGVzdDInIHx8IGV4aXQgMQogUFlUSE9OUEFUSD0uL2dlbi1weSBweXRob24gLWMgJ2ltcG9ydCB0ZXN0MScgJj4vZGV2L251bGwgJiYgZXhpdCAxICAjIFNob3VsZCBmYWlsLgpkaWZmIC0tZ2l0IGEvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvdGVzdDMudGhyaWZ0IGIvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvdGVzdDMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDc4NmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS90ZXN0My50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgcHkgdmFsaWRhdGlvbnMKKworc3RydWN0IGZyb20geworICAxOiBpMzIgZGVmOworfQorCmRpZmYgLS1naXQgYS90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlIGIvdGVzdC9weS9nZW5lcmF0ZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQxNGNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9nZW5lcmF0ZS5jbWFrZQpAQCAtMCwwICsxLDM2IEBACittYWNybyhHRU5FUkFURSBGSUxFTkFNRSBHRU5FUkFUT1IgT1VUUFVURElSKQorICBmaWxlKE1BS0VfRElSRUNUT1JZICR7TVlfQ1VSUkVOVF9CSU5BUllfRElSfS8ke09VVFBVVERJUn0pCisgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7VEhSSUZUQ09NUElMRVJ9IC0tZ2VuICR7R0VORVJBVE9SfSAtb3V0ICR7TVlfQ1VSUkVOVF9CSU5BUllfRElSfS8ke09VVFBVVERJUn0gJHtGSUxFTkFNRX0KKyAgICAgICAgICAgICAgICAgIFJFU1VMVF9WQVJJQUJMRSBDTURfUkVTVUxUKQorICBpZihDTURfUkVTVUxUKQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJFcnJvciBnZW5lcmF0aW5nICR7RklMRU5BTUV9IHdpdGggZ2VuZXJhdG9yICR7R0VORVJBVE9SfSIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKEdFTkVSQVRFKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9zZXR1cC5jZmcgYi90ZXN0L3B5L3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGExZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9zZXR1cC5jZmcKQEAgLTAsMCArMSwyIEBACitbZmxha2U4XQorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L3B5L3V0aWwucHkgYi90ZXN0L3B5L3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiM2Y1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvdXRpbC5weQpAQCAtMCwwICsxLDMyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitfU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorX1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfU0NSSVBUX0RJUikpCisKKworZGVmIGxvY2FsX2xpYnBhdGgoKToKKyAgICBnbG9iZGlyID0gb3MucGF0aC5qb2luKF9ST09UX0RJUiwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpCisgICAgZm9yIGxpYnBhdGggaW4gZ2xvYi5nbG9iKGdsb2JkaXIpOgorICAgICAgICBpZiBsaWJwYXRoLmVuZHN3aXRoKCctJWQuJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pKToKKyAgICAgICAgICAgIHJldHVybiBsaWJwYXRoCmRpZmYgLS1naXQgYS90ZXN0L3JiL0dlbWZpbGUgYi90ZXN0L3JiL0dlbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmMDUzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmIvR2VtZmlsZQpAQCAtMCwwICsxLDcgQEAKK3NvdXJjZSAiaHR0cDovL3J1YnlnZW1zLm9yZyIKKworcmVxdWlyZSAicnVieWdlbXMiCisKK2dlbSAncmFjaycsICd+PiAyLjAnLCAnPj0gMi4wLjQnCitnZW0gJ3RoaW4nLCAnfj4gMS43JywgJz49IDEuNy4yJworZ2VtICd0ZXN0LXVuaXQnLCAnfj4gMy4yJywgJz49IDMuMi43JwpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9NYWtlZmlsZS5hbSBiL3Rlc3QvcmIvTWFrZWZpbGUuYW0KaW5kZXggYTZmNDMxYy4uY2ZkYzE0OSAxMDA2NDQKLS0tIGEvdGVzdC9yYi9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3JiL01ha2VmaWxlLmFtCkBAIC0xNywxMiArMTcsMTYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCi1zdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vU21hbGxUZXN0LnRocmlmdAorc3R1YnM6ICQoVEhSSUZUKSAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHJiIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHJiIC4uL1NtYWxsVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcmIgLi4vUmVjdXJzaXZlLnRocmlmdAorCitwcmVjcm9zczogc3R1YnMKIAogY2hlY2s6IHN0dWJzCi0JJChSVUJZKSB0ZXN0X3N1aXRlLnJiCitpZiBIQVZFX0JVTkRMRVIKKwkkKEJVTkRMRVIpIGluc3RhbGwKKwkkKEJVTkRMRVIpIGV4ZWMgJChSVUJZKSAtSS4gdGVzdF9zdWl0ZS5yYgorZW5kaWYKIApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9jb3JlL3RyYW5zcG9ydC90ZXN0X3RyYW5zcG9ydC5yYiBiL3Rlc3QvcmIvY29yZS90cmFuc3BvcnQvdGVzdF90cmFuc3BvcnQucmIKaW5kZXggNTI3NTVjMS4uMzdhZmE4NSAxMDA2NDQKLS0tIGEvdGVzdC9yYi9jb3JlL3RyYW5zcG9ydC90ZXN0X3RyYW5zcG9ydC5yYgorKysgYi90ZXN0L3JiL2NvcmUvdHJhbnNwb3J0L3Rlc3RfdHJhbnNwb3J0LnJiCkBAIC01MSw3ICs1MSw3IEBACiAgIAogICAjIFRPRE86CiAgICMgVGhpcyBkb2Vzbid0IG5lY2Vzc2FyaWx5IHRlc3QgaGUgcmlnaHQgdGhpbmcuCi0gICMgSXQgX2xvb2tzXyBsaWtlIHJlYWQgaXNuJ3QgZ3VhcmVudGVlZCB0byByZXR1cm4gdGhlIGxlbmd0aAorICAjIEl0IF9sb29rc18gbGlrZSByZWFkIGlzbid0IGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBsZW5ndGgKICAgIyB5b3UgYXNrIGZvciBhbmQgcmVhZF9hbGwgaXMuIFRoaXMgbWVhbnMgb3VyIHRlc3QgbmVlZHMgdG8gY2hlY2sKICAgIyBmb3IgYmxvY2tpbmcuIC0tIEtldmluIENsYXJrIDMvMjcvMDgKICAgZGVmIHRlc3RfcmVhZF9hbGwKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYiBiL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTEyZjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYi9nZW5lcmF0aW9uL3Rlc3RfcmVjdXJzaXZlLnJiCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vdGVzdF9oZWxwZXInKQorcmVxdWlyZSAncmVjdXJzaXZlX3R5cGVzJworCitjbGFzcyBUZXN0UmVjdXJzaXZlR2VuZXJhdGlvbiA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIENISUxEX0lURU0gPSAiY2hpbGQgaXRlbSIKKyAgUEFSRU5UX0lURU0gPSAicGFyZW50IGl0ZW0iCisKKyAgZGVmIHRlc3RfY2FuX2NyZWF0ZV9yZWN1cnNpdmVfdHJlZQorCisgICAgY2hpbGRfdHJlZSA9IFJlY1RyZWUubmV3CisgICAgY2hpbGRfdHJlZS5pdGVtID0gQ0hJTERfSVRFTQorCisgICAgcGFyZW50X3RyZWUgPSBSZWNUcmVlLm5ldworICAgIHBhcmVudF90cmVlLml0ZW0gPSBQQVJFTlRfSVRFTQorICAgIHBhcmVudF90cmVlLmNoaWxkcmVuID0gW2NoaWxkX3RyZWVdCisKKyAgICBhc3NlcnRfZXF1YWwoUEFSRU5UX0lURU0sIHBhcmVudF90cmVlLml0ZW0pCisgICAgYXNzZXJ0X2VxdWFsKDEsIHBhcmVudF90cmVlLmNoaWxkcmVuLmxlbmd0aCkKKyAgICBhc3NlcnRfZXF1YWwoQ0hJTERfSVRFTSwgcGFyZW50X3RyZWUuY2hpbGRyZW4uZmlyc3QuaXRlbSkKKyAgICBhc3NlcnRfbmlsKHBhcmVudF90cmVlLmNoaWxkcmVuLmZpcnN0LmNoaWxkcmVuKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzOWFjYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIKQEAgLTAsMCArMSwzODEgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCiskOi5wdXNoIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uJworCityZXF1aXJlICd0ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3RocmlmdCcKK3JlcXVpcmUgJ3RocmlmdF90ZXN0JworCiskZG9tYWluX3NvY2tldCA9IG5pbAorJGhvc3QgPSAibG9jYWxob3N0IgorJHBvcnQgPSA5MDkwCiskcHJvdG9jb2xUeXBlID0gImJpbmFyeSIKKyRzc2wgPSBmYWxzZQorJHRyYW5zcG9ydCA9ICJidWZmZXJlZCIKKworQVJHVi5lYWNoIGRvfGF8CisgIGlmIGEgPT0gIi0taGVscCIKKyAgICBwdXRzICJBbGxvd2VkIG9wdGlvbnM6IgorICAgIHB1dHMgIlx0IC1oIFsgLS1oZWxwIF0gXHQgcHJvZHVjZSBoZWxwIG1lc3NhZ2UiCisgICAgcHV0cyAiXHQtLWRvbWFpbi1zb2NrZXQgYXJnICg9KSBcdCBVbml4IGRvbWFpbiBzb2NrZXQgcGF0aCIKKyAgICBwdXRzICJcdC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpIFx0IEhvc3QgdG8gY29ubmVjdCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wb3J0IGFyZyAoPTkwOTApIFx0IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIgorICAgIHB1dHMgIlx0LS1zc2wgXHQgdXNlIHNzbCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIKKyAgICBleGl0CisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tZG9tYWluLXNvY2tldCIpCisgICAgJGRvbWFpbl9zb2NrZXQgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1ob3N0IikKKyAgICAkaG9zdCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXByb3RvY29sIikKKyAgICAkcHJvdG9jb2xUeXBlID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEgPT0gIi0tc3NsIgorICAgICRzc2wgPSB0cnVlCisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tdHJhbnNwb3J0IikKKyAgICAkdHJhbnNwb3J0ID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcG9ydCIpCisgICAgJHBvcnQgPSBhLnNwbGl0KCI9IilbMV0udG9faQorICBlbmQKK2VuZAorCitjbGFzcyBTaW1wbGVDbGllbnRUZXN0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyAgZGVmIHNldHVwCisgICAgdW5sZXNzIEBzb2NrZXQKKyAgICAgIGlmICRkb21haW5fc29ja2V0LnRvX3Muc3RyaXAuZW1wdHk/CisgICAgICAgIGlmICRzc2wKKyAgICAgICAgICAjIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgcnVieSBjcm9zc3Rlc3QgaXMgdGVzdC9yYi9nZW4tcmIKKyAgICAgICAgICBrZXlzRGlyID0gRmlsZS5qb2luKEZpbGUuZGlybmFtZShGaWxlLmRpcm5hbWUoRGlyLnB3ZCkpLCAia2V5cyIpCisgICAgICAgICAgY3R4ID0gT3BlblNTTDo6U1NMOjpTU0xDb250ZXh0Lm5ldworICAgICAgICAgIGN0eC5jYV9maWxlID0gRmlsZS5qb2luKGtleXNEaXIsICJDQS5wZW0iKQorICAgICAgICAgIGN0eC5jZXJ0ID0gT3BlblNTTDo6WDUwOTo6Q2VydGlmaWNhdGUubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgImNsaWVudC5jcnQiKSkpCisgICAgICAgICAgY3R4LmNlcnRfc3RvcmUgPSBPcGVuU1NMOjpYNTA5OjpTdG9yZS5uZXcKKyAgICAgICAgICBjdHguY2VydF9zdG9yZS5hZGRfZmlsZShGaWxlLmpvaW4oa2V5c0RpciwgJ3NlcnZlci5wZW0nKSkKKyAgICAgICAgICBjdHgua2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLm9wZW4oRmlsZS5qb2luKGtleXNEaXIsICJjbGllbnQua2V5IikpKQorICAgICAgICAgIGN0eC5vcHRpb25zID0gT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MiB8IE9wZW5TU0w6OlNTTDo6T1BfTk9fU1NMdjMKKyAgICAgICAgICBjdHguc3NsX3ZlcnNpb24gPSA6U1NMdjIzCisgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUgorICAgICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJGhvc3QsICRwb3J0LCBuaWwsIGN0eCkKKyAgICAgICAgZWxzZQorICAgICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJGhvc3QsICRwb3J0KQorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6VU5JWFNvY2tldC5uZXcoJGRvbWFpbl9zb2NrZXQpCisgICAgICBlbmQKKyAgICAgIAorICAgICAgaWYgJHRyYW5zcG9ydCA9PSAiYnVmZmVyZWQiCisgICAgICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyhAc29ja2V0KQorICAgICAgZWxzaWYgJHRyYW5zcG9ydCA9PSAiZnJhbWVkIgorICAgICAgICB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEBzb2NrZXQpCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlICdVbmtub3duIHRyYW5zcG9ydCB0eXBlJworICAgICAgZW5kCisKKyAgICAgIGlmICRwcm90b2NvbFR5cGUgPT0gImJpbmFyeSIKKyAgICAgICAgQHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGVsc2lmICRwcm90b2NvbFR5cGUgPT0gImNvbXBhY3QiCisgICAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6Q29tcGFjdFByb3RvY29sLm5ldyh0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgZWxzaWYgJHByb3RvY29sVHlwZSA9PSAianNvbiIKKyAgICAgICAgQHByb3RvY29sID0gVGhyaWZ0OjpKc29uUHJvdG9jb2wubmV3KHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICBlbHNpZiAkcHJvdG9jb2xUeXBlID09ICJhY2NlbCIKKyAgICAgICAgQHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLm5ldyh0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgZWxzZQorICAgICAgICByYWlzZSAnVW5rbm93biBwcm90b2NvbCB0eXBlJworICAgICAgZW5kCisgICAgICBAY2xpZW50ID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpDbGllbnQubmV3KEBwcm90b2NvbCkKKyAgICAgIEBzb2NrZXQub3BlbgorICAgIGVuZAorICBlbmQKKworICBkZWYgdGVhcmRvd24KKyAgICBAc29ja2V0LmNsb3NlCisgIGVuZAorCisgIGRlZiB0ZXN0X3ZvaWQKKyAgICBwICd0ZXN0X3ZvaWQnCisgICAgQGNsaWVudC50ZXN0Vm9pZCgpCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cmluZworICAgIHAgJ3Rlc3Rfc3RyaW5nJworICAgIHRlc3Rfc3RyaW5nID0KKyAgICAgICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnICsKKyAgICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJworICAgIHRlc3Rfc3RyaW5nID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiICsKKyAgICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisgICAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgICAgICLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIgKworICAgICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisgICAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgICAgICJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIgKworICAgICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisgICAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICAgICAiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIiArCisgICAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKyAgICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAgICAgIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIiArCisgICAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisgICAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAgICAgIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIgKworICAgICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisgICAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAgICAgIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiICsKKyAgICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworICAgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICAgICAiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiICsKKyAgICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKyAgICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgICAgICJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iCisKKyAgICByZXN1bHRfc3RyaW5nID0gQGNsaWVudC50ZXN0U3RyaW5nKHRlc3Rfc3RyaW5nKQorICAgIGFzc2VydF9lcXVhbCh0ZXN0X3N0cmluZywgcmVzdWx0X3N0cmluZy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6VVRGXzgpKQorICBlbmQKKworICBkZWYgdGVzdF9ib29sCisgICAgcCAndGVzdF9ib29sJworICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCb29sKHRydWUpLCB0cnVlKQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCb29sKGZhbHNlKSwgZmFsc2UpCisgIGVuZAorCisgIGRlZiB0ZXN0X2J5dGUKKyAgICBwICd0ZXN0X2J5dGUnCisgICAgdmFsID0gMTIwCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUodmFsKSwgdmFsKQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKC12YWwpLCAtdmFsKQorICBlbmQKKworICBkZWYgdGVzdF9pMzIKKyAgICBwICd0ZXN0X2kzMicKKyAgICB2YWwgPSAyMDAwMDAwMDMyCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMih2YWwpLCB2YWwpCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMigtdmFsKSwgLXZhbCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaTY0CisgICAgcCAndGVzdF9pNjQnCisgICAgdmFsID0gOTAwMDAwMDAwMDAwMDAwMDA2NAorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQodmFsKSwgdmFsKQorICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJNjQoLXZhbCksIC12YWwpCisgIGVuZAorCisgIGRlZiB0ZXN0X2RvdWJsZQorICAgIHAgJ3Rlc3RfZG91YmxlJworICAgIHZhbCA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKHZhbCksIHZhbCkKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0RG91YmxlKC12YWwpLCAtdmFsKQorICAgIGFzc2VydF9raW5kX29mKEZsb2F0LCBAY2xpZW50LnRlc3REb3VibGUodmFsKSkKKyAgZW5kCisKKyAgZGVmIHRlc3RfYmluYXJ5CisgICAgcCAndGVzdF9iaW5hcnknCisgICAgdmFsID0gKDAuLi4yNTYpLnJldmVyc2VfZWFjaC50b19hCisgICAgcmV0ID0gQGNsaWVudC50ZXN0QmluYXJ5KHZhbC5wYWNrKCdDKicpKQorICAgIGFzc2VydF9lcXVhbCh2YWwsIHJldC5ieXRlcy50b19hKQorICBlbmQKKworICBkZWYgdGVzdF9tYXAKKyAgICBwICd0ZXN0X21hcCcKKyAgICB2YWwgPSB7MSA9PiAxLCAyID0+IDIsIDMgPT4gM30KKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TWFwKHZhbCksIHZhbCkKKyAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBAY2xpZW50LnRlc3RNYXAodmFsKSkKKyAgZW5kCisKKyAgZGVmIHRlc3Rfc3RyaW5nX21hcAorICAgIHAgJ3Rlc3Rfc3RyaW5nX21hcCcKKyAgICB2YWwgPSB7J2EnID0+ICcyJywgJ2InID0+ICdibGFoJywgJ3NvbWUnID0+ICd0aGluZyd9CisgICAgcmV0ID0gQGNsaWVudC50ZXN0U3RyaW5nTWFwKHZhbCkKKyAgICBhc3NlcnRfZXF1YWwodmFsLCByZXQpCisgICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF9saXN0CisgICAgcCAndGVzdF9saXN0JworICAgIHZhbCA9IFsxLDIsMyw0LDVdCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdExpc3QodmFsKSwgdmFsKQorICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBAY2xpZW50LnRlc3RMaXN0KHZhbCkpCisgIGVuZAorCisgIGRlZiB0ZXN0X2VudW0KKyAgICBwICd0ZXN0X2VudW0nCisgICAgdmFsID0gVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpTSVgKKyAgICByZXQgPSBAY2xpZW50LnRlc3RFbnVtKHZhbCkKKworICAgIGFzc2VydF9lcXVhbChyZXQsIDYpCisgICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCByZXQpCisgIGVuZAorCisgIGRlZiB0ZXN0X3R5cGVkZWYKKyAgICBwICd0ZXN0X3R5cGVkZWYnCisgICAgI1VzZXJJZCAgdGVzdFR5cGVkZWYoMTogVXNlcklkIHRoaW5nKSwKKyAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpLCAzMDk4NTgyMzUwODI1MjMpCisgICAgYXNzZXJ0X2tpbmRfb2YoRml4bnVtLCBAY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykpCisgICAgdHJ1ZQorICBlbmQKKworICBkZWYgdGVzdF9zZXQKKyAgICBwICd0ZXN0X3NldCcKKyAgICB2YWwgPSBTZXQubmV3KFsxLDIsM10pCisgICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFNldCh2YWwpLCB2YWwpCisgICAgYXNzZXJ0X2tpbmRfb2YoU2V0LCBAY2xpZW50LnRlc3RTZXQodmFsKSkKKyAgZW5kCisKKyAgZGVmIGdldF9zdHJ1Y3QKKyAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeydzdHJpbmdfdGhpbmcnID0+ICdoaSEnLCAnaTMyX3RoaW5nJyA9PiA0IH0pCisgIGVuZAorCisgIGRlZiB0ZXN0X3N0cnVjdAorICAgIHAgJ3Rlc3Rfc3RydWN0JworICAgIHJldCA9IEBjbGllbnQudGVzdFN0cnVjdChnZXRfc3RydWN0KQorCisgICAgIyBUT0RPOiBub3Qgc3VyZSB3aGF0IHVuc3BlY2lmaWVkICJkZWZhdWx0IiByZXF1aXJlZG5lc3MgdmFsdWVzIHNob3VsZCBiZQorICAgIGFzc2VydChyZXQuYnl0ZV90aGluZyA9PSBuaWwgfHwgcmV0LmJ5dGVfdGhpbmcgPT0gMCkKKyAgICBhc3NlcnQocmV0Lmk2NF90aGluZyA9PSBuaWwgfHwgcmV0Lmk2NF90aGluZyA9PSAwKQorCisgICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJpbmdfdGhpbmcsICdoaSEnKQorICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCA0KQorICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQpCisgIGVuZAorCisgIGRlZiB0ZXN0X25lc3QKKyAgICBwICd0ZXN0X25lc3QnCisgICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6WHRydWN0Mi5uZXcoeydzdHJ1Y3RfdGhpbmcnID0+IGdldF9zdHJ1Y3QsICdpMzJfdGhpbmcnID0+IDEwfSkKKworICAgIHJldCA9IEBjbGllbnQudGVzdE5lc3Qoc3RydWN0MikKKworICAgICMgVE9ETzogbm90IHN1cmUgd2hhdCB1bnNwZWNpZmllZCAiZGVmYXVsdCIgcmVxdWlyZWRuZXNzIHZhbHVlcyBzaG91bGQgYmUKKyAgICBhc3NlcnQocmV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nID09IG5pbCB8fCByZXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcgPT0gMCkKKyAgICBhc3NlcnQocmV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcgPT0gbmlsIHx8IHJldC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nID09IDApCisKKyAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsICdoaSEnKQorICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgNCkKKyAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgMTApCisKKyAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0LnN0cnVjdF90aGluZykKKyAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdDIsIHJldCkKKyAgZW5kCisKKyAgZGVmIHRlc3RfaW5zYW5pdHkKKyAgICBwICd0ZXN0X2luc2FuaXR5JworICAgIGluc2FuZSA9IFRocmlmdDo6VGVzdDo6SW5zYW5pdHkubmV3KHsKKyAgICAgICd1c2VyTWFwJyA9PiB7CisgICAgICAgIFRocmlmdDo6VGVzdDo6TnVtYmVyejo6RklWRSA9PiA1LAorICAgICAgICBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OkVJR0hUID0+IDgsCisgICAgICB9LAorICAgICAgJ3h0cnVjdHMnID0+IFsKKyAgICAgICAgVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKKyAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnR29vZGJ5ZTQnLAorICAgICAgICAgICdieXRlX3RoaW5nJyA9PiA0LAorICAgICAgICAgICdpMzJfdGhpbmcnID0+IDQsCisgICAgICAgICAgJ2k2NF90aGluZycgPT4gNCwKKyAgICAgICAgfSksCisgICAgICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7CisgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0hlbGxvMicsCisgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDIsCisgICAgICAgICAgJ2kzMl90aGluZycgPT4gMiwKKyAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAyLAorICAgICAgICB9KQorICAgICAgXQorICAgIH0pCisKKyAgICByZXQgPSBAY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpCisKKyAgICBhc3NlcnRfZXF1YWwoaW5zYW5lLCByZXRbMV1bMl0pCisgICAgYXNzZXJ0X2VxdWFsKGluc2FuZSwgcmV0WzFdWzNdKQorCisgICAgYXNzZXJ0KHJldFsyXVs2XS51c2VyTWFwID09IG5pbCB8fCByZXRbMl1bNl0udXNlck1hcC5sZW5ndGggPT0gMCkKKyAgICBhc3NlcnQocmV0WzJdWzZdLnh0cnVjdHMgPT0gbmlsIHx8IHJldFsyXVs2XS54dHJ1Y3RzLmxlbmd0aCA9PSAwKQorICBlbmQKKworICBkZWYgdGVzdF9tYXBfbWFwCisgICAgcCAndGVzdF9tYXBfbWFwJworICAgIHJldCA9IEBjbGllbnQudGVzdE1hcE1hcCg0KQorICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHJldCkKKyAgICBleHBlY3RlZCA9IHsKKyAgICAgIC00ID0+IHsKKyAgICAgICAgLTQgPT4gLTQsCisgICAgICAgIC0zID0+IC0zLAorICAgICAgICAtMiA9PiAtMiwKKyAgICAgICAgLTEgPT4gLTEsCisgICAgICB9LAorICAgICAgNCA9PiB7CisgICAgICAgIDQgPT4gNCwKKyAgICAgICAgMyA9PiAzLAorICAgICAgICAyID0+IDIsCisgICAgICAgIDEgPT4gMSwKKyAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0X2VxdWFsKGV4cGVjdGVkLCByZXQpCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpCisgICAgcCAndGVzdF9tdWx0aScKKyAgICByZXQgPSBAY2xpZW50LnRlc3RNdWx0aSg0MiwgNDI0MiwgNDI0MjQyLCB7MSA9PiAnYmxhaCcsIDIgPT4gJ3RoaW5nJ30sIFRocmlmdDo6VGVzdDo6TnVtYmVyejo6RUlHSFQsIDI0KQorICAgIGV4cGVjdGVkID0gVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKKyAgICAgIDpzdHJpbmdfdGhpbmcgPT4gJ0hlbGxvMicsCisgICAgICA6Ynl0ZV90aGluZyA9PiAgIDQyLAorICAgICAgOmkzMl90aGluZyA9PiAgICA0MjQyLAorICAgICAgOmk2NF90aGluZyA9PiAgICA0MjQyNDIKKyAgICB9KQorICAgIGFzc2VydF9lcXVhbChleHBlY3RlZCwgcmV0KQorICBlbmQKKworICBkZWYgdGVzdF9leGNlcHRpb24KKyAgICBwICd0ZXN0X2V4Y2VwdGlvbicKKyAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiBkbworICAgICAgQGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCisgICAgZW5kCisgICAgYmVnaW4KKyAgICAgIEBjbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpCisgICAgcmVzY3VlID0+IGUKKyAgICAgIGFzc2VydCBlLmNsYXNzLmFuY2VzdG9ycy5pbmNsdWRlPyhUaHJpZnQ6OkV4Y2VwdGlvbikKKyAgICBlbmQKKyAgICBhc3NlcnRfbm90aGluZ19yYWlzZWQgZG8KKyAgICAgIEBjbGllbnQudGVzdEV4Y2VwdGlvbigndGVzdCcpCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0X211bHRpX2V4Y2VwdGlvbgorICAgIHAgJ3Rlc3RfbXVsdGlfZXhjZXB0aW9uJworICAgIGFzc2VydF9yYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uIGRvCisgICAgICBAY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24iLCAidGVzdCAxIikKKyAgICBlbmQKKyAgICBhc3NlcnRfcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbjIgZG8KKyAgICAgIEBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAidGVzdCAyIikKKyAgICBlbmQKKyAgICBhc3NlcnRfZXF1YWwoIEBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJTdWNjZXNzIiwgInRlc3QgMyIpLnN0cmluZ190aGluZywgInRlc3QgMyIpCisgIGVuZAorCisgIGRlZiB0ZXN0X29uZXdheQorICAgIHAgJ3Rlc3Rfb25ld2F5JworICAgIHRpbWUxID0gVGltZS5ub3cudG9fZgorICAgIEBjbGllbnQudGVzdE9uZXdheSgxKQorICAgIHRpbWUyID0gVGltZS5ub3cudG9fZgorICAgIGFzc2VydF9vcGVyYXRvciAodGltZTItdGltZTEpLCA6PCwgMC4xCisgIGVuZAorCitlbmQKKwpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjYWY2YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIKQEAgLTAsMCArMSwxODggQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyQ6LnB1c2ggRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICcvLi4nCisKK3JlcXVpcmUgJ3Rlc3RfaGVscGVyJworcmVxdWlyZSAndGhyaWZ0JworcmVxdWlyZSAndGhyaWZ0X3Rlc3QnCityZXF1aXJlICd0aHJpZnRfdGVzdF90eXBlcycKKworY2xhc3MgU2ltcGxlSGFuZGxlcgorICBbOnRlc3RWb2lkLCA6dGVzdFN0cmluZywgOnRlc3RCb29sLCA6dGVzdEJ5dGUsIDp0ZXN0STMyLCA6dGVzdEk2NCwgOnRlc3REb3VibGUsIDp0ZXN0QmluYXJ5LAorICAgOnRlc3RTdHJ1Y3QsIDp0ZXN0TWFwLCA6dGVzdFN0cmluZ01hcCwgOnRlc3RTZXQsIDp0ZXN0TGlzdCwgOnRlc3ROZXN0LCA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZiwKKyAgIDp0ZXN0RW51bSwgOnRlc3RUeXBlZGVmLCA6dGVzdE11bHRpRXhjZXB0aW9uXS5lYWNoIGRvIHxtZXRofAorCisgICAgZGVmaW5lX21ldGhvZChtZXRoKSBkbyB8dGhpbmd8CisgICAgICBwIG1ldGgKKyAgICAgIHAgdGhpbmcKKyAgICAgIHRoaW5nCisgICAgZW5kCisKKyAgZW5kCisKKyAgZGVmIHRlc3RWb2lkKCkKKyAgZW5kCisKKyAgZGVmIHRlc3RJbnNhbml0eSh0aGluZykKKyAgICByZXR1cm4geworICAgICAgMSA9PiB7CisgICAgICAgIDIgPT4gdGhpbmcsCisgICAgICAgIDMgPT4gdGhpbmcKKyAgICAgIH0sCisgICAgICAyID0+IHsKKyAgICAgICAgNiA9PiBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5OjpuZXcoKQorICAgICAgfQorICAgIH0KKyAgZW5kCisKKyAgZGVmIHRlc3RNYXBNYXAodGhpbmcpCisgICAgcmV0dXJuIHsKKyAgICAgIC00ID0+IHsKKyAgICAgICAgLTQgPT4gLTQsCisgICAgICAgIC0zID0+IC0zLAorICAgICAgICAtMiA9PiAtMiwKKyAgICAgICAgLTEgPT4gLTEsCisgICAgICB9LAorICAgICAgNCA9PiB7CisgICAgICAgIDQgPT4gNCwKKyAgICAgICAgMyA9PiAzLAorICAgICAgICAyID0+IDIsCisgICAgICAgIDEgPT4gMSwKKyAgICAgIH0KKyAgICB9CisgIGVuZAorCisgIGRlZiB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkKKyAgICByZXR1cm4gVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsKKyAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdIZWxsbzInLAorICAgICAgJ2J5dGVfdGhpbmcnID0+IGFyZzAsCisgICAgICAnaTMyX3RoaW5nJyA9PiBhcmcxLAorICAgICAgJ2k2NF90aGluZycgPT4gYXJnMiwKKyAgICB9KQorICBlbmQKKworICBkZWYgdGVzdEV4Y2VwdGlvbih0aGluZykKKyAgICBpZiB0aGluZyA9PSAiWGNlcHRpb24iCisgICAgICByYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uLCA6ZXJyb3JDb2RlID0+IDEwMDEsIDptZXNzYWdlID0+IHRoaW5nCisgICAgZWxzaWYgdGhpbmcgPT0gIlRFeGNlcHRpb24iCisgICAgICByYWlzZSBUaHJpZnQ6OkV4Y2VwdGlvbiwgOm1lc3NhZ2UgPT4gdGhpbmcKKyAgICBlbHNlCisgICAgICAjIG5vLW9wCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0TXVsdGlFeGNlcHRpb24oYXJnMCwgYXJnMSkKKyAgICBpZiBhcmcwID09ICJYY2VwdGlvbjIiCisgICAgICByYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uMiwgOmVycm9yQ29kZSA9PiAyMDAyLCA6c3RydWN0X3RoaW5nID0+IDo6VGhyaWZ0OjpUZXN0OjpYdHJ1Y3QubmV3KHsgOnN0cmluZ190aGluZyA9PiAnVGhpcyBpcyBhbiBYY2VwdGlvbjInIH0pCisgICAgZWxzaWYgYXJnMCA9PSAiWGNlcHRpb24iCisgICAgICByYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uLCA6ZXJyb3JDb2RlID0+IDEwMDEsIDptZXNzYWdlID0+ICdUaGlzIGlzIGFuIFhjZXB0aW9uJworICAgIGVsc2UKKyAgICAgIHJldHVybiA6OlRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7J3N0cmluZ190aGluZycgPT4gYXJnMX0pCisgICAgZW5kCisgIGVuZAorCisgIGRlZiB0ZXN0T25ld2F5KGFyZzApCisgICAgc2xlZXAoYXJnMCkKKyAgZW5kCisKK2VuZAorCitkb21haW5fc29ja2V0ID0gbmlsCitwb3J0ID0gOTA5MAorcHJvdG9jb2wgPSAiYmluYXJ5IgorQHByb3RvY29sRmFjdG9yeSA9IG5pbAorc3NsID0gZmFsc2UKK3RyYW5zcG9ydCA9ICJidWZmZXJlZCIKK0B0cmFuc3BvcnRGYWN0b3J5ID0gbmlsCisKK0FSR1YuZWFjaCBkb3xhfAorICBpZiBhID09ICItLWhlbHAiCisgICAgcHV0cyAiQWxsb3dlZCBvcHRpb25zOiIKKyAgICBwdXRzICJcdCAtaCBbIC0taGVscCBdIFx0IHByb2R1Y2UgaGVscCBtZXNzYWdlIgorICAgIHB1dHMgIlx0LS1kb21haW4tc29ja2V0IGFyZyAoPSkgXHQgVW5peCBkb21haW4gc29ja2V0IHBhdGgiCisgICAgcHV0cyAiXHQtLXBvcnQgYXJnICg9OTA5MCkgXHQgUG9ydCBudW1iZXIgdG8gbGlzdGVuIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCisgICAgcHV0cyAiXHQtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgXHQgcHJvdG9jb2w6IGFjY2VsLCBiaW5hcnksIGNvbXBhY3QsIGpzb24iCisgICAgcHV0cyAiXHQtLXNzbCBcdCB1c2Ugc3NsIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCisgICAgcHV0cyAiXHQtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIgorICAgIGV4aXQKKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1kb21haW4tc29ja2V0IikKKyAgICBkb21haW5fc29ja2V0ID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcHJvdG9jb2wiKQorICAgIHByb3RvY29sID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEgPT0gIi0tc3NsIgorICAgIHNzbCA9IHRydWUKKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS10cmFuc3BvcnQiKQorICAgIHRyYW5zcG9ydCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXBvcnQiKQorICAgIHBvcnQgPSBhLnNwbGl0KCI9IilbMV0udG9faSAKKyAgZW5kCitlbmQKKworaWYgcHJvdG9jb2wgPT0gImJpbmFyeSIgfHwgcHJvdG9jb2wudG9fcy5zdHJpcC5lbXB0eT8KKyAgQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldworZWxzaWYgcHJvdG9jb2wgPT0gImNvbXBhY3QiCisgIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3CitlbHNpZiBwcm90b2NvbCA9PSAianNvbiIKKyAgQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcKK2Vsc2lmIHByb3RvY29sID09ICJhY2NlbCIKKyAgQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3CitlbHNlCisgIHJhaXNlICdVbmtub3duIHByb3RvY29sIHR5cGUnCitlbmQKKworaWYgdHJhbnNwb3J0ID09ICJidWZmZXJlZCIgfHwgdHJhbnNwb3J0LnRvX3Muc3RyaXAuZW1wdHk/CisgIEB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3CitlbHNpZiB0cmFuc3BvcnQgPT0gImZyYW1lZCIKKyAgQHRyYW5zcG9ydEZhY3RvcnkgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3CitlbHNlCisgIHJhaXNlICdVbmtub3duIHRyYW5zcG9ydCB0eXBlJworZW5kCisKK0BoYW5kbGVyID0gU2ltcGxlSGFuZGxlci5uZXcKK0Bwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OlByb2Nlc3Nvci5uZXcoQGhhbmRsZXIpCitAdHJhbnNwb3J0ID0gbmlsCitpZiBkb21haW5fc29ja2V0LnRvX3Muc3RyaXAuZW1wdHk/CisgIGlmIHNzbAorICAgICMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBydWJ5IGNyb3NzdGVzdCBpcyB0ZXN0L3JiL2dlbi1yYgorICAgIGtleXNEaXIgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKEZpbGUuZGlybmFtZShEaXIucHdkKSksICJrZXlzIikKKyAgICBjdHggPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CisgICAgY3R4LmNhX2ZpbGUgPSBGaWxlLmpvaW4oa2V5c0RpciwgIkNBLnBlbSIpCisgICAgY3R4LmNlcnQgPSBPcGVuU1NMOjpYNTA5OjpDZXJ0aWZpY2F0ZS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAic2VydmVyLmNydCIpKSkKKyAgICBjdHguY2VydF9zdG9yZSA9IE9wZW5TU0w6Olg1MDk6OlN0b3JlLm5ldworICAgIGN0eC5jZXJ0X3N0b3JlLmFkZF9maWxlKEZpbGUuam9pbihrZXlzRGlyLCAnY2xpZW50LnBlbScpKQorICAgIGN0eC5rZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgInNlcnZlci5rZXkiKSkpCisgICAgY3R4Lm9wdGlvbnMgPSBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYyIHwgT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MworICAgIGN0eC5zc2xfdmVyc2lvbiA9IDpTU0x2MjMKKyAgICBjdHgudmVyaWZ5X21vZGUgPSBPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSCisgICAgQHRyYW5zcG9ydCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0Lm5ldyhuaWwsIHBvcnQsIGN0eCkKKyAgZWxzZQorICAgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcocG9ydCkKKyAgZW5kCitlbHNlCisgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlVOSVhTZXJ2ZXJTb2NrZXQubmV3KGRvbWFpbl9zb2NrZXQpCitlbmQKKworQHNlcnZlciA9IFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIubmV3KEBwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIEB0cmFuc3BvcnRGYWN0b3J5LCBAcHJvdG9jb2xGYWN0b3J5KQorCitwdXRzICJTdGFydGluZyBUZXN0U2VydmVyICN7QHNlcnZlci50b19zfSIKK0BzZXJ2ZXIuc2VydmUKK3B1dHMgImRvbmUuIgpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9hY2NlbGVyYXRlZF9idWZmZXJlZF9jbGllbnQucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL2FjY2VsZXJhdGVkX2J1ZmZlcmVkX2NsaWVudC5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlYzFkZi4uMDAwMDAwMAotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL2FjY2VsZXJhdGVkX2J1ZmZlcmVkX2NsaWVudC5yYgorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uL3Rlc3RfaGVscGVyJykKLQotcmVxdWlyZSAndGhyaWZ0JwotcmVxdWlyZSAnVGhyaWZ0VGVzdCcKLQotY2xhc3MgQWNjZWxlcmF0ZWRCdWZmZXJlZENsaWVudFRlc3QgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQotICBkZWYgc2V0dXAKLSAgICB1bmxlc3MgQHNvY2tldAotICAgICAgQHNvY2tldCAgID0gVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA5MDkwKQotICAgICAgQHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLm5ldyhUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyhAc29ja2V0KSkKLSAgICAgIEBjbGllbnQgICA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCi0gICAgICBAc29ja2V0Lm9wZW4KLSAgICBlbmQKLSAgZW5kCi0gIAotICBkZWYgdGVzdF9zdHJpbmcKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0U3RyaW5nKCdzdHJpbmcnKSwgJ3N0cmluZycpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2J5dGUKLSAgICB2YWwgPSA4Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pMzIKLSAgICB2YWwgPSAzMgotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2k2NAotICAgIHZhbCA9IDY0Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZG91YmxlCi0gICAgdmFsID0gMy4xNAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUoLXZhbCksIC12YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRmxvYXQsIEBjbGllbnQudGVzdERvdWJsZSh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9tYXAKLSAgICB2YWwgPSB7MSA9PiAxLCAyID0+IDIsIDMgPT4gM30KLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TWFwKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBAY2xpZW50LnRlc3RNYXAodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbGlzdAotICAgIHZhbCA9IFsxLDIsMyw0LDVdCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdExpc3QodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBAY2xpZW50LnRlc3RMaXN0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2VudW0KLSAgICB2YWwgPSBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OlNJWAotICAgIHJldCA9IEBjbGllbnQudGVzdEVudW0odmFsKQotCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgNikKLSAgICBhc3NlcnRfa2luZF9vZihGaXhudW0sIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfdHlwZWRlZgotICAgICNVc2VySWQgIHRlc3RUeXBlZGVmKDE6IFVzZXJJZCB0aGluZyksCi0gICAgdHJ1ZQotICBlbmQKLQotICBkZWYgdGVzdF9zZXQKLSAgICB2YWwgPSBTZXQubmV3KFsxLDIsM10pCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFNldCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoU2V0LCBAY2xpZW50LnRlc3RTZXQodmFsKSkKLSAgZW5kCi0KLSAgZGVmIGdldF9zdHJ1Y3QKLSAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeydzdHJpbmdfdGhpbmcnID0+ICdoaSEnLCAnaTMyX3RoaW5nJyA9PiA0IH0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3N0cnVjdAotICAgIHJldCA9IEBjbGllbnQudGVzdFN0cnVjdChnZXRfc3RydWN0KQotCi0gICAgYXNzZXJ0X25pbChyZXQuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0Lmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9uZXN0Ci0gICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6WHRydWN0Mi5uZXcoeydzdHJ1Y3RfdGhpbmcnID0+IGdldF9zdHJ1Y3QsICdpMzJfdGhpbmcnID0+IDEwfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdE5lc3Qoc3RydWN0MikKLQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCAxMCkKLQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQuc3RydWN0X3RoaW5nKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0MiwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9pbnNhbmUKLSAgICBpbnNhbmUgPSBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5Lm5ldyh7Ci0gICAgICAndXNlck1hcCcgPT4geyBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORSA9PiA0NCB9LAotICAgICAgJ3h0cnVjdHMnID0+IFtnZXRfc3RydWN0LAotICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoewotICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdoaSBhZ2FpbicsCi0gICAgICAgICAgJ2kzMl90aGluZycgPT4gMTIKLSAgICAgICAgfSkKLSAgICAgIF0KLSAgICB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKQotCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XSkKLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdWzFdKQotCi0gICAgc3RydWN0ID0gcmV0WzQ0XVsxXQotCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC51c2VyTWFwW1RocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FXSwgNDQpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLnN0cmluZ190aGluZywgJ2hpIGFnYWluJykKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uaTMyX3RoaW5nLCAxMikKLQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHN0cnVjdC51c2VyTWFwKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBzdHJ1Y3QueHRydWN0cykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5LCBzdHJ1Y3QpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcF9tYXAKLSAgICByZXQgPSBAY2xpZW50LnRlc3RNYXBNYXAoNCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgeyA0ID0+IHsgNCA9PiA0fX0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2V4Y2VwdGlvbgotICAgIGFzc2VydF9yYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uIGRvCi0gICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ2ZvbycpCi0gICAgZW5kCi0gIGVuZAotZW5kCi0KZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vYWNjZWxlcmF0ZWRfYnVmZmVyZWRfc2VydmVyLnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9hY2NlbGVyYXRlZF9idWZmZXJlZF9zZXJ2ZXIucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTY2ZTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9hY2NlbGVyYXRlZF9idWZmZXJlZF9zZXJ2ZXIucmIKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotJDoucHVzaCBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi9nZW4tcmInCi0kOi5wdXNoIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vLi4vLi4vbGliL3JiL2xpYicpCi0kOi5wdXNoIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vLi4vLi4vbGliL3JiL2V4dCcpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIFNpbXBsZUhhbmRsZXIKLSAgWzp0ZXN0U3RyaW5nLCA6dGVzdEJ5dGUsIDp0ZXN0STMyLCA6dGVzdEk2NCwgOnRlc3REb3VibGUsCi0gICA6dGVzdFN0cnVjdCwgOnRlc3RNYXAsIDp0ZXN0U2V0LCA6dGVzdExpc3QsIDp0ZXN0TmVzdCwKLSAgIDp0ZXN0RW51bSwgOnRlc3RUeXBlZGVmXS5lYWNoIGRvIHxtZXRofAotCi0gICAgZGVmaW5lX21ldGhvZChtZXRoKSBkbyB8dGhpbmd8Ci0gICAgICB0aGluZwotICAgIGVuZAotCi0gIGVuZAotCi0gIGRlZiB0ZXN0SW5zYW5pdHkodGhpbmcpCi0gICAgbnVtLCB1aWQgPSB0aGluZy51c2VyTWFwLmZpbmQgeyB0cnVlIH0KLSAgICByZXR1cm4ge3VpZCA9PiB7bnVtID0+IHRoaW5nfX0KLSAgZW5kCi0KLSAgZGVmIHRlc3RNYXBNYXAodGhpbmcpCi0gICAgcmV0dXJuIHt0aGluZyA9PiB7dGhpbmcgPT4gdGhpbmd9fQotICBlbmQKLQotICBkZWYgdGVzdEVudW0odGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCi0gIGVuZAotCi0gIGRlZiB0ZXN0VHlwZWRlZih0aGluZykKLSAgICByZXR1cm4gdGhpbmcKLSAgZW5kCi0KLSAgZGVmIHRlc3RFeGNlcHRpb24odGhpbmcpCi0gICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiwgOm1lc3NhZ2UgPT4gJ2Vycm9yJwotICBlbmQKLWVuZAotCi1AaGFuZGxlciAgID0gU2ltcGxlSGFuZGxlci5uZXcKLUBwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OlByb2Nlc3Nvci5uZXcoQGhhbmRsZXIpCi1AdHJhbnNwb3J0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KDkwOTApCi1Ac2VydmVyICAgID0gVGhyaWZ0OjpUaHJlYWRlZFNlcnZlci5uZXcoQHByb2Nlc3NvciwgQHRyYW5zcG9ydCwgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LCBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldykKLQotQHNlcnZlci5zZXJ2ZQpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9idWZmZXJlZF9jbGllbnQucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL2J1ZmZlcmVkX2NsaWVudC5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5MjVjYy4uMDAwMDAwMAotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL2J1ZmZlcmVkX2NsaWVudC5yYgorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uL3Rlc3RfaGVscGVyJykKLQotcmVxdWlyZSAndGhyaWZ0JwotcmVxdWlyZSAnVGhyaWZ0VGVzdCcKLQotY2xhc3MgQnVmZmVyZWRDbGllbnRUZXN0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKLSAgZGVmIHNldHVwCi0gICAgdW5sZXNzIEBzb2NrZXQKLSAgICAgIEBzb2NrZXQgICA9IFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgOTA5MCkKLSAgICAgIEBwcm90b2NvbCA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KEBzb2NrZXQpKQotICAgICAgQGNsaWVudCAgID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpDbGllbnQubmV3KEBwcm90b2NvbCkKLSAgICAgIEBzb2NrZXQub3BlbgotICAgIGVuZAotICBlbmQKLSAgCi0gIGRlZiB0ZXN0X3N0cmluZwotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RTdHJpbmcoJ3N0cmluZycpLCAnc3RyaW5nJykKLSAgZW5kCi0KLSAgZGVmIHRlc3RfYnl0ZQotICAgIHZhbCA9IDgKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0Qnl0ZSh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2kzMgotICAgIHZhbCA9IDMyCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMih2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEkzMigtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaTY0Ci0gICAgdmFsID0gNjQKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0STY0KC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9kb3VibGUKLSAgICB2YWwgPSAzLjE0Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdERvdWJsZSgtdmFsKSwgLXZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihGbG9hdCwgQGNsaWVudC50ZXN0RG91YmxlKHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcAotICAgIHZhbCA9IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzfQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RNYXAodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIEBjbGllbnQudGVzdE1hcCh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9saXN0Ci0gICAgdmFsID0gWzEsMiwzLDQsNV0KLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TGlzdCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoQXJyYXksIEBjbGllbnQudGVzdExpc3QodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZW51bQotICAgIHZhbCA9IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6U0lYCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0RW51bSh2YWwpCi0KLSAgICBhc3NlcnRfZXF1YWwocmV0LCA2KQotICAgIGFzc2VydF9raW5kX29mKEZpeG51bSwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF90eXBlZGVmCi0gICAgI1VzZXJJZCAgdGVzdFR5cGVkZWYoMTogVXNlcklkIHRoaW5nKSwKLSAgICB0cnVlCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3NldAotICAgIHZhbCA9IFNldC5uZXcoWzEsMiwzXSkKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0U2V0KHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihTZXQsIEBjbGllbnQudGVzdFNldCh2YWwpKQotICBlbmQKLQotICBkZWYgZ2V0X3N0cnVjdAotICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7J3N0cmluZ190aGluZycgPT4gJ2hpIScsICdpMzJfdGhpbmcnID0+IDQgfSkKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc3RydWN0Ci0gICAgcmV0ID0gQGNsaWVudC50ZXN0U3RydWN0KGdldF9zdHJ1Y3QpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuaTY0X3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X25lc3QKLSAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLm5ldyh7J3N0cnVjdF90aGluZycgPT4gZ2V0X3N0cnVjdCwgJ2kzMl90aGluZycgPT4gMTB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TmVzdChzdHJ1Y3QyKQotCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDEwKQotCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldC5zdHJ1Y3RfdGhpbmcpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2luc2FuZQotICAgIGluc2FuZSA9IFRocmlmdDo6VGVzdDo6SW5zYW5pdHkubmV3KHsKLSAgICAgICd1c2VyTWFwJyA9PiB7IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FID0+IDQ0IH0sCi0gICAgICAneHRydWN0cycgPT4gW2dldF9zdHJ1Y3QsCi0gICAgICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7Ci0gICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2hpIGFnYWluJywKLSAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMgotICAgICAgICB9KQotICAgICAgXQotICAgIH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpCi0KLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdKQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF1bMV0pCi0KLSAgICBzdHJ1Y3QgPSByZXRbNDRdWzFdCi0KLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0LnVzZXJNYXBbVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkVdLCA0NCkKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uc3RyaW5nX3RoaW5nLCAnaGkgYWdhaW4nKQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5pMzJfdGhpbmcsIDEyKQotCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgc3RydWN0LnVzZXJNYXApCi0gICAgYXNzZXJ0X2tpbmRfb2YoQXJyYXksIHN0cnVjdC54dHJ1Y3RzKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6SW5zYW5pdHksIHN0cnVjdCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwX21hcAotICAgIHJldCA9IEBjbGllbnQudGVzdE1hcE1hcCg0KQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHJldCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LCB7IDQgPT4geyA0ID0+IDR9fSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZXhjZXB0aW9uCi0gICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24gZG8KLSAgICAgIEBjbGllbnQudGVzdEV4Y2VwdGlvbignZm9vJykKLSAgICBlbmQKLSAgZW5kCi1lbmQKLQpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9zaW1wbGVfY2xpZW50LnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9zaW1wbGVfY2xpZW50LnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDY0ODIyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vc2ltcGxlX2NsaWVudC5yYgorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uL3Rlc3RfaGVscGVyJykKLQotcmVxdWlyZSAndGhyaWZ0JwotcmVxdWlyZSAnVGhyaWZ0VGVzdCcKLQotY2xhc3MgU2ltcGxlQ2xpZW50VGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCi0gIGRlZiBzZXR1cCAgICAKLSAgICB1bmxlc3MgQHNvY2tldAotICAgICAgQHNvY2tldCAgID0gVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA5MDkwKQotICAgICAgQHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcoQHNvY2tldCkKLSAgICAgIEBjbGllbnQgICA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCi0gICAgICBAc29ja2V0Lm9wZW4KLSAgICBlbmQKLSAgZW5kCi0gIAotICBkZWYgdGVzdF9zdHJpbmcKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0U3RyaW5nKCdzdHJpbmcnKSwgJ3N0cmluZycpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2J5dGUKLSAgICB2YWwgPSA4Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pMzIKLSAgICB2YWwgPSAzMgotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2k2NAotICAgIHZhbCA9IDY0Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZG91YmxlCi0gICAgdmFsID0gMy4xNAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUoLXZhbCksIC12YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRmxvYXQsIEBjbGllbnQudGVzdERvdWJsZSh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9tYXAKLSAgICB2YWwgPSB7MSA9PiAxLCAyID0+IDIsIDMgPT4gM30KLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TWFwKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBAY2xpZW50LnRlc3RNYXAodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbGlzdAotICAgIHZhbCA9IFsxLDIsMyw0LDVdCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdExpc3QodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBAY2xpZW50LnRlc3RMaXN0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2VudW0KLSAgICB2YWwgPSBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OlNJWAotICAgIHJldCA9IEBjbGllbnQudGVzdEVudW0odmFsKQotCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgNikKLSAgICBhc3NlcnRfa2luZF9vZihGaXhudW0sIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfdHlwZWRlZgotICAgICNVc2VySWQgIHRlc3RUeXBlZGVmKDE6IFVzZXJJZCB0aGluZyksCi0gICAgdHJ1ZQotICBlbmQKLQotICBkZWYgdGVzdF9zZXQKLSAgICB2YWwgPSBTZXQubmV3KFsxLDIsM10pCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFNldCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoU2V0LCBAY2xpZW50LnRlc3RTZXQodmFsKSkKLSAgZW5kCi0KLSAgZGVmIGdldF9zdHJ1Y3QKLSAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoeydzdHJpbmdfdGhpbmcnID0+ICdoaSEnLCAnaTMyX3RoaW5nJyA9PiA0IH0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3N0cnVjdAotICAgIHJldCA9IEBjbGllbnQudGVzdFN0cnVjdChnZXRfc3RydWN0KQotCi0gICAgYXNzZXJ0X25pbChyZXQuYnl0ZV90aGluZywgbmlsKQotICAgIGFzc2VydF9uaWwocmV0Lmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LmkzMl90aGluZywgNCkKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Olh0cnVjdCwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9uZXN0Ci0gICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6WHRydWN0Mi5uZXcoeydzdHJ1Y3RfdGhpbmcnID0+IGdldF9zdHJ1Y3QsICdpMzJfdGhpbmcnID0+IDEwfSkKLQotICAgIHJldCA9IEBjbGllbnQudGVzdE5lc3Qoc3RydWN0MikKLQotICAgIGFzc2VydF9uaWwocmV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmlsKQotICAgIGFzc2VydF9lcXVhbChyZXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ2hpIScpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCAxMCkKLQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQuc3RydWN0X3RoaW5nKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0MiwgcmV0KQotICBlbmQKLQotICBkZWYgdGVzdF9pbnNhbmUKLSAgICBpbnNhbmUgPSBUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5Lm5ldyh7Ci0gICAgICAndXNlck1hcCcgPT4geyBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6Ok9ORSA9PiA0NCB9LAotICAgICAgJ3h0cnVjdHMnID0+IFtnZXRfc3RydWN0LAotICAgICAgICBUaHJpZnQ6OlRlc3Q6Olh0cnVjdC5uZXcoewotICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdoaSBhZ2FpbicsCi0gICAgICAgICAgJ2kzMl90aGluZycgPT4gMTIKLSAgICAgICAgfSkKLSAgICAgIF0KLSAgICB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKQotCi0gICAgYXNzZXJ0X25vdF9uaWwocmV0WzQ0XSkKLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdWzFdKQotCi0gICAgc3RydWN0ID0gcmV0WzQ0XVsxXQotCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC51c2VyTWFwW1RocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FXSwgNDQpCi0gICAgYXNzZXJ0X2VxdWFsKHN0cnVjdC54dHJ1Y3RzWzFdLnN0cmluZ190aGluZywgJ2hpIGFnYWluJykKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uaTMyX3RoaW5nLCAxMikKLQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHN0cnVjdC51c2VyTWFwKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBzdHJ1Y3QueHRydWN0cykKLSAgICBhc3NlcnRfa2luZF9vZihUaHJpZnQ6OlRlc3Q6Okluc2FuaXR5LCBzdHJ1Y3QpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X21hcF9tYXAKLSAgICByZXQgPSBAY2xpZW50LnRlc3RNYXBNYXAoNCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCByZXQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgeyA0ID0+IHsgNCA9PiA0fX0pCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2V4Y2VwdGlvbgotICAgIGFzc2VydF9yYWlzZSBUaHJpZnQ6OlRlc3Q6OlhjZXB0aW9uIGRvCi0gICAgICBAY2xpZW50LnRlc3RFeGNlcHRpb24oJ2ZvbycpCi0gICAgZW5kCi0gIGVuZAotZW5kCi0KZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vc2ltcGxlX3NlcnZlci5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vc2ltcGxlX3NlcnZlci5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxOGQyZS4uMDAwMDAwMAotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL3NpbXBsZV9zZXJ2ZXIucmIKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotJDoucHVzaCBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy8uLi9nZW4tcmInCi0kOi5wdXNoIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vLi4vLi4vbGliL3JiL2xpYicpCi0KLXJlcXVpcmUgJ3RocmlmdCcKLXJlcXVpcmUgJ1RocmlmdFRlc3QnCi0KLWNsYXNzIFNpbXBsZUhhbmRsZXIKLSAgWzp0ZXN0U3RyaW5nLCA6dGVzdEJ5dGUsIDp0ZXN0STMyLCA6dGVzdEk2NCwgOnRlc3REb3VibGUsCi0gICA6dGVzdFN0cnVjdCwgOnRlc3RNYXAsIDp0ZXN0U2V0LCA6dGVzdExpc3QsIDp0ZXN0TmVzdCwKLSAgIDp0ZXN0RW51bSwgOnRlc3RUeXBlZGVmXS5lYWNoIGRvIHxtZXRofAotCi0gICAgZGVmaW5lX21ldGhvZChtZXRoKSBkbyB8dGhpbmd8Ci0gICAgICB0aGluZwotICAgIGVuZAotCi0gIGVuZAotCi0gIGRlZiB0ZXN0SW5zYW5pdHkodGhpbmcpCi0gICAgbnVtLCB1aWQgPSB0aGluZy51c2VyTWFwLmZpbmQgeyB0cnVlIH0KLSAgICByZXR1cm4ge3VpZCA9PiB7bnVtID0+IHRoaW5nfX0KLSAgZW5kCi0KLSAgZGVmIHRlc3RNYXBNYXAodGhpbmcpCi0gICAgcmV0dXJuIHt0aGluZyA9PiB7dGhpbmcgPT4gdGhpbmd9fQotICBlbmQKLQotICBkZWYgdGVzdEVudW0odGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCi0gIGVuZAotCi0gIGRlZiB0ZXN0VHlwZWRlZih0aGluZykKLSAgICByZXR1cm4gdGhpbmcKLSAgZW5kCi0KLSAgZGVmIHRlc3RFeGNlcHRpb24odGhpbmcpCi0gICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiwgOm1lc3NhZ2UgPT4gJ2Vycm9yJwotICBlbmQKLWVuZAotCi1AaGFuZGxlciAgID0gU2ltcGxlSGFuZGxlci5uZXcKLUBwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OlByb2Nlc3Nvci5uZXcoQGhhbmRsZXIpCi1AdHJhbnNwb3J0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KDkwOTApCi1Ac2VydmVyICAgID0gVGhyaWZ0OjpUaHJlYWRlZFNlcnZlci5uZXcoQHByb2Nlc3NvciwgQHRyYW5zcG9ydCkKLQotQHNlcnZlci5zZXJ2ZQpkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi90ZXN0X3NpbXBsZV9oYW5kbGVyLnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi90ZXN0X3NpbXBsZV9oYW5kbGVyLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzRhYTdlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vdGVzdF9zaW1wbGVfaGFuZGxlci5yYgorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uL3Rlc3RfaGVscGVyJykKLQotcmVxdWlyZSAndGhyaWZ0JwotcmVxdWlyZSAnVGhyaWZ0VGVzdCcKLQotY2xhc3MgVGVzdEhhbmRsZXIKLSAgWzp0ZXN0U3RyaW5nLCA6dGVzdEJ5dGUsIDp0ZXN0STMyLCA6dGVzdEk2NCwgOnRlc3REb3VibGUsCi0gICA6dGVzdFN0cnVjdCwgOnRlc3RNYXAsIDp0ZXN0U2V0LCA6dGVzdExpc3QsIDp0ZXN0TmVzdCwKLSAgIDp0ZXN0RW51bSwgOnRlc3RUeXBlZGVmXS5lYWNoIGRvIHxtZXRofAotCi0gICAgZGVmaW5lX21ldGhvZChtZXRoKSBkbyB8dGhpbmd8Ci0gICAgICB0aGluZwotICAgIGVuZAotCi0gIGVuZAotCi0gIGRlZiB0ZXN0SW5zYW5pdHkodGhpbmcpCi0gICAgbnVtLCB1aWQgPSB0aGluZy51c2VyTWFwLmZpbmQgeyB0cnVlIH0KLSAgICByZXR1cm4ge3VpZCA9PiB7bnVtID0+IHRoaW5nfX0KLSAgZW5kCi0KLSAgZGVmIHRlc3RNYXBNYXAodGhpbmcpCi0gICAgcmV0dXJuIHt0aGluZyA9PiB7dGhpbmcgPT4gdGhpbmd9fQotICBlbmQKLQotICBkZWYgdGVzdEVudW0odGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCi0gIGVuZAotCi0gIGRlZiB0ZXN0VHlwZWRlZih0aGluZykKLSAgICByZXR1cm4gdGhpbmcKLSAgZW5kCi0KLSAgZGVmIHRlc3RFeGNlcHRpb24odGhpbmcpCi0gICAgcmFpc2UgVGhyaWZ0OjpUZXN0OjpYY2VwdGlvbiwgOm1lc3NhZ2UgPT4gJ2Vycm9yJwotICBlbmQKLQotZW5kCi1jbGFzcyBUZXN0VGhyaWZ0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKLQotICBAQElOSVQgPSBuaWwKLQotICBkZWYgc2V0dXAKLSAgICBpZiBAQElOSVQubmlsPwotICAgICAgIyBJbml0aWFsaXplIHRoZSBzZXJ2ZXIKLSAgICAgIEBoYW5kbGVyICAgPSBUZXN0SGFuZGxlci5uZXcoKQotICAgICAgQHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6UHJvY2Vzc29yLm5ldyhAaGFuZGxlcikKLSAgICAgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcoOTA5MCkKLSAgICAgIEBzZXJ2ZXIgICAgPSBUaHJpZnQ6OlRocmVhZGVkU2VydmVyLm5ldyhAcHJvY2Vzc29yLCBAdHJhbnNwb3J0KQotCi0gICAgICBAdGhyZWFkICAgID0gVGhyZWFkLm5ldyB7IEBzZXJ2ZXIuc2VydmUgfQotCi0gICAgICAjIEFuZCB0aGUgQ2xpZW50Ci0gICAgICBAc29ja2V0ICAgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDkwOTApCi0gICAgICBAcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyhAc29ja2V0KQotICAgICAgQGNsaWVudCAgID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpDbGllbnQubmV3KEBwcm90b2NvbCkKLSAgICAgIEBzb2NrZXQub3BlbgotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF9zdHJpbmcKLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0U3RyaW5nKCdzdHJpbmcnKSwgJ3N0cmluZycpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2J5dGUKLSAgICB2YWwgPSA4Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEJ5dGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RCeXRlKC12YWwpLCAtdmFsKQotICBlbmQKLQotICBkZWYgdGVzdF9pMzIKLSAgICB2YWwgPSAzMgotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3RJMzIoLXZhbCksIC12YWwpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2k2NAotICAgIHZhbCA9IDY0Ci0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCh2YWwpLCB2YWwpCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdEk2NCgtdmFsKSwgLXZhbCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZG91YmxlCi0gICAgdmFsID0gMy4xNAotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUodmFsKSwgdmFsKQotICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUoLXZhbCksIC12YWwpCi0gICAgYXNzZXJ0X2tpbmRfb2YoRmxvYXQsIEBjbGllbnQudGVzdERvdWJsZSh2YWwpKQotICBlbmQKLQotICBkZWYgdGVzdF9tYXAKLSAgICB2YWwgPSB7MSA9PiAxLCAyID0+IDIsIDMgPT4gM30KLSAgICBhc3NlcnRfZXF1YWwoQGNsaWVudC50ZXN0TWFwKHZhbCksIHZhbCkKLSAgICBhc3NlcnRfa2luZF9vZihIYXNoLCBAY2xpZW50LnRlc3RNYXAodmFsKSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbGlzdAotICAgIHZhbCA9IFsxLDIsMyw0LDVdCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdExpc3QodmFsKSwgdmFsKQotICAgIGFzc2VydF9raW5kX29mKEFycmF5LCBAY2xpZW50LnRlc3RMaXN0KHZhbCkpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2VudW0KLSAgICB2YWwgPSBUaHJpZnQ6OlRlc3Q6Ok51bWJlcno6OlNJWAotICAgIHJldCA9IEBjbGllbnQudGVzdEVudW0odmFsKQotCi0gICAgYXNzZXJ0X2VxdWFsKHJldCwgNikKLSAgICBhc3NlcnRfa2luZF9vZihGaXhudW0sIHJldCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfdHlwZWRlZgotICAgICNVc2VySWQgIHRlc3RUeXBlZGVmKDE6IFVzZXJJZCB0aGluZyksCi0gICAgdHJ1ZQotICBlbmQKLQotICBkZWYgdGVzdF9zZXQKLSAgICB2YWwgPSBTZXQubmV3KFsxLCAyLCAzXSkKLSAgICBhc3NlcnRfZXF1YWwodmFsLCBAY2xpZW50LnRlc3RTZXQodmFsKSkKLSAgICBhc3NlcnRfa2luZF9vZihTZXQsIEBjbGllbnQudGVzdFNldCh2YWwpKQotICBlbmQKLQotICBkZWYgZ2V0X3N0cnVjdAotICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7J3N0cmluZ190aGluZycgPT4gJ2hpIScsICdpMzJfdGhpbmcnID0+IDQgfSkKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc3RydWN0Ci0gICAgcmV0ID0gQGNsaWVudC50ZXN0U3RydWN0KGdldF9zdHJ1Y3QpCi0KLSAgICBhc3NlcnRfbmlsKHJldC5ieXRlX3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X25pbChyZXQuaTY0X3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJpbmdfdGhpbmcsICdoaSEnKQotICAgIGFzc2VydF9lcXVhbChyZXQuaTMyX3RoaW5nLCA0KQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6WHRydWN0LCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X25lc3QKLSAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLm5ldyh7J3N0cnVjdF90aGluZycgPT4gZ2V0X3N0cnVjdCwgJ2kzMl90aGluZycgPT4gMTB9KQotCi0gICAgcmV0ID0gQGNsaWVudC50ZXN0TmVzdChzdHJ1Y3QyKQotCi0gICAgYXNzZXJ0X25pbChyZXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5pbCkKLSAgICBhc3NlcnRfbmlsKHJldC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuaWwpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCAnaGkhJykKLSAgICBhc3NlcnRfZXF1YWwocmV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIDQpCi0gICAgYXNzZXJ0X2VxdWFsKHJldC5pMzJfdGhpbmcsIDEwKQotCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QsIHJldC5zdHJ1Y3RfdGhpbmcpCi0gICAgYXNzZXJ0X2tpbmRfb2YoVGhyaWZ0OjpUZXN0OjpYdHJ1Y3QyLCByZXQpCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2luc2FuZQotICAgIGluc2FuZSA9IFRocmlmdDo6VGVzdDo6SW5zYW5pdHkubmV3KHsKLSAgICAgICd1c2VyTWFwJyA9PiB7IFRocmlmdDo6VGVzdDo6TnVtYmVyejo6T05FID0+IDQ0IH0sCi0gICAgICAneHRydWN0cycgPT4gW2dldF9zdHJ1Y3QsCi0gICAgICAgIFRocmlmdDo6VGVzdDo6WHRydWN0Lm5ldyh7Ci0gICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2hpIGFnYWluJywKLSAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMgotICAgICAgICB9KQotICAgICAgXQotICAgIH0pCi0KLSAgICByZXQgPSBAY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpCi0KLSAgICBhc3NlcnRfbm90X25pbChyZXRbNDRdKQotICAgIGFzc2VydF9ub3RfbmlsKHJldFs0NF1bMV0pCi0KLSAgICBzdHJ1Y3QgPSByZXRbNDRdWzFdCi0KLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0LnVzZXJNYXBbVGhyaWZ0OjpUZXN0OjpOdW1iZXJ6OjpPTkVdLCA0NCkKLSAgICBhc3NlcnRfZXF1YWwoc3RydWN0Lnh0cnVjdHNbMV0uc3RyaW5nX3RoaW5nLCAnaGkgYWdhaW4nKQotICAgIGFzc2VydF9lcXVhbChzdHJ1Y3QueHRydWN0c1sxXS5pMzJfdGhpbmcsIDEyKQotCi0gICAgYXNzZXJ0X2tpbmRfb2YoSGFzaCwgc3RydWN0LnVzZXJNYXApCi0gICAgYXNzZXJ0X2tpbmRfb2YoQXJyYXksIHN0cnVjdC54dHJ1Y3RzKQotICAgIGFzc2VydF9raW5kX29mKFRocmlmdDo6VGVzdDo6SW5zYW5pdHksIHN0cnVjdCkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfbWFwX21hcAotICAgIHJldCA9IEBjbGllbnQudGVzdE1hcE1hcCg0KQotICAgIGFzc2VydF9raW5kX29mKEhhc2gsIHJldCkKLSAgICBhc3NlcnRfZXF1YWwocmV0LCB7IDQgPT4geyA0ID0+IDR9fSkKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZXhjZXB0aW9uCi0gICAgYXNzZXJ0X3JhaXNlIFRocmlmdDo6VGVzdDo6WGNlcHRpb24gZG8KLSAgICAgIEBjbGllbnQudGVzdEV4Y2VwdGlvbignZm9vJykKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlYXJkb3duCi0gIGVuZAotCi1lbmQKZGlmZiAtLWdpdCBhL3Rlc3QvcmVidWlsZF9rbm93bl9mYWlsdXJlcy5zaCBiL3Rlc3QvcmVidWlsZF9rbm93bl9mYWlsdXJlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODg2OWZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yZWJ1aWxkX2tub3duX2ZhaWx1cmVzLnNoCkBAIC0wLDAgKzEsMjQgQEAKKyMhL2Jpbi9iYXNoCisKK2lmIFsgLXogJDEgXTsgdGhlbgorICBlY2hvIFVzYWdlOiAkMCBMQU5HVUFHRQorICBlY2hvIFJlLWxpc3QgYWxsIGZhaWx1cmVzIG9mIGEgc3BlY2lmaWMgTEFOR1VBR0UgaW50byBrbm93bl9mYWlsdXJlc19MaW51eC5qc29uCisgIGVjaG8gTEFOR1VBR0Ugc2hvdWxkIGJlIGxpYnJhcnkgbmFtZSBsaWtlIGNwcCwgamF2YSwgcHkgZXRjCisgIGV4aXQgMQorZmkKKworaWYgWyAteiAkUFlUSE9OXTsgdGhlbgorICBQWVRIT049cHl0aG9uCitmaQorCitUQVJHRVRfTEFORz0kMQorT1VUX0ZJTEU9a25vd25fZmFpbHVyZXNfTGludXguanNvbgorZWNobyBSZWJ1aWxkaW5nIGtub3duIGZhaWx1cmVzIGZvciAkVEFSR0VUX0xBTkcKKworVE1QRklMRT0uX190bXBfX3JlYnVpbGRfXworZ3JlcCAtdiAtZSAiXCIkMS0iIC1lICJcLSQxXyIgJE9VVF9GSUxFID4gJFRNUEZJTEUKK212ICRUTVBGSUxFICRPVVRfRklMRQorJFBZVEhPTiB0ZXN0LnB5IC0tY2xpZW50ICQxCiskUFlUSE9OIHRlc3QucHkgLVUgbWVyZ2UKKyRQWVRIT04gdGVzdC5weSAtLXNlcnZlciAkMQorJFBZVEhPTiB0ZXN0LnB5IC1VIG1lcmdlCmRpZmYgLS1naXQgYS90ZXN0L3Jlc3VsdC5qcyBiL3Rlc3QvcmVzdWx0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjFhNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Jlc3VsdC5qcwpAQCAtMCwwICsxLDY0IEBACisvKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKworKi8KKworJC5nZXRKU09OKCdyZXN1bHRzLmpzb24nLCBmdW5jdGlvbihyZXN1bHRzKSB7CisgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciB0cmFuc3BvcnQgPSAzOworICAgICAgICB2YXIgc29ja2V0ID0gNDsKKyAgICAgICAgdmFyIHN1Y2Nlc3MgPSA1OworICAgICAgICB2YXIgZXhwZWN0ZWQgPSA2OworICAgICAgICB2YXIgcmV0dXJuQ29kZSA9IDc7CisgICAgICAgIHZhciBsb2dGaWxlID0gODsKKyAgICAgICAgdGVzdFRhYmxlID0gJCgnI3Rlc3RfcmVzdWx0cycpLkRhdGFUYWJsZSh7CisgICAgICAgICAgICBkYXRhOiByZXN1bHRzWydyZXN1bHRzJ10sCisgICAgICAgICAgICBjb2x1bW5EZWZzOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiAzLAorICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd1t0cmFuc3BvcnRdICsgJy0nICsgcm93W3NvY2tldF07CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDQsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcm93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJvd1tzdWNjZXNzXSA/ICdzdWNjZXNzJyA6ICdmYWlsdXJlJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnKCcgKyAocm93W3JldHVybkNvZGVdID09IDEyOCA/ICd0aW1lb3V0JyA6IHJvd1tyZXR1cm5Db2RlXSkgKyAnKScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnKDxhIGhyZWY9IicgKyByb3dbbG9nRmlsZV0uc2VydmVyICsgJyI+U2VydmVyPC9hPiwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICc8YSBocmVmPSInICsgcm93W2xvZ0ZpbGVdLmNsaWVudCArICciPkNsaWVudDwvYT4pJzsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogNSwKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICd5ZXMnIHJhdGhlciB0aGFuICdleHBlY3RlZCcgdG8gZWFzZSBzZWFyY2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3dbZXhwZWN0ZWRdID8gJ3llcycgOiAndW5leHBlY3RlZCc7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXSwKKyAgICAgICAgfSk7CisgICAgICAgICQoJyN0ZXN0X3Jlc3VsdHNfZmlsdGVyIGxhYmVsIGlucHV0JykuZm9jdXMoKS52YWwoJ3VuZXhwZWN0ZWQgZmFpbHVyZScpOworICAgICAgICAkKCcjdGVzdF9pbmZvJykudGV4dCgKKyAgICAgICAgICAgICJUZXN0IERhdGU6ICAgICAiICsgcmVzdWx0c1snZGF0ZSddICsgIlxuIiArCisgICAgICAgICAgICAiUmV2aXNpb246ICAgICAgIiArIHJlc3VsdHNbJ3JldmlzaW9uJ10gKyAiXG4iICsKKyAgICAgICAgICAgICJQbGF0Zm9ybTogICAgICAiICsgcmVzdWx0c1sncGxhdGZvcm0nXSArICJcbiIgKworICAgICAgICAgICAgIlRlc3QgZHVyYXRpb246ICIgKyByZXN1bHRzWydkdXJhdGlvbiddKSArICIgc2Vjb25kcyI7CisgICAgfSk7Cit9KTsKKwpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9DYXJnby50b21sIGIvdGVzdC9ycy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzVlM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNyBAQAorW3BhY2thZ2VdCituYW1lID0gInRocmlmdC10ZXN0IgordmVyc2lvbiA9ICIwLjEuMCIKK2xpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKK2F1dGhvcnMgPSBbIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiJdCitwdWJsaXNoID0gZmFsc2UKKworW2RlcGVuZGVuY2llc10KK2NsYXAgPSAiPDIuMjguMCIKK2Vudl9sb2dnZXIgPSAiMC40LjAiCitsb2cgPSAiMC4zLjciCitvcmRlcmVkLWZsb2F0ID0gIjAuMy4wIgordHJ5X2Zyb20gPSAiMC4yLjAiCisKK1tkZXBlbmRlbmNpZXMudGhyaWZ0XQorcGF0aCA9ICIuLi8uLi9saWIvcnMiCisKZGlmZiAtLWdpdCBhL3Rlc3QvcnMvTWFrZWZpbGUuYW0gYi90ZXN0L3JzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTA1YjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIC4uL1RocmlmdFRlc3QudGhyaWZ0CisKK3ByZWNyb3NzOiBzdHVicworCSQoQ0FSR08pIGJ1aWxkCisJWyAtZCBiaW4gXSB8fCBta2RpciBiaW4KKwljcCB0YXJnZXQvZGVidWcvdGVzdF9zZXJ2ZXIgYmluL3Rlc3Rfc2VydmVyCisJY3AgdGFyZ2V0L2RlYnVnL3Rlc3RfY2xpZW50IGJpbi90ZXN0X2NsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKENBUkdPKSBjbGVhbgorCS0kKFJNKSBDYXJnby5sb2NrCisJLSQoUk0pIHNyYy90aHJpZnRfdGVzdC5ycworCS0kKFJNKSAtciBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlDYXJnby50b21sIFwKKyAgICAgICAgc3JjL2xpYi5ycyBcCisJc3JjL2Jpbi90ZXN0X3NlcnZlci5ycyBcCisJc3JjL2Jpbi90ZXN0X2NsaWVudC5ycworCmRpZmYgLS1naXQgYS90ZXN0L3JzL3NyYy9iaW4vdGVzdF9jbGllbnQucnMgYi90ZXN0L3JzL3NyYy9iaW4vdGVzdF9jbGllbnQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliNWI4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X2NsaWVudC5ycwpAQCAtMCwwICsxLDYwNSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBsb2c7CitleHRlcm4gY3JhdGUgZW52X2xvZ2dlcjsKKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnRfdGVzdDsgLy8gaHVoLiBJIGhhdmUgdG8gZG8gdGhpcyB0byB1c2UgbXkgbGliCisKK3VzZSBvcmRlcmVkX2Zsb2F0OjpPcmRlcmVkRmxvYXQ7Cit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6e0JUcmVlTWFwLCBCVHJlZVNldH07Cit1c2Ugc3RkOjpmbXQ6OkRlYnVnOworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRDb21wYWN0SW5wdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2wsIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICBUT3V0cHV0UHJvdG9jb2x9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7UmVhZEhhbGYsIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQsIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCwgVElvQ2hhbm5lbCwgVFJlYWRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBUVGNwQ2hhbm5lbCwgVFdyaXRlVHJhbnNwb3J0LCBXcml0ZUhhbGZ9OwordXNlIHRocmlmdF90ZXN0OjoqOworCitmbiBtYWluKCkgeworICAgIGVudl9sb2dnZXI6OmluaXQoKS5leHBlY3QoImxvZ2dlciBzZXR1cCBmYWlsZWQiKTsKKworICAgIGRlYnVnISgiaW5pdGlhbGl6ZWQgbG9nZ2VyIC0gcnVubmluZyBjcm9zcy10ZXN0IGNsaWVudCIpOworCisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gaW5mbyEoImNyb3NzLXRlc3QgY2xpZW50IHN1Y2NlZWRlZCIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgaW5mbyEoImNyb3NzLXRlc3QgY2xpZW50IGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAvLyB1bnN1cHBvcnRlZCBvcHRpb25zOgorICAgIC8vIC0tZG9tYWluLXNvY2tldAorICAgIC8vIC0tbmFtZWQtcGlwZQorICAgIC8vIC0tYW5vbi1waXBlcworICAgIC8vIC0tc3NsCisgICAgLy8gLS10aHJlYWRzCisgICAgbGV0IG1hdGNoZXMgPSBjbGFwX2FwcCEocnVzdF90ZXN0X2NsaWVudCA9PgorICAgICAgICAodmVyc2lvbjogIjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJSdXN0IFRocmlmdCB0ZXN0IGNsaWVudCIpCisgICAgICAgIChAYXJnIGhvc3Q6IC0taG9zdCArdGFrZXNfdmFsdWUgIkhvc3Qgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsb2NhdGVkIikKKyAgICAgICAgKEBhcmcgcG9ydDogLS1wb3J0ICt0YWtlc192YWx1ZSAiUG9ydCBvbiB3aGljaCB0aGUgVGhyaWZ0IHRlc3Qgc2VydmVyIGlzIGxpc3RlbmluZyIpCisgICAgICAgIChAYXJnIHRyYW5zcG9ydDogLS10cmFuc3BvcnQgK3Rha2VzX3ZhbHVlICJUaHJpZnQgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJidWZmZXJlZFwiLCBcImZyYW1lZFwiKSIpCisgICAgICAgIChAYXJnIHByb3RvY29sOiAtLXByb3RvY29sICt0YWtlc192YWx1ZSAiVGhyaWZ0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJjb21wYWN0XCIpIikKKyAgICAgICAgKEBhcmcgdGVzdGxvb3BzOiAtbiAtLXRlc3Rsb29wcyArdGFrZXNfdmFsdWUgIk51bWJlciBvZiB0aW1lcyB0byBydW4gdGVzdHMiKQorICAgICkKKyAgICAgICAgLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgaG9zdCA9IG1hdGNoZXMudmFsdWVfb2YoImhvc3QiKS51bndyYXBfb3IoIjEyNy4wLjAuMSIpOworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgdGVzdGxvb3BzID0gdmFsdWVfdCEobWF0Y2hlcywgInRlc3Rsb29wcyIsIHU4KS51bndyYXBfb3IoMSk7CisgICAgbGV0IHRyYW5zcG9ydCA9IG1hdGNoZXMudmFsdWVfb2YoInRyYW5zcG9ydCIpLnVud3JhcF9vcigiYnVmZmVyZWQiKTsKKyAgICBsZXQgcHJvdG9jb2wgPSBtYXRjaGVzLnZhbHVlX29mKCJwcm90b2NvbCIpLnVud3JhcF9vcigiYmluYXJ5Iik7CisKKworICAgIGxldCBtdXQgdGhyaWZ0X3Rlc3RfY2xpZW50ID0geworICAgICAgICBsZXQgKGlfcHJvdCwgb19wcm90KSA9IGJ1aWxkX3Byb3RvY29scyhob3N0LCBwb3J0LCB0cmFuc3BvcnQsIHByb3RvY29sLCAiVGhyaWZ0VGVzdCIpPzsKKyAgICAgICAgVGhyaWZ0VGVzdFN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCkKKyAgICB9OworCisgICAgbGV0IG11dCBzZWNvbmRfc2VydmljZV9jbGllbnQgPSBpZiBwcm90b2NvbC5zdGFydHNfd2l0aCgibXVsdGkiKSB7CisgICAgICAgIGxldCAoaV9wcm90LCBvX3Byb3QpID0gYnVpbGRfcHJvdG9jb2xzKGhvc3QsIHBvcnQsIHRyYW5zcG9ydCwgcHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik/OworICAgICAgICBTb21lKFNlY29uZFNlcnZpY2VTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpKQorICAgIH0gZWxzZSB7CisgICAgICAgIE5vbmUKKyAgICB9OworCisgICAgaW5mbyEoCisgICAgICAgICJjb25uZWN0aW5nIHRvIHt9Ont9IHdpdGgge30re30gc3RhY2siLAorICAgICAgICBob3N0LAorICAgICAgICBwb3J0LAorICAgICAgICBwcm90b2NvbCwKKyAgICAgICAgdHJhbnNwb3J0CisgICAgKTsKKworICAgIGZvciBfIGluIDAuLnRlc3Rsb29wcyB7CisgICAgICAgIG1ha2VfdGhyaWZ0X2NhbGxzKCZtdXQgdGhyaWZ0X3Rlc3RfY2xpZW50LCAmbXV0IHNlY29uZF9zZXJ2aWNlX2NsaWVudCk/CisgICAgfQorCisgICAgT2soKCkpCit9CisKK2ZuIGJ1aWxkX3Byb3RvY29scygKKyAgICBob3N0OiAmc3RyLAorICAgIHBvcnQ6IHUxNiwKKyAgICB0cmFuc3BvcnQ6ICZzdHIsCisgICAgcHJvdG9jb2w6ICZzdHIsCisgICAgc2VydmljZV9uYW1lOiAmc3RyLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoQm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4pPiB7CisgICAgbGV0IChpX2NoYW4sIG9fY2hhbikgPSB0Y3BfY2hhbm5lbChob3N0LCBwb3J0KT87CisKKyAgICBsZXQgKGlfdHJhbiwgb190cmFuKTogKEJveDxUUmVhZFRyYW5zcG9ydD4sIEJveDxUV3JpdGVUcmFuc3BvcnQ+KSA9IG1hdGNoIHRyYW5zcG9ydCB7CisgICAgICAgICJidWZmZXJlZCIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbikpKQorICAgICAgICB9CisgICAgICAgICJmcmFtZWQiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbikpKQorICAgICAgICB9CisgICAgICAgIHVubWF0Y2hlZCA9PiByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHRyYW5zcG9ydCB7fSIsIHVubWF0Y2hlZCkuaW50bygpKSwKKyAgICB9OworCisgICAgbGV0IChpX3Byb3QsIG9fcHJvdCk6IChCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPikgPSBtYXRjaCBwcm90b2NvbCB7CisgICAgICAgICJiaW5hcnkiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbiwgdHJ1ZSkpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbiwgdHJ1ZSkpKQorICAgICAgICB9CisgICAgICAgICJtdWx0aSIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuLCB0cnVlKSksCisgICAgICAgICAgICAgQm94OjpuZXcoCisgICAgICAgICAgICAgICAgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w6Om5ldygKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4sIHRydWUpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApKQorICAgICAgICB9CisgICAgICAgICJjb21wYWN0IiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbikpKQorICAgICAgICB9CisgICAgICAgICJtdWx0aWMiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4pKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KHNlcnZpY2VfbmFtZSwgVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbikpLCkpCisgICAgICAgIH0KKyAgICAgICAgdW5tYXRjaGVkID0+IHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgcHJvdG9jb2wge30iLCB1bm1hdGNoZWQpLmludG8oKSksCisgICAgfTsKKworICAgIE9rKChpX3Byb3QsIG9fcHJvdCkpCit9CisKKy8vIEZJWE1FOiBleHBvc2UgIm9wZW4iIHRocm91Z2ggdGhlIGNsaWVudCBpbnRlcmZhY2Ugc28gSSBkb24ndCBoYXZlIHRvIGVhcmx5CisvLyBvcGVuCitmbiB0Y3BfY2hhbm5lbCgKKyAgICBob3N0OiAmc3RyLAorICAgIHBvcnQ6IHUxNiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KFJlYWRIYWxmPFRUY3BDaGFubmVsPiwgV3JpdGVIYWxmPFRUY3BDaGFubmVsPik+IHsKKyAgICBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisgICAgYy5vcGVuKCZmb3JtYXQhKCJ7fTp7fSIsIGhvc3QsIHBvcnQpKT87CisgICAgYy5zcGxpdCgpCit9CisKK3R5cGUgQnVpbGRUaHJpZnRUZXN0Q2xpZW50ID0gVGhyaWZ0VGVzdFN5bmNDbGllbnQ8Qm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4+OwordHlwZSBCdWlsdFNlY29uZFNlcnZpY2VDbGllbnQgPSBTZWNvbmRTZXJ2aWNlU3luY0NsaWVudDxCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPj47CisKKyNbY2ZnX2F0dHIoZmVhdHVyZSA9ICJjYXJnby1jbGlwcHkiLCBhbGxvdyhjeWNsb21hdGljX2NvbXBsZXhpdHkpKV0KK2ZuIG1ha2VfdGhyaWZ0X2NhbGxzKAorICAgIHRocmlmdF90ZXN0X2NsaWVudDogJm11dCBCdWlsZFRocmlmdFRlc3RDbGllbnQsCisgICAgc2Vjb25kX3NlcnZpY2VfY2xpZW50OiAmbXV0IE9wdGlvbjxCdWlsdFNlY29uZFNlcnZpY2VDbGllbnQ+LAorKSAtPiBSZXN1bHQ8KCksIHRocmlmdDo6RXJyb3I+IHsKKyAgICBpbmZvISgidGVzdFZvaWQiKTsKKyAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF92b2lkKCk/OworCisgICAgaW5mbyEoInRlc3RTdHJpbmciKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zdHJpbmcoInRoaW5nIi50b19vd25lZCgpKSwKKyAgICAgICAgInRoaW5nIi50b19vd25lZCgpLAorICAgICk/OworCisgICAgaW5mbyEoInRlc3RCb29sIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9ib29sKHRydWUpLCB0cnVlKT87CisKKyAgICBpbmZvISgidGVzdEJvb2wiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2Jvb2woZmFsc2UpLCBmYWxzZSk/OworCisgICAgaW5mbyEoInRlc3RCeXRlIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9ieXRlKDQyKSwgNDIpPzsKKworICAgIGluZm8hKCJ0ZXN0aTMyIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9pMzIoMTE1OTM0ODM3NCksIDExNTkzNDgzNzQpPzsKKworICAgIGluZm8hKCJ0ZXN0aTY0Iik7CisgICAgLy8gdHJ5ISh2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2k2NCgtODY1MTgyOTg3OTQzODI5NDU2NSksCisgICAgLy8gLTg2NTE4Mjk4Nzk0MzgyOTQ1NjUpKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9pNjQoaTY0OjptaW5fdmFsdWUoKSksCisgICAgICAgIGk2NDo6bWluX3ZhbHVlKCksCisgICAgKT87CisKKyAgICBpbmZvISgidGVzdERvdWJsZSIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2RvdWJsZShPcmRlcmVkRmxvYXQ6OmZyb20oNDIuNDIpKSwKKyAgICAgICAgT3JkZXJlZEZsb2F0Ojpmcm9tKDQyLjQyKSwKKyAgICApPzsKKworICAgIGluZm8hKCJ0ZXN0VHlwZWRlZiIpOworICAgIHsKKyAgICAgICAgbGV0IHVfc25kOiBVc2VySWQgPSAyMzQ4OworICAgICAgICBsZXQgdV9jbXA6IFVzZXJJZCA9IDIzNDg7CisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfdHlwZWRlZih1X3NuZCksIHVfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFbnVtIik7CisgICAgeworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2VudW0oTnVtYmVyejo6VHdvKSwgTnVtYmVyejo6VHdvKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RCaW5hcnkiKTsKKyAgICB7CisgICAgICAgIGxldCBiX3NuZCA9IHZlYyFbMHg3NywgMHgzMCwgMHgzMCwgMHg3NCwgMHgyMSwgMHgyMCwgMHg1MiwgMHg3NSwgMHg3MywgMHg3NF07CisgICAgICAgIGxldCBiX2NtcCA9IHZlYyFbMHg3NywgMHgzMCwgMHgzMCwgMHg3NCwgMHgyMSwgMHgyMCwgMHg1MiwgMHg3NSwgMHg3MywgMHg3NF07CisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYmluYXJ5KGJfc25kKSwgYl9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdFN0cnVjdCIpOworICAgIHsKKyAgICAgICAgbGV0IHhfc25kID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMTIpLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDIxOTEyOSksCisgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICB9OworICAgICAgICBsZXQgeF9jbXAgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxMiksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMjE5MTI5KSwKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCksCisgICAgICAgIH07CisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RydWN0KHhfc25kKSwgeF9jbXApPzsKKyAgICB9CisKKyAgICAvLyBYdHJ1Y3QgYWdhaW4sIHdpdGggb3B0aW9uYWwgdmFsdWVzCisgICAgLy8gRklYTUU6IGFwcGFyZW50bHkgdGhlIGVybGFuZyB0aHJpZnQgc2VydmVyIGRvZXMgbm90IGxpa2Ugb3B0LWluLXJlcS1vdXQKKyAgICAvLyBwYXJhbWV0ZXJzIHRoYXQgYXJlIHVuZGVmaW5lZC4gSm95LgorICAgIC8vIHsKKyAgICAvLyBsZXQgeF9zbmQgPSBYdHJ1Y3QgeyBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksIGJ5dGVfdGhpbmc6IE5vbmUsCisgICAgLy8gaTMyX3RoaW5nOiBOb25lLCBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpIH07CisgICAgLy8gbGV0IHhfY21wID0gWHRydWN0IHsgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLCBieXRlX3RoaW5nOgorICAgIC8vIFNvbWUoMCksIGkzMl90aGluZzogU29tZSgwKSwgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSB9OyAvLyB0aGUgQysrCisgICAgLy8gc2VydmVyIGlzIHJlc3BvbmRpbmcgY29ycmVjdGx5CisgICAgLy8gdHJ5ISh2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cnVjdCh4X3NuZCksIHhfY21wKSk7CisgICAgLy8gfQorICAgIC8vCisKKyAgICBpbmZvISgidGVzdE5lc3QiKTsgLy8gKEZJWE1FOiB0cnkgWHRydWN0MiB3aXRoIG9wdGlvbmFsIHZhbHVlcykKKyAgICB7CisgICAgICAgIGxldCB4X3NuZCA9IFh0cnVjdDIgeworICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgzMiksCisgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc6IFNvbWUoCisgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEpLAorICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMzI0MzgyMDk4KSwKKyAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyOTM0ODEwOTgpLAorICAgICAgICB9OworICAgICAgICBsZXQgeF9jbXAgPSBYdHJ1Y3QyIHsKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMzIpLAorICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDMyNDM4MjA5OCksCisgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMjkzNDgxMDk4KSwKKyAgICAgICAgfTsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9uZXN0KHhfc25kKSwgeF9jbXApPzsKKyAgICB9CisKKyAgICAvLyBkbyB0aGUgbXVsdGlwbGV4ZWQgY2FsbHMgd2hpbGUgbWFraW5nIHRoZSBtYWluIFRocmlmdFRlc3QgY2FsbHMKKyAgICBpZiBsZXQgU29tZShyZWYgbXV0IGNsaWVudCkgPSBzZWNvbmRfc2VydmljZV9jbGllbnQuYXNfbXV0KCkgeworICAgICAgICBpbmZvISgiU2Vjb25kU2VydmljZSBzZWNvbmR0ZXN0U3RyaW5nIik7CisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgICAgICAgICAgY2xpZW50LnNlY29uZHRlc3Rfc3RyaW5nKCJ0ZXN0X3N0cmluZyIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgInRlc3RTdHJpbmcoXCJ0ZXN0X3N0cmluZ1wiKSIudG9fb3duZWQoKSwKKyAgICAgICAgICAgICk/OworICAgICAgICB9CisgICAgfQorCisgICAgaW5mbyEoInRlc3RMaXN0Iik7CisgICAgeworICAgICAgICBsZXQgbXV0IHZfc25kOiBWZWM8aTMyPiA9IFZlYzo6bmV3KCk7CisgICAgICAgIHZfc25kLnB1c2goMjkzODQpOworICAgICAgICB2X3NuZC5wdXNoKDIzOCk7CisgICAgICAgIHZfc25kLnB1c2goMzI0OTgpOworCisgICAgICAgIGxldCBtdXQgdl9jbXA6IFZlYzxpMzI+ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgdl9jbXAucHVzaCgyOTM4NCk7CisgICAgICAgIHZfY21wLnB1c2goMjM4KTsKKyAgICAgICAgdl9jbXAucHVzaCgzMjQ5OCk7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9saXN0KHZfc25kKSwgdl9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdFNldCIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCBzX3NuZDogQlRyZWVTZXQ8aTMyPiA9IEJUcmVlU2V0OjpuZXcoKTsKKyAgICAgICAgc19zbmQuaW5zZXJ0KDI5MzQ4MSk7CisgICAgICAgIHNfc25kLmluc2VydCgyMyk7CisgICAgICAgIHNfc25kLmluc2VydCgzMjM0KTsKKworICAgICAgICBsZXQgbXV0IHNfY21wOiBCVHJlZVNldDxpMzI+ID0gQlRyZWVTZXQ6Om5ldygpOworICAgICAgICBzX2NtcC5pbnNlcnQoMjkzNDgxKTsKKyAgICAgICAgc19jbXAuaW5zZXJ0KDIzKTsKKyAgICAgICAgc19jbXAuaW5zZXJ0KDMyMzQpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc2V0KHNfc25kKSwgc19jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE1hcCIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCBtX3NuZDogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3NuZC5pbnNlcnQoMiwgNCk7CisgICAgICAgIG1fc25kLmluc2VydCg0LCA2KTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDgsIDcpOworCisgICAgICAgIGxldCBtdXQgbV9jbXA6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDIsIDQpOworICAgICAgICBtX2NtcC5pbnNlcnQoNCwgNik7CisgICAgICAgIG1fY21wLmluc2VydCg4LCA3KTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X21hcChtX3NuZCksIG1fY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RTdHJpbmdNYXAiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9zbmQ6IEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KCIyIi50b19vd25lZCgpLCAiNF9zdHJpbmciLnRvX293bmVkKCkpOworICAgICAgICBtX3NuZC5pbnNlcnQoIjQiLnRvX293bmVkKCksICI2X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fc25kLmluc2VydCgiOCIudG9fb3duZWQoKSwgIjdfc3RyaW5nIi50b19vd25lZCgpKTsKKworICAgICAgICBsZXQgbXV0IG1fcmN2OiBCVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fcmN2Lmluc2VydCgiMiIudG9fb3duZWQoKSwgIjRfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9yY3YuaW5zZXJ0KCI0Ii50b19vd25lZCgpLCAiNl9zdHJpbmciLnRvX293bmVkKCkpOworICAgICAgICBtX3Jjdi5pbnNlcnQoIjgiLnRvX293bmVkKCksICI3X3N0cmluZyIudG9fb3duZWQoKSk7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zdHJpbmdfbWFwKG1fc25kKSwgbV9yY3YpPzsKKyAgICB9CisKKyAgICAvLyBuZXN0ZWQgbWFwCisgICAgLy8gZXhwZWN0IDogey00ID0+IHstNCA9PiAtNCwgLTMgPT4gLTMsIC0yID0+IC0yLCAtMSA9PiAtMSwgfSwgNCA9PiB7MSA9PiAxLCAyCisgICAgLy8gPT4gMiwgMyA9PiAzLCA0ID0+IDQsIH0sIH0KKyAgICBpbmZvISgidGVzdE1hcE1hcCIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCBtX2NtcF9uZXN0ZWRfMDogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBmb3IgaSBpbiAoLTQgYXMgaTMyKS4uMCB7CisgICAgICAgICAgICBtX2NtcF9uZXN0ZWRfMC5pbnNlcnQoaSwgaSk7CisgICAgICAgIH0KKyAgICAgICAgbGV0IG11dCBtX2NtcF9uZXN0ZWRfMTogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBmb3IgaSBpbiAxLi41IHsKKyAgICAgICAgICAgIG1fY21wX25lc3RlZF8xLmluc2VydChpLCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBtdXQgbV9jbXA6IEJUcmVlTWFwPGkzMiwgQlRyZWVNYXA8aTMyLCBpMzI+PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KC00LCBtX2NtcF9uZXN0ZWRfMCk7CisgICAgICAgIG1fY21wLmluc2VydCg0LCBtX2NtcF9uZXN0ZWRfMSk7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tYXBfbWFwKDQyKSwgbV9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fc25kOiBCVHJlZU1hcDxpMTYsIFN0cmluZz4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fc25kLmluc2VydCgxMjk4LCAiZml6eiIudG9fb3duZWQoKSk7CisgICAgICAgIG1fc25kLmluc2VydCgtMTQ4LCAiYnV6eiIudG9fb3duZWQoKSk7CisKKyAgICAgICAgbGV0IHNfY21wID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiSGVsbG8yIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMSksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoLTEyMzk0OCksCisgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoLTE5MjM0MTIzOTgxKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGkoMSwgLTEyMzk0OCwgLTE5MjM0MTIzOTgxLCBtX3NuZCwgTnVtYmVyejo6RWlnaHQsIDgxKSwKKyAgICAgICAgICAgIHNfY21wLAorICAgICAgICApPzsKKyAgICB9CisKKyAgICAvLyBJbnNhbml0eQorICAgIC8vIHJldHVybnM6CisgICAgLy8geyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAvLyAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgIC8vICAgICAgICB9LAorICAgIC8vICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgLy8gfQorICAgIHsKKyAgICAgICAgbGV0IG11dCBhcmdfbWFwX3VzZXJtYXA6IEJUcmVlTWFwPE51bWJlcnosIGk2ND4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGFyZ19tYXBfdXNlcm1hcC5pbnNlcnQoTnVtYmVyejo6T25lLCA0Mjg5KTsKKyAgICAgICAgYXJnX21hcF91c2VybWFwLmluc2VydChOdW1iZXJ6OjpFaWdodCwgMTkpOworCisgICAgICAgIGxldCBtdXQgYXJnX3ZlY194dHJ1Y3RzOiBWZWM8WHRydWN0PiA9IFZlYzo6bmV3KCk7CisgICAgICAgIGFyZ192ZWNfeHRydWN0cy5wdXNoKAorICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSg4KSwKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMjkpLAorICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSg5MjM4NCksCisgICAgICAgICAgICB9LAorICAgICAgICApOworICAgICAgICBhcmdfdmVjX3h0cnVjdHMucHVzaCgKKyAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJiYXIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMjgpLAorICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyKSwKKyAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoLTEyODEpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKyAgICAgICAgYXJnX3ZlY194dHJ1Y3RzLnB1c2goCisgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiYmF6Ii50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgzOTQ4NTM5KSwKKyAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoLTEyOTM4NDkyKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisKKyAgICAgICAgbGV0IG11dCBzX2NtcF9uZXN0ZWRfMTogQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBsZXQgaW5zYW5pdHkgPSBJbnNhbml0eSB7CisgICAgICAgICAgICB1c2VyX21hcDogU29tZShhcmdfbWFwX3VzZXJtYXApLAorICAgICAgICAgICAgeHRydWN0czogU29tZShhcmdfdmVjX3h0cnVjdHMpLAorICAgICAgICB9OworICAgICAgICBzX2NtcF9uZXN0ZWRfMS5pbnNlcnQoTnVtYmVyejo6VHdvLCBpbnNhbml0eS5jbG9uZSgpKTsKKyAgICAgICAgc19jbXBfbmVzdGVkXzEuaW5zZXJ0KE51bWJlcno6OlRocmVlLCBpbnNhbml0eS5jbG9uZSgpKTsKKworICAgICAgICBsZXQgbXV0IHNfY21wX25lc3RlZF8yOiBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGxldCBlbXB0eV9pbnNhbml0eSA9IEluc2FuaXR5IHsKKyAgICAgICAgICAgIHVzZXJfbWFwOiBTb21lKEJUcmVlTWFwOjpuZXcoKSksCisgICAgICAgICAgICB4dHJ1Y3RzOiBTb21lKFZlYzo6bmV3KCkpLAorICAgICAgICB9OworICAgICAgICBzX2NtcF9uZXN0ZWRfMi5pbnNlcnQoTnVtYmVyejo6U2l4LCBlbXB0eV9pbnNhbml0eSk7CisKKyAgICAgICAgbGV0IG11dCBzX2NtcDogQlRyZWVNYXA8VXNlcklkLCBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBzX2NtcC5pbnNlcnQoMSBhcyBVc2VySWQsIHNfY21wX25lc3RlZF8xKTsKKyAgICAgICAgc19jbXAuaW5zZXJ0KDIgYXMgVXNlcklkLCBzX2NtcF9uZXN0ZWRfMik7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9pbnNhbml0eShpbnNhbml0eS5jbG9uZSgpKSwgc19jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdEV4Y2VwdGlvbiAtIHJlbW90ZSB0aHJvd3MgWGNlcHRpb24iKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZXhjZXB0aW9uKCJYY2VwdGlvbiIudG9fb3duZWQoKSk7CisgICAgICAgIGxldCB4ID0gbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBtYXRjaCBlLmRvd25jYXN0X3JlZjo6PFhjZXB0aW9uPigpIHsKKyAgICAgICAgICAgICAgICAgICAgU29tZSh4KSA9PiBPayh4KSwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhwZWN0ZWQgWGNlcHRpb24gc3RydWN0Ii5pbnRvKCkpLCksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWGNlcHRpb24geworICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IFNvbWUoIlhjZXB0aW9uIi50b19vd25lZCgpKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCAmeF9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdEV4Y2VwdGlvbiAtIHJlbW90ZSB0aHJvd3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2V4Y2VwdGlvbigiVEV4Y2VwdGlvbiIudG9fb3duZWQoKSk7CisgICAgICAgIG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKHJlZiBlKSkgPT4geworICAgICAgICAgICAgICAgIGluZm8hKCJyZWNlaXZlZCBhbiB7Oj99IiwgZSk7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleGNlcHRpb24iLmludG8oKSkpLAorICAgICAgICB9PzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdEV4Y2VwdGlvbiAtIHJlbW90ZSBzdWNjZWVkcyIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPSB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9leGNlcHRpb24oImZvbyIudG9fb3duZWQoKSk7CisgICAgICAgIG1hdGNoIHIgeworICAgICAgICAgICAgT2soXykgPT4gT2soKCkpLAorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigicmVjZWl2ZWQgYW4gZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RNdWx0aUV4Y2VwdGlvbiAtIHJlbW90ZSB0aHJvd3MgWGNlcHRpb24iKTsKKyAgICB7CisgICAgICAgIGxldCByID0KKyAgICAgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpX2V4Y2VwdGlvbigiWGNlcHRpb24iLnRvX293bmVkKCksICJpZ25vcmVkIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKHJlZiBlKSkgPT4geworICAgICAgICAgICAgICAgIG1hdGNoIGUuZG93bmNhc3RfcmVmOjo8WGNlcHRpb24+KCkgeworICAgICAgICAgICAgICAgICAgICBTb21lKHgpID0+IE9rKHgpLAorICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleHBlY3RlZCBYY2VwdGlvbiBzdHJ1Y3QiLmludG8oKSksKSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleGNlcHRpb24iLmludG8oKSkpLAorICAgICAgICB9PzsKKworICAgICAgICBsZXQgeF9jbXAgPSBYY2VwdGlvbiB7CisgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgbWVzc2FnZTogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbiIudG9fb3duZWQoKSksCisgICAgICAgIH07CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdChPayh4KSwgJnhfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RNdWx0aUV4Y2VwdGlvbiAtIHJlbW90ZSB0aHJvd3MgWGNlcHRpb24yIik7CisgICAgeworICAgICAgICBsZXQgciA9CisgICAgICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tdWx0aV9leGNlcHRpb24oIlhjZXB0aW9uMiIudG9fb3duZWQoKSwgImlnbm9yZWQiLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgbWF0Y2ggZS5kb3duY2FzdF9yZWY6OjxYY2VwdGlvbjI+KCkgeworICAgICAgICAgICAgICAgICAgICBTb21lKHgpID0+IE9rKHgpLAorICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleHBlY3RlZCBYY2VwdGlvbiBzdHJ1Y3QiLmludG8oKSksKSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleGNlcHRpb24iLmludG8oKSkpLAorICAgICAgICB9PzsKKworICAgICAgICBsZXQgeF9jbXAgPSBYY2VwdGlvbjIgeworICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgyMDAyKSwKKyAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIlRoaXMgaXMgYW4gWGNlcHRpb24yIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgIH07CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdChPayh4KSwgJnhfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RNdWx0aUV4Y2VwdGlvbiAtIHJlbW90ZSBzdWNjZWVkcyIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPSB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tdWx0aV9leGNlcHRpb24oImhhaGEiLnRvX293bmVkKCksICJSRVRVUk5FRCIudG9fb3duZWQoKSk7CisgICAgICAgIGxldCB4ID0gbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIoZSkgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoZm9ybWF0ISgicmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gezo/fSIsIGUpLmludG8oKSwpLCksCisgICAgICAgICAgICBfID0+IHIsCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIlJFVFVSTkVEIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMCksCisgICAgICAgIH07CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdChPayh4KSwgeF9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE9uZVdheSAtIHJlbW90ZSBzbGVlcHMgZm9yIDEgc2Vjb25kIik7CisgICAgeworICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9vbmV3YXkoMSk/OworICAgIH0KKworICAgIC8vIGZpbmFsIHRlc3QgdG8gdmVyaWZ5IHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgd3JpdGFibGUgYWZ0ZXIgdGhlIG9uZS13YXkKKyAgICAvLyBjYWxsCisgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfdm9pZCgpCit9CisKKyNbY2ZnX2F0dHIoZmVhdHVyZSA9ICJjYXJnby1jbGlwcHkiLCBhbGxvdyhuZWVkbGVzc19wYXNzX2J5X3ZhbHVlKSldCitmbiB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0PFQ6IERlYnVnICsgUGFydGlhbEVxICsgU2l6ZWQ+KAorICAgIGFjdHVhbDogUmVzdWx0PFQsIHRocmlmdDo6RXJyb3I+LAorICAgIGV4cGVjdGVkOiBULAorKSAtPiBSZXN1bHQ8KCksIHRocmlmdDo6RXJyb3I+IHsKKyAgICBpbmZvISgiKioqIEVYUEVDVEVEOiBPayh7Oj99KSIsIGV4cGVjdGVkKTsKKyAgICBpbmZvISgiKioqIEFDVFVBTCAgOiB7Oj99IiwgYWN0dWFsKTsKKyAgICBtYXRjaCBhY3R1YWwgeworICAgICAgICBPayh2KSA9PiB7CisgICAgICAgICAgICBpZiB2ID09IGV4cGVjdGVkIHsKKyAgICAgICAgICAgICAgICBpbmZvISgiKioqIE9LICoqKiIpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmZvISgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihmb3JtYXQhKCJleHBlY3RlZCB7Oj99IGJ1dCBnb3Qgezo/fSIsICZleHBlY3RlZCwgJnYpLmludG8oKSksKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEVycihlKSA9PiBFcnIoZSksCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9zcmMvYmluL3Rlc3Rfc2VydmVyLnJzIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3Rfc2VydmVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYzFlYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL3NyYy9iaW4vdGVzdF9zZXJ2ZXIucnMKQEAgLTAsMCArMSwzOTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgbG9nOworZXh0ZXJuIGNyYXRlIGVudl9sb2dnZXI7CisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0X3Rlc3Q7CisKK3VzZSBvcmRlcmVkX2Zsb2F0OjpPcmRlcmVkRmxvYXQ7Cit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6e0JUcmVlTWFwLCBCVHJlZVNldH07Cit1c2Ugc3RkOjp0aHJlYWQ7Cit1c2Ugc3RkOjp0aW1lOjpEdXJhdGlvbjsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnksIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OwordXNlIHRocmlmdDo6c2VydmVyOjp7VE11bHRpcGxleGVkUHJvY2Vzc29yLCBUU2VydmVyfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OwordXNlIHRocmlmdF90ZXN0OjoqOworCitmbiBtYWluKCkgeworICAgIGVudl9sb2dnZXI6OmluaXQoKS5leHBlY3QoImxvZ2dlciBzZXR1cCBmYWlsZWQiKTsKKworICAgIGRlYnVnISgiaW5pdGlhbGl6ZWQgbG9nZ2VyIC0gcnVubmluZyBjcm9zcy10ZXN0IHNlcnZlciIpOworCisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gaW5mbyEoImNyb3NzLXRlc3Qgc2VydmVyIHN1Y2NlZWRlZCIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgaW5mbyEoImNyb3NzLXRlc3Qgc2VydmVyIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKworICAgIC8vIHVuc3VwcG9ydGVkIG9wdGlvbnM6CisgICAgLy8gLS1kb21haW4tc29ja2V0CisgICAgLy8gLS1uYW1lZC1waXBlCisgICAgLy8gLS1zc2wKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X3Rlc3RfY2xpZW50ID0+CisgICAgICAgICh2ZXJzaW9uOiAiMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlJ1c3QgVGhyaWZ0IHRlc3Qgc2VydmVyIikKKyAgICAgICAgKEBhcmcgcG9ydDogLS1wb3J0ICt0YWtlc192YWx1ZSAicG9ydCBvbiB3aGljaCB0aGUgdGVzdCBzZXJ2ZXIgbGlzdGVucyIpCisgICAgICAgIChAYXJnIHRyYW5zcG9ydDogLS10cmFuc3BvcnQgK3Rha2VzX3ZhbHVlICJ0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJ1ZmZlcmVkXCIsIFwiZnJhbWVkXCIpIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHNlcnZlcl90eXBlOiAtLXNlcnZlcl90eXBlICt0YWtlc192YWx1ZSAidHlwZSBvZiBzZXJ2ZXIgaW5zdGFudGlhdGVkIChcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIpIikKKyAgICAgICAgKEBhcmcgd29ya2VyczogLW4gLS13b3JrZXJzICt0YWtlc192YWx1ZSAibnVtYmVyIG9mIHRocmVhZC1wb29sIHdvcmtlcnMgKFwiNFwiKSIpCisgICAgKQorICAgICAgICAgICAgLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IHRyYW5zcG9ydCA9IG1hdGNoZXMudmFsdWVfb2YoInRyYW5zcG9ydCIpLnVud3JhcF9vcigiYnVmZmVyZWQiKTsKKyAgICBsZXQgcHJvdG9jb2wgPSBtYXRjaGVzLnZhbHVlX29mKCJwcm90b2NvbCIpLnVud3JhcF9vcigiYmluYXJ5Iik7CisgICAgbGV0IHNlcnZlcl90eXBlID0gbWF0Y2hlcy52YWx1ZV9vZigic2VydmVyX3R5cGUiKS51bndyYXBfb3IoInRocmVhZC1wb29sIik7CisgICAgbGV0IHdvcmtlcnMgPSB2YWx1ZV90IShtYXRjaGVzLCAid29ya2VycyIsIHVzaXplKS51bndyYXBfb3IoNCk7CisgICAgbGV0IGxpc3Rlbl9hZGRyZXNzID0gZm9ybWF0ISgiMTI3LjAuMC4xOnt9IiwgcG9ydCk7CisKKyAgICBpbmZvISgiYmluZGluZyB0byB7fSIsIGxpc3Rlbl9hZGRyZXNzKTsKKworICAgIGxldCAoaV90cmFuc3BvcnRfZmFjdG9yeSwgb190cmFuc3BvcnRfZmFjdG9yeSk6IChCb3g8VFJlYWRUcmFuc3BvcnRGYWN0b3J5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm94PFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk+KSA9CisgICAgICAgIG1hdGNoICYqdHJhbnNwb3J0IHsKKyAgICAgICAgICAgICJidWZmZXJlZCIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgICAgICBCb3g6Om5ldyhUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICJmcmFtZWQiID0+IHsKKyAgICAgICAgICAgICAgICAoQm94OjpuZXcoVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICAgICAgIEJveDo6bmV3KFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVua25vd24gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgbGV0IChpX3Byb3RvY29sX2ZhY3RvcnksIG9fcHJvdG9jb2xfZmFjdG9yeSk6IChCb3g8VElucHV0UHJvdG9jb2xGYWN0b3J5PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJveDxUT3V0cHV0UHJvdG9jb2xGYWN0b3J5PikgPQorICAgICAgICBtYXRjaCAmKnByb3RvY29sIHsKKyAgICAgICAgICAgICJiaW5hcnkiIHwgIm11bHRpIiB8ICJtdWx0aTpiaW5hcnkiID0+IHsKKyAgICAgICAgICAgICAgICAoQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICJjb21wYWN0IiB8ICJtdWx0aWMiIHwgIm11bHRpOmNvbXBhY3QiID0+IHsKKyAgICAgICAgICAgICAgICAoQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5rbm93biA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBsZXQgdGVzdF9wcm9jZXNzb3IgPSBUaHJpZnRUZXN0U3luY1Byb2Nlc3Nvcjo6bmV3KFRocmlmdFRlc3RTeW5jSGFuZGxlckltcGwge30pOworCisgICAgbWF0Y2ggJipzZXJ2ZXJfdHlwZSB7CisgICAgICAgICJzaW1wbGUiIHwgInRocmVhZC1wb29sIiA9PiB7CisgICAgICAgICAgICBpZiBwcm90b2NvbCA9PSAibXVsdGkiIHx8IHByb3RvY29sID09ICJtdWx0aWMiIHsKKyAgICAgICAgICAgICAgICBsZXQgc2Vjb25kX3NlcnZpY2VfcHJvY2Vzc29yID0gU2Vjb25kU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXJJbXBsIHt9LCk7CisKKyAgICAgICAgICAgICAgICBsZXQgbXV0IG11bHRpcGxleGVkX3Byb2Nlc3NvciA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcigiVGhyaWZ0VGVzdCIsIEJveDo6bmV3KHRlc3RfcHJvY2Vzc29yKSwgdHJ1ZSk/OworICAgICAgICAgICAgICAgIG11bHRpcGxleGVkX3Byb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoIlNlY29uZFNlcnZpY2UiLCBCb3g6Om5ldyhzZWNvbmRfc2VydmljZV9wcm9jZXNzb3IpLCBmYWxzZSk/OworCisgICAgICAgICAgICAgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIGlfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgb190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMsCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIHNlcnZlci5saXN0ZW4oJmxpc3Rlbl9hZGRyZXNzKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgICAgICAgICAgICAgaV90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBvX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIHRlc3RfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICB3b3JrZXJzLAorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBzZXJ2ZXIubGlzdGVuKCZsaXN0ZW5fYWRkcmVzcykKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1bmtub3duID0+IEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBzZXJ2ZXIgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSksCisgICAgfQorfQorCitzdHJ1Y3QgVGhyaWZ0VGVzdFN5bmNIYW5kbGVySW1wbDsKK2ltcGwgVGhyaWZ0VGVzdFN5bmNIYW5kbGVyIGZvciBUaHJpZnRUZXN0U3luY0hhbmRsZXJJbXBsIHsKKyAgICBmbiBoYW5kbGVfdGVzdF92b2lkKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICBpbmZvISgidGVzdFZvaWQoKSIpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9zdHJpbmcoJnNlbGYsIHRoaW5nOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBpbmZvISgidGVzdFN0cmluZyh7fSkiLCAmdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9ib29sKCZzZWxmLCB0aGluZzogYm9vbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBpbmZvISgidGVzdEJvb2woe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9ieXRlKCZzZWxmLCB0aGluZzogaTgpIC0+IHRocmlmdDo6UmVzdWx0PGk4PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0Qnl0ZSh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2kzMigmc2VsZiwgdGhpbmc6IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0aTMyKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfaTY0KCZzZWxmLCB0aGluZzogaTY0KSAtPiB0aHJpZnQ6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgaW5mbyEoInRlc3RpNjQoe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9kb3VibGUoJnNlbGYsIHRoaW5nOiBPcmRlcmVkRmxvYXQ8ZjY0PikgLT4gdGhyaWZ0OjpSZXN1bHQ8T3JkZXJlZEZsb2F0PGY2ND4+IHsKKyAgICAgICAgaW5mbyEoInRlc3REb3VibGUoe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9iaW5hcnkoJnNlbGYsIHRoaW5nOiBWZWM8dTg+KSAtPiB0aHJpZnQ6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0QmluYXJ5KHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9zdHJ1Y3QoJnNlbGYsIHRoaW5nOiBYdHJ1Y3QpIC0+IHRocmlmdDo6UmVzdWx0PFh0cnVjdD4geworICAgICAgICBpbmZvISgidGVzdFN0cnVjdCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfbmVzdCgmc2VsZiwgdGhpbmc6IFh0cnVjdDIpIC0+IHRocmlmdDo6UmVzdWx0PFh0cnVjdDI+IHsKKyAgICAgICAgaW5mbyEoInRlc3ROZXN0KHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9tYXAoJnNlbGYsIHRoaW5nOiBCVHJlZU1hcDxpMzIsIGkzMj4pIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPGkzMiwgaTMyPj4geworICAgICAgICBpbmZvISgidGVzdE1hcCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc3RyaW5nX21hcCgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHRoaW5nOiBCVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4sCisgICAgKSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RTdHJpbmdNYXAoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3NldCgmc2VsZiwgdGhpbmc6IEJUcmVlU2V0PGkzMj4pIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlU2V0PGkzMj4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RTZXQoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2xpc3QoJnNlbGYsIHRoaW5nOiBWZWM8aTMyPikgLT4gdGhyaWZ0OjpSZXN1bHQ8VmVjPGkzMj4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RMaXN0KHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9lbnVtKCZzZWxmLCB0aGluZzogTnVtYmVyeikgLT4gdGhyaWZ0OjpSZXN1bHQ8TnVtYmVyej4geworICAgICAgICBpbmZvISgidGVzdEVudW0oezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3R5cGVkZWYoJnNlbGYsIHRoaW5nOiBVc2VySWQpIC0+IHRocmlmdDo6UmVzdWx0PFVzZXJJZD4geworICAgICAgICBpbmZvISgidGVzdFR5cGVkZWYoe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICAvLy8gQHJldHVybiBtYXA8aTMyLG1hcDxpMzIsaTMyPj4gLSByZXR1cm5zIGEgZGljdGlvbmFyeSB3aXRoIHRoZXNlIHZhbHVlczoKKyAgICAvLy8gey00ID0+IHstNCA9PiAtNCwgLTMgPT4gLTMsIC0yID0+IC0yLCAtMSA9PiAtMSwgfSwgNCA9PiB7MSA9PiAxLCAyID0+CisgICAgLy8vIDIsIDMgPT4gMywgNCA9PiA0LCB9LCB9CisgICAgZm4gaGFuZGxlX3Rlc3RfbWFwX21hcCgmc2VsZiwgaGVsbG86IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8aTMyLCBCVHJlZU1hcDxpMzIsIGkzMj4+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TWFwTWFwKHt9KSIsIGhlbGxvKTsKKworICAgICAgICBsZXQgbXV0IGlubmVyX21hcF8wOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluIC00Li4oMCBhcyBpMzIpIHsKKyAgICAgICAgICAgIGlubmVyX21hcF8wLmluc2VydChpLCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBtdXQgaW5uZXJfbWFwXzE6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gMS4uNSB7CisgICAgICAgICAgICBpbm5lcl9tYXBfMS5pbnNlcnQoaSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IHJldF9tYXA6IEJUcmVlTWFwPGkzMiwgQlRyZWVNYXA8aTMyLCBpMzI+PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgcmV0X21hcC5pbnNlcnQoLTQsIGlubmVyX21hcF8wKTsKKyAgICAgICAgcmV0X21hcC5pbnNlcnQoNCwgaW5uZXJfbWFwXzEpOworCisgICAgICAgIE9rKHJldF9tYXApCisgICAgfQorCisgICAgLy8vIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgIC8vLyAgICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAvLy8gICAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgLy8vICAgICAgICAgICAgfSwKKyAgICAvLy8gICAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgLy8vICAgICB9CisgICAgLy8vIHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAgZm4gaGFuZGxlX3Rlc3RfaW5zYW5pdHkoCisgICAgICAgICZzZWxmLAorICAgICAgICBhcmd1bWVudDogSW5zYW5pdHksCisgICAgKSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZU1hcDxVc2VySWQsIEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5Pj4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RJbnNhbml0eSh7Oj99KSIsIGFyZ3VtZW50KTsKKyAgICAgICAgbGV0IG11dCBtYXBfMDogQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtYXBfMC5pbnNlcnQoTnVtYmVyejo6VHdvLCBhcmd1bWVudC5jbG9uZSgpKTsKKyAgICAgICAgbWFwXzAuaW5zZXJ0KE51bWJlcno6OlRocmVlLCBhcmd1bWVudC5jbG9uZSgpKTsKKworICAgICAgICBsZXQgbXV0IG1hcF8xOiBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGxldCBpbnNhbml0eSA9IEluc2FuaXR5IHsKKyAgICAgICAgICAgIHVzZXJfbWFwOiBOb25lLAorICAgICAgICAgICAgeHRydWN0czogTm9uZSwKKyAgICAgICAgfTsKKyAgICAgICAgbWFwXzEuaW5zZXJ0KE51bWJlcno6OlNpeCwgaW5zYW5pdHkpOworCisgICAgICAgIGxldCBtdXQgcmV0OiBCVHJlZU1hcDxVc2VySWQsIEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5Pj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIHJldC5pbnNlcnQoMSwgbWFwXzApOworICAgICAgICByZXQuaW5zZXJ0KDIsIG1hcF8xKTsKKworICAgICAgICBPayhyZXQpCisgICAgfQorCisgICAgLy8vIHJldHVybnMgYW4gWHRydWN0IHdpdGg6CisgICAgLy8vIHN0cmluZ190aGluZyA9ICJIZWxsbzIiLCBieXRlX3RoaW5nID0gYXJnMCwgaTMyX3RoaW5nID0gYXJnMSBhbmQKKyAgICAvLy8gaTY0X3RoaW5nID0gYXJnMgorICAgIGZuIGhhbmRsZV90ZXN0X211bHRpKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgYXJnMDogaTgsCisgICAgICAgIGFyZzE6IGkzMiwKKyAgICAgICAgYXJnMjogaTY0LAorICAgICAgICBfOiBCVHJlZU1hcDxpMTYsIFN0cmluZz4sCisgICAgICAgIF86IE51bWJlcnosCisgICAgICAgIF86IFVzZXJJZCwKKyAgICApIC0+IHRocmlmdDo6UmVzdWx0PFh0cnVjdD4geworICAgICAgICBsZXQgeF9yZXQgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJIZWxsbzIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZShhcmcwKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZShhcmcxKSwKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZShhcmcyKSwKKyAgICAgICAgfTsKKworICAgICAgICBPayh4X3JldCkKKyAgICB9CisKKyAgICAvLy8gaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0KKyAgICAvLy8gYXJnCisgICAgLy8vIGVsc2UgaWYgYXJnID09ICJURXhjZXB0aW9uIiB0aHJvdyBURXhjZXB0aW9uCisgICAgLy8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAgZm4gaGFuZGxlX3Rlc3RfZXhjZXB0aW9uKCZzZWxmLCBhcmc6IFN0cmluZykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaW5mbyEoInRlc3RFeGNlcHRpb24oe30pIiwgYXJnKTsKKworICAgICAgICBtYXRjaCAmKmFyZyB7CisgICAgICAgICAgICAiWGNlcHRpb24iID0+IHsKKyAgICAgICAgICAgICAgICBFcnIoCisgICAgICAgICAgICAgICAgICAgIChYY2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMTAwMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFNvbWUoYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiVEV4Y2VwdGlvbiIgPT4gRXJyKCJ0aGlzIGlzIGEgcmFuZG9tIGVycm9yIi5pbnRvKCkpLAorICAgICAgICAgICAgXyA9PiBPaygoKSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gaWYgYXJnMCA9PSAiWGNlcHRpb24iOgorICAgIC8vLyB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSAiVGhpcyBpcyBhbgorICAgIC8vLyBYY2VwdGlvbiIKKyAgICAvLy8gZWxzZSBpZiBhcmcwID09ICJYY2VwdGlvbjIiOgorICAgIC8vLyB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBzdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0KKyAgICAvLy8gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgIC8vIGVsc2U6CisgICAgLy8gICBkbyBub3QgdGhyb3cgYW55dGhpbmcgYW5kIHJldHVybiBYdHJ1Y3Qgd2l0aCBzdHJpbmdfdGhpbmcgPSBhcmcxCisgICAgZm4gaGFuZGxlX3Rlc3RfbXVsdGlfZXhjZXB0aW9uKCZzZWxmLCBhcmcwOiBTdHJpbmcsIGFyZzE6IFN0cmluZykgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0PiB7CisgICAgICAgIG1hdGNoICYqYXJnMCB7CisgICAgICAgICAgICAiWGNlcHRpb24iID0+IHsKKyAgICAgICAgICAgICAgICBFcnIoCisgICAgICAgICAgICAgICAgICAgIChYY2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMTAwMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFNvbWUoIlRoaXMgaXMgYW4gWGNlcHRpb24iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuaW50bygpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICJYY2VwdGlvbjIiID0+IHsKKyAgICAgICAgICAgICAgICBFcnIoCisgICAgICAgICAgICAgICAgICAgIChYY2VwdGlvbjIgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDIwMDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc6IFNvbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuaW50bygpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4geworICAgICAgICAgICAgICAgIE9rKAorICAgICAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKGFyZzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9vbmV3YXkoJnNlbGYsIHNlY29uZHNfdG9fc2xlZXA6IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgdGhyZWFkOjpzbGVlcChEdXJhdGlvbjo6ZnJvbV9zZWNzKHNlY29uZHNfdG9fc2xlZXAgYXMgdTY0KSk7CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworc3RydWN0IFNlY29uZFNlcnZpY2VTeW5jSGFuZGxlckltcGw7CitpbXBsIFNlY29uZFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgU2Vjb25kU2VydmljZVN5bmNIYW5kbGVySW1wbCB7CisgICAgZm4gaGFuZGxlX3NlY29uZHRlc3Rfc3RyaW5nKCZzZWxmLCB0aGluZzogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgaW5mbyEoIihzZWNvbmQpdGVzdFN0cmluZyh7fSkiLCAmdGhpbmcpOworICAgICAgICBsZXQgcmV0ID0gZm9ybWF0ISgidGVzdFN0cmluZyhcInt9XCIpIiwgJnRoaW5nKTsKKyAgICAgICAgT2socmV0KQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcnMvc3JjL2xpYi5ycyBiL3Rlc3QvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzliZjkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCittb2QgdGhyaWZ0X3Rlc3Q7CitwdWIgdXNlIHRocmlmdF90ZXN0OjoqOwpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LnB5IGIvdGVzdC90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1OTI1NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QucHkKQEAgLTAsMCArMSwxOTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIEFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiAoY3Jvc3MpIHRlc3Qgc3VpdGUKKyMKKyMgdGVzdHMgZGlmZmVyZW50IHNlcnZlci1jbGllbnQsIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgY29tYmluYXRpb25zCisjCisjIFRoaXMgc2NyaXB0IHJlcXVpcmVzIHB5dGhvbiAzLnggZHVlIHRvIHRoZSBpbXByb3ZlbWVudHMgaW4KKyMgc3VicHJvY2VzcyBtYW5hZ2VtZW50IHRoYXQgYXJlIG5lZWRlZCBmb3IgcmVsaWFiaWxpdHkuCisjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgoraW1wb3J0IGpzb24KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpbXBvcnQgY3Jvc3NydW5uZXIKK2Zyb20gY3Jvc3NydW5uZXIuY29tcGF0IGltcG9ydCBwYXRoX2pvaW4KKworIyAzLjMgaW50cm9kdWNlZCBzdWJwcm9jZXNzIHRpbWVvdXRzIG9uIHdhaXRpbmcgZm9yIGNoaWxkCityZXFfdmVyc2lvbiA9ICgzLCAzKQorY3VyX3ZlcnNpb24gPSBzeXMudmVyc2lvbl9pbmZvCithc3NlcnQgKGN1cl92ZXJzaW9uID49IHJlcV92ZXJzaW9uKSwgIlB5dGhvbiAzLjMgb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciBvcGVyYXRpb24uIgorCisKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkpCitURVNUX0RJUl9SRUxBVElWRSA9ICd0ZXN0JworVEVTVF9ESVIgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIFRFU1RfRElSX1JFTEFUSVZFKQorRkVBVFVSRV9ESVJfUkVMQVRJVkUgPSBwYXRoX2pvaW4oVEVTVF9ESVJfUkVMQVRJVkUsICdmZWF0dXJlcycpCitDT05GSUdfRklMRSA9ICd0ZXN0cy5qc29uJworCisKK2RlZiBydW5fY3Jvc3NfdGVzdHMoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIGpvYnMsIHNraXBfa25vd25fZmFpbHVyZXMsIG9ubHlfa25vd25fZmFpbHVyZXMsIHJldHJ5X2NvdW50LCByZWdleCk6CisgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgIGxvZ2dlci5kZWJ1ZygnQ29sbGVjdGluZyB0ZXN0cycpCisgICAgd2l0aCBvcGVuKHBhdGhfam9pbihURVNUX0RJUiwgQ09ORklHX0ZJTEUpLCAncicpIGFzIGZwOgorICAgICAgICBqID0ganNvbi5sb2FkKGZwKQorICAgIHRlc3RzID0gY3Jvc3NydW5uZXIuY29sbGVjdF9jcm9zc190ZXN0cyhqLCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgcmVnZXgpCisgICAgaWYgbm90IHRlc3RzOgorICAgICAgICBwcmludCgnTm8gdGVzdCBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnICBzZXJ2ZXJzOiAlcycgJSBzZXJ2ZXJfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgY2xpZW50czogJXMnICUgY2xpZW50X21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG9ubHlfa25vd25fZmFpbHVyZXM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnT25seSBydW5uaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKFRFU1RfRElSKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBpbiBrbm93biwgdGVzdHMpKQorICAgIGlmIHNraXBfa25vd25fZmFpbHVyZXM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoVEVTVF9ESVIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIG5vdCBpbiBrbm93biwgdGVzdHMpKQorCisgICAgZGlzcGF0Y2hlciA9IGNyb3NzcnVubmVyLlRlc3REaXNwYXRjaGVyKFRFU1RfRElSLCBST09UX0RJUiwgVEVTVF9ESVJfUkVMQVRJVkUsIGpvYnMpCisgICAgbG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgJWQgdGVzdHMnICUgbGVuKHRlc3RzKSkKKyAgICB0cnk6CisgICAgICAgIGZvciByIGluIFtkaXNwYXRjaGVyLmRpc3BhdGNoKHRlc3QsIHJldHJ5X2NvdW50KSBmb3IgdGVzdCBpbiB0ZXN0c106CisgICAgICAgICAgICByLndhaXQoKQorICAgICAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgZm9yIGNvbXBsZXRpb24nKQorICAgICAgICByZXR1cm4gZGlzcGF0Y2hlci53YWl0KCkKKyAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbnRlcnJ1cHRlZCwgc2h1dHRpbmcgZG93bicpCisgICAgICAgIGRpc3BhdGNoZXIudGVybWluYXRlKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIHJ1bl9mZWF0dXJlX3Rlc3RzKHNlcnZlcl9tYXRjaCwgZmVhdHVyZV9tYXRjaCwgam9icywgc2tpcF9rbm93bl9mYWlsdXJlcywgb25seV9rbm93bl9mYWlsdXJlcywgcmV0cnlfY291bnQsIHJlZ2V4KToKKyAgICBiYXNlZGlyID0gcGF0aF9qb2luKFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSkKKyAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgbG9nZ2VyLmRlYnVnKCdDb2xsZWN0aW5nIHRlc3RzJykKKyAgICB3aXRoIG9wZW4ocGF0aF9qb2luKFRFU1RfRElSLCBDT05GSUdfRklMRSksICdyJykgYXMgZnA6CisgICAgICAgIGogPSBqc29uLmxvYWQoZnApCisgICAgd2l0aCBvcGVuKHBhdGhfam9pbihiYXNlZGlyLCBDT05GSUdfRklMRSksICdyJykgYXMgZnA6CisgICAgICAgIGoyID0ganNvbi5sb2FkKGZwKQorICAgIHRlc3RzID0gY3Jvc3NydW5uZXIuY29sbGVjdF9mZWF0dXJlX3Rlc3RzKGosIGoyLCBzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVfbWF0Y2gsIHJlZ2V4KQorICAgIGlmIG5vdCB0ZXN0czoKKyAgICAgICAgcHJpbnQoJ05vIHRlc3QgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYScsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgc2VydmVyczogJXMnICUgc2VydmVyX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIGZlYXR1cmVzOiAlcycgJSBmZWF0dXJlX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG9ubHlfa25vd25fZmFpbHVyZXM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnT25seSBydW5uaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKGJhc2VkaXIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIGluIGtub3duLCB0ZXN0cykpCisgICAgaWYgc2tpcF9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhiYXNlZGlyKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBub3QgaW4ga25vd24sIHRlc3RzKSkKKworICAgIGRpc3BhdGNoZXIgPSBjcm9zc3J1bm5lci5UZXN0RGlzcGF0Y2hlcihURVNUX0RJUiwgUk9PVF9ESVIsIEZFQVRVUkVfRElSX1JFTEFUSVZFLCBqb2JzKQorICAgIGxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nICVkIHRlc3RzJyAlIGxlbih0ZXN0cykpCisgICAgdHJ5OgorICAgICAgICBmb3IgciBpbiBbZGlzcGF0Y2hlci5kaXNwYXRjaCh0ZXN0LCByZXRyeV9jb3VudCkgZm9yIHRlc3QgaW4gdGVzdHNdOgorICAgICAgICAgICAgci53YWl0KCkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdXYWl0aW5nIGZvciBjb21wbGV0aW9uJykKKyAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXIud2FpdCgpCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnSW50ZXJydXB0ZWQsIHNodXR0aW5nIGRvd24nKQorICAgICAgICBkaXNwYXRjaGVyLnRlcm1pbmF0ZSgpCisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBkZWZhdWx0X2NvbmN1cnJlbnR5KCk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gaW50KG9zLmVudmlyb24uZ2V0KCdUSFJJRlRfQ1JPU1NURVNUX0NPTkNVUlJFTkNZJykpCisgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAjIFNpbmNlIG11Y2ggdGltZSBpcyBzcGVudCBzbGVlcGluZywgdXNlIG1hbnkgdGhyZWFkcworICAgICAgICByZXR1cm4gaW50KG11bHRpcHJvY2Vzc2luZy5jcHVfY291bnQoKSAqIDEuMjUpICsgMQorCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNlcnZlcicsIGRlZmF1bHQ9JycsIG5hcmdzPScqJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpc3Qgb2Ygc2VydmVycyB0byB0ZXN0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNsaWVudCcsIGRlZmF1bHQ9JycsIG5hcmdzPScqJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpc3Qgb2YgY2xpZW50cyB0byB0ZXN0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctRicsICctLWZlYXR1cmVzJywgbmFyZ3M9JyonLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gc2VydmVyIGZlYXR1cmUgdGVzdHMgaW5zdGVhZCBvZiBjcm9zcyBsYW5ndWFnZSB0ZXN0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLVInLCAnLS1yZWdleCcsIGhlbHA9J3Rlc3QgbmFtZSBwYXR0ZXJuIHRvIHJ1bicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLW8nLCAnLS1vbmx5LWtub3duX2ZhaWx1cmVzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nb25seV9rbm93bl9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdvbmx5IGV4ZWN1dGUgdGVzdHMgdGhhdCBhcmUga25vd24gdG8gZmFpbCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1za2lwLWtub3duLWZhaWx1cmVzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nc2tpcF9rbm93bl9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkbyBub3QgZXhlY3V0ZSB0ZXN0cyB0aGF0IGFyZSBrbm93biB0byBmYWlsJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcicsICctLXJldHJ5LWNvdW50JywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTAsIGhlbHA9J21heGltdW0gcmV0cnkgb24gZmFpbHVyZScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWonLCAnLS1qb2JzJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHRfY29uY3VycmVudHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J251bWJlciBvZiBjb25jdXJyZW50IHRlc3QgZXhlY3V0aW9ucycpCisKKyAgICBnID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCh0aXRsZT0nQWR2YW5jZWQnKQorICAgIGcuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX2NvbnN0JywKKyAgICAgICAgICAgICAgICAgICBkZXN0PSdsb2dfbGV2ZWwnLCBjb25zdD1sb2dnaW5nLkRFQlVHLCBkZWZhdWx0PWxvZ2dpbmcuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICBoZWxwPSdzaG93IGRlYnVnIG91dHB1dCBmb3IgdGVzdCBydW5uZXInKQorICAgIGcuYWRkX2FyZ3VtZW50KCctUCcsICctLXByaW50LWV4cGVjdGVkLWZhaWx1cmVzJywgY2hvaWNlcz1bJ21lcmdlJywgJ292ZXJ3cml0ZSddLAorICAgICAgICAgICAgICAgICAgIGRlc3Q9J3ByaW50X2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICBoZWxwPSJnZW5lcmF0ZSBleHBlY3RlZCBmYWlsdXJlcyBiYXNlZCBvbiBsYXN0IHJlc3VsdCBhbmQgcHJpbnQgdG8gc3Rkb3V0IikKKyAgICBnLmFkZF9hcmd1bWVudCgnLVUnLCAnLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXMnLCBjaG9pY2VzPVsnbWVyZ2UnLCAnb3ZlcndyaXRlJ10sCisgICAgICAgICAgICAgICAgICAgZGVzdD0ndXBkYXRlX2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICBoZWxwPSJnZW5lcmF0ZSBleHBlY3RlZCBmYWlsdXJlcyBiYXNlZCBvbiBsYXN0IHJlc3VsdCBhbmQgc2F2ZSB0byBkZWZhdWx0IGZpbGUgbG9jYXRpb24iKQorICAgIG9wdGlvbnMgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQorCisgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmxvZ190b19zdGRlcnIoKQorICAgIGxvZ2dlci5zZXRMZXZlbChvcHRpb25zLmxvZ19sZXZlbCkKKworICAgIGlmIG9wdGlvbnMuZmVhdHVyZXMgaXMgbm90IE5vbmUgYW5kIG9wdGlvbnMuY2xpZW50OgorICAgICAgICBwcmludCgnQ2Fubm90IHNwZWNpZnkgYm90aCAtLWZlYXR1cmVzIGFuZCAtLWNsaWVudCAnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiAxCisKKyAgICAjIEFsbG93IG11bHRpcGxlIGFyZ3Mgc2VwYXJhdGVkIHdpdGggJywnIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgc2VydmVyX21hdGNoID0gbGlzdChjaGFpbigqW3guc3BsaXQoJywnKSBmb3IgeCBpbiBvcHRpb25zLnNlcnZlcl0pKQorICAgIGNsaWVudF9tYXRjaCA9IGxpc3QoY2hhaW4oKlt4LnNwbGl0KCcsJykgZm9yIHggaW4gb3B0aW9ucy5jbGllbnRdKSkKKworICAgIGlmIG9wdGlvbnMudXBkYXRlX2ZhaWx1cmVzIG9yIG9wdGlvbnMucHJpbnRfZmFpbHVyZXM6CisgICAgICAgIGRpcmUgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIEZFQVRVUkVfRElSX1JFTEFUSVZFKSBpZiBvcHRpb25zLmZlYXR1cmVzIGlzIG5vdCBOb25lIGVsc2UgVEVTVF9ESVIKKyAgICAgICAgcmVzID0gY3Jvc3NydW5uZXIuZ2VuZXJhdGVfa25vd25fZmFpbHVyZXMoCisgICAgICAgICAgICBkaXJlLCBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcyA9PSAnb3ZlcndyaXRlJywKKyAgICAgICAgICAgIG9wdGlvbnMudXBkYXRlX2ZhaWx1cmVzLCBvcHRpb25zLnByaW50X2ZhaWx1cmVzKQorICAgIGVsaWYgb3B0aW9ucy5mZWF0dXJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgZmVhdHVyZXMgPSBvcHRpb25zLmZlYXR1cmVzIG9yIFsnLionXQorICAgICAgICByZXMgPSBydW5fZmVhdHVyZV90ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVzLCBvcHRpb25zLmpvYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2tpcF9rbm93bl9mYWlsdXJlcywgb3B0aW9ucy5vbmx5X2tub3duX2ZhaWx1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQorICAgIGVsc2U6CisgICAgICAgIHJlcyA9IHJ1bl9jcm9zc190ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgb3B0aW9ucy5qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5za2lwX2tub3duX2ZhaWx1cmVzLCBvcHRpb25zLm9ubHlfa25vd25fZmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQorICAgIHJldHVybiAwIGlmIHJlcyBlbHNlIDEKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdHMuanNvbiBiL3Rlc3QvdGVzdHMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q2ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC90ZXN0cy5qc29uCkBAIC0wLDAgKzEsNzQ5IEBACitbCisgIHsKKyAgICAibmFtZSI6ICJjX2dsaWIiLAorICAgICJwbGF0Zm9ybXMiOiBbCisgICAgICAiTGludXgiCisgICAgXSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0X3NlcnZlciIsCisgICAgICAgICItLWx0LWRlYnVnIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0X2NsaWVudCIsCisgICAgICAgICItLWx0LWRlYnVnIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcC1zc2wiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogImNfZ2xpYiIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImNsIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbIlRlc3RTZXJ2ZXIiXSwKKyAgICAgICJ3b3JrZGlyIjogImNsIiwKKyAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSIsICJtdWx0aSJdLAorICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIiwgImZyYW1lZCJdLAorICAgICAgInNvY2tldHMiOiBbImlwIl0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsiVGVzdENsaWVudCJdLAorICAgICAgIndvcmtkaXIiOiAiY2wiLAorICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5IiwgIm11bHRpIl0sCisgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiLCAiZnJhbWVkIl0sCisgICAgICAic29ja2V0cyI6IFsiaXAiXQorICAgIH0KKyAgfSwKKyAgeworICAgICJuYW1lIjogImQiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRocmlmdF90ZXN0X3NlcnZlciIsCisgICAgICAgICItLXRyYWNlIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGhyaWZ0X3Rlc3RfY2xpZW50IgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiaHR0cCIsCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9kL3Rlc3QiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJnbyIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdHNlcnZlciIsCisgICAgICAgICItLWNlcnRQYXRoPS4uLy4uL2tleXMiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0Y2xpZW50IgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogImdvL2JpbiIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImphdmEiLAorICAgICJqb2luX2FyZ3MiOiBmYWxzZSwKKyAgICAic2VydmVyIjogeworICAgICAgImRlbGF5IjogMTUsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImJ1aWxkL3J1bnNlcnZlciIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIiwKKyAgICAgICAgImpzb246bXVsdGlqIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTMsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImJ1aWxkL3J1bmNsaWVudCIKKyAgICAgIF0sCisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImh0dHAiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIsCisgICAgICAgICJtdWx0aWo6anNvbiIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImZyYW1lZDpmYXN0ZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIiwKKyAgICAgICJtdWx0aSIsCisgICAgICAibXVsdGljIiwKKyAgICAgICJtdWx0aWoiCisgICAgXSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvamF2YSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIm5vZGVqcyIsCisgICAgImVudiI6IHsKKyAgICAgICJOT0RFX1BBVEgiOiAiLi4vbGliIgorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAibm9kZSIsCisgICAgICAgICJzZXJ2ZXIuanMiLAorICAgICAgICAiLS10eXBlPXRjcCIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm5vZGUiLAorICAgICAgICAiY2xpZW50LmpzIiwKKyAgICAgICAgIi0tdHlwZT10Y3AiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIsCisgICAgICAiZG9tYWluIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvbm9kZWpzL3Rlc3QiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJocyIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdFNlcnZlciIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImh0dHAiCisgICAgICBdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0Q2xpZW50IgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJoZWFkZXIiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogImhzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicHkiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiZXh0cmFfYXJncyI6IFsiVFNpbXBsZVNlcnZlciJdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0U2VydmVyLnB5IiwKKyAgICAgICAgIi0tdmVyYm9zZSIsCisgICAgICAgICItLWdlbnB5ZGlyPWdlbi1weSIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDEwLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0Q2xpZW50LnB5IiwKKyAgICAgICAgIi0tdmVyYm9zZSIsCisgICAgICAgICItLWhvc3Q9bG9jYWxob3N0IiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aSIsCisgICAgICAgICJtdWx0aTptdWx0aWEiLAorICAgICAgICAibXVsdGljIiwKKyAgICAgICAgIm11bHRpYzptdWx0aWFjIiwKKyAgICAgICAgIm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiLAorICAgICAgInpsaWIiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iLAorICAgICAgImJpbmFyeTphY2NlbCIsCisgICAgICAiY29tcGFjdDphY2NlbGMiLAorICAgICAgImhlYWRlciIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogInB5IgorICB9LAorICB7CisgICAgImNvbW1lbnQiOiAiVXNpbmcgJ3B5dGhvbjMnIGV4ZWN1dGFibGUgdG8gdGVzdCBweTIgYW5kIDMgYXQgb25jZSIsCisgICAgIm5hbWUiOiAicHkzIiwKKyAgICAic2VydmVyIjogeworICAgICAgImV4dHJhX2FyZ3MiOiBbIlRTaW1wbGVTZXJ2ZXIiXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicHl0aG9uMyIsCisgICAgICAgICJUZXN0U2VydmVyLnB5IiwKKyAgICAgICAgIi0tdmVyYm9zZSIsCisgICAgICAgICItLWdlbnB5ZGlyPWdlbi1weSIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDEwLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJweXRob24zIiwKKyAgICAgICAgIlRlc3RDbGllbnQucHkiLAorICAgICAgICAiLS1ob3N0PWxvY2FsaG9zdCIsCisgICAgICAgICItLWdlbnB5ZGlyPWdlbi1weSIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGkiLAorICAgICAgICAibXVsdGk6bXVsdGlhIiwKKyAgICAgICAgIm11bHRpYyIsCisgICAgICAgICJtdWx0aWM6bXVsdGlhYyIsCisgICAgICAgICJtdWx0aWoiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJ6bGliIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIiwKKyAgICAgICJiaW5hcnk6YWNjZWwiLAorICAgICAgImNvbXBhY3Q6YWNjZWxjIiwKKyAgICAgICJoZWFkZXIiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJweSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImNwcCIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiVGVzdFNlcnZlciIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIiwKKyAgICAgICAgImhlYWRlcjptdWx0aWgiLAorICAgICAgICAianNvbjptdWx0aWoiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA4LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0Q2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiLAorICAgICAgICAibXVsdGloOmhlYWRlciIsCisgICAgICAgICJtdWx0aWo6anNvbiIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgInpsaWIiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIiwKKyAgICAgICJkb21haW4iCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIsCisgICAgICAiaGVhZGVyIiwKKyAgICAgICJtdWx0aSIsCisgICAgICAibXVsdGljIiwKKyAgICAgICJtdWx0aWgiLAorICAgICAgIm11bHRpaiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogImNwcCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInJiIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJydWJ5IiwKKyAgICAgICAgIi4uL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA1LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJydWJ5IiwKKyAgICAgICAgIi4uL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIiLAorICAgICAgICAiLS0iCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiZG9tYWluIiwKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImJpbmFyeTphY2NlbCIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogInJiL2dlbi1yYiIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImNzaGFycCIsCisgICAgImVudiI6IHsKKyAgICAgICJNT05PX1BBVEgiOiAiLi4vLi4vbGliL2NzaGFycC8iCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAibW9ubyIsCisgICAgICAgICJUZXN0Q2xpZW50U2VydmVyLmV4ZSIsCisgICAgICAgICJzZXJ2ZXIiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA5LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJtb25vIiwKKyAgICAgICAgIlRlc3RDbGllbnRTZXJ2ZXIuZXhlIiwKKyAgICAgICAgImNsaWVudCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGkiLAorICAgICAgICAibXVsdGljIiwKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogImNzaGFycCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIm5ldGNvcmUiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJkb3RuZXQiLAorICAgICAgICAicnVuIiwKKyAgICAgICAgIi0tbm8tYnVpbGQiLAorICAgICAgICAiLS1wcm9qZWN0PVNlcnZlci9TZXJ2ZXIuY3Nwcm9qIiwKKyAgICAgICAgInNlcnZlciIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDEwLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJkb3RuZXQiLAorICAgICAgICAicnVuIiwKKyAgICAgICAgIi0tbm8tYnVpbGQiLAorICAgICAgICAiLS1wcm9qZWN0PUNsaWVudC9DbGllbnQuY3Nwcm9qIiwKKyAgICAgICAgImNsaWVudCIKKyAgICAgIF0KKyAgICB9LAorICAgICAgICAid29ya2RpciI6ICJuZXRjb3JlIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicGVybCIsCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiLAorICAgICAgImRvbWFpbiIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJtdWx0aSIKKyAgICBdLAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInBlcmwiLAorICAgICAgICAiLUlnZW4tcGVybC8iLAorICAgICAgICAiLUkuLi8uLi9saWIvcGVybC9saWIvIiwKKyAgICAgICAgIlRlc3RDbGllbnQucGwiLAorICAgICAgICAiLS1jYT0uLi9rZXlzL0NBLnBlbSIsCisgICAgICAgICItLWNlcnQ9Li4va2V5cy9jbGllbnQuY3J0IiwKKyAgICAgICAgIi0ta2V5PS4uL2tleXMvY2xpZW50LmtleSIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IgorICAgICAgXQorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicGVybCIsCisgICAgICAgICItSWdlbi1wZXJsLyIsCisgICAgICAgICItSS4uLy4uL2xpYi9wZXJsL2xpYi8iLAorICAgICAgICAiVGVzdFNlcnZlci5wbCIsCisgICAgICAgICItLWNlcnQ9Li4va2V5cy9zZXJ2ZXIuY3J0IiwKKyAgICAgICAgIi0ta2V5PS4uL2tleXMvc2VydmVyLmtleSIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAicGVybCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInBocCIsCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiYnVmZmVyZWQiLAorICAgICAgICAiZnJhbWVkIgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeSIsCisgICAgICAgICJjb21wYWN0IiwKKyAgICAgICAgImJpbmFyeTphY2NlbCIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInBocCIsCisgICAgICAgICItZGV4dGVuc2lvbl9kaXI9cGhwX2V4dF9kaXIiLAorICAgICAgICAiLS1waHAtaW5pPXRlc3RfcGhwLmluaSIsCisgICAgICAgICItLW5vLXBocC1pbmkiLAorICAgICAgICAiLWRkaXNwbGF5X2Vycm9ycz1zdGRlcnIiLAorICAgICAgICAiLWRsb2dfZXJyb3JzPTAiLAorICAgICAgICAiLWRlcnJvcl9yZXBvcnRpbmc9RV9BTEwiLAorICAgICAgICAiVGVzdENsaWVudC5waHAiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJwaHAiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJkYXJ0IiwKKyAgICAiY2xpZW50IjogeworICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJidWZmZXJlZCIsCisgICAgICAgICJmcmFtZWQiLAorICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnkiLAorICAgICAgICAiY29tcGFjdCIsCisgICAgICAgICJqc29uIgorICAgICAgXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZGFydCIsCisgICAgICAgICJ0ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0IgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiZGFydCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImVybCIsCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIKKyAgICBdLAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImVybCIsCisgICAgICAgICIrSyIsCisgICAgICAgICJ0cnVlIiwKKyAgICAgICAgIi1ub3NoZWxsIiwKKyAgICAgICAgIi1wYSIsCisgICAgICAgICIuLi8uLi9saWIvZXJsL2ViaW4vIiwKKyAgICAgICAgIi1wYSIsCisgICAgICAgICIuL2ViaW4iLAorICAgICAgICAiLXMiLAorICAgICAgICAidGVzdF9jbGllbnQiLAorICAgICAgICAiLXMiLAorICAgICAgICAiaW5pdCIsCisgICAgICAgICJzdG9wIiwKKyAgICAgICAgIi1leHRyYSIKKyAgICAgIF0KKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImVybCIsCisgICAgICAgICIrSyIsCisgICAgICAgICJ0cnVlIiwKKyAgICAgICAgIi1ub3NoZWxsIiwKKyAgICAgICAgIi1wYSIsCisgICAgICAgICIuLi8uLi9saWIvZXJsL2ViaW4vIiwKKyAgICAgICAgIi1wYSIsCisgICAgICAgICIuL2ViaW4iLAorICAgICAgICAiLXMiLAorICAgICAgICAidGVzdF90aHJpZnRfc2VydmVyIiwKKyAgICAgICAgIi1leHRyYSIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogImVybCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImpzIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJodHRwIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImpzb24iCisgICAgXSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJwaGFudG9tanMiLAorICAgICAgICAidGVzdC9waGFudG9tLWNsaWVudC5qcyIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9qcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImx1YSIsCisgICAgIlRPRE8iOiAiQWRkIGRsbCB0byBMVUFfQ1BBVEgiLAorICAgICJlbnYiOiB7CisgICAgICAiTFVBX1BBVEgiOiAiOztnZW4tbHVhLz8ubHVhOy4uLy4uL2xpYi9sdWEvPy5sdWEiLAorICAgICAgIkxVQV9DUEFUSCI6ICI7Oy4uLy4uL2xpYi9sdWEvLmxpYnMvPy5zbyIKKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDUsCisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICAgImZyYW1lZCIsCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeSIsCisgICAgICAgICJjb21wYWN0IiwKKyAgICAgICAgImpzb24iCisgICAgICBdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJsdWEiLAorICAgICAgICAidGVzdF9iYXNpY19jbGllbnQubHVhIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAibHVhIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicnMiLAorICAgICJlbnYiOiB7CisgICAgICAiUlVTVF9CQUNLVFJBQ0UiOiAiMSIsCisgICAgICAiUlVTVF9MT0ciOiAiaW5mbyIKKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3Rfc2VydmVyIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0X2NsaWVudCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IgorICAgICAgXQorICAgIH0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiCisgICAgXSwKKyAgICAid29ya2RpciI6ICJycy9iaW4iCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJub2RldHMiLAorICAgICJlbnYiOiB7CisgICAgICAiTk9ERV9QQVRIIjogIi4uL2xpYiIKKyAgICB9LAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1blNlcnZlci5zaCIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1bkNsaWVudC5zaCIKKyAgICAgIF0KKyAgICB9LAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9ub2RldHMvdGVzdCIKKyAgfQorXQpkaWZmIC0tZ2l0IGEvdGVzdC90aHJlYWRzL01ha2VmaWxlIGIvdGVzdC90aHJlYWRzL01ha2VmaWxlCmluZGV4IDE0ZjFhNTguLmRmNzIzOTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdGhyZWFkcy9NYWtlZmlsZQorKysgYi90ZXN0L3RocmVhZHMvTWFrZWZpbGUKQEAgLTU0LDEwICs1NCwxMCBAQAogCSQoVEhSSUZUKSAtLWdlbiBjcHAgLS1nZW4gcHkgVGhyZWFkc1Rlc3QudGhyaWZ0CiAKIHNlcnZlcjogc3R1YnMKLQlnKysgLW8gVGhyZWFkc1NlcnZlciAkKENGTCkgVGhyZWFkc1NlcnZlci5jcHAgLi9nZW4tY3BwL1RocmVhZHNUZXN0LmNwcCAuL2dlbi1jcHAvVGhyZWFkc1Rlc3RfdHlwZXMuY3BwCisJJChDQykgLW8gVGhyZWFkc1NlcnZlciAkKENGTCkgVGhyZWFkc1NlcnZlci5jcHAgLi9nZW4tY3BwL1RocmVhZHNUZXN0LmNwcCAuL2dlbi1jcHAvVGhyZWFkc1Rlc3RfdHlwZXMuY3BwCiAKIGNsaWVudDogc3R1YnMKLQlnKysgLW8gVGhyZWFkc0NsaWVudCAkKENGTCkgVGhyZWFkc0NsaWVudC5jcHAgLi9nZW4tY3BwL1RocmVhZHNUZXN0LmNwcCAuL2dlbi1jcHAvVGhyZWFkc1Rlc3RfdHlwZXMuY3BwCisJJChDQykgLW8gVGhyZWFkc0NsaWVudCAkKENGTCkgVGhyZWFkc0NsaWVudC5jcHAgLi9nZW4tY3BwL1RocmVhZHNUZXN0LmNwcCAuL2dlbi1jcHAvVGhyZWFkc1Rlc3RfdHlwZXMuY3BwCiAKIGNsZWFuOgogCSQoUk0pIC1yICoubyBUaHJlYWRzU2VydmVyIFRocmVhZHNDbGllbnQgZ2VuLWNwcCBnZW4tcHkKZGlmZiAtLWdpdCBhL3Rlc3QvdGhyZWFkcy9UaHJlYWRzQ2xpZW50LmNwcCBiL3Rlc3QvdGhyZWFkcy9UaHJlYWRzQ2xpZW50LmNwcAppbmRleCA4NTI3NGE2Li45MzA2YTNmIDEwMDY0NAotLS0gYS90ZXN0L3RocmVhZHMvVGhyZWFkc0NsaWVudC5jcHAKKysrIGIvdGVzdC90aHJlYWRzL1RocmVhZHNDbGllbnQuY3BwCkBAIC0yMSwxMyArMjEsMTYgQEAKIC8vIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LgogCiAjaW5jbHVkZSAiVGhyZWFkc1Rlc3QuaCIKLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaWYgX1dJTjMyCisgICAjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgogCiB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKQEAgLTM3LDYgKzQwLDkgQEAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgogICBpbnQgcG9ydCA9IDkwOTA7CiAgIHN0ZDo6c3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKIApkaWZmIC0tZ2l0IGEvdGVzdC90aHJlYWRzL1RocmVhZHNTZXJ2ZXIuY3BwIGIvdGVzdC90aHJlYWRzL1RocmVhZHNTZXJ2ZXIuY3BwCmluZGV4IDg3MzRlZTguLmEyNjdjM2IgMTAwNjQ0Ci0tLSBhL3Rlc3QvdGhyZWFkcy9UaHJlYWRzU2VydmVyLmNwcAorKysgYi90ZXN0L3RocmVhZHMvVGhyZWFkc1NlcnZlci5jcHAKQEAgLTIxLDE0ICsyMSwxNyBAQAogLy8gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIgZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQuCiAKICNpbmNsdWRlICJUaHJlYWRzVGVzdC5oIgotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpZiBfV0lOMzIKKyAgICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCiAKIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwpAQCAtODUsMTEgKzg4LDEyIEBACiBwcm90ZWN0ZWQ6CiAgIHZvaWQgZ28yc2xlZXAoaW50IHRocmVhZCwgaW50IHNlY29uZHMpIHsKICAgICBNb25pdG9yIG07CisgICAgU3luY2hyb25pemVkIHMobSk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyArK2kpIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkICVkOiBzbGVlcCAlZFxuIiwgdGhyZWFkLCBpKTsKICAgICAgIHRyeSB7CiAgICAgICAgIG0ud2FpdCgxMDAwKTsKLSAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKKyAgICAgIH0gY2F0Y2goY29uc3QgVGltZWRPdXRFeGNlcHRpb24mKSB7CiAgICAgICB9CiAgICAgfQogICAgIGZwcmludGYoc3RkZXJyLCAiVEhSRUFEICVkIERPTkVcbiIsIHRocmVhZCk7CkBAIC0xMDEsNiArMTA1LDkgQEAKIH07CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgogICBpbnQgcG9ydCA9IDkwOTA7CiAgIHNoYXJlZF9wdHI8VGhyZWFkc1Rlc3RIYW5kbGVyPiBoYW5kbGVyKG5ldyBUaHJlYWRzVGVzdEhhbmRsZXIoKSk7CiAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBUaHJlYWRzVGVzdFByb2Nlc3NvcihoYW5kbGVyKSk7CkBAIC0xMTEsOCArMTE4LDggQEAKICAgLyoKICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KICAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDEwKTsKLSAgc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPQotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOworICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9CisgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MgYi90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTdjYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzCkBAIC0wLDAgKzEsNTMgQEAKK3sKKyAgIGJvb3N0L2dldF9vbmNlX3Blcl90aHJlYWRfZXBvY2gvaWdub3JlCisgICBNZW1jaGVjazpMZWFrCisgICBtYXRjaC1sZWFrLWtpbmRzOiByZWFjaGFibGUKKyAgIGZ1bjptYWxsb2MKKyAgIGZ1bjpfWk41Ym9vc3Q2ZGV0YWlsMjVnZXRfb25jZV9wZXJfdGhyZWFkX2Vwb2NoRXYKK30KK3sKKyAgIGJvb3N0dGhyZWFkcy9vbmNlL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOl9aTjVib29zdDEzdGhyZWFkX2RldGFpbDE3ZW50ZXJfb25jZV9yZWdpb25FUk5TXzlvbmNlX2ZsYWdFCisgICBmdW46X1pONWJvb3N0NmRldGFpbDIzZ2V0X2N1cnJlbnRfdGhyZWFkX2RhdGFFdgorICAgZnVuOl9aTjVib29zdDZkZXRhaWwyMGludGVycnVwdGlvbl9jaGVja2VyQzFFUDE1cHRocmVhZF9tdXRleF90UDE0cHRocmVhZF9jb25kX3QKKyAgIGZ1bjpfWk41Ym9vc3QyMmNvbmRpdGlvbl92YXJpYWJsZV9hbnk0d2FpdElOU18xMXVuaXF1ZV9sb2NrSU5TXzExdGltZWRfbXV0ZXhFRUVFRXZSVF8KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjRJbXBsMTF3YWl0Rm9yZXZlckV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDE5d2FpdEZvclRpbWVSZWxhdGl2ZUVsCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDR3YWl0RWwKKyAgIGZ1bjpfWk5LNmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0d2FpdEVsCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTFCb29zdFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQoreworICAgcHRocmVhZC9jcmVhdGlvbi10bHMvaWdub3JlCisgICBIZWxncmluZDpSYWNlCisgICBmdW46bWVtcGNweQorICAgZnVuOl9kbF9hbGxvY2F0ZV90bHNfaW5pdAorICAgZnVuOmdldF9jYWNoZWRfc3RhY2sKKyAgIGZ1bjphbGxvY2F0ZV9zdGFjaworICAgZnVuOnB0aHJlYWRfY3JlYXRlQEBHTElCQ18yLjIqCisgICBvYmo6L3Vzci9saWIvdmFsZ3JpbmQvdmdwcmVsb2FkX2hlbGdyaW5kLWFtZDY0LWxpbnV4LnNvCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTNQdGhyZWFkVGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9Cit7CisgICBib29zdC10aHJlYWQvY3JlYXRpb24tdGxzL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOm1lbXBjcHkKKyAgIGZ1bjpfZGxfYWxsb2NhdGVfdGxzX2luaXQKKyAgIGZ1bjpnZXRfY2FjaGVkX3N0YWNrCisgICBmdW46YWxsb2NhdGVfc3RhY2sKKyAgIGZ1bjpwdGhyZWFkX2NyZWF0ZUBAR0xJQkNfMi4yLjUKKyAgIG9iajovdXNyL2xpYi92YWxncmluZC92Z3ByZWxvYWRfaGVsZ3JpbmQtYW1kNjQtbGludXguc28KKyAgIGZ1bjpfWk41Ym9vc3Q2dGhyZWFkMjFzdGFydF90aHJlYWRfbm9leGNlcHRFdgorICAgZnVuOl9aTjVib29zdDZ0aHJlYWQxMnN0YXJ0X3RocmVhZEV2CisgICBmdW46X1pONWJvb3N0NnRocmVhZEMxSVN0NV9CaW5kSUZQRlB2UzNfRVMzX0VFRUVPVF8KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3kxMUJvb3N0VGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9CisKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDk5NDYwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0KKworaWYgTUlOR1cKKyMgZG8gbm90aGluZywganVzdCBidWlsZCB0aGUgY29tcGlsZXIKK2Vsc2UKKworaWYgV0lUSF9DX0dMSUIKK1NVQkRJUlMgKz0gY19nbGliCitlbmRpZgorCitpZiBXSVRIX0NQUAorU1VCRElSUyArPSBjcHAKK2VuZGlmCisKK2lmIFdJVEhfRAorU1VCRElSUyArPSBkCitlbmRpZgorCitpZiBXSVRIX0pBVkEKK1NVQkRJUlMgKz0gamF2YQorU1VCRElSUyArPSBqcworZW5kaWYKKworaWYgV0lUSF9QWVRIT04KK1NVQkRJUlMgKz0gcHkKK1NVQkRJUlMgKz0gcHkudHdpc3RlZAorU1VCRElSUyArPSBweS50b3JuYWRvCitlbmRpZgorCitpZiBXSVRIX1JVQlkKK1NVQkRJUlMgKz0gcmIKK2VuZGlmCisKK2lmIFdJVEhfSEFTS0VMTAorU1VCRElSUyArPSBocworZW5kaWYKKworaWYgV0lUSF9IQVhFCitTVUJESVJTICs9IGhheGUKK2VuZGlmCisKK2lmIFdJVEhfRE9UTkVUQ09SRQorU1VCRElSUyArPSBuZXRjb3JlCitlbmRpZgorCitpZiBXSVRIX0dPCitTVUJESVJTICs9IGdvCitlbmRpZgorCitpZiBXSVRIX05PREVKUworU1VCRElSUyArPSBub2RlanMKK2VuZGlmCisKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitlbmRpZgorCitpZiBXSVRIX1JTCitTVUJESVJTICs9IHJzCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitlbmRpZgorCisjCisjIGdlbmVyYXRlIGh0bWwgZm9yIFRocmlmdFRlc3QudGhyaWZ0CisjCithbGwtbG9jYWw6CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHRtbCAtciAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCitjbGVhbi1sb2NhbDoKKwlybSAtcmYgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC9nZW4taHRtbAorCitlbmRpZgorCisjIEFueSBmb2xkZXJzIG9yIGZpbGVzIG5vdCBsaXN0ZWQgYWJvdmUgYmVpbmcgYWRkZWQgdG8gU1VCRElSIG5lZWQgdG8gYmUgcGxhY2VkIGhlcmUgaW4KKyMgRVhUUkFfRElTVCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVsZWFzZQorRVhUUkFfRElTVCA9IFwKKwlhczMgXAorCWNzaGFycCBcCisJZCBcCisJZGVscGhpIFwKKwllcmwgXAorCWhzIFwKKwlvY2FtbCBcCisJcGVybCBcCisJcGhwIFwKKwlzaGFyZWQudGhyaWZ0IFwKKwl0dXRvcmlhbC50aHJpZnQgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvUkVBRE1FIGIvdHV0b3JpYWwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjlmOTc3Li4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLVRocmlmdCBUdXRvcmlhbAotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UdXRvcmlhbAotPT09PT09PT0KLQotMSkgRmlyc3QgdGhpbmdzIGZpcnN0LCB5b3UnbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgYW5kIHRoZQotICAgbGFuZ3VhZ2UgbGlicmFyaWVzLiBEbyB0aGF0IHVzaW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHRvcCBsZXZlbAotICAgUkVBRE1FIGZpbGUuCi0KLTIpIFJlYWQgdHV0b3JpYWwudGhyaWZ0IHRvIGxlYXJuIGFib3V0IHRoZSBzeW50YXggb2YgYSBUaHJpZnQgZmlsZQotCi0zKSBDb21waWxlIHRoZSBjb2RlIGZvciB0aGUgbGFuZ3VhZ2Ugb2YgeW91ciBjaG9pY2U6Ci0KLSAgICAgJCB0aHJpZnQKLSAgICAgJCB0aHJpZnQgLXIgLS1nZW4gY3BwIHR1dG9yaWFsLnRocmlmdAotCi00KSBUYWtlIGEgbG9vayBhdCB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0KLTUpIExvb2sgaW4gdGhlIGxhbmd1YWdlIGRpcmVjdG9yaWVzIGZvciBzYW1wbGUgY2xpZW50L3NlcnZlciBjb2RlLgotCi02KSBUaGF0J3MgYWJvdXQgaXQgZm9yIG5vdy4gVGhpcyB0dXRvcmlhbCBpcyBpbnRlbnRpb25hbGx5IGJyaWVmLiBJdCBzaG91bGQgYmUKLSAgIGp1c3QgZW5vdWdoIHRvIGdldCB5b3Ugc3RhcnRlZCBhbmQgcmVhZHkgdG8gYnVpbGQgeW91ciBvd24gcHJvamVjdC4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL1JFQURNRS5tZCBiL3R1dG9yaWFsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzcyYmYzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDIgQEAKK1RocmlmdCBUdXRvcmlhbAorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitUdXRvcmlhbAorPT09PT09PT0KKworMSkgRmlyc3QgdGhpbmdzIGZpcnN0LCB5b3UnbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgYW5kIHRoZQorICAgbGFuZ3VhZ2UgbGlicmFyaWVzLiBEbyB0aGF0IHVzaW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHRvcCBsZXZlbAorICAgUkVBRE1FLm1kIGZpbGUuCisKKzIpIFJlYWQgdHV0b3JpYWwudGhyaWZ0IHRvIGxlYXJuIGFib3V0IHRoZSBzeW50YXggb2YgYSBUaHJpZnQgZmlsZQorCiszKSBDb21waWxlIHRoZSBjb2RlIGZvciB0aGUgbGFuZ3VhZ2Ugb2YgeW91ciBjaG9pY2U6CisKKyAgICAgJCB0aHJpZnQKKyAgICAgJCB0aHJpZnQgLXIgLS1nZW4gY3BwIHR1dG9yaWFsLnRocmlmdAorCis0KSBUYWtlIGEgbG9vayBhdCB0aGUgZ2VuZXJhdGVkIGNvZGUuCisKKzUpIExvb2sgaW4gdGhlIGxhbmd1YWdlIGRpcmVjdG9yaWVzIGZvciBzYW1wbGUgY2xpZW50L3NlcnZlciBjb2RlLgorCis2KSBUaGF0J3MgYWJvdXQgaXQgZm9yIG5vdy4gVGhpcyB0dXRvcmlhbCBpcyBpbnRlbnRpb25hbGx5IGJyaWVmLiBJdCBzaG91bGQgYmUKKyAgIGp1c3QgZW5vdWdoIHRvIGdldCB5b3Ugc3RhcnRlZCBhbmQgcmVhZHkgdG8gYnVpbGQgeW91ciBvd24gcHJvamVjdC4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2FzMy9idWlsZC54bWwgYi90dXRvcmlhbC9hczMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWQzMmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9hczMvYnVpbGQueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzxwcm9qZWN0IG5hbWU9InR1dG9yaWFsIiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIj4KKworICA8ZGVzY3JpcHRpb24+VGhyaWZ0IGFjdGlvbnNjcmlwdCAzLjAgdHV0b3JpYWwuPC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iZ2VuLWFzMyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249InNyYyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5zcmMiIGxvY2F0aW9uPSIuLi8uLi9saWIvYXMzL3NyYy8iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0IiBsb2NhdGlvbj0iZGlzdCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9ImFzMy10dXRvcmlhbCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InN3Zi5uYW1lIiB2YWx1ZT0iJHtkaXN0fS8ke2ZpbmFsLm5hbWV9LnN3ZiIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImZsZXguY2hlY2siIHVubGVzcz0iRkxFWF9IT01FIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSdZb3UgbXVzdCBzZXQgdGhlIEZMRVhfSE9NRSBwcm9wZXJ0eSBwb2ludGluZyB0byB5b3VyIGZsZXggU0RLLCBlZy4gYW50IC1ERkxFWF9IT01FPSIvQXBwbGljYXRpb25zL0Fkb2JlIEZsZXggQnVpbGRlciAzL3Nka3MvMy4yLjAiJy8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmxleC5pbml0IiBkZXBlbmRzPSJmbGV4LmNoZWNrIiB1bmxlc3M9ImZsZXguZmluaXNoZWQiPgorICAgIDx0YXNrZGVmIHJlc291cmNlPSJmbGV4VGFza3MudGFza3MiIGNsYXNzcGF0aD0iJHtGTEVYX0hPTUV9L2FudC9saWIvZmxleFRhc2tzLmphciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZmxleC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8dHN0YW1wIC8+CisgICAgPG1rZGlyIGRpcj0iJHtkaXN0fSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImdlbmVyYXRlLCBmbGV4LmluaXQsIGluaXQiPgorICAgIDxteG1sYyBvdXRwdXQ9IiR7c3dmLm5hbWV9IiBmaWxlPSIke3NyY30vQ2FsY3VsYXRvclVJLmFzIj4KKyAgICAgIDxzb3VyY2UtcGF0aCBwYXRoLWVsZW1lbnQ9IiR7Z2VufSIgLz4KKyAgICAgIDxzb3VyY2UtcGF0aCBwYXRoLWVsZW1lbnQ9IiR7c3JjfSIgLz4KKyAgICAgIDxzb3VyY2UtcGF0aCBwYXRoLWVsZW1lbnQ9IiR7dGhyaWZ0LnNyY30iIC8+CisgICAgPC9teG1sYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CisgICAgPCEtLSBHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhIHNvdXJjZSAtLT4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGFzMyAuLi9zaGFyZWQudGhyaWZ0Ii8+CisgICAgPC9leGVjPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4gYXMzIC4uL3R1dG9yaWFsLnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VufSIvPgorICAgIDxkZWxldGUgZGlyPSIke2Rpc3R9IiAvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvYXMzL3NyYy9DYWxjdWxhdG9yVUkuYXMgYi90dXRvcmlhbC9hczMvc3JjL0NhbGN1bGF0b3JVSS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk2ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvYXMzL3NyYy9DYWxjdWxhdG9yVUkuYXMKQEAgLTAsMCArMSwxNDIgQEAKK3BhY2thZ2UgeworICBpbXBvcnQgZmxhc2guZGlzcGxheS5TcHJpdGU7CisgIGltcG9ydCBmbGFzaC50ZXh0LlRleHRGaWVsZDsKKyAgaW1wb3J0IGZsYXNoLnRleHQuVGV4dEZpZWxkVHlwZTsKKyAgaW1wb3J0IGZsYXNoLmV2ZW50cy5Nb3VzZUV2ZW50OworICBpbXBvcnQgZmxhc2guc3lzdGVtLlNlY3VyaXR5OworCisgIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKKyAgaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworICBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworICBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworCisgIC8qKgorICAgKiBTaW1wbGUgaW50ZXJmYWNlIGFuZCBjb25uZWN0aW9uIGxvZ2ljIGltcGxlbWVudGF0aW9uIGZvciB0dXRvcmlhbC4KKyAgICovCisgIHB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yVUkgZXh0ZW5kcyBTcHJpdGUgeworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgQlVUVE9OX1BBRERJTkc6dWludCA9IDU7CisKKyAgICBwcml2YXRlIHZhciBtQ2FsY3VsYXRvckNsaWVudDpDYWxjdWxhdG9yOyAvLyB3ZSB1c2UgY2FsY3VsYXRvciB0aHJvdWdoIGludGVyZmFjZQorICAgIHByaXZhdGUgdmFyIG1UcmFuc3BvcnQ6VFRyYW5zcG9ydDsgLy8gVHJhbnNwb3J0LCB1c2VkIHRvIGNvbXVuaWNhdGUgd2l0aCBzZXJ2ZXIKKworICAgIHByaXZhdGUgdmFyIG1BZGRCdXR0b246U3ByaXRlOworICAgIHByaXZhdGUgdmFyIG1MZWZ0OlRleHRGaWVsZDsKKyAgICBwcml2YXRlIHZhciBtUmlnaHQ6VGV4dEZpZWxkOworICAgIHByaXZhdGUgdmFyIG1SZXN1bHQ6VGV4dEZpZWxkOworCisgICAgcHJpdmF0ZSB2YXIgcGluZ0J1dHRvbjpTcHJpdGU7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gQ2FsY3VsYXRvclVJKCkgeworICAgICAgYnVpbGRJbnRlcmZhY2UoKTsKKyAgICAgIGluaXRTZWN1cml0eSgpOworICAgICAgaW5pdENvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGluaXRTZWN1cml0eSgpOnZvaWQgeworICAgICAgU2VjdXJpdHkubG9hZFBvbGljeUZpbGUoInhtbHNvY2tldDovLzEyNy4wLjAuMTo5MDkyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhhbXBsZSBvZiBpbml0aWFsaXppbmcgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGluaXRDb25uZWN0aW9uKCk6dm9pZCB7CisgICAgICBtVHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIDkwOTApOyAvLyB3ZSBjb25uZWN0IHRvIHNlcnZlcgorICAgICAgbVRyYW5zcG9ydC5vcGVuKCk7CisgICAgICAvLyBpbml0aWFsaXplIHByb3RvY29sOgorICAgICAgdmFyIHByb3RvY29sOlRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wobVRyYW5zcG9ydCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIG1DYWxjdWxhdG9yQ2xpZW50ID0gbmV3IENhbGN1bGF0b3JJbXBsKHByb3RvY29sKTsgLy8gZmluYWxseSwgd2UgY3JlYXRlIGNhbGN1bGF0b3IgY2xpZW50IGluc3RhbmNlCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBvblBpbmdDbGljayhtZTpNb3VzZUV2ZW50KTp2b2lkIHsKKyAgICAgIGlmKCFtVHJhbnNwb3J0LmlzT3BlbigpKSByZXR1cm47CisgICAgICBtQ2FsY3VsYXRvckNsaWVudC5waW5nKG9uUGluZ0Vycm9yLCBvblBpbmdTdWNjZXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIG9uUGluZ0Vycm9yKGVycm9yOkVycm9yKTp2b2lkIHsKKyAgICAgIHRyYWNlKCJFcnJvciwgd2hpbGUgcmVxdWVzdGluZyBwaW5nLiIpOworICAgICAgdGhyb3cgZXJyb3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBvblBpbmdTdWNjZXNzKCk6dm9pZCB7CisgICAgICB0cmFjZSgiUGluZyByZXR1cm5lZCBzdWNjZXNzZnVsbHkiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIG9uQWRkQ2xpY2sobWU6TW91c2VFdmVudCk6dm9pZCB7CisgICAgICBpZighbVRyYW5zcG9ydC5pc09wZW4oKSkgcmV0dXJuOworICAgICAgdmFyIG51bTE6TnVtYmVyID0gTnVtYmVyKG1MZWZ0LnRleHQpOworICAgICAgdmFyIG51bTI6TnVtYmVyID0gTnVtYmVyKG1SaWdodC50ZXh0KTsKKyAgICAgIG1SZXN1bHQudGV4dCA9ICJQcm9jZXNzaW5nLi4uIjsKKyAgICAgIG1DYWxjdWxhdG9yQ2xpZW50LmFkZChudW0xLCBudW0yLCBvbkFkZEVycm9yLCBvbkFkZFN1Y2Nlc3MpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gb25BZGRFcnJvcihlcnJvcjpFcnJvcik6dm9pZCB7CisgICAgICB0cmFjZSgiRXJyb3IsIHdoaWxlIHJlcXVlc3RpbmcgYWRkLiIpOworICAgICAgdGhyb3cgZXJyb3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBvbkFkZFN1Y2Nlc3MocmVzOk51bWJlcik6dm9pZCB7CisgICAgICBtUmVzdWx0LnRleHQgPSBTdHJpbmcocmVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkSW50ZXJmYWNlKCk6dm9pZCB7CisgICAgICBhZGRDaGlsZChwaW5nQnV0dG9uID0gYnVpbGRCdXR0b24oIlBJTkciKSk7CisgICAgICBwaW5nQnV0dG9uLnggPSAoc3RhZ2Uuc3RhZ2VXaWR0aCAtIHBpbmdCdXR0b24ud2lkdGgpIC8gMjsKKyAgICAgIHBpbmdCdXR0b24ueSA9IDEwOworICAgICAgcGluZ0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKE1vdXNlRXZlbnQuQ0xJQ0ssIG9uUGluZ0NsaWNrKTsKKworICAgICAgdmFyIHRvcDpOdW1iZXIgPSBwaW5nQnV0dG9uLnkgKyBwaW5nQnV0dG9uLmhlaWdodCArIDIwOworICAgICAgYWRkQ2hpbGQobUxlZnQgPSBidWlsZERpZ2l0SW5wdXQoKSk7CisgICAgICBtTGVmdC54ID0gMTU7CisgICAgICBtTGVmdC55ID0gdG9wICsgQlVUVE9OX1BBRERJTkc7CisgICAgICBhZGRDaGlsZChtUmlnaHQgPSBidWlsZERpZ2l0SW5wdXQoKSk7CisgICAgICBtUmlnaHQueCA9IG1MZWZ0LnggKyBtTGVmdC53aWR0aCArIDE1OworICAgICAgbVJpZ2h0LnkgPSB0b3AgKyBCVVRUT05fUEFERElORzsKKyAgICAgIGFkZENoaWxkKG1BZGRCdXR0b24gPSBidWlsZEJ1dHRvbigiQUREIikpOworICAgICAgbUFkZEJ1dHRvbi54ID0gbVJpZ2h0LnggKyBtUmlnaHQud2lkdGggKyAxNTsKKyAgICAgIG1BZGRCdXR0b24ueSA9IHRvcDsKKyAgICAgIG1BZGRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihNb3VzZUV2ZW50LkNMSUNLLCBvbkFkZENsaWNrKTsKKyAgICAgIGFkZENoaWxkKG1SZXN1bHQgPSBidWlsZERpZ2l0SW5wdXQoKSk7CisgICAgICBtUmVzdWx0LnggPSBtQWRkQnV0dG9uLnggKyBtQWRkQnV0dG9uLndpZHRoICsgMTU7CisgICAgICBtUmVzdWx0LnkgPSB0b3AgKyBCVVRUT05fUEFERElORzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgZGlnaXQtb25seSBpbnB1dCBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkRGlnaXRJbnB1dCgpOlRleHRGaWVsZCB7CisgICAgICB2YXIgdGV4dEZpZWxkOlRleHRGaWVsZCA9IG5ldyBUZXh0RmllbGQ7CisgICAgICB0ZXh0RmllbGQud2lkdGggPSA3NTsKKyAgICAgIHRleHRGaWVsZC5oZWlnaHQgPSAyMDsKKyAgICAgIHRleHRGaWVsZC5yZXN0cmljdCA9ICIwOTg3NjU0MzIxLiI7CisgICAgICB0ZXh0RmllbGQudHlwZSA9IFRleHRGaWVsZFR5cGUuSU5QVVQ7CisgICAgICB0ZXh0RmllbGQuYmFja2dyb3VuZCA9IHRydWU7CisgICAgICB0ZXh0RmllbGQuYmFja2dyb3VuZENvbG9yID0gMHhhYWFhZmY7CisgICAgICB0ZXh0RmllbGQudGV4dENvbG9yID0gMHhmZmZmMDA7CisgICAgICByZXR1cm4gdGV4dEZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBidXR0b24gZHJhd2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkQnV0dG9uKHRleHQ6U3RyaW5nKTpTcHJpdGUgeworICAgICAgdmFyIGJ1dHRvbjpTcHJpdGUgPSBuZXcgU3ByaXRlOworICAgICAgdmFyIHRleHRGaWVsZDpUZXh0RmllbGQgPSBuZXcgVGV4dEZpZWxkOworICAgICAgdGV4dEZpZWxkLndpZHRoID0gNDAwMDsKKyAgICAgIHRleHRGaWVsZC50ZXh0ID0gdGV4dDsKKyAgICAgIHRleHRGaWVsZC50ZXh0Q29sb3IgPSAweGZmZmYwMDsKKyAgICAgIHRleHRGaWVsZC53aWR0aCA9IHRleHRGaWVsZC50ZXh0V2lkdGggKyA0OworICAgICAgdGV4dEZpZWxkLmhlaWdodCA9IHRleHRGaWVsZC50ZXh0SGVpZ2h0ICsgNDsKKyAgICAgIHRleHRGaWVsZC5tb3VzZUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgIGJ1dHRvbi5ncmFwaGljcy5iZWdpbkZpbGwoMHgwMDAwZmYpOworICAgICAgYnV0dG9uLmdyYXBoaWNzLmxpbmVTdHlsZSgwLCAweDAwMDAwMCk7CisgICAgICBidXR0b24uZ3JhcGhpY3MuZHJhd1JvdW5kUmVjdCgwLCAwLCB0ZXh0RmllbGQud2lkdGggKyBCVVRUT05fUEFERElORyAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmllbGQuaGVpZ2h0ICsgQlVUVE9OX1BBRERJTkcgKiAyLCBCVVRUT05fUEFERElORyk7CisgICAgICBidXR0b24uZ3JhcGhpY3MuZW5kRmlsbCgpOworICAgICAgYnV0dG9uLmFkZENoaWxkKHRleHRGaWVsZCk7CisgICAgICB0ZXh0RmllbGQueCA9IEJVVFRPTl9QQURESU5HOworICAgICAgdGV4dEZpZWxkLnkgPSBCVVRUT05fUEFERElORzsKKyAgICAgIGJ1dHRvbi51c2VIYW5kQ3Vyc29yID0gYnV0dG9uLmJ1dHRvbk1vZGUgPSB0cnVlOworICAgICAgcmV0dXJuIGJ1dHRvbjsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZGJlNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cworCitCVUlMVF9TT1VSQ0VTID0gXAorCWdlbi1jX2dsaWIvY2FsY3VsYXRvci5oIFwKKwlnZW4tY19nbGliL3NoYXJlZF9zZXJ2aWNlLmggXAorCWdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmggXAorCWdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuaAorCitBTV9DRkxBR1MgPSAtZyAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIEBHQ09WX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2xpYi9jX2dsaWIvc3JjIC1JZ2VuLWNfZ2xpYgorQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKSBAR0NPVl9MREZMQUdTQAorCitub2luc3RfTFRMSUJSQVJJRVMgPSBcCisJbGlidHV0b3JpYWxnZW5jZ2xpYi5sYQorCitub2Rpc3RfbGlidHV0b3JpYWxnZW5jZ2xpYl9sYV9TT1VSQ0VTID0gXAorCWdlbi1jX2dsaWIvY2FsY3VsYXRvci5jIFwKKwlnZW4tY19nbGliL2NhbGN1bGF0b3IuaCBcCisJZ2VuLWNfZ2xpYi9zaGFyZWRfc2VydmljZS5jIFwKKwlnZW4tY19nbGliL3NoYXJlZF9zZXJ2aWNlLmggXAorCWdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmMgXAorCWdlbi1jX2dsaWIvc2hhcmVkX3R5cGVzLmggXAorCWdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuYyBcCisJZ2VuLWNfZ2xpYi90dXRvcmlhbF90eXBlcy5oCisKK2xpYnR1dG9yaWFsZ2VuY2dsaWJfbGFfTElCQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL2xpYnRocmlmdF9jX2dsaWIubGEKKworbGlidHV0b3JpYWxnZW5jZ2xpYl9sYV9DRkxBR1MgPSBcCisJJChBTV9DRkxBR1MpIC1Xbm8tdW51c2VkLWZ1bmN0aW9uCisKK25vaW5zdF9QUk9HUkFNUyA9IFwKKwl0dXRvcmlhbF9zZXJ2ZXIgXAorCXR1dG9yaWFsX2NsaWVudAorCit0dXRvcmlhbF9zZXJ2ZXJfU09VUkNFUyA9IFwKKwljX2dsaWJfc2VydmVyLmMKK3R1dG9yaWFsX3NlcnZlcl9MREZMQUdTID0gJChPUEVOU1NMX0xJQlMpCisKK3R1dG9yaWFsX3NlcnZlcl9MREFERCA9IFwKKwlsaWJ0dXRvcmlhbGdlbmNnbGliLmxhIFwKKwkkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCisKK3R1dG9yaWFsX2NsaWVudF9TT1VSQ0VTID0gXAorCWNfZ2xpYl9jbGllbnQuYworCit0dXRvcmlhbF9jbGllbnRfTERBREQgPSBcCisJbGlidHV0b3JpYWxnZW5jZ2xpYi5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYi5sYQorCisKK2dlbi1jX2dsaWIvY2FsY3VsYXRvci5jIGdlbi1jX2dsaWIvY2FsY3VsYXRvci5oIGdlbi1jX2dsaWIvc2hhcmVkX3NlcnZpY2UuYyBnZW4tY19nbGliL3NoYXJlZF9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi9zaGFyZWRfdHlwZXMuYyBnZW4tY19nbGliL3NoYXJlZF90eXBlcy5oIGdlbi1jX2dsaWIvdHV0b3JpYWxfdHlwZXMuYyBnZW4tY19nbGliL3R1dG9yaWFsX3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAtciAkPAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBnZW4tY19nbGliLyoKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCS4vdHV0b3JpYWxfc2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkuL3R1dG9yaWFsX2NsaWVudAorCitFWFRSQV9ESVNUID0gXAorCWNfZ2xpYl9zZXJ2ZXIuYyBcCisJY19nbGliX2NsaWVudC5jCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jX2dsaWIvY19nbGliX2NsaWVudC5jIGIvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9jbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODZkNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9jbGllbnQuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKworI2luY2x1ZGUgImdlbi1jX2dsaWIvY2FsY3VsYXRvci5oIgorCitpbnQgbWFpbiAodm9pZCkKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQ7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2w7CisgIENhbGN1bGF0b3JJZiAqY2xpZW50OworCisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBJbnZhbGlkT3BlcmF0aW9uICppbnZhbGlkX29wZXJhdGlvbiA9IE5VTEw7CisKKyAgV29yayAqd29yazsKKworICBnaW50MzIgc3VtOworICBnaW50MzIgZGlmZjsKKworICBpbnQgZXhpdF9zdGF0dXMgPSAwOworCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBzb2NrZXQgICAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCAgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAgICAgIDkwOTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHByb3RvY29sICA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcik7CisKKworICAvKiBJbiB0aGUgQyAoR0xpYikgaW1wbGVtZW50YXRpb24gb2YgVGhyaWZ0LCBzZXJ2aWNlIG1ldGhvZHMgb24gdGhlCisgICAgIHNlcnZlciBhcmUgYWNjZXNzZWQgdmlhIGEgZ2VuZXJhdGVkIGNsaWVudCBjbGFzcyB0aGF0IGltcGxlbWVudHMKKyAgICAgdGhlIHNlcnZpY2UgaW50ZXJmYWNlLiBJbiB0aGlzIHR1dG9yaWFsLCB3ZSBhY2Nlc3MgYSBDYWxjdWxhdG9yCisgICAgIHNlcnZpY2UgdGhyb3VnaCBhbiBpbnN0YW5jZSBvZiBDYWxjdWxhdG9yQ2xpZW50LCB3aGljaCBpbXBsZW1lbnRzCisgICAgIENhbGN1bGF0b3JJZi4gKi8KKyAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUWVBFX0NBTENVTEFUT1JfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICBwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogRWFjaCBvZiB0aGUgY2xpZW50IG1ldGhvZHMgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIHBhcmFtZXRlcnM6IEEKKyAgICAgcG9pbnRlciB0byB0aGUgY2xpZW50LWludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiAodGhlIGNsaWVudAorICAgICBvYmplY3QpLCBhbmQgYSBoYW5kbGUgdG8gYSBHRXJyb3Igc3RydWN0dXJlIHRvIHJlY2VpdmUKKyAgICAgaW5mb3JtYXRpb24gYWJvdXQgYW55IGVycm9yIHRoYXQgb2NjdXJzLgorCisgICAgIE9uIHN1Y2Nlc3MsIGNsaWVudCBtZXRob2RzIHJldHVybiBUUlVFLiBBIHJldHVybiB2YWx1ZSBvZiBGQUxTRQorICAgICBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQgYW5kIHRoZSBlcnJvciBwYXJhbWV0ZXIgaGFzIGJlZW4KKyAgICAgc2V0LiAqLworICBpZiAoIWVycm9yICYmIGNhbGN1bGF0b3JfaWZfcGluZyAoY2xpZW50LCAmZXJyb3IpKSB7CisgICAgcHV0cyAoInBpbmcoKSIpOworICB9CisKKyAgLyogU2VydmljZSBtZXRob2RzIHRoYXQgcmV0dXJuIGEgdmFsdWUgZG8gc28gYnkgcGFzc2luZyB0aGUgcmVzdWx0CisgICAgIGJhY2sgdmlhIGFuIG91dHB1dCBwYXJhbWV0ZXIgKGhlcmUsICJzdW0iKS4gKi8KKyAgaWYgKCFlcnJvciAmJiBjYWxjdWxhdG9yX2lmX2FkZCAoY2xpZW50LCAmc3VtLCAxLCAxLCAmZXJyb3IpKSB7CisgICAgcHJpbnRmICgiMSsxPSVkXG4iLCBzdW0pOworICB9CisKKyAgLyogVGhyaWZ0IHN0cnVjdHMgYXJlIGltcGxlbWVudGVkIGFzIEdPYmplY3RzLCB3aXRoIGVhY2ggb2YgdGhlCisgICAgIHN0cnVjdCdzIG1lbWJlcnMgZXhwb3NlZCBhcyBhbiBvYmplY3QgcHJvcGVydHkuICovCisgIHdvcmsgPSBnX29iamVjdF9uZXcgKFRZUEVfV09SSywgTlVMTCk7CisKKyAgaWYgKCFlcnJvcikgeworICAgIGdfb2JqZWN0X3NldCAod29yaywKKyAgICAgICAgICAgICAgICAgICJudW0xIiwgMSwKKyAgICAgICAgICAgICAgICAgICJudW0yIiwgMCwKKyAgICAgICAgICAgICAgICAgICJvcCIsICAgT1BFUkFUSU9OX0RJVklERSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgLyogRXhjZXB0aW9ucyBhcmUgcGFzc2VkIGJhY2sgZnJvbSBzZXJ2aWNlIG1ldGhvZHMgaW4gYSBtYW5uZXIKKyAgICAgICBzaW1pbGFyIHRvIHJldHVybiB2YWx1ZXMuICovCisgICAgaWYgKGNhbGN1bGF0b3JfaWZfY2FsY3VsYXRlIChjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW52YWxpZF9vcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICBwdXRzICgiV2hvYT8gV2UgY2FuIGRpdmlkZSBieSB6ZXJvISIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChpbnZhbGlkX29wZXJhdGlvbikgeworICAgICAgICBnY2hhciAqd2h5OworCisgICAgICAgIC8qIExpa2Ugc3RydWN0cywgZXhjZXB0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgb2JqZWN0cyB3aXRoCisgICAgICAgICAgIHByb3BlcnRpZXMuICovCisgICAgICAgIGdfb2JqZWN0X2dldCAoaW52YWxpZF9vcGVyYXRpb24sICJ3aHkiLCAmd2h5LCBOVUxMKTsKKworICAgICAgICBwcmludGYgKCJJbnZhbGlkT3BlcmF0aW9uOiAlc1xuIiwgd2h5KTsKKworICAgICAgICBpZiAod2h5ICE9IE5VTEwpCisgICAgICAgICAgZ19mcmVlICh3aHkpOworICAgICAgICBnX29iamVjdF91bnJlZiAoaW52YWxpZF9vcGVyYXRpb24pOworICAgICAgICBpbnZhbGlkX29wZXJhdGlvbiA9IE5VTEw7CisgICAgICB9CisKKyAgICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICAgfQorICB9CisKKyAgaWYgKCFlcnJvcikgeworICAgIC8qIFN0cnVjdCBvYmplY3RzIGNhbiBiZSByZXVzZWQgYWNyb3NzIG1ldGhvZCBpbnZvY2F0aW9ucy4gKi8KKyAgICBnX29iamVjdF9zZXQgKHdvcmssCisgICAgICAgICAgICAgICAgICAibnVtMSIsIDE1LAorICAgICAgICAgICAgICAgICAgIm51bTIiLCAxMCwKKyAgICAgICAgICAgICAgICAgICJvcCIsICAgT1BFUkFUSU9OX1NVQlRSQUNULAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICBpZiAoY2FsY3VsYXRvcl9pZl9jYWxjdWxhdGUgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW52YWxpZF9vcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICBwcmludGYgKCIxNS0xMD0lZFxuIiwgZGlmZik7CisgICAgfQorICB9CisKKyAgZ19vYmplY3RfdW5yZWYgKHdvcmspOworCisgIGlmICghZXJyb3IpIHsKKyAgICBTaGFyZWRTdHJ1Y3QgKnNoYXJlZF9zdHJ1Y3Q7CisgICAgZ2NoYXIgKnZhbHVlOworCisgICAgc2hhcmVkX3N0cnVjdCA9IGdfb2JqZWN0X25ldyAoVFlQRV9TSEFSRURfU1RSVUNULCBOVUxMKTsKKworICAgIC8qIEFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBmaWxlLCB0aGUgQ2FsY3VsYXRvciBzZXJ2aWNlIGV4dGVuZHMKKyAgICAgICB0aGUgU2hhcmVkU2VydmljZSBzZXJ2aWNlLiBDb3JyZXNwb25kaW5nbHksIGluIHRoZSBnZW5lcmF0ZWQKKyAgICAgICBjb2RlIENhbGN1bGF0b3JJZiBpbmhlcml0cyBmcm9tIFNoYXJlZFNlcnZpY2VJZiwgYW5kIHRoZSBwYXJlbnQKKyAgICAgICBzZXJ2aWNlJ3MgbWV0aG9kcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIGEgc2ltcGxlIGNhc3QuICovCisgICAgaWYgKHNoYXJlZF9zZXJ2aWNlX2NsaWVudF9nZXRfc3RydWN0IChTSEFSRURfU0VSVklDRV9JRiAoY2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaGFyZWRfc3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgIGdfb2JqZWN0X2dldCAoc2hhcmVkX3N0cnVjdCwgInZhbHVlIiwgJnZhbHVlLCBOVUxMKTsKKyAgICAgIHByaW50ZiAoIkNoZWNrIGxvZzogJXNcbiIsIHZhbHVlKTsKKyAgICAgIGdfZnJlZSAodmFsdWUpOworICAgIH0KKworICAgIGdfb2JqZWN0X3VucmVmIChzaGFyZWRfc3RydWN0KTsKKyAgfQorCisgIGlmIChlcnJvcikgeworICAgIHByaW50ZiAoIkVSUk9SOiAlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisKKyAgICBleGl0X3N0YXR1cyA9IDE7CisgIH0KKworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgZ19vYmplY3RfdW5yZWYgKHNvY2tldCk7CisKKyAgcmV0dXJuIGV4aXRfc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY19nbGliL2NfZ2xpYl9zZXJ2ZXIuYyBiL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiZjQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NfZ2xpYi9jX2dsaWJfc2VydmVyLmMKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmgiCisKK0dfQkVHSU5fREVDTFMKKworLyogSW4gdGhlIEMgKEdMaWIpIGltcGxlbWVudGF0aW9uIG9mIFRocmlmdCwgdGhlIGFjdHVhbCB3b3JrIGRvbmUgYnkgYQorICAgc2VydmVyLS0tdGhhdCBpcywgdGhlIGNvZGUgdGhhdCBydW5zIHdoZW4gYSBjbGllbnQgaW52b2tlcyBhCisgICBzZXJ2aWNlIG1ldGhvZC0tLWlzIGRlZmluZWQgaW4gYSBzZXBhcmF0ZSAiaGFuZGxlciIgY2xhc3MgdGhhdAorICAgaW1wbGVtZW50cyB0aGUgc2VydmljZSBpbnRlcmZhY2UuIEhlcmUgd2UgZGVmaW5lIHRoZQorICAgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciBjbGFzcywgd2hpY2ggaW1wbGVtZW50cyB0aGUgQ2FsY3VsYXRvcklmCisgICBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIHRoZSBiZWhhdmlvciBleHBlY3RlZCBieSB0dXRvcmlhbCBjbGllbnRzLgorICAgKFR5cGljYWxseSB0aGlzIGNvZGUgd291bGQgYmUgcGxhY2VkIGluIGl0cyBvd24gbW9kdWxlIGJ1dCBmb3IKKyAgIGNsYXJpdHkgdGhpcyB0dXRvcmlhbCBpcyBwcmVzZW50ZWQgZW50aXJlbHkgaW4gYSBzaW5nbGUgZmlsZS4pCisKKyAgIEZvciBlYWNoIHNlcnZpY2UgdGhlIFRocmlmdCBjb21waWxlciBnZW5lcmF0ZXMgYW4gYWJzdHJhY3QgYmFzZQorICAgY2xhc3MgZnJvbSB3aGljaCBoYW5kbGVyIGltcGxlbWVudGF0aW9ucyBzaG91bGQgaW5oZXJpdC4gSW4gb3VyCisgICBjYXNlIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgaW5oZXJpdHMgZnJvbSBDYWxjdWxhdG9ySGFuZGxlciwKKyAgIGRlZmluZWQgaW4gZ2VuLWNfZ2xpYi9jYWxjdWxhdG9yLmguCisKKyAgIElmIHlvdSdyZSBuZXcgdG8gR09iamVjdCwgdHJ5IG5vdCB0byBiZSBpbnRpbWlkYXRlZCBieSB0aGUgcXVhbnRpdHkKKyAgIG9mIGNvZGUgaGVyZS0tLW11Y2ggb2YgaXQgaXMgYm9pbGVycGxhdGUgYW5kIGNhbiBtb3N0bHkgYmUKKyAgIGNvcGllZC1hbmQtcGFzdGVkIGZyb20gZXhpc3Rpbmcgd29yay4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8KKyAgIHRoZSBHT2JqZWN0IFJlZmVyZW5jZSBNYW51YWwsIGF2YWlsYWJsZSBvbmxpbmUgYXQKKyAgIGh0dHBzOi8vZGV2ZWxvcGVyLmdub21lLm9yZy9nb2JqZWN0Ly4gKi8KKworI2RlZmluZSBUWVBFX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiBcCisgICh0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfZ2V0X3R5cGUgKCkpCisKKyNkZWZpbmUgVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyKSkKKyNkZWZpbmUgVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MpKQorI2RlZmluZSBJU19UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSKSkKKyNkZWZpbmUgSVNfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSKSkKKyNkZWZpbmUgVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSX0dFVF9DTEFTUyhvYmopICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXJDbGFzcykpCisKK3N0cnVjdCBfVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciB7CisgIENhbGN1bGF0b3JIYW5kbGVyIHBhcmVudF9pbnN0YW5jZTsKKworICAvKiBwcml2YXRlICovCisgIEdIYXNoVGFibGUgKmxvZzsKK307Cit0eXBlZGVmIHN0cnVjdCBfVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyOworCitzdHJ1Y3QgX1R1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXJDbGFzcyB7CisgIENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKK3R5cGVkZWYgc3RydWN0IF9UdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyQ2xhc3MgVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlckNsYXNzOworCitHVHlwZSB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyIGZvbGxvd3MuICovCisKK0dfREVGSU5FX1RZUEUgKFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIsCisgICAgICAgICAgICAgICB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICBUWVBFX0NBTENVTEFUT1JfSEFORExFUikKKworLyogRWFjaCBvZiBhIGhhbmRsZXIncyBtZXRob2RzIGFjY2VwdHMgYXQgbGVhc3QgdHdvIHBhcmFtZXRlcnM6IEEKKyAgIHBvaW50ZXIgdG8gdGhlIHNlcnZpY2UtaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uICh0aGUgaGFuZGxlciBvYmplY3QKKyAgIGl0c2VsZikgYW5kIGEgaGFuZGxlIHRvIGEgR0Vycm9yIHN0cnVjdHVyZSB0byByZWNlaXZlIGluZm9ybWF0aW9uCisgICBhYm91dCBhbnkgZXJyb3IgdGhhdCBvY2N1cnMuCisKKyAgIE9uIHN1Y2Nlc3MsIGEgaGFuZGxlciBtZXRob2QgcmV0dXJucyBUUlVFLiBBIHJldHVybiB2YWx1ZSBvZiBGQUxTRQorICAgaW5kaWNhdGVzIGFuIGVycm9yIG9jY3VycmVkIGFuZCB0aGUgZXJyb3IgcGFyYW1ldGVyIGhhcyBiZWVuCisgICBzZXQuIChNZXRob2RzIHNob3VsZCBub3QgcmV0dXJuIEZBTFNFIHdpdGhvdXQgZmlyc3Qgc2V0dGluZyB0aGUKKyAgIGVycm9yIHBhcmFtZXRlci4pICovCitzdGF0aWMgZ2Jvb2xlYW4KK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9waW5nIChDYWxjdWxhdG9ySWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwdXRzICgicGluZygpIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFNlcnZpY2UtbWV0aG9kIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0aHJvdWdoIGFzIHBhcmFtZXRlcnMgdG8gdGhlCisgICBoYW5kbGVyIG1ldGhvZC4KKworICAgSWYgdGhlIHNlcnZpY2UgbWV0aG9kIHJldHVybnMgYSB2YWx1ZSBhbiBvdXRwdXQgcGFyYW1ldGVyLCBfcmV0dXJuLAorICAgaXMgYWRkaXRpb25hbGx5IHBhc3NlZCB0byB0aGUgaGFuZGxlciBtZXRob2QuIFRoaXMgcGFyYW1ldGVyIHNob3VsZAorICAgYmUgc2V0IGFwcHJvcHJpYXRlbHkgYmVmb3JlIHRoZSBtZXRob2QgcmV0dXJucywgd2hlbmV2ZXIgaXQKKyAgIHN1Y2NlZWRzLgorCisgICBUaGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBtZXRob2QgaGFwcGVucyB0byBiZSBvZiBhIGJhc2UgdHlwZSwKKyAgIGkzMiwgYnV0IG5vdGUgaWYgYSBtZXRob2QgcmV0dXJucyBhIGNvbXBsZXggdHlwZSBzdWNoIGFzIGEgbWFwIG9yCisgICBsaXN0ICpfcmV0dXJuIHdpbGwgcG9pbnQgdG8gYSBwcmUtYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgIGRvZXMgbm90IG5lZWQgdG8gYmUgcmUtYWxsb2NhdGVkIGFuZCBzaG91bGQgbm90IGJlIGRlc3Ryb3llZC4gKi8KK3N0YXRpYyBnYm9vbGVhbgordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2FkZCAoQ2FsY3VsYXRvcklmICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgICAgICAgICpfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgbnVtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgIG51bTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBwcmludGYgKCJhZGQoJWQsJWQpXG4iLCBudW0xLCBudW0yKTsKKyAgKl9yZXR1cm4gPSBudW0xICsgbnVtMjsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogQW55IGhhbmRsZXIgbWV0aG9kIGNhbiByZXR1cm4gYSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0byB0aGUKKyAgIGNsaWVudCBieSBzZXR0aW5nIGl0cyBlcnJvciBwYXJhbWV0ZXIgYXBwcm9wcmlhdGVseSBhbmQgcmV0dXJuaW5nCisgICBGQUxTRS4gU2VlIHRoZSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkVycm9yIGVudW1lcmF0aW9uIGRlZmluZWQKKyAgIGluIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCBmb3IgYSBsaXN0IG9mIHJlY29nbml6ZWQKKyAgIGV4Y2VwdGlvbiB0eXBlcyAoR0Vycm9yIGNvZGVzKS4KKworICAgSWYgYSBzZXJ2aWNlIG1ldGhvZCBjYW4gYWxzbyB0aHJvdyBhIGN1c3RvbSBleGNlcHRpb24gKHRoYXQgaXMsIG9uZQorICAgZGVmaW5lZCBpbiB0aGUgLnRocmlmdCBmaWxlKSBhbiBhZGRpdGlvbmFsIG91dHB1dCBwYXJhbWV0ZXIgd2lsbCBiZQorICAgcHJvdmlkZWQgKGhlcmUsICJvdWNoIikgdG8gaG9sZCBhbiBpbnN0YW5jZSBvZiB0aGUgZXhjZXB0aW9uLCB3aGVuCisgICBuZWNlc3NhcnkuIE5vdGUgdGhlcmUgd2lsbCBiZSBhIHNlcGFyYXRlIHBhcmFtZXRlciBhZGRlZCBmb3IgZWFjaAorICAgdHlwZSBvZiBleGNlcHRpb24gdGhlIG1ldGhvZCBjYW4gdGhyb3cuCisKKyAgIFVubGlrZSByZXR1cm4gdmFsdWVzLCBleGNlcHRpb24gb2JqZWN0cyBhcmUgbmV2ZXIgcHJlLWNyZWF0ZWQ7IHRoaXMKKyAgIGlzIGFsd2F5cyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGhhbmRsZXIgbWV0aG9kLiAqLworc3RhdGljIGdib29sZWFuCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfY2FsY3VsYXRlIChDYWxjdWxhdG9ySWYgICAgICAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgICAgICAgICAgICAqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiAgICAgICBsb2dpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmsgICAgICAgICp3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiAqKm91Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgICAgICAgICAgICoqZXJyb3IpCit7CisgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgKnNlbGY7CisKKyAgZ2ludCAqbG9nX2tleTsKKyAgZ2NoYXIgbG9nX3ZhbHVlWzEyXTsKKyAgU2hhcmVkU3RydWN0ICpsb2dfc3RydWN0OworCisgIGdpbnQgbnVtMTsKKyAgZ2ludCBudW0yOworICBPcGVyYXRpb24gb3A7CisgIGdib29sZWFuIHJlc3VsdCA9IFRSVUU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoSVNfVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIChpZmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgIHNlbGYgPSBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgKGlmYWNlKTsKKworICAvKiBSZW1lbWJlcjogRXhjZXB0aW9uIG9iamVjdHMgYXJlIG5ldmVyIHByZS1jcmVhdGVkICovCisgIGdfYXNzZXJ0ICgqb3VjaCA9PSBOVUxMKTsKKworICAvKiBGZXRjaCB0aGUgY29udGVudHMgb2Ygb3VyIFdvcmsgcGFyYW1ldGVyLgorCisgICAgIE5vdGUgdGhhdCBpbnRlZ2VyIHByb3BlcnRpZXMgb2YgdGhpcnR5LXR3byBiaXRzIG9yIGZld2VyIGluIHdpZHRoCisgICAgIGFyZSBfYWx3YXlzXyBvZiB0eXBlIGdpbnQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHJhbmdlIG9mIHZhbHVlcyB0aGV5CisgICAgIGhvbGQuIEEgY29tbW9uIGVycm9yIGlzIHRyeWluZyB0byByZXRyaWV2ZSwgc2F5LCBhIHN0cnVjdHVyZQorICAgICBtZW1iZXIgZGVmaW5lZCBpbiB0aGUgLnRocmlmdCBmaWxlIGFzIHR5cGUgaTE2IGludG8gYSB2YXJpYWJsZSBvZgorICAgICB0eXBlIGdpbnQxNiwgd2hpY2ggd2lsbCBjbG9iYmVyIHZhcmlhYmxlcyBhZGphY2VudCBvbiB0aGUKKyAgICAgc3RhY2suIFJlbWVtYmVyOiBJZiB5b3UncmUgcmV0cmlldmluZyBhbiBpbnRlZ2VyIHByb3BlcnR5IHRoZQorICAgICByZWNlaXZpbmcgdmFyaWFibGUgbXVzdCBiZSBvZiBlaXRoZXIgdHlwZSBnaW50IG9yIGdpbnQ2NCwgYXMKKyAgICAgYXBwcm9wcmlhdGUuICovCisgIGdfb2JqZWN0X2dldCAoKFdvcmsgKil3LAorICAgICAgICAgICAgICAgICJudW0xIiwgJm51bTEsCisgICAgICAgICAgICAgICAgIm51bTIiLCAmbnVtMiwKKyAgICAgICAgICAgICAgICAib3AiLCAgICZvcCwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBwcmludGYgKCJjYWxjdWxhdGUoJWQseyVkLCVkLCVkfSlcbiIsIGxvZ2lkLCBvcCwgbnVtMSwgbnVtMik7CisKKyAgc3dpdGNoIChvcCkgeworICBjYXNlIE9QRVJBVElPTl9BREQ6CisgICAgKl9yZXR1cm4gPSBudW0xICsgbnVtMjsKKyAgICBicmVhazsKKworICBjYXNlIE9QRVJBVElPTl9TVUJUUkFDVDoKKyAgICAqX3JldHVybiA9IG51bTEgLSBudW0yOworICAgIGJyZWFrOworCisgIGNhc2UgT1BFUkFUSU9OX01VTFRJUExZOgorICAgICpfcmV0dXJuID0gbnVtMSAqIG51bTI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBPUEVSQVRJT05fRElWSURFOgorICAgIGlmIChudW0yID09IDApIHsKKyAgICAgIC8qIEZvciBlYWNoIGN1c3RvbSBleGNlcHRpb24gdHlwZSBhIHN1YmNsYXNzIG9mIFRocmlmdFN0cnVjdCBpcworICAgICAgICAgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIuIFRocm93IGFuIGV4Y2VwdGlvbiBieQorICAgICAgICAgc2V0dGluZyB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgcGFyYW1ldGVyIHRvIGEgbmV3IGluc3RhbmNlCisgICAgICAgICBvZiBpdHMgdHlwZSBhbmQgcmV0dXJuaW5nIEZBTFNFLiAqLworICAgICAgKm91Y2ggPSBnX29iamVjdF9uZXcgKFRZUEVfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXRPcCIsIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aHkiLCAgZ19zdHJkdXAgKCJDYW5ub3QgZGl2aWRlIGJ5IDAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIHJlc3VsdCA9IEZBTFNFOworCisgICAgICAvKiBOb3RlIHRoZSBjYWxsIHRvIGdfc3RyZHVwIGFib3ZlOiBBbGwgdGhlIG1lbW9yeSB1c2VkIGJ5IGEKKyAgICAgICAgIFRocmlmdFN0cnVjdCdzIHByb3BlcnRpZXMgYmVsb25ncyB0byB0aGUgb2JqZWN0IGl0c2VsZiBhbmQKKyAgICAgICAgIHdpbGwgYmUgZnJlZWQgb24gZGVzdHJ1Y3Rpb24uIFJlbW92aW5nIHRoaXMgY2FsbCB0byBnX3N0cmR1cAorICAgICAgICAgd2lsbCBsZWFkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0IGFzIHRoZSBvYmplY3QgdHJpZXMgdG8KKyAgICAgICAgIHJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCBzdGF0aWNhbGx5IHRvIHRoZSBwcm9ncmFtLiAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICpfcmV0dXJuID0gbnVtMSAvIG51bTI7CisgICAgfQorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgKm91Y2ggPSBnX29iamVjdF9uZXcgKFRZUEVfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0T3AiLCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoeSIsICBnX3N0cmR1cCAoIkludmFsaWQgT3BlcmF0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHJlc3VsdCA9IEZBTFNFOworICB9CisKKyAgLyogT24gc3VjY2VzcywgbG9nIGEgcmVjb3JkIG9mIHRoZSByZXN1bHQgdG8gb3VyIGhhc2ggdGFibGUgKi8KKyAgaWYgKHJlc3VsdCkgeworICAgIGxvZ19rZXkgPSBnX21hbGxvYyAoc2l6ZW9mICpsb2dfa2V5KTsKKyAgICAqbG9nX2tleSA9IGxvZ2lkOworCisgICAgc25wcmludGYgKGxvZ192YWx1ZSwgc2l6ZW9mIGxvZ192YWx1ZSwgIiVkIiwgKl9yZXR1cm4pOworCisgICAgbG9nX3N0cnVjdCA9IGdfb2JqZWN0X25ldyAoVFlQRV9TSEFSRURfU1RSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXkiLCAgICpsb2dfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIsICBnX3N0cmR1cCAobG9nX3ZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBnX2hhc2hfdGFibGVfcmVwbGFjZSAoc2VsZi0+bG9nLCBsb2dfa2V5LCBsb2dfc3RydWN0KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIEEgb25lLXdheSBtZXRob2QgaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyBhbiBlcXVpdmFsZW50LCByZWd1bGFyCisgICBtZXRob2QgdGhhdCByZXR1cm5zIG5vIHZhbHVlLiAqLworc3RhdGljIGdib29sZWFuCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfemlwIChDYWxjdWxhdG9ySWYgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHB1dHMgKCJ6aXAoKSIpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBBcyBzcGVjaWZpZWQgaW4gdGhlIC50aHJpZnQgZmlsZSAodHV0b3JpYWwudGhyaWZ0KSwgdGhlIENhbGN1bGF0b3IKKyAgIHNlcnZpY2UgZXh0ZW5kcyB0aGUgU2hhcmVkU2VydmljZSBzZXJ2aWNlLiBDb3JyZXNwb25kaW5nbHksIGluIHRoZQorICAgZ2VuZXJhdGVkIGNvZGUgdGhlIENhbGN1bGF0b3IgaW50ZXJmYWNlLCBDYWxjdWxhdG9ySWYsIGV4dGVuZHMgdGhlCisgICBTaGFyZWRTZXJ2aWNlIGludGVyZmFjZSwgU2hhcmVkU2VydmljZUlmLCBhbmQgc3ViY2xhc3NlcyBvZgorICAgQ2FsY3VsYXRvckhhbmRsZXIgc2hvdWxkIGltcGxlbWVudCBpdHMgbWV0aG9kcyBhcyB3ZWxsLgorCisgICBIZXJlIHdlIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBnZXRTdHJ1Y3QgbWV0aG9kIGZyb20gdGhlCisgICBwYXJlbnQgc2VydmljZS4gKi8KK3N0YXRpYyBnYm9vbGVhbgordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2dldF9zdHJ1Y3QgKFNoYXJlZFNlcnZpY2VJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZFN0cnVjdCAgICAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyICAgICAga2V5MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICoqZXJyb3IpCit7CisgIGdpbnQga2V5ID0gKGdpbnQpa2V5MzI7CisgIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIgKnNlbGY7CisgIFNoYXJlZFN0cnVjdCAqbG9nX3N0cnVjdDsKKyAgZ2ludCBsb2dfa2V5OworICBnY2hhciAqbG9nX3ZhbHVlOworCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKElTX1RVVE9SSUFMX0NBTENVTEFUT1JfSEFORExFUiAoaWZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworICBzZWxmID0gVFVUT1JJQUxfQ0FMQ1VMQVRPUl9IQU5ETEVSIChpZmFjZSk7CisKKyAgLyogUmVtZW1iZXI6IENvbXBsZXggcmV0dXJuIHR5cGVzIGFyZSBhbHdheXMgcHJlLWNyZWF0ZWQgYW5kIG5lZWQKKyAgICAgb25seSBiZSBwb3B1bGF0ZWQgKi8KKyAgZ19hc3NlcnQgKCpfcmV0dXJuICE9IE5VTEwpOworCisgIHByaW50ZiAoImdldFN0cnVjdCglZClcbiIsIGtleSk7CisKKyAgLyogSWYgdGhlIGtleSBleGlzdHMgaW4gb3VyIGxvZywgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGxvZ2dlZAorICAgICBkYXRhIChvciBhbiBlbXB0eSBTaGFyZWRTdHJ1Y3Qgc3RydWN0dXJlIGlmIGl0IGRvZXMgbm90KS4KKworICAgICBJbmNpZGVudGFsbHksIG5vdGUgd2UgX211c3RfIGhlcmUgY29weSB0aGUgdmFsdWVzIGZyb20gdGhlIGhhc2gKKyAgICAgdGFibGUgaW50byB0aGUgcmV0dXJuIHN0cnVjdHVyZS4gQWxsIG1lbW9yeSB1c2VkIGJ5IHRoZSByZXR1cm4KKyAgICAgc3RydWN0dXJlIGJlbG9uZ3MgdG8gdGhlIHN0cnVjdHVyZSBpdHNlbGYgYW5kIHdpbGwgYmUgZnJlZWQgb25jZQorICAgICBhIHJlc3BvbnNlIGlzIHNlbnQgdG8gdGhlIGNsaWVudC4gSWYgd2UgbWVyZWx5IGZyZWVkICpfcmV0dXJuIGFuZAorICAgICBzZXQgaXQgdG8gcG9pbnQgdG8gb3VyIGhhc2gtdGFibGUgZW50cnksIHRoYXQgd291bGQgbWVhbiBtZW1vcnkKKyAgICAgd291bGQgYmUgcmVsZWFzZWQgKGVmZmVjdGl2ZWx5LCBkYXRhIGVyYXNlZCkgb3V0IG9mIHRoZSBoYXNoCisgICAgIHRhYmxlISAqLworICBsb2dfc3RydWN0ID0gZ19oYXNoX3RhYmxlX2xvb2t1cCAoc2VsZi0+bG9nLCAma2V5KTsKKyAgaWYgKGxvZ19zdHJ1Y3QgIT0gTlVMTCkgeworICAgIGdfb2JqZWN0X2dldCAobG9nX3N0cnVjdCwKKyAgICAgICAgICAgICAgICAgICJrZXkiLCAgICZsb2dfa2V5LAorICAgICAgICAgICAgICAgICAgInZhbHVlIiwgJmxvZ192YWx1ZSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGdfb2JqZWN0X3NldCAoKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAia2V5IiwgICBsb2dfa2V5LAorICAgICAgICAgICAgICAgICAgInZhbHVlIiwgZ19zdHJkdXAgKGxvZ192YWx1ZSksCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyJ3MgaW5zdGFuY2UgZmluYWxpemVyIChkZXN0cnVjdG9yKSAqLworc3RhdGljIHZvaWQKK3R1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyICpzZWxmID0KKyAgICBUVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIgKG9iamVjdCk7CisKKyAgLyogRnJlZSBvdXIgY2FsY3VsYXRpb24tbG9nIGhhc2ggdGFibGUgKi8KKyAgZ19oYXNoX3RhYmxlX3VucmVmIChzZWxmLT5sb2cpOworICBzZWxmLT5sb2cgPSBOVUxMOworCisgIC8qIENoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3MgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9wYXJlbnRfY2xhc3MpLT4KKyAgICBmaW5hbGl6ZSAob2JqZWN0KTsKK30KKworLyogVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlcidzIGluc3RhbmNlIGluaXRpYWxpemVyIChjb25zdHJ1Y3RvcikgKi8KK3N0YXRpYyB2b2lkCit0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfaW5pdCAoVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlciAqc2VsZikKK3sKKyAgLyogQ3JlYXRlIG91ciBjYWxjdWxhdGlvbi1sb2cgaGFzaCB0YWJsZSAqLworICBzZWxmLT5sb2cgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnRfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfb2JqZWN0X3VucmVmKTsKK30KKworLyogVHV0b3JpYWxDYWxjdWxhdG9ySGFuZGxlcidzIGNsYXNzIGluaXRpYWxpemVyICovCitzdGF0aWMgdm9pZAordHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2NsYXNzX2luaXQgKFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXJDbGFzcyAqa2xhc3MpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIFNoYXJlZFNlcnZpY2VIYW5kbGVyQ2xhc3MgKnNoYXJlZF9zZXJ2aWNlX2hhbmRsZXJfY2xhc3MgPQorICAgIFNIQVJFRF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MgKGtsYXNzKTsKKyAgQ2FsY3VsYXRvckhhbmRsZXJDbGFzcyAqY2FsY3VsYXRvcl9oYW5kbGVyX2NsYXNzID0KKyAgICBDQUxDVUxBVE9SX0hBTkRMRVJfQ0xBU1MgKGtsYXNzKTsKKworICAvKiBSZWdpc3RlciBvdXIgZGVzdHJ1Y3RvciAqLworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9maW5hbGl6ZTsKKworICAvKiBSZWdpc3RlciBvdXIgaW1wbGVtZW50YXRpb25zIG9mIENhbGN1bGF0b3JIYW5kbGVyJ3MgbWV0aG9kcyAqLworICBjYWxjdWxhdG9yX2hhbmRsZXJfY2xhc3MtPnBpbmcgPQorICAgIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9waW5nOworICBjYWxjdWxhdG9yX2hhbmRsZXJfY2xhc3MtPmFkZCA9CisgICAgdHV0b3JpYWxfY2FsY3VsYXRvcl9oYW5kbGVyX2FkZDsKKyAgY2FsY3VsYXRvcl9oYW5kbGVyX2NsYXNzLT5jYWxjdWxhdGUgPQorICAgIHR1dG9yaWFsX2NhbGN1bGF0b3JfaGFuZGxlcl9jYWxjdWxhdGU7CisgIGNhbGN1bGF0b3JfaGFuZGxlcl9jbGFzcy0+emlwID0KKyAgICB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfemlwOworCisgIC8qIFJlZ2lzdGVyIG91ciBpbXBsZW1lbnRhdGlvbiBvZiBTaGFyZWRTZXJ2aWNlSGFuZGxlcidzIG1ldGhvZCAqLworICBzaGFyZWRfc2VydmljZV9oYW5kbGVyX2NsYXNzLT5nZXRfc3RydWN0ID0KKyAgICB0dXRvcmlhbF9jYWxjdWxhdG9yX2hhbmRsZXJfZ2V0X3N0cnVjdDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGF0IGVuZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFR1dG9yaWFsQ2FsY3VsYXRvckhhbmRsZXIuCisgICBFdmVyeXRoaW5nIGJlbG93IGlzIGZhaXJseSBnZW5lcmljIGNvZGUgdGhhdCBzZXRzIHVwIGEgbWluaW1hbAorICAgVGhyaWZ0IHNlcnZlciBmb3IgdHV0b3JpYWwgY2xpZW50cy4gKi8KKworCisvKiBPdXIgc2VydmVyIG9iamVjdCwgZGVjbGFyZWQgZ2xvYmFsbHkgc28gaXQgaXMgYWNjZXNzaWJsZSB3aXRoaW4gdGhlCisgICBTSUdJTlQgc2lnbmFsIGhhbmRsZXIgKi8KK1RocmlmdFNlcnZlciAqc2VydmVyID0gTlVMTDsKKworLyogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlcnZlciB3YXMgaW50ZXJydXB0ZWQgd2l0aAorICAgU0lHSU5UIChpLmUuIEN0cmwtQykgc28gd2UgY2FuIHRlbGwgd2hldGhlciBpdHMgdGVybWluYXRpb24gd2FzCisgICBhYm5vcm1hbCAqLworZ2Jvb2xlYW4gc2lnaW50X3JlY2VpdmVkID0gRkFMU0U7CisKKy8qIEhhbmRsZSBTSUdJTlQgKCJDdHJsLUMiKSBzaWduYWxzIGJ5IGdyYWNlZnVsbHkgc3RvcHBpbmcgdGhlCisgICBzZXJ2ZXIgKi8KK3N0YXRpYyB2b2lkCitzaWdpbnRfaGFuZGxlciAoaW50IHNpZ25hbF9udW1iZXIpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzaWduYWxfbnVtYmVyKTsKKworICAvKiBUYWtlIG5vdGUgd2Ugd2VyZSBjYWxsZWQgKi8KKyAgc2lnaW50X3JlY2VpdmVkID0gVFJVRTsKKworICAvKiBTaHV0IGRvd24gdGhlIHNlcnZlciBncmFjZWZ1bGx5ICovCisgIGlmIChzZXJ2ZXIgIT0gTlVMTCkKKyAgICB0aHJpZnRfc2VydmVyX3N0b3AgKHNlcnZlcik7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBUdXRvcmlhbENhbGN1bGF0b3JIYW5kbGVyICpoYW5kbGVyOworICBDYWxjdWxhdG9yUHJvY2Vzc29yICpwcm9jZXNzb3I7CisKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0OworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICp0cmFuc3BvcnRfZmFjdG9yeTsKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpwcm90b2NvbF9mYWN0b3J5OworCisgIHN0cnVjdCBzaWdhY3Rpb24gc2lnaW50X2FjdGlvbjsKKworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgaW50IGV4aXRfc3RhdHVzID0gMDsKKworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgLyogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIG91ciBoYW5kbGVyLCB3aGljaCBwcm92aWRlcyB0aGUgc2VydmljZSdzCisgICAgIG1ldGhvZHMnIGltcGxlbWVudGF0aW9uICovCisgIGhhbmRsZXIgPQorICAgIGdfb2JqZWN0X25ldyAoVFlQRV9UVVRPUklBTF9DQUxDVUxBVE9SX0hBTkRMRVIsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UncyBwcm9jZXNzb3IsIGF1dG9tYXRpY2FsbHkKKyAgICAgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIsIHdoaWNoIHBhcnNlcyBpbmNvbWluZyBtZXNzYWdlcworICAgICBhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgaW4gdGhlIGhhbmRsZXIgKi8KKyAgcHJvY2Vzc29yID0KKyAgICBnX29iamVjdF9uZXcgKFRZUEVfQ0FMQ1VMQVRPUl9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAiaGFuZGxlciIsIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBDcmVhdGUgb3VyIHNlcnZlciBzb2NrZXQsIHdoaWNoIGJpbmRzIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQKKyAgICAgbGlzdGVucyBmb3IgY2xpZW50IGNvbm5lY3Rpb25zICovCisgIHNlcnZlcl90cmFuc3BvcnQgPQorICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICJwb3J0IiwgOTA5MCwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIENyZWF0ZSBvdXIgdHJhbnNwb3J0IGZhY3RvcnksIHVzZWQgYnkgdGhlIHNlcnZlciB0byB3cmFwICJyYXciCisgICAgIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIGNsaWVudCAoaW4gdGhpcyBjYXNlIHdpdGggYQorICAgICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlKSAqLworICB0cmFuc3BvcnRfZmFjdG9yeSA9CisgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIENyZWF0ZSBvdXIgcHJvdG9jb2wgZmFjdG9yeSwgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaCB3aXJlIHByb3RvY29sCisgICAgIHRoZSBzZXJ2ZXIgd2lsbCB1c2UgKGluIHRoaXMgY2FzZSwgVGhyaWZ0J3MgYmluYXJ5IHByb3RvY29sKSAqLworICBwcm90b2NvbF9mYWN0b3J5ID0KKyAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgLyogQ3JlYXRlIHRoZSBzZXJ2ZXIgaXRzZWxmICovCisgIHNlcnZlciA9CisgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgInByb2Nlc3NvciIsICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfdHJhbnNwb3J0IiwgICAgICAgICBzZXJ2ZXJfdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgImlucHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgIm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSIsIHRyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAgcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIEluc3RhbGwgb3VyIFNJR0lOVCBoYW5kbGVyLCB3aGljaCBoYW5kbGVzIEN0cmwtQyBiZWluZyBwcmVzc2VkIGJ5CisgICAgIHN0b3BwaW5nIHRoZSBzZXJ2ZXIgZ3JhY2VmdWxseSAobm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGEKKyAgICAgbmljZSB0b3VjaCkgKi8KKyAgbWVtc2V0ICgmc2lnaW50X2FjdGlvbiwgMCwgc2l6ZW9mIChzaWdpbnRfYWN0aW9uKSk7CisgIHNpZ2ludF9hY3Rpb24uc2FfaGFuZGxlciA9IHNpZ2ludF9oYW5kbGVyOworICBzaWdpbnRfYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOworICBzaWdhY3Rpb24gKFNJR0lOVCwgJnNpZ2ludF9hY3Rpb24sIE5VTEwpOworCisgIC8qIFN0YXJ0IHRoZSBzZXJ2ZXIsIHdoaWNoIHdpbGwgcnVuIHVudGlsIGl0cyBzdG9wIG1ldGhvZCBpcyBpbnZva2VkCisgICAgIChmcm9tIHdpdGhpbiB0aGUgU0lHSU5UIGhhbmRsZXIsIGluIHRoaXMgY2FzZSkgKi8KKyAgcHV0cyAoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKTsKKyAgdGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoc2VydmVyLCAmZXJyb3IpOworCisgIC8qIElmIHRoZSBzZXJ2ZXIgc3RvcHBlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGhhdmluZyBiZWVuCisgICAgIGludGVycnVwdGVkIGJ5IHRoZSB1c2VyLCByZXBvcnQgdGhlIGVycm9yICovCisgIGlmICghc2lnaW50X3JlY2VpdmVkKSB7CisgICAgZ19tZXNzYWdlICgidGhyaWZ0X3NlcnZlcl9zZXJ2ZTogJXMiLAorICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworICAgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgIH0KKworICBwdXRzICgiZG9uZS4iKTsKKworICBnX29iamVjdF91bnJlZiAoc2VydmVyKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydF9mYWN0b3J5KTsKKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sX2ZhY3RvcnkpOworICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHByb2Nlc3Nvcik7CisgIGdfb2JqZWN0X3VucmVmIChoYW5kbGVyKTsKKworICByZXR1cm4gZXhpdF9zdGF0dXM7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2NsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiMjAxM2EKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDY1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0dXAtbG9jYWwtbGlzcC1lbnY6IGVuc3VyZS1leHRlcm5hbHMuc2gKKwliYXNoIGVuc3VyZS1leHRlcm5hbHMuc2gKKworZ2VuLWNsOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjbCAtciAkPAorCitBTExfRklMRV9QUkVSRVFTID0gXAorCQkgICBsb2FkLWxvY2FsbHkubGlzcCBcCisJCSAgIG1ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AgXAorCQkgICBtYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwIFwKKwkJICAgc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AgXAorCQkgICB0aHJpZnQtdHV0b3JpYWwuYXNkIFwKKwkJICAgdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcAorCisjIE5PVEU6IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCBjYW5ub3QgYmUgYnVpbHQgaW4gcGFyYWxsZWwKKyMgYmVjYXVzZSBvbiBsb2FkaW5nIHRoZSBtYWtlLXR1dG9yaWFsLSogc2NyaXB0cyBTQkNMIHdpbGwKKyMgYXR0ZW1wdCB0byBjb21waWxlIHRoZWlyIGRlcGVuZGVuY2llcy4gVW5mb3J0dW5hdGVseSwKKyMgYmVjYXVzZSB0aGVpciBkZXBlbmRlbmNpZXMgYXJlIHNoYXJlZCwgcGFyYWxsZWwgam9icyBjYW4KKyMgZW5kIHVwIG92ZXJ3cml0aW5nIG9yIGNvcnJ1cHRpbmcgdGhlIGNvbXBpbGVkIGZpbGVzCithbGwtbG9jYWw6IGdlbi1jbCBzZXR1cC1sb2NhbC1saXNwLWVudiAkKEFMTF9GSUxFX1BSRVJFUVMpCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkuL1R1dG9yaWFsU2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkuL1R1dG9yaWFsQ2xpZW50CisKK2NsZWFuLWxvY2FsOgorCS0kKFJNKSAtciBnZW4tKgorCS0kKFJNKSAtciBleHRlcm5hbHMKKwktJChSTSkgLXIgcXVpY2tsaXNwCisJLSQoUk0pIC1yIGxpYgorCS0kKFJNKSBxdWlja2xpc3AubGlzcAorCS0kKFJNKSBiYWNrcG9ydC11cGRhdGUuemlwCisJLSQoUk0pIHNoYXJlZC1pbXBsZW1lbnRhdGlvbi5mYXNsCisJLSQoUk0pIHR1dG9yaWFsLWltcGxlbWVudGF0aW9uLmZhc2wKKwktJChSTSkgVHV0b3JpYWxTZXJ2ZXIKKwktJChSTSkgVHV0b3JpYWxDbGllbnQKKworRVhUUkFfRElTVCA9IFwKKwl0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwIFwKKwlzaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcCBcCisJdGhyaWZ0LXR1dG9yaWFsLmFzZCBcCisJbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcCBcCisJbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvZW5zdXJlLWV4dGVybmFscy5zaCBiL3R1dG9yaWFsL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWFlOGM1NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKQEAgLTAsMCArMSBAQAorLi4vLi4vbGliL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9sb2FkLWxvY2FsbHkubGlzcCBiL3R1dG9yaWFsL2NsL2xvYWQtbG9jYWxseS5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmEwYTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9sb2FkLWxvY2FsbHkubGlzcApAQCAtMCwwICsxLDIyIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBKdXN0IGEgc2NyaXB0IGZvciBsb2FkaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgdXNpbmcgYnVuZGxlZCBkZXBlbmRlbmNpZXMuCis7Ozs7IFRoaXMgaXMgYW4gaWRlbnRpY2FsIGNvcHkgb2YgdGhlIGZpbGUgaW4gbGliL2NsLgorCisocmVxdWlyZSAiYXNkZiIpCisKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImV4dGVybmFscy9idW5kbGUubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImxpYi9kZS5zZXRmLnRocmlmdC1iYWNrcG9ydC11cGRhdGUvdGhyaWZ0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZkODYxCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcApAQCAtMCwwICsxLDUxIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAibG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvc2hhcmVkL3RocmlmdC1nZW4tc2hhcmVkLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC90dXRvcmlhbC90aHJpZnQtZ2VuLXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgInRocmlmdC10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LXR1dG9yaWFsKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciB0aGUgYmluYXJ5LiIKKyAgKHRocmlmdDp3aXRoLWNsaWVudCAocHJvdCAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTA5MCIpCisgICAgKHR1dG9yaWFsLmNhbGN1bGF0b3I6cGluZyBwcm90KQorICAgIChmb3JtYXQgdCAicGluZygpfiUiKQorICAgIChmb3JtYXQgdCAiMSArIDEgPSB+YX4lIiAodHV0b3JpYWwuY2FsY3VsYXRvcjphZGQgcHJvdCAxIDEpKQorICAgIChsZXQgKCh3b3JrLWluc3RhbmNlICh0dXRvcmlhbDptYWtlLXdvcmsgOm51bTEgNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bTIgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wIHR1dG9yaWFsOm9wZXJhdGlvbi5kaXZpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjb21tZW50ICJCb295YSEiKSkpCisgICAgICAoaGFuZGxlci1jYXNlIChmb3JtYXQgdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IC8gMCA9IH5hIC0gT2gsIHJlYWxseT8gQW4gZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGhlcmUufiUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3QgMSB3b3JrLWluc3RhbmNlKSkKKyAgICAgICAgKHR1dG9yaWFsOmludmFsaWRvcGVyYXRpb24gKGUpCisgICAgICAgICAgKGZvcm1hdCB0ICItLS1+JShFeHBlY3RlZCkgSW52YWxpZCBPcGVyYXRpb24gY2F1Z2h0OiB+JX5hfiUtLS1+JSIgZSkpKSkKKyAgICAobGV0ICgod29yay1pbnN0YW5jZSAodHV0b3JpYWw6bWFrZS13b3JrIDpudW0xIDE1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVtMiAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wIHR1dG9yaWFsOm9wZXJhdGlvbi5zdWJ0cmFjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNvbW1lbnQgIlBsYXlpbmcgbmljZSB0aGlzIHRpbWUuIikpKQorICAgICAgKGhhbmRsZXItY2FzZSAoZm9ybWF0IHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTUgLSAxMCA9IH5hfiUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3QgMSB3b3JrLWluc3RhbmNlKSkKKyAgICAgICAgKHR1dG9yaWFsOmludmFsaWRvcGVyYXRpb24gKGUpCisgICAgICAgICAgKGZvcm1hdCB0ICItLS1+JShVbmV4cGVjdGVkKSBJbnZhbGlkIE9wZXJhdGlvbiBjYXVnaHQ6IH4lfmF+JS0tLX4lIiBlKSkpKQorICAgIChmb3JtYXQgdCAiQ2hlY2sgbG9nOiB+YX4lIiAoc2hhcmVkLnNoYXJlZC1zZXJ2aWNlOmdldC1zdHJ1Y3QgcHJvdCAxKSkpKQorCisoY2xvbjpkdW1wICJUdXRvcmlhbENsaWVudCIgbWFpbikKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjFhOTAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwCkBAIC0wLDAgKzEsMjkgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJsb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9zaGFyZWQvdGhyaWZ0LWdlbi1zaGFyZWQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3R1dG9yaWFsL3RocmlmdC1nZW4tdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAidGhyaWZ0LXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtdHV0b3JpYWwpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIHRoZSBiaW5hcnkuIgorICAodGhyaWZ0OnNlcnZlICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkwIiB0dXRvcmlhbDpjYWxjdWxhdG9yKSkKKworKGNsb246ZHVtcCAiVHV0b3JpYWxTZXJ2ZXIiIG1haW4pCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcCBiL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTc2MjYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcApAQCAtMCwwICsxLDI1IEBACisoaW4tcGFja2FnZSAjOnNoYXJlZC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdmFyICpzdHJ1Y3RzKiAobWFrZS1oYXNoLXRhYmxlKSkKKworKGRlZnVuIHNoYXJlZC5zaGFyZWQtc2VydmljZS1pbXBsZW1lbnRhdGlvbjpnZXQtc3RydWN0IChrZXkpCisgIChmb3JtYXQgdCAiZ2V0U3RydWN0KH5hKX4lIiBrZXkpCisgIChnZXRoYXNoIGtleSAqc3RydWN0cyopKQorCisoZGVmdW4gYWRkLWxvZyAoa2V5IHZhbHVlKQorICAoc2V0ZiAoZ2V0aGFzaCBrZXkgKnN0cnVjdHMqKQorICAgICAgICAobWFrZS1pbnN0YW5jZSAnc2hhcmVkOnNoYXJlZHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICA6a2V5IGtleQorICAgICAgICAgICAgICAgICAgICAgICA6dmFsdWUgKHdyaXRlLXRvLXN0cmluZyB2YWx1ZSkpKSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL3RocmlmdC10dXRvcmlhbC5hc2QgYi90dXRvcmlhbC9jbC90aHJpZnQtdHV0b3JpYWwuYXNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDM1MzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC90aHJpZnQtdHV0b3JpYWwuYXNkCkBAIC0wLDAgKzEsMTcgQEAKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGFzZGY6ZGVmc3lzdGVtICM6dGhyaWZ0LXR1dG9yaWFsCisgIDpkZXBlbmRzLW9uICgjOnRocmlmdC1nZW4tdHV0b3JpYWwpCisgIDpzZXJpYWwgdAorICA6Y29tcG9uZW50cyAoKDpmaWxlICJzaGFyZWQtaW1wbGVtZW50YXRpb24iKQorICAgICAgICAgICAgICAgKDpmaWxlICJ0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbiIpKSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AgYi90dXRvcmlhbC9jbC90dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTJmZTQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC90dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwCkBAIC0wLDAgKzEsNDEgQEAKKyhpbi1wYWNrYWdlICM6dHV0b3JpYWwtaW1wbGVtZW50YXRpb24pCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246cGluZyAoKQorICAoZm9ybWF0IHQgInBpbmcoKX4lIikpCisKKyhkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmFkZCAobnVtMSBudW0yKQorICAoZm9ybWF0IHQgImFkZCh+YSwgfmEpfiUiIG51bTEgbnVtMikKKyAgKCsgbnVtMSBudW0yKSkKKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246Y2FsY3VsYXRlIChsb2dpZCB3b3JrKQorICAoZm9ybWF0IHQgImNhbGN1bGF0ZSh+YSwgfmEpfiUiIGxvZ2lkIHdvcmspCisgIChoYW5kbGVyLWNhc2UKKyAgICAgIChsZXQqICgobnVtMSAodHV0b3JpYWw6d29yay1udW0xIHdvcmspKQorICAgICAgICAgICAgIChudW0yICh0dXRvcmlhbDp3b3JrLW51bTIgd29yaykpCisgICAgICAgICAgICAgKG9wICh0dXRvcmlhbDp3b3JrLW9wIHdvcmspKQorICAgICAgICAgICAgIChyZXN1bHQKKyAgICAgICAgICAgICAgKGNvbmQKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLmFkZCkgKCsgbnVtMSBudW0yKSkKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLnN1YnRyYWN0KSAoLSBudW0xIG51bTIpKQorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24ubXVsdGlwbHkpICgqIG51bTEgbnVtMikpCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5kaXZpZGUpICgvIG51bTEgbnVtMikpKSkpCisgICAgICAgIChzaGFyZWQtaW1wbGVtZW50YXRpb246OmFkZC1sb2cgbG9naWQgcmVzdWx0KQorICAgICAgICByZXN1bHQpCisgICAgKGRpdmlzaW9uLWJ5LXplcm8gKCkgKGVycm9yICd0dXRvcmlhbDppbnZhbGlkb3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aHkgIkRpdmlzaW9uIGJ5IHplcm8uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2hhdC1vcCAodHV0b3JpYWw6d29yay1vcCB3b3JrKSkpKSkKKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246emlwICgpCisgIChmb3JtYXQgdCAiemlwKCl+JSIpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0IGIvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzRiNDEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQorCisjTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9jcHAvc3JjIikKKworaW5jbHVkZShUaHJpZnRNYWNyb3MpCisKK3NldCh0dXRvcmlhbGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcAorICAgIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAKKyAgICBnZW4tY3BwL3NoYXJlZF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAKKykKK2FkZF9saWJyYXJ5KHR1dG9yaWFsZ2VuY3BwIFNUQVRJQyAke3R1dG9yaWFsZ2VuY3BwX1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHR1dG9yaWFsZ2VuY3BwIHRocmlmdCkKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAgZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKykKKworYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxTZXJ2ZXIgQ3BwU2VydmVyLmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbFNlcnZlciB0dXRvcmlhbGdlbmNwcCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbFNlcnZlciB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsU2VydmVyICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKKworYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxDbGllbnQgQ3BwQ2xpZW50LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbENsaWVudCB0dXRvcmlhbGdlbmNwcCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbENsaWVudCB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsQ2xpZW50ICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKaW5kZXggYTNmMTdmZS4uNTIwODQxMSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKKysrIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKQEAgLTE3LDEzICsxNywxMSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KIAotI2luY2x1ZGUgPHByb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogCiAjaW5jbHVkZSAiLi4vZ2VuLWNwcC9DYWxjdWxhdG9yLmgiCiAKQEAgLTM1LDUwICszMyw0OCBAQAogdXNpbmcgbmFtZXNwYWNlIHR1dG9yaWFsOwogdXNpbmcgbmFtZXNwYWNlIHNoYXJlZDsKIAotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApKTsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CitpbnQgbWFpbigpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CiAgIENhbGN1bGF0b3JDbGllbnQgY2xpZW50KHByb3RvY29sKTsKIAogICB0cnkgewogICAgIHRyYW5zcG9ydC0+b3BlbigpOwogCiAgICAgY2xpZW50LnBpbmcoKTsKLSAgICBwcmludGYoInBpbmcoKVxuIik7CisgICAgY291dCA8PCAicGluZygpIiA8PCBlbmRsOwogCi0gICAgaW50MzJfdCBzdW0gPSBjbGllbnQuYWRkKDEsMSk7Ci0gICAgcHJpbnRmKCIxKzE9JWRcbiIsIHN1bSk7CisgICAgY291dCA8PCAiMSArIDEgPSAiIDw8IGNsaWVudC5hZGQoMSwgMSkgPDwgZW5kbDsKIAogICAgIFdvcmsgd29yazsKLSAgICB3b3JrLm9wID0gRElWSURFOworICAgIHdvcmsub3AgPSBPcGVyYXRpb246OkRJVklERTsKICAgICB3b3JrLm51bTEgPSAxOwogICAgIHdvcmsubnVtMiA9IDA7CiAKICAgICB0cnkgewotICAgICAgaW50MzJfdCBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgICBwcmludGYoIldob2E/IFdlIGNhbiBkaXZpZGUgYnkgemVybyFcbiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gJmlvKSB7Ci0gICAgICBwcmludGYoIkludmFsaWRPcGVyYXRpb246ICVzXG4iLCBpby53aHkuY19zdHIoKSk7CisgICAgICBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworICAgICAgY291dCA8PCAiV2hvYT8gV2UgY2FuIGRpdmlkZSBieSB6ZXJvISIgPDwgZW5kbDsKKyAgICB9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uJiBpbykgeworICAgICAgY291dCA8PCAiSW52YWxpZE9wZXJhdGlvbjogIiA8PCBpby53aHkgPDwgZW5kbDsKKyAgICAgIC8vIG9yIHVzaW5nIGdlbmVyYXRlZCBvcGVyYXRvcjw8OiBjb3V0IDw8IGlvIDw8IGVuZGw7CisgICAgICAvLyBvciBieSB1c2luZyBzdGQ6OmV4Y2VwdGlvbiBuYXRpdmUgbWV0aG9kIHdoYXQoKTogY291dCA8PCBpby53aGF0KCkgPDwgZW5kbDsKICAgICB9CiAKLSAgICB3b3JrLm9wID0gU1VCVFJBQ1Q7CisgICAgd29yay5vcCA9IE9wZXJhdGlvbjo6U1VCVFJBQ1Q7CiAgICAgd29yay5udW0xID0gMTU7CiAgICAgd29yay5udW0yID0gMTA7CiAgICAgaW50MzJfdCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKLSAgICBwcmludGYoIjE1LTEwPSVkXG4iLCBkaWZmKTsKKyAgICBjb3V0IDw8ICIxNSAtIDEwID0gIiA8PCBkaWZmIDw8IGVuZGw7CiAKICAgICAvLyBOb3RlIHRoYXQgQysrIHVzZXMgcmV0dXJuIGJ5IHJlZmVyZW5jZSBmb3IgY29tcGxleCB0eXBlcyB0byBhdm9pZAogICAgIC8vIGNvc3RseSBjb3B5IGNvbnN0cnVjdGlvbgogICAgIFNoYXJlZFN0cnVjdCBzczsKICAgICBjbGllbnQuZ2V0U3RydWN0KHNzLCAxKTsKLSAgICBwcmludGYoIkNoZWNrIGxvZzogJXNcbiIsIHNzLnZhbHVlLmNfc3RyKCkpOworICAgIGNvdXQgPDwgIlJlY2VpdmVkIGxvZzogIiA8PCBzcyA8PCBlbmRsOwogCiAgICAgdHJhbnNwb3J0LT5jbG9zZSgpOwotICB9IGNhdGNoIChURXhjZXB0aW9uICZ0eCkgewotICAgIHByaW50ZigiRVJST1I6ICVzXG4iLCB0eC53aGF0KCkpOworICB9IGNhdGNoIChURXhjZXB0aW9uJiB0eCkgeworICAgIGNvdXQgPDwgIkVSUk9SOiAiIDw8IHR4LndoYXQoKSA8PCBlbmRsOwogICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwIGIvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAKaW5kZXggMjNjMmI4My4uZjczNzlkNSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAKKysrIGIvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAKQEAgLTE3LDE0ICsxNywxNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGNvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxzZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHNlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgPHRyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CkBAIC0zNCw2ICszNiw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7CkBAIC00MSwzOSArNDQsMzUgQEAKIHVzaW5nIG5hbWVzcGFjZSB0dXRvcmlhbDsKIHVzaW5nIG5hbWVzcGFjZSBzaGFyZWQ7CiAKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKLQogY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgOiBwdWJsaWMgQ2FsY3VsYXRvcklmIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENhbGN1bGF0b3JIYW5kbGVyKCkge30KIAotICB2b2lkIHBpbmcoKSB7Ci0gICAgcHJpbnRmKCJwaW5nKClcbiIpOwotICB9CisgIHZvaWQgcGluZygpIHsgY291dCA8PCAicGluZygpIiA8PCBlbmRsOyB9CiAKICAgaW50MzJfdCBhZGQoY29uc3QgaW50MzJfdCBuMSwgY29uc3QgaW50MzJfdCBuMikgewotICAgIHByaW50ZigiYWRkKCVkLCVkKVxuIiwgbjEsIG4yKTsKKyAgICBjb3V0IDw8ICJhZGQoIiA8PCBuMSA8PCAiLCAiIDw8IG4yIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiBuMSArIG4yOwogICB9CiAKLSAgaW50MzJfdCBjYWxjdWxhdGUoY29uc3QgaW50MzJfdCBsb2dpZCwgY29uc3QgV29yayAmd29yaykgewotICAgIHByaW50ZigiY2FsY3VsYXRlKCVkLHslZCwlZCwlZH0pXG4iLCBsb2dpZCwgd29yay5vcCwgd29yay5udW0xLCB3b3JrLm51bTIpOworICBpbnQzMl90IGNhbGN1bGF0ZShjb25zdCBpbnQzMl90IGxvZ2lkLCBjb25zdCBXb3JrJiB3b3JrKSB7CisgICAgY291dCA8PCAiY2FsY3VsYXRlKCIgPDwgbG9naWQgPDwgIiwgIiA8PCB3b3JrIDw8ICIpIiA8PCBlbmRsOwogICAgIGludDMyX3QgdmFsOwogCiAgICAgc3dpdGNoICh3b3JrLm9wKSB7Ci0gICAgY2FzZSBBREQ6CisgICAgY2FzZSBPcGVyYXRpb246OkFERDoKICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VCVFJBQ1Q6CisgICAgY2FzZSBPcGVyYXRpb246OlNVQlRSQUNUOgogICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNVUxUSVBMWToKKyAgICBjYXNlIE9wZXJhdGlvbjo6TVVMVElQTFk6CiAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTI7CiAgICAgICBicmVhazsKLSAgICBjYXNlIERJVklERToKKyAgICBjYXNlIE9wZXJhdGlvbjo6RElWSURFOgogICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CiAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW87Ci0gICAgICAgIGlvLndoYXQgPSB3b3JrLm9wOworICAgICAgICBpby53aGF0T3AgPSB3b3JrLm9wOwogICAgICAgICBpby53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKICAgICAgICAgdGhyb3cgaW87CiAgICAgICB9CkBAIC04MSw3NCArODAsMTAwIEBACiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbzsKLSAgICAgIGlvLndoYXQgPSB3b3JrLm9wOworICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKICAgICAgIGlvLndoeSA9ICJJbnZhbGlkIE9wZXJhdGlvbiI7CiAgICAgICB0aHJvdyBpbzsKICAgICB9CiAKICAgICBTaGFyZWRTdHJ1Y3Qgc3M7CiAgICAgc3Mua2V5ID0gbG9naWQ7Ci0gICAgY2hhciBidWZmZXJbMTJdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZCIsIHZhbCk7Ci0gICAgc3MudmFsdWUgPSBidWZmZXI7CisgICAgc3MudmFsdWUgPSB0b19zdHJpbmcodmFsKTsKIAogICAgIGxvZ1tsb2dpZF0gPSBzczsKIAogICAgIHJldHVybiB2YWw7CiAgIH0KIAotICB2b2lkIGdldFN0cnVjdChTaGFyZWRTdHJ1Y3QgJnJldCwgY29uc3QgaW50MzJfdCBsb2dpZCkgewotICAgIHByaW50ZigiZ2V0U3RydWN0KCVkKVxuIiwgbG9naWQpOworICB2b2lkIGdldFN0cnVjdChTaGFyZWRTdHJ1Y3QmIHJldCwgY29uc3QgaW50MzJfdCBsb2dpZCkgeworICAgIGNvdXQgPDwgImdldFN0cnVjdCgiIDw8IGxvZ2lkIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldCA9IGxvZ1tsb2dpZF07CiAgIH0KIAotICB2b2lkIHppcCgpIHsKLSAgICBwcmludGYoInppcCgpXG4iKTsKLSAgfQorICB2b2lkIHppcCgpIHsgY291dCA8PCAiemlwKCkiIDw8IGVuZGw7IH0KIAogcHJvdGVjdGVkOgogICBtYXA8aW50MzJfdCwgU2hhcmVkU3RydWN0PiBsb2c7Ci0KIH07CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworLyoKKyAgQ2FsY3VsYXRvcklmRmFjdG9yeSBpcyBjb2RlIGdlbmVyYXRlZC4KKyAgQ2FsY3VsYXRvckNsb25lRmFjdG9yeSBpcyB1c2VmdWwgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUKKyAgdHJhbnNwb3J0LiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIG1ha2luZyBwZXItY29ubmVjdGlvbiBzdGF0ZS4gIFdpdGhvdXQgdGhpcworICBDbG9uZUZhY3RvcnksIGFsbCBjb25uZWN0aW9ucyB3aWxsIGVuZCB1cCBzaGFyaW5nIHRoZSBzYW1lIGhhbmRsZXIgaW5zdGFuY2UuCisqLworY2xhc3MgQ2FsY3VsYXRvckNsb25lRmFjdG9yeSA6IHZpcnR1YWwgcHVibGljIENhbGN1bGF0b3JJZkZhY3RvcnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q2FsY3VsYXRvckNsb25lRmFjdG9yeSgpIHt9CisgIHZpcnR1YWwgQ2FsY3VsYXRvcklmKiBnZXRIYW5kbGVyKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29jayA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNvY2tldD4oY29ubkluZm8udHJhbnNwb3J0KTsKKyAgICBjb3V0IDw8ICJJbmNvbWluZyBjb25uZWN0aW9uXG4iOworICAgIGNvdXQgPDwgIlx0U29ja2V0SW5mbzogIiAgPDwgc29jay0+Z2V0U29ja2V0SW5mbygpIDw8ICJcbiI7CisgICAgY291dCA8PCAiXHRQZWVySG9zdDogIiAgICA8PCBzb2NrLT5nZXRQZWVySG9zdCgpIDw8ICJcbiI7CisgICAgY291dCA8PCAiXHRQZWVyQWRkcmVzczogIiA8PCBzb2NrLT5nZXRQZWVyQWRkcmVzcygpIDw8ICJcbiI7CisgICAgY291dCA8PCAiXHRQZWVyUG9ydDogIiAgICA8PCBzb2NrLT5nZXRQZWVyUG9ydCgpIDw8ICJcbiI7CisgICAgcmV0dXJuIG5ldyBDYWxjdWxhdG9ySGFuZGxlcjsKKyAgfQorICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIDo6c2hhcmVkOjpTaGFyZWRTZXJ2aWNlSWYqIGhhbmRsZXIpIHsKKyAgICBkZWxldGUgaGFuZGxlcjsKKyAgfQorfTsKIAotICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLSAgc2hhcmVkX3B0cjxDYWxjdWxhdG9ySGFuZGxlcj4gaGFuZGxlcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSk7Ci0gIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKGhhbmRsZXIpKTsKLSAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCkpOwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworaW50IG1haW4oKSB7CisgIFRUaHJlYWRlZFNlcnZlciBzZXJ2ZXIoCisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yQ2xvbmVGYWN0b3J5PigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLCAvL3BvcnQKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKIAotICBUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KTsKLQotCi0gIC8qKgotICAgKiBPciB5b3UgY291bGQgZG8gb25lIG9mIHRoZXNlCi0KLSAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KLSAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKLSAgc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPQotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwotICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotICBUVGhyZWFkUG9vbFNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZE1hbmFnZXIpOwotCi0gIFRUaHJlYWRlZFNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KKyAgLyoKKyAgLy8gaWYgeW91IGRvbid0IG5lZWQgcGVyLWNvbm5lY3Rpb24gc3RhdGUsIGRvIHRoZSBmb2xsb3dpbmcgaW5zdGVhZAorICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9ySGFuZGxlcj4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAgICovCiAKLSAgcHJpbnRmKCJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iKTsKKyAgLyoqCisgICAqIEhlcmUgYXJlIHNvbWUgYWx0ZXJuYXRlIHNlcnZlciB0eXBlcy4uLgorCisgIC8vIFRoaXMgc2VydmVyIG9ubHkgYWxsb3dzIG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZSwgYnV0IHNwYXducyBubyB0aHJlYWRzCisgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9ySGFuZGxlcj4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKKworICBjb25zdCBpbnQgd29ya2VyQ291bnQgPSA0OworCisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KKyAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKKyAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSgKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4oKSk7CisgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisKKyAgLy8gVGhpcyBzZXJ2ZXIgYWxsb3dzICJ3b3JrZXJDb3VudCIgY29ubmVjdGlvbiBhdCBhIHRpbWUsIGFuZCByZXVzZXMgdGhyZWFkcworICBUVGhyZWFkUG9vbFNlcnZlciBzZXJ2ZXIoCisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yQ2xvbmVGYWN0b3J5PigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCksCisgICAgdGhyZWFkTWFuYWdlcik7CisgICovCisKKyAgY291dCA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIgPDwgZW5kbDsKICAgc2VydmVyLnNlcnZlKCk7Ci0gIHByaW50ZigiZG9uZS5cbiIpOworICBjb3V0IDw8ICJEb25lLiIgPDwgZW5kbDsKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvTWFrZWZpbGUgYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MzRkZWUuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUJPT1NUX0RJUiA9IC91c3IvbG9jYWwvYm9vc3QvaW5jbHVkZS9ib29zdC0xXzMzXzEvCi1USFJJRlRfRElSID0gL3Vzci9sb2NhbC9pbmNsdWRlL3RocmlmdAotTElCX0RJUiA9IC91c3IvbG9jYWwvbGliCi0KLUdFTl9TUkMgPSAuLi9nZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIC4uL2dlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCAuLi9nZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcCAuLi9nZW4tY3BwL0NhbGN1bGF0b3IuY3BwCi0KLWRlZmF1bHQ6IHNlcnZlciBjbGllbnQKLQotc2VydmVyOiBDcHBTZXJ2ZXIuY3BwCi0JZysrIC1vIENwcFNlcnZlciAtSSR7VEhSSUZUX0RJUn0gLUkke0JPT1NUX0RJUn0gIC1JLi4vZ2VuLWNwcCAtTCR7TElCX0RJUn0gLWx0aHJpZnQgQ3BwU2VydmVyLmNwcCAke0dFTl9TUkN9Ci0KLWNsaWVudDogQ3BwQ2xpZW50LmNwcAotCWcrKyAtbyBDcHBDbGllbnQgLUkke1RIUklGVF9ESVJ9IC1JJHtCT09TVF9ESVJ9ICAtSS4uL2dlbi1jcHAgLUwke0xJQl9ESVJ9IC1sdGhyaWZ0IENwcENsaWVudC5jcHAgJHtHRU5fU1JDfQotCi1jbGVhbjoKLQkkKFJNKSAtciBDcHBDbGllbnQgQ3BwU2VydmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDljZjNiZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NwcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDg2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidHV0b3JpYWxnZW5jcHAubGEKK25vZGlzdF9saWJ0dXRvcmlhbGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvQ2FsY3VsYXRvci5jcHAgXAorCWdlbi1jcHAvQ2FsY3VsYXRvci5oIFwKKwlnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL1NoYXJlZFNlcnZpY2UuaCBcCisJZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9zaGFyZWRfdHlwZXMuaCBcCisJZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL3R1dG9yaWFsX2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcCBcCisJZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5oCisKKworCitsaWJ0dXRvcmlhbGdlbmNwcF9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworbm9pbnN0X1BST0dSQU1TID0gXAorCVR1dG9yaWFsU2VydmVyIFwKKwlUdXRvcmlhbENsaWVudAorCitUdXRvcmlhbFNlcnZlcl9TT1VSQ0VTID0gXAorCUNwcFNlcnZlci5jcHAKKworVHV0b3JpYWxTZXJ2ZXJfTERBREQgPSBcCisJbGlidHV0b3JpYWxnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitUdXRvcmlhbENsaWVudF9TT1VSQ0VTID0gXAorCUNwcENsaWVudC5jcHAKKworVHV0b3JpYWxDbGllbnRfTERBREQgPSBcCisJbGlidHV0b3JpYWxnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCitnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAgZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgLXIgJDwKKworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAkKExJQkVWRU5UX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLUlnZW4tY3BwCitBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCitBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKSAkKExJQkVWRU5UX0xERkxBR1MpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIGdlbi1jcHAvKgorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJLi9UdXRvcmlhbFNlcnZlcgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJLi9UdXRvcmlhbENsaWVudAorCitzdHlsZS1sb2NhbDoKKwkkKENQUFNUWUxFX0NNRCkKKworRVhUUkFfRElTVCA9IFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJQ3BwQ2xpZW50LmNwcCBcCisJQ3BwU2VydmVyLmNwcApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTNhNDcyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3MKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKKworbmFtZXNwYWNlIENTaGFycFR1dG9yaWFsCit7CisgICAgcHVibGljIGNsYXNzIENTaGFycENsaWVudAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgQ2FsY3VsYXRvci5DbGllbnQgY2xpZW50ID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKTsKKworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbGllbnQucGluZygpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicGluZygpIik7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IHN1bSA9IGNsaWVudC5hZGQoMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxKzE9ezB9Iiwgc3VtKTsKKworICAgICAgICAgICAgICAgICAgICBXb3JrIHdvcmsgPSBuZXcgV29yaygpOworCisgICAgICAgICAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uRElWSURFOworICAgICAgICAgICAgICAgICAgICB3b3JrLk51bTEgPSAxOworICAgICAgICAgICAgICAgICAgICB3b3JrLk51bTIgPSAwOworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby5XaHkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd29yay5PcCA9IE9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgICAgICAgICAgICAgICAgICAgd29yay5OdW0xID0gMTU7CisgICAgICAgICAgICAgICAgICAgIHdvcmsuTnVtMiA9IDEwOworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIjE1LTEwPXswfSIsIGRpZmYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby5XaHkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU2hhcmVkU3RydWN0IGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDaGVjayBsb2c6IHswfSIsIGxvZy5WYWx1ZSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzcHJvaiBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWE3ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMTEwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+Q3NoYXJwQ2xpZW50PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+Q3NoYXJwQ2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIj4KKyAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXENhbGN1bGF0b3IuY3MiPgorICAgICAgPExpbms+Q2FsY3VsYXRvci5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxJbnZhbGlkT3BlcmF0aW9uLmNzIj4KKyAgICAgIDxMaW5rPkludmFsaWRPcGVyYXRpb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcT3BlcmF0aW9uLmNzIj4KKyAgICAgIDxMaW5rPk9wZXJhdGlvbi5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxTaGFyZWRTZXJ2aWNlLmNzIj4KKyAgICAgIDxMaW5rPlNoYXJlZFNlcnZpY2UuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU2hhcmVkU3RydWN0LmNzIj4KKyAgICAgIDxMaW5rPlNoYXJlZFN0cnVjdC5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFx0dXRvcmlhbC5Db25zdGFudHMuY3MiPgorICAgICAgPExpbms+dHV0b3JpYWwuQ29uc3RhbnRzLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFdvcmsuY3MiPgorICAgICAgPExpbms+V29yay5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ3NoYXJwQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTllYjYzYy1kNzRjLTQ3ZTgtYWU0OC1hMmZjOTQ1MzhlOWR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnB1c2hkICIkKFNvbHV0aW9uRGlyKSIKK3RocmlmdCAgLWdlbiBjc2hhcnAgICAtciAgLi4vdHV0b3JpYWwudGhyaWZ0Citwb3BkCis8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjY1OGMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCIxYTQ2MTIxNC1mYTI4LTQ1MmEtYmQxZC1kMjNjYThlOTQ3ZTMiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk3OTBhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3MKQEAgLTAsMCArMSwxMjkgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBDU2hhcnBUdXRvcmlhbAoreworICAgIHB1YmxpYyBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IENhbGN1bGF0b3IuSWZhY2UKKyAgICB7CisgICAgICAgIERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+IGxvZzsKKworICAgICAgICBwdWJsaWMgQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicGluZygpIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZChpbnQgbjEsIGludCBuMikKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImFkZCh7MH0sezF9KSIsIG4xLCBuMik7CisgICAgICAgICAgICByZXR1cm4gbjEgKyBuMjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiY2FsY3VsYXRlKHswfSwgW3sxfSx7Mn0sezN9XSkiLCBsb2dpZCwgd29yay5PcCwgd29yay5OdW0xLCB3b3JrLk51bTIpOworICAgICAgICAgICAgaW50IHZhbCA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKHdvcmsuT3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKyB3b3JrLk51bTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAtIHdvcmsuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICogd29yay5OdW0yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmsuTnVtMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoYXRPcCA9IChpbnQpd29yay5PcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC8gd29yay5OdW0yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2hhdE9wID0gKGludCl3b3JrLk9wOworICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2h5ID0gIlVua25vd24gb3BlcmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNoYXJlZFN0cnVjdCBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICAgICAgICAgIGVudHJ5LktleSA9IGxvZ2lkOworICAgICAgICAgICAgZW50cnkuVmFsdWUgPSB2YWwuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGxvZ1tsb2dpZF0gPSBlbnRyeTsKKworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTaGFyZWRTdHJ1Y3QgZ2V0U3RydWN0KGludCBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJnZXRTdHJ1Y3QoezB9KSIsIGtleSk7CisgICAgICAgICAgICByZXR1cm4gbG9nW2tleV07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB6aXAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiemlwKCkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDU2hhcnBTZXJ2ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FsY3VsYXRvckhhbmRsZXIgaGFuZGxlciA9IG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpOworICAgICAgICAgICAgICAgIENhbGN1bGF0b3IuUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICAgICAgICAgICAgICAgIFRTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgLy8gVXNlIHRoaXMgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuU2VydmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSh4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jc3Byb2ogYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0ODE4MAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzcHJvagpAQCAtMCwwICsxLDExMSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIzLjUiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkNzaGFycFNlcnZlcjwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkNzaGFycFNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIj4KKyAgICAgIDxMaW5rPkNhbGN1bGF0b3IuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcSW52YWxpZE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5JbnZhbGlkT3BlcmF0aW9uLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyI+CisgICAgICA8TGluaz5PcGVyYXRpb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU2hhcmVkU2VydmljZS5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTZXJ2aWNlLmNzPC9MaW5rPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyI+CisgICAgICA8TGluaz5TaGFyZWRTdHJ1Y3QuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcdHV0b3JpYWwuQ29uc3RhbnRzLmNzIj4KKyAgICAgIDxMaW5rPnR1dG9yaWFsLkNvbnN0YW50cy5jczwvTGluaz4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxXb3JrLmNzIj4KKyAgICAgIDxMaW5rPldvcmsuY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNzaGFycFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5ZWI2M2MtZDc0Yy00N2U4LWFlNDgtYTJmYzk0NTM4ZTlkfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5wdXNoZCAiJChTb2x1dGlvbkRpcikiCit0aHJpZnQgIC1nZW4gY3NoYXJwICAgLXIgIC4uL3R1dG9yaWFsLnRocmlmdAorcG9wZAorCis8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZmE0NzYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBTZXJ2ZXIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCJlM2I0MjhmNC1iMmU5LTRmYzEtOGEzNC04NGFiYzQzMzk4NjAiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKy8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL3R1dG9yaWFsLnNsbiBiL3R1dG9yaWFsL2NzaGFycC90dXRvcmlhbC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1N2ExOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NzaGFycC90dXRvcmlhbC5zbG4KQEAgLTAsMCArMSwzOSBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTAKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNzaGFycENsaWVudCIsICJDc2hhcnBDbGllbnRcQ3NoYXJwQ2xpZW50LmNzcHJvaiIsICJ7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfSIKKyAgICBQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9ID0gezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0KKyAgICAgICAgezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0gPSB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fQorICAgIEVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNzaGFycFNlcnZlciIsICJDc2hhcnBTZXJ2ZXJcQ3NoYXJwU2VydmVyLmNzcHJvaiIsICJ7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fSIKKyAgICBQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9ID0gezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0KKyAgICBFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorR2xvYmFsCisgICAgR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKyAgICAgICAgRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgRW5kR2xvYmFsU2VjdGlvbgorICAgIEdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKyAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKyAgICAgICAgezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorICAgICAgICB7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorICAgICAgICB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorICAgICAgICB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgICAgIHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgRW5kR2xvYmFsU2VjdGlvbgorICAgIEdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisgICAgICAgIEhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorICAgIEVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjOGIyOQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0xJQl9EX0RJUiA9ICQodG9wX3NyY2RpcikvbGliL2QKKworR0VOX1NSQyA9IGdlbi1kL3NoYXJlL1NoYXJlZFNlcnZpY2UuZCBnZW4tZC9zaGFyZS9zaGFyZWRfdHlwZXMuZCBcCisJZ2VuLWQvdHV0b3JpYWwvdHV0b3JpYWxfdHlwZXMuZCBnZW4tZC90dXRvcmlhbC9DYWxjdWxhdG9yLmQKKworJChHRU5fU1JDKTogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBkIC1yICQ8CisKK3NlcnZlcjogc2VydmVyLmQgJChHRU5fU1JDKQorCSQoRE1EKSAtSSR7TElCX0RfRElSfS9zcmMgLUwtTCR7TElCX0RfRElSfSAtTC1sdGhyaWZ0ZCBzZXJ2ZXIuZCAke0dFTl9TUkN9CisKK2NsaWVudDogY2xpZW50LmQgJChHRU5fU1JDKQorCSQoRE1EKSAtSSR7TElCX0RfRElSfS9zcmMgLUwtTCR7TElCX0RfRElSfSAtTC1sdGhyaWZ0ZCBjbGllbnQuZCAke0dFTl9TUkN9CisKK1BST0dTID0gc2VydmVyIGNsaWVudAorCitpZiBXSVRIX0RfRVZFTlRfVEVTVFMKK2FzeW5jX2NsaWVudDogYXN5bmNfY2xpZW50LmQgJChHRU5fU1JDKQorCSQoRE1EKSAtSSR7TElCX0RfRElSfS9zcmMgLUwtTCR7TElCX0RfRElSfSAtTC1sdGhyaWZ0ZC1ldmVudCAtTC1sdGhyaWZ0ZCAtTC1sZXZlbnQgYXN5bmNfY2xpZW50LmQgJHtHRU5fU1JDfQorCitQUk9HUyArPSBhc3luY19jbGllbnQKK2VuZGlmCisKK2FsbC1sb2NhbDogJChQUk9HUykKKworY2xlYW46CisJJChSTSkgLWYgJChQUk9HUykKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2QvYXN5bmNfY2xpZW50LmQgYi90dXRvcmlhbC9kL2FzeW5jX2NsaWVudC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZWZjZTAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kL2FzeW5jX2NsaWVudC5kCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSBhc3luY19jbGllbnQ7CisKK2ltcG9ydCBzdGQuZXhjZXB0aW9uOworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCB0aHJpZnQuYXN5bmMubGliZXZlbnQ7CitpbXBvcnQgdGhyaWZ0LmFzeW5jLnNvY2tldDsKK2ltcG9ydCB0aHJpZnQuYmFzZTsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5hc3luY19jbGllbnQ7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOworCitpbXBvcnQgdHV0b3JpYWwuQ2FsY3VsYXRvcjsKK2ltcG9ydCB0dXRvcmlhbC50dXRvcmlhbF90eXBlczsKKwordm9pZCBtYWluKCkgeworICBhdXRvIGFzeW5jTWFuYWdlciA9IG5ldyBUTGliZXZlbnRBc3luY01hbmFnZXI7CisKKyAgLy8gSWYgd2UgYXJlIGRvbmUsIGdyYWNlZnVsbHkgc3RvcCB0aGUgYXN5bmMgbWFuYWdlciB0byBhdm9pZCBoYW5naW5nIG9uCisgIC8vIGFwcHBsaWNhdGlvbiBzaHV0ZG93bi4KKyAgc2NvcGUgKGV4aXQpIGFzeW5jTWFuYWdlci5zdG9wKCk7CisKKyAgYXV0byBzb2NrZXQgPSBuZXcgVEFzeW5jU29ja2V0KGFzeW5jTWFuYWdlciwgImxvY2FsaG9zdCIsIDkwOTApOworICBhdXRvIGNsaWVudCA9IG5ldyBUQXN5bmNDbGllbnQhQ2FsY3VsYXRvcigKKyAgICBzb2NrZXQsCisgICAgbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksCisgICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkhVEJ1ZmZlcmVkVHJhbnNwb3J0CisgICk7CisKKyAgc29ja2V0Lm9wZW4oKTsKKworICAvLyBJbnZva2UgYWxsIHRoZSBtZXRob2RzLgorICBhdXRvIHBpbmdSZXN1bHQgPSBjbGllbnQucGluZygpOworCisgIGF1dG8gYWRkUmVzdWx0ID0gY2xpZW50LmFkZCgxLCAxKTsKKworICBhdXRvIHdvcmsgPSBXb3JrKCk7CisgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFOworICB3b3JrLm51bTEgPSAxOworICB3b3JrLm51bTIgPSAwOworICBhdXRvIHF1b3RpZW50UmVzdWx0ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKworICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUOworICB3b3JrLm51bTEgPSAxNTsKKyAgd29yay5udW0yID0gMTA7CisgIGF1dG8gZGlmZlJlc3VsdCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisKKyAgYXV0byBsb2dSZXN1bHQgPSBjbGllbnQuZ2V0U3RydWN0KDEpOworCisgIC8vIEF3YWl0IHRoZSByZXNwb25zZXMuCisgIHBpbmdSZXN1bHQud2FpdEdldCgpOworICB3cml0ZWxuKCJwaW5nKCkiKTsKKworICBpbnQgc3VtID0gYWRkUmVzdWx0LndhaXRHZXQoKTsKKyAgd3JpdGVmbG4oIjEgKyAxID0gJXMiLCBzdW0pOworCisgIHRyeSB7CisgICAgcXVvdGllbnRSZXN1bHQud2FpdEdldCgpOworICAgIHdyaXRlbG4oIldob2Egd2UgY2FuIGRpdmlkZSBieSAwIik7CisgIH0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pIHsKKyAgICB3cml0ZWxuKCJJbnZhbGlkIG9wZXJhdGlvbjogIiB+IGlvLndoeSk7CisgIH0KKworICB3cml0ZWZsbigiMTUgLSAxMCA9ICVzIiwgZGlmZlJlc3VsdC53YWl0R2V0KCkpOworCisgIC8vIFRGdXR1cmUgaXMgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byB0aGUgcmVzdWx0IHR5cGUgdmlhIMK7YWxpYXMgdGhpc8KrLAorICAvLyBmb3Igd2hpY2ggaXQgKGVhZ2VybHksIG9mIGNvdXJzZSkgYXdhaXRzIGNvbXBsZXRpb24uCisgIHdyaXRlZmxuKCJDaGVjayBsb2c6ICVzIiwgbG9nUmVzdWx0LnZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2QvY2xpZW50LmQgYi90dXRvcmlhbC9kL2NsaWVudC5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjdhMTcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kL2NsaWVudC5kCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSBjbGllbnQ7CisKK2ltcG9ydCBzdGQuc3RkaW87CitpbXBvcnQgdGhyaWZ0LmJhc2U7CitpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKKworaW1wb3J0IHR1dG9yaWFsLkNhbGN1bGF0b3I7CitpbXBvcnQgdHV0b3JpYWwudHV0b3JpYWxfdHlwZXM7CisKK3ZvaWQgbWFpbigpIHsKKyAgYXV0byBzb2NrZXQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgIGF1dG8gdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpOworICBhdXRvIHByb3RvY29sID0gdEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgIGF1dG8gY2xpZW50ID0gdENsaWVudCFDYWxjdWxhdG9yKHByb3RvY29sKTsKKworICB0cmFuc3BvcnQub3BlbigpOworCisgIGNsaWVudC5waW5nKCk7CisgIHdyaXRlbG4oInBpbmcoKSIpOworCisgIGludCBzdW0gPSBjbGllbnQuYWRkKDEsIDEpOworICB3cml0ZWZsbigiMSArIDEgPSAlcyIsIHN1bSk7CisKKyAgYXV0byB3b3JrID0gV29yaygpOworICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERTsKKyAgd29yay5udW0xID0gMTsKKyAgd29yay5udW0yID0gMDsKKyAgdHJ5IHsKKyAgICBpbnQgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworICAgIHdyaXRlbG4oIldob2Egd2UgY2FuIGRpdmlkZSBieSAwIik7CisgIH0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pIHsKKyAgICB3cml0ZWxuKCJJbnZhbGlkIG9wZXJhdGlvbjogIiB+IGlvLndoeSk7CisgIH0KKworICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUOworICB3b3JrLm51bTEgPSAxNTsKKyAgd29yay5udW0yID0gMTA7CisgIGludCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgd3JpdGVmbG4oIjE1IC0gMTAgPSAlcyIsIGRpZmYpOworCisgIGF1dG8gbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKTsKKyAgd3JpdGVmbG4oIkNoZWNrIGxvZzogJXMiLCBsb2cudmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZC9zZXJ2ZXIuZCBiL3R1dG9yaWFsL2Qvc2VydmVyLmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjZWRjYwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2Qvc2VydmVyLmQKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK21vZHVsZSBzZXJ2ZXI7CisKK2ltcG9ydCBzdGQuY29udiA6IHRvOworaW1wb3J0IHN0ZC5zdGRpbzsKK2ltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnNpbXBsZTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKKworaW1wb3J0IHNoYXJlLlNoYXJlZFNlcnZpY2U7CitpbXBvcnQgc2hhcmUuc2hhcmVkX3R5cGVzOworaW1wb3J0IHR1dG9yaWFsLkNhbGN1bGF0b3I7CitpbXBvcnQgdHV0b3JpYWwudHV0b3JpYWxfdHlwZXM7CisKKy8qKgorICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ2FsY3VsYXRvciBpbnRlcmZhY2UgdGhhdCBpcyBjYWxsZWQgYnkKKyAqIHRoZSBzZXJ2ZXIgdG8gYW5zd2VyIHRoZSByZXF1ZXN0cy4KKyAqLworY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgOiBDYWxjdWxhdG9yIHsKKyAgdm9pZCBwaW5nKCkgeworICAgIHdyaXRlbG4oInBpbmcoKSIpOworICB9CisKKyAgaW50IGFkZChpbnQgbjEsIGludCBuMikgeworICAgIHdyaXRlZmxuKCJhZGQoJXMsJXMpIiwgbjEsIG4yKTsKKyAgICByZXR1cm4gbjEgKyBuMjsKKyAgfQorCisgIGludCBjYWxjdWxhdGUoaW50IGxvZ2lkLCByZWYgY29uc3QoV29yaykgd29yaykgeworICAgIHdyaXRlZmxuKCJjYWxjdWxhdGUoJXMsIHslcywgJXMsICVzfSkiLCBsb2dpZCwgd29yay5vcCwgd29yay5udW0xLCB3b3JrLm51bTIpOworICAgIGludCB2YWw7CisKKyAgICBzd2l0Y2ggKHdvcmsub3ApIHsKKyAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CisgICAgICAgIGF1dG8gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICBpby53aGF0T3AgPSB3b3JrLm9wOworICAgICAgICBpby53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKKyAgICAgICAgdGhyb3cgaW87CisgICAgICB9CisgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXV0byBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICBpby53aGF0T3AgPSB3b3JrLm9wOworICAgICAgaW8ud2h5ID0gIkludmFsaWQgT3BlcmF0aW9uIjsKKyAgICAgIHRocm93IGlvOworICAgIH0KKworICAgIGF1dG8gc3MgPSBTaGFyZWRTdHJ1Y3QoKTsKKyAgICBzcy5rZXkgPSBsb2dpZDsKKyAgICBzcy52YWx1ZSA9IHRvIXN0cmluZyh2YWwpOworICAgIGxvZ1tsb2dpZF0gPSBzczsKKworICAgIHJldHVybiB2YWw7CisgIH0KKworICBTaGFyZWRTdHJ1Y3QgZ2V0U3RydWN0KGludCBsb2dpZCkgeworICAgIHdyaXRlZmxuKCJnZXRTdHJ1Y3QoJXMpIiwgbG9naWQpOworICAgIHJldHVybiBsb2dbbG9naWRdOworICB9CisKKyAgdm9pZCB6aXAoKSB7CisgICAgd3JpdGVsbigiemlwKCkiKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFNoYXJlZFN0cnVjdFtpbnRdIGxvZzsKK30KKwordm9pZCBtYWluKCkgeworICBhdXRvIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpOworICBhdXRvIHByb2Nlc3NvciA9IG5ldyBUU2VydmljZVByb2Nlc3NvciFDYWxjdWxhdG9yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcik7CisgIGF1dG8gc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgIGF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworCisgIGF1dG8gc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoCisgICAgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisKKyAgd3JpdGVsbigiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0IDkwOTAuLi4iKTsKKyAgc2VydmVyLnNlcnZlKCk7CisgIHdyaXRlbG4oImRvbmUuIik7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvZGFydC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk1YWNhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDczIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQlVJTFRfU09VUkNFUyA9IGdlbi1kYXJ0L3R1dG9yaWFsL2xpYi90dXRvcmlhbC5kYXJ0IGdlbi1kYXJ0L3NoYXJlZC9saWIvc2hhcmVkLmRhcnQKKworZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQgZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gZGFydCAtciAkPAorCithbGwtbG9jYWw6IGdlbi1kYXJ0L3R1dG9yaWFsL2xpYi90dXRvcmlhbC5kYXJ0IHB1Yi1nZXQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLSoKKwlmaW5kIC4gLXR5cGUgZCAtbmFtZSAicGFja2FnZXMiIHwgeGFyZ3MgJChSTSkgLXIKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAiLnBhY2thZ2VzIiB8IHhhcmdzICQoUk0pCisJZmluZCAuIC10eXBlIGYgLW5hbWUgInB1YnNwZWMubG9jayIgfCB4YXJncyAkKFJNKQorCitwdWItZ2V0OiBwdWItZ2V0LWdlbiBwdWItZ2V0LWNsaWVudCBwdWItZ2V0LWNvbnNvbGUtY2xpZW50IHB1Yi1nZXQtc2VydmVyCisKK3B1Yi1nZXQtZ2VuOiBwdWItZ2V0LXR1dG9yaWFsIHB1Yi1nZXQtc2hhcmVkCisKK3B1Yi1nZXQtdHV0b3JpYWw6IGdlbi1kYXJ0L3R1dG9yaWFsL2xpYi90dXRvcmlhbC5kYXJ0CisJY2QgZ2VuLWRhcnQvdHV0b3JpYWw7ICR7REFSVFBVQn0gZ2V0CisKK3B1Yi1nZXQtc2hhcmVkOiBnZW4tZGFydC9zaGFyZWQvbGliL3NoYXJlZC5kYXJ0CisJY2QgZ2VuLWRhcnQvc2hhcmVkOyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LWNsaWVudDoKKwljZCBjbGllbnQ7ICR7REFSVFBVQn0gZ2V0CisKK3B1Yi1nZXQtY29uc29sZS1jbGllbnQ6CisJY2QgY29uc29sZV9jbGllbnQ7ICR7REFSVFBVQn0gZ2V0CisKK3B1Yi1nZXQtc2VydmVyOgorCWNkIHNlcnZlcjsgJHtEQVJUUFVCfSBnZXQKKwordHV0b3JpYWxzZXJ2ZXI6IHB1Yi1nZXQtZ2VuIHB1Yi1nZXQtc2VydmVyCisJJHtEQVJUfSBzZXJ2ZXIvYmluL21haW4uZGFydAorCit0dXRvcmlhbGNsaWVudDogcHViLWdldC1nZW4gcHViLWdldC1jbGllbnQKKwljZCBjbGllbnQ7ICR7REFSVFBVQn0gc2VydmUKKwordHV0b3JpYWxjb25zb2xlY2xpZW50OiBwdWItZ2V0LWNvbnNvbGUtY2xpZW50CisJJHtEQVJUfSBjb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0CisKK0VYVFJBX0RJU1QgPSBcCisJY2xpZW50L3dlYi9jbGllbnQuZGFydCBcCisJY2xpZW50L3dlYi9pbmRleC5odG1sIFwKKwljbGllbnQvd2ViL3N0eWxlcy5jc3MgXAorCWNsaWVudC9wdWJzcGVjLnlhbWwgXAorCWNvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQgXAorCWNvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbCBcCisJc2VydmVyL2Jpbi9tYWluLmRhcnQgXAorCXNlcnZlci9wdWJzcGVjLnlhbWwgXAorCWNvbnNvbGVfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIFwKKwljbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgXAorCXNlcnZlci8uYW5hbHlzaXNfb3B0aW9ucyBcCisJYnVpbGQuc2gKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvYnVpbGQuc2ggYi90dXRvcmlhbC9kYXJ0L2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYmUwNGEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2J1aWxkLnNoCkBAIC0wLDAgKzEsNTYgQEAKKyMhL2Jpbi9zaAorCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3NldCAtZTsKK3JtIC1yIGdlbi1kYXJ0IHx8IHRydWU7CisKK3RocmlmdCAtLWdlbiBkYXJ0IC4uL3NoYXJlZC50aHJpZnQ7CitjZCBnZW4tZGFydC9zaGFyZWQ7CitwdWIgZ2V0OworY2QgLi4vLi47CisKK3RocmlmdCAtLWdlbiBkYXJ0IC4uL3R1dG9yaWFsLnRocmlmdDsKK2NkIGdlbi1kYXJ0L3R1dG9yaWFsOworcHViIGdldDsKK2NkIC4uLy4uOworCitjZCBjbGllbnQ7CitwdWIgZ2V0OworY2QgLi47CisKK2NkIGNvbnNvbGVfY2xpZW50OworcHViIGdldDsKK2NkIC4uOworCitjZCBzZXJ2ZXI7CitwdWIgZ2V0OworY2QgLi47CisKK2RhcnRmbXQgLXcgZ2VuLWRhcnQ7CisKK2VjaG8gIlxuRW5qb3kgdGhlIERhcnQgdHV0b3JpYWwhIjsKK2VjaG8gIlxuVG8gcnVuIHRoZSBzZXJ2ZXI6IjsKK2VjaG8gIj4gZGFydCBzZXJ2ZXIvYmluL21haW4uZGFydCI7CitlY2hvICJcblRvIHJ1biB0aGUgY2xpZW50OiI7CitlY2hvICIjIFNlcnZlIHRoZSBhcHAgZnJvbSB0aGUgY2xpZW50IGRpcmVjdG9yeSBhbmQgdmlldyBpbiBhIGJyb3dzZXIiOworZWNobyAiPiBjZCBjbGllbnQ7IjsKK2VjaG8gIj4gcHViIHNlcnZlOyI7CitlY2hvICJcblRvIHJ1biB0aGUgY29uc29sZSBjbGllbnQ6IjsKK2VjaG8gIj4gZGFydCBjb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IjsKK2VjaG8gIiI7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZWRlMTQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9jbGllbnQKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogQSBEYXJ0IGNsaWVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBhY2hlIFRocmlmdCB0dXRvcmlhbAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBicm93c2VyOiBeMC4xMC4wCisgIHNoYXJlZDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC9zaGFyZWQKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHR1dG9yaWFsOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3R1dG9yaWFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvY2xpZW50LmRhcnQgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvY2xpZW50LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwMmQwZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9jbGllbnQuZGFydApAQCAtMCwwICsxLDI3OCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCAnZGFydDpodG1sJzsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9icm93c2VyLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnNoYXJlZC9zaGFyZWQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHV0b3JpYWwvdHV0b3JpYWwuZGFydCc7CisKKy8vLyBBZGFwdGVkIGZyb20gdGhlIEFTMyB0dXRvcmlhbAordm9pZCBtYWluKCkgeworICBuZXcgQ2FsY3VsYXRvclVJKHF1ZXJ5U2VsZWN0b3IoJyNvdXRwdXQnKSkuc3RhcnQoKTsKK30KKworY2xhc3MgQ2FsY3VsYXRvclVJIHsKKyAgZmluYWwgRGl2RWxlbWVudCBvdXRwdXQ7CisKKyAgQ2FsY3VsYXRvclVJKHRoaXMub3V0cHV0KTsKKworICBUVHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgIENhbGN1bGF0b3IgX2NhbGN1bGF0b3JDbGllbnQ7CisKKyAgdm9pZCBzdGFydCgpIHsKKyAgICBfYnVpbGRJbnRlcmZhY2UoKTsKKyAgICBfaW5pdENvbm5lY3Rpb24oKTsKKyAgfQorCisgIHZvaWQgX3ZhbGlkYXRlKCkgeworICAgIGlmICghX3RyYW5zcG9ydC5pc09wZW4pIHsKKyAgICAgIHdpbmRvdy5hbGVydCgiVGhlIHRyYW5zcG9ydCBpcyBub3Qgb3BlbiEiKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9pbml0Q29ubmVjdGlvbigpIHsKKyAgICBfdHJhbnNwb3J0ID0gbmV3IFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgbmV3IFRXZWJTb2NrZXQoVXJpLnBhcnNlKCd3czovLzEyNy4wLjAuMTo5MDkwL3dzJykpLAorICAgICAgICBuZXcgVE1lc3NhZ2VSZWFkZXIobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woX3RyYW5zcG9ydCk7CisgICAgX3RyYW5zcG9ydC5vcGVuKCk7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudCA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KHByb3RvY29sKTsKKyAgfQorCisgIHZvaWQgX2J1aWxkSW50ZXJmYWNlKCkgeworICAgIG91dHB1dC5jaGlsZHJlbi5mb3JFYWNoKChlKSB7CisgICAgICBlLnJlbW92ZSgpOworICAgIH0pOworCisgICAgX2J1aWxkUGluZ0NvbXBvbmVudCgpOworCisgICAgX2J1aWxkQWRkQ29tcG9uZW50KCk7CisKKyAgICBfYnVpbGRDYWxjdWxhdG9yQ29tcG9uZW50KCk7CisKKyAgICBfYnVpbGRHZXRTdHJ1Y3RDb21wb25lbnQoKTsKKyAgfQorCisgIHZvaWQgX2J1aWxkUGluZ0NvbXBvbmVudCgpIHsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBIZWFkaW5nRWxlbWVudC5oMygpLi50ZXh0ID0gIlBpbmciKTsKKyAgICBCdXR0b25FbGVtZW50IHBpbmdCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiUElORyIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uUGluZ0NsaWNrKTsKKyAgICBvdXRwdXQuYXBwZW5kKHBpbmdCdXR0b24pOworICB9CisKKyAgdm9pZCBfb25QaW5nQ2xpY2soTW91c2VFdmVudCBlKSB7CisgICAgX3ZhbGlkYXRlKCk7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudC5waW5nKCk7CisgIH0KKworICB2b2lkIF9idWlsZEFkZENvbXBvbmVudCgpIHsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBIZWFkaW5nRWxlbWVudC5oMygpLi50ZXh0ID0gIkFkZCIpOworICAgIElucHV0RWxlbWVudCBudW0xID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImFkZDEiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTEpOworICAgIFNwYW5FbGVtZW50IG9wID0gbmV3IFNwYW5FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICIrIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQob3ApOworICAgIElucHV0RWxlbWVudCBudW0yID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImFkZDIiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQobnVtMik7CisgICAgQnV0dG9uRWxlbWVudCBhZGRCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiPSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25BZGRDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChhZGRCdXR0b24pOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IG5ldyBTcGFuRWxlbWVudCgpCisgICAgICAuLmlkID0gImFkZFJlc3VsdCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKHJlc3VsdCk7CisgIH0KKworICB2b2lkIF9vbkFkZENsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBxdWVyeVNlbGVjdG9yKCIjYWRkMSIpOworICAgIElucHV0RWxlbWVudCBudW0yID0gcXVlcnlTZWxlY3RvcigiI2FkZDIiKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yKCIjYWRkUmVzdWx0Iik7CisKKyAgICBfY2FsY3VsYXRvckNsaWVudAorICAgICAgICAuYWRkKGludC5wYXJzZShudW0xLnZhbHVlKSwgaW50LnBhcnNlKG51bTIudmFsdWUpKQorICAgICAgICAudGhlbigoaW50IG4pIHsKKyAgICAgIHJlc3VsdC50ZXh0ID0gIiRuIjsKKyAgICB9KTsKKyAgfQorCisgIHZvaWQgX2J1aWxkQ2FsY3VsYXRvckNvbXBvbmVudCgpIHsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBIZWFkaW5nRWxlbWVudC5oMygpLi50ZXh0ID0gIkNhbGN1bGF0b3IiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjMSIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiOworICAgIG91dHB1dC5hcHBlbmQobnVtMSk7CisgICAgU2VsZWN0RWxlbWVudCBvcCA9IG5ldyBTZWxlY3RFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsY09wIgorICAgICAgLi5tdWx0aXBsZSA9IGZhbHNlCisgICAgICAuLnNlbGVjdGVkSW5kZXggPSAwCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE2cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCI7CisgICAgT3B0aW9uRWxlbWVudCBhZGRPcCA9IG5ldyBPcHRpb25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICIrIgorICAgICAgLi52YWx1ZSA9IE9wZXJhdGlvbi5BREQudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQoYWRkT3AsIDApOworICAgIE9wdGlvbkVsZW1lbnQgc3VidHJhY3RPcCA9IG5ldyBPcHRpb25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICItIgorICAgICAgLi52YWx1ZSA9IE9wZXJhdGlvbi5TVUJUUkFDVC50b1N0cmluZygpOworICAgIG9wLmFkZChzdWJ0cmFjdE9wLCAxKTsKKyAgICBPcHRpb25FbGVtZW50IG11bHRpcGx5T3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKiIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uTVVMVElQTFkudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQobXVsdGlwbHlPcCwgMik7CisgICAgT3B0aW9uRWxlbWVudCBkaXZpZGVPcCA9IG5ldyBPcHRpb25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICIvIgorICAgICAgLi52YWx1ZSA9IE9wZXJhdGlvbi5ESVZJREUudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQoZGl2aWRlT3AsIDMpOworICAgIG91dHB1dC5hcHBlbmQob3ApOworICAgIElucHV0RWxlbWVudCBudW0yID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGMyIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTIpOworICAgIEJ1dHRvbkVsZW1lbnQgY2FsY0J1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICI9IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vbkNhbGNDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChjYWxjQnV0dG9uKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBuZXcgU3BhbkVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjUmVzdWx0IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQocmVzdWx0KTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIExhYmVsRWxlbWVudCBsb2dJZExhYmVsID0gbmV3IExhYmVsRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiTG9nIElEOiIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZExhYmVsKTsKKyAgICBJbnB1dEVsZW1lbnQgbG9nSWQgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAibG9nSWQiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi52YWx1ZSA9ICIxIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWQpOworICAgIExhYmVsRWxlbWVudCBjb21tZW50TGFiZWwgPSBuZXcgTGFiZWxFbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJDb21tZW50OiIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGNvbW1lbnRMYWJlbCk7CisgICAgSW5wdXRFbGVtZW50IGNvbW1lbnQgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY29tbWVudCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiMTAwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChjb21tZW50KTsKKyAgfQorCisgIHZvaWQgX29uQ2FsY0NsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBxdWVyeVNlbGVjdG9yKCIjY2FsYzEiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjMiIpOworICAgIFNlbGVjdEVsZW1lbnQgb3AgPSBxdWVyeVNlbGVjdG9yKCIjY2FsY09wIik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gcXVlcnlTZWxlY3RvcigiI2NhbGNSZXN1bHQiKTsKKyAgICBJbnB1dEVsZW1lbnQgbG9nSWQgPSBxdWVyeVNlbGVjdG9yKCIjbG9nSWQiKTsKKyAgICBJbnB1dEVsZW1lbnQgY29tbWVudCA9IHF1ZXJ5U2VsZWN0b3IoIiNjb21tZW50Iik7CisKKyAgICBpbnQgbG9nSWRWYWx1ZSA9IGludC5wYXJzZShsb2dJZC52YWx1ZSk7CisgICAgbG9nSWQudmFsdWUgPSAobG9nSWRWYWx1ZSArIDEpLnRvU3RyaW5nKCk7CisKKyAgICBXb3JrIHdvcmsgPSBuZXcgV29yaygpOworICAgIHdvcmsubnVtMSA9IGludC5wYXJzZShudW0xLnZhbHVlKTsKKyAgICB3b3JrLm51bTIgPSBpbnQucGFyc2UobnVtMi52YWx1ZSk7CisgICAgd29yay5vcCA9IGludC5wYXJzZShvcC5vcHRpb25zW29wLnNlbGVjdGVkSW5kZXhdLnZhbHVlKTsKKyAgICB3b3JrLmNvbW1lbnQgPSBjb21tZW50LnZhbHVlOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQuY2FsY3VsYXRlKGxvZ0lkVmFsdWUsIHdvcmspLnRoZW4oKGludCBuKSB7CisgICAgICByZXN1bHQudGV4dCA9ICIkbiI7CisgICAgfSk7CisgIH0KKworICB2b2lkIF9idWlsZEdldFN0cnVjdENvbXBvbmVudCgpIHsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBIZWFkaW5nRWxlbWVudC5oMygpLi50ZXh0ID0gIkdldCBTdHJ1Y3QiKTsKKyAgICBMYWJlbEVsZW1lbnQgbG9nSWRMYWJlbCA9IG5ldyBMYWJlbEVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIlN0cnVjdCBLZXk6IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkTGFiZWwpOworICAgIElucHV0RWxlbWVudCBsb2dJZCA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJzdHJ1Y3RLZXkiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi52YWx1ZSA9ICIxIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWQpOworICAgIEJ1dHRvbkVsZW1lbnQgZ2V0U3RydWN0QnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIkdFVCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25HZXRTdHJ1Y3RDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChnZXRTdHJ1Y3RCdXR0b24pOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgVGV4dEFyZWFFbGVtZW50IHJlc3VsdCA9IG5ldyBUZXh0QXJlYUVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJnZXRTdHJ1Y3RSZXN1bHQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjMwMHB4IgorICAgICAgLi5zdHlsZS5oZWlnaHQgPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKHJlc3VsdCk7CisgIH0KKworICB2b2lkIF9vbkdldFN0cnVjdENsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgSW5wdXRFbGVtZW50IHN0cnVjdEtleSA9IHF1ZXJ5U2VsZWN0b3IoIiNzdHJ1Y3RLZXkiKTsKKyAgICBUZXh0QXJlYUVsZW1lbnQgcmVzdWx0ID0gcXVlcnlTZWxlY3RvcigiI2dldFN0cnVjdFJlc3VsdCIpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQKKyAgICAgICAgLmdldFN0cnVjdChpbnQucGFyc2Uoc3RydWN0S2V5LnZhbHVlKSkKKyAgICAgICAgLnRoZW4oKFNoYXJlZFN0cnVjdCBzKSB7CisgICAgICByZXN1bHQudGV4dCA9ICIke3MudG9TdHJpbmcoKX0iOworICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvaW5kZXguaHRtbCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YjE4NGUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvaW5kZXguaHRtbApAQCAtMCwwICsxLDM2IEBACis8IS0tCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CisgICAgPHRpdGxlPlRocmlmdCBUdXRvcmlhbDwvdGl0bGU+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJzdHlsZXMuY3NzIj4KKyAgICA8c2NyaXB0IGFzeW5jIHNyYz0iY2xpZW50LmRhcnQiIHR5cGU9ImFwcGxpY2F0aW9uL2RhcnQiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgYXN5bmMgc3JjPSJwYWNrYWdlcy9icm93c2VyL2RhcnQuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keT4KKworICA8ZGl2IGlkPSJvdXRwdXQiPjwvZGl2PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvc3R5bGVzLmNzcyBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3dlYi9zdHlsZXMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzE1MDIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvc3R5bGVzLmNzcwpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitAaW1wb3J0IHVybChodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvKTsKKworaHRtbCwgYm9keSB7CisgICAgd2lkdGg6IDEwMCU7CisgICAgaGVpZ2h0OiAxMDAlOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAxMHB4OworICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgc2Fucy1zZXJpZjsKK30KKworaDMgeworICAgIGJvcmRlci1ib3R0b206IHNvbGlkOworICAgIGJvcmRlci13aWR0aDogdGhpbjsKKyAgICBwYWRkaW5nLXRvcDogMjBweDsKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCkBAIC0wLDAgKzEsMiBAQAorYW5hbHl6ZXI6CisgIHN0cm9uZy1tb2RlOiB0cnVlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhMjA2YQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydApAQCAtMCwwICsxLDE0OSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aW8nOworCitpbXBvcnQgJ3BhY2thZ2U6YXJncy9hcmdzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmxvZ2dpbmcvbG9nZ2luZy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfY29uc29sZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0dXRvcmlhbC90dXRvcmlhbC5kYXJ0JzsKKworVFRyYW5zcG9ydCBfdHJhbnNwb3J0OworQ2FsY3VsYXRvciBfY2FsY3VsYXRvcjsKK2ludCBsb2dpZCA9IDA7CisKK2NvbnN0IE1hcDxTdHJpbmcsIGludD4gb3BlcmF0aW9uTG9va3VwID0gY29uc3QgeworICAnKyc6IE9wZXJhdGlvbi5BREQsCisgICctJzogT3BlcmF0aW9uLlNVQlRSQUNULAorICAnKic6IE9wZXJhdGlvbi5NVUxUSVBMWSwKKyAgJy8nOiBPcGVyYXRpb24uRElWSURFCit9OworCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgIExvZ2dlci5yb290LmxldmVsID0gTGV2ZWwuQUxMOworICBMb2dnZXIucm9vdC5vblJlY29yZC5saXN0ZW4oKExvZ1JlY29yZCByZWMpIHsKKyAgICBwcmludCgnJHtyZWMubGV2ZWwubmFtZX06ICR7cmVjLnRpbWV9OiAke3JlYy5tZXNzYWdlfScpOworICB9KTsKKworICB2YXIgcGFyc2VyID0gbmV3IEFyZ1BhcnNlcigpOworICBwYXJzZXIuYWRkT3B0aW9uKCdwb3J0JywgZGVmYXVsdHNUbzogJzkwOTAnLCBoZWxwOiAnVGhlIHBvcnQgdG8gY29ubmVjdCB0bycpOworCisgIEFyZ1Jlc3VsdHMgcmVzdWx0czsKKyAgdHJ5IHsKKyAgICByZXN1bHRzID0gcGFyc2VyLnBhcnNlKGFyZ3MpOworICB9IGNhdGNoIChlKSB7CisgICAgcmVzdWx0cyA9IG51bGw7CisgIH0KKworICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CisgICAgcHJpbnQocGFyc2VyLnVzYWdlKTsKKyAgICBleGl0KDApOworICB9CisKKyAgaW50IHBvcnQgPSBpbnQucGFyc2UocmVzdWx0c1sncG9ydCddKTsKKworICBfaW5pdENvbm5lY3Rpb24ocG9ydCkudGhlbigoXykgPT4gX3J1bigpKTsKK30KKworRnV0dXJlIF9pbml0Q29ubmVjdGlvbihpbnQgcG9ydCkgYXN5bmMgeworICB2YXIgc29ja2V0ID0gYXdhaXQgU29ja2V0LmNvbm5lY3QoJzEyNy4wLjAuMScsIHBvcnQpOworICBfdHJhbnNwb3J0ID0gbmV3IFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydCgKKyAgICAgIG5ldyBUVGNwU29ja2V0KHNvY2tldCksIG5ldyBUTWVzc2FnZVJlYWRlcihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIFRQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woX3RyYW5zcG9ydCk7CisgIGF3YWl0IF90cmFuc3BvcnQub3BlbigpOworCisgIF9jYWxjdWxhdG9yID0gbmV3IENhbGN1bGF0b3JDbGllbnQocHJvdG9jb2wpOworfQorCitGdXR1cmUgX3J1bigpIGFzeW5jIHsKKyAgX2hlbHAoKTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIHN0ZG91dC53cml0ZSgiPiAiKTsKKyAgICB2YXIgaW5wdXQgPSBzdGRpbi5yZWFkTGluZVN5bmMoKTsKKyAgICB2YXIgcGFydHMgPSBpbnB1dC5zcGxpdCgnICcpOworICAgIHZhciBjb21tYW5kID0gcGFydHNbMF07CisgICAgdmFyIGFyZ3MgPSBwYXJ0cy5sZW5ndGggPiAxID8gcGFydHMuc3VibGlzdCgxKSA6IFtdOworCisgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgICBjYXNlICdwaW5nJzoKKyAgICAgICAgYXdhaXQgX3BpbmcoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ2FkZCc6CisgICAgICAgIGF3YWl0IF9hZGQoaW50LnBhcnNlKGFyZ3NbMF0pLCBpbnQucGFyc2UoYXJnc1sxXSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnY2FsYyc6CisgICAgICAgIGludCBvcCA9IG9wZXJhdGlvbkxvb2t1cFthcmdzWzFdXTsKKyAgICAgICAgaWYgKCFPcGVyYXRpb24uVkFMSURfVkFMVUVTLmNvbnRhaW5zKG9wKSkgeworICAgICAgICAgIHN0ZG91dC53cml0ZWxuKCdVbmtub3duIG9wZXJhdG9yICR7YXJnc1sxXX0nKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB3b3JrID0gbmV3IFdvcmsoKQorICAgICAgICAgIC4ubnVtMSA9IGludC5wYXJzZShhcmdzWzBdKQorICAgICAgICAgIC4ub3AgPSBvcAorICAgICAgICAgIC4ubnVtMiA9IGludC5wYXJzZShhcmdzWzJdKQorICAgICAgICAgIC4uY29tbWVudCA9IGFyZ3MubGVuZ3RoID4gMyA/IGFyZ3NbM10gOiAnJzsKKworICAgICAgICBhd2FpdCBfY2FsYyh3b3JrKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ3N0cnVjdCc6CisgICAgICAgIGF3YWl0IF9zdHJ1Y3QoaW50LnBhcnNlKGFyZ3NbMF0pKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ2hlbHAnOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgX2hlbHAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQgX2hlbHAoKSB7CisgIHN0ZG91dC53cml0ZWxuKCdDb21tYW5kczonKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgaGVscCcpOworICBzdGRvdXQud3JpdGVsbignICBwaW5nJyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGFkZCB4IHknKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgY2FsYyB4IG9wIHkgW2NvbW1lbnRdJyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIHN0cnVjdCBpZCcpOworICBzdGRvdXQud3JpdGVsbignJyk7Cit9CisKK0Z1dHVyZSBfcGluZygpIGFzeW5jIHsKKyAgYXdhaXQgX2NhbGN1bGF0b3IucGluZygpOworICBzdGRvdXQud3JpdGVsbigncGluZyBzdWNjZWVkZWQnKTsKK30KKworRnV0dXJlIF9hZGQoaW50IHgsIGludCB5KSBhc3luYyB7CisgIGludCByZXN1bHQgPSBhd2FpdCBfY2FsY3VsYXRvci5hZGQoeCwgeSk7CisgIHN0ZG91dC53cml0ZWxuKCc9ICRyZXN1bHQnKTsKK30KKworRnV0dXJlIF9jYWxjKFdvcmsgd29yaykgYXN5bmMgeworICBpbnQgcmVzdWx0ID0gYXdhaXQgX2NhbGN1bGF0b3IuY2FsY3VsYXRlKGxvZ2lkKyssIHdvcmspOworICBzdGRvdXQud3JpdGVsbignPSAkcmVzdWx0Jyk7Cit9CisKK0Z1dHVyZSBfc3RydWN0KGludCBrZXkpIGFzeW5jIHsKKyAgdmFyIHN0cnVjdCA9IGF3YWl0IF9jYWxjdWxhdG9yLmdldFN0cnVjdChrZXkpOworICBzdGRvdXQud3JpdGVsbihzdHJ1Y3QudG9TdHJpbmcoKSk7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvY29uc29sZV9jbGllbnQvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGUyNmYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDM2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHR1dG9yaWFsX2NvbnNvbGVfY2xpZW50Cit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246ID4KKyAgQSBEYXJ0IGNvbnNvbGUgY2xpZW50IHRvIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGFyZ3M6IF4wLjEzLjAKKyAgY29sbGVjdGlvbjogXjEuMS4wCisgIHNoYXJlZDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC9zaGFyZWQKKyAgdGhyaWZ0OgorICAgIHBhdGg6IC4uLy4uLy4uL2xpYi9kYXJ0CisgIHR1dG9yaWFsOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3R1dG9yaWFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L3NlcnZlci8uYW5hbHlzaXNfb3B0aW9ucyBiL3R1dG9yaWFsL2RhcnQvc2VydmVyLy5hbmFseXNpc19vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvYmluL21haW4uZGFydCBiL3R1dG9yaWFsL2RhcnQvc2VydmVyL2Jpbi9tYWluLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhYzMwZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvc2VydmVyL2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwxNjMgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpsb2dnaW5nL2xvZ2dpbmcuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHV0b3JpYWwvdHV0b3JpYWwuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6c2hhcmVkL3NoYXJlZC5kYXJ0JzsKKworVFByb3RvY29sIF9wcm90b2NvbDsKK1RQcm9jZXNzb3IgX3Byb2Nlc3NvcjsKK1dlYlNvY2tldCBfd2ViU29ja2V0OworCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgIExvZ2dlci5yb290LmxldmVsID0gTGV2ZWwuQUxMOworICBMb2dnZXIucm9vdC5vblJlY29yZC5saXN0ZW4oKExvZ1JlY29yZCByZWMpIHsKKyAgICBwcmludCgnJHtyZWMubGV2ZWwubmFtZX06ICR7cmVjLnRpbWV9OiAke3JlYy5tZXNzYWdlfScpOworICB9KTsKKworICB2YXIgcGFyc2VyID0gbmV3IEFyZ1BhcnNlcigpOworICBwYXJzZXIuYWRkT3B0aW9uKCdwb3J0JywgZGVmYXVsdHNUbzogJzkwOTAnLCBoZWxwOiAnVGhlIHBvcnQgdG8gbGlzdGVuIG9uJyk7CisgIHBhcnNlci5hZGRPcHRpb24oJ3R5cGUnLAorICAgICAgZGVmYXVsdHNUbzogJ3dzJywKKyAgICAgIGFsbG93ZWQ6IFsnd3MnLCAndGNwJ10sCisgICAgICBoZWxwOiAnVGhlIHR5cGUgb2Ygc29ja2V0JywKKyAgICAgIGFsbG93ZWRIZWxwOiB7J3dzJzogJ1dlYlNvY2tldCcsICd0Y3AnOiAnVENQIFNvY2tldCd9KTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJlc3VsdHMgPSBudWxsOworICB9CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIHByaW50KHBhcnNlci51c2FnZSk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIGludCBwb3J0ID0gaW50LnBhcnNlKHJlc3VsdHNbJ3BvcnQnXSk7CisgIFN0cmluZyBzb2NrZXRUeXBlID0gcmVzdWx0c1sndHlwZSddOworCisgIGlmIChzb2NrZXRUeXBlID09ICd0Y3AnKSB7CisgICAgX3J1blRjcFNlcnZlcihwb3J0KTsKKyAgfSBlbHNlIGlmIChzb2NrZXRUeXBlID09ICd3cycpIHsKKyAgICBfcnVuV2ViU29ja2V0U2VydmVyKHBvcnQpOworICB9Cit9CisKK0Z1dHVyZSBfcnVuV2ViU29ja2V0U2VydmVyKGludCBwb3J0KSBhc3luYyB7CisgIHZhciBodHRwU2VydmVyID0gYXdhaXQgSHR0cFNlcnZlci5iaW5kKCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgcHJpbnQoJ2xpc3RlbmluZyBmb3IgV2ViU29ja2V0IGNvbm5lY3Rpb25zIG9uICRwb3J0Jyk7CisKKyAgaHR0cFNlcnZlci5saXN0ZW4oKEh0dHBSZXF1ZXN0IHJlcXVlc3QpIGFzeW5jIHsKKyAgICBpZiAocmVxdWVzdC51cmkucGF0aCA9PSAnL3dzJykgeworICAgICAgX3dlYlNvY2tldCA9IGF3YWl0IFdlYlNvY2tldFRyYW5zZm9ybWVyLnVwZ3JhZGUocmVxdWVzdCk7CisgICAgICBhd2FpdCBfaW5pdFByb2Nlc3NvcihuZXcgVFdlYlNvY2tldChfd2ViU29ja2V0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50KCdJbnZhbGlkIHBhdGg6ICR7cmVxdWVzdC51cmkucGF0aH0nKTsKKyAgICB9CisgIH0pOworfQorCitGdXR1cmUgX3J1blRjcFNlcnZlcihpbnQgcG9ydCkgYXN5bmMgeworICB2YXIgc2VydmVyU29ja2V0ID0gYXdhaXQgU2VydmVyU29ja2V0LmJpbmQoJzEyNy4wLjAuMScsIHBvcnQpOworICBwcmludCgnbGlzdGVuaW5nIGZvciBUQ1AgY29ubmVjdGlvbnMgb24gJHBvcnQnKTsKKworICBTb2NrZXQgc29ja2V0ID0gYXdhaXQgc2VydmVyU29ja2V0LmZpcnN0OworICBhd2FpdCBfaW5pdFByb2Nlc3NvcihuZXcgVFRjcFNvY2tldChzb2NrZXQpKTsKK30KKworRnV0dXJlIF9pbml0UHJvY2Vzc29yKFRTb2NrZXQgc29ja2V0KSBhc3luYyB7CisgIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgdHJhbnNwb3J0Lm9uSW5jb21pbmdNZXNzYWdlLmxpc3RlbihfcHJvY2Vzc01lc3NhZ2UpOworICBfcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3JQcm9jZXNzb3IobmV3IENhbGN1bGF0b3JTZXJ2ZXIoKSk7CisgIF9wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgYXdhaXQgX3Byb3RvY29sLnRyYW5zcG9ydC5vcGVuKCk7CisKKyAgcHJpbnQoJ2Nvbm5lY3RlZCcpOworfQorCitGdXR1cmUgX3Byb2Nlc3NNZXNzYWdlKF8pIGFzeW5jIHsKKyAgX3Byb2Nlc3Nvci5wcm9jZXNzKF9wcm90b2NvbCwgX3Byb3RvY29sKTsKK30KKworY2xhc3MgQ2FsY3VsYXRvclNlcnZlciBpbXBsZW1lbnRzIENhbGN1bGF0b3IgeworICBmaW5hbCBNYXA8aW50LCBTaGFyZWRTdHJ1Y3Q+IF9sb2cgPSB7fTsKKworICBGdXR1cmUgcGluZygpIGFzeW5jIHsKKyAgICBwcmludCgncGluZygpJyk7CisgIH0KKworICBGdXR1cmU8aW50PiBhZGQoaW50IG51bTEsIGludCBudW0yKSBhc3luYyB7CisgICAgcHJpbnQoJ2FkZCgkbnVtMSwgJG51bTIpJyk7CisKKyAgICByZXR1cm4gbnVtMSArIG51bTI7CisgIH0KKworICBGdXR1cmU8aW50PiBjYWxjdWxhdGUoaW50IGxvZ2lkLCBXb3JrIHdvcmspIGFzeW5jIHsKKyAgICBwcmludCgnY2FsdWxhdGUoJGxvZ2lkLCAke3dvcmsudG9TdHJpbmcoKX0pJyk7CisKKyAgICBpbnQgdmFsOworCisgICAgc3dpdGNoICh3b3JrLm9wKSB7CisgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICBpZiAod29yay5udW0yID09IDApIHsKKyAgICAgICAgICB2YXIgeCA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wOworICAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCc7CisgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgfQorICAgICAgICB2YWwgPSAod29yay5udW0xIC8gd29yay5udW0yKS5mbG9vcigpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB2YXIgbG9nID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgIGxvZy5rZXkgPSBsb2dpZDsKKyAgICBsb2cudmFsdWUgPSAnJHZhbCAiJHt3b3JrLmNvbW1lbnR9Iic7CisgICAgdGhpcy5fbG9nW2xvZ2lkXSA9IGxvZzsKKworICAgIHJldHVybiB2YWw7CisgIH0KKworICBGdXR1cmUgemlwKCkgYXN5bmMgeworICAgIHByaW50KCd6aXAoKScpOworICB9CisKKyAgRnV0dXJlPFNoYXJlZFN0cnVjdD4gZ2V0U3RydWN0KGludCBrZXkpIGFzeW5jIHsKKyAgICBwcmludCgnZ2V0U3RydWN0KCRrZXkpJyk7CisKKyAgICByZXR1cm4gX2xvZ1trZXldOworICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkMDczNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbApAQCAtMCwwICsxLDM0IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWU6IHR1dG9yaWFsX3NlcnZlcgordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiBBIERhcnQgc2VydmVyIHRvIHN1cHBvcnQgdGhlIEFwYWNoZSBUaHJpZnQgdHV0b3JpYWwKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYXJnczogXjAuMTMuMAorICBzaGFyZWQ6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvc2hhcmVkCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0dXRvcmlhbDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDBkNDUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIKQEAgLTAsMCArMSwxMTQgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCitwcm9ncmFtIERlbHBoaUNsaWVudDsKKworeyRBUFBUWVBFIENPTlNPTEV9Cit7JEQgJ0NvcHlyaWdodCAoYykgMjAxMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24nfQorCit1c2VzCisgIFN5c1V0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0IGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBTaGFyZWQgaW4gJy4uXC4uXGdlbi1kZWxwaGlcU2hhcmVkLnBhcycsCisgIFR1dG9yaWFsIGluICcuLlwuLlxnZW4tZGVscGhpXFR1dG9yaWFsLnBhcyc7CisKKwordHlwZQorICBEZWxwaGlUdXRvcmlhbENsaWVudCA9IGNsYXNzCisgIHB1YmxpYworICAgIGNsYXNzIHByb2NlZHVyZSBNYWluOworICBlbmQ7CisKKworLy8tLS0gRGVscGhpVHV0b3JpYWxDbGllbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY2xhc3MgcHJvY2VkdXJlIERlbHBoaVR1dG9yaWFsQ2xpZW50Lk1haW47Cit2YXIgdHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgICBwcm90b2NvbCAgOiBJUHJvdG9jb2w7CisgICAgY2xpZW50ICAgIDogVENhbGN1bGF0b3IuSWZhY2U7CisgICAgd29yayAgICAgIDogSVdvcms7CisgICAgc3VtLCBxdW90aWVudCwgZGlmZiA6IEludGVnZXI7CisgICAgbG9nICAgICAgIDogSVNoYXJlZFN0cnVjdDsKK2JlZ2luCisgIHRyeQorICAgIHRyYW5zcG9ydCA6PSBUU29ja2V0SW1wbC5DcmVhdGUoICdsb2NhbGhvc3QnLCA5MDkwKTsKKyAgICBwcm90b2NvbCAgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zcG9ydCk7CisgICAgY2xpZW50ICAgIDo9IFRDYWxjdWxhdG9yLlRDbGllbnQuQ3JlYXRlKCBwcm90b2NvbCk7CisKKyAgICB0cmFuc3BvcnQuT3BlbjsKKworICAgIGNsaWVudC5waW5nOworICAgIFdyaXRlTG4oJ3BpbmcoKScpOworCisgICAgc3VtIDo9IGNsaWVudC5hZGQoIDEsIDEpOworICAgIFdyaXRlTG4oIEZvcm1hdCggJzErMT0lZCcsIFtzdW1dKSk7CisKKyAgICB3b3JrIDo9IFRXb3JrSW1wbC5DcmVhdGU7CisKKyAgICB3b3JrLk9wICAgOj0gVE9wZXJhdGlvbi5ESVZJREU7CisgICAgd29yay5OdW0xIDo9IDE7CisgICAgd29yay5OdW0yIDo9IDA7CisgICAgdHJ5CisgICAgICBxdW90aWVudCA6PSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworICAgICAgV3JpdGVMbiggJ1dob2Egd2UgY2FuIGRpdmlkZSBieSAwJyk7CisgICAgICBXcml0ZUxuKCBGb3JtYXQoJzEvMD0lZCcsW3F1b3RpZW50XSkpOworICAgIGV4Y2VwdAorICAgICAgb24gaW86IFRJbnZhbGlkT3BlcmF0aW9uCisgICAgICBkbyBXcml0ZUxuKCAnSW52YWxpZCBvcGVyYXRpb246ICcgKyBpby5XaHkpOworICAgIGVuZDsKKworICAgIHdvcmsuT3AgICA6PSBUT3BlcmF0aW9uLlNVQlRSQUNUOworICAgIHdvcmsuTnVtMSA6PSAxNTsKKyAgICB3b3JrLk51bTIgOj0gMTA7CisgICAgdHJ5CisgICAgICBkaWZmIDo9IGNsaWVudC5jYWxjdWxhdGUoIDEsIHdvcmspOworICAgICAgV3JpdGVMbiggRm9ybWF0KCcxNS0xMD0lZCcsIFtkaWZmXSkpOworICAgIGV4Y2VwdAorICAgICAgb24gaW86IFRJbnZhbGlkT3BlcmF0aW9uCisgICAgICBkbyBXcml0ZUxuKCAnSW52YWxpZCBvcGVyYXRpb246ICcgKyBpby5XaHkpOworICAgIGVuZDsKKworICAgIGxvZyA6PSBjbGllbnQuZ2V0U3RydWN0KDEpOworICAgIFdyaXRlTG4oIEZvcm1hdCggJ0NoZWNrIGxvZzogJXMnLCBbbG9nLlZhbHVlXSkpOworCisgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgZXhjZXB0CisgICAgb24gZSA6IEV4Y2VwdGlvbgorICAgIGRvIFdyaXRlTG4oIGUuQ2xhc3NOYW1lKyc6ICcrZS5NZXNzYWdlKTsKKyAgZW5kOworZW5kOworCisKK2JlZ2luCisgIHRyeQorICAgIERlbHBoaVR1dG9yaWFsQ2xpZW50Lk1haW47CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgZW5kOworZW5kLgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2ogYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDY3OTkyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKQEAgLTAsMCArMSwxMTkgQEAKK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+ezJCOEZCM0ExLTJGOUUtNDg4My04QzUzLTBGNTYyMjBCMzRGNn08L1Byb2plY3RHdWlkPgorCQkJPE1haW5Tb3VyY2U+RGVscGhpQ2xpZW50LmRwcjwvTWFpblNvdXJjZT4KKwkJCTxQcm9qZWN0VmVyc2lvbj4xMi4zPC9Qcm9qZWN0VmVyc2lvbj4KKwkJCTxCYXNpcz5UcnVlPC9CYXNpcz4KKwkJCTxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPkRlYnVnPC9Db25maWc+CisJCQk8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorCQkJPEFwcFR5cGU+Q29uc29sZTwvQXBwVHlwZT4KKwkJCTxGcmFtZXdvcmtUeXBlPk5vbmU8L0ZyYW1ld29ya1R5cGU+CisJCQk8RENDX0RDQ0NvbXBpbGVyPkRDQzMyPC9EQ0NfRENDQ29tcGlsZXI+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2lzJyBvciAnJChCYXNlKSchPScnIj4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+CisJCQk8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4KKwkJCTxDZmdfMj50cnVlPC9DZmdfMj4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKEJhc2UpJyE9JyciPgorCQkJPERDQ19Vbml0U2VhcmNoUGF0aD4uLlwuLlwuLlxsaWJcZGVscGhpXHNyYzskKERDQ19Vbml0U2VhcmNoUGF0aCk8L0RDQ19Vbml0U2VhcmNoUGF0aD4KKwkJCTxEQ0NfSW1hZ2VCYXNlPjAwNDAwMDAwPC9EQ0NfSW1hZ2VCYXNlPgorCQkJPERDQ19EY3VPdXRwdXQ+LlxkY3VcJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRGN1T3V0cHV0PgorCQkJPERDQ19Vbml0QWxpYXM+V2luVHlwZXM9V2luZG93cztXaW5Qcm9jcz1XaW5kb3dzO0RiaVR5cGVzPUJERTtEYmlQcm9jcz1CREU7JChEQ0NfVW5pdEFsaWFzKTwvRENDX1VuaXRBbGlhcz4KKwkJCTxEQ0NfRXhlT3V0cHV0Pi4uXGJpblwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19FeGVPdXRwdXQ+CisJCQk8RENDX0U+ZmFsc2U8L0RDQ19FPgorCQkJPERDQ19OPmZhbHNlPC9EQ0NfTj4KKwkJCTxEQ0NfUz5mYWxzZTwvRENDX1M+CisJCQk8RENDX0Y+ZmFsc2U8L0RDQ19GPgorCQkJPERDQ19LPmZhbHNlPC9EQ0NfSz4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4KKwkJCTxEQ0NfRGVmaW5lPkRFQlVHOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX09wdGltaXplPmZhbHNlPC9EQ0NfT3B0aW1pemU+CisJCQk8RENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+dHJ1ZTwvRENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+CisJCQk8RENDX0xvY2FsRGVidWdTeW1ib2xzPmZhbHNlPC9EQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+CisJCQk8RENDX0RlZmluZT5SRUxFQVNFOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX1N5bWJvbFJlZmVyZW5jZUluZm8+MDwvRENDX1N5bWJvbFJlZmVyZW5jZUluZm8+CisJCQk8RENDX0RlYnVnSW5mb3JtYXRpb24+ZmFsc2U8L0RDQ19EZWJ1Z0luZm9ybWF0aW9uPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxJdGVtR3JvdXA+CisJCQk8RGVscGhpQ29tcGlsZSBJbmNsdWRlPSJEZWxwaGlDbGllbnQuZHByIj4KKwkJCQk8TWFpblNvdXJjZT5NYWluU291cmNlPC9NYWluU291cmNlPgorCQkJPC9EZWxwaGlDb21waWxlPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TZXJ2ZXIucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcU2hhcmVkLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFR1dG9yaWFsLnBhcyIvPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KKwkJCQk8S2V5PkNmZ18yPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iQmFzaXMiPgorCQkJCTxLZXk+QmFzZTwvS2V5PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4KKwkJCQk8S2V5PkNmZ18xPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJPC9JdGVtR3JvdXA+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cyIvPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qJykiIFByb2plY3Q9IiQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2oiLz4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVscGhpLlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorCQkJPEJvcmxhbmQuUHJvamVjdFR5cGUvPgorCQkJPEJvcmxhbmRQcm9qZWN0PgorCQkJCTxEZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJCTxWZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+VHJ1ZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4xMjwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+CisJCQkJCTwvVmVyc2lvbkluZm8+CisJCQkJCTxWZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+VGhyaWZ0IFR1dG9yaWFsPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkludGVybmFsTmFtZSI+RGVscGhpQ2xpZW50PC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij5Db3B5cmlnaHQgwqkgMjAxMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPkRlbHBoaUNsaWVudC5leGU8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPlRocmlmdDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0VmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyIvPgorCQkJCQk8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJPFNvdXJjZT4KKwkJCQkJCTxTb3VyY2UgTmFtZT0iTWFpblNvdXJjZSI+RGVscGhpQ2xpZW50LmRwcjwvU291cmNlPgorCQkJCQk8L1NvdXJjZT4KKwkJCQk8L0RlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQk8UGxhdGZvcm1zPgorCQkJCQk8UGxhdGZvcm0gdmFsdWU9IldpbjMyIj5UcnVlPC9QbGF0Zm9ybT4KKwkJCQk8L1BsYXRmb3Jtcz4KKwkJCTwvQm9ybGFuZFByb2plY3Q+CisJCQk8UHJvamVjdEZpbGVWZXJzaW9uPjEyPC9Qcm9qZWN0RmlsZVZlcnNpb24+CisJCTwvUHJvamVjdEV4dGVuc2lvbnM+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDJlN2UKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHIKQEAgLTAsMCArMSwxNzMgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCitwcm9ncmFtIERlbHBoaVNlcnZlcjsKKworeyRBUFBUWVBFIENPTlNPTEV9Cit7JEQgJ0NvcHlyaWdodCAoYykgMjAxMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24nfQorCit7JFErfSAgICAgLy8gdGhyb3dzIGV4Y2VwdGlvbnMgb24gbnVtZXJpYyBvdmVyZmxvd3MKKwordXNlcworICBTeXNVdGlscywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIFRocmlmdCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgU2hhcmVkIGluICcuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMnLAorICBUdXRvcmlhbCBpbiAnLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMnOworCisKK3R5cGUKKyAgVENhbGN1bGF0b3JIYW5kbGVyID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBUQ2FsY3VsYXRvci5JZmFjZSkKKyAgcHJvdGVjdGVkCisgICAgRkxvZyA6IFREaWN0aW9uYXJ5PCBJbnRlZ2VyLCBJU2hhcmVkU3RydWN0PjsKKworICAgIC8vIFRTaGFyZWRTZXJ2aWNlLklmYWNlCisgICAgZnVuY3Rpb24gIGdldFN0cnVjdChrZXk6IEludGVnZXIpOiBJU2hhcmVkU3RydWN0OworCisgICAgLy8gVENhbGN1bGF0b3IuSWZhY2UKKyAgICBwcm9jZWR1cmUgcGluZygpOworICAgIGZ1bmN0aW9uICBhZGQobnVtMTogSW50ZWdlcjsgbnVtMjogSW50ZWdlcik6IEludGVnZXI7CisgICAgZnVuY3Rpb24gIGNhbGN1bGF0ZShsb2dpZDogSW50ZWdlcjsgY29uc3QgdzogSVdvcmspOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSB6aXAoKTsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgZW5kOworCisgIERlbHBoaVR1dG9yaWFsU2VydmVyID0gY2xhc3MKKyAgcHVibGljCisgICAgY2xhc3MgcHJvY2VkdXJlIE1haW47CisgIGVuZDsKKworCisvLy0tLSBUQ2FsY3VsYXRvckhhbmRsZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY29uc3RydWN0b3IgVENhbGN1bGF0b3JIYW5kbGVyLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZMb2cgOj0gVERpY3Rpb25hcnk8IEludGVnZXIsIElTaGFyZWRTdHJ1Y3Q+LkNyZWF0ZSgpOworZW5kOworCisKK2Rlc3RydWN0b3IgVENhbGN1bGF0b3JIYW5kbGVyLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGcmVlQW5kTmlsKCBGTG9nKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDYWxjdWxhdG9ySGFuZGxlci5waW5nOworYmVnaW4KKyAgV3JpdGVMbiggJ3BpbmcoKScpOworZW5kOworCisKK2Z1bmN0aW9uIFRDYWxjdWxhdG9ySGFuZGxlci5hZGQobnVtMTogSW50ZWdlcjsgbnVtMjogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBXcml0ZUxuKCBGb3JtYXQoICdhZGQoICVkLCAlZCknLCBbbnVtMSwgbnVtMl0pKTsKKyAgcmVzdWx0IDo9IG51bTEgKyBudW0yOworZW5kOworCisKK2Z1bmN0aW9uIFRDYWxjdWxhdG9ySGFuZGxlci5jYWxjdWxhdGUobG9naWQ6IEludGVnZXI7IGNvbnN0IHc6IElXb3JrKTogSW50ZWdlcjsKK3ZhciBlbnRyeSA6IElTaGFyZWRTdHJ1Y3Q7CitiZWdpbgorICB0cnkKKyAgICBXcml0ZUxuKCBGb3JtYXQoJ2NhbGN1bGF0ZSggJWQsIFslZCwlZCwlZF0pJywgW2xvZ2lkLCBPcmQody5PcCksIHcuTnVtMSwgdy5OdW0yXSkpOworCisgICAgY2FzZSB3Lk9wIG9mCisgICAgICBUT3BlcmF0aW9uLkFERCAgICAgIDogIHJlc3VsdCA6PSB3Lk51bTEgKyB3Lk51bTI7CisgICAgICBUT3BlcmF0aW9uLlNVQlRSQUNUIDogIHJlc3VsdCA6PSB3Lk51bTEgLSB3Lk51bTI7CisgICAgICBUT3BlcmF0aW9uLk1VTFRJUExZIDogIHJlc3VsdCA6PSB3Lk51bTEgKiB3Lk51bTI7CisgICAgICBUT3BlcmF0aW9uLkRJVklERSAgIDogIHJlc3VsdCA6PSBSb3VuZCggdy5OdW0xIC8gdy5OdW0yKTsKKyAgICBlbHNlCisgICAgICByYWlzZSBUSW52YWxpZE9wZXJhdGlvbi5DcmVhdGUoIE9yZCh3Lk9wKSwgJ1Vua25vd24gb3BlcmF0aW9uJyk7CisgICAgZW5kOworCisgIGV4Y2VwdAorICAgIG9uIGU6VGhyaWZ0LlRFeGNlcHRpb24gZG8gcmFpc2U7ICAvLyBsZXQgVGhyaWZ0IEV4Y2VwdGlvbnMgcGFzcyB0aHJvdWdoCisgICAgb24gZTpFeGNlcHRpb24gZG8gcmFpc2UgVEludmFsaWRPcGVyYXRpb24uQ3JlYXRlKCBPcmQody5PcCksIGUuTWVzc2FnZSk7ICAvLyByZXBhY2thZ2UgYWxsIG90aGVyCisgIGVuZDsKKworICBlbnRyeSA6PSBUU2hhcmVkU3RydWN0SW1wbC5DcmVhdGU7CisgIGVudHJ5LktleSAgIDo9IGxvZ2lkOworICBlbnRyeS5WYWx1ZSA6PSBJbnRUb1N0ciggcmVzdWx0KTsKKyAgRkxvZy5BZGRPclNldFZhbHVlKCBsb2dpZCwgZW50cnkpOworZW5kOworCisKK2Z1bmN0aW9uIFRDYWxjdWxhdG9ySGFuZGxlci5nZXRTdHJ1Y3Qoa2V5OiBJbnRlZ2VyKTogSVNoYXJlZFN0cnVjdDsKK2JlZ2luCisgIFdyaXRlTG4oIEZvcm1hdCggJ2dldFN0cnVjdCglZCknLCBba2V5XSkpOworICByZXN1bHQgOj0gRkxvZ1trZXldOworZW5kOworCisKK3Byb2NlZHVyZSBUQ2FsY3VsYXRvckhhbmRsZXIuemlwOworYmVnaW4KKyAgV3JpdGVMbiggJ3ppcCgpJyk7CitlbmQ7CisKKworLy8tLS0gRGVscGhpVHV0b3JpYWxTZXJ2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NsYXNzIHByb2NlZHVyZSBEZWxwaGlUdXRvcmlhbFNlcnZlci5NYWluOwordmFyIGhhbmRsZXIgICA6IFRDYWxjdWxhdG9yLklmYWNlOworICAgIHByb2Nlc3NvciA6IElQcm9jZXNzb3I7CisgICAgdHJhbnNwb3J0IDogSVNlcnZlclRyYW5zcG9ydDsKKyAgICBzZXJ2ZXIgICAgOiBJU2VydmVyOworYmVnaW4KKyAgdHJ5CisgICAgaGFuZGxlciAgIDo9IFRDYWxjdWxhdG9ySGFuZGxlci5DcmVhdGU7CisgICAgcHJvY2Vzc29yIDo9IFRDYWxjdWxhdG9yLlRQcm9jZXNzb3JJbXBsLkNyZWF0ZSggaGFuZGxlcik7CisgICAgdHJhbnNwb3J0IDo9IFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggOTA5MCk7CisgICAgc2VydmVyICAgIDo9IFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCk7CisKKyAgICBXcml0ZUxuKCAnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpOworICAgIHNlcnZlci5TZXJ2ZSgpOworCisgIGV4Y2VwdAorICAgIG9uIGU6IEV4Y2VwdGlvbiBkbyBXcml0ZUxuKCBlLk1lc3NhZ2UpOworICBlbmQ7CisKKyAgV3JpdGVMbignZG9uZS4nKTsKK2VuZDsKKworCitiZWdpbgorICB0cnkKKyAgICBEZWxwaGlUdXRvcmlhbFNlcnZlci5NYWluOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0YTZhMQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qCkBAIC0wLDAgKzEsMTE4IEBACivvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByb2plY3RHdWlkPnsyQjhGQjNBMS0yRjlFLTQ4ODMtOEM1My0wRjU2MjIwQjM0RjZ9PC9Qcm9qZWN0R3VpZD4KKwkJCTxNYWluU291cmNlPkRlbHBoaVNlcnZlci5kcHI8L01haW5Tb3VyY2U+CisJCQk8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+CisJCQk8QmFzaXM+VHJ1ZTwvQmFzaXM+CisJCQk8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgorCQkJPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKwkJCTxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+CisJCQk8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgorCQkJPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorCQkJPENmZ18xPnRydWU8L0NmZ18xPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisJCQk8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKwkJCTxEQ0NfSW1hZ2VCYXNlPjAwNDAwMDAwPC9EQ0NfSW1hZ2VCYXNlPgorCQkJPERDQ19EY3VPdXRwdXQ+LlxkY3VcJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRGN1T3V0cHV0PgorCQkJPERDQ19Vbml0QWxpYXM+V2luVHlwZXM9V2luZG93cztXaW5Qcm9jcz1XaW5kb3dzO0RiaVR5cGVzPUJERTtEYmlQcm9jcz1CREU7JChEQ0NfVW5pdEFsaWFzKTwvRENDX1VuaXRBbGlhcz4KKwkJCTxEQ0NfRXhlT3V0cHV0Pi4uXGJpblwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19FeGVPdXRwdXQ+CisJCQk8RENDX0U+ZmFsc2U8L0RDQ19FPgorCQkJPERDQ19OPmZhbHNlPC9EQ0NfTj4KKwkJCTxEQ0NfUz5mYWxzZTwvRENDX1M+CisJCQk8RENDX0Y+ZmFsc2U8L0RDQ19GPgorCQkJPERDQ19LPmZhbHNlPC9EQ0NfSz4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4KKwkJCTxEQ0NfRGVmaW5lPkRFQlVHOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX09wdGltaXplPmZhbHNlPC9EQ0NfT3B0aW1pemU+CisJCQk8RENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+dHJ1ZTwvRENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+CisJCQk8RENDX0xvY2FsRGVidWdTeW1ib2xzPmZhbHNlPC9EQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+CisJCQk8RENDX0RlZmluZT5SRUxFQVNFOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX1N5bWJvbFJlZmVyZW5jZUluZm8+MDwvRENDX1N5bWJvbFJlZmVyZW5jZUluZm8+CisJCQk8RENDX0RlYnVnSW5mb3JtYXRpb24+ZmFsc2U8L0RDQ19EZWJ1Z0luZm9ybWF0aW9uPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxJdGVtR3JvdXA+CisJCQk8RGVscGhpQ29tcGlsZSBJbmNsdWRlPSJEZWxwaGlTZXJ2ZXIuZHByIj4KKwkJCQk8TWFpblNvdXJjZT5NYWluU291cmNlPC9NYWluU291cmNlPgorCQkJPC9EZWxwaGlDb21waWxlPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TZXJ2ZXIucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcU2hhcmVkLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFR1dG9yaWFsLnBhcyIvPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KKwkJCQk8S2V5PkNmZ18yPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iQmFzaXMiPgorCQkJCTxLZXk+QmFzZTwvS2V5PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4KKwkJCQk8S2V5PkNmZ18xPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJPC9JdGVtR3JvdXA+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cyIvPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qJykiIFByb2plY3Q9IiQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2oiLz4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVscGhpLlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorCQkJPEJvcmxhbmQuUHJvamVjdFR5cGUvPgorCQkJPEJvcmxhbmRQcm9qZWN0PgorCQkJCTxEZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJCTxWZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+VHJ1ZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4xMjwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+CisJCQkJCTwvVmVyc2lvbkluZm8+CisJCQkJCTxWZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+VGhyaWZ0IFR1dG9yaWFsPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkludGVybmFsTmFtZSI+RGVscGhpU2VydmVyPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij5Db3B5cmlnaHQgwqkgMjAxMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPkRlbHBoaVNlcnZlci5leGU8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPlRocmlmdDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0VmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyIvPgorCQkJCQk8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJPFNvdXJjZT4KKwkJCQkJCTxTb3VyY2UgTmFtZT0iTWFpblNvdXJjZSI+RGVscGhpU2VydmVyLmRwcjwvU291cmNlPgorCQkJCQk8L1NvdXJjZT4KKwkJCQk8L0RlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQk8UGxhdGZvcm1zPgorCQkJCQk8UGxhdGZvcm0gdmFsdWU9IldpbjMyIj5UcnVlPC9QbGF0Zm9ybT4KKwkJCQk8L1BsYXRmb3Jtcz4KKwkJCTwvQm9ybGFuZFByb2plY3Q+CisJCQk8UHJvamVjdEZpbGVWZXJzaW9uPjEyPC9Qcm9qZWN0RmlsZVZlcnNpb24+CisJCTwvUHJvamVjdEV4dGVuc2lvbnM+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL1R1dG9yaWFsLmdyb3VwcHJvaiBiL3R1dG9yaWFsL2RlbHBoaS9UdXRvcmlhbC5ncm91cHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyYTIzNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9UdXRvcmlhbC5ncm91cHByb2oKQEAgLTAsMCArMSw0OCBAQAor77u/ICAgIDxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICAgICAgICA8UHJvcGVydHlHcm91cD4KKyAgICAgICAgICAgIDxQcm9qZWN0R3VpZD57M0QwNDJDN0YtM0VGMi00NTc0LTgzMDQtQUI3RkI3OUY4MTRDfTwvUHJvamVjdEd1aWQ+CisgICAgICAgIDwvUHJvcGVydHlHcm91cD4KKyAgICAgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgICAgIDxQcm9qZWN0cyBJbmNsdWRlPSJEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIj4KKyAgICAgICAgICAgICAgICA8RGVwZW5kZW5jaWVzLz4KKyAgICAgICAgICAgIDwvUHJvamVjdHM+CisgICAgICAgICAgICA8UHJvamVjdHMgSW5jbHVkZT0iRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiI+CisgICAgICAgICAgICAgICAgPERlcGVuZGVuY2llcy8+CisgICAgICAgICAgICA8L1Byb2plY3RzPgorICAgICAgICA8L0l0ZW1Hcm91cD4KKyAgICAgICAgPFByb2plY3RFeHRlbnNpb25zPgorICAgICAgICAgICAgPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVmYXVsdC5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKyAgICAgICAgICAgIDxCb3JsYW5kLlByb2plY3RUeXBlLz4KKyAgICAgICAgICAgIDxCb3JsYW5kUHJvamVjdD4KKyAgICAgICAgICAgICAgICA8RGVmYXVsdC5QZXJzb25hbGl0eS8+CisgICAgICAgICAgICA8L0JvcmxhbmRQcm9qZWN0PgorICAgICAgICA8L1Byb2plY3RFeHRlbnNpb25zPgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlciI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXI6Q2xlYW4iPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlcjpNYWtlIj4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudCI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQ6Q2xlYW4iPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudDpNYWtlIj4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkJ1aWxkIj4KKyAgICAgICAgICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9IkRlbHBoaVNlcnZlcjtEZWxwaGlDbGllbnQiLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iQ2xlYW4iPgorICAgICAgICAgICAgPENhbGxUYXJnZXQgVGFyZ2V0cz0iRGVscGhpU2VydmVyOkNsZWFuO0RlbHBoaUNsaWVudDpDbGVhbiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJNYWtlIj4KKyAgICAgICAgICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9IkRlbHBoaVNlcnZlcjpNYWtlO0RlbHBoaUNsaWVudDpNYWtlIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzIi8+CisgICAgPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL1JFQURNRS5tZCBiL3R1dG9yaWFsL2VybC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxN2NkMAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2VybC9SRUFETUUubWQKQEAgLTAsMCArMSw4IEBACitUbyB0cnkgdGhpbmdzIG91dCwgcnVuCisKKyUgLi9zZXJ2ZXIuc2gKK0VybGFuZyBSMTRCIChlcnRzLTUuOC4xKSBbc291cmNlXSBbNjQtYml0XSBbc21wOjQ6NF0gW3JxOjRdIFthc3luYy10aHJlYWRzOjBdIFtoaXBlXSBba2VybmVsLXBvbGw6ZmFsc2VdCisKK0VzaGVsbCBWNS44LjEgIChhYm9ydCB3aXRoIF5HKQorPiBzZXJ2ZXI6c3RhcnQoKS4KKz4gY2xpZW50OnQoKS4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwKaW5kZXggOTc4MDMzNC4uMDM3NDIyMCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwKKysrIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwKQEAgLTI4LDQ3ICsyOCw1MSBAQAogICAgIG9rLgogCiB0KCkgLT4KLSAgICBQb3J0ID0gOTk5OSwKLSAgICAKLSAgICB7b2ssIENsaWVudH0gPSB0aHJpZnRfY2xpZW50OnN0YXJ0X2xpbmsoIjEyNy4wLjAuMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0b3JfdGhyaWZ0KSwKKyAgICBQb3J0ID0gOTA5MCwKIAotICAgIHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQsIHBpbmcsIFtdKSwKKyAgICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygiMTI3LjAuMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0b3JfdGhyaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKSwKKworICAgIHtDbGllbnQxLCB7b2ssIG9rfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MCwgcGluZywgW10pLAogICAgIGlvOmZvcm1hdCgicGluZ35uIiwgW10pLAogCi0gICAge29rLCBTdW19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudCwgYWRkLCAgWzEsIDFdKSwKKyAgICB7Q2xpZW50Miwge29rLCBTdW19fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxLCBhZGQsICBbMSwgMV0pLAogICAgIGlvOmZvcm1hdCgiMSsxPX5wfm4iLCBbU3VtXSksCiAKLSAgICB7b2ssIFN1bTF9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudCwgYWRkLCBbMSwgNF0pLAorICAgIHtDbGllbnQzLCB7b2ssIFN1bTF9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCBhZGQsIFsxLCA0XSksCiAgICAgaW86Zm9ybWF0KCIxKzQ9fnB+biIsIFtTdW0xXSksCiAKLSAgICBXb3JrID0gI3dvcmt7b3A9P3R1dG9yaWFsX1NVQlRSQUNULAorICAgIFdvcmsgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fU1VCVFJBQ1QsCiAgICAgICAgICAgICAgICAgIG51bTE9MTUsCiAgICAgICAgICAgICAgICAgIG51bTI9MTB9LAotICAgIHtvaywgRGlmZn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50LCBjYWxjdWxhdGUsIFsxLCBXb3JrXSksCisgICAge0NsaWVudDQsIHtvaywgRGlmZn19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDMsIGNhbGN1bGF0ZSwgWzEsIFdvcmtdKSwKICAgICBpbzpmb3JtYXQoIjE1LTEwPX5wfm4iLCBbRGlmZl0pLAogCi0gICAge29rLCBMb2d9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudCwgZ2V0U3RydWN0LCBbMV0pLAorICAgIHtDbGllbnQ1LCB7b2ssIExvZ319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDQsIGdldFN0cnVjdCwgWzFdKSwKICAgICBpbzpmb3JtYXQoIkxvZzogfnB+biIsIFtMb2ddKSwKIAotICAgIHRyeQotICAgICAgICBXb3JrMSA9ICN3b3Jre29wPT90dXRvcmlhbF9ESVZJREUsCi0gICAgICAgICAgICAgICAgICAgICAgbnVtMT0xLAotICAgICAgICAgICAgICAgICAgICAgIG51bTI9MH0sCi0gICAgICAgIHtvaywgX1F1b3R9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudCwgY2FsY3VsYXRlLCBbMiwgV29yazFdKSwKKyAgICBDbGllbnQ2ID0KKyAgICAgICAgdHJ5CisgICAgICAgICAgICBXb3JrMSA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTE9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMj0wfSwKKyAgICAgICAgICAgIHtDbGllbnRTMSwge29rLCBfUXVvdH19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDUsIGNhbGN1bGF0ZSwgWzIsIFdvcmsxXSksCiAKLSAgICAgICAgaW86Zm9ybWF0KCJMQU1FOiBleGNlcHRpb24gaGFuZGxpbmcgaXMgYnJva2Vufm4iLCBbXSkKLSAgICBjYXRjaAotICAgICAgICBaIC0+Ci0gICAgICAgICAgICBpbzpmb3JtYXQoIkdvdCBleGNlcHRpb24gd2hlcmUgZXhwZWN0aW5nIC0gdGhlICIgKysKLSAgICAgICAgICAgICAgICAgICAgICAiZm9sbG93aW5nIGlzIE5PVCBhIHByb2JsZW0hISF+biIpLAotICAgICAgICAgICAgcChaKQotICAgIGVuZCwKKyAgICAgICAgICAgIGlvOmZvcm1hdCgiTEFNRTogZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGJyb2tlbn5uIiwgW10pLAorICAgICAgICAgICAgQ2xpZW50UzEKKyAgICAgICAgY2F0Y2gKKyAgICAgICAgICAgIHRocm93OntDbGllbnRTMiwgWn0gLT4KKyAgICAgICAgICAgICAgICBpbzpmb3JtYXQoIkdvdCBleGNlcHRpb24gd2hlcmUgZXhwZWN0aW5nIC0gdGhlICIgKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbGxvd2luZyBpcyBOT1QgYSBwcm9ibGVtISEhfm4iKSwKKyAgICAgICAgICAgICAgICBwKFopLAorICAgICAgICAgICAgICAgIENsaWVudFMyCisgICAgICAgIGVuZCwKIAogCi0gICAge29rLCBva30gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50LCB6aXAsIFtdKSwKKyAgICB7Q2xpZW50Nywge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDYsIHppcCwgW10pLAogICAgIGlvOmZvcm1hdCgiemlwfm4iLCBbXSksCiAKLSAgICBvayA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50KSwKKyAgICB7X0NsaWVudDgsIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50NyksCiAgICAgb2suCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvY2xpZW50LnNoIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYTQxN2UwZC4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9lcmwvY2xpZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2VydmVyLnNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaCBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzc1YWZiNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitFUkxfVEhSSUZUPS4uLy4uL2xpYi9lcmwKKworaWYgISBbIC1kICR7RVJMX1RIUklGVH0vZWJpbiBdOyB0aGVuCisgICAgZWNobyAiUGxlYXNlIGJ1aWxkIHRoZSBUaHJpZnQgbGlicmFyeSBieSBydW5uaW5nIFxgbWFrZScgaW4gJHtFUkxfVEhSSUZUfSIKKyAgICBleGl0IDEKK2ZpCisKK2lmICEgWyAtZCBnZW4tZXJsIF07IHRoZW4KKyAgLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtciAtLWdlbiBlcmwgLi4vdHV0b3JpYWwudGhyaWZ0CitmaQorCisKK2VybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JICR7RVJMX1RIUklGVH0vZWJpbiBcCisgICAgIC1JIGdlbi1lcmwgLW8gZ2VuLWVybCBnZW4tZXJsLyouZXJsICYmCisgIGVybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JIGdlbi1lcmwgKi5lcmwgJiYKKyAgZXJsICtLIHRydWUgLXBhICR7RVJMX1RIUklGVH0vZWJpbiAtcGEgZ2VuLWVybApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2pzb25fY2xpZW50LmVybCBiL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzOWNlZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwKQEAgLTAsMCArMSw4OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCislJSBUaGUgSlNPTiBwcm90b2NvbCBvdmVyIEhUVFAgaW1wbGVtZW50YXRpb24gd2FzIGNyZWF0ZWQgYnkKKyUlIFBldGVyIE5ldW1hcmsgPG5ldW1hcmsucGV0ZXJAZ21haWwuY29tPiBiYXNlZCBvbgorJSUgdGhlIGJpbmFyeSBwcm90b2NvbCArIHNvY2tldCB0dXRvcmlhbC4gVXNlIHdpdGggdGhlIHNhbWUgc2VydmVyCislJSB0aGF0IHRoZSBKYXZhc2NyaXB0IHR1dG9yaWFsIHVzZXMhCisKKy1tb2R1bGUoanNvbl9jbGllbnQpLgorCistaW5jbHVkZSgiY2FsY3VsYXRvcl90aHJpZnQuaHJsIikuCisKKy1leHBvcnQoW3QvMF0pLgorCislJSBDbGllbnQgY29uc3RydWN0b3IgZm9yIHRoZSBodHRwIHRyYW5zcG9ydHMKKyUlIHdpdGggdGhlIGpzb24gcHJvdG9jb2wKK25ld19jbGllbnQoSG9zdCwgUGF0aCwgU2VydmljZSwgX09wdGlvbnMpIC0+CisgICAge1Byb3RvT3B0cywgVHJhbnNPcHRzfSA9IHtbXSxbXX0sCisgICAgVHJhbnNwb3J0RmFjdG9yeSA9IGZ1bigpIC0+IHRocmlmdF9odHRwX3RyYW5zcG9ydDpuZXcoSG9zdCwgUGF0aCwgVHJhbnNPcHRzKSBlbmQsCisgICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0gdGhyaWZ0X2pzb25fcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b09wdHMpLAorICAgIHtvaywgUHJvdG9jb2x9ID0gUHJvdG9jb2xGYWN0b3J5KCksCisgICAgdGhyaWZ0X2NsaWVudDpuZXcoUHJvdG9jb2wsIFNlcnZpY2UpLgorCitwKFgpIC0+CisgICAgaW86Zm9ybWF0KCJ+cH5uIiwgW1hdKSwKKyAgICBvay4KKwordCgpIC0+CisgICAgaW5ldHM6c3RhcnQoKSwKKyAgICB7b2ssIENsaWVudDB9ID0gbmV3X2NsaWVudCgiMTI3LjAuMC4xOjgwODgiLCAiL3RocmlmdC9zZXJ2aWNlL3R1dG9yaWFsLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRvcl90aHJpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pLAorICAgIHtDbGllbnQxLCB7b2ssIG9rfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MCwgcGluZywgW10pLAorICAgIGlvOmZvcm1hdCgicGluZ35uIiwgW10pLAorCisgICAge0NsaWVudDIsIHtvaywgU3VtfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MSwgYWRkLCAgWzEsIDFdKSwKKyAgICBpbzpmb3JtYXQoIjErMT1+cH5uIiwgW1N1bV0pLAorCisgICAge0NsaWVudDMsIHtvaywgU3VtMX19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDIsIGFkZCwgWzEsIDRdKSwKKyAgICBpbzpmb3JtYXQoIjErND1+cH5uIiwgW1N1bTFdKSwKKworICAgIFdvcmsgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fU1VCVFJBQ1QsCisgICAgICAgICAgICAgICAgIG51bTE9MTUsCisgICAgICAgICAgICAgICAgIG51bTI9MTB9LAorICAgIHtDbGllbnQ0LCB7b2ssIERpZmZ9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQzLCBjYWxjdWxhdGUsIFsxLCBXb3JrXSksCisgICAgaW86Zm9ybWF0KCIxNS0xMD1+cH5uIiwgW0RpZmZdKSwKKworICAgIHtDbGllbnQ1LCB7b2ssIExvZ319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDQsIGdldFN0cnVjdCwgWzFdKSwKKyAgICBpbzpmb3JtYXQoIkxvZzogfnB+biIsIFtMb2ddKSwKKworICAgIENsaWVudDYgPQorICAgICAgICB0cnkKKyAgICAgICAgICAgIFdvcmsxID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMT0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudW0yPTB9LAorICAgICAgICAgICAge0NsaWVudFMxLCB7b2ssIF9RdW90fX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50NSwgY2FsY3VsYXRlLCBbMiwgV29yazFdKSwKKworICAgICAgICAgICAgaW86Zm9ybWF0KCJMQU1FOiBleGNlcHRpb24gaGFuZGxpbmcgaXMgYnJva2Vufm4iLCBbXSksCisgICAgICAgICAgICBDbGllbnRTMQorICAgICAgICBjYXRjaAorICAgICAgICAgICAgdGhyb3c6e0NsaWVudFMyLCBafSAtPgorICAgICAgICAgICAgICAgIGlvOmZvcm1hdCgiR290IGV4Y2VwdGlvbiB3aGVyZSBleHBlY3RpbmcgLSB0aGUgIiArKworICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9sbG93aW5nIGlzIE5PVCBhIHByb2JsZW0hISF+biIpLAorICAgICAgICAgICAgICAgIHAoWiksCisgICAgICAgICAgICAgICAgQ2xpZW50UzIKKyAgICAgICAgZW5kLAorCisKKyAgICB7Q2xpZW50Nywge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDYsIHppcCwgW10pLAorICAgIGlvOmZvcm1hdCgiemlwfm4iLCBbXSksCisKKyAgICB7X0NsaWVudDgsIG9rfSA9IHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50NyksCisgICAgb2suCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvc2VydmVyLmVybCBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsCmluZGV4IDVhOTk0Y2UuLjY0N2NjMjQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsCisrKyBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsCkBAIC0zNiwyNSArMzYsMjUgQEAKICAgICBOMStOMi4KIAogY2FsY3VsYXRlKExvZ2lkLCBXb3JrKSAtPgotICAgIHsgT3AsIE51bTEsIE51bTIgfSA9IHsgV29yayN3b3JrLm9wLCBXb3JrI3dvcmsubnVtMSwgV29yayN3b3JrLm51bTIgfSwKKyAgICB7IE9wLCBOdW0xLCBOdW0yIH0gPSB7IFdvcmsjJ1dvcmsnLm9wLCBXb3JrIydXb3JrJy5udW0xLCBXb3JrIydXb3JrJy5udW0yIH0sCiAgICAgZGVidWcoImNhbGN1bGF0ZSh+cCwge35wLH5wLH5wfSkiLCBbTG9naWQsIE9wLCBOdW0xLCBOdW0yXSksCiAgICAgY2FzZSBPcCBvZgotICAgICAgICA/dHV0b3JpYWxfQUREICAgICAgLT4gTnVtMSArIE51bTI7Ci0JP3R1dG9yaWFsX1NVQlRSQUNUIC0+IE51bTEgLSBOdW0yOwotCT90dXRvcmlhbF9NVUxUSVBMWSAtPiBOdW0xICogTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9BREQgICAgICAtPiBOdW0xICsgTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9TVUJUUkFDVCAtPiBOdW0xIC0gTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9NVUxUSVBMWSAtPiBOdW0xICogTnVtMjsKIAotCT90dXRvcmlhbF9ESVZJREUgd2hlbiBOdW0yID09IDAgLT4KLQkgICAgdGhyb3coI2ludmFsaWRPcGVyYXRpb257d2hhdD1PcCwgd2h5PSJDYW5ub3QgZGl2aWRlIGJ5IDAifSk7Ci0JP3R1dG9yaWFsX0RJVklERSAtPgotCSAgICBOdW0xIGRpdiBOdW0yOworICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSB3aGVuIE51bTIgPT0gMCAtPgorICAgICAgICAgIHRocm93KCMnSW52YWxpZE9wZXJhdGlvbid7d2hhdE9wPU9wLCB3aHk9IkNhbm5vdCBkaXZpZGUgYnkgMCJ9KTsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUgLT4KKyAgICAgICAgICBOdW0xIGRpdiBOdW0yOwogCi0JX0Vsc2UgLT4KLQkgICAgdGhyb3coI2ludmFsaWRPcGVyYXRpb257d2hhdD1PcCwgd2h5PSJJbnZhbGlkIG9wZXJhdGlvbiJ9KQorICAgICAgICBfRWxzZSAtPgorICAgICAgICAgIHRocm93KCMnSW52YWxpZE9wZXJhdGlvbid7d2hhdE9wPU9wLCB3aHk9IkludmFsaWQgb3BlcmF0aW9uIn0pCiAgICAgZW5kLgogCiBnZXRTdHJ1Y3QoS2V5KSAtPgogICAgIGRlYnVnKCJnZXRTdHJ1Y3QofnApIiwgW0tleV0pLAotICAgICNzaGFyZWRTdHJ1Y3R7a2V5PUtleSwgdmFsdWU9IlJBUkcifS4KKyAgICAjJ1NoYXJlZFN0cnVjdCd7a2V5PUtleSwgdmFsdWU9IlJBUkcifS4KIAogemlwKCkgLT4KICAgICBkZWJ1ZygiemlwIiwgW10pLApAQCAtNjMsNyArNjMsNyBAQAogJSUKIAogc3RhcnQoKSAtPgotICAgIHN0YXJ0KDk5OTkpLgorICAgIHN0YXJ0KDkwOTApLgogCiBzdGFydChQb3J0KSAtPgogICAgIEhhbmRsZXIgICA9ID9NT0RVTEUsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvc2VydmVyLnNoIGIvdHV0b3JpYWwvZXJsL3NlcnZlci5zaAppbmRleCAxMDZjODllLi43NzVhZmI2IDEwMDc1NQotLS0gYS90dXRvcmlhbC9lcmwvc2VydmVyLnNoCisrKyBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuc2gKQEAgLTI2LDEyICsyNiwxMiBAQAogICAgIGV4aXQgMQogZmkKIAotaWYgISBbIC1kIC4uL2dlbi1lcmwgXTsgdGhlbgotICAgIGVjaG8gIlBsZWFzZSBydW4gdGhyaWZ0IGZpcnN0IHRvIGdlbmVyYXRlIC4uL2dlbi1lcmwvIgotICAgIGV4aXQgMQoraWYgISBbIC1kIGdlbi1lcmwgXTsgdGhlbgorICAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1yIC0tZ2VuIGVybCAuLi90dXRvcmlhbC50aHJpZnQKIGZpCiAKIAotZXJsYyAtSSAke0VSTF9USFJJRlR9L2luY2x1ZGUgLUkgLi4vZ2VuLWVybCAtbyAuLi9nZW4tZXJsIC4uL2dlbi1lcmwvKi5lcmwgICYmCi0gIGVybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JIC4uL2dlbi1lcmwgKi5lcmwgJiYKLSAgZXJsICtLIHRydWUgLXBhICR7RVJMX1RIUklGVH0vZWJpbiAtcGEgLi4vZ2VuLWVybCAKK2VybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JICR7RVJMX1RIUklGVH0vZWJpbiBcCisgICAgIC1JIGdlbi1lcmwgLW8gZ2VuLWVybCBnZW4tZXJsLyouZXJsICYmCisgIGVybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JIGdlbi1lcmwgKi5lcmwgJiYKKyAgZXJsICtLIHRydWUgLXBhICR7RVJMX1RIUklGVH0vZWJpbiAtcGEgZ2VuLWVybApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9nby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU3ZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1OSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1nby90dXRvcmlhbC9jYWxjdWxhdG9yLmdvIGdlbi1nby9zaGFyZWQvc2hhcmVkX3NlcnZpY2UuZ286ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGdvJChDT01QSUxFUl9FWFRSQUZMQUcpIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLWdvL3R1dG9yaWFsL2NhbGN1bGF0b3IuZ28KKworY2hlY2s6IHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCB0aGlyZHBhcnR5LWRlcAorCSQoVEhSSUZUKSAtciAtLWdlbiBnbyQoQ09NUElMRVJfRVhUUkFGTEFHKSAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCWNwIC1yIGdlbi1nby8qIHNyYy8KKwlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gZ28tdHV0b3JpYWwgLi9zcmMKKwlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gY2FsY3VsYXRvci1yZW1vdGUgc3JjL3R1dG9yaWFsL2NhbGN1bGF0b3ItcmVtb3RlL2NhbGN1bGF0b3ItcmVtb3RlLmdvCisKK3NyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdDoKKwlta2RpciAtcCBzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nbworCWxuIC1zZiAkKHJlYWxwYXRoICQodG9wX3NyY2RpcikvbGliL2dvL3RocmlmdCkgc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0CisKK3RoaXJkcGFydHktZGVwOgorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJR09QQVRIPWBwd2RgICQoR08pIHJ1biBzcmMvKi5nbyAtc2VydmVyPXRydWUKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28KKwordHV0b3JpYWxzZWN1cmVzZXJ2ZXI6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlcnZlcj10cnVlIC1zZWN1cmU9dHJ1ZQorCit0dXRvcmlhbHNlY3VyZWNsaWVudDogYWxsCisJR09QQVRIPWBwd2RgICQoR08pIHJ1biBzcmMvKi5nbyAtc2VjdXJlPXRydWUKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLSogc3JjL3NoYXJlZCBzcmMvdHV0b3JpYWwgc3JjL2dpdC5hcGFjaGUub3JnIGdvLXR1dG9yaWFsIGNhbGN1bGF0b3ItcmVtb3RlCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjL2NsaWVudC5nbyBcCisJc3JjL2hhbmRsZXIuZ28gXAorCXNyYy9zZXJ2ZXIuZ28gXAorCXNyYy9tYWluLmdvIFwKKwlzZXJ2ZXIuY3J0IFwKKwlzZXJ2ZXIua2V5CisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NlcnZlci5jcnQgYi90dXRvcmlhbC9nby9zZXJ2ZXIuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWVmM2MKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zZXJ2ZXIuY3J0CkBAIC0wLDAgKzEsMjUgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRU56Q0NBeCtnQXdJQkFnSUpBT1lmWWZ3N05DT2NNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3hNUXN3Q1FZRAorVlFRR0V3SlZVekVSTUE4R0ExVUVDQXdJVFdGeWVXeGhibVF4RkRBU0JnTlZCQWNNQzBadmNtVnpkQ0JJYVd4cworTVNjd0pRWURWUVFLREI1VWFHVWdRWEJoWTJobElGTnZablIzWVhKbElFWnZkVzVrWVhScGIyNHhGakFVQmdOVgorQkFzTURVRndZV05vWlNCVWFISnBablF4RWpBUUJnTlZCQU1NQ1d4dlkyRnNhRzl6ZERFa01DSUdDU3FHU0liMworRFFFSkFSWVZaR1YyUUhSb2NtbG1kQzVoY0dGamFHVXViM0puTUI0WERURTBNRFF3TnpFNE5UZ3dNRm9YRFRJeQorTURZeU5ERTROVGd3TUZvd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WURWUVFJREFoTllYSjViR0Z1WkRFVQorTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm9aU0JCY0dGamFHVWdVMjltZEhkaAorY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm9jbWxtZERFU01CQUdBMVVFQXd3SgorYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHlhV1owTG1Gd1lXTm9aUzV2Y21jdworZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FFOVRFOXdFWHA1TFJ0TFFWRFNHUQorR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3lTTjhJMlh3NgorTDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0hqS05nNlpLZworMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUJHbVptTUlVdworQWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGt1NjJMaXBrWAord0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG10cmhWUUY0bgorQWdNQkFBR2pVREJPTUIwR0ExVWREZ1FXQkJRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQWZCZ05WSFNNRQorR0RBV2dCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liMworRFFFQkJRVUFBNElCQVFCR0ZSaUpzbGNYMGFKa3dacHpUd1NVZGdjZkticHZORWJDTnRWb2hmUVZUSTRhL29ONQorVSt5cURaSmczdk9hT3VpQVpxeUhjSWxaOHF5ZXNDZ1JOMzE0VGw0L0pRKytDVzhtS2oxbWVUZ281WUZ4Y1pZbQorVDl2c0kzQytOem44NERJTmdJOW14NnlrdEl0M1FPS1pSRHB6eVBrVXp4c3lKOEo0MjdEYWltRHJqVFIrZlR3RAorMURoMDl4ZWVNblNhNXplVjFIRUR5SlRxQ1h1dExldHdRL0l5Zm1NQmhJeCtudkI1ZjY3cHovbStEdjZWMHIzSQorcDRIQ2NkbkRVREdKYmZxdG9xc0FBVFFRV08rV1d1c3dCNm1PaERidlBUeGhScFpxNkFrZ1dxdjRTK3UzTTJHTworcjVwOUZyQmdhdkF3NWJLTzU0QzBvUUtwTi81ZnRhNWw2V3MwCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zZXJ2ZXIua2V5IGIvdHV0b3JpYWwvZ28vc2VydmVyLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNjZmNlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc2VydmVyLmtleQpAQCAtMCwwICsxLDI4IEBACistLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KK01JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktZd2dnU2lBZ0VBQW9JQkFRQ3FFOVRFOXdFWHA1TFIKK3RMUVZEU0dRR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3kKK1NOOEkyWHc2TDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0gKK2pLTmc2WktnMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUIKK0dtWm1NSVV3QWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGsKK3U2MkxpcGtYd0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG0KK3RyaFZRRjRuQWdNQkFBRUNnZ0VBVy95NTJZWVc2eXBST0diWjk0RFFwRlYwa0xPN3FUOHEwS3N4dzVzUE5hSXQKK2ZFUFJJeW1EYThpa3lIV0pTNU94bXc4NHdvNWpuSlYyNmphTG13ZTJMdXBxN1hmMWxxZWo4ZjVMSnR1djdjUVIKK3hmenAxdk02NUtKRkZKSHA2V3FqR3FKNkhTU1pPcFZEc25RWWNYUWpRQ2RweUFtYVNXZDNwK0ZxWVNaMW1RbUQKK2JGTkk3anFwY3pXU1poVGRvdFE3cDdIbjlUVkNlaGZsUDN5R0lCM2JRK3dDY0NCODVkT0J6MjAxTCtZZ2FJY2sKK1N6NDNBNE52V2FRSVJMUkR3N3M5R1c0alk1VDBKdjI4MldJZUFsVnBWeExJd3U0OHI0UjR5R1RJeDlZZG93dnEKKzU3K1k1aVBQakFYeHUwVjl0MDBvUzNiWXhEYUtoMkRVZmMvNXpvd3E4UUtCZ1FEWU5WUFhtYUcwYUlINHZqUTkKKzdmUmR3L1VEa1ljUWJuNkNuZ2xRT3U3Ny9TOG9nUXpwS0NWSmdKZ2taTnFPVnRRTUVQemVrR0VjTFRiamUxZ1UKKzhCa3kyaytQTDlVd2JGeTBlbW5PVmg0cnFyTlhIc1J2SmNlaE5UL1BSYjVoakYzTVVNRlYvMGlENGIrbmFGYUUKK2pyU1dpWjJaWGoycWZ3QUs1MkdGYnRPdUJRS0JnUURKWVF1R2lZMHIyMkU0d2FKbUNTS2N6b0JUM2N3bFZ6V2oKK1YybGpnQTlSSExOVFZrdk5OWVFMR3UycW5nRnJ0d3BlYVNuc01EZXJWRzR3S0FRV3lDbll6eFZybG5DNHVEckoKK0hYdUZFbHRCV2k5RmZiZ2ZzbmQzNzQ5QVQwb0JQMU5UMnRNbGVndXlmNURGZ2pDUjNWUkpMZHJWYWFaOHJvdy8KK0xxS2NGTXFuT3dLQmdCK09JTzk5bDdFNTg0WTNWRzZaZFNuZU9MdE5tUlhYMnBUN3RjWkU0NjVaZEhHSDdEZDMKK1NZSGh4OUsvK1huK3lESCtwTGxpL3hsYXJBRWxkbVNQNmsyV3VUZmZ0bEM3OEFmVE9mQUlkNXpON0NEUjk3OTEKK0Z4NjdJOVgvaXRxMzN0UzhFSXVabDU3UDZ1WG0vNEdYUmxvV09hOHhwdlJrVnNCQXB1WVBsOHQxQW9HQVRRRFMKK3kyc2xsRE9iQlh6bGdHYlYyV2dOSWdTWjMxMXRvVHYzakppWFFzamF1Vzh5SlJIbG4rbDRIOW16YVdEZ2tpRmMKK2FuZzFrVW9EcUY1azBlRlFQeHRRY1lkaEt3RW5XV2Z3cDMzUmJ6ZnhBMzJEUG51YnV6emJaaGZya0hhS2duSVcKK2N5b3I5dUZZbG0ybDdPRFpMZkplejJSS3lUcGxYbk9Tc21RdzZha0NnWUF6M2RqOUhza3lqK0hWSitodDFPY0UKK2M3YWkvRVNrU0E3VmFqcDB0akpwMEVLalcvenE4RHZVU1hPdGNkbkpna0t5Y0ZsdUx3Ym1uYU40dHhCZHMxQzEKK1FyOFJ0MnNVQ0NCTlplMUw2REhlM1hCZGJrSmU5c2daVk5UanRVU1Fyenk4VWh2c0NxRzRZV2VDdTA3U3pjYmMKK3JkUFVWOS91UWtkeDhWclNoeGxEOEE9PQorLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL2NsaWVudC5nbyBiL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlYmUwMAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28KQEAgLTAsMCArMSwxMDggQEAKK3BhY2thZ2UgbWFpbgorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImNyeXB0by90bHMiCisJImZtdCIKKwkidHV0b3JpYWwiCisKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCispCisKK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKKworZnVuYyBoYW5kbGVDbGllbnQoY2xpZW50ICp0dXRvcmlhbC5DYWxjdWxhdG9yQ2xpZW50KSAoZXJyIGVycm9yKSB7CisJY2xpZW50LlBpbmcoZGVmYXVsdEN0eCkKKwlmbXQuUHJpbnRsbigicGluZygpIikKKworCXN1bSwgXyA6PSBjbGllbnQuQWRkKGRlZmF1bHRDdHgsIDEsIDEpCisJZm10LlByaW50KCIxKzE9Iiwgc3VtLCAiXG4iKQorCisJd29yayA6PSB0dXRvcmlhbC5OZXdXb3JrKCkKKwl3b3JrLk9wID0gdHV0b3JpYWwuT3BlcmF0aW9uX0RJVklERQorCXdvcmsuTnVtMSA9IDEKKwl3b3JrLk51bTIgPSAwCisJcXVvdGllbnQsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKGRlZmF1bHRDdHgsIDEsIHdvcmspCisJaWYgZXJyICE9IG5pbCB7CisJCXN3aXRjaCB2IDo9IGVyci4odHlwZSkgeworCQljYXNlICp0dXRvcmlhbC5JbnZhbGlkT3BlcmF0aW9uOgorCQkJZm10LlByaW50bG4oIkludmFsaWQgb3BlcmF0aW9uOiIsIHYpCisJCWRlZmF1bHQ6CisJCQlmbXQuUHJpbnRsbigiRXJyb3IgZHVyaW5nIG9wZXJhdGlvbjoiLCBlcnIpCisJCX0KKwkJcmV0dXJuIGVycgorCX0gZWxzZSB7CisJCWZtdC5QcmludGxuKCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCB3aXRoIG5ldyB2YWx1ZToiLCBxdW90aWVudCkKKwl9CisKKwl3b3JrLk9wID0gdHV0b3JpYWwuT3BlcmF0aW9uX1NVQlRSQUNUCisJd29yay5OdW0xID0gMTUKKwl3b3JrLk51bTIgPSAxMAorCWRpZmYsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKGRlZmF1bHRDdHgsIDEsIHdvcmspCisJaWYgZXJyICE9IG5pbCB7CisJCXN3aXRjaCB2IDo9IGVyci4odHlwZSkgeworCQljYXNlICp0dXRvcmlhbC5JbnZhbGlkT3BlcmF0aW9uOgorCQkJZm10LlByaW50bG4oIkludmFsaWQgb3BlcmF0aW9uOiIsIHYpCisJCWRlZmF1bHQ6CisJCQlmbXQuUHJpbnRsbigiRXJyb3IgZHVyaW5nIG9wZXJhdGlvbjoiLCBlcnIpCisJCX0KKwkJcmV0dXJuIGVycgorCX0gZWxzZSB7CisJCWZtdC5QcmludCgiMTUtMTA9IiwgZGlmZiwgIlxuIikKKwl9CisKKwlsb2csIGVyciA6PSBjbGllbnQuR2V0U3RydWN0KGRlZmF1bHRDdHgsIDEpCisJaWYgZXJyICE9IG5pbCB7CisJCWZtdC5QcmludGxuKCJVbmFibGUgdG8gZ2V0IHN0cnVjdDoiLCBlcnIpCisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlmbXQuUHJpbnRsbigiQ2hlY2sgbG9nOiIsIGxvZy5WYWx1ZSkKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIHJ1bkNsaWVudCh0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5LCBhZGRyIHN0cmluZywgc2VjdXJlIGJvb2wpIGVycm9yIHsKKwl2YXIgdHJhbnNwb3J0IHRocmlmdC5UVHJhbnNwb3J0CisJdmFyIGVyciBlcnJvcgorCWlmIHNlY3VyZSB7CisJCWNmZyA6PSBuZXcodGxzLkNvbmZpZykKKwkJY2ZnLkluc2VjdXJlU2tpcFZlcmlmeSA9IHRydWUKKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNTTFNvY2tldChhZGRyLCBjZmcpCisJfSBlbHNlIHsKKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNvY2tldChhZGRyKQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJZm10LlByaW50bG4oIkVycm9yIG9wZW5pbmcgc29ja2V0OiIsIGVycikKKwkJcmV0dXJuIGVycgorCX0KKwl0cmFuc3BvcnQsIGVyciA9IHRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCWlmIGVyciA6PSB0cmFuc3BvcnQuT3BlbigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCW9wcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisJcmV0dXJuIGhhbmRsZUNsaWVudCh0dXRvcmlhbC5OZXdDYWxjdWxhdG9yQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSkpCit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbyBiL3R1dG9yaWFsL2dvL3NyYy9oYW5kbGVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMGVlZDAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbwpAQCAtMCwwICsxLDEwMiBAQAorcGFja2FnZSBtYWluCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJzaGFyZWQiCisJInN0cmNvbnYiCisJInR1dG9yaWFsIgorKQorCit0eXBlIENhbGN1bGF0b3JIYW5kbGVyIHN0cnVjdCB7CisJbG9nIG1hcFtpbnRdKnNoYXJlZC5TaGFyZWRTdHJ1Y3QKK30KKworZnVuYyBOZXdDYWxjdWxhdG9ySGFuZGxlcigpICpDYWxjdWxhdG9ySGFuZGxlciB7CisJcmV0dXJuICZDYWxjdWxhdG9ySGFuZGxlcntsb2c6IG1ha2UobWFwW2ludF0qc2hhcmVkLlNoYXJlZFN0cnVjdCl9Cit9CisKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBQaW5nKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnQoInBpbmcoKVxuIikKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBBZGQoY3R4IGNvbnRleHQuQ29udGV4dCwgbnVtMSBpbnQzMiwgbnVtMiBpbnQzMikgKHJldHZhbDE3IGludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnQoImFkZCgiLCBudW0xLCAiLCIsIG51bTIsICIpXG4iKQorCXJldHVybiBudW0xICsgbnVtMiwgbmlsCit9CisKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBDYWxjdWxhdGUoY3R4IGNvbnRleHQuQ29udGV4dCwgbG9naWQgaW50MzIsIHcgKnR1dG9yaWFsLldvcmspICh2YWwgaW50MzIsIGVyciBlcnJvcikgeworCWZtdC5QcmludCgiY2FsY3VsYXRlKCIsIGxvZ2lkLCAiLCB7Iiwgdy5PcCwgIiwiLCB3Lk51bTEsICIsIiwgdy5OdW0yLCAifSlcbiIpCisJc3dpdGNoIHcuT3AgeworCWNhc2UgdHV0b3JpYWwuT3BlcmF0aW9uX0FERDoKKwkJdmFsID0gdy5OdW0xICsgdy5OdW0yCisJCWJyZWFrCisJY2FzZSB0dXRvcmlhbC5PcGVyYXRpb25fU1VCVFJBQ1Q6CisJCXZhbCA9IHcuTnVtMSAtIHcuTnVtMgorCQlicmVhaworCWNhc2UgdHV0b3JpYWwuT3BlcmF0aW9uX01VTFRJUExZOgorCQl2YWwgPSB3Lk51bTEgKiB3Lk51bTIKKwkJYnJlYWsKKwljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9ESVZJREU6CisJCWlmIHcuTnVtMiA9PSAwIHsKKwkJCW91Y2ggOj0gdHV0b3JpYWwuTmV3SW52YWxpZE9wZXJhdGlvbigpCisJCQlvdWNoLldoYXRPcCA9IGludDMyKHcuT3ApCisJCQlvdWNoLldoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCisJCQllcnIgPSBvdWNoCisJCQlyZXR1cm4KKwkJfQorCQl2YWwgPSB3Lk51bTEgLyB3Lk51bTIKKwkJYnJlYWsKKwlkZWZhdWx0OgorCQlvdWNoIDo9IHR1dG9yaWFsLk5ld0ludmFsaWRPcGVyYXRpb24oKQorCQlvdWNoLldoYXRPcCA9IGludDMyKHcuT3ApCisJCW91Y2guV2h5ID0gIlVua25vd24gb3BlcmF0aW9uIgorCQllcnIgPSBvdWNoCisJCXJldHVybgorCX0KKwllbnRyeSA6PSBzaGFyZWQuTmV3U2hhcmVkU3RydWN0KCkKKwllbnRyeS5LZXkgPSBsb2dpZAorCWVudHJ5LlZhbHVlID0gc3RyY29udi5JdG9hKGludCh2YWwpKQorCWsgOj0gaW50KGxvZ2lkKQorCS8qCisJICAgb2xkdmFsdWUsIGV4aXN0cyA6PSBwLmxvZ1trXQorCSAgIGlmIGV4aXN0cyB7CisJICAgICBmbXQuUHJpbnQoIlJlcGxhY2luZyAiLCBvbGR2YWx1ZSwgIiB3aXRoICIsIGVudHJ5LCAiIGZvciBrZXkgIiwgaywgIlxuIikKKwkgICB9IGVsc2UgeworCSAgICAgZm10LlByaW50KCJBZGRpbmcgIiwgZW50cnksICIgZm9yIGtleSAiLCBrLCAiXG4iKQorCSAgIH0KKwkqLworCXAubG9nW2tdID0gZW50cnkKKwlyZXR1cm4gdmFsLCBlcnIKK30KKworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIEdldFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCBrZXkgaW50MzIpICgqc2hhcmVkLlNoYXJlZFN0cnVjdCwgZXJyb3IpIHsKKwlmbXQuUHJpbnQoImdldFN0cnVjdCgiLCBrZXksICIpXG4iKQorCXYsIF8gOj0gcC5sb2dbaW50KGtleSldCisJcmV0dXJuIHYsIG5pbAorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgWmlwKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnQoInppcCgpXG4iKQorCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvIGIvdHV0b3JpYWwvZ28vc3JjL21haW4uZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczMGQ3YgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2UgbWFpbgorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCAoCisJImZsYWciCisJImZtdCIKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCisJIm9zIgorKQorCitmdW5jIFVzYWdlKCkgeworCWZtdC5GcHJpbnQob3MuU3RkZXJyLCAiVXNhZ2Ugb2YgIiwgb3MuQXJnc1swXSwgIjpcbiIpCisJZmxhZy5QcmludERlZmF1bHRzKCkKKwlmbXQuRnByaW50KG9zLlN0ZGVyciwgIlxuIikKK30KKworZnVuYyBtYWluKCkgeworCWZsYWcuVXNhZ2UgPSBVc2FnZQorCXNlcnZlciA6PSBmbGFnLkJvb2woInNlcnZlciIsIGZhbHNlLCAiUnVuIHNlcnZlciIpCisJcHJvdG9jb2wgOj0gZmxhZy5TdHJpbmcoIlAiLCAiYmluYXJ5IiwgIlNwZWNpZnkgdGhlIHByb3RvY29sIChiaW5hcnksIGNvbXBhY3QsIGpzb24sIHNpbXBsZWpzb24pIikKKwlmcmFtZWQgOj0gZmxhZy5Cb29sKCJmcmFtZWQiLCBmYWxzZSwgIlVzZSBmcmFtZWQgdHJhbnNwb3J0IikKKwlidWZmZXJlZCA6PSBmbGFnLkJvb2woImJ1ZmZlcmVkIiwgZmFsc2UsICJVc2UgYnVmZmVyZWQgdHJhbnNwb3J0IikKKwlhZGRyIDo9IGZsYWcuU3RyaW5nKCJhZGRyIiwgImxvY2FsaG9zdDo5MDkwIiwgIkFkZHJlc3MgdG8gbGlzdGVuIHRvIikKKwlzZWN1cmUgOj0gZmxhZy5Cb29sKCJzZWN1cmUiLCBmYWxzZSwgIlVzZSB0bHMgc2VjdXJlIHRyYW5zcG9ydCIpCisKKwlmbGFnLlBhcnNlKCkKKworCXZhciBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkKKwlzd2l0Y2ggKnByb3RvY29sIHsKKwljYXNlICJjb21wYWN0IjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJzaW1wbGVqc29uIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJqc29uIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJiaW5hcnkiLCAiIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwlkZWZhdWx0OgorCQlmbXQuRnByaW50KG9zLlN0ZGVyciwgIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkIiwgcHJvdG9jb2wsICJcbiIpCisJCVVzYWdlKCkKKwkJb3MuRXhpdCgxKQorCX0KKworCXZhciB0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeQorCWlmICpidWZmZXJlZCB7CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4MTkyKQorCX0gZWxzZSB7CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCX0KKworCWlmICpmcmFtZWQgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJfQorCisJaWYgKnNlcnZlciB7CisJCWlmIGVyciA6PSBydW5TZXJ2ZXIodHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCAqYWRkciwgKnNlY3VyZSk7IGVyciAhPSBuaWwgeworCQkJZm10LlByaW50bG4oImVycm9yIHJ1bm5pbmcgc2VydmVyOiIsIGVycikKKwkJfQorCX0gZWxzZSB7CisJCWlmIGVyciA6PSBydW5DbGllbnQodHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCAqYWRkciwgKnNlY3VyZSk7IGVyciAhPSBuaWwgeworCQkJZm10LlByaW50bG4oImVycm9yIHJ1bm5pbmcgY2xpZW50OiIsIGVycikKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9zZXJ2ZXIuZ28gYi90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzA4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvCkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2UgbWFpbgorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCAoCisJImNyeXB0by90bHMiCisJImZtdCIKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCisJInR1dG9yaWFsIgorKQorCitmdW5jIHJ1blNlcnZlcih0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5LCBhZGRyIHN0cmluZywgc2VjdXJlIGJvb2wpIGVycm9yIHsKKwl2YXIgdHJhbnNwb3J0IHRocmlmdC5UU2VydmVyVHJhbnNwb3J0CisJdmFyIGVyciBlcnJvcgorCWlmIHNlY3VyZSB7CisJCWNmZyA6PSBuZXcodGxzLkNvbmZpZykKKwkJaWYgY2VydCwgZXJyIDo9IHRscy5Mb2FkWDUwOUtleVBhaXIoInNlcnZlci5jcnQiLCAic2VydmVyLmtleSIpOyBlcnIgPT0gbmlsIHsKKwkJCWNmZy5DZXJ0aWZpY2F0ZXMgPSBhcHBlbmQoY2ZnLkNlcnRpZmljYXRlcywgY2VydCkKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQl0cmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU1NMU2VydmVyU29ja2V0KGFkZHIsIGNmZykKKwl9IGVsc2UgeworCQl0cmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0KGFkZHIpCisJfQorCQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWZtdC5QcmludGYoIiVUXG4iLCB0cmFuc3BvcnQpCisJaGFuZGxlciA6PSBOZXdDYWxjdWxhdG9ySGFuZGxlcigpCisJcHJvY2Vzc29yIDo9IHR1dG9yaWFsLk5ld0NhbGN1bGF0b3JQcm9jZXNzb3IoaGFuZGxlcikKKwlzZXJ2ZXIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmbXQuUHJpbnRsbigiU3RhcnRpbmcgdGhlIHNpbXBsZSBzZXJ2ZXIuLi4gb24gIiwgYWRkcikKKwlyZXR1cm4gc2VydmVyLlNlcnZlKCkKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjI3MTMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOTcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCitCSU5fUEhQX1dFQiA9IGJpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocAorCitnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4IGdlbi1oYXhlL3NoYXJlZC9zaGFyZWRfc2VydmljZS5oeDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gaGF4ZSAtciAkPAorCithbGwtbG9jYWw6ICQoQklOX0NQUCkgJChCSU5fUEhQKSAkKEJJTl9QSFBfV0VCKQorCitjaGVjazogZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCiskKEJJTl9DUFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4CisJJChIQVhFKSAtLWN3ZCAuICBjcHAuaHhtbAorCiskKEJJTl9QSFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCiskKEJJTl9QSFBfV0VCKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLXdlYi1zZXJ2ZXIuaHhtbAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJChCSU5fQ1BQKSBzZXJ2ZXIKKwordHV0b3JpYWxzZXJ2ZXJfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSBzZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCSQoQklOX0NQUCkKKwordHV0b3JpYWxjbGllbnRfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSAKKwordHV0b3JpYWxzZWN1cmVzZXJ2ZXI6IGFsbAorCSQoQklOX0NQUCkgc2VydmVyIHNlY3VyZQorCit0dXRvcmlhbHNlY3VyZXNlcnZlcl9waHA6IGFsbAorCXBocCAtZiAkKEJJTl9QSFApIHNlcnZlciBzZWN1cmUKKwordHV0b3JpYWxzZWN1cmVjbGllbnQ6IGFsbAorCSQoQklOX0NQUCkgc2VjdXJlCisKK3R1dG9yaWFsc2VjdXJlY2xpZW50X3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgc2VjdXJlCisKK3R1dG9yaWFsc2VydmVyX3BocF9odHRwOiBhbGwKKwlwaHAgLVMgMTI3LjAuMC4xOjkwOTAgcm91dGVyLnBocAorCit0dXRvcmlhbGNsaWVudF9odHRwOiBhbGwKKwkkKEJJTl9DUFApIGNsaWVudCBodHRwCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1oYXhlIGJpbgorCitFWFRSQV9ESVNUID0gXAorCXNyYyBcCisJY3BwLmh4bWwgXAorCWNzaGFycC5oeG1sIFwKKwlmbGFzaC5oeG1sIFwKKwlqYXZhLmh4bWwgXAorCWphdmFzY3JpcHQuaHhtbCBcCisJcGhwLXdlYi1zZXJ2ZXIuaHhtbCBcCisJbmVrby5oeG1sIFwKKwlwaHAuaHhtbCBcCisJcHl0aG9uLmh4bWwgXAorCXJvdXRlci5waHAgXAorCXByb2plY3QuaGlkZSBcCisJVHV0b3JpYWwuaHhwcm9qIFwKKwltYWtlX2FsbC5iYXQgXAorCW1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL1R1dG9yaWFsLmh4cHJvaiBiL3R1dG9yaWFsL2hheGUvVHV0b3JpYWwuaHhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NmY2NDgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL1R1dG9yaWFsLmh4cHJvagpAQCAtMCwwICsxLDY3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHByb2plY3QgdmVyc2lvbj0iMiI+CisgIDwhLS0gT3V0cHV0IFNXRiBvcHRpb25zIC0tPgorICA8b3V0cHV0PgorICAgIDxtb3ZpZSBvdXRwdXRUeXBlPSJBcHBsaWNhdGlvbiIgLz4KKyAgICA8bW92aWUgaW5wdXQ9IiIgLz4KKyAgICA8bW92aWUgcGF0aD0iYmluL0hheGVUdXRvcmlhbCIgLz4KKyAgICA8bW92aWUgZnBzPSIzMCIgLz4KKyAgICA8bW92aWUgd2lkdGg9IjgwMCIgLz4KKyAgICA8bW92aWUgaGVpZ2h0PSI2MDAiIC8+CisgICAgPG1vdmllIHZlcnNpb249IjEiIC8+CisgICAgPG1vdmllIG1pbm9yVmVyc2lvbj0iMCIgLz4KKyAgICA8bW92aWUgcGxhdGZvcm09IkMrKyIgLz4KKyAgICA8bW92aWUgYmFja2dyb3VuZD0iI0ZGRkZGRiIgLz4KKyAgPC9vdXRwdXQ+CisgIDwhLS0gT3RoZXIgY2xhc3NlcyB0byBiZSBjb21waWxlZCBpbnRvIHlvdXIgU1dGIC0tPgorICA8Y2xhc3NwYXRocz4KKyAgICA8Y2xhc3MgcGF0aD0ic3JjIiAvPgorICAgIDxjbGFzcyBwYXRoPSJnZW4taGF4ZSIgLz4KKyAgICA8Y2xhc3MgcGF0aD0iLi4vLi4vbGliL2hheGUvc3JjIiAvPgorICA8L2NsYXNzcGF0aHM+CisgIDwhLS0gQnVpbGQgb3B0aW9ucyAtLT4KKyAgPGJ1aWxkPgorICAgIDxvcHRpb24gZGlyZWN0aXZlcz0iIiAvPgorICAgIDxvcHRpb24gZmxhc2hTdHJpY3Q9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbm9JbmxpbmVPbkRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIG1haW5DbGFzcz0iTWFpbiIgLz4KKyAgICA8b3B0aW9uIGVuYWJsZWRlYnVnPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIGFkZGl0aW9uYWw9IiIgLz4KKyAgPC9idWlsZD4KKyAgPCEtLSBoYXhlbGliIGxpYnJhcmllcyAtLT4KKyAgPGhheGVsaWI+CisgICAgPCEtLSBleGFtcGxlOiA8bGlicmFyeSBuYW1lPSIuLi4iIC8+IC0tPgorICA8L2hheGVsaWI+CisgIDwhLS0gQ2xhc3MgZmlsZXMgdG8gY29tcGlsZSAob3RoZXIgcmVmZXJlbmNlZCBjbGFzc2VzIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZCkgLS0+CisgIDxjb21waWxlVGFyZ2V0cz4KKyAgICA8IS0tIGV4YW1wbGU6IDxjb21waWxlIHBhdGg9Ii4uLiIgLz4gLS0+CisgIDwvY29tcGlsZVRhcmdldHM+CisgIDwhLS0gUGF0aHMgdG8gZXhjbHVkZSBmcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHRyZWUgLS0+CisgIDxoaWRkZW5QYXRocz4KKyAgICA8aGlkZGVuIHBhdGg9Im9iaiIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImNwcC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3NoYXJwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJmbGFzaC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YS5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iamF2YXNjcmlwdC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuYmF0IiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibWFrZV9hbGwuc2giIC8+CisgICAgPGhpZGRlbiBwYXRoPSJNYWtlZmlsZS5hbSIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Im5la28uaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9InBocC5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHJvamVjdC5oaWRlIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icHl0aG9uLmh4bWwiIC8+CisgIDwvaGlkZGVuUGF0aHM+CisgIDwhLS0gRXhlY3V0ZWQgYmVmb3JlIGJ1aWxkIC0tPgorICA8cHJlQnVpbGRDb21tYW5kPnRocmlmdCAtciAtZ2VuIGhheGUgIC4uL3R1dG9yaWFsLnRocmlmdDwvcHJlQnVpbGRDb21tYW5kPgorICA8IS0tIEV4ZWN1dGVkIGFmdGVyIGJ1aWxkIC0tPgorICA8cG9zdEJ1aWxkQ29tbWFuZCBhbHdheXNSdW49IkZhbHNlIiAvPgorICA8IS0tIE90aGVyIHByb2plY3Qgb3B0aW9ucyAtLT4KKyAgPG9wdGlvbnM+CisgICAgPG9wdGlvbiBzaG93SGlkZGVuUGF0aHM9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gdGVzdE1vdmllPSJVbmtub3duIiAvPgorICAgIDxvcHRpb24gdGVzdE1vdmllQ29tbWFuZD0iIiAvPgorICA8L29wdGlvbnM+CisgIDwhLS0gUGx1Z2luIHN0b3JhZ2UgLS0+CisgIDxzdG9yYWdlIC8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9jcHAuaHhtbCBiL3R1dG9yaWFsL2hheGUvY3BwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkYjUyZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvY3BwLmh4bWwKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0NQUCB0YXJnZXQKKy1jcHAgYmluCisKKyNUbyBwcm9kdWNlIDY0IGJpdCBiaW5hcmllcyB0aGUgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSBIWENQUF9NNjQgY29tcGlsZSB2YXJpYWJsZToKKyMtRCBIWENQUF9NNjQKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvY3NoYXJwLmh4bWwgYi90dXRvcmlhbC9oYXhlL2NzaGFycC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWMwMTcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL2NzaGFycC5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDU0hBUlAgdGFyZ2V0CistY3MgYmluL1R1dG9yaWFsLmV4ZQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9mbGFzaC5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9mbGFzaC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjA1NjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL2ZsYXNoLmh4bWwKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0ZsYXNoIHRhcmdldAorLXN3ZiBiaW4vVHV0b3JpYWwuc3dmCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjIHdlIG5lZWQgc29tZSBnb29kaWVzIGZyb20gc3lzLm5ldAorIyAtLW1hY3JvIGFsbG93UGFja2FnZSgic3lzIikKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9qYXZhLmh4bWwgYi90dXRvcmlhbC9oYXhlL2phdmEuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE1NTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9qYXZhLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjIAorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhIHRhcmdldAorLWphdmEgYmluL1R1dG9yaWFsLmphcgorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwgYi90dXRvcmlhbC9oYXhlL2phdmFzY3JpcHQuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmIzODc2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9qYXZhc2NyaXB0Lmh4bWwKQEAgLTAsMCArMSw0NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0phdmFTY3JpcHQgdGFyZ2V0CistanMgYmluL1R1dG9yaWFsLmpzCisKKyNZb3UgY2FuIHVzZSAtRCBzb3VyY2UtbWFwLWNvbnRlbnQgKHJlcXVpcmVzIEhheGUgMy4xKykgdG8gaGF2ZSB0aGUgLmh4IAorI2ZpbGVzIGRpcmVjdGx5IGVtYmVkZGVkIGludG8gdGhlIG1hcCBmaWxlLCB0aGlzIHdheSB5b3Ugb25seSBoYXZlIHRvIAorI3VwbG9hZCBpdCwgYW5kIGl0IHdpbGwgYmUgYWx3YXlzIGluIHN5bmMgd2l0aCB0aGUgY29tcGlsZWQgLmpzIGV2ZW4gaWYgCisjeW91IG1vZGlmeSB5b3VyIC5oeCBmaWxlcy4KKy1EIHNvdXJjZS1tYXAtY29udGVudAorCisjR2VuZXJhdGUgc291cmNlIG1hcCBhbmQgYWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9tYWtlX2FsbC5iYXQgYi90dXRvcmlhbC9oYXhlL21ha2VfYWxsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZkZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9tYWtlX2FsbC5iYXQKQEAgLTAsMCArMSw2OCBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCisKK3NldGxvY2FsCitpZiAiJUhPTUVEUklWRSUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhPTUVQQVRIJSI9PSIiIGdvdG8gTUlTU0lOR1ZBUlMKK2lmICIlSEFYRVBBVEglIj09IiIgZ290byBOT1RJTlNUQUxMRUQKKworc2V0IHBhdGg9JUhBWEVQQVRIJTslSEFYRVBBVEglXC4uXG5la287JXBhdGglCisKK3JlbSAjIGludm9rZSBUaHJpZnQgY29tbnBpbGVyCit0aHJpZnQgLXIgLWdlbiBoYXhlICAgLi5cdHV0b3JpYWwudGhyaWZ0CitpZiBlcnJvcmxldmVsIDEgZ290byBTVE9QCisKK3JlbSAjIGludm9rZSBIYXhlIGNvbXBpbGVyIGZvciBhbGwgdGFyZ2V0cworZm9yICUlYSBpbiAoKi5oeG1sKSBkbyAoCisJcmVtICogZmlsdGVyIFB5dGhvbiwgYXMgaXQgaXMgbm90IHN1cHBvcnRlZCBieSBIYXhlIDMuMS4zIChidXQgd2lsbCBiZSBpbiAzLjEuNCkKKwlpZiBub3QgIiUlYSI9PSJweXRob24uaHhtbCIgKAorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWVjaG8gQnVpbGRpbmcgJSVhIC4uLgorCQllY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWhheGUgIC0tY3dkIC4gICUlYQorCSkKKykKKworCitlY2hvLgorZWNobyBkb25lLgorcGF1c2UKK2dvdG8gZW9mCisKKzpOT1RJTlNUQUxMRUQKK2VjaG8gRkFUQUw6IEVpdGhlciBIYXhlIGlzIG5vdCBpbnN0YWxsZWQsIG9yIHRoZSBIQVhFUEFUSCB2YXJpYWJsZSBpcyBub3Qgc2V0LgorcGF1c2UKK2dvdG8gZW9mCisKKzpNSVNTSU5HVkFSUworZWNobyBGQVRBTDogVW5hYmxlIHRvIGxvY2F0ZSBob21lIGZvbGRlci4KK2VjaG8uCitlY2hvIEJvdGggSE9NRURSSVZFIGFuZCBIT01FUEFUSCBuZWVkIHRvIGJlIHNldCB0byBwb2ludCB0byB5b3VyIEhvbWUgZm9sZGVyLgorZWNobyBUaGUgY3VycmVudCB2YWx1ZXMgYXJlOgorZWNobyBIT01FRFJJVkU9JUhPTUVEUklWRSUKK2VjaG8gSE9NRVBBVEg9JUhPTUVQQVRIJQorcGF1c2UKK2dvdG8gZW9mCisKKzpTVE9QCitwYXVzZQorZ290byBlb2YKKworOmVvZgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9tYWtlX2FsbC5zaCBiL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlNjUwZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvbWFrZV9hbGwuc2gKQEAgLTAsMCArMSw0MSBAQAorIyEvYmluL3NoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vdHV0b3JpYWwudGhyaWZ0CisKKyMgb3V0cHV0IGZvbGRlcgoraWYgWyAhIC1kIGJpbiBdOyB0aGVuCisgIG1rZGlyICBiaW4KK2ZpCisKKyMgaW52b2tlIEhheGUgY29tcG9pbGVyCitmb3IgdGFyZ2V0IGluICouaHhtbDsgZG8gCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZWNobyBCdWlsZGluZyAke3RhcmdldH0gLi4uCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaWYgWyAhIC1kIGJpbi8ke3RhcmdldH0gXTsgdGhlbgorICAgIG1rZGlyICBiaW4vJHt0YXJnZXR9CisgIGZpCisgIGhheGUgIC0tY3dkIC4gICR7dGFyZ2V0fSAKK2RvbmUKKworCisjZW9mCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL25la28uaHhtbCBiL3R1dG9yaWFsL2hheGUvbmVrby5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjFmNjkKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL25la28uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjbmVrbyB0YXJnZXQKKy1uZWtvIGJpbi9UdXRvcmlhbC5uCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwgYi90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YTg1MgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcGhwLXdlYi1zZXJ2ZXIuaHhtbApAQCAtMCwwICsxLDQzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgZ2VuLWhheGUKKy1jcCAuLi8uLi9saWIvaGF4ZS9zcmMKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUEhQIHRhcmdldAorLXBocCBiaW4vcGhwLXdlYi1zZXJ2ZXIvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjZGVmaW5lcworLUQgcGhwd2Vic2VydmVyCisKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9waHAuaHhtbCBiL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmNjg4NwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwKQEAgLTAsMCArMSwzOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1BIUCB0YXJnZXQKKy1waHAgYmluL3BocC8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvcHJvamVjdC5oaWRlIGIvdHV0b3JpYWwvaGF4ZS9wcm9qZWN0LmhpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1ZDRlYwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcHJvamVjdC5oaWRlCkBAIC0wLDAgKzEsMTA1IEBACit7CisgICAgICJ0eXBlIiA6IDAKKyAgICAsInRhcmdldCIgOiA0CisgICAgLCJuYW1lIiA6ICJBcGFjaGUgVGhyaWZ0IFR1dG9yaWFsIgorICAgICwibWFpbiIgOiBudWxsCisgICAgLCJwcm9qZWN0UGFja2FnZSIgOiAiIgorICAgICwiY29tcGFueSIgOiAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikiCisgICAgLCJsaWNlbnNlIiA6ICJBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAiCisgICAgLCJ1cmwiIDogImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCIKKyAgICAsInRhcmdldERhdGEiIDogWworICAgICAgICAgeworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJmbGFzaC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDEKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluL1R1dG9yaWFsLnN3ZiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhc2NyaXB0Lmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW5cXGluZGV4Lmh0bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAibmVrby5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAibmVrbyBiaW4vVHV0b3JpYWwubiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJwaHAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjcHAuaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9NYWluLWRlYnVnLmV4ZSIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhLmh4bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiY3NoYXJwLmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMgorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW5cXFR1dG9yaWFsLmV4ZVxcYmluXFxNYWluLURlYnVnLmV4ZSIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJweXRob24uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogInB5dGhvbiBiaW4vVHV0b3JpYWwucHkiCisgICAgICAgIH0KKyAgICBdCisgICAgLCJmaWxlcyIgOiBbCisgICAgICAgICB7CisgICAgICAgICAgICAgInBhdGgiIDogInNyY1xcb3JnXFxhcGFjaGVcXHRocmlmdFxcc2VydmVyXFxUU2VydmVyLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogNzYKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXG9yZ1xcYXBhY2hlXFx0aHJpZnRcXHNlcnZlclxcVFNpbXBsZVNlcnZlci5oeCIKKyAgICAgICAgICAgICwidXNlVGFicyIgOiB0cnVlCisgICAgICAgICAgICAsImluZGVudFNpemUiIDogNAorICAgICAgICAgICAgLCJmb2xkZWRSZWdpb25zIiA6IFsKKworICAgICAgICAgICAgXQorICAgICAgICAgICAgLCJhY3RpdmVMaW5lIiA6IDEwMAorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGgiIDogInNyY1xcc2hhcmVkXFxTaGFyZWRTZXJ2aWNlUHJvY2Vzc29yLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMjAKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXHR1dG9yaWFsXFxDYWxjdWxhdG9yUHJvY2Vzc29yLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogNzkKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoIiA6ICJzcmNcXE1haW4uaHgiCisgICAgICAgICAgICAsInVzZVRhYnMiIDogdHJ1ZQorICAgICAgICAgICAgLCJpbmRlbnRTaXplIiA6IDQKKyAgICAgICAgICAgICwiZm9sZGVkUmVnaW9ucyIgOiBbCisKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICwiYWN0aXZlTGluZSIgOiAwCisgICAgICAgIH0KKyAgICBdCisgICAgLCJhY3RpdmVGaWxlIiA6ICJzcmNcXE1haW4uaHgiCisgICAgLCJvcGVuRkxUYXJnZXQiIDogbnVsbAorICAgICwib3BlbkZMQnVpbGRNb2RlIiA6ICJEZWJ1ZyIKKyAgICAsInJ1bkFjdGlvblR5cGUiIDogbnVsbAorICAgICwicnVuQWN0aW9uVGV4dCIgOiBudWxsCisgICAgLCJidWlsZEFjdGlvbkNvbW1hbmQiIDogbnVsbAorICAgICwiaGlkZGVuSXRlbXMiIDogWworCisgICAgXQorICAgICwic2hvd0hpZGRlbkl0ZW1zIiA6IGZhbHNlCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9weXRob24uaHhtbCBiL3R1dG9yaWFsL2hheGUvcHl0aG9uLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjMTlmYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcHl0aG9uLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1B5dGhvbiB0YXJnZXQKKy1weXRob24gYmluL1R1dG9yaWFsLnB5CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAgYi90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0MTM1YwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvcm91dGVyLnBocApAQCAtMCwwICsxLDMxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCisKKworLy9yb3V0ZXIgZmlsZSB0byBydW4gdGVzdGluZyB3ZWIgc2VydmVyCisKKy8vc2V0X3RpbWVfbGltaXQoMSk7CisKK3JlcXVpcmVfb25jZSAgZGlybmFtZShfX0ZJTEVfXykgLiAnL2Jpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocCc7CisKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuaHggYi90dXRvcmlhbC9oYXhlL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTc1MmRiCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaGF4ZS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuaHgKQEAgLTAsMCArMSwxMDEgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IGhheGUuZHMuSW50TWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdHV0b3JpYWwuKjsKK2ltcG9ydCBzaGFyZWQuKjsKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciBpbXBsZW1lbnRzIENhbGN1bGF0b3IgeworCisgICAgcHJpdmF0ZSB2YXIgbG9nID0gbmV3IEludE1hcDxTaGFyZWRTdHJ1Y3Q+KCk7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBwaW5nKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoInBpbmcoKSIpOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZCggbnVtMSA6IGhheGUuSW50MzIsIG51bTIgOiBoYXhlLkludDMyKSA6IGhheGUuSW50MzIgeworICAgICAgICB0cmFjZSgnYWRkKCAkbnVtMSwgJG51bTIpJyk7CisgICAgICAgIHJldHVybiBudW0xICsgbnVtMjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2FsY3VsYXRlKCBsb2dpZCA6IGhheGUuSW50MzIsIHdvcmsgOiBXb3JrKSA6IGhheGUuSW50MzIgIHsKKyAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSggJGxvZ2lkLCAnK3dvcmsub3ArIiwiK3dvcmsubnVtMSsiLCIrd29yay5udW0yKyIpIik7CisKKyAgICAgICAgdmFyIHZhbCA6IGhheGUuSW50MzIgPSAwOworICAgICAgICBzd2l0Y2ggKHdvcmsub3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisKKyAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKKworICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOworCisgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgICAgICAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSBTdGQuaW50KCB3b3JrLm51bTEgLyB3b3JrLm51bTIpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgICAgICAgICBpby53aHkgPSAiVW5rbm93biBvcGVyYXRpb24iOworICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgICAgICBlbnRyeS5rZXkgPSBsb2dpZDsKKyAgICAgICAgZW50cnkudmFsdWUgPSAnJHZhbCc7CisgICAgICAgIGxvZy5zZXQobG9naWQsIGVudHJ5KTsKKworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdHJ1Y3QoIGtleSA6IGhheGUuSW50MzIpIDogU2hhcmVkU3RydWN0IHsKKyAgICAgICAgdHJhY2UoJ2dldFN0cnVjdCgka2V5KScpOworICAgICAgICByZXR1cm4gbG9nLmdldChrZXkpOworICAgIH0KKworICAgIC8vIG9uZXdheSBtZXRob2QsICBubyBhcmdzCisgICAgcHVibGljIGZ1bmN0aW9uIHppcCgpIDogVm9pZCB7CisgICAgICAgIHRyYWNlKCJ6aXAoKSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9zcmMvTWFpbi5oeCBiL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlYmU3MQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHgKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHR1dG9yaWFsLio7CitpbXBvcnQgc2hhcmVkLio7CisKKworZW51bSBQcm90IHsKKyAgICBiaW5hcnk7CisgICAganNvbjsKK30KKworZW51bSBUcm5zIHsKKyAgICBzb2NrZXQ7CisgICAgaHR0cDsKK30KKworY2xhc3MgTWFpbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgc2VydmVyIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIHZhciBmcmFtZWQgOiBCb29sID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIGJ1ZmZlcmVkIDogQm9vbCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIHZhciBwcm90IDogUHJvdCA9IGJpbmFyeTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdHJucyA6IFRybnMgPSBzb2NrZXQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdGFyZ2V0SG9zdCA6IFN0cmluZyA9ICJsb2NhbGhvc3QiOworICAgIHByaXZhdGUgc3RhdGljIHZhciB0YXJnZXRQb3J0IDogSW50ID0gOTA5MDsKKworICAgIHN0YXRpYyBmdW5jdGlvbiBtYWluKCkgeworCisgICAgICAgICNpZiAhIChmbGFzaCB8fCBqcyB8fCBwaHB3ZWJzZXJ2ZXIpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIFBhcnNlQXJncygpOworICAgICAgICB9IGNhdGNoIChlIDogU3RyaW5nKSB7CisgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgIHRyYWNlKEdldEhlbHAoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAjZWxzZWlmICBwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgLy9mb3JjaW5nIHNlcnZlcgorICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICB0cm5zID0gaHR0cDsKKyAgICAgICAgaW5pdFBocFdlYlNlcnZlcigpOworICAgICAgICAvL2NoZWNrIG1ldGhvZAorICAgICAgICBpZihwaHAuV2ViLmdldE1ldGhvZCgpICE9ICdQT1NUJykgeworICAgICAgICAgIFN5cy5wcmludGxuKCdodHRwIGVuZHBvaW50IGZvciB0aHJpZnQgdGVzdCBzZXJ2ZXInKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgI2VuZAorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2VydmVyKQorICAgICAgICAgICAgICAgIFJ1blNlcnZlcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFJ1bkNsaWVudCgpOworICAgICAgICB9IGNhdGNoIChlIDogU3RyaW5nKSB7CisgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyYWNlKCJDb21wbGV0ZWQuIik7CisgICAgfQorCisgICAgI2lmIHBocHdlYnNlcnZlcgorICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRQaHBXZWJTZXJ2ZXIoKQorICAgIHsKKyAgICAgICAgLy9yZW1hcCB0cmFjZSB0byBlcnJvciBsb2cKKyAgICAgICAgaGF4ZS5Mb2cudHJhY2UgPSBmdW5jdGlvbih2OkR5bmFtaWMsID9pbmZvczpoYXhlLlBvc0luZm9zKQorICAgICAgICB7CisgICAgICAgICAgLy8gaGFuZGxlIHRyYWNlCisgICAgICAgICAgdmFyIG5ld1ZhbHVlIDogRHluYW1pYzsKKyAgICAgICAgICBpZiAoaW5mb3MgIT0gbnVsbCAmJiBpbmZvcy5jdXN0b21QYXJhbXMhPW51bGwpIHsKKyAgICAgICAgICAgIHZhciBleHRyYTpTdHJpbmcgPSAiIjsKKyAgICAgICAgICAgIGZvciggdiBpbiBpbmZvcy5jdXN0b21QYXJhbXMgKQorICAgICAgICAgICAgICBleHRyYSArPSAiLCIgKyB2OworICAgICAgICAgICAgbmV3VmFsdWUgPSB2ICsgZXh0cmE7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbmV3VmFsdWUgPSB2OworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgbXNnID0gaW5mb3MgIT0gbnVsbCA/IGluZm9zLmZpbGVOYW1lICsgJzonICsgaW5mb3MubGluZU51bWJlciArICc6ICcgOiAnJzsKKyAgICAgICAgICBTeXMuc3RkZXJyKCkud3JpdGVTdHJpbmcoJyR7bXNnfSR7bmV3VmFsdWV9XG4nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kCisKKworICAgICNpZiAhIChmbGFzaCB8fCBqcykKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIEdldEhlbHAoKSA6IFN0cmluZyB7CisgICAgICAgIHJldHVybiBTeXMuZXhlY3V0YWJsZVBhdGgoKSsiICBtb2R1cyAgdHJuc09wdGlvbiAgdHJhbnNwb3J0ICBwcm90b2NvbFxuIgorICAgICAgICArIk9wdGlvbnM6XG4iCisgICAgICAgICsiICBtb2R1czogICAgICAgY2xpZW50LCBzZXJ2ZXIgICAoZGVmYXVsdDogY2xpZW50KVxuIgorICAgICAgICArIiAgdHJuc09wdGlvbjogIGZyYW1lZCwgYnVmZmVyZWQgKGRlZmF1bHQ6IG5vbmUpXG4iCisgICAgICAgICsiICB0cmFuc3BvcnQ6ICAgc29ja2V0LCBodHRwICAgICAoZGVmYXVsdDogc29ja2V0KVxuIgorICAgICAgICArIiAgcHJvdG9jb2w6ICAgIGJpbmFyeSwganNvbiAgICAgKGRlZmF1bHQ6IGJpbmFyeSlcbiIKKyAgICAgICAgKyJcbiIKKyAgICAgICAgKyJBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbC5cbiI7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBQYXJzZUFyZ3MoKSA6IFZvaWQgeworICAgICAgICB2YXIgc3RlcCA9IDA7CisgICAgICAgIGZvciAoYXJnIGluIFN5cy5hcmdzKCkpIHsKKworICAgICAgICAgICAgLy8gc2VydmVyfGNsaWVudAorICAgICAgICAgICAgc3dpdGNoKHN0ZXApIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICArK3N0ZXA7CisgICAgICAgICAgICAgICAgaWYgKCBhcmcgPT0gImNsaWVudCIpCisgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhcmcgPT0gInNlcnZlciIpCisgICAgICAgICAgICAgICAgICAgIHNlcnZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyAiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyI7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAoIGFyZyA9PSAiZnJhbWVkIikgeworICAgICAgICAgICAgICAgICAgICBmcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGFyZyA9PSAiYnVmZmVyZWQiKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBhcmcgPT0gInNvY2tldCIpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJucyA9IHNvY2tldDsKKyAgICAgICAgICAgICAgICAgICAgKytzdGVwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGFyZyA9PSAiaHR0cCIpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJucyA9IGh0dHA7CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAiVW5rbm93biB0cmFuc3BvcnQgIithcmc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKCBhcmcgPT0gImJpbmFyeSIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdCA9IGJpbmFyeTsKKyAgICAgICAgICAgICAgICAgICAgKytzdGVwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGFyZyA9PSAianNvbiIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdCA9IGpzb247CisgICAgICAgICAgICAgICAgICAgICsrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAiVW5rbm93biBwcm90b2NvbCAiK2FyZzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIlVuZXhwZWN0ZWQgYXJndW1lbnQgIithcmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZnJhbWVkICYmIGJ1ZmZlcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCJXTjogZnJhbWVkIHN1cGVyc2VkZXMgYnVmZmVyZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgI2VuZAorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gQ2xpZW50U2V0dXAoKSA6IENhbGN1bGF0b3IgeworICAgICAgICAgdHJhY2UoIkNsaWVudCBjb25maWd1cmF0aW9uOiIpOworCisgICAgICAgIC8vIGVuZHBvaW50IHRyYW5zcG9ydAorICAgICAgICB2YXIgdHJhbnNwb3J0IDogVFRyYW5zcG9ydDsKKyAgICAgICAgc3dpdGNoKHRybnMpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBzb2NrZXQ6CisgICAgICAgICAgICAgdHJhY2UoJy0gc29ja2V0IHRyYW5zcG9ydCAkdGFyZ2V0SG9zdDokdGFyZ2V0UG9ydCcpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoIHRhcmdldEhvc3QsIHRhcmdldFBvcnQpOworICAgICAgICBjYXNlIGh0dHA6CisgICAgICAgICAgICB2YXIgdXJpID0gJ2h0dHA6Ly8ke3RhcmdldEhvc3R9OiR7dGFyZ2V0UG9ydH0nOworICAgICAgICAgICAgdHJhY2UoJy0gSFRUUCB0cmFuc3BvcnQgJHVyaScpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KHVyaSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRyYW5zcG9ydCI7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIG9wdGluYWwgbGF5ZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgaWYgKCBmcmFtZWQpIHsKKyAgICAgICAgICAgIHRyYWNlKCItIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIH0gZWxzZSBpZiAoIGJ1ZmZlcmVkKSB7CisgICAgICAgICAgICB0cmFjZSgiLSBidWZmZXJlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gcHJvdG9jb2wKKyAgICAgICAgdmFyIHByb3RvY29sIDogVFByb3RvY29sOworICAgICAgICBzd2l0Y2gocHJvdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGJpbmFyeToKKyAgICAgICAgICAgICB0cmFjZSgiLSBiaW5hcnkgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woIHRyYW5zcG9ydCk7CisgICAgICAgIGNhc2UganNvbjoKKyAgICAgICAgICAgICB0cmFjZSgiLSBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgcHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCggdHJhbnNwb3J0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgcHJvdG9jb2wiOworICAgICAgICB9CisKKworICAgICAgICAvLyBwdXQgZXZlcnl0aGluZyB0b2dldGhlcgorICAgICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICAgICByZXR1cm4gbmV3IENhbGN1bGF0b3JJbXBsKHByb3RvY29sLHByb3RvY29sKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFJ1bkNsaWVudCgpIDogVm9pZCB7CisgICAgICAgIHZhciBjbGllbnQgPSBDbGllbnRTZXR1cCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGNsaWVudC5waW5nKCk7CisgICAgICAgICAgICB0cmFjZSgicGluZygpIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IFRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRyYWNlKCdwaW5nKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHRyYWNlKCdwaW5nKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgc3VtID0gY2xpZW50LmFkZCggMSwgMSk7CisgICAgICAgICAgICB0cmFjZSgnMSsxPSRzdW0nKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IFRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRyYWNlKCdhZGQoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogRHluYW1pYykgeworICAgICAgICAgICAgdHJhY2UoJ2FkZCgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0KKworCisgICAgICAgIHZhciB3b3JrID0gbmV3IHR1dG9yaWFsLldvcmsoKTsKKyAgICAgICAgd29yay5vcCA9IHR1dG9yaWFsLk9wZXJhdGlvbi5ESVZJREU7CisgICAgICAgIHdvcmsubnVtMSA9IDE7CisgICAgICAgIHdvcmsubnVtMiA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKCAxLCB3b3JrKTsKKyAgICAgICAgICAgIHRyYWNlKCdXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCEgUmVzdWx0ID0gJHF1b3RpZW50Jyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgnY2FsY3VsYXRlKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHRyYWNlKCdjYWxjdWxhdGUoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9CisKKyAgICAgICAgd29yay5vcCA9IHR1dG9yaWFsLk9wZXJhdGlvbi5TVUJUUkFDVDsKKyAgICAgICAgd29yay5udW0xID0gMTU7CisgICAgICAgIHdvcmsubnVtMiA9IDEwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKCAxLCB3b3JrKTsKKyAgICAgICAgICAgIHRyYWNlKCcxNS0xMD0kZGlmZicpOworICAgICAgICB9IGNhdGNoKGVycm9yIDogVEV4Y2VwdGlvbikgeworICAgICAgICAgICAgdHJhY2UoJ2NhbGN1bGF0ZSgpIGZhaWxlZDogJGVycm9yJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZSgnY2FsY3VsYXRlKCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBsb2cgOiBTaGFyZWRTdHJ1Y3QgPSBjbGllbnQuZ2V0U3RydWN0KCAxKTsKKyAgICAgICAgICAgIHZhciBsb2d2YWwgPSBsb2cudmFsdWU7CisgICAgICAgICAgICB0cmFjZSgnQ2hlY2sgbG9nOiAkbG9ndmFsJyk7CisgICAgICAgIH0gY2F0Y2goZXJyb3IgOiBURXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0cmFjZSgnZ2V0U3RydWN0KCkgZmFpbGVkOiAkZXJyb3InKTsKKyAgICAgICAgfSBjYXRjaChlcnJvciA6IER5bmFtaWMpIHsKKyAgICAgICAgICAgIHRyYWNlKCdnZXRTdHJ1Y3QoKSBmYWlsZWQ6ICRlcnJvcicpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBTZXJ2ZXJTZXR1cCgpIDogVFNlcnZlciB7CisgICAgICAgICB0cmFjZSgiU2VydmVyIGNvbmZpZ3VyYXRpb246Iik7CisKKyAgICAgICAgLy8gZW5kcG9pbnQgdHJhbnNwb3J0CisgICAgICAgIHZhciB0cmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgc3dpdGNoKHRybnMpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBzb2NrZXQ6CisgICAgICAgICAgICAjaWYgKGZsYXNoIHx8IGpzKQorICAgICAgICAgICAgdGhyb3cgJ2N1cnJlbnQgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBzb2NrZXQgc2VydmVycyc7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgIHRyYWNlKCctIHNvY2tldCB0cmFuc3BvcnQgcG9ydCAkdGFyZ2V0UG9ydCcpOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoIHRhcmdldFBvcnQpOworICAgICAgICAgICAgI2VuZAorICAgICAgICBjYXNlIGh0dHA6CisgICAgICAgICAgICAjaWYgIXBocHdlYnNlcnZlcgorICAgICAgICAgICAgICB0aHJvdyAiSFRUUCBzZXJ2ZXIgbm90IGltcGxlbWVudGVkIHlldCI7CisgICAgICAgICAgICAgIC8vdHJhY2UoIi0gaHR0cCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgLy90cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQoIHRhcmdldEhvc3QpOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgdHJhY2UoIi0gaHR0cCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRXcmFwcGluZ1NlcnZlclRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgVFN0cmVhbVRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBURmlsZVN0cmVhbSgicGhwOi8vaW5wdXQiLCBSZWFkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBURmlsZVN0cmVhbSgicGhwOi8vb3V0cHV0IiwgQXBwZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICNlbmQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgdHJhbnNwb3J0IjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9wdGlvbmFsOiBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICB2YXIgdHJhbnNmYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsOworICAgICAgICBpZiAoIGZyYW1lZCkgeworICAgICAgICAgICAgdHJhY2UoIi0gZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgdHJhbnNmYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgIH0gZWxzZSBpZiAoIGJ1ZmZlcmVkKSB7CisgICAgICAgICAgICB0cmFjZSgiLSBidWZmZXJlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRyYW5zZmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm90b2NvbAorICAgICAgICB2YXIgcHJvdGZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgc3dpdGNoKHByb3QpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBiaW5hcnk6CisgICAgICAgICAgICAgdHJhY2UoIi0gYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgcHJvdGZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICAgICAgICBjYXNlIGpzb246CisgICAgICAgICAgICB0cmFjZSgiLSBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgcHJvdGZhY3RvcnkgPSBuZXcgVEpTT05Qcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgcHJvdG9jb2wiOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKTsKKyAgICAgICAgdmFyIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICB2YXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKKyAgICAgICAgI2lmIHBocHdlYnNlcnZlcgorICAgICAgICBzZXJ2ZXIucnVuT25jZSA9IHRydWU7CisgICAgICAgICNlbmQKKworICAgICAgICByZXR1cm4gc2VydmVyOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gUnVuU2VydmVyKCkgOiBWb2lkIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXIgPSBTZXJ2ZXJTZXR1cCgpOworCisgICAgICAgICAgICB0cmFjZSgiXG5TdGFydGluZyB0aGUgc2VydmVyLi4uIik7CisgICAgICAgICAgICBzZXJ2ZXIuU2VydmUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdSdW5TZXJ2ZXIoKSBmYWlsZWQ6ICRlJyk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2UoImRvbmUuIik7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL0hhc2tlbGxDbGllbnQuaHMgYi90dXRvcmlhbC9ocy9IYXNrZWxsQ2xpZW50LmhzCmluZGV4IGE1NjE4N2IuLmJkMjlkZjAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2hzL0hhc2tlbGxDbGllbnQuaHMKKysrIGIvdHV0b3JpYWwvaHMvSGFza2VsbENsaWVudC5ocwpAQCAtMzAsNyArMzAsOSBAQAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlCiBpbXBvcnQgVGhyaWZ0LlNlcnZlcgogCitpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KIGltcG9ydCBEYXRhLk1heWJlCitpbXBvcnQgRGF0YS5UZXh0LkxhenkKIGltcG9ydCBUZXh0LlByaW50ZgogaW1wb3J0IE5ldHdvcmsKIApAQCAtNDYsMjggKzQ4LDI3IEBACiAgIHByaW50ZiAiMSsxPSVkXG4iIHN1bQogCiAKLSAgbGV0IHdvcmsgPSBXb3JrIHsgZl9Xb3JrX29wID0gSnVzdCBESVZJREUsCi0gICAgICAgICAgICAgICAgICAgIGZfV29ya19udW0xID0gSnVzdCAxLAotICAgICAgICAgICAgICAgICAgICBmX1dvcmtfbnVtMiA9IEp1c3QgMCwKLSAgICAgICAgICAgICAgICAgICAgZl9Xb3JrX2NvbW1lbnQgPSBOb3RoaW5nCisgIGxldCB3b3JrID0gV29yayB7IHdvcmtfb3AgPSBESVZJREUsCisgICAgICAgICAgICAgICAgICAgIHdvcmtfbnVtMSA9IDEsCisgICAgICAgICAgICAgICAgICAgIHdvcmtfbnVtMiA9IDAsCisgICAgICAgICAgICAgICAgICAgIHdvcmtfY29tbWVudCA9IE5vdGhpbmcKICAgICAgICAgICAgICAgICAgIH0KIAotICAtLSBUT0RPIC0gZ2V0IHRoaXMgb25lIHdvcmtpbmcKLSAgLS1jYXRjaCAoQ2xpZW50LmNhbGN1bGF0ZSBjbGllbnQgMSB3b3JrKSAoXGV4Y2VwdCAtPgotICAtLSAgICAgcHJpbnRmICJJbnZhbGlkT3AgJXMiIChzaG93IGV4Y2VwdCkpCisgIENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoIChwcmludGYgIjEvMD0lZFxuIiA9PDwgQ2xpZW50LmNhbGN1bGF0ZSBjbGllbnQgMSB3b3JrKQorICAgICAgICAoXGUgLT4gcHJpbnRmICJJbnZhbGlkT3BlcmF0aW9uICVzXG4iIChzaG93IChlIDo6IEludmFsaWRPcGVyYXRpb24pKSkKIAogCi0gIGxldCB3b3JrID0gV29yayB7IGZfV29ya19vcCA9IEp1c3QgU1VCVFJBQ1QsCi0gICAgICAgICAgICAgICAgICAgIGZfV29ya19udW0xID0gSnVzdCAxNSwKLSAgICAgICAgICAgICAgICAgICAgZl9Xb3JrX251bTIgPSBKdXN0IDEwLAotICAgICAgICAgICAgICAgICAgICBmX1dvcmtfY29tbWVudCA9IE5vdGhpbmcKKyAgbGV0IHdvcmsgPSBXb3JrIHsgd29ya19vcCA9IFNVQlRSQUNULAorICAgICAgICAgICAgICAgICAgICB3b3JrX251bTEgPSAxNSwKKyAgICAgICAgICAgICAgICAgICAgd29ya19udW0yID0gMTAsCisgICAgICAgICAgICAgICAgICAgIHdvcmtfY29tbWVudCA9IE5vdGhpbmcKICAgICAgICAgICAgICAgICAgIH0KIAogICBkaWZmIDwtIENsaWVudC5jYWxjdWxhdGUgY2xpZW50IDEgd29yawogICBwcmludGYgIjE1LTEwPSVkXG4iIGRpZmYKIAogICBsb2cgPC0gU0NsaWVudC5nZXRTdHJ1Y3QgY2xpZW50IDEKLSAgcHJpbnRmICJDaGVjayBsb2c6ICVzXG4iICAkIGZyb21KdXN0ICQgZl9TaGFyZWRTdHJ1Y3RfdmFsdWUgbG9nCisgIHByaW50ZiAiQ2hlY2sgbG9nOiAlc1xuIiAkIHVucGFjayAkIHNoYXJlZFN0cnVjdF92YWx1ZSBsb2cKIAogICAtLSBDbG9zZSEKICAgdENsb3NlIHRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvSGFza2VsbFNlcnZlci5ocyBiL3R1dG9yaWFsL2hzL0hhc2tlbGxTZXJ2ZXIuaHMKaW5kZXggNGY5YWI3Yy4uY2ZlMTM0NCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvaHMvSGFza2VsbFNlcnZlci5ocworKysgYi90dXRvcmlhbC9ocy9IYXNrZWxsU2VydmVyLmhzCkBAIC0xNyw2ICsxNyw4IEBACiAtLSB1bmRlciB0aGUgTGljZW5zZS4KIC0tCiAKK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KKwogaW1wb3J0IHF1YWxpZmllZCBDYWxjdWxhdG9yCiBpbXBvcnQgQ2FsY3VsYXRvcl9JZmFjZQogaW1wb3J0IFR1dG9yaWFsX1R5cGVzCkBAIC0yOCw2ICszMCw4IEBACiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAogaW1wb3J0IFRocmlmdC5TZXJ2ZXIKIAoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5TdHJpbmcKIGltcG9ydCBEYXRhLk1heWJlCiBpbXBvcnQgVGV4dC5QcmludGYKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAodGhyb3cpCkBAIC0zNiw3ICs0MCw3IEBACiBpbXBvcnQgRGF0YS5NYXAgKCghKSkKIGltcG9ydCBEYXRhLk1vbm9pZAogCi1kYXRhIENhbGN1bGF0b3JIYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIge21hdGhMb2cgOjogTVZhciAoTS5NYXAgSW50IFNoYXJlZFN0cnVjdCl9CitkYXRhIENhbGN1bGF0b3JIYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIge21hdGhMb2cgOjogTVZhciAoTS5NYXAgSW50MzIgU2hhcmVkU3RydWN0KX0KIAogbmV3Q2FsY3VsYXRvckhhbmRsZXIgPSBkbwogICBsb2cgPC0gbmV3TVZhciBtZW1wdHkKQEAgLTQ1LDcgKzQ5LDcgQEAKIGluc3RhbmNlIFNoYXJlZFNlcnZpY2VfSWZhY2UgQ2FsY3VsYXRvckhhbmRsZXIgd2hlcmUKICAgZ2V0U3RydWN0IHNlbGYgayA9IGRvCiAgICAgbXlMb2cgPC0gcmVhZE1WYXIgKG1hdGhMb2cgc2VsZikKLSAgICByZXR1cm4gJCAobXlMb2cgISAoZnJvbUp1c3QgaykpCisgICAgcmV0dXJuICQgKG15TG9nICEgaykKIAogCiBpbnN0YW5jZSBDYWxjdWxhdG9yX0lmYWNlIENhbGN1bGF0b3JIYW5kbGVyIHdoZXJlCkBAIC01Myw4ICs1Nyw4IEBACiAgICAgcHJpbnQgInBpbmcoKSIKIAogICBhZGQgXyBuMSBuMiA9IGRvCi0gICAgcHJpbnRmICJhZGQoJWQsJWQpXG4iIChmcm9tSnVzdCBuMSkgKGZyb21KdXN0IG4yKQotICAgIHJldHVybiAoKGZyb21KdXN0IG4xKSsoZnJvbUp1c3QgbjIpKQorICAgIHByaW50ZiAiYWRkKCVkLCVkKVxuIiBuMSBuMgorICAgIHJldHVybiAobjEgKyBuMikKIAogICBjYWxjdWxhdGUgc2VsZiBtbG9naWQgbXdvcmsgPSBkbwogICAgIHByaW50ZiAiY2FsY3VsYXRlKCVkLCAlcylcbiIgbG9naWQgKHNob3cgd29yaykKQEAgLTcwLDI3ICs3NCwyNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiBudW0yIHdvcmsgPT0gMCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfSW52YWxpZE9wZXJhdGlvbl93aGF0ID0gSnVzdCAkIGZyb21FbnVtICQgb3Agd29yaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfSW52YWxpZE9wZXJhdGlvbl93aHkgPSBKdXN0ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkT3BlcmF0aW9uX3doYXRPcCA9IGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtICQgb3Agd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRPcGVyYXRpb25fd2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICBudW0xIHdvcmsgYGRpdmAgbnVtMiB3b3JrCiAKLSAgICBsZXQgbG9nRW50cnkgPSBTaGFyZWRTdHJ1Y3QgKEp1c3QgbG9naWQpIChKdXN0IChzaG93IHZhbCkpCisgICAgbGV0IGxvZ0VudHJ5ID0gU2hhcmVkU3RydWN0IGxvZ2lkIChmcm9tU3RyaW5nICQgc2hvdyAkIHZhbCkKICAgICBtb2RpZnlNVmFyXyAobWF0aExvZyBzZWxmKSAkIHJldHVybiAuKE0uaW5zZXJ0IGxvZ2lkIGxvZ0VudHJ5KQogCi0gICAgcmV0dXJuIHZhbAorICAgIHJldHVybiAkISB2YWwKIAogICAgd2hlcmUKICAgICAgLS0gc3R1cGlkIGR5bmFtaWMgbGFuZ3VhZ2VzIGYnaW5nIGl0IHVwCi0gICAgIG51bTEgPSBmcm9tSnVzdCAuIGZfV29ya19udW0xCi0gICAgIG51bTIgPSBmcm9tSnVzdCAuIGZfV29ya19udW0yCi0gICAgIG9wID0gZnJvbUp1c3QgLiBmX1dvcmtfb3AKLSAgICAgbG9naWQgPSBmcm9tSnVzdCBtbG9naWQKLSAgICAgd29yayA9IGZyb21KdXN0IG13b3JrCi0KLQotICAgIC0tcmV0dXJuIHZhbAorICAgICBudW0xID0gd29ya19udW0xCisgICAgIG51bTIgPSB3b3JrX251bTIKKyAgICAgb3AgPSB3b3JrX29wCisgICAgIGxvZ2lkID0gbWxvZ2lkCisgICAgIHdvcmsgPSBtd29yawogCiAgIHppcCBfID0KICAgICBwcmludCAiemlwKCkiCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9MSUNFTlNFIGIvdHV0b3JpYWwvaHMvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjZkN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaHMvTElDRU5TRQpAQCAtMCwwICsxLDIzOSBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NPRlRXQVJFIERJU1RSSUJVVEVEIFdJVEggVEhSSUZUOgorCitUaGUgQXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBpbmNsdWRlcyBhIG51bWJlciBvZiBzdWJjb21wb25lbnRzIHdpdGgKK3NlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiBZb3VyIHVzZSBvZiB0aGUgc291cmNlCitjb2RlIGZvciB0aGUgdGhlc2Ugc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BvcnRpb25zIG9mIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZToKKworICBsaWIvZXJsL3NyYy9NYWtlZmlsZS5hbQorCitQbGVhc2Ugc2VlIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBhY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYW5kIGNvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGNvbXBvbmVudHM6CisKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDcgVGhvbWFzIFBvcnNjaGJlcmcgPHRob21hc0ByYW5kc3ByaW5nZXIuZGU+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0CisjICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkCisjICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzOgorCisvKgorICAgIGpzb25fcGFyc2UuanMKKyAgICAyMDE1LTA1LTAyCisgICAgUHVibGljIERvbWFpbi4KKyAgICBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCisKKyovCisoQnkgRG91Z2xhcyBDcm9ja2ZvcmQgPGRvdWdsYXNAY3JvY2tmb3JkLmNvbT4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9ocy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hM2VjY2MyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2FsbC1sb2NhbDoKKwkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBocyAtciAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoQ0FCQUwpIGluc3RhbGwKKworaW5zdGFsbC1leGVjLWhvb2s6CisJJChDQUJBTCkgaW5zdGFsbAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBIYXNrZWxsIGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJJChDQUJBTCkgY2xlYW4KKwkkKFJNKSAtciBnZW4tKgorCitjaGVjay1sb2NhbDoKKwkkKENBQkFMKSBjaGVjaworCit0dXRvcmlhbHNlcnZlcjogYWxsCisJZGlzdC9idWlsZC9IYXNrZWxsU2VydmVyL0hhc2tlbGxTZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCWRpc3QvYnVpbGQvSGFza2VsbENsaWVudC9IYXNrZWxsQ2xpZW50CisKK0VYVFJBX0RJU1QgPSBcCisJTElDRU5TRQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvU2V0dXAubGhzIGIvdHV0b3JpYWwvaHMvU2V0dXAubGhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYxODIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ocy9TZXR1cC5saHMKQEAgLTAsMCArMSwyMSBAQAorIyEvdXNyL2Jpbi9lbnYgcnVuaGFza2VsbAorCis+IC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKz4gLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKz4gLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKz4gLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCis+IC0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKz4gLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorPiAtLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKz4gLS0KKz4gLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKz4gLS0KKz4gLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorPiAtLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorPiAtLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKz4gLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKz4gLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworPiAtLSB1bmRlciB0aGUgTGljZW5zZS4KKworPiBpbXBvcnQgRGlzdHJpYnV0aW9uLlNpbXBsZQorPiBtYWluID0gZGVmYXVsdE1haW4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsIGIvdHV0b3JpYWwvaHMvVGhyaWZ0VHV0b3JpYWwuY2FiYWwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAxNjU1Y2U3Li42MmU2ODJmCi0tLSBhL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCisrKyBiL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCkBAIC0xOCwzMSArMTgsNTYgQEAKIC0tCiAKIE5hbWU6ICAgICAgICAgICBUaHJpZnRUdXRvcmlhbAotVmVyc2lvbjogICAgICAgIDAuMS4wCi1DYWJhbC1WZXJzaW9uOiAgPj0gMS4yCi1MaWNlbnNlOiAgICAgICAgQXBhY2hlMgorVmVyc2lvbjogICAgICAgIDEuMC4wCitDYWJhbC1WZXJzaW9uOiAgPj0gMS40CitMaWNlbnNlOiAgICAgICAgT3RoZXJMaWNlbnNlCiBDYXRlZ29yeTogICAgICAgRm9yZWlnbgogQnVpbGQtVHlwZTogICAgIFNpbXBsZQogU3lub3BzaXM6ICAgICAgIFRocmlmdCBUdXRvcmlhbCBsaWJyYXJ5IHBhY2thZ2UKK0hvbWVwYWdlOiAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK0J1Zy1SZXBvcnRzOiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVAorTWFpbnRhaW5lcjogICAgIGRldkB0aHJpZnQuYXBhY2hlLm9yZworTGljZW5zZS1GaWxlOiAgIExJQ0VOU0UKKworRGVzY3JpcHRpb246CisgIEhhc2tlbGwgdHV0b3JpYWwgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0uIFJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHRocmlmdCBjb2RlIGdlbmVyYXRvci4KKworZmxhZyBuZXR3b3JrLXVyaQorICAgZGVzY3JpcHRpb246IEdldCBOZXR3b3JrLlVSSSBmcm9tIHRoZSBuZXR3b3JrLXVyaSBwYWNrYWdlCisgICBkZWZhdWx0OiBUcnVlCiAKIEV4ZWN1dGFibGUgSGFza2VsbFNlcnZlcgogICBNYWluLWlzOiBIYXNrZWxsU2VydmVyLmhzCiAgIEhzLVNvdXJjZS1EaXJzOgotICAgIC4sIC4uL2dlbi1ocy8KKyAgICAuLCBnZW4taHMvCiAgIEJ1aWxkLURlcGVuZHM6Ci0gICAgYmFzZSA+PTQsIG5ldHdvcmssIGdoYy1wcmltLCBjb250YWluZXJzLCBUaHJpZnQKLSAgZ2hjLW9wdGlvbnM6Ci0gICAgLWZnbGFzZ293LWV4dHMKKyAgICBiYXNlID49IDQsIGJhc2UgPCA1LCBnaGMtcHJpbSwgY29udGFpbmVycywgdGhyaWZ0LCB2ZWN0b3IsIHVub3JkZXJlZC1jb250YWluZXJzLCB0ZXh0LCBoYXNoYWJsZSwgYnl0ZXN0cmluZywgUXVpY2tDaGVjawogICBFeHRlbnNpb25zOgotICAgIERlcml2ZURhdGFUeXBlYWJsZQorICAgIERlcml2ZURhdGFUeXBlYWJsZSwKKyAgICBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uLAorICAgIEZsZXhpYmxlSW5zdGFuY2VzLAorICAgIEtpbmRTaWduYXR1cmVzLAorICAgIE1hZ2ljSGFzaCwKKyAgICBSYW5rTlR5cGVzLAorICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCisgICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKIAogRXhlY3V0YWJsZSBIYXNrZWxsQ2xpZW50CiAgIE1haW4taXM6IEhhc2tlbGxDbGllbnQuaHMKICAgSHMtU291cmNlLURpcnM6Ci0gICAgLiwgLi4vZ2VuLWhzLworICAgIC4sIGdlbi1ocy8KICAgQnVpbGQtRGVwZW5kczoKLSAgICBiYXNlID49NCwgbmV0d29yaywgZ2hjLXByaW0sIGNvbnRhaW5lcnMsIFRocmlmdAotICBnaGMtb3B0aW9uczoKLSAgICAtZmdsYXNnb3ctZXh0cworICAgIGJhc2UgPj0gNCwgYmFzZSA8IDUsIGdoYy1wcmltLCBjb250YWluZXJzLCB0aHJpZnQsIHZlY3RvciwgUXVpY2tDaGVjaworICBpZiBmbGFnKG5ldHdvcmstdXJpKQorICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrLXVyaSA+PSAyLjYsIG5ldHdvcmsgPj0gMi42CisgIGVsc2UKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yayA8IDIuNgogICBFeHRlbnNpb25zOgotICAgIERlcml2ZURhdGFUeXBlYWJsZQorICAgIERlcml2ZURhdGFUeXBlYWJsZSwKKyAgICBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uLAorICAgIEZsZXhpYmxlSW5zdGFuY2VzLAorICAgIEtpbmRTaWduYXR1cmVzLAorICAgIE1hZ2ljSGFzaCwKKyAgICBSYW5rTlR5cGVzLAorICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCisgICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvSmF2YUNsaWVudCBiL3R1dG9yaWFsL2phdmEvSmF2YUNsaWVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjhkODdiOC4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9qYXZhL0phdmFDbGllbnQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIS9iaW4vc2gKLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWphdmEgLWNwIHR1dG9yaWFsLmphcjovdXNyL2xvY2FsL2xpYi9saWJ0aHJpZnQuamFyIEphdmFDbGllbnQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvSmF2YVNlcnZlciBiL3R1dG9yaWFsL2phdmEvSmF2YVNlcnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODk2MTYwMC4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9qYXZhL0phdmFTZXJ2ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIS9iaW4vc2gKLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWphdmEgLWNwIHR1dG9yaWFsLmphcjovdXNyL2xvY2FsL2xpYi9saWJ0aHJpZnQuamFyIEphdmFTZXJ2ZXIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9qYXZhL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1OTA4YjEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qYXZhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitleHBvcnQgQ0xBU1NQQVRICisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCisJJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCisKK2FsbC1sb2NhbDoKKwkkKEFOVCkgJChBTlRfRkxBR1MpIGNvbXBpbGUKKworY2hlY2stbG9jYWw6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCit0dXRvcmlhbDogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0dXRvcmlhbAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0dXRvcmlhbHNlcnZlcgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0dXRvcmlhbGNsaWVudAorCitFWFRSQV9ESVNUID0gXAorCWJ1aWxkLnhtbCBcCisJc3JjIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvUkVBRE1FLm1kIGIvdHV0b3JpYWwvamF2YS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwOWZlYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2phdmEvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjQgQEAKK1RocmlmdCBKYXZhIFR1dG9yaWFsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorMSkgQ29tcGlsZSB0aGUgSmF2YSBsaWJyYXJ5CisKKyAgICB0aHJpZnQvbGliL2phdmEkIG1ha2UKK29yOgorCisgICAgdGhyaWZ0L2xpYi9qYXZhJCBhbnQKKworNCkgUnVuIHRoZSB0dXRvcmlhbDoKKworc3RhcnQgc2VydmVyIGFuZCBjbGllbnQgd2l0aCBvbmUgc3RlcDoKKworICAgIHRocmlmdC90dXRvcmlhbC9qYXZhJCBtYWtlIHR1dG9yaWFsCisKK29yOgorCisgICAgdGhyaWZ0L3R1dG9yaWFsL2phdmEkIG1ha2UgdHV0b3JpYWxzZXJ2ZXIKKyAgICB0aHJpZnQvdHV0b3JpYWwvamF2YSQgbWFrZSB0dXRvcmlhbGNsaWVudAorCitvcjoKKworICAgIHRocmlmdC90dXRvcmlhbC9qYXZhJCBhbnQgdHV0b3JpYWxzZXJ2ZXIKKyAgICB0aHJpZnQvdHV0b3JpYWwvamF2YSQgYW50IHR1dG9yaWFsY2xpZW50CmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCmluZGV4IDBlYzFlYTQuLjU1Y2RiOGYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCisrKyBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCkBAIC0xOCwyOSArMTgsOTcgQEAKIC0tPgogPHByb2plY3QgbmFtZT0idHV0b3JpYWwiIGRlZmF1bHQ9InR1dG9yaWFsIiBiYXNlZGlyPSIuIj4KIAotICA8ZGVzY3JpcHRpb24+VGhyaWZ0IFR1dG9yaWFsPC9kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPlRocmlmdCBKYXZhIFR1dG9yaWFsPC9kZXNjcmlwdGlvbj4KIAogICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0ic3JjIiAvPgotICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iLi4vZ2VuLWphdmEiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIGxvY2F0aW9uPSJnZW4tamF2YSIgLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjcGF0aCIgbG9jYXRpb249Ii91c3IvbG9jYWwvbGliL2xpYnRocmlmdC5qYXIiIC8+CisKKyAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KKyAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqdGVzdC5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvZGVwcyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgIDwvcGF0aD4KKyAgPHBhdGggaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+CisgICAgPHBhdGggcmVmaWQ9ImxpYnMuY2xhc3NwYXRoIiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2dlbn0iIC8+CisgIDwvcGF0aD4KKyAgPHBhdGggaWQ9InR1dG9yaWFsLmNsYXNzcGF0aCI+CisgICAgPHBhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZH0iIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9InR1dG9yaWFsLmphciIgLz4KKyAgPC9wYXRoPgogCiAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CiAgICAgPHRzdGFtcCAvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vbG9nIi8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRoPSIke2NwYXRofSIgLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGg9IiR7Y3BhdGh9OiR7Z2VufSIgLz4KKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSI+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiIC8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0idHV0b3JpYWwiIGRlcGVuZHM9ImNvbXBpbGUiPgorICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9InR1dG9yaWFsIiAvPgorCisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWwiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIHR1dG9yaWFsIiBkZXBlbmRzPSJjb21waWxlIj4KICAgICA8amFyIGphcmZpbGU9InR1dG9yaWFsLmphciIgYmFzZWRpcj0iJHtidWlsZH0iLz4KKyAgICA8cGFyYWxsZWw+CisgICAgICA8amF2YSBjbGFzc25hbWU9IkphdmFTZXJ2ZXIiIGZvcms9InRydWUiIHRpbWVvdXQ9IjEwMDAwIgorICAgICAgICBjbGFzc3BhdGhyZWY9InR1dG9yaWFsLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy90dXRvcmlhbC5sb2ciPgorICAgICAgPC9qYXZhPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxzbGVlcCBzZWNvbmRzPSIyIi8+CisgICAgICAgIDxlY2hvPnR1dG9yaWFsIGNsaWVudCBzaW1wbGU6PC9lY2hvPgorICAgICAgICA8amF2YSBjbGFzc25hbWU9IkphdmFDbGllbnQiCisgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0dXRvcmlhbC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgICA8YXJnIGxpbmU9InNpbXBsZSIvPgorICAgICAgICA8L2phdmE+CisgICAgICAgIDxlY2hvPnR1dG9yaWFsIGNsaWVudCBzZWN1cmU6PC9lY2hvPgorICAgICAgICA8amF2YSBjbGFzc25hbWU9IkphdmFDbGllbnQiCisgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0dXRvcmlhbC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgICA8YXJnIGxpbmU9InNlY3VyZSIvPgorICAgICAgICA8L2phdmE+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9wYXJhbGxlbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CisgICAgPCEtLSBHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhIHNvdXJjZSAtLT4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgLXIgIC4uL3R1dG9yaWFsLnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0dXRvcmlhbGNsaWVudCIgZGVzY3JpcHRpb249IlJ1biBhIHR1dG9yaWFsIGNsaWVudCIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgPGVjaG8+dHV0b3JpYWwgY2xpZW50IHNpbXBsZTo8L2VjaG8+CisgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhQ2xpZW50IgorICAgICAgY2xhc3NwYXRocmVmPSJ0dXRvcmlhbC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0ic2ltcGxlIi8+CisgICAgPC9qYXZhPgorICAgIDxlY2hvPnR1dG9yaWFsIGNsaWVudCBzZWN1cmU6PC9lY2hvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iSmF2YUNsaWVudCIKKyAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9InNlY3VyZSIvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0dXRvcmlhbHNlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHR1dG9yaWFsIHNlcnZlciIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgICA8amF2YSBjbGFzc25hbWU9IkphdmFTZXJ2ZXIiIGZvcms9InRydWUiCisgICAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0iZmFsc2UiIG91dHB1dD0iJHtidWlsZH0vbG9nL3R1dG9yaWFsLmxvZyI+CisgICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgogICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW59Ii8+CiAgICAgPGRlbGV0ZSBmaWxlPSJ0dXRvcmlhbC5qYXIiIC8+CiAgIDwvdGFyZ2V0PgogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5qYXZhIGIvdHV0b3JpYWwvamF2YS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjk0NGIwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvamF2YS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCisvLyBHZW5lcmF0ZWQgY29kZQoraW1wb3J0IHR1dG9yaWFsLio7CitpbXBvcnQgc2hhcmVkLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworcHVibGljIGNsYXNzIENhbGN1bGF0b3JIYW5kbGVyIGltcGxlbWVudHMgQ2FsY3VsYXRvci5JZmFjZSB7CisKKyAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsU2hhcmVkU3RydWN0PiBsb2c7CisKKyAgcHVibGljIENhbGN1bGF0b3JIYW5kbGVyKCkgeworICAgIGxvZyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFNoYXJlZFN0cnVjdD4oKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHBpbmcoKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJwaW5nKCkiKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgYWRkKGludCBuMSwgaW50IG4yKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZGQoIiArIG4xICsgIiwiICsgbjIgKyAiKSIpOworICAgIHJldHVybiBuMSArIG4yOworICB9CisKKyAgcHVibGljIGludCBjYWxjdWxhdGUoaW50IGxvZ2lkLCBXb3JrIHdvcmspIHRocm93cyBJbnZhbGlkT3BlcmF0aW9uIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGN1bGF0ZSgiICsgbG9naWQgKyAiLCB7IiArIHdvcmsub3AgKyAiLCIgKyB3b3JrLm51bTEgKyAiLCIgKyB3b3JrLm51bTIgKyAifSkiKTsKKyAgICBpbnQgdmFsID0gMDsKKyAgICBzd2l0Y2ggKHdvcmsub3ApIHsKKyAgICBjYXNlIEFERDoKKyAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1VCVFJBQ1Q6CisgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1VTFRJUExZOgorICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBESVZJREU6CisgICAgICBpZiAod29yay5udW0yID09IDApIHsKKyAgICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgIGlvLndoYXRPcCA9IHdvcmsub3AuZ2V0VmFsdWUoKTsKKyAgICAgICAgaW8ud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CisgICAgICAgIHRocm93IGlvOworICAgICAgfQorICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgaW8ud2hhdE9wID0gd29yay5vcC5nZXRWYWx1ZSgpOworICAgICAgaW8ud2h5ID0gIlVua25vd24gb3BlcmF0aW9uIjsKKyAgICAgIHRocm93IGlvOworICAgIH0KKworICAgIFNoYXJlZFN0cnVjdCBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICBlbnRyeS5rZXkgPSBsb2dpZDsKKyAgICBlbnRyeS52YWx1ZSA9IEludGVnZXIudG9TdHJpbmcodmFsKTsKKyAgICBsb2cucHV0KGxvZ2lkLCBlbnRyeSk7CisKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgcHVibGljIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoaW50IGtleSkgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0U3RydWN0KCIgKyBrZXkgKyAiKSIpOworICAgIHJldHVybiBsb2cuZ2V0KGtleSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB6aXAoKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ6aXAoKSIpOworICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9zcmMvSmF2YUNsaWVudC5qYXZhIGIvdHV0b3JpYWwvamF2YS9zcmMvSmF2YUNsaWVudC5qYXZhCmluZGV4IDVkYzcwZWQuLjJlMzVkNDEgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2phdmEvc3JjL0phdmFDbGllbnQuamF2YQorKysgYi90dXRvcmlhbC9qYXZhL3NyYy9KYXZhQ2xpZW50LmphdmEKQEAgLTIyLDY0ICsyMiw4NSBAQAogaW1wb3J0IHNoYXJlZC4qOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNTTFRyYW5zcG9ydEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQogcHVibGljIGNsYXNzIEphdmFDbGllbnQgewogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotICAgIHRyeSB7CiAKLSAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOwotICAgICAgVFByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotICAgICAgQ2FsY3VsYXRvci5DbGllbnQgY2xpZW50ID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKTsKLQotICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKLQotICAgICAgY2xpZW50LnBpbmcoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGluZygpIik7Ci0KLSAgICAgIGludCBzdW0gPSBjbGllbnQuYWRkKDEsMSk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjErMT0iICsgc3VtKTsKLQotICAgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKLQotICAgICAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREU7Ci0gICAgICB3b3JrLm51bTEgPSAxOwotICAgICAgd29yay5udW0yID0gMDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGludCBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvLndoeSk7Ci0gICAgICB9Ci0KLSAgICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7Ci0gICAgICB3b3JrLm51bTEgPSAxNTsKLSAgICAgIHdvcmsubnVtMiA9IDEwOwotICAgICAgdHJ5IHsKLSAgICAgICAgaW50IGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjE1LTEwPSIgKyBkaWZmKTsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvLndoeSk7Ci0gICAgICB9Ci0KLSAgICAgIFNoYXJlZFN0cnVjdCBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaGVjayBsb2c6ICIgKyBsb2cudmFsdWUpOwotCi0gICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKLQotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24geCkgewotICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICBpZiAoYXJncy5sZW5ndGggIT0gMSkgeworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQbGVhc2UgZW50ZXIgJ3NpbXBsZScgb3IgJ3NlY3VyZSciKTsKKyAgICAgIFN5c3RlbS5leGl0KDApOwogICAgIH0KIAorICAgIHRyeSB7CisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgIGlmIChhcmdzWzBdLmNvbnRhaW5zKCJzaW1wbGUiKSkgeworICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2ltaWxhciB0byB0aGUgc2VydmVyLCB5b3UgY2FuIHVzZSB0aGUgcGFyYW1ldGVycyB0byBzZXR1cCBjbGllbnQgcGFyYW1ldGVycyBvcgorICAgICAgICAgKiB1c2UgdGhlIGRlZmF1bHQgc2V0dGluZ3MuIE9uIHRoZSBjbGllbnQgc2lkZSwgeW91IHdpbGwgbmVlZCBhIFRydXN0U3RvcmUgd2hpY2gKKyAgICAgICAgICogY29udGFpbnMgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGUgYWxvbmcgd2l0aCB0aGUgcHVibGljIGtleS4gCisgICAgICAgICAqIEZvciB0aGlzIGV4YW1wbGUgaXQncyBhIHNlbGYtc2lnbmVkIGNlcnQuIAorICAgICAgICAgKi8KKyAgICAgICAgVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5zZXRUcnVzdFN0b3JlKCIuLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIiwgInRocmlmdCIsICJTdW5YNTA5IiwgIkpLUyIpOworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgYSBjbGllbnQgdHJhbnNwb3J0IGluc3RlYWQgb2YgYSBzZXJ2ZXIgdHJhbnNwb3J0LiBUaGUgY29ubmVjdGlvbiBpcyBvcGVuZWQgb24KKyAgICAgICAgICogaW52b2NhdGlvbiBvZiB0aGUgZmFjdG9yeSBtZXRob2QsIG5vIG5lZWQgdG8gc3BlY2lmaWNhbGx5IGNhbGwgb3BlbigpCisgICAgICAgICAqLworICAgICAgICB0cmFuc3BvcnQgPSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTEsIDAsIHBhcmFtcyk7CisgICAgICB9CisKKyAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IG5ldyAgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICBDYWxjdWxhdG9yLkNsaWVudCBjbGllbnQgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpOworCisgICAgICBwZXJmb3JtKGNsaWVudCk7CisKKyAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24geCkgeworICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IAogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmb3JtKENhbGN1bGF0b3IuQ2xpZW50IGNsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgeworICAgIGNsaWVudC5waW5nKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJwaW5nKCkiKTsKKworICAgIGludCBzdW0gPSBjbGllbnQuYWRkKDEsMSk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCIxKzE9IiArIHN1bSk7CisKKyAgICBXb3JrIHdvcmsgPSBuZXcgV29yaygpOworCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREU7CisgICAgd29yay5udW0xID0gMTsKKyAgICB3b3JrLm51bTIgPSAwOworICAgIHRyeSB7CisgICAgICBpbnQgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICAgIH0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby53aHkpOworICAgIH0KKworICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgd29yay5udW0xID0gMTU7CisgICAgd29yay5udW0yID0gMTA7CisgICAgdHJ5IHsKKyAgICAgIGludCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiMTUtMTA9IiArIGRpZmYpOworICAgIH0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby53aHkpOworICAgIH0KKworICAgIFNoYXJlZFN0cnVjdCBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hlY2sgbG9nOiAiICsgbG9nLnZhbHVlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9zcmMvSmF2YVNlcnZlci5qYXZhIGIvdHV0b3JpYWwvamF2YS9zcmMvSmF2YVNlcnZlci5qYXZhCmluZGV4IDE0NDQwZWIuLjc4ODQ3M2EgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2phdmEvc3JjL0phdmFTZXJ2ZXIuamF2YQorKysgYi90dXRvcmlhbC9qYXZhL3NyYy9KYXZhU2VydmVyLmphdmEKQEAgLTE3LDEzICsxNywxNCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNlcnZlci5BcmdzOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2ltcGxlU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNTTFRyYW5zcG9ydEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTZXJ2ZXJUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzOwogCiAvLyBHZW5lcmF0ZWQgY29kZQogaW1wb3J0IHR1dG9yaWFsLio7CkBAIC0zMyw4NyArMzQsNzcgQEAKIAogcHVibGljIGNsYXNzIEphdmFTZXJ2ZXIgewogCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9yLklmYWNlIHsKKyAgcHVibGljIHN0YXRpYyBDYWxjdWxhdG9ySGFuZGxlciBoYW5kbGVyOwogCi0gICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsU2hhcmVkU3RydWN0PiBsb2c7Ci0KLSAgICBwdWJsaWMgQ2FsY3VsYXRvckhhbmRsZXIoKSB7Ci0gICAgICBsb2cgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTaGFyZWRTdHJ1Y3Q+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGluZygpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGluZygpIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBhZGQoaW50IG4xLCBpbnQgbjIpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkKCIgKyBuMSArICIsIiArIG4yICsgIikiKTsKLSAgICAgIHJldHVybiBuMSArIG4yOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKSB0aHJvd3MgSW52YWxpZE9wZXJhdGlvbiB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGN1bGF0ZSgiICsgbG9naWQgKyAiLCB7IiArIHdvcmsub3AgKyAiLCIgKyB3b3JrLm51bTEgKyAiLCIgKyB3b3JrLm51bTIgKyAifSkiKTsKLSAgICAgIGludCB2YWwgPSAwOwotICAgICAgc3dpdGNoICh3b3JrLm9wKSB7Ci0gICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6Ci0gICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKLSAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgotICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgotICAgICAgICBpZiAod29yay5udW0yID09IDApIHsKLSAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKLSAgICAgICAgICBpby53aGF0ID0gd29yay5vcDsKLSAgICAgICAgICBpby53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKLSAgICAgICAgICB0aHJvdyBpbzsKLSAgICAgICAgfQotICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgIGlvLndoYXQgPSB3b3JrLm9wOwotICAgICAgICBpby53aHkgPSAiVW5rbm93biBvcGVyYXRpb24iOwotICAgICAgICB0aHJvdyBpbzsKLSAgICAgIH0KLQotICAgICAgU2hhcmVkU3RydWN0IGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOwotICAgICAgZW50cnkua2V5ID0gbG9naWQ7Ci0gICAgICBlbnRyeS52YWx1ZSA9IEludGVnZXIudG9TdHJpbmcodmFsKTsKLSAgICAgIGxvZy5wdXQobG9naWQsIGVudHJ5KTsKLQotICAgICAgcmV0dXJuIHZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2hhcmVkU3RydWN0IGdldFN0cnVjdChpbnQga2V5KSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFN0cnVjdCgiICsga2V5ICsgIikiKTsKLSAgICAgIHJldHVybiBsb2cuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgemlwKCkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ6aXAoKSIpOwotICAgIH0KLQotICB9CisgIHB1YmxpYyBzdGF0aWMgQ2FsY3VsYXRvci5Qcm9jZXNzb3IgcHJvY2Vzc29yOwogCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7CiAgICAgdHJ5IHsKLSAgICAgIENhbGN1bGF0b3JIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKTsKLSAgICAgIENhbGN1bGF0b3IuUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKTsKLSAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7Ci0gICAgICBUU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KTsKKyAgICAgIGhhbmRsZXIgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKTsKKyAgICAgIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKTsKIAotICAgICAgLy8gVXNlIHRoaXMgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKLSAgICAgIC8vIHNlcnZlciA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7CisgICAgICBSdW5uYWJsZSBzaW1wbGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICBzaW1wbGUocHJvY2Vzc29yKTsKKyAgICAgICAgfQorICAgICAgfTsgICAgICAKKyAgICAgIFJ1bm5hYmxlIHNlY3VyZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgIHNlY3VyZShwcm9jZXNzb3IpOworICAgICAgICB9CisgICAgICB9OwogCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKTsKLSAgICAgIHNlcnZlci5zZXJ2ZSgpOwotCisgICAgICBuZXcgVGhyZWFkKHNpbXBsZSkuc3RhcnQoKTsKKyAgICAgIG5ldyBUaHJlYWQoc2VjdXJlKS5zdGFydCgpOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CiAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOwogICAgIH0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUuIik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgc2ltcGxlKENhbGN1bGF0b3IuUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgIHRyeSB7CisgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICAgICAgVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihuZXcgQXJncyhzZXJ2ZXJUcmFuc3BvcnQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpKTsKKworICAgICAgLy8gVXNlIHRoaXMgZm9yIGEgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIKKyAgICAgIC8vIFRTZXJ2ZXIgc2VydmVyID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKG5ldyBUVGhyZWFkUG9vbFNlcnZlci5BcmdzKHNlcnZlclRyYW5zcG9ydCkucHJvY2Vzc29yKHByb2Nlc3NvcikpOworCisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSBzaW1wbGUgc2VydmVyLi4uIik7CisgICAgICBzZXJ2ZXIuc2VydmUoKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgc2VjdXJlKENhbGN1bGF0b3IuUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgIHRyeSB7CisgICAgICAvKgorICAgICAgICogVXNlIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHRvIHNldHVwIHRoZSByZXF1aXJlZCBTU0wgcGFyYW1ldGVycy4gSW4gdGhpcyBleGFtcGxlCisgICAgICAgKiB3ZSBhcmUgc2V0dGluZyB0aGUga2V5c3RvcmUgYW5kIHRoZSBrZXlzdG9yZSBwYXNzd29yZC4gT3RoZXIgdGhpbmdzIGxpa2UgYWxnb3JpdGhtcywKKyAgICAgICAqIGNpcGhlciBzdWl0ZXMsIGNsaWVudCBhdXRoIGV0YyBjYW4gYmUgc2V0LiAKKyAgICAgICAqLworICAgICAgVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCk7CisgICAgICAvLyBUaGUgS2V5c3RvcmUgY29udGFpbnMgdGhlIHByaXZhdGUga2V5CisgICAgICBwYXJhbXMuc2V0S2V5U3RvcmUoIi4uLy4uL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlIiwgInRocmlmdCIsIG51bGwsIG51bGwpOworCisgICAgICAvKgorICAgICAgICogVXNlIGFueSBvZiB0aGUgVFNTTFRyYW5zcG9ydEZhY3RvcnkgdG8gZ2V0IGEgc2VydmVyIHRyYW5zcG9ydCB3aXRoIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICogU1NMIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzIGlmIHByb3BlcnRpZXMgYXJlIHNldCBpbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICogRXg6IC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT0ua2V5c3RvcmUgYW5kIC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkPXRocmlmdAorICAgICAgICogCisgICAgICAgKiBOb3RlOiBZb3UgbmVlZCBub3QgZXhwbGljaXRseSBjYWxsIG9wZW4oKS4gVGhlIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldCBpcyBib3VuZCBvbiByZXR1cm4KKyAgICAgICAqIGZyb20gdGhlIGZhY3RvcnkgY2xhc3MuIAorICAgICAgICovCisgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldCg5MDkxLCAwLCBudWxsLCBwYXJhbXMpOworICAgICAgVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihuZXcgQXJncyhzZXJ2ZXJUcmFuc3BvcnQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpKTsKKworICAgICAgLy8gVXNlIHRoaXMgZm9yIGEgbXVsdGkgdGhyZWFkZWQgc2VydmVyCisgICAgICAvLyBUU2VydmVyIHNlcnZlciA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihuZXcgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyhzZXJ2ZXJUcmFuc3BvcnQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpKTsKKworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgc2VjdXJlIHNlcnZlci4uLiIpOworICAgICAgc2VydmVyLnNlcnZlKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9qcy9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2pzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmZTA4ODgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZXhwb3J0IENMQVNTUEFUSAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgorCithbGwtbG9jYWw6CisJJChBTlQpICQoQU5UX0ZMQUdTKSBjb21waWxlCisKK2NoZWNrLWxvY2FsOiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdHV0b3JpYWxzZXJ2ZXIKKworRVhUUkFfRElTVCA9IFwKKwlidWlsZC54bWwgXAorCXNyYyBcCisJdHV0b3JpYWwuaHRtbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvYnVpbGQueG1sIGIvdHV0b3JpYWwvanMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYTZlN2MKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qcy9idWlsZC54bWwKQEAgLTAsMCArMSw5MiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0idHV0b3JpYWwiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iPgorCisgIDxkZXNjcmlwdGlvbj5UaHJpZnQgSmF2YVNjcmlwdCBUdXRvcmlhbDwvZGVzY3JpcHRpb24+CisKKyAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249InNyYyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFzcmMiIGxvY2F0aW9uPSIuLi9qYXZhL3NyYyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Ii4uL2phdmEvZ2VuLWphdmEiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIiAvPgorCisgIDwhLS0gdGhlIHJvb3QgZGlyZWN0b3J5LCB3aGVyZSB5b3UgdW5wYWNrIHRocmlmdCBkaXN0aWJ1dGlvbiAoZS5nLiB0aHJpZnQtMC54LngudGFyLmd6KSAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8iIC8+CisgIDwhLS0gSmF2YVNjcmlwdCB0dXRvcmlhbCBkZXBlbmRzIG9uIHRoZSBqYXZhIHR1dG9yaWFsIHRocmlmdCBoYW5kbGVyIGFuZCBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2xpYi9qYXZhIiAvPgorCisgIDxwYXRoIGlkPSJsaWJzLmNsYXNzcGF0aCI+CisgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCp0ZXN0LmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvZGVwcyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgIDwvcGF0aD4KKyAgPHBhdGggaWQ9ImJ1aWxkLmNsYXNzcGF0aCI+CisgICAgPHBhdGggcmVmaWQ9ImxpYnMuY2xhc3NwYXRoIiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2dlbn0iIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGR9IiAvPgorICA8L3BhdGg+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8dHN0YW1wIC8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2phdmFzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0iSmF2YUNsaWVudC5qYXZhIi8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJKYXZhU2VydmVyLmphdmEiLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGN1bGF0b3JIYW5kbGVyLmphdmEiLz4KKyAgICA8L2phdmFjPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgorICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6YWxsIi8+CisgICAgPC9qYXZhYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJ0dXRvcmlhbCIgLz4KKworICA8dGFyZ2V0IG5hbWU9InR1dG9yaWFsIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICA8amFyIGphcmZpbGU9InR1dG9yaWFsLWpzLmphciIgYmFzZWRpcj0iJHtidWlsZH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0dXRvcmlhbHNlcnZlciIgZGVzY3JpcHRpb249InJ1biB0aGUgdGVzdCBzZXJ2ZXIiIGRlcGVuZHM9InR1dG9yaWFsLCBnZW5lcmF0ZSI+CisgICAgPGphdmEgY2xhc3NuYW1lPSJIdHRwZCIgZm9yaz0idHJ1ZSIKKyAgICAgIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIHZhbHVlPSIuLi8uLi8iIC8+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzIC1yICAuLi90dXRvcmlhbC50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iZ2VuLWpzIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJ0dXRvcmlhbC1qcy5qYXIiIC8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9qcy9zcmMvSHR0cGQuamF2YSBiL3R1dG9yaWFsL2pzL3NyYy9IdHRwZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODU0NzEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9qcy9zcmMvSHR0cGQuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqCisgKi8KKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5Db25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFNlcnZlckNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLk1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkNvbnRlbnRQcm9kdWNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkVudGl0eVRlbXBsYXRlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuRmlsZUVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5EZWZhdWx0SHR0cFJlc3BvbnNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5EZWZhdWx0SHR0cFNlcnZlckNvbm5lY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuTm9Db25uZWN0aW9uUmV1c2VTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkJhc2ljSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkNvcmVDb25uZWN0aW9uUE5hbWVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuQ29yZVByb3RvY29sUE5hbWVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuQmFzaWNIdHRwQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuQmFzaWNIdHRwUHJvY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFJlcXVlc3RIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUmVxdWVzdEhhbmRsZXJSZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnV0aWwuRW50aXR5VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKKworLy8gR2VuZXJhdGVkIGNvZGUKK2ltcG9ydCB0dXRvcmlhbC4qOworaW1wb3J0IHNoYXJlZC4qOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogQmFzaWMsIHlldCBmdWxseSBmdW5jdGlvbmFsIGFuZCBzcGVjIGNvbXBsaWFudCwgSFRUUC8xLjEgZmlsZSBzZXJ2ZXIuCisgKiA8cD4KKyAqIFBsZWFzZSBub3RlIHRoZSBwdXJwb3NlIG9mIHRoaXMgYXBwbGljYXRpb24gaXMgZGVtb25zdHJhdGUgdGhlIHVzYWdlIG9mCisgKiBIdHRwQ29yZSBBUElzLiBJdCBpcyBOT1QgaW50ZW5kZWQgdG8gZGVtb25zdHJhdGUgdGhlIG1vc3QgZWZmaWNpZW50IHdheSBvZgorICogYnVpbGRpbmcgYW4gSFRUUCBmaWxlIHNlcnZlci4KKyAqIAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwZCB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQbGVhc2Ugc3BlY2lmeSBkb2N1bWVudCByb290IGRpcmVjdG9yeSIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgUmVxdWVzdExpc3RlbmVyVGhyZWFkKDgwODgsIGFyZ3NbMF0pOworICAgICAgICB0LnNldERhZW1vbihmYWxzZSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgSHR0cEZpbGVIYW5kbGVyIGltcGxlbWVudHMgSHR0cFJlcXVlc3RIYW5kbGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkb2NSb290OworCisgICAgICAgIHB1YmxpYyBIdHRwRmlsZUhhbmRsZXIoZmluYWwgU3RyaW5nIGRvY1Jvb3QpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB0aGlzLmRvY1Jvb3QgPSBkb2NSb290OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIEh0dHBSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIEh0dHBSZXNwb25zZSByZXNwb25zZSwgZmluYWwgSHR0cENvbnRleHQgY29udGV4dCkgdGhyb3dzIEh0dHBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdExpbmUoKS5nZXRNZXRob2QoKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7CisgICAgICAgICAgICBpZiAoIW1ldGhvZC5lcXVhbHMoIkdFVCIpICYmICFtZXRob2QuZXF1YWxzKCJIRUFEIikgJiYgIW1ldGhvZC5lcXVhbHMoIlBPU1QiKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24obWV0aG9kICsgIiBtZXRob2Qgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHRhcmdldCA9IHJlcXVlc3QuZ2V0UmVxdWVzdExpbmUoKS5nZXRVcmkoKTsKKworICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdCAmJiB0YXJnZXQuZXF1YWxzKCIvdGhyaWZ0L3NlcnZpY2UvdHV0b3JpYWwvIikpIHsKKyAgICAgICAgICAgICAgICBIdHRwRW50aXR5IGVudGl0eSA9ICgoSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3QpIHJlcXVlc3QpLmdldEVudGl0eSgpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBlbnRpdHlDb250ZW50ID0gRW50aXR5VXRpbHMudG9CeXRlQXJyYXkoZW50aXR5KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluY29taW5nIGNvbnRlbnQ6ICIgKyBuZXcgU3RyaW5nKGVudGl0eUNvbnRlbnQpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gdGhpcy50aHJpZnRSZXF1ZXN0KGVudGl0eUNvbnRlbnQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3V0Z29pbmcgY29udGVudDogIitvdXRwdXQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEVudGl0eVRlbXBsYXRlIGJvZHkgPSBuZXcgRW50aXR5VGVtcGxhdGUobmV3IENvbnRlbnRQcm9kdWNlcigpIHsKKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRzdHJlYW0sICJVVEYtOCIpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgYm9keS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFyc2V0PVVURi04Iik7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RW50aXR5KGJvZHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLmRvY1Jvb3QsIFVSTERlY29kZXIuZGVjb2RlKHRhcmdldCwgIlVURi04IikpOworICAgICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1c0NvZGUoSHR0cFN0YXR1cy5TQ19OT1RfRk9VTkQpOworICAgICAgICAgICAgICAgICAgICBFbnRpdHlUZW1wbGF0ZSBib2R5ID0gbmV3IEVudGl0eVRlbXBsYXRlKG5ldyBDb250ZW50UHJvZHVjZXIoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG91dHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRzdHJlYW0sICJVVEYtOCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPGh0bWw+PGJvZHk+PGgxPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiRmlsZSAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC9oMT48L2JvZHk+PC9odG1sPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBib2R5LnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RW50aXR5KGJvZHkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgIiArIGZpbGUuZ2V0UGF0aCgpICsgIiBub3QgZm91bmQiKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbGUuY2FuUmVhZCgpIHx8IGZpbGUuaXNEaXJlY3RvcnkoKSkgeworCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1c0NvZGUoSHR0cFN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgICAgICAgICBFbnRpdHlUZW1wbGF0ZSBib2R5ID0gbmV3IEVudGl0eVRlbXBsYXRlKG5ldyBDb250ZW50UHJvZHVjZXIoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG91dHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRzdHJlYW0sICJVVEYtOCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPGh0bWw+PGJvZHk+PGgxPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiQWNjZXNzIGRlbmllZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC9oMT48L2JvZHk+PC9odG1sPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBib2R5LnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RW50aXR5KGJvZHkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCByZWFkIGZpbGUgIiArIGZpbGUuZ2V0UGF0aCgpKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzQ29kZShIdHRwU3RhdHVzLlNDX09LKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZUVudGl0eSBib2R5ID0gbmV3IEZpbGVFbnRpdHkoZmlsZSwgInRleHQvaHRtbCIpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRFbnRpdHkoYm9keSk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmluZyBmaWxlICIgKyBmaWxlLmdldFBhdGgoKSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRocmlmdFJlcXVlc3QoYnl0ZVtdIGlucHV0KXsKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vSW5wdXQKKyAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyIGluYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXIoaW5wdXQubGVuZ3RoKTsgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGluYnVmZmVyLndyaXRlKGlucHV0KTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFRQcm90b2NvbCAgaW5wcm90b2NvbCAgID0gbmV3IFRKU09OUHJvdG9jb2woaW5idWZmZXIpOyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvL091dHB1dAorICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIgb3V0YnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXIoMTAwKTsgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwcm90b2NvbCAgID0gbmV3IFRKU09OUHJvdG9jb2wob3V0YnVmZmVyKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSk7ICAgICAgCisgICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoaW5wcm90b2NvbCwgb3V0cHJvdG9jb2wpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBuZXcgYnl0ZVtvdXRidWZmZXIubGVuZ3RoKCldOworICAgICAgICAgICAgICAgIG91dGJ1ZmZlci5yZWFkQWxsKG91dHB1dCwgMCwgb3V0cHV0Lmxlbmd0aCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhvdXRwdXQsIlVURi04Iik7CisgICAgICAgICAgICB9Y2F0Y2goVGhyb3dhYmxlIHQpeworICAgICAgICAgICAgICAgIHJldHVybiAiRXJyb3I6Iit0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBSZXF1ZXN0TGlzdGVuZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU2VydmVyU29ja2V0IHNlcnZlcnNvY2tldDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIdHRwUGFyYW1zIHBhcmFtczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmljZSBodHRwU2VydmljZTsKKworICAgICAgICBwdWJsaWMgUmVxdWVzdExpc3RlbmVyVGhyZWFkKGludCBwb3J0LCBmaW5hbCBTdHJpbmcgZG9jcm9vdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyc29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChwb3J0KTsKKyAgICAgICAgICAgIHRoaXMucGFyYW1zID0gbmV3IEJhc2ljSHR0cFBhcmFtcygpOworICAgICAgICAgICAgdGhpcy5wYXJhbXMuc2V0SW50UGFyYW1ldGVyKENvcmVDb25uZWN0aW9uUE5hbWVzLlNPX1RJTUVPVVQsIDEwMDApLnNldEludFBhcmFtZXRlcihDb3JlQ29ubmVjdGlvblBOYW1lcy5TT0NLRVRfQlVGRkVSX1NJWkUsIDggKiAxMDI0KQorICAgICAgICAgICAgICAgICAgICAuc2V0Qm9vbGVhblBhcmFtZXRlcihDb3JlQ29ubmVjdGlvblBOYW1lcy5TVEFMRV9DT05ORUNUSU9OX0NIRUNLLCBmYWxzZSkuc2V0Qm9vbGVhblBhcmFtZXRlcihDb3JlQ29ubmVjdGlvblBOYW1lcy5UQ1BfTk9ERUxBWSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcihDb3JlUHJvdG9jb2xQTmFtZXMuT1JJR0lOX1NFUlZFUiwgIkh0dHBDb21wb25lbnRzLzEuMSIpOworCisgICAgICAgICAgICAvLyBTZXQgdXAgdGhlIEhUVFAgcHJvdG9jb2wgcHJvY2Vzc29yCisgICAgICAgICAgICBIdHRwUHJvY2Vzc29yIGh0dHBwcm9jID0gbmV3IEJhc2ljSHR0cFByb2Nlc3NvcigpOworCisgICAgICAgICAgICAvLyBTZXQgdXAgcmVxdWVzdCBoYW5kbGVycworICAgICAgICAgICAgSHR0cFJlcXVlc3RIYW5kbGVyUmVnaXN0cnkgcmVxaXN0cnkgPSBuZXcgSHR0cFJlcXVlc3RIYW5kbGVyUmVnaXN0cnkoKTsKKyAgICAgICAgICAgIHJlcWlzdHJ5LnJlZ2lzdGVyKCIqIiwgbmV3IEh0dHBGaWxlSGFuZGxlcihkb2Nyb290KSk7CisKKyAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgSFRUUCBzZXJ2aWNlCisgICAgICAgICAgICB0aGlzLmh0dHBTZXJ2aWNlID0gbmV3IEh0dHBTZXJ2aWNlKGh0dHBwcm9jLCBuZXcgTm9Db25uZWN0aW9uUmV1c2VTdHJhdGVneSgpLCBuZXcgRGVmYXVsdEh0dHBSZXNwb25zZUZhY3RvcnkoKSk7CisgICAgICAgICAgICB0aGlzLmh0dHBTZXJ2aWNlLnNldFBhcmFtcyh0aGlzLnBhcmFtcyk7CisgICAgICAgICAgICB0aGlzLmh0dHBTZXJ2aWNlLnNldEhhbmRsZXJSZXNvbHZlcihyZXFpc3RyeSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxpc3RlbmluZyBvbiBwb3J0ICIgKyB0aGlzLnNlcnZlcnNvY2tldC5nZXRMb2NhbFBvcnQoKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vbG9jYWxob3N0OjgwODgvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICB3aGlsZSAoIVRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwIEhUVFAgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgICAgICBTb2NrZXQgc29ja2V0ID0gdGhpcy5zZXJ2ZXJzb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIERlZmF1bHRIdHRwU2VydmVyQ29ubmVjdGlvbiBjb25uID0gbmV3IERlZmF1bHRIdHRwU2VydmVyQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluY29taW5nIGNvbm5lY3Rpb24gZnJvbSAiICsgc29ja2V0LmdldEluZXRBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgICAgICBjb25uLmJpbmQoc29ja2V0LCB0aGlzLnBhcmFtcyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgd29ya2VyIHRocmVhZAorICAgICAgICAgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBXb3JrZXJUaHJlYWQodGhpcy5odHRwU2VydmljZSwgY29ubik7CisgICAgICAgICAgICAgICAgICAgIHQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSS9PIGVycm9yIGluaXRpYWxpc2luZyBjb25uZWN0aW9uIHRocmVhZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFdvcmtlclRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmljZSBodHRwc2VydmljZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmVyQ29ubmVjdGlvbiBjb25uOworCisgICAgICAgIHB1YmxpYyBXb3JrZXJUaHJlYWQoZmluYWwgSHR0cFNlcnZpY2UgaHR0cHNlcnZpY2UsIGZpbmFsIEh0dHBTZXJ2ZXJDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB0aGlzLmh0dHBzZXJ2aWNlID0gaHR0cHNlcnZpY2U7CisgICAgICAgICAgICB0aGlzLmNvbm4gPSBjb25uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOZXcgY29ubmVjdGlvbiB0aHJlYWQiKTsKKyAgICAgICAgICAgIEh0dHBDb250ZXh0IGNvbnRleHQgPSBuZXcgQmFzaWNIdHRwQ29udGV4dChudWxsKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSAmJiB0aGlzLmNvbm4uaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5odHRwc2VydmljZS5oYW5kbGVSZXF1ZXN0KHRoaXMuY29ubiwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xpZW50IGNsb3NlZCBjb25uZWN0aW9uIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSS9PIGVycm9yOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEh0dHBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVucmVjb3ZlcmFibGUgSFRUUCBwcm90b2NvbCB2aW9sYXRpb246ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm4uc2h1dGRvd24oKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbCBiL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDAyMGJlZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwKQEAgLTAsMCArMSwxMDkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3MgLSBUdXRvcmlhbCBFeGFtcGxlPC90aXRsZT4KKworICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2pzL3NyYy90aHJpZnQuanMiICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL3R1dG9yaWFsX3R5cGVzLmpzIiAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL3NoYXJlZF90eXBlcy5qcyIgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1NoYXJlZFNlcnZpY2UuanMiICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL0NhbGN1bGF0b3IuanMiICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorCisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS40LjIvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CisKKworICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorICAvLzwhW0NEQVRBWworICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpeworICAgIC8vIHJlbW92ZSBwc2V1ZG8gY2hpbGQgcmVxdWlyZWQgZm9yIHZhbGlkIHhodG1sIHN0cmljdAorICAgICQoIiNvcCIpLmNoaWxkcmVuKCkucmVtb3ZlKCk7CisgICAgLy8gYWRkIG9wZXJhdGlvbnMgdG8gaXQncyBkcm9wZG93biBtZW51CisgICAgJC5lYWNoKE9wZXJhdGlvbiwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgICAgJCgnI29wJykuYXBwZW5kKCQoIjxvcHRpb24+PC9vcHRpb24+IikuYXR0cigidmFsdWUiLHZhbHVlKS50ZXh0KGtleSkpOyAKKyAgICB9KTsKKyAgICAKKyAgICAgJCgndGFibGUuY2FsY3VsYXRvcicpLmF0dHIoJ3dpZHRoJywgNTAwKTsKKyAgfSk7CisKKyAgZnVuY3Rpb24gY2FsYygpIHsKKyAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoIi90aHJpZnQvc2VydmljZS90dXRvcmlhbC8iKTsKKyAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIHZhciBjbGllbnQgICAgPSBuZXcgQ2FsY3VsYXRvckNsaWVudChwcm90b2NvbCk7CisKKyAgICB2YXIgd29yayA9IG5ldyBXb3JrKCk7CisgICAgd29yay5udW0xID0gJCgiI251bTEiKS52YWwoKTsKKyAgICB3b3JrLm51bTIgPSAkKCIjbnVtMiIpLnZhbCgpOworICAgIHdvcmsub3AgPSAkKCIjb3AiKS52YWwoKTsKKyAgICAKKyAgICB0cnkgeworICAgICAgcmVzdWx0ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgICQoJyNyZXN1bHQnKS52YWwocmVzdWx0KTsKKyAgICAgICQoJyNyZXN1bHQnKS5jc3MoJ2NvbG9yJywgJ2JsYWNrJyk7CisgICAgfSBjYXRjaChvdWNoKXsKKyAgICAgICQoJyNyZXN1bHQnKS52YWwob3VjaC53aHkpOworICAgICAgJCgnI3Jlc3VsdCcpLmNzcygnY29sb3InLCAncmVkJyk7CisgICAgfQorICB9CisgIAorICBmdW5jdGlvbiBhdXRvX2NhbGMoKSB7CisgICAgaWYgKCQoJyNhdXRvdXBkYXRlOmNoZWNrZWQnKS52YWwoKSAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBjYWxjKCk7CisgICAgfQorICB9CisgIC8vXV0+CisgIDwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgPGgyPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzPC9oMj4KKyAgPGZvcm0gYWN0aW9uPSIiPgorICA8dGFibGUgY2xhc3M9ImNhbGN1bGF0b3IiPgorICAgIDx0cj4KKyAgICAgIDx0ZD5udW0xPC90ZD4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9Im51bTEiIHZhbHVlPSIyMCIgb25rZXl1cD0iamF2YXNjcmlwdDphdXRvX2NhbGMoKTsiLz48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPk9wZXJhdGlvbjwvdGQ+CisgICAgICA8dGQ+PHNlbGVjdCBpZD0ib3AiIHNpemU9IjEiIG9uY2hhbmdlPSJqYXZhc2NyaXB0OmF1dG9fY2FsYygpOyI+PG9wdGlvbj48L29wdGlvbj48L3NlbGVjdD48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPm51bTI8L3RkPgorICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ibnVtMiIgdmFsdWU9IjUiIG9ua2V5dXA9ImphdmFzY3JpcHQ6YXV0b19jYWxjKCk7Ii8+PC90ZD48L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5yZXN1bHQ8L3RkPgorICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icmVzdWx0IiB2YWx1ZT0iIi8+PC90ZD48L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJhdXRvdXBkYXRlIiBjaGVja2VkPSJjaGVja2VkIi8+YXV0b3VwZGF0ZTwvdGQ+CisgICAgICA8dGQ+PGlucHV0IHR5cGU9ImJ1dHRvbiIgaWQ9ImNhbGN1bGF0ZSIgdmFsdWU9ImNhbGN1bGF0ZSIgb25jbGljaz0iamF2YXNjcmlwdDpjYWxjKCk7Ii8+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICA8L2Zvcm0+CisgIAorICA8cD5UaGlzIEphdmEgU2NyaXB0IGV4YW1wbGUgdXNlcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQiPnR1dG9yaWFsLnRocmlmdDwvYT4gYW5kIGEgVGhyaWZ0IHNlcnZlciB1c2luZyBKU09OIHByb3RvY29sIGFuZCBIVFRQIHRyYW5zcG9ydC4KKyAgPC9wPgorICAgIDxwPgorICAgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgICAgPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlIGIvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzhiYjIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorISoqLyoucGZ4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExMjcyZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKQEAgLTAsMCArMSwxOSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5DbGllbnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPkNsaWVudDwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cSW50ZXJmYWNlc1xJbnRlcmZhY2VzLmNzcHJvaiIgLz4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWQ4YzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsMzU1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7Cit1c2luZyB0dXRvcmlhbDsKK3VzaW5nIHNoYXJlZDsKKworbmFtZXNwYWNlIENsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTG9nZ2VyIExvZ2dlciA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZSgpLkFkZERlYnVnKCkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihDbGllbnQpKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERpc3BsYXlIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKEAiCitVc2FnZTogCisgICAgQ2xpZW50LmV4ZSAtaGVscAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgQ2xpZW50LmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gLW1jOjxudW1DbGllbnRzPgorICAgICAgICB3aWxsIHJ1biBjbGllbnQgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkgYW5kIHdpdGggMSBjbGllbnQKKworT3B0aW9uczoKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciB0Y3Agd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGFkZHJlc3MgLSAiImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIiKSAgICAgICAgCisgICAgICAgIHRjcHRscyAtIHRjcCB0bHMgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBtdWx0aXBsZXhlZCAtIG11bHRpcGxleGVkIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCisgICAgLW1jIChtdWx0aXBsZSBjbGllbnRzKToKKyAgICAgICAgPG51bUNsaWVudHM+IC0gbnVtYmVyIG9mIG11bHRpcGxlIGNsaWVudHMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKG1heCAxMDAsIGRlZmF1bHQgMSkKKworU2FtcGxlOgorICAgIENsaWVudC5leGUgLXRyOnRjcCAtcDpiaW5hcnkKKyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgYXJncyA9IGFyZ3MgPz8gbmV3IHN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGFyZ3MuQW55KHggPT4geC5TdGFydHNXaXRoKCItaGVscCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5SGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTdGFydGluZyBjbGllbnQuLi4iKTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBzb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSdW5Bc3luYyhhcmdzLCBzb3VyY2UuVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQXN5bmMoc3RyaW5nW10gYXJncywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gR2V0TnVtYmVyT2ZDbGllbnRzKGFyZ3MpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCAjIG9mIGNsaWVudHM6IHtudW1DbGllbnRzfSIpOworCisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0cyA9IG5ldyBUQ2xpZW50VHJhbnNwb3J0W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHQgPSBHZXRUcmFuc3BvcnQoYXJncyk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0c1tpXSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIlNlbGVjdGVkIGNsaWVudCB0cmFuc3BvcnQ6IHt0cmFuc3BvcnRzWzBdfSIpOworCisgICAgICAgICAgICB2YXIgcHJvdG9jb2xzID0gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHAgPSBHZXRQcm90b2NvbChhcmdzLCB0cmFuc3BvcnRzW2ldKTsKKyAgICAgICAgICAgICAgICBwcm90b2NvbHNbaV0gPSBwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCBjbGllbnQgcHJvdG9jb2w6IHtwcm90b2NvbHNbMF0uSXRlbTF9Iik7CisKKyAgICAgICAgICAgIHZhciB0YXNrcyA9IG5ldyBUYXNrW251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBSdW5DbGllbnRBc3luYyhwcm90b2NvbHNbaV0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB0YXNrc1tpXSA9IHRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRhc2suV2FpdEFsbCh0YXNrcyk7CisKKyAgICAgICAgICAgIGF3YWl0IFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRDbGllbnRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItdHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBUcmFuc3BvcnQgc2VsZWN0ZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBzZWxlY3RlZFRyYW5zcG9ydCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZWxlY3RlZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoIi50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Lkh0dHA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBVcmkoImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwQnVmZmVyZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydChuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwVGxzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCwgR2V0Q2VydGlmaWNhdGUoKSwgQ2VydFZhbGlkYXRvciwgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuRnJhbWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0TnVtYmVyT2ZDbGllbnRzKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLW1jIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgIyBvZiBjbGllbnRzOiB7bnVtQ2xpZW50c30iKTsKKworICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICBpZiggaW50LlRyeVBhcnNlKG51bUNsaWVudHMsIG91dCBjKSAmJiAoMCA8IGMpICYmIChjIDw9IDEwMCkpCisJCQkJcmV0dXJuIGM7CisJCQllbHNlCisJCQkJcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENlcnRpZmljYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZHVlIHRvIGZpbGVzIGxvY2F0aW9uIGluIG5ldCBjb3JlIGJldHRlciB0byB0YWtlIGNlcnRzIGZyb20gdG9wIGZvbGRlcgorICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0gR2V0Q2VydFBhdGgoRGlyZWN0b3J5LkdldFBhcmVudChEaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydEZpbGUsICJUaHJpZnRUZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0Q2VydFBhdGgoRGlyZWN0b3J5SW5mbyBkaSwgaW50IG1heENvdW50ID0gNikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRvcERpciA9IGRpOworICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0KKyAgICAgICAgICAgICAgICB0b3BEaXIuRW51bWVyYXRlRmlsZXMoIlRocmlmdFRlc3QucGZ4IiwgU2VhcmNoT3B0aW9uLkFsbERpcmVjdG9yaWVzKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChjZXJ0RmlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtYXhDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBmaWxlIGluIGRpcmVjdG9yaWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldENlcnRQYXRoKGRpLlBhcmVudCwgbWF4Q291bnQgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNlcnRGaWxlLkZ1bGxOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayhvYmplY3Qgc2VuZGVyLAorICAgICAgICAgICAgc3RyaW5nIHRhcmdldEhvc3QsIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gbG9jYWxDZXJ0aWZpY2F0ZXMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgcmVtb3RlQ2VydGlmaWNhdGUsIHN0cmluZ1tdIGFjY2VwdGFibGVJc3N1ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0Q2VydGlmaWNhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgQ2VydFZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBYNTA5Q2hhaW4gY2hhaW4sIFNzbFBvbGljeUVycm9ycyBzc2xQb2xpY3lFcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gR2V0UHJvdG9jb2woc3RyaW5nW10gYXJncywgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi1wciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIFByb3RvY29sIHNlbGVjdGVkUHJvdG9jb2w7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZShwcm90b2NvbCwgdHJ1ZSwgb3V0IHNlbGVjdGVkUHJvdG9jb2wpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0ZWRQcm90b2NvbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQmluYXJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkNvbXBhY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkpzb246CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLk11bHRpcGxleGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgcmV0dXJucyBCaW5hcnlQcm90b2NvbCB0byBhdm9pZCBtYWtpbmcgd3JhcHBlZCBwcm90b2NvbCBhcyBwdWJsaWMgaW4gVFByb3RvY29sRGVjb3JhdG9yIChpbiBSdW5DbGllbnRBc3luYyBpdCB3aWxsIGJlIHdyYXBwZWQgaW50byBNdWx0aXBsZXhlZCBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQ2xpZW50QXN5bmMoVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gcHJvdG9jb2xUdXBsZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHByb3RvY29sVHVwbGUuSXRlbTI7CisgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sVHlwZSA9IHByb3RvY29sVHVwbGUuSXRlbTE7CisKKyAgICAgICAgICAgICAgICBUQmFzZUNsaWVudCBjbGllbnQgPSBudWxsOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xUeXBlICE9IFByb3RvY29sLk11bHRpcGxleGVkKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBFeGVjdXRlQ2FsY3VsYXRvckNsaWVudE9wZXJhdGlvbnMoY2FuY2VsbGF0aW9uVG9rZW4sIChDYWxjdWxhdG9yLkNsaWVudCljbGllbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgdXNlcyBiaW5hcnkgcHJvdG9jb2wgdGhlcmUgIHRvIGNyZWF0ZSBNdWx0aXBsZXhlZCBwcm90b2NvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsIG5hbWVvZihDYWxjdWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXVsdGlwbGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEV4ZWN1dGVDYWxjdWxhdG9yQ2xpZW50T3BlcmF0aW9ucyhjYW5jZWxsYXRpb25Ub2tlbiwgKENhbGN1bGF0b3IuQ2xpZW50KWNsaWVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgbmFtZW9mKFNoYXJlZFNlcnZpY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBTaGFyZWRTZXJ2aWNlLkNsaWVudChtdWx0aXBsZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgRXhlY3V0ZVNoYXJlZFNlcnZpY2VDbGllbnRPcGVyYXRpb25zKGNhbmNlbGxhdGlvblRva2VuLCAoU2hhcmVkU2VydmljZS5DbGllbnQpY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKCQie2NsaWVudD8uQ2xpZW50SWR9ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLlRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgRXhlY3V0ZUNhbGN1bGF0b3JDbGllbnRPcGVyYXRpb25zKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuLCBDYWxjdWxhdG9yLkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC5PcGVuVHJhbnNwb3J0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAvLyBBc3luYyB2ZXJzaW9uCisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFBpbmdBc3luYygpIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQucGluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQWRkQXN5bmMoMSwxKSIpOworICAgICAgICAgICAgdmFyIHN1bSA9IGF3YWl0IGNsaWVudC5hZGRBc3luYygxLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBBZGRBc3luYygxLDEpPXtzdW19Iik7CisKKyAgICAgICAgICAgIHZhciB3b3JrID0gbmV3IFdvcmsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPcCA9IE9wZXJhdGlvbi5ESVZJREUsCisgICAgICAgICAgICAgICAgTnVtMSA9IDEsCisgICAgICAgICAgICAgICAgTnVtMiA9IDAKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IENhbGN1bGF0ZUFzeW5jKDEpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gSW52YWxpZCBvcGVyYXRpb246ICIgKyBpbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgICAgICB3b3JrLk51bTEgPSAxNTsKKyAgICAgICAgICAgIHdvcmsuTnVtMiA9IDEwOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDYWxjdWxhdGVBc3luYygxKSIpOworICAgICAgICAgICAgICAgIHZhciBkaWZmID0gYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSAxNS0xMD17ZGlmZn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBHZXRTdHJ1Y3RBc3luYygxKSIpOworICAgICAgICAgICAgdmFyIGxvZyA9IGF3YWl0IGNsaWVudC5nZXRTdHJ1Y3RBc3luYygxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDaGVjayBsb2c6IHtsb2cuVmFsdWV9Iik7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFppcEFzeW5jKCkgd2l0aCBkZWxheSAxMDBtYyBvbiBzZXJ2ZXIgc2lkZSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnppcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIEV4ZWN1dGVTaGFyZWRTZXJ2aWNlQ2xpZW50T3BlcmF0aW9ucyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiwgU2hhcmVkU2VydmljZS5DbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQuT3BlblRyYW5zcG9ydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgLy8gQXN5bmMgdmVyc2lvbgorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBTaGFyZWRTZXJ2aWNlIEdldFN0cnVjdEFzeW5jKDEpIik7CisgICAgICAgICAgICB2YXIgbG9nID0gYXdhaXQgY2xpZW50LmdldFN0cnVjdEFzeW5jKDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFNoYXJlZFNlcnZpY2UgVmFsdWU6IHtsb2cuVmFsdWV9Iik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgZW51bSBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgVGNwLAorICAgICAgICAgICAgTmFtZWRQaXBlLAorICAgICAgICAgICAgSHR0cCwKKyAgICAgICAgICAgIFRjcEJ1ZmZlcmVkLAorICAgICAgICAgICAgRnJhbWVkLAorICAgICAgICAgICAgVGNwVGxzCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgQmluYXJ5LAorICAgICAgICAgICAgQ29tcGFjdCwKKyAgICAgICAgICAgIEpzb24sCisgICAgICAgICAgICBNdWx0aXBsZXhlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjgzODJlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZGU3OGEwMWItZjdjNi00OWQxLTk3ZGEtNjY5ZDJlZDM3NjQxIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiN2I2MGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KQEAgLTAsMCArMSw4IEBACit7CisgICJwcm9maWxlcyI6IHsKKyAgICAiQ2xpZW50IjogeworICAgICAgImNvbW1hbmROYW1lIjogIlByb2plY3QiLAorICAgICAgImNvbW1hbmRMaW5lQXJncyI6ICItcDptdWx0aXBsZXhlZCIKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeCBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1RocmlmdFRlc3QucGZ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGVkMjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZSBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzQ0NmUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvc2hhcmVkCisvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk3YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qCkBAIC0wLDAgKzEsMzAgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkludGVyZmFjZXM8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPkludGVyZmFjZXM8L1BhY2thZ2VJZD4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vLi4vLi4vbGliL25ldGNvcmUvVGhyaWZ0L1RocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC40LCkiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxUYXJnZXQgTmFtZT0iUHJlQnVpbGQiIEJlZm9yZVRhcmdldHM9Il9HZW5lcmF0ZVJlc3RvcmVQcm9qZWN0U3BlYztSZXN0b3JlO0NvbXBpbGUiPgorICAgIDxFeGVjIENvbmRpdGlvbj0iJyQoT1MpJyA9PSAnV2luZG93c19OVCciIENvbW1hbmQ9IndoZXJlIHRocmlmdCIgQ29uc29sZVRvTVNCdWlsZD0idHJ1ZSI+CisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkNvbnNvbGVPdXRwdXQiIFByb3BlcnR5TmFtZT0iUGF0aFRvVGhyaWZ0IiAvPgorICAgIDwvRXhlYz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi90dXRvcmlhbC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vdHV0b3JpYWwudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCcuLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgPC9UYXJnZXQ+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI2YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoIjRkMTMxNjNkLTkwNjctNGM5Yy04YWYwLTY0ZTA4NDUxMzk3ZCIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMDU1NTYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgSW50ZXJmYWNlcy5kbGwKKwkkKFJNKSAtciBDbGllbnQvYmluCisJJChSTSkgLXIgQ2xpZW50L29iagorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBTZXJ2ZXIvb2JqCisJJChSTSkgLXIgSW50ZXJmYWNlcy9iaW4KKwkkKFJNKSAtciBJbnRlcmZhY2VzL29iagorCitFWFRSQV9ESVNUID0gXAorCUNsaWVudCBcCisJSW50ZXJmYWNlcyBcCisJUkVBRE1FLm1kIFwKKwlTZXJ2ZXIgXAorCVR1dG9yaWFsLnNsbiBcCisJYnVpbGQuY21kIFwKKwlidWlsZC5zaAorCQkJIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9SRUFETUUubWQgYi90dXRvcmlhbC9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjZlZjkyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9SRUFETUUubWQKQEAgLTAsMCArMSwyNzggQEAKKyMgQnVpbGRpbmcgb2Ygc2FtcGxlcyBmb3IgZGlmZmVyZW50IHBsYXRmb3JtcyAKKworIyBSZXVzZWQgY29tcG9uZW50cyAKKy0gTkVUIENvcmUgU3RhbmRhcmQgMi4wCistIE5FVCBDb3JlIEFwcCAyLjAKKworIyBIb3cgdG8gYnVpbGQKKy0gRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIGxhdGVzdCAuTkVUIENvcmUgU0RLIGZvciB5b3VyIHBsYXRmb3JtIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vbmV0L2NvcmUjd2luZG93c3ZzMjAxNSAoYXJjaGl2ZSBmb3IgU0RLIDEuMC4wLXByZXZpZXcyLTAwMzEyMSBsb2NhdGVkIGJ5OiBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L2NvcmUvYmxvYi9tYXN0ZXIvcmVsZWFzZS1ub3Rlcy9kb3dubG9hZC1hcmNoaXZlLm1kKQorLSBFbnN1cmUgdGhhdCB5b3UgaGF2ZSB0aHJpZnQuZXhlIHdoaWNoIHN1cHBvcnRzIG5ldGNvcmUgbGliIGFuZCBpdCBhZGRlZCB0byBQQVRIIAorLSBHbyB0byBjdXJyZW50IGZvbGRlciAKKy0gUnVuICoqYnVpbGQuc2gqKiBvciAqKmJ1aWxkLmNtZCoqIGZyb20gdGhlIHJvb3Qgb2YgY2xvbmVkIHJlcG9zaXRvcnkKKy0gQ2hlY2sgdGVzdHMgaW4gKipzcmMvVGVzdHMqKiBmb2xkZXIKKy0gQ29udGludWUgd2l0aCAvdHV0b3JpYWxzL25ldGNvcmUgCisKKyMgSG93IHRvIHJ1biAKKworTm90ZXM6IGRvdG5ldCBydW4gc3VwcG9ydHMgcGFzc2luZyBhcmd1bWVudHMgdG8gYXBwIGFmdGVyIC0tIHN5bWJvbHMgKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9hcnRpY2xlcy9jb3JlL3Rvb2xzL2RvdG5ldC1ydW4pIC0gZXhhbXBsZTogKipkb3RuZXQgcnVuIC0tIC1oKiogd2lsbCBzaG93IGhlbHAgZm9yIGFwcAorCistIGJ1aWxkIAorLSBnbyB0byBmb2xkZXIgKENsaWVudC9TZXJ2ZXIpIAorLSBydW4gd2l0aCBzcGVjaWZ5aW5nIG9mIGNvcnJlY3QgcGFyYW1ldGVycyAqKmRvdG5ldCBydW4gLXRyOnRjcCAtcHI6bXVsdGlwbGV4ZWQqKiwgKipkb3RuZXQgcnVuIC1oZWxwKiogKGxhdGVyLCBhZnRlciBtaWdyYXRpb24gdG8gY3Nwcm9qIGFuZCBsYXRlc3QgU0RLIHdpbGwgYmUgcG9zc2liaWxpdHkgdG8gdXNlIG1vcmUgdXNhYmxlIGZvcm0gKipkb3RuZXQgcnVuIC0tIGFyZ3VtZW50cyoqKQorCisjTm90ZXMKKy0gUG9zc2libGUgYWRkaW5nIGFkZGl0aW9uYWwgcGxhdGZvcm1zIGFmdGVyIHN0YWJpbGl6YXRpb24gb2YgLk5FVCBDb3JlIChydW50aW1lcywgcGxhdGZvcm1zIChSZWQgSGF0IExpbnV4LCBPcGVuU3VzZSwgZXRjLikgCisKKyNLbm93biBpc3N1ZXMKKy0gSW4gdHJhY2UgbG9nZ2luZyBtb2RlIHlvdSBjYW4gc2VlIHNvbWUgbm90IGltcG9ydGFudCBpbnRlcm5hbCBleGNlcHRpb25zCisKKyMgUnVubmluZyBvZiBzYW1wbGVzIAorUGxlYXNlIGluc3RhbGwgVGhyaWZ0IEMjIC5ORVQgQ29yZSBsaWJyYXJ5IG9yIGNvcHkgc291cmNlcyBhbmQgYnVpbGQgdGhlbSB0byBjb3JyZWNseSBidWlsZCBhbmQgcnVuIHNhbXBsZXMgCisKKyMgTmV0Q29yZSBTZXJ2ZXIKKworVXNhZ2U6IAorCisgICAgU2VydmVyLmV4ZSAtaAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgU2VydmVyLmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gCisgICAgICAgIHdpbGwgcnVuIHNlcnZlciB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgKHRjcCB0cmFuc3BvcnQgYW5kIGJpbmFyeSBwcm90b2NvbCBieSBkZWZhdWx0KQorCitPcHRpb25zOgorCisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gdGNwIGJ1ZmZlcmVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgbmFtZWRwaXBlIC0gbmFtZWRwaXBlIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKHBpcGUgYWRkcmVzcyAtICIiLnRlc3QiIikKKyAgICAgICAgaHR0cCAtIGh0dHAgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaHR0cCBhZGRyZXNzIC0gIiJsb2NhbGhvc3Q6OTA5MCIiKQorICAgICAgICB0Y3B0bHMgLSB0Y3AgdHJhbnNwb3J0IHdpdGggdGxzIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCQkKK1NhbXBsZToKKworICAgIFNlcnZlci5leGUgLXRyOnRjcAorCisqKlJlbWFya3MqKjoKKworICAgIEZvciBUY3BUbHMgbW9kZSBjZXJ0aWZpY2F0ZSdzIGZpbGUgVGhyaWZ0VGVzdC5wZnggc2hvdWxkIGJlIGluIGRpcmVjdG9yeSB3aXRoIGJpbmFyaWVzIGluIGNhc2Ugb2YgY29tbWFuZCBsaW5lIHVzYWdlIChvciBhdCBwcm9qZWN0IGxldmVsIGluIGNhc2Ugb2YgZGVidWdnaW5nIGZyb20gSURFKS4KKyAgICBQYXNzd29yZCBmb3IgY2VydGlmaWNhdGUgLSAiVGhyaWZ0VGVzdCIuCisKKworCisjIE5ldENvcmUgQ2xpZW50CisKK1VzYWdlOiAKKworICAgIENsaWVudC5leGUgLWgKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIENsaWVudC5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+IC1tYzo8bnVtQ2xpZW50cz4KKyAgICAgICAgd2lsbCBydW4gY2xpZW50IHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpCisKK09wdGlvbnM6CisKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciB0Y3Agd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGFkZHJlc3MgLSAiImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIiKSAgICAgICAgCisgICAgICAgIHRjcHRscyAtIHRjcCB0bHMgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICAKKyAgICAtbWMgKG11bHRpcGxlIGNsaWVudHMpOgorICAgICAgICA8bnVtQ2xpZW50cz4gLSBudW1iZXIgb2YgbXVsdGlwbGUgY2xpZW50cyB0byBjb25uZWN0IHRvIHNlcnZlciAobWF4IDEwMCwgZGVmYXVsdCAxKQorCitTYW1wbGU6CisKKyAgICBDbGllbnQuZXhlIC10cjp0Y3AgLXByOmJpbmFyeSAtbWM6MTAKKworUmVtYXJrczoKKworICAgIEZvciBUY3BUbHMgbW9kZSBjZXJ0aWZpY2F0ZSdzIGZpbGUgVGhyaWZ0VGVzdC5wZnggc2hvdWxkIGJlIGluIGRpcmVjdG9yeSAKKwl3aXRoIGJpbmFyaWVzIGluIGNhc2Ugb2YgY29tbWFuZCBsaW5lIHVzYWdlIChvciBhdCBwcm9qZWN0IGxldmVsIGluIGNhc2Ugb2YgZGVidWdnaW5nIGZyb20gSURFKS4KKyAgICBQYXNzd29yZCBmb3IgY2VydGlmaWNhdGUgLSAiVGhyaWZ0VGVzdCIuCisKKyMgSG93IHRvIHRlc3QgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIE5ldENvcmUgYW5kIFB5dGhvbgorCisqIEdlbmVyYXRlIGNvZGUgd2l0aCB0aGUgbGF0ZXN0ICoqdGhyaWZ0LmV4ZSoqIHV0aWwKKyogRW5zdXJlIHRoYXQgKip0aHJpZnQuZXhlKiogdXRpbCBnZW5lcmF0ZWQgZm9sZGVyICoqZ2VuLXB5Kiogd2l0aCBnZW5lcmF0ZWQgY29kZSBmb3IgUHl0aG9uCisqIENyZWF0ZSAqKmNsaWVudC5weSoqIGFuZCAqKnNlcnZlci5weSoqIGZyb20gdGhlIGNvZGUgZXhhbXBsZXMgYmVsb3cgYW5kIHNhdmUgdGhlbSB0byB0aGUgZm9sZGVyIHdpdGggcHJldmlvc2x5IGdlbmVyYXRlZCBmb2xkZXIgKipnZW4tcHkqKgorKiBSdW4gbmV0Y29yZSBzYW1wbGVzIChjbGllbnQgYW5kIHNlcnZlcikgYW5kIHB5dGhvbiBzYW1wbGVzIChjbGllbnQgYW5kIHNlcnZlcikKKworUmVtYXJrczoKKworU2FtcGxlcyBvZiBjbGllbnQgYW5kIHNlcnZlciBjb2RlIGJlbG93IHVzZSBjb3JyZWN0IG1ldGhvZHMgKG9wZXJhdGlvbnMpIAorYW5kIGZpZWxkcyAocHJvcGVydGllcykgYWNjb3JkaW5nIHRvIGdlbmVyYXRlZCBjb250cmFjdHMgZnJvbSAqLnRocmlmdCBmaWxlcworCitBdCBXaW5kb3dzIDEwIGFkZCByZWNvcmQgKioxMjcuMC4wLjEgdGVzdHNlcnZlcioqIHRvICoqQzpcV2luZG93c1xTeXN0ZW0zMlxkcml2ZXJzXGV0Y1xob3N0cyoqIGZpbGUKK2ZvciBjb3JyZWN0IHdvcmsgb2YgcHl0aG9uIHNlcnZlcgorCisKKyoqUHl0aG9uIENsaWVudDoqKgorCQorYGBgcHl0aG9uCitpbXBvcnQgc3lzCitpbXBvcnQgZ2xvYgorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCisKK2Zyb20gdGhyaWZ0IGltcG9ydCBUaHJpZnQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKKworZGVmIG1haW4oKToKKyAgICAjIE1ha2Ugc29ja2V0CisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCcxMjcuMC4wLjEnLCA5MDkwKQorCisgICAgIyBCdWZmZXJpbmcgaXMgY3JpdGljYWwuIFJhdyBzb2NrZXRzIGFyZSB2ZXJ5IHNsb3cKKyAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpCisKKyAgICAjIFdyYXAgaW4gYSBwcm90b2NvbAorICAgIHByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpCisKKyAgICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKKyAgICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCkKKworICAgICMgQ29ubmVjdCEKKyAgICB0cmFuc3BvcnQub3BlbigpCisKKyAgICBjbGllbnQuUGluZygpCisgICAgcHJpbnQoJ3BpbmcoKScpCisKKyAgICBzdW0gPSBjbGllbnQuQWRkKDEsIDEpCisgICAgcHJpbnQoKCcxKzE9JWQnICUgKHN1bSkpKQorCisgICAgd29yayA9IFdvcmsoKQorCisgICAgd29yay5PcCA9IE9wZXJhdGlvbi5EaXZpZGUKKyAgICB3b3JrLk51bTEgPSAxCisgICAgd29yay5OdW0yID0gMAorCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoKCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKSkKKworICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU3Vic3RyYWN0CisgICAgd29yay5OdW0xID0gMTUKKyAgICB3b3JrLk51bTIgPSAxMAorCisgICAgZGlmZiA9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgoJzE1LTEwPSVkJyAlIChkaWZmKSkpCisKKyAgICBsb2cgPSBjbGllbnQuR2V0U3RydWN0KDEpCisgICAgcHJpbnQoKCdDaGVjayBsb2c6ICVzJyAlIChsb2cuVmFsdWUpKSkKKworICAgIGNsaWVudC5aaXAoKQorICAgIHByaW50KCd6aXAoKScpCisKKyAgICAjIENsb3NlIQorICAgIHRyYW5zcG9ydC5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHRyeToKKyAgICBtYWluKCkKKyAgZXhjZXB0IFRocmlmdC5URXhjZXB0aW9uIGFzIHR4OgorICAgIHByaW50KCclcycgJSB0eC5tZXNzYWdlKQorYGBgCisKKworKipQeXRob24gU2VydmVyOioqCisKKworYGBgcHl0aG9uCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cworc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uCisKK2Zyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KKworICAgIGRlZiBQaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKKworICAgIGRlZiBBZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCisKKyAgICBkZWYgQ2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCisKKyAgICAgICAgaWYgd29yay5PcCA9PSBPcGVyYXRpb24uQWRkOgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICsgd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uU3Vic3RyYWN0OgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC0gd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uTXVsdGlwbHk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKiB3b3JrLk51bTIKKyAgICAgICAgZWxpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5EaXZpZGU6CisgICAgICAgICAgICBpZiB3b3JrLk51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC5XaGF0T3AgPSB3b3JrLk9wCisgICAgICAgICAgICAgICAgeC5XaHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAvIHdvcmsuTnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC5XaGF0T3AgPSB3b3JrLk9wCisgICAgICAgICAgICB4LldoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKKworICAgICAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICBsb2cuS2V5ID0gbG9naWQKKyAgICAgICAgbG9nLlZhbHVlID0gJyVkJyAlICh2YWwpCisgICAgICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiBHZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgWmlwKHNlbGYpOgorICAgICAgICBwcmludCgnemlwKCknKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCisgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdD0idGVzdHNlcnZlciIsIHBvcnQ9OTA5MCkKKyAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisKKyAgICBzZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICBwcmludCgnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpCisgICAgc2VydmVyLnNlcnZlKCkKKyAgICBwcmludCgnZG9uZS4nKQorCisgICAgIyBZb3UgY291bGQgZG8gb25lIG9mIHRoZXNlIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorYGBgCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE4MWJhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDQyOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkJ1aWxkZXI7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5Ib3N0aW5nOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuQ29uZmlndXJhdGlvbjsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkRlcGVuZGVuY3lJbmplY3Rpb247Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcjsKK3VzaW5nIHR1dG9yaWFsOwordXNpbmcgc2hhcmVkOworCituYW1lc3BhY2UgU2VydmVyCit7CisgICAgcHVibGljIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElMb2dnZXIgTG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5BZGRDb25zb2xlKExvZ0xldmVsLlRyYWNlKS5BZGREZWJ1ZyhMb2dMZXZlbC5UcmFjZSkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihTZXJ2ZXIpKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBhcmdzID0gYXJncyA/PyBuZXcgc3RyaW5nWzBdOworCisgICAgICAgICAgICBpZiAoYXJncy5BbnkoeCA9PiB4LlN0YXJ0c1dpdGgoIi1oZWxwIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERpc3BsYXlIZWxwKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1c2luZyAodmFyIHNvdXJjZSA9IG5ldyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJ1bkFzeW5jKGFyZ3MsIHNvdXJjZS5Ub2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworCisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJQcmVzcyBhbnkga2V5IHRvIHN0b3AuLi4iKTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuUmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UuQ2FuY2VsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiU2VydmVyIHN0b3BwZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRGlzcGxheUhlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oQCIKK1VzYWdlOiAKKyAgICBTZXJ2ZXIuZXhlIC1oZWxwCisgICAgICAgIHdpbGwgZGlwbGF5IGhlbHAgaW5mb3JtYXRpb24gCisKKyAgICBTZXJ2ZXIuZXhlIC10cjo8dHJhbnNwb3J0PiAtcHI6PHByb3RvY29sPgorICAgICAgICB3aWxsIHJ1biBzZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkKKworT3B0aW9uczoKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSB0Y3AgYnVmZmVyZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChodHRwIGFkZHJlc3MgLSAiImxvY2FsaG9zdDo5MDkwIiIpCisgICAgICAgIHRjcHRscyAtIHRjcCB0cmFuc3BvcnQgd2l0aCB0bHMgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIGZyYW1lZCAtIHRjcCBmcmFtZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorCisgICAgLXByIChwcm90b2NvbCk6IAorICAgICAgICBiaW5hcnkgLSAoZGVmYXVsdCkgYmluYXJ5IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBjb21wYWN0IC0gY29tcGFjdCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAganNvbiAtIGpzb24gcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIG11bHRpcGxleGVkIC0gbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisKK1NhbXBsZToKKyAgICBTZXJ2ZXIuZXhlIC10cjp0Y3AgCisiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQXN5bmMoc3RyaW5nW10gYXJncywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZWxlY3RlZFRyYW5zcG9ydCA9IEdldFRyYW5zcG9ydChhcmdzKTsKKyAgICAgICAgICAgIHZhciBzZWxlY3RlZFByb3RvY29sID0gR2V0UHJvdG9jb2woYXJncyk7CisKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYW5zcG9ydCA9PSBUcmFuc3BvcnQuSHR0cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgSHR0cFNlcnZlclNhbXBsZSgpLlJ1bihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgUnVuU2VsZWN0ZWRDb25maWd1cmF0aW9uQXN5bmMoc2VsZWN0ZWRUcmFuc3BvcnQsIHNlbGVjdGVkUHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFByb3RvY29sIEdldFByb3RvY29sKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItcHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBFbnVtLlRyeVBhcnNlKHRyYW5zcG9ydCwgdHJ1ZSwgb3V0IFByb3RvY29sIHNlbGVjdGVkUHJvdG9jb2wpOworCisgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRQcm90b2NvbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi10ciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIEVudW0uVHJ5UGFyc2UodHJhbnNwb3J0LCB0cnVlLCBvdXQgVHJhbnNwb3J0IHNlbGVjdGVkVHJhbnNwb3J0KTsKKworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVHJhbnNwb3J0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBSdW5TZWxlY3RlZENvbmZpZ3VyYXRpb25Bc3luYyhUcmFuc3BvcnQgdHJhbnNwb3J0LCBQcm90b2NvbCBwcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmYWJyaWMgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpLkFkZENvbnNvbGUoTG9nTGV2ZWwuVHJhY2UpLkFkZERlYnVnKExvZ0xldmVsLlRyYWNlKTsKKyAgICAgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JBc3luY0hhbmRsZXIoKTsKKyAgICAgICAgICAgIElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKKworICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBudWxsOworCisgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3A6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KDkwOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3BCdWZmZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQocG9ydDogOTA5MCwgY2xpZW50VGltZW91dDogMTAwMDAsIHVzZUJ1ZmZlcmVkU29ja2V0czogdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Lk5hbWVkUGlwZToKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQoIi50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcFRsczoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoOTA5MCwgZmFsc2UsIEdldENlcnRpZmljYXRlKCksIENsaWVudENlcnRWYWxpZGF0b3IsIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LkZyYW1lZDoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoOTA5MCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICAgICAgc3dpdGNoIChwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkJpbmFyeToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQ29tcGFjdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5Kc29uOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUSnNvblByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLk11bHRpcGxleGVkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGNIYW5kbGVyID0gbmV3IENhbGN1bGF0b3JBc3luY0hhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGNQcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihjYWxjSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlZFNlcnZpY2VIYW5kbGVyID0gbmV3IFNoYXJlZFNlcnZpY2VBc3luY0hhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlZFNlcnZpY2VQcm9jZXNzb3IgPSBuZXcgU2hhcmVkU2VydmljZS5Bc3luY1Byb2Nlc3NvcihzaGFyZWRTZXJ2aWNlSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIG11bHRpcGxleGVkUHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcihuYW1lb2YoQ2FsY3VsYXRvciksIGNhbGNQcm9jZXNzb3IpOworICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcihuYW1lb2YoU2hhcmVkU2VydmljZSksIHNoYXJlZFNlcnZpY2VQcm9jZXNzb3IpOworCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG11bHRpcGxleGVkUHJvY2Vzc29yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YocHJvdG9jb2wpLCBwcm90b2NvbCwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJCJTZWxlY3RlZCBUQXN5bmNTZXJ2ZXIgd2l0aCB7c2VydmVyVHJhbnNwb3J0fSB0cmFuc3BvcnQsIHtwcm9jZXNzb3J9IHByb2Nlc3NvciBhbmQge2lucHV0UHJvdG9jb2xGYWN0b3J5fSBwcm90b2NvbCBmYWN0b3JpZXMiKTsKKworICAgICAgICAgICAgICAgIHZhciBzZXJ2ZXIgPSBuZXcgQXN5bmNCYXNlU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBmYWJyaWMpOworCisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTdGFydGluZyB0aGUgc2VydmVyLi4uIik7CisgICAgICAgICAgICAgICAgYXdhaXQgc2VydmVyLlNlcnZlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbih4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlMiBHZXRDZXJ0aWZpY2F0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGR1ZSB0byBmaWxlcyBsb2NhdGlvbiBpbiBuZXQgY29yZSBiZXR0ZXIgdG8gdGFrZSBjZXJ0cyBmcm9tIHRvcCBmb2xkZXIKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9IEdldENlcnRQYXRoKERpcmVjdG9yeS5HZXRQYXJlbnQoRGlyZWN0b3J5LkdldEN1cnJlbnREaXJlY3RvcnkoKSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRGaWxlLCAiVGhyaWZ0VGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldENlcnRQYXRoKERpcmVjdG9yeUluZm8gZGksIGludCBtYXhDb3VudCA9IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b3BEaXIgPSBkaTsKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9CisgICAgICAgICAgICAgICAgdG9wRGlyLkVudW1lcmF0ZUZpbGVzKCJUaHJpZnRUZXN0LnBmeCIsIFNlYXJjaE9wdGlvbi5BbGxEaXJlY3RvcmllcykKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoY2VydEZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobWF4Q291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgZmlsZSBpbiBkaXJlY3RvcmllcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBHZXRDZXJ0UGF0aChkaS5QYXJlbnQsIG1heENvdW50IC0gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjZXJ0RmlsZS5GdWxsTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sob2JqZWN0IHNlbmRlciwKKyAgICAgICAgICAgIHN0cmluZyB0YXJnZXRIb3N0LCBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uIGxvY2FsQ2VydGlmaWNhdGVzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIHJlbW90ZUNlcnRpZmljYXRlLCBzdHJpbmdbXSBhY2NlcHRhYmxlSXNzdWVycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldENlcnRpZmljYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIENsaWVudENlcnRWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgWDUwOUNoYWluIGNoYWluLCBTc2xQb2xpY3lFcnJvcnMgc3NsUG9saWN5RXJyb3JzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgVGNwLAorICAgICAgICAgICAgVGNwQnVmZmVyZWQsCisgICAgICAgICAgICBOYW1lZFBpcGUsCisgICAgICAgICAgICBIdHRwLAorICAgICAgICAgICAgVGNwVGxzLAorICAgICAgICAgICAgRnJhbWVkCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgQmluYXJ5LAorICAgICAgICAgICAgQ29tcGFjdCwKKyAgICAgICAgICAgIEpzb24sCisgICAgICAgICAgICBNdWx0aXBsZXhlZAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIEh0dHBTZXJ2ZXJTYW1wbGUKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgUnVuKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuQWRkRW52aXJvbm1lbnRWYXJpYWJsZXMocHJlZml4OiAiQVNQTkVUQ09SRV8iKQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsKKworICAgICAgICAgICAgICAgIHZhciBob3N0ID0gbmV3IFdlYkhvc3RCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLlVzZUNvbmZpZ3VyYXRpb24oY29uZmlnKQorICAgICAgICAgICAgICAgICAgICAuVXNlS2VzdHJlbCgpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VVcmxzKCJodHRwOi8vbG9jYWxob3N0OjkwOTAiKQorICAgICAgICAgICAgICAgICAgICAuVXNlQ29udGVudFJvb3QoRGlyZWN0b3J5LkdldEN1cnJlbnREaXJlY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAgICAgLlVzZVN0YXJ0dXA8U3RhcnR1cD4oKQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsKKworICAgICAgICAgICAgICAgIGhvc3QuUnVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGNsYXNzIFN0YXJ0dXAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RhcnR1cChJSG9zdGluZ0Vudmlyb25tZW50IGVudikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGVyID0gbmV3IENvbmZpZ3VyYXRpb25CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCYXNlUGF0aChlbnYuQ29udGVudFJvb3RQYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkFkZEVudmlyb25tZW50VmFyaWFibGVzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiA9IGJ1aWxkZXIuQnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25Sb290IENvbmZpZ3VyYXRpb24geyBnZXQ7IH0KKworICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGJ5IHRoZSBydW50aW1lLiBVc2UgdGhpcyBtZXRob2QgdG8gYWRkIHNlcnZpY2VzIHRvIHRoZSBjb250YWluZXIuCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgQ29uZmlndXJlU2VydmljZXMoSVNlcnZpY2VDb2xsZWN0aW9uIHNlcnZpY2VzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuQWRkVHJhbnNpZW50PENhbGN1bGF0b3IuSUFzeW5jLCBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyPigpOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5BZGRUcmFuc2llbnQ8SVRBc3luY1Byb2Nlc3NvciwgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3Nvcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuQWRkVHJhbnNpZW50PFRIdHRwU2VydmVyVHJhbnNwb3J0LCBUSHR0cFNlcnZlclRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCBieSB0aGUgcnVudGltZS4gVXNlIHRoaXMgbWV0aG9kIHRvIGNvbmZpZ3VyZSB0aGUgSFRUUCByZXF1ZXN0IHBpcGVsaW5lLgorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvbmZpZ3VyZShJQXBwbGljYXRpb25CdWlsZGVyIGFwcCwgSUhvc3RpbmdFbnZpcm9ubWVudCBlbnYsCisgICAgICAgICAgICAgICAgICAgIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcHAuVXNlTWlkZGxld2FyZTxUSHR0cFNlcnZlclRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvckFzeW5jSGFuZGxlciA6IENhbGN1bGF0b3IuSUFzeW5jCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4gX2xvZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgU2hhcmVkU3RydWN0PigpOworCisgICAgICAgICAgICBwdWJsaWMgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFNoYXJlZFN0cnVjdD4gZ2V0U3RydWN0QXN5bmMoaW50IGtleSwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIkdldFN0cnVjdEFzeW5jKHswfSkiLCBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQoX2xvZ1trZXldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgcGluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiUGluZ0FzeW5jKCkiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGludD4gYWRkQXN5bmMoaW50IG51bTEsIGludCBudW0yLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJBZGRBc3luYyh7bnVtMX0se251bTJ9KSIpOworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQobnVtMSArIG51bTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxpbnQ+IGNhbGN1bGF0ZUFzeW5jKGludCBsb2dpZCwgV29yayB3LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJDYWxjdWxhdGVBc3luYyh7bG9naWR9LCBbe3cuT3B9LHt3Lk51bTF9LHt3Lk51bTJ9XSkiKTsKKworICAgICAgICAgICAgICAgIHZhciB2YWwgPSAwOworICAgICAgICAgICAgICAgIHN3aXRjaCAody5PcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSArIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xIC0gdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgKiB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAody5OdW0yID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXRPcCA9IChpbnQpIHcuT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xIC8gdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0T3AgPSAoaW50KSB3Lk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoeSA9ICJVbmtub3duIG9wZXJhdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5ID0gbG9naWQsCisgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gdmFsLlRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgX2xvZ1tsb2dpZF0gPSBlbnRyeTsKKworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQodmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgemlwQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJaaXBBc3luYygpIHdpdGggZGVsYXkgMTAwbWMiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkRlbGF5KDEwMCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgU2hhcmVkU2VydmljZUFzeW5jSGFuZGxlciA6IFNoYXJlZFNlcnZpY2UuSUFzeW5jCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFNoYXJlZFN0cnVjdD4gZ2V0U3RydWN0QXN5bmMoaW50IGtleSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJHZXRTdHJ1Y3RBc3luYyh7MH0pIiwga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KG5ldyBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5ID0ga2V5LAorICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJHZXRTdHJ1Y3RBc3luYyIKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0NDIzNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImUyMTBmYzEwLTVhZmYtNGIwNC1hYzIxLTU4YWZjN2I3NGIwYyIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbiBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA3NmZmCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCkBAIC0wLDAgKzEsOCBAQAoreworICAicHJvZmlsZXMiOiB7CisgICAgIlNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kTmFtZSI6ICJQcm9qZWN0IiwKKyAgICAgICJjb21tYW5kTGluZUFyZ3MiOiAiLXA6bXVsdGlwbGV4ZWQiCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiZDMwMwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2oKQEAgLTAsMCArMSwyNiBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkay5XZWIiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+U2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5TZXJ2ZXI8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2oiIC8+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vLi4vLi4vbGliL25ldGNvcmUvVGhyaWZ0L1RocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkFzcE5ldENvcmUiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZS5TZXJ2ZXIuSUlTSW50ZWdyYXRpb24iIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZS5TZXJ2ZXIuS2VzdHJlbCIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkNvbmZpZ3VyYXRpb24uRmlsZUV4dGVuc2lvbnMiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4IGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkZWQyOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuIGIvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkY2Q0NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuCkBAIC0wLDAgKzEsNzggQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2MTE0LjIKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiSW50ZXJmYWNlcyIsICJJbnRlcmZhY2VzXEludGVyZmFjZXMuY3Nwcm9qIiwgIntCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAie0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uCisJCVNvbHV0aW9uR3VpZCA9IHswNzBBNUQxRC1CMjlELTQ2MDMtOTk5RC02OTNEQjQ0NEFEMER9CisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZCBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZApAQCAtMCwwICsxLDI1IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KK3NldGxvY2FsCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZAorCis6ZW9mCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTdlMzEwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworc2V0IC1lCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTZmZWMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1ub2RlanMvQ2FsY3VsYXRvci5qcyBnZW4tbm9kZWpzL1NoYXJlZFNlcnZpY2UuanM6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tbm9kZWpzL0NhbGN1bGF0b3IuanMKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCU5PREVfUEFUSD0iJCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanM6JCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanMvbGliOiQoTk9ERVBBVEgpIiAkKE5PREVKUykgTm9kZVNlcnZlci5qcworCit0dXRvcmlhbGNsaWVudDogYWxsCisJTk9ERV9QQVRIPSIkKHRvcF9idWlsZGRpcikvbGliL25vZGVqczokKHRvcF9idWlsZGRpcikvbGliL25vZGVqcy9saWI6JChOT0RFUEFUSCkiICQoTk9ERUpTKSBOb2RlQ2xpZW50LmpzCisKK3R1dG9yaWFsc2VydmVyX3Byb21pc2U6IGFsbAorCU5PREVfUEFUSD0iJCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanM6JCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanMvbGliOiQoTk9ERVBBVEgpIiAkKE5PREVKUykgTm9kZVNlcnZlclByb21pc2UuanMKKwordHV0b3JpYWxjbGllbnRfcHJvbWlzZTogYWxsCisJTk9ERV9QQVRIPSIkKHRvcF9idWlsZGRpcikvbGliL25vZGVqczokKHRvcF9idWlsZGRpcikvbGliL25vZGVqcy9saWI6JChOT0RFUEFUSCkiICQoTk9ERUpTKSBOb2RlQ2xpZW50UHJvbWlzZS5qcworCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJTm9kZVNlcnZlci5qcyBcCisJTm9kZUNsaWVudC5qcyBcCisJTm9kZVNlcnZlclByb21pc2UuanMgXAorCU5vZGVDbGllbnRQcm9taXNlLmpzCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODg2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKK3ZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3InKTsKK3ZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMnKTsKK2NvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOworCit2YXIgdHJhbnNwb3J0ID0gdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKK3ZhciBwcm90b2NvbCA9IHRocmlmdC5UQmluYXJ5UHJvdG9jb2w7CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkwOTAsIHsKKyAgdHJhbnNwb3J0IDogdHJhbnNwb3J0LAorICBwcm90b2NvbCA6IHByb3RvY29sCit9KTsKKworY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgYXNzZXJ0KGZhbHNlLCBlcnIpOworfSk7CisKKy8vIENyZWF0ZSBhIENhbGN1bGF0b3IgY2xpZW50IHdpdGggdGhlIGNvbm5lY3Rpb24KK3ZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KENhbGN1bGF0b3IsIGNvbm5lY3Rpb24pOworCisKK2NsaWVudC5waW5nKGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgY29uc29sZS5sb2coJ3BpbmcoKScpOworfSk7CisKKworY2xpZW50LmFkZCgxLDEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgY29uc29sZS5sb2coIjErMT0iICsgcmVzcG9uc2UpOworfSk7CisKKword29yayA9IG5ldyB0dHlwZXMuV29yaygpOword29yay5vcCA9IHR0eXBlcy5PcGVyYXRpb24uRElWSURFOword29yay5udW0xID0gMTsKK3dvcmsubnVtMiA9IDA7CisKK2NsaWVudC5jYWxjdWxhdGUoMSwgd29yaywgZnVuY3Rpb24oZXJyLCBtZXNzYWdlKSB7CisgIGlmIChlcnIpIHsKKyAgICBjb25zb2xlLmxvZygiSW52YWxpZE9wZXJhdGlvbiAiICsgZXJyKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zb2xlLmxvZygnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpOworICB9Cit9KTsKKword29yay5vcCA9IHR0eXBlcy5PcGVyYXRpb24uU1VCVFJBQ1Q7Cit3b3JrLm51bTEgPSAxNTsKK3dvcmsubnVtMiA9IDEwOworCitjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmssIGZ1bmN0aW9uKGVyciwgbWVzc2FnZSkgeworICBjb25zb2xlLmxvZygnMTUtMTA9JyArIG1lc3NhZ2UpOworCisgIGNsaWVudC5nZXRTdHJ1Y3QoMSwgZnVuY3Rpb24oZXJyLCBtZXNzYWdlKXsKKyAgICBjb25zb2xlLmxvZygnQ2hlY2sgbG9nOiAnICsgbWVzc2FnZS52YWx1ZSk7CisKKyAgICAvL2Nsb3NlIHRoZSBjb25uZWN0aW9uIG9uY2Ugd2UncmUgZG9uZQorICAgIGNvbm5lY3Rpb24uZW5kKCk7CisgIH0pOworfSk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkYzE4NAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcwpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKK3ZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3InKTsKK3ZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMnKTsKK2NvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOworCit2YXIgdHJhbnNwb3J0ID0gdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKK3ZhciBwcm90b2NvbCA9IHRocmlmdC5UQmluYXJ5UHJvdG9jb2w7CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkwOTAsIHsKKyAgdHJhbnNwb3J0IDogdHJhbnNwb3J0LAorICBwcm90b2NvbCA6IHByb3RvY29sCit9KTsKKworY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgYXNzZXJ0KGZhbHNlLCBlcnIpOworfSk7CisKKy8vIENyZWF0ZSBhIENhbGN1bGF0b3IgY2xpZW50IHdpdGggdGhlIGNvbm5lY3Rpb24KK3ZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KENhbGN1bGF0b3IsIGNvbm5lY3Rpb24pOworCisKK2NsaWVudC5waW5nKCkKKyAgLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coJ3BpbmcoKScpOworICB9KTsKKworY2xpZW50LmFkZCgxLDEpCisgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisJICBjb25zb2xlLmxvZygiMSsxPSIgKyByZXNwb25zZSk7CisgIH0pOworCit3b3JrID0gbmV3IHR0eXBlcy5Xb3JrKCk7Cit3b3JrLm9wID0gdHR5cGVzLk9wZXJhdGlvbi5ESVZJREU7Cit3b3JrLm51bTEgPSAxOword29yay5udW0yID0gMDsKKworY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CisJY29uc29sZS5sb2coJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKTsKKyAgfSkKKyAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgY29uc29sZS5sb2coIkludmFsaWRPcGVyYXRpb24gIiArIGVycik7CisgIH0pOworCisKK3dvcmsub3AgPSB0dHlwZXMuT3BlcmF0aW9uLlNVQlRSQUNUOword29yay5udW0xID0gMTU7Cit3b3JrLm51bTIgPSAxMDsKKworY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAudGhlbihmdW5jdGlvbih2YWx1ZSkgeworCSAgY29uc29sZS5sb2coJzE1LTEwPScgKyB2YWx1ZSk7CisJICByZXR1cm4gY2xpZW50LmdldFN0cnVjdCgxKTsKKyAgfSkKKyAgLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgeworICAgICAgY29uc29sZS5sb2coJ0NoZWNrIGxvZzogJyArIG1lc3NhZ2UudmFsdWUpOworICB9KQorICAuZmluKGZ1bmN0aW9uKCkgeworCSAgLy9jbG9zZSB0aGUgY29ubmVjdGlvbiBvbmNlIHdlJ3JlIGRvbmUKKyAgICAgIGNvbm5lY3Rpb24uZW5kKCk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXIuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWQzODE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXIuanMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Cit2YXIgQ2FsY3VsYXRvciA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9DYWxjdWxhdG9yIik7Cit2YXIgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL3R1dG9yaWFsX3R5cGVzIik7Cit2YXIgU2hhcmVkU3RydWN0ID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL3NoYXJlZF90eXBlcyIpLlNoYXJlZFN0cnVjdDsKKwordmFyIGRhdGEgPSB7fTsKKwordmFyIHNlcnZlciA9IHRocmlmdC5jcmVhdGVTZXJ2ZXIoQ2FsY3VsYXRvciwgeworICBwaW5nOiBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygicGluZygpIik7CisgICAgcmVzdWx0KG51bGwpOworICB9LAorCisgIGFkZDogZnVuY3Rpb24objEsIG4yLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygiYWRkKCIsIG4xLCAiLCIsIG4yLCAiKSIpOworICAgIHJlc3VsdChudWxsLCBuMSArIG4yKTsKKyAgfSwKKworICBjYWxjdWxhdGU6IGZ1bmN0aW9uKGxvZ2lkLCB3b3JrLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygiY2FsY3VsYXRlKCIsIGxvZ2lkLCAiLCIsIHdvcmssICIpIik7CisKKyAgICB2YXIgdmFsID0gMDsKKyAgICBpZiAod29yay5vcCA9PSB0dHlwZXMuT3BlcmF0aW9uLkFERCkgeworICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yOworICAgIH0gZWxzZSBpZiAod29yay5vcCA9PT0gdHR5cGVzLk9wZXJhdGlvbi5TVUJUUkFDVCkgeworICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOworICAgIH0gZWxzZSBpZiAod29yay5vcCA9PT0gdHR5cGVzLk9wZXJhdGlvbi5NVUxUSVBMWSkgeworICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yOworICAgIH0gZWxzZSBpZiAod29yay5vcCA9PT0gdHR5cGVzLk9wZXJhdGlvbi5ESVZJREUpIHsKKyAgICAgIGlmICh3b3JrLm51bTIgPT09IDApIHsKKyAgICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLkludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wOworICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnOworICAgICAgICByZXN1bHQoeCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLkludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJzsKKyAgICAgIHJlc3VsdCh4KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YXIgZW50cnkgPSBuZXcgU2hhcmVkU3RydWN0KCk7CisgICAgZW50cnkua2V5ID0gbG9naWQ7CisgICAgZW50cnkudmFsdWUgPSAiIit2YWw7CisgICAgZGF0YVtsb2dpZF0gPSBlbnRyeTsKKworICAgIHJlc3VsdChudWxsLCB2YWwpOworICB9LAorCisgIGdldFN0cnVjdDogZnVuY3Rpb24oa2V5LCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygiZ2V0U3RydWN0KCIsIGtleSwgIikiKTsKKyAgICByZXN1bHQobnVsbCwgZGF0YVtrZXldKTsKKyAgfSwKKworICB6aXA6IGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCJ6aXAoKSIpOworICAgIHJlc3VsdChudWxsKTsKKyAgfQorCit9KTsKKworc2VydmVyLmxpc3Rlbig5MDkwKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyUHJvbWlzZS5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyUHJvbWlzZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmYyODdiCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXJQcm9taXNlLmpzCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOwordmFyIENhbGN1bGF0b3IgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvQ2FsY3VsYXRvciIpOwordmFyIHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy90dXRvcmlhbF90eXBlcyIpOwordmFyIFNoYXJlZFN0cnVjdCA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9zaGFyZWRfdHlwZXMiKS5TaGFyZWRTdHJ1Y3Q7CisKK3ZhciBkYXRhID0ge307CisKK3ZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKENhbGN1bGF0b3IsIHsKKyAgcGluZzogZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coInBpbmcoKSIpOworICB9LAorCisgIGFkZDogZnVuY3Rpb24objEsIG4yKSB7CisgICAgY29uc29sZS5sb2coImFkZCgiLCBuMSwgIiwiLCBuMiwgIikiKTsKKyAgICByZXR1cm4gbjEgKyBuMjsKKyAgfSwKKworICBjYWxjdWxhdGU6IGZ1bmN0aW9uKGxvZ2lkLCB3b3JrKSB7CisgICAgY29uc29sZS5sb2coImNhbGN1bGF0ZSgiLCBsb2dpZCwgIiwiLCB3b3JrLCAiKSIpOworCisgICAgdmFyIHZhbCA9IDA7CisgICAgaWYgKHdvcmsub3AgPT0gdHR5cGVzLk9wZXJhdGlvbi5BREQpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uU1VCVFJBQ1QpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uTVVMVElQTFkpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uRElWSURFKSB7CisgICAgICBpZiAod29yay5udW0yID09PSAwKSB7CisgICAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5JbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJzsKKwkJdGhyb3cgeDsKKyAgICAgIH0KKyAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLkludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJzsKKyAgICAgIHRocm93IHg7CisgICAgfQorCisgICAgdmFyIGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgIGVudHJ5LmtleSA9IGxvZ2lkOworICAgIGVudHJ5LnZhbHVlID0gIiIrdmFsOworICAgIGRhdGFbbG9naWRdID0gZW50cnk7CisgICAgcmV0dXJuIHZhbDsKKyAgfSwKKworICBnZXRTdHJ1Y3Q6IGZ1bmN0aW9uKGtleSkgeworICAgIGNvbnNvbGUubG9nKCJnZXRTdHJ1Y3QoIiwga2V5LCAiKSIpOworICAgIHJldHVybiBkYXRhW2tleV07CisgIH0sCisKKyAgemlwOiBmdW5jdGlvbigpIHsKKyAgICBjb25zb2xlLmxvZygiemlwKCkiKTsKKyAgfQorCit9KTsKKworc2VydmVyLmxpc3Rlbig5MDkwKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL0NhbGNDbGllbnQubWwgYi90dXRvcmlhbC9vY2FtbC9DYWxjQ2xpZW50Lm1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhODQ2N2IKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9vY2FtbC9DYWxjQ2xpZW50Lm1sCkBAIC0wLDAgKzEsNzQgQEAKKygqCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorKikKKworb3BlbiBBcmcKK29wZW4gVGhyaWZ0CitvcGVuIFR1dG9yaWFsX3R5cGVzCitvcGVuIFNoYXJlZF90eXBlcworCitleGNlcHRpb24gRGllOzsKK2xldCBzb2QgPSBmdW5jdGlvbgorICAgIFNvbWUgdiAtPiB2CisgIHwgTm9uZSAtPiByYWlzZSBEaWU7OworCit0eXBlIGNvbm5lY3Rpb24gPSB7CisgIHRyYW5zIDogVHJhbnNwb3J0LnQgOworICBwcm90byA6IFRocmlmdC5Qcm90b2NvbC50OworICBjYWxjIDogQ2FsY3VsYXRvci5jbGllbnQgOworfQorCitsZXQgY29ubmVjdCB+aG9zdCBwb3J0ID0KKyAgbGV0IHR4ID0gbmV3IFRTb2NrZXQudCBob3N0IHBvcnQgaW4KKyAgbGV0IHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbC50IHR4IGluCisgIGxldCBjYWxjID0gbmV3IENhbGN1bGF0b3IuY2xpZW50IHByb3RvIHByb3RvIGluCisgICAgdHgjb3BuOworICAgIHsgdHJhbnMgPSB0eCA7IHByb3RvID0gcHJvdG87IGNhbGMgPSBjYWxjIH0KKzs7CisKK2xldCBkb2NsaWVudCAoKSA9CisgIGxldCBjbGkgPSBjb25uZWN0IH5ob3N0OiIxMjcuMC4wLjEiIDkwOTAgaW4KKyAgdHJ5CisgICAgY2xpLmNhbGMjcGluZyA7CisgICAgUHJpbnRmLnByaW50ZiAicGluZygpXG4iIDsgZmx1c2ggc3Rkb3V0IDsKKyAgICAobGV0IHN1bSA9IGNsaS5jYWxjI2FkZCAoSW50MzIub2ZfaW50IDEpIChJbnQzMi5vZl9pbnQgMSkgaW4KKyAgICAgICBQcmludGYucHJpbnRmICIxKzE9JWxkXG4iIHN1bSA7CisgICAgICAgZmx1c2ggc3Rkb3V0KSA7CisgICAgKGxldCB3ID0gbmV3IHdvcmsgaW4KKyAgICAgICB3I3NldF9vcCBPcGVyYXRpb24uRElWSURFIDsKKyAgICAgICB3I3NldF9udW0xIChJbnQzMi5vZl9pbnQgMSkgOworICAgICAgIHcjc2V0X251bTIgKEludDMyLm9mX2ludCAwKSA7CisgICAgICAgdHJ5CisJIGxldCBxdW90aWVudCA9IGNsaS5jYWxjI2NhbGN1bGF0ZSAoSW50MzIub2ZfaW50IDEpIHcgaW4KKwkgICBQcmludGYucHJpbnRmICJXaG9hPyBXZSBjYW4gZGl2aWRlIGJ5IHplcm8hXG4iIDsgZmx1c2ggc3Rkb3V0CisgICAgICAgd2l0aCBJbnZhbGlkT3BlcmF0aW9uIGlvIC0+CisJIFByaW50Zi5wcmludGYgIkludmFsaWRPcGVyYXRpb246ICVzXG4iIGlvI2dyYWJfd2h5IDsgZmx1c2ggc3Rkb3V0KSA7CisgICAgKGxldCB3ID0gbmV3IHdvcmsgaW4KKyAgICAgICB3I3NldF9vcCBPcGVyYXRpb24uU1VCVFJBQ1QgOworICAgICAgIHcjc2V0X251bTEgKEludDMyLm9mX2ludCAxNSkgOworICAgICAgIHcjc2V0X251bTIgKEludDMyLm9mX2ludCAxMCkgOworICAgICAgIGxldCBkaWZmID0gY2xpLmNhbGMjY2FsY3VsYXRlIChJbnQzMi5vZl9pbnQgMSkgdyBpbgorCSBQcmludGYucHJpbnRmICIxNS0xMD0lbGRcbiIgZGlmZiA7IGZsdXNoIHN0ZG91dCkgOworICAgIChsZXQgc3MgPSBjbGkuY2FsYyNnZXRTdHJ1Y3QgKEludDMyLm9mX2ludCAxKSBpbgorICAgICAgIFByaW50Zi5wcmludGYgIkNoZWNrIGxvZzogJXNcbiIgc3MjZ3JhYl92YWx1ZSA7IGZsdXNoIHN0ZG91dCkgOworICAgIGNsaS50cmFucyNjbG9zZQorICB3aXRoIFRyYW5zcG9ydC5FIChfLHdoYXQpIC0+CisgICAgUHJpbnRmLnByaW50ZiAiRVJST1I6ICVzXG4iIHdoYXQgOyBmbHVzaCBzdGRvdXQKKzs7CisKK2RvY2xpZW50KCk7OwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvb2NhbWwvQ2FsY1NlcnZlci5tbCBiL3R1dG9yaWFsL29jYW1sL0NhbGNTZXJ2ZXIubWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVmYWNiNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL29jYW1sL0NhbGNTZXJ2ZXIubWwKQEAgLTAsMCArMSw4OSBAQAorKCoKKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisqKQorCitvcGVuIEFyZworb3BlbiBUaHJpZnQKK29wZW4gVHV0b3JpYWxfdHlwZXMKK29wZW4gU2hhcmVkX3R5cGVzCisKK2V4Y2VwdGlvbiBEaWU7OworbGV0IHNvZCA9IGZ1bmN0aW9uCisgICAgU29tZSB2IC0+IHYKKyAgfCBOb25lIC0+IHJhaXNlIERpZTs7CisKK2NsYXNzIGNhbGNfaGFuZGxlciA9CitvYmplY3QgKHNlbGYpCisgIGluaGVyaXQgQ2FsY3VsYXRvci5pZmFjZQorICB2YWwgbG9nID0gSGFzaHRibC5jcmVhdGUgMjMKKyAgbWV0aG9kIHBpbmcgID0gUHJpbnRmLnByaW50ZiAicGluZygpXG4iIDsgZmx1c2ggc3Rkb3V0CisgIG1ldGhvZCBhZGQgYSBiID0KKyAgICBQcmludGYucHJpbnRmImFkZCglbGQsJWxkKVxuIiAoc29kIGEpIChzb2QgYik7IGZsdXNoIHN0ZG91dCA7CisgICAgSW50MzIuYWRkIChzb2QgYSkgKHNvZCBiKQorICBtZXRob2QgY2FsY3VsYXRlIGxvZ2lkIHcgPQorICAgIGxldCB3ID0gc29kIHcgaW4KKyAgICAgIFByaW50Zi5wcmludGYgImNhbGN1bGF0ZSglbGQseyVsZCwlbGQsJWxkfSlcbiIgKHNvZCBsb2dpZCkgKE9wZXJhdGlvbi50b19pIHcjZ3JhYl9vcCkgdyNncmFiX251bTEgdyNncmFiX251bTI7IGZsdXNoIHN0ZG91dCA7CisgICAgbGV0IHJ2ID0KKyAgICAgIG1hdGNoIHcjZ3JhYl9vcCB3aXRoCisJICBPcGVyYXRpb24uQUREIC0+CisJICAgIEludDMyLmFkZCB3I2dyYWJfbnVtMSB3I2dyYWJfbnVtMgorCXwgT3BlcmF0aW9uLlNVQlRSQUNUIC0+CisJICAgIEludDMyLnN1YiB3I2dyYWJfbnVtMSB3I2dyYWJfbnVtMgorCXwgT3BlcmF0aW9uLk1VTFRJUExZIC0+CisJICAgIEludDMyLm11bCB3I2dyYWJfbnVtMSB3I2dyYWJfbnVtMgorCXwgT3BlcmF0aW9uLkRJVklERSAtPgorCSAgICBpZiB3I2dyYWJfbnVtMiA9IEludDMyLnplcm8gdGhlbgorCSAgICAgIGxldCBpbyA9IG5ldyBpbnZhbGlkT3BlcmF0aW9uIGluCisJCWlvI3NldF93aGF0T3AgKE9wZXJhdGlvbi50b19pIHcjZ3JhYl9vcCkgOworCQlpbyNzZXRfd2h5ICJDYW5ub3QgZGl2aWRlIGJ5IDAiIDsKKwkJcmFpc2UgKEludmFsaWRPcGVyYXRpb24gaW8pCisJICAgIGVsc2UKKwkgICAgICBJbnQzMi5kaXYgdyNncmFiX251bTEgdyNncmFiX251bTIgaW4KKworICAgIGxldCBzcyA9IG5ldyBzaGFyZWRTdHJ1Y3QgaW4KKyAgICAgIHNzI3NldF9rZXkgKHNvZCBsb2dpZCkgOworICAgIGxldCBidWZmZXIgPSBJbnQzMi50b19zdHJpbmcgcnYgaW4KKyAgICAgIHNzI3NldF92YWx1ZSBidWZmZXIgOworICAgICAgSGFzaHRibC5hZGQgbG9nIChzb2QgbG9naWQpIHNzIDsKKyAgICAgIHJ2CisKKyAgbWV0aG9kIHppcCA9CisgICAgUHJpbnRmLnByaW50ZiAiemlwKClcbiI7IGZsdXNoIHN0ZG91dAorCisgIG1ldGhvZCBnZXRTdHJ1Y3QgbG9naWQgPQorICAgIFByaW50Zi5wcmludGYgImdldFN0cnVjdCglbGQpXG4iIChzb2QgbG9naWQpIDsgZmx1c2ggc3Rkb3V0IDsKKyAgICBIYXNodGJsLmZpbmQgbG9nIChzb2QgbG9naWQpCisKK2VuZAorCitsZXQgZG9zZXJ2ZXIgKCkgPQorICBsZXQgaCA9IG5ldyBjYWxjX2hhbmRsZXIgaW4KKyAgbGV0IHByb2MgPSBuZXcgQ2FsY3VsYXRvci5wcm9jZXNzb3IgaCBpbgorICBsZXQgcG9ydCA9IDkwOTAgaW4KKyAgbGV0IHBmID0gbmV3IFRCaW5hcnlQcm90b2NvbC5mYWN0b3J5IGluCisgIGxldCBzZXJ2ZXIgPSBuZXcgVFRocmVhZGVkU2VydmVyLnQKKwkJIHByb2MKKwkJIChuZXcgVFNlcnZlclNvY2tldC50IHBvcnQpCisJCSAobmV3IFRyYW5zcG9ydC5mYWN0b3J5KQorCQkgcGYKKwkJIHBmCisgIGluCisgICAgc2VydmVyI3NlcnZlCis7OworCitkb3NlcnZlcigpOzsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL1JFQURNRS5tZCBiL3R1dG9yaWFsL29jYW1sL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhlODM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvb2NhbWwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTUgQEAKKworVGhpcyBpcyB0aGUgb2NhbWwgdHV0b3JpYWwgZXhhbXBsZS4gIEl0IGFzc3VtZXMgdGhhdCB5b3UndmUgYWxyZWFkeQorYnVpbHQgYW5kIGluc3RhbGxlZCB0aGUgdGhyaWZ0IG9jYW1sIHJ1bnRpbWUgbGlicmFyaWVzIGluIGxpYi9vY2FtbC4KKworVG8gY29tcGlsZSB0aGlzLCB5b3Ugd2lsbCBuZWVkIHRvIGdlbmVyYXRlIHRoZSBUaHJpZnQgc291cmNlcyBmb3IKK29jYW1sIGluIHRoaXMgZGlyZWN0b3J5IChkdWUgdG8gbGltaXRhdGlvbnMgaW4gdGhlIE9BU0lTIGJ1aWxkLXRvb2wpOgorCisgICUgdGhyaWZ0IC1yIC0tZ2VuIG9jYW1sIC4uL3R1dG9yaWFsLnRocmlmdAorICAlIG9hc2lzIHNldHVwCisgICUgbWFrZQorCitUaGlzIHdpbGwgcHJvZHVjZSB0d28gZXhlY3V0YWJsZXMgQ2FsY3tTZXJ2ZXIsQ2xpZW50fS48dHlwZT4gd2hlcmUKKzx0eXBlPiBpcyBvbmUgb2YgImJ5dGUiIG9yICJuYXRpdmUiLCBkZXBlbmRpbmcgb24geW91ciBvY2FtbAoraW5zdGFsbGF0aW9uLiAgSnVzdCBydW4gdGhlIHNlcnZlciBpbiB0aGUgYmFja2dyb3VuZCwgdGhlbiB0aGUgY2xpZW50CisoYXMgeW91IHdvdWxkIGRvIGZvciB0aGUgQysrIGV4YW1wbGUpLgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvb2NhbWwvX29hc2lzIGIvdHV0b3JpYWwvb2NhbWwvX29hc2lzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NWMwOTYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9vY2FtbC9fb2FzaXMKQEAgLTAsMCArMSwzMiBAQAorTmFtZTogdHV0b3JpYWwKK1ZlcnNpb246IDEuMC4wCitPQVNJU0Zvcm1hdDogMC4zCitTeW5vcHNpczogT0NhbWwgVHV0b3JpYWwgZXhhbXBsZQorQXV0aG9yczogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitMaWNlbnNlOiBBcGFjaGUtMi4wCitIb21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWlsZFRvb2xzOiBvY2FtbGJ1aWxkCitQbHVnaW5zOiAgICAgTUVUQSAoMC4zKSwKKyAgRGV2RmlsZXMgKDAuMykKKworTGlicmFyeSB0dXRvcmlhbF90aHJpZnQKKyAgUGF0aDogZ2VuLW9jYW1sCisgIEZpbmRsaWJOYW1lOiB0dXRvcmlhbF90aHJpZnQKKyAgYnVpbGRUb29sczogb2NhbWxidWlsZAorICBCdWlsZERlcGVuZHM6IHRocmVhZHMsdGhyaWZ0CisgIE1vZHVsZXM6IENhbGN1bGF0b3IsU2hhcmVkX2NvbnN0cyxUdXRvcmlhbF9jb25zdHMsU2hhcmVkU2VydmljZSxTaGFyZWRfdHlwZXMsVHV0b3JpYWxfdHlwZXMKKyAgWE1FVEFSZXF1aXJlczogdGhyZWFkcworCitFeGVjdXRhYmxlIENhbGNDbGllbnQKKyAgUGF0aDogLgorICBNYWluSXM6IENhbGNDbGllbnQubWwKKyAgQnVpbGQkOiB0cnVlCisgIENvbXBpbGVkT2JqZWN0OiBiZXN0CisgIEJ1aWxkRGVwZW5kczogdGhyaWZ0LCB0dXRvcmlhbF90aHJpZnQsIHRocmVhZHMKKworRXhlY3V0YWJsZSBDYWxjU2VydmVyCisgIFBhdGg6IC4KKyAgTWFpbklzOiBDYWxjU2VydmVyLm1sCisgIEJ1aWxkJDogdHJ1ZQorICBDb21waWxlZE9iamVjdDogYmVzdAorICBCdWlsZERlcGVuZHM6IHRocmlmdCwgdHV0b3JpYWxfdGhyaWZ0LCB0aHJlYWRzCmRpZmYgLS1naXQgYS90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwgYi90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwKaW5kZXggMWQ1OTY1Ni4uN2MyMzI4OSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsCisrKyBiL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbApAQCAtMzcsMTAgKzM3LDEwIEBACiAKIHVzZSBEYXRhOjpEdW1wZXI7CiAKLW15ICRzb2NrZXQgICAgPSBuZXcgVGhyaWZ0OjpTb2NrZXQoJ2xvY2FsaG9zdCcsOTA5MCk7Ci1teSAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwxMDI0LDEwMjQpOwotbXkgJHByb3RvY29sICA9IG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotbXkgJGNsaWVudCAgICA9IG5ldyB0dXRvcmlhbDo6Q2FsY3VsYXRvckNsaWVudCgkcHJvdG9jb2wpOworbXkgJHNvY2tldCAgICA9IFRocmlmdDo6U29ja2V0LT5uZXcoJ2xvY2FsaG9zdCcsOTA5MCk7CitteSAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQsMTAyNCwxMDI0KTsKK215ICRwcm90b2NvbCAgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zcG9ydCk7CitteSAkY2xpZW50ICAgID0gdHV0b3JpYWw6OkNhbGN1bGF0b3JDbGllbnQtPm5ldygkcHJvdG9jb2wpOwogCiAKIGV2YWx7CkBAIC01Myw3ICs1Myw3IEBACiAgICAgbXkgJHN1bSA9ICRjbGllbnQtPmFkZCgxLDEpOwogICAgIHByaW50ICIxKzE9JHN1bVxuIjsKIAotICAgIG15ICR3b3JrID0gbmV3IHR1dG9yaWFsOjpXb3JrKCk7CisgICAgbXkgJHdvcmsgPSB0dXRvcmlhbDo6V29yay0+bmV3KCk7CiAKICAgICAkd29yay0+b3AodHV0b3JpYWw6Ok9wZXJhdGlvbjo6RElWSURFKTsKICAgICAkd29yay0+bnVtMSgxKTsKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgJGNsaWVudC0+Y2FsY3VsYXRlKDEsICR3b3JrKTsKICAgICAgICAgcHJpbnQgIldob2EhIFdlIGNhbiBkaXZpZGUgYnkgemVybz9cbiI7CiAgICAgfTsgaWYoJEApIHsKLSAgICAgICAgd2FybiAiSW52YWxpZE9wZXJhdGlvbjogIi5EdW1wZXIoJEApOworICAgICAgICB3YXJuICdJbnZhbGlkT3BlcmF0aW9uOiAnLkR1bXBlcigkQCk7CiAgICAgfQogCiAgICAgJHdvcmstPm9wKHR1dG9yaWFsOjpPcGVyYXRpb246OlNVQlRSQUNUKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbCBiL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbAppbmRleCBhNDBlYzY5Li5kZmU2Yjg5IDEwMDY0NAotLS0gYS90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwKKysrIGIvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsCkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9wZXJsCisjIS91c3IvYmluL2VudiBwZXJsCiAKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtNjcsMjAgKzY3LDIwIEBACiAgIH0gZWxzaWYgKCRvcCA9PSB0dXRvcmlhbDo6T3BlcmF0aW9uOjpESVZJREUpIHsKICAgICBpZiAoJG51bTIgPT0gMCkKICAgICB7Ci0gICAgICBteSAkeCA9IG5ldyB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbjsKLSAgICAgICR4LT53aGF0KCRvcCk7CisgICAgICBteSAkeCA9IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uLT5uZXcoKTsKKyAgICAgICR4LT53aGF0T3AoJG9wKTsKICAgICAgICR4LT53aHkoJ0Nhbm5vdCBkaXZpZGUgYnkgMCcpOwogICAgICAgZGllICR4OwogICAgIH0KICAgICAkdmFsID0gJG51bTEgLyAkbnVtMjsKICAgfSBlbHNlIHsKLSAgICBteSAkeCA9IG5ldyB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbjsKLSAgICAkeC0+d2hhdCgkb3ApOworICAgIG15ICR4ID0gdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb24tPm5ldygpOworICAgICR4LT53aGF0T3AoJG9wKTsKICAgICAkeC0+d2h5KCdJbnZhbGlkIG9wZXJhdGlvbicpOwogICAgIGRpZSAkeDsKICAgfQogCi0gIG15ICRsb2cgPSBuZXcgc2hhcmVkOjpTaGFyZWRTdHJ1Y3Q7CisgIG15ICRsb2cgPSBzaGFyZWQ6OlNoYXJlZFN0cnVjdC0+bmV3KCk7CiAgICRsb2ctPmtleSgkbG9naWQpOwogICAkbG9nLT52YWx1ZShpbnQoJHZhbCkpOwogICAkc2VsZi0+e2xvZ30tPnskbG9naWR9ID0gJGxvZzsKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAKIAogZXZhbCB7Ci0gIG15ICRoYW5kbGVyICAgICAgID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyOwotICBteSAkcHJvY2Vzc29yICAgICA9IG5ldyB0dXRvcmlhbDo6Q2FsY3VsYXRvclByb2Nlc3NvcigkaGFuZGxlcik7Ci0gIG15ICRzZXJ2ZXJzb2NrZXQgID0gbmV3IFRocmlmdDo6U2VydmVyU29ja2V0KDkwOTApOwotICBteSAkZm9ya2luZ3NlcnZlciA9IG5ldyBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXIoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCk7CisgIG15ICRoYW5kbGVyICAgICAgID0gQ2FsY3VsYXRvckhhbmRsZXItPm5ldygpOworICBteSAkcHJvY2Vzc29yICAgICA9IHR1dG9yaWFsOjpDYWxjdWxhdG9yUHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIpOworICBteSAkc2VydmVyc29ja2V0ICA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoOTA5MCk7CisgIG15ICRmb3JraW5nc2VydmVyID0gVGhyaWZ0OjpGb3JraW5nU2VydmVyLT5uZXcoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCk7CiAgIHByaW50ICJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iOwogICAkZm9ya2luZ3NlcnZlci0+c2VydmUoKTsKICAgcHJpbnQgImRvbmUuXG4iOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAgYi90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocAppbmRleCBhNjYzOWQ1Li45MmRjM2NiIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocAorKysgYi90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocApAQCAtMSw1ICsxLDIyIEBACiAjIS91c3IvYmluL2VudiBwaHAKIDw/cGhwCisKK25hbWVzcGFjZSB0dXRvcmlhbFxwaHA7CisKK2Vycm9yX3JlcG9ydGluZyhFX0FMTCk7CisKK3JlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworJEdFTl9ESVIgPSByZWFscGF0aChkaXJuYW1lKF9fRklMRV9fKS4nLy4uJykuJy9nZW4tcGhwJzsKKworJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOworJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uL2xpYi9waHAvbGliJyk7CiskbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ3NoYXJlZCcsICRHRU5fRElSKTsKKyRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbigndHV0b3JpYWwnLCAkR0VOX0RJUik7CiskbG9hZGVyLT5yZWdpc3RlcigpOworCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE5LDI5ICszNiwxMSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10gPSAnLi4vLi4vbGliL3BocC9zcmMnOwotCi1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9UaHJpZnQucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RTb2NrZXQucGhwJzsKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3RyYW5zcG9ydC9USHR0cENsaWVudC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAnOwotCi0vKioKLSAqIFN1cHByZXNzIGVycm9ycyBpbiBoZXJlLCB3aGljaCBoYXBwZW4gYmVjYXVzZSB3ZSBoYXZlIG5vdCBpbnN0YWxsZWQgaW50bwotICogJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy90dXRvcmlhbCcgbGlrZSB3ZSBhcmUgc3VwcG9zZWQgdG8hCi0gKgotICogTm9ybWFsbHkgd2Ugd291bGQgb25seSBoYXZlIHRvIGluY2x1ZGUgQ2FsY3VsYXRvci5waHAgd2hpY2ggd291bGQgcHJvcGVybHkKLSAqIGluY2x1ZGUgdGhlIG90aGVyIGZpbGVzIGZyb20gdGhlaXIgcGFja2FnZXMvIGZvbGRlciBsb2NhdGlvbnMsIGJ1dCB3ZQotICogaW5jbHVkZSBldmVyeXRoaW5nIGhlcmUgZHVlIHRvIHRoZSBib2d1cyBwYXRoIHNldHVwLgotICovCi1lcnJvcl9yZXBvcnRpbmcoRV9OT05FKTsKLSRHRU5fRElSID0gJy4uL2dlbi1waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvc2hhcmVkL1NoYXJlZFNlcnZpY2UucGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3NoYXJlZC9zaGFyZWRfdHlwZXMucGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3R1dG9yaWFsL0NhbGN1bGF0b3IucGhwJzsKLXJlcXVpcmVfb25jZSAkR0VOX0RJUi4nL3R1dG9yaWFsL3R1dG9yaWFsX3R5cGVzLnBocCc7Ci1lcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0OwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEh0dHBDbGllbnQ7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwogCiB0cnkgewogICBpZiAoYXJyYXlfc2VhcmNoKCctLWh0dHAnLCAkYXJndikpIHsKQEAgLTUxLDcgKzUwLDcgQEAKICAgfQogICAkdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgkc29ja2V0LCAxMDI0LCAxMDI0KTsKICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgJGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KCRwcm90b2NvbCk7CisgICRjbGllbnQgPSBuZXcgXHR1dG9yaWFsXENhbGN1bGF0b3JDbGllbnQoJHByb3RvY29sKTsKIAogICAkdHJhbnNwb3J0LT5vcGVuKCk7CiAKQEAgLTYxLDIwICs2MCwyMCBAQAogICAkc3VtID0gJGNsaWVudC0+YWRkKDEsMSk7CiAgIHByaW50ICIxKzE9JHN1bVxuIjsKIAotICAkd29yayA9IG5ldyB0dXRvcmlhbF9Xb3JrKCk7CisgICR3b3JrID0gbmV3IFx0dXRvcmlhbFxXb3JrKCk7CiAKLSAgJHdvcmstPm9wID0gdHV0b3JpYWxfT3BlcmF0aW9uOjpESVZJREU7CisgICR3b3JrLT5vcCA9IFx0dXRvcmlhbFxPcGVyYXRpb246OkRJVklERTsKICAgJHdvcmstPm51bTEgPSAxOwogICAkd29yay0+bnVtMiA9IDA7CiAKICAgdHJ5IHsKICAgICAkY2xpZW50LT5jYWxjdWxhdGUoMSwgJHdvcmspOwogICAgIHByaW50ICJXaG9hISBXZSBjYW4gZGl2aWRlIGJ5IHplcm8/XG4iOwotICB9IGNhdGNoICh0dXRvcmlhbF9JbnZhbGlkT3BlcmF0aW9uICRpbykgeworICB9IGNhdGNoIChcdHV0b3JpYWxcSW52YWxpZE9wZXJhdGlvbiAkaW8pIHsKICAgICBwcmludCAiSW52YWxpZE9wZXJhdGlvbjogJGlvLT53aHlcbiI7CiAgIH0KIAotICAkd29yay0+b3AgPSB0dXRvcmlhbF9PcGVyYXRpb246OlNVQlRSQUNUOworICAkd29yay0+b3AgPSBcdHV0b3JpYWxcT3BlcmF0aW9uOjpTVUJUUkFDVDsKICAgJHdvcmstPm51bTEgPSAxNTsKICAgJHdvcmstPm51bTIgPSAxMDsKICAgJGRpZmYgPSAkY2xpZW50LT5jYWxjdWxhdGUoMSwgJHdvcmspOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAgYi90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocAppbmRleCAyMzViMTViLi41YTliNDliIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocAorKysgYi90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocApAQCAtMSw1ICsxLDIyIEBACiAjIS91c3IvYmluL2VudiBwaHAKIDw/cGhwCisKK25hbWVzcGFjZSB0dXRvcmlhbFxwaHA7CisKK2Vycm9yX3JlcG9ydGluZyhFX0FMTCk7CisKK3JlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworJEdFTl9ESVIgPSByZWFscGF0aChkaXJuYW1lKF9fRklMRV9fKS4nLy4uJykuJy9nZW4tcGhwJzsKKworJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOworJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uL2xpYi9waHAvbGliJyk7CiskbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ3NoYXJlZCcsICRHRU5fRElSKTsKKyRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbigndHV0b3JpYWwnLCAkR0VOX0RJUik7CiskbG9hZGVyLT5yZWdpc3RlcigpOworCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTMxLDMwICs0OCwxMSBAQAogICBpbmlfc2V0KCJkaXNwbGF5X2Vycm9ycyIsICJzdGRlcnIiKTsKIH0KIAotJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10gPSByZWFscGF0aChkaXJuYW1lKF9fRklMRV9fKS4nLy4uLy4uJykuJy9saWIvcGhwL3NyYyc7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRQaHBTdHJlYW07Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7CiAKLXJlcXVpcmVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RocmlmdC5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCc7Ci1yZXF1aXJlX29uY2UgJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy90cmFuc3BvcnQvVFBocFN0cmVhbS5waHAnOwotcmVxdWlyZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAnOwotCi0vKioKLSAqIFN1cHByZXNzIGVycm9ycyBpbiBoZXJlLCB3aGljaCBoYXBwZW4gYmVjYXVzZSB3ZSBoYXZlIG5vdCBpbnN0YWxsZWQgaW50bwotICogJEdMT0JBTFNbJ1RIUklGVF9ST09UJ10uJy9wYWNrYWdlcy90dXRvcmlhbCcgbGlrZSB3ZSBhcmUgc3VwcG9zZWQgdG8hCi0gKgotICogTm9ybWFsbHkgd2Ugd291bGQgb25seSBoYXZlIHRvIGluY2x1ZGUgQ2FsY3VsYXRvci5waHAgd2hpY2ggd291bGQgcHJvcGVybHkKLSAqIGluY2x1ZGUgdGhlIG90aGVyIGZpbGVzIGZyb20gdGhlaXIgcGFja2FnZXMvIGZvbGRlciBsb2NhdGlvbnMsIGJ1dCB3ZQotICogaW5jbHVkZSBldmVyeXRoaW5nIGhlcmUgZHVlIHRvIHRoZSBib2d1cyBwYXRoIHNldHVwLgotICovCi1lcnJvcl9yZXBvcnRpbmcoRV9OT05FKTsKLSRHRU5fRElSID0gcmVhbHBhdGgoZGlybmFtZShfX0ZJTEVfXykuJy8uLicpLicvZ2VuLXBocCc7Ci1yZXF1aXJlX29uY2UgJEdFTl9ESVIuJy9zaGFyZWQvU2hhcmVkU2VydmljZS5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvc2hhcmVkL3NoYXJlZF90eXBlcy5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvdHV0b3JpYWwvQ2FsY3VsYXRvci5waHAnOwotcmVxdWlyZV9vbmNlICRHRU5fRElSLicvdHV0b3JpYWwvdHV0b3JpYWxfdHlwZXMucGhwJzsKLWVycm9yX3JlcG9ydGluZyhFX0FMTCk7Ci0KLWNsYXNzIENhbGN1bGF0b3JIYW5kbGVyIGltcGxlbWVudHMgQ2FsY3VsYXRvcklmIHsKK2NsYXNzIENhbGN1bGF0b3JIYW5kbGVyIGltcGxlbWVudHMgXHR1dG9yaWFsXENhbGN1bGF0b3JJZiB7CiAgIHByb3RlY3RlZCAkbG9nID0gYXJyYXkoKTsKIAogICBwdWJsaWMgZnVuY3Rpb24gcGluZygpIHsKQEAgLTY2LDM1ICs2NCwzNSBAQAogICAgIHJldHVybiAkbnVtMSArICRudW0yOwogICB9CiAKLSAgcHVibGljIGZ1bmN0aW9uIGNhbGN1bGF0ZSgkbG9naWQsICR3KSB7CisgIHB1YmxpYyBmdW5jdGlvbiBjYWxjdWxhdGUoJGxvZ2lkLCBcdHV0b3JpYWxcV29yayAkdykgewogICAgIGVycm9yX2xvZygiY2FsY3VsYXRlKHskbG9naWR9LCB7eyR3LT5vcH0sIHskdy0+bnVtMX0sIHskdy0+bnVtMn19KSIpOwogICAgIHN3aXRjaCAoJHctPm9wKSB7Ci0gICAgICBjYXNlIHR1dG9yaWFsX09wZXJhdGlvbjo6QUREOgorICAgICAgY2FzZSBcdHV0b3JpYWxcT3BlcmF0aW9uOjpBREQ6CiAgICAgICAgICR2YWwgPSAkdy0+bnVtMSArICR3LT5udW0yOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdHV0b3JpYWxfT3BlcmF0aW9uOjpTVUJUUkFDVDoKKyAgICAgIGNhc2UgXHR1dG9yaWFsXE9wZXJhdGlvbjo6U1VCVFJBQ1Q6CiAgICAgICAgICR2YWwgPSAkdy0+bnVtMSAtICR3LT5udW0yOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdHV0b3JpYWxfT3BlcmF0aW9uOjpNVUxUSVBMWToKKyAgICAgIGNhc2UgXHR1dG9yaWFsXE9wZXJhdGlvbjo6TVVMVElQTFk6CiAgICAgICAgICR2YWwgPSAkdy0+bnVtMSAqICR3LT5udW0yOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdHV0b3JpYWxfT3BlcmF0aW9uOjpESVZJREU6CisgICAgICBjYXNlIFx0dXRvcmlhbFxPcGVyYXRpb246OkRJVklERToKICAgICAgICAgaWYgKCR3LT5udW0yID09IDApIHsKLSAgICAgICAgICAkaW8gPSBuZXcgdHV0b3JpYWxfSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICAgICRpby0+d2hhdCA9ICR3LT5vcDsKKyAgICAgICAgICAkaW8gPSBuZXcgXHR1dG9yaWFsXEludmFsaWRPcGVyYXRpb24oKTsKKyAgICAgICAgICAkaW8tPndoYXRPcCA9ICR3LT5vcDsKICAgICAgICAgICAkaW8tPndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOwogICAgICAgICAgIHRocm93ICRpbzsKICAgICAgICAgfQogICAgICAgICAkdmFsID0gJHctPm51bTEgLyAkdy0+bnVtMjsKICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgotICAgICAgICAkaW8gPSBuZXcgdHV0b3JpYWxfSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICAkaW8tPndoYXQgPSAkdy0+b3A7CisgICAgICAgICRpbyA9IG5ldyBcdHV0b3JpYWxcSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAkaW8tPndoYXRPcCA9ICR3LT5vcDsKICAgICAgICAgJGlvLT53aHkgPSAiSW52YWxpZCBPcGVyYXRpb24iOwogICAgICAgICB0aHJvdyAkaW87CiAgICAgfQogCi0gICAgJGxvZyA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICAkbG9nID0gbmV3IFxzaGFyZWRcU2hhcmVkU3RydWN0KCk7CiAgICAgJGxvZy0+a2V5ID0gJGxvZ2lkOwogICAgICRsb2ctPnZhbHVlID0gKHN0cmluZykkdmFsOwogICAgICR0aGlzLT5sb2dbJGxvZ2lkXSA9ICRsb2c7CkBAIC0xMDcsNyArMTA1LDcgQEAKICAgICAvLyBUaGlzIGFjdHVhbGx5IGRvZXNuJ3Qgd29yayBiZWNhdXNlIHRoZSBQSFAgaW50ZXJwcmV0ZXIgaXMKICAgICAvLyByZXN0YXJ0ZWQgZm9yIGV2ZXJ5IHJlcXVlc3QuCiAgICAgLy9yZXR1cm4gJHRoaXMtPmxvZ1ska2V5XTsKLSAgICByZXR1cm4gbmV3IFNoYXJlZFN0cnVjdChhcnJheSgia2V5IiA9PiAka2V5LCAidmFsdWUiID0+ICJQSFAgaXMgc3RhdGVsZXNzISIpKTsKKyAgICByZXR1cm4gbmV3IFxzaGFyZWRcU2hhcmVkU3RydWN0KGFycmF5KCJrZXkiID0+ICRrZXksICJ2YWx1ZSIgPT4gIlBIUCBpcyBzdGF0ZWxlc3MhIikpOwogICB9CiAKICAgcHVibGljIGZ1bmN0aW9uIHppcCgpIHsKQEAgLTEyMiw3ICsxMjAsNyBAQAogfQogCiAkaGFuZGxlciA9IG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpOwotJHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKCRoYW5kbGVyKTsKKyRwcm9jZXNzb3IgPSBuZXcgXHR1dG9yaWFsXENhbGN1bGF0b3JQcm9jZXNzb3IoJGhhbmRsZXIpOwogCiAkdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChuZXcgVFBocFN0cmVhbShUUGhwU3RyZWFtOjpNT0RFX1IgfCBUUGhwU3RyZWFtOjpNT0RFX1cpKTsKICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCwgdHJ1ZSwgdHJ1ZSk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5IGIvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weQppbmRleCBhZTI5ZmVkLi4wNzdkYWExIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5CisrKyBiL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkKQEAgLTI2LDcgKzI2LDggQEAKICMgY2hkaXIoMikgaW50byB0aGUgdHV0b3JpYWwgZGlyZWN0b3J5Lgogb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkpKQogCisKIGNsYXNzIEhhbmRsZXIoQ0dJSFRUUFNlcnZlci5DR0lIVFRQUmVxdWVzdEhhbmRsZXIpOgotICBjZ2lfZGlyZWN0b3JpZXMgID0gWycvcGhwJ10KKyAgICBjZ2lfZGlyZWN0b3JpZXMgPSBbJy9waHAnXQogCiBCYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyKCgnJywgODA4MCksIEhhbmRsZXIpLnNlcnZlX2ZvcmV2ZXIoKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGI3M2MxZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1weS50b3JuYWRvL3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5LnRvcm5hZG8vc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcHkudG9ybmFkby90dXRvcmlhbC9DYWxjdWxhdG9yLnB5CisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uU2VydmVyLnB5CisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uQ2xpZW50LnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJUHl0aG9uU2VydmVyLnB5IFwKKwlQeXRob25DbGllbnQucHkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5IGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25DbGllbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDI2MTQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5CkBAIC0wLDAgKzEsMTA4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBPcGVyYXRpb24sIFdvcmssIEludmFsaWRPcGVyYXRpb24KKworZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4KK2Zyb20gdG9ybmFkbyBpbXBvcnQgaW9sb29wCisKKworQGdlbi5jb3JvdXRpbmUKK2RlZiBjb21tdW5pY2F0ZSgpOgorICAgICMgY3JlYXRlIGNsaWVudAorICAgIHRyYW5zcG9ydCA9IFRUb3JuYWRvLlRUb3JuYWRvU3RyZWFtVHJhbnNwb3J0KCdsb2NhbGhvc3QnLCA5MDkwKQorICAgICMgb3BlbiB0aGUgdHJhbnNwb3J0LCBiYWlsIG9uIGVycm9yCisgICAgdHJ5OgorICAgICAgICB5aWVsZCB0cmFuc3BvcnQub3BlbigpCisgICAgICAgIHByaW50KCdUcmFuc3BvcnQgaXMgb3BlbmVkJykKKyAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGV4OgorICAgICAgICBsb2dnaW5nLmVycm9yKGV4KQorICAgICAgICByYWlzZSBnZW4uUmV0dXJuKCkKKworICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIGNsaWVudCA9IENhbGN1bGF0b3IuQ2xpZW50KHRyYW5zcG9ydCwgcGZhY3RvcnkpCisKKyAgICAjIHBpbmcKKyAgICB5aWVsZCBjbGllbnQucGluZygpCisgICAgcHJpbnQoInBpbmcoKSIpCisKKyAgICAjIGFkZAorICAgIHN1bV8gPSB5aWVsZCBjbGllbnQuYWRkKDEsIDEpCisgICAgcHJpbnQoIjEgKyAxID0gezB9Ii5mb3JtYXQoc3VtXykpCisKKyAgICAjIG1ha2UgYSBvbmV3YXkgY2FsbCB3aXRob3V0IGEgY2FsbGJhY2sgKHNjaGVkdWxlIHRoZSB3cml0ZSBhbmQgY29udGludWUKKyAgICAjIHdpdGhvdXQgYmxvY2tpbmcpCisgICAgY2xpZW50LnppcCgpCisgICAgcHJpbnQoInppcCgpIHdpdGhvdXQgY2FsbGJhY2siKQorCisgICAgIyBtYWtlIGEgb25ld2F5IGNhbGwgd2l0aCBhIGNhbGxiYWNrICh3ZSdsbCB3YWl0IGZvciB0aGUgc3RyZWFtIHdyaXRlIHRvCisgICAgIyBjb21wbGV0ZSBiZWZvcmUgY29udGludWluZykKKyAgICBjbGllbnQuemlwKCkKKyAgICBwcmludCgiemlwKCkgd2l0aCBjYWxsYmFjayIpCisKKyAgICAjIGNhbGN1bGF0ZSAxLzAKKyAgICB3b3JrID0gV29yaygpCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREUKKyAgICB3b3JrLm51bTEgPSAxCisgICAgd29yay5udW0yID0gMAorCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoIldob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybyA/IC0+IHswfSIuZm9ybWF0KHF1b3RpZW50KSkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBpbzoKKyAgICAgICAgcHJpbnQoIkludmFsaWRPcGVyYXRpb246IHswfSIuZm9ybWF0KGlvKSkKKworICAgICMgY2FsY3VsYXRlIDE1LTEwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKKworICAgIGRpZmYgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoIjE1IC0gMTAgPSB7MH0iLmZvcm1hdChkaWZmKSkKKworICAgICMgZ2V0U3RydWN0CisgICAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCJDaGVjayBsb2c6IHswfSIuZm9ybWF0KGxvZy52YWx1ZSkpCisKKyAgICAjIGNsb3NlIHRoZSB0cmFuc3BvcnQKKyAgICBjbGllbnQuX3RyYW5zcG9ydC5jbG9zZSgpCisgICAgcmFpc2UgZ2VuLlJldHVybigpCisKKworZGVmIG1haW4oKToKKyAgICAjIGNyZWF0ZSBhbiBpb2xvb3AsIGRvIHRoZSBhYm92ZSwgdGhlbiBzdG9wCisgICAgaW9sb29wLklPTG9vcC5jdXJyZW50KCkucnVuX3N5bmMoY29tbXVuaWNhdGUpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAyMjlhMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uU2VydmVyLnB5CkBAIC0wLDAgKzEsMTAwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCisKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnRvcm5hZG8nKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKKworZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IE9wZXJhdGlvbiwgSW52YWxpZE9wZXJhdGlvbgorCitmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAorCitmcm9tIHRocmlmdCBpbXBvcnQgVFRvcm5hZG8KK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworZnJvbSB0b3JuYWRvIGltcG9ydCBpb2xvb3AKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQorCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCJwaW5nKCkiKQorCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgiYWRkKHt9LCB7fSkiLmZvcm1hdChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgorCisgICAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCJjYWxjdWxhdGUoe30sIHt9KSIuZm9ybWF0KGxvZ2lkLCB3b3JrKSkKKworICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCIKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAiSW52YWxpZCBvcGVyYXRpb24iCisgICAgICAgICAgICByYWlzZSB4CisKKyAgICAgICAgbG9nID0gU2hhcmVkU3RydWN0KCkKKyAgICAgICAgbG9nLmtleSA9IGxvZ2lkCisgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQorICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgorICAgICAgICBwcmludCgiZ2V0U3RydWN0KHt9KSIuZm9ybWF0KGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgiemlwKCkiKQorCisKK2RlZiBtYWluKCk6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIHNlcnZlciA9IFRUb3JuYWRvLlRUb3JuYWRvU2VydmVyKHByb2Nlc3NvciwgcGZhY3RvcnkpCisKKyAgICBwcmludCgiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpCisgICAgc2VydmVyLmJpbmQoOTA5MCkKKyAgICBzZXJ2ZXIuc3RhcnQoMSkKKyAgICBpb2xvb3AuSU9Mb29wLmluc3RhbmNlKCkuc3RhcnQoKQorICAgIHByaW50KCJkb25lLiIpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwY2QzNDIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkvc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weQorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJHtQWVRIT059IFB5dGhvblNlcnZlci5weQorCit0dXRvcmlhbGNsaWVudDogYWxsCisJJHtQWVRIT059IFB5dGhvbkNsaWVudC5weQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCitFWFRSQV9ESVNUID0gXAorCVB5dGhvbkNsaWVudC5weSBcCisJUHl0aG9uU2VydmVyLnB5IFwKKwlQeXRob25TZXJ2ZXIudGFjCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weSBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uQ2xpZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzZGRlN2UKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQpAQCAtMCwwICsxLDc5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmsKKworZnJvbSB0d2lzdGVkLmludGVybmV0LmRlZmVyIGltcG9ydCBpbmxpbmVDYWxsYmFja3MKK2Zyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgcmVhY3RvcgorZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBDbGllbnRDcmVhdG9yCisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworCitAaW5saW5lQ2FsbGJhY2tzCitkZWYgbWFpbihjbGllbnQpOgorICAgIHlpZWxkIGNsaWVudC5waW5nKCkKKyAgICBwcmludCgncGluZygpJykKKworICAgIHN1bSA9IHlpZWxkIGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgoJzErMT0lZCcgJSAoc3VtKSkpCisKKyAgICB3b3JrID0gV29yaygpCisKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCisKKyAgICB0cnk6CisgICAgICAgIHF1b3RpZW50ID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgICAgICBwcmludCgnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpCisgICAgICAgIHByaW50KCdGWUkgdGhlIGFuc3dlciBpcyAlZCcgJSBxdW90aWVudCkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBlOgorICAgICAgICBwcmludCgoJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGUpKQorCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKKworICAgIGRpZmYgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoKCcxNS0xMD0lZCcgJSAoZGlmZikpKQorCisgICAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCgnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKSkpCisgICAgcmVhY3Rvci5zdG9wKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBkID0gQ2xpZW50Q3JlYXRvcihyZWFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdENsaWVudFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0b3IuQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgKS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCA5MDkwKQorICAgIGQuYWRkQ2FsbGJhY2sobGFtYmRhIGNvbm46IGNvbm4uY2xpZW50KQorICAgIGQuYWRkQ2FsbGJhY2sobWFpbikKKworICAgIHJlYWN0b3IucnVuKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWIwZTJkNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnB5CkBAIC0wLDAgKzEsOTYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnR3aXN0ZWQnKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKKworZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbgorCitmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAorCitmcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBpbXBsZW1lbnRzCitmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IHJlYWN0b3IKKworZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCisKK2NsYXNzIENhbGN1bGF0b3JIYW5kbGVyOgorICAgIGltcGxlbWVudHMoQ2FsY3VsYXRvci5JZmFjZSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQorCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCdwaW5nKCknKQorCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgnYWRkKCVkLCVkKScgJSAobjEsIG4yKSkKKyAgICAgICAgcmV0dXJuIG4xICsgbjIKKworICAgIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKSkKKworICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCisgICAgICAgICAgICByYWlzZSB4CisKKyAgICAgICAgbG9nID0gU2hhcmVkU3RydWN0KCkKKyAgICAgICAgbG9nLmtleSA9IGxvZ2lkCisgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQorICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKKworICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorCisgICAgZGVmIHppcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3ppcCgpJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisgICAgc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoCisgICAgICAgIDkwOTAsCisgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkocHJvY2Vzc29yLCBwZmFjdG9yeSksCisgICAgICAgIGludGVyZmFjZT0iMTI3LjAuMC4xIikKKyAgICByZWFjdG9yLnJ1bigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ3OTYzNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnRhYwpAQCAtMCwwICsxLDUzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gdHdpc3RlZC5hcHBsaWNhdGlvbiBpbXBvcnQgaW50ZXJuZXQsIHNlcnZpY2UKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnR3aXN0ZWQnKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gUHl0aG9uU2VydmVyIGltcG9ydCBDYWxjdWxhdG9ySGFuZGxlcgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCisKK2RlZiBtYWtlX2FwcGxpY2F0aW9uKCk6CisgICAgYXBwbGljYXRpb24gPSBzZXJ2aWNlLkFwcGxpY2F0aW9uKCdDYWxjU2VydmVyJykKKworICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCisgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKKworICAgIHNlcnZlckZhY3RvcnkgPSBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisKKyAgICBjYWxjU2VydmljZSA9IGludGVybmV0LlRDUFNlcnZlcig5MDkwLCBzZXJ2ZXJGYWN0b3J5KQorCisgICAgbXVsdGlTZXJ2aWNlID0gc2VydmljZS5NdWx0aVNlcnZpY2UoKQorICAgIGNhbGNTZXJ2aWNlLnNldFNlcnZpY2VQYXJlbnQobXVsdGlTZXJ2aWNlKQorICAgIG11bHRpU2VydmljZS5zZXRTZXJ2aWNlUGFyZW50KGFwcGxpY2F0aW9uKQorCisgICAgcmV0dXJuIGFwcGxpY2F0aW9uCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgYXBwbGljYXRpb24gPSBtYWtlX2FwcGxpY2F0aW9uKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5L01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcHkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2RiODE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkvc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5IC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLXB5L3R1dG9yaWFsL0NhbGN1bGF0b3IucHkKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSR7UFlUSE9OfSBQeXRob25TZXJ2ZXIucHkKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCSR7UFlUSE9OfSBQeXRob25DbGllbnQucHkKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLSoKKworRVhUUkFfRElTVCA9IFwKKwlzZXR1cC5jZmcgXAorCVB5dGhvblNlcnZlci5weSBcCisJUHl0aG9uQ2xpZW50LnB5CmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkgYi90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkKaW5kZXggOTE2ZTkxNS4uYTZjMTk2NiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5CisrKyBiL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weQpAQCAtMjAsNjMgKzIwLDcwIEBACiAjCiAKIGltcG9ydCBzeXMKLXN5cy5wYXRoLmFwcGVuZCgnLi4vZ2VuLXB5JykKK2ltcG9ydCBnbG9iCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQogCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCi1mcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgKgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbiwgV29yawogCiBmcm9tIHRocmlmdCBpbXBvcnQgVGhyaWZ0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogCi10cnk6CiAKLSAgIyBNYWtlIHNvY2tldAotICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIDkwOTApCitkZWYgbWFpbigpOgorICAgICMgTWFrZSBzb2NrZXQKKyAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIDkwOTApCiAKLSAgIyBCdWZmZXJpbmcgaXMgY3JpdGljYWwuIFJhdyBzb2NrZXRzIGFyZSB2ZXJ5IHNsb3cKLSAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0KQorICAgICMgQnVmZmVyaW5nIGlzIGNyaXRpY2FsLiBSYXcgc29ja2V0cyBhcmUgdmVyeSBzbG93CisgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0KQogCi0gICMgV3JhcCBpbiBhIHByb3RvY29sCi0gIHByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgIyBXcmFwIGluIGEgcHJvdG9jb2wKKyAgICBwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KQogCi0gICMgQ3JlYXRlIGEgY2xpZW50IHRvIHVzZSB0aGUgcHJvdG9jb2wgZW5jb2RlcgotICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCkKKyAgICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKKyAgICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCkKIAotICAjIENvbm5lY3QhCi0gIHRyYW5zcG9ydC5vcGVuKCkKKyAgICAjIENvbm5lY3QhCisgICAgdHJhbnNwb3J0Lm9wZW4oKQogCi0gIGNsaWVudC5waW5nKCkKLSAgcHJpbnQgJ3BpbmcoKScKKyAgICBjbGllbnQucGluZygpCisgICAgcHJpbnQoJ3BpbmcoKScpCiAKLSAgc3VtID0gY2xpZW50LmFkZCgxLDEpCi0gIHByaW50ICcxKzE9JWQnICUgKHN1bSkKKyAgICBzdW1fID0gY2xpZW50LmFkZCgxLCAxKQorICAgIHByaW50KCcxKzE9JWQnICUgc3VtXykKIAotICB3b3JrID0gV29yaygpCisgICAgd29yayA9IFdvcmsoKQogCi0gIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFCi0gIHdvcmsubnVtMSA9IDEKLSAgd29yay5udW0yID0gMAorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFCisgICAgd29yay5udW0xID0gMQorICAgIHdvcmsubnVtMiA9IDAKIAotICB0cnk6Ci0gICAgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCi0gICAgcHJpbnQgJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nCi0gIGV4Y2VwdCBJbnZhbGlkT3BlcmF0aW9uLCBpbzoKLSAgICBwcmludCAnSW52YWxpZE9wZXJhdGlvbjogJXInICUgaW8KKyAgICB0cnk6CisgICAgICAgIHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgICAgICBwcmludCgnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpCisgICAgICAgIHByaW50KCdGWUkgdGhlIGFuc3dlciBpcyAlZCcgJSBxdW90aWVudCkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBlOgorICAgICAgICBwcmludCgnSW52YWxpZE9wZXJhdGlvbjogJXInICUgZSkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCi0gIHdvcmsubnVtMSA9IDE1Ci0gIHdvcmsubnVtMiA9IDEwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKIAotICBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICBwcmludCAnMTUtMTA9JWQnICUgKGRpZmYpCisgICAgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgnMTUtMTA9JWQnICUgZGlmZikKIAotICBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpCi0gIHByaW50ICdDaGVjayBsb2c6ICVzJyAlIChsb2cudmFsdWUpCisgICAgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCdDaGVjayBsb2c6ICVzJyAlIGxvZy52YWx1ZSkKIAotICAjIENsb3NlIQotICB0cmFuc3BvcnQuY2xvc2UoKQorICAgICMgQ2xvc2UhCisgICAgdHJhbnNwb3J0LmNsb3NlKCkKIAotZXhjZXB0IFRocmlmdC5URXhjZXB0aW9uLCB0eDoKLSAgcHJpbnQgJyVzJyAlICh0eC5tZXNzYWdlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRyeToKKyAgICAgICAgbWFpbigpCisgICAgZXhjZXB0IFRocmlmdC5URXhjZXB0aW9uIGFzIHR4OgorICAgICAgICBwcmludCgnJXMnICUgdHgubWVzc2FnZSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weSBiL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weQppbmRleCA2M2Y5OTNiLi5lNjQyMWVmIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkKKysrIGIvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5CkBAIC0xOSwxMSArMTksMTMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2ltcG9ydCBnbG9iCiBpbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4uL2dlbi1weScpCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQogCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCi1mcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgKgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbgogCiBmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAogCkBAIC0zMiw2NSArMzQsNzAgQEAKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlcgogCisKIGNsYXNzIENhbGN1bGF0b3JIYW5kbGVyOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5sb2cgPSB7fQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQogCi0gIGRlZiBwaW5nKHNlbGYpOgotICAgIHByaW50ICdwaW5nKCknCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCdwaW5nKCknKQogCi0gIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKLSAgICBwcmludCAnYWRkKCVkLCVkKScgJSAobjEsIG4yKQotICAgIHJldHVybiBuMStuMgorICAgIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCiAKLSAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6Ci0gICAgcHJpbnQgJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykKKyAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCiAKLSAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgotICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5NVUxUSVBMWToKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgotICAgICAgaWYgd29yay5udW0yID09IDA6Ci0gICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgICAgeC53aGF0ID0gd29yay5vcAotICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnCi0gICAgICAgIHJhaXNlIHgKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgotICAgIGVsc2U6Ci0gICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCi0gICAgICB4LndoYXQgPSB3b3JrLm9wCi0gICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKLSAgICAgIHJhaXNlIHgKKyAgICAgICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgICAgIGlmIHdvcmsubnVtMiA9PSAwOgorICAgICAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKKyAgICAgICAgICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnCisgICAgICAgICAgICAgICAgcmFpc2UgeAorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKKyAgICAgICAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJworICAgICAgICAgICAgcmFpc2UgeAogCi0gICAgbG9nID0gU2hhcmVkU3RydWN0KCkKLSAgICBsb2cua2V5ID0gbG9naWQKLSAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKLSAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKKyAgICAgICAgbG9nID0gU2hhcmVkU3RydWN0KCkKKyAgICAgICAgbG9nLmtleSA9IGxvZ2lkCisgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQorICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKIAotICAgIHJldHVybiB2YWwKKyAgICAgICAgcmV0dXJuIHZhbAogCi0gIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKLSAgICBwcmludCAnZ2V0U3RydWN0KCVkKScgJSAoa2V5KQotICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisgICAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgorICAgICAgICBwcmludCgnZ2V0U3RydWN0KCVkKScgJSAoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KIAotICBkZWYgemlwKHNlbGYpOgotICAgIHByaW50ICd6aXAoKScKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgnemlwKCknKQogCi1oYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQotcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKLXRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldCg5MDkwKQotdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQotcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCiAKLXNlcnZlciA9IFRTZXJ2ZXIuVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KGhvc3Q9JzEyNy4wLjAuMScsIHBvcnQ9OTA5MCkKKyAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCiAKLSMgWW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZSBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgotI3NlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZGVkU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCi0jc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgIHNlcnZlciA9IFRTZXJ2ZXIuVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQogCi1wcmludCAnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicKLXNlcnZlci5zZXJ2ZSgpCi1wcmludCAnZG9uZS4nCisgICAgIyBZb3UgY291bGQgZG8gb25lIG9mIHRoZXNlIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcigKKyAgICAjICAgICBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcigKKyAgICAjICAgICBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorCisgICAgcHJpbnQoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKQorICAgIHNlcnZlci5zZXJ2ZSgpCisgICAgcHJpbnQoJ2RvbmUuJykKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5L3NldHVwLmNmZyBiL3R1dG9yaWFsL3B5L3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTcxMjBhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcHkvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2ZsYWtlOF0KK2lnbm9yZSA9IEU0MDIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcmIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM3MjQxMwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tcHkvY2FsY3VsYXRvci5yYiBnZW4tcHkvc2hhcmVkX3NlcnZpY2UucmI6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHJiIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLXB5L2NhbGN1bGF0b3IucmIKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSR7UlVCWX0gUnVieVNlcnZlci5yYgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJJHtSVUJZfSBSdWJ5Q2xpZW50LnJiCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJUnVieVNlcnZlci5yYiBcCisJUnVieUNsaWVudC5yYgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcmIvUnVieUNsaWVudC5yYiBiL3R1dG9yaWFsL3JiL1J1YnlDbGllbnQucmIKaW5kZXggZmQ3MjY5OS4uOWE1YWE0MyAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcmIvUnVieUNsaWVudC5yYgorKysgYi90dXRvcmlhbC9yYi9SdWJ5Q2xpZW50LnJiCkBAIC0xOSw3ICsxOSw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0kOi5wdXNoKCcuLi9nZW4tcmInKQorJDoucHVzaCgnZ2VuLXJiJykKICQ6LnVuc2hpZnQgJy4uLy4uL2xpYi9yYi9saWInCiAKIHJlcXVpcmUgJ3RocmlmdCcKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JiL1J1YnlTZXJ2ZXIucmIgYi90dXRvcmlhbC9yYi9SdWJ5U2VydmVyLnJiCmluZGV4IDMwYWE3ZjIuLjFkNzA3ZDcgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3JiL1J1YnlTZXJ2ZXIucmIKKysrIGIvdHV0b3JpYWwvcmIvUnVieVNlcnZlci5yYgpAQCAtMTksNyArMTksNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotJDoucHVzaCgnLi4vZ2VuLXJiJykKKyQ6LnB1c2goJ2dlbi1yYicpCiAkOi51bnNoaWZ0ICcuLi8uLi9saWIvcmIvbGliJwogCiByZXF1aXJlICd0aHJpZnQnCkBAIC01MiwxNCArNTIsMTQgQEAKICAgICBlbHNpZiB3b3JrLm9wID09IE9wZXJhdGlvbjo6RElWSURFCiAgICAgICBpZiB3b3JrLm51bTIgPT0gMAogICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbi5uZXcoKQotICAgICAgICB4LndoYXQgPSB3b3JrLm9wCisgICAgICAgIHgud2hhdE9wID0gd29yay5vcAogICAgICAgICB4LndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCiAgICAgICAgIHJhaXNlIHgKICAgICAgIGVuZAogICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCiAgICAgZWxzZQogICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24ubmV3KCkKLSAgICAgIHgud2hhdCA9IHdvcmsub3AKKyAgICAgIHgud2hhdE9wID0gd29yay5vcAogICAgICAgeC53aHkgPSAiSW52YWxpZCBvcGVyYXRpb24iCiAgICAgICByYWlzZSB4CiAgICAgZW5kCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9DYXJnby50b21sIGIvdHV0b3JpYWwvcnMvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTBhMGRhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE2IEBACitbcGFja2FnZV0KK25hbWUgPSAidGhyaWZ0LXR1dG9yaWFsIgordmVyc2lvbiA9ICIwLjEuMCIKK2xpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKK2F1dGhvcnMgPSBbIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiJdCitleGNsdWRlID0gWyJNYWtlZmlsZSoiLCAic2hhcmVkLnJzIiwgInR1dG9yaWFsLnJzIl0KK3B1Ymxpc2ggPSBmYWxzZQorCitbZGVwZW5kZW5jaWVzXQorY2xhcCA9ICI8Mi4yOC4wIgorb3JkZXJlZC1mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorCitbZGVwZW5kZW5jaWVzLnRocmlmdF0KK3BhdGggPSAiLi4vLi4vbGliL3JzIgorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3JzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjMzMWUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworZ2VuLXJzL3R1dG9yaWFsLnJzIGdlbi1ycy9zaGFyZWQucnM6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC1vdXQgc3JjIC0tZ2VuIHJzIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLXJzL3R1dG9yaWFsLnJzCisJJChDQVJHTykgYnVpbGQKKwlbIC1kIGJpbiBdIHx8IG1rZGlyIGJpbgorCWNwIHRhcmdldC9kZWJ1Zy90dXRvcmlhbF9zZXJ2ZXIgYmluL3R1dG9yaWFsX3NlcnZlcgorCWNwIHRhcmdldC9kZWJ1Zy90dXRvcmlhbF9jbGllbnQgYmluL3R1dG9yaWFsX2NsaWVudAorCitjaGVjazogYWxsCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwliaW4vdHV0b3JpYWxfc2VydmVyCQorCit0dXRvcmlhbGNsaWVudDogYWxsCisJYmluL3R1dG9yaWFsX2NsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKENBUkdPKSBjbGVhbgorCS0kKFJNKSBDYXJnby5sb2NrCisJLSQoUk0pIHNyYy9zaGFyZWQucnMKKwktJChSTSkgc3JjL3R1dG9yaWFsLnJzCisJLSQoUk0pIC1yIGJpbgorCitFWFRSQV9ESVNUID0gXAorCUNhcmdvLnRvbWwgXAorCXNyYy9saWIucnMgXAorCXNyYy9iaW4vdHV0b3JpYWxfc2VydmVyLnJzIFwKKwlzcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycyBcCisJUkVBRE1FLm1kCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL1JFQURNRS5tZCBiL3R1dG9yaWFsL3JzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODRlOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzE3IEBACisjIFJ1c3QgTGFuZ3VhZ2UgQmluZGluZ3MgZm9yIFRocmlmdAorCisjIyBHZXR0aW5nIFN0YXJ0ZWQKKworMS4gR2V0IHRoZSBbVGhyaWZ0IGNvbXBpbGVyXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnKS4KKworMi4gQWRkIHRoZSBmb2xsb3dpbmcgY3JhdGVzIHRvIHlvdXIgYENhcmdvLnRvbWxgLgorCitgYGB0b21sCit0aHJpZnQgPSAieC55LnoiICMgeC55LnogaXMgdGhlIHZlcnNpb24gb2YgdGhlIHRocmlmdCBjb21waWxlcgorb3JkZXJlZF9mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorYGBgCisKKzMuIEFkZCB0aGUgc2FtZSBjcmF0ZXMgdG8geW91ciBgbGliLnJzYCBvciBgbWFpbi5yc2AuCisKK2BgYHJ1c3QKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKK2BgYAorCis0LiBHZW5lcmF0ZSBSdXN0IHNvdXJjZXMgZm9yIHlvdXIgSURMIChmb3IgZXhhbXBsZSwgYFR1dG9yaWFsLnRocmlmdGApLgorCitgYGBzaGVsbAordGhyaWZ0IC1vdXQgbXlfcnVzdF9wcm9ncmFtL3NyYyAtLWdlbiBycyAtciBUdXRvcmlhbC50aHJpZnQKK2BgYAorCis1LiBVc2UgdGhlIGdlbmVyYXRlZCBzb3VyY2UgaW4geW91ciBjb2RlLgorCitgYGBydXN0CisvLyBhZGQgZXh0ZXJuIGNyYXRlcyBoZXJlLCBvciBpbiB5b3VyIGxpYi5ycworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCisvLyBnZW5lcmF0ZWQgUnVzdCBtb2R1bGUKK3VzZSB0dXRvcmlhbDsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2x9OwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnR9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VElvQ2hhbm5lbCwgVFRjcENoYW5uZWx9OwordXNlIHR1dG9yaWFsOjp7Q2FsY3VsYXRvclN5bmNDbGllbnQsIFRDYWxjdWxhdG9yU3luY0NsaWVudH07Cit1c2UgdHV0b3JpYWw6OntPcGVyYXRpb24sIFdvcmt9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJjbGllbnQgcmFuIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoImNsaWVudCBmYWlsZWQgd2l0aCB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgLy8KKyAgICAvLyBidWlsZCBjbGllbnQKKyAgICAvLworCisgICAgcHJpbnRsbiEoImNvbm5lY3QgdG8gc2VydmVyIG9uIDEyNy4wLjAuMTo5MDkwIik7CisgICAgbGV0IG11dCBjID0gVFRjcFRyYW5zcG9ydDo6bmV3KCk7CisgICAgYy5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpPzsKKworICAgIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gYy5zcGxpdCgpPzsKKyAgICAKKyAgICBsZXQgaV9wcm90ID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoCisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKQorICAgICk7CisgICAgbGV0IG9fcHJvdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldygKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKQorICAgICk7CisKKyAgICBsZXQgY2xpZW50ID0gQ2FsY3VsYXRvclN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCk7CisKKyAgICAvLworICAgIC8vIGFscmlnaHQhIC0gbGV0J3MgbWFrZSBzb21lIGNhbGxzCisgICAgLy8KKworICAgIC8vIHR3by13YXksIHZvaWQgcmV0dXJuCisgICAgY2xpZW50LnBpbmcoKT87CisKKyAgICAvLyB0d28td2F5IHdpdGggc29tZSByZXR1cm4KKyAgICBsZXQgcmVzID0gY2xpZW50LmNhbGN1bGF0ZSgKKyAgICAgICAgNzIsCisgICAgICAgIFdvcms6Om5ldyg3LCA4LCBPcGVyYXRpb246Ok1VTFRJUExZLCBOb25lKQorICAgICk/OworICAgIHByaW50bG4hKCJtdWx0aXBsaWVkIDcgYW5kIDgsIGdvdCB7fSIsIHJlcyk7CisKKyAgICAvLyB0d28td2F5IGFuZCByZXR1cm5zIGEgVGhyaWZ0LWRlZmluZWQgZXhjZXB0aW9uCisgICAgbGV0IHJlcyA9IGNsaWVudC5jYWxjdWxhdGUoCisgICAgICAgIDc3LAorICAgICAgICBXb3JrOjpuZXcoMiwgMCwgT3BlcmF0aW9uOjpESVZJREUsIE5vbmUpCisgICAgKTsKKyAgICBtYXRjaCByZXMgeworICAgICAgICBPayh2KSA9PiBwYW5pYyEoInNob3VsZG4ndCBoYXZlIHN1Y2NlZWRlZCB3aXRoIHJlc3VsdCB7fSIsIHYpLAorICAgICAgICBFcnIoZSkgPT4gcHJpbnRsbiEoImRpdmlkZSBieSB6ZXJvIGZhaWxlZCB3aXRoIHs6P30iLCBlKSwKKyAgICB9CisKKyAgICAvLyBvbmUtd2F5CisgICAgY2xpZW50LnppcCgpPzsKKworICAgIC8vIGRvbmUhCisgICAgT2soKCkpCit9CitgYGAKKworIyMgQ29kZSBHZW5lcmF0aW9uCisKKyMjIyBUaHJpZnQgRmlsZXMgYW5kIEdlbmVyYXRlZCBNb2R1bGVzCisKK1RoZSBUaHJpZnQgY29kZSBnZW5lcmF0b3IgdGFrZXMgZWFjaCBUaHJpZnQgZmlsZSBhbmQgZ2VuZXJhdGVzIGEgUnVzdCBtb2R1bGUKK3dpdGggdGhlIHNhbWUgbmFtZSBzbmFrZS1jYXNlZC4gRm9yIGV4YW1wbGUsIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIG9uCitgVGhyaWZ0VGVzdC50aHJpZnRgIGNyZWF0ZXMgYHRocmlmdF90ZXN0LnJzYC4gVG8gdXNlIHRoZXNlIGdlbmVyYXRlZCBmaWxlcyBhZGQKK2Btb2QgLi4uYCBhbmQgYHVzZSAuLi5gIGRlY2xhcmF0aW9ucyB0byB5b3VyIGBsaWIucnNgIG9yIGBtYWluLnJzYCAtIG9uZSBmb3IKK2VhY2ggZ2VuZXJhdGVkIGZpbGUuCisKKyMjIyBSZXN1bHRzIGFuZCBFcnJvcnMKKworVGhlIFRocmlmdCBydW50aW1lIGxpYnJhcnkgZGVmaW5lcyBhIGB0aHJpZnQ6OlJlc3VsdGAgYW5kIGEgYHRocmlmdDo6RXJyb3JgIHR5cGUsCitib3RoIG9mIHdoaWNoIGFyZSB1c2VkIHRocm91Z2h0IHRoZSBydW50aW1lIGxpYnJhcnkgYW5kIGluIGFsbCBnZW5lcmF0ZWQgY29kZS4KK0NvbnZlcnNpb25zIGFyZSBkZWZpbmVkIGZyb20gYHN0ZDo6aW86OkVycm9yYCwgYHN0cmAgYW5kIGBTdHJpbmdgIGludG8KK2B0aHJpZnQ6OkVycm9yYC4KKworIyMjIFRocmlmdCBUeXBlIGFuZCB0aGVpciBSdXN0IEVxdWl2YWxlbnRzCisKK1RocmlmdCBkZWZpbmVzIGEgbnVtYmVyIG9mIHR5cGVzLCBlYWNoIG9mIHdoaWNoIGlzIHRyYW5zbGF0ZWQgaW50byBpdHMgUnVzdAorZXF1aXZhbGVudCBieSB0aGUgY29kZSBnZW5lcmF0b3IuCisKKyogUHJpbWl0aXZlcyAoYm9vbCwgaTgsIGkxNiwgaTMyLCBpNjQsIGRvdWJsZSwgc3RyaW5nLCBiaW5hcnkpCisqIFR5cGVkZWZzCisqIEVudW1zCisqIENvbnRhaW5lcnMKKyogU3RydWN0cworKiBVbmlvbnMKKyogRXhjZXB0aW9ucworKiBTZXJ2aWNlcworKiBDb25zdGFudHMgKHByaW1pdGl2ZXMsIGNvbnRhaW5lcnMsIHN0cnVjdHMpCisKK0luIGFkZGl0aW9uLCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLCB0aHJpZnQgaW5jbHVkZXMgYXJlIHRyYW5zbGF0ZWQgaW50bworYHVzZSAuLi5gIHN0YXRlbWVudHMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLCBhbmQgYWxsIGRlY2xhcmF0aW9ucywgcGFyYW1ldGVycywKK3RyYWl0cyBhbmQgdHlwZXMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIGFyZSBuYW1lc3BhY2VkIGFwcHJvcHJpYXRlbHkuCisKK1RoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbnMgY292ZXIgZWFjaCB0eXBlIGFuZCB0aGVpciBnZW5lcmF0ZWQgUnVzdCBlcXVpdmFsZW50LgorCisjIyMgUHJpbWl0aXZlcworCitUaHJpZnQgcHJpbWl0aXZlcyBoYXZlIHN0cmFpZ2h0Zm9yd2FyZCBSdXN0IGVxdWl2YWxlbnRzLgorCisqIGJvb2w6IGBib29sYAorKiBpODogYGk4YAorKiBpMTY6IGBpMTZgCisqIGkzMjogYGkzMmAKKyogaTY0OiBgaTY0YAorKiBkb3VibGU6IGBPcmRlcmVkRmxvYXQ8ZjY0PmAKKyogc3RyaW5nOiBgU3RyaW5nYAorKiBiaW5hcnk6IGBWZWM8dTg+YAorCisjIyMgVHlwZWRlZnMKKworQSB0eXBlZGVmIGlzIHRyYW5zbGF0ZWQgdG8gYSBgcHViIHR5cGVgIGRlY2xhcmF0aW9uLgorCitgYGB0aHJpZnQKK3R5cGVkZWYgaTY0IFVzZXJJZAorCit0eXBlZGVmIG1hcDxzdHJpbmcsIFVzZXJJZD4gTWFwVHlwZQorYGBgCitgYGBydXN0CitwdWIgdHlwZSBVc2VySWQgPSBpNjQ7CisKK3B1YiB0eXBlIE1hcFR5cGUgPSBCVHJlZU1hcDxTdHJpbmcsIEJvbms+OworYGBgCisKKyMjIyBFbnVtcworCitBIFRocmlmdCBlbnVtIGlzIHJlcHJlc2VudGVkIGFzIGEgUnVzdCBlbnVtLCBhbmQgZWFjaCB2YXJpYW50IGlzIHRyYW5zY3JpYmVkIDE6MS4KKworYGBgdGhyaWZ0CitlbnVtIE51bWJlcnoKK3sKKyAgICBPTkUgPSAxLAorICAgIFRXTywKKyAgICBUSFJFRSwKKyAgICBGSVZFID0gNSwKKyAgICBTSVgsCisgICAgRUlHSFQgPSA4Cit9CitgYGAKKworYGBgcnVzdAorI1tkZXJpdmUoQ29weSwgQ2xvbmUsIERlYnVnLCBFcSwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQorcHViIGVudW0gTnVtYmVyeiB7CisgICAgT05FID0gMSwKKyAgICBUV08gPSAyLAorICAgIFRIUkVFID0gMywKKyAgICBGSVZFID0gNSwKKyAgICBTSVggPSA2LAorICAgIEVJR0hUID0gOCwKK30KKworaW1wbCBUcnlGcm9tPGkzMj4gZm9yIE51bWJlcnogeworICAgIC8vIC4uLgorfQorCitgYGAKKworIyMjIENvbnRhaW5lcnMKKworVGhyaWZ0IGhhcyB0aHJlZSBjb250YWluZXIgdHlwZXM6IGxpc3QsIHNldCBhbmQgbWFwLiBUaGV5IGFyZSB0cmFuc2xhdGVkIGludG8KK1J1c3QgYFZlY2AsIGBCVHJlZVNldGAgYW5kIGBCVHJlZU1hcGAgcmVzcGVjdGl2ZWx5LiBBbnkgVGhyaWZ0IHR5cGUgKHRoaXMKK2luY2x1ZGVzIHN0cnVjdHMsIGVudW1zIGFuZCB0eXBlZGVmcykgY2FuIGJlIGEgbGlzdC9zZXQgZWxlbWVudCBvciBhIG1hcAora2V5L3ZhbHVlLgorCisjIyMjIExpc3QKKworYGBgdGhyaWZ0CitsaXN0IDxpMzI+IG51bWJlcnMKK2BgYAorCitgYGBydXN0CitudW1iZXJzOiBWZWM8aTMyPgorYGBgCisKKyMjIyMgU2V0CisKK2BgYHRocmlmdAorc2V0IDxpMzI+IG51bWJlcnMKK2BgYAorCitgYGBydXN0CitudW1iZXJzOiBCVHJlZVNldDxpMzI+CitgYGAKKworIyMjIyBNYXAKKworYGBgdGhyaWZ0CittYXAgPHN0cmluZywgaTMyPiBudW1iZXJzCitgYGAKKworYGBgcnVzdAorbnVtYmVyczogQlRyZWVNYXA8U3RyaW5nLCBpMzI+CitgYGAKKworIyMjIFN0cnVjdHMKKworQSBUaHJpZnQgc3RydWN0IGlzIHJlcHJlc2VudGVkIGFzIGEgUnVzdCBzdHJ1Y3QsIGFuZCBlYWNoIGZpZWxkIHRyYW5zY3JpYmVkIDE6MS4KKworYGBgdGhyaWZ0CitzdHJ1Y3QgQ3JhenlOZXN0aW5nIHsKKyAgICAxOiBzdHJpbmcgc3RyaW5nX2ZpZWxkLAorICAgIDI6IG9wdGlvbmFsIHNldDxJbnNhbml0eT4gc2V0X2ZpZWxkLAorICAgIDM6IHJlcXVpcmVkIGxpc3Q8CisgICAgICAgICBtYXA8c2V0PGkzMj4sIG1hcDxpMzIsc2V0PGxpc3Q8bWFwPEluc2FuaXR5LHN0cmluZz4+Pj4+CisgICAgICAgPgorICAgIDQ6IGJpbmFyeSBiaW5hcnlfZmllbGQKK30KK2BgYAorYGBgcnVzdAorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQorcHViIHN0cnVjdCBDcmF6eU5lc3RpbmcgeworICAgIHB1YiBzdHJpbmdfZmllbGQ6IE9wdGlvbjxTdHJpbmc+LAorICAgIHB1YiBzZXRfZmllbGQ6IE9wdGlvbjxCVHJlZVNldDxJbnNhbml0eT4+LAorICAgIHB1YiBsaXN0X2ZpZWxkOiBWZWM8CisgICAgICAgIEJUcmVlTWFwPAorICAgICAgICAgICAgQlRyZWVTZXQ8aTMyPiwKKyAgICAgICAgICAgIEJUcmVlTWFwPGkzMiwgQlRyZWVTZXQ8VmVjPEJUcmVlTWFwPEluc2FuaXR5LCBTdHJpbmc+Pj4+CisgICAgICAgID4KKyAgICA+LAorICAgIHB1YiBiaW5hcnlfZmllbGQ6IE9wdGlvbjxWZWM8dTg+PiwKK30KKworaW1wbCBDcmF6eU5lc3RpbmcgeworICAgIHB1YiBmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKQorICAgIC0+CisgICAgdGhyaWZ0OjpSZXN1bHQ8Q3JhenlOZXN0aW5nPiB7CisgICAgICAgIC8vIC4uLgorICAgIH0KKyAgICBwdWIgZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKQorICAgIC0+CisgICAgdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgLy8gLi4uCisgICAgfQorfQorCitgYGAKKyMjIyMjIE9wdGlvbmFsaXR5CisKK1RocmlmdCBoYXMgMyAib3B0aW9uYWxpdHkiIHR5cGVzOgorCisxLiBSZXF1aXJlZAorMi4gT3B0aW9uYWwKKzMuIERlZmF1bHQKKworVGhlIFJ1c3QgY29kZSBnZW5lcmF0b3IgZW5jb2RlcyAqUmVxdWlyZWQqIGZpZWxkcyBhcyB0aGUgYmFyZSB0eXBlIGl0c2VsZiwgd2hpbGUKKypPcHRpb25hbCogYW5kICpEZWZhdWx0KiBmaWVsZHMgYXJlIGVuY29kZWQgYXMgYE9wdGlvbjxUeXBlTmFtZT5gLgorCitgYGB0aHJpZnQKK3N0cnVjdCBGb28geworICAgIDE6IHJlcXVpcmVkIHN0cmluZyBiYXIgIC8vIDEuIHJlcXVpcmVkCisgICAgMjogb3B0aW9uYWwgc3RyaW5nIGJheiAgLy8gMi4gb3B0aW9uYWwKKyAgICAzOiBzdHJpbmcgcXV4ICAgICAgICAgICAvLyAzLiBkZWZhdWx0Cit9CitgYGAKKworYGBgcnVzdAorcHViIHN0cnVjdCBGb28geworICAgIGJhcjogU3RyaW5nLCAgICAgICAgICAgIC8vIDEuIHJlcXVpcmVkCisgICAgYmF6OiBPcHRpb248U3RyaW5nPiwgICAgLy8gMi4gb3B0aW9uYWwKKyAgICBxdXg6IE9wdGlvbjxTdHJpbmc+LCAgICAvLyAzLiBkZWZhdWx0Cit9CitgYGAKKworIyMgS25vd24gSXNzdWVzCisKKyogU3RydWN0IGNvbnN0YW50cyBhcmUgbm90IHN1cHBvcnRlZAorKiBNYXAsIGxpc3QgYW5kIHNldCBjb25zdGFudHMgcmVxdWlyZSBhIGNvbnN0IGhvbGRlciBzdHJ1Y3QKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfY2xpZW50LnJzIGIvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9jbGllbnQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwZmFmYwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfY2xpZW50LnJzCkBAIC0wLDAgKzEsMTMwIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CisKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0X3R1dG9yaWFsOworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0SW5wdXRQcm90b2NvbCwgVENvbXBhY3RPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OnsKKyAgICBSZWFkSGFsZiwgVEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCwgVElvQ2hhbm5lbCwgVFRjcENoYW5uZWwsIFdyaXRlSGFsZiwKK307CisKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnNoYXJlZDo6VFNoYXJlZFNlcnZpY2VTeW5jQ2xpZW50OwordXNlIHRocmlmdF90dXRvcmlhbDo6dHV0b3JpYWw6OntDYWxjdWxhdG9yU3luY0NsaWVudCwgT3BlcmF0aW9uLCBUQ2FsY3VsYXRvclN5bmNDbGllbnQsIFdvcmt9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJ0dXRvcmlhbCBjbGllbnQgcmFuIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoInR1dG9yaWFsIGNsaWVudCBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG9wdGlvbnMgPSBjbGFwX2FwcCEocnVzdF90dXRvcmlhbF9jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIwLjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJUaHJpZnQgUnVzdCB0dXRvcmlhbCBjbGllbnQiKQorICAgICAgICAoQGFyZyBob3N0OiAtLWhvc3QgK3Rha2VzX3ZhbHVlICJob3N0IG9uIHdoaWNoIHRoZSB0dXRvcmlhbCBzZXJ2ZXIgbGlzdGVucyIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHR1dG9yaWFsIHNlcnZlciBsaXN0ZW5zIikKKyAgICApOworICAgIGxldCBtYXRjaGVzID0gb3B0aW9ucy5nZXRfbWF0Y2hlcygpOworCisgICAgLy8gZ2V0IGFueSBwYXNzZWQtaW4gYXJncyBvciB0aGUgZGVmYXVsdHMKKyAgICBsZXQgaG9zdCA9IG1hdGNoZXMudmFsdWVfb2YoImhvc3QiKS51bndyYXBfb3IoIjEyNy4wLjAuMSIpOworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKworICAgIC8vIGJ1aWxkIG91ciBjbGllbnQgYW5kIGNvbm5lY3QgdG8gdGhlIGhvc3Q6cG9ydAorICAgIGxldCBtdXQgY2xpZW50ID0gbmV3X2NsaWVudChob3N0LCBwb3J0KT87CisKKyAgICAvLyBhbHJpZ2h0IQorICAgIC8vIGxldCdzIHN0YXJ0IG1ha2luZyBzb21lIGNhbGxzCisKKyAgICAvLyBsZXQncyBzdGFydCB3aXRoIGEgcGluZzsgdGhlIHNlcnZlciBzaG91bGQgcmVzcG9uZAorICAgIHByaW50bG4hKCJwaW5nISIpOworICAgIGNsaWVudC5waW5nKCk/OworCisgICAgLy8gc2ltcGxlIGFkZAorICAgIHByaW50bG4hKCJhZGQiKTsKKyAgICBsZXQgcmVzID0gY2xpZW50LmFkZCgxLCAyKT87CisgICAgcHJpbnRsbiEoImFkZGVkIDEsIDIgYW5kIGdvdCB7fSIsIHJlcyk7CisKKyAgICBsZXQgbG9naWQgPSAzMjsKKworICAgIC8vIGxldCdzIGRvLi4uYSBtdWx0aXBseSEKKyAgICBsZXQgcmVzID0gY2xpZW50LmNhbGN1bGF0ZShsb2dpZCwgV29yazo6bmV3KDcsIDgsIE9wZXJhdGlvbjo6TXVsdGlwbHksIE5vbmUpKT87CisgICAgcHJpbnRsbiEoIm11bHRpcGxpZWQgNyBhbmQgOCBhbmQgZ290IHt9IiwgcmVzKTsKKworICAgIC8vIGxldCdzIGdldCB0aGUgbG9nIGZvciBpdAorICAgIGxldCByZXMgPSBjbGllbnQuZ2V0X3N0cnVjdCgzMik/OworICAgIHByaW50bG4hKCJnb3QgbG9nIHs6P30gZm9yIG9wZXJhdGlvbiB7fSIsIHJlcywgbG9naWQpOworCisgICAgLy8gb2sgLSBsZXQncyBiZSBiYWQgOigKKyAgICAvLyBkbyBhIGRpdmlkZSBieSAwCisgICAgLy8gbG9naWQgZG9lc24ndCBtYXR0ZXI7IHdvbid0IGJlIHJlY29yZGVkCisgICAgbGV0IHJlcyA9IGNsaWVudC5jYWxjdWxhdGUoNzcsIFdvcms6Om5ldygyLCAwLCBPcGVyYXRpb246OkRpdmlkZSwgIndlIGJhZCIudG9fb3duZWQoKSkpOworCisgICAgLy8gd2Ugc2hvdWxkIGhhdmUgZ290dGVuIGFuIGV4Y2VwdGlvbiBiYWNrCisgICAgbWF0Y2ggcmVzIHsKKyAgICAgICAgT2sodikgPT4gcGFuaWMhKCJzaG91bGQgbm90IGhhdmUgc3VjY2VlZGVkIHdpdGggcmVzdWx0IHt9IiwgdiksCisgICAgICAgIEVycihlKSA9PiBwcmludGxuISgiZGl2aWRlIGJ5IHplcm8gZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpLAorICAgIH0KKworICAgIC8vIGxldCdzIGRvIGEgb25lLXdheSBjYWxsCisgICAgcHJpbnRsbiEoInppcCIpOworICAgIGNsaWVudC56aXAoKT87CisKKyAgICAvLyBhbmQgdGhlbiBjbG9zZSBvdXQgd2l0aCBhIGZpbmFsIHBpbmcKKyAgICBwcmludGxuISgicGluZyEiKTsKKyAgICBjbGllbnQucGluZygpPzsKKworICAgIE9rKCgpKQorfQorCit0eXBlIENsaWVudElucHV0UHJvdG9jb2wgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w8VEZyYW1lZFJlYWRUcmFuc3BvcnQ8UmVhZEhhbGY8VFRjcENoYW5uZWw+Pj47Cit0eXBlIENsaWVudE91dHB1dFByb3RvY29sID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDxURnJhbWVkV3JpdGVUcmFuc3BvcnQ8V3JpdGVIYWxmPFRUY3BDaGFubmVsPj4+OworCitmbiBuZXdfY2xpZW50KAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDxDYWxjdWxhdG9yU3luY0NsaWVudDxDbGllbnRJbnB1dFByb3RvY29sLCBDbGllbnRPdXRwdXRQcm90b2NvbD4+IHsKKyAgICBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisKKyAgICAvLyBvcGVuIHRoZSB1bmRlcmx5aW5nIFRDUCBzdHJlYW0KKyAgICBwcmludGxuISgiY29ubmVjdGluZyB0byB0dXRvcmlhbCBzZXJ2ZXIgb24ge306e30iLCBob3N0LCBwb3J0KTsKKyAgICBjLm9wZW4oJmZvcm1hdCEoInt9Ont9IiwgaG9zdCwgcG9ydCkpPzsKKworICAgIC8vIGNsb25lIHRoZSBUQ1AgY2hhbm5lbCBpbnRvIHR3byBoYWx2ZXMsIG9uZSB3aGljaAorICAgIC8vIHdlJ2xsIHVzZSBmb3IgcmVhZGluZywgdGhlIG90aGVyIGZvciB3cml0aW5nCisgICAgbGV0IChpX2NoYW4sIG9fY2hhbikgPSBjLnNwbGl0KCk/OworCisgICAgLy8gd3JhcCB0aGUgcmF3IHNvY2tldHMgKHNsb3cpIHdpdGggYSBidWZmZXJlZCB0cmFuc3BvcnQgb2Ygc29tZSBraW5kCisgICAgbGV0IGlfdHJhbiA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKTsKKyAgICBsZXQgb190cmFuID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKTsKKworICAgIC8vIG5vdyBjcmVhdGUgdGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9ucworICAgIGxldCBpX3Byb3QgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4pOworICAgIGxldCBvX3Byb3QgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKTsKKworICAgIC8vIHdlJ3JlIGRvbmUhCisgICAgT2soQ2FsY3VsYXRvclN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCkpCit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX3NlcnZlci5ycyBiL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfc2VydmVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YjFhMmIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX3NlcnZlci5ycwpAQCAtMCwwICsxLDE3OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworCitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90dXRvcmlhbDsKKwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpjb252ZXJ0Ojp7RnJvbSwgSW50b307Cit1c2Ugc3RkOjpkZWZhdWx0OjpEZWZhdWx0OwordXNlIHN0ZDo6c3luYzo6TXV0ZXg7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OwordXNlIHRocmlmdDo6c2VydmVyOjpUU2VydmVyOworCit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OwordXNlIHRocmlmdF90dXRvcmlhbDo6c2hhcmVkOjp7U2hhcmVkU2VydmljZVN5bmNIYW5kbGVyLCBTaGFyZWRTdHJ1Y3R9OwordXNlIHRocmlmdF90dXRvcmlhbDo6dHV0b3JpYWw6OntDYWxjdWxhdG9yU3luY0hhbmRsZXIsIENhbGN1bGF0b3JTeW5jUHJvY2Vzc29yfTsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnR1dG9yaWFsOjp7SW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgidHV0b3JpYWwgc2VydmVyIHJhbiBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJ0dXRvcmlhbCBzZXJ2ZXIgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBvcHRpb25zID0gY2xhcF9hcHAhKHJ1c3RfdHV0b3JpYWxfc2VydmVyID0+CisgICAgICAgICh2ZXJzaW9uOiAiMC4xLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiVGhyaWZ0IFJ1c3QgdHV0b3JpYWwgc2VydmVyIikKKyAgICAgICAgKEBhcmcgcG9ydDogLS1wb3J0ICt0YWtlc192YWx1ZSAicG9ydCBvbiB3aGljaCB0aGUgdHV0b3JpYWwgc2VydmVyIGxpc3RlbnMiKQorICAgICk7CisgICAgbGV0IG1hdGNoZXMgPSBvcHRpb25zLmdldF9tYXRjaGVzKCk7CisKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IGxpc3Rlbl9hZGRyZXNzID0gZm9ybWF0ISgiMTI3LjAuMC4xOnt9IiwgcG9ydCk7CisKKyAgICBwcmludGxuISgiYmluZGluZyB0byB7fSIsIGxpc3Rlbl9hZGRyZXNzKTsKKworICAgIGxldCBpX3RyYW5fZmFjdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisgICAgbGV0IGlfcHJvdF9mYWN0ID0gVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCk7CisKKyAgICBsZXQgb190cmFuX2ZhY3QgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKTsKKyAgICBsZXQgb19wcm90X2ZhY3QgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCk7CisKKyAgICAvLyBkZW11eCBpbmNvbWluZyBtZXNzYWdlcworICAgIGxldCBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yU3luY1Byb2Nlc3Nvcjo6bmV3KENhbGN1bGF0b3JTZXJ2ZXIgeworICAgICAgICAuLkRlZmF1bHQ6OmRlZmF1bHQoKQorICAgIH0pOworCisgICAgLy8gY3JlYXRlIHRoZSBzZXJ2ZXIgYW5kIHN0YXJ0IGxpc3RlbmluZworICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICBpX3RyYW5fZmFjdCwKKyAgICAgICAgaV9wcm90X2ZhY3QsCisgICAgICAgIG9fdHJhbl9mYWN0LAorICAgICAgICBvX3Byb3RfZmFjdCwKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAxMCwKKyAgICApOworCisgICAgc2VydmVyLmxpc3RlbigmbGlzdGVuX2FkZHJlc3MpCit9CisKKy8vLyBIYW5kbGVzIGluY29taW5nIENhbGN1bGF0b3Igc2VydmljZSBjYWxscy4KK3N0cnVjdCBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICBsb2c6IE11dGV4PEhhc2hNYXA8aTMyLCBTaGFyZWRTdHJ1Y3Q+PiwKK30KKworaW1wbCBEZWZhdWx0IGZvciBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICBmbiBkZWZhdWx0KCkgLT4gQ2FsY3VsYXRvclNlcnZlciB7CisgICAgICAgIENhbGN1bGF0b3JTZXJ2ZXIgeworICAgICAgICAgICAgbG9nOiBNdXRleDo6bmV3KEhhc2hNYXA6Om5ldygpKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc2luY2UgQ2FsY3VsYXRvciBleHRlbmRzIFNoYXJlZFNlcnZpY2Ugd2UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlCisvLyBoYW5kbGVyIGZvciBib3RoIHRyYWl0cy4KKy8vCisKKy8vIFNoYXJlZFNlcnZpY2UgaGFuZGxlcgoraW1wbCBTaGFyZWRTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIENhbGN1bGF0b3JTZXJ2ZXIgeworICAgIGZuIGhhbmRsZV9nZXRfc3RydWN0KCZzZWxmLCBrZXk6IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8U2hhcmVkU3RydWN0PiB7CisgICAgICAgIGxldCBsb2cgPSBzZWxmLmxvZy5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxvZy5nZXQoJmtleSkKKyAgICAgICAgICAgIC5jbG9uZWQoKQorICAgICAgICAgICAgLm9rX29yX2Vsc2UofHwgZm9ybWF0ISgiY291bGQgbm90IGZpbmQgbG9nIGZvciBrZXkge30iLCBrZXkpLmludG8oKSkKKyAgICB9Cit9CisKKy8vIENhbGN1bGF0b3IgaGFuZGxlcgoraW1wbCBDYWxjdWxhdG9yU3luY0hhbmRsZXIgZm9yIENhbGN1bGF0b3JTZXJ2ZXIgeworICAgIGZuIGhhbmRsZV9waW5nKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICBwcmludGxuISgicG9uZyEiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2FkZCgmc2VsZiwgbnVtMTogaTMyLCBudW0yOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PGkzMj4geworICAgICAgICBwcmludGxuISgiaGFuZGxpbmcgYWRkOiBuMTp7fSBuMjp7fSIsIG51bTEsIG51bTIpOworICAgICAgICBPayhudW0xICsgbnVtMikKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfY2FsY3VsYXRlKCZzZWxmLCBsb2dpZDogaTMyLCB3OiBXb3JrKSAtPiB0aHJpZnQ6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgcHJpbnRsbiEoImhhbmRsaW5nIGNhbGN1bGF0ZTogbDp7fSwgdzp7Oj99IiwgbG9naWQsIHcpOworCisgICAgICAgIGxldCByZXMgPSBpZiBsZXQgU29tZShyZWYgb3ApID0gdy5vcCB7CisgICAgICAgICAgICBpZiB3Lm51bTEuaXNfbm9uZSgpIHx8IHcubnVtMi5pc19ub25lKCkgeworICAgICAgICAgICAgICAgIEVycihJbnZhbGlkT3BlcmF0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgd2hhdF9vcDogU29tZSgqb3AgYXMgaTMyKSwKKyAgICAgICAgICAgICAgICAgICAgd2h5OiBTb21lKCJubyBvcGVyYW5kcyBzcGVjaWZpZWQiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgSSBkb24ndCBoYXZlIHRvIGNhbGwgdW53cmFwKCkgbXVsdGlwbGUgdGltZXMgYmVsb3cKKyAgICAgICAgICAgICAgICBsZXQgbnVtMSA9IHcubnVtMS5hc19yZWYoKS5leHBlY3QoIm9wZXJhbmRzIGNoZWNrZWQiKTsKKyAgICAgICAgICAgICAgICBsZXQgbnVtMiA9IHcubnVtMi5hc19yZWYoKS5leHBlY3QoIm9wZXJhbmRzIGNoZWNrZWQiKTsKKworICAgICAgICAgICAgICAgIG1hdGNoICpvcCB7CisgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbjo6QWRkID0+IE9rKG51bTEgKyBudW0yKSwKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uOjpTdWJ0cmFjdCA9PiBPayhudW0xIC0gbnVtMiksCisgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbjo6TXVsdGlwbHkgPT4gT2sobnVtMSAqIG51bTIpLAorICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246OkRpdmlkZSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAqbnVtMiA9PSAwIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIoSW52YWxpZE9wZXJhdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXRfb3A6IFNvbWUoKm9wIGFzIGkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoeTogU29tZSgiZGl2aWRlIGJ5IDAiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9rKG51bTEgLyBudW0yKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRXJyKEludmFsaWRPcGVyYXRpb246Om5ldygKKyAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICJubyBvcGVyYXRpb24gc3BlY2lmaWVkIi50b19vd25lZCgpLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfTsKKworICAgICAgICAvLyBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGxvZyBpdAorICAgICAgICBpZiBsZXQgT2socmVmIHYpID0gcmVzIHsKKyAgICAgICAgICAgIGxldCBtdXQgbG9nID0gc2VsZi5sb2cubG9jaygpLnVud3JhcCgpOworICAgICAgICAgICAgbG9nLmluc2VydChsb2dpZCwgU2hhcmVkU3RydWN0OjpuZXcobG9naWQsIGZvcm1hdCEoInt9IiwgdikpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSB0cnkhIG1hY3JvIGF1dG9tYXRpY2FsbHkgbWFwcyBlcnJvcnMKKyAgICAgICAgLy8gYnV0LCBzaW5jZSB3ZSBhcmVuJ3QgdXNpbmcgdGhhdCBoZXJlIHdlIGhhdmUgdG8gbWFwIGVycm9ycyBtYW51YWxseQorICAgICAgICAvLworICAgICAgICAvLyBleGNlcHRpb24gc3RydWN0cyBkZWZpbmVkIGluIHRoZSBJREwgaGF2ZSBhbiBhdXRvLWdlbmVyYXRlZAorICAgICAgICAvLyBpbXBsIG9mIEZyb206OmZyb20KKyAgICAgICAgcmVzLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfemlwKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICBwcmludGxuISgiaGFuZGxpbmcgemlwIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL3NyYy9saWIucnMgYi90dXRvcmlhbC9ycy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDA3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCitwdWIgbW9kIHNoYXJlZDsKK3B1YiBtb2QgdHV0b3JpYWw7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9zaGFyZWQudGhyaWZ0IGIvdHV0b3JpYWwvc2hhcmVkLnRocmlmdAppbmRleCA0NzVlN2Y4Li5mMTY4NWJkIDEwMDY0NAotLS0gYS90dXRvcmlhbC9zaGFyZWQudGhyaWZ0CisrKyBiL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQKQEAgLTIyLDkgKzIyLDE1IEBACiAgKiB0aGVzZSBkZWZpbml0aW9ucy4KICAqLwogCituYW1lc3BhY2UgY2wgc2hhcmVkCiBuYW1lc3BhY2UgY3BwIHNoYXJlZAorbmFtZXNwYWNlIGQgc2hhcmUgLy8gInNoYXJlZCIgd291bGQgY29sbGlkZSB3aXRoIHRoZSBlcG9ueW1vdXMgRCBrZXl3b3JkLgorbmFtZXNwYWNlIGRhcnQgc2hhcmVkCiBuYW1lc3BhY2UgamF2YSBzaGFyZWQKIG5hbWVzcGFjZSBwZXJsIHNoYXJlZAorbmFtZXNwYWNlIHBocCBzaGFyZWQKK25hbWVzcGFjZSBoYXhlIHNoYXJlZAorbmFtZXNwYWNlIG5ldGNvcmUgc2hhcmVkCiAKIHN0cnVjdCBTaGFyZWRTdHJ1Y3QgewogICAxOiBpMzIga2V5CmRpZmYgLS1naXQgYS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQgYi90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKaW5kZXggODZlNDMzZC4uZTAyNzU0NiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisrKyBiL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdApAQCAtMzIsNyArMzIsNyBAQAogICogVGhlIGZpcnN0IHRoaW5nIHRvIGtub3cgYWJvdXQgYXJlIHR5cGVzLiBUaGUgYXZhaWxhYmxlIHR5cGVzIGluIFRocmlmdCBhcmU6CiAgKgogICogIGJvb2wgICAgICAgIEJvb2xlYW4sIG9uZSBieXRlCi0gKiAgYnl0ZSAgICAgICAgU2lnbmVkIGJ5dGUKKyAqICBpOCAoYnl0ZSkgICBTaWduZWQgOC1iaXQgaW50ZWdlcgogICogIGkxNiAgICAgICAgIFNpZ25lZCAxNi1iaXQgaW50ZWdlcgogICogIGkzMiAgICAgICAgIFNpZ25lZCAzMi1iaXQgaW50ZWdlcgogICogIGk2NCAgICAgICAgIFNpZ25lZCA2NC1iaXQgaW50ZWdlcgpAQCAtNjIsMTEgKzYyLDE2IEBACiAgKiBUaHJpZnQgZmlsZXMgY2FuIG5hbWVzcGFjZSwgcGFja2FnZSwgb3IgcHJlZml4IHRoZWlyIG91dHB1dCBpbiB2YXJpb3VzCiAgKiB0YXJnZXQgbGFuZ3VhZ2VzLgogICovCisKK25hbWVzcGFjZSBjbCB0dXRvcmlhbAogbmFtZXNwYWNlIGNwcCB0dXRvcmlhbAorbmFtZXNwYWNlIGQgdHV0b3JpYWwKK25hbWVzcGFjZSBkYXJ0IHR1dG9yaWFsCiBuYW1lc3BhY2UgamF2YSB0dXRvcmlhbAogbmFtZXNwYWNlIHBocCB0dXRvcmlhbAogbmFtZXNwYWNlIHBlcmwgdHV0b3JpYWwKLW5hbWVzcGFjZSBzbWFsbHRhbGsuY2F0ZWdvcnkgVGhyaWZ0LlR1dG9yaWFsCituYW1lc3BhY2UgaGF4ZSB0dXRvcmlhbAorbmFtZXNwYWNlIG5ldGNvcmUgdHV0b3JpYWwKIAogLyoqCiAgKiBUaHJpZnQgbGV0cyB5b3UgZG8gdHlwZWRlZnMgdG8gZ2V0IHByZXR0eSBuYW1lcyBmb3IgeW91ciB0eXBlcy4gU3RhbmRhcmQKQEAgLTExMiw3ICsxMTcsNyBAQAogICogU3RydWN0cyBjYW4gYWxzbyBiZSBleGNlcHRpb25zLCBpZiB0aGV5IGFyZSBuYXN0eS4KICAqLwogZXhjZXB0aW9uIEludmFsaWRPcGVyYXRpb24gewotICAxOiBpMzIgd2hhdCwKKyAgMTogaTMyIHdoYXRPcCwKICAgMjogc3RyaW5nIHdoeQogfQogCg==